summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--.gitreview2
-rw-r--r--.jshintignore8
-rw-r--r--.jshintrc34
-rw-r--r--COPYING38
-rw-r--r--CREDITS18
-rw-r--r--HISTORY335
-rw-r--r--README143
l---------[-rw-r--r--]README.mediawiki123
-rw-r--r--RELEASE-NOTES-1.21443
-rw-r--r--RELEASE-NOTES-1.22610
-rw-r--r--UPGRADE15
-rw-r--r--api.php12
-rw-r--r--composer-example.json11
-rw-r--r--composer.json30
-rw-r--r--docs/hooks.txt190
-rw-r--r--docs/maintenance.txt4
-rw-r--r--docs/php-memcached/Documentation2
-rw-r--r--docs/scripts.txt10
-rw-r--r--docs/skin.txt68
-rw-r--r--docs/title.txt8
-rw-r--r--docs/uidesign/child-selector-emu.html3
-rw-r--r--docs/uidesign/design.html7
-rw-r--r--docs/uidesign/mediawiki.action.history.diff.html7
-rw-r--r--docs/uidesign/monospace.html5
-rw-r--r--docs/uidesign/table-layout.html3
-rw-r--r--docs/upload.txt2
-rw-r--r--extensions/Cite/.jshintignore1
-rw-r--r--extensions/Cite/.jshintrc34
-rw-r--r--extensions/Cite/Cite.i18n.php1281
-rw-r--r--extensions/Cite/Cite.php44
-rw-r--r--extensions/Cite/Cite_body.php27
-rw-r--r--extensions/Cite/SpecialCite.alias.php13
-rw-r--r--extensions/Cite/SpecialCite.i18n.php584
-rw-r--r--extensions/Cite/SpecialCite.php6
-rw-r--r--extensions/Cite/citeCatTreeParserTests.txt27
-rw-r--r--extensions/Cite/citeParserTests.txt36
-rw-r--r--extensions/Cite/modules/ext.cite.css16
-rw-r--r--extensions/Cite/modules/ext.cite.js38
-rw-r--r--extensions/Cite/modules/ext.cite.popups.js13
-rw-r--r--extensions/Cite/modules/ext.cite/ext.cite.js12
-rw-r--r--extensions/Cite/modules/ext.rtlcite.css (renamed from extensions/Cite/modules/ext.rtlcite/ext.rtlcite.css)0
-rw-r--r--extensions/Cite/modules/ext.specialcite.css (renamed from extensions/Cite/modules/ext.specialcite/ext.specialcite.css)0
-rw-r--r--extensions/ConfirmEdit/ApiFancyCaptchaReload.php2
-rw-r--r--extensions/ConfirmEdit/Asirra.class.php2
-rw-r--r--extensions/ConfirmEdit/Asirra.i18n.php315
-rw-r--r--extensions/ConfirmEdit/Captcha.php88
-rw-r--r--extensions/ConfirmEdit/ConfirmEdit.alias.php8
-rw-r--r--extensions/ConfirmEdit/ConfirmEdit.i18n.php440
-rw-r--r--extensions/ConfirmEdit/FancyCaptcha.i18n.php932
-rw-r--r--extensions/ConfirmEdit/FancyCaptcha.php11
-rw-r--r--extensions/ConfirmEdit/MathCaptcha.class.php2
-rw-r--r--extensions/ConfirmEdit/QuestyCaptcha.i18n.php634
-rw-r--r--extensions/ConfirmEdit/ReCaptcha.i18n.php422
-rw-r--r--extensions/ConfirmEdit/blacklist40
-rw-r--r--extensions/ConfirmEdit/captcha.py14
-rw-r--r--extensions/ConfirmEdit/resources/ext.confirmEdit.asirra.js7
-rw-r--r--extensions/FluxBBAuthPlugin.php7
-rw-r--r--extensions/Gadgets/ApiQueryGadgets.php4
-rw-r--r--extensions/Gadgets/GadgetHooks.php257
-rw-r--r--extensions/Gadgets/Gadgets.alias.php13
-rw-r--r--extensions/Gadgets/Gadgets.i18n.php348
-rw-r--r--extensions/Gadgets/Gadgets.php4
-rw-r--r--extensions/Gadgets/Gadgets_body.php264
-rw-r--r--extensions/Gadgets/README2
-rw-r--r--extensions/ImageMap/ImageMap.i18n.php65
-rw-r--r--extensions/ImageMap/ImageMap.php16
-rw-r--r--extensions/ImageMap/ImageMap_body.php6
-rw-r--r--extensions/InputBox/InputBox.i18n.php88
-rw-r--r--extensions/Interwiki/Interwiki.alias.php11
-rw-r--r--extensions/Interwiki/Interwiki.i18n.php355
-rw-r--r--extensions/Interwiki/Interwiki.php13
-rw-r--r--extensions/Interwiki/Interwiki_body.php90
-rw-r--r--extensions/LocalisationUpdate/LocalisationUpdate.class.php16
-rw-r--r--extensions/LocalisationUpdate/LocalisationUpdate.i18n.php13
-rw-r--r--extensions/LocalisationUpdate/LocalisationUpdate.php6
-rw-r--r--extensions/Nuke/Nuke.alias.php8
-rw-r--r--extensions/Nuke/Nuke.i18n.php308
-rw-r--r--extensions/ParserFunctions/ParserFunctions.i18n.magic.php190
-rw-r--r--extensions/ParserFunctions/ParserFunctions.i18n.php131
-rw-r--r--extensions/ParserFunctions/ParserFunctions_body.php6
-rw-r--r--extensions/PdfHandler/PdfHandler.i18n.php53
-rw-r--r--extensions/PdfHandler/PdfHandler_body.php2
-rw-r--r--extensions/Poem/Poem.i18n.php14
-rw-r--r--extensions/README2
-rw-r--r--extensions/Renameuser/README2
-rw-r--r--extensions/Renameuser/Renameuser.alias.php17
-rw-r--r--extensions/Renameuser/Renameuser.i18n.php275
-rw-r--r--extensions/Renameuser/RenameuserSQL.php2
-rw-r--r--extensions/SimpleAntiSpam/SimpleAntiSpam.i18n.php37
-rw-r--r--extensions/SpamBlacklist/README31
-rw-r--r--extensions/SpamBlacklist/SpamBlacklist.i18n.php670
-rw-r--r--extensions/SpamBlacklist/SpamBlacklist.php33
-rw-r--r--extensions/SpamBlacklist/SpamBlacklistHooks.php125
-rw-r--r--extensions/SpamBlacklist/SpamBlacklist_body.php90
-rw-r--r--extensions/SyntaxHighlight_GeSHi/SyntaxHighlight_GeSHi.class.php48
-rw-r--r--extensions/SyntaxHighlight_GeSHi/SyntaxHighlight_GeSHi.i18n.php35
-rw-r--r--extensions/SyntaxHighlight_GeSHi/SyntaxHighlight_GeSHi.php5
-rw-r--r--extensions/SyntaxHighlight_GeSHi/geshi/geshi.php2
-rw-r--r--extensions/SyntaxHighlight_GeSHi/geshi/geshi/haskell.php10
-rw-r--r--extensions/TitleBlacklist/TitleBlacklist.i18n.php137
-rw-r--r--extensions/TitleBlacklist/TitleBlacklist.list.php20
-rw-r--r--extensions/TitleBlacklist/TitleBlacklist.php4
-rw-r--r--extensions/TitleBlacklist/tests/ApiQueryTitleBlacklistTest.php22
-rw-r--r--extensions/TitleBlacklist/tests/testSource1
-rw-r--r--extensions/Vector/.gitreview5
-rw-r--r--extensions/Vector/README17
-rw-r--r--extensions/Vector/Vector.hooks.php174
-rw-r--r--extensions/Vector/Vector.i18n.php2467
-rw-r--r--extensions/Vector/Vector.php129
-rw-r--r--extensions/Vector/modules/ext.vector.collapsibleNav.css92
-rw-r--r--extensions/Vector/modules/ext.vector.collapsibleNav.js253
-rw-r--r--extensions/Vector/modules/ext.vector.collapsibleTabs.js29
-rw-r--r--extensions/Vector/modules/ext.vector.expandableSearch.css11
-rw-r--r--extensions/Vector/modules/ext.vector.expandableSearch.js72
-rw-r--r--extensions/Vector/modules/ext.vector.footerCleanup.js31
-rw-r--r--extensions/Vector/modules/ext.vector.sectionEditLinks.css19
-rw-r--r--extensions/Vector/modules/ext.vector.sectionEditLinks.js66
-rw-r--r--extensions/Vector/modules/images/edit-faded.pngbin425 -> 0 bytes
-rw-r--r--extensions/Vector/modules/images/edit.pngbin428 -> 0 bytes
-rw-r--r--extensions/Vector/modules/images/portal-break.pngbin203 -> 0 bytes
-rw-r--r--extensions/Vector/modules/jquery.footerCollapsibleList.js44
-rw-r--r--extensions/Vector/switchExperimentPrefs.php63
-rw-r--r--extensions/WikiEditor/.jshintignore2
-rw-r--r--extensions/WikiEditor/.jshintrc32
-rw-r--r--extensions/WikiEditor/WikiEditor.hooks.php8
-rw-r--r--extensions/WikiEditor/WikiEditor.i18n.php2031
-rw-r--r--extensions/WikiEditor/WikiEditor.php1
-rw-r--r--extensions/WikiEditor/modules/ext.wikiEditor.css9
-rw-r--r--extensions/WikiEditor/modules/ext.wikiEditor.dialogs.js7
-rw-r--r--extensions/WikiEditor/modules/ext.wikiEditor.highlight.js3
-rw-r--r--extensions/WikiEditor/modules/ext.wikiEditor.js3
-rw-r--r--extensions/WikiEditor/modules/ext.wikiEditor.preview.js3
-rw-r--r--extensions/WikiEditor/modules/ext.wikiEditor.previewDialog.js3
-rw-r--r--extensions/WikiEditor/modules/ext.wikiEditor.publish.js3
-rw-r--r--extensions/WikiEditor/modules/ext.wikiEditor.templateEditor.js19
-rw-r--r--extensions/WikiEditor/modules/ext.wikiEditor.templates.js19
-rw-r--r--extensions/WikiEditor/modules/ext.wikiEditor.tests.toolbar.js16
-rw-r--r--extensions/WikiEditor/modules/ext.wikiEditor.toc.js3
-rw-r--r--extensions/WikiEditor/modules/ext.wikiEditor.toolbar.hideSig.js4
-rw-r--r--extensions/WikiEditor/modules/ext.wikiEditor.toolbar.js3
-rw-r--r--extensions/WikiEditor/modules/images/dialogs/insert-disambiguation.pngbin0 -> 831 bytes
-rw-r--r--extensions/WikiEditor/modules/jquery.wikiEditor.css3
-rw-r--r--extensions/WikiEditor/modules/jquery.wikiEditor.dialogs.config.css8
-rw-r--r--extensions/WikiEditor/modules/jquery.wikiEditor.dialogs.config.js124
-rw-r--r--extensions/WikiEditor/modules/jquery.wikiEditor.dialogs.js34
-rw-r--r--extensions/WikiEditor/modules/jquery.wikiEditor.highlight.js41
-rw-r--r--extensions/WikiEditor/modules/jquery.wikiEditor.iframe.js202
-rw-r--r--extensions/WikiEditor/modules/jquery.wikiEditor.js44
-rw-r--r--extensions/WikiEditor/modules/jquery.wikiEditor.preview.js15
-rw-r--r--extensions/WikiEditor/modules/jquery.wikiEditor.previewDialog.js15
-rw-r--r--extensions/WikiEditor/modules/jquery.wikiEditor.publish.js13
-rw-r--r--extensions/WikiEditor/modules/jquery.wikiEditor.templateEditor.js137
-rw-r--r--extensions/WikiEditor/modules/jquery.wikiEditor.templates.js51
-rw-r--r--extensions/WikiEditor/modules/jquery.wikiEditor.toc.js136
-rw-r--r--extensions/WikiEditor/modules/jquery.wikiEditor.toolbar.config.js10
-rw-r--r--extensions/WikiEditor/modules/jquery.wikiEditor.toolbar.js98
-rw-r--r--img_auth.php8
-rw-r--r--includes/Action.php57
-rw-r--r--includes/AjaxDispatcher.php10
-rw-r--r--includes/AjaxResponse.php2
-rw-r--r--includes/ArrayUtils.php2
-rw-r--r--includes/Article.php147
-rw-r--r--includes/AuthPlugin.php13
-rw-r--r--includes/AutoLoader.php147
-rw-r--r--includes/Autopromote.php5
-rw-r--r--includes/Block.php308
-rw-r--r--includes/CallableUpdate.php30
-rw-r--r--includes/Category.php3
-rw-r--r--includes/CategoryPage.php8
-rw-r--r--includes/CategoryViewer.php60
-rw-r--r--includes/Cdb.php4
-rw-r--r--includes/Cdb_PHP.php16
-rw-r--r--includes/ChangeTags.php75
-rw-r--r--includes/ChangesFeed.php37
-rw-r--r--includes/ChangesList.php1304
-rw-r--r--includes/Collation.php22
-rw-r--r--includes/ConfEditor.php55
-rw-r--r--includes/Cookie.php7
-rw-r--r--includes/DataUpdate.php4
-rw-r--r--includes/DefaultSettings.php1309
-rw-r--r--includes/DeferredUpdates.php12
-rw-r--r--includes/Defines.php11
-rw-r--r--includes/EditPage.php290
-rw-r--r--includes/Exception.php275
-rw-r--r--includes/Export.php33
-rw-r--r--includes/ExternalEdit.php132
-rw-r--r--includes/ExternalUser.php309
-rw-r--r--includes/Fallback.php28
-rw-r--r--includes/Feed.php26
-rw-r--r--includes/FeedUtils.php27
-rw-r--r--includes/FileDeleteForm.php36
-rw-r--r--includes/ForkController.php4
-rw-r--r--includes/FormOptions.php163
-rw-r--r--includes/GitInfo.php39
-rw-r--r--includes/GlobalFunctions.php675
-rw-r--r--includes/HTMLForm.php541
-rw-r--r--includes/HashRing.php142
-rw-r--r--includes/HistoryBlob.php35
-rw-r--r--includes/Hooks.php282
-rw-r--r--includes/Html.php179
-rw-r--r--includes/HtmlFormatter.php356
-rw-r--r--includes/HttpFunctions.php118
-rw-r--r--includes/IP.php32
-rw-r--r--includes/ImagePage.php49
-rw-r--r--includes/ImageQueryPage.php25
-rw-r--r--includes/Import.php135
-rw-r--r--includes/Init.php150
-rw-r--r--includes/Licenses.php2
-rw-r--r--includes/LinkFilter.php4
-rw-r--r--includes/Linker.php103
-rw-r--r--includes/LinksUpdate.php154
-rw-r--r--includes/MWCryptRand.php (renamed from includes/CryptRand.php)2
-rw-r--r--includes/MWFunction.php34
-rw-r--r--includes/MagicWord.php23
-rw-r--r--includes/MappedIterator.php88
-rw-r--r--includes/Message.php212
-rw-r--r--includes/Metadata.php28
-rw-r--r--includes/MimeMagic.php88
-rw-r--r--includes/Namespace.php6
-rw-r--r--includes/OutputHandler.php80
-rw-r--r--includes/OutputPage.php476
-rw-r--r--includes/PHPVersionError.php12
-rw-r--r--includes/PageQueryPage.php5
-rw-r--r--includes/Pager.php140
-rw-r--r--includes/PathRouter.php10
-rw-r--r--includes/PoolCounter.php221
-rw-r--r--includes/Preferences.php541
-rw-r--r--includes/PrefixSearch.php40
-rw-r--r--includes/ProtectionForm.php110
-rw-r--r--includes/ProxyTools.php40
-rw-r--r--includes/QueryPage.php92
-rw-r--r--includes/Revision.php265
-rw-r--r--includes/RevisionList.php5
-rw-r--r--includes/Sanitizer.php361
-rw-r--r--includes/ScopedCallback.php41
-rw-r--r--includes/SeleniumWebSettings.php221
-rw-r--r--includes/Setup.php153
-rw-r--r--includes/SiteConfiguration.php58
-rw-r--r--includes/SiteStats.php126
-rw-r--r--includes/Skin.php202
-rw-r--r--includes/SkinLegacy.php882
-rw-r--r--includes/SkinTemplate.php346
-rw-r--r--includes/SpecialPage.php160
-rw-r--r--includes/SpecialPageFactory.php15
-rw-r--r--includes/SqlDataUpdate.php2
-rw-r--r--includes/StatCounter.php150
-rw-r--r--includes/Status.php91
-rw-r--r--includes/StreamFile.php1
-rw-r--r--includes/StringUtils.php135
-rw-r--r--includes/StubObject.php25
-rw-r--r--includes/Timestamp.php267
-rw-r--r--includes/Title.php528
-rw-r--r--includes/UIDGenerator.php35
-rw-r--r--includes/User.php1151
-rw-r--r--includes/UserArray.php2
-rw-r--r--includes/UserMailer.php53
-rw-r--r--includes/UserRightsProxy.php10
-rw-r--r--includes/WatchedItem.php65
-rw-r--r--includes/WebRequest.php187
-rw-r--r--includes/WebResponse.php121
-rw-r--r--includes/WebStart.php52
-rw-r--r--includes/Wiki.php145
-rw-r--r--includes/WikiError.php2
-rw-r--r--includes/WikiFilePage.php4
-rw-r--r--includes/WikiMap.php20
-rw-r--r--includes/WikiPage.php632
-rw-r--r--includes/Xml.php221
-rw-r--r--includes/XmlTypeCheck.php86
-rw-r--r--includes/ZhClient.php6
-rw-r--r--includes/ZipDirectoryReader.php2
-rw-r--r--includes/actions/CreditsAction.php15
-rw-r--r--includes/actions/EditAction.php14
-rw-r--r--includes/actions/HistoryAction.php51
-rw-r--r--includes/actions/InfoAction.php69
-rw-r--r--includes/actions/PurgeAction.php4
-rw-r--r--includes/actions/RawAction.php29
-rw-r--r--includes/actions/WatchAction.php62
-rw-r--r--includes/api/ApiBase.php119
-rw-r--r--includes/api/ApiBlock.php2
-rw-r--r--includes/api/ApiComparePages.php8
-rw-r--r--includes/api/ApiCreateAccount.php52
-rw-r--r--includes/api/ApiDelete.php3
-rw-r--r--includes/api/ApiEditPage.php59
-rw-r--r--includes/api/ApiExpandTemplates.php4
-rw-r--r--includes/api/ApiFeedContributions.php15
-rw-r--r--includes/api/ApiFeedWatchlist.php90
-rw-r--r--includes/api/ApiFormatBase.php8
-rw-r--r--includes/api/ApiFormatJson.php24
-rw-r--r--includes/api/ApiFormatWddx.php75
-rw-r--r--includes/api/ApiFormatXml.php137
-rw-r--r--includes/api/ApiImageRotate.php32
-rw-r--r--includes/api/ApiImport.php6
-rw-r--r--includes/api/ApiMain.php36
-rw-r--r--includes/api/ApiMove.php4
-rw-r--r--includes/api/ApiOpenSearch.php21
-rw-r--r--includes/api/ApiOptions.php8
-rw-r--r--includes/api/ApiPageSet.php18
-rw-r--r--includes/api/ApiParamInfo.php6
-rw-r--r--includes/api/ApiParse.php157
-rw-r--r--includes/api/ApiPatrol.php46
-rw-r--r--includes/api/ApiProtect.php3
-rw-r--r--includes/api/ApiPurge.php29
-rw-r--r--includes/api/ApiQuery.php10
-rw-r--r--includes/api/ApiQueryAllCategories.php4
-rw-r--r--includes/api/ApiQueryAllImages.php4
-rw-r--r--includes/api/ApiQueryAllLinks.php116
-rw-r--r--includes/api/ApiQueryAllMessages.php2
-rw-r--r--includes/api/ApiQueryAllPages.php7
-rw-r--r--includes/api/ApiQueryAllUsers.php4
-rw-r--r--includes/api/ApiQueryBacklinks.php15
-rw-r--r--includes/api/ApiQueryBase.php4
-rw-r--r--includes/api/ApiQueryBlocks.php61
-rw-r--r--includes/api/ApiQueryCategories.php5
-rw-r--r--includes/api/ApiQueryCategoryMembers.php6
-rw-r--r--includes/api/ApiQueryDeletedrevs.php6
-rw-r--r--includes/api/ApiQueryDuplicateFiles.php23
-rw-r--r--includes/api/ApiQueryExtLinksUsage.php6
-rw-r--r--includes/api/ApiQueryExternalLinks.php8
-rw-r--r--includes/api/ApiQueryFileRepoInfo.php115
-rw-r--r--includes/api/ApiQueryFilearchive.php8
-rw-r--r--includes/api/ApiQueryIWBacklinks.php4
-rw-r--r--includes/api/ApiQueryIWLinks.php13
-rw-r--r--includes/api/ApiQueryImageInfo.php80
-rw-r--r--includes/api/ApiQueryInfo.php20
-rw-r--r--includes/api/ApiQueryLangBacklinks.php9
-rw-r--r--includes/api/ApiQueryLangLinks.php17
-rw-r--r--includes/api/ApiQueryLogEvents.php24
-rw-r--r--includes/api/ApiQueryORM.php4
-rw-r--r--includes/api/ApiQueryPagesWithProp.php2
-rw-r--r--includes/api/ApiQueryProtectedTitles.php2
-rw-r--r--includes/api/ApiQueryQueryPage.php19
-rw-r--r--includes/api/ApiQueryRandom.php4
-rw-r--r--includes/api/ApiQueryRecentChanges.php43
-rw-r--r--includes/api/ApiQueryRevisions.php29
-rw-r--r--includes/api/ApiQuerySearch.php39
-rw-r--r--includes/api/ApiQuerySiteinfo.php62
-rw-r--r--includes/api/ApiQueryTags.php7
-rw-r--r--includes/api/ApiQueryUserContributions.php21
-rw-r--r--includes/api/ApiQueryUserInfo.php20
-rw-r--r--includes/api/ApiQueryUsers.php6
-rw-r--r--includes/api/ApiQueryWatchlist.php95
-rw-r--r--includes/api/ApiQueryWatchlistRaw.php4
-rw-r--r--includes/api/ApiRsd.php2
-rw-r--r--includes/api/ApiSetNotificationTimestamp.php7
-rw-r--r--includes/api/ApiUpload.php84
-rw-r--r--includes/api/ApiUserrights.php7
-rw-r--r--includes/api/ApiWatch.php11
-rw-r--r--includes/cache/BacklinkCache.php134
-rw-r--r--includes/cache/CacheDependency.php2
-rw-r--r--includes/cache/FileCacheBase.php6
-rw-r--r--includes/cache/GenderCache.php14
-rw-r--r--includes/cache/HTMLCacheUpdate.php11
-rw-r--r--includes/cache/HTMLFileCache.php4
-rw-r--r--includes/cache/LinkBatch.php4
-rw-r--r--includes/cache/LinkCache.php68
-rw-r--r--includes/cache/LocalisationCache.php96
-rw-r--r--includes/cache/MessageCache.php729
-rw-r--r--includes/cache/ResourceFileCache.php2
-rw-r--r--includes/cache/SquidUpdate.php197
-rw-r--r--includes/cache/UserCache.php13
-rw-r--r--includes/changes/ChangesList.php552
-rw-r--r--includes/changes/EnhancedChangesList.php662
-rw-r--r--includes/changes/OldChangesList.php130
-rw-r--r--includes/changes/RCCacheEntry.php (renamed from redirect.php5)19
-rw-r--r--includes/changes/RecentChange.php (renamed from includes/RecentChange.php)232
-rw-r--r--includes/clientpool/RedisConnectionPool.php90
-rw-r--r--includes/content/Content.php14
-rw-r--r--includes/content/ContentHandler.php19
-rw-r--r--includes/content/CssContent.php2
-rw-r--r--includes/content/JavaScriptContent.php2
-rw-r--r--includes/content/TextContent.php2
-rw-r--r--includes/content/WikitextContent.php3
-rw-r--r--includes/content/WikitextContentHandler.php19
-rw-r--r--includes/context/ContextSource.php2
-rw-r--r--includes/context/DerivativeContext.php25
-rw-r--r--includes/context/IContextSource.php2
-rw-r--r--includes/context/RequestContext.php19
-rw-r--r--includes/db/ChronologyProtector.php106
-rw-r--r--includes/db/CloneDatabase.php18
-rw-r--r--includes/db/Database.php517
-rw-r--r--includes/db/DatabaseError.php202
-rw-r--r--includes/db/DatabaseMssql.php190
-rw-r--r--includes/db/DatabaseMysql.php933
-rw-r--r--includes/db/DatabaseMysqlBase.php1154
-rw-r--r--includes/db/DatabaseMysqli.php194
-rw-r--r--includes/db/DatabaseOracle.php92
-rw-r--r--includes/db/DatabasePostgres.php98
-rw-r--r--includes/db/DatabaseSqlite.php49
-rw-r--r--includes/db/DatabaseUtility.php3
-rw-r--r--includes/db/IORMRow.php24
-rw-r--r--includes/db/LBFactory.php94
-rw-r--r--includes/db/LBFactory_Multi.php6
-rw-r--r--includes/db/LoadBalancer.php104
-rw-r--r--includes/db/LoadMonitor.php27
-rw-r--r--includes/db/ORMRow.php182
-rw-r--r--includes/db/ORMTable.php211
-rw-r--r--includes/debug/Debug.php74
-rw-r--r--includes/diff/DairikiDiff.php40
-rw-r--r--includes/diff/DifferenceEngine.php205
-rw-r--r--includes/extauth/Hardcoded.php84
-rw-r--r--includes/extauth/MediaWiki.php168
-rw-r--r--includes/extauth/vB.php146
-rw-r--r--includes/externalstore/ExternalStore.php57
-rw-r--r--includes/externalstore/ExternalStoreDB.php142
-rw-r--r--includes/externalstore/ExternalStoreMedium.php19
-rw-r--r--includes/externalstore/ExternalStoreMwstore.php23
-rw-r--r--includes/filebackend/FSFile.php29
-rw-r--r--includes/filebackend/FSFileBackend.php117
-rw-r--r--includes/filebackend/FileBackend.php143
-rw-r--r--includes/filebackend/FileBackendGroup.php28
-rw-r--r--includes/filebackend/FileBackendMultiWrite.php179
-rw-r--r--includes/filebackend/FileBackendStore.php576
-rw-r--r--includes/filebackend/FileOp.php193
-rw-r--r--includes/filebackend/FileOpBatch.php6
-rw-r--r--includes/filebackend/README2
-rw-r--r--includes/filebackend/SwiftFileBackend.php262
-rw-r--r--includes/filebackend/TempFSFile.php6
-rw-r--r--includes/filebackend/filejournal/DBFileJournal.php10
-rw-r--r--includes/filebackend/lockmanager/DBLockManager.php37
-rw-r--r--includes/filebackend/lockmanager/LockManager.php125
-rw-r--r--includes/filebackend/lockmanager/LockManagerGroup.php4
-rw-r--r--includes/filebackend/lockmanager/MemcLockManager.php41
-rw-r--r--includes/filebackend/lockmanager/QuorumLockManager.php140
-rw-r--r--includes/filebackend/lockmanager/RedisLockManager.php288
-rw-r--r--includes/filebackend/lockmanager/ScopedLock.php44
-rw-r--r--includes/filerepo/FSRepo.php14
-rw-r--r--includes/filerepo/FileRepo.php108
-rw-r--r--includes/filerepo/ForeignAPIRepo.php226
-rw-r--r--includes/filerepo/ForeignDBRepo.php5
-rw-r--r--includes/filerepo/LocalRepo.php42
-rw-r--r--includes/filerepo/RepoGroup.php12
-rw-r--r--includes/filerepo/file/ArchivedFile.php23
-rw-r--r--includes/filerepo/file/File.php37
-rw-r--r--includes/filerepo/file/ForeignAPIFile.php49
-rw-r--r--includes/filerepo/file/ForeignDBFile.php5
-rw-r--r--includes/filerepo/file/LocalFile.php234
-rw-r--r--includes/filerepo/file/OldLocalFile.php3
-rw-r--r--includes/gallery/ImageGalleryBase.php (renamed from includes/ImageGallery.php)239
-rw-r--r--includes/gallery/NolinesImageGallery.php (renamed from skins/MySkin.php)27
-rw-r--r--includes/gallery/PackedImageGallery.php105
-rw-r--r--includes/gallery/PackedOverlayImageGallery.php60
-rw-r--r--includes/gallery/TraditionalImageGallery.php328
-rw-r--r--includes/installer/CliInstaller.php9
-rw-r--r--includes/installer/DatabaseInstaller.php64
-rw-r--r--includes/installer/DatabaseUpdater.php156
-rw-r--r--includes/installer/InstallDocFormatter.php12
-rw-r--r--includes/installer/Installer.i18n.php1959
-rw-r--r--includes/installer/Installer.php298
-rw-r--r--includes/installer/LocalSettingsGenerator.php59
-rw-r--r--includes/installer/MysqlInstaller.php135
-rw-r--r--includes/installer/MysqlUpdater.php516
-rw-r--r--includes/installer/OracleInstaller.php61
-rw-r--r--includes/installer/OracleUpdater.php72
-rw-r--r--includes/installer/PhpBugTests.php2
-rw-r--r--includes/installer/PostgresInstaller.php62
-rw-r--r--includes/installer/PostgresUpdater.php575
-rw-r--r--includes/installer/SqliteInstaller.php38
-rw-r--r--includes/installer/SqliteUpdater.php121
-rw-r--r--includes/installer/WebInstaller.php208
-rw-r--r--includes/installer/WebInstallerOutput.php112
-rw-r--r--includes/installer/WebInstallerPage.php259
-rw-r--r--includes/job/Job.php56
-rw-r--r--includes/job/JobQueue.php355
-rw-r--r--includes/job/JobQueueDB.php688
-rw-r--r--includes/job/JobQueueFederated.php473
-rw-r--r--includes/job/JobQueueGroup.php90
-rw-r--r--includes/job/JobQueueRedis.php856
-rw-r--r--includes/job/aggregator/JobQueueAggregator.php (renamed from includes/job/JobQueueAggregator.php)17
-rw-r--r--includes/job/aggregator/JobQueueAggregatorMemc.php (renamed from includes/job/JobQueueAggregatorMemc.php)11
-rw-r--r--includes/job/aggregator/JobQueueAggregatorRedis.php (renamed from includes/job/JobQueueAggregatorRedis.php)28
-rw-r--r--includes/job/jobs/AssembleUploadChunksJob.php19
-rw-r--r--includes/job/jobs/DoubleRedirectJob.php29
-rw-r--r--includes/job/jobs/DuplicateJob.php2
-rw-r--r--includes/job/jobs/EnotifNotifyJob.php2
-rw-r--r--includes/job/jobs/HTMLCacheUpdateJob.php25
-rw-r--r--includes/job/jobs/NullJob.php16
-rw-r--r--includes/job/jobs/PublishStashedFileJob.php22
-rw-r--r--includes/job/jobs/RefreshLinksJob.php28
-rw-r--r--includes/job/jobs/UploadFromUrlJob.php7
-rw-r--r--includes/json/FormatJson.php217
-rw-r--r--includes/json/Services_JSON.php882
-rw-r--r--includes/libs/CSSJanus.php72
-rw-r--r--includes/libs/CSSMin.php47
-rw-r--r--includes/libs/HttpStatus.php2
-rw-r--r--includes/libs/lessc.inc.php3742
-rw-r--r--includes/limit.sh9
-rw-r--r--includes/logging/DeleteLogFormatter.php196
-rw-r--r--includes/logging/LogEntry.php55
-rw-r--r--includes/logging/LogEventsList.php82
-rw-r--r--includes/logging/LogFormatter.php412
-rw-r--r--includes/logging/LogPage.php62
-rw-r--r--includes/logging/LogPager.php77
-rw-r--r--includes/logging/MoveLogFormatter.php82
-rw-r--r--includes/logging/NewUsersLogFormatter.php65
-rw-r--r--includes/logging/PatrolLog.php7
-rw-r--r--includes/logging/PatrolLogFormatter.php63
-rw-r--r--includes/logging/RightsLogFormatter.php112
-rw-r--r--includes/media/BMP.php6
-rw-r--r--includes/media/Bitmap.php47
-rw-r--r--includes/media/BitmapMetadataHandler.php24
-rw-r--r--includes/media/DjVu.php21
-rw-r--r--includes/media/DjVuImage.php44
-rw-r--r--includes/media/Exif.php76
-rw-r--r--includes/media/ExifBitmap.php8
-rw-r--r--includes/media/FormatMetadata.php101
-rw-r--r--includes/media/GIF.php8
-rw-r--r--includes/media/GIFMetadataExtractor.php46
-rw-r--r--includes/media/IPTC.php8
-rw-r--r--includes/media/ImageHandler.php23
-rw-r--r--includes/media/Jpeg.php20
-rw-r--r--includes/media/JpegMetadataExtractor.php22
-rw-r--r--includes/media/MediaHandler.php149
-rw-r--r--includes/media/MediaTransformOutput.php53
-rw-r--r--includes/media/PNG.php13
-rw-r--r--includes/media/PNGMetadataExtractor.php30
-rw-r--r--includes/media/SVG.php92
-rw-r--r--includes/media/SVGMetadataExtractor.php64
-rw-r--r--includes/media/Tiff.php2
-rw-r--r--includes/media/XCF.php6
-rw-r--r--includes/media/XMP.php26
-rw-r--r--includes/media/XMPInfo.php6
-rw-r--r--includes/media/XMPValidate.php12
-rw-r--r--includes/mime.info4
-rw-r--r--includes/mime.types5
-rw-r--r--includes/normal/README10
-rw-r--r--includes/normal/RandomTest.php6
-rw-r--r--includes/normal/UtfNormal.php4
-rw-r--r--includes/normal/UtfNormalTest.php8
-rw-r--r--includes/normal/UtfNormalTest2.php2
-rw-r--r--includes/normal/UtfNormalUtil.php8
-rw-r--r--includes/objectcache/BagOStuff.php8
-rw-r--r--includes/objectcache/MemcachedBagOStuff.php2
-rw-r--r--includes/objectcache/MemcachedClient.php24
-rw-r--r--includes/objectcache/MemcachedPeclBagOStuff.php14
-rw-r--r--includes/objectcache/MultiWriteBagOStuff.php2
-rw-r--r--includes/objectcache/ObjectCache.php14
-rw-r--r--includes/objectcache/ObjectCacheSessionHandler.php2
-rw-r--r--includes/objectcache/RedisBagOStuff.php40
-rw-r--r--includes/objectcache/SqlBagOStuff.php22
-rw-r--r--includes/parser/CacheTime.php2
-rw-r--r--includes/parser/CoreLinkFunctions.php92
-rw-r--r--includes/parser/CoreParserFunctions.php197
-rw-r--r--includes/parser/CoreTagHooks.php2
-rw-r--r--includes/parser/DateFormatter.php24
-rw-r--r--includes/parser/LinkHolderArray.php216
-rw-r--r--includes/parser/Parser.php848
-rw-r--r--includes/parser/ParserCache.php20
-rw-r--r--includes/parser/ParserOptions.php21
-rw-r--r--includes/parser/ParserOutput.php111
-rw-r--r--includes/parser/Parser_DiffTest.php2
-rw-r--r--includes/parser/Parser_LinkHooks.php326
-rw-r--r--includes/parser/Preprocessor_DOM.php99
-rw-r--r--includes/parser/Preprocessor_Hash.php61
-rw-r--r--includes/parser/Tidy.php11
-rw-r--r--includes/profiler/Profiler.php264
-rw-r--r--includes/profiler/ProfilerSimple.php5
-rw-r--r--includes/profiler/ProfilerSimpleText.php12
-rw-r--r--includes/profiler/ProfilerSimpleTrace.php2
-rw-r--r--includes/profiler/ProfilerSimpleUDP.php12
-rw-r--r--includes/profiler/ProfilerStub.php2
-rw-r--r--includes/rcfeed/IRCColourfulRCFeedFormatter.php99
-rw-r--r--includes/rcfeed/JSONRCFeedFormatter.php90
-rw-r--r--includes/rcfeed/RCFeedEngine.php12
-rw-r--r--includes/rcfeed/RCFeedFormatter.php13
-rw-r--r--includes/rcfeed/RedisPubSubFeedEngine.php41
-rw-r--r--includes/rcfeed/UDPRCFeedEngine.php10
-rw-r--r--includes/resourceloader/ResourceLoader.php181
-rw-r--r--includes/resourceloader/ResourceLoaderContext.php2
-rw-r--r--includes/resourceloader/ResourceLoaderFileModule.php176
-rw-r--r--includes/resourceloader/ResourceLoaderLESSFunctions.php67
-rw-r--r--includes/resourceloader/ResourceLoaderLanguageDataModule.php31
-rw-r--r--includes/resourceloader/ResourceLoaderModule.php102
-rw-r--r--includes/resourceloader/ResourceLoaderSiteModule.php23
-rw-r--r--includes/resourceloader/ResourceLoaderStartUpModule.php10
-rw-r--r--includes/resourceloader/ResourceLoaderUserCSSPrefsModule.php67
-rw-r--r--includes/resourceloader/ResourceLoaderUserGroupsModule.php15
-rw-r--r--includes/resourceloader/ResourceLoaderUserModule.php21
-rw-r--r--includes/resourceloader/ResourceLoaderUserOptionsModule.php4
-rw-r--r--includes/resourceloader/ResourceLoaderUserTokensModule.php9
-rw-r--r--includes/resourceloader/ResourceLoaderWikiModule.php4
-rw-r--r--includes/revisiondelete/RevisionDelete.php86
-rw-r--r--includes/revisiondelete/RevisionDeleteAbstracts.php50
-rw-r--r--includes/revisiondelete/RevisionDeleteUser.php2
-rw-r--r--includes/revisiondelete/RevisionDeleter.php149
-rw-r--r--includes/search/SearchEngine.php169
-rw-r--r--includes/search/SearchMssql.php6
-rw-r--r--includes/search/SearchMySQL.php66
-rw-r--r--includes/search/SearchOracle.php86
-rw-r--r--includes/search/SearchPostgres.php43
-rw-r--r--includes/search/SearchSqlite.php39
-rw-r--r--includes/search/SearchUpdate.php123
-rw-r--r--includes/site/MediaWikiSite.php8
-rw-r--r--includes/site/SiteSQLStore.php52
-rw-r--r--includes/specials/SpecialActiveusers.php74
-rw-r--r--includes/specials/SpecialAllmessages.php143
-rw-r--r--includes/specials/SpecialAllpages.php174
-rw-r--r--includes/specials/SpecialAncientpages.php22
-rw-r--r--includes/specials/SpecialBlankpage.php1
-rw-r--r--includes/specials/SpecialBlock.php49
-rw-r--r--includes/specials/SpecialBlockList.php52
-rw-r--r--includes/specials/SpecialBlockme.php66
-rw-r--r--includes/specials/SpecialBooksources.php49
-rw-r--r--includes/specials/SpecialBrokenRedirects.php12
-rw-r--r--includes/specials/SpecialCachedPage.php1
-rw-r--r--includes/specials/SpecialCategories.php38
-rw-r--r--includes/specials/SpecialChangeEmail.php67
-rw-r--r--includes/specials/SpecialChangePassword.php134
-rw-r--r--includes/specials/SpecialComparePages.php11
-rw-r--r--includes/specials/SpecialConfirmemail.php101
-rw-r--r--includes/specials/SpecialContributions.php380
-rw-r--r--includes/specials/SpecialDeadendpages.php25
-rw-r--r--includes/specials/SpecialDeletedContributions.php179
-rw-r--r--includes/specials/SpecialDisambiguations.php165
-rw-r--r--includes/specials/SpecialDoubleRedirects.php31
-rw-r--r--includes/specials/SpecialEditWatchlist.php174
-rw-r--r--includes/specials/SpecialEmailuser.php82
-rw-r--r--includes/specials/SpecialExport.php143
-rw-r--r--includes/specials/SpecialFewestrevisions.php53
-rw-r--r--includes/specials/SpecialFileDuplicateSearch.php51
-rw-r--r--includes/specials/SpecialFilepath.php62
-rw-r--r--includes/specials/SpecialImport.php245
-rw-r--r--includes/specials/SpecialJavaScriptTest.php56
-rw-r--r--includes/specials/SpecialLinkSearch.php71
-rw-r--r--includes/specials/SpecialListfiles.php301
-rw-r--r--includes/specials/SpecialListgrouprights.php51
-rw-r--r--includes/specials/SpecialListredirects.php34
-rw-r--r--includes/specials/SpecialListusers.php113
-rw-r--r--includes/specials/SpecialLog.php79
-rw-r--r--includes/specials/SpecialLonelypages.php48
-rw-r--r--includes/specials/SpecialLongpages.php1
-rw-r--r--includes/specials/SpecialMIMEsearch.php97
-rw-r--r--includes/specials/SpecialMergeHistory.php118
-rw-r--r--includes/specials/SpecialMostcategories.php48
-rw-r--r--includes/specials/SpecialMostimages.php19
-rw-r--r--includes/specials/SpecialMostinterwikis.php32
-rw-r--r--includes/specials/SpecialMostlinked.php69
-rw-r--r--includes/specials/SpecialMostlinkedcategories.php32
-rw-r--r--includes/specials/SpecialMostlinkedtemplates.php39
-rw-r--r--includes/specials/SpecialMovepage.php263
-rw-r--r--includes/specials/SpecialNewimages.php40
-rw-r--r--includes/specials/SpecialNewpages.php156
-rw-r--r--includes/specials/SpecialPagesWithProp.php32
-rw-r--r--includes/specials/SpecialPasswordReset.php94
-rw-r--r--includes/specials/SpecialPopularpages.php34
-rw-r--r--includes/specials/SpecialPreferences.php26
-rw-r--r--includes/specials/SpecialPrefixindex.php147
-rw-r--r--includes/specials/SpecialProtectedpages.php169
-rw-r--r--includes/specials/SpecialProtectedtitles.php80
-rw-r--r--includes/specials/SpecialRandomInCategory.php291
-rw-r--r--includes/specials/SpecialRandompage.php31
-rw-r--r--includes/specials/SpecialRandomredirect.php1
-rw-r--r--includes/specials/SpecialRecentchanges.php410
-rw-r--r--includes/specials/SpecialRecentchangeslinked.php63
-rw-r--r--includes/specials/SpecialRedirect.php235
-rw-r--r--includes/specials/SpecialResetTokens.php145
-rw-r--r--includes/specials/SpecialRevisiondelete.php170
-rw-r--r--includes/specials/SpecialSearch.php198
-rw-r--r--includes/specials/SpecialShortpages.php18
-rw-r--r--includes/specials/SpecialSpecialpages.php17
-rw-r--r--includes/specials/SpecialStatistics.php37
-rw-r--r--includes/specials/SpecialTags.php69
-rw-r--r--includes/specials/SpecialUnblock.php22
-rw-r--r--includes/specials/SpecialUncategorizedcategories.php6
-rw-r--r--includes/specials/SpecialUncategorizedimages.php2
-rw-r--r--includes/specials/SpecialUncategorizedpages.php13
-rw-r--r--includes/specials/SpecialUndelete.php680
-rw-r--r--includes/specials/SpecialUnusedcategories.php15
-rw-r--r--includes/specials/SpecialUnusedimages.php16
-rw-r--r--includes/specials/SpecialUnusedtemplates.php16
-rw-r--r--includes/specials/SpecialUnwatchedpages.php16
-rw-r--r--includes/specials/SpecialUpload.php126
-rw-r--r--includes/specials/SpecialUploadStash.php29
-rw-r--r--includes/specials/SpecialUserlogin.php369
-rw-r--r--includes/specials/SpecialUserrights.php162
-rw-r--r--includes/specials/SpecialVersion.php203
-rw-r--r--includes/specials/SpecialWantedcategories.php18
-rw-r--r--includes/specials/SpecialWantedfiles.php16
-rw-r--r--includes/specials/SpecialWantedtemplates.php14
-rw-r--r--includes/specials/SpecialWatchlist.php192
-rw-r--r--includes/specials/SpecialWhatlinkshere.php69
-rw-r--r--includes/specials/SpecialWithoutinterwiki.php28
-rw-r--r--includes/templates/NoLocalSettings.php14
-rw-r--r--includes/templates/Usercreate.php445
-rw-r--r--includes/templates/Userlogin.php278
-rw-r--r--includes/tidy.conf2
-rw-r--r--includes/upload/UploadBase.php202
-rw-r--r--includes/upload/UploadFromChunks.php26
-rw-r--r--includes/upload/UploadFromFile.php2
-rw-r--r--includes/upload/UploadFromStash.php6
-rw-r--r--includes/upload/UploadFromUrl.php49
-rw-r--r--includes/upload/UploadStash.php29
-rw-r--r--index.php16
-rw-r--r--languages/Language.php500
-rw-r--r--languages/LanguageConverter.php84
-rw-r--r--languages/Names.php46
-rw-r--r--languages/classes/LanguageAz.php2
-rw-r--r--languages/classes/LanguageBe_tarask.php12
-rw-r--r--languages/classes/LanguageCu.php27
-rw-r--r--languages/classes/LanguageEo.php70
-rw-r--r--languages/classes/LanguageEs.php (renamed from languages/classes/LanguageTl.php)24
-rw-r--r--languages/classes/LanguageFi.php6
-rw-r--r--languages/classes/LanguageGa.php21
-rw-r--r--languages/classes/LanguageGan.php47
-rw-r--r--languages/classes/LanguageGv.php4
-rw-r--r--languages/classes/LanguageHi.php44
-rw-r--r--languages/classes/LanguageHr.php8
-rw-r--r--languages/classes/LanguageHy.php12
-rw-r--r--languages/classes/LanguageIu.php20
-rw-r--r--languages/classes/LanguageKaa.php6
-rw-r--r--languages/classes/LanguageKk.php52
-rw-r--r--languages/classes/LanguageKk_cyrl.php62
-rw-r--r--languages/classes/LanguageKsh.php20
-rw-r--r--languages/classes/LanguageKu.php64
-rw-r--r--languages/classes/LanguageLa.php90
-rw-r--r--languages/classes/LanguageMg.php44
-rw-r--r--languages/classes/LanguageMk.php49
-rw-r--r--languages/classes/LanguageMt.php48
-rw-r--r--languages/classes/LanguageNso.php44
-rw-r--r--languages/classes/LanguageOs.php38
-rw-r--r--languages/classes/LanguagePl.php25
-rw-r--r--languages/classes/LanguageSh.php58
-rw-r--r--languages/classes/LanguageShi.php36
-rw-r--r--languages/classes/LanguageSk.php49
-rw-r--r--languages/classes/LanguageSl.php27
-rw-r--r--languages/classes/LanguageSr.php40
-rw-r--r--languages/classes/LanguageSr_ec.php8
-rw-r--r--languages/classes/LanguageSr_el.php8
-rw-r--r--languages/classes/LanguageTg.php4
-rw-r--r--languages/classes/LanguageTi.php44
-rw-r--r--languages/classes/LanguageTr.php4
-rw-r--r--languages/classes/LanguageTyv.php2
-rw-r--r--languages/classes/LanguageUk.php37
-rw-r--r--languages/classes/LanguageUz.php10
-rw-r--r--languages/classes/LanguageWa.php42
-rw-r--r--languages/classes/LanguageZh.php58
-rw-r--r--languages/classes/LanguageZh_hans.php2
-rw-r--r--languages/data/plurals-mediawiki.xml7
-rw-r--r--languages/data/plurals.xml2
-rw-r--r--languages/messages/MessagesAce.php49
-rw-r--r--languages/messages/MessagesAeb.php26
-rw-r--r--languages/messages/MessagesAf.php234
-rw-r--r--languages/messages/MessagesAln.php43
-rw-r--r--languages/messages/MessagesAm.php66
-rw-r--r--languages/messages/MessagesAn.php86
-rw-r--r--languages/messages/MessagesAng.php51
-rw-r--r--languages/messages/MessagesAr.php260
-rw-r--r--languages/messages/MessagesArc.php48
-rw-r--r--languages/messages/MessagesArn.php10
-rw-r--r--languages/messages/MessagesAry.php62
-rw-r--r--languages/messages/MessagesArz.php81
-rw-r--r--languages/messages/MessagesAs.php171
-rw-r--r--languages/messages/MessagesAst.php288
-rw-r--r--languages/messages/MessagesAvk.php49
-rw-r--r--languages/messages/MessagesAy.php1
-rw-r--r--languages/messages/MessagesAz.php83
-rw-r--r--languages/messages/MessagesAzb.php173
-rw-r--r--languages/messages/MessagesBa.php260
-rw-r--r--languages/messages/MessagesBar.php36
-rw-r--r--languages/messages/MessagesBbc.php12
-rw-r--r--languages/messages/MessagesBbc_latn.php734
-rw-r--r--languages/messages/MessagesBcc.php64
-rw-r--r--languages/messages/MessagesBcl.php250
-rw-r--r--languages/messages/MessagesBe.php98
-rw-r--r--languages/messages/MessagesBe_tarask.php268
-rw-r--r--languages/messages/MessagesBg.php184
-rw-r--r--languages/messages/MessagesBho.php86
-rw-r--r--languages/messages/MessagesBi.php23
-rw-r--r--languages/messages/MessagesBjn.php64
-rw-r--r--languages/messages/MessagesBn.php255
-rw-r--r--languages/messages/MessagesBo.php5
-rw-r--r--languages/messages/MessagesBpy.php42
-rw-r--r--languages/messages/MessagesBqi.php2
-rw-r--r--languages/messages/MessagesBr.php239
-rw-r--r--languages/messages/MessagesBrh.php2
-rw-r--r--languages/messages/MessagesBs.php211
-rw-r--r--languages/messages/MessagesBug.php3
-rw-r--r--languages/messages/MessagesBxr.php72
-rw-r--r--languages/messages/MessagesCa.php257
-rw-r--r--languages/messages/MessagesCbk_zam.php2
-rw-r--r--languages/messages/MessagesCdo.php71
-rw-r--r--languages/messages/MessagesCe.php266
-rw-r--r--languages/messages/MessagesCeb.php29
-rw-r--r--languages/messages/MessagesCh.php16
-rw-r--r--languages/messages/MessagesChr.php1
-rw-r--r--languages/messages/MessagesCkb.php150
-rw-r--r--languages/messages/MessagesCo.php5
-rw-r--r--languages/messages/MessagesCps.php19
-rw-r--r--languages/messages/MessagesCrh_cyrl.php49
-rw-r--r--languages/messages/MessagesCrh_latn.php49
-rw-r--r--languages/messages/MessagesCs.php269
-rw-r--r--languages/messages/MessagesCsb.php17
-rw-r--r--languages/messages/MessagesCu.php57
-rw-r--r--languages/messages/MessagesCv.php35
-rw-r--r--languages/messages/MessagesCy.php269
-rw-r--r--languages/messages/MessagesDa.php306
-rw-r--r--languages/messages/MessagesDe.php278
-rw-r--r--languages/messages/MessagesDe_at.php12
-rw-r--r--languages/messages/MessagesDe_ch.php72
-rw-r--r--languages/messages/MessagesDe_formal.php73
-rw-r--r--languages/messages/MessagesDiq.php384
-rw-r--r--languages/messages/MessagesDsb.php91
-rw-r--r--languages/messages/MessagesDtp.php35
-rw-r--r--languages/messages/MessagesDv.php86
-rw-r--r--languages/messages/MessagesEe.php3
-rw-r--r--languages/messages/MessagesEgl.php14
-rw-r--r--languages/messages/MessagesEl.php238
-rw-r--r--languages/messages/MessagesEml.php6
-rw-r--r--languages/messages/MessagesEn.php690
-rw-r--r--languages/messages/MessagesEn_ca.php33
-rw-r--r--languages/messages/MessagesEn_gb.php56
-rw-r--r--languages/messages/MessagesEo.php184
-rw-r--r--languages/messages/MessagesEs.php278
-rw-r--r--languages/messages/MessagesEt.php270
-rw-r--r--languages/messages/MessagesEu.php147
-rw-r--r--languages/messages/MessagesExt.php55
-rw-r--r--languages/messages/MessagesFa.php262
-rw-r--r--languages/messages/MessagesFi.php261
-rw-r--r--languages/messages/MessagesFit.php1
-rw-r--r--languages/messages/MessagesFj.php2
-rw-r--r--languages/messages/MessagesFo.php199
-rw-r--r--languages/messages/MessagesFr.php274
-rw-r--r--languages/messages/MessagesFrc.php2
-rw-r--r--languages/messages/MessagesFrp.php145
-rw-r--r--languages/messages/MessagesFrr.php239
-rw-r--r--languages/messages/MessagesFur.php34
-rw-r--r--languages/messages/MessagesFy.php49
-rw-r--r--languages/messages/MessagesGa.php62
-rw-r--r--languages/messages/MessagesGag.php10
-rw-r--r--languages/messages/MessagesGan_hans.php53
-rw-r--r--languages/messages/MessagesGan_hant.php53
-rw-r--r--languages/messages/MessagesGd.php47
-rw-r--r--languages/messages/MessagesGl.php275
-rw-r--r--languages/messages/MessagesGn.php5
-rw-r--r--languages/messages/MessagesGrc.php51
-rw-r--r--languages/messages/MessagesGsw.php70
-rw-r--r--languages/messages/MessagesGu.php221
-rw-r--r--languages/messages/MessagesGv.php21
-rw-r--r--languages/messages/MessagesHa.php2
-rw-r--r--languages/messages/MessagesHak.php98
-rw-r--r--languages/messages/MessagesHaw.php9
-rw-r--r--languages/messages/MessagesHe.php275
-rw-r--r--languages/messages/MessagesHi.php222
-rw-r--r--languages/messages/MessagesHif_latn.php196
-rw-r--r--languages/messages/MessagesHil.php43
-rw-r--r--languages/messages/MessagesHr.php171
-rw-r--r--languages/messages/MessagesHsb.php176
-rw-r--r--languages/messages/MessagesHt.php25
-rw-r--r--languages/messages/MessagesHu.php170
-rw-r--r--languages/messages/MessagesHy.php103
-rw-r--r--languages/messages/MessagesIa.php283
-rw-r--r--languages/messages/MessagesId.php269
-rw-r--r--languages/messages/MessagesIe.php22
-rw-r--r--languages/messages/MessagesIg.php29
-rw-r--r--languages/messages/MessagesIk.php21
-rw-r--r--languages/messages/MessagesIke_cans.php4
-rw-r--r--languages/messages/MessagesIke_latn.php4
-rw-r--r--languages/messages/MessagesIlo.php252
-rw-r--r--languages/messages/MessagesInh.php22
-rw-r--r--languages/messages/MessagesIo.php20
-rw-r--r--languages/messages/MessagesIs.php152
-rw-r--r--languages/messages/MessagesIt.php264
-rw-r--r--languages/messages/MessagesJa.php278
-rw-r--r--languages/messages/MessagesJam.php20
-rw-r--r--languages/messages/MessagesJut.php5
-rw-r--r--languages/messages/MessagesJv.php82
-rw-r--r--languages/messages/MessagesKa.php214
-rw-r--r--languages/messages/MessagesKaa.php45
-rw-r--r--languages/messages/MessagesKab.php73
-rw-r--r--languages/messages/MessagesKbd_cyrl.php22
-rw-r--r--languages/messages/MessagesKg.php13
-rw-r--r--languages/messages/MessagesKhw.php27
-rw-r--r--languages/messages/MessagesKiu.php43
-rw-r--r--languages/messages/MessagesKk_arab.php71
-rw-r--r--languages/messages/MessagesKk_cyrl.php189
-rw-r--r--languages/messages/MessagesKk_latn.php71
-rw-r--r--languages/messages/MessagesKm.php190
-rw-r--r--languages/messages/MessagesKn.php70
-rw-r--r--languages/messages/MessagesKo.php291
-rw-r--r--languages/messages/MessagesKoi.php5
-rw-r--r--languages/messages/MessagesKrc.php196
-rw-r--r--languages/messages/MessagesKrj.php11
-rw-r--r--languages/messages/MessagesKs.php49
-rw-r--r--languages/messages/MessagesKs_arab.php8
-rw-r--r--languages/messages/MessagesKs_deva.php7
-rw-r--r--languages/messages/MessagesKsh.php217
-rw-r--r--languages/messages/MessagesKu_latn.php59
-rw-r--r--languages/messages/MessagesKw.php164
-rw-r--r--languages/messages/MessagesKy.php80
-rw-r--r--languages/messages/MessagesLa.php242
-rw-r--r--languages/messages/MessagesLad.php24
-rw-r--r--languages/messages/MessagesLb.php253
-rw-r--r--languages/messages/MessagesLbe.php2
-rw-r--r--languages/messages/MessagesLez.php52
-rw-r--r--languages/messages/MessagesLfn.php24
-rw-r--r--languages/messages/MessagesLg.php28
-rw-r--r--languages/messages/MessagesLi.php71
-rw-r--r--languages/messages/MessagesLij.php50
-rw-r--r--languages/messages/MessagesLiv.php6
-rw-r--r--languages/messages/MessagesLmo.php12
-rw-r--r--languages/messages/MessagesLn.php5
-rw-r--r--languages/messages/MessagesLo.php22
-rw-r--r--languages/messages/MessagesLoz.php17
-rw-r--r--languages/messages/MessagesLt.php172
-rw-r--r--languages/messages/MessagesLtg.php10
-rw-r--r--languages/messages/MessagesLus.php37
-rw-r--r--languages/messages/MessagesLv.php166
-rw-r--r--languages/messages/MessagesLzh.php108
-rw-r--r--languages/messages/MessagesMai.php70
-rw-r--r--languages/messages/MessagesMap_bms.php120
-rw-r--r--languages/messages/MessagesMdf.php58
-rw-r--r--languages/messages/MessagesMg.php201
-rw-r--r--languages/messages/MessagesMhr.php22
-rw-r--r--languages/messages/MessagesMin.php211
-rw-r--r--languages/messages/MessagesMk.php282
-rw-r--r--languages/messages/MessagesMl.php264
-rw-r--r--languages/messages/MessagesMn.php66
-rw-r--r--languages/messages/MessagesMr.php258
-rw-r--r--languages/messages/MessagesMrj.php2
-rw-r--r--languages/messages/MessagesMs.php269
-rw-r--r--languages/messages/MessagesMt.php133
-rw-r--r--languages/messages/MessagesMwl.php22
-rw-r--r--languages/messages/MessagesMy.php41
-rw-r--r--languages/messages/MessagesMyv.php40
-rw-r--r--languages/messages/MessagesMzn.php28
-rw-r--r--languages/messages/MessagesNa.php2
-rw-r--r--languages/messages/MessagesNah.php21
-rw-r--r--languages/messages/MessagesNan.php30
-rw-r--r--languages/messages/MessagesNap.php36
-rw-r--r--languages/messages/MessagesNb.php249
-rw-r--r--languages/messages/MessagesNds.php61
-rw-r--r--languages/messages/MessagesNds_nl.php264
-rw-r--r--languages/messages/MessagesNe.php186
-rw-r--r--languages/messages/MessagesNew.php9
-rw-r--r--languages/messages/MessagesNiu.php3
-rw-r--r--languages/messages/MessagesNl.php286
-rw-r--r--languages/messages/MessagesNl_informal.php361
-rw-r--r--languages/messages/MessagesNn.php212
-rw-r--r--languages/messages/MessagesNov.php2
-rw-r--r--languages/messages/MessagesNso.php14
-rw-r--r--languages/messages/MessagesNv.php2
-rw-r--r--languages/messages/MessagesNy.php12
-rw-r--r--languages/messages/MessagesOc.php250
-rw-r--r--languages/messages/MessagesOr.php122
-rw-r--r--languages/messages/MessagesOs.php79
-rw-r--r--languages/messages/MessagesPa.php181
-rw-r--r--languages/messages/MessagesPag.php7
-rw-r--r--languages/messages/MessagesPam.php53
-rw-r--r--languages/messages/MessagesPap.php9
-rw-r--r--languages/messages/MessagesPcd.php12
-rw-r--r--languages/messages/MessagesPdc.php15
-rw-r--r--languages/messages/MessagesPdt.php10
-rw-r--r--languages/messages/MessagesPfl.php56
-rw-r--r--languages/messages/MessagesPi.php95
-rw-r--r--languages/messages/MessagesPl.php273
-rw-r--r--languages/messages/MessagesPms.php268
-rw-r--r--languages/messages/MessagesPnb.php67
-rw-r--r--languages/messages/MessagesPnt.php20
-rw-r--r--languages/messages/MessagesPrg.php61
-rw-r--r--languages/messages/MessagesPs.php102
-rw-r--r--languages/messages/MessagesPt.php239
-rw-r--r--languages/messages/MessagesPt_br.php263
-rw-r--r--languages/messages/MessagesQqq.php660
-rw-r--r--languages/messages/MessagesQu.php243
-rw-r--r--languages/messages/MessagesQug.php7
-rw-r--r--languages/messages/MessagesRgn.php2
-rw-r--r--languages/messages/MessagesRm.php68
-rw-r--r--languages/messages/MessagesRo.php269
-rw-r--r--languages/messages/MessagesRoa_tara.php261
-rw-r--r--languages/messages/MessagesRu.php300
-rw-r--r--languages/messages/MessagesRue.php234
-rw-r--r--languages/messages/MessagesRup.php123
-rw-r--r--languages/messages/MessagesSa.php84
-rw-r--r--languages/messages/MessagesSah.php219
-rw-r--r--languages/messages/MessagesSat.php35
-rw-r--r--languages/messages/MessagesSc.php35
-rw-r--r--languages/messages/MessagesScn.php110
-rw-r--r--languages/messages/MessagesSco.php25
-rw-r--r--languages/messages/MessagesSd.php9
-rw-r--r--languages/messages/MessagesSdc.php49
-rw-r--r--languages/messages/MessagesSe.php56
-rw-r--r--languages/messages/MessagesSei.php27
-rw-r--r--languages/messages/MessagesSg.php1
-rw-r--r--languages/messages/MessagesSgs.php31
-rw-r--r--languages/messages/MessagesSh.php177
-rw-r--r--languages/messages/MessagesShi.php33
-rw-r--r--languages/messages/MessagesSi.php125
-rw-r--r--languages/messages/MessagesSk.php223
-rw-r--r--languages/messages/MessagesSl.php255
-rw-r--r--languages/messages/MessagesSli.php46
-rw-r--r--languages/messages/MessagesSm.php2
-rw-r--r--languages/messages/MessagesSma.php2
-rw-r--r--languages/messages/MessagesSn.php3
-rw-r--r--languages/messages/MessagesSo.php52
-rw-r--r--languages/messages/MessagesSq.php100
-rw-r--r--languages/messages/MessagesSr_ec.php208
-rw-r--r--languages/messages/MessagesSr_el.php152
-rw-r--r--languages/messages/MessagesSrn.php18
-rw-r--r--languages/messages/MessagesSt.php2
-rw-r--r--languages/messages/MessagesStq.php64
-rw-r--r--languages/messages/MessagesSu.php59
-rw-r--r--languages/messages/MessagesSv.php278
-rw-r--r--languages/messages/MessagesSw.php84
-rw-r--r--languages/messages/MessagesSzl.php58
-rw-r--r--languages/messages/MessagesTa.php148
-rw-r--r--languages/messages/MessagesTcy.php10
-rw-r--r--languages/messages/MessagesTe.php135
-rw-r--r--languages/messages/MessagesTet.php12
-rw-r--r--languages/messages/MessagesTg_cyrl.php57
-rw-r--r--languages/messages/MessagesTg_latn.php52
-rw-r--r--languages/messages/MessagesTh.php237
-rw-r--r--languages/messages/MessagesTk.php65
-rw-r--r--languages/messages/MessagesTl.php113
-rw-r--r--languages/messages/MessagesTly.php13
-rw-r--r--languages/messages/MessagesTn.php3
-rw-r--r--languages/messages/MessagesTo.php16
-rw-r--r--languages/messages/MessagesTpi.php17
-rw-r--r--languages/messages/MessagesTr.php225
-rw-r--r--languages/messages/MessagesTru.php12
-rw-r--r--languages/messages/MessagesTs.php20
-rw-r--r--languages/messages/MessagesTt_cyrl.php85
-rw-r--r--languages/messages/MessagesTt_latn.php52
-rw-r--r--languages/messages/MessagesTyv.php120
-rw-r--r--languages/messages/MessagesUdm.php20
-rw-r--r--languages/messages/MessagesUg_arab.php109
-rw-r--r--languages/messages/MessagesUk.php278
-rw-r--r--languages/messages/MessagesUr.php100
-rw-r--r--languages/messages/MessagesUz.php71
-rw-r--r--languages/messages/MessagesVe.php10
-rw-r--r--languages/messages/MessagesVec.php166
-rw-r--r--languages/messages/MessagesVep.php51
-rw-r--r--languages/messages/MessagesVi.php326
-rw-r--r--languages/messages/MessagesVls.php6
-rw-r--r--languages/messages/MessagesVmf.php111
-rw-r--r--languages/messages/MessagesVo.php107
-rw-r--r--languages/messages/MessagesVot.php16
-rw-r--r--languages/messages/MessagesVro.php53
-rw-r--r--languages/messages/MessagesWa.php52
-rw-r--r--languages/messages/MessagesWar.php156
-rw-r--r--languages/messages/MessagesWo.php56
-rw-r--r--languages/messages/MessagesWuu.php118
-rw-r--r--languages/messages/MessagesXal.php32
-rw-r--r--languages/messages/MessagesXh.php3
-rw-r--r--languages/messages/MessagesXmf.php9
-rw-r--r--languages/messages/MessagesYi.php248
-rw-r--r--languages/messages/MessagesYo.php127
-rw-r--r--languages/messages/MessagesYue.php95
-rw-r--r--languages/messages/MessagesZea.php33
-rw-r--r--languages/messages/MessagesZh_hans.php269
-rw-r--r--languages/messages/MessagesZh_hant.php283
-rw-r--r--languages/messages/MessagesZh_tw.php7
-rw-r--r--languages/messages/MessagesZu.php47
-rw-r--r--languages/utils/CLDRPluralRuleEvaluator.php10
-rw-r--r--load.php8
-rw-r--r--maintenance/Doxyfile15
-rw-r--r--maintenance/Maintenance.php70
-rw-r--r--maintenance/archives/patch-archive-ar_id.sql8
-rw-r--r--maintenance/archives/patch-change_tag.sql17
-rw-r--r--maintenance/archives/patch-eu_local_id.sql3
-rw-r--r--maintenance/archives/patch-external_user.sql9
-rw-r--r--maintenance/archives/patch-externallinks-el_id.sql8
-rw-r--r--maintenance/archives/patch-iwl_prefix_title_from-non-unique.sql5
-rw-r--r--maintenance/archives/patch-iwlinks-from-title-index.sql4
-rw-r--r--maintenance/archives/patch-kill-iwl_pft.sql7
-rw-r--r--maintenance/archives/patch-tag_summary.sql12
-rw-r--r--maintenance/archives/patch-valid_tag.sql4
-rw-r--r--maintenance/archives/upgradeLogging.php2
-rw-r--r--maintenance/attachLatest.php4
-rw-r--r--maintenance/backup.inc40
-rw-r--r--maintenance/backupPrefetch.inc8
-rw-r--r--maintenance/backupTextPass.inc68
-rw-r--r--maintenance/benchmarks/Benchmarker.php10
-rw-r--r--maintenance/benchmarks/README7
-rw-r--r--maintenance/benchmarks/bench_HTTP_HTTPS.php4
-rw-r--r--maintenance/benchmarks/bench_delete_truncate.php4
-rw-r--r--maintenance/benchmarks/bench_if_switch.php4
-rw-r--r--maintenance/benchmarks/bench_strtr_str_replace.php4
-rw-r--r--maintenance/benchmarks/bench_utf8_title_check.php6
-rw-r--r--maintenance/benchmarks/bench_wfBaseConvert.php4
-rw-r--r--maintenance/benchmarks/bench_wfIsWindows.php4
-rw-r--r--maintenance/benchmarks/benchmarkHooks.php4
-rw-r--r--maintenance/benchmarks/benchmarkPurge.php4
-rw-r--r--maintenance/cdb.php16
-rw-r--r--maintenance/changePassword.php4
-rw-r--r--maintenance/checkBadRedirects.php4
-rw-r--r--maintenance/checkImages.php4
-rw-r--r--maintenance/checkLess.php72
-rw-r--r--maintenance/checkSyntax.php15
-rw-r--r--maintenance/checkUsernames.php34
-rw-r--r--maintenance/cleanupAncientTables.php12
-rw-r--r--maintenance/cleanupCaps.php4
-rw-r--r--maintenance/cleanupImages.php4
-rw-r--r--maintenance/cleanupPreferences.php6
-rw-r--r--maintenance/cleanupRemovedModules.php10
-rw-r--r--maintenance/cleanupSpam.php4
-rw-r--r--maintenance/cleanupTable.inc20
-rw-r--r--maintenance/cleanupTitles.php57
-rw-r--r--maintenance/cleanupUploadStash.php18
-rw-r--r--maintenance/cleanupWatchlist.php8
-rw-r--r--maintenance/clearCacheStats.php4
-rw-r--r--maintenance/clearInterwikiCache.php4
-rw-r--r--maintenance/commandLine.inc4
-rw-r--r--maintenance/compareParsers.php11
-rw-r--r--maintenance/convertLinks.php15
-rw-r--r--maintenance/convertUserOptions.php4
-rw-r--r--maintenance/copyFileBackend.php221
-rw-r--r--maintenance/copyJobQueue.php99
-rw-r--r--maintenance/createAndPromote.php20
-rw-r--r--maintenance/deleteArchivedFiles.inc2
-rw-r--r--maintenance/deleteArchivedFiles.php6
-rw-r--r--maintenance/deleteArchivedRevisions.php6
-rw-r--r--maintenance/deleteBatch.php4
-rw-r--r--maintenance/deleteDefaultMessages.php6
-rw-r--r--maintenance/deleteEqualMessages.php15
-rw-r--r--maintenance/deleteImageMemcached.php10
-rw-r--r--maintenance/deleteOldRevisions.php4
-rw-r--r--maintenance/deleteOrphanedRevisions.php10
-rw-r--r--maintenance/deleteRevision.php4
-rw-r--r--maintenance/deleteSelfExternals.php8
-rw-r--r--maintenance/dev/includes/router.php16
-rw-r--r--maintenance/dictionary/mediawiki.dic4556
-rw-r--r--maintenance/doMaintenance.php45
-rw-r--r--maintenance/dumpBackup.php12
-rw-r--r--maintenance/dumpIterator.php28
-rw-r--r--maintenance/dumpLinks.php11
-rw-r--r--maintenance/dumpSisterSites.php11
-rw-r--r--maintenance/dumpTextPass.php4
-rw-r--r--maintenance/dumpUploads.php4
-rw-r--r--maintenance/edit.php7
-rw-r--r--maintenance/eraseArchivedFile.php119
-rw-r--r--maintenance/eval.php2
-rw-r--r--maintenance/fetchText.php10
-rw-r--r--maintenance/fileOpPerfTest.php26
-rw-r--r--maintenance/findHooks.php4
-rw-r--r--maintenance/fixDoubleRedirects.php4
-rw-r--r--maintenance/fixExtLinksProtocolRelative.php4
-rw-r--r--maintenance/fixSlaveDesync.php12
-rw-r--r--maintenance/fixTimestamps.php4
-rw-r--r--maintenance/fixUserRegistration.php4
-rw-r--r--maintenance/formatInstallDoc.php4
-rw-r--r--maintenance/fuzz-tester.php47
-rw-r--r--maintenance/generateSitemap.php40
-rw-r--r--maintenance/getConfiguration.php143
-rw-r--r--maintenance/getLagTimes.php6
-rw-r--r--maintenance/getSlaveServer.php4
-rw-r--r--maintenance/getText.php4
-rw-r--r--maintenance/hiphop/compiler.conf5
-rw-r--r--maintenance/hiphop/extra-files34
-rw-r--r--maintenance/hiphop/make311
-rw-r--r--maintenance/hiphop/run-server61
-rw-r--r--maintenance/hiphop/server.conf4
-rw-r--r--maintenance/importDump.php26
-rw-r--r--maintenance/importImages.inc4
-rw-r--r--maintenance/importImages.php81
-rw-r--r--maintenance/importSiteScripts.php4
-rw-r--r--maintenance/importTextFile.php22
-rw-r--r--maintenance/initEditCount.php4
-rw-r--r--maintenance/initSiteStats.php6
-rw-r--r--maintenance/install.php12
-rw-r--r--maintenance/jsduck/MetaTags.rb16
-rw-r--r--maintenance/jsduck/categories.json25
-rw-r--r--maintenance/jsduck/config.json15
-rw-r--r--maintenance/jsduck/eg-iframe.html86
-rw-r--r--maintenance/jsduck/external.js18
-rw-r--r--maintenance/jsparse.php12
-rw-r--r--maintenance/lag.php4
-rw-r--r--maintenance/language/StatOutputs.php12
-rw-r--r--maintenance/language/alltrans.php4
-rw-r--r--maintenance/language/checkDupeMessages.php34
-rw-r--r--maintenance/language/checkExtensions.php8
-rw-r--r--maintenance/language/checkLanguage.inc210
-rw-r--r--maintenance/language/checkLanguage.php6
-rw-r--r--maintenance/language/countMessages.php6
-rw-r--r--maintenance/language/date-formats.php4
-rw-r--r--maintenance/language/digit2html.php6
-rw-r--r--maintenance/language/dumpMessages.php4
-rw-r--r--maintenance/language/generateCollationData.php8
-rw-r--r--maintenance/language/generateNormalizerData.php6
-rw-r--r--maintenance/language/langmemusage.php9
-rw-r--r--maintenance/language/languages.inc34
-rw-r--r--maintenance/language/messageTypes.inc41
-rw-r--r--maintenance/language/messages.inc289
-rw-r--r--maintenance/language/rebuildLanguage.php12
-rw-r--r--maintenance/language/transstat.php8
-rw-r--r--maintenance/language/validate.php6
-rw-r--r--maintenance/language/writeMessagesArray.inc67
-rw-r--r--maintenance/mcc.php8
-rw-r--r--maintenance/mctest.php21
-rw-r--r--maintenance/mergeMessageFileList.php86
-rw-r--r--maintenance/migrateUserGroup.php4
-rw-r--r--maintenance/minify.php4
-rw-r--r--maintenance/moveBatch.php4
-rw-r--r--maintenance/mssql/tables.sql15
-rw-r--r--maintenance/mwdoc-filter.php2
-rw-r--r--maintenance/mwdocgen.php320
-rw-r--r--maintenance/mwjsduck-gen23
-rw-r--r--maintenance/namespaceDupes.php16
-rw-r--r--maintenance/nextJobDB.php4
-rw-r--r--maintenance/nukeNS.php8
-rw-r--r--maintenance/nukePage.php6
-rw-r--r--maintenance/oracle/alterSharedConstraints.php16
-rw-r--r--maintenance/oracle/archives/patch-archive-ar_id.sql6
-rw-r--r--maintenance/oracle/archives/patch-externallinks-el_id.sql4
-rw-r--r--maintenance/oracle/tables.sql24
-rw-r--r--maintenance/orphans.php8
-rw-r--r--maintenance/parse.php12
-rw-r--r--maintenance/patchSql.php4
-rw-r--r--maintenance/populateCategory.php4
-rw-r--r--maintenance/populateFilearchiveSha1.php8
-rw-r--r--maintenance/populateImageSha1.php4
-rw-r--r--maintenance/populateLogSearch.php25
-rw-r--r--maintenance/populateLogUsertext.php4
-rw-r--r--maintenance/populateParentId.php7
-rw-r--r--maintenance/populateRevisionLength.php24
-rw-r--r--maintenance/populateRevisionSha1.php10
-rw-r--r--maintenance/postgres/archives/patch-external_user.sql6
-rw-r--r--maintenance/postgres/archives/patch-kill-iwl_pft.sql7
-rw-r--r--maintenance/postgres/archives/patch-profiling.sql3
-rw-r--r--maintenance/postgres/archives/patch-rename-iwl_prefix.sql2
-rw-r--r--maintenance/postgres/tables.sql20
-rw-r--r--maintenance/preprocessDump.php9
-rw-r--r--maintenance/preprocessorFuzzTest.php4
-rw-r--r--maintenance/protect.php6
-rw-r--r--maintenance/proxyCheck.php70
-rw-r--r--maintenance/pruneFileCache.php4
-rw-r--r--maintenance/purgeChangedFiles.php255
-rw-r--r--maintenance/purgeChangedPages.php191
-rw-r--r--maintenance/purgeDeletedFiles.php96
-rw-r--r--maintenance/purgeList.php16
-rw-r--r--maintenance/purgeOldText.inc18
-rw-r--r--maintenance/purgeOldText.php4
-rw-r--r--maintenance/purgeParserCache.php4
-rw-r--r--maintenance/reassignEdits.php6
-rw-r--r--maintenance/rebuildFileCache.php7
-rw-r--r--maintenance/rebuildImages.php4
-rw-r--r--maintenance/rebuildLocalisationCache.php22
-rw-r--r--maintenance/rebuildall.php8
-rw-r--r--maintenance/rebuildmessages.php7
-rw-r--r--maintenance/rebuildrecentchanges.php22
-rw-r--r--maintenance/rebuildtextindex.php9
-rw-r--r--maintenance/refreshFileHeaders.php4
-rw-r--r--maintenance/refreshImageMetadata.php14
-rw-r--r--maintenance/refreshLinks.php19
-rw-r--r--maintenance/removeUnusedAccounts.php9
-rw-r--r--maintenance/renameDbPrefix.php4
-rw-r--r--maintenance/renderDump.php18
-rw-r--r--maintenance/resetUserTokens.php70
-rw-r--r--maintenance/rollbackEdits.php4
-rw-r--r--maintenance/runBatchedQuery.php7
-rw-r--r--maintenance/runJobs.php54
-rw-r--r--maintenance/showCacheStats.php4
-rw-r--r--maintenance/showJobs.php26
-rw-r--r--maintenance/showSiteStats.php7
-rw-r--r--maintenance/sql.php46
-rw-r--r--maintenance/sqlite.inc11
-rw-r--r--maintenance/sqlite.php4
-rw-r--r--maintenance/sqlite/archives/initial-indexes.sql49
-rw-r--r--maintenance/sqlite/archives/patch-archive-ar_id.sql39
-rw-r--r--maintenance/sqlite/archives/patch-externallinks-el_id.sql19
-rw-r--r--maintenance/sqlite/archives/patch-kill-iwl_pft.sql7
-rw-r--r--maintenance/sqlite/archives/patch-rename-iwl_prefix.sql2
-rw-r--r--maintenance/storage/checkStorage.php18
-rw-r--r--maintenance/storage/compressOld.php35
-rw-r--r--maintenance/storage/dumpRev.php6
-rw-r--r--maintenance/storage/fixBug20757.php4
-rw-r--r--maintenance/storage/moveToExternal.php6
-rw-r--r--maintenance/storage/orphanStats.php4
-rw-r--r--maintenance/storage/recompressTracked.php4
-rw-r--r--maintenance/storage/resolveStubs.php2
-rw-r--r--maintenance/storage/storageTypeStats.php4
-rw-r--r--maintenance/storage/testCompression.php2
-rw-r--r--maintenance/storage/trackBlobs.php2
-rw-r--r--maintenance/syncFileBackend.php13
-rw-r--r--maintenance/tables.sql35
-rw-r--r--maintenance/tidyUpBug37714.php49
-rw-r--r--maintenance/undelete.php4
-rw-r--r--maintenance/update.php29
-rw-r--r--maintenance/updateArticleCount.php4
-rw-r--r--maintenance/updateCollation.php8
-rw-r--r--maintenance/updateDoubleWidthSearch.php4
-rw-r--r--maintenance/updateRestrictions.php4
-rw-r--r--maintenance/updateSearchIndex.php11
-rw-r--r--maintenance/updateSpecialPages.php77
-rw-r--r--maintenance/userDupes.inc67
-rw-r--r--maintenance/userOptions.inc28
-rw-r--r--maintenance/userOptions.php2
-rw-r--r--maintenance/waitForSlave.php4
-rw-r--r--mw-config/index.php6
-rw-r--r--opensearch_desc.php2
-rw-r--r--profileinfo.php9
-rw-r--r--redirect.php36
-rw-r--r--redirect.phtml3
-rw-r--r--resources/Resources.php220
-rw-r--r--resources/Resources.php.orig968
-rw-r--r--resources/jquery.chosen/LICENSE24
-rw-r--r--resources/jquery.chosen/chosen-sprite.pngbin0 -> 646 bytes
-rw-r--r--resources/jquery.chosen/chosen-sprite@2x.pngbin0 -> 871 bytes
-rw-r--r--resources/jquery.chosen/chosen.css440
-rw-r--r--resources/jquery.chosen/chosen.jquery.js1103
-rw-r--r--resources/jquery.tipsy/images/tipsy.pngbin175 -> 133 bytes
-rw-r--r--resources/jquery.ui/themes/default/images/ui-bg_flat_0_aaaaaa_40x100.pngbin180 -> 87 bytes
-rw-r--r--resources/jquery.ui/themes/default/images/ui-bg_flat_75_ffffff_40x100.pngbin178 -> 87 bytes
-rw-r--r--resources/jquery.ui/themes/default/images/ui-bg_glass_55_fbf9ee_1x400.pngbin120 -> 115 bytes
-rw-r--r--resources/jquery.ui/themes/default/images/ui-bg_glass_65_ffffff_1x400.pngbin105 -> 99 bytes
-rw-r--r--resources/jquery.ui/themes/default/images/ui-bg_glass_75_dadada_1x400.pngbin111 -> 111 bytes
-rw-r--r--resources/jquery.ui/themes/default/images/ui-bg_highlight-soft_75_cccccc_1x100.pngbin101 -> 86 bytes
-rw-r--r--resources/jquery.ui/themes/default/images/ui-icons_222222_256x240.pngbin4369 -> 3702 bytes
-rw-r--r--resources/jquery.ui/themes/default/images/ui-icons_2e83ff_256x240.pngbin4369 -> 3702 bytes
-rw-r--r--resources/jquery.ui/themes/default/images/ui-icons_454545_256x240.pngbin4369 -> 3702 bytes
-rw-r--r--resources/jquery.ui/themes/default/images/ui-icons_888888_256x240.pngbin4369 -> 3702 bytes
-rw-r--r--resources/jquery.ui/themes/default/images/ui-icons_cd0a0a_256x240.pngbin4369 -> 3702 bytes
-rw-r--r--resources/jquery.ui/themes/vector/images/button-blue-hover-large.pngbin260 -> 0 bytes
-rw-r--r--resources/jquery.ui/themes/vector/images/button-blue-hover.pngbin175 -> 0 bytes
-rw-r--r--resources/jquery.ui/themes/vector/images/button-blue-large.pngbin265 -> 0 bytes
-rw-r--r--resources/jquery.ui/themes/vector/images/button-blue.pngbin175 -> 0 bytes
-rw-r--r--resources/jquery.ui/themes/vector/images/button-disabled-blue.pngbin84 -> 0 bytes
-rw-r--r--resources/jquery.ui/themes/vector/images/button-disabled-green.pngbin149 -> 0 bytes
-rw-r--r--resources/jquery.ui/themes/vector/images/button-disabled-red.pngbin84 -> 0 bytes
-rw-r--r--resources/jquery.ui/themes/vector/images/button-disabled.pngbin84 -> 0 bytes
-rw-r--r--resources/jquery.ui/themes/vector/images/button-down-blue.pngbin130 -> 0 bytes
-rw-r--r--resources/jquery.ui/themes/vector/images/button-down-green.pngbin141 -> 0 bytes
-rw-r--r--resources/jquery.ui/themes/vector/images/button-down-red.pngbin130 -> 0 bytes
-rw-r--r--resources/jquery.ui/themes/vector/images/button-down.pngbin130 -> 0 bytes
-rw-r--r--resources/jquery.ui/themes/vector/images/button-green-hover-large.pngbin265 -> 0 bytes
-rw-r--r--resources/jquery.ui/themes/vector/images/button-green-hover.pngbin175 -> 0 bytes
-rw-r--r--resources/jquery.ui/themes/vector/images/button-green-large.pngbin265 -> 0 bytes
-rw-r--r--resources/jquery.ui/themes/vector/images/button-green.pngbin175 -> 0 bytes
-rw-r--r--resources/jquery.ui/themes/vector/images/button-large-disabled-green.pngbin277 -> 0 bytes
-rw-r--r--resources/jquery.ui/themes/vector/images/button-large-off-green.pngbin282 -> 0 bytes
-rw-r--r--resources/jquery.ui/themes/vector/images/button-off-blue.pngbin175 -> 0 bytes
-rw-r--r--resources/jquery.ui/themes/vector/images/button-off-green.pngbin149 -> 0 bytes
-rw-r--r--resources/jquery.ui/themes/vector/images/button-off-red.pngbin175 -> 0 bytes
-rw-r--r--resources/jquery.ui/themes/vector/images/button-off.pngbin152 -> 0 bytes
-rw-r--r--resources/jquery.ui/themes/vector/images/button-orange-hover-large.pngbin265 -> 0 bytes
-rw-r--r--resources/jquery.ui/themes/vector/images/button-orange-hover.pngbin175 -> 0 bytes
-rw-r--r--resources/jquery.ui/themes/vector/images/button-orange-large.pngbin265 -> 0 bytes
-rw-r--r--resources/jquery.ui/themes/vector/images/button-orange.pngbin175 -> 0 bytes
-rw-r--r--resources/jquery.ui/themes/vector/images/button-over-blue.pngbin175 -> 0 bytes
-rw-r--r--resources/jquery.ui/themes/vector/images/button-over-green.pngbin149 -> 0 bytes
-rw-r--r--resources/jquery.ui/themes/vector/images/button-over-red.pngbin174 -> 0 bytes
-rw-r--r--resources/jquery.ui/themes/vector/images/button-over.pngbin155 -> 0 bytes
-rw-r--r--resources/jquery.ui/themes/vector/images/button-red-hover-large.pngbin260 -> 0 bytes
-rw-r--r--resources/jquery.ui/themes/vector/images/button-red-hover.pngbin175 -> 0 bytes
-rw-r--r--resources/jquery.ui/themes/vector/images/button-red-large.pngbin265 -> 0 bytes
-rw-r--r--resources/jquery.ui/themes/vector/images/button-red.pngbin175 -> 0 bytes
-rw-r--r--resources/jquery.ui/themes/vector/images/titlebar-fade.pngbin188 -> 81 bytes
-rw-r--r--resources/jquery.ui/themes/vector/jquery.ui.button.css368
-rw-r--r--resources/jquery/images/jquery.arrowSteps.divider-ltr.pngbin135 -> 126 bytes
-rw-r--r--resources/jquery/images/jquery.arrowSteps.divider-rtl.pngbin139 -> 127 bytes
-rw-r--r--resources/jquery/images/jquery.arrowSteps.head-ltr.pngbin390 -> 303 bytes
-rw-r--r--resources/jquery/images/jquery.arrowSteps.head-rtl.pngbin365 -> 311 bytes
-rw-r--r--resources/jquery/images/jquery.arrowSteps.tail-ltr.pngbin223 -> 222 bytes
-rw-r--r--resources/jquery/images/marker.pngbin652 -> 472 bytes
-rw-r--r--resources/jquery/images/mask.pngbin2020 -> 1795 bytes
-rw-r--r--resources/jquery/jquery.badge.css9
-rw-r--r--resources/jquery/jquery.byteLength.js12
-rw-r--r--resources/jquery/jquery.byteLimit.js3
-rw-r--r--resources/jquery/jquery.checkboxShiftClick.js16
-rw-r--r--resources/jquery/jquery.client.js100
-rw-r--r--resources/jquery/jquery.makeCollapsible.js231
-rw-r--r--resources/jquery/jquery.placeholder.js9
-rw-r--r--resources/jquery/jquery.spinner.css2
-rw-r--r--resources/jquery/jquery.spinner.js47
-rw-r--r--resources/jquery/jquery.suggestions.js4
-rw-r--r--resources/jquery/jquery.tablesorter.js180
-rw-r--r--resources/jquery/jquery.textSelection.js4
-rw-r--r--resources/mediawiki.action/images/green-checkmark.pngbin0 -> 681 bytes
-rw-r--r--resources/mediawiki.action/mediawiki.action.edit.collapsibleFooter.css17
-rw-r--r--resources/mediawiki.action/mediawiki.action.edit.collapsibleFooter.js54
-rw-r--r--resources/mediawiki.action/mediawiki.action.edit.editWarning.js56
-rw-r--r--resources/mediawiki.action/mediawiki.action.edit.js167
-rw-r--r--resources/mediawiki.action/mediawiki.action.edit.preview.js53
-rw-r--r--resources/mediawiki.action/mediawiki.action.edit.styles.css (renamed from extensions/Vector/modules/ext.vector.footerCleanup.css)30
-rw-r--r--resources/mediawiki.action/mediawiki.action.history.js2
-rw-r--r--resources/mediawiki.action/mediawiki.action.view.postEdit.css77
-rw-r--r--resources/mediawiki.action/mediawiki.action.view.postEdit.js75
-rw-r--r--resources/mediawiki.action/mediawiki.action.view.rightClickEdit.js4
-rw-r--r--resources/mediawiki.api/mediawiki.api.category.js35
-rw-r--r--resources/mediawiki.api/mediawiki.api.edit.js65
-rw-r--r--resources/mediawiki.api/mediawiki.api.js88
-rw-r--r--resources/mediawiki.api/mediawiki.api.login.js54
-rw-r--r--resources/mediawiki.api/mediawiki.api.parse.js12
-rw-r--r--resources/mediawiki.api/mediawiki.api.watch.js12
-rw-r--r--resources/mediawiki.language/mediawiki.language.js23
-rw-r--r--resources/mediawiki.language/mediawiki.language.months.js54
-rw-r--r--resources/mediawiki.less/mediawiki.mixins.less46
-rw-r--r--resources/mediawiki.libs/mediawiki.libs.jpegmeta.js2
-rw-r--r--resources/mediawiki.page/mediawiki.page.gallery.js248
-rw-r--r--resources/mediawiki.page/mediawiki.page.image.pagination.js51
-rw-r--r--resources/mediawiki.page/mediawiki.page.patrol.ajax.js2
-rw-r--r--resources/mediawiki.page/mediawiki.page.ready.js38
-rw-r--r--resources/mediawiki.page/mediawiki.page.startup.js23
-rw-r--r--resources/mediawiki.page/mediawiki.page.watch.ajax.js6
-rw-r--r--resources/mediawiki.special/images/arrow-collapsed-ltr.pngbin206 -> 0 bytes
-rw-r--r--resources/mediawiki.special/images/arrow-collapsed-rtl.pngbin205 -> 0 bytes
-rw-r--r--resources/mediawiki.special/images/arrow-expanded.pngbin205 -> 0 bytes
-rw-r--r--resources/mediawiki.special/images/glyph-people-large.pngbin0 -> 1663 bytes
-rw-r--r--resources/mediawiki.special/images/icon-contributors.pngbin0 -> 1169 bytes
-rw-r--r--resources/mediawiki.special/images/icon-edits.pngbin0 -> 780 bytes
-rw-r--r--resources/mediawiki.special/images/icon-lock.pngbin0 -> 172 bytes
-rw-r--r--resources/mediawiki.special/images/icon-pages.pngbin0 -> 528 bytes
-rw-r--r--resources/mediawiki.special/mediawiki.special.block.js2
-rw-r--r--resources/mediawiki.special/mediawiki.special.changeemail.js2
-rw-r--r--resources/mediawiki.special/mediawiki.special.changeslist.css57
-rw-r--r--resources/mediawiki.special/mediawiki.special.changeslist.enhanced.css66
-rw-r--r--resources/mediawiki.special/mediawiki.special.createAccount.css89
-rw-r--r--resources/mediawiki.special/mediawiki.special.createAccount.js112
-rw-r--r--resources/mediawiki.special/mediawiki.special.movePage.js2
-rw-r--r--resources/mediawiki.special/mediawiki.special.pagesWithProp.css4
-rw-r--r--resources/mediawiki.special/mediawiki.special.preferences.js2
-rw-r--r--resources/mediawiki.special/mediawiki.special.recentchanges.js2
-rw-r--r--resources/mediawiki.special/mediawiki.special.search.js2
-rw-r--r--resources/mediawiki.special/mediawiki.special.undelete.js2
-rw-r--r--resources/mediawiki.special/mediawiki.special.upload.js4
-rw-r--r--resources/mediawiki.special/mediawiki.special.userLogin.css39
-rw-r--r--resources/mediawiki.special/mediawiki.special.userLogin.signup.js10
-rw-r--r--resources/mediawiki.special/mediawiki.special.vforms.css46
-rw-r--r--resources/mediawiki.ui/mediawiki.ui.default.css272
-rw-r--r--resources/mediawiki.ui/mediawiki.ui.vector.css414
-rw-r--r--resources/mediawiki.ui/sourcefiles/Makefile24
-rw-r--r--resources/mediawiki.ui/sourcefiles/config.rb27
-rw-r--r--resources/mediawiki.ui/sourcefiles/scss/components/_default.scss3
-rw-r--r--resources/mediawiki.ui/sourcefiles/scss/components/_utilities.scss17
-rw-r--r--resources/mediawiki.ui/sourcefiles/scss/components/_vector.scss4
-rw-r--r--resources/mediawiki.ui/sourcefiles/scss/components/default/_buttons.scss69
-rw-r--r--resources/mediawiki.ui/sourcefiles/scss/components/default/_forms.scss114
-rw-r--r--resources/mediawiki.ui/sourcefiles/scss/components/vector/_buttons.scss19
-rw-r--r--resources/mediawiki.ui/sourcefiles/scss/components/vector/_containers.scss5
-rw-r--r--resources/mediawiki.ui/sourcefiles/scss/components/vector/_forms.scss7
-rw-r--r--resources/mediawiki.ui/sourcefiles/scss/mediawiki.ui.default.scss16
-rw-r--r--resources/mediawiki.ui/sourcefiles/scss/mediawiki.ui.vector.scss15
-rw-r--r--resources/mediawiki.ui/sourcefiles/scss/mixins/_all.scss4
-rw-r--r--resources/mediawiki.ui/sourcefiles/scss/mixins/_effects.scss62
-rw-r--r--resources/mediawiki.ui/sourcefiles/scss/mixins/_forms.scss66
-rw-r--r--resources/mediawiki.ui/sourcefiles/scss/mixins/_type.scss6
-rw-r--r--resources/mediawiki.ui/sourcefiles/scss/mixins/_utilities.scss19
-rw-r--r--resources/mediawiki.ui/sourcefiles/scss/settings/_all.scss2
-rw-r--r--resources/mediawiki.ui/sourcefiles/scss/settings/_colors.scss17
-rw-r--r--resources/mediawiki.ui/sourcefiles/scss/settings/_typography.scss5
-rw-r--r--resources/mediawiki/images/arrow-collapsed-ltr.pngbin0 -> 133 bytes
-rw-r--r--resources/mediawiki/images/arrow-collapsed-rtl.pngbin0 -> 136 bytes
-rw-r--r--resources/mediawiki/images/arrow-expanded.pngbin0 -> 134 bytes
-rw-r--r--resources/mediawiki/mediawiki.Title.js574
-rw-r--r--resources/mediawiki/mediawiki.Uri.js4
-rw-r--r--resources/mediawiki/mediawiki.debug.js2
-rw-r--r--resources/mediawiki/mediawiki.htmlform.js70
-rw-r--r--resources/mediawiki/mediawiki.icon.css15
-rw-r--r--resources/mediawiki/mediawiki.inspect.js204
-rw-r--r--resources/mediawiki/mediawiki.jqueryMsg.js335
-rw-r--r--resources/mediawiki/mediawiki.js496
-rw-r--r--resources/mediawiki/mediawiki.log.js65
-rw-r--r--resources/mediawiki/mediawiki.notification.css16
-rw-r--r--resources/mediawiki/mediawiki.notification.js25
-rw-r--r--resources/mediawiki/mediawiki.notify.js13
-rw-r--r--resources/mediawiki/mediawiki.searchSuggest.js48
-rw-r--r--resources/mediawiki/mediawiki.user.js253
-rw-r--r--resources/mediawiki/mediawiki.util.js204
-rw-r--r--resources/startup.js42
-rw-r--r--serialized/serialize.php4
-rw-r--r--skins/ArchLinux.php120
-rw-r--r--skins/Chick.php47
-rw-r--r--skins/CologneBlue.php47
-rw-r--r--skins/Modern.php55
-rw-r--r--skins/MonoBook.php120
-rw-r--r--skins/Nostalgia.php147
-rw-r--r--skins/Simple.php58
-rw-r--r--skins/Standard.php294
-rw-r--r--skins/Vector.php194
-rw-r--r--skins/archlinux/IE60Fixes.css9
-rw-r--r--skins/archlinux/Opera6Fixes.css20
-rw-r--r--skins/archlinux/Opera7Fixes.css21
-rw-r--r--skins/archlinux/Opera9Fixes.css11
-rw-r--r--skins/archlinux/external-ltr.pngbin143 -> 141 bytes
-rw-r--r--skins/archlinux/external-rtl.pngbin141 -> 141 bytes
-rw-r--r--skins/archlinux/main.css26
-rw-r--r--skins/archlinux/wiki-indexed.pngbin8008 -> 8007 bytes
-rw-r--r--skins/chick/IE60Fixes.css79
-rw-r--r--skins/chick/main.css368
-rw-r--r--skins/cologneblue/print.css6
-rw-r--r--skins/cologneblue/screen.css19
-rw-r--r--skins/common/IEFixes.js82
-rw-r--r--skins/common/ajax.js121
-rw-r--r--skins/common/commonContent.css49
-rw-r--r--skins/common/commonElements.css26
-rw-r--r--skins/common/commonPrint.css7
-rw-r--r--skins/common/config.css8
-rw-r--r--skins/common/config.js14
-rw-r--r--skins/common/images/Arr_u.pngbin207 -> 207 bytes
-rw-r--r--skins/common/images/ar/button_headline.pngbin487 -> 484 bytes
-rw-r--r--skins/common/images/ar/button_nowiki.pngbin875 -> 874 bytes
-rw-r--r--skins/common/images/arrow_disabled_left_25.pngbin301 -> 301 bytes
-rw-r--r--skins/common/images/arrow_disabled_right_25.pngbin307 -> 307 bytes
-rw-r--r--skins/common/images/arrow_right_25.pngbin341 -> 337 bytes
-rw-r--r--skins/common/images/button_hr.pngbin222 -> 200 bytes
-rw-r--r--skins/common/images/button_nowiki.pngbin322 -> 322 bytes
-rw-r--r--skins/common/images/button_sig.pngbin926 -> 920 bytes
-rw-r--r--skins/common/images/button_template.pngbin188 -> 178 bytes
-rw-r--r--skins/common/images/critical-32.pngbin1763 -> 1758 bytes
-rw-r--r--skins/common/images/fa/button_nowiki.pngbin875 -> 874 bytes
-rw-r--r--skins/common/images/feed-icon.pngbin557 -> 542 bytes
-rw-r--r--skins/common/images/icons/fileicon-psd.pngbin10376 -> 7756 bytes
-rw-r--r--skins/common/images/magnify-clip-rtl.pngbin208 -> 149 bytes
-rw-r--r--skins/common/images/question-small.pngbin0 -> 316 bytes
-rw-r--r--skins/common/images/question.svg12
-rw-r--r--skins/common/images/tick-32.pngbin1137 -> 1103 bytes
-rw-r--r--skins/common/images/warning-32.pngbin1301 -> 1299 bytes
-rw-r--r--skins/common/oldshared.css42
-rw-r--r--skins/common/protect.js236
-rw-r--r--skins/common/shared.css196
-rw-r--r--skins/common/upload.js322
-rw-r--r--skins/common/wikibits.js745
-rw-r--r--skins/common/wikiprintable.css59
-rw-r--r--skins/modern/external.pngbin143 -> 141 bytes
-rw-r--r--skins/modern/main.css43
-rw-r--r--skins/modern/print.css2
-rw-r--r--skins/monobook/IE60Fixes.css9
-rw-r--r--skins/monobook/Opera6Fixes.css20
-rw-r--r--skins/monobook/Opera7Fixes.css21
-rw-r--r--skins/monobook/Opera9Fixes.css11
-rw-r--r--skins/monobook/external-ltr.pngbin143 -> 141 bytes
-rw-r--r--skins/monobook/external-rtl.pngbin141 -> 141 bytes
-rw-r--r--skins/monobook/main.css26
-rw-r--r--skins/monobook/wiki-indexed.pngbin8008 -> 8007 bytes
-rw-r--r--skins/myskin/main.css1
-rw-r--r--skins/nostalgia/screen.css56
-rw-r--r--skins/simple/discussionitem_icon.gifbin549 -> 0 bytes
-rw-r--r--skins/simple/external.pngbin143 -> 0 bytes
-rw-r--r--skins/simple/file_icon.gifbin323 -> 0 bytes
-rw-r--r--skins/simple/link_icon.gifbin342 -> 0 bytes
-rw-r--r--skins/simple/lock_icon.gifbin321 -> 0 bytes
-rw-r--r--skins/simple/mail_icon.gifbin321 -> 0 bytes
-rw-r--r--skins/simple/main.css427
-rw-r--r--skins/standard/main.css188
-rw-r--r--skins/vector/beta/screen.less75
-rw-r--r--skins/vector/beta/variables.less37
-rw-r--r--skins/vector/collapsibleNav.js121
-rw-r--r--skins/vector/collapsibleNav.less91
-rw-r--r--skins/vector/collapsibleTabs.js (renamed from extensions/Vector/modules/jquery.collapsibleTabs.js)42
-rw-r--r--skins/vector/externalLinks.less75
-rw-r--r--skins/vector/images/arrow-collapsed-ltr.png (renamed from extensions/Vector/modules/images/closed-ltr.png)bin143 -> 143 bytes
-rw-r--r--skins/vector/images/arrow-collapsed-ltr.svg37
-rw-r--r--skins/vector/images/arrow-collapsed-rtl.png (renamed from extensions/Vector/modules/images/closed-rtl.png)bin145 -> 145 bytes
-rw-r--r--skins/vector/images/arrow-collapsed-rtl.svg37
-rw-r--r--skins/vector/images/arrow-down-focus-icon.svg37
-rw-r--r--skins/vector/images/arrow-down-icon.svg37
-rw-r--r--skins/vector/images/arrow-expanded.png (renamed from extensions/Vector/modules/images/open.png)bin145 -> 145 bytes
-rw-r--r--skins/vector/images/arrow-expanded.svg37
-rw-r--r--skins/vector/images/edit-icon.pngbin277 -> 276 bytes
-rw-r--r--skins/vector/images/external-link-ltr-icon.pngbin143 -> 141 bytes
-rw-r--r--skins/vector/images/external-link-rtl-icon.pngbin141 -> 141 bytes
-rw-r--r--skins/vector/images/mail-icon.pngbin197 -> 197 bytes
-rw-r--r--skins/vector/images/news-icon.pngbin180 -> 180 bytes
-rw-r--r--skins/vector/images/page-fade.pngbin115 -> 115 bytes
-rw-r--r--skins/vector/images/portal-break-ltr.pngbin169 -> 168 bytes
-rw-r--r--skins/vector/images/preferences-break.pngbin205 -> 103 bytes
-rw-r--r--skins/vector/images/tab-break.pngbin125 -> 125 bytes
-rw-r--r--skins/vector/images/talk-icon.pngbin173 -> 173 bytes
-rw-r--r--skins/vector/images/user-icon.svg424
-rw-r--r--skins/vector/images/video-icon.pngbin162 -> 162 bytes
-rw-r--r--skins/vector/screen-hd.less (renamed from skins/vector/screen-hd.css)4
-rw-r--r--skins/vector/screen.less (renamed from skins/vector/screen.css)376
-rw-r--r--skins/vector/styles-beta.less13
-rw-r--r--skins/vector/styles.less11
-rw-r--r--skins/vector/variables.less37
-rw-r--r--skins/vector/vector.js52
-rw-r--r--tests/RunSeleniumTests.php258
-rw-r--r--tests/TestsAutoLoader.php30
-rw-r--r--tests/parser/ParserTestResult.php42
-rw-r--r--tests/parser/parserTest.inc274
-rw-r--r--tests/parser/parserTests.txt6469
-rw-r--r--tests/parser/preprocess/All_system_messages.expected21
-rw-r--r--tests/parser/preprocess/All_system_messages.txt21
-rw-r--r--tests/parserTests.php8
-rw-r--r--tests/phpunit/MediaWikiLangTestCase.php4
-rw-r--r--tests/phpunit/MediaWikiPHPUnitCommand.php22
-rw-r--r--tests/phpunit/MediaWikiPHPUnitTestListener.php114
-rw-r--r--tests/phpunit/MediaWikiTestCase.php32
-rw-r--r--tests/phpunit/bootstrap.php19
-rw-r--r--tests/phpunit/data/db/sqlite/tables-1.16.sql5
-rw-r--r--tests/phpunit/data/db/sqlite/tables-1.17.sql5
-rw-r--r--tests/phpunit/data/db/sqlite/tables-1.18.sql5
-rw-r--r--tests/phpunit/data/less/common/test.common.mixins.less5
-rw-r--r--tests/phpunit/data/less/module/dependency.less3
-rw-r--r--tests/phpunit/data/less/module/styles.css6
-rw-r--r--tests/phpunit/data/less/module/styles.less6
-rw-r--r--tests/phpunit/data/xmp/7.result.php18
-rw-r--r--tests/phpunit/includes/ArticleTablesTest.php7
-rw-r--r--tests/phpunit/includes/ArticleTest.php12
-rw-r--r--tests/phpunit/includes/BlockTest.php143
-rw-r--r--tests/phpunit/includes/CdbTest.php2
-rw-r--r--tests/phpunit/includes/CollationTest.php8
-rw-r--r--tests/phpunit/includes/DiffHistoryBlobTest.php9
-rw-r--r--tests/phpunit/includes/EditPageTest.php93
-rw-r--r--tests/phpunit/includes/ExternalStoreTest.php2
-rw-r--r--tests/phpunit/includes/ExtraParserTest.php27
-rw-r--r--tests/phpunit/includes/FallbackTest.php73
-rw-r--r--tests/phpunit/includes/FauxRequestTest.php15
-rw-r--r--tests/phpunit/includes/FauxResponseTest.php9
-rw-r--r--tests/phpunit/includes/FormOptionsInitializationTest.php1
-rw-r--r--tests/phpunit/includes/GlobalFunctions/GlobalTest.php201
-rw-r--r--tests/phpunit/includes/GlobalFunctions/GlobalWithDBTest.php6
-rw-r--r--tests/phpunit/includes/GlobalFunctions/wfAssembleUrlTest.php7
-rw-r--r--tests/phpunit/includes/GlobalFunctions/wfBCP47Test.php20
-rw-r--r--tests/phpunit/includes/GlobalFunctions/wfBaseConvertTest.php3
-rw-r--r--tests/phpunit/includes/GlobalFunctions/wfBaseNameTest.php6
-rw-r--r--tests/phpunit/includes/GlobalFunctions/wfExpandUrlTest.php20
-rw-r--r--tests/phpunit/includes/GlobalFunctions/wfGetCallerTest.php15
-rw-r--r--tests/phpunit/includes/GlobalFunctions/wfParseUrlTest.php9
-rw-r--r--tests/phpunit/includes/GlobalFunctions/wfRemoveDotSegmentsTest.php6
-rw-r--r--tests/phpunit/includes/GlobalFunctions/wfShorthandToIntegerTest.php8
-rw-r--r--tests/phpunit/includes/GlobalFunctions/wfTimestampTest.php19
-rw-r--r--tests/phpunit/includes/GlobalFunctions/wfUrlencodeTest.php11
-rw-r--r--tests/phpunit/includes/HTMLCheckMatrixTest.php102
-rw-r--r--tests/phpunit/includes/HashRingTest.php53
-rw-r--r--tests/phpunit/includes/HooksTest.php171
-rw-r--r--tests/phpunit/includes/HtmlFormatterTest.php81
-rw-r--r--tests/phpunit/includes/HtmlTest.php65
-rw-r--r--tests/phpunit/includes/HttpTest.php11
-rw-r--r--tests/phpunit/includes/IPTest.php78
-rw-r--r--tests/phpunit/includes/JsonTest.php27
-rw-r--r--tests/phpunit/includes/LanguageConverterTest.php35
-rw-r--r--tests/phpunit/includes/LicensesTest.php2
-rw-r--r--tests/phpunit/includes/LinkerTest.php4
-rw-r--r--tests/phpunit/includes/LinksUpdateTest.php23
-rw-r--r--tests/phpunit/includes/LocalFileTest.php22
-rw-r--r--tests/phpunit/includes/MWExceptionHandlerTest.php73
-rw-r--r--tests/phpunit/includes/MWFunctionTest.php47
-rw-r--r--tests/phpunit/includes/MWNamespaceTest.php21
-rw-r--r--tests/phpunit/includes/MessageTest.php78
-rw-r--r--tests/phpunit/includes/OutputPageTest.php73
-rw-r--r--tests/phpunit/includes/PathRouterTest.php36
-rw-r--r--tests/phpunit/includes/PreferencesTest.php23
-rw-r--r--tests/phpunit/includes/Providers.php44
-rw-r--r--tests/phpunit/includes/RecentChangeTest.php34
-rw-r--r--tests/phpunit/includes/RequestContextTest.php8
-rw-r--r--tests/phpunit/includes/ResourceLoaderTest.php62
-rw-r--r--tests/phpunit/includes/RevisionStorageTest.php16
-rw-r--r--tests/phpunit/includes/RevisionStorageTest_ContentHandlerUseDB.php20
-rw-r--r--tests/phpunit/includes/RevisionTest.php78
-rw-r--r--tests/phpunit/includes/SampleTest.php4
-rw-r--r--tests/phpunit/includes/SanitizerTest.php114
-rw-r--r--tests/phpunit/includes/SanitizerValidateEmailTest.php35
-rw-r--r--tests/phpunit/includes/SeleniumConfigurationTest.php222
-rw-r--r--tests/phpunit/includes/SiteConfigurationTest.php39
-rw-r--r--tests/phpunit/includes/StringUtilsTest.php166
-rw-r--r--tests/phpunit/includes/TemplateCategoriesTest.php24
-rw-r--r--tests/phpunit/includes/TestUser.php7
-rw-r--r--tests/phpunit/includes/TimeAdjustTest.php40
-rw-r--r--tests/phpunit/includes/TimestampTest.php264
-rw-r--r--tests/phpunit/includes/TitleMethodsTest.php20
-rw-r--r--tests/phpunit/includes/TitlePermissionTest.php142
-rw-r--r--tests/phpunit/includes/TitleTest.php194
-rw-r--r--tests/phpunit/includes/UIDGeneratorTest.php22
-rw-r--r--tests/phpunit/includes/UserMailerTest.php14
-rw-r--r--tests/phpunit/includes/UserTest.php20
-rw-r--r--tests/phpunit/includes/WebRequestTest.php114
-rw-r--r--tests/phpunit/includes/WikiPageTest.php68
-rw-r--r--tests/phpunit/includes/WikiPageTest_ContentHandlerUseDB.php25
-rw-r--r--tests/phpunit/includes/XmlJsTest.php25
-rw-r--r--tests/phpunit/includes/XmlSelectTest.php39
-rw-r--r--tests/phpunit/includes/XmlTest.php132
-rw-r--r--tests/phpunit/includes/XmlTypeCheckTest.php30
-rw-r--r--tests/phpunit/includes/ZipDirectoryReaderTest.php27
-rw-r--r--tests/phpunit/includes/api/ApiAccountCreationTest.php56
-rw-r--r--tests/phpunit/includes/api/ApiBlockTest.php21
-rw-r--r--tests/phpunit/includes/api/ApiEditPageTest.php107
-rw-r--r--tests/phpunit/includes/api/ApiOptionsTest.php38
-rw-r--r--tests/phpunit/includes/api/ApiParseTest.php5
-rw-r--r--tests/phpunit/includes/api/ApiPurgeTest.php3
-rw-r--r--tests/phpunit/includes/api/ApiTest.php47
-rw-r--r--tests/phpunit/includes/api/ApiTestCase.php40
-rw-r--r--tests/phpunit/includes/api/ApiTestCaseUpload.php4
-rw-r--r--tests/phpunit/includes/api/ApiUploadTest.php42
-rw-r--r--tests/phpunit/includes/api/ApiWatchTest.php55
-rw-r--r--tests/phpunit/includes/api/RandomImageGenerator.php13
-rw-r--r--tests/phpunit/includes/api/format/ApiFormatPhpTest.php4
-rw-r--r--tests/phpunit/includes/api/generateRandomImages.php6
-rw-r--r--tests/phpunit/includes/api/query/ApiQueryBasicTest.php77
-rw-r--r--tests/phpunit/includes/api/query/ApiQueryContinue2Test.php14
-rw-r--r--tests/phpunit/includes/api/query/ApiQueryContinueTest.php198
-rw-r--r--tests/phpunit/includes/api/query/ApiQueryContinueTestBase.php62
-rw-r--r--tests/phpunit/includes/api/query/ApiQueryRevisionsTest.php2
-rw-r--r--tests/phpunit/includes/api/query/ApiQueryTest.php7
-rw-r--r--tests/phpunit/includes/api/query/ApiQueryTestBase.php15
-rw-r--r--tests/phpunit/includes/cache/GenderCacheTest.php9
-rw-r--r--tests/phpunit/includes/cache/MessageCacheTest.php128
-rw-r--r--tests/phpunit/includes/cache/ProcessCacheLRUTest.php24
-rw-r--r--tests/phpunit/includes/content/ContentHandlerTest.php99
-rw-r--r--tests/phpunit/includes/content/CssContentTest.php8
-rw-r--r--tests/phpunit/includes/content/JavaScriptContentTest.php20
-rw-r--r--tests/phpunit/includes/content/TextContentTest.php43
-rw-r--r--tests/phpunit/includes/content/WikitextContentHandlerTest.php44
-rw-r--r--tests/phpunit/includes/content/WikitextContentTest.php24
-rw-r--r--tests/phpunit/includes/db/DatabaseMysqlBaseTest.php209
-rw-r--r--tests/phpunit/includes/db/DatabaseSQLTest.php633
-rw-r--r--tests/phpunit/includes/db/DatabaseSqliteTest.php46
-rw-r--r--tests/phpunit/includes/db/DatabaseTest.php62
-rw-r--r--tests/phpunit/includes/db/DatabaseTestHelper.php166
-rw-r--r--tests/phpunit/includes/db/ORMRowTest.php1
-rw-r--r--tests/phpunit/includes/db/ORMTableTest.php2
-rw-r--r--tests/phpunit/includes/db/TestORMRowTest.php52
-rw-r--r--tests/phpunit/includes/debug/MWDebugTest.php8
-rw-r--r--tests/phpunit/includes/filebackend/FileBackendTest.php251
-rw-r--r--tests/phpunit/includes/filerepo/FileRepoTest.php25
-rw-r--r--tests/phpunit/includes/filerepo/StoreBatchTest.php13
-rw-r--r--tests/phpunit/includes/installer/InstallDocFormatterTest.php7
-rw-r--r--tests/phpunit/includes/installer/OracleInstallerTest.php48
-rw-r--r--tests/phpunit/includes/jobqueue/JobQueueTest.php129
-rw-r--r--tests/phpunit/includes/json/FormatJsonTest.php161
-rw-r--r--tests/phpunit/includes/json/ServicesJsonTest.php93
-rw-r--r--tests/phpunit/includes/libs/CSSJanusTest.php72
-rw-r--r--tests/phpunit/includes/libs/CSSMinTest.php12
-rw-r--r--tests/phpunit/includes/libs/GenericArrayObjectTest.php3
-rw-r--r--tests/phpunit/includes/libs/IEUrlExtensionTest.php30
-rw-r--r--tests/phpunit/includes/libs/JavaScriptMinifierTest.php8
-rw-r--r--tests/phpunit/includes/media/BitmapMetadataHandlerTest.php29
-rw-r--r--tests/phpunit/includes/media/BitmapScalingTest.php47
-rw-r--r--tests/phpunit/includes/media/ExifBitmapTest.php53
-rw-r--r--tests/phpunit/includes/media/ExifRotationTest.php49
-rw-r--r--tests/phpunit/includes/media/ExifTest.php12
-rw-r--r--tests/phpunit/includes/media/FakeDimensionFile.php28
-rw-r--r--tests/phpunit/includes/media/FormatMetadataTest.php11
-rw-r--r--tests/phpunit/includes/media/GIFMetadataExtractorTest.php1
-rw-r--r--tests/phpunit/includes/media/GIFTest.php16
-rw-r--r--tests/phpunit/includes/media/IPTCTest.php31
-rw-r--r--tests/phpunit/includes/media/JpegMetadataExtractorTest.php5
-rw-r--r--tests/phpunit/includes/media/JpegTest.php10
-rw-r--r--tests/phpunit/includes/media/MediaHandlerTest.php7
-rw-r--r--tests/phpunit/includes/media/PNGMetadataExtractorTest.php32
-rw-r--r--tests/phpunit/includes/media/PNGTest.php16
-rw-r--r--tests/phpunit/includes/media/SVGMetadataExtractorTest.php9
-rw-r--r--tests/phpunit/includes/media/TiffTest.php20
-rw-r--r--tests/phpunit/includes/media/XMPTest.php17
-rw-r--r--tests/phpunit/includes/media/XMPValidateTest.php5
-rw-r--r--tests/phpunit/includes/normal/CleanUpTest.php32
-rw-r--r--tests/phpunit/includes/objectcache/BagOStuffTest.php13
-rw-r--r--tests/phpunit/includes/parser/MagicVariableTest.php107
-rw-r--r--tests/phpunit/includes/parser/MediaWikiParserTest.php108
-rw-r--r--tests/phpunit/includes/parser/NewParserTest.php347
-rw-r--r--tests/phpunit/includes/parser/ParserMethodsTest.php48
-rw-r--r--tests/phpunit/includes/parser/ParserOutputTest.php12
-rw-r--r--tests/phpunit/includes/parser/ParserPreloadTest.php18
-rw-r--r--tests/phpunit/includes/parser/PreprocessorTest.php38
-rw-r--r--tests/phpunit/includes/parser/TagHooksTest.php8
-rw-r--r--tests/phpunit/includes/parser/TidyTest.php44
-rw-r--r--tests/phpunit/includes/search/SearchEngineTest.php14
-rw-r--r--tests/phpunit/includes/search/SearchUpdateTest.php15
-rw-r--r--tests/phpunit/includes/site/MediaWikiSiteTest.php5
-rw-r--r--tests/phpunit/includes/site/SiteListTest.php9
-rw-r--r--tests/phpunit/includes/site/SiteSQLStoreTest.php13
-rw-r--r--tests/phpunit/includes/site/SiteTest.php33
-rw-r--r--tests/phpunit/includes/site/TestSites.php1
-rw-r--r--tests/phpunit/includes/specials/QueryAllSpecialPagesTest.php2
-rw-r--r--tests/phpunit/includes/specials/SpecialPreferencesTest.php60
-rw-r--r--tests/phpunit/includes/specials/SpecialRecentchangesTest.php2
-rw-r--r--tests/phpunit/includes/specials/SpecialSearchTest.php9
-rw-r--r--tests/phpunit/includes/upload/UploadBaseTest.php (renamed from tests/phpunit/includes/upload/UploadTest.php)15
-rw-r--r--tests/phpunit/includes/upload/UploadFromUrlTest.php18
-rw-r--r--tests/phpunit/includes/upload/UploadStashTest.php3
-rw-r--r--tests/phpunit/install-phpunit.sh2
-rw-r--r--tests/phpunit/languages/LanguageAmTest.php18
-rw-r--r--tests/phpunit/languages/LanguageArTest.php29
-rw-r--r--tests/phpunit/languages/LanguageBeTest.php18
-rw-r--r--tests/phpunit/languages/LanguageBe_taraskTest.php59
-rw-r--r--tests/phpunit/languages/LanguageBhoTest.php19
-rw-r--r--tests/phpunit/languages/LanguageBsTest.php19
-rw-r--r--tests/phpunit/languages/LanguageClassesTestCase.php58
-rw-r--r--tests/phpunit/languages/LanguageCsTest.php19
-rw-r--r--tests/phpunit/languages/LanguageCuTest.php31
-rw-r--r--tests/phpunit/languages/LanguageCyTest.php19
-rw-r--r--tests/phpunit/languages/LanguageDsbTest.php19
-rw-r--r--tests/phpunit/languages/LanguageFrTest.php19
-rw-r--r--tests/phpunit/languages/LanguageGaTest.php19
-rw-r--r--tests/phpunit/languages/LanguageGdTest.php39
-rw-r--r--tests/phpunit/languages/LanguageGvTest.php21
-rw-r--r--tests/phpunit/languages/LanguageHeTest.php119
-rw-r--r--tests/phpunit/languages/LanguageHiTest.php19
-rw-r--r--tests/phpunit/languages/LanguageHrTest.php19
-rw-r--r--tests/phpunit/languages/LanguageHsbTest.php19
-rw-r--r--tests/phpunit/languages/LanguageHuTest.php19
-rw-r--r--tests/phpunit/languages/LanguageHyTest.php20
-rw-r--r--tests/phpunit/languages/LanguageKshTest.php19
-rw-r--r--tests/phpunit/languages/LanguageLnTest.php19
-rw-r--r--tests/phpunit/languages/LanguageLtTest.php38
-rw-r--r--tests/phpunit/languages/LanguageLvTest.php19
-rw-r--r--tests/phpunit/languages/LanguageMgTest.php19
-rw-r--r--tests/phpunit/languages/LanguageMkTest.php21
-rw-r--r--tests/phpunit/languages/LanguageMlTest.php11
-rw-r--r--tests/phpunit/languages/LanguageMoTest.php18
-rw-r--r--tests/phpunit/languages/LanguageMtTest.php59
-rw-r--r--tests/phpunit/languages/LanguageNlTest.php6
-rw-r--r--tests/phpunit/languages/LanguageNsoTest.php22
-rw-r--r--tests/phpunit/languages/LanguagePlTest.php59
-rw-r--r--tests/phpunit/languages/LanguageRoTest.php18
-rw-r--r--tests/phpunit/languages/LanguageRuTest.php44
-rw-r--r--tests/phpunit/languages/LanguageSeTest.php27
-rw-r--r--tests/phpunit/languages/LanguageSgsTest.php27
-rw-r--r--tests/phpunit/languages/LanguageShTest.php30
-rw-r--r--tests/phpunit/languages/LanguageSkTest.php18
-rw-r--r--tests/phpunit/languages/LanguageSlTest.php22
-rw-r--r--tests/phpunit/languages/LanguageSmaTest.php27
-rw-r--r--tests/phpunit/languages/LanguageSrTest.php84
-rw-r--r--tests/phpunit/languages/LanguageTest.php311
-rw-r--r--tests/phpunit/languages/LanguageTiTest.php22
-rw-r--r--tests/phpunit/languages/LanguageTlTest.php22
-rw-r--r--tests/phpunit/languages/LanguageTrTest.php5
-rw-r--r--tests/phpunit/languages/LanguageUkTest.php35
-rw-r--r--tests/phpunit/languages/LanguageUzTest.php28
-rw-r--r--tests/phpunit/languages/LanguageWaTest.php22
-rw-r--r--tests/phpunit/languages/utils/CLDRPluralRuleEvaluatorTest.php2
-rw-r--r--tests/phpunit/maintenance/DumpTestCase.php26
-rw-r--r--tests/phpunit/maintenance/MaintenanceTest.php6
-rw-r--r--tests/phpunit/maintenance/backupPrefetchTest.php3
-rw-r--r--tests/phpunit/maintenance/backupTextPassTest.php7
-rw-r--r--tests/phpunit/maintenance/backup_LogTest.php4
-rw-r--r--tests/phpunit/maintenance/backup_PageTest.php6
-rw-r--r--tests/phpunit/maintenance/fetchTextTest.php2
-rw-r--r--tests/phpunit/maintenance/getSlaveServerTest.php2
-rw-r--r--tests/phpunit/mocks/filebackend/MockFSFile.php69
-rw-r--r--tests/phpunit/mocks/filebackend/MockFileBackend.php122
-rw-r--r--tests/phpunit/mocks/media/MockBitmapHandler.php92
-rw-r--r--tests/phpunit/phpunit.php24
-rw-r--r--tests/phpunit/skins/SideBarTest.php75
-rw-r--r--tests/phpunit/structure/AutoLoaderTest.php (renamed from tests/phpunit/AutoLoaderTest.php)7
-rw-r--r--tests/phpunit/structure/ResourcesTest.php (renamed from tests/phpunit/resources/ResourcesTest.php)17
-rw-r--r--tests/phpunit/structure/StructureTest.php (renamed from tests/phpunit/StructureTest.php)4
-rw-r--r--tests/phpunit/suite.xml27
-rw-r--r--tests/phpunit/suites/ExtensionsParserTestSuite.php8
-rw-r--r--tests/phpunit/suites/UploadFromUrlTestSuite.php13
-rw-r--r--tests/qunit/QUnitTestResources.php4
-rw-r--r--tests/qunit/data/generateJqueryMsgData.php4
-rw-r--r--tests/qunit/data/load.mock.php3
-rw-r--r--tests/qunit/data/testrunner.js29
-rw-r--r--tests/qunit/suites/resources/jquery/jquery.byteLength.test.js24
-rw-r--r--tests/qunit/suites/resources/jquery/jquery.byteLimit.test.js120
-rw-r--r--tests/qunit/suites/resources/jquery/jquery.client.test.js283
-rw-r--r--tests/qunit/suites/resources/jquery/jquery.localize.test.js10
-rw-r--r--tests/qunit/suites/resources/jquery/jquery.makeCollapsible.test.js287
-rw-r--r--tests/qunit/suites/resources/jquery/jquery.tablesorter.test.js166
-rw-r--r--tests/qunit/suites/resources/jquery/jquery.textSelection.test.js7
-rw-r--r--tests/qunit/suites/resources/mediawiki.special/mediawiki.special.recentchanges.test.js2
-rw-r--r--tests/qunit/suites/resources/mediawiki/mediawiki.Title.test.js268
-rw-r--r--tests/qunit/suites/resources/mediawiki/mediawiki.jqueryMsg.test.js337
-rw-r--r--tests/qunit/suites/resources/mediawiki/mediawiki.test.js171
-rw-r--r--tests/qunit/suites/resources/mediawiki/mediawiki.user.test.js6
-rw-r--r--tests/qunit/suites/resources/mediawiki/mediawiki.util.test.js91
-rw-r--r--tests/qunit/suites/resources/startup.test.js129
-rw-r--r--tests/selenium/Selenium.php191
-rw-r--r--tests/selenium/SeleniumConfig.php80
-rw-r--r--tests/selenium/SeleniumLoader.php9
-rw-r--r--tests/selenium/SeleniumServerManager.php252
-rw-r--r--tests/selenium/SeleniumTestCase.php127
-rw-r--r--tests/selenium/SeleniumTestConsoleLogger.php25
-rw-r--r--tests/selenium/SeleniumTestConstants.php24
-rw-r--r--tests/selenium/SeleniumTestHTMLLogger.php36
-rw-r--r--tests/selenium/SeleniumTestListener.php65
-rw-r--r--tests/selenium/SeleniumTestSuite.php57
-rw-r--r--tests/selenium/data/SimpleSeleniumTestDB.sql1453
-rw-r--r--tests/selenium/data/SimpleSeleniumTestImages.zipbin21993 -> 0 bytes
-rw-r--r--tests/selenium/data/Wikipedia-logo-v2-de.pngbin21479 -> 0 bytes
-rw-r--r--tests/selenium/data/mediawiki118_fresh_installation.sql1543
-rw-r--r--tests/selenium/installer/MediaWikiButtonsAvailabilityTestCase.php90
-rw-r--r--tests/selenium/installer/MediaWikiDifferentDatabaseAccountTestCase.php73
-rw-r--r--tests/selenium/installer/MediaWikiDifferntDatabasePrefixTestCase.php88
-rw-r--r--tests/selenium/installer/MediaWikiErrorsConnectToDatabasePageTestCase.php131
-rw-r--r--tests/selenium/installer/MediaWikiErrorsNamepageTestCase.php119
-rw-r--r--tests/selenium/installer/MediaWikiHelpFieldHintTestCase.php128
-rw-r--r--tests/selenium/installer/MediaWikiInstallationCommonFunction.php259
-rw-r--r--tests/selenium/installer/MediaWikiInstallationConfig.php45
-rw-r--r--tests/selenium/installer/MediaWikiInstallationMessage.php53
-rw-r--r--tests/selenium/installer/MediaWikiInstallationVariables.php73
-rw-r--r--tests/selenium/installer/MediaWikiInstallerTestSuite.php49
-rw-r--r--tests/selenium/installer/MediaWikiMySQLDataBaseTestCase.php71
-rw-r--r--tests/selenium/installer/MediaWikiMySQLiteDataBaseTestCase.php73
-rw-r--r--tests/selenium/installer/MediaWikiOnAlreadyInstalledTestCase.php65
-rw-r--r--tests/selenium/installer/MediaWikiRestartInstallationTestCase.php104
-rw-r--r--tests/selenium/installer/MediaWikiRightFrameworkLinksTestCase.php83
-rw-r--r--tests/selenium/installer/MediaWikiUpgradeExistingDatabaseTestCase.php111
-rw-r--r--tests/selenium/installer/MediaWikiUserInterfaceTestCase.php494
-rw-r--r--tests/selenium/installer/README.txt32
-rw-r--r--tests/selenium/selenium_settings.ini.sample32
-rw-r--r--tests/selenium/selenium_settings_grid.ini.sample16
-rw-r--r--tests/selenium/suites/AddContentToNewPageTestCase.php173
-rw-r--r--tests/selenium/suites/AddNewPageTestCase.php59
-rw-r--r--tests/selenium/suites/CreateAccountTestCase.php109
-rw-r--r--tests/selenium/suites/DeletePageAdminTestCase.php82
-rw-r--r--tests/selenium/suites/EmailPasswordTestCase.php74
-rw-r--r--tests/selenium/suites/MediaWikiEditorConfig.php41
-rw-r--r--tests/selenium/suites/MediaWikiEditorTestSuite.php19
-rw-r--r--tests/selenium/suites/MediaWikiExtraTestSuite.php21
-rw-r--r--tests/selenium/suites/MediawikiCoreSmokeTestCase.php70
-rw-r--r--tests/selenium/suites/MediawikiCoreSmokeTestSuite.php19
-rw-r--r--tests/selenium/suites/MovePageTestCase.php111
-rw-r--r--tests/selenium/suites/MyContributionsTestCase.php59
-rw-r--r--tests/selenium/suites/MyWatchListTestCase.php51
-rw-r--r--tests/selenium/suites/PageDeleteTestSuite.php15
-rw-r--r--tests/selenium/suites/PageSearchTestCase.php98
-rw-r--r--tests/selenium/suites/PreviewPageTestCase.php48
-rw-r--r--tests/selenium/suites/SavePageTestCase.php53
-rw-r--r--tests/selenium/suites/SimpleSeleniumConfig.php30
-rw-r--r--tests/selenium/suites/SimpleSeleniumTestCase.php39
-rw-r--r--tests/selenium/suites/SimpleSeleniumTestSuite.php26
-rw-r--r--tests/selenium/suites/UserPreferencesTestCase.php170
-rw-r--r--tests/testHelpers.inc33
-rw-r--r--thumb.php198
-rw-r--r--thumb_handler.php2
-rw-r--r--wiki.phtml2
1906 files changed, 98835 insertions, 66825 deletions
diff --git a/.gitreview b/.gitreview
index 65dbc270..0ec44b83 100644
--- a/.gitreview
+++ b/.gitreview
@@ -2,5 +2,5 @@
host=gerrit.wikimedia.org
port=29418
project=mediawiki/core.git
-defaultbranch=REL1_21
+defaultbranch=master
defaultrebase=0
diff --git a/.jshintignore b/.jshintignore
index 3869deb9..f740f137 100644
--- a/.jshintignore
+++ b/.jshintignore
@@ -1,3 +1,7 @@
+# Generated documentation
+docs/html/
+docs/js/
+
# third-party libs
extensions/
node_modules/
@@ -19,9 +23,7 @@ resources/jquery.effects/
resources/jquery.tipsy/
resources/jquery.ui/
resources/mediawiki.libs/
-
-# legacy scripts
-skins/common/
+resources/jquery.chosen/chosen.jquery.js
# github.com/jshint/jshint/issues/729
tests/qunit/suites/resources/mediawiki/mediawiki.jscompat.test.js
diff --git a/.jshintrc b/.jshintrc
index 7fa138d4..c4e265a4 100644
--- a/.jshintrc
+++ b/.jshintrc
@@ -1,15 +1,10 @@
{
- "predef": [
- "mediaWiki",
- "jQuery",
- "QUnit"
- ],
+ /* Common */
- "bitwise": true,
+ // Enforcing
"camelcase": true,
"curly": true,
"eqeqeq": true,
- "forin": false,
"immed": true,
"latedef": true,
"newcap": true,
@@ -17,18 +12,31 @@
"noempty": true,
"nonew": true,
"quotmark": "single",
- "regexp": false,
+ "trailing": true,
"undef": true,
"unused": true,
- "strict": false,
- "trailing": true,
+ // Legacy
+ "onevar": true,
+
+ /* Local */
+ // Enforcing
+ "bitwise": true,
+ "forin": false,
+ "regexp": false,
+ "strict": false,
+ // Relaxing
"laxbreak": true,
"smarttabs": true,
"multistr": true,
-
+ // Environment
"browser": true,
-
+ // Legacy
"nomen": true,
- "onevar": true
+
+ "predef": [
+ "mediaWiki",
+ "jQuery",
+ "QUnit"
+ ]
}
diff --git a/COPYING b/COPYING
index 019694a9..c3bed284 100644
--- a/COPYING
+++ b/COPYING
@@ -1,3 +1,41 @@
+== License and copyright information ==
+
+=== License ===
+
+MediaWiki is licensed under the terms of the GNU General Public License,
+version 2 or later. 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 variables; see
+http://www.gnu.org/licenses/gpl-faq.html#GPLAndPlugins for details.
+
+For the full text of version 2 of the license, see
+https://www.gnu.org/licenses/gpl-2.0.html or '''GNU General Public License'''
+below.
+
+=== Copyright owners ===
+
+MediaWiki contributors, including those listed in the CREDITS file, hold the
+copyright to this work.
+
+=== Additional license information ===
+
+Some components of MediaWiki imported from other projects may be under other
+Free and Open Source, or Free Culture, licenses. Specific details of their
+licensing information can be found in those components.
+
+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.
+
+MediaWiki uses the following Creative Commons icons to illustrate links to the
+CC licenses:
+
+* skins/common/images/cc-by-nc-sa.png
+* skins/common/images/cc-by-sa.png
+
+These icons are trademarked, and used subject to the CC trademark license,
+available at http://creativecommons.org/policies#trademark
+
== GNU GENERAL PUBLIC LICENSE ==
Version 2, June 1991
diff --git a/CREDITS b/CREDITS
index 9c49a9b4..54aca716 100644
--- a/CREDITS
+++ b/CREDITS
@@ -1,4 +1,4 @@
-MediaWiki 1.21 is a collaborative project released under the
+MediaWiki 1.22 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.
@@ -22,6 +22,7 @@ following names for their contribution to the product.
* church of emacs
* Daniel Friesen
* Daniel Kinzler
+* Daniel Renfro
* Danny B.
* David McCabe
* Derk-Jan Hartman
@@ -80,7 +81,7 @@ following names for their contribution to the product.
* Thomas Bleher
* Tim Starling
* Timo Tijhof
-* Tom Gries
+* Thomas Gries
* Trevor Parscal
* Victor Vasiliev
* Yesid Carrillo
@@ -122,6 +123,7 @@ following names for their contribution to the product.
* David Baumgarten
* Denny Vrandecic
* Dévai Tamás
+* Ebrahim Byagowi
* Edward Z. Yang
* Elvis Stansvik
* Erwin Dokter
@@ -143,6 +145,7 @@ following names for their contribution to the product.
* Jimmy Xu
* Jonathan Wiltshire
* John N
+* JuneHyeon Bae
* Jure Kajzer
* Karun Dambiec
* Katie Filbert
@@ -159,7 +162,7 @@ following names for their contribution to the product.
* Manuel Menal
* Marcin Cieślak
* Marcus Buck
-* Mark A. Pelletier
+* Marc-André Pelletier
* Mark Hershberger
* Mark Holmquist
* Marooned
@@ -234,10 +237,5 @@ following names for their contribution to the product.
* Zachary Hauri
== Translators ==
-* Anders Wegge Jakobsen
-* Hk kng
-* Hojjat
-* Meno25
-* Rotem Liss
-* Shinjiman
-* [https://translatewiki.net/wiki/Special:ListUsers/translator Translatewiki.net Translators]
+
+* [https://translatewiki.net/wiki/Translating:MediaWiki/Credits Translators on translatewiki.net and others]
diff --git a/HISTORY b/HISTORY
index 02ba8d89..45eab2e9 100644
--- a/HISTORY
+++ b/HISTORY
@@ -1,4 +1,337 @@
-Change notes from older releases. For current info see RELEASE-NOTES-1.21.
+Change notes from older releases. For current info see RELEASE-NOTES-1.22.
+
+== MediaWiki 1.21 ==
+
+MediaWiki 1.21 is an alpha-quality branch and is not recommended for use in
+production.
+
+=== Configuration changes in 1.21 ===
+* (bug 29374) $wgVectorUseSimpleSearch is now enabled by default.
+* Deprecated $wgAllowRealName is removed. Use $wgHiddenPrefs[] = 'realname'
+ instead.
+* (bug 39957) Added $wgUnwatchedPageThreshold, specifying minimum count
+ of page watchers required for the number to be accessible to users
+ without the unwatchedpages permission.
+* $wgBug34832TransitionalRollback has been removed.
+* (bug 29472) $wgUseDynamicDates has been removed and its functionality
+ disabled.
+
+=== New features in 1.21 ===
+* (bug 38110) Schema changes (adding or dropping tables, indices and
+ fields) can be now be done separately from from other changes that
+ update.php makes. This is useful in environments that use database
+ permissions to restrict schema changes but allow the DB user that
+ MediaWiki normally runs as to perform other changes that update.php
+ makes. Schema changes can be run separately. See the file UPGRADE
+ for more information.
+* (bug 34876) jquery.makeCollapsible has been improved in performance.
+* Added ContentHandler facility to allow extensions to support other content
+ than wikitext. See docs/contenthandler.txt for details.
+* New feature was developed for showing high-DPI thumbnails for high-DPI mobile
+ and desktop displays (configurable with $wgResponsiveImages).
+* Added new backend to represent and store information about sites and site
+ specific configuration.
+* jQuery upgraded from 1.8.2 to 1.8.3.
+* jQuery UI upgraded from 1.8.23 to 1.8.24.
+* Added separate fa_sha1 field to filearchive table. This allows sha1
+ searches with the api in miser mode for deleted files.
+* Add initial and programmatic sorting for tablesorter.
+* Add the event "sortEnd.tablesorter", triggered after sorting has completed.
+* The Job system was refactored to allow for different backing stores for
+ queues as well as cross-wiki access to queues, among other things. The schema
+ for the DB queue was changed to support better concurrency and reduce
+ deadlock errors.
+* Added ApiQueryORM class to facilitate creation of query API modules based on
+ tables that have a corresponding ORMTable class.
+* (bug 40876) Icon for PSD (Adobe Photoshop) file types.
+* (bug 40641) Implemented Special:Version/Credits with a list of contributors.
+* (bug 7851) Implemented one-click AJAX patrolling.
+* The <data>, <time>, <meta>, and <link> elements are allowed within WikiText
+ for use with Microdata.
+* The HTML5 <mark> tag has been whitelisted.
+* Added ParserCloned hook for when the Parser object is cloned.
+* Added AlternateEditPreview hook to allow extensions to replace the page
+ preview from the edit page.
+* Added EditPage::showStandardInputs:options hook to allow extensions to add
+ new fields to the "editOptions" area of the edit form.
+* Upload stash DB schema altered to improve upload performance.
+* The following global functions are now reporting deprecated warnings in
+ debug mode: wfMsg, wfMsgNoTrans, wfMsgForContent, wfMsgForContentNoTrans,
+ wfMsgReal, wfMsgGetKey, wfMsgHtml, wfMsgWikiHtml, wfMsgExt, wfEmptyMsg. Use
+ the Message class, or the global method wfMessage.
+* Added $wgEnableCanonicalServerLink, off by default. If enabled, a
+ <link rel=canonical> tag is added to every page indicating the correct server
+ to use.
+* Debug message emitted by wfDebugLog() will now be prefixed with the group
+ name when its logged to the default log file. That is the case whenever the
+ group has no key in wgDebugLogGroups, that will help triage the default log.
+* (bug 24620) Add types to LogFormatter.
+* jQuery JSON upgraded from 2.3 to 2.4.0.
+* Added GetDoubleUnderscoreIDs hook, for modifying the list of magic words.
+* DatabaseUpdater class has two new methods to ease extensions schema changes:
+ dropExtensionIndex and renameExtensionIndex.
+* New preference type - 'api'. Preferences of this type are not shown on
+ Special:Preferences, but are still available via the action=options API.
+* (bug 39397) Hide rollback link if a user is the only contributor of the page.
+* $wgPageInfoTransclusionLimit limits the list size of transcluded articles
+ on the info action. Default is 50.
+* Added action=createaccount to allow user account creation.
+* (bug 40124) action=options API also allows for setting of arbitrary
+ preferences, provided that their names are prefixed with 'userjs-'. This
+ officially reenables the feature that was undocumented and defective
+ in MW 1.20 (saving preferences using Special:Preferences cleared any
+ additional fields) and which has been disabled in 1.20.1 as a part of
+ a security fix (bug 42202).
+* Added option to specify "others" as author in extension credits using
+ "..." as author name.
+* Added the ability to limit the wall clock time used by shell processes,
+ as well as the CPU time. Configurable with $wgMaxShellWallClockTime.
+* Allow memory of shell subprocesses to be limited using Linux cgroups
+ instead of ulimit -v, which tends to cause deadlocks in recent versions
+ of ImageMagick. Configurable with $wgShellCgroup.
+* Added $wgWhitelistReadRegexp for regex whitelisting.
+* (bug 5346) Categories that are redirects will be displayed italic in
+ the category links section at the bottom of a page.
+* (bug 43915) New maintenance script deleteEqualMessages.php.
+* You can now create checkbox option matrices through the HTMLCheckMatrix
+ subclass in HTMLForm.
+* WikiText now permits the use of WAI-ARIA's role="presentation" inside of
+ html elements and tables. This allows presentational markup, especially
+ tables. To be marked up as such.
+* maintenance/sql.php learned the --cluster option. Let you run the script
+ on some external cluster instead of the primary cluster for a given wiki.
+* (bug 20281) test the parsing of inline URLs.
+* Added Special:PagesWithProp, which lists pages using a particular page property.
+* Implemented language-specific collations for category sorting for 67 languages
+ based in latin, greek and cyrillic alphabets. This allows one to *finally* get
+ articles to be correctly sorted on category pages. They are named
+ 'uca-<langcode>', where <langcode> is one of: af, ast, az, be, bg, br, bs, ca,
+ co, cs, cy, da, de, dsb, el, en, eo, es, et, eu, fi, fo, fr, fur, fy, ga, gd,
+ gl, hr, hsb, hu, is, it, kk, kl, ku, ky, la, lb, lt, lv, mk, mo, mt, nl, no,
+ oc, pl, pt, rm, ro, ru, rup, sco, sk, sl, smn, sq, sr, sv, tk, tl, tr, tt, uk,
+ uz, vi.
+* Added 'CategoryAfterPageAdded' and 'CategoryAfterPageRemoved' hooks.
+* Added 'HistoryRevisionTools' and 'DiffRevisionTools' hooks.
+* Added 'SpecialSearchResultsPrepend' and 'SpecialSearchResultsAppend' hooks.
+* (bug 33186) Add image rotation api "imagerotate"
+* (bug 34040) Add "User rights management" link on user page toolbox.
+* (bug 45526) Add QUnit assertion helper "QUnit.assert.htmlEqual" for asserting
+ structual equality of HTML (ignoring insignificant differences like
+ quotmarks, order and whitespace in the attribute list).
+* (bug 23393) HTML <hN> headings containing line breaks are now handled
+ correctly.
+* (bug 45803) Whitespace within == Headline == syntax and within <hN> headings
+ is now non-significant and not preserved in the HTML output.
+
+=== Bug fixes in 1.21 ===
+* (bug 40353) SpecialDoubleRedirect should support interwiki redirects.
+* (bug 40352) fixDoubleRedirects.php should support interwiki redirects.
+* (bug 9237) SpecialBrokenRedirect should not list interwiki redirects.
+* (bug 34960) Drop unused fields rc_moved_to_ns and rc_moved_to_title from
+ recentchanges table.
+* (bug 32951) Do not register internal externals with absolute protocol,
+ when server has relative protocol.
+* (bug 39005) When purging proxies listed in $wgSquidServers using HTTP PURGE
+ method requests, we now send a Host header by default, for Varnish
+ compatibility. This also works with Squid in reverse-proxy mode. If you wish
+ to support Squid configured in forward-proxy mode, set
+ $wgSquidPurgeUseHostHeader to false.
+* (bug 37020) sql.php with readline eats semicolon.
+* (bug 11748) Properly handle optionally-closed HTML tags when Tidy is
+ disabled, and don't wrap HTML-syntax definition lists in paragraphs.
+* (bug 41409) Diffs while editing an old revision should again diff against the
+ current revision.
+* (bug 41494) Honor $wgLogExceptionBacktrace when logging non-API exceptions
+ caught during API execution.
+* (bug 37963) Fixed loading process for user options.
+* (bug 26995) Update filename field on Upload page after having sanitized it.
+* (bug 41793) Contribution links to users with 0 edits on Special:ListUsers
+ didn't show up red.
+* (bug 41899) A PHP notice no longer occurs when using the "rvcontinue" API
+ parameter.
+* (bug 42036) Account creation emails now contain canonical (not
+ protocol-relative) URLs.
+* (bug 41990) Fix regression: API edit with redirect=true and lacking
+ starttimestamp and basetimestamp should not cause an edit conflict.
+* (bug 41706) EditPage: Preloaded page should be converted if possible and
+ needed.
+* (bug 41886) Rowspans are no longer exploded by tablesorter until the table is
+ actually sorted.
+* (bug 2865) User interface HTML elements don't use lang attribute.
+ (completed the fix by adding the lang attribute to firstHeading).
+* (bug 42173) Removed namespace prefixes on Special:UncategorizedCategories.
+* (bug 36053) Log in "returnto" feature forgets query parameters if no
+ title parameter was specified.
+* (bug 42410) API action=edit now returns correct timestamp for the new edit.
+* (bug 14901) Email notification mistakes log action for new page creation.
+ Enotif no longer sends "page has been created" notifications for some log
+ actions. The following events now have a correct message: page creation,
+ deletion, move, restore (undeletion), change (edit). Parameter
+ $CHANGEDORCREATED is deprecated in 'enotif_body' and scheduled for removal in
+ MediaWiki 1.23.
+* (bug 457) In the sidebar of Vector, CologneBlue, Monobook, and Monobook-based
+ skins, the heading levels have been changed from (variously per skin)
+ <h4>, <h5> or <h6> to only <h3>s, with a <h2> hidden heading above them.
+ If you are styling or scripting the headings in a custom way, this change
+ will require updates to your site's CSS or JS.
+* (bug 41342) jquery.suggestions should cancel any active (async) fetches
+ before it triggers another fetch.
+* (bug 42184) $wgUploadSizeWarning missing second variable.
+* (bug 34581) removeUnusedAccounts.php maintenance script now ignores newuser
+ log when determining whether an account is used.
+* (bug 43379) Gracefully fail if rev_len is unavailable for a revision on the
+ History page.
+* (bug 42949) API no longer assumes all exceptions are MWException.
+* (bug 41733) Hide "New user message" (.usermessage) element from printable view.
+* (bug 39062) Special:Contributions will display changes that don't have
+ a parent id instead of just an empty bullet item.
+* (bug 37209) "LinkCache doesn't currently know about this title" error fixed.
+* wfMerge() now works if $wgDiff3 contains spaces
+* (bug 43052) mediawiki.action.view.dblClickEdit.dblClickEdit should trigger
+ ca-edit click instead opening URL directly.
+* (bug 43964) Invalid value of "link" parameter in <gallery> no longer produces
+ a fatal error.
+* (bug 44775) The username field is not pre-filled when creating an account.
+* (bug 45069) wfParseUrl() no longer produces a PHP notice if passed a "mailto:"
+ URL without address
+* (bug 45012) Creating an account by e-mail can no longer show a
+ "password mismatch" error.
+* (bug 44599) On Special:Version, HEADs for submodule checkouts (e.g. for
+ extensions) performed using Git 1.7.8+ should now appear.
+* (bug 42184) $wgUploadSizeWarning missing second variable
+* (bug 40326) Check if files exist with a different extension during uploading
+* (bug 34798) Updated CSS for Atom/RSS recent changes feeds to match on-wiki diffs.
+* (bug 42430) Calling numRows on MySQL no longer propagates unrelated errors.
+* (bug 44719) Removed mention of non-existing maintenance/migrateCurStubs.php
+ script in includes/DefaultSettings.php
+* (bug 45143) jquery.badge: Treat non-Latin variants of zero as zero as well.
+* (bug 46151) mwdocgen.php should not ignore exit code of doxygen command.
+* (bug 41889) Fix $.tablesorter rowspan exploding for complex cases.
+
+=== API changes in 1.21 ===
+* prop=revisions can now report the contentmodel and contentformat.
+ See docs/contenthandler.txt.
+* action=edit and action=parse now support contentmodel and contentformat
+ parameters to control the interpretation of page content.
+ See docs/contenthandler.txt for details.
+* (bug 35693) ApiQueryImageInfo now suppresses errors when unserializing metadata.
+* (bug 40111) Disable minor edit for page/section creation by API.
+* (bug 41042) Revert change to action=parse&page=... behavior when the page
+ does not exist.
+* (bug 27202) Add timestamp sort to list=allimages.
+* (bug 43137) Don't return the sha1 of revisions through the API if the content is
+ revision-deleted.
+* ApiQueryImageInfo now also returns imageinfo for redirects.
+* list=alltransclusions added to enumerate every instance of page embedding
+* list=alllinks & alltransclusions now allow both 'from' and 'continue' in
+ the same query. When both are present, 'from' is simply ignored.
+* list=alllinks & alltransclusions now allow 'unique' in generators, to yield
+ a list of all link/template target pages instead of source pages.
+* BREAKING CHANGE: list=logevents output format changed for details of some log
+ types. Specifically, details that were formerly reported under a key like
+ "4::foo" will now be reported under a key of simply "foo".
+* BREAKING CHANGE: '??_badcontinue' error code was changed to '??badcontinue'
+ for all query modules.
+* ApiQueryBase adds 'badcontinue' error code if module has 'continue' parameter.
+* (bug 35885) Removed version parameter and all getVersion() methods.
+* action=options now takes a "resetkinds" option, which allows only resetting
+ certain types of preferences when the "reset" option is set.
+* (bug 36751) ApiQueryImageInfo now returns imageinfo for the redirect target
+ when queried with &redirects=.
+* (bug 31849) ApiQueryImageInfo no longer gets confused when asked for info on
+ a redirect and its target.
+* (bug 43849) ApiQueryImageInfo no longer throws exceptions with ForeignDBRepo
+ redirects.
+* On error, any warnings generated before that error will be shown in the result.
+* action=help supports generalized submodules (modules=query+value), querymodules obsolete
+* ApiQueryImageInfo continuation is more reliable. The only major change is
+ that the imagerepository property will no longer be set on page objects not
+ processed in the current query (i.e. non-images or those skipped due to
+ iicontinue).
+* Add supports for all pageset capabilities - generators, redirects, converttitles to
+ action=purge and action=setnotificationtimestamp.
+* (bug 43251) prop=pageprops&ppprop= now accepts multiple props to query.
+* ApiQueryImageInfo will now limit the number of calls to File::transform made
+ in any one query. If there are too many, iicontinue will be returned.
+* action=query&meta=siteinfo&siprop=general will now return the regexes used for
+ link trails and link prefixes. Added for Parsoid support.
+* Added an API query module list=pageswithprop, which lists pages using a
+ particular page property.
+* Added an API query module list=pagepropnames, which lists all page prop names
+ currently in use on the wiki.
+* (bug 44921) ApiMain::execute() will now return after the CORS check for an
+ HTTP OPTIONS request.
+* (bug 44923) action=upload works correctly if the entire file is uploaded in
+ the first chunk.
+* Added 'continue=' parameter to streamline client iteration over complex query results
+* (bug 44909) API parameters may now be marked as type "upload", which is now
+ used for action=upload's 'file' and 'chunk' parameters. This type will raise
+ an error during parameter validation if the parameter is given but not
+ recognized as an uploaded file.
+* (bug 44244) prop=info may now return the number of people watching each page.
+* (bug 33304) list=allpages will no longer return duplicate entries when
+ querying protection.
+* (bug 33304) list=allpages will now find really old indefinite protections.
+* (bug 45937) meta=allmessages will report a syntactically invalid lang as a
+ proper error instead of as an uncaught exception.
+* (bug 25325) added support for wlshow filtering (bots/anon/minor/patrolled)
+ to action=feedwatchlist
+* WDDX formatted output will actually be formatted (and normal output will no
+ longer be), and will no longer choke on booleans.
+
+=== API internal changes in 1.21 ===
+* For debugging only, a new global $wgDebugAPI removes many API restrictions when true.
+ Never use on the production servers, as this flag introduces security holes.
+ Whenever enabled, a warning will also be added to all output.
+* ApiModuleManager now handles all submodules (actions,props,lists) and instantiation
+* Query stores prop/list/meta as submodules
+* ApiPageSet can now be used in any action to process titles/pageids/revids or any generator.
+* BREAKING CHANGE: ApiPageSet constructor now has two params instead of three, with only the
+ first one keeping its meaning. ApiPageSet is now derived from ApiBase.
+* BREAKING CHANGE: ApiQuery::newGenerator() and executeGeneratorModule() were deleted.
+* ApiQueryGeneratorBase::setGeneratorMode() now requires a pageset param.
+* $wgAPIGeneratorModules is now obsolete and will be ignored.
+* Added flags ApiResult::OVERRIDE and ADD_ON_TOP to setElement() and addValue()
+* Internal API calls will now include <warnings> in case of unused parameters
+
+=== Languages updated in 1.21 ===
+
+MediaWiki supports over 350 languages. Many localisations are updated
+regularly. Below only new and removed languages are listed, as well as
+changes to languages because of Bugzilla reports.
+
+* South Azerbaijani (azb) added.
+* (bug 30040) Autonym for nds-nl is now 'Nedersaksies' (was 'Nedersaksisch').
+* (bug 45436) Autonym for pi (Pali) is now 'पालि' (was ''पाळि').
+* (bug 34977) Now formatted numbers in Spanish use space as separator
+ for thousands, as mandated by the Real Academia Española.
+* (bug 35031) Kurdish formatted numbers now use period and comma
+ as separators for thousands and decimals respectively.
+
+=== Other changes in 1.21 ===
+* BREAKING CHANGE: (bug 44385) Removed the jquery.collapsibleTabs module and
+ moved it to the Vector extension. It was entirely Vector-extension-specific,
+ deeply interconnected with the extension, and this functionality really
+ belongs to the extension instead of the skin anyway. In the unlikely case you
+ were using it, you have to either copy it to your extension, or install the
+ Vector extension (and possibly disable its features using config settings if
+ you don't want them).
+* Experimental IBM DB2 support was removed due to lack of interest and maintainership
+* BREAKING CHANGE: Filenames of maintenance scripts were standardized into
+ lowerCamelCase format, and made more explicit:
+ - clear_stats.php -> clearCacheStats.php
+ - clear_interwiki_cache.php -> clearInterwikiCache.php
+ - initStats.php -> initSiteStats.php
+ - proxy_check.php -> proxyCheck.php
+ - stats.php -> showCacheStats.php
+ - showStats.php -> showSiteStats.php.
+ Class names were renamed accordingly:
+ - clear_stats -> ClearCacheStats
+ - InitStats -> InitSiteStats
+ - CacheStats -> ShowCacheStats
+ - ShowStats -> ShowSiteStats.
+* BREAKING CHANGE: (bug 38244) Removed the mediawiki.api.titleblacklist module
+ and moved it to the TitleBlacklist extension.
== MediaWiki 1.20 ==
diff --git a/README b/README
index c9ce5db4..a4185ba0 100644
--- a/README
+++ b/README
@@ -1,122 +1,33 @@
-For system requirements, installation and upgrade details, see the files
-RELEASE-NOTES, INSTALL, and UPGRADE.
-
== MediaWiki ==
-MediaWiki is the software used for Wikipedia [http://www.wikipedia.org/] and the
-other Wikimedia Foundation websites. Compared to other wikis, it has an
-excellent range of features and support for high-traffic websites using
-multiple servers (Wikimedia sites peak in the 100K+ requests per second range
-as of January 2012).
-
-While quite usable on smaller sites, you may find you have to "roll your own"
-local documentation, and some aspects of configuration may seem overcomplicated
-because MediaWiki is primarily targeted as an in-house tool.
-
-The MediaWiki software was written by:
-* Lee Daniel Crocker
-* Magnus Manske
-* Jan Hidders
-* Brion Vibber
-* Axel Boldt
-* Geoffrey T. Dairiki
-* Tomasz Wegrzanowski
-* Erik Moeller
-* Tim Starling
-* Gabriel Wicke
-* Antoine Musso
-* Evan Prodromou
-* Ævar Arnfjörð Bjarmason
-* Niklas Laxström
-* Domas Mituzas
-* Rob Church
-* Jens Frank
-* 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
-* Victor Vasiliev
-* Rotem Liss
-* Platonides
-* Many 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 (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
-variables; see http://www.gnu.org/licenses/gpl-faq.html#GPLAndPlugins for
-details.
-
-The Wikimedia Foundation currently has no legal rights to the software.
-
-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.
-
-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.'
-
-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:
+MediaWiki is a popular and free, open-source wiki software package written in
+PHP. It serves as the platform for Wikipedia and the other projects of the Wikimedia
+Foundation, which deliver content in over 280 languages to more than half a billion
+people each month. MediaWiki's reliability and robust feature set have earned it a
+large and vibrant community of third-party users and developers.
- http://www.mediawiki.org/
+MediaWiki is:
-The code is currently maintained in a Git repository at
-gerrit.wikimedia.org. See http://www.mediawiki.org/wiki/Git for details.
+* feature-rich and extensible, both on-wiki and with over 2,000 extensions;
+* scalable and suitable for both small and large sites;
+* available in your language; and
+* simple to install, working on most hardware/software combinations.
-Please report bugs and make feature requests in our Bugzilla system:
-
-* 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
-
-Extensions are listed at:
-
-* 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
-
-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
-
-Developer discussion takes place at:
-
-* https://lists.wikimedia.org/mailman/listinfo/wikitech-l
+For system requirements, installation, and upgrade details, see the files
+RELEASE-NOTES, INSTALL, and UPGRADE.
-There is also a development and support channel #mediawiki on irc.freenode.net,
-and an unoffical support forum at www.mwusers.com.
+* Ready to get started?
+** https://www.mediawiki.org/wiki/Download
+* Looking for the technical manual?
+** https://www.mediawiki.org/wiki/Manual:Contents
+* Seeking help from a person?
+** https://www.mediawiki.org/wiki/Communication
+* Looking to file a bug report or a feature request?
+** https://bugs.mediawiki.org/
+* Interested in helping out?
+** https://www.mediawiki.org/wiki/How_to_contribute
+
+MediaWiki is the result of global collaboration and cooperation. The CREDITS
+file lists technical contributors to the project. The COPYING file explains
+MediaWiki's copyright and license (GNU General Public License, version 2 or
+later). Many thanks to the Wikimedia community for testing and suggestions.
diff --git a/README.mediawiki b/README.mediawiki
index c9ce5db4..100b9382 100644..120000
--- a/README.mediawiki
+++ b/README.mediawiki
@@ -1,122 +1 @@
-For system requirements, installation and upgrade details, see the files
-RELEASE-NOTES, INSTALL, and UPGRADE.
-
-== MediaWiki ==
-
-MediaWiki is the software used for Wikipedia [http://www.wikipedia.org/] and the
-other Wikimedia Foundation websites. Compared to other wikis, it has an
-excellent range of features and support for high-traffic websites using
-multiple servers (Wikimedia sites peak in the 100K+ requests per second range
-as of January 2012).
-
-While quite usable on smaller sites, you may find you have to "roll your own"
-local documentation, and some aspects of configuration may seem overcomplicated
-because MediaWiki is primarily targeted as an in-house tool.
-
-The MediaWiki software was written by:
-* Lee Daniel Crocker
-* Magnus Manske
-* Jan Hidders
-* Brion Vibber
-* Axel Boldt
-* Geoffrey T. Dairiki
-* Tomasz Wegrzanowski
-* Erik Moeller
-* Tim Starling
-* Gabriel Wicke
-* Antoine Musso
-* Evan Prodromou
-* Ævar Arnfjörð Bjarmason
-* Niklas Laxström
-* Domas Mituzas
-* Rob Church
-* Jens Frank
-* 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
-* Victor Vasiliev
-* Rotem Liss
-* Platonides
-* Many 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 (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
-variables; see http://www.gnu.org/licenses/gpl-faq.html#GPLAndPlugins for
-details.
-
-The Wikimedia Foundation currently has no legal rights to the software.
-
-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.
-
-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.'
-
-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/
-
-The code is currently maintained in a Git repository at
-gerrit.wikimedia.org. See http://www.mediawiki.org/wiki/Git for details.
-
-Please report bugs and make feature requests in our Bugzilla system:
-
-* 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
-
-Extensions are listed at:
-
-* 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
-
-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
-
-Developer discussion takes place at:
-
-* 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.
+README \ No newline at end of file
diff --git a/RELEASE-NOTES-1.21 b/RELEASE-NOTES-1.21
deleted file mode 100644
index c0c956c6..00000000
--- a/RELEASE-NOTES-1.21
+++ /dev/null
@@ -1,443 +0,0 @@
-= MediaWiki release notes =
-
-Security reminder: MediaWiki does not require PHP's register_globals. If you
-have it on, turn it '''off''' if you can.
-
-== MediaWiki 1.21.3 ==
-
-This is a security adn maintenance release of the MediaWiki 1.21 branch.
-
-=== Changes since 1.21.2 ===
-
-* (bug 53032) SECURITY: Don't cache when a call could autocreate
-* (bug 55332) SECURITY: Improve css javascript detection
-* (bug 49717) Fix behaviour $wgVerifyMimeType = false; in Upload
-* Fix comma errors in various js files
-* Translations
-
-== MediaWiki 1.21.2 ==
-
-This is a security adn maintenance release of the MediaWiki 1.21 branch.
-
-=== Changes since 1.21.1 ===
-
-* SECURITY: Fix extension detection with 2 .'s
-* SECURITY: Support for the 'gettoken' parameter to action=block and action=unblock,
- deprecated since 1.20, has been removed.
-* SECURITY: Sanitize ResourceLoader exception messages
-* Purge upstream caches when deleting file assets.
-* Unit test suite now runs the AutoLoader tests. Also fixed the autoloading
- entry for the PageORMTableForTesting class though it had no impact.
-
-== MediaWiki 1.21.1 ==
-
-This is a maintenance release of the 1.21 branch.
-
-MediaWiki 1.21 is a stable branch, and is recommended for use in production.
-
-=== Changes since 1.21.0 ===
-
-* An incorrect version number was used for 1.21.0. 1.21.1 has the correct number.
-* A problem with the Oracle SQL table creation was fixed.
-* (PdfHandler extension) Fix warning if pdfinfo fails but pdftext succeeds.
-
-=== Configuration changes in 1.21 ===
-* (bug 48306) $wgAllowChunkedUploads has been added and is false by default.
-* (bug 29374) $wgVectorUseSimpleSearch is now enabled by default.
-* Deprecated $wgAllowRealName is removed. Use $wgHiddenPrefs[] = 'realname'
- instead.
-* (bug 39957) Added $wgUnwatchedPageThreshold, specifying minimum count
- of page watchers required for the number to be accessible to users
- without the unwatchedpages permission.
-* $wgBug34832TransitionalRollback has been removed.
-* (bug 29472) $wgUseDynamicDates has been removed and its functionality
- disabled.
-
-=== New features in 1.21 ===
-* (bug 41769) Add parser method to call parser functions.
-* (bug 38110) Schema changes (adding or dropping tables, indices and
- fields) can be now be done separately from from other changes that
- update.php makes. This is useful in environments that use database
- permissions to restrict schema changes but allow the DB user that
- MediaWiki normally runs as to perform other changes that update.php
- makes. Schema changes can be run separately. See the file UPGRADE
- for more information.
-* (bug 34876) jquery.makeCollapsible has been improved in performance.
-* Added ContentHandler facility to allow extensions to support other content
- than wikitext. See docs/contenthandler.txt for details.
-* New feature was developed for showing high-DPI thumbnails for high-DPI mobile
- and desktop displays (configurable with $wgResponsiveImages).
-* Added new backend to represent and store information about sites and site
- specific configuration.
-* jQuery upgraded from 1.8.2 to 1.8.3.
-* jQuery UI upgraded from 1.8.23 to 1.8.24.
-* Added separate fa_sha1 field to filearchive table. This allows sha1
- searches with the api in miser mode for deleted files.
-* Add initial and programmatic sorting for tablesorter.
-* Add the event "sortEnd.tablesorter", triggered after sorting has completed.
-* The Job system was refactored to allow for different backing stores for
- queues as well as cross-wiki access to queues, among other things. The schema
- for the DB queue was changed to support better concurrency and reduce
- deadlock errors.
-* Added ApiQueryORM class to facilitate creation of query API modules based on
- tables that have a corresponding ORMTable class.
-* (bug 40876) Icon for PSD (Adobe Photoshop) file types.
-* (bug 40641) Implemented Special:Version/Credits with a list of contributors.
-* (bug 7851) Implemented one-click AJAX patrolling.
-* The <data>, <time>, <meta>, and <link> elements are allowed within WikiText
- for use with Microdata.
-* The HTML5 <mark> tag has been whitelisted.
-* Added ParserCloned hook for when the Parser object is cloned.
-* Added AlternateEditPreview hook to allow extensions to replace the page
- preview from the edit page.
-* Added EditPage::showStandardInputs:options hook to allow extensions to add
- new fields to the "editOptions" area of the edit form.
-* Upload stash DB schema altered to improve upload performance.
-* The following global functions are now reporting deprecated warnings in
- debug mode: wfMsg, wfMsgNoTrans, wfMsgForContent, wfMsgForContentNoTrans,
- wfMsgReal, wfMsgGetKey, wfMsgHtml, wfMsgWikiHtml, wfMsgExt, wfEmptyMsg. Use
- the Message class, or the global method wfMessage.
-* Added $wgEnableCanonicalServerLink, off by default. If enabled, a
- <link rel=canonical> tag is added to every page indicating the correct server
- to use.
-* Debug message emitted by wfDebugLog() will now be prefixed with the group
- name when its logged to the default log file. That is the case whenever the
- group has no key in wgDebugLogGroups, that will help triage the default log.
-* (bug 24620) Add types to LogFormatter.
-* jQuery JSON upgraded from 2.3 to 2.4.0.
-* Added GetDoubleUnderscoreIDs hook, for modifying the list of magic words.
-* DatabaseUpdater class has two new methods to ease extensions schema changes:
- dropExtensionIndex and renameExtensionIndex.
-* New preference type - 'api'. Preferences of this type are not shown on
- Special:Preferences, but are still available via the action=options API.
-* (bug 39397) Hide rollback link if a user is the only contributor of the page.
-* $wgPageInfoTransclusionLimit limits the list size of transcluded articles
- on the info action. Default is 50.
-* Added action=createaccount to allow user account creation.
-* (bug 40124) action=options API also allows for setting of arbitrary
- preferences, provided that their names are prefixed with 'userjs-'. This
- officially reenables the feature that was undocumented and defective
- in MW 1.20 (saving preferences using Special:Preferences cleared any
- additional fields) and which has been disabled in 1.20.1 as a part of
- a security fix (bug 42202).
-* Added option to specify "others" as author in extension credits using
- "..." as author name.
-* Added the ability to limit the wall clock time used by shell processes,
- as well as the CPU time. Configurable with $wgMaxShellWallClockTime.
-* Allow memory of shell subprocesses to be limited using Linux cgroups
- instead of ulimit -v, which tends to cause deadlocks in recent versions
- of ImageMagick. Configurable with $wgShellCgroup.
-* Added $wgWhitelistReadRegexp for regex whitelisting.
-* (bug 5346) Categories that are redirects will be displayed italic in
- the category links section at the bottom of a page.
-* (bug 43915) New maintenance script deleteEqualMessages.php.
-* You can now create checkbox option matrices through the HTMLCheckMatrix
- subclass in HTMLForm.
-* WikiText now permits the use of WAI-ARIA's role="presentation" inside of
- html elements and tables. This allows presentational markup, especially
- tables. To be marked up as such.
-* maintenance/sql.php learned the --cluster option. Let you run the script
- on some external cluster instead of the primary cluster for a given wiki.
-* (bug 20281) test the parsing of inline URLs.
-* Added Special:PagesWithProp, which lists pages using a particular page property.
-* Implemented language-specific collations for category sorting for 67 languages
- based in latin, greek and cyrillic alphabets. This allows one to *finally* get
- articles to be correctly sorted on category pages. They are named
- 'uca-<langcode>', where <langcode> is one of: af, ast, az, be, bg, br, bs, ca,
- co, cs, cy, da, de, dsb, el, en, eo, es, et, eu, fi, fo, fr, fur, fy, ga, gd,
- gl, hr, hsb, hu, is, it, kk, kl, ku, ky, la, lb, lt, lv, mk, mo, mt, nl, no,
- oc, pl, pt, rm, ro, ru, rup, sco, sk, sl, smn, sq, sr, sv, tk, tl, tr, tt, uk,
- uz, vi.
-* Added 'CategoryAfterPageAdded' and 'CategoryAfterPageRemoved' hooks.
-* Added 'HistoryRevisionTools' and 'DiffRevisionTools' hooks.
-* Added 'SpecialSearchResultsPrepend' and 'SpecialSearchResultsAppend' hooks.
-* (bug 33186) Add image rotation api "imagerotate"
-* (bug 34040) Add "User rights management" link on user page toolbox.
-* (bug 45526) Add QUnit assertion helper "QUnit.assert.htmlEqual" for asserting
- structual equality of HTML (ignoring insignificant differences like
- quotmarks, order and whitespace in the attribute list).
-
-=== Bug fixes in 1.21 ===
-* (bug 48306) Chunked uploads allow arbitrary data to be dropped on the server
-* (bug 47271) $wgContentHandlerUseDB should be set to false during the upgrade
-* (bug 46084) Sanitize $limitReport before outputting.
-* (bug 46859) Disable external entities in XMLReader.
-* (bug 47251) Disable external entities in Import.
-* (bug 42649) PHP Fatal error: Call to a member function isLocal() on a
- non-object in Title.php.
-* (bug 46493) Special:ProtectedPages results in whitepage when a bad title is protected.
-* (bug 40617) Installer can now customize the logo in LocalSettings.php.
-* (bug 40353) SpecialDoubleRedirect should support interwiki redirects.
-* (bug 40352) fixDoubleRedirects.php should support interwiki redirects.
-* (bug 9237) SpecialBrokenRedirect should not list interwiki redirects.
-* (bug 34960) Drop unused fields rc_moved_to_ns and rc_moved_to_title from
- recentchanges table.
-* (bug 32951) Do not register internal externals with absolute protocol,
- when server has relative protocol.
-* (bug 39005) When purging proxies listed in $wgSquidServers using HTTP PURGE
- method requests, we now send a Host header by default, for Varnish
- compatibility. This also works with Squid in reverse-proxy mode. If you wish
- to support Squid configured in forward-proxy mode, set
- $wgSquidPurgeUseHostHeader to false.
-* (bug 37020) sql.php with readline eats semicolon.
-* (bug 11748) Properly handle optionally-closed HTML tags when Tidy is
- disabled, and don't wrap HTML-syntax definition lists in paragraphs.
-* (bug 41409) Diffs while editing an old revision should again diff against the
- current revision.
-* (bug 41494) Honor $wgLogExceptionBacktrace when logging non-API exceptions
- caught during API execution.
-* (bug 37963) Fixed loading process for user options.
-* (bug 26995) Update filename field on Upload page after having sanitized it.
-* (bug 41793) Contribution links to users with 0 edits on Special:ListUsers
- didn't show up red.
-* (bug 41899) A PHP notice no longer occurs when using the "rvcontinue" API
- parameter.
-* (bug 42036) Account creation emails now contain canonical (not
- protocol-relative) URLs.
-* (bug 41990) Fix regression: API edit with redirect=true and lacking
- starttimestamp and basetimestamp should not cause an edit conflict.
-* (bug 41706) EditPage: Preloaded page should be converted if possible and
- needed.
-* (bug 41886) Rowspans are no longer exploded by tablesorter until the table is
- actually sorted.
-* (bug 2865) User interface HTML elements don't use lang attribute.
- (completed the fix by adding the lang attribute to firstHeading).
-* (bug 42173) Removed namespace prefixes on Special:UncategorizedCategories.
-* (bug 36053) Log in "returnto" feature forgets query parameters if no
- title parameter was specified.
-* (bug 42410) API action=edit now returns correct timestamp for the new edit.
-* (bug 14901) Email notification mistakes log action for new page creation.
- Enotif no longer sends "page has been created" notifications for some log
- actions. The following events now have a correct message: page creation,
- deletion, move, restore (undeletion), change (edit). Parameter
- $CHANGEDORCREATED is deprecated in 'enotif_body' and scheduled for removal in
- MediaWiki 1.23.
-* (bug 457) In the sidebar of Vector, CologneBlue, Monobook, and Monobook-based
- skins, the heading levels have been changed from (variously per skin)
- <h4>, <h5> or <h6> to only <h3>s, with a <h2> hidden heading above them.
- If you are styling or scripting the headings in a custom way, this change
- will require updates to your site's CSS or JS.
-* (bug 41342) jquery.suggestions should cancel any active (async) fetches
- before it triggers another fetch.
-* (bug 42184) $wgUploadSizeWarning missing second variable.
-* (bug 34581) removeUnusedAccounts.php maintenance script now ignores newuser
- log when determining whether an account is used.
-* (bug 43379) Gracefully fail if rev_len is unavailable for a revision on the
- History page.
-* (bug 42949) API no longer assumes all exceptions are MWException.
-* (bug 41733) Hide "New user message" (.usermessage) element from printable view.
-* (bug 39062) Special:Contributions will display changes that don't have
- a parent id instead of just an empty bullet item.
-* (bug 37209) "LinkCache doesn't currently know about this title" error fixed.
-* wfMerge() now works if $wgDiff3 contains spaces
-* (bug 43052) mediawiki.action.view.dblClickEdit.dblClickEdit should trigger
- ca-edit click instead opening URL directly.
-* (bug 43964) Invalid value of "link" parameter in <gallery> no longer produces
- a fatal error.
-* (bug 44775) The username field is not pre-filled when creating an account.
-* (bug 45069) wfParseUrl() no longer produces a PHP notice if passed a "mailto:"
- URL without address
-* (bug 45012) Creating an account by e-mail can no longer show a
- "password mismatch" error.
-* (bug 44599) On Special:Version, HEADs for submodule checkouts (e.g. for
- extensions) performed using Git 1.7.8+ should now appear.
-* (bug 42184) $wgUploadSizeWarning missing second variable
-* (bug 40326) Check if files exist with a different extension during uploading
-* (bug 34798) Updated CSS for Atom/RSS recent changes feeds to match on-wiki diffs.
-* (bug 42430) Calling numRows on MySQL no longer propagates unrelated errors.
-* (bug 44719) Removed mention of non-existing maintenance/migrateCurStubs.php
- script in includes/DefaultSettings.php
-* (bug 45143) jquery.badge: Treat non-Latin variants of zero as zero as well.
-* (bug 46151) mwdocgen.php should not ignore exit code of doxygen command.
-* (bug 41889) Fix $.tablesorter rowspan exploding for complex cases.
-* (bug 47489) Installer now automatically selects the next-best database type if
- the PHP mysql extension is not loaded, preventing fatal errors in some cases.
-* (bug 47202) wikibits: FF2Fixes.css should not be loaded in Firefox 20.
-
-=== API changes in 1.21 ===
-* BREAKING CHANGE: Chunked uploads are now disabled by default. You can re-enable
- them by setting $wgAllowChunkedUploads=true
-* BREAKING CHANGE: list=logevents output format changed for details of some log
- types. Specifically, details that were formerly reported under a key like
- "4::foo" will now be reported under a key of simply "foo".
-* BREAKING CHANGE: '??_badcontinue' error code was changed to '??badcontinue'
- for all query modules.
-* prop=revisions can now report the contentmodel and contentformat.
- See docs/contenthandler.txt.
-* action=edit and action=parse now support contentmodel and contentformat
- parameters to control the interpretation of page content.
- See docs/contenthandler.txt for details.
-* (bug 35693) ApiQueryImageInfo now suppresses errors when unserializing metadata.
-* (bug 40111) Disable minor edit for page/section creation by API.
-* (bug 41042) Revert change to action=parse&page=... behavior when the page
- does not exist.
-* (bug 27202) Add timestamp sort to list=allimages.
-* (bug 43137) Don't return the sha1 of revisions through the API if the content is
- revision-deleted.
-* ApiQueryImageInfo now also returns imageinfo for redirects.
-* list=alltransclusions added to enumerate every instance of page embedding
-* list=alllinks & alltransclusions now allow both 'from' and 'continue' in
- the same query. When both are present, 'from' is simply ignored.
-* list=alllinks & alltransclusions now allow 'unique' in generators, to yield
- a list of all link/template target pages instead of source pages.
-* ApiQueryBase adds 'badcontinue' error code if module has 'continue' parameter.
-* (bug 35885) Removed version parameter and all getVersion() methods.
-* action=options now takes a "resetkinds" option, which allows only resetting
- certain types of preferences when the "reset" option is set.
-* (bug 36751) ApiQueryImageInfo now returns imageinfo for the redirect target
- when queried with &redirects=.
-* (bug 31849) ApiQueryImageInfo no longer gets confused when asked for info on
- a redirect and its target.
-* (bug 43849) ApiQueryImageInfo no longer throws exceptions with ForeignDBRepo
- redirects.
-* On error, any warnings generated before that error will be shown in the result.
-* action=help supports generalized submodules (modules=query+value), querymodules obsolete
-* ApiQueryImageInfo continuation is more reliable. The only major change is
- that the imagerepository property will no longer be set on page objects not
- processed in the current query (i.e. non-images or those skipped due to
- iicontinue).
-* Add supports for all pageset capabilities - generators, redirects, converttitles to
- action=purge and action=setnotificationtimestamp.
-* (bug 43251) prop=pageprops&ppprop= now accepts multiple props to query.
-* ApiQueryImageInfo will now limit the number of calls to File::transform made
- in any one query. If there are too many, iicontinue will be returned.
-* action=query&meta=siteinfo&siprop=general will now return the regexes used for
- link trails and link prefixes. Added for Parsoid support.
-* Added an API query module list=pageswithprop, which lists pages using a
- particular page property.
-* Added an API query module list=pagepropnames, which lists all page prop names
- currently in use on the wiki.
-* (bug 44921) ApiMain::execute() will now return after the CORS check for an
- HTTP OPTIONS request.
-* (bug 44923) action=upload works correctly if the entire file is uploaded in
- the first chunk.
-* Added 'continue=' parameter to streamline client iteration over complex query results
-* (bug 44909) API parameters may now be marked as type "upload", which is now
- used for action=upload's 'file' and 'chunk' parameters. This type will raise
- an error during parameter validation if the parameter is given but not
- recognized as an uploaded file.
-* (bug 44244) prop=info may now return the number of people watching each page.
-* (bug 33304) list=allpages will no longer return duplicate entries when
- querying protection.
-* (bug 33304) list=allpages will now find really old indefinite protections.
-* (bug 45937) meta=allmessages will report a syntactically invalid lang as a
- proper error instead of as an uncaught exception.
-* (bug 48542) SpecialStatistics::getOtherStats() now uses the user language.
-
-=== API internal changes in 1.21 ===
-* BREAKING CHANGE: ApiPageSet constructor now has two params instead of three, with only the
- first one keeping its meaning. ApiPageSet is now derived from ApiBase.
-* BREAKING CHANGE: ApiQuery::newGenerator() and executeGeneratorModule() were deleted.
-* For debugging only, a new global $wgDebugAPI removes many API restrictions when true.
- Never use on the production servers, as this flag introduces security holes.
- Whenever enabled, a warning will also be added to all output.
-* ApiModuleManager now handles all submodules (actions,props,lists) and instantiation
-* Query stores prop/list/meta as submodules
-* ApiPageSet can now be used in any action to process titles/pageids/revids or any generator.
-* ApiQueryGeneratorBase::setGeneratorMode() now requires a pageset param.
-* $wgAPIGeneratorModules is now obsolete and will be ignored.
-* Added flags ApiResult::OVERRIDE and ADD_ON_TOP to setElement() and addValue()
-* Internal API calls will now include <warnings> in case of unused parameters
-
-=== Languages updated in 1.21 ===
-
-MediaWiki supports over 350 languages. Many localisations are updated
-regularly. Below only new and removed languages are listed, as well as
-changes to languages because of Bugzilla reports.
-
-* South Azerbaijani (azb) added.
-* (bug 30040) Autonym for nds-nl is now 'Nedersaksies' (was 'Nedersaksisch').
-* (bug 45436) Autonym for pi (Pali) is now 'पालि' (was ''पाळि').
-* (bug 34977) Now formatted numbers in Spanish use space as separator
- for thousands, as mandated by the Real Academia Española.
-* (bug 35031) Kurdish formatted numbers now use period and comma
- as separators for thousands and decimals respectively.
-
-=== Other changes in 1.21 ===
-* BREAKING CHANGE: (bug 44385) Removed the jquery.collapsibleTabs module and
- moved it to the Vector extension. It was entirely Vector-extension-specific,
- deeply interconnected with the extension, and this functionality really
- belongs to the extension instead of the skin anyway. In the unlikely case you
- were using it, you have to either copy it to your extension, or install the
- Vector extension (and possibly disable its features using config settings if
- you don't want them).
-* BREAKING CHANGE: Filenames of maintenance scripts were standardized into
- lowerCamelCase format, and made more explicit:
- - clear_stats.php -> clearCacheStats.php
- - clear_interwiki_cache.php -> clearInterwikiCache.php
- - initStats.php -> initSiteStats.php
- - proxy_check.php -> proxyCheck.php
- - stats.php -> showCacheStats.php
- - showStats.php -> showSiteStats.php.
- Class names were renamed accordingly:
- - clear_stats -> ClearCacheStats
- - InitStats -> InitSiteStats
- - CacheStats -> ShowCacheStats
- - ShowStats -> ShowSiteStats.
-* BREAKING CHANGE: (bug 38244) Removed the mediawiki.api.titleblacklist module
- and moved it to the TitleBlacklist extension.
-* Experimental IBM DB2 support was removed due to lack of interest and maintainership.
-
-== Compatibility ==
-
-MediaWiki 1.21 requires PHP 5.3.2 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
-Oracle.
-
-The supported versions are:
-
-* MySQL 5.0.2 or later
-* PostgreSQL 8.3 or later
-* SQLite 3.3.7 or later
-* Oracle 9.0.1 or later
-
-== Upgrading ==
-
-1.21 has several database changes since 1.20, and will not work without schema
-updates. Note that due to changes to some very large tables like the revision
-table, the schema update may take quite long (minutes on a medium sized site,
-many hours on a large site).
-
-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
-new database fields are filled with data.
-
-If you are upgrading from MediaWiki 1.4.x or earlier, you should upgrade to
-1.5 first. The upgrade script maintenance/upgrade1_5.php has been removed
-with MediaWiki 1.21.
-
-Don't forget to always back up your database before upgrading!
-
-See the file UPGRADE for more detailed upgrade instructions.
-
-For notes on 1.19.x and older releases, see HISTORY.
-
-== Online documentation ==
-
-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):
-
- https://www.mediawiki.org/wiki/Documentation
-
-== Mailing list ==
-
-A mailing list is available for MediaWiki user support and discussion:
-
- https://lists.wikimedia.org/mailman/listinfo/mediawiki-l
-
-A low-traffic announcements-only list is also available:
-
- https://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 ==
-
-There's usually someone online in #mediawiki on irc.freenode.net.
diff --git a/RELEASE-NOTES-1.22 b/RELEASE-NOTES-1.22
new file mode 100644
index 00000000..dad24388
--- /dev/null
+++ b/RELEASE-NOTES-1.22
@@ -0,0 +1,610 @@
+Security reminder: MediaWiki does not require PHP's register_globals. If you
+have it on, turn it '''off''' if you can.
+
+== MediaWiki 1.22 ==
+
+THIS IS NOT A RELEASE YET
+
+MediaWiki 1.22 is an alpha-quality branch and is not recommended for use in
+production.
+
+* Breaking Changes in 1.22
+* New features in 1.22
+* Configuration changes in 1.22
+* Bug fixes in 1.22
+* API changes in 1.22
+* Languages updated in 1.22
+* Other changes in 1.22
+
+=== Breaking Changes in 1.22 ===
+* BREAKING CHANGE: (bug 41729) Display editsection links next to headings. Also
+ change their class name from .editsection to .mw-editsection and place them at
+ the end of the heading element instead of the beginning. Client-side code and
+ screen-scrapers will have to be adjusted to handle both cases (old HTML will
+ still be visible on cached page renders until they are purged); extensions
+ using the DoEditSectionLink or EditSectionLink hooks might need adjustments as
+ well.
+* (bug 55818) BREAKING CHANGE: Removed undocumented 'Debug' hook in wfDebug.
+ This resolves an infinite loop when using $wgDebugFunctionEntry = true.
+* BREAKING CHANGE: action=parse no longer returns all langlinks for the page
+ with prop=langlinks by default. The new effectivelanglinks parameter will
+ request that the LanguageLinks hook be called to determine the effective
+ language links.
+* BREAKING CHANGE: list=allpages, list=langbacklinks, and prop=langlinks do not
+ apply the new LanguageLinks hook, and thus only consider language links
+ stored in the database.
+* BREAKING CHANGE: Implementation of MediaWiki's JS and JSON value encoding
+ has changed:
+** MediaWiki no longer supports PHP installations in which the native JSON
+ extension is missing or disabled.
+** XmlJsCode objects can no longer be nested inside objects or arrays.
+ (For Xml::encodeJsCall(), this individually applies to each argument.)
+** The sets of characters escaped by default, along with the precise escape
+ sequences used, have changed (except for the Xml::escapeJsString()
+ function, which is now deprecated).
+* BREAKING CHANGE: The Services_JSON class has been removed. If necessary,
+ be sure to upgrade affected extensions at the same time (e.g. Collection).
+* BREAKING CHANGE: Legacy skins Simple, MySkin, Chick, Standard and Nostalgia
+ were all removed. (Nostalgia was moved to an extension.) The SkinLegacy and
+ LegacyTemplate classes that supported them were removed as well and are now a
+ part of the Nostalgia extension.
+* BREAKING CHANGE: The "ExternalAuth" authentication subsystem was removed, along
+ with its associated globals of $wgExternalAuthType, $wgExternalAuthConf,
+ $wgAutocreatePolicy and $wgAllowPrefChange. Affected users are encouraged to
+ use AuthPlugin for external authentication/authorization needs.
+* BREAKING CHANGE: mw.util.tooltipAccessKeyRegexp: The match group for the
+ accesskey character is now $6 instead of $5.
+* BREAKING CHANGE: meta keywords are no longer supported. A <meta name="keywords"
+ will no longer be output and OutputPage::addKeyword no longer exists.
+* BREAKING CHANGE: The EditSectionLink hook was removed after being
+ deprecated since MediaWiki 1.14. Use DoEditSectionLink instead.
+* (bug 50310) BREAKING CHANGE: wikibits: Drop support for mwCustomEditButtons.
+ It defaults to an empty array and emits mw.log.warn when accessed.
+* BREAKING CHANGE: Special:Disambiguations has been removed from MediaWiki core.
+ Functions related to disambiguation pages are now handled by the Disambiguator
+ extension (https://www.mediawiki.org/wiki/Extension:Disambiguator) (bug
+ 35981).
+* BREAKING CHANGE: The 'mediawiki.legacy.wikiprintable' module has been removed.
+ The skins/common/wikiprintable.css file no longer exists. Return value of
+ Skin#commonPrintStylesheet is ignored. Please use the 'mediawiki.legacy.commonPrint'
+ module instead or base your skin on SkinTemplate.
+* BREAKING CHANGE: The module 'mediawiki.legacy.IEFixes' has been removed as it was
+ unused. The file skins/common/IEFixes.js remains but is only used by wikibits.
+ The file never contained any re-usable components. To use it in a skin, load
+ 'mediawiki.legacy.wikibits' (which IEFixes depends on) and that will import
+ IEFixes automatically if user agent conditions are met.
+
+=== New features in 1.22 ===
+* You can now install extensions using Composer.
+ See https://www.mediawiki.org/wiki/Composer
+* (bug 44525) mediawiki.jqueryMsg can now parse (whitelisted) HTML elements and attributes.
+* (bug 33454) Language::sprintfDate now has a timezone parameter, and supports
+ the "eIOPTZ" formatting characters.
+* EditWarning: A warning is shown when an editor leaves the edit form without
+ saving (enabled by default, users can opt-out via the 'useeditwarning'
+ preference). This feature was moved from the Vector extension, and is now part
+ of core for all skins. Take care when upgrading that you don't use an older
+ version of the Vector extension as this feature may conflict.
+* New 'mediawiki.ui' CSS module providing mw-ui-* styles for buttons and a
+ compact vertical form layout.
+* HTMLForm supports a new display format 'vform' which applies this compact vertical
+ layout and button styling. Special:PasswordReset uses this format.
+* New versions of login (Special:UserLogin) and create account
+ (Special:UserLogin/signup) forms using the "vform" compact vertical form layout.
+ These forms use new messages that assume a "Help logging in" link, see
+ https://www.mediawiki.org/wiki/Manual:Page_customizations;
+ https://www.mediawiki.org/wiki/Account_creation_user_experience/Strings lists the
+ message key changes.
+* (bug 23343) Implemented ability to apply IP blocks to the contents of X-Forwarded-For headers
+ by adding a new configuration variable $wgApplyIpBlocksToXff (disabled by default).
+* The new hook 'APIGetPossibleErrors' to modify the list of possible errors was
+ added.
+* (bug 25592) LogEventsList::showLogExtract() will now ignore various
+ Pager-related WebRequest parameters by default, as this is overwhelmingly
+ likely to be what was intended by users of the method. If any caller wishes
+ to use these parameters, the new param 'useRequestParams' may be set to true.
+* mw.util.addPortletLink: Tooltip is no longer required to be plain (without
+ an accesskey in it already). As such it now rountrips. Creating a link with a
+ message as tooltip, grabbing the title attribute and using it to create
+ another portlet will work as expected.
+* (bug 6747) {{ROOTPAGENAME}} introduced, contains the name of the topmost
+ page without namespace.
+* (bug 45535) introduced the new 'LanguageLinks' hook for manipulating the
+ language links associated with a page before display.
+* Chosen (http://harvesthq.github.io/chosen/) was added as module 'jquery.chosen'
+* HTMLForm will turn multiselect checkboxes into a Chosen interface when setting cssclass 'mw-chosen'
+* rebuildLocalisationCache learned --lang option. Let you rebuild l10n caches
+ of the specified languages instead of all of them.
+* New GetNewMessagesAlert hook allowing extensions to disable or modify the new
+ messages alert
+* New wgUserNewMsgRevisionId JS global for logged in users. This will be null
+ if the user has no new talk page messages. Otherwise it will be set to the
+ revision ID of the oldest new talk page message. This will allow gadgets and
+ extensions to create their own new message alerts on the client side.
+* mediawiki.log: Added log.warn wrapper (uses console.warn and console.trace).
+* mediawiki.log: Implemented log.deprecate. This method defines a property and
+ uses ES5 getter/setter to emit a warning when they are used.
+* $wgCascadingRestrictionLevels was added, allowing one to specify restriction levels
+ which can be cascading (previously 'sysop' was hard-coded as the only one).
+* XHTML5 support has been improved. If you set $wgMimeType = 'application/xhtml+xml'
+ MediaWiki will try outputting markup acording to XHTML5 rules.
+* Altered hook 'ProtectionForm::save', adding the reason page protection is
+ changed as third parameter.
+* New hook 'TitleSquidURLs' for manipulating the list of URLs to be purged from
+ HTTP caches when a page is changed.
+* Changed the patrolling system to always show the link for patrolling in case the
+ current revision is patrollable. This also removed the usage of the rcid URI parameters.
+* Oracle DB backend now supports Database Resident Connection Pooling (DRCP).
+ Can be enabled by setting $wgDBOracleDRCP=true.
+ Requires Oracle DB 11gR1 or above, enabled DRCP inside the DB itself and a
+ propper connect string.
+ More about DRCP can be found at:
+ http://www.oracle-base.com/articles/11g/database-resident-connection-pool-11gr1.php
+* Add a new parameter $patrolFooterShown to hook ArticleViewFooter so the hook
+ handlers can take further action based on the status of the patrol footer
+* A new hook TitleQuickPermissions was added to allow overriding of quick
+ permissions in the Title class.
+* LinkCache singleton can now be altered or cleared, letting one to specify
+ another instance that does not rely on a database backend.
+* MediaWiki's PHPUnit tests can now use PHPUnit installed using composer --dev.
+* (bug 43689) The lists of templates used on the page and hidden categories it
+ is a member of, shown below the edit form, are now collapsible (and collapsed
+ by default).
+* Parser profiling data, formerly only available in the "NewPP limit report"
+ HTML comment, is now also displayed at the bottom of page previews.
+* Added ParserLimitReportPrepare and ParserLimitReportFormat hooks, deprecated
+ ParserLimitReport hook.
+* New user rights have been added to increase granularity in rights management
+ for extensions such as OAuth:
+** editmyusercss controls whether a user may edit their own CSS subpages.
+** editmyuserjs controls whether a user may edit their own JS subpages.
+** viewmywatchlist controls whether a user may view their watchlist.
+** editmywatchlist controls whether a user may edit their watchlist.
+** viewmyprivateinfo controls whether a user may access their private
+ information (e.g. registered email address, real name).
+** editmyprivateinfo controls whether a user may change their private
+ information.
+** editmyoptions controls whether a user may change their preferences.
+* Add new hook AbortTalkPageEmailNotification, this will be used to determine
+ whether to send the regular talk page email notification
+* Action classes registered in $wgActions are now also supported in the form of
+ a callback (which returns an instance of Action) instead of providing the name
+ of a subclass of Action.
+* (bug 46513) Vector: Add the collapsibleTabs script from the Vector extension.
+* Added $wgRecentChangesFlags for defining new flags for RecentChanges and
+ watchlists.
+* (bug 40518) mw.toolbar: Implemented mw.toolbar.addButtons for adding multiple
+ button objects in one call.
+* Rights used for the default protection levels ('sysop' and 'autoconfirmed')
+ are now used just for that purpose, instead of overloading other rights. This
+ allows easy granting of the ability to edit sysop-protected pages without
+ also granting the ability to protect and unprotect.
+* (bug 48256) Make brackets in section edit links accessible to CSS.
+ They are now wrapped in <span class="mw-editsection-bracket" />.
+* (bug 8480) Allow handler specific parameters in galleries (like page number)
+* jquery.client: Add detection for Opera 15 and Internet Explorer 11.
+* Change tags (used by the AbuseFilter extension) are now shown on diff pages.
+* Change tag lists (shown on recent changes, watchlist, user contributions,
+ history pages, diff pages) now include a link to Special:Tags to distinguish
+ them from edit summaries.
+* Added a new method and hook, User::isEveryoneAllowed() and
+ UserIsEveryoneAllowed, for use in situations where a "does everyone have this
+ right?" check is used to avoid more expensive checks.
+* (bug 14431) Display "(No difference)" instead of an empty diff (when comparing
+ revisions in the history or when previewing changes while editing).
+* New hook 'IsUploadAllowedFromUrl' is added which can be used to intercept uploads by
+ URL, useful for blacklisting specific URLs
+* (bug 21912) Watchlist token implementation has been refactored and
+ Special:ResetTokens was added to allow users to reset their tokens
+ instead of presenting them in Preferences.
+* Special:PrefixIndex now lets you strip the searched prefix from the displayed
+ titles. Given a list of articles named Bug1, Bug2, you can now transclude the
+ list of bug numbers using: {{Special:PrefixIndex/Bug|stripprefix=1}}.
+ The special page form received a new checkbox matching that option.
+* (bug 23580) Implement javascript callback interface "mw.hook".
+* (bug 30713) New mw.hook "wikipage.content".
+* (bug 40430) jquery.placeholder gets a new parameter to set the attribute value
+ to be used.
+* $wgHTCPMulticastRouting renamed $wgHTCPRouting since it accepts unicast.
+* $wgHTCPRouting rules can now be passed an array of hosts/ports to send purge
+ too. Can be used whenever several multicast group could be interested by a
+ specific purge.
+* (bug 25931) Add Special:RandomInCategory.
+* mediawiki.util: addPortletLink now supports passing a jQuery object as nextnode.
+* <wbr> can now be used inside WikiText.
+* WebResponse::setcookie is much more featureful. Callers using PHP's
+ setcookie() or setrawcookie() should begin using this instead.
+* New hook WebResponseSetCookie, called from WebResponse::setcookie().
+* New hook ResetSessionID, called when the session id is reset.
+* Add a mode parameter to <gallery> tag with potential options of "traditional",
+ "nolines", "packed", "packed-overlay", or "packed-hover".
+* (bug 47399) A success message is now displayed after changing the password.
+* Make thumb.php give HTTP redirects for file redirects
+* (bug 30607) Special:ListFiles can now show old versions of files. Additionally
+ Special:AllMyUploads was introduced so the user can get a list of all things
+ they have ever uploaded, even if it was subsequently overriden.
+* Introduced Special:MyFiles and Special:AllMyFiles as an alias for Special:MyUploads
+ and Special:AllMyUploads respectively.
+* IPv6 addresses in X-Forwarded-For headers are now normalised before checking
+ against allowed proxy lists.
+* Add deferrable update support for callback/closure.
+* Add TitleMove hook before page renames.
+* Revision deletion backend code is moved out of SpecialRevisiondelete
+* Added {{REVISIONSIZE}} variable to get the current size of a revision.
+* Add support for the LESS stylesheet language to ResourceLoader. LESS is a
+ stylesheet language that compiles into CSS. ResourceLoader file modules may
+ include LESS style files; ResourceLoader will compile these files into CSS
+ before sending them to the client.
+** The $wgResourceLoaderLESSVars configuration variable is an associative array
+ mapping variable names to string CSS values. These variables are considered
+ declared for all LESS files. Additional variables may be registered by
+ adding keys to the array.
+** $wgResourceLoaderLESSFunctions is an associative array of custom LESS
+ function names to PHP callables. See <http://leafo.net/lessphp/docs/#custom_functions>
+ for more details regarding custom functions.
+** $wgResourceLoaderLESSImportPaths is an array of file system paths. Files
+ referenced in LESS '@import' statements are looked up here first.
+* ResourceLoader supports hashes as module cache invalidation trigger (instead
+ of or in addition to timestamps).
+* Added $wgExtensionEntryPointListFiles for use in mergeMessageFileList.php.
+* Added a hook, APIQuerySiteInfoStatisticsInfo, to allow extensions to modify
+ the output of the API query meta=siteinfo&siprop=statistics
+* Primary keys have been added to both the archive table and the externallinks
+ tables.
+* Added $wgEnableParserLimitReporting to control whether the NewPP limit report is
+ output in a HTML comment.
+* The 'UnwatchArticle' and 'WatchArticle' hooks now support a Status object
+ instead of just a boolean return value to abort the hook.
+* Added a hook, SpecialWatchlistGetNonRevisionTypes, to allow extensions
+ with custom recentchanges entries to hook into the Watchlist without
+ clobbering each other.
+* A hidden, empty input field was added to the edit form, and any edit that fills
+ it in will be rejected. This prevents against the simplest form of spambots.
+ Previously in the "SimpleAntiSpam" extension by Ryan Schmidt.
+* populateRevisionLength.php maintenance script updated to also populate
+ archive.ar_len field.
+* (bug 43571) DatabaseMySQLBase learned to list views, optionally filtered by a
+ prefix. Also fixed PHPUnit test suite when using a MySQL backend containing
+ views.
+
+=== Configuration changes in 1.22 ===
+* $wgRedirectScript was removed. It was unused.
+* Removed $wgLocalMessageCacheSerialized, it is now always true.
+* $wgVectorUseIconWatch is now enabled by default.
+* $wgCascadingRestrictionLevels was added.
+* ftps, ssh, sftp, xmpp, sip, sips, tel, sms, bitcoin, magnet, urn, and geo
+ have been whitelisted inside of $wgUrlProtocols.
+* $wgDocType and $wgDTD have been removed and are no longer used for the DOCTYPE.
+* $wgHtml5 is no longer used by core. Setting it to false will no longer disable HTML5.
+ It is still set to true for extension compatibility but doing so in extensions is deprecated.
+* $wgXhtmlDefaultNamespace is no longer used by core. Setting it will no longer change the
+ xmlns used by MediaWiki. Reliance on this variable by extensions is deprecated.
+* $wgHandheldStyle was removed.
+* $wgHandheldForIPhone was removed.
+* $wgJsMimeType is no longer used by core. Most usage has been removed since
+ HTML output is now exclusively HTML5.
+* $wgDBOracleDRCP added. True enables persistent connection with DRCP on Oracle.
+* $wgLogAutopatrol added to allow disabling logging of autopatrol edits in the logging table.
+ default for $wgLogAutopatrol is true.
+* The 'edit' right no longer allows for editing a user's own CSS and JS.
+* New rights 'editmyusercss', 'editmyuserjs', 'viewmywatchlist',
+ 'editmywatchlist', 'viewmyprivateinfo', 'editmyprivateinfo', and
+ 'editmyoptions' restrict actions that were formerly allowed by default. They
+ have been added to the default for $wgGroupPermissions['*'].
+* The 'editprotected' right no longer allows bypassing of all page protection
+ restrictions. Any group using it for this purpose will now need to have all
+ the individual rights listed in $wgRestrictionTypes for the same effect.
+* The 'protect' and 'autoconfirmed' rights are no longer used for the default
+ page protection levels. The rights 'editprotected' and 'editsemiprotected'
+ are now used for this purpose instead.
+* (bug 40866) wgOldChangeTagsIndex removed.
+* $wgNoFollowDomainExceptions now only matches entire domains. For example,
+ an entry for 'bar.com' will still match 'foo.bar.com' but not 'foobar.com'.
+* $wgCopyUploadTimeout and $wgCopyUploadAsyncTimeout added to change the timeout times for
+ fetching the file during upload by url.
+* New key added to $wgGalleryOptions - $wgGalleryOptions['mode'] to set
+ default gallery mode.
+* New hook 'GalleryGetModes' to allow extensions to make new gallery modes.
+* The checkbox for staying in HTTPS displayed on the login form when $wgSecureLogin is
+ enabled has been removed. Instead, whether the user stays in HTTPS will be determined
+ based on the user's preferences, and whether they came from HTTPS or not.
+* $wgRC2UDPAddress, $wgRC2UDPInterwikiPrefix, $wgRC2UDPOmitBots, $wgRC2UDPPort,
+ and $wgRC2UDPPrefix configuration options have been deprecated in favor of a
+ $wgRCFeeds configuration array. $wgRCFeeds makes both the format and
+ destination of recent change notifications customizable, and allows for
+ multiple destinations to be specified.
+* (bug 53862) portal-url, currentevents-url and helppage have been removed from the
+ default Sidebar.
+* The 'vector-simplesearch' preference is now enabled by default. Previously
+ it was only enabled if the Vector extension was installed.
+* The precise format of metric datagrams produced by the UDP profiler and stats counter
+ may now be specified as $wgUDPProfilerFormatString and $wgStatsFormatString,
+ respectively.
+* (bug 54597) $wgBlockOpenProxies, $wgProxyPorts, $wgProxyScriptPath, and
+ $wgProxyMemcExpiry have been removed, along with the open proxy scanner
+ script they were added for.
+* Default value of $wgMaxShellMemory has been tripled (it's now 300 MB).
+
+=== Bug fixes in 1.22 ===
+* (bug 47271) $wgContentHandlerUseDB should be set to false during the upgrade
+* Disable Special:PasswordReset when $wgEnableEmail is false. Previously one
+ could still navigate to the page by entering the URL directly.
+* (bug 47138) Fixed a fatal error when a blocked user tries to automatically
+ create an account on login due external authentication in some circumstances.
+* (bug 23393) HTML <hN> headings containing line breaks are now handled
+ correctly.
+* (bug 45803) Whitespace within == Headline == syntax and within <hN> headings
+ is now non-significant and not preserved in the HTML output.
+* (bug 47218) Special:BlockList now handles correctly user names with spaces
+ when passed as subpage.
+* Pager's properly validate which fields are allowed to be sorted on.
+* mw.util.tooltipAccessKeyRegexp: The regex now matches "option-" as well.
+ Support for Mac "option" was added in 1.16, but the regex was never updated.
+* (bug 46768) Usernames of blocking users now display correctly, even if numeric.
+* (bug 39590) Self-transclusions now show the most up to date result always
+ after save instead of being a revision behind.
+* A bias in wfRandomString() toward digits 1-7 has been corrected. Generated
+ strings will now start with digits 0 and 8-f as often as they should.
+* (bug 45371) Removed Parser_LinkHooks and CoreLinkFunctions classes.
+* (bug 41545) Allow <kbd>, <samp>, and <var> to be nested like allowed in html.
+* PLURAL magic word no longer causes a PHP notice when no matching form exists.
+* (bug 36641) Patrol page links no longer show on non-existent revisions.
+* (bug 35810) Pages not linked from Special:RecentChanges or Special:NewPages
+ are patrollable now.
+* (bug 30213) JavaScript for search suggestions is now disabled when the API
+ is disabled, and AJAX patrolling and watching are now disabled when use of
+ the write API is not allowed.
+* (bug 48294) API: Fix chunk upload async mode.
+* (bug 46749) Broken files tracking category removed from pages if an image
+ with that name is uploaded.
+* (bug 14176) System messages that are empty were previously incorrectly treated
+ as non-existent, causing a fallback to the default. This stopped users from
+ overriding system messages to make them blank.
+* (bug 48319) action=parse no longer returns an error if passed none of 'oldid',
+ 'pageid', 'page', 'title', and 'text' (e.g. if only passed 'summary'). A
+ warning will instead be issued if 'title' is non-default, unless no props are
+ requested.
+* Special:Recentchangeslinked will now include upload log entries
+* (bug 41281) Fixed ugly output if file size could not be extracted for multi-page media.
+* (bug 50315) list=logevents API module will now output log entries by anonymous users.
+* (bug 38911) Handle headers with rowspan in jquery.tablesorter
+* (bug 658) Converted the table of contents on wiki pages from <table> to <div>
+ and adjusted skin CSS accordingly. The CSS was carefully crafted to be
+ backwards-compatible in all reasonable cases (uses of the __TOC__ magic word,
+ the #toc CSS id and the .toc CSS class). However, particularly bad abuse of
+ the id or the class can possibly break.
+* CSSJanus now supports rgb, hsl, rgba, and hsla color syntaxes.
+* Special:Listfiles can no longer be sorted by image name when filtering
+ by user in miser mode.
+* (bug 49074) CSSJanus: Handle values of border-radius correctly.
+* Handle relative inclusions ({{../name}}) in main namespace with subpages
+ enabled correctly (previously MediaWiki tried to include Template:Parent/name
+ instead of just Parent/name).
+* Added $wgAPIUselessQueryPages to allow extensions to flag their query pages
+ for non-inclusion in ApiQueryQueryPages.
+* (bug 50870) mediawiki.notification: Notification area should remain visible
+ when scrolled down.
+* (bug 13438) Special:MIMESearch no longer an expensive special page.
+* (bug 48342) Fixed a fatal error when $wgValidateAllHtml is set to true and
+ the function apache_request_headers() function is not available.
+* (bug 33399) LivePreview: Re-run wikipage content handlers
+ (jquery.makeCollapsible, jquery.tablesorter) after preview content is loaded.
+* (bug 51891) Fixed PHP notice on Special:PagesWithProp when no properties
+ are defined.
+* (bug 52006) Corrected documentation of $wgTranscludeCacheExpiry.
+* (bug 52077) The APIEditBeforeSave hook is giving the content of the whole
+ revision as second argument now, rather than just the current section.
+* (bug 49694) $wgSpamRegex is now also applied on the new section headline text
+ adding a new topic on a page
+* (bug 41756) Improve treatment of multiple comments on a blank line.
+* (bug 51064) Purge upstream caches when deleting file assets.
+* (bug 39012) File types with a mime that we do not know the extension for
+ can no longer be uploaded as an extension that we do know the mime type
+ for.
+* (bug 51742) Add data-sort-value for better sorting of hitcounts Special:Tags
+* (bug 26811) On DB error pages, server hostnames are now hidden when both
+ $wgShowHostnames and $wgShowSQLErrors are false.
+* (bug 6200) line breaks in <blockquote> are handled like they are in <div>
+* (bug 14931) Default character set now set to 'utf8' when a new MySQL
+ database is created.
+* (bug 47191) Fixed "Column 'si_title' cannot be part of FULLTEXT index"
+ MySQL error when installing using the binary character set option.
+* (bug 45288) Support mysqli PHP extension
+* (bug 56707) Correct tooltip of "Next n results" on query special pages.
+* (bug 56770) mw.util.addPortletLink: Check length before access array index.
+
+=== API changes in 1.22 ===
+* (bug 25553) The JSON output formatter now leaves forward slashes unescaped
+ to improve human readability of URLs and similar strings. Also, a "utf8"
+ option is now provided to use UTF-8 encoding instead of hex escape codes
+ for most non-ASCII characters.
+* (bug 46626) xmldoublequote parameter was removed. Because of a bug, the
+ parameter has had no effect since MediaWiki 1.16, and so its removal is
+ unlikely to impact existing clients.
+* (bug 47216) action=query&meta=siteinfo&siprop=skins will now indicate which
+ skin is the default and which are unusable (e.g. listed in $wgSkipSkins).
+* (bug 25325) Added support for wlshow filtering (bots/anon/minor/patrolled)
+ to action=feedwatchlist.
+* WDDX formatted output will actually be formatted (and normal output will no
+ longer be), and will no longer choke on booleans.
+* action=opensearch no longer silently ignores the format parameter.
+* action=opensearch now supports format=jsonfm.
+* list=usercontribs&ucprop=ids will now include the parent revision id.
+* (bug 47219) Allow specifying change type of Wikipedia feed items
+* prop=imageinfo now allows setting iiurlheight without setting iiurlwidth
+* prop=info now adds the content model and page language of the title.
+* New upload log entries will now contain information on the relevant
+ image (sha1 and timestamp).
+* (bug 49239) action=parse now can parse in preview and section preview modes.
+* (bug 49259) action=patrol now accepts revision ids.
+* (bug 48129) list=blocks&bkip= now correctly handles IPv6 CIDR ranges and
+ honors $wgBlockCIDRLimit. Note any clients passing invalid values to bkip
+ will now receive an error, rather than the previous behavior listing all
+ user blocks.
+* (bug 48201) action=parse&text=foo now assumes wikitext if no title is given,
+ rather than using the content model of the page "API".
+* action=watch no longer silently ignores hook abort.
+* (bug 50785) action=purge with forcelinkupdate=1 no longer queues refreshLinks
+ jobs in the job queue for link table updates of pages that use the given page
+ as a template. Instead, forcerecursivelinkupdate=1 is introduced and should
+ be used if that behaviour is desirable.
+* The 'debugLog' property (enabled by $wgDebugToolbar) no longer sets the log
+ entry values through ApiResult::content but directly. This changes the JSON
+ output from an array of objects with content in '*' to an array of strings
+ with the content.
+* (bug 51342) prop=imageinfo iicontinue now contains the dbkey, not the text
+ version of the title.
+* (bug 52538) action=edit will now use empty text instead of the contents
+ of section 0 when passed prependtext or appendtext with section=new.
+* Support for the 'gettoken' parameter to action=block and action=unblock,
+ deprecated since 1.20, has been removed.
+* (bug 49090) Token-getting functions will fail when using jsonp callbacks.
+* (bug 52699) action=upload returns normalized file name on warning
+ "exists-normalized" instead of filename to be uploaded to.
+* (bug 53884) action=edit will now return an error when the specified section
+ does not exist in the page.
+* Added meta=filerepoinfo API module for getting information about foreign
+ file repositories, and related ForeignAPIRepo methods getInfo and getApiUrl.
+* The new query module list=allfileusages to enumerate file usages was added.
+
+=== Languages updated in 1.22 ===
+
+MediaWiki supports over 350 languages. Many localisations are updated
+regularly. Below only new and removed languages are listed, as well as
+changes to languages because of Bugzilla reports.
+
+* Batak Toba (bbc-latn) added.
+* (bug 46751) Made Buryat (Russia) (бурÑад) (bxr) fallback to Russian.
+
+=== Other changes in 1.22 ===
+* redirect.php was removed. It was unused.
+* ClickTracking integration was dropped from the mediaWiki.user.bucket
+ JavaScript function. The 'tracked' option is now ignored.
+* Event namespace used by jquery.makeCollapsible has been changed from
+ 'mw-collapse' to 'mw-collapsible' for consistency with the module name.
+* The Quickbar feature of the legacy skin model and the last remnants of it
+ throughout the code base have been removed.
+* Externaledit/externaldiff preference was removed. Very few users used this
+ feature, and improper configuration can actually prevent a user from editing
+* Calling Linker methods using a skin will now output deprecation warnings.
+* (bug 46680) "Return to" links are no longer tagged with rel="next".
+* HipHop compiler (hphpc) support was removed. HipHop VM support (hhvm) was
+ added.
+* A new Special:Redirect page was added, providing lookup by revision ID,
+ user ID, or file name. The old Special:Filepath page was reimplemented
+ to redirect through Special:Redirect.
+* Monobook: Removed the old conditional stylesheets for Opera 6, 7 and 9.
+* Support for XHTML 1.0 has been removed. MediaWiki now only outputs (X)HTML5.
+* wikibits: User-agent related globals have been deprecated. The following
+ properties now default to false and emit mw.log.warn: is_gecko, is_chrome_mac,
+ is_chrome, webkit_version, is_safari_win, is_safari, webkit_match, is_ff2,
+ ff2_bugs, is_ff2_win, is_ff2_x11, opera95_bugs, opera7_bugs, opera6_bugs,
+ is_opera_95, is_opera_preseven, is_opera, and ie6_bugs.
+* (bug 48276) MediaWiki will now flash a confirmation message upon successfully
+ editing a page.
+* (bug 40785) mediawiki.legacy.ajax has been marked as deprecated. The following
+ properties now emit mw.log.warn when accessed: sajax_debug, sajax_init_object,
+ sajax_do_call and wfSupportsAjax.
+* Methods Title::userCanEditCssSubpage and Title::userCanEditJsSubpage,
+ deprecated since 1.19, have been removed.
+* (bug 50134) Hook functions are no longer required to return a value. When a
+ hook function does not return a value (or when it returns an explicit null),
+ processing continues. To abort the hook, a hook function must return an
+ explicit, boolean false or a string error message. Other falsey values are
+ tantamount to a 'return true' in earlier versions of MediaWiki.
+* (bug 48256) The 'editsection-brackets' optional message was removed.
+ Section edit links' brackets can now be customized using CSS by
+ styling span.mw-editsection-bracket.
+* The usePatrol function in ChangesList has been marked as deprecated.
+* (bug 50785) A "null edit", that is, a save action in which no changes to the
+ page text are made and no revision recorded, will no longer send refreshLinks
+ jobs to the job table to update pages which use the edited page as a template.
+* The LivePreviewPrepare and LivePreviewDone events triggered on "jQuery( mw )"
+ have been deprecated in favour of using mw.hook.
+* The 'showjumplinks' user preference has been removed, jump links are now
+ always included.
+* Methods RecentChange::notifyRC2UDP, RecentChange::sendToUDP, and
+ RecentChange::cleanupForIRC have been deprecated, as it is now the
+ responsibility of classes implementing the RCFeedFormatter and RCFeedEngine
+ interfaces to implement the formatting and delivery for recent change
+ notifications.
+* SpecialPrefixindex methods namespacePrefixForm() and showPrefixChunk() have
+ been made protected. They were accepting form variance arguments, this is now
+ using properties in the SpecialPrefixindex class.
+* (bug 49629) The hook ExtractThumbParamaters has been deprecated in favour
+ of media handler overriding MediaHandler::parseParamString.
+* (bug 46512) The collapsibleNav feature from the Vector extension has been moved
+ to the Vector skin in core.
+* SpecialRecentChanges::addRecentChangesJS() function has been renamed
+ to addModules() and made protected.
+* Methods WatchAction::doWatch and WatchAction::doUnwatch now return a Status
+ object instead of a boolean.
+* Information boxes (CSS classes errorbox, warningbox, successbox) have been
+ made more subtle.
+* Code specific to the Math extension was marked as deprecated.
+* mediawiki.util: mw.util.wikiGetlink has been renamed to getUrl. (The old name
+ still works, but is deprecated.)
+
+== Compatibility ==
+
+MediaWiki 1.22 requires PHP 5.3.2 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
+Oracle.
+
+The supported versions are:
+
+* MySQL 5.0.2 or later
+* PostgreSQL 8.3 or later
+* SQLite 3.3.7 or later
+* Oracle 9.0.1 or later
+
+== Upgrading ==
+
+1.22 has several database changes since 1.21, and will not work without schema
+updates. Note that due to changes to some very large tables like the revision
+table, the schema update may take quite long (minutes on a medium sized site,
+many hours on a large site).
+
+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
+new database fields are filled with data.
+
+If you are upgrading from MediaWiki 1.4.x or earlier, you should upgrade to
+1.5 first. The upgrade script maintenance/upgrade1_5.php has been removed
+with MediaWiki 1.21.
+
+Don't forget to always back up your database before upgrading!
+
+See the file UPGRADE for more detailed upgrade instructions.
+
+For notes on 1.21.x and older releases, see HISTORY.
+
+== Online documentation ==
+
+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):
+
+ https://www.mediawiki.org/wiki/Documentation
+
+== Mailing list ==
+
+A mailing list is available for MediaWiki user support and discussion:
+
+ https://lists.wikimedia.org/mailman/listinfo/mediawiki-l
+
+A low-traffic announcements-only list is also available:
+
+ https://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 ==
+
+There's usually someone online in #mediawiki on irc.freenode.net.
diff --git a/UPGRADE b/UPGRADE
index 7987b221..96b58361 100644
--- a/UPGRADE
+++ b/UPGRADE
@@ -296,18 +296,3 @@ If you have a very old database (earlier than organized MediaWiki releases
in late August 2003) you may need to manually run some of the update SQL
scripts in maintenance/archives before the installer is able to pick up
with remaining updates.
-
-
-== 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
-to work for you.
-
-Install a new MediaWiki first, then use the conversion script which will
-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 bc902297..8fab878c 100644
--- a/api.php
+++ b/api.php
@@ -36,16 +36,12 @@ define( 'MW_API', true );
// Bail if PHP is too low
if ( !function_exists( 'version_compare' ) || version_compare( phpversion(), '5.3.2' ) < 0 ) {
// We need to use dirname( __FILE__ ) here cause __DIR__ is PHP5.3+
- require( dirname( __FILE__ ) . '/includes/PHPVersionError.php' );
+ require dirname( __FILE__ ) . '/includes/PHPVersionError.php';
wfPHPVersionError( 'api.php' );
}
// Initialise common code.
-if ( isset( $_SERVER['MW_COMPILED'] ) ) {
- require ( 'core/includes/WebStart.php' );
-} else {
- require ( __DIR__ . '/includes/WebStart.php' );
-}
+require __DIR__ . '/includes/WebStart.php';
wfProfileIn( 'api.php' );
$starttime = microtime( true );
@@ -58,8 +54,8 @@ if ( !$wgRequest->checkUrlExtension() ) {
// Verify that the API has not been disabled
if ( !$wgEnableAPI ) {
header( $_SERVER['SERVER_PROTOCOL'] . ' 500 MediaWiki configuration Error', true, 500 );
- echo( 'MediaWiki API is not enabled for this site. Add the following line to your LocalSettings.php'
- . '<pre><b>$wgEnableAPI=true;</b></pre>' );
+ echo 'MediaWiki API is not enabled for this site. Add the following line to your LocalSettings.php'
+ . '<pre><b>$wgEnableAPI=true;</b></pre>';
die( 1 );
}
diff --git a/composer-example.json b/composer-example.json
new file mode 100644
index 00000000..6c4d37f5
--- /dev/null
+++ b/composer-example.json
@@ -0,0 +1,11 @@
+{
+ "require": {
+ "php": ">=5.3.2"
+ },
+ "suggest": {
+ "ext-fileinfo": "*",
+ "ext-mbstring": "*",
+ "ext-wikidiff2": "*",
+ "ext-apc": "*"
+ }
+}
diff --git a/composer.json b/composer.json
deleted file mode 100644
index ded33652..00000000
--- a/composer.json
+++ /dev/null
@@ -1,30 +0,0 @@
-{
- "name": "mediawiki/core",
- "description": "Free software wiki application developed by the Wikimedia Foundation and others",
- "keywords": ["mediawiki", "wiki"],
- "homepage": "https://www.mediawiki.org/",
- "authors": [
- {
- "name": "MediaWiki Community",
- "homepage": "https://www.mediawiki.org/wiki/Special:Version/Credits"
- }
- ],
- "license": "GPL-2.0",
- "support": {
- "issues": "https://bugzilla.wikimedia.org/",
- "irc": "irc://irc.freenode.net/mediawiki",
- "wiki": "https://www.mediawiki.org/"
- },
- "require": {
- "php": ">=5.3.2"
- },
- "require-dev": {
- "phpunit/phpunit": "*"
- },
- "suggest": {
- "ext-fileinfo": "*",
- "ext-mbstring": "*",
- "ext-wikidiff2": "*",
- "ext-apc": "*"
- }
-}
diff --git a/docs/hooks.txt b/docs/hooks.txt
index d4a1c909..5aaf5961 100644
--- a/docs/hooks.txt
+++ b/docs/hooks.txt
@@ -120,7 +120,7 @@ If the code is well enough isolated, it can even be excluded when not used --
making for some slight savings in memory and load-up performance at runtime.
Admins who want to have all the reversed titles can add:
- require_once('extensions/ReverseTitle.php');
+ require_once 'extensions/ReverseTitle.php';
...to their LocalSettings.php file; those of us who don't want or need it can
just leave it out.
@@ -270,6 +270,10 @@ $reason: the reason for the move (added in 1.13)
$user: the User object about to be created (read-only, incomplete)
&$msg: out parameter: HTML to display on abort
+'AbortTalkPageEmailNotification': Return false to cancel talk page email notification
+$targetUser: the user whom to send talk page email notification
+$title: the page title
+
'AbortChangePassword': Return false to cancel password change.
$user: the User object to which the password change is occuring
$mOldpass: the old password provided by the user
@@ -377,6 +381,11 @@ result.
&$module: ApiBase Module object
&$properties: Array of properties
+'APIGetPossibleErrors': Use this hook to modify the module's list of possible
+errors.
+$module: ApiBase Module object
+&$possibleErrors: Array of possible errors
+
'APIQueryAfterExecute': After calling the execute() method of an
action=query submodule. Use this to extend core API modules.
&$module: Module object
@@ -423,6 +432,10 @@ sites general information.
$module: the current ApiQuerySiteInfo module
&$results: array of results, add things here
+'APIQuerySiteInfoStatisticsInfo': Use this hook to add extra information to the
+sites statistics information.
+&$results: array of results, add things here
+
'APIQueryUsersTokens': Use this hook to add custom token to list=users. Every
token has an action, which will be used in the ustoken parameter and in the
output (actiontoken="..."), and a callback function which should return the
@@ -488,7 +501,8 @@ $logEntry: the ManualLogEntry used to record the deletion
'ArticleEditUpdateNewTalk': Before updating user_newtalk when a user talk page
was changed.
-$wikiPage: WikiPage (object) of the user talk page
+&$wikiPage: WikiPage (object) of the user talk page
+$recipient: User (object) who's talk page was edited
'ArticleEditUpdates': When edit updates (mainly link tracking) are made when an
article has been changed.
@@ -609,6 +623,7 @@ the user is redirected back to the page.
'ArticleViewFooter': After showing the footer section of an ordinary page view
$article: Article object
+$patrolFooterShown: boolean whether patrol footer is shown
'ArticleViewHeader': Before the parser cache is about to be tried for article
viewing.
@@ -747,8 +762,22 @@ $user: the user who did the block (not the one being blocked)
$isbn: ISBN to show information for
$output: OutputPage object in use
+'CanIPUseHTTPS': Determine whether the client at a given source IP is likely
+to be able to access the wiki via HTTPS.
+$ip: The IP address in human-readable form
+&$canDo: This reference should be set to false if the client may not be able
+to use HTTPS
+
'CanonicalNamespaces': For extensions adding their own namespaces or altering
the defaults.
+Note that if you need to specify namespace protection or content model for
+a namespace that is added in a CanonicalNamespaces hook handler, you
+should do so by altering $wgNamespaceProtection and
+$wgNamespaceContentModels outside the handler, in top-level scope. The
+point at which the CanonicalNamespaces hook fires is too late for altering
+these variables. This applies even if the namespace addition is
+conditional; it is permissible to declare a content model and protection
+for a namespace and then decline to actually register it.
&$namespaces: Array of namespace numbers with corresponding canonical names
'CategoryAfterPageAdded': After a page is added to a category.
@@ -837,10 +866,6 @@ etc.
'DatabaseOraclePostInit': Called after initialising an Oracle database
&$db: the DatabaseOracle object
-'Debug': Called when outputting a debug log line via wfDebug() or wfDebugLog()
-$text: plaintext string to be output
-$group: null or a string naming a logging group (as defined in $wgDebugLogGroups)
-
'NewDifferenceEngine': Called when a new DifferenceEngine object is made
$title: the diff page title (nullable)
&$oldId: the actual old Id to use in the diff
@@ -1008,14 +1033,6 @@ notice.
$title: title of page being edited
&$msg: localization message name, overridable. Default is 'editpage-tos-summary'
-'EditSectionLink': Do not use, use DoEditSectionLink instead.
-$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)
-$lang: The language code to use for the link in the wfMessage function
-
'EmailConfirmed': When checking that the user's email address is "confirmed".
$user: User being checked
$confirmed: Whether or not the email address is confirmed
@@ -1060,6 +1077,7 @@ change the tables headers.
'ExtractThumbParameters': Called when extracting thumbnail parameters from a
thumbnail file name.
+DEPRECATED: Media handler should override MediaHandler::parseParamString instead.
$thumbname: the base name of the thumbnail file
&$params: the currently extracted params (has source name, temp or archived zone)
@@ -1106,6 +1124,12 @@ $reason: reason
$title: An optional title object used to links to sections. Can be null.
$local: Boolean indicating whether section links should refer to local page.
+'GalleryGetModes': Get list of classes that can render different modes of a
+ gallery
+$modeArray: An associative array mapping mode names to classes that implement
+ that mode. It is expected all registered classes are a subclass of
+ ImageGalleryBase.
+
'GetAutoPromoteGroups': When determining which autopromote groups a user is
entitled to be in.
&$user: user to promote.
@@ -1138,6 +1162,15 @@ $title: Title object of page
$url: string value as output (out parameter, can modify)
$query: query options passed to Title::getFullURL()
+'GetHumanTimestamp': Pre-emptively override the human-readable timestamp generated
+by MWTimestamp::getHumanTimestamp(). Return false in this hook to use the custom
+output.
+&$output: string for the output timestamp
+$timestamp: MWTimestamp object of the current (user-adjusted) timestamp
+$relativeTo: MWTimestamp object of the relative (user-adjusted) timestamp
+$user: User whose preferences are being used to make timestamp
+$lang: Language that will be used to render the timestamp
+
'GetInternalURL': Modify fully-qualified URLs used for squid cache purging.
$title: Title object of page
$url: string value as output (out parameter, can modify)
@@ -1178,10 +1211,28 @@ to do this unless they broke backwards compatibility with a previous version of
the media handler metadata output.
&$version: Array of version strings
+'GetNewMessagesAlert': Disable or modify the new messages alert
+&$newMessagesAlert: An empty string by default. If the user has new talk page
+messages, this should be populated with an alert message to that effect
+$newtalks: An empty array if the user has no new messages or an array containing
+links and revisions if there are new messages (See User::getNewMessageLinks)
+$user: The user object of the user who is loading the page
+$out: OutputPage object (to check what type of page the user is on)
+
'GetPreferences': Modify user preferences.
$user: User whose preferences are being modified.
&$preferences: Preferences description array, to be fed to an HTMLForm object
+'GetRelativeTimestamp': Pre-emptively override the relative timestamp generated
+by MWTimestamp::getRelativeTimestamp(). Return false in this hook to use the custom
+output.
+&$output: string for the output timestamp
+&$diff: DateInterval representing the difference between the timestamps
+$timestamp: MWTimestamp object of the current (user-adjusted) timestamp
+$relativeTo: MWTimestamp object of the relative (user-adjusted) timestamp
+$user: User whose preferences are being used to make timestamp
+$lang: Language that will be used to render the timestamp
+
'getUserPermissionsErrors': Add a permissions error when permissions errors are
checked for. Use instead of userCan for most cases. Return false if the user
can't do it, and populate $result with the reason in the form of
@@ -1340,6 +1391,10 @@ $article: article (object) being checked
$ip: IP being check
$result: Change this value to override the result of wfIsTrustedProxy()
+'IsUploadAllowedFromUrl': Override the result of UploadFromUrl::isAllowedUrl()
+$url: URL used to upload from
+&$allowed: Boolean indicating if uploading is allowed for given URL
+
'isValidEmailAddr': Override the result of User::isValidEmailAddr(), for
instance to return false if the domain name doesn't match your organization.
$addr: The e-mail address entered by the user
@@ -1375,6 +1430,16 @@ $lang: language code (string)
&$names: array of language code => language name
$code language of the preferred translations
+'LanguageLinks': Manipulate a page's language links. This is called
+in various places to allow extensions to define the effective language
+links for a page.
+$title: The page's Title.
+&$links: Associative array mapping language codes to prefixed links of the
+ form "language:title".
+&$linkFlags: Associative array mapping prefixed links to arrays of flags.
+ Currently unused, but planned to provide support for marking individual
+ language links in the UI, e.g. for featured articles.
+
'LinkBegin': Used when generating internal and interwiki links in
Linker::link(), before processing starts. Return false to skip default
processing and return $ret. See documentation for Linker::link() for details on
@@ -1760,10 +1825,29 @@ cache or return false to not use it.
$parser: Parser object
$varCache: variable cache (array)
-'ParserLimitReport': Called at the end of Parser:parse() when the parser will
+'ParserLimitReport': DEPRECATED, use ParserLimitReportPrepare and
+ParserLimitReportFormat instead.
+Called at the end of Parser:parse() when the parser will
include comments about size of the text parsed.
$parser: Parser object
-$limitReport: text that will be included (without comment tags)
+&$limitReport: text that will be included (without comment tags)
+
+'ParserLimitReportFormat': Called for each row in the parser limit report that
+needs formatting. If nothing handles this hook, the default is to use "$key" to
+get the label, and "$key-value" or "$key-value-text"/"$key-value-html" to
+format the value.
+$key: Key for the limit report item (string)
+$value: Value of the limit report item
+&$report: String onto which to append the data
+$isHTML: If true, $report is an HTML table with two columns; if false, it's
+ text intended for display in a monospaced font.
+$localize: If false, $report should be output in English.
+
+'ParserLimitReportPrepare': Called at the end of Parser:parse() when the parser will
+include comments about size of the text parsed. Hooks should use
+$output->setLimitReportData() to populate data.
+$parser: Parser object
+$output: ParserOutput object
'ParserMakeImageParams': Called before the parser make an image link, use this
to modify the parameters of the image.
@@ -1783,7 +1867,7 @@ $section: the section number, zero-based, but section 0 is usually empty
$showEditLinks: boolean describing whether this section has an edit link
'ParserTestParser': Called when creating a new instance of Parser in
-maintenance/parserTests.inc.
+tests/parser/parserTest.inc.
$parser: Parser object created
'ParserTestGlobals': Allows to define globals for parser tests.
@@ -1806,6 +1890,7 @@ $action : Action being performed
&$result : Whether or not the action should be prevented
Change $result and return false to give a definitive answer, otherwise
the built-in rate limiting checks are used, if enabled.
+$incrBy: Amount to increment counter by
'PlaceNewSection': Override placement of new sections. Return false and put the
merged text into $text to override the default behavior.
@@ -1843,9 +1928,10 @@ $article: the title being (un)protected
$output: a string of the form HTML so far
'ProtectionForm::save': Called when a protection form is submitted.
-$article: the title being (un)protected
-$errorMsg: an html message string of an error or an array of message name and
+$article: the Page being (un)protected
+&$errorMsg: an html message string of an error or an array of message name and
its parameters
+$reasonstr: a string describing the reason page protection level is altered
'ProtectionForm::showLogExtract': Called after the protection log extract is
shown.
@@ -1871,6 +1957,10 @@ IContextSource $context: The RequestContext the skin is being created for.
&$skin: A variable reference you may set a Skin instance or string key on to
override the skin that will be used for the context.
+'ResetSessionID': Called from wfResetSessionID
+$oldSessionID: old session id
+$newSessionID: new session id
+
'ResourceLoaderGetConfigVars': Called at the end of
ResourceLoaderStartUpModule::getConfig(). Use this to export static
configuration variables to JavaScript. Things that depend on the current page
@@ -1911,12 +2001,6 @@ $data: the data stored in old_text. The meaning depends on $flags: if external
$flags: a comma-delimited list of strings representing the options used. May
include: utf8 (this will always be set for new revisions); gzip; external.
-'SearchUpdate': Prior to search update completion.
-$id : Page id
-$namespace : Page namespace
-$title : Page title
-$text : Current text being indexed
-
'SearchGetNearMatchBefore': Perform exact-title-matches in "go" searches before
the normal operations.
$allSearchTerms : Array of the search terms in all content languages
@@ -1952,8 +2036,6 @@ $title : Current Title object being displayed in search results.
'SearchableNamespaces': An option to modify which namespaces are searchable.
&$arr : Array of namespaces ($nsId => $name) which will be used.
-'SeleniumSettings': TODO
-
'SetupAfterCache': Called in Setup.php, after cache objects are set
'ShowMissingArticle': Called when generating the output for a non-existent page.
@@ -2078,8 +2160,6 @@ $checkEdit: Whether or not the action=edit query should be added if appropriate.
&$text: Link text.
&$result: Complete assoc. array if you want to return true.
-'SkinTemplateTabs': TODO
-
'SkinTemplateToolboxEnd': Called by SkinTemplate skins after toolbox links have
been rendered (useful for adding more).
$sk: The QuickTemplate based skin template running the hook.
@@ -2191,6 +2271,11 @@ $opts: FormOptions for this request
&$query_options: array of options for the database request
&$select: Array of columns to select
+'SpecialResetTokensTokens': Called when building token list for
+SpecialResetTokens.
+&$tokens: array of token information arrays in the format of
+ array( 'preference' => '<preference-name>', 'label-message' => '<message-key>' )
+
'SpecialSearchCreateLink': Called when making the message to create a page or
go to the existing page.
$t: title object searched for
@@ -2280,6 +2365,11 @@ $special: the special page object
&$fields: array of query fields
$values: array of variables with watchlist options
+'SpecialWatchlistGetNonRevisionTypes': Called when building sql query for
+SpecialWatchlist. Allows extensions to register custom values they have
+inserted to rc_type so they can be returned as part of the watchlist.
+&$nonRevisionTypes: array of values in the rc_type field of recentchanges table
+
'TestCanonicalRedirect': Called when about to force a redirect to a canonical
URL for a title when we have no other parameters on the URL. Gives a chance for
extensions that alter page view behavior radically to abort that redirect or
@@ -2299,6 +2389,20 @@ database result.
&$titleArray: set this to an object to override the default object returned
$res: database result used to create the object
+'TitleQuickPermissions': Called from Title::checkQuickPermissions to add to
+or override the quick permissions check.
+$title: The Title object being accessed
+$user: The User performing the action
+$action: Action being performed
+&$errors: Array of errors
+$doExpensiveQueries: Whether to do expensive DB queries
+$short: Whether to return immediately on first error
+
+'TitleGetEditNotices': Allows extensions to add edit notices
+$title: The Title object for the page the edit notices are for
+$oldid: Revision ID that the edit notices are for (or 0 for latest)
+&$notices: Array of notices. Keys are i18n message keys, values are parseAsBlock()ed messages.
+
'TitleGetRestrictionTypes': Allows extensions to modify the types of protection
that can be applied.
$title: The title in question.
@@ -2332,6 +2436,11 @@ $result: Boolean; whether MediaWiki currently thinks this is a wikitext page.
Hooks may change this value to override the return value of
Title::isWikitextPage()
+'TitleMove': Before moving an article (title).
+$old: old title
+$nt: new title
+$user: user who does the move
+
'TitleMoveComplete': After moving an article (title).
$old: old title
$nt: new title
@@ -2346,6 +2455,10 @@ $title: Title object being checked against
$user: Current user object
&$whitelisted: Boolean value of whether this title is whitelisted
+'TitleSquidURLs': Called to determine which URLs to purge from HTTP caches.
+$this: Title object to purge
+&$urls: An array of URLs to purge from the caches, to be manipulated.
+
'UndeleteForm::showHistory': Called in UndeleteForm::showHistory, after a
PageArchive object has been created but before any further processing is done.
&$archive: PageArchive object
@@ -2378,6 +2491,7 @@ $article: article "acted on"
'UnwatchArticle': Before a watch is removed from an article.
$user: user watching
$page: WikiPage object to be removed
+&$status: Status object to be returned if the hook returns false
'UnwatchArticleComplete': After a watch is removed from an article.
$user: user that watched
@@ -2538,6 +2652,10 @@ $title: Title of the page in question
$ip: User's IP address
&$blocked: Whether the user is blocked, to be modified by the hook
+'UserIsEveryoneAllowed': Check if all users are allowed some user right; return
+false if a UserGetRights hook might remove the named right.
+$right: The user right being checked
+
'UserLoadAfterLoadFromSession': Called to authenticate users on external or
environmental means; occurs after session is loaded.
$user: user object being loaded
@@ -2586,6 +2704,12 @@ $user : User object that was changed
$add : Array of strings corresponding to groups added
$remove: Array of strings corresponding to groups removed
+'UserRequiresHTTPS': Called to determine whether a user needs
+to be switched to HTTPS.
+$user: User in question.
+&$https: Boolean whether $user should be switched to HTTPS.
+
+
'UserRetrieveNewTalks': Called when retrieving "You have new messages!"
message(s).
$user: user retrieving new talks messages
@@ -2627,6 +2751,7 @@ used to alter the SQL query which gets the list of wanted pages.
'WatchArticle': Before a watch is added to an article.
$user: user that will watch
$page: WikiPage object to be watched
+&$status: Status object to be returned if the hook returns false
'WatchArticleComplete': After a watch is added to an article.
$user: user that watched
@@ -2643,6 +2768,13 @@ $skin: Skin object
REQUEST_URI.
$router: The PathRouter instance
+'WebResponseSetCookie': when setting a cookie in WebResponse::setcookie().
+Return false to prevent setting of the cookie.
+&$name: Cookie name passed to WebResponse::setcookie()
+&$value: Cookie value passed to WebResponse::setcookie()
+&$expire: Cookie expiration, as for PHP's setcookie()
+$options: Options passed to WebResponse::setcookie()
+
'WikiExporter::dumpStableQuery': Get the SELECT query for "stable" revisions
dumps. One, and only one hook should set this, and return false.
&$tables: Database tables to use in the SELECT query
diff --git a/docs/maintenance.txt b/docs/maintenance.txt
index 27619c86..87a32a80 100644
--- a/docs/maintenance.txt
+++ b/docs/maintenance.txt
@@ -34,7 +34,7 @@ In it, write the following:
<?php
-require_once( "Maintenance.php" );
+require_once 'Maintenance.php';
class DemoMaint extends Maintenance {
@@ -47,7 +47,7 @@ class DemoMaint extends Maintenance {
}
$maintClass = "DemoMaint";
-require_once( RUN_MAINTENANCE_IF_MAIN );
+require_once RUN_MAINTENANCE_IF_MAIN;
==END==
diff --git a/docs/php-memcached/Documentation b/docs/php-memcached/Documentation
index c9056053..32e340ac 100644
--- a/docs/php-memcached/Documentation
+++ b/docs/php-memcached/Documentation
@@ -163,7 +163,7 @@ MemCacheClient::set_compression($setting)
EXAMPLE:
<?php
-require("MemCachedClient.inc.php");
+require 'MemCachedClient.inc.php';
// set the servers, with the last one having an integer weight value of 3
$options["servers"] = array("10.0.0.15:11000","10.0.0.16:11001",array("10.0.0.17:11002", 3));
diff --git a/docs/scripts.txt b/docs/scripts.txt
index 4af2a2b4..0b8ee8f6 100644
--- a/docs/scripts.txt
+++ b/docs/scripts.txt
@@ -42,21 +42,11 @@ Primary scripts:
and $wgDBadminpassword in your LocalSettings.php, as well as $wgEnableProfileInfo
See also http://www.mediawiki.org/wiki/How_to_debug#Profiling.
- redirect.php
- Script that only redirect to the article passed in the wpDropdown parameter
- of the request. Used by the nostalgia skin to access special pages with the
- dropdown box at the top of the page.
-
thumb.php
Script used to resize images if it is configured to be done when the web
browser requests the image and not when generating the page. This script can
be used as a 404 handler to generate image thumbs when they don't exist.
- trackback.php
- Allow to add a new trackback to the database. This script returns XML
- and require a POST request to work, thus it should only be accessed by some
- specific programs and won't work with normal web browsers.
-
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
diff --git a/docs/skin.txt b/docs/skin.txt
index fab27b87..1459d7af 100644
--- a/docs/skin.txt
+++ b/docs/skin.txt
@@ -1,57 +1,59 @@
skin.txt
-MediaWiki's default skin is called Vector. Vector was introduced in
-the 1.16 release (2010) and has been set as the default in MediaWiki since
-the 1.17 release (2011). This replaced the popular skin, Monobook which
-had been been the default since MediaWiki 1.3 (2004). Vector is now the
-default skin on Wikimedia Projects.
+MediaWiki includes four core skins:
-There are three legacy skins which were introduced before MediaWiki 1.3:
+* Vector: The default skin. Introduced in the 1.16 release (2010), it has been
+ set as the default in MediaWiki since the 1.17 release (2011), replacing
+ Monobook.
-* Standard (a.k.a. Classic): The old default skin written by Lee Crocker
-during the phase 3 rewrite, in 2002.
+* Monobook: Named after the black-and-white photo of a book in the page
+ background. Introduced in the 2004 release of 1.3, it had been been the
+ default skin since then, before being replaced by Vector.
-* Nostalgia: A skin which looks like Wikipedia did in its first year (2001).
-This skin is now used for the old Wikipedia snapshot at
-http://nostalgia.wikipedia.org/
+* Modern: An attractive blue/grey theme with sidebar and top bar. Derived from
+ Monobook.
-* Cologne Blue: A nicer-looking alternative to Standard.
+* Cologne Blue: A lightweight skin with minimal formatting. The oldest of the
+ currently bundled skins, largely rewritten in 2012 while keeping its
+ appearance.
-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
+Several legacy skins were removed in the 1.22 release, as the burden of
+supporting them became too heavy to bear. Those were:
-And there are four Monobook-derived skins which have been introduced since 1.3:
+* Standard (a.k.a. Classic): The old default skin written by Lee Crocker during
+ the phase 3 rewrite, in 2002.
-* MySkin: Monobook without the CSS. The idea is that you customise it using user
-or site CSS (see below)
+* Nostalgia: A skin which looks like Wikipedia did in its first year (2001).
+ This skin is now used for the old Wikipedia snapshot at
+ http://nostalgia.wikipedia.org/
-* Chick: A lightweight Monobook skin with no sidebar, the sidebar links are
-given at the bottom of the page instead, as in the unstyled MySkin.
+* Chick: A lightweight Monobook skin with no sidebar. The sidebar links were
+ given at the bottom of the page instead.
-* Simple: A lightweight skin with a simple white-background sidebar and no
-top bar.
+* Simple: A lightweight skin with a simple white-background sidebar and no top
+ bar.
+
+* MySkin: Essentially Monobook without the CSS. The idea was that it could be
+ customised using user-specific or site-wide CSS (see below).
-* 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
-source files. This is done by editing some pages on the wiki:
+server-side source files. This is done by editing some pages on the wiki:
* [[MediaWiki:Common.css]] -- for skin-independent CSS
-* [[MediaWiki:Monobook.css]], [[MediaWiki:Simple.css]], etc. -- for
-skin-dependent CSS
-* [[MediaWiki:Common.js]], [[MediaWiki:Monobook.js]], etc. -- for custom
-site JavaScript
+* [[MediaWiki:Common.js]] -- for skin-independent JavaScript
+* [[MediaWiki:Vector.css]], [[MediaWiki:Monobook.css]], etc. -- for
+ skin-dependent CSS
+* [[MediaWiki:Vector.js]], [[MediaWiki:Monobook.js]], etc. -- for
+ skin-dependent JavaScript
These can also be customised on a per-user basis, by editing
-[[User:<name>/monobook.css]], [[User:<name>/monobook.js]], etc.
+[[User:<name>/vector.css]], [[User:<name>/vector.js]], etc.
-This feature has led to a wide variety of "user styles" becoming available,
-which change the appearance of Monobook or MySkin:
+This feature has led to a wide variety of "user styles" becoming available:
http://www.mediawiki.org/wiki/Manual:Gallery_of_user_styles
@@ -72,7 +74,7 @@ $wgSkipSkins[] = '<name>';
This technique is used by the more ambitious MediaWiki site operators, to
create complex custom skins for their wikis. It should be preferred over
-editing the core Monobook skin directly.
+editing the core Monobook skin directly.
See http://www.mediawiki.org/wiki/Manual:Skinning for more information.
diff --git a/docs/title.txt b/docs/title.txt
index d2d91c9c..454711dc 100644
--- a/docs/title.txt
+++ b/docs/title.txt
@@ -8,7 +8,7 @@ and can be queried for the others, and for other attributes of the title. This
is intended to be an immutable "value" class, so there are no mutator functions.
To get a new instance, call Title::newFromText(). Once instantiated, the
-non-static accessor methods can be used, such as getText(), getDBKey(),
+non-static accessor methods can be used, such as getText(), getDBkey(),
getNamespace(), etc. Note that Title::newFromText() may return false if the text
is illegal according to the rules below.
@@ -36,11 +36,11 @@ An initial colon in a title listed in wiki text may however suppress special
handling for interlanguage links, image links, and category links. It is also
used to indicate the main namespace in template inclusions.
-Once prefixes have been stripped, the rest of the title processed this way:
+Once prefixes have been stripped, the rest of the title processed this way:
* Spaces and underscores are treated as equivalent and each is converted to the
other in the appropriate context (underscore in URL and database keys, spaces
- in plain text).
+ in plain text).
* Multiple consecutive spaces are converted to a single space.
* Leading or trailing space is removed.
* If $wgCapitalLinks is enabled (the default), the first letter is capitalised,
@@ -58,7 +58,7 @@ UTF-8, because that is the size of the database field. Special page titles may
be up to 512 bytes.
Note that Unicode Normal Form C (NFC) is enforced by MediaWiki's user interface
-input functions, and so titles will typically be in this form.
+input functions, and so titles will typically be in this form.
getArticleID() needs some explanation: for "internal" articles, it should return
the "page_id" field if the article exists, else it returns 0. For all external
diff --git a/docs/uidesign/child-selector-emu.html b/docs/uidesign/child-selector-emu.html
index 8294b6d7..dedb3a67 100644
--- a/docs/uidesign/child-selector-emu.html
+++ b/docs/uidesign/child-selector-emu.html
@@ -2,7 +2,7 @@
<html>
<head>
<title>CSS Child selector emulation for IE 6</title>
- <style type="text/css">
+ <style>
/** Common rules **/
body { background-color: #CCC; }
table { border:1px black solid; }
@@ -98,4 +98,3 @@ With child selector we could limit the wikitable styling to the direct childs of
</tr>
</table>
<p><strong>NOTE:</strong>The nested caption keep the green background. The nested table keep the black border. This is because those declarations are global so we did not reset them.</p>
-
diff --git a/docs/uidesign/design.html b/docs/uidesign/design.html
index 7062a826..a285a5b2 100644
--- a/docs/uidesign/design.html
+++ b/docs/uidesign/design.html
@@ -1,7 +1,7 @@
<!DOCTYPE html>
-<html lang="en" dir="ltr" xmlns="http://www.w3.org/1999/xhtml">
+<html lang="en" dir="ltr">
<head>
- <link rel="stylesheet" href="../../skins/common/shared.css" />
+ <link rel="stylesheet" href="../../skins/common/shared.css">
</head>
<body style="font-size: small;">
@@ -31,4 +31,5 @@
<tr><td>line with hover</td><td>line with hover</td></tr>
</table>
-</body></html>
+</body>
+</html>
diff --git a/docs/uidesign/mediawiki.action.history.diff.html b/docs/uidesign/mediawiki.action.history.diff.html
index 7b8eb2a0..5edcfb86 100644
--- a/docs/uidesign/mediawiki.action.history.diff.html
+++ b/docs/uidesign/mediawiki.action.history.diff.html
@@ -1,7 +1,7 @@
<!DOCTYPE html>
-<html lang="en" dir="ltr" xmlns="http://www.w3.org/1999/xhtml">
+<html lang="en" dir="ltr">
<head>
- <link rel="stylesheet" href="../../resources/mediawiki.action/mediawiki.action.history.diff.css" />
+ <link rel="stylesheet" href="../../resources/mediawiki.action/mediawiki.action.history.diff.css">
</head>
<body style="background-color: #C0C0C0;">
<p>
@@ -54,4 +54,5 @@ Below are some basic lines being applied one or two classes. Mainly for debuggin
</td></tr>
</table>
-</body></html>
+</body>
+</html>
diff --git a/docs/uidesign/monospace.html b/docs/uidesign/monospace.html
index 84ec13a4..f2b988e2 100644
--- a/docs/uidesign/monospace.html
+++ b/docs/uidesign/monospace.html
@@ -1,7 +1,7 @@
<!DOCTYPE html>
-<html lang="en" dir="ltr" xmlns="http://www.w3.org/1999/xhtml">
+<html lang="en" dir="ltr">
<head>
- <style type="text/css">
+ <style>
pre {
border: 1px dashed #AAA;
background-color: #E0E0E0;
@@ -75,4 +75,3 @@ font-family: monospace, Verdana;
font-family: monospace, DOESNOTEXISTREALLY;'>
font-family: monospace, DOESNOTEXISTREALLY;
</pre>
-
diff --git a/docs/uidesign/table-layout.html b/docs/uidesign/table-layout.html
index 6f538258..2c268199 100644
--- a/docs/uidesign/table-layout.html
+++ b/docs/uidesign/table-layout.html
@@ -1,7 +1,7 @@
<!DOCTYPE html>
<html>
<head>
- <style type="text/css">
+ <style>
/** This is just for coloring: */
table { border: 1px solid #CC0; }
td { border: 1px solid #CCC; }
@@ -57,4 +57,3 @@ On a perfect browser, both tables should look the same</p>
</tr>
</table>
</div>
-
diff --git a/docs/upload.txt b/docs/upload.txt
deleted file mode 100644
index a0f0a594..00000000
--- a/docs/upload.txt
+++ /dev/null
@@ -1,2 +0,0 @@
-This document describes how the current uploading system is build up and how
-custom backends can be built. (At least someday it will).
diff --git a/extensions/Cite/.jshintignore b/extensions/Cite/.jshintignore
new file mode 100644
index 00000000..df46ab97
--- /dev/null
+++ b/extensions/Cite/.jshintignore
@@ -0,0 +1 @@
+modules/jquery.tooltip/jquery.tooltip.js
diff --git a/extensions/Cite/.jshintrc b/extensions/Cite/.jshintrc
new file mode 100644
index 00000000..4b356f81
--- /dev/null
+++ b/extensions/Cite/.jshintrc
@@ -0,0 +1,34 @@
+{
+ "camelcase": true,
+ "curly": true,
+ "eqeqeq": true,
+ "immed": true,
+ "latedef": true,
+ "newcap": true,
+ "supernew": true,
+ "shadow": true,
+ "noarg": true,
+ "noempty": true,
+ "nonew": true,
+ "quotmark": false, // sometimes double quotes make sense, e.g. "foo's" is better readable than 'foo\'s'
+ "trailing": true,
+ "undef": true,
+ "unused": "vars", // we want to allow unused function parameters
+ "laxbreak": true,
+ "laxcomma": false,
+ "onevar": false,
+ "bitwise": false,
+ "forin": false,
+ "regexp": false,
+ "strict": true,
+ "scripturl": true,
+
+ // Environment
+ "browser": true,
+
+ // Globals
+ "predef": [
+ "jQuery",
+ "mediaWiki"
+ ]
+}
diff --git a/extensions/Cite/Cite.i18n.php b/extensions/Cite/Cite.i18n.php
index 34dc86cd..2dc51f42 100644
--- a/extensions/Cite/Cite.i18n.php
+++ b/extensions/Cite/Cite.i18n.php
@@ -13,16 +13,6 @@ $messages['en'] = array(
/*
Debug and errors
*/
- # Internal errors
- 'cite_croak' => 'Cite died; $1: $2',
- 'cite_error_key_str_invalid' => 'Internal error;
-invalid $str and/or $key.
-This should never occur.',
- 'cite_error_stack_invalid_input' => 'Internal error;
-invalid stack key.
-This should never occur.',
-
- # User errors
'cite_error' => 'Cite error: $1',
'cite_error_ref_numeric_key' => 'Invalid <code>&lt;ref&gt;</code> tag;
name cannot be a simple integer. Use a descriptive title',
@@ -46,7 +36,7 @@ Define more in the <nowiki>[[MediaWiki:$2]]</nowiki> message.',
no text was provided for refs named <code>$1</code>',
'cite_error_included_ref' => 'Closing <code>&lt;/ref&gt;</code> missing for <code>&lt;ref&gt;</code> tag',
'cite_error_refs_without_references' => '<code>&lt;ref&gt;</code> tags exist, but no <code>&lt;references/&gt;</code> tag was found',
- 'cite_error_group_refs_without_references' => '<code>&lt;ref&gt;</code> tags exist for a group named "$1", but no corresponding <code>&lt;references group="$1"/&gt;</code> tag was found',
+ 'cite_error_group_refs_without_references' => '<code>&lt;ref&gt;</code> tags exist for a group named "$1", but no corresponding <code>&lt;references group="$1"/&gt;</code> tag was found, or a closing <code>&lt;/ref&gt;</code> is missing',
'cite_error_references_group_mismatch' => '<code>&lt;ref&gt;</code> tag in <code>&lt;references&gt;</code> has conflicting group attribute "$1".',
'cite_error_references_missing_group' => '<code>&lt;ref&gt;</code> tag defined in <code>&lt;references&gt;</code> has group attribute "$1" which does not appear in prior text.',
'cite_error_references_missing_key' => '<code>&lt;ref&gt;</code> tag with name "$1" defined in <code>&lt;references&gt;</code> is not used in prior text.',
@@ -73,6 +63,8 @@ no text was provided for refs named <code>$1</code>',
'cite_references_link_many_format_backlink_labels' => '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 aa ab ac ad ae af ag ah ai aj ak al am an ao ap aq ar as at au av aw ax ay az ba bb bc bd be bf bg bh bi bj bk bl bm bn bo bp bq br bs bt bu bv bw bx by bz ca cb cc cd ce cf cg ch ci cj ck cl cm cn co cp cq cr cs ct cu cv cw cx cy cz da db dc dd de df dg dh di dj dk dl dm dn do dp dq dr ds dt du dv dw dx dy dz ea eb ec ed ee ef eg eh ei ej ek el em en eo ep eq er es et eu ev ew ex ey ez fa fb fc fd fe ff fg fh fi fj fk fl fm fn fo fp fq fr fs ft fu fv fw fx fy fz ga gb gc gd ge gf gg gh gi gj gk gl gm gn go gp gq gr gs gt gu gv gw gx gy gz ha hb hc hd he hf hg hh hi hj hk hl hm hn ho hp hq hr hs ht hu hv hw hx hy hz ia ib ic id ie if ig ih ii ij ik il im in io ip iq ir is it iu iv iw ix iy iz ja jb jc jd je jf jg jh ji jj jk jl jm jn jo jp jq jr js jt ju jv jw jx jy jz ka kb kc kd ke kf kg kh ki kj kk kl km kn ko kp kq kr ks kt ku kv kw kx ky kz la lb lc ld le lf lg lh li lj lk ll lm ln lo lp lq lr ls lt lu lv lw lx ly lz ma mb mc md me mf mg mh mi mj mk ml mm mn mo mp mq mr ms mt mu mv mw mx my mz na nb nc nd ne nf ng nh ni nj nk nl nm nn no np nq nr ns nt nu nv nw nx ny nz oa ob oc od oe of og oh oi oj ok ol om on oo op oq or os ot ou ov ow ox oy oz pa pb pc pd pe pf pg ph pi pj pk pl pm pn po pp pq pr ps pt pu pv pw px py pz qa qb qc qd qe qf qg qh qi qj qk ql qm qn qo qp qq qr qs qt qu qv qw qx qy qz ra rb rc rd re rf rg rh ri rj rk rl rm rn ro rp rq rr rs rt ru rv rw rx ry rz sa sb sc sd se sf sg sh si sj sk sl sm sn so sp sq sr ss st su sv sw sx sy sz ta tb tc td te tf tg th ti tj tk tl tm tn to tp tq tr ts tt tu tv tw tx ty tz ua ub uc ud ue uf ug uh ui uj uk ul um un uo up uq ur us ut uu uv uw ux uy uz va vb vc vd ve vf vg vh vi vj vk vl vm vn vo vp vq vr vs vt vu vv vw vx vy vz wa wb wc wd we wf wg wh wi wj wk wl wm wn wo wp wq wr ws wt wu wv ww wx wy wz xa xb xc xd xe xf xg xh xi xj xk xl xm xn xo xp xq xr xs xt xu xv xw xx xy xz ya yb yc yd ye yf yg yh yi yj yk yl ym yn yo yp yq yr ys yt yu yv yw yx yy yz za zb zc zd ze zf zg zh zi zj zk zl zm zn zo zp zq zr zs zt zu zv zw zx zy zz',
'cite_references_link_many_sep' => "&#32;",
'cite_references_link_many_and' => "&#32;",
+ 'cite_references_link_accessibility_label' => 'Jump up',
+ 'cite_references_link_many_accessibility_label' => 'Jump up to:',
# Although I could just use # instead of <li> above and nothing here that
# will break on input that contains linebreaks
@@ -96,29 +88,28 @@ no text was provided for refs named <code>$1</code>',
*/
$messages['qqq'] = array(
'cite-desc' => '{{desc|name=Cite|url=http://www.mediawiki.org/wiki/Extension:Cite}}',
- 'cite_croak' => 'Used as an error message. Parameters:
-* $1 - error message. any one of the following messages:
-** {{msg-mw|Cite_error_key_str_invalid}}
-** {{msg-mw|Cite_error_stack_invalid_input}}
-* $2 - serialized error data',
- 'cite_error_key_str_invalid' => 'Used as <code>$1</code> in {{msg-mw|Cite croak}}.
-
-<code>$str</code> and <code>$key</code> are literals, and refer to who knows which variables the code uses.',
- 'cite_error_stack_invalid_input' => 'Used as <code>$1</code> in {{msg-mw|Cite croak}}.',
- 'cite_error' => 'Cite extension. This is used when there are errors in ref or references tags. The parameter $1 is an error message.',
- 'cite_error_ref_numeric_key' => 'Cite extension. Error message shown if the name of a ref tag only contains digits. Examples that cause this error are <code>&lt;ref name="123" /&gt;</code> or <code>&lt;ref name="456"&gt;input&lt;/ref&gt;</code>',
- 'cite_error_ref_no_key' => 'Cite extension. Error message shown when ref tags without any content (that is <code>&lt;ref/&gt;</code>) are used without a name.',
- 'cite_error_ref_too_many_keys' => 'Cite extension. Error message shown when ref tags has parameters other than name and group. Examples that cause this error are <code>&lt;ref name="name" notname="value" /&gt;</code> or <code>&lt;ref notname="value" &gt;input&lt;ref&gt;</code>',
- 'cite_error_ref_no_input' => 'Cite extension. Error message shown when ref tags without names have no content. An example that cause this error is <code>&lt;ref&gt;&lt;/ref&gt;</code>',
- 'cite_error_references_invalid_parameters' => 'Cite extension. Error message shown when parmeters are used in the references tag. An example that cause this error is <code>&lt;references someparameter="value" /&gt;</code>',
+ 'cite_error' => 'Cite extension.
+
+Used when there are errors in ref or references tags.
+
+Parameters:
+* $1 - an error message',
+ 'cite_error_ref_numeric_key' => 'Cite extension. Error message shown if the name of a ref tag only contains digits. Examples that cause this error are <code><nowiki><ref name="123" /></nowiki></code> or <code><nowiki><ref name="456">input</ref></nowiki></code>',
+ 'cite_error_ref_no_key' => 'Cite extension. Error message shown when ref tags without any content (that is <code><nowiki><ref /></nowiki></code>) are used without a name.',
+ 'cite_error_ref_too_many_keys' => 'Cite extension. Error message shown when ref tags has parameters other than name and group. Examples that cause this error are <code><nowiki><ref name="name" notname="value" /></nowiki></code> or <code><nowiki><ref notname="value" >input<ref></nowiki></code>',
+ 'cite_error_ref_no_input' => 'Cite extension. Error message shown when ref tags without names have no content. An example that cause this error is <code><nowiki><ref></ref></nowiki></code>',
+ 'cite_error_references_invalid_parameters' => 'Cite extension. Error message shown when parmeters are used in the references tag. An example that cause this error is <code><nowiki><references someparameter="value" /></nowiki></code>',
'cite_error_references_invalid_parameters_group' => 'Cite extension. Error message shown when unknown parameters are used in the references tag. An example that cause this error is <samp><nowiki><references someparameter="value" /></nowiki></samp>',
'cite_error_references_no_backlink_label' => 'Cite extension. Error message shown in the references tag when the same name is used for too many ref tags. Too many in this case is more than there are backlink labels defined in [[MediaWiki:Cite references link many format backlink labels]].
It is not possible to make a clickable link to this message. "nowiki" is mandatory around [[MediaWiki:Cite references link many format backlink labels]].',
'cite_error_no_link_label_group' => "*'''$1''' is the name of a reference group.
*'''$2''' is <code>cite_link_label_group-<i>groupname</i></code>.",
- 'cite_error_references_no_text' => 'Cite extension. This error occurs when the tag <code>&lt;ref name="something" /&gt;</code> is used with the name-option specified and no other tag specifies a cite-text for this name.',
- 'cite_error_included_ref' => 'Error message shown if the <code>&lt;ref&gt;</code> tag is unbalanced, that means a <code>&lt;ref&gt;</code> is not followed by a <code>&lt;/ref&gt;</code>',
+ 'cite_error_references_no_text' => 'Cite extension. This error occurs when the tag <code><nowiki><ref name="something" /></nowiki></code> is used with the name-option specified and no other tag specifies a cite-text for this name.
+
+Parameters:
+* $1 - key of the ref',
+ 'cite_error_included_ref' => 'Error message shown if the <code><nowiki><ref></nowiki></code> tag is unbalanced, that means a <code><nowiki><ref></nowiki></code> is not followed by a <code><nowiki></ref></nowiki></code>',
'cite_error_refs_without_references' => 'See also:
* {{msg-mw|Cite error group refs without references}}',
'cite_error_group_refs_without_references' => 'Parameters:
@@ -127,59 +118,88 @@ It is not possible to make a clickable link to this message. "nowiki" is mandato
If the group $1 is default group, instead of this message, the following message will be used:
* {{msg-mw|Cite error refs without references}}',
'cite_error_references_group_mismatch' => 'Error message shown when doing something like
-
<pre>
<references group="foo">
<ref group="bar">...</ref>
</references>
</pre>
-
-The <code>$1</code> is the value of the <code>group</code> attribute on the inner <code>&lt;ref&gt;</code> (in the example above, “barâ€).',
+Parameters:
+* $1 - the value of the <code>group</code> attribute on the inner <code><nowiki><ref></nowiki></code> (in the example above, “barâ€)',
'cite_error_references_missing_group' => 'Error message shown when doing something like
-
<pre>
<references group="foo">
<ref>...</ref>
</references>
</pre>
+and there are no <code><nowiki><ref></nowiki></code> tags in the page text which would use <code>group="foo"</code>.
-and there are no <code>&lt;ref&gt;</code> tags in the page text which would use <code>group="foo"</code>.
-
-The <code>$1</code> is the name of the unused <code>group</code> (in the example above, “fooâ€).',
+Parameters:
+* $1 - the name of the unused <code>group</code> (in the example above, “fooâ€)',
'cite_error_references_missing_key' => 'Error message shown when using something like
-
<pre>
<references>
<ref name="refname">...</ref>
</references>
</pre>
+and the reference <code><nowiki><ref name="refname" /></nowiki></code> is not used anywhere in the page text.
-and the reference <code>&lt;ref name="refname" /&gt;</code> is not used anywhere in the page text.
-
-The <code>$1</code> parameter contains the name of the unused reference (in the example above, “refnameâ€).',
- 'cite_error_references_no_key' => 'Error message shown when a <code>&lt;ref&gt;</code> inside <code>&lt;references&gt;</code> does not have a <code>name</code> attribute.',
- 'cite_error_empty_references_define' => 'Error message shown when there is a <code><ref></code> inside <code><references></code>, but it does not have any content, e.g.
-
+Parameters:
+* $1 - the name of the unused reference (in the example above, “refnameâ€)',
+ 'cite_error_references_no_key' => 'Error message shown when a <code><nowiki><ref></nowiki></code> inside <code><nowiki><references></nowiki></code> does not have a <code>name</code> attribute.',
+ 'cite_error_empty_references_define' => 'Error message shown when there is a <code><nowiki><ref></nowiki></code> inside <code><nowiki><references></nowiki></code>, but it does not have any content, e.g.
<pre>
<references>
<ref name="foo" />
</references>
</pre>
-<code>$1</code> contains the <code>name</code> of the erroneous <code>&lt;ref&gt;</code> (in the above example, “fooâ€).',
- 'cite_reference_link_key_with_num' => '{{optional}}',
+Parameters:
+* $1 - the <code><nowiki>name</nowiki></code> of the erroneous <code><nowiki><ref></nowiki></code> (in the above example, “fooâ€)',
+ 'cite_reference_link_key_with_num' => '{{optional}}
+Parameters:
+* $1 - the key
+* $2 - the number of the key',
'cite_reference_link_prefix' => '{{optional}}',
'cite_reference_link_suffix' => '{{optional}}',
'cite_references_link_prefix' => '{{optional}}',
'cite_references_link_suffix' => '{{optional}}',
- 'cite_reference_link' => '{{optional}}',
- 'cite_references_no_link' => '{{notranslate}}',
- 'cite_references_link_one' => '{{optional}}',
- 'cite_references_link_many' => '{{optional}}',
- 'cite_references_link_many_format' => '{{optional}}',
+ 'cite_reference_link' => '{{optional}}
+Parameters:
+* $1 - ref key
+* $2 - references key
+* $3 - link label',
+ 'cite_references_no_link' => '{{notranslate}}
+Parameters:
+* $1 - references key
+* $2 - reference text',
+ 'cite_references_link_one' => '{{optional}}
+Parameters:
+* $1 - references key
+* $2 - ref key
+* $3 - reference text',
+ 'cite_references_link_many' => '{{optional}}
+Parameters:
+* $1 - references key
+* $2 - list of links
+* $3 - reference text',
+ 'cite_references_link_many_format' => '{{optional}}
+Parameters:
+* $1 - ref key
+* $2 - ...
+* $3 - (Unused)...',
'cite_references_link_many_format_backlink_labels' => '{{Optional}}',
'cite_references_link_many_sep' => '{{optional}}',
'cite_references_link_many_and' => '{{optional}}',
+ 'cite_references_link_accessibility_label' => 'Text for screen readers to describe the jump to citation link ("↑").
+
+See also:
+* {{msg-mw|Cite references link many accessibility label}} - if the citation is used multiple times',
+ 'cite_references_link_many_accessibility_label' => 'Text for screen readers to describe the jump to citation links (a b c ...) for citations which are used in multiple places.
+
+This is going to be prepended to the first link, the following ones will just be read by screen readers as they are visible.
+
+See also:
+* {{msg-mw|Cite references link accessibility label}} - if the citation is used one time',
'cite_references_prefix' => '{{notranslate}}',
'cite_references_suffix' => '{{notranslate}}',
);
@@ -189,13 +209,6 @@ The <code>$1</code> parameter contains the name of the unused reference (in the
*/
$messages['af'] = array(
'cite-desc' => 'Maak <nowiki><ref[ name=id]></nowiki> en <nowiki><references/></nowiki> etikette beskikbaar vir sitasie.',
- 'cite_croak' => 'Probleem met Cite; $1: $2',
- 'cite_error_key_str_invalid' => 'Interne fout;
-ongeldige $str en/of $key.
-Dit behoort nie te gebeur nie.',
- 'cite_error_stack_invalid_input' => 'Interne fout;
-ongeldige "stack key".
-Dit behoort nie te gebeur nie.',
'cite_error' => 'Citefout: $1',
'cite_error_ref_numeric_key' => "Ongeldige etiket <code>&lt;ref&gt;</code>;
die naam kan nie 'n eenvoudige heelgetal wees nie.
@@ -211,9 +224,6 @@ ongeldige name, byvoorbeeld te veel',
*/
$messages['an'] = array(
'cite-desc' => 'Adibe as etiquetas <nowiki><ref[ name=id]></nowiki> y <nowiki><references/></nowiki> ta fer citas',
- 'cite_croak' => 'Cita corrompita; $1: $2',
- 'cite_error_key_str_invalid' => 'Error interna; $str y/u $key no conforme(s). Isto no habría d\'escaicer nunca.',
- 'cite_error_stack_invalid_input' => "Error interna; clau de pila no conforme. Isto no habría d'escaicer nunca.",
'cite_error' => 'Error en a cita: $1',
'cite_error_ref_numeric_key' => "Etiqueta <code>&lt;ref&gt;</code> incorreuta; o nombre d'a etiqueta no puede estar un numero entero, faiga servir un títol descriptivo",
'cite_error_ref_no_key' => 'Etiqueta <code>&lt;ref&gt;</code> incorreuta; as referencias sin de conteniu han de tener un nombre',
@@ -229,7 +239,7 @@ Defina-ne mas en o mensache <nowiki>[[MediaWiki:$2]]</nowiki>.',
'cite_error_references_no_text' => "Etiqueta <code>&lt;ref&gt;</code> incorreuta; no ha escrito garra testo t'as referencias nombratas <code>$1</code>",
'cite_error_included_ref' => 'Zarrando <code>&lt;/ref&gt;</code> falta una etiqueta <code>&lt;ref&gt;</code>',
'cite_error_refs_without_references' => 'Existen etiquetas <code>&lt;ref&gt;</code>, pero no se trobó garra etiqueta <code>&lt;references /&gt;</code>',
- 'cite_error_group_refs_without_references' => 'Existen etiquetas <code>&lt;ref&gt;</code> ta un grupo clamau "$1", pero no se trobó garra etiqueta <code>&lt;references group="$1"/&gt;</code>',
+ 'cite_error_group_refs_without_references' => 'Existen etiquetas <code>&lt;ref&gt;</code> ta un grupo clamau "$1", pero no se trobó garra etiqueta <code>&lt;references group="$1"/&gt;</code>', # Fuzzy
'cite_error_references_group_mismatch' => 'O tag <code>&lt;ref&gt;</code> en <code>&lt;references&gt;</code> presienta l\'atributo de grupo en conflicto "$1".',
'cite_error_references_missing_group' => 'O tag <code>&lt;ref&gt;</code> definiu en <code>&lt;references&gt;</code> incluye l\'atributo "$1" no declarau en o texto precedente.',
'cite_error_references_missing_key' => 'O tag <code>&lt;ref&gt;</code> con nombre "$1" definiu en <code>&lt;references&gt;</code> no s\'emplega en o texto precedente.',
@@ -241,16 +251,10 @@ Defina-ne mas en o mensache <nowiki>[[MediaWiki:$2]]</nowiki>.',
* @author Aiman titi
* @author Meno25
* @author OsamaK
+ * @author زكريا
*/
$messages['ar'] = array(
'cite-desc' => 'يضي٠وسوم <nowiki><ref[ name=id]></nowiki> و <nowiki><references/></nowiki> ، للاستشهادات',
- 'cite_croak' => 'الاستشهاد مات؛ $1: $2',
- 'cite_error_key_str_invalid' => 'خطأ داخلي؛
-$str و/أو $key غير صحيح.
-هذا لا يجب أن يحدث أبدا.',
- 'cite_error_stack_invalid_input' => 'خطأ داخلي؛
-Ù…Ùتاح ستاك غير صحيح.
-هذا لا يجب أن يحدث أبدا.',
'cite_error' => 'خطأ استشهاد: $1',
'cite_error_ref_numeric_key' => 'وسم <code>&lt;ref&gt;</code> غير صحيح؛
الاسم لا يمكن أن يكون عددا صحيحا بسيطا. استخدم عنوانا وصÙيا',
@@ -275,12 +279,13 @@ $str و/أو $key غير صحيح.
لا نص تم توÙيره للمراجع المسماة <code>$1</code>',
'cite_error_included_ref' => 'إغلاق <code>&lt;/ref&gt;</code> Ù…Ùقود لوسم <code>&lt;ref&gt;</code>',
'cite_error_refs_without_references' => 'وسم <code>&lt;ref&gt;</code> موجود، لكن لا وسم <code>&lt;references/&gt;</code> تم العثور عليه',
- 'cite_error_group_refs_without_references' => 'وسوم <code>&lt;ref&gt;</code> موجودة لمجموعة اسمها "$1"، لكن لا وسم <code>&lt;references group="$1"/&gt;</code> مماثل تم العثور عليه',
+ 'cite_error_group_refs_without_references' => 'وسوم <code>&lt;ref&gt;</code> موجودة لمجموعة اسمها "$1"، لكن لا وسم <code>&lt;references group="$1"/&gt;</code> مماثل تم العثور عليه', # Fuzzy
'cite_error_references_group_mismatch' => 'الوسم <code>&lt;ref&gt;</code> ÙÙŠ <code>&lt;references&gt;</code> Ùيه خاصية group متضاربة "$1".',
'cite_error_references_missing_group' => 'الوسم <code>&lt;ref&gt;</code> المÙعرّ٠ÙÙŠ <code>&lt;references&gt;</code> Ùيه خاصية group "$1" التي لا تظهر ÙÙŠ النص السابق.',
'cite_error_references_missing_key' => 'الوسم <code>&lt;ref&gt;</code> ذو الاسم "$1" المÙعرّ٠ÙÙŠ <code>&lt;references&gt;</code> غير مستخدم ÙÙŠ النص السابق.',
'cite_error_references_no_key' => 'الوسم <code>&lt;ref&gt;</code> المعر٠ÙÙŠ <code>&lt;references&gt;</code> ليس له خاصة اسم.',
'cite_error_empty_references_define' => 'الوسم <code>&lt;ref&gt;</code> المÙعرّ٠ÙÙŠ <code>&lt;references&gt;</code> بالاسم "$1" ليس له محتوى.',
+ 'cite_references_link_many' => '<li id="$1"><span class="mw-cite-backlink"><b>^</b> $2</span> $3</li>',
'cite_references_link_many_format_backlink_labels' => 'Ø£ ب ت Ø« ج Ø­ Ø® د Ø° ر ز س Ø´ ص ض Ø· ظ ع غ Ù Ù‚ Ùƒ Ù„ Ù… Ù† Ù‡ Ùˆ ÙŠ أأ أب أت أث أج أح أخ أد أذ أر أز أس أش أص أض أط أظ أع أغ أ٠أق أك أل أم أن أه أو أي بأ بب بت بث بج بح بخ بد بذ بر بز بس بش بص بض بط بظ بع بغ ب٠بق بك بل بم بن به بو بي تأ تب تت تث تج تح تخ تد تذ تر تز تس تش تص تض تط تظ تع تغ ت٠تق تك تل تم تن ته تو تي ثأ ثب ثت ثث ثج ثح ثخ ثد ثذ ثر ثز ثس ثش ثص ثض ثط ثظ ثع ثغ ث٠ثق ثك ثل ثم ثن ثه ثو ثي جأ جب جت جث جج جح جخ جد جذ جر جز جس جش جص جض جط جظ جع جغ ج٠جق جك جل جم جن جه جو جي حأ حب حت حث حج حح حخ حد حذ حر حز حس حش حص حض حط حظ حع حغ ح٠حق حك حل حم حن حه حو حي خأ خب خت خث خج خح خخ خد خذ خر خز خس خش خص خض خط خظ خع خغ خ٠خق خك خل خم خن خه خو خي دأ دب دت دث دج دح دخ دد دذ در دز دس دش دص دض دط دظ دع دغ د٠دق دك دل دم دن ده دو دي ذأ ذب ذت ذث ذج ذح ذخ ذد ذذ ذر ذز ذس ذش ذص ذض ذط ذظ ذع ذغ ذ٠ذق ذك ذل ذم ذن ذه ذو ذي رأ رب رت رث رج رح رخ رد رذ رر رز رس رش رص رض رط رظ رع رغ ر٠رق رك رل رم رن ره رو ري زأ زب زت زث زج زح زخ زد زذ زر زز زس زش زص زض زط زظ زع زغ ز٠زق زك زل زم زن زه زو زي سأ سب ست سث سج سح سخ سد سذ سر سز سس سش سص سض سط سظ سع سغ س٠سق سك سل سم سن سه سو سي شأ شب شت شث شج شح شخ شد شذ شر شز شس شش شص شض شط شظ شع شغ ش٠شق شك شل شم شن شه شو شي صأ صب صت صث صج صح صخ صد صذ صر صز صس صش صص صض صط صظ صع صغ ص٠صق صك صل صم صن صه صو صي ضأ ضب ضت ضث ضج ضح ضخ ضد ضذ ضر ضز ضس ضش ضص ضض ضط ضظ ضع ضغ ض٠ضق ضك ضل ضم ضن ضه ضو ضي طأ طب طت طث طج طح طخ طد طذ طر طز طس طش طص طض طط طظ طع طغ ط٠طق طك طل طم طن طه طو طي ظأ ظب ظت ظث ظج ظح ظخ ظد ظذ ظر ظز ظس ظش ظص ظض ظط ظظ ظع ظغ ظ٠ظق ظك ظل ظم ظن ظه ظو ظي عأ عب عت عث عج عح عخ عد عذ عر عز عس عش عص عض عط عظ عع عغ ع٠عق عك عل عم عن عه عو عي غأ غب غت غث غج غح غخ غد غذ غر غز غس غش غص غض غط غظ غع غغ غ٠غق غك غل غم غن غه غو غي ÙØ£ Ùب Ùت ÙØ« Ùج ÙØ­ ÙØ® Ùد ÙØ° Ùر Ùز Ùس ÙØ´ Ùص Ùض ÙØ· Ùظ Ùع Ùغ ÙÙ ÙÙ‚ ÙÙƒ ÙÙ„ ÙÙ… ÙÙ† ÙÙ‡ ÙÙˆ ÙÙŠ قأ قب قت قث قج قح قخ قد قذ قر قز قس قش قص قض قط قظ قع قغ ق٠قق قك قل قم قن قه قو قي كأ كب كت كث كج كح كخ كد كذ كر كز كس كش كص كض كط كظ كع كغ ك٠كق كك كل كم كن كه كو كي لأ لب لت لث لج لح لخ لد لذ لر لز لس لش لص لض لط لظ لع لغ ل٠لق لك لل لم لن له لو لي مأ مب مت مث مج مح مخ مد مذ مر مز مس مش مص مض مط مظ مع مغ م٠مق مك مل مم من مه مو مي نأ نب نت نث نج نح نخ ند نذ نر نز نس نش نص نض نط نظ نع نغ ن٠نق نك نل نم نن نه نو ني هأ هب هت هث هج هح هخ هد هذ هر هز هس هش هص هض هط هظ هع هغ ه٠هق هك هل هم هن هه هو هي وأ وب وت وث وج وح وخ ود وذ ور وز وس وش وص وض وط وظ وع وغ و٠وق وك ول وم ون وه وو وي يأ يب يت يث يج يح يخ يد يذ ير يز يس يش يص يض يط يظ يع يغ ي٠يق يك يل يم ين يه يو يي',
);
@@ -298,13 +303,6 @@ $messages['arc'] = array(
*/
$messages['arz'] = array(
'cite-desc' => 'بيضي٠التاجز <nowiki><ref[ name=id]></nowiki> و <nowiki><references/></nowiki> ، للاستشهاد',
- 'cite_croak' => 'المرجع مات; $1: $2',
- 'cite_error_key_str_invalid' => 'غلط داخلى؛
-$str و/أو $key غلط.
-ده لازم مايحصلش ابدا.',
- 'cite_error_stack_invalid_input' => 'غلط داخلى؛
-Ù…Ùتاح ستاك مش صحيح.
-ده لازم مايحصلش ابدا',
'cite_error' => 'المرجع غلط: $1',
'cite_error_ref_numeric_key' => 'التاج <code>&lt;ref&gt;</code> مش صحيح؛
الاسم ماينÙعش يكون عدد صحيح بسيط. استخدم عنوان بيوصÙ',
@@ -326,24 +324,17 @@ $str و/أو $key غلط.
ماÙيش نص متواÙر ÙÙ‰ المراجع اللى اسمها<code>$1</code>',
'cite_error_included_ref' => 'إغلاق <code>&lt;/ref&gt;</code> Ù…Ùقود لوسم <code>&lt;ref&gt;</code>',
'cite_error_refs_without_references' => '<code>&lt;ref&gt;</code> التاجز موجوده, بس ماÙيش <code>&lt;references/&gt;</code> تاجز اتلقت',
- 'cite_error_group_refs_without_references' => '<code>&lt;ref&gt;</code> ÙÙ‰ تاجز موجوده لمجموعه اسمها "$1", بس ماÙيش مقابلها تاجز <code>&lt;references group="$1"/&gt;</code> اتلقت',
+ 'cite_error_group_refs_without_references' => '<code>&lt;ref&gt;</code> ÙÙ‰ تاجز موجوده لمجموعه اسمها "$1", بس ماÙيش مقابلها تاجز <code>&lt;references group="$1"/&gt;</code> اتلقت', # Fuzzy
'cite_references_link_many_format_backlink_labels' => 'Ø£ ب ت Ø« ج Ø­ Ø® د Ø° ر ز س Ø´ ص ض Ø· ظ ع غ Ù Ù‚ Ùƒ Ù„ Ù… Ù† Ù‡ Ùˆ Ù‰ أأ أب أت أث أج أح أخ أد أذ أر أز أس أش أص أض أط أظ أع أغ أ٠أق أك أل أم أن أه أو أى بأ بب بت بث بج بح بخ بد بذ بر بز بس بش بص بض بط بظ بع بغ ب٠بق بك بل بم بن به بو بى تأ تب تت تث تج تح تخ تد تذ تر تز تس تش تص تض تط تظ تع تغ ت٠تق تك تل تم تن ته تو تى ثأ ثب ثت ثث ثج ثح ثخ ثد ثذ ثر ثز ثس ثش ثص ثض ثط ثظ ثع ثغ ث٠ثق ثك ثل ثم ثن ثه ثو ثى جأ جب جت جث جج جح جخ جد جذ جر جز جس جش جص جض جط جظ جع جغ ج٠جق جك جل جم جن جه جو جى حأ حب حت حث حج حح حخ حد حذ حر حز حس حش حص حض حط حظ حع حغ ح٠حق حك حل حم حن حه حو حى خأ خب خت خث خج خح خخ خد خذ خر خز خس خش خص خض خط خظ خع خغ خ٠خق خك خل خم خن خه خو خى دأ دب دت دث دج دح دخ دد دذ در دز دس دش دص دض دط دظ دع دغ د٠دق دك دل دم دن ده دو دى ذأ ذب ذت ذث ذج ذح ذخ ذد ذذ ذر ذز ذس ذش ذص ذض ذط ذظ ذع ذغ ذ٠ذق ذك ذل ذم ذن ذه ذو ذى رأ رب رت رث رج رح رخ رد رذ رر رز رس رش رص رض رط رظ رع رغ ر٠رق رك رل رم رن ره رو رى زأ زب زت زث زج زح زخ زد زذ زر زز زس زش زص زض زط زظ زع زغ ز٠زق زك زل زم زن زه زو زى سأ سب ست سث سج سح سخ سد سذ سر سز سس سش سص سض سط سظ سع سغ س٠سق سك سل سم سن سه سو سى شأ شب شت شث شج شح شخ شد شذ شر شز شس شش شص شض شط شظ شع شغ ش٠شق شك شل شم شن شه شو شى صأ صب صت صث صج صح صخ صد صذ صر صز صس صش صص صض صط صظ صع صغ ص٠صق صك صل صم صن صه صو صى ضأ ضب ضت ضث ضج ضح ضخ ضد ضذ ضر ضز ضس ضش ضص ضض ضط ضظ ضع ضغ ض٠ضق ضك ضل ضم ضن ضه ضو ضى طأ طب طت طث طج طح طخ طد طذ طر طز طس طش طص طض طط طظ طع طغ ط٠طق طك طل طم طن طه طو طى ظأ ظب ظت ظث ظج ظح ظخ ظد ظذ ظر ظز ظس ظش ظص ظض ظط ظظ ظع ظغ ظ٠ظق ظك ظل ظم ظن ظه ظو ظى عأ عب عت عث عج عح عخ عد عذ عر عز عس عش عص عض عط عظ عع عغ ع٠عق عك عل عم عن عه عو عى غأ غب غت غث غج غح غخ غد غذ غر غز غس غش غص غض غط غظ غع غغ غ٠غق غك غل غم غن غه غو غى ÙØ£ Ùب Ùت ÙØ« Ùج ÙØ­ ÙØ® Ùد ÙØ° Ùر Ùز Ùس ÙØ´ Ùص Ùض ÙØ· Ùظ Ùع Ùغ ÙÙ ÙÙ‚ ÙÙƒ ÙÙ„ ÙÙ… ÙÙ† ÙÙ‡ ÙÙˆ ÙÙ‰ قأ قب قت قث قج قح قخ قد قذ قر قز قس قش قص قض قط قظ قع قغ ق٠قق قك قل قم قن قه قو قى كأ كب كت كث كج كح كخ كد كذ كر كز كس كش كص كض كط كظ كع كغ ك٠كق كك كل كم كن كه كو كى لأ لب لت لث لج لح لخ لد لذ لر لز لس لش لص لض لط لظ لع لغ ل٠لق لك لل لم لن له لو لى مأ مب مت مث مج مح مخ مد مذ مر مز مس مش مص مض مط مظ مع مغ م٠مق مك مل مم من مه مو مى نأ نب نت نث نج نح نخ ند نذ نر نز نس نش نص نض نط نظ نع نغ ن٠نق نك نل نم نن نه نو نى هأ هب هت هث هج هح هخ هد هذ هر هز هس هش هص هض هط هظ هع هغ ه٠هق هك هل هم هن هه هو هى وأ وب وت وث وج وح وخ ود وذ ور وز وس وش وص وض وط وظ وع وغ و٠وق وك ول وم ون وه وو وى يأ يب يت يث يج يح يخ يد يذ ير يز يس يش يص يض يط يظ يع يغ ي٠يق يك يل يم ين يه يو يى',
);
-/** Assamese (অসমীয়া)
+/** Assamese (অসমীয়া)
* @author Bishnu Saikia
* @author Gitartha.bordoloi
* @author Reedy
*/
$messages['as'] = array(
'cite-desc' => 'উদà§à¦§à§ƒà¦¤à¦¿à§° বাবে <nowiki><ref[ name=id]></nowiki> আৰৠ<nowiki><references/></nowiki> টেগà§â€Œà¦¸à¦®à§‚হ যোগ কৰে',
- 'cite_croak' => 'উদà§à¦§à§ƒà¦¤à¦¿à§° অনà§à¦¤ পৰিছে; $1: $2',
- 'cite_error_key_str_invalid' => 'আভà§à¦¯à¦¨à§à¦¤à§°à§€à¦£ তà§à§°à§à¦Ÿà¦¿;
-অবৈধ $str আৰà§/বা $key।
-à¦à¦‡à¦Ÿà§‹ কেতিয়াও হোৱা উচিত নহয়।',
- 'cite_error_stack_invalid_input' => 'আভà§à¦¯à¦¨à§à¦¤à§°à§€à¦£ তà§à§°à§à¦Ÿà¦¿;
-অবৈধ ষà§à¦Ÿà§‡à¦• কী।
-à¦à¦‡à¦Ÿà§‹ কেতিয়াও হোৱা উচিত নহয়।',
'cite_error' => 'উদà§à¦§à§ƒà¦¤à¦¿ তà§à§°à§à¦Ÿà¦¿: $1',
'cite_error_ref_numeric_key' => "অবৈধ <code>&lt;ref&gt;</code> টেগ;
নাম কোনো সৰল পূৰà§à¦£à¦¸à¦‚খà§à¦¯à¦¾ হ'ব নোৱাৰে। à¦à¦Ÿà¦¾ বৰà§à¦£à¦¨à¦¾à¦®à§‚লক শিৰোনাম বà§à¦¯à§±à¦¹à¦¾à§° কৰক।",
@@ -367,7 +358,7 @@ $messages['as'] = array(
<code>$1</code> নামৰ refৰ বাবে কোনো পাঠà§à¦¯ পà§à§°à¦¦à¦¾à¦¨ কৰা হোৱা নাই',
'cite_error_included_ref' => '<code>&lt;/ref&gt;</code> বনà§à¦§ কৰা হৈছে; <code>&lt;ref&gt;</code> টেগৰ বাবে পোৱা নাই',
'cite_error_refs_without_references' => "<code>&lt;ref&gt;</code> টেগà§â€Œà¦¸à¦®à§‚হ আছে, কিনà§à¦¤à§ কোনো <code>&lt;references/&gt;</code> বা <code>&#123;&#123;Reflist&#125;&#125;</code> টেগà§â€Œ পোৱা নগ'ল। অনà§à¦—à§à§°à¦¹ কৰি পà§à§°à¦¬à¦¨à§à¦§à§° শেষ অংশত ওপৰোকà§à¦¤ টেগà§â€Œ যোগ দিয়ক।",
- 'cite_error_group_refs_without_references' => '<code>&lt;ref&gt;</code> টেগà§â€Œà¦¸à¦®à§‚হ "$1" নামৰ à¦à¦Ÿà¦¾ গোটৰ বাবে আছে, কিনà§à¦¤à§ তাৰ <code>&lt;references group="$1"/&gt;</code> টেগà§â€Œ পোৱা নগ\'ল',
+ 'cite_error_group_refs_without_references' => '<code>&lt;ref&gt;</code> টেগà§â€Œà¦¸à¦®à§‚হ "$1" নামৰ à¦à¦Ÿà¦¾ গোটৰ বাবে আছে, কিনà§à¦¤à§ তাৰ <code>&lt;references group="$1"/&gt;</code> টেগà§â€Œ পোৱা নগ\'ল', # Fuzzy
'cite_error_references_group_mismatch' => '"$1" গোটৰ কà§à¦·à§‡à¦¤à§à§°à¦¤ <code>&lt;references&gt;</code>ৰ <code>&lt;ref&gt;</code> টেগà§â€Œ বà§à¦¯à§±à¦¹à¦¾à§°à¦¤ সমসà§à¦¯à¦¾ হৈছে।',
'cite_error_references_missing_group' => '<code>&lt;references&gt;</code>ত দিয়া <code>&lt;ref&gt;</code> টেগৰ "$1" গোট à¦à¦Ÿà§à¦Ÿà§à§°à¦¿à¦¬à¦¿à¦‰à¦Ÿ আছে, যিটো পূৰà§à¦¬à§° পাঠà§à¦¯à¦¤ ওলোৱা নাই।',
'cite_error_references_missing_key' => '<code>&lt;references&gt;</code>ত দিয়া "$1" নামৰ <code>&lt;ref&gt;</code> টেগà§â€Œà¦Ÿà§‹ পূৰà§à¦¬à§° পাঠà§à¦¯à¦¤ বà§à¦¯à§±à¦¹à¦¾à§° কৰা নাই।',
@@ -381,13 +372,6 @@ $messages['as'] = array(
*/
$messages['ast'] = array(
'cite-desc' => 'Añade les etiquetes <nowiki><ref[ name=id]></nowiki> y <nowiki><references/></nowiki> pa les cites',
- 'cite_croak' => 'Cita corrompida; $1: $2',
- 'cite_error_key_str_invalid' => 'Error internu;
-$str y/o $key inválidos.
-Esto nun tendría d\'asoceder nunca.',
- 'cite_error_stack_invalid_input' => "Error internu;
-clave de pila inválida.
-Esto nun tendría d'asoceder nunca.",
'cite_error' => 'Error de cita: $1',
'cite_error_ref_numeric_key' => 'Etiqueta <code>&lt;ref&gt;</code> non válida; el nome nun pue ser un enteru simple, usa un títulu descriptivu',
'cite_error_ref_no_key' => 'Etiqueta <code>&lt;ref&gt;</code> non válida; les referencies ensin conteníu han tener un nome',
@@ -404,12 +388,14 @@ Define más nel mensaxe <nowiki>[[MediaWiki:$2]]</nowiki>.',
'cite_error_references_no_text' => 'Etiqueta <code>&lt;ref&gt;</code> non válida; nun se conseñó testu pa les referencies nomaes <code>$1</code>',
'cite_error_included_ref' => 'Falta <code>&lt;/ref&gt;</code> pa la etiqueta <code>&lt;ref&gt;</code>',
'cite_error_refs_without_references' => "Les etiquetes <code>&lt;ref&gt;</code> esisten, pero nun s'alcontró denguna etiqueta <code>&lt;references/&gt;</code>",
- 'cite_error_group_refs_without_references' => 'Les etiquetes <code>&lt;ref&gt;</code> esisten pa un grupu llamáu "$1", pero nun s\'alcontró la etiqueta <code>&lt;references group="$1"/&gt;</code> correspondiente',
+ 'cite_error_group_refs_without_references' => 'Les etiquetes <code>&lt;ref&gt;</code> esisten pa un grupu llamáu "$1", pero nun s\'alcontró la etiqueta <code>&lt;references group="$1"/&gt;</code> correspondiente, o falta un cierre <code>&lt;/ref&gt;</code>',
'cite_error_references_group_mismatch' => 'La etiqueta <code>&lt;ref&gt;</code> en <code>&lt;references&gt;</code> tien un conflictu col atributu de grupu "$1".',
'cite_error_references_missing_group' => 'La etiqueta <code>&lt;ref&gt;</code> definida en <code>&lt;references&gt;</code> tien l\'atributu de grupu "$1" que nun apaez nel testu anterior.',
'cite_error_references_missing_key' => 'La etiqueta <code>&lt;ref&gt;</code> col nome "$1" definida en <code>&lt;references&gt;</code> nun s\'utiliza nel testu anterior.',
'cite_error_references_no_key' => 'La etiqueta <code>&lt;ref&gt;</code> definida en <code>&lt;references&gt;</code> nun tien dengún atributu de nome.',
'cite_error_empty_references_define' => 'La etiqueta <code>&lt;ref&gt;</code> definida en <code>&lt;references&gt;</code> col nome "$1" nun tien conteníu.',
+ 'cite_references_link_accessibility_label' => 'Saltar arriba',
+ 'cite_references_link_many_accessibility_label' => 'Saltar a:',
);
/** Azerbaijani (azərbaycanca)
@@ -430,13 +416,6 @@ $messages['az'] = array(
*/
$messages['azb'] = array(
'cite-desc' => 'گؤتورمه‌لر اوچون، <nowiki><ref[ name=id]></nowiki> ve <nowiki><references/></nowiki> ائلئمئنت‌لری‌نین علاوه‌لر',
- 'cite_croak' => 'سیتات کایبئدیلدی؛ $1: $2',
- 'cite_error_key_str_invalid' => 'داخی‌لی ختا؛
-اعتبارسیز $ کوچ و / یا دا $ کئی.
-بو اصلا اولماما‌لی.',
- 'cite_error_stack_invalid_input' => 'داخی‌لی ختا؛
-اعتبارسیز ایستاجک آچاری.
-بو اصلا اولماما‌لی.',
'cite_error' => 'قایناق خطاسی $1',
);
@@ -445,13 +424,6 @@ $messages['azb'] = array(
*/
$messages['ba'] = array(
'cite-desc' => 'Төшөрмәләр Ó©Ñөн <nowiki><ref[ name=id]></nowiki> һәм <nowiki><references/></nowiki> билдәләрен өҫтәй',
- 'cite_croak' => 'Өҙөмтә юғалған; $1: $2',
- 'cite_error_key_str_invalid' => 'ЭÑке хата;
-$str һәм/йәки $key дөрөҫ түгел.
-Был бер ҡаÑан да булырға тейеш түгел.',
- 'cite_error_stack_invalid_input' => 'ЭÑке хата;
-Стек аÑÒ¡Ñ‹ÑÑ‹ дөрөҫ түгел.
-Был бер ҡаÑан да булырға тейеш түгел.',
'cite_error' => 'Өҙөмтә хатаһы: $1',
'cite_error_ref_numeric_key' => '<code>&lt;ref&gt;</code> билдәһе дөрөҫ түгел;
иÑем бөтөн һан була алмай. ТаÑуирларлыҡ иÑем ҡулланығыҙ.',
@@ -475,7 +447,7 @@ $str һәм/йәки $key дөрөҫ түгел.
<code>$1</code> төшөрмәләре Ó©Ñөн текÑÑ‚ ÑŽÒ¡',
'cite_error_included_ref' => '<code>&lt;ref&gt;</code> билдәһе Ó©Ñөн <code>&lt;/ref&gt;</code> Ñбыу билдәһе ÑŽÒ¡',
'cite_error_refs_without_references' => '<code>&lt;ref&gt;</code> билдәһе бар, әммә <code>&lt;references/&gt;</code> билдәһе юҡ',
- 'cite_error_group_refs_without_references' => '"$1" төркөмө Ó©Ñөн <code>&lt;ref&gt;</code> билдәһе бар, әммә <code>&lt;references group="$1"/&gt;</code> билдәһе ÑŽÒ¡',
+ 'cite_error_group_refs_without_references' => '"$1" төркөмө Ó©Ñөн <code>&lt;ref&gt;</code> билдәһе бар, әммә <code>&lt;references group="$1"/&gt;</code> билдәһе ÑŽÒ¡', # Fuzzy
'cite_error_references_group_mismatch' => '<code>&lt;references&gt;</code> билдәһенең <code>&lt;ref&gt;</code> билдәһендә "$1" төркөмө атрибуты ҡаршылыҡтар тыуҙыра.',
'cite_error_references_missing_group' => '<code>&lt;references&gt;</code> билдәһенең <code>&lt;ref&gt;</code> билдәһендә "$1" төркөмө атрибуты үрҙәге текÑта оÑрамай.',
'cite_error_references_missing_key' => '<code>&lt;references&gt;</code> билдәһенең "$1" иÑемле <code>&lt;ref&gt;</code> билдәһе үрҙәге текÑта ҡулланылмай.',
@@ -488,13 +460,6 @@ $str һәм/йәки $key дөрөҫ түгел.
*/
$messages['bcc'] = array(
'cite-desc' => 'اضÙاÙÙ‡ کنت<nowiki><ref[ name=id]></nowiki> Ùˆ <nowiki><references/></nowiki> تگ, په ارجاع دهگ',
- 'cite_croak' => 'ذکر منبع چه بن رپت; $1: $2',
- 'cite_error_key_str_invalid' => 'حطا درونی ;
-نامعتبرین $str و/یا $key.
-شی نباید هچ وهد پیش کیت',
- 'cite_error_stack_invalid_input' => 'درونی حطا;
-نامعتربین دسته کلیت.
-شی نبایدن هچ وهد پیش کیت.',
'cite_error' => 'حطا ارجاع: $1',
'cite_error_ref_numeric_key' => 'نامعتبر <code>&lt;ref&gt;</code>تگ;
نام یک سادگین هوری نه نه بیت. یک توضیحی عنوانی استÙاده کنیت',
@@ -521,20 +486,43 @@ $messages['bcc'] = array(
'cite_references_link_many_and' => 'Ùˆ',
);
+/** Bikol Central (Bikol Central)
+ * @author Geopoet
+ */
+$messages['bcl'] = array(
+ 'cite-desc' => 'Minadugang nin <nowiki><ref[ name=id]></nowiki> asin <nowiki><references/></nowiki> na mga tatak, para sa mga toltolan',
+ 'cite_error' => 'Sambiton an kasalaan: $1',
+ 'cite_error_ref_numeric_key' => 'Imbalido an <code>&lt;ref&gt;</code> tatak; an pangaran dae puwede na magin sarong simplehon na bilog na numero. Maggamit nin sarong deskriptibong titulo',
+ 'cite_error_ref_no_key' => 'Imbalido an <code>&lt;ref&gt;</code> tatak; an mga toltolan na mayong kalamnan dapat magkaigwa nin pangaran',
+ 'cite_error_ref_too_many_keys' => 'Imbalido an <code>&lt;ref&gt;</code> tatak; imbalidong mga pangaran, e.g. grabe kadakol',
+ 'cite_error_ref_no_input' => 'Imbalido an <code>&lt;ref&gt;</code> tatak; an mga toltolan na mayong pangaran dapat magkaigwa nin kalamnan',
+ 'cite_error_references_invalid_parameters' => 'Imbalido an <code>&lt;references&gt;</code> tatak; mayong mga parametro an pinagtutugot. Maggamit nin <code>&lt;mga toltolan /&gt;</code>',
+ 'cite_error_references_invalid_parameters_group' => 'Imbalido an <code>&lt;references&gt;</code> tatak; an parametrong "grupo" sana an pinagtutugot. Maggamit nin <code>&lt;mga toltolan /&gt;</code>, o <code>&lt;mga toltolang grupo="..." /&gt;</code>',
+ 'cite_error_references_no_backlink_label' => 'Naubusan nin pankostumbreng sugpon-panlikod na kamarkahan.
+Pakahulugan nin dagdag tabi an <nowiki>[[MediaWiki:Cite references link many format backlink labels]]</nowiki> mensahe.',
+ 'cite_error_no_link_label_group' => 'Naubusan nin pankostumbreng sugpon nin mga kamarkahan para sa grupo "$1".
+Pakahulugan nin dagdag tabi an <nowiki>[[MediaWiki:$2]]</nowiki> mensahe.',
+ 'cite_error_references_no_text' => 'Imbalidong <code>&lt;ref&gt;</code> tatak; mayong teksto na ipinagtao para sa reperensiya na pinagngaranan na <code>$1</code>',
+ 'cite_error_included_ref' => 'Ipinagsasara <code>&lt;/ref&gt;</code> nawawara para sa <code>&lt;ref&gt;</code> na tatak',
+ 'cite_error_refs_without_references' => '<code>&lt;ref&gt;</code> mga tatak eksistido na, alagad mayo nin <code>&lt;references/&gt;</code> na tatak an nanagboan',
+ 'cite_error_group_refs_without_references' => '<code>&lt;ref&gt;</code> mga tatak na eksistido para sa sarong grupo na pinagngaranan na "$1", alagad mayong kinasungkoan na <code>&lt;mga pinapanungdanan na grupo="$1"/&gt;</code>na tatak an nanagboan, o sarong panarado <code>&lt;/ref&gt;</code> an nawawara',
+ 'cite_error_references_group_mismatch' => '<code>&lt;ref&gt;</code> tatak sa laog na <code>&lt;references&gt;</code> igwa nin pangrupong kumplikto sa hitsurahon na "$1".',
+ 'cite_error_references_missing_group' => '<code>&lt;ref&gt;</code> tatak na pinagkahulugan sa <code>&lt;references&gt;</code> igwa nin pangrupong hitsurahon na "$1" na dae ipinapahiling sa nakaaging teksto.',
+ 'cite_error_references_missing_key' => '<code>&lt;ref&gt;</code> tatak na igwang pangaran na "$1" na pinagkahulugan sa <code>&lt;references&gt;</code> na dae pinaggagamit sa nakaaging teksto.',
+ 'cite_error_references_no_key' => '<code>&lt;ref&gt;</code> tatak na pinagkahulugan sa <code>&lt;references&gt;</code> na mayo nin hitsurahon sa pangaran.',
+ 'cite_error_empty_references_define' => '<code>&lt;ref&gt;</code> tatak na pinagkahulugan sa <code>&lt;references&gt;</code> na igwang pangaran na "$1" na mayo tabing kalamnan.',
+ 'cite_references_link_accessibility_label' => 'Lukso paitaas',
+ 'cite_references_link_many_accessibility_label' => 'Lukso paitaas paduman sa:',
+);
+
/** Belarusian (TaraÅ¡kievica orthography) (беларуÑÐºÐ°Ñ (тарашкевіца)‎)
* @author EugeneZelenko
* @author Jim-by
* @author Red Winged Duck
+ * @author Wizardist
*/
$messages['be-tarask'] = array(
'cite-desc' => 'Дадае Ñ‚Ñгі <nowiki><ref[ name=id]></nowiki> Ñ– <nowiki><references/></nowiki> Ð´Ð»Ñ Ð·Ð½Ð¾Ñак',
- 'cite_croak' => 'ÐÑўдалае цытаваньне; $1: $2',
- 'cite_error_key_str_invalid' => 'Ð£Ð½ÑƒÑ‚Ñ€Ð°Ð½Ð°Ñ Ð¿Ð°Ð¼Ñ‹Ð»ÐºÐ°;
-нÑÑлушны $str Ñ–/ці $key.
-ГÑтага ніколі не павінна быць.',
- 'cite_error_stack_invalid_input' => 'Ð£Ð½ÑƒÑ‚Ñ€Ð°Ð½Ð°Ñ Ð¿Ð°Ð¼Ñ‹Ð»ÐºÐ°;
-нÑÑлушны ключ ÑÑ‚Ñку.
-ГÑтага ніколі не павінна быць.',
'cite_error' => 'Памылка цытаваньнÑ: $1',
'cite_error_ref_numeric_key' => 'ÐÑÑлушны Ñ‚Ñг <code>&lt;ref&gt;</code>;
назва Ð½Ñ Ð¼Ð¾Ð¶Ð° быць проÑта лікам, ужывайце апіÑальную назву',
@@ -558,12 +546,14 @@ $messages['be-tarask'] = array(
нÑма Ñ‚ÑкÑту Ñž назьве зноÑак <code>$1</code>',
'cite_error_included_ref' => 'ÐÑма закрываючага Ñ‚Ñга <code>&lt;/ref&gt;</code> паÑÑŒÐ»Ñ Ð°Ð´ÐºÑ€Ñ‹Ñ‚Ð°Ð³Ð° Ñ‚Ñга <code>&lt;ref&gt;</code>',
'cite_error_refs_without_references' => 'ТÑг <code>&lt;ref&gt;</code> Ñ–Ñнуе, але Ð½Ñ Ð·Ð½Ð¾Ð¹Ð´Ð·ÐµÐ½Ð° Ñ‚Ñга <code>&lt;references/&gt;</code>',
- 'cite_error_group_refs_without_references' => 'ТÑг <code>&lt;ref&gt;</code> Ñ–Ñнуе Ð´Ð»Ñ Ð³Ñ€ÑƒÐ¿Ñ‹ «$1», але адпаведнага Ñ‚Ñга <code>&lt;references group="$1"/&gt;</code> Ð½Ñ Ð·Ð½Ð¾Ð¹Ð´Ð·ÐµÐ½Ð°',
+ 'cite_error_group_refs_without_references' => 'ТÑг <code>&lt;ref&gt;</code> Ñ–Ñнуе Ð´Ð»Ñ Ð³Ñ€ÑƒÐ¿Ñ‹ «$1», але адпаведнага Ñ‚Ñга <code>&lt;references group="$1"/&gt;</code> Ð½Ñ Ð·Ð½Ð¾Ð¹Ð´Ð·ÐµÐ½Ð°. Магчыма, адÑутнічае фінальны Ñ‚Ñг <code>&lt;/ref&gt;</code>',
'cite_error_references_group_mismatch' => 'ТÑг <code>&lt;ref&gt;</code> у <code>&lt;references&gt;</code> утрымлівае канфліктуючы атрыбут групы «$1».',
'cite_error_references_missing_group' => 'ТÑг <code>&lt;ref&gt;</code> вызначаны Ñž <code>&lt;references&gt;</code> утрымлівае атрыбут групы «$1», Ñкі раней не выкарыÑтоўваўÑÑ Ñž Ñ‚ÑкÑьце.',
'cite_error_references_missing_key' => 'ТÑг <code>&lt;ref&gt;</code> з назвай «$1» вызначаны Ñž <code>&lt;references&gt;</code> не выкарыÑтоўваўÑÑ Ñž папÑÑ€Ñднім Ñ‚ÑкÑьце.',
'cite_error_references_no_key' => 'ТÑг <code>&lt;ref&gt;</code> вызначаны Ñž <code>&lt;references&gt;</code> Ð½Ñ Ð¼Ð°Ðµ атрыбуту назвы.',
'cite_error_empty_references_define' => 'ТÑг <code>&lt;ref&gt;</code> вызначаны Ñž <code>&lt;references&gt;</code> з назвай «$1» Ð½Ñ Ð¼Ð°Ðµ зьмеÑту.',
+ 'cite_references_link_accessibility_label' => 'Угару',
+ 'cite_references_link_many_accessibility_label' => 'Угару да:',
);
/** Bulgarian (българÑки)
@@ -573,9 +563,6 @@ $messages['be-tarask'] = array(
*/
$messages['bg'] = array(
'cite-desc' => 'Ð”Ð¾Ð±Ð°Ð²Ñ ÐµÑ‚Ð¸ÐºÐµÑ‚Ð¸Ñ‚Ðµ <nowiki><ref[ name=id]></nowiki> и <nowiki><references/></nowiki>, подходÑщи за цитиране',
- 'cite_croak' => 'Цитиращата ÑиÑтема Ñе Ñрути; $1: $2',
- 'cite_error_key_str_invalid' => 'Вътрешна грешка: невалиден параметър $str и/или $key. Това не би Ñ‚Ñ€Ñбвало да Ñе Ñлучва никога.',
- 'cite_error_stack_invalid_input' => "'''Вътрешна грешка:''' невалиден ключ на Ñтека. Това не би Ñ‚Ñ€Ñбвало да Ñе Ñлучва никога.",
'cite_error' => 'Грешка при цитиране: $1',
'cite_error_ref_numeric_key' => "'''Грешка в етикет <code>&lt;ref&gt;</code>:''' името не може да бъде чиÑло, използва Ñе опиÑателно име",
'cite_error_ref_no_key' => "'''Грешка в етикет <code>&lt;ref&gt;</code>:''' етикетите без Ñъдържание Ñ‚Ñ€Ñбва да имат име",
@@ -590,24 +577,22 @@ $messages['bg'] = array(
'cite_error_references_no_text' => "'''Грешка в етикет <code>&lt;ref&gt;</code>:''' не е подаден текÑÑ‚ за бележките на име <code>$1</code>",
'cite_error_included_ref' => 'ЛипÑва затварÑщ етикет <code>&lt;/ref&gt;</code> Ñлед отварÑÑ‰Ð¸Ñ ÐµÑ‚Ð¸ÐºÐµÑ‚ <code>&lt;ref&gt;</code>',
'cite_error_refs_without_references' => 'ПриÑÑŠÑтват етикети <code>&lt;ref&gt;</code>; липÑва етикет <code>&lt;references/&gt;</code>',
- 'cite_error_group_refs_without_references' => 'ПриÑÑŠÑтват етикети <code>&lt;ref&gt;</code> за групата "$1"; но липÑва ÑъответниÑÑ‚ етикет <code>&lt;references group="$1"/&gt;</code>',
+ 'cite_error_group_refs_without_references' => 'ПриÑÑŠÑтват етикети <code>&lt;ref&gt;</code> за групата "$1"; но липÑва ÑъответниÑÑ‚ етикет <code>&lt;references group="$1"/&gt;</code>', # Fuzzy
);
/** Bengali (বাংলা)
+ * @author Aftab1995
* @author Bellayet
* @author Nasir8891
* @author Zaheen
*/
$messages['bn'] = array(
- 'cite-desc' => 'উদà§à¦§à§ƒà¦¤à¦¿à¦° জনà§à¦¯ <nowiki><ref[ name=id]></nowiki> à¦à¦¬à¦‚ <nowiki><references/></nowiki> টà§à¦¯à¦¾à¦—সমূহ যোগ করà§à¦¨',
- 'cite_croak' => 'উদà§à¦§à§ƒà¦¤à¦¿ কà§à¦°à§‹à¦• করা হয়েছে; $1: $2',
- 'cite_error_key_str_invalid' => 'আভà§à¦¯à¦¨à§à¦¤à¦°à§€à¦¨ তà§à¦°à§à¦Ÿà¦¿; অবৈধ $str à¦à¦¬à¦‚/অথবা $key। à¦à¦Ÿà¦¾ কখনই ঘটা উচিত নয়।',
- 'cite_error_stack_invalid_input' => 'আভà§à¦¯à¦¨à§à¦¤à¦°à§€à¦¨ তà§à¦°à§à¦Ÿà¦¿; অবৈধ সà§à¦Ÿà§à¦¯à¦¾à¦• কি। à¦à¦Ÿà¦¾ কখনই ঘটা উচিত নয়।',
+ 'cite-desc' => 'উদà§à¦§à§ƒà¦¤à¦¿à¦° জনà§à¦¯, <nowiki><ref[ name=id]></nowiki> à¦à¦¬à¦‚ <nowiki><references/></nowiki> টà§à¦¯à¦¾à¦—সমূহ যোগ করà§à¦¨',
'cite_error' => 'উদà§à¦§à§ƒà¦¤à¦¿ তà§à¦°à§à¦Ÿà¦¿: $1',
'cite_error_ref_numeric_key' => 'অবৈধ <code>&lt;ref&gt;</code> টà§à¦¯à¦¾à¦—; নাম কোন সরল পূরà§à¦£à¦¸à¦‚খà§à¦¯à¦¾ হতে পারবেনা, à¦à¦•à¦Ÿà¦¿ বিবরণমূলক শিরোনাম বà§à¦¯à¦¬à¦¹à¦¾à¦° করà§à¦¨',
- 'cite_error_ref_no_key' => 'অবৈধ <code>&lt;ref&gt;</code> টà§à¦¯à¦¾à¦—; বিষয়বসà§à¦¤à§à¦¹à§€à¦¨ refসমূহের অবশà§à¦¯à¦‡ নাম থাকতে হবে',
+ 'cite_error_ref_no_key' => 'অবৈধ <code>&lt;ref&gt;</code> টà§à¦¯à¦¾à¦—; বিষয়বসà§à¦¤à§à¦¹à§€à¦¨ ref সমূহের অবশà§à¦¯à¦‡ নাম থাকতে হবে',
'cite_error_ref_too_many_keys' => 'অবৈধ <code>&lt;ref&gt;</code> টà§à¦¯à¦¾à¦—; অবৈধ নাম (যেমন- সংখà§à¦¯à¦¾à¦¤à¦¿à¦°à¦¿à¦•à§à¦¤)',
- 'cite_error_ref_no_input' => 'অবৈধ <code>&lt;ref&gt;</code> টà§à¦¯à¦¾à¦—; নামবিহীন refসমূহের অবশà§à¦¯à¦‡ বিষয়বসà§à¦¤à§ থাকতে হবে',
+ 'cite_error_ref_no_input' => 'অবৈধ <code>&lt;ref&gt;</code> টà§à¦¯à¦¾à¦—; নামবিহীন ref সমূহের অবশà§à¦¯à¦‡ বিষয়বসà§à¦¤à§ থাকতে হবে',
'cite_error_references_invalid_parameters' => 'অবৈধ <code>&lt;ref&gt;</code> টà§à¦¯à¦¾à¦—; কোন পà§à¦¯à¦¾à¦°à¦¾à¦®à¦¿à¦Ÿà¦¾à¦° অনà§à¦®à§‹à¦¦à¦¿à¦¤ নয়, <code>&lt;references /&gt;</code> বà§à¦¯à¦¬à¦¹à¦¾à¦° করà§à¦¨',
'cite_error_references_invalid_parameters_group' => 'তà§à¦°à§à¦Ÿà¦¿à¦ªà§‚রà§à¦£ <code>&lt;references&gt;</code> টà§à¦¯à¦¾à¦—;
কেবলমাতà§à¦° "group" পà§à¦¯à¦¾à¦°à¦¾à¦®à¦¿à¦Ÿà¦¾à¦° বà§à¦¯à¦¬à¦¹à¦¾à¦° কর যাবে।
@@ -616,25 +601,19 @@ $messages['bn'] = array(
<nowiki>[[MediaWiki:Cite references link many format backlink labels]]</nowiki> বারà§à¦¤à¦¾à¦¯à¦¼ আরও সংজà§à¦žà¦¾à¦¯à¦¼à¦¿à¦¤ করà§à¦¨',
'cite_error_no_link_label_group' => 'গà§à¦°à§à¦ª "$1" à¦à¦° জনà§à¦¯ কাসà§à¦Ÿà¦® লিংক বà§à¦¯à¦¬à¦¹à¦¾à¦°à§‡à¦° সীমানা পেরিয়েছে।
<nowiki>[[MediaWiki:$2]]</nowiki> বারà§à¦¤à¦¾à¦¯à¦¼ আরও সজà§à¦žà¦¾à¦¯à¦¼à¦¿à¦¤ করà§à¦¨à¥¤',
- 'cite_error_references_no_text' => 'অবৈধ <code>&lt;ref&gt;</code> টà§à¦¯à¦¾à¦—; <code>$1</code> নামের refগà§à¦²à¦¿à¦° জনà§à¦¯ কোন টেকà§à¦¸à¦Ÿ পà§à¦°à¦¦à¦¾à¦¨ করা হয়নি',
+ 'cite_error_references_no_text' => 'অবৈধ <code>&lt;ref&gt;</code> টà§à¦¯à¦¾à¦—; <code>$1</code> নামের ref গà§à¦²à¦¿à¦° জনà§à¦¯ কোন টেকà§à¦¸à¦Ÿ পà§à¦°à¦¦à¦¾à¦¨ করা হয়নি',
'cite_error_included_ref' => '<code>&lt;ref&gt;</code> টà§à¦¯à¦¾à¦—ের কà§à¦·à§‡à¦¤à§à¦°à§‡ <code>&lt;/ref&gt;</code> টà§à¦¯à¦¾à¦— যোগ করা হয়নি',
'cite_error_refs_without_references' => '<code>&lt;ref&gt;</code> টà§à¦¯à¦¾à¦— রয়েছে, কিনà§à¦¤à§ কোনো <code>&lt;references/&gt;</code> টà§à¦¯à¦¾à¦— নেই',
- 'cite_error_group_refs_without_references' => '"$1" নামের গà§à¦°à§à¦ªà§‡à¦° <code>&lt;ref&gt;</code> টà§à¦¯à¦¾à¦— রয়েছে, কিনà§à¦¤à§ à¦à¦° জনà§à¦¯ <code>&lt;references group="$1"/&gt;</code> টà§à¦¯à¦¾à¦— দেয়া হয়নি',
+ 'cite_error_group_refs_without_references' => '"$1" নামের গà§à¦°à§à¦ªà§‡à¦° <code>&lt;ref&gt;</code> টà§à¦¯à¦¾à¦— রয়েছে, কিনà§à¦¤à§ à¦à¦° জনà§à¦¯ <code>&lt;references group="$1"/&gt;</code> টà§à¦¯à¦¾à¦— দেয়া হয়নি', # Fuzzy
'cite_error_references_group_mismatch' => '"$1" গà§à¦°à§à¦ªà§‡à¦° কà§à¦·à§‡à¦¤à§à¦°à§‡ <code>&lt;ref&gt;</code> টà§à¦¯à¦¾à¦— <code>&lt;references&gt;</code> টà§à¦¯à¦¾à¦—ের অংশে বà§à¦¯à¦¬à¦¹à¦¾à¦°à§‡ সমসà§à¦¯à¦¾ সৃষà§à¦Ÿà¦¿ হয়েছে।',
);
/** Breton (brezhoneg)
+ * @author Fohanno
* @author Fulup
*/
$messages['br'] = array(
'cite-desc' => 'Ouzhpennañ a ra ar balizennoù <nowiki><ref[ name=id]></nowiki> ha <nowiki><references/></nowiki>, evit an arroudoù.',
- 'cite_croak' => 'Arroud breinet ; $1 : $2',
- 'cite_error_key_str_invalid' => 'Fazi diabarzh ;
-$str ha/pe key$ direizh.
-Ne zlefe ket c\'hoarvezout gwezh ebet.',
- 'cite_error_stack_invalid_input' => "Fazi diabarzh ;
-alc'hwez pil direizh.
-Ne zlefe ket c'hoarvezout gwezh ebet.",
'cite_error' => 'Fazi arroud : $1',
'cite_error_ref_numeric_key' => "Fazi implijout ar valizenn <code>&lt;ref&gt;</code> ;
n'hall ket an anv bezañ un niver anterin. Grit gant un titl deskrivus",
@@ -658,12 +637,14 @@ Termenit re all e kemennadenn <nowiki>[[MediaWiki:$2]]</nowiki>.',
ne oa bet lakaet tamm testenn ebet evit ar valizenn <code>$1</code>',
'cite_error_included_ref' => 'Kod digeriñ <code>&lt;/ref&gt;</code> hep kod serriñ <code>&lt;ref&gt;</code>',
'cite_error_refs_without_references' => "<code>&lt;ref&gt;</code> balizennoù zo, met n'eus bet kavet balizenn <code>&lt;references/&gt;</code> ebet",
- 'cite_error_group_refs_without_references' => '<code>&lt;ref&gt;</code> balizennoù zo evit ur strollad anvet "$1", met n\'eus bet kavet balizenn <code>&lt;references group="$1"/&gt;</code> ebet o klotañ',
+ 'cite_error_group_refs_without_references' => '<code>&lt;ref&gt;</code> balizennoù zo evit ur strollad anvet "$1", met n\'eus bet kavet balizenn <code>&lt;references group="$1"/&gt;</code> ebet o klotañ', # Fuzzy
'cite_error_references_group_mismatch' => 'Gant ar valizenn <code>&lt;ref&gt;</code> e <code>&lt;references&gt;</code> emañ an dezverk strollad trubuilhus "$1".',
'cite_error_references_missing_group' => '<code>&lt;ref&gt;</code> ar valizenn termenet e <code>&lt;references&gt;</code> eo dezhi un dezverk strollad "$1" na gaver ket en destenn a-raok.',
'cite_error_references_missing_key' => 'N\'eo ket bet implijet en destenn gent ar <code>&lt;ref&gt;</code> valizenn hec\'h anv "$1" termenet e <code>&lt;references&gt;</code>.',
'cite_error_references_no_key' => "<code>&lt;ref&gt;</code> ar valizenn termenet e <code>&lt;references&gt;</code> n'he deus dezverk anv ebet.",
'cite_error_empty_references_define' => '<code>&lt;ref&gt;</code> ar valiezenn termenet e <code>&lt;references&gt;</code> dezhi an anv a "$1" zo goullo.',
+ 'cite_references_link_accessibility_label' => 'Lammat',
+ 'cite_references_link_many_accessibility_label' => 'Lammat da :',
);
/** Bosnian (bosanski)
@@ -672,13 +653,6 @@ ne oa bet lakaet tamm testenn ebet evit ar valizenn <code>$1</code>',
*/
$messages['bs'] = array(
'cite-desc' => 'Dodaje oznake <nowiki><ref[ name=id]></nowiki> i <nowiki><references/></nowiki> za citiranje',
- 'cite_croak' => 'Citiranje neuspješno; $1: $2',
- 'cite_error_key_str_invalid' => 'Unutrašnja greška;
-nevaljan $str i/ili $key.
-Ovo se ne bi trebalo dešavati.',
- 'cite_error_stack_invalid_input' => 'Unutrašnja greška;
-nepoznat "stack" kljuÄ.
-Ovo se ne bi smjelo događati.',
'cite_error' => 'Greška kod citiranja: $1',
'cite_error_ref_numeric_key' => 'Nevaljana oznaka <code>&lt;ref&gt;</code>;
naslov ne može biti jednostavni cijeli broj. Koristite opisni naslov',
@@ -702,7 +676,7 @@ Definišite više putem poruke <nowiki>[[MediaWiki:$2]]</nowiki>.',
nije naveden tekst za reference sa imenom <code>$1</code>',
'cite_error_included_ref' => 'Nedostaje oznaka za zatvaranje <code>&lt;/ref&gt;</code> nakon <code>&lt;ref&gt;</code>',
'cite_error_refs_without_references' => '<code>&lt;ref&gt;</code> oznake postoje, ali oznaka <code>&lt;references/&gt;</code> nije pronađena',
- 'cite_error_group_refs_without_references' => '<code>&lt;ref&gt;</code> oznake postoje za grupu pod imenom "$1", ali nije pronađena pripadajuća oznaka <code>&lt;references group="$1"/&gt;</code>',
+ 'cite_error_group_refs_without_references' => '<code>&lt;ref&gt;</code> oznake postoje za grupu pod imenom "$1", ali nije pronađena pripadajuća oznaka <code>&lt;references group="$1"/&gt;</code>', # Fuzzy
'cite_error_references_group_mismatch' => '<code>&lt;ref&gt;</code> oznaka u <code>&lt;references&gt;</code> ima atribut grupe konflikta "$1".',
'cite_error_references_missing_group' => '<code>&lt;ref&gt;</code> oznaka definisana u <code>&lt;references&gt;</code> ima atribut grupe "$1" koji se ne pojavljuje u ranijem tekstu.',
'cite_error_references_missing_key' => '<code>&lt;ref&gt;</code> oznaka sa imenom "$1" definisana u <code>&lt;references&gt;</code> nije korištena u ranijem tekstu.',
@@ -718,13 +692,6 @@ nije naveden tekst za reference sa imenom <code>$1</code>',
*/
$messages['ca'] = array(
'cite-desc' => 'Afegeix les etiquetes <nowiki><ref[ name=id]></nowiki> i <nowiki><references/></nowiki>, per a cites',
- 'cite_croak' => 'Cita corrompuda; $1: $2',
- 'cite_error_key_str_invalid' => 'Error intern;
-els valors $str i/o $key no valen.
-Aquesta situació no s\'hauria de donar mai.',
- 'cite_error_stack_invalid_input' => "Error intern;
-el valor d'emmagatzematge no és vàlid.
-Aquesta situació no s'hauria de donar mai.",
'cite_error' => 'Error de citació: $1',
'cite_error_ref_numeric_key' => 'Etiqueta <code>&lt;ref&gt;</code> no vàlida;
el nom no pot ser un nombre. Empreu una paraula o un títol descriptiu',
@@ -748,7 +715,7 @@ Defineix més al missatge <nowiki>[[MediaWiki:$2]]</nowiki>.',
no s'ha proporcionat text per les refs amb l'etiqueta <code>$1</code>",
'cite_error_included_ref' => 'Es tanca el <code>&lt;/ref&gt;</code> que manca per una etiqueta <code>&lt;ref&gt;</code>',
'cite_error_refs_without_references' => 'Hi ha etiquetes <code>&lt;ref&gt;</code> però no cap etiqueta <code>&lt;references/&gt;</code>',
- 'cite_error_group_refs_without_references' => 'Existeixen etiquetes <code>&lt;ref&gt;</code> pel grup «$1» però no l\'etiqueta <code>&lt;references group="$1"/&gt;</code> corresponent',
+ 'cite_error_group_refs_without_references' => 'Existeixen etiquetes <code>&lt;ref&gt;</code> pel grup «$1» però no l\'etiqueta <code>&lt;references group="$1"/&gt;</code> corresponent', # Fuzzy
'cite_error_references_group_mismatch' => 'L\'etiqueta <code>&lt;ref&gt;</code> a <code>&lt;references&gt;</code> té un conflicte amb l\'atribut de grup "$1".',
'cite_error_references_missing_group' => 'L\'etiqueta <code>&lt;ref&gt;</code> definida a <code>&lt;references&gt;</code> té l\'atribut de grup "$1" que no apareix en el text anterior.',
'cite_error_references_missing_key' => 'L\'etiqueta <code>&lt;ref&gt;</code> amb el nom "$1" definida a <code>&lt;references&gt;</code> no s\'utilitza en el text anterior.',
@@ -756,19 +723,29 @@ no s'ha proporcionat text per les refs amb l'etiqueta <code>$1</code>",
'cite_error_empty_references_define' => 'L\'etiqueta <code>&lt;ref&gt;</code> definida a <code>&lt;references&gt;</code> amb el nom "$1" no té contingut.',
);
+/** Chechen (нохчийн)
+ * @author Умар
+ */
+$messages['ce'] = array(
+ 'cite_error' => 'ГӀалат дешнаш далорна $1',
+ 'cite_error_references_no_text' => 'Тег <code>&lt;ref&gt;</code> нийÑа Ñц; Ñ‚Iетовжаран <code>$1</code> йоза Ñздина дац',
+ 'cite_error_refs_without_references' => 'Йолуш йолу тегаца <code>&lt;ref&gt;</code> йогӀуш йолу тег <code>&lt;references/&gt;</code> ца карийна',
+ 'cite_error_group_refs_without_references' => 'Группан «$1» йолуш йолу тегашца <code>&lt;ref&gt;</code> йогӀуш йолу тег <code>&lt;references group="$1"/&gt;</code> ца карийна', # Fuzzy
+ 'cite_references_link_accessibility_label' => 'Дехьа гӀо',
+ 'cite_references_link_many_accessibility_label' => 'Дехьа гӀо:',
+);
+
/** Czech (Äesky)
* @author Danny B.
* @author Li-sung
+ * @author Littledogboy
* @author Matěj Grabovský
* @author Mormegil
* @author Sp5uhe
*/
$messages['cs'] = array(
'cite-desc' => 'PÅ™idává znaÄky <nowiki><ref[ name="id"]></nowiki> a&nbsp;<nowiki><references /></nowiki> na oznaÄení citací',
- 'cite_croak' => 'NefunkÄní citace; $1: $2',
- 'cite_error_key_str_invalid' => 'Vnitřní chyba; neplatný $str nebo $key. Toto by nikdy nemělo nastat.',
- 'cite_error_stack_invalid_input' => 'VnitÅ™ní chyba; neplatný klÃ­Ä zásobníku',
- 'cite_error' => 'Chybná citace $1',
+ 'cite_error' => 'Chybná citace: $1',
'cite_error_ref_numeric_key' => 'Chyba v tagu <code>&lt;ref&gt;</code>; názvem nesmí být prosté Äíslo, použijte popisné oznaÄení',
'cite_error_ref_no_key' => 'Chyba v tagu <code>&lt;ref&gt;</code>; prázdné citace musí obsahovat název',
'cite_error_ref_too_many_keys' => 'Chyba v tagu <code>&lt;ref&gt;</code>; chybné názvy, např. je jich příliš mnoho',
@@ -783,12 +760,14 @@ ZvyÅ¡te jejich poÄet ve zprávÄ› <nowiki>[[MediaWiki:$2]]</nowiki>.',
'cite_error_references_no_text' => 'Chyba v tagu <code>&lt;ref&gt;</code>; citaci oznaÄené <code>$1</code> není urÄen žádný text',
'cite_error_included_ref' => 'Chybí ukonÄovací <code>&lt;/ref&gt;</code> k&nbsp;tagu <code>&lt;ref&gt;</code>',
'cite_error_refs_without_references' => 'Nalezena znaÄka <code>&lt;ref&gt;</code> bez přísluÅ¡né znaÄky <code>&lt;references/&gt;</code>.',
- 'cite_error_group_refs_without_references' => 'Nalezena znaÄka <code>&lt;ref&gt;</code> pro skupinu „$1“ bez přísluÅ¡né znaÄky <code>&lt;references group="$1"/&gt;</code>.',
+ 'cite_error_group_refs_without_references' => 'Nalezena znaÄka <code>&lt;ref&gt;</code> pro skupinu „$1“, ale neexistuje přísluÅ¡ná znaÄka <code>&lt;references group="$1"/&gt;</code> nebo chybí zavírací <code>&lt;/ref&gt;</code>.',
'cite_error_references_group_mismatch' => 'ZnaÄka <code>&lt;ref&gt;</code> uvnitÅ™ <code>&lt;references&gt;</code> má definovánu jinou skupinu „$1“.',
'cite_error_references_missing_group' => 'ZnaÄka <code>&lt;ref&gt;</code> uvnitÅ™ <code>&lt;references&gt;</code> používá skupinu „$1“, která se v pÅ™edchozím textu neobjevuje.',
'cite_error_references_missing_key' => 'Na <code>&lt;ref&gt;</code> se jménem „$1“ definovaný uvnitř <code>&lt;references&gt;</code> nejsou v předchozím textu žádné odkazy.',
'cite_error_references_no_key' => 'U znaÄky <code>&lt;ref&gt;</code> definované uvnitÅ™ <code>&lt;references&gt;</code> chybí atribut <code>name</code>.',
'cite_error_empty_references_define' => 'U znaÄky <code>&lt;ref&gt;</code> s názvem „$1“ definované uvnitÅ™ <code>&lt;references&gt;</code> chybí obsah.',
+ 'cite_references_link_accessibility_label' => 'SkoÄit nahoru',
+ 'cite_references_link_many_accessibility_label' => 'SkoÄit nahoru k:',
);
/** Church Slavic (ÑловѣÌньÑкъ / ⰔⰎⰑⰂⰡâ°â° â°”â°â°Ÿ)
@@ -804,13 +783,6 @@ $messages['cu'] = array(
*/
$messages['cy'] = array(
'cite-desc' => 'Yn ychwanegu tagiau <nowiki><ref[ name=id]></nowiki> a <nowiki><references/></nowiki>, ar gyfer cyfeiriadau',
- 'cite_croak' => 'Cyfeirio at farwolaeth; $1: $2',
- 'cite_error_key_str_invalid' => 'Gwall mewnol;
-$str a/neu $key annilys.
-Ni ddylai hyn fyth ddigwydd.',
- 'cite_error_stack_invalid_input' => 'Gwall mewnol;
-Allwedd pentwr annilys.
-Ni ddylai hyn fyth ddigwydd.',
'cite_error' => 'Gwall cyfeirio: $1',
'cite_error_ref_numeric_key' => 'Tag <code>&lt;ref&gt;</code> annilys;
ni all enw fod yn rif yn unig. Defnyddiwch deitl disgrifiadol.',
@@ -834,25 +806,25 @@ Gallwch ddiffinio rhagor ohonynt yn y neges <nowiki>[[MediaWiki:$2]]</nowiki>.',
ni osodwyd unrhyw destun ar gyfer y 'ref' <code>$1</code>",
'cite_error_included_ref' => '<code>&lt;/ref&gt;</code> clo yn eisiau ar gyfer y tag <code>&lt;ref&gt;</code>',
'cite_error_refs_without_references' => 'Mae tagiau <code>&lt;ref&gt;</code> yn bresennol, ond dim tag <code>&lt;references/&gt;</code>',
- 'cite_error_group_refs_without_references' => 'Mae tagiau <code>&lt;ref&gt;</code> yn bresennol ar gyfer y grwp "$1", ond ni chafwyd tag <code>&lt;references/&gt;</code>',
+ 'cite_error_group_refs_without_references' => 'Mae tagiau <code>&lt;ref&gt;</code> yn bresennol ar gyfer y grwp "$1", ond ni chafwyd tag <code>&lt;references/&gt;</code>, ynteu roedd <code>&lt;/ref&gt;</code> terfynol yn eisiau.',
'cite_error_references_group_mismatch' => 'Mae gan y tag <code>&lt;ref&gt;</code> oddi mewn i <code>&lt;references&gt;</code> briodoledd grŵp anghyson "$1".',
'cite_error_references_missing_group' => 'Mae gan y tag <code>&lt;ref&gt;</code> a ddiffinir yn <code>&lt;references&gt;</code> briodoledd grŵp "$1" nag ydyw\'n cael ei ddefnyddio yn y testun cynt.',
'cite_error_references_missing_key' => 'Ni ddefnyddir y tag <code>&lt;ref&gt;</code> o\'r enw "$1", a ddiffinir yn <code>&lt;references&gt;</code>, yn y testun blaenorol.',
'cite_error_references_no_key' => 'Nid oes dim priodoledd o enw gan y tag <code>&lt;ref&gt;</code> a ddiffinir yn <code>&lt;references&gt;</code>',
'cite_error_empty_references_define' => 'Does dim byd yn y tag <code>&lt;ref&gt;</code> a\'r enw "$1" arno, sydd wedi ei ddiffinio oddi mewn i dagiau <code>&lt;references&gt;</code>.',
+ 'cite_references_link_accessibility_label' => 'Neidio am lan',
+ 'cite_references_link_many_accessibility_label' => 'Neidio lan i:',
);
/** Danish (dansk)
* @author Byrial
+ * @author Christian List
* @author Emilkris33
* @author Morten LJ
* @author Peter Alberti
*/
$messages['da'] = array(
'cite-desc' => 'Tilføjer <nowiki><ref[ name=id]></nowiki> og <nowiki><references/></nowiki>-elementer til referencer.',
- 'cite_croak' => 'Fejl i fodnotesystemet; $1: $2',
- 'cite_error_key_str_invalid' => 'Intern fejl: Ugyldig $str og/eller $key. Dette burde aldrig forekomme.',
- 'cite_error_stack_invalid_input' => 'Intern fejl: Ugyldig staknøgle. Dette burde aldrig forekomme.',
'cite_error' => 'Fodnotefejl: $1',
'cite_error_ref_numeric_key' => 'Ugyldigt <code>&lt;ref&gt;</code>-tag; "name" kan ikke være et simpelt heltal, brug en beskrivende titel',
'cite_error_ref_no_key' => 'Ugyldigt <code>&lt;ref&gt;</code>-tag: Et <code>&lt;ref&gt;</code>-tag uden indhold skal have et navn',
@@ -868,12 +840,14 @@ Definer flere i beskeden <nowiki>[[MediaWiki:$2]]</nowiki>.',
'cite_error_references_no_text' => 'Ugyldigt <code>&lt;ref&gt;</code>-tag: Der er ikke specificeret nogen fodnotetekst til navnet <code>$1</code>',
'cite_error_included_ref' => 'Afsluttende <code>&lt;/ref&gt;</code> mangler for <code>&lt;ref&gt;</code>-tag',
'cite_error_refs_without_references' => '<code>&lt;ref&gt;</code>-tags findes, men ingen <code>&lt;references/&gt;</code>-tag blev fundet',
- 'cite_error_group_refs_without_references' => '<code>&lt;ref&gt;</code>-tags eksisterer for en gruppe betegnet "$1", men der blev ikke fundet et tilsvarende <code>&lt;references group="$1"/&gt;</code>-tag',
+ 'cite_error_group_refs_without_references' => '<code>&lt;ref&gt;</code>-tags eksisterer for en gruppe betegnet "$1", men der blev ikke fundet et tilsvarende <code>&lt;references group="$1"/&gt;</code>-tag, eller et afsluttende <code>&lt;/ref&gt;</code>-tag mangler',
'cite_error_references_group_mismatch' => '<code>&lt;ref&gt;</code>-tag inden i <code>&lt;references&gt;</code> har modstridende gruppe-attribut "$1".',
'cite_error_references_missing_group' => '<code>&lt;ref&gt;</code>-tag defineret inden i <code>&lt;references&gt;</code> har gruppe-attributten "$1", som ikke anvendes i den ovenstående tekst.',
'cite_error_references_missing_key' => '<code>&lt;ref&gt;</code>-tag med navn "$1" defineret inden i <code>&lt;references&gt;</code> anvendes ikke i den ovenstående tekst.',
'cite_error_references_no_key' => '<code>&lt;ref&gt;</code>-tag defineret inden i <code>&lt;references&gt;</code> har ikke en navne-attribut.',
'cite_error_empty_references_define' => '<code>&lt;ref&gt;</code>-tag defineret inden i <code>&lt;references&gt;</code> med navnet "$1" har ikke noget indhold.',
+ 'cite_references_link_accessibility_label' => 'Hoppe op',
+ 'cite_references_link_many_accessibility_label' => 'Hoppe op til:',
);
/** German (Deutsch)
@@ -885,9 +859,6 @@ Definer flere i beskeden <nowiki>[[MediaWiki:$2]]</nowiki>.',
*/
$messages['de'] = array(
'cite-desc' => 'Ergänzt die Tags <code><nowiki><ref[&nbsp;name=id]></nowiki></code> und <code><nowiki><references&nbsp;/></nowiki></code> für die Referenzierung von Wikiseiten',
- 'cite_croak' => 'Fehler im Referenzsystem. $1: $2',
- 'cite_error_key_str_invalid' => 'Interner Fehler: ungültiger $str und/oder $key. Dies sollte nicht passieren.',
- 'cite_error_stack_invalid_input' => 'Interner Fehler: ungültiger Schlüssel für den Stack. Dies sollte nicht passieren.',
'cite_error' => 'Referenzfehler: $1',
'cite_error_ref_numeric_key' => 'Ungültige Verwendung von <code>&lt;ref&gt;</code>: Der Parameter „name“ darf kein reiner Zahlenwert sein. Benutze einen beschreibenden Namen.',
'cite_error_ref_no_key' => 'Ungültige Verwendung von <code>&lt;ref&gt;</code>: Der Parameter „ref“ ohne Inhalt muss einen Namen haben.',
@@ -901,12 +872,14 @@ Ein Administrator muss weitere mit der Systemnachricht <nowiki>[[MediaWiki:$2]]<
'cite_error_references_no_text' => 'Es ist ein ungültiger <code>&lt;ref&gt;</code>-Tag vorhanden: Für die Referenz namens <code>$1</code> wurde kein Text angegeben.',
'cite_error_included_ref' => 'Für ein <code>&lt;ref&gt;</code>-Tag fehlt ein schließendes <code>&lt;/ref&gt;</code>-Tag.',
'cite_error_refs_without_references' => 'Es sind <code>&lt;ref&gt;</code>-Tags vorhanden, jedoch wurde kein <code>&lt;references /&gt;</code>-Tag gefunden.',
- 'cite_error_group_refs_without_references' => 'Es sind <code>&lt;ref&gt;</code>-Tags für die Gruppe „$1“ vorhanden, jedoch wurde kein dazugehöriges <code>&lt;references group="$1" /&gt;</code>-Tag gefunden.',
+ 'cite_error_group_refs_without_references' => 'Es sind <code>&lt;ref&gt;</code>-Tags für die Gruppe „$1“ vorhanden, jedoch wurde kein dazugehöriges <code>&lt;references group="$1" /&gt;</code>-Tag gefunden oder ein schließendes <code>&lt;/ref&gt;</code> fehlt.',
'cite_error_references_group_mismatch' => 'Das <code>&lt;ref&gt;</code>-Tag in <code>&lt;references&gt;</code> enthält das kollidierende Attribut „$1“.',
'cite_error_references_missing_group' => 'Das in <code>&lt;references&gt;</code> definierte <code>&lt;ref&gt;</code>-Tag hat das Gruppenattribut „$1“, das nicht im vorausgehenden Text verwendet wird.',
'cite_error_references_missing_key' => 'Das in <code>&lt;references&gt;</code> definierte <code>&lt;ref&gt;</code>-Tag mit dem Namen „$1“ wird im vorausgehenden Text nicht verwendet.',
'cite_error_references_no_key' => 'Das in <code>&lt;references&gt;</code> definierte <code>&lt;ref&gt;</code>-Tag hat kein Namensattribut.',
'cite_error_empty_references_define' => 'Das in <code>&lt;references&gt;</code> definierte <code>&lt;ref&gt;</code>-Tag mit dem Namen „$1“ weist keinen Inhalt auf.',
+ 'cite_references_link_accessibility_label' => 'Hochspringen',
+ 'cite_references_link_many_accessibility_label' => 'Hochspringen nach:',
);
/** Swiss High German (Schweizer Hochdeutsch)
@@ -931,17 +904,11 @@ $messages['de-formal'] = array(
/** Zazaki (Zazaki)
* @author Aspar
* @author Erdemaslancan
+ * @author Gorizon
* @author Xoser
*/
$messages['diq'] = array(
'cite-desc' => 'Qe çime mucnayîşî, etiketanê <nowiki><ref[ name=id]></nowiki> u <nowiki><references/></nowiki> de keno',
- 'cite_croak' => 'Çime nihebitiyeno; $1: $2',
- 'cite_error_key_str_invalid' => 'Ğeletê dehilî
-$str raÅŸt niyo u/ya zi $key.
-Ena gani nibi.',
- 'cite_error_stack_invalid_input' => 'Ğeletê dehilî
-Stack key raÅŸt niyo.
-Ena gani nibi.',
'cite_error' => 'Ğeletê çime mucnayîşî: $1',
'cite_error_ref_numeric_key' => 'Etiket <code>&lt;ref&gt;</code> ke raÅŸt niyo;
Name nieşkeno biyo yew rekam. Çekuyan binuse',
@@ -965,7 +932,7 @@ Zerre mesajê <nowiki>[[MediaWiki:$2]]</nowiki> de zafyer qise bike.',
qe refs yew nuÅŸte nidayiyo <code>$1</code>',
'cite_error_included_ref' => '<code>&lt;ref&gt;</code>Qandê etiketi <code>&lt;/ref&gt;</code> racnayış kemiyo',
'cite_error_refs_without_references' => 'etiketê <code>&lt;ref&gt;</code>î niesto, feqat etiketê <code>&lt;references/&gt;</code>î nidiyo',
- 'cite_error_group_refs_without_references' => 'etiketê <code>&lt;ref&gt;</code>î niesto ser grupê $1î, feqat etiketê <code>&lt;references/&gt;</code>î nidiyo',
+ 'cite_error_group_refs_without_references' => 'etiketé <code>&lt;ref&gt;</code>i niesto ser grubé $1\'i, feqat etiketé <code>&lt;references/&gt;</code>dé "$1"/&gt;nidiyo',
'cite_error_references_group_mismatch' => 'etiketê <code>&lt;ref&gt;</code>î, zerre <code>&lt;references/&gt;</code> de ser grupê "$1"î konflikt keno.',
'cite_error_references_missing_group' => 'etiketê <code>&lt;ref&gt;</code>î, zerre <code>&lt;references/&gt;</code> de tevsir biyo ke ser grupê "$1"î ke verni de nieseno.',
'cite_error_references_missing_key' => 'etiketê <code>&lt;ref&gt;</code>î, zerre <code>&lt;references/&gt;</code> de tevisr biyo ser name "$1"î verni de niesto.',
@@ -981,6 +948,8 @@ qe refs yew nuÅŸte nidayiyo <code>$1</code>',
'cite_references_link_many_format_backlink_labels' => '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 aa ab ac ad ae af ag ah ai aj ak al am an ao ap aq ar as at au av aw ax ay az ba bb bc bd be bf bg bh bi bj bk bl bm bn bo bp bq br bs bt bu bv bw bx by bz ca cb cc cd ce cf cg ch ci cj ck cl cm cn co cp cq cr cs ct cu cv cw cx cy cz da db dc dd de df dg dh di dj dk dl dm dn do dp dq dr ds dt du dv dw dx dy dz ea eb ec ed ee ef eg eh ei ej ek el em en eo ep eq er es et eu ev ew ex ey ez fa fb fc fd fe ff fg fh fi fj fk fl fm fn fo fp fq fr fs ft fu fv fw fx fy fz ga gb gc gd ge gf gg gh gi gj gk gl gm gn go gp gq gr gs gt gu gv gw gx gy gz ha hb hc hd he hf hg hh hi hj hk hl hm hn ho hp hq hr hs ht hu hv hw hx hy hz ia ib ic id ie if ig ih ii ij ik il im in io ip iq ir is it iu iv iw ix iy iz ja jb jc jd je jf jg jh ji jj jk jl jm jn jo jp jq jr js jt ju jv jw jx jy jz ka kb kc kd ke kf kg kh ki kj kk kl km kn ko kp kq kr ks kt ku kv kw kx ky kz la lb lc ld le lf lg lh li lj lk ll lm ln lo lp lq lr ls lt lu lv lw lx ly lz ma mb mc md me mf mg mh mi mj mk ml mm mn mo mp mq mr ms mt mu mv mw mx my mz na nb nc nd ne nf ng nh ni nj nk nl nm nn no np nq nr ns nt nu nv nw nx ny nz oa ob oc od oe of og oh oi oj ok ol om on oo op oq or os ot ou ov ow ox oy oz pa pb pc pd pe pf pg ph pi pj pk pl pm pn po pp pq pr ps pt pu pv pw px py pz qa qb qc qd qe qf qg qh qi qj qk ql qm qn qo qp qq qr qs qt qu qv qw qx qy qz ra rb rc rd re rf rg rh ri rj rk rl rm rn ro rp rq rr rs rt ru rv rw rx ry rz sa sb sc sd se sf sg sh si sj sk sl sm sn so sp sq sr ss st su sv sw sx sy sz ta tb tc td te tf tg th ti tj tk tl tm tn to tp tq tr ts tt tu tv tw tx ty tz ua ub uc ud ue uf ug uh ui uj uk ul um un uo up uq ur us ut uu uv uw ux uy uz va vb vc vd ve vf vg vh vi vj vk vl vm vn vo vp vq vr vs vt vu vv vw vx vy vz wa wb wc wd we wf wg wh wi wj wk wl wm wn wo wp wq wr ws wt wu wv ww wx wy wz xa xb xc xd xe xf xg xh xi xj xk xl xm xn xo xp xq xr xs xt xu xv xw xx xy xz ya yb yc yd ye yf yg yh yi yj yk yl ym yn yo yp yq yr ys yt yu yv yw yx yy yz za zb zc zd ze zf zg zh zi zj zk zl zm zn zo zp zq zr zs zt zu zv zw zx zy zz',
'cite_references_link_many_sep' => '&#32;',
'cite_references_link_many_and' => '&#32;',
+ 'cite_references_link_accessibility_label' => 'Ser çek',
+ 'cite_references_link_many_accessibility_label' => 'Ser çek:',
);
/** Lower Sorbian (dolnoserbski)
@@ -988,9 +957,6 @@ qe refs yew nuÅŸte nidayiyo <code>$1</code>',
*/
$messages['dsb'] = array(
'cite-desc' => 'Pśidawa toflicce <nowiki><ref[ name=id]></nowiki> a <nowiki><references/></nowiki> za pódaśa zrědłow',
- 'cite_croak' => 'Zmólka w referencnem systemje. $1: $2',
- 'cite_error_key_str_invalid' => 'Interna zmólka: njpłaśiwy $str a/abo $key. To njaměło se staś.',
- 'cite_error_stack_invalid_input' => 'Interna zmólka: njepłaśiwy stackowy kluc. To njaměło se staś.',
'cite_error' => 'Referencna zmólka: $1',
'cite_error_ref_numeric_key' => 'Njepłaśiwa toflicka <code>&lt;ref&gt;</code>;
mě njamóžo jadnora licba byś. Wužyj wugroniwy titel',
@@ -1014,58 +980,54 @@ Definěruj dalšne w powěsći <nowiki>[[MediaWiki:$2]]</nowiki>.',
za ref z mjenim <code>$1</code> njejo se tekst pódał',
'cite_error_included_ref' => 'Kóńceca toflicka <code>&lt;/ref&gt;</code> felujo za toflicku <code>&lt;ref&gt;</code>',
'cite_error_refs_without_references' => 'Toflicki <code>&lt;ref&gt;</code> eksistěruju, ale toflicka <code>&lt;references/&gt;</code> njejo se namakała',
- 'cite_error_group_refs_without_references' => 'Toflicki <code>&lt;ref&gt;</code> eksistěruju za kupku z mjenim "$1", ale wótpowědujuca toflicka <code>&lt;references group="$1"/&gt;</code> njejo se namakała',
+ 'cite_error_group_refs_without_references' => 'Toflicki <code>&lt;ref&gt;</code> eksistěruju za kupku z mjenim "$1", ale wótpowědujuca toflicka <code>&lt;references group="$1"/&gt;</code> njejo se namakała abo zacynjacy <code>&lt;/ref&gt;</code> felujo',
'cite_error_references_group_mismatch' => 'Toflicka <code>&lt;ref&gt;</code> w <code>&lt;references&gt;</code> jo ze kupkowym atributom "$1" w konflikśe.',
'cite_error_references_missing_group' => 'Toflicka <code>&lt;ref&gt;</code>, kótaraž jo w <code>&lt;references&gt;</code> definěrowana, ma kupkowy atribut "$1", kótaryž njepokazujo se w pjerwjejšnem teksće.',
'cite_error_references_missing_key' => 'Toflicka <code>&lt;ref&gt;</code> z mjenim "$1", kótaraž jo w <code>&lt;references&gt;</code> definěrowana, njewužywa se w pjerwjejšnem teksće.',
'cite_error_references_no_key' => 'Toflicka <code>&lt;ref&gt;</code>, kótaraž jo w <code>&lt;references&gt;</code> definěrowana, njama mjenjowy atribut.',
'cite_error_empty_references_define' => 'Toflicka <code>&lt;ref&gt;</code>, kótaraž jo w <code>&lt;references&gt;</code> z mjenim "$1" definěrowana, njama wopśimjeśe.',
+ 'cite_references_link_accessibility_label' => 'Górjej skócyś',
+ 'cite_references_link_many_accessibility_label' => 'Górjej skócys do:',
);
/** Greek (Ελληνικά)
* @author Consta
* @author Omnipaedista
+ * @author Protnet
* @author ZaDiak
* @author ΑπεÏγός
*/
$messages['el'] = array(
- 'cite-desc' => 'ΠÏοσθέτει τα <ref[ name="id"]> και <references/> για τις παÏαπομπές.',
- 'cite_croak' => 'Η παÏαπομπή οδηγεί σε αδιέξοδο; $1: $2',
- 'cite_error_key_str_invalid' => 'ΕσωτεÏικό σφάλμα·
-μη έγκυÏο $str και/ή $key.
-Αυτό δεν θα έπÏεπε να συμβαίνει.',
- 'cite_error_stack_invalid_input' => 'ΕσωτεÏικό σφάλμα·
-μη έγκυÏο κλειδί στοίβας.
-Αυτό δεν θα έπÏεπε να συμβαίνει.',
- 'cite_error' => 'Σφάλμα αναφοÏάς: $1',
- 'cite_error_ref_numeric_key' => 'Μη έγκυÏη <code>&lt;ref&gt;</code> ετικέτα·
-το όνομα δεν μποÏεί να είναι ένας απλός ακέÏαιος. ΧÏησιμοποιήστε έναν πεÏιγÏαφικό τίτλο',
- 'cite_error_ref_no_key' => 'ΆκυÏη <code>&lt;ref&gt;</code> ετικέτα·
-παÏαπομπές χωÏίς πεÏιεχομένο Ï€Ïέπει να έχουν ένα όνομα',
- 'cite_error_ref_too_many_keys' => 'Μη έγκυÏη <code>&lt;ref&gt;</code> ετικέτα;
+ 'cite-desc' => 'ΠÏοσθέτει τις ετικέτες <nowiki><ref[ name=id]></nowiki> και <nowiki><references/></nowiki>, για παÏαπομπές.',
+ 'cite_error' => 'Σφάλμα παÏαπομπής: $1',
+ 'cite_error_ref_numeric_key' => 'Μη έγκυÏη ετικέτα <code>&lt;ref&gt;</code>·
+το όνομα δεν μποÏεί να είναι απλός ακέÏαιος. ΧÏησιμοποιήστε έναν πεÏιγÏαφικό τίτλο',
+ 'cite_error_ref_no_key' => 'Μη έγκυÏη ετικέτα <code>&lt;ref&gt;</code>·
+παÏαπομπές χωÏίς πεÏιεχόμενο Ï€Ïέπει να έχουν όνομα',
+ 'cite_error_ref_too_many_keys' => 'Μη έγκυÏη ετικέτα <code>&lt;ref&gt;</code>·
μη έγκυÏα ονόματα, Ï€.χ. πάÏα πολλά',
- 'cite_error_ref_no_input' => 'Μη έγκυÏη <code>&lt;ref&gt;</code> ετικέτα;
+ 'cite_error_ref_no_input' => 'Μη έγκυÏη ετικέτα <code>&lt;ref&gt;</code>·
οι παÏαπομπές χωÏίς όνομα Ï€Ïέπει να έχουν πεÏιεχόμενο',
- 'cite_error_references_invalid_parameters' => 'Μη έγκυÏη <code>&lt;references&gt;</code> ετικέτα;
+ 'cite_error_references_invalid_parameters' => 'Μη έγκυÏη ετικέτα <code>&lt;references&gt;</code>·
δεν επιτÏέπονται παÏάμετÏοι.
-ΧÏησιμοποιήστε το <code>&lt;references /&gt;</code>',
- 'cite_error_references_invalid_parameters_group' => 'Μη έγκυÏη <code>&lt;references&gt;</code> ετικέτα;
-μόνο η παÏάμετÏος "group" επιτÏέπεται.
-ΧÏησιμοποιείστε το <code>&lt;references /&gt;</code>, ή το <code>&lt;references group="..." /&gt;</code>',
+ΧÏησιμοποιήστε <code>&lt;references /&gt;</code>',
+ 'cite_error_references_invalid_parameters_group' => 'Μη έγκυÏη ετικέτα <code>&lt;references&gt;</code>·
+μόνο η παÏάμετÏος «group» επιτÏέπεται.
+ΧÏησιμοποιείστε <code>&lt;references /&gt;</code>, ή <code>&lt;references group="..." /&gt;</code>',
'cite_error_references_no_backlink_label' => 'Εξαντλήθηκαν οι ειδικές ετικέτες συνδέσμων Ï€Ïος το κείμενο.
-ΚαθοÏισμός πεÏισσότεÏων στο μήνυμα <nowiki>[[MediaWiki:Cite references link many format backlink labels]]</nowiki>',
+ΚαθοÏισμός πεÏισσότεÏων στο μήνυμα <nowiki>[[MediaWiki:Cite references link many format backlink labels]]</nowiki>.',
'cite_error_no_link_label_group' => 'Εξαντλήθηκαν οι ειδικές ετικέτες συνδέσμων για την ομάδα «$1».
-ΚαθοÏισμός πεÏισσότεÏων στο μήνυμα <nowiki>[[MediaWiki:$2]]</nowiki>',
- 'cite_error_references_no_text' => 'ΆκυÏο <code>&lt;ref&gt;</code> tag.
-Δεν δίνεται κείμενο για αναφοÏές με το όνομα <code>$1</code>',
- 'cite_error_included_ref' => 'Υπολείπεται η κατάληξη <code>&lt;/ref&gt;</code> για την ετικέτα <code>&lt;ref&gt;</code>',
- 'cite_error_refs_without_references' => 'ΥπάÏχουν ετικέτες <code>&lt;ref&gt;</code>, αλλά καμία ετικέτα <code>&lt;references/&gt;</code> δεν βÏέθηκε.',
- 'cite_error_group_refs_without_references' => 'ΥπάÏχουν ετικέτες <code>&lt;ref&gt;</code> για μία ομάδα με το όνομα «$1», αλλά καμία αντίστοιχη ετικέτα <code>&lt;references group="$1"/&gt;</code> δεν βÏέθηκε.',
- 'cite_error_references_group_mismatch' => 'Η ετικέτα <code>&lt;ref&gt;</code> στο <code>&lt;references&gt;</code> έÏχεται σε σÏγκÏουση με το κατηγοÏοÏμενο "$1".',
- 'cite_error_references_missing_group' => 'Η <code>&lt;ref&gt;</code> ετικέτα που οÏίζεται στο <code>&lt;references&gt;</code> έχει κατηγοÏοÏμενο ομάδας "$1" που δεν εμφανίζεται σε Ï€ÏοηγοÏμενο κείμενο.',
- 'cite_error_references_missing_key' => 'Η <code>&lt;ref&gt;</code> ετικέτα με το όνομα "$1" που οÏίζεται στο <code>&lt;references&gt;</code> δεν χÏησιμοποιείται στο Ï€ÏοηγοÏμενο κείμενο.',
- 'cite_error_references_no_key' => 'Η <code>&lt;ref&gt;</code> ετικέτα που οÏίζεται στο <code>&lt;references&gt;</code> δεν έχει κατηγοÏοÏμενο ονόματος.',
- 'cite_error_empty_references_define' => 'Η <code>&lt;ref&gt;</code> ετικέτα που οÏίζεται στο <code>&lt;references&gt;</code> με το όνομα "$1" δεν έχει καθόλου πεÏιεχόμενο.',
+ΚαθοÏισμός πεÏισσότεÏων στο μήνυμα <nowiki>[[MediaWiki:$2]]</nowiki>.',
+ 'cite_error_references_no_text' => 'Μη έγκυÏη ετικέτα <code>&lt;ref&gt;</code>·
+δεν δίνεται κείμενο για παÏαπομπές με όνομα <code>$1</code>',
+ 'cite_error_included_ref' => 'Λείπει η ετικέτα κλεισίματος <code>&lt;/ref&gt;</code> για την ετικέτα <code>&lt;ref&gt;</code>',
+ 'cite_error_refs_without_references' => 'ΥπάÏχουν ετικέτες <code>&lt;ref&gt;</code>, αλλά δεν βÏέθηκε ετικέτα <code>&lt;references/&gt;</code>.',
+ 'cite_error_group_refs_without_references' => 'ΥπάÏχουν ετικέτες <code>&lt;ref&gt;</code> για μία ομάδα με το όνομα «$1», αλλά καμία αντίστοιχη ετικέτα <code>&lt;references group="$1"/&gt;</code> δεν βÏέθηκε.', # Fuzzy
+ 'cite_error_references_group_mismatch' => 'Η ετικέτα <code>&lt;ref&gt;</code> μέσα στο <code>&lt;references&gt;</code> έÏχεται σε σÏγκÏουση με το χαÏακτηÏιστικό ομαδοποίησης «$1».',
+ 'cite_error_references_missing_group' => 'Η ετικέτα <code>&lt;ref&gt;</code> που οÏίζεται μέσα στο <code>&lt;references&gt;</code> έχει χαÏακτηÏιστικό ομαδοποίησης «$1» που δεν εμφανίζεται σε Ï€ÏοηγοÏμενο κείμενο.',
+ 'cite_error_references_missing_key' => 'Η ετικέτα <code>&lt;ref&gt;</code> με όνομα «$1» που οÏίζεται μέσα στο <code>&lt;references&gt;</code> δεν χÏησιμοποιείται σε Ï€ÏοηγοÏμενο κείμενο.',
+ 'cite_error_references_no_key' => 'Η ετικέτα <code>&lt;ref&gt;</code> που οÏίζεται μέσα στο <code>&lt;references&gt;</code> δεν έχει χαÏακτηÏιστικό ονόματος.',
+ 'cite_error_empty_references_define' => 'Η ετικέτα <code>&lt;ref&gt;</code> που οÏίζεται μέσα στο <code>&lt;references&gt;</code> με όνομα «$1» δεν έχει καθόλου πεÏιεχόμενο.',
);
/** Esperanto (Esperanto)
@@ -1075,13 +1037,6 @@ $messages['el'] = array(
*/
$messages['eo'] = array(
'cite-desc' => 'Aldonas etikedojn <nowiki><ref[ name=id]></nowiki> kaj <nowiki><references/></nowiki> por citaĵoj',
- 'cite_croak' => 'Cito mortis; $1: $2',
- 'cite_error_key_str_invalid' => 'Interna eraro;
-malvalida $str kaj/aÅ­ $key.
-Ĉi tio neniam okazos.',
- 'cite_error_stack_invalid_input' => 'Interna eraro;
-malvalida staka Ålosilo.
-Ĉi tio verÅajne neniam okazus.',
'cite_error' => 'Citaĵa eraro: $1',
'cite_error_ref_numeric_key' => 'Malvalida etikedo <code>&lt;ref&gt;</code>;
nomo ne povas esti simpla entjero. Uzu priskriban titolon.',
@@ -1103,7 +1058,7 @@ Difinu pliajn en la <nowiki>[[MediaWiki:$2]]</nowiki> mesaÄo.',
neniu teksto estis donita por ref-oj nomataj <code>$1</code>',
'cite_error_included_ref' => 'Ferma <code>&lt;/ref&gt;</code> mankas por <code>&lt;ref&gt;</code>-etikedo',
'cite_error_refs_without_references' => 'Etikedoj <code>&lt;ref&gt;</code> ekzistas, sed neniu etikedo <code>&lt;references/&gt;</code> estis trovita',
- 'cite_error_group_refs_without_references' => '<code>&lt;ref&gt;</code> etikedoj ekzistas por grupo nomita "$1", sed ne koresponda <code>&lt;references group="$1"/&gt;</code> etikedo estis trovita',
+ 'cite_error_group_refs_without_references' => '<code>&lt;ref&gt;</code> etikedoj ekzistas por grupo nomita "$1", sed ne koresponda <code>&lt;references group="$1"/&gt;</code> etikedo estis trovita', # Fuzzy
'cite_error_references_group_mismatch' => '<code>&lt;ref&gt;</code> etikedo en <code>&lt;references&gt;</code> havas konflikan grupatributon "$1".',
'cite_error_references_missing_group' => '<code>&lt;ref&gt;</code> etikedo difinita en <code>&lt;references&gt;</code> havas grupatributon "$1" kiu ne aperas en antaÅ­a teksto.',
'cite_error_references_missing_key' => '<code>&lt;ref&gt;</code> etikedo kun la nomo "$1" difinita en <code>&lt;references&gt;</code> ne estas uzata en antaÅ­a teksto.',
@@ -1117,7 +1072,9 @@ neniu teksto estis donita por ref-oj nomataj <code>$1</code>',
* @author Crazymadlover
* @author Drini
* @author Erdemaslancan
+ * @author Fitoschido
* @author Gustronico
+ * @author Ihojose
* @author Locos epraix
* @author Manuelt15
* @author McDutchie
@@ -1128,13 +1085,6 @@ neniu teksto estis donita por ref-oj nomataj <code>$1</code>',
*/
$messages['es'] = array(
'cite-desc' => 'Añade las etiquietas <nowiki><ref[ name=id]> y <references /></nowiki> para utilizar notas al pie.',
- 'cite_croak' => "La extensión ''Cite'' se murió; $1: $2",
- 'cite_error_key_str_invalid' => 'Error interno;
-$str o $key no válidos.
-Esto no debería ocurrir.',
- 'cite_error_stack_invalid_input' => 'Error interno;
-la clave de la pila no es válida.
-Esto nunca debe ocurrir.',
'cite_error' => 'Error en la cita: $1',
'cite_error_ref_numeric_key' => 'Etiqueta <code>&lt;ref&gt;</code> no válida;
el nombre no puede ser un número entero. Use un título descriptivo',
@@ -1158,13 +1108,15 @@ Define más en el mensaje <nowiki>[[MediaWiki:$2]]</nowiki>.',
no se ha definido el contenido de las referencias llamadas <code>$1</code>',
'cite_error_included_ref' => 'Etiqueta de apertura <code>&lt;ref&gt;</code> sin su correspondiente cierre <code>&lt;/ref&gt;</code>',
'cite_error_refs_without_references' => 'Existen etiquetas <code>&lt;ref&gt;</code>, pero no se encontró una etiqueta <code>&lt;references /&gt;</code>',
- 'cite_error_group_refs_without_references' => 'Existen etiquetas <code>&lt;ref&gt;</code> para un grupo llamado "$1", pero no se encontró una etiqueta <code>&lt;references group="$1"/&gt;</code>',
+ 'cite_error_group_refs_without_references' => 'Existen etiquetas <code>&lt;ref&gt;</code> para un grupo llamado «$1», pero no se encontró la etiqueta <code>&lt;references group="$1"/&gt;</code> correspondiente, o falta la etiqueta <code>&lt;/ref&gt;</code> de cierre',
'cite_error_references_group_mismatch' => 'La etiqueta <code>&lt;ref&gt;</code> en <code>&lt;references&gt;</code> presenta el atributo de grupo "$1" en conflicto.',
'cite_error_references_missing_group' => 'La etiqueta <code>&lt;ref&gt;</code> definida en <code>&lt;references&gt;</code> pertenece al grupo "$1" no declarado en el texto precedente.',
'cite_error_references_missing_key' => 'La etiqueta <code>&lt;ref&gt;</code> con nombre "$1" definida en <code>&lt;references&gt;</code> no se utiliza en el texto precedente.',
'cite_error_references_no_key' => 'La etiqueta <code>&lt;ref&gt;</code> definida en <code>&lt;references&gt;</code> no tiene atributo de nombre.',
'cite_error_empty_references_define' => 'La etiqueta <code>&lt;ref&gt;</code> definida en <code>&lt;references&gt;</code> con nombre "$1" no tiene contenido.',
'cite_references_link_many_format_backlink_labels' => '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 aa ab ac ad ae af ag ah ai aj ak al am an ao ap aq ar as at au av aw ax ay az ba bb bc bd be bf bg bh bi bj bk bl bm bn bo bp bq br bs bt bu bv bw bx by bz ca cb cc cd ce cf cg ch ci cj ck cl cm cn co cp cq cr cs ct cu cv cw cx cy cz da db dc dd de df dg dh di dj dk dl dm dn do dp dq dr ds dt du dv dw dx dy dz ea eb ec ed ee ef eg eh ei ej ek el em en eo ep eq er es et eu ev ew ex ey ez fa fb fc fd fe ff fg fh fi fj fk fl fm fn fo fp fq fr fs ft fu fv fw fx fy fz ga gb gc gd ge gf gg gh gi gj gk gl gm gn go gp gq gr gs gt gu gv gw gx gy gz ha hb hc hd he hf hg hh hi hj hk hl hm hn ho hp hq hr hs ht hu hv hw hx hy hz ia ib ic id ie if ig ih ii ij ik il im in io ip iq ir is it iu iv iw ix iy iz ja jb jc jd je jf jg jh ji jj jk jl jm jn jo jp jq jr js jt ju jv jw jx jy jz ka kb kc kd ke kf kg kh ki kj kk kl km kn ko kp kq kr ks kt ku kv kw kx ky kz la lb lc ld le lf lg lh li lj lk ll lm ln lo lp lq lr ls lt lu lv lw lx ly lz ma mb mc md me mf mg mh mi mj mk ml mm mn mo mp mq mr ms mt mu mv mw mx my mz na nb nc nd ne nf ng nh ni nj nk nl nm nn no np nq nr ns nt nu nv nw nx ny nz oa ob oc od oe of og oh oi oj ok ol om on oo op oq or os ot ou ov ow ox oy oz pa pb pc pd pe pf pg ph pi pj pk pl pm pn po pp pq pr ps pt pu pv pw px py pz qa qb qc qd qe qf qg qh qi qj qk ql qm qn qo qp qq qr qs qt qu qv qw qx qy qz ra rb rc rd re rf rg rh ri rj rk rl rm rn ro rp rq rr rs rt ru rv rw rx ry rz sa sb sc sd se sf sg sh si sj sk sl sm sn so sp sq sr ss st su sv sw sx sy sz ta tb tc td te tf tg th ti tj tk tl tm tn to tp tq tr ts tt tu tv tw tx ty tz ua ub uc ud ue uf ug uh ui uj uk ul um un uo up uq ur us ut uu uv uw ux uy uz va vb vc vd ve vf vg vh vi vj vk vl vm vn vo vp vq vr vs vt vu vv vw vx vy vz wa wb wc wd we wf wg wh wi wj wk wl wm wn wo wp wq wr ws wt wu wv ww wx wy wz xa xb xc xd xe xf xg xh xi xj xk xl xm xn xo xp xq xr xs xt xu xv xw xx xy xz ya yb yc yd ye yf yg yh yi yj yk yl ym yn yo yp yq yr ys yt yu yv yw yx yy yz za zb zc zd ze zf zg zh zi zj zk zl zm zn zo zp zq zr zs zt zu zv zw zx zy zz',
+ 'cite_references_link_accessibility_label' => 'Ir a',
+ 'cite_references_link_many_accessibility_label' => 'Ir a:',
);
/** Estonian (eesti)
@@ -1172,13 +1124,6 @@ no se ha definido el contenido de las referencias llamadas <code>$1</code>',
*/
$messages['et'] = array(
'cite-desc' => 'Lisab viitamiseks sildid <nowiki><ref[ name=id]></nowiki> ja <nowiki><references/></nowiki>.',
- 'cite_croak' => 'Viide ütles üles; $1: $2',
- 'cite_error_key_str_invalid' => 'Sisetõrge;
-vigane $str ja/või $key.
-Seda ei tohiks esineda.',
- 'cite_error_stack_invalid_input' => 'Sisetõrge;
-vigane pinuvõti.
-Seda ei tohiks esineda.',
'cite_error' => 'Viitamistõrge: $1',
'cite_error_ref_numeric_key' => 'Vigane <code>&lt;ref&gt;</code>-silt.
Nimi ei või olla numbriline. Kasuta kirjeldavat nime.',
@@ -1202,7 +1147,7 @@ Lisa neid sõnumisse <nowiki>[[MediaWiki:$2]]</nowiki>.',
Viite nimega <code>$1</code> tekst puudub.',
'cite_error_included_ref' => 'Sulgemissilt <code>&lt;/ref&gt;</code> puudub.',
'cite_error_refs_without_references' => '<code>&lt;ref&gt;</code>-sildid on olemas, aga <code>&lt;references/&gt;</code>-silt puudub.',
- 'cite_error_group_refs_without_references' => 'Olemas on <code>&lt;ref&gt;</code>-silt rühma "$1" jaoks, aga vastav <code>&lt;references group="$1"/&gt;</code>-silt puudub.',
+ 'cite_error_group_refs_without_references' => 'Olemas on <code>&lt;ref&gt;</code>-silt rühma "$1" jaoks, aga puudub vastav silt <code>&lt;references group="$1"/&gt;</code> või lõpusilt <code>&lt;/ref&gt;</code>.',
'cite_error_references_group_mismatch' => '<code>&lt;references&gt;</code>-siltide vahel oleval <code>&lt;ref&gt;</code>-sildil on vastukäiv parameetri "group" väärtus "$1".',
'cite_error_references_missing_group' => '<code>&lt;references&gt;</code>-sildis kirjeldatud <code>&lt;ref&gt;</code>-sildil on rühmatunnus "$1", mis puudub eelnevas tekstis.',
'cite_error_references_missing_key' => '<code>&lt;references&gt;</code>-siltide vahel olevat <code>&lt;ref&gt;</code>-silti nimega "$1" ei kasutata eelnevas tekstis.',
@@ -1215,7 +1160,6 @@ Viite nimega <code>$1</code> tekst puudub.',
*/
$messages['eu'] = array(
'cite-desc' => '<nowiki><ref[ name=id]></nowiki> eta <nowiki><references/></nowiki> etiketak gehitzen ditu, aipuentzako',
- 'cite_croak' => 'Hildako aipua; $1: $2',
'cite_error' => 'Aipamen errorea: $1',
);
@@ -1227,25 +1171,22 @@ $messages['eu'] = array(
*/
$messages['fa'] = array(
'cite-desc' => 'برچسب‌های <nowiki><ref[ name=id]></nowiki> Ùˆ <nowiki><references/></nowiki> را برای یادکرد اضاÙÙ‡ می‌کند',
- 'cite_croak' => 'یادکرد خراب شد؛ $1: $2',
- 'cite_error_key_str_invalid' => 'خطای داخلی؛ $str و/یا $key غیر مجاز. این خطا نباید هرگز رخ دهد.',
- 'cite_error_stack_invalid_input' => 'خطای داخلی؛ کلید پشته غیرمجاز. این خطا نباید هرگز رخ دهد.',
'cite_error' => 'خطای یادکرد: $1',
- 'cite_error_ref_numeric_key' => 'برچسب <code><ref></code> غیرمجاز؛ نام نمی‌تواند یک عدد باشد. عنوان واضح‌تری را برگزینید',
- 'cite_error_ref_no_key' => 'برچسب <code><ref></code> غیرمجاز؛ یادکردهای بدون محتوا باید نام داشته باشند',
- 'cite_error_ref_too_many_keys' => 'برچسب <code><ref></code> غیرمجاز؛ نام‌های غیرمجاز یا بیش از اندازه',
- 'cite_error_ref_no_input' => 'برچسب <code><ref></code> غیرمجاز؛ یادکردهای بدون نام باید محتوا داشته باشند',
- 'cite_error_references_invalid_parameters' => 'برچسب <code><references></code> غیرمجاز؛ استÙاده از پارامتر مجاز است. از <code><references /></code> استÙاده کنید',
- 'cite_error_references_invalid_parameters_group' => 'برچسب <code>&lt;references&gt;</code> غیر مجاز؛ تنها پارامتر «group» قابل استÙاده است.
+ 'cite_error_ref_numeric_key' => 'برچسب <code><ref></code> نامجاز؛ نام نمی‌تواند یک عدد باشد. عنوان واضح‌تری را برگزینید',
+ 'cite_error_ref_no_key' => 'برچسب <code><ref></code> نامجاز؛ یادکردهای بدون محتوا باید نام داشته باشند',
+ 'cite_error_ref_too_many_keys' => 'برچسب <code><ref></code> نامجاز؛ نام‌های نامجاز یا بیش از اندازه',
+ 'cite_error_ref_no_input' => 'برچسب <code><ref></code> نامجاز؛ یادکردهای بدون نام باید محتوا داشته باشند',
+ 'cite_error_references_invalid_parameters' => 'برچسب <code><references></code> نامجاز؛ استÙاده از پارامتر مجاز است. از <code><references /></code> استÙاده کنید',
+ 'cite_error_references_invalid_parameters_group' => 'برچسب <code>&lt;references&gt;</code> نامجاز؛ تنها پارامتر «group» قابل استÙاده است.
از <code>&lt;references /&gt;</code> یا <code>&lt;references group="..." /&gt;</code> استÙاده کنید',
'cite_error_references_no_backlink_label' => 'برچسب‌های پیوند به انتها رسید.
موارد جدیدی را در پیغام <nowiki>[[MediaWiki:Cite references link many format backlink labels]]</nowiki> تعری٠کنید',
'cite_error_no_link_label_group' => 'از برچسب‌های پیوند سÙارشی برای گروه «$1» خارج شد.
در پیغام <nowiki>[[MediaWiki:$2]]</nowiki> بیشتر تعری٠کنید.',
- 'cite_error_references_no_text' => 'برچسب <code><ref></code> غیرمجاز؛ متنی برای یادکردهای با نام <code>$1</code> وارد نشده‌است',
+ 'cite_error_references_no_text' => 'برچسب <code><ref></code> نامجاز؛ متنی برای یادکردهای با نام <code>$1</code> وارد نشده‌است',
'cite_error_included_ref' => 'برچسب تمام کنندهٔ <code>&lt;/ref&gt;</code> بدون برچسب <code>&lt;ref&gt;</code>',
'cite_error_refs_without_references' => 'برچسب <code>&lt;ref&gt;</code> وجود دارد اما برچسب <code>&lt;references/&gt;</code> پیدا نشد',
- 'cite_error_group_refs_without_references' => 'برچسب <code>&lt;ref&gt;</code> برای گروهی به نام «$1» وجود دارد، اما برچسب <code>&lt;references group="$1"/&gt;</code> متناظر پیدا نشد',
+ 'cite_error_group_refs_without_references' => 'برچسب <code>&lt;ref&gt;</code> برای گروهی به نام «$1» وجود دارد، اما برچسب متناظر با <code>&lt;references group="$1"/&gt;</code> یاÙت نشد یا <code>&lt;/ref&gt;</code> بسته جا گذاشته شده‌است.',
'cite_error_references_group_mismatch' => 'برچسپ <code>&lt;ref&gt;</code> درون <code>&lt;references&gt;</code> در تضاد با ویژگی‌های گروه «$1» است.',
'cite_error_references_missing_group' => 'برچسپ <code>&lt;ref&gt;</code> در <code>&lt;references&gt;</code> تعری٠شده، ویژگی‌های گروهی «$1» را دارد که درون متن قبل از آن ظاهر نمی‌شود.',
'cite_error_references_missing_key' => 'پرچسپ <code>&lt;ref&gt;</code> Ú©Ù‡ با نام «$1» درون <code>&lt;references&gt;</code> تعری٠شده، در متن قبل از آن استÙاده نشده‌است.',
@@ -1253,6 +1194,8 @@ $messages['fa'] = array(
'cite_error_empty_references_define' => 'برچسپ <code>&lt;ref&gt;</code> تعری٠شده درون <code>&lt;references&gt;</code> با نام «$1» محتوایی ندارد.',
'cite_reference_link_key_with_num' => '$1_$2',
'cite_reference_link_prefix' => 'cite_ref-',
+ 'cite_references_link_accessibility_label' => 'پرش به بالا',
+ 'cite_references_link_many_accessibility_label' => 'پرش به بالا به:',
);
/** Finnish (suomi)
@@ -1266,9 +1209,6 @@ $messages['fa'] = array(
*/
$messages['fi'] = array(
'cite-desc' => 'Tarjoaa <nowiki><ref[ name=id]></nowiki>- ja <nowiki><references/></nowiki>-elementit viittauksien tekemiseen.',
- 'cite_croak' => 'Virhe viittausjärjestelmässä: $1: $2',
- 'cite_error_key_str_invalid' => 'Sisäinen virhe: kelpaamaton $str ja/tai $key.',
- 'cite_error_stack_invalid_input' => 'Sisäinen virhe: kelpaamaton pinoavain.',
'cite_error' => 'Viittausvirhe: $1',
'cite_error_ref_numeric_key' => 'Kelpaamaton <code>&lt;ref&gt;</code>-elementti: nimi ei voi olla numero – käytä kuvaavampaa nimeä.',
'cite_error_ref_no_key' => 'Kelpaamaton <code>&lt;ref&gt;</code>-elementti: sisällöttömille refeille pitää määrittää nimi.',
@@ -1284,7 +1224,7 @@ Määritä niitä lisää viestissä <nowiki>[[MediaWiki:$2]]</nowiki>.',
viitettä <code>$1</code> ei löytynyt',
'cite_error_included_ref' => '<code>&lt;ref&gt;</code>-elementin sulkeva <code>&lt;/ref&gt;</code>-elementti puuttuu',
'cite_error_refs_without_references' => '<code>&lt;ref&gt;</code>-elementti löytyy, mutta <code>&lt;references/&gt;</code>-elementtiä ei löydy',
- 'cite_error_group_refs_without_references' => '<code>&lt;ref&gt;</code>-elementit löytyivät ryhmälle nimeltä â€$1â€, mutta vastaavaa <code>&lt;references group="$1"/&gt;</code>-elementtiä ei löytynyt',
+ 'cite_error_group_refs_without_references' => '<code>&lt;ref&gt;</code>-elementit löytyivät ryhmälle nimeltä â€$1â€, mutta vastaavaa <code>&lt;references group="$1"/&gt;</code>-elementtiä ei löytynyt', # Fuzzy
'cite_error_references_group_mismatch' => '<code>&lt;ref&gt;</code>-elementti <code>&lt;references&gt;</code>-elementin sisällä sisältää ristiriitaisen ryhmämääritteen â€$1â€.',
'cite_error_references_missing_group' => '<code>&lt;references&gt;</code>-elementissä määritetty <code>&lt;ref&gt;</code>-elementti sisältää ryhmämääritteen â€$1â€, jota ei mainita aiemmassa tekstissä.',
'cite_error_references_missing_key' => '<code>&lt;ref&gt;</code>-elementin nimeä â€$1â€, johon viitataan elementissä <code>&lt;references&gt;</code> ei käytetä edeltävässä tekstissä.',
@@ -1298,12 +1238,13 @@ viitettä <code>$1</code> ei löytynyt',
$messages['fo'] = array(
'cite-desc' => 'Leggur afturat <nowiki><ref[ name=id]></nowiki> og <nowiki><references/></nowiki> lyklaorð, fyri ávísingar',
'cite_error_refs_without_references' => '<code>&lt;ref&gt;</code> lyklaorð eru til, men onki <code>&lt;references/&gt;</code> lyklaorð (tag) varð funnið',
- 'cite_error_group_refs_without_references' => '<code>&lt;ref&gt;</code> lyklaorð (tags) eru til fyri ein bólk sum eitur "$1", men onki tilsvarandi <code>&lt;references group="$1"/&gt;</code> lyklaorð varð funnið',
+ 'cite_error_group_refs_without_references' => '<code>&lt;ref&gt;</code> lyklaorð (tags) eru til fyri ein bólk sum eitur "$1", men onki tilsvarandi <code>&lt;references group="$1"/&gt;</code> lyklaorð varð funnið, ella manglar ein lukkandi <code>&lt;/ref&gt;</code>',
);
/** French (français)
* @author Cedric31
* @author Crochet.david
+ * @author Gomoko
* @author Grondin
* @author IAlex
* @author Kropotkine 113
@@ -1311,17 +1252,11 @@ $messages['fo'] = array(
* @author Sherbrooke
* @author The Evil IP address
* @author Trizek
+ * @author Urhixidur
* @author Verdy p
*/
$messages['fr'] = array(
'cite-desc' => 'Ajoute les balises <nowiki><ref[ name="id"]></nowiki> et <nowiki><references/></nowiki> pour les références et notes de bas de page.',
- 'cite_croak' => 'Référence en impasse ; $1 : $2',
- 'cite_error_key_str_invalid' => 'Erreur interne ;
-$str ou $key invalides.
-Ceci ne devrait jamais se produire.',
- 'cite_error_stack_invalid_input' => 'Erreur interne ;
-clé de pile invalide.
-Ceci ne devrait jamais se produire.',
'cite_error' => 'Erreur de référence : $1',
'cite_error_ref_numeric_key' => 'Balise <code>&lt;ref&gt;</code> incorrecte ;
le nom ne peut être un entier simple. Utilisez un titre descriptif.',
@@ -1345,14 +1280,16 @@ Définissez-en plus dans le message <nowiki>[[MediaWiki:$2]]</nowiki>.',
aucun texte n’a été fourni pour les références nommées <code>$1</code>.',
'cite_error_included_ref' => 'Clôture <code>&lt;/ref&gt;</code> manquante pour la balise <code>&lt;ref&gt;</code>.',
'cite_error_refs_without_references' => 'Des balises <code>&lt;ref&gt;</code> existent, mais aucune balise <code>&lt;references/&gt;</code> n’a été trouvée.',
- 'cite_error_group_refs_without_references' => 'Des balises <code>&lt;ref&gt;</code> existent pour un groupe nommé « $1 », mais aucune balise <code>&lt;references group="$1"/&gt;</code> correspondante n’a été trouvée.',
+ 'cite_error_group_refs_without_references' => 'Des balises <code>&lt;ref&gt;</code> existent pour un groupe nommé « $1 », mais aucune balise <code>&lt;references group="$1"/&gt;</code> correspondante n’a été trouvée, ou bien une valise fermante <code>&lt;/ref&gt;</code> manque.',
'cite_error_references_group_mismatch' => 'La balise <code>&lt;ref&gt;</code> dans <code>&lt;references&gt;</code> a l’attribut de groupe « $1 » qui entre en conflit avec celui de <code>&lt;references&gt;</code>.',
'cite_error_references_missing_group' => 'La balise <code>&lt;ref&gt;</code> définie dans <code>&lt;references&gt;</code> a un groupe attribué « $1 » qui ne figure pas dans le texte précédent.',
'cite_error_references_missing_key' => 'La balise <code>&lt;ref&gt;</code> avec le nom « $1 » définie dans <code>&lt;references&gt;</code> n’est pas utilisé dans le texte précédent.',
- 'cite_error_references_no_key' => "La balise <code>&lt;ref&gt;</code> définie dans <code>&lt;references&gt;</code> n’a pas d'attribut de nom.",
+ 'cite_error_references_no_key' => 'La balise <code>&lt;ref&gt;</code> définie dans <code>&lt;references&gt;</code> n’a pas d’attribut de nom.',
'cite_error_empty_references_define' => 'La balise <code>&lt;ref&gt;</code> défini dans <code>&lt;references&gt;</code> avec le nom « $1 » n’a pas de contenu.',
'cite_references_link_many_sep' => ',&#32;',
'cite_references_link_many_and' => '&#32;et&#32;',
+ 'cite_references_link_accessibility_label' => 'Aller',
+ 'cite_references_link_many_accessibility_label' => 'Aller à :',
);
/** Franco-Provençal (arpetan)
@@ -1360,9 +1297,6 @@ aucun texte n’a été fourni pour les références nommées <code>$1</code>.',
*/
$messages['frp'] = array(
'cite-desc' => 'Apond les balises <nowiki><ref[ name=id]></nowiki> et <nowiki><references/></nowiki>, por les citacions.',
- 'cite_croak' => 'Citacion corrompua ; $1 : $2',
- 'cite_error_key_str_invalid' => 'Èrror de dedens ; $str atendua.',
- 'cite_error_stack_invalid_input' => 'Èrror de dedens ; cllâf de pila envalida.',
'cite_error' => 'Èrror de citacion $1',
'cite_error_ref_numeric_key' => 'Apèl envalido ; cllâf pas entègrâla atendua.',
'cite_error_ref_no_key' => 'Balisa <code>&lt;ref&gt;</code> fôssa ;
@@ -1382,7 +1316,7 @@ Dèfenésséd-nen més dens lo mèssâjo <nowiki>[[MediaWiki:$2]]</nowiki>.',
nion tèxto at étâ balyê por les refèrences apelâs <code>$1</code>.',
'cite_error_included_ref' => 'Cllotura <code>&lt;/ref&gt;</code> manquenta por la balisa <code>&lt;ref&gt;</code>.',
'cite_error_refs_without_references' => 'Des balises <code>&lt;ref&gt;</code> ègzistont, mas niona balisa <code>&lt;references/&gt;</code> at étâ trovâ.',
- 'cite_error_group_refs_without_references' => 'Des balises <code>&lt;ref&gt;</code> ègzistont por una tropa apelâ « $1 », mas niona balisa <code>&lt;references group="$1"/&gt;</code> que corrèspond at étâ trovâ.',
+ 'cite_error_group_refs_without_references' => 'Des balises <code>&lt;ref&gt;</code> ègzistont por una tropa apelâ « $1 », mas niona balisa <code>&lt;references group="$1"/&gt;</code> que corrèspond at étâ trovâ.', # Fuzzy
'cite_error_references_group_mismatch' => 'La balisa <code>&lt;ref&gt;</code> dens <code>&lt;references&gt;</code> at l’atribut de tropa « $1 » qu’entre en conflit avouéc celi de <code>&lt;references&gt;</code>.',
'cite_error_references_missing_group' => 'La balisa <code>&lt;ref&gt;</code> dèfenia dens <code>&lt;references&gt;</code> at l’atribut de tropa « $1 » que figure pas dens cél tèxto.',
'cite_error_references_missing_key' => 'La balisa <code>&lt;ref&gt;</code> avouéc lo nom « $1 » dèfenia dens <code>&lt;references&gt;</code> est pas utilisâ dens cél tèxto.',
@@ -1413,9 +1347,6 @@ $messages['gag'] = array(
*/
$messages['gl'] = array(
'cite-desc' => 'Engade as etiquetas <nowiki><ref[ name=id]></nowiki> e <nowiki><references/></nowiki> para as citas',
- 'cite_croak' => 'Cita morta; $1: $2',
- 'cite_error_key_str_invalid' => 'Erro interno; $str e/ou $key inválidos. Isto non debera ocorrer.',
- 'cite_error_stack_invalid_input' => 'Erro interno; stack key inválido. Isto non debera ocorrer.',
'cite_error' => 'Erro no código da cita: $1',
'cite_error_ref_numeric_key' => 'Etiqueta <code>&lt;ref&gt;</code> non válida;
o nome non pode ser un simple número enteiro. Use un título descritivo',
@@ -1439,12 +1370,14 @@ Defina máis na mensaxe <nowiki>[[MediaWiki:$2]]</nowiki>.',
non se forneceu texto para as referencias de nome <code>$1</code>',
'cite_error_included_ref' => 'Peche a etiqueta <code>&lt;/ref&gt;</code> que lle falta á outra etiqueta <code>&lt;ref&gt;</code>',
'cite_error_refs_without_references' => 'As etiquetas <code>&lt;ref&gt;</code> existen, pero non se atopou ningunha etiqueta <code>&lt;references/&gt;</code>',
- 'cite_error_group_refs_without_references' => 'As etiquetas <code>&lt;ref&gt;</code> existen para un grupo chamado "$1", pero non se atopou a etiqueta <code>&lt;references group="$1"/&gt;</code> correspondente',
+ 'cite_error_group_refs_without_references' => 'As etiquetas <code>&lt;ref&gt;</code> existen para un grupo chamado "$1", pero non se atopou a etiqueta <code>&lt;references group="$1"/&gt;</code> correspondente ou falta unha etiqueta <code>&lt;/ref&gt;</code> de peche',
'cite_error_references_group_mismatch' => 'A etiqueta <code>&lt;ref&gt;</code> en <code>&lt;references&gt;</code> ten un atributo de grupo conflitivo "$1".',
'cite_error_references_missing_group' => 'A etiqueta <code>&lt;ref&gt;</code> definida en <code>&lt;references&gt;</code> ten un atributo de grupo "$1" que non aparece no texto anterior.',
'cite_error_references_missing_key' => 'A etiqueta <code>&lt;ref&gt;</code> co nome "$1" definida en <code>&lt;references&gt;</code> non se utiliza no texto anterior.',
'cite_error_references_no_key' => 'A etiqueta <code>&lt;ref&gt;</code> definida en <code>&lt;references&gt;</code> non ten nome de atributo.',
'cite_error_empty_references_define' => 'A etiqueta <code>&lt;ref&gt;</code> definida en <code>&lt;references&gt;</code> co nome "$1" non ten contido.',
+ 'cite_references_link_accessibility_label' => 'Saltar a',
+ 'cite_references_link_many_accessibility_label' => 'Saltar a:',
);
/** Ancient Greek (ἈÏχαία ἑλληνικὴ)
@@ -1460,9 +1393,6 @@ $messages['grc'] = array(
*/
$messages['gsw'] = array(
'cite-desc' => 'Ergänzt d <nowiki><ref[ name=id]></nowiki> un d <nowiki><references /></nowiki>-Tag fir Quällenochwyys',
- 'cite_croak' => 'Fähler im Referenz-Syschtem. $1: $2',
- 'cite_error_key_str_invalid' => 'Intärne Fähler: uugiltige $str un/oder $key. Des sott eigetli gar nit chenne gschäh.',
- 'cite_error_stack_invalid_input' => 'Intärne Fähler: uugiltige „name“-stack. Des sott eigetli gar nit chenne gschäh.',
'cite_error' => 'Referänz-Fähler: $1',
'cite_error_ref_numeric_key' => 'Uugiltigi <tt>&lt;ref&gt;</tt>-Verwändig: „name“ derf kei reine Zahlewärt syy, verwänd e Name wu bschrybt.',
'cite_error_ref_no_key' => 'Uugiltigi <tt>&lt;ref&gt;</tt>-Verwändig: „ref“ ohni Inhalt muess e Name haa.',
@@ -1476,7 +1406,7 @@ Definier meh unter Systemnochricht <nowiki>[[MediaWiki:$2]]</nowiki>.',
'cite_error_references_no_text' => 'Uugiltige <tt>&lt;ref&gt;</tt>-Tag; s isch kei Täxt fir s Ref mit em Name <tt>$1</tt> aagee wore.',
'cite_error_included_ref' => 'S fählt s schließend <code>&lt;/ref&gt;</code>',
'cite_error_refs_without_references' => '<code>&lt;ref&gt;</code>-Tag git s, aber s isch kei <code>&lt;references/&gt;</code>-Tag gfunde wore.',
- 'cite_error_group_refs_without_references' => '<code>&lt;ref&gt;</code>-Tag git s fir d Grupp „$1“, aber s isch kei dezue gherig <code>&lt;references group=„$1“/&gt;</code>-Tag gfunde wore',
+ 'cite_error_group_refs_without_references' => '<code>&lt;ref&gt;</code>-Tag git s fir d Grupp „$1“, aber s isch kei dezue gherig <code>&lt;references group=„$1“/&gt;</code>-Tag gfunde wore', # Fuzzy
'cite_error_references_group_mismatch' => 'Im <code>&lt;ref&gt;</code>-Tag in <code>&lt;references&gt;</code> het s e problematischi Gruppe-Eigeschaft „$1“.',
'cite_error_references_missing_group' => 'Im <code>&lt;ref&gt;</code>-Tag, wu definiert isch in <code>&lt;references&gt;</code>, het s e Gruppe-Eigeschaft „$1“, wu im obere Text nit vorchunnt.',
'cite_error_references_missing_key' => 'S <code>&lt;ref&gt;</code>-Tag mit em Name „$1“, wu definiert isch in <code>&lt;references&gt;</code> wird nit verwändet im obere Text.',
@@ -1492,13 +1422,6 @@ Definier meh unter Systemnochricht <nowiki>[[MediaWiki:$2]]</nowiki>.',
*/
$messages['gu'] = array(
'cite-desc' => 'અવતરણો માટે <nowiki><ref[ name=id]></nowiki> અને <nowiki><references/></nowiki> ટેગ ઉમેરે છે',
- 'cite_croak' => 'અવતરણ ભાંગી ગયà«àª‚; $1: $2',
- 'cite_error_key_str_invalid' => 'આંતરિક કà«àª·àª¤àª¿;
-અયોગà«àª¯ $str અને/અથવા $key.
-આ કà«àª¯àª¾àª°à«‡àª¯ થવà«àª‚ ન જોઈàª.',
- 'cite_error_stack_invalid_input' => 'આંતરિક કà«àª·àª¤àª¿;
-અયોગà«àª¯ સà«àªŸà«‡àª• કળ.
-આ કà«àª¯àª¾àª°à«‡àª¯ થવà«àª‚ ન જોઈàª.',
'cite_error' => 'સંદરà«àª­ તà«àª°à«àªŸàª¿: $1',
'cite_error_ref_numeric_key' => 'અમાનà«àª¯ <code>&lt;ref&gt;</code> ટેગ;
નામ માતà«àª° સરળ રાશિ ન હોઈ શકે, વિસà«àª¤à«ƒàª¤ શીરà«àª·àª• આપો',
@@ -1522,7 +1445,7 @@ $messages['gu'] = array(
<code>$1</code>નામના સંદરà«àª­ માટે કોઈ પણ લેખન અપાયà«àª‚ નથી',
'cite_error_included_ref' => '<code>&lt;ref&gt;</code> ટેગને બંધ કરતà«àª‚ <code>&lt;/ref&gt;</code> ખૂટે છે',
'cite_error_refs_without_references' => '<code>&lt;ref&gt;</code> ટેગ અસà«àª¤àª¿àª¤à«àªµàª®àª¾àª‚ છે, પણ <code>&lt;references/&gt;</code> àªàªµà«‹ કોઈ ટેગ ન મળà«àª¯à«‹.',
- 'cite_error_group_refs_without_references' => ' "$1" નામના સમૂહમાં <code>&lt;ref&gt;</code> ટેગ વિહરમાન છે, પણ તેને અનà«àª°à«‚પ <code>&lt;references group="$1"/&gt;</code> ટેગ ન મળà«àª¯à«‹.',
+ 'cite_error_group_refs_without_references' => ' "$1" નામના સમૂહમાં <code>&lt;ref&gt;</code> ટેગ વિહરમાન છે, પણ તેને અનà«àª°à«‚પ <code>&lt;references group="$1"/&gt;</code> ટેગ ન મળà«àª¯à«‹.', # Fuzzy
'cite_error_references_group_mismatch' => '<code>&lt;ref&gt;</code> ટેગને <code>&lt;references&gt;</code> માં આ વિરોધાભાસી લકà«àª·àª£ છે : "$1".',
'cite_error_references_missing_group' => '<code>&lt;references&gt;</code>માં વà«àª¯àª¾àª–à«àª¯àª¾àª¯à«€àª¤ <code>&lt;ref&gt;</code> ટેગનો સમૂહ ગà«àª£ "$1" છે જે પહેલાંની પહેલાંના લેખનમાં નથી.',
'cite_error_references_missing_key' => '<code>&lt;references&gt;</code> માં વà«àª¯àª¾àª–à«àª¯àª¾àª¯àª¿àª¤ $1" નામ સાથેનà«àª‚ <code>&lt;ref&gt;</code> ટેગ આગળના લેખનમાં વપરાયો નથી.',
@@ -1539,13 +1462,6 @@ $messages['gu'] = array(
*/
$messages['he'] = array(
'cite-desc' => 'הוספת תגי <span dir="ltr"><nowiki><ref[ name=id]></nowiki></span> ו־<span dir="ltr"><nowiki><references/></nowiki></span> עבור הערות שוליי×',
- 'cite_croak' => 'ההרחבה Cite קרסה; $1: $2',
- 'cite_error_key_str_invalid' => 'שגי××” פנימית;
-ערך ×œ× ×ª×§×™×Ÿ של <span dir="ltr">$str</span> ו/×ו <span dir="ltr">$key</span>.
-×–×” ×œ× ×מור לקרות לעול×.',
- 'cite_error_stack_invalid_input' => 'שגי××” פנימית;
-מפתח מחסנית ×œ× ×ª×§×™×Ÿ.
-×–×” ×œ× ×מור לקרות לעול×.',
'cite_error' => 'שגי×ת ציטוט: $1',
'cite_error_ref_numeric_key' => 'תג <code>&lt;ref&gt;</code> ×œ× ×ª×§×™×Ÿ;
×©× (name) ×œ× ×™×›×•×œ להיות מספר ×©×œ× ×¤×©×•×˜. יש להשתמש בכותרת תי×ורית',
@@ -1568,13 +1484,15 @@ $messages['he'] = array(
'cite_error_references_no_text' => 'תג <code>&lt;ref&gt;</code> ×œ× ×ª×§×™×Ÿ;
×œ× × ×›×ª×‘ טקסט עבור הערות ×”×©×•×œ×™×™× ×‘×©× <code>$1</code>',
'cite_error_included_ref' => 'חסר תג <code>&lt;/ref&gt;</code> סוגר שמת××™× ×œ×ª×’ <code>&lt;ref&gt;</code>',
- 'cite_error_refs_without_references' => '×§×™×™×ž×™× ×ª×’×™ <code>&lt;ref&gt;</code>, ×ך ×œ× × ×ž×¦× ×ª×’ <code dir="ltr">&lt;references/&gt;</code>',
- 'cite_error_group_refs_without_references' => '×§×™×™×ž×™× ×ª×’×™ <code>&lt;ref&gt;</code> עבור קבוצה ×‘×©× "$1", ×ך ×œ× × ×ž×¦× ×ª×’ <code dir="ltr">&lt;references group="$1"/&gt;</code> מת××™×',
+ 'cite_error_refs_without_references' => '×§×™×™×ž×™× ×ª×’×™ <code>&lt;ref&gt;</code>, ×ך ×œ× × ×ž×¦× ×ª×’ <code dir="ltr">&lt;/references&gt;</code>',
+ 'cite_error_group_refs_without_references' => '×§×™×™×ž×™× ×ª×’×™ <code>&lt;ref&gt;</code> עבור קבוצה ×‘×©× "$1", ×ך ×œ× × ×ž×¦× ×ª×’ <code dir="ltr">&lt;references group="$1"/&gt;</code> מת××™×, ×ו שחסר <code dir="ltr">&lt;/ref&gt;</code> סוגר',
'cite_error_references_group_mismatch' => 'לתג <code>&lt;ref&gt;</code> המוגדר בתוך <code>&lt;references&gt;</code> יש מ×פיין קבוצה (group) סותר, "$1".',
'cite_error_references_missing_group' => 'לתג <code>&lt;ref&gt;</code> המוגדר בתוך <code>&lt;references&gt;</code> יש מ×פיין קבוצה (group) בעל הערך "$1", ש×ינו מופיע בטקסט שלפניו.',
'cite_error_references_missing_key' => 'התג <code>&lt;ref&gt;</code> ×‘×©× "$1" המוגדר בתוך <code>&lt;references&gt;</code> ×ינו × ×ž×¦× ×‘×©×™×ž×•×© בטקסט שלפניו.',
'cite_error_references_no_key' => 'לתג <code>&lt;ref&gt;</code> המוגדר בתוך <code>&lt;references&gt;</code> ×ין מ×פיין ×©× (name).',
'cite_error_empty_references_define' => 'התג <code>&lt;ref&gt;</code> בעל ×”×©× "$1" המוגדר בתוך <code>&lt;references&gt;</code> ×ינו מכיל תוכן.',
+ 'cite_references_link_accessibility_label' => 'לקפוץ מעלה',
+ 'cite_references_link_many_accessibility_label' => 'לקפוץ מעלה ×ל:',
);
/** Hindi (हिनà¥à¤¦à¥€)
@@ -1584,32 +1502,37 @@ $messages['he'] = array(
*/
$messages['hi'] = array(
'cite-desc' => '<nowiki><ref[ name=id]></nowiki> और <nowiki><references/></nowiki> टैग जोड़ता है, उदà¥à¤§à¤°à¤£à¥‹à¤‚ के लिये।',
- 'cite_croak' => 'संदरà¥à¤­ दे नहीं पाये; $1: $2',
- 'cite_error_key_str_invalid' => 'आंतरà¥à¤—त गलती;
-गलत $str या/और $key।
-à¤à¤¸à¤¾ होना नहीं चाहियें।',
- 'cite_error_stack_invalid_input' => 'आंतरà¥à¤—त गलती; गलत सà¥à¤Ÿà¥…क की। à¤à¤¸à¤¾ होना नहीं चाहियें।',
- 'cite_error' => 'गलती उदà¥à¤˜à¥ƒà¤¤ करें: $1',
- 'cite_error_ref_numeric_key' => '<code>&lt;ref&gt;</code> गलत कोड; नाम यह पूरà¥à¤£à¤¾à¤‚की संखà¥à¤¯à¤¾ नहीं हो सकता, कृपया माहितीपूरà¥à¤£ शीरà¥à¤·à¤• दें',
- 'cite_error_ref_no_key' => '<code>&lt;ref&gt;</code> गलत कोड; खाली संदरà¥à¤­à¥‹à¤‚को नाम होना आवशà¥à¤¯à¤• हैं',
- 'cite_error_ref_too_many_keys' => '<code>&lt;ref&gt;</code> गलत कोड; गलत नाम, उदा. ढेर सारी',
+ 'cite_error' => 'सनà¥à¤¦à¤°à¥à¤­ तà¥à¤°à¥à¤Ÿà¤¿: $1',
+ 'cite_error_ref_numeric_key' => 'अमानà¥à¤¯ <code>&lt;ref&gt;</code> टैग;
+नाम साधारण संखà¥à¤¯à¤¾ (integer) नहीं हो सकता, कृपया विसà¥à¤¤à¥ƒà¤¤ शीरà¥à¤·à¤• दें।',
+ 'cite_error_ref_no_key' => 'अमानà¥à¤¯ <code>&lt;ref&gt;</code> टैग;
+खाली संदरà¥à¤­à¥‹à¤‚ का नाम होना आवशà¥à¤¯à¤• है',
+ 'cite_error_ref_too_many_keys' => 'अमानà¥à¤¯ <code>&lt;ref&gt;</code> टैग;
+(संभवतः कई) अमानà¥à¤¯ नाम',
'cite_error_ref_no_input' => 'अमानà¥à¤¯ <code>&lt;ref&gt;</code> टैग;
नाम रहित संदरà¥à¤­à¥‹à¤‚ में जानकारी देना आवशà¥à¤¯à¤• है',
- 'cite_error_references_invalid_parameters' => '<code>&lt;references&gt;</code> चà¥à¤•à¥€à¤šà¤¾ कोड; पॅरॅमीटरà¥à¤¸ नहीं दे सकते, <code>&lt;references /&gt;</code> का इसà¥à¤¤à¥‡à¤®à¤¾à¤² करें',
- 'cite_error_references_invalid_parameters_group' => '<code>&lt;references&gt;</code> गलत कोड; सिरà¥à¤« पॅरॅमीटर का "गà¥à¤°à¥à¤ª" इसà¥à¤¤à¥‡à¤®à¤¾à¤² में लाया जा सकता हैं, <code>&lt;references /&gt;</code> या फिर <code>&lt;references group="..." /&gt;</code> का इसà¥à¤¤à¥‡à¤®à¤¾à¤² करें',
- 'cite_error_references_no_backlink_label' => 'तैयार किये हà¥à¤ पीछे की कड़ियां देनेवाले नाम खतम हà¥à¤ हैं, अधिक नाम <nowiki>[[MediaWiki:Cite references link many format backlink labels]]</nowiki> इस संदेश में बढायें',
- 'cite_error_no_link_label_group' => '"$1" संदरà¥à¤­ समूह के लिये विशिषà¥à¤Ÿ लिंक लेबल कम पड़ गà¤à¥¤
-<nowiki>[[MediaWiki:$2]]</nowiki> सनà¥à¤¦à¥‡à¤¶ में और लेबल परिभाषित करें।',
+ 'cite_error_references_invalid_parameters' => 'अमानà¥à¤¯ <code>&lt;references&gt;</code> टैग;
+पà¥à¤°à¤¾à¤šà¤² (पैरामीटर) सà¥à¤µà¥€à¤•à¥ƒà¤¤ नहीं हैं।
+<code>&lt;references /&gt;</code> का पà¥à¤°à¤¯à¥‹à¤— करें।',
+ 'cite_error_references_invalid_parameters_group' => 'अमानà¥à¤¯ <code>&lt;references&gt;</code> टैग;
+सिरà¥à¤«à¤¼ "group" पà¥à¤°à¤¾à¤šà¤² (पैरामीटर) सà¥à¤µà¥€à¤•à¥ƒà¤¤ है।
+<code>&lt;references /&gt;</code> या <code>&lt;references group="..." /&gt;</code> का पà¥à¤°à¤¯à¥‹à¤— करें।',
+ 'cite_error_references_no_backlink_label' => 'पृषà¥à¤  पाठ की कड़ियाठदेने वाले विशिषà¥à¤Ÿ नाम खतम हो गये।
+अधिक नाम <nowiki>[[MediaWiki:Cite references link many format backlink labels]]</nowiki> संदेश में जोड़ें।',
+ 'cite_error_no_link_label_group' => '"$1" संदरà¥à¤­ समूह के लिये कड़ियों के विशिषà¥à¤Ÿ नाम कम पड़ गà¤à¥¤
+<nowiki>[[MediaWiki:$2]]</nowiki> सनà¥à¤¦à¥‡à¤¶ में और नाम परिभाषित करें।',
'cite_error_references_no_text' => 'अमानà¥à¤¯ <code>&lt;ref&gt;</code> टैग;
<code>$1</code> नामक संदरà¥à¤­ की जानकारी नहीं है',
- 'cite_error_included_ref' => 'समापà¥à¤¤à¥€ <code>&lt;/ref&gt;</code> <code>&lt;ref&gt;</code> टैग लापता',
- 'cite_error_refs_without_references' => '<code>&lt;ref&gt;</code>टैग मौजूद हैं, किनà¥à¤¤à¥ कोई <code>&lt;references/&gt;</code>टैग नहीं मिला',
- 'cite_error_group_refs_without_references' => '<code>&lt;ref&gt;</code> टैग मौजूद है à¤à¤• दल के लिठइस नाम "$1" से, कीनतॠकोई अनà¥à¤°à¥‚प <code>&lt;references group="$1"/&gt;</code> टैग नहीं मिला',
- 'cite_error_references_group_mismatch' => '<code>&lt;ref&gt;</code> टैग इन <code>&lt;references&gt;</code> दल की विशेषता में संघरà¥à¤· "$1"।',
- 'cite_error_references_missing_group' => '<code>&lt;ref&gt;</code> टैग परिभाषित <code>&lt;references&gt;</code> में दलकी विशेषता है "$1" जो पूरà¥à¤µ लेख में दिखाई नहीं दिया ।',
- 'cite_error_references_missing_key' => '<code>&lt;ref&gt;</code> टैग इस नाम "$1" सहित परिभाषित <code>&lt;references&gt;</code> पूरà¥à¤µ लेख में उपयोग नहीं हà¥à¤ˆ ।',
- 'cite_error_references_no_key' => '<code>&lt;ref&gt;</code> टैग में परिभाषित <code>&lt;references&gt;</code> कोई नाम विशेषता नहीं ।',
- 'cite_error_empty_references_define' => '<code>&lt;ref&gt;</code> टैग में परिभाषित <code>&lt;references&gt;</code> नाम सहित "$1" कोई सामगà¥à¤°à¥€ नहीं ।',
+ 'cite_error_included_ref' => '<code>&lt;ref&gt;</code> टैग के लिठसमापà¥à¤¤à¤¿ <code>&lt;/ref&gt;</code> टैग नहीं मिला',
+ 'cite_error_refs_without_references' => '<code>&lt;ref&gt;</code> टैग मौजूद हैं, किनà¥à¤¤à¥ कोई <code>&lt;references/&gt;</code> टैग नहीं मिला',
+ 'cite_error_group_refs_without_references' => '"$1" नामक सनà¥à¤¦à¤°à¥à¤­-समूह के लिठ<code>&lt;ref&gt;</code> टैग मौजूद हैं, परनà¥à¤¤à¥ समूह के लिठकोई <code>&lt;references group="$1"/&gt;</code> टैग नहीं मिला। यह भी संभव है कि कोई समापà¥à¤¤à¤¿ <code>&lt;/ref&gt;</code> टैग गायब है।',
+ 'cite_error_references_group_mismatch' => '<code>&lt;references&gt;</code> में <code>&lt;ref&gt;</code> टैग के लिठgroup पà¥à¤°à¤¾à¤šà¤² (पैरामीटर) में अंतरà¥à¤µà¤¿à¤°à¥‹à¤§à¥€ जानकारी "$1" मौजूद है।',
+ 'cite_error_references_missing_group' => '<code>&lt;references&gt;</code> में परिभाषित <code>&lt;ref&gt;</code> टैग में group पà¥à¤°à¤¾à¤šà¤² (पैरामीटर) "$1" दिया है जो उससे पहले पृषà¥à¤  के पाठ में मौजूद नहीं है।',
+ 'cite_error_references_missing_key' => '<code>&lt;references&gt;</code> में "$1" नाम के साथ परिभाषित <code>&lt;ref&gt;</code> टैग उससे पहले के पाठ में पà¥à¤°à¤¯à¥à¤•à¥à¤¤ नहीं है।',
+ 'cite_error_references_no_key' => '<code>&lt;references&gt;</code> टैग में परिभाषित <code>&lt;ref&gt;</code> टैग का कोई नाम नहीं है।',
+ 'cite_error_empty_references_define' => '<code>&lt;references&gt;</code> टैग में परिभाषित "$1" नामक <code>&lt;ref&gt;</code> टैग में कोई सामगà¥à¤°à¥€ नहीं है।',
+ 'cite_references_link_accessibility_label' => 'वापिस ऊपर जायें',
+ 'cite_references_link_many_accessibility_label' => 'इस तक वापिस ऊपर जायें:',
);
/** Croatian (hrvatski)
@@ -1620,9 +1543,6 @@ $messages['hi'] = array(
*/
$messages['hr'] = array(
'cite-desc' => 'Dodaje <nowiki><ref[ name=id]></nowiki> i <nowiki><references/></nowiki> oznake, za citiranje',
- 'cite_croak' => 'Nevaljan citat; $1: $2',
- 'cite_error_key_str_invalid' => 'Unutarnja pogrješka: loš $str i/ili $key. Ovo se nikada ne bi smjelo dogoditi.',
- 'cite_error_stack_invalid_input' => 'Unutarnja pogrjeÅ¡ka; loÅ¡ kljuÄ stacka. Ovo se nikada ne bi smjelo dogoditi.',
'cite_error' => 'Pogrješka u citiranju: $1',
'cite_error_ref_numeric_key' => 'Loša <code>&lt;ref&gt;</code> oznaka; naziv ne smije biti jednostavni broj, koristite opisni naziv',
'cite_error_ref_no_key' => 'Loša <code>&lt;ref&gt;</code> oznaka; ref-ovi bez sadržaja moraju imati naziv',
@@ -1638,7 +1558,7 @@ Definirajte više putem poruke <nowiki>[[MediaWiki:$2]]</nowiki>.',
'cite_error_references_no_text' => 'Nije zadan tekst za izvor <code>$1</code>',
'cite_error_included_ref' => 'Nedostaje zatvarajući <code>&lt;/ref&gt;</code> za <code>&lt;ref&gt;</code> oznaku',
'cite_error_refs_without_references' => 'oznake <code>&lt;ref&gt;</code> postoje, ali oznaka <code>&lt;references/&gt;</code> nije pronađena',
- 'cite_error_group_refs_without_references' => 'oznake <code>&lt;ref&gt;</code> postoje za skupinu imenovanom "$1", ali nema pripadajuće oznake <code>&lt;references group="$1"/&gt;</code>',
+ 'cite_error_group_refs_without_references' => 'oznake <code>&lt;ref&gt;</code> postoje za skupinu imenovanom "$1", ali nema pripadajuće oznake <code>&lt;references group="$1"/&gt;</code>', # Fuzzy
'cite_error_references_group_mismatch' => '<code>&lt;ref&gt;</code> oznaka u <code>&lt;references&gt;</code> ima konfliktni grupni atribut "$1".',
'cite_error_references_missing_group' => '<code>&lt;ref&gt;</code> oznaka definirana u <code>&lt;references&gt;</code> ima grupni atribut "$1" koji se ne pojavljuje u ranijem tekstu.',
'cite_error_references_missing_key' => '<code>&lt;ref&gt;</code> oznaka s imenom "$1" definirana u <code>&lt;references&gt;</code> nije prethodno rabljena u tekstu.',
@@ -1651,9 +1571,6 @@ Definirajte više putem poruke <nowiki>[[MediaWiki:$2]]</nowiki>.',
*/
$messages['hsb'] = array(
'cite-desc' => 'PÅ™idawa tafliÄki <nowiki><ref[ name=id]></nowiki> a <nowiki><references /></nowiki> za žórÅ‚owe podaća',
- 'cite_croak' => 'Zmylk w referencnym systemje; $1: $2',
- 'cite_error_key_str_invalid' => 'Interny zmylk: njepłaćiwy $str a/abo $key. To njeměło ženje wustupić.',
- 'cite_error_stack_invalid_input' => 'Interny zmylk; njepÅ‚aćiwy kluÄ staploweho skÅ‚ada. To njeměło ženje wustupić.',
'cite_error' => 'Referencny zmylk: $1',
'cite_error_ref_numeric_key' => 'NjepÅ‚aćiwe wužiwanje tafliÄki <code>&lt;ref&gt;</code>; "name" njesmÄ› jednora hódnota integer być, wužij wopisowace mjeno.',
'cite_error_ref_no_key' => 'NjepÅ‚aćiwe wužiwanje tafliÄki <code>&lt;ref&gt;</code>; "ref" bjez wobsaha dyrbi mjeno měć.',
@@ -1670,12 +1587,14 @@ Definuj dalše w zdźělence <nowiki>[[MediaWiki:$2]]</nowiki>.',
'cite_error_references_no_text' => 'Njepłaćiwa referenca formy <code>&lt;ref&gt;</code>; žadyn tekst za referency z mjenom <code>$1</code> podaty.',
'cite_error_included_ref' => 'KónÄny <code>&lt;/ref&gt;</code> za tafliÄku <code>&lt;ref&gt;</code> faluje',
'cite_error_refs_without_references' => 'TafliÄki <code>&lt;ref&gt;</code> ekistuja, ale žana tafliÄka code>&lt;references/&gt;</code> je so namakaÅ‚a',
- 'cite_error_group_refs_without_references' => 'TafliÄki <code>&lt;ref&gt;</code> eksistuja za skupinu z mjenom "$1", ale njeje so wotpowÄ›dowaca tafliÄka <code>&lt;references group="$1"/&gt;</code> namakaÅ‚a',
+ 'cite_error_group_refs_without_references' => 'TafliÄki <code>&lt;ref&gt;</code> eksistuja za skupinu z mjenom "$1", ale njeje so wotpowÄ›dowaca tafliÄka <code>&lt;references group="$1"/&gt;</code> namakaÅ‚a abo zaÄinjacy <code>&lt;/ref&gt;</code> faluje',
'cite_error_references_group_mismatch' => 'TafliÄka <code>&lt;ref&gt;</code> w <code>&lt;references&gt;</code> je ze skupinskim atributom "$1" w konflikće.',
'cite_error_references_missing_group' => 'TafliÄka <code>&lt;ref&gt;</code>, kotraž je w <code>&lt;references&gt;</code> definowana, ma skupinski atribut "$1", kotryž so w prjedawÅ¡im teksće njejewi.',
'cite_error_references_missing_key' => 'TafliÄka <code>&lt;ref&gt;</code> z mjenom "$1", kotraž je w <code>&lt;references&gt;</code> definowana, so w prjedawÅ¡im teksće njewužiwa.',
'cite_error_references_no_key' => 'TafliÄka <code>&lt;ref&gt;</code>, kotraž je w <code>&lt;references&gt;</code> definowana, mjenowy atribut nima.',
'cite_error_empty_references_define' => 'TafliÄka <code>&lt;ref&gt;</code>, kotraž je w <code>&lt;references&gt;</code> z mjenom "$1" definowana, wobsah nima.',
+ 'cite_references_link_accessibility_label' => 'Horje skoÄić',
+ 'cite_references_link_many_accessibility_label' => 'Horje skoÄić do:',
);
/** Haitian (Kreyòl ayisyen)
@@ -1684,13 +1603,6 @@ Definuj dalše w zdźělence <nowiki>[[MediaWiki:$2]]</nowiki>.',
*/
$messages['ht'] = array(
'cite-desc' => 'Ajoute baliz sa yo <nowiki><ref[ name=id]></nowiki> epi <nowiki><referans/></nowiki>, pou sitasyon yo.',
- 'cite_croak' => 'Sitasyon sa pa bon ; $1 : $2',
- 'cite_error_key_str_invalid' => 'Erè nan sistèm an;
-$str epi/oubyen $key pa valab.
-Erè sa pa ta janm dwe rive.',
- 'cite_error_stack_invalid_input' => 'Erè nan sistèm an ;
-kle pil an pa valab.
-Sa pa ta janm dwe rive.',
'cite_error' => 'Erè nan sitasyon : $1',
'cite_error_ref_numeric_key' => 'Etikèt <code>&lt;ref&gt;</code> pa valab;
non pa kapab yon nimewo. Itilize yon tit ki dekri bagay la.',
@@ -1719,9 +1631,6 @@ Nou pa bay pyès tèks pou referans ki rele <code>$1</code>',
*/
$messages['hu'] = array(
'cite-desc' => 'Lehetővé teszi idézések létrehozását <nowiki><ref[ name=id]></nowiki> és <nowiki><references/></nowiki> tagek segítségével',
- 'cite_croak' => 'Sikertelen forráshivatkozás; $1: $2',
- 'cite_error_key_str_invalid' => 'Belső hiba; érvénytelen $str és/vagy $key. Ennek soha nem kellene előfordulnia.',
- 'cite_error_stack_invalid_input' => 'Belső hiba; érvénytelen kulcs. Ennek soha nem kellene előfordulnia.',
'cite_error' => 'Forráshivatkozás-hiba: $1',
'cite_error_ref_numeric_key' => 'Érvénytelen <code>&lt;ref&gt;</code> tag; a name értéke nem lehet csupán egy szám, használj leíró címeket',
'cite_error_ref_no_key' => 'Érvénytelen <code>&lt;ref&gt;</code> tag; a tartalom nélküli ref-eknek kötelező nevet (name) adni',
@@ -1735,7 +1644,7 @@ Adj meg többet a <nowiki>[[MediaWiki:$2]]</nowiki> lapon.',
'cite_error_references_no_text' => 'Érvénytelen <code>&lt;ref&gt;</code> tag; nincs megadva szöveg a(z) <code>$1</code> nevű ref-eknek',
'cite_error_included_ref' => 'Egy <code>&lt;ref&gt;</code> tag lezáró <code>&lt;/ref&gt;</code> része hiányzik',
'cite_error_refs_without_references' => '<code>&lt;ref&gt;</code>-ek vannak a lapon, de nincsen <code>&lt;references/&gt;</code>',
- 'cite_error_group_refs_without_references' => '<code>&lt;ref&gt;</code>-ek léteznek a(z) „$1†csoporthoz, de nincs hozzá <code>&lt;references group="$1"/&gt;</code>',
+ 'cite_error_group_refs_without_references' => '<code>&lt;ref&gt;</code>-ek léteznek a(z) „$1†csoporthoz, de nincs hozzá <code>&lt;references group="$1"/&gt;</code>', # Fuzzy
'cite_error_references_group_mismatch' => 'A <code>&lt;references&gt;</code> és a benne található <code>&lt;ref&gt;</code> tag csoport-attribútuma („$1â€) nem egyezik meg.',
'cite_error_references_missing_group' => '<code>&lt;ref&gt;</code> tag lett lett definiálva egy olyan <code>&lt;references&gt;</code> tagben, amely csoport-attribútuma („$1â€) nem szerepel a szöveg korábbi részében.',
'cite_error_references_missing_key' => 'a <code>&lt;references&gt;</code> tagben definiált „$1†nevű <code>&lt;ref&gt;</code> tag nem szerepel a szöveg korábbi részében.',
@@ -1749,13 +1658,6 @@ Adj meg többet a <nowiki>[[MediaWiki:$2]]</nowiki> lapon.',
*/
$messages['ia'] = array(
'cite-desc' => 'Adde etiquettas <nowiki><ref[ name=id]></nowiki> e <nowiki><references/></nowiki>, pro citationes',
- 'cite_croak' => 'Citation corrumpite; $1: $2',
- 'cite_error_key_str_invalid' => 'Error interne;
-clave $str e/o $key invalide.
-Isto non deberea jammais occurrer.',
- 'cite_error_stack_invalid_input' => 'Error interne;
-clave de pila invalide.
-Isto non deberea jammais occurrer.',
'cite_error' => 'Error de citation: $1',
'cite_error_ref_numeric_key' => 'Etiquetta <code>&lt;ref&gt;</code> invalide;
le nomine non pote esser un numero integre. Usa un titulo descriptive',
@@ -1779,12 +1681,14 @@ Defini plus de istes in le message <nowiki>[[MediaWiki:$2]]</nowiki>.',
nulle texto esseva fornite pro le refs nominate <code>$1</code>',
'cite_error_included_ref' => 'Le clausura <code>&lt;/ref&gt;</code> manca pro le etiquetta <code>&lt;ref&gt;</code>',
'cite_error_refs_without_references' => 'Il existe etiquettas <code>&lt;ref&gt;</code>, ma nulle etiquetta <code>&lt;references/&gt;</code> ha essite trovate',
- 'cite_error_group_refs_without_references' => 'Il existe etiquettas <code>&lt;ref&gt;</code> pro un gruppo nominate "$1", ma nulle etiquetta <code>&lt;references group="$1"/&gt;</code> correspondente ha essite trovate',
+ 'cite_error_group_refs_without_references' => 'Il existe etiquettas <code>&lt;ref&gt;</code> pro un gruppo con nomine "$1", ma nulle etiquetta <code>&lt;references group="$1"/&gt;</code> correspondente ha essite trovate, o un etiquetta de termination <code>&lt;/ref&gt;</code> manca.',
'cite_error_references_group_mismatch' => 'Le etiquetta <code>&lt;ref&gt;</code> in <code>&lt;references&gt;</code> ha un attributo de gruppo "$1" confligente.',
'cite_error_references_missing_group' => 'Le etiquetta <code>&lt;ref&gt;</code> definite in <code>&lt;references&gt;</code> ha un attributo de gruppo "$1" que non appare in le texto precedente.',
'cite_error_references_missing_key' => 'Le etiquetta <code>&lt;ref&gt;</code> con nomine "$1" definite in <code>&lt;references&gt;</code> non es usate in le texto precedente.',
'cite_error_references_no_key' => 'Le etiquetta <code>&lt;ref&gt;</code> definite in <code>&lt;references&gt;</code> non ha un attributo de nomine.',
'cite_error_empty_references_define' => 'Le etiquetta <code>&lt;ref&gt;</code> definite in <code>&lt;references&gt;</code> con nomine "$1" ha nulle contento.',
+ 'cite_references_link_accessibility_label' => 'Retornar',
+ 'cite_references_link_many_accessibility_label' => 'Retornar a:',
);
/** Indonesian (Bahasa Indonesia)
@@ -1796,13 +1700,6 @@ nulle texto esseva fornite pro le refs nominate <code>$1</code>',
*/
$messages['id'] = array(
'cite-desc' => 'Menambahkan tag <nowiki><ref[ name=id]></nowiki> dan <nowiki><references/></nowiki> untuk kutipan',
- 'cite_croak' => 'Kegagalan pengutipan; $1: $2',
- 'cite_error_key_str_invalid' => 'Kesalahan internal;
-$str dan/atau $key tidak sah.
-Kesalahan ini seharusnya tidak terjadi.',
- 'cite_error_stack_invalid_input' => "Kesalahan internal;
-kunci ''stack'' tak sah.
-Kesalahan ini seharusnya tidak terjadi.",
'cite_error' => 'Kesalahan pengutipan: $1',
'cite_error_ref_numeric_key' => 'Tag <code>&lt;ref&gt;</code> tidak sah;
nama tidak boleh intejer sederhana.
@@ -1827,7 +1724,7 @@ Tambahkan ketentuan dalam pesan <nowiki> [[MediaWiki:$2]] </nowiki> .',
tidak ditemukan teks untuk ref bernama <code>$1</code>',
'cite_error_included_ref' => 'Tag <code>&lt;ref&gt;</code> harus ditutup oleh <code>&lt;/ref&gt;</code>',
'cite_error_refs_without_references' => 'Tag <code>&lt;ref&gt;</code> ditemukan, tapi tag <code>&lt;references/&gt;</code> tidak ditemukan',
- 'cite_error_group_refs_without_references' => 'Ditemukan tag <code>&lt;ref&gt;</code> untuk kelompok bernama "$1", tapi tidak ditemukan tag <code>&lt;references group="$1"/&gt;</code> yang berkaitan',
+ 'cite_error_group_refs_without_references' => 'Ditemukan tag <code>&lt;ref&gt;</code> untuk kelompok bernama "$1", tapi tidak ditemukan tag <code>&lt;references group="$1"/&gt;</code> yang berkaitan', # Fuzzy
'cite_error_references_group_mismatch' => 'Tag <code>&lt;ref&gt;</code> di <code>&lt;references&gt;</code> ada atribut kelompok "$1" yang konflik.',
'cite_error_references_missing_group' => 'Tag <code>&lt;ref&gt;</code> yang didefinisikan di <code>&lt;references&gt;</code> memiliki atribut kelompok "$1" yang tidak ditampilkan di teks sebelumnya.',
'cite_error_references_missing_key' => 'Tag <code>&lt;ref&gt;</code> dengan nama "$1" yang didefinisikan di <code>&lt;references&gt;</code> tidak digunakan pada teks sebelumnya.',
@@ -1841,57 +1738,50 @@ tidak ditemukan teks untuk ref bernama <code>$1</code>',
*/
$messages['ig'] = array(
'cite-desc' => 'Tikwá <nowiki><ref[ áhà=id]></nowiki> and <nowiki><references/></nowiki> ndö, maka ntabi okwu',
- 'cite_croak' => 'Nchápụ nwụrụ; $1: $2',
);
/** Iloko (Ilokano)
* @author Lam-ang
*/
$messages['ilo'] = array(
- 'cite-desc' => 'Agnayon ti <nowiki><ref[ name=id]></nowiki> ken <nowiki><references/></nowiki> nga etiketa, para kadagiti pagdakamat',
- 'cite_croak' => 'Natay ti dakamat; $1: $2',
- 'cite_error_key_str_invalid' => 'Akin-uneg a biddut;
-imbalido $str ken/ wenno $tulbek.
-Daytoy ket saan kuman a napasamak.',
- 'cite_error_stack_invalid_input' => 'Akin-uneg a biddut;
-imbalido a tuon a tulbek.
-Daytoy ket saan kuman a napasamak.',
+ 'cite-desc' => 'Aginayon kadagiti etiketa ti <nowiki><ref[ name=id]></nowiki> ken <nowiki><references/></nowiki>, para kadagiti panagdakamat',
'cite_error' => 'Biddut ti dakamat: $1',
- 'cite_error_ref_numeric_key' => 'Imbalido a <code>&lt;ref&gt;</code> nga etiketa;
-ti nagan ket saan a mabalin a nalaka a sibubukel. Agusar ti agipalpalawag a titulo',
- 'cite_error_ref_no_key' => 'Imbalido a <code>&lt;ref&gt;</code> nga etiketa;
-dagita ref nga awan nagyan na ket masapul a managanan',
- 'cite_error_ref_too_many_keys' => 'Imbalido a <code>&lt;ref&gt;</code> nga etiketa;
+ 'cite_error_ref_numeric_key' => 'Imbalido ti etiketa ti <code>&lt;ref&gt;</code>;
+ti nagan ket saan a mabalin a nalaka a sibubukel. Agusar ti makaipalawag a titulo',
+ 'cite_error_ref_no_key' => 'Imbalido nga etiketa ti <code>&lt;ref&gt;</code> ;
+dagita ref nga awan nagyanna ket masapul nga adda naganna',
+ 'cite_error_ref_too_many_keys' => 'Imbalido nga etiketa ti <code>&lt;ref&gt;</code> ;
imbalido a nag-nagan, a kas adu unay',
- 'cite_error_ref_no_input' => 'Imbalido a <code>&lt;ref&gt;</code> nga etiketa;
-dagiti ref nga awan ti nagan na ket masapul nga addaan ti nagyan',
- 'cite_error_references_invalid_parameters' => 'Imbalido a <code>&lt;references&gt;</code> nga etiketa
-awan dagiti parametro a maipalubos.
+ 'cite_error_ref_no_input' => 'Imbalido nga etiketa ti <code>&lt;ref&gt;</code> ;
+dagiti ref nga awan ti naganna ket masapul nga addaan ti nagyan',
+ 'cite_error_references_invalid_parameters' => 'Imbalido nga etiketa ti <code>&lt;references&gt;</code>;
+saan a maipalubos dagiti parametro.
Usaren ti <code>&lt;references /&gt;</code>',
- 'cite_error_references_invalid_parameters_group' => 'Imbalido a <code>&lt;references&gt;</code> nga etiketa;
-parametro a "bunggoy" ket ti maipalubos laeng.
+ 'cite_error_references_invalid_parameters_group' => 'Imbalido nga etiketa ti <code>&lt;references&gt;</code> ;
+maipalubos laeng ti parametro ti "grupo" .
Usaren ti <code>&lt;references /&gt;</code> , wenno<code>&lt;references group="..." /&gt;</code>',
- 'cite_error_references_no_backlink_label' => 'Naibusan kadagiti nagrunaan a likud ti panilpo nga etiketa.
-Ipalawag pay ti adu idiay <nowiki>[[MediaWiki:Cite references link many format backlink labels]]</nowiki> a mensahe',
- 'cite_error_no_link_label_group' => 'Naibusan ti nangruna a panilpo nga etiketa para iti bunggoy ti "$1".
-Ipalawag pay ti adu idiay <nowiki>[[MediaWiki:$2]]</nowiki> a mensahe.',
- 'cite_error_references_no_text' => 'Imbalido a <code>&lt;ref&gt;</code> nga etiketa;
-awan ti testo a naited para dagiti ref a nanaganan <code>$1</code>',
- 'cite_error_included_ref' => 'Irikrikep ti <code>&lt;/ref&gt;</code> napukaw para iti <code>&lt;ref&gt;</code> nga etiketa',
- 'cite_error_refs_without_references' => 'Ti <code>&lt;ref&gt;</code> nga etiketa ket addaan, ngem awan ti <code>&lt;references/&gt;</code> nga etiketa a nabirukan',
- 'cite_error_group_refs_without_references' => 'Ti <code>&lt;ref&gt;</code> nga etiketa para iti bunggoy a nainaganan "$1", ngem awan ti kapadpada a <code>&lt;references group="$1"/&gt;</code> nga etiketa a nabirukan',
- 'cite_error_references_group_mismatch' => 'Ti <code>&lt;ref&gt;</code> nga etiketa iday <code>&lt;references&gt;</code> ket addan ti nagsungat a gupit ti bunggoy "$1".',
- 'cite_error_references_missing_group' => 'Ti <code>&lt;ref&gt;</code> nga etiketa a naipalawag idiay <code>&lt;references&gt;</code> ket addaan ti gupit ti bunggoy "$1" a saan nga agparang iti napalabas a testo.',
- 'cite_error_references_missing_key' => 'Ti <code>&lt;ref&gt;</code> nga etiketa nga addaan ti nagan "$1" a naipalawag idiay <code>&lt;references&gt;</code> ket saan a nausar iti napalabas a testo.',
- 'cite_error_references_no_key' => 'Ti <code>&lt;ref&gt;</code> nga etiketa a naipalawag idiay <code>&lt;references&gt;</code> ket awan ti nainagan a gupit.',
- 'cite_error_empty_references_define' => 'Ti <code>&lt;ref&gt;</code> nga etiketa a naipalawag idiay <code>&lt;references&gt;</code> nga addaan ti nagan a "$1" ket awan ti nagyan na.',
+ 'cite_error_references_no_backlink_label' => 'Naibusan kadagiti etiketa ti naisangayan a silpo ti likud.
+Ipalawag pay ti adu idiay mensahe ti <nowiki>[[MediaWiki:Cite references link many format backlink labels]]</nowiki>',
+ 'cite_error_no_link_label_group' => 'Naibusan kadagiti etiketa ti nangruna a silpo para iti grupo ti "$1".
+Ipalawag pay ti adu idiay mensahe ti <nowiki>[[MediaWiki:$2]]</nowiki> .',
+ 'cite_error_references_no_text' => 'Imbalido nga etiketa ti <code>&lt;ref&gt;</code> ;
+awan ti testo a naited para kadagiti ref a nanaganan <code>$1</code>',
+ 'cite_error_included_ref' => 'Irikepen ti <code>&lt;/ref&gt;</code> napukaw para iti etiketa ti <code>&lt;ref&gt;</code>',
+ 'cite_error_refs_without_references' => 'Ti etiketa ti <code>&lt;ref&gt;</code> ket addan, ngem awan ti etiketa ti <code>&lt;references/&gt;</code> a nabirukan',
+ 'cite_error_group_refs_without_references' => 'Adda dagiti etiketa ti <code>&lt;ref&gt;</code> para iti grupo a nanaganan ti "$1", ngem awan ti kapada nga etiketa ti <code>&lt;references group="$1"/&gt;</code> a nabirukan, wenno awan ti pangrikep ti <code>&lt;/ref&gt;</code>',
+ 'cite_error_references_group_mismatch' => 'Ti etiketa ti <code>&lt;ref&gt;</code> iday <code>&lt;references&gt;</code> ket addan ti kasinnungat a gupit ti grupo ti "$1".',
+ 'cite_error_references_missing_group' => 'Ti etiketa ti <code>&lt;ref&gt;</code> a naipalawag idiay <code>&lt;references&gt;</code> ket addaan ti gupit ti grupo ti "$1" a saan nga agparang iti napalabas a testo.',
+ 'cite_error_references_missing_key' => 'Ti etiketa ti <code>&lt;ref&gt;</code> nga addaan ti nagan ti "$1" a naipalawag idiay <code>&lt;references&gt;</code> ket saan a nausar iti napalabas a testo.',
+ 'cite_error_references_no_key' => 'Ti etiketa ti <code>&lt;ref&gt;</code> a naipalawag idiay <code>&lt;references&gt;</code> ket awan ti nainagan a gupit.',
+ 'cite_error_empty_references_define' => 'Ti etiketa ti <code>&lt;ref&gt;</code> a naipalawag idiay <code>&lt;references&gt;</code> nga addaan ti nagan a "$1" ket awan ti nagyanna.',
+ 'cite_references_link_accessibility_label' => 'Mapan iti ngato',
+ 'cite_references_link_many_accessibility_label' => 'Mapan aginggana iti:',
);
/** Ido (Ido)
* @author Malafaya
*/
$messages['io'] = array(
- 'cite_croak' => 'Cite mortis; $1: $2',
'cite_error' => 'Citala eroro: $1',
);
@@ -1899,12 +1789,6 @@ $messages['io'] = array(
* @author Snævar
*/
$messages['is'] = array(
- 'cite_error_key_str_invalid' => 'Innri villa;
-ógild $str og/eða $key.
-Þetta ætti aldrei að gerast.',
- 'cite_error_stack_invalid_input' => 'Innri villa;
-ógildur stafla lykill.
-Þetta ætti aldrei að gerast.',
'cite_error' => 'Tilvísunar villa: $1',
'cite_error_ref_numeric_key' => 'Villa í <code>&lt;ref&gt;</code> tag;
nafn tilvísunar má ekki vera heil tala. Notaðu lýsandi titil',
@@ -1924,7 +1808,7 @@ Notaðu <code>&lt;references /&gt;</code> eða <code>&lt;references group="..."
tilgreindu texta fyrir tilvísun með nafnið <code>$1</code>',
'cite_error_included_ref' => 'Loka þarf tilvísunni með <code>&lt;/ref&gt;</code> tagi',
'cite_error_refs_without_references' => 'Bæta þarf <code>&lt;references/&gt;</code> við',
- 'cite_error_group_refs_without_references' => '<code>&lt;ref&gt;</code> tag er til fyrir hóp tilvísana undir nafninu "$1", en ekkert sambærilegt <code>&lt;references group="$1"/&gt;</code> tag fannst',
+ 'cite_error_group_refs_without_references' => '<code>&lt;ref&gt;</code> tag er til fyrir hóp tilvísana undir nafninu "$1", en ekkert sambærilegt <code>&lt;references group="$1"/&gt;</code> tag fannst', # Fuzzy
'cite_error_references_group_mismatch' => '<code>&lt;ref&gt;</code> tag í <code>&lt;references&gt;</code> stangast á við hópa eigindið "$1".',
'cite_error_references_missing_group' => '<code>&lt;ref&gt;</code> tag skilgreint í <code>&lt;references&gt;</code> hefur hópa eigindið "$1" sem birtist ekki í textanum á undan.',
'cite_error_references_missing_key' => '<code>&lt;ref&gt;</code> tag með nafnið "$1" og er skilgreint í <code>&lt;references&gt;</code> er ekki notað í textanum á undan.',
@@ -1937,17 +1821,11 @@ tilgreindu texta fyrir tilvísun með nafnið <code>$1</code>',
* @author BrokenArrow
* @author Darth Kule
* @author Erdemaslancan
+ * @author Gianfranco
* @author Pietrodn
*/
$messages['it'] = array(
'cite-desc' => 'Aggiunge i tag <nowiki><ref[ name=id]></nowiki> e <nowiki><references/></nowiki> per gestire le citazioni',
- 'cite_croak' => 'Errore nella citazione: $1: $2',
- 'cite_error_key_str_invalid' => 'Errore interno;
-$str e/o $key errati.
-Non dovrebbe mai verificarsi.',
- 'cite_error_stack_invalid_input' => 'Errore interno:
-chiave di stack errata.
-Non dovrebbe mai verificarsi.',
'cite_error' => 'Errore nella funzione Cite: $1',
'cite_error_ref_numeric_key' => "Errore nell'uso del marcatore <code>&lt;ref&gt;</code>: il nome non può essere un numero intero. Usare un titolo esteso",
'cite_error_ref_no_key' => "Errore nell'uso del marcatore <code>&lt;ref&gt;</code>: i ref vuoti non possono essere privi di nome",
@@ -1962,12 +1840,14 @@ Usare <code>&lt;references /&gt;</code> oppure <code>&lt;references group="..."
'cite_error_references_no_text' => 'Marcatore <code>&lt;ref&gt;</code> non valido; non è stato indicato alcun testo per il marcatore <code>$1</code>',
'cite_error_included_ref' => '<code>&lt;/ref&gt;</code> di chiusura mancante per il marcatore <code>&lt;ref&gt;</code>',
'cite_error_refs_without_references' => 'Sono presenti dei marcatori <code>&lt;ref&gt;</code> ma non è stato trovato alcun marcatore <code>&lt;references/&gt;</code>',
- 'cite_error_group_refs_without_references' => 'Sono presenti dei marcatori <code>&lt;ref&gt;</code> per un gruppo chiamato "$1" ma non è stato trovato alcun marcatore <code>&lt;references group="$1"/&gt;</code> corrispondente',
+ 'cite_error_group_refs_without_references' => 'Sono presenti dei marcatori <code>&lt;ref&gt;</code> per un gruppo chiamato "$1" ma non è stato trovato alcun marcatore <code>&lt;references group="$1"/&gt;</code> corrispondente, o manca la chiusura <code>&lt;/ref&gt;</code>',
'cite_error_references_group_mismatch' => 'Il tag <code>&lt;ref&gt;</code> in <code>&lt;references&gt;</code> ha attributo gruppo "$1" in conflitto.',
'cite_error_references_missing_group' => 'Il tag <code>&lt;ref&gt;</code> definito in <code>&lt;references&gt;</code> ha un attributo gruppo "$1" che non compare nel testo precedente.',
'cite_error_references_missing_key' => 'Il tag <code>&lt;ref&gt;</code> con nome "$1" definito in <code>&lt;references&gt;</code> non è usato nel testo precedente.',
'cite_error_references_no_key' => 'Il tag <code>&lt;ref&gt;</code> definito in <code>&lt;references&gt;</code> non ha un attributo nome.',
'cite_error_empty_references_define' => 'Il tag <code>&lt;ref&gt;</code> definito in <code>&lt;references&gt;</code> con nome "$1" non ha alcun contenuto.',
+ 'cite_references_link_accessibility_label' => 'Salta',
+ 'cite_references_link_many_accessibility_label' => 'Salta a:',
);
/** Japanese (日本語)
@@ -1979,13 +1859,6 @@ Usare <code>&lt;references /&gt;</code> oppure <code>&lt;references group="..."
*/
$messages['ja'] = array(
'cite-desc' => '引用ã®ãŸã‚ã®ã‚¿ã‚° <nowiki><ref[ name=id]></nowiki> ãŠã‚ˆã³ <nowiki><references/></nowiki> を追加ã™ã‚‹',
- 'cite_croak' => '引用機能ã®ã‚¨ãƒ©ãƒ¼ã€‚$1: $2',
- 'cite_error_key_str_invalid' => '内部エラーã§ã™ã€‚
-$str 㨠$key ã®ä¸¡æ–¹ã¾ãŸã¯ä¸€æ–¹ãŒç„¡åŠ¹ã§ã™ã€‚
-ã“ã‚Œã¯ã‚½ãƒ•ãƒˆã‚¦ã‚§ã‚¢ã®ãƒã‚°ã§ã™ã€‚',
- 'cite_error_stack_invalid_input' => '内部エラーã§ã™ã€‚
-スタック キーãŒç„¡åŠ¹ã§ã™ã€‚
-ã“ã‚Œã¯ã‚½ãƒ•ãƒˆã‚¦ã‚§ã‚¢ã®ãƒã‚°ã§ã™ã€‚',
'cite_error' => '引用エラー: $1',
'cite_error_ref_numeric_key' => '無効㪠<code>&lt;ref&gt;</code> ã‚¿ã‚°ã§ã™ã€‚
åå‰ (name 属性) ã«å˜ãªã‚‹æ•´æ•°ã¯ä½¿ç”¨ã§ãã¾ã›ã‚“。説明的ãªã‚‚ã®ã«ã—ã¦ãã ã•ã„',
@@ -2009,21 +1882,20 @@ $str 㨠$key ã®ä¸¡æ–¹ã¾ãŸã¯ä¸€æ–¹ãŒç„¡åŠ¹ã§ã™ã€‚
「<code>$1</code>ã€ã¨ã„ã†åå‰ã®å¼•ç”¨å¥ã«å¯¾ã™ã‚‹ãƒ†ã‚­ã‚¹ãƒˆãŒæŒ‡å®šã•ã‚Œã¦ã„ã¾ã›ã‚“',
'cite_error_included_ref' => '<code>&lt;ref&gt;</code> ã‚¿ã‚°ã«å¯¾å¿œã™ã‚‹ <code>&lt;/ref&gt;</code> ã‚¿ã‚°ãŒä¸è¶³ã—ã¦ã„ã¾ã™',
'cite_error_refs_without_references' => '<code>&lt;ref&gt;</code> ã‚¿ã‚°ãŒã‚ã‚Šã¾ã™ãŒã€<code>&lt;references/&gt;</code> ã‚¿ã‚°ãŒè¦‹ã¤ã‹ã‚Šã¾ã›ã‚“',
- 'cite_error_group_refs_without_references' => '「$1ã€ã¨ã„ã†åå‰ã®ã‚°ãƒ«ãƒ¼ãƒ—ã® <code>&lt;ref&gt;</code> ã‚¿ã‚°ãŒã‚ã‚Šã¾ã™ãŒã€å¯¾å¿œã™ã‚‹ <code>&lt;references group="$1"/&gt;</code> ã‚¿ã‚°ãŒè¦‹ã¤ã‹ã‚Šã¾ã›ã‚“',
+ 'cite_error_group_refs_without_references' => '「$1ã€ã¨ã„ã†åå‰ã®ã‚°ãƒ«ãƒ¼ãƒ—ã® <code>&lt;ref&gt;</code> ã‚¿ã‚°ãŒã‚ã‚Šã¾ã™ãŒã€å¯¾å¿œã™ã‚‹ <code>&lt;references group="$1"/&gt;</code> ã‚¿ã‚°ãŒè¦‹ã¤ã‹ã‚‰ãªã„ã€ã¾ãŸã¯é–‰ã˜ã‚‹ <code>&lt;/ref&gt;</code> ã‚¿ã‚°ãŒã‚ã‚Šã¾ã›ã‚“',
'cite_error_references_group_mismatch' => '<code>&lt;references&gt;</code> ã® <code>&lt;ref&gt;</code> ã‚¿ã‚°ã§ã€group 属性「$1ã€ãŒé‡è¤‡ã—ã¦ã„ã¾ã™ã€‚',
'cite_error_references_missing_group' => '<code>&lt;references&gt;</code> ã§å®šç¾©ã•ã‚Œã¦ã„ã‚‹ <code>&lt;ref&gt;</code> ã‚¿ã‚°ã«ã€å…ˆè¡Œã™ã‚‹ãƒ†ã‚­ã‚¹ãƒˆå†…ã§ä½¿ç”¨ã•ã‚Œã¦ã„ãªã„ group 属性「$1ã€ãŒã‚ã‚Šã¾ã™ã€‚',
'cite_error_references_missing_key' => '<code>&lt;references&gt;</code> ã§å®šç¾©ã•ã‚Œã¦ã„ã‚‹ <code>&lt;ref&gt;</code> ã‚¿ã‚° (name="$1") ã¯ã€å…ˆè¡Œã™ã‚‹ãƒ†ã‚­ã‚¹ãƒˆå†…ã§ä½¿ç”¨ã•ã‚Œã¦ã„ã¾ã›ã‚“。',
'cite_error_references_no_key' => '<code>&lt;references&gt;</code> ã§å®šç¾©ã•ã‚Œã¦ã„ã‚‹ <code>&lt;ref&gt;</code> ã‚¿ã‚°ã« name 属性ãŒã‚ã‚Šã¾ã›ã‚“。',
'cite_error_empty_references_define' => '<code>&lt;references&gt;</code> ã§å®šç¾©ã•ã‚Œã¦ã„ã‚‹ <code>&lt;ref&gt;</code> ã‚¿ã‚° (name="$1") ã«å†…容ãŒã‚ã‚Šã¾ã›ã‚“。',
+ 'cite_references_link_accessibility_label' => 'å…ƒã®ä½ç½®ã«æˆ»ã‚‹',
+ 'cite_references_link_many_accessibility_label' => '以下ã®ä½ç½®ã«æˆ»ã‚‹:',
);
/** Jutish (jysk)
* @author Huslåke
*/
$messages['jut'] = array(
- 'cite_croak' => 'Æ fodnåt døde; $1: $2',
- 'cite_error_key_str_invalid' => 'Intern fejl: Ugyldeg $str og/æller $key. Dette burde aldreg førekåm.',
- 'cite_error_stack_invalid_input' => 'Intern fejl: Ugyldeg staknøgle. Dette burde aldreg førekåm.',
'cite_error' => 'Fodnåtfejl: $1',
'cite_error_ref_numeric_key' => 'Ugyldigt <code>&lt;ref&gt;</code>-tag; "name" kan ikke være et simpelt heltal, brug en beskrivende titel',
'cite_error_ref_no_key' => 'Ugyldigt <code>&lt;ref&gt;</code>-tag: Et <code>&lt;ref&gt;</code>-tag uden indhold skal have et navn',
@@ -2042,13 +1914,6 @@ $messages['jut'] = array(
*/
$messages['jv'] = array(
'cite-desc' => 'Nambahaké tag <nowiki><ref[ name=id]></nowiki> lan <nowiki><references/></nowiki> kanggo kutipan (sitat)',
- 'cite_croak' => 'Sitaté (pangutipané) gagal; $1: $2',
- 'cite_error_key_str_invalid' => 'Kaluputan jero;
-$str lan/utawa $key ora absah.
-Iki sajatiné ora tau olèh kadadéyan.',
- 'cite_error_stack_invalid_input' => 'Kaluputan internal;
-stack key ora absah.
-Iki samesthine ora kadadéan.',
'cite_error' => 'Kaluputan sitat (pangutipan) $1',
'cite_error_ref_numeric_key' => 'Tag <code>&lt;ref&gt;</code> ora absah;
jenengé ora bisa namung angka integer waé. Gunakna irah-irahan (judhul) dèskriptif',
@@ -2072,7 +1937,7 @@ Tambahaké katemton nèng layang <nowiki>[[MediaWiki:$2]]</nowiki>.',
ora ditemokaké tèks kanggo ref mawa jeneng <code>$1</code>',
'cite_error_included_ref' => 'Panutupan <code>&lt;/ref&gt;</code> kélangan tag <code>&lt;ref&gt;</code>',
'cite_error_refs_without_references' => 'Tag <code>&lt;ref&gt;</code> ditemokaké, nanging tag <code>&lt;references/&gt;</code> ora ditemokaké',
- 'cite_error_group_refs_without_references' => 'Tag <code>&lt;ref&gt;</code> ditemokaké kanggo paguyuban ajeneng "$1", nanging tag <code>&lt;references group="$1"/&gt;</code> sing ana kaitané ora ditemokaké',
+ 'cite_error_group_refs_without_references' => 'Tag <code>&lt;ref&gt;</code> ditemokaké kanggo paguyuban ajeneng "$1", nanging tag <code>&lt;references group="$1"/&gt;</code> sing ana kaitané ora ditemokaké', # Fuzzy
'cite_error_references_group_mismatch' => '<code>&lt;ref&gt;</code> tandha <code>&lt;references&gt;</code> nduwèni atribut klompok sing marai konflik "$1".',
'cite_error_references_missing_group' => '<code>&lt;ref&gt;</code> tag sing didhèfinisikaké <code>&lt;references&gt;</code> nduwèni atribut klompok "$1" sing ora njedhul sing tèks sakdurungé.',
'cite_error_references_missing_key' => '<code>&lt;ref&gt;</code> tag sing didhefinisikaké mawa jeneng "$1" <code>&lt;references&gt;</code> ora dianggo nèng tèks sakdurungé.',
@@ -2091,20 +1956,14 @@ ora ditemokaké tèks kanggo ref mawa jeneng <code>$1</code>',
/** Georgian (ქáƒáƒ áƒ—ული)
* @author David1010
* @author Dawid Deutschland
+ * @author Nodar Kherkheulidze
* @author გიáƒáƒ áƒ’იმელáƒ
*/
$messages['ka'] = array(
'cite-desc' => 'áƒáƒ›áƒáƒ¢áƒ”ბს <nowiki><ref[ name=id]></nowiki> დრ<nowiki><references/></nowiki> ტეგებს სქáƒáƒšáƒ˜áƒáƒ¡áƒ—ვის',
- 'cite_croak' => 'ციტáƒáƒ¢áƒ მáƒáƒ™áƒ•áƒáƒ“áƒ; $1: $2',
- 'cite_error_key_str_invalid' => 'შიდრშეცდáƒáƒ›áƒ
-áƒáƒ áƒáƒ¡áƒ¬áƒáƒ áƒ˜ $str დáƒ/áƒáƒœ $key
-áƒáƒ¡áƒ”თი áƒáƒ áƒáƒ¡áƒ“რáƒáƒ¡ áƒáƒ  უნდრგáƒáƒœáƒ›áƒ”áƒáƒ áƒ“ეს',
- 'cite_error_stack_invalid_input' => 'შიდრშეცდáƒáƒ›áƒ.
-სტეკის áƒáƒ áƒáƒ¡áƒ¬áƒáƒ áƒ˜ გáƒáƒ¡áƒáƒ¦áƒ”ბი.
-ეს áƒáƒ  უნდრგáƒáƒœáƒ›áƒ”áƒáƒ áƒ“ეს.',
'cite_error' => 'ციტირების შეცდáƒáƒ›áƒ $1',
- 'cite_error_ref_numeric_key' => 'áƒáƒ áƒáƒ¡áƒ¬áƒáƒ áƒ˜ ტეგი <code>&lt;ref&gt;</code> tag;
-სáƒáƒ®áƒ”ლმიáƒáƒ  უნდრშეიცáƒáƒ•áƒ“ეს ციფრებს.',
+ 'cite_error_ref_numeric_key' => 'áƒáƒ áƒáƒ¡áƒ¬áƒáƒ áƒ˜ <code>&lt;ref&gt;</code> ტეგი;
+სáƒáƒ®áƒ”ლი áƒáƒ  უნდრშეიცáƒáƒ•áƒ“ეს ციფრებს. გáƒáƒ›áƒáƒ˜áƒ§áƒ”ნეთ áƒáƒ¦áƒ¬áƒ”რილáƒáƒ‘ითი სáƒáƒ®áƒ”ლწáƒáƒ“ებáƒ.',
'cite_error_ref_no_key' => 'áƒáƒ áƒáƒ¡áƒ¬áƒáƒ áƒ˜ ტეგი <code>&lt;ref&gt;</code>;
ელემენტი უნდრშეიცáƒáƒ•áƒ“ეს სáƒáƒ®áƒ”ლს.',
'cite_error_ref_too_many_keys' => 'áƒáƒ áƒáƒ¡áƒ¬áƒáƒ áƒ˜ ტეგი <code>&lt;ref&gt;</code>;
@@ -2124,7 +1983,7 @@ $messages['ka'] = array(
სქáƒáƒšáƒ˜áƒáƒ¡áƒáƒ—ვის <code>$1</code> áƒáƒ  áƒáƒ áƒ˜áƒ¡ მითითებული ტექსტი',
'cite_error_included_ref' => 'დáƒáƒ›áƒ®áƒ£áƒ áƒáƒ•áƒ˜ ტეგი <code>&lt;/ref&gt;</code> დáƒáƒ™áƒáƒ áƒ’ულიáƒ',
'cite_error_refs_without_references' => 'áƒáƒ áƒ¡áƒ”ბული ტეგისáƒáƒ—ვის <code>&lt;ref&gt;</code> ვერ მáƒáƒ˜áƒ«áƒ”ბნრშესáƒáƒ‘áƒáƒ›áƒ˜áƒ¡áƒ˜ ტეგი <code>&lt;references/&gt;</code>',
- 'cite_error_group_refs_without_references' => 'ჯგუფი „$1“ áƒáƒ áƒ¡áƒ”ბული ტეგებისáƒáƒ—ვის <code>&lt;ref&gt;</code> ვერ მáƒáƒ˜áƒ«áƒ”ბნრშესáƒáƒ‘áƒáƒ›áƒ˜áƒ¡áƒ˜ ტეგი <code>&lt;references group="$1"/&gt;</code>',
+ 'cite_error_group_refs_without_references' => 'ჯგუფი „$1“ áƒáƒ áƒ¡áƒ”ბული ტეგებისáƒáƒ—ვის <code>&lt;ref&gt;</code> ვერ მáƒáƒ˜áƒ«áƒ”ბნრშესáƒáƒ‘áƒáƒ›áƒ˜áƒ¡áƒ˜ ტეგი <code>&lt;references group="$1"/&gt;</code>, áƒáƒœ გáƒáƒ›áƒáƒ¢áƒáƒ•áƒ”ბულირდáƒáƒ›áƒ®áƒ£áƒ áƒáƒ•áƒ˜ ტეგი <code>&lt;/ref&gt;</code>',
'cite_error_references_group_mismatch' => 'ტეგს <code>&lt;ref&gt;</code> <code>&lt;references&gt;</code>-ში გáƒáƒáƒ©áƒœáƒ˜áƒ áƒáƒ¢áƒ áƒ˜áƒ‘უტთრკáƒáƒœáƒ¤áƒšáƒ˜áƒ¥áƒ¢áƒ£áƒ áƒ˜ ჯგუფები „$1“.',
'cite_error_references_missing_group' => 'ტეგს <code>&lt;ref&gt;</code>, გáƒáƒœáƒ›áƒáƒ áƒ¢áƒ”ბულს <code>&lt;references&gt;</code>-ში, გáƒáƒáƒ©áƒœáƒ˜áƒ ჯგუფის áƒáƒ¢áƒ áƒ˜áƒ‘უტი „$1“, რáƒáƒ›áƒ”ლიც áƒáƒ“რეულ ტექსტში áƒáƒ  მáƒáƒ˜áƒ®áƒ¡áƒ”ნიებáƒ.',
'cite_error_references_missing_key' => 'ტეგი <code>&lt;ref&gt;</code> სáƒáƒ®áƒ”ლáƒáƒ“ „$1“, გáƒáƒ áƒ™áƒ•áƒ”ული <code>&lt;references&gt;</code>-ში, áƒáƒ  გáƒáƒ›áƒáƒ˜áƒ§áƒ”ნებრწინრტექსტში.',
@@ -2142,9 +2001,6 @@ $messages['ka'] = array(
/** Kazakh (Arabic script) (قازاقشا (تٴوتە)â€)
*/
$messages['kk-arab'] = array(
- 'cite_croak' => 'دٵيەكسٶز الۋ سٵتسٸز بٸتتٸ; $1: $2',
- 'cite_error_key_str_invalid' => 'ٸشكٸ قاتە; جارامسىز $str', # Fuzzy
- 'cite_error_stack_invalid_input' => 'ٸشكٸ قاتە; جارامسىز ستەك كٸلتٸ',
'cite_error' => 'دٵيەكسٶز الۋ $1 قاتەسٸ',
'cite_error_ref_numeric_key' => 'جارامسىز <code>&lt;ref&gt;</code> بەلگٸشەسٸ; اتاۋ كٵدٸمگٸ بٷتٸن سان بولۋى مٷمكٸن ەمەس, سيپپاتاۋىش اتاۋ قولدانىڭىز',
'cite_error_ref_no_key' => 'جارامسىز <code>&lt;ref&gt;</code> بەلگٸشەسٸ; ماعلۇماتسىز تٷسٸنٸكتەمەلەردە اتاۋ بولۋى قاجەت',
@@ -2158,9 +2014,6 @@ $messages['kk-arab'] = array(
* @author Kaztrans
*/
$messages['kk-cyrl'] = array(
- 'cite_croak' => 'ДәйекÑөз алу ÑәтÑіз бітті; $1: $2',
- 'cite_error_key_str_invalid' => 'Ішкі қате; жарамÑыз $str', # Fuzzy
- 'cite_error_stack_invalid_input' => 'Ішкі қате; жарамÑыз Ñтек кілті',
'cite_error' => 'ДәйекÑөз алу $1 қатеÑÑ–',
'cite_error_ref_numeric_key' => 'ЖарамÑыз <code>&lt;ref&gt;</code> белгішеÑÑ–; атау кәдімгі бүтін Ñан болуы мүмкін емеÑ, Ñиппатауыш атау қолданыңыз',
'cite_error_ref_no_key' => 'ЖарамÑыз <code>&lt;ref&gt;</code> белгішеÑÑ–; мағлұматÑыз Ñ‚Ò¯Ñініктемелерде атау болуы қажет',
@@ -2175,9 +2028,6 @@ $messages['kk-cyrl'] = array(
/** Kazakh (Latin script) (qazaqşa (latın)‎)
*/
$messages['kk-latn'] = array(
- 'cite_croak' => 'Däýeksöz alw sätsiz bitti; $1: $2',
- 'cite_error_key_str_invalid' => 'İşki qate; jaramsız $str', # Fuzzy
- 'cite_error_stack_invalid_input' => 'İşki qate; jaramsız stek kilti',
'cite_error' => 'Däýeksöz alw $1 qatesi',
'cite_error_ref_numeric_key' => 'Jaramsız <code>&lt;ref&gt;</code> belgişesi; ataw kädimgi bütin san bolwı mümkin emes, sïppatawış ataw qoldanıñız',
'cite_error_ref_no_key' => 'Jaramsız <code>&lt;ref&gt;</code> belgişesi; mağlumatsız tüsiniktemelerde ataw bolwı qajet',
@@ -2200,45 +2050,42 @@ $messages['km'] = array(
* @author Ilovesabbath
* @author Kwj2772
* @author ToePeu
+ * @author ì•„ë¼
*/
$messages['ko'] = array(
- 'cite-desc' => 'ì¸ìš©ì— ì“°ì´ëŠ” <nowiki><ref[ name=id]></nowiki>와 <nowiki><references/></nowiki>태그를 ë”합니다.',
- 'cite_croak' => 'ì¸ìš© 오류; $1: $2',
- 'cite_error_key_str_invalid' => '내부 오류;
-$str í˜¹ì€ $keyê°€ 잘못ë˜ì—ˆìŠµë‹ˆë‹¤.
-ì´ ì˜¤ë¥˜ëŠ” ë°œìƒí•˜ì§€ 않아야 합니다.',
- 'cite_error_stack_invalid_input' => '내부 오류; ìŠ¤íƒ í‚¤ê°€ 잘못ë˜ì—ˆìŠµë‹ˆë‹¤.
-ì´ ì˜¤ë¥˜ëŠ” ë°œìƒí•˜ì§€ ë§ì•„야 합니다.',
+ 'cite-desc' => 'ì¸ìš©ì— ì“°ì´ëŠ” <nowiki><ref[ name=id]></nowiki>와 <nowiki><references/></nowiki> 태그를 추가합니다',
'cite_error' => 'ì¸ìš© 오류: $1',
'cite_error_ref_numeric_key' => '<code>&lt;ref&gt;</code> 태그가 잘못ë˜ì—ˆìŠµë‹ˆë‹¤;
-ì´ë¦„ì€ ìˆ«ìžê°€ ë  ìˆ˜ 없습니다. 설명ì ì¸ ì´ë¦„ì„ ì‚¬ìš©í•˜ì‹­ì‹œì˜¤.',
+ì´ë¦„ì€ ìˆ«ìžê°€ ë  ìˆ˜ 없습니다. 설명ì ì¸ ì´ë¦„ì„ ì‚¬ìš©í•˜ì„¸ìš”',
'cite_error_ref_no_key' => '<code>&lt;ref&gt;</code> 태그가 잘못ë˜ì—ˆìŠµë‹ˆë‹¤;
-ë‚´ìš©ì´ ì—†ëŠ” 주ì„ì€ ì´ë¦„ì´ ìžˆì–´ì•¼ 합니다.',
- 'cite_error_ref_too_many_keys' => 'ìž˜ëª»ëœ <code>&lt;ref&gt;</code> 태그 사용;
-예컨대 ìž˜ëª»ëœ ì£¼ì„ ì´ë¦„ì´ ë„ˆë¬´ 많습니다.',
+ë‚´ìš©ì´ ì—†ëŠ” 주ì„ì€ ì´ë¦„ì´ ìžˆì–´ì•¼ 합니다',
+ 'cite_error_ref_too_many_keys' => '<code>&lt;ref&gt;</code> 태그가 잘못ë˜ì—ˆìŠµë‹ˆë‹¤;
+ìž˜ëª»ëœ ì´ë¦„입니다, 너무 ë§Žì€ ë“±',
'cite_error_ref_no_input' => '<code>&lt;ref&gt;</code> 태그가 잘못ë˜ì—ˆìŠµë‹ˆë‹¤;
-ì´ë¦„ì´ ì—†ëŠ” ref 태그는 반드시 ë‚´ìš©ì´ ìžˆì–´ì•¼ 합니다.',
+ì´ë¦„ì´ ì—†ëŠ” ref 태그는 반드시 ë‚´ìš©ì´ ìžˆì–´ì•¼ 합니다',
'cite_error_references_invalid_parameters' => '<code>&lt;references&gt;</code> 태그가 잘못ë˜ì—ˆìŠµë‹ˆë‹¤;
-변수를 넣어서는 안 ë©ë‹ˆë‹¤.
-<code>&lt;references /&gt;</code>를 ì´ìš©í•˜ì‹­ì‹œì˜¤.',
+변수를 넣으면 안ë©ë‹ˆë‹¤.
+<code>&lt;references /&gt;</code>를 사용하세요',
'cite_error_references_invalid_parameters_group' => '<code>&lt;references&gt;</code> 태그가 잘못ë˜ì—ˆìŠµë‹ˆë‹¤;
"group" 변수만 사용할 수 있습니다.
-<code>&lt;references /&gt;</code>나 <code>&lt;references group="..." /&gt;</code>만 ì´ìš©í•˜ì‹­ì‹œì˜¤.',
- 'cite_error_references_no_backlink_label' => 'ì—­ë§í¬ ë¼ë²¨ì´ 부족합니다.
-<nowiki>[[MediaWiki:Cite references link many format backlink labels]]</nowiki>ì— ë” ë§Žì€ ë¼ë²¨ì„ 추가하십시오.',
- 'cite_error_no_link_label_group' => '그룹 "$1"ì— ëŒ€í•´ ë§í¬ ë ˆì´ë¸”ì´ ëª¨ë‘ ë–¨ì–´ì¡ŒìŠµë‹ˆë‹¤.
-<nowiki>[[MediaWiki:$2]]</nowiki> ë©”ì‹œì§€ì— ë” ë§Žì€ ë ˆì´ë¸”ì„ ì •ì˜í•´ì£¼ì‹­ì‹œì˜¤.',
- 'cite_error_references_no_text' => '<code>&lt;ref&gt;</code> 태그가 잘못ë˜ì—ˆìŠµë‹ˆë‹¤.
-<code>$1</code>ë¼ëŠ” ì´ë¦„ì„ ê°€ì§„ 주ì„ì— ëŒ€í•œ ë‚´ìš©ì´ ì—†ìŠµë‹ˆë‹¤.',
- 'cite_error_included_ref' => '<code>&lt;ref&gt;</code> 태그를 닫는 <code>&lt;/ref&gt;</code> 태그가 없습니다.',
- 'cite_error_refs_without_references' => '<code>&lt;ref&gt;</code> 태그가 존재하지만, <code>&lt;references/&gt;</code> 태그가 없습니다.',
- 'cite_error_group_refs_without_references' => '"$1"ì´ë¼ëŠ” ì´ë¦„ì„ ê°€ì§„ ê·¸ë£¹ì— ëŒ€í•œ <code>&lt;ref&gt;</code> 태그가 존재하지만, ì´ì— 대ì‘하는 <code>&lt;references group="$1" /&gt;</code> 태그가 없습니다.',
- 'cite_error_references_group_mismatch' => '<code>&lt;references&gt;</code> ì•ˆì— ìžˆëŠ” <code>&lt;ref&gt;</code> íƒœê·¸ì˜ ê·¸ë£¹ ì†ì„± "$1"ì´ ì¶©ëŒë©ë‹ˆë‹¤.',
- 'cite_error_references_missing_group' => '<code>&lt;references&gt;</code> ì•ˆì˜ <code>&lt;ref&gt;</code> 태그가 ì´ì „ì— ì¡´ìž¬í•˜ì§€ 않는 그룹 ì†ì„± "$1"ì„ ê°–ê³  있습니다.',
+<code>&lt;references /&gt;</code>나 <code>&lt;references group="..." /&gt;</code>를 사용하세요',
+ 'cite_error_references_no_backlink_label' => 'ì‚¬ìš©ìž ì§€ì • ë°±ë§í¬ ë¼ë²¨ì´ ë°”ë‹¥ì´ ë‚¬ìŠµë‹ˆë‹¤.
+<nowiki>[[MediaWiki:Cite references link many format backlink labels]]</nowiki>ë©”ì‹œì§€ì— ë” ì •ì˜í•˜ì„¸ìš”.',
+ 'cite_error_no_link_label_group' => '"$1" ê·¸ë£¹ì— ëŒ€í•´ ì‚¬ìš©ìž ì§€ì • ë§í¬ ë ˆì´ë¸”ì´ ë°”ë‹¥ì´ ë‚¬ìŠµë‹ˆë‹¤.
+<nowiki>[[MediaWiki:$2]]</nowiki> ë©”ì‹œì§€ì— ë” ì •ì˜í•˜ì„¸ìš”.',
+ 'cite_error_references_no_text' => '<code>&lt;ref&gt;</code> 태그가 잘못ë˜ì—ˆìŠµë‹ˆë‹¤;
+<code>$1</code>ë¼ëŠ” ì´ë¦„ì„ ê°€ì§„ 주ì„ì— ì œê³µí•œ í…스트가 없습니다',
+ 'cite_error_included_ref' => '<code>&lt;ref&gt;</code> 태그를 닫는 <code>&lt;/ref&gt;</code> 태그가 없습니다',
+ 'cite_error_refs_without_references' => '<code>&lt;ref&gt;</code> 태그가 존재하지만, <code>&lt;references/&gt;</code> 태그가 없습니다',
+ 'cite_error_group_refs_without_references' => '"$1"ì´ë¼ëŠ” ì´ë¦„ì„ ê°€ì§„ ê·¸ë£¹ì— ëŒ€í•œ <code>&lt;ref&gt;</code> 태그가 존재하지만, ì´ì— 대ì‘하는 <code>&lt;references group="$1" /&gt;</code> 태그가 없거나, 태그를 닫는 <code>&lt;/ref&gt;</code> 태그가 없습니다',
+ 'cite_error_references_group_mismatch' => '<code>&lt;references&gt;</code> ì•ˆì— ìžˆëŠ” <code>&lt;ref&gt;</code> 태그ì—ì„œ "$1" 그룹 íŠ¹ì„±ì´ ì¶©ëŒë©ë‹ˆë‹¤.',
+ 'cite_error_references_missing_group' => '<code>&lt;references&gt;</code> ì•ˆì— ì •ì˜ëœ <code>&lt;ref&gt;</code> íƒœê·¸ì— ì´ì „ í…ìŠ¤íŠ¸ì— ì—†ëŠ” "$1" 그룹 íŠ¹ì„±ì´ ìžˆìŠµë‹ˆë‹¤.',
'cite_error_references_missing_key' => '<code>&lt;references&gt;</code> ì•ˆì— ì •ì˜ëœ "$1"ì´ë¼ëŠ” ì´ë¦„ì„ ê°€ì§„ <code>&lt;ref&gt;</code> 태그가 위ì—ì„œ 사용ë˜ê³  있지 않습니다.',
- 'cite_error_references_no_key' => '<code>&lt;references&gt;</code> ì•ˆì˜ <code>&lt;ref&gt;</code> íƒœê·¸ì— ì´ë¦„ì´ ì—†ìŠµë‹ˆë‹¤.',
+ 'cite_error_references_no_key' => '<code>&lt;references&gt;</code> ì•ˆì— ì •ì˜ëœ <code>&lt;ref&gt;</code> íƒœê·¸ì— ì´ë¦„ íŠ¹ì„±ì´ ì—†ìŠµë‹ˆë‹¤.',
'cite_error_empty_references_define' => '<code>&lt;references&gt;</code> 태그 ì•ˆì— ì •ì˜ëœ "$1"ì´ë¼ëŠ” ì´ë¦„ì„ ê°€ì§„ <code>&lt;ref&gt;</code> íƒœê·¸ì— ë‚´ìš©ì´ ì—†ìŠµë‹ˆë‹¤.',
'cite_references_link_many_format_backlink_labels' => 'ê°€ 나 다 ë¼ ë§ˆ ë°” 사 ì•„ ìž ì°¨ ì¹´ 타 파 하 ê±° 너 ë” ëŸ¬ 머 버 ì„œ ì–´ ì € 처 커 í„° í¼ í—ˆ ê³  ë…¸ ë„ ë¡œ 모 ë³´ 소 오 ì¡° ì´ˆ ì½” 토 í¬ í˜¸ 구 누 ë‘ ë£¨ 무 부 수 ìš° 주 추 ì¿  투 푸 후 ê·¸ ëŠ ë“œ 르 므 브 스 으 즈 츠 í¬ íŠ¸ 프 í 기 니 ë”” 리 미 비 ì‹œ ì´ ì§€ 치 키 í‹° 피 히',
+ 'cite_references_link_accessibility_label' => 'ì´ë™',
+ 'cite_references_link_many_accessibility_label' => 'ì´ë™:',
);
/** Colognian (Ripoarisch)
@@ -2247,13 +2094,6 @@ $str í˜¹ì€ $keyê°€ 잘못ë˜ì—ˆìŠµë‹ˆë‹¤.
*/
$messages['ksh'] = array(
'cite-desc' => 'Erlaub Quelle un Referenze met <nowiki><ref[ name="id"]></nowiki> un <nowiki><references /></nowiki> aanzejevve.',
- 'cite_croak' => 'Fääler met Refenenze. $1: $2',
- 'cite_error_key_str_invalid' => 'Interne Fähler in <i lang="en">cite</i>:
-<code>$str</code> udder <code>$key</code> stemme nit.
-Dat sull nie optredde.',
- 'cite_error_stack_invalid_input' => 'Interne Fähler in <i lang="en">cite</i>:
-Der <i lang="en">stack</i>-Schlößel stemmp nit.
-Dat sull nie optredde.',
'cite_error' => 'Fähler in <i lang="en">cite</i> met Referenze: $1',
'cite_error_ref_numeric_key' => 'Fähler en <i lang="en">cite</i>:
Ene <code>&lt;ref&gt;</code>-Name kann kei Zahl sin.
@@ -2282,7 +2122,7 @@ Et wohr keine Tex aanjejovve för de
<code>&lt;ref&gt;</code>s met dämm Name „<code>$1</code>“.',
'cite_error_included_ref' => 'Hee för dat <code>&lt;ref&gt;</code> ham_mer kei zopaß <code>&lt;/ref&gt;</code>',
'cite_error_refs_without_references' => 'Et sinn_er <code>&lt;ref&gt;</code>-Befähle en dä Sigg, ävver mer han keine <code>&lt;references/&gt;</code>-Befähl jefunge.',
- 'cite_error_group_refs_without_references' => 'Et sinn_er <code>&lt;ref&gt;</code>-Befähle för de jrop „$1“ en hee dä Sigg, ävver mer han keine <code>&lt;references group="$1"/&gt;</code>-Befähl jefunge.',
+ 'cite_error_group_refs_without_references' => 'Et sinn_er <code>&lt;ref&gt;</code>-Befähle för de jrop „$1“ en hee dä Sigg, ävver mer han keine <code>&lt;references group="$1"/&gt;</code>-Befähl jefunge.', # Fuzzy
'cite_error_references_group_mismatch' => 'Dä <code>&lt;ref&gt;</code> Befähl en <code>&lt;references&gt;</code> hät en widerschpröschlesche Jroppe-Eijeschaff „$1“.',
'cite_error_references_missing_group' => 'Dä <code>&lt;ref&gt;</code> Befähl, aanjejoove em Befähl <code>&lt;references&gt;</code>, hät en Jroppe-Eijeschaff „$1“, di ävver em Täx doför nit vörjekumme es.',
'cite_error_references_missing_key' => 'Dä <code>&lt;ref&gt;</code> Befähl mem Naame „$1“, aanjejoove em Befähl <code>&lt;references&gt;</code>, es em Täx doför nit vörjekumme.',
@@ -2296,10 +2136,11 @@ Et wohr keine Tex aanjejovve för de
/** Cornish (kernowek)
* @author Kernoweger
+ * @author Nrowe
*/
$messages['kw'] = array(
'cite_error' => 'Gwall devynna: $1',
- 'cite_error_refs_without_references' => 'Yma tagys <code>&lt;ref&gt;</code>, mes ny veu kevys tag <code>&lt;references/&gt;</code>',
+ 'cite_error_refs_without_references' => 'Yma tagys <code>&lt;ref&gt;</code>, mes ny gavas tag <code>&lt;references/&gt;</code>',
);
/** Luxembourgish (Lëtzebuergesch)
@@ -2308,13 +2149,6 @@ $messages['kw'] = array(
*/
$messages['lb'] = array(
'cite-desc' => 'Setzt <nowiki><ref[ name=id]></nowiki> an <nowiki><references/></nowiki> Taggen derbäi, fir Zitatiounen.',
- 'cite_croak' => 'Feeler am Referenz-System. $1 : $2',
- 'cite_error_key_str_invalid' => 'Interne Feeler;
-net valabele $str an/oder $key.
-Dëst sollt eigentlech ni geschéien.',
- 'cite_error_stack_invalid_input' => "Interne Feeler;
-ongëltege ''stack''-Schlëssel.
-Dës sollt eigentlech guer net geschéien.",
'cite_error' => 'Zitéierfeeler: $1',
'cite_error_ref_numeric_key' => 'Ongëltegen <code>&lt;ref&gt;</code> Tag;
Den Numm ka keng einfach ganz Zuel sinn. Benotzt w.e.g. een Titel den eng Beschreiwung gëtt',
@@ -2334,12 +2168,14 @@ Benotzt <code>&lt;references /&gt;</code>, oder <code>&lt;references group="..."
et gouf keen Text ugi fir d'Referenze mam Numm <code>$1</code>",
'cite_error_included_ref' => 'Den Tag <code>&lt;/ref&gt;</code> feelt fir den Tag <code>&lt;ref&gt;</code> zouzemaachen',
'cite_error_refs_without_references' => "D'Markéierung <code>&lt;ref&gt;</code> gëtt et, awer d'Markéierung <code>&lt;references/&gt;</code> gouf net fonnt",
- 'cite_error_group_refs_without_references' => 'D\'Markéierung <code>&lt;ref&gt;</code> gëtt et fir d\'Grupp "$1", awer d\'entspriechend Markéierung <code>&lt;references group="$1"/&gt;</code> gouf net fonnt',
+ 'cite_error_group_refs_without_references' => 'D\'Markéierung <code>&lt;ref&gt;</code> gëtt et fir d\'Grupp "$1", awer d\'entspriechend Markéierung <code>&lt;references group="$1"/&gt;</code> gouf net fonnt oder een <code>&lt;/ref&gt;</code> feelt',
'cite_error_references_group_mismatch' => 'Den <code>&lt;ref&gt;</code>-Tag an <code>&lt;references&gt;</code> huet den Attribut "$1" deen am Konflikt mat deem am <code>&lt;references&gt;</code> steet.',
'cite_error_references_missing_group' => 'Deen am <code>&lt;references&gt;</code> definéierten <code>&lt;ref&gt;</code>-Tag huet en Attribut "$1" deen am Text virdrun net dran ass.',
'cite_error_references_missing_key' => 'Deen am <code>&lt;references&gt;</code> definéierten <code>&lt;ref&gt;</code>-Tag mam Numm "$1" gëtt am Text virdrun net benotzt.',
'cite_error_references_no_key' => "D'Markéierung <code>&lt;ref&gt;</code> déi an <code>&lt;references&gt;</code> definéiert ass huet keng Nummeegeschaft.",
'cite_error_empty_references_define' => "D'Markéierung <code>&lt;ref&gt;</code> déi am <code>&lt;references&gt;</code> mat dem Numm « $1 » definéiert ass, ass eidel.",
+ 'cite_references_link_accessibility_label' => 'No uewe sprangen',
+ 'cite_references_link_many_accessibility_label' => 'Eropsprangen op:',
);
/** Limburgish (Limburgs)
@@ -2348,9 +2184,6 @@ et gouf keen Text ugi fir d'Referenze mam Numm <code>$1</code>",
*/
$messages['li'] = array(
'cite-desc' => 'Voeg <nowiki><ref[ name=id]></nowiki> en <nowiki><references/></nowiki> tags toe veur citate',
- 'cite_croak' => 'Perbleem mit Citere; $1: $2',
- 'cite_error_key_str_invalid' => 'Interne fout; ónzjuuste $str en/of $key. Dit zów noeaits mótte veurkómme.',
- 'cite_error_stack_invalid_input' => 'Interne fout; ónzjuuste stacksleutel. Dit zów noeaits mótte veurkómme.',
'cite_error' => 'Citeerfout: $1',
'cite_error_ref_numeric_key' => "Ónzjuuste tag <code>&lt;ref&gt;</code>; de naam kin gein simpele integer zeen, gebroek 'ne besjrievendje titel",
'cite_error_ref_no_key' => "Ónzjuuste tag <code>&lt;ref&gt;</code>; refs zónger inhoud mótte 'ne naam höbbe",
@@ -2366,7 +2199,7 @@ Doe kans d\'r mier insjtelle in \'t sysyeemberich <nowiki>[[MediaWiki:$2]]</nowi
'cite_error_references_no_text' => "Ónzjuuste tag <code>&lt;ref&gt;</code>; d'r is gein teks opgegaeve veur refs mit de naam <code>$1</code>",
'cite_error_included_ref' => 'Gein sjloetteike <code>&lt;/ref&gt;</code> veur de tag <code>&lt;ref&gt;</code>',
'cite_error_refs_without_references' => 'De tag <code>&lt;ref&gt;</code> besteit al, meh de tag <code>&lt;references/&gt;</code> is neet aangetróffe',
- 'cite_error_group_refs_without_references' => 'd\'r Besteit \'ne tag <code>&lt;ref&gt;</code> veure groep "$1", meh d\'r is geine bebehuuerendje tag <code>&lt;references group="$1"/&gt;</code> gevónje',
+ 'cite_error_group_refs_without_references' => 'd\'r Besteit \'ne tag <code>&lt;ref&gt;</code> veure groep "$1", meh d\'r is geine bebehuuerendje tag <code>&lt;references group="$1"/&gt;</code> gevónje', # Fuzzy
'cite_error_references_group_mismatch' => 'De tag <code>&lt;ref&gt;</code> in <code>&lt;references&gt;</code> conflicteert mit groepseigesjap "$1".',
'cite_error_references_missing_group' => 'De tag <code>&lt;ref&gt;</code> dae is gedefinieerd in <code>&lt;references&gt;</code> haet de groepseigesjap "$1" neet ierder in de tekst veurkump.',
'cite_error_references_missing_key' => 'De tag <code>&lt;ref&gt;</code> mit de naam "$1" gedefiniteerd in <code>&lt;references&gt;</code> weurt neet ierder in de teks gebroek.',
@@ -2374,6 +2207,15 @@ Doe kans d\'r mier insjtelle in \'t sysyeemberich <nowiki>[[MediaWiki:$2]]</nowi
'cite_error_empty_references_define' => 'De tag <code>&lt;ref&gt;</code> dae is gedefinieerd in <code>&lt;references&gt;</code> mit de naam "$1" haet geinen inhawd.',
);
+/** لوری (لوری)
+ * @author Mogoeilor
+ */
+$messages['lrc'] = array(
+ 'cite_error' => 'خطا جاگه:$1',
+ 'cite_references_link_accessibility_label' => 'بالا پرسن',
+ 'cite_references_link_many_accessibility_label' => 'پرستن د',
+);
+
/** Lithuanian (lietuvių)
* @author Garas
* @author Homo
@@ -2381,9 +2223,6 @@ Doe kans d\'r mier insjtelle in \'t sysyeemberich <nowiki>[[MediaWiki:$2]]</nowi
*/
$messages['lt'] = array(
'cite-desc' => 'Prideda <nowiki><ref[ name=id]></nowiki> ir <nowiki><references/></nowiki> žymes citavimui',
- 'cite_croak' => 'Cituoti nepavyko; $1: $2',
- 'cite_error_key_str_invalid' => 'VidinÄ— klaida; neleistinas $str',
- 'cite_error_stack_invalid_input' => 'VidinÄ— klaida; neleistinas steko raktas',
'cite_error' => 'Citavimo klaida $1',
'cite_error_ref_numeric_key' => 'Neleistina <code>&lt;ref&gt;</code> gairÄ—; vardas negali bÅ«ti tiesiog skaiÄius, naudokite tekstinį pavadinimÄ…',
'cite_error_ref_no_key' => 'Neleistina <code>&lt;ref&gt;</code> gairÄ—; nuorodos be turinio turi turÄ—ti vardÄ…',
@@ -2412,13 +2251,6 @@ $messages['lv'] = array(
*/
$messages['mg'] = array(
'cite-desc' => 'Mamnpy ny balizy <tt><nowiki><ref[ name="id"]></nowiki></tt> et <tt><nowiki><references/></nowiki></tt> ho an\'ny tsiahy.',
- 'cite_croak' => 'Tsiahy tsy miafana ; $1 : $2',
- 'cite_error_key_str_invalid' => 'Tsy fetezana ety anaty;
-Tsy mety $str na $key.
-Tokony tsy hitranga mihintsy ity tsy fetezana ity.',
- 'cite_error_stack_invalid_input' => 'Tsy fetezana ety anaty ;
-tsy mety ny stack key.
-Tokony tsy hitranga mihitsy ity tsy fetezana ity.',
);
/** Minangkabau (Baso Minangkabau)
@@ -2426,13 +2258,6 @@ Tokony tsy hitranga mihitsy ity tsy fetezana ity.',
*/
$messages['min'] = array(
'cite-desc' => 'Manambahkan tag <nowiki><ref[ name=id]></nowiki> jo <nowiki><references/></nowiki> untuak kutipan',
- 'cite_croak' => 'Pautan mati; $1: $2',
- 'cite_error_key_str_invalid' => 'Kasalahan internal;
-$str jo/atau $key indak sah.
-Kasalahan ko sabananyo indak buliah tajadi.',
- 'cite_error_stack_invalid_input' => 'Kasalahan internal;
-kunci "stack" indak sah.
-Kasalahan ko sabananyo indak buliah tajadi.',
'cite_error' => 'Kutipan rusak: $1',
'cite_error_ref_numeric_key' => 'Tag <code>&lt;ref&gt;</code> indak sah;
parameter indak buliah angko atau/hurup sadarano.
@@ -2457,7 +2282,7 @@ Tantukan labiah lanjuik dalam <nowiki>[[MediaWiki:$2]]</nowiki>.',
indak ado teks untuak ref banamo <code>$1</code>',
'cite_error_included_ref' => 'Tag <code>&lt;ref&gt;</code> harus ditutuik jo <code>&lt;/ref&gt;</code>',
'cite_error_refs_without_references' => 'Tag <code>&lt;ref&gt;</code> ado, tapi <code>&lt;references/&gt;</code> indak ado',
- 'cite_error_group_refs_without_references' => 'Tag <code>&lt;ref&gt;</code> ado untuak grup banamo "$1", tapi indak ado <code>&lt;references group="$1"/&gt;</code>',
+ 'cite_error_group_refs_without_references' => 'Tag <code>&lt;ref&gt;</code> ado untuak grup banamo "$1", tapi indak ado <code>&lt;references group="$1"/&gt;</code>', # Fuzzy
'cite_error_references_group_mismatch' => 'Tag <code>&lt;ref&gt;</code> pado <code>&lt;references&gt;</code> ado namo grup "$1" nan konflik.',
'cite_error_references_missing_group' => 'Tag <code>&lt;ref&gt;</code> pado <code>&lt;references&gt;</code> indak ado namo grup "$1".',
'cite_error_references_missing_key' => 'Tag <code>&lt;ref&gt;</code> jo namo "$1" pado <code>&lt;references&gt;</code> indak ado.',
@@ -2481,13 +2306,6 @@ indak ado teks untuak ref banamo <code>$1</code>',
*/
$messages['mk'] = array(
'cite-desc' => 'Додава ознаки <nowiki><ref[ name=id]></nowiki> и <nowiki><references/></nowiki>, за цитирања',
- 'cite_croak' => 'Ðаводот Ñе урна; $1: $2',
- 'cite_error_key_str_invalid' => 'Внатрешна грешка;
-погрешна вредноÑÑ‚ на $str и/или $key.
-Ова никогаш не треба да Ñе Ñлучува.',
- 'cite_error_stack_invalid_input' => 'Внатрешна грешка;
-погрешен клуч за купот.
-Ова никогаш не треба да Ñе Ñлучува.',
'cite_error' => 'Грешка во наводот: $1.',
'cite_error_ref_numeric_key' => 'Погрешна ознака <code>&lt;ref&gt;</code>;
името не може да биде број. Употребете опиÑен наÑлов',
@@ -2511,12 +2329,14 @@ $messages['mk'] = array(
нема зададено текÑÑ‚ за наводите по име <code>$1</code>',
'cite_error_included_ref' => 'Ðа ознаката <code>&lt;ref&gt;</code> Ñ Ð½ÐµÐ´Ð¾ÑтаÑува ознака за затворање &lt;/ref&gt',
'cite_error_refs_without_references' => 'Статијата има ознаки <code>&lt;ref&gt;</code>, но не ја најдов потребната ознака <code>&#123;&#123;наводи&#125;&#125;</code> (или <code>&lt;references/&gt;</code>)',
- 'cite_error_group_refs_without_references' => 'Има ознаки <code>&lt;ref&gt;</code> за група именувана како „$1“, но нема Ñоодветна ознака <code>&lt;references group="$1"/&gt;</code>',
+ 'cite_error_group_refs_without_references' => 'Има ознаки <code>&lt;ref&gt;</code> за група именувана како „$1“, но нема Ñоодветна ознака <code>&lt;references group="$1"/&gt;</code>, или пак недоÑтаÑува завршно <code>&lt;/ref&gt;</code>',
'cite_error_references_group_mismatch' => 'Ознаката <code>&lt;ref&gt;</code> во <code>&lt;references&gt;</code> има ÑпротиÑтавен групен атрибут „$1“.',
'cite_error_references_missing_group' => 'Ознаката <code>&lt;ref&gt;</code> определена во <code>&lt;references&gt;</code> има групен атрибут „$1“ кој не Ñе јавува во претходен текÑÑ‚.',
'cite_error_references_missing_key' => 'Ознаката <code>&lt;ref&gt;</code> Ñо име „$1“ определена во <code>&lt;references&gt;</code> не Ñе кориÑти во претходен текÑÑ‚.',
'cite_error_references_no_key' => 'Ознаката <code>&lt;ref&gt;</code> определена во <code>&lt;referencesgt;</code> нема именÑки атрибут.',
'cite_error_empty_references_define' => 'Ознаката <code>&lt;ref&gt;</code> определена во <code>&lt;references&gt;</code> Ñо име „$1“ нема Ñодржина.',
+ 'cite_references_link_accessibility_label' => 'Следно',
+ 'cite_references_link_many_accessibility_label' => 'Отиди кај:',
);
/** Malayalam (മലയാളം)
@@ -2525,11 +2345,6 @@ $messages['mk'] = array(
*/
$messages['ml'] = array(
'cite-desc' => 'അവലംബം ചേർകàµà´•àµà´µà´¾àµ» ഉപയോഗികàµà´•à´¾à´¨àµà´³àµà´³ <nowiki><ref[ name=id]></nowiki>, <nowiki><references/></nowiki> à´Žà´¨àµà´¨àµ€ ടാഗàµà´•àµ¾ ചേർകàµà´•àµà´¨àµà´¨àµ',
- 'cite_croak' => 'സൈറàµà´±àµ ലഭàµà´¯à´®à´²àµà´²; $1: $2',
- 'cite_error_key_str_invalid' => 'ആനàµà´¤à´°à´¿à´• പിഴവàµ;
-അസാധàµà´µà´¾à´¯ $str à´…à´²àµà´²àµ†à´™àµà´•à´¿àµ½ $key.
-ഇതൠഒരികàµà´•à´²àµà´‚ സംഭവികàµà´•à´¾àµ» പാടിലàµà´²à´¾à´¯à´¿à´°àµà´¨àµà´¨àµ.',
- 'cite_error_stack_invalid_input' => 'ആനàµà´¤à´°à´¿à´• പിഴവàµ; അസാധàµà´µà´¾à´¯ à´¸àµà´±àµà´±à´¾à´•àµ കീ. ഇതൠഒരികàµà´•à´²àµà´‚ സംഭവികàµà´•à´¾àµ» പാടിലàµà´²à´¾à´¯à´¿à´°àµà´¨àµà´¨àµ.',
'cite_error' => 'ഉദàµà´§à´°à´¿à´šàµà´šà´¤à´¿àµ½ പിഴവàµ: $1',
'cite_error_ref_numeric_key' => 'അസാധàµà´µà´¾à´¯ <code>&lt;ref&gt;</code> ടാഗàµ;
നാമതàµà´¤à´¿àµ½ സംഖàµà´¯ മാതàµà´°à´®à´¾à´¯à´¿ à´…à´¨àµà´µà´¦à´¨àµ€à´¯à´®à´²àµà´². à´Žà´¨àµà´¤àµ†à´™àµà´•à´¿à´²àµà´‚ ലഘàµà´µà´¿à´µà´°à´£à´‚ ഉപയോഗികàµà´•àµà´•.',
@@ -2551,7 +2366,7 @@ $messages['ml'] = array(
<code>$1</code> à´Žà´¨àµà´¨ അവലംബങàµà´™àµ¾à´•àµà´•àµ ടെകàµà´¸àµà´±àµà´±àµ à´’à´¨àµà´¨àµà´‚ കൊടàµà´¤àµà´¤à´¿à´Ÿàµà´Ÿà´¿à´²àµà´².',
'cite_error_included_ref' => '<code>&lt;ref&gt;</code> à´±àµà´±à´¾à´—ിനൠ<code>&lt;/ref&gt;</code> à´Žà´¨àµà´¨ à´…à´¨àµà´¤àµà´¯à´±àµà´±à´¾à´—ൠനൽകിയിടàµà´Ÿà´¿à´²àµà´²',
'cite_error_refs_without_references' => '<code>&lt;ref&gt;</code> à´±àµà´±à´¾à´—àµà´•àµ¾ നൽകിയിടàµà´Ÿàµà´£àµà´Ÿàµ, പകàµà´·àµ‡ <code>&lt;references/&gt;</code> à´±àµà´±à´¾à´—ൠകണàµà´Ÿàµ†à´¤àµà´¤à´¾à´¨à´¾à´¯à´¿à´²àµà´².',
- 'cite_error_group_refs_without_references' => '<code>&lt;ref&gt;</code> à´±àµà´±à´¾à´—àµà´•àµ¾ "$1" സംഘതàµà´¤à´¿àµ½ ഉണàµà´Ÿàµ, പകàµà´·àµ‡ ബനàµà´§à´ªàµà´ªàµ†à´Ÿàµà´Ÿ <code>&lt;references group="$1"/&gt;</code> à´±àµà´±à´¾à´—ൠകണàµà´Ÿàµ†à´¤àµà´¤à´¾à´¨à´¾à´¯à´¿à´²àµà´²',
+ 'cite_error_group_refs_without_references' => '<code>&lt;ref&gt;</code> à´±àµà´±à´¾à´—àµà´•àµ¾ "$1" സംഘതàµà´¤à´¿àµ½ ഉണàµà´Ÿàµ, പകàµà´·àµ‡ ബനàµà´§à´ªàµà´ªàµ†à´Ÿàµà´Ÿ <code>&lt;references group="$1"/&gt;</code> à´±àµà´±à´¾à´—ൠകണàµà´Ÿàµ†à´¤àµà´¤à´¾à´¨à´¾à´¯à´¿à´²àµà´² à´…à´²àµà´²àµ†à´™àµà´•à´¿àµ½ à´…à´Ÿà´¯àµà´•àµà´•à´¾à´¨àµà´³àµà´³ <code>&lt;/ref&gt;</code> നൽകിയിടàµà´Ÿà´¿à´²àµà´²',
'cite_error_references_group_mismatch' => '<code>&lt;ref&gt;</code> à´±àµà´±à´¾à´—ിലേയàµà´‚ <code>&lt;references&gt;</code> à´Žà´¨àµà´¨à´¤à´¿à´²àµ‡à´¯àµà´‚ സംഘ ഘടകമായ "$1" à´’à´¤àµà´¤àµà´ªàµ‹à´•àµà´¨àµà´¨à´¿à´²àµà´².',
'cite_error_references_missing_group' => '<code>&lt;ref&gt;</code> à´±àµà´±à´¾à´—ൠനിർവചിചàµà´šà´¿à´Ÿàµà´Ÿàµà´£àµà´Ÿàµ†à´™àµà´•à´¿à´²àµà´‚ <code>&lt;references&gt;</code> à´Žà´¨àµà´¨à´¤à´¿à´²àµà´³àµà´³ സംഘ ഘടകം "$1" ആദàµà´¯ à´Žà´´àµà´¤àµà´¤à´¿àµ½ കാണàµà´¨àµà´¨à´¿à´²àµà´².',
'cite_error_references_missing_key' => '<code>&lt;ref&gt;</code> à´±àµà´±à´¾à´—ൠ"$1" à´Žà´¨àµà´¨ പേരോടെ <code>&lt;references&gt;</code> à´Žà´¨àµà´¨à´¤à´¿àµ½ നിർവചിചàµà´šà´¿à´Ÿàµà´Ÿàµà´£àµà´Ÿàµ†à´™àµà´•à´¿à´²àµà´‚ ആദàµà´¯ à´Žà´´àµà´¤àµà´¤à´¿àµ½ ഉപയോഗികàµà´•àµà´¨àµà´¨à´¿à´²àµà´².',
@@ -2559,6 +2374,8 @@ $messages['ml'] = array(
'cite_error_empty_references_define' => ' <code>&lt;references&gt;</code> ആവശàµà´¯à´¤àµà´¤à´¿à´¨à´¾à´¯à´¿ "$1" à´Žà´¨àµà´¨ പേരിൽ നിർ‌വചികàµà´•à´ªàµà´ªàµ†à´Ÿàµà´Ÿ <code>&lt;ref&gt;</code> à´±àµà´±à´¾à´—ിനൠഉളàµà´³à´Ÿà´•àµà´•à´®àµŠà´¨àµà´¨àµà´®à´¿à´²àµà´².',
'cite_reference_link_prefix' => 'ഉദàµà´§à´°à´¿à´£à´¿_അവലംബം-',
'cite_references_link_prefix' => 'ഉദàµà´§à´°à´¿à´£à´¿_à´•àµà´±à´¿à´ªàµà´ªàµ-',
+ 'cite_references_link_accessibility_label' => 'à´®àµà´•à´³à´¿à´²àµ‡à´¯àµà´•àµà´•àµ',
+ 'cite_references_link_many_accessibility_label' => 'à´®àµà´•à´³à´¿àµ½ ഇവിടേയàµà´•àµà´•àµ:',
);
/** Mongolian (монгол)
@@ -2573,12 +2390,10 @@ $messages['mn'] = array(
* @author Kaustubh
* @author Mahitgar
* @author Rahuldeshmukh101
+ * @author V.narsikar
*/
$messages['mr'] = array(
- 'cite-desc' => '<nowiki><ref[ name=id]></nowiki> व <nowiki><references/></nowiki> हे दोन संदरà¥à¤­ देणà¥à¤¯à¤¾à¤¸à¤¾à¤ à¥€ वापरणà¥à¤¯à¤¾à¤¤ येणारे शबà¥à¤¦ वाढविले जातील.',
- 'cite_croak' => 'संदरà¥à¤­ देता आला नाही; $1: $2',
- 'cite_error_key_str_invalid' => 'अंतरà¥à¤—त तà¥à¤°à¥à¤Ÿà¥€; चà¥à¤•à¥€à¤šà¥‡ $str आणि/किंवा $key. असे कधीही घडायला नको.',
- 'cite_error_stack_invalid_input' => 'अंतरà¥à¤—त तà¥à¤°à¥à¤Ÿà¥€; चà¥à¤•à¥€à¤šà¥€ सà¥à¤Ÿà¥…क चावी. असे कधीही घडले नाही पाहिजे.',
+ 'cite-desc' => '<nowiki><ref[ name=id]></nowiki> व <nowiki><references/></nowiki> हे दोन संदरà¥à¤­ देणà¥à¤¯à¤¾à¤¸à¤¾à¤ à¥€ वापरणà¥à¤¯à¤¾à¤¤ येणारे शबà¥à¤¦ जोडलà¥à¤¯à¤¾ जातील.',
'cite_error' => 'तà¥à¤°à¥‚टी उधृत करा: $1',
'cite_error_ref_numeric_key' => '<code>&lt;ref&gt;</code> चà¥à¤•à¥€à¤šà¤¾ कोड; नाव हे पूरà¥à¤£à¤¾à¤‚की संखà¥à¤¯à¤¾ असू शकत नाही, कृपया माहितीपूरà¥à¤£ शीरà¥à¤·à¤• दà¥à¤¯à¤¾',
'cite_error_ref_no_key' => '<code>&lt;ref&gt;</code> चà¥à¤•à¥€à¤šà¤¾ कोड; रिकामà¥à¤¯à¤¾ संदरà¥à¤­à¤¾à¤‚ना नाव असणे गरजेचे आहे',
@@ -2591,14 +2406,17 @@ $messages['mr'] = array(
'cite_error_no_link_label_group' => '"$1" करिता नमूदकेलेलà¥à¤¯à¤¾ कसà¥à¤Ÿà¤® लिंक खूणा संपलà¥à¤¯à¤¾ .
<nowiki>[[MediaWiki:$2]]</nowiki> संदेशात अधिक खूणा नमूद करा',
'cite_error_references_no_text' => '<code>&lt;ref&gt;</code> चà¥à¤•à¥€à¤šà¤¾ कोड; <code>$1</code> नावाने दिलेलà¥à¤¯à¤¾ संदरà¥à¤­à¤¾à¤‚मधà¥à¤¯à¥‡ काहीही माहिती नाही',
- 'cite_error_included_ref' => '<code>&lt;ref&gt;</code> ला बंद करणारी <code>&lt;/ref&gt;</code> ही खूण गायब आहे.',
- 'cite_error_refs_without_references' => 'पानामधे <code>&lt;ref&gt;</code> (संदरà¥à¤­) आहे, परंतॠ<code>&lt;references/&gt;</code> (<nowiki>{{संदरà¥à¤­à¤¯à¤¾à¤¦à¥€}}<nowiki />) सापडले नाही. <nowiki>{{संदरà¥à¤­à¤¯à¤¾à¤¦à¥€}}<nowiki /> असलà¥à¤¯à¤¾à¤¶à¤¿à¤µà¤¾à¤¯ पानाचà¥à¤¯à¤¾ तळाशी संदरà¥à¤­à¤¾à¤‚चे तपशील दिसणार नाहीत.',
- 'cite_error_group_refs_without_references' => '"$1" नावाचà¥à¤¯à¤¾ गटाकरिता <code>&lt;ref&gt;</code> चिनà¥à¤¹à¥‡ उपलबà¥à¤§ आहेत, पण संबंधीत <code>&lt;references group="$1"/&gt;</code> खूण मिळाली नाही.',
- 'cite_error_references_group_mismatch' => 'tag in <code>&lt;references&gt;</code>मधील <code>&lt;ref&gt;</code> खूणांना खटका उडणारे group attribute "$1" आहे.',
- 'cite_error_references_missing_group' => 'गट "$1" मधील <code>&lt;ref&gt;</code> टà¥à¤¯à¤¾à¤— <code>&lt;references&gt;</code> हà¥à¤¯à¤¾ पूरà¥à¤µà¥€ वापलà¥à¤¯à¤¾ गेलेले नाही',
- 'cite_error_references_missing_key' => '<code>&lt;references&gt;</code> हà¥à¤¯à¤¾ मधà¥à¤¯à¥‡ सांगितलेला <code>&lt;ref&gt;</code> "$1" हà¥à¤¯à¤¾ नावाचा टà¥à¤¯à¤¾à¤— हà¥à¤¯à¤¾ पूरà¥à¤µà¥€ वापरणà¥à¤¯à¤¾à¤¤ आलेला नाही.',
- 'cite_error_references_no_key' => '<code>&lt;ref&gt;</code> टà¥à¤¯à¤¾à¤— मधà¥à¤¯à¥‡ विशारद गोषà¥à¤Ÿà¥€à¤‚ना <code>&lt;references&gt;</code> ला नाम गà¥à¤£à¤§à¤°à¥à¤® नाहीत',
- 'cite_error_empty_references_define' => '<code>&lt;ref&gt;</code> टà¥à¤¯à¤¾à¤— मधà¥à¤¯à¥‡ विशारद गोषà¥à¤Ÿà¥€à¤‚ <code>&lt;references&gt;</code> जà¥à¤¯à¤¾ "$1" हà¥à¤¯à¤¾ नावाने संबोधलà¥à¤¯à¤¾ आहेत तà¥à¤¯à¤¾à¤¤ माहिती नाही',
+ 'cite_error_included_ref' => '<code>&lt;ref&gt;</code> ला बंद करणारी <code>&lt;/ref&gt;</code> ही खूणपताका गायब आहे.',
+ 'cite_error_refs_without_references' => "या पानामधे \"<code>&lt;ref&gt;</code>\" ही खूणपताका(संदरà¥à¤­à¤Ÿà¥…ग) आहे, परंतॠ<code>&lt;references/&gt;</code> अथवा <code> <nowiki>{{</nowiki>
+</code>संदरà¥à¤­à¤¯à¤¾à¤¦à¥€<code><nowiki>}}</nowiki></code>या पैकी à¤à¤•à¤¹à¥€ लावणà¥à¤¯à¤¾à¤¤ आलेले नाही.''' या पानात \"<code><nowiki>{{</nowiki></code>संदरà¥à¤­à¤¯à¤¾à¤¦à¥€<code><nowiki>}}</nowiki></code>\" हा साचा कॉपीपेसà¥à¤Ÿ करावा''' ''कारण,तà¥à¤¯à¤¾à¤¶à¤¿à¤µà¤¾à¤¯ पानाचà¥à¤¯à¤¾ तळाशी संदरà¥à¤­à¤¾à¤‚चे तपशील दिसणार नाहीत.''",
+ 'cite_error_group_refs_without_references' => '"$1" नावाचà¥à¤¯à¤¾ गटाकरिता <code>&lt;ref&gt;</code>खूणपताका उपलबà¥à¤§ आहेत, पण संबंधीत <code>&lt;references group="$1"/&gt;</code> खूण मिळाली नाही.',
+ 'cite_error_references_group_mismatch' => '<code>&lt;references&gt;</code>मधील खूणपताकेस<code>&lt;ref&gt;</code> खूणांशी विसंवाद असणारे group attribute "$1" आहे.',
+ 'cite_error_references_missing_group' => 'गट "$1" मधील <code>&lt;ref&gt;</code> खूणपताका <code>&lt;references&gt;</code> हà¥à¤¯à¤¾ पूरà¥à¤µà¥€ वापलà¥à¤¯à¤¾ गेलेलà¥à¤¯à¤¾ नाहीत.',
+ 'cite_error_references_missing_key' => '<code>&lt;references&gt;</code> हà¥à¤¯à¤¾ मधà¥à¤¯à¥‡ टाकलेला <code>&lt;ref&gt;</code> "$1" हà¥à¤¯à¤¾ नावाची खूणपताका हà¥à¤¯à¤¾ पूरà¥à¤µà¥€ वापरणà¥à¤¯à¤¾à¤¤ आलेली नाही.',
+ 'cite_error_references_no_key' => '<code>&lt;ref&gt;</code>खूणपताकेत नमूद गोषà¥à¤Ÿà¥€à¤‚ना <code>&lt;references&gt;</code> ला नाम-गà¥à¤£à¤§à¤°à¥à¤® नाहीत.',
+ 'cite_error_empty_references_define' => '<code>&lt;ref&gt;</code>खूणपताकेत नमूद गोषà¥à¤Ÿà¥€à¤‚ना, <code>&lt;references&gt;</code> जà¥à¤¯à¤¾ "$1" हà¥à¤¯à¤¾ नावाने संबोधलà¥à¤¯à¤¾ आहेत, तà¥à¤¯à¤¾à¤¤ माहिती नाही.',
+ 'cite_references_link_accessibility_label' => 'वर उडी मारा',
+ 'cite_references_link_many_accessibility_label' => 'ला वर उडी मारा:',
);
/** Malay (Bahasa Melayu)
@@ -2608,9 +2426,6 @@ $messages['mr'] = array(
*/
$messages['ms'] = array(
'cite-desc' => 'Menambah tag <nowiki><ref[ name=id]></nowiki> dan <nowiki><references/></nowiki> untuk pemetikan',
- 'cite_croak' => 'Ralat maut petik; $1: $2',
- 'cite_error_key_str_invalid' => 'Ralat dalaman; str dan/atau $key tidak sah.',
- 'cite_error_stack_invalid_input' => 'Ralat dalaman; kunci tindanan tidak sah.',
'cite_error' => 'Ralat petik: $1',
'cite_error_ref_numeric_key' => 'Tag <code>&lt;ref&gt;</code> tidak sah; nombor ringkas tidak dibenarkan, sila masukkan tajuk yang lebih terperinci',
'cite_error_ref_no_key' => 'Tag <code>&lt;ref&gt;</code> tidak sah; rujukan tanpa kandungan mestilah mempunyai nama',
@@ -2625,7 +2440,7 @@ Tentukan lagi dalam mesej <nowiki>[[MediaWiki:$2]]</nowiki>.',
'cite_error_references_no_text' => 'Tag <code>&lt;ref&gt;</code> tidak sah; teks bagi rujukan <code>$1</code> tidak disediakan',
'cite_error_included_ref' => 'Tag <code>&lt;ref&gt;</code> tidak ditutup dengan <code>&lt;/ref&gt;</code>',
'cite_error_refs_without_references' => 'Tag <code>&lt;ref&gt;</code> ada tetapi tag <code>&lt;references/&gt;</code> tidak disertakan',
- 'cite_error_group_refs_without_references' => 'Tag <code>&lt;ref&gt;</code> untuk kumpulan "$1" ada tetapi tag <code>&lt;references group="$1"/&gt;</code> yang sepadan tidak disertakan',
+ 'cite_error_group_refs_without_references' => 'Tag <code>&lt;ref&gt;</code> untuk kumpulan "$1" ada tetapi tag <code>&lt;references group="$1"/&gt;</code> yang sepadan tidak disertakan', # Fuzzy
'cite_error_references_group_mismatch' => 'Tag <code>&lt;ref&gt;</code> dalam <code>&lt;references&gt;</code> mempunyai atribut kumpulan yang bercanggah, "$1".',
'cite_error_references_missing_group' => 'Tag <code>&lt;ref&gt;</code> yang ditentukan dalam <code>&lt;references&gt;</code> mempunyai atribut kumpulan "$1" yang tiada dalam teks sebelumnya.',
'cite_error_references_missing_key' => 'Tag <code>&lt;ref&gt;</code> dengan nama "$1" yang ditentukan dalam <code>&lt;references&gt;</code> tidak digunakan dalam teks sebelumnya.',
@@ -2638,13 +2453,6 @@ Tentukan lagi dalam mesej <nowiki>[[MediaWiki:$2]]</nowiki>.',
*/
$messages['mt'] = array(
'cite-desc' => 'Iżżid it-tikketti <nowiki><ref[ name=id]></nowiki> u <nowiki><references/></nowiki> għaċ-ċitazzjonijiet',
- 'cite_croak' => 'Żball fiċ-ċitazzjoni; $1: $2',
- 'cite_error_key_str_invalid' => 'Żball intern;
-$str u/jew $key invalidi.
-Dan qatt m\'għandu jseħħ.',
- 'cite_error_stack_invalid_input' => "Żball intern;
-''stack key'' invalida.
-Dan qatt m'għandu jseħħ.",
'cite_error' => 'Żball fiċ-ċitazzjoni: $1',
'cite_error_ref_numeric_key' => 'Tikketta <code>&lt;ref&gt;</code> invalida;
l-isem ma jistax ikun numru sħiħ sempliċi. Uża titlu deskrittiv',
@@ -2661,7 +2469,7 @@ Uża <code>&lt;references /&gt;</code> jew <code>&lt;references group="..." /&gt
l-ebda test ma ngħata għar-refs bl-isem <code>$1</code>',
'cite_error_included_ref' => '<code>&lt;/ref&gt;</code> tal-għeluq hija nieqsa għat-tikketta <code>&lt;ref&gt;</code>',
'cite_error_refs_without_references' => 'It-tikketti <code>&lt;ref&gt;</code> jeżistu, imma l-ebda tikketta <code>&lt;references/&gt;</code> ma nstabet',
- 'cite_error_group_refs_without_references' => 'It-tikketti <code>&lt;ref&gt;</code> jeżistu għal grupp bl-isem "$1" imma l-ebda tikketta <code>&lt;references group="$1"/&gt;</code> rispettiva ma nstabet',
+ 'cite_error_group_refs_without_references' => 'It-tikketti <code>&lt;ref&gt;</code> jeżistu għal grupp bl-isem "$1" imma l-ebda tikketta <code>&lt;references group="$1"/&gt;</code> rispettiva ma nstabet', # Fuzzy
'cite_error_references_group_mismatch' => 'It-tikketta <code>&lt;ref&gt;</code> f\'<code>&lt;references&gt;</code> għandha l-attribut tal-grupp "$1" f\'kunflitt.',
'cite_error_references_missing_group' => 'It-tikketta <code>&lt;ref&gt;</code> definita f\'<code>&lt;references&gt;</code> għandha l-attribut tal-grupp "$1" li ma jidhirx fit-test preċedenti.',
'cite_error_references_missing_key' => 'It-tikketta <code>&lt;ref&gt;</code> bl-isem "$1" definita f\'<code>&lt;references&gt;</code> mhix użata fit-test preċedenti.',
@@ -2669,15 +2477,13 @@ l-ebda test ma ngħata għar-refs bl-isem <code>$1</code>',
'cite_error_empty_references_define' => 'It-tikketta <code>&lt;ref&gt;</code> definita f\'<code>&lt;references&gt;</code> bl-isem "$1" m\'għandha l-ebda kontenut.',
);
-/** Norwegian Bokmål (norsk (bokmål)‎)
+/** Norwegian Bokmål (norsk bokmål)
* @author Audun
+ * @author Danmichaelo
* @author Laaknor
*/
$messages['nb'] = array(
'cite-desc' => 'Legger til <nowiki><ref[ name=id]></nowiki> og <nowiki><references/></nowiki>-tagger for referanser',
- 'cite_croak' => 'Sitering døde; $1: $2',
- 'cite_error_key_str_invalid' => 'Intern feil: Ugyldig $str og/eller $key. Dette burde aldri forekomme.',
- 'cite_error_stack_invalid_input' => 'Intern feil; ugyldig stakknøkkel. Dette burde aldri forekomme.',
'cite_error' => 'Siteringsfeil: $1',
'cite_error_ref_numeric_key' => 'Ugyldig <code>&lt;ref&gt;</code>-kode; navnet kan ikke være et enkelt heltall, bruk en beskrivende tittel',
'cite_error_ref_no_key' => 'Ugyldig <code>&lt;ref&gt;</code>-kode; referanser uten innhold må inneholde navn',
@@ -2692,7 +2498,7 @@ Definér fler i <nowiki>[[MediaWiki:$2]]</nowiki>-beskjeden.',
'cite_error_references_no_text' => 'Ugyldig <code>&lt;ref&gt;</code>-tagg; ingen tekst ble oppgitt for referansen ved navn <code>$1</code>',
'cite_error_included_ref' => 'Avsluttende <code>&lt;/ref&gt;</code>-tagg mangler for <code>&lt;ref&gt;</code>',
'cite_error_refs_without_references' => '<code>&lt;ref&gt;</code>-merker finnes, men ingen <code>&lt;references/&gt;</code>-merke funnet',
- 'cite_error_group_refs_without_references' => '<code>&lt;ref&gt;</code>-merke finnes for gruppenavnet «$1», men ingen <code>&lt;references group="$1"/&gt;</code>-merking ble funnet',
+ 'cite_error_group_refs_without_references' => '<code>&lt;ref&gt;</code>-merker finnes for gruppenavnet «$1», men ingen <code>&lt;references group="$1"/&gt;</code>-merking ble funnet, eller det mangler et avsluttende <code>&lt;/ref&gt;</code>-merke.',
'cite_error_references_group_mismatch' => '<code>&lt;ref&gt;</code>-tagg i <code>&lt;references&gt;</code> har motstridig attributt «$1».',
'cite_error_references_missing_group' => '<code>&lt;ref&gt;</code>-tagg definert i <code>&lt;references&gt;</code> har gruppeattributtet «$1» som ikke forekommer i teksten.',
'cite_error_references_missing_key' => '<code>&lt;ref&gt;</code>-taggen med navnet «$1» definert i <code>&lt;references&gt;</code> brukes ikke i teksten.',
@@ -2706,9 +2512,6 @@ Definér fler i <nowiki>[[MediaWiki:$2]]</nowiki>-beskjeden.',
*/
$messages['nds'] = array(
'cite-desc' => 'Föögt <nowiki><ref[ name=id]></nowiki> un <nowiki><references/></nowiki> Tags för Zitaten to',
- 'cite_croak' => 'Fehler bi de Referenzen. $1: $2',
- 'cite_error_key_str_invalid' => 'Internen Fehler: ungülligen $str un/oder $key. Dat schull egentlich nie vörkamen.',
- 'cite_error_stack_invalid_input' => 'Internen Fehler: ungülligen Stack-Slötel. Dat schull egentlich nie vörkamen.',
'cite_error' => 'Zitat-Fehler: $1',
'cite_error_ref_numeric_key' => 'Ungülligen Tag <tt>&lt;ref&gt;</tt>: de Naam dröff keen reine Tall wesen, bruuk en Naam, de de Saak beschrifft.',
'cite_error_ref_no_key' => 'Ungülligen Tag <tt>&lt;ref&gt;</tt>: „ref“ ahn Inholt mutt en Naam hebben.',
@@ -2720,31 +2523,24 @@ $messages['nds'] = array(
'cite_error_references_no_text' => 'Ungülligen Tag <tt>&lt;ref&gt;</tt>; is keen Text för Refs mit den Naam <tt>$1</tt> angeven.',
'cite_error_included_ref' => 'Dor fehlt en tosluten <code>&lt;/ref&gt;</code>',
'cite_error_refs_without_references' => '<code>&lt;ref&gt;</code>-Tags gifft dat, is aver keen <code>&lt;references/&gt;</code>-Tag funnen worrn.',
- 'cite_error_group_refs_without_references' => '<code>&lt;ref&gt;</code>-Tags för de Grupp „$1“ gifft dat, is aver keen <code>&lt;references group=„$1“/&gt;</code>-Tag funnen worrn',
+ 'cite_error_group_refs_without_references' => '<code>&lt;ref&gt;</code>-Tags för de Grupp „$1“ gifft dat, is aver keen <code>&lt;references group=„$1“/&gt;</code>-Tag funnen worrn', # Fuzzy
);
-/** Nedersaksies (Nedersaksies)
+/** Low Saxon (Netherlands) (Nedersaksies)
* @author Servien
*/
$messages['nds-nl'] = array(
- 'cite_croak' => 'Fout in t referentiesysteem; $1: $2',
'cite_error' => 'Siteerfout: $1',
);
/** Dutch (Nederlands)
+ * @author Flightmare
* @author Niels
* @author Romaine
* @author Siebrand
*/
$messages['nl'] = array(
'cite-desc' => 'Voegt <nowiki><ref[ name=id]></nowiki> en <nowiki><references/></nowiki> tags toe voor citaten',
- 'cite_croak' => 'Probleem met Cite; $1: $2',
- 'cite_error_key_str_invalid' => 'Interne fout;
-onjuiste $str and/of $key.
-Dit zou niet voor moeten komen.',
- 'cite_error_stack_invalid_input' => 'Interne fout;
-onjuiste stacksleutel.
-Dit zou niet voor moeten komen.',
'cite_error' => 'Citefout: $1',
'cite_error_ref_numeric_key' => 'Onjuiste tag <code>&lt;ref&gt;</code>;
de naam kan geen eenvoudige integer zijn.
@@ -2769,24 +2565,23 @@ U kunt er meer instellen in het systeembericht <nowiki>[[MediaWiki:$2]]</nowiki>
er is geen tekst opgegeven voor refs met de naam <code>$1</code>',
'cite_error_included_ref' => 'Na het label <code>&lt;ref&gt;</code> ontbreekt het afsluitende label <code>&lt;/ref&gt;</code>',
'cite_error_refs_without_references' => 'De tag <code>&lt;ref&gt;</code> bestaat, maar de tag <code>&lt;references/&gt;</code> is niet aangetroffen',
- 'cite_error_group_refs_without_references' => 'Er bestaat een tag <code>&lt;ref&gt;</code> voor de groep "$1", maar er is geen bijbehorende tag <code>&lt;references group="$1"/&gt;</code> aangetroffen',
+ 'cite_error_group_refs_without_references' => 'Er bestaat een tag <code>&lt;ref&gt;</code> voor de groep "$1", maar er is geen bijbehorende tag <code>&lt;references group="$1"/&gt;</code> aangetroffen of een afsluitende <code>&lt;/ref&gt;</code> is niet aanwezig.',
'cite_error_references_group_mismatch' => 'De tag <code>&lt;ref&gt;</code> in <code>&lt;references&gt;</code> conflicteert met groepseigenschap "$1".',
'cite_error_references_missing_group' => 'De tag <code>&lt;ref&gt;</code> die is gedefinieerd in <code>&lt;references&gt;</code> heeft de groepseigenschap "$1" niet niet eerder in te tekst voorkomt.',
'cite_error_references_missing_key' => 'De tag <code>&lt;ref&gt;</code> met de naam "$1" gedefinieerd in <code>&lt;references&gt;</code> wordt niet eerder in de tekst gebruikt.',
'cite_error_references_no_key' => 'De tag <code>&lt;ref&gt;</code> die is gedefinieerd in <code>&lt;references&gt;</code> heeft geen eigenschapsnaam.',
'cite_error_empty_references_define' => 'De tag <code>&lt;ref&gt;</code> die is gedefinieerd in <code>&lt;references&gt;</code> met de naam "$1" heeft geen inhoud.',
+ 'cite_references_link_accessibility_label' => 'Omhoog',
+ 'cite_references_link_many_accessibility_label' => 'Omhoog naar:',
);
-/** Norwegian Nynorsk (norsk (nynorsk)‎)
+/** Norwegian Nynorsk (norsk nynorsk)
* @author Frokor
* @author Harald Khan
* @author Njardarlogar
*/
$messages['nn'] = array(
'cite-desc' => 'Legg til <nowiki><ref[ name=id]></nowiki> og <nowiki><references/></nowiki>-merke for referansar',
- 'cite_croak' => 'Feil i fotnotesystemet; $1: $2',
- 'cite_error_key_str_invalid' => 'Intern feil: Ugyldig $str og/eller $key. Dette burde aldri skjedd.',
- 'cite_error_stack_invalid_input' => 'Intern feil; ugyldig stakknøkkel. Dette burde aldri skjedd.',
'cite_error' => 'Referansefeil: $1',
'cite_error_ref_numeric_key' => 'Ugyldig <code>&lt;ref&gt;</code>-kode; namnet kan ikkje vere eit enkelt heiltal, bruk ein skildrande tittel',
'cite_error_ref_no_key' => 'Ugyldig <code>&lt;ref&gt;</code>-kode; referansar utan innhald må innehalde namn',
@@ -2799,7 +2594,7 @@ Definer fleire i meldinga <nowiki>[[MediaWiki:Cite references link many format b
'cite_error_references_no_text' => 'Ugyldig <code>&lt;ref&gt;</code>-merke; ingen tekst vart gjeven for referansen med namnet <code>$1</code>',
'cite_error_included_ref' => 'Avsluttande <code>&lt;/ref&gt;</code>-tagg manglar for <code>&lt;ref&gt;</code>',
'cite_error_refs_without_references' => '<code>&lt;ref&gt;</code>-merke finst, men eit <code>&lt;references/&gt;</code>-merke finst ikkje',
- 'cite_error_group_refs_without_references' => '<code>&lt;ref&gt;</code>-merke finst for gruppenamnet «$1», men inkje samsvarande <code>&lt;references group="$1"/&gt;</code>-merke vart funne',
+ 'cite_error_group_refs_without_references' => '<code>&lt;ref&gt;</code>-merke finst for gruppenamnet «$1», men inkje samsvarande <code>&lt;references group="$1"/&gt;</code>-merke vart funne', # Fuzzy
);
/** Occitan (occitan)
@@ -2807,11 +2602,6 @@ Definer fleire i meldinga <nowiki>[[MediaWiki:Cite references link many format b
*/
$messages['oc'] = array(
'cite-desc' => 'Apond las balisas <nowiki><ref[ name=id]></nowiki> e <nowiki><references/></nowiki>, per las citacions.',
- 'cite_croak' => 'Citacion corrompuda ; $1 : $2',
- 'cite_error_key_str_invalid' => 'Error intèrna ;
-$str o $key incorrèctes.
-Aquò se deuriá pas jamai produsir.',
- 'cite_error_stack_invalid_input' => 'Error intèrna ; clau de pila invalida',
'cite_error' => 'Error de citacion : $1',
'cite_error_ref_numeric_key' => 'Ampèl invalid ; clau non-integrala esperada',
'cite_error_ref_no_key' => 'Ampèl invalid ; cap de clau pas especificada',
@@ -2829,26 +2619,21 @@ Utilizatz <code>&lt;references /&gt;</code>, o alara <code>&lt;references group=
pas de tèxte per las referéncias nomenadas <code>$1</code>.',
'cite_error_included_ref' => 'Clausura <code>&lt;/ref&gt;</code> omesa per la balisa <code>&lt;ref&gt;</code>',
'cite_error_refs_without_references' => 'La balisa <code>&lt;ref&gt;</code> existís, mas cap de balisa <code>&lt;references/&gt;</code> pas trobada.',
- 'cite_error_group_refs_without_references' => 'La balisa <code>&lt;ref&gt;</code> existís per un grop nomenat « $1 », mas cap de balisa <code>&lt;references group="$1"/&gt;</code> correspondenta pas trobada',
+ 'cite_error_group_refs_without_references' => 'De balisas <code>&lt;ref&gt;</code> existisson per un grop nomenat « $1 », mas cap de balisa <code>&lt;references group="$1"/&gt;</code> correspondenta es pas estada trobada, o alara una valisa tampanta <code>&lt;/ref&gt;</code> manca.',
'cite_error_references_group_mismatch' => "La balisa <code>&lt;ref&gt;</code> dins <code>&lt;references&gt;</code> a l'atribut de grop « $1 » que dintra en conflicte amb lo de <code>&lt;references&gt;</code>.",
'cite_error_references_missing_group' => 'La balisa <code>&lt;ref&gt;</code> definida dins <code>&lt;references&gt;</code> a un gropat atribuit « $1 » que figura pas dins lo tèxte precedent.',
'cite_error_references_missing_key' => 'La balisa <code>&lt;ref&gt;</code> amb lo nom « $1 » definida dins <code>&lt;references&gt;</code> es pas utilizada dins lo tèxte precedent.',
'cite_error_references_no_key' => 'La balisa <code>&lt;ref&gt;</code> definida dins <code>&lt;references&gt;</code> a pas de nom d’atribut.',
'cite_error_empty_references_define' => 'La balisa <code>&lt;ref&gt;</code> definida dins <code>&lt;references&gt;</code> amb lo nom « $1 » a pas de contengut.',
+ 'cite_references_link_accessibility_label' => 'Anar',
+ 'cite_references_link_many_accessibility_label' => 'Anar a :',
);
-/** Oriya (ଓଡ଼ିଆ)
+/** Oriya (ଓଡ଼ିଆ)
* @author Psubhashish
*/
$messages['or'] = array(
'cite-desc' => '<nowiki><ref[ name=id]></nowiki> ଓ <nowiki><references/></nowiki> ଟାଗସବୠଆଧାର ନିମନà­à¬¤à­‡ à¬à¬ à¬¾à¬°à­‡ ଯୋଡ଼ିଥାଠ।',
- 'cite_croak' => 'ଆଧାରଟି à¬à¬¬à­‡ ଅଚଳ; $1: $2',
- 'cite_error_key_str_invalid' => 'ଭିତରର ଅସà­à¬¬à¬¿à¬§à¬¾;
-ଅବୈଧ $str ତଥା/କିମà­à¬¬à¬¾ $key ।
-à¬à¬¹à¬¾ ଆଉ କେବେ ଘଟିବ ଅନà­à¬šà¬¿à¬¤ ।',
- 'cite_error_stack_invalid_input' => 'ଭିତରର ଅସà­à¬¬à¬¿à¬§à¬¾;
-ଅବୈଧ କି (key) ଗଦା ।
-à¬à¬¹à¬¾ ଆଉ କେବେ ଘଟିବ ଅନà­à¬šà¬¿à¬¤ ।',
'cite_error' => 'ଆଧାର ଭà­à¬²: $1',
'cite_error_ref_numeric_key' => 'ଅବୈଧ <code>&lt;ref&gt;</code> tag;
ନାମାଟି କେବେ ହେଲେଠà¬à¬• ସଂଖà­à­Ÿà¬¾ ହୋଇପାରିବ ନାହିଠ। à¬à¬• ବରà­à¬£à­à¬£à¬¨à¬¾à¬®à­‚ଳକ ନାମ ଦିଅନà­à¬¤à­ ।',
@@ -2872,7 +2657,7 @@ $messages['or'] = array(
<code>$1</code> ନାମରେ ଥିବା ଆଧାର ଭିତରେ କିଛି ଲେଖା ନାହିଠ।',
'cite_error_included_ref' => '<code>&lt;/ref&gt;</code> କୠବନà­à¬¦ କରà­à¬…ଛà­; <code>&lt;ref&gt;</code> ନାହିà¬; ଚିହà­à¬¨',
'cite_error_refs_without_references' => '<code>&lt;ref&gt;</code> ଚିହà­à¬¨ ରହିଅଛି, କିନà­à¬¤à­ <code>&lt;references/&gt;</code> ଚିହà­à¬¨à¬Ÿà¬¿ ମିଳିଲା ନାହିà¬',
- 'cite_error_group_refs_without_references' => '"$1" ଗୋଠ ପାଇଠ<code>&lt;ref&gt;</code> ଚିହà­à¬¨ ସବୠରହିଅଛି, କିନà­à¬¤à­ କୌଣସି ବି <code>&lt;references group="$1"/&gt;</code> ଚିହà­à¬¨ ମିଳିଲା ନାହିà¬',
+ 'cite_error_group_refs_without_references' => '"$1" ଗୋଠ ପାଇଠ<code>&lt;ref&gt;</code> ଚିହà­à¬¨ ସବୠରହିଅଛି, କିନà­à¬¤à­ କୌଣସି ବି <code>&lt;references group="$1"/&gt;</code> ଚିହà­à¬¨ ମିଳିଲା ନାହିà¬', # Fuzzy
'cite_error_references_group_mismatch' => '<code>&lt;references&gt ରେ <code>&lt;ref&gt;</code> ଚିହà­à¬¨;</code> ର ଅସà­à¬¬à¬¿à¬§à¬¾à¬œà¬¨à¬• ଗୋଠ ବିଶେଷତା "$1" ।',
'cite_error_references_missing_group' => '<code>&lt;references&gt;</code>ରେ ଦିଆଯାଇଥିବା <code>&lt;ref&gt;</code> ଚିହà­à¬¨à¬°à­‡ "$1" ଗୋଠ ପାଇଠଚିହà­à¬¨ ଅଛି ଯାହାକି ଦରକାରୀ ଲେଖାରେ ଆସà­à¬¨à¬¾à¬¹à¬¿à¬ ।',
'cite_error_references_missing_key' => '<code>&lt;references&gt;</code>ରେ ଦିଆଯାଇଥିବା "$1" ନାମ ସହ ଥିବା <code>&lt;ref&gt;</code> ଚିହà­à¬¨ ଦରକାରୀ ଲେଖାରେ ବà­à­Ÿà¬¬à¬¹à¬¾à¬° ହୋଇନାହିଠ।',
@@ -2891,14 +2676,10 @@ $messages['pag'] = array(
* @author Holek
* @author Leinad
* @author Sp5uhe
+ * @author Woytecr
*/
$messages['pl'] = array(
'cite-desc' => 'Dodaje znaczniki <nowiki><ref[ name=id]></nowiki> i <nowiki><references/></nowiki> ułatwiające podawanie źródeł cytatów',
- 'cite_croak' => 'Cytowanie nieudane; $1: $2',
- 'cite_error_key_str_invalid' => 'Błąd wewnętrzny;
-nieprawidłowy $str i/lub $key.
-To nigdy nie powinno się zdarzyć.',
- 'cite_error_stack_invalid_input' => 'Błąd wewnętrzny – nieprawidłowy klucz sterty. To nigdy nie powinno się zdarzyć.',
'cite_error' => "BÅ‚Ä…d rozszerzenia ''cite'': $1",
'cite_error_ref_numeric_key' => 'Nieprawidłowy znacznik <code>&lt;ref&gt;</code>. Nazwa nie może być liczbą, użyj nazwy opisowej.',
'cite_error_ref_no_key' => 'Nieprawidłowy znacznik <code>&lt;ref&gt;</code>. Odnośnik ref z zawartością musi mieć nazwę.',
@@ -2915,12 +2696,14 @@ Zdefiniuj ich większą liczbę w komunikacie <nowiki>[[MediaWiki:$2]]</nowiki>.
'cite_error_references_no_text' => 'Błąd w składni elementu <code>&lt;ref&gt;</code>. Brak tekstu w przypisie o nazwie <code>$1</code>',
'cite_error_included_ref' => 'Brak znacznika zamykajÄ…cego <code>&lt;/ref&gt;</code> po otwartym znaczniku <code>&lt;ref&gt;</code>',
'cite_error_refs_without_references' => 'Istnieje znacznik <code>&lt;ref&gt;</code>, ale nie odnaleziono znacznika <code>&lt;references/&gt;</code>',
- 'cite_error_group_refs_without_references' => 'Istnieje znacznik <code>&lt;ref&gt;</code> dla grupy o nazwie „$1â€, ale nie odnaleziono odpowiedniego znacznika <code>&lt;references group="$1"/&gt;</code>',
+ 'cite_error_group_refs_without_references' => 'Istnieje znacznik <code>&lt;ref&gt;</code> dla grupy o nazwie „$1â€, ale nie odnaleziono odpowiedniego znacznika <code>&lt;references group="$1"/&gt;</code>, lub brakuje znacznika zamykajÄ…cego <code>&lt;/ref&gt;</code>',
'cite_error_references_group_mismatch' => 'Znacznik <code>&lt;ref&gt;</code> w <code>&lt;references&gt;</code> nie może mieć atrybutu grupy „$1â€.',
'cite_error_references_missing_group' => 'Znacznik <code>&lt;ref&gt;</code> zdefiniowany w <code>&lt;references&gt;</code> ma atrybut grupowania „$1â€, który nie wystÄ™puje wczeÅ›niej w treÅ›ci.',
'cite_error_references_missing_key' => 'Znacznik <code>&lt;ref&gt;</code> o nazwie „$1â€, zdefiniowany w <code>&lt;references&gt;</code>, nie byÅ‚ użyty wczeÅ›niej w treÅ›ci.',
'cite_error_references_no_key' => 'Znacznik <code>&lt;ref&gt;</code> zdefiniowany w <code>&lt;references&gt;</code> nie ma atrybutu <code>name</code>.',
'cite_error_empty_references_define' => 'Znacznik <code>&lt;ref&gt;</code> zdefiniowany w <code>&lt;references&gt;</code> o nazwie „$1†nie ma treści.',
+ 'cite_references_link_accessibility_label' => 'Skocz do góry',
+ 'cite_references_link_many_accessibility_label' => 'Skocz do:',
);
/** Piedmontese (Piemontèis)
@@ -2929,13 +2712,6 @@ Zdefiniuj ich większą liczbę w komunikacie <nowiki>[[MediaWiki:$2]]</nowiki>.
*/
$messages['pms'] = array(
'cite-desc' => 'A gionta le tichëtte <nowiki><ref[ name=id]></nowiki> e <nowiki><references/></nowiki>, për sitassion',
- 'cite_croak' => 'Sitassion mòrta; $1: $2',
- 'cite_error_key_str_invalid' => 'Eror antern;
-$str e/o $key sbalià.
-Sòn a dovrìa mai capité.',
- 'cite_error_stack_invalid_input' => "Eror antern;
-ciav d'ambaronament pa bon-a.
-Sòn a dovrìa mai capité.",
'cite_error' => 'Eror ëd sitassion: $1',
'cite_error_ref_numeric_key' => "Tichëtta <code>&lt;ref&gt;</code> pa bon-a;
ël nòm a peul pa esse n'antregh sempi. Deuvra un tìtol descritiv.",
@@ -2959,12 +2735,14 @@ Definissne ëd pi ant ël mëssagi <nowiki>[[MediaWiki:$2]]</nowiki>.',
pa gnun test a l'é stàit dàit për l'arferiment ciamà <code>$1</code>",
'cite_error_included_ref' => 'Saradura <code>&lt;/ref&gt;</code> mancanta për la tichëtta <code>&lt;ref&gt;</code>',
'cite_error_refs_without_references' => "la tichëtta <code>&lt;ref&gt;</code> a esist, ma gnun-a tichëtta <code>&lt;references/&gt;</code> a l'é stàita trovà",
- 'cite_error_group_refs_without_references' => 'Dle tichëtte <code>&lt;ref&gt;</code> a esisto për na partìa ciamà "$1", ma gnun-a tichëtta corëspondenta <code>&lt;references group="$1"/&gt;</code> a l\'é stàita trovà',
+ 'cite_error_group_refs_without_references' => 'Dle tichëtte <code>&lt;ref&gt;</code> a esisto për na partìa ciamà «$1», ma gnun-a tichëtta corëspondenta <code>&lt;references group="$1"/&gt;</code> a l\'é stàita trovà opura a-i manca un delimitator final <code>&lt;/ref&gt;</code>',
'cite_error_references_group_mismatch' => 'La tichëtta <code>&lt;ref&gt;</code> an <code>&lt;references&gt;</code> a l\'ha n\'atribut ëd partìa "$1" an conflit.',
'cite_error_references_missing_group' => 'La tichëtta <code>&lt;ref&gt;</code> definìa an <code>&lt;references&gt;</code> a l\'ha n\'atribut ëd partìa "$1" che a l\'era pa ant ël test prima.',
'cite_error_references_missing_key' => 'La tichëtta <code>&lt;ref&gt;</code> con nòm "$1" definìa an <code>&lt;references&gt;</code> a l\'é pa dovrà ant ël test prima.',
'cite_error_references_no_key' => "La tichëtta <code>&lt;ref&gt;</code> definìa an <code>&lt;references&gt;</code> a l'ha pa gnun atribut ëd nòm.",
'cite_error_empty_references_define' => 'La tichëtta <code>&lt;ref&gt;</code> definìa an <code>&lt;references&gt;</code> con nòm "$1" a l\'ha pa gnun contnù.',
+ 'cite_references_link_accessibility_label' => 'Andé',
+ 'cite_references_link_many_accessibility_label' => 'Sauté a:',
);
/** Western Punjabi (پنجابی)
@@ -2972,13 +2750,6 @@ pa gnun test a l'é stàit dàit për l'arferiment ciamà <code>$1</code>",
*/
$messages['pnb'] = array(
'cite-desc' => 'جوڑو <nowiki><ref[ name=id]></nowiki> تے <nowiki><references/></nowiki> ٹیگ اتے پتے لئی۔',
- 'cite_croak' => 'سائیٹ ڈائیڈ؛ $1: $2',
- 'cite_error_key_str_invalid' => 'اندرونی غلطی:
-ناں منی جان والی $وٹد تے/یا $چابی۔
-اے کدے نئیں Ûونا چآغیدا۔',
- 'cite_error_stack_invalid_input' => 'اندرلی غلطی؛
-ناں منی جان والی سٹیک چابی۔
-اے کدے نئیں Ûونا چائیدا',
'cite_error' => 'سائیٹ غلطی:$1',
'cite_error_ref_numeric_key' => 'ناں منیا جان والا <code>&lt;ref&gt;</code> ٹیگ؛
ناں اک Ø³Ø§Ø¯Û Ø§Ù†Ù¹ÛŒØ¬Ø± نئیں Ûوسکدا۔ کوئی Ûور دسن والا سرناواں دسو۔',
@@ -3002,7 +2773,7 @@ $messages['pnb'] = array(
کوئی لکھت نئیں دتی گئی اتے پتے <code>$1</code> لئی۔',
'cite_error_included_ref' => 'بند کردا &lt;/ref&gt ؛ &lt;ref&gt دا کعاٹا ٹیک', # Fuzzy
'cite_error_refs_without_references' => '<code>&lt;ref&gt;</code> ٹیگ Ûیگے نیں، پر کوئی <code>&lt;references/&gt;</code> ٹیگ ناں لبیا۔',
- 'cite_error_group_refs_without_references' => '<code>&lt;ref&gt;</code> ٹیگ اک ٹولی جیدا ناں "$1" اے Ûیگے نیں، پر کوئی <code>&lt;references group="$1"/&gt;</code> ٹیگ ناں لبیا۔',
+ 'cite_error_group_refs_without_references' => '<code>&lt;ref&gt;</code> ٹیگ اک ٹولی جیدا ناں "$1" اے Ûیگے نیں، پر کوئی <code>&lt;references group="$1"/&gt;</code> ٹیگ ناں لبیا۔', # Fuzzy
'cite_error_references_group_mismatch' => '<code>&lt;ref&gt;</code> ٹیگ ان <code>&lt;references&gt;</code> دے رپھڑی اٹریبیوٹ "$1"۔',
'cite_error_references_missing_group' => '<code>&lt;ref&gt;</code> ٹیگ دسیا گیا <code>&lt;references&gt;</code> دے ٹولی اٹریبیوٹ "$1" جیÛÚ‘Û’ Ù¾ÛÙ„ÛŒ لکھت Ú† ناں دسے۔',
'cite_error_references_missing_key' => '<code>&lt;ref&gt;</code> ٹیگ ناں نال "$1" <code>&lt;references&gt;</code> Ú† دسیا گیا Ù¾ÛÙ„ÛŒ کسے لکھت Ú† نئیں ورتیا گیا۔',
@@ -3028,11 +2799,6 @@ $messages['ps'] = array(
*/
$messages['pt'] = array(
'cite-desc' => 'Adiciona elementos <nowiki><ref[ name=id]></nowiki> e <nowiki><references/></nowiki> para uso em citações',
- 'cite_croak' => 'Citação com problemas; $1: $2',
- 'cite_error_key_str_invalid' => 'Erro interno;
-$str e/ou $key inválido.
-Isto nunca deveria acontecer.',
- 'cite_error_stack_invalid_input' => 'Erro interno; chave fixa inválida',
'cite_error' => 'Erro de citação: $1',
'cite_error_ref_numeric_key' => 'Código <code>&lt;ref&gt;</code> inválido; o nome não pode ser um número. Utilize um nome descritivo',
'cite_error_ref_no_key' => 'Código <code>&lt;ref&gt;</code> inválido; refs sem conteúdo devem ter um parâmetro de nome',
@@ -3049,7 +2815,7 @@ Defina mais na mensagem <nowiki>[[MediaWiki:$2]]</nowiki>.',
'cite_error_references_no_text' => 'Tag <code>&lt;ref&gt;</code> inválida; não foi fornecido texto para as refs chamadas <code>$1</code>',
'cite_error_included_ref' => '<code>&lt;/ref&gt;</code> de fecho em falta, para o elemento <code>&lt;ref&gt;</code>',
'cite_error_refs_without_references' => 'existem tags <code>&lt;ref&gt;</code>, mas nenhuma tag <code>&lt;references/&gt;</code> foi encontrada',
- 'cite_error_group_refs_without_references' => 'existem tags <code>&lt;ref&gt;</code> para um grupo chamado "$1", mas nenhuma tag <code>&lt;references group="$1"/&gt;</code> correspondente foi encontrada',
+ 'cite_error_group_refs_without_references' => 'existem tags <code>&lt;ref&gt;</code> para um grupo chamado "$1", mas nenhuma tag <code>&lt;references group="$1"/&gt;</code> correspondente foi encontrada', # Fuzzy
'cite_error_references_group_mismatch' => 'O elemento <code>&lt;ref&gt;</code> em <code>&lt;references&gt;</code> tem o atributo de grupo "$1", que está em conflito com o de <code>&lt;references&gt;</code>.',
'cite_error_references_missing_group' => 'O elemento <code>&lt;ref&gt;</code> definido em <code>&lt;references&gt;</code> tem o atributo de grupo "$1", que não aparece no texto anterior.',
'cite_error_references_missing_key' => 'A etiqueta <code>&lt;ref&gt;</code> com nome "$1" definida em <code>&lt;references&gt;</code> não é utilizada no texto acima.',
@@ -3058,19 +2824,13 @@ Defina mais na mensagem <nowiki>[[MediaWiki:$2]]</nowiki>.',
);
/** Brazilian Portuguese (português do Brasil)
+ * @author Cainamarques
* @author Eduardo.mps
* @author Giro720
* @author 555
*/
$messages['pt-br'] = array(
'cite-desc' => 'Adiciona marcas <nowiki><ref[ name=id]></nowiki> e <nowiki><references/></nowiki> para citações',
- 'cite_croak' => 'Citação com problemas; $1: $2',
- 'cite_error_key_str_invalid' => 'Erro interno;
-$str e/ou $key inválido.
-Isto nunca deveria acontecer.',
- 'cite_error_stack_invalid_input' => 'Erro interno;
-chave fixa inválida.
-Isto nunca deveria ocorrer.',
'cite_error' => 'Erro de citação: $1',
'cite_error_ref_numeric_key' => 'Marca <code>&lt;ref&gt;</code> inválida;
o nome não pode ser um número. Utilize um título descritivo',
@@ -3088,18 +2848,20 @@ só o parâmetro "group" é permitido.
Utilize <code>&lt;references /&gt;</code>, ou <code>&lt;references group="..." /&gt;</code>',
'cite_error_references_no_backlink_label' => 'Etiquetas de backlink esgotadas.
Defina mais na mensagem <nowiki>[[MediaWiki:Cite references link many format backlink labels]]</nowiki>',
- 'cite_error_no_link_label_group' => 'Esgotamento das legendas personalizadas para links, no grupo "$1".
+ 'cite_error_no_link_label_group' => 'Etiquetas personalizadas para links, no grupo "$1", esgotadas.
Defina mais na mensagem <nowiki>[[MediaWiki:$2]]</nowiki>.',
'cite_error_references_no_text' => 'Marca <code>&lt;ref&gt;</code> inválida;
não foi fornecido texto para as refs chamadas <code>$1</code>',
'cite_error_included_ref' => '<code>&lt;/ref&gt;</code> de fechamento ausente para para a marca <code>&lt;ref&gt;</code>',
'cite_error_refs_without_references' => 'existem marcas <code>&lt;ref&gt;</code>, mas nenhuma marca <code>&lt;references/&gt;</code> foi encontrada',
- 'cite_error_group_refs_without_references' => 'existem marcas <code>&lt;ref&gt;</code> para um grupo chamado "$1", mas nenhuma marca <code>&lt;references group="$1"/&gt;</code> correspondente foi encontrada',
- 'cite_error_references_group_mismatch' => 'marca <code>&lt;ref&gt;</code> em <code>&lt;references&gt;</code> tem o atributo grupo "$1" conflitante.',
- 'cite_error_references_missing_group' => 'marca <code>&lt;ref&gt;</code> definida em <code>&lt;references&gt;</code> tem atributo grupo "$1" que não aparece no texto anterior.',
- 'cite_error_references_missing_key' => 'marca <code>&lt;ref&gt;</code> com nome "$1" definida em <code>&lt;references&gt;</code> não foi utilizada no texto anterior.',
- 'cite_error_references_no_key' => 'marca <code>&lt;ref&gt;</code> definida em <code>&lt;references&gt;</code> não tem atributo nome.',
- 'cite_error_empty_references_define' => 'marca <code>&lt;ref&gt;</code> definida em <code>&lt;references&gt;</code> com nome "$1" não tem nenhum conteúdo.',
+ 'cite_error_group_refs_without_references' => 'existem marcas <code>&lt;ref&gt;</code> para um grupo chamado "$1", mas nenhuma marca <code>&lt;references group="$1"/&gt;</code> correspondente foi encontrada (ou uma marca de fechamento <code>&lt;/ref&gt;</code> está faltando)',
+ 'cite_error_references_group_mismatch' => 'marca <code>&lt;ref&gt;</code> em <code>&lt;references&gt;</code> está com o atributo de grupo "$1" conflitante.',
+ 'cite_error_references_missing_group' => 'marca <code>&lt;ref&gt;</code> definida em <code>&lt;references&gt;</code> está com atributo de grupo "$1" que não aparece no texto anterior.',
+ 'cite_error_references_missing_key' => 'marca <code>&lt;ref&gt;</code> com nome "$1", definida em <code>&lt;references&gt;</code>, não foi utilizada no texto anterior.',
+ 'cite_error_references_no_key' => 'marca <code>&lt;ref&gt;</code>, definida em <code>&lt;references&gt;</code>, não tem atributo de nome.',
+ 'cite_error_empty_references_define' => 'marca <code>&lt;ref&gt;</code>, definida em <code>&lt;references&gt;</code>, com nome "$1", não tem nenhum conteúdo.',
+ 'cite_references_link_accessibility_label' => 'Ir para cima',
+ 'cite_references_link_many_accessibility_label' => 'Ir para:',
);
/** Quechua (Runa Simi)
@@ -3107,13 +2869,6 @@ não foi fornecido texto para as refs chamadas <code>$1</code>',
*/
$messages['qu'] = array(
'cite-desc' => 'Pukyumanta willanapaq <nowiki><ref[ name=id]></nowiki> , <nowiki><references/></nowiki> unanchachakunatam yapan',
- 'cite_croak' => "''Cite'' nisqa mast'arinaqa manañam kanchu; $1: $2",
- 'cite_error_key_str_invalid' => 'Ukhu pantasqa;
-mana allin $str wan/icha $key.
-Kayqa ama hayk\'appas tukukunchu.',
- 'cite_error_stack_invalid_input' => "Ukhu pantasqa;
-tawqa llawiqa manam allinchu.
-Kayqa ama hayk'appas tukukunchu.",
'cite_error' => 'Pukyumanta willaypi pantasqa: $1',
'cite_error_ref_numeric_key' => "<code>&lt;ref&gt;</code> unanchachaqa manam allinchu;
sutinqa ama yupaylla kachunchu. Ch'uyanchaq sutinta llamk'achiy",
@@ -3133,7 +2888,9 @@ Astawan sut'ichay <nowiki>[[MediaWiki:Cite references link many format backlink
<code>$1</code> nisqapaq pukyu qillqa manam kanchu',
'cite_error_included_ref' => "Kichaq <code>&lt;ref&gt;</code> unanchachapaq wichq'aq <code>&lt;/ref&gt;</code> unanchachaqa manam kanchu",
'cite_error_refs_without_references' => '<code>&lt;ref&gt;</code> unanchacham kachkan, ichataq manam <code>&lt;references/&gt;</code> unanchachachu',
- 'cite_error_group_refs_without_references' => '"$1" sutiyuq huñupaq <code>&lt;ref&gt;</code> unanchacham kachkan, ichataq manam chay huñupaq qillqasqa <code>&lt;references/&gt;</code> unanchachachu',
+ 'cite_error_group_refs_without_references' => '"$1" sutiyuq huñupaq <code>&lt;ref&gt;</code> unanchacham kachkan, ichataq manam chay huñupaq qillqasqa <code>&lt;references group="$1"/&gt;</code> unanchacha manam tarisqachu, icha wichq\'aq <code>&lt;/ref&gt;</code> unanchacha manam kanchu',
+ 'cite_references_link_accessibility_label' => "Hawaman t'iskuy",
+ 'cite_references_link_many_accessibility_label' => "Hawaman t'iskuspa kayman riy:",
);
/** Romanian (română)
@@ -3144,13 +2901,6 @@ Astawan sut'ichay <nowiki>[[MediaWiki:Cite references link many format backlink
*/
$messages['ro'] = array(
'cite-desc' => 'Adaugă etichete <nowiki><ref[ name=id]></nowiki> și <nowiki><references/></nowiki>, pentru citări',
- 'cite_croak' => 'Citare coruptă; $1 : $2',
- 'cite_error_key_str_invalid' => 'Eroare internă;
-$str invalid sau/și $key.
-Acestea nu ar trebui să se întâmple.',
- 'cite_error_stack_invalid_input' => 'Eroare internă;
-stivă cheie invalidă.
-Acestea nu ar trebui să se întâmple.',
'cite_error' => 'Eroare la citare: $1',
'cite_error_ref_numeric_key' => 'Etichetă <code>&lt;ref&gt;</code> invalidă;
numele nu poate fi un număr. Folosește un titlu descriptiv',
@@ -3170,7 +2920,7 @@ Folosește eticheta <code>&lt;references /&gt;</code>, sau <code>&lt;references
niciun text nu a fost furnizat pentru ref-urile numite <code>$1</code>',
'cite_error_included_ref' => 'Eticheta de închidere <code>&lt;/ref&gt;</code> lipsește pentru eticheta <code>&lt;ref&gt;</code>',
'cite_error_refs_without_references' => 'Etichete <code>&lt;ref&gt;</code> există, dar nu s-a găsit nicio etichetă <code>&lt;references/&gt;</code>',
- 'cite_error_group_refs_without_references' => 'Etichete <code>&lt;ref&gt;</code> există pentru un grup numit „$1â€, dar nu È™i o etichetă <code>&lt;references group="$1"/&gt;</code>',
+ 'cite_error_group_refs_without_references' => 'Etichete <code>&lt;ref&gt;</code> există pentru un grup numit „$1â€, dar nu È™i o etichetă <code>&lt;references group="$1"/&gt;</code>', # Fuzzy
'cite_error_references_group_mismatch' => 'Eticheta <code>&lt;ref&gt;</code> din <code>&lt;references&gt;</code> are atributul de grup „$1†care a intrat în conflict.',
'cite_error_references_missing_group' => 'Eticheta <code>&lt;ref&gt;</code> definită în <code>&lt;references&gt;</code> are atributul de grup „$1†care nu apare în textul anterior.',
'cite_error_references_missing_key' => 'Eticheta <code>&lt;ref&gt;</code> cu numele „$1†definită în <code>&lt;references&gt;</code> nu este utilizată în textul anterior.',
@@ -3183,13 +2933,6 @@ niciun text nu a fost furnizat pentru ref-urile numite <code>$1</code>',
*/
$messages['roa-tara'] = array(
'cite-desc' => 'Aggiunge le tag <nowiki><ref[ name=id]></nowiki> and <nowiki><references/></nowiki> pe le citaziune',
- 'cite_croak' => 'Cite muerte; $1: $2',
- 'cite_error_key_str_invalid' => 'Errore inderne;
-invalide $str e/o $key.
-Quiste non g\'avessa succedere.',
- 'cite_error_stack_invalid_input' => "Errore inderne;
-stack key invalide.
-Quiste non g'avessa succedere.",
'cite_error' => 'Cite errore: $1',
'cite_error_ref_numeric_key' => "Tag <code>&lt;ref&gt;</code> invalide;
'u nome non ge pò essere sole 'n'indere. Ause 'nu titele descrittive",
@@ -3213,12 +2956,14 @@ Definiscene otre jndr\'à \'u messàgge <nowiki>[[MediaWiki:$2]]</nowiki>.',
nisciune teste ere previste pe le referimende nnomenate <code>$1</code>',
'cite_error_included_ref' => "Stè 'u tag <code>&lt;/ref&gt;</code> ma manghe <code>&lt;ref&gt;</code>",
'cite_error_refs_without_references' => "'u tag <code>&lt;ref&gt;</code> esiste, ma non g'esiste 'u tag <code>&lt;references/&gt;</code>",
- 'cite_error_group_refs_without_references' => '\'U tag <code>&lt;ref&gt;</code> esiste pu gruppe nomenate "$1", ma non ge corresponne a \'u tag acchiate <code>&lt;references group="$1"/&gt;</code>',
+ 'cite_error_group_refs_without_references' => '\'U tag <code>&lt;ref&gt;</code> esiste pu gruppe nomenate "$1", ma non ge corresponne a \'u tag acchiate <code>&lt;references group="$1"/&gt;</code>, o \'nu tag de chiusure <code>&lt;/ref&gt;</code> manghe',
'cite_error_references_group_mismatch' => "'U tag <code>&lt;ref&gt;</code> tag jndr'à <code>&lt;references&gt;</code> tène conflitte cu l'attribbute d'u gruppe \"\$1\".",
'cite_error_references_missing_group' => "'U tag <code>&lt;ref&gt;</code> definite jndr'à <code>&lt;references&gt;</code> ave attribbute de gruppe \"\$1\" 'u quale non ge jesse jndr'à 'u teste prengepàle.",
'cite_error_references_missing_key' => "'U tag <code>&lt;ref&gt;</code> cu 'u nome \"\$1\" definite jndr'à <code>&lt;references&gt;</code> non g'avene ausate jndr'à 'u teste prengepàle.",
'cite_error_references_no_key' => "'U tag <code>&lt;ref&gt;</code> definite jndr'à <code>&lt;references&gt;</code> non ge tène 'nu nome d'attrebbute.",
'cite_error_empty_references_define' => '\'U tag <code>&lt;ref&gt;</code> definite jndr\'à <code>&lt;references&gt;</code> cu \'u nome "$1" non ge tène condenute.',
+ 'cite_references_link_accessibility_label' => 'Zumbe sus',
+ 'cite_references_link_many_accessibility_label' => 'Zumbe sus a:',
);
/** Russian (руÑÑкий)
@@ -3228,17 +2973,11 @@ nisciune teste ere previste pe le referimende nnomenate <code>$1</code>',
* @author KPu3uC B Poccuu
* @author Kaganer
* @author Kalan
+ * @author Okras
* @author ÐлекÑандр Сигачёв
*/
$messages['ru'] = array(
'cite-desc' => 'ДобавлÑет теги <nowiki><ref[ name=id]></nowiki> и <nowiki><references/></nowiki> Ð´Ð»Ñ ÑноÑок',
- 'cite_croak' => 'Цитата умерла; $1: $2',
- 'cite_error_key_str_invalid' => "ВнутреннÑÑ Ð¾ÑˆÐ¸Ð±ÐºÐ°;
-ошибочное значение '''\$str''' или '''\$key'''.
-Подобное не должно проиÑходить.",
- 'cite_error_stack_invalid_input' => 'ВнутреннÑÑ Ð¾ÑˆÐ¸Ð±ÐºÐ°.
-Ðеверный ключ Ñтека.
-Подобное не должно проиÑходить.',
'cite_error' => 'Ошибка Ñ†Ð¸Ñ‚Ð¸Ñ€Ð¾Ð²Ð°Ð½Ð¸Ñ $1',
'cite_error_ref_numeric_key' => 'Ðеправильный тег <code>&lt;ref&gt;</code>;
Ð¸Ð¼Ñ Ð½Ðµ может быть целым чиÑлом. ИÑпользуйте опиÑательное название',
@@ -3261,7 +3000,7 @@ $messages['ru'] = array(
'cite_error_references_no_text' => 'Ðеверный тег <code>&lt;ref&gt;</code>; Ð´Ð»Ñ ÑноÑок <code>$1</code> не указан текÑÑ‚',
'cite_error_included_ref' => 'ОтÑутÑтвует закрывающий тег <code>&lt;/ref&gt;</code>',
'cite_error_refs_without_references' => 'Ð”Ð»Ñ ÑущеÑтвующего тега <code>&lt;ref&gt;</code> не найдено ÑоответÑтвующего тега <code>&lt;references/&gt;</code>',
- 'cite_error_group_refs_without_references' => 'Ð”Ð»Ñ ÑущеÑтвующих тегов <code>&lt;ref&gt;</code> группы «$1» не найдено ÑоответÑтвующего тега <code>&lt;references group="$1"/&gt;</code>',
+ 'cite_error_group_refs_without_references' => 'Ð”Ð»Ñ ÑущеÑтвующих тегов <code>&lt;ref&gt;</code> группы «$1» не найдено ÑоответÑтвующего тега <code>&lt;references group="$1"/&gt;</code> или пропущен закрывающий тег <code>&lt;/ref&gt;</code>',
'cite_error_references_group_mismatch' => 'Тег <code>&lt;ref&gt;</code> в <code>&lt;references&gt;</code> имеет конфликтующие группы атрибутов «$1».',
'cite_error_references_missing_group' => 'Тег <code>&lt;ref&gt;</code>, определённый в <code>&lt;references&gt;</code>, имеет атрибут группы «$1», который не упоминаетÑÑ Ð² текÑте ранее.',
'cite_error_references_missing_key' => 'Тег <code>&lt;ref&gt;</code> Ñ Ð¸Ð¼ÐµÐ½ÐµÐ¼ «$1», определённый в <code>&lt;references&gt;</code>, не иÑпользуетÑÑ Ð² предшеÑтвующем текÑте.',
@@ -3275,6 +3014,8 @@ $messages['ru'] = array(
'cite_references_link_many_format_backlink_labels' => 'а б в г д е Ñ‘ ж з и й к л м н о п Ñ€ Ñ Ñ‚ у Ñ„ Ñ… ц ч ш щ ÑŠ Ñ‹ ÑŒ Ñ ÑŽ Ñ Ð°Ð° аб ав аг ад ае Ñ‘ аж аз аи ай ак ал ам ан ао ап ар Ð°Ñ Ð°Ñ‚ ау аф ах ац ач аш ащ аъ аы аь Ð°Ñ Ð°ÑŽ Ð°Ñ Ð±Ð° бб бв бг бд бе бж бз би бй бк бл бм бн бо бп бр Ð±Ñ Ð±Ñ‚ бу бф бх бц бч бш бщ бъ бы бь Ð±Ñ Ð±ÑŽ Ð±Ñ Ð²Ð° вб вв вг вд ве вж вз ви вй вк вл вм вн во вп вр Ð²Ñ Ð²Ñ‚ ву вф вх вц вч вш вщ въ вы вь Ð²Ñ Ð²ÑŽ Ð²Ñ Ð³Ð° гб гв гг гд ге гж гз ги гй гк гл гм гн го гп гр Ð³Ñ Ð³Ñ‚ гу гф гх гц гч гш гщ гъ гы гь Ð³Ñ Ð³ÑŽ Ð³Ñ Ð´Ð° дб дв дг дд де дж дз ди дй дк дл дм дн до дп др Ð´Ñ Ð´Ñ‚ ду дф дх дц дч дш дщ дъ ды дь Ð´Ñ Ð´ÑŽ Ð´Ñ ÐµÐ° еб ев ег ед ее еж ез еи ей ек ел ем ен ео еп ер ÐµÑ ÐµÑ‚ еу еф ех ец еч еш ещ еъ еы еь ÐµÑ ÐµÑŽ ÐµÑ Ð¶Ð° жб жв жг жд же жж жз жи жй жк жл жм жн жо жп жр Ð¶Ñ Ð¶Ñ‚ жу жф жх жц жч жш жщ жъ жы жь Ð¶Ñ Ð¶ÑŽ Ð¶Ñ Ð·Ð° зб зв зг зд зе зж зз зи зй зк зл зм зн зо зп зр Ð·Ñ Ð·Ñ‚ зу зф зх зц зч зш зщ зъ зы зь Ð·Ñ Ð·ÑŽ Ð·Ñ Ð¸Ð° иб ив иг ид ие иж из ии ий ик ил им ин ио ип ир Ð¸Ñ Ð¸Ñ‚ иу иф их иц ич иш ищ иъ иы иь Ð¸Ñ Ð¸ÑŽ Ð¸Ñ Ð¹Ð° йб йв йг йд йе йж йз йи йй йк йл йм йн йо йп йр Ð¹Ñ Ð¹Ñ‚ йу йф йх йц йч йш йщ йъ йы йь Ð¹Ñ Ð¹ÑŽ Ð¹Ñ ÐºÐ° кб кв кг кд ке кж кз ки кй кк кл км кн ко кп кр ÐºÑ ÐºÑ‚ ку кф кх кц кч кш кщ къ кы кь ÐºÑ ÐºÑŽ ÐºÑ Ð»Ð° лб лв лг лд ле лж лз ли лй лк лл лм лн ло лп лр Ð»Ñ Ð»Ñ‚ лу лф лх лц лч лш лщ лъ лы ль Ð»Ñ Ð»ÑŽ Ð»Ñ Ð¼Ð° мб мв мг мд ме мж мз ми мй мк мл мм мн мо мп мр Ð¼Ñ Ð¼Ñ‚ му мф мх мц мч мш мщ мъ мы мь Ð¼Ñ Ð¼ÑŽ Ð¼Ñ Ð½Ð° нб нв нг нд не нж нз ни нй нк нл нм нн но нп нр Ð½Ñ Ð½Ñ‚ ну нф нх нц нч нш нщ нъ ны нь Ð½Ñ Ð½ÑŽ Ð½Ñ Ð¾Ð° об ов ог од ое ож оз ои ой ок ол ом он оо оп ор Ð¾Ñ Ð¾Ñ‚ оу оф ох оц оч ош ощ оъ оы оь Ð¾Ñ Ð¾ÑŽ Ð¾Ñ Ð¿Ð° пб пв пг пд пе пж пз пи пй пк пл пм пн по пп пр Ð¿Ñ Ð¿Ñ‚ пу пф пх пц пч пш пщ пъ пы пь Ð¿Ñ Ð¿ÑŽ Ð¿Ñ Ñ€Ð° рб рв рг рд ре рж рз ри рй рк рл рм рн ро рп рр Ñ€Ñ Ñ€Ñ‚ ру рф рх рц рч рш рщ ръ ры рь Ñ€Ñ Ñ€ÑŽ Ñ€Ñ Ñа Ñб Ñв Ñг Ñд Ñе Ñж Ñз Ñи Ñй Ñк Ñл Ñм Ñн Ñо Ñп ÑÑ€ ÑÑ ÑÑ‚ Ñу ÑÑ„ ÑÑ… Ñц Ñч Ñш Ñщ ÑÑŠ ÑÑ‹ ÑÑŒ ÑÑ ÑÑŽ ÑÑ Ñ‚Ð° тб тв тг тд те тж тз ти тй тк тл тм тн то тп Ñ‚Ñ€ Ñ‚Ñ Ñ‚Ñ‚ ту Ñ‚Ñ„ Ñ‚Ñ… тц тч тш тщ Ñ‚ÑŠ Ñ‚Ñ‹ Ñ‚ÑŒ Ñ‚Ñ Ñ‚ÑŽ Ñ‚Ñ ÑƒÐ° уб ув уг уд уе уж уз уи уй ук ул ум ун уо уп ур ÑƒÑ ÑƒÑ‚ уу уф ух уц уч уш ущ уъ уы уь ÑƒÑ ÑƒÑŽ ÑƒÑ Ñ„Ð° фб фв фг фд фе фж фз фи фй фк фл фм фн фо фп Ñ„Ñ€ Ñ„Ñ Ñ„Ñ‚ фу Ñ„Ñ„ Ñ„Ñ… фц фч фш фщ Ñ„ÑŠ Ñ„Ñ‹ Ñ„ÑŒ Ñ„Ñ Ñ„ÑŽ Ñ„Ñ Ñ…Ð° хб хв хг хд хе хж хз хи хй хк хл хм хн хо хп Ñ…Ñ€ Ñ…Ñ Ñ…Ñ‚ ху Ñ…Ñ„ Ñ…Ñ… хц хч хш хщ Ñ…ÑŠ Ñ…Ñ‹ Ñ…ÑŒ Ñ…Ñ Ñ…ÑŽ Ñ…Ñ Ñ†Ð° цб цв цг цд це цж цз ци цй цк цл цм цн цо цп цр Ñ†Ñ Ñ†Ñ‚ цу цф цх цц цч цш цщ цъ цы ць Ñ†Ñ Ñ†ÑŽ Ñ†Ñ Ñ‡Ð° чб чв чг чд че чж чз чи чй чк чл чм чн чо чп чр Ñ‡Ñ Ñ‡Ñ‚ чу чф чх чц чч чш чщ чъ чы чь Ñ‡Ñ Ñ‡ÑŽ Ñ‡Ñ ÑˆÐ° шб шв шг шд ше шж шз ши шй шк шл шм шн шо шп шр ÑˆÑ ÑˆÑ‚ шу шф шх шц шч шш шщ шъ шы шь ÑˆÑ ÑˆÑŽ ÑˆÑ Ñ‰Ð° щб щв щг щд ще щж щз щи щй щк щл щм щн що щп щр Ñ‰Ñ Ñ‰Ñ‚ щу щф щх щц щч щш щщ щъ щы щь Ñ‰Ñ Ñ‰ÑŽ Ñ‰Ñ ÑŠÐ° ъб ъв ъг ъд ъе ъж ъз ъи ъй ък ъл ъм ън ъо ъп ÑŠÑ€ ÑŠÑ ÑŠÑ‚ ъу ÑŠÑ„ ÑŠÑ… ъц ъч ъш ъщ ÑŠÑŠ ÑŠÑ‹ ÑŠÑŒ ÑŠÑ ÑŠÑŽ ÑŠÑ Ñ‹Ð° ыб ыв ыг ыд ые ыж ыз ыи ый ык ыл ым ын ыо ып Ñ‹Ñ€ Ñ‹Ñ Ñ‹Ñ‚ ыу Ñ‹Ñ„ Ñ‹Ñ… ыц ыч ыш ыщ Ñ‹ÑŠ Ñ‹Ñ‹ Ñ‹ÑŒ Ñ‹Ñ Ñ‹ÑŽ Ñ‹Ñ ÑŒÐ° ьб ьв ьг ьд ье ьж ьз ьи ьй ьк ьл ьм ьн ьо ьп ьр ÑŒÑ ÑŒÑ‚ ьу ьф ьх ьц ьч ьш ьщ ьъ ьы ьь ÑŒÑ ÑŒÑŽ ÑŒÑ Ñа Ñб Ñв Ñг Ñд Ñе Ñж Ñз Ñи Ñй Ñк Ñл Ñм Ñн Ñо Ñп ÑÑ€ ÑÑ ÑÑ‚ Ñу ÑÑ„ ÑÑ… Ñц Ñч Ñш Ñщ ÑÑŠ ÑÑ‹ ÑÑŒ ÑÑ ÑÑŽ ÑÑ ÑŽÐ° юб юв юг юд юе юж юз юи юй юк юл юм юн юо юп ÑŽÑ€ ÑŽÑ ÑŽÑ‚ юу ÑŽÑ„ ÑŽÑ… юц юч юш ющ ÑŽÑŠ ÑŽÑ‹ ÑŽÑŒ ÑŽÑ ÑŽÑŽ ÑŽÑ Ñа Ñб Ñв Ñг Ñд Ñе Ñж Ñз Ñи Ñй Ñк Ñл Ñм Ñн Ñо Ñп ÑÑ€ ÑÑ ÑÑ‚ Ñу ÑÑ„ ÑÑ… Ñц Ñч Ñш Ñщ ÑÑŠ ÑÑ‹ ÑÑŒ ÑÑ ÑÑŽ ÑÑ',
'cite_references_link_many_sep' => '&#32;',
'cite_references_link_many_and' => '&#32;',
+ 'cite_references_link_accessibility_label' => 'Перейти',
+ 'cite_references_link_many_accessibility_label' => 'Перейти к:',
);
/** Rusyn (руÑиньÑкый)
@@ -3282,13 +3023,6 @@ $messages['ru'] = array(
*/
$messages['rue'] = array(
'cite-desc' => 'ПридаÑÑ‚ÑŒ таґы <nowiki><ref[ name="id"]></nowiki> Ñ–&nbsp;<nowiki><references /></nowiki> на Ð¾Ð·Ð½Ð°Ñ‡Ñ–Ð½Ñ Ñ†Ñ–Ñ‚Ð°Ñ†Ñ–Ð¹',
- 'cite_croak' => 'Ðефункчна цітаціÑ; $1: $2',
- 'cite_error_key_str_invalid' => 'Ð’Ð½ÑƒÑ‚Ñ€Ñ—ÑˆÐ½Ñ Ñ…Ñ‹Ð±Ð°;
-неплатный $str або $key.
-Тото бы не мало ниґда наÑтати.',
- 'cite_error_stack_invalid_input' => 'Ð’Ð½ÑƒÑ‚Ñ€Ñ—ÑˆÐ½Ñ Ñ…Ñ‹Ð±Ð°;
-неплатный ключ Ñтека.
-Тото бы не мало ниґда наÑтати.',
'cite_error' => 'Хыбна цітаціÑ: $1',
'cite_error_ref_numeric_key' => 'Хыба в таґу <code>&lt;ref&gt;</code>; назвов не Ñміє быти проÑте чіÑло, хоÑнуйте попиÑове означінÑ',
'cite_error_ref_no_key' => 'Хыба в таґу <code>&lt;ref&gt;</code>; порожнї едітації муÑÑÑ‚ÑŒ обÑÑговати назву',
@@ -3304,7 +3038,7 @@ $messages['rue'] = array(
'cite_error_references_no_text' => 'Хыба в таґу <code>&lt;ref&gt;</code>; цітації означеной <code>$1</code> не Ñ” доданый жаден текÑÑ‚',
'cite_error_included_ref' => 'Хыбить Ð·Ð°ÐºÑ–Ð½Ñ‡Ñ–Ð½Ñ <code>&lt;/ref&gt;</code> k&nbsp;таґу <code>&lt;ref&gt;</code>',
'cite_error_refs_without_references' => 'Ðайджена значка <code>&lt;ref&gt;</code> без одповідной значкы <code>&lt;references/&gt;</code>.',
- 'cite_error_group_refs_without_references' => 'Ðайджена значка <code>&lt;ref&gt;</code> про ґрупу „$1“ без одповідной значкы <code>&lt;references group="$1"/&gt;</code>.',
+ 'cite_error_group_refs_without_references' => 'Ðайдена значка <code>&lt;ref&gt;</code> про ґрупу „$1“, але не Ñ–Ñнує приналежна значка <code>&lt;references group="$1"/&gt;</code> або хыбить заперачій <code>&lt;/ref&gt;</code>.',
'cite_error_references_group_mismatch' => 'Значка <code>&lt;ref&gt;</code> внутрї <code>&lt;references&gt;</code> має дефіновану іншу ґрупу „$1“.',
'cite_error_references_missing_group' => 'Значка <code>&lt;ref&gt;</code> внутрї <code>&lt;references&gt;</code> хоÑнує ґрупу „$1“, котра ÑÑ Ð² попереднїм текÑÑ‚Ñ— не обÑвує.',
'cite_error_references_missing_key' => 'Ðа <code>&lt;ref&gt;</code> з іменом „$1“ дефінованый внутрї <code>&lt;references&gt;</code> не Ñуть в попереднїм текÑÑ‚Ñ— жадны одказы.',
@@ -3318,13 +3052,6 @@ $messages['rue'] = array(
$messages['sa'] = array(
'cite-desc' => '
Adds<nowiki><ref[ name=id]></nowiki> तथा<nowiki><references/></nowiki> उदà¥à¤§à¤°à¤£à¤¾à¤¨à¤¾à¤‚ कृते समà¥à¤ªà¤°à¥à¤•à¤¤à¤¨à¥à¤¤à¤µà¤ƒ',
- 'cite_croak' => 'उदà¥à¤§à¤°à¤£à¤‚ निरसà¥à¤¤à¤®à¥; $1: $2',
- 'cite_error_key_str_invalid' => 'आनà¥à¤¤à¤°à¤¿à¤•à¤¦à¥‹à¤·à¤ƒ;
-अमानà¥à¤¯à¤®à¥ $str तथा/अथवा $key।
-à¤à¤µà¤‚ कदापि न भवेतॠ।',
- 'cite_error_stack_invalid_input' => 'आनà¥à¤¤à¤°à¤¿à¤•à¤¦à¥‹à¤·à¤ƒ ;
-अमानà¥à¤¯à¤¾ राशिकà¥à¤žà¥à¤šà¤¿à¤•à¤¾ ।
-à¤à¤µà¤‚ कदापि न भवेतॠ।',
'cite_error' => 'उदà¥à¤§à¤°à¤£à¥‡ दोषः : $1',
'cite_error_ref_numeric_key' => '<code>&lt;ref&gt;</code> अमानà¥à¤¯à¤¶à¥ƒà¤™à¥à¤–ला;
नाम पूरà¥à¤£à¤¾à¤™à¥à¤•à¤¸à¤™à¥à¤–à¥à¤¯à¤¾ भवितà¥à¤‚ नारà¥à¤¹à¤¤à¤¿ । विविरणयà¥à¤•à¥à¤¤à¤‚ शिरोनाम उपयà¥à¤œà¥à¤¯à¤¤à¤¾à¤®à¥ ।',
@@ -3346,7 +3073,7 @@ Adds<nowiki><ref[ name=id]></nowiki> तथा<nowiki><references/></nowiki> उ
<code>$1</code> इतà¥à¤¯à¤¸à¥à¤¯ आधारः अजà¥à¤žà¤¾à¤¤à¤ƒ',
'cite_error_included_ref' => 'समापà¥à¤¤à¤¿à¤ƒ <code>&lt;/ref&gt;</code> <code>&lt;ref&gt;</code> शृङà¥à¤–ला लà¥à¤ªà¥à¤¤à¤¾',
'cite_error_refs_without_references' => '<code>&lt;ref&gt;</code>शृङà¥à¤–ला विदà¥à¤¯à¤¤à¥‡, किनà¥à¤¤à¥ <code>&lt;references/&gt;</code> शृङà¥à¤–ला न पà¥à¤°à¤¾à¤ªà¥à¤¤à¤¾',
- 'cite_error_group_refs_without_references' => '<code>&lt;ref&gt;</code> "$1" नामकसà¥à¤¯ गणसà¥à¤¯ अङà¥à¤•à¤¨à¤‚ विदà¥à¤¯à¤¤à¥‡, कीनà¥à¤¤à¥ किमपि अनà¥à¤°à¥‚पं <code>&lt;references group="$1"/&gt;</code> अङà¥à¤•à¤¨à¤‚ न पà¥à¤°à¤¾à¤ªà¥à¤¤à¤®à¥',
+ 'cite_error_group_refs_without_references' => '<code>&lt;ref&gt;</code> "$1" नामकसà¥à¤¯ गणसà¥à¤¯ अङà¥à¤•à¤¨à¤‚ विदà¥à¤¯à¤¤à¥‡, कीनà¥à¤¤à¥ किमपि अनà¥à¤°à¥‚पं <code>&lt;references group="$1"/&gt;</code> अङà¥à¤•à¤¨à¤‚ न पà¥à¤°à¤¾à¤ªà¥à¤¤à¤®à¥', # Fuzzy
'cite_error_references_group_mismatch' => '<code>&lt;ref&gt;</code> टैग इन <code>&lt;references&gt;</code>सङà¥à¤˜à¤°à¥à¤·à¤—णलकà¥à¤·à¤£à¤‚ "$1" विदà¥à¤¯à¤¤à¥‡ ।',
'cite_error_references_missing_group' => '<code>&lt;ref&gt;</code> अङà¥à¤•à¤¨à¤ªà¤°à¤¿à¤­à¤¾à¤·à¤¿à¤¤à¥‡ <code>&lt;references&gt;</code> à¤à¤¤à¤¸à¥à¤®à¤¿à¤¨à¥ गणसà¥à¤¯ विशेषः "$1" यशà¥à¤š पूरà¥à¤µà¤²à¥‡à¤–े न दृषà¥à¤Ÿà¤®à¥ ।',
'cite_error_references_missing_key' => '<code>&lt;ref&gt;</code> अङà¥à¤•à¤¨à¤‚ "$1" नामà¥à¤¨à¤¾ सह परिभाषितमॠ<code>&lt;references&gt;</code> पूरà¥à¤µà¤²à¥‡à¤–े उपयोगाय न जातमॠ।',
@@ -3359,9 +3086,6 @@ Adds<nowiki><ref[ name=id]></nowiki> तथा<nowiki><references/></nowiki> उ
*/
$messages['sah'] = array(
'cite-desc' => 'Ð¥Ð¾Ñ Ð±Ñ‹Ò»Ð°Ð°Ñ€Ñ‹Ñ‹ <nowiki><ref[ name=id]></nowiki> уонна <nowiki><references/></nowiki> тиÑктÑрин ÑбÑÑ€',
- 'cite_croak' => 'Быһа тардыы Ñуох буолбут (Цитата Ñдохла); $1: $2',
- 'cite_error_key_str_invalid' => 'ИһинÑÑҕи Ñыыһа: $str уонна/ÑбÑÑ‚ÑÑ€ $key Ñыыһалар.',
- 'cite_error_stack_invalid_input' => 'ИһинÑÑҕи Ñыыһа: stack key Ñыыһалаах',
'cite_error' => 'Цитата Ñыыһата: $1',
'cite_error_ref_numeric_key' => 'Ðеправильный вызов: ожидалÑÑ Ð½ÐµÑ‡Ð¸Ñловой ключ',
'cite_error_ref_no_key' => '<code>&lt;ref&gt;</code> тиÑк алҕаһа (Ðеправильный вызов): аата (күлүүһÑ) ыйыллыбатах',
@@ -3379,7 +3103,7 @@ $messages['sah'] = array(
<code>$1</code> диÑн Ñ…Ð¾Ñ Ð±Ñ‹Ò»Ð°Ð°Ñ€Ñ‹Ñ‹Ð»Ð°Ñ€Ð³Ð° аналлаах тиÑÐºÐ¸Ñ Ñуох',
'cite_error_included_ref' => '<code>&lt;/ref&gt;</code> диÑн Ñабар тиÑк Ñуох Ñбит',
'cite_error_refs_without_references' => 'Баар <code>&lt;ref&gt;</code> тиÑÐºÐºÑ Ñөп түбÑÒ»ÑÑ€ <code>&lt;references/&gt;</code> тиÑк көÑтүбÑÑ‚Ñ',
- 'cite_error_group_refs_without_references' => '"$1" бөлөх <code>&lt;ref&gt;</code> тиÑгигÑÑ€ Ñөп түбÑÒ»ÑÑ€ <code>&lt;references group="$1"/&gt;</code> тиÑк көÑтүбÑÑ‚Ñ',
+ 'cite_error_group_refs_without_references' => '"$1" бөлөх <code>&lt;ref&gt;</code> тиÑгигÑÑ€ Ñөп түбÑÒ»ÑÑ€ <code>&lt;references group="$1"/&gt;</code> тиÑк көÑтүбÑÑ‚Ñ', # Fuzzy
'cite_error_references_group_mismatch' => '<code>&lt;references&gt;</code> туттуллар <code>&lt;ref&gt;</code> тиÑк бÑÐ¹Ñ Ð±ÑйÑлÑрин кытта ÑөпÑÓ©Ñпөт "$1" атрибуттаах бөлөхтөрдөөх',
'cite_error_references_missing_group' => 'Бу <code>&lt;references&gt;</code> туттар маннык <code>&lt;ref&gt;</code> тиÑÐ³Ñ Ð±Ó©Ð»Ó©Ñ… тиÑкиһигÑÑ€ урут көрÑүллүбÑÑ‚ÑÑ… "$1" атрибуттаах.',
'cite_error_references_missing_key' => 'Бу <code>&lt;references&gt;</code> туттар маннык <code>&lt;ref&gt;</code> "$1" диÑн тиÑÐ³Ñ Ð±Ñƒ иннинÑÑҕи тиÑкиÑÐºÑ Ñ‚ÑƒÑ‚Ñ‚ÑƒÐ»Ð»ÑƒÐ±Ð°Ñ‚ Ñбит.',
@@ -3388,14 +3112,12 @@ $messages['sah'] = array(
);
/** Sicilian (sicilianu)
+ * @author Markos90
* @author Melos
* @author Santu
*/
$messages['scn'] = array(
'cite-desc' => 'Junci li tag <nowiki><ref[ name=id]></nowiki> e <nowiki><references/></nowiki> pi gistiri li citazzioni',
- 'cite_croak' => 'Sbàgghiu nnâ citazzioni: $1: $2',
- 'cite_error_key_str_invalid' => 'Sbàgghiu nternu: $str sbagghiatu',
- 'cite_error_stack_invalid_input' => 'Sbàgghiu nternu: chiavi di stack sbagghiata',
'cite_error' => 'Sbàgghiu nnâ funzioni Cite $1',
'cite_error_ref_numeric_key' => "Sbàgghiu ni l'usu dû marcaturi <code>&lt;ref&gt;</code>: lu nomu pò èssiri nu nùmmiru sanu. Usari nu tìtulu discrittivu",
'cite_error_ref_no_key' => "Sbàgghiu ni l'usu dû marcaturi <code>&lt;ref&gt;</code>: li ref vacanti non ponnu èssiri senza nomu.",
@@ -3409,7 +3131,7 @@ Usari <code>&lt;references /&gt;</code> oppuru <code>&lt;references group="..."
'cite_error_references_no_text' => 'Marcaturi <code>&lt;ref&gt;</code> non vàlidu; non vinni nnicatu nuddu testu pô marcaturi <code>$1</code>',
'cite_error_included_ref' => '<code>&lt;/ref&gt;</code> di chiusura mancanti pô marcaturi <code>&lt;ref&gt;</code>',
'cite_error_refs_without_references' => 'Sù prisenti dê marcatura <code>&lt;ref&gt;</code> ma nun fu attruvatu nissunu marcaturi <code>&lt;references/&gt;</code>',
- 'cite_error_group_refs_without_references' => 'Sù prisenti dê marcatura <code>&lt;ref&gt;</code> pi nu gruppu chiamatu "$1" ma nun fu truvatu nissunu marcaturi <code>&lt;references group="$1"/&gt;</code> currispunnenti',
+ 'cite_error_group_refs_without_references' => 'Sù prisenti dê marcatura <code>&lt;ref&gt;</code> pi nu gruppu chiamatu "$1" ma nun fu truvatu nissunu marcaturi <code>&lt;references group="$1"/&gt;</code> currispunnenti', # Fuzzy
'cite_error_references_group_mismatch' => 'Lu tag <code>&lt;ref&gt;</code> n <code>&lt;references&gt;</code> havi attribuiutu lu gruppu "$1" n conflittu.',
'cite_error_references_missing_group' => 'Lu tag <code>&lt;ref&gt;</code> difinutu n <code>&lt;references&gt;</code> havi n\'attributu gruppu "$1" ca nun cumpari ni lu testu pricidenti.',
'cite_error_references_missing_key' => 'Lu tag <code>&lt;ref&gt;</code> cu nomu "$1" difinutu n <code>&lt;references&gt;</code> nun è usatu nô testu pricidenti.',
@@ -3417,6 +3139,10 @@ Usari <code>&lt;references /&gt;</code> oppuru <code>&lt;references group="..."
'cite_error_empty_references_define' => 'Lu tag <code>&lt;ref&gt;</code> difinutu n <code>&lt;references&gt;</code> cu lu nomu "$1" nun havi alcun cuntinutu.',
'cite_reference_link_prefix' => 'muntuari ref',
'cite_references_link_prefix' => 'muntuari annutazzioni',
+ 'cite_references_link_one' => "<li id=\"\$1\">[[#\$2|'''^''']] \$3</li>",
+ 'cite_references_link_many' => "<li id=\"\$1\">'''^''' \$2 \$3</li>",
+ 'cite_references_link_many_format' => "<sup>''[[#$1|$3]]''</sup>", # Fuzzy
+ 'cite_references_link_many_format_backlink_labels' => '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 aa ab ac ad ae af ag ah ai aj ak al am an ao ap aq ar as at au av aw ax ay az ba bb bc bd be bf bg bh bi bj bk bl bm bn bo bp bq br bs bt bu bv bw bx by bz ca cb cc cd ce cf cg ch ci cj ck cl cm cn co cp cq cr cs ct cu cv cw cx cy cz da db dc dd de df dg dh di dj dk dl dm dn do dp dq dr ds dt du dv dw dx dy dz ea eb ec ed ee ef eg eh ei ej ek el em en eo ep eq er es et eu ev ew ex ey ez fa fb fc fd fe ff fg fh fi fj fk fl fm fn fo fp fq fr fs ft fu fv fw fx fy fz ga gb gc gd ge gf gg gh gi gj gk gl gm gn go gp gq gr gs gt gu gv gw gx gy gz ha hb hc hd he hf hg hh hi hj hk hl hm hn ho hp hq hr hs ht hu hv hw hx hy hz ia ib ic id ie if ig ih ii ij ik il im in io ip iq ir is it iu iv iw ix iy iz ja jb jc jd je jf jg jh ji jj jk jl jm jn jo jp jq jr js jt ju jv jw jx jy jz ka kb kc kd ke kf kg kh ki kj kk kl km kn ko kp kq kr ks kt ku kv kw kx ky kz la lb lc ld le lf lg lh li lj lk ll lm ln lo lp lq lr ls lt lu lv lw lx ly lz ma mb mc md me mf mg mh mi mj mk ml mm mn mo mp mq mr ms mt mu mv mw mx my mz na nb nc nd ne nf ng nh ni nj nk nl nm nn no np nq nr ns nt nu nv nw nx ny nz oa ob oc od oe of og oh oi oj ok ol om on oo op oq or os ot ou ov ow ox oy oz pa pb pc pd pe pf pg ph pi pj pk pl pm pn po pp pq pr ps pt pu pv pw px py pz qa qb qc qd qe qf qg qh qi qj qk ql qm qn qo qp qq qr qs qt qu qv qw qx qy qz ra rb rc rd re rf rg rh ri rj rk rl rm rn ro rp rq rr rs rt ru rv rw rx ry rz sa sb sc sd se sf sg sh si sj sk sl sm sn so sp sq sr ss st su sv sw sx sy sz ta tb tc td te tf tg th ti tj tk tl tm tn to tp tq tr ts tt tu tv tw tx ty tz ua ub uc ud ue uf ug uh ui uj uk ul um un uo up uq ur us ut uu uv uw ux uy uz va vb vc vd ve vf vg vh vi vj vk vl vm vn vo vp vq vr vs vt vu vv vw vx vy vz wa wb wc wd we wf wg wh wi wj wk wl wm wn wo wp wq wr ws wt wu wv ww wx wy wz xa xb xc xd xe xf xg xh xi xj xk xl xm xn xo xp xq xr xs xt xu xv xw xx xy xz ya yb yc yd ye yf yg yh yi yj yk yl ym yn yo yp yq yr ys yt yu yv yw yx yy yz za zb zc zd ze zf zg zh zi zj zk zl zm zn zo zp zq zr zs zt zu zv zw zx zy zz',
);
/** Sinhala (සිංහල)
@@ -3426,13 +3152,6 @@ Usari <code>&lt;references /&gt;</code> oppuru <code>&lt;references group="..."
*/
$messages['si'] = array(
'cite-desc' => 'උපහරණයන් සඳහà·, <nowiki><ref[ name=id]></nowiki> සහ <nowiki><references/></nowiki> ටà·à¶œà¶ºà¶±à·Š, එකතු කරයි',
- 'cite_croak' => 'උපන්â€à¶ºà·à·ƒà¶º නිරුද්ධවිය; $1: $2',
- 'cite_error_key_str_invalid' => 'අභ්â€à¶ºà¶±à·Šà¶­à¶» දà·à·‚ය;
-අනීතික $str සහ/හ෠$key.
-මෙය කිසිදින සිදුනොවිය යුතුය.',
- 'cite_error_stack_invalid_input' => 'අභ්â€à¶ºà¶±à·Šà¶­à¶» දà·à·‚ය;
-අනීතික ඇසිරුම් යතුර.
-මෙය කිසිදින සිදුනොවිය යුතුය.',
'cite_error' => 'උපන්â€à¶ºà·à·ƒ දà·à·‚ය: $1',
'cite_error_ref_numeric_key' => 'අනීතික <code>&lt;ref&gt;</code> ටà·à¶œà¶º;
නම සරල පූර්ණà·à¶‚කයක් විය නොහà·à¶š. විස්තරà·à·“ලි à·à·’ර්ෂයක් භà·à·€à·’ත෠කරන්න',
@@ -3456,7 +3175,7 @@ $messages['si'] = array(
<code>$1</code> නමà·à¶­à·’ ආà·à·Šâ€à¶»à·šà¶ºà¶±à·Š සඳහ෠කිසිදු පෙළක් සපය෠නොතිබුණි',
'cite_error_included_ref' => '<code>&lt;ref&gt;</code> ටà·à¶œà¶º සොයà·à¶œà¶­ නොහà·à¶šà·’ බà·à·€à·’න් <code>&lt;/ref&gt;</code> වස෠දමමින්',
'cite_error_refs_without_references' => '<code>&lt;ref&gt;</code> ටà·à¶œ පà·à·€à¶­à·”ණත්, <code>&lt;references/&gt;</code> ටà·à¶œ සොයà·à¶œà¶­ නොහà·à¶šà·’ විය.',
- 'cite_error_group_refs_without_references' => '"$1" නම් කණ්ඩà·à¶ºà¶¸ සඳහ෠<code>&lt;ref&gt;</code> ටà·à¶œ පà·à·€à¶­à·”ණත්, ඊට අදà·à·… <code>&lt;references group="$1"/&gt;</code> ටà·à¶œ සොයà·à¶œà¶­ නොහà·à¶šà·’ විය.',
+ 'cite_error_group_refs_without_references' => '"$1" නම් කණ්ඩà·à¶ºà¶¸ සඳහ෠<code>&lt;ref&gt;</code> ටà·à¶œ පà·à·€à¶­à·”ණත්, ඊට අදà·à·… <code>&lt;references group="$1"/&gt;</code> ටà·à¶œ සොයà·à¶œà¶­ නොහà·à¶šà·’ විය.', # Fuzzy
'cite_error_references_group_mismatch' => '<code>&lt;references&gt;</code> à·„à·’ <code>&lt;ref&gt;</code> නම් ටà·à¶œà¶º "$1" යන පරස්පර සමූහ ගුණà·à¶‚ග දරයි.',
'cite_error_references_missing_group' => '<code>&lt;references&gt;</code> à·„à·’ <code>&lt;ref&gt;</code> ටà·à¶œà¶º පෙර පෙළෙහි නොතිබූ "$1" නම් සමූහ ගුණà·à¶‚ගයක් දරයි.',
'cite_error_references_missing_key' => '<code>&lt;references&gt;</code> à·„à·’ "$1" නමà·à¶­à·’ <code>&lt;ref&gt;</code> ටà·à¶œà¶º පෙර පෙළෙහි භà·à·€à·’ත෠වූයේ නà·à¶­.',
@@ -3471,11 +3190,6 @@ $messages['si'] = array(
*/
$messages['sk'] = array(
'cite-desc' => 'Pridáva znaÄky <nowiki><ref[ name=id]></nowiki> a <nowiki><references/></nowiki> pre citácie',
- 'cite_croak' => 'Citát je už neaktuálny; $1: $2',
- 'cite_error_key_str_invalid' => 'Vnútorná chyba;
-neplatný $str a/alebo $key.
-Toto by sa nemalo nikdy stať.',
- 'cite_error_stack_invalid_input' => 'Vnútorná chyba; neplatný kÄ¾ÃºÄ zásobníka',
'cite_error' => 'Chyba citácie $1',
'cite_error_ref_numeric_key' => 'Neplatné volanie; oÄakáva sa neceloÄíselný typ kľúÄa',
'cite_error_ref_no_key' => 'Neplatné volanie; nebol Å¡pecifikovaný kľúÄ',
@@ -3491,7 +3205,7 @@ Definujte ÄalÅ¡ie v správe <nowiki>[[MediaWiki:$2]]</nowiki>.',
'cite_error_references_no_text' => 'Neplatná znaÄka <code>&lt;ref&gt;</code>; nebol zadaný text pre referencie s názvom <code>$1</code>',
'cite_error_included_ref' => 'Chýba zakonÄenie znaÄky <code>&lt;ref&gt;</code> (<code>&lt;/ref&gt;</code>)',
'cite_error_refs_without_references' => 'ZnaÄky <code>&lt;ref&gt;</code> sú prítomné, ale nebola nájdená žiadna znaÄka <code>&lt;references/&gt;</code>',
- 'cite_error_group_refs_without_references' => 'ZnaÄky <code>&lt;ref&gt;</code> pre skupinu „$1“ sú prítomné, ale nebola nájdená zodpovedajúca znaÄka <code>&lt;references group="$1"/&gt;</code>',
+ 'cite_error_group_refs_without_references' => 'ZnaÄky <code>&lt;ref&gt;</code> pre skupinu „$1“ sú prítomné, ale nebola nájdená zodpovedajúca znaÄka <code>&lt;references group="$1"/&gt;</code>', # Fuzzy
'cite_error_references_group_mismatch' => 'ZnaÄka <code>&lt;ref&gt;</code> v <code>&lt;references&gt;</code> má konfliktný atribút skupiny „$1“.',
'cite_error_references_missing_group' => 'ZnaÄka <code>&lt;ref&gt;</code> v <code>&lt;references&gt;</code> má atribút skupiny „$1“, ktorý sa v predoÅ¡lom texte nevyskytuje.',
'cite_error_references_missing_key' => 'ZnaÄka <code>&lt;ref&gt;</code> s názvom „$1“ definovaná v <code>&lt;references&gt;</code> sa v predoÅ¡lom texte nevyskytuje.',
@@ -3504,13 +3218,6 @@ Definujte ÄalÅ¡ie v správe <nowiki>[[MediaWiki:$2]]</nowiki>.',
*/
$messages['sl'] = array(
'cite-desc' => 'Doda etiketi <nowiki><ref[ name=id]></nowiki> in <nowiki><references/></nowiki> za navajanje',
- 'cite_croak' => 'HreÅ¡ÄeÄa navedba; $1: $2',
- 'cite_error_key_str_invalid' => 'Notranja napaka;
-neveljaven $str in/ali $key.
-To se ne bi nikoli smelo zgoditi.',
- 'cite_error_stack_invalid_input' => 'Notranja napaka;
-neveljavni skladovni kljuÄ.
-To se ne bi nikoli smelo zgoditi.',
'cite_error' => 'Napaka pri navajanju: $1',
'cite_error_ref_numeric_key' => 'Neveljavna oznaka <code>&lt;ref&gt;</code>;
ime ne more biti samo Å¡tevilo. Uporabite opisni naslov',
@@ -3534,7 +3241,7 @@ DoloÄite jih veÄ v sporoÄilu <nowiki>[[MediaWiki:$2]]</nowiki>.',
sklici imenovani <code>$1</code> nimajo doloÄenega besedila',
'cite_error_included_ref' => 'ZakljuÄek <code>&lt;/ref&gt;</code> manjka za etiketo <code>&lt;ref&gt;</code>',
'cite_error_refs_without_references' => 'Obstajajo etikete <code>&lt;ref&gt;</code>, vendar etikete <code>&lt;references/&gt;</code> ni bilo mogoÄe najti',
- 'cite_error_group_refs_without_references' => 'Obstajajo etikete <code>&lt;ref&gt;</code> za skupino, imenovano »$1«, vendar ustrezne etikete <code>&lt;references group="$1"/&gt;</code> ni bilo mogoÄe najti',
+ 'cite_error_group_refs_without_references' => 'Obstajajo etikete <code>&lt;ref&gt;</code> za skupino, imenovano »$1«, vendar ustrezne etikete <code>&lt;references group="$1"/&gt;</code> ni bilo mogoÄe najti ali pa manjka zakljuÄni <code>&lt;/ref&gt;</code>',
'cite_error_references_group_mismatch' => 'Oznaka <code>&lt;ref&gt;</code> v <code>&lt;references&gt;</code> ima atribut nasprotujoÄe si skupine »$1«.',
'cite_error_references_missing_group' => 'Oznaka <code>&lt;ref&gt;</code>, opredeljena v <code>&lt;references&gt;</code>, ima atribut skupine »$1«, ki se ne pojavi v predhodnem besedilu.',
'cite_error_references_missing_key' => 'Oznaka <code>&lt;ref&gt;</code> z imenom »$1«, opredeljena v <code>&lt;references&gt;</code>, ni uporabljena v predhodnem besedilu.',
@@ -3543,6 +3250,8 @@ sklici imenovani <code>$1</code> nimajo doloÄenega besedila',
'cite_references_link_one' => '<li id="$1"><span class="mw-cite-backlink">\'\'\'[[#$2|^]]\'\'\'</span> $3</li>',
'cite_references_link_many' => '<li id="$1"><span class="mw-cite-backlink">^ $2</span> $3</li>',
'cite_references_link_many_format_backlink_labels' => 'a b c Ä d e f g h i j k l m n o p r s Å¡ t u v z ž a aa ab ac aÄ ad ae af ag ah ai aj ak al am an ao ap ar as aÅ¡ at au av az až b ba bb bc bÄ bd be bf bg bh bi bj bk bl bm bn bo bp br bs bÅ¡ bt bu bv bz bž c ca cb cc cÄ cd ce cf cg ch ci cj ck cl cm cn co cp cr cs cÅ¡ ct cu cv cz cž Ä Äa Äb Äc ÄÄ Äd Äe Äf Äg Äh Äi Äj Äk Äl Äm Än Äo Äp Är Äs ÄÅ¡ Ät Äu Äv Äz Äž d da db dc dÄ dd de df dg dh di dj dk dl dm dn do dp dr ds dÅ¡ dt du dv dz dž e ea eb ec eÄ ed ee ef eg eh ei ej ek el em en eo ep er es eÅ¡ et eu ev ez ež f fa fb fc fÄ fd fe ff fg fh fi fj fk fl fm fn fo fp fr fs fÅ¡ ft fu fv fz fž g ga gb gc gÄ gd ge gf gg gh gi gj gk gl gm gn go gp gr gs gÅ¡ gt gu gv gz gž h ha hb hc hÄ hd he hf hg hh hi hj hk hl hm hn ho hp hr hs hÅ¡ ht hu hv hz hž i ia ib ic iÄ id ie if ig ih ii ij ik il im in io ip ir is iÅ¡ it iu iv iz iž j ja jb jc jÄ jd je jf jg jh ji jj jk jl jm jn jo jp jr js jÅ¡ jt ju jv jz jž k ka kb kc kÄ kd ke kf kg kh ki kj kk kl km kn ko kp kr ks kÅ¡ kt ku kv kz kž l la lb lc lÄ ld le lf lg lh li lj lk ll lm ln lo lp lr ls lÅ¡ lt lu lv lz lž m ma mb mc mÄ md me mf mg mh mi mj mk ml mm mn mo mp mr ms mÅ¡ mt mu mv mz mž n na nb nc nÄ nd ne nf ng nh ni nj nk nl nm nn no np nr ns nÅ¡ nt nu nv nz nž o oa ob oc oÄ od oe of og oh oi oj ok ol om on oo op or os oÅ¡ ot ou ov oz ož p pa pb pc pÄ pd pe pf pg ph pi pj pk pl pm pn po pp pr ps pÅ¡ pt pu pv pz pž r ra rb rc rÄ rd re rf rg rh ri rj rk rl rm rn ro rp rr rs rÅ¡ rt ru rv rz rž s sa sb sc sÄ sd se sf sg sh si sj sk sl sm sn so sp sr ss sÅ¡ st su sv sz sž Å¡ Å¡a Å¡b Å¡c Å¡Ä Å¡d Å¡e Å¡f Å¡g Å¡h Å¡i Å¡j Å¡k Å¡l Å¡m Å¡n Å¡o Å¡p Å¡r Å¡s Å¡Å¡ Å¡t Å¡u Å¡v Å¡z šž t ta tb tc tÄ td te tf tg th ti tj tk tl tm tn to tp tr ts tÅ¡ tt tu tv tz tž u ua ub uc uÄ ud ue uf ug uh ui uj uk ul um un uo up ur us uÅ¡ ut uu uv uz už v va vb vc vÄ vd ve vf vg vh vi vj vk vl vm vn vo vp vr vs vÅ¡ vt vu vv vz vž z za zb zc zÄ zd ze zf zg zh zi zj zk zl zm zn zo zp zr zs zÅ¡ zt zu zv zz zž ž ža žb žc Å¾Ä Å¾d že žf žg žh ži žj žk žl žm žn žo žp žr žs žš žt žu žv žz žž',
+ 'cite_references_link_accessibility_label' => 'SkoÄi gor',
+ 'cite_references_link_many_accessibility_label' => 'SkoÄi gor na:',
);
/** Albanian (shqip)
@@ -3551,13 +3260,6 @@ sklici imenovani <code>$1</code> nimajo doloÄenega besedila',
*/
$messages['sq'] = array(
'cite-desc' => 'Shton etiketa <nowiki><ref[ name=id]></nowiki> dhe <nowiki><references/></nowiki> për citime',
- 'cite_croak' => 'Gabim në sistem; $1: $2',
- 'cite_error_key_str_invalid' => 'Gabim i brendshëm;
-$str dhe/ose $key i pavlefshëm
-Kjo nuk duhet të ndodhë kurrë.',
- 'cite_error_stack_invalid_input' => 'Gabim i brendshëm;
-stack key i pavlefshëm
-Kjo nuk duhet të ndodhë kurrë.',
'cite_error' => 'Gabim referencash: $1',
'cite_error_ref_numeric_key' => 'Etiketë <code>&lt;ref&gt;</code> e pavlefshme;
emri nuk mund të jetë një numër i plotë i thjeshtë. Përdorni një titull përshkrues',
@@ -3581,7 +3283,7 @@ Percaktoni më shumë në <nowiki> [[MediaWiki:$2]] </nowiki> mesazh.',
asnjë tekst nuk u dha për refs e quajtura <code>$1</code>',
'cite_error_included_ref' => 'Duke mbyllur <code>&lt;/ref&gt;</code> mungon për etiketën <code>&lt;ref&gt;</code>',
'cite_error_refs_without_references' => 'Etiketat <code>&lt;ref&gt;</code> ekzistojnë, por nuk u gjet etiketa <code>&lt;references/&gt;</code>',
- 'cite_error_group_refs_without_references' => 'Etiketat <code>&lt;ref&gt;</code> ekzistojnë për një grup të quajtur "$1", por nuk u gjet etiketa korresponduese <code>&lt;references group="$1"/&gt;</code>',
+ 'cite_error_group_refs_without_references' => 'Etiketat <code>&lt;ref&gt;</code> ekzistojnë për një grup të quajtur "$1", por nuk u gjet etiketa korresponduese <code>&lt;references group="$1"/&gt;</code>', # Fuzzy
'cite_error_references_group_mismatch' => '<code>&lt;ref&gt;</code> tag in <code>&lt;references&gt;</code> has conflicting group attribute "$1".',
'cite_error_references_missing_group' => '<code>&lt;ref&gt;</code> etiketa e përcaktuar në <code>&lt;referenca&gt;</code> ka atribut grup "$1" që nuk duket në tekstin paraprak.',
'cite_error_references_missing_key' => '<code>&lt;ref&gt;</code> etiketa me emrin "$1" e percaktuar ne <code>&lt;referenca&gt;</code> nuk është përdorur në tekst paraprak.',
@@ -3596,9 +3298,6 @@ asnjë tekst nuk u dha për refs e quajtura <code>$1</code>',
*/
$messages['sr-ec'] = array(
'cite-desc' => 'Додаје <nowiki><ref[ name=id]></nowiki> и <nowiki><references/></nowiki> ознаке за цитирање.',
- 'cite_croak' => 'Додатак за цитирање је неиÑправан; $1: $2.',
- 'cite_error_key_str_invalid' => 'Унутрашња грешка; лош $str и/или $key. Ово не би требало никад да Ñе деÑи.',
- 'cite_error_stack_invalid_input' => 'Унутрашња грешка; лош кључ Ñтека. Ово не би требало никад да Ñе деÑи.',
'cite_error' => 'Грешка цитата: $1',
'cite_error_ref_numeric_key' => 'Лоша ознака <code>&lt;ref&gt;</code>; име не може бити једноÑтавни интеџер. КориÑти опиÑни наÑлов.',
'cite_error_ref_no_key' => 'Лоша ознака <code>&lt;ref&gt;</code>; ref-ови без Ñадржаја морају имати име.',
@@ -3610,7 +3309,7 @@ $messages['sr-ec'] = array(
'cite_error_references_no_text' => 'Лоша ознака <code>&lt;ref&gt;</code>; нема текÑта за ref-ове под именом <code>$1</code>.',
'cite_error_included_ref' => 'Затвара <code>&lt;/ref&gt;</code> који недоÑтаје <code>&lt;ref&gt;</code> тагу',
'cite_error_refs_without_references' => 'Чланак има ознаке <code>&lt;ref&gt;</code>, али није пронађена потребна ознака <code>&#123;&#123;наводи&#125;&#125;</code> (или <code>&lt;references/&gt;</code>)',
- 'cite_error_group_refs_without_references' => 'ПоÑтоје ознаке <code>&lt;ref&gt;</code> за групу Ñ Ð¸Ð¼ÐµÐ½Ð¾Ð¼ „$1“, али нема одговарајуће ознаке <code>&lt;references group="$1"/&gt;</code>',
+ 'cite_error_group_refs_without_references' => 'ПоÑтоје ознаке <code>&lt;ref&gt;</code> за групу Ñ Ð¸Ð¼ÐµÐ½Ð¾Ð¼ „$1“, али нема одговарајуће ознаке <code>&lt;references group="$1"/&gt;</code>', # Fuzzy
'cite_reference_link_key_with_num' => '$1_$2',
'cite_reference_link_prefix' => 'cite_ref-',
'cite_references_link_prefix' => 'cite_note-',
@@ -3628,9 +3327,6 @@ $messages['sr-ec'] = array(
*/
$messages['sr-el'] = array(
'cite-desc' => 'Dodaje <nowiki><ref[ name=id]></nowiki> i <nowiki><references/></nowiki> oznake za citiranje.',
- 'cite_croak' => 'Dodatak za citiranje je umro; $1: $2.',
- 'cite_error_key_str_invalid' => 'Unutrašnja greška; loš $str i/ili $key. Ovo ne bi trebalo nikad da se desi.',
- 'cite_error_stack_invalid_input' => 'UnutraÅ¡nja greÅ¡ka; loÅ¡ kljuÄ steka. Ovo ne bi trebalo nikad da se desi.',
'cite_error' => 'Greška citata: $1',
'cite_error_ref_numeric_key' => 'Loša oznaka <code>&amp;lt;ref&amp;gt;</code>; ime ne može biti jednostavni intedžer. Koristi opisni naslov.',
'cite_error_ref_no_key' => 'Loša oznaka <code>&amp;lt;ref&amp;gt;</code>; ref-ovi bez sadržaja moraju imati ime.',
@@ -3642,7 +3338,7 @@ $messages['sr-el'] = array(
'cite_error_references_no_text' => 'Loša oznaka <code>&amp;lt;ref&amp;gt;</code>; nema teksta za ref-ove pod imenom <code>$1</code>.',
'cite_error_included_ref' => 'Zatvara <code>&lt;/ref&gt;</code> koji nedostaje <code>&lt;ref&gt;</code> tagu',
'cite_error_refs_without_references' => '<code>&amp;lt;ref&amp;gt;</code> tag postoji, ali odgovarajući <code>&amp;lt;references/&amp;gt;</code> tag nije nađen',
- 'cite_error_group_refs_without_references' => '<code><ref></code> tagovi postoje za grupu pod imenom "$1", ali nije nađen odgovarajući <code><references group="$1"/></code> tag',
+ 'cite_error_group_refs_without_references' => '<code><ref></code> tagovi postoje za grupu pod imenom "$1", ali nije nađen odgovarajući <code><references group="$1"/></code> tag', # Fuzzy
'cite_reference_link_key_with_num' => '$1_$2',
'cite_reference_link_prefix' => 'cite_ref-',
'cite_references_link_prefix' => 'cite_note-',
@@ -3660,9 +3356,6 @@ $messages['sr-el'] = array(
*/
$messages['stq'] = array(
'cite-desc' => 'Föiget foar Wällenätterwiese do <nowiki><ref[ name=id]></nowiki> un <nowiki><references/></nowiki> Tags tou',
- 'cite_croak' => 'Failer in dät Referenz-System. $1: $2',
- 'cite_error_key_str_invalid' => 'Internen Failer: uungultigen $str un/of $key. Dit skuul eegentelk goar nit passierje konne.',
- 'cite_error_stack_invalid_input' => 'Internen Failer: uungultigen „name“-stack. Dit skuul eegentelk goarnit passierje konne.',
'cite_error' => 'Referenz-Failer $1',
'cite_error_ref_numeric_key' => 'Uungultige <code><nowiki><ref></nowiki></code>-Ferweendenge: „name“ duur naan skeenen Taalenwäid weese, benutsje n beskrieuwenden Noome.',
'cite_error_ref_no_key' => 'Uungultige <code><nowiki><ref></nowiki></code>-Ferweendenge: „ref“ sunner Inhoold mout n Noome hääbe.',
@@ -3674,7 +3367,7 @@ $messages['stq'] = array(
'cite_error_references_no_text' => 'Uungultigen <code>&lt;ref&gt;</code>-Tag; der wuude naan Text foar dät Ref mäd dän Noome <code>$1</code> anroat.',
'cite_error_included_ref' => 'Der failt n sluutend <code>&lt;/ref&gt;</code>',
'cite_error_refs_without_references' => '<code>&lt;ref&gt;</code>-Tags existierje, daach neen <code>&lt;references/&gt;</code>-Tag wuud fuunen.',
- 'cite_error_group_refs_without_references' => '<code>&lt;ref&gt;</code>-Tags existierje foar ju Gruppe „$1“, man neen deertou heerend <code>&lt;references group=„$1“/&gt;</code>-Tag wuud fuunen',
+ 'cite_error_group_refs_without_references' => '<code>&lt;ref&gt;</code>-Tags existierje foar ju Gruppe „$1“, man neen deertou heerend <code>&lt;references group=„$1“/&gt;</code>-Tag wuud fuunen', # Fuzzy
'cite_error_references_group_mismatch' => 'Dät <code>&lt;ref&gt;</code>-Tag in <code>&lt;references&gt;</code> häd dät Konfliktgruppenattribut „$1“.',
'cite_error_references_missing_group' => 'Dät <code>&lt;ref&gt;</code> Tag, as definierd in <code>&lt;references&gt;</code> häd dät Gruppenattribut "$1", dät nit in dän foaruutgungende Text foarkumt.',
'cite_error_references_missing_key' => 'Dät in <code>&lt;references&gt;</code> definierde <code>&lt;ref&gt;</code>-Tag mäd dän Noome „$1“ wäd in dän foaruutgungende Text nit ferwoand.',
@@ -3687,21 +3380,19 @@ $messages['stq'] = array(
*/
$messages['su'] = array(
'cite-desc' => 'Nambahkeun tag <nowiki><ref[ name=id]></nowiki> jeung <nowiki><references/></nowiki>, pikeun cutatan',
- 'cite_error_key_str_invalid' => 'Kasalahan internal; salah $str jeung/atawa $key. Kuduna mah teu kieu.',
);
/** Swedish (svenska)
* @author Boivie
* @author Fluff
+ * @author Jopparn
* @author Lejonel
* @author M.M.S.
* @author Najami
+ * @author Skalman
*/
$messages['sv'] = array(
'cite-desc' => 'Lägger till taggarna <nowiki><ref[ name=id]></nowiki> och <nowiki><references/></nowiki> för referenser till källor',
- 'cite_croak' => 'Fel i fotnotssystemet; $1: $2',
- 'cite_error_key_str_invalid' => 'Internt fel; $str eller $key är ogiltiga. Det här borde aldrig hända.',
- 'cite_error_stack_invalid_input' => 'Internt fel; ogiltig nyckel i stacken. Det här borde aldrig hända.',
'cite_error' => 'Referensfel: $1',
'cite_error_ref_numeric_key' => "Ogiltig <code>&lt;ref&gt;</code>-tag; parametern 'name' kan inte vara ett tal, använd ett beskrivande namn",
'cite_error_ref_no_key' => 'Ogiltig <code>&lt;ref&gt;</code>-tag; referenser utan innehåll måste ha ett namn',
@@ -3718,27 +3409,27 @@ Definera fler i <nowiki>[[MediaWiki:$2]]</nowiki>-meddelandet.',
'cite_error_references_no_text' => 'Ogiltig <code>&lt;ref&gt;</code>-tag; ingen text har angivits för referensen med namnet <code>$1</code>',
'cite_error_included_ref' => 'Avslutande <code>&lt;/ref&gt;</code> saknas för <code>&lt;ref&gt;</code>-tagg',
'cite_error_refs_without_references' => '<code>&lt;ref&gt;</code>-taggar finns, men ingen <code>&lt;references/&gt;</code>-tagg hittades',
- 'cite_error_group_refs_without_references' => '<code>&lt;ref&gt;</code>-taggar finns för gruppnamnet "$1", men ingen motsvarande <code>&lt;references group="$1"/&gt;</code>-tagg hittades',
+ 'cite_error_group_refs_without_references' => '<code>&lt;ref&gt;</code>-taggar finns för gruppnamnet "$1", men ingen motsvarande <code>&lt;references group="$1"/&gt;</code>-tagg hittades, eller så saknas en avslutande <code>&lt;/ref&gt;</code>',
'cite_error_references_group_mismatch' => '<code>&lt;ref&gt;</code>-tagg i <code>&lt;references&gt;</code> har ett motstridigt group-attribut "$1".',
'cite_error_references_missing_group' => '<code>&lt;ref&gt;</code>-tagg definierad i <code>&lt;references&gt;</code> har ett group-attribut "$1" som inte används innan i texten.',
'cite_error_references_missing_key' => '<code>&lt;ref&gt;</code>-tagg med namnet "$1", definierad i <code>&lt;references&gt;</code> används inte innan i texten.',
'cite_error_references_no_key' => '<code>&lt;ref&gt;</code>-tagg definierad i <code>&lt;references&gt;</code> saknar name-attribut.',
'cite_error_empty_references_define' => '<code>&lt;ref&gt;</code>-tagg definierad i <code>&lt;ref&gt;</code> med namnet "$1" har inget innehåll.',
+ 'cite_references_link_accessibility_label' => 'Hoppa upp',
+ 'cite_references_link_many_accessibility_label' => 'Hoppa upp till:',
);
/** Tamil (தமிழà¯)
+ * @author Jayarathina
* @author Shanmugamp7
* @author செலà¯à®µà®¾
*/
$messages['ta'] = array(
'cite-desc' => 'சேரà¯à®•à¯à®•à®¿à®±à®¤à¯ <nowiki><ref[ name=id]></nowiki>மறà¯à®±à¯à®®à¯ <nowiki><references/></nowiki> கà¯à®±à®¿à®šà¯à®šà¯Šà®±à¯à®•à®³à¯, மேறà¯à®•à¯‹à®³à¯à®•à®³à¯à®•à¯à®•à®¾à®•',
- 'cite_error_key_str_invalid' => 'உள௠பிழை;
- செலà¯à®²à®¾à®¤ $ எழà¯à®¤à¯à®¤à¯à®šà¯à®šà®°à®®à¯ மறà¯à®±à¯à®®à¯/அலà¯à®²à®¤à¯ $ விசை.
-இத௠ஒரà¯à®ªà¯‹à®¤à¯à®®à¯ à®à®±à¯à®ªà®Ÿ கூடாதà¯..',
- 'cite_error_stack_invalid_input' => 'உள௠பிழை;
-செலà¯à®²à®¾à®¤ அடà¯à®•à¯à®•à¯ விசை.
-இத௠ஒரà¯à®ªà¯‹à®¤à¯à®®à¯ à®à®±à¯à®ªà®Ÿ கூடாதà¯..',
'cite_error' => 'பிழை காடà¯à®Ÿà¯: $1',
+ 'cite_error_references_no_text' => 'செலà¯à®²à®¾à®¤ <code>&lt;ref&gt;</code> கà¯à®±à®¿à®šà¯à®šà¯Šà®²à¯;
+<code>$1</code> எனà¯à®©à¯à®®à¯ பெயரில௠உளà¯à®³ ref கà¯à®±à®¿à®šà¯à®šà¯Šà®²à¯à®²à¯à®•à¯à®•à¯ உரையேதà¯à®®à¯ வழஙà¯à®•à®ªà¯à®ªà®Ÿà®µà®¿à®²à¯à®²à¯ˆ',
+ 'cite_error_refs_without_references' => '<code>&lt;ref&gt;</code> கà¯à®±à®¿à®šà¯à®šà¯Šà®²à¯ உளà¯à®³à®¤à¯, ஆனால௠<code>&lt;references/&gt;</code> கà¯à®±à®¿à®šà¯à®šà¯Šà®²à¯ காணபà¯à®ªà®Ÿà®µà®¿à®²à¯à®²à¯ˆ',
);
/** Telugu (తెలà±à°—à±)
@@ -3747,9 +3438,6 @@ $messages['ta'] = array(
*/
$messages['te'] = array(
'cite-desc' => 'ఉదహరింపà±à°²à°•à± <nowiki><ref[ name=id]></nowiki> మరియౠ<nowiki><references/></nowiki> టాగà±à°²à°¨à± చేరà±à°šà±à°¤à±à°‚ది',
- 'cite_croak' => 'ఉదహరింపౠచచà±à°šà°¿à°‚ది; $1: $2',
- 'cite_error_key_str_invalid' => 'అంతరà±à°—à°¤ పొరపాటà±: తపà±à°ªà±à°¡à± $str మరియà±/లేదా $key. ఇది à°Žà°ªà±à°ªà±à°¡à±‚ జరగకూడదà±.',
- 'cite_error_stack_invalid_input' => 'అంతరà±à°—à°¤ పొరపాటà±: తపà±à°ªà±à°¡à± à°¸à±à°Ÿà°¾à°•à± à°•à±€. ఇది à°Žà°ªà±à°ªà±à°¡à±‚ జరగకూడదà±.',
'cite_error' => 'ఉదహరింపౠపొరపాటà±: $1',
'cite_error_ref_numeric_key' => 'తపà±à°ªà±à°¡à± <code>&lt;ref&gt;</code> టాగà±; పేరౠసరళ సంఖà±à°¯ అయివà±à°‚డకూడదà±, వివరమైన శీరà±à°·à°¿à°• వాడండి',
'cite_error_ref_no_key' => 'సరైన <code>&lt;ref&gt;</code> à°Ÿà±à°¯à°¾à°—ౠకాదà±; విషయం లేని ref లకౠతపà±à°ªà°¨à°¿à°¸à°°à°¿à°—à°¾ పేరొకటà±à°‚డాలి',
@@ -3765,9 +3453,6 @@ $messages['te'] = array(
*/
$messages['tg-cyrl'] = array(
'cite-desc' => 'БарчаÑбҳои <nowiki><ref[ name=id]></nowiki> ва <nowiki><references/></nowiki> барои ёд кардан, изофа мекунад',
- 'cite_croak' => 'Ðд кардан хароб шуд; $1: $2',
- 'cite_error_key_str_invalid' => 'Хатои дохилӣ; $str ва/Ñ‘ $key ғайримиҷоз. Ин хато набоÑд ҳаргиз рух диҳад.',
- 'cite_error_stack_invalid_input' => 'Хатои дохилӣ; клиди пушта ғайримиҷоз. Ин хато набоÑд ҳаргиз рух диҳад.',
'cite_error' => 'Хатои ёдкард: $1',
'cite_error_ref_numeric_key' => 'БарчаÑби <code>&lt;ref&gt;</code> ғайримиҷоз; ном наметавонад Ñк адад бошад, унвони возеҳтареро иÑтифода кунед',
'cite_error_ref_no_key' => 'БарчаÑби <code>&lt;ref&gt;</code> ғайримиҷоз; ёдкардҳо бидуни мӯҳтаво боÑд ном дошта бошанд',
@@ -3786,9 +3471,6 @@ $messages['tg-cyrl'] = array(
*/
$messages['tg-latn'] = array(
'cite-desc' => 'Barcasbhoi <nowiki><ref[ name=id]></nowiki> va <nowiki><references/></nowiki> baroi jod kardan, izofa mekunad',
- 'cite_croak' => 'Jod kardan xarob ÅŸud; $1: $2',
- 'cite_error_key_str_invalid' => 'Xatoi doxilī; $str va/jo $key ƣajrimiçoz. In xato nabojad hargiz rux dihad.',
- 'cite_error_stack_invalid_input' => 'Xatoi doxilī; klidi puşta ƣajrimiçoz. In xato nabojad hargiz rux dihad.',
'cite_error' => 'Xatoi jodkard: $1',
'cite_error_ref_numeric_key' => 'Barcasbi <code>&lt;ref&gt;</code> ƣajrimiçoz; nom nametavonad jak adad boşad, unvoni vozehtarero istifoda kuned',
'cite_error_ref_no_key' => 'Barcasbi <code>&lt;ref&gt;</code> ƣajrimiçoz; jodkardho biduni mūhtavo bojad nom doşta boşand',
@@ -3808,13 +3490,6 @@ Barcasbi <code>&lt;references /&gt;</code> jo <code>&lt;references group="..." /
*/
$messages['th'] = array(
'cite-desc' => 'ใส่ <nowiki><ref[ name=id]></nowiki> à¹à¸¥à¸° <nowiki><references /></nowiki> สำหรับà¸à¸²à¸£à¸­à¹‰à¸²à¸‡à¸­à¸´à¸‡',
- 'cite_croak' => 'à¹à¸«à¸¥à¹ˆà¸‡à¸­à¹‰à¸²à¸‡à¸­à¸´à¸‡à¹€à¸ªà¸µà¸¢; $1: $2',
- 'cite_error_key_str_invalid' => 'ข้อผิดพลาดภายใน
-$str à¹à¸¥à¸°/หรือ $key ไม่ถูà¸à¸•à¹‰à¸­à¸‡
-ซึ่งไม่ควรเà¸à¸´à¸”ขึ้น',
- 'cite_error_stack_invalid_input' => 'ข้อผิดพลาดภายใน
-à¸à¸¸à¸à¹à¸ˆà¸à¸­à¸‡à¸‹à¹‰à¸­à¸™à¹„ม่ถูà¸à¸•à¹‰à¸­à¸‡
-ซึ่งไม่ควรเà¸à¸´à¸”ขึ้น',
'cite_error' => 'อ้างอิงผิดพลาด: $1',
'cite_error_ref_numeric_key' => 'ป้ายระบุ <code>&lt;ref&gt;</code> ไม่ถูà¸à¸•à¹‰à¸­à¸‡
ชื่อไม่สามารถเป็นจำนวนเต็มอย่างง่าย ใช้ชื่อเรื่องที่พรรณนา',
@@ -3834,7 +3509,7 @@ $str à¹à¸¥à¸°/หรือ $key ไม่ถูà¸à¸•à¹‰à¸­à¸‡
ไม่มีข้อความใดให้ไว้สำหรับอ้างอิงชื่อ <code>$1</code>',
'cite_error_included_ref' => 'ไม่มีà¸à¸²à¸£à¸›à¸´à¸” <code>&lt;/ref&gt;</code> สำหรับ <code>&lt;ref&gt;</code>',
'cite_error_refs_without_references' => 'มีป้ายระบุ <code>&lt;ref&gt;</code> อยู่ à¹à¸•à¹ˆà¹„ม่พบป้ายระบุ <code>&lt;references/&gt;</code>',
- 'cite_error_group_refs_without_references' => 'มีป้ายระบุ <code>&lt;ref&gt;</code> สำหรับà¸à¸¥à¸¸à¹ˆà¸¡à¸Šà¸·à¹ˆà¸­ "$1" à¹à¸•à¹ˆà¹„ม่พบป้ายระบุ <code>&lt;references group="$1"/&gt;</code> ที่สอดคล้องà¸à¸±à¸™',
+ 'cite_error_group_refs_without_references' => 'มีป้ายระบุ <code>&lt;ref&gt;</code> สำหรับà¸à¸¥à¸¸à¹ˆà¸¡à¸Šà¸·à¹ˆà¸­ "$1" à¹à¸•à¹ˆà¹„ม่พบป้ายระบุ <code>&lt;references group="$1"/&gt;</code> ที่สอดคล้องà¸à¸±à¸™', # Fuzzy
'cite_error_references_missing_key' => 'ป้ายระบุ <code>&lt;ref&gt;</code> ชื่อ "$1" มีนิยามใน <code>&lt;references&gt;</code> à¹à¸•à¹ˆà¹„ม่ถูà¸à¹ƒà¸Šà¹‰à¹ƒà¸™à¸‚้อความà¸à¹ˆà¸­à¸™à¸«à¸™à¹‰à¸²à¸™à¸µà¹‰',
'cite_error_empty_references_define' => 'ป้ายระบุ <code>&lt;ref&gt;</code> ที่นิยามใน <code>&lt;references&gt;</code> ด้วยชื่อ "$1" ไม่มีเนื้อหา',
);
@@ -3843,13 +3518,6 @@ $str à¹à¸¥à¸°/หรือ $key ไม่ถูà¸à¸•à¹‰à¸­à¸‡
* @author Hanberke
*/
$messages['tk'] = array(
- 'cite_croak' => 'Sita ýitirildi; $1: $2',
- 'cite_error_key_str_invalid' => 'Içerki säwlik;
-nädogry $str we/ýa-da $key.
-Bu asla bolmaly däl.',
- 'cite_error_stack_invalid_input' => 'Içerki säwlik;
-nädogry stek açary.
-Bu asla bolmaly däl.',
'cite_error' => 'Sitirleme säwligi: $1',
'cite_error_ref_numeric_key' => 'Nädogry <code>&lt;ref&gt;</code> tegi;
at ýönekeý bir bitin san bolup bilmeýär. Düşündirişli at ulanyň',
@@ -3866,7 +3534,7 @@ hiç hili parametre rugsat berilmeýär.
<code>$1</code> atly refler üçin tekst görkezilmändir',
'cite_error_included_ref' => '<code>&lt;ref&gt;</code> tegi üçin <code>&lt;/ref&gt;</code> ýapylyşy kem',
'cite_error_refs_without_references' => '<code>&lt;ref&gt;</code> tegleri bar, emma <code>&lt;references/&gt;</code> tegi tapylmady',
- 'cite_error_group_refs_without_references' => '"$1" atly topar üçin <code>&lt;ref&gt;</code> tegleri bar, emma degişli code>&lt;references group="$1"/&gt;</code> tegi tapylmady',
+ 'cite_error_group_refs_without_references' => '"$1" atly topar üçin <code>&lt;ref&gt;</code> tegleri bar, emma degişli code>&lt;references group="$1"/&gt;</code> tegi tapylmady', # Fuzzy
'cite_error_references_group_mismatch' => '<code>&lt;references&gt;</code>-daky <code>&lt;ref&gt;</code> teginiň çaknyşýan "$1" topar aýratynlygy bar.',
'cite_error_references_missing_group' => '<code>&lt;references&gt;</code>-da kesgitlenen <code>&lt;ref&gt;</code> teginiň öňki tekstde ýok "$1" topar aýratynlygy bar.',
'cite_error_references_missing_key' => '<code>&lt;references&gt;</code>-da kesgitlenen "$1" atly <code>&lt;ref&gt;</code> tegi öňki tekstde ulanylmaýar.',
@@ -3879,13 +3547,6 @@ hiç hili parametre rugsat berilmeýär.
*/
$messages['tl'] = array(
'cite-desc' => 'Nagdaragdag ng mga tatak na <nowiki><ref[ name=id]></nowiki> at <nowiki><references/></nowiki>, para sa mga pagtukoy',
- 'cite_croak' => 'Nawalan ng buhay ang pagtukoy; $1: $2',
- 'cite_error_key_str_invalid' => 'Panloob na kamalian;
-hindi tanggap na $str at/o $key.
-Hindi ito dapat mangyari.',
- 'cite_error_stack_invalid_input' => 'Panloob na kamalian;
-hindi tanggap na susi ng salansan.
-Hindi ito dapat mangyari.',
'cite_error' => 'Kamalian sa pagtukoy: $1',
'cite_error_ref_numeric_key' => "Hindi tanggap ang tatak na <code>&lt;ref&gt;</code>;
hindi maaaring isang payak na buumbilang (''integer'') ang pangalan. Gumamit ng isang mapaglarawang pamagat",
@@ -3909,7 +3570,7 @@ Magbigay ng marami pang kahulugan sa loob ng mensaheng <nowiki>[[MediaWiki:$2]]<
walang tekstong ibinigay para sa mga sangguniang (''ref'') pinangalanang <code>$1</code>",
'cite_error_included_ref' => 'Naawawala ang pansarang <code>&lt;/ref&gt;</code> na para sa tatak na <code>&lt;ref&gt;</code>',
'cite_error_refs_without_references' => 'Umiiral na ang mga tatak na <code>&lt;ref&gt;</code>, subalit walang natagpuang tatak na <code>&lt;references/&gt;</code>',
- 'cite_error_group_refs_without_references' => 'Umiiral na ang tatak na <code>&lt;ref&gt;</code> para sa pangkat na pinangalanang "$1", subalit walang natagpuang katumbas na tatak na <code>&lt;references group="$1"/&gt;</code>',
+ 'cite_error_group_refs_without_references' => 'Umiiral na ang tatak na <code>&lt;ref&gt;</code> para sa pangkat na pinangalanang "$1", subalit walang natagpuang katumbas na tatak na <code>&lt;references group="$1"/&gt;</code>', # Fuzzy
'cite_error_references_group_mismatch' => 'May hindi nagbabanggaang katangiang pampangkat na "$1" ang <code>&lt;ref&gt;</code> tatak na nasa <code>&lt;references&gt;</code>.',
'cite_error_references_missing_group' => 'Ang tatak na <code>&lt;ref&gt;</code> na binigyang kahulugan sa <code>&lt;references&gt;</code> ay may katangiang pampangkat na "$1" na hindi lumilitawa sa naunang teksto.',
'cite_error_references_missing_key' => 'Ang tatak na <code>&lt;ref&gt;</code> na may pangalang "$1" na binigyang kahulugan sa <code>&lt;references&gt;</code> ay hindi ginamit sa naunang teksto.',
@@ -3943,13 +3604,6 @@ $messages['tly'] = array(
*/
$messages['tr'] = array(
'cite-desc' => 'Alıntılar için, <nowiki><ref[ name=id]></nowiki> ve <nowiki><references/></nowiki> etiketlerini ekler',
- 'cite_croak' => 'Alıntı kaybedildi; $1: $2',
- 'cite_error_key_str_invalid' => 'Dahili hata;
-geçersiz $str ve/ya da $key.
-Bu asla olmamalı.',
- 'cite_error_stack_invalid_input' => 'Dahili hata;
-geçersiz stack anahtarı.
-Bu asla olmamalı.',
'cite_error' => 'Kaynak hatası $1',
'cite_error_ref_numeric_key' => 'Geçersiz <code>&lt;ref&gt;</code> etiketi;
isim basit bir tamsayı olamaz. Tanımlayıcı bir başlık kullanın',
@@ -3973,7 +3627,7 @@ sadece "group" parametresine izin verilir.
<code>$1</code> isimli refler için metin temin edilmemiş',
'cite_error_included_ref' => '<code>&lt;ref&gt;</code> etiketi için <code>&lt;/ref&gt;</code> kapanışı eksik',
'cite_error_refs_without_references' => '<code>&lt;ref&gt;</code> etiketleri var, ama <code>&lt;references/&gt;</code> etiketi bulunamadı',
- 'cite_error_group_refs_without_references' => '"$1" isimli grup için <code>&lt;ref&gt;</code> etiketleri mevcut, ancak karşılık gelen <code>&lt;references group="$1"/&gt;</code> etiketi bulunamadı',
+ 'cite_error_group_refs_without_references' => '"$1" isimli grup için <code>&lt;ref&gt;</code> etiketleri mevcut, ancak karşılık gelen <code>&lt;references group="$1"/&gt;</code> etiketi bulunamadı', # Fuzzy
'cite_error_references_group_mismatch' => '<code>&lt;references&gt;</code>\'daki <code>&lt;ref&gt;</code> etiketinin çelişen "$1" grup özniteliği var.',
'cite_error_references_missing_group' => '<code>&lt;references&gt;</code>\'da tanımlanan <code>&lt;ref&gt;</code> etiketinin önceki metinde olmayan "$1" grup özniteliği var.',
'cite_error_references_missing_key' => '<code>&lt;references&gt;</code>\'da tanımlanan "$1" adındaki <code>&lt;ref&gt;</code> etiketi önceki metinde kullanılmıyor.',
@@ -4015,18 +3669,16 @@ $messages['ug-arab'] = array(
/** Ukrainian (українÑька)
* @author AS
* @author Ahonc
+ * @author Andriykopanytsia
* @author Dim Grits
* @author DixonD
* @author NickK
* @author Prima klasy4na
* @author Ytsukeng Fyvaprol
+ * @author Ðта
*/
$messages['uk'] = array(
'cite-desc' => 'Додає теги <nowiki><ref[ name=id]></nowiki> Ñ– <nowiki><references/></nowiki> Ð´Ð»Ñ Ð²Ð¸Ð½Ð¾Ñок',
- 'cite_croak' => 'Цитата померла; $1: $2',
- 'cite_error_key_str_invalid' => 'Ð’Ð½ÑƒÑ‚Ñ€Ñ–ÑˆÐ½Ñ Ð¿Ð¾Ð¼Ð¸Ð»ÐºÐ°:
-неправильний $str і/або $key.',
- 'cite_error_stack_invalid_input' => 'Ð’Ð½ÑƒÑ‚Ñ€Ñ–ÑˆÐ½Ñ Ð¿Ð¾Ð¼Ð¸Ð»ÐºÐ°: неправильний ключ Ñтека.',
'cite_error' => 'Помилка цитуваннÑ: $1',
'cite_error_ref_numeric_key' => 'Ðеправильний виклик <code>&lt;ref&gt;</code>:
назва не може міÑтити тільки цифри.',
@@ -4049,7 +3701,7 @@ $messages['uk'] = array(
Ð´Ð»Ñ Ð²Ð¸Ð½Ð¾Ñок <code>$1</code> не вказаний текÑÑ‚',
'cite_error_included_ref' => 'ВідÑутній тег <code>&lt;/ref&gt;</code> за наÑвноÑÑ‚Ñ– тега <code>&lt;ref&gt;</code>',
'cite_error_refs_without_references' => "<span style='color: red'>Ð”Ð»Ñ Ð½Ð°Ñвного тегу <code>&lt;ref&gt;</code> не знайдено відповідного тегу <code>&lt;references/&gt;</code></span>",
- 'cite_error_group_refs_without_references' => 'Ð”Ð»Ñ Ñ–Ñнуючих тегів <code>&lt;ref&gt;</code> групи під назвою "$1" не знайдено відповідного тегу <code>&lt;references group="$1"/&gt;</code>',
+ 'cite_error_group_refs_without_references' => 'Теги <code>&lt;ref&gt;</code> Ñ–Ñнують Ð´Ð»Ñ Ð³Ñ€ÑƒÐ¿Ð¸ під назвою «$1», але не знайдено відповідного тегу <code>&lt;references group="$1"/&gt;</code>, або ж бракує закриваючого <code>&lt;/ref&gt;</code>',
'cite_error_references_group_mismatch' => 'Тег <code>&lt;ref&gt;</code> в <code>&lt;references&gt;</code> має конфліктуючий атрибут групи "$1".',
'cite_error_references_missing_group' => 'Тег <code>&lt;ref&gt;</code>, заданий в <code>&lt;references&gt;</code>, має атрибут групи "$1", Ñкий не фігурує в попередньому текÑÑ‚Ñ–.',
'cite_error_references_missing_key' => 'Тег <code>&lt;ref&gt;</code> з назвою "$1", визначений у <code>&lt;references&gt;</code>, не викориÑтовуєтьÑÑ Ð² попередньому текÑÑ‚Ñ–.',
@@ -4064,6 +3716,8 @@ $messages['uk'] = array(
'cite_references_link_many_format_backlink_labels' => 'а б в г д е ж и к л м н п Ñ€ Ñ Ñ‚ у Ñ„ Ñ… ц ш щ ÑŽ Ñ Ð°Ð° аб ав аг ад ае аж аи ак ал ам ан ап ар Ð°Ñ Ð°Ñ‚ ау аф ах ац аш ащ аю Ð°Ñ Ð±Ð° бб бв бг бд бе бж би бк бл бм бн бп бр Ð±Ñ Ð±Ñ‚ бу бф бх бц бш бщ бю Ð±Ñ Ð²Ð° вб вв вг вд ве вж ви вк вл вм вн вп вр Ð²Ñ Ð²Ñ‚ ву вф вх вц вш вщ вю Ð²Ñ Ð³Ð° гб гв гг гд ге гж ги гк гл гм гн гп гр Ð³Ñ Ð³Ñ‚ гу гф гх гц гш гщ гю Ð³Ñ Ð´Ð° дб дв дг дд де дж ди дк дл дм дн дп др Ð´Ñ Ð´Ñ‚ ду дф дх дц дш дщ дю Ð´Ñ ÐµÐ° еб ев ег ед ее еж еи ек ел ем ен еп ер ÐµÑ ÐµÑ‚ еу еф ех ец еш ещ ею ÐµÑ Ð¶Ð° жб жв жг жд же жж жи жк жл жм жн жп жр Ð¶Ñ Ð¶Ñ‚ жу жф жх жц жш жщ жю Ð¶Ñ Ð¸Ð° иб ив иг ид ие иж ии ик ил им ин ип ир Ð¸Ñ Ð¸Ñ‚ иу иф их иц иш ищ ию Ð¸Ñ ÐºÐ° кб кв кг кд ке кж ки кк кл км кн кп кр ÐºÑ ÐºÑ‚ ку кф кх кц кш кщ кю ÐºÑ Ð»Ð° лб лв лг лд ле лж ли лк лл лм лн лп лр Ð»Ñ Ð»Ñ‚ лу лф лх лц лш лщ лю Ð»Ñ Ð¼Ð° мб мв мг мд ме мж ми мк мл мм мн мп мр Ð¼Ñ Ð¼Ñ‚ му мф мх мц мш мщ мю Ð¼Ñ Ð½Ð° нб нв нг нд не нж ни нк нл нм нн нп нр Ð½Ñ Ð½Ñ‚ ну нф нх нц нш нщ ню Ð½Ñ Ð¿Ð° пб пв пг пд пе пж пи пк пл пм пн пп пр Ð¿Ñ Ð¿Ñ‚ пу пф пх пц пш пщ пю Ð¿Ñ Ñ€Ð° рб рв рг рд ре рж ри рк рл рм рн рп рр Ñ€Ñ Ñ€Ñ‚ ру рф рх рц рш рщ рю Ñ€Ñ Ñа Ñб Ñв Ñг Ñд Ñе Ñж Ñи Ñк Ñл Ñм Ñн Ñп ÑÑ€ ÑÑ ÑÑ‚ Ñу ÑÑ„ ÑÑ… Ñц Ñш Ñщ ÑÑŽ ÑÑ Ñ‚Ð° тб тв тг тд те тж ти тк тл тм тн тп Ñ‚Ñ€ Ñ‚Ñ Ñ‚Ñ‚ ту Ñ‚Ñ„ Ñ‚Ñ… тц тш тщ Ñ‚ÑŽ Ñ‚Ñ ÑƒÐ° уб ув уг уд уе уж уи ук ул ум ун уп ур ÑƒÑ ÑƒÑ‚ уу уф ух уц уш ущ ую ÑƒÑ Ñ„Ð° фб фв фг фд фе фж фи фк фл фм фн фп Ñ„Ñ€ Ñ„Ñ Ñ„Ñ‚ фу Ñ„Ñ„ Ñ„Ñ… фц фш фщ Ñ„ÑŽ Ñ„Ñ Ñ…Ð° хб хв хг хд хе хж хи хк хл хм хн хп Ñ…Ñ€ Ñ…Ñ Ñ…Ñ‚ ху Ñ…Ñ„ Ñ…Ñ… хц хш хщ Ñ…ÑŽ Ñ…Ñ Ñ†Ð° цб цв цг цд це цж ци цк цл цм цн цп цр Ñ†Ñ Ñ†Ñ‚ цу цф цх цц цш цщ цю Ñ†Ñ ÑˆÐ° шб шв шг шд ше шж ши шк шл шм шн шп шр ÑˆÑ ÑˆÑ‚ шу шф шх шц шш шщ шю ÑˆÑ Ñ‰Ð° щб щв щг щд ще щж щи щк щл щм щн щп щр Ñ‰Ñ Ñ‰Ñ‚ щу щф щх щц щш щщ щю Ñ‰Ñ ÑŽÐ° юб юв юг юд юе юж юи юк юл юм юн юп ÑŽÑ€ ÑŽÑ ÑŽÑ‚ юу ÑŽÑ„ ÑŽÑ… юц юш ющ ÑŽÑŽ ÑŽÑ Ñа Ñб Ñв Ñг Ñд Ñе Ñж Ñи Ñк Ñл Ñм Ñн Ñп ÑÑ€ ÑÑ ÑÑ‚ Ñу ÑÑ„ ÑÑ… Ñц Ñш Ñщ ÑÑŽ ÑÑ',
'cite_references_link_many_sep' => '&#32;',
'cite_references_link_many_and' => '&#32;',
+ 'cite_references_link_accessibility_label' => 'Вгору',
+ 'cite_references_link_many_accessibility_label' => 'Перейти до:',
);
/** vèneto (vèneto)
@@ -4071,11 +3725,6 @@ $messages['uk'] = array(
*/
$messages['vec'] = array(
'cite-desc' => 'Zonta i tag <nowiki><ref[ name=id]></nowiki> e <nowiki><references/></nowiki> par gestir le citazion',
- 'cite_croak' => 'Eror ne la citazion: $1: $2',
- 'cite_error_key_str_invalid' => 'Eror interno: $str e/o $key sbaglià. Sta roba qua no la dovarìa mai capitar.',
- 'cite_error_stack_invalid_input' => 'Eror interno;
-ciave de stack sbaglià.
-Sta roba no la dovarìa mai capitar.',
'cite_error' => 'Eror ne la funsion Cite $1',
'cite_error_ref_numeric_key' => "Eror ne l'uso del marcator <code>&lt;ref&gt;</code>: el nome no'l pode mìa èssar un nùmaro intiero. Dòpara un titolo esteso",
'cite_error_ref_no_key' => "Eror ne l'uso del marcator <code>&lt;ref&gt;</code>: i ref vodi no i pol no verghe un nome",
@@ -4090,7 +3739,7 @@ Dòpara <code>&lt;references /&gt;</code>, o <code>&lt;references group="..." /&
'cite_error_references_no_text' => 'Marcator <code>&lt;ref&gt;</code> mìa valido; no xe stà indicà nissun testo par el marcator <code>$1</code>',
'cite_error_included_ref' => '<code>&lt;/ref&gt;</code> de chiusura mancante par el marcador <code>&lt;ref&gt;</code>',
'cite_error_refs_without_references' => 'Ghe xe un tag <code>&lt;ref&gt;</code>, ma no xe stà catà nissun tag <code>&lt;references/&gt;</code>',
- 'cite_error_group_refs_without_references' => 'Ghe xe un tag <code>&lt;ref&gt;</code> par un grupo che se ciama "$1", ma no xe stà catà nissun tag <code>&lt;references group="$1"/&gt;</code> che corisponda.',
+ 'cite_error_group_refs_without_references' => 'Ghe xe un tag <code>&lt;ref&gt;</code> par un grupo che se ciama "$1", ma no xe stà catà nissun tag <code>&lt;references group="$1"/&gt;</code> che corisponda.', # Fuzzy
'cite_error_references_group_mismatch' => 'El tag <code>&lt;ref&gt;</code> in <code>&lt;references&gt;</code> el gà l\'atributo de grupo "$1" in conflito.',
'cite_error_references_missing_group' => 'El tag <code>&lt;ref&gt;</code> definìo in <code>&lt;references&gt;</code> el gà un atributo de grupo "$1" che no conpare mia nel testo precedente.',
'cite_error_references_missing_key' => 'El tag <code>&lt;ref&gt;</code> con nome "$1" definìo in <code>&lt;references&gt;</code> no\'l xe doparà nel testo precedente.',
@@ -4111,9 +3760,6 @@ $messages['vep'] = array(
*/
$messages['vi'] = array(
'cite-desc' => 'Thêm các thẻ <nowiki><ref[ name=id]></nowiki> và <nowiki><references/></nowiki> để ghi chú thích hoặc nguồn tham khảo',
- 'cite_croak' => 'Chú thích bị há»ng; $1: $2',
- 'cite_error_key_str_invalid' => 'Lá»—i ná»™i bá»™; $str và/hoặc $key không hợp lệ. Äiá»u này không bao giá» nên xảy ra.',
- 'cite_error_stack_invalid_input' => 'Lá»—i ná»™i bá»™; khóa xác định chồng bị sai. Äáng ra không bao giá» xảy ra Ä‘iá»u này.',
'cite_error' => 'Lỗi chú thích: $1',
'cite_error_ref_numeric_key' => 'Thẻ <code>&lt;ref&gt;</code> sai; tên không thể chỉ là số nguyên, hãy dùng tựa đỠcó tính miêu tả',
'cite_error_ref_no_key' => 'Thẻ <code>&lt;ref&gt;</code> sai; thẻ ref không có nội dung thì phải có tên',
@@ -4129,22 +3775,21 @@ Hãy định nghĩa thêm ở thông điệp <nowiki>[[MediaWiki:Cite references
'cite_error_references_no_text' => 'Thẻ <code>&lt;ref&gt;</code> sai; không có nội dung trong thẻ ref có tên <code>$1</code>',
'cite_error_included_ref' => 'Không có <code>&lt;/ref&gt;</code> để đóng thẻ <code>&lt;ref&gt;</code>',
'cite_error_refs_without_references' => 'Tồn tại thẻ <code>&lt;ref&gt;</code>, nhưng không tìm thấy thẻ <code>&lt;references/&gt;</code>',
- 'cite_error_group_refs_without_references' => 'Tồn tại thẻ <code>&lt;ref&gt;</code> vá»›i tên nhóm “$1â€, nhÆ°ng không tìm thấy thẻ <code>&lt;references group="$1"/&gt;</code> tÆ°Æ¡ng ứng',
+ 'cite_error_group_refs_without_references' => 'Äã tìm thấy thẻ <code>&lt;ref&gt;</code> vá»›i tên nhóm “$1â€, nhÆ°ng không tìm thấy thẻ tÆ°Æ¡ng ứng <code>&lt;references group="$1"/&gt;</code> tÆ°Æ¡ng ứng, hoặc thẻ đóng <code>&lt;/ref&gt;</code> bị thiếu',
'cite_error_references_group_mismatch' => 'Thẻ <code>&lt;ref&gt;</code> trong <code>&lt;references&gt;</code> có thuá»™c tính nhóm mâu thuẫn “$1â€.',
'cite_error_references_missing_group' => 'Thẻ <code>&lt;ref&gt;</code> được định nghĩa trong <code>&lt;references&gt;</code> có thuộc tính nhóm “$1†không thấy xuất hiện trong văn bản phía trên.',
'cite_error_references_missing_key' => 'Thẻ <code>&lt;ref&gt;</code> có tên “$1†được định nghĩa trong <code>&lt;references&gt;</code> không được đoạn văn bản trên sử dụng.',
'cite_error_references_no_key' => ' Thẻ <code>&lt;ref&gt;</code> được định nghĩa trong <code>&lt;references&gt;</code> không có thuộc tính name.',
'cite_error_empty_references_define' => 'Thẻ <code>&lt;ref&gt;</code> được định nghĩa trong <code>&lt;references&gt;</code> có tên “$1†không có nội dung.',
'cite_references_link_many_format_backlink_labels' => '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 aa ab ac ad ae af ag ah ai aj ak al am an ao ap aq ar as at au av aw ax ay az ba bb bc bd be bf bg bh bi bj bk bl bm bn bo bp bq br bs bt bu bv bw bx by bz ca cb cc cd ce cf cg ch ci cj ck cl cm cn co cp cq cr cs ct cu cv cw cx cy cz da db dc dd de df dg dh di dj dk dl dm dn do dp dq dr ds dt du dv dw dx dy dz ea eb ec ed ee ef eg eh ei ej ek el em en eo ep eq er es et eu ev ew ex ey ez fa fb fc fd fe ff fg fh fi fj fk fl fm fn fo fp fq fr fs ft fu fv fw fx fy fz ga gb gc gd ge gf gg gh gi gj gk gl gm gn go gp gq gr gs gt gu gv gw gx gy gz ha hb hc hd he hf hg hh hi hj hk hl hm hn ho hp hq hr hs ht hu hv hw hx hy hz ia ib ic id ie if ig ih ii ij ik il im in io ip iq ir is it iu iv iw ix iy iz ja jb jc jd je jf jg jh ji jj jk jl jm jn jo jp jq jr js jt ju jv jw jx jy jz ka kb kc kd ke kf kg kh ki kj kk kl km kn ko kp kq kr ks kt ku kv kw kx ky kz la lb lc ld le lf lg lh li lj lk ll lm ln lo lp lq lr ls lt lu lv lw lx ly lz ma mb mc md me mf mg mh mi mj mk ml mm mn mo mp mq mr ms mt mu mv mw mx my mz na nb nc nd ne nf ng nh ni nj nk nl nm nn no np nq nr ns nt nu nv nw nx ny nz oa ob oc od oe of og oh oi oj ok ol om on oo op oq or os ot ou ov ow ox oy oz pa pb pc pd pe pf pg ph pi pj pk pl pm pn po pp pq pr ps pt pu pv pw px py pz qa qb qc qd qe qf qg qh qi qj qk ql qm qn qo qp qq qr qs qt qu qv qw qx qy qz ra rb rc rd re rf rg rh ri rj rk rl rm rn ro rp rq rr rs rt ru rv rw rx ry rz sa sb sc sd se sf sg sh si sj sk sl sm sn so sp sq sr ss st su sv sw sx sy sz ta tb tc td te tf tg th ti tj tk tl tm tn to tp tq tr ts tt tu tv tw tx ty tz ua ub uc ud ue uf ug uh ui uj uk ul um un uo up uq ur us ut uu uv uw ux uy uz va vb vc vd ve vf vg vh vi vj vk vl vm vn vo vp vq vr vs vt vu vv vw vx vy vz wa wb wc wd we wf wg wh wi wj wk wl wm wn wo wp wq wr ws wt wu wv ww wx wy wz xa xb xc xd xe xf xg xh xi xj xk xl xm xn xo xp xq xr xs xt xu xv xw xx xy xz ya yb yc yd ye yf yg yh yi yj yk yl ym yn yo yp yq yr ys yt yu yv yw yx yy yz za zb zc zd ze zf zg zh zi zj zk zl zm zn zo zp zq zr zs zt zu zv zw zx zy zz',
+ 'cite_references_link_accessibility_label' => 'Nhảy lên',
+ 'cite_references_link_many_accessibility_label' => 'Nhảy lên tới:',
);
/** Volapük (Volapük)
* @author Smeira
*/
$messages['vo'] = array(
- 'cite_croak' => 'Saitot dädik; $1: $2',
- 'cite_error_key_str_invalid' => 'Pöl ninik: $str e/u $key no lonöföl(s). Atos no sötonöv jenön.',
- 'cite_error_stack_invalid_input' => 'Pöl ninik; kumakik no lonöföl. Atos neai sötonöv jenön.',
'cite_error' => 'Saitamapöl: $1',
'cite_error_ref_numeric_key' => 'Nem ela <code>&lt;ref&gt;</code> no lonöföl. Nem no kanon binädön te me numats; gebolös bepenami.',
'cite_error_ref_no_key' => 'Geb no lonöföl ela <code>&lt;ref&gt;</code>: els ref nen ninäd mutons labön nemi',
@@ -4159,13 +3804,6 @@ $messages['vo'] = array(
*/
$messages['yi'] = array(
'cite-desc' => 'לייגט צו <nowiki><ref[ name=id]></nowiki> ×ון <nowiki><references/></nowiki> ט×ַגן, פֿ×ר ציטירונגען (×ין הערות)',
- 'cite_croak' => 'טעות ×ין ציטירונג; $1: $2',
- 'cite_error_key_str_invalid' => '×ינערלעכער גרייז;
-×ומגילטיקער $str ×ון/×דער $key.
-ד×ס ×–×ל נישט פ×סירן.',
- 'cite_error_stack_invalid_input' => '×ינערלעכער גרייז;
-×ומגילטיקער סט×ַק.
-ד×ס ד×רף קיינמ×ל נישט פ×סירן.',
'cite_error' => 'ציטירן גרײַז: $1',
'cite_error_ref_numeric_key' => 'גרײַזיגער <code>&lt;ref&gt;</code> ט×Ö·×’;
× ×מען ט×ר נישט זײַן קיין פשוטער נומער. ניצט × ×‘×שרײַבדיק קעפל',
@@ -4177,11 +3815,14 @@ $messages['yi'] = array(
× ×¨×¢×¤Ö¿×¢×¨×¢× ×¥ ×ָן × × ×מען ד×רף ×”×בן תוכן',
'cite_error_references_invalid_parameters' => '×ומגילטיגער <code>&lt;references&gt;</code> ט×Ö·×’;
קיין פ×ר×מעטערס נישט ערלויבט. ניצט <code>&lt;references /&gt;</code>',
+ 'cite_error_references_invalid_parameters_group' => '×ומגילטיקער <code>&lt;references&gt;</code> ט××’;
+× ×ר דער פ×ר×מעטער "group" ××™×– ערלויבט.
+ניצט <code>&lt;references /&gt;</code>, ×דער <code>&lt;references group="..." /&gt;</code>',
'cite_error_references_no_text' => '×ומגילטיגער <code>&lt;ref&gt;</code> ט×Ö·×’;
קיין טעקסט נישט געשריבן פֿ×ַר רעפֿערענצן מיטן × ×ָמען <code>$1</code>',
'cite_error_included_ref' => 'פֿעלט × ×©×œ×™×¡× ×“×™×’×¢×¨ <code>&lt;/ref&gt;</code> פֿ×ַר <code>&lt;ref&gt;</code> ט×Ö·×’',
- 'cite_error_refs_without_references' => "ס'זענען ×“× <code>&lt;ref&gt;</code> ט×ַגן, ×בער מ'×”×ט נישט געטר×פֿן קיין <code>&lt;references/&gt;</code> ט×Ö·×’.",
- 'cite_error_group_refs_without_references' => 'ס\'זענען ×“× <code>&lt;ref&gt;</code> ט×ַגן פֿ×ַר × ×’×¨×•×¤×¢ וו×ס הייסט "$1", ×בער מ\'×”×ט נישט געטר×פֿן קיין ×Ö·× ×˜×§×¢×’×¢× ×¢× <code>&lt;references group="$1"/&gt;</code> ט×Ö·×’.',
+ 'cite_error_refs_without_references' => "ס'זענען ×“× <code>&lt;ref&gt;</code> ט×ַגן, ×בער מ'×”×ט נישט געטר×פֿן קיין <code>&#123;&#123;רעפליסטע&#125;&#125;</code> מוסטער ×ון נישט קיין <code>&lt;references/&gt;</code> ט×Ö·×’.",
+ 'cite_error_group_refs_without_references' => 'ס\'זענען ×“× <code>&lt;ref&gt;</code> ט×ַגן פֿ×ַר × ×’×¨×•×¤×¢ וו×ס הייסט "$1", ×בער מ\'×”×ט נישט געטר×פֿן קיין ×Ö·× ×˜×§×¢×’×¢× ×¢× <code>&lt;references group="$1"/&gt;</code> ט×Ö·×’, ×דער × ×©×œ×™×¡× ×“×™×§×¢×¨ <code>&lt;/ref&gt;</code> פֿעלט.',
'cite_error_references_group_mismatch' => 'דער <code>&lt;ref&gt;</code> ט××’ ×ין <code>&lt;references&gt;</code> ×”×ט × ×’×¨×•×¤×¢ ×ייגנקייט וו×ס ××™×– סותר "$1".',
'cite_error_references_missing_group' => 'דער <code>&lt;ref&gt;</code> ט××’ דעפינעירט ×ין <code>&lt;references&gt;</code> ×”×ט גרופע ×ייגנקייט "$1" וו×ס ב×ווייזט זיך נישט ×ין פריערדיקן טעקסט.',
'cite_error_references_missing_key' => '<code>&lt;ref&gt;</code> ט×Ö·×’ מיטן × ×ָמען "$1" דעפֿינירט ×ין<code>&lt;references&gt;</code> נישט געניצט ×ין פֿריערדיקן טעקסט.',
@@ -4193,9 +3834,6 @@ $messages['yi'] = array(
*/
$messages['yue'] = array(
'cite-desc' => '加 <nowiki><ref[ name=id]></nowiki> åŒ <nowiki><references/></nowiki> 標籤用響引用度',
- 'cite_croak' => '引用阻塞咗; $1: $2',
- 'cite_error_key_str_invalid' => '內部錯誤; 無效嘅 $str', # Fuzzy
- 'cite_error_stack_invalid_input' => '內部錯誤; 無效嘅堆疊匙',
'cite_error' => '引用錯誤 $1',
'cite_error_ref_numeric_key' => '無效嘅呼å«; 需è¦ä¸€å€‹éžæ•´æ•¸å˜…匙',
'cite_error_ref_no_key' => '無效嘅呼å«; 未指定匙',
@@ -4215,13 +3853,12 @@ $messages['yue'] = array(
* @author Liangent
* @author PhiLiP
* @author Philip
+ * @author TianyinLee
+ * @author Zhuyifei1999
* @author 乌拉跨氪
*/
$messages['zh-hans'] = array(
'cite-desc' => '增加用于引用的<nowiki><ref[ name=id]></nowiki>和<nowiki><references/></nowiki>标签',
- 'cite_croak' => '引用失效;$1:$2',
- 'cite_error_key_str_invalid' => '内部错误;ä¸åº”出现的éžæ³•$strå’Œï¼æˆ–$key。',
- 'cite_error_stack_invalid_input' => '内部错误;ä¸åº”出现的éžæ³•å †æ ˆé”®å€¼ã€‚',
'cite_error' => '引用错误:$1',
'cite_error_ref_numeric_key' => '无效<code>&lt;ref&gt;</code>标签;name属性ä¸èƒ½æ˜¯å•ä¸€çš„数字,请使用å¯è¾¨è¯†çš„标题',
'cite_error_ref_no_key' => '无效<code>&lt;ref&gt;</code>标签;未填内容的引用必须填写name属性',
@@ -4234,25 +3871,25 @@ $messages['zh-hans'] = array(
'cite_error_references_no_text' => '无效<code>&lt;ref&gt;</code>标签;未给name属性为<code>$1</code>的引用æ供文字',
'cite_error_included_ref' => '没有找到与<code>&lt;/ref&gt;</code>对应的<code>&lt;ref&gt;</code>标签',
'cite_error_refs_without_references' => '<code>&lt;ref&gt;</code>标签存在,但没有找到<code>&lt;references/&gt;</code>标签',
- 'cite_error_group_refs_without_references' => '组å为“$1â€çš„<code>&lt;ref&gt;</code>标签存在,但没有找到相应的<code>&lt;references group="$1"/&gt;</code>标签',
+ 'cite_error_group_refs_without_references' => '组å为“$1â€çš„<code>&lt;ref&gt;</code>标签存在,但没有找到相应的<code>&lt;references group="$1"/&gt;</code>标签,或结尾的<code>&lt;/ref&gt;</code>标签丢失',
'cite_error_references_group_mismatch' => '<code>&lt;references&gt;</code>çš„<code>&lt;ref&gt;</code>标记带有冲çªçš„组(group)属性“$1â€ã€‚',
'cite_error_references_missing_group' => '<code>&lt;references&gt;</code>中定义的<code>&lt;ref&gt;</code>标记带有未在å‰æ–‡ä¸­å‡ºçŽ°çš„组(group)属性“$1â€ã€‚',
'cite_error_references_missing_key' => '在<code>&lt;references&gt;</code>中以“$1â€å字定义的<code>&lt;ref&gt;</code>标签没有在先å‰çš„文字中使用。',
'cite_error_references_no_key' => '<code>&lt;references&gt;</code>中定义的<code>&lt;ref&gt;</code>没有给出å称(name)属性。',
'cite_error_empty_references_define' => '<code>&lt;references&gt;</code>中定义的<code>&lt;ref&gt;</code>çš„å称(name)“$1â€ä¸ºç©ºã€‚',
+ 'cite_references_link_accessibility_label' => '跳转',
+ 'cite_references_link_many_accessibility_label' => '跳转到:',
);
/** Traditional Chinese (中文(ç¹é«”)‎)
* @author Liangent
+ * @author Liuxinyu970226
* @author Mark85296341
* @author Philip
* @author 乌拉跨氪
*/
$messages['zh-hant'] = array(
'cite-desc' => '增加用於引用的<nowiki><ref[ name=id]></nowiki>和<nowiki><references/></nowiki>標籤',
- 'cite_croak' => '引用失效;$1:$2',
- 'cite_error_key_str_invalid' => '內部錯誤;ä¸æ‡‰å‡ºç¾çš„éžæ³•$strå’Œï¼æˆ–$key。',
- 'cite_error_stack_invalid_input' => '內部錯誤;ä¸æ‡‰å‡ºç¾çš„éžæ³•å †ç–Šéµå€¼ã€‚',
'cite_error' => '引用錯誤:$1',
'cite_error_ref_numeric_key' => '無效<code>&lt;ref&gt;</code>標籤;name屬性ä¸èƒ½æ˜¯å–®ä¸€çš„數字,請使用å¯è¾¨è­˜çš„標題',
'cite_error_ref_no_key' => '無效<code>&lt;ref&gt;</code>標籤;未填內容的引用必須填寫name屬性',
@@ -4265,10 +3902,12 @@ $messages['zh-hant'] = array(
'cite_error_references_no_text' => '無效<code>&lt;ref&gt;</code>標籤;未給name屬性為<code>$1</code>的引用æ供文字',
'cite_error_included_ref' => '沒有找到與<code>&lt;/ref&gt;</code>å°æ‡‰çš„<code>&lt;ref&gt;</code>標籤',
'cite_error_refs_without_references' => '<code>&lt;ref&gt;</code>標籤存在,但沒有找到<code>&lt;references/&gt;</code>標籤',
- 'cite_error_group_refs_without_references' => '組å為「$1ã€çš„<code>&lt;ref&gt;</code>標籤存在,但沒有找到相應的<code>&lt;references group="$1"/&gt;</code>標籤',
+ 'cite_error_group_refs_without_references' => '<code>&lt;ref&gt;</code>標籤命å之一「$1ã€å·²å­˜åœ¨ï¼Œä½†æœªèƒ½æ‰¾åˆ°å°æ‡‰æ¨™ç±¤<code>&lt;references group="$1"/&gt;</code>,或者關閉<code>&lt;/ref&gt;</code>後丟失',
'cite_error_references_group_mismatch' => '<code>&lt;references&gt;</code>çš„<code>&lt;ref&gt;</code>標記帶有è¡çªçš„群組(group)屬性「$1ã€ã€‚',
'cite_error_references_missing_group' => '<code>&lt;references&gt;</code>中定義的<code>&lt;ref&gt;</code>標記帶有未在å‰æ–‡ä¸­å‡ºç¾çš„群組(group)屬性「$1ã€ã€‚',
'cite_error_references_missing_key' => '在<code>&lt;references&gt;</code>中以“$1â€å字定義的<code>&lt;ref&gt;</code>標籤沒有在先å‰çš„文字中使用。',
'cite_error_references_no_key' => '<code>&lt;references&gt;</code>中定義的<code>&lt;ref&gt;</code>沒有給出å稱(name)屬性。',
'cite_error_empty_references_define' => '<code>&lt;references&gt;</code>中定義的<code>&lt;ref&gt;</code>çš„å稱(name)「$1ã€ç‚ºç©ºã€‚',
+ 'cite_references_link_accessibility_label' => '跳轉',
+ 'cite_references_link_many_accessibility_label' => '跳轉至:',
);
diff --git a/extensions/Cite/Cite.php b/extensions/Cite/Cite.php
index 0f957659..045bb8cc 100644
--- a/extensions/Cite/Cite.php
+++ b/extensions/Cite/Cite.php
@@ -18,20 +18,17 @@ if ( ! defined( 'MEDIAWIKI' ) )
*/
$wgHooks['ParserFirstCallInit'][] = 'wfCite';
-$wgHooks['BeforePageDisplay'][] = 'wfCiteBeforePageDisplay';
-
$wgExtensionCredits['parserhook'][] = array(
'path' => __FILE__,
'name' => 'Cite',
- 'author' => 'Ævar Arnfjörð Bjarmason',
+ 'author' => array( 'Ævar Arnfjörð Bjarmason', 'Marius Hoch' ),
'descriptionmsg' => 'cite-desc',
'url' => 'https://www.mediawiki.org/wiki/Extension:Cite/Cite.php'
);
-$wgParserTestFiles[] = dirname( __FILE__ ) . "/citeParserTests.txt";
-$wgParserTestFiles[] = dirname( __FILE__ ) . "/citeCatTreeParserTests.txt";
-$wgExtensionMessagesFiles['Cite'] = dirname( __FILE__ ) . "/Cite.i18n.php";
-$wgAutoloadClasses['Cite'] = dirname( __FILE__ ) . "/Cite_body.php";
+$wgParserTestFiles[] = __DIR__ . "/citeParserTests.txt";
+$wgExtensionMessagesFiles['Cite'] = __DIR__ . "/Cite.i18n.php";
+$wgAutoloadClasses['Cite'] = __DIR__ . "/Cite_body.php";
$wgSpecialPageGroups['Cite'] = 'pagetools';
define( 'CITE_DEFAULT_GROUP', '' );
@@ -66,13 +63,21 @@ function wfCite( $parser ) {
// Resources
$citeResourceTemplate = array(
- 'localBasePath' => dirname(__FILE__) . '/modules',
+ 'localBasePath' => __DIR__ . '/modules',
'remoteExtPath' => 'Cite/modules'
);
$wgResourceModules['ext.cite'] = $citeResourceTemplate + array(
- 'styles' => array(),
- 'scripts' => 'ext.cite/ext.cite.js',
+ 'scripts' => 'ext.cite.js',
+ 'styles' => 'ext.cite.css',
+ 'messages' => array(
+ 'cite_references_link_accessibility_label',
+ 'cite_references_link_many_accessibility_label',
+ ),
+);
+
+$wgResourceModules['ext.cite.popups'] = $citeResourceTemplate + array(
+ 'scripts' => 'ext.cite.popups.js',
'position' => 'bottom',
'dependencies' => array(
'jquery.tooltip',
@@ -87,25 +92,8 @@ $wgResourceModules['jquery.tooltip'] = $citeResourceTemplate + array(
/* Add RTL fix for the cite <sup> elements */
$wgResourceModules['ext.rtlcite'] = $citeResourceTemplate + array(
- 'styles' => 'ext.rtlcite/ext.rtlcite.css',
+ 'styles' => 'ext.rtlcite.css',
'position' => 'top',
);
-/**
- * @param $out OutputPage
- * @param $sk Skin
- * @return bool
- */
-function wfCiteBeforePageDisplay( $out, &$sk ) {
- global $wgCiteEnablePopups;
-
- if ( $wgCiteEnablePopups ) {
- $out->addModules( 'ext.cite' );
- }
-
- /* RTL support quick-fix module */
- $out->addModuleStyles( 'ext.rtlcite' );
- return true;
-}
-
/**#@-*/
diff --git a/extensions/Cite/Cite_body.php b/extensions/Cite/Cite_body.php
index 488bacbb..08c60722 100644
--- a/extensions/Cite/Cite_body.php
+++ b/extensions/Cite/Cite_body.php
@@ -155,6 +155,7 @@ class Cite {
* @return string
*/
function ref( $str, $argv, $parser ) {
+ global $wgCiteEnablePopups;
if ( $this->mInCite ) {
return htmlspecialchars( "<ref>$str</ref>" );
} else {
@@ -162,6 +163,12 @@ class Cite {
$this->mInCite = true;
$ret = $this->guardedRef( $str, $argv, $parser );
$this->mInCite = false;
+ $parserOutput = $parser->getOutput();
+ $parserOutput->addModules( 'ext.cite' );
+ if ( $wgCiteEnablePopups ) {
+ $parserOutput->addModules( 'ext.cite.popups' );
+ }
+ $parserOutput->addModuleStyles( 'ext.rtlcite' );
return $ret;
}
}
@@ -289,7 +296,7 @@ class Cite {
# Not clear how we could get here, but something is probably
# wrong with the types. Let's fail fast.
- $this->croak( 'cite_error_key_str_invalid', serialize( "$str; $key" ) );
+ throw new MWException( 'Invalid $str and/or $key: ' . serialize( array( $str, $key ) ) );
}
/**
@@ -443,7 +450,7 @@ class Cite {
);
}
} else {
- $this->croak( 'cite_error_stack_invalid_input', serialize( array( $key, $str ) ) );
+ throw new MWException( 'Invalid stack key: ' . serialize( $key ) );
}
}
@@ -1172,8 +1179,8 @@ class Cite {
# We rely on the fact that PHP is okay with passing unused argu-
# ments to functions. If $1 is not used in the message, wfMessage will
# just ignore the extra parameter.
- $ret = '<strong class="error">' .
- wfMessage( 'cite_error', wfMessage( $key, $param )->plain() )->plain() .
+ $ret = '<strong class="error mw-ext-cite-error">' .
+ wfMessage( 'cite_error', wfMessage( $key, $param )->inContentLanguage()->plain() )->inContentLanguage()->plain() .
'</strong>';
if ( $parse == 'parse' ) {
$ret = $this->parse( $ret );
@@ -1181,17 +1188,5 @@ class Cite {
return $ret;
}
- /**
- * Die with a backtrace if something happens in the code which
- * shouldn't have
- *
- * @param int $error ID for the error
- * @param string $data Serialized error data
- */
- function croak( $error, $data ) {
- wfDebugDieBacktrace( wfMessage( 'cite_croak', $this->error( $error ), $data )
- ->inContentLanguage()->text() );
- }
-
/**#@-*/
}
diff --git a/extensions/Cite/SpecialCite.alias.php b/extensions/Cite/SpecialCite.alias.php
index 6b64b1d0..cbcdafbb 100644
--- a/extensions/Cite/SpecialCite.alias.php
+++ b/extensions/Cite/SpecialCite.alias.php
@@ -5,6 +5,7 @@
* @file
* @ingroup Extensions
*/
+// @codingStandardsIgnoreFile
$specialPageAliases = array();
@@ -63,7 +64,17 @@ $specialPageAliases['ca'] = array(
'Cite' => array( 'Citau', 'Citeu' ),
);
-/** Czech (Äesky) */
+/** Min Dong Chinese (Mìng-dĕ̤ng-ngṳ̄) */
+$specialPageAliases['cdo'] = array(
+ 'Cite' => array( '註' ),
+);
+
+/** Chechen (нохчийн) */
+$specialPageAliases['ce'] = array(
+ 'Cite' => array( 'Дош' ),
+);
+
+/** Czech (ÄeÅ¡tina) */
$specialPageAliases['cs'] = array(
'Cite' => array( 'Citovat' ),
);
diff --git a/extensions/Cite/SpecialCite.i18n.php b/extensions/Cite/SpecialCite.i18n.php
index 7f847613..013fbe63 100644
--- a/extensions/Cite/SpecialCite.i18n.php
+++ b/extensions/Cite/SpecialCite.i18n.php
@@ -82,6 +82,7 @@ When using the [[LaTeX]] package url (<code>\usepackage{url}</code> somewhere in
* @author Jon Harald Søby
* @author Lloffiwr
* @author Shirayuki
+ * @author Siddhartha Ghai
* @author Siebrand
* @author Tgr
* @author Umherirrender
@@ -110,6 +111,13 @@ See also:
'cite-summary' => '{{notranslate}}',
'cite_page' => '{{Identical|Page}}',
'cite_submit' => '{{Identical|Cite}}',
+ 'cite_text' => 'Refers to {{msg-mw|Sitesubtitle}}.
+
+* This message is the entire text for the page Special:Cite
+* Any wikilinks in this message point to pages on the wiki, so they may be translated.
+* Do not translate magic words like CURRENTYEAR, SITENAME etc.
+* Do not translate the parameter names (author, title etc.) for BibTeX entries.
+* Do not translate the div class plainlinks mw-specialcite-styles.',
);
/** Achinese (Acèh)
@@ -382,7 +390,7 @@ $messages['arz'] = array(
</div> <!--closing div for \"plainlinks\"-->", # Fuzzy
);
-/** Assamese (অসমীয়া)
+/** Assamese (অসমীয়া)
* @author Bishnu Saikia
* @author Gitartha.bordoloi
*/
@@ -653,12 +661,61 @@ $messages['bcc'] = array(
/** Bikol Central (Bikol Central)
* @author Filipinayzd
+ * @author Geopoet
*/
$messages['bcl'] = array(
- 'cite_article_link' => 'Sambiton an artikulong ini', # Fuzzy
+ 'cite_article_desc' => 'Nagdudugang nin sarong [[Special:Cite|citation]] espesyal na pahina asin kasugpunan sa palindông kahon',
+ 'cite_article_link' => 'Isambit ining pahina',
+ 'tooltip-cite-article' => 'Impormasyon kun paanuhon na sambiton ining pahina',
'cite' => 'Sambiton',
'cite_page' => 'Pahina:',
'cite_submit' => 'Sambiton',
+ 'cite_text' => "__NOTOC__
+<div class=\"mw-specialcite-bibliographic\">
+
+== Bibliograpikong mga detalye para sa {{FULLPAGENAME}} ==
+* Pangaran kan pahina: {{FULLPAGENAME}}
+* Awtor: {{SITENAME}} mga paraambag
+* Publikador: ''{{SITENAME}}, {{int:sitesubtitle}}''.
+* Petsa kan huring pagliwat: {{CURRENTDAY}} {{CURRENTMONTHNAME}} {{CURRENTYEAR}} {{CURRENTTIME}} UTC
+* Petsa kan pagbawi: <citation>{{CURRENTDAY}} {{CURRENTMONTHNAME}} {{CURRENTYEAR}} {{CURRENTTIME}} UTC</citation>
+* Permanenteng URL: {{canonicalurl:{{FULLPAGENAME}}|oldid={{REVISIONID}}}}
+* ID kan Bersyon kan Pahina: {{REVISIONID}}
+
+</div>
+<div class=\"plainlinks mw-specialcite-styles\">
+
+== Pagsambit na mga istilo para sa {{FULLPAGENAME}} ==
+
+=== [[Istilong APA]] ===
+
+{{FULLPAGENAME}}. ({{CURRENTYEAR}}, {{CURRENTMONTHNAME}} {{CURRENTDAY}}). ''{{SITENAME}}, {{int:sitesubtitle}}''. Pinagbawi <citation>{{CURRENTTIME}}, {{CURRENTMONTHNAME}} {{CURRENTDAY}}, {{CURRENTYEAR}}</citation> gikan sa {{canonicalurl:{{FULLPAGENAME}}|oldid={{REVISIONID}}}}.
+
+=== [[An MLA Manwal na Istilo|Istilong MLA]] === \"{{FULLPAGENAME}}.\" ''{{SITENAME}}, {{int:sitesubtitle}}''. {{CURRENTDAY}} {{CURRENTMONTHABBREV}} {{CURRENTYEAR}}, {{CURRENTTIME}} UTC. <citation>{{CURRENTDAY}} {{CURRENTMONTHABBREV}} {{CURRENTYEAR}}, {{CURRENTTIME}}</citation> &lt;{{canonicalurl:{{FULLPAGENAME}}|oldid={{REVISIONID}}}}&gt;.
+
+=== [[MHRA Giya sa Istilo|Istilo sa MHRA]] ===
+{{SITENAME}} mga paraambag, '{{FULLPAGENAME}}', ''{{SITENAME}}, {{int:sitesubtitle}},'' {{CURRENTDAY}} {{CURRENTMONTHNAME}} {{CURRENTYEAR}}, {{CURRENTTIME}} UTC, &lt;{{canonicalurl:{{FULLPAGENAME}}|oldid={{REVISIONID}}}}&gt; [accessed <citation>{{CURRENTDAY}} {{CURRENTMONTHNAME}} {{CURRENTYEAR}}</citation>]
+
+=== [[An Chicago Manwal na Istilo|Istilo sa Chicago]] ===
+{{SITENAME}} mga paraambag, \"{{FULLPAGENAME}},\" ''{{SITENAME}}, {{int:sitesubtitle}},'' {{canonicalurl:{{FULLPAGENAME}}|oldid={{REVISIONID}}}} (accessed <citation>{{CURRENTMONTHNAME}} {{CURRENTDAY}}, {{CURRENTYEAR}}</citation>).
+
+=== [[Konseho kan mga Paraliwat sa Siyensiya|CBE/CSE style]] ===
+{{SITENAME}} mga paraambag. {{FULLPAGENAME}} [Internet]. {{SITENAME}}, {{int:sitesubtitle}}; {{CURRENTYEAR}} {{CURRENTMONTHABBREV}} {{CURRENTDAY}}, {{CURRENTTIME}} UTC [cited <citation>{{CURRENTYEAR}} {{CURRENTMONTHABBREV}} {{CURRENTDAY}}</citation>]. Yaon gikan sa : {{canonicalurl:{{FULLPAGENAME}}|oldid={{REVISIONID}}}}.
+
+=== [[Librong Asul|Istilo sa Librong Asul]] ===
+{{FULLPAGENAME}}, {{canonicalurl:{{FULLPAGENAME}}|oldid={{REVISIONID}}}} (last visited <citation>{{CURRENTMONTHNAME}} {{CURRENTDAY}}, {{CURRENTYEAR}}</citation>).
+
+=== [[BibTeX]] entrada ===
+
+@misc{ wiki:xxx, awtor = \"{{SITENAME}}\", titulo = \"{{FULLPAGENAME}} --- {{SITENAME}}{,} {{int:sitesubtitle}}\", taon = \"{{CURRENTYEAR}}\", url = \"{{canonicalurl:{{FULLPAGENAME}}|oldid={{REVISIONID}}}}\", tandai = \"[Online; accessed <citation>{{CURRENTDAY}}-{{CURRENTMONTHNAME}}-{{CURRENTYEAR}}</citation>]\" }
+
+Kunsoarin na ginagamit an [[Latex]] pampaketeng url (<code>\\usepackage{url}</code> yason sa parte kan prayambulo) na tantong minatao nin mas marhayon na kadagdagan sa pormat kan mga estada sa web, an minasunod mapupuwedeng pagpipilian:
+
+@misc{ wiki:xxx,
+awtor = \"{{SITENAME}}\", titulo = \"{{FULLPAGENAME}} --- {{SITENAME}}{,} {{int:sitesubtitle}}\", taon = \"{{CURRENTYEAR}}\", url = \"'''\\url{'''{{canonicalurl:{{FULLPAGENAME}}|oldid={{REVISIONID}}}}'''}'''\", tandaan = \"[Online; accessed <citation>{{CURRENTDAY}}-{{CURRENTMONTHNAME}}-{{CURRENTYEAR}}</citation>]\"
+}
+
+</div> <!--closing div for \"plainlinks\"-->",
);
/** Belarusian (беларуÑкаÑ)
@@ -943,12 +1000,13 @@ Si empreu el paquet url per a [[LaTeX]] (<code>\\usepackage{url}</code> en algun
);
/** Min Dong Chinese (Mìng-dĕ̤ng-ngṳ̄)
+ * @author Yejianfei
*/
$messages['cdo'] = array(
- 'cite_article_link' => 'Īng-ê̤ṳng cÄ« piÄ•ng ùng-ciÅng',
- 'cite' => 'Īng-ê̤ṳng',
- 'cite_page' => 'Hiĕk-miêng:',
- 'cite_submit' => 'Īng-ê̤ṳng',
+ 'cite_article_link' => '標記茲蜀é ',
+ 'cite' => '標記',
+ 'cite_page' => 'é é¢',
+ 'cite_submit' => '標記',
);
/** Chechen (нохчийн)
@@ -957,7 +1015,10 @@ $messages['cdo'] = array(
*/
$messages['ce'] = array(
'cite_article_link' => 'ÐгӀонах лаьцна дешнаш дало',
+ 'tooltip-cite-article' => 'ХӀара бу хаам агӀонах лаьцна дешнаш муха дало деза гойтуш',
'cite' => 'Далийнадош',
+ 'cite_page' => 'ÐгӀо:',
+ 'cite_submit' => 'Даладе дош',
);
/** Cebuano (Cebuano)
@@ -1087,6 +1148,65 @@ $messages['cy'] = array(
'cite' => 'Cyfeirio at erthygl',
'cite_page' => 'Tudalen:',
'cite_submit' => 'Cyfeirio',
+ 'cite_text' => "__NOTOC__
+<div class=\"mw-specialcite-bibliographic\">
+
+== Manylion am {{FULLPAGENAME}} at ddiben llyfryddiaeth ==
+
+* Enw'r dudalen: {{FULLPAGENAME}}
+* Awdur: {{SITENAME}} contributors
+* Cyhoeddwr: ''{{SITENAME}}, {{int:sitesubtitle}}''.
+* Dyddiad y diwygiad diweddaraf: {{CURRENTDAY}} {{CURRENTMONTHNAME}} {{CURRENTYEAR}} {{CURRENTTIME}} UTC
+* Dyddiad adalw: <citation>{{CURRENTDAY}} {{CURRENTMONTHNAME}} {{CURRENTYEAR}} {{CURRENTTIME}} UTC</citation>
+* Yr URL parhaol: {{canonicalurl:{{FULLPAGENAME}}|oldid={{REVISIONID}}}}
+* ID Diwygiad y Dudalen: {{REVISIONID}}
+
+</div>
+<div class=\"plainlinks mw-specialcite-styles\">
+
+== Arddulliau cyfeirio ar gyfer {{FULLPAGENAME}} ==
+
+=== [[APA Style|Arddull APA]] ===
+{{FULLPAGENAME}}. ({{CURRENTYEAR}}, {{CURRENTMONTHNAME}} {{CURRENTDAY}}). ''{{SITENAME}}, {{int:sitesubtitle}}''. Adalwyd <citation>{{CURRENTTIME}}, {{CURRENTMONTHNAME}} {{CURRENTDAY}}, {{CURRENTYEAR}}</citation> o {{canonicalurl:{{FULLPAGENAME}}|oldid={{REVISIONID}}}}.
+
+=== [[The MLA style manual|Arddull MLA]] ===
+\"{{FULLPAGENAME}}.\" ''{{SITENAME}}, {{int:sitesubtitle}}''. {{CURRENTDAY}} {{CURRENTMONTHABBREV}} {{CURRENTYEAR}}, {{CURRENTTIME}} UTC. <citation>{{CURRENTDAY}} {{CURRENTMONTHABBREV}} {{CURRENTYEAR}}, {{CURRENTTIME}}</citation> &lt;{{canonicalurl:{{FULLPAGENAME}}|oldid={{REVISIONID}}}}&gt;.
+
+=== [[MHRA Style Guide|Arddull MHRA]] ===
+Cyfranwyr i {{SITENAME}}, '{{FULLPAGENAME}}', ''{{SITENAME}}, {{int:sitesubtitle}},'' {{CURRENTDAY}} {{CURRENTMONTHNAME}} {{CURRENTYEAR}}, {{CURRENTTIME}} UTC, &lt;{{canonicalurl:{{FULLPAGENAME}}|oldid={{REVISIONID}}}}&gt; [adalwyd <citation>{{CURRENTDAY}} {{CURRENTMONTHNAME}} {{CURRENTYEAR}}</citation>]
+
+=== [[The Chicago Manual of Style|Arddull Chicago]] ===
+Cyfranwyr i {{SITENAME}}, \"{{FULLPAGENAME}},\" ''{{SITENAME}}, {{int:sitesubtitle}},'' {{canonicalurl:{{FULLPAGENAME}}|oldid={{REVISIONID}}}} (accessed <citation>{{CURRENTMONTHNAME}} {{CURRENTDAY}}, {{CURRENTYEAR}}</citation>).
+
+=== [[Council of Science Editors|Arddull CBE/CSE]] ===
+Cyfranwyr i {{SITENAME}}. {{FULLPAGENAME}} [Internet]. {{SITENAME}}, {{int:sitesubtitle}}; {{CURRENTYEAR}} {{CURRENTMONTHABBREV}} {{CURRENTDAY}}, {{CURRENTTIME}} UTC [cyfeiriwyd ato am <citation>{{CURRENTYEAR}} {{CURRENTMONTHABBREV}} {{CURRENTDAY}}</citation>]. Ar gael o:
+{{canonicalurl:{{FULLPAGENAME}}|oldid={{REVISIONID}}}}.
+
+=== [[Bluebook|Arddull Bluebook]] ===
+{{FULLPAGENAME}}, {{canonicalurl:{{FULLPAGENAME}}|oldid={{REVISIONID}}}} (adalwyd ddiwethaf am <citation>{{CURRENTMONTHNAME}} {{CURRENTDAY}}, {{CURRENTYEAR}}</citation>).
+
+=== Cofnod [[BibTeX]] ===
+
+ @misc{ wiki:xxx,
+ author = \"{{SITENAME}}\",
+ title = \"{{FULLPAGENAME}} --- {{SITENAME}}{,} {{int:sitesubtitle}}\",
+ year = \"{{CURRENTYEAR}}\",
+ url = \"{{canonicalurl:{{FULLPAGENAME}}|oldid={{REVISIONID}}}}\",
+ note = \"[Online; cyrchwyd <citation>{{CURRENTDAY}}-{{CURRENTMONTHNAME}}-{{CURRENTYEAR}}</citation>]\"
+ }
+
+Wrth ddefnyddio url y pecyn [[LaTeX]] (<code>\\usepackage{url}</code> rhywle yn y rhaglith), sydd fel arfer yn dangos cyfeiriadau gwe ar fformat del iawn, gallwch ddefnyddio'r arddull canlynol:
+
+ @misc{ wiki:xxx,
+ author = \"{{SITENAME}}\",
+ title = \"{{FULLPAGENAME}} --- {{SITENAME}}{,} {{int:sitesubtitle}}\",
+ year = \"{{CURRENTYEAR}}\",
+ url = \"'''\\url{'''{{canonicalurl:{{FULLPAGENAME}}|oldid={{REVISIONID}}}}'''}'''\",
+ note = \"[Arlein; cyrchwyd <citation>{{CURRENTDAY}}-{{CURRENTMONTHNAME}}-{{CURRENTYEAR}}</citation>]\"
+ }
+
+
+</div> <!--closing div for \"plainlinks\"-->",
);
/** Danish (dansk)
@@ -1330,9 +1450,10 @@ $messages['ee'] = array(
* @author Consta
* @author Glavkos
* @author Omnipaedista
+ * @author Protnet
*/
$messages['el'] = array(
- 'cite_article_desc' => 'ΠÏοσθέτει μία ειδική σελίδα [[Special:Cite|παÏαθέσεων]] καί έναν σÏνδεσμο Ï€Ïος την εÏγαλειοθήκη',
+ 'cite_article_desc' => 'ΠÏοσθέτει μία ειδική σελίδα [[Special:Cite|παÏαθέσεων]] και έναν σÏνδεσμο Ï€Ïος την εÏγαλειοθήκη',
'cite_article_link' => 'ΠαÏαθέστε αυτή τη σελίδα',
'tooltip-cite-article' => 'ΠληÏοφοÏίες για το πως να παÏαπέμψετε σε αυτήν την σελίδα',
'cite' => 'ΑναφοÏά',
@@ -1767,11 +1888,11 @@ $messages['fr'] = array(
== Détails bibliographiques pour {{FULLPAGENAME}} ==
-* Nom de la page : {{FULLPAGENAME}}
+* Nom de la page : {{FULLPAGENAME}}
* Auteur : contributeurs de {{SITENAME}}
-* Éditeur : ''{{SITENAME}}, {{int:sitesubtitle}}''.
-* Dernière modification : {{CURRENTDAY}} {{CURRENTMONTHNAME}} {{CURRENTYEAR}} {{CURRENTTIME}} UTC
-* Récupéré : <citation>{{CURRENTDAY}} {{CURRENTMONTHNAME}} {{CURRENTYEAR}} {{CURRENTTIME}} UTC</citation>
+* Éditeur : ''{{SITENAME}}, {{int:sitesubtitle}}''.
+* Dernière modification : {{CURRENTDAY}} {{CURRENTMONTHNAME}} {{CURRENTYEAR}} {{CURRENTTIME}} TUC
+* Récupéré : <citation>{{CURRENTDAY}} {{CURRENTMONTHNAME}} {{CURRENTYEAR}} {{CURRENTTIME}} TUC</citation>
* URL permanente : {{canonicalurl:{{FULLPAGENAME}}|oldid={{REVISIONID}}}}
* Identifiant de cette version : {{REVISIONID}}
@@ -1784,20 +1905,19 @@ $messages['fr'] = array(
{{FULLPAGENAME}}. ({{CURRENTYEAR}}, {{CURRENTMONTHNAME}} {{CURRENTDAY}}). ''{{SITENAME}}, {{int:sitesubtitle}}''. Retrieved <citation>{{CURRENTTIME}}, {{CURRENTMONTHNAME}} {{CURRENTDAY}}, {{CURRENTYEAR}}</citation> depuis {{canonicalurl:{{FULLPAGENAME}}|oldid={{REVISIONID}}}}.
=== [[Style MLA]] ===
-\"{{FULLPAGENAME}}.\" ''{{SITENAME}}, {{int:sitesubtitle}}''. {{CURRENTDAY}} {{CURRENTMONTHABBREV}} {{CURRENTYEAR}}, {{CURRENTTIME}} UTC. <citation>{{CURRENTDAY}} {{CURRENTMONTHABBREV}} {{CURRENTYEAR}}, {{CURRENTTIME}}</citation> &lt;{{canonicalurl:{{FULLPAGENAME}}|oldid={{REVISIONID}}}}&gt;.
+«&nbsp;{{FULLPAGENAME}}&nbsp;» ''{{SITENAME}}, {{int:sitesubtitle}}''. {{CURRENTDAY}} {{CURRENTMONTHABBREV}} {{CURRENTYEAR}}, {{CURRENTTIME}} UTC. <citation>{{CURRENTDAY}} {{CURRENTMONTHABBREV}} {{CURRENTYEAR}}, {{CURRENTTIME}}</citation> &lt;{{canonicalurl:{{FULLPAGENAME}}|oldid={{REVISIONID}}}}&gt;.
=== [[Style MHRA]] ===
-{{SITENAME}} contributors, '{{FULLPAGENAME}}', ''{{SITENAME}}, {{int:sitesubtitle}},'' {{CURRENTDAY}} {{CURRENTMONTHNAME}} {{CURRENTYEAR}}, {{CURRENTTIME}} UTC, &lt;{{canonicalurl:{{FULLPAGENAME}}|oldid={{REVISIONID}}}}&gt; [accédé le <citation>{{CURRENTDAY}} {{CURRENTMONTHNAME}} {{CURRENTYEAR}}</citation>]
+{{SITENAME}} contributors, '{{FULLPAGENAME}}', ''{{SITENAME}}, {{int:sitesubtitle}},'' {{CURRENTDAY}} {{CURRENTMONTHNAME}} {{CURRENTYEAR}}, {{CURRENTTIME}} UTC, &lt;{{canonicalurl:{{FULLPAGENAME}}|oldid={{REVISIONID}}}}&gt; [accédé le <citation>{{CURRENTDAY}} {{CURRENTMONTHNAME}} {{CURRENTYEAR}}</citation>]
=== [[Style Chicago]] ===
-Contributeurs de {{SITENAME}}, \"{{FULLPAGENAME}},\" ''{{SITENAME}}, {{int:sitesubtitle}},'' {{canonicalurl:{{FULLPAGENAME}}|oldid={{REVISIONID}}}} (accessed <citation>{{CURRENTMONTHNAME}} {{CURRENTDAY}}, {{CURRENTYEAR}}</citation>).
+Contributeurs de {{SITENAME}}, «&nbsp;{{FULLPAGENAME}}&nbsp;», ''{{SITENAME}}, {{int:sitesubtitle}},'' {{canonicalurl:{{FULLPAGENAME}}|oldid={{REVISIONID}}}} (accédé le <citation>{{CURRENTMONTHNAME}} {{CURRENTDAY}}, {{CURRENTYEAR}}</citation>).
=== [[Style CBE/CSE]] ===
-{{SITENAME}} contributors. {{FULLPAGENAME}} [Internet]. {{SITENAME}}, {{int:sitesubtitle}}; {{CURRENTYEAR}} {{CURRENTMONTHABBREV}} {{CURRENTDAY}}, {{CURRENTTIME}} UTC [cité le <citation>{{CURRENTYEAR}} {{CURRENTMONTHABBREV}} {{CURRENTDAY}}</citation>]. Disponible sur :
-{{canonicalurl:{{FULLPAGENAME}}|oldid={{REVISIONID}}}}.
+Contributeurs de {{SITENAME}}. {{FULLPAGENAME}} [Internet]. {{SITENAME}}, {{int:sitesubtitle}}&nbsp;; {{CURRENTYEAR}} {{CURRENTMONTHABBREV}} {{CURRENTDAY}}, {{CURRENTTIME}} TUC [cité le <citation>{{CURRENTYEAR}} {{CURRENTMONTHABBREV}} {{CURRENTDAY}}</citation>]. Disponible sur&nbsp;: {{canonicalurl:{{FULLPAGENAME}}|oldid={{REVISIONID}}}}.
=== [[Style Bluebook]] ===
-{{FULLPAGENAME}}, {{canonicalurl:{{FULLPAGENAME}}|oldid={{REVISIONID}}}} (visité le <citation>{{CURRENTMONTHNAME}} {{CURRENTDAY}}, {{CURRENTYEAR}}</citation>).
+{{FULLPAGENAME}}, {{canonicalurl:{{FULLPAGENAME}}|oldid={{REVISIONID}}}} (accédé le <citation>{{CURRENTMONTHNAME}} {{CURRENTDAY}}, {{CURRENTYEAR}}</citation>).
=== Entrée [[BibTeX]] ===
@@ -1835,6 +1955,77 @@ $messages['frp'] = array(
'cite_submit' => 'Citar',
);
+/** Northern Frisian (Nordfriisk)
+ * @author Murma174
+ */
+$messages['frr'] = array(
+ 'cite_article_desc' => 'Diar komt en nei [[Special:Cite|spezial-sidj]] tu, am sitiarin ianfacher tu maagin, an uk en ferwisang bi a werktjüügen',
+ 'cite_article_link' => 'Detdiar sidj sitiare',
+ 'tooltip-cite-article' => 'Hü detdiar sidj sitiaret wurd koon',
+ 'cite' => 'Sitiare',
+ 'cite_page' => 'Sidj:',
+ 'cite_submit' => 'Sitiare',
+ 'cite_text' => "__NOTOC__
+<div class=\"mw-specialcite-bibliographic\">
+
+== Bibliograafisk dooten för {{FULLPAGENAME}} ==
+
+* Sidj: {{FULLPAGENAME}}
+* Skriiwer: {{SITENAME}} contributors
+* Ãœtjden faan: ''{{SITENAME}}, {{int:sitesubtitle}}''.
+* Leetst feranrang: {{CURRENTDAY}} {{CURRENTMONTHNAME}} {{CURRENTYEAR}} {{CURRENTTIME}} UTC
+* Ufrepen: <citation>{{CURRENTDAY}} {{CURRENTMONTHNAME}} {{CURRENTYEAR}} {{CURRENTTIME}} UTC</citation>
+* Permanent URL: {{canonicalurl:{{FULLPAGENAME}}|oldid={{REVISIONID}}}}
+* Sidjenwerjuun ID: {{REVISIONID}}
+
+</div>
+<div class=\"plainlinks mw-specialcite-styles\">
+
+== Sitiarmuudin för {{FULLPAGENAME}} ==
+
+=== [[APA muude]] ===
+{{FULLPAGENAME}}. ({{CURRENTYEAR}}, {{CURRENTMONTHNAME}} {{CURRENTDAY}}). ''{{SITENAME}}, {{int:sitesubtitle}}''. Ufrepen <citation>{{CURRENTTIME}}, {{CURRENTMONTHNAME}} {{CURRENTDAY}}, {{CURRENTYEAR}}</citation> faan {{canonicalurl:{{FULLPAGENAME}}|oldid={{REVISIONID}}}}.
+
+=== [[MLA muude]] ===
+\"{{FULLPAGENAME}}.\" ''{{SITENAME}}, {{int:sitesubtitle}}''. {{CURRENTDAY}} {{CURRENTMONTHABBREV}} {{CURRENTYEAR}}, {{CURRENTTIME}} UTC. <citation>{{CURRENTDAY}} {{CURRENTMONTHABBREV}} {{CURRENTYEAR}}, {{CURRENTTIME}}</citation> &lt;{{canonicalurl:{{FULLPAGENAME}}|oldid={{REVISIONID}}}}&gt;.
+
+=== [[MHRA muude]] ===
+{{SITENAME}} bewerkern, '{{FULLPAGENAME}}', ''{{SITENAME}}, {{int:sitesubtitle}},'' {{CURRENTDAY}} {{CURRENTMONTHNAME}} {{CURRENTYEAR}}, {{CURRENTTIME}} UTC, &lt;{{canonicalurl:{{FULLPAGENAME}}|oldid={{REVISIONID}}}}&gt; [accessed <citation>{{CURRENTDAY}} {{CURRENTMONTHNAME}} {{CURRENTYEAR}}</citation>]
+
+=== [[Chicago muude]] ===
+{{SITENAME}} bewerkern, \"{{FULLPAGENAME}},\" ''{{SITENAME}}, {{int:sitesubtitle}},'' {{canonicalurl:{{FULLPAGENAME}}|oldid={{REVISIONID}}}} (ufrepen <citation>{{CURRENTMONTHNAME}} {{CURRENTDAY}}, {{CURRENTYEAR}}</citation>).
+
+=== [[CBE/CSE muude]] ===
+{{SITENAME}} bewerkern. {{FULLPAGENAME}} [Internet]. {{SITENAME}}, {{int:sitesubtitle}}; {{CURRENTYEAR}} {{CURRENTMONTHABBREV}} {{CURRENTDAY}}, {{CURRENTTIME}} UTC [sitiaret <citation>{{CURRENTYEAR}} {{CURRENTMONTHABBREV}} {{CURRENTDAY}}</citation>]. Tu fun faan:
+{{canonicalurl:{{FULLPAGENAME}}|oldid={{REVISIONID}}}}.
+
+=== [[Bluebook muude]] ===
+{{FULLPAGENAME}}, {{canonicalurl:{{FULLPAGENAME}}|oldid={{REVISIONID}}}} (ufrepen <citation>{{CURRENTMONTHNAME}} {{CURRENTDAY}}, {{CURRENTYEAR}}</citation>).
+
+=== [[BibTeX]] iindrach ===
+
+ @misc{ wiki:xxx,
+ author = \"{{SITENAME}}\",
+ title = \"{{FULLPAGENAME}} --- {{SITENAME}}{,} {{int:sitesubtitle}}\",
+ year = \"{{CURRENTYEAR}}\",
+ url = \"{{canonicalurl:{{FULLPAGENAME}}|oldid={{REVISIONID}}}}\",
+ note = \"[Online; ufrepen <citation>{{CURRENTDAY}}-{{CURRENTMONTHNAME}}-{{CURRENTYEAR}}</citation>]\"
+ }
+
+Wan det [[LaTeX]]-moduul (<code>\\usepackage{url}</code> uun't iinfeerang) mä en smoker wääb-adres brükt woort, as det ferlicht neter so:
+
+ @misc{ wiki:xxx,
+ author = \"{{SITENAME}}\",
+ title = \"{{FULLPAGENAME}} --- {{SITENAME}}{,} {{int:sitesubtitle}}\",
+ year = \"{{CURRENTYEAR}}\",
+ url = \"'''\\url{'''{{canonicalurl:{{FULLPAGENAME}}|oldid={{REVISIONID}}}}'''}'''\",
+ note = \"[Online; ufrepen <citation>{{CURRENTDAY}}-{{CURRENTMONTHNAME}}-{{CURRENTYEAR}}</citation>]\"
+ }
+
+
+</div> <!--closing div for \"plainlinks\"-->",
+);
+
/** Friulian (furlan)
* @author Klenje
* @author MF-Warburg
@@ -2141,14 +2332,73 @@ $messages['he'] = array(
/** Hindi (हिनà¥à¤¦à¥€)
* @author Ansumang
* @author Kaustubh
+ * @author Siddhartha Ghai
*/
$messages['hi'] = array(
- 'cite_article_desc' => 'à¤à¤• विशेष [[Special:Cite|बाहà¥à¤¯à¤•à¤¡à¤¼à¤¿à¤¯à¤¾à¤‚]] देनेवाला पनà¥à¤¨à¤¾ और टूलबॉकà¥à¤¸à¤•à¤¾ लिंक बनाईयें',
- 'cite_article_link' => 'इस पनà¥à¤¨à¥‡ को उदà¥à¤˜à¥ƒà¤¤ करें',
- 'tooltip-cite-article' => 'तथà¥à¤¯ कैसे इस पृषà¥à¤  में संदरà¥à¤­ जोड़ें',
- 'cite' => 'उदà¥à¤˜à¥„त करें',
- 'cite_page' => 'पनà¥à¤¨à¤¾:',
- 'cite_submit' => 'उदà¥à¤˜à¥ƒà¤¤ करें',
+ 'cite_article_desc' => '[[Special:Cite|सनà¥à¤¦à¤°à¥à¤­]] देने वाला à¤à¤• विशेष पृषà¥à¤  और टूलबॉकà¥à¤¸ कड़ी जोड़ता है',
+ 'cite_article_link' => 'इस पनà¥à¤¨à¥‡ को उदà¥à¤§à¥ƒà¤¤ करें',
+ 'tooltip-cite-article' => 'इस पृषà¥à¤  को उदà¥à¤§à¥ƒà¤¤ करने के लिये जानकारी',
+ 'cite' => 'उदà¥à¤§à¥ƒà¤¤ करें',
+ 'cite_page' => 'पृषà¥à¤ :',
+ 'cite_submit' => 'उदà¥à¤§à¥ƒà¤¤ करें',
+ 'cite_text' => "__NOTOC__
+<div class=\"mw-specialcite-bibliographic\">
+
+== {{FULLPAGENAME}} के लिठउदà¥à¤§à¤°à¤£ जानकारी ==
+
+* पृषà¥à¤  नाम: {{FULLPAGENAME}}
+* लेखक: {{SITENAME}} योगदानकरà¥à¤¤à¤¾
+* पà¥à¤°à¤•à¤¾à¤¶à¤•: ''{{SITENAME}}, {{int:sitesubtitle}}''।
+* अंतिम संशोधन तिथि: {{CURRENTDAY}} {{CURRENTMONTHNAME}} {{CURRENTYEAR}} {{CURRENTTIME}} यू॰टी॰सी
+* अभिगमन तिथि: <citation>{{CURRENTDAY}} {{CURRENTMONTHNAME}} {{CURRENTYEAR}} {{CURRENTTIME}} UTC</citation>
+* सà¥à¤¥à¤¾à¤¯à¥€ यू॰आर॰à¤à¤²: {{canonicalurl:{{FULLPAGENAME}}|oldid={{REVISIONID}}}}
+* पृषà¥à¤  अवतरण आई॰डी: {{REVISIONID}}
+
+</div>
+<div class=\"plainlinks mw-specialcite-styles\">
+
+== {{FULLPAGENAME}} के लिठउदà¥à¤§à¤°à¤£ पà¥à¤°à¤•à¤¾à¤° ==
+
+=== APA पà¥à¤°à¤•à¤¾à¤° ===
+{{FULLPAGENAME}}। ({{CURRENTYEAR}}, {{CURRENTMONTHNAME}} {{CURRENTDAY}})। ''{{SITENAME}}, {{int:sitesubtitle}}''। {{canonicalurl:{{FULLPAGENAME}}|oldid={{REVISIONID}}}} से अभिगमन <citation>{{CURRENTTIME}}, {{CURRENTMONTHNAME}} {{CURRENTDAY}}, {{CURRENTYEAR}}</citation> को।
+
+=== MLA पà¥à¤°à¤•à¤¾à¤° ===
+\"{{FULLPAGENAME}}।\" ''{{SITENAME}}, {{int:sitesubtitle}}''। {{CURRENTDAY}} {{CURRENTMONTHABBREV}} {{CURRENTYEAR}}, {{CURRENTTIME}} यू॰टी॰सी। <citation>{{CURRENTDAY}} {{CURRENTMONTHABBREV}} {{CURRENTYEAR}}, {{CURRENTTIME}}</citation> &lt;{{canonicalurl:{{FULLPAGENAME}}|oldid={{REVISIONID}}}}&gt;।
+
+=== MHRA पà¥à¤°à¤•à¤¾à¤° ===
+{{SITENAME}} योगदानकरà¥à¤¤à¤¾, '{{FULLPAGENAME}}', ''{{SITENAME}}, {{int:sitesubtitle}},'' {{CURRENTDAY}} {{CURRENTMONTHNAME}} {{CURRENTYEAR}}, {{CURRENTTIME}} यू॰टी॰सी, &lt;{{canonicalurl:{{FULLPAGENAME}}|oldid={{REVISIONID}}}}&gt; [अभिगमन <citation>{{CURRENTDAY}} {{CURRENTMONTHNAME}} {{CURRENTYEAR}}</citation> को]
+
+=== शिकागो पà¥à¤°à¤•à¤¾à¤° ===
+{{SITENAME}} योगदानकरà¥à¤¤à¤¾, \"{{FULLPAGENAME}},\" ''{{SITENAME}}, {{int:sitesubtitle}},'' {{canonicalurl:{{FULLPAGENAME}}|oldid={{REVISIONID}}}} (अभिगमन <citation>{{CURRENTMONTHNAME}} {{CURRENTDAY}}, {{CURRENTYEAR}}</citation> को)।
+
+=== CBE/CSE पà¥à¤°à¤•à¤¾à¤° ===
+{{SITENAME}} योगदानकरà¥à¤¤à¤¾à¥¤ {{FULLPAGENAME}} [इनà¥à¤Ÿà¤°à¤¨à¥‡à¤Ÿ]। {{SITENAME}}, {{int:sitesubtitle}}; {{CURRENTYEAR}} {{CURRENTMONTHABBREV}} {{CURRENTDAY}}, {{CURRENTTIME}} यू॰टी॰सी [<citation>{{CURRENTYEAR}} {{CURRENTMONTHABBREV}} {{CURRENTDAY}}</citation> उदà¥à¤§à¥ƒà¤¤]। {{canonicalurl:{{FULLPAGENAME}}|oldid={{REVISIONID}}}} से उपलबà¥à¤§à¥¤
+
+=== बà¥à¤²à¥‚बà¥à¤• पà¥à¤°à¤•à¤¾à¤° ===
+{{FULLPAGENAME}}, {{canonicalurl:{{FULLPAGENAME}}|oldid={{REVISIONID}}}} (अभिगमन तिथि: <citation>{{CURRENTMONTHNAME}} {{CURRENTDAY}}, {{CURRENTYEAR}}</citation>).
+
+=== बिबटेकà¥à¤¸ पà¥à¤°à¤•à¤¾à¤° ===
+
+ @misc{ wiki:xxx,
+ author = \"{{SITENAME}}\",
+ title = \"{{FULLPAGENAME}} --- {{SITENAME}}{,} {{int:sitesubtitle}}\",
+ year = \"{{CURRENTYEAR}}\",
+ url = \"{{canonicalurl:{{FULLPAGENAME}}|oldid={{REVISIONID}}}}\",
+ note = \"[ऑनलाइन; अभिगमन तिथि: <citation>{{CURRENTDAY}}-{{CURRENTMONTHNAME}}-{{CURRENTYEAR}}</citation>]\"
+ }
+
+यदि LaTeX पैकेज यू॰आर॰à¤à¤² का पà¥à¤°à¤¯à¥‹à¤— किया जा रहा हो(<code>\\usepackage{url}</code> पà¥à¤°à¤¿à¤¯à¥‡à¤®à¥à¤¬à¤² में कहीं पà¥à¤°à¤¯à¥à¤•à¥à¤¤ हो) तो बेहतर सà¥à¤µà¤°à¥‚पण वाले यू॰आर॰à¤à¤² के लिठनिमà¥à¤¨ का पà¥à¤°à¤¯à¥‹à¤— किया जा सकता है:
+
+ @misc{ wiki:xxx,
+ author = \"{{SITENAME}}\",
+ title = \"{{FULLPAGENAME}} --- {{SITENAME}}{,} {{int:sitesubtitle}}\",
+ year = \"{{CURRENTYEAR}}\",
+ url = \"'''\\url{'''{{canonicalurl:{{FULLPAGENAME}}|oldid={{REVISIONID}}}}'''}'''\",
+ note = \"[ऑनलाइन; अभिगमन तिथि: <citation>{{CURRENTDAY}}-{{CURRENTMONTHNAME}}-{{CURRENTYEAR}}</citation>]\"
+ }
+
+
+</div> <!--closing div for \"plainlinks\"-->",
);
/** Fiji Hindi (Latin script) (Fiji Hindi)
@@ -2342,6 +2592,7 @@ Az <code>url</code> nevű [[LaTeX]] csomag használata esetén (<code>\\usepacka
);
/** Armenian (Õ€Õ¡ÕµÕ¥Ö€Õ¥Õ¶)
+ * @author Chaojoker
* @author Teak
*/
$messages['hy'] = array(
@@ -2349,6 +2600,65 @@ $messages['hy'] = array(
'cite' => 'Õ”Õ¡Õ²Õ¾Õ¡Õ®Õ¸Ö‚Õ´',
'cite_page' => 'Ô·Õ».',
'cite_submit' => 'Õ”Õ¡Õ²Õ¾Õ¡Õ®Õ¥Õ¬',
+ 'cite_text' => "__NOTOC__
+<div class=\"mw-specialcite-bibliographic\">
+
+== {{FULLPAGENAME}} Õ§Õ»Õ« Õ´Õ¡Õ¿Õ¥Õ¶Õ¡Õ£Ö€Õ¡Õ¯Õ¡Õ¶ Õ´Õ¡Õ¶Ö€Õ¡Õ´Õ¡Õ½Õ¶Õ¥Ö€ ==
+
+* Ô·Õ»Õ¡Õ¶Õ¸Ö‚Õ¶Õ {{FULLPAGENAME}}
+* Õ€Õ¥Õ²Õ«Õ¶Õ¡Õ¯Õ {{SITENAME}} contributors
+* Õ€Ö€Õ¡Õ¿Õ¡Ö€Õ¡Õ¯Õ«Õ¹Õ ''{{SITENAME}}, {{int:sitesubtitle}}''.
+* ÕŽÕ¥Ö€Õ»Õ«Õ¶Õ¶ Õ¾Õ¥Ö€Õ¡Õ¶Õ¡ÕµÕ´Õ¡Õ¶ Õ©Õ«Õ¾Õ {{CURRENTDAY}} {{CURRENTMONTHNAME}} {{CURRENTYEAR}} {{CURRENTTIME}} Õ€Ô¿Ôº
+* ÕŽÕ¥Ö€Õ½Õ¿Õ¡ÖÕ´Õ¡Õ¶ Õ©Õ«Õ¾Õ <citation>{{CURRENTDAY}} {{CURRENTMONTHNAME}} {{CURRENTYEAR}} {{CURRENTTIME}} Õ€Ô¿Ôº</citation>
+* Õ„Õ·Õ¿Õ¡Õ¯Õ¡Õ¶ Õ°Õ¡Õ½ÖÕ¥Õ {{canonicalurl:{{FULLPAGENAME}}|oldid={{REVISIONID}}}}
+* Ô·Õ»Õ« Õ¾Õ¡Ö€Õ¯Õ¡Õ®Õ« Õ©Õ«Õ¾Õ {{REVISIONID}}
+
+</div>
+<div class=\"plainlinks mw-specialcite-styles\">
+
+== {{FULLPAGENAME}} Õ§Õ»Õ« Õ´Õ¥Õ»Õ¢Õ¥Ö€Õ´Õ¡Õ¶ Õ¸Õ³Õ¥Ö€ ==
+
+=== [[APA style]] ===
+{{FULLPAGENAME}}. ({{CURRENTYEAR}}, {{CURRENTMONTHNAME}} {{CURRENTDAY}})Ö‰ ''{{SITENAME}}, {{int:sitesubtitle}}''Ö‰ ÕŽÕ¥Ö€Õ½Õ¿Õ¡ÖÕ¾Õ¡Õ® Õ§Õ <citation>{{CURRENTTIME}}, {{CURRENTMONTHNAME}} {{CURRENTDAY}}, {{CURRENTYEAR}} Õ©Õ¾Õ«Õ¶Õ</citation> {{canonicalurl:{{FULLPAGENAME}}|oldid={{REVISIONID}}}}-Õ«ÖÖ‰
+
+=== [[The MLA style manual|MLA style]] ===
+\"{{FULLPAGENAME}}Ö‰\" ''{{SITENAME}}, {{int:sitesubtitle}}''Ö‰ {{CURRENTDAY}} {{CURRENTMONTHABBREV}} {{CURRENTYEAR}}, {{CURRENTTIME}} Õ€Ô¿ÔºÖ‰ <citation>{{CURRENTDAY}} {{CURRENTMONTHABBREV}} {{CURRENTYEAR}}, {{CURRENTTIME}}</citation> &lt;{{canonicalurl:{{FULLPAGENAME}}|oldid={{REVISIONID}}}}&gt;Ö‰
+
+=== [[MHRA Style Guide|MHRA style]] ===
+{{SITENAME}} Õ¯Õ¡ÕµÖ„Õ« Õ¶Õ¥Ö€Õ¤Õ¶Õ¸Õ²Õ¶Õ¥Ö€, '{{FULLPAGENAME}}', ''{{SITENAME}}, {{int:sitesubtitle}},'' {{CURRENTDAY}} {{CURRENTMONTHNAME}} {{CURRENTYEAR}}, {{CURRENTTIME}} Õ€Ô¿Ôº, &lt;{{canonicalurl:{{FULLPAGENAME}}|oldid={{REVISIONID}}}}&gt; [Õ¾Õ¥Ö€Õ½Õ¿Õ¡ÖÕ¾Õ¡Õ® Õ§Õ <citation>{{CURRENTDAY}} {{CURRENTMONTHNAME}} {{CURRENTYEAR}}</citation>]
+
+=== [[The Chicago Manual of Style|Chicago style]] ===
+{{SITENAME}} Õ¯Õ¡ÕµÖ„Õ« Õ¶Õ¥Ö€Õ¤Õ¶Õ¸Õ²Õ¶Õ¥Ö€, \"{{FULLPAGENAME}},\" ''{{SITENAME}}, {{int:sitesubtitle}},'' {{canonicalurl:{{FULLPAGENAME}}|oldid={{REVISIONID}}}} (Õ¾Õ¥Ö€Õ½Õ¿Õ¡ÖÕ¾Õ¡Õ® Õ§Õ <citation>{{CURRENTMONTHNAME}} {{CURRENTDAY}}, {{CURRENTYEAR}}</citation>)Ö‰
+
+=== [[Council of Science Editors|CBE/CSE style]] ===
+{{SITENAME}} Õ¯Õ¡ÕµÖ„Õ« Õ¶Õ¥Ö€Õ¤Õ¶Õ¸Õ²Õ¶Õ¥Ö€Ö‰ {{FULLPAGENAME}} [Õ€Õ¡Õ´Õ¡ÖÕ¡Õ¶Ö]Ö‰ {{SITENAME}}, {{int:sitesubtitle}}․ {{CURRENTYEAR}} {{CURRENTMONTHABBREV}} {{CURRENTDAY}}, {{CURRENTTIME}} Õ€Ô¿Ôº [Õ´Õ¥Õ»Õ¢Õ¥Ö€Õ¡Õ®Õ <citation>{{CURRENTYEAR}} {{CURRENTMONTHABBREV}} {{CURRENTDAY}}</citation>]Ö‰ Õ€Õ¡Õ½Õ¡Õ¶Õ¥Õ¬Õ« Õ§Õ
+{{canonicalurl:{{FULLPAGENAME}}|oldid={{REVISIONID}}}}Ö‰
+
+=== [[Bluebook|Bluebook style]] ===
+{{FULLPAGENAME}}, {{canonicalurl:{{FULLPAGENAME}}|oldid={{REVISIONID}}}} (Õ¾Õ¥Ö€Õ»Õ«Õ¶ Õ¡ÕµÖÕ¥Õ¬Õ¸Ö‚Õ©ÕµÕ¸Ö‚Õ¶Õ <citation>{{CURRENTMONTHNAME}} {{CURRENTDAY}}, {{CURRENTYEAR}}</citation>)Ö‰
+
+=== [[BibTeX]] entry ===
+
+ @misc{ wiki:xxx,
+ author = \"{{SITENAME}}\",
+ title = \"{{FULLPAGENAME}} --- {{SITENAME}}{,} {{int:sitesubtitle}}\",
+ year = \"{{CURRENTYEAR}}\",
+ url = \"{{canonicalurl:{{FULLPAGENAME}}|oldid={{REVISIONID}}}}\",
+ note = \"[Ô±Õ¼ÖÕ¡Õ¶Ö․ Õ¾Õ¥Ö€Õ½Õ¿Õ¡ÖÕ¾Õ¡Õ® Õ§Õ <citation>{{CURRENTDAY}}-{{CURRENTMONTHNAME}}-{{CURRENTYEAR}}</citation>]\"
+ }
+
+[[Ô¼Õ¡ÕÕ¥Ô½]] ÖƒÕ¡Õ©Õ¥Õ©Õ¡ÕµÕ«Õ¶ Õ°Õ¡Õ½ÖÕ¥Õ¶ (<code>\\usepackage{url}</code> Ö…Õ£Õ¿Õ¡Õ£Õ¸Ö€Õ®Õ¥Õ¬Õ«Õ½, Õ¸Ö€Õ¨ Õ·Õ¡Õ¿ Õ¡Õ¾Õ¥Õ¬Õ« Õ£Õ¥Õ²Õ¥ÖÕ¯Õ¸Ö€Õ¥Õ¶ Õ¸Õ³Õ¡Õ¾Õ¸Ö€Õ¾Õ¡Õ® Õ§ ÖÕ¸Ö‚ÖÕ¡Õ¤Ö€Õ¸Ö‚Õ´ Õ¯Õ¡ÕµÖ„Õ¥Ö€Õ« Õ°Õ¡Õ½ÖÕ¥Õ¶Õ¥Ö€Õ¨, Õ¯Õ¡Ö€Õ¥Õ¬Õ« Õ§ Õ°Õ¥Õ¿Ö‡ÕµÕ¡Õ¬Õ¨ Õ¶Õ¡Õ­Õ¨Õ¶Õ¿Ö€Õ¥Õ¬Õ
+
+ @misc{ wiki:xxx,
+ author = \"{{SITENAME}}\",
+ title = \"{{FULLPAGENAME}} --- {{SITENAME}}{,} {{int:sitesubtitle}}\",
+ year = \"{{CURRENTYEAR}}\",
+ url = \"'''\\url{'''{{canonicalurl:{{FULLPAGENAME}}|oldid={{REVISIONID}}}}'''}'''\",
+ note = \"[Ô±Õ¼ÖÕ¡Õ¶Ö․ Õ¾Õ¥Ö€Õ½Õ¿Õ¡ÖÕ¾Õ¡Õ® Õ§Õ <citation>{{CURRENTDAY}}-{{CURRENTMONTHNAME}}-{{CURRENTYEAR}}</citation>]\"
+ }
+
+
+</div> <!--closing div for \"plainlinks\"-->", # Fuzzy
);
/** Interlingua (interlingua)
@@ -2547,7 +2857,65 @@ $messages['is'] = array(
'cite' => 'Vitna í síðu',
'cite_page' => 'Síða:',
'cite_submit' => 'Vitna í',
- 'cite_text' => '*** [[ignored messages]]', # Fuzzy
+ 'cite_text' => "__NOTOC__
+<div class=\"mw-specialcite-bibliographic\">
+
+== Bibliographic details for {{FULLPAGENAME}} ==
+
+* Page name: {{FULLPAGENAME}}
+* Author: {{SITENAME}} contributors
+* Publisher: ''{{SITENAME}}, {{int:sitesubtitle}}''.
+* Date of last revision: {{CURRENTDAY}} {{CURRENTMONTHNAME}} {{CURRENTYEAR}} {{CURRENTTIME}} UTC
+* Date retrieved: <citation>{{CURRENTDAY}} {{CURRENTMONTHNAME}} {{CURRENTYEAR}} {{CURRENTTIME}} UTC</citation>
+* Permanent URL: {{canonicalurl:{{FULLPAGENAME}}|oldid={{REVISIONID}}}}
+* Page Version ID: {{REVISIONID}}
+
+</div>
+<div class=\"plainlinks mw-specialcite-styles\">
+
+== Citation styles for {{FULLPAGENAME}} ==
+
+=== [[APA style]] ===
+{{FULLPAGENAME}}. ({{CURRENTYEAR}}, {{CURRENTMONTHNAME}} {{CURRENTDAY}}). ''{{SITENAME}}, {{int:sitesubtitle}}''. Retrieved <citation>{{CURRENTTIME}}, {{CURRENTMONTHNAME}} {{CURRENTDAY}}, {{CURRENTYEAR}}</citation> from {{canonicalurl:{{FULLPAGENAME}}|oldid={{REVISIONID}}}}.
+
+=== [[The MLA style manual|MLA style]] ===
+\"{{FULLPAGENAME}}.\" ''{{SITENAME}}, {{int:sitesubtitle}}''. {{CURRENTDAY}} {{CURRENTMONTHABBREV}} {{CURRENTYEAR}}, {{CURRENTTIME}} UTC. <citation>{{CURRENTDAY}} {{CURRENTMONTHABBREV}} {{CURRENTYEAR}}, {{CURRENTTIME}}</citation> &lt;{{canonicalurl:{{FULLPAGENAME}}|oldid={{REVISIONID}}}}&gt;.
+
+=== [[MHRA Style Guide|MHRA style]] ===
+{{SITENAME}} contributors, '{{FULLPAGENAME}}', ''{{SITENAME}}, {{int:sitesubtitle}},'' {{CURRENTDAY}} {{CURRENTMONTHNAME}} {{CURRENTYEAR}}, {{CURRENTTIME}} UTC, &lt;{{canonicalurl:{{FULLPAGENAME}}|oldid={{REVISIONID}}}}&gt; [accessed <citation>{{CURRENTDAY}} {{CURRENTMONTHNAME}} {{CURRENTYEAR}}</citation>]
+
+=== [[The Chicago Manual of Style|Chicago style]] ===
+{{SITENAME}} contributors, \"{{FULLPAGENAME}},\" ''{{SITENAME}}, {{int:sitesubtitle}},'' {{canonicalurl:{{FULLPAGENAME}}|oldid={{REVISIONID}}}} (accessed <citation>{{CURRENTMONTHNAME}} {{CURRENTDAY}}, {{CURRENTYEAR}}</citation>).
+
+=== [[Council of Science Editors|CBE/CSE style]] ===
+{{SITENAME}} contributors. {{FULLPAGENAME}} [Internet]. {{SITENAME}}, {{int:sitesubtitle}}; {{CURRENTYEAR}} {{CURRENTMONTHABBREV}} {{CURRENTDAY}}, {{CURRENTTIME}} UTC [cited <citation>{{CURRENTYEAR}} {{CURRENTMONTHABBREV}} {{CURRENTDAY}}</citation>]. Available from:
+{{canonicalurl:{{FULLPAGENAME}}|oldid={{REVISIONID}}}}.
+
+=== [[Bluebook|Bluebook style]] ===
+{{FULLPAGENAME}}, {{canonicalurl:{{FULLPAGENAME}}|oldid={{REVISIONID}}}} (last visited <citation>{{CURRENTMONTHNAME}} {{CURRENTDAY}}, {{CURRENTYEAR}}</citation>).
+
+=== [[BibTeX]] entry ===
+
+ @misc{ wiki:xxx,
+ author = \"{{SITENAME}}\",
+ title = \"{{FULLPAGENAME}} --- {{SITENAME}}{,} {{int:sitesubtitle}}\",
+ year = \"{{CURRENTYEAR}}\",
+ url = \"{{canonicalurl:{{FULLPAGENAME}}|oldid={{REVISIONID}}}}\",
+ note = \"[Online; accessed <citation>{{CURRENTDAY}}-{{CURRENTMONTHNAME}}-{{CURRENTYEAR}}</citation>]\"
+ }
+
+When using the [[LaTeX]] package url (<code>\\usepackage{url}</code> somewhere in the preamble) which tends to give much more nicely formatted web addresses, the following may be preferred:
+
+ @misc{ wiki:xxx,
+ author = \"{{SITENAME}}\",
+ title = \"{{FULLPAGENAME}} --- {{SITENAME}}{,} {{int:sitesubtitle}}\",
+ year = \"{{CURRENTYEAR}}\",
+ url = \"'''\\url{'''{{canonicalurl:{{FULLPAGENAME}}|oldid={{REVISIONID}}}}'''}'''\",
+ note = \"[Online; accessed <citation>{{CURRENTDAY}}-{{CURRENTMONTHNAME}}-{{CURRENTYEAR}}</citation>]\"
+ }
+
+
+</div> <!--closing div for \"plainlinks\"-->", # Fuzzy
);
/** Italian (italiano)
@@ -3110,7 +3478,7 @@ $messages['kn'] = array(
* @author ì•„ë¼
*/
$messages['ko'] = array(
- 'cite_article_desc' => '[[Special:Cite|ì¸ìš©]] 특수 문서와 ë„êµ¬ëª¨ìŒ ë§í¬ë¥¼ 추가함',
+ 'cite_article_desc' => '[[Special:Cite|ì¸ìš©]] 특수 문서와 ë„êµ¬ëª¨ìŒ ë§í¬ë¥¼ 추가합니다',
'cite_article_link' => 'ì´ ë¬¸ì„œ ì¸ìš©í•˜ê¸°',
'tooltip-cite-article' => 'ì´ ë¬¸ì„œë¥¼ ì¸ìš©í•˜ëŠ” ë°©ë²•ì— ëŒ€í•œ ì •ë³´',
'cite' => 'ì¸ìš©',
@@ -3121,56 +3489,56 @@ $messages['ko'] = array(
== {{FULLPAGENAME}}ì˜ ì¶œì²˜ ì •ë³´ ==
-* 문서 제목: {{FULLPAGENAME}}
-* ì €ìž: {{SITENAME}} contributors
-* 출íŒì‚¬: ''{{SITENAME}}, {{int:sitesubtitle}}''.
-* 최신 ë²„ì „ì˜ ë‚ ì§œ: {{CURRENTDAY}} {{CURRENTMONTHNAME}} {{CURRENTYEAR}} {{CURRENTTIME}} UTC
-* 확ì¸í•œ 날짜: <citation>{{CURRENTDAY}} {{CURRENTMONTHNAME}} {{CURRENTYEAR}} {{CURRENTTIME}} UTC</citation>
-* URL: {{canonicalurl:{{FULLPAGENAME}}|oldid={{REVISIONID}}}}
-* 페ì´ì§€ 버전 ID: {{REVISIONID}}
+* 문서 ì´ë¦„: {{FULLPAGENAME}}
+* ì €ìž: {{SITENAME}} 기여ìž
+* 발행처: ''{{SITENAME}}, {{int:sitesubtitle}}''.
+* 최신 íŒì˜ 날짜: {{CURRENTYEAR}}ë…„ {{CURRENTMONTHNAME}} {{CURRENTDAY}}ì¼ {{CURRENTTIME}} UTC
+* 확ì¸í•œ 날짜: <citation>{{CURRENTYEAR}}ë…„ {{CURRENTMONTHNAME}} {{CURRENTDAY}}ì¼ {{CURRENTTIME}} UTC</citation>
+* 고유 URL: {{canonicalurl:{{FULLPAGENAME}}|oldid={{REVISIONID}}}}
+* 문서 íŒ ID: {{REVISIONID}}
</div>
<div class=\"plainlinks mw-specialcite-styles\">
-== {{FULLPAGENAME}}ì˜ ì¸ìš© ìŠ¤íƒ€ì¼ ==
+== {{FULLPAGENAME}}ì˜ ì¸ìš© ì–‘ì‹ ==
-=== [[APA 스타ì¼]] ===
-{{FULLPAGENAME}}. ({{CURRENTYEAR}}, {{CURRENTMONTHNAME}} {{CURRENTDAY}}). ''{{SITENAME}}, {{int:sitesubtitle}}''. Retrieved <citation>{{CURRENTTIME}}, {{CURRENTMONTHNAME}} {{CURRENTDAY}}, {{CURRENTYEAR}}</citation> from {{canonicalurl:{{FULLPAGENAME}}|oldid={{REVISIONID}}}}.
+=== [[APA ì–‘ì‹]] ===
+{{FULLPAGENAME}}. ({{CURRENTYEAR}}ë…„ {{CURRENTMONTHNAME}} {{CURRENTDAY}}ì¼). ''{{SITENAME}}, {{int:sitesubtitle}}''. <citation>{{CURRENTYEAR}}ë…„ {{CURRENTMONTHNAME}} {{CURRENTDAY}}ì¼, {{CURRENTTIME}}</citation>ì— í™•ì¸ {{canonicalurl:{{FULLPAGENAME}}|oldid={{REVISIONID}}}} ì—ì„œ 찾아볼 수 있ìŒ.
-=== [[MLA 스타ì¼]] ===
+=== [[MLA ì–‘ì‹]] ===
\"{{FULLPAGENAME}}.\" ''{{SITENAME}}, {{int:sitesubtitle}}''. {{CURRENTDAY}} {{CURRENTMONTHABBREV}} {{CURRENTYEAR}}, {{CURRENTTIME}} UTC. <citation>{{CURRENTDAY}} {{CURRENTMONTHABBREV}} {{CURRENTYEAR}}, {{CURRENTTIME}}</citation> &lt;{{canonicalurl:{{FULLPAGENAME}}|oldid={{REVISIONID}}}}&gt;.
-=== [[MHRA 스타ì¼]] ===
-{{SITENAME}} contributors, '{{FULLPAGENAME}}', ''{{SITENAME}}, {{int:sitesubtitle}},'' {{CURRENTDAY}} {{CURRENTMONTHNAME}} {{CURRENTYEAR}}, {{CURRENTTIME}} UTC, &lt;{{canonicalurl:{{FULLPAGENAME}}|oldid={{REVISIONID}}}}&gt; [accessed <citation>{{CURRENTDAY}} {{CURRENTMONTHNAME}} {{CURRENTYEAR}}</citation>]
+=== [[MHRA ì–‘ì‹]] ===
+{{SITENAME}} 기여ìž, '{{FULLPAGENAME}}', ''{{SITENAME}}, {{int:sitesubtitle}},'' {{CURRENTYEAR}}ë…„ {{CURRENTMONTHNAME}} {{CURRENTDAY}}ì¼, {{CURRENTTIME}} UTC, &lt;{{canonicalurl:{{FULLPAGENAME}}|oldid={{REVISIONID}}}}&gt; [<citation>{{CURRENTYEAR}}ë…„ {{CURRENTMONTHNAME}} {{CURRENTDAY}}ì¼</citation>ì— ì ‘ê·¼]
-=== [[시카고 스타ì¼|시카고 스타ì¼]] ===
-{{SITENAME}} contributors, \"{{FULLPAGENAME}},\" ''{{SITENAME}}, {{int:sitesubtitle}},'' {{canonicalurl:{{FULLPAGENAME}}|oldid={{REVISIONID}}}} (accessed <citation>{{CURRENTMONTHNAME}} {{CURRENTDAY}}, {{CURRENTYEAR}}</citation>).
+=== [[시카고 ì–‘ì‹]] ===
+{{SITENAME}} 기여ìž, \"{{FULLPAGENAME}},\" ''{{SITENAME}}, {{int:sitesubtitle}},'' {{canonicalurl:{{FULLPAGENAME}}|oldid={{REVISIONID}}}} (<citation>{{CURRENTYEAR}}ë…„ {{CURRENTMONTHNAME}} {{CURRENTDAY}}ì¼</citation>ì— ì ‘ê·¼).
-=== [[Council of Science Editors|CBE/CSE 스타ì¼]] ===
-{{SITENAME}} contributors. {{FULLPAGENAME}} [Internet]. {{SITENAME}}, {{int:sitesubtitle}}; {{CURRENTYEAR}} {{CURRENTMONTHABBREV}} {{CURRENTDAY}}, {{CURRENTTIME}} UTC [cited <citation>{{CURRENTYEAR}} {{CURRENTMONTHABBREV}} {{CURRENTDAY}}</citation>]. Available from:
+=== [[Council of Science Editors|CBE/CSE ì–‘ì‹]] ===
+{{SITENAME}} 기여ìž. {{FULLPAGENAME}} [ì¸í„°ë„·]. {{SITENAME}}, {{int:sitesubtitle}}; {{CURRENTYEAR}} {{CURRENTMONTHABBREV}} {{CURRENTDAY}}, {{CURRENTTIME}} UTC [<citation>{{CURRENTYEAR}} {{CURRENTMONTHABBREV}} {{CURRENTDAY}}</citation>ì— ì¸ìš©]. 다ìŒì—ì„œ 찾아볼 수 있ìŒ:
{{canonicalurl:{{FULLPAGENAME}}|oldid={{REVISIONID}}}}.
-=== [[블루ë¶|ë¸”ë£¨ë¶ ìŠ¤íƒ€ì¼]] ===
-{{FULLPAGENAME}}, {{canonicalurl:{{FULLPAGENAME}}|oldid={{REVISIONID}}}} (last visited <citation>{{CURRENTMONTHNAME}} {{CURRENTDAY}}, {{CURRENTYEAR}}</citation>).
+=== [[블루ë¶|ë¸”ë£¨ë¶ ì–‘ì‹]] ===
+{{FULLPAGENAME}}, {{canonicalurl:{{FULLPAGENAME}}|oldid={{REVISIONID}}}} (<citation>{{CURRENTYEAR}}ë…„ {{CURRENTMONTHNAME}} {{CURRENTDAY}}ì¼</citation>ì— ë§ˆì§€ë§‰ìœ¼ë¡œ 방문함).
-=== [[BibTeX]] ì–‘ì‹ ===
+=== [[BibTeX]] ê¸°ë¡ ===
@misc{ wiki:xxx,
- author = \"{{SITENAME}}\",
- title = \"{{FULLPAGENAME}} --- {{SITENAME}}{,} {{int:sitesubtitle}}\",
- year = \"{{CURRENTYEAR}}\",
- url = \"{{canonicalurl:{{FULLPAGENAME}}|oldid={{REVISIONID}}}}\",
- note = \"[Online; accessed <citation>{{CURRENTDAY}}-{{CURRENTMONTHNAME}}-{{CURRENTYEAR}}</citation>]\"
+ author = \"{{SITENAME}}\",
+ title = \"{{FULLPAGENAME}} --- {{SITENAME}}{,} {{int:sitesubtitle}}\",
+ year = \"{{CURRENTYEAR}}\",
+ url = \"{{canonicalurl:{{FULLPAGENAME}}|oldid={{REVISIONID}}}}\",
+ note = \"[온ë¼ì¸; 접근한 날짜 <citation>{{CURRENTYEAR}}ë…„-{{CURRENTMONTHNAME}}-{{CURRENTDAY}}ì¼</citation>]\"
}
-[[LaTeX]] 패키지 URL (<code>\\usepackage{url}</code> somewhere in the preamble)ì„ ì‚¬ìš©í•˜ë©´ ë” ì •ëˆëœ 형ì‹ì˜ 웹 주소를 ì–»ì„ ìˆ˜ 있습니다. 다ìŒê³¼ ê°™ì€ ë°©ë²•ì„ ì„ í˜¸í•©ë‹ˆë‹¤:
+[[LaTeX]] 패키지 URL (í”„ë¦¬ì•°ë¸”ì˜ ì–´ë”˜ê°€ì— <code>\\usepackage{url}</code>)ì„ ì‚¬ìš©í•˜ë©´ ë” ì •ëˆëœ 형ì‹ì˜ 웹 주소를 ì–»ì„ ìˆ˜ 있습니다. 다ìŒê³¼ ê°™ì€ ë°©ë²•ì„ ì„ í˜¸í•©ë‹ˆë‹¤:
@misc{ wiki:xxx,
- author = \"{{SITENAME}}\",
- title = \"{{FULLPAGENAME}} --- {{SITENAME}}{,} {{int:sitesubtitle}}\",
- year = \"{{CURRENTYEAR}}\",
- url = \"'''\\url{'''{{canonicalurl:{{FULLPAGENAME}}|oldid={{REVISIONID}}}}'''}'''\",
- note = \"[Online; accessed <citation>{{CURRENTDAY}}-{{CURRENTMONTHNAME}}-{{CURRENTYEAR}}</citation>]\"
+ author = \"{{SITENAME}}\",
+ title = \"{{FULLPAGENAME}} --- {{SITENAME}}{,} {{int:sitesubtitle}}\",
+ year = \"{{CURRENTYEAR}}\",
+ url = \"'''\\url{'''{{canonicalurl:{{FULLPAGENAME}}|oldid={{REVISIONID}}}}'''}'''\",
+ note = \"[온ë¼ì¸; 접근한 날짜 <citation>{{CURRENTYEAR}}ë…„-{{CURRENTMONTHNAME}}-{{CURRENTDAY}}ì¼</citation>]\"
}
@@ -3182,6 +3550,7 @@ $messages['ko'] = array(
*/
$messages['krc'] = array(
'cite_article_link' => 'Бетни цитата ÑÑ‚',
+ 'tooltip-cite-article' => 'Бу бетни къалай цитата Ñтерге керек болгъаныны ÑŽÑюнден информациÑ',
'cite' => 'Цитата Ñтиу',
);
@@ -3276,16 +3645,18 @@ $messages['ku-latn'] = array(
/** Cornish (kernowek)
* @author Kernoweger
* @author Kw-Moon
+ * @author Nrowe
*/
$messages['kw'] = array(
'cite_article_link' => 'Devynna an erthygel-ma',
- 'tooltip-cite-article' => 'Kedhlow war fatel devynna an folen-ma',
+ 'tooltip-cite-article' => 'Kedhlow war fatel dhevynnir an folen-ma',
'cite' => 'Devynna',
'cite_page' => 'Folen:',
'cite_submit' => 'Devynna',
);
/** Latin (Latina)
+ * @author Autokrator
* @author MissPetticoats
* @author SPQRobin
* @author UV
@@ -3293,6 +3664,7 @@ $messages['kw'] = array(
$messages['la'] = array(
'cite_article_desc' => ' Addet [[Special:Cite|citation]] specialem paginam et arcam instrumenti', # Fuzzy
'cite_article_link' => 'Hanc paginam citare',
+ 'tooltip-cite-article' => 'Institutiones de hanc pagina citanda',
'cite' => 'Paginam citare',
'cite_page' => 'Pagina:',
'cite_submit' => 'Citare',
@@ -3301,9 +3673,10 @@ $messages['la'] = array(
/** Luxembourgish (Lëtzebuergesch)
* @author Kaffi
* @author Robby
+ * @author Soued031
*/
$messages['lb'] = array(
- 'cite_article_desc' => "Setzt eng [[Special:Cite|Zitatioun op dëser Spezialsäit]] bäi an e Link an d'Geschiirkëscht",
+ 'cite_article_desc' => "Setzt eng [[Special:Cite|Zitatioun op dëser Spezialsäit]] bei an e Link an d'Geschiirkëscht",
'cite_article_link' => 'Dës Säit zitéieren',
'tooltip-cite-article' => 'Informatioune wéi een dës Säit zitéiere kann',
'cite' => 'Zitéierhëllef',
@@ -3426,6 +3799,16 @@ $messages['lo'] = array(
'cite_page' => 'ໜ້າ:',
);
+/** لوری (لوری)
+ * @author Mogoeilor
+ */
+$messages['lrc'] = array(
+ 'cite_article_link' => 'جاگه ای بلگه',
+ 'cite' => 'جاگه',
+ 'cite_page' => 'بلگه',
+ 'cite_submit' => 'جاگه',
+);
+
/** Lithuanian (lietuvių)
* @author Garas
*/
@@ -3526,6 +3909,13 @@ $messages['lzh'] = array(
'cite' => '引文',
);
+/** Malagasy (Malagasy)
+ * @author Jagwar
+ */
+$messages['mg'] = array(
+ 'cite_article_link' => 'Hitanisa ity pejy ity',
+);
+
/** Eastern Mari (олык марий)
* @author Сай
*/
@@ -3773,7 +4163,7 @@ $messages['mn'] = array(
* @author V.narsikar
*/
$messages['mr'] = array(
- 'cite_article_desc' => 'à¤à¤• विशेष [[Special:Cite|बाहà¥à¤¯à¤¦à¥à¤µà¥‡]] देणारे पान व टूलबॉकà¥à¤¸à¤šà¥€ लिंक तयार करा',
+ 'cite_article_desc' => 'à¤à¤• [[Special:Cite|बाहà¥à¤¯à¤¦à¥à¤µà¥‡]] देणारे विशेषपान व साधनपेटीचा दà¥à¤µà¤¾ जोडते',
'cite_article_link' => 'हे पान उधृत करा',
'tooltip-cite-article' => 'हे पृषà¥à¤  बघणà¥à¤¯à¤¾à¤¸à¤¾à¤ à¥€à¤šà¥€ माहिती',
'cite' => 'उधृत करा',
@@ -3968,7 +4358,7 @@ $messages['nan'] = array(
'cite_submit' => 'Ãn-iÅng',
);
-/** Norwegian Bokmål (norsk (bokmål)‎)
+/** Norwegian Bokmål (norsk bokmål)
* @author Nghtwlkr
*/
$messages['nb'] = array(
@@ -4065,7 +4455,7 @@ $messages['nds'] = array(
'cite_submit' => 'Ziteren',
);
-/** Nedersaksies (Nedersaksies)
+/** Low Saxon (Netherlands) (Nedersaksies)
* @author Servien
*/
$messages['nds-nl'] = array(
@@ -4075,6 +4465,65 @@ $messages['nds-nl'] = array(
'cite' => 'Siteerhulpe',
'cite_page' => 'Zied:',
'cite_submit' => 'Siteren',
+ 'cite_text' => "__NOTOC__
+<div class=\"mw-specialcite-bibliographic\">
+
+== Bibliografiese gegevens veur {{FULLPAGENAME}} ==
+
+* Ziednaam: {{FULLPAGENAME}}
+* Auteur: {{SITENAME}}-biedragers
+* Uutgever: ''{{SITENAME}}, {{int:sitesubtitle}}''.
+* Tiedstip leste versie: {{CURRENTDAY}} {{CURRENTMONTHNAME}} {{CURRENTYEAR}} {{CURRENTTIME}} UTC
+* Tiedstip eraodpleegd: <citation>{{CURRENTDAY}} {{CURRENTMONTHNAME}} {{CURRENTYEAR}} {{CURRENTTIME}} UTC</citation>
+* Permanente URL: {{canonicalurl:{{FULLPAGENAME}}|oldid={{REVISIONID}}}}
+* Ziedversienummer: {{REVISIONID}}
+
+</div>
+<div class=\"plainlinks mw-specialcite-styles\">
+
+== Sitaotstielen veur {{FULLPAGENAME}} ==
+
+=== [[APA-stiel]] ===
+{{FULLPAGENAME}}. ({{CURRENTYEAR}}, {{CURRENTMONTHNAME}} {{CURRENTDAY}}). ''{{SITENAME}}, {{int:sitesubtitle}}''. Eraodpleegd op <citation>{{CURRENTTIME}}, {{CURRENTMONTHNAME}} {{CURRENTDAY}}, {{CURRENTYEAR}}</citation> van {{canonicalurl:{{FULLPAGENAME}}|oldid={{REVISIONID}}}}.
+
+=== [[The MLA style manual|MLA-stiel]] ===
+\"{{FULLPAGENAME}}.\" ''{{SITENAME}}, {{int:sitesubtitle}}''. {{CURRENTDAY}} {{CURRENTMONTHABBREV}} {{CURRENTYEAR}}, {{CURRENTTIME}} UTC. <citation>{{CURRENTDAY}} {{CURRENTMONTHABBREV}} {{CURRENTYEAR}}, {{CURRENTTIME}}</citation> &lt;{{canonicalurl:{{FULLPAGENAME}}|oldid={{REVISIONID}}}}&gt;.
+
+=== [[MHRA Style Guide|MHRA-stiel]] ===
+{{SITENAME}}-biedragers, '{{FULLPAGENAME}}', ''{{SITENAME}}, {{int:sitesubtitle}},'' {{CURRENTDAY}} {{CURRENTMONTHNAME}} {{CURRENTYEAR}}, {{CURRENTTIME}} UTC, &lt;{{canonicalurl:{{FULLPAGENAME}}|oldid={{REVISIONID}}}}&gt; [eraodpleegd <citation>{{CURRENTDAY}} {{CURRENTMONTHNAME}} {{CURRENTYEAR}}</citation>]
+
+=== [[The Chicago Manual of Style|Chicago-stiel]] ===
+{{SITENAME}}-biedragers, \"{{FULLPAGENAME}},\" ''{{SITENAME}}, {{int:sitesubtitle}},'' {{canonicalurl:{{FULLPAGENAME}}|oldid={{REVISIONID}}}} (eraodpleegd <citation>{{CURRENTMONTHNAME}} {{CURRENTDAY}}, {{CURRENTYEAR}}</citation>).
+
+=== [[Council of Science Editors|CBE/CSE-stiel]] ===
+{{SITENAME}}-biedragers. {{FULLPAGENAME}} [Internet]. {{SITENAME}}, {{int:sitesubtitle}}; {{CURRENTYEAR}} {{CURRENTMONTHABBREV}} {{CURRENTDAY}}, {{CURRENTTIME}} UTC [sitaot van <citation>{{CURRENTYEAR}} {{CURRENTMONTHABBREV}} {{CURRENTDAY}}</citation>]. Beschikbaor op:
+{{canonicalurl:{{FULLPAGENAME}}|oldid={{REVISIONID}}}}.
+
+=== [[Bluebook|Bluebook-stiel]] ===
+{{FULLPAGENAME}}, {{canonicalurl:{{FULLPAGENAME}}|oldid={{REVISIONID}}}} (eraodpleegd op <citation>{{CURRENTMONTHNAME}} {{CURRENTDAY}}, {{CURRENTYEAR}}</citation>).
+
+=== [[BibTeX]]-gegevens ===
+
+ @misc{ wiki:xxx,
+ author = \"{{SITENAME}}\",
+ title = \"{{FULLPAGENAME}} --- {{SITENAME}}{,} {{int:sitesubtitle}}\",
+ year = \"{{CURRENTYEAR}}\",
+ url = \"{{canonicalurl:{{FULLPAGENAME}}|oldid={{REVISIONID}}}}\",
+ note = \"[Online; geraadpleegd <citation>{{CURRENTDAY}}-{{CURRENTMONTHNAME}}-{{CURRENTYEAR}}</citation>]\"
+ }
+
+t Volgende kan de veurkeur hebben as de [[LaTeX]]-module \"url\" gebruukt wörden (<code>\\usepackage{url}</code> argens in de inleiding), die webadressen mooier opmaakt:
+
+ @misc{ wiki:xxx,
+ author = \"{{SITENAME}}\",
+ title = \"{{FULLPAGENAME}} --- {{SITENAME}}{,} {{int:sitesubtitle}}\",
+ year = \"{{CURRENTYEAR}}\",
+ url = \"'''\\url{'''{{canonicalurl:{{FULLPAGENAME}}|oldid={{REVISIONID}}}}'''}'''\",
+ note = \"[Online; eraodpleegd <citation>{{CURRENTDAY}}-{{CURRENTMONTHNAME}}-{{CURRENTYEAR}}</citation>]\"
+ }
+
+
+</div> <!--closing div for \"plainlinks\"-->",
);
/** Nepali (नेपाली)
@@ -4165,7 +4614,7 @@ Het volgende kan de voorkeur hebben als de [[LaTeX]]-module \"url\" wordt gebrui
</div> <!--closing div for \"plainlinks\"-->",
);
-/** Norwegian Nynorsk (norsk (nynorsk)‎)
+/** Norwegian Nynorsk (norsk nynorsk)
* @author Gunnernett
* @author Harald Khan
* @author Jon Harald Søby
@@ -4199,7 +4648,7 @@ $messages['nso'] = array(
* @author Cedric31
*/
$messages['oc'] = array(
- 'cite_article_desc' => "Apond una pagina especiala [[Special:Cite|citacion]] e un ligam dins la bóstia d'espleches",
+ 'cite_article_desc' => "Apond una pagina especiala [[Special:Cite|citacion]] e un ligam dins la bóstia d'aisinas",
'cite_article_link' => 'Citar aqueste article',
'tooltip-cite-article' => 'Informacions sus cossí citar aquesta pagina',
'cite' => 'Citacion',
@@ -4265,7 +4714,7 @@ Se utilizatz lo package URL dins [[LaTeX]] (<code>\\usepackage{url}</code> endac
</div> <!--closing div for \"plainlinks\"-->",
);
-/** Oriya (ଓଡ଼ିଆ)
+/** Oriya (ଓଡ଼ିଆ)
* @author Jnanaranjan Sahu
* @author Psubhashish
*/
@@ -4498,7 +4947,7 @@ $messages['ps'] = array(
'tooltip-cite-article' => 'د Ø¯Û Ù…Ø® د درک لګولو مالومات',
'cite' => 'درک',
'cite_page' => 'مخ:',
- 'cite_submit' => 'درک لګول',
+ 'cite_submit' => 'درک لگول',
'cite_text' => "__NOTOC__
<div class=\"mw-specialcite-bibliographic\">
@@ -5226,11 +5675,12 @@ $messages['sr-ec'] = array(
/** Serbian (Latin script) (srpski (latinica)‎)
* @author Liangent
* @author Michaello
+ * @author Milicevic01
* @author Жељко Тодоровић
*/
$messages['sr-el'] = array(
'cite_article_desc' => 'Dodaje specijalnu stranu za [[Special:Cite|citiranje]] i vezu ka oruđima.',
- 'cite_article_link' => 'citiranje ove strane',
+ 'cite_article_link' => 'Bibliografski podaci',
'tooltip-cite-article' => 'Informacije o tome kako citirati ovu stranu',
'cite' => 'citat',
'cite_page' => 'Stranica:',
@@ -5994,7 +6444,7 @@ $messages['yue'] = array(
* @author Xiaomingyan
*/
$messages['zh-hans'] = array(
- 'cite_article_desc' => '增加[[Special:Cite|引用]]特殊页é¢ä»¥åŠå·¥å…·ç®±é“¾æŽ¥',
+ 'cite_article_desc' => '添加[[Special:Cite|引用]]特殊页é¢å’Œå·¥å…·ç®±é“¾æŽ¥',
'cite_article_link' => '引用本页',
'tooltip-cite-article' => '关于如何引用本页的信æ¯',
'cite' => '引用页é¢',
diff --git a/extensions/Cite/SpecialCite.php b/extensions/Cite/SpecialCite.php
index 6d9b8138..5990f548 100644
--- a/extensions/Cite/SpecialCite.php
+++ b/extensions/Cite/SpecialCite.php
@@ -22,7 +22,7 @@ $wgExtensionCredits['specialpage'][] = array(
'url' => 'https://www.mediawiki.org/wiki/Extension:Cite/Special:Cite.php'
);
-$dir = dirname( __FILE__ ) . '/';
+$dir = __DIR__ . '/';
# Internationalisation file
$wgExtensionMessagesFiles['SpecialCite'] = $dir . 'SpecialCite.i18n.php';
$wgExtensionMessagesFiles['SpecialCiteAliases'] = $dir . 'SpecialCite.alias.php';
@@ -35,12 +35,12 @@ $wgAutoloadClasses['SpecialCite'] = $dir . 'SpecialCite_body.php';
// Resources
$citeResourceTemplate = array(
- 'localBasePath' => dirname(__FILE__) . '/modules',
+ 'localBasePath' => __DIR__ . '/modules',
'remoteExtPath' => 'Cite/modules'
);
$wgResourceModules['ext.specialcite'] = $citeResourceTemplate + array(
- 'styles' => 'ext.specialcite/ext.specialcite.css',
+ 'styles' => 'ext.specialcite.css',
'scripts' => array(),
'position' => 'bottom',
);
diff --git a/extensions/Cite/citeCatTreeParserTests.txt b/extensions/Cite/citeCatTreeParserTests.txt
deleted file mode 100644
index 41362e62..00000000
--- a/extensions/Cite/citeCatTreeParserTests.txt
+++ /dev/null
@@ -1,27 +0,0 @@
-# Force the test runner to ensure the extension is loaded
-!! hooks
-ref
-references
-categorytree
-!! endhooks
-
-!! test
-Bug 20748 - <references /> doesn't work after category tree in some cases
-!! input
-<ref>ref</ref>
-
-<categorytree showcount=on>Articles tagged for deletion and rescue</categorytree>
-<references />
-!! result
-<p><sup id="cite_ref-0" class="reference"><a href="#cite_note-0">[1]</a></sup>
-</p>
-<div class="CategoryTreeTag" data-ct-mode="0" data-ct-options="{&quot;mode&quot;:0,&quot;hideprefix&quot;:20,&quot;showcount&quot;:true,&quot;namespaces&quot;:false}"><div class="CategoryTreeSection"><div class="CategoryTreeItem"><span class="CategoryTreeEmptyBullet">[<b>×</b>] </span> <a class="CategoryTreeLabel CategoryTreeLabelNs14 new CategoryTreeLabelCategory" href="/index.php?title=Category:Articles_tagged_for_deletion_and_rescue&amp;action=edit&amp;redlink=1">Articles tagged for deletion and rescue</a>‎ <span title="Contains 0 subcategories, 0 pages, and 0 files" dir="ltr">(empty)</span></div>
- <div class="CategoryTreeChildren" style="display:block"><i class="CategoryTreeNotice">no subcategories</i></div></div>
- </div>
-<ol class="references">
-<li id="cite_note-0"><span class="mw-cite-backlink"><a href="#cite_ref-0">↑</a></span> <span class="reference-text">ref</span>
-</li>
-</ol>
-
-!! end
-
diff --git a/extensions/Cite/citeParserTests.txt b/extensions/Cite/citeParserTests.txt
index ded8cc19..052cd56a 100644
--- a/extensions/Cite/citeParserTests.txt
+++ b/extensions/Cite/citeParserTests.txt
@@ -10,7 +10,7 @@ Simple <ref>, no <references/>
Wikipedia rocks!<ref>Proceeds of Rockology, vol. XXI</ref>
!! result
<p>Wikipedia rocks!<sup id="cite_ref-1" class="reference"><a href="#cite_note-1">[1]</a></sup>
-<br /><strong class="error">Cite error: <code>&lt;ref&gt;</code> tags exist, but no <code>&lt;references/&gt;</code> tag was found</strong>
+<br /><strong class="error mw-ext-cite-error">Cite error: <code>&lt;ref&gt;</code> tags exist, but no <code>&lt;references/&gt;</code> tag was found</strong>
</p>
!! end
@@ -122,7 +122,7 @@ Templating<ref>Text<!--comment--></ref>
!! result
<p><sup id="cite_ref-1" class="reference"><a href="#cite_note-1">[1]</a></sup>
</p>
-<ul class="gallery">
+<ul class="gallery mw-gallery-traditional">
<li class="gallerybox" style="width: 155px"><div style="width: 155px">
<div class="thumb" style="width: 150px;"><div style="margin:68px auto;"><a href="/wiki/File:Foobar.jpg" class="image"><img alt="Foobar.jpg" src="http://example.com/images/thumb/3/3a/Foobar.jpg/120px-Foobar.jpg" width="120" height="14" /></a></div></div>
<div class="gallerytext">
@@ -142,7 +142,7 @@ Templating<ref>Text<!--comment--></ref>
{{REVISIONID}}<ref>elite</ref>
!! result
<p>1337<sup id="cite_ref-1" class="reference"><a href="#cite_note-1">[1]</a></sup>
-<br /><strong class="error">Cite error: <code>&lt;ref&gt;</code> tags exist, but no <code>&lt;references/&gt;</code> tag was found</strong>
+<br /><strong class="error mw-ext-cite-error">Cite error: <code>&lt;ref&gt;</code> tags exist, but no <code>&lt;references/&gt;</code> tag was found</strong>
</p>
!! end
@@ -253,23 +253,23 @@ Erroneous refs
<references />
!! result
-<p><strong class="error">Cite error: Invalid <code>&lt;ref&gt;</code> tag;
+<p><strong class="error mw-ext-cite-error">Cite error: Invalid <code>&lt;ref&gt;</code> tag;
name cannot be a simple integer. Use a descriptive title</strong>
</p><p><sup id="cite_ref-1" class="reference"><a href="#cite_note-1">[1]</a></sup>
-</p><p><strong class="error">Cite error: Invalid <code>&lt;ref&gt;</code> tag;
+</p><p><strong class="error mw-ext-cite-error">Cite error: Invalid <code>&lt;ref&gt;</code> tag;
refs with no content must have a name</strong>
</p><p><sup id="cite_ref-bar_2-0" class="reference"><a href="#cite_note-bar-2">[2]</a></sup>
</p><p><sup id="cite_ref-blankwithnoreference_3-0" class="reference"><a href="#cite_note-blankwithnoreference-3">[3]</a></sup>
-</p><p><strong class="error">Cite error: Invalid <code>&lt;references&gt;</code> tag;
+</p><p><strong class="error mw-ext-cite-error">Cite error: Invalid <code>&lt;references&gt;</code> tag;
parameter "group" is allowed only.
Use <code>&lt;references /&gt;</code>, or <code>&lt;references group="..." /&gt;</code></strong>
</p>
<ol class="references">
<li id="cite_note-1"><span class="mw-cite-backlink"><a href="#cite_ref-1">↑</a></span> <span class="reference-text">Also zero, but differently! (Normal ref)</span>
</li>
-<li id="cite_note-bar"><span class="mw-cite-backlink"><a href="#cite_ref-bar_0">↑</a></span> <strong class="error">Cite error: Invalid <code>&lt;ref&gt;</code> tag;
+<li id="cite_note-bar"><span class="mw-cite-backlink"><a href="#cite_ref-bar_0">↑</a></span> <strong class="error mw-ext-cite-error">Cite error: Invalid <code>&lt;ref&gt;</code> tag;
no text was provided for refs named <code>bar</code></strong></li>
-<li id="cite_note-blankwithnoreference"><span class="mw-cite-backlink"><a href="#cite_ref-blankwithnoreference_0">↑</a></span> <strong class="error">Cite error: Invalid <code>&lt;ref&gt;</code> tag;
+<li id="cite_note-blankwithnoreference"><span class="mw-cite-backlink"><a href="#cite_ref-blankwithnoreference_0">↑</a></span> <strong class="error mw-ext-cite-error">Cite error: Invalid <code>&lt;ref&gt;</code> tag;
no text was provided for refs named <code>blankwithnoreference</code></strong></li>
</ol>
@@ -311,16 +311,20 @@ AAA<ref group="å‚">ref a</ref>BBB<ref group="注">note b</ref>CCC<ref group="å
!! result
<p>AAA<sup id="cite_ref-1" class="reference"><a href="#cite_note-1">[å‚ 1]</a></sup>BBB<sup id="cite_ref-2" class="reference"><a href="#cite_note-2">[注 1]</a></sup>CCC<sup id="cite_ref-3" class="reference"><a href="#cite_note-3">[å‚ 2]</a></sup>
</p>
-<dl><dt>refs
-</dt></dl>
+<dl>
+<dt>refs
+</dt>
+</dl>
<ol class="references">
<li id="cite_note-1"><span class="mw-cite-backlink"><a href="#cite_ref-1">↑</a></span> <span class="reference-text">ref a</span>
</li>
<li id="cite_note-3"><span class="mw-cite-backlink"><a href="#cite_ref-3">↑</a></span> <span class="reference-text">ref c</span>
</li>
</ol>
-<dl><dt>notes
-</dt></dl>
+<dl>
+<dt>notes
+</dt>
+</dl>
<ol class="references">
<li id="cite_note-2"><span class="mw-cite-backlink"><a href="#cite_ref-2">↑</a></span> <span class="reference-text">note b</span>
</li>
@@ -379,12 +383,12 @@ AAA<ref group="å‚">ref a</ref>BBB<ref group="注">note b</ref>CCC<ref group="å
<p><sup id="cite_ref-foo_1-0" class="reference"><a href="#cite_note-foo-1">[2 1]</a></sup>
</p>
<ol class="references">
-<li id="cite_note-foo"><span class="mw-cite-backlink"><a href="#cite_ref-foo_0">↑</a></span> <strong class="error">Cite error: Invalid <code>&lt;ref&gt;</code> tag;
+<li id="cite_note-foo"><span class="mw-cite-backlink"><a href="#cite_ref-foo_0">↑</a></span> <strong class="error mw-ext-cite-error">Cite error: Invalid <code>&lt;ref&gt;</code> tag;
no text was provided for refs named <code>foo</code></strong></li>
</ol>
-<p><strong class="error">Cite error: <code>&lt;ref&gt;</code> tag with name "unused" defined in <code>&lt;references&gt;</code> is not used in prior text.</strong><br />
-<strong class="error">Cite error: <code>&lt;ref&gt;</code> tag in <code>&lt;references&gt;</code> has conflicting group attribute "1".</strong><br />
-<strong class="error">Cite error: <code>&lt;ref&gt;</code> tag defined in <code>&lt;references&gt;</code> has no name attribute.</strong>
+<p><strong class="error mw-ext-cite-error">Cite error: <code>&lt;ref&gt;</code> tag with name "unused" defined in <code>&lt;references&gt;</code> is not used in prior text.</strong><br />
+<strong class="error mw-ext-cite-error">Cite error: <code>&lt;ref&gt;</code> tag in <code>&lt;references&gt;</code> has conflicting group attribute "1".</strong><br />
+<strong class="error mw-ext-cite-error">Cite error: <code>&lt;ref&gt;</code> tag defined in <code>&lt;references&gt;</code> has no name attribute.</strong>
</p>
!! end
diff --git a/extensions/Cite/modules/ext.cite.css b/extensions/Cite/modules/ext.cite.css
new file mode 100644
index 00000000..4ea7a814
--- /dev/null
+++ b/extensions/Cite/modules/ext.cite.css
@@ -0,0 +1,16 @@
+/**
+ * Per http://developer.yahoo.com/blogs/ydn/clip-hidden-content-better-accessibility-53456.html
+ * and https://en.wikipedia.org/w/index.php?oldid=572888139#Scrolling_past_the_bottom_of_the_page...
+ */
+.cite-accessibility-label {
+ position: absolute !important;
+ /* Workaround a Webkit/Blink bug about positioning within columns as many wikis format references with several columns */
+ top: -99999px;
+ clip: rect(1px 1px 1px 1px); /* IE6, IE7 */
+ clip: rect(1px, 1px, 1px, 1px);
+ padding: 0 !important;
+ border: 0 !important;
+ height: 1px !important;
+ width: 1px !important;
+ overflow: hidden;
+}
diff --git a/extensions/Cite/modules/ext.cite.js b/extensions/Cite/modules/ext.cite.js
new file mode 100644
index 00000000..fbec1f32
--- /dev/null
+++ b/extensions/Cite/modules/ext.cite.js
@@ -0,0 +1,38 @@
+/**
+ * Main JavaScript for the Cite extension. The main purpose of this file
+ * is to add accessibility attributes to the citation links as that can
+ * hardly be done server side (bug 38141).
+ *
+ * @author Marius Hoch <hoo@online.de>
+ */
+( function ( mw, $ ) {
+ 'use strict';
+
+ mw.hook( 'wikipage.content' ).add( function ( $content ) {
+ var accessibilityLabelOne = mw.msg( 'cite_references_link_accessibility_label' ),
+ accessibilityLabelMany = mw.msg( 'cite_references_link_many_accessibility_label' );
+
+ $content.find( '.mw-cite-backlink' ).each( function () {
+ var $links = $( this ).find( 'a' ),
+ label;
+
+ if ( $links.length > 1 ) {
+ // This citation is used multiple times. Let's only set the accessibility label on the first link, the
+ // following ones should then be self-explaining. This is needed to make sure this isn't getting
+ // too wordy.
+ label = accessibilityLabelMany;
+ } else {
+ label = accessibilityLabelOne;
+ }
+
+ // We can't use aria-label over here as that's not supported consistently across all screen reader / browser
+ // combinations. We have to use visually hidden spans for the accessibility labels instead.
+ $links.eq( 0 ).prepend(
+ $( '<span>' )
+ .addClass( 'cite-accessibility-label' )
+ // Also make sure we have at least one space between the accessibility label and the visual one
+ .text( label + ' ' )
+ );
+ } );
+ } );
+} )( mediaWiki, jQuery );
diff --git a/extensions/Cite/modules/ext.cite.popups.js b/extensions/Cite/modules/ext.cite.popups.js
new file mode 100644
index 00000000..eb1e5079
--- /dev/null
+++ b/extensions/Cite/modules/ext.cite.popups.js
@@ -0,0 +1,13 @@
+( function ( mw, $ ) {
+ 'use strict';
+
+ mw.hook( 'wikipage.content' ).add( function ( $content ) {
+ $content.find( '.biblio-cite-link,sup.reference a' ).tooltip( {
+ bodyHandler: function () {
+ return $content.find( '#' + this.hash.substr( 1 ) + ' > .reference-text' )
+ .html();
+ },
+ showURL: false
+ } );
+ } );
+} )( mediaWiki, jQuery );
diff --git a/extensions/Cite/modules/ext.cite/ext.cite.js b/extensions/Cite/modules/ext.cite/ext.cite.js
deleted file mode 100644
index dc7328b4..00000000
--- a/extensions/Cite/modules/ext.cite/ext.cite.js
+++ /dev/null
@@ -1,12 +0,0 @@
-( function($) {
- $( function() {
- $('.biblio-cite-link,sup.reference a').tooltip({
- bodyHandler: function() {
- return $( '#' + this.hash.substr(1) + ' > .reference-text' )
- .html();
- },
- showURL : false
- } );
- } );
-
-} )( jQuery );
diff --git a/extensions/Cite/modules/ext.rtlcite/ext.rtlcite.css b/extensions/Cite/modules/ext.rtlcite.css
index 9b88d531..9b88d531 100644
--- a/extensions/Cite/modules/ext.rtlcite/ext.rtlcite.css
+++ b/extensions/Cite/modules/ext.rtlcite.css
diff --git a/extensions/Cite/modules/ext.specialcite/ext.specialcite.css b/extensions/Cite/modules/ext.specialcite.css
index 65a4e40e..65a4e40e 100644
--- a/extensions/Cite/modules/ext.specialcite/ext.specialcite.css
+++ b/extensions/Cite/modules/ext.specialcite.css
diff --git a/extensions/ConfirmEdit/ApiFancyCaptchaReload.php b/extensions/ConfirmEdit/ApiFancyCaptchaReload.php
index 1de1947d..9b918d85 100644
--- a/extensions/ConfirmEdit/ApiFancyCaptchaReload.php
+++ b/extensions/ConfirmEdit/ApiFancyCaptchaReload.php
@@ -1,4 +1,4 @@
-<?
+<?php
/**
* Api module to reload FancyCaptcha
*
diff --git a/extensions/ConfirmEdit/Asirra.class.php b/extensions/ConfirmEdit/Asirra.class.php
index bd58eb3a..ae1178a1 100644
--- a/extensions/ConfirmEdit/Asirra.class.php
+++ b/extensions/ConfirmEdit/Asirra.class.php
@@ -5,7 +5,7 @@
*/
class Asirra extends SimpleCaptcha {
- public $asirra_clientscript = 'http://challenge.asirra.com/js/AsirraClientSide.js';
+ public $asirra_clientscript = '//challenge.asirra.com/js/AsirraClientSide.js';
// As we don't have to store anything but some other things to do,
// we're going to replace that constructor completely.
diff --git a/extensions/ConfirmEdit/Asirra.i18n.php b/extensions/ConfirmEdit/Asirra.i18n.php
index 75f33a76..45811ce3 100644
--- a/extensions/ConfirmEdit/Asirra.i18n.php
+++ b/extensions/ConfirmEdit/Asirra.i18n.php
@@ -11,12 +11,12 @@ $messages = array();
$messages['en'] = array(
'asirra-desc' => 'Asirra module for ConfirmEdit',
- 'asirra-edit' => 'To help protect against automated edit spam, please select just the cat photos in the box below:',
- 'asirra-addurl' => 'Your edit includes new external links. To help protect against automated spam, please select just the cat photos in the box below:',
- 'asirra-badpass' => 'To help protect against automated password cracking, please select just the cat photos in the box below:',
- 'asirra-createaccount' => 'To help protect against automated account creation, please select just the cat photos in the box below:',
+ 'asirra-edit' => 'To protect the wiki against automated edit spam, we kindly ask you to select just the cat photos in the box below:',
+ 'asirra-addurl' => 'Your edit includes new external links. To protect the wiki against automated edit spam, we kindly ask you to select just the cat photos in the box below:',
+ 'asirra-badlogin' => 'To protect the wiki against automated password cracking, we kindly ask you to select just the cat photos in the box below:',
+ 'asirra-createaccount' => 'To protect the wiki against automated account creation, we kindly ask you to select just the cat photos in the box below:',
'asirra-createaccount-fail' => "Please correctly identify the cats.",
- 'asirra-create' => 'To help protect against automated page creation, please select just the cat photos in the box below:',
+ 'asirra-create' => 'To protect the wiki against automated page creation, we kindly ask you to select just the cat photos in the box below:',
'asirra-nojs' => '\'\'\'Please enable JavaScript and resubmit the page.\'\'\'',
'asirra-failed' => 'Please identify all cat images',
);
@@ -24,13 +24,14 @@ $messages['en'] = array(
/** Message documentation (Message documentation)
* @author 2nd-player
* @author Beta16
+ * @author Raymond
* @author Shirayuki
*/
$messages['qqq'] = array(
'asirra-desc' => '{{desc|name=Asirra|url=http://www.mediawiki.org/wiki/Extension:Asirra}}',
'asirra-edit' => '{{Related|ConfirmEdit-edit}}',
'asirra-addurl' => '{{Related|ConfirmEdit-addurl}}',
- 'asirra-badpass' => '{{Related|ConfirmEdit-badlogin}}',
+ 'asirra-badlogin' => '{{Related|ConfirmEdit-badlogin}}',
'asirra-createaccount' => '{{Related|ConfirmEdit-createaccount}}',
'asirra-createaccount-fail' => 'Used as failure message in JavaScript code.
{{Related|ConfirmEdit-createaccount-fail}}',
@@ -44,12 +45,12 @@ $messages['qqq'] = array(
*/
$messages['ast'] = array(
'asirra-desc' => 'Módulu Asirra pa ConfirmEdit',
- 'asirra-edit' => "P'ayudanos a protexenos escontra el spam d'edición automática, esbille namái les fotos de gatos nel cuadru d'abaxo:",
- 'asirra-addurl' => "La so edición incluye enllaces esternos nuevos. P'ayudar a protexenos escontra'l spam automáticu, esbille namái les fotos de gatos nel cuadru d'abaxo:",
- 'asirra-badpass' => "P'ayudar a protexenos escontra'l frayamientu de claves automáticu, esbille namái les fotos de gatos nel cuadru d'abaxo:",
- 'asirra-createaccount' => "P'ayudar a protexenos escontra la creación de cuentes automática, esbille namái les fotos de gatos nel cuadru d'abaxo:",
+ 'asirra-edit' => "Pa protexer la wiki escontra'l spam d'edición automáticu, pidimos-y qu'esbille namái les fotos de gatos del cuadru d'abaxo:",
+ 'asirra-addurl' => "La so edición incluye enllaces esternos nuevos. Pa protexer la wiki escontra'l spam automáticu, pidimos-y qu'esbille namái les fotos de gatos del cuadru d'abaxo:",
+ 'asirra-badlogin' => "Pa protexer la wiki escontra'l frayamientu de claves automáticu, pidimos-y qu'esbille namái les fotos de gatos del cuadru d'abaxo:",
+ 'asirra-createaccount' => "Pa protexer la wiki escontra la creación de cuentes automática, pidimos-y qu'esbille namái les fotos de gatos del cuadru d'abaxo:",
'asirra-createaccount-fail' => 'Identifique correutamente los gatos.',
- 'asirra-create' => "P'ayudar a protexenos escontra la creación de páxines automática, esbille namái les fotos de gatos nel cuadru d'abaxo:",
+ 'asirra-create' => "Pa protexer la wiki escontra la creación de páxines automática, pidimos-y qu'esbille namái les fotos de gatos del cuadru d'abaxo:",
'asirra-nojs' => "'''Por favor active JavaScript y vuelva a unviar la páxina.'''",
'asirra-failed' => 'Identifique toles imaxes de gatos',
);
@@ -61,16 +62,23 @@ $messages['ast'] = array(
*/
$messages['be-tarask'] = array(
'asirra-desc' => 'Модуль Asirra Ð´Ð»Ñ ConfirmEdit',
- 'asirra-edit' => 'Ð”Ð»Ñ Ð°Ð±Ð°Ñ€Ð¾Ð½Ñ‹ Ñупраць Ñпаму, калі лаÑка, выберыце толькі фота з катом Ñž полі ніжÑй:',
- 'asirra-addurl' => 'Вашае Ñ€Ñдагаваньне ўтрымлівае Ð½Ð¾Ð²Ñ‹Ñ Ð²Ð¾Ð½ÐºÐ°Ð²Ñ‹Ñ ÑпаÑылкі. Ð”Ð»Ñ Ð°Ð±Ð°Ñ€Ð¾Ð½Ñ‹ Ñупраць Ñпаму, калі лаÑка, выберыце толькі фота з катом Ñž полі ніжÑй:',
- 'asirra-badpass' => 'Ð”Ð»Ñ Ð°Ð±Ð°Ñ€Ð¾Ð½Ñ‹ Ñупраць аўтаматычнага падбору паролю, калі лаÑка, выберыце толькі фота з катом Ñž полі ніжÑй:',
- 'asirra-createaccount' => 'Ð”Ð»Ñ Ð°Ð±Ð°Ñ€Ð¾Ð½Ñ‹ Ñупраць аўтаматычнага ÑтварÑÐ½ÑŒÐ½Ñ Ñ€Ð°Ñ…ÑƒÐ½ÐºÐ°Ñž, калі лаÑка, выберыце толькі фота з катом Ñž полі ніжÑй:',
+ 'asirra-edit' => 'Ð”Ð»Ñ Ð°Ð±Ð°Ñ€Ð¾Ð½Ñ‹ Ñупраць Ñпаму, калі лаÑка, выберыце толькі фота з катом Ñž полі ніжÑй:', # Fuzzy
+ 'asirra-addurl' => 'Вашае Ñ€Ñдагаваньне ўтрымлівае Ð½Ð¾Ð²Ñ‹Ñ Ð²Ð¾Ð½ÐºÐ°Ð²Ñ‹Ñ ÑпаÑылкі. Ð”Ð»Ñ Ð°Ð±Ð°Ñ€Ð¾Ð½Ñ‹ Ñупраць Ñпаму, калі лаÑка, выберыце толькі фота з катом Ñž полі ніжÑй:', # Fuzzy
+ 'asirra-badlogin' => 'Ð”Ð»Ñ Ð°Ð±Ð°Ñ€Ð¾Ð½Ñ‹ Ñупраць аўтаматычнага падбору паролю, калі лаÑка, выберыце толькі фота з катом Ñž полі ніжÑй:', # Fuzzy
+ 'asirra-createaccount' => 'Ð”Ð»Ñ Ð°Ð±Ð°Ñ€Ð¾Ð½Ñ‹ Ñупраць аўтаматычнага ÑтварÑÐ½ÑŒÐ½Ñ Ñ€Ð°Ñ…ÑƒÐ½ÐºÐ°Ñž, калі лаÑка, выберыце толькі фота з катом Ñž полі ніжÑй:', # Fuzzy
'asirra-createaccount-fail' => 'Калі лаÑка, Ñлушна выберыце катоў.',
- 'asirra-create' => 'Ð”Ð»Ñ Ð°Ð±Ð°Ñ€Ð¾Ð½Ñ‹ Ñупраць аўтаматычнага ÑтварÑÐ½ÑŒÐ½Ñ Ñтаронак, калі лаÑка, выберыце толькі фота з катом Ñž полі ніжÑй:',
+ 'asirra-create' => 'Ð”Ð»Ñ Ð°Ð±Ð°Ñ€Ð¾Ð½Ñ‹ Ñупраць аўтаматычнага ÑтварÑÐ½ÑŒÐ½Ñ Ñтаронак, калі лаÑка, выберыце толькі фота з катом Ñž полі ніжÑй:', # Fuzzy
'asirra-nojs' => "'''Калі лаÑка, дазвольце JavaScript Ñ– дашліце Ñтаронку зноў.'''",
'asirra-failed' => 'Калі лаÑка, вызначце ÑžÑе выÑвы з катамі',
);
+/** Breton (brezhoneg)
+ * @author Fohanno
+ */
+$messages['br'] = array(
+ 'asirra-nojs' => "'''Gweredekait JavaScript, mar plij, hag adkasit ar bajenn.'''",
+);
+
/** Czech (Äesky)
* @author Vks
*/
@@ -80,15 +88,16 @@ $messages['cs'] = array(
/** German (Deutsch)
* @author Kghbln
+ * @author Metalhead64
*/
$messages['de'] = array(
'asirra-desc' => 'Ermöglicht die Nutzung des Anti-Spam-Moduls Asirra',
- 'asirra-edit' => 'Zum Schutz vor automatisiertem Spam bitten wir dich, nur die Fotos mit Katzen im untenstehenden Feld auszuwählen:',
- 'asirra-addurl' => 'Deine Bearbeitung enthält neue externe Links. Zum Schutz vor automatisiertem Spam bitten wir dich, nur die Fotos mit Katzen im untenstehenden Feld auszuwählen:',
- 'asirra-badpass' => 'Zum Schutz gegen automatisiertes Knacken von Passwörtern bitten wir dich, nur die Fotos mit Katzen im untenstehenden Feld auszuwählen:',
- 'asirra-createaccount' => 'Zum Schutz gegen automatisiertes Erstellen von Benutzerkonten bitten wir dich, nur die Fotos mit Katzen im untenstehenden Feld auszuwählen:',
+ 'asirra-edit' => 'Zum Schutz des Wikis vor automatisiertem Spam bitten wir dich, nur die Fotos mit Katzen im untenstehenden Feld auszuwählen:',
+ 'asirra-addurl' => 'Deine Bearbeitung enthält neue externe Links. Zum Schutz des Wikis vor automatisiertem Spam bitten wir dich, nur die Fotos mit Katzen im untenstehenden Feld auszuwählen:',
+ 'asirra-badlogin' => 'Zum Schutz des Wikis gegen automatisiertes Knacken von Passwörtern bitten wir dich, nur die Fotos mit Katzen im untenstehenden Feld auszuwählen:',
+ 'asirra-createaccount' => 'Zum Schutz des Wikis gegen automatisiertes Erstellen von Benutzerkonten bitten wir dich, nur die Fotos mit Katzen im untenstehenden Feld auszuwählen:',
'asirra-createaccount-fail' => 'Bitte wähle nur die Fotos mit Katzen aus.',
- 'asirra-create' => 'Zum Schutz gegen automatisiertes Erstellen von Seiten bitten wir dich, nur die Fotos mit Katzen im untenstehenden Feld auszuwählen:',
+ 'asirra-create' => 'Zum Schutz des Wikis gegen automatisiertes Erstellen von Seiten bitten wir dich, nur die Fotos mit Katzen im untenstehenden Feld auszuwählen:',
'asirra-nojs' => "'''Bitte JavaScript aktivieren und die Seiten nochmals Speichern.'''",
'asirra-failed' => 'Bitte wähle nur die Fotos mit Katzen aus.',
);
@@ -97,11 +106,11 @@ $messages['de'] = array(
* @author Kghbln
*/
$messages['de-formal'] = array(
- 'asirra-addurl' => 'Ihre Bearbeitung enthält neue externe Links. Zum Schutz vor automatisiertem Spam bitten wir Sie, nur die Fotos mit Katzen im untenstehenden Feld auszuwählen:',
- 'asirra-badpass' => 'Zum Schutz gegen automatisiertes Knacken von Passwörtern bitten wir Sie, nur die Fotos mit Katzen im untenstehenden Feld auszuwählen:',
- 'asirra-createaccount' => 'Zum Schutz gegen automatisiertes Erstellen von Benutzerkonten bitten wir Sie, nur die Fotos mit Katzen im untenstehenden Feld auszuwählen:',
+ 'asirra-addurl' => 'Ihre Bearbeitung enthält neue externe Links. Zum Schutz vor automatisiertem Spam bitten wir Sie, nur die Fotos mit Katzen im untenstehenden Feld auszuwählen:', # Fuzzy
+ 'asirra-badlogin' => 'Zum Schutz gegen automatisiertes Knacken von Passwörtern bitten wir Sie, nur die Fotos mit Katzen im untenstehenden Feld auszuwählen:', # Fuzzy
+ 'asirra-createaccount' => 'Zum Schutz gegen automatisiertes Erstellen von Benutzerkonten bitten wir Sie, nur die Fotos mit Katzen im untenstehenden Feld auszuwählen:', # Fuzzy
'asirra-createaccount-fail' => 'Bitte wählen Sie nur die Fotos mit Katzen aus.',
- 'asirra-create' => 'Zum Schutz gegen automatisiertes Erstellen von Seiten bitten wir Sie, nur die Fotos mit Katzen im untenstehenden Feld auszuwählen:',
+ 'asirra-create' => 'Zum Schutz gegen automatisiertes Erstellen von Seiten bitten wir Sie, nur die Fotos mit Katzen im untenstehenden Feld auszuwählen:', # Fuzzy
'asirra-failed' => 'Bitte wählen Sie nur die Fotos mit Katzen aus.',
);
@@ -117,12 +126,12 @@ $messages['diq'] = array(
*/
$messages['es'] = array(
'asirra-desc' => 'Módulo de Asirra para ConfirmEdit',
- 'asirra-edit' => 'Para ayudar a protegernos contra el spam de edición automática, seleccione sólo las fotos de gatos en el cuadro siguiente:',
- 'asirra-addurl' => 'Su edición incluye nuevos enlaces externos. Para ayudar a protegernos contra el spam automatizado, por favor, seleccione solo las fotos de gato en el cuadro siguiente:',
- 'asirra-badpass' => 'Para ayudar a protegernos del robo automatizado de contraseñas, seleccione sólo las fotos de gatos en el cuadro siguiente:',
- 'asirra-createaccount' => 'Para ayudar a protegernos contra la creación automatizada de cuentas, seleccione sólo las fotos de gato en el cuadro siguiente:',
+ 'asirra-edit' => 'Para ayudar a protegernos contra el spam de edición automática, seleccione sólo las fotos de gatos en el cuadro siguiente:', # Fuzzy
+ 'asirra-addurl' => 'Su edición incluye nuevos enlaces externos. Para ayudar a protegernos contra el spam automatizado, por favor, seleccione solo las fotos de gato en el cuadro siguiente:', # Fuzzy
+ 'asirra-badlogin' => 'Para ayudar a protegernos del robo automatizado de contraseñas, seleccione sólo las fotos de gatos en el cuadro siguiente:', # Fuzzy
+ 'asirra-createaccount' => 'Para ayudar a protegernos contra la creación automatizada de cuentas, seleccione sólo las fotos de gato en el cuadro siguiente:', # Fuzzy
'asirra-createaccount-fail' => 'Identifique correctamente los gatos.',
- 'asirra-create' => 'Para ayudar a protegernos contra la creación automática de páginas, seleccione sólo las fotos de gato en el cuadro siguiente:',
+ 'asirra-create' => 'Para ayudar a protegernos contra la creación automática de páginas, seleccione sólo las fotos de gato en el cuadro siguiente:', # Fuzzy
'asirra-nojs' => "'''Por favor active JavaScript y vuelva a la página.'''",
'asirra-failed' => 'Identifique todas las imágenes de gatos',
);
@@ -132,12 +141,12 @@ $messages['es'] = array(
*/
$messages['fi'] = array(
'asirra-desc' => 'Asirra-moduuli muokkauksen varmennukseen',
- 'asirra-edit' => 'Suojana automaattisia roskamuokkauksia vastaan sinun on valittava kissan kuvat laatikosta alla:',
- 'asirra-addurl' => 'Muokkauksesi sisältää uusia ulkoisia linkkejä. Suojana automaattista roskapostia vastaan sinun on valittava kissan kuvat laatikosta alla:',
- 'asirra-badpass' => 'Suojana automaattisia salasanamurtoja vastaan sinun on valittava kissan kuvat laatikosta alla:',
- 'asirra-createaccount' => 'Suojana automaattista tunnusten luontia vastaan sinun on valittava kissan kuvat laatikosta alla:',
+ 'asirra-edit' => 'Suojana automaattisia roskamuokkauksia vastaan sinun on valittava kissan kuvat laatikosta alla:', # Fuzzy
+ 'asirra-addurl' => 'Muokkauksesi sisältää uusia ulkoisia linkkejä. Suojana automaattista roskapostia vastaan sinun on valittava kissan kuvat laatikosta alla:', # Fuzzy
+ 'asirra-badlogin' => 'Suojana automaattisia salasanamurtoja vastaan sinun on valittava kissan kuvat laatikosta alla:', # Fuzzy
+ 'asirra-createaccount' => 'Suojana automaattista tunnusten luontia vastaan sinun on valittava kissan kuvat laatikosta alla:', # Fuzzy
'asirra-createaccount-fail' => 'Tunnista kissat.',
- 'asirra-create' => 'Suojana automaattista sivujen luontia vastaan sinun on valittava kissan kuvat laatikosta alla:',
+ 'asirra-create' => 'Suojana automaattista sivujen luontia vastaan sinun on valittava kissan kuvat laatikosta alla:', # Fuzzy
'asirra-nojs' => "'''Salli JavaScript ja lähetä uudelleen.'''",
'asirra-failed' => 'Tunnista kaikki kissan kuvat',
);
@@ -149,12 +158,12 @@ $messages['fi'] = array(
*/
$messages['fr'] = array(
'asirra-desc' => 'Module Asirra pour ConfirmEdit',
- 'asirra-edit' => "Pour aider à nous protéger contre le spam d’édition automatique, veuillez sélectionner '''uniquement les photos de chats''' dans la boîte ci-dessous :",
- 'asirra-addurl' => 'Votre édition contient des liens externes. Pour nous aider à nous protéger contre le spam automatique, veuillez sélectionner uniquement les photos de chats dans la boîte ci-dessous :',
- 'asirra-badpass' => 'Pour nous aider à nous protéger des essais automatiques de cassage de mot de passe, veuillez sélectionner uniquement les photos de chats dans la boîte ci-dessous :',
- 'asirra-createaccount' => "Pour nous aider à nous protéger contre la création automatique de comptes, veuillez sélectionner '''uniquement les photos de chats''' dans la boîte ci-dessous :",
+ 'asirra-edit' => 'Pour protéger le wiki contre le spam d’édition automatique, nous vous demandons de bien vouloir sélectionner uniquement les photos de chats dans la boîte ci-dessous :',
+ 'asirra-addurl' => 'Votre édition contient des liens externes. Pour protéger le wiki contre le spam de modification automatique, nous vous demandons de bien vouloir sélectionner uniquement les photos de chats dans la boîte ci-dessous :',
+ 'asirra-badlogin' => 'Pour protéger le wiki des essais automatiques de cassage de mot de passe, nous vous demandons de bien vouloir sélectionner uniquement les photos de chats dans la boîte ci-dessous :',
+ 'asirra-createaccount' => 'Pour protéger le wiki contre la création automatique de comptes, nous vous demandons de bien vouloir sélectionner uniquement les photos de chats dans la boîte ci-dessous :',
'asirra-createaccount-fail' => 'Veuillez identifier correctement les chats.',
- 'asirra-create' => 'Pour nous aider à nous protéger contre la création automatique de pages, veuillez sélectionner uniquement les photos de chats dans la boîte ci-dessous :',
+ 'asirra-create' => 'Pour protéger le wiki contre la création automatique de pages, nous vous demandons de bien vouloir sélectionner uniquement les photos de chats dans la boîte ci-dessous :',
'asirra-nojs' => "'''Veuillez activer le JavaScript et re-soumettre la page.'''",
'asirra-failed' => 'Veuillez identifier toutes les images de chat',
);
@@ -164,12 +173,12 @@ $messages['fr'] = array(
*/
$messages['gl'] = array(
'asirra-desc' => 'Módulo Asirra para ConfirmEdit',
- 'asirra-edit' => 'Para axudarnos á protección contra o spam, seleccione só as fotos de gatos na caixa:',
- 'asirra-addurl' => 'A súa edición inclúe novas ligazóns externas. Para axudar na protección contra o spam automático, seleccione só as fotos de gatos na caixa:',
- 'asirra-badpass' => 'Para axudarnos á protección contra o roubo de contrasinais, seleccione só as fotos de gatos na caixa:',
- 'asirra-createaccount' => 'Para axudarnos á protección contra a creación automática de contas, seleccione só as fotos de gatos na caixa:',
+ 'asirra-edit' => 'Para protexer o wiki contra o spam automático, seleccione só as fotos de gatos na caixa:',
+ 'asirra-addurl' => 'A súa edición inclúe novas ligazóns externas. Para protexer o wiki contra o spam automático, seleccione só as fotos de gatos na caixa:',
+ 'asirra-badlogin' => 'Para protexer o wiki contra o roubo de contrasinais, seleccione só as fotos de gatos na caixa:',
+ 'asirra-createaccount' => 'Para protexer o wiki contra a creación automática de contas, seleccione só as fotos de gatos na caixa:',
'asirra-createaccount-fail' => 'Identifique correctamente os gatos.',
- 'asirra-create' => 'Para axudarnos á protección contra a creación automática de páxinas, seleccione só as fotos de gatos na caixa:',
+ 'asirra-create' => 'Para protexer o wiki contra a creación automática de páxinas, seleccione só as fotos de gatos na caixa:',
'asirra-nojs' => "'''Active o JavaScript e volva enviar a páxina.'''",
'asirra-failed' => 'Identifique todas as fotos de gatos',
);
@@ -179,12 +188,12 @@ $messages['gl'] = array(
*/
$messages['hsb'] = array(
'asirra-desc' => 'Modul Asirra za ConfirmEdit',
- 'asirra-edit' => 'Za Å¡kit pÅ™ećiwo awtomatizowanemu spamej, proÅ¡u wubjer jenož fota kóÄkow w slÄ›dowacym polu:',
- 'asirra-addurl' => 'Twoja zmÄ›na wobsahuje nowe eksterne wotkazy. Za Å¡kit pÅ™ećiwo awtomatizowanemu spamej, proÅ¡u wubjer jenož fota kóÄkow w slÄ›dowacym polu:',
- 'asirra-badpass' => 'Za Å¡kit pÅ™ećiwo awtomatizowanemu zÅ‚amanju hesÅ‚ow, proÅ¡u wubjer jenož fota kóÄkow w slÄ›dowacym polu:',
- 'asirra-createaccount' => 'Za Å¡kit pÅ™ećiwo awtomatiskemu wutworjenju konta, proÅ¡u wubjer jenož fota kóÄkow w slÄ›dowacym polu:',
+ 'asirra-edit' => 'Za Å¡kit pÅ™ećiwo awtomatizowanemu spamej, proÅ¡u wubjer jenož fota kóÄkow w slÄ›dowacym polu:', # Fuzzy
+ 'asirra-addurl' => 'Twoja zmÄ›na wobsahuje nowe eksterne wotkazy. Za Å¡kit pÅ™ećiwo awtomatizowanemu spamej, proÅ¡u wubjer jenož fota kóÄkow w slÄ›dowacym polu:', # Fuzzy
+ 'asirra-badlogin' => 'Za Å¡kit pÅ™ećiwo awtomatizowanemu zÅ‚amanju hesÅ‚ow, proÅ¡u wubjer jenož fota kóÄkow w slÄ›dowacym polu:', # Fuzzy
+ 'asirra-createaccount' => 'Za Å¡kit pÅ™ećiwo awtomatiskemu wutworjenju konta, proÅ¡u wubjer jenož fota kóÄkow w slÄ›dowacym polu:', # Fuzzy
'asirra-createaccount-fail' => 'ProÅ¡u identifikuj kóÄki.',
- 'asirra-create' => 'Za Å¡kit pÅ™ećiwo awtomatiskemu wutworjenju strony, proÅ¡u wubjer jenož fota kóÄkow w slÄ›dowacym polu:',
+ 'asirra-create' => 'Za Å¡kit pÅ™ećiwo awtomatiskemu wutworjenju strony, proÅ¡u wubjer jenož fota kóÄkow w slÄ›dowacym polu:', # Fuzzy
'asirra-nojs' => "'''Prošu zmóžń JavaScript a składuj stronu hišće raz.'''",
'asirra-failed' => 'ProÅ¡u identifikuj wÅ¡Ä› wobrazy z kóÄkami',
);
@@ -194,12 +203,12 @@ $messages['hsb'] = array(
*/
$messages['ia'] = array(
'asirra-desc' => 'Modulo de Asirra pro ConfirmEdit',
- 'asirra-edit' => 'Pro adjutar a proteger nos contra le spam automatisate, per favor selige solmente le photos de cattos in le quadro sequente:',
- 'asirra-addurl' => 'Iste modification include nove ligamines externe. Pro adjutar a proteger nos contra le spam automatisate, per favor selige solmente le photos de cattos in le quadro sequente:',
- 'asirra-badpass' => 'Pro adjutar a proteger nos contra le furto automatisate de contrasignos, per favor selige solmente le photos de catto in le quadro sequente:',
- 'asirra-createaccount' => 'Pro adjutar a proteger nos contra le creation automatisate de contos, per favor selige solmente le photos de cattos in le quadro sequente:',
+ 'asirra-edit' => 'Pro adjutar a proteger le wiki contra le spam automatisate, per favor selige solmente le photos de cattos in le quadro sequente:',
+ 'asirra-addurl' => 'Iste modification include nove ligamines externe. Pro adjutar a proteger le wiki contra le spam automatisate, per favor selige solmente le photos de cattos in le quadro sequente:',
+ 'asirra-badlogin' => 'Pro adjutar a proteger le wiki contra le furto automatisate de contrasignos, per favor selige solmente le photos de cattos in le quadro sequente:',
+ 'asirra-createaccount' => 'Pro adjutar a proteger le wiki contra le creation automatisate de contos, per favor selige solmente le photos de cattos in le quadro sequente:',
'asirra-createaccount-fail' => 'Per favor identifica correctemente le cattos.',
- 'asirra-create' => 'Pro adjutar a proteger nos contra le creation automatisate de paginas, per favor selige solmente le photos de cattos in le quadro sequente:',
+ 'asirra-create' => 'Pro adjutar a proteger le wiki contra le creation automatisate de paginas, per favor selige solmente le photos de cattos in le quadro sequente:',
'asirra-nojs' => "'''Per favor activa JavaScript e resubmitte le pagina.'''",
'asirra-failed' => 'Per favor identifica tote le imagines de cattos',
);
@@ -209,12 +218,12 @@ $messages['ia'] = array(
*/
$messages['it'] = array(
'asirra-desc' => 'Modulo ASIRRA per ConfirmEdit',
- 'asirra-edit' => 'Per aiutarci a proteggerci dalle modifiche automatiche che aggiungono spam, seleziona solo le foto di gatti nel riquadro sottostante:',
- 'asirra-addurl' => 'La tua modifica aggiunge qualche nuovo collegamento esterno. Per aiutarci a proteggerci dallo spam automatico, seleziona solo le foto di gatti nel riquadro sottostante:',
- 'asirra-badpass' => 'Per aiutarci a proteggerci dalla forzatura automatica delle password, seleziona solo le foto di gatti nel riquadro sottostante:',
- 'asirra-createaccount' => 'Per aiutarci a proteggerci dalla creazione automatica di nuovi accessi, seleziona solo le foto di gatti nel riquadro sottostante:',
+ 'asirra-edit' => 'Per proteggere il wiki dalle modifiche automatiche che aggiungono spam, ti chiediamo gentilmente di selezionare solo le foto di gatti nel riquadro sottostante:',
+ 'asirra-addurl' => 'La tua modifica aggiunge qualche nuovo collegamento esterno. Per proteggere il wiki dallo spam automatico, ti chiediamo gentilmente di selezionare solo le foto di gatti nel riquadro sottostante:',
+ 'asirra-badlogin' => 'Per proteggere il wiki dalla forzatura automatica delle password, ti chiediamo gentilmente di selezionare solo le foto di gatti nel riquadro sottostante:',
+ 'asirra-createaccount' => 'Per proteggere il wiki dalla creazione automatica di nuovi accessi, ti chiediamo gentilmente di selezionare solo le foto di gatti nel riquadro sottostante:',
'asirra-createaccount-fail' => 'Identifica correttamente i gatti.',
- 'asirra-create' => 'Per aiutarci a proteggerci dalla creazione automatica di pagine, seleziona solo le foto di gatti nel riquadro sottostante:',
+ 'asirra-create' => 'Per proteggere il wiki dalla creazione automatica di pagine, ti chiediamo gentilmente di selezionare solo le foto di gatti nel riquadro sottostante:',
'asirra-nojs' => "'''Attiva JavaScript ed invia di nuovo la pagina.'''",
'asirra-failed' => 'Identifica tutte le immagini di gatti',
);
@@ -225,27 +234,28 @@ $messages['it'] = array(
*/
$messages['ja'] = array(
'asirra-desc' => 'ConfirmEdit 用 Asirra モジュール',
- 'asirra-edit' => '自動編集ã®ã‚¹ãƒ‘ム攻撃を防ããŸã‚ã€çŒ«ãŒå†™ã£ã¦ã„ã‚‹ç”»åƒã‚’以下ã‹ã‚‰é¸æŠžã—ã¦ãã ã•ã„:',
- 'asirra-addurl' => 'ã‚ãªãŸã¯æ–°ã—ã„外部リンクを追加ã—よã†ã¨ã—ã¦ã„ã¾ã™ã€‚自動ã§ã®ã‚¹ãƒ‘ム攻撃を防ããŸã‚ã€çŒ«ãŒå†™ã£ã¦ã„ã‚‹ç”»åƒã‚’以下ã‹ã‚‰é¸æŠžã—ã¦ãã ã•ã„:',
- 'asirra-badpass' => '自動ã§ã®ãƒ‘スワードクラック攻撃を防ããŸã‚ã€çŒ«ãŒå†™ã£ã¦ã„ã‚‹ç”»åƒã‚’以下ã‹ã‚‰é¸æŠžã—ã¦ãã ã•ã„:',
- 'asirra-createaccount' => 'アカウントã®è‡ªå‹•ç™»éŒ²ã‚’防ããŸã‚ã€çŒ«ãŒå†™ã£ã¦ã„ã‚‹ç”»åƒã‚’以下ã‹ã‚‰é¸æŠžã—ã¦ãã ã•ã„:',
+ 'asirra-edit' => 'ウィキã§ã®è‡ªå‹•ç·¨é›†ã®ã‚¹ãƒ‘ム攻撃を防ããŸã‚ã€ãŠæ‰‹æ•°ã‚’ãŠã‹ã‘ã—ã¾ã™ãŒçŒ«ãŒå†™ã£ã¦ã„ã‚‹ç”»åƒã‚’以下ã‹ã‚‰é¸æŠžã—ã¦ãã ã•ã„:',
+ 'asirra-addurl' => 'ã‚ãªãŸã¯æ–°ã—ã„外部リンクを追加ã—よã†ã¨ã—ã¦ã„ã¾ã™ã€‚ウィキã¸ã®è‡ªå‹•ã‚¹ãƒ‘ム攻撃を防ããŸã‚ã€ãŠæ‰‹æ•°ã‚’ãŠã‹ã‘ã—ã¾ã™ãŒçŒ«ãŒå†™ã£ã¦ã„ã‚‹ç”»åƒã‚’以下ã‹ã‚‰é¸æŠžã—ã¦ãã ã•ã„:',
+ 'asirra-badlogin' => 'ウィキã¸ã®è‡ªå‹•ãƒ‘スワードクラック攻撃を防ããŸã‚ã€ãŠæ‰‹æ•°ã‚’ãŠã‹ã‘ã—ã¾ã™ãŒçŒ«ãŒå†™ã£ã¦ã„ã‚‹ç”»åƒã‚’以下ã‹ã‚‰é¸æŠžã—ã¦ãã ã•ã„:',
+ 'asirra-createaccount' => 'ウィキã§ã®ã‚¢ã‚«ã‚¦ãƒ³ãƒˆè‡ªå‹•ä½œæˆã‚’防ããŸã‚ã€ãŠæ‰‹æ•°ã‚’ãŠã‹ã‘ã—ã¾ã™ãŒçŒ«ãŒå†™ã£ã¦ã„ã‚‹ç”»åƒã‚’以下ã‹ã‚‰é¸æŠžã—ã¦ãã ã•ã„:',
'asirra-createaccount-fail' => '猫を正ã—ãé¸æŠžã—ã¦ãã ã•ã„。',
- 'asirra-create' => 'ページã®è‡ªå‹•ä½œæˆã‚’防ããŸã‚ã€çŒ«ãŒå†™ã£ã¦ã„ã‚‹ç”»åƒã‚’以下ã‹ã‚‰é¸æŠžã—ã¦ãã ã•ã„:',
+ 'asirra-create' => 'ウィキã§ã®ãƒšãƒ¼ã‚¸è‡ªå‹•ä½œæˆã‚’防ããŸã‚ã€ãŠæ‰‹æ•°ã‚’ãŠã‹ã‘ã—ã¾ã™ãŒçŒ«ãŒå†™ã£ã¦ã„ã‚‹ç”»åƒã‚’以下ã‹ã‚‰é¸æŠžã—ã¦ãã ã•ã„:',
'asirra-nojs' => "'''JavaScript を有効ã«ã—ã¦ãƒšãƒ¼ã‚¸ã‚’å†èª­è¾¼ã—ã¦ãã ã•ã„。'''",
'asirra-failed' => '猫ãŒå†™ã£ã¦ã„ã‚‹ç”»åƒã‚’ã™ã¹ã¦é¸æŠžã—ã¦ãã ã•ã„',
);
/** Korean (한국어)
+ * @author Hym411
* @author ì•„ë¼
*/
$messages['ko'] = array(
'asirra-desc' => 'ConfirmEditì— ëŒ€í•œ Asirra 모듈',
'asirra-edit' => 'ìžë™í™”ëœ íŽ¸ì§‘ 스팸으로부터 보호하기 위해, 아래 ìƒìžì— 있는 ê³ ì–‘ì´ ì‚¬ì§„ì„ ì„ íƒí•˜ì„¸ìš”:',
'asirra-addurl' => 'íŽ¸ì§‘ì— ìƒˆë¡œìš´ 바깥 ë§í¬ê°€ í¬í•¨ë˜ì–´ 있습니다. ìžë™í™”ëœ ìŠ¤íŒ¸ìœ¼ë¡œë¶€í„° 보호하기 위해, 아래 ìƒìžì— 있는 ê³ ì–‘ì´ ì‚¬ì§„ì„ ì„ íƒí•˜ì„¸ìš”:',
- 'asirra-badpass' => '비밀번호 깨기로부터 보호하기 위해, 아래 ìƒìžì— 있는 ê³ ì–‘ì´ ì‚¬ì§„ì„ ì„ íƒí•˜ì„¸ìš”:',
- 'asirra-createaccount' => 'ìžë™í™”ëœ ê³„ì • 만들기로부터 보호하기 위해, 아래 ìƒìžì— 있는 ê³ ì–‘ì´ ì‚¬ì§„ì„ ì„ íƒí•˜ì„¸ìš”:',
+ 'asirra-badlogin' => 'ìžë™í™”ëœ ë¹„ë°€ë²ˆí˜¸ í¬ëž˜í‚¹ìœ¼ë¡œë¶€í„° 보호하기 위해, 아래 ìƒìžì— 있는 ê³ ì–‘ì´ ì‚¬ì§„ì„ ì„ íƒí•˜ì„¸ìš”:',
+ 'asirra-createaccount' => 'ìžë™í™”ëœ ê³„ì • 만들기로부터 위키를 보호하기 위해, 아래 ìƒìžì— 있는 ê³ ì–‘ì´ ì‚¬ì§„ì„ ì„ íƒí•˜ì„¸ìš”:',
'asirra-createaccount-fail' => 'ê³ ì–‘ì´ë¥¼ 올바르게 ì„ íƒí•˜ì„¸ìš”.',
- 'asirra-create' => 'ìžë™í™”ëœ ë¬¸ì„œ 만들기로부터 보호하기 위해, 아래 ìƒìžì— 있는 ê³ ì–‘ì´ ì‚¬ì§„ì„ ì„ íƒí•˜ì„¸ìš”:',
+ 'asirra-create' => 'ìžë™í™”ëœ ë¬¸ì„œ 만들기로부터 위키를 보호하기 위해, 아래 ìƒìžì— 있는 ê³ ì–‘ì´ ì‚¬ì§„ì„ ì„ íƒí•˜ì„¸ìš”:',
'asirra-nojs' => "'''ìžë°”스í¬ë¦½íŠ¸ë¥¼ 활성화하고 문서를 다시 제출하세요.'''",
'asirra-failed' => 'ê³ ì–‘ì´ ê·¸ë¦¼ì„ ëª¨ë‘ ì„ íƒí•˜ì„¸ìš”',
);
@@ -255,12 +265,12 @@ $messages['ko'] = array(
*/
$messages['ksh'] = array(
'asirra-desc' => 'Dä Zohsaz <i lang="en">Asirra</i> för et Zohsazprojramm <i lang="en">ConfirmEdit</i>.',
- 'asirra-edit' => 'Heh dat Wiki well sesch jääje <i lang="en">SPAM</i> schöze. Dröm moß mer beim Ändere noch en Prööfong aflääje, dat mer ene Minsch un kei Projramm es. Söhk bloß de Katzebelder em Kaßte us:',
- 'asirra-addurl' => 'Heh dat Wiki well sesch jääje <i lang="en">SPAM</i> schöze. Dröm moß mer, wam_mer lengks noh ußerhallef enfööje well, noch en Prööfong aflääje, dat mer ene Minsch un kei Projramm es. Söhk bloß de Katzebelder em Kaßte us:',
- 'asirra-badpass' => 'Heh dat Wiki well sesch jääje et automattesche Paßwoot_Knacke schöze. Dröm moß mer heh nor_en Prööfong aflääje, dat mer ene Minsch un kei Projramm es. Söhk bloß de Katzebelder em Kaßte us:',
- 'asirra-createaccount' => 'Heh dat Wiki well sesch jääje automattesch aanjelaate „Metmaacher“ schöze. Dröm moß mer heh nor_en Prööfong aflääje, dat mer ene Minsch un kei Projramm es. Söhk bloß de Katzebelder em Kaßte us:',
+ 'asirra-edit' => 'Heh dat Wiki well sesch jääje <i lang="en">SPAM</i> schöze. Dröm moß mer beim Ändere noch en Prööfong aflääje, dat mer ene Minsch un kei Projramm es. Söhk bloß de Katzebelder em Kaßte us:', # Fuzzy
+ 'asirra-addurl' => 'Heh dat Wiki well sesch jääje <i lang="en">SPAM</i> schöze. Dröm moß mer, wam_mer lengks noh ußerhallef enfööje well, noch en Prööfong aflääje, dat mer ene Minsch un kei Projramm es. Söhk bloß de Katzebelder em Kaßte us:', # Fuzzy
+ 'asirra-badlogin' => 'Heh dat Wiki well sesch jääje et automattesche Paßwoot_Knacke schöze. Dröm moß mer heh nor_en Prööfong aflääje, dat mer ene Minsch un kei Projramm es. Söhk bloß de Katzebelder em Kaßte us:', # Fuzzy
+ 'asirra-createaccount' => 'Heh dat Wiki well sesch jääje automattesch aanjelaate „Metmaacher“ schöze. Dröm moß mer heh nor_en Prööfong aflääje, dat mer ene Minsch un kei Projramm es. Söhk bloß de Katzebelder em Kaßte us:', # Fuzzy
'asirra-createaccount-fail' => 'Bes esu jood un don de Kazebelder ußwähle.',
- 'asirra-create' => 'Heh dat Wiki well sesch jääje automattesch neu aanjelaate Sigge schöze. Dröm moß mer heh nor_en Prööfong aflääje, dat mer ene Minsch un kei Projramm es. Söhk bloß de Katzebelder em Kaßte us:',
+ 'asirra-create' => 'Heh dat Wiki well sesch jääje automattesch neu aanjelaate Sigge schöze. Dröm moß mer heh nor_en Prööfong aflääje, dat mer ene Minsch un kei Projramm es. Söhk bloß de Katzebelder em Kaßte us:', # Fuzzy
'asirra-nojs' => "'''Bes esu jood un donn JavaSkrep en Dingem Brauser aanschallde un scheck heh di Sigg norr_ens af.'''",
'asirra-failed' => 'Bes esu jood un don all de Kazebelder ußwähle.',
);
@@ -270,7 +280,8 @@ $messages['ksh'] = array(
*/
$messages['lb'] = array(
'asirra-desc' => 'Asirra-Modul fir ConfirmEdit',
- 'asirra-addurl' => "An Ärer Ännerung sinn nei extern Linken. Fir ze hëllefe géint automatiséierte Spam virzegoen, sicht w.e.g. d'Kategorie vun de Fotoen an der Këscht ënnendrënner eraus:",
+ 'asirra-edit' => "Fir d'Wiki géint automatiséierte Spam ze schützen froe mir Iech just d'Fotoe mat Kazen, déi Dir an der Këscht ënnendrënner gesitt, erauszesichen:",
+ 'asirra-addurl' => "An Ärer Ännerung sinn nei extern Linken. Fir d'Wiki géint automatiséierte Spam ze schützen, froe mir Iech d'Kategorie vun de Fotoen an der Këscht ënnendrënner erauszesichen:",
'asirra-createaccount-fail' => "Identifizéiert d'Kaze w.e.g. richteg.",
'asirra-nojs' => "'''Aktivéiert w.e.g. JavaScript a schéckt d'Säit nachemol.'''",
'asirra-failed' => 'Identifizéiert w.e.g. all Biller wou Kazen drop sinn',
@@ -281,12 +292,12 @@ $messages['lb'] = array(
*/
$messages['mk'] = array(
'asirra-desc' => 'Asirra-модул за ПотврдиУредување',
- 'asirra-edit' => 'Како заштитна мерка против автоматизиран Ñпам, изберете ги Ñамо Ñликите Ñо мачка прикажани во полето:',
- 'asirra-addurl' => 'Во вашите измени има нови надворешни врÑки. Како заштитна мерка против автоматизиран Ñпам, изберете ги Ñамо Ñликите Ñо мачка прикажани во полето:',
- 'asirra-badpass' => 'Како заштитна мерка против автоматизирано провалување на лозинки, изберете ги Ñамо Ñликите Ñо мачка прикажани во полето:',
- 'asirra-createaccount' => 'Како заштитна мерка против автоматизирано Ñоздавање на Ñметки, изберете ги Ñамо Ñликите Ñо мачка прикажани во полето:',
+ 'asirra-edit' => 'Како заштитна мерка против автоматизиран Ñпам, би ве замолиле да ги изберете Ñамо Ñликите Ñо мачка прикажани во полето:',
+ 'asirra-addurl' => 'Во вашите измени има нови надворешни врÑки. Како заштитна мерка против автоматизиран Ñпам, би ве замолиле да ги изберете Ñамо Ñликите Ñо мачка прикажани во полето:',
+ 'asirra-badlogin' => 'Како заштитна мерка против автоматизирано провалување на лозинки, би ве замолиле да ги изберете Ñамо Ñликите Ñо мачка прикажани во полето:',
+ 'asirra-createaccount' => 'Како заштитна мерка против автоматизирано Ñоздавање на Ñметки, би ве замолиле да ги изберете Ñамо Ñликите Ñо мачка прикажани во полето:',
'asirra-createaccount-fail' => 'ПоÑочете кои од Ñледниве Ñе мачки.',
- 'asirra-create' => 'Како заштитна мерка против автоматизирано Ñоздавање на Ñтраници, изберете ги Ñамо Ñликите Ñо мачка прикажани во полето:',
+ 'asirra-create' => 'Како заштитна мерка против автоматизирано Ñоздавање на Ñтраници, би ве замолиле да ги изберете Ñамо Ñликите Ñо мачка прикажани во полето:',
'asirra-nojs' => "'''Овозможете JavaScript и поднеÑете ја Ñтраницата повторно.'''",
'asirra-failed' => 'Изберете ги Ñликите што имаат мачка',
);
@@ -296,12 +307,12 @@ $messages['mk'] = array(
*/
$messages['ms'] = array(
'asirra-desc' => 'Modul Asirra untuk ConfirmEdit',
- 'asirra-edit' => 'Untuk mencegah suntingan spam automatik, sila pilih gambar-gambar kucing sahaja dalam petak di bawah:',
- 'asirra-addurl' => 'Suntingan anda mengandungi pautan luar yang baru. Untuk mencegah spam janaan automatik, sila pilih gambar-gambar kucing sahaja dalam petak di bawah:',
- 'asirra-badpass' => 'Untuk mencegah pemecahan kata laluan automatik, sila pilih gambar-gambar kucing sahaja dalam petak di bawah:',
- 'asirra-createaccount' => 'Untuk mencegah pembukaan akaun automatik, sila pilih gambar-gambar kucing sahaja dalam petak di bawah:',
+ 'asirra-edit' => 'Untuk mencegah suntingan spam automatik, sila pilih gambar-gambar kucing sahaja dalam petak di bawah:', # Fuzzy
+ 'asirra-addurl' => 'Suntingan anda mengandungi pautan luar yang baru. Untuk mencegah spam janaan automatik, sila pilih gambar-gambar kucing sahaja dalam petak di bawah:', # Fuzzy
+ 'asirra-badlogin' => 'Untuk mencegah pemecahan kata laluan automatik, sila pilih gambar-gambar kucing sahaja dalam petak di bawah:', # Fuzzy
+ 'asirra-createaccount' => 'Untuk mencegah pembukaan akaun automatik, sila pilih gambar-gambar kucing sahaja dalam petak di bawah:', # Fuzzy
'asirra-createaccount-fail' => 'Sila kenal pasti kucing-kucing dengan betul.',
- 'asirra-create' => 'Untuk mencegah pembukaan halaman automatik, sila pilih gambar-gambar kucing sahaja dalam petak di bawah:',
+ 'asirra-create' => 'Untuk mencegah pembukaan halaman automatik, sila pilih gambar-gambar kucing sahaja dalam petak di bawah:', # Fuzzy
'asirra-nojs' => "'''Sila hidupkan JavaScript dan hantar semula halaman ini.'''",
'asirra-failed' => 'Sila kenal pasti semua gambar kucing',
);
@@ -311,43 +322,44 @@ $messages['ms'] = array(
*/
$messages['mt'] = array(
'asirra-desc' => 'Modulu ASIRRA għal ConfirmEdit',
- 'asirra-edit' => "Sabiex tgħinna nipproteġu kontra l-modifiki li jżidu spam, jekk jogħġbok agħżel ir-ritratti tal-qtates fil-kaxxa t'hawn taħt:",
- 'asirra-addurl' => "Il-modifika tiegħek tinkludi ħoloq esterni ġodda. Sabiex tipproteġi kontra spam awtomatiku, jekk jogħġbok agħżel ir-ritratti tal-qtates fil-kaxxa t'hawn taħt:",
- 'asirra-badpass' => "Sabiex tgħinna nipproteġu kontra l-infurzar awtomatiku tal-passwords, jekk jogħġbok agħżel ir-ritratti tal-qtates fil-kaxxa t'hawn taħt:",
- 'asirra-createaccount' => "Sabiex tgħinna nipproteġu kontra l-ħolqien awtomatiku ta' kontijiet ġodda, jekk jogħġbok agħżel ir-ritratti tal-qtates fil-kaxxa t'hawn taħt:",
+ 'asirra-edit' => "Sabiex tgħinna nipproteġu kontra l-modifiki li jżidu spam, jekk jogħġbok agħżel ir-ritratti tal-qtates fil-kaxxa t'hawn taħt:", # Fuzzy
+ 'asirra-addurl' => "Il-modifika tiegħek tinkludi ħoloq esterni ġodda. Sabiex tipproteġi kontra spam awtomatiku, jekk jogħġbok agħżel ir-ritratti tal-qtates fil-kaxxa t'hawn taħt:", # Fuzzy
+ 'asirra-badlogin' => "Sabiex tgħinna nipproteġu kontra l-infurzar awtomatiku tal-passwords, jekk jogħġbok agħżel ir-ritratti tal-qtates fil-kaxxa t'hawn taħt:", # Fuzzy
+ 'asirra-createaccount' => "Sabiex tgħinna nipproteġu kontra l-ħolqien awtomatiku ta' kontijiet ġodda, jekk jogħġbok agħżel ir-ritratti tal-qtates fil-kaxxa t'hawn taħt:", # Fuzzy
'asirra-createaccount-fail' => 'Sib il-qtates.',
- 'asirra-create' => "Sabiex tgħinna nipproteġu kontra l-ħolqien awtomatiku ta' paġni, jekk jogħġbok agħżel ir-ritratti tal-qtates fil-kaxxa t'hawn taħt:",
+ 'asirra-create' => "Sabiex tgħinna nipproteġu kontra l-ħolqien awtomatiku ta' paġni, jekk jogħġbok agħżel ir-ritratti tal-qtates fil-kaxxa t'hawn taħt:", # Fuzzy
'asirra-nojs' => "'''Jekk jogħġbok attiva l-JavaScript u erġa' ibgħat din il-paġna.'''",
'asirra-failed' => 'Sib l-istampi kollha tal-qtates',
);
-/** Norwegian Bokmål (norsk (bokmål)‎)
+/** Norwegian Bokmål (norsk bokmål)
* @author Event
*/
$messages['nb'] = array(
'asirra-desc' => 'Assirra-modulen for ConfirmEdit',
- 'asirra-edit' => 'Som beskyttelse mot automatisk redigert spam, vennligst velg kun kattebildene i boksen under:',
- 'asirra-addurl' => 'Din redigering inneholder nye eksterne lenker. Som beskyttelse mot automatisk redigert spam, vennligst velg kun kattebildene i boksen under:',
- 'asirra-badpass' => 'Som beskyttelse mot automatisk passordknekking, vennligst velg kun kattebildene i boksen under:',
- 'asirra-createaccount' => 'Som beskyttelse mot automatisk opprettelse av brukerkonto, vennligst velg kun kattebildene i boksen under:',
+ 'asirra-edit' => 'Som beskyttelse mot automatisk redigert spam, vennligst velg kun kattebildene i boksen under:', # Fuzzy
+ 'asirra-addurl' => 'Din redigering inneholder nye eksterne lenker. Som beskyttelse mot automatisk redigert spam, vennligst velg kun kattebildene i boksen under:', # Fuzzy
+ 'asirra-badlogin' => 'Som beskyttelse mot automatisk passordknekking, vennligst velg kun kattebildene i boksen under:', # Fuzzy
+ 'asirra-createaccount' => 'Som beskyttelse mot automatisk opprettelse av brukerkonto, vennligst velg kun kattebildene i boksen under:', # Fuzzy
'asirra-createaccount-fail' => 'Vennligst angi hva som er katter.',
- 'asirra-create' => 'Som beskyttelse mot automatisk opprettelse av sider, vennligst velg kun kattebildene i boksen under:',
+ 'asirra-create' => 'Som beskyttelse mot automatisk opprettelse av sider, vennligst velg kun kattebildene i boksen under:', # Fuzzy
'asirra-nojs' => "'''Vennligst åpne for JavaScript og lagre siden en gang til.'''",
'asirra-failed' => 'Vennligst merk alle kattebilder',
);
/** Dutch (Nederlands)
+ * @author HanV
* @author SPQRobin
* @author Siebrand
*/
$messages['nl'] = array(
'asirra-desc' => 'Asirra-module voor ConfirmEdit',
'asirra-edit' => 'Kies ter bescherming tegen geautomatiseerde spam de afbeeldingen met een poes in het onderstaande venster:',
- 'asirra-addurl' => "Uw bewerking bevat nieuwe externe koppelingen. Selecteer de foto's van katten in het vak hieronder om te helpen beschermen tegen geautomatiseerde spam:",
- 'asirra-badpass' => 'Kies ter bescherming tegen het automatisch kraken van wachtwoorden de afbeeldingen met een poes in het onderstaande venster:',
+ 'asirra-addurl' => "Uw bewerking bevat nieuwe externe koppelingen. Selecteer de foto's van katten in het vak hieronder om de wiki te beschermen tegen geautomatiseerde spam:",
+ 'asirra-badlogin' => 'Kies ter bescherming tegen het automatisch kraken van wachtwoorden de afbeeldingen met een poes in het onderstaande venster:',
'asirra-createaccount' => 'Kies om het automatisch aanmaken van gebruikers tegen te gaan de afbeeldingen met een poes in het onderstaande venster:',
'asirra-createaccount-fail' => 'Identificeer de katten juist.',
- 'asirra-create' => "Kies om het automatisch aanmaken van pagina's tegen te gaan de afbeeldingen met een poes in het onderstaande venster:",
+ 'asirra-create' => 'Kies om het automatisch aanmaken van een pagina tegen te gaan de afbeeldingen met een poes in het onderstaande venster:',
'asirra-nojs' => "'''Schakel JavaScript in en probeer de pagina opnieuw op te slaan.'''",
'asirra-failed' => 'Identificeer alle afbeeldingen van katten.',
);
@@ -356,7 +368,7 @@ $messages['nl'] = array(
* @author Siebrand
*/
$messages['nl-informal'] = array(
- 'asirra-addurl' => "Je bewerking bevat nieuwe externe koppelingen. Selecteer de foto's van katten in het vak hieronder om te helpen beschermen tegen geautomatiseerde spam:",
+ 'asirra-addurl' => "Je bewerking bevat nieuwe externe koppelingen. Selecteer de foto's van katten in het vak hieronder om te helpen beschermen tegen geautomatiseerde spam:", # Fuzzy
);
/** Polish (polski)
@@ -364,12 +376,12 @@ $messages['nl-informal'] = array(
*/
$messages['pl'] = array(
'asirra-desc' => 'Moduł Asirra dla ConfirmEdit',
- 'asirra-edit' => 'Aby uchronić się przed automatami wprowadzającymi spam, proszę wybrać tylko zdjęcia kotów w poniższym polu:',
- 'asirra-addurl' => 'Wprowadzony przez ciebie tekst zawiera linki zewnętrzne. Aby uchronić nas przed automatycznym spamem, proszę wskazać tylko zdjęcia kotów w poniższym polu:',
- 'asirra-badpass' => 'Aby uchronić się przed zautomatyzowanym łamaniem haseł, proszę wybrać tylko zdjęcia kotów w poniższym polu:',
- 'asirra-createaccount' => 'Aby uchronić się przed automatycznym tworzeniem kont, proszę wybrać tylko zdjęcia kotów w poniższym polu:',
+ 'asirra-edit' => 'Aby uchronić się przed automatami wprowadzającymi spam, proszę wybrać tylko zdjęcia kotów w poniższym polu:', # Fuzzy
+ 'asirra-addurl' => 'Wprowadzony przez ciebie tekst zawiera linki zewnętrzne. Aby uchronić nas przed automatycznym spamem, proszę wskazać tylko zdjęcia kotów w poniższym polu:', # Fuzzy
+ 'asirra-badlogin' => 'Aby uchronić się przed zautomatyzowanym łamaniem haseł, proszę wybrać tylko zdjęcia kotów w poniższym polu:', # Fuzzy
+ 'asirra-createaccount' => 'Aby uchronić się przed automatycznym tworzeniem kont, proszę wybrać tylko zdjęcia kotów w poniższym polu:', # Fuzzy
'asirra-createaccount-fail' => 'Prosimy prawidłowo zidentyfikować koty.',
- 'asirra-create' => 'Aby uchronić się przed automatycznym tworzeniem stron, proszę wybrać tylko zdjęcia kotów w poniższym polu:',
+ 'asirra-create' => 'Aby uchronić się przed automatycznym tworzeniem stron, proszę wybrać tylko zdjęcia kotów w poniższym polu:', # Fuzzy
'asirra-nojs' => "'''Prosimy włączyć obsługę języka JavaScript i ponowne przesłanie strony.'''",
'asirra-failed' => 'Prosimy wskazać wszystkie obrazy kotów',
);
@@ -380,27 +392,28 @@ $messages['pl'] = array(
*/
$messages['pms'] = array(
'asirra-desc' => 'Mòdul Asirra për ConfirmEdit',
- 'asirra-edit' => "Për giuté a protege contra la rumenta dle modìfiche automàtiche, për piasì ch'a selession-a mach le fòto ëd gat ant ël quàder sì-sota:",
- 'asirra-addurl' => "Soa modìfica a conten dle liure esterne neuve. Për giuté a protege contra la rumenta dle modìfiche automàtiche, për piasì ch'a selession-a mach le fòto ëd gat ant ël quàder sì-sota:",
- 'asirra-badpass' => "Për giuté a protege contra la forsadura automatisà ëd le ciav, për piasì ch'a selession-a mach la fòto dël gat ant ël quàder sì-sota:",
- 'asirra-createaccount' => "Për giuté a protege contra la creassion automatisà ëd cont, për piasì ch'a selession-a mach la fòto dël gat ant ël quàder sì-sota:",
+ 'asirra-edit' => "Për giuté a protege contra la rumenta dle modìfiche automàtiche, për piasì ch'a selession-a mach le fòto ëd gat ant ël quàder sì-sota:", # Fuzzy
+ 'asirra-addurl' => "Soa modìfica a conten dle liure esterne neuve. Për giuté a protege contra la rumenta dle modìfiche automàtiche, për piasì ch'a selession-a mach le fòto ëd gat ant ël quàder sì-sota:", # Fuzzy
+ 'asirra-badlogin' => "Për giuté a protege contra la forsadura automatisà ëd le ciav, për piasì ch'a selession-a mach la fòto dël gat ant ël quàder sì-sota:", # Fuzzy
+ 'asirra-createaccount' => "Për giuté a protege contra la creassion automatisà ëd cont, për piasì ch'a selession-a mach la fòto dël gat ant ël quàder sì-sota:", # Fuzzy
'asirra-createaccount-fail' => 'Për piasì identifica coretament ij gat.',
- 'asirra-create' => "Për giuté a protege contra la creassion automatisà ëd pàgine, për piasì ch'a selession-a mach le fòto ëd gat ant ël quàder sì-sota:",
+ 'asirra-create' => "Për giuté a protege contra la creassion automatisà ëd pàgine, për piasì ch'a selession-a mach le fòto ëd gat ant ël quàder sì-sota:", # Fuzzy
'asirra-nojs' => "'''Për piasì, ch'a abìlita JavaScript e ch'a spedissa torna la pàgina.'''",
'asirra-failed' => 'Për piasì identìfica tute le figure ëd gat',
);
/** Portuguese (português)
* @author Hamilton Abreu
+ * @author Luckas
*/
$messages['pt'] = array(
'asirra-desc' => 'Módulo Asirra para o ConfirmEdit',
- 'asirra-edit' => "Como prevenção contra sistemas automatizados de inserção de ''spam'', seleccione só as fotografias de gatos na caixa abaixo:",
- 'asirra-addurl' => "A sua edição contém links externos novos. Como prevenção contra sistemas automatizados de inserção de ''spam'', seleccione só as fotografias de gatos na caixa abaixo:",
- 'asirra-badpass' => 'Como prevenção com sistemas automatizados de descoberta de palavras-chave, seleccione só as fotografias de gatos na caixa abaixo:',
- 'asirra-createaccount' => 'Como prevenção contra sistemas automatizados de criação de contas, seleccione só as fotografias de gatos na caixa abaixo:',
- 'asirra-createaccount-fail' => 'Identifique correctamente os gatos, por favor.',
- 'asirra-create' => 'Como prevenção contra sistemas automatizados de criação de páginas, seleccione só as fotografias de gatos na caixa abaixo:',
+ 'asirra-edit' => "Como prevenção contra sistemas automatizados de inserção de ''spam'', selecione só as fotografias de gatos na caixa abaixo:", # Fuzzy
+ 'asirra-addurl' => "A sua edição contém links externos novos. Como prevenção contra sistemas automatizados de inserção de ''spam'', selecione só as fotografias de gatos na caixa abaixo:", # Fuzzy
+ 'asirra-badlogin' => 'Como prevenção com sistemas automatizados de descoberta de palavras-chave, selecione só as fotografias de gatos na caixa abaixo:', # Fuzzy
+ 'asirra-createaccount' => 'Como prevenção contra sistemas automatizados de criação de contas, selecione só as fotografias de gatos na caixa abaixo:', # Fuzzy
+ 'asirra-createaccount-fail' => 'Identifique corretamente os gatos, por favor.',
+ 'asirra-create' => 'Como prevenção contra sistemas automatizados de criação de páginas, selecione só as fotografias de gatos na caixa abaixo:', # Fuzzy
'asirra-nojs' => "'''Possibilite o uso de JavaScript e reenvie a página, por favor.'''",
);
@@ -409,21 +422,29 @@ $messages['pt'] = array(
*/
$messages['roa-tara'] = array(
'asirra-desc' => 'Module Asirra pe confermà le cangiaminde',
+ 'asirra-edit' => "Pe darne 'na màne a proteggere condre le cangiaminde automatece de le rummate, pe piacere scacchie ìa categorije de le fote jndr'à buatte aqquà sotte:", # Fuzzy
+ 'asirra-addurl' => "Le cangiaminde tune 'ngludone collegaminde de fore nuève. Pe darne 'na màne a proteggere condre le cangiaminde automatece de le rummate, pe piacere scacchie 'a categorije d'a fote 'ndruche jndr'à buatte aqquà sotte:", # Fuzzy
+ 'asirra-badlogin' => "Pe darne 'na màne a proteggere condre le futteminde automatece de le passuord, pe piacere scacchie 'a categorije de le fote jndr'à buatte aqquà sotte:", # Fuzzy
+ 'asirra-createaccount' => "Pe darne 'na màne a proteggere condre le ccrejaziune automatece de le cunde, pe piacere scacchie 'a categorije de le fote jndr'à buatte aqquà sotte:", # Fuzzy
'asirra-createaccount-fail' => 'Pe piacere idendifiche correttamende le categorije.',
+ 'asirra-create' => "Pe darne 'na màne a proteggere condre le ccrejaziune automatece de le pàggene, pe piacere scacchie 'a categorije de le fote jndr'à buatte aqquà sotte:", # Fuzzy
+ 'asirra-nojs' => "'''Pe piacere abbilite JavaScript e conferme arrete 'a pàgene.'''",
'asirra-failed' => 'Pe piacere idendifiche tutte le categorije de le immaggine',
);
/** Russian (руÑÑкий)
* @author DCamer
+ * @author Lockal
+ * @author Okras
*/
$messages['ru'] = array(
'asirra-desc' => 'Модуль Asirra Ð´Ð»Ñ ConfirmEdit',
- 'asirra-edit' => 'Ð’ целÑÑ… защиты от автоматичеÑкого Ñпама в правках, пожалуйÑта, выберите фотографии кота, которые вы видите ниже:',
- 'asirra-addurl' => 'Ваша правка Ñодержит новые внешние ÑÑылки. Ð’ целÑÑ… защиты от автоматичеÑкого Ñпама, пожалуйÑта, выберите фотографии кота, которые вы видите ниже:',
- 'asirra-badpass' => 'Ð’ целÑÑ… защиты от автоматичеÑкого подбора паролÑ, пожалуйÑта, выберите фотографии кота, которые вы видите ниже:',
- 'asirra-createaccount' => 'Ð’ целÑÑ… защиты от автоматичеÑкого ÑÐ¾Ð·Ð´Ð°Ð½Ð¸Ñ ÑƒÑ‡Ñ‘Ñ‚Ð½Ñ‹Ñ… запиÑей, пожалуйÑта, выберите фотографии кота, которые вы видите ниже:',
+ 'asirra-edit' => 'Ð’ целÑÑ… защиты проекта от автоматичеÑкого Ñпама в правках, проÑим Ð²Ð°Ñ Ð²Ñ‹Ð±Ñ€Ð°Ñ‚ÑŒ Ñреди нижеприведённых изображений только фотографии кошек:',
+ 'asirra-addurl' => 'Ваша правка Ñодержит новые внешние ÑÑылки. Ð’ целÑÑ… защиты проекта от автоматичеÑкого Ñпама в правках проÑим Ð²Ð°Ñ Ð²Ñ‹Ð±Ñ€Ð°Ñ‚ÑŒ Ñреди нижеприведённых изображений только фотографии кошек:',
+ 'asirra-badlogin' => 'Ð’ целÑÑ… защиты от автоматичеÑкого подбора Ð¿Ð°Ñ€Ð¾Ð»Ñ Ð¿Ñ€Ð¾Ñим Ð²Ð°Ñ Ð²Ñ‹Ð±Ñ€Ð°Ñ‚ÑŒ Ñреди нижеприведённых изображений только фотографии кошек:',
+ 'asirra-createaccount' => 'Ð’ целÑÑ… защиты от автоматичеÑкого ÑÐ¾Ð·Ð´Ð°Ð½Ð¸Ñ ÑƒÑ‡Ñ‘Ñ‚Ð½Ñ‹Ñ… запиÑей проÑим Ð²Ð°Ñ Ð²Ñ‹Ð±Ñ€Ð°Ñ‚ÑŒ Ñреди нижеприведённых изображений только фотографии кошек:',
'asirra-createaccount-fail' => 'ПожалуйÑта правильно идентифицируйте котов.',
- 'asirra-create' => 'Ð’ целÑÑ… защиты от автоматичеÑкого ÑÐ¾Ð·Ð´Ð°Ð½Ð¸Ñ Ñтраниц, пожалуйÑта, выберите фотографии кота, которые вы видите ниже:',
+ 'asirra-create' => 'Ð’ целÑÑ… защиты от автоматичеÑкого ÑÐ¾Ð·Ð´Ð°Ð½Ð¸Ñ Ñтраниц проÑим Ð²Ð°Ñ Ð²Ñ‹Ð±Ñ€Ð°Ñ‚ÑŒ Ñреди нижеприведённых изображений только фотографии кошек:',
'asirra-nojs' => "'''ПожалуйÑта, включите JavaScript и обновите Ñтраницу.'''",
'asirra-failed' => 'ПожалуйÑта, идентифицируйте вÑе фотографии кота',
);
@@ -437,9 +458,17 @@ $messages['si'] = array(
);
/** Swedish (svenska)
+ * @author Jopparn
+ * @author Rotsee
* @author WikiPhoenix
*/
$messages['sv'] = array(
+ 'asirra-edit' => 'För att skydda wikin mot spam ber vi dig att markera de fotografier som föreställer katter i rutan nedan:',
+ 'asirra-addurl' => 'Din redigering innehåller nya externa länkar. För att skydda wikin mot automatiserat redigerings-spam ber vi dig att endast markera fotografierna på katter i rutan nedan:',
+ 'asirra-badlogin' => 'För att skydda wikin mot automatiserade försök att knäcka lösenord ber vi dig att endast markera fotografierna på katter i rutan nedan:',
+ 'asirra-createaccount' => 'För att skydda wikin mot automatiserat kontoskapande ber vi dig att endast markera fotografierna på katter i rutan nedan:',
+ 'asirra-create' => 'För att skydda wikin mot automatiserat sidskapande ber vi dig att endast markera fotografierna på katter i rutan nedan:',
+ 'asirra-nojs' => "'''Var god aktivera JavaScript och hämta sidan igen.'''",
'asirra-failed' => 'Var god identifiera alla kattbilder',
);
@@ -448,27 +477,28 @@ $messages['sv'] = array(
*/
$messages['tl'] = array(
'asirra-desc' => 'Modyul ng Asirra para sa ConfirmEdit',
- 'asirra-edit' => 'Upang makatulong sa pagprutekta laban sa kusang basurang pamamatnugot, paki piliin iyong mga litrato lamang ng pusa na nasa loob ng kahong nasa ibaba:',
- 'asirra-addurl' => 'Ang pagbabago mo ay nagsasama ng bagong panlabas na mga kawing. Upang makatulong sa pagprutekta laban sa kusang paglusob ng basurang-liham, paki piliin iyong mga litrato lamang ng pusa na nasa loob ng kahong nasa ibaba:',
- 'asirra-badpass' => 'Upang makatulong sa pagprutekta laban sa kusang pag-alam ng hudyat, paki piliin lamang iyong mga litrato ng pusa na nasa loob ng kahong nasa ibaba:',
- 'asirra-createaccount' => 'Upang makatulong sa pagprutekta laban sa kusang paglikha ng akawnt, paki piliin lamang iyong mga litrato ng pusa na nasa loob ng kahong nasa ibaba:',
+ 'asirra-edit' => 'Upang makatulong sa pagprutekta laban sa kusang basurang pamamatnugot, paki piliin iyong mga litrato lamang ng pusa na nasa loob ng kahong nasa ibaba:', # Fuzzy
+ 'asirra-addurl' => 'Ang pagbabago mo ay nagsasama ng bagong panlabas na mga kawing. Upang makatulong sa pagprutekta laban sa kusang paglusob ng basurang-liham, paki piliin iyong mga litrato lamang ng pusa na nasa loob ng kahong nasa ibaba:', # Fuzzy
+ 'asirra-badlogin' => 'Upang makatulong sa pagprutekta laban sa kusang pag-alam ng hudyat, paki piliin lamang iyong mga litrato ng pusa na nasa loob ng kahong nasa ibaba:', # Fuzzy
+ 'asirra-createaccount' => 'Upang makatulong sa pagprutekta laban sa kusang paglikha ng akawnt, paki piliin lamang iyong mga litrato ng pusa na nasa loob ng kahong nasa ibaba:', # Fuzzy
'asirra-createaccount-fail' => 'Paki kilalanin ng tama ang mga pusa.',
- 'asirra-create' => 'Upang makatulong sa pagprutekta laban sa kusang paglikha ng pahina, paki piliin lamang iyong mga litrato ng pusa na nasa loob ng kahong nasa ibaba:',
+ 'asirra-create' => 'Upang makatulong sa pagprutekta laban sa kusang paglikha ng pahina, paki piliin lamang iyong mga litrato ng pusa na nasa loob ng kahong nasa ibaba:', # Fuzzy
'asirra-nojs' => "'''Paki paganahin ang JavaScript at muling ipasa ang pahina.'''",
'asirra-failed' => 'Paki kilalanin ang lahat ng mga imahe ng pusa',
);
/** Ukrainian (українÑька)
+ * @author Andriykopanytsia
* @author Base
*/
$messages['uk'] = array(
'asirra-desc' => 'Модуль Asirra Ð´Ð»Ñ ConfirmEdit',
- 'asirra-edit' => 'З метою захиÑту проти автоматичного Ñпаму у ÑтаттÑÑ…, будь лаÑка оберіть фотографії кота, у блоці нижче:',
- 'asirra-addurl' => 'Ваше Ð¿Ð¾Ð²Ñ–Ð´Ð¾Ð¼Ð»ÐµÐ½Ð½Ñ Ð²ÐºÐ»ÑŽÑ‡Ð°Ñ” нові зовнішні поÑиланнÑ. З метою захиÑту проти автоматичного Ñпаму у ÑтаттÑÑ…, будь лаÑка оберіть фотографії кота, у блоці нижче:',
- 'asirra-badpass' => 'З метою захиÑту проти автоматичного підбору паролю, будь лаÑка оберіть фотографії кота, у блоці нижче:',
- 'asirra-createaccount' => 'З метою захиÑту проти автоматичного ÑÑ‚Ð²Ð¾Ñ€ÐµÐ½Ð½Ñ Ð¾Ð±Ð»Ñ–ÐºÐ¾Ð²Ð¸Ñ… запиÑів, будь лаÑка оберіть фотографії кота, у блоці нижче:',
+ 'asirra-edit' => 'З метою захиÑту вікі від автоматичного Ñпаму у ÑтаттÑÑ…, проÑимо Ð²Ð°Ñ Ð¾Ð±Ñ€Ð°Ñ‚Ð¸ фотографії кота, у блоці нижче:',
+ 'asirra-addurl' => 'Ваше Ð¿Ð¾Ð²Ñ–Ð´Ð¾Ð¼Ð»ÐµÐ½Ð½Ñ Ð²ÐºÐ»ÑŽÑ‡Ð°Ñ” нові зовнішні поÑиланнÑ. З метою захиÑту вікі проти автоматичного Ñпаму у ÑтаттÑÑ…, проÑимо Ð²Ð°Ñ Ð¾Ð±Ñ€Ð°Ñ‚Ð¸ фотографії кота, у блоці нижче:',
+ 'asirra-badlogin' => 'З метою захиÑту вікі проти автоматичного підбору паролю, проÑимо Ð²Ð°Ñ Ð¾Ð±Ñ€Ð°Ñ‚Ð¸ фотографії кота у блоці нижче:',
+ 'asirra-createaccount' => 'З метою захиÑту вікі проти автоматичного ÑÑ‚Ð²Ð¾Ñ€ÐµÐ½Ð½Ñ Ð¾Ð±Ð»Ñ–ÐºÐ¾Ð²Ð¸Ñ… запиÑів проÑимо Ð²Ð°Ñ Ð¾Ð±Ñ€Ð°Ñ‚Ð¸ фотографії кота у блоці нижче:',
'asirra-createaccount-fail' => 'Будь лаÑка, правильно ідентифікуйте котів.',
- 'asirra-create' => 'З метою захиÑту проти автоматичного ÑÑ‚Ð²Ð¾Ñ€ÐµÐ½Ð½Ñ Ñтатей, будь лаÑка оберіть фотографії кота, у блоці нижче:',
+ 'asirra-create' => 'З метою захиÑту вікі проти автоматичного ÑÑ‚Ð²Ð¾Ñ€ÐµÐ½Ð½Ñ Ñтатей проÑимо Ð²Ð°Ñ Ð¾Ð±Ñ€Ð°Ñ‚Ð¸ фотографії кота у блоці нижче:',
'asirra-nojs' => "'''Будь лаÑка увімкніть JavaScript Ñ– оновіть Ñторінку.'''",
'asirra-failed' => 'Будь лаÑка, ідентифікуйте уÑÑ– фотографії кота',
);
@@ -478,25 +508,26 @@ $messages['uk'] = array(
*/
$messages['wa'] = array(
'asirra-desc' => "Module Asirra pol passete d' acertinaedje des candjmints (ConfirmEdit)",
- 'asirra-edit' => "Po s' mete a houte des des robots di spam, nos vs dimandans d' acertiner ki vos estoz bén ene djin, po çoula tchoezixhoz seulmint les imådjes avou des tchets e l' boesse chal pa dzo:",
+ 'asirra-edit' => "Po s' mete a houte des des robots di spam, nos vs dimandans d' acertiner ki vos estoz bén ene djin, po çoula tchoezixhoz seulmint les imådjes avou des tchets e l' boesse chal pa dzo:", # Fuzzy
'asirra-addurl' => "Dins vos candjmints i gn a des dfoûtrinnès hårdêyes (URL).
-Po s' mete a houte des des robots di spam, nos vs dimandans d' acertiner ki vos estoz bén ene djin, po çoula tchoezixhoz seulmint les imådjes avou des tchets e l' boesse chal pa dzo:",
- 'asirra-badpass' => "Po s' mete a houte des des robots ki sayèt d' adviner les screts, nos vs dimandans d' acertiner ki vos estoz bén ene djin, po çoula tchoezixhoz seulmint les imådjes avou des tchets e l' boesse chal pa dzo:",
- 'asirra-createaccount' => "Po s' mete a houte des des robots k' ahivèt des contes otomaticmint, nos vs dimandans d' acertiner ki vos estoz bén ene djin, po çoula tchoezixhoz seulmint les imådjes avou des tchets e l' boesse chal pa dzo:",
+Po s' mete a houte des des robots di spam, nos vs dimandans d' acertiner ki vos estoz bén ene djin, po çoula tchoezixhoz seulmint les imådjes avou des tchets e l' boesse chal pa dzo:", # Fuzzy
+ 'asirra-badlogin' => "Po s' mete a houte des des robots ki sayèt d' adviner les screts, nos vs dimandans d' acertiner ki vos estoz bén ene djin, po çoula tchoezixhoz seulmint les imådjes avou des tchets e l' boesse chal pa dzo:", # Fuzzy
+ 'asirra-createaccount' => "Po s' mete a houte des des robots k' ahivèt des contes otomaticmint, nos vs dimandans d' acertiner ki vos estoz bén ene djin, po çoula tchoezixhoz seulmint les imådjes avou des tchets e l' boesse chal pa dzo:", # Fuzzy
'asirra-createaccount-fail' => 'Tchoezixhoz comifåt les tchets (les biesses ki gnawèt).',
- 'asirra-create' => "Po s' mete a houte des des robots k' ahivèt des pådjes otomaticmint, nos vs dimandans d' acertiner ki vos estoz bén ene djin, po çoula tchoezixhoz seulmint les imådjes avou des tchets e l' boesse chal pa dzo:",
+ 'asirra-create' => "Po s' mete a houte des des robots k' ahivèt des pådjes otomaticmint, nos vs dimandans d' acertiner ki vos estoz bén ene djin, po çoula tchoezixhoz seulmint les imådjes avou des tchets e l' boesse chal pa dzo:", # Fuzzy
'asirra-nojs' => "'''Metoz s' i vs plait en alaedje li JavaScrit et s' revoyî l' pådje.'''",
'asirra-failed' => 'Idintifyî totes les imådjes avou des tchets',
);
/** Simplified Chinese (中文(简体)‎)
+ * @author Fantasticfears
* @author Hzy980512
*/
$messages['zh-hans'] = array(
'asirra-desc' => 'ConfirmEditçš„Asirra模å—',
'asirra-edit' => '为了防止垃圾编辑攻击,请在下é¢çš„方框中选出猫的图片:',
- 'asirra-addurl' => '您的编辑包å«æ–°çš„外部链接。为了帮助防止自动垃圾邮件,请在下é¢çš„方框中选出猫的图片:',
- 'asirra-badpass' => '为防止自动程åºç ´è§£å¯†ç ï¼Œè¯·åœ¨ä¸‹é¢çš„方框中选出猫的图片:',
+ 'asirra-addurl' => '您的编辑包å«æ–°çš„外部链接。为了帮助防止垃圾编辑攻击,请在下é¢çš„方框中选出猫的图片:',
+ 'asirra-badlogin' => '为防止自动程åºç ´è§£å¯†ç ï¼Œè¯·åœ¨ä¸‹é¢çš„方框中选出猫的图片:',
'asirra-createaccount' => '为了防止自动程åºåˆ›å»ºå¸æˆ·ï¼Œè¯·åœ¨ä¸‹é¢çš„方框中选出猫的图片:',
'asirra-createaccount-fail' => '请正确辨认出猫的图片。',
'asirra-create' => '为了防止自动程åºåˆ›å»ºé¡µé¢ï¼Œè¯·åœ¨ä¸‹é¢çš„方框中选出猫的图片:',
@@ -508,12 +539,12 @@ $messages['zh-hans'] = array(
*/
$messages['zh-hant'] = array(
'asirra-desc' => 'ConfirmEdit的Asirra模塊',
- 'asirra-edit' => '為了防止垃圾編輯攻擊,請在下é¢çš„方框中é¸å‡ºè²“的圖片:',
- 'asirra-addurl' => '您的編輯包å«æ–°çš„外部éˆæŽ¥ã€‚為了幫助防止自動垃圾郵件,請在下é¢çš„方框中é¸å‡ºè²“的圖片:',
- 'asirra-badpass' => '為防止自動程åºç ´è§£å¯†ç¢¼ï¼Œè«‹åœ¨ä¸‹é¢çš„方框中é¸å‡ºè²“的圖片:',
- 'asirra-createaccount' => '為了防止自動程åºå‰µå»ºå¸³æˆ¶ï¼Œè«‹åœ¨ä¸‹é¢çš„方框中é¸å‡ºè²“的圖片:',
+ 'asirra-edit' => '為了防止垃圾編輯攻擊,請在下é¢çš„方框中é¸å‡ºè²“的圖片:', # Fuzzy
+ 'asirra-addurl' => '您的編輯包å«æ–°çš„外部éˆæŽ¥ã€‚為了幫助防止自動垃圾郵件,請在下é¢çš„方框中é¸å‡ºè²“的圖片:', # Fuzzy
+ 'asirra-badlogin' => '為防止自動程åºç ´è§£å¯†ç¢¼ï¼Œè«‹åœ¨ä¸‹é¢çš„方框中é¸å‡ºè²“的圖片:', # Fuzzy
+ 'asirra-createaccount' => '為了防止自動程åºå‰µå»ºå¸³æˆ¶ï¼Œè«‹åœ¨ä¸‹é¢çš„方框中é¸å‡ºè²“的圖片:', # Fuzzy
'asirra-createaccount-fail' => '請正確辨èªå‡ºè²“的圖片。',
- 'asirra-create' => '為了防止自動程åºå‰µå»ºé é¢ï¼Œè«‹åœ¨ä¸‹é¢çš„方框中é¸å‡ºè²“的圖片:',
+ 'asirra-create' => '為了防止自動程åºå‰µå»ºé é¢ï¼Œè«‹åœ¨ä¸‹é¢çš„方框中é¸å‡ºè²“的圖片:', # Fuzzy
'asirra-nojs' => "'''è«‹å•Ÿå‹•JavaScript後å†æ交é é¢ã€‚'''",
'asirra-failed' => 'è«‹é¸å‡ºæ‰€æœ‰è²“的圖片',
);
diff --git a/extensions/ConfirmEdit/Captcha.php b/extensions/ConfirmEdit/Captcha.php
index 9967dd47..b15de61f 100644
--- a/extensions/ConfirmEdit/Captcha.php
+++ b/extensions/ConfirmEdit/Captcha.php
@@ -42,6 +42,7 @@ class SimpleCaptcha {
Xml::element( 'input', array(
'name' => 'wpCaptchaWord',
'id' => 'wpCaptchaWord',
+ 'size' => 5,
'autocomplete' => 'off',
'tabindex' => 1 ) ) . // tab in before the edit textarea
"</p>\n" .
@@ -354,26 +355,38 @@ class SimpleCaptcha {
*/
function filterLink( $url ) {
global $wgCaptchaWhitelist;
- $source = wfMessage( 'captcha-addurl-whitelist' )->inContentLanguage()->text();
+ static $regexes = null;
- $whitelist = wfMessage( 'captcha-addurl-whitelist', $source )->isDisabled()
- ? false
- : $this->buildRegexes( explode( "\n", $source ) );
+ if ( $regexes === null ) {
+ $source = wfMessage( 'captcha-addurl-whitelist' )->inContentLanguage();
- $cwl = $wgCaptchaWhitelist !== false ? preg_match( $wgCaptchaWhitelist, $url ) : false;
- $wl = $whitelist !== false ? preg_match( $whitelist, $url ) : false;
+ $regexes = $source->isDisabled()
+ ? array()
+ : $this->buildRegexes( explode( "\n", $source->plain() ) );
- return !( $cwl || $wl );
+ if ( $wgCaptchaWhitelist !== false ) {
+ array_unshift( $regexes, $wgCaptchaWhitelist );
+ }
+ }
+
+ foreach ( $regexes as $regex ) {
+ if ( preg_match( $regex, $url ) ) {
+ return false;
+ }
+ }
+
+ return true;
}
/**
* Build regex from whitelist
* @param $lines string from [[MediaWiki:Captcha-addurl-whitelist]]
- * @return string Regex or bool false if whitelist is empty
+ * @return array Regexes
* @access private
*/
function buildRegexes( $lines ) {
# Code duplicated from the SpamBlacklist extension (r19197)
+ # and later modified.
# Strip comments and whitespace, then remove blanks
$lines = array_filter( array_map( 'trim', preg_replace( '/#.*$/', '', $lines ) ) );
@@ -381,34 +394,59 @@ class SimpleCaptcha {
# No lines, don't make a regex which will match everything
if ( count( $lines ) == 0 ) {
wfDebug( "No lines\n" );
- return false;
+ return array();
} else {
# Make regex
# It's faster using the S modifier even though it will usually only be run once
// $regex = 'http://+[a-z0-9_\-.]*(' . implode( '|', $lines ) . ')';
// return '/' . str_replace( '/', '\/', preg_replace('|\\\*/|', '/', $regex) ) . '/Si';
- $regexes = '';
- $regexStart = '/^https?:\/\/+[a-z0-9_\-.]*(';
- $regexEnd = ')/Si';
+ $regexes = array();
+ $regexStart = array(
+ 'normal' => '/^https?:\/\/+[a-z0-9_\-.]*(?:',
+ 'noprotocol' => '/^(?:',
+ );
+ $regexEnd = array(
+ 'normal' => ')/Si',
+ 'noprotocol' => ')/Si',
+ );
$regexMax = 4096;
- $build = false;
+ $build = array();
foreach ( $lines as $line ) {
+ # Extract flags from the line
+ $options = array();
+ if ( preg_match( '/^(.*?)\s*<([^<>]*)>$/', $line, $matches ) ) {
+ if ( $matches[1] === '' ) {
+ wfDebug( "Line with empty regex\n" );
+ continue;
+ }
+ $line = $matches[1];
+ $opts = preg_split( '/\s*\|\s*/', trim( $matches[2] ) );
+ foreach ( $opts as $opt ) {
+ $opt = strtolower( $opt );
+ if ( $opt == 'noprotocol' ) {
+ $options['noprotocol'] = true;
+ }
+ }
+ }
+
+ $key = isset( $options['noprotocol'] ) ? 'noprotocol' : 'normal';
+
// FIXME: not very robust size check, but should work. :)
- if ( $build === false ) {
- $build = $line;
- } elseif ( strlen( $build ) + strlen( $line ) > $regexMax ) {
- $regexes .= $regexStart .
- str_replace( '/', '\/', preg_replace( '|\\\*/|', '/', $build ) ) .
- $regexEnd;
- $build = $line;
+ if ( !isset( $build[$key] ) ) {
+ $build[$key] = $line;
+ } elseif ( strlen( $build[$key] ) + strlen( $line ) > $regexMax ) {
+ $regexes[] = $regexStart[$key] .
+ str_replace( '/', '\/', preg_replace( '|\\\*/|', '/', $build[$key] ) ) .
+ $regexEnd[$key];
+ $build[$key] = $line;
} else {
- $build .= '|' . $line;
+ $build[$key] .= '|' . $line;
}
}
- if ( $build !== false ) {
- $regexes .= $regexStart .
- str_replace( '/', '\/', preg_replace( '|\\\*/|', '/', $build ) ) .
- $regexEnd;
+ foreach ( $build as $key => $value ) {
+ $regexes[] = $regexStart[$key] .
+ str_replace( '/', '\/', preg_replace( '|\\\*/|', '/', $build[$key] ) ) .
+ $regexEnd[$key];
}
return $regexes;
}
diff --git a/extensions/ConfirmEdit/ConfirmEdit.alias.php b/extensions/ConfirmEdit/ConfirmEdit.alias.php
index 763d75c6..a9d1288c 100644
--- a/extensions/ConfirmEdit/ConfirmEdit.alias.php
+++ b/extensions/ConfirmEdit/ConfirmEdit.alias.php
@@ -5,6 +5,7 @@
* @file
* @ingroup Extensions
*/
+// @codingStandardsIgnoreFile
$specialPageAliases = array();
@@ -23,9 +24,14 @@ $specialPageAliases['arz'] = array(
'Captcha' => array( 'كابتشا' ),
);
+/** Min Dong Chinese (Mìng-dĕ̤ng-ngṳ̄) */
+$specialPageAliases['cdo'] = array(
+ 'Captcha' => array( '驗證碼' ),
+);
+
/** Zazaki (Zazaki) */
$specialPageAliases['diq'] = array(
- 'Captcha' => array( 'QodaÄ°timadi' ),
+ 'Captcha' => array( 'KodaÄ°timadi' ),
);
/** Esperanto (Esperanto) */
diff --git a/extensions/ConfirmEdit/ConfirmEdit.i18n.php b/extensions/ConfirmEdit/ConfirmEdit.i18n.php
index 1c6421f0..f9f82efc 100644
--- a/extensions/ConfirmEdit/ConfirmEdit.i18n.php
+++ b/extensions/ConfirmEdit/ConfirmEdit.i18n.php
@@ -20,7 +20,7 @@ To protect the wiki against automated spam, we kindly ask you to solve the simpl
'captcha-create' => 'To create the page, please solve the simple sum below and enter the answer in the box ([[Special:Captcha/help|more info]]):',
'captcha-sendemail' => 'To protect the wiki against automated spamming, we kindly ask you to solve the simple sum below and enter the answer in the box ([[Special:Captcha/help|more info]]):',
'captcha-sendemail-fail' => 'Incorrect or missing confirmation code.',
- 'captcha-disabledinapi' => 'This action requires a captcha, so it cannot be performed through the API.',
+ 'captcha-disabledinapi' => 'This action requires a CAPTCHA, so it cannot be performed through the API.',
'captchahelp-title' => 'CAPTCHA help',
'captchahelp-cookies-needed' => 'You will need to have cookies enabled in your browser for this to work.',
'captchahelp-text' => "Web sites that accept postings from the public, like this wiki, are often abused by spammers who use automated tools to post their links to many sites.
@@ -31,7 +31,7 @@ Since this is a task that's hard to automate, it will allow most real humans to
Unfortunately this may inconvenience users with limited vision or using text-based or speech-based browsers.
At the moment we do not have an audio alternative available.
-Please contact the [[{{MediaWiki:Grouppage-sysop}}|site administrators]] for assistance if this is unexpectedly preventing you from making legitimate actions.
+Please contact the [[Special:ListAdmins|site administrators]] for assistance if this is unexpectedly preventing you from making legitimate actions.
Hit the \"back\" button in your browser to return to the page editor.",
'captcha-addurl-whitelist' => ' #<!-- leave this line exactly as it is --> <pre>
@@ -84,7 +84,13 @@ See also:
This message follows the following help message:
* {{msg-mw|Captchahelp-text}}.',
'captchahelp-text' => 'This is the help text shown on [[Special:Captcha/help]].',
- 'captcha-addurl-whitelist' => "See also: [[MediaWiki:Spam-blacklist]] and [[MediaWiki:Spam-whitelist]]. 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.",
+ 'captcha-addurl-whitelist' => 'See also: [[MediaWiki:Spam-blacklist]] and [[MediaWiki:Spam-whitelist]].
+
+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.
+
+"regex" stands for "regular expression".',
'right-skipcaptcha' => '{{doc-right|skipcaptcha}}',
);
@@ -111,7 +117,7 @@ As beskerming teen outomatiese gemorsbydraes, sal u die woorde wat onder verskyn
In party gevalle, veral as u skakels by 'n blad voeg, sal die wiki dalk 'n beeld met verwronge teks vertoon en vra dat u die woorde daarin intik. Omdat hierdie taak moeilik geoutomatiseer word, laat dit meeste regte mense toe om bydraes te maak terwyl dit meeste kwaaddoeners stop.
-Hierdie kan ongelukkig lastig wees vir mense met beperkte sig, of diegene wat teks- of spraakgebaseerde blaaiers gebruik. Tans is daar nog nie 'n klankalternatief beskikbaar nie. Kontak asseblief die [[{{MediaWiki:Grouppage-sysop}}|werfadministrateurs]] vir hulp as hierdie u onverwags belemmer om legitieme bydraes te maak.
+Hierdie kan ongelukkig lastig wees vir mense met beperkte sig, of diegene wat teks- of spraakgebaseerde blaaiers gebruik. Tans is daar nog nie 'n klankalternatief beskikbaar nie. Kontak asseblief die [[Special:ListAdmins|werfadministrateurs]] vir hulp as hierdie u onverwags belemmer om legitieme bydraes te maak.
Gebruik die \"terug\"-knoppie van u blaaier om na die vorige blad terug te keer.",
'right-skipcaptcha' => 'Captcha-handelinge uitvoer sonder om die captcha te hoef oplos',
@@ -178,7 +184,7 @@ $messages['an'] = array(
Bellas vegadas, especialment quan se mire de adhibir nuevos vinclos a una pachina, o wiki talment le amuestre una imachen con testo en color y distorsionato, y le pregunte quáls son as parolas amostratas. Como ista ye una fayena de mal automatizar, premitirá a os usuarios humanos fer as suyas edicions de vez que aturará a muitos spammers y atacants automaticos.
-Manimenos, isto puede estar un barrache ta usuarios con visión limitata u que faigan ser navegadors basatos en texto u en a voz. Por l'inte no tenemos garra alternativa de audio. Por favor, contacte con os [[{{MediaWiki:Grouppage-sysop}}|administradors]] d'o wiki ta demandar aduya si isto le ye privando de fer as suyas edicions lechitimas.
+Manimenos, isto puede estar un barrache ta usuarios con visión limitata u que faigan ser navegadors basatos en texto u en a voz. Por l'inte no tenemos garra alternativa de audio. Por favor, contacte con os [[Special:ListAdmins|administradors]] d'o wiki ta demandar aduya si isto le ye privando de fer as suyas edicions lechitimas.
Punche o botón 'enta zaga' d'o suyo navegador ta tornar ta l'editor de pachinas.",
'captcha-addurl-whitelist' => " #<!-- leave this line exactly as it is --> <pre>
@@ -223,7 +229,7 @@ $messages['ar'] = array(
للأس٠سيكون هذا صعبا بالنسبة لمستخدمي المتصÙحات المحدودة أو التي تعتمد على النصوص Ùقط أو قراءة النصوص.
ÙÙŠ الوقت الحالي لا يوجد لدينا بديل سمعي.
-من Ùضلك راسل [[{{MediaWiki:Grouppage-sysop}}|إداريي الموقع]] للمساعدة إذا كان هذا الأمر يمنعك من التعديل ووضع وصلات قانونية.
+من Ùضلك راسل [[Special:ListAdmins|إداريي الموقع]] للمساعدة إذا كان هذا الأمر يمنعك من التعديل ووضع وصلات قانونية.
إذا كنت تحرر صÙحة معينة: اضغط زر 'العودة' ÙÙŠ متصÙحك للعودة إلى التحرير.",
'captcha-addurl-whitelist' => ' #<!-- اترك هذا السطر تماما كما هو --> <pre>
@@ -258,7 +264,7 @@ $messages['arz'] = array(
للاسÙ،دا ممكن يسبب ازعاج لليوزرو اللى نظرهم ضعي٠او اللى بيستعملو براوز معتمد على الكلام او النصوص.
ÙÙ‰ الوقت الحالى احنا ما عندناش اى بديل سمعى متواÙر.
-لو سمحت تتصل [[{{MediaWiki:Grouppage-sysop}}|بلاداريين]] بتوع الموقع علشان يساعدوك لو دا منعك بشكل مش متوقع من انك تشارك بشكل قانونى.
+لو سمحت تتصل [[Special:ListAdmins|بلاداريين]] بتوع الموقع علشان يساعدوك لو دا منعك بشكل مش متوقع من انك تشارك بشكل قانونى.
دوس على زرار 'back'اللى ÙÙ‰ البراوزر بتاعك علشان ترجع لتحرير الصÙحة.",
'captcha-addurl-whitelist' => ' #<!-- سيب السطر دا زى ما هو كدا بالظبط--> <pre>
@@ -269,7 +275,7 @@ $messages['arz'] = array(
'right-skipcaptcha' => 'عمل حاجات بتنشط الكابتشا من غير ما تضطر تمر بالكابتشا',
);
-/** Assamese (অসমীয়া)
+/** Assamese (অসমীয়া)
* @author Bishnu Saikia
* @author Chaipau
* @author Gitartha.bordoloi
@@ -302,7 +308,7 @@ $messages['as'] = array(
দà§à§°à§à¦­à¦¾à¦—à§à¦¯à¦•à§à§°à¦®à§‡, সীমিত দৃষà§à¦Ÿà¦¿à¦¶à¦•à§à¦¤à¦¿ থকা বà§à¦¯à¦•à§à¦¤à¦¿à¦¸à¦•à¦²à§‡, বা পাঠà§à¦¯-আধাৰিত অথবা ধà§à¦¬à¦¨à¦¿-আধাৰিত বà§à§°à¦¾à¦‰à¦œà¦¾à§° বà§à¦¯à§±à¦¹à¦¾à§° কৰা বà§à¦¯à¦•à§à¦¤à¦¿à¦¸à¦•à¦²à§‡ ইয়াৰ পৰা অসà§à¦¬à¦¿à¦§à¦¾ পাব পাৰে।
à¦à¦‡ সময়ত ইয়াৰ কোনো ধà§à¦¬à¦¨à¦¿-আধাৰিত বিকলà§à¦ª আমাৰ হাতত নাই।
-ইয়াৰ বাবে যদি আপà§à¦¨à¦¿ যà§à¦•à§à¦¤à¦¿à¦¸à¦¨à§à¦®à¦¤ পাঠà§à¦¯ ভৰাবলৈ অসà§à¦¬à¦¿à¦§à¦¾ পাইছে, তেনেহলে [[{{MediaWiki:Grouppage-sysop}}|চাইট পà§à§°à¦¶à¦¾à¦¸à¦•à§°]] লগত যোগাযোগ কৰক।
+ইয়াৰ বাবে যদি আপà§à¦¨à¦¿ যà§à¦•à§à¦¤à¦¿à¦¸à¦¨à§à¦®à¦¤ পাঠà§à¦¯ ভৰাবলৈ অসà§à¦¬à¦¿à¦§à¦¾ পাইছে, তেনেহলে [[Special:ListAdmins|চাইট পà§à§°à¦¶à¦¾à¦¸à¦•à§°]] লগত যোগাযোগ কৰক।
পৃষà§à¦ à¦¾ সমà§à¦ªà¦¾à¦¦à¦¨à¦¾à¦²à§ˆ ঘূৰি যাবলৈ আপোনাৰ বà§à§°à¦¾à¦‰à¦œà¦¾à§°à§° 'back' বà§à¦Ÿà¦¾à¦®à¦¤ টিপা মাৰক।",
'captcha-addurl-whitelist' => ' #<!-- leave this line exactly as it is --> <pre>
@@ -337,7 +343,7 @@ Mientres qu'estos enllaces de puxarra puen desaniciase, son enforma cafiantes.
Dacuando, especialmente al amestar nuevos enllaces web nuna páxina, la wiki pue amosate una imaxe de testu coloreáu o distorsionáu y va pidite qu'escribas les pallabres que s'amuesen.
Yá qu'esti ye un llabor difícil d'automatizar, permitirá a les más de les persones reales unviar los sos testos, al empar que llenden los más de los spammers y otros atacantes automáticos.
-Por desgracia, esto pue ser un inconveniente pa los usuarios con visión llimitada o qu'usen navegadores de testu o voz. De momentu nun tenemos disponible una alternativa de soníu. Por favor, ponte'n contautu colos [[{{MediaWiki:Grouppage-sysop}}|alministradores del sitiu]] pa pidir ayuda si esto te torgare facer ediciones llexítimes.
+Por desgracia, esto pue ser un inconveniente pa los usuarios con visión llimitada o qu'usen navegadores de testu o voz. De momentu nun tenemos disponible una alternativa de soníu. Por favor, ponte'n contautu colos [[Special:ListAdmins|alministradores del sitiu]] pa pidir ayuda si esto te torgare facer ediciones llexítimes.
Calca nel botón 'atrás' del to navegador pa volver a la páxina d'edición.",
'captcha-addurl-whitelist' => ' #<!-- dexa esta llinia exautamente como ta --> <pre>
@@ -364,15 +370,16 @@ $messages['azb'] = array(
/** Bashkir (башҡортÑа)
* @author Assele
+ * @author РуÑтам Ðурыев
* @author ҒатаУлла
*/
$messages['ba'] = array(
'captcha-edit' => 'Был битте мөхәррирләү Ó©Ñөн, зинһар, Ñбай мәÑьәләне ÑиÑегеҙ һәм Ñуабын түбәндәге юлға керетегеҙ ([[Special:Captcha/help|тулыраҡ мәғлүмәт]]):',
- 'captcha-desc' => 'Спамдан һәм паролде Ñратыуҙан һаҡлау Ó©Ñөн CAPTCHA Ñ‹Ñулдары менән тәьмин итә',
+ 'captcha-desc' => 'Спамдан һәм Ñерһүҙҙе һайлып алыуҙан һаҡланыу Ó©Ñөн CAPTCHA Ñ‹Ñулдары менән тәьмин итә',
'captcha-label' => 'CAPTCHA',
'captcha-addurl' => 'Һеҙҙең текÑтығыҙҙа Ñңы тышҡы һылтанмалар бар.
Ðвтоматик Ñпамдан һаҡлау маҡÑатында, зинһар, Ñбай мәÑьәләне ÑиÑегеҙ һәм Ñуабын түбәндәге юлға керетегеҙ ([[Special:Captcha/help|тулыраҡ мәғлүмәт]]):', # Fuzzy
- 'captcha-badlogin' => 'Паролде автоматик ватыуҙан һаҡлау маҡÑатында, зинһар, Ñбай мәÑьәләне ÑиÑегеҙ һәм Ñуабын түбәндәге юлға керетегеҙ ([[Special:Captcha/help|тулыраҡ мәғлүмәт]]):', # Fuzzy
+ 'captcha-badlogin' => 'Серһүҙҙе автоматик ватыуҙан һаҡлау маҡÑатында, зинһар, Ñбай мәÑьәләне ÑиÑегеҙ һәм Ñуабын түбәндәге юлға керетегеҙ ([[Special:Captcha/help|тулыраҡ мәғлүмәт]]):',
'captcha-createaccount' => 'Иҫәп Ñҙмаларын автоматик булдырыуҙан һаҡлау маҡÑатында, зинһар, Ñбай мәÑьәләне ÑиÑегеҙ һәм Ñуабын түбәндәге юлға керетегеҙ ([[Special:Captcha/help|тулыраҡ мәғлүмәт]]):', # Fuzzy
'captcha-createaccount-fail' => 'Раҫлау коды керетелмәгән йәки дөрөҫ түгел.',
'captcha-create' => 'Яңы бит булдырыу Ó©Ñөн, зинһар, Ñбай мәÑьәләне ÑиÑегеҙ һәм Ñуабын түбәндәге юлға керетегеҙ ([[Special:Captcha/help|тулыраҡ мәғлүмәт]]):',
@@ -388,7 +395,7 @@ $messages['ba'] = array(
ҮкенеÑкә ҡаршы, бындай һаҡлыҡ Ñаралары күҙҙәре наÑар күреүÑе кешеләргә йәки текÑтлы йәки уҡыуÑÑ‹ браузерҙар ҡулланған кешеләргә уңайһыҙлыҡ килтереүе мөмкин.
Әлеге ваҡытта беҙҙең бындай тикшереүҙе тауыш менән алыштырыу мөмкинлеге юҡ.
-Зинһар, әгәр бындай тикшереү һеҙгә Ñайтта намыҫ менән Ñшләргә ҡамаÑаулаһа, [[{{MediaWiki:Grouppage-sysop}}|хәкимдәргә]] мөрәжәғәт итегеҙ.
+Зинһар, әгәр бындай тикшереү һеҙгә Ñайтта намыҫ менән Ñшләргә ҡамаÑаулаһа, [[Special:ListAdmins|хәкимдәргә]] мөрәжәғәт итегеҙ.
Мөхәррирләүгә кире ҡайтыу Ó©Ñөн, браузерығыҙҙа кире ҡайтыу төймәһенә баҫығыҙ.',
'captcha-addurl-whitelist' => '#<!-- leave this line exactly as it is --> <pre>
@@ -433,10 +440,38 @@ $messages['bcc'] = array(
/** Bikol Central (Bikol Central)
* @author Filipinayzd
+ * @author Geopoet
*/
$messages['bcl'] = array(
- 'captcha-create' => 'Tangarig maggibo an pahina, paki simbagan an simpleng suma sa ibaba asin ikaag an simbag sa laog kan kahon ([[Special:Captcha/help|more info]]):',
+ 'captcha-edit' => 'Sa pagliwat kaining pahina, pakisimbag an simplehong sumada sa ibaba asin pakikaag an simbag sa laog nin kahon ([[Special:Captcha/help|more info]]):',
+ 'captcha-desc' => 'Minatao nin mga tekniko para sa CAPTCHA tanganing protektaran kontra sa espam asin pagtutuod kan pasa-taramon',
+ 'captcha-label' => 'CAPTCHA',
+ 'captcha-addurl' => 'An saimong pagliwat minabale nin baguhong panluwas na mga kasugpunan.
+Tanganing protektaran an wiki kontra sa awtomatikong espam, kami tabi minahagad saimo na simbagan an simplehong suma sa ibaba asin pakikaag an simbag sa laog nin kahon tanganing itagama an saimong pagliwat ([[Special:Captcha/help|more info]]):',
+ 'captcha-badlogin' => 'Tanganing protektaran an wiki kontra sa awtomatikong pagbaak kan pasa-taramon, kami tabi minahagad saimo na simbagan an simplehong suma sa ibaba asin pakikaag an simbag sa laog nin kahon ([[Special:Captcha/help|more info]]):',
+ 'captcha-createaccount' => 'Tanganing protektaran an wiki kontra sa awtomatikong pagmumukna nin panindog, kami tabi minahagad saimon na simbagan an simplehong suma sa ibaba asin pakikaag an simbag sa laog nin kahon ([[Special:Captcha/help|more info]]):',
+ 'captcha-createaccount-fail' => 'Bakong tama o nawawara an koda sa kumpirmasyon.',
+ 'captcha-create' => 'Tanganing makamukna nin pahina, pakisimbagan tabi an simpleng suma sa ibaba asin ikaag an simbag sa laog kan kahon ([[Special:Captcha/help|more info]]):',
+ 'captcha-sendemail' => 'Tanganing protektaran an wiki kontra sa awtomatikong pag-eespam, kami tabi minahagad saimo na simbagan an simplehong suma sa ibaba asin pakikaag an simbag sa laog nin kahon ([[Special:Captcha/help|more info]]):',
+ 'captcha-sendemail-fail' => 'Bakong tama o nawawara an koda sa kumpirmasyon.',
+ 'captcha-disabledinapi' => 'Ining aksyon minahagad nin sarong captcha, kaya ini dae magigibo sa paagi kan API.',
'captchahelp-title' => 'Tabang sa Captcha',
+ 'captchahelp-cookies-needed' => 'Kinakaipuhan mong paganahon an mga kokies sa saimong kilyawan para ini mapadalagan.',
+ 'captchahelp-text' => 'An mga websityo na nag-aakseptar nin mga paskil gikan sa publiko, arog kaining wiki, paminsan pinag-aabuso nin mga para-espam na minagamit nin awtomatikong mga palindong tanganing maipaskil an saindang mga sugpon sa kadakulon na mga sityo. Mantang ining mga sugpon kan espam mapuwedeng pagtangkason, sinda baya sarong signipikanteng mga pasawayon.
+
+Paminsan, espesyalmente kunsoarin magdudugang nin baguhong mga sugpon sa web sa sarong pahina, an wiki mapatanaw saimo nin sarong imahe na may kolor o distortadong teksto asin maghagad saimo na itipa an mga tataramon na ipinatanaw. Mantang ini sarong gibohon na masakiton na i-awtomatiko, ini minatuggot sa kadakling mga tunay na tawo na himoon an saindang mga pamaskil mantang pinagpupundo an kadakling mga para-espam asin iba pang robotikong mga para-atake.
+
+Sa kademalasan ini makakapagtao nin inkombeniyensya sa mga paragamit na igwang limitadong paghilingon o naggagamit nin base sa teksto o base sa pagtaram na mga kilyawan.
+Sa momentong ini kami mayo nin pandangog na alternatibong makukua.
+Paki-kontak tabi an [[Special:ListAdmins|mga administrador kan sityo]] para sa katabangan kun ini dae pinag-aasahan na makapagpugol saimo sa paghihimo nin lehitimong mga aksyon.
+
+Pinduta an "pabalik" na pindutan sa saimong kilyawan tanganing makabalik sa pahina nin paraliwat.',
+ 'captcha-addurl-whitelist' => '#<!-- pabayae ining linya na eksaktong siring sana --> <pre>
+# An sintaks iyo an mga minasunod:
+# * Gabos na bagay gikan sa sarong "#" na karakter sagkod sa tapos kaining linya iyo an sarong komento
+# * An lambang linya na bakong blangko iyo an sarong pragmentong regex na magtatampad sana nin mga parabunsod sa laog kan mga URLs
+#</pre> <!-- pabayae ining linya na eksaktong siring sana -->',
+ 'right-skipcaptcha' => 'Himoon an kiblitong aksyon nin CAPTCHA na dae minaagi sa paagi kan CAPTCHA',
);
/** Belarusian (беларуÑкаÑ)
@@ -487,7 +522,7 @@ $messages['be-tarask'] = array(
Ðа жаль, гÑта можа выклікаць нÑзручнаÑьці Ð´Ð»Ñ ÑžÐ´Ð·ÐµÐ»ÑŒÐ½Ñ–ÐºÐ°Ñž з абмежаваньнÑмі па зроку Ñ– Ð´Ð»Ñ Ñ‚Ñ‹Ñ…, хто ўжывае Ñ‚ÑкÑÑ‚Ð°Ð²Ñ‹Ñ Ñ†Ñ– Ð¼Ð¾ÑžÐ½Ñ‹Ñ Ð±Ñ€Ð°ÑžÐ·Ñры.
Ðа гÑÑ‚Ñ‹ момант мы Ð½Ñ Ð¼Ð°ÐµÐ¼ аўдыё-альтÑрнатывы гÑтай праверцы.
-Калі лаÑка, зьвÑжыцеÑÑ Ð· [[{{MediaWiki:Grouppage-sysop}}|адмініÑтратарамі]], калі гÑÑ‚Ð°Ñ Ð¿Ñ€Ð°Ð²ÐµÑ€ÐºÐ° перашкаджае Вам рабіць ÑÐ»ÑƒÑˆÐ½Ñ‹Ñ Ð·Ð°Ð¿Ñ–ÑÑ‹.
+Калі лаÑка, зьвÑжыцеÑÑ Ð· [[Special:ListAdmins|адмініÑтратарамі]], калі гÑÑ‚Ð°Ñ Ð¿Ñ€Ð°Ð²ÐµÑ€ÐºÐ° перашкаджае Вам рабіць ÑÐ»ÑƒÑˆÐ½Ñ‹Ñ Ð·Ð°Ð¿Ñ–ÑÑ‹.
ÐаціÑьніце кнопку «назад» у Вашым браўзÑры, каб вÑрнуцца да Ñ€ÑÐ´Ð°Ð³Ð°Ð²Ð°Ð½ÑŒÐ½Ñ Ñтаронкі.',
'captcha-addurl-whitelist' => ' #<!-- leave this line exactly as it is --> <pre>
@@ -519,7 +554,7 @@ $messages['bg'] = array(
ПонÑкога, оÑобено когато Ñе добавÑÑ‚ нови препратки към Ñтраниците, е възможно уикито да покаже картинка Ñ Ñ‚ÐµÐºÑÑ‚, който Ñ‚Ñ€Ñбва да бъде въведен в поÑоченото поле. Тъй като това е Ñтъпка, коÑто е трудно да бъде преÑкочена при автоматизирано редактиране, Ñ‚Ñ Ð·Ð°Ñ‚Ñ€ÑƒÐ´Ð½Ñва и Ñпира повечето Ñпамъри и роботи, но допуÑка иÑтинÑките потребителите да правÑÑ‚ редакции.
-За Ñъжаление тази Ñтъпка може да затрудни незрÑщи потребители или потребители, които използват текÑтови или речеви браузъри. За момента ÑиÑтемата не разполага Ñ Ð²ÑŠÐ·Ð¼Ð¾Ð¶Ð½Ð¾ÑÑ‚ за глаÑова алтернатива. Обърнете Ñе за помощ към [[{{MediaWiki:Grouppage-sysop}}|админиÑтратор на Ñайта]], ако това изиÑкване на ÑиÑтемата ви затруднÑва да допринаÑÑте легитимно.
+За Ñъжаление тази Ñтъпка може да затрудни незрÑщи потребители или потребители, които използват текÑтови или речеви браузъри. За момента ÑиÑтемата не разполага Ñ Ð²ÑŠÐ·Ð¼Ð¾Ð¶Ð½Ð¾ÑÑ‚ за глаÑова алтернатива. Обърнете Ñе за помощ към [[Special:ListAdmins|админиÑтратор на Ñайта]], ако това изиÑкване на ÑиÑтемата ви затруднÑва да допринаÑÑте легитимно.
ÐатиÑнете бутона 'back' на Ð²Ð°ÑˆÐ¸Ñ Ð±Ñ€Ð°ÑƒÐ·ÑŠÑ€, за да Ñе върнете към редактора на Ñтраници.",
);
@@ -538,11 +573,12 @@ $messages['bn'] = array(
'captcha-label' => 'কà§à¦¯à¦¾à¦ªà¦šà¦¾',
'captcha-addurl' => 'আপনার সমà§à¦ªà¦¾à¦¦à¦¨à¦¾à¦¯à¦¼ নতà§à¦¨ বহিঃসংযোগ বিদà§à¦¯à¦®à¦¾à¦¨à¥¤
সà§à¦¬à¦¯à¦¼à¦‚কà§à¦°à¦¿à¦¯à¦¼ সà§à¦ªà§à¦¯à¦¾à¦®à§‡à¦° বিরà§à¦¦à§à¦§à§‡ সà§à¦°à¦•à§à¦·à¦¾à¦° খাতিরে অনà§à¦—à§à¦°à¦¹ নিচের যোগটি সমাহদান করà§à¦¨ à¦à¦¬à¦‚ উতà§à¦¤à¦°à¦Ÿà¦¿ বাকà§à¦¸à§‡ পà§à¦°à¦¬à§‡à¦¶ করান ([[Special:Captcha/help|আরও তথà§à¦¯]]):',
- 'captcha-badlogin' => 'সà§à¦¬à¦¯à¦¼à¦‚কà§à¦°à¦¿à¦¯à¦¼ শবà§à¦¦à¦šà¦¾à¦¬à¦¿ কà§à¦°â€Œà§à¦¯à¦¾à¦•à¦¿à¦‚-à¦à¦° বিরà§à¦¦à§à¦§à§‡ সà§à¦°à¦•à§à¦·à¦¾à¦° খাতিরে অনà§à¦—à§à¦°à¦¹ করে নিচের যোগটি সমাধান করà§à¦¨ à¦à¦¬à¦‚ উতà§à¦¤à¦°à¦Ÿà¦¿ বাকà§à¦¸à§‡ পà§à¦°à¦¬à§‡à¦¶ করান ([[Special:Captcha/help|আরও তথà§à¦¯]]):', # Fuzzy
- 'captcha-createaccount' => 'সà§à¦¬à¦¯à¦¼à¦‚কà§à¦°à¦¿à¦¯à¦¼ অà§à¦¯à¦¾à¦•à¦¾à¦‰à¦¨à§à¦Ÿ সৃষà§à¦Ÿà¦¿ রোধ করার খাতিরে অনà§à¦—à§à¦°à¦¹ করে নিচের যোগটি সমাধান করà§à¦¨ à¦à¦¬à¦‚ উতà§à¦¤à¦°à¦Ÿà¦¿ বাকà§à¦¸à§‡ পà§à¦°à¦¬à§‡à¦¶ করান ([[Special:Captcha/help|আরও তথà§à¦¯]]):', # Fuzzy
+ 'captcha-badlogin' => 'সà§à¦¬à¦¯à¦¼à¦‚কà§à¦°à¦¿à¦¯à¦¼ শবà§à¦¦à¦šà¦¾à¦¬à¦¿ কà§à¦°â€Œà§à¦¯à¦¾à¦•à¦¿à¦‚-à¦à¦° বিরà§à¦¦à§à¦§à§‡ সà§à¦°à¦•à§à¦·à¦¾à¦° খাতিরে অনà§à¦—à§à¦°à¦¹ করে নিচের যোগটি সমাধান করà§à¦¨ à¦à¦¬à¦‚ উতà§à¦¤à¦°à¦Ÿà¦¿ বাকà§à¦¸à§‡ পà§à¦°à¦¬à§‡à¦¶ করান ([[Special:Captcha/help|আরও তথà§à¦¯]]):',
+ 'captcha-createaccount' => 'সà§à¦¬à¦¯à¦¼à¦‚কà§à¦°à¦¿à¦¯à¦¼ অà§à¦¯à¦¾à¦•à¦¾à¦‰à¦¨à§à¦Ÿ সৃষà§à¦Ÿà¦¿ রোধ করার জনà§à¦¯ অনà§à¦—à§à¦°à¦¹ করে নিচের যোগটি সমাধান করà§à¦¨ à¦à¦¬à¦‚ উতà§à¦¤à¦°à¦Ÿà¦¿ বাকà§à¦¸à§‡ পà§à¦°à¦¬à§‡à¦¶ করান ([[Special:Captcha/help|আরও তথà§à¦¯]]):',
'captcha-createaccount-fail' => 'ভà§à¦² অথবা হারিয়ে যাওয়া নিশà§à¦šà¦¿à¦¤à¦•à¦°à¦£ সংকেত',
'captcha-create' => 'পাতাটি সৃষà§à¦Ÿà¦¿ করতে চাইলে অনà§à¦—à§à¦°à¦¹ করে নিচের যোগটি সমাধান করà§à¦¨ à¦à¦¬à¦‚ উতà§à¦¤à¦°à¦Ÿà¦¿ বাকà§à¦¸à§‡ পà§à¦°à¦¬à§‡à¦¶ করান ([[Special:Captcha/help|আরও তথà§à¦¯]]):',
- 'captcha-sendemail' => 'সà§à¦¬à¦¯à¦¼à¦‚কà§à¦°à¦¿à¦¯à¦¼ সà§à¦ªà§à¦¯à¦¾à¦® থেকে রকà§à¦·à¦¾ পেতে, অনà§à¦—à§à¦°à¦¹ করে সাধারন অংকটি সমাধান করà§à¦¨ à¦à¦¬à¦‚ উতà§à¦¤à¦°à¦ªà§à¦°à¦¦à¦¾à¦¨ বকà§à¦¸à§‡ লিখà§à¦¨ ([[Special:Captcha/help|আরও তথà§à¦¯]]):', # Fuzzy
+ 'captcha-sendemail' => 'সà§à¦¬à¦¯à¦¼à¦‚কà§à¦°à¦¿à¦¯à¦¼ সà§à¦ªà§à¦¯à¦¾à¦® থেকে রকà§à¦·à¦¾ পেতে, অনà§à¦—à§à¦°à¦¹ করে সাধারন অংকটি সমাধান করà§à¦¨ à¦à¦¬à¦‚ উতà§à¦¤à¦° পà§à¦°à¦¦à¦¾à¦¨ বকà§à¦¸à§‡ লিখà§à¦¨
+([[Special:Captcha/help|আরও তথà§à¦¯]]):',
'captcha-sendemail-fail' => 'নিশà§à¦šà¦¿à¦¤à¦•à¦°à¦£ কোডটি ভà§à¦² বা দেয়া হয়নি',
'captcha-disabledinapi' => 'à¦à¦‡ কাজটি করার জনà§à¦¯ à¦à¦•à¦Ÿà¦¿ কà§à¦¯à¦¾à¦ªà¦šà¦¾ পà§à¦°à¦¯à¦¼à§‹à¦œà¦¨, তাই à¦à¦Ÿà¦¿ à¦à¦ªà¦¿à¦†à¦‡ দà§à¦¬à¦¾à¦°à¦¾ করা যাবে না।',
'captchahelp-title' => 'কà§à¦¯à¦¾à¦ªà¦šà¦¾ সাহাযà§à¦¯',
@@ -551,7 +587,7 @@ $messages['bn'] = array(
কখনো কখনো, বিশেষ করে কোন পাতায় নতà§à¦¨ ওয়েব সংযোগ যোগ করার সময়, উইকিটি আপনাকে রঙিন বা বিকৃত টেকà§à¦¸à¦Ÿà¦¬à¦¿à¦¶à¦¿à¦·à§à¦Ÿ ছবি দেখিয়ে আপনাকে শবà§à¦¦à¦Ÿà¦¿ টাইপ করতে বলতে পারে। যেহেতৠà¦à¦‡ কাজটি সà§à¦¬à¦¯à¦¼à¦‚কà§à¦°à¦¿à¦¯à¦¼à¦­à¦¾à¦¬à§‡ সমà§à¦ªà¦¾à¦¦à¦¨ করা দà§à¦°à§‚হ, তাই à¦à¦‡ বà§à¦¯à¦¬à¦¸à§à¦¥à¦¾à¦° ফলে পà§à¦°à¦•à§ƒà¦¤ মানà§à¦·à§‡à¦°à¦¾ পোসà§à¦Ÿ করতে পারবেন কিনà§à¦¤à§ বেশির ভাগ সà§à¦ªà§à¦¯à¦¾à¦®à¦¾à¦° বা রোবটভিতà§à¦¤à¦¿à¦• আকà§à¦°à¦®à¦£ বাধাপà§à¦°à¦¾à¦ªà§à¦¤ হবে।
-যারা চোখে কম দেখতে পান কিংবা টেকà§à¦¸à¦Ÿà¦­à¦¿à¦¤à§à¦¤à¦¿à¦• বা উকà§à¦¤à¦¿à¦­à¦¿à¦¤à§à¦¤à¦¿à¦• বà§à¦°à¦¾à¦‰à¦œà¦¾à¦° বà§à¦¯à¦¬à¦¹à¦¾à¦° করছেন, দà§à¦°à§à¦­à¦¾à¦—à§à¦¯à¦¬à¦¶à¦¤ à¦à¦‡ বà§à¦¯à¦¬à¦¸à§à¦¥à¦¾à¦Ÿà¦¿ তাদের জনà§à¦¯ সমসà§à¦¯à¦¾à¦° সৃষà§à¦Ÿà¦¿ করবে। à¦à¦‡ মà§à¦¹à§‚রà§à¦¤à§‡ আমাদের কাছে à¦à¦‡ বà§à¦¯à¦¬à¦¸à§à¦¥à¦¾à¦Ÿà¦¿à¦° কোন অডিও বিকলà§à¦ª নেই। যদি বà§à¦¯à¦¬à¦¸à§à¦¥à¦¾à¦Ÿà¦¿ আপনাকে বৈধ পোসà§à¦Ÿ করতে অযাচিত বাধা দেয়, অনà§à¦—à§à¦°à¦¹ করে [[{{MediaWiki:Grouppage-sysop}}|সাইটের পà§à¦°à¦¶à¦¾à¦¸à¦•à¦¦à§‡à¦°]] কাছে সাহাযà§à¦¯ চান।
+যারা চোখে কম দেখতে পান কিংবা টেকà§à¦¸à¦Ÿà¦­à¦¿à¦¤à§à¦¤à¦¿à¦• বা উকà§à¦¤à¦¿à¦­à¦¿à¦¤à§à¦¤à¦¿à¦• বà§à¦°à¦¾à¦‰à¦œà¦¾à¦° বà§à¦¯à¦¬à¦¹à¦¾à¦° করছেন, দà§à¦°à§à¦­à¦¾à¦—à§à¦¯à¦¬à¦¶à¦¤ à¦à¦‡ বà§à¦¯à¦¬à¦¸à§à¦¥à¦¾à¦Ÿà¦¿ তাদের জনà§à¦¯ সমসà§à¦¯à¦¾à¦° সৃষà§à¦Ÿà¦¿ করবে। à¦à¦‡ মà§à¦¹à§‚রà§à¦¤à§‡ আমাদের কাছে à¦à¦‡ বà§à¦¯à¦¬à¦¸à§à¦¥à¦¾à¦Ÿà¦¿à¦° কোন অডিও বিকলà§à¦ª নেই। যদি বà§à¦¯à¦¬à¦¸à§à¦¥à¦¾à¦Ÿà¦¿ আপনাকে বৈধ পোসà§à¦Ÿ করতে অযাচিত বাধা দেয়, অনà§à¦—à§à¦°à¦¹ করে [[Special:ListAdmins|সাইটের পà§à¦°à¦¶à¦¾à¦¸à¦•à¦¦à§‡à¦°]] কাছে সাহাযà§à¦¯ চান।
আপনি à¦à¦–ন বà§à¦°à¦¾à¦‰à¦œà¦¾à¦°à§‡à¦° বà§à¦¯à¦¾à¦• বোতাম চেপে পাতা সমà§à¦ªà¦¾à¦¦à¦•à§‡ ফেরত যেতে পারেন।',
'captcha-addurl-whitelist' => ' #<!-- leave this line exactly as it is --> <pre>
@@ -589,7 +625,7 @@ A-wezhioù, dreist-holl pa vez ouzhpennet liammoù Web nevez war ur bajenn, e c'
Un trevell start da emgefrekaat eo hemañ. Gant se e c'hallo an implijerien wirion postañ ar pezh a fell dezho tra ma vo lakaet un harz d'an darn vrasañ eus ar stroberien pe d'an dagerien robotek all.
Koulskoude e c'hallo an implijerien berr o gweled pe ar re a implij merdeerioù diazezet war ar skrid pe war ar vouezh bezañ strafuilhet gant se. N'omp ket evit kinnig un diskoulm dre glevet evit c'hoazh.
-Kit e darempred gant [[{{MediaWiki:Grouppage-sysop}}|merourien al lec'hienn]] m'hoc'h eus diaesterioù evit kemer perzh abalamour d'an teknik-se.
+Kit e darempred gant [[Special:ListAdmins|merourien al lec'hienn]] m'hoc'h eus diaesterioù evit kemer perzh abalamour d'an teknik-se.
Pouezit war bouton 'kent' ho merdeer evit distreiñ d'ar bajenn gemmañ.",
'captcha-addurl-whitelist' => " #<!-- laoskit al linenn-mañ tre evel m'emañ --> <pre>
@@ -628,7 +664,7 @@ Pošto je teško automatizovati ovakav zadatak, on omogućuje svim pravim ljudim
Nažalost, ovo može da bude nepovoljno za korisnike sa ograniÄenim vidom i za one koji koriste preglednike bazirane na tekstu ili govoru.
U ovom trenutku, audio alternativa nije dostupna.
-Molimo Vas da kontaktirate [[{{MediaWiki:Grouppage-sysop}}|administratore sajta]] radi pomoći ako Vas ovo neoÄekivano ometa u pravljenju dobrih izmjena.
+Molimo Vas da kontaktirate [[Special:ListAdmins|administratore sajta]] radi pomoći ako Vas ovo neoÄekivano ometa u pravljenju dobrih izmjena.
Kliknite 'nazad' ('back') dugme vašeg preglednika da se vratite na polje za unos teksta.",
'captcha-addurl-whitelist' => ' #<!-- ostavite ovaj red onakav kakav je --> <pre>
@@ -665,7 +701,7 @@ $messages['ca'] = array(
Quan creeu nous comptes d'usuari o afegiu enllaços a una pàgina se us demanarà que respongueu una pregunta fàcil, una suma o que teclegeu el text que apareix en una imatge distorsionada. És difícil programar un robot per aquest tipus de tasques, i gràcies a açò, es poden aturar la majoria d'atacants robots.
-Malauradament, aquest sistema pot suposar un inconvenient per a usuaris amb problemes de visió o que utilitzin navegadors de text simple o de veu. Actualment no disposem de cap alternativa auditiva disponible. Contacteu els [[{{MediaWiki:Grouppage-sysop}}|administradors del web]] si aquest sistema us impedeix de fer edicions legítimes.
+Malauradament, aquest sistema pot suposar un inconvenient per a usuaris amb problemes de visió o que utilitzin navegadors de text simple o de veu. Actualment no disposem de cap alternativa auditiva disponible. Contacteu els [[Special:ListAdmins|administradors del web]] si aquest sistema us impedeix de fer edicions legítimes.
Necessitareu tenir les galetes (''cookies'') activades al vostre navegador per a realitzar aquestes accions.
@@ -679,10 +715,11 @@ Cliqueu el botó de retrocedir del vostre navegador per a tornar al formulari.",
);
/** Min Dong Chinese (Mìng-dĕ̤ng-ngṳ̄)
+ * @author Yejianfei
*/
$messages['cdo'] = array(
'captcha-edit' => "Nṳ̄ gă-tiÄ•ng lÄu sÄ­ng gì nguôi-buô lièng-giék. Ôi lÄu ê̤ṳ-huòng ô tiàng-sê̤ṳ cê̤ṳ-dông huák-buó bóng-só̤ séng-sék (''spam''), kÄ«-dâe̤ng nṳ̄ gié-sáung â-dÄ̤ gÄng-dăng gì gă-huák, gái ciÅng dák-áng siÄ diÄ“ gáh-gáh diÄ“-sié ([[Special:Captcha/help|gáing sâ̤ séng-sék]]):",
- 'captchahelp-title' => 'Captcha bÅng-cô',
+ 'captchahelp-title' => '驗證碼幫助',
'captchahelp-text' => "Chiông wiki dÄ“ng kăi-huóng gì uÅng-câng sèu-sèu ké̤ṳk bóng-só̤ séng-sék huák-buó-nè̤ng (\\'\\'spammer\\'\\') páh-chÄ: Ä­-gáuk-nè̤ng kÄ•k cê̤ṳ-dông-huá gì gă-sÄ­ táik bóng-só̤ guÅng-gó̤ lièng gáu Ä­ gì uÅng-câng. ChÅ­i-iòng cÄ« piÄ• bóng-só̤ séng-sék â̤ dù lâi gì, dáng-sê iâ cêng-go̤ tÅ̤-iéng.
Ô sèng-hâiu, dÄ•k-biék sê găk nṳ̄ gă-tiÄ•ng sÄ­ng gì nguôi-buô lièng-giék gáu wiki gì sèng-hâiu, wiki â̤ hiÄ“ng-sê sáik-ké gáuk-iông hĕ̤k-ciÄ sê hìng-câung ô gÄi-biéng gì ùng-cê dù-chiông, giéu nṳ̄ páh diÄ“ nṳ̄ sÅ« káng giéng gì cê hĕ̤k sṳ̀ (hô̤ lÅ̤ \"captcha\"). Ĭng-ôi gÄ­-ké-nè̤ng mâ̤ chiàng ciÄ Ãªng-ô, gó-chṳ̄ cêu â̤ huòng-cÄ« duâi-buô-hông iù gÄ­-ké-nè̤ng huák-buó bóng-só̤ séng-sék (bók-guó, cÄ­ng nè̤ng huák-buó bóng-só̤ séng-sék, ciÄ huÅng-huák huòng mâ̤ lì).
@@ -694,6 +731,20 @@ CÄ­ng mì-hâng, dó̤i hÄ« piÄ• mĕ̤k-ciÅ­ mâ̤ hÅ̤, hĕ̤k-ciÄ sê sÄi-Ã
Buóh diÅng kó̤ piÄ•ng-cÄ­k hiÄ•k-miêng, áik \"diÅng kó̤ sèng 1 hiÄ•k\" (\\'\\'back\\'\\').", # Fuzzy
);
+/** Chechen (нохчийн)
+ * @author Умар
+ */
+$messages['ce'] = array(
+ 'right-skipcaptcha' => 'CAPTCHA-хьажар кхочушдар, CAPTCHA чекхдалар доцуш',
+);
+
+/** Sorani Kurdish (کوردی)
+ * @author Calak
+ */
+$messages['ckb'] = array(
+ 'right-skipcaptcha' => 'جێبەجێکردنی کردەوەکانی پێویست بە کاپچا بەبێ بەکارھێنانی کاپچا',
+);
+
/** Czech (Äesky)
* @author Danny B.
* @author Li-sung
@@ -719,7 +770,7 @@ V zájmu ochrany této wiki pÅ™ed automatickým spamováním vás prosíme o vyÅ
NÄ›kdy, zvláštÄ› pÅ™i pÅ™idávání nových webových odkazů, vám může wiki ukázat obrázek barevného Äi pokrouceného textu a požádat vás o opsání zobrazených znaků. Jelikož takovou úlohu lze jen těžko automatizovat, skuteÄní lidé mohou dále pÅ™ispívat, zatímco vÄ›tÅ¡inu spammerů a jiných robotických útoÄníků to zastaví.
-Bohužel to vÅ¡ak může pÅ™edstavovat nepříjemný problém pro uživatele se zrakovým postižením Äi uživatele používající textové prohlížeÄe Äi hlasové ÄteÄky. V souÄasné dobÄ› nemáme alternativní zvukovou verzi. Kontaktujte laskavÄ› [[{{MediaWiki:Grouppage-sysop}}|správce serveru]], pokud vám to brání v užiteÄných příspÄ›vcích a potÅ™ebujete pomoc.
+Bohužel to vÅ¡ak může pÅ™edstavovat nepříjemný problém pro uživatele se zrakovým postižením Äi uživatele používající textové prohlížeÄe Äi hlasové ÄteÄky. V souÄasné dobÄ› nemáme alternativní zvukovou verzi. Kontaktujte laskavÄ› [[Special:ListAdmins|správce serveru]], pokud vám to brání v užiteÄných příspÄ›vcích a potÅ™ebujete pomoc.
Pro návrat na pÅ™edchozí stránku stisknÄ›te ve svém prohlížeÄi tlaÄítko „zpÄ›t“.',
'captcha-addurl-whitelist' => ' #<!-- Nechte tento řádek přesně tak jak je --> <pre>
@@ -754,7 +805,7 @@ O dro i dro, yn enwedig wrth ychwanegu dolenni at safleoedd gwe eraill, fe fydd
Yn anffodus, mae hyn yn creu trafferthion i'r rhai sydd yn defnyddio porwyr testun neu borwyr sain, neu sydd yn colli eu golwg.
Ar hyn o bryd nid oes fersiwn sain ar gael.
-Cysylltwch â [[{{MediaWiki:Grouppage-sysop}}|gweinyddwyr y safle]] os ydi'r nodwedd hon yn eich rhwystro rhag ychwanegu golygiadau dilys.
+Cysylltwch â [[Special:ListAdmins|gweinyddwyr y safle]] os ydi'r nodwedd hon yn eich rhwystro rhag ychwanegu golygiadau dilys.
Gwasgwch botwm 'nôl' eich porwr er mwyn dychwelyd at y dudalen golygu.",
'captcha-addurl-whitelist' => '#<!-- leave this line exactly as it is --> <pre>
@@ -771,6 +822,7 @@ Gwasgwch botwm 'nôl' eich porwr er mwyn dychwelyd at y dudalen golygu.",
/** Danish (dansk)
* @author Aputtu
* @author Byrial
+ * @author Christian List
* @author Hylle
* @author Kaare
* @author Peter Alberti
@@ -783,7 +835,7 @@ $messages['da'] = array(
Som beskyttelse af wikien mod automatiseret spam, skal du løse det enkle regnestykke nedenfor og skrive resultatet i boksen, for at kunne gemme din redigering ([[Special:Captcha/help|flere oplysninger]]):',
'captcha-badlogin' => 'For at beskytte wikien mod automatiseret adgangskodegætning, skal du løse det enkle regnestykke nedenfor og skrive resultatet i boksen ([[Special:Captcha/help|flere oplysninger]]):',
'captcha-createaccount' => 'For at beskytte wikien mod automatisk oprettelse af brugernavne, skal du løse det enkle regnestykke nedenfor og skrive resultatet i boksen ([[Special:Captcha/help|flere oplysninger]]):',
- 'captcha-createaccount-fail' => 'Forkert eller manglende kodeord.',
+ 'captcha-createaccount-fail' => 'Forkert eller manglende bekræftelseskode.',
'captcha-create' => 'For at oprette en ny side, skal du give svaret på regnestyket nedenfor, og angive resultatet i feltet under det. ([[Special:Captcha/help|mere information]]):',
'captcha-sendemail' => 'For at beskytte wikien mod automatisk spamning, skal du løse det enkle regnestykke nedenfor og skrive resultatet i boksen ([[Special:Captcha/help|flere oplysninger]]):',
'captcha-sendemail-fail' => 'Forkert eller manglende bekræftelseskode.',
@@ -794,7 +846,7 @@ Som beskyttelse af wikien mod automatiseret spam, skal du løse det enkle regnes
I visse tilfælde, specielt når der tilføjes nye links til denne wiki, vil softwaren vise dig et billede af et stykke forvredet og sløret tekst. Du skal indtaste det ord, der vises, før du kan gennemføre handlingen. Formålet er at skelne mellem mennesker og automatiserede værktøjer, da de sidste har meget svært ved at genkende ordene.
-Desværre kan dette medføre problemer for svagtseende brugere, og brugere der bruger software der oplæser indholdet af siden. For øjeblikket findes der ikke et lydbaseret alternativ. Kontakt venligst en [[{{MediaWiki:Grouppage-sysop}}|administrator]] med henblik på at få hjælp, hvis dette forhindrer tilføjelsen af godartet materiale.
+Desværre kan dette medføre problemer for svagtseende brugere, og brugere der bruger software der oplæser indholdet af siden. For øjeblikket findes der ikke et lydbaseret alternativ. Kontakt venligst en [[Special:ListAdmins|administrator]] med henblik på at få hjælp, hvis dette forhindrer tilføjelsen af godartet materiale.
Tryk på 'tilbage'-knappen i din browser for at returnere til redigeringssiden.",
'captcha-addurl-whitelist' => ' #<!-- Undlad at rette denne linie --> <pre>
@@ -829,14 +881,14 @@ Um das Wiki vor automatisiertem Spam zu schützen, bitten wir dich die untensteh
'captcha-disabledinapi' => 'Diese Aktion benötigt ein CAPTCHA. Sie kann nicht über die API ausgeführt werden.',
'captchahelp-title' => 'CAPTCHA-Hilfe',
'captchahelp-cookies-needed' => "'''Wichtiger Hinweis:''' Es müssen Cookies im Browser erlaubt sein.",
- 'captchahelp-text' => 'Internetangebote, die für Beiträge von praktisch jedem offen sind — so wie dieses Wiki — werden oft von Spammern missbraucht, die ihre Links automatisch auf vielen Webseiten platzieren. Diese Spam-Links können wieder entfernt werden, sie sind aber ein erhebliches Ärgernis.
+ 'captchahelp-text' => 'Internetangebote, die für Beiträge von praktisch jedem offen sind – so wie dieses Wiki – werden oft von Spammern missbraucht, die ihre Links automatisch auf vielen Webseiten platzieren. Diese Spam-Links können wieder entfernt werden, sie sind aber ein erhebliches Ärgernis.
In manchen Fällen, insbesondere beim Hinzufügen von neuen Weblinks zu einer Seite, kann es vorkommen, dass dieses Wiki ein Bild mit einem farbigen und verzerrten Text anzeigt und dazu auffordert, die angezeigten Wörter einzutippen.
Da eine solche Aufgabe nur schwer automatisch erledigt werden kann, werden dadurch die meisten Spammer, die mit automatischen Werkzeugen arbeiten, gestoppt, wogegen menschliche Benutzer ihren Beitrag absenden können.
Leider kann dies zu Schwierigkeiten für Personen führen, die über eine eingeschränkte Sehfähigkeit verfügen oder text- oder sprachbasierte Browser verwenden. Aktuell sind keine Audio-CAPTCHAs verfügbar.
-Bitte kontaktiere einen [[{{MediaWiki:Grouppage-sysop}}|Administratoren]] für weitere Hilfe, wenn dies es unmöglich macht, erwünschte Bearbeitungen vorzunehmen.
+Bitte kontaktiere einen [[Special:ListAdmins|Administrator]] für weitere Hilfe, wenn dies es unmöglich macht, erwünschte Bearbeitungen vorzunehmen.
Der „Zurück“-Knopf des Browsers führt zurück zum Bearbeitungsfenster.',
'captcha-addurl-whitelist' => ' #<!-- Diese Zeile darf nicht verändert werden! --> <pre>
@@ -868,7 +920,7 @@ Da eine solche Aufgabe nur schwer automatisch erledigt werden kann, werden dadur
Leider kann dies zu Schwierigkeiten für Personen führen, die über eine eingeschränkte Sehfähigkeit verfügen oder text- oder sprachbasierte Browser verwenden. Aktuell sind keine Audio-Captchas verfügbar.
-Bitte kontaktieren Sie einen [[{{MediaWiki:Grouppage-sysop}}|Administratoren]] für weitere Hilfe, wenn dies es unmöglich macht, erwünschte Bearbeitungen vorzunehmen.
+Bitte kontaktieren Sie einen [[Special:ListAdmins|Administratoren]] für weitere Hilfe, wenn dies es unmöglich macht, erwünschte Bearbeitungen vorzunehmen.
Der „Zurück“-Knopf des Browsers führt zurück zum Bearbeitungsfenster.',
);
@@ -904,7 +956,7 @@ Eka ena process otomatik nibeno, ena process otomatik spam kerogan vinderneno fe
Ma ef bikeri ena process belki ti ra zehmeti. belki cim tu ra ÅŸcekuyan hewl niesno.
Nika ma da sistemê vengî cinoke ti ra vaci resim da kamci cekuyan esto.
-Ma rica keno ti yew [[{{MediaWiki:Grouppage-sysop}}|idarekar]] ra yew mesaj bişavî u o ra yardim bivaci eka ti yew linkê hewlî darnone.
+Ma rica keno ti yew [[Special:ListAdmins|idarekar]] ra yew mesaj bişavî u o ra yardim bivaci eka ti yew linkê hewlî darnone.
Browser xo de goceke 'back' rê klik bike şo pela editorî.",
'captcha-addurl-whitelist' => ' #<!-- leave this line exactly as it is --> <pre>
@@ -941,7 +993,7 @@ Dokulaž to jo nadawk, kótaryž dajo se śěžko awtomatizěrowaś, dówolujo t
Bóžko to móžo kazyś wužywarjow z wobgraniwoneju zamóžnosću wiźenja pśi wužywanju wobglědowakow, kótarež bazěruju na teksće abo rěcnem wudaśu.
Tuchylu njamamy awdioalternatiwu.
-Staj se pšosym z [[{{MediaWiki:Grouppage-sysop}}|administratorami sedła]] z pšosbu wó pomoc do zwiska, jolic to śi njewócakane zawobarujo słanje legitimnych pśinoskow.
+Staj se pšosym z [[Special:ListAdmins|administratorami sedła]] z pšosbu wó pomoc do zwiska, jolic to śi njewócakane zawobarujo słanje legitimnych pśinoskow.
Klikni na tłocašk "Slědk" we swójom wobglědowaku, aby wróśił k bokowemu editoroju.',
'captcha-addurl-whitelist' => ' #<!-- wóstaj toś tu smužku rowno ako jo --> <pre>
@@ -989,7 +1041,7 @@ $messages['el'] = array(
ΜεÏικές φοÏές, ειδικά κατά την Ï€Ïοσθήκη νέων συνδέσμων σε μια σελίδα, το wiki μποÏεί να σας παÏουσιάσει μια εικόνα με χÏωματισμένο ή διαστÏεβλωμένο κείμενο και να σας ζητήσει να πληκτÏολογήσετε τις λέξεις που διακÏίνετε. Δεδομένου ότι αυτή η εÏγασία είναι δÏσκολο να αυτοματοποιηθεί, θα επιτÏέψει στους πεÏισσότεÏους Ï€ÏαγματικοÏÏ‚ ανθÏώπους να κάνουν τις δημοσιεÏσεις τους, σταματώντας όμως spammers και άλλους Ïομποτικά επιτιθέμενους.
-Δυστυχώς αυτό μποÏεί να Ï€Ïοκαλέσει δυσχέÏεια σε χÏήστες με Ï€Ïοβλήματα ÏŒÏασης τους ή όσους χÏησιμοποιοÏν πεÏιηγητές αποκλειστικά κειμένου ή πεÏιηγητές με ομιλία. ΠÏος το παÏόν δεν έχουμε κάποια ηχητική εναλλακτική λÏση διαθέσιμη. ΠαÏακαλώ επικοινωνήστε με τους [[{{MediaWiki:Grouppage-sysop}}|διαχειÏιστές]] του ιστότοπου για βοήθεια, εάν αυτό για κάποιο λόγο σας αποτÏέπει να εκτελέσετε θεμιτές ενέÏγειες.
+Δυστυχώς αυτό μποÏεί να Ï€Ïοκαλέσει δυσχέÏεια σε χÏήστες με Ï€Ïοβλήματα ÏŒÏασης τους ή όσους χÏησιμοποιοÏν πεÏιηγητές αποκλειστικά κειμένου ή πεÏιηγητές με ομιλία. ΠÏος το παÏόν δεν έχουμε κάποια ηχητική εναλλακτική λÏση διαθέσιμη. ΠαÏακαλώ επικοινωνήστε με τους [[Special:ListAdmins|διαχειÏιστές]] του ιστότοπου για βοήθεια, εάν αυτό για κάποιο λόγο σας αποτÏέπει να εκτελέσετε θεμιτές ενέÏγειες.
Πατήστε το κουμπί «πίσω» στον πεÏιηγητή σας για να επιστÏέψετε στον επεξεÏγαστή σελίδων.',
'captcha-addurl-whitelist' => ' #<!-- αφήστε αυτή την γÏαμμή ακÏιβώς όπως είναι --> <pre>
@@ -1012,7 +1064,7 @@ Since this is a task that's hard to automate, it will allow most real humans to
Unfortunately this may inconvenience users with limited vision or using text-based or speech-based browsers.
At the moment we do not have an audio alternative available.
-Please contact the [[{{MediaWiki:Grouppage-sysop}}|site administrators]] for assistance if this is unexpectedly preventing you from making legitimate posts.
+Please contact the [[Special:ListAdmins|site administrators]] for assistance if this is unexpectedly preventing you from making legitimate posts.
Hit the 'back' button in your browser to return to the page editor.",
);
@@ -1029,7 +1081,7 @@ Since this is a task that's hard to automate, it will allow most real humans to
Unfortunately this may inconvenience users with limited vision or using text-based or speech-based browsers.
At the moment we do not have an audio alternative available.
-Please contact the [[{{MediaWiki:Grouppage-sysop}}|site administrators]] for assistance if this is unexpectedly preventing you from making legitimate posts.
+Please contact the [[Special:ListAdmins|site administrators]] for assistance if this is unexpectedly preventing you from making legitimate posts.
Hit the 'back' button in your browser to return to the page editor.",
);
@@ -1045,12 +1097,12 @@ $messages['eo'] = array(
'captcha-label' => 'CAPTCHA',
'captcha-addurl' => 'Via redakto entenas novajn eksterajn ligilojn.
Por protekti la vikion kontraux aÅ­tomata spamado, bonvolu solvi la simplan problemon sube kaj entajpu la respondon en la kesto por konservi vian redakton ([[Special:Captcha/help|pli da informo]]):',
- 'captcha-badlogin' => 'Helpi protekti kontraÅ­ aÅ­tomata divenado de pasvortoj, bonvolu solvi la simplan sumon kaj enigi la respondon en la skatolo ([[Special:Captcha/help|plua informo]]):', # Fuzzy
- 'captcha-createaccount' => 'Helpi protekti kontraÅ­ aÅ­tomata konto-kreado, bonvolu solvi la simplan sumon suben
-kaj enigi la respondon en la skatolo ([[Special:Captcha/help|plua informo]]):', # Fuzzy
+ 'captcha-badlogin' => 'Por protekti kontraÅ­ aÅ­tomata divenado de pasvortoj, bonvolu solvi la simplan sumon kaj enigi la respondon en la skatolo ([[Special:Captcha/help|plua informo]]):',
+ 'captcha-createaccount' => 'Por protekti kontraÅ­ aÅ­tomata konto-kreado, bonvolu solvi la simplan sumon suben
+kaj enigi la respondon en la skatolo ([[Special:Captcha/help|plua informo]]):',
'captcha-createaccount-fail' => 'MalÄusta aÅ­ mankanta konfirma kodo.',
'captcha-create' => 'Por krei la paÄon, bonvolu solvi la simplan sumon jenan kaj enigi la respondon en la skatolo ([[Special:Captcha/help|plua informo]]):',
- 'captcha-sendemail' => 'Por helpi protekti kontraÅ­ aÅ­tomata spamado, bonvolu solvi la simplan sumon kaj enigi la respondon en la skatolo ([[Special:Captcha/help|plua informo]]):', # Fuzzy
+ 'captcha-sendemail' => 'Por helpi protekti kontraÅ­ aÅ­tomata spamado, bonvolu solvi la simplan sumon kaj enigi la respondon en la skatolo ([[Special:Captcha/help|plua informo]]):',
'captcha-sendemail-fail' => 'MalÄusta aÅ­ mankanta konfirma kodo.',
'captcha-disabledinapi' => 'Ĉi tiu ago bezonas captcha, tial Äi ne estas farebla per API.',
'captchahelp-title' => 'Helpo pri captcha',
@@ -1063,7 +1115,7 @@ Tial ĉi tiu tasko estas malfacila por fari aŭtomate, ebligos al realaj homoj f
BedaÅ­rinde, ĉi tio eble Äenetos uzantojn kun malbona vidkapablo kiu utiligas tekstajn aÅ­ voĉajn retumilojn.
Ĉi-momente, neniu aŭda alternativo estas havebla.
-Bonvolu kontakti la [[{{MediaWiki:Grouppage-sysop}}|administrantojn de la retejo]] por helpo se ĉi tio malebligas al vi fari bonan aldonon.
+Bonvolu kontakti la [[Special:ListAdmins|administrantojn de la retejo]] por helpo se ĉi tio malebligas al vi fari bonan aldonon.
Klaku la 'reiru' butonon en via retumilo por reiri al la paÄo-redaktilo.",
'captcha-addurl-whitelist' => ' #<!-- ne ÅanÄu ĉi tiun linion iel ajn --> <pre>
@@ -1107,7 +1159,7 @@ En ocasiones, especialmente cuando añada nuevos enlaces a una página, la wiki
Desafortunadamente esto puede ser un inconveniente para usuarios con visión limitada o para navegadores basados en texto o en voz.
En este momento no tenemos una alternativa de audio disponible.
-Por favor contacte a los [[{{MediaWiki:Grouppage-sysop}}|administradores del sitio]] para asistencia si esto está impidiendiendo inesperadamente que hagas mensajes legítimos.
+Por favor contacte a los [[Special:ListAdmins|administradores del sitio]] para asistencia si esto está impidiendiendo inesperadamente que hagas mensajes legítimos.
Presione el botón 'atrás' en su navegador para retornar al editor de página.",
'captcha-addurl-whitelist' => ' #<!-- deje esta línea exactamente como está --> <pre>
@@ -1144,7 +1196,7 @@ Palun lahenda allpool lihtne tehe ja sisesta vastus kasti, et saaksid muudatuse
Kasutajakontot registreerides või mõnele lehele uusi internetiaadresse postitades näidatakse moonutatud tekstiga pilti ja palutakse sisestada seal kuvatud sõnad. Kuna selliselt pildilt on arvutil raske teksti välja lugeda, on see efektiivseks kaitseks rämpspostirobotite vastu ja lubab samas tavakasutajatel rahus muudatusi teha.
Kahjuks võib see tekitada ebamugavusi nägemisraskustega inimestele või neile, kes kasutavad tehiskõneseadet või tekstipõhist veebilehitsejat. Hetkel pole meil helipõhist alternatiivi.
-Kui sul tekib raskusi muudatuste tegemisel, võta palun ühendust selle võrgukoha [[{{MediaWiki:Grouppage-sysop}}|administraatoritega]].
+Kui sul tekib raskusi muudatuste tegemisel, võta palun ühendust selle võrgukoha [[Special:ListAdmins|administraatoritega]].
Konto registreerimise lehele või redigeerimisaknasse tagasi jõudmiseks klõpsa veebilehitseja tagasi-nuppu.',
'captcha-addurl-whitelist' => ' #<!-- Jäta see rida muutmata kujule. --> <pre>
@@ -1175,7 +1227,7 @@ Lotura horiek ezabatu egin daitezkeen arren, traba dira.
Batzuetan, eta bereziki webgune berri bateko loturak gehitzen dituzunean, hitz batzuk dituen irudi bat agertuko zaizu, eta bertan ageri den testua idazteko eskatuko zaizu. Lan hori automatizatzeko zaila da, eta pertsonei ezer kostatzen ez zaigunez, spam testuak saihesteko lagungarria da.
-Zoritxarrez, ikusmen mugatua edo testu bidezko nabigatzaileak erabiltzen dituzten erabiltzeek arazoak izan ditzakete. Horrelako zerbait gertatzen bazaizu, mesedez, jarri [[{{MediaWiki:Grouppage-sysop}}|administratzaileekin]] harremanetan.
+Zoritxarrez, ikusmen mugatua edo testu bidezko nabigatzaileak erabiltzen dituzten erabiltzeek arazoak izan ditzakete. Horrelako zerbait gertatzen bazaizu, mesedez, jarri [[Special:ListAdmins|administratzaileekin]] harremanetan.
Zure nabigatzaileko 'atzera' lotura erabili aldaketen orrialdera itzultzeko.",
);
@@ -1193,7 +1245,7 @@ $messages['fa'] = array(
'captcha-label' => 'کپچا',
'captcha-addurl' => 'ویرایش شما شامل پیوندهای تازه‌ای به بیرون است.
برای Ú©Ù…Ú© به جلوگیری از ارسال خودکار هرزنامه‌ها، لطÙاً حاصل جمع زیر را حساب کنید Ùˆ نتیجه را در جعبه وارد کنید ([[Special:Captcha/help|اطلاعات بیشتر]]):',
- 'captcha-badlogin' => 'برای Ú©Ù…Ú© به جلوگیری از سرقت خودکار کلمه عبور، لطÙاً حاصل جمع زیر را حساب کنید Ùˆ نتیجه را در جعبه وارد کنید ([[Special:Captcha/help|اطلاعات بیشتر]]):',
+ 'captcha-badlogin' => 'برای Ú©Ù…Ú© به جلوگیری از شکستن خودکار گذرواژه، لطÙاً حاصل جمع زیر را حساب کنید Ùˆ نتیجه را وارد کنید ([[Special:Captcha/help|اطلاعات بیشتر]]):',
'captcha-createaccount' => 'برای جلوگیری از ایجاد خودکار حساب کاربری، لطÙاً حاصل جمع زیر را حساب کنید Ùˆ نتیجه را در جعبه وارد کنید ([[Special:Captcha/help|اطلاعات بیشتر]]):',
'captcha-createaccount-fail' => 'کد تأییدی وجود ندارد یا نادرست است.',
'captcha-create' => 'برای ایجاد صÙحه لطÙاً حاصل جمع زیر را حساب کنید Ùˆ نتیجه را در جعبه وارد کنید ([[Special:Captcha/help|اطلاعات بیشتر]]):',
@@ -1209,7 +1261,7 @@ $messages['fa'] = array(
از آنجا که خودکارسازی این کار دشوار است، انسانهای واقعی می‌توانند پیوندهاشان را وارد کنند ولی برنامه‌های خودکار تبلیغاتی از خرابکاری باز خواهند ماند.
متأسÙانه این امر ممکن است باعث مزاحمت برای کاربرانی شود Ú©Ù‡ چشمشان ضعی٠است یا از مرورگرهای متنی یا Ú¯Ùتاری استÙاده می‌کنند.
-در حال حاضر ما جایگزین صوتی‌ای برای این کار نداریم. لطÙاً اگر برای واردساختن پیوندهای مشروع دچار مشکل شده‌اید با [[{{MediaWiki:Grouppage-sysop}}|مدیران این تارنما]] تماس بگیرید.
+در حال حاضر ما جایگزین صوتی‌ای برای این کار نداریم. لطÙاً اگر برای واردساختن پیوندهای مشروع دچار مشکل شده‌اید با [[Special:ListAdmins|مدیران این تارنما]] تماس بگیرید.
دکمهٔ «بازگشت» را در مرورگر خود Ùشار دهید تا به صÙحهٔ ویرایش بازگردید.',
'captcha-addurl-whitelist' => ' #<!-- این سطر را همان‌گونه که هست رها کنید --> <pre>
@@ -1227,6 +1279,7 @@ $messages['fa'] = array(
* @author Linnea
* @author Nedergard
* @author Nike
+ * @author Stryn
* @author Varusmies
*/
$messages['fi'] = array(
@@ -1239,7 +1292,7 @@ Automatisoitujen roskamuokkausten välttämiseksi ratkaise alla oleva summa ja k
'captcha-createaccount' => 'Automaattisen käyttäjätunnusten luonnin estämiseksi ratkaise alla oleva summa ja kirjoita se kenttään ([[Special:Captcha/help|lisätietoja]]):',
'captcha-createaccount-fail' => 'Väärä tai puuttuva varmistuskoodi.',
'captcha-create' => 'Ratkaise alla oleva summa jatkaaksesi ([[Special:Captcha/help|lisätietoja]]):',
- 'captcha-sendemail' => 'Jotta auttaisit suojautumaan automaattiselta roskapostitukselta, ratkaise alla oleva yksinkertainen yhteenlasku ja kirjoita vastaus laatikkoon ([[Special:Captcha/help|lisätietoja]]):', # Fuzzy
+ 'captcha-sendemail' => 'Jotta auttaisit wikiä suojautumaan automaattiselta roskapostitukselta, pyydämme sinua ystävällisesti ratkaisemaan alla olevan yksinkertaisen yhteenlaskun ja kirjoittamaan vastauksen laatikkoon ([[Special:Captcha/help|lisätietoja]]):',
'captcha-sendemail-fail' => 'Virheellinen tai puuttuva vahvistuskoodi',
'captcha-disabledinapi' => 'Tämä toiminto vaatii kuvavarmennusta, joten et voi suorittaa sitä APIn kautta.',
'captchahelp-title' => 'Captcha-ohje',
@@ -1248,7 +1301,7 @@ Automatisoitujen roskamuokkausten välttämiseksi ratkaise alla oleva summa ja k
Joskus, erityisesti kun lisäät uusia linkkejä, saatat nähdä kuvan, jossa on värillistä ja vääristynyttä tekstiä, ja sinua pyydetään kirjoittamaan sen sisältämät sanat. Koska tätä tehtävää on vaikea automatisoida, se sallii melkein kaikkien oikeiden ihmisten tehdä muutoksensa, mutta estää automaattiset lisäykset.
-Valitettavasti tämä saattaa estää käyttäjiä, joilla on rajoittunut näkökyky tai käyttäjiä, jotka käyttävät teksti- tai puhepohjaisia selaimia. Ota yhteyttä sivuston [[{{MediaWiki:Grouppage-sysop}}|sivuston ylläpitäjiin]], jos et pysty tekemään kunnollisia muutoksia.
+Valitettavasti tämä saattaa estää käyttäjiä, joilla on rajoittunut näkökyky tai käyttäjiä, jotka käyttävät teksti- tai puhepohjaisia selaimia. Ota yhteyttä [[Special:ListAdmins|sivuston ylläpitäjiin]], jos et pysty tekemään kunnollisia muutoksia.
Varmistus ei toimi, jos evästeet eivät ole käytössä.
@@ -1269,10 +1322,11 @@ $messages['fo'] = array(
'captcha-edit' => 'Fyri at rætta hesa síðu, vinarliga loys tað einfalda roknistykki niðanfyri og skriva svarið í teigin ([[Special:Captcha/help|meira kunning]]):',
'captcha-desc' => 'Gevur CAPTCHA teknikkir fyri at verja ímóti spamming og ímóti giting av loyniorði',
'captcha-label' => 'CAPTCHA',
- 'captcha-createaccount' => 'Sum ein vernd ímóti sjálvvirknum spam, er neyðugt hjá tær at skriva inn tey orð, sum koma fyri á myndini fyri at stovna eina kontu: <br />([[Special:Captcha/help|Hvat er hetta?]])', # Fuzzy
+ 'captcha-createaccount' => 'Fyri at verja wikiina ímóti sjálvvirkandi spam kontoupprættan, vilja vit vinarliga heita á teg um at loysa ta einføldu rokniuppgávuna niðanfyri og skriva svarið í teigin
+([[Special:Captcha/help|meira kunning]]):',
'captcha-createaccount-fail' => 'Skeiv ella manglandi váttanar loyniorð.',
'captcha-create' => 'Fyri at upprætta síðuna, vinarliga loys tað einfalda roknistykki niðanfyri og skriva svarið í teigin ([[Special:Captcha/help|meira kunning]]):',
- 'captcha-sendemail' => 'Fyri at hjálpa okkum at sleppa undan sjálvvirkandi upprættan av brúkaranavni (spamm), so verður tú vinarliga biðin um at loysa tað einfalda roknistykki og skriva svarið í teigin ([[Special:Captcha/help|meira kunning]]):', # Fuzzy
+ 'captcha-sendemail' => 'Fyri at hjálpa okkum at sleppa undan sjálvvirkandi upprættan av brúkaranavni (spamm), so verður tú vinarliga biðin um at loysa tað einfalda roknistykki og skriva svarið í teigin ([[Special:Captcha/help|meira kunning]]):',
'captcha-sendemail-fail' => 'Skeiv ella manglandi váttanar loyniorð.',
'captcha-disabledinapi' => "Henda handling krevur ein captcha, so tað kann ikki verða framt við API'inum.",
'captchahelp-title' => 'Captcha hjálp',
@@ -1316,7 +1370,7 @@ Parfois, particulièrement lors de l’ajout de nouveaux liens externes dans une
Cette tâche étant difficile à accomplir de façon automatisée, cela permet à la plupart des humains de réaliser leurs contributions tout en stoppant la plupart des spammeurs et autres attaquants robotisés.
Malheureusement, cette solution peut gêner les utilisateurs malvoyants ou qui utilisent un navigateur en texte seul ou vocal. Nous ne disposons pas d’alternative audio pour l’instant.
-Veuillez contacter [[{{MediaWiki:Grouppage-sysop}}|les administrateurs du site]] si cela vous empêche de façon inattendue de faire des contributions légitimes.
+Veuillez contacter [[Special:ListAdmins|les administrateurs du site]] si cela vous empêche de façon inattendue de faire des contributions légitimes.
Cliquez sur le bouton « Précédent » de votre navigateur pour revenir à la page de modification.',
'captcha-addurl-whitelist' => ' #<!-- laissez cette ligne exactement telle quelle --><pre>
@@ -1353,7 +1407,7 @@ Mâlésiê a fâre de façon ôtomatisâ cél travâly, cen pèrmèt a la plepâ
Mâlherosament, ceta solucion pôt gênar los usanciérs mâl-veyents ou qu’utilisont un navigator en tèxto solèt ou ben vocal.
Por lo moment, nos avens gins d’altèrnativa ôdiô.
-Vos volyéd veriér vers los [[{{MediaWiki:Grouppage-sysop}}|administrators du seto]] se cen vos empache de façon emprèvua de fâre des contribucions lèg·itimes.
+Vos volyéd veriér vers los [[Special:ListAdmins|administrators du seto]] se cen vos empache de façon emprèvua de fâre des contribucions lèg·itimes.
Clicâd sur lo boton « Devant » de voutron navigator por tornar a la bouèta d’èdicion.',
'captcha-addurl-whitelist' => ' #<!-- lèssiéd ceta legne justo d’ense --> <pre>
@@ -1416,12 +1470,12 @@ $messages['gl'] = array(
'captcha-desc' => 'Proporciona CAPTCHA como protección fronte ao spam e ao descubrimento de contrasinais',
'captcha-label' => 'CAPTCHA',
'captcha-addurl' => 'A súa edición inclúe novas ligazóns externas.
-Para contribuír na protección contra as ferramentas de publicación automática de ligazóns publicitarias, resolva a suma que aparece a continuación e introduza a resposta na caixa ([[Special:Captcha/help|máis información]]):',
- 'captcha-badlogin' => 'Para contribuír a que non se descubran os contrasinais por medios automáticos, resolva a suma que aparece a continuación e introduza a resposta na caixa ([[Special:Captcha/help|máis información]]):',
- 'captcha-createaccount' => 'Para contribuír contra a creación automatizada de contas, resolva a suma que aparece a continuación e introduza a resposta na caixa ([[Special:Captcha/help|máis información]]):',
+Para protexer o wiki contra o spam automático, resolva a suma que aparece a continuación e introduza a resposta na caixa ([[Special:Captcha/help|máis información]]):',
+ 'captcha-badlogin' => 'Para protexer o wiki contra o roubo de contrasinais, resolva a suma que aparece a continuación e introduza a resposta na caixa ([[Special:Captcha/help|máis información]]):',
+ 'captcha-createaccount' => 'Para protexer o wiki contra a creación automática de contas, resolva a suma que aparece a continuación e introduza a resposta na caixa ([[Special:Captcha/help|máis información]]):',
'captcha-createaccount-fail' => 'Falta o código de confirmación ou é incorrecto.',
'captcha-create' => 'Para crear a páxina, resolva a suma que aparece a continuación e introduza a resposta na caixa ([[Special:Captcha/help|máis información]]):',
- 'captcha-sendemail' => 'Para contribuír na protección contra as ferramentas de publicación automática de ligazóns publicitarias, resolva a suma que aparece a continuación e introduza a resposta na caixa ([[Special:Captcha/help|máis información]]):',
+ 'captcha-sendemail' => 'Para protexer o wiki contra o spam automático, resolva a suma que aparece a continuación e introduza a resposta na caixa ([[Special:Captcha/help|máis información]]):',
'captcha-sendemail-fail' => 'Falta o código de confirmación ou é incorrecto.',
'captcha-disabledinapi' => 'Esta acción necesita o captcha, polo que non se pode realizar a través da API.',
'captchahelp-title' => 'Axuda acerca do CAPTCHA',
@@ -1434,14 +1488,14 @@ Como esta tarefa é difícil de automatizar, permite distinguir entre persoas e
Por desgraza, isto é un inconveniente para aqueles usuarios con dificultades de visión ou que utilicen navegadores de texto ou navegadores baseados en sistemas de voz.
Polo de agora non dispoñemos dunha alternativa de son.
-Por favor, póñase en contacto cun [[{{MediaWiki:Grouppage-sysop}}|administrador do sitio]] para solicitar axuda se o sistema lle impide rexistrarse para facer contribucións lexítimas.
+Por favor, póñase en contacto cun [[Special:ListAdmins|administrador do sitio]] para solicitar axuda se o sistema lle impide rexistrarse para facer contribucións lexítimas.
Prema no botón "Atrás" do seu navegador para volver á páxina de edición.',
'captcha-addurl-whitelist' => ' #<!-- Deixe esta liña tal e como está --> <pre>
# A sintaxe é a seguinte:
# * Todo o que vaia despois dun carácter "#" ata o final da liña é un comentario
# * Toda liña que non estea en branco é un fragmento de expresión regular que só coincide con dominios dentro de enderezos URL
- #</pre> <!-- Deixe esta liña tal e como está -->',
+ #</pre> <!-- Deixe esta liña tal e como está -->',
'right-skipcaptcha' => 'Levar a cabo as accións que requiren CAPTCHA sen ter que introducilo',
);
@@ -1478,7 +1532,7 @@ In e Teil Fäll, v. a. wänn neiji Link in e Syte dryygfiegt wäre, cha s syy, a
Leider cha des derzue fiere, ass Lyt Probläm iberchemme, wu ne yygschränkti Sähfähigkeit oder e Browser bruche, wu täxt- oder sprochbasiert isch.
Im Momänt hän mir kei Audioalternative z Verfiegig.
-Bitte nimm Kontakt uf zum [[{{MediaWiki:Grouppage-sysop}}|Syteadministrator]] fir Unterstitzig wänn des Di uuerwartet abhaltet vu berächtigte Byyträg.
+Bitte nimm Kontakt uf zum [[Special:ListAdmins|Syteadministrator]] fir Unterstitzig wänn des Di uuerwartet abhaltet vu berächtigte Byyträg.
Ins Bearbeitigsfänschter chunnt mer derno eifach wider mit em „Zruck“-Chnopf.',
'captcha-addurl-whitelist' => ' #<!-- Die Zyyle derf nit gänderet wäre! --> <pre>
@@ -1509,13 +1563,13 @@ $messages['gu'] = array(
'captcha-disabledinapi' => 'આ કà«àª°àª¿àª¯àª¾ માટે કેપà«àªšàª¾àª¨à«€ જરૂર છે, માટે તે API દà«àªµàª¾àª°àª¾ પાર પાડી શકાય તેમ નથી.',
'captchahelp-title' => 'કેપà«àªŸà«àªšàª¾/કેપà«àªšàª¾ (Captcha) મદદ',
'captchahelp-cookies-needed' => 'આ વà«àª¯àªµàª¸à«àª¥àª¿àª¤ રીતે જોઇ શકાય તે માટે તમારા બà«àª°àª¾àª‰àªàª°àª®àª¾àª‚ કà«àª•à«€àª àªàª¨à«‡àª¬àª² કરેલી હોવી જોઇશે.',
- 'captchahelp-text' => "આપણી વિકિ જેવી વૅબ સાઇટો કે જે લોકોને યોગદાન કરવાની પરવાનગી આપે છે, તેમનો સà«àªªàª¾àª®àª°à«‹ દà«àªµàª¾àª°àª¾ દà«àª°à«‚પયોગ થતો આવà«àª¯à«‹ છે. આવા સà«àªªàª¾àª®àª°à«‹ તેમની કડીઓ àªàª• સાથે અનેક વૅબ સાઇટો પર મà«àª•àªµàª¾ માટે સà«àªµàªšàª¾àª²àª¿àª¤ સાધનો વાપરે છે. આવી કડીઓ ખરેખર àªàª• દૂષણ છે અને તેને દૂર કરવાના ઉપાય કરવા જોઇàª.
+ 'captchahelp-text' => 'આપણી વિકિ જેવી વૅબ સાઇટો કે જે લોકોને યોગદાન કરવાની પરવાનગી આપે છે, તેમનો સà«àªªàª¾àª®àª°à«‹ દà«àªµàª¾àª°àª¾ દà«àª°à«‚પયોગ થતો આવà«àª¯à«‹ છે. આવા સà«àªªàª¾àª®àª°à«‹ તેમની કડીઓ àªàª• સાથે અનેક વૅબ સાઇટો પર મà«àª•àªµàª¾ માટે સà«àªµàªšàª¾àª²àª¿àª¤ સાધનો વાપરે છે. આવી કડીઓ ખરેખર àªàª• દૂષણ છે અને તેને દૂર કરવાના ઉપાય કરવા જોઇàª.
કà«àª¯àª¾àª°à«‡àª•, ખાસ કરીને જà«àª¯àª¾àª°à«‡ તમે તમારા લેખમાં બાહà«àª¯ કડી ઉમેરતા હોવ તà«àª¯àª¾àª°à«‡, વિકિ તમને àªàª• રંગીન કે તà«àªŸà«‡àª²àª¾-ફà«àªŸà«‡àª²àª¾ અકà«àª·àª°à«‹ કે શબà«àª¦à«‹àª¨à«àª‚ ચિતà«àª° બતાવે અને તેમા વંચાતા શબà«àª¦à«‹ બાજà«àª¨àª¾àª‚ ખાનામાં લખવા માટે પà«àª›à«‡ àªàªµà«àª‚ બને. આનà«àª‚ કારણ ઠછે કે આ àªàª• àªàªµà«€ પદà«àª§àª¤àª¿ છે જે સà«àªµàªšàª¾àª²àª¿àª¤ રીતે કરવી લગભગ અશકà«àª¯ છે, અને ફકà«àª¤ વà«àª¯àª•à«àª¤àª¿àª—ત રીતે જ થઇ શકે છે, જે સà«àªªàª¾àª®àª°à«‹ અને અનà«àª¯ ઘà«àª¸àª£àª–ોરો ના હà«àª®àª²àª¾àª¨à«‡ ખાળે છે.
-કમભાગà«àª¯à«‡ આ પદà«àª§àª¤àª¿, àªàªµàª¾ લોકોને તકલિફ આપે તેમ છે જેઓની દૃષà«àªŸàª¿ નબળી છે અથવાતો જેઓ વાચા આધારીત કે સાદા બà«àª°àª¾àª‰àªàª°àª¨à«‹ ઉપયોગ કરે છે. હાલમા અમારી પાસે આવા ચિતà«àª°à«‹àª¨à«€ વાચા આધારિત વà«àª¯àªµàª¸à«àª¥àª¾ નથી. જો આ કારણે આપ કોઇ લેખમાં પà«àª°àª¦àª¾àª¨ ન કરી શકતા હોવ તો વધૠસહાય માટે કૃપા કરી [[{{MediaWiki:Grouppage-sysop}}|site administrators]] નો સંપરà«àª• સાધો.
+કમભાગà«àª¯à«‡ આ પદà«àª§àª¤àª¿, àªàªµàª¾ લોકોને તકલીફ આપે તેમ છે જેઓની દà«àª°àª·à«àªŸàª¿ નબળી છે અથવા તો જેઓ વાચા આધારીત કે સાદા બà«àª°àª¾àª‰àªàª°àª¨à«‹ ઉપયોગ કરે છે. હાલમાં અમારી પાસે આવા ચિતà«àª°à«‹àª¨à«€ વાચા આધારિત વà«àª¯àªµàª¸à«àª¥àª¾ નથી. જો આ કારણે આપ કોઇ લેખમાં પà«àª°àª¦àª¾àª¨ ન કરી શકતા હોવ તો વધૠસહાય માટે કૃપા કરી [[Special:ListAdmins|site administrators]] નો સંપરà«àª• સાધો.
-લેખમા ફેરફાર કરવાના પાના ઉપર પાછા ફરવા માટે આપના બà«àª°àª¾àª‰àªàª°àª¨àª¾ 'બેક' બટન ઉપર કà«àª²àª¿àª• કરો.",
+લેખમા ફેરફાર કરવાના પાના ઉપર પાછા ફરવા માટે આપના બà«àª°àª¾àª‰àªàª°àª¨àª¾ "પાછા જાવ" બટન ઉપર કà«àª²àª¿àª• કરો.',
'captcha-addurl-whitelist' => ' #<!-- આ લીટીને જેમ છે તેમ જ રહેવા દો --> <pre>
# સીનà«àªŸà«‡àª•à«àª¸ (Syntax) આ પà«àª°àª®àª¾àª£à«‡ છે :
# * "#" સંજà«àªžàª¾àª¥à«€ શરૂ કરીને લીટીના અંત સà«àª§à«€àª¨à«àª‚ વરà«àª£àª¨ àªàª• ટીપà«àªªàª£à«€ છે
@@ -1526,13 +1580,14 @@ $messages['gu'] = array(
/** Hebrew (עברית)
* @author Amire80
+ * @author Guycn2
* @author Rotem Liss
* @author Rotemliss
* @author YaronSh
*/
$messages['he'] = array(
'captcha-edit' => 'כדי לערוך ×ת הדף, ×× × ×¤×ª×¨×• ×ת תרגיל החיבור הפשוט שלהלן והקלידו ×ת התשובה בתיבה ([[Special:Captcha/help|מידע נוסף]]):',
- 'captcha-desc' => 'מתן טכניקות CAPTCHA להגנה נגד זיבול וניחוש ססמ×ות',
+ 'captcha-desc' => 'מתן טכניקות CAPTCHA להגנה נגד ספ×× ×•× ×™×—×•×© סיסמ×ות',
'captcha-label' => 'CAPTCHA',
'captcha-addurl' => '×¢×¨×™×›×ª×›× ×›×•×œ×œ×ª ×§×™×©×•×¨×™× ×—×™×¦×•× ×™×™× ×—×“×©×™×.
×œ×©× ×”×’× ×” מפני ספ×× ×וטומטי, ×× × ×¤×ª×¨×• ×ת תרגיל החיבור הפשוט שלהלן והקלידו ×ת התשובה בתיבה כדי לשמור ×ת ×¢×¨×™×›×ª×›× ([[Special:Captcha/help|מידע נוסף]]):',
@@ -1553,7 +1608,7 @@ $messages['he'] = array(
לרוע המזל, הדבר עשוי ×œ×’×¨×•× ×œ××™ נוחות ×œ×ž×©×ª×ž×©×™× ×¢× ×“×¤×“×¤×Ÿ בגרסה מוגבלת, ×ו ×©×ž×©×ª×ž×©×™× ×‘×“×¤×“×¤× ×™× ×ž×‘×•×¡×¡×™ טקסט ×ו דיבור.
כרגע, ×ין לנו חלופה קולית זמינה.
-×× × ×¦×¨×• קשר ×¢× [[{{MediaWiki:Grouppage-sysop}}|מפעילי המערכת]] כדי לקבל עזרה ×× ×”×ž×¢×¨×›×ª מונעת ×ž×›× ×‘×ופן בלתי צפוי לבצע עריכות לגיטימיות.
+×× × ×¦×¨×• קשר ×¢× [[Special:ListAdmins|מפעילי המערכת]] כדי לקבל עזרה ×× ×”×ž×¢×¨×›×ª מונעת ×ž×›× ×‘×ופן בלתי צפוי לבצע עריכות לגיטימיות.
לחצו על הכפתור \'חזור\' בדפדפן ×©×œ×›× ×›×“×™ לחזור לדף העריכה.',
'captcha-addurl-whitelist' => ' #<!-- יש להש×יר שורה זו בדיוק כפי ×©×”×™× ×›×ª×•×‘×” --> <pre>
@@ -1593,7 +1648,7 @@ $messages['hi'] = array(
दà¥à¤°à¥à¤­à¤¾à¤—à¥à¤¯à¤µà¤¶ इससे सीमित चकà¥à¤·à¥-दृषà¥à¤Ÿà¤¿ वाले सदसà¥à¤¯à¥‹à¤‚ या पाठ-आधारित या वाचन-आधारित विचरकों का पà¥à¤°à¤¯à¥‹à¤— करने वाले सदसà¥à¤¯à¥‹à¤‚ को समसà¥à¤¯à¤¾ आती है।
इस समय हमारे पास इसका शà¥à¤°à¤µà¥à¤¯ विकलà¥à¤ª उपलबà¥à¤§ नहीं है।
-यदि इसकी वजह से आपको वैध लेख लिखने में अवरोध आ रहा हो तो कृपया सहायता के लिठ[[{{MediaWiki:Grouppage-sysop}}|सà¥à¤¥à¤² पà¥à¤°à¤¬à¤‚धकों]] से संपरà¥à¤• करें।
+यदि इसकी वजह से आपको वैध लेख लिखने में अवरोध आ रहा हो तो कृपया सहायता के लिठ[[Special:ListAdmins|सà¥à¤¥à¤² पà¥à¤°à¤¬à¤‚धकों]] से संपरà¥à¤• करें।
पनà¥à¤¨à¤¾ संपादन पर वापस जाने के लिठअपने विचरक पर 'à¤à¤• पृषà¥à¤  पीछे जाà¤à¤' वाली कà¥à¤‚जी का पà¥à¤°à¤¯à¥‹à¤— करें।",
'captcha-addurl-whitelist' => ' #<!-- leave this line exactly as it is --> <pre>
@@ -1633,7 +1688,7 @@ Ponekad, a naroÄito kad se dodaje web poveznica na stranicu, wiki može prikaza
Budući da je takvu radnju teÅ¡ko automatizirati, to će omogućiti pravim suradnicima njihov nastavak u pridonoÅ¡enju, dok će zaustaviti većinu spamera i robotskih napadaÄa.
Na žalost, ovo može biti nepristupaÄno za suradnike koji koriste tekstualne klijene ili one glasovno bazirane. TrenutaÄno nemamo glasovnu podrÅ¡ku za ovo.
-Molimo obratite se [[{{MediaWiki:Grouppage-sysop}}|administratorima]] za pomoć, ukoliko Vas ovo ometa pri dodavanju važećih sadržaja.
+Molimo obratite se [[Special:ListAdmins|administratorima]] za pomoć, ukoliko Vas ovo ometa pri dodavanju važećih sadržaja.
Pritisnite u svom pregledniku 'nazad' kako bi se vratili na ureÄ‘ivaÄ stranice.",
'captcha-addurl-whitelist' => ' #<!-- leave this line exactly as it is --> <pre>
@@ -1668,7 +1723,7 @@ Dokelž to je nadawk, kotryž hodźi so jenož ćežko awtomatizować, dowoluje
Bohužel móže to k wobćežnosćam za tutych wužiwarjow wjesć, kotrychž kmanosć widźenja je wobmjezowana abo kotÅ™iž wobhladowaki wužiwaja, kotrež na tekst abo rÄ›Äne wudawanje bazÄ›ruja.
Tuchwilu njedisponujemy wo awdioalternatiwje.
-Prošu staj so z [[{{MediaWiki:Grouppage-sysop}}|administratorami sydła]] z prostwu wo pomoc do zwiska, jeli to će haći legitimne powěsće pósłać.
+Prošu staj so z [[Special:ListAdmins|administratorami sydła]] z prostwu wo pomoc do zwiska, jeli to će haći legitimne powěsće pósłać.
Klikń na tłócatko "Wróćo" w swojim wobhladowaku, zo by so k editorej wróćił.',
'captcha-addurl-whitelist' => ' #<!-- leave this line exactly as it is --> <pre>
@@ -1715,7 +1770,7 @@ $messages['hu'] = array(
Az ilyen linkek kézi eltávolítása rengeteg energiát emésztene fel, ezért néha, különösen ha egy külső linket teszel egy cikkbe, a wiki egy valamilyen módon eltorzított szöveget (captcha-t) jelenít meg, és arra kér, hogy gépeld be azt. Mivel ezt automatikusan nagyon nehéz megtenni, a valódi szerkesztők így könnyen megkülönböztethetőek a spammerek robotjaitól.
-Sajnos ez komoly kényelmetlenséget jelenthet azoknak a felhasználóknak, akik gyengén látnak, vagy szöveges/hang-alapú böngészőt használnak. Jelenleg nem tudunk hang-alapú alternatívával szolgálni; ha a captcha megakadályoz abban, hogy szerkeszd a wikit, vedd fel a kapcsolatot az [[{{MediaWiki:Grouppage-sysop}}|adminisztrátorokkal]].
+Sajnos ez komoly kényelmetlenséget jelenthet azoknak a felhasználóknak, akik gyengén látnak, vagy szöveges/hang-alapú böngészőt használnak. Jelenleg nem tudunk hang-alapú alternatívával szolgálni; ha a captcha megakadályoz abban, hogy szerkeszd a wikit, vedd fel a kapcsolatot az [[Special:ListAdmins|adminisztrátorokkal]].
Ha a captcha megoldása helyett inkább visszatérnél a szöveg szerkesztéséhez, használd a böngésződ „vissza†gombját.',
'captcha-addurl-whitelist' => ' #<!-- ezt a sort hagyd pontosan így --> <pre>
@@ -1742,12 +1797,12 @@ $messages['ia'] = array(
'captcha-desc' => 'Forni technicas CAPTCHA de protection contra spam e discoperta de contrasignos',
'captcha-label' => 'CAPTCHA',
'captcha-addurl' => 'Tu modification include nove ligamines externe.
-Como protection contra le spam automatic, per favor resolve le simple summa hic infra e entra le resultato in le quadro ([[Special:Captcha/help|plus info]]):', # Fuzzy
- 'captcha-badlogin' => 'Como protection contra le piratage automatic de contrasignos, per favor resolve le simple summa hic infra e entra le resultato in le quadro ([[Special:Captcha/help|plus info]]):', # Fuzzy
- 'captcha-createaccount' => 'Como protection contra le creation automatic de contos, per favor resolve le simple summa hic infra e entra le resultato in le quadro ([[Special:Captcha/help|plus info]]):', # Fuzzy
+Pro proteger le wiki contra le spam automatisate, per favor resolve le simple summa hic infra e entra le resultato in le quadro a fin de salveguardar tu modification ([[Special:Captcha/help|plus info]]):',
+ 'captcha-badlogin' => 'Pro proteger le wiki contra le furto automatisate de contrasignos, per favor resolve le simple summa hic infra e entra le resultato in le quadro ([[Special:Captcha/help|plus info]]):',
+ 'captcha-createaccount' => 'Pro proteger le wiki contra le creation automatisate de contos, per favor resolve le simple summa hic infra e entra le resultato in le quadro ([[Special:Captcha/help|plus info]]):',
'captcha-createaccount-fail' => 'Codice de confirmation incorrecte o mancante.',
'captcha-create' => 'Pro crear le pagina, per favor resolve le simple summa hic infra e entra le resultato in le quadro ([[Special:Captcha/help|plus info]]):',
- 'captcha-sendemail' => 'Como protection contra le spam automatic, per favor resolve le simple summa hic infra e entra le resultato in le quadro ([[Special:Captcha/help|plus info]]):', # Fuzzy
+ 'captcha-sendemail' => 'Pro proteger le wiki contra le spam automatisate, per favor resolve le simple summa hic infra e entra le resultato in le quadro ([[Special:Captcha/help|plus info]]):',
'captcha-sendemail-fail' => 'Codice de confirmation incorrecte o mancante.',
'captcha-disabledinapi' => 'Iste action require un captcha, dunque illo non pote esser exequite per medio del API.',
'captchahelp-title' => 'Adjuta super le captcha',
@@ -1760,7 +1815,7 @@ Post que isto es un carga difficile de automatisar, isto permittera al major par
Infelicemente isto pote incommodar le usatores con vision limitate o usante navigatores a base de texto o synthese vocal.
Al momento nos non dispone de un alternativa audio.
-Per favor contacta le [[{{MediaWiki:Grouppage-sysop}}|administratores del sito]] pro assistentia si isto insperatemente te impedi de facer contributiones legitime.
+Per favor contacta le [[Special:ListAdmins|administratores del sito]] pro assistentia si isto insperatemente te impedi de facer contributiones legitime.
Clicca le button 'retro' in tu navigator pro retornar al pagina de modification.",
'captcha-addurl-whitelist' => ' #<!-- non modificar in alcun modo iste linea --> <pre>
@@ -1774,26 +1829,29 @@ Clicca le button 'retro' in tu navigator pro retornar al pagina de modification.
/** Indonesian (Bahasa Indonesia)
* @author Borgx
* @author Farras
+ * @author Ilham151096
* @author IvanLanin
* @author Iwan Novirion
+ * @author Kenrick95
* @author Rex
*/
$messages['id'] = array(
'captcha-edit' => 'Untuk menyunting halaman ini, harap pecahkan penjumlahan sederhana di bawah ini dan masukkan jawaban di kotak yang tersedia ([[Special:Captcha/help|info lengkap]]):',
'captcha-desc' => 'Menyediakan teknik captcha untuk melindungi terhadap spam dan penebakan sandi',
'captcha-label' => 'CAPTCHA',
- 'captcha-addurl' => "Suntingan Anda menyertakan pranala luar baru. Sebagai pelindungan terhadap ''spam'' otomatis, Anda harus mengetikkan kata atau hasil perhitungan yang tertera berikut ini:<br />
-([[Special:Captcha/help|info lengkap]])", # Fuzzy
- 'captcha-badlogin' => 'Untuk membantu pelindungan terhadap perengkahan kunci sandi otomatis, tolong masukkan kata atau hasil perhitungan sederhana berikut dalam kotak yang tersedia ([[Special:Captcha/help|info lengkap]]):', # Fuzzy
- 'captcha-createaccount' => 'Sebagai pelindungan terhadap spam, Anda diharuskan untuk mengetikkan kata atau hasil perhitungan di bawah ini di kotak yang tersedia untuk dapat mendaftarkan pengguna baru:<br />
-([[Special:Captcha/help|info lengkap]])', # Fuzzy
+ 'captcha-addurl' => "Suntingan Anda menyertakan pranala luar baru.
+Sebagai pelindungan terhadap ''spam'' otomatis, Anda harus mengetikkan hasil perhitungan sederhana berikut ini
+([[Special:Captcha/help|info lengkap]]):",
+ 'captcha-badlogin' => 'Untuk melindungi wiki ini dari perengkahan kunci sandi otomatis, harap masukkan hasil perhitungan sederhana berikut dalam kotak yang tersedia ([[Special:Captcha/help|info lengkap]]):',
+ 'captcha-createaccount' => 'Untuk melindungi wiki ini dari pembuatan akun otomatis, kami meminta Anda untuk mengetikkan hasil perhitungan sederhana di bawah ini dalam kotak yang tersedia
+([[Special:Captcha/help|info lengkap]]):',
'captcha-createaccount-fail' => 'Kode konfirmasi salah atau belum diisi.',
'captcha-create' => 'Untuk menyunting halaman ini, silakan pecahkan penjumlahan sederhana di bawah ini dan masukkan jawaban di kotak yang tersedia ([[Special:Captcha/help|info lengkap]]):',
- 'captcha-sendemail' => 'Sebagai pelindungan terhadap spam, silakan pecahkan penjumlahan sederhana di bawah ini dan masukkan jawaban di kotak yang tersedia ([[Special:Captcha/help|more info]]):', # Fuzzy
+ 'captcha-sendemail' => 'Untuk melindungi wiki ini dari spam otomatis, kami meminta Anda untuk memecahkan penjumlahan sederhana di bawah ini dan masukkan jawaban di kotak yang tersedia ([[Special:Captcha/help|more info]]):',
'captcha-sendemail-fail' => 'Kode konfirmasi salah atau belum diisi.',
'captcha-disabledinapi' => 'Tindakan ini membutuhkan captcha, sehingga tidak dapat dilakukan melalui API.',
'captchahelp-title' => 'Mengenai Captcha',
- 'captchahelp-cookies-needed' => 'Anda perlu mengaktifkan cookie pada penjelajah web Anda untuk menggunakan fitur ini.',
+ 'captchahelp-cookies-needed' => 'Anda perlu mengaktifkan kuki pada peramban web Anda untuk menggunakan fitur ini.',
'captchahelp-text' => "Situs-situs web yang menerima tulisan dari publik, seperti wiki ini, kerapkali disalahgunakan oleh pengguna-pengguna yang tidak bertanggungjawab untuk mengirimkan spam dengan menggunakan program-program otomatis.
Walaupun pranala-pranala spam tersebut dapat dibuang, tetapi tetap saja menimbulkan gangguan berarti.
@@ -1802,7 +1860,7 @@ Karena ini merupakan suatu pekerjaan yang sulit diotomatisasi, pembatasan ini ak
Sayangnya, hal ini dapat menimbulkan kesulitan bagi pengguna dengan keterbatasan penglihatan atau pengguna yang menggunakan penjelajah web berbasis-teks atau berbasis-suara.
Saat ini, kami belum memiliki suatu alternatif suara untuk hal ini.
-Silakan hubungi [[{{MediaWiki:Grouppage-sysop}}|pengurus]] untuk meminta bantuan jika hal ini menghambat Anda untuk mengirimkan suntingan yang layak.
+Silakan hubungi [[Special:ListAdmins|pengurus]] untuk meminta bantuan jika hal ini menghambat Anda untuk mengirimkan suntingan yang layak.
Tekan tombol 'back' di penjelajah web Anda untuk kembali ke halaman penyuntingan.",
'captcha-addurl-whitelist' => ' #<!-- biarkan baris ini sebagaimana adanya --> <pre>
@@ -1839,7 +1897,7 @@ Yantangay daytoy ket obra a narigat a ma-automatiko, agpalubos kadagiti agpayso
Daksangasat a padaksan na dagiti agar-aramat a marigatan nga agkita wenno agus-usar ti naibasta ti teksto wenno naibasta ti bitla a pagbasabasa.
Awan pay tatta ti mangeg a pagpilian a mabalin a gun-oden.
-Pangngaasi a kontaken ti [[{{MediaWiki:Grouppage-sysop}}|administrador ti pagsaadan]] para iti tulong no daytoy ket saan a napadpadaanan a mangpawil ti lehitimado a panagtiynaymo.
+Pangngaasi a kontaken ti [[Special:ListAdmins|administrador ti pagsaadan]] para iti tulong no daytoy ket saan a napadpadaanan a mangpawil ti lehitimado a panagtiynaymo.
Peslen ti 'agsubli' a buton dita pagbasabasam (browser) ti agsubli idiay panid ti panag-urnos.",
'captcha-addurl-whitelist' => ' #<!-- baybayam nga kasta daytoy nga linia --> <pre>
@@ -1873,7 +1931,7 @@ auglýsingarusli, vinsamlegast finndu summuna að neðan og skrifaðu svarið í
Stundum þegar þú breytir síðum, sérstaklega ef breytingin felur í sér nýja tengla á aðra vefi, getur gerst að þú sért beðin(n) um að skrifa inn orð sem birtast á lituðum eða óskýrum myndum. Fyrir flesta mannlega notendur er þetta lítið mál en sjálfvirk tól ráða ekki við þetta.
Því miður kann þetta að valda notendum óþægindum sem hafa skerta sjón eða notast við talmálsvafra. Enn sem komið er eru ekki til aðrir valkostir fyrir þau tilvik.
-Vinsamlegast hafðu samband við [[{{MediaWiki:Grouppage-sysop}}|stjórnanda síðunnar]] til að fá aðstoð ef þetta kemur í veg fyrir lögmætar breytingar af þinni hálfu.
+Vinsamlegast hafðu samband við [[Special:ListAdmins|stjórnanda síðunnar]] til að fá aðstoð ef þetta kemur í veg fyrir lögmætar breytingar af þinni hálfu.
Notaðu „til-baka“-hnapp vafrans til að breyta síðunni.',
'right-skipcaptcha' => 'Geta gert aðgerðir án þess að nota kæfuvörn',
@@ -1892,7 +1950,7 @@ $messages['it'] = array(
'captcha-label' => 'CAPTCHA',
'captcha-addurl' => "La modifica richiesta aggiunge dei nuovi collegamenti esterni alla pagina; come misura precauzionale contro l'inserimento automatico di spam, si prega di risolvere il semplice calcolo presentato di seguito e inserire il risultato nella casella ([[Special:Captcha/help|come funziona?]]):",
'captcha-badlogin' => 'Come misura precauzionale contro i tentativi di forzatura automatica della password, si prega di risolvere il semplice calcolo presentato di seguito e inserire il risultato nella casella ([[Special:Captcha/help|come funziona?]]):',
- 'captcha-createaccount' => 'Come misura precauzionale contro i tentativi di creazione automatica degli account, si prega di risolvere il semplice calcolo presentato di seguito e inserire il risultato nella casella ([[Special:Captcha/help|come funziona?]]):',
+ 'captcha-createaccount' => 'Come misura precauzionale contro i tentativi di registrazione automatica, si prega di risolvere il semplice calcolo presentato di seguito e inserire il risultato nella casella ([[Special:Captcha/help|come funziona?]]):',
'captcha-createaccount-fail' => 'Codice di verifica errato o mancante.',
'captcha-create' => 'Per creare la pagina è necessario risolvere il semplice calcolo presentato di seguito e inserire il risultato nella casella:<br />
([[Special:Captcha/help|maggiori informazioni]]):',
@@ -1905,7 +1963,7 @@ $messages['it'] = array(
In alcuni casi, ad esempio quando si tenta di aggiungere nuovi collegamenti web in una pagina, il software wiki può mostrare una immagine con un breve testo colorato e/o distorto chiedendo di riscriverlo in un'apposita finestrella. Poiché si tratta di un'azione difficile da replicare da parte di un computer, questo meccanismo consente a (quasi tutti) gli utenti reali di completare l'inserimento desiderato, impedendo l'accesso alla maggior parte degli spammer e degli altri attacchi automatizzati.
-Sfortunatamente, queste misure di sicurezza possono mettere in difficoltà gli utenti con problemi visivi o coloro che utilizzano browser testuali o basati sulla sintesi vocale. Purtroppo al momento non è disponibile un meccanismo alternativo basato su messaggi audio; se queste procedure impediscono l'inserimento informazioni che si ritengono legittime, si prega di contattare gli [[{{MediaWiki:Grouppage-sysop}}|amministratori del sito]] e chiedere loro assistenza.
+Sfortunatamente, queste misure di sicurezza possono mettere in difficoltà gli utenti con problemi visivi o coloro che utilizzano browser testuali o basati sulla sintesi vocale. Purtroppo al momento non è disponibile un meccanismo alternativo basato su messaggi audio; se queste procedure impediscono l'inserimento informazioni che si ritengono legittime, si prega di contattare gli [[Special:ListAdmins|amministratori del sito]] e chiedere loro assistenza.
Fare clic sul pulsante \"indietro\" del browser per tornare alla pagina di modifica.",
'captcha-addurl-whitelist' => ' #<!-- non modificare in alcun modo questa riga --> <pre>
@@ -1947,7 +2005,7 @@ $messages['ja'] = array(
ã—ã‹ã—ã€æ®‹å¿µãªã“ã¨ã«ã€ã“ã®æ–¹æ³•ã«ã‚ˆã‚Šã€è¦–力ãŒä½Žã„利用者やã€ãƒ†ã‚­ã‚¹ãƒˆãƒ™ãƒ¼ã‚¹ã‚ã‚‹ã„ã¯éŸ³å£°ãƒ™ãƒ¼ã‚¹ã®ãƒ–ラウザーを使用ã—ã¦ã„る利用者ã«ã”ä¸ä¾¿ã‚’ãŠã‹ã‘ã™ã‚‹å ´åˆãŒã‚ã‚Šã¾ã™ã€‚
ç¾æ™‚点ã§ã¯ã€éŸ³å£°ã«ã‚ˆã‚‹ä»£æ›¿æ–¹æ³•ã¯ã‚ã‚Šã¾ã›ã‚“。
-正当ãªæ“作をã™ã‚‹ã«ã‚ãŸã£ã¦æœ¬æ©Ÿèƒ½ãŒéšœå®³ã¨ãªã£ã¦ã„ã‚‹å ´åˆã€[[{{MediaWiki:Grouppage-sysop}}|サイト管ç†è€…]]ã«é€£çµ¡ã—ã¦å”力を求ã‚ã¦ãã ã•ã„。
+正当ãªæ“作をã™ã‚‹ã«ã‚ãŸã£ã¦æœ¬æ©Ÿèƒ½ãŒéšœå®³ã¨ãªã£ã¦ã„ã‚‹å ´åˆã€[[Special:ListAdmins|サイト管ç†è€…]]ã«é€£çµ¡ã—ã¦å”力を求ã‚ã¦ãã ã•ã„。
ページã®ç·¨é›†ã«æˆ»ã‚‹ã«ã¯ã€ãƒ–ラウザーã®ã€Œæˆ»ã‚‹ã€ãƒœã‚¿ãƒ³ã‚’押ã—ã¦ãã ã•ã„。',
'captcha-addurl-whitelist' => ' #<!-- ã“ã®è¡Œã¯å¤‰æ›´ã—ãªã„ã§ãã ã•ã„ --> <pre>
@@ -1959,6 +2017,7 @@ $messages['ja'] = array(
);
/** Jutish (jysk)
+ * @author Christian List
* @author Huslåke
* @author Ælsån
*/
@@ -1966,9 +2025,9 @@ $messages['jut'] = array(
'captcha-edit' => 'For at redigere denne side, skal du give svaret på regnestyket nedenfor, og angive resultatet i feltet under det. ([[Special:Captcha/help|mere information]]):',
'captcha-desc' => 'Semple captcha implementåsje', # Fuzzy
'captcha-addurl' => 'Din redigering tilføjer nye eksterne henvisninger til artiklen. Som beskyttelse mod automatiseret spam, skal du give svaret på regnestyket nedenfor, og angive resultatet i feltet under det. ([[Special:Captcha/help|mere information]]):', # Fuzzy
- 'captcha-badlogin' => 'For at beskytte mod automatiserede gæt på kodeord, skal du give svaret på regnestyket nedenfor, og angive resultatet i feltet under det. ([[Special:Captcha/help|mere information]]):', # Fuzzy
+ 'captcha-badlogin' => 'For at beskytte mod automatiske forsøg på at gætte adgangskoden, skal du give svaret på regnestykket nedenfor, og angive resultatet i feltet under det. ([[Special:Captcha/help|mere information]]):',
'captcha-createaccount' => 'For at beskytte mod automatisk oprettelse af brugernavne, skal du give svaret på regnestyket nedenfor, og angive resultatet i feltet under det. ([[Special:Captcha/help|mere information]]):', # Fuzzy
- 'captcha-createaccount-fail' => 'Forkert eller manglende kodeord.',
+ 'captcha-createaccount-fail' => 'Forkert eller manglende bekræftelseskode.',
'captcha-create' => 'For at oprette en ny side, skal du give svaret på regnestyket nedenfor, og angive resultatet i feltet under det. ([[Special:Captcha/help|mere information]]):',
'captchahelp-title' => 'Captcha-hjælp',
'captchahelp-cookies-needed' => 'Din browser skal understøtte cookies, før dette kan gennemføres.',
@@ -2009,7 +2068,7 @@ Kanggo ngéwangi ngreksa lawan ''spam'' otomatis, tulung pecahna itung-itungan i
Kadhangkala, utamané yèn mènèhi pranala wèb anyar ing sawijinig kaca, wiki iki bisa nuduhaké gambar sawijining gambar tulisan sing ana wernané utawa sing rusak lan njaluk panjenengan ngetik ulang tembung sing ana gambar iki.
Amerga pagawéyan iki angèl diotomatisasi, pawatesan iki bisa ngidinaké mèh kabèh wong asli mbanjuraké sumbangsihé ngirim suntingan nanging menggak para pangirim spam lan robot otomatis.
-Émané, perkara iki bisa nggawé sawetara panganggo kangélan nyunting kaca iki, utamané sing daya pandelengané kurang utawa para panganggo sing nganggo panjlajah tèks adhedhasar tèks utawa swara. Saiki iki awaké dhéwé ora duwé alternatif audio kanggo iki. Mangga nyuwun pitulung karo [[{{MediaWiki:Grouppage-sysop}}|para pangurus]] yèn perkara iki menggak panjenengan ngirimaké suntingan sing layak.
+Émané, perkara iki bisa nggawé sawetara panganggo kangélan nyunting kaca iki, utamané sing daya pandelengané kurang utawa para panganggo sing nganggo panjlajah tèks adhedhasar tèks utawa swara. Saiki iki awaké dhéwé ora duwé alternatif audio kanggo iki. Mangga nyuwun pitulung karo [[Special:ListAdmins|para pangurus]] yèn perkara iki menggak panjenengan ngirimaké suntingan sing layak.
Pencèten tombol 'back' ing panjlajah wèb panjenengan kanggo bali menyang kaca panyuntingan.",
'captcha-addurl-whitelist' => ' #<!-- leave this line exactly as it is --> <pre>
@@ -2047,7 +2106,7 @@ $messages['ka'] = array(
სáƒáƒ›áƒ¬áƒ£áƒ®áƒáƒ áƒáƒ“, მსგáƒáƒ•áƒ¡áƒ›áƒ დáƒáƒªáƒ•áƒáƒ› შეიძლებრდისკáƒáƒ›áƒ¤áƒáƒ áƒ¢áƒ˜ შეუქმნáƒáƒ¡ სუსტი მხედველáƒáƒ‘ის მქáƒáƒœáƒ” áƒáƒ“áƒáƒ›áƒ˜áƒáƒœáƒ”ბს, áƒáƒœ მáƒáƒ— ვინც იყენებს ტექსტურ áƒáƒœ კითხვáƒáƒ“ ბრáƒáƒ£áƒ–ერებს.
áƒáƒ›áƒŸáƒáƒ›áƒáƒ“ ჩვენ áƒáƒ  გვáƒáƒ¥áƒ•áƒ¡ áƒáƒ› შემáƒáƒ¬áƒ›áƒ”ბის ხმáƒáƒ•áƒáƒœáƒ˜ áƒáƒšáƒ¢áƒ”რნáƒáƒ¢áƒ˜áƒ•áƒ.
-გთხáƒáƒ•áƒ—, თუ მსგáƒáƒ•áƒ¡áƒ˜ შემáƒáƒ¬áƒ›áƒ”ბრხელს გიშლით სáƒáƒ˜áƒ¢áƒ–ე კეთილსინდისიერ მუშáƒáƒáƒ‘áƒáƒ¨áƒ˜, დáƒáƒ®áƒ›áƒáƒ áƒ”ბისáƒáƒ—ვის მიმáƒáƒ áƒ—ეთ [[{{MediaWiki:Grouppage-sysop}}|áƒáƒ“მინისტრáƒáƒ¢áƒáƒ áƒ”ბს]].
+გთხáƒáƒ•áƒ—, თუ მსგáƒáƒ•áƒ¡áƒ˜ შემáƒáƒ¬áƒ›áƒ”ბრხელს გიშლით სáƒáƒ˜áƒ¢áƒ–ე კეთილსინდისიერ მუშáƒáƒáƒ‘áƒáƒ¨áƒ˜, დáƒáƒ®áƒ›áƒáƒ áƒ”ბისáƒáƒ—ვის მიმáƒáƒ áƒ—ეთ [[Special:ListAdmins|áƒáƒ“მინისტრáƒáƒ¢áƒáƒ áƒ”ბს]].
თქვენ ბრáƒáƒ£áƒ–ერში დáƒáƒáƒ­áƒ˜áƒ áƒ”თ ღილáƒáƒ™áƒ¡ „უკáƒáƒœâ€œ, რáƒáƒ—რდáƒáƒ£áƒ‘რუნდეთ რედáƒáƒ¥áƒ¢áƒ˜áƒ áƒ”ბáƒáƒ¡.',
'captcha-addurl-whitelist' => ' #<!-- leave this line exactly as it is --> <pre>
@@ -2154,9 +2213,9 @@ Bet öñdewine qaýtw barw üşin «Artqa» degen tüýmesin basıñız.', # Fuz
$messages['km'] = array(
'captcha-edit' => 'ដើម្បីកែប្រែ​ទំពáŸážšáž“áŸáŸ‡ សូមដោះស្រាយ​ប្រមាណវិធីបូក​ážáž¶áž„ក្រោម​នáŸáŸ‡ážšáž½áž…​បញ្ជូលចម្លើយ​ទៅក្នុង​ប្រអប់សិន([[Special:Captcha/help|áž–áŸážáŸŒáž˜áž¶áž“​បន្ážáŸ‚ម]])៖',
'captcha-desc' => 'ផ្ដល់បច្ចáŸáž€áž‘áŸážŸ CAPTCHA ដើម្បីការពារពីស្ប៉ាមនិងការការទាយពាក្យសំងាážáŸ‹',
- 'captcha-addurl' => 'កំណែ​របស់អ្នក​មាន​ážáŸ†ážŽáž—្ជាប់ក្រៅ​ážáŸ’មី។ ដើម្បី​ជួយបង្ការ​ស្ប៉ាម​ស្វáŸáž™áž”្រវážáŸ’ážáž· សូមដោះស្រាយ​ប្រមាណវិធីបូក​ážáž¶áž„ក្រោម​នáŸáŸ‡ážšáž½áž…​បញ្ជូលចម្លើយ​ទៅក្នុង​ប្រអប់សិន([[Special:Captcha/help|áž–áŸážáŸŒáž˜áž¶áž“​បន្ážáŸ‚ម]])៖', # Fuzzy
- 'captcha-badlogin' => 'ដើម្បីការពារការបំបែកពាក្យសំងាážáŸ‹ážŠáŸ„យស្វáŸáž™áž”្រវážáŸ’ážáž· សូមដោះស្រាយផលបូកážáž¶áž„ក្រោមរួចបញ្ជូលចម្លើយទៅក្នុងប្រអប់ ([[Special:Captcha/help|áž–áŸážáŸŒáž˜áž¶áž“បន្ážáŸ‚ម]])៖', # Fuzzy
- 'captcha-createaccount' => 'ដើម្បី​បង្ការការបង្កើážâ€‹áž‚ណនី​ស្វáŸáž™áž”្រវážáŸ’ážáž· សូមដោះស្រាយ​ប្រមាណវិធីបូក​ážáž¶áž„ក្រោម​នáŸáŸ‡ážšáž½áž…​បញ្ជូលចម្លើយ​ទៅក្នុង​ប្រអប់សិន([[Special:Captcha/help|áž–áŸážáŸŒáž˜áž¶áž“​បន្ážáŸ‚ម]])៖', # Fuzzy
+ 'captcha-addurl' => 'កំណែ​របស់អ្នក​មាន​ážáŸ†ážŽáž—្ជាប់ក្រៅ​ážáŸ’មី។ ដើម្បី​ជួយបង្ការ​ស្ប៉ាម​ស្វáŸáž™áž”្រវážáŸ’ážáž· សូមដោះស្រាយ​ប្រមាណវិធីបូក​ážáž¶áž„ក្រោម​នáŸáŸ‡ážšáž½áž…​បញ្ជូលចម្លើយ​ទៅក្នុង​ប្រអប់សិនមុនពáŸáž›ážšáž€áŸ’សាទុកកំណែរបស់អ្នក([[Special:Captcha/help|áž–áŸážáŸŒáž˜áž¶áž“​បន្ážáŸ‚ម]])៖',
+ 'captcha-badlogin' => 'ដើម្បីការពារការបំបែកពាក្យសម្ងាážáŸ‹ážŠáŸ„យស្វáŸáž™áž”្រវážáŸ’ážáž· សូមដោះស្រាយផលបូកážáž¶áž„ក្រោមរួចបញ្ជូលចម្លើយទៅក្នុងប្រអប់ ([[Special:Captcha/help|áž–áŸážáŸŒáž˜áž¶áž“បន្ážáŸ‚ម]])៖',
+ 'captcha-createaccount' => 'ដើម្បី​បង្ការការបង្កើážâ€‹áž‚ណនី​ស្វáŸáž™áž”្រវážáŸ’ážáž· សូមដោះស្រាយ​ប្រមាណវិធីបូក​ážáž¶áž„ក្រោម​នáŸáŸ‡ážšáž½áž…​បញ្ជូលចម្លើយ​ទៅក្នុង​ប្រអប់សិន([[Special:Captcha/help|áž–áŸážáŸŒáž˜áž¶áž“​បន្ážáŸ‚ម]])៖',
'captcha-createaccount-fail' => 'កូដផ្ទៀងផ្ទាážáŸ‹áž”ាážáŸ‹áž”ង់ឬមិនážáŸ’រឹមážáŸ’រូវ។',
'captcha-create' => 'ដើម្បី​បង្កើážâ€‹áž‘ំពáŸážš សូមដោះស្រាយ​ប្រមាណវិធីបូក​ážáž¶áž„ក្រោម​នáŸáŸ‡ážšáž½áž…​បញ្ជូលចម្លើយ​ទៅក្នុង​ប្រអប់សិន([[Special:Captcha/help|áž–áŸážáŸŒáž˜áž¶áž“​បន្ážáŸ‚ម]])៖',
'captchahelp-title' => 'ជំនួយអំពី Captcha',
@@ -2192,13 +2251,13 @@ $messages['ko'] = array(
웹 브ë¼ìš°ì €ì—ì„œ ê·¸ë¦¼ì„ ì™„ë²½í•˜ê²Œ 표시할 수 없거나, ê·¸ë¦¼ì´ ë‚˜ì˜¤ì§€ 않는 í…스트 ë°©ì‹ì´ë‚˜ ìŒì„± 합성 ë°©ì‹ ì›¹ 브ë¼ìš°ì €ë¥¼ 사용하는 경우ì—는 ì´ëŸ¬í•œ ìž…ë ¥ì´ ë¶ˆê°€ëŠ¥í•©ë‹ˆë‹¤.
ì•„ì§ê¹Œì§€ëŠ” ì´ëŸ° ê²½ìš°ì— ëŒ€í•œ ëŒ€ì•ˆì´ ì—†ìŠµë‹ˆë‹¤.
-예기치않게 정당한 í–‰ë™ì„ 하지 못하ë„ë¡ ë§‰ëŠ”ë‹¤ë©´ [[{{MediaWiki:Grouppage-sysop}}|사ì´íŠ¸ 관리ìž]]ì—게 ë„ì›€ì„ ìš”ì²­í•´ 주세요.
+예기치않게 정당한 í–‰ë™ì„ 하지 못하ë„ë¡ ë§‰ëŠ”ë‹¤ë©´ [[Special:ListAdmins|사ì´íŠ¸ 관리ìž]]ì—게 ë„ì›€ì„ ìš”ì²­í•´ 주세요.
ì´ì „ 화면으로 ëŒì•„가려면 웹 브ë¼ìš°ì €ì˜ "뒤로" ë²„íŠ¼ì„ ëˆ„ë¥´ì„¸ìš”.',
'captcha-addurl-whitelist' => ' #<!-- ì´ ì¤„ì€ ê·¸ëŒ€ë¡œ ë‘십시오 --> <pre>
# ë¬¸ë²•ì€ ë‹¤ìŒê³¼ 같습니다:
-# * "#"ë¡œ 시작하는 ì¤„ì€ ì£¼ì„입니다.
-# * 빈 ì¤„ì´ ì•„ë‹Œ ì¤„ì€ ì •ê·œì‹ìœ¼ë¡œ, URLì˜ í˜¸ìŠ¤íŠ¸ë§Œì„ ê²€ì‚¬í•©ë‹ˆë‹¤.
+# * "#" 문ìžì—ì„œ ì¤„ì˜ ë까지는 주ì„입니다
+# * 빈 ì¤„ì´ ì•„ë‹Œ ì¤„ì€ ì •ê·œì‹ìœ¼ë¡œ, URLì˜ í˜¸ìŠ¤íŠ¸ë§Œì„ ê²€ì‚¬í•©ë‹ˆë‹¤
#</pre> <!-- ì´ ì¤„ì€ ê·¸ëŒ€ë¡œ ë‘십시오 -->',
'right-skipcaptcha' => '캡차 ê³¼ì •ì„ ê±°ì¹˜ì§€ ì•Šê³  캡차 ê³¼ì •ì„ ê±°ì¹œ 것으로 간주',
);
@@ -2242,7 +2301,7 @@ Dat es e beßßje läßtish för der Minsch, ävver de Robbotter hälld et unß
Wann De Dich ens fordeis, es och nit schlimm, De wees norr_enß jefrooch. Wat De jetipp häs, kütt nit fott.
-Schaad es, mer hann noch keine Wääsh, dat met Shprooch odder sönswi ze maache, su dat Lück met Shprooch_Ußßjaave, Braille, un met nur Tex em Brauser oohne Bellder, em Räähn shtonn künnte. Dooht Ühr Zeush eets enß oohne Lengk speischere, un saat dä [[{{MediaWiki:Grouppage-sysop}}|Wikki_Köbesse]],
+Schaad es, mer hann noch keine Wääsh, dat met Shprooch odder sönswi ze maache, su dat Lück met Shprooch_Ußßjaave, Braille, un met nur Tex em Brauser oohne Bellder, em Räähn shtonn künnte. Dooht Ühr Zeush eets enß oohne Lengk speischere, un saat dä [[Special:ListAdmins|Wikki_Köbesse]],
wann Ãœhr Probbleme hatt. Do weed_Ãœch jehollfe weede.
Jetz kanns De met Dingem Brauser singem „Zeröck“-Knopp wigger maache, wo De fürher woohß.',
@@ -2256,13 +2315,14 @@ Jetz kanns De met Dingem Brauser singem „Zeröck“-Knopp wigger maache, wo De
/** Cornish (kernowek)
* @author Kernoweger
+ * @author Nrowe
*/
$messages['kw'] = array(
- 'captcha-createaccount-fail' => 'Coden afydhya camm po gwag.',
- 'captcha-sendemail-fail' => 'Coden afydhya camm po gwag.',
+ 'captcha-createaccount-fail' => 'Koden afydhya kamm po gwag.',
+ 'captcha-sendemail-fail' => 'Koden afydhya kamm po gwag.',
);
-/** Kirghiz (Кыргызча)
+/** Kyrgyz (Кыргызча)
* @author Chorobek
*/
$messages['ky'] = array(
@@ -2286,6 +2346,7 @@ $messages['la'] = array(
/** Luxembourgish (Lëtzebuergesch)
* @author Les Meloures
* @author Robby
+ * @author Soued031
*/
$messages['lb'] = array(
'captcha-edit' => "Fir dës Säit z'änneren, léist w.e.g. dës Rechenaufgab a gitt d'Resultat an d'Këscht ënnendrënner an ([[Special:Captcha/help|méi Informatiounen]]):",
@@ -2301,20 +2362,20 @@ Fir dës Wiki virun automatiséiertem Spam ze schütze froe mir Iech fir déi fo
'captcha-sendemail-fail' => 'Falschen oder kee Confirmatiouns-Code.',
'captcha-disabledinapi' => 'Dës Aktioun brauch e Captcha, dofir ka se net mat enger API gemaach ginn.',
'captchahelp-title' => 'Captcha-Hëllef',
- 'captchahelp-cookies-needed' => 'Dir musst Cookieën an ärem Browser erlaben fir dat dëst fonktionéiert.',
- 'captchahelp-text' => "Websäiten, déi et jiddwerengem erlaben Ännerunge virzehuelen, sou wéi op dëser Wiki, ginn dacks vu sougenannte Spammer mëssbraucht, déi automatiséiert hir Linken op vill Internetsäite setzen. Esou Spam-Linke kënne wuel geläscht ginn, mä se sinn trotzdem eng grouss Plo.
+ 'captchahelp-cookies-needed' => 'Dir musst Cookien an Ärem Browser erlabe fir dat dëst funktionéiert.',
+ 'captchahelp-text' => "Websäiten, déi et jiddwerengem erlaben Ännerunge virzehuelen, sou wéi op dëser Wiki, ginn dacks vu sougenannte Spammer mëssbraucht, déi automatiséiert hir Linken op vill Internetsäite setzen. Sou Spam-Linke kënne wuel geläscht ginn, mä se sinn trotzdem eng grouss Plo.
-Heiandsdo, besonnesch wann nei Internet-Linken op eng Säit derbäigesat ginn, weist dës Wiki Iech e Bild mat faarwegem oder verzerrtem Text a freet Iech fir déi gewise Wierder anzetipppen. Well dëst eng Aufgab ass déi schwéier ze automatiséieren ass, erlaabt dëst, datt Mënschen hir Ännerunge kënnen agi wärend déi meescht Spammer an aner Roboter-Attacke kënnen ofgewiert ginn.
+Heiansdo, besonnesch wann nei Internet-Linken op eng Säit derbäigesat ginn, weist dës Wiki Iech e Bild mat faarwegem oder verzerrtem Text a freet Iech fir déi gewise Wierder anzetipppen. Well dëst eng Aufgab ass déi schwéier ze automatiséieren ass, erlaabt dëst, datt Mënschen hir Ännerunge kënnen agi während déi meescht Spammer an aner Roboter-Attacke kënnen ofgewiert ginn.
-Leider kann dat zu Schwierigkeete féiere fir Persounen déi net esou gutt gesinn oder déi text-baséiert oder sprooch-baséiert Browser benotzen.
+Leider kann dat zu Schwierigkeete féiere fir Persounen déi net sou gutt gesinn oder déi text-baséiert oder sprooch-baséiert Browser benotzen.
Zu dësem Zäitpunkt hu mir leider keng audio-Alternativ zu eiser Verfügung.
-Kontaktéiert w.e.g. [[{{MediaWiki:Grouppage-sysop}}|een Administrateur]] fir Hëllef wann dëst iech onerwaarter Wäis vu legitimen Editen ofhält.
+Kontaktéiert w.e.g. [[Special:ListAdmins|een Administrateur]] fir Hëllef wann dëst iech onerwaarter Weis vu legitimen Editen ofhält.
Dréckt op den 'Zréck' Knäppche vun ärem Browser fir an d'Beaarbechtungsfënster zréckzekommen.",
'captcha-addurl-whitelist' => ' #<!-- Dës Linn onverännert loossen --> <pre>
# Syntax:
# * Alles vun engem #-Zeechen u bis zum Enn vun där Zeil ass eng Bemierkung
-# * All Zeil déi net eidel ass, ass ee Regex-Fragment, dat nëmme mat Hosten bannent URLë fonctionnéiert
+# * All Zeil déi net eidel ass, ass ee Regex-Fragment, dat nëmme mat Hosten bannent URLe funktionéiert
#</pre> <!-- Dës Linn onverännert loossen -->',
'right-skipcaptcha' => 'Aktiounen déi eng Captcha-Aktioun verlaangen ausféieren, ouni dës maachen ze mussen',
);
@@ -2341,7 +2402,7 @@ $messages['li'] = array(
Soms, en in het bijzonder bij het toevoegen van externe links op pagina's, krijgt u een afbeelding te zien met gekleurde of vervormde tekst en wordt u gevraagd de weergegeven tekst in te voeren. Omdat dit proces lastig te automatiseren is, zijn vrijwel alleen mensen in staat dit proces succesvol te doorlopen en worden hiermee spammers en andere geautomatiseerde aanvallen geweerd.
-Helaas levert deze bevestiging voor gebruikers met een visuele handicap of een tekst- of spraakgebaseerde browser problemen op. Op het moment is er geen alternatief met geluid beschikbaar. Vraag assistentie van de [[{{MediaWiki:Grouppage-sysop}}|sitebeheerders]] als dit proces u verhindert een nuttige bijdrage te leveren.
+Helaas levert deze bevestiging voor gebruikers met een visuele handicap of een tekst- of spraakgebaseerde browser problemen op. Op het moment is er geen alternatief met geluid beschikbaar. Vraag assistentie van de [[Special:ListAdmins|sitebeheerders]] als dit proces u verhindert een nuttige bijdrage te leveren.
Klik óppe 'trök'-knoep in uw browser om terug te gaan naar het tekstbewerkingsscherm.",
'captcha-addurl-whitelist' => ' #<!-- laot deze regel --> <pre>
@@ -2362,6 +2423,14 @@ $messages['lo'] = array(
'captcha-create' => 'àºàº°àº¥àº¸àº™àº² à»àºà»‰à»€àº¥àºàºšàº§àºàº‡à»ˆàº²àºà»†àº¥àº¸à»ˆàº¡àº™àºµà»‰ à»àº¥àº° ພິມຜົນບວàºà»ƒàºªà»ˆà»ƒàº™àºàº±àºš ເພື່ອ ສ້າງໜ້ານີ້ ([[Special:Captcha/help|ຂà»à»‰àº¡àº¹àº™à»€àºžàºµà»ˆàº¡à»€àº•àºµàº¡]]):',
);
+/** لوری (لوری)
+ * @author Mogoeilor
+ */
+$messages['lrc'] = array(
+ 'captcha-label' => 'كپچا',
+ 'captchahelp-title' => 'هومياری كپچا',
+);
+
/** Lithuanian (lietuvių)
* @author Eitvys200
* @author Garas
@@ -2394,7 +2463,7 @@ Kaut arÄ« Å¡Ä«s saites var viegli dzÄ“st, tomÄ“r tÄs ir nozÄ«mÄ«gs traucÄ“klis.
ReizÄ“m, jo Ä«paÅ¡i pievienojot jaunas interneta saites, wiki programmatÅ«ra var parÄdÄ«t Tev attÄ“lu, kurÄ ir krÄsains vai sagrozÄ«ts teksts. Å is teksts ir jÄpÄrraksta un to ir ļoti grÅ«ti izdarÄ«t automÄtiski, tÄ apgrÅ«tinot lielÄko daļu mÄ“stuļotÄju, savukÄrt gandrÄ«z visi parastie lietotÄji to var izdarÄ«t bez grÅ«tÄ«bÄm.
-Diemžēl tas var apgrÅ«tinÄt lietotÄjus, kuriem ir redzes traucÄ“jumi vai kuri izmanto teksta pÄrlÅ«kus vai dzirdes pÄrlÅ«kus. Å obrÄ«d nav pieejama audio alternatÄ«va, bet sazinies ar [[{{MediaWiki:Grouppage-sysop}}|wiki administratoriem]], ja tas liedz Tev veikt labi domÄtus papildinÄjumus.
+Diemžēl tas var apgrÅ«tinÄt lietotÄjus, kuriem ir redzes traucÄ“jumi vai kuri izmanto teksta pÄrlÅ«kus vai dzirdes pÄrlÅ«kus. Å obrÄ«d nav pieejama audio alternatÄ«va, bet sazinies ar [[Special:ListAdmins|wiki administratoriem]], ja tas liedz Tev veikt labi domÄtus papildinÄjumus.
Spied pÄrlÅ«ka pogu \"Atpakaļ\" (''Back''), lai atgrieztos iepriekÅ¡Ä“jÄ lapÄ.",
);
@@ -2418,7 +2487,7 @@ Dek iko marupoan suatu karajo nan sulik untuak dibuek sacaro otomatis, pakaro ko
Sayangnyo, hal iko mambuek sarik bagi pangguno nan tabateh panglihatannyo atau dek pangguno nan manggunoan paramban web babasis-teks ataupun babasis-suaro.
Kini ko, kami alun dapek alternatip lain untuak manggunoan suaro buek pakaro ko.
-Silakan hubuangi [[{{MediaWiki:Grouppage-sysop}}|panguruih]] untuak mintak bantuan koq pakaro ko manghambaik Sanak untuak mambuek suntiangan nan layak.
+Silakan hubuangi [[Special:ListAdmins|panguruih]] untuak mintak bantuan koq pakaro ko manghambaik Sanak untuak mambuek suntiangan nan layak.
Takan tombol "back" di paramban web Sanak untuak baliak ka laman panyuntiangan.',
'right-skipcaptcha' => 'Mamicu CAPTCHA tanpa malaluinyo',
@@ -2450,7 +2519,7 @@ $messages['mk'] = array(
ÐажалоÑÑ‚ ова може да е проблем за кориÑници Ñо лош вид, или оние кои кориÑтат прелиÑтувачи на оÑнова на текÑÑ‚ или глаÑовни наредби.
Во моментов немаме аудио-алтернатива за ова.
-Контактирајте ги [[{{MediaWiki:Grouppage-sysop}}|админиÑтраторите на Ñтраната]] за помош доколку ова неочекувано ве Ñпречува во правењето на иÑкрени придонеÑи.
+Контактирајте ги [[Special:ListAdmins|админиÑтраторите на Ñтраната]] за помош доколку ова неочекувано ве Ñпречува во правењето на иÑкрени придонеÑи.
Кликнете на копчето „назад“ во вашиот прелиÑувач за да Ñе вратите на уредувањето на Ñтраницата.',
'captcha-addurl-whitelist' => ' #<!-- leave this line exactly as it is --> <pre>
@@ -2481,15 +2550,15 @@ $messages['ml'] = array(
'captchahelp-title' => 'കാപàµà´šàµà´š സഹായം',
'captchahelp-cookies-needed' => 'ഇതൠപàµà´°à´µàµ¼à´¤àµà´¤à´¿à´•àµà´•à´£à´®àµ†à´™àµà´•à´¿àµ½ താങàµà´•à´³àµà´Ÿàµ† à´¬àµà´°àµ—സറിൽ à´•àµà´•àµà´•à´¿à´•àµ¾ സജàµà´œàµ€à´•à´°à´¿à´šàµà´šà´¿à´°à´¿à´•àµà´•à´£à´‚.',
'captchahelp-text' => "à´ˆ വികàµà´•à´¿à´ªàµ‹à´²àµ† പൊതàµà´œà´¨à´™àµà´™à´³à´¿àµ½ നിനàµà´¨àµà´‚ à´ªàµà´°à´¸à´¿à´¦àµà´§à´ªàµà´ªàµ†à´Ÿàµà´¤àµà´¤à´²àµà´•àµ¾ à´¸àµà´µàµ€à´•à´°à´¿à´•àµà´•àµà´¨àµà´¨ വെബàµâ€Œâ€Œà´¸àµˆà´±àµà´±àµà´•àµ¾, à´¸àµà´µà´¯à´‚ à´ªàµà´°à´µàµ¼à´¤àµà´¤à´¿à´•àµà´•àµà´¨àµà´¨ ഉപകരണങàµà´™àµ¾ ഉപയോഗിചàµà´šàµ à´•à´£àµà´£à´¿à´•à´³àµà´‚ മറàµà´±àµà´‚ à´ªàµà´°à´¸à´¿à´¦àµà´§à´ªàµà´ªàµ†à´Ÿàµà´¤àµà´¤àµà´¨àµà´¨ à´¸àµà´ªà´¾à´®àµ¼à´®à´¾àµ¼ സാധാരണ à´¦àµà´°àµà´ªà´¯àµ‹à´—à´‚ ചെയàµà´¯à´¾à´±àµà´£àµà´Ÿàµ.
-ഇതàµà´¤à´°à´¤àµà´¤à´¿à´²àµà´³àµà´³ à´¸àµà´ªà´¾à´‚ à´•à´£àµà´£à´¿à´•àµ¾ നീകàµà´•à´‚ചെയàµà´¯à´ªàµà´ªàµ†à´Ÿàµà´Ÿàµà´ªàµ‹à´•àµà´®àµ†à´™àµà´•à´¿à´²àµà´‚, à´…à´µ ശരികàµà´•àµà´‚ ശലàµà´¯à´®à´¾à´£àµ.
+ഇതàµà´¤à´°à´¤àµà´¤à´¿à´²àµà´³àµà´³ പാഴെഴàµà´¤àµà´¤àµ à´•à´£àµà´£à´¿à´•àµ¾ നീകàµà´•à´‚ചെയàµà´¯à´ªàµà´ªàµ†à´Ÿàµà´Ÿàµà´ªàµ‹à´•àµà´®àµ†à´™àµà´•à´¿à´²àµà´‚, à´…à´µ ശരികàµà´•àµà´‚ ശലàµà´¯à´®à´¾à´£àµ.
-ചിലപàµà´ªàµ‹àµ¾, à´ªàµà´°à´¤àµà´¯àµ‡à´•à´¿à´šàµà´šàµ ഒരൠവെബൠകണàµà´£à´¿ താളിൽ കൂടàµà´Ÿà´¿à´šàµà´šàµ‡àµ¼à´•àµà´•àµà´®àµà´ªàµ‹àµ¾, നിറങàµà´™àµ¾ ചേർതàµà´¤à´¤àµ‹ വികലമാകàµà´•à´¿à´¯à´¤àµ‹ ആയ à´Žà´´àµà´¤àµà´¤àµà´•àµ¾ താങàµà´•à´³àµ† കാണിചàµà´šàµ à´…à´µ താങàµà´•à´³àµ‹à´Ÿàµ ടെപàµà´ªàµ ചെയàµà´¯à´¾àµ» വികàµà´•à´¿ ആവശàµà´¯à´ªàµà´ªàµ†à´Ÿà´¾à´‚.
-ഇതൠമനàµà´·àµà´¯à´¸à´¹à´¾à´¯à´®à´¿à´²àµà´²à´¾à´¤àµ† ചെയàµà´¯à´¾àµ» à´¬àµà´¦àµà´§à´¿à´®àµà´Ÿàµà´Ÿà´¾à´£àµ, à´…à´¤àµà´•àµŠà´£àµà´Ÿàµ ശരികàµà´•àµà´‚ മനàµà´·àµà´¯à´°à´¾à´¯à´¿à´Ÿàµà´Ÿàµà´³àµà´³à´µàµ¼à´•àµà´•àµ അവരàµà´Ÿàµ† à´ªàµà´°à´¸à´¿à´¦àµà´§à´ªàµà´ªàµ†à´Ÿàµà´¤àµà´¤à´²àµà´•àµ¾ ചേർകàµà´•à´¾à´¨àµà´‚ അതേസമയം ബഹàµà´­àµ‚രിപകàµà´·à´‚ à´¸àµà´ªà´¾à´®àµ¼à´®à´¾à´°àµ‡à´¯àµà´‚ യനàµà´¤àµà´°à´™àµà´™à´³àµà´ªà´¯àµ‹à´—à´¿à´šàµà´šàµ ആകàµà´°à´®à´¿à´•àµà´•àµà´¨àµà´¨à´µà´°àµ‡à´¯àµà´‚ തടയാനàµà´‚ à´•à´´à´¿à´¯àµà´¨àµà´¨à´¤à´¾à´£àµ.
+ചിലപàµà´ªàµ‹àµ¾, à´ªàµà´°à´¤àµà´¯àµ‡à´•à´¿à´šàµà´šàµ ഒരൠവെബൠകണàµà´£à´¿ താളിൽ കൂടàµà´Ÿà´¿à´šàµà´šàµ‡àµ¼à´•àµà´•àµà´®àµà´ªàµ‹àµ¾, നിറങàµà´™àµ¾ ചേർതàµà´¤à´¤àµ‹ വികലമാകàµà´•à´¿à´¯à´¤àµ‹ ആയ à´Žà´´àµà´¤àµà´¤àµà´•àµ¾ താങàµà´•à´³àµ† കാണിചàµà´šàµ à´…à´µ ടൈപàµà´ªàµ ചെയàµà´¯à´¾àµ» താങàµà´•à´³àµ‹à´Ÿàµ ആവശàµà´¯à´ªàµà´ªàµ†à´Ÿàµà´Ÿàµ‡à´•àµà´•à´¾à´‚.
+ഇതൠമനàµà´·àµà´¯à´¸à´¹à´¾à´¯à´®à´¿à´²àµà´²à´¾à´¤àµ† ചെയàµà´¯à´¾àµ» à´¬àµà´¦àµà´§à´¿à´®àµà´Ÿàµà´Ÿà´¾à´¯à´¤à´¿à´¨à´¾àµ½, ശരികàµà´•àµà´‚ മനàµà´·àµà´¯à´°à´¾à´¯à´¿à´Ÿàµà´Ÿàµà´³àµà´³à´µàµ¼à´•àµà´•àµ തങàµà´™à´³àµà´¦àµà´¦àµ‡à´¶à´¿à´•àµà´•àµà´¨àµà´¨à´¤àµ ചേർകàµà´•à´¾à´¨àµà´‚ അതേസമയം ബഹàµà´­àµ‚രിപകàµà´·à´‚ à´¸àµà´ªà´¾à´®àµ¼à´®à´¾à´°àµ‡à´¯àµà´‚ യനàµà´¤àµà´°à´™àµà´™à´³àµà´ªà´¯àµ‹à´—à´¿à´šàµà´šàµ ആകàµà´°à´®à´¿à´•àµà´•àµà´¨àµà´¨à´µà´°àµ‡à´¯àµà´‚ തടയാനàµà´‚ à´•à´´à´¿à´¯àµà´¨àµà´¨à´¤à´¾à´£àµ.
-ദൗർഭാഗàµà´¯à´•à´°à´®àµ†à´¨àµà´¨àµ പറയടàµà´Ÿàµ† ഇതൠചിലപàµà´ªàµ‹àµ¾ ദൃഷàµà´Ÿà´¿à´µàµˆà´•à´²àµà´¯à´‚ കൊണàµà´Ÿàµ‹ മറàµà´±àµ‹ à´Žà´´àµà´¤àµà´¤àµà´•àµ¾ മാതàµà´°à´®à´¨àµà´µà´¦à´¿à´•àµà´•àµà´¨àµà´¨ à´¬àµà´°àµ—സറàµà´•àµ¾ ഉപയോഗികàµà´•àµà´¨àµà´¨à´µàµ¼, ശബàµà´¦à´‚ കേടàµà´Ÿàµ മനസàµà´¸à´¿à´²à´¾à´•àµà´•àµà´¨àµà´¨à´µàµ¼ à´¤àµà´Ÿà´™àµà´™à´¿à´¯à´µàµ¼à´•àµà´•àµ à´¬àµà´¦àµà´§à´¿à´®àµà´Ÿàµà´Ÿà´¾à´¯àµ‡à´•àµà´•à´¾à´‚.
+ദൗർഭാഗàµà´¯à´•à´°à´®àµ†à´¨àµà´¨àµ പറയടàµà´Ÿàµ† ഇതൠചിലപàµà´ªàµ‹àµ¾ ദൃഷàµà´Ÿà´¿à´µàµˆà´•à´²àµà´¯à´‚ കൊണàµà´Ÿàµ‹ മറàµà´±àµ‹, à´Žà´´àµà´¤àµà´¤àµà´•àµ¾ മാതàµà´°à´®à´¨àµà´µà´¦à´¿à´•àµà´•àµà´¨àµà´¨ à´¬àµà´°àµ—സറàµà´•àµ¾ ഉപയോഗികàµà´•àµà´¨àµà´¨à´µàµ¼, ശബàµà´¦à´‚ കേടàµà´Ÿàµ മനസàµà´¸à´¿à´²à´¾à´•àµà´•àµà´¨àµà´¨à´µàµ¼ à´¤àµà´Ÿà´™àµà´™à´¿à´¯à´µàµ¼à´•àµà´•àµ à´¬àµà´¦àµà´§à´¿à´®àµà´Ÿàµà´Ÿà´¾à´¯àµ‡à´•àµà´•à´¾à´‚.
ഇപàµà´ªàµ‹àµ¾ à´žà´™àµà´™àµ¾à´•àµà´•àµ ഇതിനൠപകരം ശബàµà´¦à´‚ നൽകàµà´¨àµà´¨ സംവിധാനമിലàµà´².
-ഇതൠനàµà´¯à´¾à´¯à´®à´¾à´¯ à´ªàµà´°à´¸à´¿à´¦àµà´§à´ªàµà´ªàµ†à´Ÿàµà´¤àµà´¤à´²àµà´•àµ¾ ഇടàµà´¨àµà´¨à´¤à´¿àµ½ നിനàµà´¨àµà´‚ à´…à´ªàµà´°à´¤àµ€à´•àµà´·à´¿à´¤à´®à´¾à´¯à´¿ താങàµà´•à´³àµ† തടയàµà´¨àµà´¨àµà´µàµ†à´™àµà´•à´¿àµ½ ദയവായി [[{{MediaWiki:Grouppage-sysop}}|സൈറàµà´±à´¿à´¨àµà´±àµ† കാരàµà´¯à´¨à´¿àµ¼à´µà´¾à´¹à´•à´°àµ†]] ബനàµà´§à´ªàµà´ªàµ†à´Ÿàµà´•.
+ഇതൠനàµà´¯à´¾à´¯à´®à´¾à´¯ à´ªàµà´°à´¸à´¿à´¦àµà´§à´ªàµà´ªàµ†à´Ÿàµà´¤àµà´¤à´²àµà´•àµ¾ ഇടàµà´¨àµà´¨à´¤à´¿àµ½ നിനàµà´¨àµà´‚ à´…à´ªàµà´°à´¤àµ€à´•àµà´·à´¿à´¤à´®à´¾à´¯à´¿ താങàµà´•à´³àµ† തടയàµà´¨àµà´¨àµà´µàµ†à´™àµà´•à´¿àµ½ ദയവായി [[Special:ListAdmins|സൈറàµà´±à´¿à´¨àµà´±àµ† കാരàµà´¯à´¨à´¿àµ¼à´µà´¾à´¹à´•à´°àµ†]] ബനàµà´§à´ªàµà´ªàµ†à´Ÿàµà´•.
à´¬àµà´°àµ—സറിലെ 'ബാകàµà´•àµ' ബടàµà´Ÿàµº ഞെകàµà´•à´¿à´¯à´¾àµ½ താങàµà´•àµ¾à´•àµà´•àµ താൾ തിരàµà´¤àµà´¤àµà´µà´¾à´¨àµà´³àµà´³ സംവിധാനതàµà´¤à´¿à´²àµ‡à´¯àµà´•àµà´•àµ മടങàµà´™à´¿à´ªàµà´ªàµ‹à´•à´¾à´µàµà´¨àµà´¨à´¤à´¾à´£àµ.",
'captcha-addurl-whitelist' => ' #<!-- à´ˆ വരി ഇതàµà´ªàµ‹à´²àµ† തനàµà´¨àµ† നിലനിർതàµà´¤àµà´• --> <pre>
@@ -2517,7 +2586,7 @@ $messages['mn'] = array(
ХарамÑалтай нь хараа муутай буюу бичигт ÑÑвÑл Ñрианд тулгуурлаÑан вÑб хөтөч ашигладаг Ñ…ÑÑ€ÑглÑгчдÑд хүндрÑл учирна.
Одоогийн байдлаар дуун Ñонголт алга байна.
-Таньд бодит заÑвар хийхÑд хүндрÑл учирч байвал [[{{MediaWiki:Grouppage-sysop}}|Ñайтын админиÑтраторуудааÑ]] туÑламж авч холбогдоно уу.
+Таньд бодит заÑвар хийхÑд хүндрÑл учирч байвал [[Special:ListAdmins|Ñайтын админиÑтраторуудааÑ]] туÑламж авч холбогдоно уу.
ХуудаÑны заÑварлагч руу буцахын тулд вÑб хөтөчийнхөө "буцаах" товч дÑÑÑ€ дарна уу.',
);
@@ -2548,7 +2617,7 @@ $messages['mr'] = array(
पण खेदाची गोषà¥à¤Ÿ अशी की हà¥à¤¯à¤¾à¤®à¥à¤³à¥‡ अरà¥à¤§à¤¾à¤‚ध वà¥à¤¯à¤•à¥à¤¤à¥€ तसेच जà¥à¤¯à¤¾ वà¥à¤¯à¤•à¥à¤¤à¥€ फकà¥à¤¤ मजकूर दाखविणारा नà¥à¤¯à¤¾à¤¹à¤¾à¤³à¤• वापरतात, अशांना असà¥à¤µà¤¿à¤§à¤¾ होऊ शकते.
सधà¥à¤¯à¤¾ आमचà¥à¤¯à¤¾à¤•à¤¡à¥‡ आवाज à¤à¤•à¤£à¥à¤¯à¤¾à¤šà¥€ सà¥à¤µà¤¿à¤§à¤¾ नाही.
-कृपया [[{{MediaWiki:Grouppage-sysop}}|संसà¥à¤¥à¤³ पà¥à¤°à¤šà¤¾à¤²à¤•à¤¾à¤‚शी]] या बाबतीत संपरà¥à¤• करावा.
+कृपया [[Special:ListAdmins|संसà¥à¤¥à¤³ पà¥à¤°à¤šà¤¾à¤²à¤•à¤¾à¤‚शी]] या बाबतीत संपरà¥à¤• करावा.
पृषà¥à¤  संपादनाकडे परत जाणà¥à¤¯à¤¾à¤¸à¤¾à¤ à¥€ आपलà¥à¤¯à¤¾ बà¥à¤°à¤¾à¤‰à¤à¤°à¤šà¥€ ’Back' ही कळ दाबा.",
'captcha-addurl-whitelist' => ' #<!-- leave this line exactly as it is --> <pre>
@@ -2586,7 +2655,7 @@ Kadangkala, terutamanya apabila menambah pautan baharu pada sesebuah laman, wiki
Oleh sebab tugas tersebut sukar dilakukan secara automatik, ia membolehkan manusia sebenar mengirim seperti biasa, manakala penghantar spam dan penyerang robot terhalang.
Malangnya perkara ini boleh menyukarkan pengguna yang mengalami masalah penglihatan atau sedang menggunakan pelayar web teks atau tuturan. Pada masa ini kami tidak mempunyai alternatif audio.
-Sila hubungi [[{{MediaWiki:Grouppage-sysop}}|pentadbir tapak]] untuk mendapatkan bantuan sekiranya perkara ini menghalang anda daripada membuat sumbangan yang sah.
+Sila hubungi [[Special:ListAdmins|pentadbir tapak]] untuk mendapatkan bantuan sekiranya perkara ini menghalang anda daripada membuat sumbangan yang sah.
Sila tekan butang 'back' di pelayar web anda untuk kembali ke laman suntingan.",
'captcha-addurl-whitelist' => ' #<!-- jangan ubah baris ini --> <pre>
@@ -2638,7 +2707,7 @@ $messages['nan'] = array(
'captcha-createaccount-fail' => 'Khak-jÄ«n-bé chhò-gÅ· iah-sÄ« làu-kau.',
);
-/** Norwegian Bokmål (norsk (bokmål)‎)
+/** Norwegian Bokmål (norsk bokmål)
* @author Audun
* @author Danmichaelo
* @author Laaknor
@@ -2662,7 +2731,7 @@ $messages['nb'] = array(
Noen ganger, særlig hvis du vil legge til nye internettlenker til en side, kan wikien vise deg et bilde av en farge eller ujevn tekst og be deg skrive inn ordene som vises. Siden det er vanskelig å automatisere denne oppgaven, vil funksjonen slippe de fleste virkelige mennesker igjennom, men stoppe spammere.
-Dessverre finnes det i øyeblikket ikke noe audioalternativ for brukere med begrenset syn som som bruker tekst- eller talebaserte nettlesere. Vennligst kontakt [[{{MediaWiki:Grouppage-sysop}}|administratorene]] hvis denne funksjonen forhindrer deg i å foreta legitime endringer.
+Dessverre finnes det i øyeblikket ikke noe audioalternativ for brukere med begrenset syn som som bruker tekst- eller talebaserte nettlesere. Vennligst kontakt [[Special:ListAdmins|administratorene]] hvis denne funksjonen forhindrer deg i å foreta legitime endringer.
Trykk på 'tilbake'-knappen for å komme tilbake til redigeringssiden.",
'captcha-addurl-whitelist' => ' #<!-- leave this line exactly as it is --> <pre>
@@ -2711,17 +2780,17 @@ Mit den „Trüch“-Knopp vun dien Browser kummst du trüch na dat Ännerfinste
'right-skipcaptcha' => 'Överspringen vun Captchas',
);
-/** Nedersaksies (Nedersaksies)
+/** Low Saxon (Netherlands) (Nedersaksies)
* @author Servien
*/
$messages['nds-nl'] = array(
'captcha-edit' => "Um disse zied te bewarken, mu'j eerst t antwoord op disse eenvoudige somme invullen ([[Special:Captcha/help|meer informasie]]):",
- 'captcha-desc' => 'Biejt CAPTCHA-technieken um bescharming te biejen tegen moekpost en t raojen van wachtwoorden',
- 'captcha-addurl' => 'Joew bewarking bevat nieje uutgaonde verwiezingen.
-Voer ter de bescharming tegen ongewunste reklame de somme in die hieronder steet:<br />
-([[Special:Captcha/help|Hulpe?]])', # Fuzzy
- 'captcha-badlogin' => 'Los disse eenvoudige rekensomme op en voer t antwoord in bie t invoervienster in ter bescharming tegen t automaties kraken van wachtwoorden ([[Special:Captcha/help|meer informasie]]):', # Fuzzy
- 'captcha-createaccount' => 'Voer ter bescharming tegen automatiese ongewunste reklame t antwoord op disse eenvoudige rekensomme in bie invoervienster ([[Special:Captcha/help|meer informatie]]):', # Fuzzy
+ 'captcha-desc' => 'Biedt CAPTCHA-technieken um bescharming te biejen tegen spam en t raojen van wachtwoorden',
+ 'captcha-addurl' => 'In joew bewarking staon nieje uutgaonde verwiezingen.
+Vul ter de bescharming van disse wiki tegen automatiese moekbiedragen t antwoord op de somme in, in t invoerveld dat hieronder steet, um joew bewarking op te slaon:<br />
+([[Special:Captcha/help|meer informasie]])',
+ 'captcha-badlogin' => 'Vul ter de bescharming van disse wiki tegen t automaties kraken van wachtwoorden t antwoord op de somme in, in t invoerveld ([[Special:Captcha/help|meer informasie]]):',
+ 'captcha-createaccount' => 'Vul ter bescharming van disse wiki tegen t automaties anmaken van gebrukers t antwoord op de somme in, in t invoerveld ([[Special:Captcha/help|meer informasie]]):',
'captcha-createaccount-fail' => 'Verkeerde of ontbrekende bevestigingskode.',
'captcha-create' => 'Je bin n nieje zied an t maken.
Voer t antwoord van disse eenvoudige rekensomme in bie t invoervienster
@@ -2734,7 +2803,7 @@ Soms a'j nieje verwiezingen bie n zied derop zetten, wö'j evreugen um iets over
Spietig genog levert disse bevestiging veur gebrukers mit n visuele beparking of n tekst- of spraakebaseerden webkieker problemen op.
Op t moment is der gien alternatief mit geluud beschikbaor.
-Vraag um hulpe van de [[{{MediaWiki:Grouppage-sysop}}|websteebeheerders]] as dit proses joe in de weg steet n nuttige biedrage te leveren.
+Vraag um hulpe van de [[Special:ListAdmins|websteebeheerders]] as dit proses joe in de weg steet n nuttige biedrage te leveren.
(Klik op de knoppe 'terug' in joew webkieker, um weerumme te gaon naor t tekstbewarkingscharm.)",
'captcha-addurl-whitelist' => ' #<!-- laot disse regel zo as t is --> <pre>
@@ -2773,7 +2842,7 @@ Omdat dit proces lastig te automatiseren is, zijn vrijwel alleen mensen in staat
Helaas levert deze bevestiging voor gebruikers met een visuele handicap of een tekst- of spraakgebaseerde browser problemen op.
Op het moment is er geen alternatief met geluid beschikbaar.
-Vraag assistentie van de [[{{MediaWiki:Grouppage-sysop}}|sitebeheerders]] als dit proces u verhindert een nuttige bijdrage te leveren.
+Vraag assistentie van de [[Special:ListAdmins|sitebeheerders]] als dit proces u verhindert een nuttige bijdrage te leveren.
Klik op de knop 'terug' in uw browser om terug te gaan naar het tekstbewerkingsscherm.",
'captcha-addurl-whitelist' => ' #<!-- laat deze regel zoals hij is --> <pre>
@@ -2799,12 +2868,12 @@ Omdat dit proces lastig te automatiseren is, zijn vrijwel alleen mensen in staat
Helaas levert deze bevestiging voor gebruikers met een visuele handicap of een tekst- of spraakgebaseerde browser problemen op.
Op het moment is er geen alternatief met geluid beschikbaar.
-Vraag assistentie van de [[{{MediaWiki:Grouppage-sysop}}|sitebeheerders]] als dit proces je verhindert een nuttige bijdrage te leveren.
+Vraag assistentie van de [[Special:ListAdmins|sitebeheerders]] als dit proces je verhindert een nuttige bijdrage te leveren.
Klik op de knop 'terug' in je browser om terug te gaan naar het tekstbewerkingsscherm.",
);
-/** Norwegian Nynorsk (norsk (nynorsk)‎)
+/** Norwegian Nynorsk (norsk nynorsk)
* @author Eirik
* @author Frokor
* @author Harald Khan
@@ -2831,7 +2900,7 @@ Nokre gonger, særleg viss du vil leggje til nye internettlenkjer til ei side, k
Sidan det er vanskeleg å automatisere denne oppgåva, vil funksjonen sleppe dei fleste verkelege menneska gjennom, men stoppe reklamerobotar.
Diverre finst det i augeblikket ikkje noko lydalternativ for brukarar med nedsett syn som brukar tekst- eller talebaserte nettlesarar.
-Ver venleg å kontakte [[{{MediaWiki:Grouppage-sysop}}|administratorane]] viss denne funksjonen hindrar deg i å gjere skikkelege endringar.
+Ver venleg å kontakte [[Special:ListAdmins|administratorane]] viss denne funksjonen hindrar deg i å gjere skikkelege endringar.
Trykk på «attende»-knappen for å kome tilbake til endringssida.',
'captcha-addurl-whitelist' => ' #<!-- leave this line exactly as it is --> <pre>
# Syntaksen er slik:
@@ -2846,9 +2915,10 @@ Trykk på «attende»-knappen for å kome tilbake til endringssida.',
*/
$messages['oc'] = array(
'captcha-edit' => "Per modificar aquesta pagina, vos cal efectuar lo calcul çaijós e n'inscriure lo resultat dins lo camp ([[Special:Captcha/help|Mai d’entresenhas]]) :",
- 'captcha-desc' => 'Implementacion captcha simpla', # Fuzzy
+ 'captcha-desc' => 'Ofèrta de tecnicas CAPTCHA per protegir contra lo spam e la descobèrta dels senhals per ensages multiples',
'captcha-label' => 'CAPTCHA',
- 'captcha-addurl' => "Vòstra modificacion inclutz de ligams URL novèla ; per empachar las connexions automatizadas, vos cal picar los mots que s’afichan dins l’imatge que seguís : <br />([[Special:Captcha/help|Qu'es aquò?]])", # Fuzzy
+ 'captcha-addurl' => "Vòstra modificacion inclutz de ligams extèrnes.
+Per nos ajudar dins la proteccion contra lo corrièr indesirable automatizat, calculatz l'operacion simpla çaijós e inscrivissètz-ne lo resultat dins lo camp ([[Special:Captcha/help|mai d'informacions]]) :",
'captcha-badlogin' => "Per ensajar de contornar las temptativas de cracatge de senhals automatizadas per de robòts, recopiatz lo tèxte çaijós dins la bóstia de tèxte plaçada al dejós d'aqueste. ([[Special:Captcha/help|Mai d’entresenhas]])", # Fuzzy
'captcha-createaccount' => 'Coma proteccion contra las creacions de compte abusivas, entratz lo resultat de l’addicion dins la bóstia çaijós:<br />
([[Special:Captcha/help|mai d’entresenhas]])', # Fuzzy
@@ -2856,7 +2926,7 @@ $messages['oc'] = array(
'captcha-create' => "Per modificar la pagina, vos cal de resòldre l'operacion çaijós e n'inscriure lo resultat dins lo camp ([[Special:Captcha/help|Mai d'infòs]]) :",
'captchahelp-title' => 'Ajuda suls Captcha',
'captchahelp-cookies-needed' => "Vos cal aver los cookies activats dins vòstre navigador per qu'aquò foncione.",
- 'captchahelp-text' => "Los sites webs qu'accèptan de contribucions del public, coma aqueste wiki, sovent son atacats per de spammers qu'utilizan d'espleches automatizats per plaçar de ligams nombroses cap a de sites.
+ 'captchahelp-text' => "Los sites webs qu'accèptan de contribucions del public, coma aqueste wiki, sovent son atacats per de spammers qu'utilizan d'aisinas automatizadas per plaçar de ligams nombroses cap a de sites.
Quitament se son de bon suprimir, demòran una noisença significativa.
De còps, particularament quora apondètz de ligams extèrnes dins una pagina, lo wiki vos pòt mostrar un imatge amb un tèxte coloriat, desformat o torçut e vos demandar de picar los mots indicats.
@@ -2864,14 +2934,14 @@ Aquesta tasca es complicada d'automatizar, çò que permet de diferenciar un uma
Malurosament, aquesta solucion pòt geinar d'utilizaires malvesents o qu'utilizan un navigador textual o vocal.
Dispausam pas d’alternativa àudio pel moment.
-Contactatz [[{{MediaWiki:Grouppage-sysop}}|los administrators del site]] se aquò vos empacha d'un biais imprevist de postar de contribucions legitimas.
+Contactatz [[Special:ListAdmins|los administrators del site]] se aquò vos empacha d'un biais imprevist de postar de contribucions legitimas.
Clicatz sul boton « Precedent » de vòstre navigador per tornar a la pagina de modificacion.",
'captcha-addurl-whitelist' => '#<!-- daissatz aquesta linha exactament tala coma es --> <pre> # La sintaxi es la seguenta: # * Tot caractèr seguissent "#" fins a la fin de la linha serà interpretat coma un comentari # * Tota linha non voida es un còde regex que serà utilizat unicament a l\'interior dels ligams hypertext. #</pre> <!-- daissatz aquesta linha exactament tala coma es -->',
'right-skipcaptcha' => "Acomplís lo desenclavament de las accions de captcha sens dever passar per l'intermediari aqueste darrièr",
);
-/** Oriya (ଓଡ଼ିଆ)
+/** Oriya (ଓଡ଼ିଆ)
* @author Jnanaranjan Sahu
* @author Psubhashish
* @author Shisir 1945
@@ -2899,7 +2969,7 @@ $messages['or'] = array(
ଅପରାପକà­à¬·à­‡ à¬à¬¹à¬¾ ସୀମିତ ଦୃଷà­à¬Ÿà¬¿à¬¥à¬¿à¬¬à¬¾ ବା ଲେଖା କିମà­à¬¬à¬¾ କଥା କà­à¬¹ ବà­à¬°à¬¾à¬‰à¬œà¬° ବà­à­Ÿà¬¬à¬¹à¬¾à¬° କରà­à¬¥à¬¿à¬¬à¬¾ ସଭà­à­Ÿà¬®à¬¾à¬¨à¬™à­à¬•à­ ଅସà­à¬¬à¬¿à¬§à¬¾à¬°à­‡ ପକାଇଥାଠ।
ଅଧà­à¬¨à¬¾ à¬à¬ à¬¾à¬°à­‡ ଧà­à­±à¬¨à¬¿à¬šà¬³à¬¿à¬¤ ବିକଳà­à¬ªà¬Ÿà¬¿à¬ ଦେଇନାହà­à¬ ।
-ଆପଣଙà­à¬•à­ ଉପଯà­à¬•à­à¬¤ ଲେଖା ଦେବାରେ ସହଯୋଗ କରିବା ନିମନà­à¬¤à­‡ ଦୟାକରି [[{{MediaWiki:Grouppage-sysop}}|ସାଇଟ ପରିଛା]]ମାନଙà­à¬•à­ ଯୋହଗାଯୋଗ କରନà­à¬¤à­ ।
+ଆପଣଙà­à¬•à­ ଉପଯà­à¬•à­à¬¤ ଲେଖା ଦେବାରେ ସହଯୋଗ କରିବା ନିମନà­à¬¤à­‡ ଦୟାକରି [[Special:ListAdmins|ସାଇଟ ପରିଛା]]ମାନଙà­à¬•à­ ଯୋହଗାଯୋଗ କରନà­à¬¤à­ ।
ଆପଣଙà­à¬• ବà­à¬°à¬¾à¬‰à¬œà¬°à¬°à­‡ ଥିବା 'back' ଚିପି ପୃଷà­à¬ à¬¾ ସମà­à¬ªà¬¾à¬¦à¬•à¬•à­ ଲେଉଟିଯାନà­à¬¤à­ ।",
'captcha-addurl-whitelist' => ' #<!—à¬à¬¹à¬¿ ଧାଡ଼ିଟି ଯେମିତି ଅଛି ସେମିତି ଛାଡ଼ି ଦିଅନà­à¬¤à­ --> <pre>
@@ -2963,7 +3033,7 @@ Ponieważ są to zadania trudne do zautomatyzowania, takie zabezpieczenia umożl
Niestety, może być to niewygodne dla użytkowników z wadą wzroku lub używających przeglądarek tekstowych lub głosowych.
Obecnie nie mamy alternatywnego rozwiÄ…zania audio.
-Skontaktuj się z [[{{MediaWiki:Grouppage-sysop}}|administratorami strony]] by uzyskać pomoc, jeśli nie możesz z tego powodu dokonywać uprawnionych edycji.
+Skontaktuj się z [[Special:ListAdmins|administratorami strony]] by uzyskać pomoc, jeśli nie możesz z tego powodu dokonywać uprawnionych edycji.
Wciśnij przycisk „wstecz†w przeglądarce by powrócić do edycji strony.',
'captcha-addurl-whitelist' => ' #<!-- nie modyfikuj tej linii --> <pre>
@@ -2996,13 +3066,13 @@ ant ël quadrèt ([[Special:Captcha/help|për savejne dë pì]]):",
'captcha-disabledinapi' => "St'assion-sì a ciama na captcha, parèj a peul pa esse fàita con na API.",
'captchahelp-title' => 'Còs é-lo mai ës captcha?',
'captchahelp-cookies-needed' => "Për podej dovré sossì a l'ha da manca che sò navigator (browser) a pija ij cookies.",
- 'captchahelp-text' => "Soèns a-i riva che ij sit dla Ragnà che la gent a peul dovré për ëscrive chèich-còs, coma sta wiki-sì, a resto ambërlifà ëd reclam da màchine che a carìo soa ròba dadsà e dadlà n'aotomàtich. Për tant che sta reclam un a peula peuj gavela, a resta sempe un gran fastudi.
+ 'captchahelp-text' => "Soèns a-i riva che ij sit dla Ragnà che la gent a peul dovré për ëscrive chèich-còs, coma sta wiki-sì, a resto ambërlifà d'areclam da 'd màchine che a cario soa ròba dadsà e dadlà n'aotomàtich. Për tant che sti areclam un a peula peuj gavela, a resta sempe un gran fastudi.
-Dle vire, dzortut quand un a caria dj'anliure esterne neuve ansime a na pàgina, la wiki a peul ësmon-je na figurin-a con dël test colora ò pura tut ëstòrt e ciameje d'arbate lòn ch'a-i é scrit andrinta. Da già ch'a l'é grama scrive un programa ch'a lo fasa, a ven che la pì gran part dla gent a-i la fa a scrive, ma la ói part dle màchine a-i la fa pa.
+Dle vire, dzortut quand un a caria dj'anliure esterne neuve ansime a na pàgina, la wiki a peul ësmon-je na figurin-a con dël test colora ò pura tut ëstòrt e ciameje d'arbate lòn ch'a-i é scrit andrinta. Da già ch'a l'é grama scrive un programa ch'a lo fasa, a ven che la pì gran part dla gent a-i la fa a scrive, ma la pi part dle màchine a-i la fa pa.
-Për maleur sossì a peul fastudié j'uetnt ch'a ës-ciàiro nen tant bin, col ch'a dòvro dij navigator mach a test ò pura dij navigator vocaj. Për adess i l'oma nen n'altërnativa disponibila ch'a fasa lese ël test a vos. Për piasì, ch'a contata j'[[{{MediaWiki:Grouppage-sysop}}|aministrator dël sit]] se sossì a dovèissa mai nen lasseje carié dël test ch'a sia legitim (visadì, nen dla reclam).
+Për maleur sossì a peul fastudié j'utent ch'a s-ciàiro nen tant bin, coj ch'a deuvro dij navigator mach a test ò pura dij navigator vocaj. Për adess i l'oma nen n'alternativa disponìbil ch'a fasa lese ël test a vos. Për piasì, ch'a contata j'[[Special:ListAdmins|aministrator dël sit]] se sossì a dovèissa mai nen lasseje carié dël test ch'a sia legìtim (visadì, nen dj'areclam).
-Ch'a-i bata ansima al boton 'andré' ant sò navigator për torné andré a l'editor dla pàgina.",
+Ch'a-i bata ansima al boton «andré» ant sò navigator për torné andré a l'editor dla pàgina.",
'captcha-addurl-whitelist' => " #<!-- leave this line exactly as it is --> <pre>
# La sintassi a l'é costa:
# * tut lòn ch'a-i ven dapress a un caràter \"#\" (fin-a a la fin dla riga) a l'é mach ëd coment
@@ -3034,7 +3104,7 @@ $messages['pnb'] = array(
اے Ú©Ù… ایسا اے جیÛڑا چلانا اوکھا اے، اے Ú†ÙˆÚ©Ú¾Û’ سارے لوکاں نوں اپنی ڈاک پیجن دیوے گا تے سپامراں نوں روک دیوے گا،
بدقسمستی نال اے تھوڑی سوچ رکھن والے ورتنوالیاں یا لکھت ورتن والے یا گل بات والے براؤزر نوں چنگا ناں لگے۔
-ایس ویلے ساڈے کول ایدے تھاں تے ورتیا جان والا آڈیو نئیں۔ Ù…Ûربانی کرکے [[{{MediaWiki:Grouppage-sysop}}|site administrators]] نال ملو مدد لئی اگ Ø§ÛŒÛ Ø§Ú†Ø§Ù†Ú© تواڈی ٹھیک ڈاک نوں روکدا اے۔
+ایس ویلے ساڈے کول ایدے تھاں تے ورتیا جان والا آڈیو نئیں۔ Ù…Ûربانی کرکے [[Special:ListAdmins|site administrators]] نال ملو مدد لئی اگ Ø§ÛŒÛ Ø§Ú†Ø§Ù†Ú© تواڈی ٹھیک ڈاک نوں روکدا اے۔
بیک بٹن نوں دباؤ اپنے براؤزر Ú† صÙÛ Ù„Ú©Ú¾Ø§Ø±ÛŒ تک اپڑن لئی۔',
'captcha-addurl-whitelist' => ' #<!-- leave this line exactly as it is --> <pre>
# Syntax is as follows:
@@ -3051,30 +3121,31 @@ $messages['ps'] = array(
'captcha-create' => 'Ø¯Ø¯Û Ù„Ù¾Ø§Ø±Ù‡ Ú†Û Ù†ÙˆÛŒ ليکنه ترسره کړی، لطÙاً د همدغه ساده شمÛرو Úواب په ورکړ شوي چوکاټ Ú©Û ÙˆÙ„ÙŠÚ©ÛŒ ([[Special:Captcha/help|نور مالومات]]):',
'captchahelp-title' => 'CAPTCHA لارښود',
'captchahelp-cookies-needed' => 'Ø¯Ø¯Û Ú©Ú“Ù†Û Ø¯ ترسره Ú©Ûدلو لپاره تاسو ته پکار ده Ú†Û Ø¯ خپل کتنمل (browser) کوکيز (cookies) چارن Ú©Ú“ÛŒ.',
- 'captchahelp-text' => "هغه ÙˆÛبÚايونه Ú†Û Ø¯ ټولو ÙˆÚ«Ú“Ùˆ پر لور د ليکنو د ليکلو لپاره پرانيستي دي، Ù„Ú©Ù‡ همدا ويکي، Ú‰Ûر ÚÙ„ د سپمرګرو لخوا Ú†Û Ø§ØªÙˆÙ…Ø§ØªÙŠÚ© اوزارونه د خپلو د تړنو او ÙˆÛبپاڼو د خبرتياو په خپرولو Ú©Û Ú©Ø§Ø±ÙˆÙŠØŒ په ناوړه توګه کارÛÚ–ÙŠ. تر هغه وخت Ù¾ÙˆØ±Û Ú†Û Ù‡Ù…Ø¯Ø§ سپمونه او هماغه ØªÚ“Ù†Û Ø±Ø§Ù…ÙˆÙ†Ø¯Ù„ Ú©ÛÚ–ÙŠ او Ù„ÙŠØ±Û Ú©ÛÚ–ÙŠØŒ نو تر هغه وخته Ù¾ÙˆØ±Û Ù‡Ù…Ø¯Ø§ سپمونه Ú‰Ûر سرخوږی جوړوي.
+ 'captchahelp-text' => "هغه ÙˆÛبÚايونه Ú†Û Ø¯ ټولو ÙˆÚ¯Ú“Ùˆ پر لور د ليکنو د ليکلو لپاره پرانيستي دي، Ù„Ú©Ù‡ همدا ويکي، Ú‰Ûر ÚÙ„ د سپمرگرو لخوا Ú†Û Ø§ØªÙˆÙ…Ø§ØªÙŠÚ© اوزارونه د خپلو د تړنو او ÙˆÛبپاڼو د خبرتياو په خپرولو Ú©Û Ú©Ø§Ø±ÙˆÙŠØŒ په ناوړه توگه کارÛÚ–ÙŠ. تر هغه وخت Ù¾ÙˆØ±Û Ú†Û Ù‡Ù…Ø¯Ø§ سپمونه او هماغه ØªÚ“Ù†Û Ø±Ø§Ù…ÙˆÙ†Ø¯Ù„ Ú©ÛÚ–ÙŠ او Ù„ÙŠØ±Û Ú©ÛÚ–ÙŠØŒ نو تر هغه وخته Ù¾ÙˆØ±Û Ù‡Ù…Ø¯Ø§ سپمونه Ú‰Ûر سرخوږی جوړوي.
-په Úانګړي توګه په يوه مخ Ú©Û Ø¯ يوه ÙˆÛبÚÙŠ د ØªÚ“Ù†Û Ø¯ ورګډولو په وخت Ú©Û Ø¨Ù‡ ويکي يو ډول Ú«Ú‰ÙˆÚ‰ رنګين متن ښکاره Ú©Ú“ÙŠ او له کارن نه به د هماغه متن د ټاپلو غوښتنه Ø´ÙˆÛ ÙˆÙŠ.
+په Úانگړي توگه په يوه مخ Ú©Û Ø¯ يوه ÙˆÛبÚÙŠ د ØªÚ“Ù†Û Ø¯ ورگډولو په وخت Ú©Û Ø¨Ù‡ ويکي يو ډول Ú¯Ú‰ÙˆÚ‰ رنگين متن ښکاره Ú©Ú“ÙŠ او له کارن نه به د هماغه متن د ټاپلو غوښتنه Ø´ÙˆÛ ÙˆÙŠ.
-څرنګه Ú†Û Ø¬ÙˆØªÙ‡ ده Ú†Û Ø§ØµÙ„ÙŠ ÙˆÚ«Ú“ÙŠ کولی شي Ú†Û Ù¾Ù‡ Ø¯Û Ú©Ø§Ø± Ú©Û Ø¨Ø±ÙŠØ§Ù„ÙŠ شي، خو Ø¯Û ØªÙ‡ ناورته سپامګر ماشينونه او روبوټونه دا ډول کار په خپلکاره توګه نه شي ترسره کولی او Ù¾Ø¯Û ØªÙˆÚ«Ù‡ د سپامګرو او روبوټونو د غورÚÙ†Ú« مخ نيول Ú©ÛÚ–ÙŠ.
+څرنگه Ú†Û Ø¬ÙˆØªÙ‡ ده Ú†Û Ø§ØµÙ„ÙŠ ÙˆÚ¯Ú“ÙŠ کولی شي Ú†Û Ù¾Ù‡ Ø¯Û Ú©Ø§Ø± Ú©Û Ø¨Ø±ÙŠØ§Ù„ÙŠ شي، خو Ø¯Û ØªÙ‡ ناورته سپامگر ماشينونه او روبوټونه دا ډول کار په خپلکاره توگه نه شي ترسره کولی او Ù¾Ø¯Û ØªÙˆÚ¯Ù‡ د سپامگرو او روبوټونو د غورÚÙ†Ú¯ مخ نيول Ú©ÛÚ–ÙŠ.
-بدبختانه Ú†Û Ø¯Ø§ کار د کارنانو لپاره ستونزه جوړولای شي او هغه Ú…ÙˆÚ© Ú†Û Ø¯ سترګو نظر ÙŠÛ Ú©Ù…Ø²ÙˆØ±ÛŒ دی او يا هم د متن پر بنسټ او يا هم د غږ پر بنسټ جوړ شوي کتنملونه کاروي نه شي کولی په Ø¢Ø³Ø§Ù†Û Ø³Ø±Ù‡ Ø®Ù¾Ù„Û Ø³Ù…ÙˆÙ†Û Ø§Ùˆ Ø®Ù¾Ø±ÙˆÙ†Û ØªØ±Ø³Ø±Ù‡ Ú©Ú“ÙŠ.
+بدبختانه Ú†Û Ø¯Ø§ کار د کارنانو لپاره ستونزه جوړولای شي او هغه Ú…ÙˆÚ© Ú†Û Ø¯ سترگو نظر ÙŠÛ Ú©Ù…Ø²ÙˆØ±ÛŒ دی او يا هم د متن پر بنسټ او يا هم د غږ پر بنسټ جوړ شوي کتنملونه کاروي نه شي کولی په Ø¢Ø³Ø§Ù†Û Ø³Ø±Ù‡ Ø®Ù¾Ù„Û Ø³Ù…ÙˆÙ†Û Ø§Ùˆ Ø®Ù¾Ø±ÙˆÙ†Û ØªØ±Ø³Ø±Ù‡ Ú©Ú“ÙŠ.
دم مهال موږ د Ø¯Ø§Ø³Û Ù…ØªÙ†ÙˆÙ†Ùˆ غږيز انډول نه لرو.
-Ú©Ù‡ Ú†Ûرته دا کار ØªØ§Ø³Û Ù„Ù‡ سمونو او ليکنو خپرولو Ù¾Ø§ØªÛ Ø±Ø§ÙˆÙ„ÙŠ نو لطÙاً د Ù…Ø±Ø³ØªÛ Ù„Ù¾Ø§Ø±Ù‡ د [[{{MediaWiki:Grouppage-sysop}}|پازوالانو]] سره اړيکه ټينګه Ú©Ú“Û.
+Ú©Ù‡ Ú†Ûرته دا کار ØªØ§Ø³Û Ù„Ù‡ سمونو او ليکنو خپرولو Ù¾Ø§ØªÛ Ø±Ø§ÙˆÙ„ÙŠ نو لطÙاً د Ù…Ø±Ø³ØªÛ Ù„Ù¾Ø§Ø±Ù‡ د [[Special:ListAdmins|پازوالانو]] سره اړيکه ټينگه Ú©Ú“Û.
-په خپل کتنمل Ú©Û Ø¯ 'شاکÛدلو' ØªÚ¼Û Ú©ÛÚšÚ©Ø§Ú–Û Ú†Û Ø¨Ûرته پخواني مخ ته وګرÚÛ.",
+په خپل کتنمل Ú©Û Ø¯ 'شاکÛدلو' ØªÚ¼Û Ú©ÛÚšÚ©Ø§Ú–Û Ú†Û Ø¨Ûرته پخواني مخ ته وگرÚÛ.",
);
/** Portuguese (português)
* @author Hamilton Abreu
* @author Helder.wiki
+ * @author Luckas
* @author Malafaya
* @author 555
*/
$messages['pt'] = array(
'captcha-edit' => 'Para editar esta página, por favor, resolva a soma simples apresentada abaixo e introduza a resposta na caixa ([[Special:Captcha/help|mais informações]]):',
- 'captcha-desc' => 'Fornece técnicas CAPTCHA para protecção contra spam e tentativas de adivinhar a palavra-chave',
+ 'captcha-desc' => 'Fornece técnicas CAPTCHA para proteção contra spam e tentativas de adivinhar a palavra-chave',
'captcha-label' => 'CAPTCHA',
'captcha-addurl' => "A sua edição introduziu links externos novos.
Como prevenção contra sistemas automatizados de inserção de ''spam'', resolva a soma simples apresentada abaixo e introduza a resposta na caixa ([[Special:Captcha/help|mais informações]]):", # Fuzzy
@@ -3083,7 +3154,7 @@ Como prevenção contra sistemas automatizados de inserção de ''spam'', resolv
'captcha-createaccount-fail' => 'Código incorreto ou não preenchido.',
'captcha-create' => 'Para criar a página, resolva a soma simples apresentada abaixo e introduza a resposta na caixa ([[Special:Captcha/help|mais informações]]):',
'captcha-sendemail' => "Como prevenção contra sistemas automatizados de inserção de ''spam'', resolva a soma simples apresentada abaixo e introduza a resposta na caixa ([[Special:Captcha/help|mais informações]]):", # Fuzzy
- 'captcha-sendemail-fail' => 'Código de confirmação incorrecto ou não preenchido.',
+ 'captcha-sendemail-fail' => 'Código de confirmação incorreto ou não preenchido.',
'captcha-disabledinapi' => 'Esta operação necessita de captcha, por isso não pode ser realizada através da API.',
'captchahelp-title' => 'Ajuda sobre o CAPTCHA',
'captchahelp-cookies-needed' => "É necessário possibilitar o uso de ''cookies'' no seu browser para que o ''captcha'' funcione.",
@@ -3095,7 +3166,7 @@ Porque a interpretação do texto apresentado nas imagens é uma tarefa difícil
Infelizmente, esta funcionalidade pode revelar-se um inconveniente para utilizadores com limitações visuais ou que utilizam browsers baseados em texto ou voz.
Neste momento, não temos disponível uma alternativa em áudio.
-Por favor, contacte os [[{{MediaWiki:Grouppage-sysop}}|administradores]] para assistência, caso a funcionalidade esteja a impedi-lo de fazer edições legítimas.
+Por favor, contacte os [[Special:ListAdmins|administradores]] para assistência, caso a funcionalidade esteja a impedi-lo de fazer edições legítimas.
Clique o botão 'voltar' do seu browser para voltar à página de edição.",
'captcha-addurl-whitelist' => ' #<!-- deixe esta linha exactamente como está --> <pre>
@@ -3136,7 +3207,7 @@ Uma vez que essa é uma tarefa um tanto difícil de ser automatizada, ela possib
Infelizmente, isso pode ser um inconveniente para usuários com limitações visuais ou que naveguem através de mecanismos baseados em texto ou baseados em voz.
No momento, não está disponível uma alternativa em áudio.
-Por favor, contate os [[{{MediaWiki:Grouppage-sysop}}|administradores do sítio]] em casos que seja necessária a assistência de alguém para que você possa fazer as suas inserções legítimas.
+Por favor, contate os [[Special:ListAdmins|administradores do sítio]] em casos que seja necessária a assistência de alguém para que você possa fazer as suas inserções legítimas.
Pressione o botão 'voltar' de seu navegador para retornar à página de edição.",
'captcha-addurl-whitelist' => ' #<!-- deixe este linha exatamente como está --> <pre>
@@ -3151,6 +3222,7 @@ Pressione o botão 'voltar' de seu navegador para retornar à página de ediçã
* @author AlimanRuna
*/
$messages['qu'] = array(
+ 'captcha-badlogin' => 'Wikita kikinmanta millay ruraq yaykuna rima chamqaymanta amachanapaqqa, kay qatiq yapayta ruraspa yapasqata kahachapi yaykuchiy ([[Special:Captcha/help|astawan yachay]]):',
'captchahelp-title' => 'Captcha nisqamanta yanapay',
);
@@ -3183,7 +3255,7 @@ Uneori, mai ales la adăugarea de noi legături web într-o pagină, situl wiki
Întrucât rezolvarea acestei cerințe este dificil de automatizat, ea permite majorității persoanelor reale să-și trimită contribuțiile și va opri majoritatea atacatorilor.
Din nefericire, această metodă îi poate deranja pe utilizatorii cu probleme vizuale sau care folosesc navigatoare bazate pe text sau sunet. În acest moment nu avem o alternativă audio disponibilă.
-În cazul în care această practică vă împiedică în mod neașteptat să faceți contribuții legitime, vă rugăm să contactați [[{{MediaWiki:Grouppage-sysop}}|administratorii sitului]].
+În cazul în care această practică vă împiedică în mod neașteptat să faceți contribuții legitime, vă rugăm să contactați [[Special:ListAdmins|administratorii sitului]].
Apăsați butonul „Înapoi†al navigatorului pentru a vă reîntoarce la pagina de editare.',
'captcha-addurl-whitelist' => ' #<!-- lăsați această linie așa cum este --> <pre>
@@ -3220,7 +3292,7 @@ Certe vote, specialmende quanne aggiunge collegaminde nuève sus a a'na pàgene,
Quiste jè 'nu combite difficile da automatizzà, ce sò le umane a scettà merde invece de le attacche robbot riuscime a bloccà cchiù facilmende.
Sfortunatamende stu fatte pò da inconveniende a le utinde cu visiune limitate o ca ausane le browser de sole teste o ca parlane. Jndr'à stu mumende non ge tenime 'n'alternative audie.
-Pe piacere condatte le [[{{MediaWiki:Grouppage-sysop}}|amministrature d'u site]] pe assistenze ce quiste jè condre a le leggittime aziune tune.
+Pe piacere condatte le [[Special:ListAdmins|amministrature d'u site]] pe assistenze ce quiste jè condre a le leggittime aziune tune.
Cazze 'u buttonne \"rrete\" (back) sus a 'u browser tune pe turnà a 'u cangiamende d'a pàgene.",
'captcha-addurl-whitelist' => " #<!-- leave this line exactly as it is --> <pre>
@@ -3263,7 +3335,7 @@ $messages['ru'] = array(
К Ñожалению, Ð¿Ð¾Ð´Ð¾Ð±Ð½Ð°Ñ Ð·Ð°Ñ‰Ð¸Ñ‚Ð° может причинить неудобÑтва людÑм Ñ Ð¾Ð³Ñ€Ð°Ð½Ð¸Ñ‡ÐµÐ½Ð¸Ñми по зрению или тем, кто иÑпользует текÑтовые или читающие браузеры.
Ð’ наÑтоÑщее Ð²Ñ€ÐµÐ¼Ñ Ñƒ Ð½Ð°Ñ Ð½ÐµÑ‚ звуковой альтернативы данной проверке.
-ПожалуйÑта, обратитеÑÑŒ за помощью к [[{{MediaWiki:Grouppage-sysop}}|админиÑтраторам]], еÑли Ð¿Ð¾Ð´Ð¾Ð±Ð½Ð°Ñ Ð¿Ñ€Ð¾Ð²ÐµÑ€ÐºÐ° мешает вам доброÑовеÑтно работать Ñ Ñайтом.
+ПожалуйÑта, обратитеÑÑŒ за помощью к [[Special:ListAdmins|админиÑтраторам]], еÑли Ð¿Ð¾Ð´Ð¾Ð±Ð½Ð°Ñ Ð¿Ñ€Ð¾Ð²ÐµÑ€ÐºÐ° мешает вам доброÑовеÑтно работать Ñ Ñайтом.
Ðажмите кнопку «Ðазад» в вашем браузере, чтобы вернутьÑÑ Ðº редактированию.',
'captcha-addurl-whitelist' => ' #<!-- leave this line exactly as it is --> <pre>
@@ -3295,7 +3367,7 @@ $messages['rue'] = array(
Даколи, окремо Ð¿Ð¾Ñ‡Ð°Ñ Ð¿Ñ€Ð¸Ð´Ð°Ð²Ð°Ð½Ñ Ð½Ð¾Ð²Ñ‹Ñ… вебовых одказів, вам може вікі указати образок фаребного ці поÑкручаного текÑту Ñ– пожадати Ð²Ð°Ñ Ð¾ опиÑÐ°Ð½Ñ Ð·Ð¾Ð±Ñ€Ð°Ð¶ÐµÐ½Ñ‹Ñ… знаків. Кідьже таку задачу не годен легко автоматізовати, реалны люде можуть дале приÑпівати, але векшыну Ñпамерів Ñ– іншых роботічных атакерів тото заÑтавить.
-Ðа жаль тото може предÑтавлÑти неприємный проблем про хоÑнователїв поÑтиженых зраково ці голоÑовы чітачкы. Ð’ ÑучаÑній добі не маєме алтернатівни звукову верзію. ПроÑиме, контактуйте [[{{MediaWiki:Grouppage-sysop}}|адмініÑтратора Ñервера]], кідь вам то боронить в хоÑновным вкладї Ñ– треба вам поміч.
+Ðа жаль тото може предÑтавлÑти неприємный проблем про хоÑнователїв поÑтиженых зраково ці голоÑовы чітачкы. Ð’ ÑучаÑній добі не маєме алтернатівни звукову верзію. ПроÑиме, контактуйте [[Special:ListAdmins|адмініÑтратора Ñервера]], кідь вам то боронить в хоÑновным вкладї Ñ– треба вам поміч.
Про Ð½Ð°Ð²ÐµÑ€Ð½ÑƒÑ‚Ñ Ð½Ð° попередню Ñторінку ÑтиÑнийте у Ñвоїм переглÑдачі клапку „назад“.',
'captcha-addurl-whitelist' => ' #<!-- зохабте тот Ñ€Ñдок точно так Ñк Ñ” --> <pre>
@@ -3334,7 +3406,7 @@ $messages['sa'] = array(
इदं कारà¥à¤¯à¤‚ सà¥à¤µà¤šà¤¾à¤²à¤¿à¤¤à¤°à¥‚पेण करà¥à¤¤à¥à¤‚ न शकà¥à¤¯à¤¤à¥‡, मानवैः à¤à¤µ करणीयमॠइतà¥à¤¯à¤¤à¤ƒ अनिषà¥à¤Ÿà¤¸à¤¨à¥à¤¦à¥‡à¤¶à¤ªà¥à¤°à¥‡à¤·à¤•à¤¾à¤ƒ यनà¥à¤¤à¥à¤°à¤šà¤¾à¤²à¤¿à¤¤à¤•à¤¾à¤°à¥à¤¯à¤¾à¤£à¤¿ अवरà¥à¤¦à¥à¤§à¤¾à¤¨à¤¿ भवनà¥à¤¤à¤¿ ।
दà¥à¤°à¤¦à¥ƒà¤·à¥à¤Ÿà¤µà¤¶à¤¾à¤¤à¥ à¤à¤¤à¥‡à¤¨ परिमितसंसà¥à¤•à¤°à¤£à¤¯à¥à¤•à¥à¤¤à¤¾à¤¨à¤¾à¤‚ योजकानां कà¥à¤²à¥‡à¤¶à¤ƒ भवेतॠअथवा पाठाधारितानां भाषणाधारितानां जालगवेषकपà¥à¤°à¤¯à¥‹à¤•à¥à¤¤à¥„णामपि कषà¥à¤Ÿà¤¾à¤¯ भवेतॠ।
समà¥à¤ªà¥à¤°à¤¤à¤¿ शà¥à¤°à¤µà¥à¤¯à¤µà¤¿à¤•à¤²à¥à¤ªà¤ƒ असà¥à¤®à¤¤à¥à¤¸à¤µà¤¿à¤§à¥‡ न उपलभà¥à¤¯à¤¤à¥‡ ।
-योगà¥à¤¯à¤²à¥‡à¤–ानामॠउतà¥à¤ªà¥‚रणे अनिरीकà¥à¤·à¤¿à¤¤à¤•à¥à¤²à¥‡à¤¶à¤¾à¤ƒ यदि भवनà¥à¤¤à¤¿ तरà¥à¤¹à¤¿ साहायà¥à¤¯à¤¾à¤°à¥à¤¥à¤®à¥ à¤à¤¤à¥‡à¤·à¤¾à¤‚ साहायà¥à¤¯à¤‚ पà¥à¤°à¤¾à¤ªà¥à¤¨à¥à¤µà¤¨à¥à¤¤à¥ [[{{MediaWiki:Grouppage-sysop}}|कà¥à¤·à¥‡à¤¤à¥à¤°à¤¨à¤¿à¤°à¥à¤µà¤¾à¤¹à¤•à¤¾à¤ƒ]] ।
+योगà¥à¤¯à¤²à¥‡à¤–ानामॠउतà¥à¤ªà¥‚रणे अनिरीकà¥à¤·à¤¿à¤¤à¤•à¥à¤²à¥‡à¤¶à¤¾à¤ƒ यदि भवनà¥à¤¤à¤¿ तरà¥à¤¹à¤¿ साहायà¥à¤¯à¤¾à¤°à¥à¤¥à¤®à¥ à¤à¤¤à¥‡à¤·à¤¾à¤‚ साहायà¥à¤¯à¤‚ पà¥à¤°à¤¾à¤ªà¥à¤¨à¥à¤µà¤¨à¥à¤¤à¥ [[Special:ListAdmins|कà¥à¤·à¥‡à¤¤à¥à¤°à¤¨à¤¿à¤°à¥à¤µà¤¾à¤¹à¤•à¤¾à¤ƒ]] ।
पृषà¥à¤ à¤¸à¤®à¥à¤ªà¤¾à¤¦à¤•à¤‚ पà¥à¤°à¤¤à¤¿ गमनाय भवतः जालगवेषके 'पूरà¥à¤µà¤¤à¤¨à¤®à¥' इतà¥à¤¯à¥‡à¤¤à¤‚ पिञà¥à¤œà¤‚ नà¥à¤¦à¤¤à¥ ।",
'captcha-addurl-whitelist' => ' #<!-- leave this line exactly as it is --> <pre>
# असà¥à¤¯ पà¥à¤°à¤¾à¤°à¥‚पमॠà¤à¤µà¤®à¤¸à¥à¤¤à¤¿:
@@ -3371,9 +3443,9 @@ $messages['sah'] = array(
Ол гынан баран маннык көмүÑкÑл Ñорох дьоҥҥо (көрбөт ÑбÑÑ‚ÑÑ€ ааҕар браузердары туһанар дьоҥҥо) моһоллору Ò¯Ó©ÑкÑтиÑн Ñөп.
Билигин бу моһолу Ñуох оҥорор кыах Ñуох.
-Оннук мÑÒ»Ñй таҕыÑтаҕына бука диÑн баалама, биир Ñмит [[{{MediaWiki:Grouppage-sysop}}|дьаһабылга (админиÑтраатарга)]] ÑÑ‚ÑÑÑ€, көмөлөһүө.
+Оннук мÑÒ»Ñй таҕыÑтаҕына бука диÑн баалама, биир Ñмит [[Special:ListAdmins|дьаһабылга (админиÑтраатарга)]] ÑÑ‚ÑÑÑ€, көмөлөһүө.
-ÐšÓ©Ð½Ð½Ó©Ñ€Ò¯Ò¯Ð³Ñ Ñ‚Ó©Ñ‚Ñ‚Ó©Ñ€Ò¯ тиийÑÑ€Ð³Ñ Ð±Ñ€Ð°ÑƒÐ·ÐµÑ€Ñ‹Ò¥ «Ðазад» тимÑҕин баттаа.',
+ÐšÓ©Ð½Ð½Ó©Ñ€Ò¯Ò¯Ð³Ñ Ñ‚Ó©Ñ‚Ñ‚Ó©Ñ€Ò¯ тиийÑÑ€Ð³Ñ Ð±Ñ€Ð°ÑƒÐ·ÐµÑ€Ñ‹Ò¥ «Ðазад» тимÑҕин баттаа.', # Fuzzy
'captcha-addurl-whitelist' => ' #<!-- leave this line exactly as it is --> <pre>
# СинтакÑиһын быһаарыыта:
# * "#" бÑлиÑÑ‚Ñ‚Ñн Ñтрока бүтүөр дылы барыта Ñ…Ð¾Ñ Ð±Ñ‹Ò»Ð°Ð°Ñ€Ñ‹Ñ‹ курдук ааҕыллар
@@ -3402,7 +3474,7 @@ $messages['scn'] = array(
Nni tanti casi, p'asèmpiu quannu si voli jùnciri novi lijami Web nti na pàggina, lu software wiki pò ammustrari na mmàggini cu nu testu nicu acculuratu e/o difurmatu addumannannu di scrivìrilu nni na finistredda. Siccomu si tratta di na cosa difficili di fari pi nu computer, stu miccanìsimu pirmetti a (quasi tutti) l'utenti riali di cumplitari lu nzirimentu disiatu, mpidennu la trasuta a li chiossai di li spammer e di l'àutri attacchi autumatizzati.
-Pi sfurtuna, stu strataggemma pò mèttiri 'n difficultati a l'utenti ca hannu prubremi di vista o a chiddi ca ùsanu browser testuali o basati supr'a la sìntesi vucali. Purtroppu aoggi non ci sunnu àutri miccanìsimi abbasati supr'a missaggi sunori; si sti pruciduri mpidìsciunu lu nzirimentu di nfurmazzioni ca si pènzanu ca sù liggìttimi, siti prigati di cuntattari [[{{MediaWiki:Grouppage-sysop}}|l'amministraturi dû situ]] e addumannàrini l'assistenza.
+Pi sfurtuna, stu strataggemma pò mèttiri 'n difficultati a l'utenti ca hannu prubremi di vista o a chiddi ca ùsanu browser testuali o basati supr'a la sìntesi vucali. Purtroppu aoggi non ci sunnu àutri miccanìsimi abbasati supr'a missaggi sunori; si sti pruciduri mpidìsciunu lu nzirimentu di nfurmazzioni ca si pènzanu ca sù liggìttimi, siti prigati di cuntattari [[Special:ListAdmins|l'amministraturi dû situ]] e addumannàrini l'assistenza.
Fari clic supra ô buttuni 'back' dû browser pi turnari a la pàggina di mudìfica.",
'captcha-addurl-whitelist' => " #<!-- non mudificari 'n nuddu modu sta riga --> <pre>
@@ -3449,7 +3521,7 @@ $messages['si'] = array(
නමුත් අවà·à·ƒà¶±à·à·€à¶šà¶§ මෙය නිස෠දෘෂ්ඨි දà·à·‚ සහිත හ෠පෙළ-පà·à¶¯à¶š හ෠කථන-පà·à¶¯à¶š වෙබ් පිරික්සක භà·à·€à·’ත෠කරන පරිà·à·“ලකයන් අපහසුතà·à·€à¶§ පත් වනු ඇත.
මේ වන විට අප සතුව à·à·Šâ€à¶»à·€à·Šâ€à¶º විකල්පයක් නොමà·à¶­.
-මෙය නිස෠ඔබට ලිපි ලිවීම දà·à¶©à·’ ලෙස කරදරකà·à¶»à·“ වී ඇත්නම් කරුණà·à¶šà¶» සහය සඳහ෠[[{{MediaWiki:Grouppage-sysop}}|අඩවි පරිපà·à¶½à¶šà¶ºà¶±à·Š]] සම්බන්ධ කරගන්න.
+මෙය නිස෠ඔබට ලිපි ලිවීම දà·à¶©à·’ ලෙස කරදරකà·à¶»à·“ වී ඇත්නම් කරුණà·à¶šà¶» සහය සඳහ෠[[Special:ListAdmins|අඩවි පරිපà·à¶½à¶šà¶ºà¶±à·Š]] සම්බන්ධ කරගන්න.
පිටු සකසනයට ආපසු යà·à¶¸ සඳහ෠ඔබේ වෙබ් පිරික්සකයේ "පසුපසට" බොත්තම තද කරන්න.',
'captcha-addurl-whitelist' => '#<!-- මෙම පේළිය මෙලෙසින්ම තිබීමට ඉඩ හරින්න --> <pre>
@@ -3482,7 +3554,7 @@ $messages['sk'] = array(
Niekedy, obzvlášť keÄ pridávate webové odkazy k Älánkom, wiki vám môže zobraziÅ¥ obrázok so zafarbeným alebo pokriveným textom a požiadaÅ¥ vás o prepísanie zobrazených slov. KeÄže takúto úlohu je Å¥ažké zautomatizovaÅ¥ a umožní skutoÄným ľuÄom poslaÅ¥ svoje príspevky, zastaví to väÄÅ¡inu spammerov a iných robotických útoÄníkov.
-NaneÅ¡Å¥astie, môže to byÅ¥ prekážkou pre používateľov so zrakovým postihnutím alebo tých, ktorí používajú textové alebo hovoriace prehliadaÄe. Momentálne nemáme dostupnú audio zvukovú alternatívu. Kontaktujte prosím [[{{MediaWiki:Grouppage-sysop}}|správcov stránok]] ak vám to neoÄakávane komplikuje umiestňovanie oprávnených príspevkov.
+NaneÅ¡Å¥astie, môže to byÅ¥ prekážkou pre používateľov so zrakovým postihnutím alebo tých, ktorí používajú textové alebo hovoriace prehliadaÄe. Momentálne nemáme dostupnú audio zvukovú alternatívu. Kontaktujte prosím [[Special:ListAdmins|správcov stránok]] ak vám to neoÄakávane komplikuje umiestňovanie oprávnených príspevkov.
StlaÄením tlaÄidla „späť“ vo vaÅ¡om prehliadaÄi sa vrátite do editora stránky.',
'captcha-addurl-whitelist' => ' #<!-- leave this line exactly as it is --> <pre>
@@ -3520,7 +3592,7 @@ Ker je to opravilo težko avtomatizirati, bo s tem veÄini ljudi objavljanje dov
Žal lahko to povzroÄi nevÅ¡eÄnosti uporabnikom s slabim vidom in tistim, ki uporabljajo besedilne ali govorne brskalnike.
Glasovna možnost trenutno še ni na razpolago.
-ÄŒe vam to nepriÄakovano prepreÄuje legitimno objavo, prosimo, da se obrnete na [[{{MediaWiki:Grouppage-sysop}}|administratorje spletiÅ¡Äa]].
+ÄŒe vam to nepriÄakovano prepreÄuje legitimno objavo, prosimo, da se obrnete na [[Special:ListAdmins|administratorje spletiÅ¡Äa]].
Za vrnitev v urejevalnik izberite gumb »nazaj« v vašem brskalniku.',
'captcha-addurl-whitelist' => ' #<!-- pustite to vrstico takšno, kot je --> <pre>
@@ -3555,9 +3627,9 @@ $messages['sq'] = array(
Ndonjëherë, sidomos kur po hapni një llogari të re apo kur po shtoni lidhje të reja nëpërmjet redaktimit tuaj, sistemi mund t\'ju shfaqi një figurë që përmban fjalë me gërma ose numra të shtrembruara ose me ngjyra të ndryshme të cilat ju duhet të shtypni para se të mund të kryeni veprimin në fjalë. Kjo bëhet pasi është shumë e vështirë për një robot ose mjet automatik të kryejë të njëjtën punë. Kështu mund të dallohet nëse jeni me të vërtetë një njeri apo një robot. Ky lloj sistemi s\'mund të ndalojë tërë abuzimet por ndalon një pjesë të mirë të tyre, sidomos ato që janë automatike dhe të shumta në numër.
-Fatkeqësisht ky lloj sistemi mund të bezdisi përdoruesit me pamje të kufizuar ose ata që përdorin mjete teksti ose shfletues leximi me zë. Tani për tani nuk kemi mundësi për të ofruar një sistem me zë në vend të figurave. Ju lutem lidhuni me [[{{MediaWiki:Grouppage-sysop}}|administruesit]] nëse ky sistem po ju ndalon të jepni kontribute të vlefshme.
+Fatkeqësisht ky lloj sistemi mund të bezdisi përdoruesit me pamje të kufizuar ose ata që përdorin mjete teksti ose shfletues leximi me zë. Tani për tani nuk kemi mundësi për të ofruar një sistem me zë në vend të figurave. Ju lutem lidhuni me [[Special:ListAdmins|administruesit]] nëse ky sistem po ju ndalon të jepni kontribute të vlefshme.
-Shtypni butonin "prapa" ("back") të shfletuesit tuaj për tu kthyer tek faqja e mëparshme.',
+Shtypni butonin "prapa" ("back") të shfletuesit tuaj për tu kthyer tek faqja e mëparshme.', # Fuzzy
'captcha-addurl-whitelist' => ' #<!-- lëreni këtë rresht siç është --> <pre>
# Sintaksa është si më poshtë:
# * Çdo gjë nga simboli "#" deri në fund të rreshtit është koment
@@ -3623,7 +3695,7 @@ Klik dan fonnäien ap „Siede spiekerje“ [[Special:Captcha/help|(Froagen of P
In fuul Falle, besunners bie dät Bietouföigjen fon näie Webferbiendengen tou ne Siede, kon dät foarkuume, dät dit Wiki ne Bielde mäd n faawigen un fertroalden Text anwiest un deertou apfoardert, do anwiesde Woude ientoutippen. Deer sun Apgoawe man stuur automatisk ouhonneld wäide kon, wäide deertruch do maaste Spammere, do der mäd automatiske Reewen oarbaidje, stopped, wierjuun moanskelke Benutsere hieren Biedraach ouseende konnen.
Spietelk genouch kon dät tou Meelasje foar Persoone fiere, do der minner goud sjo konnen of text- of sproakbasierde Browsere ferweende. Apstuuns hääbe wie neen Audio-Alternative ferföigboar.
-Kontaktier do [[{{MediaWiki:Grouppage-sysop}}|Site-Administratore]] foar Hälpe, wan dit jou Moite rakt bie dät Hoochleeden fon Biedraage.
+Kontaktier do [[Special:ListAdmins|Site-Administratore]] foar Hälpe, wan dit jou Moite rakt bie dät Hoochleeden fon Biedraage.
Klik ap dän 'Tourääch'-Knoop in jou Browser uum ätter dän Sieden-Editor touräächtougungen.",
'captcha-addurl-whitelist' => ' #<!-- leave this line exactly as it is --> <pre>
@@ -3668,11 +3740,12 @@ Hit the 'back' button in your browser to return to the page editor.", # Fuzzy
* @author MagnusA
* @author Martinwiss
* @author Per
+ * @author Rotsee
*/
$messages['sv'] = array(
'captcha-edit' => 'För att redigera den här sidan måste du först skriva svaret på följande
räkneuppgift i rutan ([[Special:Captcha/help|mer information]]):',
- 'captcha-desc' => 'Ger CAPTCHA tekniker för att skydda mot skräppost och lösenordsgissning',
+ 'captcha-desc' => 'â€Captchaâ€-metoder för att skydda mot skräppost och lösenordsgissning',
'captcha-label' => 'CAPTCHA',
'captcha-addurl' => 'Din ändring innebär nya externa länkar i texten. För att skydda wikin mot automatisk spam måste du skriva svaret på följande räkneuppgift i rutan ([[Special:Captcha/help|mer information]]):',
'captcha-badlogin' => 'För att skydda mot wikin mot försök att knäcka lösenord på automatisk väg, måste du skriva svaret på följande räkneuppgift i rutan ([[Special:Captcha/help|mer information]]):',
@@ -3680,7 +3753,7 @@ räkneuppgift i rutan ([[Special:Captcha/help|mer information]]):',
'captcha-createaccount-fail' => 'Bekräftelsekoden är felaktig eller saknas.',
'captcha-create' => 'För att skapa den här sidan måste du skriva svaret på följande räkneuppgift
i rutan ([[Special:Captcha/help|mer information]]):',
- 'captcha-sendemail' => 'För att skydda wikin mot automatiska skräpinlägg, ber vi dig att lösa den enkla matematiska ekvationen här nedanför och skriva in svaret i rutan ([[Special:Captcha/help|mer information]]):',
+ 'captcha-sendemail' => 'För att skydda wikin mot spam, ber vi dig att lösa den här enkla räkneuppgiften, och skriva in svaret i rutan ([[Special:Captcha/help|mer information]]):',
'captcha-sendemail-fail' => 'Felaktig eller saknad bekräftelsekod.',
'captcha-disabledinapi' => 'Denna åtgärd kräver en captcha, så den kan inte utföras genom APIet.',
'captchahelp-title' => 'Captchahjälp',
@@ -3693,7 +3766,7 @@ Eftersom den uppgiften är svår att automatisera, låter den de flesta riktiga
Tyvärr kan det här orsaka problem för användare med nedsatt syn eller som använder text- eller talbaserade webbläsare.
För tillfället finns inga ljudbaserade alternativ tillgängliga.
-Kontakta [[{{MediaWiki:Grouppage-sysop}}|webbplatsens administratörer]] för hjälp om det här hindrar dig från att göra legitima ändringar.
+Kontakta [[Special:ListAdmins|webbplatsens administratörer]] för hjälp om det här hindrar dig från att göra legitima ändringar.
Tryck på bakåtknappen i din webbläsare för att gå tillbaks till sidredigeringsläget.',
'captcha-addurl-whitelist' => ' #<!-- leave this line exactly as it is --> <pre>
@@ -3738,7 +3811,7 @@ $messages['ta'] = array(
பாரà¯à®µà¯ˆà®•à¯ கà¯à®±à¯ˆà®ªà®¾à®Ÿà¯ உடையோரà¯, à®®à¯à®¤à®¿à®¯à¯‹à®°à¯ மறà¯à®±à¯à®®à¯ வெறà¯à®®à¯ வாரà¯à®¤à¯à®¤à¯ˆà®•à®³à¯ அலà¯à®²à®¤à¯ ஒலி அடிபà¯à®ªà®Ÿà¯ˆà®¯à®¿à®²à®¾à®© உலாவிகளைப௠பயனà¯à®ªà®Ÿà¯à®¤à¯à®¤à¯à®µà¯‹à®°à¯à®•à¯à®•à¯ இத௠தà¯à®°à®¤à®¿à®·à¯à®Ÿà®µà®šà®®à®¾à®•à®¤à¯ தொலà¯à®²à¯ˆà®¯à®³à®¿à®•à¯à®•à®•à¯ கூடà¯à®®à¯.
-இசà¯à®šà®®à®¯à®¤à¯à®¤à®¿à®²à¯ எழà¯à®¤à¯à®¤à¯à®•à®³à¯à®•à¯à®•à®¾à®© ஒலி மாறà¯à®±à¯ எஙà¯à®•à®³à®¿à®Ÿà®®à¯ இலà¯à®²à¯ˆ. உஙà¯à®•à®³à¯à®•à¯à®•à¯ à®à®¤à¯‡à®©à¯à®®à¯ உதவி தேவைபà¯à®ªà®Ÿà¯à®Ÿà®¾à®²à¯ [[{{MediaWiki:Grouppage-sysop}}|site administrators]] à®à®¤à¯ தொடரà¯à®ªà¯ கொளà¯à®³à®µà¯à®®à¯.
+இசà¯à®šà®®à®¯à®¤à¯à®¤à®¿à®²à¯ எழà¯à®¤à¯à®¤à¯à®•à®³à¯à®•à¯à®•à®¾à®© ஒலி மாறà¯à®±à¯ எஙà¯à®•à®³à®¿à®Ÿà®®à¯ இலà¯à®²à¯ˆ. உஙà¯à®•à®³à¯à®•à¯à®•à¯ à®à®¤à¯‡à®©à¯à®®à¯ உதவி தேவைபà¯à®ªà®Ÿà¯à®Ÿà®¾à®²à¯ [[Special:ListAdmins|site administrators]] à®à®¤à¯ தொடரà¯à®ªà¯ கொளà¯à®³à®µà¯à®®à¯.
தொகà¯à®¤à¯à®¤à®²à¯ பகà¯à®•à®¤à¯à®¤à®¿à®±à¯à®•à¯à®šà¯ செலà¯à®² உஙà¯à®•à®³à¯ உலாவியில௠“பினà¯à®šà¯†à®²à¯â€ பொதà¯à®¤à®¾à®©à¯ˆ à®…à®´à¯à®¤à¯à®¤à®µà¯à®®à¯.',
);
@@ -3764,9 +3837,9 @@ $messages['te'] = array(
కొనà±à°¨à°¿à°¸à°¾à°°à±à°²à±, à°®à±à°–à±à°¯à°‚à°—à°¾ à°à°¦à±ˆà°¨à°¾ పేజీ à°¨à±à°‚à°¡à°¿ బయటకౠలింకà±à°²à± ఇచà±à°šà±‡à°Ÿà°ªà±à°¡à±, వంకరà±à°²à± తిరిగిపోయి ఉనà±à°¨ పదాల బొమà±à°®à°¨à± చూపించి à°† పదానà±à°¨à°¿ టైపౠచెయà±à°¯à°®à°¨à°¿ వికీ మిమà±à°®à°²à±à°¨à°¿ అడగవచà±à°šà±. దీనà±à°¨à°¿ ఆటోమాటికౠటూలà±à°¸à±à°¤à±‹ చెయà±à°¯à°¡à°‚ చాలా à°•à°·à±à°Ÿà°‚ కాబటà±à°Ÿà°¿, à°¸à±à°ªà°¾à°®à± జితà±à°¤à±à°²à± చెలà±à°²à°µà±; మనà±à°·à±à°¯à±à°²à± మాతà±à°°à°‚ మామూలà±à°—ానే చెయà±à°¯à°—లరà±.
à°¦à±à°°à°¦à±ƒà°·à±à°Ÿà°µà°¶à°¾à°¤à±à°¤à±‚, చూపౠసరిగా లేనివారికి, టెకà±à°¸à±à°Ÿà± à°¬à±à°°à±Œà°œà°°à±à°²à± మాతà±à°°à°®à±‡ వాడేవారికి ఇది అసౌకరà±à°¯à°‚ కలిగిసà±à°¤à±à°‚ది. à°ªà±à°°à°¸à±à°¤à±à°¤à°¾à°¨à°¿à°•à°¿ శబà±à°¦à°‚ వినిపించే వెసà±à°²à±à°¬à°¾à°Ÿà± మాకౠలేదà±. మీరౠరచనలౠచెయà±à°¯à°•à±à°‚à°¡à°¾ ఇది à°…à°¡à±à°¡à±à°ªà°¡à±à°¤à±à°‚టే, సహాయం కోసం సైటౠనిరà±à°µà°¾à°¹à°•à±à°£à±à°£à°¿ సంపà±à°°à°¦à°¿à°‚à°šà°‚à°¡à°¿.
-మీరౠచెసే విలà±à°µà°¯à°¿à°¨, సమà±à°®à°¤à°®à°¯à°¿à°¨ à°µà±à°¯à°¾à°¸ మారà±à°ªà±à°²à± à°­à°¦à±à°°à°ªà°°à°šà°Ÿà°®à± à°•à±à°¦à°°à°•à°ªà±Šà°¤à±†, దయచేసి [[{{MediaWiki:Grouppage-sysop}}|సైటౠనిరà±à°µà°¹à°£à°¾à°§à°¿à°•à°¾à°°à°¿]]à°•à°¿ లేఖ రాయండి.
+మీరౠచెసే విలà±à°µà°¯à°¿à°¨, సమà±à°®à°¤à°®à°¯à°¿à°¨ à°µà±à°¯à°¾à°¸ మారà±à°ªà±à°²à± à°­à°¦à±à°°à°ªà°°à°šà°Ÿà°®à± à°•à±à°¦à°°à°•à°ªà±Šà°¤à±†, దయచేసి [[Special:ListAdmins|సైటౠనిరà±à°µà°¹à°£à°¾à°§à°¿à°•à°¾à°°à°¿]]à°•à°¿ లేఖ రాయండి.
-మీ à°¬à±à°°à±Œà°œà°°à±à°²à±‹à°¨à°¿ à°¬à±à°¯à°¾à°•à±(back) మీటనౠనొకà±à°•à°¿ ఇంతకౠమà±à°‚దరి పేజీకి వెళà±à°³à°‚à°¡à°¿.',
+మీ à°¬à±à°°à±Œà°œà°°à±à°²à±‹à°¨à°¿ à°¬à±à°¯à°¾à°•à±(back) మీటనౠనొకà±à°•à°¿ ఇంతకౠమà±à°‚దరి పేజీకి వెళà±à°³à°‚à°¡à°¿.', # Fuzzy
'captcha-addurl-whitelist' => ' #<!-- à°ˆ పంకà±à°¤à°¿à°¨à°¿ ఉనà±à°¨à°¦à±à°¨à±à°¨à°Ÿà±à°²à± ఇలాగే వదిలివేయండి --> <pre>
# ఇకà±à°•à°¡ రాయాలà±à°¸à°¿à°¨ విధానం ఇదీ:
# * "#" అనే à°…à°•à±à°·à°°à°‚ à°¨à±à°‚à°¡à°¿ à°† పంకà±à°¤à°¿ చివరివరకూ à°µà±à°¯à°¾à°–à±à°¯à°¾à°¨à°‚
@@ -3890,7 +3963,7 @@ Dahil sa isa itong gawaing mahirap na gawing kusa, napapahintulutan nito ang hal
Sa kasawiang palad maaaring hindi makaginhawa ito sa mga tagagamit na may malabong paningin o gumagamit ng pangteksto o pangpagsasalitang mga pantingin-tingin.
Sa ngayon wala pa kaming pamalit na isang pangpandinig.
-Makipag-ugnayan lamang sa [[{{MediaWiki:Grouppage-sysop}}|mga tagapangasiwa ng sityo]] para humingi ng tulong kapag hindi inaasahang mapigilan ka sa pagsasagawa ng mga tunay na pagpapaskil.
+Makipag-ugnayan lamang sa [[Special:ListAdmins|mga tagapangasiwa ng sityo]] para humingi ng tulong kapag hindi inaasahang mapigilan ka sa pagsasagawa ng mga tunay na pagpapaskil.
Pindutin ang pindutang 'bumalik' sa iyong pantingin-tingin upang makabalik sa pahinang pampatnugot.",
'captcha-addurl-whitelist' => " #<!-- leave this line exactly as it is --> <pre>
@@ -3925,7 +3998,7 @@ Otomatik spamdan korunmak için lütfen aşağıdaki basit soruyu yanıtlayın v
Bazen, özellikle bir başka internet sitesine bağlantı eklerken, bozulmuş ve renklendirilmiş harflerden oluşan bir resim gösterilebilir ve sizden bu harfleri kutucuğa girmenizi istenir. Bu, otomatizasyonu oldukça zor bir iş olduğu için, gerçek insanlar bu işlemi yerine getirebilirken, spam yapmaya yarayan araçlar bunu yapmakta zorlanacaklardır.
-Ne var ki bu durum, görme sorunları yaşayan kişiler ve salt yazı-tabanlı ya da salt ses tabanlı internet tarayıcı programları kullanan kimseler için rahatsızlık yaratmaktadır. Ne yazık ki, şu an için sesli bir alternatifimiz bulunmamaktadır. Eğer bu, sizin geçerli gönderiler yapmanıza beklenmedik bir şekilde engel oluyorsa, lütfen destek için [[{{MediaWiki:Grouppage-sysop}}|site yöneticileriyle]] irtibata geçin.
+Ne var ki bu durum, görme sorunları yaşayan kişiler ve salt yazı-tabanlı ya da salt ses tabanlı internet tarayıcı programları kullanan kimseler için rahatsızlık yaratmaktadır. Ne yazık ki, şu an için sesli bir alternatifimiz bulunmamaktadır. Eğer bu, sizin geçerli gönderiler yapmanıza beklenmedik bir şekilde engel oluyorsa, lütfen destek için [[Special:ListAdmins|site yöneticileriyle]] irtibata geçin.
Sayfa düzenleyiciye dönmek için tarayıcınızın 'geri' tuşuna basınız.",
'captcha-addurl-whitelist' => ' #<!-- bu satırı olduğu gibi bırakın --> <pre>
@@ -3973,7 +4046,7 @@ $messages['uk'] = array(
Іноді, наприклад при додаванні на Ñторінку нового веб-поÑиланнÑ, вікі може показати вам картинку з кольоровим або Ñпотвореним текÑтом Ñ– запропонувати ввеÑти текÑÑ‚, Ñкий ви бачите.
ОÑкільки подібну задачу важко автоматизувати, це дає можливіÑÑ‚ÑŒ більшоÑÑ‚Ñ– людей робити Ñвої зміни, в той Ñ‡Ð°Ñ Ñк більшіÑÑ‚ÑŒ ÑпамерÑьких Ñ– вандальних програм не можуть цього зробити.
-Ðа жаль, подібний захиÑÑ‚ може Ñпричинити незручноÑÑ‚Ñ– Ð´Ð»Ñ Ð»ÑŽÐ´ÐµÐ¹ із вадами зору. Зараз у Ð½Ð°Ñ Ð½ÐµÐ¼Ð° звукової альтернативи Ð´Ð»Ñ Ñ‚Ð°ÐºÐ¾Ñ— перевірки. Будь лаÑка, звернітьÑÑ Ð¿Ð¾ допомогу до [[{{MediaWiki:Grouppage-sysop}}|адмініÑтраторів]], Ñкщо подібна перевірка заважає вам доброÑовіÑно працювати з Ñайтом.
+Ðа жаль, подібний захиÑÑ‚ може Ñпричинити незручноÑÑ‚Ñ– Ð´Ð»Ñ Ð»ÑŽÐ´ÐµÐ¹ із вадами зору. Зараз у Ð½Ð°Ñ Ð½ÐµÐ¼Ð° звукової альтернативи Ð´Ð»Ñ Ñ‚Ð°ÐºÐ¾Ñ— перевірки. Будь лаÑка, звернітьÑÑ Ð¿Ð¾ допомогу до [[Special:ListAdmins|адмініÑтраторів]], Ñкщо подібна перевірка заважає вам доброÑовіÑно працювати з Ñайтом.
ÐатиÑніть кнопку «Ðазад» у вашому браузері, щоб повернутиÑÑ Ð´Ð¾ редагуваннÑ.',
'captcha-addurl-whitelist' => '#<!-- leave this line exactly as it is --> <pre>
@@ -4007,7 +4080,7 @@ $messages['vec'] = array(
In çerti casi, par esenpio quando se çerca de zontar novi colegamenti web in te na pagina, el software wiki el pol mostrar na imagine con un breve testo colorà e/o distorto, domandàndoghe a l'utente de riscrìvarlo drento na casela fata aposta. Sicome i computer no i xe mìa boni de replicar a la perfezion sta azion, sto mecanismo el ghe consente a (quasi tuti) i utenti reali de conpletar l'inserimento che i volea, inpedéndoghe l'acesso a la magior parte dei spammer e dei altri atachi automatizà.
-Sfortunatamente, ste misure de sicureza le pole métar in dificoltà i utenti che gà problemi de vista o quei che dòpara browser testuali o basà su la sintesi vocale. Purtropo al momento no xe disponibile nissun mecanismo alternativo basà su messagio audio; se ste procedure le inpedisse l'inserimento de informazion che se ritien legìtime, se prega de contatar i [[{{MediaWiki:Grouppage-sysop}}|aministradori del sito]] e domandarghe assistensa.
+Sfortunatamente, ste misure de sicureza le pole métar in dificoltà i utenti che gà problemi de vista o quei che dòpara browser testuali o basà su la sintesi vocale. Purtropo al momento no xe disponibile nissun mecanismo alternativo basà su messagio audio; se ste procedure le inpedisse l'inserimento de informazion che se ritien legìtime, se prega de contatar i [[Special:ListAdmins|aministradori del sito]] e domandarghe assistensa.
Struca el boton \"Indrìo\" del to browser par tornar a la pagina de modifica.",
'captcha-addurl-whitelist' => ' #<!-- no sta modificar in alcun modo sta riga --> <pre>
@@ -4045,7 +4118,7 @@ Do các phần má»m tá»± Ä‘á»™ng khó Ä‘á»c những hình này, nên má»i ngÆ
Tuy vậy, tính năng này có thể bất tiện đối với những độc giả có thị giác yếu hay đang sử dụng trình duyệt bằng văn bản thuần hay trình duyệt bằng tiếng nói.
Hiện tại chúng tôi chưa có chức năng phát âm thay thế.
-Xin hãy liên lạc vá»›i [[{{MediaWiki:Grouppage-sysop}}|ngÆ°á»i quản trị trang web]] để được trợ giúp nếu Ä‘iá»u này vô tình ngăn cản bạn đóng góp ná»™i dung tốt.
+Xin hãy liên lạc vá»›i [[Special:ListAdmins|ngÆ°á»i quản trị trang web]] để được trợ giúp nếu Ä‘iá»u này vô tình ngăn cản bạn đóng góp ná»™i dung tốt.
Nhấn chuột vào nút “Back†của trình duyệt để trở lại trang soạn thảo.',
'captcha-addurl-whitelist' => ' #<!-- xin để dòng này đừng thay đổi --> <pre>
@@ -4062,7 +4135,8 @@ Nhấn chuột vào nút “Back†của trình duyệt để trở lại trang
*/
$messages['vo'] = array(
'captcha-edit' => 'Ad redakön yegedi at, dunolös, begö! saedami dono e penolös saedoti in bokil ([[Special:Captcha/help|nüns pluik]]):',
- 'captcha-addurl' => 'Redakam olik keninükon yümis plödik nulik. Ad jelön siti ta peneds itjäfidik, dunolös, begö! saedami sököl, e penolös saedoti in bokil ([[Special:Captcha/help|nüns pluik]]):', # Fuzzy
+ 'captcha-addurl' => 'Redakam olik keninükon yümis plödik nulik.
+Ad jelön siti ta peneds badik itjäfidik, dunolös, begö! saedami balugik sököl, e penolös saedoti in bokil ad dakipön redakam ola ([[Special:Captcha/help|nüns pluik]]):',
'captcha-badlogin' => 'Ad jelön siti ta daget itjäfidik letavödas, dunolös, begö! saedami sököl e penolös saedoti in bokil ([[Special:Captcha/help|nüns pluik]]):', # Fuzzy
'captcha-createaccount' => 'Ad jelön siti ta kalijafam itjäfidik, dunolös, begö! saedami sököl e penolös saedoti in bokil ([[Special:Captcha/help|nüns pluik]]):', # Fuzzy
'captcha-createaccount-fail' => 'Kot fümükama paneveräton u paseleton.',
@@ -4100,7 +4174,7 @@ Bén seur, on pout todi les disfacer al mwin, mins c' est on soyant ovraedje.
Adon, pa côps, copurade cwand vos radjoutez des hårdêyes a ene pådje, ou å moumint d' ahiver on novea conte sol wiki, on eployrè ene passete d' acertinaedje, dj' ô bén k' on vos mostere ene imådje avou on tecse kitoirdou eyet vs dimander di taper les mots so l' imådje. Come li ricnoxhance di ç' tecse la est målåjheye a fé otomaticmint pa on robot, çoula permete di leyî les vraiyès djins fé leus candjmints tot arestant l' plupårt des spameus et des sfwaitès atakes pa robot.
Målureuzmint çoula apoite eto des målåjhminces po les cis k' ont des problinmes po vey, ou k' eployèt des betchteus e môde tecse ou båzés sol vwès. Pol moumint, nos n' avans nén ene alternative odio.
-S' i vs plait contactez les [[{{MediaWiki:Grouppage-sysop}}|manaedjeus do site]] po d' l' aidance si çoula vos espaitche di fé vos candjmints ledjitimes.
+S' i vs plait contactez les [[Special:ListAdmins|manaedjeus do site]] po d' l' aidance si çoula vos espaitche di fé vos candjmints ledjitimes.
Clitchîz sol boton «En erî» di vosse betchteu waibe po rivni al pådje di dvant.",
'captcha-addurl-whitelist' => " #<!-- leyîz cisse roye chal come elle est (oyi, i gn a-st on vude al comince) --><pre>
@@ -4184,7 +4258,7 @@ $messages['zh-hans'] = array(
有时,特别是当给一个页é¢æ·»åŠ æ–°çš„网页链接时,本站会让你看一幅有颜色的或者有å˜å½¢æ–‡å­—的图åƒï¼Œå¹¶ä¸”è¦ä½ è¾“入所显示的文字。因为这是难以自动完æˆçš„一项任务,它将å…许人ä¿å­˜ä»–们的编辑,åŒæ—¶é˜»æ­¢å¤§å¤šæ•°å‘é€åžƒåœ¾é‚®ä»¶è€…和其他机器人的攻击。
-令人é—憾是,这会使得视力ä¸å¥½çš„人,或者使用基於文本或者基於声音的æµè§ˆå™¨çš„用户感到ä¸ä¾¿ã€‚而目å‰æˆ‘们还没有æ供的音频的选择。如果这正好阻止你进行正常的编辑,请和[[{{MediaWiki:Grouppage-sysop}}|站点管ç†å‘˜]]è”系获得帮助。
+令人é—憾是,这会使得视力ä¸å¥½çš„人,或者使用基於文本或者基於声音的æµè§ˆå™¨çš„用户感到ä¸ä¾¿ã€‚而目å‰æˆ‘们还没有æ供的音频的选择。如果这正好阻止你进行正常的编辑,请和[[Special:ListAdmins|站点管ç†å‘˜]]è”系获得帮助。
点击æµè§ˆå™¨ä¸­çš„“åŽé€€â€æŒ‰é’®è¿”回你所编辑的页é¢ã€‚',
'captcha-addurl-whitelist' => ' #<!-- leave this line exactly as it is --> <pre>
@@ -4221,7 +4295,7 @@ $messages['zh-hant'] = array(
有時,特別是當給一個é é¢æ·»åŠ æ–°çš„網é é€£çµæ™‚,本站會讓你看一幅有é¡è‰²çš„或者有變形文字的圖åƒï¼Œä¸¦ä¸”è¦ä½ è¼¸å…¥æ‰€é¡¯ç¤ºçš„文字。因為這是難以自動完æˆçš„一項任務,它將å…許人儲存他們的編輯,åŒæ™‚阻止大多數發é€åžƒåœ¾éƒµä»¶è€…和其他機器人的攻擊。
-令人éºæ†¾æ˜¯ï¼Œé€™æœƒä½¿å¾—視力ä¸å¥½çš„人,或者使用基於文字或者基於è²éŸ³çš„ç€è¦½å™¨çš„使用者感到ä¸ä¾¿ã€‚而目å‰æˆ‘們還沒有æ供的音訊的é¸æ“‡ã€‚如果這正好阻止你進行正常的編輯,請和[[{{MediaWiki:Grouppage-sysop}}|站點管ç†å“¡]]è¯ç¹«å–得幫助。
+令人éºæ†¾æ˜¯ï¼Œé€™æœƒä½¿å¾—視力ä¸å¥½çš„人,或者使用基於文字或者基於è²éŸ³çš„ç€è¦½å™¨çš„使用者感到ä¸ä¾¿ã€‚而目å‰æˆ‘們還沒有æ供的音訊的é¸æ“‡ã€‚如果這正好阻止你進行正常的編輯,請和[[Special:ListAdmins|站點管ç†å“¡]]è¯ç¹«å–得幫助。
點擊ç€è¦½å™¨ä¸­çš„「後退ã€æŒ‰éˆ•è¿”回你所編輯的é é¢ã€‚',
'captcha-addurl-whitelist' => ' #<!-- leave this line exactly as it is --> <pre>
diff --git a/extensions/ConfirmEdit/FancyCaptcha.i18n.php b/extensions/ConfirmEdit/FancyCaptcha.i18n.php
index f251377d..2ac1c973 100644
--- a/extensions/ConfirmEdit/FancyCaptcha.i18n.php
+++ b/extensions/ConfirmEdit/FancyCaptcha.i18n.php
@@ -13,12 +13,12 @@ $messages = array();
$messages['en'] = array(
'fancycaptcha-desc' => 'Fancy CAPTCHA generator for Confirm Edit',
'fancycaptcha-addurl' => 'Your edit includes new external links.
-To help protect against automated spam, please enter the words that appear below in the box ([[Special:Captcha/help|more info]]):',
- 'fancycaptcha-badlogin' => 'To help protect against automated password cracking, please enter the words that appear below in the box ([[Special:Captcha/help|more info]]):',
- 'fancycaptcha-createaccount' => 'To help protect against automated account creation, please enter the words that appear below in the box ([[Special:Captcha/help|more info]]):',
+To protect the wiki against automated spam, we kindly ask you to enter the words that appear below in the box ([[Special:Captcha/help|more info]]):',
+ 'fancycaptcha-badlogin' => 'To protect the wiki against automated password cracking, we kindly ask you to enter the words that appear below in the box ([[Special:Captcha/help|more info]]):',
+ 'fancycaptcha-createaccount' => 'To protect the wiki against automated account creation, we kindly ask you to enter the words that appear below in the box ([[Special:Captcha/help|more info]]):',
'fancycaptcha-create' => 'To create the page, please enter the words that appear below in the box ([[Special:Captcha/help|more info]]):',
'fancycaptcha-edit' => 'To edit this page, please enter the words that appear below in the box ([[Special:Captcha/help|more info]]):',
- 'fancycaptcha-sendemail' => 'To help protect against automated spamming, please enter the words that appear below in the box ([[Special:Captcha/help|more info]]):',
+ 'fancycaptcha-sendemail' => 'To protect the wiki against automated spamming, we kindly ask you to enter the words that appear below in the box ([[Special:Captcha/help|more info]]):',
'fancycaptcha-reload-text' => 'Refresh',
);
@@ -37,26 +37,27 @@ $messages['qqq'] = array(
'fancycaptcha-create' => '{{Related|ConfirmEdit-create}}',
'fancycaptcha-edit' => '{{Related|ConfirmEdit-edit}}',
'fancycaptcha-sendemail' => '{{Related|ConfirmEdit-sendemail}}',
- 'fancycaptcha-reload-text' => 'Prompts a click to get a new FancyCaptcha image.',
+ 'fancycaptcha-reload-text' => 'Prompts a click to get a new FancyCaptcha image.
+{{Identical|Refresh}}',
);
/** Gheg Albanian (Gegë)
* @author Mdupont
*/
$messages['aln'] = array(
- 'fancycaptcha-addurl' => 'Your redakto përfshin të jashtme lidhje të reja. Për të ndihmuar në mbrojtjen kundër spam automatizuar, ju lutem shkruani fjalët që shfaqen poshtë në kuti ([[Special:Captcha/help|më shumë informacion]]):',
- 'fancycaptcha-badlogin' => 'Për të ndihmuar në mbrojtjen kundër fjalëkalimin automatizuar plasaritje, ju lutem shkruani fjalët që shfaqen poshtë në kuti ([[Special:Captcha/help|më shumë informacion]]):',
- 'fancycaptcha-createaccount' => 'Për të ndihmuar në mbrojtjen kundër krijimit llogari e automatizuar, ju lutem shkruani fjalët që shfaqen poshtë në kuti ([[Special:Captcha/help|më shumë informacion]]):',
+ 'fancycaptcha-addurl' => 'Your redakto përfshin të jashtme lidhje të reja. Për të ndihmuar në mbrojtjen kundër spam automatizuar, ju lutem shkruani fjalët që shfaqen poshtë në kuti ([[Special:Captcha/help|më shumë informacion]]):', # Fuzzy
+ 'fancycaptcha-badlogin' => 'Për të ndihmuar në mbrojtjen kundër fjalëkalimin automatizuar plasaritje, ju lutem shkruani fjalët që shfaqen poshtë në kuti ([[Special:Captcha/help|më shumë informacion]]):', # Fuzzy
+ 'fancycaptcha-createaccount' => 'Për të ndihmuar në mbrojtjen kundër krijimit llogari e automatizuar, ju lutem shkruani fjalët që shfaqen poshtë në kuti ([[Special:Captcha/help|më shumë informacion]]):', # Fuzzy
'fancycaptcha-create' => 'Për të krijuar një faqe, ju lutem shkruani fjalët që shfaqen poshtë në kuti ([[Special:Captcha/help|më shumë informacion]]):',
'fancycaptcha-edit' => 'Për të redaktuar këtë faqe, ju lutem shkruani fjalët që shfaqen poshtë në kuti ([[Special:Captcha/help|më shumë informacion]]):',
- 'fancycaptcha-sendemail' => 'Për të ndihmuar në mbrojtjen kundër spamming automatizuar, ju lutem shkruani fjalët që shfaqen poshtë në kuti ([[Special:Captcha/help|më shumë informacion]]):',
+ 'fancycaptcha-sendemail' => 'Për të ndihmuar në mbrojtjen kundër spamming automatizuar, ju lutem shkruani fjalët që shfaqen poshtë në kuti ([[Special:Captcha/help|më shumë informacion]]):', # Fuzzy
);
/** Amharic (አማርኛ)
* @author Codex Sinaiticus
*/
$messages['am'] = array(
- 'fancycaptcha-createaccount' => 'á‹«áˆá‰°áˆáˆˆáŒˆ የመኪናáŠá‰µ አባáˆáŠá‰µ ለመከላከáˆá¥ አባሠለመሆን በዚህ áˆáˆµáˆ የታዩት እንáŒáˆŠá‹áŠ› ቃላት ወይሠá‰áŒ¥áˆ­ መáˆáˆµ በትክክሠመጻá áŒá‹´á‰³ áŠá‹á¢ ([[Special:Captcha/help|ይህ áˆáŠ•á‹µáŠá‹?]]) (To help protect against automated spam, you must type in the words or correct number answer exactly as seen beneath here before registering your account:)<br />',
+ 'fancycaptcha-createaccount' => 'á‹«áˆá‰°áˆáˆˆáŒˆ የመኪናáŠá‰µ አባáˆáŠá‰µ ለመከላከáˆá¥ አባሠለመሆን በዚህ áˆáˆµáˆ የታዩት እንáŒáˆŠá‹áŠ› ቃላት ወይሠá‰áŒ¥áˆ­ መáˆáˆµ በትክክሠመጻá áŒá‹´á‰³ áŠá‹á¢ ([[Special:Captcha/help|ይህ áˆáŠ•á‹µáŠá‹?]]) (To help protect against automated spam, you must type in the words or correct number answer exactly as seen beneath here before registering your account:)<br />', # Fuzzy
);
/** Aragonese (aragonés)
@@ -64,14 +65,14 @@ $messages['am'] = array(
*/
$messages['an'] = array(
'fancycaptcha-desc' => 'Chenerador chocant de CAPTCHAs ta Confirmar Edicions.',
- 'fancycaptcha-addurl' => "Ha encluyito vinclos esternos en a suya edición. Ta aduyar a protecher contra o spam automatico, escriba por favor as parolas que amaneixen en a caixa d'o cobaixo ([[Special:Captcha/help|más información]]):",
- 'fancycaptcha-badlogin' => "Ta aduyar-nos en a protección contra o trenque automatico de claus d'acceso, escriba por favor as parolas que amaneixen en a caixa d'o cobaixo ([[Special:Captcha/help|más información]]):",
- 'fancycaptcha-createaccount' => 'Ta aduyar a protecher contra a creyación automatica de cuentas, escriba por favor en o quatrón as parolas que amaneixen debaixo ([[Special:Captcha/help|más información]]):',
+ 'fancycaptcha-addurl' => "Ha encluyito vinclos esternos en a suya edición. Ta aduyar a protecher contra o spam automatico, escriba por favor as parolas que amaneixen en a caixa d'o cobaixo ([[Special:Captcha/help|más información]]):", # Fuzzy
+ 'fancycaptcha-badlogin' => "Ta aduyar-nos en a protección contra o trenque automatico de claus d'acceso, escriba por favor as parolas que amaneixen en a caixa d'o cobaixo ([[Special:Captcha/help|más información]]):", # Fuzzy
+ 'fancycaptcha-createaccount' => 'Ta aduyar a protecher contra a creyación automatica de cuentas, escriba por favor en o quatrón as parolas que amaneixen debaixo ([[Special:Captcha/help|más información]]):', # Fuzzy
'fancycaptcha-create' => "Ta creyar a pachina, escriba por favor as parolas que amaneixen en a caixa d'o cobaixo
([[Special:Captcha/help|más información]]):",
'fancycaptcha-edit' => "Ta editar ista pachina, escriba por favor as parolas que amaneixen en a caixa d'o cobaixo
([[Special:Captcha/help|más información]]):",
- 'fancycaptcha-sendemail' => 'Ta protecher-nos contra o spam automatizau por favor escriba as parolas que amaneixen en o siguient quadro ([[Special:Captcha/help|mas información]]):',
+ 'fancycaptcha-sendemail' => 'Ta protecher-nos contra o spam automatizau por favor escriba as parolas que amaneixen en o siguient quadro ([[Special:Captcha/help|mas información]]):', # Fuzzy
);
/** Arabic (العربية)
@@ -81,14 +82,14 @@ $messages['an'] = array(
$messages['ar'] = array(
'fancycaptcha-desc' => 'مولد Ùانسي كابتشا Ù„Confirm Edit',
'fancycaptcha-addurl' => 'تعديلك يتضمن وصلات خارجية جديدة.
-للحماية من السبام الأوتوماتيكي، من Ùضلك أدخل الكلمات التي تظهر بالأسÙÙ„ ÙÙŠ الصندوق ([[Special:Captcha/help|مزيد من المعلومات]]):',
- 'fancycaptcha-badlogin' => 'للمساعدة ÙÙŠ الحماية ضد سرقة كلمات السر، من Ùضلك أدخل الكلمات التي تظهر بالأسÙÙ„ ÙÙŠ الصندوق ([[Special:Captcha/help|مزيد من المعلومات]]):',
- 'fancycaptcha-createaccount' => 'للمساعدة ÙÙŠ منع إنشاء حسابات بطريقة أوتوماتيكية، قم من Ùضلك بإدخال الكلمات التي تظهر أدناه ÙÙŠ الصندوق ([[Special:Captcha/help|مزيد من المعلومات]]):',
+للحماية من السبام الأوتوماتيكي، من Ùضلك أدخل الكلمات التي تظهر بالأسÙÙ„ ÙÙŠ الصندوق ([[Special:Captcha/help|مزيد من المعلومات]]):', # Fuzzy
+ 'fancycaptcha-badlogin' => 'للمساعدة ÙÙŠ الحماية ضد سرقة كلمات السر، من Ùضلك أدخل الكلمات التي تظهر بالأسÙÙ„ ÙÙŠ الصندوق ([[Special:Captcha/help|مزيد من المعلومات]]):', # Fuzzy
+ 'fancycaptcha-createaccount' => 'للمساعدة ÙÙŠ منع إنشاء حسابات بطريقة أوتوماتيكية، قم من Ùضلك بإدخال الكلمات التي تظهر أدناه ÙÙŠ الصندوق ([[Special:Captcha/help|مزيد من المعلومات]]):', # Fuzzy
'fancycaptcha-create' => 'لإنشاء الصÙحة، من Ùضلك أدخل الكلمات التي تظهر بالأسÙÙ„ ÙÙŠ الصندوق
([[Special:Captcha/help|مزيد من المعلومات]]):',
'fancycaptcha-edit' => 'لتعديل هذه الصÙحة، من Ùضلك أدخل الكلمات التي تظهر بالأسÙÙ„ ÙÙŠ الصندوق
([[Special:Captcha/help|مزيد من المعلومات]]):',
- 'fancycaptcha-sendemail' => 'للمساعدة ÙÙŠ منع إنشاء حسابات بطريقة أوتوماتيكية، قم من Ùضلك بإدخال الكلمات التي تظهر أدناه ÙÙŠ الصندوق ([[Special:Captcha/help|مزيد من المعلومات]]):',
+ 'fancycaptcha-sendemail' => 'للمساعدة ÙÙŠ منع إنشاء حسابات بطريقة أوتوماتيكية، قم من Ùضلك بإدخال الكلمات التي تظهر أدناه ÙÙŠ الصندوق ([[Special:Captcha/help|مزيد من المعلومات]]):', # Fuzzy
);
/** Egyptian Spoken Arabic (مصرى)
@@ -97,28 +98,28 @@ $messages['ar'] = array(
*/
$messages['arz'] = array(
'fancycaptcha-addurl' => 'تعديلك Ùيه لينكات خارجية جديدة
-علشان تساعد ÙÙ‰ الحماية من السبام الاوتوماتيكى، لو سمحت تكتب الكلمات اللى باينة تحت ÙÙ‰ الصندوء ([[Special:Captcha/help|معلومات زيادة]]):',
- 'fancycaptcha-badlogin' => 'علشان تساعد ÙÙ‰ الحماية من السرقة الاتوماتيكية للباسورد، لو سمحت تدخل الكلمات اللى باينة تحت ÙÙ‰ الصندوء ([[Special:Captcha/help|معلومات زيادة]]):',
- 'fancycaptcha-createaccount' => 'علشان تساعد ÙÙ‰ الحماية من الÙتح الاوتوماتيكى للحسابات،لو سمحت تدخل الكلمات اللى باينة تحت ÙÙ‰ الصندوء ([[Special:Captcha/help|معلومات زيادة]]):',
+علشان تساعد ÙÙ‰ الحماية من السبام الاوتوماتيكى، لو سمحت تكتب الكلمات اللى باينة تحت ÙÙ‰ الصندوء ([[Special:Captcha/help|معلومات زيادة]]):', # Fuzzy
+ 'fancycaptcha-badlogin' => 'علشان تساعد ÙÙ‰ الحماية من السرقة الاتوماتيكية للباسورد، لو سمحت تدخل الكلمات اللى باينة تحت ÙÙ‰ الصندوء ([[Special:Captcha/help|معلومات زيادة]]):', # Fuzzy
+ 'fancycaptcha-createaccount' => 'علشان تساعد ÙÙ‰ الحماية من الÙتح الاوتوماتيكى للحسابات،لو سمحت تدخل الكلمات اللى باينة تحت ÙÙ‰ الصندوء ([[Special:Captcha/help|معلومات زيادة]]):', # Fuzzy
'fancycaptcha-create' => 'علشان تبتدى صÙحة جديدة، لو سمحت تدخل الكلمات اللى ظاهرة تحت ÙÙ‰ الصندوق
([[Special:Captcha/help|معلومات زيادة]]):',
'fancycaptcha-edit' => 'علشان تعدل ÙÙ‰ الصÙحة دى،لو سمحت تكتب الكلمات اللى باينة تحت ÙÙ‰ الصندوء ([[Special:Captcha/help|معلومات زيادة]]):',
);
-/** Assamese (অসমীয়া)
+/** Assamese (অসমীয়া)
* @author Chaipau
* @author Gitartha.bordoloi
* @author Rajuonline
*/
$messages['as'] = array(
'fancycaptcha-addurl' => 'আপোনাৰ সমà§à¦ªà¦¾à¦¦à¦¨à¦¾à¦¤ বাহà§à¦¯à¦¿à¦• সংযোগ আছে।
-সà§à¦¬à¦¯à¦¼à¦‚কà§à§°à§€à¦¯à¦¼ সমà§à¦ªà¦¾à¦¦à¦¨à¦¾à§° পৰা হাত সাৰিবলৈ, তলত দেখিবলৈ পোৱা শবà§à¦¦à¦Ÿà§‹ বাকচৰ ভিতৰত লিখক। ([[Special:Captcha/help|অধিক তথà§à¦¯]]):',
+সà§à¦¬à¦¯à¦¼à¦‚কà§à§°à§€à¦¯à¦¼ সমà§à¦ªà¦¾à¦¦à¦¨à¦¾à§° পৰা হাত সাৰিবলৈ, তলত দেখিবলৈ পোৱা শবà§à¦¦à¦Ÿà§‹ বাকচৰ ভিতৰত লিখক। ([[Special:Captcha/help|অধিক তথà§à¦¯]]):', # Fuzzy
'fancycaptcha-badlogin' => 'সà§à¦¬à¦¯à¦¼à¦‚কà§à§°à§€à¦¯à¦¼ গà§à¦ªà§à¦¤à¦¶à¦¬à§à¦¦ চà§à§°à¦¿à§° পৰা হাত সাৰিবলৈ,
-তলত দেখিবলৈ পোৱা শবà§à¦¦à¦Ÿà§‹ বাকচৰ ভিতৰত লিখক। ([[Special:Captcha/help|অধিক তথà§à¦¯]]):',
- 'fancycaptcha-createaccount' => 'সà§à¦¬à¦¯à¦¼à¦‚কà§à§°à§€à¦¯à¦¼ নতà§à¦¨ সদসà§à¦¯à¦­à§à¦•à§à¦¤à¦¿à§° পৰা হাত সাৰিবলৈ, তলত দেখিবলৈ পোৱা শবà§à¦¦à¦Ÿà§‹ বাকচৰ ভিতৰত লিখক। ([[Special:Captcha/help|অধিক তথà§à¦¯]]):',
+তলত দেখিবলৈ পোৱা শবà§à¦¦à¦Ÿà§‹ বাকচৰ ভিতৰত লিখক। ([[Special:Captcha/help|অধিক তথà§à¦¯]]):', # Fuzzy
+ 'fancycaptcha-createaccount' => 'সà§à¦¬à¦¯à¦¼à¦‚কà§à§°à§€à¦¯à¦¼ নতà§à¦¨ সদসà§à¦¯à¦­à§à¦•à§à¦¤à¦¿à§° পৰা হাত সাৰিবলৈ, তলত দেখিবলৈ পোৱা শবà§à¦¦à¦Ÿà§‹ বাকচৰ ভিতৰত লিখক। ([[Special:Captcha/help|অধিক তথà§à¦¯]]):', # Fuzzy
'fancycaptcha-create' => 'পৃষà§à¦ à¦¾à¦Ÿà§‹ বনাবলৈ, তলত দেখিবলৈ পোৱা শবà§à¦¦à¦Ÿà§‹ বাকচৰ ভিতৰত লিখক। ([[Special:Captcha/help|অধিক তথà§à¦¯]]):',
'fancycaptcha-edit' => 'à¦à¦‡ পৃষà§à¦ à¦¾à¦Ÿà§‹ সমà§à¦ªà¦¾à¦¦à¦¨à¦¾ কৰিবলৈ, তলত দেখিবলৈ পোৱা শবà§à¦¦à¦Ÿà§‹ বাকচৰ ভিতৰত লিখক। ([[Special:Captcha/help|অধিক তথà§à¦¯]]):',
- 'fancycaptcha-sendemail' => 'সà§à¦¬à¦¯à¦¼à¦‚কà§à§°à¦¿à¦¯à¦¼ সà§à¦ªà§‡à¦®à¦¿à¦™à§° পৰা বাচিবলৈ অনà§à¦—à§à§°à¦¹ কৰি তলৰ বাকছটোৰ তলত ওলোৱা আখৰকেইটা লিখক ([[Special:Captcha/help|অধিক তথà§à¦¯]]):',
+ 'fancycaptcha-sendemail' => 'সà§à¦¬à¦¯à¦¼à¦‚কà§à§°à¦¿à¦¯à¦¼ সà§à¦ªà§‡à¦®à¦¿à¦™à§° পৰা বাচিবলৈ অনà§à¦—à§à§°à¦¹ কৰি তলৰ বাকছটোৰ তলত ওলোৱা আখৰকেইটা লিখক ([[Special:Captcha/help|অধিক তথà§à¦¯]]):', # Fuzzy
);
/** Asturian (asturianu)
@@ -126,39 +127,54 @@ $messages['as'] = array(
* @author Xuacu
*/
$messages['ast'] = array(
- 'fancycaptcha-addurl' => "La to edición inclúi nuevos enllaces esternos. P'aidar a protexer escontra'l spam automatizáu, por favor escribi nel caxellu les pallabres qu'apaecen embaxo ([[Special:Captcha/help|más información]]):",
- 'fancycaptcha-badlogin' => "P'ayudar a protexer escontra'l descifráu automáticu de claves, por favor escribi nel caxellu les pallabres qu'apaecen embaxo ([[Special:Captcha/help|más información]]):",
- 'fancycaptcha-createaccount' => "P'ayudar a protexer escontra la creación automática de cuentes, por favor escribi nel caxellu les pallabres qu'apaecen embaxo ([[Special:Captcha/help|más información]]):",
+ 'fancycaptcha-addurl' => "La so edición incluye nuevos enllaces esternos. Pa protexer la wiki escontra'l spam automatizáu, pidimos-y qu'escriba nel caxellu les pallabres qu'apaecen embaxo ([[Special:Captcha/help|más información]]):",
+ 'fancycaptcha-badlogin' => "Pa protexer la wiki escontra'l descifráu automáticu de claves, pidimos-y qu'escriba nel caxellu les pallabres qu'apaecen embaxo ([[Special:Captcha/help|más información]]):",
+ 'fancycaptcha-createaccount' => "Pa protexer la wiki escontra la creación automática de cuentes, pidimos-y qu'escriba nel caxellu les pallabres qu'apaecen embaxo ([[Special:Captcha/help|más información]]):",
'fancycaptcha-create' => "Pa crear la páxina, por favor escribi nel caxellu les pallabres qu'apaecen embaxo ([[Special:Captcha/help|más información]]):",
'fancycaptcha-edit' => "Pa editar la páxina, por favor escribi nel caxellu les pallabres qu'apaecen embaxo ([[Special:Captcha/help|más información]]):",
- 'fancycaptcha-sendemail' => "P'ayudar a protexer escontra'l corréu puxarra automáticu, por favor escribi nel caxellu les pallabres qu'apaecen embaxo ([[Special:Captcha/help|más información]]):",
+ 'fancycaptcha-sendemail' => "Pa protexer la wiki escontra'l corréu puxarra automáticu, pidimos-y qu'escriba nel caxellu les pallabres qu'apaecen embaxo ([[Special:Captcha/help|más información]]):",
'fancycaptcha-reload-text' => 'Refrescar',
);
/** Bashkir (башҡортÑа)
* @author Assele
+ * @author РуÑтам Ðурыев
*/
$messages['ba'] = array(
'fancycaptcha-addurl' => 'Һеҙҙең текÑтығыҙҙа Ñңы тышҡы һылтанмалар бар.
-Ðвтоматик Ñпамдан һаҡлау маҡÑатында, зинһар, күрһәтелгән һүҙҙәрҙе түбәндәге юлға керетегеҙ ([[Special:Captcha/help|тулыраҡ мәғлүмәт]]):',
- 'fancycaptcha-badlogin' => 'Паролде автоматик ватыуҙан һаҡлау маҡÑатында, зинһар, күрһәтелгән һүҙҙәрҙе түбәндәге юлға керетегеҙ ([[Special:Captcha/help|тулыраҡ мәғлүмәт]]):',
- 'fancycaptcha-createaccount' => 'Иҫәп Ñҙмаларын автоматик булдырыуҙан һаҡлау маҡÑатында, зинһар, күрһәтелгән һүҙҙәрҙе түбәндәге юлға керетегеҙ ([[Special:Captcha/help|тулыраҡ мәғлүмәт]]):',
+Ðвтоматик Ñпамдан һаҡлау маҡÑатында, зинһар, күрһәтелгән һүҙҙәрҙе түбәндәге юлға керетегеҙ ([[Special:Captcha/help|тулыраҡ мәғлүмәт]]):', # Fuzzy
+ 'fancycaptcha-badlogin' => 'Серһүҙҙе автоматик ватыуҙан һаҡлау маҡÑатында, зинһар, күрһәтелгән һүҙҙәрҙе түбәндәге юлға керетегеҙ ([[Special:Captcha/help|тулыраҡ мәғлүмәт]]):', # Fuzzy
+ 'fancycaptcha-createaccount' => 'Иҫәп Ñҙмаларын автоматик булдырыуҙан һаҡлау маҡÑатында, зинһар, күрһәтелгән һүҙҙәрҙе түбәндәге юлға керетегеҙ ([[Special:Captcha/help|тулыраҡ мәғлүмәт]]):', # Fuzzy
'fancycaptcha-create' => 'Яңы бит булдырыу Ó©Ñөн, зинһар, күрһәтелгән һүҙҙәрҙе түбәндәге юлға керетегеҙ ([[Special:Captcha/help|тулыраҡ мәғлүмәт]]):',
'fancycaptcha-edit' => 'Был битте мөхәррирләү Ó©Ñөн, зинһар, күрһәтелгән һүҙҙәрҙе түбәндәге юлға керетегеҙ ([[Special:Captcha/help|тулыраҡ мәғлүмәт]]):',
- 'fancycaptcha-sendemail' => 'Ðвтоматик Ñпамдан һаҡлау маҡÑатында, зинһар, күрһәтелгән һүҙҙәрҙе түбәндәге юлға керетегеҙ ([[Special:Captcha/help|тулыраҡ мәғлүмәт]]):',
+ 'fancycaptcha-sendemail' => 'Ðвтоматик Ñпамдан һаҡлау маҡÑатында, зинһар, күрһәтелгән һүҙҙәрҙе түбәндәге юлға керетегеҙ ([[Special:Captcha/help|тулыраҡ мәғлүмәт]]):', # Fuzzy
);
/** Southern Balochi (بلوچی مکرانی)
* @author Mostafadaneshvar
*/
$messages['bcc'] = array(
- 'fancycaptcha-addurl' => '‎بست',
- 'fancycaptcha-badlogin' => 'په Ú©Ù…Ú© په محاÙظت Ú†Ù‡ اتوماتیکی پروشگ کلمه رمز، لطÙا کلماتی Ú©Ù‡ ته جهلگی جعبه ظاهر انت واردش کنیت ([[Special:Captcha/help|گیشترین اطلاعات]]):',
- 'fancycaptcha-createaccount' => 'په Ú©Ù…Ú© په محاÙظت Ú†Ù‡ اتوماتیکی شرکتن حساب، لطÙا کلماتی Ú©Ù‡ ته جهلگی جعبه ظاهر انت واردش کنیت ([[Special:Captcha/help|گیشترین اطلاعات]]):',
+ 'fancycaptcha-addurl' => '‎بست', # Fuzzy
+ 'fancycaptcha-badlogin' => 'په Ú©Ù…Ú© په محاÙظت Ú†Ù‡ اتوماتیکی پروشگ کلمه رمز، لطÙا کلماتی Ú©Ù‡ ته جهلگی جعبه ظاهر انت واردش کنیت ([[Special:Captcha/help|گیشترین اطلاعات]]):', # Fuzzy
+ 'fancycaptcha-createaccount' => 'په Ú©Ù…Ú© په محاÙظت Ú†Ù‡ اتوماتیکی شرکتن حساب، لطÙا کلماتی Ú©Ù‡ ته جهلگی جعبه ظاهر انت واردش کنیت ([[Special:Captcha/help|گیشترین اطلاعات]]):', # Fuzzy
'fancycaptcha-create' => 'په شرکتن صÙحه، لطÙا کلماتی Ú©Ù‡ ته جهلگی جعبه ظاهراند واردش کنیت ([[Special:Captcha/help|گیشتر اطلاعات]]):',
'fancycaptcha-edit' => 'په اصلاح کتن ای صÙحه، لطÙا کلماتی Ú©Ù‡ ته جهلگی جعبه ظاهراند واردش کنیت ([[Special:Captcha/help|گیشتر اطلاعات]]):',
);
+/** Bikol Central (Bikol Central)
+ * @author Geopoet
+ */
+$messages['bcl'] = array(
+ 'fancycaptcha-addurl' => 'An saimong pagliwat minabale nin baguhong mga panluwas na sugpon.
+Tanganing makatabang na protektaran kontra sa awtomatikong espam, pakikaag an mga tataramon na ipinapahiling sa ibaba sa laog nin kahon ([[Special:Captcha/help|kadagdagang impormasyon]]):', # Fuzzy
+ 'fancycaptcha-badlogin' => 'Tanganing makatabang na magprotekta kontra sa awtomatikong pagbaak kan pasa-taramon, pakikaag an mga tataramon na ipinapahiling sa ibaba sa laog nin kahon ([[Special:Captcha/help|kadagdagang impormasyon]]):', # Fuzzy
+ 'fancycaptcha-createaccount' => 'Tanganing makatabang na magprotekta kontra sa awtomatikong pagmumukna nin panindog, pakikaag an mga tataramon na ipinapahiling sa ibaba sa laog nin kahon ([[Special:Captcha/help|kadagdagang impormasyon]]):', # Fuzzy
+ 'fancycaptcha-create' => 'Tanganing makapagmukna nin pahina, pakikaag kan mga tataramon na ipinapahiling sa ibaba sa laog nin kahon ([[Special:Captcha/help|kadagdagang impormasyon]]):',
+ 'fancycaptcha-edit' => 'Tanganing makapagliwat kaining pahina, pakikaag an mga tataramon na ipinapahiling sa ibaba sa laog nin kahon ([[Special:Captcha/help|kadagdagang impormasyon]]):',
+ 'fancycaptcha-sendemail' => 'Tanganing makatabang na magprotekta kontra sa awtomatikong pag-eespam, pakikaag an mga tataramon na ipinapahiling sa ibaba sa laog nin kahon ([[Special:Captcha/help|kadagdagang impormasyon]]):', # Fuzzy
+ 'fancycaptcha-reload-text' => 'Preskohon otro',
+);
+
/** Belarusian (TaraÅ¡kievica orthography) (беларуÑÐºÐ°Ñ (тарашкевіца)‎)
* @author EugeneZelenko
* @author Jim-by
@@ -167,12 +183,12 @@ $messages['bcc'] = array(
*/
$messages['be-tarask'] = array(
'fancycaptcha-addurl' => 'Вашае Ñ€Ñдагаваньне ўтрымлівае Ð½Ð¾Ð²Ñ‹Ñ Ð²Ð¾Ð½ÐºÐ°Ð²Ñ‹Ñ ÑпаÑылкі.
-У мÑтах абароны ад Ñпаму, калі лаÑка, увÑдзіце Ñловы, ÑÐºÑ–Ñ Ð¿Ð°ÐºÐ°Ð·Ð°Ð½Ñ‹Ñ Ñž выÑве ([[Special:Captcha/help|болей інфармацыі]]):',
- 'fancycaptcha-badlogin' => 'У мÑтах абароны ад аўтаматычнага злому паролÑÑž, калі лаÑка, увÑдзіце Ñловы, ÑÐºÑ–Ñ Ð¿Ð°ÐºÐ°Ð·Ð°Ð½Ñ‹Ñ Ñž выÑве ([[Special:Captcha/help|болей інфармацыі]]):',
- 'fancycaptcha-createaccount' => 'У мÑтах абароны ад аўтаматычнага ÑтварÑÐ½ÑŒÐ½Ñ Ñ€Ð°Ñ…ÑƒÐ½ÐºÐ°Ñž, калі лаÑка, увÑдзіце Ñловы, ÑÐºÑ–Ñ Ð¿Ð°ÐºÐ°Ð·Ð°Ð½Ñ‹Ñ Ñž выÑве ([[Special:Captcha/help|болей інфармацыі]]):',
+У мÑтах абароны ад Ñпаму, калі лаÑка, увÑдзіце Ñловы, ÑÐºÑ–Ñ Ð¿Ð°ÐºÐ°Ð·Ð°Ð½Ñ‹Ñ Ñž выÑве ([[Special:Captcha/help|болей інфармацыі]]):', # Fuzzy
+ 'fancycaptcha-badlogin' => 'У мÑтах абароны ад аўтаматычнага злому паролÑÑž, калі лаÑка, увÑдзіце Ñловы, ÑÐºÑ–Ñ Ð¿Ð°ÐºÐ°Ð·Ð°Ð½Ñ‹Ñ Ñž выÑве ([[Special:Captcha/help|болей інфармацыі]]):', # Fuzzy
+ 'fancycaptcha-createaccount' => 'У мÑтах абароны ад аўтаматычнага ÑтварÑÐ½ÑŒÐ½Ñ Ñ€Ð°Ñ…ÑƒÐ½ÐºÐ°Ñž, калі лаÑка, увÑдзіце Ñловы, ÑÐºÑ–Ñ Ð¿Ð°ÐºÐ°Ð·Ð°Ð½Ñ‹Ñ Ñž выÑве ([[Special:Captcha/help|болей інфармацыі]]):', # Fuzzy
'fancycaptcha-create' => 'Ð”Ð»Ñ ÑтварÑÐ½ÑŒÐ½Ñ Ñтаронкі, калі лаÑка, увÑдзіце Ñловы, ÑÐºÑ–Ñ Ð¿Ð°ÐºÐ°Ð·Ð°Ð½Ñ‹Ñ Ñž выÑве ([[Special:Captcha/help|болей інфармацыі]]):',
'fancycaptcha-edit' => 'Ð”Ð»Ñ Ñ€ÑÐ´Ð°Ð³Ð°Ð²Ð°Ð½ÑŒÐ½Ñ Ð³Ñтай Ñтаронкі, калі лаÑка, увÑдзіце Ñловы, ÑÐºÑ–Ñ Ð¿Ð°ÐºÐ°Ð·Ð°Ð½Ñ‹Ñ Ñž выÑве ([[Special:Captcha/help|болей інфармацыі]]):',
- 'fancycaptcha-sendemail' => 'У мÑтах абароны Ñупраць аўтаматычнага Ñпаму, калі лаÑка, увÑдзіце Ñловы Ð¿Ð°ÐºÐ°Ð·Ð°Ð½Ñ‹Ñ Ð½Ñ–Ð¶Ñй у полі ([[Special:Captcha/help|Ð´Ð°Ð´Ð°Ñ‚ÐºÐ¾Ð²Ð°Ñ Ñ–Ð½Ñ„Ð°Ñ€Ð¼Ð°Ñ†Ñ‹Ñ]]):',
+ 'fancycaptcha-sendemail' => 'У мÑтах абароны Ñупраць аўтаматычнага Ñпаму, калі лаÑка, увÑдзіце Ñловы Ð¿Ð°ÐºÐ°Ð·Ð°Ð½Ñ‹Ñ Ð½Ñ–Ð¶Ñй у полі ([[Special:Captcha/help|Ð´Ð°Ð´Ð°Ñ‚ÐºÐ¾Ð²Ð°Ñ Ñ–Ð½Ñ„Ð°Ñ€Ð¼Ð°Ñ†Ñ‹Ñ]]):', # Fuzzy
'fancycaptcha-reload-text' => 'Ðбнавіць',
);
@@ -181,12 +197,12 @@ $messages['be-tarask'] = array(
* @author DCLXVI
*/
$messages['bg'] = array(
- 'fancycaptcha-addurl' => 'Текущата Ñ€ÐµÐ´Ð°ÐºÑ†Ð¸Ñ Ð²ÐºÐ»ÑŽÑ‡Ð²Ð° нови външни препратки. Като защита от автоматизиран Ñпам, ÑиÑтемата изиÑква от потребителите да въведат думите, показани по-долу в текÑтовата ÐºÑƒÑ‚Ð¸Ñ ([[Special:Captcha/help|повече информациÑ]]):',
- 'fancycaptcha-badlogin' => 'Като защита Ñрещу опити за налучкване на паролата ви, молÑ, въведете буквите, които виждате на картинката ([[Special:Captcha/help|повече информациÑ]]):',
- 'fancycaptcha-createaccount' => 'СиÑтемата за защита от автоматично Ñъздаване на потребителÑки Ñметки изиÑква да въведете това, което виждате в кутиÑта по-долу ([[Special:Captcha/help|повече информациÑ]]):',
+ 'fancycaptcha-addurl' => 'Текущата Ñ€ÐµÐ´Ð°ÐºÑ†Ð¸Ñ Ð²ÐºÐ»ÑŽÑ‡Ð²Ð° нови външни препратки. Като защита от автоматизиран Ñпам, ÑиÑтемата изиÑква от потребителите да въведат думите, показани по-долу в текÑтовата ÐºÑƒÑ‚Ð¸Ñ ([[Special:Captcha/help|повече информациÑ]]):', # Fuzzy
+ 'fancycaptcha-badlogin' => 'Като защита Ñрещу опити за налучкване на паролата ви, молÑ, въведете буквите, които виждате на картинката ([[Special:Captcha/help|повече информациÑ]]):', # Fuzzy
+ 'fancycaptcha-createaccount' => 'СиÑтемата за защита от автоматично Ñъздаване на потребителÑки Ñметки изиÑква да въведете това, което виждате в кутиÑта по-долу ([[Special:Captcha/help|повече информациÑ]]):', # Fuzzy
'fancycaptcha-create' => 'За Ñъздаване на Ñтраницата е необходимо да Ñе въведат думите от картинката в полето по-долу ([[Special:Captcha/help|повече информациÑ]]):',
'fancycaptcha-edit' => 'За редактиране на Ñтраницата е необходимо да Ñе въведат думите от картинката в полето по-долу ([[Special:Captcha/help|повече информациÑ]]):',
- 'fancycaptcha-sendemail' => 'Като защита Ñрещу автоматизиран Ñпам, въведете в кутиÑта думите, които Ñа показани по-долу ([[Special:Captcha/help|повече информациÑ]]):',
+ 'fancycaptcha-sendemail' => 'Като защита Ñрещу автоматизиран Ñпам, въведете в кутиÑта думите, които Ñа показани по-долу ([[Special:Captcha/help|повече информациÑ]]):', # Fuzzy
);
/** Bengali (বাংলা)
@@ -194,39 +210,43 @@ $messages['bg'] = array(
* @author Zaheen
*/
$messages['bn'] = array(
- 'fancycaptcha-addurl' => 'আপনার সমà§à¦ªà¦¾à¦¦à¦¨à¦¾à¦Ÿà¦¿à¦¤à§‡ নতà§à¦¨ বহিঃসংযোগ আছে। সà§à¦¬à¦¯à¦¼à¦‚কà§à¦°à¦¿à¦¯à¦¼ সà§à¦ªà§à¦¯à¦¾à¦®à§‡à¦° বিরà§à¦¦à§à¦§à§‡ সà§à¦°à¦•à§à¦·à¦¾à¦° খাতিরে অনà§à¦—à§à¦°à¦¹ করে নিচের বাকà§à¦¸à§‡ দেখানো শবà§à¦¦à¦—à§à¦²à¦¿ পà§à¦°à¦¬à§‡à¦¶ করান ([[Special:Captcha/help|আরও তথà§à¦¯]]):',
- 'fancycaptcha-badlogin' => 'সà§à¦¬à¦¯à¦¼à¦‚কà§à¦°à¦¿à¦¯à¦¼ শবà§à¦¦à¦šà¦¾à¦¬à¦¿ কà§à¦°à§à¦¯à¦¾à¦•à¦¿à¦‚-à¦à¦° বিরà§à¦¦à§à¦§à§‡ সà§à¦°à¦•à§à¦·à¦¾à¦° খাতিরে অনà§à¦—à§à¦°à¦¹ করে নিচের বাকà§à¦¸à§‡ দেখানো শবà§à¦¦à¦—à§à¦²à¦¿ পà§à¦°à¦¬à§‡à¦¶ করান ([[Special:Captcha/help|আরও তথà§à¦¯]]):',
- 'fancycaptcha-createaccount' => 'সà§à¦¬à¦¯à¦¼à¦‚কà§à¦°à¦¿à¦¯à¦¼ অà§à¦¯à¦¾à¦•à¦¾à¦‰à¦¨à§à¦Ÿ সৃষà§à¦Ÿà¦¿à¦° বিরà§à¦¦à§à¦§à§‡ সà§à¦°à¦•à§à¦·à¦¾à¦° জনà§à¦¯ অনà§à¦—à§à¦°à¦¹ করে নিচের বাকà§à¦¸à§‡ দেখানো শবà§à¦¦à¦—à§à¦²à¦¿ পà§à¦°à¦¬à§‡à¦¶ করান ([[Special:Captcha/help|আরও তথà§à¦¯]]):',
+ 'fancycaptcha-addurl' => 'আপনার সমà§à¦ªà¦¾à¦¦à¦¨à¦¾à¦Ÿà¦¿à¦¤à§‡ নতà§à¦¨ বহিঃসংযোগ আছে। সà§à¦¬à¦¯à¦¼à¦‚কà§à¦°à¦¿à¦¯à¦¼ সà§à¦ªà§à¦¯à¦¾à¦®à§‡à¦° বিরà§à¦¦à§à¦§à§‡ সà§à¦°à¦•à§à¦·à¦¾à¦° খাতিরে অনà§à¦—à§à¦°à¦¹ করে নিচের বাকà§à¦¸à§‡ দেখানো শবà§à¦¦à¦—à§à¦²à¦¿ পà§à¦°à¦¬à§‡à¦¶ করান ([[Special:Captcha/help|আরও তথà§à¦¯]]):', # Fuzzy
+ 'fancycaptcha-badlogin' => 'সà§à¦¬à¦¯à¦¼à¦‚কà§à¦°à¦¿à¦¯à¦¼ শবà§à¦¦à¦šà¦¾à¦¬à¦¿ কà§à¦°à§à¦¯à¦¾à¦•à¦¿à¦‚-à¦à¦° বিরà§à¦¦à§à¦§à§‡ সà§à¦°à¦•à§à¦·à¦¾à¦° খাতিরে অনà§à¦—à§à¦°à¦¹ করে নিচের বাকà§à¦¸à§‡ দেখানো শবà§à¦¦à¦—à§à¦²à¦¿ পà§à¦°à¦¬à§‡à¦¶ করান ([[Special:Captcha/help|আরও তথà§à¦¯]]):', # Fuzzy
+ 'fancycaptcha-createaccount' => 'সà§à¦¬à¦¯à¦¼à¦‚কà§à¦°à¦¿à¦¯à¦¼ অà§à¦¯à¦¾à¦•à¦¾à¦‰à¦¨à§à¦Ÿ সৃষà§à¦Ÿà¦¿à¦° বিরà§à¦¦à§à¦§à§‡ সà§à¦°à¦•à§à¦·à¦¾à¦° জনà§à¦¯ অনà§à¦—à§à¦°à¦¹ করে নিচের বাকà§à¦¸à§‡ দেখানো শবà§à¦¦à¦—à§à¦²à¦¿ পà§à¦°à¦¬à§‡à¦¶ করান ([[Special:Captcha/help|আরও তথà§à¦¯]]):', # Fuzzy
'fancycaptcha-create' => 'পাতাটি সৃষà§à¦Ÿà¦¿ করতে চাইলে অনà§à¦—à§à¦°à¦¹ করে নিচের বাকà§à¦¸à§‡ দেখানো শবà§à¦¦à¦—à§à¦²à¦¿ পà§à¦°à¦¬à§‡à¦¶ করান ([[Special:Captcha/help|আরও তথà§à¦¯]]):',
'fancycaptcha-edit' => 'পাতাটি সমà§à¦ªà¦¾à¦¦à¦¨à¦¾ করতে চাইলে অনà§à¦—à§à¦°à¦¹ করে নিচের বাকà§à¦¸à§‡ দেখানো শবà§à¦¦à¦—à§à¦²à¦¿ পà§à¦°à¦¬à§‡à¦¶ করান
([[Special:Captcha/help|আরও তথà§à¦¯]]):',
- 'fancycaptcha-sendemail' => 'সà§à¦¬à¦¯à¦¼à¦‚কà§à¦°à¦¿à¦¯à¦¼ সà§à¦ªà§à¦¯à¦¾à¦®à¦¿à¦‚ à¦à¦° বিরà§à¦¦à§à¦§à§‡ সà§à¦°à¦•à§à¦·à¦¾à¦° খাতিরে অনà§à¦—à§à¦°à¦¹ করে নিচের বাকà§à¦¸à§‡ দেখানো শবà§à¦¦à¦—à§à¦²à¦¿ পà§à¦°à¦¬à§‡à¦¶ করান ([[Special:Captcha/help|আরও তথà§à¦¯]]):',
+ 'fancycaptcha-sendemail' => 'সà§à¦¬à¦¯à¦¼à¦‚কà§à¦°à¦¿à¦¯à¦¼ সà§à¦ªà§à¦¯à¦¾à¦®à¦¿à¦‚ à¦à¦° বিরà§à¦¦à§à¦§à§‡ সà§à¦°à¦•à§à¦·à¦¾à¦° খাতিরে অনà§à¦—à§à¦°à¦¹ করে নিচের বাকà§à¦¸à§‡ দেখানো শবà§à¦¦à¦—à§à¦²à¦¿ পà§à¦°à¦¬à§‡à¦¶ করান ([[Special:Captcha/help|আরও তথà§à¦¯]]):', # Fuzzy
);
/** Breton (brezhoneg)
+ * @author Fohanno
* @author Fulup
*/
$messages['br'] = array(
- 'fancycaptcha-addurl' => "Liammoù diavaez nevez zo bet degaset ganeoc'h. Evit stourm a-enep d'ar strob emgefre, skrivit ar gerioù a zeu war wel er voest a-is ([[Special:Captcha/help|gouzout hiroc'h]]):",
- 'fancycaptcha-badlogin' => "A-benn talañ ouzh ar preizhañ kontoù dre c'herioù-tremen emgefre, skrivit er vaezienn ar gerioù merket dindan ([[Special:Captcha/help|Petra eo se?]]):",
+ 'fancycaptcha-addurl' => "Liammoù diavaez nevez zo bet degaset ganeoc'h. Evit stourm a-enep d'ar strob emgefre, skrivit ar gerioù a zeu war wel er voest a-is ([[Special:Captcha/help|gouzout hiroc'h]]):", # Fuzzy
+ 'fancycaptcha-badlogin' => "A-benn talañ ouzh ar preizhañ kontoù dre c'herioù-tremen emgefre, skrivit er vaezienn ar gerioù merket dindan ([[Special:Captcha/help|Petra eo se?]]):", # Fuzzy
'fancycaptcha-createaccount' => "Evit stourm a-enep d'ar c'hontoù krouet ent emgefre, skrivit ar gerioù
-a zeu war wel er voest a-is ([[Special:Captcha/help|gouzout hiroc'h]]):",
+a zeu war wel er voest a-is ([[Special:Captcha/help|gouzout hiroc'h]]):", # Fuzzy
'fancycaptcha-create' => "Liammoù diavaez nevez zo bet degaset ganeoc'h. Evit stourm a-enep d'ar strob emgefre, skrivit ar gerioù a zeu war wel er voest a-is ([[Special:Captcha/help|gouzout hiroc'h]]):",
'fancycaptcha-edit' => "Liammoù diavaez nevez zo bet degaset ganeoc'h. Evit stourm a-enep d'ar strob emgefre, skrivit ar gerioù a zeu war wel er voest a-is ([[Special:Captcha/help|gouzout hiroc'h]]):",
- 'fancycaptcha-sendemail' => "Evit hor skoazellañ da zizarbenn ar strob emgefre, adskrivit ar gerioù a welit er voest dindan ([[Special:Captcha/help|gouzout hiroc'h]]):",
+ 'fancycaptcha-sendemail' => "Evit hor skoazellañ da zizarbenn ar strob emgefre, adskrivit ar gerioù a welit er voest dindan ([[Special:Captcha/help|gouzout hiroc'h]]):", # Fuzzy
+ 'fancycaptcha-reload-text' => 'Freskaat',
);
/** Bosnian (bosanski)
* @author CERminator
+ * @author DzWiki
*/
$messages['bs'] = array(
'fancycaptcha-addurl' => 'VaÅ¡a izmjena ukljuÄuje nove vanjske linkove.
-Da bi se zaÅ¡titili od automatskog spama, molimo da unesete rijeÄi koje su prikazane u kutiji ([[Special:Captcha/help|viÅ¡e informacija]]):',
- 'fancycaptcha-badlogin' => 'Da bi pomogli u sprjeÄavanju protiv automatskog probijanja Å¡ifre, molimo Vas da unesete rijeÄi koje su prikazane ispod u kutiji ([[Special:Captcha/help|viÅ¡e informacija]]):',
- 'fancycaptcha-createaccount' => 'Da bi pomogli u sprjeÄavanju automatskog pravljenja raÄuna, molimo Vas da unesete rijeÄi koje su prikazane u kutiji ispod ([[Special:Captcha/help|viÅ¡e informacija]]):',
+Da bi se zaÅ¡titili od automatskog spama, molimo da unesete rijeÄi koje su prikazane u kutiji ([[Special:Captcha/help|viÅ¡e informacija]]):', # Fuzzy
+ 'fancycaptcha-badlogin' => 'Da bi pomogli u sprjeÄavanju protiv automatskog probijanja Å¡ifre, molimo Vas da unesete rijeÄi koje su prikazane ispod u kutiji ([[Special:Captcha/help|viÅ¡e informacija]]):', # Fuzzy
+ 'fancycaptcha-createaccount' => 'Da bi pomogli u sprjeÄavanju automatskog pravljenja raÄuna, molimo Vas da unesete rijeÄi koje su prikazane u kutiji ispod ([[Special:Captcha/help|viÅ¡e informacija]]):', # Fuzzy
'fancycaptcha-create' => 'Da bi ste napravili stranicu, molimo Vas unesite rijeÄi koje su prikazane u kutiji ispod ([[Special:Captcha/help|viÅ¡e informacija]]):',
'fancycaptcha-edit' => 'Da bi ste ureÄ‘ivali ovu stranicu, molimo Vas unesite rijeÄi koje su prikazane u kutiji ispod ([[Special:Captcha/help|viÅ¡e informacija]]):',
- 'fancycaptcha-sendemail' => 'Da bi pomogli u sprjeÄavanju protiv automatskog spamovanja, molimo Vas da unesete rijeÄi koje su prikazane ispod u kutiji ([[Special:Captcha/help|viÅ¡e informacija]]):',
+ 'fancycaptcha-sendemail' => 'Da bi pomogli u sprjeÄavanju protiv automatskog spamovanja, molimo Vas da unesete rijeÄi koje su prikazane ispod u kutiji ([[Special:Captcha/help|viÅ¡e informacija]]):', # Fuzzy
+ 'fancycaptcha-reload-text' => 'Osvježi',
);
/** Catalan (català)
@@ -235,38 +255,47 @@ Da bi se zaÅ¡titili od automatskog spama, molimo da unesete rijeÄi koje su prik
* @author Ssola
*/
$messages['ca'] = array(
- 'fancycaptcha-addurl' => "La vostra modificació inclou nous enllaços externs. Com a protecció contra la propaganda automatitzada heu d'escriure en la caixa les paraules que apareixen a continuació ([[Special:Captcha/help|més informació]]):",
- 'fancycaptcha-badlogin' => "Com a protecció contra l'obtenció automatitzada de contrasenyes cal que escriviu en la caixa les paraules que apareixen a continuació ([[Special:Captcha/help|més informació]]):",
- 'fancycaptcha-createaccount' => 'Com a protecció contra la creació automatitzada de nous comptes cal que escriviu en la caixa les paraules que apareixen a continuació ([[Special:Captcha/help|més informació]]):',
+ 'fancycaptcha-addurl' => "La vostra modificació inclou nous enllaços externs. Com a protecció contra la propaganda automatitzada heu d'escriure en la caixa les paraules que apareixen a continuació ([[Special:Captcha/help|més informació]]):", # Fuzzy
+ 'fancycaptcha-badlogin' => "Com a protecció contra l'obtenció automatitzada de contrasenyes cal que escriviu en la caixa les paraules que apareixen a continuació ([[Special:Captcha/help|més informació]]):", # Fuzzy
+ 'fancycaptcha-createaccount' => 'Com a protecció contra la creació automatitzada de nous comptes cal que escriviu en la caixa les paraules que apareixen a continuació ([[Special:Captcha/help|més informació]]):', # Fuzzy
'fancycaptcha-create' => "Per a poder crear la pàgina heu d'escriure en la caixa les paraules que apareixen a continuació ([[Special:Captcha/help|més informació]]):",
'fancycaptcha-edit' => "Per a poder modificar la pàgina heu d'escriure en la caixa les paraules que apareixen a continuació ([[Special:Captcha/help|més informació]]):",
- 'fancycaptcha-sendemail' => 'Per ajudar a protegir contra el correu brossa automatitzat, si us plau, introduïu les paraules que apareixen a sota la caixa ([[Special:Captcha/help|més informació]]):',
+ 'fancycaptcha-sendemail' => 'Per ajudar a protegir contra el correu brossa automatitzat, si us plau, introduïu les paraules que apareixen a sota la caixa ([[Special:Captcha/help|més informació]]):', # Fuzzy
);
/** Min Dong Chinese (Mìng-dĕ̤ng-ngṳ̄)
*/
$messages['cdo'] = array(
- 'fancycaptcha-badlogin' => 'Ôi-lÄu huòng-cÄ« tiàng-sê̤ṳ cê̤ṳ-dông puái-gÄi mÄ­k-mÄ, chiÄng nṳ̄ sṳ̆-Ä­k â-dÄ̤ bÄ“ng-bÄ“ng diÄ“-lié gì sṳ̀ ([[Special:Captcha/help|gáing sâ̤ séng-sék]]):',
+ 'fancycaptcha-badlogin' => 'Ôi-lÄu huòng-cÄ« tiàng-sê̤ṳ cê̤ṳ-dông puái-gÄi mÄ­k-mÄ, chiÄng nṳ̄ sṳ̆-Ä­k â-dÄ̤ bÄ“ng-bÄ“ng diÄ“-lié gì sṳ̀ ([[Special:Captcha/help|gáing sâ̤ séng-sék]]):', # Fuzzy
+);
+
+/** Chechen (нохчийн)
+ * @author Умар
+ */
+$messages['ce'] = array(
+ 'fancycaptcha-addurl' => 'Хьан ниÑдар чохь керла арахьара хьажорагаш ÑŽ. Спамах лардала дехар до лахахь гура чохь гайтан дешнаш Ñзъе ([[Special:Captcha/help|ма-дарра…]]):',
);
/** Sorani Kurdish (کوردی)
* @author Asoxor
*/
$messages['ckb'] = array(
- 'fancycaptcha-createaccount' => 'بۆ یارمەتیدانی بەرگری لە دروستکردنی خۆکاری ھەژمار، تکایە ئەو وشانە لە خوارەوەدا دیارن لە بۆکسەکەدا بنووسە ([[Special:Captcha/help|زانیاریی زۆرتر]]):',
+ 'fancycaptcha-createaccount' => 'بۆ یارمەتیدانی بەرگری لە دروستکردنی خۆکاری ھەژمار، تکایە ئەو وشانە لە خوارەوەدا دیارن لە بۆکسەکەدا بنووسە ([[Special:Captcha/help|زانیاریی زۆرتر]]):', # Fuzzy
);
-/** Czech (Äesky)
+/** Czech (ÄeÅ¡tina)
* @author Mormegil
+ * @author TchoÅ™
*/
$messages['cs'] = array(
'fancycaptcha-desc' => 'PokroÄilý generátor captcha pro rozšíření „Confirm Edit“',
- 'fancycaptcha-addurl' => 'Vaše editace obsahuje nové odkazy formou URL; v zájmu ochrany před automatickým spamováním musíte opsat text z následujícího obrázku: ([[Special:Captcha/help|Co tohle znamená?]])',
- 'fancycaptcha-badlogin' => 'V rámci ochrany proti automatickým pokusům uhodnout heslo musíte opsat text z následujícího obrázku. ([[Special:Captcha/help|Co tohle znamená?]])',
- 'fancycaptcha-createaccount' => 'V rámci ochrany pÅ™ed automatickým zakládáním úÄtů musíte pro provedení registrace opsat text z následujícího obrázku: ([[Special:Captcha/help|Co tohle znamená?]])',
+ 'fancycaptcha-addurl' => 'Vaše editace obsahuje nové odkazy formou URL.
+Abychom wiki ochránili před automatizovaným spamováním, žádáme vás o opsání textu z následujícího obrázku ([[Special:Captcha/help|více informací]]):',
+ 'fancycaptcha-badlogin' => 'Abychom wiki ochránili proti automatizovaným pokusům uhodnout heslo, žádáme vás o opsání textu z následujícího obrázku ([[Special:Captcha/help|více informací]]):',
+ 'fancycaptcha-createaccount' => 'Abychom wiki ochránili proti automatizovanému zakládání úÄtů, žádáme vás o opsání textu z následujícího obrázku ([[Special:Captcha/help|více informací]]):',
'fancycaptcha-create' => 'Abyste mohli založit stránku, musíte opsat text z následujícího obrázku: ([[Special:Captcha/help|Co tohle znamená?]])',
'fancycaptcha-edit' => 'Abyste mohli editovat tuto stránku, musíte opsat text z následujícího obrázku: ([[Special:Captcha/help|Co tohle znamená?]])',
- 'fancycaptcha-sendemail' => 'V rámci ochrany proti automatickému spamování musíte opsat níže zobrazená slova ([[Special:Captcha/help|více informací]]):',
+ 'fancycaptcha-sendemail' => 'Abychom wiki ochránili proti automatizovanému spamování, žádáme vás o opsání textu z následujícího obrázku ([[Special:Captcha/help|více informací]]):',
'fancycaptcha-reload-text' => 'Vygenerovat nový kód',
);
@@ -274,7 +303,7 @@ $messages['cs'] = array(
* @author ОйЛ
*/
$messages['cu'] = array(
- 'fancycaptcha-createaccount' => 'блюдєниꙗ дѣл҄ьма на аѵтоматьно мѣÑтоê™Ð¸Ð´Ð°Ð½Ð¸Ñ¥ · авлѥнъ Ñлова обраê™ÑŠ нижьшиѥмь окънѣ напиши â™ ([[Special:Captcha/help|иÑпльнѧщѧ вѣÑти]]) :',
+ 'fancycaptcha-createaccount' => 'блюдєниꙗ дѣл҄ьма на аѵтоматьно мѣÑтоê™Ð¸Ð´Ð°Ð½Ð¸Ñ¥ · авлѥнъ Ñлова обраê™ÑŠ нижьшиѥмь окънѣ напиши â™ ([[Special:Captcha/help|иÑпльнѧщѧ вѣÑти]]) :', # Fuzzy
);
/** Welsh (Cymraeg)
@@ -282,12 +311,12 @@ $messages['cu'] = array(
*/
$messages['cy'] = array(
'fancycaptcha-addurl' => "Mae eich golygiad yn cynnwys cyswllt allanol newydd.
-Er mwyn ceisio rhwystro peiriannau sbam, byddwch gystal â theipio'r geiriau a welwch isod yn y blwch ([[Special:Captcha/help|rhagor o wybodaeth]]):",
- 'fancycaptcha-badlogin' => "Er mwyn ceisio rhwystro peiriannau datrys cyfrineiriau, byddwch gystal â theipio'r geiriau a welwch isod yn y blwch ([[Special:Captcha/help|rhagor o wybodaeth]]):",
- 'fancycaptcha-createaccount' => "Er mwyn ceisio rhwystro peiriannau creu cyfrifon, byddwch gystal â theipio'r geiriau a welwch isod yn y blwch ([[Special:Captcha/help|rhagor o wybodaeth]]):",
+Er mwyn arbed y wici rhag peiriannau sbam, byddwch gystal â theipio'r geiriau a welwch isod yn y blwch ([[Special:Captcha/help|rhagor o wybodaeth]]):",
+ 'fancycaptcha-badlogin' => "Er mwyn arbed y wici rhag peiriannau datrys cyfrineiriau, byddwch gystal â theipio'r geiriau a welwch isod yn y blwch ([[Special:Captcha/help|rhagor o wybodaeth]]):",
+ 'fancycaptcha-createaccount' => "Er mwyn arbed y wici rhag peiriannau creu cyfrifon, byddwch gystal â theipio'r geiriau a welwch isod yn y blwch ([[Special:Captcha/help|rhagor o wybodaeth]]):",
'fancycaptcha-create' => "Er mwyn creu'r dudalen, byddwch gystal â theipio'r geiriau a welwch isod yn y blwch ([[Special:Captcha/help|rhagor o wybodaeth]]):",
'fancycaptcha-edit' => "Er mwyn gallu golygu'r dudalen hon, byddwch gystal â theipio'r geiriau a welwch isod yn y blwch ([[Special:Captcha/help|rhagor o wybodaeth]]):",
- 'fancycaptcha-sendemail' => "Er mwyn cyfrannu at ddiogelu rhag sbamio awtomatig, byddwch gystal â gwneud y swm isod ac ysgrifennu'r ateb yn y blwch ([[Special:Captcha/help|rhagor o wybodaeth]]):",
+ 'fancycaptcha-sendemail' => "Er mwyn arbed y wici rhag sbamio awtomatig, byddwch gystal â gwneud y swm isod ac ysgrifennu'r ateb yn y blwch ([[Special:Captcha/help|rhagor o wybodaeth]]):",
'fancycaptcha-reload-text' => 'Adnewyddu',
);
@@ -298,12 +327,13 @@ Er mwyn ceisio rhwystro peiriannau sbam, byddwch gystal â theipio'r geiriau a w
* @author Peter Alberti
*/
$messages['da'] = array(
- 'fancycaptcha-addurl' => 'Din ændring tilføjer nye eksterne henvisninger. For at beskytte mod automatiseret spam, skal du indtaste ordet som vises nedenfor i feltet under det. ([[Special:Captcha/help|mere information]]):',
- 'fancycaptcha-badlogin' => 'For at beskytte mod automatiske forsøg på at gætte kodeord, skal du indtaste ordet som vises nedenfor i feltet under det. ([[Special:Captcha/help|mere information]]):',
- 'fancycaptcha-createaccount' => 'For at beskytte mod automatisk oprettelse af brugernavne, der bruges til spam, skal du indtaste ordet som vises nedenfor i feltet under det. ([[Special:Captcha/help|mere information]]):',
+ 'fancycaptcha-addurl' => 'Din ændring tilføjer nye eksterne henvisninger.
+For at beskytte mod automatiseret spam, skal du indtaste ordene som vises i feltet nedenfor. ([[Special:Captcha/help|mere information]]):',
+ 'fancycaptcha-badlogin' => 'For at beskytte mod automatiske forsøg på at gætte adgangskoden, skal du indtaste ordene som vises i feltet nedenfor. ([[Special:Captcha/help|mere information]]):',
+ 'fancycaptcha-createaccount' => 'For at beskytte mod automatisk oprettelse af brugerkonti, der bruges til spam, skal du indtaste ordet som vises i feltet nedenfor. ([[Special:Captcha/help|mere information]]):',
'fancycaptcha-create' => 'For at oprette en ny side, skal du indtaste ordet som vises nedenfor i feltet under det. ([[Special:Captcha/help|mere information]]):',
'fancycaptcha-edit' => 'For at redigere denne side, indtast da venligst ordene, der står i feltet nedenfor ([[Special:Captcha/help|mere information]]):',
- 'fancycaptcha-sendemail' => 'For at beskytte mod automatisk spam, bedes du skrive ordene der ses herunder i boksen ([[Special:Captcha/help|mere information]]):',
+ 'fancycaptcha-sendemail' => 'For at beskytte mod automatisk spam, skal du skrive ordene der vises i feltet herunder ([[Special:Captcha/help|mere information]]):',
'fancycaptcha-reload-text' => 'Opdater',
);
@@ -315,12 +345,12 @@ $messages['da'] = array(
$messages['de'] = array(
'fancycaptcha-desc' => 'Fancy-CAPTCHA-Generator für die Erweiterung „Confirm Edit“',
'fancycaptcha-addurl' => 'Deine Bearbeitung enthält neue externe Links.
-Zum Schutz vor automatisiertem Spamming gib das folgende Wort in das Feld unten ein. Klicke dann erneut auf „Seite speichern“ ([[Special:Captcha/help|Fragen oder Probleme?]]).',
- 'fancycaptcha-badlogin' => 'Zum Schutz vor einer Kompromittierung deines Benutzerkontos gib das folgende Wort in das Feld unten ein [[Special:Captcha/help|(Fragen oder Probleme?)]]:',
- 'fancycaptcha-createaccount' => 'Zum Schutz vor automatisierter Anlage von Benutzerkonten gib bitte das folgende Wort in das Feld unten ein ([[Special:Captcha/help|Fragen oder Probleme?]]):',
+Zum Schutz des Wikis vor automatisiertem Spamming bitten wir dich, das folgende Wort in das Feld unten einzugeben. Klicke dann erneut auf „Seite speichern“ ([[Special:Captcha/help|Fragen oder Probleme?]]).',
+ 'fancycaptcha-badlogin' => 'Zum Schutz des Wikis vor einer Kompromittierung deines Benutzerkontos bitten wir dich, das folgende Wort in das Feld unten einzugeben [[Special:Captcha/help|(Fragen oder Probleme?)]]:',
+ 'fancycaptcha-createaccount' => 'Zum Schutz des Wikis vor automatisierter Anlage von Benutzerkonten bitten wir dich, das folgende Wort in das Feld unten einzugeben ([[Special:Captcha/help|Fragen oder Probleme?]]):',
'fancycaptcha-create' => 'Zur Erstellung der Seite gib das folgende Wort in das Feld unten ein [[Special:Captcha/help|(Fragen oder Probleme?)]].',
'fancycaptcha-edit' => 'Zur Bearbeitung der Seite gib das folgende Wort in das Feld unten ein [[Special:Captcha/help|(Fragen oder Probleme?)]].',
- 'fancycaptcha-sendemail' => 'Um gegen automatischen Spam vorzugehen, gib bitte die Wörter unten in das Feld ein ([[Special:Captcha/help|mehr Informationen]]):',
+ 'fancycaptcha-sendemail' => 'Zum Schutz des Wikis vor automatischem Spamming bitten wir dich, die Wörter unten in das Feld einzugeben ([[Special:Captcha/help|mehr Informationen]]):',
'fancycaptcha-reload-text' => 'Aktualisieren',
);
@@ -331,12 +361,12 @@ Zum Schutz vor automatisiertem Spamming gib das folgende Wort in das Feld unten
*/
$messages['de-formal'] = array(
'fancycaptcha-addurl' => 'Ihre Bearbeitung enthält neue externe Links.
-Zum Schutz vor automatisiertem Spamming geben Sie das folgende Wort in das Feld unten ein. Klicken Sie dann erneut auf „Seite speichern“ ([[Special:Captcha/help|Fragen oder Probleme?]]).',
- 'fancycaptcha-badlogin' => 'Zum Schutz vor einer Kompromittierung Ihres Benutzerkontos geben Sie bitte das folgende Wort in das Feld unten ein [[Special:Captcha/help|(Haben Sie Fragen oder Probleme?)]]:',
- 'fancycaptcha-createaccount' => 'Zum Schutz vor automatisierter Anlage von Benutzerkonten geben Sie bitte das folgende Wort in das Feld unten ein ([[Special:Captcha/help|Fragen oder Probleme?]]):',
+Zum Schutz vor automatisiertem Spamming geben Sie das folgende Wort in das Feld unten ein. Klicken Sie dann erneut auf „Seite speichern“ ([[Special:Captcha/help|Fragen oder Probleme?]]).', # Fuzzy
+ 'fancycaptcha-badlogin' => 'Zum Schutz vor einer Kompromittierung Ihres Benutzerkontos geben Sie bitte das folgende Wort in das Feld unten ein [[Special:Captcha/help|(Haben Sie Fragen oder Probleme?)]]:', # Fuzzy
+ 'fancycaptcha-createaccount' => 'Zum Schutz vor automatisierter Anlage von Benutzerkonten geben Sie bitte das folgende Wort in das Feld unten ein ([[Special:Captcha/help|Fragen oder Probleme?]]):', # Fuzzy
'fancycaptcha-create' => 'Zur Erstellung der Seite geben Sie das folgende Wort in das Feld unten ein [[Special:Captcha/help|(Fragen oder Probleme?)]].',
'fancycaptcha-edit' => 'Zur Bearbeitung der Seite geben Sie das folgende Wort in das Feld unten ein [[Special:Captcha/help|(Fragen oder Probleme?)]].',
- 'fancycaptcha-sendemail' => 'Um gegen automatischen Spam vorzugehen, geben Sie bitte die Wörter unten in das Feld ein ([[Special:Captcha/help|mehr Informationen]]):',
+ 'fancycaptcha-sendemail' => 'Um gegen automatischen Spam vorzugehen, geben Sie bitte die Wörter unten in das Feld ein ([[Special:Captcha/help|mehr Informationen]]):', # Fuzzy
);
/** Zazaki (Zazaki)
@@ -344,14 +374,14 @@ Zum Schutz vor automatisiertem Spamming geben Sie das folgende Wort in das Feld
* @author Xoser
*/
$messages['diq'] = array(
- 'fancycaptcha-addurl' => 'Vurnayîşanê tu de linkanê harîcîyê newe esto.
-Qe otomatik spamî ra pawitîş, ma rica keno çekuyanê ke qutiya cor de înan binuse ([[Special:Captcha/help|enformasyonê bînî]]):',
- 'fancycaptcha-badlogin' => 'Qe otomatik parola crack kerdişî ra pawitîş, ma rica keno çekuyanê ke qutiya cor de înan binuse ([[Special:Captcha/help|enformasyonê bînî]]):',
- 'fancycaptcha-createaccount' => 'Qe otomatik hesab viraştişî ra pawitîş, ma rica keno çekuyanê ke qutiya cor de înan binuse ([[Special:Captcha/help|enformasyonê bînî]]):',
+ 'fancycaptcha-addurl' => 'Vırnayışané tod linkané hariciyé newe esto.
+Qe otomatik spami ra pawıtış, ma rica keno çekuyané ke qutiya cor de inan binuse ([[Special:Captcha/help|enformasyoné bini]]):',
+ 'fancycaptcha-badlogin' => 'Qe otomatik parola crack kerdişî ra pawitîş, ma rica keno çekuyanê ke qutiya cor de înan binuse ([[Special:Captcha/help|enformasyonê bînî]]):', # Fuzzy
+ 'fancycaptcha-createaccount' => 'Qe otomatik hesab viraştişî ra pawitîş, ma rica keno çekuyanê ke qutiya cor de înan binuse ([[Special:Captcha/help|enformasyonê bînî]]):', # Fuzzy
'fancycaptcha-create' => 'Qe pel viraştîşî, ma rica keno çekuyanê ke qutiya cor de înan binuse ([[Special:Captcha/help|enformasyonê bînî]]):',
'fancycaptcha-edit' => 'Qe pel vurnayîşî, ma rica keno çekuyanê ke qutiya cor de înan binuse ([[Special:Captcha/help|enformasyonê bînî]]):',
'fancycaptcha-sendemail' => 'Qe spamê otomayoni ra pawitîşi, ma rica keno çekuyanê ke qutiya cor de înan binuse
-([[Special:Captcha/help|enformasyonê bînî]]):',
+([[Special:Captcha/help|enformasyonê bînî]]):', # Fuzzy
'fancycaptcha-reload-text' => 'Newe ke',
);
@@ -360,12 +390,12 @@ Qe otomatik spamî ra pawitîş, ma rica keno çekuyanê ke qutiya cor de înan
*/
$messages['dsb'] = array(
'fancycaptcha-addurl' => 'Twója změna wopśimujo nowe eksterne wótkaze.
-Za šćit pśeśiwo awtomatiskemu spamowanjeju, zapódaj pšosym słowa, kótarež pokazuju se dołojce w kašćiku ([[Special:Captcha/help|dalšne informacije]]):',
- 'fancycaptcha-badlogin' => 'Za šćit pśeśiwo awtomatiskemu wugódanjeju gronidła, zapódaj pšosym słowa, kótarež pokazuju se dołojce w kašćiku ([[Special:Captcha/help|dalšne informacije]]):',
- 'fancycaptcha-createaccount' => 'Za šćit pśeśiwo awtomatiskemu załoženjeju kontow, zapódaj pšosym słowa, kótarež pokazuju se dołojce w kašćiku ([[Special:Captcha/help|dalšne informacije]]):',
+Za šćit pśeśiwo awtomatiskemu spamowanjeju, zapódaj pšosym słowa, kótarež pokazuju se dołojce w kašćiku ([[Special:Captcha/help|dalšne informacije]]):', # Fuzzy
+ 'fancycaptcha-badlogin' => 'Za šćit pśeśiwo awtomatiskemu wugódanjeju gronidła, zapódaj pšosym słowa, kótarež pokazuju se dołojce w kašćiku ([[Special:Captcha/help|dalšne informacije]]):', # Fuzzy
+ 'fancycaptcha-createaccount' => 'Za šćit pśeśiwo awtomatiskemu załoženjeju kontow, zapódaj pšosym słowa, kótarež pokazuju se dołojce w kašćiku ([[Special:Captcha/help|dalšne informacije]]):', # Fuzzy
'fancycaptcha-create' => 'Aby bok napórał, zapódaj pšosym słowa, kótarež pokazuju se dołojce w kašćiku ([[Special:Captcha/help|dalšne informacije]]):',
'fancycaptcha-edit' => 'Aby toś ten bok wobźěłał, zapódaj pšosym słowa, kótarež pokazuju se dołojce w kašćiku ([[Special:Captcha/help|dalšne informacije]]):',
- 'fancycaptcha-sendemail' => 'Za šćit pśeśiwo awtomatiskemu spamowanjeju, zapódaj pšosym słowa, kótarež pokazuju se dołojce w kašćiku ([[Special:Captcha/help|dalšne informacije]]):',
+ 'fancycaptcha-sendemail' => 'Za šćit pśeśiwo awtomatiskemu spamowanjeju, zapódaj pšosym słowa, kótarež pokazuju se dołojce w kašćiku ([[Special:Captcha/help|dalšne informacije]]):', # Fuzzy
);
/** Greek (Ελληνικά)
@@ -377,14 +407,14 @@ Za šćit pśeśiwo awtomatiskemu spamowanjeju, zapódaj pšosym słowa, kótare
*/
$messages['el'] = array(
'fancycaptcha-addurl' => 'Η επεξεÏγασία σας πεÏιλαμβάνει νέους εξωτεÏικοÏÏ‚ σÏνδεσμους.
-Ως βοήθεια για την Ï€Ïοστασία από αυτόματα spam, παÏακαλοÏμε γÏάψτε τις λέξεις που εμφανίζονται παÏακάτω στο πλαίσιο ([[Special:Captcha/help|πεÏισσότεÏες πληÏοφοÏίες]]):',
- 'fancycaptcha-badlogin' => 'Ως βοήθεια για την Ï€Ïοστασία από αυτόματα Ï€ÏογÏάμματα σπασίματος κωδικών, παÏακαλοÏμε γÏάψτε τις λέξεις που εμφανίζονται παÏακάτω στο πλαίσιο ([[Special:Captcha/help|πεÏισσότεÏες πληÏοφοÏίες]]):',
- 'fancycaptcha-createaccount' => 'Για να βοηθήσετε στην Ï€Ïοστασία κατά των αυτόματα δημιουÏγοÏμενων λογαÏιασμών, παÏακαλοÏμε πληκτÏολογήστε στο πλαίσιο τις λέξεις που εμφανίζονται πιο κάτω ([[Special:Captcha/help|πεÏισσότεÏες πληÏοφοÏίες]]):',
+Ως βοήθεια για την Ï€Ïοστασία από αυτόματα spam, παÏακαλοÏμε γÏάψτε τις λέξεις που εμφανίζονται παÏακάτω στο πλαίσιο ([[Special:Captcha/help|πεÏισσότεÏες πληÏοφοÏίες]]):', # Fuzzy
+ 'fancycaptcha-badlogin' => 'Ως βοήθεια για την Ï€Ïοστασία από αυτόματα Ï€ÏογÏάμματα σπασίματος κωδικών, παÏακαλοÏμε γÏάψτε τις λέξεις που εμφανίζονται παÏακάτω στο πλαίσιο ([[Special:Captcha/help|πεÏισσότεÏες πληÏοφοÏίες]]):', # Fuzzy
+ 'fancycaptcha-createaccount' => 'Για να βοηθήσετε στην Ï€Ïοστασία κατά των αυτόματα δημιουÏγοÏμενων λογαÏιασμών, παÏακαλοÏμε πληκτÏολογήστε στο πλαίσιο τις λέξεις που εμφανίζονται πιο κάτω ([[Special:Captcha/help|πεÏισσότεÏες πληÏοφοÏίες]]):', # Fuzzy
'fancycaptcha-create' => 'Για να δημιουÏγήσετε αυτήν την σελίδα, παÏακαλώ εισάγετε τις λέξεις που εμφανίζονται παÏακάτω μέσα στο κουτί
([[Special:Captcha/help|πεÏισσότεÏες πληÏοφοÏίες]]):',
'fancycaptcha-edit' => 'Για να επεξεÏγαστείτε αυτήν την σελίδα, παÏακαλώ εισάγετε τις λέξεις που εμφανίζονται παÏακάτω μέσα στο κουτί
([[Special:Captcha/help|πεÏισσότεÏες πληÏοφοÏίες]]):',
- 'fancycaptcha-sendemail' => 'Ως βοήθεια για την Ï€Ïοστασία από αυτόματα Ï€ÏογÏάμματα σπασίματος κωδικών, παÏακαλοÏμε γÏάψτε τις λέξεις που εμφανίζονται παÏακάτω στο πλαίσιο ([[Special:Captcha/help|πεÏισσότεÏες πληÏοφοÏίες]]):',
+ 'fancycaptcha-sendemail' => 'Ως βοήθεια για την Ï€Ïοστασία από αυτόματα Ï€ÏογÏάμματα σπασίματος κωδικών, παÏακαλοÏμε γÏάψτε τις λέξεις που εμφανίζονται παÏακάτω στο πλαίσιο ([[Special:Captcha/help|πεÏισσότεÏες πληÏοφοÏίες]]):', # Fuzzy
);
/** Esperanto (Esperanto)
@@ -392,12 +422,13 @@ $messages['el'] = array(
*/
$messages['eo'] = array(
'fancycaptcha-addurl' => 'Via redakto inkluzivas novajn eksterajn ligilojn.
-Por preventi aÅ­tomatan spamon, bonvolu enigi la jenajn vortojn en la skatolo ([[Special:Captcha/help|plua informo]]):',
- 'fancycaptcha-badlogin' => 'Helpi protekti kontraÅ­ aÅ­tomata divenado de pasvortoj, bonvolu enigi la jenajn vortojn en la skatolo ([[Special:Captcha/help|plua informo]]):',
- 'fancycaptcha-createaccount' => 'Helpi protekti kontraÅ­ aÅ­tomata kreado de kontoj, bonvolu enigi la jenajn vortojn en la skatolo ([[Special:Captcha/help|plua informo]]):',
+Por preventi aÅ­tomatan spamon, bonvolu enigi la jenajn vortojn en la skatolo ([[Special:Captcha/help|plia informo]]):',
+ 'fancycaptcha-badlogin' => 'Por protekti kontraÅ­ aÅ­tomata divenado de pasvortoj, bonvolu enigi la jenajn vortojn en la skatolo ([[Special:Captcha/help|plua informo]]):',
+ 'fancycaptcha-createaccount' => 'Por protekti kontraÅ­ aÅ­tomata kreado de kontoj, bonvolu enigi la jenajn vortojn en la skatolo ([[Special:Captcha/help|plia informo]]):',
'fancycaptcha-create' => 'Por krei la paÄon, bonvolu enigi la vortojn montritajn en la jena skatolo ([[Special:Captcha/help|plua informo]]):',
'fancycaptcha-edit' => 'Por redakti ĉi tiun paÄon, bonvolu enigi la vortojn jenajn en la kesto ([[Special:Captcha/help|plua informo]]):',
- 'fancycaptcha-sendemail' => 'Por helpi protekti kontraÅ­ aÅ­tomata spamado, bonvolu enigi la jenajn vortojn de la skatolo ([[Special:Captcha/help|plua informo]]):',
+ 'fancycaptcha-sendemail' => 'Por helpi protekti kontraÅ­ aÅ­tomata spamado, bonvolu enigi la jenajn vortojn de la skatolo ([[Special:Captcha/help|plia informo]]):',
+ 'fancycaptcha-reload-text' => 'RefreÅigi',
);
/** Spanish (español)
@@ -407,12 +438,12 @@ Por preventi aÅ­tomatan spamon, bonvolu enigi la jenajn vortojn en la skatolo ([
* @author Sanbec
*/
$messages['es'] = array(
- 'fancycaptcha-addurl' => 'Tu edición incluye nuevos enlaces externos. Para protegernos contra el spam automatizado, por favor introduce en el recuadro las palabras que aparecen debajo ([[Special:Captcha/help|más información]]):',
- 'fancycaptcha-badlogin' => 'Para ayudarnos en la protección contra el descifrado automático de contraseñas, por favor, introduce las palabras que aparecen abajo en la caja ([[Special:Captcha/help|más información]]):',
- 'fancycaptcha-createaccount' => 'Para evitar la creación automatizada de cuentas, introduce por favor en el recuadro las palabras que aparecen debajo ([[Special:Captcha/help|más información]]):',
+ 'fancycaptcha-addurl' => 'Tu edición incluye nuevos enlaces externos. Para protegernos contra el spam automatizado, por favor introduce en el recuadro las palabras que aparecen debajo ([[Special:Captcha/help|más información]]):', # Fuzzy
+ 'fancycaptcha-badlogin' => 'Para ayudarnos en la protección contra el descifrado automático de contraseñas, por favor, introduce las palabras que aparecen abajo en la caja ([[Special:Captcha/help|más información]]):', # Fuzzy
+ 'fancycaptcha-createaccount' => 'Para evitar la creación automatizada de cuentas, introduce por favor en el recuadro las palabras que aparecen debajo ([[Special:Captcha/help|más información]]):', # Fuzzy
'fancycaptcha-create' => 'Para crear la página, por favor introduce en el recuadro las palabras que aparecen debajo ([[Special:Captcha/help|más información]]):',
'fancycaptcha-edit' => 'Para editar esta página, por favor introduce en el recuadro las palabras que aparecen debajo ([[Special:Captcha/help|más información]]):',
- 'fancycaptcha-sendemail' => 'Para protegernos contra el spam automatizado por favor ingrese las palabras que aparecen en el siguiente cuadro ([[Special:Captcha/help|más información]]):',
+ 'fancycaptcha-sendemail' => 'Para protegernos contra el spam automatizado por favor ingrese las palabras que aparecen en el siguiente cuadro ([[Special:Captcha/help|más información]]):', # Fuzzy
'fancycaptcha-reload-text' => 'Actualizar',
);
@@ -435,12 +466,12 @@ Palun sisesta allpool olevas kastis kuvatud sõnad. Abinõu on kaitseks automaad
* @author An13sa
*/
$messages['eu'] = array(
- 'fancycaptcha-addurl' => 'Zure aldaketak kanpo lotura berriak ditu. Spam automatikoa saihestu ahal izateko, beheko koadroan ageri diren hitzak idatzi ([[Special:Captcha/help|informazio gehigarria]]):',
- 'fancycaptcha-badlogin' => 'Pasahitzen cracking automatikoa saihestu asmoz, beheko koadroan ageri diren hitzak idazteko eskatzen dizugu ([[Special:Captcha/help|informazio gehigarria]]):',
- 'fancycaptcha-createaccount' => 'Erabiltzaile kontuak automatikoki sortzea saihestu asmoz, beheko koadroan ageri diren hitzak idazteko eskatzen dizugu ([[Special:Captcha/help|informazio gehigarria]]):',
+ 'fancycaptcha-addurl' => 'Zure aldaketak kanpo lotura berriak ditu. Spam automatikoa saihestu ahal izateko, beheko koadroan ageri diren hitzak idatzi ([[Special:Captcha/help|informazio gehigarria]]):', # Fuzzy
+ 'fancycaptcha-badlogin' => 'Pasahitzen cracking automatikoa saihestu asmoz, beheko koadroan ageri diren hitzak idazteko eskatzen dizugu ([[Special:Captcha/help|informazio gehigarria]]):', # Fuzzy
+ 'fancycaptcha-createaccount' => 'Erabiltzaile kontuak automatikoki sortzea saihestu asmoz, beheko koadroan ageri diren hitzak idazteko eskatzen dizugu ([[Special:Captcha/help|informazio gehigarria]]):', # Fuzzy
'fancycaptcha-create' => 'Orrialde sortu ahal izateko, beheko koadroan ageri hitzak idatzi ([[Special:Captcha/help|informazio gehigarria]]):',
'fancycaptcha-edit' => 'Orrialde hau aldatu ahal izateko, beheko koadroan ageri diren hitzak idatzi ([[Special:Captcha/help|informazio gehigarria]]):',
- 'fancycaptcha-sendemail' => 'Zabor-posta automatizatuaz babesteko, idatzi azpiko kutxako hitzak ([[Special:Captcha/help|informazio gehiago]]):',
+ 'fancycaptcha-sendemail' => 'Zabor-posta automatizatuaz babesteko, idatzi azpiko kutxako hitzak ([[Special:Captcha/help|informazio gehiago]]):', # Fuzzy
);
/** Persian (Ùارسی)
@@ -448,16 +479,18 @@ $messages['eu'] = array(
* @author Huji
* @author Ladsgroup
* @author Meisam
+ * @author Reza1615
* @author Wayiran
*/
$messages['fa'] = array(
'fancycaptcha-addurl' => 'ویرایش شما حاوی پیوند به بیرون جدیدی است.
-برای Ú©Ù…Ú© به جلوگیری از هرزنگاری خودکار، لطÙاً واژه‌ای را Ú©Ù‡ در تصویر می‌بینید در جعبه وارد کنید ([[Special:Captcha/help|اطلاعات بیشتر]]):',
- 'fancycaptcha-badlogin' => 'برای Ú©Ù…Ú© به جلوگیری از سرقت خودکار کلمه عبور، لطÙاً واژه‌ای را Ú©Ù‡ در تصویر می‌بینید وارد کنید ([[Special:Captcha/help|اطلاعات بیشتر]]):',
- 'fancycaptcha-createaccount' => 'برای Ú©Ù…Ú© به جلوگیری از ایجاد خودکار حساب کاربری، لطÙاً واژه‌ای را Ú©Ù‡ در تصویر می‌بینید وارد کنید ([[Special:Captcha/help|اطلاعات بیشتر]]):',
+برای جلوگیری از هرزنگاری خودکار ویکی، ما با احترام از شما می‌خواهیم واژه‌ای را که در تصویر می‌بینید در جعبهٔ زیر وارد کنید ([[Special:Captcha/help|اطلاعات بیشتر]]):',
+ 'fancycaptcha-badlogin' => 'برای Ú©Ù…Ú© به جلوگیری از شکستن خودکار گذرواژه، لطÙاً واژه‌ای را Ú©Ù‡ در تصویر می‌بینید را وارد کنید ([[Special:Captcha/help|اطلاعات بیشتر]]):',
+ 'fancycaptcha-createaccount' => 'برای کمک به جلوگیری از ایجاد خودکار حساب کاربری، ما با احترام از شما می‌خواهید واژه‌ای را که در تصویر می‌بینید را در جعبهٔ زیر وارد کنید ([[Special:Captcha/help|اطلاعات بیشتر]]):',
'fancycaptcha-create' => 'برای ایجاد این صÙحه، لطÙاً واژه‌ای را Ú©Ù‡ در تصویر می‌بینید وارد کنید ([[Special:Captcha/help|اطلاعات بیشتر]]):',
'fancycaptcha-edit' => 'برای ویرایش این صÙحه، لطÙاً واژه‌ای را Ú©Ù‡ در تصویر می‌بینید وارد کنید ([[Special:Captcha/help|اطلاعات بیشتر]]):',
- 'fancycaptcha-sendemail' => 'برای Ú©Ù…Ú© به محاÙظت در برابر هرزه‌نگاری خودکار، لطÙاً واژه‌هایی را Ú©Ù‡ در جعبهٔ زیر نمایش داده می‌شوند وارد کنید ([[Special:Captcha/help|اطلاعات بیشتر]]):',
+ 'fancycaptcha-sendemail' => 'برای Ú©Ù…Ú© به محاÙظت در برابر هرزه‌نگاری خودکار، ما با احترام از شما می‌خواهیم واژه‌هایی را Ú©Ù‡ در جعبهٔ زیر نمایش داده می‌شوند وارد کنید ([[Special:Captcha/help|اطلاعات بیشتر]]):',
+ 'fancycaptcha-reload-text' => 'تازه‌کردن',
);
/** Finnish (suomi)
@@ -465,20 +498,23 @@ $messages['fa'] = array(
* @author Nike
*/
$messages['fi'] = array(
- 'fancycaptcha-addurl' => 'Muokkauksesi sisältää uusia linkkejä muille sivuille. Kirjoita kuvan sisältämät sanat alla olevaan tekstikenttään ([[Special:Captcha/help|lisätietoja]]):',
- 'fancycaptcha-badlogin' => 'Automatisoidun salasanan murtamisen vaikeuttamiseksi kirjoita kuvan sisältämät sanat alla olevaan tekstikenttään ([[Special:Captcha/help|lisätietoja]]):',
- 'fancycaptcha-createaccount' => 'Kirjoita kuvan sisältämät sanat alla olevaan tekstikenttään ([[Special:Captcha/help|lisätietoja]]):',
+ 'fancycaptcha-addurl' => 'Muokkauksesi sisältää uusia linkkejä muille sivuille. Kirjoita kuvan sisältämät sanat alla olevaan tekstikenttään ([[Special:Captcha/help|lisätietoja]]):', # Fuzzy
+ 'fancycaptcha-badlogin' => 'Automatisoidun salasanan murtamisen vaikeuttamiseksi kirjoita kuvan sisältämät sanat alla olevaan tekstikenttään ([[Special:Captcha/help|lisätietoja]]):', # Fuzzy
+ 'fancycaptcha-createaccount' => 'Kirjoita kuvan sisältämät sanat alla olevaan tekstikenttään ([[Special:Captcha/help|lisätietoja]]):', # Fuzzy
'fancycaptcha-create' => 'Muokkauksesi sisältää uusia linkkejä muille sivuille. Kirjoita kuvan sisältämät sanat alla olevaan tekstikenttään ([[Special:Captcha/help|lisätietoja]]):',
'fancycaptcha-edit' => 'Muokkauksesi sisältää uusia linkkejä muille sivuille. Kirjoita kuvan sisältämät sanat alla olevaan tekstikenttään ([[Special:Captcha/help|lisätietoja]]):',
- 'fancycaptcha-sendemail' => 'Automatisoidun roskapostin lähettämisen vaikeuttamiseksi kirjoita kuvan sisältämät sanat alla olevaan tekstikenttään ([[Special:Captcha/help|lisätietoja]]):',
+ 'fancycaptcha-sendemail' => 'Automatisoidun roskapostin lähettämisen vaikeuttamiseksi kirjoita kuvan sisältämät sanat alla olevaan tekstikenttään ([[Special:Captcha/help|lisätietoja]]):', # Fuzzy
);
/** Faroese (føroyskt)
+ * @author EileenSanda
* @author Spacebirdy
*/
$messages['fo'] = array(
- 'fancycaptcha-addurl' => 'Sum ein vernd ímóti sjálvvirknum konto gerð, er neyðugt hjá tær at skriva inn tey orð, sum koma fyri á myndini fyri at stovna eina kontu: <br />([[Special:Captcha/help|Hvat er hetta?]])',
- 'fancycaptcha-createaccount' => 'Sum ein vernd ímóti sjálvvirknum konto gerð, er neyðugt hjá tær at skriva inn tey orð, sum koma fyri á myndini fyri at stovna eina kontu: <br />([[Special:Captcha/help|Hvat er hetta?]]):',
+ 'fancycaptcha-addurl' => 'Tín rætting inniheldur nýggjar uttanhýsis slóðir.
+Fyri at verja wikiina ímóti sjálvvirkandi kontoupprættan, vilja vit vinarliga biðja teg um at skriva inn tey orð, sum koma fyri í teiginum niðanfyri, til tess at stovna eina konto: <br />([[Special:Captcha/help|meira kunning]]):',
+ 'fancycaptcha-createaccount' => 'Fyri at verja wikiina ímóti sjálvvirkandi kontoupprættan, vilja vit vinarliga biðja teg um at skriva inn tey orð, sum koma fyri í teiginum niðanfyri, so at tú kanst stovna eina konto:
+([[Special:Captcha/help|meira kunning]]):',
);
/** French (français)
@@ -493,12 +529,12 @@ $messages['fo'] = array(
$messages['fr'] = array(
'fancycaptcha-desc' => "Générateur d’images ''captcha'' anti-robots demandant une confirmation humaine des modifications.",
'fancycaptcha-addurl' => 'Votre modification inclut de nouveaux liens externes.
-Pour vérifier qu’il ne s’agit pas de pourriels automatisés, veuillez entrer les mots qui apparaissent dans la boîte ci-dessous ([[Special:Captcha/help|plus d’informations]]) :',
- 'fancycaptcha-badlogin' => 'Afin de nous aider à prévenir le cassage des mots de passe par des automates, veuillez entrer les mots qui apparaissent dans la boîte ci-dessous ([[Special:Captcha/help|plus d’informations]]) :',
- 'fancycaptcha-createaccount' => 'Afin de nous aider à lutter contre les créations automatiques de comptes, veuillez entrer les mots qui apparaissent dans la boîte ci-dessous ([[Special:Captcha/help|plus d’informations]]) :',
+Pour protéger le wiki contre les pourriels automatisés, nous vous demandons de bien vouloir entrer les mots qui apparaissent dans la boîte ([[Special:Captcha/help|plus d’informations]]) :',
+ 'fancycaptcha-badlogin' => 'Pour protéger le wiki contre le cassage des mots de passe par des automates, nous vous demandons de bien vouloir entrer les mots qui apparaissent dans la boîte ci-dessous ([[Special:Captcha/help|plus d’informations]]) :',
+ 'fancycaptcha-createaccount' => 'Pour protéger le wiki contre les créations automatiques de comptes, nous vous demandons de bien vouloir entrer les mots qui apparaissent dans la boîte ci-dessous ([[Special:Captcha/help|plus d’informations]]) :',
'fancycaptcha-create' => 'Pour créer la page, veuillez entrer les mots qui apparaissent dans la boîte ci-dessous ([[Special:Captcha|plus d’informations]]) :',
'fancycaptcha-edit' => 'Pour modifier cette page, veuillez saisir les mots qui apparaissent dans la boîte ci-dessous ([[Special:Captcha/help|plus d’information]]) :',
- 'fancycaptcha-sendemail' => 'Afin de nous aider à prévenir le pollupostage automatisé, veuillez entrer les mots qui apparaissent dans la boîte ci-dessous ([[Special:Captcha/help|plus d’informations]]) :',
+ 'fancycaptcha-sendemail' => 'Pour protéger le wiki contre l’envoi automatisé de pourriels, nous vous demandons de bien vouloir entrer les mots qui apparaissent dans la boîte ci-dessous ([[Special:Captcha/help|plus d’informations]]) :',
'fancycaptcha-reload-text' => 'Actualiser',
);
@@ -508,25 +544,25 @@ Pour vérifier qu’il ne s’agit pas de pourriels automatisés, veuillez entre
$messages['frp'] = array(
'fancycaptcha-desc' => "G·ènèrator d’émâges ''captch·a'' anti-robots que demande una confirmacion d’homo des changements.",
'fancycaptcha-addurl' => 'Voutron changement encllut de lims de defôr novéls.
-Por nos édiér a combatre contre lo spame ôtomatisâ, volyéd buchiér los mots qu’aparèssont dens la bouèta ce-desot ([[Special:Captcha/help|més d’enformacions]]) :',
- 'fancycaptcha-badlogin' => 'Por nos édiér a combatre contre lo cassâjo ôtomatisâ de contresegnos, volyéd buchiér los mots qu’aparèssont dedens la bouèta ce-desot ([[Special:Captcha/help|més d’enformacions]]) :',
- 'fancycaptcha-createaccount' => 'Por nos édiér a combatre contre les crèacions ôtomatisâs de comptos, volyéd buchiér los mots qu’aparèssont dens la bouèta ce-desot ([[Special:Captcha/help|més d’enformacions]]) :',
+Por nos édiér a combatre contre lo spame ôtomatisâ, volyéd buchiér los mots qu’aparèssont dens la bouèta ce-desot ([[Special:Captcha/help|més d’enformacions]]) :', # Fuzzy
+ 'fancycaptcha-badlogin' => 'Por nos édiér a combatre contre lo cassâjo ôtomatisâ de contresegnos, volyéd buchiér los mots qu’aparèssont dedens la bouèta ce-desot ([[Special:Captcha/help|més d’enformacions]]) :', # Fuzzy
+ 'fancycaptcha-createaccount' => 'Por nos édiér a combatre contre les crèacions ôtomatisâs de comptos, volyéd buchiér los mots qu’aparèssont dens la bouèta ce-desot ([[Special:Captcha/help|més d’enformacions]]) :', # Fuzzy
'fancycaptcha-create' => 'Por fâre ceta pâge, volyéd buchiér los mots qu’aparèssont dens la bouèta ce-desot ([[Special:Captcha/help|més d’enformacions]]) :',
'fancycaptcha-edit' => 'Por changiér ceta pâge, volyéd buchiér los mots qu’aparèssont dens la bouèta ce-desot ([[Special:Captcha/help|més d’enformacions]]) :',
- 'fancycaptcha-sendemail' => 'Por nos édiér a combatre contre lo spame ôtomatisâ, volyéd buchiér los mots qu’aparèssont dens la bouèta ce-desot ([[Special:Captcha/help|més d’enformacions]]) :',
+ 'fancycaptcha-sendemail' => 'Por nos édiér a combatre contre lo spame ôtomatisâ, volyéd buchiér los mots qu’aparèssont dens la bouèta ce-desot ([[Special:Captcha/help|més d’enformacions]]) :', # Fuzzy
);
/** Western Frisian (Frysk)
* @author Snakesteuben
*/
$messages['fy'] = array(
- 'fancycaptcha-badlogin' => 'As ekstra beskerming tsjin automatysk ûntsiferjen fan wachtwurden wurdt jo frege de ûndersteande letters oer te tikken. ([[Special:Captcha/help|mear ynformaasje]]).',
+ 'fancycaptcha-badlogin' => 'As ekstra beskerming tsjin automatysk ûntsiferjen fan wachtwurden wurdt jo frege de ûndersteande letters oer te tikken. ([[Special:Captcha/help|mear ynformaasje]]).', # Fuzzy
);
/** Irish (Gaeilge)
*/
$messages['ga'] = array(
- 'fancycaptcha-createaccount' => 'Mar chosaint in éadan cuntais a chruthaítear go huathoibríoch, ionchuir na focail a thaispeántar san íomhá seo thíos: <br />([[Special:Captcha/help|tuilleadh eolais]])',
+ 'fancycaptcha-createaccount' => 'Mar chosaint in éadan cuntais a chruthaítear go huathoibríoch, ionchuir na focail a thaispeántar san íomhá seo thíos: <br />([[Special:Captcha/help|tuilleadh eolais]])', # Fuzzy
);
/** Galician (galego)
@@ -535,13 +571,13 @@ $messages['ga'] = array(
*/
$messages['gl'] = array(
'fancycaptcha-desc' => 'Xerador de imaxes CAPTCHA para Confirm Edit',
- 'fancycaptcha-addurl' => 'A súa edición inclúe ligazóns externas novas.
-Para contribuír na protección contra o spam automatizado, introduza as palabras que aparecen na caixa de embaixo ([[Special:Captcha/help|máis información]]):',
- 'fancycaptcha-badlogin' => 'Para contribuír a que non se descubran os contrasinais por medios automáticos, introduza as palabras que aparecen na caixa ([[Special:Captcha/help|máis información]]):',
- 'fancycaptcha-createaccount' => 'Para contribuír contra a creación automatizada de contas, introduza as palabras que aparecen na caixa ([[Special:Captcha/help|máis información]]):',
- 'fancycaptcha-create' => 'Para crear a páxina, introduza as palabras que aparecen na caixa de embaixo ([[Special:Captcha/help|máis información]]):',
- 'fancycaptcha-edit' => 'Para editar esta páxina, introduza as palabras que aparecen na caixa de embaixo ([[Special:Captcha/help|máis información]]):',
- 'fancycaptcha-sendemail' => 'Para contribuír na protección contra o spam automatizado, introduza as palabras que aparecen na caixa ([[Special:Captcha/help|máis información]]):',
+ 'fancycaptcha-addurl' => 'A súa edición inclúe novas ligazóns externas.
+Para protexer o wiki contra o spam automático, introduza as palabras que aparecen na caixa ([[Special:Captcha/help|máis información]]):',
+ 'fancycaptcha-badlogin' => 'Para protexer o wiki contra o roubo de contrasinais, introduza as palabras que aparecen na caixa ([[Special:Captcha/help|máis información]]):',
+ 'fancycaptcha-createaccount' => 'Para protexer o wiki contra a creación automática de contas, introduza as palabras que aparecen na caixa ([[Special:Captcha/help|máis información]]):',
+ 'fancycaptcha-create' => 'Para crear a páxina, introduza as palabras que aparecen na caixa ([[Special:Captcha/help|máis información]]):',
+ 'fancycaptcha-edit' => 'Para editar esta páxina, introduza as palabras que aparecen na caixa ([[Special:Captcha/help|máis información]]):',
+ 'fancycaptcha-sendemail' => 'Para protexer o wiki contra o spam automático, introduza as palabras que aparecen na caixa ([[Special:Captcha/help|máis información]]):',
'fancycaptcha-reload-text' => 'Refrescar',
);
@@ -552,27 +588,28 @@ Para contribuír na protección contra o spam automatizado, introduza as palabra
*/
$messages['gsw'] = array(
'fancycaptcha-addurl' => 'In Dyynere Bearbeitig het s neiji externi Link.
-Zum Schutz vor automatisiertem Spamming gib des Wort in s Fäld unten yy. Druck derno nomol uf „Syte spychere“. [[Special:Captcha/help|(Frogen oder Probläm?)]]',
- 'fancycaptcha-badlogin' => 'Zum Schutz vor ere Kompromittierig vu Dyynm Benutzerkonto gib des Wort in s Fäld unten yy [[Special:Captcha/help|(Frogen oder Probläm?)]]:',
- 'fancycaptcha-createaccount' => 'Zum Schutz vor ere automatisierte Aalag vu Benutzerkonte gib bitte des Wort in s Fäld unten yy ([[Special:Captcha/help|Frogen oder Probläm?]]):',
+Zum Schutz vor automatisiertem Spamming gib des Wort in s Fäld unten yy. Druck derno nomol uf „Syte spychere“. [[Special:Captcha/help|(Frogen oder Probläm?)]]', # Fuzzy
+ 'fancycaptcha-badlogin' => 'Zum Schutz vor ere Kompromittierig vu Dyynm Benutzerkonto gib des Wort in s Fäld unten yy [[Special:Captcha/help|(Frogen oder Probläm?)]]:', # Fuzzy
+ 'fancycaptcha-createaccount' => 'Zum Schutz vor ere automatisierte Aalag vu Benutzerkonte gib bitte des Wort in s Fäld unten yy ([[Special:Captcha/help|Frogen oder Probläm?]]):', # Fuzzy
'fancycaptcha-create' => 'Zum d Syten aalege gib des Wort in s Fäld unten yy. [[Special:Captcha/help|(Frogen oder Probläm?)]]',
'fancycaptcha-edit' => 'Zum d Syte bearbeite gib des Wort in s Fäld unten yy. [[Special:Captcha/help|(Frogen oder Probläm?)]]',
- 'fancycaptcha-sendemail' => 'As Schutz gege e automatischs Spamming, gib bitte des Wort in s Fäld unten yy ([[Special:Captcha/help|meh Informatione]]):',
+ 'fancycaptcha-sendemail' => 'As Schutz gege e automatischs Spamming, gib bitte des Wort in s Fäld unten yy ([[Special:Captcha/help|meh Informatione]]):', # Fuzzy
);
/** Gujarati (ગà«àªœàª°àª¾àª¤à«€)
+ * @author Ashok modhvadia
* @author Dsvyas
* @author Sushant savla
*/
$messages['gu'] = array(
- 'fancycaptcha-addurl' => 'તમારા ફેરફારમાં નવી બાહà«àª¯ કડીઓ શામિલ છે.
-તમે કરેલા ફેરફારોમાં નવી બાહà«àª¯ કડીઓ સામેલ છે. સà«àªµàªšàª¾àª²àª¿àª¤ સà«àªªà«‡àª®/સà«àªªàª¾àª®(spam) થી બચવા માટે નીચે આપેલા સરળ દાખલાનો જવાબ તેની બાજà«àª¨àª¾ ખાનામાં લખો
-([[Special:Captcha/help|more info]]):',
- 'fancycaptcha-badlogin' => 'આપોઆપ થતી ગà«àªªà«àª¤àª¸àª‚જà«àªžàª¾àª¨à«€ ચોરી (password cracking)થી બચાવવા માટે નીચે આપેલા શબà«àª¦ તેની બાજà«àª¨àª¾ ખાનામાં લખો ([[Special:Captcha/help|more info]]):',
- 'fancycaptcha-createaccount' => 'આપોઆપ નવા ખાતા ખà«àª²àª¤àª¾ રોકવા માટે નીચે દેખાતા શબà«àª¦à«‹ ખાનામાં લખો ([[Special:Captcha/help|વધૠમાહિતી]]):',
+ 'fancycaptcha-addurl' => 'તમે કરેલા ફેરફારોમાં નવી બાહà«àª¯ કડીઓ સામેલ છે.
+વિકિને સà«àªµàªšàª¾àª²àª¿àª¤ સà«àªªà«‡àª®/સà«àªªàª¾àª®(spam)થી બચાવવા માટે અમે તમને જણાવીઠછીઠકે કૃપયા નીચે આપેલા સરળ દાખલાનો જવાબ તેની બાજà«àª¨àª¾ ખાનામાં લખો.
+([[Special:Captcha/help|વધૠવિગત]]):',
+ 'fancycaptcha-badlogin' => 'આપોઆપ થતી ગà«àªªà«àª¤àª¸àª‚જà«àªžàª¾àª¨à«€ ચોરી (password cracking)થી વિકિને બચાવવા માટે અમે તમને જણાવીઠછીઠકે કૃપયા નીચે આપેલા શબà«àª¦ તેની બાજà«àª¨àª¾ ખાનામાં લખો. ([[Special:Captcha/help|વધૠવિગત]]):',
+ 'fancycaptcha-createaccount' => 'આપોઆપ નવા ખાતા ખà«àª²àª¤àª¾ રોકવા અને વિકીને તેનાથી બચાવવા માટે. અમે તમને જણાવીઠછીઠકે કૃપયા નીચે દેખાતા શબà«àª¦à«‹ ખાનામાં લખો. ([[Special:Captcha/help|વધૠમાહિતી]]):',
'fancycaptcha-create' => 'પાનà«àª‚ બનાવવા માટે નીચે દેખાતા શબà«àª¦à«‹ ખાનામાં ટાઈપ કરો ([[Special:Captcha/help|વધૠમાહિતી]]):',
'fancycaptcha-edit' => 'આ પાનામાં ફેરફાર કરવા માટે નીચે દેખાતા શબà«àª¦à«‹ ખાનામાં ટાઈપ કરો ([[Special:Captcha/help|વધૠમાહિતી]]):',
- 'fancycaptcha-sendemail' => 'આપોઆપ થતી સà«àªªà«…મીંગથી બચાવવા માટે નીચે આપેલા શબà«àª¦ તેની બાજà«àª¨àª¾ ખાનામાં લખો ([[Special:Captcha/help|more info]]):',
+ 'fancycaptcha-sendemail' => 'વિકિને આપોઆપ થતી સà«àªªà«…મીંગથી બચાવવા માટે. અમે તમને જણાવીઠછીઠકે કૃપયા નીચે આપેલા શબà«àª¦ તેની બાજà«àª¨àª¾ ખાનામાં લખો ([[Special:Captcha/help|વધૠમાહિતી]]):',
);
/** Hebrew (עברית)
@@ -582,7 +619,7 @@ $messages['gu'] = array(
$messages['he'] = array(
'fancycaptcha-desc' => 'מחולל תמונות CAPTCHA מגניבות בשביל ההרבחבה Confirm Edit',
'fancycaptcha-addurl' => '×¢×¨×™×›×ª×›× ×›×•×œ×œ×ª ×§×™×©×•×¨×™× ×—×™×¦×•× ×™×™× ×—×“×©×™×.
-×›×”×’× ×” מפני ספ×× ×וטומטי, ×× × ×”×§×œ×™×“×• ×ת ×”×ž×™×œ×™× ×”×ž×•×¤×™×¢×•×ª להלן בתיבה ([[Special:Captcha/help|מידע נוסף]]):',
+×›×”×’× ×” מפני זיבול ×וטומטי, ×× × ×”×§×œ×™×“×• ×ת ×”×ž×™×œ×™× ×”×ž×•×¤×™×¢×•×ª להלן בתיבה ([[Special:Captcha/help|מידע נוסף]]):',
'fancycaptcha-badlogin' => '×›×”×’× ×” מפני פריצת סיסמ×ות ×וטומטית, ×× × ×”×§×œ×™×“×• ×ת ×”×ž×™×œ×™× ×”×ž×•×¤×™×¢×•×ª להלן בתיבה ([[Special:Captcha/help|מידע נוסף]]):',
'fancycaptcha-createaccount' => '×›×”×’× ×” מפני יצירת חשבונות ×וטומטית, ×× × ×”×§×œ×™×“×• ×ת ×”×ž×™×œ×™× ×”×ž×•×¤×™×¢×•×ª להלן בתיבה ([[Special:Captcha/help|מידע נוסף]]):',
'fancycaptcha-create' => 'כדי ליצור ×ת הדף, ×× × ×”×§×œ×™×“×• ×ת ×”×ž×™×œ×™× ×”×ž×•×¤×™×¢×•×ª להלן בתיבה ([[Special:Captcha/help|מידע נוסף]]):',
@@ -597,9 +634,9 @@ $messages['he'] = array(
*/
$messages['hi'] = array(
'fancycaptcha-addurl' => 'आपके समà¥à¤ªà¤¾à¤¦à¤¨ में नई बाहरी कड़ियाठहैं।
-सà¥à¤µà¤šà¤¾à¤²à¤¿à¤¤ सà¥à¤ªà¥…म से बचाव में सहायता के लिये नीचे दिये हà¥à¤ शबà¥à¤¦ बकà¥à¤¸à¥‡ में लिखें ([[Special:Captcha/help|अधिक जानकारी]]):',
- 'fancycaptcha-badlogin' => 'सà¥à¤µà¤šà¤¾à¤²à¤¿à¤¤ कूटशबà¥à¤¦ चोरी से बचाव में सहायता के लिये नीचे दिये हà¥à¤ शबà¥à¤¦ बकà¥à¤¸à¥‡ में लिखें ([[Special:Captcha/help|अधिक जानकारी]]):',
- 'fancycaptcha-createaccount' => 'सà¥à¤µà¤šà¤¾à¤²à¤¿à¤¤ सदसà¥à¤¯ पंजीकरण से बचाव में सहायता के लिये नीचे दिये शबà¥à¤¦ बकà¥à¤¸à¥‡ में लिखें ([[Special:Captcha/help|अधिक जानकारी]]):',
+सà¥à¤µà¤šà¤¾à¤²à¤¿à¤¤ सà¥à¤ªà¥…म से बचाव में सहायता के लिये नीचे दिये हà¥à¤ शबà¥à¤¦ बकà¥à¤¸à¥‡ में लिखें ([[Special:Captcha/help|अधिक जानकारी]]):', # Fuzzy
+ 'fancycaptcha-badlogin' => 'सà¥à¤µà¤šà¤¾à¤²à¤¿à¤¤ कूटशबà¥à¤¦ चोरी से बचाव में सहायता के लिये नीचे दिये हà¥à¤ शबà¥à¤¦ बकà¥à¤¸à¥‡ में लिखें ([[Special:Captcha/help|अधिक जानकारी]]):', # Fuzzy
+ 'fancycaptcha-createaccount' => 'सà¥à¤µà¤šà¤¾à¤²à¤¿à¤¤ सदसà¥à¤¯ पंजीकरण से बचाव में सहायता के लिये नीचे दिये शबà¥à¤¦ बकà¥à¤¸à¥‡ में लिखें ([[Special:Captcha/help|अधिक जानकारी]]):', # Fuzzy
'fancycaptcha-create' => 'यह पृषà¥à¤  बनाने के लिये कृपया नीचे दिये शबà¥à¤¦ बकà¥à¤¸à¥‡ में लिखें ([[Special:Captcha/help|अधिक जानकारी]]):',
'fancycaptcha-edit' => 'यह पृषà¥à¤  बदलने के लिये, नीचे दिखने वाले अकà¥à¤·à¤° टेकà¥à¤¸à¥à¤Ÿ बकà¥à¤¸à¥‡à¤®à¥‡à¤‚ लिखें ([[Special:Captcha/help|अधिक जानकारी]]):',
);
@@ -609,27 +646,27 @@ $messages['hi'] = array(
*/
$messages['hr'] = array(
'fancycaptcha-addurl' => 'Vaše uređivanje sadrži nove vanjske poveznice. Kao zaštitu od automatskog spama,
-molimo unesite slova koja vidite na slici dolje: ([[Special:Captcha/help|Pomoć]])',
+molimo unesite slova koja vidite na slici dolje: ([[Special:Captcha/help|Pomoć]])', # Fuzzy
'fancycaptcha-badlogin' => 'Da se sprijeÄi automatiziranje pogaÄ‘anja lozinki, molimo unesite
-slova koja vidite na slici dolje: <br />([[Special:Captcha/help|Pomoć]])',
+slova koja vidite na slici dolje: <br />([[Special:Captcha/help|Pomoć]])', # Fuzzy
'fancycaptcha-createaccount' => 'Kao zaÅ¡titu od automatskog otvaranja raÄuna, pri otvaranju raÄuna trebate
-unijeti slova koja vidite na slici: <br />([[Special:Captcha/help|Pomoć]])',
+unijeti slova koja vidite na slici: <br />([[Special:Captcha/help|Pomoć]])', # Fuzzy
'fancycaptcha-create' => 'Da bi stvorili novu stranicu, molimo unesite
slova koja vidite na slici dolje: <br />([[Special:Captcha/help|Pomoć]])',
'fancycaptcha-edit' => 'Da bi uređivali ovu stranicu, molimo unesite slova koja vidite na slici dolje: <br />([[Special:Captcha/help|Pomoć]])',
- 'fancycaptcha-sendemail' => 'Da bi ste nam pomogli protiv automatskog spama, molimo unesite rijeÄi koje su prikazane ispod u okvir ([[Special:Captcha/help|viÅ¡e informacija]]):',
+ 'fancycaptcha-sendemail' => 'Da bi ste nam pomogli protiv automatskog spama, molimo unesite rijeÄi koje su prikazane ispod u okvir ([[Special:Captcha/help|viÅ¡e informacija]]):', # Fuzzy
);
/** Upper Sorbian (hornjoserbsce)
* @author Michawiki
*/
$messages['hsb'] = array(
- 'fancycaptcha-addurl' => 'W twojej zmÄ›nje su nowe eksterne wotkazy. Jako Å¡kitna naprawa pÅ™ećiwo awtomatiskemu spamej zapodaj proÅ¡u sćěhowace znamjeÅ¡ka do kašćika ([[Special:Captcha/help|Äehodla?]]).',
- 'fancycaptcha-badlogin' => 'Jako Å¡kitna naprawa pÅ™ećiwo awtomatiskemu zadobywanju do wužiwarskich kontow zapodaj proÅ¡u sćěhowace znamjeÅ¡ka do kašćika ([[Special:Captcha/help|Äehodla?]]):',
- 'fancycaptcha-createaccount' => 'Jako Å¡kitna naprawa pÅ™ećiwo awtomatiskemu wutworjenju wužiwarskich kontow zapodaj proÅ¡u sćěhowace znamjeÅ¡ka do kašćika ([[Special:Captcha/help|Äehodla?]]):',
+ 'fancycaptcha-addurl' => 'W twojej zmÄ›nje su nowe eksterne wotkazy. Jako Å¡kitna naprawa pÅ™ećiwo awtomatiskemu spamej zapodaj proÅ¡u sćěhowace znamjeÅ¡ka do kašćika ([[Special:Captcha/help|Äehodla?]]).', # Fuzzy
+ 'fancycaptcha-badlogin' => 'Jako Å¡kitna naprawa pÅ™ećiwo awtomatiskemu zadobywanju do wužiwarskich kontow zapodaj proÅ¡u sćěhowace znamjeÅ¡ka do kašćika ([[Special:Captcha/help|Äehodla?]]):', # Fuzzy
+ 'fancycaptcha-createaccount' => 'Jako Å¡kitna naprawa pÅ™ećiwo awtomatiskemu wutworjenju wužiwarskich kontow zapodaj proÅ¡u sćěhowace znamjeÅ¡ka do kašćika ([[Special:Captcha/help|Äehodla?]]):', # Fuzzy
'fancycaptcha-create' => 'Zo by stronu wutworić móhÅ‚ zapodaj proÅ¡u sćěhowace znamjeÅ¡ka do kašćika ([[Special:Captcha/help|Äehodla?]]):',
'fancycaptcha-edit' => 'Zo by stronu wobdźěłować móhÅ‚ zapodaj proÅ¡u sćěhowace znamjeÅ¡ka do kašćika ([[Special:Captcha/help|Äehodla?]]):',
- 'fancycaptcha-sendemail' => 'Za škit přećiwo awtomatiskemu spamowanju, zapodaj prošu słowa, kotrež so deleka w kašćiku jewi ([[Special:Captcha/help|dalše informacije]]):',
+ 'fancycaptcha-sendemail' => 'Za škit přećiwo awtomatiskemu spamowanju, zapodaj prošu słowa, kotrež so deleka w kašćiku jewi ([[Special:Captcha/help|dalše informacije]]):', # Fuzzy
);
/** Hungarian (magyar)
@@ -638,12 +675,12 @@ $messages['hsb'] = array(
* @author Glanthor Reviol
*/
$messages['hu'] = array(
- 'fancycaptcha-addurl' => 'A szerkesztésed új külső hivatkozásokat tartalmaz. Az automatizált spamek megelőzése miatt kérjük, hogy add meg a lenti keretben olvasható szavakat ([[Special:Captcha/help|további segítség]]):',
- 'fancycaptcha-badlogin' => 'Hogy az automatizált jelszópróbálkozásokat megelőzzük, kérjük, hogy add meg a lenti keretben olvasható szavakat ([[Special:Captcha/help|további segítség]]):',
- 'fancycaptcha-createaccount' => 'A felhasználói fiókok automatizált létrehozásának elkerülésére, kérlek, írd be az alább megjelenő szót a szövegdobozba ([[Special:Captcha/help|segítség]]):',
+ 'fancycaptcha-addurl' => 'A szerkesztésed új külső hivatkozásokat tartalmaz. Az automatizált spamek megelőzése miatt kérjük, hogy add meg a lenti keretben olvasható szavakat ([[Special:Captcha/help|további segítség]]):', # Fuzzy
+ 'fancycaptcha-badlogin' => 'Hogy az automatizált jelszópróbálkozásokat megelőzzük, kérjük, hogy add meg a lenti keretben olvasható szavakat ([[Special:Captcha/help|további segítség]]):', # Fuzzy
+ 'fancycaptcha-createaccount' => 'A felhasználói fiókok automatizált létrehozásának elkerülésére, kérlek, írd be az alább megjelenő szót a szövegdobozba ([[Special:Captcha/help|segítség]]):', # Fuzzy
'fancycaptcha-create' => 'A lap létrehozásához kérjük, hogy add meg a lenti keretben olvasható szavakat ([[Special:Captcha/help|további segítség]]):',
'fancycaptcha-edit' => 'A szerkesztésed új külső linkeket tartalmaz. A spam-robotok elleni védekezés elősegítésére kérlek írd be az alább megjelenő szót a szövegdobozba ([[Special:Captcha/help|segítség]]):',
- 'fancycaptcha-sendemail' => 'Hogy segíts az automatikus spammelés elleni védekezésben, kérünk írd be az alábbi szavakat a szövegdobozba ([[Special:Captcha/help|segítség]]):',
+ 'fancycaptcha-sendemail' => 'Hogy segíts az automatikus spammelés elleni védekezésben, kérünk írd be az alábbi szavakat a szövegdobozba ([[Special:Captcha/help|segítség]]):', # Fuzzy
);
/** Interlingua (interlingua)
@@ -651,12 +688,13 @@ $messages['hu'] = array(
*/
$messages['ia'] = array(
'fancycaptcha-addurl' => 'Tu modification include nove ligamines externe.
-Como protection contra le spam automatic, per favor entra le parolas que appare infra in le quadro ([[Special:Captcha/help|plus info]]):',
- 'fancycaptcha-badlogin' => 'Como protection contra le piratage automatic de contrasignos, per favor entra le parolas que appare infra in le quadro ([[Special:Captcha/help|plus info]]):',
- 'fancycaptcha-createaccount' => 'Como protection contra le creation automatic de contos, per favor entra le parolas que appare infra in le quadro ([[Special:Captcha/help|plus info]]):',
+Pro adjutar a proteger le wiki contra le spam automatisate, per favor entra le parolas que appare infra in le quadro ([[Special:Captcha/help|plus info]]):',
+ 'fancycaptcha-badlogin' => 'Pro adjutar a proteger le wiki contra le furto automatisate de contrasignos, per favor entra le parolas que appare infra in le quadro ([[Special:Captcha/help|plus info]]):',
+ 'fancycaptcha-createaccount' => 'Pro adjutar a proteger le wiki contra le creation automatisate de contos, per favor entra le parolas que appare infra in le quadro ([[Special:Captcha/help|plus info]]):',
'fancycaptcha-create' => 'Pro crear le pagina, per favor entra le parolas que appare infra in le quadro ([[Special:Captcha/help|plus info]]):',
'fancycaptcha-edit' => 'Pro modificar iste pagina, per favor entra le parolas que appare infra in le quadro ([[Special:Captcha/help|plus info]]):',
- 'fancycaptcha-sendemail' => 'Pro adjutar nos in le protection contra le spam automatic, per favor entra le parolas que appare hic infra in le quadro ([[Special:Captcha/help|plus info]]):',
+ 'fancycaptcha-sendemail' => 'Pro adjutar a proteger le wiki contra le spam automatisate, per favor entra le parolas que appare infra in le quadro ([[Special:Captcha/help|plus info]]):',
+ 'fancycaptcha-reload-text' => 'Refrescar',
);
/** Indonesian (Bahasa Indonesia)
@@ -665,25 +703,26 @@ Como protection contra le spam automatic, per favor entra le parolas que appare
* @author Iwan Novirion
*/
$messages['id'] = array(
- 'fancycaptcha-addurl' => 'Suntingan Anda mencantumkan pranala luar baru. Untuk pelindungan terhadap spam otomatis, harap masukkan kata di bawah ini ke dalam kotak yang tersedia ([[Special:Captcha/help|info lengkap]]):',
- 'fancycaptcha-badlogin' => 'Sebagai pelindungan terhadap pemecah kata kunci otomatis, harap masukkan kata di bawah ini ke dalam kotak yang tersedia ([[Special:Captcha/help|info lengkap]]):',
- 'fancycaptcha-createaccount' => 'Untuk pelindungan terhadap pembuatan akun otomatis, tolong masukkan kata di bawah ini ke dalam kotak yang tersedia ([[Special:Captcha/help|info lengkap]]):',
+ 'fancycaptcha-addurl' => 'Suntingan Anda mencantumkan pranala luar baru. Untuk pelindungan terhadap spam otomatis, harap masukkan kata di bawah ini ke dalam kotak yang tersedia ([[Special:Captcha/help|info lengkap]]):', # Fuzzy
+ 'fancycaptcha-badlogin' => 'Sebagai pelindungan terhadap pemecah kata kunci otomatis, harap masukkan kata di bawah ini ke dalam kotak yang tersedia ([[Special:Captcha/help|info lengkap]]):', # Fuzzy
+ 'fancycaptcha-createaccount' => 'Untuk pelindungan terhadap pembuatan akun otomatis, tolong masukkan kata di bawah ini ke dalam kotak yang tersedia ([[Special:Captcha/help|info lengkap]]):', # Fuzzy
'fancycaptcha-create' => 'Untuk membuat halaman, silahkan masukkan kata-kata yang muncul di bawah ini ke dalam kotak yang tersedia ([[Special:Captcha/help|info lengkap]]):',
'fancycaptcha-edit' => 'Untuk menyunting halaman ini, silahkan masukkan kata-kata yang muncul di bawah ini ke dalam kotak yang tersedia ([[Special:Captcha/help|info lengkap]]):',
- 'fancycaptcha-sendemail' => 'Sebagai pelindungan terhadap spam otomatis, silahkan masukkan kata-kata yang muncul di bawah ini ke dalam kotak yang tersedia ([[Special:Captcha/help|info lengkap]]):',
+ 'fancycaptcha-sendemail' => 'Sebagai pelindungan terhadap spam otomatis, silahkan masukkan kata-kata yang muncul di bawah ini ke dalam kotak yang tersedia ([[Special:Captcha/help|info lengkap]]):', # Fuzzy
);
/** Iloko (Ilokano)
* @author Lam-ang
*/
$messages['ilo'] = array(
- 'fancycaptcha-addurl' => 'Ti inurnos mo ket adda nagyan na a baro a panilpo ti ruar.
-Tapno masalakniban kadagiti automatiko a spam, pangaasim nga ikabil ti balikas nga agparang dita baba a kahon. ([[Special:Captcha/help|adu pay a pakaammo]]):',
- 'fancycaptcha-badlogin' => 'Tapno masalakniban kadagiti automatiko a pinagsulbar ti kontrasenias, pangaasim nga ikabil ti balikas nga agparang dita baba a kahon. ([[Special:Captcha/help|adu pay a pakaammo]]):',
- 'fancycaptcha-createaccount' => 'Tapno makasalaknib kadagiti automatiko a pinagaramid ti pakabilangan, pangaasim nga ikabil ti balikas nga agparang dita baba a kahon. ([[Special:Captcha/help|adu pay a pakaammo]]):',
+ 'fancycaptcha-addurl' => 'Dagiti inurnosmo ket aglaon kadagiti baro a silpo ti ruar.
+Tapno masalakniban ti wiki kadagiti automatiko nga spam, naemmakami nga agdawat nga ikabilmo dagiti balikas nga agparang dita baba iti kahon ([[Special:Captcha/help|adu pay a pakaammo]]):',
+ 'fancycaptcha-badlogin' => 'Tapno masalakniban kadagiti automatiko a panagsulbar ti kontrasenias, naemmakami nga agdawat nga ikabilmo dagiti balikas nga agparang dita baba iti kahon ([[Special:Captcha/help|adu pay a pakaammo]]):',
+ 'fancycaptcha-createaccount' => 'Tapno makasalakniban ti wiki kadagiti automatiko a panagpartuat ti pakabilangan, naemmakami nga agdawat nga ikabilmo dagiti balikas nga agparang dita baba iti kahon ([[Special:Captcha/help|adu pay a pakaammo]]):',
'fancycaptcha-create' => 'Tapno makaaramid ti panid, pangaasim nga ikabil ti balikas nga agparang dita baba a kahon. ([[Special:Captcha/help|adu pay a pakaammo]]):',
'fancycaptcha-edit' => 'Tapno makaurnos daytoy a panid, pangaasim nga ikabil ti balikas nga agparang dita baba a kahon. ([[Special:Captcha/help|adu pay a pakaammo]]):',
- 'fancycaptcha-sendemail' => 'Tapno makasalaknib kadagiti automatiko a pinagspam, pangaasim nga ikabil ti balikas nga agparang dita baba a kahon. ([[Special:Captcha/help|adu pay a pakaammo]]):',
+ 'fancycaptcha-sendemail' => 'Tapno makasalakniban ti wiki kadagiti automatiko a panag-spam, naemmakami nga agdawat nga ikabilmo dagiti balikas nga agparang dita baba iti kahon ([[Special:Captcha/help|adu pay a pakaammo]]):',
+ 'fancycaptcha-reload-text' => 'Pasadiwaen',
);
/** Icelandic (íslenska)
@@ -691,12 +730,12 @@ Tapno masalakniban kadagiti automatiko a spam, pangaasim nga ikabil ti balikas
*/
$messages['is'] = array(
'fancycaptcha-addurl' => 'Breytingin þín inniheldur viðbætta ytri tengla.
-Til þess að hjálpa okkur verjast sjálfvirku auglýsingarusli, vinsamlegast sláðu inn orðin sem birtast hér fyrir neðan í reitinn ([[Special:Captcha/help|frekari upplýsingar]]):',
- 'fancycaptcha-badlogin' => 'Til þess að hjálpa okkur að verjast gegn sjálfvirkum leyniorðaárásum, vinsamlegast sláðu inn orðin sem birtast hér fyrir neðan í reitinn ([[Special:Captcha/help|frekari upplýsingar]]):',
- 'fancycaptcha-createaccount' => 'Til þess að hjálpa okkur að verjast sjálfvirkri stofnun aðganga, vinsamlegast sláðu inn orðin sem birtast hér fyrir neðan í reitinn ([[Special:Captcha/help|frekari upplýsingar]]):',
+Til þess að hjálpa okkur verjast sjálfvirku auglýsingarusli, vinsamlegast sláðu inn orðin sem birtast hér fyrir neðan í reitinn ([[Special:Captcha/help|frekari upplýsingar]]):', # Fuzzy
+ 'fancycaptcha-badlogin' => 'Til þess að hjálpa okkur að verjast gegn sjálfvirkum leyniorðaárásum, vinsamlegast sláðu inn orðin sem birtast hér fyrir neðan í reitinn ([[Special:Captcha/help|frekari upplýsingar]]):', # Fuzzy
+ 'fancycaptcha-createaccount' => 'Til þess að hjálpa okkur að verjast sjálfvirkri stofnun aðganga, vinsamlegast sláðu inn orðin sem birtast hér fyrir neðan í reitinn ([[Special:Captcha/help|frekari upplýsingar]]):', # Fuzzy
'fancycaptcha-create' => 'Til þess að búa til þessa síðu, vinsamlegast sláðu inn orðin sem birtast hér fyrir neðan í reitinn ([[Special:Captcha/help|frekari upplýsingar]]):',
'fancycaptcha-edit' => 'Til þess að breyta þessari síðu, vinsamlegast sláðu inn orðin að neðan í reitinn ([[Special:Captcha/help|frekari upplýsingar]]):',
- 'fancycaptcha-sendemail' => 'Til þess að hjálpa okkur að verjast sjálfvirkum auglýsingapósti, vinsamlegast sláðu inn orðin hér fyrir neðan í reitinn ([[Special:Captcha/help|frekari upplýsinngar]]):',
+ 'fancycaptcha-sendemail' => 'Til þess að hjálpa okkur að verjast sjálfvirkum auglýsingapósti, vinsamlegast sláðu inn orðin hér fyrir neðan í reitinn ([[Special:Captcha/help|frekari upplýsinngar]]):', # Fuzzy
'fancycaptcha-reload-text' => 'Endurhlaða',
);
@@ -704,14 +743,15 @@ Til þess að hjálpa okkur verjast sjálfvirku auglýsingarusli, vinsamlegast s
* @author Beta16
* @author BrokenArrow
* @author Darth Kule
+ * @author Nemo bis
*/
$messages['it'] = array(
- 'fancycaptcha-addurl' => "La modifica richiesta aggiunge dei collegamenti esterni alla pagina; come misura precauzionale contro l'inserimento automatico di spam, si prega di inserire nella casella sottostante le parole che compaiono di seguito ([[Special:Captcha/help|come funziona?]]):",
- 'fancycaptcha-badlogin' => 'Come misura precauzionale contro i tentativi di forzatura automatica della password, si prega di inserire nella casella sottostante le parole che compaiono di seguito ([[Special:Captcha/help|come funziona?]]):',
- 'fancycaptcha-createaccount' => 'Come misura precauzionale contro i tentativi di creazione automatica degli account, si prega di inserire nella casella sottostante le parole che compaiono di seguito ([[Special:Captcha/help|come funziona?]]):',
+ 'fancycaptcha-addurl' => "La modifica richiesta aggiunge dei collegamenti esterni alla pagina; come misura precauzionale contro l'inserimento automatico di spam, ti chiediamo gentilmente di inserire nella casella sottostante le parole che compaiono di seguito ([[Special:Captcha/help|come funziona?]]):",
+ 'fancycaptcha-badlogin' => 'Come misura precauzionale contro i tentativi di forzatura automatica della password, ti chiediamo gentilmente di inserire nella casella sottostante le parole che compaiono di seguito ([[Special:Captcha/help|come funziona?]]):',
+ 'fancycaptcha-createaccount' => 'Come misura precauzionale contro i tentativi di registrazione automatica, ti chiediamo gentilmente di inserire nella casella sottostante le parole che compaiono di seguito ([[Special:Captcha/help|come funziona?]]):',
'fancycaptcha-create' => 'Per creare la pagina si prega di inserire nella casella sottostante le parole che compaiono nella casella di seguito ([[Special:Captcha/help|come funziona?]]):',
'fancycaptcha-edit' => 'Per modificare questa pagina si prega di inserire nella casella sottostante le parole che compaiono di seguito ([[Special:Captcha/help|come funziona?]]):',
- 'fancycaptcha-sendemail' => 'Come misura precauzionale nei confronti dei messaggi di spam automatici, si prega di inserire nella casella sottostante le parole che compaiono di seguito ([[Special:Captcha/help|come funziona?]]):',
+ 'fancycaptcha-sendemail' => 'Come misura precauzionale nei confronti dei messaggi di spam automatici, ti chiediamo gentilmente di inserire nella casella sottostante le parole che compaiono di seguito ([[Special:Captcha/help|come funziona?]]):',
'fancycaptcha-reload-text' => 'Aggiorna',
);
@@ -724,22 +764,23 @@ $messages['it'] = array(
$messages['ja'] = array(
'fancycaptcha-desc' => 'Confirm Edit 用ã®è£…飾的㪠CAPTCHA ジェãƒãƒ¬ãƒ¼ã‚¿ãƒ¼',
'fancycaptcha-addurl' => 'ã‚ãªãŸã¯æ–°ã—ã„外部リンクを追加ã—よã†ã¨ã—ã¦ã„ã¾ã™ã€‚
-自動ã§ã®ã‚¹ãƒ‘ム攻撃を防ããŸã‚ã€ä¸‹è¨˜ã®ç¢ºèªç”¨ã®æ–‡å­—列を欄ã«å…¥åŠ›ã—ã¦ãã ã•ã„ ([[Special:Captcha/help|詳細]]):',
- 'fancycaptcha-badlogin' => '自動ã§ã®ãƒ‘スワードクラック攻撃を防ããŸã‚ã€ä¸‹è¨˜ã®ç¢ºèªç”¨ã®æ–‡å­—列を欄ã«å…¥åŠ›ã—ã¦ãã ã•ã„ ([[Special:Captcha/help|詳細]]):',
- 'fancycaptcha-createaccount' => 'アカウントã®è‡ªå‹•ç™»éŒ²ã‚’防ããŸã‚ã€ä¸‹è¨˜ã®ç¢ºèªç”¨ã®æ–‡å­—列を欄ã«å…¥åŠ›ã—ã¦ãã ã•ã„ ([[Special:Captcha/help|詳細]]):',
+ウィキã¸ã®è‡ªå‹•ã‚¹ãƒ‘ム攻撃を防ããŸã‚ã€ãŠæ‰‹æ•°ã‚’ãŠã‹ã‘ã—ã¾ã™ãŒä¸‹è¨˜ã®ç¢ºèªç”¨ã®æ–‡å­—列を欄ã«å…¥åŠ›ã—ã¦ãã ã•ã„ ([[Special:Captcha/help|詳細]]):',
+ 'fancycaptcha-badlogin' => 'ウィキã¸ã®è‡ªå‹•ãƒ‘スワードクラック攻撃を防ããŸã‚ã€ãŠæ‰‹æ•°ã‚’ãŠã‹ã‘ã—ã¾ã™ãŒä¸‹è¨˜ã®ç¢ºèªç”¨ã®æ–‡å­—列を欄ã«å…¥åŠ›ã—ã¦ãã ã•ã„ ([[Special:Captcha/help|詳細]]):',
+ 'fancycaptcha-createaccount' => 'ウィキã§ã®ã‚¢ã‚«ã‚¦ãƒ³ãƒˆè‡ªå‹•ä½œæˆã‚’防ããŸã‚ã€ãŠæ‰‹æ•°ã‚’ãŠã‹ã‘ã—ã¾ã™ãŒä¸‹è¨˜ã®ç¢ºèªç”¨ã®æ–‡å­—列を欄ã«å…¥åŠ›ã—ã¦ãã ã•ã„ ([[Special:Captcha/help|詳細]]):',
'fancycaptcha-create' => 'ページを新è¦ä½œæˆã™ã‚‹ã«ã¯ã€ä¸‹è¨˜ã®ç¢ºèªç”¨ã®æ–‡å­—列を欄ã«å…¥åŠ›ã—ã¦ãã ã•ã„ ([[Special:Captcha/help|詳細]]):',
'fancycaptcha-edit' => 'ã“ã®ãƒšãƒ¼ã‚¸ã‚’編集ã™ã‚‹ã«ã¯ã€ä¸‹è¨˜ã®ç¢ºèªç”¨ã®æ–‡å­—列を欄ã«å…¥åŠ›ã—ã¦ãã ã•ã„ ([[Special:Captcha/help|詳細]]):',
- 'fancycaptcha-sendemail' => '自動ã§ã®ã‚¹ãƒ‘ム攻撃を防ããŸã‚ã€ä¸‹è¨˜ã®ç¢ºèªç”¨ã®æ–‡å­—列を欄ã«å…¥åŠ›ã—ã¦ãã ã•ã„ ([[Special:Captcha/help|詳細]]):',
+ 'fancycaptcha-sendemail' => 'ウィキã¸ã®è‡ªå‹•ã‚¹ãƒ‘ム攻撃を防ããŸã‚ã€ãŠæ‰‹æ•°ã‚’ãŠã‹ã‘ã—ã¾ã™ãŒä¸‹è¨˜ã®ç¢ºèªç”¨ã®æ–‡å­—列を欄ã«å…¥åŠ›ã—ã¦ãã ã•ã„ ([[Special:Captcha/help|詳細]]):',
'fancycaptcha-reload-text' => 'æ›´æ–°',
);
/** Jutish (jysk)
+ * @author Christian List
* @author Huslåke
*/
$messages['jut'] = array(
- 'fancycaptcha-addurl' => 'Din ændring tilføjer nye eksterne henvisninger. For at beskytte mod automatiseret spam, skal du indtaste ordet som vises nedenfor i feltet under det. ([[Special:Captcha/help|mere information]]):',
- 'fancycaptcha-badlogin' => 'For at beskytte mod automatiske forsøg på at gætte kodeord, skal du indtaste ordet som vises nedenfor i feltet under det. ([[Special:Captcha/help|mere information]]):',
- 'fancycaptcha-createaccount' => 'For at beskytte mod automatisk oprettelse af brugernavne, der bruges til spam, skal du indtaste ordet som vises nedenfor i feltet under det. ([[Special:Captcha/help|mere information]]):',
+ 'fancycaptcha-addurl' => 'Din ændring tilføjer nye eksterne henvisninger. For at beskytte mod automatiseret spam, skal du indtaste ordet som vises nedenfor i feltet under det. ([[Special:Captcha/help|mere information]]):', # Fuzzy
+ 'fancycaptcha-badlogin' => 'For at beskytte mod automatiske forsøg på at gætte adgangskoden, skal du indtaste ordet som vises i feltet nedenfor. ([[Special:Captcha/help|mere information]]):',
+ 'fancycaptcha-createaccount' => 'For at beskytte mod automatisk oprettelse af brugernavne, der bruges til spam, skal du indtaste ordet som vises nedenfor i feltet under det. ([[Special:Captcha/help|mere information]]):', # Fuzzy
'fancycaptcha-create' => 'For at oprette en ny side, skal du indtaste ordet som vises nedenfor i feltet under det. ([[Special:Captcha/help|mere information]]):',
'fancycaptcha-edit' => 'or at redigere denne side
([[Special:Captcha/help|more info]]):',
@@ -749,9 +790,9 @@ $messages['jut'] = array(
* @author Meursault2004
*/
$messages['jv'] = array(
- 'fancycaptcha-addurl' => 'Suntingan panjenengan iku ngandhut pranala jaba anyar. Kanggo pangreksan marang spam otomatis, mangga lebokna tembung sing kapacak ing ngisor iki ing kothak sing wis cumepak ([[Special:Captcha/help|info jangkep]]):',
- 'fancycaptcha-badlogin' => 'Kanggo ngréwangi pangreksan marang parengkahan kunci sandhi otomatis, mangga lebokna tembung sing kapacak ing ngisor iki ing kothak sing wis cumepak ([[Special:Captcha/help|info jangkep]]):',
- 'fancycaptcha-createaccount' => 'Minangka pangreksan marang rékening (akun) sing digawé otomatis, tulung lebokna tembung sing kapacak ing ngisor iki ing kothak sing wis cumepak ([[Special:Captcha/help|info jangkep]]):',
+ 'fancycaptcha-addurl' => 'Suntingan panjenengan iku ngandhut pranala jaba anyar. Kanggo pangreksan marang spam otomatis, mangga lebokna tembung sing kapacak ing ngisor iki ing kothak sing wis cumepak ([[Special:Captcha/help|info jangkep]]):', # Fuzzy
+ 'fancycaptcha-badlogin' => 'Kanggo ngréwangi pangreksan marang parengkahan kunci sandhi otomatis, mangga lebokna tembung sing kapacak ing ngisor iki ing kothak sing wis cumepak ([[Special:Captcha/help|info jangkep]]):', # Fuzzy
+ 'fancycaptcha-createaccount' => 'Minangka pangreksan marang rékening (akun) sing digawé otomatis, tulung lebokna tembung sing kapacak ing ngisor iki ing kothak sing wis cumepak ([[Special:Captcha/help|info jangkep]]):', # Fuzzy
'fancycaptcha-create' => 'Suntingan panjenengan ngandhut pranala jaba anyar. Kanggo nggawé kaca iki, mangga isèkna tembung-tembung sing ana ing kothak iki ([[Special:Captcha/help|info jangkep]]):',
'fancycaptcha-edit' => 'Suntingan panjenengan ngandhut pranala jaba anyar. Kanggo nyunting kaca iki, mangga isèkna tembung-tembung sing ana ing kothak iki ([[Special:Captcha/help|info jangkep]]):',
);
@@ -762,12 +803,12 @@ $messages['jv'] = array(
*/
$messages['ka'] = array(
'fancycaptcha-addurl' => 'თქვენი ცვლილებრშეიცáƒáƒ•áƒ¡ áƒáƒ®áƒáƒš გáƒáƒ áƒ” ბმულებს.
-áƒáƒ•áƒ¢áƒáƒ›áƒáƒ¢áƒ£áƒ áƒ˜ სპáƒáƒ›áƒ˜áƒœáƒ’ისგáƒáƒœ თáƒáƒ•áƒ“áƒáƒªáƒ•áƒ˜áƒ¡ მიზნით, გთხáƒáƒ•áƒ—, შეიყვáƒáƒœáƒáƒ— ქვემáƒáƒ— მáƒáƒªáƒ”მული სიტყვები ყუთში ([[Special:Captcha/help|მეტი ინფáƒáƒ áƒ›áƒáƒªáƒ˜áƒ]]):',
- 'fancycaptcha-badlogin' => 'პáƒáƒ áƒáƒšáƒ”ბის áƒáƒ•áƒ¢áƒáƒ›áƒáƒ¢áƒ£áƒ áƒ˜ გáƒáƒ¢áƒ”ხვისგáƒáƒœ თáƒáƒ•áƒ“áƒáƒªáƒ•áƒ˜áƒ¡ მიზნით, გთხáƒáƒ•áƒ—, შეიყვáƒáƒœáƒáƒ— ქვემáƒáƒ— მáƒáƒªáƒ”მული სიტყვები ყუთში ([[Special:Captcha/help|მეტი ინფáƒáƒ áƒ›áƒáƒªáƒ˜áƒ]]):',
- 'fancycaptcha-createaccount' => 'áƒáƒœáƒ’áƒáƒ áƒ˜áƒ¨áƒ”ბის áƒáƒ•áƒ¢áƒáƒ›áƒáƒ¢áƒ£áƒ áƒ˜ რეგისტრáƒáƒªáƒ˜áƒ˜áƒ¡áƒáƒ’áƒáƒœ თáƒáƒ•áƒ“áƒáƒªáƒ•áƒ˜áƒ¡ მიზნით, გთხáƒáƒ•áƒ—, შეიყვáƒáƒœáƒáƒ— ნáƒáƒ©áƒ•áƒ”ნები სიმბáƒáƒšáƒáƒ”ბი ტექსტურ ველში ([[Special:Captcha/help|დეტáƒáƒšáƒ£áƒ áƒáƒ“]]):',
+ვიკის áƒáƒ•áƒ¢áƒáƒ›áƒáƒ¢áƒ£áƒ áƒ˜ სპáƒáƒ›áƒ˜áƒœáƒ’ისგáƒáƒœ თáƒáƒ•áƒ“áƒáƒªáƒ•áƒ˜áƒ¡ მიზნით, ჩვენ მáƒáƒ’იწáƒáƒ“ებთ, შეიყვáƒáƒœáƒáƒ— ქვემáƒáƒ— მáƒáƒªáƒ”მული სიტყვები ყუთში ([[Special:Captcha/help|მეტი ინფáƒáƒ áƒ›áƒáƒªáƒ˜áƒ]]):',
+ 'fancycaptcha-badlogin' => 'ვიკის პáƒáƒ áƒáƒšáƒ”ბის áƒáƒ•áƒ¢áƒáƒ›áƒáƒ¢áƒ£áƒ áƒ˜ გáƒáƒ¢áƒ”ხვისგáƒáƒœ თáƒáƒ•áƒ“áƒáƒªáƒ•áƒ˜áƒ¡ მიზნით, ჩვენ მáƒáƒ’იწáƒáƒ“ებთ, შეიყვáƒáƒœáƒáƒ— ქვემáƒáƒ— მáƒáƒªáƒ”მული სიტყვები ყუთში ([[Special:Captcha/help|მეტი ინფáƒáƒ áƒ›áƒáƒªáƒ˜áƒ]]):',
+ 'fancycaptcha-createaccount' => 'ვიკის áƒáƒœáƒ’áƒáƒ áƒ˜áƒ¨áƒ”ბის áƒáƒ•áƒ¢áƒáƒ›áƒáƒ¢áƒ£áƒ áƒ˜ რეგისტრáƒáƒªáƒ˜áƒ˜áƒ¡áƒáƒ’áƒáƒœ თáƒáƒ•áƒ“áƒáƒªáƒ•áƒ˜áƒ¡ მიზნით, ჩვენ მáƒáƒ’იწáƒáƒ“ებთ, შეიყვáƒáƒœáƒáƒ— ნáƒáƒ©áƒ•áƒ”ნები სიმბáƒáƒšáƒáƒ”ბი ტექსტურ ველში ([[Special:Captcha/help|დეტáƒáƒšáƒ£áƒ áƒáƒ“]]):',
'fancycaptcha-create' => 'გვერდის შესáƒáƒ¥áƒ›áƒœáƒ”ლáƒáƒ“, გთხáƒáƒ•áƒ—, შეიყვáƒáƒœáƒ”თ áƒáƒ¡áƒáƒ”ბი, რáƒáƒ›áƒšáƒ”ბიც ნáƒáƒ©áƒ•áƒ”ნებირქვედრსურáƒáƒ—ზე ([[Special:Captcha/help|დეტáƒáƒšáƒ£áƒ áƒáƒ“…]]):',
'fancycaptcha-edit' => 'გვერდის რედáƒáƒ¥áƒ¢áƒ˜áƒ áƒ”ბისáƒáƒ—ვის, გთხáƒáƒ•áƒ—, შეიყვáƒáƒœáƒ”თ áƒáƒ¡áƒáƒ”ბი, რáƒáƒ›áƒšáƒ”ბიც ნáƒáƒ©áƒ•áƒ”ნებირქვედრსურáƒáƒ—ზე ([[Special:Captcha/help|დეტáƒáƒšáƒ£áƒ áƒáƒ“…]]):',
- 'fancycaptcha-sendemail' => 'áƒáƒ•áƒ¢áƒáƒ›áƒáƒ¢áƒ£áƒ áƒ˜ სპáƒáƒ›áƒ˜áƒ¡áƒáƒ’áƒáƒœ თáƒáƒ•áƒ“áƒáƒªáƒ•áƒ˜áƒ¡ მიზნით, გთხáƒáƒ•áƒ—, შეიყვáƒáƒœáƒáƒ— ქვევით ნáƒáƒ©áƒ•áƒ”ნები სიტყვრტექსტურ ველში ([[Special:Captcha/help|მეტი ინფáƒáƒ áƒ›áƒáƒªáƒ˜áƒ]]):',
+ 'fancycaptcha-sendemail' => 'ვიკის áƒáƒ•áƒ¢áƒáƒ›áƒáƒ¢áƒ£áƒ áƒ˜ სპáƒáƒ›áƒ˜áƒ¡áƒáƒ’áƒáƒœ თáƒáƒ•áƒ“áƒáƒªáƒ•áƒ˜áƒ¡ მიზნით, ჩვენ მáƒáƒ’იწáƒáƒ“ებთ, შეიყვáƒáƒœáƒáƒ— ქვევით ნáƒáƒ©áƒ•áƒ”ნები სიტყვრტექსტურ ველში ([[Special:Captcha/help|მეტი ინფáƒáƒ áƒ›áƒáƒªáƒ˜áƒ]]):',
);
/** Kara-Kalpak (Qaraqalpaqsha)
@@ -794,6 +835,7 @@ $messages['kk-arab'] = array(
);
/** Kazakh (Cyrillic script) (қазақша (кирил)‎)
+ * @author Arystanbek
*/
$messages['kk-cyrl'] = array(
'fancycaptcha-addurl' => 'Түзетуіңізде жаңа Ñыртқы Ñілтемелер бар екен. Өздік түрде «Ñпам» жаÑалуынан қорғану үшін,
@@ -806,6 +848,7 @@ $messages['kk-cyrl'] = array(
төмендегі көрÑетілген Ñөздерді аумаққа енгізіңіз ([[{{ns:special}}:Captcha/help|көбірек ақпарат]]):', # Fuzzy
'fancycaptcha-edit' => 'Түзетуіңізде жаңа Ñыртқы Ñілтемелер бар екен. Өздік түрде «Ñпам» жаÑалуынан қорғану үшін,
төмендегі көрÑетілген Ñөздерді аумаққа енгізіңіз ([[{{ns:special}}:Captcha/help|көбірек ақпарат]]):', # Fuzzy
+ 'fancycaptcha-reload-text' => 'Жаңарту',
);
/** Kazakh (Latin script) (qazaqşa (latın)‎)
@@ -830,8 +873,8 @@ tömendegi körsetilgen sözderdi awmaqqa engiziñiz ([[{{ns:special}}:Captcha/h
$messages['km'] = array(
'fancycaptcha-addurl' => 'កំណែប្រែរបស់អ្នកមានážáŸ†ážŽáž—្ជាប់ážáž¶áž„ក្រៅ។
-ដើម្បីការពារពីស្ប៉ាម(spam)ស្វáŸáž™áž”្រវážáŸ’ážáž· សូមបញ្ជូលពាក្យážáž¶áž„ក្រោមទៅក្នុងប្រអប់ ([[Special:Captcha/help|áž–áŸážáŸŒáž˜áž¶áž“បន្ážáŸ‚ម]])៖',
- 'fancycaptcha-badlogin' => 'ដើម្បីការពារការបំបែកពាក្យសំងាážáŸ‹ážŠáŸ„យស្វáŸáž™áž”្រវážáŸ’ážáž· សូមបញ្ជូលពាក្យážáž¶áž„ក្រោមទៅក្នុងប្រអប់ ([[Special:Captcha/help|áž–áŸážáŸŒáž˜áž¶áž“បន្ážáŸ‚ម]])៖',
+ដើម្បីការពារពីស្ប៉ាមស្វáŸáž™áž”្រវážáŸ’ážáž· សូមបញ្ជូលពាក្យážáž¶áž„ក្រោមទៅក្នុងប្រអប់ ([[Special:Captcha/help|áž–áŸážáŸŒáž˜áž¶áž“បន្ážáŸ‚ម]])៖',
+ 'fancycaptcha-badlogin' => 'ដើម្បីការពារការបំបែកពាក្យសម្ងាážáŸ‹ážŠáŸ„យស្វáŸáž™áž”្រវážáŸ’ážáž· សូមបញ្ជូលពាក្យážáž¶áž„ក្រោមទៅក្នុងប្រអប់ ([[Special:Captcha/help|áž–áŸážáŸŒáž˜áž¶áž“បន្ážáŸ‚ម]])៖',
'fancycaptcha-createaccount' => 'ដើម្បីការពារការបង្កើážáž‚ណនីដោយស្វáŸáž™áž”្រវážáŸ’ážáž· សូមបញ្ជូលពាក្យážáž¶áž„ក្រោមទៅក្នុងប្រអប់ ([[Special:Captcha/help|áž–áŸážáŸŒáž˜áž¶áž“បន្ážáŸ‚ម]])៖',
'fancycaptcha-create' => 'ដើម្បីបង្កើážáž‘ំពáŸážšáž“áŸáŸ‡ សូមបញ្ជូលពាក្យážáž¶áž„ក្រោមទៅក្នុងប្រអប់ ([[Special:Captcha/help|áž–áŸážáŸŒáž˜áž¶áž“បន្ážáŸ‚ម]])៖',
'fancycaptcha-edit' => 'ដើម្បីកែប្រែទំពáŸážšáž“áŸáŸ‡ សូមបញ្ជូលពាក្យážáž¶áž„ក្រោមទៅក្នុងប្រអប់ ([[Special:Captcha/help|áž–áŸážáŸŒáž˜áž¶áž“បន្ážáŸ‚ម]])៖',
@@ -845,12 +888,12 @@ $messages['km'] = array(
$messages['ko'] = array(
'fancycaptcha-desc' => '편집 확ì¸ì— 대한 ê³µìƒ CAPTCHA(캡차) ìƒì„±ê¸°',
'fancycaptcha-addurl' => 'íŽ¸ì§‘ì— ìƒˆë¡œìš´ 바깥 ë§í¬ê°€ í¬í•¨ë˜ì–´ 있습니다.
-ìžë™í™”ëœ ìŠ¤íŒ¸ìœ¼ë¡œë¶€í„° 보호하기 위해 아래 ìƒìžì˜ 낱ë§ì„ 입력해주세요 ([[Special:Captcha/help|ìžì„¸í•œ ì •ë³´]]):',
- 'fancycaptcha-badlogin' => 'ìžë™í™”ëœ ë¹„ë°€ë²ˆí˜¸ 깨기로부터 보호하기 위해 ì•„ëž˜ì˜ ìƒìž ì•ˆì— ìžˆëŠ” 낱ë§ì„ 입력해주세요 ([[Special:Captcha/help|ìžì„¸í•œ ì •ë³´]]):',
- 'fancycaptcha-createaccount' => 'ìžë™í™”ëœ ê³„ì • 만들기로부터 보호하기 위해 ì•„ëž˜ì˜ ìƒìž ì•ˆì— ìžˆëŠ” 낱ë§ì„ 입력해주세요 ([[Special:Captcha/help|ìžì„¸í•œ ì •ë³´]]):',
+ìžë™í™”ëœ ìŠ¤íŒ¸ìœ¼ë¡œë¶€í„° 위키를 보호하기 위해, 친절하게 요청하며 아래 ìƒìžì— 나타나는 낱ë§ì„ 입력해주세요 ([[Special:Captcha/help|ìžì„¸í•œ ì •ë³´]]):',
+ 'fancycaptcha-badlogin' => 'ìžë™í™”ëœ ë¹„ë°€ë²ˆí˜¸ 깨기로부터 위키를 보호하기 위해, 친절하게 요청하며 아래 ìƒìžì— 나타나는 낱ë§ì„ 입력해주세요 ([[Special:Captcha/help|ìžì„¸í•œ ì •ë³´]]):',
+ 'fancycaptcha-createaccount' => 'ìžë™í™”ëœ ê³„ì • 만들기로부터 위키를 보호하기 위해, 친절하게 요청하며 아래 ìƒìžì— 나타나는 낱ë§ì„ 입력해주세요 ([[Special:Captcha/help|ìžì„¸í•œ ì •ë³´]]):',
'fancycaptcha-create' => '문서를 만드려면 ì•„ëž˜ì˜ ìƒìž ì•ˆì— ìžˆëŠ” 낱ë§ì„ 입력해주세요 ([[Special:Captcha/help|ìžì„¸í•œ ì •ë³´]]):',
'fancycaptcha-edit' => 'ì´ ë¬¸ì„œë¥¼ 편집하려면 ì•„ëž˜ì˜ ìƒìž ì•ˆì— ìžˆëŠ” 낱ë§ì„ 입력해주세요 ([[Special:Captcha/help|ìžì„¸í•œ ì •ë³´]]):',
- 'fancycaptcha-sendemail' => 'ìžë™í™”ëœ ìŠ¤íŒ¸ìœ¼ë¡œë¶€í„° 보호하기 위해 ì•„ëž˜ì˜ ìƒìž ì•ˆì— ìžˆëŠ” 낱ë§ì„ 입력해주세요 ([[Special:Captcha/help|ìžì„¸í•œ ì •ë³´]]):',
+ 'fancycaptcha-sendemail' => 'ìžë™í™”ëœ ìŠ¤íŒ¸ìœ¼ë¡œë¶€í„° 위키를 보호하기 위해, 친절하게 요청하며 아래 ìƒìžì— 나타나는 낱ë§ì„ 입력해주세요 ([[Special:Captcha/help|ìžì„¸í•œ ì •ë³´]]):',
'fancycaptcha-reload-text' => '새로 고침',
);
@@ -858,7 +901,7 @@ $messages['ko'] = array(
* @author Iltever
*/
$messages['krc'] = array(
- 'fancycaptcha-createaccount' => 'Тергеу джазыуланы (аккаунтланы) автомат халда региÑÑ‚Ñ€Ð°Ñ†Ð¸Ñ Ñтиуню къоймаз ючюн, текÑтлик терезеде Ñуратланнган Ñимволланы джазыгъыз ([[Special:Captcha/help|толуракъ]]):',
+ 'fancycaptcha-createaccount' => 'Тергеу джазыуланы (аккаунтланы) автомат халда региÑÑ‚Ñ€Ð°Ñ†Ð¸Ñ Ñтиуню къоймаз ючюн, текÑтлик терезеде Ñуратланнган Ñимволланы джазыгъыз ([[Special:Captcha/help|толуракъ]]):', # Fuzzy
);
/** Colognian (Ripoarisch)
@@ -868,42 +911,43 @@ $messages['ksh'] = array(
'fancycaptcha-desc' => 'Määt e nett Käptsche för dä <code lang="en">Confirm Edit</code> Projramm-Zohsatz',
'fancycaptcha-addurl' => 'Do häß neu Lingks op frembde Websigge dobei jedonn.
Mer schöze uns Wiki jäje automatesche SPAM, dröm
-don di Wööter en dat Käßje endraare. (Verklierung)',
+don di Wööter en dat Käßje endraare. (Verklierung)', # Fuzzy
'fancycaptcha-badlogin' => 'Mer schöze Metmaacher en unsem Wiki jäje automatesche
Paßwoot-Knackerei, dröm don di Wööt onge en dat Käßje
-endraare. (Verklierung)',
+endraare. (Verklierung)', # Fuzzy
'fancycaptcha-createaccount' => 'Mer schöze uns Wiki dojäje, dat mer en Masse automatesch
Metmaacher aanmeldt. Dröm beß esu joot un
-don di Wööt onge en dat Käßje endraare. (Verklierung)',
+don di Wööt onge en dat Käßje endraare. (Verklierung)', # Fuzzy
'fancycaptcha-create' => 'Öm di Sigg neu aanzelääje, don di Wööt onge en dat Käßje endraare. (Verklierung)',
'fancycaptcha-edit' => 'Öm de Sigg ze ändere, don di Wööt onge en dat Käßje endraare. ([[Special:Captcha/help|Verklierung]])',
'fancycaptcha-sendemail' => 'Öm et Wiki jääje automattesch enjedraare SPAM ze schötze,
bes esu joot, donn di Wööter enjävve, di en däm Käßje heh dronger shtonn.
-([[Special:Captcha/help|Mieh Enfommazjuhne]])',
+([[Special:Captcha/help|Mieh Enfommazjuhne]])', # Fuzzy
'fancycaptcha-reload-text' => 'Nöü Aanzeije!',
);
/** Cornish (kernowek)
* @author Kernoweger
+ * @author Nrowe
*/
$messages['kw'] = array(
- 'fancycaptcha-createaccount' => "Rag gwitha rag formya acontow awtomategys, gwrewgh entra an geryow usy ow tisqwedhes a-woles y'n gist ([[Special:Captcha/help|moy kedhlow]]):",
+ 'fancycaptcha-createaccount' => "Rag gwitha rag gwruthyl akontow yawtomategys, entrewgh an geryow a omdhiskwa a-woles y'n gist ([[Special:Captcha/help|moy kedhlow]]):", # Fuzzy
);
-/** Kirghiz (Кыргызча)
+/** Kyrgyz (Кыргызча)
* @author Chorobek
*/
$messages['ky'] = array(
- 'fancycaptcha-sendemail' => 'Ðвтоматташтырылган Ñпамдан коргонууга жардам катары бул Ñөздөрдү төмөндөгү көзөнөккө киргизиңиз ([[Special:Captcha/help|more info]]):',
+ 'fancycaptcha-sendemail' => 'Ðвтоматташтырылган Ñпамдан коргонууга жардам катары бул Ñөздөрдү төмөндөгү көзөнөккө киргизиңиз ([[Special:Captcha/help|more info]]):', # Fuzzy
);
/** Latin (Latina)
* @author SPQRobin
*/
$messages['la'] = array(
- 'fancycaptcha-addurl' => 'Emendatione tua insunt nexus externi; ut spam automaticum vitemus, necesse est tibi in capsam inscribere verba quae sub capsa monstrantur ([[Special:Captcha/help|Quidst illud?]]):',
- 'fancycaptcha-badlogin' => 'Ut vitemus ne tesserae frangantur, necesse est tibi in capsam inscribere verba quae sub capsa monstrantur ([[Special:Captcha/help|Quidst illud?]]):',
- 'fancycaptcha-createaccount' => 'Ut creationem rationum automaticam vitemus, necesse est tibi in capsam inscribere verba quae sub capsa monstrantur ([[Special:Captcha/help|Quidst illud?]]):',
+ 'fancycaptcha-addurl' => 'Emendatione tua insunt nexus externi; ut spam automaticum vitemus, necesse est tibi in capsam inscribere verba quae sub capsa monstrantur ([[Special:Captcha/help|Quidst illud?]]):', # Fuzzy
+ 'fancycaptcha-badlogin' => 'Ut vitemus ne tesserae frangantur, necesse est tibi in capsam inscribere verba quae sub capsa monstrantur ([[Special:Captcha/help|Quidst illud?]]):', # Fuzzy
+ 'fancycaptcha-createaccount' => 'Ut creationem rationum automaticam vitemus, necesse est tibi in capsam inscribere verba quae sub capsa monstrantur ([[Special:Captcha/help|Quidst illud?]]):', # Fuzzy
'fancycaptcha-create' => 'Ad paginam creandum, necesse est tibi in capsam inscribere verba quae sub capsa monstrantur ([[Special:Captcha/help|Quidst illud?]]):',
'fancycaptcha-edit' => 'Ad hanc paginam recensendum, necesse est tibi in capsam inscribere verba quae sub capsa monstrantur ([[Special:Captcha/help|Quidst illud?]]):',
);
@@ -913,14 +957,14 @@ $messages['la'] = array(
* @author Robby
*/
$messages['lb'] = array(
- 'fancycaptcha-addurl' => 'An Ärer Ännerung sinn nei extern Linken.
+ 'fancycaptcha-addurl' => "An Ärer Ännerung sinn nei extern Linken.
-Fir ze hellëfen, géint automatiséierte Spam virzegoen, gitt w.e.g. déi Wierder an, déi an der Këscht ënnendrënner stinn ([[Special:Captcha/help|méi Informatiounen]]):',
- 'fancycaptcha-badlogin' => "Fir ze hellëfe fir d'automatiséiert Hacke vu Passwierder méi schwéier ze maachen, gitt w.e.g. déi Wierder an, déi an der Këscht ënnendrënner stinn ([[Special:Captcha/help|méi Informatiounen]]):",
- 'fancycaptcha-createaccount' => "Fir géint d'automatiséiert Opmaache vu Benotzerkonte virzegoen, gitt w.e.g. déi Wierder an, déi an der Këscht ënnedrënner stinn ([[Special:Captcha/help|méi Informatiounen]]):",
+Fir dës Wiki géint automatiséierte Spam ze schütze froe mir Iech d'Wierder anzeginn, déi an der Këscht ënnendrënner stinn ([[Special:Captcha/help|méi Informatiounen]]):",
+ 'fancycaptcha-badlogin' => "Fir ze hëllefe fir d'automatiséiert Hacke vu Passwierder méi schwéier ze maachen, froe mir Iech fir d'Wierder anzeginn, déi an der Këscht ënnendrënner stinn ([[Special:Captcha/help|méi Informatiounen]]):",
+ 'fancycaptcha-createaccount' => "Fir d'Wiki géint automatiséiert Opmaache vu Benotzerkonte ze schützen, froe mir Iech d'Wierder déi an der Këscht ënnendrënner stinn anzeginn ([[Special:Captcha/help|méi Informatiounen]]):",
'fancycaptcha-create' => 'Fir dës Säit unzeleeën, gitt w.e.g. déi Wierder an, déi an der Këscht ënnendrënner stinn ([[Special:Captcha/help|méi Informatiounen]]):',
'fancycaptcha-edit' => "Fir dës Säit z'änneren, gitt w.e.g. déi Wierder an, déi an der Këscht ënnendrënner stinn ([[Special:Captcha/help|méi Informatiounen]]):",
- 'fancycaptcha-sendemail' => 'Fir eis géint automatescht Spammen ze schützen, gitt w.e.g. déi Wierder déi an der Këscht ënnedrënner stinn an ([[Special:Captcha/help|méi Informatiounen]]):',
+ 'fancycaptcha-sendemail' => "Fir eis géint automatescht Spammen ze schützen, froe mir Iech fir d'Wierder déi an der Këscht ënnendrënner stinn anzeginn ([[Special:Captcha/help|méi Informatiounen]]):",
'fancycaptcha-reload-text' => 'Aktualiséieren',
);
@@ -930,32 +974,53 @@ Fir ze hellëfen, géint automatiséierte Spam virzegoen, gitt w.e.g. déi Wierd
*/
$messages['li'] = array(
'fancycaptcha-addurl' => 'Uw bewerking bevat nieuwe externe links. Voer de woorden die
-hieronder verschijnen in het invoerveld in als bescherming tegen automatische spam ([[Special:Captcha/help|meer informatie]]):',
- 'fancycaptcha-badlogin' => 'Voer de woorden die hieronder verschijnen in het invoerveld in als bescherming tegen het automatisch kraken van wachtwoorden ([[Special:Captcha/help|meer informatie]]):',
+hieronder verschijnen in het invoerveld in als bescherming tegen automatische spam ([[Special:Captcha/help|meer informatie]]):', # Fuzzy
+ 'fancycaptcha-badlogin' => 'Voer de woorden die hieronder verschijnen in het invoerveld in als bescherming tegen het automatisch kraken van wachtwoorden ([[Special:Captcha/help|meer informatie]]):', # Fuzzy
'fancycaptcha-createaccount' => 'Voer de woorden die hieronder verschijnen in het invoerveld in
-ter bescherming tegen het automatisch aanmaken van gebruikers ([[Special:Captcha/help|meer informatie]]):',
+ter bescherming tegen het automatisch aanmaken van gebruikers ([[Special:Captcha/help|meer informatie]]):', # Fuzzy
'fancycaptcha-create' => 'Uw bewerking bevat nieuwe externe links. Voer de woorden die
hieronder verschijnen in het invoerveld in als bescherming tegen automatische spam ([[Special:Captcha/help|meer informatie]]):',
'fancycaptcha-edit' => 'Uw bewerking bevat nieuwe externe links. Voer de woorden die
hieronder verschijnen in het invoerveld in als bescherming tegen automatische spam ([[Special:Captcha/help|mie informatie]]):',
- 'fancycaptcha-sendemail' => "Veur de weurd die hie onger versjienen in 't inveurvèldj in es besjerming taege geautometiseerde spam ([[Special:Captcha/help|mier info]]):",
+ 'fancycaptcha-sendemail' => "Veur de weurd die hie onger versjienen in 't inveurvèldj in es besjerming taege geautometiseerde spam ([[Special:Captcha/help|mier info]]):", # Fuzzy
);
/** Lao (ລາວ)
*/
$messages['lo'] = array(
- 'fancycaptcha-addurl' => 'àºàº²àº™àº”ັດà»àºà»‰àº‚ອງທ່ານ ມີລິ້ງຄ໌ພາàºàº™àº­àº. ເພື່ອປ້ອງàºàº±àº™ ສະà»àº›àº¡àº­àº±àº”ຕະໂນມັດ, àºàº°àº¥àº¸àº™àº² ພິມຄຳສັບຂ້າງລຸ່ມນີ້ ໃສ່ໃນàºàº±àºš ([[Special:Captcha/help|ຂà»à»‰àº¡àº¹àº™à»€àºžàºµà»ˆàº¡àº•àº·à»ˆàº¡]]):',
- 'fancycaptcha-badlogin' => 'ເພື່ອຊ່ອàºàº›à»‰àº­àº‡àºàº±àº™ àºàº²àº™àºªàº·àºšàº„ົ້ນຫາລະຫັດຜ່ານà»àºšàºšàº­àº±àº”ຕະໂນມັດ, àºàº°àº¥àº¸àº™àº² ພິມຄຳສັບ ຂ້າງລຸ່ມນີ້ ໃສ່ໃນàºàº±àºš ([[Special:Captcha/help|ຂà»à»‰àº¡àº¹àº™à»€àºžàºµà»ˆàº¡àº•àº·à»ˆàº¡]]):',
- 'fancycaptcha-createaccount' => 'ເພື່ອປ້ອງàºàº±àº™ àºàº²àº™àºªà»‰àº²àº‡àºšàº±àº™àºŠàºµà»àºšàºšàº­àº±àº”ຕະໂນມດ, àºàº°àº¥àº¸àº™àº²àºžàº´àº¡ ຄຳສັບຂ້າງລຸ່ມນີ້​ ໃສ່ໃນàºàº±àºš ([[Special:Captcha/help|ຂà»à»‰àº¡àº¹àº™à»€àºžàº´à»ˆàº¡àº•àº·àº¡]]):',
+ 'fancycaptcha-addurl' => 'àºàº²àº™àº”ັດà»àºà»‰àº‚ອງທ່ານ ມີລິ້ງຄ໌ພາàºàº™àº­àº. ເພື່ອປ້ອງàºàº±àº™ ສະà»àº›àº¡àº­àº±àº”ຕະໂນມັດ, àºàº°àº¥àº¸àº™àº² ພິມຄຳສັບຂ້າງລຸ່ມນີ້ ໃສ່ໃນàºàº±àºš ([[Special:Captcha/help|ຂà»à»‰àº¡àº¹àº™à»€àºžàºµà»ˆàº¡àº•àº·à»ˆàº¡]]):', # Fuzzy
+ 'fancycaptcha-badlogin' => 'ເພື່ອຊ່ອàºàº›à»‰àº­àº‡àºàº±àº™ àºàº²àº™àºªàº·àºšàº„ົ້ນຫາລະຫັດຜ່ານà»àºšàºšàº­àº±àº”ຕະໂນມັດ, àºàº°àº¥àº¸àº™àº² ພິມຄຳສັບ ຂ້າງລຸ່ມນີ້ ໃສ່ໃນàºàº±àºš ([[Special:Captcha/help|ຂà»à»‰àº¡àº¹àº™à»€àºžàºµà»ˆàº¡àº•àº·à»ˆàº¡]]):', # Fuzzy
+ 'fancycaptcha-createaccount' => 'ເພື່ອປ້ອງàºàº±àº™ àºàº²àº™àºªà»‰àº²àº‡àºšàº±àº™àºŠàºµà»àºšàºšàº­àº±àº”ຕະໂນມດ, àºàº°àº¥àº¸àº™àº²àºžàº´àº¡ ຄຳສັບຂ້າງລຸ່ມນີ້​ ໃສ່ໃນàºàº±àºš ([[Special:Captcha/help|ຂà»à»‰àº¡àº¹àº™à»€àºžàº´à»ˆàº¡àº•àº·àº¡]]):', # Fuzzy
'fancycaptcha-create' => 'àºàº°àº¥àº¸àº™àº² ພິມຄຳສັບຂ້າງລຸ່ມນີ້​ ໃສ່ໃນàºàº±àºš ເພື່ອສ້າງໜ້ານີ້ ([[Special:Captcha/help|more info]]):',
'fancycaptcha-edit' => 'àºàº°àº¥àº¸àº™àº² ພິມຄຳສັບຂ້າງລຸ່ມນີ້ ໃສ່ໃນàºàº±àºš ເພື່ອ ດັດà»àºà»‰à»œà»‰àº²àº™àºµà»‰ ([[Special:Captcha/help|ຂà»à»‰àº¡àº¹àº™à»€àºžàºµà»ˆàº¡àº•àº·à»ˆàº¡]]):',
);
+/** لوری (لوری)
+ * @author Mogoeilor
+ */
+$messages['lrc'] = array(
+ 'fancycaptcha-reload-text' => 'د نؤ كردن',
+);
+
+/** Lithuanian (lietuvių)
+ * @author Eitvys200
+ */
+$messages['lt'] = array(
+ 'fancycaptcha-reload-text' => 'Atnaujinti',
+);
+
+/** Latvian (latviešu)
+ * @author Papuass
+ */
+$messages['lv'] = array(
+ 'fancycaptcha-reload-text' => 'AtjauninÄt',
+);
+
/** Minangkabau (Baso Minangkabau)
* @author Iwan Novirion
*/
$messages['min'] = array(
- 'fancycaptcha-createaccount' => 'Untuak palinduangan tahadok pambuek akun otomatis, tolong masuakan kato di bawah ko ka kotak nan tasadio ([[Special:Captcha/help|info labiah lanjuik]]):',
+ 'fancycaptcha-createaccount' => 'Untuak palinduangan tahadok pambuek akun otomatis, tolong masuakan kato di bawah ko ka kotak nan tasadio ([[Special:Captcha/help|info labiah lanjuik]]):', # Fuzzy
);
/** Macedonian (македонÑки)
@@ -964,12 +1029,12 @@ $messages['min'] = array(
$messages['mk'] = array(
'fancycaptcha-desc' => 'Збогатен Ñоздавач CAPTCHA за потврда на уредувања',
'fancycaptcha-addurl' => 'Вашето уредување вклучува нови надворешни врÑки.
-Со цел да Ñе заштитиме од автоматизиран Ñпам, внеÑете ги зборовите на Ñликичката подолу ([[Special:Captcha/help|повеќе информации]]):',
- 'fancycaptcha-badlogin' => 'Со цел да Ñе заштитиме од автоматизирано пробивање на лозинки, внеÑете ги зборовите на Ñликичката подолу ([[Special:Captcha/help|повеќе информации]]):',
- 'fancycaptcha-createaccount' => 'Со цел да Ñе заштитиме од автоматизирано Ñоздавање на Ñметки, внеÑете ги зборовите на Ñликичката подолу ([[Special:Captcha/help|повеќе информации]]):',
+Со цел да Ñе заштитиме од автоматизиран Ñпам, би ве замолиле да ги внеÑете зборовите на Ñликичката подолу ([[Special:Captcha/help|повеќе информации]]):',
+ 'fancycaptcha-badlogin' => 'Со цел да Ñе заштитиме од автоматизирано пробивање на лозинки, би ве замолиле да ги внеÑете зборовите на Ñликичката подолу ([[Special:Captcha/help|повеќе информации]]):',
+ 'fancycaptcha-createaccount' => 'Со цел да Ñе заштитиме од автоматизирано Ñоздавање на Ñметки, би ве замолиле да ги внеÑете зборовите на Ñликичката подолу ([[Special:Captcha/help|повеќе информации]]):',
'fancycaptcha-create' => 'За да Ñоздадете Ñтраница, внеÑете ги зборовите на Ñликичката подолу ([[Special:Captcha/help|повеќе информации]]):',
'fancycaptcha-edit' => 'За да ја уредите Ñтраницава, внеÑете ги зборовите на Ñликичката подолу ([[Special:Captcha/help|повеќе информации]]):',
- 'fancycaptcha-sendemail' => 'За да Ñе заштитиме од автоматизирано Ñпамирање, препишете ги зборовите од Ñликичката во полето подолу ([[Special:Captcha/help|повеќе информации]]):',
+ 'fancycaptcha-sendemail' => 'За да Ñе заштитиме од автоматизирано Ñпамирање, би ве замолиле да ги внеÑете зборовите од Ñликичката во полето подолу ([[Special:Captcha/help|повеќе информации]]):',
'fancycaptcha-reload-text' => 'Превчитај',
);
@@ -979,12 +1044,13 @@ $messages['mk'] = array(
*/
$messages['ml'] = array(
'fancycaptcha-addurl' => 'താങàµà´•à´³àµà´Ÿàµ† തിരàµà´¤àµà´¤à´²à´²à´¿àµ½ à´ªàµà´±à´‚ à´•à´£àµà´£à´¿à´•àµ¾ ഉൾപàµà´ªàµ†à´Ÿàµà´Ÿà´¿à´°à´¿à´•àµà´•àµà´¨àµà´¨àµ.
-യാനàµà´¤àµà´°à´¿à´• à´¸àµà´ªà´¾à´®à´¿à´¨àµ†à´¤à´¿à´°àµ†à´¯àµà´³àµà´³ സം‌രകàµà´·à´£à´¤àµà´¤à´¿à´¨àµà´±àµ† ഭാഗമായി, താഴെ കാണàµà´¨àµà´¨ വാകàµà´•àµà´•àµ¾ പെടàµà´Ÿà´¿à´¯à´¿àµ½ ടൈപàµà´ªàµ ചെയàµà´¯àµà´• ([[Special:Captcha/help|കൂടàµà´¤àµ½ വിവരങàµà´™àµ¾]]):',
- 'fancycaptcha-badlogin' => 'രഹസàµà´¯à´µà´¾à´•àµà´•àµ യാനàµà´¤àµà´°à´¿à´•à´®à´¾à´¯à´¿ പൊളികàµà´•àµà´¨àµà´¨à´¤àµ തടയàµà´¨àµà´¨à´¤à´¿à´¨àµà´±àµ† ഭാഗമായി, താഴെ കാണàµà´¨àµà´¨ വാകàµà´•àµà´•àµ¾ പെടàµà´Ÿà´¿à´¯à´¿àµ½ ടൈപàµà´ªàµ ചെയàµà´¯àµà´• ([[Special:Captcha/help|കൂടàµà´¤àµ½ വിവരങàµà´™àµ¾]]):',
- 'fancycaptcha-createaccount' => 'à´…à´‚à´—à´¤àµà´µà´‚ യാനàµà´¤àµà´°à´¿à´•à´®à´¾à´¯à´¿ സൃഷàµà´Ÿà´¿à´•àµà´•àµà´¨àµà´¨à´¤àµ തടയàµà´¨àµà´¨à´¤àµŠà´´à´¿à´µà´¾à´•àµà´•à´¾à´¨àµà´³àµà´³ സം‌രകàµà´·à´£à´¤àµà´¤à´¿à´¨àµà´±àµ† ഭാഗമായി, താഴെ കാണàµà´¨àµà´¨ വാകàµà´•àµà´•àµ¾ പെടàµà´Ÿà´¿à´¯à´¿àµ½ ടൈപàµà´ªàµ ചെയàµà´¯àµà´• ([[Special:Captcha/help|കൂടàµà´¤àµ½ വിവരങàµà´™àµ¾]]):',
+യാനàµà´¤àµà´°à´¿à´• à´¸àµà´ªà´¾à´®à´¿à´¨àµ†à´¤à´¿à´°àµ†à´¯àµà´³àµà´³ സം‌രകàµà´·à´£à´¤àµà´¤à´¿à´¨àµà´±àµ† ഭാഗമായി, താഴെ കാണàµà´¨àµà´¨ വാകàµà´•àµà´•àµ¾ പെടàµà´Ÿà´¿à´¯à´¿àµ½ ടൈപàµà´ªàµ ചെയàµà´¯àµà´• ([[Special:Captcha/help|കൂടàµà´¤àµ½ വിവരങàµà´™àµ¾]]):', # Fuzzy
+ 'fancycaptcha-badlogin' => 'രഹസàµà´¯à´µà´¾à´•àµà´•àµ യാനàµà´¤àµà´°à´¿à´•à´®à´¾à´¯à´¿ പൊളികàµà´•àµà´¨àµà´¨à´¤àµ തടയàµà´¨àµà´¨à´¤à´¿à´¨àµà´±àµ† ഭാഗമായി, താഴെ കാണàµà´¨àµà´¨ വാകàµà´•àµà´•àµ¾ പെടàµà´Ÿà´¿à´¯à´¿àµ½ ടൈപàµà´ªàµ ചെയàµà´¯àµà´• ([[Special:Captcha/help|കൂടàµà´¤àµ½ വിവരങàµà´™àµ¾]]):', # Fuzzy
+ 'fancycaptcha-createaccount' => 'à´…à´‚à´—à´¤àµà´µà´‚ യാനàµà´¤àµà´°à´¿à´•à´®à´¾à´¯à´¿ സൃഷàµà´Ÿà´¿à´•àµà´•àµà´¨àµà´¨à´¤àµ തടയàµà´¨àµà´¨à´¤àµŠà´´à´¿à´µà´¾à´•àµà´•à´¾à´¨àµà´³àµà´³ സം‌രകàµà´·à´£à´¤àµà´¤à´¿à´¨àµà´±àµ† ഭാഗമായി, താഴെ കാണàµà´¨àµà´¨ വാകàµà´•àµà´•àµ¾ പെടàµà´Ÿà´¿à´¯à´¿àµ½ ടൈപàµà´ªàµ ചെയàµà´¯àµà´• ([[Special:Captcha/help|കൂടàµà´¤àµ½ വിവരങàµà´™àµ¾]]):', # Fuzzy
'fancycaptcha-create' => 'à´ˆ താൾ സൃഷàµà´Ÿà´¿à´•àµà´•àµà´µà´¾àµ» താഴെയàµà´³àµà´³ പെടàµà´Ÿà´¿à´¯à´¿àµ½ കാണàµà´¨àµà´¨ വാകàµà´•àµà´•àµ¾ ടൈപàµà´ªàµ ചെയàµà´¯àµà´• ([[Special:Captcha/help|കൂടàµà´¤àµ½ വിവരങàµà´™àµ¾]]):',
'fancycaptcha-edit' => 'à´ˆ താൾ തിരàµà´¤àµà´¤àµà´µà´¾àµ» ദയവായി താഴെ കാണàµà´¨àµà´¨ വാകàµà´•àµà´•àµ¾ പെടàµà´Ÿà´¿à´¯à´¿àµ½ ടൈപàµà´ªàµ ചെയàµà´¯àµà´• ([[Special:Captcha/help|കൂടàµà´¤àµ½ വിവരങàµà´™àµ¾]]):',
- 'fancycaptcha-sendemail' => 'യാനàµà´¤àµà´°à´¿à´•à´®à´¾à´¯ പാഴെഴàµà´¤àµà´¤àµ ഉൾപàµà´ªàµ†à´Ÿàµà´¤àµà´¤à´²à´¿à´¨àµà´³àµà´³ à´ªàµà´°à´¤à´¿à´°àµ‹à´§à´®àµ†à´¨àµà´¨ നിലയിൽ, താഴെ കാണàµà´¨àµà´¨ വാകàµà´•àµà´•àµ¾ പെടàµà´Ÿà´¿à´¯à´¿àµ½ ടൈപàµà´ªàµ ചെയàµà´¯àµà´• ([[Special:Captcha/help|കൂടàµà´¤àµ½ വിവരങàµà´™àµ¾]]):',
+ 'fancycaptcha-sendemail' => 'യാനàµà´¤àµà´°à´¿à´•à´®à´¾à´¯ പാഴെഴàµà´¤àµà´¤àµ ഉൾപàµà´ªàµ†à´Ÿàµà´¤àµà´¤à´²à´¿à´¨àµà´³àµà´³ à´ªàµà´°à´¤à´¿à´°àµ‹à´§à´®àµ†à´¨àµà´¨ നിലയിൽ, താഴെ കാണàµà´¨àµà´¨ വാകàµà´•àµà´•àµ¾ പെടàµà´Ÿà´¿à´¯à´¿àµ½ ടൈപàµà´ªàµ ചെയàµà´¯àµà´• ([[Special:Captcha/help|കൂടàµà´¤àµ½ വിവരങàµà´™àµ¾]]):', # Fuzzy
+ 'fancycaptcha-reload-text' => 'à´ªàµà´¤àµà´•àµà´•àµà´•',
);
/** Marathi (मराठी)
@@ -993,12 +1059,12 @@ $messages['ml'] = array(
*/
$messages['mr'] = array(
'fancycaptcha-addurl' => 'तà¥à¤®à¤šà¥à¤¯à¤¾ संपादनात नवीन बाहà¥à¤¯ दà¥à¤µà¥‡ आहेत.
-आपोआप होणारà¥â€à¤¯à¤¾ संपादनांपासून बचावासाठी, खाली दिसणारे शबà¥à¤¦ दिलेलà¥à¤¯à¤¾ पृषà¥à¤ à¤ªà¥‡à¤Ÿà¥€ मधà¥à¤¯à¥‡ लिहा ([[Special:Captcha/help|अधिक माहिती]]):',
- 'fancycaptcha-badlogin' => 'आपोआप होणारà¥â€à¤¯à¤¾ परवलीचà¥à¤¯à¤¾ शबà¥à¤¦à¤¾à¤šà¥à¤¯à¤¾ चोरीपासून वाचणà¥à¤¯à¤¾à¤¸à¤¾à¤ à¥€, खाली दिसणारे शबà¥à¤¦ दिलेलà¥à¤¯à¤¾ पृषà¥à¤ à¤ªà¥‡à¤Ÿà¥€ मधà¥à¤¯à¥‡ लिहा ([[Special:Captcha/help|अधिक माहिती]]):',
- 'fancycaptcha-createaccount' => 'आपोआप होणारà¥â€à¤¯à¤¾ सदसà¥à¤¯ नोंदणीपासून वाचणà¥à¤¯à¤¾à¤¸à¤¾à¤ à¥€, खाली दिसणारे शबà¥à¤¦ दिलेलà¥à¤¯à¤¾ पृषà¥à¤ à¤ªà¥‡à¤Ÿà¥€ मधà¥à¤¯à¥‡ लिहा ([[Special:Captcha/help|अधिक माहिती]]):',
+आपोआप होणारà¥â€à¤¯à¤¾ संपादनांपासून बचावासाठी, खाली दिसणारे शबà¥à¤¦ दिलेलà¥à¤¯à¤¾ पृषà¥à¤ à¤ªà¥‡à¤Ÿà¥€ मधà¥à¤¯à¥‡ लिहा ([[Special:Captcha/help|अधिक माहिती]]):', # Fuzzy
+ 'fancycaptcha-badlogin' => 'आपोआप होणारà¥â€à¤¯à¤¾ परवलीचà¥à¤¯à¤¾ शबà¥à¤¦à¤¾à¤šà¥à¤¯à¤¾ चोरीपासून वाचणà¥à¤¯à¤¾à¤¸à¤¾à¤ à¥€, खाली दिसणारे शबà¥à¤¦ दिलेलà¥à¤¯à¤¾ पृषà¥à¤ à¤ªà¥‡à¤Ÿà¥€ मधà¥à¤¯à¥‡ लिहा ([[Special:Captcha/help|अधिक माहिती]]):', # Fuzzy
+ 'fancycaptcha-createaccount' => 'आपोआप होणारà¥â€à¤¯à¤¾ सदसà¥à¤¯ नोंदणीपासून वाचणà¥à¤¯à¤¾à¤¸à¤¾à¤ à¥€, खाली दिसणारे शबà¥à¤¦ दिलेलà¥à¤¯à¤¾ पृषà¥à¤ à¤ªà¥‡à¤Ÿà¥€ मधà¥à¤¯à¥‡ लिहा ([[Special:Captcha/help|अधिक माहिती]]):', # Fuzzy
'fancycaptcha-create' => 'हे पान तयार करणà¥à¤¯à¤¾à¤¸à¤¾à¤ à¥€, खाली दिसणारे शबà¥à¤¦ दिलेलà¥à¤¯à¤¾ पृषà¥à¤ à¤ªà¥‡à¤Ÿà¥€ मधà¥à¤¯à¥‡ लिहा ([[Special:Captcha/help|अधिक माहिती]]):',
'fancycaptcha-edit' => 'हे पान संपादित करणà¥à¤¯à¤¾à¤¸à¤¾à¤ à¥€, खाली दिसणारे शबà¥à¤¦ दिलेलà¥à¤¯à¤¾ पृषà¥à¤ à¤ªà¥‡à¤Ÿà¥€ मधà¥à¤¯à¥‡ लिहा ([[Special:Captcha/help|अधिक माहिती]]):',
- 'fancycaptcha-sendemail' => 'आपोआप होणारà¥â€à¤¯à¤¾ उतà¥à¤ªà¤¾à¤¤à¤¾à¤ªà¤¾à¤¸à¥‚न वाचणà¥à¤¯à¤¾à¤¸à¤¾à¤ à¥€, खाली दिसणारे शबà¥à¤¦ दिलेलà¥à¤¯à¤¾ पृषà¥à¤ à¤ªà¥‡à¤Ÿà¥€ मधà¥à¤¯à¥‡ लिहा ([[Special:Captcha/help|अधिक माहिती]]):',
+ 'fancycaptcha-sendemail' => 'आपोआप होणारà¥â€à¤¯à¤¾ उतà¥à¤ªà¤¾à¤¤à¤¾à¤ªà¤¾à¤¸à¥‚न वाचणà¥à¤¯à¤¾à¤¸à¤¾à¤ à¥€, खाली दिसणारे शबà¥à¤¦ दिलेलà¥à¤¯à¤¾ पृषà¥à¤ à¤ªà¥‡à¤Ÿà¥€ मधà¥à¤¯à¥‡ लिहा ([[Special:Captcha/help|अधिक माहिती]]):', # Fuzzy
);
/** Malay (Bahasa Melayu)
@@ -1006,12 +1072,12 @@ $messages['mr'] = array(
* @author Aviator
*/
$messages['ms'] = array(
- 'fancycaptcha-addurl' => 'Suntingan anda mengandungi pautan luar baru. Untuk membanteras kegiatan spam automatik, anda diminta mengisi huruf-huruf berikut dalam kotak yang disediakan ([[Special:Captcha/help|maklumat lanjut]]):',
- 'fancycaptcha-badlogin' => 'Untuk membanteras kegiatan meneka kata laluan secara automatik, anda diminta mengisi huruf-huruf berikut dalam kotak yang disediakan ([[Special:Captcha/help|maklumat lanjut]]):',
- 'fancycaptcha-createaccount' => 'Untuk membanteras kegiatan pembukaan akaun secara automatik, anda diminta mengisi huruf-huruf berikut dalam kotak yang disediakan ([[Special:Captcha/help|maklumat lanjut]]):',
+ 'fancycaptcha-addurl' => 'Suntingan anda mengandungi pautan luar baru. Untuk membanteras kegiatan spam automatik, anda diminta mengisi huruf-huruf berikut dalam kotak yang disediakan ([[Special:Captcha/help|maklumat lanjut]]):', # Fuzzy
+ 'fancycaptcha-badlogin' => 'Untuk membanteras kegiatan meneka kata laluan secara automatik, anda diminta mengisi huruf-huruf berikut dalam kotak yang disediakan ([[Special:Captcha/help|maklumat lanjut]]):', # Fuzzy
+ 'fancycaptcha-createaccount' => 'Untuk membanteras kegiatan pembukaan akaun secara automatik, anda diminta mengisi huruf-huruf berikut dalam kotak yang disediakan ([[Special:Captcha/help|maklumat lanjut]]):', # Fuzzy
'fancycaptcha-create' => 'Untuk mencipta laman ini, anda diminta mengisi huruf-huruf berikut dalam kotak yang disediakan ([[Special:Captcha/help|maklumat lanjut]]):',
'fancycaptcha-edit' => 'Untuk menyunting laman ini, anda diminta mengisi huruf-huruf berikut dalam kotak yang disediakan ([[Special:Captcha/help|maklumat lanjut]]):',
- 'fancycaptcha-sendemail' => 'Untuk membanteras kegiatan spam secara automatik, anda diminta mengisi huruf-huruf berikut dalam kotak yang disediakan ([[Special:Captcha/help|maklumat lanjut]]):',
+ 'fancycaptcha-sendemail' => 'Untuk membanteras kegiatan spam secara automatik, anda diminta mengisi huruf-huruf berikut dalam kotak yang disediakan ([[Special:Captcha/help|maklumat lanjut]]):', # Fuzzy
'fancycaptcha-reload-text' => 'Muat semula',
);
@@ -1020,27 +1086,29 @@ $messages['ms'] = array(
*/
$messages['mt'] = array(
'fancycaptcha-addurl' => "Il-modifika tiegħek tinkludi ħoloq esterni ġodda.
-Sabiex tipproteġi kontra spam awtomatiku, jekk jogħġbok solvi din is-somma sempliċi t'hawn taħt u daħħal ir-risposta fil-kaxxa ([[Special:Captcha/help|aktar informazzjoni]]):",
- 'fancycaptcha-badlogin' => 'Bħala prekawzjoni kontra l-infurzar awtomatiku tal-password, jekk jogħġbok daħħal il-kliem li jidhru hawn taħt fil-kaxxa ([[Special:Captcha/help|aktar informazzjoni]]):',
- 'fancycaptcha-createaccount' => "Bħala miżura ta' prekawzjoni kontra l-ħolqien awtomatiku tal-kontijiet, jekk jogħġbok daħħal fil-kaxxa l-ittri li jidhru hawn taħt ([[Special:Captcha/help|aktar informazzjoni]]):",
+Sabiex tipproteġi kontra spam awtomatiku, jekk jogħġbok solvi din is-somma sempliċi t'hawn taħt u daħħal ir-risposta fil-kaxxa ([[Special:Captcha/help|aktar informazzjoni]]):", # Fuzzy
+ 'fancycaptcha-badlogin' => 'Bħala prekawzjoni kontra l-infurzar awtomatiku tal-password, jekk jogħġbok daħħal il-kliem li jidhru hawn taħt fil-kaxxa ([[Special:Captcha/help|aktar informazzjoni]]):', # Fuzzy
+ 'fancycaptcha-createaccount' => "Bħala miżura ta' prekawzjoni kontra l-ħolqien awtomatiku tal-kontijiet, jekk jogħġbok daħħal fil-kaxxa l-ittri li jidhru hawn taħt ([[Special:Captcha/help|aktar informazzjoni]]):", # Fuzzy
'fancycaptcha-create' => 'Sabiex toħloq din il-paġna, jekk jogħġbok daħħal il-kliem li jidhru hawn taħt fil-kaxxa ([[Special:Captcha/help|aktar informazzjoni]]):',
'fancycaptcha-edit' => 'Sabiex timmodifika din il-paġna, jekk jogħġbok daħħal il-kliem li jidhru hawn taħt fil-kaxxa ([[Special:Captcha/help|aktar informazzjoni]]):',
- 'fancycaptcha-sendemail' => 'Bħala prekawzjoni kontra l-ispam awtomatiku, jekk jogħġbok daħħal fil-kaxxa l-ittri li jidhru hawn taħt ([[Special:Captcha/help|aktar informazzjoni]]):',
+ 'fancycaptcha-sendemail' => 'Bħala prekawzjoni kontra l-ispam awtomatiku, jekk jogħġbok daħħal fil-kaxxa l-ittri li jidhru hawn taħt ([[Special:Captcha/help|aktar informazzjoni]]):', # Fuzzy
);
-/** Norwegian Bokmål (norsk (bokmål)‎)
+/** Norwegian Bokmål (norsk bokmål)
+ * @author Danmichaelo
* @author Harald Khan
* @author Laaknor
* @author Njardarlogar
*/
$messages['nb'] = array(
'fancycaptcha-desc' => 'CAPTCHA-generator for «Confirm Edit»',
- 'fancycaptcha-addurl' => 'Din endring inkluderer nye eksterne lenker. For hjelpe oss å beskytte oss mot automatisk spam, vennligst skriv inn ordene som kommer opp i denne boksen ([[Special:Captcha/help|mer informasjon]]):',
- 'fancycaptcha-badlogin' => 'Skriv inn ordene som dukker opp i boksen nedenfor for å hjelpe oss å beskytte oss mot passordtyveri ([[Special:Captcha/help|mer informasjon]]):',
- 'fancycaptcha-createaccount' => 'Skriv inn ordene som dukker opp i boksen nedenfor for å hjelpe oss å beskytte oss mot automatisk kontoopprettelse ([[Special:Captcha/help|mer informasjon]]):',
+ 'fancycaptcha-addurl' => 'Din endring inkluderer nye eksterne lenker. For hjelpe oss å beskytte oss mot automatisk spam, vennligst skriv inn ordene som kommer opp i denne boksen ([[Special:Captcha/help|mer informasjon]]):', # Fuzzy
+ 'fancycaptcha-badlogin' => 'Skriv inn ordene som dukker opp i boksen nedenfor for å hjelpe oss å beskytte oss mot passordtyveri ([[Special:Captcha/help|mer informasjon]]):', # Fuzzy
+ 'fancycaptcha-createaccount' => 'Skriv inn ordene som dukker opp i boksen nedenfor for å hjelpe oss å beskytte oss mot automatisk kontoopprettelse ([[Special:Captcha/help|mer informasjon]]):', # Fuzzy
'fancycaptcha-create' => 'Skriv inn ordene som dukker opp i boksen nedenfor for å opprette siden ([[Special:Captcha/help|mer informasjon]]):',
'fancycaptcha-edit' => 'For å endre denne siden, vennligst skriv inn ordene som dukker opp i boksen nedenfor ([[Special:Captcha/help|mer informasjon]]):',
- 'fancycaptcha-sendemail' => 'For å beskytte mot automatisert spam så må du skrive ordene under inn i tekstboksen ([[Special:Captcha/help|mer informasjon]]):',
+ 'fancycaptcha-sendemail' => 'For å beskytte mot automatisert spam så må du skrive ordene under inn i tekstboksen ([[Special:Captcha/help|mer informasjon]]):', # Fuzzy
+ 'fancycaptcha-reload-text' => 'Last inn ny',
);
/** Low German (Plattdüütsch)
@@ -1048,39 +1116,42 @@ $messages['nb'] = array(
*/
$messages['nds'] = array(
'fancycaptcha-addurl' => 'In dien Ännern sünd ne’e Weblenken in.
-As Schutz gegen automaatsch Spam, geev disse Bookstavenreeg in dat Feld ünnen in ([[Special:Captcha/help|mehr Infos]]).',
- 'fancycaptcha-badlogin' => 'As Schutz gegen Passwoord-Knackers, geev disse Bookstavenreeg in dat Feld ünnen in ([[Special:Captcha/help|mehr Infos]]).',
- 'fancycaptcha-createaccount' => 'As Schutz gegen dat automaatsch Opstellen vun ne’e Brukerkonten, geev disse Bookstavenreeg in dat Feld ünnen in ([[Special:Captcha/help|mehr Infos]]).',
+As Schutz gegen automaatsch Spam, geev disse Bookstavenreeg in dat Feld ünnen in ([[Special:Captcha/help|mehr Infos]]).', # Fuzzy
+ 'fancycaptcha-badlogin' => 'As Schutz gegen Passwoord-Knackers, geev disse Bookstavenreeg in dat Feld ünnen in ([[Special:Captcha/help|mehr Infos]]).', # Fuzzy
+ 'fancycaptcha-createaccount' => 'As Schutz gegen dat automaatsch Opstellen vun ne’e Brukerkonten, geev disse Bookstavenreeg in dat Feld ünnen in ([[Special:Captcha/help|mehr Infos]]).', # Fuzzy
'fancycaptcha-create' => 'Disse Sied nee optostellen, geev disse Bookstavenreeg in dat Feld ünnen in ([[Special:Captcha/help|mehr Infos]]).',
'fancycaptcha-edit' => 'Disse Sied to ännern, geev disse Bookstavenreeg in dat Feld ünnen in ([[Special:Captcha/help|mehr Infos]]).',
);
-/** Nedersaksies (Nedersaksies)
+/** Low Saxon (Netherlands) (Nedersaksies)
* @author Servien
*/
$messages['nds-nl'] = array(
'fancycaptcha-addurl' => "Joew bewarking bevat uutgaonde verwiezingen.
-Um dit projekt te bescharmen tegen ongewunst reklame, mö'j t woord dat hieronder steet invullen ([[Special:Captcha/help|hulpe]]):",
- 'fancycaptcha-badlogin' => "Um disse webstee te beveiligen tegen t kraken van wachtwoorden, wö'j verzöcht um de woorden die'j hieronder zien in te vullen ([[Special:Captcha/help|hulpe]]):",
- 'fancycaptcha-createaccount' => "Um disse wiki te bescharmen tegen t automaties anmaken van gebrukersprefielen mö'j t woord hieronder invullen ([[Special:Captcha/help|hulpe]]):",
+Um dit projekt te bescharmen tegen automatiese spam, mu'j t woord dat hieronder steet invullen ([[Special:Captcha/help|hulpe]]):",
+ 'fancycaptcha-badlogin' => "Um disse webstee te beveiligen tegen t kraken van wachtwoorden, mu'j de woorden die'j hieronder zien effen invullen ([[Special:Captcha/help|hulpe]]):",
+ 'fancycaptcha-createaccount' => "Um disse wiki te bescharmen tegen t automaties anmaken van gebrukersprofielen mu'j t woord hieronder invullen ([[Special:Captcha/help|hulpe]]):",
'fancycaptcha-create' => "Um n pagina an te maken, mö'j t woord dat hieronder steet invullen
([[Special:Captcha/help|hulpe]]):",
- 'fancycaptcha-edit' => "Joew bewarking bevat nieje uutgaonde verwiezingen. Um disse wiki te bescharmen tegen ongewunste reklame mö'j de woorden hieronder invullen ([[Special:Captcha/help|hulpe]]):",
- 'fancycaptcha-sendemail' => 'Voer de woorden die hieronder staon in t invoerveld in as bescharming tegen automatiese ongewunste reklame ([[Special:Captcha/help|meer informasie]]):',
+ 'fancycaptcha-edit' => 'Vul de woorden die hieronder staon in um disse zied te bewarken ([[Special:Captcha/help|hulpe]]):',
+ 'fancycaptcha-sendemail' => 'Voer de woorden die hieronder staon in t invoerveld in as bescharming tegen automatiese ongewunste reklame
+([[Special:Captcha/help|hulpe]]):',
+ 'fancycaptcha-reload-text' => 'Verniejen',
);
/** Dutch (Nederlands)
+ * @author HanV
* @author Siebrand
*/
$messages['nl'] = array(
'fancycaptcha-desc' => "Generator voor opgedirkte captcha's voor ConfirmEdit",
'fancycaptcha-addurl' => 'Uw bewerking bevat nieuwe externe koppelingen.
Voer de woorden die hieronder verschijnen in het invoerveld in als bescherming tegen automatische spam ([[Special:Captcha/help|meer informatie]]):',
- 'fancycaptcha-badlogin' => 'Voer de woorden die hieronder verschijnen in het invoerveld in als bescherming tegen geautomatiseerde wachtwoordaanvallen ([[Special:Captcha/help|meer informatie]]):',
- 'fancycaptcha-createaccount' => 'Voer de woorden die hieronder verschijnen in het invoerveld in ter bescherming tegen het geautomatiseerd aanmaken van gebruikers ([[Special:Captcha/help|meer informatie]]):',
+ 'fancycaptcha-badlogin' => 'Voer de woorden die hieronder getoond worden in het invoerveld in als bescherming tegen het automatisch kraken van wachtwoorden ([[Special:Captcha/help|meer informatie]]):',
+ 'fancycaptcha-createaccount' => 'Voer de woorden die hieronder getoond worden in het invoerveld in ter bescherming tegen het geautomatiseerd aanmaken van gebruikers ([[Special:Captcha/help|meer informatie]]):',
'fancycaptcha-create' => 'Voer de woorden die hieronder verschijnen in het invoerveld in om de pagina aan te maken ([[Special:Captcha/help|meer informatie]]):',
'fancycaptcha-edit' => 'Voer de woorden die hieronder verschijnen in het invoerveld in om deze pagina te bewerken ([[Special:Captcha/help|meer informatie]]):',
- 'fancycaptcha-sendemail' => 'Voer de woorden die hieronder verschijnen in het invoerveld in als bescherming tegen geautomatiseerde spam ([[Special:Captcha/help|meer informatie]]):',
+ 'fancycaptcha-sendemail' => 'Voer de woorden die hieronder getoond worden in het invoerveld in als bescherming tegen spam ([[Special:Captcha/help|meer informatie]]):',
'fancycaptcha-reload-text' => 'Verversen',
);
@@ -1089,7 +1160,7 @@ Voer de woorden die hieronder verschijnen in het invoerveld in als bescherming t
*/
$messages['nl-informal'] = array(
'fancycaptcha-addurl' => 'Je bewerking bevat nieuwe externe koppelingen.
-Voer de woorden die hieronder verschijnen in het invoerveld in als bescherming tegen automatische spam ([[Special:Captcha/help|meer informatie]]):',
+Voer de woorden die hieronder verschijnen in het invoerveld in als bescherming tegen automatische spam ([[Special:Captcha/help|meer informatie]]):', # Fuzzy
);
/** Norwegian Nynorsk (norsk nynorsk)
@@ -1098,12 +1169,12 @@ Voer de woorden die hieronder verschijnen in het invoerveld in als bescherming t
*/
$messages['nn'] = array(
'fancycaptcha-addurl' => 'Endringa di inneheld nye utlenkjer.
-For å hjelpa oss med å unngå automatisert spam, ver venleg og skriv inn orda som kjem til syne i boksen under ([[Special:Captcha/help|meir informasjon]]):',
- 'fancycaptcha-badlogin' => 'Skriv inn orda som kjem til syne i boksen nedanfor for å hjelpa oss med å unngå automatisert passordknekking ([[Special:Captcha/help|meir informasjon]]):',
- 'fancycaptcha-createaccount' => 'Skriv inn orda som kjem til syne i boksen nedanfor for å hjelpa oss med å unngå automatisk kontooppretting ([[Special:Captcha/help|meir informasjon]]):',
+For å hjelpa oss med å unngå automatisert spam, ver venleg og skriv inn orda som kjem til syne i boksen under ([[Special:Captcha/help|meir informasjon]]):', # Fuzzy
+ 'fancycaptcha-badlogin' => 'Skriv inn orda som kjem til syne i boksen nedanfor for å hjelpa oss med å unngå automatisert passordknekking ([[Special:Captcha/help|meir informasjon]]):', # Fuzzy
+ 'fancycaptcha-createaccount' => 'Skriv inn orda som kjem til syne i boksen nedanfor for å hjelpa oss med å unngå automatisk kontooppretting ([[Special:Captcha/help|meir informasjon]]):', # Fuzzy
'fancycaptcha-create' => 'Skriv inn orda som kjem til syne i boksen nedanfor for å oppretta sida ([[Special:Captcha/help|meir informasjon]]):',
'fancycaptcha-edit' => 'For å endra denne sida, ver venleg og skriv inn orda som kjem til syne i boksen nedanfor ([[Special:Captcha/help|meir informasjon]]):',
- 'fancycaptcha-sendemail' => 'For å hjelpa til mot sjølvgåande spamming, skriv inn orda som kjem til syne i boksen under ([[Special:Captcha/help|meir informasjon]]):',
+ 'fancycaptcha-sendemail' => 'For å hjelpa til mot sjølvgåande spamming, skriv inn orda som kjem til syne i boksen under ([[Special:Captcha/help|meir informasjon]]):', # Fuzzy
'fancycaptcha-reload-text' => 'Oppdater',
);
@@ -1112,39 +1183,41 @@ For å hjelpa oss med å unngå automatisert spam, ver venleg og skriv inn orda
*/
$messages['oc'] = array(
'fancycaptcha-desc' => "Generador d’imatges ''captcha'' antirobòts que demandan una confirmacion umana de las modificacions.",
- 'fancycaptcha-addurl' => "Vòstra modificacion inclutz de ligams extèrnes novèls. Per verificar que s’agisson pas de spams automatics, epicatz los mots qu'apareisson dins la bóstia çaijós ([[Special:Captcha/help|mai d’entresenhas]]) :",
- 'fancycaptcha-badlogin' => 'Per ajudar a vos protegir contra lo piratatge de compte per de senhals automatics, mercés de picar los mots que s’afichan dins aquesta bóstia ([[Special:Captcha/help|Ajuda]]) :',
- 'fancycaptcha-createaccount' => 'Coma proteccion contra las creacions de compte abusivas, picatz los mots çaijós dins la bóstia ([[Special:Captcha/help|mai d’entresenhas]]) :',
+ 'fancycaptcha-addurl' => "Vòstra modificacion inclutz de ligams extèrnes novèls. Per verificar que s’agisson pas de spams automatics, epicatz los mots qu'apareisson dins la bóstia çaijós ([[Special:Captcha/help|mai d’entresenhas]]) :", # Fuzzy
+ 'fancycaptcha-badlogin' => 'Per ajudar a vos protegir contra lo piratatge de compte per de senhals automatics, mercés de picar los mots que s’afichan dins aquesta bóstia ([[Special:Captcha/help|Ajuda]]) :', # Fuzzy
+ 'fancycaptcha-createaccount' => 'Coma proteccion contra las creacions de compte abusivas, picatz los mots çaijós dins la bóstia ([[Special:Captcha/help|mai d’entresenhas]]) :', # Fuzzy
'fancycaptcha-create' => "Vòstra modificacion inclutz de ligams extèrnes novèls. Per verificar que s’agisson pas de spams automatics, picatz los mots qu'apareisson dins la bóstia çaijós ([[Special:Captcha/help|mai d’entresenhas]]) :",
'fancycaptcha-edit' => "Vòstra modificacion inclutz de ligams extèrnes novèls. Per verificar que s’agís pas de spam automatic, picatz los mots qu'apareisson dins la bóstia çaijós ([[Special:Captcha/help|mai d’entresenhas]]) :",
- 'fancycaptcha-sendemail' => "Per tal de nos ajudar a prevenir lo spam automatic, entratz los mots qu'apareisson dins la bóstia çaijós ([[Special:Captcha/help|mai d’informacions]]) :",
+ 'fancycaptcha-sendemail' => "Per tal de nos ajudar a prevenir lo spam automatic, entratz los mots qu'apareisson dins la bóstia çaijós ([[Special:Captcha/help|mai d’informacions]]) :", # Fuzzy
+ 'fancycaptcha-reload-text' => 'Actualizar',
);
-/** Oriya (ଓଡ଼ିଆ)
+/** Oriya (ଓଡ଼ିଆ)
* @author Psubhashish
*/
$messages['or'] = array(
'fancycaptcha-addurl' => 'ଆପଣଙà­à¬• ସମà­à¬ªà¬¾à¬¦à¬¨à¬¾à¬°à­‡ ନୂଆ ବାହାର ଲିଙà­à¬• ରହିଛି ।
-ଆପେଆପେ ହେଉଥିବା ସà­à¬ªà¬¾à¬®à¬° ପà­à¬°à¬¤à¬¿à¬°à­‹à¬§ କରିବା ନିମନà­à¬¤à­‡ ଘର ତଳେ ଥିବା ଶବà­à¬¦à¬¸à¬¬à­ ଦିଅନà­à¬¤à­ ([[Special:Captcha/help|ଅଧିକ ବିବରଣୀ]]):',
- 'fancycaptcha-badlogin' => 'ଆପେଆପେ ହେଉଥିବା ପାସବାରà­à¬¡à¬¼ ଚୋରାଇବାକୠପà­à¬°à¬¤à¬¿à¬°à­‹à¬§ କରିବା ନିମନà­à¬¤à­‡ ଦୟାକରି à¬à¬¹à¬¿ ଘରଭିତରେ ଥିବା ଶବà­à¬¦à¬¸à¬¬à­à¬•à­ ତାହା ତଳେ ଥିବା ବାକà­à¬¸à¬°à­‡ ଟାଇପ କରନà­à¬¤à­ । ([[Special:Captcha/help|ଅଧିକ ସୂଚନା]]):',
- 'fancycaptcha-createaccount' => 'ଆପେଆପେ ଖାତା ଖୋଲିବାକୠଅଟକାଇବା ପାଇଠଦୟାକରି à¬à¬¹à¬¿ ଘରଭିତରେ ଥିବା ଶବà­à¬¦à¬¸à¬¬à­à¬•à­ ତାହା ତଳେ ଥିବା ବାକà­à¬¸à¬°à­‡ ଟାଇପ କରନà­à¬¤à­ । ([[Special:Captcha/help|ଅଧିକ ସୂଚନା]]):',
+ଆପେଆପେ ହେଉଥିବା ସà­à¬ªà¬¾à¬®à¬° ପà­à¬°à¬¤à¬¿à¬°à­‹à¬§ କରିବା ନିମନà­à¬¤à­‡ ଘର ତଳେ ଥିବା ଶବà­à¬¦à¬¸à¬¬à­ ଦିଅନà­à¬¤à­ ([[Special:Captcha/help|ଅଧିକ ବିବରଣୀ]]):', # Fuzzy
+ 'fancycaptcha-badlogin' => 'ଆପେଆପେ ହେଉଥିବା ପାସବାରà­à¬¡à¬¼ ଚୋରାଇବାକୠପà­à¬°à¬¤à¬¿à¬°à­‹à¬§ କରିବା ନିମନà­à¬¤à­‡ ଦୟାକରି à¬à¬¹à¬¿ ଘରଭିତରେ ଥିବା ଶବà­à¬¦à¬¸à¬¬à­à¬•à­ ତାହା ତଳେ ଥିବା ବାକà­à¬¸à¬°à­‡ ଟାଇପ କରନà­à¬¤à­ । ([[Special:Captcha/help|ଅଧିକ ସୂଚନା]]):', # Fuzzy
+ 'fancycaptcha-createaccount' => 'ଆପେଆପେ ଖାତା ଖୋଲିବାକୠଅଟକାଇବା ପାଇଠଦୟାକରି à¬à¬¹à¬¿ ଘରଭିତରେ ଥିବା ଶବà­à¬¦à¬¸à¬¬à­à¬•à­ ତାହା ତଳେ ଥିବା ବାକà­à¬¸à¬°à­‡ ଟାଇପ କରନà­à¬¤à­ । ([[Special:Captcha/help|ଅଧିକ ସୂଚନା]]):', # Fuzzy
'fancycaptcha-create' => 'à¬à¬¹à¬¿ ପୃଷà­à¬ à¬¾à¬Ÿà¬¿à¬•à­ ତିଆରିବା ନିମନà­à¬¤à­‡, ଘର ତଳେ ଥିବା ଶବà­à¬¦à¬Ÿà¬¿à¬•à­ à¬à¬ à¬¾à¬°à­‡ ଦିଅନà­à¬¤à­ ([[Special:Captcha/help|ଅଧିକ ଜାଣନà­à¬¤à­]]):',
'fancycaptcha-edit' => 'à¬à¬¹à¬¿ ପୃଷà­à¬ à¬¾à¬Ÿà¬¿à¬•à­ ବଦଳାଇବା ନିମନà­à¬¤à­‡, ଘର ତଳେ ଥିବା ଶବà­à¬¦à¬Ÿà¬¿à¬•à­ à¬à¬ à¬¾à¬°à­‡ ଦିଅନà­à¬¤à­ ([[Special:Captcha/help|ଅଧିକ ଜାଣନà­à¬¤à­]]):',
- 'fancycaptcha-sendemail' => 'ଆପେଆପେ ହେଉଥିବା ସà­à¬ªà¬¾à¬®à¬•à­ ରୋକିବା ନିମନà­à¬¤à­‡ ଦୟାକରି à¬à¬¹à¬¿ ଘରଭିତରେ ଥିବା ଶବà­à¬¦à¬¸à¬¬à­à¬•à­ ତାହା ତଳେ ଥିବା ବାକà­à¬¸à¬°à­‡ ଟାଇପ କରନà­à¬¤à­ । ([[Special:Captcha/help|ଅଧିକ ସୂଚନା]]):',
+ 'fancycaptcha-sendemail' => 'ଆପେଆପେ ହେଉଥିବା ସà­à¬ªà¬¾à¬®à¬•à­ ରୋକିବା ନିମନà­à¬¤à­‡ ଦୟାକରି à¬à¬¹à¬¿ ଘରଭିତରେ ଥିବା ଶବà­à¬¦à¬¸à¬¬à­à¬•à­ ତାହା ତଳେ ଥିବା ବାକà­à¬¸à¬°à­‡ ଟାଇପ କରନà­à¬¤à­ । ([[Special:Captcha/help|ଅଧିକ ସୂଚନା]]):', # Fuzzy
);
/** Polish (polski)
* @author Chrumps
* @author Sp5uhe
+ * @author WTM
*/
$messages['pl'] = array(
'fancycaptcha-desc' => 'Generator obrazka, którego odczytanie jest wymagane dla zatwierdzenia edycji.',
- 'fancycaptcha-addurl' => 'Twoja edycja zawiera nowe linki zewnętrzne. Ze względu na ochronę przed zautomatyzowanym spamem prosimy o wpisanie słów, które widzisz poniżej, do pola tekstowego ([[Special:Captcha/help|pomoc]]):',
- 'fancycaptcha-badlogin' => 'Ze względu na zabezpieczenie przed automatycznym łamaniem haseł prosimy o wpisanie słów, które widzisz poniżej, do pola tekstowego ([[Special:Captcha/help|pomoc]]):',
- 'fancycaptcha-createaccount' => 'Ze względu na ochronę przed automatycznym spamem, aby się zarejestrować musisz wpisać słowo, które widzisz poniżej, do pola tekstowego ([[Special:Captcha/help|pomoc]])',
- 'fancycaptcha-create' => 'Aby utworzyć tę stronę, wpisz słowa, które widzisz poniżej, do pola tekstowego ([[Special:Captcha/help|pomoc]]):',
- 'fancycaptcha-edit' => 'Aby edytować tę stronę, wpisz słowa, które widzisz poniżej, do pola tekstowego ([[Special:Captcha/help|pomoc]]):',
- 'fancycaptcha-sendemail' => 'Zabezpieczenie przed automatycznie dodawanym spamem. Wprowadzić słowa widoczne w poniższym prostokącie ([[Special:Captcha/help|więcej informacji]]).',
+ 'fancycaptcha-addurl' => 'Twoja edycja zawiera nowe linki zewnętrzne. Ze względu na ochronę przed zautomatyzowanym spamem prosimy o wpisanie słów, które widzisz poniżej, do pola tekstowego ([[Special:Captcha/help|pomoc]]):', # Fuzzy
+ 'fancycaptcha-badlogin' => 'Ze względu na zabezpieczenie przed automatycznym łamaniem haseł prosimy o wpisanie słów, które widzisz poniżej, do pola tekstowego ([[Special:Captcha/help|pomoc]]):', # Fuzzy
+ 'fancycaptcha-createaccount' => 'Ze względu na ochronę przed automatycznym spamem, aby się zarejestrować musisz wpisać słowo, które widzisz poniżej, do pola tekstowego ([[Special:Captcha/help|pomoc]])', # Fuzzy
+ 'fancycaptcha-create' => 'Aby utworzyć tę stronę, przepisz słowa, które widzisz poniżej, do pola tekstowego ([[Special:Captcha/help|pomoc]]):',
+ 'fancycaptcha-edit' => 'Aby edytować tę stronę, przepisz słowa, które widzisz poniżej, do pola tekstowego ([[Special:Captcha/help|pomoc]]):',
+ 'fancycaptcha-sendemail' => 'Zabezpieczenie przed automatycznie dodawanym spamem. Wprowadzić słowa widoczne w poniższym prostokącie ([[Special:Captcha/help|więcej informacji]]).', # Fuzzy
'fancycaptcha-reload-text' => 'Odśwież',
);
@@ -1154,12 +1227,13 @@ $messages['pl'] = array(
*/
$messages['pms'] = array(
'fancycaptcha-addurl' => "Soa modìfica a l'ha andrinta dj'anliure esterne neuve.
-Për dene na man a vardesse da la reclam aotomatisà, për piasì, ch'a l'arbata le paròle ch'a s-ciàira ambelessì sota ([[Special:Captcha/help|për savejne dë pì]]):",
- 'fancycaptcha-badlogin' => "Për dene na man a vardesse da ij programa ch'a fan ciav fàosse, për piasì, ch'a l'arbata le paròle ch'a s-ciàira ambelessì sota ([[Special:Captcha/help|për savejne dë pì]]):",
- 'fancycaptcha-createaccount' => "Për dene na man a vardesse da ij programa ch'a deurbo cont neuv n'aotomàtich, për piasì, ch'a l'arbata le paròle ch'a s-ciàira ambelessì sota ([[Special:Captcha/help|për savejne dë pì]]):",
+Për protege la wiki da la rumenta aotomatisà, për piasì, ch'a l'arbata le paròle ch'a s-ciàira ant la casela ([[Special:Captcha/help|për savejne dë pì]]):",
+ 'fancycaptcha-badlogin' => "Për protege la wiki dai programa ch'a sërco ëd freghé le ciav, për piasì, ch'a l'arbata le paròle ch'a s-ciàira ant la casela ambelessì-sota ([[Special:Captcha/help|për savejne dë pì]]):",
+ 'fancycaptcha-createaccount' => "Për protege la wiki dai programa ch'a deurbo ëd cont neuv n'aotomàtich, për piasì, ch'a l'arbata le paròle ch'a s-ciàira ant la casela ambelessì-sota ([[Special:Captcha/help|për savejne dë pì]]):",
'fancycaptcha-create' => "Për creé sta pàgina-i d'amblé, për piasì, ch'a l'arbata le paròle ch'a s-ciàira ambelessì sota ([[Special:Captcha/help|për savejne dë pì]]):",
'fancycaptcha-edit' => "Për fe-ie dle modìfiche ansima a sta pàgina-sì, për piasì, ch'a l'arbata le paròle ch'a s-ciàira ambelessì sota ([[Special:Captcha/help|për savejne dë pì]]):",
- 'fancycaptcha-sendemail' => "Për giuté a protegi contra la rumenta automàtica, për piasì ch'a anseriss le paròle che as vëddo sota ant la casela ([[Special:Captcha/help|për savèjne ëd pi]]):",
+ 'fancycaptcha-sendemail' => "Për protege la wiki contra la rumenta automàtica, për piasì ch'a anserissa le paròle che as vëddo ant la casela sì-sota ([[Special:Captcha/help|për savèjne ëd pi]]):",
+ 'fancycaptcha-reload-text' => 'Agiorné',
);
/** Western Punjabi (پنجابی)
@@ -1167,20 +1241,20 @@ Për dene na man a vardesse da la reclam aotomatisà, për piasì, ch'a l'arbata
*/
$messages['pnb'] = array(
'fancycaptcha-addurl' => 'تواڈی تبدیلی چ نویں بارلے جوڑ نیں۔
-اس صÙØ­Û’ نوں تبدیل کرن واسطے، Ù…Ûربانی کر Ú©Û’ ڈبے Ú† دتے Ú¯Û“ شبداں نوں Ù„Ú©Ú¾Ùˆ ([[Special:Captcha/help|مزید جانکاری]]):',
- 'fancycaptcha-badlogin' => 'اپنے آپ کنجی توڑن دے خلا٠مدد واسطے، Ù…Ûربانی کر Ú©Û’ ڈبے Ú† دتے Ú¯Û“ شبداں نوں Ù„Ú©Ú¾Ùˆ ([[Special:Captcha/help|مزید جانکاری]]):',
- 'fancycaptcha-createaccount' => 'اپنے آپ غلط نویں کھاتے بنان نوں روکن واسطے، Ù…Ûربانی کر Ú©Û’ ڈبے Ú† دتے Ú¯Û“ شبداں نوں Ù„Ú©Ú¾Ùˆ ([[Special:Captcha/help|مزید جانکاری]]):',
+اس صÙØ­Û’ نوں تبدیل کرن واسطے، Ù…Ûربانی کر Ú©Û’ ڈبے Ú† دتے Ú¯Û“ شبداں نوں Ù„Ú©Ú¾Ùˆ ([[Special:Captcha/help|مزید جانکاری]]):', # Fuzzy
+ 'fancycaptcha-badlogin' => 'اپنے آپ کنجی توڑن دے خلا٠مدد واسطے، Ù…Ûربانی کر Ú©Û’ ڈبے Ú† دتے Ú¯Û“ شبداں نوں Ù„Ú©Ú¾Ùˆ ([[Special:Captcha/help|مزید جانکاری]]):', # Fuzzy
+ 'fancycaptcha-createaccount' => 'اپنے آپ غلط نویں کھاتے بنان نوں روکن واسطے، Ù…Ûربانی کر Ú©Û’ ڈبے Ú† دتے Ú¯Û“ شبداں نوں Ù„Ú©Ú¾Ùˆ ([[Special:Captcha/help|مزید جانکاری]]):', # Fuzzy
'fancycaptcha-create' => 'صÙØ­Û Ø¨Ù†Ø§Ù† واسطے، Ù…Ûربانی کر Ú©Û’ ڈبے Ú† دتے Ú¯Û“ شبداں نوں Ù„Ú©Ú¾Ùˆ ([[Special:Captcha/help|مزید جانکاری]]):',
'fancycaptcha-edit' => 'اس صÙØ­Û’ تے تبدیلی کرن واسطے، Ù…Ûربانی کر Ú©Û’ ڈبے Ú† دتے Ú¯Û“ شبداں نوں Ù„Ú©Ú¾Ùˆ ([[Special:Captcha/help|مزید جانکاری]]):',
- 'fancycaptcha-sendemail' => 'اپنے آپ غلط مال آن نوں روکن واسطے، Ù…Ûربانی کر Ú©Û’ ڈبے Ú† دتے Ú¯Û“ شبداں نوں Ù„Ú©Ú¾Ùˆ ([[Special:Captcha/help|مزید جانکاری]]):',
+ 'fancycaptcha-sendemail' => 'اپنے آپ غلط مال آن نوں روکن واسطے، Ù…Ûربانی کر Ú©Û’ ڈبے Ú† دتے Ú¯Û“ شبداں نوں Ù„Ú©Ú¾Ùˆ ([[Special:Captcha/help|مزید جانکاری]]):', # Fuzzy
);
/** Pashto (پښتو)
* @author Ahmed-Najib-Biabani-Ibrahimkhel
*/
$messages['ps'] = array(
- 'fancycaptcha-create' => 'Ø¯Ø¯Û Ù…Ø® د جوړلو لپاره، لطÙاً ورکړل شوي توري Ú…Ù†Ú«Ù‡ Ú†Û ØªØ§Ø³Ùˆ ته ښکاري Ù‡Ù…Ø§ØºØ³Û Ú©Ù¼ مټ په لانديني چوکاټ Ú©Û ÙˆÙ„ÙŠÚ©ÛŒ ([[Special:Captcha/help|نور مالومات]]):',
- 'fancycaptcha-edit' => 'Ø¯Ø¯Û Ù…Ø® د سمولو لپاره، لطÙاً ورکړل شوي توري Ú…Ù†Ú«Ù‡ Ú†Û ØªØ§Ø³Û ØªÙ‡ ښکاري Ù‡Ù…Ø§ØºØ³Û Ú©Ù¼ مټ په لانديني چوکاټ Ú©Û ÙˆÙ„ÙŠÚ©ÛŒ ([[Special:Captcha/help|نور مالومات]]):',
+ 'fancycaptcha-create' => 'Ø¯Ø¯Û Ù…Ø® د جوړلو لپاره، لطÙاً ورکړل شوي توري Ú†Û Ú…Ù†Ú¯Ù‡ ØªØ§Ø³Û ØªÙ‡ ښکاري Ù‡Ù…Ø§ØºØ³Û Ú©Ù¼ مټ په لانديني چوکاټ Ú©Û ÙˆÙ„ÙŠÚ©ÛŒ ([[Special:Captcha/help|نور مالومات]]):',
+ 'fancycaptcha-edit' => 'Ø¯Ø¯Û Ù…Ø® د سمولو لپاره، لطÙاً ورکړل شوي توري Ú†Û Ú…Ù†Ú¯Ù‡ ØªØ§Ø³Û ØªÙ‡ ښکاري Ù‡Ù…Ø§ØºØ³Û Ú©Ù¼ مټ په لانديني چوکاټ Ú©Û ÙˆÙ„ÙŠÚ©ÛŒ ([[Special:Captcha/help|نور مالومات]]):',
);
/** Portuguese (português)
@@ -1190,32 +1264,42 @@ $messages['ps'] = array(
$messages['pt'] = array(
'fancycaptcha-desc' => 'Gerador sofisticado de captcha para o Confirm Edit',
'fancycaptcha-addurl' => "A sua edição introduziu links externos novos.
-Para ajudar a prevenir o ''spam'' automatizado, por favor, introduza na caixa abaixo as palavras apresentadas ([[Special:Captcha/help|mais informações]]):",
- 'fancycaptcha-badlogin' => 'Para ajudar a prevenir mecanismos automatizados de descoberta de palavras-chave, por favor, introduza na caixa abaixo as palavras apresentadas ([[Special:Captcha/help|mais informações]]):',
- 'fancycaptcha-createaccount' => 'Para ajudar a prevenir a criação de contas automatizada, por favor, introduza na caixa abaixo as palavras apresentadas ([[Special:Captcha/help|mais informações]]):',
+Para ajudar a prevenir o ''spam'' automatizado, por favor, introduza na caixa abaixo as palavras apresentadas ([[Special:Captcha/help|mais informações]]):", # Fuzzy
+ 'fancycaptcha-badlogin' => 'Para ajudar a prevenir mecanismos automatizados de descoberta de palavras-chave, por favor, introduza na caixa abaixo as palavras apresentadas ([[Special:Captcha/help|mais informações]]):', # Fuzzy
+ 'fancycaptcha-createaccount' => 'Para ajudar a prevenir a criação de contas automatizada, por favor, introduza na caixa abaixo as palavras apresentadas ([[Special:Captcha/help|mais informações]]):', # Fuzzy
'fancycaptcha-create' => 'Para criar a página, por favor, introduza na caixa abaixo as palavras apresentadas ([[Special:Captcha/help|mais informações]]):',
'fancycaptcha-edit' => 'Para editar esta página, por favor, introduza na caixa abaixo as palavras apresentadas ([[Special:Captcha/help|mais informações]]):',
- 'fancycaptcha-sendemail' => "Para ajudar a prevenir o ''spam'' automatizado, por favor, introduza na caixa as palavras que aparecem abaixo ([[Special:Captcha/help|mais informações]]):",
+ 'fancycaptcha-sendemail' => "Para ajudar a prevenir o ''spam'' automatizado, por favor, introduza na caixa as palavras que aparecem abaixo ([[Special:Captcha/help|mais informações]]):", # Fuzzy
);
/** Brazilian Portuguese (português do Brasil)
+ * @author Cainamarques
* @author Eduardo.mps
* @author Giro720
*/
$messages['pt-br'] = array(
- 'fancycaptcha-addurl' => "A sua edição inclui novas ligações externas. Como prevenção contra sistemas automatizados que inserem ''spam'', por favor, introduza as palavras exibidas na seguinte caixa ([[Special:Captcha/help|mais informações]]):",
- 'fancycaptcha-badlogin' => 'Como prevenção contra formas automatizadas de descoberta de palavras-chave, por favor, introduza as palavras exibidas na seguinte caixa ([[Special:Captcha/help|mais informações]]):',
- 'fancycaptcha-createaccount' => 'Como prevenção contra sistemas automatizados de criação de contas, por favor, introduza as palavras exibidas na seguinte caixa ([[Special:Captcha/help|mais informações]]):',
+ 'fancycaptcha-addurl' => "A sua edição inclui novas ligações externas. Para proteger a wiki contra sistemas automatizados que inserem ''spam'', por favor, introduza as palavras exibidas na seguinte caixa ([[Special:Captcha/help|mais informações]]):",
+ 'fancycaptcha-badlogin' => 'Para proteger a wiki contra programas automatizados de detecção de senhas, por favor, introduza as palavras exibidas na seguinte caixa ([[Special:Captcha/help|mais informações]]):',
+ 'fancycaptcha-createaccount' => 'Para proteger a wiki contra sistemas automatizados de criação de contas, solicitamos que introduza as palavras exibidas na seguinte caixa ([[Special:Captcha/help|mais informações]]):',
'fancycaptcha-create' => 'Para criar a página, por favor, introduza as palavras exibidas na seguinte caixa ([[Special:Captcha/help|mais informações]]):',
'fancycaptcha-edit' => 'Para editar esta página, por favor, introduza as palavras exibidas na seguinte caixa ([[Special:Captcha/help|mais informações]]):',
- 'fancycaptcha-sendemail' => "Para ajudar a prevenir o ''spam'' automatizado, por favor, introduza na caixa as palavras que aparecem abaixo ([[Special:Captcha/help|mais informações]]):",
+ 'fancycaptcha-sendemail' => "Para ajudar a combater ''spam'' automatizado, pedimos que, por favor, introduza as palavras que aparecem abaixo ([[Special:Captcha/help|mais informações]]):",
+ 'fancycaptcha-reload-text' => 'Atualizar',
+);
+
+/** Quechua (Runa Simi)
+ * @author AlimanRuna
+ */
+$messages['qu'] = array(
+ 'fancycaptcha-create' => "P'anqata kamarinaykipaqqa kay qatiq kahachapi kaq rimakunata yaykuchiy ([[Special:Captcha/help|astawan yachay]]):",
+ 'fancycaptcha-edit' => "Kay p'anqata llamk'anaykipaqqa kay qatiq kahachapi kaq rimakunata yaykuchiy ([[Special:Captcha/help|astawan yachay]]):",
);
/** Romansh (rumantsch)
* @author Kazu89
*/
$messages['rm'] = array(
- 'fancycaptcha-createaccount' => "Per impedir la creaziun automatica da contos d'utilisader, endatescha per plaschair ils bustabs che vegnan mussads sutvart ([[Special:Captcha/help|dapli infos]]):",
+ 'fancycaptcha-createaccount' => "Per impedir la creaziun automatica da contos d'utilisader, endatescha per plaschair ils bustabs che vegnan mussads sutvart ([[Special:Captcha/help|dapli infos]]):", # Fuzzy
);
/** Romanian (română)
@@ -1225,12 +1309,13 @@ $messages['rm'] = array(
*/
$messages['ro'] = array(
'fancycaptcha-addurl' => 'Modificarea dumneavoastră include legături externe noi.
-Pentru a împiedica roboții de spam, vă rugăm să introduceți cuvintele care apar mai jos în căsuță ([[Special:Captcha/help|mai multe detalii]]):',
- 'fancycaptcha-badlogin' => 'Pentru a împiedica spargerea automată a parolelor, vă rugăm să introduceți cuvintele care apar mai jos în căsuță ([[Special:Captcha/help|mai multe detalii]]):',
- 'fancycaptcha-createaccount' => 'Pentru a împiedica crearea automată de conturi, vă rugăm să introduceți cuvintele care apar mai jos în căsuță ([[Special:Captcha/help|mai multe detalii]]):',
+Pentru a împiedica roboții de spam, vă rugăm să introduceți cuvintele care apar mai jos în căsuță ([[Special:Captcha/help|mai multe detalii]]):', # Fuzzy
+ 'fancycaptcha-badlogin' => 'Pentru a împiedica spargerea automată a parolelor, vă rugăm să introduceți cuvintele care apar mai jos în căsuță ([[Special:Captcha/help|mai multe detalii]]):', # Fuzzy
+ 'fancycaptcha-createaccount' => 'Pentru a împiedica crearea automată de conturi, vă rugăm să introduceți cuvintele care apar mai jos în căsuță ([[Special:Captcha/help|mai multe detalii]]):', # Fuzzy
'fancycaptcha-create' => 'Pentru a crea pagina, vă rugăm să introduceți în casetă cuvintele care apar mai jos ([[Special:Captcha/help|mai multe detalii]]):',
'fancycaptcha-edit' => 'Pentru a modifica această pagină, vă rugăm să introduceți în casetă cuvintele care apar mai jos ([[Special:Captcha/help|mai multe detalii]]):',
- 'fancycaptcha-sendemail' => 'Pentru a împiedica roboții de spam, vă rugăm să introduceți cuvintele care apar mai jos în căsuță ([[Special:Captcha/help|mai multe detalii]]):',
+ 'fancycaptcha-sendemail' => 'Pentru a împiedica roboții de spam, vă rugăm să introduceți cuvintele care apar mai jos în căsuță ([[Special:Captcha/help|mai multe detalii]]):', # Fuzzy
+ 'fancycaptcha-reload-text' => 'Reîncarcă',
);
/** tarandíne (tarandíne)
@@ -1238,40 +1323,43 @@ Pentru a împiedica roboții de spam, vă rugăm să introduceți cuvintele care
*/
$messages['roa-tara'] = array(
'fancycaptcha-addurl' => "'U cangiamende tue inglude de le collegaminde esterne.
-Pe aiutà a proteggere condre a 'u spam automateche, pe piacere mitte le parole ca combare sotte ([[Special:Captcha/help|cchiù 'mbormaziune]]):",
- 'fancycaptcha-badlogin' => 'Pe aiutà a proteggere condre a futteminde automatece de password, pe piacere mitte le parole ca combare aqquà sotte ([[Special:Captcha/help|more info]]):',
- 'fancycaptcha-createaccount' => 'Pe aiutà a proteggere condre a ccreazione automateche de cunde utinde, pe piacere mitte le parole ca combare aqquà sotte ([[Special:Captcha/help|more info]]):',
+Pe aiutà a proteggere condre a 'u spam automateche, pe piacere mitte le parole ca combare sotte ([[Special:Captcha/help|cchiù 'mbormaziune]]):", # Fuzzy
+ 'fancycaptcha-badlogin' => 'Pe aiutà a proteggere condre a futteminde automatece de password, pe piacere mitte le parole ca combare aqquà sotte ([[Special:Captcha/help|more info]]):', # Fuzzy
+ 'fancycaptcha-createaccount' => 'Pe aiutà a proteggere condre a ccreazione automateche de cunde utinde, pe piacere mitte le parole ca combare aqquà sotte ([[Special:Captcha/help|more info]]):', # Fuzzy
'fancycaptcha-create' => 'Pe ccrejà sta pàgene, pe piacere mitte le parole ca combare aqquà sotte ([[Special:Captcha/help|more info]]):',
'fancycaptcha-edit' => 'Pe cangià sta pàgene, pe piacere mitte le parole combare aqquà sotte ([[Special:Captcha/help|more info]]):',
- 'fancycaptcha-sendemail' => "Pe aiutà a proteggere condre a spam automatece, pe piacere mitte le parole ca combare aqquà sotte ([[Special:Captcha/help|cchiù 'mbormaziune]]):",
+ 'fancycaptcha-sendemail' => "Pe aiutà a proteggere condre a spam automatece, pe piacere mitte le parole ca combare aqquà sotte ([[Special:Captcha/help|cchiù 'mbormaziune]]):", # Fuzzy
'fancycaptcha-reload-text' => 'Aggiorne',
);
/** Russian (руÑÑкий)
* @author Dim Grits
* @author Lockal
+ * @author Okras
* @author ÐлекÑандр Сигачёв
*/
$messages['ru'] = array(
'fancycaptcha-desc' => 'Ðеобычный CAPTCHA-генератор Ð´Ð»Ñ Ð¿Ð¾Ð´Ñ‚Ð²ÐµÑ€Ð¶Ð´ÐµÐ½Ð¸Ñ Ñ€ÐµÐ´Ð°ÐºÑ‚Ð¸Ñ€Ð¾Ð²Ð°Ð½Ð¸Ñ',
- 'fancycaptcha-addurl' => 'Ваша правка Ñодержит новые внешние ÑÑылки. Ð’ целÑÑ… защиты от Ñпама, пожалуйÑта, введите Ñлова, показанные ниже в рамке ([[Special:Captcha/help|подробнее…]]):',
- 'fancycaptcha-badlogin' => 'Ð’ целÑÑ… защиты от автоматичеÑкого взлома паролей, пожалуйÑта, введите в поле ввода буквы Ñ Ð¸Ð·Ð¾Ð±Ñ€Ð°Ð¶ÐµÐ½Ð¸Ñ ([[Special:Captcha/help|подробнее]]):',
- 'fancycaptcha-createaccount' => 'Ð”Ð»Ñ Ð¿Ñ€ÐµÐ´Ð¾Ñ‚Ð²Ñ€Ð°Ñ‰ÐµÐ½Ð¸Ñ Ð°Ð²Ñ‚Ð¾Ð¼Ð°Ñ‚Ð¸Ñ‡ÐµÑкой региÑтрации учётных запиÑей, пожалуйÑта, введите изображённые Ñимволы в текÑтовое поле ([[Special:Captcha/help|подробнее]]):',
+ 'fancycaptcha-addurl' => 'Ваша правка Ñодержит новые внешние ÑÑылки.
+Ð’ целÑÑ… защиты от Ñпама проÑим Ð²Ð°Ñ Ð²Ð²ÐµÑти Ñлова, показанные ниже в рамке ([[Special:Captcha/help|подробнее…]]):',
+ 'fancycaptcha-badlogin' => 'Ð’ целÑÑ… защиты от автоматичеÑкого взлома паролей проÑим Ð²Ð°Ñ Ð²Ð²ÐµÑти Ñлова, показанные ниже в рамке ([[Special:Captcha/help|подробнее…]]):',
+ 'fancycaptcha-createaccount' => 'Ð”Ð»Ñ Ð¿Ñ€ÐµÐ´Ð¾Ñ‚Ð²Ñ€Ð°Ñ‰ÐµÐ½Ð¸Ñ Ð°Ð²Ñ‚Ð¾Ð¼Ð°Ñ‚Ð¸Ñ‡ÐµÑкой региÑтрации учётных запиÑей проÑим Ð²Ð°Ñ Ð²Ð²ÐµÑти Ñлова, показанные ниже в рамке ([[Special:Captcha/help|подробнее…]]):',
'fancycaptcha-create' => 'Ð”Ð»Ñ ÑÐ¾Ð·Ð´Ð°Ð½Ð¸Ñ Ñтраницы, пожалуйÑта, введите буквы, которые видны на изображении ниже ([[Special:Captcha/help|подробнее…]]):',
'fancycaptcha-edit' => 'Ð”Ð»Ñ Ñ€ÐµÐ´Ð°ÐºÑ‚Ð¸Ñ€Ð¾Ð²Ð°Ð½Ð¸Ñ Ñтраницы, пожалуйÑта, введите буквы, которые видны на изображении ниже ([[Special:Captcha/help|подробнее…]]):',
- 'fancycaptcha-sendemail' => 'Ð’ целÑÑ… защиты от автоматичеÑкого Ñпама, пожалуйÑта, введите показанные ниже Ñлова ([[Special:Captcha/help|подробнее]]):',
+ 'fancycaptcha-sendemail' => 'Ð’ целÑÑ… защиты от автоматичеÑкого Ñпама проÑим Ð²Ð°Ñ Ð²Ð²ÐµÑти Ñлова, показанные ниже в рамке ([[Special:Captcha/help|подробнее…]]):',
+ 'fancycaptcha-reload-text' => 'Обновить',
);
/** Rusyn (руÑиньÑкый)
* @author Gazeb
*/
$messages['rue'] = array(
- 'fancycaptcha-addurl' => 'Ваше ÐµÐ´Ñ–Ñ‚Ð¾Ð²Ð°Ð½Ñ Ð¾Ð±ÑÑгує новы одказы формов URL; про охорону перед автоматічным Ñпамом муÑите опиÑати текÑÑ‚ з наÑтупного образку. ([[Special:Captcha/help|Што тото значіть?]])',
- 'fancycaptcha-badlogin' => 'Ð’ рамках охороны перед автоматічныма пробами угаднути геÑло муÑите опиÑати текÑÑ‚ з наÑтупного образку. ([[Special:Captcha/help|Што тото значіть?]]):',
- 'fancycaptcha-createaccount' => 'Ð’ рамках охороны перед автоматічныма ÑтворёванÑми конт муÑите про Ð²Ñ‹ÐºÐ¾Ð½Ð°Ð½Ñ Ñ€ÐµÒ‘Ñ–Ñтрації опиÑати текÑÑ‚ з наÑтупного образку. ([[Special:Captcha/help|Што тото значіть?]]):',
+ 'fancycaptcha-addurl' => 'Ваше ÐµÐ´Ñ–Ñ‚Ð¾Ð²Ð°Ð½Ñ Ð¾Ð±ÑÑгує новы одказы формов URL; про охорону перед автоматічным Ñпамом муÑите опиÑати текÑÑ‚ з наÑтупного образку. ([[Special:Captcha/help|Што тото значіть?]])', # Fuzzy
+ 'fancycaptcha-badlogin' => 'Ð’ рамках охороны перед автоматічныма пробами угаднути геÑло муÑите опиÑати текÑÑ‚ з наÑтупного образку. ([[Special:Captcha/help|Што тото значіть?]]):', # Fuzzy
+ 'fancycaptcha-createaccount' => 'Ð’ рамках охороны перед автоматічныма ÑтворёванÑми конт муÑите про Ð²Ñ‹ÐºÐ¾Ð½Ð°Ð½Ñ Ñ€ÐµÒ‘Ñ–Ñтрації опиÑати текÑÑ‚ з наÑтупного образку. ([[Special:Captcha/help|Што тото значіть?]]):', # Fuzzy
'fancycaptcha-create' => 'Жебы Ñьте могли Ñтворити Ñторінку, муÑите опиÑати текÑÑ‚ з наÑтупного образку:([[Special:Captcha/help|Што тото значіть?]])',
'fancycaptcha-edit' => 'Жебы Ñьте могли едітовати тоту Ñторінку, муÑите опиÑати текÑÑ‚ з наÑтупного образку: ([[Special:Captcha/help|Што тото значіть?]])',
- 'fancycaptcha-sendemail' => 'Ð’ рамках охороны перед автоматічным Ñпамом муÑите опиÑати текÑÑ‚ з наÑтупного образку. ([[Special:Captcha/help|Што тото значіть?]]):',
+ 'fancycaptcha-sendemail' => 'Ð’ рамках охороны перед автоматічным Ñпамом муÑите опиÑати текÑÑ‚ з наÑтупного образку. ([[Special:Captcha/help|Што тото значіть?]]):', # Fuzzy
);
/** Sanskrit (संसà¥à¤•à¥ƒà¤¤à¤®à¥)
@@ -1280,27 +1368,27 @@ $messages['rue'] = array(
$messages['sa'] = array(
'fancycaptcha-addurl' => 'भवतः समà¥à¤ªà¤¾à¤¦à¤¨à¥‡ नूतनबाहà¥à¤¯à¤¾à¤¨à¥à¤¬à¤¨à¥à¤§à¤¾à¤ƒ अनà¥à¤¤à¤°à¥à¤­à¥‚ताः ।
सà¥à¤µà¤šà¤¾à¤²à¤¿à¤¤à¤¾à¤¨à¤¿à¤·à¥à¤Ÿà¤¸à¤¨à¥à¤¦à¥‡à¤¶à¥‡à¤­à¥à¤¯à¤ƒ रकà¥à¤·à¤£à¤¸à¥à¤¯ साहायà¥à¤¯à¤¾à¤°à¥à¤¥à¤‚ कृपया अधः मञà¥à¤œà¥‚षायां दृशà¥à¤¯à¤®à¤¾à¤¨à¤¾à¤¨à¤¿ पदानि लिखतà¥
-([[Special:Captcha/help|more info]]) :',
+([[Special:Captcha/help|more info]]) :', # Fuzzy
'fancycaptcha-badlogin' => 'सà¥à¤µà¤šà¤¾à¤²à¤¿à¤¤à¤¾à¤­à¥à¤¯à¤ƒ कूटशबà¥à¤¦à¤­à¥‡à¤¦à¤¨à¥‡à¤­à¥à¤¯à¤ƒ रकà¥à¤·à¤£à¤¸à¥à¤¯ साहायà¥à¤¯à¤¾à¤°à¥à¤¥à¤‚ कृपया अधः मञà¥à¤œà¥‚षायां दृशà¥à¤¯à¤®à¤¾à¤¨à¤¾à¤¨à¤¿ पदानि लिखतà¥
-([[Special:Captcha/help|more info]]) :',
+([[Special:Captcha/help|more info]]) :', # Fuzzy
'fancycaptcha-createaccount' => 'सà¥à¤µà¤šà¤¾à¤²à¤¿à¤¤à¤¾à¤­à¥à¤¯à¤ƒ लेखासरà¥à¤œà¤¨à¥‡à¤­à¥à¤¯à¤ƒ रकà¥à¤·à¤£à¤¸à¥à¤¯ साहायà¥à¤¯à¤¾à¤°à¥à¤¥à¤‚ कृपया अधः मञà¥à¤œà¥‚षायां दृशà¥à¤¯à¤®à¤¾à¤¨à¤¾à¤¨à¤¿ पदानि लिखतà¥
-([[Special:Captcha/help|more info]]) :',
+([[Special:Captcha/help|more info]]) :', # Fuzzy
'fancycaptcha-create' => 'पृषà¥à¤ à¤¸à¥à¤¯ सरà¥à¤œà¤¨à¤¾à¤¯, अधः मञà¥à¤œà¥‚षायां दृशà¥à¤¯à¤®à¤¾à¤¨à¤¾à¤¨à¤¿ पदानि लिखतॠ([[Special:Captcha/help|more info]]):',
'fancycaptcha-edit' => 'असà¥à¤¯ पृषà¥à¤ à¤¸à¥à¤¯ समà¥à¤ªà¤¾à¤¦à¤¨à¤¾à¤¯, अधः मञà¥à¤œà¥‚षायां दृशà¥à¤¯à¤®à¤¾à¤¨à¤¾à¤¨à¤¿ पदानि लिखतॠ([[Special:Captcha/help|अधिक जानकारी]]):',
'fancycaptcha-sendemail' => 'सà¥à¤µà¤šà¤¾à¤²à¤¿à¤¤à¤¾à¤­à¥à¤¯à¤ƒ अनिषà¥à¤Ÿà¤¸à¤¨à¥à¤¦à¥‡à¤¶à¥‡à¤­à¥à¤¯à¤ƒ रकà¥à¤·à¤£à¤¸à¥à¤¯ साहायà¥à¤¯à¤¾à¤°à¥à¤¥à¤‚ कृपया अधः मञà¥à¤œà¥‚षायां दृशà¥à¤¯à¤®à¤¾à¤¨à¤¾à¤¨à¤¿ पदानि लिखतà¥
-([[Special:Captcha/help|more info]]) :',
+([[Special:Captcha/help|more info]]) :', # Fuzzy
);
/** Sakha (Ñаха тыла)
* @author HalanTul
*/
$messages['sah'] = array(
- 'fancycaptcha-addurl' => 'Эн көннөрүүҥ Ñ‚Ð°Ñ Ñ‹Ð¹Ñ‹Ð½Ð½ÑŒÑ‹ÐºÑ‚Ð°Ð°Ñ… Ñбит. Спаамтан көмүÑкÑнÑÑ€ Ñоруктаах дьайыыны оҥор, манна баар тыллары хатылаа ([[Special:Captcha/help|Ñиһилии…]]):',
- 'fancycaptcha-badlogin' => 'Киирии тылы аптамаатынан алдьатыыттан көмүÑкÑнÑÑ€ дьайыыны оҥороргор көрдөһөбүт, манна ойууламмыт буукубалары хатылаа ([[Special:Captcha/help|Ñиһилии]]):',
- 'fancycaptcha-createaccount' => 'Ðаттары аптамаатынан бÑлиÑтиири Ñуох оҥорор туһуттан бу дьайыыны оҥороргор көрдөһөбүт: ойууламмыт Ñурук бÑлиÑлÑрин анал ÑÐ¸Ñ€Ð³Ñ ÐºÐ¸Ð»Ð»ÑÑ€ ([[Special:Captcha/help|Ñиһилии]]):',
+ 'fancycaptcha-addurl' => 'Эн көннөрүүҥ Ñ‚Ð°Ñ Ñ‹Ð¹Ñ‹Ð½Ð½ÑŒÑ‹ÐºÑ‚Ð°Ð°Ñ… Ñбит. Спаамтан көмүÑкÑнÑÑ€ Ñоруктаах дьайыыны оҥор, манна баар тыллары хатылаа ([[Special:Captcha/help|Ñиһилии…]]):', # Fuzzy
+ 'fancycaptcha-badlogin' => 'Киирии тылы аптамаатынан алдьатыыттан көмүÑкÑнÑÑ€ дьайыыны оҥороргор көрдөһөбүт, манна ойууламмыт буукубалары хатылаа ([[Special:Captcha/help|Ñиһилии]]):', # Fuzzy
+ 'fancycaptcha-createaccount' => 'Ðаттары аптамаатынан бÑлиÑтиири Ñуох оҥорор туһуттан бу дьайыыны оҥороргор көрдөһөбүт: ойууламмыт Ñурук бÑлиÑлÑрин анал ÑÐ¸Ñ€Ð³Ñ ÐºÐ¸Ð»Ð»ÑÑ€ ([[Special:Captcha/help|Ñиһилии]]):', # Fuzzy
'fancycaptcha-create' => 'Эн көннөрүүҥ Ñ‚Ð°Ñ Ñ‹Ð¹Ñ‹Ð½Ð½ÑŒÑ‹ÐºÑ‚Ð°Ñ€Ð´Ð°Ð°Ñ… Ñбит. Спаамтан көмүÑкÑнÑÑ€ туһуттан манна баар тыллары хатылыыргар көрдөһөбүт ([[Special:Captcha/help|Ñиһилии…]]):',
'fancycaptcha-edit' => 'Эн көннөрүүҥ Ñ‚Ð°Ñ Ñ‹Ð¹Ñ‹Ð½Ð½ÑŒÑ‹ÐºÑ‚Ð°Ñ€Ð´Ð°Ð°Ñ… Ñбит. Спаамтан көмүÑкÑнÑÑ€ туһуттан манна баар тыллары хатылыыргар көрдөһөбүт ([[Special:Captcha/help|Ñиһилии…]]):',
- 'fancycaptcha-sendemail' => 'Ðптамаат Ñпаамтан көмүÑкÑнÑÑ€ дьайыыны оҥороргор көрдөһөбүт, манна ойууламмыт тыллары хатылаа ([[Special:Captcha/help|Ñиһилии]]):',
+ 'fancycaptcha-sendemail' => 'Ðптамаат Ñпаамтан көмүÑкÑнÑÑ€ дьайыыны оҥороргор көрдөһөбүт, манна ойууламмыт тыллары хатылаа ([[Special:Captcha/help|Ñиһилии]]):', # Fuzzy
);
/** Sinhala (සිංහල)
@@ -1310,24 +1398,26 @@ $messages['sah'] = array(
*/
$messages['si'] = array(
'fancycaptcha-addurl' => 'ඔබගේ සංස්කරණයෙහි නව බà·à·„ිර සබà·à¶³à·’යන් අඩංගුයි.
-ස්වයංක්â€à¶»à·“ය අයà·à¶ à·’ත තà·à¶´à·‘ලෙන් ආරක්ෂ෠වනු වස්, පහත පෙන්නුම් කෙරෙන වචන කොටුව තුල ඇතුලත් කරන්න ([[Special:Captcha/help|à·€à·à¶©à·’මනත් තොරතුරු]]):',
- 'fancycaptcha-badlogin' => 'ස්වයංක්â€à¶»à·“ය මුරපද බිඳීම වලක්වනු වස්, පහත පෙන්නුම් කෙරෙන වචන කොටුව තුල ඇතුලත් කරන්න ([[Special:Captcha/help|à·€à·à¶©à·’මනත් තොරතුරු]]):',
- 'fancycaptcha-createaccount' => 'ස්වයංක්â€à¶»à·“යව ගිණුම් තà·à¶±à·“ම à·€à·à¶½à¶šà·”මâ€à¶§ සඳහà·, පහත දà·à¶šà·Šà·€à·™à¶± වචන CAPTCHA කොටුව තුල ඇතුලත් කරන්න ([[Special:Captcha/help|à·€à·à¶©à·’මනත් තොරතුරු]]):',
+ස්වයංක්â€à¶»à·“ය අයà·à¶ à·’ත තà·à¶´à·‘ලෙන් ආරක්ෂ෠වනු වස්, පහත පෙන්නුම් කෙරෙන වචන කොටුව තුල ඇතුලත් කරන්න ([[Special:Captcha/help|à·€à·à¶©à·’මනත් තොරතුරු]]):', # Fuzzy
+ 'fancycaptcha-badlogin' => 'ස්වයංක්â€à¶»à·“ය මුරපද බිඳීම වලක්වනු වස්, පහත පෙන්නුම් කෙරෙන වචන කොටුව තුල ඇතුලත් කරන්න ([[Special:Captcha/help|à·€à·à¶©à·’මනත් තොරතුරු]]):', # Fuzzy
+ 'fancycaptcha-createaccount' => 'ස්වයංක්â€à¶»à·“යව ගිණුම් තà·à¶±à·“ම à·€à·à¶½à¶šà·”මâ€à¶§ සඳහà·, පහත දà·à¶šà·Šà·€à·™à¶± වචන CAPTCHA කොටුව තුල ඇතුලත් කරන්න ([[Special:Captcha/help|à·€à·à¶©à·’මනත් තොරතුරු]]):', # Fuzzy
'fancycaptcha-create' => 'පිටුව තනනු වස්, පහත පෙන්නුම් කෙරෙන වචන කොටුව තුල ඇතුලත් කරන්න ([[Special:Captcha/help|à·€à·à¶©à·’මනත් තොරතුරු]]):',
'fancycaptcha-edit' => 'මෙම පිටුව සංස්කරණය කරනු වස්, පහත පෙන්නුම් කෙරෙන වචන කොටුව තුල ඇතුලත් කරන්න ([[Special:Captcha/help|à·€à·à¶©à·’මනත් තොරතුරු]]):',
- 'fancycaptcha-sendemail' => 'ස්වයංක්â€à¶»à·“ය ස්පෑම් කිරීම්වලින් ආරක්ෂ෠කිරීම සඳහ෠උදව් වීමට පහත කොටුවේ පෙන්වන වචන ඇතුළත් කරන්න ([[Special:Captcha/help|more info]]):',
+ 'fancycaptcha-sendemail' => 'ස්වයංක්â€à¶»à·“ය ස්පෑම් කිරීම්වලින් ආරක්ෂ෠කිරීම සඳහ෠උදව් වීමට පහත කොටුවේ පෙන්වන වචන ඇතුළත් කරන්න ([[Special:Captcha/help|more info]]):', # Fuzzy
);
/** Slovak (slovenÄina)
* @author Helix84
+ * @author Teslaton
*/
$messages['sk'] = array(
- 'fancycaptcha-addurl' => 'Vaša úprava obsahuje nové URL odkazy; kvôli ochrane proti automatizovanému spamu je potrebné napísať slová zobrazené na tomto obrázku: <br />([[Special:Captcha/help|Čo je toto?]])',
- 'fancycaptcha-badlogin' => 'Ako ochranu proti automatizovanému lámaniu hesiel, prosím zadajte slová z nasledujúceho obrázka do poľa pre odpoveÄ ([[Special:Captcha/help|viac informácií]]):',
- 'fancycaptcha-createaccount' => 'Kvôli ochrane proti automatizovanému spamu je potrebné napísaÅ¥ slová zobrazené na tomto obrázku, až potom bude vytvorený nový úÄet: <br />([[Special:Captcha/help|ÄŒo je toto?]])',
+ 'fancycaptcha-addurl' => 'Vaša úprava obsahuje nové URL odkazy; kvôli ochrane proti automatizovanému spamu je potrebné napísať slová zobrazené na tomto obrázku: <br />([[Special:Captcha/help|Čo je toto?]])', # Fuzzy
+ 'fancycaptcha-badlogin' => 'Ako ochranu proti automatizovanému lámaniu hesiel, prosím zadajte slová z nasledujúceho obrázka do poľa pre odpoveÄ ([[Special:Captcha/help|viac informácií]]):', # Fuzzy
+ 'fancycaptcha-createaccount' => 'Kvôli ochrane proti automatizovanému spamu je potrebné napísaÅ¥ slová zobrazené na tomto obrázku, až potom bude vytvorený nový úÄet: <br />([[Special:Captcha/help|ÄŒo je toto?]])', # Fuzzy
'fancycaptcha-create' => 'Vaša úprava obsahuje nové URL odkazy; kvôli ochrane proti automatizovanému spamu je potrebné napísať slová zobrazené na tomto obrázku: <br />([[Special:Captcha/help|Čo je toto?]])',
'fancycaptcha-edit' => 'Vaša úprava obsahuje nové URL odkazy; kvôli ochrane proti automatizovanému spamu je potrebné napísať slová zobrazené na tomto obrázku: <br />([[Special:Captcha/help|Čo je toto?]])',
- 'fancycaptcha-sendemail' => 'Ako ochranu proti automatizovanému spamu, prosím zadajte slová z nasledujúceho obrázka do poľa pre odpoveÄ ([[Special:Captcha/help|ÄalÅ¡ie informácie]]):',
+ 'fancycaptcha-sendemail' => 'Ako ochranu proti automatizovanému spamu, prosím zadajte slová z nasledujúceho obrázka do poľa pre odpoveÄ ([[Special:Captcha/help|ÄalÅ¡ie informácie]]):', # Fuzzy
+ 'fancycaptcha-reload-text' => 'Vygenerovať nový kód',
);
/** Slovenian (slovenÅ¡Äina)
@@ -1335,19 +1425,20 @@ $messages['sk'] = array(
*/
$messages['sl'] = array(
'fancycaptcha-addurl' => 'VaÅ¡e urejanje vkljuÄuje nove zunanje povezave.
-Zaradi zaÅ¡Äite pred samodejnim smetjem prosimo, da vnesete spodnje besede v polje ([[Special:Captcha/help|veÄ informacij]]):',
- 'fancycaptcha-badlogin' => 'Zaradi zaÅ¡Äite pred samodejnim ugotavljanjem gesel prosimo, da vnesete spodnje besede v polje ([[Special:Captcha/help|veÄ informacij]]):',
- 'fancycaptcha-createaccount' => 'Zaradi zaÅ¡Äite pred samodejnim ustvarjanjem raÄunov prosimo, da vnesete spodnje besede v polje ([[Special:Captcha/help|veÄ informacij]]):',
+Zaradi zaÅ¡Äite wikija pred samodejnim smetjem vas prijazno naproÅ¡amo, da vnesete spodnje besede v polje ([[Special:Captcha/help|veÄ informacij]]):',
+ 'fancycaptcha-badlogin' => 'Zaradi zaÅ¡Äite wikija pred samodejnim ugotavljanjem gesel vas prijazno naproÅ¡amo, da vnesete spodnje besede v polje ([[Special:Captcha/help|veÄ informacij]]):',
+ 'fancycaptcha-createaccount' => 'Zaradi zaÅ¡Äite wikija pred samodejnim ustvarjanjem raÄunov vas prijazno naproÅ¡amo, da vnesete spodnje besede v polje ([[Special:Captcha/help|veÄ informacij]]):',
'fancycaptcha-create' => 'ÄŒe želite ustvariti stran, prosimo vnesite spodnje besede v polje ([[Special:Captcha/help|veÄ informacij]]):',
'fancycaptcha-edit' => 'ÄŒe želite urediti stran, prosimo vnesite spodnje besede v polje ([[Special:Captcha/help|veÄ informacij]]):',
- 'fancycaptcha-sendemail' => 'Zaradi zaÅ¡Äite pred samodejnim smetenjem prosimo, da vnesete spodnje besede v polje ([[Special:Captcha/help|veÄ informacij]]):',
+ 'fancycaptcha-sendemail' => 'Zaradi zaÅ¡Äite wikija pred samodejnim smetenjem vas prijazno naproÅ¡amo, da vnesete spodnje besede v polje ([[Special:Captcha/help|veÄ informacij]]):',
+ 'fancycaptcha-reload-text' => 'Osveži',
);
/** Somali (Soomaaliga)
* @author Abshirdheere
*/
$messages['so'] = array(
- 'fancycaptcha-createaccount' => 'Si aad u caawiso dhowritaanka in la iska samaysto Akoon,Fadlan meelaha banaan buux buuxi ee hoostaan ah ([[Special:Captcha/help|Macluumaad dheeraad ah]]):',
+ 'fancycaptcha-createaccount' => 'Si aad u caawiso dhowritaanka in la iska samaysto Akoon,Fadlan meelaha banaan buux buuxi ee hoostaan ah ([[Special:Captcha/help|Macluumaad dheeraad ah]]):', # Fuzzy
);
/** Albanian (shqip)
@@ -1355,12 +1446,12 @@ $messages['so'] = array(
* @author Olsi
*/
$messages['sq'] = array(
- 'fancycaptcha-addurl' => 'Redaktimi juaj ka lidhje URL të reja dhe si mbrojtje kundër abuzimeve automatike duhet të shtypni çfarë shfaqet tek figura e mëposhtme:<br /> ([[Special:Captcha|Çfarë është kjo?]])',
- 'fancycaptcha-badlogin' => 'Për tu mbrojtur nga metoda automatike të gjetjes së fjalëkalimeve ju kërkojmë të vendosni fjalët e figurës në kuti ([[Special:Captcha/help|më shumë informacion]]):',
- 'fancycaptcha-createaccount' => 'Për të mbrojtur kundër hapjeve të llogarive në mënyrë automatike ju lutem shtypni çfarë shfaqet tek figura e mëposhtme ([[Special:Captcha|Çfarë është kjo?]]):',
+ 'fancycaptcha-addurl' => 'Redaktimi juaj ka lidhje URL të reja dhe si mbrojtje kundër abuzimeve automatike duhet të shtypni çfarë shfaqet tek figura e mëposhtme:<br /> ([[Special:Captcha|Çfarë është kjo?]])', # Fuzzy
+ 'fancycaptcha-badlogin' => 'Për tu mbrojtur nga metoda automatike të gjetjes së fjalëkalimeve ju kërkojmë të vendosni fjalët e figurës në kuti ([[Special:Captcha/help|më shumë informacion]]):', # Fuzzy
+ 'fancycaptcha-createaccount' => 'Për të mbrojtur kundër hapjeve të llogarive në mënyrë automatike ju lutem shtypni çfarë shfaqet tek figura e mëposhtme ([[Special:Captcha|Çfarë është kjo?]]):', # Fuzzy
'fancycaptcha-create' => 'Për të krijuar një faqe, ju lutem shtypni çfarë shfaqet tek figura e mëposhtme ([[Special:Captcha|Çfarë është kjo?]]):',
'fancycaptcha-edit' => 'Për të redaktuar këtë faqe ju lutem shtypni çfarë shfaqet tek figura e mëposhtme ([[Special:Captcha|Çfarë është kjo?]]):',
- 'fancycaptcha-sendemail' => "Për t'u mbrojtur nga metoda automatike e gjetjes së fjalëkalimeve ju kërkojmë të vendosni fjalët e figurës në kuti ([[Special:Captcha/help|më shumë informacion]]):",
+ 'fancycaptcha-sendemail' => "Për t'u mbrojtur nga metoda automatike e gjetjes së fjalëkalimeve ju kërkojmë të vendosni fjalët e figurës në kuti ([[Special:Captcha/help|më shumë informacion]]):", # Fuzzy
);
/** Serbian (Cyrillic script) (ÑрпÑки (ћирилица)‎)
@@ -1372,12 +1463,12 @@ $messages['sq'] = array(
$messages['sr-ec'] = array(
'fancycaptcha-desc' => 'Обогаћен Ñтварач Ñликовног кода за потврду уређивања',
'fancycaptcha-addurl' => 'Ваша измена Ñадржи нове Ñпољашње везе.
-У циљу заштите од непожељних порука, унеÑите речи Ñа Ñлике у поље иÑпод ([[Special:Captcha/help|више информација]]):',
- 'fancycaptcha-badlogin' => 'У циљу заштите од пробијања лозинки, унеÑите речи Ñа Ñлике у поље иÑпод ([[Special:Captcha/help|више информација]]):',
- 'fancycaptcha-createaccount' => 'У циљу заштите од Ñамоотварања налога, унеÑите речи Ñа Ñлике у поље иÑпод ([[Special:Captcha/help|више информација]]):',
+У циљу заштите од непожељних порука, унеÑите речи Ñа Ñлике у поље иÑпод ([[Special:Captcha/help|више информација]]):', # Fuzzy
+ 'fancycaptcha-badlogin' => 'У циљу заштите од пробијања лозинки, унеÑите речи Ñа Ñлике у поље иÑпод ([[Special:Captcha/help|више информација]]):', # Fuzzy
+ 'fancycaptcha-createaccount' => 'У циљу заштите од Ñамоотварања налога, унеÑите речи Ñа Ñлике у поље иÑпод ([[Special:Captcha/help|више информација]]):', # Fuzzy
'fancycaptcha-create' => 'Да биÑте направили Ñтраницу, унеÑите речи Ñа Ñлике у поље иÑпод ([[Special:Captcha/help|више информација]]):',
'fancycaptcha-edit' => 'Да биÑте уредили ову Ñтраницу, унеÑите речи Ñа Ñлике у поље иÑпод ([[Special:Captcha/help|више информација]]):',
- 'fancycaptcha-sendemail' => 'У циљу заштите од непожељних порука, унеÑите речи Ñа Ñлике у поље иÑпод ([[Special:Captcha/help|више информација]]):',
+ 'fancycaptcha-sendemail' => 'У циљу заштите од непожељних порука, унеÑите речи Ñа Ñлике у поље иÑпод ([[Special:Captcha/help|више информација]]):', # Fuzzy
);
/** Serbian (Latin script) (srpski (latinica)‎)
@@ -1386,12 +1477,12 @@ $messages['sr-ec'] = array(
*/
$messages['sr-el'] = array(
'fancycaptcha-desc' => 'Obogaćen stvaraÄ slikovnog koda za potvrdu ureÄ‘ivanja',
- 'fancycaptcha-addurl' => 'Tvoja izmena ukljuÄuje nove spoljne veze. U cilju zaÅ¡tite od automatskog spama, unesi reÄi koje se nalaze ispod u kutiju ([[Special:Captcha/help|detaljnije]]):',
- 'fancycaptcha-badlogin' => 'U cilju spreÄavanja automatskog otkrivanja lozinki, unesi reÄi koje se nalaze ispod u kutiju ([[Special:Captcha/help|detaljnije]]):',
- 'fancycaptcha-createaccount' => 'U cilju zaÅ¡tite od automatskog spama, unesi reÄi odozdo u kutiju ([[Special:Captcha/help|detaljnije]]):',
+ 'fancycaptcha-addurl' => 'Tvoja izmena ukljuÄuje nove spoljne veze. U cilju zaÅ¡tite od automatskog spama, unesi reÄi koje se nalaze ispod u kutiju ([[Special:Captcha/help|detaljnije]]):', # Fuzzy
+ 'fancycaptcha-badlogin' => 'U cilju spreÄavanja automatskog otkrivanja lozinki, unesi reÄi koje se nalaze ispod u kutiju ([[Special:Captcha/help|detaljnije]]):', # Fuzzy
+ 'fancycaptcha-createaccount' => 'U cilju zaÅ¡tite od automatskog spama, unesi reÄi odozdo u kutiju ([[Special:Captcha/help|detaljnije]]):', # Fuzzy
'fancycaptcha-create' => 'Da bi se napravila stranica, potrebno je uneti reÄi koje se nalaze ispod kutije ([[Special:Captcha/help|detaljnije]]):',
'fancycaptcha-edit' => 'Za izmenu ove strane unesi reÄi koje se nalaze ispod kutije ([[Special:Captcha/help|detaljnije]]):',
- 'fancycaptcha-sendemail' => 'U cilju zaÅ¡tite od automatskog spama, unesi reÄi odozdo u kutiju ([[Special:Captcha/help|detaljnije]]):',
+ 'fancycaptcha-sendemail' => 'U cilju zaÅ¡tite od automatskog spama, unesi reÄi odozdo u kutiju ([[Special:Captcha/help|detaljnije]]):', # Fuzzy
);
/** Seeltersk (Seeltersk)
@@ -1400,9 +1491,9 @@ $messages['sr-el'] = array(
$messages['stq'] = array(
'fancycaptcha-addurl' => 'Dien Beoarbaidenge änthaalt näie externe Ferbiendengen.
Tou Skuts foar automatisierde Spamminge reek dät foulgjende Woud in dät Fäild ien.
-Klik dan fonnäien ap „Siede spiekerje“ [[Special:Captcha/help|(Froagen of Probleme?)]].',
- 'fancycaptcha-badlogin' => 'Toun Skuts foar ne Kompromittierenge fon dien Benutserkonto reek dät foulgjende Woud in dät Fäild hierunner ien [[Special:Captcha/help|(Froagen of Probleme?)]]:',
- 'fancycaptcha-createaccount' => 'Toun Skuts foar automatisierde Anloage fon Benutserkonten reek dät foulgjende Woud in dät Fäild hierunner ien [[Special:Captcha/help|(Froagen of Probleme?)]].',
+Klik dan fonnäien ap „Siede spiekerje“ [[Special:Captcha/help|(Froagen of Probleme?)]].', # Fuzzy
+ 'fancycaptcha-badlogin' => 'Toun Skuts foar ne Kompromittierenge fon dien Benutserkonto reek dät foulgjende Woud in dät Fäild hierunner ien [[Special:Captcha/help|(Froagen of Probleme?)]]:', # Fuzzy
+ 'fancycaptcha-createaccount' => 'Toun Skuts foar automatisierde Anloage fon Benutserkonten reek dät foulgjende Woud in dät Fäild hierunner ien [[Special:Captcha/help|(Froagen of Probleme?)]].', # Fuzzy
'fancycaptcha-create' => 'Tou dät Moakjen fon ju Siede reek dät foulgjende Woud in dät Fäild hierunner ien
[[Special:Captcha/help|(Froagen of Probleme?)]].',
'fancycaptcha-edit' => 'Tou Beoarbaidenge fon disse Siede reek dät foulgjende Woud in dät Fäild hierunner ien
@@ -1418,20 +1509,23 @@ $messages['su'] = array(
/** Swedish (svenska)
* @author Ainali
+ * @author Thurs
+ * @author WikiPhoenix
*/
$messages['sv'] = array(
- 'fancycaptcha-addurl' => 'Din ändring lägger till nya externa länkar i texten. För att skydda wikin mot
-automatisk spam måste du skriva orden som visas härunder i rutan ([[Special:Captcha/help|mer information]]):',
- 'fancycaptcha-badlogin' => 'För att skydda wikin mot automatiserad lösenordknäckning måste du skriva
-orden som visas härunder i rutan ([[Special:Captcha/help|mer information]]):',
- 'fancycaptcha-createaccount' => 'För att skydda wikin mot automatiskt skapade användarkonton måste du
-skriva orden som visas härunder i rutan ([[Special:Captcha/help|mer information]]):',
+ 'fancycaptcha-addurl' => 'Din ändring innehåller nya externa länkar.
+För att skydda wikin mot
+automatisk spam ber vi dig att skriva orden som visas i rutan nedan ([[Special:Captcha/help|mer information]]):',
+ 'fancycaptcha-badlogin' => 'För att skydda wikin mot automatiserad lösenordsknäckning ber vi dig att skriva
+orden som visas i rutan nedan ([[Special:Captcha/help|mer information]]):',
+ 'fancycaptcha-createaccount' => 'För att skydda wikin mot automatiskt skapade av användarkonton ber vi dig att
+skriva orden som visas i rutan nedan ([[Special:Captcha/help|mer information]]):',
'fancycaptcha-create' => 'För att skapa den här sidan måste du först skriva orden som visas härunder i rutan
([[Special:Captcha/help|mer information]]):',
'fancycaptcha-edit' => 'För att redigera den här sidan måste du först skriva orden som visas härunder i rutan
([[Special:Captcha/help|mer information]]):',
- 'fancycaptcha-sendemail' => 'För att skydda wikin mot automatiserad lösenordknäckning måste du skriva
-orden som visas härunder i rutan ([[Special:Captcha/help|mer information]]):',
+ 'fancycaptcha-sendemail' => 'För att skydda wikin mot automatiserad spam ber vi dig att skriva orden som visas i rutan nedan ([[Special:Captcha/help|mer information]]):',
+ 'fancycaptcha-reload-text' => 'Uppdatera',
);
/** Tamil (தமிழà¯)
@@ -1439,8 +1533,8 @@ orden som visas härunder i rutan ([[Special:Captcha/help|mer information]]):',
* @author மதனாஹரனà¯
*/
$messages['ta'] = array(
- 'fancycaptcha-badlogin' => 'தானியஙà¯à®•à¯ கடவà¯à®šà¯ சொல௠உடைதà¯à®¤à®²à®¿à®²à®¿à®°à¯à®¨à¯à®¤à¯ பாதà¯à®•à®¾à®•à¯à®• உதவà¯à®µà®¤à®±à¯à®•à®¾à®•à®¤à¯ தயவ௠செயà¯à®¤à¯ கீழேயà¯à®³à¯à®³ பெடà¯à®Ÿà®¿à®¯à®¿à®²à¯ தோனà¯à®±à¯à®®à¯ சொறà¯à®•à®³à¯ˆ உளà¯à®³à®¿à®Ÿà®µà¯à®®à¯ ([[Special:Captcha/help|கூடிய தகவலà¯]]):',
- 'fancycaptcha-createaccount' => 'தானியஙà¯à®•à®¿à®¯à®¾à®• கணகà¯à®•à¯ உரà¯à®µà®¾à®•à¯à®•à¯à®µà®¤à®¿à®²à®¿à®°à¯à®¨à¯à®¤à¯ பாதà¯à®•à®¾à®•à¯à®• உதவ, தயவà¯à®šà¯†à®¯à¯à®¤à¯ கீழே தெரியà¯à®®à¯ வாரà¯à®¤à¯à®¤à¯ˆà®•à®³à¯ˆ பெடà¯à®Ÿà®¿à®¯à®¿à®²à¯ உளà¯à®³à®¿à®Ÿà®µà¯à®®à¯ ([[Special:Captcha/help|மேலà¯à®®à¯ விவரஙà¯à®•à®³à¯à®•à¯à®•à¯]]):',
+ 'fancycaptcha-badlogin' => 'தானியஙà¯à®•à¯ கடவà¯à®šà¯ சொல௠உடைதà¯à®¤à®²à®¿à®²à®¿à®°à¯à®¨à¯à®¤à¯ பாதà¯à®•à®¾à®•à¯à®• உதவà¯à®µà®¤à®±à¯à®•à®¾à®•à®¤à¯ தயவ௠செயà¯à®¤à¯ கீழேயà¯à®³à¯à®³ பெடà¯à®Ÿà®¿à®¯à®¿à®²à¯ தோனà¯à®±à¯à®®à¯ சொறà¯à®•à®³à¯ˆ உளà¯à®³à®¿à®Ÿà®µà¯à®®à¯ ([[Special:Captcha/help|கூடிய தகவலà¯]]):', # Fuzzy
+ 'fancycaptcha-createaccount' => 'தானியஙà¯à®•à®¿à®¯à®¾à®• கணகà¯à®•à¯ உரà¯à®µà®¾à®•à¯à®•à¯à®µà®¤à®¿à®²à®¿à®°à¯à®¨à¯à®¤à¯ பாதà¯à®•à®¾à®•à¯à®• உதவ, தயவà¯à®šà¯†à®¯à¯à®¤à¯ கீழே தெரியà¯à®®à¯ வாரà¯à®¤à¯à®¤à¯ˆà®•à®³à¯ˆ பெடà¯à®Ÿà®¿à®¯à®¿à®²à¯ உளà¯à®³à®¿à®Ÿà®µà¯à®®à¯ ([[Special:Captcha/help|மேலà¯à®®à¯ விவரஙà¯à®•à®³à¯à®•à¯à®•à¯]]):', # Fuzzy
'fancycaptcha-create' => 'பகà¯à®•à®¤à¯à®¤à¯ˆ உரà¯à®µà®¾à®•à¯à®•à¯à®µà®¤à®±à¯à®•à®¾à®•, தயவ௠செயà¯à®¤à¯ கீழே பெடà¯à®Ÿà®¿à®¯à®¿à®²à¯ தோனà¯à®±à¯à®•à®¿à®©à¯à®± சொறà¯à®•à®³à¯ˆ உளà¯à®³à®¿à®Ÿà¯à®™à¯à®•à®³à¯ ([[Special:Captcha/help|கூடிய தகவலà¯]]):',
'fancycaptcha-edit' => 'இபà¯à®ªà®•à¯à®•à®¤à¯à®¤à¯ˆà®¤à¯ தொகà¯à®ªà¯à®ªà®¤à®±à¯à®•à¯à®¤à¯ தயவ௠செயà¯à®¤à¯ கீழேயà¯à®³à¯à®³ பெடà¯à®Ÿà®¿à®¯à®¿à®²à¯ தோனà¯à®±à¯à®®à¯ சொறà¯à®•à®³à¯ˆ உளà¯à®³à®¿à®Ÿà®µà¯à®®à¯ ([[Special:Captcha/help|கூடிய தகவலà¯]]):',
);
@@ -1450,10 +1544,10 @@ $messages['ta'] = array(
*/
$messages['te'] = array(
'fancycaptcha-addurl' => 'మీ దిదà±à°¦à±à°¬à°¾à°Ÿà±à°²à±‹ కొతà±à°¤ బయటి లింకà±à°²à±à°¨à±à°¨à°¾à°¯à°¿. బాటà±à°²à°¦à±à°µà°¾à°°à°¾ చేసే à°¸à±à°ªà°¾à°®à± à°¨à±à°‚à°¡à°¿ à°°à°•à±à°·à°£à°¨à± à°à°°à±à°ªà°°à°šà±‡à°‚à°¦à±à°•à± గానà±,
-à°•à°¿à°‚à°¦ కనిపించే బొమà±à°®à°²à±‹à°¨à°¿ à°…à°•à±à°·à°°à°¾à°²à°¨à± పెటà±à°Ÿà±†à°²à±‹ రాయండి ([[Special:Captcha/help|మరింత సమాచారం]]):',
- 'fancycaptcha-badlogin' => 'సంకేత పదాలనౠదొంగిలించే ఆటోమాటికౠపà±à°°à±‹à°—à±à°°à°¾à°®à±à°² à°¨à±à°‚à°¡à°¿ à°°à°•à±à°·à°¿à°‚చేందà±à°•à± గానà±, à°•à°¿à°‚à°¦ కనిపించే బొమà±à°®à°²à±‹à°¨à°¿ à°…à°•à±à°·à°°à°¾à°²à°¨à± పెటà±à°Ÿà±†à°²à±‹ రాయండి ([[Special:Captcha/help|మరింత సమాచారం]]):',
+à°•à°¿à°‚à°¦ కనిపించే బొమà±à°®à°²à±‹à°¨à°¿ à°…à°•à±à°·à°°à°¾à°²à°¨à± పెటà±à°Ÿà±†à°²à±‹ రాయండి ([[Special:Captcha/help|మరింత సమాచారం]]):', # Fuzzy
+ 'fancycaptcha-badlogin' => 'సంకేత పదాలనౠదొంగిలించే ఆటోమాటికౠపà±à°°à±‹à°—à±à°°à°¾à°®à±à°² à°¨à±à°‚à°¡à°¿ à°°à°•à±à°·à°¿à°‚చేందà±à°•à± గానà±, à°•à°¿à°‚à°¦ కనిపించే బొమà±à°®à°²à±‹à°¨à°¿ à°…à°•à±à°·à°°à°¾à°²à°¨à± పెటà±à°Ÿà±†à°²à±‹ రాయండి ([[Special:Captcha/help|మరింత సమాచారం]]):', # Fuzzy
'fancycaptcha-createaccount' => 'ఆటోమాటిగà±à°—à°¾ ఖాతాలనౠసృషà±à°Ÿà°¿à°‚చడానà±à°¨à°¿ నివారించేందà±à°•à±, à°•à°¿à°‚à°¦ కనిపించే పదాలనà±
-à°ˆ పెటà±à°Ÿà±†à°²à±‹ రాయండి ([[Special:Captcha/help|మరింత సహాయం]]):',
+à°ˆ పెటà±à°Ÿà±†à°²à±‹ రాయండి ([[Special:Captcha/help|మరింత సహాయం]]):', # Fuzzy
'fancycaptcha-create' => 'కొతà±à°¤ పేజీ సృషà±à°Ÿà°¿à°‚చేందà±à°•à± గానà±, à°•à°¿à°‚à°¦ కనిపించే బొమà±à°®à°²à±‹à°¨à°¿ à°…à°•à±à°·à°°à°¾à°²à°¨à± పెటà±à°Ÿà±†à°²à±‹ రాయండి
([[Special:Captcha/help|మరింత సమాచారం]]):',
'fancycaptcha-edit' => 'à°ˆ పేజీలో దిదà±à°¦à±à°¬à°¾à°Ÿà± చేసేందà±à°•à±, à°•à°¿à°‚à°¦ కనిపించే బొమà±à°®à°²à±‹à°¨à°¿ à°…à°•à±à°·à°°à°¾à°²à°¨à± పెటà±à°Ÿà±†à°²à±‹ రాయండి
@@ -1464,9 +1558,9 @@ $messages['te'] = array(
* @author Ibrahim
*/
$messages['tg-cyrl'] = array(
- 'fancycaptcha-addurl' => 'Вироиши шумо пайвандҳои ҷадиди хориҷиро дар бар мегирад. Барои кӯмак ба пешгири аз ҳаразнигори худкор, лутфан вожаеро ки дар таÑвир мебинед, ворид кунед ([[Special:Captcha/help|иттилооти бештар]]):',
- 'fancycaptcha-badlogin' => 'Барои кӯмак ба пешгири аз шикаÑтани худкори калимаҳои убур, вожаеро ки дар таÑвир мебинед, ворид кунед ([[Special:Captcha/help|иттилооти бештар]]):',
- 'fancycaptcha-createaccount' => 'Барои кӯмак аз Ñҷоди худкори ҳиÑоби корбарӣ, вожаеро ки дар таÑвир мебинед, ворид кунед ([[Special:Captcha/help|иттилооти бештар]]):',
+ 'fancycaptcha-addurl' => 'Вироиши шумо пайвандҳои ҷадиди хориҷиро дар бар мегирад. Барои кӯмак ба пешгири аз ҳаразнигори худкор, лутфан вожаеро ки дар таÑвир мебинед, ворид кунед ([[Special:Captcha/help|иттилооти бештар]]):', # Fuzzy
+ 'fancycaptcha-badlogin' => 'Барои кӯмак ба пешгири аз шикаÑтани худкори калимаҳои убур, вожаеро ки дар таÑвир мебинед, ворид кунед ([[Special:Captcha/help|иттилооти бештар]]):', # Fuzzy
+ 'fancycaptcha-createaccount' => 'Барои кӯмак аз Ñҷоди худкори ҳиÑоби корбарӣ, вожаеро ки дар таÑвир мебинед, ворид кунед ([[Special:Captcha/help|иттилооти бештар]]):', # Fuzzy
'fancycaptcha-create' => 'Барои Ñҷоди Ñаҳифа, вожаеро ки дар таÑвир мебинед, ворид кунед ([[Special:Captcha/help|иттилооти бештар]]):',
'fancycaptcha-edit' => 'Барои вироиши ин Ñаҳифа, вожаеро ки дар таÑвир мебинед, ворид кунед ([[Special:Captcha/help|иттилооти бештар]]):',
);
@@ -1475,9 +1569,9 @@ $messages['tg-cyrl'] = array(
* @author Liangent
*/
$messages['tg-latn'] = array(
- 'fancycaptcha-addurl' => 'Viroişi şumo pajvandhoi çadidi xoriçiro dar bar megirad. Baroi kūmak ba peşgiri az haraznigori xudkor, lutfan voƶaero ki dar tasvir mebined, vorid kuned ([[Special:Captcha/help|ittilooti beştar]]):',
- 'fancycaptcha-badlogin' => 'Baroi kūmak ba peşgiri az şikastani xudkori kalimahoi ubur, voƶaero ki dar tasvir mebined, vorid kuned ([[Special:Captcha/help|ittilooti beştar]]):',
- 'fancycaptcha-createaccount' => 'Baroi kūmak az eçodi xudkori hisobi korbarī, voƶaero ki dar tasvir mebined, vorid kuned ([[Special:Captcha/help|ittilooti beştar]]):',
+ 'fancycaptcha-addurl' => 'Viroişi şumo pajvandhoi çadidi xoriçiro dar bar megirad. Baroi kūmak ba peşgiri az haraznigori xudkor, lutfan voƶaero ki dar tasvir mebined, vorid kuned ([[Special:Captcha/help|ittilooti beştar]]):', # Fuzzy
+ 'fancycaptcha-badlogin' => 'Baroi kūmak ba peşgiri az şikastani xudkori kalimahoi ubur, voƶaero ki dar tasvir mebined, vorid kuned ([[Special:Captcha/help|ittilooti beştar]]):', # Fuzzy
+ 'fancycaptcha-createaccount' => 'Baroi kūmak az eçodi xudkori hisobi korbarī, voƶaero ki dar tasvir mebined, vorid kuned ([[Special:Captcha/help|ittilooti beştar]]):', # Fuzzy
'fancycaptcha-create' => 'Baroi eçodi sahifa, voƶaero ki dar tasvir mebined, vorid kuned ([[Special:Captcha/help|ittilooti beştar]]):',
'fancycaptcha-edit' => 'Baroi viroişi in sahifa, voƶaero ki dar tasvir mebined, vorid kuned ([[Special:Captcha/help|ittilooti beştar]]):',
);
@@ -1486,9 +1580,9 @@ $messages['tg-latn'] = array(
* @author Harley Hartwell
*/
$messages['th'] = array(
- 'fancycaptcha-addurl' => 'à¸à¸²à¸£à¹à¸à¹‰à¹„ขของคุณมีà¸à¸²à¸£à¹€à¸žà¸´à¹ˆà¸¡à¸¥à¸´à¸‡à¸à¹Œà¹„ปสู่เว็บไซต์อื่น เพื่อช่วยป้องà¸à¸±à¸™à¸à¸²à¸£à¸ªà¹à¸›à¸¡à¸­à¸±à¸•à¹‚นมัติ à¸à¸£à¸¸à¸“าพิมพ์ข้อความที่คุณเห็นด้านล่างลงในà¸à¸¥à¹ˆà¸­à¸‡à¸—ี่à¸à¸³à¸«à¸™à¸”ให้ ([[Special:Captcha/help|ข้อมูลเพิ่มเติม]])',
- 'fancycaptcha-badlogin' => 'เพื่อป้องà¸à¸±à¸™à¸à¸²à¸£à¹à¸„ร็à¸à¸£à¸«à¸±à¸ªà¸œà¹ˆà¸²à¸™à¸ˆà¸²à¸à¸à¸£à¸°à¸šà¸§à¸™à¸à¸²à¸£à¸­à¸±à¸•à¹‚นมัติ à¸à¸£à¸¸à¸“าพิมพ์ข้อความที่คุณเห็นด้านล่างลงในà¸à¸¥à¹ˆà¸­à¸‡à¸—ี่à¸à¸³à¸«à¸™à¸”ให้ ([[Special:Captcha/help|ข้อมูลเพิ่มเติม]])',
- 'fancycaptcha-createaccount' => 'เพื่อป้องà¸à¸±à¸™à¸à¸²à¸£à¸ªà¸£à¹‰à¸²à¸‡à¸šà¸±à¸à¸Šà¸µà¸œà¸¹à¹‰à¹ƒà¸Šà¹‰à¸”้วยà¸à¸£à¸°à¸šà¸§à¸™à¸à¸²à¸£à¸­à¸±à¸•à¹‚นมัติ à¸à¸£à¸¸à¸“าพิมพ์ข้อความที่คุณเห็นด้านล่างลงในà¸à¸¥à¹ˆà¸­à¸‡à¸—ี่à¸à¸³à¸«à¸™à¸”ให้ ([[Special:Captcha/help|ข้อมูลเพิ่มเติม]])',
+ 'fancycaptcha-addurl' => 'à¸à¸²à¸£à¹à¸à¹‰à¹„ขของคุณมีà¸à¸²à¸£à¹€à¸žà¸´à¹ˆà¸¡à¸¥à¸´à¸‡à¸à¹Œà¹„ปสู่เว็บไซต์อื่น เพื่อช่วยป้องà¸à¸±à¸™à¸à¸²à¸£à¸ªà¹à¸›à¸¡à¸­à¸±à¸•à¹‚นมัติ à¸à¸£à¸¸à¸“าพิมพ์ข้อความที่คุณเห็นด้านล่างลงในà¸à¸¥à¹ˆà¸­à¸‡à¸—ี่à¸à¸³à¸«à¸™à¸”ให้ ([[Special:Captcha/help|ข้อมูลเพิ่มเติม]])', # Fuzzy
+ 'fancycaptcha-badlogin' => 'เพื่อป้องà¸à¸±à¸™à¸à¸²à¸£à¹à¸„ร็à¸à¸£à¸«à¸±à¸ªà¸œà¹ˆà¸²à¸™à¸ˆà¸²à¸à¸à¸£à¸°à¸šà¸§à¸™à¸à¸²à¸£à¸­à¸±à¸•à¹‚นมัติ à¸à¸£à¸¸à¸“าพิมพ์ข้อความที่คุณเห็นด้านล่างลงในà¸à¸¥à¹ˆà¸­à¸‡à¸—ี่à¸à¸³à¸«à¸™à¸”ให้ ([[Special:Captcha/help|ข้อมูลเพิ่มเติม]])', # Fuzzy
+ 'fancycaptcha-createaccount' => 'เพื่อป้องà¸à¸±à¸™à¸à¸²à¸£à¸ªà¸£à¹‰à¸²à¸‡à¸šà¸±à¸à¸Šà¸µà¸œà¸¹à¹‰à¹ƒà¸Šà¹‰à¸”้วยà¸à¸£à¸°à¸šà¸§à¸™à¸à¸²à¸£à¸­à¸±à¸•à¹‚นมัติ à¸à¸£à¸¸à¸“าพิมพ์ข้อความที่คุณเห็นด้านล่างลงในà¸à¸¥à¹ˆà¸­à¸‡à¸—ี่à¸à¸³à¸«à¸™à¸”ให้ ([[Special:Captcha/help|ข้อมูลเพิ่มเติม]])', # Fuzzy
'fancycaptcha-create' => 'เพื่อสร้างหน้านี้ à¸à¸£à¸¸à¸“าพิมพ์ข้อความที่คุณเห็นด้านล่างลงในà¸à¸¥à¹ˆà¸­à¸‡à¸—ี่à¸à¸³à¸«à¸™à¸”ให้ ([[Special:Captcha/help|ข้อมูลเพิ่มเติม]])',
'fancycaptcha-edit' => 'เพื่อà¹à¸à¹‰à¹„ขหน้านี้ à¸à¸£à¸¸à¸“าพิมพ์ข้อความที่คุณเห็นด้านล่างลงในà¸à¸¥à¹ˆà¸­à¸‡à¸—ี่à¸à¸³à¸«à¸™à¸”ให้ ([[Special:Captcha/help|ข้อมูลเพิ่มเติม]])',
);
@@ -1497,8 +1591,8 @@ $messages['th'] = array(
* @author Hanberke
*/
$messages['tk'] = array(
- 'fancycaptcha-badlogin' => 'Awtomatik parol döwülmeginden goranmak üçin, aşakdaky sözleri gutunyň içine ýazyň ([[Special:Captcha/help|jikme-jik]]):',
- 'fancycaptcha-createaccount' => 'Hasaby awtomatik parol döwülmeginden goramak üçin, aşakdaky sözleri gutunyň içine ýazyň ([[Special:Captcha/help|jikme-jik]]):',
+ 'fancycaptcha-badlogin' => 'Awtomatik parol döwülmeginden goranmak üçin, aşakdaky sözleri gutunyň içine ýazyň ([[Special:Captcha/help|jikme-jik]]):', # Fuzzy
+ 'fancycaptcha-createaccount' => 'Hasaby awtomatik parol döwülmeginden goramak üçin, aşakdaky sözleri gutunyň içine ýazyň ([[Special:Captcha/help|jikme-jik]]):', # Fuzzy
'fancycaptcha-create' => 'Sahypa döretmek üçin, aşakdaky sözleri gutunyň içine ýazyň ([[Special:Captcha/help|jikme-jik]]):',
'fancycaptcha-edit' => 'Bu sahypany redaktirlemek üçin, aşakdaky sözleri gutunyň içine ýazyň ([[Special:Captcha/help|jikme-jik]]):',
);
@@ -1509,12 +1603,12 @@ $messages['tk'] = array(
$messages['tl'] = array(
'fancycaptcha-desc' => 'Kaakit-akit na panlikha ng CAPTCHA para sa Pagtiyak ng Pagbago',
'fancycaptcha-addurl' => "Kabilang sa ginawa mong pagbabago ang bagong panlabas na mga kawing.
-Upang makatulong sa pagsasanggalang laban sa kusang pinapadalang mga \"manlulusob\" (''spam''), pakilagay lamang ang mga salitang lumitaw sa ibaba papasok sa loob ng kahon ([[Special:Captcha/help|mas marami pang kabatiran]]):",
- 'fancycaptcha-badlogin' => 'Upang makatulong sa pagsasanggalang laban sa mga kusang paglutas ng hudyat, pakilagay lamang ang mga salitang lumitaw sa ibaba patungo sa loob ng kahon ([[Special:Captcha/help|mas marami pang kabatiran]]):',
- 'fancycaptcha-createaccount' => 'Upang makatulong sa pagsasanggalang laban sa kusang paglikha ng kuwenta/akawnt, pakilagay lamang ang mga salitang lumitaw sa ibaba patungo sa loob ng kahon ([[Special:Captcha/help|mas marami pang kabatiran]]):',
+Upang makatulong sa pagsasanggalang laban sa kusang pinapadalang mga \"manlulusob\" (''spam''), pakilagay lamang ang mga salitang lumitaw sa ibaba papasok sa loob ng kahon ([[Special:Captcha/help|mas marami pang kabatiran]]):", # Fuzzy
+ 'fancycaptcha-badlogin' => 'Upang makatulong sa pagsasanggalang laban sa mga kusang paglutas ng hudyat, pakilagay lamang ang mga salitang lumitaw sa ibaba patungo sa loob ng kahon ([[Special:Captcha/help|mas marami pang kabatiran]]):', # Fuzzy
+ 'fancycaptcha-createaccount' => 'Upang makatulong sa pagsasanggalang laban sa kusang paglikha ng kuwenta/akawnt, pakilagay lamang ang mga salitang lumitaw sa ibaba patungo sa loob ng kahon ([[Special:Captcha/help|mas marami pang kabatiran]]):', # Fuzzy
'fancycaptcha-create' => 'Upang malikha ang pahina, pakilagay lamang ang mga salitang lumitaw sa ibaba patungo sa loob ng kahon ([[Special:Captcha/help|mas marami pang kabatiran]]):',
'fancycaptcha-edit' => 'Upang mabago ang pahinang ito, pakilagay lamang ang mga salitang lumitaw sa ibaba patungo sa loob ng kahon ([[Special:Captcha/help|mas marami pang kabatiran]]):',
- 'fancycaptcha-sendemail' => 'Upang makatulong sa pagsasanggalang laban sa mga kusang pagsalakay ng ispam, pakilagay lamang ang mga salitang lumilitaw sa ibaba sa loob ng kahong ([[Special:Captcha/help|marami pang kabatiran]]):',
+ 'fancycaptcha-sendemail' => 'Upang makatulong sa pagsasanggalang laban sa mga kusang pagsalakay ng ispam, pakilagay lamang ang mga salitang lumilitaw sa ibaba sa loob ng kahong ([[Special:Captcha/help|marami pang kabatiran]]):', # Fuzzy
);
/** Turkish (Türkçe)
@@ -1524,16 +1618,18 @@ Upang makatulong sa pagsasanggalang laban sa kusang pinapadalang mga \"manluluso
*/
$messages['tr'] = array(
'fancycaptcha-addurl' => 'Değişikliğiniz yeni dış bağlantılar içeriyor.
-Otomatik spamdan korunmak için, lütfen aşağıdaki sözcükleri kutunun içine yazın ([[Special:Captcha/help|ayrıntılı bilgiler]]):',
- 'fancycaptcha-badlogin' => 'Otomatik parola kırma yöntemine karşı korunmak için lütfen aşağıdaki sözcükleri kutunun içine yazınız ([[Special:Captcha/help|ayrıntılı bilgi]]):',
- 'fancycaptcha-createaccount' => 'Otomatik hesap oluşturmaya karşı korumaya yardım etmek için, lütfen aşağıdaki kutuda görünen kelimeleri girin ([[Special:Captcha/help|daha fazla bilgi]]):',
+Otomatik spamdan korunmak için, lütfen aşağıdaki sözcükleri kutunun içine yazın ([[Special:Captcha/help|ayrıntılı bilgiler]]):', # Fuzzy
+ 'fancycaptcha-badlogin' => 'Otomatik parola kırma yöntemine karşı korunmak için lütfen aşağıdaki sözcükleri kutunun içine yazınız ([[Special:Captcha/help|ayrıntılı bilgi]]):', # Fuzzy
+ 'fancycaptcha-createaccount' => 'Otomatik hesap oluşturmaya karşı korumaya yardım etmek için, lütfen aşağıdaki kutuda görünen kelimeleri girin ([[Special:Captcha/help|daha fazla bilgi]]):', # Fuzzy
'fancycaptcha-create' => 'Sayfayı oluşturmak için, lütfen aşağıdaki kutuda görünen kelimeleri girin ([[Special:Captcha/help|daha fazla bilgi]]):',
'fancycaptcha-edit' => 'Bu sayfayı değiştirmek için, lütfen aşağıdaki kutuda görünen kelimeleri girin ([[Special:Captcha/help|daha fazla bilgi]]):',
- 'fancycaptcha-sendemail' => 'Otomatik spamlerden korunmaya yardımcı olmak için, lütfen aşağıda görünen sözcükleri kutuya yazın ([[Special:Captcha/help|daha fazla bilgi]]):',
+ 'fancycaptcha-sendemail' => 'Otomatik spamlerden korunmaya yardımcı olmak için, lütfen aşağıda görünen sözcükleri kutuya yazın ([[Special:Captcha/help|daha fazla bilgi]]):', # Fuzzy
+ 'fancycaptcha-reload-text' => 'Yenile',
);
/** Ukrainian (українÑька)
* @author Ahonc
+ * @author Andriykopanytsia
* @author Base
* @author Dim Grits
* @author Ytsukeng Fyvaprol
@@ -1541,12 +1637,12 @@ Otomatik spamdan korunmak için, lütfen aşağıdaki sözcükleri kutunun için
$messages['uk'] = array(
'fancycaptcha-desc' => 'Чудернацький CAPTCHA-генератор Ð´Ð»Ñ Ð¿Ñ–Ð´Ñ‚Ð²ÐµÑ€Ð´Ð¶ÐµÐ½Ð½Ñ Ñ€ÐµÐ´Ð°Ð³ÑƒÐ²Ð°Ð½Ð½Ñ',
'fancycaptcha-addurl' => 'Ваше Ñ€ÐµÐ´Ð°Ð³ÑƒÐ²Ð°Ð½Ð½Ñ Ð¼Ñ–Ñтить нові зовнішні поÑиланнÑ.
-Із метою захиÑту від Ñпаму, будь лаÑка, введіть у текÑтове поле Ñлова, зображені на картинці ([[Special:Captcha/help|докладніше]]):',
- 'fancycaptcha-badlogin' => 'Із метою захиÑту від автоматичного злому паролÑ, будь лаÑка, введіть у текÑтове поле Ñлова, зображені на картинці ([[Special:Captcha/help|докладніше]]):',
- 'fancycaptcha-createaccount' => 'Із метою захиÑту від автоматичного ÑÑ‚Ð²Ð¾Ñ€ÐµÐ½Ð½Ñ Ð¾Ð±Ð»Ñ–ÐºÐ¾Ð²Ð¸Ñ… запиÑів, будь лаÑка, введіть у текÑтове поле Ñлова, зображені на картинці ([[Special:Captcha/help|докладніше]]):',
+Із метою захиÑту вікі від Ñпаму проÑимо Ð²Ð°Ñ Ð²Ð²ÐµÑти у текÑтове поле Ñлова, зображені на картинці ([[Special:Captcha/help|докладніше]]):',
+ 'fancycaptcha-badlogin' => 'Із метою захиÑту вікі від автоматичного злому паролÑ, проÑимо Ð²Ð°Ñ Ð²Ð²ÐµÑти у текÑтове поле Ñлова, зображені на картинці ([[Special:Captcha/help|докладніше]]):',
+ 'fancycaptcha-createaccount' => 'Із метою захиÑту вікі від автоматичного ÑÑ‚Ð²Ð¾Ñ€ÐµÐ½Ð½Ñ Ð¾Ð±Ð»Ñ–ÐºÐ¾Ð²Ð¸Ñ… запиÑів, проÑимо Ð²Ð°Ñ Ð²Ð²ÐµÑти у текÑтове поле Ñлова, зображені на картинці ([[Special:Captcha/help|докладніше]]):',
'fancycaptcha-create' => 'Щоб Ñтворити Ñторінку, будь лаÑка, введіть у текÑтове поле Ñлова, зображені на картинці: ([[Special:Captcha/help|докладніше]]):',
'fancycaptcha-edit' => 'Щоб редагувати цю Ñторінку, будь лаÑка, введіть у текÑтове поле Ñлова, зображені на картинці: ([[Special:Captcha/help|докладніше]]):',
- 'fancycaptcha-sendemail' => 'Ð”Ð»Ñ Ð·Ð°Ñ…Ð¸Ñту від автоматичного Ñпаму, будь лаÑка, введіть Ñлова, Ñкі показані нижче в полі ([[Special:Captcha/help|more info]]):',
+ 'fancycaptcha-sendemail' => 'Ð”Ð»Ñ Ð·Ð°Ñ…Ð¸Ñту вікі від автоматичного Ñпаму проÑимо Ð²Ð°Ñ Ð²Ð²ÐµÑти Ñлова, Ñкі показані нижче в полі ([[Special:Captcha/help|more info]]):',
'fancycaptcha-reload-text' => 'Оновити',
);
@@ -1555,12 +1651,12 @@ $messages['uk'] = array(
*/
$messages['vec'] = array(
'fancycaptcha-addurl' => 'La to modifica la include dei novi colegamenti esterni.
-Par jutarne a conbàtar el spam, par piaser inserissi ne la casela le parole che vien fora qua soto ([[Special:Captcha/help|magiori informazion]]):',
- 'fancycaptcha-badlogin' => 'Par precauzion contro i tentativi de forzatura automatica de le password, par piaser inserissi ne la casela le parole che vien fora qua soto ([[Special:Captcha/help|magiori informazion]]):',
- 'fancycaptcha-createaccount' => 'Par jutarne a inpedir la creazion automatica dei account, par piaser inserissi ne la casela le parole che vien fora qua soto ([[Special:Captcha/help|magiori informazion]]):',
+Par jutarne a conbàtar el spam, par piaser inserissi ne la casela le parole che vien fora qua soto ([[Special:Captcha/help|magiori informazion]]):', # Fuzzy
+ 'fancycaptcha-badlogin' => 'Par precauzion contro i tentativi de forzatura automatica de le password, par piaser inserissi ne la casela le parole che vien fora qua soto ([[Special:Captcha/help|magiori informazion]]):', # Fuzzy
+ 'fancycaptcha-createaccount' => 'Par jutarne a inpedir la creazion automatica dei account, par piaser inserissi ne la casela le parole che vien fora qua soto ([[Special:Captcha/help|magiori informazion]]):', # Fuzzy
'fancycaptcha-create' => 'Par crear la pagina, par piaser inserissi ne la casela le parole che vien fora qua soto ([[Special:Captcha/help|magiori informazion]]):',
'fancycaptcha-edit' => 'Par modificar la pagina, par piaser inserissi ne la casela le parole che vien fora qua soto ([[Special:Captcha/help|magiori informazion]]):',
- 'fancycaptcha-sendemail' => 'Par precauzion contro i tentativi de forzatura automatica de le password, par piaser inserissi ne la casela le parole che vien fora qua soto ([[Special:Captcha/help|magiori informazion]]):',
+ 'fancycaptcha-sendemail' => 'Par precauzion contro i tentativi de forzatura automatica de le password, par piaser inserissi ne la casela le parole che vien fora qua soto ([[Special:Captcha/help|magiori informazion]]):', # Fuzzy
'fancycaptcha-reload-text' => 'Ajorna',
);
@@ -1571,12 +1667,12 @@ Par jutarne a conbàtar el spam, par piaser inserissi ne la casela le parole che
*/
$messages['vi'] = array(
'fancycaptcha-desc' => 'Trình sản xuất hình CAPTCHA đặc biệt cho ConfirmEdit',
- 'fancycaptcha-addurl' => 'Sá»­a đổi của bạn có chứa các liên kết ngoài. Äể giúp tránh spam tá»± Ä‘á»™ng, xin hãy nhập những từ xuất hiện ở dÆ°á»›i vào ô ([[Special:Captcha/help|thông tin thêm]]):',
- 'fancycaptcha-badlogin' => 'Äể giúp tránh bẻ mật khẩu tá»± Ä‘á»™ng, xin hãy nhập những từ xuất hiện ở dÆ°á»›i vào ô ([[Special:Captcha/help|thông tin thêm]]):',
- 'fancycaptcha-createaccount' => 'Äể giúp tránh tạo tài khoản tá»± Ä‘á»™ng, xin hãy nhập những chữ xuất hiện ở dÆ°á»›i vào ô ([[Special:Captcha/help|thông tin thêm]]):',
+ 'fancycaptcha-addurl' => 'Sá»­a đổi của bạn có chứa các liên kết ngoài. Äể giúp chúng tôi chống lại spam tá»± Ä‘á»™ng, xin vui lòng nhập những từ xuất hiện ở dÆ°á»›i vào ô ([[Special:Captcha/help|thông tin thêm]]):',
+ 'fancycaptcha-badlogin' => 'Äể giúp chúng tôi tránh bẻ mật khẩu tá»± Ä‘á»™ng, xin vui lòng nhập những từ xuất hiện ở dÆ°á»›i vào ô ([[Special:Captcha/help|thông tin thêm]]):',
+ 'fancycaptcha-createaccount' => 'Äể giúp chúng tôi tránh mở tài khoản tá»± Ä‘á»™ng, xin vui lòng nhập những chữ xuất hiện ở dÆ°á»›i vào ô ([[Special:Captcha/help|thông tin thêm]]):',
'fancycaptcha-create' => 'Äể tạo trang, xin hãy nhập những chữ xuất hiện ở dÆ°á»›i vào ô ([[Special:Captcha/help|thông tin thêm]]):',
'fancycaptcha-edit' => 'Äể sá»­a trang này, xin hãy nhập những từ xuất hiện ở dÆ°á»›i vào ô ([[Special:Captcha/help|thông tin thêm]]):',
- 'fancycaptcha-sendemail' => 'Äể giúp chúng tôi chống lại spam tá»± Ä‘á»™ng, xin hãy nhập những từ xuất hiện ở dÆ°á»›i vào ô ([[Special:Captcha/help|thông tin thêm]]):',
+ 'fancycaptcha-sendemail' => 'Äể giúp chúng tôi chống lại spam tá»± Ä‘á»™ng, xin vui lòng nhập những từ xuất hiện ở dÆ°á»›i vào ô ([[Special:Captcha/help|thông tin thêm]]):',
'fancycaptcha-reload-text' => 'Làm tươi',
);
@@ -1584,9 +1680,9 @@ $messages['vi'] = array(
* @author Smeira
*/
$messages['vo'] = array(
- 'fancycaptcha-addurl' => 'Redakam olik keninükon yümis plödik nulik. Ad jelön siti ta peneds itjäfidik, penolös vödis sököl in bokil ([[Special:Captcha/help|nüns pluik]]):',
- 'fancycaptcha-badlogin' => 'Ad jelön siti ta daget itjäfidik letavödas, penolös, begö! vödis dono pejonölis in bokil ([[Special:Captcha/help|nüns pluik]]):',
- 'fancycaptcha-createaccount' => 'Ad jelön siti ta kalijafam itjäfidik, penolös, begö! vödis dono pejonölis in bokil ([[Special:Captcha/help|nüns pluik]]):',
+ 'fancycaptcha-addurl' => 'Redakam olik keninükon yümis plödik nulik. Ad jelön siti ta peneds itjäfidik, penolös vödis sököl in bokil ([[Special:Captcha/help|nüns pluik]]):', # Fuzzy
+ 'fancycaptcha-badlogin' => 'Ad jelön siti ta daget itjäfidik letavödas, penolös, begö! vödis dono pejonölis in bokil ([[Special:Captcha/help|nüns pluik]]):', # Fuzzy
+ 'fancycaptcha-createaccount' => 'Ad jelön siti ta kalijafam itjäfidik, penolös, begö! vödis dono pejonölis in bokil ([[Special:Captcha/help|nüns pluik]]):', # Fuzzy
'fancycaptcha-create' => 'Ad jafön padi at, penolös, begö! vödis dono pejonöls in bokil ([[Special:Captcha/help|nüns pluik]]):',
'fancycaptcha-edit' => 'Ad redakön padi at, penolös, begö! vödis dono pejonölis ini bokil ([[Special:Captcha/help|nüns pluik]]):',
);
@@ -1596,7 +1692,7 @@ $messages['vo'] = array(
*/
$messages['vro'] = array(
'fancycaptcha-badlogin' => 'Salasõna automaatsõ vällänuhkmisõ vasta kirodaq pildi päält sõnaq alanolõvahe kasti
-([[Special:Captcha/help|Abiteedüs]]):',
+([[Special:Captcha/help|Abiteedüs]]):', # Fuzzy
);
/** Walloon (walon)
@@ -1604,12 +1700,12 @@ $messages['vro'] = array(
*/
$messages['wa'] = array(
'fancycaptcha-addurl' => "Dins vos candjmints i gn a des dfoûtrinnès hårdêyes (URL).
-Po s' mete a houte des robots di spam, nos vs dimandans d' acertiner ki vos estoz bén ene djin, po çoula tapez les mots k' aparexhèt chal pa dzo ([[Special:Captcha/help|pus di racsegnes]]):",
- 'fancycaptcha-badlogin' => "Po s' mete a houte des des robots ki sayèt d' adviner les screts, nos vs dimandans d' acertiner ki vos estoz bén ene djin, po çoula tapez les mots k' aperexhèt chal pa dzo ([[Special:Captcha/help|pus di racsegnes]]):",
- 'fancycaptcha-createaccount' => "Po s' mete a houte des des robots k' ahivèt des contes otomaticmint, nos vs dimandans d' acertiner ki vos estoz bén ene djin, po çoula tapez les mots k' aparexhèt chal pa dzi ([[Special:Captcha/help|pus di racsegnes]]):",
+Po s' mete a houte des robots di spam, nos vs dimandans d' acertiner ki vos estoz bén ene djin, po çoula tapez les mots k' aparexhèt chal pa dzo ([[Special:Captcha/help|pus di racsegnes]]):", # Fuzzy
+ 'fancycaptcha-badlogin' => "Po s' mete a houte des des robots ki sayèt d' adviner les screts, nos vs dimandans d' acertiner ki vos estoz bén ene djin, po çoula tapez les mots k' aperexhèt chal pa dzo ([[Special:Captcha/help|pus di racsegnes]]):", # Fuzzy
+ 'fancycaptcha-createaccount' => "Po s' mete a houte des des robots k' ahivèt des contes otomaticmint, nos vs dimandans d' acertiner ki vos estoz bén ene djin, po çoula tapez les mots k' aparexhèt chal pa dzi ([[Special:Captcha/help|pus di racsegnes]]):", # Fuzzy
'fancycaptcha-create' => "Por vos poleur ahiver l' pådje, vos dvoz taper les mots k' aparexhèt e l' boesse chal pa dzo ([[Special:Captcha/help|pus di racsegnes]]):",
'fancycaptcha-edit' => "Po candjî cisse pådje ci, vos dvoz taper les mots k' aparexhèt e l' boesse chal pa dzo ([[Special:Captcha/help|pus di racsegnes]]):",
- 'fancycaptcha-sendemail' => "Po s' mete a houte des robots di spam, nos vs dimandans d' acertiner ki vos estoz bén ene djin, po çoula tapez les mots k' aparexhèt chal pa dzo ([[Special:Captcha/help|pus di racsegnes]]):",
+ 'fancycaptcha-sendemail' => "Po s' mete a houte des robots di spam, nos vs dimandans d' acertiner ki vos estoz bén ene djin, po çoula tapez les mots k' aparexhèt chal pa dzo ([[Special:Captcha/help|pus di racsegnes]]):", # Fuzzy
);
/** Yiddish (ייִדיש)
@@ -1625,15 +1721,15 @@ $messages['yi'] = array(
*/
$messages['yo'] = array(
'fancycaptcha-addurl' => 'Àwá»n àtúná¹£e yín ní àwá»n ìjápá»Ì€ òde nínú.
-Láti ṣèránwá»Ì láti kojú spam aá¹£efúnrararẹ̀, ẹ já»Ì€wá»Ì ẹ fi àwá»n á»Ì€rá»Ì€ tí wá»Ìn hàn nísàlẹ̀ sínú ààyè ([[Special:Captcha/help|ẹ̀kúnrẹÌrẹÌ]]):',
+Láti ṣèránwá»Ì láti kojú spam aá¹£efúnrararẹ̀, ẹ já»Ì€wá»Ì ẹ fi àwá»n á»Ì€rá»Ì€ tí wá»Ìn hàn nísàlẹ̀ sínú ààyè ([[Special:Captcha/help|ẹ̀kúnrẹÌrẹÌ]]):', # Fuzzy
);
/** Cantonese (粵語)
*/
$messages['yue'] = array(
- 'fancycaptcha-addurl' => '你嘅編輯包括咗新嘅外部連çµã€‚為咗防止自動化嘅濫貼,請響下é¢å€‹ç›’度輸入下é¢å˜…文字 ([[Special:Captcha/help|更多資訊]]):',
- 'fancycaptcha-badlogin' => '為咗防止ä¸ç•¶ç¨‹å¼ç ´è§£å¯†ç¢¼ï¼Œè«‹éŸ¿ä¸‹é¢å€‹ç›’度輸入下é¢å˜…文字 ([[Special:Captcha/help|更多資訊]]):',
- 'fancycaptcha-createaccount' => '為咗防止自動化開新戶å£ï¼Œè«‹éŸ¿ä¸‹é¢å€‹ç›’度輸入下é¢å˜…文字 ([[Special:Captcha/help|更多資訊]]):',
+ 'fancycaptcha-addurl' => '你嘅編輯包括咗新嘅外部連çµã€‚為咗防止自動化嘅濫貼,請響下é¢å€‹ç›’度輸入下é¢å˜…文字 ([[Special:Captcha/help|更多資訊]]):', # Fuzzy
+ 'fancycaptcha-badlogin' => '為咗防止ä¸ç•¶ç¨‹å¼ç ´è§£å¯†ç¢¼ï¼Œè«‹éŸ¿ä¸‹é¢å€‹ç›’度輸入下é¢å˜…文字 ([[Special:Captcha/help|更多資訊]]):', # Fuzzy
+ 'fancycaptcha-createaccount' => '為咗防止自動化開新戶å£ï¼Œè«‹éŸ¿ä¸‹é¢å€‹ç›’度輸入下é¢å˜…文字 ([[Special:Captcha/help|更多資訊]]):', # Fuzzy
'fancycaptcha-create' => 'è¦é–‹ä¸€å€‹æ–°ç‰ˆï¼Œè«‹éŸ¿ä¸‹é¢å€‹ç›’度輸入下é¢å˜…文字 ([[Special:Captcha/help|更多資訊]]):',
'fancycaptcha-edit' => 'è¦ç·¨è¼¯å‘¢ä¸€ç‰ˆï¼Œè«‹éŸ¿ä¸‹é¢å€‹ç›’度輸入下é¢å˜…文字 ([[Special:Captcha/help|更多資訊]]):',
);
@@ -1654,13 +1750,17 @@ $messages['zh-hans'] = array(
/** Traditional Chinese (中文(ç¹é«”)‎)
* @author Horacewai2
+ * @author Justincheng12345
+ * @author Liuxinyu970226
* @author Waihorace
*/
$messages['zh-hant'] = array(
- 'fancycaptcha-addurl' => '您的編輯內容中å«æœ‰æœ¬ç¶²ç«™ä»¥å¤–的連çµã€‚為防止ä¸ç•¶ç¨‹å¼å¤§é‡ç ´å£žï¼Œè«‹è¼¸å…¥ä»¥ä¸‹çš„文字([[Special:Captcha/help|相關資訊]]):',
- 'fancycaptcha-badlogin' => '為防止ä¸ç•¶ç¨‹å¼ç ´è§£å¯†ç¢¼ï¼Œè«‹è¼¸å…¥ä»¥ä¸‹çš„文字([[Special:Captcha/help|相關資訊]]):',
- 'fancycaptcha-createaccount' => '為防止ä¸ç•¶ç¨‹å¼å¤§é‡å»ºç«‹å¸³æˆ¶ï¼Œè«‹è¼¸å…¥ä»¥ä¸‹çš„文字([[Special:Captcha/help|相關資訊]]):',
+ 'fancycaptcha-addurl' => '您的編輯內容中å«æœ‰æœ¬ç¶²ç«™ä»¥å¤–的連çµã€‚
+為防止ä¸ç•¶ç¨‹å¼å¤§é‡ç ´å£žï¼Œè«‹è¼¸å…¥ä»¥ä¸‹çš„文字([[Special:Captcha/help|相關資訊]]):',
+ 'fancycaptcha-badlogin' => '為幫助wiki防範å¯è‡ªå‹•ç ´è§£å¯†ç¢¼ä¹‹ä¸ç•¶ç¨‹å¼ï¼Œæˆ‘們請您éµå…¥ä¸‹é¢è³‡è¨Šæ¡†ä¸­çš„單詞([[Special:Captcha/help|相關資訊]]):',
+ 'fancycaptcha-createaccount' => '為幫助wiki防範å¯è‡ªå‹•å‰µå»ºè³¬æˆ¶ä¹‹ä¸ç•¶ç¨‹å¼ï¼Œæˆ‘們請您éµå…¥ä¸‹é¢è³‡è¨Šæ¡†ä¸­çš„單詞([[Special:Captcha/help|相關資訊]]):',
'fancycaptcha-create' => '為防止ä¸ç•¶ç¨‹å¼å¤§é‡å»ºç«‹é é¢ï¼Œè«‹è¼¸å…¥ä»¥ä¸‹çš„文字([[Special:Captcha/help|相關資訊]]):',
'fancycaptcha-edit' => '如您想è¦ç·¨è¼¯æ­¤é é¢ï¼Œè«‹è¼¸å…¥ä»¥ä¸‹çš„文字([[Special:Captcha/help|相關資訊]]):',
- 'fancycaptcha-sendemail' => '為防止ä¸ç•¶ç¨‹å¼é€²è¡Œç ´å£žï¼Œè«‹è¼¸å…¥ä»¥ä¸‹çš„文字([[Special:Captcha/help|相關資訊]]):',
+ 'fancycaptcha-sendemail' => '為幫助wiki防範垃圾電郵,我們請您éµå…¥ä¸‹é¢è³‡è¨Šæ¡†ä¸­çš„單詞([[Special:Captcha/help|相關資訊]]):',
+ 'fancycaptcha-reload-text' => 'é‡æ–°æ•´ç†',
);
diff --git a/extensions/ConfirmEdit/FancyCaptcha.php b/extensions/ConfirmEdit/FancyCaptcha.php
index 46002e22..cbabb4a0 100644
--- a/extensions/ConfirmEdit/FancyCaptcha.php
+++ b/extensions/ConfirmEdit/FancyCaptcha.php
@@ -62,6 +62,7 @@ $wgAutoloadClasses['FancyCaptcha'] = $dir . '/FancyCaptcha.class.php';
$wgResourceModules['ext.confirmEdit.fancyCaptcha.styles'] = array(
'localBasePath' => $dir . '/resources',
'remoteExtPath' => 'ConfirmEdit/resources',
+ 'targets' => array( 'mobile', 'desktop' ),
'styles' => 'ext.confirmEdit.fancyCaptcha.css',
);
@@ -72,5 +73,15 @@ $wgResourceModules['ext.confirmEdit.fancyCaptcha'] = array(
'dependencies' => 'mediawiki.api',
);
+// FIXME: remove, add mobile target to ext.confirmEdit.fancyCaptcha and update
+// MobileFrontend accordingly when bug 57629 is resolved
+$wgResourceModules['ext.confirmEdit.fancyCaptchaMobile'] = array(
+ 'localBasePath' => $dir . '/resources',
+ 'remoteExtPath' => 'ConfirmEdit/resources',
+ 'scripts' => 'ext.confirmEdit.fancyCaptcha.js',
+ 'targets' => array( 'mobile', 'desktop' ),
+ 'dependencies' => 'mobile.startup',
+);
+
$wgAutoloadClasses['ApiFancyCaptchaReload'] = $dir . '/ApiFancyCaptchaReload.php';
$wgAPIModules['fancycaptchareload'] = 'ApiFancyCaptchaReload';
diff --git a/extensions/ConfirmEdit/MathCaptcha.class.php b/extensions/ConfirmEdit/MathCaptcha.class.php
index fdb6d1ff..ac220baa 100644
--- a/extensions/ConfirmEdit/MathCaptcha.class.php
+++ b/extensions/ConfirmEdit/MathCaptcha.class.php
@@ -39,7 +39,7 @@ class MathCaptcha extends SimpleCaptcha {
/** Fetch the math */
function fetchMath( $sum ) {
- if ( MWInit::classExists( 'MathRenderer' ) ) {
+ if ( class_exists( 'MathRenderer' ) ) {
$math = MathRenderer::getRenderer( $sum, array(), MW_MATH_PNG );
} else {
throw new MWException( 'MathCaptcha requires the Math extension for MediaWiki versions 1.18 and above.' );
diff --git a/extensions/ConfirmEdit/QuestyCaptcha.i18n.php b/extensions/ConfirmEdit/QuestyCaptcha.i18n.php
index c83ed9af..949449fd 100644
--- a/extensions/ConfirmEdit/QuestyCaptcha.i18n.php
+++ b/extensions/ConfirmEdit/QuestyCaptcha.i18n.php
@@ -13,19 +13,19 @@ $messages = array();
$messages['en'] = array(
'questycaptcha-desc' => 'Questy CAPTCHA generator for Confirm Edit',
'questycaptcha-addurl' => 'Your edit includes new external links.
-To help protect against automated spam, please answer the question that appears below ([[Special:Captcha/help|more info]]):',
- 'questycaptcha-badlogin' => 'To help protect against automated password cracking, please answer the question that appears below ([[Special:Captcha/help|more info]]):',
- 'questycaptcha-createaccount' => 'To help protect against automated account creation, please answer the question that appears below ([[Special:Captcha/help|more info]]):',
+To protect the wiki against automated edit spam, we kindly ask you to answer the question that appears below ([[Special:Captcha/help|more info]]):',
+ 'questycaptcha-badlogin' => 'To protect the wiki against automated password cracking, we kindly ask you to answer the question that appears below ([[Special:Captcha/help|more info]]):',
+ 'questycaptcha-createaccount' => 'To protect the wiki against automated account creation, we kindly ask you to answer the question that appears below ([[Special:Captcha/help|more info]]):',
'questycaptcha-create' => 'To create the page, please answer the question that appears below ([[Special:Captcha/help|more info]]):',
'questycaptcha-edit' => 'To edit this page, please answer the question that appears below ([[Special:Captcha/help|more info]]):',
- 'questycaptcha-sendemail' => 'To help protect against automated spamming, please answer the question that appears below ([[Special:Captcha/help|more info]]):',
+ 'questycaptcha-sendemail' => 'To protect the wiki against automated spamming, we kindly ask you to answer the question that appears below ([[Special:Captcha/help|more info]]):',
'questycaptchahelp-text' => 'Web sites that accept contributions from the public, like this wiki, are often abused by spammers who use automated tools to add their links to many sites.
While these spam links can be removed, they are a significant nuisance.
Sometimes, especially when adding new web links to a page, the wiki may ask you to answer a question.
Since this is a task that is hard to automate, it will allow most real humans to make their contributions while stopping most spammers and other robotic attackers.
-Please contact the [[{{MediaWiki:Grouppage-sysop}}|site administrators]] for assistance if this is unexpectedly preventing you from making legitimate contributions.
+Please contact the [[Special:ListAdmins|site administrators]] for assistance if this is unexpectedly preventing you from making legitimate contributions.
Click the "back" button in your browser to return to the page editor.',
);
@@ -51,13 +51,13 @@ $messages['qqq'] = array(
* @author Mdupont
*/
$messages['aln'] = array(
- 'questycaptcha-addurl' => 'Your redakto përfshin të jashtme lidhje të reja. Për të ndihmuar në mbrojtjen kundër spam automatizuar, ju lutem përgjigje pyetjes që duket më poshtë ([[Special:Captcha/help|më shumë informacion]]):',
- 'questycaptcha-badlogin' => 'Për të ndihmuar në mbrojtjen kundër fjalëkalimin automatizuar plasaritje, ju lutem përgjigje pyetjes që duket më poshtë ([[Special:Captcha/help|më shumë informacion]]):',
- 'questycaptcha-createaccount' => 'Për të ndihmuar në mbrojtjen kundër krijimit llogari e automatizuar, ju lutemi përgjigje pyetjes që duket më poshtë ([[Special:Captcha/help|më shumë informacion]]):',
+ 'questycaptcha-addurl' => 'Your redakto përfshin të jashtme lidhje të reja. Për të ndihmuar në mbrojtjen kundër spam automatizuar, ju lutem përgjigje pyetjes që duket më poshtë ([[Special:Captcha/help|më shumë informacion]]):', # Fuzzy
+ 'questycaptcha-badlogin' => 'Për të ndihmuar në mbrojtjen kundër fjalëkalimin automatizuar plasaritje, ju lutem përgjigje pyetjes që duket më poshtë ([[Special:Captcha/help|më shumë informacion]]):', # Fuzzy
+ 'questycaptcha-createaccount' => 'Për të ndihmuar në mbrojtjen kundër krijimit llogari e automatizuar, ju lutemi përgjigje pyetjes që duket më poshtë ([[Special:Captcha/help|më shumë informacion]]):', # Fuzzy
'questycaptcha-create' => 'Për të krijuar një faqe, ju lutem përgjigje të pyetjes që duket më poshtë ([[Special:Captcha/help|më shumë informacion]]):',
'questycaptcha-edit' => 'Për të redaktuar këtë faqe, ju lutem përgjigje të pyetjes që duket më poshtë ([[Special:Captcha/help|më shumë informacion]]):',
- 'questycaptcha-sendemail' => 'Për të ndihmuar në mbrojtjen kundër spamming automatizuar, ju lutem përgjigje pyetjes që duket më poshtë ([[Special:Captcha/help|më shumë informacion]]):',
- 'questycaptchahelp-text' => "Web faqet që të pranojë kontribute nga publiku, si ky wiki, shpesh keqtrajtohen nga spammers që përdorin mjete të automatizuar për të shtuar lidhjet e tyre me shumë vende. Përderisa këto lidhje spam mund të hiqen, ata janë një ngatërresë të rëndësishme. Ndonjëherë, sidomos kur duke shtuar të reja web lidhje me një faqe, wiki mund të kërkojë që për t'iu përgjigjur një pyetje. Ngaqë kjo është një detyrë që është e vështirë për të automatizuar, ajo do të lejojë të vërtetë njerëzit më të japin kontribute të tyre, ndërsa ndaluar spammers më dhe robotik sulmuesit të tjera. Ju lutem kontaktoni [[{{MediaWiki:Grouppage-sysop}}|faqe administratorët]] për ndihmë, nëse kjo është e papritur në parandalimin e ju nga bërja e kontributeve të ligjshme. Kliko 'butonin mbrapa në shfletuesin tuaj për t'u kthyer në faqen e redaktorit.",
+ 'questycaptcha-sendemail' => 'Për të ndihmuar në mbrojtjen kundër spamming automatizuar, ju lutem përgjigje pyetjes që duket më poshtë ([[Special:Captcha/help|më shumë informacion]]):', # Fuzzy
+ 'questycaptchahelp-text' => "Web faqet që të pranojë kontribute nga publiku, si ky wiki, shpesh keqtrajtohen nga spammers që përdorin mjete të automatizuar për të shtuar lidhjet e tyre me shumë vende. Përderisa këto lidhje spam mund të hiqen, ata janë një ngatërresë të rëndësishme. Ndonjëherë, sidomos kur duke shtuar të reja web lidhje me një faqe, wiki mund të kërkojë që për t'iu përgjigjur një pyetje. Ngaqë kjo është një detyrë që është e vështirë për të automatizuar, ajo do të lejojë të vërtetë njerëzit më të japin kontribute të tyre, ndërsa ndaluar spammers më dhe robotik sulmuesit të tjera. Ju lutem kontaktoni [[Special:ListAdmins|faqe administratorët]] për ndihmë, nëse kjo është e papritur në parandalimin e ju nga bërja e kontributeve të ligjshme. Kliko 'butonin mbrapa në shfletuesin tuaj për t'u kthyer në faqen e redaktorit.",
);
/** Arabic (العربية)
@@ -68,12 +68,12 @@ $messages['aln'] = array(
$messages['ar'] = array(
'questycaptcha-desc' => 'مولد كويستي كابتشا لConfirm Edit',
'questycaptcha-addurl' => 'يحتوي تعديلك على وصلات خارجية جديدة.
-للمساعدة ÙÙŠ الحماية من السبام التلقائي، من Ùضلك أجب على السؤال الذي يظهر أدناه ([[Special:Captcha/help|مزيد من المعلومات]]):',
- 'questycaptcha-badlogin' => 'للمساعدة ÙÙŠ الحماية من السبام التلقائي، من Ùضلك أجب على السؤال الذي يظهر أدناه ([[Special:Captcha/help|مزيد من المعلومات]]):',
- 'questycaptcha-createaccount' => 'للمساعدة ÙÙŠ الحماية من إنشاء الحسابات التلقائي، من Ùضلك أجب على السؤال الذي يظهر أدناه ([[Special:Captcha/help|مزيد من المعلومات]]):',
+للمساعدة ÙÙŠ الحماية من السبام التلقائي، من Ùضلك أجب على السؤال الذي يظهر أدناه ([[Special:Captcha/help|مزيد من المعلومات]]):', # Fuzzy
+ 'questycaptcha-badlogin' => 'للمساعدة ÙÙŠ الحماية من السبام التلقائي، من Ùضلك أجب على السؤال الذي يظهر أدناه ([[Special:Captcha/help|مزيد من المعلومات]]):', # Fuzzy
+ 'questycaptcha-createaccount' => 'للمساعدة ÙÙŠ الحماية من إنشاء الحسابات التلقائي، من Ùضلك أجب على السؤال الذي يظهر أدناه ([[Special:Captcha/help|مزيد من المعلومات]]):', # Fuzzy
'questycaptcha-create' => 'لتنشئ الصÙحة، من Ùضلك أجب على السؤال الذي يظهر أدناه ([[Special:Captcha/help|مزيد من المعلومات]]):',
'questycaptcha-edit' => 'لتحرّر هذه الصÙحة، من Ùضلك أجب على السؤال الذي يظهر أدناه ([[Special:Captcha/help|مزيد من المعلومات]]):',
- 'questycaptcha-sendemail' => 'للمساعدة ÙÙŠ الحماية ضد البريد الإلكتروني الآلي المرغوب Ùيه، الرجاء الإجابة على السؤال الذي يظهر أدناه ([[Special:Captcha/help|المزيد من المعلومات]]):',
+ 'questycaptcha-sendemail' => 'للمساعدة ÙÙŠ الحماية ضد البريد الإلكتروني الآلي المرغوب Ùيه، الرجاء الإجابة على السؤال الذي يظهر أدناه ([[Special:Captcha/help|المزيد من المعلومات]]):', # Fuzzy
'questycaptchahelp-text' => "عادة ما يتم ÙÙŠ المواقع التي تقبل الردود والرسائل من العامة، كهذا الويكي، تخريب الموقع عن طريق الأشخاص الذين يستعملون آليات معينة لإرسال وصلاتهم لمواقع متعددة بصورة آلية.
وعلى الرغم من أن هذا يمكن إزالته ولكنه مزعج للغاية.
@@ -82,7 +82,7 @@ $messages['ar'] = array(
للأس٠سيكون هذا صعبا بالنسبة لمستخدمي المتصÙحات المحدودة أو التي تعتمد على النصوص Ùقط أو قراءة النصوص.
ÙÙŠ الوقت الحالي لا يوجد لدينا بديل سمعي.
-من Ùضلك راسل [[{{MediaWiki:Grouppage-sysop}}|إداريي الموقع]] للمساعدة إذا كان هذا الأمر يمنعك من التعديل ووضع وصلات قانونية.
+من Ùضلك راسل [[Special:ListAdmins|إداريي الموقع]] للمساعدة إذا كان هذا الأمر يمنعك من التعديل ووضع وصلات قانونية.
إذا كنت تحرر صÙحة معينة: اضغط زر 'العودة' ÙÙŠ متصÙحك للعودة إلى التحرير.",
);
@@ -91,40 +91,41 @@ $messages['ar'] = array(
* @author Xuacu
*/
$messages['ast'] = array(
- 'questycaptcha-addurl' => "La to edición inclúi nuevos enllaces esternos. P'aidar a protexer escontra'l spam automatizáu, por favor conteste la entruga qu'apaez embaxo ([[Special:Captcha/help|más información]]):",
- 'questycaptcha-badlogin' => "P'ayudar a protexer escontra'l descifráu automáticu de claves, por favor conteste la entruga qu'apaez embaxo ([[Special:Captcha/help|más información]]):",
- 'questycaptcha-createaccount' => "P'ayudar a protexer escontra la creación automática de cuentes, por favor conteste la entruga qu'apaez embaxo ([[Special:Captcha/help|más información]]):",
+ 'questycaptcha-addurl' => "La so edición incluye nuevos enllaces esternos. Pa protexer la wiki escontra'l spam d'edición automatizáu, pidimos-y que conteste la entruga qu'apaez embaxo ([[Special:Captcha/help|más información]]):",
+ 'questycaptcha-badlogin' => "Pa protexer la wiki escontra'l descifráu automáticu de claves, pidimos-y que conteste la entruga qu'apaez embaxo ([[Special:Captcha/help|más información]]):",
+ 'questycaptcha-createaccount' => "Pa protexer la wiki escontra la creación automática de cuentes, pidimos-y que conteste la entruga qu'apaez embaxo ([[Special:Captcha/help|más información]]):",
'questycaptcha-create' => "Pa crear la páxina, por favor conteste la entruga qu'apaez embaxo ([[Special:Captcha/help|más información]]):",
'questycaptcha-edit' => "Pa editar la páxina, por favor conteste la entruga qu'apaez embaxo ([[Special:Captcha/help|más información]]):",
- 'questycaptcha-sendemail' => "P'ayudar a protexer escontra'l corréu puxarra automáticu, por favor conteste la entruga qu'apaez embaxo ([[Special:Captcha/help|más información]]):",
+ 'questycaptcha-sendemail' => "Pa protexer la wiki escontra'l corréu puxarra automáticu, pidimos-y que conteste la entruga qu'apaez embaxo ([[Special:Captcha/help|más información]]):",
'questycaptchahelp-text' => "Los sitios web qu'aceuten collaboración del públicu, como esta wiki, sufren de vezu l'abusu de «spammers» qu'usen ferramientes automátiques p'amestar los sos enllaces en munchos sitios.
Mentanto qu'esos enllaces puen desaniciase, suponen una bultable molestia.
Dacuando, especialmente al amestar enllaces nuevos a una páxina, la wiki pue pidi-y que conteste una entruga.
Como esta ye una xera difícil d'automatizar, permitirá que la mayor parte de persones faiga collaboraciones mentanto torga a la mayor parte de «spammers» y otros atacantes robotizaos .
-Por favor, pongase'n contautu colos [[{{MediaWiki:Grouppage-sysop}}|alministradores del sitiu]] pa pidir ayuda si esto ta torgando-y de mou inesperáu facer collaboraciones llexítimes.
+Por favor, pongase'n contautu colos [[Special:ListAdmins|alministradores del sitiu]] pa pidir ayuda si esto ta torgando-y de mou inesperáu facer collaboraciones llexítimes.
Calque nel botón «atrás» del navegador pa volver al editor de páxines.",
);
/** Bashkir (башҡортÑа)
* @author Assele
+ * @author РуÑтам Ðурыев
*/
$messages['ba'] = array(
'questycaptcha-addurl' => 'Һеҙҙең текÑтығыҙҙа Ñңы тышҡы һылтанмалар бар.
-Ðвтоматик Ñпамдан һаҡлау маҡÑатында, зинһар, түбәндә килтерелгән һорауға Ñуап бирегеҙ ([[Special:Captcha/help|тулыраҡ мәғлүмәт]]):',
- 'questycaptcha-badlogin' => 'Паролде автоматик ватыуҙан һаҡлау маҡÑатында, зинһар, түбәндә килтерелгән һорауға Ñуап бирегеҙ ([[Special:Captcha/help|тулыраҡ мәғлүмәт]]):',
- 'questycaptcha-createaccount' => 'Иҫәп Ñҙмаларын автоматик булдырыуҙан һаҡлау маҡÑатында, зинһар, түбәндә килтерелгән һорауға Ñуап бирегеҙ ([[Special:Captcha/help|тулыраҡ мәғлүмәт]]):',
+Ðвтоматик Ñпамдан һаҡлау маҡÑатында, зинһар, түбәндә килтерелгән һорауға Ñуап бирегеҙ ([[Special:Captcha/help|тулыраҡ мәғлүмәт]]):', # Fuzzy
+ 'questycaptcha-badlogin' => 'Серһүҙҙе автоматик ватыуҙан һаҡлау маҡÑатында, зинһар, түбәндә килтерелгән һорауға Ñуап бирегеҙ ([[Special:Captcha/help|тулыраҡ мәғлүмәт]]):', # Fuzzy
+ 'questycaptcha-createaccount' => 'Иҫәп Ñҙмаларын автоматик булдырыуҙан һаҡлау маҡÑатында, зинһар, түбәндә килтерелгән һорауға Ñуап бирегеҙ ([[Special:Captcha/help|тулыраҡ мәғлүмәт]]):', # Fuzzy
'questycaptcha-create' => 'Яңы бит булдырыу Ó©Ñөн, зинһар, түбәндә килтерелгән һорауға Ñуап бирегеҙ ([[Special:Captcha/help|тулыраҡ мәғлүмәт]]):',
'questycaptcha-edit' => 'Был битте мөхәррирләү Ó©Ñөн, зинһар, түбәндә килтерелгән һорауға Ñуап бирегеҙ ([[Special:Captcha/help|тулыраҡ мәғлүмәт]]):',
- 'questycaptcha-sendemail' => 'Ðвтоматик Ñпамдан һаҡлау маҡÑатында, зинһар, түбәндә килтерелгән һорауға Ñуап бирегеҙ ([[Special:Captcha/help|тулыраҡ мәғлүмәт]]):',
+ 'questycaptcha-sendemail' => 'Ðвтоматик Ñпамдан һаҡлау маҡÑатында, зинһар, түбәндә килтерелгән һорауға Ñуап бирегеҙ ([[Special:Captcha/help|тулыраҡ мәғлүмәт]]):', # Fuzzy
'questycaptchahelp-text' => 'Үҙенә ÑÑтәлек өҫтәргә һәм ÑÑтәлеген мөхәррирләргә мөмкинлек биргән веб-Ñайттар, шул иҫәптән был вики, йыш ҡына Ñайттарға автоматик һылтанмалар Ó©Ò«Ñ‚Ó™Ò¯ Ó©Ñөн программалар ҡулланған ÑпамлауÑыларҙың маҡÑатына әйләнә.
Бындай һылтанмалар юйыла ала, әммә улар һиҙелерлек уңайһыҙлыҡ килтерә.
Ҡайһы бер ғәмәлдәрҙе башҡарған ваҡытта — мәҫәлән, биткә һылтанма өҫтәгән ваҡытта — вики һеҙгә һорауға Ñуап бирергә тәҡдим итә ала. Был мәÑьәләне автоматик рәүештә ÑиÑеү ауыр булғанға күрә, ул күпÑелек кешеләргә мөхәррирләүҙе башҡарырға мөмкинлек бирәÑәк, һәм шул уҡ ваҡытта ÑпамлауÑыларҙың һәм башҡа автоматлаштырылған зыÑн килтереүÑеләрҙең күпÑелеген туҡтатаÑаҡ.
-Зинһар, әгәр бындай тикшереү һеҙгә Ñайтта намыҫ менән Ñшләргә ҡамаÑаулаһа, [[{{MediaWiki:Grouppage-sysop}}|хәкимдәргә]] мөрәжәғәт итегеҙ.
+Зинһар, әгәр бындай тикшереү һеҙгә Ñайтта намыҫ менән Ñшләргә ҡамаÑаулаһа, [[Special:ListAdmins|хәкимдәргә]] мөрәжәғәт итегеҙ.
Мөхәррирләүгә кире ҡайтыу Ó©Ñөн, браузерығыҙҙа кире ҡайтыу төймәһенә баҫығыҙ.',
);
@@ -135,12 +136,12 @@ $messages['ba'] = array(
*/
$messages['be-tarask'] = array(
'questycaptcha-addurl' => 'Вашае Ñ€Ñдагаваньне ўтрымлівае Ð²Ð¾Ð½ÐºÐ°Ð²Ñ‹Ñ ÑпаÑылкі.
-Каб абараніцца да аўтаматычнага Ñпаму, калі лаÑка, адкажыце на пытаньне, паказанае ніжÑй ([[Special:Captcha/help|Ð´Ð°Ð´Ð°Ñ‚ÐºÐ¾Ð²Ð°Ñ Ñ–Ð½Ñ„Ð°Ñ€Ð¼Ð°Ñ†Ñ‹Ñ]]):',
- 'questycaptcha-badlogin' => 'Ð”Ð»Ñ Ð°Ð±Ð°Ñ€Ð¾Ð½Ñ‹ Ñупраць аўтаматычнага падбору паролÑ, калі лаÑка, адкажыце на пытаньне, паказанае ніжÑй ([[Special:Captcha/help|Ð´Ð°Ð´Ð°Ñ‚ÐºÐ¾Ð²Ð°Ñ Ñ–Ð½Ñ„Ð°Ñ€Ð¼Ð°Ñ†Ñ‹Ñ]]):',
- 'questycaptcha-createaccount' => 'Ð”Ð»Ñ Ð°Ð±Ð°Ñ€Ð¾Ð½Ñ‹ Ñупраць аўтаматычнага ÑтварÑÐ½ÑŒÐ½Ñ Ñ€Ð°Ñ…ÑƒÐ½ÐºÐ°Ñž, калі лаÑка, адкажыце на пытаньне, паказанае ніжÑй ([[Special:Captcha/help|Ð´Ð°Ð´Ð°Ñ‚ÐºÐ¾Ð²Ð°Ñ Ñ–Ð½Ñ„Ð°Ñ€Ð¼Ð°Ñ†Ñ‹Ñ]]):',
+Каб абараніцца да аўтаматычнага Ñпаму, калі лаÑка, адкажыце на пытаньне, паказанае ніжÑй ([[Special:Captcha/help|Ð´Ð°Ð´Ð°Ñ‚ÐºÐ¾Ð²Ð°Ñ Ñ–Ð½Ñ„Ð°Ñ€Ð¼Ð°Ñ†Ñ‹Ñ]]):', # Fuzzy
+ 'questycaptcha-badlogin' => 'Ð”Ð»Ñ Ð°Ð±Ð°Ñ€Ð¾Ð½Ñ‹ Ñупраць аўтаматычнага падбору паролÑ, калі лаÑка, адкажыце на пытаньне, паказанае ніжÑй ([[Special:Captcha/help|Ð´Ð°Ð´Ð°Ñ‚ÐºÐ¾Ð²Ð°Ñ Ñ–Ð½Ñ„Ð°Ñ€Ð¼Ð°Ñ†Ñ‹Ñ]]):', # Fuzzy
+ 'questycaptcha-createaccount' => 'Ð”Ð»Ñ Ð°Ð±Ð°Ñ€Ð¾Ð½Ñ‹ Ñупраць аўтаматычнага ÑтварÑÐ½ÑŒÐ½Ñ Ñ€Ð°Ñ…ÑƒÐ½ÐºÐ°Ñž, калі лаÑка, адкажыце на пытаньне, паказанае ніжÑй ([[Special:Captcha/help|Ð´Ð°Ð´Ð°Ñ‚ÐºÐ¾Ð²Ð°Ñ Ñ–Ð½Ñ„Ð°Ñ€Ð¼Ð°Ñ†Ñ‹Ñ]]):', # Fuzzy
'questycaptcha-create' => 'Ð”Ð»Ñ ÑтварÑÐ½ÑŒÐ½Ñ Ñтаронкі, калі лаÑка, адкажыце на пытаньне, паказанае ніжÑй ([[Special:Captcha/help|Ð´Ð°Ð´Ð°Ñ‚ÐºÐ¾Ð²Ð°Ñ Ñ–Ð½Ñ„Ð°Ñ€Ð¼Ð°Ñ†Ñ‹Ñ]]):',
'questycaptcha-edit' => 'Ð”Ð»Ñ Ñ€ÑÐ´Ð°Ð³Ð°Ð²Ð°Ð½ÑŒÐ½Ñ Ð³Ñтай Ñтаронкі, калі лаÑка, адкажыце на пытаньне, паказанае ніжÑй ([[Special:Captcha/help|Ð´Ð°Ð´Ð°Ñ‚ÐºÐ¾Ð²Ð°Ñ Ñ–Ð½Ñ„Ð°Ñ€Ð¼Ð°Ñ†Ñ‹Ñ]]):',
- 'questycaptcha-sendemail' => 'У мÑтах абароны Ñупраць аўтаматычнага Ñпаму, калі лаÑка, адкажыце на пытаньне, паказанае ніжÑй ([[Special:Captcha/help|Ð´Ð°Ð´Ð°Ñ‚ÐºÐ¾Ð²Ð°Ñ Ñ–Ð½Ñ„Ð°Ñ€Ð¼Ð°Ñ†Ñ‹Ñ]]):',
+ 'questycaptcha-sendemail' => 'У мÑтах абароны Ñупраць аўтаматычнага Ñпаму, калі лаÑка, адкажыце на пытаньне, паказанае ніжÑй ([[Special:Captcha/help|Ð´Ð°Ð´Ð°Ñ‚ÐºÐ¾Ð²Ð°Ñ Ñ–Ð½Ñ„Ð°Ñ€Ð¼Ð°Ñ†Ñ‹Ñ]]):', # Fuzzy
'questycaptchahelp-text' => 'Ð’Ñб-Ñайты, ÑÐºÑ–Ñ Ð¿Ñ€Ñ‹Ð¼Ð°ÑŽÑ†ÑŒ запіÑÑ‹ ад грамадзкаÑьці, Ð¿Ð°Ð´Ð¾Ð±Ð½Ñ‹Ñ Ð½Ð° {{GRAMMAR:вінавальны|{{SITENAME}}}}, чаÑта атакуюцца ÑпамÑрамі, ÑÐºÑ–Ñ ÑžÐ¶Ñ‹Ð²Ð°ÑŽÑ†ÑŒ Ð°ÑžÑ‚Ð°Ð¼Ð°Ñ‚Ñ‹Ð·Ð°Ð²Ð°Ð½Ñ‹Ñ Ñ–Ð½ÑтрумÑнты, каб зьмÑшчаць Ñвае ÑпаÑылкі на шмат Ñайтаў.
І Ñ…Ð°Ñ†Ñ Ð³ÑÑ‚Ñ‹Ñ ÑпаÑылкі могуць быць прыбраныÑ, Ñны выклікаюць Ð·Ð½Ð°Ñ‡Ð½Ñ‹Ñ Ð½ÑзручнаÑьці.
@@ -149,28 +150,29 @@ $messages['be-tarask'] = array(
Ðа жаль, гÑта можа выклікаць нÑзручнаÑьці Ð´Ð»Ñ ÑžÐ´Ð·ÐµÐ»ÑŒÐ½Ñ–ÐºÐ°Ñž з абмежаваньнÑмі па зроку Ñ– Ð´Ð»Ñ Ñ‚Ñ‹Ñ…, хто ўжывае Ñ‚ÑкÑÑ‚Ð°Ð²Ñ‹Ñ Ñ†Ñ– Ð¼Ð¾ÑžÐ½Ñ‹Ñ Ð±Ñ€Ð°ÑžÐ·Ñры.
Ðа гÑÑ‚Ñ‹ момант мы Ð½Ñ Ð¼Ð°ÐµÐ¼ аўдыё-альтÑрнатывы гÑтай праверцы.
-Калі лаÑка, зьвÑжыцеÑÑ Ð· [[{{MediaWiki:Grouppage-sysop}}|адмініÑтратарамі]], калі гÑÑ‚Ð°Ñ Ð¿Ñ€Ð°Ð²ÐµÑ€ÐºÐ° перашкаджае Вам рабіць ÑÐ»ÑƒÑˆÐ½Ñ‹Ñ Ð·Ð°Ð¿Ñ–ÑÑ‹.
+Калі лаÑка, зьвÑжыцеÑÑ Ð· [[Special:ListAdmins|адмініÑтратарамі]], калі гÑÑ‚Ð°Ñ Ð¿Ñ€Ð°Ð²ÐµÑ€ÐºÐ° перашкаджае Вам рабіць ÑÐ»ÑƒÑˆÐ½Ñ‹Ñ Ð·Ð°Ð¿Ñ–ÑÑ‹.
ÐаціÑьніце кнопку «назад» у Вашым браўзÑры, каб вÑрнуцца да Ñ€ÑÐ´Ð°Ð³Ð°Ð²Ð°Ð½ÑŒÐ½Ñ Ñтаронкі.',
);
/** Breton (brezhoneg)
+ * @author Fohanno
* @author Fulup
*/
$messages['br'] = array(
'questycaptcha-addurl' => "Degaset hoc'h liammoù diavaez nevez.
A-benn hor skoazellañ da stourm a-enep d'ar strob emgefre, respontit d'ar goulenn a-is ([[Special:Captcha/help|muioc'h a ditouroù]]) :",
- 'questycaptcha-badlogin' => "A-benn hor skoazellañ da stourm a-enep ar freuzañ gerioù-tremen gant ardivinkoù, respontit d'ar goulenn a-is ([[Special:Captcha/help|muioc'h a ditouroù]]) :",
- 'questycaptcha-createaccount' => "A-benn hor skoazellañ da stourm a-enep ar c'hrouiñ kontoù emgefre, respontit d'ar goulenn a-is ([[Special:Captcha/help|muioc'h a ditouroù]]) :",
+ 'questycaptcha-badlogin' => "Evit hor sikour da stourm a-enep ar freuzañ gerioù-tremen gant ardivinkoù, respontit d'ar goulenn a-is ([[Special:Captcha/help|muioc'h a ditouroù]]) :",
+ 'questycaptcha-createaccount' => "Evit hor sikour da stourm a-enep ar c'hrouiñ kontoù emgefre, respontit d'ar goulenn a-is ([[Special:Captcha/help|muioc'h a ditouroù]]) :",
'questycaptcha-create' => "A-benn gellout krouiñ ar bajenn, respontit d'ar goulenn a-is ([[Special:Captcha/help|muioc'h a ditouroù]]) :",
'questycaptcha-edit' => "A-benn gellout degas kemmoù er bajenn-mañ, respontit d'ar goulenn a-is ([[Special:Captcha/help|muioc'h a ditouroù]]) :",
- 'questycaptcha-sendemail' => "Evit hor skoazellañ da zizarbenn ar strob emgefre, respontit d'ar goulenn skrivet dindan ([[Special:Captcha/help|gouzout hiroc'h]]) :",
+ 'questycaptcha-sendemail' => "Evit hor sikour da zizarbenn ar strob emgefre, respontit d'ar goulenn skrivet dindan ([[Special:Captcha/help|gouzout hiroc'h]]) :",
'questycaptchahelp-text' => "Alies e vez taget al lec'hiennoù a zegemer kemennadennoù a-berzh an holl, evel ar wiki-mañ, gant ar stroberien a implij ostilhoù emgefre evit postañ o liammoù war-du lec'hiennoù a bep seurt. Ha pa c'hallfent bezañ diverket, kazus-mat ez eo ar stroboù-se memes tra.
A-wezhioù, dreist-holl pa vez ouzhpennet liammoù Web nevez war ur bajenn, e c'hallo ar wiki-mañ sevel ur goulenn ouzhoc'h.
Un trevell start da emgefrekaat eo hemañ. Gant se e c'hallo an implijerien wirion postañ ar pezh a fell dezho tra ma vo lakaet un harz d'an darn vrasañ eus ar stroberien pe d'an dagerien robotek all.
-Kit e darempred gant [[{{MediaWiki:Grouppage-sysop}}|merourien al lec'hienn]] evit bezañ skoazellet m'hoc'h eus diaesterioù da gemer perzh da vat abalamour d'an teknik-se.
+Kit e darempred gant [[Special:ListAdmins|merourien al lec'hienn]] evit bezañ skoazellet m'hoc'h eus diaesterioù da gemer perzh da vat abalamour d'an teknik-se.
Pouezit war bouton 'kent' ho merdeer evit distreiñ d'ar bajenn gemmañ.",
);
@@ -180,18 +182,18 @@ Pouezit war bouton 'kent' ho merdeer evit distreiñ d'ar bajenn gemmañ.",
*/
$messages['bs'] = array(
'questycaptcha-addurl' => 'VaÅ¡a izmjena ukljuÄuje nove vanjske linkove.
-Da bi pomogli protiv automatskog spama, molimo odgovorite na pitanje koje je prikazano ispod ([[Special:Captcha/help|više informacija]]):',
- 'questycaptcha-badlogin' => 'Da bi pomogli u sprjeÄavanju protiv automatskog probijanja Å¡ifre, molimo Vas da odgovorite na pitanje koje je prikazano ispod ([[Special:Captcha/help|viÅ¡e informacija]]):',
- 'questycaptcha-createaccount' => 'Da bi pomogli u sprjeÄavanju automatskog pravljenja raÄuna, molimo Vas da odgovorite na pitanje koje je prikazano ispod ([[Special:Captcha/help|viÅ¡e informacija]]):',
+Da bi pomogli protiv automatskog spama, molimo odgovorite na pitanje koje je prikazano ispod ([[Special:Captcha/help|više informacija]]):', # Fuzzy
+ 'questycaptcha-badlogin' => 'Da bi pomogli u sprjeÄavanju protiv automatskog probijanja Å¡ifre, molimo Vas da odgovorite na pitanje koje je prikazano ispod ([[Special:Captcha/help|viÅ¡e informacija]]):', # Fuzzy
+ 'questycaptcha-createaccount' => 'Da bi pomogli u sprjeÄavanju automatskog pravljenja raÄuna, molimo Vas da odgovorite na pitanje koje je prikazano ispod ([[Special:Captcha/help|viÅ¡e informacija]]):', # Fuzzy
'questycaptcha-create' => 'Da bi ste napravili stranicu, molimo Vas da odgovorite na pitanje koje je prikazano ispod ([[Special:Captcha/help|više informacija]]):',
'questycaptcha-edit' => 'Da bi ste uredili ovu stranicu, molimo Vas da odgovorite na pitanje koje je prikazano ispod ([[Special:Captcha/help|više informacija]]):',
- 'questycaptcha-sendemail' => 'Da bi pomogli u zaštiti protiv automatskog spamovanja, molimo Vas da odgovorite na pitanje koje je prikazano ispod ([[Special:Captcha/help|više informacija]]):',
+ 'questycaptcha-sendemail' => 'Da bi pomogli u zaštiti protiv automatskog spamovanja, molimo Vas da odgovorite na pitanje koje je prikazano ispod ([[Special:Captcha/help|više informacija]]):', # Fuzzy
'questycaptchahelp-text' => "Websajtovi koji podržavaju doprinose iz javnosti, kao Å¡to je ovaj viki, Äesto zloupotrebljavaju vandali koji koriste automatizovane alate da Å¡alju svoje linkove ka mnogim sajtovima.
Iako se ovi neželjeni linkovi mogu ukloniti, oni ipak zadaju veliku muku.
Ponekad, pogotovo kad se dodaju novi internet linkovi na stranicu, wiki može tražiti od Vas da odgovorite na pitanje. PoÅ¡to je teÅ¡ko automatizovati ovakav zadatak, on omogućuje svim pravim ljudima da vrÅ¡e svoje izmjene, ali će zato sprijeÄiti vandale i ostale robotske napadaÄe.
-Molimo Vas da kontaktirate [[{{MediaWiki:Grouppage-sysop}}|administratore stranice]] za pomoć ako je ovo prepreka za Vas da pravite uobiÄajene izmjene.
+Molimo Vas da kontaktirate [[Special:ListAdmins|administratore stranice]] za pomoć ako je ovo prepreka za Vas da pravite uobiÄajene izmjene.
Kliknite 'nazad' ('back') dugme vašeg preglednika da se vratite na polje za unos teksta.",
);
@@ -202,7 +204,7 @@ Kliknite 'nazad' ('back') dugme vašeg preglednika da se vratite na polje za uno
*/
$messages['ca'] = array(
'questycaptcha-addurl' => "L'edició inclou enllaços externs nous.
-Per ajudar a protegir-se contra la brossa automàtica, responeu la pregunta que apareix a continuació ([[Special:Captcha/help|més informació]]):",
+Per ajudar a protegir-se contra la brossa automàtica, responeu la pregunta que apareix a continuació ([[Special:Captcha/help|més informació]]):", # Fuzzy
'questycaptcha-create' => 'Per crear la pàgina, per favor responeu la pregunta que apareix a continuació ([[Special:Captcha/help|més informació]]):',
);
@@ -211,18 +213,18 @@ Per ajudar a protegir-se contra la brossa automàtica, responeu la pregunta que
*/
$messages['cs'] = array(
'questycaptcha-addurl' => 'Vaše editace obsahuje nové externí odkazy.
-V zájmu ochrany před automatickým spamováním musíte zodpovědět níže uvedenou otázku ([[Special:Captcha/help|další informace]]):',
- 'questycaptcha-badlogin' => 'V rámci ochrany proti automatickým pokusům uhodnout heslo musíte zodpovědět níže uvedenou otázku ([[Special:Captcha/help|další informace]]):',
- 'questycaptcha-createaccount' => 'V rámci ochrany pÅ™ed automatickým vytvářením úÄtů musíte pro provedení registrace zodpovÄ›dÄ›t níže uvedenou otázku ([[Special:Captcha/help|další informace]]):',
+V zájmu ochrany před automatickým spamováním musíte zodpovědět níže uvedenou otázku ([[Special:Captcha/help|další informace]]):', # Fuzzy
+ 'questycaptcha-badlogin' => 'V rámci ochrany proti automatickým pokusům uhodnout heslo musíte zodpovědět níže uvedenou otázku ([[Special:Captcha/help|další informace]]):', # Fuzzy
+ 'questycaptcha-createaccount' => 'V rámci ochrany pÅ™ed automatickým vytvářením úÄtů musíte pro provedení registrace zodpovÄ›dÄ›t níže uvedenou otázku ([[Special:Captcha/help|další informace]]):', # Fuzzy
'questycaptcha-create' => 'Abyste mohli založit stránku, musíte zodpovědět níže uvedenou otázku ([[Special:Captcha/help|další informace]]):',
'questycaptcha-edit' => 'Abyste mohli editovat tuto stránku, musíte zodpovědět níže uvedenou otázku ([[Special:Captcha/help|další informace]]):',
- 'questycaptcha-sendemail' => 'V rámci ochrany proti automatickému spamování musíte zodpovědět níže zobrazenou otázku ([[Special:Captcha/help|více informací]]):',
+ 'questycaptcha-sendemail' => 'V rámci ochrany proti automatickému spamování musíte zodpovědět níže zobrazenou otázku ([[Special:Captcha/help|více informací]]):', # Fuzzy
'questycaptchahelp-text' => 'Webové stránky, do kterých mohou pÅ™ispívat jejich návÅ¡tÄ›vníci (jako například tato wiki), jsou Äasto terÄem spammerů, kteří pomocí automatických nástrojů vkládají své odkazy na velké množství stránek. PÅ™estože lze tento spam odstranit, pÅ™edstavuje nepříjemné obtěžování.
Někdy, zvláště při přidávání nových webových odkazů, vás wiki může požádat o zodpovězení otázky.
Jelikož takovou úlohu lze jen těžko automatizovat, skuteÄní lidé mohou dále pÅ™ispívat, zatímco vÄ›tÅ¡inu spammerů a jiných robotických útoÄníků to zastaví.
-Pokud vám to brání v užiteÄných příspÄ›vcích a potÅ™ebujete pomoc, kontaktujte laskavÄ› [[{{MediaWiki:Grouppage-sysop}}|správce serveru]].
+Pokud vám to brání v užiteÄných příspÄ›vcích a potÅ™ebujete pomoc, kontaktujte laskavÄ› [[Special:ListAdmins|správce serveru]].
Pro návrat na pÅ™edchozí stránku stisknÄ›te ve svém prohlížeÄi tlaÄítko „zpÄ›t“.',
);
@@ -232,36 +234,44 @@ Pro návrat na pÅ™edchozí stránku stisknÄ›te ve svém prohlížeÄi tlaÄítko
*/
$messages['cy'] = array(
'questycaptcha-addurl' => 'Mae eich golygiad yn cynnwys o leiaf un cyswllt allanol newydd.
-Er mwyn ceisio rhwystro peiriannau sbam, byddwch gystal ag ateb y cwestiwn a welwch isod ([[Special:Captcha/help|rhagor o wybodaeth]]):',
- 'questycaptcha-badlogin' => 'Er mwyn ceisio rhwystro peiriannau datrys cyfrineiriau, byddwch gystal ag ateb y cwestiwn a welwch isod ([[Special:Captcha/help|rhagor o wybodaeth]]):',
- 'questycaptcha-createaccount' => 'Er mwyn ceisio rhwystro peiriannau creu cyfrifon, byddwch gystal ag ateb y cwestiwn a welwch isod ([[Special:Captcha/help|rhagor o wybodaeth]]):',
+Er mwyn arbed y wici rhag peiriannau sbam, byddwch gystal ag ateb y cwestiwn a welwch isod ([[Special:Captcha/help|rhagor o wybodaeth]]):',
+ 'questycaptcha-badlogin' => 'Er mwyn arbed y wici rhag peiriannau datrys cyfrineiriau, byddwch gystal ag ateb y cwestiwn a welwch isod ([[Special:Captcha/help|rhagor o wybodaeth]]):',
+ 'questycaptcha-createaccount' => 'Er mwyn arbed y wici rhag peiriannau creu cyfrifon, byddwch gystal ag ateb y cwestiwn a welwch isod ([[Special:Captcha/help|rhagor o wybodaeth]]):',
'questycaptcha-create' => "Er mwyn dechrau'r dudalen, byddwch gystal ag ateb y cwestiwn a welwch isod ([[Special:Captcha/help|rhagor o wybodaeth]]):",
'questycaptcha-edit' => "Er mwyn golygu'r dudalen, byddwch gystal ag ateb y cwestiwn a welwch isod ([[Special:Captcha/help|rhagor o wybodaeth]]):",
- 'questycaptcha-sendemail' => 'Er mwyn cyfrannu at ddiogelu rhag sbamio awtomatig, byddwch gystal ag ateb y cwestiwn a welwch isod ([[Special:Captcha/help|rhagor o wybodaeth]]):',
+ 'questycaptcha-sendemail' => 'Er mwyn arbed y wici rhag sbamio awtomatig, byddwch gystal ag ateb y cwestiwn a welwch isod ([[Special:Captcha/help|rhagor o wybodaeth]]):',
+ 'questycaptchahelp-text' => "Mae safleoedd gwe fel y wici hon, sy'n caniatau i'r cyhoedd ysgrifennu iddi, yn darged beunyddiol i sbamwyr sy'n defnyddio rhaglenni arbennig i bostio eu cysylltiadau ar wefannau lu. Gellir dileu'r dolenni o'r tudalennau, ond mae hynny'n waith trafferthus.
+
+O dro i dro, yn enwedig wrth ychwanegu dolenni at safleoedd gwe eraill, fe fydd y wici hon yn gofyn i chi ateb cwestiwn. Mae hyn yn dasg anodd iawn i raglenni cyfrifiadurol, felly dylai'r rhan fwyaf o olygwyr go iawn gyflawni'r dasg yn ddi-drafferth, yn wahanol i'r mwyafrif o'r rhaglenni sbam ac ymosodwyr automatig eraill.
+
+Cysylltwch â [[Special:ListAdmins|gweinyddwyr y safle]] os ydi'r nodwedd hon yn eich rhwystro rhag ychwanegu golygiadau dilys.
+
+Gwasgwch botwm \"nôl\" eich porwr er mwyn dychwelyd at y dudalen olygu.",
);
/** German (Deutsch)
* @author Geitost
* @author Kghbln
+ * @author Metalhead64
* @author Pill
* @author Umherirrender
*/
$messages['de'] = array(
'questycaptcha-desc' => 'Questy-CAPTCHA-Generator für die Erweiterung „Confirm Edit“',
'questycaptcha-addurl' => 'Deine Bearbeitung enthält neue externe Links.
-Zum Schutz vor automatisiertem Spam, beantworte bitte die untenstehende Frage, um die Seite speichern zu können ([[Special:Captcha/help|weitere Informationen]]):',
- 'questycaptcha-badlogin' => 'Zum Schutz vor einer Kompromittierung deines Benutzerkontos, beantworte bitte die untenstehende Frage, um dich anmelden zu können ([[Special:Captcha/help|weitere Informationen]]):',
- 'questycaptcha-createaccount' => 'Zum Schutz vor einer automatisierten Anlage von Benutzerkonten ist es erforderlich, die folgende Frage zu beantworten ([[Special:Captcha/help|weitere Informationen]]):',
+Zum Schutz des Wikis vor automatisiertem Spam bitten wir dich, die untenstehende Frage zu beantworten, um die Seite speichern zu können ([[Special:Captcha/help|weitere Informationen]]):',
+ 'questycaptcha-badlogin' => 'Zum Schutz des Wikis vor einer Kompromittierung deines Benutzerkontos bitten wir dich, die untenstehende Frage zu beantworten, um dich anmelden zu können ([[Special:Captcha/help|weitere Informationen]]):',
+ 'questycaptcha-createaccount' => 'Zum Schutz des Wikis vor einer automatisierten Anlage von Benutzerkonten bitten wir dich, die folgende Frage zu beantworten ([[Special:Captcha/help|weitere Informationen]]):',
'questycaptcha-create' => 'Bitte beantworte die folgende Frage, um diese Seite erstellen zu können ([[Special:Captcha/help|weitere Informationen]]):',
'questycaptcha-edit' => 'Bitte beantworte die folgende Frage, um diese Seite speichern zu können ([[Special:Captcha/help|weitere Informationen]]):',
- 'questycaptcha-sendemail' => 'Zum Schutz vor automatisiertem Spam bitte die untenstehende Frage beantworten ([[Special:Captcha/help|weitere Informationen]]):',
- 'questycaptchahelp-text' => 'Internetangebote, die — wie dieses Wiki — für Beiträge von praktisch jedem offen sind, werden häufig von Spammern missbraucht, welche versuchen, mithilfe entsprechender Werkzeuge ihre Links automatisch auf vielen Webseiten zu platzieren.
+ 'questycaptcha-sendemail' => 'Zum Schutz des Wikis vor automatisiertem Spam bitten wir dich, die untenstehende Frage zu beantworten ([[Special:Captcha/help|weitere Informationen]]):',
+ 'questycaptchahelp-text' => 'Internetangebote, die – wie dieses Wiki – für Beiträge von praktisch jedem offen sind, werden häufig von Spammern missbraucht, welche versuchen, mithilfe entsprechender Werkzeuge ihre Links automatisch auf vielen Webseiten zu platzieren.
Zwar können derartige Spam-Links wieder entfernt werden, doch stellen sie trotzdem ein erhebliches Ärgernis dar.
In manchen Fällen, meist beim Versuch, neue Weblinks zu einer Seite hinzuzufügen, kann es vorkommen, dass du um die Beantwortung einer Frage gebeten wirst.
Da es kaum möglich ist, dies zu automatisieren, können hierdurch die meisten Spammer aufgehalten werden. Menschlichen Benutzer sollten ihre Bearbeitungen hingegen durchführen können.
-Sollte dich dieses Verfahren beim Vornehmen erwünschter Bearbeitungen behindern, wende dich bitte an einen [[{{MediaWiki:Grouppage-sysop}}|Administrator]], um Unterstützung zu erhalten.
+Sollte dich dieses Verfahren beim Vornehmen erwünschter Bearbeitungen behindern, wende dich bitte an einen [[Special:ListAdmins|Administrator]], um Unterstützung zu erhalten.
Die Schaltfläche „Zurück“ des Browsers führt zurück zum vorherigen Bearbeitungsfenster.',
);
@@ -272,20 +282,20 @@ Die Schaltfläche „Zurück“ des Browsers führt zurück zum vorherigen Bearb
*/
$messages['de-formal'] = array(
'questycaptcha-addurl' => 'Ihre Bearbeitung enthält neue externe Links.
-Zum Schutz vor automatisiertem Spam beantworten Sie bitte die untenstehende Frage ([[Special:Captcha/help|weitere Informationen]]):',
- 'questycaptcha-badlogin' => 'Zum Schutz vor einer Kompromittierung Ihres Benutzerkontos beantworten Sie bitte die folgende Frage ([[Special:Captcha/help|weitere Informationen]]):',
+Zum Schutz vor automatisiertem Spam beantworten Sie bitte die untenstehende Frage ([[Special:Captcha/help|weitere Informationen]]):', # Fuzzy
+ 'questycaptcha-badlogin' => 'Zum Schutz vor einer Kompromittierung Ihres Benutzerkontos beantworten Sie bitte die folgende Frage ([[Special:Captcha/help|weitere Informationen]]):', # Fuzzy
'questycaptcha-create' => 'Bitte beantworten Sie die folgende Frage, um diese Seite erstellen zu können ([[Special:Captcha/help|weitere Informationen]]):',
'questycaptcha-edit' => 'Bitte beantworten Sie die folgende Frage, um diese Seite bearbeiten zu können ([[Special:Captcha/help|weitere Informationen]]):',
- 'questycaptcha-sendemail' => 'Zum Schutz vor automatisiertem Spam bitten wir Sie, die folgende Frage zu beantworten ([[Special:Captcha/help|weitere Informationen]]):',
+ 'questycaptcha-sendemail' => 'Zum Schutz vor automatisiertem Spam bitten wir Sie, die folgende Frage zu beantworten ([[Special:Captcha/help|weitere Informationen]]):', # Fuzzy
'questycaptchahelp-text' => 'Internetangebote, die — wie dieses Wiki — für Beiträge von praktisch jedem offen sind, werden häufig von Spammern missbraucht, welche versuchen, mithilfe entsprechender Werkzeuge ihre Links automatisch auf vielen Webseiten zu platzieren.
Zwar können derartige Spam-Links wieder entfernt werden, doch stellen sie trotzdem ein erhebliches Ärgernis dar.
In manchen Fällen, meist beim Versuch, neue Weblinks zu einer Seite hinzuzufügen, kann es vorkommen, dass Sie um die Beantwortung einer Frage gebeten wirst.
Da es kaum möglich ist, dies zu automatisieren, können hierdurch die meisten Spammer aufgehalten werden. Menschlichen Benutzer sollten ihre Bearbeitungen hingegen durchführen können.
-Sollte Sie dieses Verfahren beim Vornehmen erwünschter Bearbeitungen behindern, wenden Sie sich bitte an einen [[{{MediaWiki:Grouppage-sysop}}|Administrator]], um Unterstützung zu erhalten.
+Sollte Sie dieses Verfahren beim Vornehmen erwünschter Bearbeitungen behindern, wenden Sie sich bitte an einen [[Special:ListAdmins|Administrator]], um Unterstützung zu erhalten.
-Der „Zurück“-Knopf des Browsers führt zurück zum Bearbeitungsfenster.',
+Der „Zurück“-Knopf des Browsers führt zurück zum Bearbeitungsfenster.', # Fuzzy
);
/** Lower Sorbian (dolnoserbski)
@@ -293,28 +303,42 @@ Der „Zurück“-Knopf des Browsers führt zurück zum Bearbeitungsfenster.',
*/
$messages['dsb'] = array(
'questycaptcha-addurl' => 'Twója změna wopśimujo nowe eksterne wótkaze.
-Za šćit pśeśiwo zawtomatizěrowanemu spamoju, wótegroń pšosym na pšašanje, kótarež pokazujo se dołojce ([[Special:Captcha/help|dalšne informacije]]):',
- 'questycaptcha-badlogin' => 'Za šćit pśeśiwo zawtomatizěrowanemu wusnuchlenjeju gronidła, wótegroń pšosym na pšašanje, kótarež pokazujo se dołojce ([[Special:Captcha/help|dalšne informacije]]):',
- 'questycaptcha-createaccount' => 'Za šćit pśeśiwo zawtomatizěrowanemu napóranjeju kontow, wótegroń pšosym na pšašanje, kótarež pokazujo se dołojce ([[Special:Captcha/help|dalšne informacije]]):',
+Za šćit pśeśiwo zawtomatizěrowanemu spamoju, wótegroń pšosym na pšašanje, kótarež pokazujo se dołojce ([[Special:Captcha/help|dalšne informacije]]):', # Fuzzy
+ 'questycaptcha-badlogin' => 'Za šćit pśeśiwo zawtomatizěrowanemu wusnuchlenjeju gronidła, wótegroń pšosym na pšašanje, kótarež pokazujo se dołojce ([[Special:Captcha/help|dalšne informacije]]):', # Fuzzy
+ 'questycaptcha-createaccount' => 'Za šćit pśeśiwo zawtomatizěrowanemu napóranjeju kontow, wótegroń pšosym na pšašanje, kótarež pokazujo se dołojce ([[Special:Captcha/help|dalšne informacije]]):', # Fuzzy
'questycaptcha-create' => 'Aby napórał bok, wótegroń pšosym na pšašanje, kótarež pokazujo se dołojce ([[Special:Captcha/help|dalšne informacije]]):',
'questycaptcha-edit' => 'Aby wobźěłał toś ten bok, wótegroń pšosym na pšašanje, kótarež pokazujo se dołojce ([[Special:Captcha/help|dalšne informacije]]):',
- 'questycaptcha-sendemail' => 'Za šćit pśeśiwo awtomatiskemu spamowanjeju, wótegroń pšosym pšašanje, kótarež pokazujo se dołojce ([[Special:Captcha/help|dalšne informacije]]):',
+ 'questycaptcha-sendemail' => 'Za šćit pśeśiwo awtomatiskemu spamowanjeju, wótegroń pšosym pšašanje, kótarež pokazujo se dołojce ([[Special:Captcha/help|dalšne informacije]]):', # Fuzzy
'questycaptchahelp-text' => 'Websedła, kótarež akceptěruju zjawne pśinoski, ako toś ten wiki, znjewužywaju se cesto wót spamowarjow, kótarež wužywaju zawtomatizěrowane rědy, aby pśidali swóje wótkaze na wjele sedłow. Lěcrownož toś te spamowe wótkaze daju se wótpóraś, su wóne bejna pógóršota.
Wótergi, wósebnje, gaž se nowe wótkaze pśidawaju bokoju, jo móžno, až se śi wiki něco pšaša.
Dokulaž to jo nadawk, kótaryž dajo se śěžko awtomatizěrowaś, dowólujo to napšawdnym luźam jich pśinoski wótpósłaś, nejwěcej spamowarjow a robotowe ataki pak se zaźaržyju.
-Staj se pšosym z [[{{MediaWiki:Grouppage-sysop}}|administratorami sedła]] z pšosbu wó pomoc do zwiska, jolic to śi njewócakane zawobarujo słanje legitimnych pśinoskow.
+Staj se pšosym z [[Special:ListAdmins|administratorami sedła]] z pšosbu wó pomoc do zwiska, jolic to śi njewócakane zawobarujo słanje legitimnych pśinoskow.
Klikni na tłocašk "Slědk" we swójom wobglědowaku, aby wróśił se k wobźěłowańskemu woknoju.',
);
/** Greek (Ελληνικά)
* @author Omnipaedista
+ * @author Protnet
*/
$messages['el'] = array(
- 'questycaptcha-addurl' => 'Η επεξεÏγασία σας πεÏιέχει νέους εξωτεÏικοÏÏ‚ συνδέσμους.
-Για να μας βοηθήσετε στην Ï€Ïοστασία κατά των αυτοματοποιημένων σπαμ, παÏακαλώ απαντήστε στην παÏακάτω εÏώτηση ([[Special:Captcha/help|πεÏισσότεÏες πληÏοφοÏίες]]):',
+ 'questycaptcha-desc' => 'ΓεννήτÏια Questy CAPTCHA για το Confirm Edit',
+ 'questycaptcha-addurl' => 'Η επεξεÏγασία σας πεÏιλαμβάνει νέους εξωτεÏικοÏÏ‚ συνδέσμους.
+Για την Ï€Ïοστασία του wiki ενάντια σε αυτοματοποιημένη επεξεÏγασία spam, σας παÏακαλοÏμε να απαντήσετε στην παÏακάτω εÏώτηση ([[Special:Captcha/help|πεÏισσότεÏες πληÏοφοÏίες]]):',
+ 'questycaptcha-badlogin' => 'Για την Ï€Ïοστασία του wiki ενάντια σε αυτοματοποιημένο σπάσιμο κωδικών, σας παÏακαλοÏμε να απαντήσετε στην παÏακάτω εÏώτηση ([[Special:Captcha/help|πεÏισσότεÏες πληÏοφοÏίες]]):',
+ 'questycaptcha-createaccount' => 'Για την Ï€Ïοστασία του wiki ενάντια σε αυτοματοποιημένη δημιουÏγία λογαÏιασμών, σας παÏακαλοÏμε να απαντήσετε στην παÏακάτω εÏώτηση ([[Special:Captcha/help|πεÏισσότεÏες πληÏοφοÏίες]]):',
+ 'questycaptcha-create' => 'Για να δημιουÏγήσετε τη σελίδα, σας παÏακαλοÏμε να απαντήσετε στην παÏακάτω εÏώτηση ([[Special:Captcha/help|πεÏισσότεÏες πληÏοφοÏίες]]):',
+ 'questycaptcha-edit' => 'Για να επεξεÏγαστείτε αυτή τη σελίδα, σας παÏακαλοÏμε να απαντήσετε στην παÏακάτω εÏώτηση ([[Special:Captcha/help|πεÏισσότεÏες πληÏοφοÏίες]]):',
+ 'questycaptcha-sendemail' => 'Για την Ï€Ïοστασία του wiki ενάντια σε αυτοματοποιημένο σπαμάÏισμα, σας παÏακαλοÏμε να απαντήσετε στην παÏακάτω εÏώτηση ([[Special:Captcha/help|πεÏισσότεÏες πληÏοφοÏίες]]):',
+ 'questycaptchahelp-text' => 'Οι ιστότοποι που επιτÏέπουν δημόσιες συνεισφοÏές, όπως αυτό το wiki, παÏαβιάζονται συχνά από spammers που χÏησιμοποιοÏν αυτοματοποιημένα εÏγαλεία για να δημοσιεÏουν μαζικά υπεÏσυνδέσμους σε πλήθος ιστοτόπων. Αν και αυτοί οι σÏνδεσμοι spam μποÏοÏν να αφαιÏεθοÏν, είναι μεγάλος μπελάς.
+
+ΜεÏικές φοÏές, ειδικά κατά την Ï€Ïοσθήκη νέων συνδέσμων σε μια σελίδα, το wiki μποÏεί να σας ζητήσει να απαντήσετε σε μια εÏώτηση. Δεδομένου ότι αυτή η εÏγασία είναι δÏσκολο να αυτοματοποιηθεί, θα επιτÏέψει στους πεÏισσότεÏους Ï€ÏαγματικοÏÏ‚ ανθÏώπους να κάνουν τις δημοσιεÏσεις τους, σταματώντας όμως spammers και άλλους Ïομποτικά επιτιθέμενους.
+
+ΠαÏακαλοÏμε επικοινωνήστε με τους [[Special:ListAdmins|διαχειÏιστές του ιστότοπου]] για βοήθεια εάν αυτό για κάποιο λόγο σας αποτÏέπει να εκτελέσετε θεμιτές ενέÏγειες.
+
+Πατήστε το κουμπί «πίσω» στον πεÏιηγητή σας για να επιστÏέψετε στον επεξεÏγαστή σελίδων.',
);
/** Esperanto (Esperanto)
@@ -322,16 +346,16 @@ $messages['el'] = array(
*/
$messages['eo'] = array(
'questycaptcha-addurl' => 'Via redakto entenas novajn eksterajn ligilojn.
-Por helpi protekti kontraÅ­ aÅ­tomatan spamadon, bonvolu respondu la demandon sube ([[Special:Captcha/help|pli da informo]]):',
- 'questycaptcha-badlogin' => 'Por helpi protekti kontraÅ­ aÅ­tomata divenado de pasvortoj, bonvolu respondu la demandon sube ([[Special:Captcha/help|pli da informo]]):',
- 'questycaptcha-createaccount' => 'Por helpi protekti kontraÅ­ aÅ­tomata konto-kreado, bonvolu respondu la demandon sube ([[Special:Captcha/help|pli da informo]]):',
+Por helpi protekti kontraÅ­ aÅ­tomatan spamadon, bonvolu respondu la demandon sube ([[Special:Captcha/help|pli da informo]]):', # Fuzzy
+ 'questycaptcha-badlogin' => 'Por helpi protekti kontraÅ­ aÅ­tomata divenado de pasvortoj, bonvolu respondu la demandon sube ([[Special:Captcha/help|pli da informo]]):', # Fuzzy
+ 'questycaptcha-createaccount' => 'Por helpi protekti kontraÅ­ aÅ­tomata konto-kreado, bonvolu respondu la demandon sube ([[Special:Captcha/help|pli da informo]]):', # Fuzzy
'questycaptcha-create' => 'Por krei la paÄon, bonvolu respondu la demandon sube ([[Special:Captcha/help|pli da informo]]):',
'questycaptcha-edit' => 'Por redakti ĉi tiun paÄon, bonvolu respondu la demandon sube ([[Special:Captcha/help|pli da informo]]):',
'questycaptchahelp-text' => "Retejoj kiuj akcepti informon de publiko, kiel ĉi tiu vikio, estas ofte misuzitaj de spamistoj kiu uzas aÅ­tomatajn ilojn por afiÅi ligilojn al multaj retejoj. Kvankam ĉi tiu spam-ligiloj estas forigeblaj, ili estas granda Äeno.
Iufoje, ja kiam aldonante novajn retligilojn al paÄo, la vikio eble petos al vi respondi demandon. Tial ĉi tiu tasko estas malfacila por fari aÅ­tomate, ebligos al realaj homoj fari aldonaĵojn, kaj malebligos spamistojn kaj aliajn robotajn atakilojn.
-Bonvolu kontakti la [[{{MediaWiki:Grouppage-sysop}}|administrantojn de la retejo]] por helpo se ĉi tio malebligas al vi fari bonan aldonon.
+Bonvolu kontakti la [[Special:ListAdmins|administrantojn de la retejo]] por helpo se ĉi tio malebligas al vi fari bonan aldonon.
Klaku la 'reiru' butonon en via retumilo por reiri al la paÄo-redaktilo.",
);
@@ -342,19 +366,19 @@ Klaku la 'reiru' butonon en via retumilo por reiri al la paÄo-redaktilo.",
*/
$messages['es'] = array(
'questycaptcha-addurl' => 'Tu edición incluye nuevos vínculos externos.
-Para ayudar a proteger contra spam automático, por favor responde la pregunta que aparece abajo ([[Special:Captcha/help|más información]]):',
- 'questycaptcha-badlogin' => 'Para ayudar a proteger contra craqueo de contraseña, por favor responde la pregunta que aparece abajo ([[Special:Captcha/help|más información]]):',
- 'questycaptcha-createaccount' => 'Para ayudar a proteger contra la creación automática de cuentas, por favor responde la pregunta que aparece abajo ([[Special:Captcha/help|más información]]):',
+Para ayudar a proteger contra spam automático, por favor responde la pregunta que aparece abajo ([[Special:Captcha/help|más información]]):', # Fuzzy
+ 'questycaptcha-badlogin' => 'Para ayudar a proteger contra craqueo de contraseña, por favor responde la pregunta que aparece abajo ([[Special:Captcha/help|más información]]):', # Fuzzy
+ 'questycaptcha-createaccount' => 'Para ayudar a proteger contra la creación automática de cuentas, por favor responde la pregunta que aparece abajo ([[Special:Captcha/help|más información]]):', # Fuzzy
'questycaptcha-create' => 'Para crear la página, por favor responde la pregunta que aparece abajo ([[Special:Captcha/help|más información]]):',
'questycaptcha-edit' => 'Para editar esta página, por favor responde la pregunta que aparece abajo ([[Special:Captcha/help|más información]]):',
- 'questycaptcha-sendemail' => 'Para protegernos contra el spam automatizado por favor conteste la pregunta que aparece a continuación ([[Special:Captcha/help|más información]]):',
+ 'questycaptcha-sendemail' => 'Para protegernos contra el spam automatizado por favor conteste la pregunta que aparece a continuación ([[Special:Captcha/help|más información]]):', # Fuzzy
'questycaptchahelp-text' => "Sitios Web que aceptan contribuciones del público, como este wiki, son constantemente abusadas por enviadores de spam quienes usan herramientas automáticas para agregar sus enlaces a muchos sitios.
Así estos enlaces spam puedan ser borrados, son una molestia significativa.
A veces, especialmente cuando se agregan nuevos enlaces web a una página, el wiki puede pedirte que respondas a una pregunta.
Ya que esta es una tarea que es difícil de automatizar, eso permitirá que más seres humanos reales hagan sus contribuciones mientras detiene a la mayor parte de enviadores de spam y otros atacantes robóticos.
-Por favor contacta a los [[{{MediaWiki:Grouppage-sysop}}|administradores del sitio]] para asistencia si esto está impidiéndote hacer contribuciones legítimas.
+Por favor contacta a los [[Special:ListAdmins|administradores del sitio]] para asistencia si esto está impidiéndote hacer contribuciones legítimas.
Haz click en el botón 'atrás' en tu navegador para regresar al editor de página.",
);
@@ -364,18 +388,18 @@ Haz click en el botón 'atrás' en tu navegador para regresar al editor de pági
*/
$messages['et'] = array(
'questycaptcha-addurl' => 'Sinu muudatus sisaldab uusi välislinke.
-Palun vasta alljärgnevale küsimusele. Abinõu on kaitseks automaadistatud rämpsmuudatuste eest ([[Special:Captcha/help|lisateave]]):',
- 'questycaptcha-badlogin' => 'Palun vasta alljärgnevale küsimusele. Abinõu on kaitseks automaatsete parooliäraarvajate eest ([[Special:Captcha/help|lisateave]]):',
- 'questycaptcha-createaccount' => 'Palun vasta alljärgnevale küsimusele. Abinõu on kaitseks kontode automaatse loomise eest ([[Special:Captcha/help|lisateave]]):',
+Palun vasta alljärgnevale küsimusele. Abinõu on kaitseks automaadistatud rämpsmuudatuste eest ([[Special:Captcha/help|lisateave]]):', # Fuzzy
+ 'questycaptcha-badlogin' => 'Palun vasta alljärgnevale küsimusele. Abinõu on kaitseks automaatsete parooliäraarvajate eest ([[Special:Captcha/help|lisateave]]):', # Fuzzy
+ 'questycaptcha-createaccount' => 'Palun vasta alljärgnevale küsimusele. Abinõu on kaitseks kontode automaatse loomise eest ([[Special:Captcha/help|lisateave]]):', # Fuzzy
'questycaptcha-create' => 'Lehekülje loomiseks vasta palun alljärgnevale küsimusele ([[Special:Captcha/help|lisateave]]):',
'questycaptcha-edit' => 'Selle lehekülje muutmiseks vasta palun alljärgnevale küsimusele ([[Special:Captcha/help|lisateave]]):',
- 'questycaptcha-sendemail' => 'Palun vasta alljärgnevale küsimusele. Abinõu on kaitseks automaadistatud rämpsmuudatuste eest ([[Special:Captcha/help|lisateave]]):',
+ 'questycaptcha-sendemail' => 'Palun vasta alljärgnevale küsimusele. Abinõu on kaitseks automaadistatud rämpsmuudatuste eest ([[Special:Captcha/help|lisateave]]):', # Fuzzy
'questycaptchahelp-text' => "Võrgukohti, mis lubavad külastajatel sisu muuta, nagu ka see viki, kasutavad sageli rämpsposti levitajad, lisades näiteks lehekülgedele reklaamilinke. Kuigi neid linke saab eemaldada, on nad siiski tülikad.
Kasutajakontot registreerides või mõnele lehele uusi internetiaadresse postitades võidakse paluda sul küsimusele vastata.
Kuna sellist tegevust on raske automaadistada, on see efektiivseks kaitseks rämpspostirobotite vastu ja lubab samas tavakasutajatel rahus muudatusi teha.
-Kui sul tekib raskusi muudatuste tegemisel, võta palun ühendust selle võrgukoha [[{{MediaWiki:Grouppage-sysop}}|administraatoritega]].
+Kui sul tekib raskusi muudatuste tegemisel, võta palun ühendust selle võrgukoha [[Special:ListAdmins|administraatoritega]].
Redigeerimislehele naasmiseks klõpsa võrgulehitseja ''tagasi''-nuppu.",
);
@@ -388,29 +412,53 @@ $messages['eu'] = array(
'questycaptcha-edit' => 'Orrialde hau aldatzeko, behean agertzen den galdera erantzun ezazu mesedez ([[Special:Captcha/help|informazio gehiago]]):',
);
+/** Persian (Ùارسی)
+ * @author Ebraminio
+ * @author Omidh
+ */
+$messages['fa'] = array(
+ 'questycaptcha-addurl' => 'ویرایش شما شامل پیوندهای جدید به بیرون است.
+برای محاÙظت از ویکی در برابر هرزنامه‌های خودکار، ما از شما خواهش می‌کنیم Ú©Ù‡ به سوال زیر پاسخ دهید ([[Special:Captcha/help|اطلاعات بیشتر]]):',
+ 'questycaptcha-badlogin' => 'برای محاÙظت ویکی از شکستن خودکار گذرواژه، ما با احترام از شما خواهش می‌کنیم Ú©Ù‡ به سوال زیر پاسخ دهید ([[Special:Captcha/help|اطلاعات بیشتر]]):',
+ 'questycaptcha-createaccount' => 'برای جلوگیری از ایجاد خودکار حساب کاربری، از شما خواهش می‌کنیم که به سوال زیر پاسخ دهید ([[Special:Captcha/help|اطلاعات بیشتر]]):',
+ 'questycaptcha-create' => 'برای ایجاد صÙحه، لطÙاً به سوالی Ú©Ù‡ در زیر آمده‌است پاسخ دهید ([[Special:Captcha/help|اطلاعات بیشتر]]):',
+ 'questycaptcha-edit' => 'برای ویرایش این صÙحه، لطÙاً به سوال زیر پاسخ دهید ([[Special:Captcha/help|اطلاعات بیشتر]]):',
+ 'questycaptcha-sendemail' => 'برای Ø­Ùاظت از ویکی در برابر هرزنامه‌های خودکار، از شما خواهش می‌کنیم Ú©Ù‡ به سوال زیر پاسخ دهید ([[Special:Captcha/help|اطلاعات بیشتر]]):',
+ 'questycaptchahelp-text' => 'وب‌گاه‌هایی Ú©Ù‡ به عموم اجازهٔ نوشتن مطلب می‌دهند، مانند این ویکی، معمولاً توسط هرزنامه Ùرستندگانی Ú©Ù‡ از ابزارهای خودکار برای اÙزودن پیوندهایشان به وب‌گاه‌های متعدد استÙاده می‌کنند، مورد سوءاستÙاده قرار می‌گیرند.
+اگر چه این پیوندهای هرزنامه را می‌توان حذ٠کرد ولی باعث اعصاب‌خوردی می‌شوند.
+
+گاهی اوقات، بخصوص زمانی Ú©Ù‡ در یک صÙحه پیوند جدیدی اضاÙÙ‡ می‌کنید، ویکی ممکن‌است از شما سوالی بپرسد.
+بدلیل این که انجام اینکار برای ابزارهای خودکار سخت است، اجازه می‌دهد که انسان‌های واقعی در ویکی شرکت کنند در حالی که بیشتر هرزنامه‌ها و حمله‌های خودکار متوق٠می‌شود.
+
+در صورتی Ú©Ù‡ سامانه به صورت پیش‌بینی‌نشده‌ای از مشارکت‌های صحیح شما جلوگیری می‌کند لطÙاً با [[Special:ListAdmins|مدیران وب‌گاه]] تماس بگیرید.
+
+بر روی دکمهٔ «بازگشت» در مرورگر خود Ùشار دهید تا به صÙحهٔ ویرایش برگردید.',
+);
+
/** Finnish (suomi)
* @author Crt
* @author Nike
*/
$messages['fi'] = array(
'questycaptcha-addurl' => 'Muokkauksesi sisältää uusia ulkoisia linkkejä.
-Automatisoitujen roskamuokkausten välttämiseksi vastaa alla olevaan kysymykseen ([[Special:Captcha/help|lisätietoja]]):',
- 'questycaptcha-badlogin' => 'Automatisoidun salasanan murtamisen estämiseksi vastaa alla olevaan kysymykseen ([[Special:Captcha/help|lisätietoja]]):',
- 'questycaptcha-createaccount' => 'Automaattisen käyttäjätunnusten luonnin estämiseksi vastaa alla olevaan kysymykseen ([[Special:Captcha/help|lisätietoja]]):',
+Automatisoitujen roskamuokkausten välttämiseksi vastaa alla olevaan kysymykseen ([[Special:Captcha/help|lisätietoja]]):', # Fuzzy
+ 'questycaptcha-badlogin' => 'Automatisoidun salasanan murtamisen estämiseksi vastaa alla olevaan kysymykseen ([[Special:Captcha/help|lisätietoja]]):', # Fuzzy
+ 'questycaptcha-createaccount' => 'Automaattisen käyttäjätunnusten luonnin estämiseksi vastaa alla olevaan kysymykseen ([[Special:Captcha/help|lisätietoja]]):', # Fuzzy
'questycaptcha-create' => 'Luodaksesi sivun vastaa alla olevaan kysymykseen ([[Special:Captcha/help|lisätietoja]]):',
'questycaptcha-edit' => 'Muokataksesi tätä sivua vastaa alla olevaan kysymykseen ([[Special:Captcha/help|lisätietoja]]):',
- 'questycaptcha-sendemail' => 'Automatisoidun roskapostin lähettämisen estämiseksi vastaa alla olevaan kysymykseen ([[Special:Captcha/help|lisätietoja]]):',
+ 'questycaptcha-sendemail' => 'Automatisoidun roskapostin lähettämisen estämiseksi vastaa alla olevaan kysymykseen ([[Special:Captcha/help|lisätietoja]]):', # Fuzzy
'questycaptchahelp-text' => 'Web-sivustot, jotka hyväksyvät materiaalia yleisöltä, kuten tämä wiki, joutuvat usein automaattisia työkaluja käyttävien "spämmääjien" kohteeksi jotka lisäävät linkkejä eri sivustoille. Vaikka nämä roskalinkit voidaan poistaa, ne ovat merkittävä haittatekijä.
Joskus, erityisesti kun lisäät uusia Web-linkkejä sivulle, wiki saattaa pyytää sinua vastaamaan kysymykseen.
Koska tämä on vaikeasti automatisoitava tehtävä, se antaa useimpien oikeiden henkilöiden osallistua estäen roskamuokkausten ja muiden automaattisten hyökkäysten tekijöitä.
-Ota yhteyttä [[{{MediaWiki:Grouppage-sysop}}|ylläpitäjiin]] saadaksesi avustusta jos tämä odottamattomasti estää sinua tekemästä asiallisia muokkauksia.
+Ota yhteyttä [[Special:ListAdmins|ylläpitäjiin]] saadaksesi avustusta jos tämä odottamattomasti estää sinua tekemästä asiallisia muokkauksia.
Napsauta selaimesi \'takaisin\'-painiketta palataksesi sivumuokkaimeen.',
);
/** French (français)
+ * @author Gomoko
* @author IAlex
* @author Nicolas NALLET
* @author Verdy p
@@ -418,19 +466,19 @@ Napsauta selaimesi \'takaisin\'-painiketta palataksesi sivumuokkaimeen.',
$messages['fr'] = array(
'questycaptcha-desc' => "Générateur de questions ''captcha'' pour confirmer les modifications",
'questycaptcha-addurl' => 'Votre modification inclut de nouveaux liens externes.
-Pour nous aider dans la protection contre le pourriel automatisé, veuillez répondre à la question ci-dessous ([[Special:Captcha/help|plus d’informations]]) :',
- 'questycaptcha-badlogin' => 'Afin de nous aider à prévenir le cassage des mots de passe par des automates, veuillez répondre à la question ci-dessous ([[Special:Captcha/help|plus d’informations]]) :',
- 'questycaptcha-createaccount' => 'Afin de nous aider à lutter contre les créations automatiques de comptes, veuillez répondre à la question qui apparaît ci-dessous ([[Special:Captcha/help|plus d’informations]]) :',
+Pour protéger le wiki contre le pourriel de modification automatisé, nous vous demandons de bien vouloir répondre à la question ci-dessous ([[Special:Captcha/help|plus d’informations]]) :',
+ 'questycaptcha-badlogin' => 'Afin de protéger le wiki contre le cassage automatisé des mots de passe, nous vous demandons de bien vouloir répondre à la question ci-dessous ([[Special:Captcha/help|plus d’informations]]) :',
+ 'questycaptcha-createaccount' => 'Afin de protéger le wiki contre les créations automatiques de comptes, nous vous demandons de bien vouloir répondre à la question qui apparaît ci-dessous ([[Special:Captcha/help|plus d’informations]]) :',
'questycaptcha-create' => 'Pour créer la page, veuillez répondre à la question ci-dessous ([[Special:Captcha/help|plus d’informations]]) :',
'questycaptcha-edit' => 'Pour créer, modifier ou publier cette page, veuillez répondre à la question ci-dessous ([[Special:Captcha/help|plus d’informations]]) :',
- 'questycaptcha-sendemail' => 'Afin de nous aider à prévenir le spam automatique, veuillez répondre à la question ci-dessous ([[Special:Captcha/help|plus d’informations]]) :',
+ 'questycaptcha-sendemail' => 'Afin de protéger le wiki contre le spam automatique, nous vous demandons de bien vouloir répondre à la question ci-dessous ([[Special:Captcha/help|plus d’informations]]) :',
'questycaptchahelp-text' => 'Les sites web qui acceptent des contributions du public, tels que ce wiki, sont souvent victimes de polluposteurs qui utilisent des outils automatisés pour placer de nombreux liens vers leurs sites.
Même si cette pollution peut être effacée, elle n’en reste pas moins irritante.
Parfois, particulièrement lors de l’ajout de nouveaux liens externes dans une page, le wiki peut vous demander de répondre à une question.
Cette tâche étant difficile à accomplir de façon automatisée, cela permet à la plupart des humains de réaliser leurs contributions tout en stoppant la plupart des polluposteurs et autres attaquants robotisés.
-Veuillez contacter [[{{MediaWiki:Grouppage-sysop}}|les administrateurs du site]] si cela vous empêche de façon inattendue de faire des contributions légitimes.
+Veuillez contacter [[Special:ListAdmins|les administrateurs du site]] si cela vous empêche de façon inattendue de faire des contributions légitimes.
Cliquez sur le bouton « Précédent » de votre navigateur pour revenir à la page de modification.',
);
@@ -441,19 +489,19 @@ Cliquez sur le bouton « Précédent » de votre navigateur pour revenir à la p
$messages['gl'] = array(
'questycaptcha-desc' => 'Xerador de preguntas CAPTCHA para Confirm Edit',
'questycaptcha-addurl' => 'A súa edición inclúe novas ligazóns externas.
-Para axudar na protección contra o spam automatizado, conteste a pregunta que aparece a continuación ([[Special:Captcha/help|máis información]]):',
- 'questycaptcha-badlogin' => 'Para axudar na protección contra o descifrado automatizado de contrasinais, conteste a pregunta que aparece a continuación ([[Special:Captcha/help|máis información]]):',
- 'questycaptcha-createaccount' => 'Para axudar na protección contra a creación automática de contas, conteste a pregunta que aparece a continuación ([[Special:Captcha/help|máis información]]):',
+Para protexer o wiki contra o spam automático, conteste a pregunta que aparece a continuación ([[Special:Captcha/help|máis información]]):',
+ 'questycaptcha-badlogin' => 'Para protexer o wiki contra o roubo de contrasinais, conteste a pregunta que aparece a continuación ([[Special:Captcha/help|máis información]]):',
+ 'questycaptcha-createaccount' => 'Para protexer o wiki contra a creación automática de contas, conteste a pregunta que aparece a continuación ([[Special:Captcha/help|máis información]]):',
'questycaptcha-create' => 'Para crear a páxina, conteste a pregunta que aparece a continuación ([[Special:Captcha/help|máis información]]):',
'questycaptcha-edit' => 'Para editar esta páxina, conteste a pregunta que aparece a continuación ([[Special:Captcha/help|máis información]]):',
- 'questycaptcha-sendemail' => 'Para contribuír na protección contra o spam automatizado, responda a pregunta que aparece a continuación ([[Special:Captcha/help|máis información]]):',
+ 'questycaptcha-sendemail' => 'Para protexer o wiki contra o spam automático, conteste a pregunta que aparece a continuación ([[Special:Captcha/help|máis información]]):',
'questycaptchahelp-text' => 'Os sitios web que aceptan publicar as contribucións dos usuarios, coma este wiki, sofren, con frecuencia, o abuso por parte de spammers que usan ferramentas que automatizan a inclusión de lixo en forma de ligazóns publicitarias, nunha chea de páxinas, en pouco tempo.
Mentres as devanditas ligazóns non son eliminadas supoñen unha molestia e unha perda de tempo.
En ocasións, en particular cando engada algunha nova ligazón externa, o wiki pode pedirlle que conteste unha pregunta.
Como esta tarefa é difícil de automatizar, permite distinguir entre persoas e robots e dificulta os ataques automatizados dos spammers.
-Por favor, póñase en contacto cun [[{{MediaWiki:Grouppage-sysop}}|administrador do sitio]] para solicitar axuda se o sistema lle impide rexistrarse para facer contribucións lexítimas.
+Por favor, póñase en contacto cun [[Special:ListAdmins|administrador do sitio]] para solicitar axuda se o sistema lle impide rexistrarse para facer contribucións lexítimas.
Prema no botón "Atrás" do seu navegador para volver á páxina de edición.',
);
@@ -464,19 +512,19 @@ Prema no botón "Atrás" do seu navegador para volver á páxina de edición.',
*/
$messages['gsw'] = array(
'questycaptcha-addurl' => 'In Dynere Bearbeitig het s neji extärni Links.
-As Schutz gege automatischi Spam, beantwort bitte d Frog, wu do unter gnännt wird ([[Special:Captcha/help|meh Informatione]]):',
- 'questycaptcha-badlogin' => 'As Schutz gege ne automatisch Passwort-Knacke, beantwort bitte d Frog, wu do unte gnännt wird ([[Special:Captcha/help|meh Informatione]]):',
- 'questycaptcha-createaccount' => 'As Schutz gege ne automatisch Aalege vu Benutzerkonte, beantwort bitte d Frog, wu do unte gnännt wird ([[Special:Captcha/help|meh Informatione]]):',
+As Schutz gege automatischi Spam, beantwort bitte d Frog, wu do unter gnännt wird ([[Special:Captcha/help|meh Informatione]]):', # Fuzzy
+ 'questycaptcha-badlogin' => 'As Schutz gege ne automatisch Passwort-Knacke, beantwort bitte d Frog, wu do unte gnännt wird ([[Special:Captcha/help|meh Informatione]]):', # Fuzzy
+ 'questycaptcha-createaccount' => 'As Schutz gege ne automatisch Aalege vu Benutzerkonte, beantwort bitte d Frog, wu do unte gnännt wird ([[Special:Captcha/help|meh Informatione]]):', # Fuzzy
'questycaptcha-create' => 'Go d Syte aalege, beantwort bitte d Frog, wu do unte gnännt wird ([[Special:Captcha/help|meh Informatione]]):',
'questycaptcha-edit' => 'Go die Syte bearbeite, beantwort bitte d Frog, wu do unte gnännt wird ([[Special:Captcha/help|meh Informatione]]):',
- 'questycaptcha-sendemail' => 'As Schutz gege e automatischs Spamming, beantwort bitte d Frog, wu do unte gnännt wird ([[Special:Captcha/help|meh Informatione]]):',
+ 'questycaptcha-sendemail' => 'As Schutz gege e automatischs Spamming, beantwort bitte d Frog, wu do unte gnännt wird ([[Special:Captcha/help|meh Informatione]]):', # Fuzzy
'questycaptchahelp-text' => "Websyte, wu jede cha byytrage, wie des Wiki, wäre vylmol missbrucht vu Spammer, wu automatischi Wärchzyg bruche go ihri Gleicher (Links) in meglischt vyli Syte yyfiege.
Au wänn die Spamgleicher chenne wider uusegnuu wäre, sin si einewäg e zimlig Ärgernis.
Ab un zue, vor allem wänn neji Netzgleicher (Weblinks) in e Syte yygfiegt wäre, forderet s Wiki Di villicht uf, e Frog z beantworte.
Wel des e Ufgab isch, wu mer schwär cha automatisiere, isch des e Megligkeit, Spammer un anderi automatischi Attacke z verhindere, derwylscht di meischte mänschlige Benutzer ihri Bearbeitige chenne byytrage.
-Bitte nimm Kontakt uf zue dr [[{{MediaWiki:Grouppage-sysop}}|Website-Administratore]] fir Hilf, wänn des unerwarteterwys verhinderet, ass Du chasch rächtmäßigi Bearbeitige mache.
+Bitte nimm Kontakt uf zue dr [[Special:ListAdmins|Website-Administratore]] fir Hilf, wänn des unerwarteterwys verhinderet, ass Du chasch rächtmäßigi Bearbeitige mache.
Druck dr 'Zruck'-Chnopf in Dyym Browser go zuem Bearbeitigsfänschter zruckgoh.",
);
@@ -487,19 +535,19 @@ Druck dr 'Zruck'-Chnopf in Dyym Browser go zuem Bearbeitigsfänschter zruckgoh."
*/
$messages['he'] = array(
'questycaptcha-addurl' => '×¢×¨×™×›×ª×›× ×›×•×œ×œ×ª ×§×™×©×•×¨×™× ×—×™×¦×•× ×™×™× ×—×“×©×™×.
-×›×”×’× ×” מפני ספ×× ×וטומטי, ×× × ×¢× ×• על הש×לה המופיעה להלן ([[Special:Captcha/help|מידע נוסף]]):',
- 'questycaptcha-badlogin' => '×›×”×’× ×” מפני פריצת סיסמ×ות ×וטומטית, ×× × ×¢× ×• על הש×לה המופיעה להלן ([[Special:Captcha/help|מידע נוסף]]):',
- 'questycaptcha-createaccount' => '×›×”×’× ×” מפני יצירת חשבונות ×וטומטית, ×× × ×¢× ×• על הש×לה המופיעה להלן ([[Special:Captcha/help|מידע נוסף]]):',
+×›×”×’× ×” מפני ספ×× ×וטומטי, ×× × ×¢× ×• על הש×לה המופיעה להלן ([[Special:Captcha/help|מידע נוסף]]):', # Fuzzy
+ 'questycaptcha-badlogin' => '×›×”×’× ×” מפני פריצת סיסמ×ות ×וטומטית, ×× × ×¢× ×• על הש×לה המופיעה להלן ([[Special:Captcha/help|מידע נוסף]]):', # Fuzzy
+ 'questycaptcha-createaccount' => '×›×”×’× ×” מפני יצירת חשבונות ×וטומטית, ×× × ×¢× ×• על הש×לה המופיעה להלן ([[Special:Captcha/help|מידע נוסף]]):', # Fuzzy
'questycaptcha-create' => 'כדי ליצור ×ת הדף, ×× × ×¢× ×• על הש×לה המופיעה להלן ([[Special:Captcha/help|מידע נוסף]]):',
'questycaptcha-edit' => 'כדי לערוך ×ת הדף, ×× × ×¢× ×• על הש×לה המופיעה להלן ([[Special:Captcha/help|מידע נוסף]]):',
- 'questycaptcha-sendemail' => 'כדי לסייע בהגנה מפני הודעות ספ×× ×וטומטיות, × × ×œ×¢× ×•×ª על הש×לה המופיעה להלן ([[Special:Captcha/help|מידע נוסף]]):',
+ 'questycaptcha-sendemail' => 'כדי לסייע בהגנה מפני הודעות ספ×× ×וטומטיות, × × ×œ×¢× ×•×ª על הש×לה המופיעה להלן ([[Special:Captcha/help|מידע נוסף]]):', # Fuzzy
'questycaptchahelp-text' => "×¤×¢×ž×™× ×¨×‘×•×ª ×ž× ×¦×œ×™× ×¡×¤××ž×¨×™× ××ª×¨×™× ×©×ž×§×‘×œ×™× ×ª×•×›×Ÿ מהציבור, כמו ×תר הוויקי ×”×–×”, כדי להוסיף ×ת ×”×§×™×©×•×¨×™× ×©×œ×”× ×œ××ª×¨×™× ×¨×‘×™× ×‘×ינטרנט, ב×מצעות ×›×œ×™× ×וטומטיי×.
××ž× × × ×™×ª×Ÿ להסיר ×ת קישורי הספ×× ×”×œ×œ×•, ×ך ×”× ×ž×”×•×•×™× ×ž×˜×¨×“ משמעותי.
לעתי×, בעיקר כש××ª× ×ž×›× ×™×¡×™× ×§×™×©×•×¨×™ ×ינטרנט ×—×“×©×™× ×œ×ª×•×š עמוד, ×תר הוויקי עשוי לבקש ×ž×›× ×œ×¢× ×•×ª על ש×לה.
כיוון שזו משימה שקשה לבצעה בצורה ×וטומטית, הדבר ×™×פשר לבני־××“× ××ž×™×ª×™×™× ×œ×©×œ×•×— ×ת הדפי×, ×ך יעצור ×ת רוב הספ××ž×¨×™× ×•×”×ž×ª×§×™×¤×™× ×”×¨×•×‘×•×˜×™×™× ×”×חרי×.
-×× × ×¦×¨×• קשר ×¢× [[{{MediaWiki:Grouppage-sysop}}|מפעילי המערכת]] לעזרה ×× ×”×ž×¢×¨×›×ª מונעת ×ž×›× ×‘×ופן בלתי צפוי לבצע עריכות לגיטימיות.
+×× × ×¦×¨×• קשר ×¢× [[Special:ListAdmins|מפעילי המערכת]] לעזרה ×× ×”×ž×¢×¨×›×ª מונעת ×ž×›× ×‘×ופן בלתי צפוי לבצע עריכות לגיטימיות.
לחצו על הכפתור 'Back' בדפדפן ×©×œ×›× ×›×“×™ לחזור לדף העריכה.",
);
@@ -509,18 +557,18 @@ $messages['he'] = array(
*/
$messages['hsb'] = array(
'questycaptcha-addurl' => 'Twoja změna wobsahuje nowe eksterne wotkazy.
-Za škit přećiwo awtomatizowanemu spamej, wotmołw prošu na prašenje, kotrež so deleka jewi ([[Special:Captcha/help|dalše informacije]]):',
- 'questycaptcha-badlogin' => 'Za škit přećiwo awtomatiskemu kradnjenju hesła, wotmołw prošu na prašenje, kotrež so deleka jewi ([[Special:Captcha/help|dalše informacije]]):',
- 'questycaptcha-createaccount' => 'Za škit přećiwo awtomatizowanemu tworjenju kontow, wotmołw prošu na prašenje, kotrež so deleka jewi ([[Special:Captcha/help|dalš informacije]]):',
+Za škit přećiwo awtomatizowanemu spamej, wotmołw prošu na prašenje, kotrež so deleka jewi ([[Special:Captcha/help|dalše informacije]]):', # Fuzzy
+ 'questycaptcha-badlogin' => 'Za škit přećiwo awtomatiskemu kradnjenju hesła, wotmołw prošu na prašenje, kotrež so deleka jewi ([[Special:Captcha/help|dalše informacije]]):', # Fuzzy
+ 'questycaptcha-createaccount' => 'Za škit přećiwo awtomatizowanemu tworjenju kontow, wotmołw prošu na prašenje, kotrež so deleka jewi ([[Special:Captcha/help|dalš informacije]]):', # Fuzzy
'questycaptcha-create' => 'Zo by stronu wutworił, wotmołw prošu na prašenje, kotrež so deleka jewi ([[Special:Captcha/help|dalše informacije]]):',
'questycaptcha-edit' => 'Zo by tutu stronu změnił, wotmołw prošu na prašenje, kotrež so deleka jewi ([[Special:Captcha/help|dalše informacije]]):',
- 'questycaptcha-sendemail' => 'Za škit přećiwo awtomatiskemu spamowanju, wotmołw prošu na prašenje, kotrež so deleka jewi ([[Special:Captcha/help|dalše informacije]]):',
+ 'questycaptcha-sendemail' => 'Za škit přećiwo awtomatiskemu spamowanju, wotmołw prošu na prašenje, kotrež so deleka jewi ([[Special:Captcha/help|dalše informacije]]):', # Fuzzy
'questycaptchahelp-text' => 'WebsydÅ‚a, kotrež pÅ™inoÅ¡ki ze zjawnosće akceptuja, kaž tutón wiki, so Äasto wot spamarjow znjewužiwaja, kotÅ™iž awtomatizowane nastroje wužiwaja, zo bychu swoje wotkazy wjele sydÅ‚am pÅ™idali. HaÄrunjež so tute spamowe wotkazy hodźa wotstronić, su wone njesnadne mjerzanje.
Druhdy, wosebje, hdyž so nowe webwotkazy stronje pÅ™idawaja, wiki so ći nÄ›Äeho praÅ¡a.
Dokelž to je nadawk, kotryž hodźi so jenož ćežko awtomatizować, dowoluje to woprawdźitym wosobam swoje přinoški wotpósłać, mjeztym zo so najwjace spamarjow a druhich nadpadowacych botow blokuje.
-Prošu staj so z [[{{MediaWiki:Grouppage-sysop}}|administratorami sydła]] z prostwu wo pomoc do zwiska, jeli to će haći legitimne přinoški pósłać.
+Prošu staj so z [[Special:ListAdmins|administratorami sydła]] z prostwu wo pomoc do zwiska, jeli to će haći legitimne přinoški pósłać.
Klikń na tłócatko "Wróćo" w swojim wobhladowaku, zo by so k wobdźěłowanskemu woknu wróćił.',
);
@@ -530,18 +578,18 @@ Klikń na tłócatko "Wróćo" w swojim wobhladowaku, zo by so k wobdźěłowans
*/
$messages['hu'] = array(
'questycaptcha-addurl' => 'A szerkesztésed új külső hivatkozásokat tartalmaz.
-Segíts az automatikus spamek elleni védekezésben, kérlek válaszolj az alábbi kérdésre ([[Special:Captcha/help|további információk]]):',
- 'questycaptcha-badlogin' => 'Segíts az automatikus jelszófeltörés kivédésében, kérlek válaszolj az alábbi kérdésre ([[Special:Captcha/help|további információk]]):',
- 'questycaptcha-createaccount' => 'Segíts az automatikus felhasználói fiók készítés kivédésében, kérlek válszolj az alábbi kérdésre ([[Special:Captcha/help|további információk]]):',
+Segíts az automatikus spamek elleni védekezésben, kérlek válaszolj az alábbi kérdésre ([[Special:Captcha/help|további információk]]):', # Fuzzy
+ 'questycaptcha-badlogin' => 'Segíts az automatikus jelszófeltörés kivédésében, kérlek válaszolj az alábbi kérdésre ([[Special:Captcha/help|további információk]]):', # Fuzzy
+ 'questycaptcha-createaccount' => 'Segíts az automatikus felhasználói fiók készítés kivédésében, kérlek válszolj az alábbi kérdésre ([[Special:Captcha/help|további információk]]):', # Fuzzy
'questycaptcha-create' => 'Kérlek válaszolj az alábbi kérdésre a lap létrehozásához ([[Special:Captcha/help|további információk]]):',
'questycaptcha-edit' => 'A lap szerkesztéséhez kérlek válaszolj az alábbi kérdésre ([[Special:Captcha/help|további információk]]):',
- 'questycaptcha-sendemail' => 'Hogy segíts az automatikus spammelés elleni védekezésben, kérünk válaszolj az alábbi kérdésre ([[Special:Captcha/help|segítség]]):',
+ 'questycaptcha-sendemail' => 'Hogy segíts az automatikus spammelés elleni védekezésben, kérünk válaszolj az alábbi kérdésre ([[Special:Captcha/help|segítség]]):', # Fuzzy
'questycaptchahelp-text' => 'Az olyan weboldalakat, amelyekre bárki írhat, gyakran támadják meg spammerek olyan eszközök felhasználásával, amelyek képesek automatikusan, emberi felügyelet nélkül elhelyezni hivatkozásokat sok különböző oldalon.
Néha, különösen ha egy új külső hivatkozást teszel egy szócikkbe, a wiki egy egy kérdés megválaszolására kérhet.
Mivel ezt nehéz automatizálni, a valódi szerkesztőknek lehetőségük lesz szerkeszteni, miközben kiszűri a legtöbb spammert és más automatizált kártevőket.
-Ha ez nem várt módon akadályoz a hasznos közreműködéseidben, segítségért kérlek vedd fel a kapcsolatot [[{{MediaWiki:Grouppage-sysop}}|az oldal adminisztrátoraival]].
+Ha ez nem várt módon akadályoz a hasznos közreműködéseidben, segítségért kérlek vedd fel a kapcsolatot [[Special:ListAdmins|az oldal adminisztrátoraival]].
Használd a böngésződ „vissza†gombját a szöveg szerkesztéséhez való visszalépéshez.',
);
@@ -551,19 +599,19 @@ Használd a böngésződ „vissza†gombját a szöveg szerkesztéséhez való
*/
$messages['ia'] = array(
'questycaptcha-addurl' => 'Tu modification include nove ligamines externe.
-Pro adjutar nos in le protection contra le spam automatisate, per favor responde al question ci infra ([[Special:Captcha/help|plus info]]):',
- 'questycaptcha-badlogin' => 'Pro adjutar nos in le protection contra le deciframento automatisate de contrasignos, per favor responde al question ci infra ([[Special:Captcha/help|plus info]]):',
- 'questycaptcha-createaccount' => 'Pro adjutar nos in le protection contra le creation automatisate de contos, per favor responde al question ci infra ([[Special:Captcha/help|plus info]]):',
+Pro adjutar a proteger le wiki contra le spam automatisate, per favor responde al question que appare infra ([[Special:Captcha/help|plus info]]):',
+ 'questycaptcha-badlogin' => 'Pro adjutar a proteger le wiki contra le furto automatisate de contrasignos, per favor responde al question que appare infra ([[Special:Captcha/help|plus info]]):',
+ 'questycaptcha-createaccount' => 'Pro adjutar a proteger le wiki contra le creation automatisate de contos, per favor responde al question que appare infra ([[Special:Captcha/help|plus info]]):',
'questycaptcha-create' => 'Pro crear le pagina, per favor responde al question ci infra ([[Special:Captcha/help|plus info]]):',
'questycaptcha-edit' => 'Pro modificar iste pagina, per favor responde al question ci infra ([[Special:Captcha/help|plus info]]):',
- 'questycaptcha-sendemail' => 'Pro adjutar nos in le protection contra le spam automatic, per favor responde al question hic infra ([[Special:Captcha/help|plus info]]):',
+ 'questycaptcha-sendemail' => 'Pro adjutar a proteger le wiki contra le spam automatisate, per favor responde al question que appare infra ([[Special:Captcha/help|plus info]]):',
'questycaptchahelp-text' => "Le sitos web que accepta contributiones del publico, como iste wiki, es frequentemente abusate per spammatores que usa instrumentos automatic pro publicar lor ligamines in multe sitos.
Ben que iste ligamines spam pote esser eliminate, illos constitue un considerabile molestia.
Alcun vices, specialmente quando tu adde nove ligamines web a un pagina, le wiki pote demandar te de responder a un question.
Post que isto es un carga difficile de automatisar, isto permittera al major parte del humanos real de facer lor contributiones, durante que le major parte del spammatores e altere attaccatores robotic es stoppate.
-Per favor contacta le [[{{MediaWiki:Grouppage-sysop}}|administratores del sito]] pro assistentia si isto insperatemente te impedi de facer contributiones legitime.
+Per favor contacta le [[Special:ListAdmins|administratores del sito]] pro assistentia si isto insperatemente te impedi de facer contributiones legitime.
Clicca le button 'retro' in tu navigator pro retornar al editor de paginas.",
);
@@ -577,23 +625,23 @@ Clicca le button 'retro' in tu navigator pro retornar al editor de paginas.",
$messages['id'] = array(
'questycaptcha-addurl' => 'Suntingan Anda menambahkan pranala eksternal yang baru.
Untuk melindungi dari spam otomatis, mohon jawab pertanyaan di bawah ini
-([[Special:Captcha/help|info lebih lanjut]]):',
+([[Special:Captcha/help|info lebih lanjut]]):', # Fuzzy
'questycaptcha-badlogin' => 'Untuk melindungi dari pemecah kata sandi otomatis, mohon jawab pertanyaan di bawah ini
-([[Special:Captcha/help|info lebih lanjut]]):',
+([[Special:Captcha/help|info lebih lanjut]]):', # Fuzzy
'questycaptcha-createaccount' => 'Untuk melindungi dari pembuatan akun otomatis, mohon jawab pertanyaan di bawah ini
-([[Special:Captcha/help|info lebih lanjut]]):',
+([[Special:Captcha/help|info lebih lanjut]]):', # Fuzzy
'questycaptcha-create' => 'Untuk membuat halaman, mohon jawab pertanyaan di bawah ini
([[Special:Captcha/help|info lebih lanjut]]):',
'questycaptcha-edit' => 'Untuk menyunting halaman ini, mohon jawab pertanyaan di bawah ini
([[Special:Captcha/help|info lebih lanjut]]):',
- 'questycaptcha-sendemail' => 'Sebagai pelindungan terhadap spam otomatis, silahkan jawab pertanyaan di bawah ini ([[Special:Captcha/help|info lengkap]]):',
+ 'questycaptcha-sendemail' => 'Sebagai pelindungan terhadap spam otomatis, silahkan jawab pertanyaan di bawah ini ([[Special:Captcha/help|info lengkap]]):', # Fuzzy
'questycaptchahelp-text' => "Situs-situs web yang menerima tulisan dari publik, seperti wiki ini, kerapkali disalahgunakan oleh pengguna-pengguna yang tidak bertanggungjawab untuk mengirimkan spam dengan menggunakan program-program otomatis guna membahkan prnala mereka pada berbagai situs web.
Walaupun pranala-pranala spam tersebut dapat dibuang, tetapi tetap saja menimbulkan gangguan yang berarti.
Kadang-kadang, terutama sat menambahkan pranala web baru ke suatu halaman, wiki akan meminta anda menjawab suatu pertanyaan.
Karena ini merupakan suatu pekerjaan yang sulit diotomatisasi, pembatasan ini akan dapat dengan mudah dilalui oleh manusia, sekaligus juga dapat menghentikan hampir semua serangan spam dan robot otomatis lainnya.
-Silakan hubungi [[{{MediaWiki:Grouppage-sysop}}|pengurus]] untuk meminta bantuan jika hal ini menghambat anda untuk mengirimkan suntingan yang layak.
+Silakan hubungi [[Special:ListAdmins|pengurus]] untuk meminta bantuan jika hal ini menghambat anda untuk mengirimkan suntingan yang layak.
Tekan tombol 'back' di penjelajah web Anda untuk kembali ke halaman penyuntingan.",
);
@@ -603,19 +651,19 @@ Tekan tombol 'back' di penjelajah web Anda untuk kembali ke halaman penyuntingan
*/
$messages['ilo'] = array(
'questycaptcha-addurl' => 'Ti inurnos mo ket adda nagyan na a baro a panilpo ti ruar.
-Tapno makasalaknib kadagiti automatiko a spam, pangaasim a sungbatan ti saludsud a nagparang dita baba. ([[Special:Captcha/help|adu pay a pakaammo]]):',
- 'questycaptcha-badlogin' => 'Tapno makasalaknib kadagiti automatiko a pinagsulbar ti kontrasenias, pangaasim a sungbatan ti saludsud a nagparang dita baba. ([[Special:Captcha/help|adu pay a pakaammo]]):',
- 'questycaptcha-createaccount' => 'Tapno makasalaknib kadagiti automatiko a pinagaramid ti pakabilangan, pangaasim a sungbatan ti saludsud a nagparang dita baba. ([[Special:Captcha/help|adu pay a pakaammo]]):',
+Tapno makasalaknib kadagiti automatiko a spam, pangaasim a sungbatan ti saludsud a nagparang dita baba. ([[Special:Captcha/help|adu pay a pakaammo]]):', # Fuzzy
+ 'questycaptcha-badlogin' => 'Tapno makasalaknib kadagiti automatiko a pinagsulbar ti kontrasenias, pangaasim a sungbatan ti saludsud a nagparang dita baba. ([[Special:Captcha/help|adu pay a pakaammo]]):', # Fuzzy
+ 'questycaptcha-createaccount' => 'Tapno makasalaknib kadagiti automatiko a pinagaramid ti pakabilangan, pangaasim a sungbatan ti saludsud a nagparang dita baba. ([[Special:Captcha/help|adu pay a pakaammo]]):', # Fuzzy
'questycaptcha-create' => 'Tapno makaaramid ti panid, pangaasim a sungbatan ti saludsud a nagparang dita baba. ([[Special:Captcha/help|adu pay a pakaammo]]):',
'questycaptcha-edit' => 'Tapno makaurnoy ditoya panid, pangaasim a sungbatan ti saludsud a nagparang dita baba. ([[Special:Captcha/help|adu pay a pakaammo]]):',
- 'questycaptcha-sendemail' => 'Tapno makasalaknib kadagiti automatiko a pinagspam, pangaasim a sungbatan ti saludsud a nagparang dita baba. ([[Special:Captcha/help|adu pay a pakaammo]]):',
+ 'questycaptcha-sendemail' => 'Tapno makasalaknib kadagiti automatiko a pinagspam, pangaasim a sungbatan ti saludsud a nagparang dita baba. ([[Special:Captcha/help|adu pay a pakaammo]]):', # Fuzzy
'questycaptchahelp-text' => "Dagiti sapot a pagsaadan nga agaw-awat kadagiti maipablaak iti publiko, kasla daytoy a wiki, ket kanayon nga inabuso dagiti spammers nga agus-usar ti automatiko a ramramit ti pinagipablaak da kadagiti kukua da a panilpo ti adu a pagsasaadan.
Maikkat met dagitoy a panilpo, mgen makariri da unay.
No sagpaminsan pay, nangruna no agikabil kadagiti baro a panilpo ti sapot iti panid, ti wiki ket agdamag kenka nga agsungbat ti maysa a saludsod.
Yantangay daytoy ket obra a narigat a ma-automatiko, agpalubos kadagiti agpayso a tattao ti agipablaak bayat nga agpasardeng ti kaaduan a spammers ken dagiti robot nga agraraut.
-Pangngaasi a kontaken ti [[{{MediaWiki:Grouppage-sysop}}|administrador ti pagsaadan ]] para iti pannulong no daytoy ket saan a napadpadaanan a pawilan na ti agpayso a pinagbaplaak mo.
+Pangngaasi a kontaken ti [[Special:ListAdmins|administrador ti pagsaadan ]] para iti pannulong no daytoy ket saan a napadpadaanan a pawilan na ti agpayso a pinagbaplaak mo.
Peslen ti 'agsubli' a buton dita pagbasabasam (browser) ti agsubli idiay panid ti pinagurnos.",
);
@@ -626,17 +674,18 @@ Peslen ti 'agsubli' a buton dita pagbasabasam (browser) ti agsubli idiay panid t
* @author Nemo bis
*/
$messages['it'] = array(
- 'questycaptcha-addurl' => "La modifica richiesta aggiunge dei collegamenti esterni alla pagina; come misura precauzionale contro l'inserimento automatico di spam, si prega di rispondere alla domanda che compare di seguito ([[Special:Captcha/help|come funziona?]]):",
- 'questycaptcha-badlogin' => 'Come misura precauzionale contro i tentativi di forzatura automatica della password, si prega di rispondere alla domanda che compare di seguito ([[Special:Captcha/help|come funziona?]]):',
- 'questycaptcha-createaccount' => 'Come misura precauzionale contro i tentativi di creazione automatica degli account, si prega di rispondere alla domanda che compare di seguito ([[Special:Captcha/help|come funziona?]]):',
+ 'questycaptcha-addurl' => 'La modifica richiesta aggiunge dei collegamenti esterni alla pagina.
+Per proteggere il wiki dallo spam automatico, ti chiediamo gentilmente di rispondere alla domanda che compare di seguito ([[Special:Captcha/help|come funziona?]]):',
+ 'questycaptcha-badlogin' => 'Per proteggere il wiki dalla forzatura automatica delle password, ti chiediamo gentilmente di rispondere alla domanda che compare di seguito ([[Special:Captcha/help|come funziona?]]):',
+ 'questycaptcha-createaccount' => 'Per proteggere il wiki dalla creazione automatica di nuovi accessi, ti chiediamo gentilmente di rispondere alla domanda che compare di seguito ([[Special:Captcha/help|come funziona?]]):',
'questycaptcha-create' => 'Per creare la pagina si prega di rispondere alla domanda che compare di seguito ([[Special:Captcha/help|come funziona?]]):',
'questycaptcha-edit' => 'Per modificare questa pagina si prega di rispondere alla domanda che compare di seguito ([[Special:Captcha/help|come funziona?]]):',
- 'questycaptcha-sendemail' => 'Come misura precauzionale nei confronti dei messaggi di spam automatici, si prega di inserire nella casella sottostante le parole che compaiono di seguito ([[Special:Captcha/help|come funziona?]]):',
+ 'questycaptcha-sendemail' => 'Per proteggere il wiki dalle modifiche automatiche che aggiungono spam, ti chiediamo gentilmente di rispondere alla domanda che compare di seguito ([[Special:Captcha/help|come funziona?]]):',
'questycaptchahelp-text' => 'Capita spesso che i siti web che accettano contributi pubblici, come questo wiki, siano presi di mira da persone che usano strumenti automatici per inserire collegamenti pubblicitari verso un gran numero di siti (spam). Per quanto i collegamenti indesiderati si possano rimuovere, si tratta comunque di una seccatura non indifferente.
In alcuni casi, ad esempio quando si tenta di aggiungere nuovi collegamenti web in una pagina, il software wiki può richiedere di rispondere a una domanda. Poiché si tratta di un\'azione difficile da replicare da parte di un computer, questo meccanismo consente a (quasi tutti) gli utenti reali di effettuare i proprio contributi, impedendo l\'accesso alla maggior parte degli spammer e degli altri attacchi automatizzati.
-Se queste procedure impediscono contributi che si ritengono legittimi, si prega di contattare gli [[{{MediaWiki:Grouppage-sysop}}|amministratori del sito]] e chiedere loro assistenza.
+Se queste procedure impediscono contributi che si ritengono legittimi, si prega di contattare gli [[Special:ListAdmins|amministratori del sito]] e chiedere loro assistenza.
Fare clic sul pulsante "indietro" del browser per tornare alla pagina di modifica.',
);
@@ -649,17 +698,17 @@ Fare clic sul pulsante "indietro" del browser per tornare alla pagina di modific
$messages['ja'] = array(
'questycaptcha-desc' => 'Confirm Edit 用ã®è³ªå•å½¢å¼ CAPTCHA ジェãƒãƒ¬ãƒ¼ã‚¿ãƒ¼',
'questycaptcha-addurl' => 'ã‚ãªãŸã¯æ–°ã—ã„外部リンクを追加ã—よã†ã¨ã—ã¦ã„ã¾ã™ã€‚
-自動ã§ã®ã‚¹ãƒ‘ム攻撃を防ããŸã‚ã€ä¸‹è¨˜ã®ç¢ºèªç”¨ã®è³ªå•ã«å›žç­”ã—ã¦ãã ã•ã„ ([[Special:Captcha/help|詳細]]):',
- 'questycaptcha-badlogin' => '自動ã§ã®ãƒ‘スワードクラック攻撃を防ããŸã‚ã€ä¸‹è¨˜ã®ç¢ºèªç”¨ã®è³ªå•ã«å›žç­”ã—ã¦ãã ã•ã„ ([[Special:Captcha/help|詳細]]):',
- 'questycaptcha-createaccount' => 'アカウントã®è‡ªå‹•ç™»éŒ²ã‚’防ããŸã‚ã€ä¸‹è¨˜ã®ç¢ºèªç”¨ã®è³ªå•ã«å›žç­”ã—ã¦ãã ã•ã„ ([[Special:Captcha/help|詳細]]):',
+ウィキã¸ã®è‡ªå‹•ã‚¹ãƒ‘ム攻撃を防ããŸã‚ã€ãŠæ‰‹æ•°ã‚’ãŠã‹ã‘ã—ã¾ã™ãŒä¸‹è¨˜ã®ç¢ºèªç”¨ã®è³ªå•ã«å›žç­”ã—ã¦ãã ã•ã„ ([[Special:Captcha/help|詳細]]):',
+ 'questycaptcha-badlogin' => 'ウィキã¸ã®è‡ªå‹•ãƒ‘スワードクラック攻撃を防ããŸã‚ã€ãŠæ‰‹æ•°ã‚’ãŠã‹ã‘ã—ã¾ã™ãŒä¸‹è¨˜ã®ç¢ºèªç”¨ã®è³ªå•ã«å›žç­”ã—ã¦ãã ã•ã„ ([[Special:Captcha/help|詳細]]):',
+ 'questycaptcha-createaccount' => 'ウィキã§ã®ã‚¢ã‚«ã‚¦ãƒ³ãƒˆè‡ªå‹•ä½œæˆã‚’防ããŸã‚ã€ãŠæ‰‹æ•°ã‚’ãŠã‹ã‘ã—ã¾ã™ãŒä¸‹è¨˜ã®ç¢ºèªç”¨ã®è³ªå•ã«å›žç­”ã—ã¦ãã ã•ã„ ([[Special:Captcha/help|詳細]]):',
'questycaptcha-create' => 'ページを新è¦ä½œæˆã™ã‚‹ã«ã¯ã€ä¸‹è¨˜ã®ç¢ºèªç”¨ã®è³ªå•ã«å›žç­”ã—ã¦ãã ã•ã„ ([[Special:Captcha/help|詳細]]):',
'questycaptcha-edit' => 'ã“ã®ãƒšãƒ¼ã‚¸ã‚’編集ã™ã‚‹ã«ã¯ã€ä¸‹è¨˜ã®ç¢ºèªç”¨ã®è³ªå•ã«å›žç­”ã—ã¦ãã ã•ã„ ([[Special:Captcha/help|詳細]]):',
- 'questycaptcha-sendemail' => '自動ã§ã®ã‚¹ãƒ‘ム攻撃を防ããŸã‚ã€ä¸‹è¨˜ã®ç¢ºèªç”¨ã®è³ªå•ã«å›žç­”ã—ã¦ãã ã•ã„ ([[Special:Captcha/help|詳細]]):',
+ 'questycaptcha-sendemail' => 'ウィキã¸ã®è‡ªå‹•ã‚¹ãƒ‘ム攻撃を防ããŸã‚ã€ãŠæ‰‹æ•°ã‚’ãŠã‹ã‘ã—ã¾ã™ãŒä¸‹è¨˜ã®ç¢ºèªç”¨ã®è³ªå•ã«å›žç­”ã—ã¦ãã ã•ã„ ([[Special:Captcha/help|詳細]]):',
'questycaptchahelp-text' => '一般ã‹ã‚‰ã®æŠ•ç¨¿ã‚’å—ã‘付ã‘ã‚‹ã“ã®ã‚¦ã‚£ã‚­ã®ã‚ˆã†ãªã‚¦ã‚§ãƒ–サイトã¯ã€è‡ªå‹•æŠ•ç¨¿ãƒ„ールを使ã£ã¦å¤šãã®ã‚µã‚¤ãƒˆã«ãƒªãƒ³ã‚¯ã‚’å¼µã£ã¦ã¾ã‚るスパマーã«ã‚ˆã‚Šè’らã•ã‚ŒãŒã¡ã§ã™ã€‚ã“ã®ã‚ˆã†ãªã‚¹ãƒ‘ムã¯é™¤åŽ»ã§ãã‚‹ã‚‚ã®ã®ã€ãã®ä½œæ¥­ã¯å¤§å¤‰ã«é¢å€’ãªã‚‚ã®ã§ã™ã€‚
ã“ã®ãŸã‚ã€ã“ã®ã‚¦ã‚£ã‚­ã§ã¯ã¨ãã©ãã€ç‰¹ã«æ–°ã—ã„外部リンクãŒãƒšãƒ¼ã‚¸ã«è¿½åŠ ã•ã‚ŒãŸã¨ããªã©ã«ã€è³ªå•ã«ç­”ãˆã¦ã„ãŸã ãよã†ãŠé¡˜ã„ã™ã‚‹ã“ã¨ãŒã‚ã‚Šã¾ã™ã€‚ã“ã®ä½œæ¥­ã¯è‡ªå‹•åŒ–ãŒé›£ã—ã„ãŸã‚ã€ã‚¹ãƒ‘マーãªã©ã®ãƒ—ログラムを用ã„ãŸæ”»æ’ƒã‚’ã»ã¼é˜»æ­¢ã—ã¤ã¤ã€å¤§åŠã®ç”Ÿèº«ã®äººé–“ã«ã‚ˆã‚‹æŠ•ç¨¿ã‚’å¯èƒ½ã«ã—ã¾ã™ã€‚
-正当ãªæŠ•ç¨¿ã‚’ã™ã‚‹ã«ã‚ãŸã£ã¦æœ¬æ©Ÿèƒ½ãŒéšœå®³ã¨ãªã£ã¦ã„ã‚‹å ´åˆã€[[{{MediaWiki:Grouppage-sysop}}|サイト管ç†è€…]]ã«é€£çµ¡ã—ã¦å”力を求ã‚ã¦ãã ã•ã„。
+正当ãªæŠ•ç¨¿ã‚’ã™ã‚‹ã«ã‚ãŸã£ã¦æœ¬æ©Ÿèƒ½ãŒéšœå®³ã¨ãªã£ã¦ã„ã‚‹å ´åˆã€[[Special:ListAdmins|サイト管ç†è€…]]ã«é€£çµ¡ã—ã¦å”力を求ã‚ã¦ãã ã•ã„。
ページã®ç·¨é›†ã«æˆ»ã‚‹ã«ã¯ã€ãƒ–ラウザーã®ã€Œæˆ»ã‚‹ã€ãƒœã‚¿ãƒ³ã‚’押ã—ã¦ãã ã•ã„。',
);
@@ -671,19 +720,19 @@ $messages['ja'] = array(
$messages['ko'] = array(
'questycaptcha-desc' => '편집 확ì¸ì— 대한 íƒêµ¬ì ì¸ CAPCHA(캡차) ìƒì„±ê¸°',
'questycaptcha-addurl' => 'íŽ¸ì§‘ì— ìƒˆë¡œìš´ 바깥 ë§í¬ê°€ í¬í•¨ë˜ì–´ 있습니다.
-ìžë™í™”ëœ ìŠ¤íŒ¸ìœ¼ë¡œë¶€í„° 보호하기 위해, ì•„ëž˜ì— ë³´ì´ëŠ” ì§ˆë¬¸ì— ë‹µí•´ì£¼ì„¸ìš” ([[Special:Captcha/help|ìžì„¸í•œ ì •ë³´]]):',
- 'questycaptcha-badlogin' => 'ìžë™í™”ëœ ë¹„ë°€ë²ˆí˜¸ 깨기로부터 보호하기 위해, ì•„ëž˜ì— ë³´ì´ëŠ” ì§ˆë¬¸ì— ë‹µí•´ì£¼ì„¸ìš” ([[Special:Captcha/help|ìžì„¸í•œ ì •ë³´]]):',
- 'questycaptcha-createaccount' => 'ìžë™í™”ëœ ê³„ì • 만들기로부터 보호하기 위해, ì•„ëž˜ì— ë³´ì´ëŠ” ì§ˆë¬¸ì— ë‹µí•´ì£¼ì„¸ìš” ([[Special:Captcha/help|ìžì„¸í•œ ì •ë³´]]):',
+ìžë™í™”ëœ ìŠ¤íŒ¸ìœ¼ë¡œë¶€í„° 보호하기 위해, ì•„ëž˜ì— ë³´ì´ëŠ” ì§ˆë¬¸ì— ë‹µí•´ì£¼ì„¸ìš” ([[Special:Captcha/help|ìžì„¸í•œ ì •ë³´]]):', # Fuzzy
+ 'questycaptcha-badlogin' => 'ìžë™í™”ëœ ë¹„ë°€ë²ˆí˜¸ 깨기로부터 보호하기 위해, ì•„ëž˜ì— ë³´ì´ëŠ” ì§ˆë¬¸ì— ë‹µí•´ì£¼ì„¸ìš” ([[Special:Captcha/help|ìžì„¸í•œ ì •ë³´]]):', # Fuzzy
+ 'questycaptcha-createaccount' => 'ìžë™í™”ëœ ê³„ì • 만들기로부터 보호하기 위해, ì•„ëž˜ì— ë³´ì´ëŠ” ì§ˆë¬¸ì— ë‹µí•´ì£¼ì„¸ìš” ([[Special:Captcha/help|ìžì„¸í•œ ì •ë³´]]):', # Fuzzy
'questycaptcha-create' => '문서를 만드려면 ì•„ëž˜ì— ë³´ì´ëŠ” ì§ˆë¬¸ì— ë‹µí•´ì£¼ì„¸ìš” ([[Special:Captcha/help|ìžì„¸í•œ ì •ë³´]]):',
'questycaptcha-edit' => 'ì´ ë¬¸ì„œë¥¼ 편집하려면 ì•„ëž˜ì— ë³´ì´ëŠ” ì§ˆë¬¸ì— ë‹µí•´ì£¼ì„¸ìš” ([[Special:Captcha/help|ìžì„¸í•œ ì •ë³´]]):',
- 'questycaptcha-sendemail' => 'ìžë™í™”ëœ ìŠ¤íŒ¸ìœ¼ë¡œë¶€í„° 보호하기 위해, ì•„ëž˜ì— ë³´ì´ëŠ” ì§ˆë¬¸ì— ë‹µí•´ì£¼ì„¸ìš” ([[Special:Captcha/help|ìžì„¸í•œ ì •ë³´]]):',
+ 'questycaptcha-sendemail' => 'ìžë™í™”ëœ ìŠ¤íŒ¸ìœ¼ë¡œë¶€í„° 보호하기 위해, ì•„ëž˜ì— ë³´ì´ëŠ” ì§ˆë¬¸ì— ë‹µí•´ì£¼ì„¸ìš” ([[Special:Captcha/help|ìžì„¸í•œ ì •ë³´]]):', # Fuzzy
'questycaptchahelp-text' => 'ì´ ìœ„í‚¤ì™€ ê°™ì´ ì‚¬ëžŒì˜ ê³µê°œì ì¸ 참여가 가능한 웹 사ì´íŠ¸ì—서는 ìžë™ í”„ë¡œê·¸ëž¨ì´ ìŠ¤íŒ¸ì„ ë¿Œë¦¬ëŠ” 경우가 있습니다.
물론 ì´ëŸ¬í•œ ìŠ¤íŒ¸ì€ ì œê±°í•  수는 있지만 번거로운 ìž‘ì—…ì´ ëŠ˜ì–´ë‚©ë‹ˆë‹¤.
ì´ëŸ¬í•œ ìŠ¤íŒ¸ì„ ë°©ì§€í•˜ê¸° 위해서, ì´ ìœ„í‚¤ì˜ ë¬¸ì„œì— ì›¹ 사ì´íŠ¸ 주소를 추가하는 ë“±ì˜ í–‰ë™ì„ í•  경우ì—는 ì§ˆë¬¸ì— ë‹µí•´ë‹¬ë¼ê³  하는 경우가 있습니다.
ì´ ê¸€ìž ìž…ë ¥ ìž‘ì—…ì€ ìžë™ í”„ë¡œê·¸ëž¨ì„ ë§Œë“¤ê¸°ê°€ 힘들기 ë•Œë¬¸ì— ìŠ¤íŒ¸ì„ íš¨ê³¼ì ìœ¼ë¡œ 막으면서 ì¼ë°˜ 사용ìžë¥¼ 막지 ì•Šì„ ìˆ˜ 있습니다.
-예기치않게 정당한 í–‰ë™ì„ 하지 못하ë„ë¡ ë§‰ëŠ”ë‹¤ë©´ [[{{MediaWiki:Grouppage-sysop}}|사ì´íŠ¸ 관리ìž]]ì—게 ë„ì›€ì„ ìš”ì²­í•´ 주세요.
+예기치않게 정당한 í–‰ë™ì„ 하지 못하ë„ë¡ ë§‰ëŠ”ë‹¤ë©´ [[Special:ListAdmins|사ì´íŠ¸ 관리ìž]]ì—게 ë„ì›€ì„ ìš”ì²­í•´ 주세요.
ì´ì „ 화면으로 ëŒì•„가려면 웹 브ë¼ìš°ì €ì˜ "뒤로" ë²„íŠ¼ì„ í´ë¦­í•˜ì„¸ìš”.',
);
@@ -695,13 +744,13 @@ $messages['ksh'] = array(
'questycaptcha-addurl' => 'Ding Änderung säz neu Lengks noh ußerhallef vum Wiki.
Öm uns jäje der automattesch dobeijedonn <i lang="en">SPAM</i> ze hellefe,
bes esu joot un donn di Frooch be_anntwoode, di heh dronger shteiht.
-([[Special:Captcha/help|Mieh Enfommazjuhne]])',
+([[Special:Captcha/help|Mieh Enfommazjuhne]])', # Fuzzy
'questycaptcha-badlogin' => 'Öm uns jäje et automattesche Paßwootknacke ze hellefe,
bes esu joot un donn di Frooch be_anntwoode, di heh dronge shteiht.
-([[Special:Captcha/help|Mieh Enfommazjuhne]])',
+([[Special:Captcha/help|Mieh Enfommazjuhne]])', # Fuzzy
'questycaptcha-createaccount' => 'Öm uns jäje et maßesch automattesch neu Metmaacher Aanlääje ze hellefe,
bes esu joot un donn di Frooch be_anntwoode, di heh dronger shteiht.
-([[Special:Captcha/help|Mieh Enfommazjuhne]])',
+([[Special:Captcha/help|Mieh Enfommazjuhne]])', # Fuzzy
'questycaptcha-create' => 'Öm di Sigg aanzelääje,
bes esu joot, donn di Frooch be_anntwoode, di heh dronge shteiht.
([[Special:Captcha/help|Mieh Enfommazjuhne]])',
@@ -710,7 +759,7 @@ bes esu joot, donn di Frooch be_anntwoode, di heh dronge shteiht.
([[Special:Captcha/help|Mieh Enfommazjuhne]])',
'questycaptcha-sendemail' => 'Öm et Wiki jääje automattesch enjedraare SPAM ze schötze,
bes esu joot, donn di Frooch be_anntwoode, di heh dronger shteiht.
-([[Special:Captcha/help|Mieh Enfommazjuhne]])',
+([[Special:Captcha/help|Mieh Enfommazjuhne]])', # Fuzzy
'questycaptchahelp-text' => 'Websigge, di Beijdrääsch vun de Öffentleschkeit aannämme, wi dat Wiki heh,
wääde öff vun <i lang="en">SPAM</i>mer heimjesöhk. Di bruche Projramme
för ier Lengks udder annder Jedrieße automattesch en dousende Wikis erin
@@ -722,7 +771,7 @@ Wiki Desch bedde, en Frooch ze be_antwoode. Nohdämm dat schwiiresch mem
automattesche Projramm henzekrijje es, löht et de Minsche ier Beidrääsch
maache, deiht ävver de miehßte <i lang="en">SPAM</i>mer un ander Robots affhallde.
-Donn Desh aan de [[{{MediaWiki:Grouppage-sysop}}|Köbeße vum Wiki]] wende,
+Donn Desh aan de [[Special:ListAdmins|Köbeße vum Wiki]] wende,
wann et Der trozdämm en de Fööß kütt, un De Dinge aanshtändejje Beijdraach
nit en et Wiki kriß!
@@ -733,22 +782,23 @@ di Sigg zom Ändere, woh De jraad wohß.',
/** Luxembourgish (Lëtzebuergesch)
* @author Les Meloures
* @author Robby
+ * @author Soued031
*/
$messages['lb'] = array(
'questycaptcha-addurl' => "An Ärer Ännerung sinn nei extern Linken.
-Fir d'Protectioun géint automatesche Spam ze vergréisseren, beäntwert w.e.g. déi Fro hei ënnendrënner ([[Special:Captcha/help|méi Informatiounen]]):",
- 'questycaptcha-badlogin' => "Fir d'Protectioun géint d'automatiséiert Knacke vu Passwierder ze vergréisseren, beäntwert w.e.g. déi Fro hei ënnedrënner ([[Special:Captcha/help|méi Informatiounen]]):",
- 'questycaptcha-createaccount' => "Fir d'Protectioun géint d'automatiséiert Uleeë vu Benotzerkonten ze vergréisseren, beäntwert w.e.g. déi Fro hei ënnendrënner ([[Special:Captcha/help|méi Informatiounen]]):",
+Fir d'Wiki géint automatesche Spam-Ännerungen ze schützen, froe mir Iech d'Fro hei ënnendrënner ze beäntweren ([[Special:Captcha/help|méi Informatiounen]]):",
+ 'questycaptcha-badlogin' => "Fir dës Wiki géint d'automatiséiert Knacke vu Passwierder ze schütze, froe mir Iech d'Fro hei ënnendrënner ze beäntweren ([[Special:Captcha/help|méi Informatiounen]]):",
+ 'questycaptcha-createaccount' => "Fir d'Wiki géint d'automatiséiert Uleeë vu Benotzerkonten ze schützen, froe mir Iech d'Fro hei ënnendrënner ze beäntweren ([[Special:Captcha/help|méi Informatiounen]]):",
'questycaptcha-create' => "Fir d'Säit unzeleeën, beäntwert w.e.g. déi Fro hei ënnedrënner ([[Special:Captcha/help|méi Informatiounen]]):",
'questycaptcha-edit' => "Fir dës Säit z'änneren, beäntwert w.e.g. déi Fro hei ënnedrënner ([[Special:Captcha/help|méi Informatiounen]]):",
- 'questycaptcha-sendemail' => 'Fir ze hëllefe eis géint automatiséierte Spam ze schütze, beäntwert w.e.g. déi Fro hei ënnendrënner ([[Special:Captcha/help|méi Informatiounen]]):',
+ 'questycaptcha-sendemail' => 'Fir ze hëllefe dës Wiki géint automatiséierte Spam ze schütze, beäntwert w.e.g. déi Fro hei ënnendrënner ([[Special:Captcha/help|méi Informatiounen]]):',
'questycaptchahelp-text' => "Websäiten, déi et jiddwerengem erlaben Ännerunge virzehuelen, sou wéi dës Wiki, ginn dacks vu sougenannte Spammer mëssbraucht, déi automatiséiert hir Linken op vill Internetsäite setzen.
-Esou Spam-Linke kënne wuel geläscht ginn, mä si sinn trotzdem eng grouss Plo.
+Sou Spam-Linke kënne wuel geläscht ginn, mä si sinn trotzdem eng grouss Plo.
-Heiandsdo, besonnesch wann nei Internet-Linken op eng Säit derbäigesat ginn, freet dës Wiki Iech eng Fro ze beäntwerten.
-Well dëst eng Aufgab ass déi schwéier z'automatiséieren ass, erlaabt dëst datt Mënschen hir Ännerunge kënnen agi wärend déi meescht Spammer an aner Roboter-Attacke kënnen ofgewiert ginn.
+Heiansdo, besonnesch wann nei Internet-Linken op eng Säit derbäigesat ginn, freet dës Wiki Iech eng Fro ze beäntwerten.
+Well dëst eng Aufgab ass déi schwéier z'automatiséieren ass, erlaabt dëst datt Mënschen hir Ännerunge kënnen agi während déi meescht Spammer an aner Roboter-Attacke kënnen ofgewiert ginn.
-Kontaktéiert w.e.g. d'[[{{MediaWiki:Grouppage-sysop}}|Administrateure vun dësem Site]] fir Hëllef wann dëst Iech onerwaarter Weis vu legitimen Editen ofhält.
+Kontaktéiert w.e.g. d'[[Special:ListAdmins|Administrateure vun dësem Site]] fir Hëllef wann dëst Iech onerwaarter Weis vu legitimen Editen ofhält.
Dréckt op den 'Zréck' Knäppche vun ärem Browser fir an d'Beaarbechtungsfënster zréckzekommen.",
);
@@ -773,19 +823,19 @@ Takan tombol "back" di paramban web Sanak untuak baliak ka laman panyuntiangan.'
$messages['mk'] = array(
'questycaptcha-desc' => 'Создавач CAPTCHA Ñо текнувало за потврда на уредувања',
'questycaptcha-addurl' => 'Вашето уредување Ñодржи нови надворешни врÑки.
-За да ни помогнете да Ñе заштитиме од автоматизиран Ñпам, одговорете на прашањето подолу ([[Special:Captcha/help|повеќе инфо]]):',
- 'questycaptcha-badlogin' => 'За да ни помогнете да Ñе заштитиме од автоматизирано пробивање на лозинки, одговорете на прашањето подолу ([[Special:Captcha/help|повеќе инфо]]):',
- 'questycaptcha-createaccount' => 'За да ни помогнете да Ñе заштитиме од автоматизирано Ñоздавање на Ñметки, одговорете на прашањето подолу ([[Special:Captcha/help|повеќе инфо]]):',
+За го заштитиме викито од автоматизиран Ñпам, би ве замолиле да одговорите на прашањето подолу ([[Special:Captcha/help|повеќе инфо]]):',
+ 'questycaptcha-badlogin' => 'За да ни помогнете да Ñе заштитиме од автоматизирано пробивање на лозинки, би ве замолиле да одговорите на прашањето подолу ([[Special:Captcha/help|повеќе инфо]]):',
+ 'questycaptcha-createaccount' => 'За да ни помогнете да Ñе заштитиме од автоматизирано Ñоздавање на Ñметки, би ве замолиле да одговорите на прашањето подолу ([[Special:Captcha/help|повеќе инфо]]):',
'questycaptcha-create' => 'За да ја Ñоздадете Ñтраницата, одговорете на прашањето подолу ([[Special:Captcha/help|повеќе инфо]]):',
'questycaptcha-edit' => 'За да ја уредите Ñтраницава, одговорете на прашањето подолу ([[Special:Captcha/help|повеќе инфо]]):',
- 'questycaptcha-sendemail' => 'За да Ñе заштитиме од автоматизирано Ñпамирање, одговорете на долупоÑтавеното прашање ([[Special:Captcha/help|повеќе информации]]):',
+ 'questycaptcha-sendemail' => 'За да Ñе заштитиме од автоматизирано Ñпамирање, би ве замолиле да одговорите на прашањето подолу ([[Special:Captcha/help|повеќе информации]]):',
'questycaptchahelp-text' => 'Мрежните меÑта кои прифаќаат учеÑтво на јавноÑта, како ова вики, чеÑтопати Ñтрадаат од Ñпамери кои кориÑтат автоматизирани алатки за да ги додаваат нивните врÑки на голем број мрежни меÑта.
Иако врÑките на Ñпамерот може да Ñе отÑтранат, тие значително ја пореметуваат нашата работа.
Понекогаш, оÑобено кога додава нови врÑки на Ñтраница, викито може да ви побара да одговорите на прашање.
Бидејќи ова е задача која е тешко да Ñе автоматизира, им овозможува виÑтинÑките кориÑници да придонеÑуваат, а им попречува на Ñпамерите и другите роботÑки напаѓачи.
-Контактирајте ги [[{{MediaWiki:Grouppage-sysop}}|админиÑтраторите на Ñтраната]] за помош доколку ова неочекувано ве Ñпречува во правењето на иÑкрени придонеÑи.
+Контактирајте ги [[Special:ListAdmins|админиÑтраторите на Ñтраната]] за помош доколку ова неочекувано ве Ñпречува во правењето на иÑкрени придонеÑи.
Кликнете на копчето „назад“ во вашиот прелиÑувач за да Ñе вратите на уредувањето на Ñтраницата.',
);
@@ -795,7 +845,7 @@ $messages['mk'] = array(
*/
$messages['ml'] = array(
'questycaptcha-addurl' => 'താങàµà´•à´³àµà´Ÿàµ† തിരàµà´¤àµà´¤à´²àµà´•à´³à´¿àµ½ à´ªàµà´±à´‚ à´•à´£àµà´£à´¿à´•àµ¾ ഉൾപàµà´ªàµ†à´Ÿàµà´Ÿà´¿à´°à´¿à´•àµà´•àµà´¨àµà´¨àµ.
-യാനàµà´¤àµà´°à´¿à´• à´¸àµà´ªà´¾à´®à´¿à´¨àµ†à´¤à´¿à´°àµ†à´¯àµà´³àµà´³ സം‌രകàµà´·à´£à´¤àµà´¤à´¿à´¨àµà´±àµ† ഭാഗമായി, താഴെ കാണàµà´¨àµà´¨ വാകàµà´•àµà´•àµ¾ പെടàµà´Ÿà´¿à´¯à´¿àµ½ ടൈപàµà´ªàµ ചെയàµà´¯àµà´• ([[Special:Captcha/help|കൂടàµà´¤àµ½ വിവരങàµà´™àµ¾]]):',
+യാനàµà´¤àµà´°à´¿à´• à´¸àµà´ªà´¾à´®à´¿à´¨àµ†à´¤à´¿à´°àµ†à´¯àµà´³àµà´³ സം‌രകàµà´·à´£à´¤àµà´¤à´¿à´¨àµà´±àµ† ഭാഗമായി, താഴെ കാണàµà´¨àµà´¨ വാകàµà´•àµà´•àµ¾ പെടàµà´Ÿà´¿à´¯à´¿àµ½ ടൈപàµà´ªàµ ചെയàµà´¯àµà´• ([[Special:Captcha/help|കൂടàµà´¤àµ½ വിവരങàµà´™àµ¾]]):', # Fuzzy
);
/** Malay (Bahasa Melayu)
@@ -803,19 +853,19 @@ $messages['ml'] = array(
*/
$messages['ms'] = array(
'questycaptcha-addurl' => 'Suntingan anda mengandungi pautan luar baru.
-Untuk membanteras kegiatan spam automatik, anda diminta menjawab soalan yang berikut ([[Special:Captcha/help|maklumat lanjut]]):',
- 'questycaptcha-badlogin' => 'Untuk membanteras kegiatan meneka kata laluan secara automatik, anda diminta menjawab soalan berikut ([[Special:Captcha/help|maklumat lanjut]]):',
- 'questycaptcha-createaccount' => 'Untuk membanteras kegiatan pembukaan akaun secara automatik, anda diminta menjawab soalan berikut ([[Special:Captcha/help|maklumat lanjut]]):',
+Untuk membanteras kegiatan spam automatik, anda diminta menjawab soalan yang berikut ([[Special:Captcha/help|maklumat lanjut]]):', # Fuzzy
+ 'questycaptcha-badlogin' => 'Untuk membanteras kegiatan meneka kata laluan secara automatik, anda diminta menjawab soalan berikut ([[Special:Captcha/help|maklumat lanjut]]):', # Fuzzy
+ 'questycaptcha-createaccount' => 'Untuk membanteras kegiatan pembukaan akaun secara automatik, anda diminta menjawab soalan berikut ([[Special:Captcha/help|maklumat lanjut]]):', # Fuzzy
'questycaptcha-create' => 'Untuk mencipta laman ini, anda diminta menjawab soalan berikut ([[Special:Captcha/help|maklumat lanjut]]):',
'questycaptcha-edit' => 'Untuk menyunting laman ini, anda diminta menjawab soalan berikut ([[Special:Captcha/help|maklumat lanjut]]):',
- 'questycaptcha-sendemail' => 'Untuk membanteras kegiatan spam secara automatik, anda diminta menjawab soalan berikut ([[Special:Captcha/help|maklumat lanjut]]):',
+ 'questycaptcha-sendemail' => 'Untuk membanteras kegiatan spam secara automatik, anda diminta menjawab soalan berikut ([[Special:Captcha/help|maklumat lanjut]]):', # Fuzzy
'questycaptchahelp-text' => "Tapak-tapak web yang menerima sumbangan awam, misalnya wiki ini, sering disalah guna oleh pembuat spam yang menggunakan peralatan berautomasi untuk membubuh pautan mereka di banyak tapak.
Walaupun pautan-pautan spam ini boleh dipadamkan, namun ia amat menyusahkan.
Adakalanya, terutamanya apabila membubuh pautan web baru pada sesuatu laman, wiki ini mungkin akan menanya anda satu soalan.
Memandangkan ini ialah tugas yang sukar diautomasi, ia akan membolehkan kebanyakan manusia sebenar untuk membuat sumbangan, sambil menghalang spam dan serangan robotik yang seumpamanya.
-Sila hubungi [[{{MediaWiki:Grouppage-sysop}}|pentadbir laman]] untuk mendapatkan bantuan jika ia menghalang anda daripada membuat sumbangan yang munasabah tanpa dijangka.
+Sila hubungi [[Special:ListAdmins|pentadbir laman]] untuk mendapatkan bantuan jika ia menghalang anda daripada membuat sumbangan yang munasabah tanpa dijangka.
Klik butang 'â†' untuk kembali ke editor laman.",
);
@@ -825,54 +875,55 @@ Klik butang 'â†' untuk kembali ke editor laman.",
*/
$messages['mt'] = array(
'questycaptcha-addurl' => 'Il-modifika tiegħek tinkludi ħoloq esterni ġodda.
-Sabiex tipproteġi kontra spam awtomatiku, jekk jogħġbok irrispondi l-mistoqsija li tidher hawn taħt ([[Special:Captcha/help|aktar informazzjoni]]):',
- 'questycaptcha-badlogin' => 'Bħala prekawzjoni kontra l-infurzar awtomatiku tal-password, jekk jogħġbok irrispondi l-mistoqsija li tidher hawn taħt ([[Special:Captcha/help|aktar informazzjoni]]):',
- 'questycaptcha-createaccount' => "Bħala miżura ta' prekawzjoni kontra l-ħolqien awtomatiku tal-kontijiet, jekk jogħġbok irrispondi l-mistoqsija li tidher hawn taħt ([[Special:Captcha/help|aktar informazzjoni]]):",
+Sabiex tipproteġi kontra spam awtomatiku, jekk jogħġbok irrispondi l-mistoqsija li tidher hawn taħt ([[Special:Captcha/help|aktar informazzjoni]]):', # Fuzzy
+ 'questycaptcha-badlogin' => 'Bħala prekawzjoni kontra l-infurzar awtomatiku tal-password, jekk jogħġbok irrispondi l-mistoqsija li tidher hawn taħt ([[Special:Captcha/help|aktar informazzjoni]]):', # Fuzzy
+ 'questycaptcha-createaccount' => "Bħala miżura ta' prekawzjoni kontra l-ħolqien awtomatiku tal-kontijiet, jekk jogħġbok irrispondi l-mistoqsija li tidher hawn taħt ([[Special:Captcha/help|aktar informazzjoni]]):", # Fuzzy
'questycaptcha-create' => 'Sabiex toħloq din il-paġna, jekk jogħġbok irrispondi l-mistoqsija li tidher hawn taħt ([[Special:Captcha/help|aktar informazzjoni]]):',
'questycaptcha-edit' => 'Sabiex timmodifika din il-paġna, jekk jogħġbok irrispondi l-mistoqsija li tidher hawn taħt ([[Special:Captcha/help|aktar informazzjoni]]):',
- 'questycaptcha-sendemail' => 'Bħala prekawzjoni kontra l-ispam awtomatiku, jekk jogħġbok irrispondi l-mistoqsija li tidher hawn taħt ([[Special:Captcha/help|aktar informazzjoni]]):',
+ 'questycaptcha-sendemail' => 'Bħala prekawzjoni kontra l-ispam awtomatiku, jekk jogħġbok irrispondi l-mistoqsija li tidher hawn taħt ([[Special:Captcha/help|aktar informazzjoni]]):', # Fuzzy
'questycaptchahelp-text' => "Siti elettroniċi li jaċċettaw kontribuzzjonijiet mill-pubbliku, bħal din il-wiki, huma ħafna drabi abbużati minn ''spammers'' li jużaw għodda awtomatiċi sabiex idaħħlu ħoloq lejn ħafna siti.
Waqt li dawn il-ħoloq ta' spam jistgħu jitneħħew, dan huwa xorta waħda xogħol għalxejn.
Xi drabi, speċjalment meta żżid ħoloq esterni ġodda f'paġna, il-paġna wiki tista' tistaqsik biex tirrispondi mistoqsija.
Minħabba li din hija azzjoni li diffiċli li tiġi replikata min-naħa ta' kompjuter, dan il-mekkaniżmu jippermetti lil (kważi) kull utent li jeżisti li jagħmel il-kontribuzzjonijiet tiegħu waqt li ħafna ''spammers'' u attakki awtomatiċi jiġu mwaqqfa.
-Jekk jogħġbok ikkuntatja lill-[[{{MediaWiki:Grouppage-sysop}}|amministraturi tas-sit]] għall-għajnuna fuq jekk din il-proċedura hix qed tipprevjeni milli tagħmel kontribuzzjonijiet leġittimi.
+Jekk jogħġbok ikkuntatja lill-[[Special:ListAdmins|amministraturi tas-sit]] għall-għajnuna fuq jekk din il-proċedura hix qed tipprevjeni milli tagħmel kontribuzzjonijiet leġittimi.
Iklikkja fuq il-buttuna 'lura' tal-browżer tiegħek sabiex tirritorna għall-editur ta-paġna.",
);
-/** Norwegian Bokmål (norsk (bokmål)‎)
+/** Norwegian Bokmål (norsk bokmål)
* @author Helland
* @author Nghtwlkr
* @author Simny
*/
$messages['nb'] = array(
'questycaptcha-addurl' => 'Din endring inneholder nye eksterne lenker.
-For å beskytte mot automatisert spam, vennligst svar på spørsmålet som vises under ([[Special:Captcha/help|mer informasjon]]):',
- 'questycaptcha-badlogin' => 'For å hindre passordtyveri, vær vennlig og svar på spørsmålet under ([[Special:Captcha/help|mer informasjon]]):',
- 'questycaptcha-createaccount' => 'For å beskytte mot automatisert spam, vennligst svar på spørsmålet som vises under ([[Special:Captcha/help|mer informasjon]]):',
+For å beskytte mot automatisert spam, vennligst svar på spørsmålet som vises under ([[Special:Captcha/help|mer informasjon]]):', # Fuzzy
+ 'questycaptcha-badlogin' => 'For å hindre passordtyveri, vær vennlig og svar på spørsmålet under ([[Special:Captcha/help|mer informasjon]]):', # Fuzzy
+ 'questycaptcha-createaccount' => 'For å beskytte mot automatisert spam, vennligst svar på spørsmålet som vises under ([[Special:Captcha/help|mer informasjon]]):', # Fuzzy
'questycaptcha-create' => 'For å opprette siden, vennligst svar på spørsmålet som vises under ([[Special:Captcha/help|mer informasjon]]):',
'questycaptcha-edit' => 'For å endre denne siden, vennligst svar på spørsmålet som vises under ([[Special:Captcha/help|mer informasjon]]):',
- 'questycaptcha-sendemail' => 'For å beskytte mot automatisert søppelpost, svar på spørsmålet som vises nedenfor ([[Special:Captcha/help|mer info]]):',
+ 'questycaptcha-sendemail' => 'For å beskytte mot automatisert søppelpost, svar på spørsmålet som vises nedenfor ([[Special:Captcha/help|mer info]]):', # Fuzzy
'questycaptchahelp-text' => "Nettsteder som tar imot bidrag fra allmennheten, som denne wikien, er ofte utsatt for angrep fra spammere som bruker automatiserte verktøy for å legge til lenker til mange sider.
Selv om disse spam-lenkene kan fjernes er de en stor plage.
Iblant, spesielt ved tillegg av nye lenker til en side, kan wikien be deg svare på et spørsmål.
Siden dette er en oppgave som er vanskelig å automatisere, vil den tillate de fleste virkelige personer å bidra mens den stopper de fleste spammere og andre robotangrep.
-Vennligst kontakt [[{{MediaWiki:Grouppage-sysop}}|sideadministratorer]] for hjelp dersom dette er uventet hindrer deg fra å bidra med legitime bidrag.
+Vennligst kontakt [[Special:ListAdmins|sideadministratorer]] for hjelp dersom dette er uventet hindrer deg fra å bidra med legitime bidrag.
Klikk på 'tilbake'-knappen i nettleseren din for å gå tilbake til sideeditoren.",
);
/** Dutch (Nederlands)
+ * @author HanV
* @author Siebrand
*/
$messages['nl'] = array(
'questycaptcha-addurl' => 'Uw bewerking bevat nieuwe externe koppelingen.
Beantwoord de onderstaande vraag als bescherming tegen automatische spam ([[Special:Captcha/help|meer informatie]]):',
- 'questycaptcha-badlogin' => 'Beantwoord de onderstaande vraag als bescherming tegen geautomatiseerde wachtwoordaanvallen ([[Special:Captcha/help|meer informatie]]):',
+ 'questycaptcha-badlogin' => 'Beantwoord de onderstaande vraag als bescherming tegen het automatisch kraken van wachtwoorden ([[Special:Captcha/help|meer informatie]]):',
'questycaptcha-createaccount' => 'Beantwoord de onderstaande vraag als bescherming tegen het geautomatiseerd aanmaken van gebruikers ([[Special:Captcha/help|meer informatie]]):',
'questycaptcha-create' => 'Beantwoord de onderstaande vraag om de pagina aan te maken ([[Special:Captcha/help|meer informatie]]):',
'questycaptcha-edit' => 'Beantwoord de onderstaande vraag om deze pagina te bewerken ([[Special:Captcha/help|meer informatie]]):',
@@ -883,7 +934,7 @@ Hoewel deze externe koppelingen weer verwijderd kunnen worden, leveren ze wel ve
Soms, en in het bijzonder bij het toevoegen van externe koppelingen op pagina\'s, vraag de wiki u een vraag te beantwoorden.
Omdat dit proces lastig te automatiseren is, zijn vrijwel alleen mensen in staat dit proces succesvol te doorlopen en worden hiermee spammers en andere geautomatiseerde aanvallen geweerd.
-Vraag assistentie van de [[{{MediaWiki:Grouppage-sysop}}|sitebeheerders]] als dit proces u verhindert een nuttige bijdrage te leveren.
+Vraag assistentie van de [[Special:ListAdmins|sitebeheerders]] als dit proces u verhindert een nuttige bijdrage te leveren.
Klik op de knop "terug" in uw browser om terug te gaan naar het tekstbewerkingsscherm.',
);
@@ -893,25 +944,25 @@ Klik op de knop "terug" in uw browser om terug te gaan naar het tekstbewerkingss
*/
$messages['nl-informal'] = array(
'questycaptcha-addurl' => 'Je bewerking bevat nieuwe externe koppelingen.
-Beantwoord de onderstaande vraag als bescherming tegen automatische spam ([[Special:Captcha/help|meer informatie]]):',
+Beantwoord de onderstaande vraag als bescherming tegen automatische spam ([[Special:Captcha/help|meer informatie]]):', # Fuzzy
'questycaptchahelp-text' => 'Websites die vrij te bewerken zijn, zoals deze wiki, worden vaak misbruikt door spammers die er met hun programma\'s automatisch koppelingen op zetten naar vele websites.
Hoewel deze externe koppelingen weer verwijderd kunnen worden, leveren ze wel veel hinder en administratief werk op.
Soms, en in het bijzonder bij het toevoegen van externe koppelingen op pagina\'s, vraag de wiki je een vraag te beantwoorden.
Omdat dit proces lastig te automatiseren is, zijn vrijwel alleen mensen in staat dit proces succesvol te doorlopen en worden hiermee spammers en andere geautomatiseerde aanvallen geweerd.
-Vraag assistentie van de [[{{MediaWiki:Grouppage-sysop}}|sitebeheerders]] als dit proces je verhindert een nuttige bijdrage te leveren.
+Vraag assistentie van de [[Special:ListAdmins|sitebeheerders]] als dit proces je verhindert een nuttige bijdrage te leveren.
Klik op de knop "terug" in je browser om terug te gaan naar het tekstbewerkingsscherm.',
);
-/** Norwegian Nynorsk (norsk (nynorsk)‎)
+/** Norwegian Nynorsk (norsk nynorsk)
* @author Gunnernett
*/
$messages['nn'] = array(
'questycaptcha-addurl' => 'Endringa di inneheld nye lenkjer ut.
-Som ei hjelp til å unngå automatisert spam, ver venleg og skiv inn spørsmålet som er synt nedanfor ([[Special:Captcha/help|meir informasjon]]):',
- 'questycaptcha-createaccount' => 'For å hjelpa til med å hindra automatisk kontooppretting, ver venleg og svar på spørsmålet nedanfor ([[Special:Captcha/help|more info]]):',
+Som ei hjelp til å unngå automatisert spam, ver venleg og skiv inn spørsmålet som er synt nedanfor ([[Special:Captcha/help|meir informasjon]]):', # Fuzzy
+ 'questycaptcha-createaccount' => 'For å hjelpa til med å hindra automatisk kontooppretting, ver venleg og svar på spørsmålet nedanfor ([[Special:Captcha/help|more info]]):', # Fuzzy
'questycaptcha-create' => 'For å oppretta sida, ver venleg og svar på spørsmålet nedanfor ([[Special:Captcha/help|meir informasjon]]):',
'questycaptcha-edit' => 'For å endra sida, ver venleg og svar på spørsmålet som er synt nedanfor ([[Special:Captcha/help|meir informasjon]]):',
);
@@ -921,19 +972,19 @@ Som ei hjelp til å unngå automatisert spam, ver venleg og skiv inn spørsmåle
*/
$messages['oc'] = array(
'questycaptcha-addurl' => 'Vòstra modificacion inclutz de ligams extèrnes novèls.
-Per nos ajudar dins la proteccion contra lo spam automatizat, respondètz a la question çaijós ([[Special:Captcha/help|mai d’entresenhas]]) :',
- 'questycaptcha-badlogin' => "Per nos ajudar a prevenir la copadura dels senhals per d'automats, respondètz a la question çaijós ([[Special:Captcha/help|mai d’entresenhas]]) :",
- 'questycaptcha-createaccount' => "Per nos ajudar a luchar contra las creacions automaticas de comptes, respondètz a la question qu'apareis çaijós ([[Special:Captcha/help|mai d’entresenhas]]) :",
+Per nos ajudar dins la proteccion contra lo spam automatizat, respondètz a la question çaijós ([[Special:Captcha/help|mai d’entresenhas]]) :', # Fuzzy
+ 'questycaptcha-badlogin' => "Per nos ajudar a prevenir la copadura dels senhals per d'automats, respondètz a la question çaijós ([[Special:Captcha/help|mai d’entresenhas]]) :", # Fuzzy
+ 'questycaptcha-createaccount' => "Per nos ajudar a luchar contra las creacions automaticas de comptes, respondètz a la question qu'apareis çaijós ([[Special:Captcha/help|mai d’entresenhas]]) :", # Fuzzy
'questycaptcha-create' => 'Per crear la pagina, respondètz a la question çaijós ([[Special:Captcha/help|mai d’entresenhas]]) :',
'questycaptcha-edit' => 'Per modificar aquesta pagina, respondètz a la question çaijós ([[Special:Captcha/help|mai d’entresenhas]]) :',
- 'questycaptcha-sendemail' => "Per tal de nos ajudar a prevenir lo spam automatic, entratz los mots qu'apareisson dins la bóstia çaijós ([[Special:Captcha/help|mai d’informacions]]) :",
- 'questycaptchahelp-text' => "Los sites web qu'acceptan de contribucions del public, coma aqueste wiki, son sovent victimas de polluposteires qu'utilizan d'espleches automatizats per plaçar de ligams nombroses cap a lors sites.
+ 'questycaptcha-sendemail' => "Per tal de nos ajudar a prevenir lo spam automatic, entratz los mots qu'apareisson dins la bóstia çaijós ([[Special:Captcha/help|mai d’informacions]]) :", # Fuzzy
+ 'questycaptchahelp-text' => "Los sites web qu'acceptan de contribucions del public, coma aqueste wiki, son sovent victimas de polluposteires qu'utilizan d'aisinas automatizadas per plaçar de ligams nombroses cap a lors sites.
Quitament s'aquesta pollucion pòt èsser escafada, es irritanta.
De còps, particularament al moment de l’apondon de ligams extèrnes novèls dins una pagina, lo wiki vos pòt demandar de respondre a una question.
Aqueste prètzfach es pas de bon acomplir d'un biais automatizat, aquò permet a la màger part dels umans de realizar lors contribucions tot en empachant la màger part dels polluposteires e autres atacants robotizats.
-Contactatz [[{{MediaWiki:Grouppage-sysop}}|los administrators del site]] s'aquò vos empacha de faiçon imprevista de far de contribucions legitimas.
+Contactatz [[Special:ListAdmins|los administrators del site]] s'aquò vos empacha de faiçon imprevista de far de contribucions legitimas.
Clicatz sul boton « Precedent » de vòstre navigador per tornar a la pagina de modificacion.",
);
@@ -943,19 +994,19 @@ Clicatz sul boton « Precedent » de vòstre navigador per tornar a la pagina de
*/
$messages['pl'] = array(
'questycaptcha-addurl' => 'Edycja zawiera nowe linki zewnętrzne.
-Ochrona przed zautomatyzowanym spamem wymaga odpowiedzi na poniższe pytanie ([[Special:Captcha/help|więcej informacji]])',
- 'questycaptcha-badlogin' => 'Ochrona przed zautomatyzowanym łamaniem haseł wymaga odpowiedzi na poniższe pytanie ([[Special:Captcha/help|więcej informacji]])',
- 'questycaptcha-createaccount' => 'Ochrona przed zautomatyzowanym tworzeniem kont wymaga odpowiedzi na poniższe pytanie ([[Special:Captcha/help|więcej informacji]])',
+Ochrona przed zautomatyzowanym spamem wymaga odpowiedzi na poniższe pytanie ([[Special:Captcha/help|więcej informacji]])', # Fuzzy
+ 'questycaptcha-badlogin' => 'Ochrona przed zautomatyzowanym łamaniem haseł wymaga odpowiedzi na poniższe pytanie ([[Special:Captcha/help|więcej informacji]])', # Fuzzy
+ 'questycaptcha-createaccount' => 'Ochrona przed zautomatyzowanym tworzeniem kont wymaga odpowiedzi na poniższe pytanie ([[Special:Captcha/help|więcej informacji]])', # Fuzzy
'questycaptcha-create' => 'Utworzenie strony jest możliwe po udzieleniu odpowiedzi na poniższe pytanie ([[Special:Captcha/help|więcej informacji]])',
'questycaptcha-edit' => 'Edycja strony jest możliwa po udzieleniu odpowiedzi na poniższe pytanie ([[Special:Captcha/help|więcej informacji]])',
- 'questycaptcha-sendemail' => 'Z uwagi na ochronę przed automatycznym spamem, należy odpowiedzieć na znajdujące się poniżej pytanie ([[Special:Captcha/help|pomoc]])',
+ 'questycaptcha-sendemail' => 'Z uwagi na ochronę przed automatycznym spamem, należy odpowiedzieć na znajdujące się poniżej pytanie ([[Special:Captcha/help|pomoc]])', # Fuzzy
'questycaptchahelp-text' => "Witryny, które publicznie udostępniają możliwość wprowadzania zmian, tak jak ta wiki, często są wykorzystywane przez spamerów, którzy korzystają ze zautomatyzowanych narzędzi, aby dodawać swoje linki do wielu stron.
Pomimo tego, że takie linki mogą zostać usunięte, jest to jednak uciążliwe.
Czasami, zwłaszcza jeśli dodano nowe linki zewnętrzne, wiki może poprosić o udzielenie odpowiedzi na pytanie.
Ponieważ odpowiadanie na pytania jest czynnością trudną do zautomatyzowania, pozwala większości ludziom na wykonywanie edycji, zarazem uniemożliwiając ją spamerom i innym atakującym automatom.
-Skontaktuj się z [[{{MediaWiki:Grouppage-sysop}}|administratorami]], jeśli potrzebujesz pomocy ponieważ mechanizm ten uniemożliwia Ci dokonywania uzasadnionych edycji.
+Skontaktuj się z [[Special:ListAdmins|administratorami]], jeśli potrzebujesz pomocy ponieważ mechanizm ten uniemożliwia Ci dokonywania uzasadnionych edycji.
Kliknij przycisk 'wstecz' w przeglądarce, aby wrócić do strony edycji.",
);
@@ -966,21 +1017,21 @@ Kliknij przycisk 'wstecz' w przeglądarce, aby wrócić do strony edycji.",
*/
$messages['pms'] = array(
'questycaptcha-addurl' => 'Toa modìfica a conten na neuva anliura esterna.
-Për giuté a protegi contra spam automàtich, për piasì arspond a la custion che a-i é sì sota ([[Special:Captcha/help|për savèjne ëd pì]]):',
- 'questycaptcha-badlogin' => 'Për giuté a protegi contra ël crack ëd ciav automatisà, për piasì arspond a la custion che a ven fòra sota ([[Special:Captcha/help|për savèjne ëd pì]]):',
- 'questycaptcha-createaccount' => 'Për giuté a protegi contra la creassion automàtica ëd cont, për piasì arspond a la custion che a ven fòra sota ([[Special:Captcha/help|për savejne ëd pì]]):',
+Për giuté a protegi contra spam automàtich, për piasì arspond a la custion che a-i é sì sota ([[Special:Captcha/help|për savèjne ëd pì]]):', # Fuzzy
+ 'questycaptcha-badlogin' => 'Për giuté a protegi contra ël crack ëd ciav automatisà, për piasì arspond a la custion che a ven fòra sota ([[Special:Captcha/help|për savèjne ëd pì]]):', # Fuzzy
+ 'questycaptcha-createaccount' => 'Për giuté a protegi contra la creassion automàtica ëd cont, për piasì arspond a la custion che a ven fòra sota ([[Special:Captcha/help|për savejne ëd pì]]):', # Fuzzy
'questycaptcha-create' => 'Për creé la pàgina, për piasì arspond a la custion che a ven fòra sota: ([[Special:Captcha/help|për savejne ëd pì]]):',
'questycaptcha-edit' => 'Për modifiché sta pàgina-sì, për piasì arspond a la custion che a ven fòra sota ([[Special:Captcha/help|për savejne ëd pì]]):',
- 'questycaptcha-sendemail' => "Për giuté a protegi contra la rumenta automàtica, për piasì ch'a risponda a la chestion ch'as vëdd sì-sota ([[Special:Captcha/help|për savèjne ëd pi]]):",
- 'questycaptchahelp-text' => "Soèns a-i riva che ij sit dla Ragnà che la gent a peul dovré për ëscrive chèich-còs, coma sta wiki-sì, a resto ambërlifà ëd reclam da màchine che a carìo soa ròba dadsà e dadlà n'automàtich.
-Për tant che sta reclam un a peula peuj gavela, a resta sempe un gran fastudi.
+ 'questycaptcha-sendemail' => "Për giuté a protegi contra la rumenta automàtica, për piasì ch'a risponda a la chestion ch'as vëdd sì-sota ([[Special:Captcha/help|për savèjne ëd pi]]):", # Fuzzy
+ 'questycaptchahelp-text' => "Soèns a-i riva che ij sit dla Ragnà che la gent a peul dovré për ëscrive chèich-còs, coma sta wiki-sì, a resto ambërlifà d'areclam da 'd màchine che a cario soa ròba dadsà e dadlà n'automàtich.
+Për tant che sti areclam un a peula peuj gaveje, a resta sempe un gran fastudi.
-Dle vire, dzortut quand un a caria dj'anliure esterne neuve ansime a na pàgina, la wiki a peul ciamete d'arsponde a na custion.
-Da già ch'a l'é grama scrive un programa ch'a lo fasa, a ven che la pì gran part dla gent a-i la fa a scrive, ma la ói part dle màchine a-i la fa pa.
+Dle vire, dzortut quand un a caria dj'anliure esterne neuve ansime a na pàgina, la wiki a peul ciameje ëd rësponde a na chestion.
+Da già ch'a l'é grama scrive un programa ch'a lo fasa, a ven che la pì gran part dla gent a-i la fa a scrive, ma la pi part dle màchine a-i la fa pa.
-Për piasì contata j'[[{{MediaWiki:Grouppage-sysop}}|aministrador dël sit]] për assistensa se sòn-sì a l'ha nen lassate fé na contribussion legìtima.
+Për piasì ch'a contata j'[[Special:ListAdmins|aministrator dël sit]] për d'assistensa se sòn a-j përmet nen ëd fé na contribussion legìtima.
-Ch'a-i bata ansima al boton 'andré' ant sò navigator për torné andré a l'editor dla pàgina.",
+Ch'a-i bata ansima al boton «andré» ant sò navigator për torné andré a l'editor dla pàgina.",
);
/** Portuguese (português)
@@ -990,19 +1041,19 @@ Ch'a-i bata ansima al boton 'andré' ant sò navigator për torné andré a l'ed
*/
$messages['pt'] = array(
'questycaptcha-addurl' => "A sua edição introduziu links externos novos.
-Para ajudar a prevenir o ''spam'' automatizado, por favor, responda à questão apresentada abaixo ([[Special:Captcha/help|mais informações]]):",
- 'questycaptcha-badlogin' => 'Para ajudar a prevenir mecanismos automatizados de descoberta de palavras-chave, por favor, responda à questão apresentada abaixo ([[Special:Captcha/help|mais informações]]):',
- 'questycaptcha-createaccount' => 'Para ajudar a prevenir a criação de contas automatizada, por favor, responda à questão apresentada abaixo ([[Special:Captcha/help|mais informações]]):',
+Para ajudar a prevenir o ''spam'' automatizado, por favor, responda à questão apresentada abaixo ([[Special:Captcha/help|mais informações]]):", # Fuzzy
+ 'questycaptcha-badlogin' => 'Para ajudar a prevenir mecanismos automatizados de descoberta de palavras-chave, por favor, responda à questão apresentada abaixo ([[Special:Captcha/help|mais informações]]):', # Fuzzy
+ 'questycaptcha-createaccount' => 'Para ajudar a prevenir a criação de contas automatizada, por favor, responda à questão apresentada abaixo ([[Special:Captcha/help|mais informações]]):', # Fuzzy
'questycaptcha-create' => 'Para criar a página, por favor, responda à questão apresentada abaixo ([[Special:Captcha/help|mais informações]]):',
'questycaptcha-edit' => 'Para editar esta página, por favor, responda à questão apresentada abaixo ([[Special:Captcha/help|mais informações]]):',
- 'questycaptcha-sendemail' => "Para ajudar a prevenir o ''spam'' automatizado, por favor, responda à seguinte pergunta ([[Special:Captcha/help|mais informações]]):",
+ 'questycaptcha-sendemail' => "Para ajudar a prevenir o ''spam'' automatizado, por favor, responda à seguinte pergunta ([[Special:Captcha/help|mais informações]]):", # Fuzzy
'questycaptchahelp-text' => "Sites na internet abertos a edição pública, como é o caso desta wiki, são frequentemente abusados por ''spammers'' que utilizam ferramentas automatizadas para inserção em massa de links em muitos sites.
Embora esses links possam ser removidos, representam um incómodo significativo.
Por vezes, especialmente quando introduzir links externos novos numa página, a wiki pedirá que responda a uma pergunta.
Porque esta é uma tarefa difícil de automatizar, permite que a maioria das pessoas façam as suas edições, ao mesmo tempo que inibe edições feitas por ''spammers'' e outros mecanismos automatizados.
-Por favor, contacte os [[{{MediaWiki:Grouppage-sysop}}|administradores]] para assistência, caso esta funcionalidade esteja a impedi-lo de fazer edições legítimas.
+Por favor, contacte os [[Special:ListAdmins|administradores]] para assistência, caso esta funcionalidade esteja a impedi-lo de fazer edições legítimas.
Clique o botão 'voltar' do seu browser para voltar à página de edição.",
);
@@ -1010,23 +1061,24 @@ Clique o botão 'voltar' do seu browser para voltar à página de edição.",
/** Brazilian Portuguese (português do Brasil)
* @author Eduardo.mps
* @author Giro720
+ * @author Luckas
* @author 555
*/
$messages['pt-br'] = array(
'questycaptcha-addurl' => 'Sua edição inclui novas ligações externas.
-Para proteção contra spam automático, por favor responda a questão que aparece abaixo ([[Special:Captcha/help|mais informações]]):',
- 'questycaptcha-badlogin' => 'Para proteger contra quebra automatizada de palavra-chave, por favor responda a questão que aparece abaixo ([[Special:Captcha/help|more info]]):',
- 'questycaptcha-createaccount' => 'Para proteger contra criação automática de contas, por favor responda as questões que aparecem abaixo ([[Special:Captcha/help|more info]]):',
+Para proteção contra spam automático, por favor responda a questão que aparece abaixo ([[Special:Captcha/help|mais informações]]):', # Fuzzy
+ 'questycaptcha-badlogin' => 'Para proteger contra quebra automatizada de senha, por favor responda a questão que aparece abaixo ([[Special:Captcha/help|mais informação]]):', # Fuzzy
+ 'questycaptcha-createaccount' => 'Para proteger contra criação automática de contas, por favor responda as questões que aparecem abaixo ([[Special:Captcha/help|more info]]):', # Fuzzy
'questycaptcha-create' => 'Para criar a página, por favor responda a questão que aparece abaixo ([[Special:Captcha/help|more info]]):',
'questycaptcha-edit' => 'Para editar esta página, por favor responda a questão que aparece abaixo ([[Special:Captcha/help|more info]]):',
- 'questycaptcha-sendemail' => "Para ajudar a prevenir o ''spam'' automatizado, por favor, responda à seguinte pergunta ([[Special:Captcha/help|mais informações]]):",
+ 'questycaptcha-sendemail' => "Para ajudar a prevenir o ''spam'' automatizado, por favor, responda à seguinte pergunta ([[Special:Captcha/help|mais informações]]):", # Fuzzy
'questycaptchahelp-text' => "Sites que aceitam contribuições públicas, como este wiki, são vulneráveis a spammers que utilizam ferramentas automatizadas para inserir os seus links em diversos locais.
Apesar de ser possível remover tais links, eles são um incômodo significativo.
Algumas vezes, especialmente ao adicionar novos links externos a uma página, o wiki pode pedir a você que responda a uma pergunta.
Uma vez que essa é uma tarefa um tanto difícil de ser automatizada, ela possibilita que a maioria dos humanos faça as suas contribuições ao mesmo tempo que inibe as que forem feitas por spammers e mecanismos automatizados.
-Entre em contato com os [[{{MediaWiki:Grouppage-sysop}}|administradores do site]] para pedir ajuda caso isso esteja te impedindo de realizar contribuições legítimas.
+Entre em contato com os [[Special:ListAdmins|administradores do site]] para pedir ajuda caso isso esteja te impedindo de realizar contribuições legítimas.
Clique no botão 'voltar' de seu navegador para retornar ao editor de páginas.",
);
@@ -1036,18 +1088,18 @@ Clique no botão 'voltar' de seu navegador para retornar ao editor de páginas."
*/
$messages['ro'] = array(
'questycaptcha-addurl' => 'Modificarea dumneavoastră include legături externe noi.
-Pentru a împiedica roboții de spam, vă rugăm să răspundeți la întrebarea de mai jos ([[Special:Captcha/help|mai multe detalii]]):',
- 'questycaptcha-badlogin' => 'Pentru a împiedica spargerea automată a parolelor, vă rugăm să răspundeți la întrebarea de mai jos ([[Special:Captcha/help|mai multe detalii]]):',
- 'questycaptcha-createaccount' => 'Pentru a împiedica crearea automată de conturi, vă rugăm să răspundeți la întrebarea de mai jos ([[Special:Captcha/help|mai multe detalii]]):',
+Pentru a împiedica roboții de spam, vă rugăm să răspundeți la întrebarea de mai jos ([[Special:Captcha/help|mai multe detalii]]):', # Fuzzy
+ 'questycaptcha-badlogin' => 'Pentru a împiedica spargerea automată a parolelor, vă rugăm să răspundeți la întrebarea de mai jos ([[Special:Captcha/help|mai multe detalii]]):', # Fuzzy
+ 'questycaptcha-createaccount' => 'Pentru a împiedica crearea automată de conturi, vă rugăm să răspundeți la întrebarea de mai jos ([[Special:Captcha/help|mai multe detalii]]):', # Fuzzy
'questycaptcha-create' => 'Pentru a crea pagina, vă rugăm să răspundeți la întrebarea de mai jos ([[Special:Captcha/help|mai multe detalii]]):',
'questycaptcha-edit' => 'Pentru a modifica această pagină, vă rugăm să răspundeți la întrebarea de mai jos ([[Special:Captcha/help|mai multe detalii]]):',
- 'questycaptcha-sendemail' => 'Pentru a împiedica roboții de spam, vă rugăm să răspundeți la întrebarea de mai jos ([[Special:Captcha/help|mai multe detalii]]):',
+ 'questycaptcha-sendemail' => 'Pentru a împiedica roboții de spam, vă rugăm să răspundeți la întrebarea de mai jos ([[Special:Captcha/help|mai multe detalii]]):', # Fuzzy
'questycaptchahelp-text' => 'Siturile web care acceptă contribuții din partea publicului, precum acest wiki, sunt de obicei victime ale persoanelor care folosesc unelte automate pentru a introduce legături către multe alte situri.
Deși aceste legături de spam pot fi îndepărtate, acest lucru reprezintă o bătaie de cap semnificativă.
Uneori, mai ales la adăugarea de noi legături web într-o pagină, situl wiki vă poate cere să răspundeți la o anumită întrebare. Întrucât rezolvarea acestei cerințe este dificil de automatizat, ea permite majorității persoanelor reale să-și trimită contribuțiile și va opri majoritatea atacatorilor.
-În cazul în care această practică vă împiedică în mod neașteptat să faceți contribuții legitime, vă rugăm să contactați [[{{MediaWiki:Grouppage-sysop}}|administratorii sitului]].
+În cazul în care această practică vă împiedică în mod neașteptat să faceți contribuții legitime, vă rugăm să contactați [[Special:ListAdmins|administratorii sitului]].
Apăsați butonul „Înapoi†al navigatorului pentru a vă reîntoarce la pagina de editare.',
);
@@ -1057,43 +1109,43 @@ Apăsați butonul „Înapoi†al navigatorului pentru a vă reîntoarce la pag
*/
$messages['roa-tara'] = array(
'questycaptcha-addurl' => "'U cangiamende tue inglude de le collegaminde esterne.
-Pe aiutà a proteggere condre a 'u spam automateche, pe piacere respunne a 'a domande ca combare sotte ([[Special:Captcha/help|cchiù 'mbormaziune]]):",
- 'questycaptcha-badlogin' => "Pe aiutà a proteggere condre a futteminde automatece de password, pe piacere respunne a 'a domande ca combare aqquà sotte ([[Special:Captcha/help|more info]]):",
- 'questycaptcha-createaccount' => "Pe aiutà a proteggere condre a ccreazione automateche de cunde utinde, pe piacere respunne a 'a domande ca combare aqquà sotte ([[Special:Captcha/help|more info]]):",
+Pe aiutà a proteggere condre a 'u spam automateche, pe piacere respunne a 'a domande ca combare sotte ([[Special:Captcha/help|cchiù 'mbormaziune]]):", # Fuzzy
+ 'questycaptcha-badlogin' => "Pe aiutà a proteggere condre a futteminde automatece de password, pe piacere respunne a 'a domande ca combare aqquà sotte ([[Special:Captcha/help|more info]]):", # Fuzzy
+ 'questycaptcha-createaccount' => "Pe aiutà a proteggere condre a ccreazione automateche de cunde utinde, pe piacere respunne a 'a domande ca combare aqquà sotte ([[Special:Captcha/help|more info]]):", # Fuzzy
'questycaptcha-create' => "Pe ccrejà sta pàgene, pe piacere respunne a 'a domande ca combare aqquà sotte ([[Special:Captcha/help|more info]]):",
'questycaptcha-edit' => "Pe cangià sta pàgene, pe piacere respunne a 'a domande ca combare aqquà sotte ([[Special:Captcha/help|more info]]):",
- 'questycaptcha-sendemail' => "Pe aiutà a proteggere condre a spam automatece, pe piacere respunne a 'a domande ca combare aqquà sotte ([[Special:Captcha/help|cchiù 'mbormaziune]]):",
+ 'questycaptcha-sendemail' => "Pe aiutà a proteggere condre a spam automatece, pe piacere respunne a 'a domande ca combare aqquà sotte ([[Special:Captcha/help|cchiù 'mbormaziune]]):", # Fuzzy
'questycaptchahelp-text' => "Le site web ca accettane condrebbute da 'u pubbleche, cumme sta Uicchi, sonde spesse abusate da le ''spammer'' ca ausane struminde automatece e aggiungene le lore collegaminde a 'nu sacche de site.<br />
Pure ca chiste collegaminde de spam ponne essere luate, lore sò sembre 'nu scassamende de palle.<br />
<br />
Certe vote, specialmende quanne aggiunge 'nu nuève collegamende web a 'na pàgene, Uicchi te pò chiedere de responnere a 'na domande.<br />
Accussì addeviene 'nu combete cchiù defficile da automatizzà, accussì se permette a le cristiane de fà cangiaminde reale e se blocchene de cchiù le ''spammer'' e otre attacche de robot.<br />
<br />
-Pe piacere condatte le [[{{MediaWiki:Grouppage-sysop}}|amministrature d'u site]] pe assistenze ce stu fatte non ge funzione accume se deve e no te face fà le cangiaminde legittime.<br />
+Pe piacere condatte le [[Special:ListAdmins|amministrature d'u site]] pe assistenze ce stu fatte non ge funzione accume se deve e no te face fà le cangiaminde legittime.<br />
<br />
Cazze 'u buttone 'rrete' jndr'à 'u browser tue pe turnà 'a pàgene d'u cangiamende.",
);
/** Russian (руÑÑкий)
+ * @author Lockal
+ * @author Okras
* @author ÐлекÑандр Сигачёв
*/
$messages['ru'] = array(
'questycaptcha-addurl' => 'Ваша правка Ñодержит новые внешние ÑÑылки.
-Ð’ целÑÑ… защиты от автоматичеÑкого Ñпама, пожалуйÑта, ответьте на приведённый ниже Ð²Ð¾Ð¿Ñ€Ð¾Ñ ([[Special:Captcha/help|подробнее]]):',
- 'questycaptcha-badlogin' => 'Ð’ целÑÑ… защиты от автоматичеÑкого подбора паролÑ, пожалуйÑта, ответьте на приведённый ниже Ð²Ð¾Ð¿Ñ€Ð¾Ñ ([[Special:Captcha/help|подробнее]]):',
- 'questycaptcha-createaccount' => 'Ð’ целÑÑ… защиты от автоматичеÑкого ÑÐ¾Ð·Ð´Ð°Ð½Ð¸Ñ ÑƒÑ‡Ñ‘Ñ‚Ð½Ñ‹Ñ… запиÑей, пожалуйÑта, ответьте на приведённый ниже Ð²Ð¾Ð¿Ñ€Ð¾Ñ ([[Special:Captcha/help|подробнее]]):',
+Ð’ целÑÑ… защиты от автоматичеÑкого Ñпама проÑим Ð²Ð°Ñ Ð¾Ñ‚Ð²ÐµÑ‚Ð¸Ñ‚ÑŒ на вопроÑ, показанный ниже ([[Special:Captcha/help|подробнее…]]):',
+ 'questycaptcha-badlogin' => 'Ð’ целÑÑ… защиты от автоматичеÑкого подбора Ð¿Ð°Ñ€Ð¾Ð»Ñ Ð¿Ñ€Ð¾Ñим Ð²Ð°Ñ Ð¾Ñ‚Ð²ÐµÑ‚Ð¸Ñ‚ÑŒ на вопроÑ, показанный ниже ([[Special:Captcha/help|подробнее…]]):',
+ 'questycaptcha-createaccount' => 'Ð’ целÑÑ… защиты от автоматичеÑкого ÑÐ¾Ð·Ð´Ð°Ð½Ð¸Ñ ÑƒÑ‡Ñ‘Ñ‚Ð½Ñ‹Ñ… запиÑей проÑим Ð²Ð°Ñ Ð¾Ñ‚Ð²ÐµÑ‚Ð¸Ñ‚ÑŒ на вопроÑ, показанный ниже ([[Special:Captcha/help|подробнее…]]):',
'questycaptcha-create' => 'Ð”Ð»Ñ ÑÐ¾Ð·Ð´Ð°Ð½Ð¸Ñ Ñтраницы, пожалуйÑта, ответьте на приведённый ниже Ð²Ð¾Ð¿Ñ€Ð¾Ñ ([[Special:Captcha/help|подробнее]]):',
'questycaptcha-edit' => 'Чтобы изменить Ñту Ñтраницу, пожалуйÑта, ответьте на приведённый ниже Ð²Ð¾Ð¿Ñ€Ð¾Ñ ([[Special:Captcha/help|подробнее]]):',
- 'questycaptcha-sendemail' => 'Ð’ целÑÑ… защиты от автоматичеÑкого Ñпама, пожалуйÑта, ответьте на приведённый ниже Ð²Ð¾Ð¿Ñ€Ð¾Ñ ([[Special:Captcha/help|подробнее]]):',
- 'questycaptchahelp-text' => 'Веб-Ñайты позволÑющие изменÑÑ‚ÑŒ Ñвоё Ñодержимое, как Ñта вики, чаÑто ÑтановÑÑ‚ÑÑ Ñ†ÐµÐ»ÑŒÑŽ Ñпамеров, иÑпользующих автоматичеÑкие инÑтрументы Ð´Ð»Ñ Ð´Ð¾Ð±Ð°Ð²Ð»ÐµÐ½Ð¸Ñ ÑÑылок на другие Ñайты.
-ÐеÑÐ¼Ð¾Ñ‚Ñ€Ñ Ð½Ð° то, что такие ÑÑылки могут быть удалены, они ÑвлÑÑŽÑ‚ÑÑ Ð·Ð°Ð¼ÐµÑ‚Ð½Ð¾Ð¹ помехой.
+ 'questycaptcha-sendemail' => 'Ð’ целÑÑ… защиты от автоматичеÑкого Ñпама проÑим Ð²Ð°Ñ Ð¾Ñ‚Ð²ÐµÑ‚Ð¸Ñ‚ÑŒ на вопроÑ, показанный ниже ([[Special:Captcha/help|подробнее…]]):',
+ 'questycaptchahelp-text' => 'Веб-Ñайты, позволÑющие добавлÑÑ‚ÑŒ и изменÑÑ‚ÑŒ Ñвоё Ñодержимое, в том чиÑле Ñта вики, чаÑто ÑтановÑÑ‚ÑÑ Ñ†ÐµÐ»ÑŒÑŽ Ñпамеров, иÑпользующих программы Ð´Ð»Ñ Ð°Ð²Ñ‚Ð¾Ð¼Ð°Ñ‚Ð¸Ñ‡ÐµÑкого Ð´Ð¾Ð±Ð°Ð²Ð»ÐµÐ½Ð¸Ñ ÑÑылок на Ñайты. Ð¥Ð¾Ñ‚Ñ Ñ‚Ð°ÐºÐ¸Ðµ ÑÑылки могут быть впоÑледÑтвии удалены, они ÑвлÑÑŽÑ‚ÑÑ ÑущеÑтвенной помехой.
-Иногда, в чаÑтноÑти при добавлении на Ñтраницу новых веб-ÑÑылок, вики может попроÑить Ð²Ð°Ñ Ð¾Ñ‚Ð²ÐµÑ‚Ð¸Ñ‚ÑŒ на вопроÑ.
-Так как Ñта задача, которую Ñложно автоматизировать, то Ñто позволит большинÑтву людей Ñделать данную правку, и в тоже Ð²Ñ€ÐµÐ¼Ñ Ð¾Ñтановит большинÑтво Ñпамеров и других роботизированных недоброжелателей.
+При некоторых дейÑтвиÑÑ… — например, при добавлении на Ñтраницу новой веб-ÑÑылки — вики может попроÑить Ð²Ð°Ñ Ð¾Ñ‚Ð²ÐµÑ‚Ð¸Ñ‚ÑŒ на вопроÑ. ПоÑкольку Ñта задача ÑвлÑетÑÑ Ñложной Ð´Ð»Ñ Ð°Ð²Ñ‚Ð¾Ð¼Ð°Ñ‚Ð¸Ð·Ð°Ñ†Ð¸Ð¸, большинÑтво ÑпамерÑких и вандальных программ не могут Ñ Ð½ÐµÐ¹ ÑправитьÑÑ, в то Ð²Ñ€ÐµÐ¼Ñ ÐºÐ°Ðº люди ÑправлÑÑŽÑ‚ÑÑ Ð»ÐµÐ³ÐºÐ¾.
-ПожалуйÑта, обратитеÑÑŒ к [[{{MediaWiki:Grouppage-sysop}}|админиÑтраторам Ñайта]] за помощь, еÑли Ð´Ð°Ð½Ð½Ð°Ñ ÑиÑтема не позволÑет вам вноÑить допуÑтимые изменениÑ.
+ПожалуйÑта, обратитеÑÑŒ за помощью к [[Special:ListAdmins|админиÑтраторам]], еÑли Ð¿Ð¾Ð´Ð¾Ð±Ð½Ð°Ñ Ð¿Ñ€Ð¾Ð²ÐµÑ€ÐºÐ° мешает вам доброÑовеÑтно работать Ñ Ñайтом.
-Ðажмите в вашем браузере кнопку «назад», чтобы вернутьÑÑ Ðº Ñтранице редактированиÑ.',
+Ðажмите кнопку «Ðазад» в вашем браузере, чтобы вернутьÑÑ Ðº редактированию.',
);
/** Slovak (slovenÄina)
@@ -1102,11 +1154,11 @@ $messages['ru'] = array(
$messages['sk'] = array(
'questycaptcha-addurl' => 'Vaša úprava obsahuje nové externé odkazy.
Ako opatrenie proti automatizovanému spamu musíte zodpovedať dolu uvedenú otázku
-([[Special:Captcha/help|ÄalÅ¡ie informácie]]):',
+([[Special:Captcha/help|ÄalÅ¡ie informácie]]):', # Fuzzy
'questycaptcha-badlogin' => 'Ako opatrenie proti automatizovanému lámaniu hesiel musíte zodpovedať dolu uvedenú otázku
-([[Special:Captcha/help|ÄalÅ¡ie informácie]]):',
+([[Special:Captcha/help|ÄalÅ¡ie informácie]]):', # Fuzzy
'questycaptcha-createaccount' => 'Ako opatrenie proti automatizovanému vytváraniu úÄtov musíte zodpovedaÅ¥ dolu uvedenú otázku
-([[Special:Captcha/help|ÄalÅ¡ie informácie]]):',
+([[Special:Captcha/help|ÄalÅ¡ie informácie]]):', # Fuzzy
'questycaptcha-create' => 'Ak chcete vytvoriť stránku, musíte zodpovedať dolu uvedenú otázku
([[Special:Captcha/help|ÄalÅ¡ie informácie]]):',
'questycaptcha-edit' => 'Ak chcete upraviť túto stránku, musíte zodpovedať dolu uvedenú otázku
@@ -1117,7 +1169,7 @@ Hoci je možné odkazy na spam odstrániť, je to významná nepríjemnosť.
Niekedy, obzvlášť pri pridávaní nových webových odkazov na stránku, vás wiki môže požiadať o zodpovedanie otázky.
Pretože takúto úlohu je Å¥ažké zautomatizovaÅ¥, umožní väÄÅ¡ine skutoÄných ľudí prispievaÅ¥ a zastaví vaÄÅ¡inu spammerov a robotických útoÄníkov.
-Kontaktujte prosím [[{{MediaWiki:Grouppage-sysop}}|správcov lokality]] ak potrebujete pomoc v prípade, že vám táto funkcia neoÄakávaným spôsobom bráni v právoplatných príspevkoch.
+Kontaktujte prosím [[Special:ListAdmins|správcov lokality]] ak potrebujete pomoc v prípade, že vám táto funkcia neoÄakávaným spôsobom bráni v právoplatných príspevkoch.
Späť na úpravu stránky sa vrátite kliknutím na tlaÄidlo „Späť“ vo vaÅ¡om prehliadaÄi.',
);
@@ -1127,19 +1179,19 @@ Späť na úpravu stránky sa vrátite kliknutím na tlaÄidlo „Späť“ vo v
*/
$messages['sl'] = array(
'questycaptcha-addurl' => 'VaÅ¡e urejanje vkljuÄuje nove zunanje povezave.
-Zaradi zaÅ¡Äite pred samodejnim smetjem prosimo, da odgovorite na spodaj zastavljeno vpraÅ¡anje ([[Special:Captcha/help|veÄ informacij]]):',
- 'questycaptcha-badlogin' => 'Zaradi zaÅ¡Äite pred samodejnim ugotavljanjem gesel prosimo, da odgovorite na spodaj zastavljeno vpraÅ¡anje ([[Special:Captcha/help|veÄ informacij]]):',
- 'questycaptcha-createaccount' => 'Zaradi zaÅ¡Äite pred samodejnim ustvarjanjem raÄunov prosimo, da odgovorite na spodaj zastavljeno vpraÅ¡anje ([[Special:Captcha/help|veÄ informacij]]):',
+Zaradi zaÅ¡Äite wikija pred samodejnim smetjem vas prijazno naproÅ¡amo, da odgovorite na spodaj zastavljeno vpraÅ¡anje ([[Special:Captcha/help|veÄ informacij]]):',
+ 'questycaptcha-badlogin' => 'Zaradi zaÅ¡Äite wikija pred samodejnim ugotavljanjem gesel vas prijazno naproÅ¡amo, da odgovorite na spodaj zastavljeno vpraÅ¡anje ([[Special:Captcha/help|veÄ informacij]]):',
+ 'questycaptcha-createaccount' => 'Zaradi zaÅ¡Äite wikija pred samodejnim ustvarjanjem raÄunov vas prijazno naproÅ¡amo, da odgovorite na spodaj zastavljeno vpraÅ¡anje ([[Special:Captcha/help|veÄ informacij]]):',
'questycaptcha-create' => 'ÄŒe želite ustvariti stran, prosimo odgovorite na spodaj zastavljeno vpraÅ¡anje ([[Special:Captcha/help|veÄ informacij]]):',
'questycaptcha-edit' => 'ÄŒe želite urediti stran, prosimo odgovorite na spodaj zastavljeno vpraÅ¡anje ([[Special:Captcha/help|veÄ informacij]]):',
- 'questycaptcha-sendemail' => 'Zaradi zaÅ¡Äite pred samodejnim smetenjem prosimo, da odgovorite na spodaj zastavljeno vpraÅ¡anje ([[Special:Captcha/help|veÄ informacij]]):',
+ 'questycaptcha-sendemail' => 'Zaradi zaÅ¡Äite wikija pred samodejnim smetenjem vas prijazno naproÅ¡amo, da odgovorite na spodaj zastavljeno vpraÅ¡anje ([[Special:Captcha/help|veÄ informacij]]):',
'questycaptchahelp-text' => 'Spletne strani, ki omogoÄajo prispevanje Å¡irÅ¡i javnosti, kot na primer ta wiki, pogosto zlorabljajo spamerji, ki za dodajanje svojih povezav na mnoge strani uporabljajo avtomatizirana orodja.
ÄŒeprav je neželene povezave mogoÄe odstraniti, so precejÅ¡nja nadloga.
VÄasih, zlasti pri dodajanju novih spletnih povezav na stran, vam bo wiki morda zastavil vpraÅ¡anje.
Ker je to opravilo težko avtomatizirati, bo s tem veÄini ljudi prispevanje dovoljeno, spamerji in drugi robotski napadalci pa bodo ustavljeni.
-ÄŒe vam to nepriÄakovano prepreÄuje legitimno prispevanje, prosimo, da se obrnete na [[{{MediaWiki:Grouppage-sysop}}|administratorje spletiÅ¡Äa]].
+ÄŒe vam to nepriÄakovano prepreÄuje legitimno prispevanje, prosimo, da se obrnete na [[Special:ListAdmins|administratorje spletiÅ¡Äa]].
Za vrnitev v urejevalnik izberite gumb »nazaj« v vašem brskalniku.',
);
@@ -1148,7 +1200,7 @@ Za vrnitev v urejevalnik izberite gumb »nazaj« v vašem brskalniku.',
* @author Abshirdheere
*/
$messages['so'] = array(
- 'questycaptcha-createaccount' => "Si aad u caawiso dhowritaanka in la iska samaysto Akoon,Fadlan ka jawaan su'aalahaan hoos ku qoran ([[Special:Captcha/help|Macluumaad dheeraad ah]]):",
+ 'questycaptcha-createaccount' => "Si aad u caawiso dhowritaanka in la iska samaysto Akoon,Fadlan ka jawaan su'aalahaan hoos ku qoran ([[Special:Captcha/help|Macluumaad dheeraad ah]]):", # Fuzzy
);
/** Serbian (Cyrillic script) (ÑрпÑки (ћирилица)‎)
@@ -1166,22 +1218,24 @@ $messages['sr-el'] = array(
/** Swedish (svenska)
* @author Boivie
+ * @author Rotsee
+ * @author WikiPhoenix
*/
$messages['sv'] = array(
'questycaptcha-addurl' => 'Din redigering inkluderar nya externa länkar.
-För att hjälpa till i skyddet mot automatisk spam, vänligen svara på frågan som finns nedan ([[Special:Captcha/help|mer information]]):',
- 'questycaptcha-badlogin' => 'För att hjälpa till i skyddet mot automatisk lösenordsknäckning, vänligen svara på frågan som finns nedan ([[Special:Captcha/help|mer information]]):',
- 'questycaptcha-createaccount' => 'För att hjälpa till i skyddet mot automatiskt kontoskapande, vänligen svara på frågan som finns nedan ([[Special:Captcha/help|mer information]]):',
+För att skydda wikin mot automatisk spam ber vi dig att svara på frågan här ([[Special:Captcha/help|mer information]]):',
+ 'questycaptcha-badlogin' => 'För att skydda wikin mot automatisk lösenordsknäckning ber vi dig att svara på frågan som finns nedan ([[Special:Captcha/help|mer information]]):',
+ 'questycaptcha-createaccount' => 'För att skydda wikin mot automatiskt kontoskapande ber vi dig att svara på frågan som finns nedan ([[Special:Captcha/help|mer information]]):',
'questycaptcha-create' => 'För att skapa sidan, vänligen svara på frågan som finns nedan ([[Special:Captcha/help|mer information]]):',
'questycaptcha-edit' => 'För att redigera denna sida, vänligen svara på frågan som finns nedan ([[Special:Captcha/help|mer information]]):',
- 'questycaptcha-sendemail' => 'För att skydda mot automatisk spamning, vänligen svara på frågan som visas nedan ([[Special:Captcha/help|mer information]]):',
+ 'questycaptcha-sendemail' => 'För att skydda wikin mot automatiskt spam ber vid dig att svara på frågan som visas nedan ([[Special:Captcha/help|mer information]]):',
'questycaptchahelp-text' => "Webbplatser som accepterar bidrag från allmänheten, som denna wiki, blir ofta utnyttjade av spammare som använder automatiska verktyg för att lägga till sina linkar till många sajter.
Även om dessa spam-länkar kan tas bort är de väldigt störande.
Ibland, särskilt vid tillägg av nya webblänkar till en sida, kan wikin be dig svara på en fråga.
Eftersom denna uppgift är svår att automatisera, låter den de flesta riktiga människor göra sina bidrag medan den stoppar de flesta spammare och andra robotattackerare.
-Vänligen kontakta [[{{MediaWiki:Grouppage-sysop}}|sajtens administratörer]] för hjälp ifall detta oväntat förhindrar dig från att göra tillåtna bidrag.
+Vänligen kontakta [[Special:ListAdmins|sajtens administratörer]] för hjälp ifall detta oväntat förhindrar dig från att göra tillåtna bidrag.
Klicka 'tillbaka'-knappen i din webbläsare för att återvända till sidredigeraren.",
);
@@ -1192,7 +1246,7 @@ Klicka 'tillbaka'-knappen i din webbläsare för att återvända till sidrediger
*/
$messages['te'] = array(
'questycaptcha-addurl' => 'మీరౠచేసిన మారà±à°ªà±à°²à±‹ కొతà±à°¤ బయటి లింకà±à°²à± ఉనà±à°¨à°¾à°¯à°¿.
-ఆటోమేటెడౠసà±à°ªà°¾à°®à± à°¨à±à°‚à°¡à°¿ à°°à°•à±à°·à°£à°•à±ˆ, à°•à±à°°à°¿à°‚à°¦ కనిపించే à°ªà±à°°à°¶à±à°¨à°•à± సమాధానమివà±à°µà°‚à°¡à°¿ ([[Special:Captcha/help|మరింత సమాచారం]]):',
+ఆటోమేటెడౠసà±à°ªà°¾à°®à± à°¨à±à°‚à°¡à°¿ à°°à°•à±à°·à°£à°•à±ˆ, à°•à±à°°à°¿à°‚à°¦ కనిపించే à°ªà±à°°à°¶à±à°¨à°•à± సమాధానమివà±à°µà°‚à°¡à°¿ ([[Special:Captcha/help|మరింత సమాచారం]]):', # Fuzzy
'questycaptcha-edit' => 'à°ˆ పేజీని సరిదిదà±à°¦à°¡à°¾à°¨à°¿à°•à°¿, à°•à±à°°à°¿à°‚à°¦ కనిపించే à°ªà±à°°à°¶à±à°¨à°•à°¿ జవాబివà±à°µà°‚à°¡à°¿ ([[Special:Captcha/help|మరింత సమాచారం]]):',
);
@@ -1204,7 +1258,7 @@ $messages['th'] = array(
เนื่องจาà¸à¸à¸²à¸£à¹ƒà¸ªà¹ˆà¸¥à¸´à¸‡à¸à¹Œà¹€à¸›à¹‡à¸™à¹€à¸£à¸·à¹ˆà¸­à¸‡à¸¢à¸²à¸à¹ƒà¸™à¸à¸²à¸£à¸”ูà¹à¸¥à¹‚ดยอัตโนมัติ ในบางครั้ง โดยเฉพาะเมื่อคุณใส่ลิงà¸à¹Œà¹€à¸§à¹‡à¸šà¸ à¸²à¸¢à¸™à¸­à¸ ระบบวิà¸à¸´à¸­à¸²à¸ˆà¸‚อให้คุณตอบคำถาม เพื่อป้องà¸à¸±à¸™à¸™à¸±à¸à¸ªà¹à¸›à¸¡à¹à¸¥à¸°à¹‚รบอตโจมตีอื่น ๆ ทำà¸à¸²à¸£à¹à¸à¹‰à¹„ข à¹à¸•à¹ˆà¸ˆà¸°à¸­à¸™à¸¸à¸à¸²à¸•à¹ƒà¸«à¹‰à¸œà¸¹à¹‰à¸—ี่ใà¸à¸¥à¹‰à¹€à¸„ียงมนุษย์มาà¸à¸—ีุ่สุดà¹à¸à¹‰à¹„ขได้
-à¸à¸£à¸¸à¸“าติดต่อ [[{{MediaWiki:Grouppage-sysop}}|ผู้ดูà¹à¸¥à¸£à¸°à¸šà¸š]] หาà¸à¸à¸£à¸°à¸šà¸§à¸™à¸à¸²à¸£à¸™à¸µà¹‰à¹„ม่สามารถทำให้คุณà¹à¸à¹‰à¹„ขข้อมูลให้ถูà¸à¸•à¹‰à¸­à¸‡à¹„ด้
+à¸à¸£à¸¸à¸“าติดต่อ [[Special:ListAdmins|ผู้ดูà¹à¸¥à¸£à¸°à¸šà¸š]] หาà¸à¸à¸£à¸°à¸šà¸§à¸™à¸à¸²à¸£à¸™à¸µà¹‰à¹„ม่สามารถทำให้คุณà¹à¸à¹‰à¹„ขข้อมูลให้ถูà¸à¸•à¹‰à¸­à¸‡à¹„ด้
à¸à¸”ปุ่ม 'Back' บนเบราเซอร์ของคุณเพื่อà¸à¸¥à¸±à¸šà¹„ปยังหน้าà¹à¸à¹‰à¹„ข",
);
@@ -1215,18 +1269,18 @@ $messages['th'] = array(
$messages['tl'] = array(
'questycaptcha-desc' => 'Kaakit-akit na panlikha ng CAPTCHA na Questy para sa Pagtiyak ng Pagbago',
'questycaptcha-addurl' => 'Kasali sa pagbago mo ang bagong panglabas na mga kawing.
-Upang makatulong sa pagsanggalang laban sa kusang panglulusob, pakisagot ang tanong na nakalitaw sa ibaba ([[Special:Captcha/help|more info]]):',
- 'questycaptcha-badlogin' => 'Upang makatulong sa pagsasanggalang laban sa mga kusang paglutas ng hudyat, pakisagot lamang ang tanong na nakalitaw sa ibaba ([[Special:Captcha/help|marami pang kabatiran]]):',
- 'questycaptcha-createaccount' => 'Upang makatulong sa pagsasanggalang laban sa kusang paglikha ng akawnt, pakisagot ang tanong na nakalitaw sa ibaba ([[Special:Captcha/help|marami pang kabatiran]]):',
+Upang makatulong sa pagsanggalang laban sa kusang panglulusob, pakisagot ang tanong na nakalitaw sa ibaba ([[Special:Captcha/help|more info]]):', # Fuzzy
+ 'questycaptcha-badlogin' => 'Upang makatulong sa pagsasanggalang laban sa mga kusang paglutas ng hudyat, pakisagot lamang ang tanong na nakalitaw sa ibaba ([[Special:Captcha/help|marami pang kabatiran]]):', # Fuzzy
+ 'questycaptcha-createaccount' => 'Upang makatulong sa pagsasanggalang laban sa kusang paglikha ng akawnt, pakisagot ang tanong na nakalitaw sa ibaba ([[Special:Captcha/help|marami pang kabatiran]]):', # Fuzzy
'questycaptcha-create' => 'Upang malikha ang pahina, pakisagot ang tanong na nakalitaw sa ibaba ([[Special:Captcha/help|marami pang kabatiran]]):',
'questycaptcha-edit' => 'Upang mabago ang pahina, pakisagot ang tanong na nakalitaw sa ibaba ([[Special:Captcha/help|marami pang kabatiran]]):',
- 'questycaptcha-sendemail' => 'Upang makatulong sa pagsasanggalang laban sa mga kusang paglusob, pakisagot lamang ang tanong na nakalitaw sa ibaba ([[Special:Captcha/help|marami pang kabatiran]]):',
+ 'questycaptcha-sendemail' => 'Upang makatulong sa pagsasanggalang laban sa mga kusang paglusob, pakisagot lamang ang tanong na nakalitaw sa ibaba ([[Special:Captcha/help|marami pang kabatiran]]):', # Fuzzy
'questycaptchahelp-text' => "Ang mga websayt na tumatanggap ng mga ambag mula sa madla, katulad ng wiking ito, ay madalas abusuhin ng mga manlulusob na gumagamit ng kasangkapang pangkusa upang madagdag ang kanilang mga kawing sa maraming mga sayt.
Kung minsan, partikular na kapag nagdaragdag ng bagong mga kawing pangweb sa isang pahina, maaaring humiling ang wiki na sagutin mo ang isang tanong.
Dahil isa itong gawaing mahirap ikusa, magpapahintulot ito ng karamihan sa tunay na mga tao na gawin ang kanilang mga kontribusyon habang pinahihinto ang karamihan sa mga ispamer at iba pang mga makarobot na mga panglusob.
-Mangyaring makipag-ugnayan sa [[{{MediaWiki:Grouppage-sysop}}|mga tagapangasiwa ng sayt]] para sa pagtulong kung hindi inaasahang pigilan ka mula sa paggawa ng tunay na mga ambag.
+Mangyaring makipag-ugnayan sa [[Special:ListAdmins|mga tagapangasiwa ng sayt]] para sa pagtulong kung hindi inaasahang pigilan ka mula sa paggawa ng tunay na mga ambag.
Pindutin ang pindutang 'bumalik' sa iyong pantingin-tingin upang makabalik sa pambago ng pahina.",
);
@@ -1237,41 +1291,42 @@ Pindutin ang pindutang 'bumalik' sa iyong pantingin-tingin upang makabalik sa pa
*/
$messages['tr'] = array(
'questycaptcha-addurl' => 'Değişikliğiniz yeni dış bağlantı içeriyor.
-Otomatik reklama karşı korunmaya yardımcı olmak için, lütfen ([[Special:Captcha/help|daha fazla bilgi]]) bölümünün altında yer alan soruya cevap verin:',
- 'questycaptcha-badlogin' => 'Otomatik şifre kırmaya karşı korunmaya yardımcı olmak için, lütfen ([[Special:Captcha/help|daha fazla bilgi]]) bölümünün altında yer alan soruya cevap verin:',
- 'questycaptcha-createaccount' => 'Otomatik hesap oluşturmaya karşı korunmaya yardımcı olmak için, lütfen ([[Special:Captcha/help|daha fazla bilgi]]) bölümünün altında yer alan soruya cevap verin:',
+Otomatik reklama karşı korunmaya yardımcı olmak için, lütfen ([[Special:Captcha/help|daha fazla bilgi]]) bölümünün altında yer alan soruya cevap verin:', # Fuzzy
+ 'questycaptcha-badlogin' => 'Otomatik şifre kırmaya karşı korunmaya yardımcı olmak için, lütfen ([[Special:Captcha/help|daha fazla bilgi]]) bölümünün altında yer alan soruya cevap verin:', # Fuzzy
+ 'questycaptcha-createaccount' => 'Otomatik hesap oluşturmaya karşı korunmaya yardımcı olmak için, lütfen ([[Special:Captcha/help|daha fazla bilgi]]) bölümünün altında yer alan soruya cevap verin:', # Fuzzy
'questycaptcha-create' => 'Sayfayı oluşturmak için, lütfen ([[Special:Captcha/help|daha fazla bilgi]]) bölümünün altında yer alan soruya cevap verin:',
'questycaptcha-edit' => 'Sayfayı değiştirmek için, lütfen ([[Special:Captcha/help|daha fazla bilgi]]) bölümünün altında yer alan soruya cevap verin:',
- 'questycaptcha-sendemail' => 'Otomatik spamlerden korunmaya yardımcı olmak için, lütfen aşağıda görünen soruyu cevaplayın ([[Special:Captcha/help|daha fazla bilgi]]):',
+ 'questycaptcha-sendemail' => 'Otomatik spamlerden korunmaya yardımcı olmak için, lütfen aşağıda görünen soruyu cevaplayın ([[Special:Captcha/help|daha fazla bilgi]]):', # Fuzzy
'questycaptchahelp-text' => "Bu viki gibi herkesin katkı yapmasına izin veren web siteleri, genellikle bir çok siteye verilen bağlantıları ekleyen otomatik araçlar kullanan reklam amaçlı kullanıcılar tarafından istismar edilmektedir.
Bu reklam bağlantıları kaldırılabiliyor olsa da, önemli bir sıkıntı yaratmaktadırlar.
Bazen, özellikle bir sayfaya yeni web bağlantıları eklenirken, viki size bir soru sorabilir.
Bu, otomatikleştirilmesi zor bir iş olduğu için, insanların katkılarını yapmasını mümkün kılarken çoğu reklam amaçlı kullanıcıyı ya da robot saldırganı durduracaktır.
-Bu durumun sizi normal katkılarınızı yapmaktan olağandışı bir şekilde alıkoyması halinde, lütfen destek için [[{{MediaWiki:Grouppage-sysop}}|site hizmetlileri]] ile irtibata geçin.
+Bu durumun sizi normal katkılarınızı yapmaktan olağandışı bir şekilde alıkoyması halinde, lütfen destek için [[Special:ListAdmins|site hizmetlileri]] ile irtibata geçin.
Sayfa editörüne dönmek için tarayıcınızın 'geri' düğmesine tıklayın.",
);
/** Ukrainian (українÑька)
+ * @author Andriykopanytsia
* @author Diemon.ukr
*/
$messages['uk'] = array(
'questycaptcha-addurl' => 'Ваше Ñ€ÐµÐ´Ð°Ð³ÑƒÐ²Ð°Ð½Ð½Ñ Ð¼Ñ–Ñтить нові зовнішні поÑиланнÑ.
-Із метою захиÑту від Ñпаму, будь лаÑка, дайте відповідь на питаннÑ, що наводитьÑÑ Ð½Ð¸Ð¶Ñ‡Ðµ ([[Special:Captcha/help|докладніше]]):',
- 'questycaptcha-badlogin' => 'Із метою захиÑту від автоматичного підбору паролÑ, будь лаÑка, дайте відповідь на питаннÑ, що наводитьÑÑ Ð½Ð¸Ð¶Ñ‡Ðµ ([[Special:Captcha/help|докладніше]]):',
- 'questycaptcha-createaccount' => 'Із метою захиÑту від автоматичного ÑÑ‚Ð²Ð¾Ñ€ÐµÐ½Ð½Ñ Ð¾Ð±Ð»Ñ–ÐºÐ¾Ð²Ð¸Ñ… запиÑів, будь лаÑка, дайте відповідь на питаннÑ, що наводитьÑÑ Ð½Ð¸Ð¶Ñ‡Ðµ ([[Special:Captcha/help|докладніше]]):',
+Із метою захиÑту вікі від Ñпаму проÑимо Ð²Ð°Ñ Ð´Ð°Ñ‚Ð¸ відповідь на питаннÑ, що наводитьÑÑ Ð½Ð¸Ð¶Ñ‡Ðµ ([[Special:Captcha/help|докладніше]]):',
+ 'questycaptcha-badlogin' => 'Із метою захиÑту вікі від автоматичного підбору паролÑ, проÑимо Ð²Ð°Ñ Ð´Ð°Ñ‚Ð¸ відповідь на питаннÑ, що наводитьÑÑ Ð½Ð¸Ð¶Ñ‡Ðµ ([[Special:Captcha/help|докладніше]]):',
+ 'questycaptcha-createaccount' => 'Із метою захиÑту вікі від автоматичного ÑÑ‚Ð²Ð¾Ñ€ÐµÐ½Ð½Ñ Ð¾Ð±Ð»Ñ–ÐºÐ¾Ð²Ð¸Ñ… запиÑів проÑимо Ð²Ð°Ñ Ð´Ð°Ñ‚Ð¸ відповідь на питаннÑ, що наводитьÑÑ Ð½Ð¸Ð¶Ñ‡Ðµ ([[Special:Captcha/help|докладніше]]):',
'questycaptcha-create' => 'Щоб Ñтворити Ñторінку, будь лаÑка, дайте відповідь на питаннÑ, що наводитьÑÑ Ð½Ð¸Ð¶Ñ‡Ðµ ([[Special:Captcha/help|докладніше]]):',
'questycaptcha-edit' => 'Щоб редагувати цю Ñторінку, будь лаÑка, дайте відповідь на питаннÑ, що наводитьÑÑ Ð½Ð¸Ð¶Ñ‡Ðµ ([[Special:Captcha/help|докладніше]]):',
- 'questycaptcha-sendemail' => 'Із метою захиÑту від автоматичного Ñпаму, будь лаÑка, дайте відповідь на питаннÑ, що наводитьÑÑ Ð½Ð¸Ð¶Ñ‡Ðµ ([[Special:Captcha/help|докладніше]]):',
+ 'questycaptcha-sendemail' => 'Із метою захиÑту вікі від автоматичного Ñпаму проÑимо Ð²Ð°Ñ Ð´Ð°Ñ‚Ð¸ відповідь на питаннÑ, що наводитьÑÑ Ð½Ð¸Ð¶Ñ‡Ðµ ([[Special:Captcha/help|докладніше]]):',
'questycaptchahelp-text' => 'Сайти, Ñкі надають можливіÑÑ‚ÑŒ змінювати Ñвій зміÑÑ‚, Ñк це вікі, чаÑто Ñ” міÑцем Ð·Ð»Ð¾Ð²Ð¶Ð¸Ð²Ð°Ð½Ð½Ñ Ñпамерів, Ñкі викориÑтовують автоматизовані інÑтрументи Ð´Ð»Ñ Ð´Ð¾Ð´Ð°Ð²Ð°Ð½Ð½Ñ Ð¿Ð¾Ñилань на інші Ñайти.
Хоча ці Ñпам-поÑÐ¸Ð»Ð°Ð½Ð½Ñ Ð¼Ð¾Ð¶ÑƒÑ‚ÑŒ бути вилучені, вони Ñ” Ñуттєвим негативним чинником.
Іноді, оÑобливо при додаванні нових поÑилань веб-Ñторінки, вікі може попроÑити Ð²Ð°Ñ Ð²Ñ–Ð´Ð¿Ð¾Ð²Ñ–Ñти на запитаннÑ.
Це Ñ” завданнÑм, Ñке важко автоматизувати, тому воно дозволить більшоÑÑ‚Ñ– реальних людей зробити Ñвій внеÑок, Ñ– в той же Ñ‡Ð°Ñ Ð·ÑƒÐ¿Ð¸Ð½Ð¸Ñ‚ÑŒ більшіÑÑ‚ÑŒ Ñпамерів та інших роботизованих нападників.
-Будь лаÑка, зв\'ÑжітьÑÑ Ð· [[{{MediaWiki:Grouppage-sysop}}|адмініÑтраторами Ñайту]] по допомогу, Ñкщо Ñ†Ñ ÑиÑтема не дозволÑÑ” вам робити допуÑтимий внеÑок.
+Будь лаÑка, зв\'ÑжітьÑÑ Ð· [[Special:ListAdmins|адмініÑтраторами Ñайту]] по допомогу, Ñкщо Ñ†Ñ ÑиÑтема не дозволÑÑ” вам робити допуÑтимий внеÑок.
ÐатиÑніть на кнопку "назад" у браузері, щоб повернутиÑÑ Ð½Ð° Ñторінку редагуваннÑ.',
);
@@ -1281,18 +1336,18 @@ $messages['uk'] = array(
*/
$messages['wa'] = array(
'questycaptcha-addurl' => "Dins vos candjmints i gn a des dfoûtrinnès hårdêyes (URL).
-Po s' mete a houte des robots di spam, nos vs dimandans d' acertiner ki vos estoz bén ene djin, po çoula respondez al kesse chal pa dzo ([[Special:Captcha/help|pus di racsegnes]]):",
- 'questycaptcha-badlogin' => "Po s' mete a houte des des robots ki sayèt d' adviner les screts, nos vs dimandans d' acertiner ki vos estoz bén ene djin, po çoula respondez al kesse chal pa dzo ([[Special:Captcha/help|pus di racsegnes]]):",
- 'questycaptcha-createaccount' => "Po s' mete a houte des des robots k' ahivèt des contes otomaticmint, nos vs dimandans d' acertiner ki vos estoz bén ene djin, po çoula respondez al kesse chal pa dzi ([[Special:Captcha/help|pus di racsegnes]]):",
+Po s' mete a houte des robots di spam, nos vs dimandans d' acertiner ki vos estoz bén ene djin, po çoula respondez al kesse chal pa dzo ([[Special:Captcha/help|pus di racsegnes]]):", # Fuzzy
+ 'questycaptcha-badlogin' => "Po s' mete a houte des des robots ki sayèt d' adviner les screts, nos vs dimandans d' acertiner ki vos estoz bén ene djin, po çoula respondez al kesse chal pa dzo ([[Special:Captcha/help|pus di racsegnes]]):", # Fuzzy
+ 'questycaptcha-createaccount' => "Po s' mete a houte des des robots k' ahivèt des contes otomaticmint, nos vs dimandans d' acertiner ki vos estoz bén ene djin, po çoula respondez al kesse chal pa dzi ([[Special:Captcha/help|pus di racsegnes]]):", # Fuzzy
'questycaptcha-create' => "Por vos poleur ahiver l' pådje, vos dvoz responde al kesse chal pa dzo ([[Special:Captcha/help|pus di racsegnes]]):",
'questycaptcha-edit' => 'Po candjî cisse pådje ci, vos dvoz responde al kesse chal pa dzo ([[Special:Captcha/help|pus di racsegnes]]):',
- 'questycaptcha-sendemail' => "Po s' mete a houte des robots di spam, nos vs dimandans d' acertiner ki vos estoz bén ene djin, po çoula respondez al kesse chal pa dzo ([[Special:Captcha/help|pus di racsegnes]]):",
+ 'questycaptcha-sendemail' => "Po s' mete a houte des robots di spam, nos vs dimandans d' acertiner ki vos estoz bén ene djin, po çoula respondez al kesse chal pa dzo ([[Special:Captcha/help|pus di racsegnes]]):", # Fuzzy
'questycaptchahelp-text' => "Les waibes k' acceptèt des messaedjes do publik, come ci wiki chal, sont sovint eployîs pa des må-fjhants spameus, po pleur mete, avou des usteyes otomatikes, des loyéns di rclame viè les sites da zels.
Bén seur, on pout todi les disfacer al mwin, mins c' est on soyant ovraedje.
Adon, pa côps, copurade cwand vos radjoutez des hårdêyes a ene pådje, on eployrè ene passete d' acertinaedje, dj' ô bén k' on vs dimandrè d' responde a ene kesse. Come çoula est ene sacwè d' målåjheye a fé otomaticmint pa on robot, çoula permete di leyî les vraiyès djins fé leus candjmints tot arestant l' plupårt des spameus et des sfwaitès atakes pa robot.
-S' i vs plait contactez les [[{{MediaWiki:Grouppage-sysop}}|manaedjeus do site]] po d' l' aidance si çoula vos espaitche di fé vos candjmints ledjitimes.
+S' i vs plait contactez les [[Special:ListAdmins|manaedjeus do site]] po d' l' aidance si çoula vos espaitche di fé vos candjmints ledjitimes.
Clitchîz sol boton «En erî» di vosse betchteu waibe po rivni al pådje di dvant.",
);
@@ -1306,32 +1361,41 @@ $messages['yi'] = array(
/** Simplified Chinese (中文(简体)‎)
* @author Cwek
+ * @author Fantasticfears
*/
$messages['zh-hans'] = array(
- 'questycaptcha-addurl' => '您的编辑内容中å«æœ‰æœ¬ç½‘站以外的连结。为防止ä¸å½“程å¼å¤§é‡ç ´å,请回答以下的问题([[Special:Captcha/help|相关资讯]]):',
- 'questycaptcha-badlogin' => '为防止ä¸å½“程å¼ç ´è§£å¯†ç ï¼Œè¯·å›žç­”以下的问题([[Special:Captcha/help|相关资讯]]):',
- 'questycaptcha-createaccount' => '为防止ä¸å½“程å¼å¤§é‡å»ºç«‹å¸æˆ·ï¼Œè¯·å›žç­”以下的问题([[Special:Captcha/help|相关资讯]]):',
+ 'questycaptcha-addurl' => '您的编辑内容中å«æœ‰æœ¬ç½‘站以外的连结。为防止自动程åºåžƒåœ¾ç¼–辑,请回答以下的问题([[Special:Captcha/help|更多信æ¯]]):',
+ 'questycaptcha-badlogin' => '为防止自动程åºç ´è§£å¯†ç ï¼Œè¯·å›žç­”以下的问题([[Special:Captcha/help|更多信æ¯]]):',
+ 'questycaptcha-createaccount' => '为防止ä¸å½“程å¼å¤§é‡å»ºç«‹å¸æˆ·ï¼Œè¯·å›žç­”以下的问题([[Special:Captcha/help|更多信æ¯]]):',
'questycaptcha-create' => '为防止ä¸å½“程å¼å¤§é‡å»ºç«‹é¡µé¢ï¼Œè¯·å›žç­”以下问题([[Special:Captcha/help|相关资讯]]):',
'questycaptcha-edit' => '为防破å,如您想è¦ç¼–辑此页é¢ï¼Œè¯·å›žç­”以下的问题([[Special:Captcha/help|相关资讯]]):',
- 'questycaptcha-sendemail' => '为防止ä¸å½“程å¼ç ´è§£å¯†ç ï¼Œè¯·å›žç­”下列问题([[Special:Captcha/help|相关资讯]]):',
+ 'questycaptcha-sendemail' => '为防止ä¸å½“程å¼ç ´è§£å¯†ç ï¼Œè¯·å›žç­”下列问题([[Special:Captcha/help|更多信æ¯]]):',
'questycaptchahelp-text' => 'åƒæœ¬ç«™ä¸€æ ·ï¼Œå¯¹å…¬ä¼—开放编辑的网站ç»å¸¸è¢«åžƒåœ¾è¿žç»“骚扰。那些人使用自动化垃圾程åºå°†ä»–们的连结张贴到很多网站。虽然这些连结å¯ä»¥è¢«æ¸…除,但是这些东西确实令人å分讨厌。
有时,特别是当给一个页é¢æ·»åŠ æ–°çš„网页链接时,本站会让你看一幅有颜色的或者有å˜å½¢æ–‡å­—的图åƒï¼Œå¹¶ä¸”è¦ä½ è¾“入所显示的文字。因为这是难以自动完æˆçš„一项任务,它将å…许人ä¿å­˜ä»–们的编辑,åŒæ—¶é˜»æ­¢å¤§å¤šæ•°å‘é€åžƒåœ¾é‚®ä»¶è€…和其他机器人的攻击。
-令人é—憾是,这会使得视力ä¸å¥½çš„人,或者使用基於文本或者基於声音的æµè§ˆå™¨çš„用户感到ä¸ä¾¿ã€‚而目å‰æˆ‘们还没有æ供的音频的选择。如果这正好阻止你进行正常的编辑,请和[[{{MediaWiki:Grouppage-sysop}}|站点管ç†å‘˜]]è”系获得帮助。
+令人é—憾是,这会使得视力ä¸å¥½çš„人,或者使用基於文本或者基於声音的æµè§ˆå™¨çš„用户感到ä¸ä¾¿ã€‚而目å‰æˆ‘们还没有æ供的音频的选择。如果这正好阻止你进行正常的编辑,请和[[Special:ListAdmins|站点管ç†å‘˜]]è”系获得帮助。
点击æµè§ˆå™¨ä¸­çš„“åŽé€€â€æŒ‰é’®è¿”回你所编辑的页é¢ã€‚',
);
/** Traditional Chinese (中文(ç¹é«”)‎)
* @author Horacewai2
+ * @author Justincheng12345
* @author Waihorace
*/
$messages['zh-hant'] = array(
- 'questycaptcha-addurl' => '您的編輯內容中å«æœ‰æœ¬ç¶²ç«™ä»¥å¤–的連çµã€‚為防止ä¸ç•¶ç¨‹å¼å¤§é‡ç ´å£žï¼Œè«‹å›žç­”以下的å•é¡Œï¼ˆ[[Special:Captcha/help|相關資訊]]):',
- 'questycaptcha-badlogin' => '為防止ä¸ç•¶ç¨‹å¼ç ´è§£å¯†ç¢¼ï¼Œè«‹å›žç­”以下的å•é¡Œï¼ˆ[[Special:Captcha/help|相關資訊]]):',
- 'questycaptcha-createaccount' => '為防止ä¸ç•¶ç¨‹å¼å¤§é‡å»ºç«‹å¸³æˆ¶ï¼Œè«‹å›žç­”以下的å•é¡Œï¼ˆ[[Special:Captcha/help|相關資訊]]):',
+ 'questycaptcha-addurl' => '您的編輯內容中å«æœ‰æœ¬ç¶²ç«™ä»¥å¤–的連çµã€‚為防止ä¸ç•¶ç¨‹å¼å¤§é‡ç ´å£žï¼Œè«‹å›žç­”以下的å•é¡Œï¼ˆ[[Special:Captcha/help|相關資訊]]):', # Fuzzy
+ 'questycaptcha-badlogin' => '為防止ä¸ç•¶ç¨‹å¼ç ´è§£å¯†ç¢¼ï¼Œè«‹å›žç­”以下的å•é¡Œï¼ˆ[[Special:Captcha/help|相關資訊]]):', # Fuzzy
+ 'questycaptcha-createaccount' => '為防止ä¸ç•¶ç¨‹å¼å¤§é‡å»ºç«‹å¸³æˆ¶ï¼Œè«‹å›žç­”以下的å•é¡Œï¼ˆ[[Special:Captcha/help|相關資訊]]):', # Fuzzy
'questycaptcha-create' => '為防止ä¸ç•¶ç¨‹å¼å¤§é‡å»ºç«‹é é¢ï¼Œè«‹å›žç­”以下å•é¡Œï¼ˆ[[Special:Captcha/help|相關資訊]]):',
'questycaptcha-edit' => '為防破壞,如您想è¦ç·¨è¼¯æ­¤é é¢ï¼Œè«‹å›žç­”以下的å•é¡Œï¼ˆ[[Special:Captcha/help|相關資訊]]):',
- 'questycaptcha-sendemail' => '為防止ä¸ç•¶ç¨‹å¼ç ´è§£å¯†ç¢¼ï¼Œè«‹å›žç­”下列å•é¡Œï¼ˆ[[Special:Captcha/help|相關資訊]]):',
+ 'questycaptcha-sendemail' => '為防止ä¸ç•¶ç¨‹å¼ç ´è§£å¯†ç¢¼ï¼Œè«‹å›žç­”下列å•é¡Œï¼ˆ[[Special:Captcha/help|相關資訊]]):', # Fuzzy
+ 'questycaptchahelp-text' => 'åƒæœ¬ç¶­åŸºä¸€æ ·ï¼Œå°å…¬çœ¾é–‹æ”¾ç·¨è¼¯çš„網站經常å—垃圾連çµé¨·æ“¾ã€‚那些人使用自動化程å¼å°‡ä»–們的連çµå¼µè²¼è‡³å¾ˆå¤šç¶²ç«™ã€‚雖然å¯ä»¥æ¸…除這些連çµï¼Œä½†æ˜¯é€™äº›é€£çµçš„確å分討厭。
+
+有時,特别是為æŸä¸€é é¢åŠ å…¥æ–°é€£çµæ™‚,本維基會讓你看一幅有é¡è‰²æˆ–變形文字的圖片,並è¦æ±‚你輸入圖片中顯示的文字。因為此項任務難以自動完æˆï¼Œå®ƒå°‡å…許人類繼續儲存其編輯,åŒæ™‚阻止大多數發é€åžƒåœ¾éƒµä»¶çš„人和其他機械人的攻擊。
+
+令人éºæ†¾æ˜¯ï¼Œé€™æœƒä½¿è¦–力ä¸å¥½çš„人或者使用基於文本或è²éŸ³çš„ç€è¦½å™¨ç”¨æˆ¶æ„Ÿåˆ°ä¸ä¾¿ã€‚然而我們目å‰å°šæœªæ供音頻é¸æ“‡ã€‚如果這阻止了你進行正常編輯,請與[[Special:ListAdmins|管ç†å“¡]]è¯ç¹«ç²å¾—幫助。
+
+按下ç€è¦½å™¨çš„「返回ã€æŒ‰éˆ•å›žåˆ°ä½ æ‰€ç·¨è¼¯çš„é é¢ã€‚',
);
diff --git a/extensions/ConfirmEdit/ReCaptcha.i18n.php b/extensions/ConfirmEdit/ReCaptcha.i18n.php
index e8722f93..9e2c4781 100644
--- a/extensions/ConfirmEdit/ReCaptcha.i18n.php
+++ b/extensions/ConfirmEdit/ReCaptcha.i18n.php
@@ -10,15 +10,16 @@ $messages = array();
$messages['en'] = array(
'recaptcha-desc' => 'reCAPTCHA module for Confirm Edit',
- 'recaptcha-edit' => 'To help protect against automated edit spam, please type the two words you see in the box below:',
- 'recaptcha-addurl' => 'Your edit includes new external links. To help protect against automated spam, please type the two words you see in the box below:',
- 'recaptcha-badpass' => 'To help protect against automated password cracking, please type the two words you see in the box below:',
- 'recaptcha-createaccount' => 'To help protect against automated account creation, please type the two words you see in the box below:',
+ 'recaptcha-edit' => 'To protect the wiki against automated edit spam, we kindly ask you to type the two words you see in the box below:',
+ 'recaptcha-addurl' => 'Your edit includes new external links. To protect the wiki against automated spam, we kindly ask you to type the two words you see in the box below:',
+ 'recaptcha-badlogin' => 'To protect the wiki against automated password cracking, we kindly ask you to type the two words you see in the box below:',
+ 'recaptcha-createaccount' => 'To protect the wiki against automated account creation, we kindly ask you to type the two words you see in the box below:',
'recaptcha-createaccount-fail' => "Incorrect or missing reCAPTCHA answer.",
- 'recaptcha-create' => 'To help protect against automated page creation, please type the two words you see in the box below:',
+ 'recaptcha-create' => 'To protect the wiki against automated page creation, we kindly ask you to type the two words you see in the box below:',
);
/** Message documentation (Message documentation)
+ * @author Raymond
* @author Shirayuki
* @author Umherirrender
*/
@@ -27,7 +28,7 @@ $messages['qqq'] = array(
{{desc}}',
'recaptcha-edit' => '{{Related|ConfirmEdit-edit}}',
'recaptcha-addurl' => '{{Related|ConfirmEdit-addurl}}',
- 'recaptcha-badpass' => '{{Related|ConfirmEdit-badlogin}}',
+ 'recaptcha-badlogin' => '{{Related|ConfirmEdit-badlogin}}',
'recaptcha-createaccount' => '{{Related|ConfirmEdit-createaccount}}',
'recaptcha-createaccount-fail' => '{{Related|ConfirmEdit-createaccount-fail}}',
'recaptcha-create' => '{{Related|ConfirmEdit-create}}',
@@ -40,24 +41,24 @@ $messages['qqq'] = array(
*/
$messages['ar'] = array(
'recaptcha-desc' => 'موديل reCAPTCHA لConfirm Edit',
- 'recaptcha-edit' => 'للمساعدة ÙÙŠ الحماية ضد التحرير السبام، يرجى كتابة الكلمتين التي تراها ÙÙŠ المربع أدناه :',
- 'recaptcha-addurl' => 'إن تعديلك يتضمن وصلات خارجية جديدة. للمساعدة ÙÙŠ الحماية ضد السبام، يرجى كتابة الكلمتين التي تراها ÙÙŠ المربع أدناه :',
- 'recaptcha-badpass' => 'للمساعدة ÙÙŠ الحماية ضد الكسر الآلي لكلمة السر، يرجى كتابة الكلمتين اللتين تراهما ÙÙŠ المربع أدناه :',
- 'recaptcha-createaccount' => 'للمساعدة ÙÙŠ الحماية ضد الإنشاء الآلي للحسابات، رجاء اكتب الكلمتين اللتين تراهما ÙÙŠ المربع أدناه:',
+ 'recaptcha-edit' => 'للمساعدة ÙÙŠ الحماية ضد التحرير السبام، يرجى كتابة الكلمتين التي تراها ÙÙŠ المربع أدناه :', # Fuzzy
+ 'recaptcha-addurl' => 'إن تعديلك يتضمن وصلات خارجية جديدة. للمساعدة ÙÙŠ الحماية ضد السبام، يرجى كتابة الكلمتين التي تراها ÙÙŠ المربع أدناه :', # Fuzzy
+ 'recaptcha-badlogin' => 'للمساعدة ÙÙŠ الحماية ضد الكسر الآلي لكلمة السر، يرجى كتابة الكلمتين اللتين تراهما ÙÙŠ المربع أدناه :', # Fuzzy
+ 'recaptcha-createaccount' => 'للمساعدة ÙÙŠ الحماية ضد الإنشاء الآلي للحسابات، رجاء اكتب الكلمتين اللتين تراهما ÙÙŠ المربع أدناه:', # Fuzzy
'recaptcha-createaccount-fail' => 'جواب reCAPTCHA غير صحيح أو Ù…Ùقود.',
- 'recaptcha-create' => 'للمساعدة ÙÙŠ الحماية ضد الإنشاء الآلي للصÙحات، يرجى كتابة الكلمتين اللتين تراهما ÙÙŠ المربع أدناه :',
+ 'recaptcha-create' => 'للمساعدة ÙÙŠ الحماية ضد الإنشاء الآلي للصÙحات، يرجى كتابة الكلمتين اللتين تراهما ÙÙŠ المربع أدناه :', # Fuzzy
);
/** Asturian (asturianu)
* @author Xuacu
*/
$messages['ast'] = array(
- 'recaptcha-edit' => "P'ayudar a protexenos escontra'l spam d'edición, escribi les dos pallabres que se ven na caxella d'abaxo:",
- 'recaptcha-addurl' => "La to edición incluye enllaces esternos nuevos. P'ayudar a protexenos escontra'l spam automáticu, escribi les dos pallabres que se ven na caxella d'abaxo:",
- 'recaptcha-badpass' => "P'ayudar a protexenos escontra'l frañimientu de claves automáticu, escribi les dos pallabres que se ven na caxella d'abaxo:",
- 'recaptcha-createaccount' => "P'ayudar a protexenos escontra la creación de cuentes automática, escribi les dos pallabres que se ven na caxella d'abaxo:",
+ 'recaptcha-edit' => "Pa protexer la wiki escontra'l spam d'edición automáticu, pidimos-y qu'escriba les dos pallabres que se ven na caxella d'abaxo:",
+ 'recaptcha-addurl' => "La so edición incluye enllaces esternos nuevos. Pa protexer la wiki escontra'l spam automáticu, pidimos-y qu'escriba les dos pallabres que se ven na caxella d'abaxo:",
+ 'recaptcha-badlogin' => "Pa protexer la wiki escontra'l descifráu de claves automáticu, pidimos-y qu'escriba les dos pallabres que se ven na caxella d'abaxo:",
+ 'recaptcha-createaccount' => "Pa protexer la wiki escontra la creación de cuentes automática, pidimos-y qu'escriba les dos pallabres que se ven na caxella d'abaxo:",
'recaptcha-createaccount-fail' => 'Falta la rempuesta a la entruga de reCAPTCHA o ye incorreuta',
- 'recaptcha-create' => "P'ayudar a protexenos escontra la creación de páxines automática, escribi les dos pallabres que se ven na caxella d'abaxo:",
+ 'recaptcha-create' => "Pa protexer la wiki escontra la creación de páxines automática, pidimos-y qu'escriba les dos pallabres que se ven na caxella d'abaxo:",
);
/** Belarusian (TaraÅ¡kievica orthography) (беларуÑÐºÐ°Ñ (тарашкевіца)‎)
@@ -65,36 +66,37 @@ $messages['ast'] = array(
* @author Jim-by
*/
$messages['be-tarask'] = array(
- 'recaptcha-edit' => 'Ð”Ð»Ñ Ð°Ð±Ð°Ñ€Ð¾Ð½Ñ‹ Ñупраць Ñпаму, калі лаÑка, увÑдзіце два Ñловы, ÑÐºÑ–Ñ Ð’Ñ‹ бачыце Ñž полі ніжÑй:',
- 'recaptcha-addurl' => 'Вашае Ñ€Ñдагаваньне ўтрымлівае Ð½Ð¾Ð²Ñ‹Ñ Ð²Ð¾Ð½ÐºÐ°Ð²Ñ‹Ñ ÑпаÑылкі. Ð”Ð»Ñ Ð°Ð±Ð°Ñ€Ð¾Ð½Ñ‹ Ñупраць Ñпаму, калі лаÑка, увÑдзіце два Ñловы, ÑÐºÑ–Ñ Ð’Ñ‹ бачыце Ñž полі ніжÑй:',
- 'recaptcha-badpass' => 'Ð”Ð»Ñ Ð°Ð±Ð°Ñ€Ð¾Ð½Ñ‹ Ñупраць узлому паролю, калі лаÑка, увÑдзіце два Ñловы, ÑÐºÑ–Ñ Ð’Ñ‹ бачыце Ñž полі ніжÑй:',
- 'recaptcha-createaccount' => 'Ð”Ð»Ñ Ð°Ð±Ð°Ñ€Ð¾Ð½Ñ‹ Ñупраць аўтаматычнага ÑтварÑÐ½ÑŒÐ½Ñ Ñ€Ð°Ñ…ÑƒÐ½ÐºÐ°Ñž, калі лаÑка, увÑдзіце два Ñловы, ÑÐºÑ–Ñ Ð’Ñ‹ бачыце Ñž полі ніжÑй:',
+ 'recaptcha-edit' => 'Ð”Ð»Ñ Ð°Ð±Ð°Ñ€Ð¾Ð½Ñ‹ Ñупраць Ñпаму, калі лаÑка, увÑдзіце два Ñловы, ÑÐºÑ–Ñ Ð’Ñ‹ бачыце Ñž полі ніжÑй:', # Fuzzy
+ 'recaptcha-addurl' => 'Вашае Ñ€Ñдагаваньне ўтрымлівае Ð½Ð¾Ð²Ñ‹Ñ Ð²Ð¾Ð½ÐºÐ°Ð²Ñ‹Ñ ÑпаÑылкі. Ð”Ð»Ñ Ð°Ð±Ð°Ñ€Ð¾Ð½Ñ‹ Ñупраць Ñпаму, калі лаÑка, увÑдзіце два Ñловы, ÑÐºÑ–Ñ Ð’Ñ‹ бачыце Ñž полі ніжÑй:', # Fuzzy
+ 'recaptcha-badlogin' => 'Ð”Ð»Ñ Ð°Ð±Ð°Ñ€Ð¾Ð½Ñ‹ Ñупраць узлому паролю, калі лаÑка, увÑдзіце два Ñловы, ÑÐºÑ–Ñ Ð’Ñ‹ бачыце Ñž полі ніжÑй:', # Fuzzy
+ 'recaptcha-createaccount' => 'Ð”Ð»Ñ Ð°Ð±Ð°Ñ€Ð¾Ð½Ñ‹ Ñупраць аўтаматычнага ÑтварÑÐ½ÑŒÐ½Ñ Ñ€Ð°Ñ…ÑƒÐ½ÐºÐ°Ñž, калі лаÑка, увÑдзіце два Ñловы, ÑÐºÑ–Ñ Ð’Ñ‹ бачыце Ñž полі ніжÑй:', # Fuzzy
'recaptcha-createaccount-fail' => 'Ðдказ reCAPTCHA нÑÑлушны ці адÑутнічае.',
- 'recaptcha-create' => 'Ð”Ð»Ñ Ð°Ð±Ð°Ñ€Ð¾Ð½Ñ‹ Ñупраць аўтаматычнага ÑтварÑÐ½ÑŒÐ½Ñ Ñтаронак, калі лаÑка, увÑдзіце два Ñловы, ÑÐºÑ–Ñ Ð’Ñ‹ бачыце Ñž полі ніжÑй:',
+ 'recaptcha-create' => 'Ð”Ð»Ñ Ð°Ð±Ð°Ñ€Ð¾Ð½Ñ‹ Ñупраць аўтаматычнага ÑтварÑÐ½ÑŒÐ½Ñ Ñтаронак, калі лаÑка, увÑдзіце два Ñловы, ÑÐºÑ–Ñ Ð’Ñ‹ бачыце Ñž полі ніжÑй:', # Fuzzy
);
/** Breton (brezhoneg)
+ * @author Fohanno
* @author Fulup
*/
$messages['br'] = array(
- 'recaptcha-edit' => "Da sikour en em wareziñ diouzh ar stroboù emgefre, merkit an daou c'her a welit er voest dindan :",
- 'recaptcha-addurl' => "Liamm diavaez nevez zo bet degaset ganeoc'h. Da sikour en em wareziñ diouzh ar stroboù, merkit an daou c'her a welit er voest dindan :",
- 'recaptcha-badpass' => "Da sikour en em wareziñ diouzh an diskuliañ gerioù-tremen emgefre dre daolioù-esae, merkit an daou c'her a welit er voest dindan :",
- 'recaptcha-createaccount' => "Da sikour en em wareziñ diouzh ar c'hrouiñ kontoù emgefre, merkit an daou c'her a welit er voest dindan :",
+ 'recaptcha-edit' => "Evit sikour en em wareziñ diouzh ar stroboù emgefre, merkit an daou c'her a welit er voest dindan :",
+ 'recaptcha-addurl' => "Liamm diavaez nevez zo bet degaset ganeoc'h. Evit sikour en em wareziñ diouzh ar stroboù, merkit an daou c'her a welit er voest dindan :",
+ 'recaptcha-badlogin' => "Da sikour en em wareziñ diouzh an diskuliañ gerioù-tremen emgefre dre daolioù-esae, merkit an daou c'her a welit er voest dindan :", # Fuzzy
+ 'recaptcha-createaccount' => "Da sikour en em wareziñ diouzh ar c'hrouiñ kontoù emgefre, merkit an daou c'her a welit er voest dindan :", # Fuzzy
'recaptcha-createaccount-fail' => 'Respont reCAPTHCA faziek pe ezvezant.',
- 'recaptcha-create' => "Da sikour en em wareziñ diouzh ar c'hrouiñ pajennoù emgefre, merkit an daou c'her a welit er voest dindan :",
+ 'recaptcha-create' => "Da sikour en em wareziñ diouzh ar c'hrouiñ pajennoù emgefre, merkit an daou c'her a welit er voest dindan :", # Fuzzy
);
/** Bosnian (bosanski)
* @author CERminator
*/
$messages['bs'] = array(
- 'recaptcha-edit' => 'Da bismo pomogli protiv automatiziranog spam ureÄ‘ivanja, molimo upiÅ¡ite dvije rijeÄi koje vidite u kutiju ispod:',
- 'recaptcha-addurl' => 'VaÅ¡e izmjene ukljuÄuju nove vanjske linkove. Da bismo pomogli protiv automatiziranog spama, molimo upiÅ¡ite dvije rijeÄi koje vidite u kutiju ispod.',
- 'recaptcha-badpass' => 'Da bismo pomogli protiv automatiziranog probijanja Å¡ifre, molimo upiÅ¡ite dvije rijeÄi koje vidite u kutiju ispod:',
- 'recaptcha-createaccount' => 'Da bismo pomogli protiv automatiziranog pravljenja raÄuna, molimo upiÅ¡ite dvije rijeÄi koje vidite u kutiju ispod:',
+ 'recaptcha-edit' => 'Da bismo pomogli protiv automatiziranog spam ureÄ‘ivanja, molimo upiÅ¡ite dvije rijeÄi koje vidite u kutiju ispod:', # Fuzzy
+ 'recaptcha-addurl' => 'VaÅ¡e izmjene ukljuÄuju nove vanjske linkove. Da bismo pomogli protiv automatiziranog spama, molimo upiÅ¡ite dvije rijeÄi koje vidite u kutiju ispod.', # Fuzzy
+ 'recaptcha-badlogin' => 'Da bismo pomogli protiv automatiziranog probijanja Å¡ifre, molimo upiÅ¡ite dvije rijeÄi koje vidite u kutiju ispod:', # Fuzzy
+ 'recaptcha-createaccount' => 'Da bismo pomogli protiv automatiziranog pravljenja raÄuna, molimo upiÅ¡ite dvije rijeÄi koje vidite u kutiju ispod:', # Fuzzy
'recaptcha-createaccount-fail' => 'Neispravan ili nedostajući reCAPTCHA odgovor.',
- 'recaptcha-create' => 'Da bismo pomogli protiv automatiziranog pravljenja stranica, molimo upiÅ¡ite dvije rijeÄi koje vidite u kutiju ispod:',
+ 'recaptcha-create' => 'Da bismo pomogli protiv automatiziranog pravljenja stranica, molimo upiÅ¡ite dvije rijeÄi koje vidite u kutiju ispod:', # Fuzzy
);
/** Czech (Äesky)
@@ -103,45 +105,46 @@ $messages['bs'] = array(
*/
$messages['cs'] = array(
'recaptcha-desc' => 'Podpora reCAPTCHA pro rozšíření Confirm Edit',
- 'recaptcha-edit' => 'V zájmu ochrany před automatickým spamováním opište dvě slova, která vidíte na obrázku:',
- 'recaptcha-addurl' => 'Vaše editace obsahuje nové externí odkazy. V zájmu ochrany před automatickým spamováním opište dvě slova, která vidíte na obrázku:',
- 'recaptcha-badpass' => 'V zájmu ochrany proti automatickým pokusům uhodnout heslo opište dvě slova, která vidíte na obrázku:',
- 'recaptcha-createaccount' => 'V rámci ochrany pÅ™ed automatickým vytvářením úÄtů opiÅ¡te dvÄ› slova, která vidíte na obrázku:',
+ 'recaptcha-edit' => 'V zájmu ochrany před automatickým spamováním opište dvě slova, která vidíte na obrázku:', # Fuzzy
+ 'recaptcha-addurl' => 'Vaše editace obsahuje nové externí odkazy. V zájmu ochrany před automatickým spamováním opište dvě slova, která vidíte na obrázku:', # Fuzzy
+ 'recaptcha-badlogin' => 'V zájmu ochrany proti automatickým pokusům uhodnout heslo opište dvě slova, která vidíte na obrázku:', # Fuzzy
+ 'recaptcha-createaccount' => 'V rámci ochrany pÅ™ed automatickým vytvářením úÄtů opiÅ¡te dvÄ› slova, která vidíte na obrázku:', # Fuzzy
'recaptcha-createaccount-fail' => 'Nesprávná nebo chybÄ›jící odpovÄ›Ä na reCAPTCHA.',
- 'recaptcha-create' => 'V zájmu ochrany před automatickým zakládáním stránek opište dvě slova, která vidíte na obrázku:',
+ 'recaptcha-create' => 'V zájmu ochrany před automatickým zakládáním stránek opište dvě slova, která vidíte na obrázku:', # Fuzzy
);
/** Welsh (Cymraeg)
* @author Lloffiwr
*/
$messages['cy'] = array(
- 'recaptcha-edit' => "Er mwyn ei gwneud yn anodd i olygyddion awtomatig osod sbam, teipiwch y ddau air sydd i'w gweld yn y blwch isod:",
- 'recaptcha-addurl' => "Mae'ch golygiad yn cynnwys cysylltiadau allanol newydd. Er mwyn helpu i ddiogelu rhag sbam awtomatig, teipiwch y ddau air sydd i'w gweld yn y blwch isod:",
- 'recaptcha-badpass' => "Er mwyn helpu i arbed rhag i'ch cyfrinair gael ei ddatrys gan beiriant, teipiwch y ddau air sydd i'w gweld yn y blwch isod:",
- 'recaptcha-createaccount' => "Er mwyn ei gwneud yn anodd i beiriannau i agor cyfrifon yn awtomatig, teipiwch y ddau air sydd i'w gweld yn y blwch isod:",
+ 'recaptcha-edit' => "Er mwyn arbed y wici rhag i olygyddion awtomatig osod sbam, byddwch gystal â theipio'r ddau air sydd i'w gweld yn y blwch isod:",
+ 'recaptcha-addurl' => "Mae'ch golygiad yn cynnwys cysylltiadau allanol newydd. Er mwyn arbed y wici rhag sbam awtomatig, byddwch gystal â theipio'r ddau air sydd i'w gweld yn y blwch isod:",
+ 'recaptcha-badlogin' => "Er mwyn arbed y wici rhag peiriannau sy'n datrys cyfrineiriau'n awtomatig, byddwch gystal â theipio'r ddau air sydd i'w gweld yn y blwch isod:",
+ 'recaptcha-createaccount' => "Er mwyn arbed y wici rhag peiriannau sy'n dechrau cyfrifon yn awtomatig, byddwch gystal â theipio'r ddau air sydd i'w gweld yn y blwch isod:",
'recaptcha-createaccount-fail' => "Mae'r ateb i'r pos CAPTCHA yn anghywir neu yn eisiau.",
- 'recaptcha-create' => "Er mwyn ei gwneud yn anodd i beiriannau i ddechrau tudalennau yn awtomatig, teipiwch y ddau air sydd i'w gweld yn y blwch isod:",
+ 'recaptcha-create' => "Er mwyn arbed y wici rhag peiriannau sy'n dechrau tudalennau yn awtomatig, byddwch gystal â theipio'r ddau air sydd i'w gweld yn y blwch isod:",
);
/** German (Deutsch)
* @author Kghbln
+ * @author Metalhead64
* @author Umherirrender
*/
$messages['de'] = array(
'recaptcha-desc' => 'reCAPTCHA-Module für die Erweiterung „Confirm Edit“',
- 'recaptcha-edit' => 'Zum Schutz vor automatisiertem Spam, gib bitte die beiden folgenden Wörter in das untenstehende Feld ein:',
- 'recaptcha-addurl' => 'Deine Bearbeitung enthält neue externe Links. Zum Schutz vor automatisiertem Spam gib bitte die beiden folgenden Wörter in das folgende Feld ein:',
- 'recaptcha-badpass' => 'Zum Schutz gegen automatisiertes Knacken von Passwörtern, gib bitte die beiden folgenden Wörter in das folgende Feld ein:',
- 'recaptcha-createaccount' => 'Zum Schutz gegen die automatisierte Erstellung von Benutzerkonten bitten wir dich, die folgenden beiden Wörter in das untenstehende Feld einzugeben:',
+ 'recaptcha-edit' => 'Zum Schutz des Wikis vor automatisiertem Spam bitten wir dich, die beiden folgenden Wörter in das untenstehende Feld einzugeben:',
+ 'recaptcha-addurl' => 'Deine Bearbeitung enthält neue externe Links. Zum Schutz des Wikis vor automatisiertem Spam bitten wir dich, die beiden folgenden Wörter in das folgende Feld einzugeben:',
+ 'recaptcha-badlogin' => 'Zum Schutz des Wikis gegen automatisiertes Knacken von Passwörtern bitten wir dich, die beiden folgenden Wörter in das folgende Feld einzugeben:',
+ 'recaptcha-createaccount' => 'Zum Schutz des Wikis gegen die automatisierte Erstellung von Benutzerkonten bitten wir dich, die folgenden beiden Wörter in das untenstehende Feld einzugeben:',
'recaptcha-createaccount-fail' => 'Fehlerhafte oder fehlende reCAPTCHA Antwort.',
- 'recaptcha-create' => 'Zum Schutz gegen automatisierte Erstellung von Seiten gib bitte die beiden folgenden Wörter in das folgende Feld ein:',
+ 'recaptcha-create' => 'Zum Schutz des Wikis gegen automatisierte Erstellung von Seiten bitten wir dich, die beiden folgenden Wörter in das folgende Feld einzugeben:',
);
/** German (formal address) (Deutsch (Sie-Form)‎)
* @author Kghbln
*/
$messages['de-formal'] = array(
- 'recaptcha-createaccount' => 'Zum Schutz gegen die automatisierte Erstellung von Benutzerkonten bitten wir Sie, die folgenden beiden Wörter in das untenstehende Feld einzugeben:',
+ 'recaptcha-createaccount' => 'Zum Schutz gegen die automatisierte Erstellung von Benutzerkonten bitten wir Sie, die folgenden beiden Wörter in das untenstehende Feld einzugeben:', # Fuzzy
);
/** Lower Sorbian (dolnoserbski)
@@ -155,12 +158,12 @@ $messages['dsb'] = array(
* @author Fitoschido
*/
$messages['es'] = array(
- 'recaptcha-edit' => 'Para protegernos de la publicidad automatizada, escribe las dos palabras visibles en el cuadro de abajo:',
- 'recaptcha-addurl' => 'Tu edición incluye nuevos enlaces externos. Para ayudar a protegernos contra el spam automatizado, por favor, escribe las dos palabras que ves en el cuadro a continuación:',
- 'recaptcha-badpass' => 'Para protegernos del robo automatizado de contraseñas, escribe las dos palabras visibles en el cuadro de abajo:',
- 'recaptcha-createaccount' => 'Para protegernos de la creación automática de cuentas, escribe las dos palabras que ves en el cuadro de abajo:',
+ 'recaptcha-edit' => 'Para protegernos de la publicidad automatizada, escribe las dos palabras visibles en el cuadro de abajo:', # Fuzzy
+ 'recaptcha-addurl' => 'Tu edición incluye nuevos enlaces externos. Para ayudar a protegernos contra el spam automatizado, por favor, escribe las dos palabras que ves en el cuadro a continuación:', # Fuzzy
+ 'recaptcha-badlogin' => 'Para protegernos del robo automatizado de contraseñas, escribe las dos palabras visibles en el cuadro de abajo:', # Fuzzy
+ 'recaptcha-createaccount' => 'Para protegernos de la creación automática de cuentas, escribe las dos palabras que ves en el cuadro de abajo:', # Fuzzy
'recaptcha-createaccount-fail' => 'ReCAPTCHA incorrecto o sin responder.',
- 'recaptcha-create' => 'Para protegernos de la creación automática de páginas, escribe las dos palabras que ves en el cuadro de abajo:',
+ 'recaptcha-create' => 'Para protegernos de la creación automática de páginas, escribe las dos palabras que ves en el cuadro de abajo:', # Fuzzy
);
/** Finnish (suomi)
@@ -168,24 +171,25 @@ $messages['es'] = array(
* @author VezonThunder
*/
$messages['fi'] = array(
- 'recaptcha-edit' => 'Suojana automaattisia roskamuokkauksia vastaan sinun on syötettävä kaksi näkemääsi sanaa laatikkoon alla:',
- 'recaptcha-addurl' => 'Muokkauksesi sisältää uusia ulkoisia linkkejä. Suojana automaattista roskapostia vastaan sinun on syötettävä kaksi näkemääsi sanaa laatikkoon alla:',
- 'recaptcha-badpass' => 'Suojana automaattisia salasanamurtoja vastaan sinun on syötettävä kaksi näkemääsi sanaa laatikkoon alla:',
- 'recaptcha-createaccount' => 'Suojana automaattista tunnusten luontia vastaan sinun on syötettävä kaksi näkemääsi sanaa laatikkoon alla:',
+ 'recaptcha-edit' => 'Suojana automaattisia roskamuokkauksia vastaan sinun on syötettävä kaksi näkemääsi sanaa laatikkoon alla:', # Fuzzy
+ 'recaptcha-addurl' => 'Muokkauksesi sisältää uusia ulkoisia linkkejä. Suojana automaattista roskapostia vastaan sinun on syötettävä kaksi näkemääsi sanaa laatikkoon alla:', # Fuzzy
+ 'recaptcha-badlogin' => 'Suojana automaattisia salasanamurtoja vastaan sinun on syötettävä kaksi näkemääsi sanaa laatikkoon alla:', # Fuzzy
+ 'recaptcha-createaccount' => 'Suojana automaattista tunnusten luontia vastaan sinun on syötettävä kaksi näkemääsi sanaa laatikkoon alla:', # Fuzzy
'recaptcha-createaccount-fail' => 'Väärä tai puuttuva reCAPTCHA-vastaus.',
- 'recaptcha-create' => 'Suojana automaattista sivujen luontia vastaan sinun on syötettävä kaksi näkemääsi sanaa laatikkoon alla:',
+ 'recaptcha-create' => 'Suojana automaattista sivujen luontia vastaan sinun on syötettävä kaksi näkemääsi sanaa laatikkoon alla:', # Fuzzy
);
/** French (français)
+ * @author Gomoko
* @author Urhixidur
*/
$messages['fr'] = array(
- 'recaptcha-edit' => "Pour nous protéger des robots, merci d'écrire les deux mots visibles dans le cadre qui suit:",
- 'recaptcha-addurl' => 'Votre contribution contient des liens vers un site externe. Pour nous protéger des robots, merci d’écrire les deux mots visibles dans le cadre qui suit :',
- 'recaptcha-badpass' => "Pour nous protéger des essais automatiques de cassage de mot de passe, merci d'écrire les deux mots visibles dans le cadre qui suit:",
- 'recaptcha-createaccount' => "Pour nous protéger des créations automatiques de compte, merci d'écrire les deux mots visibles dans le cadre qui suit:",
+ 'recaptcha-edit' => 'Afin de protéger le wiki du spam des modifications automatisées, nous vous demandons de bien vouloir écrire les deux mots visibles dans le cadre ci-dessous :',
+ 'recaptcha-addurl' => 'Votre contribution contient des liens vers un site externe. Pour protéger le wiki contre le spam automatisé, nous vous demandons de bien vouloir écrire les deux mots visibles dans le cadre qui suit :',
+ 'recaptcha-badlogin' => 'Pour protéger le wiki des essais automatiques de cassage de mot de passe, nous vous demandons de bien vouloir écrire les deux mots visibles dans le cadre qui suit:',
+ 'recaptcha-createaccount' => 'Pour protéger le wiki des créations automatiques de compte, nous vous demandons de bien vouloir écrire les deux mots visibles dans le cadre qui suit :',
'recaptcha-createaccount-fail' => 'Réponse de reCAPTCHA fausse ou manquante.',
- 'recaptcha-create' => "Pour nous protéger des créations automatiques de pages, merci d'écrire les deux mots visibles dans le cadre qui suit:",
+ 'recaptcha-create' => 'Pour protéger le wiki des créations automatiques de pages, nous vous demandons de bien vouloir écrire les deux mots visibles dans le cadre qui suit :',
);
/** Galician (galego)
@@ -193,83 +197,84 @@ $messages['fr'] = array(
*/
$messages['gl'] = array(
'recaptcha-desc' => 'Módulo de reCAPTCHA para Confirm Edit',
- 'recaptcha-edit' => 'Para axudarnos á protección contra o spam, escriba as dúas palabras que vexa nesta caixa:',
- 'recaptcha-addurl' => 'A súa edición inclúe novas ligazóns externas. Para axudar na protección contra o spam automático, ten que escribir as dúas palabras que aparecen na caixa inferior:',
- 'recaptcha-badpass' => 'Para axudarnos á protección contra o roubo de contrasinais, escriba as dúas palabras que vexa nesta caixa:',
- 'recaptcha-createaccount' => 'Para axudarnos á protección contra a creación automática de contas, escriba as dúas palabras que vexa nesta caixa:',
+ 'recaptcha-edit' => 'Para protexer o wiki contra o spam automático, introduza as dúas palabras que vexa na caixa:',
+ 'recaptcha-addurl' => 'A súa edición inclúe novas ligazóns externas. Para protexer o wiki contra o spam automático, introduza as dúas palabras que vexa na caixa:',
+ 'recaptcha-badlogin' => 'Para protexer o wiki contra o roubo de contrasinais, introduza as dúas palabras que vexa na caixa:',
+ 'recaptcha-createaccount' => 'Para protexer o wiki contra a creación automática de contas, introduza as dúas palabras que vexa na caixa:',
'recaptcha-createaccount-fail' => 'Falta a resposta ao reCAPTCHA ou esta é incorrecta.',
- 'recaptcha-create' => 'Para axudarnos á protección contra a creación automática de páxinas, escriba as dúas palabras que vexa nesta caixa:',
+ 'recaptcha-create' => 'Para protexer o wiki contra a creación automática de páxinas, introduza as dúas palabras que vexa na caixa:',
);
/** Swiss German (Alemannisch)
* @author Als-Holder
*/
$messages['gsw'] = array(
- 'recaptcha-edit' => 'Zum Schutz vor automatisiertem Spam, gib bitte di beide Werter in s Fäld unten yy:',
- 'recaptcha-addurl' => 'In Dyre Bearbeitg het s neji extärni Links. Zum Schutz vor automatisiertem Spam, gib bitte di beide Werter in s Fäld unten yy:',
- 'recaptcha-badpass' => 'Zum Schutz gege automatisiert Knacken vu Passwerter, gib bitte di beide Werter in s Fäld unten yy:',
- 'recaptcha-createaccount' => 'Zum Schutz gege s automatisiert Aalege vu Benutzerkonte, gib bitte di beide Werter in s Fäld unten yy:',
+ 'recaptcha-edit' => 'Zum Schutz vor automatisiertem Spam, gib bitte di beide Werter in s Fäld unten yy:', # Fuzzy
+ 'recaptcha-addurl' => 'In Dyre Bearbeitg het s neji extärni Links. Zum Schutz vor automatisiertem Spam, gib bitte di beide Werter in s Fäld unten yy:', # Fuzzy
+ 'recaptcha-badlogin' => 'Zum Schutz gege automatisiert Knacken vu Passwerter, gib bitte di beide Werter in s Fäld unten yy:', # Fuzzy
+ 'recaptcha-createaccount' => 'Zum Schutz gege s automatisiert Aalege vu Benutzerkonte, gib bitte di beide Werter in s Fäld unten yy:', # Fuzzy
'recaptcha-createaccount-fail' => 'D reCAPTCHA-Antwort isch fählerhaft oder si fählt.',
- 'recaptcha-create' => 'Zum Schutz gege s automatisiert Aalege vu Syte, gib bitte di beide Werter in s Fäld unten yy:',
+ 'recaptcha-create' => 'Zum Schutz gege s automatisiert Aalege vu Syte, gib bitte di beide Werter in s Fäld unten yy:', # Fuzzy
);
/** Hebrew (עברית)
*/
$messages['he'] = array(
- 'recaptcha-edit' => '××™× ×›× ×ž×©×ª×ž×© רשו×.×›×”×’× ×” מפני ספ×× ×וטומטי, ×× × ×”×§×œ×™×“×• ×ת שתי ×”×ž×™×œ×™× ×©×œ×”×œ×Ÿ. תודה.',
- 'recaptcha-addurl' => '××™× ×›× ×ž×©×ª×ž×© רשו×.×›×”×’× ×” מפני ספ×× ×וטומטי, ×× × ×”×§×œ×™×“×• ×ת שתי ×”×ž×™×œ×™× ×©×œ×”×œ×Ÿ. תודה.',
- 'recaptcha-badpass' => '×›×”×’× ×” מפני מפצחי סיסמ×ות ××•×˜×•×ž×˜×™×™× ×× × ×”×§×œ×™×“×• ×ת שתי ×”×ž×™×œ×™× ×©×œ×”×œ×Ÿ:',
- 'recaptcha-createaccount' => '×›×”×’× ×” מפני יצירת חשבונות ×¤×™×§×˜×™×‘×™×™× ×¢"×™ ××•×˜×•×ž×˜×™× ×× × ×”×§×œ×™×“×• ×ת שתי ×”×ž×™×œ×™× ×©×œ×”×œ×Ÿ:',
+ 'recaptcha-edit' => '××™× ×›× ×ž×©×ª×ž×© רשו×.×›×”×’× ×” מפני ספ×× ×וטומטי, ×× × ×”×§×œ×™×“×• ×ת שתי ×”×ž×™×œ×™× ×©×œ×”×œ×Ÿ. תודה.', # Fuzzy
+ 'recaptcha-addurl' => '××™× ×›× ×ž×©×ª×ž×© רשו×.×›×”×’× ×” מפני ספ×× ×וטומטי, ×× × ×”×§×œ×™×“×• ×ת שתי ×”×ž×™×œ×™× ×©×œ×”×œ×Ÿ. תודה.', # Fuzzy
+ 'recaptcha-badlogin' => '×›×”×’× ×” מפני מפצחי סיסמ×ות ××•×˜×•×ž×˜×™×™× ×× × ×”×§×œ×™×“×• ×ת שתי ×”×ž×™×œ×™× ×©×œ×”×œ×Ÿ:', # Fuzzy
+ 'recaptcha-createaccount' => '×›×”×’× ×” מפני יצירת חשבונות ×¤×™×§×˜×™×‘×™×™× ×¢"×™ ××•×˜×•×ž×˜×™× ×× × ×”×§×œ×™×“×• ×ת שתי ×”×ž×™×œ×™× ×©×œ×”×œ×Ÿ:', # Fuzzy
'recaptcha-createaccount-fail' => '×œ× ×”×•×§×œ×“×• מילות ×”×ישור, ×ו שהוקלדו ×ž×™×œ×™× ×œ× × ×›×•× ×•×ª. נסו שנית.',
- 'recaptcha-create' => '××™× ×›× ×ž×©×ª×ž×© רשו×.×›×”×’× ×” מפני ספ×× ×וטומטי, ×× × ×”×§×œ×™×“×• ×ת שתי ×”×ž×™×œ×™× ×©×œ×”×œ×Ÿ. תודה.',
+ 'recaptcha-create' => '××™× ×›× ×ž×©×ª×ž×© רשו×.×›×”×’× ×” מפני ספ×× ×וטומטי, ×× × ×”×§×œ×™×“×• ×ת שתי ×”×ž×™×œ×™× ×©×œ×”×œ×Ÿ. תודה.', # Fuzzy
);
/** Upper Sorbian (hornjoserbsce)
* @author Michawiki
*/
$messages['hsb'] = array(
- 'recaptcha-edit' => 'Za škit přećiwo awtomatizowanemu spamej, prošu zapisaj dwě słowje, kotrejž w slědowacym polu widźiš:',
- 'recaptcha-addurl' => 'Twoja změna wobsahuje nowe eksterne wotkazy. Za škit přećiwo awtomatizowanemu spamej, prošu zapisaj dwě słowje, kotrerjž w slědowacym polu widźiš:',
- 'recaptcha-badpass' => 'Za škit přećiwo awtomatizowanemu złamanju hesłow, zapisaj prošu wobě słowje, kotrejž widźiš, do slědowaceho pola:',
- 'recaptcha-createaccount' => 'Za škit přećiwo awtomatiskemu wutworjenju konta, prošu zapisaj tej wobě słowje, kotrejž w slědowacym polu widźiš:',
+ 'recaptcha-edit' => 'Za škit přećiwo awtomatizowanemu spamej, prošu zapisaj dwě słowje, kotrejž w slědowacym polu widźiš:', # Fuzzy
+ 'recaptcha-addurl' => 'Twoja změna wobsahuje nowe eksterne wotkazy. Za škit přećiwo awtomatizowanemu spamej, prošu zapisaj dwě słowje, kotrerjž w slědowacym polu widźiš:', # Fuzzy
+ 'recaptcha-badlogin' => 'Za škit přećiwo awtomatizowanemu złamanju hesłow, zapisaj prošu wobě słowje, kotrejž widźiš, do slědowaceho pola:', # Fuzzy
+ 'recaptcha-createaccount' => 'Za škit přećiwo awtomatiskemu wutworjenju konta, prošu zapisaj tej wobě słowje, kotrejž w slědowacym polu widźiš:', # Fuzzy
'recaptcha-createaccount-fail' => 'WopaÄna abo falowaca wotmoÅ‚wa reCAPTCHA.',
- 'recaptcha-create' => 'Za škit přećiwo awtomatiskemu wutworjenju strony, prošu zapisaj tej wobě słowje, kotrejž w slědowacym polu widźiš:',
+ 'recaptcha-create' => 'Za škit přećiwo awtomatiskemu wutworjenju strony, prošu zapisaj tej wobě słowje, kotrejž w slědowacym polu widźiš:', # Fuzzy
);
/** Interlingua (interlingua)
* @author McDutchie
*/
$messages['ia'] = array(
- 'recaptcha-edit' => 'Pro adjutar a proteger nos contra le spam automatisate, per favor entra le duo parolas que tu vide in le quadro sequente:',
- 'recaptcha-addurl' => 'Iste modification include nove ligamines externe. Pro adjutar a proteger nos contra le spam automatisate, per favor entra le duo parolas que tu vide in le quadro sequente:',
- 'recaptcha-badpass' => 'Pro adjutar a proteger nos contra le furto automatisate de contrasignos, per favor entra le duo parolas que tu vide in le quadro sequente:',
- 'recaptcha-createaccount' => 'Pro adjutar a proteger nos contra le creation automatisate de contos, per favor entra le duo parolas que tu vide in le quadro sequente:',
+ 'recaptcha-edit' => 'Pro adjutar a proteger le wiki contra le spam automatisate, per favor dactylographa le duo parolas que tu vide in le quadro sequente:',
+ 'recaptcha-addurl' => 'Iste modification include nove ligamines externe. Pro adjutar a proteger le wiki contra le spam automatisate, per favor dactylographa le duo parolas que tu vide in le quadro sequente:',
+ 'recaptcha-badlogin' => 'Pro adjutar a proteger le wiki contra le furto automatisate de contrasignos, per favor dactylographa le duo parolas que tu vide in le quadro sequente:',
+ 'recaptcha-createaccount' => 'Pro adjutar a proteger le wiki contra le creation automatisate de contos, per favor dactylographa le duo parolas que tu vide in le quadro sequente:',
'recaptcha-createaccount-fail' => 'Responsa reCAPTCHA incorrecte o mancante.',
- 'recaptcha-create' => 'Pro adjutar a proteger nos contra le creation automatisate de paginas, per favor entra le duo parolas que tu vide in le quadro sequente:',
+ 'recaptcha-create' => 'Pro adjutar a proteger le wiki contra le creation automatisate de paginas, per favor dactylographa le duo parolas que tu vide in le quadro sequente:',
);
/** Indonesian (Bahasa Indonesia)
* @author IvanLanin
*/
$messages['id'] = array(
- 'recaptcha-edit' => 'Untuk membantu pelindungan terhadap spam penyuntingan otomatis, silakan ketik dua kata yang Anda lihat dalam kotak di bawah ini:',
- 'recaptcha-addurl' => 'Suntingan Anda menyertakan pranala eksternal baru. Untuk membantu pelindungan terhadap spam otomatis, silakan ketik dua kata yang Anda lihat dalam kotak di bawah ini:',
- 'recaptcha-badpass' => 'Untuk membantu pelindungan terhadap perengkahan sandi otomatis, silakan ketik dua kata yang Anda lihat dalam kotak di bawah ini:',
- 'recaptcha-createaccount' => 'Untuk membantu pelindungan terhadap pembuatan akun otomatis, silakan ketik dua kata yang Anda lihat dalam kotak di bawah ini:',
+ 'recaptcha-edit' => 'Untuk membantu pelindungan terhadap spam penyuntingan otomatis, silakan ketik dua kata yang Anda lihat dalam kotak di bawah ini:', # Fuzzy
+ 'recaptcha-addurl' => 'Suntingan Anda menyertakan pranala eksternal baru. Untuk membantu pelindungan terhadap spam otomatis, silakan ketik dua kata yang Anda lihat dalam kotak di bawah ini:', # Fuzzy
+ 'recaptcha-badlogin' => 'Untuk membantu pelindungan terhadap perengkahan sandi otomatis, silakan ketik dua kata yang Anda lihat dalam kotak di bawah ini:', # Fuzzy
+ 'recaptcha-createaccount' => 'Untuk membantu pelindungan terhadap pembuatan akun otomatis, silakan ketik dua kata yang Anda lihat dalam kotak di bawah ini:', # Fuzzy
'recaptcha-createaccount-fail' => 'Jawaban reCAPTCHA tidak benar atau tidak dimasukkan.',
- 'recaptcha-create' => 'Untuk membantu pelindungan terhadap pembuatan halaman otomatis, silakan ketik dua kata yang Anda lihat dalam kotak di bawah ini:',
+ 'recaptcha-create' => 'Untuk membantu pelindungan terhadap pembuatan halaman otomatis, silakan ketik dua kata yang Anda lihat dalam kotak di bawah ini:', # Fuzzy
);
/** Italian (italiano)
+ * @author Beta16
* @author Nemo bis
*/
$messages['it'] = array(
- 'recaptcha-edit' => 'Per aiutarci a proteggerci dalle modifiche automatiche che aggiungono spam, scrivi le due parole mostrate nel riquadro sottostante:',
- 'recaptcha-addurl' => 'La tua modifica aggiunge qualche nuovo collegamento esterno. Per aiutarci a proteggerci dallo spam automatico, scrivi le due parole mostrate nel riquadro sottostante:',
- 'recaptcha-badpass' => 'Per aiutarci a proteggerci dalla forzatura automatica delle password, scrivi le due parole mostrate nel riquadro sottostante:',
- 'recaptcha-createaccount' => 'Per aiutarci a proteggerci dalla creazione automatica di nuovi accessi, scrivi le due parole mostrate nel riquadro sottostante:',
+ 'recaptcha-edit' => 'Per proteggere il wiki dalle modifiche automatiche che aggiungono spam, ti chiediamo gentilmente di scrivere le due parole mostrate nel riquadro sottostante:',
+ 'recaptcha-addurl' => 'La tua modifica aggiunge qualche nuovo collegamento esterno. Per proteggere il wiki dallo spam automatico, ti chiediamo gentilmente di scrivere le due parole mostrate nel riquadro sottostante:',
+ 'recaptcha-badlogin' => 'Per proteggere il wiki dalla forzatura automatica delle password, ti chiediamo gentilmente di scrivere le due parole mostrate nel riquadro sottostante:',
+ 'recaptcha-createaccount' => 'Per proteggere il wiki dalla creazione automatica di nuovi accessi, ti chiediamo gentilmente di scrivere le due parole mostrate nel riquadro sottostante:',
'recaptcha-createaccount-fail' => 'Risposta reCAPTCHA mancante o errata.',
- 'recaptcha-create' => 'Per aiutarci a proteggerci dalla creazione automatica di pagine, scrivi le due parole mostrate nel riquadro sottostante:',
+ 'recaptcha-create' => 'Per proteggere il wiki dalla creazione automatica di pagine, ti chiediamo gentilmente di scrivere le due parole mostrate nel riquadro sottostante:',
);
/** Japanese (日本語)
@@ -277,12 +282,12 @@ $messages['it'] = array(
*/
$messages['ja'] = array(
'recaptcha-desc' => 'Confirm Edit 用 reCAPTCHA モジュール',
- 'recaptcha-edit' => '自動編集ã®ã‚¹ãƒ‘ム攻撃を防ããŸã‚ã€ä¸‹ã®ç”»åƒã«è¡¨ç¤ºã•ã‚Œã¦ã„ã‚‹ 2 ã¤ã®å˜èªžã‚’入力ã—ã¦ãã ã•ã„:',
- 'recaptcha-addurl' => 'ã‚ãªãŸã¯æ–°ã—ã„外部リンクを追加ã—よã†ã¨ã—ã¦ã„ã¾ã™ã€‚自動ã§ã®ã‚¹ãƒ‘ム攻撃を防ããŸã‚ã€ä¸‹ã®ç”»åƒã«è¡¨ç¤ºã•ã‚Œã¦ã„ã‚‹ 2 ã¤ã®å˜èªžã‚’入力ã—ã¦ãã ã•ã„:',
- 'recaptcha-badpass' => '自動ã§ã®ãƒ‘スワードクラック攻撃を防ããŸã‚ã€ä¸‹ã®ç”»åƒã«è¡¨ç¤ºã•ã‚Œã¦ã„ã‚‹ 2 ã¤ã®å˜èªžã‚’入力ã—ã¦ãã ã•ã„:',
- 'recaptcha-createaccount' => 'アカウントã®è‡ªå‹•ç™»éŒ²ã‚’防ããŸã‚ã€ä¸‹ã®ç”»åƒã«è¡¨ç¤ºã•ã‚Œã¦ã„ã‚‹ 2 ã¤ã®å˜èªžã‚’入力ã—ã¦ãã ã•ã„:',
+ 'recaptcha-edit' => 'ウィキã¸ã®è‡ªå‹•ç·¨é›†ã‚¹ãƒ‘ム攻撃を防ããŸã‚ã€ãŠæ‰‹æ•°ã‚’ãŠã‹ã‘ã—ã¾ã™ãŒä¸‹ã®ç”»åƒã«è¡¨ç¤ºã•ã‚Œã¦ã„ã‚‹ 2 ã¤ã®å˜èªžã‚’入力ã—ã¦ãã ã•ã„:',
+ 'recaptcha-addurl' => 'ã‚ãªãŸã¯æ–°ã—ã„外部リンクを追加ã—よã†ã¨ã—ã¦ã„ã¾ã™ã€‚ウィキã¸ã®è‡ªå‹•ã‚¹ãƒ‘ム攻撃を防ããŸã‚ã€ãŠæ‰‹æ•°ã‚’ãŠã‹ã‘ã—ã¾ã™ãŒä¸‹ã®ç”»åƒã«è¡¨ç¤ºã•ã‚Œã¦ã„ã‚‹ 2 ã¤ã®å˜èªžã‚’入力ã—ã¦ãã ã•ã„:',
+ 'recaptcha-badlogin' => 'ウィキã¸ã®è‡ªå‹•ãƒ‘スワードクラック攻撃を防ããŸã‚ã€ãŠæ‰‹æ•°ã‚’ãŠã‹ã‘ã—ã¾ã™ãŒä¸‹ã®ç”»åƒã«è¡¨ç¤ºã•ã‚Œã¦ã„ã‚‹ 2 ã¤ã®å˜èªžã‚’入力ã—ã¦ãã ã•ã„:',
+ 'recaptcha-createaccount' => 'ウィキã§ã®ã‚¢ã‚«ã‚¦ãƒ³ãƒˆè‡ªå‹•ä½œæˆã‚’防ããŸã‚ã€ãŠæ‰‹æ•°ã‚’ãŠã‹ã‘ã—ã¾ã™ãŒä¸‹ã®ç”»åƒã«è¡¨ç¤ºã•ã‚Œã¦ã„ã‚‹ 2 ã¤ã®å˜èªžã‚’入力ã—ã¦ãã ã•ã„:',
'recaptcha-createaccount-fail' => '文字列ãŒæ­£ã—ããªã„ã€ã¾ãŸã¯å…¥åŠ›ã•ã‚Œã¦ã„ã¾ã›ã‚“。',
- 'recaptcha-create' => 'ページã®è‡ªå‹•ä½œæˆã‚’防ããŸã‚ã€ä¸‹ã®ç”»åƒã«è¡¨ç¤ºã•ã‚Œã¦ã„ã‚‹ 2 ã¤ã®å˜èªžã‚’入力ã—ã¦ãã ã•ã„:',
+ 'recaptcha-create' => 'ウィキã§ã®ãƒšãƒ¼ã‚¸ã®è‡ªå‹•ä½œæˆã‚’防ããŸã‚ã€ãŠæ‰‹æ•°ã‚’ãŠã‹ã‘ã—ã¾ã™ãŒä¸‹ã®ç”»åƒã«è¡¨ç¤ºã•ã‚Œã¦ã„ã‚‹ 2 ã¤ã®å˜èªžã‚’入力ã—ã¦ãã ã•ã„:',
);
/** Korean (한국어)
@@ -290,12 +295,12 @@ $messages['ja'] = array(
*/
$messages['ko'] = array(
'recaptcha-desc' => '편집 확ì¸ì— 대한 reCAPCHA 모듈',
- 'recaptcha-edit' => 'ìžë™í™”ëœ íŽ¸ì§‘ 스팸으로부터 보호하기 위해, 아래 ìƒìžì— ë³´ì´ëŠ” ë‘ ë‚±ë§ì„ 입력하세요:',
- 'recaptcha-addurl' => 'íŽ¸ì§‘ì— ìƒˆë¡œìš´ 바깥 ë§í¬ê°€ í¬í•¨ë˜ì–´ 있습니다. ìžë™í™”ëœ ìŠ¤íŒ¸ìœ¼ë¡œë¶€í„° 보호하기 위해, 아래 ìƒìžì— ë³´ì´ëŠ” ë‘ ë‚±ë§ì„ 입력하세요:',
- 'recaptcha-badpass' => 'ìžë™í™”ëœ ë¹„ë°€ë²ˆí˜¸ 깨기로부터 보호하기 위해, 아래 ìƒìžì— ë³´ì´ëŠ” ë‘ ë‚±ë§ì„ 입력하세요:',
- 'recaptcha-createaccount' => 'ìžë™í™”ëœ ê³„ì • 만들기로부터 보호하기 위해, 아래 ìƒìžì— ë³´ì´ëŠ” ë‘ ë‚±ë§ì„ 입력하세요:',
+ 'recaptcha-edit' => 'ìžë™í™”ëœ íŽ¸ì§‘ 스팸으로부터 보호하기 위해, 아래 ìƒìžì— ë³´ì´ëŠ” ë‘ ë‚±ë§ì„ 입력하세요:', # Fuzzy
+ 'recaptcha-addurl' => 'íŽ¸ì§‘ì— ìƒˆë¡œìš´ 바깥 ë§í¬ê°€ í¬í•¨ë˜ì–´ 있습니다. ìžë™í™”ëœ ìŠ¤íŒ¸ìœ¼ë¡œë¶€í„° 보호하기 위해, 아래 ìƒìžì— ë³´ì´ëŠ” ë‘ ë‚±ë§ì„ 입력하세요:', # Fuzzy
+ 'recaptcha-badlogin' => 'ìžë™í™”ëœ ë¹„ë°€ë²ˆí˜¸ 깨기로부터 보호하기 위해, 아래 ìƒìžì— ë³´ì´ëŠ” ë‘ ë‚±ë§ì„ 입력하세요:', # Fuzzy
+ 'recaptcha-createaccount' => 'ìžë™í™”ëœ ê³„ì • 만들기로부터 보호하기 위해, 아래 ìƒìžì— ë³´ì´ëŠ” ë‘ ë‚±ë§ì„ 입력하세요:', # Fuzzy
'recaptcha-createaccount-fail' => 'reCAPTCHA ë‹µì´ ì˜¬ë°”ë¥´ì§€ 않거나 없습니다.',
- 'recaptcha-create' => 'ìžë™í™”ëœ ë¬¸ì„œ 만들기로부터 보호하기 위해, 아래 ìƒìžì— ë³´ì´ëŠ” ë‘ ë‚±ë§ì„ 입력하세요:',
+ 'recaptcha-create' => 'ìžë™í™”ëœ ë¬¸ì„œ 만들기로부터 보호하기 위해, 아래 ìƒìžì— ë³´ì´ëŠ” ë‘ ë‚±ë§ì„ 입력하세요:', # Fuzzy
);
/** Colognian (Ripoarisch)
@@ -306,7 +311,7 @@ $messages['ksh'] = array(
Dat sull jääje et automattesche Ändere un SPAM em Wiki schöze.', # Fuzzy
'recaptcha-addurl' => 'Schrief di zwei Wööt en dä Kaste onge erin.
Dat sull jääje automattesch en et Wiki jebraate SPAM schöze, nohdämm en Dingem Beidraach {{PLURAL:$1|ene neue Lengk dren es|neue Lengks dren sin|kein neue Lengks dren sin}}.', # Fuzzy
- 'recaptcha-badpass' => 'Schrief di zwei Wööt en dä Kaste onge erin.
+ 'recaptcha-badlogin' => 'Schrief di zwei Wööt en dä Kaste onge erin.
Dat sull jääje et automattesche Paßwoot Knacke em Wiki schöze.', # Fuzzy
'recaptcha-createaccount' => 'Schrief di zwei Wööt en dä Kaste onge erin.
Dat sull jääje SPAM un automattesch aanjelaate Zohjäng nohm Wiki schöze.', # Fuzzy
@@ -319,12 +324,12 @@ Dat sull jääje SPAM un automattesch aanjelaate Sigge em Wiki schöze.', # Fuzz
* @author Robby
*/
$messages['lb'] = array(
- 'recaptcha-edit' => "Fir ze hëllefe eis géint automatiséierte Spam ze schützen, tippt w.e.g. déi zwee Wierder déi Dir gesitt an d'Këscht ënnendrënner an:",
- 'recaptcha-addurl' => "An Ärer Ännerung sinn nei extern Linken! Fir ze hëllefe géint automatiséierte Spam virzegoen, tippt w.e.g. déi zwee Wierder déi Dir gesitt an d'Këscht ënnendrënner:",
- 'recaptcha-badpass' => "Fir ze hëllefe eis géint d'automatiséiert hacke vu Passwierder ze schützen, tippt w.e.g. déi zwee Wierder déi Dir gesitt an d'Këscht ënnendrënner an:",
- 'recaptcha-createaccount' => "Fir ze hëllefe eis géint d'automatiséiert Uleeë vu Benotzerkonten ze schützen, tippt w.e.g. déi zwee Wierder déi Dir gesitt an d'Këscht ënnendrënner an:",
+ 'recaptcha-edit' => "Fir d'Wiki géint automatiséierte Spam ze schützen, froe mir Iech déi zwee Wierder déi Dir gesitt an d'Këscht ënnendrënner anzeginn:",
+ 'recaptcha-addurl' => "An Ärer Ännerung sinn nei extern Linken! Fir dës Wikie géint automatiséierte Spam ze schütze, froe mir Iech déi zwee Wierder déi Dir gesitt an d'Këscht ënnendrënner anzeginn:",
+ 'recaptcha-badlogin' => "Fir d'Wiki géint d'automatiséiert Hacke vu Passwierder ze schützen, froe mir Iech déi zwee Wierder déi Dir gesitt an d'Këscht ënnendrënner anzeginn:",
+ 'recaptcha-createaccount' => "Fir d'Wiki géint d'automatiséiert Uleeë vu Benotzerkonten ze schützen, froe mir Iech déi zwee Wierder déi Dir gesitt an d'Këscht ënnendrënner anzeginn:",
'recaptcha-createaccount-fail' => 'reCAPTCHA Äntwert feelt oder ass net korrekt.',
- 'recaptcha-create' => "Fir ze hëllefe eis géint d'automatiséiert Uleeë vu Säiten ze schützen, tippt w.e.g. déi zwee Wierder déi Dir gesitt an d'Këscht ënnendrënner an:",
+ 'recaptcha-create' => "Fir d'Wiki géint d'automatiséiert Uleeë vu Säiten ze schützen, froe mir Iech déi zwee Wierder déi Dir gesitt an d'Këscht ënnendrënner anzeginn:",
);
/** Macedonian (македонÑки)
@@ -332,82 +337,91 @@ $messages['lb'] = array(
*/
$messages['mk'] = array(
'recaptcha-desc' => 'Модул reCAPTCHA за потврда на уредувања',
- 'recaptcha-edit' => 'Како заштитна мерка против автоматизиран Ñпам, внеÑете ги двата збора прикажани во полето:',
- 'recaptcha-addurl' => 'Во вашите измени има нови надворешни врÑки. Како заштитна мерка против автоматизиран Ñпам, внеÑете ги двата збора прикажани во полето:',
- 'recaptcha-badpass' => 'Како заштитна мерка против автоматизирано провалување на лозинки, внеÑете ги двата збора прикажани во полето:',
- 'recaptcha-createaccount' => 'Како заштитна мерка против автоматизирано Ñоздавање на Ñметки, внеÑете ги двата збора прикажани во полето:',
+ 'recaptcha-edit' => 'Како заштитна мерка против автоматизиран Ñпам, би ве замолиле да ги внеÑете двата збора прикажани во полето:',
+ 'recaptcha-addurl' => 'Во вашите измени има нови надворешни врÑки. Како заштитна мерка против автоматизиран Ñпам, би ве замолиле да внеÑете двата збора прикажани во полето:',
+ 'recaptcha-badlogin' => 'Како заштитна мерка против автоматизирано провалување на лозинки, би ве замолиле да внеÑете двата збора прикажани во полето:',
+ 'recaptcha-createaccount' => 'Како заштитна мерка против автоматизирано Ñоздавање на Ñметки, би ве замолиле да внеÑете двата збора прикажани во полето:',
'recaptcha-createaccount-fail' => 'reCAPTCHA доби погрешен одговор или одговорот недоÑтаÑува.',
- 'recaptcha-create' => 'Како заштитна мерка против автоматизирано Ñоздавање на Ñтраници, внеÑете ги двата збора прикажани во полето:',
+ 'recaptcha-create' => 'Како заштитна мерка против автоматизирано Ñоздавање на Ñтраници, би ве замолиле да внеÑете двата збора прикажани во полето:',
);
/** Malay (Bahasa Melayu)
* @author Anakmalaysia
*/
$messages['ms'] = array(
- 'recaptcha-edit' => 'Untuk membanteras kegiatan spam automatik, sila taipkan dua perkataan yang anda lihat dalam petak di bawah:',
- 'recaptcha-addurl' => 'Suntingan anda termasuk pautan luar baru. Untuk membanteras kegiatan spam automatik, sila taipkan dua perkataan yang anda lihat dalam petak di bawah:',
- 'recaptcha-badpass' => 'Untuk membanteras kegiatan meneka kata laluan secara automatik, sila taipkan dua perkataan yang anda lihat dalam petak di bawah:',
- 'recaptcha-createaccount' => 'Untuk membanteras kegiatan membuka akaun secara automatik, sila taipkan dua perkataan yang anda lihat dalam petak di bawah:',
+ 'recaptcha-edit' => 'Untuk membanteras kegiatan spam automatik, sila taipkan dua perkataan yang anda lihat dalam petak di bawah:', # Fuzzy
+ 'recaptcha-addurl' => 'Suntingan anda termasuk pautan luar baru. Untuk membanteras kegiatan spam automatik, sila taipkan dua perkataan yang anda lihat dalam petak di bawah:', # Fuzzy
+ 'recaptcha-badlogin' => 'Untuk membanteras kegiatan meneka kata laluan secara automatik, sila taipkan dua perkataan yang anda lihat dalam petak di bawah:', # Fuzzy
+ 'recaptcha-createaccount' => 'Untuk membanteras kegiatan membuka akaun secara automatik, sila taipkan dua perkataan yang anda lihat dalam petak di bawah:', # Fuzzy
'recaptcha-createaccount-fail' => 'Jawapan reCAPTCHA tidak betul atau tidak ada.',
- 'recaptcha-create' => 'Untuk membanteras kegiatan mencipta laman secara automatik, sila taipkan dua perkataan yang anda lihat dalam petak di bawah:',
+ 'recaptcha-create' => 'Untuk membanteras kegiatan mencipta laman secara automatik, sila taipkan dua perkataan yang anda lihat dalam petak di bawah:', # Fuzzy
);
/** Maltese (Malti)
* @author Chrisportelli
*/
$messages['mt'] = array(
- 'recaptcha-edit' => "Sabiex tgħinna nipproteġu kontra l-modifiki li jżidu spam, jekk jogħġbok ikteb iż-żewġ kelmiet li tara fil-kaxxa t'hawn taħt:",
- 'recaptcha-addurl' => "Il-modifika tiegħek tinkludi ħoloq esterni ġodda. Sabiex tipproteġi kontra spam awtomatiku, jekk jogħġbok ikteb iż-żewġ kelmiet li tara fil-kaxxa t'hawn taħt:",
- 'recaptcha-badpass' => "Sabiex tgħinna nipproteġu kontra l-infurzar awtomatiku tal-passwords, jekk jogħġbok ikteb iż-żewġ kelmiet li tara fil-kaxxa t'hawn taħt:",
- 'recaptcha-createaccount' => "Sabiex tgħinna nipproteġu kontra l-ħolqien awtomatiku ta' kontijiet ġodda, jekk jogħġbok ikteb iż-żewġ kelmiet li tara fil-kaxxa t'hawn taħt:",
+ 'recaptcha-edit' => "Sabiex tgħinna nipproteġu kontra l-modifiki li jżidu spam, jekk jogħġbok ikteb iż-żewġ kelmiet li tara fil-kaxxa t'hawn taħt:", # Fuzzy
+ 'recaptcha-addurl' => "Il-modifika tiegħek tinkludi ħoloq esterni ġodda. Sabiex tipproteġi kontra spam awtomatiku, jekk jogħġbok ikteb iż-żewġ kelmiet li tara fil-kaxxa t'hawn taħt:", # Fuzzy
+ 'recaptcha-badlogin' => "Sabiex tgħinna nipproteġu kontra l-infurzar awtomatiku tal-passwords, jekk jogħġbok ikteb iż-żewġ kelmiet li tara fil-kaxxa t'hawn taħt:", # Fuzzy
+ 'recaptcha-createaccount' => "Sabiex tgħinna nipproteġu kontra l-ħolqien awtomatiku ta' kontijiet ġodda, jekk jogħġbok ikteb iż-żewġ kelmiet li tara fil-kaxxa t'hawn taħt:", # Fuzzy
'recaptcha-createaccount-fail' => 'Tweġiba reCAPTCHA ħażina jew nieqsa.',
- 'recaptcha-create' => "Sabiex tgħinna nipproteġu kontra l-ħolqien awtomatiku ta' paġni, jekk jogħġbok ikteb iż-żewġ kelmiet li tara fil-kaxxa t'hawn taħt:",
+ 'recaptcha-create' => "Sabiex tgħinna nipproteġu kontra l-ħolqien awtomatiku ta' paġni, jekk jogħġbok ikteb iż-żewġ kelmiet li tara fil-kaxxa t'hawn taħt:", # Fuzzy
);
-/** Norwegian Bokmål (norsk (bokmål)‎)
+/** Norwegian Bokmål (norsk bokmål)
* @author Event
*/
$messages['nb'] = array(
- 'recaptcha-edit' => 'Som beskyttelse mot automatisk redigert spam, vennligst skriv inn de to ordene du ser i boksen under:',
- 'recaptcha-addurl' => 'Din redigering inneholder nye eksterne lenker. Som beskyttelse mot automatisk spam, vennligst skriv inn de to ordene du ser i boksen under:',
- 'recaptcha-badpass' => 'Som beskyttelse mot automatisk passordknekking, vennligst skriv inn de to ordene du ser i boksen under:',
- 'recaptcha-createaccount' => 'Som beskyttelse mot automatisk opprettelse av brukerkonto, vennligst skriv inn de to ordene du ser i boksen under:',
+ 'recaptcha-edit' => 'Som beskyttelse mot automatisk redigert spam, vennligst skriv inn de to ordene du ser i boksen under:', # Fuzzy
+ 'recaptcha-addurl' => 'Din redigering inneholder nye eksterne lenker. Som beskyttelse mot automatisk spam, vennligst skriv inn de to ordene du ser i boksen under:', # Fuzzy
+ 'recaptcha-badlogin' => 'Som beskyttelse mot automatisk passordknekking, vennligst skriv inn de to ordene du ser i boksen under:', # Fuzzy
+ 'recaptcha-createaccount' => 'Som beskyttelse mot automatisk opprettelse av brukerkonto, vennligst skriv inn de to ordene du ser i boksen under:', # Fuzzy
'recaptcha-createaccount-fail' => 'Feil eller manglende reCAPTCHA-svar.',
- 'recaptcha-create' => 'Som beskyttelse mot automatisk opprettelse av side, vennligst skriv inn de to ordene du ser i boksen under:',
+ 'recaptcha-create' => 'Som beskyttelse mot automatisk opprettelse av side, vennligst skriv inn de to ordene du ser i boksen under:', # Fuzzy
);
/** Dutch (Nederlands)
+ * @author HanV
* @author Siebrand
*/
$messages['nl'] = array(
- 'recaptcha-edit' => 'Voer ter bescherming tegen geautomatiseerde spam de twee woorden die u ziet in het invoervenster in:',
- 'recaptcha-addurl' => 'Uw bewerking bevat nieuwe externe koppelingen. Voer ter bescherming tegen geautomatiseerde spam de twee woorden die u ziet in het invoervenster in:',
- 'recaptcha-badpass' => 'Voer ter bescherming tegen het automatisch kraken van wachtwoorden de twee woorden die u ziet in het invoervenster in:',
- 'recaptcha-createaccount' => 'Om het automatisch aanmaken van gebruikers tegen te gaan moet u de twee woorden die u ziet invoeren:',
+ 'recaptcha-edit' => 'Voer ter bescherming tegen geautomatiseerde spam de twee woorden in die u in het onderstaande venster ziet:',
+ 'recaptcha-addurl' => 'Uw bewerking bevat nieuwe externe koppelingen. Voer ter bescherming tegen geautomatiseerde spam de twee woorden in die u ziet in het onderstaande venster:',
+ 'recaptcha-badlogin' => 'Voer ter bescherming tegen het automatisch kraken van wachtwoorden de twee woorden in die u ziet in het invoervenster:',
+ 'recaptcha-createaccount' => 'Om het automatisch aanmaken van gebruikers tegen te gaan moet u de twee woorden in het onderstaande venster invoeren:',
'recaptcha-createaccount-fail' => 'Het reCAPTCHA-antwoord is onjuist of niet ingevoerd.',
- 'recaptcha-create' => "Om het automatisch aanmaken van pagina's tegen te gaan moet u de twee woorden die u ziet invoeren:",
+ 'recaptcha-create' => 'Om het automatisch aanmaken van een pagina tegen te gaan moet u de twee woorden invoeren die in het onderstaande veld staan:',
);
/** Nederlands (informeel)‎ (Nederlands (informeel)‎)
* @author Siebrand
*/
$messages['nl-informal'] = array(
- 'recaptcha-edit' => 'Voer ter bescherming tegen geautomatiseerde spam de twee woorden die je ziet in het invoervenster in:',
- 'recaptcha-addurl' => 'Je bewerking bevat nieuwe externe koppelingen. Voer ter bescherming tegen geautomatiseerde spam de twee woorden die je ziet in het invoervenster in:',
- 'recaptcha-badpass' => 'Voer ter bescherming tegen het automatisch kraken van wachtwoorden de twee woorden die je ziet in het invoervenster in:',
- 'recaptcha-createaccount' => 'Om het automatisch aanmaken van gebruikers tegen te gaan moet je de twee woorden die je ziet invoeren:',
- 'recaptcha-create' => "Om het automatisch aanmaken van pagina's tegen te gaan moet je de twee woorden die je ziet invoeren:",
+ 'recaptcha-edit' => 'Voer ter bescherming tegen geautomatiseerde spam de twee woorden die je ziet in het invoervenster in:', # Fuzzy
+ 'recaptcha-addurl' => 'Je bewerking bevat nieuwe externe koppelingen. Voer ter bescherming tegen geautomatiseerde spam de twee woorden die je ziet in het invoervenster in:', # Fuzzy
+ 'recaptcha-badlogin' => 'Voer ter bescherming tegen het automatisch kraken van wachtwoorden de twee woorden die je ziet in het invoervenster in:', # Fuzzy
+ 'recaptcha-createaccount' => 'Om het automatisch aanmaken van gebruikers tegen te gaan moet je de twee woorden die je ziet invoeren:', # Fuzzy
+ 'recaptcha-create' => "Om het automatisch aanmaken van pagina's tegen te gaan moet je de twee woorden die je ziet invoeren:", # Fuzzy
+);
+
+/** Occitan (occitan)
+ * @author Cedric31
+ */
+$messages['oc'] = array(
+ 'recaptcha-createaccount-fail' => 'Responsa de reCAPTCHA faussa o mancanta.',
);
/** Polish (polski)
+ * @author WTM
*/
$messages['pl'] = array(
- 'recaptcha-edit' => 'Aby uchronić nas przed robotami, proszę wpisać dwa widoczne słowa w poniższym polu:',
- 'recaptcha-addurl' => 'Twoja edycja zawiera linki zewnętrzne. Aby uchronić nas przed robotami, proszę wpisać dwa widoczne słowa w poniższym polu:',
- 'recaptcha-badpass' => 'Aby uchronić nas przed złamaniem automatycznym haseł, proszę wpisać dwa widoczne słowa w poniższym polu:',
- 'recaptcha-createaccount' => 'Aby uchronić nas przed automatycznym stworzeniem użytkowników, proszę wpisać dwa widoczne słowa w poniższym polu:',
+ 'recaptcha-edit' => 'Aby uchronić nas przed robotami, proszę wpisać dwa widoczne słowa w poniższym polu:', # Fuzzy
+ 'recaptcha-addurl' => 'Twoja edycja zawiera linki zewnętrzne. Aby uchronić nas przed robotami, proszę wpisać dwa widoczne słowa w poniższym polu:', # Fuzzy
+ 'recaptcha-badlogin' => 'Aby uchronić nas przed złamaniem automatycznym haseł, proszę wpisać dwa widoczne słowa w poniższym polu:', # Fuzzy
+ 'recaptcha-createaccount' => 'Aby uchronić nas przed automatycznym tworzeniem użytkowników, proszę wpisać dwa widoczne słowa w poniższym polu:', # Fuzzy
'recaptcha-createaccount-fail' => 'Odpowiedź na reCAPTCHA jest fałszywa lub brakująca.',
- 'recaptcha-create' => 'Aby uchronić nas przed tworzeniem stron przez robotów, proszę wpisać dwa widoczne słowa w poniższym polu:',
+ 'recaptcha-create' => 'Aby uchronić nas przed tworzeniem stron przez robotów, proszę wpisać dwa widoczne słowa w poniższym polu:', # Fuzzy
);
/** Piedmontese (Piemontèis)
@@ -415,59 +429,60 @@ $messages['pl'] = array(
* @author Dragonòt
*/
$messages['pms'] = array(
- 'recaptcha-edit' => "Për giuté a protege contra la rumenta dle modìfiche automàtiche, për piasì ch'a scriva le doe paròle ch'a s-ciàira ant ël quàder sì-sota:",
- 'recaptcha-addurl' => "Soa modìfica a conten d'anliure esterne neuv. Për giuté a protege contra la rumenta dle modìfiche automàtiche, për piasì ch'a scriva le doe paròle ch'a s-ciàira ant ël quàder sì-sota:",
- 'recaptcha-badpass' => "Për giuté a protege contra la forsadura automatisà ëd le ciav, për piasì ch'a scriva le doe paròle ch'a s-ciàira ant ël formolari sì-sota:",
- 'recaptcha-createaccount' => "Për giuté a protege contra la creassion automatisà ëd cont, për piasì ch'a scriva le doe paròle ch'a s-ciàira ant ël formolari sì-sota:",
+ 'recaptcha-edit' => "Për giuté a protege contra la rumenta dle modìfiche automàtiche, për piasì ch'a scriva le doe paròle ch'a s-ciàira ant ël quàder sì-sota:", # Fuzzy
+ 'recaptcha-addurl' => "Soa modìfica a conten d'anliure esterne neuv. Për giuté a protege contra la rumenta dle modìfiche automàtiche, për piasì ch'a scriva le doe paròle ch'a s-ciàira ant ël quàder sì-sota:", # Fuzzy
+ 'recaptcha-badlogin' => "Për giuté a protege contra la forsadura automatisà ëd le ciav, për piasì ch'a scriva le doe paròle ch'a s-ciàira ant ël formolari sì-sota:", # Fuzzy
+ 'recaptcha-createaccount' => "Për giuté a protege contra la creassion automatisà ëd cont, për piasì ch'a scriva le doe paròle ch'a s-ciàira ant ël formolari sì-sota:", # Fuzzy
'recaptcha-createaccount-fail' => 'Rispòsta ëd reCAPTCHA fàussa o mancanta.',
- 'recaptcha-create' => "Për giuté a protege contra la creassion automatisà ëd pàgine, për piasì ch'a scriv le doe paròle ch'a s-ciàira ant la casela sì-sota:",
+ 'recaptcha-create' => "Për giuté a protege contra la creassion automatisà ëd pàgine, për piasì ch'a scriv le doe paròle ch'a s-ciàira ant la casela sì-sota:", # Fuzzy
);
/** Portuguese (português)
* @author Hamilton Abreu
*/
$messages['pt'] = array(
- 'recaptcha-edit' => 'Para proteger-nos de spam, por favor escreva as duas palavras visíveis abaixo:',
- 'recaptcha-addurl' => "A sua edição contém links externos novos. Como prevenção contra sistemas automatizados de inserção de ''spam'', escreva as duas palavras visíveis na caixa abaixo:",
- 'recaptcha-badpass' => 'Para proteger-nos de robots que tentam adivinhar senhas, por favor escreva as duas palavras visíveis abaixo:',
- 'recaptcha-createaccount' => 'Para proteger-nos de criação automática de contas, por favor escreva as duas palavras visíveis abaixo:',
+ 'recaptcha-edit' => 'Para proteger-nos de spam, por favor escreva as duas palavras visíveis abaixo:', # Fuzzy
+ 'recaptcha-addurl' => "A sua edição contém links externos novos. Como prevenção contra sistemas automatizados de inserção de ''spam'', escreva as duas palavras visíveis na caixa abaixo:", # Fuzzy
+ 'recaptcha-badlogin' => 'Para proteger-nos de robots que tentam adivinhar senhas, por favor escreva as duas palavras visíveis abaixo:', # Fuzzy
+ 'recaptcha-createaccount' => 'Para proteger-nos de criação automática de contas, por favor escreva as duas palavras visíveis abaixo:', # Fuzzy
'recaptcha-createaccount-fail' => 'A resposta ao reCAPTCHA é errada.',
- 'recaptcha-create' => 'Para proteger-nos da criação automática de páginas, por favor escreva as duas palavras visíveis abaixo:',
+ 'recaptcha-create' => 'Para proteger-nos da criação automática de páginas, por favor escreva as duas palavras visíveis abaixo:', # Fuzzy
);
/** Brazilian Portuguese (português do Brasil)
*/
$messages['pt-br'] = array(
- 'recaptcha-edit' => 'Para ajudar a prevenir contra vandalismos, por favor digite as duas palavras que você vê na caixa abaixo:',
- 'recaptcha-addurl' => 'A sua edição inclui ligações externas. Para ajudar a prevenir contra vandalismos, por favor digite as duas palavras que você vê na caixa abaixo:',
- 'recaptcha-badpass' => 'Para ajudar a prevenir contra tentativas de desbloquear senhas, por favor digite as duas palavras que você vê na caixa abaixo:',
- 'recaptcha-createaccount' => 'Para ajudar a prevenir contra criação automatizada de usuários, por favor digite as duas palavras que você vê na caixa abaixo:',
+ 'recaptcha-edit' => 'Para ajudar a prevenir contra vandalismos, por favor digite as duas palavras que você vê na caixa abaixo:', # Fuzzy
+ 'recaptcha-addurl' => 'A sua edição inclui ligações externas. Para ajudar a prevenir contra vandalismos, por favor digite as duas palavras que você vê na caixa abaixo:', # Fuzzy
+ 'recaptcha-badlogin' => 'Para ajudar a prevenir contra tentativas de desbloquear senhas, por favor digite as duas palavras que você vê na caixa abaixo:', # Fuzzy
+ 'recaptcha-createaccount' => 'Para ajudar a prevenir contra criação automatizada de usuários, por favor digite as duas palavras que você vê na caixa abaixo:', # Fuzzy
'recaptcha-createaccount-fail' => 'Resposta incorreta ao reCAPTCHA.',
- 'recaptcha-create' => 'Para ajudar a prevenir contra criação automatizada de páginas, por favor digite as duas palavras que você vê na caixa abaixo:',
+ 'recaptcha-create' => 'Para ajudar a prevenir contra criação automatizada de páginas, por favor digite as duas palavras que você vê na caixa abaixo:', # Fuzzy
);
/** tarandíne (tarandíne)
* @author Joetaras
*/
$messages['roa-tara'] = array(
- 'recaptcha-edit' => "Pe darne 'na màne a proteggere condre le cangiaminde automatece de le rummate, pe piacere scrive le doje parole ca 'ndruche jndr'à buatte aqquà sotte:",
- 'recaptcha-addurl' => "Le cangiaminde tune 'ngludone collegaminde de fore nuève. Pe darne 'na màne a proteggere condre le cangiaminde automatece de le rummate, pe piacere scrive le doje parole ca 'ndruche jndr'à buatte aqquà sotte:",
- 'recaptcha-badpass' => "Pe darne 'na màne a proteggere condre le futteminde automatece de le passuord, pe piacere scrive le doje parole ca 'ndruche jndr'à buatte aqquà sotte:",
- 'recaptcha-createaccount' => "Pe darne 'na màne a proteggere condre le ccrejaziune automatece de le cunde, pe piacere scrive le doje parole ca 'ndruche jndr'à buatte aqquà sotte:",
+ 'recaptcha-edit' => "Pe darne 'na màne a proteggere condre le cangiaminde automatece de le rummate, pe piacere scrive le doje parole ca 'ndruche jndr'à buatte aqquà sotte:", # Fuzzy
+ 'recaptcha-addurl' => "Le cangiaminde tune 'ngludone collegaminde de fore nuève. Pe darne 'na màne a proteggere condre le cangiaminde automatece de le rummate, pe piacere scrive le doje parole ca 'ndruche jndr'à buatte aqquà sotte:", # Fuzzy
+ 'recaptcha-badlogin' => "Pe darne 'na màne a proteggere condre le futteminde automatece de le passuord, pe piacere scrive le doje parole ca 'ndruche jndr'à buatte aqquà sotte:", # Fuzzy
+ 'recaptcha-createaccount' => "Pe darne 'na màne a proteggere condre le ccrejaziune automatece de le cunde, pe piacere scrive le doje parole ca 'ndruche jndr'à buatte aqquà sotte:", # Fuzzy
'recaptcha-createaccount-fail' => 'Resposte reCAPTCHA ingorrette o mangande.',
- 'recaptcha-create' => "Pe darne 'na màne a proteggere condre le ccrejaziune automatece de le pàggene, pe piacere scrive le doje parole ca 'ndruche jndr'à buatte aqquà sotte:",
+ 'recaptcha-create' => "Pe darne 'na màne a proteggere condre le ccrejaziune automatece de le pàggene, pe piacere scrive le doje parole ca 'ndruche jndr'à buatte aqquà sotte:", # Fuzzy
);
/** Russian (руÑÑкий)
+ * @author Okras
* @author ÐлекÑандр Сигачёв
*/
$messages['ru'] = array(
- 'recaptcha-edit' => 'Ð’ целÑÑ… защиты от автоматичеÑкого Ñпама в правках, пожалуйÑта, введите два Ñлова, которые вы видите ниже:',
- 'recaptcha-addurl' => 'Ваша правка Ñодержит новые внешние ÑÑылки. Ð’ целÑÑ… защиты от автоматичеÑкого Ñпама, пожалуйÑта, введите два Ñлова, которые вы видите ниже:',
- 'recaptcha-badpass' => 'Ð’ целÑÑ… защиты от автоматичеÑкого подбора паролÑ, пожалуйÑта, введите два Ñлова, которые вы видите ниже:',
- 'recaptcha-createaccount' => 'Ð’ целÑÑ… защиты от автоматичеÑкого ÑÐ¾Ð·Ð´Ð°Ð½Ð¸Ñ ÑƒÑ‡Ñ‘Ñ‚Ð½Ñ‹Ñ… запиÑей, пожалуйÑта, введите два Ñлова, которые вы видите ниже:',
+ 'recaptcha-edit' => 'Ð’ целÑÑ… защиты от автоматичеÑкого Ñпама в правках проÑим Ð²Ð°Ñ Ð²Ð²ÐµÑти два Ñлова, которые вы видите ниже:',
+ 'recaptcha-addurl' => 'Ваша правка Ñодержит новые внешние ÑÑылки. Ð’ целÑÑ… защиты от автоматичеÑкого Ñпама проÑим Ð²Ð°Ñ Ð²Ð²ÐµÑти два Ñлова, которые вы видите в рамке ниже:',
+ 'recaptcha-badlogin' => 'Ð’ целÑÑ… защиты от автоматичеÑкого подбора Ð¿Ð°Ñ€Ð¾Ð»Ñ Ð¿Ñ€Ð¾Ñим Ð²Ð°Ñ Ð²Ð²ÐµÑти два Ñлова, которые вы видите в рамке ниже:',
+ 'recaptcha-createaccount' => 'Ð’ целÑÑ… защиты от автоматичеÑкого ÑÐ¾Ð·Ð´Ð°Ð½Ð¸Ñ ÑƒÑ‡Ñ‘Ñ‚Ð½Ñ‹Ñ… запиÑей проÑим Ð²Ð°Ñ Ð²Ð²ÐµÑти два Ñлова, которые вы видите в рамке ниже:',
'recaptcha-createaccount-fail' => 'Ответ reCAPTCHA неправильный или отÑутÑтвует.',
- 'recaptcha-create' => 'Ð’ целÑÑ… защиты от автоматичеÑкого ÑÐ¾Ð·Ð´Ð°Ð½Ð¸Ñ Ñтраниц, пожалуйÑта, введите два Ñлова, которые вы видите ниже:',
+ 'recaptcha-create' => 'Ð’ целÑÑ… защиты от автоматичеÑкого ÑÐ¾Ð·Ð´Ð°Ð½Ð¸Ñ Ñтраниц проÑим Ð²Ð°Ñ Ð²Ð²ÐµÑти два Ñлова, которые вы видите в рамке ниже:',
);
/** Sinhala (සිංහල)
@@ -491,14 +506,15 @@ $messages['sr-el'] = array(
);
/** Swedish (svenska)
+ * @author WikiPhoenix
*/
$messages['sv'] = array(
- 'recaptcha-edit' => 'Den här sidan skyddas mot spam-robotar, bevisa att du är en människa genom att skriva de två orden du ser i boxen nedan:',
- 'recaptcha-addurl' => 'Din förändring av sidan innehåller nya externa länkar, vilket är typiskt för spam. Bevisa att du är en människa genom att skriva de två orden du ser i boxen nedan:',
- 'recaptcha-badpass' => 'För att skydda wikin mot robotar som gissar användares lösenord behöver användare bevisa att de är människor. Skriv ner de två orden som du ser i boxen nedan:',
- 'recaptcha-createaccount' => 'För att skydda wikin mot robotar som skapar konton behöver användare bevisa att de är människor. Var vänlig och skriv ner de två orden du ser i boxen nedan:',
+ 'recaptcha-edit' => 'För att skydda wikin mot automatiskt redigerings-spam ber vi dig att skriva de två orden du ser i rutan nedan.',
+ 'recaptcha-addurl' => 'Din redigering innehåller nya externa länkar. För att skydda wikin mot automatiserat spam ber vi dig att skriva de två ordern du ser i rutan nedan:',
+ 'recaptcha-badlogin' => 'För att skydda wikin mot automatiserade försök att knäcka lösenord ber vi dig att skriva in de två orden du ser i rutan nedan:',
+ 'recaptcha-createaccount' => 'För att skydda wikin mot automatiskt kontoskapande ber vi dig att skriva de två orden som du ser i rutan nedan:',
'recaptcha-createaccount-fail' => 'Du har angivit ett felaktig svar för reCAPTCHA.',
- 'recaptcha-create' => 'För att skydda wikin mot robotar som skapar nya artiklar. Var vänlig och skriv ner de två orden som finns i boxen nedan:',
+ 'recaptcha-create' => 'För att skydda wikin mot automatiserade sidskapande ber vi dig att skriva in de två orden du ser i rutan nedan:',
);
/** Swahili (Kiswahili)
@@ -507,7 +523,7 @@ $messages['sv'] = array(
$messages['sw'] = array(
'recaptcha-edit' => 'Ili kusaidia kuzuia mashine zisihariri, tafadhali andika maneno mawili yanayoonekana katika kisanduku pakipo chini:', # Fuzzy
'recaptcha-addurl' => 'Haririo lako lina viungo vipya vya nje. Ili kusaidia katika kuzuisha viungo visivyotakiwa visiwekwe na mashine, tafadhali andika maneno mawili yanayoonekana katika kisanduku pakipo chini:', # Fuzzy
- 'recaptcha-badpass' => 'Ili kusaidia katika kuzuia neno lako la siri lisigunduliwe na mashine, tafadhali andika maneno mawili yanayoonekana katika kisanduku pakipo chini:', # Fuzzy
+ 'recaptcha-badlogin' => 'Ili kusaidia katika kuzuia neno lako la siri lisigunduliwe na mashine, tafadhali andika maneno mawili yanayoonekana katika kisanduku pakipo chini:', # Fuzzy
'recaptcha-createaccount' => 'Ili kusaidia kuzuia akaunti zisifunguliwe nyingi na mashine, tafadhali andika maneno mawili yanayoonekana katika kisanduku pakipo chini:', # Fuzzy
'recaptcha-createaccount-fail' => 'Jibu la swali la CAPTCHA si sahihi au halipo.', # Fuzzy
'recaptcha-create' => 'Ili kusaidia kuzuia kurasa zisianzishwe nyingi na mashine, tafadhali andika maneno mawili yanayoonekana katika kisanduku pakipo chini:', # Fuzzy
@@ -518,36 +534,39 @@ $messages['sw'] = array(
*/
$messages['tl'] = array(
'recaptcha-desc' => 'Modulo ng reCAPTCHA para sa Pagtiyak ng Pagbago',
- 'recaptcha-edit' => 'Upang makatulong sa pagprutekta laban sa kusang basurang pamamatnugot, paki imakinilya ang dalawang mga salitang nakikita mo sa loob ng kahong nasa ibaba:',
- 'recaptcha-addurl' => 'Ang pagbabago mo ay nagsasama ng bagong panlabas na mga kawing. Upang makatulong sa pagprutekta laban sa kusang paglusob ng basurang-liham, paki imakinilya ang dalawang mga salitang nakikita sa loob ng kahong nasa ibaba:',
- 'recaptcha-badpass' => 'Upang makatulong sa pagsasanggalang laban sa kusang panghuhula ng hudyat, paki imakinilya ang dalawang mga salitang nakikita mo sa loob ng kahong nasa ibaba:',
- 'recaptcha-createaccount' => 'Upang makatulong sa pagprutekta laban sa kusang paglikha ng akawnt, paki imakinilya ang dalawang mga salitang nakikita mo sa loob ng kahong nasa ibaba:',
+ 'recaptcha-edit' => 'Upang makatulong sa pagprutekta laban sa kusang basurang pamamatnugot, paki imakinilya ang dalawang mga salitang nakikita mo sa loob ng kahong nasa ibaba:', # Fuzzy
+ 'recaptcha-addurl' => 'Ang pagbabago mo ay nagsasama ng bagong panlabas na mga kawing. Upang makatulong sa pagprutekta laban sa kusang paglusob ng basurang-liham, paki imakinilya ang dalawang mga salitang nakikita sa loob ng kahong nasa ibaba:', # Fuzzy
+ 'recaptcha-badlogin' => 'Upang makatulong sa pagsasanggalang laban sa kusang panghuhula ng hudyat, paki imakinilya ang dalawang mga salitang nakikita mo sa loob ng kahong nasa ibaba:', # Fuzzy
+ 'recaptcha-createaccount' => 'Upang makatulong sa pagprutekta laban sa kusang paglikha ng akawnt, paki imakinilya ang dalawang mga salitang nakikita mo sa loob ng kahong nasa ibaba:', # Fuzzy
'recaptcha-createaccount-fail' => 'Hindi tama o nawawalang sagot sa reCAPTCHA.',
- 'recaptcha-create' => 'Upang makatulong sa pagprutekta laban sa kusang paglikha ng pahina, paki imakinilya ang dalawang mga salitang nakikita mo sa loob ng kahong nasa ibaba:',
+ 'recaptcha-create' => 'Upang makatulong sa pagprutekta laban sa kusang paglikha ng pahina, paki imakinilya ang dalawang mga salitang nakikita mo sa loob ng kahong nasa ibaba:', # Fuzzy
);
/** Ukrainian (українÑька)
+ * @author Andriykopanytsia
* @author Base
* @author ТеÑÑ‚
*/
$messages['uk'] = array(
- 'recaptcha-edit' => 'Ð”Ð»Ñ Ð·Ð°Ð¿Ð¾Ð±Ñ–Ð³Ð°Ð½Ð½Ñ Ð°Ð²Ñ‚Ð¾Ð¼Ð°Ñ‚Ð¸Ñ‡Ð½Ð¾Ð¼Ñƒ Ñпаму у редагуваннÑÑ…, будь лаÑка, введіть два Ñлова, Ñкі Ви бачите у блоці нижче:',
- 'recaptcha-addurl' => 'Ваше Ñ€ÐµÐ´Ð°Ð³ÑƒÐ²Ð°Ð½Ð½Ñ Ð¼Ñ–Ñтить зовнішні поÑиланнÑ. Ð”Ð»Ñ Ð·Ð°Ð¿Ð¾Ð±Ñ–Ð³Ð°Ð½Ð½Ñ Ð°Ð²Ñ‚Ð¾Ð¼Ð°Ñ‚Ð¸Ñ‡Ð½Ð¾Ð¼Ñƒ Ñпаму у редагуваннÑÑ…, будь лаÑка, введіть два Ñлова, Ñкі Ви бачите у блоці нижче:',
- 'recaptcha-badpass' => 'Ð”Ð»Ñ Ð·Ð°Ð¿Ð¾Ð±Ñ–Ð³Ð°Ð½Ð½Ñ Ð°Ð²Ñ‚Ð¾Ð¼Ð°Ñ‚Ð¸Ñ‡Ð½Ð¾Ð¼Ñƒ підбору паролю, будь лаÑка, введіть два Ñлова, Ñкі Ви бачите у блоці нижче:',
- 'recaptcha-createaccount' => 'Ð”Ð»Ñ Ð·Ð°Ð¿Ð¾Ð±Ñ–Ð³Ð°Ð½Ð½Ñ Ð°Ð²Ñ‚Ð¾Ð¼Ð°Ñ‚Ð¸Ñ‡Ð½Ð¾Ð¼Ñƒ Ñтворенню облікових запиÑів, будь лаÑка, введіть два Ñлова, Ñкі Ви бачите у блоці нижче:',
+ 'recaptcha-edit' => 'Ð”Ð»Ñ Ð·Ð°Ð¿Ð¾Ð±Ñ–Ð³Ð°Ð½Ð½Ñ Ð°Ð²Ñ‚Ð¾Ð¼Ð°Ñ‚Ð¸Ñ‡Ð½Ð¾Ð¼Ñƒ Ñпаму у редагуваннÑÑ… проÑимо Ð²Ð°Ñ Ð²Ð²ÐµÑти два Ñлова, Ñкі Ви бачите у блоці нижче:',
+ 'recaptcha-addurl' => 'Ваше Ñ€ÐµÐ´Ð°Ð³ÑƒÐ²Ð°Ð½Ð½Ñ Ð¼Ñ–Ñтить зовнішні поÑиланнÑ. Ð”Ð»Ñ Ð·Ð°Ð¿Ð¾Ð±Ñ–Ð³Ð°Ð½Ð½Ñ Ð°Ð²Ñ‚Ð¾Ð¼Ð°Ñ‚Ð¸Ñ‡Ð½Ð¾Ð¼Ñƒ Ñпаму у редагуваннÑÑ… проÑимо Ð²Ð°Ñ Ð²Ð²ÐµÑти два Ñлова, Ñкі Ви бачите у блоці нижче:',
+ 'recaptcha-badlogin' => 'Ð”Ð»Ñ Ð·Ð°Ð¿Ð¾Ð±Ñ–Ð³Ð°Ð½Ð½Ñ Ð°Ð²Ñ‚Ð¾Ð¼Ð°Ñ‚Ð¸Ñ‡Ð½Ð¾Ð¼Ñƒ підбору паролю проÑимо Ð²Ð°Ñ Ð²Ð²ÐµÑти два Ñлова, Ñкі Ви бачите у блоці нижче:',
+ 'recaptcha-createaccount' => 'Ð”Ð»Ñ Ð·Ð°Ð¿Ð¾Ð±Ñ–Ð³Ð°Ð½Ð½Ñ Ð°Ð²Ñ‚Ð¾Ð¼Ð°Ñ‚Ð¸Ñ‡Ð½Ð¾Ð¼Ñƒ Ñтворенню облікових запиÑів проÑимо Ð²Ð°Ñ Ð²Ð²ÐµÑти два Ñлова, Ñкі Ви бачите у блоці нижче:',
'recaptcha-createaccount-fail' => 'Відповідь reCAPTCHA неправильна або відÑутнÑ.',
- 'recaptcha-create' => 'Ð”Ð»Ñ Ð·Ð°Ð¿Ð¾Ð±Ñ–Ð³Ð°Ð½Ð½Ñ Ð°Ð²Ñ‚Ð¾Ð¼Ð°Ñ‚Ð¸Ñ‡Ð½Ð¾Ð¼Ñƒ Ñтворенню Ñторінок, будь лаÑка, введіть два Ñлова, Ñкі Ви бачите у блоці нижче:',
+ 'recaptcha-create' => 'З метою захиÑту вікі від автоматичного ÑÑ‚Ð²Ð¾Ñ€ÐµÐ½Ð½Ñ Ñторінки проÑимо Ð²Ð°Ñ Ð²Ð²ÐµÑти два Ñлова, Ñкі ви бачите у блоці нижче:',
);
/** Vietnamese (Tiếng Việt)
+ * @author Minh Nguyen
*/
$messages['vi'] = array(
- 'recaptcha-edit' => 'Äể giúp tránh các sá»­a đổi rác tá»± Ä‘á»™ng, xin hãy gõ hai từ mà bạn nhìn thấy vào ô dÆ°á»›i đây:',
- 'recaptcha-addurl' => 'Sá»­a đổi của bạn có chứa liên kết ngoài má»›i. Äể giúp tránh các sá»­a đổi rác tá»± Ä‘á»™ng, xin hãy gõ hai từ mà bạn nhìn vào ô dÆ°á»›i đây:',
- 'recaptcha-badpass' => 'Äể giúp tránh bẻ khóa mật khẩu tá»± Ä‘á»™ng, xin hãy gõ hai từ mà bạn nhìn vào ô dÆ°á»›i đây:',
- 'recaptcha-createaccount' => 'Äể giúp tránh việc mở tài khoản tá»± Ä‘á»™ng, xin hãy gõ hai từ mà bạn nhìn vào ô dÆ°á»›i đây:',
+ 'recaptcha-desc' => 'Mô đun reCAPTCHA cho Confirm Edit',
+ 'recaptcha-edit' => 'Äể giúp tránh các sá»­a đổi spam tá»± Ä‘á»™ng, xin vui lòng gõ hai từ mà bạn nhìn thấy vào há»™p dÆ°á»›i đây:',
+ 'recaptcha-addurl' => 'Sá»­a đổi của bạn có chứa liên kết ngoài má»›i. Äể giúp tránh các sá»­a đổi spam tá»± Ä‘á»™ng, xin vui lòng gõ hai từ mà bạn nhìn vào há»™p dÆ°á»›i đây:',
+ 'recaptcha-badlogin' => 'Äể giúp tránh bẻ khóa mật khẩu tá»± Ä‘á»™ng, xin vui lòng gõ hai từ mà bạn nhìn vào há»™p dÆ°á»›i đây:',
+ 'recaptcha-createaccount' => 'Äể giúp tránh việc mở tài khoản tá»± Ä‘á»™ng, xin vui lòng gõ hai từ mà bạn nhìn vào há»™p dÆ°á»›i đây:',
'recaptcha-createaccount-fail' => 'Thiếu câu trả lá»i reCAPTCHA hoặc câu trả lá»i không đúng.',
- 'recaptcha-create' => 'Äể giúp tránh việc tạo trang tá»± Ä‘á»™ng, xin hãy gõ hai từ mà bạn nhìn vào ô dÆ°á»›i đây:',
+ 'recaptcha-create' => 'Äể giúp tránh việc tạo trang tá»± Ä‘á»™ng, xin vui lòng gõ hai từ mà bạn nhìn vào há»™p dÆ°á»›i đây:',
);
/** Simplified Chinese (中文(简体)‎)
@@ -558,19 +577,20 @@ $messages['vi'] = array(
$messages['zh-hans'] = array(
'recaptcha-edit' => '为了é¿å…垃圾用户自动编辑,请键入下é¢æ¡†ä¸­çš„两个å•è¯ï¼š',
'recaptcha-addurl' => '您的编辑包å«æ–°çš„外部链接。为了é¿å…垃圾用户自动编辑,请键入下é¢æ¡†ä¸­çš„两个å•è¯ï¼š',
- 'recaptcha-badpass' => '为é¿å…自动密ç ç ´è§£ï¼Œè¯·é”®å…¥ä¸‹é¢æ¡†ä¸­çš„两个å•è¯ï¼š',
+ 'recaptcha-badlogin' => '为é¿å…自动密ç ç ´è§£ï¼Œè¯·é”®å…¥ä¸‹é¢æ¡†ä¸­çš„两个å•è¯ï¼š',
'recaptcha-createaccount' => '为了é¿å…创建自动垃圾用户,请键入下é¢æ¡†ä¸­çš„两个å•è¯ï¼š',
'recaptcha-createaccount-fail' => 'reCAPTCHA 答案ä¸æ­£ç¡®æˆ–未填写。',
'recaptcha-create' => '为了é¿å…垃圾用户自动创建页é¢ï¼Œè¯·é”®å…¥ä¸‹é¢æ¡†ä¸­çš„两个å•è¯ï¼š',
);
/** Traditional Chinese (中文(ç¹é«”)‎)
+ * @author StephDC
*/
$messages['zh-hant'] = array(
- 'recaptcha-edit' => 'è¦å¹«åŠ©ä¿è­·å…å—垃圾郵件自動的編輯,請éµå…¥æ‚¨åœ¨ä¸‹é¢çš„框中看到這兩個詞:',
- 'recaptcha-addurl' => '您的編輯包å«æ–°çš„外部éˆæŽ¥ã€‚為了幫助防止自動垃圾郵件,請éµå…¥æ‚¨åœ¨ä¸‹é¢çš„框中看到這兩個詞:',
- 'recaptcha-badpass' => '為幫助防止自動密碼破解,請éµå…¥æ‚¨çœ‹åˆ°ä¸‹é¢çš„框中的兩個字:',
- 'recaptcha-createaccount' => '為了幫助防止創建自動化的帳戶,請éµå…¥æ‚¨åœ¨ä¸‹é¢çš„框中看到的這兩個字:',
+ 'recaptcha-edit' => '為了防止wiki被自動編輯的垃圾æ害,我們請您éµå…¥æ‚¨åœ¨ä¸‹é¢çš„框中看到的這兩個單詞:',
+ 'recaptcha-addurl' => '您的編輯包å«æ–°çš„外部éˆæŽ¥ã€‚為了幫助防止自動垃圾郵件,請éµå…¥æ‚¨åœ¨ä¸‹é¢çš„框中看到這兩個詞:', # Fuzzy
+ 'recaptcha-badlogin' => '為幫助防止自動密碼破解,請éµå…¥æ‚¨çœ‹åˆ°ä¸‹é¢çš„框中的兩個字:', # Fuzzy
+ 'recaptcha-createaccount' => '為了幫助防止創建自動化的帳戶,請éµå…¥æ‚¨åœ¨ä¸‹é¢çš„框中看到的這兩個字:', # Fuzzy
'recaptcha-createaccount-fail' => 'ä¸æ­£ç¢ºæˆ–缺失的 reCAPTCHA 答案。',
- 'recaptcha-create' => '為了幫助防止自動的é å‰µå»ºï¼Œè«‹éµå…¥æ‚¨åœ¨ä¸‹é¢çš„框中看到這兩個詞:',
+ 'recaptcha-create' => '為了幫助防止自動的é å‰µå»ºï¼Œè«‹éµå…¥æ‚¨åœ¨ä¸‹é¢çš„框中看到這兩個詞:', # Fuzzy
);
diff --git a/extensions/ConfirmEdit/blacklist b/extensions/ConfirmEdit/blacklist
new file mode 100644
index 00000000..b9f8cd12
--- /dev/null
+++ b/extensions/ConfirmEdit/blacklist
@@ -0,0 +1,40 @@
+altar
+anus
+ass
+bitch
+breast
+butt
+christ
+cock
+crazy
+cross
+cum
+cunt
+daemon
+demon
+dick
+dumb
+fuck
+hag
+holy
+horny
+idiot
+jerk
+jesus
+lust
+nerd
+nigger
+penis
+piss
+pussy
+satan
+sex
+shit
+smut
+stupid
+tit
+tits
+twat
+vamp
+whore
+witch
diff --git a/extensions/ConfirmEdit/captcha.py b/extensions/ConfirmEdit/captcha.py
index 3d13c054..558b9fab 100644
--- a/extensions/ConfirmEdit/captcha.py
+++ b/extensions/ConfirmEdit/captcha.py
@@ -183,6 +183,7 @@ if __name__ == '__main__':
To check a reply, hash it in the same way with the same salt and
secret key, then compare with the hash value given.
"""
+ script_dir = os.path.dirname(os.path.realpath(__file__))
parser = OptionParser()
parser.add_option("--wordlist", help="A list of words (required)", metavar="WORDS.txt")
parser.add_option("--random", help="Use random charcters instead of a wordlist", action="store_true")
@@ -191,7 +192,7 @@ if __name__ == '__main__':
parser.add_option("--font", help="The font to use (required)", metavar="FONT.ttf")
parser.add_option("--font-size", help="The font size (default 40)", metavar="N", type='int', default=40)
parser.add_option("--count", help="The maximum number of images to make (default 20)", metavar="N", type='int', default=20)
- parser.add_option("--blacklist", help="A blacklist of words that should not be used", metavar="FILE")
+ parser.add_option("--blacklist", help="A blacklist of words that should not be used", metavar="FILE", default=os.path.join(script_dir, "blacklist"))
parser.add_option("--fill", help="Fill the output directory to contain N files, overrides count, cannot be used with --dirs", metavar="N", type='int')
parser.add_option("--dirs", help="Put the images into subdirectories N levels deep - $wgCaptchaDirectoryLevels", metavar="N", type='int')
parser.add_option("--verbose", "-v", help="Show debugging information", action='store_true')
@@ -219,8 +220,8 @@ if __name__ == '__main__':
font = opts.font
else:
sys.exit("Need to specify the location of a font")
-
- blacklistfile = opts.blacklist
+
+ blacklist = read_wordlist(opts.blacklist)
count = opts.count
fill = opts.fill
dirs = opts.dirs
@@ -236,12 +237,7 @@ if __name__ == '__main__':
words = [x for x in words
if len(x) in (4,5) and x[0] != "f"
and x[0] != x[1] and x[-1] != x[-2]]
-
- if blacklistfile:
- blacklist = read_wordlist(blacklistfile)
- else:
- blacklist = []
-
+
for i in range(count):
word = pick_word(words, blacklist, verbose, opts.number_words, opts.min_length, opts.max_length)
salt = "%08x" % random.randrange(2**32)
diff --git a/extensions/ConfirmEdit/resources/ext.confirmEdit.asirra.js b/extensions/ConfirmEdit/resources/ext.confirmEdit.asirra.js
index 52dc532c..34296d03 100644
--- a/extensions/ConfirmEdit/resources/ext.confirmEdit.asirra.js
+++ b/extensions/ConfirmEdit/resources/ext.confirmEdit.asirra.js
@@ -9,18 +9,17 @@
\*======================================================================*/
jQuery( function( $ ) {
- var asirraform = $( "form#userlogin2" );
+ // Selectors for create account, login, and page edit forms.
+ var asirraform = $( 'form#userlogin2, #userloginForm form, form#editform' );
var submitButtonClicked = document.createElement("input");
var passThroughFormSubmit = false;
function PrepareSubmit() {
- console.log( 'daa' );
submitButtonClicked.type = "hidden";
var inputFields = asirraform.find( "input" );
for (var i=0; i<inputFields.length; i++) {
if (inputFields[i].type === "submit") {
inputFields[i].onclick = function(event) {
- console.log( this );
submitButtonClicked.name = this.name;
submitButtonClicked.value = this.value;
}
@@ -42,7 +41,7 @@ jQuery( function( $ ) {
function HumanCheckComplete(isHuman) {
if (!isHuman) {
- alert( mw.msg( 'asirra-failed' ) );
+ window.alert( mediaWiki.msg( 'asirra-failed' ) );
} else {
asirraform.append(submitButtonClicked);
passThroughFormSubmit = true;
diff --git a/extensions/FluxBBAuthPlugin.php b/extensions/FluxBBAuthPlugin.php
index 16b26c41..32d4b145 100644
--- a/extensions/FluxBBAuthPlugin.php
+++ b/extensions/FluxBBAuthPlugin.php
@@ -2,7 +2,7 @@
$wgExtensionCredits['other'][] = array(
'name' => 'FluxBBAuthPlugin',
- 'version' => '1.5',
+ 'version' => '1.6',
'description' => 'Use FluxBB accounts in MediaWiki',
'author' => 'Pierre Schmitz',
'url' => 'https://pierre-schmitz.com/'
@@ -59,7 +59,6 @@ class FluxBBAuthPlugin extends AuthPlugin {
public function modifyUITemplate( &$template, &$type ) {
$template->set( 'usedomain', false );
- $template->set('link', 'Um Dich hier anzumelden, nutze Deine Konto-Daten aus dem <a href="https://bbs.archlinux.de/">archlinux.de-Forum</a>.');
}
public function updateUser( &$user ) {
@@ -98,6 +97,10 @@ class FluxBBAuthPlugin extends AuthPlugin {
return false;
}
+ public function updateExternalDBGroups( $user, $addgroups, $delgroups = array() ) {
+ return false;
+ }
+
public function canCreateAccounts() {
return false;
}
diff --git a/extensions/Gadgets/ApiQueryGadgets.php b/extensions/Gadgets/ApiQueryGadgets.php
index 90e77a3b..a529daf0 100644
--- a/extensions/Gadgets/ApiQueryGadgets.php
+++ b/extensions/Gadgets/ApiQueryGadgets.php
@@ -54,6 +54,10 @@ class ApiQueryGadgets extends ApiQueryBase {
private function getList() {
$gadgets = Gadget::loadStructuredList();
+ if ( $gadgets === false ) {
+ return array();
+ }
+
$result = array();
foreach ( $gadgets as $category => $list ) {
if ( $this->categories && !isset( $this->categories[$category] ) ) {
diff --git a/extensions/Gadgets/GadgetHooks.php b/extensions/Gadgets/GadgetHooks.php
new file mode 100644
index 00000000..ee1f4081
--- /dev/null
+++ b/extensions/Gadgets/GadgetHooks.php
@@ -0,0 +1,257 @@
+<?php
+
+/**
+ * Copyright © 2007 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
+ *
+ * @file
+ */
+
+class GadgetHooks {
+ /**
+ * ArticleSaveComplete hook handler.
+ *
+ * @param $article Article
+ * @param $user User
+ * @param $text String: New page text
+ * @return bool
+ */
+ public static function articleSaveComplete( $article, $user, $text ) {
+ // update cache if MediaWiki:Gadgets-definition was edited
+ wfProfileIn( __METHOD__ );
+ $title = $article->getTitle();
+ if ( $title->getNamespace() == NS_MEDIAWIKI && $title->getText() == 'Gadgets-definition' ) {
+ Gadget::loadStructuredList( $text );
+ }
+ wfProfileOut( __METHOD__ );
+ return true;
+ }
+
+ /**
+ * UserGetDefaultOptions hook handler
+ * @param $defaultOptions Array of default preference keys and values
+ * @return bool
+ */
+ public static function userGetDefaultOptions( &$defaultOptions ) {
+ $gadgets = Gadget::loadStructuredList();
+ if ( !$gadgets ) {
+ return true;
+ }
+
+ /**
+ * @var $gadget Gadget
+ */
+ foreach ( $gadgets as $thisSection ) {
+ foreach ( $thisSection as $gadgetId => $gadget ) {
+ if ( $gadget->isOnByDefault() ) {
+ $defaultOptions['gadget-' . $gadgetId] = 1;
+ }
+ }
+ }
+
+ return true;
+ }
+
+ /**
+ * GetPreferences hook handler.
+ * @param $user User
+ * @param $preferences Array: Preference descriptions
+ * @return bool
+ */
+ public static function getPreferences( $user, &$preferences ) {
+ wfProfileIn( __METHOD__ );
+ $gadgets = Gadget::loadStructuredList();
+ if ( !$gadgets ) {
+ wfProfileOut( __METHOD__ );
+ return true;
+ }
+
+ $options = array();
+ $default = array();
+ foreach ( $gadgets as $section => $thisSection ) {
+ $available = array();
+
+ /**
+ * @var $gadget Gadget
+ */
+ foreach ( $thisSection as $gadget ) {
+ if ( $gadget->isAllowed( $user ) ) {
+ $gname = $gadget->getName();
+ # bug 30182: dir="auto" because it's often not translated
+ $desc = '<span dir="auto">' . $gadget->getDescription() . '</span>';
+ $available[$desc] = $gname;
+ if ( $gadget->isEnabled( $user ) ) {
+ $default[] = $gname;
+ }
+ }
+ }
+
+ if ( $section !== '' ) {
+ $section = wfMessage( "gadget-section-$section" )->parse();
+
+ if ( count ( $available ) ) {
+ $options[$section] = $available;
+ }
+ } else {
+ $options = array_merge( $options, $available );
+ }
+ }
+
+ $preferences['gadgets-intro'] =
+ array(
+ 'type' => 'info',
+ 'label' => '&#160;',
+ 'default' => Xml::tags( 'tr', array(),
+ Xml::tags( 'td', array( 'colspan' => 2 ),
+ wfMessage( 'gadgets-prefstext' )->parseAsBlock() ) ),
+ 'section' => 'gadgets',
+ 'raw' => 1,
+ 'rawrow' => 1,
+ );
+
+ $preferences['gadgets'] =
+ array(
+ 'type' => 'multiselect',
+ 'options' => $options,
+ 'section' => 'gadgets',
+ 'label' => '&#160;',
+ 'prefix' => 'gadget-',
+ 'default' => $default,
+ );
+ wfProfileOut( __METHOD__ );
+
+ return true;
+ }
+
+ /**
+ * ResourceLoaderRegisterModules hook handler.
+ * @param $resourceLoader ResourceLoader
+ * @return bool
+ */
+ public static function registerModules( &$resourceLoader ) {
+ $gadgets = Gadget::loadList();
+ if ( !$gadgets ) {
+ return true;
+ }
+
+ /**
+ * @var $g Gadget
+ */
+ foreach ( $gadgets as $g ) {
+ $module = $g->getModule();
+ if ( $module ) {
+ $resourceLoader->register( $g->getModuleName(), $module );
+ }
+ }
+ return true;
+
+ }
+
+ /**
+ * BeforePageDisplay hook handler.
+ * @param $out OutputPage
+ * @return bool
+ */
+ public static function beforePageDisplay( $out ) {
+ wfProfileIn( __METHOD__ );
+
+ $gadgets = Gadget::loadList();
+ if ( !$gadgets ) {
+ wfProfileOut( __METHOD__ );
+ return true;
+ }
+
+ $lb = new LinkBatch();
+ $lb->setCaller( __METHOD__ );
+ $pages = array();
+
+ /**
+ * @var $gadget Gadget
+ */
+ $user = $out->getUser();
+ foreach ( $gadgets as $gadget ) {
+ if ( $gadget->isEnabled( $user ) && $gadget->isAllowed( $user ) ) {
+ if ( $gadget->hasModule() ) {
+ $out->addModuleStyles( $gadget->getModuleName() );
+ $out->addModules( $gadget->getModuleName() );
+ }
+
+ foreach ( $gadget->getLegacyScripts() as $page ) {
+ $lb->add( NS_MEDIAWIKI, $page );
+ $pages[] = $page;
+ }
+ }
+ }
+
+
+ // Allow other extensions, e.g. MobileFrontend, to disallow legacy gadgets
+ if ( wfRunHooks( 'Gadgets::allowLegacy', array( $out->getContext() ) ) ) {
+ $lb->execute( __METHOD__ );
+
+ $done = array();
+
+ foreach ( $pages as $page ) {
+ if ( isset( $done[$page] ) ) {
+ continue;
+ }
+
+ $done[$page] = true;
+ self::applyScript( $page, $out );
+ }
+ }
+ wfProfileOut( __METHOD__ );
+
+ return true;
+ }
+
+ /**
+ * Adds one legacy script to output.
+ *
+ * @param string $page Unprefixed page title
+ * @param OutputPage $out
+ */
+ private static function applyScript( $page, $out ) {
+ global $wgJsMimeType;
+
+ # bug 22929: disable gadgets on sensitive pages. Scripts loaded through the
+ # ResourceLoader handle this in OutputPage::getModules()
+ # TODO: make this extension load everything via RL, then we don't need to worry
+ # about any of this.
+ if ( $out->getAllowedModules( ResourceLoaderModule::TYPE_SCRIPTS ) < ResourceLoaderModule::ORIGIN_USER_SITEWIDE ) {
+ return;
+ }
+
+ $t = Title::makeTitleSafe( NS_MEDIAWIKI, $page );
+ if ( !$t ) {
+ return;
+ }
+
+ $u = $t->getLocalURL( 'action=raw&ctype=' . $wgJsMimeType );
+ $out->addScriptFile( $u, $t->getLatestRevID() );
+ }
+
+ /**
+ * UnitTestsList hook handler
+ * @param array $files
+ * @return bool
+ */
+ public static function onUnitTestsList( array &$files ) {
+ $testDir = __DIR__ . '/tests/';
+ $files = array_merge( $files, glob( "$testDir/*Test.php" ) );
+ return true;
+ }
+}
diff --git a/extensions/Gadgets/Gadgets.alias.php b/extensions/Gadgets/Gadgets.alias.php
index 1371558d..3b041c51 100644
--- a/extensions/Gadgets/Gadgets.alias.php
+++ b/extensions/Gadgets/Gadgets.alias.php
@@ -5,6 +5,7 @@
* @file
* @ingroup Extensions
*/
+// @codingStandardsIgnoreFile
$specialPageAliases = array();
@@ -53,7 +54,12 @@ $specialPageAliases['bs'] = array(
'Gadgets' => array( 'Dodaci' ),
);
-/** Czech (Äesky) */
+/** Chechen (нохчийн) */
+$specialPageAliases['ce'] = array(
+ 'Gadgets' => array( 'Гаджеташ' ),
+);
+
+/** Czech (ÄeÅ¡tina) */
$specialPageAliases['cs'] = array(
'Gadgets' => array( 'Udělátka' ),
);
@@ -193,6 +199,11 @@ $specialPageAliases['lb'] = array(
'Gadgets' => array( 'Gadgeten' ),
);
+/** Minangkabau (Baso Minangkabau) */
+$specialPageAliases['min'] = array(
+ 'Gadgets' => array( 'Pakakeh' ),
+);
+
/** Macedonian (македонÑки) */
$specialPageAliases['mk'] = array(
'Gadgets' => array( 'Ðлатки' ),
diff --git a/extensions/Gadgets/Gadgets.i18n.php b/extensions/Gadgets/Gadgets.i18n.php
index f0dae2e9..2a754600 100644
--- a/extensions/Gadgets/Gadgets.i18n.php
+++ b/extensions/Gadgets/Gadgets.i18n.php
@@ -88,7 +88,17 @@ See [[meta:Special:Gadgets|Gadgets page in meta.wikimedia.org]]",
'gadgets-export-title' => 'Used as page title. Example: [[Special:Gadgets/export/editbuttons]]',
'gadgets-not-found' => 'Used as error message. Parameters:
* $1 - gadget name',
- 'gadgets-export-text' => 'Used as page description. See example: [[Special:Gadgets/export/editbuttons]]',
+ 'gadgets-export-text' => 'Used as page description in [[Special:Gadgets]].
+
+Refers to {{msg-mw|Gadgets-export-download}}.
+
+See example: [[Special:Gadgets/export/editbuttons]]
+
+Followed by the "Export" form.
+
+Parameters:
+* $1 - gadget name
+* $2 - gadget definition (code)',
'gadgets-export-download' => 'Use the verb for this message. Submit button.
{{Identical|Download}}',
);
@@ -229,8 +239,8 @@ $1',
* @author Basharh
*/
$messages['arc'] = array(
- 'gadgets' => 'ܬܘܣܦÜܬ̈Ü',
- 'gadgets-title' => 'ܬܘܣܦÜܬ̈Ü',
+ 'gadgets' => 'ܬܘܣܦܬ̈Ü',
+ 'gadgets-title' => 'ܬܘܣܦܬ̈Ü',
'gadgets-export-download' => 'Üܚܬ:',
);
@@ -255,7 +265,7 @@ $messages['arz'] = array(
'gadgets-uses' => 'إستخدامات',
);
-/** Assamese (অসমীয়া)
+/** Assamese (অসমীয়া)
* @author Bishnu Saikia
* @author Gitartha.bordoloi
*/
@@ -397,6 +407,36 @@ $messages['bcc'] = array(
'gadgets-uses' => 'استÙاده بیت',
);
+/** Bikol Central (Bikol Central)
+ * @author Geopoet
+ */
+$messages['bcl'] = array(
+ 'gadgets-desc' => 'Minatugot sa mga paragamit na pumili nin kustombre [[Special:Gadgets|CSS and JavaScript gadgets]] sa saindang [[Special:Preferences#mw-prefsection-gadgets|preferences]]',
+ 'prefs-gadgets' => 'Mga gadyet',
+ 'gadgets-prefstext' => 'Sa ibaba yaon an sarong listahan kan espesyal na mga gadyet na saimong mapapagana para sa saimong panindog.
+Ining mga gadyet haros nakabase sa JavaScript, kaya an JavaScript kaipong paganahon sa saimong kilyawan para an mga ini magagamit.
+Tandai na ining mga gadyet mayo nin epekto kaining pahina nin mga kamuyahan.
+
+Tandai man na ining mga espesyal na gadyet bakong parte kan panuklob nin MediaWiki, asin pirmehang pinagpauswag asin pinagmamantine nin mga paragamit sa saimong lokal na wiki.
+
+An mga lokal na mga administrador makakaliwat kan [[MediaWiki:Gadgets-definition|mga pakahulugan]] asin [[Special:Gadgets|mga deskripsyon]] kan yaon na mga gadyet.',
+ 'gadgets' => 'Mga gadyet',
+ 'gadgets-title' => 'Mga gadyet',
+ 'gadgets-pagetext' => 'Sa ibaba yaon an sarong listahan kan espesyal na mga gadyet na an mga paragamit mapapagana sa saindang [[Special:Preferences#mw-prefsection-gadgets|pahina nin mga kamuyahan]], siring sa pinapakahulugan kan [[MediaWiki:Gadgets-definition|mga pakahulugan]]. Ining patanawon minatao nin yanong langkayan sa mga pahina kan mensahe sa sistema na minakahulugan sa lambang deskripsyon nin gadyet asin koda.',
+ 'gadgets-uses' => 'Mga magagamitan',
+ 'gadgets-required-rights' => 'Minahagad kan minasunod {{PLURAL:$2|katanosan|mga katanosan}}:
+
+
+$1',
+ 'gadgets-required-skins' => 'Makukua sa {{PLURAL:$2|$1 kublit|minasunod na mga kublit: $1}}.',
+ 'gadgets-default' => 'Tugmadong pinagpapagana para sa kagabsan.',
+ 'gadgets-export' => 'Eksport',
+ 'gadgets-export-title' => 'Gadyet eksport',
+ 'gadgets-not-found' => 'Gadyet na "$1" dae nanagboan.',
+ 'gadgets-export-text' => 'Tanganing ma-eksport an $1 na gadyet, paki-klik an "{{int:gadgets-export-download}}" pindutan, itagama an naikargang sagunson, magduman sa Espesyal:Importaron sa wiking destinasyon and ikarga ini. An sunod idugang an minasunod sa MediaWiki:Mga Gadyet-pakahulugang pahina: <pre>$2</pre> Ika dapat magkaigwa nin makanigong mga permiso sa wiking destination (kabali na an katanosan na magliwat nin pansistemang mga mensahe) asin an mag-importa gikan sa ikinakargang mga sagunson na dapat kaipong pinagpagana.',
+ 'gadgets-export-download' => 'Kargahon',
+);
+
/** Belarusian (TaraÅ¡kievica orthography) (беларуÑÐºÐ°Ñ (тарашкевіца)‎)
* @author Cesco
* @author EugeneZelenko
@@ -590,21 +630,23 @@ Heu de tenir els permisos adequats en el wiki de destinació (incloent-hi els pe
/** Chechen (нохчийн)
* @author Sasan700
+ * @author Умар
*/
$messages['ce'] = array(
'gadgets-desc' => 'Ðтто бо декъашхошна харжам ба [[Special:Preferences#mw-prefsection-gadgets|гIÐ¸Ñ€Ñ Ð½Ð¸Ñбарца]] CSS- а JavaScript-Ñ…Iоттончаш, лато лууш йерш', # Fuzzy
- 'prefs-gadgets' => 'Хlоттончаш',
- 'gadgets-prefstext' => 'Лаххьа балийна леррина хlоттончаш могlам, шуьга шайга латалур йолуш хьай долахь долучу дакъан.
-Ð¥lара Ñ…lоттончаш дукхачу хьолÑÑ…ÑŒ болх беш ÑŽ оцу JavaScript Ñ‚lÑÑ…ÑŒ, цундела аша латоеза JavaScript шай дуьнена машан гlирÑа чохь, цаьрга болх байта.
-Диц маделаш, Ñ…lара Ñ…lоттончаш болх бÑш Ñз Ñ…lо гlÐ¸Ñ€Ñ Ð½Ð¸Ñбо агlон чохь.
+ 'prefs-gadgets' => 'Гаджеташ',
+ 'gadgets-prefstext' => 'Лаххьа балийна леррина гаджеташ могӀам, шуьга шайга латалур йолуш хьай долахь долучу дакъан.
+ХӀара гаджеташ дуккхачу хьолехь болх беш ю оцу JavaScript тӀехь, цундела аша латоеза JavaScript шай браузер чохь, цаьрга болх байта.
+Диц маделаш, хӀара гаджеташ болх бÑш Ñц хӀо Ð³Ó€Ð¸Ñ€Ñ Ð½Ð¸Ñбо агӀон чохь.
-Ишта диц маде, Ñ…lара Ñ…lоттончаш юкъа йогуш Ñз кху MediaWiki гlирÑашна, мадарра аьльча шу Ñанна декъашхоша шаьш йеш ÑŽ.
+Ишта диц маде, хӀара гаджеташ юкъа йогуш Ñц кху MediaWiki гlирÑашна, мадарра аьльча шу Ñанна декъашхоша шаьш йеш ÑŽ.
Ðдманкуьйгалхошка шайг хийцало и Ñ…lоттончи могlам, Ñ…lокх могlам гlонца [[MediaWiki:Gadgets-definition|къаÑтам бало]] а [[Special:Gadgets|церах лаьцна]].',
- 'gadgets' => 'Хlоттончаш',
- 'gadgets-title' => 'Хlоттончаш',
+ 'gadgets' => 'Гаджеташ',
+ 'gadgets-title' => 'Гаджеташ',
'gadgets-pagetext' => 'ГlирÑа хааман могlамаш, къаÑтош йолу Ñ…lоттончи цlераш, хуьлаш йолу Ñ…Iокху [[MediaWiki:Gadgets-definition|къаÑтамца]]]].
Ð¥Iокху могIамо атто бо гIирÑан хаамаш атта Ñ‚Iе кхочуш барца, цуьнах лаьцна Ñ…Iоттош а йолш йолучу Ñ…Iоттончи ишарца.', # Fuzzy
'gadgets-uses' => 'Лелош йу',
+ 'gadgets-export' => 'ЭкÑпорт Ñн',
);
/** Sorani Kurdish (کوردی)
@@ -806,22 +848,24 @@ Sie müssen über die notwendigen Berechtigungen auf dem für den Import vorgese
/** Zazaki (Zazaki)
* @author Erdemaslancan
+ * @author Gorizon
+ * @author Neribij
* @author Olvörg
* @author Xoser
*/
$messages['diq'] = array(
- 'gadgets-desc' => 'Karberan rê destur bide ke pê [[Special:Preferences#mw-prefsection-gadgets|opsiyonan]] ra [[Special:Gadgets|Xacetanê CSS u JavaScriptî]] biweçî',
- 'prefs-gadgets' => 'Xacetî',
- 'gadgets-prefstext' => 'Cor de yew listeyê xacetanê xasî estê ke ti eşkenî xesabê xo de a bike.
-Enê xecatan ser JavaScript gure kenê, aya ra ti gani browser xo de JavaScript a bike.
-Ena pela opsiyonî de xacetan etki nikenê.
-
-Enê xecatanê xasî parçê sofwarê Mediyawîkî niyo, aye ra karberanê localî enê xecetî virazeno.
-Adminstorê localî eşkenê xacetî [[MediaWiki:Gadgets-definition|definitions]] u [[Special:Gadgets|descriptions]] ra bivurne.',
- 'gadgets' => 'Xacetî',
- 'gadgets-title' => 'Xacetî',
- 'gadgets-pagetext' => 'Cor de yew listeyê xacetanê xasî estê ke ti eşkenî [[Special:Preferences#mw-prefsection-gadgets|xesabê xo]] de a bike, descripsiyon [[MediaWiki:Gadgets-definition|definitions]] de esto.
-Ena descripisyon kerberanê îmkan dano ke aye meajanê sistemî ra asani cikewtê.',
+ 'gadgets-desc' => "Karberan ré destur bidek [[Special:Preferences#mw-prefsection-gadgets|hesıbyayan]]'ra [[Special:Gadgets|Hacetanê CSS u JavaScriptî]] bışé weçiné",
+ 'prefs-gadgets' => 'Haleti',
+ 'gadgets-prefstext' => 'Cor de yew listeya hacetanê xasî esta ke ti eşkenî xesabê xo de a bikî.
+Enê hacatî JavaScript ser o gurêyenê, aya ra ti ganî browserê xo de JavaScript a bikî.
+Ena pela opsiyonî de hacetî tesîr nêkenê.
+
+Enê hacatanê xasî parçê sofwarê Mediyawîkî nîyê, aye ra karberê localî enê hacetî virazenê.
+Îdarekarê mehelî eşkenê hacetan [[MediaWiki:Gadgets-definition|definitions]] û [[Special:Gadgets|descriptions]] ra bivurnê.',
+ 'gadgets' => 'Haleti',
+ 'gadgets-title' => 'Haleti',
+ 'gadgets-pagetext' => 'Cêr de yew listeya hacetanê xasan esta ke ti eşkenî [[Special:Preferences#mw-prefsection-gadgets|xesabê xo]] de a bikî, seke [[MediaWiki:Gadgets-definition|definitions]] nîşan dîyayo.
+No ewnîyayîşo pêroyî îmkan dano ke merdim bi asanî bireso pelanê mesajanê sistemî ke descripisyon û kodê her hacetî nawneno.',
'gadgets-uses' => 'Karber',
'gadgets-required-rights' => 'Cêrêni icab kenê {{PLURAL:$2|raşti|raşteya}}:
@@ -1072,20 +1116,21 @@ $1',
'gadgets-export-text' => 'برای برون‌بری ابزار $1ØŒ بر دکمهٔ «{{int:gadgets-export-download}}» کلیک کنید، پروندهٔ بارگیری‌شده را ذخیره کنید، به ویژه:درون‌ریزی در ویکی مقصد بروید Ùˆ بارگذاری‌اش کنید. سپس این را به صÙحهٔ مدیاویکی:Gadgets-definition بیÙزایید:
<pre>$2</pre>
لازم است تا در ویکی مقصد دسترسی‌های مناسب (شامل حق ویرایش پیغام‌های سامانه) را داشته باشید Ùˆ درون‌ریزی از بارگذاری‌های پرونده باید Ùعال شده باشد.',
- 'gadgets-export-download' => 'بارگیری',
+ 'gadgets-export-download' => 'دریاÙت',
);
/** Finnish (suomi)
* @author Crt
* @author Nike
* @author Olli
+ * @author Stryn
*/
$messages['fi'] = array(
'gadgets-desc' => 'Tarjoaa mahdollisuuden käyttäjille ottaa käyttöön [[Special:Gadgets|määritettyjä CSS- ja JavaScript-pienoisohjelmia]] omista [[Special:Preferences#mw-prefsection-gadgets|asetuksistaan]].',
'prefs-gadgets' => 'Pienoisohjelmat',
'gadgets-prefstext' => 'Alla on lista pienoisohjelmista, joita käyttäjät voivat ottaa käyttöön. Nämä pienoisohjelmat pohjautuvat usein JavaScriptiin, joten toimiakseen selaimessasi pitää olla JavaScript käytössä.
-Huomio myös, että nämä pienoisohjelmat eivät ole osa MediaWiki-ohjelmistoa – tavallisesti niitä kehittävät ja ylläpitävät paikallisen wikin käyttäjät. Paikalliset ylläpitäjät voivat muokata saatavilla olevia pienoisohjelmia [[MediaWiki:Gadgets-definition|määrityssivulla]] ja [[Special:Gadgets|kuvauksista]].',
+Huomioi myös, että nämä pienoisohjelmat eivät ole osa MediaWiki-ohjelmistoa – tavallisesti niitä kehittävät ja ylläpitävät paikallisen wikin käyttäjät. Paikalliset ylläpitäjät voivat muokata saatavilla olevia pienoisohjelmia [[MediaWiki:Gadgets-definition|määrityssivulla]] ja [[Special:Gadgets|kuvauksista]].',
'gadgets' => 'Pienoisohjelmat',
'gadgets-title' => 'Pienoisohjelmat',
'gadgets-pagetext' => 'Alla on lista pienoisohjelmista, joita käyttäjät voivat ottaa käyttöön [[Special:Preferences#mw-prefsection-gadgets|asetussivulta]]. Pienoisohjelmat määritetään [[MediaWiki:Gadgets-definition|täältä]].
@@ -1189,6 +1234,35 @@ O est nècèssèro de d’avêr los drêts corrèspondents sur lo vouiqui de dè
'gadgets-export-download' => 'Tèlèchargiér',
);
+/** Northern Frisian (Nordfriisk)
+ * @author Murma174
+ */
+$messages['frr'] = array(
+ 'gadgets-desc' => 'Brükern kön uun hör [[Special:Preferences#mw-prefsection-gadgets|iinstelangen]] enkelt [[Special:Gadgets|CSS- an JavaScript-halpers]] aktiwiare',
+ 'prefs-gadgets' => 'Letj halpers',
+ 'gadgets-prefstext' => 'Diar stun enkelt letj halpers, diar arke brüke aktiwiare koon. Jo san miast uun JavaScript skrewen, an diaram kön jo bluas werke, wan JavaScript uun a browser aktiif as. Üüb detheer spezial-sidj werke jo oober ei.
+
+Jodiar letj halpers san nään dial faan MediaWiki an wurd miast faan enkelt brükern ütjspekeliaret. Administratooren kön jo letj halpers bewerke. Diarför jaft at [[MediaWiki:Gadgets-definition|definitjuunen]] an [[Special:Gadgets|beskriiwangen]].',
+ 'gadgets' => 'Letj halpers',
+ 'gadgets-title' => 'Letj halpers',
+ 'gadgets-pagetext' => 'Diar stun letj halpers, diar uun det [[MediaWiki:Gadgets-definition|definitjuun]] fäästlaanj san an diar arke brüker uun sin [[Special:Preferences#mw-prefsection-gadgets|iinstelangen]] iinracht koon.
+
+Auer detheer sidj komst dü tu a MediaWiki-süsteemnoorachten mä en beskriiwang an di program-code.',
+ 'gadgets-uses' => 'Tu brüken',
+ 'gadgets-required-rights' => 'Diarför brükst dü {{PLURAL:$2|detdiar brükerrocht|jodiar brükerrochten}}:
+
+$1',
+ 'gadgets-required-skins' => 'Koon mä {{PLURAL:$2|didiar skak|jodiar skaker}} brükt wurd: $1.',
+ 'gadgets-default' => 'Det as faan began för arken aktiif.',
+ 'gadgets-export' => 'Eksport',
+ 'gadgets-export-title' => 'Eksport faan letj halpers',
+ 'gadgets-not-found' => 'Letj halper "$1" ei fünjen.',
+ 'gadgets-export-text' => 'Am di letj halper $1 tu eksportiarin, trak üüb „{{int:gadgets-export-download}}“ an seekre det datei üüb dan reegner. Do gung tu "Spezial:Import" üüb det wiki, huar di letj halper importiaret wurd skal an schüür det datei huuch. Skriiw do noch didiar tekst üüb det sidj MediaWiki:Gadgets-definition:
+<pre>$2</pre>
+Huar dü det importiare wel, brükst dü jo nuadag brükerrochten tu importiarin an uk det brükerrocht, am MediaWiki-süsteemnoorachten tu bewerkin. An do skal natüürelk det importiarin uun detdiar wiki aktiwiaret wees.',
+ 'gadgets-export-download' => 'Deelloose',
+);
+
/** Irish (Gaeilge)
* @author පසිඳු කà·à·€à·’න්ද
*/
@@ -1305,6 +1379,8 @@ Special:Import નિયોજીત વિકિ પર Special:Import પર à
/** Hebrew (עברית)
* @author Amire80
+ * @author Guycn1
+ * @author Guycn2
* @author Rotem Liss
* @author YaronSh
*/
@@ -1326,9 +1402,9 @@ $messages['he'] = array(
$1',
'gadgets-required-skins' => 'זמין {{PLURAL:$2|בערכות העיצוב הב×ות: $1|בערכת העיצוב $1}}',
- 'gadgets-default' => 'מופעל ×œ×›×•×œ× ×œ×¤×™ בררת מחדל.',
+ 'gadgets-default' => 'מופעל ×œ×›×•×œ× ×›×‘×¨×™×¨×ª מחדל.',
'gadgets-export' => 'יצו×',
- 'gadgets-export-title' => '×™×¦×•× ×’×דג׳טי×',
+ 'gadgets-export-title' => "×™×¦×•× ×’×דג'טי×",
'gadgets-not-found' => '×”×’×דג׳ט "$1" ×œ× × ×ž×¦×.',
'gadgets-export-text' => 'כדי ×œ×™×™×¦× ×ת ×”×’×דג׳ט $1, יש ללחוץ על הלחצן "{{int:gadgets-export-download}}", לשמור ×ת הקובץ שהתקבל,
לגשת ×ל Special:Import ב×תר הוויקי המיועד ולהעלות ×ותו. ו××– להוסיף ×ת ×”×“×‘×¨×™× ×”×‘××™× ×œ×“×£ MediaWiki:Gadgets-definition:
@@ -1346,7 +1422,7 @@ $1',
*/
$messages['hi'] = array(
'gadgets-desc' => 'सदसà¥à¤¯à¥‹à¤‚ को उनकी [[Special:Preferences#mw-prefsection-gadgets|वरीयताओं]] में से चà¥à¤¨à¤¿à¤‚दा [[Special:Gadgets|CSS और जावालिपि जà¥à¤—त]] चà¥à¤¨à¤¨à¥‡ दो।',
- 'prefs-gadgets' => 'उपकरण (गैज़ेट)',
+ 'prefs-gadgets' => 'उपकरण (गैजेट)',
'gadgets-prefstext' => 'नीचे विशेष उपकरणों की सूची दी गई है, जिनà¥à¤¹à¥‡à¤‚ आप अपने खाते के लिये सकà¥à¤·à¤® कर सकते हैं।
ये उपकरण अधिकांशतः जावासà¥à¤•à¥à¤°à¤¿à¤ªà¥à¤Ÿ पर आधारित है, इसलिठइनके कारà¥à¤¯à¤¶à¥€à¤² होने के लिठआपके बà¥à¤°à¤¾à¤‰à¤œà¤¼à¤° में जावासà¥à¤•à¥à¤°à¤¿à¤ªà¥à¤Ÿ सकà¥à¤·à¤® होनी चाहिये।
धà¥à¤¯à¤¾à¤¨ दें कि इन उपकरणों से आपके वरीयता पृषà¥à¤  पर कोई असर नहीं होगा।
@@ -1376,6 +1452,7 @@ $1',
* @author Anton008
* @author Dalibor Bosits
* @author Ex13
+ * @author MaGa
* @author Roberta F.
* @author SpeedyGonsales
*/
@@ -1383,10 +1460,10 @@ $messages['hr'] = array(
'gadgets-desc' => 'Omogućava suradnicama biranje osobnih [[Special:Gadgets|CSS i JavaScript dodataka]] u svojim [[Special:Preferences#mw-prefsection-gadgets|postavkama]]',
'prefs-gadgets' => 'Dodaci',
'gadgets-prefstext' => 'Slijedi popis posebnih dodataka koje možete omogućiti.
-One su većinom napisane u JavaScriptu, stoga JavaScript mora biti omogućen u vašem web pregledniku da bi dodaci radili.
+Većinom su napisani u JavaScriptu, stoga JavaScript mora biti omogućen u vašem web pregledniku da bi radili.
Nijedan dodatak nema uÄinka na ovu stranicu s postavkama.
-Ovi posebni dodaci nisu dio MediaWiki softvera, najÄešće su razvijane i održavane od suradnika na lokalnom wikiju.
+Ovi posebni dodaci nisu dio MediaWiki softvera, najÄešće ih razvijaju i održavaju suradnici na lokalnom wikiju.
Lokalni administratori mogu uređivati dostupne dodatke putem [[MediaWiki:Gadgets-definition|definicija]] i [[Special:Gadgets|opisa]].',
'gadgets' => 'Dodaci',
'gadgets-title' => 'Dodatci',
@@ -1561,32 +1638,32 @@ Anda harus memeroleh izin pada wiki tujuan (termasuk hak menyunting pesan sistem
* @author Lam-ang
*/
$messages['ilo'] = array(
- 'gadgets-desc' => 'Mabalin dagiti agar-aramat nga agpili iti [[Special:Gadgets|CSS ken JavaScript gadgets]] idiay [[Special:Preferences#mw-prefsection-gadgets|kaykayat da]]',
- 'prefs-gadgets' => 'Gadgets',
- 'gadgets-prefstext' => 'Adda dita baba ti listaan ti naipangruna a gadgets nga usaren idiay pakabilangam.
-Dagitoy a gadgets ket naibasta iti JavaScript, masapul a pakabaelan ti JavaScript idiay "pagbasabasam" tapno agbalin da.
-Saan a mabalin nga usaren dagitoy a gadgets ditoy kaykayat a panid.
-
-Dagitoy a gadgets ket saan a paset ti MediaWiki software, inaramid ken inayaywanan dagiti agar-aramat ti lokal a wiki.
-Mabaliwan dagita administrador nga urnosen ti [[MediaWiki:Gadgets-definition|pinakailawag]] ken [[Special:Gadgets|deskripsion]] ti gadgets.',
- 'gadgets' => 'Gadgets',
- 'gadgets-title' => 'Gadgets',
- 'gadgets-pagetext' => 'Dita baba ket adda listaan dagiti naipangruna a gadgets a dagiti agar-aramat ket mapagbalin da idiay [[Special:Preferences#mw-prefsection-gadgets|kaykayat da a panid]], a naipalawag iti [[MediaWiki:Gadgets-definition|dagiti pinakailawag]].
-Daytoy a pinakabuklan ket mangted ti nalaka a pinagserrek kadagit mensahe ti sistema a panid a nagpailawag iti deskripsion ti gadget ken kodigo.',
+ 'gadgets-desc' => 'Agpalubos kadagiti agar-aramat nga agpili kadagiti naiduma a [[Special:Gadgets|CSS ken JavaScript a gadget]] iti [[Special:Preferences#mw-prefsection-gadgets|kakaykayatanda]]',
+ 'prefs-gadgets' => 'Dagiti gadget',
+ 'gadgets-prefstext' => 'Dita baba ket listaan kadagiti naipangruna a gadget a mabalinmo a pakabaelan iti pakabilangam.
+Dagitoy a gadget ket naibatay iti JavaScript, isunga masapul a pakabaelan ti JavaScript idiay "pagbasabasam" tapno agbalin dagitoy.
+Laglagipen a dagitoy a gadget ket awan ti pagbanaganna iti daytoy panid ti kakaykayatan.
+
+Laglagipen pay a dagitoy a naipangruna a gadget ket saan a paset ti sopwer ti MediaWiki, ken kadawyan a pinarang-ay ken tinartaripato babaen dagiti agar-aramat iti lokal a wiki.
+Dagiti lokal nga administrador ket mabalinda nga urnosen dagiti [[MediaWiki:Gadgets-definition|panangipalplawag]] ken dagiti [[Special:Gadgets|deskripsion]] dagiti magun-od a gadget.',
+ 'gadgets' => 'Dagiti gadget',
+ 'gadgets-title' => 'Dagiti gadget',
+ 'gadgets-pagetext' => 'Dita baba ket listaan dagiti naipangruna a gadget a mabalin a pakabaelan dagiti agar-aramat iti bukodda a [[Special:Preferences#mw-prefsection-gadgets|panid ti kakaykayatan]], a kas naipalawag babaen dagiti [[MediaWiki:Gadgets-definition|pannakaipalawag]].
+Daytoy a nakabuklan ket mangted ti nalaka a panagserrek kadagiti panid ti mensahe ti sistema a mangipalawag ti tungngal maysa a deskripsion ken kodigo ti gadget.',
'gadgets-uses' => 'Usar',
- 'gadgets-required-rights' => 'Masapul dagiti sumaganad {{PLURAL:$2|a karbengan|dagiti karbengan}}:
+ 'gadgets-required-rights' => 'Masapul ti sumaganad a {{PLURAL:$2|karbengan|karkarbengan}}:
$1',
- 'gadgets-required-skins' => 'Adda mabalin idiay {{PLURAL:$2|$1 a kudil|dagiti sumaganad a kudil: $1}}.',
- 'gadgets-default' => 'Pakabaelan a kinasigud iti amin nga agar-aramat.',
+ 'gadgets-required-skins' => 'Mabalin a magun-od {{PLURAL:$2|iti $1 a kudil|kadagiti sumaganad a kudil: $1}}.',
+ 'gadgets-default' => 'Pakabaelan a kasisigud para kadagiti amin.',
'gadgets-export' => 'Agipan',
'gadgets-export-title' => 'Agipan ti gadget',
'gadgets-not-found' => 'Saan a nabirukan ti "$1" a gadget.',
- 'gadgets-export-text' => 'Ti pinag-ipan ti $1 a gadget, agtakla idiay "{{int:gadgets-export-download}}" a buton, idulin ti inkarga nga agpababa a papeles,
-mapan idiay Special:Import ti papanan a wiki ken ikarga nga agpangato. Ken inayon dagiti sumaganad idiay MediaWiki:Gadgets-definition page:
+ 'gadgets-export-text' => 'Ti panag-ipan ti $1 a gadget, pinduten ti buton ti "{{int:gadgets-export-download}}", idulin ti naikarga a papeles,
+mapan idiay Special:Import iti papanan a wiki ken ikarganto. Kalpasanna inayon dagiti sumaganad idiay panid ti MediaWiki:Gadgets-definition:
<pre>$2</pre>
-Masapul nga addaan ka ti husto a pammalubos iti papanan a wiki (nairaman ti karbegnan a pinagbaliw dagiti mensahe ti sistema) ken naipabalin ti pinagala kadagiti naggapu a papeles a naikarga nga agpangato.',
- 'gadgets-export-download' => 'Ikarga nga agpababa',
+Nasken nga addaanka ti maitunos a pammalubos iti papanan a wiki (mairaman ti karbengan a panag-urnos kadagiti mensahe ti sistema) ken nasken a napakabaelan ti panagikarga kadagiti papeles.',
+ 'gadgets-export-download' => 'Agikaraga',
);
/** Ido (Ido)
@@ -1637,7 +1714,7 @@ farðu á þann wiki sem á að flytja smátólið á, farðu á kerfisíðuna S
$messages['it'] = array(
'gadgets-desc' => 'Consente agli utenti di selezionare [[Special:Gadgets|accessori CSS e JavaScript]] nelle proprie [[Special:Preferences#mw-prefsection-gadgets|preferenze]]',
'prefs-gadgets' => 'Accessori',
- 'gadgets-prefstext' => "Di seguito viene presentata una lista di accessori speciali (''gadget'') che è possibile abilitare per il proprio account.
+ 'gadgets-prefstext' => "Di seguito viene presentata una lista di accessori speciali (''gadget'') che è possibile abilitare per la propria utenza.
La maggior parte di questi accessori è basata su JavaScript, è quindi necessario abilitare JavaScript nel proprio browser perché funzionino correttamente. Si noti che gli accessori non hanno alcun effetto in questa pagina di preferenze.
Inoltre, si noti che questi accessori speciali non sono compresi nel software MediaWiki e vengono di solito realizzati e gestiti dagli utenti di ciascun sito wiki. Gli amministratori del sito possono modificare la lista degli accessori disponibili tramite le pagine delle [[MediaWiki:Gadgets-definition|definizioni]] e delle [[Special:Gadgets|descrizioni]].",
@@ -1792,21 +1869,27 @@ $messages['kk-arab'] = array(
);
/** Kazakh (Cyrillic script) (қазақша (кирил)‎)
+ * @author Arystanbek
*/
$messages['kk-cyrl'] = array(
'prefs-gadgets' => 'Қажет құралдар',
- 'gadgets-prefstext' => 'Төменде өз тіркелгіңізде қоÑа алатын арнаулы қажет құралдар тізімі беріледі.
-ОÑÑ‹ қажет құралдар көбінеÑе JavaScript әмірлеріне негізделінеді, Ñондықтан бұлар Ð¶Ò±Ð¼Ñ‹Ñ Ñ–Ñтеуі үшін шолғышыңызда JavaScript қоÑылған болуы керек.
-Бұл баптау бетіне оÑÑ‹ қажет құралдар Ó™Ñер етпейтінің еÑкеріңіз.
+ 'gadgets-prefstext' => 'Төменде өз тіркелгіңізде қоÑа алатын арнаулы қажет құралдар тізімі берілген.
+ОÑÑ‹ қажет құралдар көбінеÑе JavaScript әмірлеріне негізделеді, Ñондықтан бұлар Ð¶Ò±Ð¼Ñ‹Ñ Ñ–Ñтеуі үшін шолғышыңызда JavaScript қоÑылған болуы керек.
+Бұл баптау бетіне оÑÑ‹ қажет құралдар Ó™Ñер етпейтінін еÑкеріңіз.
-Тағы да еÑкеріңіз: оÑÑ‹ қажет құралдар MediaWiki бағдарламаÑының бөлігі емеÑ, және де бұларды жайшылықта жергілікті уикидің қатыÑушылары дамытады және қоштайды.
-Жергілікті әкімшілер жетімді қажет нәрÑе тізімін [[{{ns:mediawiki}}:Gadgets-definition]] және [[{{ns:special}}:Gadgets]] беттері арқылы
+Тағы да еÑкеріңіз: оÑÑ‹ қажет құралдар MediaWiki бағдарламаÑының бөлігі ÐµÐ¼ÐµÑ Ð¶Ó™Ð½Ðµ бұларды әдетте Ñіздің жергілікті уикиіңіздің қатыÑушылары дамытады және қоштайды.
+Жергілікті [[Project:Әкімшілер|әкімшілер]] жетімді гаджеттерді [[MediaWiki:Gadgets-definition]] және [[special:Gadgets]] беттері арқылы
өңдей алады.', # Fuzzy
'gadgets' => 'Қажет құралдар',
'gadgets-title' => 'Қажет құралдар',
- 'gadgets-pagetext' => 'Төменде арнаулы қажет құралдар тізімі беріледі. [[{{ns:mediawiki}}:Gadgets-definition]] бетінде анықталған қажет құралдарды қатыÑушылар өзінің баптауында қоÑа алады.
-Бұл шолу беті арқылы әрбір қажет құралдың ÑипаттамаÑÑ‹ мен әмірін анықтайтын жүйе хабар беттеріне жеңіл қатынай алаÑыз.', # Fuzzy
- 'gadgets-uses' => 'Қолданудағылар',
+ 'gadgets-pagetext' => 'Төменде қатыÑушылар өзінің [[Special:Preferences#mw-prefsection-gadgets|баптауларынан]] қоÑа алатын арнаулы қажет құралдар тізімі берілген. [[MediaWiki:Gadgets-definition]] шолу беті арқылы әрбір қажет құралдың ÑипаттамаÑÑ‹ мен әмірін анықтайтын жүйе хабар беттеріне жеңіл қатынай алаÑыз.',
+ 'gadgets-uses' => 'ҚолданыÑтағылар',
+ 'gadgets-required-rights' => 'КелеÑÑ– {{PLURAL:$2|құқықты|құқықтарды}} қажет етеді: $1',
+ 'gadgets-default' => 'Әркімге автоматты түрде қоÑылады.',
+ 'gadgets-export' => 'ЭкÑпорттау',
+ 'gadgets-export-title' => 'Гаджетті ÑкÑпорттау',
+ 'gadgets-not-found' => '"$1" гаджеті табылмады.',
+ 'gadgets-export-download' => 'ТүÑіру',
);
/** Kazakh (Latin script) (qazaqşa (latın)‎)
@@ -1851,7 +1934,7 @@ $messages['km'] = array(
* @author ì•„ë¼
*/
$messages['ko'] = array(
- 'gadgets-desc' => 'ê° ì‚¬ìš©ìžê°€ [[Special:Gadgets|CSS와 ìžë°”스í¬ë¦½íŠ¸ 소ë„구]]를 [[Special:Preferences#mw-prefsection-gadgets|ì‚¬ìš©ìž í™˜ê²½ 설정]]ì„ í†µí•´ 사용할 수 있ë„ë¡ í—ˆìš©',
+ 'gadgets-desc' => 'ê° ì‚¬ìš©ìžê°€ [[Special:Gadgets|CSS와 ìžë°”스í¬ë¦½íŠ¸ 소ë„구]]를 [[Special:Preferences#mw-prefsection-gadgets|ì‚¬ìš©ìž í™˜ê²½ 설정]]ì„ í†µí•´ 사용할 수 있습니다',
'prefs-gadgets' => '소ë„구',
'gadgets-prefstext' => '아래 목ë¡ì€ 현재 사용 가능한 소ë„êµ¬ì˜ ëª©ë¡ìž…니다.
ëŒ€ë¶€ë¶„ì˜ ì†Œë„구는 ìžë°”스í¬ë¦½íŠ¸ë¡œ ë™ìž‘하며, 웹 브ë¼ìš°ì €ì—ì„œ ìžë°”스í¬ë¦½íŠ¸ë¥¼ 사용할 수 있어야 ë™ìž‘합니다.
@@ -1863,7 +1946,7 @@ $messages['ko'] = array(
'gadgets-title' => '소ë„구',
'gadgets-pagetext' => '[[Special:Preferences#mw-prefsection-gadgets|ì‚¬ìš©ìž í™˜ê²½ 설정]]ì—ì„œ 설정할 수 있는 소ë„구 목ë¡ìž…니다. 해당 목ë¡ì€ [[MediaWiki:Gadgets-definition|소ë„구 ì •ì˜]]ì—ì„œ 편집할 수 있습니다.
ì´ ë¬¸ì„œì—서는 ê° ì†Œë„êµ¬ì˜ ê° ì„¤ëª… 문서와 ì½”ë“œì˜ ì‹œìŠ¤í…œ 메시지 ë§í¬ë¥¼ 제공합니다.',
- 'gadgets-uses' => 'ë‹¤ìŒ ì½”ë“œë¥¼ ì´ìš©',
+ 'gadgets-uses' => 'ë‹¤ìŒ ì½”ë“œë¥¼ 사용',
'gadgets-required-rights' => 'ë‹¤ìŒ {{PLURAL:$2|권한}}ì´ í•„ìš”í•©ë‹ˆë‹¤:
$1',
@@ -1933,12 +2016,23 @@ Do moß en däm Wiki de nüüdijje Rääschde han, och dat Rääsch, aan Täxte
/** Kurdish (Latin script) (Kurdî (latînî)‎)
* @author George Animal
+ * @author Ghybu
+ * @author Gomada
*/
$messages['ku-latn'] = array(
+ 'prefs-gadgets' => 'Amûr',
+ 'gadgets' => 'Amûr',
+ 'gadgets-title' => 'Amûr',
+ 'gadgets-uses' => 'Bikaranîn',
+ 'gadgets-required-rights' => '{{PLURAL:$2|Mafa|Mafên}} di dorê de pêwîst in:
+
+$1',
+ 'gadgets-export' => 'Derxe',
'gadgets-not-found' => ' Gadget "$1" nehate dîtin.',
+ 'gadgets-export-download' => 'Daxe',
);
-/** Kirghiz (Кыргызча)
+/** Kyrgyz (Кыргызча)
* @author Growingup
*/
$messages['ky'] = array(
@@ -1950,19 +2044,20 @@ $messages['ky'] = array(
/** Luxembourgish (Lëtzebuergesch)
* @author Les Meloures
* @author Robby
+ * @author Soued031
*/
$messages['lb'] = array(
'gadgets-desc' => 'Erméiglecht de Benotzer et perséinlech [[Special:Gadgets|CSS a JavaScript Gadgeten]] an hiren [[Special:Preferences#mw-prefsection-gadgets|Astellunge]] festzeleeën.',
'prefs-gadgets' => 'Gadgeten',
'gadgets-prefstext' => "Lëscht vu spezielle Gadgeten déi fir Äre Benotzerkont aktivéiert kënne ginn.
-D'Gadgete baséiere meeschtens op engem JavaScript, dofir muss JavaScript an Ärem Browser aktivéiert sinn, fir datt se fonctionéieren.
-D'Gadgete fonctionéieren awer net op dëser Säit mat de perséinlechen Astellungen.
+D'Gadgete baséiere meeschtens op engem JavaScript, dofir muss JavaScript an Ärem Browser aktivéiert sinn, fir datt se funktionéieren.
+D'Gadgete funktionéieren awer net op dëser Säit mat de perséinlechen Astellungen.
Ausserdeem sollt Dir wëssen, datt dës Gadgete generell net Deel vu MediaWiki sinn, a meeschtens vu Benotzer vu lokale Wikien entwéckelt an ënnerhale ginn.
Lokal Wiki-Administrateure kënnen d'Lëscht von den disponibele Gadgeten op de Säiten [[MediaWiki:Gadgets-definition|Definitioune vun Gadgeten]] a [[Special:Gadgets|Beschreiwunge vu Gadgeten]] änneren.",
'gadgets' => 'Gadgeten',
'gadgets-title' => 'Gadgeten',
- 'gadgets-pagetext' => "Ënnendrënner ass eng Lëscht vun de spezielle Gadgeten déi d'Benotzer op hire [[Special:Preferences#mw-prefsection-gadgets|Benotzer-Astellungen]] aschalte kënnen, esou wéi dat op [[MediaWiki:Gadgets-definition|definéiert]] ass.
+ 'gadgets-pagetext' => "Ënnendrënner ass eng Lëscht vun de spezielle Gadgeten déi d'Benotzer op hire [[Special:Preferences#mw-prefsection-gadgets|Benotzer-Astellungen]] aschalte kënnen, sou wéi dat op [[MediaWiki:Gadgets-definition|definéiert]] ass.
Dës Iwwersiicht gëtt einfachen Zougang zu de Systemmessage-Säiten, déi all Gadget beschreiwen an zum Programméiercode vun dem Gadget.",
'gadgets-uses' => 'Benotzt',
'gadgets-required-rights' => "Erfuerdert {{PLURAL:$2|d'Recht|dës Rechter}}: $1.",
@@ -1971,8 +2066,8 @@ Dës Iwwersiicht gëtt einfachen Zougang zu de Systemmessage-Säiten, déi all G
'gadgets-export' => 'Export',
'gadgets-export-title' => 'Export vu Gadgeten',
'gadgets-not-found' => 'Gadget "$1" net fonnt.',
- 'gadgets-export-text' => 'Fir de Gadget $1 z\'exportéieren klickt w.e.g. op de(n) "{{int:gadgets-export-download}}"-Knäppchen, späichert den erofgelueden Fichier, gitt op Spezial:Import op der Zil-Wiki a lued en do erop. Duerno setzt der op d\'MediaWiki:Gadgets-Definitiouns Säit dëst derbäi:<pre>$2</pre>
-Dir musst déi erfuerdert Rechter(inklusiv d\'Recht fir System-Messagen z\'änneren) op der Zil-Wiki hunn an den Import vun eropgelueden Fichiere muss ageschalt sinn.',
+ 'gadgets-export-text' => 'Fir de Gadget $1 z\'exportéieren klickt w.e.g. op de(n) "{{int:gadgets-export-download}}"-Knäppchen, späichert den erofgelueden Fichier, gitt op Spezial:Import op der Zil-Wiki a luet en do erop. Duerno setzt der op d\'MediaWiki:Gadgets-Definitiouns Säit dëst derbäi:<pre>$2</pre>
+Dir musst déi erfuerdert Rechter(inklusiv d\'Recht fir Systemmessagen z\'änneren) op der Zil-Wiki hunn an den Import vun eropgelueden Fichiere muss ageschalt sinn.',
'gadgets-export-download' => 'Eroflueden',
);
@@ -2019,6 +2114,18 @@ Doe mós de juuste rèchte höbben óppe doelwie, ouch óm bewirkinge aan systee
'gadgets-export-download' => 'Haol óp',
);
+/** لوری (لوری)
+ * @author Mogoeilor
+ */
+$messages['lrc'] = array(
+ 'prefs-gadgets' => 'چيا هنی',
+ 'gadgets' => 'گجت یا',
+ 'gadgets-title' => 'گجت یا',
+ 'gadgets-uses' => 'کاروردیا',
+ 'gadgets-export' => 'وه صحرا ديئن',
+ 'gadgets-export-download' => 'گرتن',
+);
+
/** Lithuanian (lietuvių)
* @author Eitvys200
* @author Homo
@@ -2203,7 +2310,7 @@ $messages['mr'] = array(
'gadgets-title' => 'गॅजेट',
'gadgets-pagetext' => 'खाली तà¥à¤®à¥à¤¹à¥€ तà¥à¤®à¤šà¥à¤¯à¤¾ सदसà¥à¤¯à¤¤à¥à¤µà¤¾à¤¸à¤¾à¤ à¥€ [[Special:Preferences#mw-prefsection-gadgets|माà¤à¥à¤¯à¤¾ पसंती]] पानावर वापरू शकत असलेलà¥à¤¯à¤¾ [[MediaWiki:Gadgets-definition|वà¥à¤¯à¤¾à¤–à¥à¤¯à¤¾]]ने सांगितलेलà¥à¤¯à¤¾ गॅजेटà¥à¤¸à¤šà¥€ यादी दिलेली आहे. हे पान तà¥à¤®à¥à¤¹à¤¾à¤²à¤¾ पà¥à¤°à¤¤à¥à¤¯à¥‡à¤• गॅजेटà¥à¤¸à¤šà¤¾ कोड व वà¥à¤¯à¤¾à¤–à¥à¤¯à¤¾ देणारà¥â€à¤¯à¤¾ पानासाठी सोपी संपरà¥à¤• सà¥à¤µà¤¿à¤§à¤¾ पà¥à¤°à¤µà¤¿à¤¤à¥‡.',
'gadgets-uses' => 'उपयोग',
- 'gadgets-required-rights' => 'खलील गोषà¥à¤ à¥€ साठी विनंती {{PLURAL:$2|right|rights}}:
+ 'gadgets-required-rights' => 'खालील {{PLURAL:$2|अधिकार}} हवेच :
$1',
'gadgets-required-skins' => '{{PLURAL:$2|$1 skin|खालील देखावà¥à¤¯à¤¾à¤‚वर : $1}} उपलबà¥à¤§ आहेत',
@@ -2211,11 +2318,11 @@ $1',
'gadgets-export' => 'निरà¥à¤¯à¤¾à¤¤ करा',
'gadgets-export-title' => 'उपकरण निरà¥à¤¯à¤¾à¤¤',
'gadgets-not-found' => 'उपकरण "$1" सापडत नाही.',
- 'gadgets-export-text' => '$1 उपकरण-सà¥à¤µà¤¿à¤§à¤¾ निरà¥à¤¯à¤¾à¤¤à¤•à¤°à¤£à¥à¤¯à¤¾ करिता, "{{int:gadgets-export-download}}" कलीवर टिचकी मारा, उतरवलेली संचिका-फाईल जतन करा
+ 'gadgets-export-text' => '$1 उपकरण-सà¥à¤µà¤¿à¤§à¤¾ निरà¥à¤¯à¤¾à¤¤ करणà¥à¤¯à¤¾à¤•à¤°à¤¿à¤¤à¤¾, "{{int:gadgets-export-download}}" कळीवर टिचकी मारा, उतरवलेली संचिका-फाईल जतन करा
डेसà¥à¤Ÿà¤¿à¤¨à¥‡à¤¶à¤¨ विकिचà¥à¤¯à¤¾ विशेष:आयात पानावर जाऊन संचिका-फाईल चढवावी.नंतर खालील MediaWiki:Gadgets-definition पान चढवावे :
<pre>$2</pre>
तà¥à¤®à¤šà¥à¤¯à¤¾à¤•à¤¡à¥‡ डेसà¥à¤Ÿà¤¿à¤¨à¥‡à¤¶à¤¨ विकिवर (सिसà¥à¤Ÿà¥€à¤® मेसेजेस सà¥à¤¦à¥à¤§à¤¾ संपादीत करणà¥à¤¯à¤¾à¤¸à¤¹à¥€à¤¤ ) सà¥à¤¯à¥‹à¤—à¥à¤¯ परवानगà¥à¤¯à¤¾ उपलबà¥à¤§ असणे अतà¥à¤¯à¤¾à¤µà¤¶à¥à¤¯à¤• आहे आणि चढवलेलà¥à¤¯à¤¾ संचिकाकरिता आयात सà¥à¤µà¤¿à¤§à¤¾ सकà¥à¤·à¤® असणे आवशà¥à¤¯à¤• आहे.',
- 'gadgets-export-download' => 'उतरवा',
+ 'gadgets-export-download' => 'अधिभारण करा',
);
/** Malay (Bahasa Melayu)
@@ -2288,7 +2395,7 @@ $messages['mzn'] = array(
'gadgets-title' => 'ابزارون',
);
-/** Norwegian Bokmål (norsk (bokmål)‎)
+/** Norwegian Bokmål (norsk bokmål)
* @author Laaknor
* @author Nghtwlkr
* @author Sjurhamre
@@ -2337,7 +2444,7 @@ Disse Översicht gifft direkten Togang to de Systemnarichten, in de de Text to d
'gadgets-uses' => 'Bruukt',
);
-/** Nedersaksies (Nedersaksies)
+/** Low Saxon (Netherlands) (Nedersaksies)
* @author Servien
*/
$messages['nds-nl'] = array(
@@ -2438,7 +2545,7 @@ Voeg daarna het volgende toe aan de pagina "MediaWiki:Gadgets-definition":
Je moet de juiste rechten hebben op de doelwiki, inclusief het recht om bewerkingen te maken aan de systeemberichten, en importeren uit bestanden moet ingeschakeld zijn.',
);
-/** Norwegian Nynorsk (norsk (nynorsk)‎)
+/** Norwegian Nynorsk (norsk nynorsk)
* @author Eirik
* @author Harald Khan
* @author Nghtwlkr
@@ -2466,7 +2573,7 @@ Dette oversynet gjev enkel tilgang til systemmeldingssidene som inneheld skildri
$messages['oc'] = array(
'gadgets-desc' => 'Daissa als utilizaires los [[Special:Gadgets|gadgets CSS e JavaScript]] dins lor [[Special:Preferences#mw-prefsection-gadgets|preferéncias]]',
'prefs-gadgets' => 'Gadgets',
- 'gadgets-prefstext' => "Çaijós apareis una tièra de gadgets que podètz activar per vòstre compte. Fan ampèl a JavaScript, deu doncas èsser activat per vòstre navigador Web.
+ 'gadgets-prefstext' => "Çaijós apareis una lista de gadgets que podètz activar per vòstre compte. Fan apèl a JavaScript, deu doncas èsser activat per vòstre navigador Web.
An pas cap d'incidéncia sus aquesta pagina de preferéncias. E mai, son generalament desvolopats e mantenguts sus aqueste wiki.
Los administrators pòdon modificar los gadgets en passant per [[MediaWiki:Gadgets-definition|las definicions]] e las [[Special:Gadgets|descripcions]].",
@@ -2479,7 +2586,7 @@ Aqueste susvòl dona un accès rapid a las paginas de messatges del sistèma que
'gadgets-export-download' => 'Telecargar',
);
-/** Oriya (ଓଡ଼ିଆ)
+/** Oriya (ଓଡ଼ିଆ)
* @author Ansumang
* @author Odisha1
* @author Psubhashish
@@ -2513,6 +2620,21 @@ $1',
'gadgets-export-download' => 'ଡାଉନଲୋଡ଼',
);
+/** Punjabi (ਪੰਜਾਬੀ)
+ * @author Babanwalia
+ */
+$messages['pa'] = array(
+ 'prefs-gadgets' => 'ਗੈਜਟ',
+ 'gadgets' => 'ਗੈਜਟ',
+ 'gadgets-title' => 'ਗੈਜਟ',
+ 'gadgets-uses' => 'ਵਰਤਦਾ ਹੈ',
+ 'gadgets-default' => "ਮੂਲ ਤੌਰ 'ਤੇ ਸਾਰਿਆਂ ਲਈ ਚਾਲੂ ਹੈ।",
+ 'gadgets-export' => 'ਨਿਰਯਾਤ',
+ 'gadgets-export-title' => 'ਗੈਜਟ ਨਿਰਯਾਤ',
+ 'gadgets-not-found' => 'ਗੈਜਟ "$1" ਨਹੀਂ ਲੱਭਾ।',
+ 'gadgets-export-download' => 'ਡਾਊਨਲੋਡ ਕਰੋ',
+);
+
/** Pampanga (Kapampangan)
* @author Katimawan2005
*/
@@ -2543,6 +2665,7 @@ $messages['pdc'] = array(
);
/** Polish (polski)
+ * @author Chrumps
* @author Derbeth
* @author Marcin Åukasz Kiejzik
* @author Matma Rex
@@ -2553,7 +2676,7 @@ $messages['pl'] = array(
'gadgets-desc' => 'Pozwala użytkownikom wybrać [[Special:Gadgets|gadżety CSS i JavaScript]] na [[Special:Preferences#mw-prefsection-gadgets|stronie preferencji]]',
'prefs-gadgets' => 'Gadżety',
'gadgets-prefstext' => 'Poniżej znajduje się lista specjalnych gadżetów, które możesz włączyć dla swojego konta użytkownika.
-Gadżety najczęściej wykorzystują JavaScript, więc by działały musisz mieć w swojej przeglądarce włączoną obsługę JavaScriptu. Gadżety nie mają wpływu na tę stronę preferencji.
+Gadżety najczęściej wykorzystują JavaScript, więc by działały, musisz mieć w swojej przeglądarce włączoną obsługę JavaScriptu. Gadżety nie mają wpływu na tę stronę preferencji.
Gadżety nie są częścią oprogramowania MediaWiki i najprawdopodobniej zostały stworzone przez użytkowników tej wiki.
Lokalni administratorzy mogą edytować dostępne gadżety używając stron [[MediaWiki:Gadgets-definition|Definicje gadżetów]] oraz [[Special:Gadgets|Gadżety]].',
@@ -2641,40 +2764,48 @@ Special:Import تے جاؤ ÙˆÚ©ÛŒ تے ØŒ چرھاؤ اینوں۔ Ùیر تھلÛ
* @author Ahmed-Najib-Biabani-Ibrahimkhel
*/
$messages['ps'] = array(
- 'prefs-gadgets' => 'ګاډجÛÙ¼',
- 'gadgets' => 'ګاډجÛÙ¼',
- 'gadgets-title' => 'ګاډجÛÙ¼',
+ 'prefs-gadgets' => 'گاډجÛÙ¼',
+ 'gadgets-prefstext' => 'دلته Ù„Ø§Ù†Ø¯Û Ø¯ Úانگړو گاډجÛټونو (هوښيارتوکي) يو لړليک دی Ú†Û ØªØ§Ø³Û ÙŠÛ Ø®Ù¾Ù„ گڼون لپاره چارنولی Ø´ÛŒ.
+دا گاډجÛټونه د جاواسکرÛپټ پر بنسټ جوړ شوي، نو د Ø¯Û Ù„Ù¾Ø§Ø±Ù‡ Ú†Û Ù‡Ù…Ø¯Ø§ گاډجÛټونه سم کار ÙˆÚ©Ú“ÙŠ نو Ø³ØªØ§Ø³Û Ø¯ کتنمل جاواسکرÛپټ بايد چارند وي.
+په پام Ú©Û Ù…Ùˆ اوسه Ú†Û Ø¯Ø§ گاډجÛټونه به په Ù‡Ù…Ø¯Û ØºÙˆØ±Ù‡ توبونو Ù‡ÛÚ… اغÛزه Ùˆ نه لري.
+
+دا هم په پام Ú©Û ÙˆÙ†ÙŠØ³Ø¦ Ú†Û Ø¯Ø§ Úانگړي گاډجÛټونه د Ù…Ûډياويکي د Ø³Ø§ÙˆØªØ±Û Ø¨Ø±Ø®Ù‡ نه ده او دا اکثراً Ø³ØªØ§Ø³Û Ø¯ سيمه Ø§ÙŠØ²Û ÙˆÙŠÚ©ÙŠ کارنانو لخوا پرمخ بÛول Ú©ÛÚ–ÙŠ.
+
+سيمه ايز پازوالان کولی شي د شته گاډجÛټونو [[MediaWiki:Gadgets-definition|Ù¾ÛژندنÛ]] او [[Special:Gadgets|څرگندونÛ]] Ø³Ù…Û Ú©Ú“ÙŠ.',
+ 'gadgets' => 'گاډجÛÙ¼',
+ 'gadgets-title' => 'گاډجÛÙ¼',
'gadgets-uses' => 'کارونÛ',
'gadgets-export' => 'صادرول',
- 'gadgets-not-found' => 'د "$1" ګاډجÛÙ¼ Ùˆ نه موندل شو.',
+ 'gadgets-not-found' => 'د "$1" گاډجÛÙ¼ Ùˆ نه موندل شو.',
'gadgets-export-download' => 'ښکته کول',
);
/** Portuguese (português)
* @author Hamilton Abreu
* @author Helder.wiki
+ * @author Luckas
* @author Malafaya
* @author 555
*/
$messages['pt'] = array(
'gadgets-desc' => "Permite que os utilizadores seleccionem [[Special:Gadgets|''\"gadgets\"'' em JavaScript e CSS]] personalizados nas suas [[Special:Preferences#mw-prefsection-gadgets|preferências]]",
'prefs-gadgets' => 'Gadgets',
- 'gadgets-prefstext' => "Segue-se uma lista de ''\"gadgets\"'' especiais que pode activar na sua conta.
-Estes ''gadgets'' são baseados principalmente em JavaScript, sendo necessário activar o suporte a JavaScript no seu browser para que funcionem.
+ 'gadgets-prefstext' => "Segue-se uma lista de ''\"gadgets\"'' especiais que pode ativar na sua conta.
+Estes ''gadgets'' são baseados principalmente em JavaScript, sendo necessário ativar o suporte a JavaScript no seu browser para que funcionem.
Note que não terão efeito nesta página de preferências.
Note também que estes ''gadgets'' especiais não fazem parte do programa MediaWiki, sendo geralmente desenvolvidos e mantidos por utilizadores na sua wiki local.
Administradores locais podem editar os ''gadgets'' disponíveis usando as [[MediaWiki:Gadgets-definition|definições]] e [[Special:Gadgets|descrições]].",
'gadgets' => 'Gadgets',
'gadgets-title' => 'Gadgets',
- 'gadgets-pagetext' => "Segue-se uma lista de ''\"gadgets\"'' que podem ser activados pelos utilizadores nas suas [[Special:Preferences#mw-prefsection-gadgets|preferências]], como estabelecido pelas [[MediaWiki:Gadgets-definition|definições]].
+ 'gadgets-pagetext' => "Segue-se uma lista de ''\"gadgets\"'' que podem ser ativados pelos utilizadores nas suas [[Special:Preferences#mw-prefsection-gadgets|preferências]], como estabelecido pelas [[MediaWiki:Gadgets-definition|definições]].
Este resumo proporciona acesso fácil às páginas das mensagens de sistema que definem a descrição e o código de cada ''gadget''.",
'gadgets-uses' => 'Utiliza',
'gadgets-required-rights' => 'Requer {{PLURAL:$2|o seguinte privilégio|os seguintes privilégios}}:
$1',
'gadgets-required-skins' => 'Disponível {{PLURAL:$2|no tema $1|nos seguintes temas: $1}}',
- 'gadgets-default' => 'Activado para todos por padrão.',
+ 'gadgets-default' => 'Ativado para todos por padrão.',
'gadgets-export' => 'Exportar',
'gadgets-export-title' => 'Exportação de gadget',
'gadgets-not-found' => 'O gadget "$1" não foi encontrado.',
@@ -2691,34 +2822,35 @@ Na wiki de destino, tem de ter as permissões necessárias (incluindo o privilé
* @author GoEThe
* @author Helder.wiki
* @author Rafael Vargas
+ * @author 555
*/
$messages['pt-br'] = array(
- 'gadgets-desc' => 'Permite aos utilizadores selecionarem [[Special:Gadgets|"gadgets" JavaScript e CSS]] personalizados nas suas [[Special:Preferences#mw-prefsection-gadgets|preferências]]',
+ 'gadgets-desc' => 'Permite que os usuários selecionem [[Special:Gadgets|"gadgets" JavaScript e CSS]] personalizados nas suas [[Special:Preferences#mw-prefsection-gadgets|preferências]]',
'prefs-gadgets' => 'Gadgets',
'gadgets-prefstext' => 'Segue-se uma lista de "gadgets" que podem ser ativados em sua conta.
Tais gadgets normalmente são baseados em JavaScript, o que faz com que seja necessário que o suporte a JavaScript esteja ativado em seu navegador para que os mesmos funcionem.
Note que os gadgets não possuem efeito nesta página (a página de preferências).
-Note também que tais gadgets não são parte do software MediaWiki, geralmente sendo desenvolvidos e mantidos por usuários de sua wiki local.
+Repare também que tais gadgets não são parte do software MediaWiki, geralmente sendo desenvolvidos e mantidos por usuários de seu wiki local.
Administradores locais podem editar os gadgets disponíveis através de [[MediaWiki:Gadgets-definition|definições]] e [[Special:Gadgets|descrições]].',
'gadgets' => 'Gadgets',
'gadgets-title' => 'Gadgets',
- 'gadgets-pagetext' => 'Segue-se uma lista de "gadgets" que podem ser ativados por utilizadores através de [[Special:Preferences#mw-prefsection-gadgets|suas páginas de preferências]], definidos em [[MediaWiki:Gadgets-definition|definições]].
-Esta visão geral proporciona um acesso fácil para as mensagens de sistema que definem as descrições e códigos de cada um dos gadgets.',
- 'gadgets-uses' => 'Utiliza',
+ 'gadgets-pagetext' => 'Segue-se uma lista de "gadgets" que podem ser ativados pelos usuários através de [[Special:Preferences#mw-prefsection-gadgets|suas páginas de preferências]], definidos em [[MediaWiki:Gadgets-definition|suas definições]].
+Esta lista possibilita um acesso fácil para as mensagens de sistema que definem as descrições e códigos de cada um dos gadgets.',
+ 'gadgets-uses' => 'Usa',
'gadgets-required-rights' => 'Requer {{PLURAL:$2|o seguinte privilégio|os seguintes privilégios}}:
$1',
'gadgets-required-skins' => 'Disponível {{PLURAL:$2|no skin $1|nos seguintes skins: $1}}.',
'gadgets-default' => 'Ativado para todos por padrão.',
'gadgets-export' => 'Exportar',
- 'gadgets-export-title' => 'Exportação de gadget',
- 'gadgets-not-found' => '*Gadget "$1" não encontrado.',
+ 'gadgets-export-title' => 'Exportar gadgets',
+ 'gadgets-not-found' => 'O gadget "$1" não encontrado.',
'gadgets-export-text' => 'Para exportar o gadget $1, clique no botão "{{int:gadgets-export-download}}", salve o arquivo transferido,
-vá à página Special:Import na wiki de destino e faça o upload do arquivo. Depois adicione o seguinte à página MediaWiki:Gadgets-definition:
+vá à página Special:Import no wiki de destino e faça o upload do arquivo. Depois, adicione o seguinte à página MediaWiki:Gadgets-definition:
<pre>$2</pre>
-Na wiki de destino, você deve ter as permissões necessárias (incluindo o privilégio de editar mensagens de sistema) e a importação por upload de arquivos deve estar habilitada na wiki.',
- 'gadgets-export-download' => 'Baixar',
+É necessário que você tenha, no wiki de destino, as permissões necessárias (incluindo o privilégio de editar mensagens de sistema) e a importação por upload de arquivos deve estar ativada.',
+ 'gadgets-export-download' => 'Fazer download',
);
/** Quechua (Runa Simi)
@@ -2989,6 +3121,7 @@ Musíte mať príslušné oprávnenia na cieľovej wiki (vrátane práva na úpr
/** Slovenian (slovenÅ¡Äina)
* @author Dbc334
+ * @author Eleassar
* @author Smihael
*/
$messages['sl'] = array(
@@ -2998,7 +3131,7 @@ $messages['sl'] = array(
VeÄinoma temeljijo na JavaScriptu, zato mora biti za njihovo delovanje omogoÄen v vaÅ¡em brskalniku.
Ti vtiÄniki nimajo nobenega vpliva na to nastavitveno stran.
-Prav tako pomnite, da ti vtiÄniki niso del programja MediaWiki in jih obiÄajno razvijajo ter vzdržujejo uporabniki na vaÅ¡em lokalnem wikiju.
+Prav tako upoÅ¡tevajte, da ti vtiÄniki niso del programja MediaWiki in jih obiÄajno razvijajo ter vzdržujejo uporabniki na vaÅ¡em lokalnem wikiju.
Administratorji lahko uredite seznam vtiÄnikov z uporabo [[MediaWiki:Gadgets-definition|opredelitev]] in [[Special:Gadgets|posebne strani]].',
'gadgets' => 'VtiÄniki',
'gadgets-title' => 'VtiÄniki',
@@ -3055,6 +3188,7 @@ Ju duhet të keni leje të përshtatshme në wiki-n e destinuar (duke përfshirÃ
);
/** Serbian (Cyrillic script) (ÑрпÑки (ћирилица)‎)
+ * @author Milicevic01
* @author Millosh
* @author Nikola Smolenski
* @author Rancher
@@ -3062,12 +3196,12 @@ Ju duhet të keni leje të përshtatshme në wiki-n e destinuar (duke përfshirÃ
*/
$messages['sr-ec'] = array(
'gadgets-desc' => 'Омогућава кориÑницима да изаберу прилагођене [[Special:Gadgets|CSS и јаваÑкрипт гаџете]] у Ñвојим [[Special:Preferences#mw-prefsection-gadgets|подешавањима]]',
- 'prefs-gadgets' => 'Гаџети',
+ 'prefs-gadgets' => 'Геџети',
'gadgets-prefstext' => 'ИÑпод Ñе налази ÑпиÑак поÑебних гаџета које можете да омогућите на Ñвом налогу.
Ове Ñправице Ñу углавном заÑноване на јаваÑкрипти, тако да она мора бити омогућена.
Гаџети неће утицати на Ñтраницу за подешавање.
-Они ниÑу део Ñофтвера Медијавики, већ Ñе развијају и одржавају од Ñтране кориÑника ваше викије.
+Они ниÑу део Ñофтвера Медијавики, већ Ñе развијају и одржавају од Ñтране кориÑника на вашем локалном викију.
ÐдминиÑтратори могу да измене [[MediaWiki:Gadgets-definition|значења]] и [[Special:Gadgets|опиÑе]] доÑтупних гаџета.',
'gadgets' => 'Гаџети',
'gadgets-title' => 'Гаџети',
@@ -3091,6 +3225,7 @@ $1',
/** Serbian (Latin script) (srpski (latinica)‎)
* @author Michaello
+ * @author Milicevic01
* @author Жељко Тодоровић
*/
$messages['sr-el'] = array(
@@ -3100,7 +3235,7 @@ $messages['sr-el'] = array(
Ove spravice su uglavnom zasnovane na javaskripti, tako da ona mora biti omogućena.
Gadžeti neće uticati na stranicu za podešavanje.
-Oni nisu deo softvera Medijaviki, već se razvijaju i održavaju od strane korisnika vaše vikije.
+Oni nisu deo softvera Medijaviki, već se razvijaju i održavaju od strane korisnika na vašem lokalnom vikiju.
Administratori mogu da izmene [[MediaWiki:Gadgets-definition|znaÄenja]] i [[Special:Gadgets|opise]] dostupnih gadžeta.',
'gadgets' => 'gedžeti',
'gadgets-title' => 'gedžeti',
@@ -3336,6 +3471,7 @@ Dapat kang mayroong nararapat na mga pahintulot sa kapupuntahang wiki (kasama an
/** Turkish (Türkçe)
* @author Emperyan
* @author Erkan Yilmaz
+ * @author Incelemeelemani
* @author Joseph
* @author Karduelis
* @author Koc61
@@ -3353,6 +3489,11 @@ Yerel yöneticiler [[MediaWiki:Gadgets-definition|tanımları]] ve [[Special:Gad
'gadgets-pagetext' => "Aşağıdaki, kullanıcıların [[Special:Preferences#mw-prefsection-gadgets|tercihler sayfasında]] etkin hale getirebileceği, [[MediaWiki:Gadgets-definition|tanımlarla]] belirtildiği gibi, özel gadgetlerin bir listesidir.
Bu genel bakış, her gadget'in tanımını ve kodunu belirten sistem mesaj sayfalarına kolay erişim sağlar.",
'gadgets-uses' => 'Kullanıyor',
+ 'gadgets-required-rights' => 'Aşağıda gösterilen {{PLURAL:$2|hak|haklar}} gereklidir:
+
+$1',
+ 'gadgets-required-skins' => 'Kullanılabilecek {{PLURAL:$2|$1 tema|temalar: $1}}.',
+ 'gadgets-default' => 'Herkes için varsayılan olarak etkindir.',
'gadgets-export' => 'Dışa aktar',
'gadgets-export-title' => 'Gadget dışa aktarımı',
'gadgets-not-found' => 'Gadget "$1" bulunamadı.',
@@ -3589,16 +3730,12 @@ $messages['yue'] = array(
$messages['zh-hans'] = array(
'gadgets-desc' => 'å…许用户在其[[Special:Preferences#mw-prefsection-gadgets|系统设置]]中选择自定义[[Special:Gadgets|CSSå’ŒJavaScript工具]]',
'prefs-gadgets' => 'å°å·¥å…·',
- 'gadgets-prefstext' => '以下是您å¯ä»¥ä¸ºæ‚¨çš„å¸æˆ·å¯ç”¨çš„特别å°å·¥å…·çš„åå•ã€‚
-这些å°å·¥å…·å¤§å¤šéƒ½æ˜¯åŸºäºŽJavaScript技术制作,所以您的æµè§ˆå™¨çš„JavaScript功能必须å¯ç”¨æ‰å¯ä½¿ç”¨å®ƒä»¬ã€‚
-è¦ç¨ä½œç•™æ„的是,这些å°å·¥å…·åœ¨è¿™ä¸ªå‚数设置页é¢ä¸­ä¸ä¼šæœ‰ä»»ä½•æ•ˆæžœã€‚
+ 'gadgets-prefstext' => '下é¢æ˜¯ä½ å¯ä»¥ä¸ºä½ çš„账户å¯ç”¨çš„特殊å°å·¥å…·çš„列表。这些å°å·¥å…·å¤§å¤šæ•°åŸºäºŽJavaScript,所以你必需使你的æµè§ˆå™¨å¯ç”¨JavaScript以使它们工作。请注æ„这些å°å·¥å…·ä¸ä¼šåœ¨è¿™ä¸ªè®¾ç½®é¡µé¢ä¸Šäº§ç”Ÿæ•ˆæžœã€‚
-亦请您了解这些特别的å°å·¥å…·ä¸æ˜¯MediaWiki软件的一部份,大多是由您本地wiki中的用户开å‘和维护。
-本地的管ç†å‘˜å¯ä»¥ç¼–辑å¯ç”¨å°å·¥å…·çš„[[MediaWiki:Gadgets-definition|定义]]åŠ[[Special:Gadgets|æè¿°]]。',
+åŒæ—¶è¯·æ³¨æ„,这些特殊å°å·¥å…·ä¸æ˜¯MediaWiki软件的组æˆéƒ¨åˆ†ï¼Œä»–们通常是由你的本地wiki的用户开å‘并维护的。本地管ç†å‘˜å¯ä»¥ç¼–辑å¯ç”¨å°å·¥å…·çš„[[MediaWiki:Gadgets-definition|定义]]å’Œ[[Special:Gadgets|说明]]。',
'gadgets' => 'å°å·¥å…·',
'gadgets-title' => 'å°å·¥å…·',
- 'gadgets-pagetext' => '以下是一个按照[[MediaWiki:Gadgets-definition]]定义的特殊å°å·¥å…·åˆ—表,用户å¯ä»¥åœ¨ä»–们的[[Special:Preferences#mw-prefsection-gadgets|å‚数设置页é¢]]中激活它们。
-通过这个概览å¯ä»¥æ–¹ä¾¿çš„获得系统信æ¯é¡µé¢ï¼Œä»Žè€Œå¯ä»¥å®šä¹‰æ¯ä¸ªå°å·¥å…·çš„æ述以åŠæºç ã€‚',
+ 'gadgets-pagetext' => '下é¢æ˜¯ç”¨æˆ·å¯ä»¥åœ¨ä»–们的[[Special:Preferences#mw-prefsection-gadgets|设置页é¢]]å¯ç”¨çš„特殊å°å·¥å…·çš„列表,由[[MediaWiki:Gadgets-definition|定义]]确定。这个概览æ供便æ·è®¿é—®ç¡®å®šæ¯ä¸ªå°å·¥å…·çš„说明和代ç çš„系统信æ¯é¡µé¢çš„途径。',
'gadgets-uses' => '使用',
'gadgets-required-rights' => '需è¦ä»¥ä¸‹{{PLURAL:$2|æƒé™|æƒé™}}:
@@ -3619,13 +3756,14 @@ $1',
* @author Danny0838
* @author Gakmo
* @author Horacewai2
+ * @author Justincheng12345
* @author Liangent
* @author Mark85296341
* @author Shinjiman
* @author Waihorace
*/
$messages['zh-hant'] = array(
- 'gadgets-desc' => '讓使用者å¯ä»¥åœ¨[[Special:Preferences#mw-prefsection-gadgets|å好設定]]中自訂 [[Special:Gadgets|CSS與JavaScript工具]]',
+ 'gadgets-desc' => '讓使用者å¯ä»¥æ–¼[[Special:Preferences#mw-prefsection-gadgets|å好設定]]中自訂[[Special:Gadgets|CSS與JavaScript工具]]',
'prefs-gadgets' => 'å°å·¥å…·',
'gadgets-prefstext' => '以下列出å„種特殊å°å·¥å…·ï¼Œå¯åœ¨æ‚¨çš„帳戶中啟用之。å°å·¥å…·å¤šä½¿ç”¨äº†JavaScript,ç€è¦½å™¨å¿…須啟用JavaScriptæ‰èƒ½æ­£å¸¸é‹ä½œã€‚請注æ„å°å·¥å…·çš„效果ä¸æœƒä½œç”¨åœ¨é€™å€‹å好設定é ã€‚
diff --git a/extensions/Gadgets/Gadgets.php b/extensions/Gadgets/Gadgets.php
index 59b0af69..b0b455c4 100644
--- a/extensions/Gadgets/Gadgets.php
+++ b/extensions/Gadgets/Gadgets.php
@@ -24,7 +24,7 @@ $wgExtensionCredits['other'][] = array(
'path' => __FILE__,
'name' => 'Gadgets',
'author' => array( 'Daniel Kinzler', 'Max Semenik' ),
- 'url' => 'https://mediawiki.org/wiki/Extension:Gadgets',
+ 'url' => 'https://www.mediawiki.org/wiki/Extension:Gadgets',
'descriptionmsg' => 'gadgets-desc',
);
@@ -42,7 +42,7 @@ $wgExtensionMessagesFiles['GadgetsAlias'] = $dir . 'Gadgets.alias.php';
$wgAutoloadClasses['ApiQueryGadgetCategories'] = $dir . 'ApiQueryGadgetCategories.php';
$wgAutoloadClasses['ApiQueryGadgets'] = $dir . 'ApiQueryGadgets.php';
$wgAutoloadClasses['Gadget'] = $dir . 'Gadgets_body.php';
-$wgAutoloadClasses['GadgetHooks'] = $dir . 'Gadgets_body.php';
+$wgAutoloadClasses['GadgetHooks'] = $dir . 'GadgetHooks.php';
$wgAutoloadClasses['GadgetResourceLoaderModule'] = $dir . 'Gadgets_body.php';
$wgAutoloadClasses['SpecialGadgets'] = $dir . 'SpecialGadgets.php';
diff --git a/extensions/Gadgets/Gadgets_body.php b/extensions/Gadgets/Gadgets_body.php
index e787062a..1e043a82 100644
--- a/extensions/Gadgets/Gadgets_body.php
+++ b/extensions/Gadgets/Gadgets_body.php
@@ -11,235 +11,6 @@
* @license GNU General Public Licence 2.0 or later
*/
-class GadgetHooks {
- /**
- * ArticleSaveComplete hook handler.
- *
- * @param $article Article
- * @param $user User
- * @param $text String: New page text
- * @return bool
- */
- public static function articleSaveComplete( $article, $user, $text ) {
- // update cache if MediaWiki:Gadgets-definition was edited
- $title = $article->getTitle();
- if ( $title->getNamespace() == NS_MEDIAWIKI && $title->getText() == 'Gadgets-definition' ) {
- Gadget::loadStructuredList( $text );
- }
- return true;
- }
-
- /**
- * UserGetDefaultOptions hook handler
- * @param $defaultOptions Array of default preference keys and values
- * @return bool
- */
- public static function userGetDefaultOptions( &$defaultOptions ) {
- $gadgets = Gadget::loadStructuredList();
- if ( !$gadgets ) {
- return true;
- }
-
- /**
- * @var $gadget Gadget
- */
- foreach ( $gadgets as $thisSection ) {
- foreach ( $thisSection as $gadgetId => $gadget ) {
- if ( $gadget->isOnByDefault() ) {
- $defaultOptions['gadget-' . $gadgetId] = 1;
- }
- }
- }
-
- return true;
- }
-
- /**
- * GetPreferences hook handler.
- * @param $user User
- * @param $preferences Array: Preference descriptions
- * @return bool
- */
- public static function getPreferences( $user, &$preferences ) {
- $gadgets = Gadget::loadStructuredList();
- if ( !$gadgets ) {
- return true;
- }
-
- $options = array();
- $default = array();
- foreach ( $gadgets as $section => $thisSection ) {
- $available = array();
-
- /**
- * @var $gadget Gadget
- */
- foreach ( $thisSection as $gadget ) {
- if ( $gadget->isAllowed( $user ) ) {
- $gname = $gadget->getName();
- # bug 30182: dir="auto" because it's often not translated
- $desc = '<span dir="auto">' . $gadget->getDescription() . '</span>';
- $available[$desc] = $gname;
- if ( $gadget->isEnabled( $user ) ) {
- $default[] = $gname;
- }
- }
- }
-
- if ( $section !== '' ) {
- $section = wfMessage( "gadget-section-$section" )->parse();
-
- if ( count ( $available ) ) {
- $options[$section] = $available;
- }
- } else {
- $options = array_merge( $options, $available );
- }
- }
-
- $preferences['gadgets-intro'] =
- array(
- 'type' => 'info',
- 'label' => '&#160;',
- 'default' => Xml::tags( 'tr', array(),
- Xml::tags( 'td', array( 'colspan' => 2 ),
- wfMessage( 'gadgets-prefstext' )->parseAsBlock() ) ),
- 'section' => 'gadgets',
- 'raw' => 1,
- 'rawrow' => 1,
- );
-
- $preferences['gadgets'] =
- array(
- 'type' => 'multiselect',
- 'options' => $options,
- 'section' => 'gadgets',
- 'label' => '&#160;',
- 'prefix' => 'gadget-',
- 'default' => $default,
- );
-
- return true;
- }
-
- /**
- * ResourceLoaderRegisterModules hook handler.
- * @param $resourceLoader ResourceLoader
- * @return bool
- */
- public static function registerModules( &$resourceLoader ) {
- $gadgets = Gadget::loadList();
- if ( !$gadgets ) {
- return true;
- }
-
- /**
- * @var $g Gadget
- */
- foreach ( $gadgets as $g ) {
- $module = $g->getModule();
- if ( $module ) {
- $resourceLoader->register( $g->getModuleName(), $module );
- }
- }
- return true;
-
- }
-
- /**
- * BeforePageDisplay hook handler.
- * @param $out OutputPage
- * @return bool
- */
- public static function beforePageDisplay( $out ) {
- wfProfileIn( __METHOD__ );
-
- $gadgets = Gadget::loadList();
- if ( !$gadgets ) {
- wfProfileOut( __METHOD__ );
- return true;
- }
-
- $lb = new LinkBatch();
- $lb->setCaller( __METHOD__ );
- $pages = array();
-
- /**
- * @var $gadget Gadget
- */
- $user = $out->getUser();
- foreach ( $gadgets as $gadget ) {
- if ( $gadget->isEnabled( $user ) && $gadget->isAllowed( $user ) ) {
- if ( $gadget->hasModule() ) {
- $out->addModuleStyles( $gadget->getModuleName() );
- $out->addModules( $gadget->getModuleName() );
- }
-
- foreach ( $gadget->getLegacyScripts() as $page ) {
- $lb->add( NS_MEDIAWIKI, $page );
- $pages[] = $page;
- }
- }
- }
-
-
- // Allow other extensions, e.g. MobileFrontend, to disallow legacy gadgets
- if ( wfRunHooks( 'Gadgets::allowLegacy', array( $out->getContext() ) ) ) {
- $lb->execute( __METHOD__ );
-
- $done = array();
-
- foreach ( $pages as $page ) {
- if ( isset( $done[$page] ) ) {
- continue;
- }
-
- $done[$page] = true;
- self::applyScript( $page, $out );
- }
- }
- wfProfileOut( __METHOD__ );
-
- return true;
- }
-
- /**
- * Adds one legacy script to output.
- *
- * @param string $page Unprefixed page title
- * @param OutputPage $out
- */
- private static function applyScript( $page, $out ) {
- global $wgJsMimeType;
-
- # bug 22929: disable gadgets on sensitive pages. Scripts loaded through the
- # ResourceLoader handle this in OutputPage::getModules()
- # TODO: make this extension load everything via RL, then we don't need to worry
- # about any of this.
- if ( $out->getAllowedModules( ResourceLoaderModule::TYPE_SCRIPTS ) < ResourceLoaderModule::ORIGIN_USER_SITEWIDE ) {
- return;
- }
-
- $t = Title::makeTitleSafe( NS_MEDIAWIKI, $page );
- if ( !$t ) {
- return;
- }
-
- $u = $t->getLocalURL( 'action=raw&ctype=' . $wgJsMimeType );
- $out->addScriptFile( $u, $t->getLatestRevID() );
- }
-
- /**
- * UnitTestsList hook handler
- * @param array $files
- * @return bool
- */
- public static function onUnitTestsList( array &$files ) {
- $testDir = __DIR__ . '/tests/';
- $files = array_merge( $files, glob( "$testDir/*Test.php" ) );
- return true;
- }
-}
/**
* Wrapper for one gadget.
@@ -248,7 +19,7 @@ class Gadget {
/**
* Increment this when changing class structure
*/
- const GADGET_CLASS_VERSION = 6;
+ const GADGET_CLASS_VERSION = 7;
private $version = self::GADGET_CLASS_VERSION,
$scripts = array(),
@@ -261,6 +32,7 @@ class Gadget {
$requiredSkins = array(),
$targets = array( 'desktop' ),
$onByDefault = false,
+ $position = 'bottom',
$category;
/**
@@ -310,6 +82,9 @@ class Gadget {
case 'targets':
$gadget->targets = $params;
break;
+ case 'top':
+ $gadget->position = 'top';
+ break;
}
}
@@ -463,7 +238,7 @@ class Gadget {
return null;
}
- return new GadgetResourceLoaderModule( $pages, $this->dependencies, $this->targets );
+ return new GadgetResourceLoaderModule( $pages, $this->dependencies, $this->targets, $this->position );
}
/**
@@ -502,6 +277,14 @@ class Gadget {
}
/**
+ * Returns the position of this Gadget's ResourceLoader module
+ * @return String: 'bottom' or 'top'
+ */
+ public function getPosition() {
+ return $this->position;
+ }
+
+ /**
* Loads and returns a list of all gadgets
* @return Mixed: Array of gadgets or false
*/
@@ -614,6 +397,13 @@ class Gadget {
}
}
+ if ( !count( $gadgets ) ) {
+ // Don't cache in case we couldn't find any gadgets. Bug 37228
+ $gadgets = false;
+ wfProfileOut( __METHOD__ );
+ return $gadgets;
+ }
+
// cache for a while. gets purged automatically when MediaWiki:Gadgets-definition is edited
$wgMemc->set( $key, $gadgets, 60 * 60 * 24 );
$source = $forceNewText !== null ? 'input text' : 'MediaWiki:Gadgets-definition';
@@ -641,11 +431,13 @@ class GadgetResourceLoaderModule extends ResourceLoaderWikiModule {
* )
* @param $dependencies Array: Names of resources this module depends on
* @param $targets Array: List of targets this module support
+ * @param $position String: 'bottom' or 'top'
*/
- public function __construct( $pages, $dependencies, $targets ) {
+ public function __construct( $pages, $dependencies, $targets, $position ) {
$this->pages = $pages;
$this->dependencies = $dependencies;
$this->targets = $targets;
+ $this->position = $position;
}
/**
@@ -664,4 +456,12 @@ class GadgetResourceLoaderModule extends ResourceLoaderWikiModule {
public function getDependencies() {
return $this->dependencies;
}
+
+ /**
+ * Overrides ResourceLoaderModule::getPosition()
+ * @return String: 'bottom' or 'top'
+ */
+ public function getPosition() {
+ return $this->position;
+ }
}
diff --git a/extensions/Gadgets/README b/extensions/Gadgets/README
index cbe0862e..5fb3c353 100644
--- a/extensions/Gadgets/README
+++ b/extensions/Gadgets/README
@@ -8,7 +8,7 @@ Licenses: GNU General Public Licence (GPL)
The Gadgets extension provides a way for users to pick JavaScript or CSS
based "gadgets" that other wiki users provide.
-<https://mediawiki.org/wiki/Extension:Gadgets>
+<https://www.mediawiki.org/wiki/Extension:Gadgets>
The Gadgets extension was originally written by Daniel Kinzler in 2007
and is released under the GNU General Public Licence (GPL).
diff --git a/extensions/ImageMap/ImageMap.i18n.php b/extensions/ImageMap/ImageMap.i18n.php
index f3a46a76..cf4e2655 100644
--- a/extensions/ImageMap/ImageMap.i18n.php
+++ b/extensions/ImageMap/ImageMap.i18n.php
@@ -1,6 +1,6 @@
<?php
/**
- * Internationalisation file for extension FindSpam.
+ * Internationalisation file for extension ImageMap.
*
* @file
* @ingroup Extensions
@@ -48,7 +48,9 @@ This message indicates that an image must be specified in the first line.',
* $1 - line number',
'imagemap_missing_coord' => 'Used as error message. Parameters:
* $1 - line number',
- 'imagemap_unrecognised_shape' => '{{doc-important|Do not translate the parameters <code>default</code>, <code>rect</code>, <code>circle</code> or <code>poly</code>.}}',
+ 'imagemap_unrecognised_shape' => '{{doc-important|Do not translate the parameters <code>default</code>, <code>rect</code>, <code>circle</code> or <code>poly</code>.}}
+Used as error message. Parameters:
+* $1 - line number',
'imagemap_invalid_coord' => 'Used as error message. Parameters:
* $1 - line number',
'imagemap_invalid_desc' => 'Used as error message. Parameters:
@@ -132,7 +134,7 @@ $messages['arz'] = array(
'imagemap_poly_odd' => 'خطأ: تم العثور على مضلع بعدد Ùردى من الأضلاع ÙÙ‰ السطر $1',
);
-/** Assamese (অসমীয়া)
+/** Assamese (অসমীয়া)
* @author Bishnu Saikia
* @author Gitartha.bordoloi
*/
@@ -220,9 +222,21 @@ $messages['bcc'] = array(
/** Bikol Central (Bikol Central)
* @author Filipinayzd
+ * @author Geopoet
*/
$messages['bcl'] = array(
+ 'imagemap_desc' => 'Minatugot sa lado nin kliyente an puwedeng ma-klik na mga imahe nin mapa na ginagamit an <code>&lt;imagemap&gt;</code> na tatak',
+ 'imagemap_no_image' => 'Kasalaan:Kaipuhan isambit an imahe sa enot na linya.',
+ 'imagemap_invalid_image' => 'Kasalaan: An imahe imbalido o bakong eksistido.',
+ 'imagemap_bad_image' => 'Kasalaan:An imahe pinagbawal sa pahinang ini.',
+ 'imagemap_no_link' => 'Kasalaan:Mayo nin balidong sugpon an manumpungan sa tapos kan linya na $1.',
+ 'imagemap_invalid_title' => 'Kasalaan:Imbalido an titulo na yaon sa sugpon sa linya na $1.',
+ 'imagemap_missing_coord' => 'Kasalaan:Bakong supisiyente an mga koordinato para sa kahitsurahan kan linya $1.',
+ 'imagemap_unrecognised_shape' => 'Kasalaan: Bakong rekonosido an kahitsurahan sa linya $1, an lambang linya kaipong magpoon na igwang saro kan: <code>default</code>, <code>rect</code>, <code>circle</code> or <code>poly</code>.',
+ 'imagemap_invalid_coord' => 'Kasalaan:Imbalidong koordinato sa linya $1, kaipohan na sarong numero.',
+ 'imagemap_invalid_desc' => 'Kasalaan: Imbalido an deskripsyon nin espesipikasyon, kaipohan na saro sa:<code>$1</code>.',
'imagemap_description' => 'Manónongod sa retratong ini',
+ 'imagemap_poly_odd' => 'Kasalaan:Nanumpungan an poli na igwang butal na numero kan koordinato sa may linya na $1',
);
/** Belarusian (TaraÅ¡kievica orthography) (беларуÑÐºÐ°Ñ (тарашкевіца)‎)
@@ -348,9 +362,13 @@ $messages['ca'] = array(
/** Chechen (нохчийн)
* @author Sasan700
+ * @author Умар
*/
$messages['ce'] = array(
- 'imagemap_invalid_image' => 'Гlалат: нийÑа дац йа ишта Ñурт дац кху чохь',
+ 'imagemap_invalid_image' => 'ГӀалат: нийÑа дац Ñ Ð¸ÑˆÑ‚Ð° Ñурт дац кху чохь',
+ 'imagemap_no_link' => 'ГӀалат: $1 могӀанан чаккхехь нийÑа йоцу хьажораг ÑŽ',
+ 'imagemap_invalid_title' => 'ГӀалат: могӀана $1 хьажориган корта нийÑа Ñц',
+ 'imagemap_description' => 'Суьртах лаьцна',
);
/** Corsican (corsu)
@@ -382,6 +400,11 @@ $messages['cs'] = array(
* @author Lloffiwr
*/
$messages['cy'] = array(
+ 'imagemap_no_image' => 'Gwall: Rhaid nodi delwedd yn y llinell gyntaf.',
+ 'imagemap_invalid_image' => "Gwall: Nid yw'r ddelwedd yn ddilys, neu nid yw'n bod.",
+ 'imagemap_bad_image' => "Gwall: Mae'r ddelwedd wedi ei gwahardd rhag ei defnyddio ar y dudalen hon.",
+ 'imagemap_no_link' => 'Gwall: Ni chafwyd unrhyw gyswllt dilys ar ddiwedd y llinell $1.',
+ 'imagemap_invalid_title' => 'Gwall: Teitl annilys yn y cyswllt ar linell $1.',
'imagemap_description' => "Ynglŷn â'r ddelwedd hon",
);
@@ -570,20 +593,21 @@ $messages['ext'] = array(
);
/** Persian (Ùارسی)
+ * @author Ebraminio
* @author Huji
* @author ZxxZxxZ
*/
$messages['fa'] = array(
'imagemap_desc' => 'امکان ایجاد نقشه‌های تصویری قابل کلیک کردن در سمت کاربر را با استÙاده از برچسب <code>&lt;imagemap&gt;</code> Ùراهم می‌آورد',
'imagemap_no_image' => '<imagemap>: باید در اولین سطر یک تصویر را مشخص کنید',
- 'imagemap_invalid_image' => '<imagemap>: تصویر غیرمجاز است یا وجود ندارد',
+ 'imagemap_invalid_image' => '<imagemap>: تصویر نامحاز است یا وجود ندارد',
'imagemap_bad_image' => 'خطا: تصویر در این صÙحه در Ùهرست سیاه قرار دارد',
'imagemap_no_link' => 'خطا: هیچ پیوند مجازی در انتهای خط $1 یاÙت نشد',
- 'imagemap_invalid_title' => '<imagemap>: عنوان غیرمجاز در پیوند سطر $1',
+ 'imagemap_invalid_title' => '<imagemap>: عنوان نامجاز در پیوند سطر $1',
'imagemap_missing_coord' => '<imagemap>: تعداد مختصات در سطر $1 برای Ø´Ú©Ù„ کاÙÛŒ نیست',
'imagemap_unrecognised_shape' => '<imagemap>: شکل ناشناخته در سطر $1، هر سطر باید با یکی از این دستورات آغاز شود: <code>default</code>، <code>rect</code>، <code>circle</code> یا <code>poly</code>',
- 'imagemap_invalid_coord' => '<imagemap>: مختصات غیرمجاز در سطر $1، مختصات باید عدد باشد',
- 'imagemap_invalid_desc' => '<imagemap>: توضیحات غیرمجاز، باید یکی از این موارد باشد: <code>$1</code>',
+ 'imagemap_invalid_coord' => '<imagemap>: مختصات نامجاز در سطر $1، مختصات باید عدد باشد',
+ 'imagemap_invalid_desc' => '<imagemap>: توضیحات نامجاز، باید یکی از این موارد باشد: <code>$1</code>',
'imagemap_description' => 'دربارهٔ این تصویر',
'imagemap_poly_odd' => 'خطا: چند ضلعی با تعداد Ùرعی از مختصات در سطر $1 پیدا شد',
);
@@ -1048,18 +1072,19 @@ $messages['km'] = array(
* @author Klutzy
* @author Kwj2772
* @author Yknok29
+ * @author ì•„ë¼
*/
$messages['ko'] = array(
- 'imagemap_desc' => '사용ìžê°€ ì´ë¯¸ì§€ë§µì„ 사용할 수 있ë„ë¡ <code>&lt;imagemap&gt;</code> 태그를 추가',
+ 'imagemap_desc' => '<code>&lt;imagemap&gt;</code> 태그로 í´ë¼ì´ì–¸íŠ¸ 측ì—ì„œ í´ë¦­í•  수 있는 ì´ë¯¸ì§€ ë§µì„ ì‚¬ìš©í•  수 있습니다',
'imagemap_no_image' => '오류: 첫 ì¤„ì— ê·¸ë¦¼ì´ ì œì‹œë˜ì–´ì•¼ 합니다.',
'imagemap_invalid_image' => '오류: ê·¸ë¦¼ì´ ìž˜ëª»ë˜ì—ˆê±°ë‚˜ 존재하지 않습니다.',
- 'imagemap_bad_image' => '오류: ì´ ê·¸ë¦¼ì€ ì´ ë¬¸ì„œì—ì„œ ì‚¬ìš©ì´ ê¸ˆì§€ë˜ì–´ 있습니다.',
- 'imagemap_no_link' => '오류: $1번째 줄ì—ì„œ 유효한 ë§í¬ë¥¼ ì°¾ì„ ìˆ˜ 없습니다',
+ 'imagemap_bad_image' => '오류: ê·¸ë¦¼ì€ ì´ ë¬¸ì„œì—ì„œ ì‚¬ìš©ì´ ê¸ˆì§€ë˜ì–´ 있습니다.',
+ 'imagemap_no_link' => '오류: $1번째 줄ì—ì„œ 올바른 ë§í¬ë¥¼ ì°¾ì„ ìˆ˜ 없습니다',
'imagemap_invalid_title' => '오류: $1번째 ì¤„ì˜ ë§í¬ ì œëª©ì´ ìž˜ëª»ë˜ì—ˆìŠµë‹ˆë‹¤',
'imagemap_missing_coord' => '오류: $1ì¤„ì— ì •ì˜ëœ ë„í˜•ì˜ ì¢Œí‘œ ê°’ì´ ì¶©ë¶„í•˜ì§€ 않습니다.',
'imagemap_unrecognised_shape' => '오류: $1줄ì—ì„œ ë„í˜•ì„ ì¸ì‹í•  수 ì—†ìŒ, ê° ì¤„ì€ ë‹¤ìŒìœ¼ë¡œ 시작해야 합니다: <code>default</code>, <code>rect</code>, <code>circle</code>, <code>poly</code>',
'imagemap_invalid_coord' => '오류: $1번째 줄ì—ì„œ 좌표가 잘못ë˜ì—ˆìŠµë‹ˆë‹¤. 좌표는 반드시 숫ìžì—¬ì•¼ 합니다.',
- 'imagemap_invalid_desc' => '오류: ì§ˆëª»ëœ desc 설정. ë‹¤ìŒ ì¤‘ 하나가 ë˜ì–´ì•¼ 함: <code>$1</code>',
+ 'imagemap_invalid_desc' => '오류: ì§ˆëª»ëœ desc 설정으로, ë‹¤ìŒ ì¤‘ 하나여야 합니다: <code>$1</code>',
'imagemap_description' => 'ì´ ê·¸ë¦¼ì— ëŒ€í•œ ì •ë³´',
'imagemap_poly_odd' => '오류: $1번째 ì¤„ì— ì •ì˜ëœ 좌표 ê°’ì˜ ìˆ˜ê°€ 홀수 개입니다.',
);
@@ -1101,6 +1126,7 @@ $messages['la'] = array(
/** Luxembourgish (Lëtzebuergesch)
* @author Robby
+ * @author Soued031
*/
$messages['lb'] = array(
'imagemap_desc' => 'Erlaabt et Biller ze benotzen déi een uklicke ka mat Hëllef vum Tag <code>&lt;imagemap&gt;</code>.',
@@ -1113,7 +1139,7 @@ $messages['lb'] = array(
'imagemap_unrecognised_shape' => 'Feeler: Onbekannte Form an der Zeil $1. All Zeile muss matt engem vun dëse Parameter ufänken: <tt><code>default</code>, <code>rect</code>, <code>circle</code></tt> oder <tt><code>poly</code></tt>',
'imagemap_invalid_coord' => 'Feeler: Ongëlteg Koordinaten an der Zeil $1: et sinn nëmmen Zuelen erlaabt',
'imagemap_invalid_desc' => 'Feeler: Ongëltegen „desc“-Parameter, méiglech sinn: <code>$1</code>',
- 'imagemap_description' => 'Iwwert dëst Bild',
+ 'imagemap_description' => 'Iwwer dëst Bild',
'imagemap_desc_types' => 'uewe-riets, ënne-riets, ënne-lénks, uewe-lénks, keen',
'imagemap_poly_odd' => 'Feeler: e Polygon mat enger ongerueder Zuel vu Koordinate gouf an der Linn $1 fonnt',
);
@@ -1267,7 +1293,7 @@ $messages['myv'] = array(
'imagemap_description' => 'Те артовкÑтонть',
);
-/** Norwegian Bokmål (norsk (bokmål)‎)
+/** Norwegian Bokmål (norsk bokmål)
*/
$messages['nb'] = array(
'imagemap_desc' => 'Gjør at man kan bruke klikkbare bilder ved hjelp av <code>&lt;imagemap&gt;</code>.',
@@ -1302,12 +1328,14 @@ $messages['nds'] = array(
'imagemap_poly_odd' => 'Fehler: Polygon mit unevene Tall Koordinaten in Reeg $1',
);
-/** Nedersaksies (Nedersaksies)
+/** Low Saxon (Netherlands) (Nedersaksies)
* @author Servien
*/
$messages['nds-nl'] = array(
+ 'imagemap_desc' => 'Maakt anklikbaore verwiezingen op aofbeeldingen meugelik mit t etiket <code>&lt;imagemap&gt;</code>',
'imagemap_no_image' => 'Fout: geef n aofbeelding op in de eerste regel',
'imagemap_invalid_image' => 'Fout: aofbeelding is ongeldig of besteet niet',
+ 'imagemap_bad_image' => 'Fout: de aofbeelding steet op de zwarte lieste veur disse zied',
'imagemap_no_link' => 'Fout: der is gien geldige verwiezing evunnen an t einde van regel $1',
'imagemap_invalid_title' => 'Fout: ongeldige titel in de verwiezing op regel $1',
'imagemap_missing_coord' => 'Fout: niet genog koördinaoten veur vorm op regel $1',
@@ -1315,6 +1343,7 @@ $messages['nds-nl'] = array(
'imagemap_invalid_coord' => 'Fout: ongeldige koördinaot in regel $1, mut n getal ween',
'imagemap_invalid_desc' => 'Fout: ongeldige beschrievingsspesifikasie, mut n van: <code>$1</code> ween',
'imagemap_description' => 'Over disse aofbeelding',
+ 'imagemap_poly_odd' => 'Fout: polygoon evunnen mit n oneffen antal koördinaoten op regel $1',
);
/** Nepali (नेपाली)
@@ -1342,7 +1371,7 @@ $messages['nl'] = array(
'imagemap_poly_odd' => 'Fout: polygoon gevonden met een oneven aantal coördinaten op regel $1',
);
-/** Norwegian Nynorsk (norsk (nynorsk)‎)
+/** Norwegian Nynorsk (norsk nynorsk)
* @author Frokor
*/
$messages['nn'] = array(
@@ -1367,7 +1396,7 @@ $messages['oc'] = array(
'imagemap_desc' => "Permet qu'una mapa imatge clienta siá clicabla en utilizant la balisa <code>&lt;imagemap&gt;</code>",
'imagemap_no_image' => 'Error : vos cal especificar un imatge dins la primièra linha',
'imagemap_invalid_image' => 'Error : l’imatge es invalid o existís pas',
- 'imagemap_bad_image' => 'Error : l’imatge es sus la tièra negra sus aquesta pagina',
+ 'imagemap_bad_image' => 'Error : l’imatge es sus la lista negra sus aquesta pagina',
'imagemap_no_link' => 'Error : cap de ligam valid es pas estat trobat a la fin de la linha $1',
'imagemap_invalid_title' => 'Error : títol invalid dins lo ligam a la linha $1',
'imagemap_missing_coord' => 'Error : pas pro de coordenadas per la forma a la linha $1',
@@ -1378,7 +1407,7 @@ $messages['oc'] = array(
'imagemap_poly_odd' => 'Error : trobat un poligòn amb un nombre impar de coordenadas a la linha $1',
);
-/** Oriya (ଓଡ଼ିଆ)
+/** Oriya (ଓଡ଼ିଆ)
* @author Psubhashish
*/
$messages['or'] = array(
diff --git a/extensions/ImageMap/ImageMap.php b/extensions/ImageMap/ImageMap.php
index aa4cfa0d..b263bbb5 100644
--- a/extensions/ImageMap/ImageMap.php
+++ b/extensions/ImageMap/ImageMap.php
@@ -1,4 +1,20 @@
<?php
+/**
+ * ImageMap extension - Allows clickable HTML image maps.
+ *
+ * @link https://www.mediawiki.org/wiki/Extension:ImageMap Documentation
+ *
+ * @file
+ * @ingroup Extensions
+ * @package MediaWiki
+ * @author Tim Starling
+ * @copyright (C) 2007 Tim Starling
+ * @license http://www.gnu.org/copyleft/gpl.html GNU General Public License 2.0 or later
+ */
+
+if ( !defined( 'MEDIAWIKI' ) ) {
+ die( 'This file is a MediaWiki extension, it is not a valid entry point' );
+}
$dir = __DIR__ . '/';
$wgExtensionMessagesFiles['ImageMap'] = $dir . 'ImageMap.i18n.php';
diff --git a/extensions/ImageMap/ImageMap_body.php b/extensions/ImageMap/ImageMap_body.php
index e67b4426..7b53285e 100644
--- a/extensions/ImageMap/ImageMap_body.php
+++ b/extensions/ImageMap/ImageMap_body.php
@@ -1,7 +1,9 @@
<?php
-
/**
- * Image map extension.
+ * Main file for extension ImageMap.
+ *
+ * @file
+ * @ingroup Extensions
*
* Syntax:
* <imagemap>
diff --git a/extensions/InputBox/InputBox.i18n.php b/extensions/InputBox/InputBox.i18n.php
index c4a27d40..0d05d036 100644
--- a/extensions/InputBox/InputBox.i18n.php
+++ b/extensions/InputBox/InputBox.i18n.php
@@ -40,8 +40,8 @@ $messages['qqq'] = array(
See also:
* {{msg-mw|Inputbox-error-bad-type}}',
'inputbox-error-bad-type' => '{{doc-important|"create", "comment", "search", "search2" and "fulltext" should not be translated.}}
-Used as error message.
-
+Used as error message. Parameters:
+* $1 - invalid type. Valid types are: "create", "comment", "commenttitle", "search", "fulltext", and "search2"
See also:
* {{msg-mw|Inputbox-error-no-type}}',
'tryexact' => 'Part of the "Inputbox" extension. This message is the text of the button to search the page you typed in the inputbox. If the page with the exact name exists, you will go directly to that page.',
@@ -51,8 +51,10 @@ See also:
* {{msg-mw|Search}}
* {{msg-mw|Accesskey-search-fulltext}}
* {{msg-mw|Tooltip-search-fulltext}}',
- 'createarticle' => 'Part of the "Inputbox" extension. This message is the text of the button to create the page you typed in the inputbox.',
- 'inputbox-ns-main' => 'Probably refers to the main namespace.',
+ 'createarticle' => 'Part of the "Inputbox" extension. This message is the text of the button to create the page you typed in the inputbox.
+{{Identical|Create page}}',
+ 'inputbox-ns-main' => 'Probably refers to the main namespace.
+{{Identical|Main}}',
);
/** Afrikaans (Afrikaans)
@@ -127,7 +129,7 @@ $messages['arz'] = array(
'createarticle' => 'إنشاء صÙحة',
);
-/** Assamese (অসমীয়া)
+/** Assamese (অসমীয়া)
* @author Bishnu Saikia
* @author Chaipau
* @author Gitartha.bordoloi
@@ -206,6 +208,21 @@ $messages['bcc'] = array(
'createarticle' => 'شرکتن صÙحه',
);
+/** Bikol Central (Bikol Central)
+ * @author Filipinayzd
+ * @author Geopoet
+ */
+$messages['bcl'] = array(
+ 'inputbox-desc' => 'Minatugot na balihon an pangenot na pakahulugan kan mga porma nin HTML',
+ 'inputbox-error-no-type' => 'Ika dae nagsasambit kan tipo nin palaogang kahon tanganing maimukna.',
+ 'inputbox-error-bad-type' => 'An tipo kan palaogang kahon na "$1" bakong rekonosido.
+Pakisambit tabi an "magmukna", "komento", "hanapa" "hanapa2" o an "kabilogang teksto".',
+ 'tryexact' => 'Prubaran an eksaktong katampadan',
+ 'searchfulltext' => 'Hanapa an kabilogang teksto',
+ 'createarticle' => 'Muknaon an pahina',
+ 'inputbox-ns-main' => 'Kapamayuhanan',
+);
+
/** Belarusian (беларуÑкаÑ)
*/
$messages['be'] = array(
@@ -327,16 +344,21 @@ Especifiqueu-hi «create», «comment», «search», «search2» o «fulltext».
);
/** Min Dong Chinese (Mìng-dĕ̤ng-ngṳ̄)
+ * @author Yejianfei
*/
$messages['cdo'] = array(
- 'createarticle' => 'Kŭi hiĕk',
+ 'createarticle' => 'é–‹é ',
);
/** Chechen (нохчийн)
* @author Sasan700
+ * @author Умар
*/
$messages['ce'] = array(
+ 'inputbox-error-no-type' => 'Ðхьа Ñзъечу меттиган тайп билгала йина Ñц.',
'tryexact' => 'Леррина лахар',
+ 'searchfulltext' => 'Дуьззина йозанца лахар',
+ 'createarticle' => 'Яззам кхоллар',
);
/** Sorani Kurdish (کوردی)
@@ -658,8 +680,8 @@ $messages['frr'] = array(
'inputbox-desc' => 'Föörformatiaret HTML-fialen tuläät',
'inputbox-error-no-type' => 'Dü heest ei uunden, hün slach faan fial iinracht wurd skal.',
'inputbox-error-bad-type' => 'Di slach „$1“ as ei tuläät. Wees so gud an nem „create“, „comment“, „search“, „search2“ of „fulltext“.',
- 'tryexact' => 'Sjük genau',
- 'searchfulltext' => 'Sjük uun di hialer tekst',
+ 'tryexact' => 'Schük genau',
+ 'searchfulltext' => 'Schük uun di hialer tekst',
'createarticle' => 'Maage en nei sidj',
'inputbox-ns-main' => 'Sidjen',
);
@@ -759,7 +781,7 @@ $messages['gv'] = array(
'createarticle' => 'Croo duillag',
);
-/** Hakka (Hak-kâ-fa)
+/** Hakka (客家語/Hak-kâ-ngî)
* @author Hakka
*/
$messages['hak'] = array(
@@ -928,14 +950,14 @@ $messages['ig'] = array(
* @author Lam-ang
*/
$messages['ilo'] = array(
- 'inputbox-desc' => 'Pakabaelan na nga agikabil kadagiti napalasin a kinabuklan ti HTML',
- 'inputbox-error-no-type' => 'Saan mo pay nga imbaga no ania a kita ti pagikabilan a kahon ti aramiden.',
- 'inputbox-error-bad-type' => 'Ti kita ti pigikabilan a kahon "$1" ket saan a ma-ammoan.
-Pangaasi ta ibagam nga "agaramid", "komentario", "biruken", "biruken2", "wenno sibubukel a testo".',
+ 'inputbox-desc' => 'Mangipalubos ti panangiraman kadagiti nasakbayan a naipalawag a porma ti HTML',
+ 'inputbox-error-no-type' => 'Saanmo pay a nainaganan no ania a kita ti partuaten a kahon ti pagikabilan.',
+ 'inputbox-error-bad-type' => 'Ti kita ti kahon a pigikabilan ti "$1" ket saan a mabigbigan.
+Pangngaasi nga inaganam ti "agpartuat", "komento", "biruken", "biruken2", "wenno sibubukel a testo".',
'tryexact' => 'Padasem to pudno a kapada',
- 'searchfulltext' => 'Agbiruk ti sibubukel a testo',
- 'createarticle' => 'Agaramid ti panid',
- 'inputbox-ns-main' => 'Dati',
+ 'searchfulltext' => 'Agbiruk ti napno a testo',
+ 'createarticle' => 'Agpartuat ti panid',
+ 'inputbox-ns-main' => 'Nangruna',
);
/** Ido (Ido)
@@ -1095,13 +1117,14 @@ $messages['km'] = array(
* @author Klutzy
* @author Kwj2772
* @author ToePeu
+ * @author ì•„ë¼
*/
$messages['ko'] = array(
- 'inputbox-desc' => '사전 ì •ì˜ëœ HTML í¼ì„ í¬í•¨í•  수 있게 í•´ 줌',
- 'inputbox-error-no-type' => 'type ì†ì„±ì„ 정하지 않았습니다.',
- 'inputbox-error-bad-type' => '"$1"ì€(는) 사용할 수 없는 type ì†ì„±ìž…니다.
-"create", "comment", "search", "search2", "fulltext" 중 하나를 사용하세요.',
- 'tryexact' => '정확한 ì´ë¦„으로 찾기',
+ 'inputbox-desc' => '사전 ì •ì˜ëœ HTML ì–‘ì‹ì„ í¬í•¨í•  수 있습니다',
+ 'inputbox-error-no-type' => '만드려는 ìž…ë ¥ ìƒìžì˜ 종류를 지정하지 않았습니다.',
+ 'inputbox-error-bad-type' => '"$1" ìž…ë ¥ ìƒìž 종류는 ì •ì˜ë˜ì–´ 있지 않습니다.
+"create", "comment", "search", "search2"나 "fulltext" 중 하나를 지정하세요.',
+ 'tryexact' => 'ì¼ì¹˜í•˜ëŠ” 항목 찾기',
'searchfulltext' => '전체 글 검색',
'createarticle' => '문서 만들기',
'inputbox-ns-main' => '문서',
@@ -1208,6 +1231,14 @@ $messages['lo'] = array(
'createarticle' => 'ສ້າງບົດຄວາມ',
);
+/** لوری (لوری)
+ * @author Mogoeilor
+ */
+$messages['lrc'] = array(
+ 'createarticle' => 'راس كردن بلگه',
+ 'inputbox-ns-main' => 'اصلی',
+);
+
/** Lithuanian (lietuvių)
* @author Vogone
*/
@@ -1318,7 +1349,7 @@ $messages['mn'] = array(
*/
$messages['mr'] = array(
'inputbox-desc' => 'पूरà¥à¤µà¥€ लिहिलेले HTML अरà¥à¤œ वापरणà¥à¤¯à¤¾à¤šà¥€ परवानगी दà¥à¤¯à¤¾',
- 'inputbox-error-no-type' => 'तà¥à¤®à¥à¤¹à¥€ कà¥à¤ à¤²à¥à¤¯à¤¾ पà¥à¤°à¤•à¤¾à¤°à¤šà¥€ पृषà¥à¤ à¤ªà¥‡à¤Ÿà¥€ तयार करायची ते सà¥à¤ªà¤·à¥à¤Ÿ केलेले नाही.',
+ 'inputbox-error-no-type' => 'कà¥à¤ à¤²à¥à¤¯à¤¾ पà¥à¤°à¤•à¤¾à¤°à¤šà¥€ पृषà¥à¤ à¤ªà¥‡à¤Ÿà¥€ तयार करायची ते तà¥à¤®à¥à¤¹à¥€ सà¥à¤ªà¤·à¥à¤Ÿ केलेले नाही.',
'inputbox-error-bad-type' => 'तà¥à¤®à¥à¤¹à¥€ दिलेला पृषà¥à¤ à¤ªà¥‡à¤Ÿà¥€à¤šà¤¾ "$1" हा पà¥à¤°à¤•à¤¾à¤° ओळखीचा नाही.
कृपया "create", "comment", "search" किंवा "search2" किंवा "fulltext".यातील à¤à¤• निवडा.',
'tryexact' => 'दिलेलेच शबà¥à¤¦ शोधा',
@@ -1385,7 +1416,7 @@ $messages['nan'] = array(
'searchfulltext' => 'Chhiau choan-bûn',
);
-/** Neapolitan (Nnapulitano)
+/** Neapolitan (Napulitano)
* @author Chelin
* @author SabineCretella
*/
@@ -1394,7 +1425,7 @@ $messages['nap'] = array(
'createarticle' => 'Cria paggena',
);
-/** Norwegian Bokmål (norsk (bokmål)‎)
+/** Norwegian Bokmål (norsk bokmål)
* @author EivindJ
*/
$messages['nb'] = array(
@@ -1421,7 +1452,7 @@ Geev een vun disse Typen an: „create“, „comment“, „search“, „searc
'createarticle' => 'Siet anleggen',
);
-/** Nedersaksies (Nedersaksies)
+/** Low Saxon (Netherlands) (Nedersaksies)
* @author Servien
*/
$messages['nds-nl'] = array(
@@ -1465,7 +1496,7 @@ $messages['nl-informal'] = array(
'inputbox-error-no-type' => 'Je hebt het type invoerveld niet opgegeven.',
);
-/** Norwegian Nynorsk (norsk (nynorsk)‎)
+/** Norwegian Nynorsk (norsk nynorsk)
* @author Frokor
* @author Harald Khan
* @author Njardarlogar
@@ -1508,7 +1539,7 @@ Indicatz una opcion demest ''create'', ''comment'', ''search'' o ''searche2'' o
'inputbox-ns-main' => 'Principal',
);
-/** Oriya (ଓଡ଼ିଆ)
+/** Oriya (ଓଡ଼ିଆ)
* @author Odisha1
* @author Psubhashish
*/
@@ -2060,10 +2091,11 @@ $messages['ts'] = array(
);
/** Tuvinian (тыва дыл)
+ * @author Agilight
* @author Sborsody
*/
$messages['tyv'] = array(
- 'createarticle' => 'Ðрынны чаÑары',
+ 'createarticle' => 'Ðрын чаÑар',
'inputbox-ns-main' => 'Кол',
);
diff --git a/extensions/Interwiki/Interwiki.alias.php b/extensions/Interwiki/Interwiki.alias.php
index 44e5b225..30098f05 100644
--- a/extensions/Interwiki/Interwiki.alias.php
+++ b/extensions/Interwiki/Interwiki.alias.php
@@ -5,6 +5,7 @@
* @file
* @ingroup Extensions
*/
+// @codingStandardsIgnoreFile
$specialPageAliases = array();
@@ -43,6 +44,16 @@ $specialPageAliases['bs'] = array(
'Interwiki' => array( 'Medjuwiki' ),
);
+/** Min Dong Chinese (Mìng-dĕ̤ng-ngṳ̄) */
+$specialPageAliases['cdo'] = array(
+ 'Interwiki' => array( '跨維基' ),
+);
+
+/** Chechen (нохчийн) */
+$specialPageAliases['ce'] = array(
+ 'Interwiki' => array( 'Юкъарвики' ),
+);
+
/** German (Deutsch) */
$specialPageAliases['de'] = array(
'Interwiki' => array( 'Interwikitabelle', 'Interwiki-Tabelle' ),
diff --git a/extensions/Interwiki/Interwiki.i18n.php b/extensions/Interwiki/Interwiki.i18n.php
index efd2b11d..8b9c85a0 100644
--- a/extensions/Interwiki/Interwiki.i18n.php
+++ b/extensions/Interwiki/Interwiki.i18n.php
@@ -123,39 +123,43 @@ Used when the user has no right to edit the interwiki data and can only view the
'interwiki-legend-hide' => 'Link text for toggle to hide the legend on [[Special:Interwiki]].',
'interwiki_prefix' => 'Used on [[Special:Interwiki]] as a column header of the table.',
'interwiki-prefix-label' => 'Used on [[Special:Interwiki]] as a field label in a form.',
- 'interwiki_prefix_intro' => 'Used on [[Special:Interwiki]] so as to explain the data in the {{msg-mw|interwiki_prefix}} column of the table.
+ 'interwiki_prefix_intro' => 'Used on [[Special:Interwiki]] so as to explain the data in the {{msg-mw|Interwiki prefix}} column of the table.
+
Do translate both words inside the square brackets as placeholders, where "prefix" should be identical to, or clearly linked to, the column header.',
'interwiki_url' => '{{optional}}
Used on [[Special:Interwiki]] as a column header of the table.
-See also: {{msg-mw|Interwiki-url-label}}',
+See also:
+*{{msg-mw|Interwiki-url-label}}
+{{Identical|URL}}',
'interwiki-url-label' => '{{optional}}
Used on [[Special:Interwiki]] as a field label in a form.
-See also: {{msg-mw|interwiki url}}',
- 'interwiki_url_intro' => 'Used on [[Special:Interwiki]] so as to explain the data in the {{msg-mw|interwiki_url}} column of the table.
+See also:
+* {{msg-mw|interwiki url}}
+{{Identical|URL}}',
+ 'interwiki_url_intro' => 'Used on [[Special:Interwiki]] so as to explain the data in the {{msg-mw|Interwiki url}} column of the table.
-$1 is being rendered verbatim. It refers to the syntax of the values listed in the "prefix" column, and does not mark a substitutable variable of this message.',
+Parameters:
+* $1 is being rendered verbatim. It refers to the syntax of the values listed in the "prefix" column, and does not mark a substitutable variable of this message.',
'interwiki_local' => 'Used on [[Special:Interwiki]] as a column header.
{{Identical|Forward}}',
'interwiki-local-label' => 'Field label for the interwiki property "local", to set if an HTTP request to the local wiki with this interwiki prefix in the URL is redirected to the target URL given in the interwiki link definitions.',
- 'interwiki_local_intro' => 'Used on [[Special:Interwiki]] so as to explain the data in the {{msg-mw|interwiki_local}} column of the table.',
- 'interwiki_local_0_intro' => 'Used on [[Special:Interwiki]] so as to descripe the meaning of the value 0 in the {{msg-mw|interwiki_local}} column of the table.',
- 'interwiki_local_1_intro' => 'Used on [[Special:Interwiki]] so as to descripe the meaning of the value 1 in the {{msg-mw|interwiki_local}} column of the table.',
+ 'interwiki_local_intro' => 'Used on [[Special:Interwiki]] so as to explain the data in the {{msg-mw|Interwiki local}} column of the table.',
+ 'interwiki_local_0_intro' => 'Used on [[Special:Interwiki]] so as to descripe the meaning of the value 0 in the {{msg-mw|Interwiki local}} column of the table.',
+ 'interwiki_local_1_intro' => 'Used on [[Special:Interwiki]] so as to descripe the meaning of the value 1 in the {{msg-mw|Interwiki local}} column of the table.',
'interwiki_trans' => 'Used on [[Special:Interwiki]] as table column header.',
'interwiki-trans-label' => 'Used on [[Special:Interwiki]] as a field label in a form.',
- 'interwiki_trans_intro' => 'Used on [[Special:Interwiki]] so as to explain the data in the {{msg-mw|interwiki_trans}} column of the table.',
- 'interwiki_trans_1_intro' => 'Used on [[Special:Interwiki]] so as to descripe the meaning of the value 1 in the {{msg-mw|interwiki_trans}} column of the table.',
- 'interwiki_trans_0_intro' => 'Used on [[Special:Interwiki]] so as to describe the meaning of the value 0 in the {{msg-mw|interwiki_trans}} column of the table.',
+ 'interwiki_trans_intro' => 'Used on [[Special:Interwiki]] so as to explain the data in the {{msg-mw|Interwiki trans}} column of the table.',
+ 'interwiki_trans_1_intro' => 'Used on [[Special:Interwiki]] so as to descripe the meaning of the value 1 in the {{msg-mw|Interwiki trans}} column of the table.',
+ 'interwiki_trans_0_intro' => 'Used on [[Special:Interwiki]] so as to describe the meaning of the value 0 in the {{msg-mw|Interwiki trans}} column of the table.',
'interwiki_intro_footer' => 'Part of the interwiki extension.
-Shown as last pice of the introductory text on [[Special:Interwiki]].
-Parameter $1 contains the following (a link): [[mw:Manual:Interwiki_table|MediaWiki.org]]',
- 'interwiki_1' => "'''Yes'''-value to be inserted into the columns headed by {{msg-mw|interwiki_local}} and {{msg-mw|interwiki_trans}}.
+Shown as last piece of the introductory text on [[Special:Interwiki]].',
+ 'interwiki_1' => "'''Yes'''-value to be inserted into the columns headed by {{msg-mw|Interwiki local}} and {{msg-mw|Interwiki trans}}.
{{Identical|Yes}}",
- 'interwiki_0' => "'''No'''-value to be inserted into the columns headed by {{msg-mw|interwiki_local}} and {{msg-mw|interwiki_trans}}.
-
+ 'interwiki_0' => "'''No'''-value to be inserted into the columns headed by {{msg-mw|Interwiki local}} and {{msg-mw|Interwiki trans}}.
{{Identical|No}}",
'interwiki_error' => 'This error message is shown when the [[Special:Interwiki]] page is empty.',
'interwiki-cached' => 'Informational message on why interwiki data cannot be manipulated.',
@@ -163,9 +167,16 @@ Parameter $1 contains the following (a link): [[mw:Manual:Interwiki_table|MediaW
{{Identical|Edit}}',
'interwiki_reasonfield' => '{{Identical|Reason}}',
- 'interwiki_delquestion' => 'Parameter $1 is the interwiki prefix you are deleting.',
- 'interwiki_deleting' => '-',
- 'interwiki_deleted' => '',
+ 'interwiki_delquestion' => 'Used as top message.
+
+Followed by the form.
+
+Parameters:
+* $1 - the interwiki prefix you are deleting',
+ 'interwiki_deleting' => 'Used as intro message for the table. Parameters:
+* $1 - the specified prefix',
+ 'interwiki_deleted' => 'Used as success message. Parameters:
+* $1 - interwiki prefix',
'interwiki_delfailed' => 'Error message when removing an interwiki table entry fails. Parameters:
* $1 is an interwiki prefix.',
'interwiki_addtext' => 'Link description to open form to add an interwiki prefix.',
@@ -177,12 +188,17 @@ Parameter $1 contains the following (a link): [[mw:Manual:Interwiki_table|MediaW
* $1 is the added interwiki prefix.',
'interwiki_addfailed' => 'Error message displayed when adding an interwiki prefix fails. Parameters:
* $1 is the interwiki prefix that could not be added.',
- 'interwiki-defaulturl' => '{{notranslate}}',
+ 'interwiki-defaulturl' => '{{notranslate}}
+Used as default value of interwiki URL
+
+Parameters:
+* $1 - seems to be empty',
'interwiki_edittext' => 'Fieldset legend for interwiki prefix edit form.',
'interwiki_editintro' => 'Form information when editing an interwiki prefix.',
'interwiki_edited' => 'Success message after editing an interwiki prefix. Parameters:
* $1 is the added interwiki prefix.',
- 'interwiki_editerror' => 'Error message when modifying a prefix has failed.',
+ 'interwiki_editerror' => 'Error message when modifying a prefix has failed. Parameters:
+* $1 - prefix',
'interwiki-badprefix' => 'Error message displayed when trying to save an interwiki prefix that contains invalid characters. Parameters:
* $1 is the interwiki prefix containing invalid characters.',
'interwiki-submit-empty' => 'Error message displayed when trying to save an interwiki prefix with an empty prefix or an empty URL.',
@@ -294,6 +310,7 @@ $messages['an'] = array(
/** Arabic (العربية)
* @author Meno25
* @author OsamaK
+ * @author زكريا
*/
$messages['ar'] = array(
'interwiki' => 'عرض وتعديل بيانات الإنترويكي',
@@ -321,7 +338,7 @@ $messages['ar'] = array(
'interwiki_1' => 'نعم',
'interwiki_0' => 'لا',
'interwiki_error' => 'خطأ: جدول الإنترويكي Ùارغ، أو حدث خطأ آخر.',
- 'interwiki_edit' => 'تعديل',
+ 'interwiki_edit' => 'عدل',
'interwiki_reasonfield' => 'السبب:',
'interwiki_delquestion' => 'حذ٠"$1"',
'interwiki_deleting' => 'أنت تحذ٠البادئة "$1".',
@@ -416,7 +433,7 @@ $messages['arz'] = array(
'action-interwiki' => 'تغيير مدخلة الإنترويكى هذه',
);
-/** Assamese (অসমীয়া)
+/** Assamese (অসমীয়া)
* @author Bishnu Saikia
*/
$messages['as'] = array(
@@ -711,9 +728,11 @@ $messages['bg'] = array(
);
/** Bengali (বাংলা)
+ * @author Aftab1995
* @author Wikitanvir
*/
$messages['bn'] = array(
+ 'interwiki-title-norights' => 'আনà§à¦¤à¦ƒà¦‰à¦‡à¦•à¦¿ তথà§à¦¯ দেখà§à¦¨',
'interwiki_prefix' => 'উপসরà§à¦—',
'interwiki-prefix-label' => 'উপসরà§à¦—:',
'interwiki_1' => 'হà§à¦¯à¦¾à¦',
@@ -911,8 +930,28 @@ Possiblement no existeix.',
* @author Умар
*/
$messages['ce'] = array(
+ 'interwiki-title-norights' => 'Юкъарвикишан хаамаш хьажар',
+ 'interwiki_intro' => 'ХӀара ду юкъарвикишан таблице хьажар.',
+ 'interwiki-legend-show' => 'Гайта хьехар',
+ 'interwiki-legend-hide' => 'Къайладаккха хьехар',
+ 'interwiki_prefix' => 'ТӀетоьхна Ñлпаш',
+ 'interwiki_prefix_intro' => 'Юкъарвикин дешхьалхе вики-йозана ÑинтакÑиÑехь лело: <code>[<nowiki />[дешхьалхе:<em>агӀона цӀе</em>]]</code>.',
+ 'interwiki_url_intro' => 'URLлан кеп. $1 метта хира ÑŽ <em>агӀона цӀе</em>, Лакхара ÑинтакÑÐ¸Ñ Ð»ÐµÐ»Ð°Ñ‡Ñƒ хенахь гайтина йолу.',
+ 'interwiki_local' => 'ДӀаÑхьажор',
+ 'interwiki-local-label' => 'ДӀаÑхьажор:',
+ 'interwiki_local_intro' => 'HTTP-дехар кхузара википедига юкъарвики-дешхьалхеца URL чохь:',
+ 'interwiki_local_0_intro' => 'магийна Ñц, хаамо блоктуху «агӀо цакарий»',
+ 'interwiki_local_1_intro' => 'дӀаÑхьахьажа йо Ӏалашонан URL, юкъарвики-хьажораш билгал еш Ñзйина йолу (кеч йо локальни агӀона хьажораг Ñана)',
+ 'interwiki_trans' => 'Юкъатохар',
+ 'interwiki-trans-label' => 'Юкъатохар:',
+ 'interwiki_trans_intro' => 'Вики-йозана ÑинтакÑÐ¸Ñ Ð»ÐµÐ»Ð¾Ñˆ елахь <code>{<nowiki />{дешхьалхе:<em>агӀона цӀе</em>}}</code> тайпана:',
+ 'interwiki_trans_1_intro' => 'Кхечу вики чура юкъарвикеш чуÑха йиш хуьлуьйту хӀокху вики чохь магийна делахь.',
+ 'interwiki_trans_0_intro' => 'ТӀетоха магийна дац, кепийн цӀерийн меттигехь агӀо лоху.',
+ 'interwiki_1' => 'ÑŽ',
+ 'interwiki_0' => 'Ñц',
'interwiki_edit' => 'ÐиÑйé',
'interwiki_reasonfield' => 'Бахьан:',
+ 'interwiki_delquestion' => '«$1» дӀаÑккхар',
'interwiki_addbutton' => 'Тlетоха',
);
@@ -996,7 +1035,9 @@ Pravděpodobně neexistuje.',
* @author ОйЛ
*/
$messages['cu'] = array(
- 'interwiki_0' => 'нѣÌÑ‚ÑŠ',
+ 'interwiki_1' => 'да',
+ 'interwiki_0' => 'нѣтъ',
+ 'interwiki_edit' => 'иÑправи',
);
/** Welsh (Cymraeg)
@@ -1046,8 +1087,8 @@ $messages['da'] = array(
'interwiki-legend-hide' => 'Skjul forklaring',
'interwiki_prefix' => 'Præfiks',
'interwiki-prefix-label' => 'Præfiks:',
- 'interwiki_prefix_intro' => 'Interwiki præfiks som skal anvendes i <code>[<nowiki />[præfiks:<em>sidenavn</em>]]</code> wikitext syntaks.',
- 'interwiki_url_intro' => 'Skabelon til URL-adresser. Pladsholderen $1 vil blive erstattet af <em>sidenavn</em> af wikitext, når den ovennævnte wikitext syntaks bruges.',
+ 'interwiki_prefix_intro' => 'Interwiki præfiks som skal anvendes i <code>[<nowiki />[præfiks:<em>sidenavn</em>]]</code> wikitekst syntaks.',
+ 'interwiki_url_intro' => 'Skabelon til URL-adresser. Pladsholderen $1 vil blive erstattet af <em>sidenavn</em> af wikitekst, når den ovennævnte wikitekst syntaks bruges.',
'interwiki_local' => 'Videresend',
'interwiki-local-label' => 'Videresend:',
'interwiki_local_intro' => 'En HTTP-forespørgsel til den lokale wiki med denne interwiki præfiks i URL-adressen er:',
@@ -1055,7 +1096,7 @@ $messages['da'] = array(
'interwiki_local_1_intro' => 'Omdirigeret til target URL i interwiki link definitioner (dvs. behandles som referencer i lokale sider).',
'interwiki_trans' => 'Transkluder',
'interwiki-trans-label' => 'Transkluder:',
- 'interwiki_trans_intro' => 'Hvis wikitext syntaksen <code>[<nowiki />[præfiks:<em>sidenavn</em>]]</code> bruges, så:',
+ 'interwiki_trans_intro' => 'Hvis wikitekst syntaksen <code>[<nowiki />[præfiks:<em>sidenavn</em>]]</code> bruges, så:',
'interwiki_1' => 'ja',
'interwiki_0' => 'nej',
'interwiki_error' => 'Fejl: Interwikitabellen er tom eller noget andet gik galt.',
@@ -1081,12 +1122,13 @@ Husk, at dette kan bryde eksisterende hyperlinks.',
Det findes muligvis ikke.',
'interwiki-badprefix' => 'Det angivne interwikipræfiks "$1" indeholder ugyldige tegn.',
'right-interwiki' => 'Redigere interwikidata',
- 'action-interwiki' => 'ændre dette interwiki-element',
+ 'action-interwiki' => 'redigere interwikidata',
);
/** German (Deutsch)
* @author Als-Holder
* @author Church of emacs
+ * @author Geitost
* @author Kghbln
* @author MF-Warburg
* @author Metalhead64
@@ -1115,7 +1157,7 @@ $messages['de'] = array(
'interwiki_trans_intro' => 'Wenn die Vorlagensyntax <code>{<nowiki />{präfix:<em>Seitenname</em>}}</code> verwendet wird, dann:',
'interwiki_trans_1_intro' => 'erlaube die Einbindung aus dem fremden Wiki, sofern Einbindungen in diesem Wiki allgemein zulässig sind',
'interwiki_trans_0_intro' => 'erlaube die Einbindung nicht, und nimm eine Seite aus dem Vorlagennamensraum des lokalen Wikis',
- 'interwiki_intro_footer' => 'Siehe auch die [//www.mediawiki.org/wiki/Manual:Interwiki_table Dokumentationsseite auf MediaWiki.org] für weitere Informationen zur Interwikitabelle. Das [[Special:Log/interwiki|Logbuch]] protokolliert alle Änderungen an der Interwikitabelle dieses Wikis.',
+ 'interwiki_intro_footer' => 'Weitere Informationen zur Interwikitabelle sind auf der [//www.mediawiki.org/wiki/Manual:Interwiki_table Dokumentationsseite unter MediaWiki.org] zu finden. Das [[Special:Log/interwiki|Logbuch]] protokolliert alle Änderungen an der Interwikitabelle dieses Wikis.',
'interwiki_1' => 'ja',
'interwiki_0' => 'nein',
'interwiki_error' => 'Fehler: Die Interwikitabelle ist leer oder etwas anderes ist schiefgelaufen.',
@@ -1494,10 +1536,22 @@ Võimalik, et seda pole olemas.',
/** Basque (euskara)
* @author An13sa
* @author Kobazulo
+ * @author Theklan
*/
$messages['eu'] = array(
+ 'interwiki' => 'Ikusi eta aldatu interwikiak',
+ 'interwiki-title-norights' => 'Ikusi interwikiak',
+ 'interwiki-desc' => 'Interwiki taula ikusi eta aldatzeko [[Special:Interwiki|orrialde berezi]] bat gehitzen du',
+ 'interwiki_intro' => 'Hau interwiki taularen ikuspegi orokor bat da.',
+ 'interwiki-legend-show' => 'Erakutsi legenda',
+ 'interwiki-legend-hide' => 'Izkutatu legenda',
'interwiki_prefix' => 'Aurrizkia',
'interwiki-prefix-label' => 'Aurrizkia:',
+ 'interwiki_local' => 'Aurrera',
+ 'interwiki-local-label' => 'Aurrera:',
+ 'interwiki_trans' => 'Txertatu',
+ 'interwiki-trans-label' => 'Txertatu:',
+ 'interwiki_trans_intro' => '<code>{<nowiki />{prefix:<em>pagename</em>}}</code> wikitestu erako sintaxia erabiltzen bada, orduan:',
'interwiki_1' => 'bai',
'interwiki_0' => 'ez',
'interwiki_edit' => 'Aldatu',
@@ -1506,6 +1560,8 @@ $messages['eu'] = array(
'interwiki_deleting' => '"$1" aurrizkia ezabatzen ari zara.',
'interwiki_addbutton' => 'Gehitu',
'interwiki_edittext' => 'Interwiki aurrizkia editatzen',
+ 'right-interwiki' => 'Interwiki datuak aldatu',
+ 'action-interwiki' => 'aldatu interwiki sarrera hau',
);
/** Persian (Ùارسی)
@@ -1549,7 +1605,7 @@ $messages['fa'] = array(
'interwiki_edited' => 'پیشوند «$1» با موÙقیت در جدول میان‌ویکی تغییر داده شد.',
'interwiki_editerror' => 'پیشوند «$1» را نمی‌توان در جدول میان‌ویکی تغییر داد.
احتمالاً این پیشوند وجود ندارد.',
- 'interwiki-badprefix' => 'پیشوند میان‌ویکی «$1» حاوی نویسه‌های غیر مجاز است',
+ 'interwiki-badprefix' => 'پیشوند میان‌ویکی «$1» حاوی نویسه‌های نامجاز است',
'interwiki-submit-empty' => 'پیشوند و آدرس URL نمی‌توانند خالی باشند.',
'log-name-interwiki' => 'سیاههٔ جدول میان‌ویکی',
'log-description-interwiki' => 'این یک تاریخچه از تغییرات [[Special:Interwiki|interwiki table]] است.',
@@ -1563,6 +1619,7 @@ $messages['fa'] = array(
* @author Jack Phoenix
* @author Mobe
* @author Nike
+ * @author Stryn
* @author VezonThunder
*/
$messages['fi'] = array(
@@ -1577,7 +1634,7 @@ $messages['fi'] = array(
'interwiki_local' => 'Välitä',
'interwiki-local-label' => 'Välitä:',
'interwiki_trans' => 'Sisällytä',
- 'interwiki-trans-label' => 'Sisällytä:', # Fuzzy
+ 'interwiki-trans-label' => 'Sisällytä:',
'interwiki_1' => 'kyllä',
'interwiki_0' => 'ei',
'interwiki_error' => 'Virhe: Interwiki-taulu on tyhjä tai jokin muu meni pieleen.',
@@ -1703,6 +1760,13 @@ $messages['frp'] = array(
'action-interwiki' => 'changiér ceta entrâ entèrvouiqui',
);
+/** Northern Frisian (Nordfriisk)
+ * @author Murma174
+ */
+$messages['frr'] = array(
+ 'interwiki-title-norights' => 'Interwiki-dooten uunluke',
+);
+
/** Friulian (furlan)
* @author Klenje
*/
@@ -1992,35 +2056,66 @@ $messages['he'] = array(
/** Hindi (हिनà¥à¤¦à¥€)
* @author Karthi.dr
* @author Kaustubh
+ * @author Siddhartha Ghai
*/
$messages['hi'] = array(
- 'interwiki' => 'आंतरविकि डाटा देखें à¤à¤µà¤‚ बदलें',
- 'interwiki-title-norights' => 'आंतरविकि डाटा देखें',
- 'interwiki-desc' => 'आंतरविकि तालिका देखनेके लिये और बदलने के लिये à¤à¤• [[Special:Interwiki|विशेष पॄषà¥à¤ ]]',
- 'interwiki_intro' => 'आंतरविकि तालिका के बारें में अधिक ज़ानकारी के लिये [http://www.mediawiki.org/wiki/Interwiki_table MediaWiki.org] देखें। यहां आंतरविकि तालिका में हà¥à¤ [[Special:Log/interwiki|बदलावों की सूची]] हैं।', # Fuzzy
- 'interwiki_prefix' => 'उपपद',
- 'interwiki-prefix-label' => 'उपपद:', # Fuzzy
+ 'interwiki' => 'अंतरविकि डाटा देखें à¤à¤µà¤‚ बदलें',
+ 'interwiki-title-norights' => 'अंतरविकि डाटा देखें',
+ 'interwiki-desc' => 'अंतरविकि तालिका देखने और बदलने के लिये à¤à¤• [[Special:Interwiki|विशेष पृषà¥à¤ ]] जोड़ता है',
+ 'interwiki_intro' => 'यह अंतरविकि तालिका का मूल विवरण है।',
+ 'interwiki-legend-show' => 'शीरà¥à¤·à¤• विवरण दिखाà¤à¤',
+ 'interwiki-legend-hide' => 'शीरà¥à¤·à¤• विवरण छà¥à¤ªà¤¾à¤à¤',
+ 'interwiki_prefix' => 'उपसरà¥à¤—',
+ 'interwiki-prefix-label' => 'उपसरà¥à¤—:',
+ 'interwiki_prefix_intro' => 'विकिपाठ सिंटेकà¥à¤¸ <code>[<nowiki />[उपसरà¥à¤—:<em>पृषà¥à¤ à¤¨à¤¾à¤®</em>]]में पà¥à¤°à¤¯à¥‹à¤— हेतॠअंतरविकि उपसरà¥à¤—।',
+ 'interwiki_url' => 'यू॰आर॰à¤à¤²',
+ 'interwiki-url-label' => 'यू॰आर॰à¤à¤²:',
+ 'interwiki_url_intro' => 'यू॰आर॰à¤à¤² साà¤à¤šà¤¾à¥¤ जब उपरोकà¥à¤¤ विकिपाठ सिंटेकà¥à¤¸ का पà¥à¤°à¤¯à¥‹à¤— किया जाठतो $1 की जगह विकिपाठ में पà¥à¤°à¤¯à¥à¤•à¥à¤¤ <em>पृषà¥à¤ à¤¨à¤¾à¤®</em> लगा दिया जाà¤à¤—ा।',
+ 'interwiki_local' => 'आगे भेजा जाता है',
+ 'interwiki-local-label' => 'आगे भेजा जाता है:',
+ 'interwiki_local_intro' => 'सà¥à¤¥à¤¾à¤¨à¥€à¤¯ विकि में इस अंतरविकि उपसरà¥à¤— का पà¥à¤°à¤¯à¥‹à¤— कर रहे यू॰आर॰à¤à¤² को:',
+ 'interwiki_local_0_intro' => 'आगे नहीं भेजा जाता, सामानà¥à¤¯à¤¤à¤ƒ "पृषà¥à¤  नहीं मिला" तà¥à¤°à¥à¤Ÿà¤¿ आती है',
+ 'interwiki_local_1_intro' => 'अंतरविकि तालिका अनà¥à¤¸à¤¾à¤° यू॰आर॰à¤à¤² पर आगे भेज दिया जाता है (अरà¥à¤¥à¤¾à¤¤ सामानà¥à¤¯ विकि कड़ियों की तरह माना जाता है)।',
+ 'interwiki_trans' => 'टà¥à¤°à¤¾à¤‚सकà¥à¤²à¥‚ड',
+ 'interwiki-trans-label' => 'टà¥à¤°à¤¾à¤‚सकà¥à¤²à¥‚ड:',
+ 'interwiki_trans_intro' => 'अगर <code>{<nowiki />{उपसरà¥à¤—:<em>पृषà¥à¤ à¤¨à¤¾à¤®</em>}}</code> पà¥à¤°à¤•à¤¾à¤° के सिंटेकà¥à¤¸ का पà¥à¤°à¤¯à¥‹à¤— किया जाठतो:',
+ 'interwiki_trans_1_intro' => 'बाहरी विकि से टà¥à¤°à¤¾à¤‚सकà¥à¤²à¥‚ज़न करने दिया जाà¤à¤—ा, यदि इस विकि में सामानà¥à¤¯à¤¤à¤ƒ अंतरविकि टà¥à¤°à¤¾à¤‚सकà¥à¤²à¥‚ज़न समरà¥à¤¥à¤¿à¤¤ हैं।',
+ 'interwiki_trans_0_intro' => 'टà¥à¤°à¤¾à¤‚सकà¥à¤²à¥‚ज़न नहीं करने दिया जाà¤à¤—ा, बलà¥à¤•à¤¿ उस नाम के साà¤à¤šà¥‡ को ढूà¤à¤¢à¤¾ जाà¤à¤—ा।',
+ 'interwiki_intro_footer' => 'अंतरविकि तालिका के बारे में अधिक जानकारी हेतॠ[//www.mediawiki.org/wiki/Manual:Interwiki_table MediaWiki.org] देखें।
+अंतरविकि तालिका में हà¥à¤ [[Special:Log/interwiki|बदलावों का लॉग]] उपलबà¥à¤§ है।',
'interwiki_1' => 'हाà¤',
'interwiki_0' => 'नहीं',
- 'interwiki_error' => 'गलती: आंतरविकि तालिका खाली हैं, या और कà¥à¤› गलत हैं।',
+ 'interwiki_error' => 'तà¥à¤°à¥à¤Ÿà¤¿: आंतरविकि तालिका खाली है, या और कोई गड़बड़ी हà¥à¤ˆ है।',
+ 'interwiki-cached' => 'अंतरविकि डाटा कैश मेमोरी में सहेजा हà¥à¤† है। कैश मेमोरी में बदलाव करना संभव नहीं है।',
'interwiki_edit' => 'समà¥à¤ªà¤¾à¤¦à¤¨',
'interwiki_reasonfield' => 'कारण:',
- 'interwiki_delquestion' => '$1 को हटा रहें हैं',
- 'interwiki_deleting' => 'आप "$1" उपपद हटा रहें हैं।',
- 'interwiki_deleted' => '"$1" उपपद आंतरविकि तालिकासे हटा दिया गया हैं।',
- 'interwiki_delfailed' => '"$1" उपपद आंतरविकि तालिकासे हटा नहीं पा रहें हैं।',
- 'interwiki_addtext' => 'à¤à¤• आंतरविकि उपपद दें',
- 'interwiki_addintro' => 'आप à¤à¤• नया आंतरविकि उपपद बढा रहें हैं। कृपया धà¥à¤¯à¤¾à¤¨ रहें की इसमें सà¥à¤ªà¥‡à¤¸ ( ), विसरà¥à¤— (:), और (&), या बराबर का चिनà¥à¤¹ (=) नहीम दे सकतें हैं।',
- 'interwiki_addbutton' => 'बढायें',
- 'interwiki_added' => '$1" उपपद आंतरविकि तालिका में बढाया गया हैं।',
- 'interwiki_addfailed' => '"$1" उपपद आंतरविकि तालिका में बढा नहीं पायें।
-शायद वह पहले से असà¥à¤¤à¤¿à¤¤à¥à¤µà¤®à¥‡à¤‚ हैं।',
- 'interwiki_edittext' => 'à¤à¤• आंतरविकि उपपद बदल रहें हैं',
- 'interwiki_editintro' => 'आप à¤à¤• आंतरविकि उपपद बदल रहें हैं। धà¥à¤¯à¤¾à¤¨ रखें ये पहले दी हà¥à¤ˆ कड़ीयों को तोड सकता हैं।',
- 'interwiki_edited' => '"$1" उपपद आंतरविकि तालिका में बदला गया।',
- 'interwiki_editerror' => '"$1" उपपद आंतरविकि तालिका में बदल नहीं पायें। शायद वह असà¥à¤¤à¤¿à¤¤à¥à¤µà¤®à¥‡à¤‚ नहीं हैं।',
- 'log-name-interwiki' => 'आंतरविकि तालिका सूची',
- 'log-description-interwiki' => '[[Special:Interwiki|आंतरविकि तालिकामें]] हà¥à¤ बदलावोंकी यह सूची है।',
+ 'interwiki_delquestion' => '$1 को हटा रहे हैं',
+ 'interwiki_deleting' => 'आप "$1" उपसरà¥à¤— हटा रहे हैं।',
+ 'interwiki_deleted' => '"$1" उपसरà¥à¤— अंतरविकि तालिका से हटा दिया गया है।',
+ 'interwiki_delfailed' => '"$1" उपसरà¥à¤— अंतरविकि तालिका से हटाया नहीं जा सका।',
+ 'interwiki_addtext' => 'अंतरविकि उपसरà¥à¤— जोड़ें',
+ 'interwiki_addintro' => 'आप à¤à¤• नया आंतरविकि उपसरà¥à¤— जोड़ रहे हैं।
+कृपया धà¥à¤¯à¤¾à¤¨ रखें कि इसमें सà¥à¤ªà¥‡à¤¸ ( ), कोलन (:), à¤à¤®à¥à¤ªà¤°à¤¸à¥‡à¤‚ड (&), या बराबर का चिनà¥à¤¹ (=) नहीं हो सकते हैं।',
+ 'interwiki_addbutton' => 'जोड़ें',
+ 'interwiki_added' => '"$1" उपसरà¥à¤— अंतरविकि तालिका में जोड़ दिया गया है।',
+ 'interwiki_addfailed' => '"$1" उपसरà¥à¤— अंतरविकि तालिका में जोड़ा नहीं जा सका।
+संभवतः वह पहले से अंतरविकि तालिका में मौजूद है।',
+ 'interwiki_edittext' => 'अंतरविकि उपसरà¥à¤— बदल रहे हैं',
+ 'interwiki_editintro' => 'आप à¤à¤• अंतरविकि उपसरà¥à¤— बदल रहे हैं।
+धà¥à¤¯à¤¾à¤¨ रखें ये पहले से पà¥à¤°à¤¯à¥à¤•à¥à¤¤ कड़ियों को तोड़ सकता है।',
+ 'interwiki_edited' => 'अंतरविकि तालिका में "$1" उपसरà¥à¤— बदला गया।',
+ 'interwiki_editerror' => 'आंतरविकि तालिका में "$1" उपसरà¥à¤— बदला नहीं जा सका।
+शायद वह मौजूद नहीं है।',
+ 'interwiki-badprefix' => 'निरà¥à¤¦à¤¿à¤·à¥à¤Ÿ अंतरविकि उपसरà¥à¤— "$1" में अमानà¥à¤¯ कैरेकà¥à¤Ÿà¤° हैं',
+ 'interwiki-submit-empty' => 'उपसरà¥à¤— और यू॰आर॰à¤à¤² रिकà¥à¤¤ नहीं छोड़े जा सकते।',
+ 'interwiki-submit-invalidurl' => 'यू॰आर॰à¤à¤² का पà¥à¤°à¥‹à¤Ÿà¥‹à¤•à¥‰à¤² अमानà¥à¤¯ है।',
+ 'log-name-interwiki' => 'अंतरविकि तालिका लॉग',
+ 'logentry-interwiki-iw_add' => '$1 ने अंतरविकि तालिका में उपसरà¥à¤— "$4" ($5) (trans: $6; local: $7) {{GENDER:$2|जोड़ा}}',
+ 'logentry-interwiki-iw_edit' => '$1 ने अंतरविकि तालिका में उपसरà¥à¤— "$4" ($5) (trans: $6; local: $7) {{GENDER:$2|बदला}}',
+ 'logentry-interwiki-iw_delete' => '$1 ने अंतरविकि तालिका से उपसरà¥à¤— "$4" {{GENDER:$2|हटाया}}',
+ 'log-description-interwiki' => 'यह [[Special:Interwiki|अंतरविकि तालिका]] में हà¥à¤ बदलावों का लॉग है।',
+ 'right-interwiki' => 'अंतरविकि डाटा समà¥à¤ªà¤¾à¤¦à¤¿à¤¤ करें',
+ 'action-interwiki' => 'इस अंतरविकि पà¥à¤°à¤µà¤¿à¤·à¥à¤Ÿà¤¿ को बदलने',
);
/** Hiligaynon (Ilonggo)
@@ -2290,6 +2385,7 @@ Memora que isto pote rumper ligamines existente.',
Es possibile que illo non existe.',
'interwiki-badprefix' => 'Le prefixo interwiki specificate "$1" contine characteres invalide',
'interwiki-submit-empty' => 'Le prefixo e le URL non pote esser vacue.',
+ 'interwiki-submit-invalidurl' => 'Le protocollo del URL es invalide.',
'log-name-interwiki' => 'Registro del tabella interwiki',
'logentry-interwiki-iw_add' => '$1 {{GENDER:$2|addeva}} le prefixo "$4" ($5) (trans: $6; local: $7) al tabella interwiki',
'logentry-interwiki-iw_edit' => '$1 {{GENDER:$2|modificava}} le prefixo "$4" ($5) (trans: $6; local: $7) in le tabella interwiki',
@@ -2598,6 +2694,46 @@ $messages['ka'] = array(
'action-interwiki' => 'ინტერვიკის ჩáƒáƒœáƒáƒ¬áƒ”რების შეცვლáƒ',
);
+/** Kazakh (Cyrillic script) (қазақша (кирил)‎)
+ * @author Arystanbek
+ */
+$messages['kk-cyrl'] = array(
+ 'interwiki' => 'интеруики деректерін қарау және өңдеу',
+ 'interwiki-title-norights' => 'Интеруики дерегін қарау',
+ 'interwiki_intro' => 'Бұл интеруики кеÑтеÑін шолып шығу',
+ 'interwiki-legend-show' => 'Мәндік белгілерді көрÑету',
+ 'interwiki-legend-hide' => 'Мәндік белгілерді жаÑыру',
+ 'interwiki_prefix' => 'ПрефикÑ',
+ 'interwiki-prefix-label' => 'ПрефикÑ',
+ 'interwiki_local' => 'Ðлға',
+ 'interwiki-local-label' => 'Ðлға',
+ 'interwiki_1' => 'иә',
+ 'interwiki_0' => 'жоқ',
+ 'interwiki_edit' => 'Өңдеу',
+ 'interwiki_reasonfield' => 'Себебі:',
+ 'interwiki_delquestion' => '"$1" жойылуда',
+ 'interwiki_deleting' => '"$1" префикÑін жоюдаÑыз.',
+ 'interwiki_deleted' => '"$1" префикÑÑ– интеруики кеÑтеÑінен Ñәтті алынып таÑталды.',
+ 'interwiki_delfailed' => '"$1" префикÑÑ– интеруики кеÑтеÑінен алынып таÑталмады',
+ 'interwiki_addtext' => 'Интеруики префикÑін қоÑу',
+ 'interwiki_addbutton' => 'ҚоÑу',
+ 'interwiki_added' => '"$1" префикÑÑ– интеруики кеÑтеÑіне Ñәтті қоÑылды.',
+ 'interwiki_addfailed' => '"$1" префикÑÑ– интеруики кеÑтеÑіне қоÑылмады.
+Мүмкін әлдеқашан интеруики кеÑтеÑінде қолданылған болар.',
+ 'interwiki_edittext' => 'Интеруики префикÑÑ– өңделуде',
+ 'interwiki_editintro' => 'Интеруики префикÑін өңдеудеÑіз.
+ЕÑіңізде болÑын бұл бұрыннан бар Ñілтемелерді бұза алады.',
+ 'interwiki_edited' => '"$1" префикÑÑ– интеруики кеÑтеÑінде Ñәтті өзгертілді.',
+ 'interwiki_editerror' => '"$1" префикÑÑ– интеруики кеÑтеÑінде өзгеру мүмкін болмады.
+Мүмкін бұл бар болмаған шығар.',
+ 'log-name-interwiki' => 'Интеруики кеÑте журналы',
+ 'logentry-interwiki-iw_add' => '$1 {{GENDER:$2|added}} "$4" префикÑÑ– интеруики кеÑтеÑіне ($5) (trans: $6; local: $7)',
+ 'logentry-interwiki-iw_edit' => '$1 {{GENDER:$2|modified}} "$4" ($5) интеруики кеÑтеÑіне (trans: $6; local: $7)',
+ 'logentry-interwiki-iw_delete' => 'Интеруики кеÑтеÑінен "$4" префикÑÑ– $1 {{GENDER:$2|removed}}',
+ 'right-interwiki' => 'Интеруики деректерін өңдеу',
+ 'action-interwiki' => 'бұл интеруики ендірілуін өзгерту',
+);
+
/** Khmer (ភាសាážáŸ’មែរ)
* @author Chhorran
* @author Lovekhmer
@@ -2695,7 +2831,7 @@ $messages['ko'] = array(
'interwiki_delquestion' => '"$1" 지우기',
'interwiki_deleting' => '"$1" ì ‘ë‘어를 지ì›ë‹ˆë‹¤.',
'interwiki_deleted' => '"$1" ì ‘ë‘어를 ì¸í„°ìœ„키 í…Œì´ë¸”ì—ì„œ 지웠습니다.',
- 'interwiki_delfailed' => '"$1" ì ‘ë‘어를 ì¸í„°ìœ„키 í…Œì´ë¸”ì—ì„œ 지울 수 없습니다.',
+ 'interwiki_delfailed' => '"$1" ì ‘ë‘어를 ì¸í„°ìœ„키 í…Œì´ë¸”ì—ì„œ 제거할 수 없습니다.',
'interwiki_addtext' => 'ì¸í„°ìœ„키 ì ‘ë‘ì–´ 추가',
'interwiki_addintro' => '새 ì¸í„°ìœ„키 ì ‘ë‘어를 만듭니다. 공백( ), ìŒì (:), &기호(&), 등호(=)는 í¬í•¨í•  수 없습니다.',
'interwiki_addbutton' => '추가',
@@ -2715,7 +2851,7 @@ $messages['ko'] = array(
'logentry-interwiki-iw_add' => '$1 사용ìžê°€ "$4" ($5) (í‹€ í¬í•¨: $6, 로컬: $7) ì ‘ë‘어를 ì¸í„°ìœ„키 í…Œì´ë¸”ì— {{GENDER:$2|추가}}했습니다.',
'logentry-interwiki-iw_edit' => '$1 사용ìžê°€ ì¸í„°ìœ„키 í…Œì´ë¸”ì˜ "$4" ($5) (í‹€ í¬í•¨: $6, 로컬: $7) ì ‘ë‘어를 {{GENDER:$2|수정}}했습니다.',
'logentry-interwiki-iw_delete' => '$1 사용ìžê°€ ì¸í„°ìœ„키 í…Œì´ë¸”ì˜ "$4" ì ‘ë‘어를 {{GENDER:$2|ì‚­ì œ}}했습니다.',
- 'log-description-interwiki' => '[[Special:Interwiki|ì¸í„°ìœ„키]] 목ë¡ì˜ ë°”ë€ ë‚´ì—­ìž…ë‹ˆë‹¤.',
+ 'log-description-interwiki' => '[[Special:Interwiki|ì¸í„°ìœ„키 í…Œì´ë¸”]]ì´ ë°”ë€ ê¸°ë¡ìž…니다.',
'right-interwiki' => 'ì¸í„°ìœ„키 ëª©ë¡ ê³ ì¹˜ê¸°',
'action-interwiki' => 'ì´ ì¸í„°ìœ„키 ì ‘ë‘ì–´ 바꾸기',
);
@@ -2829,12 +2965,13 @@ Fortasse nondum est in tabula intervica.',
* @author Les Meloures
* @author Purodha
* @author Robby
+ * @author Soued031
*/
$messages['lb'] = array(
'interwiki' => 'Interwiki-Date kucken a veränneren',
'interwiki-title-norights' => 'Interwiki-Date kucken',
'interwiki-desc' => "Setzt eng [[Special:Interwiki|Spezialsäit]] derbäi fir d'Interwiki-Tabell ze gesinn an z'änneren",
- 'interwiki_intro' => "Dëst ass en Iwwerbléck iwwert d'Interwiki-Tabell.",
+ 'interwiki_intro' => "Dëst ass en Iwwerbléck iwwer d'Interwikitabell.",
'interwiki-legend-show' => 'Legend weisen',
'interwiki-legend-hide' => 'Legend verstoppen',
'interwiki_prefix' => 'Prefix',
@@ -2872,7 +3009,7 @@ Denkt drunn datt keng Espacen ( ), Et-commerciale (&), Gläichzeechen (=) a keng
Méiglecherweis gëtt et e schn an der Interwiki-Tabell.',
'interwiki_edittext' => 'En interwiki Prefix änneren',
'interwiki_editintro' => 'Dir ännert en Interwiki Prefix.
-Denkt drun, datt dat kann dozou féieren datt Linken déi et scho gëtt net méi fonctionnéieren.',
+Denkt drun, datt dat kann dozou féieren datt Linken déi et scho gëtt net méi funktionéieren.',
'interwiki_edited' => 'De Prefix "$1" gouf an der Interwiki-Tabell geännert.',
'interwiki_editerror' => 'De Prefix "$1" kann an der Interwiki-Tabell net geännert ginn.
Méiglecherweis gëtt et en net.',
@@ -3125,6 +3262,7 @@ $messages['ml'] = array(
മികàµà´•à´µà´¾à´±àµà´‚ അതൠനിലവിലàµà´£àµà´Ÿà´¾à´•à´¿à´²àµà´².',
'interwiki-badprefix' => 'നൽകിയ à´…à´¨àµà´¤àµ¼à´µà´¿à´•àµà´•à´¿ പൂർവàµà´µà´¾à´•àµà´·à´°à´™àµà´™àµ¾ "$1" അസാധàµà´µà´¾à´¯ à´…à´•àµà´·à´°à´™àµà´™àµ¾ ഉൾകàµà´•àµŠà´³àµà´³àµà´¨àµà´¨àµ',
'interwiki-submit-empty' => 'പൂർവàµà´µà´¾à´•àµà´·à´°à´™àµà´™à´³àµà´‚ യൂ.ആർ.à´Žà´²àµà´‚. ശൂനàµà´¯à´®à´¾à´¯à´¿à´°à´¿à´•àµà´•à´¾àµ» പാടിലàµà´².',
+ 'interwiki-submit-invalidurl' => 'à´šà´Ÿàµà´Ÿà´‚ സംബനàµà´§à´¿à´šàµà´š à´¯àµ.ആർ.എൽ. അസാധàµà´µà´¾à´£àµ.',
'log-name-interwiki' => 'à´…à´¨àµà´¤àµ¼à´µà´¿à´•àµà´•à´¿ പടàµà´Ÿà´¿à´•à´¯àµà´Ÿàµ† രേഖ',
'logentry-interwiki-iw_add' => 'à´…à´¨àµà´¤àµ¼à´µà´¿à´•àµà´•à´¿ പടàµà´Ÿà´¿à´•à´¯à´¿àµ½ നിനàµà´¨àµà´‚ "$4" ($5) (ഉൾപàµà´ªàµ†à´Ÿàµà´¤àµà´¤àµ½: $6; à´ªàµà´°à´¾à´¦àµ‡à´¶à´¿à´•à´‚: $7) à´Žà´¨àµà´¨ പൂർവàµà´µà´¾à´•àµà´·à´°à´™àµà´™àµ¾ $1 {{GENDER:$2|കൂടàµà´Ÿà´¿à´šàµà´šàµ‡àµ¼à´¤àµà´¤àµ}}',
'logentry-interwiki-iw_edit' => 'à´…à´¨àµà´¤àµ¼à´µà´¿à´•àµà´•à´¿ പടàµà´Ÿà´¿à´•à´¯à´¿àµ½ നിനàµà´¨àµà´‚ "$4" ($5) (ഉൾപàµà´ªàµ†à´Ÿàµà´¤àµà´¤àµ½: $6; à´ªàµà´°à´¾à´¦àµ‡à´¶à´¿à´•à´‚: $7) à´Žà´¨àµà´¨ പൂർവàµà´µà´¾à´•àµà´·à´°à´™àµà´™àµ¾ $1 {{GENDER:$2|à´ªàµà´¤àµà´•àµà´•à´¿}}',
@@ -3146,11 +3284,12 @@ $messages['mn'] = array(
/** Marathi (मराठी)
* @author Kaustubh
+ * @author V.narsikar
*/
$messages['mr'] = array(
'interwiki' => 'आंतरविकि डाटा पहा व संपादा',
'interwiki-title-norights' => 'अंतरविकि डाटा पहा',
- 'interwiki-desc' => 'आंतरविकि सारणी पाहणà¥à¤¯à¤¾à¤¸à¤¾à¤ à¥€ व संपादनà¥à¤¯à¤¾à¤¸à¤¾à¤ à¥€ à¤à¤• [[Special:Interwiki|विशेष पान]] वाढविते',
+ 'interwiki-desc' => 'आंतरविकि सारणी पाहणà¥à¤¯à¤¾à¤¸à¤¾à¤ à¥€ व संपादणà¥à¤¯à¤¾à¤¸à¤¾à¤ à¥€ à¤à¤• [[Special:Interwiki|विशेष पान]] वाढविते',
'interwiki_intro' => 'आंतरविकि सारणी बदà¥à¤¦à¤² अधिक माहीतीसाठी [http://www.mediawiki.org/wiki/Interwiki_table MediaWiki.org] पहा.', # Fuzzy
'interwiki_prefix' => 'उपपद (पूरà¥à¤µà¤ªà¥à¤°à¤¤à¥à¤¯à¤¯)',
'interwiki-prefix-label' => 'उपपद (पूरà¥à¤µà¤ªà¥à¤°à¤¤à¥à¤¯à¤¯):', # Fuzzy
@@ -3165,11 +3304,11 @@ $messages['mr'] = array(
'interwiki_addbutton' => 'वाढवा',
'interwiki_added' => '"$1" उपपद आंतरविकि सारणी मधà¥à¤¯à¥‡ वाढविणà¥à¤¯à¤¾à¤¤ आलेले आहे.',
'interwiki_addfailed' => '"$1" उपपद आंतरविकि सारणी मधà¥à¤¯à¥‡ वाढवू शकलेलो नाही. कदाचित ते अगोदरच असà¥à¤¤à¤¿à¤¤à¥à¤µà¤¾à¤¤ असणà¥à¤¯à¤¾à¤šà¥€ शकà¥à¤¯à¤¤à¤¾ आहे.',
- 'interwiki_edittext' => 'à¤à¤• अंतरविकि उपपद संपादित आहे',
- 'interwiki_editintro' => 'तà¥à¤®à¥à¤¹à¥€ à¤à¤• अंतरविकि उपपद संपादित आहात.
+ 'interwiki_edittext' => 'à¤à¤• आंतरविकि उपपद संपादित आहे',
+ 'interwiki_editintro' => 'तà¥à¤®à¥à¤¹à¥€ à¤à¤• आंतरविकि उपपद संपादित आहात.
लकà¥à¤·à¤¾à¤¤ ठेवा की यामà¥à¤³à¥‡ अगोदर दिलेले दà¥à¤µà¥‡ तà¥à¤Ÿà¥‚ शकतात.',
- 'interwiki_edited' => 'अंतरविकि सारणीमधà¥à¤¯à¥‡ "$1" उपपद यशसà¥à¤µà¥€à¤°à¤¿à¤¤à¥à¤¯à¤¾ बदलणà¥à¤¯à¤¾à¤¤ आलेले आहे.',
- 'interwiki_editerror' => 'अंतरविकि सारणीमधà¥à¤¯à¥‡ "$1" उपपद बदलू शकत नाही.
+ 'interwiki_edited' => 'आंतरविकि सारणीमधà¥à¤¯à¥‡ "$1" उपपद यशसà¥à¤µà¥€à¤°à¤¿à¤¤à¥à¤¯à¤¾ बदलणà¥à¤¯à¤¾à¤¤ आलेले आहे.',
+ 'interwiki_editerror' => 'आंतरविकि सारणीमधà¥à¤¯à¥‡ "$1" उपपद बदलू शकत नाही.
कदाचित ते असà¥à¤¤à¤¿à¤¤à¥à¤µà¤¾à¤¤ नसेल.',
'log-name-interwiki' => 'आंतरविकि सारणी नोंद',
'log-description-interwiki' => '[[Special:Interwiki|आंतरविकि सारणीत]] à¤à¤¾à¤²à¥‡à¤²à¥à¤¯à¤¾ बदलांची ही सूची आहे.',
@@ -3284,7 +3423,7 @@ $messages['nah'] = array(
'interwiki_addbutton' => 'Ticcētilīz',
);
-/** Norwegian Bokmål (norsk (bokmål)‎)
+/** Norwegian Bokmål (norsk bokmål)
* @author Event
* @author Nghtwlkr
* @author Purodha
@@ -3367,10 +3506,23 @@ $messages['nds'] = array(
'action-interwiki' => 'dissen Indrag in de Interwiki-Tabell ännern',
);
-/** Nedersaksies (Nedersaksies)
+/** Low Saxon (Netherlands) (Nedersaksies)
* @author Servien
*/
$messages['nds-nl'] = array(
+ 'interwiki' => 'Interwikigegevens bekieken en wiezigen',
+ 'interwiki-title-norights' => 'Interwikigegevens bekieken',
+ 'interwiki-legend-show' => 'Legenda laoten zien',
+ 'interwiki-legend-hide' => 'Legenda verbargen',
+ 'interwiki_prefix' => 'Veurvoegsel',
+ 'interwiki-prefix-label' => 'Veurvoegsel:',
+ 'interwiki_local' => 'Veuruut',
+ 'interwiki-local-label' => 'Veuruut:',
+ 'interwiki_trans' => 'Transkluderen',
+ 'interwiki-trans-label' => 'Transkluderen:',
+ 'interwiki_edit' => 'Bewarken',
+ 'interwiki_delquestion' => '"$1" vortdoon',
+ 'interwiki_deleting' => 'Je bin veurvoegsel "$1" an t vortdoon.',
'interwiki_addbutton' => 'Derbie doon',
);
@@ -3452,7 +3604,7 @@ Let op dat dit geen spaties ( ), dubbele punt (:), ampersands (&), of gelijkteke
'interwiki_editintro' => 'Je bent een interwikivoorvoegsel aan het bewerken. Let op dat dit bestaande koppelingen kan breken.',
);
-/** Norwegian Nynorsk (norsk (nynorsk)‎)
+/** Norwegian Nynorsk (norsk nynorsk)
* @author Eirik
* @author Gunnernett
* @author Harald Khan
@@ -3583,7 +3735,7 @@ Benlèu i existís ja.',
'action-interwiki' => 'modificar aquesta entrada interwiki',
);
-/** Oriya (ଓଡ଼ିଆ)
+/** Oriya (ଓଡ଼ିଆ)
* @author Ansumang
* @author Jnanaranjan Sahu
* @author Psubhashish
@@ -3805,13 +3957,14 @@ $messages['ps'] = array(
'interwiki_0' => 'نه',
'interwiki_edit' => 'سمول',
'interwiki_reasonfield' => 'سبب:',
- 'interwiki_delquestion' => '"$1" د ړنګولو په حال Ú©Û Ø¯ÛŒ...',
+ 'interwiki_delquestion' => '"$1" د ړنگولو په حال Ú©Û Ø¯ÛŒ...',
'interwiki_deleting' => 'ØªØ§Ø³Û Ø¯ "$1" مختاړی Ú“Ù†Ú«ÙˆÛŒ.',
- 'interwiki_addbutton' => 'ورګډول',
+ 'interwiki_addbutton' => 'ورگډول',
);
/** Portuguese (português)
* @author Alchimista
+ * @author Cainamarques
* @author Hamilton Abreu
* @author Malafaya
* @author Waldir
@@ -3843,7 +3996,7 @@ Existe um [[Special:Log/interwiki|registo de modificações]] à tabela de inter
'interwiki_1' => 'sim',
'interwiki_0' => 'não',
'interwiki_error' => 'ERRO: A tabela de interwikis está vazia, ou alguma outra coisa não correu bem.',
- 'interwiki-cached' => 'Os dados de interwikis são armazenados na cache. Não é possível modificar a cache.',
+ 'interwiki-cached' => 'Os dados de interwikis são armazenados no cache. Não é possível modificar o cache.',
'interwiki_edit' => 'Editar',
'interwiki_reasonfield' => 'Motivo:',
'interwiki_delquestion' => 'A apagar "$1"',
@@ -3872,8 +4025,10 @@ Lembre-se que este não pode conter espaços ( ), dois-pontos (:), conjunções
);
/** Brazilian Portuguese (português do Brasil)
+ * @author Cainamarques
* @author Eduardo.mps
* @author Giro720
+ * @author Luckas
* @author Luckas Blade
* @author 555
*/
@@ -3882,6 +4037,8 @@ $messages['pt-br'] = array(
'interwiki-title-norights' => 'Ver dados interwiki',
'interwiki-desc' => 'Adiciona uma [[Special:Interwiki|página especial]] para visualizar e editar a tabela de interwikis',
'interwiki_intro' => 'Esta é uma visão geral da tabela de interwikis.',
+ 'interwiki-legend-show' => 'Exibir legenda',
+ 'interwiki-legend-hide' => 'Ocultar legenda',
'interwiki_prefix' => 'Prefixo',
'interwiki-prefix-label' => 'Prefixo:',
'interwiki_prefix_intro' => 'Prefixo de interwiki a ser usado na sintaxe de wikitexto <code>[<nowiki />[prefix:<em>nome_página</em>]]</code>.',
@@ -3901,6 +4058,7 @@ Existe um [[Special:Log/interwiki|registro de modificações]] à tabela de inte
'interwiki_1' => 'sim',
'interwiki_0' => 'não',
'interwiki_error' => 'ERRO: A tabela de interwikis está vazia, ou alguma outra coisa não correu bem.',
+ 'interwiki-cached' => 'Os dados dos interwikis são armazenados no cache. Não é possível modificar o cache.',
'interwiki_edit' => 'Editar',
'interwiki_reasonfield' => 'Motivo:',
'interwiki_delquestion' => 'Apagando "$1"',
@@ -3917,7 +4075,12 @@ Existe um [[Special:Log/interwiki|registro de modificações]] à tabela de inte
'interwiki_edited' => 'O prefixo "$1" foi modificado na tabela de interwikis com sucesso.',
'interwiki_editerror' => 'O prefixo "$1" não pode ser modificado na tabela de interwikis. Possivelmente, não existe.',
'interwiki-badprefix' => 'O prefixo interwiki "$1" contém caracteres inválidos',
+ 'interwiki-submit-empty' => 'O prefixo e o URL não podem estar vazios.',
+ 'interwiki-submit-invalidurl' => 'O protocolo do URL é inválido.',
'log-name-interwiki' => 'Registro da tabela de interwikis',
+ 'logentry-interwiki-iw_add' => '$1 {{GENDER:$2|adicionou}} o prefixo "$4" ($5) (trans: $6; local: $7) à tabela de interwikis',
+ 'logentry-interwiki-iw_edit' => '$1 {{GENDER:$2|modificou}} o prefixo "$4" ($5) (trans: $6; local: $7) na tabela de interwikis',
+ 'logentry-interwiki-iw_delete' => '$1 {{GENDER:$2|removeu}} o prefixo "$4" da tabela de interwikis',
'log-description-interwiki' => 'Este é um registro das alterações à [[Special:Interwiki|tabela de interwikis]].',
'right-interwiki' => 'Editar dados de interwiki',
'action-interwiki' => 'alterar esta entrada interwiki',
@@ -3960,6 +4123,10 @@ $messages['ro'] = array(
* @author Joetaras
*/
$messages['roa-tara'] = array(
+ 'interwiki' => "'Ndruche e cange le date de le inderuicchi",
+ 'interwiki-title-norights' => "'Ndruche le date de inderuicchi",
+ 'interwiki-desc' => "Aggiunge 'na [[Special:Interwiki|pàgena speciale]] pe 'ndrucà e cangià 'a tabbelle de inderuicchi",
+ 'interwiki_intro' => "Queste jè 'na panorameche d'a tabbelle de inderuicchi.",
'interwiki-legend-show' => "Fà vedè 'a leggende",
'interwiki-legend-hide' => "Scunne 'a leggende",
'interwiki_prefix' => 'Prefisse',
@@ -3975,6 +4142,8 @@ $messages['roa-tara'] = array(
'interwiki_deleting' => 'Tu ste scangille \'u prefisse "$1".',
'interwiki_addtext' => "Aggiunge 'nu prefisse inderuicchi",
'interwiki_addbutton' => 'Aggiunge',
+ 'right-interwiki' => 'Cange le date de inderuicchi',
+ 'action-interwiki' => 'cange sta vôsce de inderuicchi',
);
/** Russian (руÑÑкий)
@@ -3985,6 +4154,7 @@ $messages['roa-tara'] = array(
* @author KPu3uC B Poccuu
* @author Kaganer
* @author Lockal
+ * @author Putnik
* @author ÐлекÑандр Сигачёв
*/
$messages['ru'] = array(
@@ -4031,6 +4201,7 @@ $messages['ru'] = array(
'interwiki_editerror' => 'ÐŸÑ€ÐµÑ„Ð¸ÐºÑ Â«$1» не может быть изменён в таблице интервики. Возможно, его там не ÑущеÑтвует.',
'interwiki-badprefix' => 'Указанный Ð¿Ñ€ÐµÑ„Ð¸ÐºÑ Ð¸Ð½Ñ‚ÐµÑ€Ð²Ð¸ÐºÐ¸ «$1» Ñодержит недопуÑтимые Ñимволы',
'interwiki-submit-empty' => 'ÐŸÑ€ÐµÑ„Ð¸ÐºÑ Ð¸ URL не могут быть пуÑтыми.',
+ 'interwiki-submit-invalidurl' => 'Протокол URL-адреÑа ÑвлÑетÑÑ Ð½ÐµÐ´Ð¾Ð¿ÑƒÑтимым.',
'log-name-interwiki' => 'Журнал изменений таблицы интервики',
'logentry-interwiki-iw_add' => '$1 {{GENDER:$2|добавил|добавила}} Ð¿Ñ€ÐµÑ„Ð¸ÐºÑ Â«$4» ($5) (trans: $6; local: $7) в интервики-таблицу',
'logentry-interwiki-iw_edit' => '$1 {{GENDER:$2|изменил|изменила}} Ð¿Ñ€ÐµÑ„Ð¸ÐºÑ Â«$4» ($5) (trans: $6; local: $7) в интервики-таблице',
@@ -4220,6 +4391,7 @@ Obsahuje [[Special:Log/interwiki|záznam zmien]] tabuľky interwiki.',
/** Slovenian (slovenÅ¡Äina)
* @author Dbc334
+ * @author Eleassar
*/
$messages['sl'] = array(
'interwiki' => 'Ogled in urejanje podatkov interwiki',
@@ -4245,8 +4417,8 @@ $messages['sl'] = array(
'interwiki_deleted' => 'Predpona »$1« je bila uspešno odstranjena iz tabele interwiki.',
'interwiki_delfailed' => 'Predpone »$1« ni bilo mogoÄe odstraniti iz tabele interwiki.',
'interwiki_addtext' => 'Dodaj predpono interwiki',
- 'interwiki_addintro' => "Dodajate novo predpono interwiki.
-Pomnite, da ne sme vsebovati presledkov ( ), dvopiÄij (:), znakov ''in'' (&) ali enaÄajev (=).",
+ 'interwiki_addintro' => "Dodajate novo medwikipredpono.
+UpoÅ¡tevajte, da ne sme vsebovati presledkov ( ), dvopiÄij (:), znakov ''in'' (&) ali enaÄajev (=).",
'interwiki_addbutton' => 'Dodaj',
'interwiki_added' => 'Predpona »$1« je bila uspešno dodana v tabelo interwiki.',
'interwiki_addfailed' => 'Predpone »$1« ni mogoÄe dodati tabeli interwiki.
@@ -4266,6 +4438,7 @@ Morda ne obstaja.',
);
/** Serbian (Cyrillic script) (ÑрпÑки (ћирилица)‎)
+ * @author Milicevic01
* @author Rancher
* @author Sasa Stefanovic
* @author Жељко Тодоровић
@@ -4307,13 +4480,14 @@ $messages['sr-ec'] = array(
'interwiki_editerror' => 'ÐŸÑ€ÐµÑ„Ð¸ÐºÑ "$1" не може бити измењен у табели међувикија.
Вероватно затшо што не поÑтоји.',
'interwiki-badprefix' => 'Задати међувики Ð¿Ñ€ÐµÑ„Ð¸ÐºÑ "$1" Ñадржи недозвољене знакове',
- 'log-name-interwiki' => 'ИÑторија табеле међувикија',
+ 'log-name-interwiki' => 'Дневник табеле међувикија',
'log-description-interwiki' => 'Ово је иÑторија измена [[Special:Interwiki|табеле међувикија]].',
'right-interwiki' => 'уређивање међувикија',
);
/** Serbian (Latin script) (srpski (latinica)‎)
* @author Michaello
+ * @author Milicevic01
* @author Жељко Тодоровић
*/
$messages['sr-el'] = array(
@@ -4352,7 +4526,7 @@ Imajte na umu da može da ošteti postojeće međuviki veze.',
'interwiki_editerror' => 'Prefiks "$1" ne može biti izmenjen u tabeli međuvikija.
Verovatno zatšo što ne postoji.',
'interwiki-badprefix' => 'Zadati međuviki prefiks "$1" sadrži nedozvoljene znakove',
- 'log-name-interwiki' => 'Istorija tabele međuvikija',
+ 'log-name-interwiki' => 'Dnevnik tabele međuvikija',
'log-description-interwiki' => 'Ovo je istorija izmena [[Special:Interwiki|tabele međuvikija]].',
'right-interwiki' => 'Izmeni međuviki',
);
@@ -4392,6 +4566,7 @@ $messages['su'] = array(
/** Swedish (svenska)
* @author Boivie
* @author Fluff
+ * @author Jopparn
* @author Lejonel
* @author M.M.S.
* @author Najami
@@ -4405,19 +4580,28 @@ $messages['sv'] = array(
'interwiki-title-norights' => 'Visa interwiki-data',
'interwiki-desc' => 'Lägger till en [[Special:Interwiki|specialsida]] för att visa och ändra interwikitabellen',
'interwiki_intro' => 'Det här är en överblick över interwiki-tabellen.',
+ 'interwiki-legend-show' => 'Visa teckenförklaring',
+ 'interwiki-legend-hide' => 'Dölj teckenförklaring',
'interwiki_prefix' => 'Prefix',
'interwiki-prefix-label' => 'Prefix:',
'interwiki_prefix_intro' => 'Interwiki-prefix avsedda att användas i <code>[<nowiki />[prefix:<em>pagename</em>]]</code>-wikisyntax.',
+ 'interwiki_url_intro' => 'Mall för webbadresser. Platshållaren $1 kommer att ersättas av <em>sidnamnet</em> i wikitexten, när den ovannämnda wikitextsyntaxen används.',
'interwiki_local' => 'Vidarebefordra',
'interwiki-local-label' => 'Vidarebefordra:',
'interwiki_local_intro' => 'En HTTP-förfrågan till den lokala wikin med denna interwiki-prefix i webbadressen är:',
+ 'interwiki_local_0_intro' => 'inte accepterad, vanligtvis blockerad av "sidan kunde inte hittas".',
+ 'interwiki_local_1_intro' => 'omdirigeras till måladressen som anges i definitionerna av interwiki-länken (d.v.s. behandlas som referenser i lokala sidor).',
'interwiki_trans' => 'Transkludera',
'interwiki-trans-label' => 'Transkludera:',
+ 'interwiki_trans_intro' => 'Om wikitextsyntax <code>{<nowiki />{prefix:<em>pagename</em>}}</code> används så:',
+ 'interwiki_trans_1_intro' => 'tillåt inkludering från utländska wikin, om interwiki-inkluderingar är allmänt tillåten på denna wiki.',
+ 'interwiki_trans_0_intro' => 'tillåt inte det, leta istället efter en sida i mall-namnrymden.',
'interwiki_intro_footer' => 'Se [//www.mediawiki.org/wiki/Manual:Interwiki_table MediaWiki.org] för mer information om interwikitabellen.
Det finns en [[Special:Log/interwiki|logg över ändringar]] i interwikitabellen.',
'interwiki_1' => 'ja',
'interwiki_0' => 'nej',
'interwiki_error' => 'FEL: Interwikitabellen är tom, eller så gick något fel.',
+ 'interwiki-cached' => 'Interwikidatat cachas. Att ändra cache-minnet är inte möjligt.',
'interwiki_edit' => 'Redigera',
'interwiki_reasonfield' => 'Anledning:',
'interwiki_delquestion' => 'Ta bort "$1"',
@@ -4437,7 +4621,11 @@ Det är möjligt att prefixet redan finns i tabellen.',
'interwiki_editerror' => 'Prefixet "$1" kan inte ändras i interwikitabellen. Det är möjligt att det inte finns.',
'interwiki-badprefix' => 'Specificerat interwikiprefix "$1" innehåller ogiltiga tecken',
'interwiki-submit-empty' => 'Prefix och URL-adressen kan inte vara tomma.',
+ 'interwiki-submit-invalidurl' => 'URL:ens protokoll är ogiltigt.',
'log-name-interwiki' => 'Interwikitabellogg',
+ 'logentry-interwiki-iw_add' => '$1 {{GENDER:$2|lade till}} prefixet "$4" ($5) (trans: $6; lokal: $7) till interwikitabellen',
+ 'logentry-interwiki-iw_edit' => '$1 {{GENDER:$2|ändrade}} prefixet "$4" ($5) (trans: $6; lokal: $7) i interwikitabellen',
+ 'logentry-interwiki-iw_delete' => '$1 {{GENDER:$2|tog bort}} prefixet "$4" från interwikitabellen',
'log-description-interwiki' => 'Detta är en logg över ändringar i [[Special:Interwiki|interwikitabellen]].',
'right-interwiki' => 'Redigera interwikidata',
'action-interwiki' => 'ändra det här interwikielementet',
@@ -4802,9 +4990,11 @@ $messages['ur'] = array(
/** Uzbek (oʻzbekcha)
* @author CoderSI
+ * @author Sociologist
*/
$messages['uz'] = array(
- 'log-name-interwiki' => "Interviki jadvalidagi o'zgarishlar qaydlari",
+ 'interwiki_addbutton' => 'Qoʻshish',
+ 'log-name-interwiki' => 'Interviki jadvalidagi oʻzgarishlar qaydlari',
);
/** vèneto (vèneto)
@@ -4976,13 +5166,22 @@ $messages['wuu'] = array(
* @author פוילישער
*/
$messages['yi'] = array(
+ 'interwiki-title-norights' => 'ב×קוקן ×ינטערוויקי ד×טן',
+ 'interwiki_intro' => 'ד×ס ××™×– ×ן ×יבערבליק פון דער ×ינטערוויקי ט×בעלע.',
+ 'interwiki-legend-show' => 'ווייזן לעגענדע',
+ 'interwiki-legend-hide' => 'ב××”×לטן לעגענדע',
'interwiki_prefix' => 'פרעפֿיקס',
'interwiki-prefix-label' => 'פרעפֿיקס:',
'interwiki_local' => '×יבערפֿירן',
+ 'interwiki-local-label' => '×יבערפֿירן:',
+ 'interwiki_trans' => '×ריבערשליסן',
+ 'interwiki-trans-label' => '×ריבערשליסן:',
+ 'interwiki_trans_intro' => '××– דער וויקיטעקסט סינט×קס <code>{<nowiki />{prefix:<em>בל×טנ×מען</em>}}</code> ווערט געניצט, דעמ×לסט:',
'interwiki_1' => '×™×',
'interwiki_0' => 'ניין',
'interwiki_edit' => 'רעד×ַקטירן',
'interwiki_addbutton' => 'צולייגן',
+ 'interwiki_edittext' => 'רעד×קטירן ×ן ×ינטערוויקי פרעפיקס',
);
/** Cantonese (粵語)
@@ -5034,7 +5233,7 @@ $messages['yue'] = array(
*/
$messages['zh-hans'] = array(
'interwiki' => '查看和编辑跨wikiæ•°æ®',
- 'interwiki-title-norights' => '查看跨维基数æ®',
+ 'interwiki-title-norights' => '查看跨wikiæ•°æ®',
'interwiki-desc' => '新增[[Special:Interwiki|特殊页é¢]]以查看和编辑跨wiki表',
'interwiki_intro' => '这是跨wiki表的概览。',
'interwiki-legend-show' => '显示说明',
@@ -5057,7 +5256,7 @@ $messages['zh-hans'] = array(
'interwiki_1' => '是',
'interwiki_0' => 'å¦',
'interwiki_error' => '错误: è·¨wiki表为空,或是å‘生其它错误。',
- 'interwiki-cached' => 'è·¨wikiæ•°æ®å·²ç¼“存。缓存ä¸èƒ½ç¼–辑。',
+ 'interwiki-cached' => '跨维基数æ®æ˜¯ç¼“存的。缓存ä¸èƒ½è¢«ä¿®æ”¹ã€‚',
'interwiki_edit' => '编辑',
'interwiki_reasonfield' => 'ç†ç”±ï¼š',
'interwiki_delquestion' => '正在删除“$1â€',
@@ -5085,7 +5284,7 @@ $messages['zh-hans'] = array(
'logentry-interwiki-iw_edit' => '$1{{GENDER:$2|已修改}}è·¨wiki表中的å‰ç¼€â€œ$4â€($5) (包å«ï¼š$6;本地:$7)',
'logentry-interwiki-iw_delete' => '$1已从跨wiki表中{{GENDER:$2|删除}}å‰ç¼€â€œ$4â€',
'log-description-interwiki' => '这是一个[[Special:Interwiki|跨wiki表]]的更改日志。',
- 'right-interwiki' => '编辑跨维基数æ®',
+ 'right-interwiki' => '编辑跨wikiæ•°æ®',
'action-interwiki' => '更改该跨维基æ¡ç›®',
);
diff --git a/extensions/Interwiki/Interwiki.php b/extensions/Interwiki/Interwiki.php
index 6b99f999..f15bb290 100644
--- a/extensions/Interwiki/Interwiki.php
+++ b/extensions/Interwiki/Interwiki.php
@@ -30,7 +30,16 @@ $wgInterwikiViewOnly = false;
$wgExtensionCredits['specialpage'][] = array(
'path' => __FILE__,
'name' => 'Interwiki',
- 'author' => array( 'Stephanie Amanda Stevens', 'Alexandre Emsenhuber', 'Robin Pepermans', 'Siebrand Mazeland', 'Platonides', 'Raimond Spekking', 'Sam Reed', '...' ),
+ 'author' => array(
+ 'Stephanie Amanda Stevens',
+ 'Alexandre Emsenhuber',
+ 'Robin Pepermans',
+ 'Siebrand Mazeland',
+ 'Platonides',
+ 'Raimond Spekking',
+ 'Sam Reed',
+ '...'
+ ),
'version' => '2.2 20120425',
'url' => 'https://www.mediawiki.org/wiki/Extension:Interwiki',
'descriptionmsg' => 'interwiki-desc',
@@ -68,7 +77,7 @@ function setupInterwikiExtension() {
// Set up the new log type - interwiki actions are logged to this new log
$wgLogTypes[] = 'interwiki';
# interwiki, iw_add, iw_delete, iw_edit
- $wgLogActionsHandlers['interwiki/*'] = 'InterwikiLogFormatter';
+ $wgLogActionsHandlers['interwiki/*'] = 'InterwikiLogFormatter';
}
return true;
diff --git a/extensions/Interwiki/Interwiki_body.php b/extensions/Interwiki/Interwiki_body.php
index 3325771f..ec104968 100644
--- a/extensions/Interwiki/Interwiki_body.php
+++ b/extensions/Interwiki/Interwiki_body.php
@@ -50,7 +50,9 @@ class SpecialInterwiki extends SpecialPage {
case 'submit':
if ( !$this->canModify( $out ) ) {
# Error msg added by canModify()
- } elseif ( !$request->wasPosted() || !$this->getUser()->matchEditToken( $request->getVal( 'wpEditToken' ) ) ) {
+ } elseif ( !$request->wasPosted() ||
+ !$this->getUser()->matchEditToken( $request->getVal( 'wpEditToken' ) )
+ ) {
// Prevent cross-site request forgeries
$out->addWikiMsg( 'sessionfailure' );
} else {
@@ -146,22 +148,49 @@ class SpecialInterwiki extends SpecialPage {
$formContent = Html::rawElement( 'tr', null,
Html::element( 'td', $label, $this->msg( 'interwiki-prefix-label' )->text() ) .
Html::rawElement( 'td', null, '<tt>' . $prefixElement . '</tt>' )
+ ) . Html::rawElement(
+ 'tr',
+ null,
+ Html::rawElement(
+ 'td',
+ $label,
+ Xml::label( $this->msg( 'interwiki-local-label' )->text(), 'mw-interwiki-local' )
+ ) .
+ Html::rawElement(
+ 'td',
+ $input,
+ Xml::check( 'wpInterwikiLocal', $local, array( 'id' => 'mw-interwiki-local' ) )
+ )
) . Html::rawElement( 'tr', null,
- Html::rawElement( 'td', $label, Xml::label( $this->msg( 'interwiki-local-label' )->text(), 'mw-interwiki-local' ) ) .
- Html::rawElement( 'td', $input, Xml::check( 'wpInterwikiLocal', $local, array( 'id' => 'mw-interwiki-local' ) ) )
+ Html::rawElement(
+ 'td',
+ $label,
+ Xml::label( $this->msg( 'interwiki-trans-label' )->text(), 'mw-interwiki-trans' )
+ ) .
+ Html::rawElement(
+ 'td',
+ $input, Xml::check( 'wpInterwikiTrans', $trans, array( 'id' => 'mw-interwiki-trans' ) ) )
) . Html::rawElement( 'tr', null,
- Html::rawElement( 'td', $label, Xml::label( $this->msg( 'interwiki-trans-label' )->text(), 'mw-interwiki-trans' ) ) .
- Html::rawElement( 'td', $input, Xml::check( 'wpInterwikiTrans', $trans, array( 'id' => 'mw-interwiki-trans' ) ) )
- ) . Html::rawElement( 'tr', null,
- Html::rawElement( 'td', $label, Xml::label( $this->msg( 'interwiki-url-label' )->text(), 'mw-interwiki-url' ) ) .
+ Html::rawElement(
+ 'td',
+ $label,
+ Xml::label( $this->msg( 'interwiki-url-label' )->text(), 'mw-interwiki-url' )
+ ) .
Html::rawElement( 'td', $input, Xml::input( 'wpInterwikiURL', 60, $defaulturl,
array( 'tabindex' => 1, 'maxlength' => 200, 'id' => 'mw-interwiki-url' ) ) )
);
}
- $form = Xml::fieldset( $topmessage, Html::rawElement( 'form',
- array( 'id' => "mw-interwiki-{$action}form", 'method' => 'post',
- 'action' => $this->getTitle()->getLocalUrl( array( 'action' => 'submit', 'prefix' => $prefix ) ) ),
+ $form = Xml::fieldset( $topmessage, Html::rawElement(
+ 'form',
+ array(
+ 'id' => "mw-interwiki-{$action}form",
+ 'method' => 'post',
+ 'action' => $this->getTitle()->getLocalUrl( array(
+ 'action' => 'submit',
+ 'prefix' => $prefix
+ ) )
+ ),
Html::rawElement( 'p', null, $intromessage ) .
Html::rawElement( 'table', array( 'id' => "mw-interwiki-{$action}" ),
$formContent . Html::rawElement( 'tr', null,
@@ -313,16 +342,25 @@ class SpecialInterwiki extends SpecialPage {
return;
}
- $out = '';
-
# Output the existing Interwiki prefixes table header
- $out .= Html::openElement( 'table', array( 'class' => 'mw-interwikitable wikitable sortable body' ) ) . "\n";
+ $out = '';
+ $out .= Html::openElement(
+ 'table',
+ array( 'class' => 'mw-interwikitable wikitable sortable body' )
+ ) . "\n";
$out .= Html::openElement( 'tr', array( 'id' => 'interwikitable-header' ) ) .
Html::element( 'th', null, $this->msg( 'interwiki_prefix' )->text() ) .
Html::element( 'th', null, $this->msg( 'interwiki_url' )->text() ) .
Html::element( 'th', null, $this->msg( 'interwiki_local' )->text() ) .
Html::element( 'th', null, $this->msg( 'interwiki_trans' )->text() ) .
- ( $canModify ? Html::element( 'th', array( 'class' => 'unsortable' ), $this->msg( 'interwiki_edit' )->text() ) : '' );
+ ( $canModify ?
+ Html::element(
+ 'th',
+ array( 'class' => 'unsortable' ),
+ $this->msg( 'interwiki_edit' )->text()
+ ) :
+ ''
+ );
$out .= Html::closeElement( 'tr' ) . "\n";
$selfTitle = $this->getTitle();
@@ -332,23 +370,31 @@ class SpecialInterwiki extends SpecialPage {
$out .= Html::openElement( 'tr', array( 'class' => 'mw-interwikitable-row' ) );
$out .= Html::element( 'td', array( 'class' => 'mw-interwikitable-prefix' ),
$iwPrefix['iw_prefix'] );
- $out .= Html::element( 'td', array( 'class' => 'mw-interwikitable-url' ), $iwPrefix['iw_url'] );
+ $out .= Html::element(
+ 'td',
+ array( 'class' => 'mw-interwikitable-url' ),
+ $iwPrefix['iw_url']
+ );
$attribs = array( 'class' => 'mw-interwikitable-local' );
// Green background for cells with "yes".
if( $iwPrefix['iw_local'] ) {
$attribs['style'] = 'background: lime;';
}
// The messages interwiki_0 and interwiki_1 are used here.
- $out .= Html::element( 'td', $attribs,
- ( isset( $iwPrefix['iw_local'] ) ? $this->msg( 'interwiki_' . $iwPrefix['iw_local'] )->text() : '-' ) );
+ $contents = isset( $iwPrefix['iw_local'] ) ?
+ $this->msg( 'interwiki_' . $iwPrefix['iw_local'] )->text() :
+ '-';
+ $out .= Html::element( 'td', $attribs, $contents );
$attribs = array( 'class' => 'mw-interwikitable-trans' );
// Green background for cells with "yes".
if( $iwPrefix['iw_trans'] ) {
$attribs['style'] = 'background: lime;';
}
// The messages interwiki_0 and interwiki_1 are used here.
- $out .= Html::element( 'td', $attribs,
- ( isset( $iwPrefix['iw_trans'] ) ? $this->msg( 'interwiki_' . $iwPrefix['iw_trans'] )->text() : '-' ) );
+ $contents = isset( $iwPrefix['iw_trans'] ) ?
+ $this->msg( 'interwiki_' . $iwPrefix['iw_trans'] )->text() :
+ '-';
+ $out .= Html::element( 'td', $attribs, $contents );
// Additional column when the interwiki table can be modified.
if ( $canModify ) {
@@ -377,7 +423,11 @@ class SpecialInterwiki extends SpecialPage {
private function addInfoRow( $align = 'start', $title, $text ) {
return Html::rawElement( 'tr', null,
// The classes mw-align-start and mw-align-end are used here.
- Html::rawElement( 'th', array( 'class' => 'mw-align-' . $align ), $this->msg( $title )->escaped() ) .
+ Html::rawElement(
+ 'th',
+ array( 'class' => 'mw-align-' . $align ),
+ $this->msg( $title )->escaped()
+ ) .
// This message is expected to have wiki syntax
Html::rawElement( 'td', null, $this->msg( $text )->parse() )
);
diff --git a/extensions/LocalisationUpdate/LocalisationUpdate.class.php b/extensions/LocalisationUpdate/LocalisationUpdate.class.php
index 39368b7c..66b63232 100644
--- a/extensions/LocalisationUpdate/LocalisationUpdate.class.php
+++ b/extensions/LocalisationUpdate/LocalisationUpdate.class.php
@@ -144,8 +144,8 @@ class LocalisationUpdate {
// Create a full path.
$svnfile = str_replace(
- array( '$1', '$2' ),
- array( $ext, $extFile ),
+ array( '$1', '$2', '$3', '$4' ),
+ array( $ext, $extFile, urlencode( $ext ), urlencode( $extFile ) ),
$extUrl
);
@@ -165,7 +165,11 @@ class LocalisationUpdate {
public static function updateMediawikiMessages( $verbose, $coreUrl ) {
// Find the changed English strings (as these messages won't be updated in ANY language).
$localUrl = Language::getMessagesFileName( 'en' );
- $repoUrl = str_replace( '$2', 'languages/messages/MessagesEn.php', $coreUrl );
+ $repoUrl = str_replace(
+ array( '$2', '$4' ),
+ array( 'languages/messages/MessagesEn.php', 'languages%2Fmessages%2FMessagesEn.php' ),
+ $coreUrl
+ );
$changedEnglishStrings = self::compareFiles( $repoUrl, $localUrl, $verbose );
// Count the changes.
@@ -176,7 +180,11 @@ class LocalisationUpdate {
$localUrl = Language::getMessagesFileName( $code );
// Not prefixed with $IP
$filename = Language::getFilename( 'languages/messages/Messages', $code );
- $repoUrl = str_replace( '$2', $filename, $coreUrl );
+ $repoUrl = str_replace(
+ array( '$2', '$4' ),
+ array( $filename, urlencode( $filename ) ),
+ $coreUrl
+ );
// Compare the files.
$changedCount += self::compareFiles( $repoUrl, $localUrl, $verbose, $changedEnglishStrings, false, true );
diff --git a/extensions/LocalisationUpdate/LocalisationUpdate.i18n.php b/extensions/LocalisationUpdate/LocalisationUpdate.i18n.php
index 5d52609f..194bb1e3 100644
--- a/extensions/LocalisationUpdate/LocalisationUpdate.i18n.php
+++ b/extensions/LocalisationUpdate/LocalisationUpdate.i18n.php
@@ -289,9 +289,10 @@ $messages['km'] = array(
/** Korean (한국어)
* @author Kwj2772
+ * @author ì•„ë¼
*/
$messages['ko'] = array(
- 'localisationupdate-desc' => 'ë²ˆì—­ëœ ì‹œìŠ¤í…œ 메시지를 가능한 í•œ 최신으로 유지',
+ 'localisationupdate-desc' => 'ë²ˆì—­ëœ ë©”ì‹œì§€ë¥¼ 가능한 í•œ 최신으로 유지합니다',
);
/** Colognian (Ripoarisch)
@@ -303,9 +304,10 @@ $messages['ksh'] = array(
/** Luxembourgish (Lëtzebuergesch)
* @author Robby
+ * @author Soued031
*/
$messages['lb'] = array(
- 'localisationupdate-desc' => 'hält déi lokaliséiert Messagen esou aktuell wéi méiglech.',
+ 'localisationupdate-desc' => 'hält déi lokaliséiert Messagen sou aktuell wéi méiglech.',
);
/** Macedonian (македонÑки)
@@ -329,7 +331,7 @@ $messages['ms'] = array(
'localisationupdate-desc' => 'Memastikan kekemaskinian mesej-mesej yang disetempatkan',
);
-/** Norwegian Bokmål (norsk (bokmål)‎)
+/** Norwegian Bokmål (norsk bokmål)
* @author Nghtwlkr
*/
$messages['nb'] = array(
@@ -343,7 +345,7 @@ $messages['nl'] = array(
'localisationupdate-desc' => 'Houdt de gelokaliseerde berichten zo actueel mogelijk',
);
-/** Norwegian Nynorsk (norsk (nynorsk)‎)
+/** Norwegian Nynorsk (norsk nynorsk)
* @author Gunnernett
*/
$messages['nn'] = array(
@@ -373,10 +375,11 @@ $messages['pms'] = array(
/** Portuguese (português)
* @author Hamilton Abreu
+ * @author Luckas
* @author Malafaya
*/
$messages['pt'] = array(
- 'localisationupdate-desc' => 'Mantém as mensagens localizadas tão actualizadas quanto possível',
+ 'localisationupdate-desc' => 'Mantém as mensagens localizadas tão atualizadas quanto possível',
);
/** Brazilian Portuguese (português do Brasil)
diff --git a/extensions/LocalisationUpdate/LocalisationUpdate.php b/extensions/LocalisationUpdate/LocalisationUpdate.php
index 89f0659d..abec5406 100644
--- a/extensions/LocalisationUpdate/LocalisationUpdate.php
+++ b/extensions/LocalisationUpdate/LocalisationUpdate.php
@@ -15,9 +15,11 @@ $wgLocalisationUpdateDirectory = false;
/**
* These should point to either an HTTP-accessible file or local file system.
* $1 is the name of the repo (for extensions) and $2 is the name of file in the repo.
+ * $3 and $4 are the same, respectively, but urlencoded for e.g. gitblit.
*/
-$wgLocalisationUpdateCoreURL = "https://gerrit.wikimedia.org/r/gitweb?p=mediawiki/core.git;a=blob_plain;f=$2;hb=HEAD";
-$wgLocalisationUpdateExtensionURL = "https://gerrit.wikimedia.org/r/gitweb?p=mediawiki/extensions/$1.git;a=blob_plain;f=$2;hb=HEAD";
+
+$wgLocalisationUpdateCoreURL = "https://git.wikimedia.org/raw/mediawiki%2Fcore.git/HEAD/$4";
+$wgLocalisationUpdateExtensionURL = "https://git.wikimedia.org/raw/mediawiki%2Fextensions%2F$3.git/HEAD/$4";
/// Deprecated
$wgLocalisationUpdateSVNURL = false;
diff --git a/extensions/Nuke/Nuke.alias.php b/extensions/Nuke/Nuke.alias.php
index 7ca75426..973f92ee 100644
--- a/extensions/Nuke/Nuke.alias.php
+++ b/extensions/Nuke/Nuke.alias.php
@@ -5,6 +5,7 @@
* @file
* @ingroup Extensions
*/
+// @codingStandardsIgnoreFile
$specialPageAliases = array();
@@ -38,6 +39,11 @@ $specialPageAliases['bjn'] = array(
'Nuke' => array( 'Nuklir' ),
);
+/** Chechen (нохчийн) */
+$specialPageAliases['ce'] = array(
+ 'Nuke' => array( 'Дуккха_дӀаÑккхар' ),
+);
+
/** German (Deutsch) */
$specialPageAliases['de'] = array(
'Nuke' => array( 'Massenlöschung' ),
@@ -195,7 +201,7 @@ $specialPageAliases['nl'] = array(
/** Norwegian Nynorsk (norsk nynorsk) */
$specialPageAliases['nn'] = array(
- 'Nuke' => array( 'Massesletting' ),
+ 'Nuke' => array( 'Massesletting', 'Masseslett' ),
);
/** Polish (polski) */
diff --git a/extensions/Nuke/Nuke.i18n.php b/extensions/Nuke/Nuke.i18n.php
index a7b6f045..71ee547a 100644
--- a/extensions/Nuke/Nuke.i18n.php
+++ b/extensions/Nuke/Nuke.i18n.php
@@ -91,8 +91,9 @@ Parameters:
'nuke-submit-user' => '{{Identical|Go}}',
'nuke-submit-delete' => 'Submit button to delete the selected pages.',
'right-nuke' => '{{doc-right|nuke}}',
- 'nuke-select' => 'Parameter $1 are two links: {{msg-mw|powersearch-toggleall}} and {{msg-mw|powersearch-togglenone}} which respectively selects all pages and de-selects all pages.
-
+ 'nuke-select' => 'Parameters:
+* $1 - two links: {{msg-mw|Powersearch-toggleall}} and {{msg-mw|Powersearch-togglenone}} which respectively selects all pages and de-selects all
+pages
{{Identical|Select}}',
'nuke-userorip' => 'Used as label for "target" input box.',
'nuke-maxpages' => 'Used as label for "nuke limit" input box.',
@@ -100,8 +101,14 @@ Parameters:
Parameters:
* $1 - a username',
- 'nuke-deleted' => '*$1 - page title',
- 'nuke-not-deleted' => '*$1 - page title',
+ 'nuke-deleted' => 'Used as success result of deletion. Parameters:
+* $1 - page title
+See also:
+* {{msg-mw|Nuke-not-deleted}}',
+ 'nuke-not-deleted' => 'Used as failure result of deletion. Parameters:
+* $1 - page title
+See also:
+* {{msg-mw|Nuke-deleted}}',
'nuke-delete-more' => 'Used at the bottom of the Nuke (mass deletion) result page.',
'nuke-pattern' => 'Used as label for "nuke pattern" input box.',
'nuke-nopages-global' => 'Used if there are no pages to delete and the username is empty.
@@ -219,7 +226,7 @@ $messages['arz'] = array(
'right-nuke' => 'مسح كبير للصÙحات',
);
-/** Assamese (অসমীয়া)
+/** Assamese (অসমীয়া)
* @author Bishnu Saikia
*/
$messages['as'] = array(
@@ -267,10 +274,11 @@ $messages['az'] = array(
/** Bashkir (башҡортÑа)
* @author Assele
* @author Haqmar
+ * @author РуÑтам Ðурыев
*/
$messages['ba'] = array(
'nuke' => 'Күпләп юйыу',
- 'nuke-desc' => 'Хәкимдәргә биттәрҙе [[Special:Nuke|күпләп юйыу]] мөмкинлеген бирә',
+ 'nuke-desc' => 'Хакимдәргә биттәрҙе [[Special:Nuke|күпләп юйыу]] мөмкинлеген бирә',
'nuke-nopages' => 'Һуңғы үҙгәртеүҙәрҙә [[Special:Contributions/$1|$1]] тарафынан булдырылған биттәр юҡ.', # Fuzzy
'nuke-list' => 'Түбәндәге биттәр [[Special:Contributions/$1|$1]] тарафынан Ñңыраҡ булдырылған.
Уларҙы юйыр Ó©Ñөн, аңлатма керетегеҙ һәм төймәгә баҫығыҙ.', # Fuzzy
@@ -370,6 +378,7 @@ $messages['bg'] = array(
);
/** Bengali (বাংলা)
+ * @author Aftab1995
* @author Bellayet
* @author Wikitanvir
* @author Zaheen
@@ -378,7 +387,7 @@ $messages['bn'] = array(
'nuke' => 'গণ মà§à¦›à§‡ ফেলা',
'nuke-desc' => 'পà§à¦°à¦¶à¦¾à¦¸à¦•à¦¦à§‡à¦° পাতাগà§à¦²à¦¿ [[Special:Nuke|গণহারে মà§à¦›à§‡ ফেলার]] কà§à¦·à¦®à¦¤à¦¾ দেয়',
'nuke-nopages' => 'সামà§à¦ªà§à¦°à¦¤à¦¿à¦• পরিবরà§à¦¤à¦¨à¦—à§à¦²à¦¿à¦¤à§‡ [[Special:Contributions/$1|$1]]-à¦à¦° তৈরি কোন নতà§à¦¨ পাতা নেই।', # Fuzzy
- 'nuke-list' => '[[Special:Contributions/$1|$1]] সামà§à¦ªà§à¦°à¦¤à¦¿à¦• কালে নিচের পাতাগà§à¦²à¦¿ সৃষà§à¦Ÿà¦¿ করেছেন; à¦à¦•à¦Ÿà¦¿ মনà§à¦¤à¦¬à§à¦¯ দিন à¦à¦¬à¦‚ বোতাম চেপে à¦à¦—à§à¦²à¦¿ মà§à¦›à§‡ ফেলà§à¦¨à¥¤', # Fuzzy
+ 'nuke-list' => '[[Special:Contributions/$1|{{GENDER:$1|$1}}]] সামà§à¦ªà§à¦°à¦¤à¦¿à¦• কালে নিচের পাতাগà§à¦²à¦¿ সৃষà§à¦Ÿà¦¿ করেছেন; à¦à¦•à¦Ÿà¦¿ মনà§à¦¤à¦¬à§à¦¯ দিন à¦à¦¬à¦‚ বোতাম চেপে à¦à¦—à§à¦²à¦¿ মà§à¦›à§‡ ফেলà§à¦¨à¥¤',
'nuke-defaultreason' => '$1-à¦à¦° যোগ করা পাতাগà§à¦²à¦¿à¦° গণ মà§à¦›à§‡-ফেলা', # Fuzzy
'nuke-multiplepeople' => 'à¦à¦•à¦¾à¦§à¦¿à¦• বà§à¦¯à¦¬à¦¹à¦¾à¦°à¦•à¦¾à¦°à§€', # Fuzzy
'nuke-tools' => 'à¦à¦‡ সরঞà§à¦œà¦¾à¦®à¦Ÿà¦¿ বà§à¦¯à¦¬à¦¹à¦¾à¦° করে আপনি à¦à¦•à¦Ÿà¦¿ পà§à¦°à¦¦à¦¤à§à¦¤ বà§à¦¯à¦¬à¦¹à¦¾à¦°à¦•à¦¾à¦°à§€à¦° বা আইপি ঠিকানার যোগ করা পাতাগà§à¦²à¦¿ গণ আকারে মà§à¦›à§‡ ফেলতে পারবেন। পাতাগà§à¦²à¦¿à¦° তালিকা পেতে বà§à¦¯à¦¬à¦¹à¦¾à¦°à¦•à¦¾à¦°à§€ নাম বা আইপি ঠিকানাটি ইনপà§à¦Ÿ করà§à¦¨:', # Fuzzy
@@ -391,6 +400,7 @@ $messages['bn'] = array(
/** Breton (brezhoneg)
* @author Fulup
+ * @author Y-M D
*/
$messages['br'] = array(
'nuke' => "Diverkañ a-vloc'h",
@@ -417,7 +427,7 @@ Merkañ ar c'homlec'h IP pe anv an implijer evit kaout roll ar pajennoù da zive
'nuke-delete-more' => '[[Special:Nuke|Diverkañ pajennoù all]]',
'nuke-pattern' => 'Patrom evit anv ar bajenn :',
'nuke-nopages-global' => "N'eus pajenn nevez ebet er [[Special:RecentChanges|c'hemmoù diwezhañ]].",
- 'nuke-viewchanges' => "Diskouez ar c'hemmoù",
+ 'nuke-viewchanges' => "diskouez ar c'hemmoù",
);
/** Bosnian (bosanski)
@@ -446,6 +456,7 @@ Unesite korisniÄko ime ili IP adresu za izlistavanje stranica koje se briÅ¡u il
/** Catalan (català)
* @author Aleator
+ * @author Alvaro Vidal-Abarca
* @author Paucabot
* @author SMP
* @author Toniher
@@ -453,7 +464,7 @@ Unesite korisniÄko ime ili IP adresu za izlistavanje stranica koje se briÅ¡u il
$messages['ca'] = array(
'nuke' => 'Eliminació massiva',
'nuke-desc' => "Dóna als administradors l'habilitat d'[[Special:Nuke|esborrar pàgines massivament]]",
- 'nuke-nopages' => 'No hi ha pàgines noves de [[Special:Contributions/$1|$1]] als canvis recents.', # Fuzzy
+ 'nuke-nopages' => 'No hi ha pàgines noves de [[Special:Contributions/$1|{{GENDER:$1|$1}}]] als canvis recents.',
'nuke-list' => 'Les següents pàgines han estat creades recentment per [[Special:Contributions/$1|$1]];
feu un comentari i cliqueu el botó per a esborrar-les.', # Fuzzy
'nuke-defaultreason' => 'Esborrat massiu de pàgines creades per $1', # Fuzzy
@@ -466,12 +477,26 @@ Per obtenir la llista de pàgines per esborrar podeu introduir el nom d'un usuar
/** Chechen (нохчийн)
* @author Sasan700
+ * @author Умар
*/
$messages['ce'] = array(
- 'nuke' => 'Дуккха дIадайар',
- 'nuke-defaultreason' => 'Декъашхочо кхоьллина агIонаш, дуккха дIайайар $1', # Fuzzy
- 'nuke-submit-delete' => 'Дlадайá хаьржнарш',
- 'right-nuke' => 'дуккха агIонаш дIайайар',
+ 'nuke' => 'Дуккха дӀÑккхар',
+ 'action-nuke' => 'дуккха агIонаш дӀаÑхар',
+ 'nuke-list-multiple' => 'Лахахь гайтина агӀонаш дукху хан йоцуш кхолийна.
+Уьш дӀаÑха билгалонаш Ӏадйите тӀетаӀе кнопка.',
+ 'nuke-defaultreason' => 'Декъашхочо $1 кхоьллина агIонаш, дуккха дӀаÑхар', # Fuzzy
+ 'nuke-multiplepeople' => 'Дуккха агӀонаш дӀаÑхар',
+ 'nuke-tools' => 'ХӀокху агӀонехь йиш ÑŽ дуккха агӀонаш дӀаÑха, дукх хан йоцуш кхолийна йолу.',
+ 'nuke-submit-user' => 'Кхочушдé',
+ 'nuke-submit-delete' => 'ДӀаÑха хаьржнарш',
+ 'right-nuke' => 'дуккха агIонаш дӀаÑхар',
+ 'nuke-userorip' => 'Декъашхочун цӀе, IP-Ð°Ð´Ñ€ÐµÑ (еÑа йита мега):',
+ 'nuke-maxpages' => 'ÐгӀонашан макÑимальни дукхалла:',
+ 'nuke-editby' => 'Кхолийна {{GENDER:$1|декъашхочо}} [[Special:Contributions/$1|$1]]',
+ 'nuke-delete-more' => '[[Special:Nuke|Дуккха агӀонаш дӀаÑхар]]',
+ 'nuke-pattern' => 'Кеп агӀона цӀеран:',
+ 'nuke-viewchanges' => 'ХӀоттина болу хийцам',
+ 'nuke-namespace' => 'КъаÑтае ана цӀераш:',
);
/** Chamorro (Chamoru)
@@ -481,10 +506,18 @@ $messages['ch'] = array(
'nuke-submit-user' => 'HÃ¥nao',
);
-/** Czech (Äesky)
+/** Sorani Kurdish (کوردی)
+ * @author Calak
+ */
+$messages['ckb'] = array(
+ 'right-nuke' => 'سڕینەوەی پەڕەکان بەکۆمەڵ',
+);
+
+/** Czech (ÄeÅ¡tina)
* @author Danny B.
* @author Jkjk
* @author Li-sung
+ * @author Littledogboy
* @author Matěj Grabovský
* @author Mormegil
*/
@@ -497,8 +530,8 @@ $messages['cs'] = array(
vyplňte komentář a vÅ¡echny smažte kliknutím na tlaÄítko.',
'nuke-list-multiple' => 'Nedávno byly vytvořeny následující stránky;
zadáním komentáře a stisknutím tlaÄítka je smažete.',
- 'nuke-defaultreason' => 'Hromadné odstranění stránek, které {{GENDER:$1|vytvořil|vytvořila}} [[Special:Contributions/$1|$1]]',
- 'nuke-multiplepeople' => 'Hromadné odstranění nedávno založených stránek',
+ 'nuke-defaultreason' => 'Hromadné smazání stránek, které {{GENDER:$1|vytvořil|vytvořila}} [[Special:Contributions/$1|$1]]',
+ 'nuke-multiplepeople' => 'Hromadné smazání nedávno založených stránek',
'nuke-tools' => 'Tento nástroj umožňuje hromadné smazání stránek nedávno vytvořených zadaným uživatelem nebo IP adresou.
Zadejte uživatelské jméno nebo IP adresu, zobrazí se seznam stránek ke smazání; případně ponechte prázdné pro všechny uživatele.',
'nuke-submit-user' => 'Provést',
@@ -552,6 +585,7 @@ Skriv et brugernavn eller en IP-adresse for at få en liste over sider at slette
);
/** German (Deutsch)
+ * @author Geitost
* @author Kghbln
* @author Metalhead64
* @author Raimond Spekking
@@ -569,7 +603,7 @@ Gib einen Kommentar bezüglich der Löschung an und klicke auf die Schaltfläche
'nuke-defaultreason' => 'Massenlöschung der Seiten, die von „[[Special:Contributions/$1|{{GENDER:$1|$1}}]]“ angelegt wurden',
'nuke-multiplepeople' => 'Massenlöschung kürzlich erstellter Seiten',
'nuke-tools' => 'Diese Arbeitshilfe ermöglicht die Massenlöschung von Seiten, die von einer IP-Adresse oder einem Benutzer angelegt wurden.
-Gib die IP-Adresse oder den Benutzernamen ein, um eine Liste der zu löschenden Seiten zu erhalten. Sofern Du keine Angabe machst, werden alle Benutzer ausgewählt.',
+Gib die IP-Adresse oder den Benutzernamen ein, um eine Liste der zu löschenden Seiten zu erhalten. Sofern du keine Angabe machst, werden alle Benutzer ausgewählt.',
'nuke-submit-user' => 'Abrufen',
'nuke-submit-delete' => 'Ausgewählte Seiten löschen',
'right-nuke' => 'Massenlöschungen von Seiten',
@@ -726,6 +760,7 @@ Enigu la salutnomon aÅ­ IP-adreson por akiri liston de paÄoj forigi, aÅ­ lasu Ä
* @author Fitoschido
* @author Imre
* @author Jatrobat
+ * @author MarcoAurelio
* @author Platonides
* @author Ralgis
* @author Remember the dot
@@ -807,6 +842,7 @@ idatz ezazu ohar bat, eta sakatu botoia orri horiek ezabatzeko.',
);
/** Persian (Ùارسی)
+ * @author Ebraminio
* @author Huji
* @author Mjbmr
* @author Reza1615
@@ -817,10 +853,11 @@ $messages['fa'] = array(
'action-nuke' => 'حذ٠دسته‌جمعی صÙحه‌ها',
'nuke-desc' => 'به مدیران امکان [[Special:Nuke|حذ٠دسته‌جمعی]] صÙحه‌ها را می‌دهد',
'nuke-nopages' => 'صÙحهٔ جدیدی از [[Special:Contributions/$1|{{GENDER:$1|$1}}]] در تغییرات اخیر وجود ندارد.',
- 'nuke-list' => 'صÙحه‌های زیر به تازگی توسط [[Special:Contributions/$1|$1]] ایجاد شده‌اند؛ توضیحی ارائه کنید Ùˆ دکمه را بزنید تا این صحÙه‌ها حذ٠شوند.', # Fuzzy
+ 'nuke-list' => 'صÙحه‌های زیر به تازگی توسط [[Special:Contributions/$1|{{GENDER:$1|$1}}]] ایجاد شده‌اند؛
+توضیحی ارائه کنید Ùˆ دکمه را بزنید تا این صحÙه‌ها حذ٠شوند.',
'nuke-list-multiple' => 'صÙحه‌های مقابل اخیراً ایجاد شده‌اند؛
یک توضیح قرار دهید Ùˆ برای حذ٠کلید را Ùشار دهید.',
- 'nuke-defaultreason' => 'حذ٠دسته‌جمعی صÙحه‌هایی Ú©Ù‡ توسط $1 ایجاد شده‌اند', # Fuzzy
+ 'nuke-defaultreason' => 'حذ٠دسته‌جمعی صÙحه‌هایی Ú©Ù‡ توسط [[Special:Contributions/$1|{{GENDER:$1|$1}}]] ایجاد شده‌اند',
'nuke-multiplepeople' => 'حذ٠توده‌ای صÙحه‌های به‌تازگی اÙزوده‌شده',
'nuke-tools' => 'این ابزار امکان حذ٠دسته‌جمعی صÙحه‌هایی Ú©Ù‡ به تازگی توسط یک کاربر یا نشانی آی‌پی اضاÙÙ‡ شده‌اند را Ùراهم می‌کند.
نام کاربری یا نشانی آی‌پی موردنظر را وارد کنید، یا جعبه را خالی بگذارید تا تمام کاربرها در نظر گرÙته شوند.',
@@ -830,21 +867,24 @@ $messages['fa'] = array(
'nuke-select' => 'انتخاب: $1',
'nuke-userorip' => 'نام کاربری، نشانی آی‌پی یا خالی:',
'nuke-maxpages' => 'حداکثر تعداد صÙحه‌ها:',
- 'nuke-editby' => 'ایجاد شده توسط [[Special:Contributions/$1|$1]]', # Fuzzy
- 'nuke-deleted' => "صÙحهٔ '''$1''' حذ٠شده است.",
+ 'nuke-editby' => 'ایجاد شده توسط [[Special:Contributions/$1|{{GENDER:$1|$1}}]]',
+ 'nuke-deleted' => "صÙحهٔ '''$1''' حذ٠شده‌است.",
'nuke-not-deleted' => "صÙحهٔ [[:$1]] را '''نمی‌توان''' حذ٠کرد.",
'nuke-delete-more' => '[[Special:Nuke|حذ٠صÙحه‌های بیشتر]]',
'nuke-pattern' => 'الگو برای نام صÙحه:',
'nuke-nopages-global' => 'هیچ صÙحهٔ جدیدی در [[Special:RecentChanges|Ùهرست تغییرات اخیر]] نیست.',
'nuke-viewchanges' => 'نمایش تغییرات',
+ 'nuke-namespace' => 'محدودیت به Ùضای نام:',
);
/** Finnish (suomi)
* @author Beluga
* @author Crt
* @author Jaakonam
+ * @author Mies
* @author Nike
* @author Olli
+ * @author Pxos
* @author Stryn
*/
$messages['fi'] = array(
@@ -853,15 +893,15 @@ $messages['fi'] = array(
'nuke-desc' => 'Mahdollistaa ylläpitäjille sivujen [[Special:Nuke|massapoistamisen]].',
'nuke-nopages' => 'Ei käyttäjän [[Special:Contributions/$1|{{GENDER:$1|$1}}]] lisäämiä uusia sivuja tuoreissa muutoksissa.',
'nuke-list' => 'Käyttäjä [[Special:Contributions/$1|{{GENDER:$1|$1}}]] on äskettäin luonut seuraavat sivut.
-Lisää kommentti ja poista napsauttamalla painiketta.',
- 'nuke-list-multiple' => 'Seuraavat sivut tehtiin äskettäin.
-Lisää kommentti ja poista napsauttamalla painiketta.',
+Lisää kommentti ja poista sivut napsauttamalla painiketta.',
+ 'nuke-list-multiple' => 'Seuraavat sivut on luotu äskettäin.
+Lisää kommentti ja poista sivut napsauttamalla painiketta.',
'nuke-defaultreason' => 'Käyttäjän [[Special:Contributions/$1|{{GENDER:$1|$1}}]] lisäämien sivujen massapoistaminen',
'nuke-multiplepeople' => 'Äskettäin lisättyjen sivujen massapoistaminen',
'nuke-tools' => 'Tämä työkalu mahdollistaa äskettäin lisättyjen sivujen massapoistamisen käyttäjänimen tai IP-osoitteen perusteella.
Kirjoita käyttäjänimi tai IP-osoite, niin saat listan poistettavista sivuista, tai jätä kenttä tyhjäksi niin saat kaikkien käyttäjien tekemät sivut.',
'nuke-submit-user' => 'Siirry',
- 'nuke-submit-delete' => 'Poista valitut',
+ 'nuke-submit-delete' => 'Poista valitsemasi sivut',
'right-nuke' => 'Massapoistaa sivuja',
'nuke-select' => 'Valinta: $1',
'nuke-userorip' => 'Käyttäjänimi tai IP-osoite (voi jättää myös tyhjäksi):',
@@ -869,8 +909,8 @@ Kirjoita käyttäjänimi tai IP-osoite, niin saat listan poistettavista sivuista
'nuke-editby' => 'Luonut [[Special:Contributions/$1|{{GENDER:$1|$1}}]]',
'nuke-deleted' => "Sivu '''$1''' on poistettu.",
'nuke-not-deleted' => "Sivua [[:$1]] '''ei voitu''' poistaa.",
- 'nuke-delete-more' => '[[Special:Nuke|Poista lisää sivuja]]',
- 'nuke-pattern' => 'Sivun nimien etuliite',
+ 'nuke-delete-more' => '[[Special:Nuke|Poista enemmän sivuja]]',
+ 'nuke-pattern' => 'Malli sivun nimelle:',
'nuke-nopages-global' => '[[Special:RecentChanges|Tuoreissa muutoksissa]] ei ole uusia sivuja.',
'nuke-viewchanges' => 'näytä muutokset',
'nuke-namespace' => 'Rajoita nimiavaruuteen:',
@@ -948,6 +988,39 @@ Buchiér lo nom d’usanciér ou ben l’adrèce IP por avêr la lista de les pÃ
'nuke-namespace' => 'Sè limitar a cet’èspâço de noms :',
);
+/** Northern Frisian (Nordfriisk)
+ * @author Murma174
+ */
+$messages['frr'] = array(
+ 'nuke' => 'Sidjen bonkerwiis strik',
+ 'action-nuke' => 'sidjen bonkerwiis tu striken',
+ 'nuke-desc' => 'Administratooren kön diarmä sidjen [[Special:Nuke|bonkerwiis strik]]',
+ 'nuke-nopages' => 'Bi a „leetst feranrangen“ san nian nei sidjen faan [[Special:Contributions/$1|{{GENDER:$1|$1}}]].',
+ 'nuke-list' => 'Jodiar sidjen san faan [[Special:Contributions/$1|{{GENDER:$1|$1}}]] skrewen wurden.
+Skriiw ap, huaram dü jo strikst, an do trak üüb di knoop tu striken.',
+ 'nuke-list-multiple' => 'Jodiar sidjen san jüst skrewen wurden.
+Skriiw ap, huaram dü jo strikst, an do trak üüb di knoop tu striken.',
+ 'nuke-defaultreason' => 'Sidjen faan [[Special:Contributions/$1|{{GENDER:$1|$1}}]] bonkerwiis strik',
+ 'nuke-multiplepeople' => 'Jüst skrewen sidjen bonkerwiis strik',
+ 'nuke-tools' => 'Diarmä kön sidjen, diar faan en was IP of en wasen brüker skrewen wurden san, bonkerwiis stregen wurd.
+Skriiw diar det IP-adres of di brükernööm iin, an do könst dü det list faan sidjen sä, diar stregen wurd kön.
+Wan dü diar niks henskrafst, wurd aal a brükern uunwiset.',
+ 'nuke-submit-user' => 'Widjer',
+ 'nuke-submit-delete' => 'Enkelten strik',
+ 'right-nuke' => 'Sidjen bonkerwiis strik',
+ 'nuke-select' => 'Schük ütj: $1',
+ 'nuke-userorip' => 'Brükernööm, IP-adres of niks:',
+ 'nuke-maxpages' => 'Ei muar sidjen üs:',
+ 'nuke-editby' => 'Skrewen faan [[Special:Contributions/$1|{{GENDER:$1|$1}}]]',
+ 'nuke-deleted' => "Sidj '''„$1“''' as stregen wurden.",
+ 'nuke-not-deleted' => "Sidj [[:$1]] '''küd ei''' stregen wurd.",
+ 'nuke-delete-more' => '[[Special:Nuke|Muar sidjen strik]]',
+ 'nuke-pattern' => 'Münster för di sidjnööm:',
+ 'nuke-nopages-global' => 'Diar san nian sidjen uun a [[Special:RecentChanges|leetst feranrangen]].',
+ 'nuke-viewchanges' => 'Feranrangen wise',
+ 'nuke-namespace' => 'Bluas uun di nöömrüm:',
+);
+
/** Friulian (furlan)
* @author Klenje
*/
@@ -1046,6 +1119,7 @@ $messages['gv'] = array(
/** Hebrew (עברית)
* @author Amire80
+ * @author Guycn1
* @author Rotem Liss
* @author YaronSh
*/
@@ -1058,7 +1132,7 @@ $messages['he'] = array(
×× × ×›×ª×‘×• הסבר למחיקה ולחצו על הכפתור כדי למחוק ×ות×.',
'nuke-list-multiple' => '×”×“×¤×™× ×”×‘××™× × ×•×¦×¨×• ל×חרונה;
×× × ×›×ª×‘×• נימוק למחיקה ולחצו על הכפתור כדי למחוק ×ות×.',
- 'nuke-defaultreason' => 'הסרה מרובה של ×“×¤×™× ×©× ×•×¡×¤×• על־ידי [[Special:Contributions/$1|{{GENDER:$1|$1}}]]',
+ 'nuke-defaultreason' => 'הסרה מרובה של ×“×¤×™× ×©× ×•×¦×¨×• על־ידי [[Special:Contributions/$1|$1]]',
'nuke-multiplepeople' => 'מחיקה מרובה של ×“×¤×™× ×©× ×•×¡×¤×• ל×חרונה',
'nuke-tools' => 'כלי ×–×” מ×פשר מחיקות המוניות של ×“×¤×™× ×©× ×•×¡×¤×• ל×חרונה על ידי משתמש ×ו כתובת IP מסוימי×.
כתבו ×ת ×©× ×”×ž×©×ª×ž×© ×ו כתובת ×”Ö¾IP כדי לקבל ×ת רשימת ×”×“×¤×™× ×œ×ž×—×™×§×” ×ו הש×ירו ×ת השדה ×”×–×” ריק עבור כל המשתמשי×.',
@@ -1082,22 +1156,35 @@ $messages['he'] = array(
* @author Ansumang
* @author Kaustubh
* @author Shyam
+ * @author Siddhartha Ghai
*/
$messages['hi'] = array(
- 'nuke' => 'à¤à¤•à¤¸à¤¾à¤¥ बहà¥à¤¤ सारे पनà¥à¤¨à¥‡ हटायें',
- 'nuke-desc' => 'पà¥à¤°à¤¬à¤‚धकोंको à¤à¤•à¤¸à¤¾à¤¥ [[Special:Nuke|बहà¥à¤¤ सारे पनà¥à¤¨à¥‡ हटानेकी]] अनà¥à¤®à¤¤à¤¿ देता हैं',
- 'nuke-nopages' => 'हाल में हà¥à¤ बदलावोंमें [[Special:Contributions/$1|$1]] दà¥à¤µà¤¾à¤°à¤¾ नये पनà¥à¤¨à¥‡ नहीं हैं।', # Fuzzy
- 'nuke-list' => 'नीचे दिये हà¥à¤ पनà¥à¤¨à¥‡ [[Special:Contributions/$1|$1]] ने हाल में बनायें हैं; टिपà¥à¤ªà¤£à¥€ दें और हटाने के लिये बटनपर कà¥à¤²à¤¿à¤• करें।', # Fuzzy
- 'nuke-defaultreason' => '$1 ने बनाये हà¥à¤ पनà¥à¤¨à¥‡ à¤à¤•à¤¸à¤¾à¤¥ हटायें', # Fuzzy
- 'nuke-tools' => 'यह उपकरण किसी सदसà¥à¤¯ या IP दà¥à¤µà¤¾à¤°à¤¾ हाल ही में जोड़े गठपृषà¥à¤ à¥‹à¤‚ को सामूहिक रूप से हटाने में सहायक है।
-सदसà¥à¤¯à¤¨à¤¾à¤® या IP डालकर हटाने वाले पृषà¥à¤ à¥‹à¤‚ की सूची पà¥à¤°à¤¾à¤ªà¥à¤¤ करें।', # Fuzzy
+ 'nuke' => 'à¤à¤• साथ बहà¥à¤¤ सारे पृषà¥à¤  हटायें',
+ 'action-nuke' => 'à¤à¤• साथ बहà¥à¤¤ सारे पृषà¥à¤  हटाने',
+ 'nuke-desc' => 'पà¥à¤°à¤¬à¤‚धकों को à¤à¤• साथ [[Special:Nuke|बहà¥à¤¤ सारे पृषà¥à¤  हटाने]] की सà¥à¤µà¤¿à¤§à¤¾ देता है',
+ 'nuke-nopages' => 'हाल में हà¥à¤ बदलावों में [[Special:Contributions/$1|{{GENDER:$1|$1}}]] दà¥à¤µà¤¾à¤°à¤¾ नये पृषà¥à¤  नहीं हैं।',
+ 'nuke-list' => 'नीचे दिये हà¥à¤ पृषà¥à¤  [[Special:Contributions/$1|{{GENDER:$1|$1}}]] ने हाल में बनाये हैं;
+टिपà¥à¤ªà¤£à¥€ दें और हटाने के लिये बटन पर कà¥à¤²à¤¿à¤• करें।',
+ 'nuke-list-multiple' => 'निमà¥à¤¨ पृषà¥à¤  हाल में बनाठगठहैं;
+टिपà¥à¤ªà¤£à¥€ दें और हटाने के लिठबटन पर कà¥à¤²à¤¿à¤• करें।',
+ 'nuke-defaultreason' => '[[Special:Contributions/$1|{{GENDER:$1|$1}}]] दà¥à¤µà¤¾à¤°à¤¾ बनाये गठपृषà¥à¤  à¤à¤• साथ हटाये',
+ 'nuke-multiplepeople' => 'हाल में बने पृषà¥à¤  à¤à¤• साथ हटाà¤',
+ 'nuke-tools' => 'यह उपकरण किसी सदसà¥à¤¯ या आई॰पी दà¥à¤µà¤¾à¤°à¤¾ हाल ही में जोड़े गठपृषà¥à¤ à¥‹à¤‚ को सामूहिक रूप से हटाने के लिठहै।
+सदसà¥à¤¯à¤¨à¤¾à¤® या आई॰पी डालकर हटाने हेतॠपृषà¥à¤ à¥‹à¤‚ की सूची पà¥à¤°à¤¾à¤ªà¥à¤¤ करें। सभी सदसà¥à¤¯à¥‹à¤‚ के बनाठपृषà¥à¤ à¥‹à¤‚ की सूची के लिठखाली छोड़ दें।',
'nuke-submit-user' => 'जायें',
'nuke-submit-delete' => 'चà¥à¤¨à¥‡ हà¥à¤ हटायें',
- 'right-nuke' => 'बहà¥à¤¤à¤¸à¥‡ पनà¥à¤¨à¥‡ à¤à¤•à¤¸à¤¾à¤¥ हटायें',
- 'nuke-select' => 'चयन करें: $1',
- 'nuke-userorip' => 'सदसà¥à¤¯à¤¨à¤¾à¤®, आईपी पते या खाली:',
+ 'right-nuke' => 'बहà¥à¤¤ से पृषà¥à¤  à¤à¤• साथ हटायें',
+ 'nuke-select' => 'चà¥à¤¨à¥‡à¤‚: $1',
+ 'nuke-userorip' => 'सदसà¥à¤¯à¤¨à¤¾à¤®, आई॰पी पता या खाली:',
'nuke-maxpages' => 'अधिकतम पृषà¥à¤  संखà¥à¤¯à¤¾:',
- 'nuke-deleted' => "पृषà¥à¤  '''$1''' को हटा दिया गया हैं।",
+ 'nuke-editby' => '[[Special:Contributions/$1|{{GENDER:$1|$1}}]] दà¥à¤µà¤¾à¤°à¤¾ बनाठगà¤',
+ 'nuke-deleted' => "पृषà¥à¤  '''$1''' को हटा दिया गया है।",
+ 'nuke-not-deleted' => "पृषà¥à¤  [[:$1]] हटाया '''नहीं''' जा सका।",
+ 'nuke-delete-more' => '[[Special:Nuke|और पृषà¥à¤  हटाà¤à¤]]',
+ 'nuke-pattern' => 'पृषà¥à¤  नाम के लिठपैटरà¥à¤¨:',
+ 'nuke-nopages-global' => '[[Special:RecentChanges|हाल में हà¥à¤ बदलावों]] में कोई नठपृषà¥à¤  नहीं हैं।',
+ 'nuke-viewchanges' => 'बदलाव देखें',
+ 'nuke-namespace' => 'इस नामसà¥à¤¥à¤¾à¤¨ में सीमित करें:',
);
/** Hiligaynon (Ilonggo)
@@ -1196,12 +1283,12 @@ $messages['ia'] = array(
'nuke' => 'Deletion in massa',
'action-nuke' => 'deler paginas in massa',
'nuke-desc' => 'Da le possibilitate al administratores de [[Special:Nuke|deler paginas in massa]]',
- 'nuke-nopages' => 'Nulle nove paginas per [[Special:Contributions/$1|$1]] trovate in le modificationes recente.', # Fuzzy
- 'nuke-list' => 'Le sequente paginas esseva recentemente create per [[Special:Contributions/$1|$1]];
-entra un commento e clicca le button pro deler los.', # Fuzzy
+ 'nuke-nopages' => 'Nulle nove pagina create per [[Special:Contributions/$1|{{GENDER:$1|$1}}]] trovate in le modificationes recente.',
+ 'nuke-list' => 'Le sequente paginas esseva recentemente create per [[Special:Contributions/$1|{{GENDER:$1|$1}}]];
+entra un commento e clicca le button pro deler los.',
'nuke-list-multiple' => 'Le sequente paginas esseva create recentemente;
entra un commento e pulsa sur le button pro deler los.',
- 'nuke-defaultreason' => 'Deletion in massa de paginas addite per $1', # Fuzzy
+ 'nuke-defaultreason' => 'Deletion in massa de paginas addite per [[Special:Contributions/$1|{{GENDER:$1|$1}}]]',
'nuke-multiplepeople' => 'Deletion in massa de paginas addite recentemente',
'nuke-tools' => 'Iste instrumento permitte le deletion in massa de paginas recentemente addite per un usator o adresse IP specific.
Entra le nomine de usator o adresse IP pro obtener un lista de paginas a deler, o lassa vacue pro tote le usatores.',
@@ -1211,7 +1298,7 @@ Entra le nomine de usator o adresse IP pro obtener un lista de paginas a deler,
'nuke-select' => 'Seliger: $1',
'nuke-userorip' => 'Nomine de usator, adresse IP o vacue:',
'nuke-maxpages' => 'Numero maxime de paginas:',
- 'nuke-editby' => 'Create per [[Special:Contributions/$1|$1]]', # Fuzzy
+ 'nuke-editby' => 'Create per [[Special:Contributions/$1|{{GENDER:$1|$1}}]]',
'nuke-deleted' => "Le pagina '''$1''' ha essite delite.",
'nuke-not-deleted' => "Le pagina [[:$1]] '''non poteva''' esser delite.",
'nuke-delete-more' => '[[Special:Nuke|Deler plus paginas]]',
@@ -1264,9 +1351,9 @@ $messages['ig'] = array(
* @author Lam-ang
*/
$messages['ilo'] = array(
- 'nuke' => 'Paga-adduan nga pinag-ikkat',
+ 'nuke' => 'Paga-adduan nga panagikkat',
'action-nuke' => 'ikkaten dagiti panid',
- 'nuke-desc' => 'Ikkan na ti administrador ti abilidad nga [[Special:Nuke| paga-adduan nga pang-ikkat]] kadagit panid',
+ 'nuke-desc' => 'Ikkanna ti administrador ti abilidad iti [[Special:Nuke|adu a panagikkat]] kadagiti panid',
'nuke-nopages' => 'Awan dagiti baro a panid babaen ni [[Special:Contributions/$1|{{GENDER:$1|$1}}]] idiay kaudian abalbaliw.',
'nuke-list' => 'Dagiti sumaganad a panid ket kadamdamaan a pinartuat babaen ni [[Special:Contributions/$1|{{GENDER:$1|$1}}]];
ikkam ti komentario ken pindutem ti buton tapno maikkatda.',
@@ -1289,6 +1376,7 @@ Ikabil ti nagan ti agar-aramat wenno IP address tapno maalam dagiti listaan dagi
'nuke-pattern' => 'Manipud a kita iti nagan ti panid:',
'nuke-nopages-global' => 'Awan dagiti baro a panid idiay [[Special:RecentChanges|kinaudian a pinagbaliw]].',
'nuke-viewchanges' => 'kitaen dagiti sinukatan',
+ 'nuke-namespace' => 'Patingga iti nagan a lugar:',
);
/** Ido (Ido)
@@ -1337,6 +1425,7 @@ Tilgreindu notendanafn eða vistfang til að fá lista yfir síður til að eyð
* @author BrokenArrow
* @author Darth Kule
* @author F. Cosoleto
+ * @author Nemo bis
*/
$messages['it'] = array(
'nuke' => 'Cancellazione di massa',
@@ -1359,7 +1448,7 @@ Inserisci il nome utente o l'indirizzo IP per la lista delle pagine da cancellar
'nuke-editby' => 'Creata da [[Special:Contributions/$1|{{GENDER:$1|$1}}]]',
'nuke-deleted' => "La pagina '''$1''' è stata cancellata.",
'nuke-not-deleted' => "La pagina [[:$1]] '''non può''' essere cancellata.",
- 'nuke-delete-more' => '[[Special:Nuke|Cancella più pagine]]',
+ 'nuke-delete-more' => '[[Special:Nuke|Cancella altre pagine]]',
'nuke-pattern' => 'Modello per il titolo della pagina:',
'nuke-nopages-global' => 'Non ci sono nuove pagine negli [[Special:RecentChanges|ultimi cambiamenti]].',
'nuke-viewchanges' => 'vedi modifiche',
@@ -1399,8 +1488,8 @@ $messages['ja'] = array(
'nuke-userorip' => '利用者åã€IP アドレスã€ç©ºæ¬„ã®ã„ãšã‚Œã‹:',
'nuke-maxpages' => '最大ページ数:',
'nuke-editby' => '[[Special:Contributions/$1|$1]] ãŒä½œæˆ',
- 'nuke-deleted' => "ページ '''$1''' ã¯å‰Šé™¤ã•ã‚Œã¾ã—ãŸã€‚",
- 'nuke-not-deleted' => "ページ [[:$1]] ã¯å‰Šé™¤'''ã§ãã¾ã›ã‚“''' 。",
+ 'nuke-deleted' => "ページ '''$1''' を削除ã—ã¾ã—ãŸã€‚",
+ 'nuke-not-deleted' => "ページ [[:$1]] を削除'''ã§ãã¾ã›ã‚“ã§ã—ãŸ'''。",
'nuke-delete-more' => '[[Special:Nuke|ä»–ã®ãƒšãƒ¼ã‚¸ã‚‚削除]]',
'nuke-pattern' => 'ページåã®ãƒ‘ターン:',
'nuke-nopages-global' => '[[Special:RecentChanges|最近ã®æ›´æ–°]]ã«ã¯æ–°ã—ã„ページã¯ã‚ã‚Šã¾ã›ã‚“。',
@@ -1480,6 +1569,35 @@ $messages['ka'] = array(
'nuke-viewchanges' => 'ცვლილებების ჩვენებáƒ',
);
+/** Kazakh (Cyrillic script) (қазақша (кирил)‎)
+ * @author Arystanbek
+ */
+$messages['kk-cyrl'] = array(
+ 'nuke' => 'Жаппай жою',
+ 'action-nuke' => 'Жаппай жою беттері',
+ 'nuke-desc' => 'Әкімшілер беттерді [[Special:Nuke|жаппай жоюға]] құзретті',
+ 'nuke-nopages' => 'Жуықтағы өзгеріÑтерде [[Special:Contributions/$1|{{GENDER:$1|$1}}]] қоÑқан жаңа беттер жоқ.',
+ 'nuke-list' => 'Төмендегі беттерді жуықта [[Special:Contributions/$1|{{GENDER:$1|$1}}]] баÑтаған; пікіріңізді қалдырыңыз және оларды жою үшін батырманы баÑыңыз.',
+ 'nuke-list-multiple' => 'Төмендегі беттерді жуықта баÑталған; пікіріңізді қалдырыңыз және оларды жою үшін батырманы баÑыңыз.',
+ 'nuke-defaultreason' => '[[Special:Contributions/$1|{{GENDER:$1|$1}}]] қоÑқан беттерді жаппай жойды',
+ 'nuke-multiplepeople' => 'Жуырда қоÑылған беттерді жаппай жойды',
+ 'nuke-tools' => 'Бұл құрал оÑÑ‹ қатыÑушының немеÑе IP мекен-жайының Ñоңғы қоÑқан беттерді жаппай жоюға мүмкіндік береді.',
+ 'nuke-submit-user' => 'Өту',
+ 'nuke-submit-delete' => 'Жойылуға таңдалды',
+ 'right-nuke' => 'Беттерді жаппай жой',
+ 'nuke-select' => 'Таңдау: $1',
+ 'nuke-userorip' => 'ҚатыÑушы еÑімі, IP мекенөжай немеÑе Ð±Ð¾Ñ Ð¾Ñ€Ñ‹Ð½',
+ 'nuke-maxpages' => 'Жою мүмкін болатын ең көп беттер Ñаны',
+ 'nuke-editby' => '[[Special:Contributions/$1|{{GENDER:$1|$1}}]] баÑтаған',
+ 'nuke-deleted' => "'''$1''' беті жойылды.",
+ 'nuke-not-deleted' => "[[:$1]] беті '''жойылмады'''.",
+ 'nuke-delete-more' => '[[Special:Nuke|БаÑқа да беттерді жою]]',
+ 'nuke-pattern' => 'Бет атауы үшін өрнек:',
+ 'nuke-nopages-global' => '[[Special:RecentChanges|Жуықтағы өзгеріÑтерде]] жаңа беттер жоқ.',
+ 'nuke-viewchanges' => 'өзгеріÑтерін көру',
+ 'nuke-namespace' => 'ЕÑім кеңіÑтігіндегі шектеулер',
+);
+
/** Khmer (ភាសាážáŸ’មែរ)
* @author Chhorran
* @author Thearith
@@ -1513,7 +1631,7 @@ $messages['kn'] = array(
$messages['ko'] = array(
'nuke' => '문서 대량 삭제',
'action-nuke' => '문서를 대량 삭제할',
- 'nuke-desc' => '관리ìžê°€ 문서를 [[Special:Nuke|대량 ì‚­ì œ]]í•  수 있는 ê¸°ëŠ¥ì„ ì¶”ê°€',
+ 'nuke-desc' => '관리ìžê°€ 문서를 [[Special:Nuke|대량 ì‚­ì œ]]í•  수 있는 ê¸°ëŠ¥ì„ ì¤ë‹ˆë‹¤',
'nuke-nopages' => 'ìµœê·¼ì— [[Special:Contributions/$1|{{GENDER:$1|$1}}]] 사용ìžê°€ 만든 문서가 없습니다.',
'nuke-list' => '다ìŒì€ [[Special:Contributions/$1|{{GENDER:$1|$1}}]] 사용ìžê°€ ìµœê·¼ì— ë§Œë“  문서입니다.
ì‚­ì œì— ëŒ€í•œ ì´ìœ ë¥¼ 입력한 ë‹¤ìŒ ì•„ëž˜ ë²„íŠ¼ì„ í´ë¦­í•´ì£¼ì„¸ìš”.',
@@ -1603,14 +1721,14 @@ $messages['ku-latn'] = array(
* @author Robby
*/
$messages['lb'] = array(
- 'nuke' => 'Masse-Läschung',
+ 'nuke' => 'Masseläschung',
'action-nuke' => "Säiten 'en masse' ze läschen",
'nuke-desc' => "Gëtt Administrateuren d'Méiglechkeet fir [[Special:Nuke|vill Säite mateneen ze läschen]]",
'nuke-nopages' => 'Et gëtt bei de rezenten Ännerunge keng nei Säite vum [[Special:Contributions/$1|{{GENDER:$1|$1}}]].',
'nuke-list' => 'Dës Säite goufe viru kuerzem vum [[Special:Contributions/$1|{{GENDER:$1|$1}}]] nei ugeluecht; gitt w.e.g. eng Bemierkung an, an dréckt op de Knäppche Läschen.',
'nuke-list-multiple' => 'Dës Säite goufe rezent gemaach;
setzt eng Bemierkung derbäi a klickt op de Knäppche fir se ze läschen.',
- 'nuke-defaultreason' => 'Masse-Läschung vu Säiten, déi vum [[Special:Contributions/$1|{{GENDER:$1|$1}}]] ugefaang goufen',
+ 'nuke-defaultreason' => 'Masseläschung vu Säiten, déi vum [[Special:Contributions/$1|{{GENDER:$1|$1}}]] ugefaang goufen',
'nuke-multiplepeople' => 'Masse-Läschung vu Säiten déi rezent derbäi gesat goufen',
'nuke-tools' => "Dësen Tool erlaabt vill Säite mateneen ze läschen, déi vun engem Benotzer oder vun enger IP-Adress ugeluecht goufen.
Gitt w.e.g. d'IP-Adress respektiv de Benotzer u fir eng Lëscht vun de Säiten ze kréien déi geläscht solle ginn, oder loosst et eidel fir all Benotzer.",
@@ -1627,6 +1745,7 @@ Gitt w.e.g. d'IP-Adress respektiv de Benotzer u fir eng Lëscht vun de Säiten z
'nuke-pattern' => 'Muster fir de Säitennumm:',
'nuke-nopages-global' => 'Et si keng nei Säiten an de [[Special:RecentChanges|rezenten Ännerungen]].',
'nuke-viewchanges' => 'Ännerunge weisen',
+ 'nuke-namespace' => 'Op dësen Nummraum limitéieren:',
);
/** Limburgish (Limburgs)
@@ -1782,21 +1901,23 @@ $messages['ml'] = array(
'nuke-pattern' => 'താളിനàµà´±àµ† പേരിനàµà´±àµ† ശൈലി:',
'nuke-nopages-global' => '[[Special:RecentChanges|സമീപകാലമാറàµà´±à´™àµà´™à´³à´¿àµ½]] à´ªàµà´¤à´¿à´¯ താളàµà´•à´³àµŠà´¨àµà´¨àµà´®à´¿à´²àµà´².',
'nuke-viewchanges' => 'മാറàµà´±à´™àµà´™àµ¾ കാണàµà´•',
+ 'nuke-namespace' => 'à´ˆ നാമമേഖലയിൽ à´’à´¤àµà´•àµà´•àµà´•:',
);
/** Marathi (मराठी)
* @author Kaustubh
+ * @author V.narsikar
*/
$messages['mr'] = array(
'nuke' => 'à¤à¤•à¤¦à¤® खूप पाने वगळा',
- 'nuke-desc' => 'पà¥à¤°à¤¬à¤‚धकांना à¤à¤•à¤¾à¤šà¤µà¥‡à¤³à¥€ [[Special:Nuke|अनेक पाने वगळणà¥à¤¯à¤¾à¤šà¥€]] परवानगी देते',
+ 'nuke-desc' => 'पà¥à¤°à¤¬à¤‚धकांना [[Special:Nuke|गठà¥à¤ à¥à¤¯à¤¾à¤¨à¥‡ वगळणà¥à¤¯à¤¾à¤šà¥€(मास डिलीट)]] कà¥à¤·à¤®à¤¤à¤¾ देते',
'nuke-nopages' => '[[Special:Contributions/$1|$1]] कडून अलीकडील बदलांमधà¥à¤¯à¥‡ नवीन पाने नाहीत.', # Fuzzy
'nuke-list' => 'खालील पाने ही [[Special:Contributions/$1|$1]] ने अलिकडे वाढविलेली आहेत; शेरा दà¥à¤¯à¤¾ व वगळणà¥à¤¯à¤¾à¤¸à¤¾à¤ à¥€ कळीवर टिचकी दà¥à¤¯à¤¾.', # Fuzzy
'nuke-defaultreason' => '$1 ने नवीन वाढविलेली अनेक पाने à¤à¤•à¤¾à¤µà¥‡à¤³à¥€ वगळा', # Fuzzy
'nuke-tools' => 'हे उपकरण à¤à¤–ादà¥à¤¯à¤¾ विशिषà¥à¤Ÿ सदसà¥à¤¯ अथवा अंकपतà¥à¤¤à¥à¤¯à¤¾à¤¦à¥à¤µà¤¾à¤°à¥‡ नवीन तयार करणà¥à¤¯à¤¾à¤¤ आलेलà¥à¤¯à¤¾ पानांना à¤à¤•à¤¾à¤šà¤µà¥‡à¤³à¥€ वगळणà¥à¤¯à¤¾à¤šà¥€ संधी देते. सदसà¥à¤¯ नाव अथवा अंकपतà¥à¤¤à¤¾ दिलà¥à¤¯à¤¾à¤¸ वगळणà¥à¤¯à¤¾à¤¸à¤¾à¤ à¥€ पानांची यादी मिळेल:', # Fuzzy
'nuke-submit-user' => 'जा',
'nuke-submit-delete' => 'निवडलेले वगळा',
- 'right-nuke' => 'खूप पाने à¤à¤•à¤¤à¥à¤° वगळा',
+ 'right-nuke' => 'गठà¥à¤ à¥à¤¯à¤¾à¤¨à¥‡ पाने वगळा',
);
/** Malay (Bahasa Melayu)
@@ -1878,7 +1999,7 @@ $messages['nah'] = array(
'nuke-submit-user' => 'YÄuh',
);
-/** Norwegian Bokmål (norsk (bokmål)‎)
+/** Norwegian Bokmål (norsk bokmål)
* @author Event
* @author Nghtwlkr
*/
@@ -1923,14 +2044,14 @@ $messages['nds'] = array(
'right-nuke' => 'Groten Hümpel Sieden wegsmieten',
);
-/** Nedersaksies (Nedersaksies)
+/** Low Saxon (Netherlands) (Nedersaksies)
* @author Servien
*/
$messages['nds-nl'] = array(
'nuke' => 'Massaal vortdoon',
'nuke-desc' => 'Hiermee kunnen beheerders [[Special:Nuke|massaal ziejen vortdoon]]',
- 'nuke-nopages' => 'Gien nieje ziejen van [[Special:Contributions/$1|$1]] in de leste wiezigingen.', # Fuzzy
- 'nuke-defaultreason' => 'Massaal ziejen van $1 vortdoon', # Fuzzy
+ 'nuke-nopages' => 'Gien nieje ziejen van [[Special:Contributions/$1|{{GENDER:$1|$1}}]] in de leste wiezigingen.',
+ 'nuke-defaultreason' => 'Massaal ziejen van [[Special:Contributions/$1|{{GENDER:$1|$1}}]] vortdoon',
'right-nuke' => 'Massaal ziejen vortdoon',
);
@@ -2038,16 +2159,16 @@ $messages['nso'] = array(
$messages['oc'] = array(
'nuke' => 'Supression en massa',
'nuke-desc' => 'Balha la possiblitat als administrators de [[Special:Nuke|suprimir en massa]] de paginas.',
- 'nuke-nopages' => 'Cap de pagina novèla creada per [[Special:Contributions/$1|$1]] dins la lista dels darrièrs cambiaments.', # Fuzzy
- 'nuke-list' => 'Las paginas seguentas son estadas creadas recentament per [[Special:Contributions/$1|$1]]; Indicatz un comentari e clicatz sul boton per los suprimir.', # Fuzzy
- 'nuke-defaultreason' => 'Supression en massa de las paginas apondudas per $1', # Fuzzy
- 'nuke-tools' => 'Aquesta aisina autoriza las supressions en massa de las paginas apondudas recentament per un utilizaire enregistrat o per una adreça IP. Indicatz l’adreça IP per obténer la tièra de las paginas de suprimir :', # Fuzzy
+ 'nuke-nopages' => 'Cap de pagina novèla pas creada per [[Special:Contributions/$1|{{GENDER:$1|$1}}]] dins la lista dels darrièrs cambiaments.',
+ 'nuke-list' => 'Las paginas seguentas son estadas creadas recentament per [[Special:Contributions/$1|{{GENDER:$1|$1}}]]; picatz un comentari e clicatz sul boton per los suprimir.',
+ 'nuke-defaultreason' => 'Supression en massa de las paginas apondudas per [[Special:Contributions/$1|{{GENDER:$1|$1}}]]',
+ 'nuke-tools' => 'Aquesta aisina autoriza las supressions en massa de las paginas apondudas recentament per un utilizaire enregistrat o per una adreça IP. Indicatz l’adreça IP per obténer la lista de las paginas de suprimir, o daissar blanc per totes los utilizaires.',
'nuke-submit-user' => 'Validar',
'nuke-submit-delete' => 'Supression seleccionada',
'right-nuke' => 'Suprimir de paginas en massa',
);
-/** Oriya (ଓଡ଼ିଆ)
+/** Oriya (ଓଡ଼ିଆ)
* @author Jnanaranjan Sahu
* @author Psubhashish
*/
@@ -2084,6 +2205,7 @@ $messages['pdc'] = array(
/** Polish (polski)
* @author Beau
* @author BeginaFelicysym
+ * @author Chrumps
* @author Derbeth
* @author Leinad
* @author Matma Rex
@@ -2103,14 +2225,14 @@ $messages['pl'] = array(
Wpisz powód, a następnie zatwierdź usunięcie stron.',
'nuke-defaultreason' => 'Masowe usunięcie stron stworzonych przez [[Special:Contributions/$1|{{GENDER:$1|$1}}]]',
'nuke-multiplepeople' => 'Masowe usuwanie ostatnio utworzonych stron',
- 'nuke-tools' => 'Narzędzie pozwala na masowe usuwanie stron ostatnio dodanych przez zarejestrowanego lub anonimowego użytkownika.
-Wpisz nazwę użytkownika lub adres IP by otrzymać listę stron do usunięcia. Możesz także nic nie wpisywać, wtedy będzie można masowo usunąć wkład wszystkich użytkowników.',
+ 'nuke-tools' => 'Narzędzie pozwala na masowe usuwanie stron ostatnio dodanych przez zarejestrowanego lub anonimowego użytkownika.<br />
+Wpisz nazwę użytkownika lub adres IP, by otrzymać listę stron do usunięcia. Możesz także nic nie wpisywać, wtedy będzie można masowo usunąć wkład wszystkich użytkowników.',
'nuke-submit-user' => 'Dalej',
'nuke-submit-delete' => 'Usuń zaznaczone',
'right-nuke' => 'Masowe usuwanie stron',
'nuke-select' => 'Wybierz: $1',
'nuke-userorip' => 'Podaj nazwę użytkownika, adres IP lub pozostaw puste pole',
- 'nuke-maxpages' => 'Maksymalna liczba stron',
+ 'nuke-maxpages' => 'Maksymalna liczba stron:',
'nuke-editby' => 'Utworzona przez {{GENDER:$1|użytkownika|użytkowniczkę}} [[Special:Contributions/$1|$1]]',
'nuke-deleted' => "Strona '''$1''' została usunięta.",
'nuke-not-deleted' => "Strony [[:$1]] '''nie można''' usunąć.",
@@ -2157,18 +2279,18 @@ ch'a buta un coment e ch'a sgnaca ël boton për scanceleje.",
* @author Ahmed-Najib-Biabani-Ibrahimkhel
*/
$messages['ps'] = array(
- 'nuke' => 'ټول Ú“Ù†Ú«Ûدنه',
+ 'nuke' => 'ټول Ú“Ù†Ú¯Ûدنه',
'action-nuke' => 'نيوک مخونه',
- 'nuke-multiplepeople' => 'د تازه راګډ شويو مخونو ټول Ú“Ù†Ú«Ûدنه',
+ 'nuke-multiplepeople' => 'د تازه راگډ شويو مخونو ټول Ú“Ù†Ú¯Ûدنه',
'nuke-submit-user' => 'ورÚÙ‡',
- 'nuke-submit-delete' => 'ټاکل شوی ړنګول',
+ 'nuke-submit-delete' => 'ټاکل شوی ړنگول',
'right-nuke' => 'د ډله ايز ړنګون مخونه',
'nuke-select' => 'ټاکل: $1',
'nuke-userorip' => 'کارن-نوم، آي پي پته يا تش:',
'nuke-maxpages' => 'د حد اکثر شمÛر مخونه:',
- 'nuke-deleted' => "د '''$1''' مخ ړنګ شو.",
+ 'nuke-deleted' => "د '''$1''' مخ ړنگ شو.",
'nuke-not-deleted' => "د [[:$1]] مخ '''نشي''' Ú“Ù†Ú«Ûدلی.",
- 'nuke-delete-more' => '[[Special:Nuke|لا نور مخونه ړنګول]]',
+ 'nuke-delete-more' => '[[Special:Nuke|لا نور مخونه ړنگول]]',
'nuke-viewchanges' => 'بدلونونه کتل',
);
@@ -2189,7 +2311,7 @@ introduza um comentário e clique o botão para eliminá-las.',
'nuke-multiplepeople' => 'vários utilizadores', # Fuzzy
'nuke-tools' => 'Esta ferramenta permite a eliminação em massa de páginas criadas recentemente por um utilizador ou IP específico. Forneça o nome de utilizador ou o IP para obter a lista de páginas a eliminar, ou deixe em branco para todos os utilizadores.',
'nuke-submit-user' => 'Ir',
- 'nuke-submit-delete' => 'Eliminar as seleccionadas',
+ 'nuke-submit-delete' => 'Eliminar as selecionadas',
'right-nuke' => 'Eliminar páginas em massa',
'nuke-select' => 'Selecionar: $1',
'nuke-userorip' => 'Utilizador, endereço IP, ou vazio:',
@@ -2200,6 +2322,7 @@ introduza um comentário e clique o botão para eliminá-las.',
);
/** Brazilian Portuguese (português do Brasil)
+ * @author Cainamarques
* @author Carla404
* @author Eduardo.mps
* @author Giro720
@@ -2208,25 +2331,31 @@ introduza um comentário e clique o botão para eliminá-las.',
*/
$messages['pt-br'] = array(
'nuke' => 'Eliminar de forma massiva',
+ 'action-nuke' => 'eliminar páginas de forma massiva',
'nuke-desc' => '[[Special:Nuke|Página especial]] que permite que administradores apaguem páginas de forma massiva',
- 'nuke-nopages' => 'Não há novas páginas criadas por [[Special:Contributions/$1|$1]] nas mudanças recentes.', # Fuzzy
- 'nuke-list' => 'As páginas a seguir foram criadas recentemente por [[Special:Contributions/$1|$1]];
-forneça uma justificativa e clique no botão equivalente para eliminá-las.', # Fuzzy
+ 'nuke-nopages' => 'Não há novas páginas criadas [[Special:Contributions/$1|{{GENDER:$1|pelo usuário $1|pela usuária $1|por $1}}]] nas mudanças recentes.',
+ 'nuke-list' => 'As páginas a seguir foram recentemente criadas [[Special:Contributions/$1|{{GENDER:$1|pelo usuário $1|pela usuária $1|por $1}}]];
+forneça uma justificativa e clique no botão equivalente para eliminá-las.',
'nuke-list-multiple' => 'As páginas a seguir foram criadas recentemente;
forneça uma justificativa e clique no botão equivalente para eliminá-las.',
- 'nuke-defaultreason' => 'Eliminação de forma massiva de páginas criadas por $1', # Fuzzy
- 'nuke-multiplepeople' => 'Eliminação em massa de páginas recentemente adicionadas',
+ 'nuke-defaultreason' => 'Eliminação em massa de páginas criadas [[Special:Contributions/$1|{{GENDER:$1|pelo usuário $1|pela usuária $1|por $1}}]]',
+ 'nuke-multiplepeople' => 'Eliminação em massa de páginas criadas recentemente',
'nuke-tools' => 'Esta ferramenta permite que páginas criadas recentemente por um usuário ou IP específico sejam eliminadas de forma massiva.
Insira um nome de usuário ou IP para listar páginas a eliminar; deixe em branco se deseja listar de todos os usuários.',
'nuke-submit-user' => 'Ir',
- 'nuke-submit-delete' => 'Eliminar as selecionadas',
+ 'nuke-submit-delete' => 'Eliminar selecionadas',
'right-nuke' => 'Eliminar páginas de forma massiva',
'nuke-select' => 'Selecionar: $1',
'nuke-userorip' => 'Nome de usuário, endereço IP ou em branco:',
'nuke-maxpages' => 'Número máximo de páginas:',
- 'nuke-editby' => 'Criada por [[Special:Contributions/$1|$1]]', # Fuzzy
+ 'nuke-editby' => 'Criada [[Special:Contributions/$1|{{GENDER:$1|pelo usuário $1|pela usuária $1|por $1}}]]',
'nuke-deleted' => 'A página ""$1"" foi excluída.',
'nuke-not-deleted' => "A página [[:$1]] '''não pôde''' ser excluída.",
+ 'nuke-delete-more' => '[[Special:Nuke|Eliminar mais páginas]]',
+ 'nuke-pattern' => 'Padrão em nomes de páginas:',
+ 'nuke-nopages-global' => 'Não há novas páginas nas [[Special:RecentChanges|mudanças recentes]].',
+ 'nuke-viewchanges' => 'ver alterações',
+ 'nuke-namespace' => 'Limitar ao espaço nominal:',
);
/** Quechua (Runa Simi)
@@ -2515,6 +2644,7 @@ Vnesite uporabniško ime ali IP, da pridobite seznam strani za izbris, ali pusti
);
/** Serbian (Cyrillic script) (ÑрпÑки (ћирилица)‎)
+ * @author Milicevic01
* @author Millosh
* @author Rancher
* @author Жељко Тодоровић
@@ -2524,7 +2654,7 @@ $messages['sr-ec'] = array(
'action-nuke' => 'маÑовно бриÑање Ñтраница',
'nuke-desc' => 'Даје админиÑтратору могућноÑÑ‚ да [[Special:Nuke|маÑовно брише]] Ñтранице.',
'nuke-nopages' => 'Ðема нових Ñтраница од Ñтране кориÑника [[Special:Contributions/$1|$1]] у Ñкорашњим изменама.', # Fuzzy
- 'nuke-list' => 'Следеће Ñтранице је Ñкоро направио кориÑник [[Special:Contributions/$1|$1]]; коментариши и притиÑни дугме за њихово бриÑање.', # Fuzzy
+ 'nuke-list' => 'Следеће Ñтранице је Ñкоро направио кориÑник [[Special:Contributions/$1|{{GENDER:$1|$1}}]]; оÑтавите коментар и притиÑните дугме за њихово бриÑање.',
'nuke-defaultreason' => 'МаÑовно бриÑање Ñтраница које је направио кориÑник $1', # Fuzzy
'nuke-multiplepeople' => 'МаÑовно бриÑање недавно додатих Ñтраница',
'nuke-tools' => 'Ова алатка омогућава збирно бриÑање Ñтраница које је недавно додао одређени кориÑник (Ñа налогом или без њега).
@@ -2544,6 +2674,7 @@ $messages['sr-ec'] = array(
/** Serbian (Latin script) (srpski (latinica)‎)
* @author Michaello
+ * @author Milicevic01
* @author Жељко Тодоровић
*/
$messages['sr-el'] = array(
@@ -2551,7 +2682,7 @@ $messages['sr-el'] = array(
'action-nuke' => 'masovno brisanje stranica',
'nuke-desc' => 'Daje administratoru mogućnost da [[Special:Nuke|masovno briše]] stranice.',
'nuke-nopages' => 'Nema novih stranica od strane korisnika [[Special:Contributions/$1|$1]] u skorašnjim izmenama.', # Fuzzy
- 'nuke-list' => 'Sledeće stranice je skoro napravio korisnik [[Special:Contributions/$1|$1]]; komentariši i pritisni dugme za njihovo brisanje.', # Fuzzy
+ 'nuke-list' => 'Sledeće stranice je skoro napravio korisnik [[Special:Contributions/$1|{{GENDER:$1|$1}}]]; ostavite komentar i pritisnite dugme za njihovo brisanje.',
'nuke-defaultreason' => 'Masovno brisanje stranica koje je napravio korisnik $1.', # Fuzzy
'nuke-multiplepeople' => 'Masovno brisanje nedavno dodatih stranica',
'nuke-tools' => 'Ova alatka omogućava zbirno brisanje stranica koje je nedavno dodao određeni korisnik (sa nalogom ili bez njega).
@@ -2818,6 +2949,7 @@ $messages['ug-latn'] = array(
/** Ukrainian (українÑька)
* @author AS
+ * @author Aced
* @author Ahonc
* @author Base
* @author Dim Grits
@@ -2841,7 +2973,7 @@ $messages['uk'] = array(
'nuke-submit-delete' => 'Вилучити обрані',
'right-nuke' => 'МаÑове Ð²Ð¸Ð»ÑƒÑ‡ÐµÐ½Ð½Ñ Ñторінок',
'nuke-select' => 'Вибір: $1',
- 'nuke-userorip' => "Ім'Ñ ÐºÐ¾Ñ€Ð¸Ñтувача, IP-адреÑа (за бажаннÑм):",
+ 'nuke-userorip' => "Ім'Ñ ÐºÐ¾Ñ€Ð¸Ñтувача, IP-адреÑа (необов'Ñзковий параметр):",
'nuke-maxpages' => 'МакÑимальна кількіÑÑ‚ÑŒ Ñторінок:',
'nuke-editby' => 'Створено {{GENDER:$1|кориÑтувачем|кориÑтувачкою}} [[Special:Contributions/$1|$1]]',
'nuke-deleted' => "Сторінка '''$1''' була вилучена.",
@@ -2922,14 +3054,15 @@ Hãy nhập tên thành viên hoặc địa chỉ IP để lấy danh sách các
);
/** Volapük (Volapük)
+ * @author Malafaya
* @author Smeira
*/
$messages['vo'] = array(
'nuke' => 'Moükön pademi',
'nuke-desc' => 'Gevon guvanes fägi ad moükön padamödotis',
- 'nuke-nopages' => 'Pads nonik fa geban: [[Special:Contributions/$1|$1]] pejaföls binons su lised votükamas nulik.', # Fuzzy
- 'nuke-list' => 'Pads sököl pejafons brefabüo fa geban: [[Special:Contributions/$1|$1]]; penolös küpeti e klikolös gnobi ad moükön onis.', # Fuzzy
- 'nuke-defaultreason' => 'Moükam padas fa geban: $1 pejafölas', # Fuzzy
+ 'nuke-nopages' => 'Pads nonik fa geban: [[Special:Contributions/$1|{{GENDER:$1|$1}}]] pejaföls binons su lised votükamas nulik.',
+ 'nuke-list' => 'Pads sököl pejafons brefabüo fa geban: [[Special:Contributions/$1|{{GENDER:$1|$1}}]]; penolös küpeti e klikolös gnobi ad moükön onis.',
+ 'nuke-defaultreason' => 'Moükam masifik padas fa [[Special:Contributions/$1|{{GENDER:$1|$1}}]] pejafölas',
'nuke-tools' => 'Stum at kanon moükön mödoti padas fa geban u ladet-IP semik brefabüo pejafölas. Penolös gebananemi u ladeti-IP ad dagetön lisedi padas moükovik:', # Fuzzy
'nuke-submit-user' => 'Ledunolöd',
'nuke-submit-delete' => 'Pevalöl ad pamoükön',
@@ -2986,7 +3119,7 @@ $messages['zh-hans'] = array(
'right-nuke' => '删除大é‡é¡µé¢',
'nuke-select' => '选择:$1',
'nuke-userorip' => '用户åã€IP地å€æˆ–空白:',
- 'nuke-maxpages' => '最多页é¢æ•°ï¼š',
+ 'nuke-maxpages' => '最大页é¢æ•°ï¼š',
'nuke-editby' => '由[[Special:Contributions/$1|{{GENDER:$1|$1}}]]创建',
'nuke-deleted' => "已删除页é¢'''$1'''。",
'nuke-not-deleted' => "'''无法'''删除[[:$1]]页é¢ã€‚",
@@ -2999,6 +3132,7 @@ $messages['zh-hans'] = array(
/** Traditional Chinese (中文(ç¹é«”)‎)
* @author Anakmalaysia
+ * @author Cwlin0416
* @author Justincheng12345
* @author Liangent
* @author Mark85296341
@@ -3012,7 +3146,7 @@ $messages['zh-hant'] = array(
'nuke-list' => '以下的é é¢æ˜¯ç”±[[Special:Contributions/$1|$1]]在以å‰æ‰€å¯«çš„;記下一個註解å†é»žæ“ŠæŒ‰éˆ•åŽ»åˆªé™¤å®ƒå€‘。',
'nuke-list-multiple' => '以下為最近創建的é é¢ï¼Œè«‹å¡«å¯«è¨»é‡‹ä¸¦é»žæ“ŠæŒ‰éˆ•åˆªé™¤å®ƒå€‘。',
'nuke-defaultreason' => '大é‡åˆªé™¤ç”±[[Special:Contributions/$1|$1]]所建立的é é¢',
- 'nuke-multiplepeople' => '大é‡åˆªé™¤æœ€è¿‘添加的é é¢',
+ 'nuke-multiplepeople' => '大é‡åˆªé™¤æœ€è¿‘新增的é é¢',
'nuke-tools' => '此工具å…許大é‡åˆªé™¤æŒ‡å®šç”¨æˆ¶æˆ–IP地å€åœ¨æœ€è¿‘創建的é é¢ã€‚輸入用戶å或IP地å€å¯ç²å–å¯åˆªé™¤é é¢åˆ—表,留白則檢索所有用戶。',
'nuke-submit-user' => '執行',
'nuke-submit-delete' => '刪除已é¸æ“‡çš„',
diff --git a/extensions/ParserFunctions/ParserFunctions.i18n.magic.php b/extensions/ParserFunctions/ParserFunctions.i18n.magic.php
index 4fdb83eb..01a25afb 100644
--- a/extensions/ParserFunctions/ParserFunctions.i18n.magic.php
+++ b/extensions/ParserFunctions/ParserFunctions.i18n.magic.php
@@ -58,25 +58,25 @@ $magicWords['ar'] = array(
/** Egyptian Spoken Arabic (مصرى) */
$magicWords['arz'] = array(
- 'expr' => array( 0, 'تعبير', 'expr' ),
- 'if' => array( 0, 'لو', 'if' ),
- 'ifeq' => array( 0, 'لومعادلة', 'ifeq' ),
- 'ifexpr' => array( 0, 'لوتعبير', 'ifexpr' ),
- 'iferror' => array( 0, 'لوخطأ', 'iferror' ),
- 'switch' => array( 0, 'تبديل', 'switch' ),
- 'default' => array( 0, '#اÙتراضي', '#default' ),
- 'ifexist' => array( 0, 'لوموجود', 'ifexist' ),
- 'time' => array( 0, 'وقت', 'time' ),
- 'timel' => array( 0, 'تيمل', 'timel' ),
- 'rel2abs' => array( 0, 'ريلتوآبس', 'rel2abs' ),
- 'titleparts' => array( 0, 'أجزاء_العنوان', 'titleparts' ),
- 'len' => array( 0, 'لين', 'len' ),
- 'pos' => array( 0, 'بوس', 'pos' ),
- 'rpos' => array( 0, 'آربوس', 'rpos' ),
- 'sub' => array( 0, 'متÙرع', 'sub' ),
- 'count' => array( 0, 'عدد', 'count' ),
- 'replace' => array( 0, 'استبدال', 'replace' ),
- 'explode' => array( 0, 'انÙجار', 'explode' ),
+ 'expr' => array( 0, 'تعبير' ),
+ 'if' => array( 0, 'لو' ),
+ 'ifeq' => array( 0, 'لومعادلة' ),
+ 'ifexpr' => array( 0, 'لوتعبير' ),
+ 'iferror' => array( 0, 'لوخطأ' ),
+ 'switch' => array( 0, 'تبديل' ),
+ 'default' => array( 0, '#اÙتراضي' ),
+ 'ifexist' => array( 0, 'لوموجود' ),
+ 'time' => array( 0, 'وقت' ),
+ 'timel' => array( 0, 'تيمل' ),
+ 'rel2abs' => array( 0, 'ريلتوآبس' ),
+ 'titleparts' => array( 0, 'أجزاء_العنوان' ),
+ 'len' => array( 0, 'لين' ),
+ 'pos' => array( 0, 'بوس' ),
+ 'rpos' => array( 0, 'آربوس' ),
+ 'sub' => array( 0, 'متÙرع' ),
+ 'count' => array( 0, 'عدد' ),
+ 'replace' => array( 0, 'استبدال' ),
+ 'explode' => array( 0, 'انÙجار' ),
);
/** South Azerbaijani (تورکجه) */
@@ -96,19 +96,19 @@ $magicWords['br'] = array(
/** Chechen (нохчийн) */
$magicWords['ce'] = array(
- 'time' => array( 0, 'хан', 'time' ),
- 'replace' => array( 0, 'хийцарна', 'замена', 'replace' ),
+ 'time' => array( 0, 'хан' ),
+ 'replace' => array( 0, 'хийцарна', 'замена' ),
);
-/** Czech (Äesky) */
+/** Czech (ÄeÅ¡tina) */
$magicWords['cs'] = array(
- 'expr' => array( 0, 'výraz', 'expr' ),
- 'if' => array( 0, 'když', 'if' ),
- 'ifexist' => array( 0, 'kdyžexist', 'ifexist' ),
- 'time' => array( 0, 'Äas', 'time' ),
- 'len' => array( 0, 'délka', 'len' ),
- 'count' => array( 0, 'poÄet', 'count' ),
- 'replace' => array( 0, 'nahradit', 'replace' ),
+ 'expr' => array( 0, 'výraz' ),
+ 'if' => array( 0, 'když' ),
+ 'ifexist' => array( 0, 'kdyžexist' ),
+ 'time' => array( 0, 'Äas' ),
+ 'len' => array( 0, 'délka' ),
+ 'count' => array( 0, 'poÄet' ),
+ 'replace' => array( 0, 'nahradit' ),
);
/** German (Deutsch) */
@@ -120,6 +120,12 @@ $magicWords['de'] = array(
'urldecode' => array( 0, 'URLDEKODIERT:' ),
);
+/** Zazaki (Zazaki) */
+$magicWords['diq'] = array(
+ 'if' => array( 0, 'se' ),
+ 'ifeq' => array( 0, 'sek' ),
+);
+
/** Esperanto (Esperanto) */
$magicWords['eo'] = array(
'expr' => array( 0, 'espr', 'esprimo' ),
@@ -174,6 +180,30 @@ $magicWords['fa'] = array(
'urldecode' => array( 0, 'نشانی‌بی‌کد' ),
);
+/** French (français) */
+$magicWords['fr'] = array(
+ 'expr' => array( 0, 'expr' ),
+ 'if' => array( 0, 'si' ),
+ 'ifeq' => array( 0, 'si=' ),
+ 'ifexpr' => array( 0, 'siexpr' ),
+ 'iferror' => array( 0, 'sierreur' ),
+ 'switch' => array( 0, 'selon' ),
+ 'default' => array( 0, '#défaut' ),
+ 'ifexist' => array( 0, 'siexiste' ),
+ 'time' => array( 0, 'heure' ),
+ 'timel' => array( 0, 'heurel' ),
+ 'rel2abs' => array( 0, 'relenabs' ),
+ 'titleparts' => array( 0, 'partiestitre' ),
+ 'len' => array( 0, 'nbcar' ),
+ 'pos' => array( 0, 'pos' ),
+ 'rpos' => array( 0, 'posr' ),
+ 'sub' => array( 0, 'stxt' ),
+ 'count' => array( 0, 'nb' ),
+ 'replace' => array( 0, 'remplacer' ),
+ 'explode' => array( 0, 'exploser' ),
+ 'urldecode' => array( 0, 'décoderurl', 'decodeurl' ),
+);
+
/** Hebrew (עברית) */
$magicWords['he'] = array(
'expr' => array( 0, 'חשב' ),
@@ -208,17 +238,17 @@ $magicWords['hu'] = array(
/** Indonesian (Bahasa Indonesia) */
$magicWords['id'] = array(
- 'expr' => array( 0, 'hitung', 'expr' ),
- 'if' => array( 0, 'jika', 'if' ),
- 'ifeq' => array( 0, 'jikasama', 'ifeq' ),
- 'ifexpr' => array( 0, 'jikahitung', 'ifexpr' ),
- 'iferror' => array( 0, 'jikasalah', 'iferror' ),
- 'switch' => array( 0, 'pilih', 'switch' ),
- 'default' => array( 0, '#baku', '#default' ),
- 'ifexist' => array( 0, 'jikaada', 'ifexist' ),
- 'time' => array( 0, 'waktu', 'time' ),
- 'timel' => array( 0, 'waktu1', 'timel' ),
- 'titleparts' => array( 0, 'bagianjudul', 'titleparts' ),
+ 'expr' => array( 0, 'hitung' ),
+ 'if' => array( 0, 'jika' ),
+ 'ifeq' => array( 0, 'jikasama' ),
+ 'ifexpr' => array( 0, 'jikahitung' ),
+ 'iferror' => array( 0, 'jikasalah' ),
+ 'switch' => array( 0, 'pilih' ),
+ 'default' => array( 0, '#baku' ),
+ 'ifexist' => array( 0, 'jikaada' ),
+ 'time' => array( 0, 'waktu' ),
+ 'timel' => array( 0, 'waktu1' ),
+ 'titleparts' => array( 0, 'bagianjudul' ),
);
/** Igbo (Igbo) */
@@ -343,8 +373,9 @@ $magicWords['mk'] = array(
/** Malayalam (മലയാളം) */
$magicWords['ml'] = array(
+ 'expr' => array( 0, 'à´¦àµà´¯àµ‹à´¤à´•à´‚' ),
'if' => array( 0, 'à´Žà´™àµà´•à´¿àµ½' ),
- 'ifeq' => array( 0, 'സമെമെങàµà´•à´¿àµ½' ),
+ 'ifeq' => array( 0, 'സമമെങàµà´•à´¿àµ½' ),
'ifexpr' => array( 0, 'à´Žà´•àµà´¸àµà´ªàµà´°àµ†à´·à´¨àµ†à´™àµà´•à´¿àµ½' ),
'iferror' => array( 0, 'പിഴവെങàµà´•à´¿àµ½' ),
'switch' => array( 0, 'മാറàµà´±àµà´•' ),
@@ -352,10 +383,14 @@ $magicWords['ml'] = array(
'ifexist' => array( 0, 'ഉണàµà´Ÿàµ†à´™àµà´•à´¿àµ½' ),
'time' => array( 0, 'സമയം' ),
'timel' => array( 0, 'സമയം|' ),
+ 'len' => array( 0, 'നീളം' ),
+ 'pos' => array( 0, 'à´¸àµà´¥à´¾à´¨à´‚' ),
+ 'rpos' => array( 0, 'ആപേകàµà´·à´¿à´•à´¸àµà´¥à´¾à´¨à´‚' ),
'sub' => array( 0, 'ഉപം' ),
'count' => array( 0, 'à´Žà´£àµà´£àµà´•' ),
'replace' => array( 0, 'മാറàµà´±à´¿à´šàµà´šàµ‡àµ¼à´•àµà´•àµà´•' ),
'explode' => array( 0, 'വിസàµà´«àµ‹à´Ÿà´¨à´‚' ),
+ 'urldecode' => array( 0, 'വിലാസഗൂഢീകരണമൊഴിവാകàµà´•àµ½' ),
);
/** Marathi (मराठी) */
@@ -382,15 +417,15 @@ $magicWords['mr'] = array(
/** Low Saxon (Netherlands) (Nedersaksies) */
$magicWords['nds-nl'] = array(
- 'if' => array( 0, 'as', 'als' ),
- 'ifeq' => array( 0, 'asgelieke', 'alsgelijk' ),
- 'ifexpr' => array( 0, 'asexpressie', 'alsexpressie' ),
- 'iferror' => array( 0, 'asfout', 'alsfout' ),
- 'default' => array( 0, '#standard', '#standaard' ),
- 'ifexist' => array( 0, 'asbesteet', 'alsbestaat' ),
- 'time' => array( 0, 'tied', 'tijd' ),
- 'timel' => array( 0, 'tiedl', 'tijdl' ),
- 'rel2abs' => array( 0, 'relatiefnaorabseluut', 'relatiefnaarabsoluut' ),
+ 'if' => array( 0, 'as' ),
+ 'ifeq' => array( 0, 'asgelieke' ),
+ 'ifexpr' => array( 0, 'asexpressie' ),
+ 'iferror' => array( 0, 'asfout' ),
+ 'default' => array( 0, '#standard' ),
+ 'ifexist' => array( 0, 'asbesteet' ),
+ 'time' => array( 0, 'tied' ),
+ 'timel' => array( 0, 'tiedl' ),
+ 'rel2abs' => array( 0, 'relatiefnaorabseluut' ),
);
/** Dutch (Nederlands) */
@@ -415,10 +450,10 @@ $magicWords['nl'] = array(
/** Norwegian Nynorsk (norsk nynorsk) */
$magicWords['nn'] = array(
- 'expr' => array( 0, 'uttrykk' ),
+ 'expr' => array( 0, 'uttrykk', 'uttr' ),
'if' => array( 0, 'om' ),
'ifeq' => array( 0, 'omlik' ),
- 'ifexpr' => array( 0, 'omuttrykk' ),
+ 'ifexpr' => array( 0, 'omuttrykk', 'omuttr' ),
'iferror' => array( 0, 'omfeil' ),
'switch' => array( 0, 'byt' ),
'ifexist' => array( 0, 'omfinst' ),
@@ -427,7 +462,7 @@ $magicWords['nn'] = array(
'rel2abs' => array( 0, 'reltilabs' ),
'titleparts' => array( 0, 'titteldelar' ),
'len' => array( 0, 'lengd' ),
- 'replace' => array( 0, 'erstatt' ),
+ 'replace' => array( 0, 'byt_ut', 'erstatt' ),
);
/** Oriya (ଓଡ଼ିଆ) */
@@ -449,14 +484,14 @@ $magicWords['ps'] = array(
/** Portuguese (português) */
$magicWords['pt'] = array(
- 'if' => array( 0, 'se', 'if' ),
- 'ifeq' => array( 0, 'seigual', 'ifeq' ),
- 'ifexpr' => array( 0, 'seexpr', 'ifexpr' ),
- 'iferror' => array( 0, 'seerro', 'iferror' ),
- 'default' => array( 0, '#padrão', '#padrao', '#default' ),
- 'ifexist' => array( 0, 'seexiste', 'ifexist' ),
- 'titleparts' => array( 0, 'partesdotítulo', 'partesdotitulo', 'titleparts' ),
- 'len' => array( 0, 'comprimento', 'len' ),
+ 'if' => array( 0, 'se' ),
+ 'ifeq' => array( 0, 'seigual' ),
+ 'ifexpr' => array( 0, 'seexpr' ),
+ 'iferror' => array( 0, 'seerro' ),
+ 'default' => array( 0, '#padrão', '#padrao' ),
+ 'ifexist' => array( 0, 'seexiste' ),
+ 'titleparts' => array( 0, 'partesdotítulo', 'partesdotitulo' ),
+ 'len' => array( 0, 'comprimento' ),
);
/** Russian (руÑÑкий) */
@@ -545,22 +580,22 @@ $magicWords['uz'] = array(
/** Vietnamese (Tiếng Việt) */
$magicWords['vi'] = array(
- 'expr' => array( 0, 'côngthức' ),
+ 'expr' => array( 0, 'công_thức', 'côngthức' ),
'if' => array( 0, 'nếu' ),
- 'ifeq' => array( 0, 'nếubằng' ),
- 'ifexpr' => array( 0, 'nếucôngthức' ),
- 'iferror' => array( 0, 'nếulỗi' ),
- 'default' => array( 0, '#mặcđịnh' ),
- 'ifexist' => array( 0, 'nếutồntại' ),
+ 'ifeq' => array( 0, 'nếu_bằng', 'nếubằng' ),
+ 'ifexpr' => array( 0, 'nếu_công_thức', 'nếucôngthức' ),
+ 'iferror' => array( 0, 'nếu_lỗi', 'nếulỗi' ),
+ 'default' => array( 0, '#mặc_định', '#mặcđịnh' ),
+ 'ifexist' => array( 0, 'nếu_tồn_tại', 'nếutồntại' ),
'time' => array( 0, 'giá»' ),
- 'timel' => array( 0, 'giá»Ä‘ịaphÆ°Æ¡ng' ),
- 'len' => array( 0, 'sốchữ', 'sốkýtự', 'sốkítự' ),
- 'pos' => array( 0, 'vịtrí' ),
- 'rpos' => array( 0, 'vịtríphải' ),
- 'sub' => array( 0, 'chuá»—icon' ),
+ 'timel' => array( 0, 'giá»_địa_phÆ°Æ¡ng', 'giá»Ä‘ịaphÆ°Æ¡ng' ),
+ 'len' => array( 0, 'số_chữ', 'sốchữ', 'số_ký_tự', 'sốkýtự', 'số_kí_tự', 'sốkítự' ),
+ 'pos' => array( 0, 'vị_trí', 'vịtrí' ),
+ 'rpos' => array( 0, 'vị_trí_phải', 'vịtríphải' ),
+ 'sub' => array( 0, 'chuá»—i_con', 'chuá»—icon' ),
'count' => array( 0, 'số' ),
- 'replace' => array( 0, 'thaythế' ),
- 'urldecode' => array( 0, 'giảimãurl' ),
+ 'replace' => array( 0, 'thay_thế', 'thaythế' ),
+ 'urldecode' => array( 0, 'giải_mã_url', 'giảimãurl' ),
);
/** Yiddish (ייִדיש) */
@@ -593,4 +628,11 @@ $magicWords['zh'] = array(
'count' => array( 0, '计数' ),
'replace' => array( 0, '替æ¢' ),
'explode' => array( 0, '爆炸', '炸开' ),
+);
+
+/** Simplified Chinese (中文(简体)‎) */
+$magicWords['zh-hans'] = array(
+ 'ifeq' => array( 0, '若相等', '如果相等' ),
+ 'default' => array( 0, '#默认' ),
+ 'ifexist' => array( 0, '若有', '如果存在' ),
); \ No newline at end of file
diff --git a/extensions/ParserFunctions/ParserFunctions.i18n.php b/extensions/ParserFunctions/ParserFunctions.i18n.php
index 3bac1a8d..bc3d200d 100644
--- a/extensions/ParserFunctions/ParserFunctions.i18n.php
+++ b/extensions/ParserFunctions/ParserFunctions.i18n.php
@@ -235,7 +235,7 @@ $messages['arz'] = array(
'pfunc_expr_not_a_number' => 'ÙÙ‰ $1: النتيجه مش رقم',
);
-/** Assamese (অসমীয়া)
+/** Assamese (অসমীয়া)
* @author Bishnu Saikia
* @author Rajuonline
*/
@@ -352,16 +352,45 @@ $messages['bcc'] = array(
'pfunc_expr_not_a_number' => 'ته $1: نتیجه یک عددی نهنت',
);
+/** Bikol Central (Bikol Central)
+ * @author Geopoet
+ */
+$messages['bcl'] = array(
+ 'pfunc_desc' => 'Minapabuswang kan parabangay na igwang lohikal na mga punksyon',
+ 'pfunc_time_error' => 'Kasalaan: Imbalidong oras.',
+ 'pfunc_time_too_long' => 'Kasalaan:Grabe kadakol na #time na mga apod.',
+ 'pfunc_time_too_big' => 'Kasalaan: #time minasuporta sana nin mga taon sagkod sa 9999.',
+ 'pfunc_time_too_small' => 'Kasalaan: #time minasuporta sana nin mga taon magpoon 0.',
+ 'pfunc_rel2abs_invalid_depth' => 'Kasalaan:Imbalidong rarom nin agihan: "$1" (nagprubar na makalaog sa sarong boko-boko sa ibabaw kan ugat nin boko-boko).',
+ 'pfunc_expr_stack_exhausted' => 'Kasalaan sa pagpapasabot:An bangay ubos na.',
+ 'pfunc_expr_unexpected_number' => 'Kasalaan sa pagpapasabot: Dae pinag-asahang numero.',
+ 'pfunc_expr_preg_match_failure' => 'Kasalaan nin pagpapasabot: Dae pinag-aasahang pagpalya kan preg_match.',
+ 'pfunc_expr_unrecognised_word' => 'Kasalaan nin pagpapasabot: Dae rekonosidong tataramon an "$1".',
+ 'pfunc_expr_unexpected_operator' => 'Kasalaan nin pagpapasabot: Dae pinag-asahan an $1 na operador.',
+ 'pfunc_expr_missing_operand' => 'Kasalaan nin pagpapasabot: Nawawara an halaga para sa $1.',
+ 'pfunc_expr_unexpected_closing_bracket' => 'Kasalaan nin pagpapasabot: Dae pinag-asahang pagseserado kan pangudal.',
+ 'pfunc_expr_unrecognised_punctuation' => 'Kasalaan nin pagpapasabot: Dae rekonosidong panbalangkay na karakter an "$1".',
+ 'pfunc_expr_unclosed_bracket' => 'Kasalaan nin pagpapasabot: Dae nakaseradong pangudal.',
+ 'pfunc_expr_division_by_zero' => 'Barangaan sa paagi ni sero.',
+ 'pfunc_expr_invalid_argument' => 'Imbalidong argumento para sa $1: < -1 or > 1.',
+ 'pfunc_expr_invalid_argument_ln' => 'Imbalidong argumento para sa ln: <= 0.',
+ 'pfunc_expr_unknown_error' => 'Kasalaan nin pagpapasabot:Dae aram na kasalaan ($1).',
+ 'pfunc_expr_not_a_number' => 'Sa $1:An resulta bako sarong numero.',
+ 'pfunc_string_too_long' => 'Kasalaan:An panunod nagsobra sa $1 na limit nin karakter.',
+);
+
/** Belarusian (TaraÅ¡kievica orthography) (беларуÑÐºÐ°Ñ (тарашкевіца)‎)
* @author EugeneZelenko
* @author Jim-by
* @author Red Winged Duck
+ * @author Wizardist
*/
$messages['be-tarask'] = array(
'pfunc_desc' => 'Палепшаны парÑÑÑ€ зь лÑгічнымі функцыÑмі',
'pfunc_time_error' => 'Памылка: нÑÑлушны чаÑ',
'pfunc_time_too_long' => 'Памылка: зашмат выклікаў функцыі #time',
'pfunc_time_too_big' => 'Памылка: #time падтрымлівае гады толькі Ñž дыÑпазоне да 9999',
+ 'pfunc_time_too_small' => 'Памылка: #time падтрымлівае толькі гады ад 0.',
'pfunc_rel2abs_invalid_depth' => 'Памылка: нÑÑÐ»ÑƒÑˆÐ½Ð°Ñ Ð³Ð»Ñ‹Ð±Ñ–Ð½Ñ ÑˆÐ»Ñху: «$1» (Ñпроба доÑтупу да вузла, Ñкі знаходзіцца вышÑй карÑннага)',
'pfunc_expr_stack_exhausted' => 'Памылка выразу: ÑÑ‚Ñк перапоўнены',
'pfunc_expr_unexpected_number' => 'Памылка выразу: Ð½ÐµÑ‡Ð°ÐºÐ°Ð½Ð°Ñ Ð»Ñ–Ñ‡Ð±Ð°',
@@ -513,11 +542,14 @@ $messages['ca'] = array(
/** Chechen (нохчийн)
* @author Sasan700
+ * @author Умар
*/
$messages['ce'] = array(
'pfunc_time_error' => 'Гlалато: хан нийÑа Ñц',
'pfunc_expr_stack_exhausted' => 'Яздарехь гlалат ду: хьаладуьззина татол',
'pfunc_expr_unrecognised_word' => 'Яздарехь гlалат ду: дойзуш доцу дош «$1»',
+ 'pfunc_expr_unexpected_operator' => 'Дешнийн гӀалам : ца хаа оператор $1',
+ 'pfunc_expr_unrecognised_punctuation' => 'Дешнашан гӀалат: евзина йоцу пунктуацин Ñимвол «$1»',
);
/** Czech (Äesky)
@@ -550,6 +582,21 @@ $messages['cs'] = array(
'pfunc_string_too_long' => 'Chyba: Řetězec je delší než $1 {{PLURAL:$1|znak|znaky|znaků}}, což je limit',
);
+/** Welsh (Cymraeg)
+ * @author Lloffiwr
+ */
+$messages['cy'] = array(
+ 'pfunc_time_error' => 'Gwall: Amser annilys',
+ 'pfunc_time_too_long' => 'Gwall: Gormod o alwadau #time.',
+ 'pfunc_time_too_big' => 'Gwall: nid yw #time yn cynnal blynyddoedd wedi 9999.',
+ 'pfunc_time_too_small' => 'Gwall: nid yw #time yn cynnal blynyddoedd cyn 0.',
+ 'pfunc_expr_unexpected_number' => 'Gwall yn y mynegiad: Rhif annisgwyl.',
+ 'pfunc_expr_unclosed_bracket' => 'Gwall yn y mynegiad: Cromfach heb ei gau.',
+ 'pfunc_expr_division_by_zero' => 'Yn rhannu gyda sero.',
+ 'pfunc_expr_unknown_error' => 'Gwall yn y mynegiad: Gwall anhysbys ($1).',
+ 'pfunc_expr_not_a_number' => "Yn $1: Nid yw'r canlyniad yn rhif.",
+);
+
/** Danish (dansk)
* @author Byrial
* @author HenrikKbh
@@ -622,12 +669,14 @@ $messages['de-ch'] = array(
/** Zazaki (Zazaki)
* @author Aspar
* @author Erdemaslancan
+ * @author Gorizon
*/
$messages['diq'] = array(
'pfunc_desc' => 'Peserkerden fonksiyanane mantıxin weş kere',
'pfunc_time_error' => 'xeta: zemano nemeqbul',
'pfunc_time_too_long' => 'xeta:zaf zêd mesajê #timeyi',
'pfunc_time_too_big' => 'Xırabin: #time honke qebuliya cı hetana 9999.',
+ 'pfunc_time_too_small' => 'Xırab: #time ancağ 0 serra beno qebul.',
'pfunc_rel2abs_invalid_depth' => 'Hata: Yolda geçersiz derinlik: "$1" (kök düğümünün üstünde bir düğüme erişmeye çalıştı)',
'pfunc_expr_stack_exhausted' => 'xetaya ifadeyi: stack qediya',
'pfunc_expr_unexpected_number' => 'xetaya ifadeyi: amaro bêtexmin',
@@ -816,14 +865,16 @@ $messages['eu'] = array(
* @author Amire80
* @author Ebraminio
* @author Huji
+ * @author Reza1615
* @author Wayiran
*/
$messages['fa'] = array(
'pfunc_desc' => 'به تجزیه‌گر، دستورهای منطقی می‌اÙزاید',
- 'pfunc_time_error' => 'خطا: زمان غیرمجاز',
+ 'pfunc_time_error' => 'خطا: زمان نامجاز',
'pfunc_time_too_long' => 'خطا: Ùراخوانی بیش از حد #time',
'pfunc_time_too_big' => 'خطا: #زمان تا سال Û¹Û¹Û¹Û¹ را Ùقط حمایت می‌کند.',
- 'pfunc_rel2abs_invalid_depth' => 'خطا: عمق غیر مجاز در نشانی «$1» (تلاش برای دسترسی به یک نشانی Ùراتر از نشانی ریشه)',
+ 'pfunc_time_too_small' => 'خطا: #time تنها از سال 0 به بعد را پشتیبانی می‌کند.',
+ 'pfunc_rel2abs_invalid_depth' => 'خطا: عمق نامجاز در نشانی «$1» (تلاش برای دسترسی به یک نشانی Ùراتر از نشانی ریشه)',
'pfunc_expr_stack_exhausted' => 'خطای عبارت: پشته از دست رÙته',
'pfunc_expr_unexpected_number' => 'خطای عبارت: عدد دور از انتظار',
'pfunc_expr_preg_match_failure' => 'خطای عبارت: خطای preg_match دور از انتظار',
@@ -834,8 +885,8 @@ $messages['fa'] = array(
'pfunc_expr_unrecognised_punctuation' => 'خطای عبارت: نویسه نقطه‌گذاری شناخته نشده «$1»',
'pfunc_expr_unclosed_bracket' => 'خطای عبارت: پرانتز بسته‌نشده',
'pfunc_expr_division_by_zero' => 'تقسیم بر صÙر',
- 'pfunc_expr_invalid_argument' => 'پارامتر غیر مجاز برای $1: < -۱ یا > ۱',
- 'pfunc_expr_invalid_argument_ln' => 'پارامتر غیر مجاز برای لگاریتم طبیعی: <= صÙر',
+ 'pfunc_expr_invalid_argument' => 'پارامتر نامجاز برای $1: < -۱ یا > ۱',
+ 'pfunc_expr_invalid_argument_ln' => 'پارامتر نامجاز برای لگاریتم طبیعی: <= صÙر',
'pfunc_expr_unknown_error' => 'خطای عبارت: خطای ناشناخته ($1)',
'pfunc_expr_not_a_number' => 'در $1: نتیجه عدد نیست',
'pfunc_string_too_long' => 'خطا: رشته از محدودیت نویسه‌ای $1 تجاوز می‌کند',
@@ -844,6 +895,7 @@ $messages['fa'] = array(
/** Finnish (suomi)
* @author Agony
* @author Cimon Avaro
+ * @author Linnea
* @author Nike
* @author VezonThunder
*/
@@ -852,6 +904,7 @@ $messages['fi'] = array(
'pfunc_time_error' => 'Virhe: kelvoton aika',
'pfunc_time_too_long' => 'Virhe: liian monta #time-kutsua',
'pfunc_time_too_big' => 'Virhe: #time tukee vuosilukuja vain vuoteen 9999 asti.',
+ 'pfunc_time_too_small' => 'Virhe: #time tukee vain vuosia 0:sta eteenpäin.',
'pfunc_rel2abs_invalid_depth' => 'Virhe: Virheellinen syvyys polussa: $1 (ei juurisolmun sisällä)',
'pfunc_expr_stack_exhausted' => 'Virhe lausekkeessa: pino loppui',
'pfunc_expr_unexpected_number' => 'Virhe lausekkeessa: odottamaton numero',
@@ -1180,6 +1233,33 @@ $messages['id'] = array(
'pfunc_string_too_long' => 'Kesalahan: String melebihi limit $1 karakter',
);
+/** Iloko (Ilokano)
+ * @author Lam-ang
+ */
+$messages['ilo'] = array(
+ 'pfunc_desc' => 'Napasayaat a parser nga adda kadagiti lohikal nga annong',
+ 'pfunc_time_error' => 'Biddut: Imbalido nga oras.',
+ 'pfunc_time_too_long' => 'Biddut: Adu unay dagiti panagtawag ti #time.',
+ 'pfunc_time_too_big' => 'Biddut: Ti #time ket suportaranna laeng dagiti tawen aginggana iti 9999.',
+ 'pfunc_time_too_small' => 'Biddut: ti #time ket suportaranna laeng dagiti tawen manipud ti 0.',
+ 'pfunc_rel2abs_invalid_depth' => 'Biddut: Imbalido a kauneg iti dalan: "$1" (nagpadas a nangserrek ti nodo iti ngato ti ramut a nodo).',
+ 'pfunc_expr_stack_exhausted' => 'Biddut a panangiyebkas: Naibusen ti tuon.',
+ 'pfunc_expr_unexpected_number' => 'Biddut a panangiyebkas:Di nanamnama a bilang.',
+ 'pfunc_expr_preg_match_failure' => 'Biddut a panangiyebkas: Di nanamnama a pannakapaay ti preg_match.',
+ 'pfunc_expr_unrecognised_word' => 'Biddut a panangiyebkas: Di mabigbigan a balikas ti "$1".',
+ 'pfunc_expr_unexpected_operator' => 'Biddut a panangiyebkas: Di nanamnama nga operator ti $1.',
+ 'pfunc_expr_missing_operand' => 'Biddut a panangiyebkas: Napukaw nga operand para iti $1.',
+ 'pfunc_expr_unexpected_closing_bracket' => 'Biddut a panangiyebkas: Di nanamnama a pangrikep a braket.',
+ 'pfunc_expr_unrecognised_punctuation' => 'Biddut a panangiyebkas: Di nanamnama a karakter ti tuldek ti "$1".',
+ 'pfunc_expr_unclosed_bracket' => 'Biddut a panangiyebkas: Di narikpan a braket.',
+ 'pfunc_expr_division_by_zero' => 'Panagbingbingay babaen ti sero.',
+ 'pfunc_expr_invalid_argument' => 'Imbalido nga argumento para iti $1: < -1 wenno > 1.',
+ 'pfunc_expr_invalid_argument_ln' => 'Imbalido nga argumento para iti ln: <= 0.',
+ 'pfunc_expr_unknown_error' => 'Biddut a panangiyebkas: Di ammo a biddut ($1).',
+ 'pfunc_expr_not_a_number' => 'Iti $1: Ti resulta ket saan a bilang.',
+ 'pfunc_string_too_long' => 'Biddut: Ti kuerdas ket nasurokanna ti limitado ti karakter iti $1.',
+);
+
/** Ido (Ido)
* @author Malafaya
*/
@@ -1383,9 +1463,9 @@ $messages['km'] = array(
$messages['ko'] = array(
'pfunc_desc' => 'íŒŒì„œì— ë…¼ë¦¬ 함수를 추가합니다',
'pfunc_time_error' => '오류: ì‹œê°„ì´ ìž˜ëª»ë˜ì—ˆìŠµë‹ˆë‹¤.',
- 'pfunc_time_too_long' => '오류: #timeì„ ë„ˆë¬´ ë§Žì´ ì¼ìŠµë‹ˆë‹¤.',
+ 'pfunc_time_too_long' => '오류: #timeì„ ë„ˆë¬´ ë§Žì´ í˜¸ì¶œí–ˆìŠµë‹ˆë‹¤.',
'pfunc_time_too_big' => '오류: #time 함수는 9999ë…„ê¹Œì§€ë§Œì„ ì§€ì›í•©ë‹ˆë‹¤.',
- 'pfunc_time_too_small' => '오류: #timeì€ 0년부터만 지ì›í•©ë‹ˆë‹¤.',
+ 'pfunc_time_too_small' => '오류: #timeì€ 0ë…„ë¶€í„°ë§Œì„ ì§€ì›í•©ë‹ˆë‹¤.',
'pfunc_rel2abs_invalid_depth' => '오류: 경로 구조가 잘못ë˜ì—ˆìŠµë‹ˆë‹¤: "$1" (루트 노드 ìœ„ì˜ ë…¸ë“œì— ì ‘ì†ì„ ì‹œë„했습니다)',
'pfunc_expr_stack_exhausted' => '표현 오류: 스íƒì´ 비어 있습니다.',
'pfunc_expr_unexpected_number' => 'í‘œí˜„ì‹ ì˜¤ë¥˜: 예ìƒì¹˜ 못한 숫ìžìž…니다.',
@@ -1401,7 +1481,7 @@ $messages['ko'] = array(
'pfunc_expr_invalid_argument_ln' => 'ìžì—°ë¡œê·¸ì˜ 진수가 잘못ë˜ì—ˆìŠµë‹ˆë‹¤: <= 0',
'pfunc_expr_unknown_error' => '표현 오류: 알 수 없는 오류($1)입니다.',
'pfunc_expr_not_a_number' => '$1: 결과가 숫ìžê°€ 아닙니다.',
- 'pfunc_string_too_long' => '오류: $1ìž ì œí•œì„ ì´ˆê³¼í•˜ì˜€ìŠµë‹ˆë‹¤.',
+ 'pfunc_string_too_long' => '오류: 문ìžì—´ì´ $1 ê¸€ìž ì œí•œì„ ì´ˆê³¼í•˜ì˜€ìŠµë‹ˆë‹¤.',
);
/** Colognian (Ripoarisch)
@@ -1434,12 +1514,14 @@ $messages['ksh'] = array(
/** Luxembourgish (Lëtzebuergesch)
* @author Robby
+ * @author Soued031
*/
$messages['lb'] = array(
- 'pfunc_desc' => 'Erweidert Parser mat logesche Fonctiounen',
+ 'pfunc_desc' => 'Erweidert Parser mat logesche Funktiounen',
'pfunc_time_error' => 'Feeler: ongëlteg Zäit',
'pfunc_time_too_long' => 'Feeler: ze dacks #time opgeruff',
'pfunc_time_too_big' => 'Feeler: #time ënnerstëtzt nëmme Jore bis 9999',
+ 'pfunc_time_too_small' => 'Feeler: #time ënnerstëtzt nëmme Jore vun 0 un.',
'pfunc_expr_stack_exhausted' => 'Expressiouns-Feeler: Stack iwwergelaf',
'pfunc_expr_unexpected_number' => 'Expressiouns-Feeler: Onerwarten Zuel',
'pfunc_expr_unrecognised_word' => 'Expressiouns-Feeler: Onerkantent Wuert "$1"',
@@ -1498,6 +1580,13 @@ $messages['lv'] = array(
'pfunc_expr_division_by_zero' => 'Dalīšana ar nulli',
);
+/** Minangkabau (Baso Minangkabau)
+ * @author Iwan Novirion
+ */
+$messages['min'] = array(
+ 'pfunc_time_error' => 'Kasalahan: wakatu indak tapek',
+);
+
/** Macedonian (македонÑки)
* @author Bjankuloski06
* @author Brest
@@ -1535,6 +1624,7 @@ $messages['ml'] = array(
'pfunc_time_error' => 'പിഴവàµ:അസാധàµà´µà´¾à´¯ സമയം',
'pfunc_time_too_long' => 'പിഴവàµ: വളരെയധികം #സമയ കാളàµà´•àµ¾',
'pfunc_time_too_big' => 'പിഴവàµ: 9999 വരെയàµà´³àµà´³ വർഷങàµà´™àµ¾ മാതàµà´°à´®àµ‡ #time പിനàµà´¤àµà´£à´¯àµà´•àµà´•àµà´¨àµà´¨àµà´³àµà´³àµ',
+ 'pfunc_time_too_small' => 'പിഴവàµ: 0 à´®àµà´¤à´²àµà´³àµà´³ വർഷങàµà´™àµ¾ മാതàµà´°à´®àµ‡ #time പിനàµà´¤àµà´£à´¯àµà´•àµà´•àµà´¨àµà´¨àµà´³àµà´³àµ.',
'pfunc_rel2abs_invalid_depth' => 'പിഴവàµ: പഥതàµà´¤à´¿àµ½ അസാധàµà´µà´¾à´¯ ആഴം: "$1" (റൂടàµà´Ÿàµ തലതàµà´¤à´¿à´¨àµà´‚ à´®àµà´•à´³à´¿à´²àµà´³àµà´³ തലം à´Žà´Ÿàµà´•àµà´•à´¾à´¨àµà´³àµà´³ à´¶àµà´°à´®à´‚)',
'pfunc_expr_stack_exhausted' => 'à´Žà´•àµà´¸àµâ€Œà´ªàµà´°àµ†à´·àµ» പിഴവàµ: à´¸àµà´±àµà´±à´¾à´•àµà´•àµ à´ªàµà´±à´¨àµà´¤à´³àµà´³à´¿à´¯à´¿à´°à´¿à´•àµà´•àµà´¨àµà´¨àµ',
'pfunc_expr_unexpected_number' => 'à´ªàµà´°à´¯àµ‹à´—രീതിയിൽ പിഴവàµ: à´ªàµà´°à´¤àµ€à´•àµà´·à´¿à´•àµà´•à´¾à´¤àµà´¤ സംഖàµà´¯',
@@ -1625,7 +1715,7 @@ $messages['nah'] = array(
'pfunc_time_error' => 'AhcuallÅtl: ahcualli cÄhuitl',
);
-/** Norwegian Bokmål (norsk (bokmål)‎)
+/** Norwegian Bokmål (norsk bokmål)
* @author Event
* @author Laaknor
*/
@@ -1713,7 +1803,7 @@ $messages['nl'] = array(
'pfunc_string_too_long' => 'Fout: De tekst is langer dan de limiet van $1 {{PLURAL:$1|karakter|karakters}}',
);
-/** Norwegian Nynorsk (norsk (nynorsk)‎)
+/** Norwegian Nynorsk (norsk nynorsk)
* @author Eirik
* @author Frokor
* @author Gunnernett
@@ -1768,7 +1858,7 @@ $messages['oc'] = array(
'pfunc_string_too_long' => 'Error : La cadena depassa lo limit maximal de $1 caractèr{{PLURAL:$1||s}}',
);
-/** Oriya (ଓଡ଼ିଆ)
+/** Oriya (ଓଡ଼ିଆ)
* @author Jnanaranjan Sahu
*/
$messages['or'] = array(
@@ -1836,6 +1926,7 @@ $messages['pms'] = array(
'pfunc_time_error' => 'Eror: temp nen bon',
'pfunc_time_too_long' => 'Eror: #time a ven ciamà tròpe vire',
'pfunc_time_too_big' => "Eror: #time a përmët mach j'agn fin al 9999.",
+ 'pfunc_time_too_small' => "Eror: #time a përmet j'agn mach da 0.",
'pfunc_rel2abs_invalid_depth' => 'Eror: profondità nen bon-a ant ël përcors: "$1" (a l\'é provasse a ciamé un grop dzora a la rèis)',
'pfunc_expr_stack_exhausted' => "Eror ëd l'espression: stach esaurìa",
'pfunc_expr_unexpected_number' => "Eror ëd l'espression: nùmer pa spetà",
@@ -1872,10 +1963,11 @@ $messages['ps'] = array(
/** Portuguese (português)
* @author Hamilton Abreu
+ * @author Luckas
* @author Malafaya
*/
$messages['pt'] = array(
- 'pfunc_desc' => 'Adiciona funções lógicas ao analisador sintáctico',
+ 'pfunc_desc' => 'Melhora o analisador sintático com funções lógicas',
'pfunc_time_error' => 'Erro: tempo inválido',
'pfunc_time_too_long' => 'Erro: demasiadas chamadas a #time',
'pfunc_time_too_big' => 'Erro: #time só lida com anos até 9999',
@@ -1898,6 +1990,7 @@ $messages['pt'] = array(
);
/** Brazilian Portuguese (português do Brasil)
+ * @author Cainamarques
* @author Eduardo.mps
* @author Giro720
*/
@@ -1906,6 +1999,7 @@ $messages['pt-br'] = array(
'pfunc_time_error' => 'Erro: tempo inválido',
'pfunc_time_too_long' => 'Erro: muitas chamadas a #time',
'pfunc_time_too_big' => 'Erro: #time só lida com anos até 9999',
+ 'pfunc_time_too_small' => 'Erro: #time suporta apenas anos superiores a 0.',
'pfunc_rel2abs_invalid_depth' => 'Erro: Profundidade inválida no caminho: "$1" (foi tentado o acesso a um nó acima do nó raiz)',
'pfunc_expr_stack_exhausted' => 'Erro de expressão: Pilha esgotada',
'pfunc_expr_unexpected_number' => 'Erro de expressão: Número inesperado',
@@ -2007,6 +2101,7 @@ $messages['roa-tara'] = array(
/** Russian (руÑÑкий)
* @author G0rn
+ * @author Putnik
* @author ÐлекÑандр Сигачёв
*/
$messages['ru'] = array(
@@ -2014,6 +2109,7 @@ $messages['ru'] = array(
'pfunc_time_error' => 'Ошибка: неправильное времÑ',
'pfunc_time_too_long' => 'Ошибка: Ñлишком много вызовов функции #time',
'pfunc_time_too_big' => 'Ошибка. Параметр #time не может превышать 9999',
+ 'pfunc_time_too_small' => 'Ошибка: #time поддерживает только года от 0.',
'pfunc_rel2abs_invalid_depth' => 'Ошибка: Ð¾ÑˆÐ¸Ð±Ð¾Ñ‡Ð½Ð°Ñ Ð³Ð»ÑƒÐ±Ð¸Ð½Ð° пути: «$1» (попытка доÑтупа к узлу, находÑщемуÑÑ Ð²Ñ‹ÑˆÐµ, чем корневой)',
'pfunc_expr_stack_exhausted' => 'Ошибка выражениÑ: переполнение Ñтека',
'pfunc_expr_unexpected_number' => 'Ошибка выражениÑ: неожидаемое чиÑло',
@@ -2168,6 +2264,7 @@ $messages['sl'] = array(
'pfunc_time_error' => 'Napaka: neveljaven Äas',
'pfunc_time_too_long' => 'Napaka: preveÄ klicev #time',
'pfunc_time_too_big' => 'Napaka: #time podpira samo leta do 9999',
+ 'pfunc_time_too_small' => 'Napaka: #time podpira samo leta od 0.',
'pfunc_rel2abs_invalid_depth' => 'Napaka: Neveljavna globina poti: »$1« (poskus dostopanja do vozliÅ¡Äa viÅ¡jega od korenskega vozliÅ¡Äa)',
'pfunc_expr_stack_exhausted' => 'Napaka v izrazu: Sklad je izÄrpan',
'pfunc_expr_unexpected_number' => 'Napaka v izrazu: NepriÄakovani Å¡tevilo',
@@ -2311,6 +2408,7 @@ $messages['sv'] = array(
'pfunc_time_error' => 'Fel: ogiltig tid',
'pfunc_time_too_long' => 'Fel: för många anrop av #time',
'pfunc_time_too_big' => 'Fel: # tid stöder endast år fram till 9999',
+ 'pfunc_time_too_small' => 'Fel: #tid stödjer enbart år från 0.',
'pfunc_rel2abs_invalid_depth' => 'Fel: felaktig djup i sökväg: "$1" (försöker nå en nod ovanför rotnoden)',
'pfunc_expr_stack_exhausted' => 'Fel i uttryck: Stackutrymmet tog slut',
'pfunc_expr_unexpected_number' => 'Fel i uttryck: Oväntat tal',
@@ -2517,6 +2615,7 @@ $messages['uk'] = array(
'pfunc_time_error' => 'Помилка: неправильний чаÑ',
'pfunc_time_too_long' => 'Помилка: забагато викликів функції #time',
'pfunc_time_too_big' => 'Помилка: Параметр #time підтримує роки лише до 9999.',
+ 'pfunc_time_too_small' => 'Помилка: #time підтримує роки лише піÑÐ»Ñ 0.',
'pfunc_rel2abs_invalid_depth' => 'Помилка: неправильна глибина шлÑху: «$1» (Ñпроба доÑтупу до вузла, що знаходитьÑÑ Ð²Ð¸Ñ‰Ðµ, ніж кореневий)',
'pfunc_expr_stack_exhausted' => 'Помилка виразу: Ñтек переповнений',
'pfunc_expr_unexpected_number' => 'Помилка виразу: неочікуване чиÑло',
@@ -2585,7 +2684,7 @@ $messages['vi'] = array(
'pfunc_expr_unexpected_number' => 'Lỗi biểu thức: Dư số',
'pfunc_expr_preg_match_failure' => 'Lỗi biểu thức: Hàm preg_match thất bại',
'pfunc_expr_unrecognised_word' => 'Lỗi biểu thức: Từ “$1†không rõ ràng',
- 'pfunc_expr_unexpected_operator' => "Lỗi biểu thức: Dư toán tử '''$1'''",
+ 'pfunc_expr_unexpected_operator' => 'Lỗi biểu thức: Dư toán tử $1',
'pfunc_expr_missing_operand' => 'Lỗi biểu thức: Thiếu toán hạng trong $1',
'pfunc_expr_unexpected_closing_bracket' => 'Lỗi biểu thức: Dư dấu đóng ngoặc',
'pfunc_expr_unrecognised_punctuation' => 'Lỗi biểu thức: Dấu phân cách “$1†không rõ ràng',
@@ -2654,6 +2753,7 @@ $messages['yue'] = array(
/** Simplified Chinese (中文(简体)‎)
* @author Hydra
+ * @author Hzy980512
* @author Liangent
* @author PhiLiP
* @author Philip
@@ -2665,6 +2765,7 @@ $messages['zh-hans'] = array(
'pfunc_time_error' => '错误:无效时间',
'pfunc_time_too_long' => '错误:#time调用次数过多',
'pfunc_time_too_big' => '错误:#timeåªæ”¯æŒåˆ°9999å¹´',
+ 'pfunc_time_too_small' => '错误:#timeåªæ”¯æŒæœ€ä½Ž0年。',
'pfunc_rel2abs_invalid_depth' => '错误:无效路径深度:“$1â€ï¼ˆå°è¯•è®¿é—®æ ¹èŠ‚点以上节点)',
'pfunc_expr_stack_exhausted' => '表达å¼é”™è¯¯ï¼šå †æ ˆè€—å°½',
'pfunc_expr_unexpected_number' => '表达å¼é”™è¯¯ï¼šæœªé¢„料的数字',
@@ -2689,6 +2790,7 @@ $messages['zh-hans'] = array(
* @author Liangent
* @author Mark85296341
* @author Shinjiman
+ * @author Simon Shek
* @author Waihorace
*/
$messages['zh-hant'] = array(
@@ -2696,6 +2798,7 @@ $messages['zh-hant'] = array(
'pfunc_time_error' => '錯誤:無效時間。',
'pfunc_time_too_long' => '錯誤:éŽå¤š#time呼å«ã€‚',
'pfunc_time_too_big' => '錯誤:#timeåªæ”¯æ´è‡³9999年。',
+ 'pfunc_time_too_small' => '錯誤:#timeåªæ”¯æ´è‡³0。',
'pfunc_rel2abs_invalid_depth' => '錯誤:無效路徑深度:「$1ã€ï¼ˆå˜—試訪å•é ‚點以上節點)',
'pfunc_expr_stack_exhausted' => '表é”å¼éŒ¯èª¤ï¼šå †ç–Šè€—盡',
'pfunc_expr_unexpected_number' => '表é”å¼éŒ¯èª¤ï¼šæœªé æ–™çš„數字',
diff --git a/extensions/ParserFunctions/ParserFunctions_body.php b/extensions/ParserFunctions/ParserFunctions_body.php
index 967e8339..3567cc58 100644
--- a/extensions/ParserFunctions/ParserFunctions_body.php
+++ b/extensions/ParserFunctions/ParserFunctions_body.php
@@ -360,9 +360,6 @@ class ExtParserFunctions {
return $else;
} else {
$pdbk = $title->getPrefixedDBkey();
- if ( !$parser->incrementExpensiveFunctionCount() ) {
- return $else;
- }
$lc = LinkCache::singleton();
$id = $lc->getGoodLinkID( $pdbk );
if ( $id != 0 ) {
@@ -372,6 +369,9 @@ class ExtParserFunctions {
$parser->mOutput->addLink( $title, 0 );
return $else;
}
+ if ( !$parser->incrementExpensiveFunctionCount() ) {
+ return $else;
+ }
$id = $title->getArticleID();
$parser->mOutput->addLink( $title, $id );
if ( $id ) {
diff --git a/extensions/PdfHandler/PdfHandler.i18n.php b/extensions/PdfHandler/PdfHandler.i18n.php
index 391dfb91..8f259998 100644
--- a/extensions/PdfHandler/PdfHandler.i18n.php
+++ b/extensions/PdfHandler/PdfHandler.i18n.php
@@ -87,7 +87,7 @@ $messages['arz'] = array(
'pdf_page_error' => 'رقم الصÙحة ليس ÙÙ‰ النطاق',
);
-/** Assamese (অসমীয়া)
+/** Assamese (অসমীয়া)
* @author Bishnu Saikia
*/
$messages['as'] = array(
@@ -128,6 +128,19 @@ $messages['ba'] = array(
'pdf_page_error' => 'Бит һаны биттәр һанынан ашҡан',
);
+/** Bikol Central (Bikol Central)
+ * @author Geopoet
+ */
+$messages['bcl'] = array(
+ 'pdf-desc' => 'An tagapagkapot para sa pagtatanaw kan PDF na mga sagunson na yaon sa moda nin imahe.',
+ 'pdf_no_metadata' => 'Dae makakakua nin datos na meta gikan sa PDF.',
+ 'pdf_page_error' => 'An numero kan pahina dae tabi abot.',
+ 'exif-pdf-producer' => 'Programa nin kombersyon',
+ 'exif-pdf-version' => 'Bersyon kan PDF pormat',
+ 'exif-pdf-encrypted' => 'Enkriptado',
+ 'exif-pdf-pagesize' => 'Sukol kan pahina',
+);
+
/** Belarusian (TaraÅ¡kievica orthography) (беларуÑÐºÐ°Ñ (тарашкевіца)‎)
* @author EugeneZelenko
* @author Jim-by
@@ -203,6 +216,7 @@ $messages['ce'] = array(
'pdf-desc' => 'Хьажа аттон кечйо PDF-файлаш Ñуьрта куьцехь',
'pdf_no_metadata' => 'ÑхьацаÑцало чура бух оцу PDF',
'pdf_page_error' => 'Ðгlон терахь дозан чулацамца дац',
+ 'exif-pdf-pagesize' => 'ÐгӀона барам',
);
/** Sorani Kurdish (کوردی)
@@ -310,6 +324,13 @@ $messages['el'] = array(
'pdf_page_error' => 'ΑÏιθμός σελίδας εκτός οÏίου',
);
+/** British English (British English)
+ * @author Shirayuki
+ */
+$messages['en-gb'] = array(
+ 'exif-pdf-producer' => 'Conversion programme',
+);
+
/** Esperanto (Esperanto)
* @author Yekrats
*/
@@ -358,7 +379,7 @@ $messages['et'] = array(
* @author Wayiran
*/
$messages['fa'] = array(
- 'pdf-desc' => 'گرداننده‌ای برای مشاهده Ùایل های پی‌دی‌ا٠در حالت تصویر',
+ 'pdf-desc' => 'گرداننده‌ای برای مشاهدهٔ پرونده‌های پی‌دی‌ا٠در حالت تصویر',
'pdf_no_metadata' => 'نمی‌توان Ùراداده‌ها را از پی‌دی‌ا٠گرÙت',
'pdf_page_error' => 'شماره صÙحه در محدوده نیست',
'exif-pdf-producer' => 'برنامهٔ مبدل',
@@ -636,7 +657,7 @@ $messages['ksh'] = array(
'exif-pdf-pagesize' => 'Dä Sigg(e) ier Jrüüße', # Fuzzy
);
-/** Kirghiz (Кыргызча)
+/** Kyrgyz (Кыргызча)
* @author Chorobek
*/
$messages['ky'] = array(
@@ -651,6 +672,7 @@ $messages['lb'] = array(
'pdf-desc' => '"Programm" den et erméiglecht PDF-Fichieren als Bild ze kucken',
'pdf_no_metadata' => 'Meta-Informatiounen aus dem PDF Dokument kënnen net gelies ginn',
'pdf_page_error' => "D'Säitenzuel ass net an dem Beräich.",
+ 'exif-pdf-producer' => 'Ëmwandlungsprogramm',
'exif-pdf-version' => 'Versioun vum PDF-Format',
'exif-pdf-encrypted' => 'Verschlësselt',
'exif-pdf-pagesize' => 'Gréisst vun der Säit',
@@ -665,6 +687,13 @@ $messages['li'] = array(
'pdf_page_error' => 'paginanómmer besteit neet',
);
+/** لوری (لوری)
+ * @author Mogoeilor
+ */
+$messages['lrc'] = array(
+ 'exif-pdf-pagesize' => 'انازه بلگه',
+);
+
/** Lithuanian (lietuvių)
* @author Matasg
*/
@@ -705,11 +734,12 @@ $messages['ml'] = array(
/** Marathi (मराठी)
* @author Kaustubh
* @author Sankalpdravid
+ * @author V.narsikar
*/
$messages['mr'] = array(
'pdf-desc' => 'चितà¥à¤° मोडमधà¥à¤¯à¥‡ पीडीà¤à¤« संचिका पाहणà¥à¤¯à¤¾à¤¸à¤¾à¤ à¥€ आवशà¥à¤¯à¤• पà¥à¤°à¤£à¤¾à¤²à¥€',
'pdf_no_metadata' => 'पीडीà¤à¤«à¤®à¤§à¥‚न मेटाडाटा घेऊ शकत नाही',
- 'pdf_page_error' => 'पान कà¥à¤°à¤®à¤¾à¤‚क सीमेमधà¥à¤¯à¥‡ नाही',
+ 'pdf_page_error' => 'पान कà¥à¤°à¤®à¤¾à¤‚क आवाकà¥à¤¯à¤¾à¤¤ नाही',
);
/** Malay (Bahasa Melayu)
@@ -732,7 +762,7 @@ $messages['mt'] = array(
'pdf_page_error' => 'In-numru tal-paġna ma jinsabx fl-intervall',
);
-/** Norwegian Bokmål (norsk (bokmål)‎)
+/** Norwegian Bokmål (norsk bokmål)
* @author Jsoby
*/
$messages['nb'] = array(
@@ -750,16 +780,16 @@ $messages['nb'] = array(
* @author Wiki13
*/
$messages['nl'] = array(
- 'pdf-desc' => 'Handelt PDF-bestanden af en maakt het mogelijk ze als afbeeldingen te bekijken',
- 'pdf_no_metadata' => 'De metadata van het PDF-bestand kan niet uitgelezen worden',
+ 'pdf-desc' => 'Handelt pdfbestanden af en maakt het mogelijk ze als afbeeldingen te bekijken',
+ 'pdf_no_metadata' => 'De metadata van het pdfbestand kan niet uitgelezen worden',
'pdf_page_error' => 'Het paginanummer ligt niet binnen het bereik',
'exif-pdf-producer' => 'Conversieprogramma',
- 'exif-pdf-version' => 'Versie van PDF-opmaak',
+ 'exif-pdf-version' => 'Versie van pdfopmaak',
'exif-pdf-encrypted' => 'Versleuteld',
'exif-pdf-pagesize' => 'Papierformaat',
);
-/** Norwegian Nynorsk (norsk (nynorsk)‎)
+/** Norwegian Nynorsk (norsk nynorsk)
* @author Harald Khan
* @author Njardarlogar
*/
@@ -782,7 +812,7 @@ $messages['oc'] = array(
'exif-pdf-pagesize' => 'Talha de la pagina',
);
-/** Oriya (ଓଡ଼ିଆ)
+/** Oriya (ଓଡ଼ିଆ)
* @author Jnanaranjan Sahu
* @author Psubhashish
*/
@@ -1150,11 +1180,12 @@ $messages['zh-hans'] = array(
);
/** Traditional Chinese (中文(ç¹é«”)‎)
+ * @author Justincheng12345
* @author Mark85296341
* @author Simon Shek
*/
$messages['zh-hant'] = array(
- 'pdf-desc' => '在圖片模å¼ä¸­ PDF 檔的處ç†å™¨',
+ 'pdf-desc' => '在圖片模å¼ä¸­æŸ¥çœ‹PDF檔案的處ç†å™¨',
'pdf_no_metadata' => '無法在 PDF 中擷å–元數據',
'pdf_page_error' => 'é æ•¸ä¸åœ¨ç¯„åœä¸­',
'exif-pdf-producer' => '轉æ›ç¨‹å¼',
diff --git a/extensions/PdfHandler/PdfHandler_body.php b/extensions/PdfHandler/PdfHandler_body.php
index 73ce1b58..8fa6719b 100644
--- a/extensions/PdfHandler/PdfHandler_body.php
+++ b/extensions/PdfHandler/PdfHandler_body.php
@@ -315,7 +315,7 @@ class PdfHandler extends ImageHandler {
*/
function pageCount( $image ) {
$data = $this->getMetaArray( $image );
- if ( !$data ) {
+ if ( !$data || !isset( $data['Pages'] ) ) {
return false;
}
return intval( $data['Pages'] );
diff --git a/extensions/Poem/Poem.i18n.php b/extensions/Poem/Poem.i18n.php
index 26fecca6..7f5157f5 100644
--- a/extensions/Poem/Poem.i18n.php
+++ b/extensions/Poem/Poem.i18n.php
@@ -310,7 +310,7 @@ $messages['id'] = array(
* @author Lam-ang
*/
$messages['ilo'] = array(
- 'poem-desc' => 'Ikkan na iti<code>&lt;poem&gt;</code> nga tag para ti pagporma ti daniw',
+ 'poem-desc' => 'Agnayon ti etiketa ti <code>&lt;poem&gt;</code> para iti panagporma ti daniw',
);
/** Italian (italiano)
@@ -360,9 +360,10 @@ $messages['km'] = array(
/** Korean (한국어)
* @author ToePeu
+ * @author ì•„ë¼
*/
$messages['ko'] = array(
- 'poem-desc' => 'ì‹œ 형ì‹ì„ 위해 <code>&lt;poem&gt;</code> 태그를 추가',
+ 'poem-desc' => 'ì‹œ 형ì‹ì„ 위해 <code>&lt;poem&gt;</code> 태그를 추가합니다',
);
/** Colognian (Ripoarisch)
@@ -402,10 +403,11 @@ $messages['lus'] = array(
);
/** Latvian (latviešu)
+ * @author Papuass
* @author Xil
*/
$messages['lv'] = array(
- 'poem-desc' => 'Pievieno <code>&lt;poem&gt;</code> tagu dzejas formatēšanai',
+ 'poem-desc' => 'Pievieno <code>&lt;poem&gt;</code> iezīmi dzejas formatēšanai',
);
/** Macedonian (македонÑки)
@@ -437,7 +439,7 @@ $messages['ms'] = array(
'poem-desc' => 'Menambah tag <code>&lt;poem&gt;</code> untuk pemformatan puisi',
);
-/** Norwegian Bokmål (norsk (bokmål)‎)
+/** Norwegian Bokmål (norsk bokmål)
*/
$messages['nb'] = array(
'poem-desc' => 'Legger til taggen <code>&lt;poem&gt;</code> for å kunne formatere dikt',
@@ -457,7 +459,7 @@ $messages['nl'] = array(
'poem-desc' => 'Voegt de tag <code>&lt;poem&gt;</code> toe voor de opmaak van poëzie',
);
-/** Norwegian Nynorsk (norsk (nynorsk)‎)
+/** Norwegian Nynorsk (norsk nynorsk)
* @author Harald Khan
*/
$messages['nn'] = array(
@@ -489,7 +491,7 @@ $messages['pms'] = array(
* @author Ahmed-Najib-Biabani-Ibrahimkhel
*/
$messages['ps'] = array(
- 'poem-desc' => 'د شعر بڼه ورکولو Ú©Ú“Ù†Û Ù„Ù¾Ø§Ø±Ù‡ د <tt>&lt;شعر&gt;</tt> وييکه ورګډوي',
+ 'poem-desc' => 'د شعر بڼه ورکولو Ú©Ú“Ù†Û Ù„Ù¾Ø§Ø±Ù‡ د <tt>&lt;شعر&gt;</tt> وييکه ورگډوي',
);
/** Portuguese (português)
diff --git a/extensions/README b/extensions/README
index 66236e85..e8150623 100644
--- a/extensions/README
+++ b/extensions/README
@@ -27,4 +27,4 @@ The following code snippet lets you override the default path:
if( $IP === false ) {
$IP = __DIR__ . '/../..';
}
- require_once( "$IP/maintenance/Maintenance.php" ); // a MediaWiki core file
+ require_once "$IP/maintenance/Maintenance.php"; // a MediaWiki core file
diff --git a/extensions/Renameuser/README b/extensions/Renameuser/README
index e44aaafe..a344ebf6 100644
--- a/extensions/Renameuser/README
+++ b/extensions/Renameuser/README
@@ -1,4 +1,4 @@
-These is the readme file for the MediaWiki Renameuser extension.
+This is the readme file for the MediaWiki Renameuser extension.
Extension page on mediawiki.org: https://www.mediawiki.org/wiki/Extension:Renameuser
Latest version of the readme file: https://gerrit.wikimedia.org/r/gitweb?p=mediawiki/extensions/Renameuser.git;a=blob;f=README
diff --git a/extensions/Renameuser/Renameuser.alias.php b/extensions/Renameuser/Renameuser.alias.php
index 2331b4c5..6ac6f8cf 100644
--- a/extensions/Renameuser/Renameuser.alias.php
+++ b/extensions/Renameuser/Renameuser.alias.php
@@ -5,6 +5,7 @@
* @file
* @ingroup Extensions
*/
+// @codingStandardsIgnoreFile
$specialPageAliases = array();
@@ -58,7 +59,12 @@ $specialPageAliases['ca'] = array(
'Renameuser' => array( 'Reanomena_usuari' ),
);
-/** Czech (Äesky) */
+/** Chechen (нохчийн) */
+$specialPageAliases['ce'] = array(
+ 'Renameuser' => array( 'Декъашхочун_цӀе_хийца' ),
+);
+
+/** Czech (ÄeÅ¡tina) */
$specialPageAliases['cs'] = array(
'Renameuser' => array( 'Přejmenovat_uživatele' ),
);
@@ -70,7 +76,7 @@ $specialPageAliases['de'] = array(
/** Zazaki (Zazaki) */
$specialPageAliases['diq'] = array(
- 'Renameuser' => array( 'NamedayışêKarberi' ),
+ 'Renameuser' => array( 'NamedayışéKarberi' ),
);
/** Lower Sorbian (dolnoserbski) */
@@ -190,7 +196,7 @@ $specialPageAliases['km'] = array(
/** Korean (한국어) */
$specialPageAliases['ko'] = array(
- 'Renameuser' => array( 'ì´ë¦„바꾸기', '계정ì´ë¦„바꾸기', '사용ìžì´ë¦„바꾸기' ),
+ 'Renameuser' => array( 'ì´ë¦„바꾸기', '사용ìžì´ë¦„바꾸기', '계정ì´ë¦„바꾸기' ),
);
/** Colognian (Ripoarisch) */
@@ -338,6 +344,11 @@ $specialPageAliases['tr'] = array(
'Renameuser' => array( 'KullanıcıAdınıDeğiştir', 'KullanıcıİsminiDeğiştir' ),
);
+/** Ukrainian (українÑька) */
+$specialPageAliases['uk'] = array(
+ 'Renameuser' => array( 'Перейменувати_кориÑтувача' ),
+);
+
/** Vietnamese (Tiếng Việt) */
$specialPageAliases['vi'] = array(
'Renameuser' => array( 'Äổi_tên_thành_viên', 'Äổi_tên_ngÆ°á»i_dùng' ),
diff --git a/extensions/Renameuser/Renameuser.i18n.php b/extensions/Renameuser/Renameuser.i18n.php
index 25d90ebe..795390bc 100644
--- a/extensions/Renameuser/Renameuser.i18n.php
+++ b/extensions/Renameuser/Renameuser.i18n.php
@@ -65,8 +65,10 @@ The rename log is provided below for reference.', # Supports GENDER
* @author Umherirrender
*/
$messages['qqq'] = array(
- 'renameuser' => '{{doc-special|RenameUser}}',
- 'renameuser-linkoncontribs' => 'Link description used on [[Special:Contributions]] and [[Special:DeletedContributions]]. Only added if a user has rights to rename users.',
+ 'renameuser' => '{{doc-special|RenameUser}}
+{{Identical|Rename user}}',
+ 'renameuser-linkoncontribs' => 'Link description used on [[Special:Contributions]] and [[Special:DeletedContributions]]. Only added if a user has rights to rename users.
+{{Identical|Rename user}}',
'renameuser-linkoncontribs-text' => 'Tooltip for {{msg-mw|renameuser-linkoncontribs}}.',
'renameuser-desc' => '{{desc|name=Rename user|url=http://www.mediawiki.org/wiki/Extension:Renameuser}}',
'renameuser-summary' => '{{notranslate}}',
@@ -134,11 +136,14 @@ Parameters:
'logentry-renameuser-renameuser-legaciest' => 'Used in [[Special:Log/renameuser]]. {{logentry}}
Note that only user name is included in this legacy log entry, everything else is hardcoded into log comment.',
'renameuser-move-log' => 'Reason for a page move when a page is moved because of a user rename. Parameters:
-* $1 is the old username;
-* $2 is the new username.',
- 'action-renameuser' => '{{Doc-action|renameuser}}',
- 'right-renameuser' => '{{doc-right|renameuser}}',
- 'renameuser-renamed-notice' => 'This message supports the use of GENDER with parameter $1.',
+* $1 - the old username
+* $2 - the new username',
+ 'action-renameuser' => '{{Doc-action|renameuser}}
+{{Identical|Rename user}}',
+ 'right-renameuser' => '{{doc-right|renameuser}}
+{{Identical|Rename user}}',
+ 'renameuser-renamed-notice' => 'Parameters:
+* $1 - (Optional) username, for GENDER support',
);
/** Afrikaans (Afrikaans)
@@ -315,7 +320,7 @@ $messages['arz'] = array(
'right-renameuser' => 'غير اسم اليوزرز',
);
-/** Assamese (অসমীয়া)
+/** Assamese (অসমীয়া)
* @author Bishnu Saikia
* @author Gitartha.bordoloi
*/
@@ -506,13 +511,42 @@ $messages['bcc'] = array(
/** Bikol Central (Bikol Central)
* @author Filipinayzd
+ * @author Geopoet
*/
$messages['bcl'] = array(
+ 'renameuser' => 'Pangarani otro an paragamit',
+ 'renameuser-linkoncontribs' => 'pangarani otro an paragamit',
+ 'renameuser-linkoncontribs-text' => 'Pangarani otro ining paragamit',
+ 'renameuser-desc' => "Minadugang nin sarong [[Special:Renameuser|espesyal na pahina]] tanganing pangaranan otro an sarong paragamit (kaipuhan an ''renameuser'' na katanosan)",
+ 'renameuserold' => 'Sa ngunyan na ngaran-paragamit:',
+ 'renameusernew' => 'Baguhong ngaran-paragamit:',
+ 'renameuserreason' => 'Rason:',
+ 'renameusermove' => 'Ibalyo an paragamit asin mga pahina nin orolayan (asin an saindang mga sub-pahina) pasiring sa baguhong pangaran',
+ 'renameusersuppress' => 'Dae magmukna nin mga panlikwat pasiring sa baguhong pangaran',
+ 'renameuserreserve' => 'Kubkubon an lumaong ngaran-paragamit na magagamit sa paabuton',
+ 'renameuserwarnings' => 'Mga Patanid:',
+ 'renameuserconfirm' => 'Iyo, pangarani otro an paragamit',
'renameusersubmit' => 'Isumitir',
+ 'renameuser-submit-blocklog' => 'Ipahiling an talaan kan kinubkob para sa paragamit',
'renameusererrordoesnotexist' => 'An parágamit "<nowiki>$1</nowiki>" mayò man',
'renameusererrorexists' => 'An parágamit "<nowiki>$1</nowiki>" yaon na',
- 'renameuser-page-moved' => 'An páhinang $1 piglipat sa $2.',
- 'renameuser-page-unmoved' => 'An páhinang $1 dai mailipat sa $2.',
+ 'renameusererrorinvalid' => 'An ngaran-paragamit "<nowiki>$1</nowiki>" sarong imbalido.',
+ 'renameuser-error-request' => 'Nagkaigwa nin sarong problema sa pagreresibe kan hinahagad.
+Pakibalik tabi asin otroha giraray.',
+ 'renameuser-error-same-user' => 'Ika dae makakapangaran otro nin sarong paragamit na kaparehong bagay na siring sa dati.',
+ 'renameusersuccess' => 'An paragamit "<nowiki>$1</nowiki>" pinagngaranan otro na magin "<nowiki>$2</nowiki>".',
+ 'renameuser-page-exists' => 'An pahina na $1 eksistido na asin dae tabi awtomatikong masasalambawan.',
+ 'renameuser-page-moved' => 'An páhinang $1 pinagbalyo na sa $2.',
+ 'renameuser-page-unmoved' => 'An páhinang $1 dai maipagbabalyo pasiring sa $2.',
+ 'log-name-renameuser' => 'Talaan nin paragamit na pinagngaranan otro',
+ 'log-description-renameuser' => 'Iyo ini an sarong talaan kan mga kaliwatan sa mga pangaran nin paragamit.',
+ 'logentry-renameuser-renameuser' => '$1 {{GENDER:$2|pinagngaranan otro}} paragamit $4 ({{PLURAL:$6|$6 pagliwat|$6 mga pagliwat}}) na magin $5',
+ 'logentry-renameuser-renameuser-legacier' => '$1 pinagngaranan otro an paragamit na si $4 na magin $5',
+ 'renameuser-move-log' => 'Awtomatikong pinagbalyo an pahina mantang pinapangaranan otro an paragamit "[[User:$1|$1]]" na magin "[[User:$2|$2]]"',
+ 'action-renameuser' => 'pangaranan otro an mga paragamit',
+ 'right-renameuser' => 'Pangarani otro an mga paragamit',
+ 'renameuser-renamed-notice' => 'Ining paragamit pinagngaranan otro.
+An talaan kan pagpangaran otrol pinagtao sa ibaba para sa reperensiya.',
);
/** Belarusian (TaraÅ¡kievica orthography) (беларуÑÐºÐ°Ñ (тарашкевіца)‎)
@@ -754,10 +788,16 @@ A continuació es proporciona el registre de reanomenaments per a més informaci
* @author Умар
*/
$messages['ce'] = array(
- 'renameuser' => 'Декъашхон цlе хийца',
- 'renameuser-linkoncontribs' => 'декъашхон цlе хийца',
+ 'renameuser' => 'Декъашхочун цӀе хийца',
+ 'renameuser-linkoncontribs' => 'декъашхочун цӀе хийца',
'renameuserreason' => 'Бахьан:',
+ 'renameusersubmit' => 'Кхочушдé',
+ 'renameuser-page-exists' => 'ÐгÓо $1 йолуш ÑŽ цундела и ша юху дÓаÑзъÑн йиш Ñц.',
'renameuser-page-moved' => 'ÐгӀона $1 цӀе хийцина оцу $2.',
+ 'log-name-renameuser' => 'Декъашхойн цӀераш хийцар долу тептар',
+ 'renameuser-move-log' => 'ÐвтоматичеÑки декъашхочун цӀе хийцина дела «[[User:$1|$1]]» оцу «[[User:$2|$2]]»',
+ 'action-renameuser' => 'декъашхойн цӀераш хийцар',
+ 'right-renameuser' => 'декъашхойн цӀераш хийцар',
);
/** Sorani Kurdish (کوردی)
@@ -766,6 +806,8 @@ $messages['ce'] = array(
$messages['ckb'] = array(
'renameusersubmit' => 'ناردن',
'log-name-renameuser' => 'لۆگی گۆڕینی ناوی بەکارھێنەر',
+ 'logentry-renameuser-renameuser' => '$1 ناوی بەکارھێنەر $4ی ({{PLURAL:$6|$6 دەستکاری}}) {{GENDER:$2|گۆڕی}} بۆ $5',
+ 'right-renameuser' => 'گۆڕینی ناوی بەکارھێنەران',
);
/** Crimean Turkish (Cyrillic script) (къырымтатарджа (Кирилл)‎)
@@ -832,7 +874,7 @@ $messages['cu'] = array(
'renameuser' => 'прѣимєноуи польꙃєватєл҄ь',
'renameuserold' => 'нꙑнѣщьнѥѥ имѧ :',
'renameusernew' => 'ново имѧ :',
- 'renameuserreason' => 'какъ ÑъмꙑÑлъ :', # Fuzzy
+ 'renameuserreason' => 'какъ ÑъмꙑÑлъ :',
'renameusermove' => 'нарьци тако польꙃєватєлꙗ Ñтраницѫ · бєÑѣдѫ и ихъ подъÑтраницѧ',
'renameusersubmit' => 'єи',
'renameusererrordoesnotexist' => 'польꙃєватєлꙗ â– <nowiki>$1</nowiki> ■нѣÑÑ‚ÑŠ',
@@ -840,6 +882,7 @@ $messages['cu'] = array(
'renameusererrorinvalid' => 'имѧ â– <nowiki>$1</nowiki> ■нѣÑÑ‚ÑŠ годѣ',
'log-name-renameuser' => 'польꙃєватєлъ прѣимєнованиꙗ Ñ—Ñторїꙗ',
'log-description-renameuser' => 'ÑÑ¥ Ñ¥ÑÑ‚ÑŠ Ñ—Ñторїꙗ польꙃєватєльÑкъ имєнъ иê™Ð¼Ñ£Ð½Ñ¥Ð½Ð¸ê™—',
+ 'logentry-renameuser-renameuser' => '$1 {{GENDER:$2|нарєчє}} польꙃєватєлъ â– $4 â– ({{PLURAL:$6|$6 мѣна|$6 мѣни|$6 мѣнъ}}) имєньмь â– $5 â–',
);
/** Chuvash (Чӑвашла)
@@ -979,6 +1022,7 @@ Zur Information folgt das Benutzernamenänderungs-Logbuch.',
/** Zazaki (Zazaki)
* @author Aspar
* @author Erdemaslancan
+ * @author Gorizon
* @author Mirzali
* @author Xoser
*/
@@ -993,7 +1037,7 @@ $messages['diq'] = array(
'renameusermove' => 'nameyê karberan u pelê werêaameyişan bıkırışi nameyo newe',
'renameusersuppress' => 'Name de newi re hetenayışo newe vıraştış',
'renameuserreserve' => 'nameyê karberi yo verini bloke bıker.',
- 'renameuserwarnings' => 'hiÅŸyariyi',
+ 'renameuserwarnings' => 'Ä°ÄŸtari:',
'renameuserconfirm' => 'bele karberi newe ra name bıker',
'renameusersubmit' => 'bierşawê/biruşnê',
'renameuser-submit-blocklog' => 'Rocekanê bloqandê karbari bıvin',
@@ -1062,6 +1106,7 @@ Protokol pśemjenjowanjow jo dołojce ako referenca pódany.',
* @author Badseed
* @author Consta
* @author Dead3y3
+ * @author Geraki
* @author Glavkos
* @author Kiriakos
* @author MF-Warburg
@@ -1082,6 +1127,7 @@ $messages['el'] = array(
'renameuserwarnings' => 'ΠÏοειδοποιήσεις:',
'renameuserconfirm' => 'Îαι, μετονομάστε τον χÏήστη',
'renameusersubmit' => 'ΚαταχώÏιση',
+ 'renameuser-submit-blocklog' => 'Εμφάνιση μητÏώου φÏαγών του χÏήστη',
'renameusererrordoesnotexist' => 'Ο χÏήστης "<nowiki>$1</nowiki>" δεν υπάÏχει',
'renameusererrorexists' => 'Ο χÏήστης "<nowiki>$1</nowiki>" υπάÏχει ήδη.',
'renameusererrorinvalid' => 'Το όνομα χÏήστη "<nowiki>$1</nowiki>" είναι άκυÏο.',
@@ -1092,6 +1138,9 @@ $messages['el'] = array(
'renameuser-page-moved' => 'Η σελίδα $1 μετακινήθηκε στο $2.',
'renameuser-page-unmoved' => 'Η σελίδα $1 δεν μπόÏεσε να μετακινηθεί στο $2.',
'log-name-renameuser' => 'ΑÏχείο μετονομασίας χÏηστών',
+ 'log-description-renameuser' => 'Αυτό είναι ένα αÏχείο καταγÏαφής αλλαγών σε ονόματα χÏηστών',
+ 'logentry-renameuser-renameuser' => '{{GENDER:$2|Ο|Η}} $1 μετονόμασε {{GENDER:$4|το χÏήστη|τη χÏήστÏια}} $4 ({{PLURAL:$6|$6 επεξεÏγασία|$6 επεξεÏγασίες}}) σε $5',
+ 'logentry-renameuser-renameuser-legacier' => '{{GENDER:$2|Ο|Η}} $1 μετονόμασε {{GENDER:$4|το χÏήστη|τη χÏήστÏια}} $4 σε $5',
'renameuser-move-log' => 'Η σελίδα μετακινήθηκε αυτόματα κατά τη μετονομασία του χÏήστη "[[User:$1|$1]]" σε "[[User:$2|$2]]"',
'action-renameuser' => 'μετονομασία χÏηστών',
'right-renameuser' => 'Μετονομασία χÏηστών',
@@ -1149,6 +1198,7 @@ Jen la protokolo pri renomigado por via referenco.',
* @author Jatrobat
* @author Lin linao
* @author Locos epraix
+ * @author MarcoAurelio
* @author Ralgis
* @author Remember the dot
* @author Sanbec
@@ -1252,7 +1302,7 @@ $messages['eu'] = array(
'renameusererrorinvalid' => '"<nowiki>$1</nowiki>" erabiltzaile izena okerra da',
'renameusersuccess' => '"<nowiki>$1</nowiki>" lankidearen izen berria "<nowiki>$2</nowiki>" da',
'renameuser-page-exists' => 'Badago $1 orrialdea, eta ezin da automatikoki gainidatzi.',
- 'renameuser-page-moved' => '$1 orria $2 izenera aldatu da.',
+ 'renameuser-page-moved' => '«$1» orria «$2» izenera aldatu da.',
'renameuser-page-unmoved' => 'Ezin izan da $1 orrialdea $2(e)ra mugitu.',
'log-name-renameuser' => 'Erabiltzaileen izen aldaketa erregistroa',
'right-renameuser' => 'Lankideak berrizendatu',
@@ -1288,7 +1338,7 @@ $messages['fa'] = array(
'renameuser-submit-blocklog' => 'نمایش سیاههٔ بستن کاربر',
'renameusererrordoesnotexist' => 'نام کاربری «<nowiki>$1</nowiki>» وجود ندارد',
'renameusererrorexists' => 'نام کاربری «<nowiki>$1</nowiki>» استÙاده شده‌است',
- 'renameusererrorinvalid' => 'نام کاربری «<nowiki>$1</nowiki>» غیر مجاز است',
+ 'renameusererrorinvalid' => 'نام کاربری «<nowiki>$1</nowiki>» نامجاز است.',
'renameuser-error-request' => 'در دریاÙت درخواست مشکلی پیش آمد. لطÙاً به صÙحهٔ قبل بازگردید Ùˆ دوباره تلاش کنید.',
'renameuser-error-same-user' => 'شما نمی‌توانید نام یک کاربر را به همان نام قبلی‌اش تغییر دهید.',
'renameusersuccess' => 'نام کاربر «<nowiki>$1</nowiki>» به «<nowiki>$2</nowiki>» تغییر یاÙت.',
@@ -1341,7 +1391,7 @@ $messages['fi'] = array(
'renameuser-page-unmoved' => 'Sivun $1 siirtäminen nimelle $2 ei onnistunut.',
'log-name-renameuser' => 'Tunnusten vaihdot',
'log-description-renameuser' => 'Tämä on loki käyttäjätunnuksien vaihdoista.',
- 'logentry-renameuser-renameuser' => '$1 {{GENDER:$2|nimesi}} käyttäjän $4 ({{PLURAL:$6|$6 muokkaus|$6 muokkausta}}) uudelle nimelle $5', # Fuzzy
+ 'logentry-renameuser-renameuser' => '$1 {{GENDER:$2|nimesi}} käyttäjän $4 ({{PLURAL:$6|$6 muokkaus|$6 muokkausta}}) uudelle nimelle $5',
'logentry-renameuser-renameuser-legacier' => '$1 nimesi käyttäjän $4 uudelle nimelle $5',
'renameuser-move-log' => 'Siirretty automaattisesti tunnukselta â€[[User:$1|$1]]†tunnukselle â€[[User:$2|$2]]â€',
'action-renameuser' => 'nimetä käyttäjätunnuksia uudelleen',
@@ -1360,7 +1410,7 @@ $messages['fo'] = array(
'renameuser-linkoncontribs-text' => 'Umdoyp henda brúkara',
'renameuserold' => 'Rætta brúkaranavn:',
'renameusernew' => 'Nýtt brúkaranavn:',
- 'renameuserreason' => 'Orsøk til nýtt navn:', # Fuzzy
+ 'renameuserreason' => 'Orsøk:',
'renameuserwarnings' => 'Ãvaringar:',
'renameuserconfirm' => 'Ja, gev hesum brúkara nýtt navn',
'renameusersubmit' => 'Send inn',
@@ -1460,6 +1510,43 @@ Volyéd tornar arriér et pués tornar èprovar.',
Lo jornal des changements de nom est disponiblo ce-desot por enformacion.',
);
+/** Northern Frisian (Nordfriisk)
+ * @author Murma174
+ */
+$messages['frr'] = array(
+ 'renameuser' => 'Brüker amnääm',
+ 'renameuser-linkoncontribs' => 'Brüker amnääm',
+ 'renameuser-linkoncontribs-text' => 'Didiar brüker amnääm',
+ 'renameuser-desc' => 'Diar komt en [[Special:Renameuser|spezial-sidj]] tu, am en brükernööm tu feranrin',
+ 'renameuserold' => 'Uugenblakelk brükernööm:',
+ 'renameusernew' => 'Nei brükernööm:',
+ 'renameuserreason' => 'Grünj:',
+ 'renameusermove' => 'Fersküüw brükersidj an diskusjuunssidj (mä onersidjen) tu di nei brükernööm',
+ 'renameusersuppress' => 'Nian widjerfeerangen üüb di nei brükernööm iinracht',
+ 'renameuserreserve' => 'Di ual brükernööm spere',
+ 'renameuserwarnings' => 'Wäärnangen:',
+ 'renameuserconfirm' => 'Ja, di brüker amnääm',
+ 'renameusersubmit' => 'Auerdreeg',
+ 'renameuser-submit-blocklog' => 'Sper-logbuk för didiar brüker uunwise',
+ 'renameusererrordoesnotexist' => 'Son brüker "<nowiki>$1</nowiki>" jaft at ei.',
+ 'renameusererrorexists' => 'Son brüker "<nowiki>$1</nowiki>" jaft at al.',
+ 'renameusererrorinvalid' => 'Di brükernööm "<nowiki>$1</nowiki>" as ferkiard.',
+ 'renameuser-error-request' => "Diar as wat skiaf gingen bi't aurdreegen. Ferschük det man noch ans.",
+ 'renameuser-error-same-user' => 'Di nei an di ual brükernööm san likedenang.',
+ 'renameusersuccess' => 'Di brüker "<nowiki>$1</nowiki>" as tu "<nowiki>$2</nowiki>" amnäämd wurden.',
+ 'renameuser-page-exists' => 'Det sidj „$1“ as al diar an koon ei automaatisk auerskrewen wurd.',
+ 'renameuser-page-moved' => 'Det sidj $1 as efter $2 fersköwen wurden.',
+ 'renameuser-page-unmoved' => 'Det sidj $1 küd ei efter $2 fersköwen wurd.',
+ 'log-name-renameuser' => 'Amnääm-logbuk',
+ 'log-description-renameuser' => 'Det as det logbuk auer feranrangen faan brükernöömer.',
+ 'logentry-renameuser-renameuser' => '$1 {{GENDER:$2|hää}} brüker „$4“ (mä {{PLURAL:$6|ian feranrang|$6 feranrangen}}) tu „$5“ amnäämd.',
+ 'logentry-renameuser-renameuser-legacier' => '$1 hää brüker $4 amnäämd tu $5',
+ 'renameuser-move-log' => "Det sidj as bi't amnäämen faan „[[User:$1|$1]]“ tu „[[User:$2|$2]]“ automaatisk fersköwen wurden",
+ 'action-renameuser' => 'brükern amnääm',
+ 'right-renameuser' => 'Brükern amnääm',
+ 'renameuser-renamed-notice' => "Didiar brüker as amnäämd wurden. Uun't amnääm-logbuk oner stäänt muar diartu.",
+);
+
/** Friulian (furlan)
* @author Klenje
*/
@@ -1640,6 +1727,7 @@ $messages['gu'] = array(
* @author Rotem Liss
* @author Rotemliss
* @author YaronSh
+ * @author ערן
*/
$messages['he'] = array(
'renameuser' => 'שינוי ×©× ×ž×©×ª×ž×©',
@@ -1667,8 +1755,8 @@ $messages['he'] = array(
'renameuser-page-unmoved' => '×œ× × ×™×ª×Ÿ ×”×™×” להעביר ×ת הדף $1 ל$2.',
'log-name-renameuser' => 'יומן שינויי שמות משתמש',
'log-description-renameuser' => 'זהו יומן ×”×©×™× ×•×™×™× ×‘×©×ž×•×ª המשתמשי×.',
- 'logentry-renameuser-renameuser' => '$1 {{GENDER:$2|שינה|שינתה}} ×ת ×©× ×”×ž×©×ª×ž×© $4 ({{PLURAL:$6|עריכה ×חת|$6 עריכות}}) ×ל $5',
- 'logentry-renameuser-renameuser-legacier' => '$1 שינה ×ת ×©× × ×ž×©×ª×ž×© $4 ×ל $5',
+ 'logentry-renameuser-renameuser' => '$1 {{GENDER:$2|שינה|שינתה}} ×ת ×©× ×”×ž×©×ª×ž×© $4 &rlm;({{PLURAL:$6|עריכה ×חת|$6 עריכות}}) ×ל $5',
+ 'logentry-renameuser-renameuser-legacier' => '$1 {{GENDER:$2|שינה|שינתה}} ×ת ×©× ×”×ž×©×ª×ž×© $4 ל{{GRAMMAR:תחילית|$5}}',
'renameuser-move-log' => 'העברה ×וטומטית בעקבות שינוי ×©× ×”×ž×©×ª×ž×© "[[User:$1|$1]]" ל־"[[User:$2|$2]]"',
'action-renameuser' => 'לשנות שמות משתמש',
'right-renameuser' => 'שינוי שמות משתמש',
@@ -1679,36 +1767,42 @@ $messages['he'] = array(
/** Hindi (हिनà¥à¤¦à¥€)
* @author Ansumang
* @author Kaustubh
+ * @author Siddhartha Ghai
*/
$messages['hi'] = array(
'renameuser' => 'सदसà¥à¤¯à¤¨à¤¾à¤® बदलें',
'renameuser-linkoncontribs' => 'सदसà¥à¤¯à¤¨à¤¾à¤® बदलें',
- 'renameuser-linkoncontribs-text' => 'इस सदसà¥à¤¯ के नाम बदलें',
- 'renameuser-desc' => "सदसà¥à¤¯à¤¨à¤¾à¤® बदलें (''सदसà¥à¤¯à¤¨à¤¾à¤® बदलने अधिकार'' अनिवारà¥à¤¯)",
+ 'renameuser-linkoncontribs-text' => 'इस सदसà¥à¤¯ का नाम बदलें',
+ 'renameuser-desc' => "सदसà¥à¤¯à¤¨à¤¾à¤® बदलने के लिठà¤à¤• [[Special:Renameuser|विशेष पृषà¥à¤ ]] जोड़ता है (''renameuser'' अधिकार आवशà¥à¤¯à¤•)",
'renameuserold' => 'सदà¥à¤¯ सदसà¥à¤¯à¤¨à¤¾à¤®:',
'renameusernew' => 'नया सदसà¥à¤¯à¤¨à¤¾à¤®:',
- 'renameuserreason' => 'नाम बदलने के कारण:', # Fuzzy
- 'renameusermove' => 'सदसà¥à¤¯ पृषà¥à¤  और वारà¥à¤¤à¤¾ पृषà¥à¤  (और उनके सबपेज) नये नाम की ओर भेजें',
- 'renameusersuppress' => 'नूतन नाम को अनà¥à¤ªà¥à¤°à¥‡à¤·à¤¿à¤¤ ना करें',
- 'renameuserreserve' => 'पà¥à¤°à¤¾à¤¨à¥€ सदसà¥à¤¯à¤¨à¤¾à¤® को अवरोध करें',
+ 'renameuserreason' => 'कारण:',
+ 'renameusermove' => 'सदसà¥à¤¯ पृषà¥à¤  और वारà¥à¤¤à¤¾ पृषà¥à¤  (और उनके उपपृषà¥à¤ ) नये नाम पर सà¥à¤¥à¤¾à¤¨à¤¾à¤‚तरित करें',
+ 'renameusersuppress' => 'नठनाम को अनà¥à¤ªà¥à¤°à¥‡à¤·à¤¿à¤¤ ना करें',
+ 'renameuserreserve' => 'पà¥à¤°à¤¾à¤¨ सदसà¥à¤¯à¤¨à¤¾à¤® भविषà¥à¤¯ में पà¥à¤°à¤¯à¥‹à¤— से अवरोधित करें',
'renameuserwarnings' => 'चेतावनी:',
- 'renameuserconfirm' => 'हाà¤, सदसà¥à¤¯ के नाम बदलें',
- 'renameusersubmit' => 'भेजें',
- 'renameusererrordoesnotexist' => 'सदसà¥à¤¯ "<nowiki>$1</nowiki>" असà¥à¤¤à¤¿à¤¤à¥à¤µà¤®à¥‡à¤‚ नहीं हैं।',
- 'renameusererrorexists' => 'सदसà¥à¤¯ "<nowiki>$1</nowiki>" पहले से असà¥à¤¤à¤¿à¤¤à¥à¤µà¤®à¥‡à¤‚ हैं।',
- 'renameusererrorinvalid' => 'सदसà¥à¤¯à¤¨à¤¾à¤® "<nowiki>$1</nowiki>" गलत हैं।',
- 'renameuser-error-request' => 'यह मांग पूरी करने मे समसà¥à¤¯à¤¾ आई हैं।
-कृपया पीछे जाकर फिरसे यतà¥à¤¨ करें।',
- 'renameuser-error-same-user' => 'आप सदसà¥à¤¯à¤¨à¤¾à¤® को उसी नामसे बदल नहीं सकते हैं।',
- 'renameusersuccess' => '"<nowiki>$1</nowiki>" का सदसà¥à¤¯à¤¨à¤¾à¤® "<nowiki>$2</nowiki>" कर दिया गया हैं।',
- 'renameuser-page-exists' => '$1 यह पनà¥à¤¨à¤¾ पहले से असà¥à¤¤à¤¿à¤¤à¥à¤µà¤®à¥‡à¤‚ हैं और इसपर अपने आप पà¥à¤¨à¤°à¥à¤²à¥‡à¤–न नहीं कर सकतें।',
- 'renameuser-page-moved' => '$1 का नाम बदलकर $2 कर दिया गया हैं।',
- 'renameuser-page-unmoved' => '$1 का नाम बदलकर $2 नहीं कर सकें हैं।',
- 'log-name-renameuser' => 'सदसà¥à¤¯à¤¨à¤¾à¤® बदलाव सूची',
- 'renameuser-move-log' => '"[[User:$1|$1]]" को "[[User:$2|$2]]" करते वकà¥à¤¤ अपने आप सदसà¥à¤¯à¤ªà¥ƒà¤·à¥à¤  बदल दिया हैं',
- 'right-renameuser' => 'सदसà¥à¤¯à¥‹à¤‚के नाम बदलें',
+ 'renameuserconfirm' => 'हाà¤, सदसà¥à¤¯ का नाम बदलें',
+ 'renameusersubmit' => 'जमा करें',
+ 'renameuser-submit-blocklog' => 'सदसà¥à¤¯ का बà¥à¤²à¥‰à¤• लॉग दिखाà¤à¤',
+ 'renameusererrordoesnotexist' => 'सदसà¥à¤¯ "<nowiki>$1</nowiki>" मौजूद नहीं है।',
+ 'renameusererrorexists' => 'सदसà¥à¤¯ "<nowiki>$1</nowiki>" पहले से मौजूद है।',
+ 'renameusererrorinvalid' => 'सदसà¥à¤¯à¤¨à¤¾à¤® "<nowiki>$1</nowiki>" अमानà¥à¤¯ है।',
+ 'renameuser-error-request' => 'अनà¥à¤°à¥‹à¤§ पाने में समसà¥à¤¯à¤¾ आई है।
+कृपया वापिस जाकर पà¥à¤¨à¤ƒ यतà¥à¤¨ करें।',
+ 'renameuser-error-same-user' => 'आप सदसà¥à¤¯à¤¨à¤¾à¤® को उसी नाम से नहीं बदल सकते हैं।',
+ 'renameusersuccess' => '"<nowiki>$1</nowiki>" का सदसà¥à¤¯à¤¨à¤¾à¤® "<nowiki>$2</nowiki>" कर दिया गया है।',
+ 'renameuser-page-exists' => '$1 पृषà¥à¤  पहले से मौजूद है और सà¥à¤µà¤šà¤¾à¤²à¤¿à¤¤ रूप से पà¥à¤¨à¤°à¥à¤²à¥‡à¤–ित नहीं किया जा सकता।',
+ 'renameuser-page-moved' => '$1 का नाम बदलकर $2 कर दिया गया है।',
+ 'renameuser-page-unmoved' => '$1 का नाम बदलकर $2 नहीं किया जा सका।',
+ 'log-name-renameuser' => 'सदसà¥à¤¯à¤¨à¤¾à¤® बदलाव लॉग',
+ 'log-description-renameuser' => 'यह सदसà¥à¤¯ नाम में बदलावों का लॉग है।',
+ 'logentry-renameuser-renameuser' => '$1 ने सदसà¥à¤¯ $4 ({{PLURAL:$6|$6 समà¥à¤ªà¤¾à¤¦à¤¨}}) का नाम {{GENDER:$2|बदल}} कर $5 कर दिया',
+ 'logentry-renameuser-renameuser-legacier' => '$1 ने सदसà¥à¤¯ $4 का नाम बदल कर $5 कर दिया',
+ 'renameuser-move-log' => 'सदसà¥à¤¯ "[[User:$1|$1]]" का नाम "[[User:$2|$2]]" करते समय पृषà¥à¤  सà¥à¤µà¤šà¤¾à¤²à¤¿à¤¤ रूप से सà¥à¤¥à¤¾à¤¨à¤¾à¤‚तरित कर दिया गया',
+ 'action-renameuser' => 'सदसà¥à¤¯à¥‹à¤‚ के नाम बदलने',
+ 'right-renameuser' => 'सदसà¥à¤¯à¥‹à¤‚ के नाम बदलें',
'renameuser-renamed-notice' => 'इस सदसà¥à¤¯ का नाम बदल दिया गया है।
-संदरà¥à¤­ के लिठनीचे नाम बदलने का चिटà¥à¤ à¤¾ है।',
+संदरà¥à¤­ के लिठनीचे नाम बदलने का लॉग है।',
);
/** Fiji Hindi (Latin script) (Fiji Hindi)
@@ -1823,6 +1917,7 @@ Protokol přemjenowanjow je deleka jako referenca podaty.',
* @author Adam78
* @author Dani
* @author Dj
+ * @author Hunyadym
* @author Tgr
*/
$messages['hu'] = array(
@@ -1849,7 +1944,7 @@ $messages['hu'] = array(
'renameuser-page-moved' => '$1 át lett nevezve $2 névre',
'renameuser-page-unmoved' => '$1-t nem sikerült $2 névre nevezi',
'log-name-renameuser' => 'Felhasználóátnevezési napló',
- 'logentry-renameuser-renameuser' => '$1 {{GENDER:$2|átnevezte}} $4 szerkesztőt ({{PLURAL:$6|egy|$6}} szerkesztés) erre: $4', # Fuzzy
+ 'logentry-renameuser-renameuser' => '$1 {{GENDER:$2|átnevezte}} $4 szerkesztőt ({{PLURAL:$6|egy|$6}} szerkesztés) erre: $5', # Fuzzy
'logentry-renameuser-renameuser-legacier' => '$1 átnevezte $4 szerkesztőt erre: $5',
'renameuser-move-log' => '„[[User:$1|$1]]†„[[User:$2|$2]]†névre való átnevezése közben automatikusan átnevezett oldal',
'action-renameuser' => 'felhasználó átnevezése',
@@ -1868,7 +1963,7 @@ $messages['ia'] = array(
'renameuser-desc' => "Adde un [[Special:Renameuser|pagina special]] pro renominar un usator (require le privilegio ''renameuser'')",
'renameuserold' => 'Nomine de usator actual:',
'renameusernew' => 'Nove nomine de usator:',
- 'renameuserreason' => 'Motivo del renomination:', # Fuzzy
+ 'renameuserreason' => 'Motivo:',
'renameusermove' => 'Renominar etiam le paginas de usator e de discussion (e lor subpaginas) verso le nove nomine',
'renameusersuppress' => 'Non crear redirectiones al nove nomine',
'renameuserreserve' => 'Blocar le ancian nomine de usator de esser usate in le futuro',
@@ -1973,6 +2068,9 @@ Pangngaasi nga agsubli ken padasen manen.',
'renameuser-page-moved' => 'Ti panid $1 ket naiyalisen idiay $2.',
'renameuser-page-unmoved' => 'Ti panid $1 ket saan a maiyalis idiay $2.',
'log-name-renameuser' => 'Listaan ti panaginaganan manen ti agar-aramat',
+ 'log-description-renameuser' => 'Daytoy ket listaan kadagiti panagbalbaliw kadagiti nagan ti agar-aramat.',
+ 'logentry-renameuser-renameuser' => 'Ni $1 ket {{GENDER:$2|ninagananna}} ti agar-aramat a ni $4 ({{PLURAL:$6|$6 nga inurnos|$6 kadagiti inurnos}}) iti $5',
+ 'logentry-renameuser-renameuser-legacier' => 'Ni $1 ket ninagananna ti agar-aramat a ni $4 iti $5',
'renameuser-move-log' => 'Automatiko nga iyalis ti panid bayat a nagnaganan manen ti agar-aramat "[[User:$1|$1]]" iti "[[User:$2|$2]]"',
'action-renameuser' => 'inaganan manen dagiti agar-aramat',
'right-renameuser' => 'Inaganan manen dagiti agar-aramat',
@@ -2265,6 +2363,7 @@ $messages['kk-arab'] = array(
);
/** Kazakh (Cyrillic script) (қазақша (кирил)‎)
+ * @author Arystanbek
*/
$messages['kk-cyrl'] = array(
'renameuser' => 'ҚатыÑушыны қайта атау',
@@ -2280,7 +2379,7 @@ $messages['kk-cyrl'] = array(
'renameuser-page-exists' => '$1 деген бет бар түге, және өздік түрде оның Ò¯Ñтіне ештеңе жазылмайды.',
'renameuser-page-moved' => '$1 деген бет $2 деген бетке жылжытылды.',
'renameuser-page-unmoved' => '$1 деген бет $2 деген бетке жылжытылмады.',
- 'log-name-renameuser' => 'ҚатыÑушыны қайта атау журналы',
+ 'log-name-renameuser' => 'ҚатыÑушыны еÑімін өзгеру журналы',
'renameuser-move-log' => '«[[User:$1|$1]]» деген қатыÑушы атын «[[User:$2|$2]]» дегенге ауыÑқанда бет өздік түрде жылжытылды',
);
@@ -2362,7 +2461,7 @@ $messages['ko'] = array(
'renameuser' => 'ì‚¬ìš©ìž ì´ë¦„ 바꾸기',
'renameuser-linkoncontribs' => 'ì´ë¦„ 바꾸기',
'renameuser-linkoncontribs-text' => 'ì´ ì‚¬ìš©ìžì˜ 계정 ì´ë¦„ì„ ë°”ê¿‰ë‹ˆë‹¤.',
- 'renameuser-desc' => "ì‚¬ìš©ìž ì´ë¦„ì„ ë°”ê¾¸ê¸°ë¥¼ 위한 [[Special:Renameuser|특수 문서]]를 추가 ('''renameuser''' 권한 í•„ìš”)",
+ 'renameuser-desc' => "ì‚¬ìš©ìž ì´ë¦„ì„ ë°”ê¾¸ê¸°ë¥¼ 위한 [[Special:Renameuser|특수 문서]]를 추가합니다 ('''renameuser''' 권한 í•„ìš”)",
'renameuserold' => '기존 ì‚¬ìš©ìž ì´ë¦„:',
'renameusernew' => '새 ì‚¬ìš©ìž ì´ë¦„:',
'renameuserreason' => 'ì´ìœ :',
@@ -2383,8 +2482,8 @@ $messages['ko'] = array(
'renameuser-page-exists' => '$1 문서가 ì´ë¯¸ 존재하여 ìžë™ìœ¼ë¡œ ì´ë™í•˜ì§€ 못했습니다.',
'renameuser-page-moved' => '$1 문서를 $2 문서로 옮겼습니다.',
'renameuser-page-unmoved' => '$1 문서를 $2 문서로 ì´ë™í•˜ì§€ 못했습니다.',
- 'log-name-renameuser' => 'ì´ë¦„ 바꾸기 기ë¡',
- 'log-description-renameuser' => 'ì‚¬ìš©ìž ì´ë¦„ 바꾸기 기ë¡ìž…니다.',
+ 'log-name-renameuser' => 'ì‚¬ìš©ìž ì´ë¦„ 바꾸기 기ë¡',
+ 'log-description-renameuser' => 'ì‚¬ìš©ìž ì´ë¦„ì„ ë°”ê¾¼ 기ë¡ìž…니다.',
'logentry-renameuser-renameuser' => '$1 사용ìžê°€ $4 사용ìž({{PLURAL:$6|편집 $6회}})ì˜ ì´ë¦„ì„ $5(으)ë¡œ {{GENDER:$2|바꾸었습니다}}',
'logentry-renameuser-renameuser-legacier' => '$1 사용ìžê°€ $4 사용ìžì˜ ì´ë¦„ì„ $5(으)ë¡œ 바꾸었습니다',
'renameuser-move-log' => '"[[User:$1|$1]]" 사용ìžë¥¼ "[[User:$2|$2]]" 사용ìžë¡œ 바꾸면서 문서를 ìžë™ìœ¼ë¡œ 옮겼습니다',
@@ -2452,14 +2551,14 @@ $messages['ku-latn'] = array(
'renameusererrorinvalid' => 'Navê "<nowiki>$1</nowiki>" ji bikarhêneran re nayê qebûlkirin.',
'renameusersuccess' => 'Navê bikarhênerê "<nowiki>$1</nowiki>" bû "<nowiki>$2</nowiki>"',
'renameuser-page-exists' => 'Rûpelê $1 berê heye û nikane otomatîk were guherandin.',
- 'renameuser-page-moved' => 'Rûpela $1 çû cihê $2.',
+ 'renameuser-page-moved' => 'Navê $1 weke $2 hate guhertin.',
'renameuser-page-unmoved' => 'Rûpela $1 nikanî çûba ciha $2.',
'log-name-renameuser' => 'Guhertina navê bikarhêner',
'renameuser-move-log' => 'Otomatîk hate guherandin, ji ber ku "[[User:$1|$1]]" navê xwe guherand û niha bû "[[User:$2|$2]]"',
'right-renameuser' => 'Navê bikarhêneran biguherîne:',
);
-/** Kirghiz (Кыргызча)
+/** Kyrgyz (Кыргызча)
* @author Chorobek
*/
$messages['ky'] = array(
@@ -2507,6 +2606,7 @@ Commodule notatio renominationum usoris subter datur.',
/** Luxembourgish (Lëtzebuergesch)
* @author Les Meloures
* @author Robby
+ * @author Soued031
*/
$messages['lb'] = array(
'renameuser' => 'Benotzernumm änneren',
@@ -2530,7 +2630,7 @@ $messages['lb'] = array(
Gitt w.e.g. zréck a versicht et nach eng Kéier.',
'renameuser-error-same-user' => 'Dir kënnt kee Benotzernumm änneren, an him deselwechten Numm erëmginn.',
'renameusersuccess' => 'De Benotzer "<nowiki>$1</nowiki>" gouf "<nowiki>$2</nowiki>" ëmbenannt.',
- 'renameuser-page-exists' => "D'Säit $1 gëtt et schonns a kann net automatesch iwwerschriwwe ginn.",
+ 'renameuser-page-exists' => "D'Säit $1 gëtt et schonn a kann net automatesch iwwerschriwwe ginn.",
'renameuser-page-moved' => "D'Säit $1 gouf op $2 geréckelt.",
'renameuser-page-unmoved' => "D'Säit $1 konnt net op $2 geréckelt ginn.",
'log-name-renameuser' => 'Logbuch vun den Ännerunge vum Benotzernumm',
@@ -2582,6 +2682,13 @@ $messages['li'] = array(
Relevante regels oet 't logbook staon hieónger.",
);
+/** لوری (لوری)
+ * @author Mogoeilor
+ */
+$messages['lrc'] = array(
+ 'renameuserreason' => 'دلیل:',
+);
+
/** Lithuanian (lietuvių)
* @author Eitvys200
* @author Homo
@@ -2627,7 +2734,7 @@ $messages['lv'] = array(
'renameuser-linkoncontribs-text' => 'PÄrsaukt Å¡o lietotÄju',
'renameuserold' => 'PaÅ¡reizÄ“jais lietotÄja vÄrds:',
'renameusernew' => 'Jaunais lietotÄja vÄrds:',
- 'renameuserreason' => 'PÄrsaukÅ¡anas iemesls:', # Fuzzy
+ 'renameuserreason' => 'Iemesls:',
'renameuserreserve' => 'BloÄ·Ä“t veco lietotÄjvÄrdu no turpmÄkas izmantoÅ¡anas',
'renameuserwarnings' => 'BrÄ«dinÄjumi:',
'renameuserconfirm' => 'JÄ, pÄrdÄ“vÄ“t lietotÄju',
@@ -2774,7 +2881,7 @@ $messages['mr'] = array(
'renameuserreserve' => 'जà¥à¤¨à¥‡ सदसà¥à¤¯ खाते पà¥à¤¢à¥€à¤² वापरासाठी अवरà¥à¤¦à¥à¤§ करा',
'renameuserwarnings' => 'ताकीद:',
'renameuserconfirm' => 'होय, सदसà¥à¤¯à¤¾à¤šà¥‡ नाव बदला',
- 'renameusersubmit' => 'पाठवा',
+ 'renameusersubmit' => 'सादर करा',
'renameusererrordoesnotexist' => '"<nowiki>$1</nowiki>" नावाचा सदसà¥à¤¯ असà¥à¤¤à¤¿à¤¤à¥à¤µà¤¾à¤¤ नाही.',
'renameusererrorexists' => '"<nowiki>$1</nowiki>" नावाचा सदसà¥à¤¯ अगोदरच असà¥à¤¤à¤¿à¤¤à¥à¤µà¤¾à¤¤ आहे',
'renameusererrorinvalid' => '"<nowiki>$1</nowiki>" हे नाव चà¥à¤•à¥€à¤šà¥‡ आहे.',
@@ -2892,7 +2999,7 @@ $messages['nan'] = array(
'renameuser-page-moved' => '$1 í-keng sóa khì tī $2.',
);
-/** Norwegian Bokmål (norsk (bokmål)‎)
+/** Norwegian Bokmål (norsk bokmål)
* @author Danmichaelo
* @author Event
* @author Nghtwlkr
@@ -2958,31 +3065,40 @@ $messages['nds'] = array(
'right-renameuser' => 'Brukers ne’en Naam geven',
);
-/** Nedersaksies (Nedersaksies)
+/** Low Saxon (Netherlands) (Nedersaksies)
* @author Servien
*/
$messages['nds-nl'] = array(
'renameuser' => 'Gebruker herneumen',
'renameuser-linkoncontribs' => 'gebruker herneumen',
+ 'renameuser-linkoncontribs-text' => 'Disse gebruker herneumen',
+ 'renameuser-desc' => "Der kömp n [[Special:Renameuser|spesiale zied]] bie um n gebruker te herneumen (je hebben hierveur t recht ''renameuser'' neudig)",
'renameuserold' => 'Gebrukersnaam noen',
'renameusernew' => 'Nieje gebrukersnaam:',
- 'renameuserreason' => 'Reden veur t herneumen:', # Fuzzy
+ 'renameuserreason' => 'Reden:',
'renameusermove' => 'Herneum gebruker en gebrukersziejen (en ziejen die deronder vallen) naor de nieje naam.',
'renameusersuppress' => 'Gien deurverwiezingen maken naor de nieje naam',
'renameuserreserve' => 'Veurkoemen dat de ouwe gebruker opniej eregistreerd wörden',
'renameuserwarnings' => 'Waorschuwingen:',
'renameuserconfirm' => 'Ja, herneum disse gebruker',
'renameusersubmit' => 'Herneumen',
+ 'renameuser-submit-blocklog' => 'Blokkeerlogboek veur gebruker laoten zien',
'renameusererrordoesnotexist' => 'De gebruker "<nowiki>$1</nowiki>" besteet niet.',
'renameusererrorexists' => 'De gebrukersnaam "<nowiki>$1</nowiki>" is al in gebruuk.',
'renameusererrorinvalid' => 'De gebrukersnaam "<nowiki>$1</nowiki>" is ongeldig.',
+ 'renameuser-error-request' => 'Der was n probleem bie t ontvangen van de anvraag.
+Gao weerumme en probeer t nog es.',
+ 'renameuser-error-same-user' => 'Je kunnen gien gebruker herneumen naor dezelfde naam.',
'renameusersuccess' => 'Gebruker "<nowiki>$1</nowiki>" is herneumd naor "<nowiki>$2</nowiki>".',
'renameuser-page-exists' => 'De zied $1 besteet al en kan niet automaties overschreven wörden.',
'renameuser-page-moved' => 'De zied $1 is herneumd naor $2.',
'renameuser-page-unmoved' => 'De zied $1 kon niet herneumd wörden naor $2.',
'log-name-renameuser' => 'Logboek gebrukersnaamwiezigingen',
'log-description-renameuser' => 'Dit is n logboek mit wiezigingen van gebrukersnamen',
+ 'logentry-renameuser-renameuser' => '$1 {{GENDER:$2|hef}} gebruker $4 ($6 {{PLURAL:$6|bewarking|bewarkingen}}) herneumd naor $5',
+ 'logentry-renameuser-renameuser-legacier' => '$1 hef de gebruker $4 herneumd naor $5',
'renameuser-move-log' => 'Zied is automaties verplaotst bie t herneumen van de gebruker "[[User:$1|$1]]" naor "[[User:$2|$2]]"',
+ 'action-renameuser' => 'gebrukers herneumen',
'right-renameuser' => 'Gebrukers herneumen',
'renameuser-renamed-notice' => 'Disse gebrukersnaam is herneumd.
Hieronder vie-j t herneumlogboek as referensie.',
@@ -3047,7 +3163,7 @@ $messages['nl-informal'] = array(
'renameuser-error-same-user' => 'Je kunt geen gebruiker hernoemen naar dezelfde naam.',
);
-/** Norwegian Nynorsk (norsk (nynorsk)‎)
+/** Norwegian Nynorsk (norsk nynorsk)
* @author Dittaeva
* @author Gunnernett
* @author Harald Khan
@@ -3129,7 +3245,7 @@ $messages['oc'] = array(
Lo jornal dels cambiaments de noms es disponible çaijós per informacion.',
);
-/** Oriya (ଓଡ଼ିଆ)
+/** Oriya (ଓଡ଼ିଆ)
* @author Jnanaranjan Sahu
* @author Odisha1
* @author Psubhashish
@@ -3379,11 +3495,11 @@ $messages['pt'] = array(
'renameuser-linkoncontribs' => 'alterar nome do utilizador',
'renameuser-linkoncontribs-text' => 'Alterar o nome deste utilizador',
'renameuser-desc' => "[[Special:Renameuser|Página especial]] para alterar o nome de um utilizador (requer o privilégio ''renameuser'')",
- 'renameuserold' => 'Nome de usuário atual:',
+ 'renameuserold' => 'Nome de utilizador atual:',
'renameusernew' => 'Novo nome de utilizador:',
- 'renameuserreason' => 'Motivo da alteração de nome:', # Fuzzy
+ 'renameuserreason' => 'Motivo:',
'renameusermove' => 'Mover as páginas e subpáginas de utilizador e as respectivas discussões para o novo nome',
- 'renameusersuppress' => 'Não criar redireccionamentos para o novo nome',
+ 'renameusersuppress' => 'Não criar redirecionamentos para o novo nome',
'renameuserreserve' => 'Impedir novos usos do antigo nome de utilizador',
'renameuserwarnings' => 'Alertas:',
'renameuserconfirm' => 'Sim, alterar o nome do utilizador',
@@ -3400,7 +3516,7 @@ Volte atrás e tente de novo, por favor.',
'renameuser-page-moved' => 'A página $1 foi movida para $2.',
'renameuser-page-unmoved' => 'Não foi possível mover a página $1 para $2.',
'log-name-renameuser' => 'Registo de alteração do nome de utilizadores',
- 'log-description-renameuser' => 'Este é um registo de alterações efectuadas a nomes de utilizadores.',
+ 'log-description-renameuser' => 'Este é um registro de alterações efetuadas a nomes de utilizadores.',
'logentry-renameuser-renameuser' => '$1 renomeou $4 (com $6 edições) para $5', # Fuzzy
'logentry-renameuser-renameuser-legacier' => '$1 renomeou $4 para $5',
'renameuser-move-log' => 'Página movida automaticamente ao alterar o nome do utilizador "[[User:$1|$1]]" para "[[User:$2|$2]]"',
@@ -3411,6 +3527,7 @@ Volte atrás e tente de novo, por favor.',
);
/** Brazilian Portuguese (português do Brasil)
+ * @author Cainamarques
* @author Giro720
* @author Opraco
* @author 555
@@ -3418,12 +3535,12 @@ Volte atrás e tente de novo, por favor.',
$messages['pt-br'] = array(
'renameuser' => 'Renomear usuário',
'renameuser-linkoncontribs' => 'renomear usuário',
- 'renameuser-linkoncontribs-text' => 'excluir este usuário',
+ 'renameuser-linkoncontribs-text' => 'Renomear este usuário',
'renameuser-desc' => "Adiciona uma [[Special:Renameuser|página especial]] para renomear um usuário (requer privilégio ''renameuser'')",
'renameuserold' => 'Nome de usuário atual:',
'renameusernew' => 'Novo nome de usuário:',
'renameuserreason' => 'Motivo:',
- 'renameusermove' => 'Mover as páginas de usuário, páginas de discussão de usuário e sub-páginas para o novo nome',
+ 'renameusermove' => 'Mover as páginas de usuário, páginas de discussão de usuário (e suas sub-páginas) para o novo nome',
'renameusersuppress' => 'Não criar redirecionamentos para o novo nome',
'renameuserreserve' => 'Impedir novos usos do antigo nome de usuário',
'renameuserwarnings' => 'Alertas:',
@@ -3437,18 +3554,18 @@ $messages['pt-br'] = array(
Retorne e tente novamente.',
'renameuser-error-same-user' => 'Não é possível renomear um usuário para o nome anterior.',
'renameusersuccess' => 'O usuário "<nowiki>$1</nowiki>" foi renomeado para "<nowiki>$2</nowiki>".',
- 'renameuser-page-exists' => 'Já existe a página $1. Não é possível sobrescrever automaticamente.',
+ 'renameuser-page-exists' => 'A página $1 já existe. Não foi possível sobrescreve-la automaticamente.',
'renameuser-page-moved' => 'A página $1 foi movida com sucesso para $2.',
'renameuser-page-unmoved' => 'Não foi possível mover a página $1 para $2.',
'log-name-renameuser' => 'Registro de renomeação de usuários',
- 'log-description-renameuser' => 'Este é um registro de alterações efetuadas em nomes de usuários.',
- 'logentry-renameuser-renameuser' => '$1 renomeou $4 (com $6 ediç{{PLURAL:$6|ão|ões}}) para $5', # Fuzzy
+ 'log-description-renameuser' => 'Este é um registro de alterações de nomes de usuários.',
+ 'logentry-renameuser-renameuser' => '$1 {{GENDER:$2|renomeou}} $4 (com $6 ediç{{PLURAL:$6|ão|ões}}) para $5',
'logentry-renameuser-renameuser-legacier' => '$1 renomeou $4 para $5',
- 'renameuser-move-log' => 'Páginas foram movidas automaticamente ao renomear o usuário "[[User:$1|$1]]" para "[[User:$2|$2]]"',
+ 'renameuser-move-log' => 'Páginas movidas automaticamente ao renomear o usuário "[[User:$1|$1]]" para "[[User:$2|$2]]"',
'action-renameuser' => 'renomear usuários',
'right-renameuser' => 'Renomear usuários',
'renameuser-renamed-notice' => 'Este usuário foi renomeado.
-O registro de renomeação é fornecido abaixo para referência.',
+O registro de renomeação é fornecido abaixo, para referência.',
);
/** Quechua (Runa Simi)
@@ -3575,6 +3692,7 @@ L'archivije de le renomenaziune 'u iacchie aqquà sotte cumme referimende.",
/** Russian (руÑÑкий)
* @author Ahonc
+ * @author Anonim.one
* @author DCamer
* @author DR
* @author EugeneZelenko
@@ -3609,7 +3727,7 @@ $messages['ru'] = array(
'renameuser-page-unmoved' => 'Страница $1 не может быть переименована в $2.',
'log-name-renameuser' => 'Журнал переименований учаÑтников',
'log-description-renameuser' => 'Это журнал произведённых переименований зарегиÑтрированных учаÑтников.',
- 'logentry-renameuser-renameuser' => '$1 {{GENDER:$2|переименовал}} Ð¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ñ‚ÐµÐ»Ñ $4 ({{PLURAL:$6|$6 правка|$6 правки|$6 правок}}) в $5',
+ 'logentry-renameuser-renameuser' => '$1 {{GENDER:$2|переименовал}} учаÑтника $4 ({{PLURAL:$6|$6 правка|$6 правки|$6 правок}}) в $5',
'logentry-renameuser-renameuser-legacier' => '$1 переименовал Ð¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ñ‚ÐµÐ»Ñ $4 в $5',
'renameuser-move-log' => 'ÐвтоматичеÑки в ÑвÑзи Ñ Ð¿ÐµÑ€ÐµÐ¸Ð¼ÐµÐ½Ð¾Ð²Ð°Ð½Ð¸ÐµÐ¼ учётной запиÑи «[[User:$1|$1]]» в «[[User:$2|$2]]»',
'action-renameuser' => 'переименование учаÑтников',
@@ -3799,7 +3917,7 @@ $messages['si'] = array(
'renameuser-desc' => "පරිà·à·“ලකයෙක් යළි-නම්කරනු වස් [[Special:Renameuser|විà·à·šà·‚ පිටුවක්]] එක් කරන්න (''renameuser'' අයිතිය අවà·à·Šâ€à¶ºà¶ºà·’)",
'renameuserold' => 'වත්මන් පරිà·à·“ලක නà·à¶¸à¶º:',
'renameusernew' => 'නව පරිà·à·“ලක නà·à¶¸à¶º:',
- 'renameuserreason' => 'යළි-නම්කිරීමට හේතුව:', # Fuzzy
+ 'renameuserreason' => 'හේතුව:',
'renameusermove' => 'පරිà·à·“ලක à·„à· à·ƒà·à¶šà¶ à·Šà¶¡à· පිටු (හ෠ඒවà·à¶ºà·š උපපිටු) නව නම වෙතට ගෙන යන්න',
'renameusersuppress' => 'යළි යොමුවන් නම නà·à¶¸à¶ºà·š à·ƒà·à¶šà·ƒà·“මෙන් වළකින්න.',
'renameuserreserve' => 'පà·à¶»à¶«à·’ පරිà·à·“ලක නම අනà·à¶œà¶­ භà·à·€à·’තයෙන් à·€à·à¶»à¶«à¶º කරන්න',
@@ -3955,6 +4073,7 @@ Regjistri i riemërimit është poshtë për referencë.',
/** Serbian (Cyrillic script) (ÑрпÑки (ћирилица)‎)
* @author FriedrickMILBarbarossa
+ * @author Milicevic01
* @author Millosh
* @author Rancher
* @author Sasa Stefanovic
@@ -3968,7 +4087,7 @@ $messages['sr-ec'] = array(
'renameuser-desc' => "Додаје [[Special:Renameuser|поÑебну Ñтраницу]] за преименовање кориÑника (потребно право ''renameuser'')",
'renameuserold' => 'Тренутно кориÑничко име:',
'renameusernew' => 'Ðово кориÑничко име:',
- 'renameuserreason' => 'Разлог:', # Fuzzy
+ 'renameuserreason' => 'Разлог:',
'renameusermove' => 'ПремеÑти кориÑничку Ñтраницу и Ñтраницу за разговор (и њихове подÑтранице) на нови назив',
'renameusersuppress' => 'Ðе правите преуÑмерења на нови назив',
'renameuserreserve' => 'Блокирај Ñтаро кориÑничко име за даљу употребу',
@@ -3998,6 +4117,7 @@ $messages['sr-ec'] = array(
* @author FriedrickMILBarbarossa
* @author Liangent
* @author Michaello
+ * @author Milicevic01
* @author Жељко Тодоровић
*/
$messages['sr-el'] = array(
@@ -4007,7 +4127,7 @@ $messages['sr-el'] = array(
'renameuser-desc' => "Dodaje [[Special:Renameuser|posebnu stranicu]] za preimenovanje korisnika (potrebno pravo ''renameuser'').",
'renameuserold' => 'Trenutno korisniÄko ime:',
'renameusernew' => 'Novo korisniÄko ime:',
- 'renameuserreason' => 'Razlog preimenovanja:', # Fuzzy
+ 'renameuserreason' => 'Razlog:',
'renameusermove' => 'Premesti korisniÄku stranicu i stranicu za razgovor (i njihove podstranice) na novo ime',
'renameusersuppress' => 'Ne pravite preusmerenja na novi naziv',
'renameuserreserve' => 'Blokiraj staro korisniÄko ime za dalju upotrebu',
@@ -4093,9 +4213,11 @@ $messages['su'] = array(
* @author Cybjit
* @author Dafer45
* @author Habj
+ * @author Jopparn
* @author Lejonel
* @author Lokal Profil
* @author M.M.S.
+ * @author MagnusA
* @author Najami
* @author Per
*/
@@ -4124,6 +4246,9 @@ $messages['sv'] = array(
'renameuser-page-moved' => 'Sidan $1 har flyttats till $2.',
'renameuser-page-unmoved' => 'Sidan $1 kunde inte flyttas till $2.',
'log-name-renameuser' => 'Logg över användarnamnsbyten',
+ 'log-description-renameuser' => 'Detta är en logg över ändringar av användarnamn',
+ 'logentry-renameuser-renameuser' => '$1 {{GENDER:$2|bytte namn på}} användare $4 ({{PLURAL:$6|$6 redigering|$6 redigeringar}}) till $5',
+ 'logentry-renameuser-renameuser-legacier' => '$1 bytte namn på användare $4 till $5',
'renameuser-move-log' => 'Flyttade automatiskt sidan när namnet byttes på användaren "[[User:$1|$1]]" till "[[User:$2|$2]]"',
'action-renameuser' => 'ändra namn på användaren',
'right-renameuser' => 'Ändra användares namn',
@@ -4239,6 +4364,7 @@ $messages['tet'] = array(
'renameusererrordoesnotexist' => 'Uza-na\'in "<nowiki>$1</nowiki>" la iha.',
'renameuser-page-moved' => 'Book tiha pájina $1 ba $2.',
'renameuser-page-unmoved' => 'La bele book pájina $1 ba $2.',
+ 'logentry-renameuser-renameuser-legacier' => '$1 muda naran uza-na\'in "$4" nian. Naran foun: "$5"',
'right-renameuser' => "Fó naran foun ba uza-na'in sira",
);
@@ -4627,7 +4753,7 @@ $messages['vo'] = array(
'renameuser-desc' => "Votanemön gebani (gität: ''renameuser'' zesüdon)",
'renameuserold' => 'Gebananem anuik:',
'renameusernew' => 'Gebananem nulik:',
- 'renameuserreason' => 'Kod votanemama:', # Fuzzy
+ 'renameuserreason' => 'Kod:',
'renameusermove' => 'Topätükön padi e bespikapadi gebana (e donapadis onsik) ad nem nulik',
'renameuserreserve' => 'Neletön gebananemi rigik (pos votanemam) ad pagebön ün fütür',
'renameuserwarnings' => 'Nuneds:',
@@ -4718,6 +4844,7 @@ $messages['yo'] = array(
);
/** Cantonese (粵語)
+ * @author Liuxinyu970226
*/
$messages['yue'] = array(
'renameuser' => '改用戶å',
diff --git a/extensions/Renameuser/RenameuserSQL.php b/extensions/Renameuser/RenameuserSQL.php
index eeb879a0..ca03ad3e 100644
--- a/extensions/Renameuser/RenameuserSQL.php
+++ b/extensions/Renameuser/RenameuserSQL.php
@@ -221,7 +221,7 @@ class RenameuserSQL {
}
if ( count( $jobs ) > 0 ) {
- Job::safeBatchInsert( $jobs ); // don't commit yet
+ JobQueueGroup::singleton()->push( $jobs, JobQueue::QOS_ATOMIC ); // don't commit yet
}
// Commit the transaction
diff --git a/extensions/SimpleAntiSpam/SimpleAntiSpam.i18n.php b/extensions/SimpleAntiSpam/SimpleAntiSpam.i18n.php
index e4ee0a62..2e92679d 100644
--- a/extensions/SimpleAntiSpam/SimpleAntiSpam.i18n.php
+++ b/extensions/SimpleAntiSpam/SimpleAntiSpam.i18n.php
@@ -24,6 +24,10 @@ Do '''NOT''' fill this in!",
* @author The Evil IP address
*/
$messages['qqq'] = array(
+ 'simpleantispam' => 'Unused at this time.',
+ 'simpleantispam-label' => 'Used as label for the input box in "Edit" page.
+
+The label and the input box are always hidden.',
'simpleantispam-desc' => '{{desc|name=Simple Anti Spam|url=http://www.mediawiki.org/wiki/Extension:SimpleAntiSpam}}',
);
@@ -76,7 +80,7 @@ $messages['arz'] = array(
'simpleantispam-desc' => 'بيضي٠اختبار سبام/بوت بسيط للاستمارات',
);
-/** Assamese (অসমীয়া)
+/** Assamese (অসমীয়া)
* @author Gitartha.bordoloi
*/
$messages['as'] = array(
@@ -116,6 +120,16 @@ $messages['bcc'] = array(
'simpleantispam-desc' => 'اضاÙÙ‡ کنت یم ساده اسپم/روبوت Ú†Ú© په کنترل Ùرم آن',
);
+/** Bikol Central (Bikol Central)
+ * @author Geopoet
+ */
+$messages['bcl'] = array(
+ 'simpleantispam' => 'An saimong pagliwat nakapagkiblit kan anti-espam na mekanismo',
+ 'simpleantispam-label' => 'Narikisa kan anti-espam.
+"Dae" ka magkaag nin laman digde!',
+ 'simpleantispam-desc' => 'Minadugang nin simplihong rikisa kan espam/panalnga sa mga porma',
+);
+
/** Belarusian (TaraÅ¡kievica orthography) (беларуÑÐºÐ°Ñ (тарашкевіца)‎)
* @author EugeneZelenko
*/
@@ -198,6 +212,16 @@ $messages['cy'] = array(
'simpleantispam-desc' => 'Yn ychwanegu prawf sbam/bot syml i ffurflenni',
);
+/** Danish (dansk)
+ * @author HenrikKbh
+ */
+$messages['da'] = array(
+ 'simpleantispam' => 'Din redigering udløste anti-spam mekanismen',
+ 'simpleantispam-label' => "Anti-spam tjek.
+Udfyld ''' ikke ''' dette!",
+ 'simpleantispam-desc' => 'Tilføjer en simpel spam/bot kontrol til formularer',
+);
+
/** German (Deutsch)
* @author Kghbln
* @author Raimond Spekking
@@ -466,7 +490,7 @@ $messages['it'] = array(
* @author Shirayuki
*/
$messages['ja'] = array(
- 'simpleantispam' => 'SPAM防止機能ãŒæœ‰åŠ¹ã«ãªã‚Šã¾ã—ãŸ',
+ 'simpleantispam' => '編集内容ãŒåŽŸå› ã§ã‚¹ãƒ‘ム防止機能ãŒç™ºå‹•ã—ã¾ã—ãŸ',
'simpleantispam-label' => "SPAM防止ãƒã‚§ãƒƒã‚¯ã§ã™ã€‚
決ã—ã¦ã“ã“ã«å€¤ã‚’入力'''ã—ãªã„'''ã§ãã ã•ã„。",
'simpleantispam-desc' => 'フォームã«ç°¡å˜ãªã‚¹ãƒ‘ム/ボット ãƒã‚§ãƒƒã‚¯ã‚’追加',
@@ -497,12 +521,13 @@ $messages['ka'] = array(
* @author Klutzy
* @author Kwj2772
* @author Yknok29
+ * @author ì•„ë¼
*/
$messages['ko'] = array(
'simpleantispam' => '현재 íŽ¸ì§‘ì´ ìŠ¤íŒ¸ 방지 ìž¥ì¹˜ì— íƒì§€ë˜ì—ˆìŠµë‹ˆë‹¤',
'simpleantispam-label' => "스팸 방지 검사입니다.
ì´ê²ƒì„ 입력하지 '''마세요'''!",
- 'simpleantispam-desc' => '스팸/ë´‡ í™•ì¸ ìž¥ì¹˜ë¥¼ 추가',
+ 'simpleantispam-desc' => 'ì–‘ì‹ì— 간단한 스팸/ë´‡ í™•ì¸ ìž¥ì¹˜ë¥¼ 추가합니다',
);
/** Colognian (Ripoarisch)
@@ -604,7 +629,7 @@ $messages['ms'] = array(
'simpleantispam-desc' => 'Menambah pemeriksaan spam/bot ringkas di borang sunting',
);
-/** Norwegian Bokmål (norsk (bokmål)‎)
+/** Norwegian Bokmål (norsk bokmål)
*/
$messages['nb'] = array(
'simpleantispam' => 'Redigeringen din utløste antispammekanismen',
@@ -639,7 +664,7 @@ $messages['nl-informal'] = array(
'simpleantispam' => 'Je bewerking heeft het antispammechanisme in werking gesteld',
);
-/** Norwegian Nynorsk (norsk (nynorsk)‎)
+/** Norwegian Nynorsk (norsk nynorsk)
* @author Harald Khan
* @author Njardarlogar
*/
@@ -660,7 +685,7 @@ Inscrigatz '''PAS RES''' dedins !",
'simpleantispam-desc' => 'Apond al formulari la verificacion d’un bòt tarabastejaire',
);
-/** Oriya (ଓଡ଼ିଆ)
+/** Oriya (ଓଡ଼ିଆ)
* @author Psubhashish
*/
$messages['or'] = array(
diff --git a/extensions/SpamBlacklist/README b/extensions/SpamBlacklist/README
index c017efb4..370a90b3 100644
--- a/extensions/SpamBlacklist/README
+++ b/extensions/SpamBlacklist/README
@@ -38,14 +38,16 @@ Compatibility
-----------
This extension is primarily maintained to run on the latest release version
-of MediaWiki (1.9.x as of this writing) and development versions.
+of MediaWiki (1.22.x as of this writing) and development versions, however
+the current version should work up to 1.21.
-The current version *may* work as far back as 1.6.x, but will *not* work
-with 1.5.x or older. You may be able to dig older versions out of the
-Subversion repository which work with those versions, but if using
-Wikimedia's blacklist file you will likely have problems with failure
-due to the large size of the blacklist not being handled by old versions
-of the code.
+If you are using an older version of MediaWiki, you can checkout an
+older release branch, for example MediaWiki 1.20 would use REL1_20.
+
+For even older versions, you may be able to dig older versions out of the
+Git repository which work, but if using Wikimedia's blacklist file
+you will likely have problems with failure due to the large size of the
+blacklist not being handled by old versions of the code.
File format
@@ -142,6 +144,21 @@ A local whitelist can be maintained by creating a [[MediaWiki:Spam-whitelist]]
page and listing hostnames in it, using the same format as the blacklists.
URLs matching the whitelist will be ignored locally.
+Logging
+-------
+
+To aid with tracking which domains are being spammed, this extension has
+multiple logging features. By default, hits are included in the standard
+debug log (controlled by $wgDebugLogFile). You can grep for 'SpamBlacklistHit',
+which includes the IP of the user and the URL they tried to submit. This
+file is only availible for people with server access and includes private info.
+
+You can also enable logging to [[Special:Log]] by setting $wgLogSpamBlacklistHits to
+true. This will include the account which tripped the blacklist, the page title the
+edit was attempted on, and the specific URL. By default this log is only viewable
+to wiki administrators, and you can grant other groups access by giving them the
+"spamblacklistlog" permission.
+
Copyright
---------
This extension and this documentation was written by Tim Starling and is
diff --git a/extensions/SpamBlacklist/SpamBlacklist.i18n.php b/extensions/SpamBlacklist/SpamBlacklist.i18n.php
index bd4e4f87..343586b7 100644
--- a/extensions/SpamBlacklist/SpamBlacklist.i18n.php
+++ b/extensions/SpamBlacklist/SpamBlacklist.i18n.php
@@ -53,10 +53,16 @@ $messages['en'] = array(
'spam-blacklisted-email-signup' => 'The given email address is currently blacklisted from use.',
'spam-invalid-lines' => "The following spam blacklist {{PLURAL:$1|line is an|lines are}} invalid regular {{PLURAL:$1|expression|expressions}} and {{PLURAL:$1|needs|need}} to be corrected before saving the page:",
- 'spam-blacklist-desc' => 'Regex-based anti-spam tool: [[MediaWiki:Spam-blacklist]] and [[MediaWiki:Spam-whitelist]]',
+ 'spam-blacklist-desc' => 'Regex-based anti-spam tool allowing to blacklist URLs in pages and email addresses for registered users',
+ 'log-name-spamblacklist' => 'Spam blacklist log',
+ 'log-description-spamblacklist' => 'These events track spam blacklist hits.',
+ 'logentry-spamblacklist-hit' => '$1 caused a spam blacklist hit on $3 by attempting to add $4.',
+ 'right-spamblacklistlog' => 'View spam blacklist log',
+ 'action-spamblacklistlog' => 'view the spam blacklist log',
);
/** Message documentation (Message documentation)
+ * @author Fryed-peach
* @author Purodha
* @author SPQRobin
* @author Shirayuki
@@ -66,8 +72,8 @@ $messages['en'] = array(
$messages['qqq'] = array(
'spam-blacklist' => "See also: [[MediaWiki:spam-whitelist]] and [[MediaWiki:captcha-addurl-whitelist]]. You can translate the text, including 'Leave this line exactly as it is'. Some lines of this messages have one (1) leading space.",
'spam-whitelist' => "See also: [[MediaWiki:spam-blacklist]] and [[MediaWiki:captcha-addurl-whitelist]]. You can translate the text, including 'Leave this line exactly as it is'. Some lines of this messages have one (1) leading space.",
- 'email-blacklist' => "See also: [[MediaWiki:email-whitelist]] and [[MediaWiki:captcha-addurl-whitelist]]. You can translate the text, including 'Leave this line exactly as it is'. Some lines of this messages have one (1) leading space.",
- 'email-whitelist' => "See also: [[MediaWiki:email-blacklist]] and [[MediaWiki:captcha-addurl-whitelist]]. You can translate the text, including 'Leave this line exactly as it is'. Some lines of this messages have one (1) leading space.",
+ 'email-blacklist' => "See also: [[MediaWiki:email-whitelist]] and [[MediaWiki:Spam-blacklist]]. You can translate the text, including 'Leave this line exactly as it is'. Some lines of this messages have one (1) leading space.",
+ 'email-whitelist' => "See also: [[MediaWiki:email-blacklist]] and [[MediaWiki:Spam-whitelist]]. You can translate the text, including 'Leave this line exactly as it is'. Some lines of this messages have one (1) leading space.",
'spam-blacklisted-email' => 'Title of errorpage when trying to send an email with a blacklisted e-mail address',
'spam-blacklisted-email-text' => 'Text of errorpage when trying to send an e-mail with a blacklisted e-mail address',
'spam-blacklisted-email-signup' => 'Error when trying to create an account with an invalid e-mail address',
@@ -78,6 +84,17 @@ This message is followed by a list of bad lines.
Parameters:
* $1 - the number of bad lines',
'spam-blacklist-desc' => '{{desc|name=Spam Blacklist|url=http://www.mediawiki.org/wiki/Extension:SpamBlacklist}}',
+ 'log-name-spamblacklist' => 'Name of log that appears on [[Special:Log]].',
+ 'log-description-spamblacklist' => 'Description of spam blacklist log',
+ 'logentry-spamblacklist-hit' => 'Log entry that is created when a user adds a link that is blacklisted on the spam blacklist.
+
+Parameters:
+* $1 - a user link, for example "Jane Doe (Talk | contribs)"
+* $2 - (Optional) a username. Can be used for GENDER
+* $3 - the page the user attempted to edit
+* $4 - the URL the user tried to add',
+ 'right-spamblacklistlog' => '{{doc-right|spamblacklistlog}}',
+ 'action-spamblacklistlog' => '{{doc-action|spamblacklistlog}}',
);
/** Aragonese (aragonés)
@@ -123,7 +140,7 @@ $messages['an'] = array(
'spam-blacklisted-email-text' => 'A suya adreza de correu-e ye agora en a lista negra, y no puede ninviar correu ta atros usuarios.',
'spam-blacklisted-email-signup' => "L'adreza de correu-e que ha dau ye actualment en a lista negra, y no se puede fer servir.",
'spam-invalid-lines' => "{{PLURAL:$1|A linia siguient ye una|As linias siguients son}} {{PLURAL:$1|expresión regular|expresions regulars}} y {{PLURAL:$1|ha|han}} d'estar correchitas antes d'alzar a pachina:",
- 'spam-blacklist-desc' => 'Ferramienta anti-spam basata en expresions regulars (regex): [[MediaWiki:Spam-blacklist]] y [[MediaWiki:Spam-whitelist]]',
+ 'spam-blacklist-desc' => 'Ferramienta anti-spam basata en expresions regulars (regex): [[MediaWiki:Spam-blacklist]] y [[MediaWiki:Spam-whitelist]]', # Fuzzy
);
/** Arabic (العربية)
@@ -151,7 +168,7 @@ $messages['ar'] = array(
#</pre> <!-- اترك هذا السطر تماما كما هو -->',
'spam-invalid-lines' => '{{PLURAL:$1||السطر التالي|السطران التاليان|السطور التالية}} ÙÙŠ قائمة السبام السوداء {{PLURAL:$1|ليس تعبيرًا منتظمًا صحيحًا|ليسا تعبيرين منتظمين صحيحين|ليست تعبيرات منتظمة صحيحة}} Ùˆ{{PLURAL:$1||يحتاج|يحتاجان|تحتاج}} إلى أن {{PLURAL:$1||يصحح|يصححان|تصحح}} قبل Ø­Ùظ الصÙحة:',
- 'spam-blacklist-desc' => 'أداة ضد السبام تعتمد على التعبيرات المنتظمة: [[MediaWiki:Spam-blacklist]] و [[MediaWiki:Spam-whitelist]]',
+ 'spam-blacklist-desc' => 'أداة ضد السبام تعتمد على التعبيرات المنتظمة: [[MediaWiki:Spam-blacklist]] و [[MediaWiki:Spam-whitelist]]', # Fuzzy
);
/** Egyptian Spoken Arabic (مصرى)
@@ -179,10 +196,10 @@ $messages['arz'] = array(
#</pre> <!-- سيب السطر دا زى ما هو كدا بالظبط-->',
'spam-invalid-lines' => '{{PLURAL:$1|السطر دا|السطور دول}} اللى ÙÙ‰ السبام بلاك ليست {{PLURAL:$1|هو تعبير منتظم |هى تعبيرات منتظمة}} مش صح Ùˆ {{PLURAL:$1|محتاج|محتاجين}} تصليح قبل Ø­Ùظ الصÙحة:',
- 'spam-blacklist-desc' => 'اداة انتي-سبام مبنية على اساس ريجيكس: [[MediaWiki:Spam-blacklist]] و [[MediaWiki:Spam-whitelist]]',
+ 'spam-blacklist-desc' => 'اداة انتي-سبام مبنية على اساس ريجيكس: [[MediaWiki:Spam-blacklist]] و [[MediaWiki:Spam-whitelist]]', # Fuzzy
);
-/** Assamese (অসমীয়া)
+/** Assamese (অসমীয়া)
* @author Gitartha.bordoloi
*/
$messages['as'] = array(
@@ -223,7 +240,7 @@ $messages['as'] = array(
'spam-blacklisted-email-text' => 'আন সদসà§à¦¯à¦²à§ˆ ই-মেইল পঠিয়াব নোৱাৰাকৈ আপোনাৰ ই-মেইল ঠিকনা বà§à¦²à§‡à¦•à¦²à¦¿à¦·à§à¦Ÿà§‡à¦¡ কৰা হৈছে।',
'spam-blacklisted-email-signup' => 'ই-মেইল ঠিকনাটো বà§à¦¯à§±à¦¹à¦¾à§°à§° পৰা বà§à¦²à§‡à¦•à¦²à¦¿à¦·à§à¦Ÿà§‡à¦¡ কৰা হৈছে।',
'spam-invalid-lines' => 'তলৰ সà§à¦ªà¦¾à¦® বà§à¦²à§‡à¦•à¦²à¦¿à¦·à§à¦Ÿà§° {{PLURAL:$1|শাৰীটোত|শাৰীসমূহত}} অবৈধ নিয়মিত {{PLURAL:$1|à¦à¦•à§à¦¸à¦ªà§à§°à§‡à¦›à¦¨|à¦à¦•à§à¦¸à¦ªà§à§°à§‡à¦›à¦¨}} আছে আৰৠসেইবোৰ পৃষà§à¦ à¦¾ সাà¦à¦šà¦¿ থোৱাৰ আগতেই ঠিক কৰাটো {{PLURAL:$1|পà§à§°à¦¯à¦¼à§‹à¦œà¦¨|পà§à§°à¦¯à¦¼à§‹à¦œà¦¨}}:',
- 'spam-blacklist-desc' => 'ৰেজেকà§à¦¸-ভিতà§à¦¤à¦¿à¦• সà§à¦ªà¦¾à¦®à¦¬à¦¿à§°à§‹à¦§à§€ সà¦à¦œà§à¦²à¦¿: [[MediaWiki:Spam-blacklist]] আৰৠ[[MediaWiki:Spam-whitelist]]',
+ 'spam-blacklist-desc' => 'ৰেজেকà§à¦¸-ভিতà§à¦¤à¦¿à¦• সà§à¦ªà¦¾à¦®à¦¬à¦¿à§°à§‹à¦§à§€ সà¦à¦œà§à¦²à¦¿: [[MediaWiki:Spam-blacklist]] আৰৠ[[MediaWiki:Spam-whitelist]]', # Fuzzy
);
/** Asturian (asturianu)
@@ -271,7 +288,12 @@ $messages['ast'] = array(
'spam-blacklisted-email-text' => 'El to corréu electrónicu anguaño ta na llista negra y nun pue unviar correos electrónicos a otros usuarios.',
'spam-blacklisted-email-signup' => "La direición de corréu electrónicu que se dio tien torgáu l'usu por tar anguaño na llista negra.",
'spam-invalid-lines' => '{{PLURAL:$1|La siguiente llinia|Les siguientes llinies}} de la llista negra de spam {{PLURAL:$1|ye una espresión regular non válida|son espresiones regulares non válides}} y {{PLURAL:$1|necesita ser correxida|necesiten ser correxíes}} enantes de guardar la páxina:',
- 'spam-blacklist-desc' => "Ferramienta antispam basada n'espresiones regulares: [[MediaWiki:Spam-blacklist]] y [[MediaWiki:Spam-whitelist]]",
+ 'spam-blacklist-desc' => "Ferramienta antispam basada n'espresiones regulares que permite a los usuarios rexistraos poner nuna llista prieta URLs de páxines y direiciones de corréu electrónicu",
+ 'log-name-spamblacklist' => 'Rexistru de la llista prieta de spam',
+ 'log-description-spamblacklist' => 'Estos socesos rexistren les coincidencies cola llista prieta de spam.',
+ 'logentry-spamblacklist-hit' => '$1 provocó una activación de la llista prieta de spam en $3 al intentar amestar $4.',
+ 'right-spamblacklistlog' => 'Ver el rexistru de la llista prieta de spam',
+ 'action-spamblacklistlog' => 'ver el rexistru de la llista prieta de spam',
);
/** Bashkir (башҡортÑа)
@@ -296,14 +318,62 @@ $messages['ba'] = array(
# * Һәр буш булмаған юл URL ÑÑендәге төйөнгә генә ҡулланылған регулÑÑ€ аңлатманың өлөшө булып тора
#</pre> <!-- был юлды ниÑек бар, шулай ҡалдырығыҙ -->',
'spam-invalid-lines' => 'Түбәндәге ҡара иÑемлек {{PLURAL:$1|юлында|юлдарында}} хаталы регулÑÑ€ {{PLURAL:$1|аңлатма|аңлатмалар}} бар һәм {{PLURAL:$1|ул|улар}} битте һаҡлар алдынан төҙәтелергә тейеш:',
- 'spam-blacklist-desc' => 'РегулÑÑ€ аңлатмаларға нигеҙләнгән Ñпамға ҡаршы ҡорал: [[MediaWiki:Spam-blacklist]] һәм [[MediaWiki:Spam-whitelist]]',
+ 'spam-blacklist-desc' => 'РегулÑÑ€ аңлатмаларға нигеҙләнгән Ñпамға ҡаршы ҡорал: [[MediaWiki:Spam-blacklist]] һәм [[MediaWiki:Spam-whitelist]]', # Fuzzy
);
/** Southern Balochi (بلوچی مکرانی)
* @author Mostafadaneshvar
*/
$messages['bcc'] = array(
- 'spam-blacklist-desc' => 'وسیله په ضد اسپم په اساس عبارات منظم: [[MediaWiki:Spam-blacklist]] و [[MediaWiki:Spam-whitelist]]',
+ 'spam-blacklist-desc' => 'وسیله په ضد اسپم په اساس عبارات منظم: [[MediaWiki:Spam-blacklist]] و [[MediaWiki:Spam-whitelist]]', # Fuzzy
+);
+
+/** Bikol Central (Bikol Central)
+ * @author Geopoet
+ */
+$messages['bcl'] = array(
+ 'spam-blacklist' => '#</pre><!-- pakiwalat ining linya na eksaktong siring kaiyan -->
+# Mga panluwas na pangilyaw na minatampad kaining listahan ipagkukubkob kunsoarin na ipagdugang ini sa sarong pahina.
+# Ining listahan mina-apekto sana sa wiking ini; pakihiling man sa pankinabanong pinagbaraduhan.
+# Para sa dokumentasyon hilngon tabi sa https://www.mediawiki.org/wiki/Extension:SpamBlacklist
+#
+#An sintaks iyo an mga minasunod:
+# *An gabos magpoon sa "#" na karakter sagkod sa tapos kan linya iyo an komento
+# *An lambang bako na blankong linya iyo an sarong kapedasohan kan regex na makakapagtampad sana kan mga parabunsod na yaon sa laog kan mga pangilyaw
+
+#</pre><!-- pakiwalat ining linya na eksaktong siring kaiyan -->',
+ 'spam-whitelist' => '#<!-- pakiwalat ining linya na eksaktong siring kaiyan --> <pre>
+#An panluwas na mga pangilyaw na nagtatampad kaining listahn *dae* ipagkukubkob dawa ngani na sinda #ipinagkubkob kan mga pinagbarahang entrada.
+#
+#An sintaks iyo an mga minasunod:
+# *An gabos magpoon sa "#" na karakter sagkod sa tapos kan linya iyo an komento
+# *An lambang bako na blankong linya iyo an sarong kapedasohan kan regex na makakapagtampad sana kan mga parabunsod na yaon sa laog kan mga pangilyaw
+
+#</pre><!-- pakiwalat ining linya na eksaktong siring kaiyan -->',
+ 'email-blacklist' => '#<!-- pakiwalat ining linya na eksaktong siring kaiyan --> <pre>
+#An mga e-surat na nagtatampad kaining listahan ipagkukubkob sa pagpaparehistro o sa pagpapadara kan me e-surat
+#Ining listahan mina-apekto sana kaining wiki; pakihiling man sa pankinabanong pinagbarahan.
+#Para sa dokumentasyon pakihiling sa https://www.mediawiki.org/wiki/Extension:SpamBlacklist
+#
+#An sintaks iyo an mga minasunod:
+# *An gabos magpoon sa "#" na karakter sagkod sa tapos kan linya iyo an komento
+# *An lambang bako na blankong linya iyo an sarong kapedasohan kan regex na makakapagtampad sana kan mga parabunsod na yaon sa laog kan mga estada kan e-surat
+
+#</pre><!-- pakiwalat ining linya na eksaktong siring kaiyan -->',
+ 'email-whitelist' => '#<!-- pakiwalat ining linya na eksaktong siring kaiyan --> <pre>
+#An mga e-surat na nagtatampad kaining listahan *dae* ipagkukubkob dawa ngani sinda
+#pinagkubkob kan mga pingbarahang entrada.
+#
+#An sintaks iyo an mga minasunod:
+# *An gabos magpoon sa "#" na karakter sagkod sa tapos kan linya iyo an komento
+# *An lambang bako na blankong linya iyo an sarong kapedasohan kan regex na makakapagtampad sana kan mga parabunsod na yaon sa laog kan mga estada kan e-surat
+
+#</pre><!-- pakiwalat ining linya na eksaktong siring kaiyan -->',
+ 'spam-blacklisted-email' => 'Pinagbaraduhang estada kan e-surat',
+ 'spam-blacklisted-email-text' => 'An saimong estada kan e-surat sa ngunyan pinagbaraduhan sa pagpapadara nin mga e-surat pasiring sa ibang mga paragamit.',
+ 'spam-blacklisted-email-signup' => 'An ipinagtaong estada kan e-surat sa ngunyan pinagbaraduhan na magamit.',
+ 'spam-invalid-lines' => 'An minasunod na pinagbarahang listahan kan espam {{PLURAL:$1|hilira iyo an|hilira iyo an mga}} imbalidong pirmihan na {{PLURAL:$1|ekspresyon|mga ekspresyon}} asin {{PLURAL:$1|kinakaipuhan|kaipuhan}} na pagkokorihiran bago tabi itatagama an pahina:',
+ 'spam-blacklist-desc' => 'Nakabase sa Regex na gamit sa anti-espam:[[MediaWiki:Spam-blacklist]] asin [[MediaWiki:Spam-whitelist]]', # Fuzzy
);
/** Belarusian (TaraÅ¡kievica orthography) (беларуÑÐºÐ°Ñ (тарашкевіца)‎)
@@ -358,7 +428,7 @@ $messages['be-tarask'] = array(
'spam-blacklisted-email-text' => 'З Вашага адраÑу Ñлектроннай пошты Ñž цÑперашні момант забаронена даÑылаць ÑÐ»ÐµÐºÑ‚Ñ€Ð¾Ð½Ð½Ñ‹Ñ Ð»Ñ–ÑÑ‚Ñ‹ іншым удзельнікам.',
'spam-blacklisted-email-signup' => 'Пададзены Вамі Ð°Ð´Ñ€Ð°Ñ Ñлектроннай пошты Ñž цÑперашні момант знаходзіцца Ñž чорным ÑьпіÑе.',
'spam-invalid-lines' => '{{PLURAL:$1|ÐаÑтупны радок чорнага ÑьпіÑу ўтрымлівае нÑÑлушны Ñ€ÑгулÑрны выраз|ÐаÑÑ‚ÑƒÐ¿Ð½Ñ‹Ñ Ñ€Ð°Ð´ÐºÑ– чорнага ÑьпіÑу ўтрымліваюць нÑÑÐ»ÑƒÑˆÐ½Ñ‹Ñ Ñ€ÑгулÑÑ€Ð½Ñ‹Ñ Ð²Ñ‹Ñ€Ð°Ð·Ñ‹}} Ñ– {{PLURAL:$1|павінен быць|Ð¿Ð°Ð²Ñ–Ð½Ð½Ñ‹Ñ Ð±Ñ‹Ñ†ÑŒ}} выпраўлены перад захаваньнем Ñтаронкі:',
- 'spam-blacklist-desc' => 'ÐнтыÑпамавы інÑтрумÑнт, Ñкі базуецца на Ñ€ÑгулÑрных выразах: [[MediaWiki:Spam-blacklist]] Ñ– [[MediaWiki:Spam-whitelist]]',
+ 'spam-blacklist-desc' => 'ÐнтыÑпамавы інÑтрумÑнт, Ñкі базуецца на Ñ€ÑгулÑрных выразах: [[MediaWiki:Spam-blacklist]] Ñ– [[MediaWiki:Spam-whitelist]]', # Fuzzy
);
/** Bulgarian (българÑки)
@@ -366,7 +436,7 @@ $messages['be-tarask'] = array(
*/
$messages['bg'] = array(
'spam-invalid-lines' => '{{PLURAL:$1|СледниÑÑ‚ запиÑ|Следните запиÑи}} от Ñ‡ÐµÑ€Ð½Ð¸Ñ ÑпиÑък на Ñпама {{PLURAL:$1|е невалиден регулÑрен израз|Ñа невалидни регулÑрни изрази}} и Ñ‚Ñ€Ñбва да {{PLURAL:$1|бъде коригиран|бъдат коригирани}} преди ÑъхранÑване на Ñтраницата:',
- 'spam-blacklist-desc' => 'ИнÑтрумент за защита от Ñпам, използващ регулÑрни изрази: [[МедиÑУики:Spam-blacklist]] и [[МедиÑУики:Spam-whitelist]]',
+ 'spam-blacklist-desc' => 'ИнÑтрумент за защита от Ñпам, използващ регулÑрни изрази: [[МедиÑУики:Spam-blacklist]] и [[МедиÑУики:Spam-whitelist]]', # Fuzzy
);
/** Banjar (Bahasa Banjar)
@@ -377,6 +447,7 @@ $messages['bjn'] = array(
);
/** Bengali (বাংলা)
+ * @author Aftab1995
* @author Bellayet
* @author Nasir8891
* @author Zaheen
@@ -406,7 +477,11 @@ $messages['bn'] = array(
'spam-blacklisted-email-text' => 'অনà§à¦¯à¦¦à§‡à¦° ইমেইল পাঠানো থেকে বিরত রাখতে আপনাকে কালোতালিকাভà§à¦•à§à¦¤ করা হয়েছে।',
'spam-blacklisted-email-signup' => 'আপনার লেখা ইমেইল ঠিকানাটি কালোতালিকাভà§à¦•à§à¦¤à¥¤',
'spam-invalid-lines' => 'নিচের সà§à¦ªà§à¦¯à¦¾à¦® কালোতালিকার {{PLURAL:$1|লাইন|লাইনগà§à¦²à¦¿}} অবৈধ রেগà§à¦²à¦¾à¦° {{PLURAL:$1|à¦à¦•à§à¦¸à¦ªà§à¦°à§‡à¦¶à¦¨|à¦à¦•à§à¦¸à¦ªà§à¦°à§‡à¦¶à¦¨}} ধারণ করছে à¦à¦¬à¦‚ পাতাটি সংরকà§à¦·à¦£à§‡à¦° আগে à¦à¦—à§à¦²à¦¿ ঠিক করা {{PLURAL:$1|পà§à¦°à¦¯à¦¼à§‹à¦œà¦¨|পà§à¦°à¦¯à¦¼à§‹à¦œà¦¨}}:',
- 'spam-blacklist-desc' => 'রেজেকà§à¦¸-ভিতà§à¦¤à¦¿à¦• সà§à¦ªà§à¦¯à¦¾à¦®à¦°à§‹à¦§à§€ সরঞà§à¦œà¦¾à¦®: [[MediaWiki:Spam-blacklist]] à¦à¦¬à¦‚ [[MediaWiki:Spam-whitelist]]',
+ 'spam-blacklist-desc' => 'রেজেকà§à¦¸-ভিতà§à¦¤à¦¿à¦• সà§à¦ªà§à¦¯à¦¾à¦®à¦°à§‹à¦§à§€ সরঞà§à¦œà¦¾à¦®: [[MediaWiki:Spam-blacklist]] à¦à¦¬à¦‚ [[MediaWiki:Spam-whitelist]]', # Fuzzy
+ 'log-name-spamblacklist' => 'সà§à¦ªà§à¦¯à¦¾à¦® কালোতালিকা লগ',
+ 'log-description-spamblacklist' => 'à¦à¦‡ ঘটনাগà§à¦²à¦¿ সà§à¦ªà§à¦¯à¦¾à¦® কালোতালিকার হিট অনà§à¦¸à¦°à¦£à¥¤',
+ 'right-spamblacklistlog' => 'সà§à¦ªà§à¦¯à¦¾à¦® কালোতালিকা লগ দেখà§à¦¨',
+ 'action-spamblacklistlog' => 'সà§à¦ªà§à¦¯à¦¾à¦® কালোতালিকা লগ দেখà§à¦¨',
);
/** Breton (brezhoneg)
@@ -454,7 +529,7 @@ $messages['br'] = array(
'spam-blacklisted-email-text' => "Evit ar mare emañ ho chomlec'h postel war ul listenn zu ha n'haller ket kas posteloù drezañ d'an implijerien all.",
'spam-blacklisted-email-signup' => "War ul listenn zu emañ ar chomlec'h postel pourchaset. N'hall ket bezañ implijet.",
'spam-invalid-lines' => '{{PLURAL:$1|Ul lavarenn|Lavarennoù}} reoliek direizh eo {{PLURAL:$1|al linenn|al linennoù}} da-heul eus roll du ar stroboù ha ret eo {{PLURAL:$1|he reizhañ|o reizhañ}} a-raok enrollañ ar bajenn :',
- 'spam-blacklist-desc' => 'Ostilh enep-strob diazezet war lavarennoù reoliek (Regex) : [[MediaWiki:Spam-blacklist]] ha [[MediaWiki:Spam-whitelist]]',
+ 'spam-blacklist-desc' => 'Ostilh enep-strob diazezet war lavarennoù reoliek (Regex) : [[MediaWiki:Spam-blacklist]] ha [[MediaWiki:Spam-whitelist]]', # Fuzzy
);
/** Bosnian (bosanski)
@@ -481,7 +556,7 @@ $messages['bs'] = array(
#</pre> <!-- ostavite ovaj red onakav kakav je -->',
'spam-invalid-lines' => 'Slijedeći {{PLURAL:$1|red|redovi}} u spisku spam nepoželjnih stavki {{PLURAL:$1|je nevalidan izraz|su nevalidni izrazi}} i {{PLURAL:$1|treba|trebaju}} se ispraviti prije spremanja stranice:',
- 'spam-blacklist-desc' => 'Alati protiv spama zasnovani na regexu: [[MediaWiki:Spam-blacklist]] i [[MediaWiki:Spam-whitelist]]',
+ 'spam-blacklist-desc' => 'Alati protiv spama zasnovani na regexu: [[MediaWiki:Spam-blacklist]] i [[MediaWiki:Spam-whitelist]]', # Fuzzy
);
/** Catalan (català)
@@ -515,7 +590,14 @@ $messages['ca'] = array(
'spam-blacklisted-email-text' => "La vostra adreça de correu electrònic està actualment en la llista negra d'enviament de correus a altres usuaris.",
'spam-blacklisted-email-signup' => "L'adreça de correu electrònic proporcionada està actualment en la llista negra d'ús.",
'spam-invalid-lines' => "{{PLURAL:$1|La línia següent no es considera una expressió correcta|Les línies següents no es consideren expressions correctes}} {{PLURAL:$1|perquè recull|perquè recullen}} SPAM que està vetat. Heu d'esmenar-ho abans de salvar la pàgina:",
- 'spam-blacklist-desc' => 'Eina anti-spam basada en regexp: [[MediaWiki:Spam-blacklist]] i [[MediaWiki:Spam-whitelist]]',
+ 'spam-blacklist-desc' => 'Eina anti-spam basada en regexp: [[MediaWiki:Spam-blacklist]] i [[MediaWiki:Spam-whitelist]]', # Fuzzy
+);
+
+/** Sorani Kurdish (کوردی)
+ * @author Calak
+ */
+$messages['ckb'] = array(
+ 'right-spamblacklistlog' => 'دیتنی لۆگی پێرستی ڕەشی ڕیکلام',
);
/** Czech (Äesky)
@@ -565,7 +647,7 @@ $messages['cs'] = array(
'spam-blacklisted-email-text' => 'VaÅ¡e e-mailová adresa je momentálnÄ› uvedena na Äerné listinÄ›, takže ostatním uživatelům nemůžete posílat e-maily.',
'spam-blacklisted-email-signup' => 'Uvedená e-mailová adresa je v souÄasné dobÄ› na Äerné listinÄ›.',
'spam-invalid-lines' => 'Na Äerné listinÄ› spamu {{PLURAL:$1|je následující řádka neplatný regulární výraz|jsou následující řádky neplatné regulární výrazy|jsou následující řádky regulární výrazy}} a je nutné {{PLURAL:$1|ji|je|je}} pÅ™ed uložením stránky opravit :',
- 'spam-blacklist-desc' => 'Antispamový nástroj na základě regulárních výrazů: [[MediaWiki:Spam-blacklist]] a [[MediaWiki:Spam-whitelist]]',
+ 'spam-blacklist-desc' => 'Antispamový nástroj na základě regulárních výrazů: [[MediaWiki:Spam-blacklist]] a [[MediaWiki:Spam-whitelist]]', # Fuzzy
);
/** Welsh (Cymraeg)
@@ -594,8 +676,35 @@ $messages['cy'] = array(
# * gwesteiwyr tu mewn i gyfeiriadau URL
#</pre> <!-- leave this line exactly as it is -->',
- 'spam-invalid-lines' => "Mae'r {{PLURAL:$1|llinell|llinell|llinellau|llinellau|llinellau|llinellau}} canlynol ar y rhestr spam gwaharddedig yn {{PLURAL:$1|fynegiad|fynegiad|fynegiadau|fynegiadau|fynegiadau|fynegiadau}} rheolaidd annilys; rhaid {{PLURAL:ei gywiro|ei gywiro|eu cywiro|eu cywiro|eu cywiro|eu cywiro}} cyn rhoi'r dudalen ar gadw:",
- 'spam-blacklist-desc' => 'Teclyn gwrth-spam yn seiliedig ar regex: [[MediaWiki:Spam-blacklist]] a [[MediaWiki:Spam-whitelist]]',
+ 'email-blacklist' => "#<!-- leave this line exactly as it is --> <pre>
+# Fe gaiff cyfeiriadau ebost sydd yn cyfateb i'r rhestr hon eu blocio rhag iddynt gofrestru neu anfon ebyst
+# Ar gyfer y wici hwn yn unig mae'r rhestr hon; mae rhestr waharddedig led-led yr holl wicïau i'w gael.
+# Gweler https://www.mediawiki.org/wiki/Extension:SpamBlacklist am ragor o wybodaeth.
+#
+# Dyma'r gystrawen:
+# * Mae popeth o nod \"#\" hyd at ddiwedd y llinell yn sylwad
+# * Mae pob llinell nad yw'n wag yn ddarn regex sydd ddim ond yn cydweddu gwesteiwyr tu mewn i gyfeiriadau ebost
+
+ #</pre> <!-- leave this line exactly as it is -->",
+ 'email-whitelist' => ' #<!-- leave this line exactly as it is --> <pre>
+# *Ni fydd* cyfeiriadau ebost sydd ar y rhestr hon yn cael eu blocio
+# hyd yn oed pan ydynt ar restr arall o gyfeiriadau ebost gwaharaddedig.
+#
+# Dyma\'r gystrawen:
+# * Mae popeth o nod "#" hyd at ddiwedd y llinell yn sylwad
+# * Mae pob llinell nad yw\'n wag yn ddarn regex sydd ddim ond yn cydweddu
+# * gwesteiwyr tu mewn i gyfeiriadau ebost
+
+ #</pre> <!-- leave this line exactly as it is -->',
+ 'spam-blacklisted-email' => 'Cyfeiriad ebost ar y rhestr waharddedig',
+ 'spam-blacklisted-email-text' => 'Mae eich cyfeiriad ebost wedi ei wahardd rhag anfon ebyst at ddefnyddwyr eraill ar hyn o bryd.',
+ 'spam-blacklisted-email-signup' => "Mae'r cyfeiriad ebost a roddwyd wedi ei wahardd rhag ei ddefnyddio ar hyn o bryd.",
+ 'spam-invalid-lines' => "Mae'r {{PLURAL:$1|llinell|llinell|llinellau}} canlynol ar y rhestr spam gwaharddedig yn {{PLURAL:$1|fynegiad|fynegiad|fynegiadau}} rheolaidd annilys; rhaid {{PLURAL:ei gywiro|ei gywiro|eu cywiro}} cyn rhoi'r dudalen ar gadw:",
+ 'spam-blacklist-desc' => "Teclyn gwrth-sbam yn seiliedig ar regex, sy'n galluogi gwahardd y canlynol - URLs o fewn tudalennau a chyfeiriadau ebost defnyddwyr cofrestredig",
+ 'log-name-spamblacklist' => 'Lòg y rhestr sbam waharddedig',
+ 'log-description-spamblacklist' => "Mae'r digwyddiadau hyn yn cofnodi trawiadau ar y rhestr sbam waharddedig.",
+ 'logentry-spamblacklist-hit' => 'Fe geisiodd $1 ychwanegu $4 sydd ar y rhestr waharddedig $3.',
+ 'right-spamblacklistlog' => 'Gallu gweld lòg y rhestr sbam waharddedig',
);
/** Danish (dansk)
@@ -638,17 +747,25 @@ $messages['da'] = array(
# * hver ikke-tomme linjer anvendes som regulære udtryk for at matcha domænenavne i webadresser
#</pre> <!-- lad denne linje være nøjagtig som den er -->',
'spam-blacklisted-email' => 'Sortlistet e-mailadresse',
- 'spam-blacklisted-email-text' => 'Din e-mail-adresse er i øjeblikket blokeret for at sende emails til andre brugere.',
- 'spam-blacklisted-email-signup' => 'Den angivne e-mail-adresse er i øjeblikket blokeret for brug.',
+ 'spam-blacklisted-email-text' => 'Din e-mailadresse er i øjeblikket blokeret for at sende e-mails til andre brugere.',
+ 'spam-blacklisted-email-signup' => 'Den angivne e-mailadresse er i øjeblikket blokeret for brug.',
'spam-invalid-lines' => 'Følgende {{PLURAL:$1|linje|linjer}} i spamsortelisten er {{PLURAL:$1|et ugyldigt regulært udtryk|ugyldige regulære udtryk}} og må rettes før lagring af siden:',
- 'spam-blacklist-desc' => 'Antispamværktøj baseret på regulære udtryk: [[MediaWiki:Spam-blacklist]] og [[MediaWiki:Spam-whitelist]]',
+ 'spam-blacklist-desc' => 'Antispamværktøj baseret på regulære udtryk der giver mulighed for at sortliste URLs i sider og e-mailadresser for registrerede brugere',
+ 'log-name-spamblacklist' => 'Spamsortlistningslog',
+ 'log-description-spamblacklist' => 'Disse begivenheder er træfferer i spamsortlistningen.',
+ 'logentry-spamblacklist-hit' => '$1 ramte en regel i spamsortlisten på $3 ved at forsøge at tilføje $4.',
+ 'right-spamblacklistlog' => 'Vis spamsortlisteloggen',
+ 'action-spamblacklistlog' => 'se spamsortlisteloggen',
);
/** German (Deutsch)
* @author Geitost
* @author Kghbln
+ * @author Metalhead64
* @author Raimond Spekking
+ * @author S2cchst
* @author Umherirrender
+ * @author Wnme
*/
$messages['de'] = array(
'spam-blacklist' => ' # Externe URLs, die in dieser Liste enthalten sind, blockieren das Speichern einer Seite.
@@ -690,7 +807,12 @@ $messages['de'] = array(
'spam-blacklisted-email-text' => 'Deine E-Mail-Adresse ist derzeit für das Senden von E-Mail-Nachrichten an andere Benutzer blockiert.',
'spam-blacklisted-email-signup' => 'Die angegebene E-Mail-Adresse ist derzeit für das Senden von E-Mail-Nachrichten an andere Benutzer blockiert.',
'spam-invalid-lines' => 'Die {{PLURAL:$1|folgende Zeile|folgenden Zeilen}} in der Blockierliste {{PLURAL:$1|ist ein ungültiger regulärer Ausdruck|sind ungültige reguläre Ausdrücke}}. Sie {{PLURAL:$1|muss|müssen}} vor dem Speichern der Seite korrigiert werden:',
- 'spam-blacklist-desc' => 'Ermöglicht ein, durch reguläre Ausdrücke gestütztes, Anti-Spam-Werkzeug: [[MediaWiki:Spam-blacklist]] und [[MediaWiki:Spam-whitelist]]',
+ 'spam-blacklist-desc' => 'Ein auf regulären Ausdrücken basiertes Anti-Spam-Werkzeug, um URLs in Seiten und E-Mail-Adressen für registrierte Benutzer auf die schwarze Liste zu setzen',
+ 'log-name-spamblacklist' => 'Spam-Blacklist-Logbuch',
+ 'log-description-spamblacklist' => 'Es folgt ein Logbuch von Spam-Blacklist-Treffern.',
+ 'logentry-spamblacklist-hit' => '$1 verursachte einen Spam-Blacklist-Treffer auf „$3“ durch das versuchte Hinzufügen von $4.',
+ 'right-spamblacklistlog' => 'Spam-Blacklist-Logbuch ansehen',
+ 'action-spamblacklistlog' => 'dieses Logbuch einzusehen',
);
/** Swiss High German (Schweizer Hochdeutsch)
@@ -719,6 +841,7 @@ $messages['de-formal'] = array(
/** Zazaki (Zazaki)
* @author Aspar
* @author Erdemaslancan
+ * @author Marmase
* @author Olvörg
*/
$messages['diq'] = array(
@@ -760,7 +883,7 @@ $messages['diq'] = array(
'spam-blacklisted-email-text' => 'Nıka adresa e-postayê to qande karberê bini ra mesac riştene listeyê siya dero.',
'spam-blacklisted-email-signup' => 'E-posta adresiyo ke deyayo karkerdışe cı newke groto siyaliste.',
'spam-invalid-lines' => 'na qerelisteya spami {{PLURAL:$1|satır|satıran}} {{PLURAL:$1|nemeqbulo|nemeqbuli}};',
- 'spam-blacklist-desc' => 'Regex-tabanlı anti-spam aracı: [[MediaWiki:Spam-blacklist]] ve [[MediaWiki:Spam-whitelist]]',
+ 'spam-blacklist-desc' => "Regex-tabanın haleta anti-spami URL'ya perer u adresa e-posta qande karberande qeydınan geriyayo",
);
/** Lower Sorbian (dolnoserbski)
@@ -788,7 +911,7 @@ $messages['dsb'] = array(
#</pre> <!-- wóstaj toś tu smužku rowno tak ako jo -->',
'spam-blacklisted-email' => 'Blokěrowana e-mailowa adresa',
'spam-invalid-lines' => '{{PLURAL:$1|Slědujuca smužka|Slědujucej smužce|Slědujuce smužki|Slědujuce smužki}} corneje lisćiny spama {{PLURAL:$1|jo njepłaśiwy regularny wuraz|stej njepłaśiwej regularnej wuraza|su njepłaśiwe regularne wuraze|su njepłaśiwe regularne wuraze}} a {{PLURAL:$1|musy|musytej|muse|muse}} se korigěrowaś, pjerwjej až składujoš bok:',
- 'spam-blacklist-desc' => 'Antispamowy rěd na zakłaźe regularnych wurazow: [[MediaWiki:Spam-blacklist]] a [[MediaWiki:Spam-whitelist]]',
+ 'spam-blacklist-desc' => 'Antispamowy rěd na zakłaźe regularnych wurazow: [[MediaWiki:Spam-blacklist]] a [[MediaWiki:Spam-whitelist]]', # Fuzzy
);
/** Greek (Ελληνικά)
@@ -817,7 +940,7 @@ $messages['el'] = array(
#</pre> <!-- leave this line exactly as it is -->',
'spam-invalid-lines' => '{{PLURAL:$1|Η ακόλουθη γÏαμμή|Οι ακόλουθες γÏαμμές}} της μαÏÏης λίστας spam είναι {{PLURAL:$1|άκυÏη κανονική έκφÏαση|άκυÏες κανονικές εκφÏάσεις}} και {{PLURAL:$1|χÏειάζεται|χÏειάζονται}} διόÏθωση Ï€Ïιν την αποθήκευση της σελίδας:',
- 'spam-blacklist-desc' => 'ΕÏγαλείο anti-spam βασισμένο σε κανονικές εκφÏάσεις: [[MediaWiki:Spam-blacklist]] και [[MediaWiki:Spam-whitelist]]',
+ 'spam-blacklist-desc' => 'ΕÏγαλείο anti-spam βασισμένο σε κανονικές εκφÏάσεις: [[MediaWiki:Spam-blacklist]] και [[MediaWiki:Spam-whitelist]]', # Fuzzy
);
/** Esperanto (Esperanto)
@@ -863,13 +986,14 @@ $messages['eo'] = array(
'spam-blacklisted-email-text' => 'Via retpoÅtadreso estas nune membro de nigralisto forbarita de sendante retpoÅtojn al aliaj uzantoj.',
'spam-blacklisted-email-signup' => 'Tiu retpoÅtadreso estas nune forbarita de uzado.',
'spam-invalid-lines' => 'La {{PLURAL:$1|jena linio|jenaj linioj}} de spama nigralisto estas {{PLURAL:$1|nevlidaj regularaj esprimoj|nevlidaj regularaj esprimoj}} kaj devas esti {{PLURAL:$1|korektigita|korektigitaj}} antaÅ­ savante la paÄon:',
- 'spam-blacklist-desc' => 'Regex-bazita kontraÅ­spamilo: [[MediaWiki:Spam-blacklist]] kaj [[MediaWiki:Spam-whitelist]]',
+ 'spam-blacklist-desc' => 'Regex-bazita kontraÅ­spamilo: [[MediaWiki:Spam-blacklist]] kaj [[MediaWiki:Spam-whitelist]]', # Fuzzy
);
/** Spanish (español)
* @author Armando-Martin
* @author Dferg
* @author Drini
+ * @author MarcoAurelio
* @author Sanbec
* @author Vivaelcelta
*/
@@ -915,7 +1039,7 @@ $messages['es'] = array(
'spam-blacklisted-email-text' => 'Su dirección de correo electrónico está actualmente en la lista negra y no puede enviar correos electrónicos a otros usuarios.',
'spam-blacklisted-email-signup' => 'La dirección de correo electrónico dada está actualmente en la lista negra de uso.',
'spam-invalid-lines' => '{{PLURAL:$1|La siguiente línea|Las siguientes líneas}} de la lista negra de spam {{PLURAL:$1|es una expresión regular inválida|son expresiones regulares inválidas}} y es necesario {{PLURAL:$1|corregirla|corregirlas}} antes de guardar la página:',
- 'spam-blacklist-desc' => 'Herramienta anti-spam basada en expresiones regulares [[MediaWiki:Spam-blacklist]] y [[MediaWiki:Spam-whitelist]]',
+ 'spam-blacklist-desc' => 'Herramienta anti-spam basada en expresiones regulares [[MediaWiki:Spam-blacklist]] y [[MediaWiki:Spam-whitelist]]', # Fuzzy
);
/** Estonian (eesti)
@@ -961,9 +1085,14 @@ $messages['et'] = array(
# * Iga rida, mis ei ole tühi, on regulaaravaldise osa, mis vastab ainult e-posti aadressides sisalduvatele hostinimedele.',
'spam-blacklisted-email' => 'Musta nimekirja kantud e-posti aadress',
'spam-blacklisted-email-text' => 'Musta nimekirja sissekande tõttu on sinu e-posti aadressilt teistele kasutajatele e-kirjade saatmine praegu keelatud.',
- 'spam-blacklisted-email-signup' => 'Selle e-posti aadressi kasutamine praegu musta nimekirja sissekandega keelatud.',
+ 'spam-blacklisted-email-signup' => 'Selle e-posti aadressi kasutamine on praegu musta nimekirja sissekandega keelatud.',
'spam-invalid-lines' => '{{PLURAL:$1|Järgmine rida|Järgmised read}} rämpspostituste mustas nimekirjas on {{PLURAL:$1|vigane regulaaravaldis|vigased regulaaravaldised}} ja {{PLURAL:$1|see|need}} tuleb enne lehekülje salvestamist parandada:',
- 'spam-blacklist-desc' => 'Regulaaravaldisel põhinev tööriist: [[MediaWiki:Spam-blacklist]] ja [[MediaWiki:Spam-whitelist]]',
+ 'spam-blacklist-desc' => 'Regulaaravaldisel põhinev tööriist, mis võimaldab lisada musta nimekirja lehekülgedel toodud internetiaadresse ning registreeritud kasutajate e-posti aadresse.',
+ 'log-name-spamblacklist' => 'Rämpsu musta nimekirja logi',
+ 'log-description-spamblacklist' => 'Siin on loetletud rämpspostituse musta nimekirja tabamused.',
+ 'logentry-spamblacklist-hit' => '$1 püüdis lisada leheküljele $3 rämpspostituse mustas nimekirjas olevat linki $4.',
+ 'right-spamblacklistlog' => 'Vaadata rämpsu musta nimekirja',
+ 'action-spamblacklistlog' => 'vaadata rämpsu musta nimekirja',
);
/** Persian (Ùارسی)
@@ -1005,9 +1134,16 @@ $messages['fa'] = array(
# * هر سطر از متن به عنوان یک دستور از نوع عبارت باقاعده در نظر گرÙته می‌شود Ú©Ù‡ Ùقط با نام میزبان در نشانی پست الکترونیکی مطابقت داده می‌شود',
'spam-blacklisted-email' => 'نشانی پست الکترونیکی موجود در لیست سیاه',
'spam-blacklisted-email-text' => 'نشانی پست الکترونیکی شما در حال حاضر در Ùهرست سیاه قرار دارد Ùˆ نمی‌توانید به دیگر کاربران نامه بÙرستید.',
- 'spam-blacklisted-email-signup' => 'نشانی پست الکترونیکی داده شده در حال حاضر در Ùهرست سیاه است Ùˆ قابل استÙاده نیست.',
- 'spam-invalid-lines' => '{{PLURAL:$1|سطر|سطرهای}} زیر در Ùهرست سیاه هرزنگاری، عبارات باقاعدهٔ غیر مجاز {{PLURAL:$1|است|هستند}} Ùˆ قبل از ذخیره کردن صÙحه باید اصلاح {{PLURAL:$1|شود|شوند}}:',
- 'spam-blacklist-desc' => 'ابزار ضد هرزنویسی مبتنی بر regular expressions: [[MediaWiki:Spam-blacklist]] و [[MediaWiki:Spam-whitelist]]',
+ 'spam-blacklisted-email-signup' => 'نشانی رایانامه داده‌شده در حال حاضر در Ùهرست سیاه است.',
+ 'spam-invalid-lines' => '{{PLURAL:$1|سطر|سطرهای}} زیر در Ùهرست سیاه هرزنگاری، عبارات باقاعدهٔ نامجاز {{PLURAL:$1|است|هستند}} Ùˆ قبل از ذخیره کردن صÙحه باید اصلاح {{PLURAL:$1|شود|شوند}}:',
+ 'spam-blacklist-desc' => 'Regex-based anti-spam tool allowing to blacklist URLs in pages and email addresses for registered users
+
+ابزار بر پایهٔ عبارت باقاعده ضدهرزنگاری اجازهٔ Ùهرست سیاه‌کردن نشانی‌های اینترنتی در صÙحه‌ها Ùˆ نشانی‌های رایانامه برای کاربران ثبت نام کرده',
+ 'log-name-spamblacklist' => 'سیاههٔ Ùهرست سیاه هرزنگاری',
+ 'log-description-spamblacklist' => 'این رویدادها وقوع Ùهرست سیاه هزنگاری را دنبال می‌کند.',
+ 'logentry-spamblacklist-hit' => '$1 در $3 با تلاش در اÙزودن $4 باعث برخورد به Ùهرست سیاه هرزنامه شده‌است.',
+ 'right-spamblacklistlog' => 'دیدن یک سیاههٔ Ùهرست سیاه هرزنامه',
+ 'action-spamblacklistlog' => 'دیدن سیاههٔ Ùهرست سیاه هرزنامه',
);
/** Finnish (suomi)
@@ -1016,9 +1152,11 @@ $messages['fa'] = array(
* @author Linnea
* @author Nike
* @author Olli
+ * @author Pxos
*/
$messages['fi'] = array(
- 'spam-blacklist' => ' # Tämän listan säännöillä voi estää ulkopuolisiin sivustoihin viittaavien osoitteiden lisäämisen.
+ 'spam-blacklist' => ' #<!-- leave this line exactly as it is --> <pre>
+ # Tämän listan säännöillä voi estää ulkopuolisiin sivustoihin viittaavien osoitteiden lisäämisen.
# Tämä lista koskee vain tätä wikiä. Tutustu myös järjestelmänlaajuiseen mustaan listaan.
# Lisätietoja on osoitteessa http://www.mediawiki.org/wiki/Extension:SpamBlacklist
#<!-- Älä koske tähän riviin lainkaan --> <pre>
@@ -1028,18 +1166,18 @@ $messages['fi'] = array(
# * Jokainen ei-tyhjä rivi on säännöllisen lausekkeen osa, joka tunnistaa vain osoitteissa olevat verkkotunnukset.
#</pre> <!-- Älä koske tähän riviin lainkaan -->',
- 'spam-whitelist' => ' #<!-- älä koske tähän riviin --> <pre>
-# Tällä sivulla on säännöt, joihin osuvia ulkoisia osoitteita ei estetä, vaikka ne olisivat estolistalla.
+ 'spam-whitelist' => ' #<!-- älä koske tähän riviin --> <pre>
+ # Tällä sivulla on säännöt, joihin osuvia ulkoisia osoitteita ei estetä, vaikka ne olisivat mustalla listalla.
#
# Syntaksi on seuraava:
# * Kommentti alkaa #-merkistä ja jatkuu rivin loppuun
# * Muut ei-tyhjät rivit tulkitaan säännöllisen lausekkeen osaksi, joka tutkii vain osoitteissa olevia verkko-osoitteita.
#</pre> <!-- älä koske tähän riviin -->',
- 'email-blacklist' => ' # Tällä listalla olevat sähköpostit estetään rekisteröitymästä tai lähettämästä sähköpostia
- # Tämä lista koskee vain tätä wikiä. Tutustu myös järjestelmänlaajuiseen mustaan listaan.
- # Lisätietoja on osoitteessa https://www.mediawiki.org/wiki/Extension:SpamBlacklist
- #<!-- Älä koske tähän riviin lainkaan --> <pre>
+ 'email-blacklist' => ' #<!-- leave this line exactly as it is --> <pre>
+# Tällä listalla olevia sähköpostiosoitteita estetään rekisteröitymästä tai lähettämästä sähköpostia
+# Tämä lista koskee vain tätä wikiä. Tutustu myös järjestelmänlaajuiseen mustaan listaan.
+# Lisätietoja on osoitteessa https://www.mediawiki.org/wiki/Extension:SpamBlacklist
#
# Syntaksi on seuraavankaltainen:
# * Kaikki #-merkistä lähtien rivin loppuun asti on kommenttia
@@ -1050,7 +1188,12 @@ $messages['fi'] = array(
'spam-blacklisted-email-text' => 'Sähköpostisi on tällä hetkellä mustalla listalla, etkä voi lähettää sähköpostia muille käyttäjille.',
'spam-blacklisted-email-signup' => 'Annettu sähköpostiosoite on tällä hetkellä mustalla listalla.',
'spam-invalid-lines' => 'Listalla on {{PLURAL:$1|seuraava virheellinen säännöllinen lauseke, joka|seuraavat virheelliset säännölliset lausekkeet, jotka}} on korjattava ennen tallentamista:',
- 'spam-blacklist-desc' => 'Säännöllisiä lausekkeita tukeva mainossuodatin: [[MediaWiki:Spam-blacklist|estolista]] ja [[MediaWiki:Spam-whitelist|poikkeuslista]].',
+ 'spam-blacklist-desc' => 'Säännöllisiä lausekkeita (reg-ex) tukeva roskalinkkejä torjuva työkalu, jonka avulla internet-osoitteita (URL) sivuilla ja sähköpostiosoitteissa voidaan asettaa mustalle listalle. Tarkoitettu kirjautuneille käyttäjille.',
+ 'log-name-spamblacklist' => 'Roskalinkkien torjuntalistan loki',
+ 'log-description-spamblacklist' => 'Nämä tapahtumat ovat osumia roskalinkkien torjuntalistalla.',
+ 'logentry-spamblacklist-hit' => '$1 sai aikaan osuman roskalinkkien torjuntalistalla kohteessa $3 yrittäessään lisätä $4',
+ 'right-spamblacklistlog' => 'Tarkastella roskalinkkien torjuntalistan lokia',
+ 'action-spamblacklistlog' => 'nähdä roskalinkkien torjuntalistan lokia',
);
/** French (français)
@@ -1101,7 +1244,12 @@ $messages['fr'] = array(
'spam-blacklisted-email-text' => "Votre adresse de courriel est actuellement sur une liste noire d'envoi de courriel aux autres utilisateurs.",
'spam-blacklisted-email-signup' => "L'adresse de courriel fournie est actuellement sur une liste noire d'utilisation.",
'spam-invalid-lines' => '{{PLURAL:$1|La ligne suivante|Les lignes suivantes}} de la liste noire des polluriels {{PLURAL:$1|est une expression rationnelle invalide|sont des expressions rationnelles invalides}} et doi{{PLURAL:$1||ven}}t être corrigée{{PLURAL:$1||s}} avant d’enregistrer la page :',
- 'spam-blacklist-desc' => "Outil anti-pourriel basé sur des expressions rationnelles : ''[[MediaWiki:Spam-blacklist]]'' et ''[[MediaWiki:Spam-whitelist]]''",
+ 'spam-blacklist-desc' => 'Outil anti-pourriel basé sur des expressions rationnelles permettant de mettre en liste noire des URLs dans les pages et des adresses de courriel pour les utilisateurs enregistrés',
+ 'log-name-spamblacklist' => 'Journal de liste noire des pourriels',
+ 'log-description-spamblacklist' => 'Ces événements tracent les correspondances avec la liste noire des pourriels.',
+ 'logentry-spamblacklist-hit' => '$1 a provoqué un correspondance avec la liste noire des pourriels sur $3 en essayant d’ajouter $4.',
+ 'right-spamblacklistlog' => 'Afficher le journal de la liste noire des pourriels',
+ 'action-spamblacklistlog' => 'afficher le journal de la liste noir des pourriels',
);
/** Franco-Provençal (arpetan)
@@ -1128,7 +1276,7 @@ $messages['frp'] = array(
#</pre> <!-- lèssiéd ceta legne justo d’ense -->',
'spam-invalid-lines' => '{{PLURAL:$1|Ceta legne|Cetes legnes}} de la lista nêre des spames {{PLURAL:$1|est una èxprèssion racionèla envalida|sont des èxprèssions racionèles envalides}} et dê{{PLURAL:$1||von}}t étre corregiê{{PLURAL:$1||s}} devant que sôvar la pâge :',
- 'spam-blacklist-desc' => "Outil anti-spame basâ sur des èxprèssions racionèles (''RegEx'') : ''[[MediaWiki:Spam-blacklist]]'' et ''[[MediaWiki:Spam-whitelist]]''.",
+ 'spam-blacklist-desc' => "Outil anti-spame basâ sur des èxprèssions racionèles (''RegEx'') : ''[[MediaWiki:Spam-blacklist]]'' et ''[[MediaWiki:Spam-whitelist]]''.", # Fuzzy
);
/** Galician (galego)
@@ -1137,10 +1285,10 @@ $messages['frp'] = array(
* @author Xosé
*/
$messages['gl'] = array(
- 'spam-blacklist' => ' # As ligazóns externas que coincidan na súa totalidade ou en parte con algún rexistro desta lista serán bloqueadas cando se intenten engadir a unha páxina.
- # Esta lista afecta unicamente a este wiki; tamén existe unha lista global.
- # Para obter máis documentación vaia a https://www.mediawiki.org/wiki/Extension:SpamBlacklist
- #<!-- Deixe esta liña tal e como está --> <pre>
+ 'spam-blacklist' => ' #<!-- Deixe esta liña tal e como está --> <pre>
+# As ligazóns externas que coincidan na súa totalidade ou en parte con algún rexistro desta lista serán bloqueadas cando se intenten engadir a unha páxina.
+# Esta lista afecta unicamente a este wiki; tamén existe unha lista global.
+# Para obter máis documentación vaia a https://www.mediawiki.org/wiki/Extension:SpamBlacklist
#
# A sintaxe é a seguinte:
# * Todo o que vaia despois dun carácter "#" ata o final da liña é un comentario
@@ -1148,18 +1296,18 @@ $messages['gl'] = array(
#</pre> <!-- Deixe esta liña tal e como está -->',
'spam-whitelist' => ' #<!-- Deixe esta liña tal e como está --> <pre>
- # As ligazóns externas que coincidan con esta lista *non* serán bloqueadas mesmo se
- # fosen bloqueadas mediante entradas na lista negra.
+# As ligazóns externas que coincidan con esta lista *non* serán bloqueadas mesmo se
+# fosen bloqueadas mediante entradas na lista negra.
#
-# A sintaxe é a que segue:
+# A sintaxe é a seguinte:
# * Todo o que vaia despois dun carácter "#" ata o final da liña é un comentario
# * Toda liña que non estea en branco é un fragmento de expresión regular que só coincide con dominios dentro de enderezos URL
#</pre> <!-- Deixe esta liña tal e como está -->',
- 'email-blacklist' => ' # Os enderezos de correo electrónico que coincidan na súa totalidade ou en parte con algún rexistro desta lista serán bloqueadas cando se intenten rexistrar ou se intente enviar un correo desde eles.
- # Esta lista afecta unicamente a este wiki; tamén existe unha lista global.
- # Para obter máis documentación vaia a https://www.mediawiki.org/wiki/Extension:SpamBlacklist
- #<!-- Deixe esta liña tal e como está --> <pre>
+ 'email-blacklist' => ' #<!-- Deixe esta liña tal e como está --> <pre>
+# Os enderezos de correo electrónico que coincidan na súa totalidade ou en parte con algún rexistro desta lista serán bloqueadas cando se intenten rexistrar ou se intente enviar un correo desde eles.
+# Esta lista afecta unicamente a este wiki; tamén existe unha lista global.
+# Para obter máis documentación vaia a https://www.mediawiki.org/wiki/Extension:SpamBlacklist
#
# A sintaxe é a seguinte:
# * Todo o que vaia despois dun carácter "#" ata o final da liña é un comentario
@@ -1170,16 +1318,21 @@ $messages['gl'] = array(
# Os enderezos de correo electrónico que coincidan con algún desta lista *non* serán bloqueados,
# mesmo se foron bloqueados por entradas da lista negra.
#
- #</pre> <!-- Deixe esta liña tal e como está -->
-#
# A sintaxe é a seguinte:
# * Todo o que vaia despois dun carácter "#" ata o final da liña é un comentario
-# * Toda liña que non estea en branco é un fragmento de expresión regular que só coincide con dominios dentro de enderezos de correo electrónico',
+# * Toda liña que non estea en branco é un fragmento de expresión regular que só coincide con dominios dentro de enderezos de correo electrónico
+
+ #</pre> <!-- Deixe esta liña tal e como está -->',
'spam-blacklisted-email' => 'Enderezo de correo electrónico presente na lista negra',
'spam-blacklisted-email-text' => 'O seu enderezo de correo electrónico atópase na lista negra e non pode enviar correos electrónicos aos outros usuarios.',
'spam-blacklisted-email-signup' => 'O enderezo de correo electrónico especificado está na lista negra e non se pode empregar.',
'spam-invalid-lines' => '{{PLURAL:$1|A seguinte liña|As seguintes}} da lista negra de spam {{PLURAL:$1|é unha expresión regular inválida|son expresións regulares inválidas}} e {{PLURAL:$1|haina|hainas}} que corrixir antes de gardar a páxina:',
- 'spam-blacklist-desc' => 'Ferramenta antispam baseada en expresións regulares: [[MediaWiki:Spam-blacklist]] e [[MediaWiki:Spam-whitelist]]',
+ 'spam-blacklist-desc' => 'Ferramenta antispam baseada en expresións regulares que permite incluír enderezos URL e enderezos de correo electrónico nunha lista negra para os usuarios rexistrados',
+ 'log-name-spamblacklist' => 'Rexistro da lista negra de spam',
+ 'log-description-spamblacklist' => 'Este rexistro fai un seguimento das coincidencias coa lista negra de spam.',
+ 'logentry-spamblacklist-hit' => '$1 provocou a activación da lista negra de spam en "$3" ao intentar engadir $4.',
+ 'right-spamblacklistlog' => 'Ver o rexistro da lista negra de spam',
+ 'action-spamblacklistlog' => 'ver o rexistro da lista negra de spam',
);
/** Swiss German (Alemannisch)
@@ -1227,10 +1380,11 @@ $messages['gsw'] = array(
'spam-blacklisted-email-text' => 'Dyy E-Mail-Adräss isch zurzyt fir s Sände vu E-Mail-Nochrichte an anderi Benutzer blockiert.',
'spam-blacklisted-email-signup' => 'Di aagee E-Mail-Adräss isch zurzyt fir s Sände vu E-Mail-Nochrichte an anderi Benutzer blockiert.',
'spam-invalid-lines' => 'Die {{PLURAL:$1|Zyylete|Zyylete}} in dr Spam-Blacklist {{PLURAL:$1|isch e nit giltige reguläre Usdruck|sin nit giltigi reguläri Usdrick}}. Si {{PLURAL:$1|muess|mien}} vor em Spychere vu dr Syte korrigiert wäre:',
- 'spam-blacklist-desc' => 'Regex-basiert Anti-Spam-Wärchzyyg: [[MediaWiki:Spam-blacklist]] un [[MediaWiki:Spam-whitelist]]',
+ 'spam-blacklist-desc' => 'Regex-basiert Anti-Spam-Wärchzyyg: [[MediaWiki:Spam-blacklist]] un [[MediaWiki:Spam-whitelist]]', # Fuzzy
);
/** Gujarati (ગà«àªœàª°àª¾àª¤à«€)
+ * @author Ashok modhvadia
* @author KartikMistry
* @author Sushant savla
*/
@@ -1272,7 +1426,7 @@ $messages['gu'] = array(
'spam-blacklisted-email-text' => 'તમારા ઈ-મેલ સરનામાં પર હાલમાં પà«àª°àª¤àª¿àª¬àª‚ધ લગાડેલો છે આથી તમે ઈ-મેલ મોકલી નહીં શકો.',
'spam-blacklisted-email-signup' => 'આ ઈ-મેલ પર હાલમાં વપરાશ પà«àª°àª¤àª¿àª¬àª‚ધ લાગેલો છે.',
'spam-invalid-lines' => 'નીચેને સà«àªªà«…મ બà«àª²à«‡àª•àª²à«€àª¸à«àªŸàª®àª¾àª‚ {{PLURAL:$1| લાઈન|લાઈનો}} અમાનà«àª¯ છે. નિયમીત {{PLURAL:$1|expression|expressions}} અને પાનà«àª®à« સાચવà«àª¯àª¾àª‚ પહેલા તેને સà«àª§àª¾àª°à«€ લેશો.',
- 'spam-blacklist-desc' => 'Regex-આધારિત àªàª¨à«àªŸà«€ સà«àªªà«…મ સાધનl: [[MediaWiki:Spam-blacklist]] અને [[MediaWiki:Spam-whitelist]]',
+ 'spam-blacklist-desc' => 'Regex-આધારિત àªàª¨à«àªŸà«€ સà«àªªà«…મ સાધનો પાનાઓ અને નોંધાયેલા સભà«àª¯à«‹àª¨àª¾àª‚ ઇમેલ સરનામાઓમાં URLs ને બà«àª²à«‡àª•àª²àª¿àª¸à«àªŸ કરવા દે છે.',
);
/** Hebrew (עברית)
@@ -1321,7 +1475,12 @@ $messages['he'] = array(
'spam-blacklisted-email-signup' => 'כתובת הדו×"ל ×”×–×ת נמצ×ת כרגע ברשימה השחורה של כתובות ×סורות לשימוש.',
'spam-invalid-lines' => '{{PLURAL:$1|השורה הב××”|השורות הב×ות}} ברשימת כתובות ×”Ö¾URL ×”×סורות
{{PLURAL:$1|×”×™× ×‘×™×˜×•×™ רגולרי בלתי תקין ויש לתקנה|הן ×‘×™×˜×•×™×™× ×¨×’×•×œ×¨×™×™× ×‘×œ×ª×™ ×ª×§×™× ×™× ×•×™×© לתקנן}} לפני שמירת הדף:',
- 'spam-blacklist-desc' => 'כלי ×נטי־ספ×× ×ž×‘×•×¡×¡ ביטוי רגולרי: [[MediaWiki:Spam-blacklist]] ו־[[MediaWiki:Spam-whitelist]]',
+ 'spam-blacklist-desc' => 'כלי נגד זבל מבוסס ×‘×™×˜×•×™×™× ×¨×’×•×œ×¨×™×™× ×œ×™×¦×™×¨×ª רשימה שחורה של URLÖ¾×™× ×‘×“×¤×™× ×•×›×ª×•×‘×•×ª דו×"ל ×œ×ž×©×ª×ž×©×™× ×¨×©×•×ž×™×',
+ 'log-name-spamblacklist' => 'יומן רשימה שחורה של ספ××',
+ 'log-description-spamblacklist' => '×”××™×¨×•×¢×™× ×”×לה ×¢×•×§×‘×™× ×חרי הפעלות של רשימה שחורה של ספ××.',
+ 'logentry-spamblacklist-hit' => '$1 {{GENDER:$1|גר×|גרמה}} לפעולת רשימה שחורה בדף $3 תוך כדי ניסיון להוסיף ×ת הכתובת $4.',
+ 'right-spamblacklistlog' => 'תצוגת יומן רשימה שחורה של ספ××',
+ 'action-spamblacklistlog' => 'תצוגת יומן רשימה שחורה של ספ××',
);
/** Hindi (हिनà¥à¤¦à¥€)
@@ -1349,7 +1508,7 @@ $messages['hi'] = array(
#</pre> <!-- इस पंकà¥à¤¤à¥€à¤‚ को à¤à¤¸à¥‡ के à¤à¤¸à¥‡ ही रहने दें -->',
'spam-invalid-lines' => 'निमà¥à¤¨à¤¾à¤‚कित अवांछित बà¥à¤²à¥ˆà¤•à¤²à¤¿à¤¸à¥à¤Ÿ {{PLURAL:$1|पंकà¥à¤¤à¤¿|पंकà¥à¤¤à¤¿à¤¯à¤¾à¤}} अमानà¥à¤¯ नियमित {{PLURAL:$1|अभिवà¥à¤¯à¤•à¥à¤¤à¤¿ है|अभिवà¥à¤¯à¤•à¥à¤¤à¤¿à¤¯à¤¾à¤ हैं}} और पृषà¥à¤  को जमा कराने से पहले ठीक करना चाहिà¤:',
- 'spam-blacklist-desc' => 'रेजà¤à¤•à¥à¤¸ पर आधारित सà¥à¤ªà¥…म रोकनेवाला उपकरण:[[MediaWiki:Spam-blacklist]] और [[MediaWiki:Spam-whitelist]]',
+ 'spam-blacklist-desc' => 'रेजà¤à¤•à¥à¤¸ पर आधारित सà¥à¤ªà¥…म रोकनेवाला उपकरण:[[MediaWiki:Spam-blacklist]] और [[MediaWiki:Spam-whitelist]]', # Fuzzy
);
/** Croatian (hrvatski)
@@ -1378,7 +1537,7 @@ $messages['hr'] = array(
#</pre> <!-- leave this line exactly as it is -->',
'spam-invalid-lines' => '{{PLURAL:$1|Slijedeći redak|Slijedeći redovi|Slijedeći redovi}} "crnog popisa" spama {{PLURAL:$1|je|su}} nevaljani {{PLURAL:$1|regularan izraz|regularni izrazi|regularni izrazi}} i {{PLURAL:$1|mora|moraju|moraju}} biti ispravljeni prije snimanja ove stranice:',
- 'spam-blacklist-desc' => 'Anti-spam alat zasnovan na reg. izrazima: [[MediaWiki:Spam-blacklist]] i [[MediaWiki:Spam-whitelist]]',
+ 'spam-blacklist-desc' => 'Anti-spam alat zasnovan na reg. izrazima: [[MediaWiki:Spam-blacklist]] i [[MediaWiki:Spam-whitelist]]', # Fuzzy
);
/** Upper Sorbian (hornjoserbsce)
@@ -1426,7 +1585,7 @@ $messages['hsb'] = array(
'spam-blacklisted-email-text' => 'Twoja e-mejlowa adresa je tuchwilu w Äornej lisćinje a tohodla za sÅ‚anje e-mejlow do druhich wužiwarjow zablokowana.',
'spam-blacklisted-email-signup' => 'Podata e-mejlowa adresa je tuchwilu přećiwo wužiwanju zablokowana.',
'spam-invalid-lines' => '{{PLURAL:$1|slÄ›dowaca linka je njepÅ‚aćiwy regularny wuraz|slÄ›dowacych linkow je regularny wuraz|slÄ›dowace linki su regularne wurazy|slÄ›dowacej lince stej regularnej wurazaj}} a {{PLURAL:$1|dyrbi|dyrbi|dyrbja|dyrbjetej}} so korigować, prjedy haÄ so strona skÅ‚aduje:',
- 'spam-blacklist-desc' => 'Přećiwospamowy nastroj na zakładźe Regex: [[MediaWiki:Spam-blacklist]] a [[MediaWiki:Spam-whitelist]]',
+ 'spam-blacklist-desc' => 'Přećiwospamowy nastroj na zakładźe Regex: [[MediaWiki:Spam-blacklist]] a [[MediaWiki:Spam-whitelist]]', # Fuzzy
);
/** Hungarian (magyar)
@@ -1455,7 +1614,7 @@ $messages['hu'] = array(
'spam-blacklisted-email' => 'Feketelistás e-mail cím',
'spam-blacklisted-email-signup' => 'A megadott email cím jelenleg feketelistán van, és nem lehet használni.',
'spam-invalid-lines' => 'Az alábbi {{PLURAL:$1|sor hibás|sorok hibásak}} a spam elleni feketelistában; {{PLURAL:$1|javítsd|javítsd őket}} mentés előtt:',
- 'spam-blacklist-desc' => 'Regex-alapú spamellenes eszköz: [[MediaWiki:Spam-blacklist]] és [[MediaWiki:Spam-whitelist]]',
+ 'spam-blacklist-desc' => 'Regex-alapú spamellenes eszköz: [[MediaWiki:Spam-blacklist]] és [[MediaWiki:Spam-whitelist]]', # Fuzzy
);
/** Interlingua (interlingua)
@@ -1503,7 +1662,7 @@ $messages['ia'] = array(
'spam-blacklisted-email-text' => 'Tu adresse de e-mail es actualmente blocate de inviar messages a altere usatores.',
'spam-blacklisted-email-signup' => 'Le adresse de e-mail specificate es actualmente blocate per le lista nigre.',
'spam-invalid-lines' => 'Le sequente {{PLURAL:$1|linea|lineas}} del lista nigre antispam es {{PLURAL:$1|un expression|expressiones}} regular invalide e debe esser corrigite ante que tu immagazina le pagina:',
- 'spam-blacklist-desc' => 'Instrumento antispam a base de regex: [[MediaWiki:Spam-blacklist]] e [[MediaWiki:Spam-whitelist]]',
+ 'spam-blacklist-desc' => 'Instrumento antispam a base de regex: [[MediaWiki:Spam-blacklist]] e [[MediaWiki:Spam-whitelist]]', # Fuzzy
);
/** Indonesian (Bahasa Indonesia)
@@ -1535,7 +1694,7 @@ $messages['id'] = array(
'spam-blacklisted-email' => 'Alamat surel yang masuk daftar hitam',
'spam-blacklisted-email-signup' => 'Alamat surel yang dimasukkan saat ini sedang tidak boleh digunakan.',
'spam-invalid-lines' => '{{PLURAL:$1|Baris|Baris-baris}} daftar hitam spam berikut adalah {{PLURAL:$1|ekspresi|ekspresi}} regular yang tak valid dan {{PLURAL:$1|perlu|perlu}} dikoreksi sebelum disimpan:',
- 'spam-blacklist-desc' => 'Perkakas anti-spam berbasis regex: [[MediaWiki:Spam-blacklist]] dan [[MediaWiki:Spam-whitelist]]',
+ 'spam-blacklist-desc' => 'Perkakas anti-spam berbasis regex: [[MediaWiki:Spam-blacklist]] dan [[MediaWiki:Spam-whitelist]]', # Fuzzy
);
/** Iloko (Ilokano)
@@ -1578,7 +1737,12 @@ $messages['ilo'] = array(
'spam-blacklisted-email-text' => 'Ti e-suratmo a pagtaengan ket agdama a naiparit manipud ti panagipatulod kadagiti e-surat kadagiti sabsabali nga agar-aramat.',
'spam-blacklisted-email-signup' => 'Ti naited nga e-surat a pagatengan ket agdama a naiparit manipud ti panagusar.',
'spam-invalid-lines' => 'Ti sumaganad a spam blacklist {{PLURAL:$1| a linia ket|kadagiti linia ket}} imbalido a kadawyan {{PLURAL:$1|a nangisao|kadagiti panangisao}} ken {{PLURAL:$1|masapsapol|masapol}} a mapudnuan sakbay nga idulin ti panid:',
- 'spam-blacklist-desc' => 'Naibantay ti regex kontra-spam a ramit: [[MediaWiki:Spam-blacklist]] ken [[MediaWiki:Spam-whitelist]]',
+ 'spam-blacklist-desc' => 'Naibatay ti regex a ramit ti kontra-spam a mangpalubos a mangiparit kadagiti URL kadagiti panid ken dagiti esurat a pagtaengan para kadagiti nakarehistro nga agar-aramat',
+ 'log-name-spamblacklist' => 'Listaan ti naiparit para iti spam',
+ 'log-description-spamblacklist' => 'Dagitoy a pasamak ket surotenna dagiti naiparit a listaan a napuntaan ti spam.',
+ 'logentry-spamblacklist-hit' => 'Ti $1 ket gapuanan ti pannakapunta ti naiparit a listaan ti spam iti $3 babaen ti panagpadas nga aginayon iti $4.',
+ 'right-spamblacklistlog' => 'Kitaen ti naiparit a listaan ti spam',
+ 'action-spamblacklistlog' => 'kitaen ti naiparit a listaan ti spam',
);
/** Icelandic (íslenska)
@@ -1623,7 +1787,7 @@ $messages['is'] = array(
'spam-blacklisted-email-text' => 'Netfangið þitt er skráð á bannlista og ekki er hægt að senda tölfupóst frá því til annara notenda.',
'spam-blacklisted-email-signup' => 'Netfangið sem þú tilgreindir er á bannlista og er ekki hægt að nota.',
'spam-invalid-lines' => 'Eftirfarandi bannlista {{PLURAL:$1|færsla er ógild regluleg segð|færslur eru ógildar reglulegar segðir}} og leiðrétta þarf {{PLURAL:$1|hana|þær}} áður en síðan er vistuð:',
- 'spam-blacklist-desc' => 'Kæfuvörn byggð á reglulegum segðum: [[MediaWiki:Spam-blacklist]] og [[MediaWiki:Spam-whitelist]]',
+ 'spam-blacklist-desc' => 'Kæfuvörn byggð á reglulegum segðum: [[MediaWiki:Spam-blacklist]] og [[MediaWiki:Spam-whitelist]]', # Fuzzy
);
/** Italian (italiano)
@@ -1632,10 +1796,11 @@ $messages['is'] = array(
* @author Ximo17
*/
$messages['it'] = array(
- 'spam-blacklist' => ' # Le URL esterne al sito che corrispondono alla lista seguente verranno bloccate.
- # La lista è valida solo per questo sito; fare riferimento anche alla blacklist globale.
- # Per la documentazione si veda https://www.mediawiki.org/wiki/Extension:SpamBlacklist
- #<!-- non modificare in alcun modo questa riga --> <pre>
+ 'spam-blacklist' => ' #<!-- non modificare in alcun modo questa riga --> <pre>
+# Le URL esterne al sito che corrispondono alla lista seguente verranno bloccate.
+# La lista è valida solo per questo sito; fare riferimento anche alla blacklist globale.
+# Per la documentazione si veda https://www.mediawiki.org/wiki/Extension:SpamBlacklist
+#
# La sintassi è la seguente:
# * Tutto ciò che segue un carattere "#" è un commento, fino al termine della riga
# * Tutte le righe non vuote sono frammenti di espressioni regolari che si applicano al solo nome dell\'host nelle URL
@@ -1647,29 +1812,34 @@ $messages['it'] = array(
# La sintassi è la seguente:
# * Tutto ciò che segue un carattere "#" è un commento, fino al termine della riga
# * Tutte le righe non vuote sono frammenti di espressioni regolari che si applicano al solo nome dell\'host nelle URL
-
#</pre> <!-- non modificare in alcun modo questa riga -->',
- 'email-blacklist' => ' # Gli indirizzi e-mail che corrispondono alla lista seguente saranno bloccati, non sarà possibile salvare o inviare e-mail.
- # La lista è valida solo per questo wiki; fare riferimento anche alla blacklist globale.
- # Per la documentazione si veda https://www.mediawiki.org/wiki/Extension:SpamBlacklist
- # <!-- non modificare questa linea --> <pre>
+ 'email-blacklist' => ' #<!-- non modificare in alcun modo questa riga --> <pre>
+# Gli indirizzi email che corrispondono alla lista seguente saranno bloccati, non sarà possibile salvare o inviare email.
+# La lista è valida solo per questo sito; fare riferimento anche alla blacklist globale.
+# Per la documentazione si veda https://www.mediawiki.org/wiki/Extension:SpamBlacklist
+#
# La sintassi è la seguente:
-# * Tutto ciò che è compreso tra un carattere "#" e la fine della riga è un commento
-# * Tutte le righe non vuote sono frammenti di espressioni regolari che si applicano al solo nome dell\'host degli indirizzi e-mail
- #</pre> <!-- non modificare questa linea -->',
- 'email-whitelist' => ' #<!-- non modificare questa linea --> <pre>
-# Gli indirizzi e-mail compresi in questa lista *non* saranno bloccati anche se dovrebbero
-# essere stati bloccati dagli elementi presenti nella lista nera.
-#
- #</pre> <!-- non modificare questa linea -->
+# * Tutto ciò che segue un carattere "#" è un commento, fino al termine della riga
+# * Tutte le righe non vuote sono frammenti di espressioni regolari che si applicano al solo nome dell\'host degli indirizzi email
+ #</pre> <!-- non modificare in alcun modo questa riga -->',
+ 'email-whitelist' => ' #<!-- non modificare in alcun modo questa riga --> <pre>
+# Gli indirizzi email che corrispondono alla lista seguente *non* verranno
+# bloccati, anche nel caso corrispondano a delle voci della blacklist
+#
# La sintassi è la seguente:
-# * Tutto ciò che è compreso tra un carattere "#" e la fine della riga è un commento
-# * Tutte le righe non vuote sono frammenti di espressioni regolari che si applicano al solo nome dell\'host degli indirizzi e-mail',
+# * Tutto ciò che segue un carattere "#" è un commento, fino al termine della riga
+# * Tutte le righe non vuote sono frammenti di espressioni regolari che si applicano al solo nome dell\'host degli indirizzi email
+ #</pre> <!-- non modificare in alcun modo questa riga -->',
'spam-blacklisted-email' => 'Indirizzo di posta elettronica bloccato',
'spam-blacklisted-email-text' => "Il tuo indirizzo di posta elettronica è attualmente nella lista nera per l'invio di email verso altri utenti.",
'spam-blacklisted-email-signup' => "L'indirizzo di posta elettronica indicato è attualmente nella lista nera.",
'spam-invalid-lines' => "{{PLURAL:$1|La seguente riga|Le seguenti righe}} della blacklist dello spam {{PLURAL:$1|non è un'espressione regolare valida|non sono espressioni regolari valide}}; si prega di correggere {{PLURAL:$1|l'errore|gli errori}} prima di salvare la pagina.",
- 'spam-blacklist-desc' => 'Strumento antispam basato sulle espressioni regolari [[MediaWiki:Spam-blacklist]] e [[MediaWiki:Spam-whitelist]]',
+ 'spam-blacklist-desc' => 'Strumento antispam basato sulle espressioni regolari per bloccare URL e indirizzi email di utenti registrati',
+ 'log-name-spamblacklist' => 'Spam blacklist',
+ 'log-description-spamblacklist' => 'Questi eventi tengono traccia delle attivazioni della lista nera dello spam.',
+ 'logentry-spamblacklist-hit' => "$1 ha causato l'attivazione della spam blacklist su $3 tentando di aggiungere $4.",
+ 'right-spamblacklistlog' => 'Visualizza registro della spam blacklist',
+ 'action-spamblacklistlog' => 'vedere il registro della spam blacklist',
);
/** Japanese (日本語)
@@ -1688,7 +1858,7 @@ $messages['ja'] = array(
#
# 構文ã¯ä»¥ä¸‹ã®é€šã‚Šã§ã™:
# * 「#ã€ä»¥é™è¡Œæœ«ã¾ã§ã¯ã‚³ãƒ¡ãƒ³ãƒˆã§ã™
-# * 空白をå«ã¾ãªã„è¡Œã¯ã€URLã«å«ã¾ã‚Œã‚‹ãƒ›ã‚¹ãƒˆåã¨ã®ä¸€è‡´ã‚’検出ã™ã‚‹æ­£è¦è¡¨ç¾ã§ã™
+# * 空ã§ãªã„è¡Œã¯ã€URLã«å«ã¾ã‚Œã‚‹ãƒ›ã‚¹ãƒˆåã¨ã®ä¸€è‡´ã‚’検出ã™ã‚‹æ­£è¦è¡¨ç¾ã§ã™
#</pre> <!-- ã“ã®è¡Œã¯å¤‰æ›´ã—ãªã„ã§ãã ã•ã„ -->',
'spam-whitelist' => ' #<!-- ã“ã®è¡Œã¯å¤‰æ›´ã—ãªã„ã§ãã ã•ã„ --> <pre>
@@ -1697,21 +1867,45 @@ $messages['ja'] = array(
#
# 構文ã¯ä»¥ä¸‹ã®é€šã‚Šã§ã™:
# * 「#ã€æ–‡å­—ã‹ã‚‰è¡Œæœ«ã¾ã§ã¯ã‚³ãƒ¡ãƒ³ãƒˆã¨ã—ã¦æ‰±ã‚ã‚Œã¾ã™
-# * 空白をå«ã¾ãªã„è¡Œã¯ã€URLã«å«ã¾ã‚Œã‚‹ãƒ›ã‚¹ãƒˆåã¨ã®ä¸€è‡´ã‚’検出ã™ã‚‹æ­£è¦è¡¨ç¾ã§ã™
+# * 空ã§ãªã„è¡Œã¯ã€URLã«å«ã¾ã‚Œã‚‹ãƒ›ã‚¹ãƒˆåã¨ã®ä¸€è‡´ã‚’検出ã™ã‚‹æ­£è¦è¡¨ç¾ã§ã™
+
+ #</pre> <!-- ã“ã®è¡Œã¯å¤‰æ›´ã—ãªã„ã§ãã ã•ã„ -->',
+ 'email-blacklist' => ' #<!-- ã“ã®è¡Œã¯å¤‰æ›´ã—ãªã„ã§ãã ã•ã„ --> <pre>
+# ã“ã®ä¸€è¦§ã¨ä¸€è‡´ã™ã‚‹ãƒ¡ãƒ¼ãƒ«ã‚¢ãƒ‰ãƒ¬ã‚¹ã¯ãã®ç™»éŒ²ã¨ãã“ã‹ã‚‰ã®ãƒ¡ãƒ¼ãƒ«é€ä¿¡ãŒãƒ–ロックã•ã‚Œã¾ã™ã€‚
+# ã“ã®ä¸€è¦§ã¯ã“ã®ã‚¦ã‚£ã‚­ã§ã®ã¿æœ‰åŠ¹ã§ã™ã€‚グローãƒãƒ« ブラックリストもå‚ç…§ã—ã¦ãã ã•ã„。
+# 利用方法㯠https://www.mediawiki.org/wiki/Extension:SpamBlacklist/ja ã‚’ã”覧ãã ã•ã„。
+#
+# 構文ã¯ä»¥ä¸‹ã®é€šã‚Šã§ã™:
+# * 「#ã€ä»¥é™è¡Œæœ«ã¾ã§ã¯ã‚³ãƒ¡ãƒ³ãƒˆã§ã™
+# * 空ã§ãªã„è¡Œã¯ã€URLã«å«ã¾ã‚Œã‚‹ãƒ›ã‚¹ãƒˆåã¨ã®ä¸€è‡´ã‚’検出ã™ã‚‹æ­£è¦è¡¨ç¾ã§ã™
+
+ #</pre> <!-- ã“ã®è¡Œã¯å¤‰æ›´ã—ãªã„ã§ãã ã•ã„ -->',
+ 'email-whitelist' => ' #<!-- ã“ã®è¡Œã¯å¤‰æ›´ã—ãªã„ã§ãã ã•ã„ --> <pre>
+# ã“ã®ä¸€è¦§ã¨ä¸€è‡´ã™ã‚‹ãƒ¡ãƒ¼ãƒ«ã‚¢ãƒ‰ãƒ¬ã‚¹ã¯ãŸã¨ãˆãƒ–ラックリストã«
+# 掲載ã•ã‚Œã¦ã„ãŸã¨ã—ã¦ã‚‚ã€ãƒ–ロック*ã•ã‚Œã¾ã›ã‚“*。
+#
+# 構文ã¯ä»¥ä¸‹ã®é€šã‚Šã§ã™:
+# * 「#ã€æ–‡å­—ã‹ã‚‰è¡Œæœ«ã¾ã§ã¯ã‚³ãƒ¡ãƒ³ãƒˆã¨ã—ã¦æ‰±ã‚ã‚Œã¾ã™
+# * 空ã§ãªã„è¡Œã¯ã€URLã«å«ã¾ã‚Œã‚‹ãƒ›ã‚¹ãƒˆåã¨ã®ä¸€è‡´ã‚’検出ã™ã‚‹æ­£è¦è¡¨ç¾ã§ã™
#</pre> <!-- ã“ã®è¡Œã¯å¤‰æ›´ã—ãªã„ã§ãã ã•ã„ -->',
'spam-blacklisted-email' => 'æ‹’å¦ãƒªã‚¹ãƒˆã«ã‚るメールアドレス',
'spam-blacklisted-email-text' => 'メールアドレスãŒæ‹’å¦ãƒªã‚¹ãƒˆã«å…¥ã£ã¦ã„ã‚‹ãŸã‚ã€ä»–ã®åˆ©ç”¨è€…ã«ãƒ¡ãƒ¼ãƒ«ã‚’é€ä¿¡ã§ãã¾ã›ã‚“。',
'spam-blacklisted-email-signup' => '指定ã•ã‚ŒãŸãƒ¡ãƒ¼ãƒ«ã‚¢ãƒ‰ãƒ¬ã‚¹ã¯ç¾åœ¨æ‹’å¦ãƒªã‚¹ãƒˆã«å…¥ã£ã¦ãŠã‚Šã€ä½¿ç”¨ã§ãã¾ã›ã‚“。',
'spam-invalid-lines' => 'ã“ã®ã‚¹ãƒ‘ムブラックリストã«ã¯ã€ç„¡åŠ¹ãª{{PLURAL:$1|æ­£è¦è¡¨ç¾}}ã‚’å«ã‚€{{PLURAL:$1|è¡Œ}}ãŒã‚ã‚Šã¾ã™ã€‚ä¿å­˜ã™ã‚‹å‰ã«å•é¡Œéƒ¨åˆ†ã‚’修正ã—ã¦ãã ã•ã„:',
- 'spam-blacklist-desc' => 'æ­£è¦è¡¨ç¾ã‚’用ã„ãŸã‚¹ãƒ‘ム対策ツール: [[MediaWiki:Spam-blacklist|スパムブラックリスト]]ãŠã‚ˆã³[[MediaWiki:Spam-whitelist|スパムホワイトリスト]]',
+ 'spam-blacklist-desc' => 'ページ内㮠URL や登録利用者ã®ãƒ¡ãƒ¼ãƒ«ã‚¢ãƒ‰ãƒ¬ã‚¹ã‚’ブラックリスト化ã§ãるよã†ã«ã™ã‚‹ã€æ­£è¦è¡¨ç¾ã«åŸºã¥ã„ãŸã‚¹ãƒ‘ム対策ツール',
+ 'log-name-spamblacklist' => 'スパムブラックリスト記録',
+ 'log-description-spamblacklist' => 'ã“れらã®ã‚¤ãƒ™ãƒ³ãƒˆã¯ã‚¹ãƒ‘ムブラックリストã¨ã®ä¸€è‡´ã‚’追跡ã—ã¾ã™ã€‚',
+ 'logentry-spamblacklist-hit' => '$1 ㌠$3 ã« $4 を追加ã—よã†ã¨ã—ãŸéš›ã«ã‚¹ãƒ‘ムブラックリストãŒç™ºå‹•ã—ã¾ã—ãŸã€‚',
+ 'right-spamblacklistlog' => 'スパムブラックリストを閲覧',
+ 'action-spamblacklistlog' => 'スパムブラックリスト記録ã®é–²è¦§',
);
/** Jutish (jysk)
* @author Ælsån
*/
$messages['jut'] = array(
- 'spam-blacklist-desc' => 'Regex-basærn anti-spem tø: [[MediaWiki:Spam-blacklist]] og [[MediaWiki:Spam-whitelist]]',
+ 'spam-blacklist-desc' => 'Regex-basærn anti-spem tø: [[MediaWiki:Spam-blacklist]] og [[MediaWiki:Spam-whitelist]]', # Fuzzy
);
/** Javanese (Basa Jawa)
@@ -1742,7 +1936,7 @@ $messages['jv'] = array(
'spam-blacklisted-email-text' => 'Alamat layang èlèktronik Sampéyan saiki didaptarirengaké saka ngirim layang èlèktronik nèng panganggi liya.',
'spam-blacklisted-email-signup' => 'Alamat layang èlèktronik sing diawèhaké saiki ora dililakaké.',
'spam-invalid-lines' => '{{PLURAL:$1|Baris|Baris-baris}} daftar ireng spam ing ngisor iki yaiku {{PLURAL:$1|èksprèsi|èksprèsi}} regulèr sing ora absah lan {{PLURAL:$1|perlu|perlu}} dikorèksi sadurungé disimpen:',
- 'spam-blacklist-desc' => 'Piranti anti-spam adhedhasar regex: [[MediaWiki:Spam-blacklist]] lan [[MediaWiki:Spam-whitelist]]',
+ 'spam-blacklist-desc' => 'Piranti anti-spam adhedhasar regex: [[MediaWiki:Spam-blacklist]] lan [[MediaWiki:Spam-whitelist]]', # Fuzzy
);
/** Georgian (ქáƒáƒ áƒ—ული)
@@ -1790,7 +1984,7 @@ $messages['ka'] = array(
'spam-blacklisted-email-text' => 'áƒáƒ›áƒŸáƒáƒ›áƒáƒ“ თქვენი ელ.ფáƒáƒ¡áƒ¢áƒ˜áƒ¡ მისáƒáƒ›áƒáƒ áƒ—ი შეტáƒáƒœáƒ˜áƒšáƒ˜áƒ შáƒáƒ• სიáƒáƒ¨áƒ˜, áƒáƒ›áƒ˜áƒ¢áƒáƒ› თქვენ áƒáƒ  შეგიძლიáƒáƒ— სხვრმáƒáƒ›áƒ®áƒ›áƒáƒ áƒ”ბლებისáƒáƒ—ვის შეტყáƒáƒ‘ინებების გáƒáƒ’ზáƒáƒ•áƒœáƒ.',
'spam-blacklisted-email-signup' => 'მითითებული ელ.ფáƒáƒ¡áƒ¢áƒ˜áƒ¡ მისáƒáƒ›áƒáƒ áƒ—ი შეტáƒáƒœáƒ˜áƒšáƒ˜áƒ შáƒáƒ• სიáƒáƒ¨áƒ˜ დრმისი გáƒáƒ›áƒáƒ§áƒ”ნებრშეუძლებელიáƒ.',
'spam-invalid-lines' => '{{PLURAL:$1|შáƒáƒ•áƒ˜ სიის შემდეგმრხáƒáƒ–მრშესáƒáƒ«áƒšáƒáƒ შეიცáƒáƒ•áƒ“ეს áƒáƒ áƒáƒ¡áƒ¬áƒáƒ áƒ˜ რეგულáƒáƒ áƒ£áƒ¡áƒšáƒ˜ გáƒáƒ›áƒáƒ—ქმრდრუნდრგáƒáƒ¡áƒ¬áƒáƒ áƒ“ეს|შáƒáƒ•áƒ˜ სიის შემდეგმრხáƒáƒ–ებმრშესáƒáƒ«áƒšáƒáƒ შეიცáƒáƒ•áƒ“ეს áƒáƒ áƒáƒ¡áƒ¬áƒáƒ áƒ˜ რეგულáƒáƒ áƒ£áƒ¡áƒšáƒ˜ გáƒáƒ›áƒáƒ—ქმები დრუნდრგáƒáƒ¡áƒ¬áƒáƒ áƒ“ეს}} შენáƒáƒ®áƒ•áƒáƒ›áƒ“ე:',
- 'spam-blacklist-desc' => 'რეგულáƒáƒ áƒ£áƒš გáƒáƒ›áƒáƒ—ქმებზე დáƒáƒ¤áƒ£áƒ«áƒœáƒ”ბული áƒáƒœáƒ¢áƒ˜-სპáƒáƒ› ინსტრუმენტი[[MediaWiki:Spam-blacklist]] დრ[[MediaWiki:Spam-whitelist]]',
+ 'spam-blacklist-desc' => 'რეგულáƒáƒ áƒ£áƒš გáƒáƒ›áƒáƒ—ქმებზე დáƒáƒ¤áƒ£áƒ«áƒœáƒ”ბული áƒáƒœáƒ¢áƒ˜-სპáƒáƒ› ინსტრუმენტი[[MediaWiki:Spam-blacklist]] დრ[[MediaWiki:Spam-whitelist]]', # Fuzzy
);
/** Kazakh (Arabic script) (قازاقشا (تٴوتە)â€)
@@ -1876,48 +2070,53 @@ $messages['kk-latn'] = array(
* @author ì•„ë¼
*/
$messages['ko'] = array(
- 'spam-blacklist' => ' # ì´ í•„í„°ì— í•´ë‹¹í•˜ëŠ” URLì„ ë¬¸ì„œì— ë„£ì„ ê²½ìš° 해당 íŽ¸ì§‘ì˜ ì €ìž¥ì„ ìžë™ìœ¼ë¡œ 막습니다.
- # ì´ í•„í„°ëŠ” 여기 위키 ë‚´ì—서만 ì ìš©ë©ë‹ˆë‹¤. ê´‘ì—­ 블랙리스트 ê¸°ëŠ¥ì´ ìžˆì„ ê²½ìš° 해당 목ë¡ë„ ìž‘ë™í•©ë‹ˆë‹¤.
- # ìžì„¸í•œ ë‚´ìš©ì€ https://www.mediawiki.org/wiki/Extension:SpamBlacklist (ì˜ì–´) 문서를 참고해 주세요.
- #<!-- ì´ ì¤„ì€ íŽ¸ì§‘í•˜ì§€ ë§ì•„ 주세요. 문서 ëª¨ì–‘ì„ ìœ„í•œ 줄입니다.--> <pre>
+ 'spam-blacklist' => ' #<!-- ì´ ì¤„ì€ ê·¸ëŒ€ë¡œ ë‘십시오 --> <pre>
+# ì´ í•„í„°ì— í•´ë‹¹í•˜ëŠ” URLì„ ë¬¸ì„œì— ë„£ì„ ê²½ìš° 해당 íŽ¸ì§‘ì˜ ì €ìž¥ì„ ìžë™ìœ¼ë¡œ 막습니다.
+# ì´ í•„í„°ëŠ” 여기 위키 ë‚´ì—서만 ì ìš©ë©ë‹ˆë‹¤. ê´‘ì—­ 블랙리스트 ê¸°ëŠ¥ì´ ìžˆì„ ê²½ìš° 해당 목ë¡ë„ ìž‘ë™í•©ë‹ˆë‹¤.
+# ì„¤ëª…ì„œì— ëŒ€í•´ì„œëŠ” https://www.mediawiki.org/wiki/Extension:SpamBlacklist 문서를 참고하세요
#
-# ë¬¸ë²•ì€ ë‹¤ìŒê³¼ 같습니다.
-# * "#"ì€ ì£¼ì„ ê¸°í˜¸ìž…ë‹ˆë‹¤. 줄ì—ì„œ #ê°€ 있는 ë¶€ë¶„ë¶€í„°ì˜ ê¸€ìžëŠ” ëª¨ë‘ ë¬´ì‹œë©ë‹ˆë‹¤.
-# * ê° ì¤„ì€ ì •ê·œ 표현ì‹ìœ¼ë¡œ, URL 문장 내부를 검사하는 ë°ì— 사용ë©ë‹ˆë‹¤.
+# ë¬¸ë²•ì€ ë‹¤ìŒê³¼ 같습니다:
+# * ""#" 문ìžì—ì„œ ì¤„ì˜ ë까지는 주ì„입니다
+# * ê° ì¤„ì€ ì •ê·œ 표현ì‹ìœ¼ë¡œ, URL ë¬¸ìž¥ì„ ê²€ì‚¬í•˜ëŠ” ë°ì— 사용ë©ë‹ˆë‹¤
- #</pre> <!-- ì´ ì¤„ì€ íŽ¸ì§‘í•˜ì§€ ë§ì•„ 주세요. 문서 ëª¨ì–‘ì„ ìœ„í•œ 줄입니다. -->',
+ #</pre> <!-- ì´ ì¤„ì€ ê·¸ëŒ€ë¡œ ë‘십시오 -->',
'spam-whitelist' => ' # <!-- ì´ ì¤„ì€ ê·¸ëŒ€ë¡œ ë‘십시오 --> <pre>
# ì´ ëª©ë¡ì— í¬í•¨ë˜ëŠ” 바깥 URLì€ ë¸”ëž™ë¦¬ìŠ¤íŠ¸ì— ì˜í•´ 차단ë˜ì–´
# 있ë”ë¼ë„ 문서 íŽ¸ì§‘ì´ ì œí•œë˜ì§€ 않습니다.
#
-# ë¬¸ë²•ì€ ë‹¤ìŒê³¼ 같습니다.
-# * "#"ì—ì„œ ê·¸ ì¤„ì˜ ë까지는 주ì„입니다.
-# * 모든 ì¤„ì€ URLì˜ í˜¸ìŠ¤íŠ¸ì™€ ì¼ì¹˜í•˜ëŠ” ì •ê·œ 표현ì‹ì˜ ì¼ë¶€ë¶„입니다.
+# ë¬¸ë²•ì€ ë‹¤ìŒê³¼ 같습니다:
+# * "#" 문ìžì—ì„œ ì¤„ì˜ ë까지는 주ì„입니다
+# * 모든 ì¤„ì€ URLì˜ í˜¸ìŠ¤íŠ¸ì™€ ì¼ì¹˜í•˜ëŠ” ì •ê·œ 표현ì‹ì˜ ì¼ë¶€ë¶„입니다
#</pre> <!-- ì´ ì¤„ì€ ê·¸ëŒ€ë¡œ ë‘십시오 -->',
- 'email-blacklist' => ' # ì´ ë¦¬ìŠ¤íŠ¸ì™€ ì¼ì¹˜í•˜ëŠ” ì´ë©”ì¼ ì£¼ì†ŒëŠ” 등ë¡ê³¼ ì´ë©”ì¼ ë°œì†¡ì´ ê¸ˆì§€ë©ë‹ˆë‹¤.
- # ì´ ë¦¬ìŠ¤íŠ¸ëŠ” ì´ ìœ„í‚¤ì—만 ì ìš©ë©ë‹ˆë‹¤; 글로벌 ë¸”ëž™ë¦¬ìŠ¤íŠ¸ë„ í•¨ê»˜ 참조하십시오.
- # 설명 문서를 보시려면 https://www.mediawiki.org/wiki/Extension:SpamBlacklist 를 방문해주세요.
- #<!-- ì´ ì¤„ì€ ê·¸ëŒ€ë¡œ ë‘십시오 --> <pre>
+ 'email-blacklist' => ' #<!-- ì´ ì¤„ì€ ê·¸ëŒ€ë¡œ ë‘십시오 --> <pre>
+# ì´ ë¦¬ìŠ¤íŠ¸ì™€ ì¼ì¹˜í•˜ëŠ” ì´ë©”ì¼ ì£¼ì†ŒëŠ” 등ë¡ê³¼ ì´ë©”ì¼ ë°œì†¡ì´ ê¸ˆì§€ë©ë‹ˆë‹¤.
+# ì´ ë¦¬ìŠ¤íŠ¸ëŠ” ì´ ìœ„í‚¤ì—만 ì ìš©ë©ë‹ˆë‹¤; ì „ì—­ ë¸”ëž™ë¦¬ìŠ¤íŠ¸ë„ í•¨ê»˜ 참조하십시오.
+# ì„¤ëª…ì„œì— ëŒ€í•´ì„œëŠ” https://www.mediawiki.org/wiki/Extension:SpamBlacklist 를 참조하십시오
#
# ë¬¸ë²•ì€ ë‹¤ìŒê³¼ 같습니다:
-# * "#" 다ìŒë¶€í„° ì¤„ì˜ ë까지는 주ì„으로 취급ë©ë‹ˆë‹¤
-# * 빈 ì¤„ì´ ì•„ë‹Œ 모든 ì¤„ì€ ì´ë©”ì¼ ì£¼ì†Œì˜ í˜¸ìŠ¤íŠ¸ë§Œ 검사하는 ì •ê·œ 표현ì‹ìž…니다.
+# * "#" 문ìžì—ì„œ ì¤„ì˜ ë까지는 주ì„입니다
+# * 빈 ì¤„ì´ ì•„ë‹Œ 모든 ì¤„ì€ ì´ë©”ì¼ ì£¼ì†Œì˜ í˜¸ìŠ¤íŠ¸ë§Œ 검사하는 ì •ê·œ 표현ì‹ìž…니다
- #<!-- ì´ ì¤„ì€ ê·¸ëŒ€ë¡œ ë‘십시오 --> </pre>',
+ #</pre> <!-- ì´ ì¤„ì€ ê·¸ëŒ€ë¡œ ë‘십시오 -->',
'email-whitelist' => ' #<!-- ì´ ì¤„ì€ ê·¸ëŒ€ë¡œ ë‘십시오 --> <pre>
- # ì´ ë¦¬ìŠ¤íŠ¸ì™€ ì¼ì¹˜í•˜ëŠ” ì´ë©”ì¼ ì£¼ì†ŒëŠ” ë¸”ëž™ë¦¬ìŠ¤íŠ¸ì— ì˜¬ë¼ê°€ 있ì„지ë¼ë„
- # ì‚¬ìš©ì´ ê¸ˆì§€ë˜ì§€ 않습니다.
- #
- #<!-- ì´ ì¤„ì€ ê·¸ëŒ€ë¡œ ë‘십시오 --> </pre>
+# ì´ ë¦¬ìŠ¤íŠ¸ì™€ ì¼ì¹˜í•˜ëŠ” ì´ë©”ì¼ ì£¼ì†ŒëŠ” ë¸”ëž™ë¦¬ìŠ¤íŠ¸ì— ì˜¬ë¼ê°€ 있ì„지ë¼ë„
+# ì‚¬ìš©ì´ ì°¨ë‹¨ë˜ì§€ 않습니다.
#
- # ë¬¸ë²•ì€ ë‹¤ìŒê³¼ 같습니다:
- # * "#" 다ìŒë¶€í„° ì¤„ì˜ ë까지는 주ì„으로 취급ë©ë‹ˆë‹¤
- # * 빈 ì¤„ì´ ì•„ë‹Œ 모든 ì¤„ì€ ì´ë©”ì¼ ì£¼ì†Œì˜ í˜¸ìŠ¤íŠ¸ë§Œ 검사하는 ì •ê·œ 표현ì‹ìž…니다.',
+# ë¬¸ë²•ì€ ë‹¤ìŒê³¼ 같습니다:
+# * "#" 문ìžì—ì„œ ì¤„ì˜ ë까지는 주ì„입니다
+# * 빈 ì¤„ì´ ì•„ë‹Œ 모든 ì¤„ì€ ì´ë©”ì¼ ì£¼ì†Œì˜ í˜¸ìŠ¤íŠ¸ë§Œ 검사하는 ì •ê·œ 표현ì‹ìž…니다.
+
+ #</pre> <!-- ì´ ì¤„ì€ ê·¸ëŒ€ë¡œ ë‘십시오 -->',
'spam-blacklisted-email' => 'ì´ë©”ì¼ ì£¼ì†Œê°€ 블랙리스트ë¨',
'spam-blacklisted-email-text' => 'ì´ë©”ì¼ ì£¼ì†ŒëŠ” 다른 사용ìžê°€ ì´ë©”ì¼ì„ 보내지 못하ë„ë¡ ë¸”ëž™ë¦¬ìŠ¤íŠ¸ì— ì˜¬ë¼ì™€ 있습니다.',
'spam-blacklisted-email-signup' => '입력한 ì´ë©”ì¼ ì£¼ì†ŒëŠ” 사용할 수 ì—†ë„ë¡ ë¸”ëž™ë¦¬ìŠ¤íŠ¸ë˜ì–´ 있습니다.',
- 'spam-invalid-lines' => '스팸 ë¸”ëž™ë¦¬ìŠ¤íŠ¸ì˜ ë‹¤ìŒ {{PLURAL:$1|줄}}ì— ìž˜ëª»ëœ ì •ê·œ 표현ì‹ì´ 사용ë˜ì–´ 저장하기 ì „ì— ë°”ë¥´ê²Œ ê³ ì³ì ¸ì•¼ 합니다:',
- 'spam-blacklist-desc' => 'ì •ê·œ 표현ì‹ì„ ì´ìš©í•´ ìŠ¤íŒ¸ì„ ë§‰ìŠµë‹ˆë‹¤: [[MediaWiki:Spam-blacklist]]와 [[MediaWiki:Spam-whitelist]]를 사용합니다.',
+ 'spam-invalid-lines' => '스팸 ë¸”ëž™ë¦¬ìŠ¤íŠ¸ì˜ ë‹¤ìŒ {{PLURAL:$1|줄}}ì— ìž˜ëª»ëœ ì •ê·œ {{PLURAL:$1|표현ì‹}}ì´ ì‚¬ìš©ë˜ì–´ 문서를 저장하기 ì „ì— ë°”ë¥´ê²Œ ê³ ì³ì ¸{{PLURAL:$1|야 합니다}}:',
+ 'spam-blacklist-desc' => 'ì •ê·œ 표현ì‹ì„ 사용해 ë¬¸ì„œì— ìžˆëŠ” URLê³¼ 등ë¡ëœ 사용ìžì˜ ì´ë©”ì¼ ì£¼ì†Œë¥¼ 블랙리스트 처리하여 ìŠ¤íŒ¸ì„ ë§‰ëŠ” ë„구',
+ 'log-name-spamblacklist' => '스팸 블랙리스트 기ë¡',
+ 'log-description-spamblacklist' => 'ì´ ì‚¬ê±´ì€ ìŠ¤íŒ¸ ë¸”ëž™ë¦¬ìŠ¤íŠ¸ì˜ ì¼ì¹˜ë¥¼ 추ì í•©ë‹ˆë‹¤.',
+ 'logentry-spamblacklist-hit' => '$1 사용ìžê°€ $3 ë¬¸ì„œì— $4(ì„)를 추가하려고 í–ˆì„ ë•Œì— ìŠ¤íŒ¸ ë¸”ëž™ë¦¬ìŠ¤íŠ¸ì˜ ì¼ì¹˜ê°€ ë°œìƒí–ˆìŠµë‹ˆë‹¤.',
+ 'right-spamblacklistlog' => '스팸 블랙리스트 ê¸°ë¡ ë³´ê¸°',
+ 'action-spamblacklistlog' => '스팸 블랙리스트 기ë¡ì„ ë³¼',
);
/** Colognian (Ripoarisch)
@@ -1963,7 +2162,7 @@ $messages['ksh'] = array(
'spam-invalid-lines' => 'Mer han Fähler en rejolähre Ußdröck jefonge.
{{PLURAL:$1|De Reih onge schtemmp nit un moß|Di $1 Reije onge schtemme nit un möße|Dat sull}}
för em Afschpeischere eets en Oodenong jebraat wääde:',
- 'spam-blacklist-desc' => 'Met rejolähre Ußdröck jääje der <i lang="en">SPAM<i> — övver en [[MediaWiki:Spam-blacklist|„schwazze Leß“]] un en [[MediaWiki:Spam-whitelist|Leß met Ußnahme dohfun]].',
+ 'spam-blacklist-desc' => 'Met rejolähre Ußdröck jääje der <i lang="en">SPAM<i> — övver en [[MediaWiki:Spam-blacklist|„schwazze Leß“]] un en [[MediaWiki:Spam-whitelist|Leß met Ußnahme dohfun]].', # Fuzzy
);
/** Luxembourgish (Lëtzebuergesch)
@@ -1973,7 +2172,7 @@ $messages['lb'] = array(
'spam-blacklisted-email' => 'Gespaart Mail-Adressen',
'spam-blacklisted-email-text' => 'Är Mailadress ass elo gespaart fir anere Benotzer Mailen ze schécken.',
'spam-blacklisted-email-signup' => "D'Mailadress déi Dir uginn hutt ass elo gespaart fir anere Benotzer Mailen ze schécken.",
- 'spam-blacklist-desc' => 'Op regulären Ausdréck (Regex) opgebauten Tool: [[MediaWiki:Spam-blacklist]] a [[MediaWiki:Spam-whitelist]]',
+ 'spam-blacklist-desc' => 'Op regulären Ausdréck (Regex) opgebauten Tool deen et erlaabt URLe vu Säiten op eng schwaarz Lëscht ze setzen an e-Mail-Adresssen vu registréierte Benotzer',
);
/** Limburgish (Limburgs)
@@ -2028,14 +2227,14 @@ $messages['li'] = array(
'spam-blacklisted-email-text' => 'Dien e-mailadres steit momenteel oppe zwarte lies wodoor se gein e-mails nao anger gebroekers kins versjikke.',
'spam-blacklisted-email-signup' => "'t Opgegaeve e-mailadres steit momenteel oppe zwarte lies.",
'spam-invalid-lines' => "De volgende {{PLURAL:$1|regel|regel}} van de zwarte lies {{PLURAL:$1|is 'n|zeen}} onzjuuste reguliere {{PLURAL:$1|oetdrukking|oetdrukkinge}} en {{PLURAL:$1|mót|mótte}} verbaeterd waere alveures de pazjena kin waere opgeslage:",
- 'spam-blacklist-desc' => 'Antispamfunctionaliteit via reguliere expressies: [[MediaWiki:Spam-blacklist]] en [[MediaWiki:Spam-whitelist]]',
+ 'spam-blacklist-desc' => 'Antispamfunctionaliteit via reguliere expressies: [[MediaWiki:Spam-blacklist]] en [[MediaWiki:Spam-whitelist]]', # Fuzzy
);
/** Minangkabau (Baso Minangkabau)
* @author Iwan Novirion
*/
$messages['min'] = array(
- 'spam-blacklist-desc' => 'Pakakeh anti-spam babasis regex: [[MediaWiki:Spam-blacklist]] jo [[MediaWiki:Spam-whitelist]]',
+ 'spam-blacklist-desc' => 'Pakakeh anti-spam babasis regex: [[MediaWiki:Spam-blacklist]] jo [[MediaWiki:Spam-whitelist]]', # Fuzzy
);
/** Macedonian (македонÑки)
@@ -2083,7 +2282,12 @@ $messages['mk'] = array(
'spam-blacklisted-email-text' => 'Ðа вашата адреÑа моментално не Ñ Ðµ дозволено да иÑпраќа е-пошта на други кориÑници.',
'spam-blacklisted-email-signup' => 'Употребата на дадената адреÑа е моментално забранета.',
'spam-invalid-lines' => '{{PLURAL:$1|Следниов ред во црниот ÑпиÑок на Ñпам е|Следниве редови во црниот ÑпиÑок на Ñпам Ñе}} {{PLURAL:$1|погрешен регуларен израз|погрешни регуларни изрази}} и {{PLURAL:$1|треба да Ñе поправи|треба да Ñе поправат}} пред да Ñе зачува Ñтраницата:',
- 'spam-blacklist-desc' => 'ÐнтиÑпам алатка на оÑнова на регуларни изрази: [[MediaWiki:Spam-blacklist]] и [[MediaWiki:Spam-whitelist]]',
+ 'spam-blacklist-desc' => 'Ðлатка против Ñпам на оÑнова на регуларни изрази што овозможува забрана на URL и е-поштенÑки адреÑи за кориÑници',
+ 'log-name-spamblacklist' => 'Дневник за Ñпам од црниот ÑпиÑок',
+ 'log-description-spamblacklist' => 'Овие наÑтани Ñледат обиди на Ñпам од црниот ÑпиÑок.',
+ 'logentry-spamblacklist-hit' => '$1 Ñтави Ñпам заведен во црниот ÑпиÑок $3 при обидот да ја додаде адреÑата $4.',
+ 'right-spamblacklistlog' => 'Преглед на дневникот за Ñпам од црниот ÑпиÑок',
+ 'action-spamblacklistlog' => 'преглед на дневникот за Ñпам од црниот ÑпиÑок',
);
/** Malayalam (മലയാളം)
@@ -2131,7 +2335,12 @@ $messages['ml'] = array(
'spam-blacklisted-email-text' => 'താങàµà´•à´³àµà´Ÿàµ† ഇമെയിൽ വിലാസം ഇപàµà´ªàµ‹àµ¾ മറàµà´±àµà´³àµà´³à´µàµ¼à´•àµà´•àµ à´Žà´´àµà´¤àµà´¤à´¯à´•àµà´•à´¾à´¨à´¾à´µà´¾à´¤àµà´¤ à´•à´°à´¿à´®àµà´ªà´Ÿàµà´Ÿà´¿à´•à´¯à´¿àµ½ ഉൾപàµà´ªàµ†à´Ÿàµà´Ÿà´¿à´°à´¿à´•àµà´•àµà´¨àµà´¨àµ.',
'spam-blacklisted-email-signup' => 'നൽകിയ ഇമെയിൽ വിലാസം ഇപàµà´ªàµ‹àµ¾ à´•à´°à´¿à´®àµà´ªà´Ÿàµà´Ÿà´¿à´•à´¯à´¿àµ½ പെടàµà´Ÿà´¿à´°à´¿à´•àµà´•àµà´¨àµà´¨ à´’à´¨àµà´¨à´¾à´£àµ.',
'spam-invalid-lines' => 'താഴെ കൊടàµà´¤àµà´¤à´¿à´°à´¿à´•àµà´•àµà´¨àµà´¨ പാഴെഴàµà´¤àµà´¤àµ à´•à´°à´¿à´®àµà´ªà´Ÿàµà´Ÿà´¿à´•à´¯à´¿à´²àµ† {{PLURAL:$1|വരി à´’à´°àµ|വരികൾ}} അസാധàµà´µà´¾à´¯ റെഗàµà´²àµ¼ {{PLURAL:$1|à´Žà´•àµà´¸àµâ€Œâ€Œà´ªàµà´°àµ†à´·àµ»|à´Žà´•àµà´¸àµâ€Œâ€Œà´ªàµà´°àµ†à´·à´¨àµà´•àµ¾}} ആണàµ, താൾ സേവൠചെയàµà´¯àµà´¨àµà´¨à´¤à´¿à´¨àµ à´®àµà´®àµà´ªàµ {{PLURAL:$1|à´…à´¤àµ|à´…à´µ}} ശരിയാകàµà´•àµ‡à´£àµà´Ÿà´¤àµà´£àµà´Ÿàµ:',
- 'spam-blacklist-desc' => 'റെജെകàµà´¸àµ-അധിഷàµà´ à´¿à´¤ പാഴെഴàµà´¤àµà´¤àµ തടയൽ ഉപകരണം: [[MediaWiki:Spam-blacklist]] à´’à´ªàµà´ªà´‚ [[MediaWiki:Spam-whitelist]]',
+ 'spam-blacklist-desc' => 'à´…à´‚à´—à´¤àµà´µà´®àµ†à´Ÿàµà´¤àµà´¤ ഉപയോകàµà´¤à´¾à´•àµà´•àµ¾ à´¯àµ.ആർ.à´Žà´²àµà´²àµà´•à´³àµà´‚ ഇമെയിൽ വിലാസങàµà´™à´³àµà´‚, താളàµà´•à´³à´¿àµ½ ചേർകàµà´•àµà´¨àµà´¨à´¤àµ à´•à´°à´¿à´®àµà´ªà´Ÿàµà´Ÿà´¿à´•à´¯à´¿àµ½ പെടàµà´¤àµà´¤à´¾à´¨àµà´³àµà´³ റെജെകàµà´¸àµ-അധിഷàµà´ à´¿à´¤ പാഴെഴàµà´¤àµà´¤àµ തടയൽ ഉപകരണം',
+ 'log-name-spamblacklist' => 'പാഴെഴàµà´¤àµà´¤àµ à´•à´°à´¿à´®àµà´ªà´Ÿàµà´Ÿà´¿à´• രേഖ',
+ 'log-description-spamblacklist' => 'പാഴെഴàµà´¤àµà´¤àµ à´•à´°à´¿à´®àµà´ªà´Ÿàµà´Ÿà´¿à´•à´¯àµ† ഉണർതàµà´¤à´¿à´¯ à´ªàµà´°à´µàµƒà´¤àµà´¤à´¿à´•à´³àµà´Ÿàµ† രേഖ.',
+ 'logentry-spamblacklist-hit' => '$3 à´Žà´¨àµà´¨ താളിൽ $4 à´Žà´¨àµà´¨à´¤àµ ചേർകàµà´•à´¾àµ» $1 നടതàµà´¤à´¿à´¯ à´¶àµà´°à´®à´‚ പാഴെഴàµà´¤àµà´¤àµ à´•à´°à´¿à´®àµà´ªà´Ÿàµà´Ÿà´¿à´•à´¯à´¿àµ½ à´•àµà´Ÿàµà´™àµà´™à´¿à´¯à´¿à´°à´¿à´•àµà´•àµà´¨àµà´¨àµ.',
+ 'right-spamblacklistlog' => 'പാഴെഴàµà´¤àµà´¤àµ à´•à´°à´¿à´®àµà´ªà´Ÿàµà´Ÿà´¿à´• രേഖ കാണàµà´•',
+ 'action-spamblacklistlog' => 'പാഴെഴàµà´¤àµà´¤àµ à´•à´°à´¿à´®àµà´ªà´Ÿàµà´Ÿà´¿à´• രേഖ കാണàµà´•',
);
/** Marathi (मराठी)
@@ -2164,7 +2373,7 @@ $messages['mr'] = array(
'spam-blacklisted-email-text' => 'तà¥à¤®à¤šà¤¾ ई-पतà¥à¤¤à¤¾ काळà¥à¤¯à¤¾ यादीत समाविषà¥à¤Ÿ करणà¥à¤¯à¤¾à¤¤ आला आहे. इतर सदसà¥à¤¯à¤¾à¤‚ना संपरà¥à¤• करणे शकà¥à¤¯ नाही.',
'spam-blacklisted-email-signup' => 'दिलेला विपतà¥à¤° पतà¥à¤¤à¤¾ सदà¥à¤¯ वापरणà¥à¤¯à¤¾à¤¸ पà¥à¤°à¤¤à¤¿à¤¬à¤‚धित केलेला आहे',
'spam-invalid-lines' => 'हे पान जतन करणà¥à¤¯à¤¾à¤ªà¥‚रà¥à¤µà¥€ खालील {{PLURAL:$1|ओळ जी चà¥à¤•à¥€à¤šà¥€|ओळी जà¥à¤¯à¤¾ चà¥à¤•à¥€à¤šà¥à¤¯à¤¾}} à¤à¤•à¥à¤¸à¥à¤ªà¥à¤°à¥‡à¤¶à¤¨ {{PLURAL:$1|आहे|आहेत}}, दà¥à¤°à¥à¤¸à¥à¤¤ करणे गरजेचे आहे:',
- 'spam-blacklist-desc' => 'रेजà¤à¤•à¥à¤¸ वर चालणारे सà¥à¤ªà¥…म थांबविणारे उपकरण: [[MediaWiki:Spam-blacklist]] व [[MediaWiki:Spam-whitelist]]',
+ 'spam-blacklist-desc' => 'रेजà¤à¤•à¥à¤¸ वर चालणारे सà¥à¤ªà¥…म थांबविणारे उपकरण: [[MediaWiki:Spam-blacklist]] व [[MediaWiki:Spam-whitelist]]', # Fuzzy
);
/** Malay (Bahasa Melayu)
@@ -2213,10 +2422,10 @@ $messages['ms'] = array(
'spam-blacklisted-email-text' => 'Alamat e-mel anda kini disenaraihitamkan daripada menghantar e-mel kepada pengguna lain.',
'spam-blacklisted-email-signup' => 'Alamat e-mel yang diberikan ini kini disenaraihitamkan.',
'spam-invalid-lines' => '{{PLURAL:$1|Baris|Baris-baris}} berikut menggunakan ungkapan nalar yang tidak sah. Sila baiki senarai hitam ini sebelum menyimpannya:',
- 'spam-blacklist-desc' => 'Alat anti-spam berdasarkan ungkapan nalar: [[MediaWiki:Spam-blacklist]] dan [[MediaWiki:Spam-whitelist]]',
+ 'spam-blacklist-desc' => 'Alat anti-spam berdasarkan ungkapan nalar: [[MediaWiki:Spam-blacklist]] dan [[MediaWiki:Spam-whitelist]]', # Fuzzy
);
-/** Norwegian Bokmål (norsk (bokmål)‎)
+/** Norwegian Bokmål (norsk bokmål)
*/
$messages['nb'] = array(
'spam-blacklist' => ' # Eksterne URL-er som finnes på denne lista vil ikke kunne legges til på en side.
@@ -2260,7 +2469,7 @@ $messages['nb'] = array(
'spam-blacklisted-email-text' => 'E-postadressen din er svartelistes, så du kan ikke sende e-post til andre brukere.',
'spam-blacklisted-email-signup' => 'Den angitte e-postadressen er svartelistet.',
'spam-invalid-lines' => 'Følgende {{PLURAL:$1|linje|linjer}} i spamsvartelista er {{PLURAL:$1|et ugyldig regulært uttrykk|ugyldige regulære uttrykk}} og må rettes før lagring av siden:',
- 'spam-blacklist-desc' => 'Antispamverktøy basert på regulære uttrykk: [[MediaWiki:Spam-blacklist]] og [[MediaWiki:Spam-whitelist]]',
+ 'spam-blacklist-desc' => 'Antispamverktøy basert på regulære uttrykk: [[MediaWiki:Spam-blacklist]] og [[MediaWiki:Spam-whitelist]]', # Fuzzy
);
/** Low German (Plattdüütsch)
@@ -2287,7 +2496,7 @@ $messages['nds'] = array(
#</pre> <!-- Disse Reeg dröff nich ännert warrn! -->',
'spam-invalid-lines' => 'Disse {{PLURAL:$1|Reeg|Regen}} in de Spam-Swartlist {{PLURAL:$1|is en ungülligen regulären Utdruck|sünd ungüllige reguläre Utdrück}}. De {{PLURAL:$1|mutt|mööt}} utbetert warrn, ehrdat de Sied spiekert warrn kann:',
- 'spam-blacklist-desc' => 'Regex-baseert Anti-Spam-Warktüüch: [[MediaWiki:Spam-blacklist]] un [[MediaWiki:Spam-whitelist]]',
+ 'spam-blacklist-desc' => 'Regex-baseert Anti-Spam-Warktüüch: [[MediaWiki:Spam-blacklist]] un [[MediaWiki:Spam-whitelist]]', # Fuzzy
);
/** Dutch (Nederlands)
@@ -2342,7 +2551,12 @@ $messages['nl'] = array(
'spam-blacklisted-email-text' => 'Uw e-mailadres staat momenteel op de zwarte lijst waardoor u geen e-mails naar andere gebruikers kunt verzenden.',
'spam-blacklisted-email-signup' => 'Het opgegeven e-mailadres staat momenteel op de zwarte lijst.',
'spam-invalid-lines' => 'De volgende {{PLURAL:$1|regel|regels}} van de zwarte lijst {{PLURAL:$1|is een|zijn}} onjuiste reguliere {{PLURAL:$1|expressie|expressies}} en {{PLURAL:$1|moet|moeten}} verbeterd worden alvorens de pagina kan worden opgeslagen:',
- 'spam-blacklist-desc' => 'Antispamfunctionaliteit via reguliere expressies: [[MediaWiki:Spam-blacklist]] en [[MediaWiki:Spam-whitelist]]',
+ 'spam-blacklist-desc' => "Op reguliere expressies gebaseed antispamhulpprogramma dat het mogelijk maakt URL's in pagina's te blokkeren en e-mailadressen voor geblokkeerde gebruikers",
+ 'log-name-spamblacklist' => 'Logboek zwarte lijst',
+ 'log-description-spamblacklist' => 'Deze lijst bevat gebeurtenissen met betrekking tot de zwarte lijst.',
+ 'logentry-spamblacklist-hit' => '{{GENDER:$2|$1}} heeft geprobeerd $4 van de zwarte lijst toe te voegen op $3', # Fuzzy
+ 'right-spamblacklistlog' => 'Logboek zwarte lijst bekijken',
+ 'action-spamblacklistlog' => 'logboek zwarte lijst te bekijken',
);
/** Nederlands (informeel)‎ (Nederlands (informeel)‎)
@@ -2352,7 +2566,7 @@ $messages['nl-informal'] = array(
'spam-blacklisted-email-text' => 'Je e-mailadres staat momenteel op de zwarte lijst waardoor je geen e-mails naar andere gebruikers kunt verzenden.',
);
-/** Norwegian Nynorsk (norsk (nynorsk)‎)
+/** Norwegian Nynorsk (norsk nynorsk)
* @author Frokor
*/
$messages['nn'] = array(
@@ -2376,7 +2590,7 @@ $messages['nn'] = array(
#</pre> <!-- la denne linja vere nøyaktig som ho er -->',
'spam-invalid-lines' => 'Følgjande {{PLURAL:$1|linje|linjer}} i spamsvartelista er {{PLURAL:$1|eit ugyldig regulært uttrykk|ugyldige regulære uttrykk}} og må rettast før lagring av sida:',
- 'spam-blacklist-desc' => 'Antispamverktøy basert på regulære uttrykk: [[MediaWiki:Spam-blacklist]] og [[MediaWiki:Spam-whitelist]]',
+ 'spam-blacklist-desc' => 'Antispamverktøy basert på regulære uttrykk: [[MediaWiki:Spam-blacklist]] og [[MediaWiki:Spam-whitelist]]', # Fuzzy
);
/** Occitan (occitan)
@@ -2395,10 +2609,10 @@ $messages['oc'] = array(
#</pre> <!--Daissatz aquesta linha tala coma es -->",
'spam-invalid-lines' => "{{PLURAL:$1|La linha seguenta |Las linhas seguentas}} de la lista dels spams {{PLURAL:$1|es redigida|son redigidas}} d'un biais incorrècte e {{PLURAL:$1|necessita|necessitan}} las correccions necessàrias abans tot salvament de la pagina :",
- 'spam-blacklist-desc' => "Aisina antispam basada sus d'expressions regularas : ''[[MediaWiki:Spam-blacklist]]'' et ''[[MediaWiki:Spam-whitelist]]''",
+ 'spam-blacklist-desc' => "Aisina antispam basada sus d'expressions regularas : ''[[MediaWiki:Spam-blacklist]]'' et ''[[MediaWiki:Spam-whitelist]]''", # Fuzzy
);
-/** Oriya (ଓଡ଼ିଆ)
+/** Oriya (ଓଡ଼ିଆ)
* @author Jnanaranjan Sahu
* @author Psubhashish
*/
@@ -2445,7 +2659,7 @@ $messages['or'] = array(
'spam-blacklisted-email-text' => 'ଆପଣଙà­à¬• ଇ-ମେଲ ଠିକଣାଟି ଅନà­à­Ÿà¬®à¬¾à¬¨à¬™à­à¬•à­ ଇ-ମେଲ ପଠାଇବାରୠବାସନà­à¬¦ କରାଯାଇଛି ।',
'spam-blacklisted-email-signup' => 'ଦିଆଯାଇଥିବା ଇ-ମେଲ ଠିକଣାଟି ବà­à­Ÿà¬¬à¬¹à¬¾à¬°à¬•à¬°à¬¿à¬¬à¬¾à¬°à­ ବାସନà­à¬¦ କରାଯାଇଛି ।',
'spam-invalid-lines' => 'à¬à¬¹à¬¿ ସà­à¬ªà¬¾à¬® ଅଟକତାଲିକା {{PLURAL:$1|ଧାଡ଼ିଟି|ଧାଡ଼ିସବà­}} ଅଚଳ ସାଧାରଣ {{PLURAL:$1|ପରିପà­à¬°à¬•à¬¾à¬¶|ପରିପà­à¬°à¬•à¬¾à¬¶}} ଓ ସାଇତିବା ଆଗରୠ{{PLURAL:$1|ତାହାକୠସà­à¬§à¬¾à¬°à¬¿à¬¬à¬¾ ଲୋଡ଼ା|ସେହିସବà­à¬•à­ ସà­à¬§à¬¾à¬°à¬¿à¬¬à¬¾ ଲୋଡ଼ା}}:',
- 'spam-blacklist-desc' => 'Regex-ଭିତà­à¬¤à¬¿à¬• ସà­à¬ªà¬¾à¬®-ବିରୋଧୀ ଉପକରଣ: [[MediaWiki:Spam-blacklist]] ଓ [[MediaWiki:Spam-whitelist]]',
+ 'spam-blacklist-desc' => 'Regex-ଭିତà­à¬¤à¬¿à¬• ସà­à¬ªà¬¾à¬®-ବିରୋଧୀ ଉପକରଣ: [[MediaWiki:Spam-blacklist]] ଓ [[MediaWiki:Spam-whitelist]]', # Fuzzy
);
/** Polish (polski)
@@ -2495,7 +2709,7 @@ $messages['pl'] = array(
'spam-blacklisted-email-text' => 'Twój adres e-mail jest obecnie umieszczony na czarnej liście i nie można z niego wysyłać wiadomości e-mail do innych użytkowników.',
'spam-blacklisted-email-signup' => 'Podany adres e-mail jest obecnie na czarnej liście blokującej przed użyciem.',
'spam-invalid-lines' => '{{PLURAL:$1|Następująca linia jest niepoprawnym wyrażeniem regularnym i musi być poprawiona przed zapisaniem strony:|Następujące linie są niepoprawnymi wyrażeniami regularnymi i muszą być poprawione przed zapisaniem strony:}}',
- 'spam-blacklist-desc' => 'Narzędzie antyspamowe oparte o wyrażenia regularne: [[MediaWiki:Spam-blacklist|spam – lista zabronionych]] oraz [[MediaWiki:Spam-whitelist|spam – lista dozwolonych]]',
+ 'spam-blacklist-desc' => 'Narzędzie antyspamowe oparte o wyrażenia regularne: [[MediaWiki:Spam-blacklist|spam – lista zabronionych]] oraz [[MediaWiki:Spam-whitelist|spam – lista dozwolonych]]', # Fuzzy
);
/** Piedmontese (Piemontèis)
@@ -2528,7 +2742,12 @@ $messages['pms'] = array(
'spam-blacklisted-email-text' => "Soa adrëssa ëd pòsta eletrònica a l'é al moment an na lista nèira për mandé dij mëssagi a j'àutri utent.",
'spam-blacklisted-email-signup' => "L'adrëssa ëd pòsta eletrònica dàita a l'é al moment an na lista nèira për l'utilisassion.",
'spam-invalid-lines' => "{{PLURAL:$1|St'|Sti}} element dla lista nèira dla rumenta ëd reclam a {{PLURAL:$1|l'é|son}} {{PLURAL:$1|n'|dj'}}espression regolar nen {{PLURAL:$1|bon-a|bon-e}} e a l'{{PLURAL:$1|ha|han}} da manca d'esse coregiùe anans che salvé la pàgina:",
- 'spam-blacklist-desc' => 'Strument anti-spam basà an dzora a Regex: [[MediaWiki:Spam-blacklist]] e [[MediaWiki:Spam-whitelist]]',
+ 'spam-blacklist-desc' => "Utiss contra la rumenta basà su dj'espression regolar ch'a permëtto ëd buté an sla lista nèira dj'adrësse an sl'Aragnà ant le pàgine e dj'adrësse ëd pòsta eletrònica për j'utent argistrà.",
+ 'log-name-spamblacklist' => 'Argistr dla lista nèira dla rumenta',
+ 'log-description-spamblacklist' => 'Costi eveniment a marco le rëspondense con la lista nèira dla rumenta.',
+ 'logentry-spamblacklist-hit' => "$1 a l'ha causà na rëspondensa con la lista nèira dla rumenta su $3 an sërcand ëd gionté $4.",
+ 'right-spamblacklistlog' => "Smon-e l'argistr dla lista nèira dla rumenta",
+ 'action-spamblacklistlog' => "vëdde l'argistr dla lista nèira dla rumenta",
);
/** Western Punjabi (پنجابی)
@@ -2554,7 +2773,7 @@ $messages['pnb'] = array(
#</pre> <!-- ایس لین نوں انج ای Ú†Ú¾ÙˆÚ‘ دیو جنج Ø§ÛŒÛ ÛÛ’ -->',
'spam-invalid-lines' => 'تھلے دتی گئی سپام کالیلسٹ {{PLURAL:$1|lلین|لیناں}} ناں منی جان والی ریگولر {{PLURAL:$1|ایکسپریشن|ایکسپریشناں}} تے {{PLURAL:$1|لوڑاں|لوڑ}} نوں ٹھیک کرنا ضروری صÙÛ Ø¨Ú†Ø§Ù† توں Ù¾ÛÙ„Û’:',
- 'spam-blacklist-desc' => 'ریجیکس تے بنیا سپام ویری اوزار: [[MediaWiki:Spam-blacklist]] تے [[MediaWiki:Spam-whitelist]]',
+ 'spam-blacklist-desc' => 'ریجیکس تے بنیا سپام ویری اوزار: [[MediaWiki:Spam-blacklist]] تے [[MediaWiki:Spam-whitelist]]', # Fuzzy
);
/** Portuguese (português)
@@ -2588,11 +2807,19 @@ $messages['pt'] = array(
#</pre> <!-- mantenha esta linha exatamente assim -->',
'spam-blacklisted-email' => 'Endereço de correio electrónico da lista negra',
+ 'spam-blacklisted-email-text' => 'Atualmente o seu endereço de e-mail está na lista negra que impede o envio de e-mails a outros utilizadores.',
+ 'spam-blacklisted-email-signup' => 'O endereço de e-mail fornecido não pode ser utilizado pois está na lista negra.',
'spam-invalid-lines' => "{{PLURAL:$1|A entrada|As entradas}} abaixo {{PLURAL:$1|é uma expressão regular|são expressões regulares}} ''(regex)'' {{PLURAL:$1|inválida e precisa|inválidas e precisam}} de ser {{PLURAL:$1|corrigida|corrigidas}} antes de gravar a página:",
- 'spam-blacklist-desc' => 'Ferramenta anti-"spam" baseada em Regex: [[MediaWiki:Spam-blacklist]] e [[MediaWiki:Spam-whitelist]]',
+ 'spam-blacklist-desc' => 'Ferramenta anti-"spam" baseada em Regex: [[MediaWiki:Spam-blacklist]] e [[MediaWiki:Spam-whitelist]]', # Fuzzy
+ 'log-name-spamblacklist' => 'Registros da lista negra de spam',
+ 'log-description-spamblacklist' => 'Estes eventos acompanham as ocorrências da lista negra de spam.',
+ 'logentry-spamblacklist-hit' => '$1 ativou a lista negra de spam em $3 ao tentar inserir $4.',
+ 'right-spamblacklistlog' => 'Ver registros da lista negra de spam',
+ 'action-spamblacklistlog' => 'ver os registos da lista negra de spam',
);
/** Brazilian Portuguese (português do Brasil)
+ * @author Cainamarques
* @author Eduardo.mps
* @author Helder.wiki
* @author Tuliouel
@@ -2656,14 +2883,26 @@ $messages['pt-br'] = array(
'spam-blacklisted-email-text' => 'O seu endereço de correio eletrônico está proibido de enviar mensagens para outros usuários.',
'spam-blacklisted-email-signup' => 'O endereço fornecido encontra-se na lista negra.',
'spam-invalid-lines' => '{{PLURAL:$1|A linha|As linhas}} a seguir {{PLURAL:$1|é uma expressão regular|são expressões regulares}} (regex) {{PLURAL:$1|inválida e precisa|inválidas e precisam}} ser {{PLURAL:$1|corrigida|corrigidas}} antes de salvar a página:',
- 'spam-blacklist-desc' => 'Ferramenta anti-"spam" baseada em Regex: [[MediaWiki:Spam-blacklist]] e [[MediaWiki:Spam-whitelist]]',
+ 'spam-blacklist-desc' => 'Ferramenta anti-spam baseada em expressões regulares que permite adicionar URLs numa lista negra, barrando-os em páginas e também em emails enviados a usuários registrados',
+ 'log-name-spamblacklist' => 'Registro da lista negra de spam',
+ 'action-spamblacklistlog' => 'ver os registros da lista negra de spam',
);
/** Romanian (română)
* @author Firilacroco
+ * @author Minisarm
*/
$messages['ro'] = array(
- 'spam-blacklisted-email' => 'Adresă de e-mail în lista neagră',
+ 'spam-blacklisted-email' => 'Adresă de e-mail inclusă în lista neagră',
+ 'spam-blacklisted-email-text' => 'Adresa dumneavoastră de e-mail este actualmente inclusă în lista neagră, neputând expedia e-mailuri altor utilizatori.',
+ 'spam-blacklisted-email-signup' => 'Adresa de e-mail specificată este actualmente inclusă în lista neagră, neputând fi utilizată.',
+ 'spam-invalid-lines' => '{{PLURAL:$1|Următorul rând|Următoarele rânduri}} din lista neagră de spam {{PLURAL:$1|este|sunt}} {{PLURAL:$1|o expresie regulată invalidă|expresii regulate invalide}} și trebuie {{PLURAL:$1|corectat|corectate}} înainte de a salva pagina:',
+ 'spam-blacklist-desc' => 'Unealtă antispam bazată pe regex care permite includerea adreselor URL introduse în pagini și a adreselor de e-mail ale utilizatorilor înregistrați în lista neagră',
+ 'log-name-spamblacklist' => 'Jurnal listă neagră spam',
+ 'log-description-spamblacklist' => 'Aceste evenimente urmăresc declanșarea listei negre de spam.',
+ 'logentry-spamblacklist-hit' => '$1 a provocat declanșarea listei negre de spam în pagina $3, încercând să adauge $4.',
+ 'right-spamblacklistlog' => 'Vizualizează jurnalul listei negre de spam',
+ 'action-spamblacklistlog' => 'vizualizați jurnalul listei negre de spam',
);
/** tarandíne (tarandíne)
@@ -2713,7 +2952,12 @@ $messages['roa-tara'] = array(
'spam-blacklisted-email-text' => "L'indirizze email tune jè mo jndr'à lista gnore pe mannà email a otre utinde.",
'spam-blacklisted-email-signup' => "L'indirizze email ca è date pe mò ste jndr'à lista gnore.",
'spam-invalid-lines' => "{{PLURAL:$1|'A seguende linèe d'a blacklist de spam jè|Le seguende linèe d'a blacklist de spam sonde}} {{PLURAL:$1|espressione|espressiune}} regolare invalide e {{PLURAL:$1|abbesogne|abbesognane}} de avenè corrette apprime de reggistrà 'a pàgene:",
- 'spam-blacklist-desc' => "'U strumende andi-spam basate sus a le regex: [[MediaWiki:Spam-blacklist]] e [[MediaWiki:Spam-whitelist]]",
+ 'spam-blacklist-desc' => "'U strumende andi-spam basate sus a le regex ca dèje le URL de le pàggene de l'elenghe gnure e le indirizze email de le utinde reggistrate",
+ 'log-name-spamblacklist' => "Archivije de l'elenghe gnure de le rummate",
+ 'log-description-spamblacklist' => "Ste evende tracciane le trasute jndr'à l'elenghe gnure de le rummate.",
+ 'logentry-spamblacklist-hit' => "$1 ave fatte 'na trasute jndr'à l'elenghe gnure de le rummate sus a $3 pruvanne a aggiungere $4.",
+ 'right-spamblacklistlog' => "'Ndruche l'archivije de l'elenghe gnure de le rummate",
+ 'action-spamblacklistlog' => "'ndruche l'archivije de l'elenghe gnure d'u rummate",
);
/** Russian (руÑÑкий)
@@ -2721,6 +2965,8 @@ $messages['roa-tara'] = array(
* @author Express2000
* @author HalanTul
* @author Kaganer
+ * @author NBS
+ * @author Okras
* @author ÐлекÑандр Сигачёв
*/
$messages['ru'] = array(
@@ -2764,7 +3010,12 @@ $messages['ru'] = array(
'spam-blacklisted-email-text' => 'Ваш Ð°Ð´Ñ€ÐµÑ Ñлектронной почты в наÑтоÑщее Ð²Ñ€ÐµÐ¼Ñ Ð½Ð°Ñ…Ð¾Ð´Ð¸Ñ‚ÑÑ Ð² чёрном ÑпиÑке, поÑтому вы не можете отправлÑÑ‚ÑŒ ÑÐ¾Ð¾Ð±Ñ‰ÐµÐ½Ð¸Ñ Ð´Ñ€ÑƒÐ³Ð¸Ð¼ пользователÑм.',
'spam-blacklisted-email-signup' => 'Указанный Ð°Ð´Ñ€ÐµÑ Ñлектронной почты в наÑтоÑщее Ð²Ñ€ÐµÐ¼Ñ Ð·Ð°Ð½ÐµÑён в чёрный ÑпиÑок и не может быть иÑпользован.',
'spam-invalid-lines' => '{{PLURAL:$1|Ð¡Ð»ÐµÐ´ÑƒÑŽÑ‰Ð°Ñ Ñтрока чёрного ÑпиÑка ÑÑылок Ñодержит ошибочное регулÑрное выражение и должна быть иÑправлена|Следующие Ñтроки чёрного ÑпиÑка ÑÑылок Ñодержат ошибочные регулÑрные Ð²Ñ‹Ñ€Ð°Ð¶ÐµÐ½Ð¸Ñ Ð¸ должны быть иÑправлены}} перед Ñохранением:',
- 'spam-blacklist-desc' => 'ОÑнованный на регулÑрных выражениÑÑ… анти-Ñпам инÑтрумент: [[MediaWiki:Spam-blacklist]] и [[MediaWiki:Spam-whitelist]]',
+ 'spam-blacklist-desc' => 'ОÑнованный на регулÑрных выражениÑÑ… анти-Ñпам инÑтрумент позволÑет добавлÑÑ‚ÑŒ в чёрный ÑпиÑок URL на Ñтраницах и адреÑа Ñлектронной почты Ð´Ð»Ñ Ð·Ð°Ñ€ÐµÐ³Ð¸Ñтрированных пользователей',
+ 'log-name-spamblacklist' => 'Журнал Ñпам-лиÑта',
+ 'log-description-spamblacklist' => 'Это журнал, отÑлеживающий Ñрабатывание Ñпам-лиÑта.',
+ 'logentry-spamblacklist-hit' => '$1 вызвал Ñрабатывание Ñпам-лиÑта на Ñтранице $3 из-за попытки добавить $4.',
+ 'right-spamblacklistlog' => 'ПроÑмотр журнала чёрного ÑпиÑка по Ñпаму',
+ 'action-spamblacklistlog' => 'проÑмотр журнала чёрного ÑпиÑка по Ñпаму',
);
/** Rusyn (руÑиньÑкый)
@@ -2812,7 +3063,7 @@ $messages['rue'] = array(
'spam-blacklisted-email-text' => 'Ваша імейлова адреÑа Ñ” моментално уведжена на чорнім ÑпиÑку, та же другым хоÑнователÑм не можете поÑлати імейл.',
'spam-blacklisted-email-signup' => 'Уведжена імейлова адреÑа Ñ” моментално на чорнім ÑпиÑку.',
'spam-invalid-lines' => 'Ðа чорній лиÑтинї Ñпаму {{PLURAL:$1|Ñ” наÑтупный Ñ€Ñдок неправилный реґуларный выраз|Ñуть наÑтупны Ñ€Ñдкы неправилны реґуларны выразы|Ñуть наÑтупны Ñ€Ñдкы неправилны реґуларны выразы}} Ñ– Ñ” треба {{PLURAL:$1|го|Ñ—Ñ…|Ñ—Ñ…}} перед уложінём Ñторінкы Ñправити:',
- 'spam-blacklist-desc' => 'ÐнтіÑпамовый інштрумент на базї реґуларных выразів: [[MediaWiki:Spam-blacklist]] Ñ– [[MediaWiki:Spam-whitelist]]',
+ 'spam-blacklist-desc' => 'ÐнтіÑпамовый інштрумент на базї реґуларных выразів: [[MediaWiki:Spam-blacklist]] Ñ– [[MediaWiki:Spam-whitelist]]', # Fuzzy
);
/** Sanskrit (संसà¥à¤•à¥ƒà¤¤à¤®à¥)
@@ -2854,7 +3105,7 @@ $messages['sa'] = array(
'spam-blacklisted-email-text' => 'भवतः ईपतà¥à¤°à¤¸à¤™à¥à¤•à¥‡à¤¤à¤ƒ समà¥à¤ªà¥à¤°à¤¤à¤¿ निनà¥à¤¦à¥à¤¯à¤¸à¤™à¥à¤•à¥‡à¤¤à¤¾à¤¨à¤¾à¤®à¥ आवलà¥à¤¯à¤¾à¤‚ पà¥à¤°à¤µà¥‡à¤¶à¤¿à¤¤à¤ƒ । अतः अनà¥à¤¯à¥‡à¤­à¥à¤¯à¤ƒ योजकेभà¥à¤¯à¤ƒ ईपतà¥à¤°à¤ªà¥à¤°à¥‡à¤·à¤£à¤‚ नानà¥à¤®à¤¨à¥à¤¯à¤¤à¥‡ ।',
'spam-blacklisted-email-signup' => 'पà¥à¤°à¤¦à¤¤à¥à¤¤à¤ƒ निनà¥à¤¦à¥à¤¯à¤ƒ ईपतà¥à¤°à¤¸à¤™à¥à¤•à¥‡à¤¤à¤ƒ समà¥à¤ªà¥à¤°à¤¤à¤¿ उपयोगे नासà¥à¤¤à¤¿ ।',
'spam-invalid-lines' => 'अधोनिरà¥à¤¦à¤¿à¤·à¥à¤Ÿà¤¾à¤ƒ अनिषà¥à¤Ÿà¤¸à¤¨à¥à¤¦à¥‡à¤¶à¤¦à¥à¤°à¥à¤µà¥ƒà¤¤à¥à¤¤à¤¯à¤ƒ {{PLURAL:$1|पंकà¥à¤¤à¤¿à¤ƒ|पंकà¥à¤¤à¤¿à¤¯à¤ƒ}} अमानà¥à¤¯à¤¾à¤ƒ नियताः {{PLURAL:$1|अभिवà¥à¤¯à¤•à¥à¤¤à¤¿à¤ƒ असà¥à¤¤à¤¿|अभिवà¥à¤¯à¤•à¥à¤¤à¤¯à¤ƒ सनà¥à¤¤à¤¿}} अतः पृषà¥à¤ à¤°à¤•à¥à¤·à¤£à¤¾à¤¤à¥ पूरà¥à¤µà¤‚ तेषां परिषà¥à¤•à¤¾à¤°à¤ƒ अवशà¥à¤¯à¤‚ करà¥à¤¤à¤µà¥à¤¯à¤¾à¤ƒ :',
- 'spam-blacklist-desc' => 'रेजेकà¥à¤¸à¥-आधारितमॠअनिषà¥à¤Ÿà¤¸à¤¨à¥à¤¦à¥‡à¤¶à¤µà¤¿à¤°à¥‹à¤§à¤¿ उपकरणमà¥: [[MediaWiki:Spam-blacklist]] [[MediaWiki:Spam-whitelist]] च',
+ 'spam-blacklist-desc' => 'रेजेकà¥à¤¸à¥-आधारितमॠअनिषà¥à¤Ÿà¤¸à¤¨à¥à¤¦à¥‡à¤¶à¤µà¤¿à¤°à¥‹à¤§à¤¿ उपकरणमà¥: [[MediaWiki:Spam-blacklist]] [[MediaWiki:Spam-whitelist]] च', # Fuzzy
);
/** Sakha (Ñаха тыла)
@@ -2880,7 +3131,7 @@ $messages['sah'] = array(
#</pre> <!-- бу Ñтроканы уларытыма -->',
'spam-invalid-lines' => 'Хара иÑпииһÑк манна көрдөрүллүбүт {{PLURAL:$1|Ñтрокаата Ñыыһалаах|Ñтрокаалара Ñыыһалаахтар}}, уларытыах Ð¸Ð½Ð½Ð¸Ð½Ñ Ð¾Ð» көннөрүллүөхтÑÑÑ…:',
- 'spam-blacklist-desc' => 'Ðнти-Ñпам Ò¯ÑтүрүмүөнÑ: [[MediaWiki:Spam-blacklist]] уонна [[MediaWiki:Spam-whitelist]]',
+ 'spam-blacklist-desc' => 'Ðнти-Ñпам Ò¯ÑтүрүмүөнÑ: [[MediaWiki:Spam-blacklist]] уонна [[MediaWiki:Spam-whitelist]]', # Fuzzy
);
/** Sicilian (sicilianu)
@@ -2905,7 +3156,7 @@ $messages['scn'] = array(
#</pre> <!-- non mudificari nta nudda manera sta riga -->',
'spam-invalid-lines' => '{{PLURAL:$1|La riga di sècutu|Li righi di sècutu}} di la blacklist dô spam {{PLURAL:$1|nun è na sprissioni riulari boni|nun sunnu sprissioni riulari boni}}; currèggiri {{PLURAL:$1|lu sbagghiu|li sbagghi}} prima di sarvari la pàggina.',
- 'spam-blacklist-desc' => 'Strumentu antispam basatu supra li sprissioni riulari [[MediaWiki:Spam-blacklist]] e [[MediaWiki:Spam-whitelist]]',
+ 'spam-blacklist-desc' => 'Strumentu antispam basatu supra li sprissioni riulari [[MediaWiki:Spam-blacklist]] e [[MediaWiki:Spam-whitelist]]', # Fuzzy
);
/** Sinhala (සිංහල)
@@ -2934,7 +3185,7 @@ $messages['si'] = array(
#</pre> <!-- leave this line exactly as it is -->',
'spam-blacklisted-email' => 'අපලේඛනගත විද්â€à¶ºà·”ත්-තà·à¶´à·à¶½à·Š ලිපින',
'spam-invalid-lines' => 'පහත දà·à¶šà·Šà·€à·™à¶± කළු ලයිස්තු {{PLURAL:$1|පේලිය|පේලි}} à·€à·à¶»à¶¯à·’ regular {{PLURAL:$1|expression|expressions}} වන අතර, පිටුව සුරà·à¶šà·“මට පෙර නිවà·à¶»à¶¯à·’ කළ යුතුය:',
- 'spam-blacklist-desc' => 'Regex-පà·à¶¯à¶š ප්â€à¶»à¶­à·’-ස්පෑම ආවුදය: [[MediaWiki:Spam-blacklist]] සහ [[MediaWiki:Spam-whitelist]]',
+ 'spam-blacklist-desc' => 'Regex-පà·à¶¯à¶š ප්â€à¶»à¶­à·’-ස්පෑම ආවුදය: [[MediaWiki:Spam-blacklist]] සහ [[MediaWiki:Spam-whitelist]]', # Fuzzy
);
/** Slovak (slovenÄina)
@@ -2961,7 +3212,7 @@ $messages['sk'] = array(
#</pre> <!-- leave this line exactly as it is -->',
'spam-invalid-lines' => '{{PLURAL:$1|Nasledovný riadok|Nasledovné riadky}} Äiernej listiny spamu {{PLURAL:$1|je neplatný regulárny výraz|sú neplatné regulárne výrazy}} a je potrebné {{PLURAL:$1|ho|ich}} opraviÅ¥ pred uložením stránky:',
- 'spam-blacklist-desc' => 'Antispamový nástroj na základe regulárnych výrazov: [[MediaWiki:Spam-blacklist|Čierna listina]] a [[MediaWiki:Spam-whitelist|Biela listina]]',
+ 'spam-blacklist-desc' => 'Antispamový nástroj na základe regulárnych výrazov: [[MediaWiki:Spam-blacklist|Čierna listina]] a [[MediaWiki:Spam-whitelist|Biela listina]]', # Fuzzy
);
/** Slovenian (slovenÅ¡Äina)
@@ -3011,7 +3262,12 @@ $messages['sl'] = array(
'spam-blacklisted-email-text' => 'VaÅ¡ e-poÅ¡tni naslov je trenutno na Ärnem seznamu, zato ne morete poÅ¡iljati poÅ¡te drugim uporabnikom.',
'spam-blacklisted-email-signup' => 'E-poÅ¡tni naslov je trenutno na Ärnem seznamu.',
'spam-invalid-lines' => '{{PLURAL:$1|Naslednja vrstica|Naslednji vrstici|Naslednje vrstice}} Ärnega seznama smetja {{PLURAL:$1|je neveljavni regularni izraz in ga|sta neveljavna regularna izraza in ju|so neveljavni regularni izrazi in jih}} je pred shranjevanjem strani potrebno popraviti:',
- 'spam-blacklist-desc' => 'Orodje proti smetju, temeljeÄe na regularnih izrazih: [[MediaWiki:Spam-blacklist]] in [[MediaWiki:Spam-whitelist]]',
+ 'spam-blacklist-desc' => 'Orodje proti smetju, temeljeÄe na regularnih izrazih, ki omogoÄa navedbo spletnih naslovov na straneh in v e-poÅ¡tnih naslovih za registrirane uporabnike na Ärnem seznamu',
+ 'log-name-spamblacklist' => 'Dnevnik Ärnega seznama smetja',
+ 'log-description-spamblacklist' => 'Ti dogodki sledijo zadetke Ärnega seznama smetja.',
+ 'logentry-spamblacklist-hit' => '$1 je povzroÄil zadetek na Ärnem seznamu smetja na strani $3 ob dodajanju povezave $4',
+ 'right-spamblacklistlog' => 'Prikaz dnevnika Ärnega seznama smetja',
+ 'action-spamblacklistlog' => 'ogled dnevnika s Ärnim seznamom smetja',
);
/** Albanian (shqip)
@@ -3042,21 +3298,21 @@ $messages['sq'] = array(
'spam-blacklisted-email-text' => 'E-mail adresa juaj është për momentin në penguar nga dërgimi i e-mailave tek përdoruesit e tjerë.',
'spam-blacklisted-email-signup' => 'E-mail adresa e dhënë për momentin është ndaluuar nga përdorimi',
'spam-invalid-lines' => 'Lista e zezë e mëposhtme spam {{PLURAL:$1|rreshti është një|rreshtat janë}} {{PLURAL:$1|shprehje|shprehje}} të rregullta të pavlefshme dhe {{PLURAL:$1|nevojitet|nevojitet}} të korrigjohen përpara ruajtjes së faqes:',
- 'spam-blacklist-desc' => 'Mjeti anti-spam regex i bazuar: [[MediaWiki:Spam-blacklist]] dhe [[MediaWiki:Spam-whitelist]]',
+ 'spam-blacklist-desc' => 'Mjeti anti-spam regex i bazuar: [[MediaWiki:Spam-blacklist]] dhe [[MediaWiki:Spam-whitelist]]', # Fuzzy
);
/** Serbian (Cyrillic script) (ÑрпÑки (ћирилица)‎)
* @author Millosh
*/
$messages['sr-ec'] = array(
- 'spam-blacklist-desc' => 'ÐнтиÑпам оруђе заÑновано на регуларним изразима: [[MediaWiki:Spam-blacklist]] и [[MediaWiki:Spam-whitelist]]',
+ 'spam-blacklist-desc' => 'ÐнтиÑпам оруђе заÑновано на регуларним изразима: [[MediaWiki:Spam-blacklist]] и [[MediaWiki:Spam-whitelist]]', # Fuzzy
);
/** Serbian (Latin script) (srpski (latinica)‎)
* @author Michaello
*/
$messages['sr-el'] = array(
- 'spam-blacklist-desc' => 'Antispam oruđe zasnovano na regularnim izrazima: [[MediaWiki:Spam-blacklist]] i [[MediaWiki:Spam-whitelist]]',
+ 'spam-blacklist-desc' => 'Antispam oruđe zasnovano na regularnim izrazima: [[MediaWiki:Spam-blacklist]] i [[MediaWiki:Spam-whitelist]]', # Fuzzy
);
/** Seeltersk (Seeltersk)
@@ -3085,19 +3341,21 @@ $messages['stq'] = array(
'spam-invalid-lines' => '{{PLURAL:$1
| Ju foulgjende Siede in ju Spam-Blacklist is n uungultigen regulären Uutdruk. Ju mout foar dät Spiekerjen fon ju Siede korrigierd wäide
| Do foulgjende Sieden in ju Spam-Blacklist sunt uungultige reguläre Uutdrukke. Do mouten foar dät Spiekerjen fon ju Siede korrigierd wäide}}:',
- 'spam-blacklist-desc' => 'Regex-basierde Anti-Spam-Reewe: [[MediaWiki:Spam-blacklist]] un [[MediaWiki:Spam-whitelist]]',
+ 'spam-blacklist-desc' => 'Regex-basierde Anti-Spam-Reewe: [[MediaWiki:Spam-blacklist]] un [[MediaWiki:Spam-whitelist]]', # Fuzzy
);
/** Swedish (svenska)
+ * @author Ainali
* @author Lejonel
+ * @author Lokal Profil
+ * @author Skalman
* @author WikiPhoenix
*/
$messages['sv'] = array(
- 'spam-blacklist' => '
- # Den här listan stoppar matchande externa URL:er från att läggas till på sidor.
- # Listan påverkar bara den här wikin; se även den globala svarta listan för spam.
- # För dokumentation se https://www.mediawiki.org/wiki/Extension:SpamBlacklist
- #<!-- ändra inte den här raden --> <pre>
+ 'spam-blacklist' => ' #<!-- ändra inte den här raden --> <pre>
+# Den här listan stoppar matchande externa URL:er från att läggas till på sidor.
+# Listan påverkar bara den här wikin; se även den globala svartlistan.
+# För dokumentation se https://www.mediawiki.org/wiki/Extension:SpamBlacklist
#
# Syntaxen är följande:
# * All text från ett #-tecken till radens slut är en kommentar
@@ -3114,9 +3372,33 @@ $messages['sv'] = array(
# * Alla icke-tomma rader används som reguljära uttryck för att matcha domännamn i URL:er
#</pre> <!-- ändra inte den här raden -->',
+ 'email-blacklist' => ' #<!-- ändra inte den här raden --> <pre>
+# E-postadresser som matchar den här listan kommer att hindras att registrera och skicka e-post
+# Denna lista gäller endast denna wiki; se även den globala svartlistan.
+# För dokumentation se https://www.mediawiki.org/wiki/Extension:SpamBlacklist
+#
+# Syntaxen är följande:
+# * Allt från ett "#"-tecken till slutet av raden är en kommentar
+# * Varje icke-tom rad är ett regex-fragment som endast kommer att matcha värdnamn i e-postadresser
+ #</pre> <!-- ändra inte den här raden -->',
+ 'email-whitelist' => ' #<!-- ändra inte den här raden --> <pre>
+# E-postadresser som matchar den här listan kommer *inte* att blockeras, även om de skulle ha blivit blockerade av svartlistan.
+#
+# Syntaxen är följande:
+# * Allt från ett "#"-tecken till slutet av raden är en kommentar
+# * Varje icke-tom rad är ett regex-fragment som endast kommer att matcha värdnamn i e-postadresser
+
+ #</pre> <!-- ändra inte den här raden -->',
'spam-blacklisted-email' => 'Svartlistad e-postadress',
+ 'spam-blacklisted-email-text' => 'Din e-postadress är för närvarande svartlistad från att skicka e-post till andra användare.',
+ 'spam-blacklisted-email-signup' => 'Den angivna e-postadressen är förnärvarande svartlistad från användning.',
'spam-invalid-lines' => 'Följande {{PLURAL:$1|rad|rader}} i svarta listan för spam innehåller inte något giltigt reguljärt uttryck och måste rättas innan sidan sparas:',
- 'spam-blacklist-desc' => 'Antispamverktyg baserat på reguljära uttryck: [[MediaWiki:Spam-blacklist]] och [[MediaWiki:Spam-whitelist]]',
+ 'spam-blacklist-desc' => 'Antispamverktyg baserat på reguljära uttryck som gör det möjligt att svartlista webbadresser på sidor och e-postadresser för registrerade användare',
+ 'log-name-spamblacklist' => 'Svartlistningslogg för spam',
+ 'log-description-spamblacklist' => 'Dessa händelser spårar träffar is svartlistningsloggen för spam.',
+ 'logentry-spamblacklist-hit' => '$1 orsakade en träff i svartlistningsloggen för spam på $3 genom att försöka lägga till $4.',
+ 'right-spamblacklistlog' => 'Visa svartlistningslogg för spam',
+ 'action-spamblacklistlog' => 'visa svartlistningsloggen för spam',
);
/** Tamil (தமிழà¯)
@@ -3155,7 +3437,7 @@ $messages['te'] = array(
#</pre> <!-- leave this line exactly as it is -->',
'spam-invalid-lines' => 'à°¸à±à°ªà°¾à°®à± నిరోధపౠజాబితాలోని à°•à±à°°à°¿à°‚à°¦ పేరà±à°•à±Šà°¨à±à°¨ {{PLURAL:$1|లైనà±|లైనà±à°²à±}} తపà±à°ªà±à°—à°¾ {{PLURAL:$1|ఉంది|ఉనà±à°¨à°¾à°¯à°¿}}, పేజీని à°­à°¦à±à°°à°ªà°°à°¿à°šà±‡à°®à±à°‚దౠ{{PLURAL:$1|దానà±à°¨à°¿|వాటిని}} సరిదిదà±à°¦à°‚à°¡à°¿:',
- 'spam-blacklist-desc' => 'Regex-ఆధారిత à°¸à±à°ªà°¾à°®à± నిరోధక పనిమà±à°Ÿà±à°Ÿà±: [[MediaWiki:Spam-blacklist]] మరియౠ[[MediaWiki:Spam-whitelist]]',
+ 'spam-blacklist-desc' => 'Regex-ఆధారిత à°¸à±à°ªà°¾à°®à± నిరోధక పనిమà±à°Ÿà±à°Ÿà±: [[MediaWiki:Spam-blacklist]] మరియౠ[[MediaWiki:Spam-whitelist]]', # Fuzzy
);
/** Tajik (Cyrillic script) (тоҷикӣ)
@@ -3184,7 +3466,7 @@ $messages['tg-cyrl'] = array(
# нишонии интернетии URL мутобиқат дода мешавад
#</pre> <!-- ин Ñатрро ҳамонгуна, ки ҳаÑÑ‚ раҳо кунед -->',
'spam-invalid-lines' => '{{PLURAL:$1|Сатри|Сатрҳои}} зерин дар феҳриÑти Ñиёҳи ҳарзнигорӣ даÑтуроти ғайри миҷозе regular expressions {{PLURAL:$1|аÑÑ‚|ҳаÑтанд}} ва қабл аз захира кардани Ñаҳифа ба иÑлоҳ кардан ниёз {{PLURAL:$1|дорад|доранд}}:',
- 'spam-blacklist-desc' => 'Ðбзори зидди ҳарзнигорӣ дар аÑоÑи Regex: [[MediaWiki:Spam-blacklist]] ва [[MediaWiki:Spam-whitelist]]',
+ 'spam-blacklist-desc' => 'Ðбзори зидди ҳарзнигорӣ дар аÑоÑи Regex: [[MediaWiki:Spam-blacklist]] ва [[MediaWiki:Spam-whitelist]]', # Fuzzy
);
/** Tajik (Latin script) (tojikī)
@@ -3213,7 +3495,7 @@ $messages['tg-latn'] = array(
# niÅŸoniji internetiji URL mutobiqat doda meÅŸavad
#</pre> <!-- in satrro hamonguna, ki hast raho kuned -->',
'spam-invalid-lines' => '{{PLURAL:$1|Satri|Satrhoi}} zerin dar fehristi sijohi harznigorī dasturoti ƣajri miçoze regular expressions {{PLURAL:$1|ast|hastand}} va qabl az zaxira kardani sahifa ba isloh kardan nijoz {{PLURAL:$1|dorad|dorand}}:',
- 'spam-blacklist-desc' => 'Abzori ziddi harznigorī dar asosi Regex: [[MediaWiki:Spam-blacklist]] va [[MediaWiki:Spam-whitelist]]',
+ 'spam-blacklist-desc' => 'Abzori ziddi harznigorī dar asosi Regex: [[MediaWiki:Spam-blacklist]] va [[MediaWiki:Spam-whitelist]]', # Fuzzy
);
/** Turkmen (Türkmençe)
@@ -3221,7 +3503,7 @@ $messages['tg-latn'] = array(
*/
$messages['tk'] = array(
'spam-invalid-lines' => 'Aşakdaky spam gara sanawynyň {{PLURAL:$1|setiri|setiri}} nädogry regulýar {{PLURAL:$1|aňlatmadyr|aňlatmadyr}} we sahypa ýazdyrylmanka düzedilmelidir:',
- 'spam-blacklist-desc' => 'Regulýar aňlatmalar esasynda anti-spam guraly: [[MediaWiki:Spam-blacklist]] we [[MediaWiki:Spam-whitelist]]',
+ 'spam-blacklist-desc' => 'Regulýar aňlatmalar esasynda anti-spam guraly: [[MediaWiki:Spam-blacklist]] we [[MediaWiki:Spam-whitelist]]', # Fuzzy
);
/** Tagalog (Tagalog)
@@ -3269,7 +3551,7 @@ $messages['tl'] = array(
'spam-blacklisted-email-text' => 'Kasalukuyang pinagbabawalan ang iyong tirahan ng e-liham na makapagpadala ng mga e-liham papunta sa ibang mga tagagamit.',
'spam-blacklisted-email-signup' => 'Kasalukuyang ipinagbabawal ang paggamit ng ibinigay na tirahan ng e-liham.',
'spam-invalid-lines' => 'Ang sumusunod na {{PLURAL:$1|isang hanay/guhit|mga hanay/guhit}} ng talaan ng pinagbabawalang "manlulusob" (\'\'spam\'\') ay hindi tanggap na karaniwang {{PLURAL:$1|pagsasaad|mga pagsasaad}} at {{PLURAL:$1|kinakailangang|kinakailangang}} maitama muna bago sagipin ang pahina:',
- 'spam-blacklist-desc' => "Kasangkapang panlaban sa \"manlulusob\" (''spam'') na nakabatay sa karaniwang pagsasaad (''regex''): [[MediaWiki:Spam-blacklist]] at [[MediaWiki:Spam-whitelist]]",
+ 'spam-blacklist-desc' => "Kasangkapang panlaban sa \"manlulusob\" (''spam'') na nakabatay sa karaniwang pagsasaad (''regex''): [[MediaWiki:Spam-blacklist]] at [[MediaWiki:Spam-whitelist]]", # Fuzzy
);
/** Turkish (Türkçe)
@@ -3296,12 +3578,13 @@ $messages['tr'] = array(
#</pre> <!--bu satırı olduğu gibi bırakın -->',
'spam-invalid-lines' => 'Şu spam karaliste {{PLURAL:$1|satırı|satırları}} geçersiz düzenli {{PLURAL:$1|tanımdır|tanımlardır}} ve sayfayı kaydetmeden düzeltilmesi gerekmektedir:',
- 'spam-blacklist-desc' => 'Regex-tabanlı anti-spam aracı: [[MediaWiki:Spam-blacklist]] ve [[MediaWiki:Spam-whitelist]]',
+ 'spam-blacklist-desc' => 'Regex-tabanlı anti-spam aracı: [[MediaWiki:Spam-blacklist]] ve [[MediaWiki:Spam-whitelist]]', # Fuzzy
);
/** Ukrainian (українÑька)
* @author AS
* @author Ahonc
+ * @author Andriykopanytsia
* @author AtUkr
* @author Base
* @author Ðта
@@ -3347,7 +3630,12 @@ $messages['uk'] = array(
'spam-blacklisted-email-text' => 'Ваша адреÑа електронної пошти в даний Ñ‡Ð°Ñ Ð·Ð½Ð°Ñ…Ð¾Ð´Ð¸Ñ‚ÑŒÑÑ Ð² чорному ÑпиÑку, тому ви не можете надÑилати Ð¿Ð¾Ð²Ñ–Ð´Ð¾Ð¼Ð»ÐµÐ½Ð½Ñ Ñ–Ð½ÑˆÐ¸Ð¼ кориÑтувачам.',
'spam-blacklisted-email-signup' => 'Вказана Вами адреÑа електронної пошти наразі занеÑена до чорного ÑпиÑку Ñ– не може бути викориÑтаною.',
'spam-invalid-lines' => '{{PLURAL:$1|ÐаÑтупний Ñ€Ñдок із чорного ÑпиÑку поÑилань міÑтить помилковий регулÑрний вираз Ñ– його треба виправити|ÐаÑтупні Ñ€Ñдки із чорного ÑпиÑку поÑилань міÑÑ‚ÑÑ‚ÑŒ помилкові регулÑрні вирази Ñ– Ñ—Ñ… треба виправити}} перед збереженнÑм:',
- 'spam-blacklist-desc' => 'ПротиÑпамовий заÑіб, що базуєтьÑÑ Ð½Ð° регулÑрних виразах: [[MediaWiki:Spam-blacklist]] та [[MediaWiki:Spam-whitelist]]',
+ 'spam-blacklist-desc' => 'ЗаÑновану на регулÑрних виразах антиÑпам інÑтрумент, Ñкий дозволÑÑ” кидати у чорний ÑпиÑок URL Ñторінки Ñ– адреÑи електронної пошти Ð´Ð»Ñ Ð·Ð°Ñ€ÐµÑ”Ñтрованих кориÑтувачів',
+ 'log-name-spamblacklist' => 'Журнал чорного ÑпиÑку Ñпамерів',
+ 'log-description-spamblacklist' => 'Ці події відÑтежують потраплÑÐ½Ð½Ñ Ñƒ чорний ÑпиÑок Ñпамерів.',
+ 'logentry-spamblacklist-hit' => '$1 Ñпричинив потраплÑÐ½Ð½Ñ Ñƒ чорний ÑпиÑок Ñпамерів на $3, намагаючиÑÑŒ додати $4.',
+ 'right-spamblacklistlog' => 'ПереглÑд журналу чорного ÑпиÑку Ñпамерів',
+ 'action-spamblacklistlog' => 'переглÑд журналу "чорний ÑпиÑок" Ñпамерів',
);
/** vèneto (vèneto)
@@ -3392,7 +3680,7 @@ $messages['vec'] = array(
'spam-blacklisted-email-text' => "El to indiriso de posta eletronega el xe atualmente inte Å‚a lista nera par 'l invio de e-mail verso altri utenti.",
'spam-blacklisted-email-signup' => 'El indiriso de posta eletronega indicà el xe atualmente inte ła lista nera.',
'spam-invalid-lines' => "{{PLURAL:$1|La seguente riga|Le seguenti righe}} de la lista nera del spam {{PLURAL:$1|no la xe na espression regolare valida|no le xe espressioni regolari valide}}; se prega de corègiar {{PLURAL:$1|l'eror|i erori}} prima de salvar la pagina.",
- 'spam-blacklist-desc' => 'Strumento antispam basà su le espressioni regolari [[MediaWiki:Spam-blacklist]] e [[MediaWiki:Spam-whitelist]]',
+ 'spam-blacklist-desc' => 'Strumento antispam basà su le espressioni regolari [[MediaWiki:Spam-blacklist]] e [[MediaWiki:Spam-whitelist]]', # Fuzzy
);
/** Vietnamese (Tiếng Việt)
@@ -3417,7 +3705,7 @@ $messages['vi'] = array(
# * Các dòng không để trống là một mảnh biểu thức chính quy, nó chỉ trùng với tên máy chủ trong địa chỉ URL.
#</pre> <!-- leave this line exactly as it is -->',
- 'email-blacklist' => ' # Các địa chỉ thư điện tử trùng với danh sách này bị cấm không được đăng ký hoặc gửi thư điện tử.
+ 'email-blacklist' => ' # Các địa chỉ thư điện tử trùng với danh sách này bị cấm không được mở tài khoản hoặc gửi thư điện tử.
# Danh sách này chỉ có hiệu lá»±c ở wiki này; hãy xem thêm “danh sách Ä‘en toàn cầuâ€.
# Có tài liệu hướng dẫn tại https://www.mediawiki.org/wiki/Extension:SpamBlacklist
#<!-- leave this line exactly as it is --> <pre>
@@ -3438,7 +3726,19 @@ $messages['vi'] = array(
'spam-blacklisted-email-text' => 'Äịa chỉ thÆ° Ä‘iện tá»­ của bạn đã được Ä‘Æ°a vào danh sách Ä‘en nên bị cấm không được gá»­i thÆ° Ä‘iện tá»­ cho ngÆ°á»i dùng khác.',
'spam-blacklisted-email-signup' => 'Äịa chỉ thÆ° Ä‘iện tá»­ được cung cấp đã được Ä‘Æ°a vào danh sách Ä‘en nên bị cấm không được sá»­ dụng.',
'spam-invalid-lines' => '{{PLURAL:$1|Dòng|Những dòng}} sau đây trong danh sách đen vỠspam không hợp lệ; xin hãy sửa chữa {{PLURAL:$1|nó|chúng}} để tuân theo cú pháp biểu thức chính quy trước khi lưu trang:',
- 'spam-blacklist-desc' => 'Công cụ dùng biểu thức chính quy để chống spam: [[MediaWiki:Spam-blacklist]] và [[MediaWiki:Spam-whitelist]]',
+ 'spam-blacklist-desc' => 'Công cụ cho phép chống spam bằng cách cấm những URL trong trang và địa chỉ thư điện tử của thành viên đăng ký khớp với các biểu thức chính quy trong danh sách đen',
+ 'log-name-spamblacklist' => 'Nhật trình chặn spam vì danh sách đen',
+ 'log-description-spamblacklist' => 'Nhật trình này ghi các lần chặn spam vì nằm vào danh sách đen.',
+ 'logentry-spamblacklist-hit' => '$1 bị danh sách đen chống spam ngăn không được thêm $4 vào $3',
+ 'right-spamblacklistlog' => 'Xem nhật trình chặn spam vì danh sách đen',
+ 'action-spamblacklistlog' => 'xem nhật trình chặn spam vì danh sách đen',
+);
+
+/** Wu (å´è¯­)
+ * @author å弌
+ */
+$messages['wuu'] = array(
+ 'log-name-spamblacklist' => '垃圾電郵黑å單日誌',
);
/** Cantonese (粵語)
@@ -3464,12 +3764,14 @@ $messages['yue'] = array(
#</pre> <!-- 請完全噉留番呢行 -->',
'spam-invalid-lines' => '下é¢éŸ¿çŒæ°´é»‘å單嘅{{PLURAL:$1|一行|多行}}有無效嘅表示å¼ï¼Œè«‹éŸ¿ä¿å­˜å‘¢ç‰ˆä¹‹å‰å…ˆå°‡{{PLURAL:$1|ä½¢|佢哋}}修正:',
- 'spam-blacklist-desc' => '以正è¦è¡¨é”å¼ç‚ºæœ¬å˜…防çŒæ°´å·¥å…·: [[MediaWiki:Spam-blacklist]] åŒ [[MediaWiki:Spam-whitelist]]',
+ 'spam-blacklist-desc' => '以正è¦è¡¨é”å¼ç‚ºæœ¬å˜…防çŒæ°´å·¥å…·: [[MediaWiki:Spam-blacklist]] åŒ [[MediaWiki:Spam-whitelist]]', # Fuzzy
);
/** Simplified Chinese (中文(简体)‎)
* @author Hzy980512
+ * @author Liangent
* @author Linforest
+ * @author Liuxinyu970226
* @author Mys 721tx
* @author PhiLiP
* @author Supaiku
@@ -3515,10 +3817,17 @@ $messages['zh-hans'] = array(
'spam-blacklisted-email-text' => '您的电å­é‚®ä»¶åœ°å€ç›®å‰å·²è¢«åˆ—入黑åå•ä»¥é˜²æ­¢æ‚¨å‘é€é‚®ä»¶ã€‚',
'spam-blacklisted-email-signup' => '所给电邮地å€å·²è¢«åˆ—入黑åå•ã€‚',
'spam-invalid-lines' => '下列垃圾链接黑åå•æœ‰{{PLURAL:$1|一行|多行}}å«æœ‰æ— æ•ˆçš„正则表示å¼ï¼Œè¯·åœ¨ä¿å­˜è¯¥é¡µå‰ä¿®æ­£ä¹‹ï¼š',
- 'spam-blacklist-desc' => '基于正则表达å¼çš„å垃圾链接工具:[[MediaWiki:Spam-blacklist]]å’Œ[[MediaWiki:Spam-whitelist]]',
+ 'spam-blacklist-desc' => '基于正则表达å¼çš„å垃圾邮件工具,å…许列入黑åå•çš„网页的URL和电å­é‚®ä»¶åœ°å€æ³¨å†Œç”¨æˆ·',
+ 'log-name-spamblacklist' => '垃圾链接黑åå•æ—¥å¿—',
+ 'log-description-spamblacklist' => '这个列表跟踪垃圾链接黑åå•çš„触å‘。',
+ 'logentry-spamblacklist-hit' => '$1在$3上试图加入$4,触å‘了垃圾链接黑åå•',
+ 'right-spamblacklistlog' => '查看垃圾邮件黑åå•æ—¥å¿—',
+ 'action-spamblacklistlog' => '查看垃圾邮件黑åå•æ—¥å¿—',
);
/** Traditional Chinese (中文(ç¹é«”)‎)
+ * @author Liangent
+ * @author Liuxinyu970226
* @author Mark85296341
* @author Oapbtommy
* @author Waihorace
@@ -3564,5 +3873,10 @@ $messages['zh-hant'] = array(
'spam-blacklisted-email-text' => '您的電郵地å€ç›®å‰å·²åˆ—入黑å單以防止您發é€é›»éƒµäºˆå…¶ä»–用戶。',
'spam-blacklisted-email-signup' => '此電郵地å€ç›®å‰è¢«ç¦æ­¢ä½¿ç”¨ã€‚',
'spam-invalid-lines' => '以下在çŒæ°´é»‘å單的{{PLURAL:$1|一行|多行}}有無效的表示å¼ï¼Œè«‹åœ¨å„²å­˜é€™é å‰å…ˆå°‡{{PLURAL:$1|它|它們}}修正:',
- 'spam-blacklist-desc' => '以正則表é”å¼ç‚ºæœ¬çš„防çŒæ°´å·¥å…·ï¼š[[MediaWiki:Spam-blacklist]] 與 [[MediaWiki:Spam-whitelist]]',
+ 'spam-blacklist-desc' => '基於正則表é”å¼çš„å垃圾電郵工具,å…許加入濫發電郵的URLå’Œ/或註冊用戶於此é é¢',
+ 'log-name-spamblacklist' => '垃圾連çµé»‘å單日誌',
+ 'log-description-spamblacklist' => '這些事件已被垃圾郵件黑å單觸發。',
+ 'logentry-spamblacklist-hit' => '$1æ–¼$3嘗試加入$4而觸發垃圾電郵黑å單。',
+ 'right-spamblacklistlog' => '查閱垃圾電郵黑å單日誌',
+ 'action-spamblacklistlog' => '查閱垃圾電郵黑å單日誌',
);
diff --git a/extensions/SpamBlacklist/SpamBlacklist.php b/extensions/SpamBlacklist/SpamBlacklist.php
index f3e27f3c..2fd7855d 100644
--- a/extensions/SpamBlacklist/SpamBlacklist.php
+++ b/extensions/SpamBlacklist/SpamBlacklist.php
@@ -10,7 +10,7 @@ if ( !defined( 'MEDIAWIKI' ) ) {
$wgExtensionCredits['antispam'][] = array(
'path' => __FILE__,
'name' => 'SpamBlacklist',
- 'author' => array( 'Tim Starling', 'John Du Hart' ),
+ 'author' => array( 'Tim Starling', 'John Du Hart', 'Daniel Kinzler' ),
'url' => 'https://www.mediawiki.org/wiki/Extension:SpamBlacklist',
'descriptionmsg' => 'spam-blacklist-desc',
);
@@ -21,7 +21,16 @@ $wgExtensionMessagesFiles['SpamBlackList'] = $dir . 'SpamBlacklist.i18n.php';
/**
* Array of settings for blacklist classes
*/
-$wgBlacklistSettings = array();
+$wgBlacklistSettings = array(
+ 'spam' => array(
+ 'files' => array( "http://meta.wikimedia.org/w/index.php?title=Spam_blacklist&action=raw&sb_ver=1" )
+ )
+);
+
+/**
+ * Log blacklist hits to Special:Log
+ */
+$wgLogSpamBlacklistHits = false;
/**
* @deprecated
@@ -33,10 +42,19 @@ $wgSpamBlacklistFiles =& $wgBlacklistSettings['spam']['files'];
*/
$wgSpamBlacklistSettings =& $wgBlacklistSettings['spam'];
-$wgHooks['EditFilterMerged'][] = 'SpamBlacklistHooks::filterMerged';
+if ( !defined( 'MW_SUPPORTS_CONTENTHANDLER' ) ) {
+ die( "This version of SpamBlacklist requires a version of MediaWiki that supports the ContentHandler facility (supported since MW 1.21)." );
+}
+
+// filter pages on save
+$wgHooks['EditFilterMergedContent'][] = 'SpamBlacklistHooks::filterMergedContent';
$wgHooks['APIEditBeforeSave'][] = 'SpamBlacklistHooks::filterAPIEditBeforeSave';
+
+// editing filter rules
$wgHooks['EditFilter'][] = 'SpamBlacklistHooks::validate';
-$wgHooks['ArticleSaveComplete'][] = 'SpamBlacklistHooks::articleSave';
+$wgHooks['PageContentSaveComplete'][] = 'SpamBlacklistHooks::pageSaveContent';
+
+// email filters
$wgHooks['UserCanSendEmail'][] = 'SpamBlacklistHooks::userCanSendEmail';
$wgHooks['AbortNewAccount'][] = 'SpamBlacklistHooks::abortNewAccount';
@@ -45,3 +63,10 @@ $wgAutoloadClasses['EmailBlacklist'] = $dir . 'EmailBlacklist.php';
$wgAutoloadClasses['SpamBlacklistHooks'] = $dir . 'SpamBlacklistHooks.php';
$wgAutoloadClasses['SpamBlacklist'] = $dir . 'SpamBlacklist_body.php';
$wgAutoloadClasses['SpamRegexBatch'] = $dir . 'SpamRegexBatch.php';
+
+$wgLogTypes[] = 'spamblacklist';
+$wgLogActionsHandlers['spamblacklist/*'] = 'LogFormatter';
+$wgLogRestrictions['spamblacklist'] = 'spamblacklistlog';
+$wgGroupPermissions['sysop']['spamblacklistlog'] = true;
+
+$wgAvailableRights[] = 'spamblacklistlog';
diff --git a/extensions/SpamBlacklist/SpamBlacklistHooks.php b/extensions/SpamBlacklist/SpamBlacklistHooks.php
index 530df16a..54f833cb 100644
--- a/extensions/SpamBlacklist/SpamBlacklistHooks.php
+++ b/extensions/SpamBlacklist/SpamBlacklistHooks.php
@@ -5,34 +5,53 @@
*/
class SpamBlacklistHooks {
/**
- * Hook function for EditFilterMerged
+ * Hook function for EditFilterMergedContent
+ *
+ * @param IContextSource $context
+ * @param Content $content
+ * @param Status $status
+ * @param string $summary
+ * @param User $user
+ * @param bool $minoredit
*
- * @param $editPage EditPage
- * @param $text string
- * @param $hookErr string
- * @param $editSummary string
* @return bool
*/
- static function filterMerged( $editPage, $text, &$hookErr, $editSummary ) {
- global $wgTitle;
- if( is_null( $wgTitle ) ) {
- # API mode
- # wfSpamBlacklistFilterAPIEditBeforeSave already checked the blacklist
+ static function filterMergedContent( IContextSource $context, Content $content, Status $status, $summary, User $user, $minoredit ) {
+ $title = $context->getTitle();
+
+ if ( isset( $title->spamBlackListFiltered ) && $title->spamBlackListFiltered ) {
+ // already filtered
return true;
}
+ // get the link from the not-yet-saved page content.
+ $pout = $content->getParserOutput( $title );
+ $links = array_keys( $pout->getExternalLinks() );
+
+ // HACK: treat the edit summary as a link
+ if ( $summary !== '' ) {
+ $links[] = $summary;
+ }
+
$spamObj = BaseBlacklist::getInstance( 'spam' );
- $title = $editPage->mArticle->getTitle();
- $ret = $spamObj->filter( $title, $text, '', $editSummary, $editPage );
- if ( $ret !== false ) {
- $editPage->spamPageWithContent( $ret );
+ $matches = $spamObj->filter( $links, $title );
+
+ if ( $matches !== false ) {
+ $status->fatal( 'spamprotectiontext' );
+
+ foreach ( $matches as $match ) {
+ $status->fatal( 'spamprotectionmatch', $match );
+ }
}
- // Return convention for hooks is the inverse of $wgFilterCallback
- return ( $ret === false );
+
+ // Always return true, EditPage will look at $status->isOk().
+ return true;
}
/**
- * Hook function for APIEditBeforeSave
+ * Hook function for APIEditBeforeSave.
+ * This allows blacklist matches to be reported directly in the result structure
+ * of the API call.
*
* @param $editPage EditPage
* @param $text string
@@ -40,14 +59,37 @@ class SpamBlacklistHooks {
* @return bool
*/
static function filterAPIEditBeforeSave( $editPage, $text, &$resultArr ) {
- $spamObj = BaseBlacklist::getInstance( 'spam' );
$title = $editPage->mArticle->getTitle();
- $ret = $spamObj->filter( $title, $text, '', '', $editPage );
- if ( $ret!==false ) {
- $resultArr['spamblacklist'] = implode( '|', $ret );
+
+ // get the links from the not-yet-saved page content.
+ $content = ContentHandler::makeContent(
+ $text,
+ $editPage->getTitle(),
+ $editPage->contentModel,
+ $editPage->contentFormat
+ );
+ $editInfo = $editPage->mArticle->prepareContentForEdit( $content, null, null, $editPage->contentFormat );
+ $pout = $editInfo->output;
+ $links = array_keys( $pout->getExternalLinks() );
+
+ // HACK: treat the edit summary as a link
+ $summary = $editPage->summary;
+ if ( $summary !== '' ) {
+ $links[] = $summary;
+ }
+
+ $spamObj = BaseBlacklist::getInstance( 'spam' );
+ $matches = $spamObj->filter( $links, $title );
+
+ if ( $matches !== false ) {
+ $resultArr['spamblacklist'] = implode( '|', $matches );
}
- // Return convention for hooks is the inverse of $wgFilterCallback
- return ( $ret === false );
+
+ // mark the title, so filterMergedContent can skip it.
+ $title->spamBlackListFiltered = true;
+
+ // return convention for hooks is the inverse of $wgFilterCallback
+ return ( $matches === false );
}
/**
@@ -136,20 +178,37 @@ class SpamBlacklistHooks {
}
/**
- * Hook function for ArticleSaveComplete
+ * Hook function for PageContentSaveComplete
* Clear local spam blacklist caches on page save.
*
- * @param $article Article
- * @param $user User
- * @param $text string
- * @param $summary string
- * @param $isminor
- * @param $iswatch
- * @param $section
+ * @param Page $wikiPage
+ * @param User $user
+ * @param Content $content
+ * @param string $summary
+ * @param bool $isMinor
+ * @param bool $isWatch
+ * @param string $section
+ * @param int $flags
+ * @param int $revision
+ * @param Status $status
+ * @param int $baseRevId
+ *
* @return bool
*/
- static function articleSave( &$article, &$user, $text, $summary, $isminor, $iswatch, $section ) {
- if( !BaseBlacklist::isLocalSource( $article->getTitle() ) ) {
+ static function pageSaveContent(
+ Page $wikiPage,
+ User $user,
+ Content $content,
+ $summary,
+ $isMinor,
+ $isWatch,
+ $section,
+ $flags,
+ $revision,
+ Status $status,
+ $baseRevId
+ ) {
+ if( !BaseBlacklist::isLocalSource( $wikiPage->getTitle() ) ) {
return true;
}
global $wgMemc, $wgDBname;
diff --git a/extensions/SpamBlacklist/SpamBlacklist_body.php b/extensions/SpamBlacklist/SpamBlacklist_body.php
index 7279e20b..bf5c9aab 100644
--- a/extensions/SpamBlacklist/SpamBlacklist_body.php
+++ b/extensions/SpamBlacklist/SpamBlacklist_body.php
@@ -5,8 +5,6 @@ if ( !defined( 'MEDIAWIKI' ) ) {
}
class SpamBlacklist extends BaseBlacklist {
- var $files = array( "http://meta.wikimedia.org/w/index.php?title=Spam_blacklist&action=raw&sb_ver=1" );
- var $ignoreEditSummary = false;
/**
* Returns the code for the blacklist implementation
@@ -18,49 +16,45 @@ class SpamBlacklist extends BaseBlacklist {
}
/**
- * @param Title $title
- * @param string $text Text of section, or entire text if $editPage!=false
- * @param string $section Section number or name
- * @param string $editsummary Edit summary if one exists, some people use urls there too
- * @param EditPage $editPage EditPage if EditFilterMerged was called, null otherwise
- * @return Array Matched text(s) if the edit should not be allowed, false otherwise
+ * Apply some basic anti-spoofing to the links before they get filtered,
+ * see @bug 12896
+ *
+ * @param string $text
+ *
+ * @return string
*/
- function filter( &$title, $text, $section, $editsummary = '', EditPage &$editPage = null ) {
- /**
- * @var $wgParser Parser
- */
- global $wgParser, $wgUser;
+ protected function antiSpoof( $text ) {
+ $text = str_replace( '.', '.', $text );
+ return $text;
+ }
+ /**
+ * @param string[] $links An array of links to check against the blacklist
+ * @param Title $title The title of the page to which the filter shall be applied.
+ * This is used to load the old links already on the page, so
+ * the filter is only applied to links that got added. If not given,
+ * the filter is applied to all $links.
+ *
+ * @return Array Matched text(s) if the edit should not be allowed, false otherwise
+ */
+ function filter( array $links, Title $title = null ) {
$fname = 'wfSpamBlacklistFilter';
wfProfileIn( $fname );
- # These don't do anything, commenting out...
- #$this->title = $title;
- #$this->text = $text;
- #$this->section = $section;
- $text = str_replace( '.', '.', $text ); //@bug 12896
-
$blacklists = $this->getBlacklists();
$whitelists = $this->getWhitelists();
if ( count( $blacklists ) ) {
- # Run parser to strip SGML comments and such out of the markup
- # This was being used to circumvent the filter (see bug 5185)
- if ( $editPage ) {
- $editInfo = $editPage->mArticle->prepareTextForEdit( $text );
- $out = $editInfo->output;
- } else {
- $options = new ParserOptions();
- $text = $wgParser->preSaveTransform( $text, $title, $wgUser, $options );
- $out = $wgParser->parse( $text, $title, $options );
- }
- $newLinks = array_keys( $out->getExternalLinks() );
- $oldLinks = $this->getCurrentLinks( $title );
- $addedLinks = array_diff( $newLinks, $oldLinks );
+ // poor man's anti-spoof, see bug 12896
+ $newLinks = array_map( array( $this, 'antiSpoof' ), $links );
- // We add the edit summary if one exists
- if ( !$this->ignoreEditSummary && !empty( $editsummary ) ) {
- $addedLinks[] = $editsummary;
+ $oldLinks = array();
+ if ( $title !== null ) {
+ $oldLinks = $this->getCurrentLinks( $title );
+ $addedLinks = array_diff( $newLinks, $oldLinks );
+ } else {
+ // can't load old links, so treat all links as added.
+ $addedLinks = $newLinks;
}
wfDebugLog( 'SpamBlacklist', "Old URLs: " . implode( ', ', $oldLinks ) );
@@ -99,12 +93,16 @@ class SpamBlacklist extends BaseBlacklist {
$ip = $wgRequest->getIP();
$imploded = implode( ' ', $matches[0] );
wfDebugLog( 'SpamBlacklistHit', "$ip caught submitting spam: $imploded\n" );
+ $this->logFilterHit( $title, $imploded ); // Log it
if( $retVal === false ){
$retVal = array();
}
- $retVal = array_merge( $retVal, $matches[0] );
+ $retVal = array_merge( $retVal, $matches[1] );
}
}
+ if ( is_array( $retVal ) ) {
+ $retVal = array_unique( $retVal );
+ }
} else {
$retVal = false;
}
@@ -150,4 +148,24 @@ class SpamBlacklist extends BaseBlacklist {
public function getRegexEnd( $batchSize ) {
return ')' . parent::getRegexEnd( $batchSize );
}
+ /**
+ * Logs the filter hit to Special:Log if
+ * $wgLogSpamBlacklistHits is enabled.
+ *
+ * @param Title $title
+ * @param string $url URL that the user attempted to add
+ */
+ public function logFilterHit( $title, $url ) {
+ global $wgUser, $wgLogSpamBlacklistHits;
+ if ( $wgLogSpamBlacklistHits ) {
+ $logEntry = new ManualLogEntry( 'spamblacklist', 'hit' );
+ $logEntry->setPerformer( $wgUser );
+ $logEntry->setTarget( $title );
+ $logEntry->setParameters( array(
+ '4::url' => $url,
+ ) );
+ $logid = $logEntry->insert();
+ $logEntry->publish( $logid, "rc" );
+ }
+ }
}
diff --git a/extensions/SyntaxHighlight_GeSHi/SyntaxHighlight_GeSHi.class.php b/extensions/SyntaxHighlight_GeSHi/SyntaxHighlight_GeSHi.class.php
index 4538a5f1..b1c9851d 100644
--- a/extensions/SyntaxHighlight_GeSHi/SyntaxHighlight_GeSHi.class.php
+++ b/extensions/SyntaxHighlight_GeSHi/SyntaxHighlight_GeSHi.class.php
@@ -28,12 +28,6 @@ class SyntaxHighlight_GeSHi {
// Don't trim leading spaces away, just the linefeeds
$text = preg_replace( '/^\n+/', '', $text );
- if( $wgUseTidy ) {
- // HTML Tidy will convert tabs to spaces incorrectly (bug 30930).
- // Preemptively replace the spaces in a more controlled fashion.
- $text = self::tabsToSpaces( $text );
- }
-
// Validate language
if( isset( $args['lang'] ) && $args['lang'] ) {
$lang = $args['lang'];
@@ -101,6 +95,12 @@ class SyntaxHighlight_GeSHi {
if( $enclose === GESHI_HEADER_DIV ) {
$out = str_replace( "\n", '', $out );
}
+ // HTML Tidy will convert tabs to spaces incorrectly (bug 30930).
+ // But the conversion from tab to space occurs while reading the input,
+ // before the conversion from &#9; to tab, so we can armor it that way.
+ if( $wgUseTidy ) {
+ $out = str_replace( "\t", '&#9;', $out );
+ }
// Register CSS
$parser->getOutput()->addHeadItem( self::buildHeadItem( $geshi ), "source-{$lang}" );
@@ -327,6 +327,9 @@ class SyntaxHighlight_GeSHi {
* @return GeSHi
*/
public static function prepare( $text, $lang ) {
+
+ global $wgSyntaxHighlightKeywordLinks;
+
self::initialise();
$geshi = new GeSHi( $text, $lang );
if( $geshi->error() == GESHI_ERROR_NO_SUCH_LANG ) {
@@ -335,7 +338,7 @@ class SyntaxHighlight_GeSHi {
$geshi->set_encoding( 'UTF-8' );
$geshi->enable_classes();
$geshi->set_overall_class( "source-$lang" );
- $geshi->enable_keyword_links( false );
+ $geshi->enable_keyword_links( $wgSyntaxHighlightKeywordLinks );
// If the source code is over 100 kB, disable higlighting of symbols.
// If over 200 kB, disable highlighting of strings too.
@@ -485,35 +488,4 @@ class SyntaxHighlight_GeSHi {
public static function hOldSpecialVersion_GeSHi( &$sp, &$extensionTypes ) {
return self::hSpecialVersion_GeSHi( $extensionTypes );
}
-
- /**
- * Convert tabs to spaces
- *
- * @param string $text
- * @return string
- */
- private static function tabsToSpaces( $text ) {
- $lines = explode( "\n", $text );
- $lines = array_map( array( __CLASS__, 'tabsToSpacesLine' ), $lines );
- return implode( "\n", $lines );
- }
-
- /**
- * Convert tabs to spaces for a single line
- *
- * @param $line
- * @internal param string $text
- * @return string
- */
- private static function tabsToSpacesLine( $line ) {
- $parts = explode( "\t", $line );
- $width = 8; // To match tidy's config & typical browser defaults
- $out = $parts[0];
- foreach( array_slice( $parts, 1 ) as $chunk ) {
- $spaces = $width - (strlen( $out ) % $width);
- $out .= str_repeat( ' ', $spaces );
- $out .= $chunk;
- }
- return $out;
- }
}
diff --git a/extensions/SyntaxHighlight_GeSHi/SyntaxHighlight_GeSHi.i18n.php b/extensions/SyntaxHighlight_GeSHi/SyntaxHighlight_GeSHi.i18n.php
index b9a336dd..9b940f3e 100644
--- a/extensions/SyntaxHighlight_GeSHi/SyntaxHighlight_GeSHi.i18n.php
+++ b/extensions/SyntaxHighlight_GeSHi/SyntaxHighlight_GeSHi.i18n.php
@@ -78,7 +78,7 @@ $messages['arz'] = array(
'geshi.css' => '/* CSS المحطوطة هنا ح تتطبق على تظليل سينتاكس الGeSHi */',
);
-/** Assamese (অসমীয়া)
+/** Assamese (অসমীয়া)
* @author Bishnu Saikia
*/
$messages['as'] = array(
@@ -199,9 +199,11 @@ $messages['ca'] = array(
/** Chechen (нохчийн)
* @author Sasan700
+ * @author Умар
*/
$messages['ce'] = array(
- 'geshi.css' => '/* CSS-ишар, кху чу Ñ…lоттайахь, оцо болх бийра бу Ñизашдо беÑнашна Ñ…lокхуньца GeSHI */',
+ 'syntaxhighlight-supported' => 'Ловш долу меттанаш:',
+ 'geshi.css' => '/* CSS-код, кху чу Ñ…lоттайахь, оцо болх бийра бу Ñизашдо беÑнашна Ñ…lокхуньца GeSHI */',
);
/** Czech (Äesky)
@@ -218,10 +220,16 @@ $messages['cs'] = array(
);
/** Danish (dansk)
+ * @author Christian List
* @author Sarrus
*/
$messages['da'] = array(
+ 'syntaxhighlight-desc' => 'Giver syntaksfremhævning <code>&lt;syntaxhighlight&gt;</code> ved brug af [http://qbnz.com/highlighter/ GeSHi - Generic Syntax Highlighter]',
+ 'syntaxhighlight-specify' => 'Du skal angive et sprog, sådan her:',
+ 'syntaxhighlight-supported' => 'Understøttede sprog for syntaksfremhævning:',
+ 'syntaxhighlight-err-loading' => '(fejl ved indlæsning af listen af understøttede sprog)',
'syntaxhighlight-err-language' => 'Ugyldigt sprog.',
+ 'geshi.css' => '/* CSS placeret her vil blive anvendt til GeSHi syntaksfremhævning */',
);
/** German (Deutsch)
@@ -314,7 +322,7 @@ $messages['et'] = array(
'syntaxhighlight-specify' => 'Sa pead täpsustama keelt nõnda:',
'syntaxhighlight-supported' => 'Süntaksi esiletoomise on toetatud järgnevates keeltes:',
'syntaxhighlight-err-loading' => '(toetatud keelte loetelu laadimisel esines viga)',
- 'syntaxhighlight-err-language' => 'antud keel on mittekehtiv',
+ 'syntaxhighlight-err-language' => 'Vigane keel.',
'geshi.css' => '/* CSS mis on asetatud siia, määrab GeSHi süntaksi esiletoomise stiili */',
);
@@ -335,7 +343,7 @@ $messages['fa'] = array(
'syntaxhighlight-specify' => 'شما باید به این شکل زبانی را مشخص کنید:',
'syntaxhighlight-supported' => 'زبان‌های پشتیبانی‌شده برای رنگین‌کردن دستورات:',
'syntaxhighlight-err-loading' => '(خطا در بارگذاری Ùهرست زبان‌های پشتیبانی‌شده)',
- 'syntaxhighlight-err-language' => 'زبان غیرمجاز.',
+ 'syntaxhighlight-err-language' => 'زبان نامجاز.',
'geshi.css' => '/* دستورات CSS اینجا توسط سامانه رنگین‌کردن دستورات GeSHi به کار گرÙته می‌شوند */',
);
@@ -657,10 +665,10 @@ $messages['km'] = array(
* @author ì•„ë¼
*/
$messages['ko'] = array(
- 'syntaxhighlight-desc' => '<code>&lt;syntaxhighlight&gt;</code> 태그로 [http://qbnz.com/highlighter/ GeSHi Highlighter]를 ì´ìš©í•´ 문법 ê°•ì¡° ê¸°ëŠ¥ì„ ì§€ì›í•©ë‹ˆë‹¤.',
- 'syntaxhighlight-specify' => '오른쪽과 ê°™ì´ ì–¸ì–´ë¥¼ 설정해야 합니다:',
- 'syntaxhighlight-supported' => '문법 ê°•ì¡°ê°€ 지ì›ë˜ëŠ” 언어 목ë¡',
- 'syntaxhighlight-err-loading' => '(지ì›í•˜ëŠ” 언어 목ë¡ì„ 불러오는 중 오류 ë°œìƒ)',
+ 'syntaxhighlight-desc' => '[http://qbnz.com/highlighter/ GeSHi Highlighter]를 사용해 <code>&lt;syntaxhighlight&gt;</code>로 문법 강조를 제공합니다',
+ 'syntaxhighlight-specify' => '다ìŒê³¼ ê°™ì´ ì–¸ì–´ë¥¼ 지정해야 합니다:',
+ 'syntaxhighlight-supported' => '문법 ê°•ì¡°ê°€ 지ì›ë˜ëŠ” 언어 목ë¡:',
+ 'syntaxhighlight-err-loading' => '(지ì›ë˜ëŠ” 언어 목ë¡ì„ 불러오는 중 오류)',
'syntaxhighlight-err-language' => 'ìž˜ëª»ëœ ì–¸ì–´ìž…ë‹ˆë‹¤.',
'geshi.css' => '/* ì´ ë¬¸ì„œì—ì„œ 설정한 CSS는 GeSHiì— ì ìš©ë©ë‹ˆë‹¤. */',
);
@@ -680,10 +688,11 @@ $messages['ksh'] = array(
/** Luxembourgish (Lëtzebuergesch)
* @author Les Meloures
* @author Robby
+ * @author Soued031
*/
$messages['lb'] = array(
'syntaxhighlight-desc' => "Syntax-Ervirhiewung <code>&lt;syntaxhighlight&gt;</code> mat Hëllef vu [http://qbnz.com/highlighter/ 'GeSHi Highlighter']",
- 'syntaxhighlight-specify' => 'Déi gewënscht Sprooch muss esou definéiert ginn:',
+ 'syntaxhighlight-specify' => 'Déi gewënscht Sprooch muss sou definéiert ginn:',
'syntaxhighlight-supported' => "Ënnerstëtzte Sprooche fir d'Syntax faarweg ze markéieren",
'syntaxhighlight-err-loading' => '(Feeler beim Luede vun der Lëscht vun den ënnerstëtzte Sproochen)',
'syntaxhighlight-err-language' => 'Net valabel Sprooch.',
@@ -790,7 +799,7 @@ $messages['nah'] = array(
'syntaxhighlight-err-language' => 'Âmò kualli tlâtòlli',
);
-/** Norwegian Bokmål (norsk (bokmål)‎)
+/** Norwegian Bokmål (norsk bokmål)
*/
$messages['nb'] = array(
'syntaxhighlight-desc' => 'Gir syntaks som framhever <code>&lt;syntaxhighlight&gt;</code> ved hjelp av [http://qbnz.com/highlighter/ GeSHi Highlighter]',
@@ -813,7 +822,7 @@ $messages['nds'] = array(
'geshi.css' => '/* CSS in disse MediaWiki-Systemnaricht warrt för dat GeSHi-Syntaxrutheven bruukt */',
);
-/** Nedersaksies (Nedersaksies)
+/** Low Saxon (Netherlands) (Nedersaksies)
* @author Servien
*/
$messages['nds-nl'] = array(
@@ -833,7 +842,7 @@ $messages['nl'] = array(
'geshi.css' => '/* Hier geplaatste CSS wordt toegepast op GeSHi Syntax Highlighting */',
);
-/** Norwegian Nynorsk (norsk (nynorsk)‎)
+/** Norwegian Nynorsk (norsk nynorsk)
* @author Frokor
*/
$messages['nn'] = array(
@@ -909,7 +918,7 @@ $messages['pms'] = array(
* @author Ahmed-Najib-Biabani-Ibrahimkhel
*/
$messages['ps'] = array(
- 'syntaxhighlight-specify' => 'بايد ØªØ§Ø³Û ÙŠÙˆÙ‡ ژبه په Ø¯Û ØªÙˆÚ«Ù‡ ÚØ§Ù†Ú«Ú“Û Ú©Ú“ÛŒ:',
+ 'syntaxhighlight-specify' => 'بايد ØªØ§Ø³Û ÙŠÙˆÙ‡ ژبه په Ø¯Û ØªÙˆÚ¯Ù‡ ÚØ§Ù†Ú¯Ú“Û Ú©Ú“Û:',
'syntaxhighlight-err-language' => 'ناسمه ژبه.',
);
diff --git a/extensions/SyntaxHighlight_GeSHi/SyntaxHighlight_GeSHi.php b/extensions/SyntaxHighlight_GeSHi/SyntaxHighlight_GeSHi.php
index 0b6cb0c6..5372342d 100644
--- a/extensions/SyntaxHighlight_GeSHi/SyntaxHighlight_GeSHi.php
+++ b/extensions/SyntaxHighlight_GeSHi/SyntaxHighlight_GeSHi.php
@@ -48,7 +48,10 @@ $wgExtensionCredits['parserhook']['SyntaxHighlight_GeSHi'] = array(
'url' => 'https://www.mediawiki.org/wiki/Extension:SyntaxHighlight_GeSHi',
);
-$wgSyntaxHighlightDefaultLang = null; //Change this in LocalSettings.php
+// Change these in LocalSettings.php
+$wgSyntaxHighlightDefaultLang = null;
+$wgSyntaxHighlightKeywordLinks = false;
+
$dir = dirname(__FILE__) . '/';
$wgExtensionMessagesFiles['SyntaxHighlight_GeSHi'] = $dir . 'SyntaxHighlight_GeSHi.i18n.php';
$wgAutoloadClasses['SyntaxHighlight_GeSHi'] = $dir . 'SyntaxHighlight_GeSHi.class.php';
diff --git a/extensions/SyntaxHighlight_GeSHi/geshi/geshi.php b/extensions/SyntaxHighlight_GeSHi/geshi/geshi.php
index 60741577..4323d05c 100644
--- a/extensions/SyntaxHighlight_GeSHi/geshi/geshi.php
+++ b/extensions/SyntaxHighlight_GeSHi/geshi/geshi.php
@@ -41,7 +41,7 @@
//
/** The version of this GeSHi file */
-define('GESHI_VERSION', '1.0.8.11');
+define('GESHI_VERSION', '1.0.8.11-wmf1'); // WMF fix for Haskell (bug 52509)
// Define the root directory for the GeSHi code tree
if (!defined('GESHI_ROOT')) {
diff --git a/extensions/SyntaxHighlight_GeSHi/geshi/geshi/haskell.php b/extensions/SyntaxHighlight_GeSHi/geshi/geshi/haskell.php
index adae1116..d3b494ed 100644
--- a/extensions/SyntaxHighlight_GeSHi/geshi/geshi/haskell.php
+++ b/extensions/SyntaxHighlight_GeSHi/geshi/geshi/haskell.php
@@ -13,6 +13,14 @@
* -------
* 2005/08/27 (1.0.0)
* - First Release
+ * 2013/09/28
+ * - Single quotes dropped from QUOTEMARKS to resolve <https://bugzilla.wikimedia.org/52509>.
+ * Change is local to SyntaxHighlight_GeSHi, made by Ori Livneh (ori@wikimedia.org), based
+ * on a proposed upstream patch.
+ * Upstream bug report:
+ * <http://sourceforge.net/p/geshi/bugs/217/>
+ * Upstream patch (stalled since 2012):
+ * <http://sourceforge.net/p/geshi/bugs/219/>
*
* TODO (updated 2005/08/27)
* -------------------------
@@ -46,7 +54,7 @@ $language_data = array (
3 => "/{-(?:(?R)|.)-}/s", //Nested Comments
),
'CASE_KEYWORDS' => 0,
- 'QUOTEMARKS' => array('"',"'"),
+ 'QUOTEMARKS' => array('"'), // SyntaxHighlight_GeSHi modification; see CHANGES above.
'ESCAPE_CHAR' => '\\',
'KEYWORDS' => array(
/* main haskell keywords */
diff --git a/extensions/TitleBlacklist/TitleBlacklist.i18n.php b/extensions/TitleBlacklist/TitleBlacklist.i18n.php
index 874a990b..eb8f6987 100644
--- a/extensions/TitleBlacklist/TitleBlacklist.i18n.php
+++ b/extensions/TitleBlacklist/TitleBlacklist.i18n.php
@@ -155,7 +155,7 @@ $messages['arz'] = array(
'right-tboverride' => 'اتجاوز البلاك ليست بتاعةالعناوين', # Fuzzy
);
-/** Assamese (অসমীয়া)
+/** Assamese (অসমীয়া)
* @author Bishnu Saikia
* @author Gitartha.bordoloi
* @author Nilamdyuti
@@ -210,9 +210,10 @@ por favor {{PLURAL:$1|corríxila|corríxiles}} enantes de guardar:',
/** Bashkir (башҡортÑа)
* @author Assele
+ * @author РуÑтам Ðурыев
*/
$messages['ba'] = array(
- 'titleblacklist-desc' => 'Хәкимдәргә [[MediaWiki:Titleblacklist|ҡара]] һәм [[MediaWiki:Titlewhitelist|аҡ]] иÑемлек Ñрҙамында биттәрҙе һәм иҫәп Ñҙмаларын булдырыуҙы тыйырға мөмкинлек бирә.',
+ 'titleblacklist-desc' => 'Хакимдәргә [[MediaWiki:Titleblacklist|ҡара]] һәм [[MediaWiki:Titlewhitelist|аҡ]] иÑемлек Ñрҙамында биттәрҙе һәм иҫәп Ñҙмаларын булдырыуҙы тыйырға мөмкинлек бирә.',
'titleblacklist' => '# Был — тыйылған иÑемдәр иÑемлеге. Күһәтелгән регулÑÑ€ аңлатмаларға тап килгән биттәр һәм иҫәп Ñҙмалары булдырыла алмай.
# Иҫкәрмәләр Ó©Ñөн "#" ҡулланығыҙ.
# Ғәҙәттә ҙур/бәләкәй хәрефкә һиҙгер түгел',
@@ -250,6 +251,30 @@ $messages['bcc'] = array(
'right-tboverride' => 'لیست سیاه عنوان لغو کن', # Fuzzy
);
+/** Bikol Central (Bikol Central)
+ * @author Geopoet
+ */
+$messages['bcl'] = array(
+ 'titleblacklist-desc' => 'Minatugot sa mga administrador na magbawal sa pagmumukna nin mga pahina asin mga panindog nin paragamit sa kada [[MediaWiki:Titleblacklist|pinagbarahang listahan]] and [[MediaWiki:Titlewhitelist|pinagtugutang listahan]]',
+ 'titleblacklist' => '#Ini sarong pinagbarahang listahan kan titulo. Mga titulo asin mga paragamit na minatampad nin sarong regular na ekspresyon digde dae puwedeng maipagmukna.
+#Gamiton an "#" para sa mga komento.
+#Ini bakong sensitibo sa pindutan bilang panugmad',
+ 'titlewhitelist' => '#Ini sarong pinagtutugutang listahan kan titulo. Gamiton an "#" para sa mga komento.
+#Ini bakong sensitibo sa pindutan bilang panugmad',
+ 'titleblacklist-forbidden-edit' => 'An titulong "$2" pinagbabawalan sa makapagmukna.
+Ini minatampad sa minasunod na entrada kan pinagbarahang listahan: <code>$1</code>',
+ 'titleblacklist-forbidden-move' => 'An "$2" dae tabi maibabalyo sa "$3", nin huli ta an titulo "$3" pinagbabawalan sa makapagmukna.
+Ini minatampad sa minasunod na entrada kan pinagbarahang listahan:<code>$1</code>',
+ 'titleblacklist-forbidden-upload' => 'An pangaran nin sagunson na "$2" pinagbabawalan na makapagmukna.
+Ini minatampad sa minasunod na entrada kan pinagbarahang listahan:<code>$1</code>',
+ 'titleblacklist-forbidden-new-account' => 'An pangaran nin paragamit na "$2" pinagbabawalan na makapagmukna.
+Ini minatampad sa minasunod na entrada kan pinagbarahang listahan:<code>$1</code>',
+ 'titleblacklist-invalid' => 'An minasunod na {{PLURAL:$1|linya|mga linya}} na yaon sa pinagbarahang listahan kan titulo {{PLURAL:$1|iyo an|iyo an mga}} imbalido; pakikoriher tabi {{PLURAL:$1|ini|sinda}} bago pa man ipagtagama:',
+ 'titleblacklist-override' => 'Pabayae an pinagbarahang listahan',
+ 'right-tboverride' => 'Salambawan an titulo o pinagbabawal na listahan kan pangaran nin paragamit',
+ 'right-tboverride-account' => 'Salambawan an pinagbarahang listahan kan pangaran nin paragamit',
+);
+
/** Belarusian (TaraÅ¡kievica orthography) (беларуÑÐºÐ°Ñ (тарашкевіца)‎)
* @author EugeneZelenko
* @author Jim-by
@@ -379,6 +404,7 @@ molimo da {{PLURAL:$1|ga|ih}} ispravite prije spremanja:',
* @author Aleator
* @author El libre
* @author Jordi Roqué
+ * @author Papapep
* @author Pitort
* @author SMP
* @author Vriullop
@@ -392,7 +418,7 @@ $messages['ca'] = array(
# Per defecte, no distingeix majúscules de minúscules',
'titleblacklist-forbidden-edit' => 'El títol «$2» està prohibit i no es pot crear. Concorda amb la següent entrada de la llista negra: <code>$1</code>',
'titleblacklist-forbidden-move' => "No es pot moure «$2» a «$3», perquè el títol «$3» està prohibit. Concorda amb l'entrada de la llista negra següent: <code>$1</code>",
- 'titleblacklist-forbidden-upload' => "El nom de fitxer «$2» ha estat prohibit i se n'impedeix la creació. Concorda amb la següent línia de la llista negra: <code>$1</code>",
+ 'titleblacklist-forbidden-upload' => "S'ha prohibit el nom de fitxer «$2» i se n'impedeix la creació. Concorda amb la següent línia de la llista negra: <code>$1</code>",
'titleblacklist-forbidden-new-account' => "No es pot crear el nom d'usuari «$2». Coincideix amb la següent entrada de la llista negra: <code>$1</code>",
'titleblacklist-invalid' => '{{PLURAL:$1|La línia següent|Les línies següents}} de la llista negra no {{PLURAL:$1|és vàlida|són vàlides}}; heu de corregir-{{PLURAL:$1|la|les}} abans de guardar:',
'titleblacklist-override' => 'Ignora la llista negra',
@@ -400,11 +426,20 @@ $messages['ca'] = array(
'right-tboverride-account' => "Ignorar la llista negra de noms d'usuari",
);
+/** Chechen (нохчийн)
+ * @author Умар
+ */
+$messages['ce'] = array(
+ 'right-tboverride' => 'Ӏаьржачу могӀанийн чура агӀонийн цӀераш тергалцаÑÑ€ Ñ Ð´ÐµÐºÑŠÐ°ÑˆÑ…Ð¾Ð¹ тергалцабар',
+ 'right-tboverride-account' => 'Ӏаьржачу могӀанийн чура декъашхойн цӀераш тергалцаÑÑ€',
+);
+
/** Sorani Kurdish (کوردی)
* @author Calak
*/
$messages['ckb'] = array(
'titleblacklist-override' => 'پێرستی ڕەش لەبەر چاو مەگرە',
+ 'right-tboverride' => 'تێپەڕاندنی تاوتوێی پێرستی ڕەشی سەردێڕ یان ناوی بەکارھێنەری',
);
/** Czech (Äesky)
@@ -473,6 +508,7 @@ Det svarer til følgende sortlistepost: <code>$1</code>',
* @author Metalhead64
* @author Raimond Spekking
* @author The Evil IP address
+ * @author Umherirrender
*/
$messages['de'] = array(
'titleblacklist-desc' => 'Ermöglicht es Administratoren die Erstellung unerwünschter Seiten- und Benutzernamen zu unterbinden: [[MediaWiki:Titleblacklist]] und [[MediaWiki:Titlewhitelist]]',
@@ -484,7 +520,7 @@ $messages['de'] = array(
'titleblacklist-forbidden-edit' => "'''Eine Seite mit dem Titel „$2“ kann nicht erstellt werden.'''<br />Der Titel kollidiert mit diesem Sperrbegriff: '''''$1'''''",
'titleblacklist-forbidden-move' => "'''Die Seite „$2“ kann nicht nach „$3“ verschoben werden.'''<br />Der Titel kollidiert mit diesem Sperrbegriff: '''''$1'''''",
'titleblacklist-forbidden-upload' => "'''Eine Datei mit dem Namen „$2“ kann nicht hochgeladen werden.'''<br />Der Titel kollidiert mit diesem Sperrbegriff: '''''$1'''''",
- 'titleblacklist-forbidden-new-account' => 'Die Registrierung des Benutzernames „$2“ ist nicht erwünscht.
+ 'titleblacklist-forbidden-new-account' => 'Die Registrierung des Benutzernamens „$2“ ist nicht erwünscht.
Folgender Eintrag aus der Liste unerwünschter Benutzernamen führte zur Ablehnung: <code>$1</code>',
'titleblacklist-invalid' => 'Die {{PLURAL:$1|folgende Zeile|folgenden Zeilen}} in der Sperrliste {{PLURAL:$1|ist|sind}} ungültig; bitte korrigiere diese vor dem Speichern:',
'titleblacklist-override' => 'Schwarze Liste ignorieren',
@@ -522,6 +558,7 @@ $messages['de-formal'] = array(
/** Zazaki (Zazaki)
* @author Aspar
* @author Erdemaslancan
+ * @author Marmase
*/
$messages['diq'] = array(
'titleblacklist-desc' => 'serkaran re desturê vıraştışê pel u hesabê karberan dano, qey qedexekerdışi re yew [[MediaWiki:Titleblacklist|listeya risiyayan]] u [[MediaWiki:Titlewhitelist|listeya risıpiyan]] dano.',
@@ -538,8 +575,8 @@ malumatê ey na listeyasiya de zepê ya: <code>$1</code>',
malumatê ey na listeyasiya de zêpê ya: <code>$1</code>',
'titleblacklist-forbidden-new-account' => 'vıraştışê nameyê karberê"$2" i qedexe bı.
malumatê ey na listeyasiya de zêpê ya: <code>$1</code>',
- 'titleblacklist-invalid' => 'nê {{PLURAL:$1|satır o ke|satır ê ke}} listeyasiyayi de qedexe yê;
-kerem kerê verqeydkerdışi de raşt kerê:',
+ 'titleblacklist-invalid' => 'Na ğırab lista dı {{PLURAL:$1|en asatır|ené satıri}} néravérené;
+Verdé qeyd kerdışi timar keré:',
'titleblacklist-override' => 'Tenilisti mehesebne',
'right-tboverride' => 'Siya listeya sernuşti nêravêrde ke',
'right-tboverride-account' => 'Tenilisteya naman dê karberan mehesebnê',
@@ -676,6 +713,7 @@ Palun paranda {{PLURAL:$1|see|need}} enne salvestamist:',
);
/** Persian (Ùارسی)
+ * @author Dalba
* @author Ebraminio
* @author Huji
* @author Ladsgroup
@@ -689,14 +727,14 @@ $messages['fa'] = array(
# از «#» برای توضیحات استÙاده کنید.
# به‌طور پیش‌Ùرض به بزرگ Ùˆ Ú©ÙˆÚ†Ú©ÛŒ حرو٠حساس نیست.',
'titlewhitelist' => '# این یک Ùهرست سÙید برای عنوان‌ها است. از «#» برای اÙزودن توضیحات استÙاده کنید.
-#این Ùهرست به بزرگی Ùˆ Ú©ÙˆÚ†Ú©ÛŒ به طرو پیش‌Ùرض حساس نیست',
+#این Ùهرست به طور پیش‌Ùرض به بزرگی Ùˆ Ú©ÙˆÚ†Ú©ÛŒ حساس نیست',
'titleblacklist-forbidden-edit' => 'ایجاد عنوان «$2» ممنوع شده‌است. این عنوان با این دستور از Ùهرست سیاه مطابقت می‌کند: <code>$1</code>',
'titleblacklist-forbidden-move' => '«$2» را نمی‌توان به «$3» انتقال داد. ایجاد «$3» ممنوع است. چون با این دستور از Ùهرست سیاه مطابقت می‌کند: <code>$1</code>',
'titleblacklist-forbidden-upload' => 'ایجاد نام «$2» برای پرونده‌ها ممنوع است، زیرا با این دستور از Ùهرست سیاه مطابقت می‌کند: <code>$1</code>',
'titleblacklist-forbidden-new-account' => 'حساب کاربری «$2» در برابر ایجاد محاÙظت شده‌است.
این نام کاربری با این قسمت از Ùهرست سیاه مطابقت دارد: <code>$1</code>',
'titleblacklist-invalid' => '
-{{PLURAL:$1|سطر|سطرهای}} زیر در Ùهرست سیاه عنوان‌ها غیرمجاز {{PLURAL:$1|است|هستند}}Ø› لطÙاً {{PLURAL:$1|آن|آن‌ها}} را قبل از ذخیره کردن اصلاح کنید:',
+{{PLURAL:$1|سطر|سطرهای}} زیر در Ùهرست سیاه عنوان‌ها نامجاز {{PLURAL:$1|است|هستند}}Ø› لطÙاً {{PLURAL:$1|آن|آن‌ها}} را قبل از ذخیره‌کردن اصلاح کنید:',
'titleblacklist-override' => 'از Ùهرست سیاه چشم‌پوشی Ú©Ù†',
'right-tboverride' => 'نادیده گرÙتن لیست سیاه عنوان یا نام کاربری',
'right-tboverride-account' => 'لغو Ùهرست سیاه نام کاربری',
@@ -1084,7 +1122,7 @@ Naipada ti sumaganad a blacklist a naikabil: <code>$1</code>',
'titleblacklist-invalid' => 'Ti sumaganad a {{PLURAL:$1|linia|dagiti linia}} iti titulo ti blacklist {{PLURAL:$1|ket|ket}} imbalido;
pangngaasi ta pasayaaten {{PLURAL:$1|ida|dagida}} sakbay nga idulin:',
'titleblacklist-override' => 'Saan nga ikaskaso ti blacklist',
- 'right-tboverride' => 'Ipatuon ti titulo a blacklist', # Fuzzy
+ 'right-tboverride' => 'Patuonan ti titulo wenno madi a listaan ti nagan ti agar-aramat',
'right-tboverride-account' => 'Ipatuon ti nagan ti agar-aramat a blacklist',
);
@@ -1115,13 +1153,14 @@ Hann passar við eftirfarandi færslu í bannlistanum: <code>$1</code>',
* @author BrokenArrow
* @author Darth Kule
* @author Melos
+ * @author Nemo bis
*/
$messages['it'] = array(
- 'titleblacklist-desc' => 'Consente di proibire la creazione di pagine e account utente con i titoli indicati in una [[MediaWiki:Titleblacklist|blacklist]] e una [[MediaWiki:Titlewhitelist|whitelist]]',
- 'titleblacklist' => '# Lista dei titoli non consentiti.
-# È impedita la creazione delle pagine e degli account il cui nome corrisponde a un\'espressione regolare indicata di seguito.
+ 'titleblacklist-desc' => 'Consente di proibire la creazione di pagine e utenze con i titoli indicati in una [[MediaWiki:Titleblacklist|blacklist]] e una [[MediaWiki:Titlewhitelist|whitelist]]',
+ 'titleblacklist' => '# Lista di titoli non consentiti.
+# È impedita la creazione di pagine e utenze il cui nome corrisponda a un\'espressione regolare indicata di seguito.
# Usare "#" per le righe di commento.
-# Per default la differenza tra maiuscole e minuscole non è significativa',
+# Per default la differenza tra maiuscole e minuscole non è significativa.',
'titlewhitelist' => '# Questa è una whitelist dei titoli. Usare "#" per le righe di commento
# Per default la differenza tra maiuscole e minuscole non è significativa',
'titleblacklist-forbidden-edit' => 'La creazione di pagine con titolo "$2" è stata impedita. La voce corrispondente nell\'elenco dei titoli non consentiti è la seguente: <code>$1</code>',
@@ -1272,13 +1311,12 @@ Mändemeler üşin «#» nışanın qoldanıñız.', # Fuzzy
* @author ì•„ë¼
*/
$messages['ko'] = array(
- 'titleblacklist-desc' => '[[MediaWiki:Titleblacklist]], [[MediaWiki:Titlewhitelist]]를 통해서 특정 ì œëª©ì˜ ë¬¸ì„œ 만들기를 막는 기능',
- 'titleblacklist' => ' # 문서 ì´ë¦„ 금지 목ë¡ì„ ì ëŠ” 곳입니다. ì •ê·œ 표현ì‹ê³¼ ì¼ì¹˜í•˜ëŠ” 문서나 ì‚¬ìš©ìž ì´ë¦„ì€ ë§Œë“¤ê¸°ê°€ 제한ë©ë‹ˆë‹¤.
- # ê·œì¹™ì´ ì•„ë‹Œ ì£¼ì„ ë‚´ìš©ì—는 ì•žì— "#"ì„ ë¶™ì—¬ 주세요.
- # 기본ì ìœ¼ë¡œ ê·œì¹™ì€ ëŒ€ì†Œë¬¸ìžë¥¼ 구별하지 않습니다.',
- 'titlewhitelist' => ' # 만들기 허용 ê·œì¹™ì„ ì ëŠ” 곳입니다. 만들기 금지 ê·œì¹™ì— í¬í•¨ë˜ëŠ” ë¬¸ì„œì˜ ê²½ìš°, ì´ ê³³ì˜ ê·œì¹™ì—ë„ í¬í•¨ë  경우 만들기가 가능해집니다.
- # ê·œì¹™ì´ ì•„ë‹Œ ì£¼ì„ ë‚´ìš©ì—는 ì•žì— "#"ì„ ë¶™ì—¬ 주세요.
- # 기본ì ìœ¼ë¡œ ê·œì¹™ì€ ëŒ€ì†Œë¬¸ìžë¥¼ 구별하지 않습니다.',
+ 'titleblacklist-desc' => '관리ìžê°€ [[MediaWiki:Titleblacklist]], [[MediaWiki:Titlewhitelist]]마다 문서와 ì‚¬ìš©ìž ê³„ì •ì„ ë§Œë“œëŠ” ê²ƒì„ ê¸ˆì§€í•  수 있습니다',
+ 'titleblacklist' => '# 제목 금지 목ë¡ìž…니다. ì •ê·œ 표현ì‹ê³¼ ì¼ì¹˜í•˜ëŠ” 제목나 사용ìžëŠ” 만들 수 없습니다.
+# ì£¼ì„ ë‚´ìš©ì—는 ì•žì— "#"ì„ ë¶™ì—¬ 주세요.
+# 기본ì ìœ¼ë¡œ ê·œì¹™ì€ ëŒ€ì†Œë¬¸ìžë¥¼ 구별하지 않습니다',
+ 'titlewhitelist' => '# 제목 허용 목ë¡ìž…니다. ì£¼ì„ ë‚´ìš©ì—는 ì•žì— "#"ì„ ë¶™ì—¬ 주세요.
+# 기본ì ìœ¼ë¡œ ê·œì¹™ì€ ëŒ€ì†Œë¬¸ìžë¥¼ 구별하지 않습니다',
'titleblacklist-forbidden-edit' => '"$2" 문서는 만들기 금지 목ë¡ì— í¬í•¨ë˜ì–´ 있습니다.
해당 만들기 금지 ì¡°ê±´ì€ <code>$1</code>입니다.',
'titleblacklist-forbidden-move' => '"$2" 문서를 "$3" 제목으로 옮길 수 없습니다. 문서 만들기 금지 ì¡°ê±´ì´ ê±¸ë ¤ 있습니다.
@@ -1287,8 +1325,8 @@ $messages['ko'] = array(
íŒŒì¼ ì´ë¦„ì´ ë‹¤ìŒì˜ ê·œì¹™ì— í•´ë‹¹ë©ë‹ˆë‹¤: <code>$1</code>',
'titleblacklist-forbidden-new-account' => '"$2" ì´ë¦„으로 ê³„ì •ì„ ë§Œë“œëŠ” ê²ƒì´ ì œí•œë˜ì–´ 있습니다.
계정 ì´ë¦„ì´ ë‹¤ìŒì˜ ê·œì¹™ì— í•´ë‹¹ë©ë‹ˆë‹¤: <code>$1</code>',
- 'titleblacklist-invalid' => '제목 블랙리스트 목ë¡ì— ìž˜ëª»ëœ êµ¬ë¬¸ì´ ìžˆìŠµë‹ˆë‹¤.
-저장하기 ì „ì— ì˜¬ë°”ë¥´ê²Œ 수정해주세요.',
+ 'titleblacklist-invalid' => '제목 ë¸”ëž™ë¦¬ìŠ¤íŠ¸ì˜ ë‹¤ìŒ {{PLURAL:$1|줄}}ì— ìž˜ëª»ëœ êµ¬ë¬¸ì´ {{PLURAL:$1|있습니다}}.
+저장하기 ì „ì— {{PLURAL:$1}}올바르게 수정해주세요:',
'titleblacklist-override' => '블랙리스트를 무시',
'right-tboverride' => '문서 제목ì´ë‚˜ ì‚¬ìš©ìž ì´ë¦„ 블랙리스트 무시',
'right-tboverride-account' => 'ì‚¬ìš©ìž ì´ë¦„ 블랙리스트를 무시',
@@ -1338,14 +1376,15 @@ Hic titulus congruit cum expressione regulari: <code>$1</code>',
/** Luxembourgish (Lëtzebuergesch)
* @author Robby
+ * @author Soued031
*/
$messages['lb'] = array(
'titleblacklist-desc' => "Erlaabt den Administrateuren et d'Uleeë vu Säiten a Benotzerkonte mat spezifeschen Titelen iwwer eng [[MediaWiki:Titleblacklist|schwaarz Lëscht]] an eng [[MediaWiki:Titlewhitelist|wäiss Lëscht]] ze verbidden",
'titleblacklist' => '# Dëst ass een Titel deen op enger schwaarzer Lëscht steet. Titelen a Benotzernimm op déi dës Ausdréck passe kann net ugeluecht ginn
# Benotzt "#" fir Bemierkungen
-# Et gëtt tëschent groussen a klenge Buchstawen ënnerscheed',
+# Et gëtt tëscht groussen a klenge Buchstawen ënnerscheet',
'titlewhitelist' => "# Dëst ass d'''Whitelist'' vun den Titelen. Benotzt \"#\" fir Bemierkungen.
-# Et gëtt een Ënnerscheed tëschent groussen a klenge Buchstawe gemaach",
+# Et gëtt een Ënnerscheed tëscht groussen a klenge Buchstawe gemaach",
'titleblacklist-forbidden-edit' => 'Den Titel "$2" dàerf net ugeluecht ginn.
En ass op der schwaarzer Lëscht wéint folgendem Begrëff: <code>$1</code>',
'titleblacklist-forbidden-move' => '"$2" kann net op "$3" geréckelt ginn, well den Titel "$3" net däerf ugeluecht ginn.
@@ -1353,7 +1392,7 @@ En entsprécht dëser Rubrik vun der schwaarzr Lëscht: <code>$1</code>',
'titleblacklist-forbidden-upload' => 'De Fichiersnumm "$2" kann net benotzt ginn.
Hien ass identesch mat dësem Numm vun der schwaarzer Lëscht (black list): <code>$1</code>',
'titleblacklist-forbidden-new-account' => 'De Benotzermumm "$2" gouf gespaart fir benotzt ze ginn.
-En ass esou op der \'\'schwaarzer Lëscht\'\': <code>$1</code>',
+En ass sou op der \'\'schwaarzer Lëscht\'\': <code>$1</code>',
'titleblacklist-invalid' => 'Dës {{PLURAL:$1|Linn|Linnen}} op der schwaarzer Lëscht vun den {{PLURAL:$1|Titelen ass|Titele sinn}} net valabel;
verbessert se virum späicheren:',
'titleblacklist-override' => 'Schwaarz Lëscht ignoréieren',
@@ -1462,9 +1501,10 @@ $messages['ml'] = array(
* @author Kaustubh
* @author Mahitgar
* @author Rahuldeshmukh101
+ * @author V.narsikar
*/
$messages['mr'] = array(
- 'titleblacklist-desc' => '[[MediaWiki:Titleblacklist|बà¥à¤²à¥…कलीसà¥à¤Ÿ]] व [[MediaWiki:Titlewhitelist|वà¥à¤¹à¤¾à¤ˆà¤Ÿ लीसà¥à¤Ÿ]] ला अनà¥à¤¸à¤°à¥‚न पाने आणि सदसà¥à¤¯ खातà¥à¤¯à¤¾à¤‚ना पà¥à¤°à¤¤à¤¿à¤¬à¤‚धतीअ करणà¥à¤¯à¤¾à¤šà¥€ पà¥à¤°à¤šà¤¾à¤²à¤•à¤¾à¤‚ना परवानगी दà¥à¤¯à¤¾',
+ 'titleblacklist-desc' => '[[MediaWiki:Titleblacklist|बà¥à¤²à¥…कलीसà¥à¤Ÿ]] व [[MediaWiki:Titlewhitelist|वà¥à¤¹à¤¾à¤ˆà¤Ÿ लीसà¥à¤Ÿ]] ला अनà¥à¤¸à¤°à¥‚न पाने आणि सदसà¥à¤¯ खातà¥à¤¯à¤¾à¤‚ना पà¥à¤°à¤¤à¤¿à¤¬à¤‚धित करणà¥à¤¯à¤¾à¤šà¥€ पà¥à¤°à¤šà¤¾à¤²à¤•à¤¾à¤‚ना परवानगी दà¥à¤¯à¤¾',
'titleblacklist' => '# ही बà¥à¤²à¥‰à¤• केलेलà¥à¤¯à¤¾ शीरà¥à¤·à¤•à¤¾à¤‚ची यादी आहे. या यादीत असलेलà¥à¤¯à¤¾ शीरà¥à¤·à¤•à¤¾à¤‚चे लेख लिहिता येणार नाहीत.
# शेरा देणà¥à¤¯à¤¾à¤¸à¤¾à¤ à¥€ "#" वापरा.',
'titlewhitelist' => '# ही वापरू शकत असलेलà¥à¤¯à¤¾ शीरà¥à¤·à¤•à¤¾à¤‚ची यादी आहे. शेरा देणà¥à¤¯à¤¾à¤¸à¤¾à¤ à¥€ "#" वापरा',
@@ -1526,7 +1566,7 @@ $messages['nah'] = array(
#InÄ«n ahmo quimati in huÄ“yimachiyÅtlahtÅliztli intlÄ ahmo mopehpena',
);
-/** Norwegian Bokmål (norsk (bokmål)‎)
+/** Norwegian Bokmål (norsk bokmål)
* @author Danmichaelo
* @author Nghtwlkr
* @author Reedy
@@ -1593,7 +1633,7 @@ Verbeter die {{PLURAL:$1|regel|regels}} voordat u de lijst opslaat:',
'right-tboverride-account' => 'Zwarte lijst voor gebruikersnamen negeren',
);
-/** Norwegian Nynorsk (norsk (nynorsk)‎)
+/** Norwegian Nynorsk (norsk nynorsk)
* @author Frokor
* @author Harald Khan
* @author Njardarlogar
@@ -1630,10 +1670,10 @@ $messages['oc'] = array(
'titleblacklist-forbidden-new-account' => 'Lo nom d’utilizaire « $2 » es estat interdich a la creacion.
Correspond a l’entrada seguenta de la lista negra : <code>$1</code>',
'titleblacklist-invalid' => '{{PLURAL:$1|La linha seguenta|Las linhas seguentas}} dins la lista negra dels títols {{PLURAL:$1|es invalida|son invalidas}} : sètz convidat a {{PLURAL:$1|la|las}} corregir abans de salvar.',
- 'right-tboverride' => 'Ignorar la lista negra dels títols', # Fuzzy
+ 'right-tboverride' => "Remplaçar la lista negra dels títols o dels noms d'utilizaires",
);
-/** Oriya (ଓଡ଼ିଆ)
+/** Oriya (ଓଡ଼ିଆ)
* @author Jnanaranjan Sahu
* @author Psubhashish
*/
@@ -1740,10 +1780,11 @@ $messages['pnb'] = array(
* @author Ahmed-Najib-Biabani-Ibrahimkhel
*/
$messages['ps'] = array(
- 'titleblacklist-override' => 'تورليک بابÛزه Ú«Ú¼Ù„',
+ 'titleblacklist-override' => 'تورليک بابÛزه Ú¯Ú¼Ù„',
);
/** Portuguese (português)
+ * @author Cainamarques
* @author Hamilton Abreu
* @author Malafaya
* @author Waldir
@@ -1766,31 +1807,37 @@ O nome corresponde à seguinte entrada da lista negra: <code>$1</code>',
O nome corresponde à seguinte entrada da lista negra: <code>$1</code>',
'titleblacklist-invalid' => '{{PLURAL:$1|A seguinte linha|As seguintes linhas}} da lista negra {{PLURAL:$1|é inválida|são inválidas}}. Por favor, {{PLURAL:$1|corrija-a|corrija-as}} antes de gravar:',
'titleblacklist-override' => 'Ignorar a lista negra',
- 'right-tboverride' => 'Ignorar a lista negra de títulos', # Fuzzy
+ 'right-tboverride' => 'Sobrepor a lista negra de títulos e nomes de utilizador',
'right-tboverride-account' => 'Ignorar a lista negra de nomes de utilizador',
);
/** Brazilian Portuguese (português do Brasil)
+ * @author Cainamarques
* @author Eduardo.mps
* @author Giro720
* @author Luckas
+ * @author 555
*/
$messages['pt-br'] = array(
- 'titleblacklist-desc' => 'Permite a proibição da criação de páginas e contas de utilizadores com títulos específicos através de uma [[MediaWiki:Titleblacklist|lista negra]] e uma [[MediaWiki:Titlewhitelist|lista de exceções]]',
+ 'titleblacklist-desc' => 'Permite que administradores restrinjam a criação de páginas e contas de usuários a partir de uma [[MediaWiki:Titleblacklist|lista negra]] e uma [[MediaWiki:Titlewhitelist|lista de exceções]]',
'titleblacklist' => '# Esta é uma lista negra de títulos. Títulos de páginas e nomes de usuários que sejam filtrados por uma expressão regular desta lista não poderão ser criados.
# Utilize "#" para fazer comentários.
-# Esta lista não é sensível á capitalização por padrão',
- 'titlewhitelist' => '# Esta é uma lista branca de títulos. Utilize "#" para fazer comentários
-# Esta lista não é sensível a capitalização por padrão',
- 'titleblacklist-forbidden-edit' => 'O título "$2" foi impedido de ser criado. Ele se encaixa na seguinte entrada da lista negra: <code>$1</code>',
- 'titleblacklist-forbidden-move' => '"$2" não pode ser movida para "$3" já que "$3" é um título impedido de ser criado. Se encaixa na seguinte entrada da lista-negra: <code>$1</code>',
- 'titleblacklist-forbidden-upload' => 'O arquivo "$2" foi impedido de ser criado. Ele se encaixa na seguinte entrada da lista negra: <code>$1</code>',
- 'titleblacklist-forbidden-new-account' => 'O nome de usuário "$2" foi banido da criação de usuários.
-O nome corresponde à seguinte entrada na lista negra: <code>$1</code>',
- 'titleblacklist-invalid' => '{{PLURAL:$1|A seguinte linha|As seguintes linhas}} da lista negra {{PLURAL:$1|é inválida|são inválidas}}. Por gentileza, {{PLURAL:$1|corrija-a|corrija-as}} antes de salvar:',
+# Esta lista não difere maiúsculas de minúsculas',
+ 'titlewhitelist' => '# Esta é uma lista de títulos permitidos. Utilize "#" para fazer comentários
+# Esta lista não difere maiúsculas de minúsculas',
+ 'titleblacklist-forbidden-edit' => 'O título "$2" foi impedido de ser criado.
+Ele se encaixa na seguinte entrada da lista negra: <code>$1</code>',
+ 'titleblacklist-forbidden-move' => '"$2" não pode ser movida para "$3", já que "$3" é um título impedido de ser criado.
+Se encaixa na seguinte entrada da lista-negra: <code>$1</code>',
+ 'titleblacklist-forbidden-upload' => 'O arquivo nomeado como "$2" foi impedido de ser criado.
+Ele se encaixa na seguinte entrada da lista negra: <code>$1</code>',
+ 'titleblacklist-forbidden-new-account' => 'O nome de usuário "$2" foi banido de ser registrado.
+O nome corresponde na seguinte entrada da lista negra: <code>$1</code>',
+ 'titleblacklist-invalid' => '{{PLURAL:$1|A seguinte linha|As seguintes linhas}} da lista negra {{PLURAL:$1|é inválida|são inválidas}}.
+{{PLURAL:$1|Corrija-a|Corrija-as}} antes de salvar:',
'titleblacklist-override' => 'Ignorar a lista negra.',
- 'right-tboverride' => 'Sobrepor a lista negra de títulos', # Fuzzy
- 'right-tboverride-account' => 'Sobrepor a lista negra de nomes de usuários',
+ 'right-tboverride' => 'Contornar a lista negra de títulos e nomes de usuário',
+ 'right-tboverride-account' => 'Contornar a lista negra de nomes de usuários',
);
/** Quechua (Runa Simi)
@@ -2418,7 +2465,7 @@ $messages['zh-hans'] = array(
# 本页默认ä¸åŒºåˆ†å¤§å°å†™',
'titleblacklist-forbidden-edit' => '标题 "$2" å·²ç»è¢«ç¦æ­¢åˆ›å»ºã€‚它跟以下黑åå•çš„项目é…åˆ: <code>$1</code>',
'titleblacklist-forbidden-move' => '"$2" ä¸å¯ä»¥ç§»åŠ¨åˆ° "$3",由于该标题 "$3" å·²ç»è¢«ç¦æ­¢åˆ›å»ºã€‚它跟以下黑åå•çš„项目é…åˆ: <code>$1</code>',
- 'titleblacklist-forbidden-upload' => '文件å称 "$2" å·²ç»è¢«ç¦æ­¢åˆ›å»ºã€‚它跟以下黑åå•çš„项目é…åˆ: <code>$1</code>',
+ 'titleblacklist-forbidden-upload' => '文件å称“$2â€å·²ç»è¢«ç¦æ­¢åˆ›å»ºã€‚它跟以下黑åå•çš„项目é…åˆï¼š<code>$1</code>',
'titleblacklist-forbidden-new-account' => '用户å“$2â€å·²è¢«é˜»æ­¢åˆ›å»ºã€‚
它匹é…以下黑åå•é¡¹ç›®ï¼š<code>$1</code>',
'titleblacklist-invalid' => '以下在标题黑åå•ä¸Šçš„{{PLURAL:$1|一行|多行}}无效;请在ä¿å­˜å‰æ”¹æ­£{{PLURAL:$1|它|它们}}:',
diff --git a/extensions/TitleBlacklist/TitleBlacklist.list.php b/extensions/TitleBlacklist/TitleBlacklist.list.php
index d197a9c5..cec4dd89 100644
--- a/extensions/TitleBlacklist/TitleBlacklist.list.php
+++ b/extensions/TitleBlacklist/TitleBlacklist.list.php
@@ -175,7 +175,7 @@ class TitleBlacklist {
}
$blacklist = $this->getBlacklist();
foreach ( $blacklist as $item ) {
- if ( $item->matches( $title, $action ) ) {
+ if ( $item->matches( $title->getFullText(), $action ) ) {
if ( $this->isWhitelisted( $title, $action ) ) {
return false;
}
@@ -199,7 +199,7 @@ class TitleBlacklist {
}
$whitelist = $this->getWhitelist();
foreach ( $whitelist as $item ) {
- if ( $item->matches( $title, $action ) ) {
+ if ( $item->matches( $title->getFullText(), $action ) ) {
return true;
}
}
@@ -343,7 +343,7 @@ class TitleBlacklistEntry {
* Check whether a user can perform the specified action
* on the specified Title
*
- * @param $title Title to check
+ * @param $title string to check
* @param $action %Action to check
* @return bool TRUE if the the regex matches the title, and is not overridden
* else false if it doesn't match (or was overridden)
@@ -357,8 +357,17 @@ class TitleBlacklistEntry {
return false;
}
+ if ( isset( $this->mParams['antispoof'] ) && is_callable( 'AntiSpoof::checkUnicodeString' ) ) {
+ list( $ok, $norm ) = AntiSpoof::checkUnicodeString( $title );
+ if ( $ok == "OK" ) {
+ list( $ver, $title ) = explode( ':', $norm, 2 );
+ } else {
+ wfDebugLog( 'TitleBlacklist', 'AntiSpoof could not normalize "' . $title . '".' );
+ }
+ }
+
wfSuppressWarnings();
- $match = preg_match( "/^(?:{$this->mRegex})$/us" . ( isset( $this->mParams['casesensitive'] ) ? '' : 'i' ), $title->getFullText() );
+ $match = preg_match( "/^(?:{$this->mRegex})$/us" . ( isset( $this->mParams['casesensitive'] ) ? '' : 'i' ), $title );
wfRestoreWarnings();
global $wgUser;
@@ -427,6 +436,9 @@ class TitleBlacklistEntry {
if ( preg_match( '/errmsg\s*=\s*(.+)/i', $opt, $matches ) ) {
$options['errmsg'] = $matches[1];
}
+ if ( $opt2 == 'antispoof' ) {
+ $options['antispoof'] = true;
+ }
}
// Process magic words
preg_match_all( '/{{\s*([a-z]+)\s*:\s*(.+?)\s*}}/', $regex, $magicwords, PREG_SET_ORDER );
diff --git a/extensions/TitleBlacklist/TitleBlacklist.php b/extensions/TitleBlacklist/TitleBlacklist.php
index 68fb6778..2bb62b0a 100644
--- a/extensions/TitleBlacklist/TitleBlacklist.php
+++ b/extensions/TitleBlacklist/TitleBlacklist.php
@@ -76,6 +76,10 @@ $wgHooks['CentralAuthAutoCreate'][] = 'TitleBlacklistHooks::centralAuthAutoCreat
$wgHooks['EditFilter'][] = 'TitleBlacklistHooks::validateBlacklist';
$wgHooks['ArticleSaveComplete'][] = 'TitleBlacklistHooks::clearBlacklist';
$wgHooks['UserCreateForm'][] = 'TitleBlacklistHooks::addOverrideCheckbox';
+$wgHooks['UnitTestsList'][] = function( &$files ) {
+ $files += glob( __DIR__ . '/tests/*Test.php' );
+ return true;
+};
$wgResourceModules['mediawiki.api.titleblacklist'] = array(
'scripts' => 'mediawiki.api.titleblacklist.js',
diff --git a/extensions/TitleBlacklist/tests/ApiQueryTitleBlacklistTest.php b/extensions/TitleBlacklist/tests/ApiQueryTitleBlacklistTest.php
index 1f8164e7..344e9996 100644
--- a/extensions/TitleBlacklist/tests/ApiQueryTitleBlacklistTest.php
+++ b/extensions/TitleBlacklist/tests/ApiQueryTitleBlacklistTest.php
@@ -105,6 +105,28 @@ class ApiQueryTitleBlacklistTest extends ApiTestCase {
$listed[0]['titleblacklist']['line'],
'Correct blacklist line is returned'
);
+ }
+
+ /**
+ * Tests integration with the AntiSpoof extension
+ */
+ function testAntiSpoofIntegration() {
+ if ( !class_exists( 'AntiSpoof') ) {
+ $this->markTestSkipped( "This test requires the AntiSpoof extension" );
+ }
+
+ $listed = $this->doApiRequest( array(
+ 'action' => 'titleblacklist',
+ 'tbtitle' => 'AVVVV',
+ 'tbaction' => 'create',
+ 'tbnooverride' => true,
+ ) );
+
+ $this->assertEquals(
+ 'blacklisted',
+ $listed[0]['titleblacklist']['result'],
+ 'Spoofed title is blacklisted'
+ );
}
}
diff --git a/extensions/TitleBlacklist/tests/testSource b/extensions/TitleBlacklist/tests/testSource
index f73d9dd7..235cc671 100644
--- a/extensions/TitleBlacklist/tests/testSource
+++ b/extensions/TitleBlacklist/tests/testSource
@@ -2,3 +2,4 @@
.*[Ff]ail.*
.*[Nn]yancat.* <errmsg=blacklisted-nyancat>
.*evil_acc.* <newaccountonly>
+AW{1,10} <antispoof>
diff --git a/extensions/Vector/.gitreview b/extensions/Vector/.gitreview
deleted file mode 100644
index 8d06d24a..00000000
--- a/extensions/Vector/.gitreview
+++ /dev/null
@@ -1,5 +0,0 @@
-[gerrit]
-host=gerrit.wikimedia.org
-port=29418
-project=mediawiki/extensions/Vector.git
-defaultbranch=master
diff --git a/extensions/Vector/README b/extensions/Vector/README
deleted file mode 100644
index b7737a5b..00000000
--- a/extensions/Vector/README
+++ /dev/null
@@ -1,17 +0,0 @@
-# Vector provides enhancements to the Vector skin
-
-# This extension requires MediaWiki 1.17+ because it makes use of ResourceLoader.
-
-# Example LocalSettings.php additions
-
-require_once( "$IP/extensions/Vector/Vector.php" );
-
-# Before configuring this extension, see Vector.php and become familiar with the initial state and structure of the
-# $wgVectorFeatures configuration variable. Essentially it's an array of arrays, keyed by feature name, each containing
-# global and user keys with boolean values. "global" indicates that it should be turned on for everyone always, while
-# user indicates that users should be allowed to turn it on or off in their user preferences.
-
-# To enable a preference by default but still allow users to disable it in preferences, use something like...
-
-$wgDefaultUserOptions['vector-collapsiblenav'] = 1;
-
diff --git a/extensions/Vector/Vector.hooks.php b/extensions/Vector/Vector.hooks.php
deleted file mode 100644
index 50cec461..00000000
--- a/extensions/Vector/Vector.hooks.php
+++ /dev/null
@@ -1,174 +0,0 @@
-<?php
-/**
- * Hooks for Vector extension
- *
- * @file
- * @ingroup Extensions
- */
-
-class VectorHooks {
-
- /* Protected Static Members */
-
- protected static $features = array(
- 'collapsiblenav' => array(
- 'preferences' => array(
- 'vector-collapsiblenav' => array(
- 'type' => 'toggle',
- 'label-message' => 'vector-collapsiblenav-preference',
- 'section' => 'rendering/advancedrendering',
- ),
- ),
- 'requirements' => array(
- 'vector-collapsiblenav' => true,
- ),
- 'configurations' => array(
- 'wgCollapsibleNavBucketTest',
- 'wgCollapsibleNavForceNewVersion',
- ),
- 'modules' => array( 'ext.vector.collapsibleNav' ),
- ),
- 'collapsibletabs' => array(
- 'modules' => array( 'ext.vector.collapsibleTabs' ),
- ),
- 'expandablesearch' => array(
- 'requirements' => array( 'vector-simplesearch' => true ),
- 'modules' => array( 'ext.vector.expandableSearch' ),
- ),
- 'footercleanup' => array(
- 'modules' => array( 'ext.vector.footerCleanup' ),
- ),
- 'sectioneditlinks' => array(
- 'modules' => array( 'ext.vector.sectionEditLinks' ),
- 'configurations' => array(
- 'wgVectorSectionEditLinksBucketTest',
- 'wgVectorSectionEditLinksLotteryOdds',
- 'wgVectorSectionEditLinksExperiment',
- ),
- 'requirements' => array(
- 'vector-noexperiments' => false,
- ),
- ),
- 'experiments' => array(
- 'preferences' => array(
- 'vector-noexperiments' => array(
- 'type' => 'toggle',
- 'label-message' => 'vector-noexperiments-preference',
- 'section' => 'rendering/advancedrendering',
- ),
- ),
- ),
- );
-
- /* Protected Static Methods */
-
- protected static function isEnabled( $name ) {
- global $wgVectorFeatures, $wgUser;
-
- // Features with global set to true are always enabled
- if ( !isset( $wgVectorFeatures[$name] ) || $wgVectorFeatures[$name]['global'] ) {
- return true;
- }
- // Features with user preference control can have any number of preferences to be specific values to be enabled
- if ( $wgVectorFeatures[$name]['user'] ) {
- if ( isset( self::$features[$name]['requirements'] ) ) {
- foreach ( self::$features[$name]['requirements'] as $requirement => $value ) {
- // Important! We really do want fuzzy evaluation here
- if ( $wgUser->getOption( $requirement ) != $value ) {
- return false;
- }
- }
- }
- return true;
- }
- // Features controlled by $wgVectorFeatures with both global and user set to false are awlways disabled
- return false;
- }
-
- /* Static Methods */
-
- /**
- * BeforePageDisplay hook
- *
- * Adds the modules to the page
- *
- * @param $out OutputPage output page
- * @param $skin Skin current skin
- */
- public static function beforePageDisplay( $out, $skin ) {
- if ( $skin instanceof SkinVector ) {
- // Add modules for enabled features
- foreach ( self::$features as $name => $feature ) {
- if ( isset( $feature['modules'] ) && self::isEnabled( $name ) ) {
- $out->addModules( $feature['modules'] );
- }
- }
- }
- return true;
- }
-
- /**
- * GetPreferences hook
- *
- * Adds Vector-releated items to the preferences
- *
- * @param $user User current user
- * @param $defaultPreferences array list of default user preference controls
- */
- public static function getPreferences( $user, &$defaultPreferences ) {
- global $wgVectorFeatures;
-
- foreach ( self::$features as $name => $feature ) {
- if (
- isset( $feature['preferences'] ) &&
- ( !isset( $wgVectorFeatures[$name] ) || $wgVectorFeatures[$name]['user'] )
- ) {
- foreach ( $feature['preferences'] as $key => $options ) {
- $defaultPreferences[$key] = $options;
- }
- }
- }
- return true;
- }
-
- /**
- * ResourceLoaderGetConfigVars hook
- *
- * Adds enabled/disabled switches for Vector modules
- */
- public static function resourceLoaderGetConfigVars( &$vars ) {
- global $wgVectorFeatures;
-
- $configurations = array();
- foreach ( self::$features as $name => $feature ) {
- if (
- isset( $feature['configurations'] ) &&
- ( !isset( $wgVectorFeatures[$name] ) || self::isEnabled( $name ) )
- ) {
- foreach ( $feature['configurations'] as $configuration ) {
- global $$configuration;
- $configurations[$configuration] = $$configuration;
- }
- }
- }
- if ( count( $configurations ) ) {
- $vars = array_merge( $vars, $configurations );
- }
- return true;
- }
-
- /**
- * @param $vars array
- * @return bool
- */
- public static function makeGlobalVariablesScript( &$vars ) {
- // Build and export old-style wgVectorEnabledModules object for back compat
- $enabledModules = array();
- foreach ( self::$features as $name => $feature ) {
- $enabledModules[$name] = self::isEnabled( $name );
- }
-
- $vars['wgVectorEnabledModules'] = $enabledModules;
- return true;
- }
-}
diff --git a/extensions/Vector/Vector.i18n.php b/extensions/Vector/Vector.i18n.php
deleted file mode 100644
index 2c4e4b41..00000000
--- a/extensions/Vector/Vector.i18n.php
+++ /dev/null
@@ -1,2467 +0,0 @@
-<?php
-/**
- * Internationalisation for Vector extension
- *
- * @file
- * @ingroup Extensions
- */
-
-$messages = array();
-
-/** English
- * @author Trevor Parscal
- */
-$messages['en'] = array(
- 'vector' => 'UI improvements for Vector',
- 'vector-desc' => 'Enhances the user interface when using the Vector skin',
- 'vector-collapsiblenav-preference' => 'Enable collapsing of items in the sidebar in Vector skin',
- 'vector-collapsiblenav-more' => 'More languages',
- 'vector-simplesearch-search' => 'Search',
- 'vector-simplesearch-containing' => 'containing...',
- 'vector-noexperiments-preference' => 'Exclude me from feature experiments',
- 'vector-footercleanup-transclusion' => 'This page contains {{PLURAL:$1|transclusion|transclusions}} of {{PLURAL:$1|one other page|$1 other pages}}.',
- 'vector-footercleanup-templates' => 'View templates on this page',
- 'vector-footercleanup-categories' => 'View hidden categories on this page',
-);
-
-/** Message documentation (Message documentation)
- * @author Fryed-peach
- * @author Lloffiwr
- * @author Nemo bis
- * @author Shirayuki
- * @author Srtxg
- * @author Umherirrender
- */
-$messages['qqq'] = array(
- 'vector' => 'UI means User Interface. Vector is the name of an interface skin.',
- 'vector-desc' => '{{desc|name=Vector|url=http://www.mediawiki.org/wiki/Extension:Vector}}',
- 'vector-collapsiblenav-preference' => 'The message refers to the sidebar, whose sections are collapsible in Vector skin (some of them collapsed by default and some no); the preference disables collapsing entirely and is among "Advanced options" in the "Appearence" section.',
- 'vector-editwarning-warning' => "{{doc-important|Do ''not'' use <nowiki>{{int:prefs-editing}}</nowiki> for \"Editing\". It is forbidden in this message, see [[mwr:68405]].}}
-
-but you can see the text of that button here: {{msg-mw|Prefs-editing}}",
- 'vector-simplesearch-search' => 'Greyed out default text in the simple search box in the Vector skin. (It disappears and lets the user enter the requested search terms when the search box receives focus.)
-
-{{Identical|Search}}',
- 'vector-simplesearch-containing' => 'Label used in the special item of the search suggestions list which gives the user an option to perform a full text search for the term.',
- 'vector-noexperiments-preference' => 'An option in [[Special:Preferences]]',
- 'vector-footercleanup-transclusion' => 'Label used in the footer while editing to display the count of how many transclusions a page contains.',
-);
-
-/** Achinese (Acèh)
- * @author Si Gam Acèh
- */
-$messages['ace'] = array(
- 'vector-simplesearch-search' => 'Mita',
-);
-
-/** Afrikaans (Afrikaans)
- * @author Adriaan
- * @author Naudefj
- * @author පසිඳු කà·à·€à·’න්ද
- */
-$messages['af'] = array(
- 'vector' => 'Gebruikerskoppelvlak-verbeteringe vir Vektor',
- 'vector-desc' => 'Verbeter die gebruikerskoppelvlak-elemente van die Vektor omslag (skin).', # Fuzzy
- 'vector-collapsiblenav-preference' => 'Inklapbare navigasiespyskaart by die gebruik van Vector toelaat',
- 'vector-collapsiblenav-more' => 'Meer tale',
- 'vector-editwarning-warning' => 'As u hierdie bladsy verlaat, verloor u moontlik die wysigings wat u aangebring het.
-Indien u aangemeld is, kan u hierdie waarskuwing in die {{int:prefs-editing}}"-afdeling van u voorkeure afskakel.',
- 'vector-editwarning-preference' => "Waarsku my as ek 'n gewysigde bladsy verlaat alvorens dit gestoor is",
- 'vector-simplesearch-search' => 'Soek',
- 'vector-simplesearch-containing' => 'bevat...',
- 'vector-noexperiments-preference' => 'Verban my uit funksie eksperimente',
-);
-
-/** Gheg Albanian (Gegë)
- * @author Mdupont
- */
-$messages['aln'] = array(
- 'vector' => 'përmirësime UI për Vektor',
- 'vector-desc' => 'Në elementet përmirëson ndërfaqen e përdoruesit të lëkurës Vektor.', # Fuzzy
- 'vector-collapsiblenav-preference' => 'Aktivizo paloset la navigacion menu', # Fuzzy
- 'vector-editwarning-warning' => 'Duke e lënë këtë faqe mund të bëjë që ju të humbni ndonjë ndryshim që keni bërë. Nëse ju jeni regjistruar, ju mund ta çaktivizoni këtë paralajmërim në "Tue redaktue" seksionin e preferencave tuaja.',
- 'vector-editwarning-preference' => 'Paralajmëron mua kur unë të lë një redakto faqe me ndryshimet e para shpëtimit',
- 'vector-simplesearch-search' => 'Kërkim',
- 'vector-simplesearch-containing' => 'përmban ...',
-);
-
-/** Amharic (አማርኛ)
- * @author Codex Sinaiticus
- */
-$messages['am'] = array(
- 'vector-simplesearch-search' => 'áˆáˆáŒ',
- 'vector-simplesearch-containing' => 'በመጣጥáŽá‰½ ይዘት ለመáˆáˆáŒ...',
-);
-
-/** Aragonese (aragonés)
- * @author Juanpabl
- */
-$messages['an'] = array(
- 'vector' => "Milloras d'a interficie ta Vector",
- 'vector-desc' => "Milloras en os elementos d'interficie d'usuario de l'aparencia Vector.", # Fuzzy
- 'vector-collapsiblenav-preference' => "Activar a opción de plegar os menús de navegación en l'aparencia Vector",
- 'vector-collapsiblenav-more' => 'Más luengas',
- 'vector-editwarning-warning' => "Si sale d'ista pachina perderá totz os cambios que haiga feito. Si tiene una cuenta d'usuario, puet eliminar ista alvertencia en a sección «Caixa d'edición» d'as suyas preferencies.",
- 'vector-editwarning-preference' => "Alvertir-me quan salga d'una pachina d'edición sin alzar os cambios",
- 'vector-simplesearch-search' => 'Mirar',
- 'vector-simplesearch-containing' => 'que contién...',
- 'vector-noexperiments-preference' => "Excluir-me d'as caracteristicas experimentals",
-);
-
-/** Arabic (العربية)
- * @author Aiman titi
- * @author Alexknight12
- * @author DRIHEM
- * @author Meno25
- * @author Mido
- * @author OsamaK
- */
-$messages['ar'] = array(
- 'vector' => 'تحسينات واجهة المستخدم Ù„Ùكتور',
- 'vector-desc' => 'تحسينات ÙÙŠ عناصر واجهة المستخدم لواجهة Ùكتور.',
- 'vector-collapsiblenav-preference' => 'مكّن طي العناصر ÙÙŠ قائمة التصÙØ­ ÙÙŠ واجهة Ùكتور',
- 'vector-collapsiblenav-more' => 'لغات أخرى',
- 'vector-editwarning-warning' => 'قد تتسبب مغادرة هذه الصÙحة بخسارتك لأي تغييرات قمت بها.
-يمكنك تعطيل هذا التحذير إذا كنت والجلًا ÙÙŠ قسم "التحرير" ÙÙŠ تÙضيلاتك.',
- 'vector-editwarning-preference' => 'حذّرني عندما أغادر تحرير صÙحة ذات تغييرات غير محÙوظة',
- 'vector-simplesearch-search' => 'بحث',
- 'vector-simplesearch-containing' => 'يحتوي...',
- 'vector-noexperiments-preference' => 'استبعدني من تجارب الخاصية',
- 'vector-footercleanup-transclusion' => 'هذه الصÙحة تحتوي على {{PLURAL:$1تضمين|تضمينات}} لـ {{PLURAL:$1|صÙحة واحدة أخرى|$1 صÙحات أخرى}}.',
- 'vector-footercleanup-templates' => 'عرض القوالب ÙÙŠ هذه الصÙحة',
-);
-
-/** Aramaic (ÜܪܡÜÜ)
- * @author Basharh
- */
-$messages['arc'] = array(
- 'vector-editwarning-warning' => 'ÜÜ¢ ܫܒܩܬ ܦÜÜ¬Ü Ü—Ü•Ü Ü¡Ü¬Ü¡Ü¨ÜÜ¢Ü¬Ü ÜÜܬÜÜ— ܕܚܣܪܬ ÜŸÜ  Ü«Ü˜ÜšÜ Ü¦ÌˆÜ Ü•Ü¥Ü’Üܕܬ ܗܪܟÜ.
-ܡܨܬ ܕܬܒܛܠ Ü™Ü˜Ü—ÜªÜ Ü—Ü¢Ü ÜÜ¢ ܥܠÜÜ Ü ÜÜܬÜÜŸ Ü’Ü¡Ü¢Ü¬Ü Ü•"ܫܚܠܦܬÜ" ܒܨܒÜÜ¢Üܘܬ̈Ü.',
- 'vector-editwarning-preference' => 'ܙܗܪ Ü Ü ÜÜ¡Ü¬Ü Ü«Ü’Ü© ÜÜ¢Ü Ü¦ÜÜ¬Ü Ü•Ü«Ü˜ÜšÜ Ü¦Ü Ü•ÜÜܬ Ü’Ü— Ü«Ü˜ÜšÜ Ü¦ÌˆÜ Ü Ü Ü Ü’Üܟ̈Ü',
- 'vector-simplesearch-search' => 'ܒܨÜ',
- 'vector-simplesearch-containing' => 'ܬܚܒܘܫ...',
- 'vector-footercleanup-templates' => 'ÜšÜ™Ü Ü©Ü Ü’ÌˆÜ Ü’Ü¦ÜÜ¬Ü Ü—Ü•Ü',
- 'vector-footercleanup-categories' => 'ÜšÜ™Ü Ü£Ü•ÜªÌˆÜ Ü›Ü˜Ü«ÜÌˆÜ Ü’Ü¦ÜÜ¬Ü Ü—Ü•Ü',
-);
-
-/** Egyptian Spoken Arabic (مصرى)
- * @author Dudi
- * @author Meno25
- */
-$messages['arz'] = array(
- 'vector' => 'تحسينات واجهه المستخدم Ù„Ùكتور',
- 'vector-desc' => 'تحسينات ÙÙ‰ عناصر واجهه المستخدم لواجهه Ùكتور.', # Fuzzy
- 'vector-collapsiblenav-preference' => 'خلّى الليستات بتاعة مينيو الاستكشا٠تبان مقÙوله ÙÙ‰ Vector skin',
- 'vector-collapsiblenav-more' => 'لغات اكتر',
- 'vector-editwarning-warning' => 'لو سيبت الصÙحه دى ممكن يخلّيك تضيّع اى تغييرات عملتها.
-لو انت مسجّل دخولك, ممكن تعطّل التحذير ده من الجزء بتاع "تعديل" ÙÙ‰ تÙضيلاتك.',
- 'vector-editwarning-preference' => 'حذّرنى لما اسيب صÙحة تعديل Ùيها تغييرات مش متسييڤه',
- 'vector-simplesearch-search' => 'تدوير',
- 'vector-simplesearch-containing' => 'جوّاه...',
-);
-
-/** Assamese (অসমীয়া)
- * @author Bishnu Saikia
- * @author Gitartha.bordoloi
- */
-$messages['as'] = array(
- 'vector' => 'ভেকà§à¦Ÿà§°à§° বাবে বà§à¦¯à§±à¦¹à¦¾à§°à¦•à¦¾à§°à§€ যোগাযোগৰ উনà§à¦¨à¦¤à¦¿ সাধন',
- 'vector-desc' => "ভেকà§à¦Ÿà§° আৱৰণৰ বà§à¦¯à§±à¦¹à¦¾à§°à¦•à¦¾à§°à§€à§° ইণà§à¦Ÿà¦¾à§°à¦«à§‡'চ উপাদানৰ উনà§à¦¨à¦¤à¦¿ সাধন কৰে।",
- 'vector-collapsiblenav-preference' => 'ভেকà§à¦Ÿà§° আৱৰণত ভাà¦à¦œà¦¯à§à¦•à§à¦¤ নেভিগছন মেনৠসকà§à§°à¦¿à¦¯à¦¼ কৰক',
- 'vector-collapsiblenav-more' => 'অধিক ভাষা',
- 'vector-editwarning-warning' => 'à¦à¦‡ পৃষà§à¦ à¦¾à¦Ÿà§‹ à¦à§°à¦¿à¦²à§‡ আপà§à¦¨à¦¿ কৰা পৰিবৰà§à¦¤à¦¨à¦¸à¦®à§‚হ হেৰাব পাৰে। যদি আপà§à¦¨à¦¿ পà§à§°à§±à§‡à¦¶ কৰা অৱসà§à¦¥à¦¾à¦¤ আছে, আপà§à¦¨à¦¿ à¦à¦‡ সতৰà§à¦•à¦¬à¦¾à§°à§à¦¤à¦¾à¦• আপোনাৰ পছনà§à¦¦à¦¸à¦®à§‚হৰ "সমà§à¦ªà¦¾à¦¦à¦¨à¦¾" অংশত অসামৰà§à¦¥à¦¬à¦¾à¦¨ কৰিব পাৰিব।',
- 'vector-editwarning-preference' => 'সালসলনি সংৰকà§à¦·à¦£ নকৰাকৈ সমà§à¦ªà¦¾à¦¦à¦¨à¦¾ পৃষà§à¦ à¦¾ তà§à¦¯à¦¾à¦—ৰ সময়ত মোক সাৱধান কৰক',
- 'vector-simplesearch-search' => 'সনà§à¦§à¦¾à¦¨ কৰক',
- 'vector-simplesearch-containing' => 'যি আছে...',
- 'vector-noexperiments-preference' => 'ভৱিষà§à¦¯à¦¤à§° পৰীকà§à¦·à¦¾à¦¬à§‹à§°à§° পৰা মোক ৰেহাই দিয়ক',
- 'vector-footercleanup-transclusion' => 'à¦à¦‡ পৃষà§à¦ à¦¾à¦Ÿà§‹à§±à§‡ {{PLURAL:$1|অনà§à¦¯ à¦à¦Ÿà¦¾ পৃষà§à¦ à¦¾à§°|$1 অনà§à¦¯ পৃষà§à¦ à¦¾à¦¸à¦®à§‚হৰ}} {{PLURAL:$1|বেষà§à¦Ÿà¦¨|বেষà§à¦Ÿà¦¨à¦¸à¦®à§‚হ}} অনà§à¦¤à§°à§à¦­à§à¦•à§à¦¤ কৰে।',
- 'vector-footercleanup-templates' => 'à¦à¦‡ পৃষà§à¦ à¦¾à§° সংলগà§à¦¨ সাà¦à¦š চাওক',
- 'vector-footercleanup-categories' => 'à¦à¦‡ পৃষà§à¦ à¦¾à¦¤ সনà§à¦¨à¦¿à¦¬à¦¿à¦·à§à¦Ÿ অদৃশà§à¦¯ পৃষà§à¦ à¦¾à¦¸à¦®à§‚হ চাওক',
-);
-
-/** Asturian (asturianu)
- * @author Xuacu
- */
-$messages['ast'] = array(
- 'vector' => "Meyores de la interfaz d'usuariu pa Vector",
- 'vector-desc' => "Ameyora la interfaz d'usuariu al usar l'aspeutu Vector.",
- 'vector-collapsiblenav-preference' => 'Activar anubrir elementos nel panel llateral del aspeutu Vector',
- 'vector-collapsiblenav-more' => 'Más llingües',
- 'vector-editwarning-warning' => 'Salir d\'esta páxina pue facer que se pierda cualesquier cambiu fechu.
-Si aniciasti sesión, puedes desactivar esti avisu na seición "Edición" de les tos preferencies.',
- 'vector-editwarning-preference' => "Avisame cuando salga d'una páxina d'edición con cambios ensin guardar",
- 'vector-simplesearch-search' => 'Guetar',
- 'vector-simplesearch-containing' => 'que contién...',
- 'vector-noexperiments-preference' => 'Escluíme de carauterístiques esperimentales',
- 'vector-footercleanup-transclusion' => "Esta páxina contién {{PLURAL:$1|una tresclusión|tresclusiones}} {{PLURAL:$1|d'otra páxina|d'otres $1 páxines}}.",
- 'vector-footercleanup-templates' => "Ver los modelos d'esta páxina",
- 'vector-footercleanup-categories' => "Ver les categoríes anubríes d'esta páxina",
-);
-
-/** Azerbaijani (azərbaycanca)
- * @author PPerviz
- * @author Vugar 1981
- */
-$messages['az'] = array(
- 'vector-collapsiblenav-more' => 'Çoxlu dillər',
- 'vector-simplesearch-search' => 'Axtar',
-);
-
-/** South Azerbaijani (تورکجه)
- * @author Amir a57
- * @author E THP
- * @author Ebrahimi-amir
- * @author Mousa
- */
-$messages['azb'] = array(
- 'vector-collapsiblenav-more' => 'آیری دیل‌لر',
- 'vector-editwarning-preference' => 'دَییشدیرمه صحیÙه‌سینده چیخیش زامانی، آچیق Ùˆ قئید اولمایان دَییشدیرمه صحیÙÙ‡ وارسا منه هشدار وئریلسین',
- 'vector-simplesearch-search' => 'آختار',
-);
-
-/** Bashkir (башҡортÑа)
- * @author Assele
- */
-$messages['ba'] = array(
- 'vector' => '"Векторлы" күренешен Ñҡшыртыуҙар',
- 'vector-desc' => '"Векторлы" күренешенең ҡулланыуÑÑ‹ интерфейÑында Ñҡшыртыуҙар.', # Fuzzy
- 'vector-collapsiblenav-preference' => '"Векторлы" күренешендә һул ÑÒ¡ менюла блоктарҙы төрөргә Ñ€Ó©Ñ…Ñәт итергә',
- 'vector-collapsiblenav-more' => 'Күберәк телдәр',
- 'vector-editwarning-warning' => 'ИкенÑе биткә күÑеү һеҙ индергән үҙгәрештәрҙең юғалыуына килтереүе мөмкин.
-Әгәр ÑиÑтемала танылыу үтһәгеҙ, көйләүҙәрегеҙ битенең "Мөхәррирләү" бүлегендә был киҫәтеүҙе һүндерә алаһығыҙ.',
- 'vector-editwarning-preference' => 'Мөхәррирләү битенән үҙгәртеүҙәрҙе һаҡламайынÑа Ñыҡҡан ваҡытта мине киҫәтергә',
- 'vector-simplesearch-search' => 'Эҙләү',
- 'vector-simplesearch-containing' => 'ÑÑтәлегендә...',
- 'vector-noexperiments-preference' => 'Һынау Ó©Ñөн мөмкинлектәр тәҡдим итмәҫкә',
-);
-
-/** Bavarian (Boarisch)
- * @author Mucalexx
- * @author ✓
- */
-$messages['bar'] = array(
- 'vector' => "Vabesserrungen fyr d' Vector-Benutzerowerflächen",
- 'vector-desc' => 'Vabesserrungen an da Vektor-Benutzerowerflächen', # Fuzzy
- 'vector-collapsiblenav-preference' => 'Zåmmkloppm vo Elemente im Navigazionsmenü vo da Benutzerowerflächen Vector aktivirn',
- 'vector-collapsiblenav-more' => 'Weiderne Sproochen',
- 'vector-editwarning-warning' => "'s Valossen vo derer Seiten kå dodazua fyrn, daas d' Änderrungen valurn geengan.
-Ois ågmödter Benutzer kå's Åzoang vo derer Warnung im \"Beorweiten\"-Bereich vo de Eistellungen obgschoiden wern.",
- 'vector-editwarning-preference' => ' A Warung geem, sofern a zur da Beorweitung geffnate Seiten valossen werd, de ned gspeicherde Änderrungen enthoit.',
- 'vector-simplesearch-search' => 'Suach',
- 'vector-simplesearch-containing' => 'Voitextsuach noch ...',
- 'vector-noexperiments-preference' => 'Ned an Funkzions-Experimenten teilnemmer',
-);
-
-/** Belarusian (беларуÑкаÑ)
- * @author Maksim L.
- */
-$messages['be'] = array(
- 'vector' => 'ПалÑпшае інтÑрфÑÐ¹Ñ Ð´Ð»Ñ ÐºÐ°Ð¶ÑƒÑ…Ð° Vector',
- 'vector-desc' => 'ПалÑпшае Ñлементы інтÑрфÑйÑу ўдзельніка Ð´Ð»Ñ ÐºÐ°Ð¶ÑƒÑ…Ð° Vector', # Fuzzy
- 'vector-collapsiblenav-preference' => 'Уключыць згортванне блокаў у навігацыйным меню Ð´Ð»Ñ ÐºÐ°Ð¶ÑƒÑ…Ð° Vector',
- 'vector-collapsiblenav-more' => 'Болей моваў',
- 'vector-editwarning-warning' => 'Выхад з гÑтай Ñтаронкі прывÑдзе да Ñтраты правак, ÑÐºÑ–Ñ Ð²Ñ‹ зрабілі.
-Калі Ð’Ñ‹ зарÑгіÑÑ‚Ñ€Ð°Ð²Ð°Ð½Ñ‹Ñ Ñž ÑÑ–ÑÑ‚Ñме, Ð’Ñ‹ можаце адключыць гÑта папÑÑ€Ñджанне Ñž закладцы "Праца" Вашых наÑтаўленнÑÑž.',
- 'vector-editwarning-preference' => 'ПапÑÑ€Ñдзіць мÑне, калі Ñ Ð¿Ð°ÐºÑ–Ð´Ð°ÑŽ Ñтаронку з незахаванымі праўкамі',
- 'vector-simplesearch-search' => 'ЗнайÑці',
- 'vector-simplesearch-containing' => 'змÑшчае...',
-);
-
-/** Belarusian (TaraÅ¡kievica orthography) (беларуÑÐºÐ°Ñ (тарашкевіца)‎)
- * @author EugeneZelenko
- * @author Jim-by
- * @author Wizardist
- * @author Zedlik
- */
-$messages['be-tarask'] = array(
- 'vector' => 'ПалÑпшÑньні інтÑрфÑйÑу Ð´Ð»Ñ Ð°Ñ„Ð°Ñ€Ð¼Ð»ÐµÐ½ÑŒÐ½Ñ Â«Ð’Ñктар»',
- 'vector-desc' => 'ПалÑпшае ÑлемÑнты інтÑрфÑйÑу карыÑтальніка Ð´Ð»Ñ Ð°Ñ„Ð°Ñ€Ð¼Ð»ÐµÐ½ÑŒÐ½Ñ Â«Ð’Ñктар»',
- 'vector-collapsiblenav-preference' => 'Дазволіць згортваньне блёкаў у навігацыйным мÑню Ð´Ð»Ñ Ð°Ñ„Ð°Ñ€Ð¼Ð»ÐµÐ½ÑŒÐ½Ñ Â«Ð’Ñктар»',
- 'vector-collapsiblenav-more' => 'Болей моваў',
- 'vector-editwarning-warning' => 'УÑе Ð·Ñ€Ð¾Ð±Ð»ÐµÐ½Ñ‹Ñ Ð’Ð°Ð¼Ñ– зьмены могуць быць ÑтрачаныÑ, калі Ð’Ñ‹ пакінеце гÑтую Ñтаронку.
-Калі Ð’Ñ‹ ўвайшлі Ñž ÑÑ‹ÑÑ‚Ñму, Ð’Ñ‹ можаце адключыць гÑтае папÑÑ€Ñджаньне у ÑÑкцыі «РÑдагаваньне» Вашых наладаў.',
- 'vector-editwarning-preference' => 'ПапÑÑ€Ñджваць мÑне, калі Ñ Ð±ÑƒÐ´Ñƒ пакідаць Ñтаронку Ñ€ÑÐ´Ð°Ð³Ð°Ð²Ð°Ð½ÑŒÐ½Ñ Ð·ÑŒ незахаванымі зьменамі',
- 'vector-simplesearch-search' => 'Пошук',
- 'vector-simplesearch-containing' => 'утрымлівае...',
- 'vector-noexperiments-preference' => 'Ðе прапаноўваць ÑкÑпÑрымÑÐ½Ñ‚Ð°Ð»ÑŒÐ½Ñ‹Ñ Ð¼Ð°Ð³Ñ‡Ñ‹Ð¼Ð°Ñьці',
- 'vector-footercleanup-transclusion' => 'ГÑÑ‚Ð°Ñ Ñтаронка ўключае {{PLURAL:$1|адну іншую Ñтаронку|$1 Ñ–Ð½ÑˆÑ‹Ñ Ñтаронкі|$1 іншых Ñтаронак}}.',
- 'vector-footercleanup-templates' => 'Паказаць шаблёны на гÑтай Ñтаронцы',
- 'vector-footercleanup-categories' => 'Паказаць ÑÑ…Ð°Ð²Ð°Ð½Ñ‹Ñ ÐºÐ°Ñ‚Ñгорыі да гÑтай Ñтаронкі',
-);
-
-/** Bulgarian (българÑки)
- * @author DCLXVI
- * @author Spiritia
- * @author Stanqo
- * @author Turin
- */
-$messages['bg'] = array(
- 'vector' => 'ÐŸÐ¾Ð´Ð¾Ð±Ñ€ÐµÐ½Ð¸Ñ Ð½Ð° потребителÑÐºÐ¸Ñ Ð¸Ð½Ñ‚ÐµÑ€Ñ„ÐµÐ¹Ñ Ð·Ð° облик Вектор',
- 'vector-desc' => 'ПодобрÑва елементите от потребителÑÐºÐ¸Ñ Ð¸Ð½Ñ‚ÐµÑ€Ñ„ÐµÐ¹Ñ Ð½Ð° облик Вектор.', # Fuzzy
- 'vector-collapsiblenav-preference' => 'Включване на Ñгъваемо/разгъваемо меню за Ð½Ð°Ð²Ð¸Ð³Ð°Ñ†Ð¸Ñ Ð² облика Vector',
- 'vector-collapsiblenav-more' => 'Още езици',
- 'vector-editwarning-warning' => 'Ðко излезете от тази Ñтраница, може да загубите вÑички незапазени промени, които Ñте направили.
-Ðко Ñте влезли в ÑиÑтемата, можете да изключите това предупреждение през меню "Редактиране" във вашите лични наÑтройки.',
- 'vector-editwarning-preference' => 'Предупреждаване при опит за напуÑкане на Ñтраница, отворена в режим на редактиране, без да Ñа запазени промените',
- 'vector-simplesearch-search' => 'ТърÑене',
- 'vector-noexperiments-preference' => 'Ðе Ð¶ÐµÐ»Ð°Ñ Ð´Ð° учаÑтвам в бъдещи екÑперименти',
- 'vector-footercleanup-templates' => 'Преглеждане на шаблоните в Ñтраницата',
- 'vector-footercleanup-categories' => 'Показване на Ñкритите категории за тази Ñтраница',
-);
-
-/** Banjar (Bahasa Banjar)
- * @author Ezagren
- */
-$messages['bjn'] = array(
- 'vector-collapsiblenav-more' => 'Labih banyak bahasa',
- 'vector-editwarning-preference' => 'Ingatakan ulun pabila maninggalakan tungkaran pambabakan sabalum manyimpan parubahan',
- 'vector-simplesearch-search' => 'Gagai',
- 'vector-simplesearch-containing' => 'isian ...',
-);
-
-/** Bengali (বাংলা)
- * @author Bellayet
- * @author Nasir8891
- * @author Wikitanvir
- */
-$messages['bn'] = array(
- 'vector' => 'ভেকà§à¦Ÿà¦°à§‡à¦° জনà§à¦¯ বà§à¦¯à¦¬à¦¹à¦¾à¦°à¦•à¦¾à¦°à§€ ইনà§à¦Ÿà¦¾à¦°à¦«à§‡à¦¸à§‡à¦° উনà§à¦¨à¦¤à¦¿ সাধন',
- 'vector-desc' => 'ভেকà§à¦Ÿà¦° সà§à¦•à¦¿à¦¨à§‡à¦° ইনà§à¦Ÿà¦¾à¦°à¦«à§‡à¦¸ উপাদানের উনà§à¦¨à¦¤à¦¿ সাধন', # Fuzzy
- 'vector-collapsiblenav-preference' => 'ভেকà§à¦Ÿà¦° সà§à¦•à¦¿à¦¨à§‡ ভাà¦à¦œà¦¯à§‹à¦—à§à¦¯ নেভিগেশন মেনৠসকà§à¦°à¦¿à¦¯à¦¼ করো',
- 'vector-collapsiblenav-more' => 'আরও ভাষা',
- 'vector-editwarning-warning' => 'à¦à¦‡ পাতাটি তà§à¦¯à¦¾à¦— করলে আপনার আপনার করা পরিবরà§à¦¤à¦¨à¦—à§à¦²à§‹ হারিয়ে যেতে পারে।
-আপনি যদি লগইন করা থাকেন, আপনি à¦à¦‡ সতরà§à¦•à§€à¦•à¦°à¦£ বারà§à¦¤à¦¾à¦Ÿà¦¿ আপনার পছনà§à¦¦à§‡à¦° "সমপাদনা" অনà§à¦šà§à¦›à§‡à¦¦ থেকে নিসà§à¦•à§à¦°à¦¿à¦¯à¦¼ করতে পারেন।',
- 'vector-editwarning-preference' => 'অসংরকà§à¦·à¦¿à¦¤ পরিবরà§à¦¤à¦¨ সহ কোনো পাতা তà§à¦¯à¦¾à¦—ের সময় সাবধান করো',
- 'vector-simplesearch-search' => 'অনà§à¦¸à¦¨à§à¦§à¦¾à¦¨',
- 'vector-simplesearch-containing' => 'যা আছে...',
- 'vector-noexperiments-preference' => 'বৈশিষà§à¦Ÿ পরীকà§à¦·à¦¾à¦° তালিকা থেকে আমাকে বাদ দেয়া হোক',
-);
-
-/** Bishnupria Manipuri (বিষà§à¦£à§à¦ªà§à¦°à¦¿à¦¯à¦¼à¦¾ মণিপà§à¦°à§€)
- * @author Usingha
- */
-$messages['bpy'] = array(
- 'vector' => 'ভেকà§à¦Ÿà¦°à¦° কা আতাকà§à¦°à¦¾à¦° ইনà§à¦Ÿà¦¾à¦°à¦«à§‡à¦¸à¦¹à¦¾à¦° উনà§à¦¨à¦¤à¦¿ করানিহান',
- 'vector-desc' => 'ভেকà§à¦Ÿà¦° সà§à¦•à¦¿à¦¨à¦° ইনà§à¦Ÿà¦¾à¦°à¦«à§‡à¦¸ মাথেলর উনà§à¦¨à¦¤à¦¿ করানি।', # Fuzzy
- 'vector-collapsiblenav-preference' => 'ভেকà§à¦Ÿà¦° সà§à¦•à¦¿à¦¨à¦¹à¦¾à¦¨à¦¾à¦° থিপকরানি à¦à¦•à¦°à¦¬ নেভিগেশন মেনৠথা কর',
- 'vector-collapsiblenav-more' => 'আরাকউ ঠার',
- 'vector-editwarning-warning' => 'পাতা à¦à¦¹à¦¾à¦¨ বেলিয়া গেলেগা তি সিলকরিসত অতা মাঙà§à¦‡à¦¤à§‡ পারে।
-তি লগইন করিসতগ ইলে, à¦à¦°à§‡ সিঙকরানির পৌ à¦à¦¹à¦¾à¦¨ তর "পতানি" থাকেতà§à¦¤ আরà§à¦® করানি পারর।',
- 'vector-editwarning-preference' => 'পতানির সময় ইতৠনাকরিয়া বেলিয়া গেলেগা মরে সিঙকরেদিস',
- 'vector-simplesearch-search' => 'বিসারা',
- 'vector-simplesearch-containing' => 'আসেতা...',
-);
-
-/** Breton (brezhoneg)
- * @author Fulup
- * @author Y-M D
- */
-$messages['br'] = array(
- 'vector' => 'Gwellaennoù IU evit Vector',
- 'vector-desc' => 'Gwellaat a ra elfennoù eus ar gwiskadur Vector war an etrefas implijer.', # Fuzzy
- 'vector-collapsiblenav-preference' => 'Aotren al lañser merdeiñ pak-dispak a-gleiz gant an neuz Vector',
- 'vector-collapsiblenav-more' => "Muioc'h a yezhoù",
- 'vector-editwarning-warning' => "Mar kuitait ar bajenn-mañ e c'hallit koll ar c'hemmoù degaset ganeoc'h.
-Ma'z oc'h kevreet e c'hallit diweredekaat ar c'hemenn-diwall-mañ e rann \"Prenestr skridaozañ\" ho penndibaboù.",
- 'vector-editwarning-preference' => 'Kas keloù din pa guitaan ur bajenn degaset kemmoù enni hep enrollañ',
- 'vector-simplesearch-search' => 'Klask',
- 'vector-simplesearch-containing' => 'ennañ...',
- 'vector-noexperiments-preference' => "Lezit-me er-maez eus al labour amprouiñ an arc'hwelioù nevez",
- 'vector-footercleanup-templates' => 'Gwelet patromoù ar bajenn-mañ',
- 'vector-footercleanup-categories' => 'Gwelet ar rummadoù kuzhet evit ar pennad-mañ',
-);
-
-/** Bosnian (bosanski)
- * @author CERminator
- */
-$messages['bs'] = array(
- 'vector' => 'UI poboljšanja za Vector',
- 'vector-desc' => 'PoboljÅ¡ava elemente korisniÄkog interfejsa u koži Vector.', # Fuzzy
- 'vector-collapsiblenav-preference' => 'Omogući skrivanje stavki u navigacionom meniju u koži Vector',
- 'vector-collapsiblenav-more' => 'Više jezika',
- 'vector-editwarning-warning' => 'NapuÅ¡tanje ove stranice može dovesti do gubitka svih promjena koje ste naÄinili.
-Ako ste prijavljeni, možete iskljuÄiti ovo upozorenje u "VeliÄine tekstualnog polja" dijelu vaÅ¡ih opcija.',
- 'vector-editwarning-preference' => 'Upozori me kada napustim stranicu za izmjene bez spašenih promjena',
- 'vector-simplesearch-search' => 'Traži',
- 'vector-simplesearch-containing' => 'sadrži...',
- 'vector-noexperiments-preference' => 'IskljuÄi me iz funkcijskih probi',
-);
-
-/** Catalan (català)
- * @author Anskar
- * @author Grondin
- * @author Paucabot
- * @author SMP
- * @author Vriullop
- */
-$messages['ca'] = array(
- 'vector' => 'Millores de la interfície per a Vector',
- 'vector-desc' => "Millores en els elements d'interfície d'usuari de l'aparença Vector.",
- 'vector-collapsiblenav-preference' => "Activa l'opció de plegar els menús de navegació en l'aparença Vector",
- 'vector-collapsiblenav-more' => 'Més llengües',
- 'vector-editwarning-warning' => "Si sortiu d'aquesta pàgina perdreu tots els canvis que hàgiu fet.
-Si teniu un compte d'usuari, podeu eliminar aquest avís a la secció «Caixa d'edició» de les vostres preferències.",
- 'vector-editwarning-preference' => "Avisa'm quan surti d'una pàgina d'edició amb canvis sense desar",
- 'vector-simplesearch-search' => 'Cerca',
- 'vector-simplesearch-containing' => 'que conté ...',
- 'vector-noexperiments-preference' => 'Exclou-me dels experiments de funcionalitats',
- 'vector-footercleanup-transclusion' => "Aquesta pàgina conté {{PLURAL:$1|una transclusió d'una altra pàgina|unes transclusions de $1 altres pàgines}}.",
- 'vector-footercleanup-templates' => "Mostra les plantilles d'aquesta pàgina",
- 'vector-footercleanup-categories' => "Mostra les categories ocultes d'aquesta pàgina",
-);
-
-/** Chechen (нохчийн)
- * @author Sasan700
- */
-$messages['ce'] = array(
- 'vector-simplesearch-search' => 'Лаха',
-);
-
-/** Sorani Kurdish (کوردی)
- * @author Asoxor
- * @author Calak
- * @author Marmzok
- */
-$messages['ckb'] = array(
- 'vector-collapsiblenav-preference' => 'ڕێگە بدە بە کرانەوەی بڕگەکانی پێرستی ڕێدۆزی لە بەرگی ڤێکتۆردا.',
- 'vector-collapsiblenav-more' => 'زمانەکانی دیکە',
- 'vector-editwarning-warning' => 'بەجێ‌هێشتنی ئەم لاپەڕەیە دەبێتە هۆی لە‌دەست چوونی هەموو ئەو گۆڕانکاریانەی کردووتە.
-ئەگەر لەژوورەوەی، دەتوانی ئەم ئاگادارییە لە بەشی "دەستکاریی" لە ھەڵبژاردەکانی، لەکاربخەی.',
- 'vector-editwarning-preference' => 'ھۆشیارم بکەوە کاتێک لە پەڕەیەکی دەستکاری بە گۆڕانکاریی پاشەکەوت‌نەکراو دەردەچم',
- 'vector-simplesearch-search' => 'گەڕان',
- 'vector-simplesearch-containing' => 'بە لەبەرگرتنەوەی ...',
- 'vector-noexperiments-preference' => 'من لە تایبەتمەندییەکانی تاقیکردنەوە ھەڵاوێرە',
- 'vector-footercleanup-templates' => 'داڕێژەکانی ئەم پەڕەیە ببینە',
- 'vector-footercleanup-categories' => 'پۆلە شاردراوەکانی ئەم پەڕەیە ببینە',
-);
-
-/** Crimean Turkish (Cyrillic script) (къырымтатарджа (Кирилл)‎)
- * @author Don Alessandro
- */
-$messages['crh-cyrl'] = array(
- 'vector-simplesearch-search' => 'Къыдыр',
- 'vector-simplesearch-containing' => 'ичинде бу олгъан...',
-);
-
-/** Crimean Turkish (Latin script) (qırımtatarca (Latin)‎)
- * @author Don Alessandro
- */
-$messages['crh-latn'] = array(
- 'vector-simplesearch-search' => 'Qıdır',
- 'vector-simplesearch-containing' => 'içinde bu olğan...',
-);
-
-/** Czech (Äesky)
- * @author Mormegil
- */
-$messages['cs'] = array(
- 'vector' => 'Vylepšení uživatelského rozhraní pro Vektor',
- 'vector-desc' => 'Vylepšuje uživatelské rozhraní při užití vzhledu Vektor',
- 'vector-collapsiblenav-preference' => 'Povolit sbalování položek v navigaÄním menu ve vzhledu Vektor',
- 'vector-collapsiblenav-more' => 'Další jazyky',
- 'vector-editwarning-warning' => 'Opuštěním této stránky se mohou veškeré provedené změny ztratit.
-Pokud jste přihlášeni, můžete si toto varování vypnout na záložce „Editace“ v uživatelském nastavení.',
- 'vector-editwarning-preference' => 'Upozornit, když budu opouštět editaci bez uložení změn',
- 'vector-simplesearch-search' => 'Hledat',
- 'vector-simplesearch-containing' => 'obsahující…',
- 'vector-noexperiments-preference' => 'NeúÄastnit se experimentů s novými funkcemi',
- 'vector-footercleanup-transclusion' => 'Do této stránky {{PLURAL:$1|je vložena $1 jiná stránka|jsou vloženy $1 jiné stránky|je vloženo $1 jiných stránek}}.',
- 'vector-footercleanup-templates' => 'Zobrazit šablony na této stránce',
- 'vector-footercleanup-categories' => 'Zobrazit skryté kategorie na této stránce',
-);
-
-/** Kashubian (kaszëbsczi)
- * @author Kuvaly
- */
-$messages['csb'] = array(
- 'vector-simplesearch-search' => 'Szëkba',
-);
-
-/** Church Slavic (ÑловѣÌньÑкъ / ⰔⰎⰑⰂⰡâ°â° â°”â°â°Ÿ)
- * @author ОйЛ
- */
-$messages['cu'] = array(
- 'vector-collapsiblenav-more' => 'дроуꙃи Ñ©ê™ê™‘ци',
- 'vector-simplesearch-search' => 'иÑканиѥ',
- 'vector-simplesearch-containing' => 'ÑÑ¥ дрьжащи···',
-);
-
-/** Chuvash (Чӑвашла)
- * @author FLAGELLVM DEI
- */
-$messages['cv'] = array(
- 'vector-simplesearch-search' => 'Шырав',
-);
-
-/** Welsh (Cymraeg)
- * @author Lloffiwr
- */
-$messages['cy'] = array(
- 'vector' => "Gwelliannau i'r rhyngwyneb ar gyfer Vector",
- 'vector-desc' => 'Yn gwella ar y rhyngwyneb yn y wedd Vector.',
- 'vector-collapsiblenav-preference' => "Galluogi crebachu'r ddewislen lywio yn y wedd Vector",
- 'vector-collapsiblenav-more' => 'Rhagor o ieithoedd',
- 'vector-simplesearch-search' => 'Chwilio',
- 'vector-simplesearch-containing' => 'yn cynnwys...',
- 'vector-noexperiments-preference' => "Peidio â'm cynnwys mewn arbrofion ar y nodweddion",
- 'vector-footercleanup-transclusion' => "Mae'r dudalen hon yn cynnwys {{PLURAL:$1||tudalen|$1 dudalen|$1 tudalen|$1 thudalen|$1 tudalen}} sydd wedi cael {{PLURAL:$1||ei thrawsgynnwys|eu trawsgynnwys}}.",
- 'vector-footercleanup-templates' => 'Gweld nodiadau ar y dudalen hon.',
- 'vector-footercleanup-categories' => 'Gweld categorïau cudd ar y dudalen hon',
-);
-
-/** Danish (dansk)
- * @author Froztbyte
- * @author Peter Alberti
- * @author Sarrus
- * @author Sir48
- */
-$messages['da'] = array(
- 'vector' => 'Forbedringer af brugerfladen til Vector',
- 'vector-desc' => 'Forbedrer brugerfladen, når Vector-udseendet er i brug.',
- 'vector-collapsiblenav-preference' => 'Aktiver sammenklapning af sidemenuen i Vector-udseendet',
- 'vector-collapsiblenav-more' => 'Flere sprog',
- 'vector-editwarning-warning' => 'Hvis du forlader siden nu, risikerer du at miste alle ændringer som du har lavet.
-Denne advarsel kan slås fra under Redigering i dine indstillinger.',
- 'vector-editwarning-preference' => 'Advar mig, hvis jeg forlader en redigeringsside med ændringer, der ikke er gemt.',
- 'vector-simplesearch-search' => 'Søg',
- 'vector-simplesearch-containing' => 'indeholder...',
- 'vector-noexperiments-preference' => 'Udeluk mig fra funktionseksperimenter',
- 'vector-footercleanup-transclusion' => 'Denne side indeholder {{PLURAL:$1|en transklusion|transklusioner}} af {{PLURAL:$1|én anden side|$1 andre sider}}.',
- 'vector-footercleanup-templates' => 'Vis skabeloner på denne side',
- 'vector-footercleanup-categories' => 'Vis skjulte kategorier på denne side',
-);
-
-/** German (Deutsch)
- * @author Church of emacs
- * @author Kghbln
- * @author SVG
- * @author The Evil IP address
- * @author Tischbeinahe
- * @author ✓
- */
-$messages['de'] = array(
- 'vector' => 'Verbesserungen für die Benutzeroberfläche „Vector“',
- 'vector-desc' => 'Ermöglicht zusätzliche Verbesserungen der Benutzeroberfläche „Vector“',
- 'vector-collapsiblenav-preference' => 'Zusammenklappen von Elementen im Navigationsmenü der Benutzeroberfläche Vector aktivieren',
- 'vector-collapsiblenav-more' => 'Weitere Sprachen',
- 'vector-editwarning-warning' => 'Das Verlassen dieser Seite kann dazu führen, dass die Änderungen verloren gehen.
-Als angemeldeter Benutzer kann das Anzeigen dieser Warnung im „Bearbeiten“-Bereich der Einstellungen abgeschaltet werden.',
- 'vector-editwarning-preference' => 'Warnen, sofern eine zur Bearbeitung geöffnete Seite verlassen wird, die nicht gespeicherte Änderungen enthält',
- 'vector-simplesearch-search' => 'Suche',
- 'vector-simplesearch-containing' => 'Volltextsuche nach …',
- 'vector-noexperiments-preference' => 'Nicht an Funktionsexperimenten teilnehmen',
- 'vector-footercleanup-transclusion' => 'In diese Seite {{PLURAL:$1|wurde eine Seite|wurden $1 Seiten}} eingebunden.',
- 'vector-footercleanup-templates' => 'Auf dieser Seite eingebundene Vorlagen anzeigen',
- 'vector-footercleanup-categories' => 'Versteckte Kategorien auf dieser Seite anzeigen',
-);
-
-/** German (formal address) (Deutsch (Sie-Form)‎)
- */
-$messages['de-formal'] = array(
- 'vector-editwarning-warning' => 'Das Verlassen dieser Seite kann dazu führen, dass Ihre Änderungen verloren gehen.
-Wenn Sie angemeldet sind, können Sie das Anzeigen dieser Warnung im „Bearbeiten“-Bereich Ihrer Einstellungen abschalten.',
-);
-
-/** Zazaki (Zazaki)
- * @author Erdemaslancan
- * @author Mirzali
- * @author Xoser
- */
-$messages['diq'] = array(
- 'vector' => 'Ser vectori UI hacetanê hewli',
- 'vector-desc' => 'Yeweniya asayışa vektori da rıasayışe karberi keno weş.',
- 'vector-collapsiblenav-preference' => 'Eyarê qic kerdisê ke hecatan menuyê navigasyon ke Vector de inan a bike',
- 'vector-collapsiblenav-more' => 'Ziwananê binan',
- 'vector-editwarning-warning' => 'ihtimal o ke wexta şıma peli ra bıveci, vurnayiş o ke şıma kerdo, hewna şiyêro .
-eke şıma kewtê hesabê xo, no hişyari tercihanê xo ra şıma eşkeni "Ho vurnayeno" bıvındarnî .',
- 'vector-editwarning-preference' => 'wexta ke ez pelo nêqeydbiyaye ra veciyaya mı hişyar bıker',
- 'vector-simplesearch-search' => 'Cı geyre',
- 'vector-simplesearch-containing' => 'Estên...',
- 'vector-noexperiments-preference' => 'Mı tewrê cerbnayışan dê bahdoyêna meke',
- 'vector-footercleanup-transclusion' => 'Zerrey ena pela {{PLURAL:$1|vıraştışen|Vıraştışeni}} sera {{PLURAL:$1|pelaya bin|$1 zewbi pelaya}}.',
- 'vector-footercleanup-templates' => 'Şablonanê ena perer bıvinê',
- 'vector-footercleanup-categories' => 'Nımıte kategoriyanê ena perer bıvinê',
-);
-
-/** Lower Sorbian (dolnoserbski)
- * @author Michawiki
- */
-$messages['dsb'] = array(
- 'vector' => 'Pólěpšenja wužywarskego pówjercha za Vector',
- 'vector-desc' => '!Pólěpša wužywarski pówjerch za drastwu Vector.',
- 'vector-collapsiblenav-preference' => 'Złožowanje zapiskow w bocnicy w drastwje Vector zmóžniś',
- 'vector-collapsiblenav-more' => 'Dalšne rěcy',
- 'vector-editwarning-warning' => 'Gaž toś ten bok se spušća, mógu se změny zgubiś, kótarež sy pśewjadł. Jolic sy pśizjawjeny, móžoš toś to warnowanje we wótrězku Wobźěłaś swójich nastajenjow znjemóžniś.',
- 'vector-editwarning-preference' => 'Warnowaś, gaž bok spušća se z njeskłaźonymi změnami',
- 'vector-simplesearch-search' => 'PytaÅ›',
- 'vector-simplesearch-containing' => 'wopśimujo...',
- 'vector-noexperiments-preference' => 'MÄ› z funkciskich eksperimentow wuzamknuÅ›',
- 'vector-footercleanup-transclusion' => 'Toś ten bok wopśimujo {{PLURAL:$1|transkluziju|transkluziji|transkluzije|transkluzije}} $1 {{PLURAL:$1|drugego boka|drugeju bokowu|drugich bokow|drugich bokow}}.',
- 'vector-footercleanup-templates' => 'Pśedłogi na toś tom boku zwobrazniś',
- 'vector-footercleanup-categories' => 'Schowane kategorije na toÅ› tom boku pokazaÅ›',
-);
-
-/** Greek (Ελληνικά)
- * @author Dead3y3
- * @author Geraki
- * @author Glavkos
- * @author ΑπεÏγός
- */
-$messages['el'] = array(
- 'vector' => 'βελτιώσεις στο UI για το Vector',
- 'vector-desc' => 'ΠαÏέχει βελτίωση στα στοιχεία διεπαφής χÏήστη του skin Vector.', # Fuzzy
- 'vector-collapsiblenav-preference' => 'ΕνεÏγοποίηση πτυσσόμενων ενοτήτων στο Î¼ÎµÎ½Î¿Ï Ï€Î»Î¿Î®Î³Î·ÏƒÎ·Ï‚ με το θέμα Vector',
- 'vector-collapsiblenav-more' => 'ΠεÏισσότεÏες γλώσσες',
- 'vector-editwarning-warning' => 'Αφήνοντας αυτή τη σελίδα μποÏεί να σας κάνει να χάσετε κάποιες αλλαγές που έχετε κάνει.
-Αν έχετε συνδεθεί, μποÏείτε να απενεÏγοποιήσετε αυτή την Ï€Ïοειδοποίηση στο τμήμα "ΕπεξεÏγασία" των Ï€Ïοτιμήσεών σας.',
- 'vector-editwarning-preference' => 'ΠÏοειδοποίηση όταν εγκαταλείπω μία σελίδα επεξεÏγασίας χωÏίς να έχω Ï€Ïώτα αποθηκεÏσει τις αλλαγές',
- 'vector-simplesearch-search' => 'Αναζήτηση',
- 'vector-simplesearch-containing' => 'πεÏιέχει...',
- 'vector-noexperiments-preference' => 'ΕξαιÏέστε με από την λειτουÏγία πειÏαμάτων',
-);
-
-/** Esperanto (Esperanto)
- * @author AVRS
- * @author Maximillion Pegasus
- * @author Yekrats
- */
-$messages['eo'] = array(
- 'vector' => 'Plibonigado de grafika interfaco por Vector',
- 'vector-desc' => 'Plibonigas la uzula interfaco kiam oni lernas Vector-etoson.',
- 'vector-collapsiblenav-preference' => 'Åœalti kaÅebladon de aĵoj en la dekstra navigmenuo kun etoso Vector',
- 'vector-collapsiblenav-more' => 'Pli lingvoj',
- 'vector-editwarning-warning' => 'Forlasante ĉi tiun paÄon kaÅ­zos al vi perdi iun ajn ÅanÄojn kiujn vi faris.
-Se vi ensalutas, vi povas malÅalti ĉi tiun averton en la sekcio "Grandeco de redakta tekstujo" de viaj preferoj.',
- 'vector-editwarning-preference' => 'Averti min kiam mi forlasas redaktan paÄon kun nekonservitaj ÅanÄoj',
- 'vector-simplesearch-search' => 'Serĉi',
- 'vector-simplesearch-containing' => 'enhavas...',
- 'vector-noexperiments-preference' => 'Ekskluzivu min de estontecaj testoj',
- 'vector-footercleanup-transclusion' => 'Ĉi tiu paÄo enhavas {{PLURAL:$1|transinkluzivaĵon|transinkluzivaĵojn}} de {{PLURAL:$1|unu alia paÄo|$1 aliaj paÄoj}}.',
- 'vector-footercleanup-templates' => 'Rigardi Åablonojn en ĉi tiu paÄo',
-);
-
-/** Spanish (español)
- * @author Armando-Martin
- * @author Crazymadlover
- * @author Drini
- * @author Fitoschido
- * @author Locos epraix
- * @author Translationista
- */
-$messages['es'] = array(
- 'vector' => 'Mejoras de interfaz de usuario para Vector',
- 'vector-desc' => 'Mejora la interfaz de usuario cuando se utiliza Vector como aspecto',
- 'vector-collapsiblenav-preference' => 'Activar menús plegables en la barra lateral de la piel Vector',
- 'vector-collapsiblenav-more' => 'Más idiomas',
- 'vector-editwarning-warning' => 'El dejar esta página causará la pérdida de cualquier cambio que hayas realizado.
-Si has iniciado sesión, puedes desactivar este aviso en la sección «Edición» en tus preferencias.',
- 'vector-editwarning-preference' => 'Advertirme cuando abandone una página editada con cambios sin grabar',
- 'vector-simplesearch-search' => 'Buscar',
- 'vector-simplesearch-containing' => 'conteniendo...',
- 'vector-noexperiments-preference' => 'Excluirme de características experimentales',
- 'vector-footercleanup-transclusion' => 'Esta página contiene {{PLURAL:$1|una transclusión|transclusiones}} {{PLURAL:$1|de otra página|de otras $1 páginas}}.',
- 'vector-footercleanup-templates' => 'Ver las plantillas de esta página',
- 'vector-footercleanup-categories' => 'Ver las categorías ocultas de esta página',
-);
-
-/** Estonian (eesti)
- * @author Pikne
- */
-$messages['et'] = array(
- 'vector' => 'Vector-kujunduse kasutajaliidese täiustused',
- 'vector-desc' => 'Täiustab Vectori-kujunduse kasutajaliidest.',
- 'vector-collapsiblenav-preference' => 'Luba Vektori-kujundusega navigeerimismenüü üksusi peita',
- 'vector-collapsiblenav-more' => 'Veel keeli',
- 'vector-editwarning-warning' => 'Sellelt leheküljelt lahkumise tõttu võivad tehtud muudatused kaotsi minna.
-Kui oled sisse loginud, saad selle hoiatuse eelistuste alaosas "Toimetamine" keelata.',
- 'vector-editwarning-preference' => 'Hoiata mind, kui lahkun redigeerimisleheküljelt muudatusi salvestamata',
- 'vector-simplesearch-search' => 'Otsi',
- 'vector-simplesearch-containing' => 'sisalduv...',
- 'vector-noexperiments-preference' => 'Jäta mind funktsioonide katsetamisest kõrvale',
- 'vector-footercleanup-transclusion' => 'Sellel leheküljel kasutatakse mallina {{PLURAL:$1|üht|$1}} teist lehekülge.',
- 'vector-footercleanup-templates' => 'Näita malle, mida leheküljel kasutatakse',
- 'vector-footercleanup-categories' => 'Näita peidetud kategooriaid, millesse lehekülg kuulub',
-);
-
-/** Basque (euskara)
- * @author An13sa
- */
-$messages['eu'] = array(
- 'vector' => 'EI hobekuntzak Vector-entzat',
- 'vector-desc' => 'Vector skin-eko lankidearen interfazeko elementuak hobetzen ditu.', # Fuzzy
- 'vector-collapsiblenav-preference' => 'Vector skin-ean ezkerreko nabigazio menua irekigarri bihurtzen du',
- 'vector-collapsiblenav-more' => 'Hizkuntza gehiago',
- 'vector-editwarning-warning' => 'Orrialde honetatik irteten bazara, egindako aldaketak galdu egingo dira.
-Saioa hasi baduzu, mezu hau kendu dezakezu zure hobespenen orrialdeko "Aldatzen" atalean.',
- 'vector-editwarning-preference' => 'Abisa nazazu gorde gabeko aldaketak eginez orrialde bat uzten dudanean',
- 'vector-simplesearch-search' => 'Bilatu',
- 'vector-simplesearch-containing' => 'edukian...',
-);
-
-/** Persian (Ùارسی)
- * @author Ebraminio
- * @author Huji
- * @author Ladsgroup
- * @author Reza1615
- * @author Sahim
- * @author ZxxZxxZ
- */
-$messages['fa'] = array(
- 'vector' => 'بهبودهای رابط کاربر برای پوستهٔ برداری',
- 'vector-desc' => 'بهبود در عناصر رابط کاربری در زمان استÙاده از پوستهٔ وکتور',
- 'vector-collapsiblenav-preference' => 'Ùعال‌کردن منوی تاشوی ناوبری در پوسته وکتور',
- 'vector-collapsiblenav-more' => 'زبان‌های بیشتر',
- 'vector-editwarning-warning' => 'خروج از این صÙحه ممکن است باعث از دست رÙتن هرچه نوشته‌اید شود.
-اگر شما با نام کاربری وارد شده‌اید می‌توانید این هشدار را در بخش «در حال ویرایش» ترجیحاتتان بیابید.',
- 'vector-editwarning-preference' => 'زمان خروج از صÙحهٔ ویرایش در صورت داشتن ویرایش‌های‌ ذخیره‌نشده به من هشدار داده شود',
- 'vector-simplesearch-search' => 'جستجو',
- 'vector-simplesearch-containing' => 'صÙحه‌های دربردارنده...',
- 'vector-noexperiments-preference' => 'من را از ویژگی‌های آزمایشی مستثنی کن',
- 'vector-footercleanup-transclusion' => 'این صÙحه شامل {{PLURAL:$1|تراگنجانش|تراگنجانش‌های}} {{PLURAL:$1|صÙحه‌ای دیگر است|$1 صÙحهٔ دیگر است}}.',
- 'vector-footercleanup-templates' => 'نمایش الگوها در این صÙحه',
- 'vector-footercleanup-categories' => 'نمایش رده‌های پنهان این صÙحه',
-);
-
-/** Finnish (suomi)
- * @author Crt
- * @author Nike
- * @author Olli
- * @author Str4nd
- * @author VezonThunder
- */
-$messages['fi'] = array(
- 'vector' => 'Käyttöliittymän parannukset Vectorille',
- 'vector-desc' => 'Parantaa käyttöliittymää Vector-ulkoasua käytettäessä.',
- 'vector-collapsiblenav-preference' => 'Ota käyttöön sivupalkin kohteiden piilottaminen Vector-ulkoasussa',
- 'vector-collapsiblenav-more' => 'Muilla kielillä',
- 'vector-editwarning-warning' => 'Tältä sivulta poistuminen saattaa aiheuttaa kaikkien tekemiesi muutosten katoamisen.
-Jos olet kirjautuneena sisään, voit poistaa tämän varoituksen käytöstä asetuksissa â€Muokkausâ€-osiossa.',
- 'vector-editwarning-preference' => 'Varoita minua, kun poistun muokkaussivulta tallentamatta muutoksia',
- 'vector-simplesearch-search' => 'Hae',
- 'vector-simplesearch-containing' => 'sisältää...',
- 'vector-noexperiments-preference' => 'Älä ota minua mukaan ominaisuuskokeiluihin',
- 'vector-footercleanup-transclusion' => 'Tälle sivulle on sisällytetty {{PLURAL:$1|yksi muu sivu|$1 muuta sivua}}.',
- 'vector-footercleanup-templates' => 'Näytä mallineet tällä sivulla',
- 'vector-footercleanup-categories' => 'Näytä piilotetut luokat tällä sivulla',
-);
-
-/** Faroese (føroyskt)
- * @author Diupwijk
- */
-$messages['fo'] = array(
- 'vector-simplesearch-search' => 'Leita',
-);
-
-/** French (français)
- * @author Gomoko
- * @author IAlex
- * @author Jean-Frédéric
- * @author McDutchie
- * @author PieRRoMaN
- * @author Sherbrooke
- * @author Urhixidur
- */
-$messages['fr'] = array(
- 'vector' => 'Améliorations IU pour Vector',
- 'vector-desc' => "Améliore l’interface utilisateur lors de l'utilisation de l'habillage Vecteur",
- 'vector-collapsiblenav-preference' => "Activer le menu de navigation à gauche repliable avec l'habillage vector",
- 'vector-collapsiblenav-more' => 'Plus de langues',
- 'vector-editwarning-warning' => 'Quitter cette page vous fera perdre toutes les modifications que vous avez faites.
-Si vous êtes connecté avec votre compte, vous pouvez retirer cet avertissement dans la section « Fenêtre de modification » de vos préférences.',
- 'vector-editwarning-preference' => 'M’avertir quand je quitte une page de modification sans publier les changements',
- 'vector-simplesearch-search' => 'Rechercher',
- 'vector-simplesearch-containing' => 'contenant...',
- 'vector-noexperiments-preference' => "M'exclure des expériences de nouvelles fonctionnalités",
- 'vector-footercleanup-transclusion' => 'Cette page contient {{PLURAL:$1|une traduction|des traductions}} de $1 {{PLURAL:$1|autre page|autres pages}}.',
- 'vector-footercleanup-templates' => 'Afficher les modèles sur cette page',
- 'vector-footercleanup-categories' => 'Afficher les catégories cachées sur cette page',
-);
-
-/** Franco-Provençal (arpetan)
- * @author ChrisPtDe
- */
-$messages['frp'] = array(
- 'vector' => 'Mèlyoracions EU por « Vèctor »',
- 'vector-desc' => 'Mèlyoracions des èlèments de l’entèrface usanciér de l’habelyâjo « Vèctor ».', # Fuzzy
- 'vector-collapsiblenav-preference' => 'Activar lo menu de navigacion repleyâblo avouéc l’habelyâjo « Vèctor »',
- 'vector-collapsiblenav-more' => 'Més de lengoues',
- 'vector-editwarning-warning' => 'Quitar ceta pâge vos farat pèrdre tôs los changements que vos éd fêts.
-Se vos éte branchiê, vos pouede enlevar ceti avèrtissement dens la sèccion « Fenétra d’èdicion » de voutres prèferences.',
- 'vector-editwarning-preference' => 'M’avèrtir quand quito una pâge de changement sen sôvar los changements',
- 'vector-simplesearch-search' => 'Rechèrchiér',
- 'vector-simplesearch-containing' => 'que contint...',
- 'vector-noexperiments-preference' => 'M’èxcllure des èxpèriences de novèles fonccionalitâts',
-);
-
-/** Northern Frisian (Nordfriisk)
- * @author Murma174
- */
-$messages['frr'] = array(
- 'vector' => 'Ferbeedrangen för di skak „Vector“',
- 'vector-desc' => 'Muar ferbeedrangen för di skak „Vector“ mögelk maage',
- 'vector-collapsiblenav-preference' => "Det fersteegen faan elementen uun't nawigatsjuunsmenu bi „Vector“ aktiwiare",
- 'vector-collapsiblenav-more' => 'Muar spriaken',
- 'vector-editwarning-warning' => 'Wan dü detheer sidj slotst, kön feranrangen ferleesen gung.
-Üs uunmeldet brüker könst dü detheer wäärnang bi din iinstelangen oner „Bewerke“ wechknipse.',
- 'vector-editwarning-preference' => 'Waarskaue mi, wan en sidj slööden woort, huar noch ünseekert feranrangen maaget wurden san',
- 'vector-simplesearch-search' => 'Sjük',
- 'vector-simplesearch-containing' => 'Uun di tekst sjük efter …',
- 'vector-noexperiments-preference' => 'Ik wal ei bi eksperimenten tu nei funktsjuunen mämaage',
- 'vector-footercleanup-transclusion' => 'Uun detdiar sidj {{PLURAL:$1|as ian sidj muar|san $1 sidjen muar}} iinbünjen.',
- 'vector-footercleanup-templates' => 'Wise föörlaagen uun, diar faan detheer sidj brükt wurd',
- 'vector-footercleanup-categories' => 'Wise ferstäächt kategoriin faan detheer sidj uun',
-);
-
-/** Friulian (furlan)
- * @author Klenje
- */
-$messages['fur'] = array(
- 'vector-collapsiblenav-more' => 'Altris lenghis',
- 'vector-editwarning-preference' => 'Visimi cuant che o stoi par lassâ une pagjine dulà che a son cambiaments no salvâts',
- 'vector-simplesearch-search' => 'Ricercje',
- 'vector-simplesearch-containing' => 'che al à dentri...',
-);
-
-/** Irish (Gaeilge)
- * @author පසිඳු කà·à·€à·’න්ද
- */
-$messages['ga'] = array(
- 'vector-simplesearch-search' => 'Cuardaigh',
-);
-
-/** Simplified Gan script (赣语(简体)‎)
- */
-$messages['gan-hans'] = array(
- 'vector-simplesearch-search' => '寻å–',
-);
-
-/** Traditional Gan script (贛語(ç¹é«”)‎)
- * @author Symane
- */
-$messages['gan-hant'] = array(
- 'vector-simplesearch-search' => 'å°‹å–',
-);
-
-/** Scottish Gaelic (Gàidhlig)
- * @author Akerbeltz
- */
-$messages['gd'] = array(
- 'vector' => 'Leasachaidhean an UI airson Vector',
- 'vector-desc' => 'Cuiridh seo piseach air eileamaidean eadar-aghaidh nan cleachdaichean san chraiceann Vector.',
- 'vector-collapsiblenav-preference' => 'Cuir an comas dùmhlachadh nan rudan san chlàr-taice seòlaidh san chraiceann Vector',
- 'vector-collapsiblenav-more' => 'Barrachd chànan',
- 'vector-editwarning-warning' => 'Ma dh\'fhàgas tu an duilleag seo, faodaidh gun caill thu mùthadh sam bith a rinn thu.
-Ma tha thu air logadh a-steach, \'s urrainn dhut an rabhadh seo a chur dheth san roinn "Deasachadh" sna roghainnean agad.',
- 'vector-editwarning-preference' => 'Thoir rabhadh dhomh ma bhios mi an impis duilleag deasachaidh fhàgail mus do shàbhail mi na mùthaidhean agam',
- 'vector-simplesearch-search' => 'Lorg',
- 'vector-simplesearch-containing' => 'anns a bheil...',
-);
-
-/** Galician (galego)
- * @author Toliño
- */
-$messages['gl'] = array(
- 'vector' => 'Melloras na interface de usuario para a aparencia Vector',
- 'vector-desc' => 'Mellora a interface de usuario ao usar a aparencia Vector',
- 'vector-collapsiblenav-preference' => 'Activar o menú de navegación despregable á esquerda na aparencia Vector',
- 'vector-collapsiblenav-more' => 'Máis linguas',
- 'vector-editwarning-warning' => 'Deixar esta páxina pode causar a perda de calquera cambio feito.
-Se accedeu ao sistema, pode desactivar esta mensaxe de advertencia na sección "Edición" das súas preferencias.',
- 'vector-editwarning-preference' => 'Avisádeme cando deixe unha páxina de edición cos cambios sen gardar',
- 'vector-simplesearch-search' => 'Procurar',
- 'vector-simplesearch-containing' => 'que conteña...',
- 'vector-noexperiments-preference' => 'Excluídeme das novas características',
- 'vector-footercleanup-transclusion' => 'Esta páxina contén {{PLURAL:$1|unha transclusión|transclusións}} {{PLURAL:$1|doutra páxina|doutras $1 páxinas}}.',
- 'vector-footercleanup-templates' => 'Ver os modelos desta páxina',
- 'vector-footercleanup-categories' => 'Ver as categorías ocultas desta páxina',
-);
-
-/** Ancient Greek (ἈÏχαία ἑλληνικὴ)
- */
-$messages['grc'] = array(
- 'vector-simplesearch-search' => 'Ζητεῖν',
- 'vector-simplesearch-containing' => 'πεÏιέχον...',
-);
-
-/** Swiss German (Alemannisch)
- * @author Als-Holder
- */
-$messages['gsw'] = array(
- 'vector' => 'BI-Verbesserige fir Vektor',
- 'vector-desc' => 'Verbesserige an dr Elemänt vu dr Benutzeroberflechi bim Vector-skin',
- 'vector-collapsiblenav-preference' => 'Yyklappbar Navgationsmenü yyschalte bi dr Verwändig vu Vector',
- 'vector-collapsiblenav-more' => 'Meh Sproche',
- 'vector-editwarning-warning' => 'Wänn Du die Syte verlosch, cha s syy, ass Du alli Bearbeitige verliersch, wu Du do dra gmacht hesch.
-Wänn Du aagmäldet bisch, chasch s Anzeige vu däre Warnig im „Tekscht-Ygab“-Beryych vu Dyyne Yystelligen abstelle.',
- 'vector-editwarning-preference' => 'Warn mi, wänn I ne Syte verloss mit Bearbeitige, wu nonig gspycheret sin',
- 'vector-simplesearch-search' => 'Suechi',
- 'vector-simplesearch-containing' => 'din het s …',
- 'vector-noexperiments-preference' => 'Mi uusschließe vu dr Dailnahm Feature-Experimänt',
- 'vector-footercleanup-transclusion' => 'In die Syte {{PLURAL:$1|isch ei Syte|sin $1 Syte}} yybunde wore.',
- 'vector-footercleanup-templates' => 'Vorlage uf däre Syten aazeige',
- 'vector-footercleanup-categories' => 'Versteckti Kategorie uf däre Syten aazeige',
-);
-
-/** Gujarati (ગà«àªœàª°àª¾àª¤à«€)
- * @author Ashok modhvadia
- * @author KartikMistry
- * @author Sushant savla
- */
-$messages['gu'] = array(
- 'vector' => 'વેકà«àªŸàª° માટે UI સà«àª§àª¾àª°àª¾',
- 'vector-desc' => 'વેકà«àªŸàª° સà«àª•à«€àª¨àª¨àª¾ યà«àªàª° ઈંટરફેઠના તતà«àªµà«‹àª¨à«‡ સà«àª§àª¾àª°à«‡ છે', # Fuzzy
- 'vector-collapsiblenav-preference' => 'વેકà«àªŸàª° સà«àª•à«€àª¨àª¨àª¾ સાઈડ બારમાં કોલેપà«àª¸à«€àª‚ગ સકà«àª°à«€àª¯ કરશે.',
- 'vector-collapsiblenav-more' => 'વધૠભાષાઓ',
- 'vector-editwarning-warning' => 'આ પાનà«àª‚ છોડી દેશો તો તમારા ફેરફારો સચવાશે નહીં.
-જો તમે પà«àª°àªµà«‡àª¶ કરેલો હોય તો તમે આ ચેતવણીને તમારી પસંદના "ફેરફાર" વિભાગના વિકલà«àªªà«‹ બદલીને બંધ કરી શકો છો.',
- 'vector-editwarning-preference' => 'સાચવà«àª¯àª¾ વગર જો હà«àª‚ પૃષà«àª  છોડà«àª‚ તો મને ચેતવણી આપો',
- 'vector-simplesearch-search' => 'શોધો',
- 'vector-simplesearch-containing' => 'ધરાવતી...',
- 'vector-noexperiments-preference' => 'મને પà«àª°àª¯à«‹àª—ોમાંથી બાકાત રાખો',
-);
-
-/** Manx (Gaelg)
- * @author Shimmin Beg
- */
-$messages['gv'] = array(
- 'vector-collapsiblenav-more' => 'Tooilley çhengaghyn',
- 'vector-editwarning-warning' => "My faagys oo y duillag, hed caghlaaghyn erbee er coayl, foddee.
-My t'ou uss loggalt stiagh, foddee oo lhiettal y raaue shoh 'sy tosheeaghtyn ayd, 'sy rheynn \"Reaghey\".",
- 'vector-editwarning-preference' => 'Cur raaue dou my ta mee faagail duillag reaghey gyn sauail yn obbyr jeant aym',
- 'vector-simplesearch-search' => 'Ronsaghey',
- 'vector-simplesearch-containing' => 'goaill stiagh...',
-);
-
-/** Hebrew (עברית)
- * @author Amire80
- * @author Ofekalef
- * @author Rotemliss
- * @author YaronSh
- * @author Yonidebest
- */
-$messages['he'] = array(
- 'vector' => 'שיפורי מנשק משתמש עבור וקטור',
- 'vector-desc' => 'הרחבת ממשק המשתמש בעת השימוש בעיצוב וקטור',
- 'vector-collapsiblenav-preference' => 'הפעלת קיפול ×¤×¨×™×˜×™× ×‘×ª×¤×¨×™×˜ הניווט בעיצוב וקטור',
- 'vector-collapsiblenav-more' => 'דף ×–×” בשפות ×חרות',
- 'vector-editwarning-warning' => 'עזיבת דף ×–×” עשויה ×œ×’×¨×•× ×œ×ובדן כל ×”×©×™× ×•×™×™× ×©×‘×™×¦×¢×ª×.
-×× ××ª× ×ž×—×•×‘×¨×™× ×œ×—×©×‘×•×Ÿ, תוכלו לבטל ×זהרה זו בחלק "עריכה" שבהעדפות שלכ×.',
- 'vector-editwarning-preference' => 'הצגת ×זהרה בעת עזיבת דף עריכה ×¢× ×©×™× ×•×™×™× ×©×˜×¨× × ×©×ž×¨×•',
- 'vector-simplesearch-search' => 'חיפוש',
- 'vector-simplesearch-containing' => 'כולל...',
- 'vector-noexperiments-preference' => '×ל תכללו ×ותי ×‘× ×™×¡×•×™×™× ×‘×¢×ª×™×“',
- 'vector-footercleanup-transclusion' => 'הדף ×”×–×” מכליל {{PLURAL:$1|דף ×חד ×חר|$1 ×“×¤×™× ×חרי×}}',
- 'vector-footercleanup-templates' => 'הצגת תבניות בדף הזה',
- 'vector-footercleanup-categories' => 'הצגת קטגוריות מוסתרות בדף הזה',
-);
-
-/** Hindi (हिनà¥à¤¦à¥€)
- * @author Ansumang
- */
-$messages['hi'] = array(
- 'vector' => 'यूआई उनà¥à¤¨à¤¤à¤¿ वेकà¥à¤Ÿà¤° सà¥à¤•à¤¿à¤¨ के लिà¤',
- 'vector-collapsiblenav-more' => 'और अधिक भाषाà¤à¤‚',
- 'vector-simplesearch-search' => 'खोज',
- 'vector-noexperiments-preference' => 'मà¥à¤à¥‡ सà¥à¤µà¤¿à¤§à¤¾ पà¥à¤°à¤¯à¥‹à¤—ों से बाहर निकालें',
-);
-
-/** Fiji Hindi (Latin script) (Fiji Hindi)
- * @author Karthi.dr
- */
-$messages['hif-latn'] = array(
- 'vector-simplesearch-search' => 'Khojo',
-);
-
-/** Croatian (hrvatski)
- * @author Anton008
- * @author Excaliboor
- * @author SpeedyGonsales
- */
-$messages['hr'] = array(
- 'vector' => 'PoboljÅ¡anja suÄelja stila Vektor',
- 'vector-desc' => 'PoboljÅ¡ava elemente korisniÄkog suÄelja stila Vector.', # Fuzzy
- 'vector-collapsiblenav-preference' => 'Omogući sklopivi lijevi navigacijski izbornik za Vektor stil',
- 'vector-collapsiblenav-more' => 'Više jezika',
- 'vector-editwarning-warning' => 'Napuštanje ove stranice može uzrokovati gubitak svake izmjene koju ste napravili.
-Možete onemogućiti ovo upozorenje u odjeljku "Širina okvira za uređivanje" Vaših postavki.',
- 'vector-editwarning-preference' => 'Upozori me kad napuštam stranicu za uređivanje bez spremanja izmjena',
- 'vector-simplesearch-search' => 'Traži',
- 'vector-simplesearch-containing' => 'sadrži....',
- 'vector-noexperiments-preference' => 'IskljuÄi me iz daljnjih eksperimentiranja',
-);
-
-/** Upper Sorbian (hornjoserbsce)
- * @author Michawiki
- */
-$messages['hsb'] = array(
- 'vector' => 'Polěpšenja wužiwarskeho powjercha za Vector',
- 'vector-desc' => 'Polěpša wužiwarski powjerch drasty Vector',
- 'vector-collapsiblenav-preference' => 'FaÅ‚dowanje zapiskow w bóÄnicy w drasće Vector zmóžnić',
- 'vector-collapsiblenav-more' => 'DalÅ¡e rÄ›Äe',
- 'vector-editwarning-warning' => 'Hdyž so strona wopušća, móžeja so změny zhubić, kotrež sy přewjedł. Jeli sy přizjewjeny, móžeš tute warnowanje we wotrězku "Wobdźěłowanje" swojich nastajenjow znjemóžnić.',
- 'vector-editwarning-preference' => 'Warnować, hdyž so wobdźěłowanska strona z njeskładowanymi změnami wopušća',
- 'vector-simplesearch-search' => 'Pytać',
- 'vector-simplesearch-containing' => 'wobsahuje...',
- 'vector-noexperiments-preference' => 'Mje z funkciskich eksperimentow wuzamknyć',
- 'vector-footercleanup-transclusion' => 'Tuta strona wobsahuje {{PLURAL:$1|transkluziju|transkluziji|transkluzije|transkluzije}} $1 {{PLURAL:$1|druheje strony|druheju stronow|druhich stronow|druhich stronow}}.',
- 'vector-footercleanup-templates' => 'Předłohi na tutej stronje zwobraznić',
- 'vector-footercleanup-categories' => 'Schowane kategorije na tutej stronje pokazać',
-);
-
-/** Hungarian (magyar)
- * @author Dani
- * @author Hunyadym
- * @author Tgr
- */
-$messages['hu'] = array(
- 'vector' => 'Fejlesztések a Vector felhasználói felületén',
- 'vector-desc' => 'Fejlesztések a Vector felület felhasználói felületének elemein.', # Fuzzy
- 'vector-collapsiblenav-preference' => 'Összecsukható navigációs menü engedélyezése a Vector felületen',
- 'vector-collapsiblenav-more' => 'Más nyelveken',
- 'vector-editwarning-warning' => 'A lap elhagyásával az összes itt végzett változtatás elveszhet.
-Ha be vagy jelentkezve letilthatod ezt a figyelmeztetést a beállításaid „Szerkesztés†szakaszában.',
- 'vector-editwarning-preference' => 'Figyelmeztessen, ha szerkesztéskor a módosítások mentése nélkül akarom elhagyni a lapot',
- 'vector-simplesearch-search' => 'Keresés',
- 'vector-simplesearch-containing' => 'tartalmazza…',
- 'vector-noexperiments-preference' => 'Nem akarok kísérleti funkciókat használni',
-);
-
-/** Armenian (Õ€Õ¡ÕµÕ¥Ö€Õ¥Õ¶)
- * @author Xelgen
- */
-$messages['hy'] = array(
- 'vector-editwarning-warning' => 'Ô±ÕµÕ½ Õ§Õ»Õ¨ Õ¬Ö„Õ¥Õ¬Õ¸Õ¾ Õ¤Õ¸Ö‚Ö„ Õ¯Õ¡Ö€Õ¸Õ² Õ¥Ö„ Õ¯Õ¸Ö€ÖÕ¶Õ¥Õ¬ Õ±Õ¥Ö€ Õ¯Õ¡Õ¿Õ¡Ö€Õ¡Õ® ÖƒÕ¸ÖƒÕ¸Õ­Õ¸Ö‚Õ©ÕµÕ¸Ö‚Õ¶Õ¶Õ¥Ö€Õ¨Ö‰
-ÔµÕ©Õ¥ Õ¤Õ¸Ö‚Ö„ Õ£Ö€Õ¡Õ¶ÖÕ¾Õ¡Õ® Õ¥Ö„ Õ°Õ¡Õ´Õ¡Õ¯Õ¡Ö€Õ£Õ¸Ö‚Õ´, Õ¯Õ¡Ö€Õ¸Õ² Õ¥Ö„ Õ¡Õ¶Õ»Õ¡Õ¿Õ¥Õ¬ Õ¡ÕµÕ½ Õ¶Õ¡Õ­Õ¡Õ¦Õ£Õ¸Ö‚Õ·Õ¡ÖÕ¸Ö‚Õ´Õ¨ Õ±Õ¥Ö€ Õ¶Õ¡Õ­Õ¨Õ¶Ö€Õ¸Ö‚Õ©ÕµÕ¸Ö‚Õ¶Õ¶Õ¥Ö€Õ« «Խմբագրում» Õ¢Õ¡ÕªÕ¶Õ¸Ö‚Õ´Ö‰',
- 'vector-editwarning-preference' => 'Ô¶Õ£Õ¸Ö‚Õ·Õ¡ÖÕ¶Õ¥Õ¬ Õ«Õ¶Õ±, Õ¥Ö€Õ¢ Õ¥Õ½ Õ¬Ö„Õ¸Ö‚Õ´ Õ¥Õ´ Õ­Õ´Õ¢Õ¡Õ£Ö€Õ´Õ¡Õ¶ Õ§Õ»Õ¨ Õ¡Õ¼Õ¡Õ¶Ö Õ¯Õ¡Õ¿Õ¡Ö€Õ¡Õ® ÖƒÕ¸ÖƒÕ¸Õ­Õ¸Ö‚Õ©ÕµÕ¸Ö‚Õ¶Õ¶Õ¥Ö€Õ¨ Õ°Õ«Õ·Õ¥Õ¬Õ¸Ö‚Ö‰',
- 'vector-simplesearch-search' => 'ÕˆÖ€Õ¸Õ¶Õ¥Õ¬',
-);
-
-/** Interlingua (interlingua)
- * @author McDutchie
- */
-$messages['ia'] = array(
- 'vector' => 'Meliorationes del interfacie de usator pro Vector',
- 'vector-desc' => 'Meliora le elementos del interfacie de usator del apparentia Vector.', # Fuzzy
- 'vector-collapsiblenav-preference' => 'Render plicabile le elementos in le menu de navigation in le apparentia Vector',
- 'vector-collapsiblenav-more' => 'Plus linguas',
- 'vector-editwarning-warning' => 'Quitar iste pagina pote causar le perdita de omne modificationes que tu ha facite.
-Si tu ha aperite un session, tu pote disactivar iste aviso in le section "Modification" de tu preferentias.',
- 'vector-editwarning-preference' => 'Advertir me quando io quita un pagina de modification sin publicar le cambiamentos',
- 'vector-simplesearch-search' => 'Cercar',
- 'vector-simplesearch-containing' => 'continente...',
- 'vector-noexperiments-preference' => 'Excluder me de functionalitate experimental',
- 'vector-footercleanup-transclusion' => 'Iste pagina contine {{PLURAL:$1|un transclusion|transclusiones}} de $1 altere {{PLURAL:$1|pagina|paginas}}.',
-);
-
-/** Indonesian (Bahasa Indonesia)
- * @author Farras
- * @author Irwangatot
- * @author IvanLanin
- * @author Kenrick95
- */
-$messages['id'] = array(
- 'vector' => 'Meningkatkan UI untuk Vector',
- 'vector-desc' => 'Meningkatkan elemen pada antarmuka penguna dari kulit Vector.', # Fuzzy
- 'vector-collapsiblenav-preference' => 'Aktifkan fungsi menu navigasi kiri yang dapat ditampilkan pada kulit Vektor',
- 'vector-collapsiblenav-more' => 'Lebih banyak bahasa',
- 'vector-editwarning-warning' => 'Meninggalkan halaman ini dapat menyebabkan semua perubahan yang belum tersimpan hilang.
-Jika Anda telah masuk log, Anda dapat mematikan peringatan ini lewat "Penyuntingan" pada halaman preferensi Anda.',
- 'vector-editwarning-preference' => 'Ingatkan saya bila meninggalkan halaman penyuntingan sebelum menyimpan perubahan',
- 'vector-simplesearch-search' => 'Cari',
- 'vector-simplesearch-containing' => 'isian ...',
- 'vector-noexperiments-preference' => 'Kecualikan saya dari percobaan fitur',
- 'vector-footercleanup-transclusion' => 'Halaman ini berisi {{PLURAL:$1|transklusi|transklusi}} {{PLURAL:$1|sebuah halaman lain|$1 halaman lain}}.',
-);
-
-/** Igbo (Igbo)
- * @author Ukabia
- */
-$messages['ig'] = array(
- 'vector-simplesearch-search' => 'Chá»wa',
-);
-
-/** Iloko (Ilokano)
- * @author Lam-ang
- */
-$messages['ilo'] = array(
- 'vector' => 'Napasayat nga UI para iti Vector',
- 'vector-desc' => 'Pasayaatenna ti interface ti agar-aramat no agusar ti kudil a Vector',
- 'vector-collapsiblenav-preference' => 'Pakabaelanna ti panarebba dagiti banag ti uneg ti igid a baras iti kudil a Vector',
- 'vector-collapsiblenav-more' => 'Adu pay a pagsasao',
- 'vector-editwarning-warning' => 'Ti ipapanaw ti daytoy a panid ket makapataud ti panakapukaw kadagiti amiaman a binalbaliwam.
-No nakastrekka, mabalinmo nga ibaldado daytoy a ballaag idiay "Panagurnos" a paset kadagiti kakaykayatam.',
- 'vector-editwarning-preference' => 'Pakaunaannak no pumanawak ti pagurnosan a panid nga adda ti saan a naidulin a sinuksukatan',
- 'vector-simplesearch-search' => 'Biruken',
- 'vector-simplesearch-containing' => 'naglaon ti...',
- 'vector-noexperiments-preference' => 'Saannak nga iraman kadagiti eksperimento a langa',
- 'vector-footercleanup-transclusion' => 'Daytoy a panid ket naglaon {{PLURAL:$1|ti transklusion|kadagiti transklusion}} {{PLURAL:$1|ti maysa a panid|dagiti $1 a nadumaduma a pampanid}}.',
- 'vector-footercleanup-templates' => 'Kitaen dagiti plantilia iti daytoy a panid',
- 'vector-footercleanup-categories' => 'Ipakita dagiti nailemmeng a kategoria iti daytoy a panid',
-);
-
-/** Ido (Ido)
- * @author Malafaya
- */
-$messages['io'] = array(
- 'vector-collapsiblenav-more' => 'Plusa lingui',
- 'vector-simplesearch-search' => 'Serchez',
- 'vector-simplesearch-containing' => 'quan kontenas...',
-);
-
-/** Icelandic (íslenska)
- * @author Krun
- * @author Snævar
- * @author Ævar Arnfjörð Bjarmason
- */
-$messages['is'] = array(
- 'vector' => 'Viðmóts lagfæringar á Vector-sniði',
- 'vector-desc' => 'Endurbætir notanda viðmót Vector sniðsins.', # Fuzzy
- 'vector-collapsiblenav-preference' => 'Fella saman hluti í hliðarstiku Vector sniðsins',
- 'vector-collapsiblenav-more' => 'Fleiri tungumál',
- 'vector-editwarning-warning' => 'Ef farið er frá þessari síðu gætu þær breytingar sem þú hefur gert tapast.
-Ef þú ert skráður inn, þá getur þú óvirkjað þessi skilaboð í „Breytingarflipanum" undir stillingum.',
- 'vector-editwarning-preference' => 'Vara mig við þegar ég fer frá breytingarsíðu með óvistaðar breytingar',
- 'vector-simplesearch-search' => 'Leita',
- 'vector-simplesearch-containing' => 'sem innihalda ...',
- 'vector-noexperiments-preference' => 'Útiloka mig frá tilraunum framvegis.',
- 'vector-footercleanup-transclusion' => 'Þessi síða ítengist {{PLURAL:$1|einni síðu|$1 öðrum síðum}}.',
-);
-
-/** Italian (italiano)
- * @author Beta16
- * @author F. Cosoleto
- * @author Una giornata uggiosa '94
- */
-$messages['it'] = array(
- 'vector' => "Miglioramenti all'interfaccia utente per Vector",
- 'vector-desc' => "Potenzia l'interfaccia utente quando si usa la skin Vector",
- 'vector-collapsiblenav-preference' => 'Abilita menù di navigazione nascondibile per la skin Vector',
- 'vector-collapsiblenav-more' => 'Altre lingue',
- 'vector-editwarning-warning' => 'Lasciare questa pagina potrebbe costarti la perdita di tutti i cambiamenti effettuati.
-Se sei loggato, puoi disattivare questo avviso nella sezione "Casella di modifica" delle tue preferenze.',
- 'vector-editwarning-preference' => 'Avvisa quando si lascia una pagina di modifica con modifiche non salvate',
- 'vector-simplesearch-search' => 'Ricerca',
- 'vector-simplesearch-containing' => 'contenente...',
- 'vector-noexperiments-preference' => 'Escludimi dalle funzionalità sperimentali',
- 'vector-footercleanup-transclusion' => "Questa pagina contiene {{PLURAL:$1|un'inclusione|delle inclusioni}} di {{PLURAL:$1|un'altra pagina|$1 altre pagine}}.",
- 'vector-footercleanup-templates' => 'Mostra i template di questa pagina',
- 'vector-footercleanup-categories' => 'Mostra le categorie nascoste di questa pagina',
-);
-
-/** Japanese (日本語)
- * @author Fryed-peach
- * @author Shirayuki
- * @author Whym
- * @author é’å­å®ˆæ­Œ
- */
-$messages['ja'] = array(
- 'vector' => 'ベクター外装用ユーザーインターフェイス改良',
- 'vector-desc' => 'ベクター外装ã®ä½¿ç”¨æ™‚ã«ãƒ¦ãƒ¼ã‚¶ãƒ¼ã‚¤ãƒ³ã‚¿ãƒ¼ãƒ•ã‚§ã‚¤ã‚¹ã‚’強化ã™ã‚‹',
- 'vector-collapsiblenav-preference' => 'ベクター外装ã®ãƒŠãƒ“ゲーションã§ã€é …ç›®ã®æŠ˜ã‚Šç•³ã¿ã‚’有効ã«ã™ã‚‹',
- 'vector-collapsiblenav-more' => 'ä»–ã®è¨€èªž',
- 'vector-editwarning-warning' => 'ã“ã®ãƒšãƒ¼ã‚¸ã‚’離れるã¨ã€ã‚ãªãŸãŒè¡Œã£ãŸå¤‰æ›´ãŒã™ã¹ã¦å¤±ã‚れるãŠãã‚ŒãŒã‚ã‚Šã¾ã™ã€‚
-ログインã—ã¦ã„ã‚‹å ´åˆã¯ã€å€‹äººè¨­å®šã®ã€Œç·¨é›†ã€ã‚¿ãƒ–ã§ã“ã®è­¦å‘Šã‚’表示ã—ãªã„設定ã«å¤‰æ›´ã§ãã¾ã™ã€‚',
- 'vector-editwarning-preference' => '変更をä¿å­˜ã›ãšã«ç·¨é›†ç”»é¢ã‹ã‚‰é›¢ã‚Œã‚ˆã†ã¨ã—ãŸã‚‰è­¦å‘Š',
- 'vector-simplesearch-search' => '検索',
- 'vector-simplesearch-containing' => 'ã“ã®èªžå¥ã‚’全文検索',
- 'vector-noexperiments-preference' => '開発中ã®æ©Ÿèƒ½ã‹ã‚‰è‡ªåˆ†ã‚’除外',
- 'vector-footercleanup-transclusion' => 'ã“ã®ãƒšãƒ¼ã‚¸ã§ã¯ã€{{PLURAL:$1|ä»–ã® $1 件ã®ãƒšãƒ¼ã‚¸}}ã‚’{{PLURAL:$1|å‚照読ã¿è¾¼ã¿}}ã—ã¦ã„ã¾ã™ã€‚',
- 'vector-footercleanup-templates' => 'ã“ã®ãƒšãƒ¼ã‚¸ã®ãƒ†ãƒ³ãƒ—レートを閲覧',
- 'vector-footercleanup-categories' => 'ã“ã®ãƒšãƒ¼ã‚¸ã®éš ã—カテゴリを閲覧',
-);
-
-/** Javanese (Basa Jawa)
- * @author NoiX180
- */
-$messages['jv'] = array(
- 'vector' => 'Pambenahan UI kanggo Vector',
- 'vector-desc' => 'Benahi unsur antarmuka panganggo saka kulit Vector.', # Fuzzy
- 'vector-collapsiblenav-more' => 'Luwih akèh basa',
- 'vector-editwarning-preference' => 'Èlingaké kula yèn kula ninggalaké suntingan sing durung kasimpen',
- 'vector-simplesearch-search' => 'Golèk',
- 'vector-simplesearch-containing' => 'ngisi...',
- 'vector-noexperiments-preference' => 'Sajabakaké kula saka èksperimèn piranti',
-);
-
-/** Georgian (ქáƒáƒ áƒ—ული)
- * @author BRUTE
- * @author David1010
- * @author ITshnik
- * @author გიáƒáƒ áƒ’იმელáƒ
- */
-$messages['ka'] = array(
- 'vector' => 'ვექტáƒáƒ áƒ£áƒšáƒ˜ თემის ინტერფეისის გáƒáƒ£áƒ›áƒ¯áƒáƒ‘ესებáƒ',
- 'vector-desc' => 'áƒáƒ£áƒ›áƒ¯áƒáƒ‘ესებს მáƒáƒ›áƒ®áƒ›áƒáƒ áƒ”ბლის ინტერფეისს გáƒáƒ¤áƒáƒ áƒ›áƒ”ბის ვექტáƒáƒ áƒ£áƒšáƒ˜ თემისáƒáƒ—ვის',
- 'vector-collapsiblenav-preference' => 'დáƒáƒ áƒ—ეთ მáƒáƒ áƒªáƒ®áƒœáƒ˜áƒ• "ვექტáƒáƒ " დიზáƒáƒ˜áƒœáƒ¨áƒ˜ ბლáƒáƒ™áƒ”ბის ჩáƒáƒ™áƒ”ცვáƒ',
- 'vector-collapsiblenav-more' => 'დáƒáƒ›áƒáƒ¢áƒ”ბითი ენები',
- 'vector-editwarning-warning' => 'სხვრგვერდზე გáƒáƒ“áƒáƒ¡áƒ•áƒšáƒ გáƒáƒ›áƒáƒ˜áƒ¬áƒ•áƒ”ვს ცვლილებების დáƒáƒ™áƒáƒ áƒ’ვáƒáƒ¡.',
- 'vector-editwarning-preference' => 'გáƒáƒ›áƒáƒ¤áƒ áƒ—ხილე, რáƒáƒ“ესáƒáƒª დáƒáƒ•áƒ¢áƒáƒ•áƒ”ბ რედáƒáƒ¥áƒ¢áƒ˜áƒ áƒ”ბáƒáƒ“ გვერდს, დáƒáƒ£áƒ›áƒáƒ®áƒ¡áƒáƒ•áƒ áƒ”ბელი ცვლილებებით',
- 'vector-simplesearch-search' => 'ძიებáƒ',
- 'vector-simplesearch-containing' => 'შეიცáƒáƒ•áƒ¡...',
- 'vector-noexperiments-preference' => 'გáƒáƒ›áƒáƒ›áƒ áƒ˜áƒªáƒ®áƒ” შემდგáƒáƒ›áƒ˜ ექსპერიმენტებისგáƒáƒœ.',
- 'vector-footercleanup-transclusion' => 'ეს გვერდი შეიცáƒáƒ•áƒ¡ {{PLURAL:$1|ერთი სხვრგვერდის|$1 სხვრგვერდის}} {{PLURAL:$1|ჩáƒáƒœáƒáƒ áƒ—ს|ჩáƒáƒœáƒáƒ áƒ—ს}}.',
- 'vector-footercleanup-templates' => 'áƒáƒ› გვერდზე გáƒáƒ›áƒáƒ§áƒ”ნებული თáƒáƒ áƒ’ების ხილვáƒ',
- 'vector-footercleanup-categories' => 'áƒáƒ› გვერდის დáƒáƒ›áƒáƒšáƒ£áƒšáƒ˜ კáƒáƒ¢áƒ”გáƒáƒ áƒ˜áƒ”ბის ხილვáƒ',
-);
-
-/** Kazakh (Қазақша)
- * @author Kaztrans
- */
-$messages['kk'] = array(
- 'vector-editwarning-warning' => 'БаÑқа бетке Ó©Ñ‚Ñеңіз Ñіздің жазған Ñоңғы өңдемелеріңіз жойылуы мүмкін.
-Егер Ñiз жүйеде Ñ‚iркелÑеңiз, онда Ñiз баптауларыңыздағы «Өңдеу» бөлігіне кіріп, бұл еÑкертуді өшіре алаÑыз.',
-);
-
-/** Kazakh (Cyrillic script) (қазақша (кирил)‎)
- * @author GaiJin
- * @author Kaztrans
- */
-$messages['kk-cyrl'] = array(
- 'vector-editwarning-warning' => 'БаÑқа бетке Ó©Ñ‚Ñеңіз Ñіздің жазған Ñоңғы өңдемелеріңіз жойылуы мүмкін.
-Егер Ñiз жүйеде Ñ‚iркелÑеңiз, онда Ñiз баптауларыңыздағы «Өңдеу» бөлігіне кіріп, бұл еÑкертуді өшіре алаÑыз.',
- 'vector-simplesearch-search' => 'Іздеу',
- 'vector-noexperiments-preference' => 'Параметр ÑкÑперименттеріне қатыÑтырма',
-);
-
-/** Kalaallisut (kalaallisut)
- * @author Qaqqalik
- */
-$messages['kl'] = array(
- 'vector-simplesearch-search' => 'Ujarlerit',
-);
-
-/** Khmer (ភាសាážáŸ’មែរ)
- * @author គីមស៊្រុន
- */
-$messages['km'] = array(
- 'vector-collapsiblenav-preference' => 'ប្រើមុážáž„ារលាážáž”ើកលាážáž”ិទធាážáž»áž€áŸ’នុងរបារចំហៀងសំរាប់សំបកវ៉ិចទáŸážš',
- 'vector-collapsiblenav-more' => 'ភាសាផ្សáŸáž„ទៀáž',
- 'vector-editwarning-warning' => 'ចាកចáŸáž‰áž–ីទំពáŸážšáž“áŸáŸ‡ នឹងធ្វើឲ្យអ្នកបាážáŸ‹áž”ង់កំណែប្រែដែលអ្នកបានធ្វើ។
-ប្រសិនបើអ្នកបានកážáŸ‹ážˆáŸ’មោះរួចហើយ អ្នកអាច​បិទ​បម្រាម​នáŸáŸ‡â€‹áž“ៅ​ក្នុងផ្នែក​ "កំណែប្រែ" នៃ​ចំណូល​ចិážáŸ’ážâ€‹ážšáž”ស់​អ្នក​។',
- 'vector-editwarning-preference' => 'សូមព្រមាន​ážáŸ’ញុំ​ áž–áŸáž›ážŠáŸ‚áž›ážáŸ’ញុំ​ចាកចáŸáž‰â€‹áž–ី​ទំពáŸážšâ€‹áž€áŸ‚ប្រែដោយមិន​បានរក្សា​ទុកបំលាស់ប្ដូរ​នានា​',
- 'vector-simplesearch-search' => 'ស្វែងរក​',
- 'vector-simplesearch-containing' => 'ដែលមានពាក្យ...',
- 'vector-noexperiments-preference' => 'ដកážáŸ’ញុំចáŸáž‰áž–ីការពិសោធនáŸáž˜áž»ážáž„ារážáŸ’មីៗ',
-);
-
-/** Korean (한국어)
- * @author Albamhandae
- * @author IRTC1015
- * @author Kwj2772
- * @author ì•„ë¼
- */
-$messages['ko'] = array(
- 'vector' => '벡터 ìŠ¤í‚¨ì˜ ì‚¬ìš©ìž ì¸í„°íŽ˜ì´ìŠ¤ë¥¼ í–¥ìƒ',
- 'vector-desc' => '벡터 ìŠ¤í‚¨ì„ ì‚¬ìš©í•  ë•Œ ì‚¬ìš©ìž ì¸í„°íŽ˜ì´ìŠ¤ë¥¼ í–¥ìƒí•©ë‹ˆë‹¤',
- 'vector-collapsiblenav-preference' => '벡터 스킨ì—ì„œ 사ì´ë“œë°” 항목 접기 활성화',
- 'vector-collapsiblenav-more' => '기타 언어',
- 'vector-simplesearch-search' => '찾기',
- 'vector-simplesearch-containing' => 'ë‹¤ìŒ ì–´êµ¬ê°€ 들어간 문서 찾기',
- 'vector-noexperiments-preference' => '기능 실험ì—ì„œ 나를 제외',
- 'vector-footercleanup-transclusion' => 'ì´ ë¬¸ì„œëŠ” {{PLURAL:$1|다른 문서 í•œ ê°œ|다른 문서 $1ê°œ}}ì˜ {{PLURAL:$1|í‹€}}ì„ í¬í•¨í•©ë‹ˆë‹¤.',
- 'vector-footercleanup-templates' => 'ì´ ë¬¸ì„œì— ì‚¬ìš©ëœ í‹€ 보기',
- 'vector-footercleanup-categories' => 'ì´ ë¬¸ì„œì˜ ìˆ¨ì€ ë¶„ë¥˜ 보기',
-);
-
-/** Karachay-Balkar (къарачай-малкъар)
- * @author Iltever
- */
-$messages['krc'] = array(
- 'vector' => '«Вектор» темагъа интерфейÑни игилендириу',
- 'vector-desc' => '«Вектор» темагъа къошулуучу интерфейÑни игилендириулери', # Fuzzy
- 'vector-collapsiblenav-preference' => 'Сол менюда «Вектор» темада блокла джашырыу амалны джандыр',
- 'vector-collapsiblenav-more' => 'Дагъыда тилле',
- 'vector-editwarning-warning' => 'Башха бетге кёчÑегиз, Ñтген тюрлениулеригиз Ñ‚Ð°Ñ Ð±Ð¾Ð»ÑƒÑ€Ð³ÑŠÐ° боллукъдула.
-СиÑтемада региÑтрациÑны ётген ÑÑегиз, бу билдириуню джарашдырыуларыгъызны «Тюрлендириу» деген бёлюмюнде джукълатыргъа боллукъÑуз.',
- 'vector-editwarning-preference' => 'Тюрлендириулени Ñакълатмай редакторлау бетден кетген Ñагъатымда билдир',
- 'vector-simplesearch-search' => 'Излеу',
- 'vector-simplesearch-containing' => 'ичиндегиÑи…',
-);
-
-/** Colognian (Ripoarisch)
- * @author Purodha
- */
-$messages['ksh'] = array(
- 'vector' => 'Verbäßert Schnettschtäll för Minsche en dä Vektor Bovverfläsch.',
- 'vector-desc' => 'Verbäßert de Schnettschtäll för der Minsch met dä Vektor Bovverfläsch.',
- 'vector-collapsiblenav-preference' => 'Donn zohlohße, Ußwahle em Ußsinn „Vektor“ zoh_ze_klappe',
- 'vector-collapsiblenav-more' => 'Mieh Shprooche',
- 'vector-editwarning-warning' => 'Wann de vun hee dä Sigg fott jeihß, doh künnte all Ding Änderunge aan dä Sigg verschött jonn.
-Do kanns heh di Warnung affschallde, wann de aanjemelldt un enjelogg bes, dann kriß de se nieh mieh wider. Jangk doför en dä Affschnett „Beim Bearbeide“ en Dinge Enshtellunge.',
- 'vector-editwarning-preference' => 'Donn mesch warne, wann esch vun en Sigg fott jonn, ih dat esch all ming Änderunge avjeschpeischert hann.',
- 'vector-simplesearch-search' => 'Söhke',
- 'vector-simplesearch-containing' => 'dren änthallde…',
- 'vector-noexperiments-preference' => 'Donn mesch nit met neue Saache zom Ußprobeere behällijje',
- 'vector-footercleanup-transclusion' => 'Heh di Sigg trick {{PLURAL:$1|ein ander Sigg|$1 ander Sigge|kein ander Sigg}} en sesch eren.',
- 'vector-footercleanup-templates' => 'Donn de Schablohne op heh dä Sigg aanzeije',
- 'vector-footercleanup-categories' => 'Donn de verschtoche Saachjrioppe vun heh dä Sigg aanzeije',
-);
-
-/** Kurdish (Latin script) (Kurdî (latînî)‎)
- * @author Erdal Ronahi
- */
-$messages['ku-latn'] = array(
- 'vector-collapsiblenav-more' => 'Zêdetir ziman',
- 'vector-simplesearch-search' => 'Lêgerîn',
- 'vector-simplesearch-containing' => 'dihundirîne...',
-);
-
-/** Cornish (kernowek)
- * @author Kernoweger
- * @author Kw-Moon
- * @author Nrowe
- */
-$messages['kw'] = array(
- 'vector-collapsiblenav-more' => 'Moy yethow',
- 'vector-editwarning-warning' => 'Mar tewgh why ha gasa an folen-ma, chanjyow eus gwres genowgh a alsa bos kellys.
-Mars owgh why omgelmys, why a yll dialosegy an gwarnyans-ma yn trogh "Chanjya" agas dowisyansow.',
- 'vector-editwarning-preference' => 'Gwra ow gwarnya pan wrellen vy gasa folen chanjya gans chanjyow nag eus gwithys',
- 'vector-simplesearch-search' => 'Whilas',
- 'vector-simplesearch-containing' => 'ynno...',
- 'vector-footercleanup-templates' => "Gweles an scantlyns war'n folen-ma",
- 'vector-footercleanup-categories' => "Gweles an classys cudhys war'n folen-ma",
-);
-
-/** Latin (Latina)
- */
-$messages['la'] = array(
- 'vector-simplesearch-search' => 'Quaerere',
-);
-
-/** Luxembourgish (Lëtzebuergesch)
- * @author Robby
- */
-$messages['lb'] = array(
- 'vector' => 'Verbesserunge vum Benotzer-IInterface (UI) fir Vector',
- 'vector-desc' => "Verbessert am Benotzer-Interface Elementer wann d'Ausgesinn ''Vector'' benotzt gëtt.",
- 'vector-collapsiblenav-preference' => 'Zesummeklappe vun Objeten am Navigatiounsmenü am Vector-Ausgesinn aschalten',
- 'vector-collapsiblenav-more' => 'Méi Sproochen',
- 'vector-simplesearch-search' => 'Sichen',
- 'vector-simplesearch-containing' => 'mat ...',
- 'vector-noexperiments-preference' => 'Mech vun Experimenter mat neie Fonctiounen eraushuelen',
- 'vector-footercleanup-transclusion' => 'Op dëser Säit {{PLURAL:$1|ass eng Säit|sinn $1 Säiten}} agebonn.',
- 'vector-footercleanup-templates' => 'Schablounen op dëser Säit weisen',
- 'vector-footercleanup-categories' => 'Verstoppte Kategorien op dëser Säit weisen',
-);
-
-/** Ganda (Luganda)
- * @author Kizito
- */
-$messages['lg'] = array(
- 'vector-editwarning-warning' => 'Bw\'ova ku lupapula luno kiyinza okuleetera enkyukakyuka z\'olukozeko okuvawo.<br />
-Bw\'oba nga okola oyingidde mu sisitemu, okulabula kuno oyinza okukusirisa nga weyambisa<br />
-ebiri mu kitundu ekya "Kukyusa" eky\'omu "Nteekateeka yange".',
-);
-
-/** Limburgish (Limburgs)
- * @author Ooswesthoesbes
- */
-$messages['li'] = array(
- 'vector' => 'Vectorgebroekersinterfaceverbaeteringe',
- 'vector-desc' => 'Verbaetertj de vectorgebroekersinterface-illemente', # Fuzzy
- 'vector-collapsiblenav-preference' => 'Zèt inklapbaar navigatiemenu in bie vectorgebroek',
- 'vector-collapsiblenav-more' => 'Mieë spräök',
- 'vector-editwarning-warning' => "Es se dees pagina verleets verluus se meugelik wieziginge die se haes gemaak.
-Es se bös aangemeld, kins se dees waorsjoewing oetzètten in 't bewerkingstabblaad in dien veurkäöre.",
- 'vector-editwarning-preference' => "Waorssjoew mich es ich 'n bewerkdje pagina die nag neet is opgeslage wil verlaote",
- 'vector-simplesearch-search' => 'Zeuke',
- 'vector-simplesearch-containing' => 'bevat...',
- 'vector-noexperiments-preference' => "Laot mich in 't vervolg neet mier mitdoon aan experimente",
- 'vector-footercleanup-transclusion' => "Dees pagina bevat {{PLURAL:$1|'n transclusie|transclusies}} van {{PLURAL:$1|ein anger pagina|$1 anger pagina's}}.",
-);
-
-/** Lithuanian (lietuvių)
- * @author Garas
- * @author Matasg
- */
-$messages['lt'] = array(
- 'vector' => '„Vektorinės“ vartotojo sąsajos patobulinimai',
- 'vector-collapsiblenav-more' => 'Daugiau kalbų',
- 'vector-editwarning-warning' => 'Palikdamas šį puslapį jūs prarasite visus padarytus pakeitimus.',
- 'vector-editwarning-preference' => 'Perspėti mane, kai palieku redagavimo puslapį, o jame yra neišsaugotų pakeitimų',
- 'vector-simplesearch-search' => 'Ieškoti',
-);
-
-/** Mizo (Mizo ţawng)
- * @author RMizo
- */
-$messages['lus'] = array(
- 'vector-collapsiblenav-more' => 'Å¢awng dangin',
- 'vector-editwarning-preference' => 'Ka phêk siam danglamna ka dahţhat theihnghilh palh chuan min hrilh rawh',
- 'vector-simplesearch-search' => 'Zawnna',
- 'vector-simplesearch-containing' => 'hemi thu telna hi...',
-);
-
-/** Latvian (latviešu)
- * @author GreenZeb
- * @author Xil
- */
-$messages['lv'] = array(
- 'vector' => 'Vector lietotÄja saskarsnes uzlabojumi',
- 'vector-desc' => 'Uzlabo lietotÄja saskarsnes elementus Vector apdarÄ“.', # Fuzzy
- 'vector-collapsiblenav-more' => 'VairÄk valodu',
- 'vector-editwarning-warning' => 'AtstÄjot Å¡o lapu tu zaudÄ“si izdarÄ«tÄs izmaiņas.
-Ja esi pieteicies, jÅ«s vari atspÄ“jot Å¡o brÄ«dinÄjumu savÄs izvÄ“lÄ“s sadaÄ¼Ä "rediģēšana"',
- 'vector-editwarning-preference' => 'BrÄ«dinÄt mani, kad es atstÄju lapas rediģēšanu nesaglabÄjot izmaiņas',
- 'vector-simplesearch-search' => 'Meklēt',
- 'vector-simplesearch-containing' => 'MeklÄ“jamÄ frÄze:',
-);
-
-/** Minangkabau (Baso Minangkabau)
- * @author Iwan Novirion
- * @author VoteITP
- */
-$messages['min'] = array(
- 'vector' => 'Maningkekan UI untuak Vector',
- 'vector-desc' => 'Maningkekan antamuka pangguno bilo mamakai kulik Vektor',
- 'vector-collapsiblenav-preference' => 'Aktifkan fungsi menu bukak-tutuik pado sidebar di kulik Vektor',
- 'vector-collapsiblenav-more' => 'Labiah banyak bahaso',
- 'vector-simplesearch-search' => 'Cari',
- 'vector-simplesearch-containing' => 'barisi...',
- 'vector-noexperiments-preference' => 'Jan ikuikan Ambo jo uji-cubo fitur',
- 'vector-footercleanup-transclusion' => 'Laman ko barisi {{PLURAL:$1|transklusi}} {{PLURAL:$1|$1 laman}}.',
- 'vector-footercleanup-templates' => 'Caliak templat di laman ko',
- 'vector-footercleanup-categories' => 'Caliak kategori tasuruak pado laman ko',
-);
-
-/** Macedonian (македонÑки)
- * @author Bjankuloski06
- * @author Brest
- */
-$messages['mk'] = array(
- 'vector' => 'Подобрувања на поÑредникот за изгледот „ВекторÑки“',
- 'vector-desc' => 'Ги подобрува кориÑничкиот поÑредник кога Ñе кориÑти рувото „ВекторÑко“',
- 'vector-collapsiblenav-preference' => 'Овозможи раÑклопување на елементи во навигационо мени во рувото „ВекторÑко“',
- 'vector-collapsiblenav-more' => 'Повеќе јазици',
- 'vector-editwarning-warning' => 'Ðко ја напуштите Ñтраницата ќе ги изгубите Ñите промени кои Ñте ги направиле.
-Ðко Ñте најавени, можете да го иÑклучите ова предупредување во одделот „Уредување“ во вашите нагодувања.',
- 'vector-editwarning-preference' => 'Предупреди ме кога Ñакам да напуштам Ñтраница за уредување без да ги имам зачувано промените',
- 'vector-simplesearch-search' => 'Пребарување',
- 'vector-simplesearch-containing' => 'Ñодржи...',
- 'vector-noexperiments-preference' => 'Изземи ме од екÑперименти Ño функции',
- 'vector-footercleanup-transclusion' => 'Оваа Ñтраница Ñодржи {{PLURAL:$1|превметнување|превметнувања}} на уште $1 {{PLURAL:$1|друга Ñтраница|други Ñтраници}}.',
- 'vector-footercleanup-templates' => 'Погл. шаблони на Ñтраницава',
- 'vector-footercleanup-categories' => 'Погл. Ñкриени категории на Ñтраницава',
-);
-
-/** Malayalam (മലയാളം)
- * @author Junaidpv
- * @author Praveenp
- */
-$messages['ml'] = array(
- 'vector' => 'വെകàµà´±àµà´±àµ¼ ദൃശàµà´¯à´°àµ‚പതàµà´¤à´¿à´¨àµà´±àµ† സമàµà´ªàµ¼à´•àµà´•à´®àµà´– മെചàµà´šà´ªàµà´ªàµ†à´Ÿàµà´¤àµà´¤à´²àµà´•àµ¾',
- 'vector-desc' => 'വെകàµà´±àµà´±àµ¼ ദൃശàµà´¯à´°àµ‚പം ഉപയോഗികàµà´•àµà´®àµà´ªàµ‹àµ¾ ഉപയോകàµà´¤àµƒà´¸à´®àµà´ªàµ¼à´•àµà´•à´®àµà´–à´‚ മെചàµà´šà´ªàµà´ªàµ†à´Ÿàµà´¤àµà´¤àµà´¨àµà´¨àµ',
- 'vector-collapsiblenav-preference' => 'വെകàµà´±àµà´±àµ¼ ദൃശàµà´¯à´°àµ‚പതàµà´¤à´¿àµ½ ഇടതàµà´µà´¶à´¤àµà´¤àµ† വഴികാടàµà´Ÿà´¿ മെനൠചàµà´°àµà´•àµà´•à´¾à´µàµà´¨àµà´¨à´¤à´¾à´•àµà´•à´¿ സജàµà´œàµ€à´•à´°à´¿à´•àµà´•àµà´•',
- 'vector-collapsiblenav-more' => 'ഇതര ഭാഷകളിൽ',
- 'vector-editwarning-warning' => 'à´ˆ താളിൽ നിനàµà´¨àµà´‚ പോകàµà´¨àµà´¨à´¤àµ താങàµà´•àµ¾ വരàµà´¤àµà´¤à´¿à´¯ മാറàµà´±à´™àµà´™àµ¾ നഷàµà´Ÿà´ªàµà´ªàµ†à´Ÿà´¾àµ» ഇടയാകàµà´•àµà´‚.
-താങàµà´•àµ¾ ലോഗിൻ ചെയàµà´¤à´¿à´Ÿàµà´Ÿàµà´£àµà´Ÿàµ†à´™àµà´•à´¿àµ½, താങàµà´•à´³àµà´Ÿàµ† à´•àµà´°à´®àµ€à´•à´°à´£à´™àµà´™à´³à´¿àµ½ "തിരàµà´¤àµà´¤àµ½" à´Žà´¨àµà´¨ ഭാഗതàµà´¤àµ ചെനàµà´¨àµ à´ˆ അറിയിപàµà´ªàµ à´ªàµà´°à´¦àµ¼à´¶à´¿à´ªàµà´ªà´¿à´•àµà´•àµà´¨àµà´¨à´¤àµ ഒഴിവാകàµà´•à´¾à´µàµà´¨àµà´¨à´¤à´¾à´£àµ.',
- 'vector-editwarning-preference' => 'സേവൠചെയàµà´¯à´¾à´¤àµà´¤ മാറàµà´±à´™àµà´™à´³àµ‹à´Ÿàµ കൂടിയ തിരàµà´¤àµà´¤àµ½ താളിൽ നിനàµà´¨àµà´‚ പോകàµà´®àµà´ªàµ‹àµ¾ à´Žà´¨àµà´¨àµ† അറിയികàµà´•àµà´•',
- 'vector-simplesearch-search' => 'തിരയàµà´•',
- 'vector-simplesearch-containing' => 'ഉൾപàµà´ªàµ†à´Ÿàµà´¨àµà´¨à´µ...',
- 'vector-noexperiments-preference' => 'സവിശേഷഗàµà´£à´™àµà´™àµ¾ പരീകàµà´·à´¿à´•àµà´•àµà´¨àµà´¨à´¤à´¿àµ½ നിനàµà´¨àµà´‚ à´Žà´¨àµà´¨àµ† ഒഴിവാകàµà´•àµà´•',
- 'vector-footercleanup-transclusion' => 'à´ˆ താളിൽ {{PLURAL:$1|മറàµà´±àµŠà´°àµ താൾ|മറàµà´±àµ $1 താളàµà´•àµ¾}} ഉൾപàµà´ªàµ†à´Ÿàµà´¤àµà´¤à´¿à´¯à´¿à´Ÿàµà´Ÿàµà´£àµà´Ÿàµ.',
- 'vector-footercleanup-templates' => 'à´ˆ താളിലെ ഫലകങàµà´™àµ¾ കാണàµà´•',
- 'vector-footercleanup-categories' => 'à´ˆ താളിൽ മറഞàµà´žà´¿à´°à´¿à´•àµà´•àµà´¨àµà´¨ വർഗàµà´—à´™àµà´™àµ¾ കാണàµà´•',
-);
-
-/** Mongolian (монгол)
- */
-$messages['mn'] = array(
- 'vector-simplesearch-search' => 'Хайх',
-);
-
-/** Marathi (मराठी)
- * @author Mahitgar
- * @author V.narsikar
- */
-$messages['mr'] = array(
- 'vector' => 'समदिश परिधानाचà¥à¤¯à¤¾ उपयोगकरà¥à¤¤à¤¾-आंतरपृषà¥à¤ à¤¾à¤¤à¥€à¤²(UI) सà¥à¤§à¤¾à¤°à¤£à¤¾',
- 'vector-desc' => 'समदिश परिधान (वà¥à¤¹à¥‡à¤•à¥à¤Ÿà¤°) तà¥à¤µà¤šà¥‡à¤šà¥à¤¯à¤¾ उपयोगकरà¥à¤¤à¤¾-आंतरपृषà¥à¤  (इंटरफेस) घटकांमधà¥à¤¯à¥‡ सà¥à¤§à¤¾à¤°à¤£à¤¾ करते', # Fuzzy
- 'vector-collapsiblenav-preference' => 'समदिश परिधानाचà¥à¤¯à¤¾ सà¥à¤šà¤¾à¤²à¤¨à¤¾à¤¨à¥à¤•à¥à¤°à¤®à¤¾à¤¤à¥€à¤² घटकांची घडीकà¥à¤·à¤®à¤¤à¤¾ सकà¥à¤·à¤® करा.',
- 'vector-collapsiblenav-more' => 'इतर भाषा दाखवा',
- 'vector-editwarning-warning' => "या पानावरà¥à¤¨ दà¥à¤¸à¤°à¥â€à¤¯à¤¾ पानावर गेलà¥à¤¯à¤¾à¤¸, तà¥à¤®à¥à¤¹à¥€ येथे केलेले बदल जतन होणार नाहीत.
-ही सूचना घालवणà¥à¤¯à¤¾à¤¸à¤¾à¤ à¥€ ''माà¤à¥à¤¯à¤¾ पसंती'' मधील संपादनपसंतीत बदल करा.",
- 'vector-editwarning-preference' => 'जर मी संपादित करीत असलेलà¥à¤¯à¤¾ पानावरील माà¤à¥‡ संपादिलेले बदल जतन न केलà¥à¤¯à¤¾à¤¸ मला इशारा दà¥à¤¯à¤¾',
- 'vector-simplesearch-search' => 'शोधा',
- 'vector-simplesearch-containing' => '.......हे असलेले',
- 'vector-noexperiments-preference' => 'पà¥à¤°à¤¾à¤¯à¥‹à¤—िक वैशिषà¥à¤Ÿà¥à¤¯à¤¾à¤ªà¤¾à¤¸à¥‚न मला दूर ठेवा',
-);
-
-/** Malay (Bahasa Melayu)
- * @author Anakmalaysia
- * @author Aurora
- * @author Diagramma Della Verita
- */
-$messages['ms'] = array(
- 'vector' => 'pembaikian untuk Vector',
- 'vector-desc' => 'Meningkatkan antara muka pengguna ketika menggunakan kulit Vector',
- 'vector-collapsiblenav-preference' => 'Aktifkan menu navigasi pada laman',
- 'vector-collapsiblenav-more' => 'Bahasa lain',
- 'vector-editwarning-warning' => 'Meninggalkan laman ini mungkin akan menyebabkan anda kehilangan sebarang perubahan yang telah anda lakukan.
-Anda boleh melumpuhkan amaran in di bahagian "Menyunting" dalam keutamaan anda.',
- 'vector-editwarning-preference' => 'Beri saya amaran apabila saya meninggalkan sesebuah laman penyuntingan tanpa menyimpan perubahan.',
- 'vector-simplesearch-search' => 'Cari',
- 'vector-simplesearch-containing' => 'mengandungi...',
- 'vector-noexperiments-preference' => 'Kecualikan saya dari uji kaji ciri',
- 'vector-footercleanup-transclusion' => 'Laman ini mengandungi {{PLURAL:$1|transklusi|transklusi-transklusi}} {{PLURAL:$1|satu laman lain|$1 laman lain}}.',
- 'vector-footercleanup-templates' => 'Lihat templat pada halaman ini',
- 'vector-footercleanup-categories' => 'Lihat kategori tersembunyi pada halaman ini',
-);
-
-/** Maltese (Malti)
- * @author Chrisportelli
- */
-$messages['mt'] = array(
- 'vector' => 'Titjib tal-interfaċċa tal-utent għal Vector',
- 'vector-desc' => 'Ittejjeb l-elementi tal-interfaċċa tal-utent tal-aspett grafiku Vector.', # Fuzzy
- 'vector-collapsiblenav-preference' => "Ippermetti ''menus'' tan-navigazzjoni li jistew jinħbew fl-aspett grafiku Vector",
- 'vector-collapsiblenav-more' => 'Aktar lingwi',
- 'vector-editwarning-warning' => 'Jekk tħalli din il-paġna jista\' jwassal sabiex titlef kwalunkwe tibdil li tkun għamilt. Jekk int tinsab fil-kont tiegħek, tista\' tneħħi dan l-avviż fis-sezzjoni "Modifiki" tal-preferenzi tiegħek.',
- 'vector-editwarning-preference' => "Avżani kull meta nħalli paġna ta' modifika b'modifiki li għadhom ma ġewx salvati",
- 'vector-simplesearch-search' => 'Fittex',
- 'vector-simplesearch-containing' => 'li tinkludi...',
- 'vector-noexperiments-preference' => 'Eskludini minn esperimenti tal-funzjonalitajiet',
- 'vector-footercleanup-transclusion' => "Din il-paġna tinkludi l-{{PLURAL:$1|inklużjoni|inklużjonijiet}} ta' {{PLURAL:$1|paġna oħra|$1 paġni oħra}}.",
-);
-
-/** Nahuatl (NÄhuatl)
- * @author Ricardo gs
- * @author Teòtlalili
- */
-$messages['nah'] = array(
- 'vector-collapsiblenav-more' => 'Okseki tlâtòltìn',
- 'vector-simplesearch-search' => 'Tlatēmoliztli',
-);
-
-/** Norwegian Bokmål (norsk (bokmål)‎)
- * @author Danmichaelo
- * @author Event
- * @author Jsoby
- * @author Laaknor
- * @author Nghtwlkr
- */
-$messages['nb'] = array(
- 'vector' => 'Brukergrensesnittsforbedringer for Vector',
- 'vector-desc' => 'Forbedrer brukergrensesnittet for Vector-utseendet.',
- 'vector-collapsiblenav-preference' => 'Aktiver sammenlegging av element i navigeringsmenyen i drakten Vector',
- 'vector-collapsiblenav-more' => 'Flere språk',
- 'vector-editwarning-warning' => 'Ved å forlate siden vil du miste alle endringer du har utført.
-Denne advarselen kan slås av under Redigering i instillingene dine.',
- 'vector-editwarning-preference' => 'Si ifra dersom jeg forlater en side jeg har gjort redigeringer på men ikke har lagret siden.',
- 'vector-simplesearch-search' => 'Søk',
- 'vector-simplesearch-containing' => 'inneholder …',
- 'vector-noexperiments-preference' => 'Ekskluder meg fra funksjonseksperimenter',
- 'vector-footercleanup-transclusion' => 'Denne siden inneholder {{PLURAL:$1|en transklusjon|transklusjoner}} av {{PLURAL:$1|én annen side|$1 andre sider}}.',
- 'vector-footercleanup-templates' => 'Vis maler på denne siden',
- 'vector-footercleanup-categories' => 'Vis skjulte kategorier på denne siden',
-);
-
-/** Nedersaksies (Nedersaksies)
- * @author Servien
- */
-$messages['nds-nl'] = array(
- 'vector-collapsiblenav-preference' => 'Inklapbaor navigasiemenu inschakelen bie t gebruuk van Vector',
- 'vector-collapsiblenav-more' => 'Meer talen',
- 'vector-editwarning-warning' => "A'j disse zied aofsluten dan kan t ween dat der wieziging die'j emaakt hebben kwiet raken.
-A'j an-emeld bin, dan ku'j disse waorschuwing uutzetten in t tabblad \"Bewarken\" in joew veurkeuren.",
- 'vector-editwarning-preference' => "Waorschuw mien a'k n bewörken zied aof wil sluten die nog niet op-esleugen is",
- 'vector-simplesearch-search' => 'Zeuken / zuken / zuiken',
- 'vector-simplesearch-containing' => 'bevat...',
-);
-
-/** Dutch (Nederlands)
- * @author SPQRobin
- * @author Siebrand
- */
-$messages['nl'] = array(
- 'vector' => 'Gebruikersinterfaceverbeteringen voor Vector',
- 'vector-desc' => 'Verbetert de gebruikersinterface van het uiterlijk Vector',
- 'vector-collapsiblenav-preference' => 'Inklapbaar navigatiemenu inschakelen bij gebruik van Vector',
- 'vector-collapsiblenav-more' => 'Meer talen',
- 'vector-editwarning-warning' => 'Als u deze pagina verlaat verliest u mogelijk wijzigingen die u hebt gemaakt.
-Als u bent aangemeld, kunt u deze waarschuwing uitschakelen in het tabblad "Bewerken" in uw voorkeuren.',
- 'vector-editwarning-preference' => 'Waarschuw mij als ik een bewerkte pagina die nog niet is opgeslagen wil verlaten',
- 'vector-simplesearch-search' => 'Zoeken',
- 'vector-simplesearch-containing' => 'bevat...',
- 'vector-noexperiments-preference' => 'Mij in de toekomst niet laten deelnemen aan experimenten',
- 'vector-footercleanup-transclusion' => "Deze pagina bevat {{PLURAL:$1|een transclusie|transclusies}} van {{PLURAL:$1|één andere pagina|$1 andere pagina's}}.",
- 'vector-footercleanup-templates' => 'Sjablonen van deze pagina weergeven',
- 'vector-footercleanup-categories' => 'Verborgen categorieën van deze pagina weergeven',
-);
-
-/** Nederlands (informeel)‎ (Nederlands (informeel)‎)
- * @author Siebrand
- */
-$messages['nl-informal'] = array(
- 'vector-editwarning-warning' => 'Als je deze pagina verlaat verlies je mogelijk wijzigingen die je hebt gemaakt.
-Als je bent aangemeld, kan je deze waarschuwing uitschakelen in het tabblad "Bewerken" in je voorkeuren.',
-);
-
-/** Norwegian Nynorsk (norsk (nynorsk)‎)
- * @author Gunnernett
- * @author Njardarlogar
- */
-$messages['nn'] = array(
- 'vector-collapsiblenav-more' => 'Fleire språk',
- 'vector-editwarning-warning' => 'Gjennom å navigera bort frå sida vil du missa alle endringane du måtte ha gjort.
-Om du er innlogga, kan du slå av denne åtvaringa under «Endring» i instillingane dine.',
- 'vector-editwarning-preference' => 'Gje ei åtvaring om eg går ut av ei redigeringsside og ikkje alle endringar er lagra',
- 'vector-simplesearch-search' => 'Søk',
- 'vector-simplesearch-containing' => 'inneheld ...',
-);
-
-/** Occitan (occitan)
- * @author Cedric31
- */
-$messages['oc'] = array(
- 'vector' => 'Melhoraments IU per Vector',
- 'vector-desc' => "Melhoraments dels elements de l'interfàcia d'utilizaire de l'abilhatge Vector.", # Fuzzy
- 'vector-collapsiblenav-preference' => "Activar lo menú de navigacion a esquèrra replegable amb l'abilhatge vector",
- 'vector-editwarning-warning' => "Quitar aquesta pagina vos farà pèrdre totas las modificacions qu'avètz fachas.
-Se sètz connectat amb vòstre compte, podètz levar aqueste avertiment dins la seccion Fenèstra de modificacion de vòstras preferéncias.",
- 'vector-editwarning-preference' => 'M’avisar quand quiti una pagina de modificacion sens publicar los cambiaments',
- 'vector-simplesearch-search' => 'Recercar',
- 'vector-simplesearch-containing' => 'que conten...',
-);
-
-/** Oriya (ଓଡ଼ିଆ)
- * @author Jnanaranjan Sahu
- * @author Odisha1
- * @author Psubhashish
- * @author Shisir 1945
- */
-$messages['or'] = array(
- 'vector' => 'ଭେକà­à¬Ÿà¬° ପାଇଠଇଉଜର ଇଣà­à¬Ÿà¬°à¬«à­‡à¬¸ ଉନà­à¬¨à¬¤à¬¿à¬•à¬°à¬£',
- 'vector-desc' => 'ଭେକà­à¬Ÿà¬° ଆବରଣରେ ବà­à­Ÿà¬¬à¬¹à¬¾à¬° କରà­à¬¥à¬¿à¬¬à¬¾ ବେଳେ ଇଉଜର ଇଣà­à¬Ÿà¬°à¬«à­‡à¬¸à¬•à­ ଉନà­à¬¨à¬¤ କରିବେ ।',
- 'vector-collapsiblenav-preference' => 'ଭେକà­à¬Ÿà¬° ବହିରାବରଣରେ କଡ଼ରେ ଥିବା ପଟିକାର ଚିଜ ସବà­à¬•à­ ଦେଖାଇବା-ଲà­à¬šà¬¾à¬‡à¬¬à¬¾ ସଚଳ କରିବେ',
- 'vector-collapsiblenav-more' => 'ଅଧିକ ଭାଷା',
- 'vector-editwarning-warning' => 'à¬à¬¹à¬¿ ପୃଷà­à¬ à¬¾à¬•à­ ଛାଡ଼ି ଚାଲିଗଲେ ହà­à¬ ତ ଆପଣ କରିଥିବା କିଛି ସମà­à¬ªà¬¾à¬¦à¬¨à¬¾ ହରାଇ ପାରନà­à¬¤à¬¿ ।
-ଯଦି ଆପଣ ଲଗ ଇନ କରିଥାନà­à¬¤à¬¿ ତେବେ ଆପଣଙà­à¬• ପସନà­à¬¦à¬° "ସମà­à¬ªà¬¾à¬¦à¬¨à¬¾" ଭାଗରେ à¬à¬¹à¬¿ ଚେତାବନୀଟିକୠଅଚଳ କରିପାରିବେ ।',
- 'vector-editwarning-preference' => 'ଯେତେବେଳେ ମà­à¬ ଗୋଟିଠସାଇତାଯାଇନଥିବା ପୃଷà­à¬ à¬¾à¬•à­ ବନà­à¬¦ କରିଦିଠମୋତେ ଚେତାବନୀ ଦେବେ',
- 'vector-simplesearch-search' => 'ଖୋଜିବା',
- 'vector-simplesearch-containing' => 'ଧାରଣ ହେଉଛି...',
- 'vector-noexperiments-preference' => 'ସà­à¬¬à¬¿à¬§à¬¾à¬° ପରଖରୠମୋତେ ବାହାର କରିବେ',
- 'vector-footercleanup-transclusion' => 'à¬à¬¹à¬¿ ପୃଷà­à¬Ÿà¬¾à¬°à­‡ {{PLURAL:$1|one other page|$1 other pages}} ର {{PLURAL:$1|transclusion|transclusions}} ଅଛି',
- 'vector-footercleanup-templates' => 'à¬à¬¹à¬¿ ପୃଷà­à¬ à¬¾à¬°à­‡ ଥିବା ଟେମà­à¬ªà¬²à­‡à¬Ÿà¬—à­à¬¡à¬¿à¬•à­ ଦେଖିବେ',
- 'vector-footercleanup-categories' => 'à¬à¬¹à¬¿ ପୃଷà­à¬ à¬¾à¬°à­‡ ଲà­à¬šà¬¿à¬•à¬¿ ଥିବା ବିଭାଗଗà­à¬¡à¬¿à¬•à­ ଦେଖିବେ',
-);
-
-/** Ossetic (Ирон)
- * @author Bouron
- */
-$messages['os'] = array(
- 'vector-simplesearch-search' => 'Ðгурын',
- 'vector-simplesearch-containing' => 'кæдоны иÑ...',
-);
-
-/** Punjabi (ਪੰਜਾਬੀ)
- * @author Amire80
- */
-$messages['pa'] = array(
- 'vector-simplesearch-search' => 'ਖੋਜ',
-);
-
-/** Deitsch (Deitsch)
- * @author Xqt
- */
-$messages['pdc'] = array(
- 'vector-collapsiblenav-more' => 'Weidere Schprooche',
- 'vector-simplesearch-search' => 'Uffgucke',
-);
-
-/** Pälzisch (Pälzisch)
- * @author Manuae
- */
-$messages['pfl'] = array(
- 'vector-collapsiblenav-more' => 'Mea Schbooche',
- 'vector-simplesearch-search' => 'Suche',
-);
-
-/** Polish (polski)
- * @author BeginaFelicysym
- * @author Matma Rex
- * @author Sp5uhe
- */
-$messages['pl'] = array(
- 'vector' => 'Usprawnienia interfejsu użytkownika skórki Wektor',
- 'vector-desc' => 'Usprawnia elementy interfejsu użytkownika skórki Wektor',
- 'vector-collapsiblenav-preference' => 'Włącz zwijanie sekcji menu bocznego w skórce Wektor',
- 'vector-collapsiblenav-more' => 'Inne języki',
- 'vector-editwarning-warning' => 'Opuszczenie tej strony może spowodować utratę wprowadzonych przez Ciebie zmian.
-Jeśli jesteś zalogowany, możesz wyłączyć wyświetlanie tego ostrzeżenia w zakładce Edycja w swoich preferencjach.',
- 'vector-editwarning-preference' => 'Ostrzegaj mnie, gdy opuszczam stronÄ™ edycji bez zapisania zmian',
- 'vector-simplesearch-search' => 'Szukaj',
- 'vector-simplesearch-containing' => 'zawierajÄ…ce...',
- 'vector-noexperiments-preference' => 'Nie chcę w przyszłości brać udziału w testach',
- 'vector-footercleanup-transclusion' => 'Ta strona zawiera {{PLURAL:$1|dołączoną treść|dołączone treści}} z {{PLURAL:$1|jednej innej strony|$1 innych stron|$1 innych stron}}.',
- 'vector-footercleanup-templates' => 'Zobacz szablony użyte na tej stronie',
- 'vector-footercleanup-categories' => 'Zobacz ukryte kategorie dodane do tej strony',
-);
-
-/** Piedmontese (Piemontèis)
- * @author Borichèt
- * @author Dragonòt
- */
-$messages['pms'] = array(
- 'vector' => 'Ameliorament UI për Vector',
- 'vector-desc' => "A ameliora l'antërfacia utent quand as deuvra la pel Vector",
- 'vector-collapsiblenav-preference' => "Abilité a stërmé j'element ant la bara ëd navigassion ant ël livel Vector",
- 'vector-collapsiblenav-more' => "Pì 'd lenghe",
- 'vector-editwarning-warning' => "Lassé sta pàgina-sì a peul fé an manera che it perde tute le modìfiche ch'it l'has fàit.
-S'it ses logà, it peule disabilité st'avis-sì ant la session \"Quàder ëd modìfica dël test\" dij tò gust.",
- 'vector-editwarning-preference' => 'Avisme quand che i lasso na pàgina ëd modìfiche con modìfiche nen salvà',
- 'vector-simplesearch-search' => 'Arserca',
- 'vector-simplesearch-containing' => 'contenent ...',
- 'vector-noexperiments-preference' => "Gav-me da j'esperiment ëd le funsion",
- 'vector-footercleanup-transclusion' => "Costa pàgina a conten {{PLURAL:$1|transclusion|transclusion}} ëd {{PLURAL:$1|n'àutra pàgina|$1 àutre pàgine}}.",
- 'vector-footercleanup-templates' => 'Smon-e jë stamp dzora sta pàgina',
- 'vector-footercleanup-categories' => 'Vëdde le categorìe stërmà dzora sta pàgina',
-);
-
-/** Western Punjabi (پنجابی)
- * @author Khalid Mahmood
- */
-$messages['pnb'] = array(
- 'vector' => 'یو آئی بÛتریاں ویکٹر لئی',
- 'vector-desc' => 'ورتن والے دے وکھالے', # Fuzzy
- 'vector-collapsiblenav-preference' => 'ویکٹر سکن Ú† سائیڈ بار Ú† چیزاں دا ڈگنا Ûون دیو۔',
- 'vector-collapsiblenav-more' => 'Ûور بولیاں',
- 'vector-editwarning-warning' => 'اے صÙÛ’ توں جان تے ÛÙˆ سکدا Ø§ÙˆÛ Ø³Ø§Ø±ÛŒØ§Úº تبدیلیاں Ù…Ú© جان جیÛڑیاں تساں بناياں نیں۔
-اگر تسیں لاکان او، تسیں ایڈیٹنگ سیکشن چ اپنی پسنداں چ ایس خبرداری نوں پعلے ناں۔',
- 'vector-editwarning-preference' => 'جدوں میں کوئی صÙØ­Û ØªØ¨Ø¯ÛŒÙ„ÛŒ کر Ú©Û’ بچاۓ بغیر Ú†Ú¾ÚˆÙ† لگاں تے منوں دس دیو',
- 'vector-simplesearch-search' => 'کھوج',
- 'vector-simplesearch-containing' => 'بند کر ریا اے۔۔۔',
- 'vector-noexperiments-preference' => 'منوں نویاں شیواں دے تجربیاں توں بار رکھو',
-);
-
-/** Pontic (Ποντιακά)
- */
-$messages['pnt'] = array(
- 'vector-simplesearch-search' => 'ΑÏάεμαν',
-);
-
-/** Pashto (پښتو)
- * @author Ahmed-Najib-Biabani-Ibrahimkhel
- */
-$messages['ps'] = array(
- 'vector-collapsiblenav-preference' => 'د وکټور Ù¾ÙˆÚšÛ Ù¾Ù‡ څنګپټه Ú©Û Ø¯ توکو پرÚÛدنه چارنول',
- 'vector-collapsiblenav-more' => 'Ù†ÙˆØ±Û Ú˜Ø¨Û',
- 'vector-simplesearch-search' => 'پلټل',
- 'vector-noexperiments-preference' => 'ما په آزمÛښتي Úانګړنو Ú©Û Ù…Ù‡ شمÛرÛ.',
-);
-
-/** Portuguese (português)
- * @author Hamilton Abreu
- * @author Helder.wiki
- * @author Raylton P. Sousa
- */
-$messages['pt'] = array(
- 'vector' => 'Melhorias da interface do tema Vector',
- 'vector-desc' => 'Melhora os elementos da interface do utilizador para o tema Vector', # Fuzzy
- 'vector-collapsiblenav-preference' => 'Permitir o ocultamento dos elementos do menu de navegação no tema Vector',
- 'vector-collapsiblenav-more' => 'Mais línguas',
- 'vector-editwarning-warning' => 'Abandonar esta página pode fazer com que perca todas as suas alterações.
-Se estiver autenticado, pode desactivar este aviso na secção "Edição" das preferências.',
- 'vector-editwarning-preference' => 'Avisar-me ao abandonar uma página editada sem gravar as alterações.',
- 'vector-simplesearch-search' => 'Pesquisa',
- 'vector-simplesearch-containing' => 'contendo...',
- 'vector-noexperiments-preference' => 'Excluir-me da experimentação de funcionalidades',
- 'vector-footercleanup-transclusion' => 'Esta página contém {{PLURAL:$1|transclusão|transclusões}} de {{PLURAL:$1|uma outra página|$1 outras páginas}}.',
- 'vector-footercleanup-templates' => 'Ver predefinições utilizadas nesta página',
- 'vector-footercleanup-categories' => 'Ver categorias ocultas nesta página',
-);
-
-/** Brazilian Portuguese (português do Brasil)
- * @author Daemorris
- * @author Everton137
- * @author Giro720
- * @author Helder.wiki
- * @author Raylton P. Sousa
- */
-$messages['pt-br'] = array(
- 'vector' => 'Melhorias da IU do Vector',
- 'vector-desc' => 'Melhora a interface do usuário do tema Vector', # Fuzzy
- 'vector-collapsiblenav-preference' => 'Ativar o ocultamento de itens no menu de navegação no tema Vector',
- 'vector-collapsiblenav-more' => 'Mais idiomas',
- 'vector-editwarning-warning' => 'Abandonar esta página pode fazer com que você perca todas as alterações que fez.
-Se você estiver autenticado, você pode desabilitar este aviso na seção "Opções de edição" de suas preferências.',
- 'vector-editwarning-preference' => 'Avisar-me quando eu deixar uma janela de edição sem ter salvo as alterações',
- 'vector-simplesearch-search' => 'Pesquisa',
- 'vector-simplesearch-containing' => 'contendo...',
- 'vector-noexperiments-preference' => 'Excluir-me da experimentação de funcionalidades',
- 'vector-footercleanup-transclusion' => 'Esta página contém {{PLURAL:$1|transclusão|transclusões}} de {{PLURAL:$1|uma outra página|$1 outras páginas}}.',
- 'vector-footercleanup-templates' => 'Ver predefinições utilizadas nesta página',
- 'vector-footercleanup-categories' => 'Ver categorias ocultas nesta página',
-);
-
-/** Quechua (Runa Simi)
- * @author AlimanRuna
- */
-$messages['qu'] = array(
- 'vector' => 'Ruraqpaq uyapurapi Vector nisqapaq allinchasqakuna',
- 'vector-desc' => "Vector qarawan llamk'aptiykiqa ruraqpaq uyapuratam allinchan.",
- 'vector-collapsiblenav-preference' => "Vector qarap wamp'unanpi qallawa pakana llamk'anata atichiy",
- 'vector-collapsiblenav-more' => 'Aswan rimaykuna',
- 'vector-editwarning-warning' => "Kay p'anqata saqispaykiqa lliw rurarqusqayki hukchasqakunatachá chinkachiykiman.
-Yaykusqa kaspaykiqa, kay yuyampayta hark'ayta atinki allinkachinaykikunapi \"Llamk'apusqa\" rakipi.",
- 'vector-editwarning-preference' => "Yuyampaway p'anqata saqiptiy manaraq rurarqusqay hukchasqakunata waqaychaspay.",
- 'vector-simplesearch-search' => 'Maskay',
- 'vector-simplesearch-containing' => 'kaykunayuq: ...',
- 'vector-noexperiments-preference' => 'Ñuqawan ama lliplli llanchikukunata ruraychu',
-);
-
-/** Romanian (română)
- * @author AdiJapan
- * @author Minisarm
- */
-$messages['ro'] = array(
- 'vector' => 'Îmbunătățiri la nivelul interfeței Vector',
- 'vector-desc' => 'Îmbunătățiri ale interfeței când se utilizează interfața Vector.',
- 'vector-collapsiblenav-preference' => 'Activează ascunderea elementelor meniului de navigare în interfața Vector',
- 'vector-collapsiblenav-more' => 'Mai multe limbi',
- 'vector-editwarning-warning' => 'Părăsind această pagină, există riscul pierderii modificărilor efectuate.
-Dacă sunteți autentificat, puteți dezactiva această avertizare în secțiunea „Modificare†a preferințelor dumneavoastră.',
- 'vector-editwarning-preference' => 'Avertizează-mă când părăsesc o pagină fără a salva modificările',
- 'vector-simplesearch-search' => 'Căutare',
- 'vector-simplesearch-containing' => 'conținând...',
- 'vector-noexperiments-preference' => 'Nu mai vreau să iau parte la experimente viitoare',
- 'vector-footercleanup-transclusion' => 'Această pagină conține {{PLURAL:$1|o transcludere a |transcluderi ale}} {{PLURAL:$1|unei alte pagini|altor $1 pagini|altor $1 de pagini}}.',
-);
-
-/** tarandíne (tarandíne)
- * @author Joetaras
- */
-$messages['roa-tara'] = array(
- 'vector' => 'Miglioramende UI pe Vector',
- 'vector-desc' => "Migliore l'elemende de l'inderfacce utende quanne ause 'a visualizzazzione Vector",
- 'vector-collapsiblenav-preference' => "Abbilete 'a chiusure de le artichele jndr'à 'u menu de navigazione sus a 'u skin Vector",
- 'vector-collapsiblenav-more' => 'Cchiù linguagge',
- 'vector-simplesearch-search' => 'Cirche',
- 'vector-simplesearch-containing' => 'tène...',
- 'vector-noexperiments-preference' => 'Escludeme da le funziune sperimendale',
- 'vector-footercleanup-transclusion' => "Sta pàgene tène {{PLURAL:$1|inglusione|inglusiune}} de {{PLURAL:$1|'n'otra pàgene|$1 otre pàggene}}.",
- 'vector-footercleanup-templates' => "'Ndruche le template de sta pàgene",
- 'vector-footercleanup-categories' => 'Vide le categorije scunnute sus a sta pàgene',
-);
-
-/** Russian (руÑÑкий)
- * @author Base
- * @author G0rn
- * @author Ignatus
- * @author KPu3uC B Poccuu
- * @author Kaganer
- * @author MaxSem
- * @author ÐлекÑандр Сигачёв
- */
-$messages['ru'] = array(
- 'vector' => 'Ð£Ð»ÑƒÑ‡ÑˆÐµÐ½Ð¸Ñ Ð¸Ð½Ñ‚ÐµÑ€Ñ„ÐµÐ¹Ñа Ð´Ð»Ñ Ñ‚ÐµÐ¼Ñ‹ «Векторное»',
- 'vector-desc' => 'Улучшает пользовательÑкий Ð¸Ð½Ñ‚ÐµÑ€Ñ„ÐµÐ¹Ñ Ð´Ð»Ñ Ñ‚ÐµÐ¼Ñ‹ Ð¾Ñ„Ð¾Ñ€Ð¼Ð»ÐµÐ½Ð¸Ñ Â«Ð’ÐµÐºÑ‚Ð¾Ñ€Ð½Ð¾ÐµÂ»',
- 'vector-collapsiblenav-preference' => 'Разрешить Ñворачивать блоки в левом меню в теме «Векторное»',
- 'vector-collapsiblenav-more' => 'Больше Ñзыков',
- 'vector-editwarning-warning' => 'Переход на другую Ñтраницу может привеÑти к потере Ñделанных вами изменений.
-ЕÑли вы зарегиÑтрированы в ÑиÑтеме, то вы можете отключить Ñто предупреждение в разделе «Редактирование» ваших наÑтроек.',
- 'vector-editwarning-preference' => 'Предупреждать, когда Ñ Ð¿Ð¾ÐºÐ¸Ð´Ð°ÑŽ Ñтраницу Ñ Ð½ÐµÑохранёнными изменениÑми',
- 'vector-simplesearch-search' => 'ПоиÑк',
- 'vector-simplesearch-containing' => 'Ñодержащие…',
- 'vector-noexperiments-preference' => 'Ðе предлагать ÑкÑпериментальные возможноÑти',
- 'vector-footercleanup-transclusion' => 'Эта Ñтраница Ñодержит {{PLURAL:$1|включение|включениÑ}} {{PLURAL:$1|другой Ñтраницы|$1 других Ñтраниц}}.',
- 'vector-footercleanup-templates' => 'Показать шаблоны, иÑпользуемые Ñтой Ñтраницей',
- 'vector-footercleanup-categories' => 'Показать Ñкрытые категории Ñтой Ñтраницы',
-);
-
-/** Rusyn (руÑиньÑкый)
- * @author Engelseziekte
- * @author Gazeb
- */
-$messages['rue'] = array(
- 'vector' => 'Ð—Ð´Ð¾ÐºÐ¾Ð½Ð°Ð»Ñ—Ð½Ñ Ñ…Ð¾ÑновательÑкого інтерфейÑу про Вектор',
- 'vector-desc' => 'Здоконалює елементы хоÑновательÑкого інтерфейÑу Вектор.', # Fuzzy
- 'vector-collapsiblenav-preference' => 'Поволити згортати положкы навіґачного меню во взглÑдї «Векторне»',
- 'vector-collapsiblenav-more' => 'Іншы Ñзыкы',
- 'vector-editwarning-warning' => 'Зохаблїнём той Ñтрінкы ÑÑ Ð¼Ð¾Ð¶ÑƒÑ‚ÑŒ вшыткы учінены зміны Ñтратити.
-Кідь Ñьте приголошеный, можете тото Ð²Ð°Ñ€Ð¾Ð²Ð°Ð½Ñ Ð²Ñ‹Ð¿Ð½ÑƒÑ‚Ð¸ на картї „ЕдітованÑ“ в хоÑновательÑкім інтерфейÑÑ—.',
- 'vector-editwarning-preference' => 'Упозорнити нÑ, кідь буду опущати Ñторінку без ÑƒÐ»Ð¾Ð¶Ñ–Ð½Ñ Ð·Ð¼Ñ–Ð½',
- 'vector-simplesearch-search' => 'ГлÑдати',
- 'vector-simplesearch-containing' => 'обÑÑгуючій...',
- 'vector-noexperiments-preference' => 'Ðе брати учаÑÑ‚ÑŒ на екÑперіментах з новыма функціÑми',
-);
-
-/** Sanskrit (संसà¥à¤•à¥ƒà¤¤à¤®à¥)
- * @author Ansumang
- * @author Shubha
- */
-$messages['sa'] = array(
- 'vector' => 'वाहकाय यॠठपà¥à¤°à¤—तिः',
- 'vector-desc' => 'आकृतिचरà¥à¤®à¤£à¤ƒ योजकमधà¥à¤¯à¤¸à¥à¤¥à¤¾à¤‚शेषॠपà¥à¤°à¤—तिः', # Fuzzy
- 'vector-collapsiblenav-preference' => 'आकृतिचरà¥à¤®à¤£à¤¿ पारà¥à¤¶à¥à¤µà¤¦à¤£à¥à¤¡à¥‡ वसà¥à¤¤à¥à¤ªà¤¤à¤¨à¤¸à¥à¤¯ सकà¥à¤°à¤¿à¤¯à¤¤à¤¾',
- 'vector-collapsiblenav-more' => 'अनà¥à¤¯à¤¾à¤ƒ भाषाः',
- 'vector-editwarning-warning' => 'असà¥à¤®à¤¾à¤¤à¥ पृषà¥à¤ à¤¾à¤¤à¥ गमनेन अतà¥à¤° भवता कृतानि परिवरà¥à¤¤à¤¨à¤¾à¤¨à¤¿ निषà¥à¤«à¤²à¤¾à¤¨à¤¿ भवेयà¥à¤ƒ ।
-भवता यदि पà¥à¤°à¤µà¤¿à¤·à¥à¤Ÿà¤‚ तरà¥à¤¹à¤¿ मम इषà¥à¤Ÿà¤¤à¤®à¤¾à¤¨à¤¿ इतà¥à¤¯à¤¤à¥à¤° असà¥à¤®à¤¿à¤¨à¥ विभागे समà¥à¤ªà¤¾à¤¦à¤¨à¥‡à¤¨ à¤à¤·à¤ƒ पà¥à¤°à¤¬à¥‹à¤§à¤ƒ यथा न आगचà¥à¤›à¥‡à¤¤à¥ तथा करà¥à¤¤à¥à¤‚ शकà¥à¤¯à¤¤à¥‡ ।',
- 'vector-editwarning-preference' => 'समà¥à¤ªà¤¾à¤¦à¤¨à¤¾à¤¨à¤¨à¥à¤¤à¤°à¤‚ रकà¥à¤·à¤£à¥‡à¤¨ विना पृषà¥à¤ à¤¤à¥à¤¯à¤¾à¤—ावसरे सà¥à¤®à¤¾à¤°à¥à¤¯à¤¤à¤¾à¤®à¥',
- 'vector-simplesearch-search' => 'अनà¥à¤µà¥‡à¤·à¤£à¤®à¥',
- 'vector-simplesearch-containing' => 'विदà¥à¤¯à¤¨à¥à¤¤à¥‡......',
- 'vector-noexperiments-preference' => 'पà¥à¤°à¤¯à¥‹à¤—वà¥à¤¯à¤µà¤¸à¥à¤¥à¤¾à¤¤à¤ƒ मां बहिषà¥à¤•à¤°à¥‹à¤¤à¥',
- 'vector-footercleanup-transclusion' => 'असà¥à¤®à¤¿à¤¨à¥ पृषà¥à¤ à¥‡ {{PLURAL:$1|one other page|$1 other pages}}इतà¥à¤¯à¥‡à¤¤à¤¸à¥à¤¯ {{PLURAL:$1|transclusion|transclusions}}विदà¥à¤¯à¤¤à¥‡ ।',
-);
-
-/** Sakha (Ñаха тыла)
- * @author HalanTul
- */
-$messages['sah'] = array(
- 'vector' => '"Вектор" диÑн тиÑмÑни тупÑарар',
- 'vector-desc' => 'Вектор диÑн тиÑÐ¼Ñ Ñ‚ÑƒÑ‚Ñ‚Ð°Ñ€ интерфейÑын тупÑарыы', # Fuzzy
- 'vector-collapsiblenav-preference' => 'Вектор тиÑÐ¼Ñ Ñ…Ð°Ò¥Ð°Ñ Ð¼ÐµÐ½ÑŽÑ‚ÑƒÐ³Ð°Ñ€ блоктары куччатары (Ñворачивание) көҥүллүүргÑ',
- 'vector-collapsiblenav-more' => 'Ó¨ÑÑÓ© тыллар',
- 'vector-editwarning-warning' => 'Ðтын ÑирÑÐ¹Ð³Ñ ÐºÓ©ÑÑ‚Ó©Ñ…Ñ…Ò¯Ð½Ñ Ð±Ð¸Ð»Ð¸Ð³Ð¸Ð½ оҥорбут уларытыыларыҥ барыта ÑүтÑн хаалыахтара.
-БÑлиÑÑ‚Ñммит буоллаҕына, бу ÑÑÑ€Ñтиини туруорууларыҥ «Уларытыы» ÑирÑйигÑÑ€ араарыаххын Ñөп.',
- 'vector-editwarning-preference' => 'ЭрÑдÑÑкÑийÑлиир ÑирÑйтÑн уларытыыларбын бигÑргÑппÑÐºÐºÑ Ñ‚Ð°Ñ…Ñаары гыннахпына ÑÑÑ€ÑÑ‚ÑÑÑ€',
- 'vector-simplesearch-search' => 'Көрдөөһүн',
- 'vector-simplesearch-containing' => 'тыл баар Ñ‹Ñтатыйалара...',
- 'vector-noexperiments-preference' => 'ЭÑпÑримиÑн быһыытынан бÑриллÑÑ€ кыахтары туһаммат гын',
-);
-
-/** Sardinian (sardu)
- * @author Andria
- */
-$messages['sc'] = array(
- 'vector-simplesearch-search' => 'Chirca',
-);
-
-/** Sicilian (sicilianu)
- */
-$messages['scn'] = array(
- 'vector-simplesearch-search' => 'Ricerca',
-);
-
-/** Northern Sami (sámegiella)
- * @author Jeblad
- */
-$messages['se'] = array(
- 'vector-simplesearch-search' => 'Oza',
-);
-
-/** Sinhala (සිංහල)
- * @author Budhajeewa
- * @author Calcey
- * @author තඹරු විජේසේකර
- * @author පසිඳු කà·à·€à·’න්ද
- * @author බිඟුවà·
- */
-$messages['si'] = array(
- 'vector' => 'දෛà·à·’ක සඳහ෠UI දියුණු කිරීම්',
- 'vector-desc' => 'දෛà·à·’ක පෘෂ්ඨයේ පරිà·à·“ලක අතුරු මුහුණත් මූලිකà·à¶‚ග මත දියුණු කරයි', # Fuzzy
- 'vector-collapsiblenav-preference' => 'Vector ඡවියේ ගමන්කෙරුම් මෙනුවේ අංග à·„à·à¶šà·’ළුම සක්â€à¶»à·“ය කරයි',
- 'vector-collapsiblenav-more' => 'තවත් භà·à·‚à·à·€à¶±à·Š',
- 'vector-editwarning-warning' => 'අවධà·à¶±à¶ºà¶§: මෙම පිටුවෙන් නික්ම යà·à¶¸ ඔබ සිදු කළ වෙනස්කම් නà·à¶­à·’වී යෑමට හේතු විය à·„à·à¶š.
-ඔබ ප්â€à¶»à·€à·’ෂ්ටවී ඇත්නම්, ඔබගේ වරණයන්වල "සංසකරණය කිරීම්" කොටසේ ඇති මෙම අනතුරු ඇඟවීම අක්â€à¶»à·“ය කළ à·„à·à¶š.',
- 'vector-editwarning-preference' => 'ම෠සංස්කරණ පිටුවක් සුරකිනු නොලà·à¶¶à·– වෙනස්කිරීම් සමඟ අතහà·à¶» යන විට අවවà·à¶¯ කරන්න',
- 'vector-simplesearch-search' => 'ගවේà·à¶«à¶º කරන්න',
- 'vector-simplesearch-containing' => 'ඇතුළත් වෙමින් පවතී...',
- 'vector-noexperiments-preference' => 'ඉදිරි අත්හද෠බà·à¶½à·“ම් වලින් මà·à·€ බà·à·„à·à¶» කරන්න',
- 'vector-footercleanup-templates' => 'මෙම පිටුව මත ඇති à·ƒà·à¶šà·’ලි නරඹන්න',
- 'vector-footercleanup-categories' => 'මෙම පිටුව මත ඇති සඟවන ලද ප්â€à¶»à·€à¶»à·Šà¶œà¶ºà¶±à·Š නරඹන්න',
-);
-
-/** Slovak (slovenÄina)
- * @author Helix84
- * @author Teslaton
- */
-$messages['sk'] = array(
- 'vector' => 'Vylepšenia použ. rozhrania Vector',
- 'vector-desc' => 'Vylepšuje prvky používateľského rozhrania témy vzhľady Vector', # Fuzzy
- 'vector-collapsiblenav-preference' => 'PovoliÅ¥ zbaľovanie položiek v navigaÄnom menu v téme vzhľadu Vector',
- 'vector-collapsiblenav-more' => 'Ďalšie jazyky',
- 'vector-editwarning-warning' => 'Ak opustíte túto stránku, môžete tým stratiť všetky vykonané zmeny.
-Ak ste prihlásený, toto upozornenie môžete vypnúť v sekcii „Úpravy“ svojich nastavení.',
- 'vector-editwarning-preference' => 'UpozorniÅ¥ ma, keÄ opúšťam upravovaciu stránku s neuloženými zmenami',
- 'vector-simplesearch-search' => 'Hľadať',
- 'vector-simplesearch-containing' => 'obsahuje...',
- 'vector-noexperiments-preference' => 'VylúÄiÅ¥ ma z budúcich experimentov',
- 'vector-footercleanup-transclusion' => 'Táto stránka obsahuje {{PLURAL:$1|transklúziu|transklúzie}} $1 {{PLURAL:$1|inej stránky|iných stránok}}.',
-);
-
-/** Slovenian (slovenÅ¡Äina)
- * @author Dbc334
- */
-$messages['sl'] = array(
- 'vector' => 'Izboljšave uporabniškega vmesnika za Vector',
- 'vector-desc' => 'Izboljša uporabniški vmesnik pri uporabi kože Vector.',
- 'vector-collapsiblenav-preference' => 'OmogoÄi zlaganje vnosov v navigacijskem meniju v koži Vector',
- 'vector-collapsiblenav-more' => 'VeÄ jezikov',
- 'vector-editwarning-warning' => 'ÄŒe zapustite stran, boste morda izgubili vse spremembe, ki ste jih naredili.
-ÄŒe ste prijavljeni, lahko to opozorilo onemogoÄite v razdelku »Urejanje« v svojih nastavitvah.',
- 'vector-editwarning-preference' => 'Opozori me, ko skušam zapreti urejevalno polje z neshranjenimi spremembami',
- 'vector-simplesearch-search' => 'Iskanje',
- 'vector-simplesearch-containing' => 'vsebujoÄ ...',
- 'vector-noexperiments-preference' => 'IzkljuÄi me iz prihodnjih preizkusov',
- 'vector-footercleanup-transclusion' => 'Stran vsebuje {{PLURAL:$1|vkljuÄitev|vkljuÄitvi|vkljuÄitve}} $1 {{PLURAL:$1|druge strani|drugih strani}}.',
- 'vector-footercleanup-templates' => 'Ogled predlog na strani',
- 'vector-footercleanup-categories' => 'Ogled skritih kategorij na strani',
-);
-
-/** Somali (Soomaaliga)
- * @author Maax
- */
-$messages['so'] = array(
- 'vector-simplesearch-search' => 'Raadi',
-);
-
-/** Albanian (shqip)
- * @author Mikullovci11
- * @author Olsi
- */
-$messages['sq'] = array(
- 'vector' => 'Përmirësime UI për Vector',
- 'vector-desc' => 'Përmirësime në elementet e ndërfaqes së përdoruesit të pamjes Vector.', # Fuzzy
- 'vector-collapsiblenav-preference' => 'Aktivizoni mbylljen e artikujve në menunë e navigimit në pamjen Vector',
- 'vector-collapsiblenav-more' => 'Gjuhët tjera',
- 'vector-editwarning-warning' => 'Lënia e kësaj faqeje mund t\'ju shkaktojë humbjen e çdo ndryshimi që keni bërë.
-Nëse keni hyrë brenda, ju mund ta hiqni këtë paralajmërim në seksionin "Redaktimi" tek preferencat tuaja.',
- 'vector-editwarning-preference' => 'Më paralajmëro kur unë lë një redaktim faqeje me ndryshime të paruajtura',
- 'vector-simplesearch-search' => 'Kërko',
- 'vector-simplesearch-containing' => 'përmban ...',
-);
-
-/** Serbian (Cyrillic script) (ÑрпÑки (ћирилица)‎)
- * @author Helios13
- * @author Rancher
- * @author Жељко Тодоровић
- */
-$messages['sr-ec'] = array(
- 'vector' => 'Побољшања кориÑничког интерфејÑа за вектор',
- 'vector-desc' => 'Побољшава кориÑничке елементе Ñучеља за преÑвлаку Вектор.', # Fuzzy
- 'vector-collapsiblenav-preference' => 'РаÑклапање Ñтавки у бочној траци у теми „ВекторÑко“',
- 'vector-collapsiblenav-more' => 'Више језика:',
- 'vector-editwarning-warning' => 'Ðко напуÑтите ову Ñтраницу, изгубићете Ñве измене које Ñте направили.
-Ðко Ñте пријављени, можете онемогућити ово упозорење у Ñвојим подешавањима, у одељку „Уређивање“.',
- 'vector-editwarning-preference' => 'Упозори ме када напуÑтим Ñтраницу која није Ñачувана',
- 'vector-simplesearch-search' => 'Претрага',
- 'vector-simplesearch-containing' => 'Ñадржи...',
- 'vector-noexperiments-preference' => 'Изузми ме из пробних могућноÑти',
- 'vector-footercleanup-transclusion' => 'Ова Ñтраница Ñадржи {{PLURAL:$1|укључивање|укључивања}} на још $1 {{PLURAL:$1|другу Ñтраницу|друге Ñтранице|других Ñтраница}}.',
-);
-
-/** Serbian (Latin script) (srpski (latinica)‎)
- * @author Liangent
- */
-$messages['sr-el'] = array(
- 'vector' => 'PoboljÅ¡anja korisniÄkog interfejsa za vektor',
- 'vector-desc' => 'PoboljÅ¡ava korisniÄke elemente suÄelja za presvlaku Vektor.', # Fuzzy
- 'vector-collapsiblenav-preference' => 'Skupljanje stavki navigacionog menija u Vector presvlaci',
- 'vector-collapsiblenav-more' => 'Još jezika:',
- 'vector-editwarning-warning' => 'Ako napustite ovu stranicu, izgubićete sve izmene koje ste napravili.
-Ako ste prijavljeni, možete onemogućiti ovo upozorenje u svojim podešavanjima, u odeljku „Uređivanje“.',
- 'vector-editwarning-preference' => 'Upozori me kada napustim stranicu sa nesaÄuvanim promenama',
- 'vector-simplesearch-search' => 'Pretraga',
- 'vector-simplesearch-containing' => 'sadrži...',
- 'vector-noexperiments-preference' => 'Izuzmi me iz probnih mogućnosti',
- 'vector-footercleanup-transclusion' => 'Ova stranica sadrži {{PLURAL:$1|ukljuÄivanje|ukljuÄivanja}} na joÅ¡ $1 {{PLURAL:$1|drugu stranicu|druge stranice|drugih stranica}}.', # Fuzzy
-);
-
-/** Seeltersk (Seeltersk)
- * @author Pyt
- */
-$messages['stq'] = array(
- 'vector-simplesearch-search' => 'Säik',
- 'vector-simplesearch-containing' => 'Fultextsäike ätter ...',
-);
-
-/** Sundanese (Basa Sunda)
- * @author Kandar
- */
-$messages['su'] = array(
- 'vector-collapsiblenav-more' => 'Basa lianna',
- 'vector-editwarning-preference' => 'Béjaan kuring lamun ninggalkeun kaca édit anu parobahanana can disimpen',
- 'vector-simplesearch-search' => 'Sungsi',
- 'vector-simplesearch-containing' => 'ngandung...',
-);
-
-/** Swedish (svenska)
- * @author Ainali
- * @author Boivie
- * @author MagnusA
- * @author Martinwiss
- */
-$messages['sv'] = array(
- 'vector' => 'Användargränssnittsförbättringar för Vector',
- 'vector-desc' => 'Förbättrar användargränssnittet när man använder Vector-utseendet',
- 'vector-collapsiblenav-preference' => 'Aktivera hopfällning av poster i navigeringsmenyn i Vector-utseendet',
- 'vector-collapsiblenav-more' => 'Fler språk',
- 'vector-editwarning-warning' => 'Om du lämnar den här sidan kommer du att förlora alla ändringar du har gjort.
-Om du är inloggad kan du slå av den här varningen under "Redigering" i dina inställningar.',
- 'vector-editwarning-preference' => 'Varna mig om jag lämnar en redigeringssida där jag gjort ändringar men inte sparat.',
- 'vector-simplesearch-search' => 'Sök',
- 'vector-simplesearch-containing' => 'innehåller...',
- 'vector-noexperiments-preference' => 'Uteslut mig från funktionsexperiment',
- 'vector-footercleanup-transclusion' => 'Denna sida innehåller {{PLURAL:$1| transklusion|transklusioner}} av {{PLURAL:$1|en annan sida| $1 andra sidor}}.',
- 'vector-footercleanup-templates' => 'Visa mallar på den här sidan',
- 'vector-footercleanup-categories' => 'Visa dolda kategorier på den här sidan',
-);
-
-/** Swahili (Kiswahili)
- * @author Lloffiwr
- * @author Muddyb Blast Producer
- */
-$messages['sw'] = array(
- 'vector' => 'Mabadiliko ya kuendeleza kusano ya Vector',
- 'vector-desc' => 'Inaboresha kusano kwa ajili ya watumiaji wa umbo la Vector.', # Fuzzy
- 'vector-collapsiblenav-preference' => 'Kuwezesha vitu vikunjike katika orodha ya urambazaji, katika umbo la Vector',
- 'vector-collapsiblenav-more' => 'Lugha zingine',
- 'vector-editwarning-warning' => 'Ukitoka kwenye ukurasa huu labda utapoteza madabiliko uliyoyafanya.
-Unaweza kuondoa ilani hii ukienda kwenye sehemu ya "Kuhariri" kwenye mapendekezo yako.',
- 'vector-editwarning-preference' => 'Unionyeshe ilani ninapotaka kutoka kwenye ukurasa ninouhariri, bila kuhifadhi mabadiliko',
- 'vector-simplesearch-search' => 'Kutafuta',
- 'vector-simplesearch-containing' => 'ya maneno...',
-);
-
-/** Tamil (தமிழà¯)
- * @author Sodabottle
- * @author TRYPPN
- * @author மதனாஹரனà¯
- */
-$messages['ta'] = array(
- 'vector-collapsiblenav-more' => 'மேலà¯à®®à¯ அதிகமான மொழிகளà¯',
- 'vector-editwarning-preference' => 'தொகà¯à®¤à¯à®¤à¯à®•à¯ கொணà¯à®Ÿà®¿à®°à¯à®•à¯à®•à¯à®®à¯ பகà¯à®•à®¤à¯à®¤à¯ˆ சேமிகà¯à®•à®¾à®®à®²à¯ வெளியேறினால௠எனகà¯à®•à¯ எசà¯à®šà®°à®¿à®•à¯à®•à¯ˆ செயà¯',
- 'vector-simplesearch-search' => 'தேடà¯',
- 'vector-simplesearch-containing' => 'கொணà¯à®Ÿà¯à®³à¯à®³à®¤à¯...',
- 'vector-noexperiments-preference' => 'வசதிப௠பரிசோதனைகளிலிரà¯à®¨à¯à®¤à¯ எனà¯à®©à¯ˆ விலகà¯à®•à®µà¯à®®à¯',
-);
-
-/** Telugu (తెలà±à°—à±)
- * @author Veeven
- */
-$messages['te'] = array(
- 'vector' => 'వెకà±à°Ÿà°°à± కొరకౠమà±à°–ాంతరపౠమెరà±à°—à±à°²à±',
- 'vector-collapsiblenav-more' => 'మరినà±à°¨à°¿ భాషలà±',
- 'vector-editwarning-warning' => 'à°ˆ పేజీని వదిలివెళà±à°³à°¡à°‚ వలà±à°² మీరౠచేసిన మారà±à°ªà±à°²à°¨à± కోలà±à°ªà±‹à°¯à±‡ అవకాశం ఉంది.
-మీరౠపà±à°°à°µà±‡à°¶à°¿à°‚à°šà°¿à°µà±à°‚టే, à°ˆ హెచà±à°šà°°à°¿à°•à°¨à°¿ మీ à°…à°­à°¿à°°à±à°šà±à°²à°²à±‹ "మరపà±à°²à±" అనే విభాగంలో అచేతనం చేసà±à°•à±‹à°µà°šà±à°šà±.',
- 'vector-editwarning-preference' => 'à°à°¦à±ˆà°¨à°¾ పేజీని నేనౠవదిలివెళà±à°¤à±à°¨à±à°¨à°ªà±à°ªà±à°¡à± దానిలో à°­à°¦à±à°°à°ªà°°à°šà°¨à°¿ మారà±à°ªà±à°²à± ఉంటే ననà±à°¨à± హెచà±à°šà°°à°¿à°‚à°šà±',
- 'vector-simplesearch-search' => 'వెతà±à°•à±',
-);
-
-/** Thai (ไทย)
- * @author Horus
- * @author Octahedron80
- * @author Woraponboonkerd
- */
-$messages['th'] = array(
- 'vector-desc' => 'ข้อปรับปรุงองค์ประà¸à¸­à¸šà¸­à¸´à¸™à¹€à¸•à¸­à¸£à¹Œà¹€à¸Ÿà¸‹à¸œà¸¹à¹‰à¹ƒà¸Šà¹‰à¸‚องสà¸à¸´à¸™à¹€à¸§à¸à¹€à¸•à¸­à¸£à¹Œ', # Fuzzy
- 'vector-collapsiblenav-preference' => 'ใช้งานà¸à¸²à¸£à¸¢à¹ˆà¸­à¸£à¸²à¸¢à¸à¸²à¸£à¸‚องเมนูนำทางในสà¸à¸´à¸™à¹€à¸§à¸à¹€à¸•à¸­à¸£à¹Œ',
- 'vector-collapsiblenav-more' => 'ภาษาอื่นๆ',
- 'vector-editwarning-warning' => 'à¸à¸²à¸£à¸­à¸­à¸à¸ˆà¸²à¸à¸«à¸™à¹‰à¸²à¸™à¸µà¹‰à¸­à¸²à¸ˆà¸—ำให้ความเปลี่ยนà¹à¸›à¸¥à¸‡à¸—ี่คุณà¸à¸£à¸°à¸—ำสูà¸à¸«à¸²à¸¢
-ถ้าคุณล็อà¸à¸­à¸´à¸™à¹à¸¥à¹‰à¸§ คุณสามารถปิดคำเตือนนี้ได้ที่ส่วน "à¸à¸²à¸£à¹à¸à¹‰à¹„ข" ในà¸à¸²à¸£à¸•à¸±à¹‰à¸‡à¸„่าของคุณ',
- 'vector-editwarning-preference' => 'เตือนฉัน เมื่อฉันà¸à¸³à¸¥à¸±à¸‡à¸ˆà¸°à¸­à¸­à¸à¸ˆà¸²à¸à¸«à¸™à¹‰à¸²à¹à¸à¹‰à¹„ขโดยมีข้อมูลที่ยังไม่ได้บันทึà¸',
- 'vector-simplesearch-search' => 'ค้นหา',
- 'vector-simplesearch-containing' => 'ประà¸à¸­à¸šà¹„ปด้วย...',
-);
-
-/** Turkmen (Türkmençe)
- * @author Hanberke
- */
-$messages['tk'] = array(
- 'vector' => 'Vector üçin interfeýs gowulandyrmalary',
- 'vector-collapsiblenav-more' => 'Has köp dil',
- 'vector-simplesearch-search' => 'Gözleg',
- 'vector-simplesearch-containing' => 'öz içine alýar...',
-);
-
-/** Tagalog (Tagalog)
- * @author AnakngAraw
- */
-$messages['tl'] = array(
- 'vector' => 'Mga pagpapainam na UI para sa Vector',
- 'vector-desc' => 'Nagpapainam sa mga sangkap ng dugtungang-mukha na pangtatagamit ng pabalat ng Vector.', # Fuzzy
- 'vector-collapsiblenav-preference' => 'Paganahin ang pagkanatitiklop ng mga bagay na nasa loob ng talaang panglibot sa loob ng pabalat na Vector',
- 'vector-collapsiblenav-more' => 'Iba pang mga wika',
- 'vector-editwarning-warning' => 'Ang paglisan mula sa pahinang ito ay maaaring makasanhi sa iyo ng pagkawala ng anumang mga pagbabagong ginawa mo.
-Kung nakalagda ka, maaari mong huwag paganahin ang babalang ito sa loob ng seksyong "May binabago" ng mga nais mo.',
- 'vector-editwarning-preference' => 'Magbabala sa akin kapag umalis ako sa isang pahina ng pampatnugot na hindi pa nasasagip ang mga pagbabago',
- 'vector-simplesearch-search' => 'Maghanap',
- 'vector-simplesearch-containing' => 'naglalaman ng ...',
- 'vector-noexperiments-preference' => 'Huwag akong isali sa tampok na mga eksperimento',
- 'vector-footercleanup-transclusion' => 'Ang pahinang ito ay naglalaman ng {{PLURAL:$1|transklusyon|mga transklusyon}} ng {{PLURAL:$1|isang ibang pahina|$1 ibang mga pahina}}.',
-);
-
-/** Tok Pisin (Tok Pisin)
- * @author Iketsi
- */
-$messages['tpi'] = array(
- 'vector-simplesearch-search' => 'Painim',
-);
-
-/** Turkish (Türkçe)
- * @author Emperyan
- * @author Hcagri
- * @author Karduelis
- * @author Srhat
- * @author Vito Genovese
- */
-$messages['tr'] = array(
- 'vector' => 'Vector için kullanıcı arabirimi iyileştirmeleri',
- 'vector-desc' => 'Vector görünümünün kullanıcı arayüzü bileşenlerini geliştirir',
- 'vector-collapsiblenav-preference' => 'Vector temasında kenar çubuğundaki ögelerin daraltılmasını etkinleştir',
- 'vector-collapsiblenav-more' => 'DiÄŸer diller',
- 'vector-editwarning-warning' => 'Bu sayfadan ayrılmak yaptığınız herhangi bir değişikliği kaybetmenize sebep olabilir.
-Eğer giriş yaptıysanız, bu uyarıyı, tercihlerinizin "Sayfa yazma alanı" bölümünde devre dışı bırakabilirsiniz.',
- 'vector-editwarning-preference' => 'Kaydedilmemiş değişikliğe sahip bir değişiklik sayfasından çıkarken beni uyar',
- 'vector-simplesearch-search' => 'Ara',
- 'vector-simplesearch-containing' => 'içeren...',
- 'vector-noexperiments-preference' => 'Beni gelecekteki deneylere dahil etme',
- 'vector-footercleanup-templates' => 'Bu sayfada kullanılan şablonları göster',
- 'vector-footercleanup-categories' => 'Bu sayfadaki gizli kategorileri göster',
-);
-
-/** Turoyo (Ṫuroyo)
- * @author Ariyo
- */
-$messages['tru'] = array(
- 'vector-simplesearch-search' => 'Kruxyo',
-);
-
-/** Tatar (Cyrillic script) (татарча)
- * @author Ильнар
- */
-$messages['tt-cyrl'] = array(
- 'vector' => '«Сызымлы» бизәлеше өчен Ñңартулар',
- 'vector-collapsiblenav-preference' => '«Сызымлы» бизәлеше өчен Ñул менюдагы блокларны Ñбарга Ñ€Ó©Ñ…Ñәт итү',
- 'vector-collapsiblenav-more' => 'Башка телләр',
- 'vector-editwarning-warning' => 'Башка биткә күчү вакытында бу мәкаләгә керткән үзгәрешләр югалырга мөмкин.
-Әгәрдә Ñез теркәлгән булÑагыз, бу иÑкәрмәне Ñез «Көйләнмәләрем» өлешендә үзгәртә алаÑыз.',
- 'vector-editwarning-preference' => 'Битне Ñакламыйча китү вакытында мине киÑәтергә',
- 'vector-simplesearch-search' => 'Эзләү',
- 'vector-simplesearch-containing' => 'Ñчтәлек...',
- 'vector-noexperiments-preference' => 'Тикшерүдәге мөмкинлекләрне кулланмаÑка',
-);
-
-/** Central Atlas Tamazight (ⵜⴰⵎⴰⵣⵉⵖⵜ)
- * @author Tifinaghes
- */
-$messages['tzm'] = array(
- 'vector-collapsiblenav-more' => 'ⵓⴳⴰⵔ ⵠⵜⵓⵜâµâ´°âµ¢âµ‰âµ',
- 'vector-simplesearch-search' => 'ⴰⵔⵣⵣⵓ',
-);
-
-/** Uyghur (Arabic script) (ئۇيغۇرچە)
- * @author Sahran
- */
-$messages['ug-arab'] = array(
- 'vector-collapsiblenav-more' => 'تÛخىمۇ ÙƒÛ†Ù¾ تىللار',
- 'vector-simplesearch-search' => 'ئىزدە',
- 'vector-simplesearch-containing' => 'ئىچىدە…',
-);
-
-/** Ukrainian (українÑька)
- * @author AS
- * @author Base
- * @author Microcell
- * @author Olvin
- * @author Prima klasy4na
- */
-$messages['uk'] = array(
- 'vector' => 'УдоÑÐºÐ¾Ð½Ð°Ð»ÐµÐ½Ð½Ñ Ñ–Ð½Ñ‚ÐµÑ€Ñ„ÐµÐ¹Ñу кориÑтувача за допомогою «векторного» оформленнÑ',
- 'vector-desc' => 'Покращує Ñ–Ð½Ñ‚ÐµÑ€Ñ„ÐµÐ¹Ñ ÐºÐ¾Ñ€Ð¸Ñтувача Ð´Ð»Ñ Ð¾Ñ„Ð¾Ñ€Ð¼Ð»ÐµÐ½Ð½Ñ Â«Ð’ÐµÐºÑ‚Ð¾Ñ€Â»',
- 'vector-collapsiblenav-preference' => 'Дозволити Ð·Ð³Ð¾Ñ€Ñ‚Ð°Ð½Ð½Ñ Ð±Ñ–Ñ‡Ð½Ð¾Ð³Ð¾ меню в оформленні «Векторне»',
- 'vector-collapsiblenav-more' => 'Інші мови',
- 'vector-editwarning-warning' => 'Перехід на іншу Ñторінку призведе до втрати ваших змін.
-Якщо ви ввійшли до ÑиÑтеми, то ви можете відключити це Ð¿Ð¾Ð¿ÐµÑ€ÐµÐ´Ð¶ÐµÐ½Ð½Ñ Ð² розділі «РедагуваннÑ» ваших налаштувань.',
- 'vector-editwarning-preference' => 'Попереджати мене, Ñкщо Ñ Ð·Ð°Ð»Ð¸ÑˆÐ°ÑŽ Ñторінку Ñ€ÐµÐ´Ð°Ð³ÑƒÐ²Ð°Ð½Ð½Ñ Ð· незбереженими змінами',
- 'vector-simplesearch-search' => 'Пошук',
- 'vector-simplesearch-containing' => 'що міÑÑ‚ÑÑ‚ÑŒ...',
- 'vector-noexperiments-preference' => 'ВідмовитиÑÑŒ від Ð²Ð¸Ð¿Ñ€Ð¾Ð±ÑƒÐ²Ð°Ð½Ð½Ñ Ñ‚ÐµÑ…Ð½Ñ–Ñ‡Ð½Ð¸Ñ… екÑпериментів',
- 'vector-footercleanup-transclusion' => 'Ð¦Ñ Ñторінка міÑтить {{PLURAL:$1|включеннÑ|включеннÑ|включень}} інших Ñторінок',
- 'vector-footercleanup-templates' => 'Показати шаблони, що викориÑтовує Ñ†Ñ Ñторінка',
- 'vector-footercleanup-categories' => 'Показати приховані категорії на цій Ñторінці',
-);
-
-/** Urdu (اردو)
- * @author පසිඳු කà·à·€à·’න්ද
- */
-$messages['ur'] = array(
- 'vector-desc' => 'صار٠انٹرÙیس Ú©Û’ عناصر ویکٹر جلد Ú©Û’ پر بÛتر ÛÛ’.', # Fuzzy
- 'vector-collapsiblenav-preference' => 'Ùعال Ø­ØµÛ ÙˆÛŒÚ©Ù¹Ø± جلد میں سائڈبار میں آئیٹمز Ú©ÛŒ',
- 'vector-collapsiblenav-more' => 'مزید زبانوں میں',
- 'vector-editwarning-preference' => 'خبردار مجھے جب میں غیر محÙوظ Ú©Ø±Ø¯Û ØªØ¨Ø¯ÛŒÙ„ÛŒÙˆÚº Ú©Û’ ساتھ ایک ترمیم Ú©Û’ صÙØ­Û’ Ú©Ùˆ Ú†Ú¾ÙˆÚ‘ دو',
- 'vector-simplesearch-search' => 'تلاش',
-);
-
-/** Uzbek (oʻzbekcha)
- * @author CoderSI
- * @author Sociologist
- */
-$messages['uz'] = array(
- 'vector-collapsiblenav-preference' => '«Vektor» tashqi koʻrinishida chap menyudagi boʻlimlarni yashirishga ruxsat berish',
- 'vector-simplesearch-search' => 'Qidiruv',
- 'vector-noexperiments-preference' => 'Tajribaviy imkoniyatlarni tavsiya qilmaslik',
-);
-
-/** vèneto (vèneto)
- * @author Candalua
- * @author GatoSelvadego
- * @author Vajotwo
- */
-$messages['vec'] = array(
- 'vector' => 'Mejoramenti de interfacia utente (UI) par el Vector.',
- 'vector-desc' => "Potensia l'interfacia utente có se dopara el tema Vector",
- 'vector-collapsiblenav-preference' => 'Abiłita menù de navigaxion nascondibiłe par ła skin Vector',
- 'vector-collapsiblenav-more' => 'Pì łengue',
- 'vector-editwarning-warning' => 'Se te vè via da sta pagina te podaressi pèrdar tute le modìfeghe che te ghè fato.
-Se te sì loggà, te poli disabilitar sto aviso in te la sezion "Dimension de la casela de modifica" de le to preferense.',
- 'vector-editwarning-preference' => 'Dime se sto lassando na pagina de modifica sensa aver salvà',
- 'vector-simplesearch-search' => 'Serca',
- 'vector-simplesearch-containing' => 'che contien...',
- 'vector-noexperiments-preference' => 'Escludame da łe funsionałità sperimentałi',
- 'vector-footercleanup-transclusion' => "Sta pàjina ła contien {{PLURAL:$1|n'incluxion|de łe incluxion}} de {{PLURAL:$1|n'altra pàjina|$1 altre pàjine}}.",
- 'vector-footercleanup-templates' => 'Mostra i modełi de sta pàjina',
- 'vector-footercleanup-categories' => 'Mostra łe categorie sconte de sta pàjina',
-);
-
-/** Veps (vepsän kel’)
- */
-$messages['vep'] = array(
- 'vector-simplesearch-search' => 'Ectä',
- 'vector-simplesearch-containing' => 'mülütajad...',
-);
-
-/** Vietnamese (Tiếng Việt)
- * @author Minh Nguyen
- * @author Vinhtantran
- */
-$messages['vi'] = array(
- 'vector' => 'Giao diện tích hợp với Vectơ',
- 'vector-desc' => 'Hoàn thiện giao diện khi sử dụng hình dạng Vectơ',
- 'vector-collapsiblenav-preference' => 'Bật trình đơn chuyển hướng gấp lại được ở bên phải trong bỠngoài Vectơ',
- 'vector-collapsiblenav-more' => 'Thêm ngôn ngữ khác',
- 'vector-editwarning-warning' => 'Rá»i khá»i trang này sẽ khiến bạn mất các sá»­a đổi đã thá»±c hiện.
-Nếu đã đăng nhập, bạn có thể tắt cảnh báo này tại mục “Sá»­a đổi†trong tùy chá»n cá nhân.',
- 'vector-editwarning-preference' => 'Cảnh báo khi tôi thoát trang sửa đổi mà chưa lưu trang',
- 'vector-simplesearch-search' => 'Tìm kiếm',
- 'vector-simplesearch-containing' => 'có chứa…',
- 'vector-noexperiments-preference' => 'Loại trừ tôi khá»i các thí nghiệm tính năng',
- 'vector-footercleanup-transclusion' => 'Trang này nhúng nội dung của {{PLURAL:$1|một trang khác|$1 trang khác}}.',
- 'vector-footercleanup-templates' => 'Xem các bản mẫu dùng trong trang này',
- 'vector-footercleanup-categories' => 'Xem các thể loại ẩn gồm trang này',
-);
-
-/** Volapük (Volapük)
- * @author Malafaya
- */
-$messages['vo'] = array(
- 'vector-collapsiblenav-more' => 'Püks pluik',
- 'vector-simplesearch-search' => 'Suk',
- 'vector-simplesearch-containing' => 'ninädöl...',
-);
-
-/** Walloon (walon)
- * @author Srtxg
- */
-$messages['wa'] = array(
- 'vector' => "Amidraedjes di l' eterface pol pea «Vector»",
- 'vector-desc' => "Amidraedjes pol pea d' eterface d' uzeu «Vector»", # Fuzzy
- 'vector-collapsiblenav-preference' => "Permete d' erôler les cayets del båre di costé avou l' pea «Vector»",
- 'vector-collapsiblenav-more' => 'Pus di lingaedjes',
- 'vector-editwarning-warning' => "Cwiter cisse pådje ci vos frè piede tos les candjmints ki vos avoz fwait.
-Si vos estoz elodjî, vos ploz dismete cist adviertixhmint ci dins l' linwete «Boesse di tecse» di vos preferinces.",
- 'vector-editwarning-preference' => "M' advierti cwand dji cwite ene pådje k' a des candjmints nén schapés",
- 'vector-simplesearch-search' => 'Cweri',
- 'vector-simplesearch-containing' => 'ki contént...',
- 'vector-noexperiments-preference' => 'Mi rsaetchî des esperyinces di fonccionalité',
- 'vector-footercleanup-transclusion' => "Cisse pådje ci a {{PLURAL:$1|on ravalé elemint|des ravalés elemints}} vnant d' {{PLURAL:$1|ene ôte pådje|$1 ôtès pådjes}}.",
-);
-
-/** Mingrelian (მáƒáƒ áƒ’áƒáƒšáƒ£áƒ áƒ˜)
- */
-$messages['xmf'] = array(
- 'vector-simplesearch-search' => 'გáƒáƒ áƒ£áƒ',
-);
-
-/** Yiddish (ייִדיש)
- * @author פוילישער
- */
-$messages['yi'] = array(
- 'vector' => 'ב×ַניצער־×ויבערפֿל×ַך פֿ×ַרבעסערונגען פֿ×ַר וועקט×ר',
- 'vector-desc' => 'פֿ×ַרבעסערט ×“×¢× ×‘×ניצער ×ויבערפֿל×ַך ווען מען ניצט די וועקט×ר ווײַזונג.',
- 'vector-collapsiblenav-preference' => '×ַקטיווירן צונויפֿלייגן ×יינהייטן ××™× ×¢× × ×ַוויג×ַציע מעניו ×ין ×“×¢× ×•×•×¢×§×˜×ר געשטעל',
- 'vector-collapsiblenav-more' => '× ×ך שפר×ַכן',
- 'vector-editwarning-warning' => '×יבערל×זן ×“×¢× ×‘×œ×ט קען ×’×•×¨× ×–×²Ö·×Ÿ פֿ×רלירן ×ײַערע ענדערונגען.
-×ויב ×יר זענט ×רײַנל×גירט, קענט ×יר מבטל זײַן די ד××–×™×’×¢ וו×רענונג ×ין דער "ב××רבעטן" ×פטיילונג פון ×ײַערע פרעפערענצן.',
- 'vector-editwarning-preference' => 'שטעלן × ×•×•×רענונג ווען ×יך ל××– ×יבער × ×¨×¢×“×קטירונג בל×ט מיט נישט ×ויפגעהיטענע ענדערונגען',
- 'vector-simplesearch-search' => 'זוכן',
- 'vector-simplesearch-containing' => 'כולל…',
- 'vector-footercleanup-templates' => 'ווײַזן מוסטער ×ויף ×“×¢× ×‘×œ×ט',
- 'vector-footercleanup-categories' => 'ווײַזן ב××”×לטענע ק×טעג×ריעס ×ויף ×“×¢× ×‘×œ×ט',
-);
-
-/** Yoruba (Yorùbá)
- * @author Demmy
- */
-$messages['yo'] = array(
- 'vector' => 'Àwá»n ìmúdára UI fún Vector',
- 'vector-collapsiblenav-more' => 'Àwá»n èdè lẹÌkùúnrẹÌrẹÌ',
- 'vector-editwarning-warning' => 'Kíkúrò ní ojúewé yìí yíò jáº¹Ì kí ẹ pòfo àwá»n àtúná¹£e tí ẹ ti á¹£e.
-Tó bá jáº¹Ì pé ẹ ti wá»lé, ẹ lè dẹÌkun ìkìlá»Ì€ yìí nínù abala "Àtúná¹£e ṣíṣe" ti àwá»n ìfẹÌràn yín.',
- 'vector-editwarning-preference' => 'Kìlá»Ì€ fún mi tí mo bá únkúrò ní ojúewé àtúná¹£e láì tíì mupamá»Ì',
- 'vector-simplesearch-search' => 'Ṣàwárí',
- 'vector-simplesearch-containing' => 'tó ní...',
-);
-
-/** Cantonese (粵語)
- * @author Horacewai2
- * @author Waihorace
- */
-$messages['yue'] = array(
- 'vector' => 'å°æ–¼Vector嘅界é¢æ”¹é€²',
- 'vector-desc' => '改進Vectorç•«é¢å˜…ç•Œé¢å…ƒç´ ã€‚', # Fuzzy
- 'vector-collapsiblenav-preference' => '用å¯æŠ˜ç–Šå°Žèˆªåˆ—',
- 'vector-collapsiblenav-more' => '更多語言',
- 'vector-editwarning-warning' => '離開呢一版會令到你嘅修改唔見咗。
-ä½ å¯ä»¥éŸ¿ä½ å˜…喜好設定嘅"編輯中"å°ç¯€åº¦åœç”¨å‘¢å€‹è­¦å‘Šã€‚',
- 'vector-editwarning-preference' => '當我離開未ä¿å­˜å¥½å˜…修改嗰陣警告我',
- 'vector-simplesearch-search' => 'æµå˜¢',
- 'vector-simplesearch-containing' => 'å單傳é€ç·Š...',
-);
-
-/** Simplified Chinese (中文(简体)‎)
- * @author Bencmq
- * @author Dimension
- * @author Liangent
- * @author Onecountry
- * @author Xiaomingyan
- * @author Yfdyh000
- * @author 阿pp
- */
-$messages['zh-hans'] = array(
- 'vector' => 'Vector用户界é¢æ”¹è¿›',
- 'vector-desc' => '改进Vector皮肤中的用户界é¢å…ƒç´ ',
- 'vector-collapsiblenav-preference' => '在Vector皮肤的导航èœå•ä¸­æŠ˜å é¡¹ç›®',
- 'vector-collapsiblenav-more' => '更多语言',
- 'vector-simplesearch-search' => 'æœç´¢',
- 'vector-simplesearch-containing' => 'å«æœ‰...',
- 'vector-noexperiments-preference' => '功能实验中排除我',
- 'vector-footercleanup-transclusion' => '此页{{PLURAL:$1|嵌入包å«}}有{{PLURAL:$1|一个其他页é¢|$1个其他页é¢}}。',
- 'vector-footercleanup-templates' => '查看该页é¢ä½¿ç”¨çš„模æ¿',
- 'vector-footercleanup-categories' => '查看该页é¢çš„éšè—分类',
-);
-
-/** Traditional Chinese (中文(ç¹é«”)‎)
- * @author Bencmq
- * @author Gaoxuewei
- * @author Liangent
- * @author Mark85296341
- * @author Simon Shek
- * @author Waihorace
- * @author Wrightbus
- */
-$messages['zh-hant'] = array(
- 'vector' => 'Vector 使用者介é¢æ”¹é€²',
- 'vector-desc' => '改善 Vector 外觀的使用者介é¢å…ƒç´ ã€‚',
- 'vector-collapsiblenav-preference' => '在 Vector 外觀的導覽é¸å–®ä¸­æ‘ºç–Šé …ç›®',
- 'vector-collapsiblenav-more' => '更多語言',
- 'vector-editwarning-warning' => '離開這個é é¢å¯èƒ½æœƒä»¤æ‚¨å¤±åŽ»ä¹‹å‰çš„所有更改。若您已經登入,您å¯åœ¨æ‚¨å好設定的「編輯ã€ç¯€ä¸­é—œé–‰æ­¤è­¦å‘Šã€‚',
- 'vector-editwarning-preference' => '當我在更改未儲存時離開é é¢æ™‚警告我',
- 'vector-simplesearch-search' => 'æœå°‹',
- 'vector-simplesearch-containing' => '包å«...',
- 'vector-noexperiments-preference' => '我ä¸åƒèˆ‡åŠŸèƒ½å¯¦éšª',
- 'vector-footercleanup-transclusion' => 'æ­¤é {{PLURAL:$1|嵌入包å«}}有{{PLURAL:$1|一|$1}}個其他é é¢ã€‚',
- 'vector-footercleanup-templates' => '查看該é èª¿ç”¨çš„模æ¿',
- 'vector-footercleanup-categories' => '查看該é æ‰€å±¬çš„éš±è—類別',
-);
diff --git a/extensions/Vector/Vector.php b/extensions/Vector/Vector.php
deleted file mode 100644
index a7e24673..00000000
--- a/extensions/Vector/Vector.php
+++ /dev/null
@@ -1,129 +0,0 @@
-<?php
-/**
- * Vector extension
- *
- * @file
- * @ingroup Extensions
- *
- * @author Trevor Parscal <trevor@wikimedia.org>
- * @author Roan Kattouw <roan.kattouw@gmail.com>
- * @author Nimish Gautam <nimish@wikimedia.org>
- * @author Adam Miller <amiller@wikimedia.org>
- * @license GPL v2 or later
- * @version 0.3.0
- */
-
-/* Configuration */
-
-// Each module may be configured individually to be globally on/off or user preference based
-$wgVectorFeatures = array(
- 'collapsiblenav' => array( 'global' => true, 'user' => true ),
- 'collapsibletabs' => array( 'global' => true, 'user' => false ),
- // The follwing are experimental and likely unstable - use at your own risk
- 'expandablesearch' => array( 'global' => false, 'user' => false ),
- 'footercleanup' => array( 'global' => false, 'user' => false ),
- 'sectioneditlinks' => array( 'global' => false, 'user' => false ),
-);
-
-// The Vector skin has a basic version of simple search, which is a prerequisite for the enhanced one
-$wgDefaultUserOptions['vector-simplesearch'] = 1;
-
-// Enable bucket testing for new version of collapsible nav
-$wgCollapsibleNavBucketTest = false;
-// Force the new version
-$wgCollapsibleNavForceNewVersion = false;
-
-// Enable bucket testing for new version of section edit links
-$wgVectorSectionEditLinksBucketTest = false;
-// Percentage of users who's use of section edit links will be tracked - half of which will see the
-// new section edit links - default 5%
-$wgVectorSectionEditLinksLotteryOdds = 5;
-// Version number of the current experiment - Buckets from previous experiments will be overwritten
-// with new values when this is incremented, so as to allow accurate re-distribution. When changing
-// the lottery odds, this needs to change too, or you will have inaccurate data.
-$wgVectorSectionEditLinksExperiment = 0;
-
-/* Setup */
-
-$wgExtensionCredits['other'][] = array(
- 'path' => __FILE__,
- 'name' => 'Vector',
- 'author' => array( 'Trevor Parscal', 'Roan Kattouw', 'Nimish Gautam', 'Adam Miller' ),
- 'version' => '0.3.0',
- 'url' => 'https://www.mediawiki.org/wiki/Extension:Vector',
- 'descriptionmsg' => 'vector-desc',
-);
-$wgAutoloadClasses['VectorHooks'] = dirname( __FILE__ ) . '/Vector.hooks.php';
-$wgExtensionMessagesFiles['Vector'] = dirname( __FILE__ ) . '/Vector.i18n.php';
-$wgHooks['BeforePageDisplay'][] = 'VectorHooks::beforePageDisplay';
-$wgHooks['GetPreferences'][] = 'VectorHooks::getPreferences';
-$wgHooks['ResourceLoaderGetConfigVars'][] = 'VectorHooks::resourceLoaderGetConfigVars';
-$wgHooks['MakeGlobalVariablesScript'][] = 'VectorHooks::makeGlobalVariablesScript';
-
-$vectorResourceTemplate = array(
- 'localBasePath' => dirname( __FILE__ ) . '/modules',
- 'remoteExtPath' => 'Vector/modules',
- 'group' => 'ext.vector',
-);
-$wgResourceModules += array(
- // TODO this module should be merged with ext.vector.collapsibleTabs
- 'jquery.collapsibleTabs' => $vectorResourceTemplate + array(
- 'scripts' => 'jquery.collapsibleTabs.js',
- 'dependencies' => 'jquery.delayedBind',
- ),
- 'ext.vector.collapsibleNav' => $vectorResourceTemplate + array(
- 'scripts' => 'ext.vector.collapsibleNav.js',
- 'styles' => 'ext.vector.collapsibleNav.css',
- 'messages' => array(
- 'vector-collapsiblenav-more',
- ),
- 'dependencies' => array(
- 'mediawiki.util',
- 'jquery.client',
- 'jquery.cookie',
- 'jquery.tabIndex',
- ),
- ),
- 'ext.vector.collapsibleTabs' => $vectorResourceTemplate + array(
- 'scripts' => 'ext.vector.collapsibleTabs.js',
- 'dependencies' => array(
- 'jquery.collapsibleTabs',
- 'jquery.delayedBind',
- ),
- ),
- 'ext.vector.expandableSearch' => $vectorResourceTemplate + array(
- 'scripts' => 'ext.vector.expandableSearch.js',
- 'styles' => 'ext.vector.expandableSearch.css',
- 'dependencies' => array(
- 'jquery.client',
- 'jquery.expandableField',
- 'jquery.delayedBind',
- ),
- ),
- 'ext.vector.footerCleanup' => $vectorResourceTemplate + array(
- 'scripts' => array(
- 'jquery.footerCollapsibleList.js',
- 'ext.vector.footerCleanup.js',
- ),
- 'styles' => 'ext.vector.footerCleanup.css',
- 'messages' => array (
- 'vector-footercleanup-transclusion',
- 'vector-footercleanup-templates',
- 'vector-footercleanup-categories',
- ),
- 'dependencies' => array(
- // The message require plural support at javascript.
- 'mediawiki.jqueryMsg',
- 'jquery.cookie'
- ),
- 'position' => 'top',
- ),
- 'ext.vector.sectionEditLinks' => $vectorResourceTemplate + array(
- 'scripts' => 'ext.vector.sectionEditLinks.js',
- 'styles' => 'ext.vector.sectionEditLinks.css',
- 'dependencies' => array(
- 'jquery.cookie',
- ),
- ),
-);
-
diff --git a/extensions/Vector/modules/ext.vector.collapsibleNav.css b/extensions/Vector/modules/ext.vector.collapsibleNav.css
deleted file mode 100644
index b9c27355..00000000
--- a/extensions/Vector/modules/ext.vector.collapsibleNav.css
+++ /dev/null
@@ -1,92 +0,0 @@
-/**
- * Stylesheet for collapsible nav
- * NOTE: Please remove all the h5 selectors at some point as they are only for
- * backwards-compatibility due to html caching. --2012-11-28
- */
-
-#mw-panel.collapsible-nav .portal {
- /* @embed */
- background: url(images/portal-break.png) left top no-repeat;
- padding: 0.25em 0 !important;
- margin: -11px 9px 10px 11px;
-}
-
-#mw-panel.collapsible-nav .portal h3,
-#mw-panel.collapsible-nav .portal h5 {
- color: #4D4D4D;
- font-weight: normal;
- /* @embed */
- background: url(images/open.png) left center no-repeat;
- padding: 4px 0 3px 1.5em;
- margin-bottom: 0;
-}
-
-#mw-panel.collapsible-nav .portal h3:hover,
-#mw-panel.collapsible-nav .portal h5:hover {
- cursor: pointer;
- text-decoration: none;
-}
-
-#mw-panel.collapsible-nav .portal h3 a,
-#mw-panel.collapsible-nav .portal h5 a {
- color: #4D4D4D;
- text-decoration: none;
-}
-
-#mw-panel.collapsible-nav .portal .body {
- background: none !important;
- padding-top: 0;
- display: none;
-}
-
-#mw-panel.collapsible-nav .portal .body ul li {
- padding: 0.25em 0;
-}
-
-/* First */
-#mw-panel.collapsible-nav .portal.first h3,
-#mw-panel.collapsible-nav .portal.first h5 {
- display: none;
-}
-
-#mw-panel.collapsible-nav .portal.first {
- background-image: none;
- margin-top: 0;
-}
-
-/* Persistent */
-
-#mw-panel.collapsible-nav .portal.persistent .body {
- display: block;
-}
-
-#mw-panel.collapsible-nav .portal.persistent h3,
-#mw-panel.collapsible-nav .portal.persistent h5 {
- background: none !important;
- padding-left: 0.7em;
- cursor: default;
-}
-
-#mw-panel.collapsible-nav .portal.persistent .body {
- margin-left: 0.5em;
-}
-
-/* Collapsed */
-
-#mw-panel.collapsible-nav .portal.collapsed h3,
-#mw-panel.collapsible-nav .portal.collapsed h5 {
- color: #0645AD;
- /* @embed */
- background: url(images/closed-ltr.png) left center no-repeat;
- margin-bottom: 0;
-}
-
-#mw-panel.collapsible-nav .portal.collapsed h3 a,
-#mw-panel.collapsible-nav .portal.collapsed h5 a {
- color: #0645AD;
-}
-
-#mw-panel.collapsible-nav .portal.collapsed h3:hover,
-#mw-panel.collapsible-nav .portal.collapsed h5:hover {
- text-decoration: underline;
-}
diff --git a/extensions/Vector/modules/ext.vector.collapsibleNav.js b/extensions/Vector/modules/ext.vector.collapsibleNav.js
deleted file mode 100644
index 28a85676..00000000
--- a/extensions/Vector/modules/ext.vector.collapsibleNav.js
+++ /dev/null
@@ -1,253 +0,0 @@
-/**
- * Collapisble navigation for Vector
- */
-( function ( mw, $ ) {
- "use strict";
- var map, version;
-
- // Use the same function for all navigation headings - don't repeat
- function toggle( $element ) {
- $.cookie(
- 'vector-nav-' + $element.parent().attr( 'id' ),
- $element.parent().is( '.collapsed' ),
- { 'expires': 30, 'path': '/' }
- );
- $element
- .parent()
- .toggleClass( 'expanded' )
- .toggleClass( 'collapsed' )
- .find( '.body' )
- .slideToggle( 'fast' );
- }
-
- /* Browser Support */
-
- map = {
- // Left-to-right languages
- ltr: {
- // Collapsible Nav is broken in Opera < 9.6 and Konqueror < 4
- opera: [['>=', 9.6]],
- konqueror: [['>=', 4.0]],
- blackberry: false,
- ipod: false,
- iphone: false,
- ps3: false
- },
- // Right-to-left languages
- rtl: {
- opera: [['>=', 9.6]],
- konqueror: [['>=', 4.0]],
- blackberry: false,
- ipod: false,
- iphone: false,
- ps3: false
- }
- };
- if ( !$.client.test( map ) ) {
- return true;
- }
-
- /* Bucket Testing */
-
- // Fallback to old version
- version = 1;
- // Allow new version override
- if ( mw.config.get( 'wgCollapsibleNavForceNewVersion' ) ) {
- version = 2;
- } else {
- // Make bucket testing optional
- if ( mw.config.get( 'wgCollapsibleNavBucketTest' ) ) {
- // This is be determined randomly, and then stored in a cookie
- version = $.cookie( 'vector-nav-pref-version' );
- // If the cookie didn't exist, or the value is out of range, generate a new one and save it
- if ( version === null ) {
- // 50% of the people will get the new version
- version = Math.round( Math.random() + 1 );
- $.cookie( 'vector-nav-pref-version', version, {
- expires: 30,
- path: '/'
- });
- }
- }
- }
-
- $( function ( $ ) {
- var limit, threshold, languages, acceptLangCookie,
- $primary, $secondary,
- i, $link, count,
- $headings, tabIndex;
-
- /* Special Language Portal Handling */
-
- // Language portal splitting feature (if it's turned on)
- if ( version === 2 ) {
- // How many links to show in the primary languages portal
- limit = 5;
- // How many links there must be in the secondary portal to justify having a secondary portal
- threshold = 3;
- // Make the interwiki language links list a secondary list, and create a new list before it as primary list
- $( '#p-lang ul' ).addClass( 'secondary' ).before( '<ul class="primary"></ul>' );
- // This is a list of languages in order of Wikipedia project size. This is the lowest fallback for choosing
- // which links to show in the primary list. Ideally the browser's accept-language headers should steer this
- // list, and we should fallback on a site configured (MediaWiki:Common.js) list of prefered languages.
- languages = [
- 'en', 'fr', 'de', 'es', 'pt', 'it', 'ru', 'ja', 'nl', 'pl', 'zh', 'sv', 'ar', 'tr', 'uk', 'fi', 'no', 'ca',
- 'ro', 'hu', 'ksh', 'id', 'he', 'cs', 'vi', 'ko', 'sr', 'fa', 'da', 'eo', 'sk', 'th', 'lt', 'vo', 'bg',
- 'sl', 'hr', 'hi', 'et', 'mk', 'simple', 'new', 'ms', 'nn', 'gl', 'el', 'eu', 'ka', 'tl', 'bn', 'lv', 'ml',
- 'bs', 'te', 'la', 'az', 'sh', 'war', 'br', 'is', 'mr', 'be-x-old', 'sq', 'cy', 'lb', 'ta', 'zh-classical',
- 'an', 'jv', 'ht', 'oc', 'bpy', 'ceb', 'ur', 'zh-yue', 'pms', 'scn', 'be', 'roa-rup', 'qu', 'af', 'sw',
- 'nds', 'fy', 'lmo', 'wa', 'ku', 'hy', 'su', 'yi', 'io', 'os', 'ga', 'ast', 'nap', 'vec', 'gu', 'cv',
- 'bat-smg', 'kn', 'uz', 'zh-min-nan', 'si', 'als', 'yo', 'li', 'gan', 'arz', 'sah', 'tt', 'bar', 'gd', 'tg',
- 'kk', 'pam', 'hsb', 'roa-tara', 'nah', 'mn', 'vls', 'gv', 'mi', 'am', 'ia', 'co', 'ne', 'fo', 'nds-nl',
- 'glk', 'mt', 'ang', 'wuu', 'dv', 'km', 'sco', 'bcl', 'mg', 'my', 'diq', 'tk', 'szl', 'ug', 'fiu-vro', 'sc',
- 'rm', 'nrm', 'ps', 'nv', 'hif', 'bo', 'se', 'sa', 'pnb', 'map-bms', 'lad', 'lij', 'crh', 'fur', 'kw', 'to',
- 'pa', 'jbo', 'ba', 'ilo', 'csb', 'wo', 'xal', 'krc', 'ckb', 'pag', 'ln', 'frp', 'mzn', 'ce', 'nov', 'kv',
- 'eml', 'gn', 'ky', 'pdc', 'lo', 'haw', 'mhr', 'dsb', 'stq', 'tpi', 'arc', 'hak', 'ie', 'so', 'bh', 'ext',
- 'mwl', 'sd', 'ig', 'myv', 'ay', 'iu', 'na', 'cu', 'pi', 'kl', 'ty', 'lbe', 'ab', 'got', 'sm', 'as', 'mo',
- 'ee', 'zea', 'av', 'ace', 'kg', 'bm', 'cdo', 'cbk-zam', 'kab', 'om', 'chr', 'pap', 'udm', 'ks', 'zu', 'rmy',
- 'cr', 'ch', 'st', 'ik', 'mdf', 'kaa', 'aa', 'fj', 'srn', 'tet', 'or', 'pnt', 'bug', 'ss', 'ts', 'pcd',
- 'pih', 'za', 'sg', 'lg', 'bxr', 'xh', 'ak', 'ha', 'bi', 've', 'tn', 'ff', 'dz', 'ti', 'ki', 'ny', 'rw',
- 'chy', 'tw', 'sn', 'tum', 'ng', 'rn', 'mh', 'ii', 'cho', 'hz', 'kr', 'ho', 'mus', 'kj'
- ];
- // If the user has an Accept-Language cookie, use it. Otherwise, set it asynchronously but keep the default
- // behavior for this page view.
- acceptLangCookie = $.cookie( 'accept-language' );
- if ( acceptLangCookie !== null ) {
- // Put the user's accepted languages before the list ordered by wiki size
- if ( acceptLangCookie !== '' ) {
- languages = acceptLangCookie.split( ',' ).concat( languages );
- }
- } else {
- $.getJSON(
- mw.util.wikiScript( 'api' ),
- 'format=json&action=query&meta=userinfo&uiprop=acceptlang',
- function ( data ) {
- var langs = [], j, len, lang;
- if ( data.query &&
- data.query.userinfo &&
- data.query.userinfo.acceptlang !== undefined
- ) {
- for ( j = 0, lang = data.query.userinfo.acceptlang, len = lang.length; j < len; j++ ) {
- if ( lang[j].q !== 0 ) {
- langs.push( lang[j]['*'] );
- }
- }
- }
- $.cookie( 'accept-language', langs.join( ',' ), {
- path: '/',
- expires: 30
- });
- }
- );
- }
- // Shortcuts to the two lists
- $primary = $( '#p-lang ul.primary' );
- $secondary = $( '#p-lang ul.secondary' );
- // Adjust the limit based on the threshold
- if ( $secondary.children().length < limit + threshold ) {
- limit += threshold;
- }
- // Move up to 5 of the links into the primary list, based on the priorities set forth in the languages list
- count = 0;
- for ( i = 0; i < languages.length; i++ ) {
- $link = $secondary.find( '.interwiki-' + languages[i] );
- if ( $link.length ) {
- if ( count++ < limit ) {
- $link.appendTo( $primary );
- } else {
- break;
- }
- }
- }
- // If there's still links in the secondary list and we havn't filled the primary list to it's limit yet, move
- // links into the primary list in order of appearance
- if ( count < limit ) {
- $secondary.children().each( function () {
- if ( count++ < limit ) {
- $(this).appendTo( $primary );
- } else {
- return false;
- }
- } );
- }
- // Hide the more portal if it's now empty, otherwise make the list into it's very own portal
- if ( $secondary.children().length === 0 ) {
- $secondary.remove();
- } else {
- $( '#p-lang' ).after( '<div id="p-lang-more" class="portal"><h3></h3><div class="body"></div></div>' );
- $( '#p-lang-more h3' ).text( mw.msg( 'vector-collapsiblenav-more' ) );
- $secondary.appendTo( $( '#p-lang-more .body' ) );
- }
- // Always show the primary interwiki language portal
- $( '#p-lang' ).addClass( 'persistent' );
- }
-
- /* General Portal Modification */
-
- // Always show the first portal
- $( '#mw-panel > .portal:first' ).addClass( 'first persistent' );
- // Apply a class to the entire panel to activate styles
- $( '#mw-panel' ).addClass( 'collapsible-nav' );
- // Use cookie data to restore preferences of what to show and hide
- $( '#mw-panel > .portal:not(.persistent)' )
- .each( function ( i ) {
- var id = $(this).attr( 'id' ),
- state = $.cookie( 'vector-nav-' + id );
- // Add anchor tag to heading for better accessibility
- $( this ).find( 'h3, h5' ).wrapInner( $( '<a href="#"></a>' ).click( false ) );
- // In the case that we are not showing the new version, let's show the languages by default
- if (
- state === 'true' ||
- ( state === null && i < 1 ) ||
- ( state === null && version === 1 && id === 'p-lang' )
- ) {
- $(this)
- .addClass( 'expanded' )
- .removeClass( 'collapsed' )
- .find( '.body' )
- .hide() // bug 34450
- .show();
- } else {
- $(this)
- .addClass( 'collapsed' )
- .removeClass( 'expanded' );
- }
- // Re-save cookie
- if ( state !== null ) {
- $.cookie( 'vector-nav-' + $(this).attr( 'id' ), state, { 'expires': 30, 'path': '/' } );
- }
- } );
-
- /* Tab Indexing */
-
- $headings = $( '#mw-panel > .portal:not(.persistent) > h3, #mw-panel > .portal:not(.persistent) > h5' );
-
- // Get the highest tab index
- tabIndex = $( document ).lastTabIndex() + 1;
-
- // Fix the search not having a tabindex
- $( '#searchInput' ).attr( 'tabindex', tabIndex++ );
-
- // Make it keyboard accessible
- $headings.attr( 'tabindex', function () {
- return tabIndex++;
- });
-
- // Toggle the selected menu's class and expand or collapse the menu
- $( '#mw-panel' )
- .delegate( '.portal:not(.persistent) > h3, .portal:not(.persistent) > h5', 'keydown', function ( e ) {
- // Make the space and enter keys act as a click
- if ( e.which === 13 /* Enter */ || e.which === 32 /* Space */ ) {
- toggle( $(this) );
- }
- } )
- .delegate( '.portal:not(.persistent) > h3, .portal:not(.persistent) > h5', 'mousedown', function ( e ) {
- if ( e.which !== 3 ) { // Right mouse click
- toggle( $(this) );
- $(this).blur();
- }
- return false;
- } );
- });
-
-}( mediaWiki, jQuery ) );
diff --git a/extensions/Vector/modules/ext.vector.collapsibleTabs.js b/extensions/Vector/modules/ext.vector.collapsibleTabs.js
deleted file mode 100644
index 439a1995..00000000
--- a/extensions/Vector/modules/ext.vector.collapsibleTabs.js
+++ /dev/null
@@ -1,29 +0,0 @@
-/**
- * Collapsible tabs for Vector
- */
-jQuery( function ( $ ) {
- var $cactions = $( '#p-cactions' );
-
- // Bind callback functions to animate our drop down menu in and out
- // and then call the collapsibleTabs function on the menu
- $( '#p-views ul' )
- .bind( 'beforeTabCollapse', function () {
- // If the dropdown was hidden, show it
- if ( $cactions.hasClass( 'emptyPortlet' ) ) {
- $cactions
- .removeClass( 'emptyPortlet' )
- .find( 'h3, h5' )
- .css( 'width', '1px' ).animate( { 'width': '24px' }, 390 );
- }
- } )
- .bind( 'beforeTabExpand', function () {
- // If we're removing the last child node right now, hide the dropdown
- if ( $cactions.find( 'li' ).length === 1 ) {
- $cactions.find( 'h3, h5' ).animate( { 'width': '1px' }, 390, function () {
- $( this ).attr( 'style', '' )
- .parent().addClass( 'emptyPortlet' );
- });
- }
- } )
- .collapsibleTabs();
-} );
diff --git a/extensions/Vector/modules/ext.vector.expandableSearch.css b/extensions/Vector/modules/ext.vector.expandableSearch.css
deleted file mode 100644
index 8b33bbb1..00000000
--- a/extensions/Vector/modules/ext.vector.expandableSearch.css
+++ /dev/null
@@ -1,11 +0,0 @@
-.expandableField {
- display: block;
-}
-
-#simpleSearch {
- overflow: auto;
-}
-
-#searchButton {
- margin-top: 0.2em !important;
-}
diff --git a/extensions/Vector/modules/ext.vector.expandableSearch.js b/extensions/Vector/modules/ext.vector.expandableSearch.js
deleted file mode 100644
index b4910647..00000000
--- a/extensions/Vector/modules/ext.vector.expandableSearch.js
+++ /dev/null
@@ -1,72 +0,0 @@
-/*
- * Expandable search for Vector
- */
-jQuery( document ).ready( function ( $ ) {
-
- /* Browser Support */
-
- var map = {
- // Left-to-right languages
- ltr: {
- // Collapsible Nav is broken in Opera < 9.6 and Konqueror < 4
- msie: [['>=', 8]],
- blackberry: false,
- ipod: false,
- iphone: false,
- ps3: false
- },
- // Right-to-left languages
- rtl: {
- msie: [['>=', 8]],
- blackberry: false,
- ipod: false,
- iphone: false,
- ps3: false
- }
- };
- if ( !$.client.test( map ) ) {
- return true;
- }
-
- $( '#searchInput' )
- .expandableField( {
- beforeExpand: function ( context ) {
- // Animate the containers border
- $( this )
- .parent()
- .animate( {
- borderTopColor: '#a0d8ff',
- borderLeftColor: '#a0d8ff',
- borderRightColor: '#a0d8ff',
- borderBottomColor: '#a0d8ff'
- }, 'fast' );
- },
- beforeCondense: function ( context ) {
- // Animate the containers border
- $( this )
- .parent()
- .animate( {
- borderTopColor: '#aaaaaa',
- borderLeftColor: '#aaaaaa',
- borderRightColor: '#aaaaaa',
- borderBottomColor: '#aaaaaa'
- }, 'fast' );
- },
- afterExpand: function ( context ) {
- // Trigger the collapsible tabs resize handler
- if ( $.collapsibleTabs ) {
- $.collapsibleTabs.handleResize();
- }
- },
- afterCondense: function ( context ) {
- // Trigger the collapsible tabs resize handler
- if ( $.collapsibleTabs ) {
- $.collapsibleTabs.handleResize();
- }
- },
- expandToLeft: !$( 'body' ).hasClass( 'rtl' )
- } )
- .css( 'float', $( 'body' ).hasClass( 'rtl' ) ? 'right' : 'left' )
- .siblings( 'button' )
- .css( 'float', $( 'body' ).hasClass( 'rtl' ) ? 'right' : 'left' );
-} );
diff --git a/extensions/Vector/modules/ext.vector.footerCleanup.js b/extensions/Vector/modules/ext.vector.footerCleanup.js
deleted file mode 100644
index 5881014d..00000000
--- a/extensions/Vector/modules/ext.vector.footerCleanup.js
+++ /dev/null
@@ -1,31 +0,0 @@
-/**
- * Footer cleanup for Vector
- */
-( function ( $ ) {
- // Wait for onload to remove edit help and "|" after cancel link.
- $( window ).load( function () {
- // Only if advanced editor is found.
- if ( 'wikiEditor' in $ ) {
- $( '.editButtons' ).find( '.editHelp' ).remove();
- // Remove the "|" from after the cancelLink.
- var $cancelLink = $( '#mw-editform-cancel' );
- $cancelLink.parent().empty().append( $cancelLink );
- // Adjustment for proper right side alignment with WikiEditor.
- $( '.editOptions, #editpage-specialchars' ).css( 'margin-right', '-2px' );
- }
- } );
- // Waiting until dom ready as the module is loaded in the head.
- $( document ).ready( function () {
- // Make "Templates used" a collapsible list.
- $( '.templatesUsed' ).footerCollapsibleList( {
- name: 'templates-used-list',
- title: mw.msg( 'vector-footercleanup-templates' )
- } );
-
- // Make "Hidden categories" a collapsible list.
- $( '.hiddencats' ).footerCollapsibleList( {
- name: 'hidden-categories-list',
- title: mw.msg( 'vector-footercleanup-categories' )
- } );
- } );
-} ( jQuery ) );
diff --git a/extensions/Vector/modules/ext.vector.sectionEditLinks.css b/extensions/Vector/modules/ext.vector.sectionEditLinks.css
deleted file mode 100644
index 07df70aa..00000000
--- a/extensions/Vector/modules/ext.vector.sectionEditLinks.css
+++ /dev/null
@@ -1,19 +0,0 @@
-/**
- * Section edit links
- */
-
-span.vector-editLink {
- float: none;
- display: inline-block;
-}
-
-span.vector-editLink a {
- padding-left: 18px;
- /* @embed */
- background: url(images/edit-faded.png) left top no-repeat;
-}
-
-span.vector-editLink a:hover {
- /* @embed */
- background-image: url(images/edit.png);
-}
diff --git a/extensions/Vector/modules/ext.vector.sectionEditLinks.js b/extensions/Vector/modules/ext.vector.sectionEditLinks.js
deleted file mode 100644
index 62bde9e6..00000000
--- a/extensions/Vector/modules/ext.vector.sectionEditLinks.js
+++ /dev/null
@@ -1,66 +0,0 @@
-/*
- * Section Edit Links for Vector
- */
-( function ( $, mw ) {
-
-var eventBase = 'ext.vector.sectionEditLinks-bucket:';
-var cookieBase = 'ext.vector.sectionEditLinks-';
-var bucket = null;
-
-if ( mw.config.get( 'wgVectorSectionEditLinksBucketTest', false ) ) {
- // If the version in the client's cookie doesn't match wgVectorSectionEditLinksExperiment, then
- // we need to disregard the bucket they may already be in to ensure accurate redistribution
- var currentExperiment = $.cookie( cookieBase + 'experiment' );
- var experiment = Number( mw.config.get( 'wgVectorSectionEditLinksExperiment', 0 ) );
- if ( currentExperiment === null || Number( currentExperiment ) != experiment ) {
- $.cookie( cookieBase + 'experiment', experiment );
- } else {
- bucket = $.cookie( cookieBase + 'bucket' );
- }
- if ( bucket === null ) {
- // Percentage chance of being tracked
- var odds = Math.min( 100, Math.max( 0,
- Number( mw.config.get( 'wgVectorSectionEditLinksLotteryOdds', 0 ) )
- ) );
- // 0 = not tracked, 1 = tracked with old version, 2 = tracked with new version
- bucket = ( Math.random() * 100 ) < odds ? Number( Math.random() < 0.5 ) + 1 : 0;
- $.cookie( cookieBase + 'bucket', bucket, { 'path': '/', 'expires': 30 } );
- // If we are going to track this person from now on, let's also track which bucket we put
- // them into and when
- if ( bucket > 0 && 'trackAction' in $ ) {
- $.trackAction( eventBase + bucket + '@' + experiment );
- }
- }
-}
-
-if ( bucket <= 0 ) {
- return;
-}
-
-$(document).ready( function () {
- if ( bucket == 2 ) {
- // Move the link over to be next to the heading text and style it with an icon
- $( 'span.mw-headline' ).each( function () {
- $(this)
- .after(
- $( '<span class="editsection vector-editLink"></span>' )
- .append(
- $(this)
- .prev( 'span.editsection' )
- .find( 'a' )
- .each( function () {
- var text = $(this).text();
- $(this).text(
- text.substr( 0, 1 ).toUpperCase() + text.substr( 1 )
- );
- } )
- .detach()
- )
- )
- .prev( 'span.editsection' )
- .remove();
- } );
- }
-} );
-
-} )( jQuery, mediaWiki );
diff --git a/extensions/Vector/modules/images/edit-faded.png b/extensions/Vector/modules/images/edit-faded.png
deleted file mode 100644
index 1e2e5d83..00000000
--- a/extensions/Vector/modules/images/edit-faded.png
+++ /dev/null
Binary files differ
diff --git a/extensions/Vector/modules/images/edit.png b/extensions/Vector/modules/images/edit.png
deleted file mode 100644
index fe281252..00000000
--- a/extensions/Vector/modules/images/edit.png
+++ /dev/null
Binary files differ
diff --git a/extensions/Vector/modules/images/portal-break.png b/extensions/Vector/modules/images/portal-break.png
deleted file mode 100644
index 10cd7f83..00000000
--- a/extensions/Vector/modules/images/portal-break.png
+++ /dev/null
Binary files differ
diff --git a/extensions/Vector/modules/jquery.footerCollapsibleList.js b/extensions/Vector/modules/jquery.footerCollapsibleList.js
deleted file mode 100644
index 7b9b5bcb..00000000
--- a/extensions/Vector/modules/jquery.footerCollapsibleList.js
+++ /dev/null
@@ -1,44 +0,0 @@
-( function( $ ) {
- // Small jQuery plugin to handle the toggle function & cookie for state
- // For collapsible items in the footer
- $.fn.footerCollapsibleList = function( config ) {
- if ( !( 'title' in config ) || !( 'name' in config ) ) {
- return;
- }
-
- return this.each( function () {
- var $container, $ul, $explanation, $icon;
-
- $container = $( this );
- $ul = $container.find( 'ul' );
- $explanation = $container.find( '.mw-templatesUsedExplanation, .mw-hiddenCategoriesExplanation' );
-
- $icon = $( '<span>' );
- $ul.before(
- $( '<a>' )
- .addClass( 'collapsible-list' )
- .text( config.title )
- .append( $icon )
- .on( 'click', function( e ) {
- // Modify state cookie.
- var state = ( $.cookie( config.name ) !== 'expanded' ) ? 'expanded' : 'collapsed';
- $.cookie( config.name, state );
-
- // Modify DOM.
- $ul.slideToggle();
- $icon.toggleClass( 'collapsed' );
-
- e.preventDefault();
- } )
- );
-
- $explanation.remove();
-
- // Check cookie and collapse.
- if( $.cookie( config.name ) === null || $.cookie( config.name ) === 'collapsed' ) {
- $ul.hide();
- $icon.addClass( 'collapsed' );
- }
- } );
- };
-}( jQuery ) );
diff --git a/extensions/Vector/switchExperimentPrefs.php b/extensions/Vector/switchExperimentPrefs.php
deleted file mode 100644
index 82ddd868..00000000
--- a/extensions/Vector/switchExperimentPrefs.php
+++ /dev/null
@@ -1,63 +0,0 @@
-<?php
-
-$path = '../..';
-
-if ( getenv( 'MW_INSTALL_PATH' ) !== false ) {
- $path = getenv( 'MW_INSTALL_PATH' );
-}
-
-require_once( $path . '/maintenance/Maintenance.php' );
-
-class SwitchExperimentPrefs extends Maintenance {
- function __construct() {
- parent::__construct();
- $this->addOption( 'pref', 'Preference to set', true, true );
- $this->addOption( 'value', 'Value to set the preference to', true, true );
- $this->mDescription = 'Set a preference for all users that have the vector-noexperiments preference enabled.';
- }
-
- function execute() {
- $dbw = wfGetDB( DB_MASTER );
-
- $batchSize = 100;
- $total = 0;
- $lastUserID = 0;
- while ( true ) {
- $res = $dbw->select( 'user_properties', array( 'up_user' ),
- array( 'up_property' => 'vector-noexperiments', "up_user > $lastUserID" ),
- __METHOD__,
- array( 'LIMIT' => $batchSize ) );
- if ( !$res->numRows() ) {
- $dbw->commit();
- break;
- }
- $total += $res->numRows();
-
- $ids = array();
- foreach ( $res as $row ) {
- $ids[] = $row->up_user;
- }
- $lastUserID = max( $ids );
-
-
- foreach ( $ids as $id ) {
- $user = User::newFromId( $id );
- if ( !$user->isLoggedIn() )
- continue;
- $user->setOption( $this->getOption( 'pref' ), $this->getOption( 'value' ) );
- $user->saveSettings();
- }
-
- echo "$total\n";
-
- wfWaitForSlaves(); // Must be wfWaitForSlaves_masterPos(); on 1.17wmf1
- }
- echo "Done\n";
-
- }
-}
-
-$maintClass = 'SwitchExperimentPrefs';
-require_once( RUN_MAINTENANCE_IF_MAIN );
-
-
diff --git a/extensions/WikiEditor/.jshintignore b/extensions/WikiEditor/.jshintignore
index 66a218b5..b97a47d3 100644
--- a/extensions/WikiEditor/.jshintignore
+++ b/extensions/WikiEditor/.jshintignore
@@ -1,2 +1,4 @@
# upstream lib from Google
modules/contentCollector.js
+# messy
+modules/jquery.wikiEditor.iframe.js
diff --git a/extensions/WikiEditor/.jshintrc b/extensions/WikiEditor/.jshintrc
index 64cd5087..5d335e32 100644
--- a/extensions/WikiEditor/.jshintrc
+++ b/extensions/WikiEditor/.jshintrc
@@ -1,9 +1,33 @@
{
+ /* Common */
+
+ // Enforcing
+ "camelcase": true,
+ "curly": true,
+ "eqeqeq": true,
+ "immed": true,
+ "latedef": true,
+ "newcap": true,
+ "noarg": true,
+ "noempty": true,
+ "nonew": true,
+ "quotmark": "single",
+ "trailing": true,
+ "undef": true,
+ "unused": true,
+ // Legacy
+ "onevar": true,
+
+ /* Local */
+
+ // Relaxing
+ "loopfunc": true,
+ "multistr": true,
+ // Environment
+ "browser": true,
+
"predef": [
"mediaWiki",
"jQuery"
- ],
- "browser": true,
- "smarttabs": true,
- "multistr": true
+ ]
}
diff --git a/extensions/WikiEditor/WikiEditor.hooks.php b/extensions/WikiEditor/WikiEditor.hooks.php
index 57b8ff35..89f27f48 100644
--- a/extensions/WikiEditor/WikiEditor.hooks.php
+++ b/extensions/WikiEditor/WikiEditor.hooks.php
@@ -12,7 +12,7 @@ class WikiEditorHooks {
protected static $features = array(
- /* Beta Features */
+ /* Toolbar Features */
'toolbar' => array(
'preferences' => array(
@@ -20,7 +20,7 @@ class WikiEditorHooks {
'usebetatoolbar' => array(
'type' => 'toggle',
'label-message' => 'wikieditor-toolbar-preference',
- 'section' => 'editing/beta',
+ 'section' => 'editing/editor',
),
),
'requirements' => array(
@@ -36,7 +36,7 @@ class WikiEditorHooks {
'usebetatoolbar-cgd' => array(
'type' => 'toggle',
'label-message' => 'wikieditor-toolbar-dialogs-preference',
- 'section' => 'editing/beta',
+ 'section' => 'editing/editor',
),
),
'requirements' => array(
@@ -52,7 +52,7 @@ class WikiEditorHooks {
'wikieditor-toolbar-hidesig' => array(
'type' => 'toggle',
'label-message' => 'wikieditor-toolbar-hidesig',
- 'section' => 'editing/beta',
+ 'section' => 'editing/editor',
),
),
'requirements' => array(
diff --git a/extensions/WikiEditor/WikiEditor.i18n.php b/extensions/WikiEditor/WikiEditor.i18n.php
index b679ab48..97cef8ff 100644
--- a/extensions/WikiEditor/WikiEditor.i18n.php
+++ b/extensions/WikiEditor/WikiEditor.i18n.php
@@ -51,7 +51,7 @@ $messages['en'] = array(
'wikieditor-toolbar' => 'Editing toolbar',
'wikieditor-toolbar-desc' => 'Edit page toolbar with enhanced usability',
'wikieditor-toolbar-preference' => 'Enable enhanced editing toolbar',
- 'wikieditor-toolbar-dialogs-preference' => 'Enable dialogs for inserting links, tables and more',
+ 'wikieditor-toolbar-dialogs-preference' => 'Enable wizards for inserting links, tables as well as the search and replace function',
'wikieditor-toolbar-hidesig' => 'Hide the signature button from pages in the main namespace',
'wikieditor-toolbar-loading' => 'Loading...',
/* Toolbar - Main Section */
@@ -80,6 +80,7 @@ $messages['en'] = array(
'wikieditor-toolbar-tool-link-int-target-status-invalid' => 'Invalid title',
'wikieditor-toolbar-tool-link-int-target-status-external' => 'External link',
'wikieditor-toolbar-tool-link-int-target-status-loading' => 'Checking page existence...',
+ 'wikieditor-toolbar-tool-link-int-target-status-disambig' => 'Disambiguation page',
'wikieditor-toolbar-tool-link-int-invalid' => 'The title you specified is invalid.',
'wikieditor-toolbar-tool-link-lookslikeinternal' => 'The URL you specified looks like it was intended as a link to another wiki page.
Do you want to make it an internal link?',
@@ -333,6 +334,7 @@ I guess that "feature-providing modules" means the same as "modules providing fe
{{Identical|Publish}}",
'wikieditor-publish-dialog-goback' => 'Button that closes the dialog that opens when the user clicks the Publish button.
{{Identical|Go back}}',
+ 'wikieditor-template-editor-dialog-title' => '{{Identical|Edit template}}',
'wikieditor-template-editor-dialog-submit' => '{{Identical|Update}}',
'wikieditor-template-editor-dialog-cancel' => '{{Identical|Cancel}}',
'wikieditor-toc-preference' => "Option at [[Special:Preferences]], tab ''{{int:prefs-editing}}''",
@@ -340,10 +342,10 @@ I guess that "feature-providing modules" means the same as "modules providing fe
'wikieditor-toc-hide' => 'Label of the show/hide link when the navigable table of contents is visible',
'wikieditor-toolbar' => 'A customizable toolbar for the WikiEditor.
For more information, see http://www.mediawiki.org/wiki/Extension:WikiEditor/Toolbar_customization',
- 'wikieditor-toolbar-desc' => '{{desc}}',
+ 'wikieditor-toolbar-desc' => 'Unused at this time.',
'wikieditor-toolbar-preference' => 'Option in [[Special:Preferences]]',
'wikieditor-toolbar-dialogs-preference' => "Caption of a checkbox on [[Special:Preferences]] (''editing'' tab), enabling helper dialogs for various features of the advanced edit toolbar (e.g. inserting links or tables).
-{{Identical|Enable dialogs for inserting links, tables and more}}",
+{{Identical|Enable wizards for inserting links, tables as well as the search and replace function}}",
'wikieditor-toolbar-loading' => '{{Identical|Loading}}',
'wikieditor-toolbar-tool-bold' => '{{Identical|Bold}}',
'wikieditor-toolbar-tool-bold-example' => '{{Identical|Bold text}}',
@@ -353,6 +355,7 @@ For more information, see http://www.mediawiki.org/wiki/Extension:WikiEditor/Too
'wikieditor-toolbar-tool-xlink' => '{{Identical|External link (remember http:// prefix)}}',
'wikieditor-toolbar-tool-xlink-example' => "www.example.com is not a real website, but it has been reserved to use in software documentation, and will never be sold or used for advertising. If you translate the word example and try to go to that web address then you might get a message that it doesn't exist. But somebody may have created a commercial web page for that address, such as www.Beispiel.org, using the German word for example. It is therefore recommended that you do not translate http://www.example.com at all. If you do wish to translate it you should first check where the translated link takes you, and bear in mind that anybody could purchase that name in the future.",
'wikieditor-toolbar-tool-link' => '{{Identical|Link}}',
+ 'wikieditor-toolbar-tool-link-ext-target' => '{{Identical|Link URL}}',
'wikieditor-toolbar-tool-link-cancel' => '{{Identical|Cancel}}',
'wikieditor-toolbar-tool-link-int-target-status-exists' => 'Text shown when the title the user entered exists',
'wikieditor-toolbar-tool-link-int-target-status-notexists' => 'Text shown when the title the user entered does not exist',
@@ -361,12 +364,16 @@ For more information, see http://www.mediawiki.org/wiki/Extension:WikiEditor/Too
'wikieditor-toolbar-tool-link-int-target-status-external' => 'Text shown when the link target the user entered points to an external web site
{{Identical|External link}}',
'wikieditor-toolbar-tool-link-int-target-status-loading' => 'alt text and title text for the image shown while the title the user entered is being checked for existence',
+ 'wikieditor-toolbar-tool-link-int-target-status-disambig' => 'Text shown when the link target the user entered points to a disambiguation page.
+{{Identical|Disambiguation page}}',
'wikieditor-toolbar-tool-link-int-invalid' => 'This message appears when you try to create an internal link but the page title in the link is invalid.',
'wikieditor-toolbar-tool-link-lookslikeinternal-int' => '{{Identical|Internal link}}',
'wikieditor-toolbar-tool-link-lookslikeinternal-ext' => '{{Identical|External link}}',
'wikieditor-toolbar-tool-file' => '{{Identical|Embedded file}}',
+ 'wikieditor-toolbar-tool-file-example' => '{{Identical|Example}}',
'wikieditor-toolbar-tool-file-title' => 'Title for insert file dialog',
- 'wikieditor-toolbar-file-target' => 'Label for the input of filename on insert file dialog',
+ 'wikieditor-toolbar-file-target' => 'Label for the input of filename on insert file dialog.
+{{Identical|Filename}}',
'wikieditor-toolbar-file-caption' => 'Label for input of caption on insert file dialog
{{Identical|Caption}}',
@@ -381,20 +388,24 @@ For more information, see http://www.mediawiki.org/wiki/Extension:WikiEditor/Too
'wikieditor-toolbar-tool-file-cancel' => '{{Identical|Cancel}}',
'wikieditor-toolbar-tool-reference' => '{{Identical|Reference}}',
'wikieditor-toolbar-tool-reference-cancel' => '{{Identical|Cancel}}',
- 'wikieditor-toolbar-tool-reference-title' => 'Title of insert reference dialog. This text is on the very top bar of the dialog.',
+ 'wikieditor-toolbar-tool-reference-title' => 'Title of insert reference dialog. This text is on the very top bar of the dialog.
+{{Identical|Insert reference}}',
'wikieditor-toolbar-tool-reference-insert' => 'Button text for the insert action of the insert reference dialog.
{{Identical|Insert}}',
'wikieditor-toolbar-tool-reference-text' => 'Label for the input field on the insert reference dialog.',
'wikieditor-toolbar-tool-signature' => '{{Identical|Signature with timestamp}}',
'wikieditor-toolbar-section-advanced' => '{{Identical|Advanced}}',
+ 'wikieditor-toolbar-tool-heading' => '{{Identical|Heading}}',
'wikieditor-toolbar-group-format' => '{{Identical|Format}}',
'wikieditor-toolbar-tool-ulist' => '{{Identical|Bulleted list}}',
'wikieditor-toolbar-tool-olist' => '{{Identical|Numbered list}}',
+ 'wikieditor-toolbar-tool-indent' => '{{Identical|Indent}}',
'wikieditor-toolbar-tool-nowiki' => 'This is the text that appears when you hover the mouse over the third button from the right on the edit toolbar.',
'wikieditor-toolbar-tool-redirect' => "Tooltip for icon to place wiki text for a redirect in the edit box. The label before these icons says 'Insert'. 'Redirect' is a noun here.
{{Identical|Redirect}}",
'wikieditor-toolbar-tool-redirect-example' => "Target is an adjective describing the page name. You could use 'destination' instead of 'target'. 'Target page name' is the destination of the redirect and appears when the wikitext for a redirect is inserted in the text box thus
<nowiki>#REDIRECT [[target page name]]</nowiki>",
+ 'wikieditor-toolbar-tool-big' => '{{Identical|Big}}',
'wikieditor-toolbar-tool-small' => '{{Identical|Small}}',
'wikieditor-toolbar-group-insert' => '{{Identical|Insert}}',
'wikieditor-toolbar-tool-gallery-example' => 'Used as example for Picture Gallery.
@@ -411,7 +422,9 @@ See also:
* {{msg-mw|wikieditor-toolbar-tool-table-example-header}}
* {{msg-mw|wikieditor-toolbar-tool-table-example}}',
'wikieditor-toolbar-tool-table-title' => '[[File:Wikieditor-toolbar-tool-table.png|thumb]] See screenshot.',
- 'wikieditor-toolbar-tool-table-dimensions-rows' => '[[File:Wikieditor-toolbar-tool-table.png|thumb]] See screenshot.',
+ 'wikieditor-toolbar-tool-table-dimensions-rows' => 'See screenshot.
+[[File:Wikieditor-toolbar-tool-table.png|thumb]]
+{{Identical|Row}}',
'wikieditor-toolbar-tool-table-dimensions-columns' => '[[File:Wikieditor-toolbar-tool-table.png|thumb]] See screenshot.
{{Identical|Column}}',
'wikieditor-toolbar-tool-table-dimensions-header' => '[[File:Wikieditor-toolbar-tool-table.png|thumb]] See screenshot.',
@@ -458,11 +471,14 @@ More notes:
'wikieditor-toolbar-tool-replace-close' => '{{Identical|Close}}',
'wikieditor-toolbar-tool-replace-success' => 'Parameter:
* $1 - the number of replacements',
- 'wikieditor-toolbar-tool-replace-invalidregex' => '$1 is a browser-supplied error message, probably in English, possibly in the browser language.
+ 'wikieditor-toolbar-tool-replace-invalidregex' => 'Parameters:
+* $1 - a browser-supplied error message, probably in English, possibly in the browser language.
A "regular expression" is a syntax to find strings based on patterns, for more see [[wikipedia:Regular expression|the Wikipedia article]].
-Regular expressions are mostly a programmer tool, which is sometimes exposed to normal users too. It\'s almost as an programming language, but it is used to describe different kinds of strings (sometimes also called patterns and pattern matching), and is often used to change (parts of) the strings too.',
+Regular expressions are mostly a programmer tool, which is sometimes exposed to normal users too.
+
+It\'s almost as an programming language, but it is used to describe different kinds of strings (sometimes also called patterns and pattern matching), and is often used to change (parts of) the strings too.',
'wikieditor-toolbar-section-characters' => 'This will be a toolbar for special characters, like emoticons.
For more information, see http://www.mediawiki.org/wiki/Extension:WikiEditor/Toolbar_customization
{{Identical|Special character}}',
@@ -485,12 +501,15 @@ For more information, see http://www.mediawiki.org/wiki/Extension:WikiEditor/Too
For more information, see http://www.mediawiki.org/wiki/Extension:WikiEditor/Toolbar_customization',
'wikieditor-toolbar-characters-page-telugu' => 'The name of the [[w:Telugu language#Alphabet|Telugu]] character set (alphabet) on the toolbar.
For more information, see http://www.mediawiki.org/wiki/Extension:WikiEditor/Toolbar_customization',
+ 'wikieditor-toolbar-characters-page-lao' => '{{Identical|Lao}}',
+ 'wikieditor-toolbar-characters-page-khmer' => '{{Identical|Khmer}}',
'wikieditor-toolbar-characters-endash' => 'Title tooltip for the en dash character (–); See https://en.wikipedia.org/wiki/Dash',
'wikieditor-toolbar-characters-emdash' => 'Title tooltip for the em dash character (—); See https://en.wikipedia.org/wiki/Dash',
'wikieditor-toolbar-characters-minus' => 'Title tooltip for the minus sign character (−), not to be confused with a hyphen',
'wikieditor-toolbar-section-help' => '{{Identical|Help}}',
'wikieditor-toolbar-help-heading-description' => '{{Identical|Description}}',
'wikieditor-toolbar-help-page-link' => '{{Identical|Link}}',
+ 'wikieditor-toolbar-help-page-heading' => '{{Identical|Heading}}',
'wikieditor-toolbar-help-page-list' => '{{Identical|List}}',
'wikieditor-toolbar-help-page-file' => '{{Identical|File}}',
'wikieditor-toolbar-help-page-reference' => '{{Identical|Reference}}',
@@ -519,8 +538,13 @@ For more information, see http://www.mediawiki.org/wiki/Extension:WikiEditor/Too
'wikieditor-toolbar-help-content-ulist-description' => '{{Identical|Bulleted list}}',
'wikieditor-toolbar-help-content-olist-description' => '{{Identical|Numbered list}}',
'wikieditor-toolbar-help-content-file-description' => '{{Identical|Embedded file}}',
- 'wikieditor-toolbar-help-content-file-syntax' => "{{doc-important|''thumb'' is a magic word. Leave it untranslated!}}",
- 'wikieditor-toolbar-help-content-file-result' => '{{doc-important|Do not translate anything except "Caption text" (twice) and "Enlarge" (to "{{int:thumbnail-more}}").}}',
+ 'wikieditor-toolbar-help-content-file-syntax' => "{{doc-important|''thumb'' is a magic word. Leave it untranslated!}}
+Parameters:
+* \$1 - \"File\" namespace name",
+ 'wikieditor-toolbar-help-content-file-result' => '{{doc-important|Do not translate anything except "Caption text" (twice) and "Enlarge" (to "{{int:thumbnail-more}}").}}
+Parameters:
+* $1 - style path. e.g. "/w/skins"
+* $2 - extension assets path. e.g. "/w/extensions"',
'wikieditor-toolbar-help-content-reference-description' => '{{Identical|Reference}}',
'wikieditor-toolbar-help-content-reference-syntax' => 'I suggest leaving the <code>name="test"</code> string in English
@@ -534,6 +558,7 @@ www.example.org is not a real website, but it has been reserved to use in softwa
'wikieditor-toolbar-help-content-signaturetimestamp-syntax' => '{{notranslate}}',
'wikieditor-toolbar-help-content-signature-description' => '{{Identical|Signature}}',
'wikieditor-toolbar-help-content-signature-syntax' => '{{notranslate}}',
+ 'wikieditor-toolbar-help-content-indent-description' => '{{Identical|Indent}}',
);
/** Abkhazian (ÐÒ§Ñшәа)
@@ -588,7 +613,7 @@ $messages['af'] = array(
'wikieditor-toolbar' => 'Wysigingswerksbalk',
'wikieditor-toolbar-desc' => 'Wysigingsbalk met verhoogde bruikbaarheid',
'wikieditor-toolbar-preference' => 'Gebruik gevorderde redigeringsbalk',
- 'wikieditor-toolbar-dialogs-preference' => 'Aktiveer dialoog vir die byvoeging van skakels, tabelle en meer',
+ 'wikieditor-toolbar-dialogs-preference' => 'Aktiveer dialoog vir die byvoeging van skakels, tabelle en meer', # Fuzzy
'wikieditor-toolbar-hidesig' => 'Steek die ondertekening knoppie van die bladsye in die hoof naamruimte',
'wikieditor-toolbar-loading' => 'Besig om te laai...',
'wikieditor-toolbar-tool-bold' => 'Vetdruk',
@@ -624,10 +649,14 @@ Wil u dit na 'n interne skakel verander?",
'wikieditor-toolbar-tool-link-empty' => 'U het niks ingesleutel om na te skakel nie.',
'wikieditor-toolbar-tool-file' => 'Ingebedde lêer',
'wikieditor-toolbar-tool-file-example' => 'Voorbeeld.jpg',
+ 'wikieditor-toolbar-tool-file-title' => 'Voeg lêer by',
'wikieditor-toolbar-file-target' => 'Lêernaam:',
'wikieditor-toolbar-file-caption' => 'Byskrif:',
'wikieditor-toolbar-file-size' => 'Grootte:',
+ 'wikieditor-toolbar-file-float' => 'Uitlyning:',
+ 'wikieditor-toolbar-file-default' => '(standaard)',
'wikieditor-toolbar-file-format' => 'Formaat:',
+ 'wikieditor-toolbar-file-format-none' => 'geen',
'wikieditor-toolbar-tool-file-insert' => 'Invoeg',
'wikieditor-toolbar-tool-file-cancel' => 'Kanselleer',
'wikieditor-toolbar-tool-reference' => 'Verwysing',
@@ -694,7 +723,7 @@ $1:Voorbeeld2|Byskrif2',
'wikieditor-toolbar-tool-table-preview' => 'Voorskou',
'wikieditor-toolbar-tool-table-insert' => 'Invoeg',
'wikieditor-toolbar-tool-table-cancel' => 'Kanselleer',
- 'wikieditor-toolbar-tool-table-toomany' => "U kan nie 'n tabel met meer as $1 selle met die dialoog invoeg nie.", # Fuzzy
+ 'wikieditor-toolbar-tool-table-toomany' => "Die dialoog kan die 'n tabel met meer as 1000 selle hanteer nie.",
'wikieditor-toolbar-tool-table-invalidnumber' => "U het 'n ongeldige aantal lyne of kolomme verskaf.",
'wikieditor-toolbar-tool-table-zero' => "U kan nie 'n tabel sonder lyne en kolomme invoeg nie.",
'wikieditor-toolbar-tool-replace' => 'Soek en vervang',
@@ -708,7 +737,7 @@ $1:Voorbeeld2|Byskrif2',
'wikieditor-toolbar-tool-replace-button-replaceall' => 'Vervang alles',
'wikieditor-toolbar-tool-replace-close' => 'Sluit',
'wikieditor-toolbar-tool-replace-nomatch' => 'U soektog het geen resultate opgelewer nie.',
- 'wikieditor-toolbar-tool-replace-success' => '$1 vervangings gemaak.', # Fuzzy
+ 'wikieditor-toolbar-tool-replace-success' => '$1 {{PLURAL:$1|item|items}} is vervang.',
'wikieditor-toolbar-tool-replace-emptysearch' => 'U het niks ingesleutel om na te soek nie.',
'wikieditor-toolbar-tool-replace-invalidregex' => 'Die "regular expression" wat u verskaf het is ongeldig: $1',
'wikieditor-toolbar-section-characters' => 'Spesiale karakters',
@@ -776,7 +805,7 @@ $1:Voorbeeld2|Byskrif2',
'wikieditor-toolbar-help-content-olist-syntax' => '# Lyn in genommerde lys<br /># Lyn in genommerde lys',
'wikieditor-toolbar-help-content-olist-result' => '<ol><li>Lyn in genommerde lys</li><li>Lyn in genommerde lys</li></ol>',
'wikieditor-toolbar-help-content-file-description' => 'Ingebedde lêer',
- 'wikieditor-toolbar-help-content-file-syntax' => '[[$1:Voorbeeld.png|thumb|Byskrif]]', # Fuzzy
+ 'wikieditor-toolbar-help-content-file-syntax' => '[[$1:Voorbeeld.png|thumb|Byskrif]]',
'wikieditor-toolbar-help-content-file-result' => "<div style='width:104px;' class='thumbinner'><a title='Byskrif' class='image' href='#'><img height='50' width='100' border='0' class='thumbimage' src='$2/WikiEditor/modules/images/toolbar/example-image.png' alt=''/></a><div class='thumbcaption'><div class='magnify'><a title='Vergroot' class='internal' href='#'><img height='11' width='15' alt='' src='$1/common/images/magnify-clip.png'/></a></div>Byskrif</div></div>",
'wikieditor-toolbar-help-content-reference-description' => 'Verwysing',
'wikieditor-toolbar-help-content-reference-syntax' => 'Bladsyteks.&lt;ref name="test"&gt;[http://www.voorbeeld.org Skakel se teks], addisionele teks.&lt;/ref&gt;',
@@ -828,7 +857,7 @@ $messages['aln'] = array(
'wikieditor-toolbar' => 'Editing toolbar', # Fuzzy
'wikieditor-toolbar-desc' => 'toolbar Redakto faqe me të përdorshmërisë zgjeruar',
'wikieditor-toolbar-preference' => 'Lejo redaktimin zgjeruar toolbar',
- 'wikieditor-toolbar-dialogs-preference' => 'dialogs Aktivizo për futjen e lidhjeve, tavolina dhe më shumë',
+ 'wikieditor-toolbar-dialogs-preference' => 'dialogs Aktivizo për futjen e lidhjeve, tavolina dhe më shumë', # Fuzzy
'wikieditor-toolbar-loading' => 'Loading ...', # Fuzzy
'wikieditor-toolbar-tool-bold' => 'Guximtar',
'wikieditor-toolbar-tool-bold-example' => 'Tekst i trashë',
@@ -1054,7 +1083,7 @@ $messages['an'] = array(
'wikieditor-toolbar' => "Barra de ferramientas d'edición",
'wikieditor-toolbar-desc' => "Barra de ferramientas d'edición con usabilidat amillorada",
'wikieditor-toolbar-preference' => "Activar a barra de ferramientas d'edición amillorada",
- 'wikieditor-toolbar-dialogs-preference' => 'Activar as caixas de dialogos ta ficar vinclos, tablas y atros',
+ 'wikieditor-toolbar-dialogs-preference' => 'Activar as caixas de dialogos ta ficar vinclos, tablas y atros', # Fuzzy
'wikieditor-toolbar-hidesig' => 'Amagar o botón sinyar en as pachinas en o espacio de nombres prencipal',
'wikieditor-toolbar-loading' => 'Cargando...',
'wikieditor-toolbar-tool-bold' => 'Negreta',
@@ -1253,51 +1282,52 @@ $1:Eixemplo.jpg|Piet_de_foto_2',
/** Old English (Ænglisc)
* @author Gott wisst
+ * @author Shirayuki
* @author WÅdenhelm
*/
$messages['ang'] = array(
- 'wikieditor-toolbar' => 'Ä€dihtende tÅlscyttel',
- 'wikieditor-toolbar-loading' => 'HlÄdende...',
+ 'wikieditor-toolbar' => 'Adihtunge tÅlmearc',
+ 'wikieditor-toolbar-loading' => 'Hladende...',
'wikieditor-toolbar-tool-bold' => 'Þicce',
'wikieditor-toolbar-tool-bold-example' => 'Þicce traht',
- 'wikieditor-toolbar-tool-ilink' => 'Innanƿeard hlenċe',
- 'wikieditor-toolbar-tool-ilink-example' => 'Hlenċenama',
- 'wikieditor-toolbar-tool-xlink' => 'ŪtanÆ¿eard hlenÄ‹e (Èemynd http:// foretraht)',
- 'wikieditor-toolbar-tool-link' => 'Hlenċe',
- 'wikieditor-toolbar-tool-link-title' => 'Hlenċan ēacian',
- 'wikieditor-toolbar-tool-link-int' => 'To ƿikisīdan',
- 'wikieditor-toolbar-tool-link-int-target' => 'GÅl sÄ«de oþþe URL:',
- 'wikieditor-toolbar-tool-link-int-target-tooltip' => 'Sīdenama oþþe URL',
- 'wikieditor-toolbar-tool-link-int-text' => 'Traht to scēaƿienne:',
- 'wikieditor-toolbar-tool-link-ext' => 'To ūtanƿeardum ƿebbsīdan',
- 'wikieditor-toolbar-tool-link-ext-target' => 'Hlenċe URL',
- 'wikieditor-toolbar-tool-link-int-target-status-external' => 'Ūtanƿeard hlenċan',
- 'wikieditor-toolbar-tool-link-lookslikeinternal-int' => 'Innanƿeard hlenċe',
- 'wikieditor-toolbar-tool-file-example' => 'Bisen.jpg',
+ 'wikieditor-toolbar-tool-ilink' => 'Innanweard hlenca',
+ 'wikieditor-toolbar-tool-ilink-example' => 'Hlencan nama',
+ 'wikieditor-toolbar-tool-xlink' => 'Ūtanweard hlenca (gemynd http:// fÅretraht)',
+ 'wikieditor-toolbar-tool-link' => 'Hlenca',
+ 'wikieditor-toolbar-tool-link-title' => 'Insettan hlencan',
+ 'wikieditor-toolbar-tool-link-int' => 'TÅ wiki tramete',
+ 'wikieditor-toolbar-tool-link-int-target' => 'Endelīc tramet oþþe URL:',
+ 'wikieditor-toolbar-tool-link-int-target-tooltip' => 'Trametes nama oþþe URL',
+ 'wikieditor-toolbar-tool-link-int-text' => 'Traht þe bēo geīwed:',
+ 'wikieditor-toolbar-tool-link-ext' => 'To Å«tanweardum webbtramete',
+ 'wikieditor-toolbar-tool-link-ext-target' => 'Hlencan URL:',
+ 'wikieditor-toolbar-tool-link-int-target-status-external' => 'Ūtanweard hlenca',
+ 'wikieditor-toolbar-tool-link-lookslikeinternal-int' => 'Innanweard hlenca',
+ 'wikieditor-toolbar-tool-file-example' => 'Bysen.jpg',
'wikieditor-toolbar-tool-reference' => 'Fruma',
- 'wikieditor-toolbar-tool-heading-1' => 'Emnet 1',
- 'wikieditor-toolbar-tool-heading-2' => 'Emnet 2',
- 'wikieditor-toolbar-tool-heading-3' => 'Emnet 3',
- 'wikieditor-toolbar-tool-heading-4' => 'Emnet 4',
- 'wikieditor-toolbar-tool-heading-5' => 'Emnet 5',
- 'wikieditor-toolbar-tool-big' => 'Miċel',
- 'wikieditor-toolbar-tool-big-example' => 'Miċel traht',
+ 'wikieditor-toolbar-tool-heading-1' => '1. emnet',
+ 'wikieditor-toolbar-tool-heading-2' => '2. emnet',
+ 'wikieditor-toolbar-tool-heading-3' => '3. emnet',
+ 'wikieditor-toolbar-tool-heading-4' => '4. emnet',
+ 'wikieditor-toolbar-tool-heading-5' => '5. emnet',
+ 'wikieditor-toolbar-tool-big' => 'Micel',
+ 'wikieditor-toolbar-tool-big-example' => 'Micel traht',
'wikieditor-toolbar-tool-small' => 'Lytel',
'wikieditor-toolbar-tool-small-example' => 'Lytel traht',
- 'wikieditor-toolbar-tool-table' => 'Tæfl',
- 'wikieditor-toolbar-tool-table-dimensions-rows' => 'Rǣƿa',
- 'wikieditor-toolbar-tool-table-example' => 'Bisen',
- 'wikieditor-toolbar-tool-table-preview' => 'Forescēaƿian',
+ 'wikieditor-toolbar-tool-table' => 'Tabelle',
+ 'wikieditor-toolbar-tool-table-dimensions-rows' => 'RÇ£wa',
+ 'wikieditor-toolbar-tool-table-example' => 'Bysen',
+ 'wikieditor-toolbar-tool-table-preview' => 'FÅrebysen',
'wikieditor-toolbar-characters-page-latin' => 'LÇ£den',
- 'wikieditor-toolbar-characters-page-latinextended' => 'Ä€strecced LÇ£den',
+ 'wikieditor-toolbar-characters-page-latinextended' => 'Ä’acnod LÇ£den',
'wikieditor-toolbar-characters-page-symbols' => 'TÄcnu',
'wikieditor-toolbar-characters-page-greek' => 'Grēcisc',
'wikieditor-toolbar-characters-page-cyrillic' => 'Cyrillisc',
'wikieditor-toolbar-characters-page-arabic' => 'Arabisc',
'wikieditor-toolbar-characters-page-persian' => 'Perseanisc',
'wikieditor-toolbar-section-help' => 'Help',
- 'wikieditor-toolbar-help-page-link' => 'Hlenċan',
- 'wikieditor-toolbar-help-page-discussion' => 'Ȝespreċ',
+ 'wikieditor-toolbar-help-page-link' => 'Hlencan',
+ 'wikieditor-toolbar-help-page-discussion' => 'MÅtung',
'wikieditor-toolbar-help-content-bold-description' => 'Þicce',
'wikieditor-toolbar-help-content-bold-syntax' => "'''Þicce traht'''",
'wikieditor-toolbar-help-content-bold-result' => '<strong>Þicce traht</strong>',
@@ -1321,37 +1351,37 @@ $messages['ar'] = array(
'wikieditor' => 'الواجهة المتقدمة لتعديل نص ويكي',
'wikieditor-desc' => 'يوÙر واجهة تعديل نص ويكي قابلة للتمديد والعديد من الوحدات التي توÙر المزايا',
'wikieditor-wikitext-tab' => 'نص الويكي',
- 'wikieditor-loading' => 'جاري التحميل...',
- 'wikieditor-preview-preference' => 'مكّن المعاينة جنبًا لجنب',
- 'wikieditor-preview-tab' => 'عرض مسبق',
+ 'wikieditor-loading' => 'تحميل...',
+ 'wikieditor-preview-preference' => 'تÙعيل المعاينة جنبا بجنب',
+ 'wikieditor-preview-tab' => 'معاينة',
'wikieditor-preview-changes-tab' => 'تغييرات',
- 'wikieditor-preview-loading' => 'جاري التحميل...',
- 'wikieditor-previewDialog-preference' => 'مكّن حوار المعاينة',
- 'wikieditor-previewDialog-tab' => 'عرض مسبق',
- 'wikieditor-previewDialog-loading' => 'جاري التحميل...',
- 'wikieditor-publish-preference' => 'Ùعّل النشر خطوة بخطوة',
+ 'wikieditor-preview-loading' => 'تحميل...',
+ 'wikieditor-previewDialog-preference' => 'تÙعيل حوار المعاينة',
+ 'wikieditor-previewDialog-tab' => 'معاينة',
+ 'wikieditor-previewDialog-loading' => 'تحميل...',
+ 'wikieditor-publish-preference' => 'تÙعيل النشر خطوة بخطوة',
'wikieditor-publish-button-publish' => 'انشر',
'wikieditor-publish-button-cancel' => 'إلغاء',
'wikieditor-publish-dialog-title' => 'انشر ÙÙŠ {{SITENAME}}',
- 'wikieditor-publish-dialog-summary' => 'ملخص التعديل (اشرح باختصار التغييرات التي قمت بها):',
+ 'wikieditor-publish-dialog-summary' => 'ملخص التعديل (اشرح باختصار التغييرات التي أجريتها):',
'wikieditor-publish-dialog-minor' => 'تعديل Ø·ÙÙŠÙ',
'wikieditor-publish-dialog-watch' => 'راقب هذه الصÙحة',
'wikieditor-publish-dialog-publish' => 'انشر',
'wikieditor-publish-dialog-goback' => 'ارجع',
- 'wikieditor-template-editor-preference' => 'Ùعل تعديل قوالب الويكي المعتمد على النماذج',
- 'wikieditor-template-editor-dialog-title' => 'عدّل القالب',
- 'wikieditor-template-editor-dialog-submit' => 'حدّث',
- 'wikieditor-template-editor-dialog-cancel' => 'إلغاء',
- 'wikieditor-templates-preference' => 'مكّن طي القوالب',
- 'wikieditor-toc-preference' => 'مكّن جدول المحتويات القابل للتصÙØ­',
+ 'wikieditor-template-editor-preference' => 'تÙعيل تعديل قوالب الويكي ÙÙŠ نماذج',
+ 'wikieditor-template-editor-dialog-title' => 'عدل القالب',
+ 'wikieditor-template-editor-dialog-submit' => 'حدث',
+ 'wikieditor-template-editor-dialog-cancel' => 'ألغ',
+ 'wikieditor-templates-preference' => 'تÙعيل طي القوالب',
+ 'wikieditor-toc-preference' => 'تÙعيل جدول المحتويات القابل للتصÙØ­',
'wikieditor-toc-show' => 'أظهر المحتويات',
- 'wikieditor-toc-hide' => 'أخÙ٠المحتويات',
+ 'wikieditor-toc-hide' => 'أخ٠المحتويات',
'wikieditor-toolbar' => 'شريط أدوات التحرير',
'wikieditor-toolbar-desc' => 'شريط تحرير الصÙحات مع تحسين الاستخدامية',
- 'wikieditor-toolbar-preference' => 'مكن شريط أدوات التحرير المحسن',
- 'wikieditor-toolbar-dialogs-preference' => 'مكن حوارات إدراج الوصلات والجداول وغيرها',
+ 'wikieditor-toolbar-preference' => 'تÙعيل شريط أدوات التحرير المحسن',
+ 'wikieditor-toolbar-dialogs-preference' => 'تÙعيل حوارات إدراج الوصلات والجداول وخاصية البحث والاستبدال',
'wikieditor-toolbar-hidesig' => 'أخ٠زر التوقيع ÙÙŠ صÙحات النطاق الرئيسي',
- 'wikieditor-toolbar-loading' => 'جاري التحميل...',
+ 'wikieditor-toolbar-loading' => 'تحميل...',
'wikieditor-toolbar-tool-bold' => 'غليظ',
'wikieditor-toolbar-tool-bold-example' => 'نص غليظ',
'wikieditor-toolbar-tool-italic' => 'مائل',
@@ -1377,20 +1407,21 @@ $messages['ar'] = array(
'wikieditor-toolbar-tool-link-int-target-status-invalid' => 'عنوان غير صحيح',
'wikieditor-toolbar-tool-link-int-target-status-external' => 'وصلة خارجية',
'wikieditor-toolbar-tool-link-int-target-status-loading' => 'يلتمس وجود الصÙحة...',
+ 'wikieditor-toolbar-tool-link-int-target-status-disambig' => 'صÙحة توضيح',
'wikieditor-toolbar-tool-link-int-invalid' => 'العنوان الذي اخترته غير صالح.',
'wikieditor-toolbar-tool-link-lookslikeinternal' => 'يبدو أن المÙراد بالمسار الذي حددته وصلة إلى صÙحة ويكي أخرى. أتريد أن تجعلها وصلة داخلية؟',
'wikieditor-toolbar-tool-link-lookslikeinternal-int' => 'وصلة داخلية',
'wikieditor-toolbar-tool-link-lookslikeinternal-ext' => 'وصلة خارجية',
'wikieditor-toolbar-tool-link-empty' => 'لم تدخل شيئا لتصل به.',
- 'wikieditor-toolbar-tool-file' => 'مل٠مضمّن',
+ 'wikieditor-toolbar-tool-file' => 'مل٠مضمن',
'wikieditor-toolbar-tool-file-example' => 'Example.jpg',
'wikieditor-toolbar-tool-file-title' => 'أدرج الملÙ',
'wikieditor-toolbar-file-target' => 'اسم الملÙ:',
'wikieditor-toolbar-file-caption' => 'التعليق:',
'wikieditor-toolbar-file-size' => 'الحجم:',
'wikieditor-toolbar-file-float' => 'ناحية:',
- 'wikieditor-toolbar-file-default' => '(اÙتراضي)',
- 'wikieditor-toolbar-file-format' => 'الصيغة:',
+ 'wikieditor-toolbar-file-default' => '(غيابي)',
+ 'wikieditor-toolbar-file-format' => 'صيغة:',
'wikieditor-toolbar-file-format-none' => 'لا يوجد',
'wikieditor-toolbar-tool-file-insert' => 'إدراج',
'wikieditor-toolbar-tool-file-cancel' => 'إلغاء',
@@ -1402,22 +1433,22 @@ $messages['ar'] = array(
'wikieditor-toolbar-tool-reference-text' => 'نص المرجع',
'wikieditor-toolbar-tool-signature' => 'توقيع مع الطابع الزمني',
'wikieditor-toolbar-section-advanced' => 'متقدم',
- 'wikieditor-toolbar-tool-heading' => 'ترويسة',
+ 'wikieditor-toolbar-tool-heading' => 'عنوان',
'wikieditor-toolbar-tool-heading-1' => 'مستوى 1',
'wikieditor-toolbar-tool-heading-2' => 'مستوى 2',
'wikieditor-toolbar-tool-heading-3' => 'مستوى 3',
'wikieditor-toolbar-tool-heading-4' => 'مستوى 4',
'wikieditor-toolbar-tool-heading-5' => 'مستوى 5',
- 'wikieditor-toolbar-tool-heading-example' => 'نص الترويسة',
+ 'wikieditor-toolbar-tool-heading-example' => 'نص العنوان',
'wikieditor-toolbar-group-format' => 'تنسيق',
- 'wikieditor-toolbar-tool-ulist' => 'قائمة منقّطة',
+ 'wikieditor-toolbar-tool-ulist' => 'قائمة منقطة',
'wikieditor-toolbar-tool-ulist-example' => 'عنصر قائمة منقطة',
'wikieditor-toolbar-tool-olist' => 'قائمة مرقمة',
'wikieditor-toolbar-tool-olist-example' => 'عنصر قائمة مرقمة',
- 'wikieditor-toolbar-tool-indent' => 'هامش',
- 'wikieditor-toolbar-tool-indent-example' => 'سطر بهامش',
- 'wikieditor-toolbar-tool-nowiki' => 'لا تنسيق ويكي',
- 'wikieditor-toolbar-tool-nowiki-example' => 'أدرج نصًا غير منسق هنا',
+ 'wikieditor-toolbar-tool-indent' => 'إزاحة',
+ 'wikieditor-toolbar-tool-indent-example' => 'إزاحة سطر',
+ 'wikieditor-toolbar-tool-nowiki' => 'بلا تنسيق ويكي',
+ 'wikieditor-toolbar-tool-nowiki-example' => 'نص غير منسق',
'wikieditor-toolbar-tool-redirect' => 'تحويلة',
'wikieditor-toolbar-tool-redirect-example' => 'اسم الصÙحة الهدÙ',
'wikieditor-toolbar-tool-big' => 'كبير',
@@ -1425,55 +1456,55 @@ $messages['ar'] = array(
'wikieditor-toolbar-tool-small' => 'صغير',
'wikieditor-toolbar-tool-small-example' => 'نص صغير',
'wikieditor-toolbar-tool-superscript' => 'حر٠علوي',
- 'wikieditor-toolbar-tool-superscript-example' => 'نص الحر٠العلوي',
+ 'wikieditor-toolbar-tool-superscript-example' => 'نص علوي',
'wikieditor-toolbar-tool-subscript' => 'حر٠سÙلي',
- 'wikieditor-toolbar-tool-subscript-example' => 'نص الحر٠السÙلي',
- 'wikieditor-toolbar-group-insert' => 'أدرج',
+ 'wikieditor-toolbar-tool-subscript-example' => 'نص سÙلي',
+ 'wikieditor-toolbar-group-insert' => 'إدراج',
'wikieditor-toolbar-tool-gallery' => 'معرض صور',
'wikieditor-toolbar-tool-gallery-example' => '$1:Example.jpg|تعليق1
$1:Example.jpg|تعليق2',
'wikieditor-toolbar-tool-newline' => 'سطر جديد',
- 'wikieditor-toolbar-tool-table' => 'جدولًا',
+ 'wikieditor-toolbar-tool-table' => 'جدول',
'wikieditor-toolbar-tool-table-example-old' => '-
-! ترويسة 1
-! ترويسة 2
-! ترويسة 3
+! عنوان عمود 1
+! عنوان عمود 2
+! عنوان عمود 3
|-
-| ص٠1، خلية 1
-| ص٠1، خلية 2
-| ص٠1، خلية 3
+| ص٠1، خانة 1
+| ص٠1، خانة 2
+| ص٠1، خانة 3
|-
-| ص٠2، خلية 1
-| ص٠2، خلية 2
-| ص٠2، خلية 3',
- 'wikieditor-toolbar-tool-table-example-cell-text' => 'نص الخلية',
- 'wikieditor-toolbar-tool-table-example-header' => 'نص الترويسة',
+| ص٠2، خانة 1
+| ص٠2، خانة 2
+| ص٠2، خانة 3',
+ 'wikieditor-toolbar-tool-table-example-cell-text' => 'نص الخانة',
+ 'wikieditor-toolbar-tool-table-example-header' => 'عنوان العمود',
'wikieditor-toolbar-tool-table-title' => 'إدراج جدول',
- 'wikieditor-toolbar-tool-table-dimensions-rows' => 'الصÙÙˆÙ',
- 'wikieditor-toolbar-tool-table-dimensions-columns' => 'الأعمدة',
- 'wikieditor-toolbar-tool-table-dimensions-header' => 'ضمّن ص٠الترويسة',
- 'wikieditor-toolbar-tool-table-wikitable' => 'سمة ذات حدود',
+ 'wikieditor-toolbar-tool-table-dimensions-rows' => 'صÙÙˆÙ',
+ 'wikieditor-toolbar-tool-table-dimensions-columns' => 'أعمدة',
+ 'wikieditor-toolbar-tool-table-dimensions-header' => 'ص٠العناوين',
+ 'wikieditor-toolbar-tool-table-wikitable' => 'حدود',
'wikieditor-toolbar-tool-table-sortable' => 'اجعل الجدول قابلا للترتيب',
'wikieditor-toolbar-tool-table-example' => 'مثال',
- 'wikieditor-toolbar-tool-table-preview' => 'عرض مسبق',
+ 'wikieditor-toolbar-tool-table-preview' => 'معاينة',
'wikieditor-toolbar-tool-table-insert' => 'أدرج',
'wikieditor-toolbar-tool-table-cancel' => 'إلغاء',
- 'wikieditor-toolbar-tool-table-toomany' => 'إدراج جدول بأكثر من 1000 خلية غير ممكن عبر هذا الحوار.',
+ 'wikieditor-toolbar-tool-table-toomany' => 'إدراج جدول بأكثر من 1000 خانة غير ممكن هنا.',
'wikieditor-toolbar-tool-table-invalidnumber' => 'لم تدخل رقما صحيحا للصÙو٠أو الأعمدة.',
'wikieditor-toolbar-tool-table-zero' => 'لا يمكن أن تدرج جدولا بلا صÙو٠أو أعمدة.',
'wikieditor-toolbar-tool-replace' => 'ابحث واستبدل',
'wikieditor-toolbar-tool-replace-title' => 'ابحث واستبدل',
'wikieditor-toolbar-tool-replace-search' => 'ابحث عن:',
'wikieditor-toolbar-tool-replace-replace' => 'استبدل ب:',
- 'wikieditor-toolbar-tool-replace-case' => 'مطابقة الحالة',
- 'wikieditor-toolbar-tool-replace-regex' => 'عامل عبارة البحث كتعبير نمطي',
- 'wikieditor-toolbar-tool-replace-button-findnext' => 'جÙد التالي',
+ 'wikieditor-toolbar-tool-replace-case' => 'مطابقة حالة الأحر٠الكبيرة أو الصغيرة',
+ 'wikieditor-toolbar-tool-replace-regex' => 'البحث باستعمال تعبير نمطي',
+ 'wikieditor-toolbar-tool-replace-button-findnext' => 'جد التالي',
'wikieditor-toolbar-tool-replace-button-replace' => 'استبدل',
'wikieditor-toolbar-tool-replace-button-replaceall' => 'استبدل الكل',
'wikieditor-toolbar-tool-replace-close' => 'أغلق',
'wikieditor-toolbar-tool-replace-nomatch' => 'بحثك لم يطابق أي شيء.',
- 'wikieditor-toolbar-tool-replace-success' => 'أجري $1 استبدال(ات).', # Fuzzy
- 'wikieditor-toolbar-tool-replace-emptysearch' => 'لم تكتب شيئًا لتبحث عنه.',
+ 'wikieditor-toolbar-tool-replace-success' => 'أجري {{PLURAL:$1|استبدال|استبدال واحد|استبدالان|$1 استبدالات|$1 استبدالا|$1 استبدال}}.',
+ 'wikieditor-toolbar-tool-replace-emptysearch' => 'لم تكتب شيئا لتبحث عنه.',
'wikieditor-toolbar-tool-replace-invalidregex' => 'التعبير النمطي الذي أدخلته غير صالح: $1',
'wikieditor-toolbar-section-characters' => 'أحر٠خاصة',
'wikieditor-toolbar-characters-page-latin' => 'لاتينية',
@@ -1484,7 +1515,7 @@ $1:Example.jpg|تعليق2',
'wikieditor-toolbar-characters-page-cyrillic' => 'كيريلية',
'wikieditor-toolbar-characters-page-arabic' => 'عربية',
'wikieditor-toolbar-characters-page-arabicextended' => 'عربية موسعة',
- 'wikieditor-toolbar-characters-page-persian' => 'الÙارسية',
+ 'wikieditor-toolbar-characters-page-persian' => 'Ùارسية',
'wikieditor-toolbar-characters-page-hebrew' => 'عبرية',
'wikieditor-toolbar-characters-page-bangla' => 'بنغالية',
'wikieditor-toolbar-characters-page-tamil' => 'تاميلية',
@@ -1495,13 +1526,16 @@ $1:Example.jpg|تعليق2',
'wikieditor-toolbar-characters-page-thai' => 'تايلندية',
'wikieditor-toolbar-characters-page-lao' => 'لاوية',
'wikieditor-toolbar-characters-page-khmer' => 'خميرية',
+ 'wikieditor-toolbar-characters-endash' => 'واصلة قصيرة',
+ 'wikieditor-toolbar-characters-emdash' => 'واصلة طويلة',
+ 'wikieditor-toolbar-characters-minus' => 'علامة الطرح',
'wikieditor-toolbar-section-help' => 'مساعدة',
- 'wikieditor-toolbar-help-heading-description' => 'الوصÙ',
+ 'wikieditor-toolbar-help-heading-description' => 'وصÙ',
'wikieditor-toolbar-help-heading-syntax' => 'ما تكتبه',
'wikieditor-toolbar-help-heading-result' => 'ما تحصل عليه',
'wikieditor-toolbar-help-page-format' => 'تنسيق',
'wikieditor-toolbar-help-page-link' => 'وصلات',
- 'wikieditor-toolbar-help-page-heading' => 'ترويسات',
+ 'wikieditor-toolbar-help-page-heading' => 'عناوين',
'wikieditor-toolbar-help-page-list' => 'قوائم',
'wikieditor-toolbar-help-page-file' => 'ملÙات',
'wikieditor-toolbar-help-page-reference' => 'مراجع',
@@ -1521,26 +1555,26 @@ $1:Example.jpg|تعليق2',
'wikieditor-toolbar-help-content-xlink-description' => 'وصلة خارجية',
'wikieditor-toolbar-help-content-xlink-syntax' => '[http://www.example.org اسم الوصلة]<br />[http://www.example.org]<br />http://www.example.org',
'wikieditor-toolbar-help-content-xlink-result' => "<a href='#' class='external'>اسم الوصلة</a><br /><a href='#' class='external autonumber'>[1]</a><br /><a href='#' class='external'>http://www.example.org</a>",
- 'wikieditor-toolbar-help-content-heading2-description' => 'ترويسة المستوى الثاني',
- 'wikieditor-toolbar-help-content-heading2-syntax' => '== نص الترويسة ==',
- 'wikieditor-toolbar-help-content-heading2-result' => '<h2>نص الترويسة</h2>',
- 'wikieditor-toolbar-help-content-heading3-description' => 'ترويسة المستوى الثالث',
- 'wikieditor-toolbar-help-content-heading3-syntax' => '=== نص الترويسة ===',
- 'wikieditor-toolbar-help-content-heading3-result' => '<h3>نص الترويسة</h3>',
- 'wikieditor-toolbar-help-content-heading4-description' => 'توريسة المستوى الرابع',
- 'wikieditor-toolbar-help-content-heading4-syntax' => '==== نص الترويسة ====',
- 'wikieditor-toolbar-help-content-heading4-result' => '<h4>نص الترويسة</h4>',
- 'wikieditor-toolbar-help-content-heading5-description' => 'توريسة المستوى الخامس',
- 'wikieditor-toolbar-help-content-heading5-syntax' => '===== نص الترويسة =====',
- 'wikieditor-toolbar-help-content-heading5-result' => '<h5>نص الترويسة</h5>',
- 'wikieditor-toolbar-help-content-ulist-description' => 'قائمة منقّطة',
+ 'wikieditor-toolbar-help-content-heading2-description' => 'عنوان من المستوى الثاني',
+ 'wikieditor-toolbar-help-content-heading2-syntax' => '== عنوان ==',
+ 'wikieditor-toolbar-help-content-heading2-result' => '<h2>عنوان</h2>',
+ 'wikieditor-toolbar-help-content-heading3-description' => 'عنوان من المستوى الثالث',
+ 'wikieditor-toolbar-help-content-heading3-syntax' => '=== عنوان ===',
+ 'wikieditor-toolbar-help-content-heading3-result' => '<h3>عنوان</h3>',
+ 'wikieditor-toolbar-help-content-heading4-description' => 'عنوان من المستوى الرابع',
+ 'wikieditor-toolbar-help-content-heading4-syntax' => '==== عنوان ====',
+ 'wikieditor-toolbar-help-content-heading4-result' => '<h4>عنوان</h4>',
+ 'wikieditor-toolbar-help-content-heading5-description' => 'عنوان من المستوى الخامس',
+ 'wikieditor-toolbar-help-content-heading5-syntax' => '===== عنوان =====',
+ 'wikieditor-toolbar-help-content-heading5-result' => '<h5>عنوان</h5>',
+ 'wikieditor-toolbar-help-content-ulist-description' => 'قائمة منقطة',
'wikieditor-toolbar-help-content-ulist-syntax' => '* عنصر قائمة<br />* عنصر قائمة',
'wikieditor-toolbar-help-content-ulist-result' => '<ul><li>عنصر قائمة</li><li>عنصر قائمة</li></ul>',
'wikieditor-toolbar-help-content-olist-description' => 'قائمة مرقمة',
'wikieditor-toolbar-help-content-olist-syntax' => '# عنصر قائمة<br /># عنصر قائمة',
'wikieditor-toolbar-help-content-olist-result' => '<ol><li>عنصر قائمة</li><li>عنصر قائمة</li></ol>',
- 'wikieditor-toolbar-help-content-file-description' => 'مل٠مضمّن',
- 'wikieditor-toolbar-help-content-file-syntax' => '[[$1:Example.png|thumb|نص التعليق]]',
+ 'wikieditor-toolbar-help-content-file-description' => 'مل٠مضمن',
+ 'wikieditor-toolbar-help-content-file-syntax' => '[[$1:Example.png|تصغير|نص التعليق]]',
'wikieditor-toolbar-help-content-file-result' => "<div style='width:104px;' class='thumbinner'><a title='نص التعليق' class='image' href='#'><img height='50' width='100' border='0' class='thumbimage' src='$2/WikiEditor/modules/images/toolbar/example-image.png' alt=''/></a><div class='thumbcaption'><div class='magnify'><a title='تكبير' class='internal' href='#'><img height='11' width='15' alt='' src='$1/common/images/magnify-clip.png'/></a></div>نص التعليق</div></div>",
'wikieditor-toolbar-help-content-reference-description' => 'مرجع',
'wikieditor-toolbar-help-content-reference-syntax' => 'نص الصÙحة.&lt;ref name="test"&gt;[http://www.example.org نص الوصلة]ØŒ نص إضاÙÙŠ.&lt;/ref&gt;',
@@ -1549,13 +1583,13 @@ $1:Example.jpg|تعليق2',
'wikieditor-toolbar-help-content-rereference-result' => "نص الصÙحة.<sup><a href='#'>[1]</a></sup>",
'wikieditor-toolbar-help-content-showreferences-description' => 'اعرض المراجع',
'wikieditor-toolbar-help-content-showreferences-result' => "<ol class='references'><li id='cite_note-test-0'><b><a title='' href='#'>^</a></b> <a rel='nofollow' title='http://www.example.org' class='external text' href='#'>نص الرابط</a>ØŒ نص إضاÙÙŠ.</li></ol>",
- 'wikieditor-toolbar-help-content-signaturetimestamp-description' => 'التوقيع مع الطابع الزمني',
- 'wikieditor-toolbar-help-content-signaturetimestamp-result' => "<a href='#' title='{{#special:mypage}}'>اسم المستخدم</a> (<a href='#' title='{{#special:mytalk}}'>ناقش</a>) 15:54، 10 يونيو 2009 (ت‌ع‌م)",
- 'wikieditor-toolbar-help-content-signature-description' => 'التوقيع',
+ 'wikieditor-toolbar-help-content-signaturetimestamp-description' => 'توقيع مع طابع زمني',
+ 'wikieditor-toolbar-help-content-signaturetimestamp-result' => "<a href='#' title='{{#special:mypage}}'>اسم المستخدم</a> (<a href='#' title='{{#special:mytalk}}'>ناقش</a>) 15:54، 10 يونيو 2009 (ت ع م)",
+ 'wikieditor-toolbar-help-content-signature-description' => 'توقيع',
'wikieditor-toolbar-help-content-signature-result' => "<a href='#' title='{{#special:mypage}}'>اسم المستخدم</a> (<a href='#' title='{{#special:mytalk}}'>ناقش</a>)",
- 'wikieditor-toolbar-help-content-indent-description' => 'بادئة',
- 'wikieditor-toolbar-help-content-indent-syntax' => 'نص عادي<br />:نص ببادئة<br />::نص ببادئة',
- 'wikieditor-toolbar-help-content-indent-result' => 'نص عادي<dl><dd>نص ببادئة<dl><dd>نص ببادئة</dd></dl></dd></dl>',
+ 'wikieditor-toolbar-help-content-indent-description' => 'إزاحة',
+ 'wikieditor-toolbar-help-content-indent-syntax' => 'نص عادي<br />:نص مزاح<br />::نص مزاح',
+ 'wikieditor-toolbar-help-content-indent-result' => 'نص عادي<dl><dd>نص مزاح<dl><dd>نص مزاح</dd></dl></dd></dl>',
);
/** Aramaic (ÜܪܡÜÜ)
@@ -1892,7 +1926,7 @@ $1:Example.jpg|Caption2',
'wikieditor-toolbar-help-content-indent-result' => 'Normal text<dl><dd>Indented text<dl><dd>Indented text</dd></dl></dd></dl>',
);
-/** Assamese (অসমীয়া)
+/** Assamese (অসমীয়া)
* @author Bishnu Saikia
* @author Chaipau
* @author Gitartha.bordoloi
@@ -1930,7 +1964,7 @@ $messages['as'] = array(
'wikieditor-toolbar' => 'সমà§à¦ªà¦¾à¦¦à¦¨à¦¾ টà§à¦²à¦¬à¦¾à§°',
'wikieditor-toolbar-desc' => 'অধিক বà§à¦¯à§±à¦¹à¦¾à§°à¦¯à§‹à¦—à§à¦¯ সমà§à¦ªà¦¾à¦¦à¦¨à¦¾ পৃষà§à¦ à¦¾à§° টà§à¦²à¦¬à¦¾à§°',
'wikieditor-toolbar-preference' => 'শকà§à¦¤à¦¿à¦¶à¦¾à¦²à§€ সমà§à¦ªà¦¾à¦¦à¦¨à¦¾ টà§à¦²à¦¬à¦¾à§° সকà§à§°à¦¿à¦¯à¦¼ কৰক',
- 'wikieditor-toolbar-dialogs-preference' => 'লিংক, টেবল আৰৠঅধিক বসà§à¦¤à§ সংযোজনৰ বাবে ডায়লগ সকà§à§°à¦¿à¦¯à¦¼ কৰক',
+ 'wikieditor-toolbar-dialogs-preference' => 'লিংক, টেবল আৰৠঅধিক বসà§à¦¤à§ সংযোজনৰ বাবে ডায়লগ সকà§à§°à¦¿à¦¯à¦¼ কৰক', # Fuzzy
'wikieditor-toolbar-hidesig' => 'মà§à¦–à§à¦¯ নামসà§à¦¥à¦¾à¦¨à§° পৃষà§à¦ à¦¾à¦¬à§‹à§°à¦¤ সà§à¦¬à¦¾à¦•à§à¦·à§° বà§à¦Ÿà¦¾à¦® লà§à¦•à§à§±à¦¾à¦“ক',
'wikieditor-toolbar-loading' => "ল'ড হৈ আছে…",
'wikieditor-toolbar-tool-bold' => 'গাঢ়',
@@ -2178,7 +2212,7 @@ $messages['ast'] = array(
'wikieditor-toolbar' => 'Editando la barra de ferramientes',
'wikieditor-toolbar-desc' => "Barra de ferramientes de la páxina d'edición con usabilidá enantada",
'wikieditor-toolbar-preference' => "Activar a barra d'edición enantada",
- 'wikieditor-toolbar-dialogs-preference' => "Activar los diálogos p'amestar enllaces, tables y más",
+ 'wikieditor-toolbar-dialogs-preference' => "Activar los asistentes p'amestar enllaces y tables, y tamién la función de guetar y trocar",
'wikieditor-toolbar-hidesig' => 'Anubrir el botón de robla nes páxines del espaciu de nomes principal',
'wikieditor-toolbar-loading' => 'Cargando...',
'wikieditor-toolbar-tool-bold' => 'Negrina',
@@ -2206,6 +2240,7 @@ $messages['ast'] = array(
'wikieditor-toolbar-tool-link-int-target-status-invalid' => 'Títulu inválidu',
'wikieditor-toolbar-tool-link-int-target-status-external' => 'Enllaz esternu',
'wikieditor-toolbar-tool-link-int-target-status-loading' => 'Comprobando la esistencia de la páxina...',
+ 'wikieditor-toolbar-tool-link-int-target-status-disambig' => 'Páxina de dixebra',
'wikieditor-toolbar-tool-link-int-invalid' => 'El títulu que conseñasti nun ye válidu.',
'wikieditor-toolbar-tool-link-lookslikeinternal' => 'La URL que conseñasti paez que quería ser un enllaz a otra páxina de la wiki.
¿Quies convertila nún enllaz internu?',
@@ -2840,7 +2875,7 @@ $messages['ba'] = array(
'wikieditor-toolbar' => 'Мөхәррирләү ҡоралдары',
'wikieditor-toolbar-desc' => 'Яҡшыртылған мөхәррирләү ҡоралдары',
'wikieditor-toolbar-preference' => 'Яҡшыртылған мөхәррирләү ҡоралдарын ҡулланырға',
- 'wikieditor-toolbar-dialogs-preference' => 'Һылтанмалар, таблицалар һәм башҡаларҙы Ó©Ò«Ñ‚Ó™Ò¯ Ó©Ñөн диалогтар ҡулланырға',
+ 'wikieditor-toolbar-dialogs-preference' => 'Һылтанмалар, таблицалар һәм башҡаларҙы Ó©Ò«Ñ‚Ó™Ò¯ Ó©Ñөн диалогтар ҡулланырға', # Fuzzy
'wikieditor-toolbar-hidesig' => 'Имза ҡуйыу төймәһен төп иÑемдәр арауығындағы биттәрҙә йәшерергә',
'wikieditor-toolbar-loading' => 'Сығарыу...',
'wikieditor-toolbar-tool-bold' => 'Ҡалын',
@@ -3096,7 +3131,7 @@ $messages['be'] = array(
'wikieditor-toolbar' => 'ПанÑль інÑтрументаў',
'wikieditor-toolbar-desc' => 'ПанÑль інÑтрументаў з палепшанымі магчымаÑцÑмі',
'wikieditor-toolbar-preference' => 'Уключыць панÑль інÑтрументаў з палепшанымі магчымаÑцÑмі',
- 'wikieditor-toolbar-dialogs-preference' => 'Уключыць дыÑлогі Ð´Ð»Ñ ÑžÑтаўкі ÑпаÑылак, табліц Ñ– інш.',
+ 'wikieditor-toolbar-dialogs-preference' => 'Уключыць дыÑлогі Ð´Ð»Ñ ÑžÑтаўкі ÑпаÑылак, табліц Ñ– інш.', # Fuzzy
'wikieditor-toolbar-loading' => 'Загрузка…',
'wikieditor-toolbar-tool-bold' => 'Цёмны',
'wikieditor-toolbar-tool-bold-example' => 'Цёмны Ñ‚ÑкÑÑ‚',
@@ -3330,7 +3365,7 @@ $messages['be-tarask'] = array(
'wikieditor-toolbar' => 'ПанÑль інÑтрумÑнтаў Ð´Ð»Ñ Ñ€ÑдагаваньнÑ',
'wikieditor-toolbar-desc' => 'ПанÑль інÑтрумÑнтаў Ð´Ð»Ñ Ñ€ÑÐ´Ð°Ð³Ð°Ð²Ð°Ð½ÑŒÐ½Ñ Ð· палепшанай зручнаÑьцю',
'wikieditor-toolbar-preference' => 'Уключыць палепшаную панÑль інÑтрумÑнтаў Ð´Ð»Ñ Ñ€ÑдагаваньнÑ',
- 'wikieditor-toolbar-dialogs-preference' => 'Дазволіць формы Ð´Ð»Ñ ÑžÑтаўкі ÑпаÑылак, табліцаў Ñ– іншых ÑлемÑнтаў',
+ 'wikieditor-toolbar-dialogs-preference' => 'Дазволіць формы Ð´Ð»Ñ ÑžÑтаўкі ÑпаÑылак, табліцаў, а такÑама Ð´Ð»Ñ Ð¿Ð¾ÑˆÑƒÐºÑƒ Ñ– замены',
'wikieditor-toolbar-hidesig' => 'Схаваць кнопку подпіÑу Ñа Ñтаронак у аÑноўнай праÑторы назваў',
'wikieditor-toolbar-loading' => 'Загрузка…',
'wikieditor-toolbar-tool-bold' => 'ТоўÑÑ‚Ñ‹',
@@ -3358,6 +3393,7 @@ $messages['be-tarask'] = array(
'wikieditor-toolbar-tool-link-int-target-status-invalid' => 'ÐÑÑÐ»ÑƒÑˆÐ½Ð°Ñ Ð½Ð°Ð·Ð²Ð°',
'wikieditor-toolbar-tool-link-int-target-status-external' => 'Ð’Ð¾Ð½ÐºÐ°Ð²Ð°Ñ ÑпаÑылка',
'wikieditor-toolbar-tool-link-int-target-status-loading' => 'Праверка Ñ–ÑÐ½Ð°Ð²Ð°Ð½ÑŒÐ½Ñ Ñтаронкі…',
+ 'wikieditor-toolbar-tool-link-int-target-status-disambig' => 'Старонка-неадназначнаÑьць',
'wikieditor-toolbar-tool-link-int-invalid' => 'ÐŸÐ°Ð·Ð½Ð°Ñ‡Ð°Ð½Ð°Ñ Ð½ÑÑÐ»ÑƒÑˆÐ½Ð°Ñ Ð½Ð°Ð·Ð²Ð°.',
'wikieditor-toolbar-tool-link-lookslikeinternal' => 'Пададзены URL-Ð°Ð´Ñ€Ð°Ñ Ð²ÐµÑ€Ð°Ð³Ð¾Ð´Ð½Ð° зьÑўлÑецца ÑпаÑылкай на іншую вікі-Ñтаронку.
Ці жадаеце зрабіць Ñе ўнутранай ÑпаÑылкай?',
@@ -3580,7 +3616,7 @@ $messages['bg'] = array(
'wikieditor-toolbar' => 'Лента за редактиране',
'wikieditor-toolbar-desc' => 'Лента за редактиране Ñ Ð¿Ð¾Ð´Ð¾Ð±Ñ€ÐµÐ½Ð¸ възможноÑти за използваемоÑÑ‚',
'wikieditor-toolbar-preference' => 'Включване на разширената лента Ñ Ð¸Ð½Ñтрументи',
- 'wikieditor-toolbar-dialogs-preference' => 'Включване на инÑтрументи за вмъкване на препратки, таблици и други',
+ 'wikieditor-toolbar-dialogs-preference' => 'Включване на инÑтрументи за вмъкване на препратки, таблици и други', # Fuzzy
'wikieditor-toolbar-hidesig' => 'Скриване на бутона за Ð¿Ð¾Ð´Ð¿Ð¸Ñ Ð·Ð° Ñтраници от оÑновното именно проÑтранÑтво',
'wikieditor-toolbar-loading' => 'Зареждане...',
'wikieditor-toolbar-tool-bold' => 'Получер (удебелен) текÑÑ‚',
@@ -3998,6 +4034,7 @@ $1:Cuntuh.jpg|Judul2',
);
/** Bengali (বাংলা)
+ * @author Aftab1995
* @author Bellayet
* @author Leemon2010
* @author Nasir8891
@@ -4034,7 +4071,7 @@ $messages['bn'] = array(
'wikieditor-toolbar' => 'সমà§à¦ªà¦¾à¦¦à¦¨à¦¾ টà§à¦²à¦¬à¦¾à¦°',
'wikieditor-toolbar-desc' => 'বেশি বà§à¦¯à¦¬à¦¹à¦¾à¦°à¦¯à§‹à¦—à§à¦¯ সমà§à¦ªà¦¾à¦¦à¦¨à¦¾ পাতার টà§à¦²à¦¬à¦¾à¦°',
'wikieditor-toolbar-preference' => 'শকà§à¦¤à¦¿à¦¶à¦¾à¦²à§€ সমà§à¦ªà¦¾à¦¦à¦¨à¦¾ টà§à¦²à¦¬à¦¾à¦° সকà§à¦°à¦¿à¦¯à¦¼ করো',
- 'wikieditor-toolbar-dialogs-preference' => 'যোগকৃত লিংক, ছক à¦à¦¬à¦‚ আরও কিছà§à¦° জনà§à¦¯ ডায়লগ সকà§à¦°à¦¿à¦¯à¦¼ করো',
+ 'wikieditor-toolbar-dialogs-preference' => 'যোগকৃত লিংক, ছক à¦à¦¬à¦‚ আরও কিছà§à¦° জনà§à¦¯ ডায়লগ সকà§à¦°à¦¿à¦¯à¦¼ করো', # Fuzzy
'wikieditor-toolbar-hidesig' => 'পà§à¦°à¦§à¦¾à¦¨ নামসà§à¦¥à¦¾à¦¨à§‡à¦° পাতায় সà§à¦¬à¦¾à¦•à§à¦·à¦° বোতাম লà§à¦•à¦¾à¦“',
'wikieditor-toolbar-loading' => 'লোডিং...',
'wikieditor-toolbar-tool-bold' => 'গাঢ়',
@@ -4115,8 +4152,8 @@ $messages['bn'] = array(
'wikieditor-toolbar-tool-subscript-example' => 'সাবসà§à¦•à§à¦°à¦¿à¦ªà§à¦Ÿ লেখা',
'wikieditor-toolbar-group-insert' => 'যোগ করো',
'wikieditor-toolbar-tool-gallery' => 'ছবির গà§à¦¯à¦¾à¦²à¦¾à¦°à§€',
- 'wikieditor-toolbar-tool-gallery-example' => '$1:Example.jpg|কà§à¦¯à¦¾à¦ªà¦¶à¦¨à§§
-$1:Example.jpg|কà§à¦¯à¦¾à¦ªà¦¶à¦¨à§¨',
+ 'wikieditor-toolbar-tool-gallery-example' => '$1:উদাহরণ.jpg|কà§à¦¯à¦¾à¦ªà¦¶à¦¨à§§
+$1:উদাহরণ.jpg|কà§à¦¯à¦¾à¦ªà¦¶à¦¨à§¨',
'wikieditor-toolbar-tool-newline' => 'নতà§à¦¨ লাইন',
'wikieditor-toolbar-tool-table' => 'ছক',
'wikieditor-toolbar-tool-table-example-old' => '-
@@ -4284,7 +4321,7 @@ $messages['bpy'] = array(
'wikieditor-toolbar' => 'পতানির টà§à¦²à¦¬à¦¾à¦°',
'wikieditor-toolbar-desc' => 'বপ বà§à¦¯à¦¬à¦¹à¦¾à¦°à¦…র পতানির পাতা অতার টà§à¦²à¦¬à¦¾à¦°',
'wikieditor-toolbar-preference' => 'লিঙপা পতার টà§à¦²à¦¬à¦¾à¦° ফঙে থ',
- 'wikieditor-toolbar-dialogs-preference' => 'তিলকরিসি লিংক, ছক বারো আরতার ডায়ালগ ফঙে থ',
+ 'wikieditor-toolbar-dialogs-preference' => 'তিলকরিসি লিংক, ছক বারো আরতার ডায়ালগ ফঙে থ', # Fuzzy
'wikieditor-toolbar-loading' => 'লোডিং…',
'wikieditor-toolbar-tool-bold' => 'গাঢ়পা',
'wikieditor-toolbar-tool-bold-example' => 'গাঢ়পা ইকা',
@@ -4516,7 +4553,7 @@ $messages['br'] = array(
'wikieditor-toolbar' => 'Barrenn ostilhoù kemmañ',
'wikieditor-toolbar-desc' => "Barrenn ostilhoù kemmañ aesoc'h da implijout",
'wikieditor-toolbar-preference' => 'Gweredekaat ar varrenn ostilhoù kemmañ gwellaet',
- 'wikieditor-toolbar-dialogs-preference' => 'Gweredekaat ar boestoù divizout evit ouzhpennañ liammoù, taolennoù ha traoù all',
+ 'wikieditor-toolbar-dialogs-preference' => 'Gweredekaat ar boestoù divizout evit ouzhpennañ liammoù, taolennoù ha traoù all', # Fuzzy
'wikieditor-toolbar-hidesig' => 'Kuzhat ar bouton sinañ er pajennoù zo en esaouenn anv pennañ',
'wikieditor-toolbar-loading' => 'O kargañ...',
'wikieditor-toolbar-tool-bold' => 'Tev',
@@ -4761,7 +4798,7 @@ $messages['bs'] = array(
'wikieditor-toolbar' => 'Uređivanje alatne trake',
'wikieditor-toolbar-desc' => 'Alatna traka stranice za uređivanje sa poboljšanom upotrebljivošću',
'wikieditor-toolbar-preference' => 'Omogući naprednu traku za uređivanje',
- 'wikieditor-toolbar-dialogs-preference' => 'Omogući dijaloge za dodavanje linkova, tabela i više',
+ 'wikieditor-toolbar-dialogs-preference' => 'Omogući Äarobnjake za ubacivanje linkova, tabela kao i funkciju pretrage i zamjene',
'wikieditor-toolbar-hidesig' => 'Sakrij dugme potpisa sa stranica u glavnom imenskom prostoru',
'wikieditor-toolbar-loading' => 'Punjenje...',
'wikieditor-toolbar-tool-bold' => 'Podebljano',
@@ -4999,7 +5036,7 @@ $messages['ca'] = array(
'wikieditor-toolbar' => "Editant la barra d'eines",
'wikieditor-toolbar-desc' => "Barra d'eines d'edició amb usabilitat millorada",
'wikieditor-toolbar-preference' => "Habilita la barra d'eines millorada",
- 'wikieditor-toolbar-dialogs-preference' => 'Habilita caixes de diàleg per inserir enllaços, taules i altres',
+ 'wikieditor-toolbar-dialogs-preference' => 'Habilita caixes de diàleg per inserir enllaços, taules i altres', # Fuzzy
'wikieditor-toolbar-hidesig' => "Amaga el botó de signar de les pàgines de l'espai de noms principal",
'wikieditor-toolbar-loading' => 'Carregant...',
'wikieditor-toolbar-tool-bold' => 'Negreta',
@@ -5223,7 +5260,7 @@ $messages['ce'] = array(
'wikieditor-loading' => 'Чуйолуш',
'wikieditor-preview-preference' => 'Латайé хьалха муха ю хьажар дуьхь дуьхьал',
'wikieditor-preview-tab' => 'Хьалха муха ю хьажа',
- 'wikieditor-preview-changes-tab' => 'Хийцамаш',
+ 'wikieditor-preview-changes-tab' => 'Хийцам',
'wikieditor-preview-loading' => 'Чуйолуш…',
'wikieditor-previewDialog-preference' => 'Латайé йоза хьалха муха ду хьажар',
'wikieditor-previewDialog-tab' => 'Хьалха муха ю хьажа',
@@ -5236,7 +5273,7 @@ $messages['ce'] = array(
'wikieditor-publish-dialog-minor' => 'Жим хийцам',
'wikieditor-publish-dialog-watch' => 'Тергам бé хlокху агlон',
'wikieditor-publish-dialog-publish' => 'Ðахангайта',
- 'wikieditor-publish-dialog-goback' => 'Юхьа',
+ 'wikieditor-publish-dialog-goback' => 'Юха',
'wikieditor-template-editor-preference' => 'Латайé куцкепа рéдаккхар бáраман гlонца',
'wikieditor-template-editor-dialog-title' => 'Кеп хийцам',
'wikieditor-template-editor-dialog-submit' => 'КарлаÑккха',
@@ -5248,48 +5285,56 @@ $messages['ce'] = array(
'wikieditor-toolbar' => 'Рéдоккху меттиг',
'wikieditor-toolbar-desc' => 'Рéдоккху меттиг гlоле лелорца',
'wikieditor-toolbar-preference' => 'Латайé гlоле йолу тадар',
- 'wikieditor-toolbar-dialogs-preference' => 'Латайé йозан хьажориг йуьллург, таблийцан аъ кхин хlумнашна',
+ 'wikieditor-toolbar-dialogs-preference' => 'Латайé йозан хьажораг йуьллург, таблицан а кхин хӀумнашна а',
'wikieditor-toolbar-loading' => 'Чуйолуш…',
'wikieditor-toolbar-tool-bold' => 'ДерÑтино',
'wikieditor-toolbar-tool-bold-example' => 'ДерÑтино до йоза',
- 'wikieditor-toolbar-tool-italic' => 'КурÑетта',
- 'wikieditor-toolbar-tool-italic-example' => 'КурÑеттан до йоза',
- 'wikieditor-toolbar-tool-ilink' => 'Чоьхьа хьажориг',
+ 'wikieditor-toolbar-tool-italic' => 'Сетта',
+ 'wikieditor-toolbar-tool-italic-example' => 'Сеттан до йоза',
+ 'wikieditor-toolbar-tool-ilink' => 'Чоьхьа хьажораг',
'wikieditor-toolbar-tool-ilink-example' => 'Хьажориган коьрта могlа',
- 'wikieditor-toolbar-tool-xlink' => 'Ðрахьа хьажориг (йиц ма йе Ñ…lотталушерг http://)',
- 'wikieditor-toolbar-tool-xlink-example' => 'http://www.example.com хьажориг корта',
- 'wikieditor-toolbar-tool-link' => 'Хьажориг',
- 'wikieditor-toolbar-tool-link-title' => 'Чуйилла хьажориг',
+ 'wikieditor-toolbar-tool-xlink' => 'Ðрахьара хьажораг (йиц ма йе хӀотталушерг http://)',
+ 'wikieditor-toolbar-tool-xlink-example' => 'http://www.example.com хьажораг корта',
+ 'wikieditor-toolbar-tool-link' => 'Хьажораг',
+ 'wikieditor-toolbar-tool-link-title' => 'Чуйилла хьажораг',
'wikieditor-toolbar-tool-link-int' => 'Оцу вики агlон',
'wikieditor-toolbar-tool-link-int-target' => 'Хьажийна агlо йа URL:',
'wikieditor-toolbar-tool-link-int-target-tooltip' => 'Ðгlон цlе йа URL',
'wikieditor-toolbar-tool-link-int-text' => 'Гойтуш долу йоза:',
'wikieditor-toolbar-tool-link-int-text-tooltip' => 'Чудилла Ñхьагайта дезаш долу йоза',
'wikieditor-toolbar-tool-link-ext' => 'Хьалхара агlон чохь',
- 'wikieditor-toolbar-tool-link-ext-target' => 'URL хьажоригаш:',
+ 'wikieditor-toolbar-tool-link-ext-target' => 'URL хьажорагаш:',
'wikieditor-toolbar-tool-link-ext-text' => 'Хьажориган йоза:',
- 'wikieditor-toolbar-tool-link-insert' => 'Чуйилла хьажориг',
+ 'wikieditor-toolbar-tool-link-insert' => 'Чуйилла хьажораг',
'wikieditor-toolbar-tool-link-cancel' => 'Цаоьшу',
'wikieditor-toolbar-tool-link-int-target-status-exists' => 'Ишта агlо йолш ю',
'wikieditor-toolbar-tool-link-int-target-status-notexists' => 'Ишта агlо Ñц',
'wikieditor-toolbar-tool-link-int-target-status-invalid' => 'Ца магайо цlе',
- 'wikieditor-toolbar-tool-link-int-target-status-external' => 'Ðрахьа хьажориг',
+ 'wikieditor-toolbar-tool-link-int-target-status-external' => 'Ðрахьара хьажораг',
'wikieditor-toolbar-tool-link-int-target-status-loading' => 'Ðгlо ÑŽ Ñц хьоьжуш…',
'wikieditor-toolbar-tool-link-int-invalid' => 'Гойтуш йолу цlе ца магайо.',
- 'wikieditor-toolbar-tool-link-lookslikeinternal' => 'Ðхьа хоттийна URL кхечу вики-агlонан хьажоригах тера ÑŽ. Хьо лууш ву и хьажориг чоьхьарчех йа?',
- 'wikieditor-toolbar-tool-link-lookslikeinternal-int' => 'Чоьхьа хьажориг',
- 'wikieditor-toolbar-tool-link-lookslikeinternal-ext' => 'Ðрахьа хьажориг',
- 'wikieditor-toolbar-tool-link-empty' => 'Ðхьа ца гайтин мичхьа хьажойеза хьажориг.',
+ 'wikieditor-toolbar-tool-link-lookslikeinternal' => 'Ðхьа хоттийна URL кхечу вики-агӀонан хьажорагах тера ÑŽ. Лаьий хьуна и хьажораг чоьхьарчех Ñ?',
+ 'wikieditor-toolbar-tool-link-lookslikeinternal-int' => 'Чоьхьа хьажораг',
+ 'wikieditor-toolbar-tool-link-lookslikeinternal-ext' => 'Ðрахьара хьажораг',
+ 'wikieditor-toolbar-tool-link-empty' => 'Ðхьа ца гайтин мичхьа хьажойеза хьажораг.',
'wikieditor-toolbar-tool-file' => 'Чохь йолу файл',
'wikieditor-toolbar-tool-file-example' => 'Example.jpg',
- 'wikieditor-toolbar-tool-reference' => 'Такхо',
- 'wikieditor-toolbar-tool-reference-example' => 'Чудилла кхузе такхо деза йоза',
+ 'wikieditor-toolbar-tool-file-title' => 'Файл чуйиллар',
+ 'wikieditor-toolbar-file-target' => 'Файлан цӀе:',
+ 'wikieditor-toolbar-file-caption' => 'КуьгтаӀор:',
+ 'wikieditor-toolbar-file-size' => 'Барам:',
+ 'wikieditor-toolbar-file-float' => 'ÐиÑдар:',
+ 'wikieditor-toolbar-file-default' => '(Iад йитарца)',
+ 'wikieditor-toolbar-tool-file-insert' => 'Чудилла',
+ 'wikieditor-toolbar-tool-file-cancel' => 'Цаоьшу',
+ 'wikieditor-toolbar-tool-reference' => 'ТIетовжар',
+ 'wikieditor-toolbar-tool-reference-example' => 'Чудилла кхузе тIетовжа деза йоза',
'wikieditor-toolbar-tool-reference-cancel' => 'Цаоьшу',
- 'wikieditor-toolbar-tool-reference-title' => 'Чудилла такхо',
+ 'wikieditor-toolbar-tool-reference-title' => 'Чудилла тIетовжар',
'wikieditor-toolbar-tool-reference-insert' => 'Чудилла',
- 'wikieditor-toolbar-tool-reference-text' => 'Такхо деза йоза',
+ 'wikieditor-toolbar-tool-reference-text' => 'ТIетовжаран йоза',
'wikieditor-toolbar-tool-signature' => 'Куьгтаlор хан хlоттош',
- 'wikieditor-toolbar-section-advanced' => 'Кхин тlе дукха',
+ 'wikieditor-toolbar-section-advanced' => 'Кхин тӀе',
'wikieditor-toolbar-tool-heading' => 'Корта',
'wikieditor-toolbar-tool-heading-1' => 'Локхалла 1',
'wikieditor-toolbar-tool-heading-2' => 'Локхалла 2',
@@ -5321,7 +5366,7 @@ $messages['ce'] = array(
'wikieditor-toolbar-tool-gallery-example' => '$1:Example.jpg|Цуьнах лаце1
$1:Example.jpg|Цуьнах лаце2',
'wikieditor-toolbar-tool-newline' => 'Керла могlа',
- 'wikieditor-toolbar-tool-table' => 'Таблийца',
+ 'wikieditor-toolbar-tool-table' => 'Таблица',
'wikieditor-toolbar-tool-table-example-old' => '-
! коьрта могlа 1
! коьрта могlа 2
@@ -5336,73 +5381,76 @@ $1:Example.jpg|Цуьнах лаце2',
| могlа 2, чоь 3',
'wikieditor-toolbar-tool-table-example-cell-text' => 'Чоьнан йоза',
'wikieditor-toolbar-tool-table-example-header' => 'Коьрта йоза',
- 'wikieditor-toolbar-tool-table-title' => 'Чуйилла таблийца',
+ 'wikieditor-toolbar-tool-table-title' => 'Чуйилла таблица',
'wikieditor-toolbar-tool-table-dimensions-rows' => 'МогӀанаш',
'wikieditor-toolbar-tool-table-dimensions-columns' => 'Бlогlамаш',
'wikieditor-toolbar-tool-table-dimensions-header' => 'Тlетоха коьрта могlан могlа',
'wikieditor-toolbar-tool-table-wikitable' => 'Кечйеш дозанашца',
- 'wikieditor-toolbar-tool-table-sortable' => 'ЛиÑталуш йе таблийца',
+ 'wikieditor-toolbar-tool-table-sortable' => 'ЛиÑталуш йе таблица',
'wikieditor-toolbar-tool-table-example' => 'Чоьнан йоза',
'wikieditor-toolbar-tool-table-preview' => 'Хьалха муха ю хьажа',
'wikieditor-toolbar-tool-table-insert' => 'Чуйилла',
'wikieditor-toolbar-tool-table-cancel' => 'Цаоьшу',
'wikieditor-toolbar-tool-table-toomany' => 'Оцул чоьнаш йа аьтту ца болу, таблийцан чоьнашна бáрам $1 хоттало.', # Fuzzy
'wikieditor-toolbar-tool-table-invalidnumber' => 'Ðхьа нийÑа ца хоттийн цхьатерра могlанаш ле бlогlамаш.',
- 'wikieditor-toolbar-tool-table-zero' => 'Хьога йиллалур Ñц таблийца йоцургца могlанаш ле бlогlамаш долуш.',
- 'wikieditor-toolbar-tool-replace' => 'Лаха хийца аъ хуьйцуш',
- 'wikieditor-toolbar-tool-replace-title' => 'Лаха хийца аъ хуьйцуш',
+ 'wikieditor-toolbar-tool-table-zero' => 'Хьога йиллалур Ñц таблица йоцургца могӀанаш ле бӀогӀамаш долуш.',
+ 'wikieditor-toolbar-tool-replace' => 'Лаха хийца а хуьйцуш',
+ 'wikieditor-toolbar-tool-replace-title' => 'Лаха хийца а хуьйцуш',
'wikieditor-toolbar-tool-replace-search' => 'Лаха:',
'wikieditor-toolbar-tool-replace-replace' => 'Хийца оцуьнца:',
'wikieditor-toolbar-tool-replace-case' => 'Яздар тидаме оьцуш',
'wikieditor-toolbar-tool-replace-regex' => 'Хилийта могlа юх-юха лохуш долу дош',
- 'wikieditor-toolbar-tool-replace-button-findnext' => 'Караде тlаьхьадогlург',
- 'wikieditor-toolbar-tool-replace-button-replaceall' => 'Деригге хийца',
- 'wikieditor-toolbar-tool-replace-close' => 'Дlачlагlа',
+ 'wikieditor-toolbar-tool-replace-button-findnext' => 'Караде тӀаьхьа-догӀург',
+ 'wikieditor-toolbar-tool-replace-button-replace' => 'Хийца',
+ 'wikieditor-toolbar-tool-replace-button-replaceall' => 'Дерриге хийца',
+ 'wikieditor-toolbar-tool-replace-close' => 'ДӀачӀагӀа',
'wikieditor-toolbar-tool-replace-nomatch' => 'Хьан дехарца хlумма ца карийна.',
'wikieditor-toolbar-tool-replace-success' => 'Балийна хийцам: $1.', # Fuzzy
'wikieditor-toolbar-tool-replace-emptysearch' => 'Ðхьа ца гайтна Ñ…lу лаха деза.',
'wikieditor-toolbar-tool-replace-invalidregex' => 'Ðхьа Ñзйина цlе ÑŽÑ…-юха нийÑа Ñц: $1',
- 'wikieditor-toolbar-section-characters' => 'Саболу куьцаш',
- 'wikieditor-toolbar-characters-page-latin' => 'Латинхойн',
- 'wikieditor-toolbar-characters-page-latinextended' => 'Латинхойн аллÑам',
+ 'wikieditor-toolbar-section-characters' => 'Леррина Ñимволаш',
+ 'wikieditor-toolbar-characters-page-latin' => 'Латинан',
+ 'wikieditor-toolbar-characters-page-latinextended' => 'Латинан алÑам',
'wikieditor-toolbar-characters-page-ipa' => 'ДÐЭ (IPA)',
- 'wikieditor-toolbar-characters-page-symbols' => 'Саболурш',
+ 'wikieditor-toolbar-characters-page-symbols' => 'Символаш',
'wikieditor-toolbar-characters-page-greek' => 'Гlайрхойн',
'wikieditor-toolbar-characters-page-cyrillic' => 'Кирилан',
- 'wikieditor-toolbar-characters-page-arabic' => 'Iарбойн',
+ 'wikieditor-toolbar-characters-page-arabic' => 'Ӏарбийн',
+ 'wikieditor-toolbar-characters-page-arabicextended' => 'Iаьрбийн шординарш',
'wikieditor-toolbar-characters-page-persian' => 'ПхьарÑхойн',
'wikieditor-toolbar-characters-page-hebrew' => 'Жуьгтийн',
'wikieditor-toolbar-characters-page-bangla' => 'Бангалойн',
+ 'wikieditor-toolbar-characters-page-tamil' => 'Тамилхойн',
'wikieditor-toolbar-characters-page-telugu' => 'Телугойн',
'wikieditor-toolbar-characters-page-sinhala' => 'Синхалойн',
'wikieditor-toolbar-characters-page-gujarati' => 'Гужаратойн',
'wikieditor-toolbar-characters-page-thai' => 'Тайхойн',
'wikieditor-toolbar-characters-page-lao' => 'Лаохойн',
'wikieditor-toolbar-characters-page-khmer' => 'Кхимерхойн',
- 'wikieditor-toolbar-section-help' => 'ÐиÑвохаам',
+ 'wikieditor-toolbar-section-help' => 'ГӀо',
'wikieditor-toolbar-help-heading-description' => 'Цуьнах лаьцна',
'wikieditor-toolbar-help-heading-syntax' => 'Хlу йуьллу ахьа',
'wikieditor-toolbar-help-heading-result' => 'Хlу хуьлу хьуна',
'wikieditor-toolbar-help-page-format' => 'Бáрамхlоттор',
- 'wikieditor-toolbar-help-page-link' => 'Хьажоригаш',
+ 'wikieditor-toolbar-help-page-link' => 'Хьажорагаш',
'wikieditor-toolbar-help-page-heading' => 'Коьрта могlнаш',
'wikieditor-toolbar-help-page-list' => 'Могlамаш',
'wikieditor-toolbar-help-page-file' => 'Файлаш',
'wikieditor-toolbar-help-page-reference' => 'Билгалдаккхар',
'wikieditor-toolbar-help-page-discussion' => 'Дийцаре',
- 'wikieditor-toolbar-help-content-italic-description' => 'КурÑетта',
- 'wikieditor-toolbar-help-content-italic-syntax' => "''КурÑеттан до йоза''",
- 'wikieditor-toolbar-help-content-italic-result' => '<em>КурÑеттан до йоза</em>',
+ 'wikieditor-toolbar-help-content-italic-description' => 'Сетта',
+ 'wikieditor-toolbar-help-content-italic-syntax' => "''Сеттан до йоза''",
+ 'wikieditor-toolbar-help-content-italic-result' => '<em>Сеттан до йоза</em>',
'wikieditor-toolbar-help-content-bold-description' => 'ДерÑтино',
'wikieditor-toolbar-help-content-bold-syntax' => "'''ДерÑтино до йоза'''",
'wikieditor-toolbar-help-content-bold-result' => '<strong>ДерÑтино до йоза</strong>',
'wikieditor-toolbar-help-content-bolditalic-description' => 'ДерÑтино курÑеттан',
'wikieditor-toolbar-help-content-bolditalic-syntax' => "'''''ДерÑтино курÑеттан'''''",
'wikieditor-toolbar-help-content-bolditalic-result' => '<em><strong>ДерÑтино курÑеттан</strong></em>',
- 'wikieditor-toolbar-help-content-ilink-description' => 'Чоьхьа хьажориг',
+ 'wikieditor-toolbar-help-content-ilink-description' => 'Чоьхьа хьажораг',
'wikieditor-toolbar-help-content-ilink-syntax' => '[[Ðгlонан коьрта могlа|Хьажориган йоза]]<br />[[Ðгlонан коьрта могlа]]',
'wikieditor-toolbar-help-content-ilink-result' => "<a href='#'>Хьажориган йоза</a><br /><a href='#'>Ðгlонан коьрта могlа</a>",
- 'wikieditor-toolbar-help-content-xlink-description' => 'Ðрахьа хьажориг',
+ 'wikieditor-toolbar-help-content-xlink-description' => 'Ðрахьара хьажораг',
'wikieditor-toolbar-help-content-xlink-syntax' => '[http://www.example.org Хьажориган йоза]<br />[http://www.example.org]<br />http://www.example.org',
'wikieditor-toolbar-help-content-xlink-result' => "<a href='#' class='external'>Хьажориган йоза</a><br /><a href='#' class='external autonumber'>[1]</a><br /><a href='#' class='external'>http://www.example.org</a>",
'wikieditor-toolbar-help-content-heading2-description' => 'Коьрта могlа 2-гlа локхалла',
@@ -5431,14 +5479,14 @@ $1:Example.jpg|Цуьнах лаце2',
'wikieditor-toolbar-help-content-reference-description' => 'Билгалдаккхар',
'wikieditor-toolbar-help-content-reference-syntax' => 'Ðгlонан йоза.&lt;ref name="test"&gt;[http://www.example.org Хьажориган йоза], кхин Ñ‚lе дузуш йоза.&lt;/ref&gt;',
'wikieditor-toolbar-help-content-reference-result' => "Ðгlонан йоза.<sup><a href='#'>[1]</a></sup>",
- 'wikieditor-toolbar-help-content-rereference-description' => 'Кхин тlе лело изза хьажориг',
+ 'wikieditor-toolbar-help-content-rereference-description' => 'Кхин тӀе лело изза хьажораг',
'wikieditor-toolbar-help-content-rereference-result' => "Ðгlонан йоза<sup><a href='#'>[1]</a></sup>.",
'wikieditor-toolbar-help-content-showreferences-description' => 'Гайта билгалдаккхар',
'wikieditor-toolbar-help-content-showreferences-result' => "<ol class='references'><li id='cite_note-test-0'><b><a title='' href='#'>^</a></b> <a rel='nofollow' title='http://www.example.org' class='external text' href='#'>Хьажориган йоза</a>, кхин тlе дузуш йоза.</li></ol>",
'wikieditor-toolbar-help-content-signaturetimestamp-description' => 'Куьгтаlор хан хlоттош',
- 'wikieditor-toolbar-help-content-signaturetimestamp-result' => "<a href='#' title='{{#special:mypage}}'>Декъашхон цlе</a> (<a href='#' title='{{#special:mytalk}}'>дийцаре</a>) 15:54, 10 Мангал бутт 2009 (UTC)",
+ 'wikieditor-toolbar-help-content-signaturetimestamp-result' => "<a href='#' title='{{#special:mypage}}'>Декъашхочун цӀе</a> (<a href='#' title='{{#special:mytalk}}'>дийцаре</a>) 15:54, 10 июнь 2009 (UTC)",
'wikieditor-toolbar-help-content-signature-description' => 'Куьгтаlор',
- 'wikieditor-toolbar-help-content-signature-result' => "<a href='#' title='{{#special:mypage}}'>Декъашхон цlе</a> (<a href='#' title='{{#special:mytalk}}'>дийцаре</a>)",
+ 'wikieditor-toolbar-help-content-signature-result' => "<a href='#' title='{{#special:mypage}}'>Декъашхочун цӀе</a> (<a href='#' title='{{#special:mytalk}}'>дийцаре</a>)",
'wikieditor-toolbar-help-content-indent-description' => 'Дlахило',
'wikieditor-toolbar-help-content-indent-syntax' => 'Гуттарлера йоза<br />:Дlахилийна йоза<br />::Дlахилийна йоза',
'wikieditor-toolbar-help-content-indent-result' => 'Гуттарлера йоза<dl><dd>Дlахилийна йоза<dl><dd>Дlахилийна йоза</dd></dl></dd></dl>',
@@ -5448,6 +5496,7 @@ $1:Example.jpg|Цуьнах лаце2',
* @author Asoxor
* @author BMRG14
* @author Calak
+ * @author Ebraminio
* @author Marmzok
* @author McDutchie
* @author Muhammed taha
@@ -5482,8 +5531,8 @@ $messages['ckb'] = array(
'wikieditor-toc-hide' => 'شاردنەوەی ناوەڕۆک',
'wikieditor-toolbar' => 'شریتامرازی دەستکاریکردن',
'wikieditor-toolbar-desc' => 'شریتامرازی پەڕەی دەستکاریکردن بە کارەمەیی پەرەپێدراو',
- 'wikieditor-toolbar-preference' => 'ڕێگە بدە بە شریتامرازی پەرەسندووی دەستکاری کردن',
- 'wikieditor-toolbar-dialogs-preference' => 'ڕێگە بدە بە پەنجەرە وتووێژییەکان بۆ تێخستنی بەستەرەکان، خشتەکان و ھتد.',
+ 'wikieditor-toolbar-preference' => 'ڕێگە بدە بە شریتامرازی پەرەسندووی دەستکاریکردن',
+ 'wikieditor-toolbar-dialogs-preference' => 'ڕێگە بدە بە پەنجەرە وتووێژییەکان بۆ تێخستنی بەستەرەکان، خشتەکان و ھتد.', # Fuzzy
'wikieditor-toolbar-loading' => 'خەریکی بارکردن...',
'wikieditor-toolbar-tool-bold' => 'تۆخ',
'wikieditor-toolbar-tool-bold-example' => 'دەقی تۆخ',
@@ -5587,7 +5636,7 @@ $1:نموونە.jpg|شرۆڤەی ٢',
'wikieditor-toolbar-tool-table-preview' => 'پێشبینین',
'wikieditor-toolbar-tool-table-insert' => 'تێخستن',
'wikieditor-toolbar-tool-table-cancel' => 'ھەڵوەشاندنەوە',
- 'wikieditor-toolbar-tool-table-toomany' => 'تێخستنی خشتەیەک بە زۆرتر لە $1 خانەوە بەم ئامرازەوە ناکرێ.', # Fuzzy
+ 'wikieditor-toolbar-tool-table-toomany' => 'تێخستنی خشتەیەک بە زۆرتر لە ١٠٠٠ خانەوە بەم ئامرازەوە ناکرێ.',
'wikieditor-toolbar-tool-table-invalidnumber' => 'ژمارەیەکی دروستت بۆ ڕیزەکان یان ستوونەکان نەداوە.',
'wikieditor-toolbar-tool-table-zero' => 'ناتوانی خشتەیەک بێ ھیچ ڕیز یان ستوونێک تێبخەی',
'wikieditor-toolbar-tool-replace' => 'دۆزینەوە و لەجێدانان',
@@ -5612,7 +5661,7 @@ $1:نموونە.jpg|شرۆڤەی ٢',
'wikieditor-toolbar-characters-page-cyrillic' => 'کیریلی',
'wikieditor-toolbar-characters-page-arabic' => 'عەرەبی',
'wikieditor-toolbar-characters-page-arabicextended' => 'عەرەبیی پەرەپێدراو',
- 'wikieditor-toolbar-characters-page-persian' => 'پارسی',
+ 'wikieditor-toolbar-characters-page-persian' => 'Ùارسی',
'wikieditor-toolbar-characters-page-hebrew' => 'عیبری',
'wikieditor-toolbar-characters-page-bangla' => 'بەنگالی',
'wikieditor-toolbar-characters-page-telugu' => 'تێلوگو',
@@ -5696,6 +5745,7 @@ $messages['co'] = array(
/** Czech (Äesky)
* @author Jkjk
* @author Kuvaly
+ * @author Littledogboy
* @author Mormegil
*/
$messages['cs'] = array(
@@ -5730,7 +5780,7 @@ $messages['cs'] = array(
'wikieditor-toolbar' => 'EditaÄní panel nástrojů',
'wikieditor-toolbar-desc' => 'EditaÄní panel nástrojů s vylepÅ¡enou použitelností',
'wikieditor-toolbar-preference' => 'Zapnout vylepšený panel nástrojů',
- 'wikieditor-toolbar-dialogs-preference' => 'Používat dialogy pro vkládání odkazů, tabulek atd.',
+ 'wikieditor-toolbar-dialogs-preference' => 'Používat dialogy pro vkládání odkazů, tabulek atd.', # Fuzzy
'wikieditor-toolbar-hidesig' => 'Skrýt tlaÄítko podpisu na stránkách v hlavním jmenném prostoru',
'wikieditor-toolbar-loading' => 'NaÄítá se…',
'wikieditor-toolbar-tool-bold' => 'TuÄnÄ›',
@@ -5758,13 +5808,14 @@ $messages['cs'] = array(
'wikieditor-toolbar-tool-link-int-target-status-invalid' => 'Neplatný název',
'wikieditor-toolbar-tool-link-int-target-status-external' => 'Externí odkaz',
'wikieditor-toolbar-tool-link-int-target-status-loading' => 'Zjišťování existence stránky…',
+ 'wikieditor-toolbar-tool-link-int-target-status-disambig' => 'Rozcestník',
'wikieditor-toolbar-tool-link-int-invalid' => 'Zadaný název je neplatný.',
'wikieditor-toolbar-tool-link-lookslikeinternal' => 'Uvedené URL vypadá jako odkaz na jinou stránku této wiki.
Chcete z něj tedy udělat vnitřní odkaz?',
'wikieditor-toolbar-tool-link-lookslikeinternal-int' => 'Vnitřní odkaz',
'wikieditor-toolbar-tool-link-lookslikeinternal-ext' => 'Externí odkaz',
'wikieditor-toolbar-tool-link-empty' => 'Musíte uvést cíl odkazu.',
- 'wikieditor-toolbar-tool-file' => 'Vložený soubor',
+ 'wikieditor-toolbar-tool-file' => 'Soubor',
'wikieditor-toolbar-tool-file-example' => 'Příklad.jpg',
'wikieditor-toolbar-tool-file-title' => 'Vložit soubor',
'wikieditor-toolbar-file-target' => 'Název souboru:',
@@ -5776,7 +5827,7 @@ Chcete z něj tedy udělat vnitřní odkaz?',
'wikieditor-toolbar-file-format-none' => 'žádný',
'wikieditor-toolbar-tool-file-insert' => 'Vložit',
'wikieditor-toolbar-tool-file-cancel' => 'Storno',
- 'wikieditor-toolbar-tool-reference' => 'Poznámky',
+ 'wikieditor-toolbar-tool-reference' => 'Reference',
'wikieditor-toolbar-tool-reference-example' => 'Sem uveÄte text poznámky',
'wikieditor-toolbar-tool-reference-cancel' => 'Storno',
'wikieditor-toolbar-tool-reference-title' => 'Vložit referenci',
@@ -5889,7 +5940,7 @@ $1:Příklad.jpg|Titulek 2',
'wikieditor-toolbar-help-page-heading' => 'Nadpisy',
'wikieditor-toolbar-help-page-list' => 'Seznamy',
'wikieditor-toolbar-help-page-file' => 'Soubory',
- 'wikieditor-toolbar-help-page-reference' => 'Poznámky',
+ 'wikieditor-toolbar-help-page-reference' => 'Reference',
'wikieditor-toolbar-help-page-discussion' => 'Diskuse',
'wikieditor-toolbar-help-content-italic-description' => 'Kurzíva',
'wikieditor-toolbar-help-content-italic-syntax' => "''Text kurzívou''",
@@ -5927,12 +5978,12 @@ $1:Příklad.jpg|Titulek 2',
'wikieditor-toolbar-help-content-file-description' => 'Vložení souboru',
'wikieditor-toolbar-help-content-file-syntax' => '[[$1:Příklad.png|thumb|Text titulku]]',
'wikieditor-toolbar-help-content-file-result' => "<div style='width:104px;' class='thumbinner'><a title='Text titulku' class='image' href='#'><img height='50' width='100' border='0' class='thumbimage' src='$2/WikiEditor/modules/images/toolbar/example-image.png' alt=''/></a><div class='thumbcaption'><div class='magnify'><a title='Zvětšit' class='internal' href='#'><img height='11' width='15' alt='' src='$1/common/images/magnify-clip.png'/></a></div>Text titulku</div></div>",
- 'wikieditor-toolbar-help-content-reference-description' => 'Poznámka',
+ 'wikieditor-toolbar-help-content-reference-description' => 'Reference',
'wikieditor-toolbar-help-content-reference-syntax' => 'Text stránky.&lt;ref name="test"&gt;[http://www.example.org Text odkazu], další text.&lt;/ref&gt;',
'wikieditor-toolbar-help-content-reference-result' => "Text stránky.<sup><a href='#'>[1]</a></sup>",
- 'wikieditor-toolbar-help-content-rereference-description' => 'Další odkaz na stejnou poznámku',
+ 'wikieditor-toolbar-help-content-rereference-description' => 'Další odkaz na stejnou referenci',
'wikieditor-toolbar-help-content-rereference-result' => "Text stránky.<sup><a href='#'>[1]</a></sup>",
- 'wikieditor-toolbar-help-content-showreferences-description' => 'Zobrazení poznámek',
+ 'wikieditor-toolbar-help-content-showreferences-description' => 'Zobrazení referencí',
'wikieditor-toolbar-help-content-showreferences-result' => "<ol class='references'><li id='cite_note-test-0'><b><a title='' href='#'>^</a></b> <a rel='nofollow' title='http://www.example.org' class='external text' href='#'>Text odkazu</a>, další text.</li></ol>",
'wikieditor-toolbar-help-content-signaturetimestamp-description' => 'Podpis a datum',
'wikieditor-toolbar-help-content-signaturetimestamp-result' => "<a href='#' title='{{ns:User}}:Uživatelské jméno'>Uživatelské jméno</a> 23. 6. 2009, 10:43 (UTC)",
@@ -6026,6 +6077,7 @@ $messages['cu'] = array(
'wikieditor-toolbar-tool-table' => 'таÌвлїѥ',
'wikieditor-toolbar-tool-table-dimensions-rows' => 'рѧдꙑ',
'wikieditor-toolbar-tool-table-example' => 'прикладъ',
+ 'wikieditor-toolbar-tool-replace-close' => 'ê™Ð°ÐºÑ€ê™‘и',
'wikieditor-toolbar-section-characters' => 'допльнитєл҄ьнꙑ Ñѷмволи',
'wikieditor-toolbar-characters-page-latin' => 'латиньÑка аê™ÑŠÐ±Ð¾ÑƒÐºê™‘',
'wikieditor-toolbar-characters-page-latinextended' => 'латиньÑкꙑ аê™ÑŠÐ±Ð¾ÑƒÐºÑŒÐ²Ñ” доложєниѥ',
@@ -6071,7 +6123,7 @@ $messages['cy'] = array(
'wikieditor-publish-dialog-watch' => 'Dilyn hynt y dudalen hon',
'wikieditor-publish-dialog-publish' => 'Cyhoedder',
'wikieditor-publish-dialog-goback' => 'Yn ôl',
- 'wikieditor-template-editor-preference' => 'Galluogi golygu nodynnau wici drwy ffurflen',
+ 'wikieditor-template-editor-preference' => 'Galluogi golygu nodiadau wici drwy ffurflen',
'wikieditor-template-editor-dialog-title' => "Golygu'r nodyn",
'wikieditor-template-editor-dialog-submit' => 'Diweddarer',
'wikieditor-template-editor-dialog-cancel' => 'Diddymer',
@@ -6082,7 +6134,7 @@ $messages['cy'] = array(
'wikieditor-toolbar' => 'Bar offer golygu',
'wikieditor-toolbar-desc' => 'Bar offer y dudalen olygu gyda gwelliannau defnyddioldeb',
'wikieditor-toolbar-preference' => "Defnyddio'r bar offer golygu estynedig",
- 'wikieditor-toolbar-dialogs-preference' => 'Galluoger y blychau yn y rhyngwyneb ar gyfer mewnosod cysylltiadau, tablau ag ati',
+ 'wikieditor-toolbar-dialogs-preference' => "Galluogi'r dewin sy'n mewnosod cysylltau a thablau, ac sy'n gallu chwilio a disodli",
'wikieditor-toolbar-hidesig' => "Cuddio'r botwm llofnodi rhag y tudalennau yn y prif barth",
'wikieditor-toolbar-loading' => "Wrthi'n llwytho...",
'wikieditor-toolbar-tool-bold' => 'Praff',
@@ -6110,6 +6162,7 @@ $messages['cy'] = array(
'wikieditor-toolbar-tool-link-int-target-status-invalid' => 'Teitl annilys',
'wikieditor-toolbar-tool-link-int-target-status-external' => 'Cyswllt allanol',
'wikieditor-toolbar-tool-link-int-target-status-loading' => "Wrthi'n gwirio a yw'r dudalen ar gael...",
+ 'wikieditor-toolbar-tool-link-int-target-status-disambig' => 'Tudalen gwahaniaethu',
'wikieditor-toolbar-tool-link-int-invalid' => 'Ysgrifennwyd teitl annilys.',
'wikieditor-toolbar-tool-link-lookslikeinternal' => "Mae'n ymddangos bod yr URL a osodwyd yn arwain at dudalen arall yn y wici.
Ydych chi am ei osod ar ffurf cyswllt mewnol?",
@@ -6118,6 +6171,16 @@ Ydych chi am ei osod ar ffurf cyswllt mewnol?",
'wikieditor-toolbar-tool-link-empty' => "Nid ydych wedi ysgrifennu nod i'r cyswllt fynd ato.",
'wikieditor-toolbar-tool-file' => 'Ffeil mewnosodol',
'wikieditor-toolbar-tool-file-example' => 'Enghraifft.jpg',
+ 'wikieditor-toolbar-tool-file-title' => 'Mewnosod ffeil',
+ 'wikieditor-toolbar-file-target' => "Enw'r ffeil:",
+ 'wikieditor-toolbar-file-caption' => 'Pennawd:',
+ 'wikieditor-toolbar-file-size' => 'Maint:',
+ 'wikieditor-toolbar-file-float' => 'Alinio:',
+ 'wikieditor-toolbar-file-default' => '(diofyn)',
+ 'wikieditor-toolbar-file-format' => 'Fformat:',
+ 'wikieditor-toolbar-file-format-none' => 'dim',
+ 'wikieditor-toolbar-tool-file-insert' => 'Mewnosod',
+ 'wikieditor-toolbar-tool-file-cancel' => 'Rhoi heibio',
'wikieditor-toolbar-tool-reference' => 'Troednodyn',
'wikieditor-toolbar-tool-reference-example' => 'Ysgrifennwch droednodyn fan hyn',
'wikieditor-toolbar-tool-reference-cancel' => 'Diddymu',
@@ -6182,7 +6245,7 @@ $1:Enghraifft.jpg|Disgrifiad2',
'wikieditor-toolbar-tool-table-preview' => 'Rhagolwg',
'wikieditor-toolbar-tool-table-insert' => 'Mewnosod',
'wikieditor-toolbar-tool-table-cancel' => 'Diddymu',
- 'wikieditor-toolbar-tool-table-toomany' => "Nid yw'n bosib gosod tabl ag iddo mwy na $1 o gelloedd trwy ddefnyddio'r deialog hwn.", # Fuzzy
+ 'wikieditor-toolbar-tool-table-toomany' => "Nid yw'n bosib gosod tabl ag iddo mwy na 1,000 o gelloedd trwy ddefnyddio'r deialog hwn.",
'wikieditor-toolbar-tool-table-invalidnumber' => 'Nid ydych wedi gosod nifer (dilys) o resi neu o golofnau.',
'wikieditor-toolbar-tool-table-zero' => 'Ni allwch osod tabl heb unrhyw resi neu golofnau iddo.',
'wikieditor-toolbar-tool-replace' => 'Canfod a disodli',
@@ -6196,7 +6259,7 @@ $1:Enghraifft.jpg|Disgrifiad2',
'wikieditor-toolbar-tool-replace-button-replaceall' => "Disodli'r cwbwl",
'wikieditor-toolbar-tool-replace-close' => 'Cau',
'wikieditor-toolbar-tool-replace-nomatch' => 'Ni chanfyddwyd yr hyn a chwiliwyd amdano.',
- 'wikieditor-toolbar-tool-replace-success' => 'Gwnaethpwyd $1 amnewidiad.', # Fuzzy
+ 'wikieditor-toolbar-tool-replace-success' => 'Gwnaethpwyd $1 {{PLURAL:$1|amnewidiad}}.',
'wikieditor-toolbar-tool-replace-emptysearch' => 'Ni osodwyd unrhywbeth yn y blwch chwilio.',
'wikieditor-toolbar-tool-replace-invalidregex' => "Nid yw'r ymadrodd rheolaidd a ysgrifennwyd gennych yn ddilys: $1",
'wikieditor-toolbar-section-characters' => 'Nodau arbennig',
@@ -6219,6 +6282,9 @@ $1:Enghraifft.jpg|Disgrifiad2',
'wikieditor-toolbar-characters-page-thai' => 'Thai',
'wikieditor-toolbar-characters-page-lao' => 'Laoseg',
'wikieditor-toolbar-characters-page-khmer' => 'Chmereg',
+ 'wikieditor-toolbar-characters-endash' => 'heiffen en',
+ 'wikieditor-toolbar-characters-emdash' => 'heiffen em',
+ 'wikieditor-toolbar-characters-minus' => 'arwydd minws',
'wikieditor-toolbar-section-help' => 'Cymorth',
'wikieditor-toolbar-help-heading-description' => 'Disgrifiad',
'wikieditor-toolbar-help-heading-syntax' => 'Pan deipiwch hyn',
@@ -6294,8 +6360,8 @@ $1:Enghraifft.jpg|Disgrifiad2',
$messages['da'] = array(
'wikieditor' => 'Avanceret interface til redigering af wikitekst',
'wikieditor-desc' => 'Giver et udvidet interface til redigering af wikitekst og mange moduler med hjælpefunktioner',
- 'wikieditor-wikitext-tab' => 'wikitekst',
- 'wikieditor-loading' => 'Indlæser',
+ 'wikieditor-wikitext-tab' => 'Wikitekst',
+ 'wikieditor-loading' => 'Indlæser...',
'wikieditor-preview-preference' => 'Aktiver forhåndsvisning side-om-side',
'wikieditor-preview-tab' => 'Forhåndsvisning',
'wikieditor-preview-changes-tab' => 'Ændringer',
@@ -6306,8 +6372,8 @@ $messages['da'] = array(
'wikieditor-publish-preference' => 'Aktiver skridt-for-skridt udgivelse',
'wikieditor-publish-button-publish' => 'Udgiv',
'wikieditor-publish-button-cancel' => 'Afbryd',
- 'wikieditor-publish-dialog-title' => 'Udgiv som {{SITENAME}}',
- 'wikieditor-publish-dialog-summary' => 'Redigeringsbeskrivelse (beskriv kort de ændringer, du har gjort)',
+ 'wikieditor-publish-dialog-title' => 'Udgiv til {{SITENAME}}',
+ 'wikieditor-publish-dialog-summary' => 'Redigeringsbeskrivelse (beskriv kort de ændringer, du har lavet)',
'wikieditor-publish-dialog-minor' => 'Mindre ændring',
'wikieditor-publish-dialog-watch' => 'Overvåg denne side',
'wikieditor-publish-dialog-publish' => 'Udgiv',
@@ -6323,7 +6389,7 @@ $messages['da'] = array(
'wikieditor-toolbar' => 'Værktøjslinje til redigering',
'wikieditor-toolbar-desc' => 'Værktøjslinje til redigering med udvidet brugervenlighed',
'wikieditor-toolbar-preference' => 'Aktiver forbedret værktøjslinje til redigering',
- 'wikieditor-toolbar-dialogs-preference' => 'Aktiver dialoger til indsættelse af links, tabeller og mere.',
+ 'wikieditor-toolbar-dialogs-preference' => 'Aktiver guider til at indsætte links, tabeller samt søg og erstat-funktionen',
'wikieditor-toolbar-hidesig' => 'Skjul signaturknappen på sider i hovednavnerummet',
'wikieditor-toolbar-loading' => 'Indlæser ...',
'wikieditor-toolbar-tool-bold' => 'Fed',
@@ -6337,7 +6403,7 @@ $messages['da'] = array(
'wikieditor-toolbar-tool-link' => 'Henvisning',
'wikieditor-toolbar-tool-link-title' => 'Indsæt henvisning',
'wikieditor-toolbar-tool-link-int' => 'Til en wikiartikel/-side',
- 'wikieditor-toolbar-tool-link-int-target' => 'Artikeltitel:',
+ 'wikieditor-toolbar-tool-link-int-target' => 'Destinationsside eller URL:',
'wikieditor-toolbar-tool-link-int-target-tooltip' => 'Sidetitel eller internetadresse',
'wikieditor-toolbar-tool-link-int-text' => 'Henvisningstekst:',
'wikieditor-toolbar-tool-link-int-text-tooltip' => 'Tekst, der skal vises',
@@ -6351,12 +6417,13 @@ $messages['da'] = array(
'wikieditor-toolbar-tool-link-int-target-status-invalid' => 'Ugyldig titel',
'wikieditor-toolbar-tool-link-int-target-status-external' => 'Ekstern henvisning',
'wikieditor-toolbar-tool-link-int-target-status-loading' => 'Kontrollerer om siden findes ...',
+ 'wikieditor-toolbar-tool-link-int-target-status-disambig' => 'Flertydig side',
'wikieditor-toolbar-tool-link-int-invalid' => 'Titlen du gav, er ugyldig.',
'wikieditor-toolbar-tool-link-lookslikeinternal' => "URL'en, du har angivet, ser ud til at være tiltænkt som en henvisning til en anden wikiside.
Ønsker du at gøre den til en intern henvisning.",
'wikieditor-toolbar-tool-link-lookslikeinternal-int' => 'Intern henvisning',
'wikieditor-toolbar-tool-link-lookslikeinternal-ext' => 'Ekstern henvisning',
- 'wikieditor-toolbar-tool-link-empty' => 'Du har ikke angivet noget at linke til.',
+ 'wikieditor-toolbar-tool-link-empty' => 'Du har ikke angivet noget at henvise til.',
'wikieditor-toolbar-tool-file' => 'Indlejret fil',
'wikieditor-toolbar-tool-file-example' => 'Eksempel.jpg',
'wikieditor-toolbar-tool-file-title' => 'Indsæt fil',
@@ -6368,7 +6435,7 @@ $messages['da'] = array(
'wikieditor-toolbar-file-format' => 'Format:',
'wikieditor-toolbar-file-format-none' => 'ingen',
'wikieditor-toolbar-tool-file-insert' => 'Indsæt',
- 'wikieditor-toolbar-tool-file-cancel' => 'Annuller',
+ 'wikieditor-toolbar-tool-file-cancel' => 'Annullér',
'wikieditor-toolbar-tool-reference' => 'Fodnote',
'wikieditor-toolbar-tool-reference-example' => 'Indsæt fodnotetekst her',
'wikieditor-toolbar-tool-reference-cancel' => 'Annullér',
@@ -6402,7 +6469,7 @@ $messages['da'] = array(
'wikieditor-toolbar-tool-superscript' => 'Hævet skrift',
'wikieditor-toolbar-tool-superscript-example' => 'Hævet tekst',
'wikieditor-toolbar-tool-subscript' => 'Sænket skrift',
- 'wikieditor-toolbar-tool-subscript-example' => 'Sænket skrift',
+ 'wikieditor-toolbar-tool-subscript-example' => 'Sænket tekst',
'wikieditor-toolbar-group-insert' => 'Indsæt',
'wikieditor-toolbar-tool-gallery' => 'Billedgalleri',
'wikieditor-toolbar-tool-gallery-example' => '$1:Eksempel.jpg|Billedtekst1
@@ -6421,7 +6488,7 @@ $1:Eksempel.jpg|Billedtekst2',
| række 2, celle 1
| række 2, celle 2
| række 2, celle 3',
- 'wikieditor-toolbar-tool-table-example-cell-text' => 'Række $1, celle $2',
+ 'wikieditor-toolbar-tool-table-example-cell-text' => 'Celletekst',
'wikieditor-toolbar-tool-table-example-header' => 'Overskriftstekst',
'wikieditor-toolbar-tool-table-title' => 'Indsæt tabel',
'wikieditor-toolbar-tool-table-dimensions-rows' => 'Rækker',
@@ -6429,7 +6496,7 @@ $1:Eksempel.jpg|Billedtekst2',
'wikieditor-toolbar-tool-table-dimensions-header' => 'Tilføj række til kolonneoverskrifter',
'wikieditor-toolbar-tool-table-wikitable' => 'Stil med kanter',
'wikieditor-toolbar-tool-table-sortable' => 'Gør tabel sorterbar',
- 'wikieditor-toolbar-tool-table-example' => 'Celletekst',
+ 'wikieditor-toolbar-tool-table-example' => 'Eksempel',
'wikieditor-toolbar-tool-table-preview' => 'Forhåndsvisning',
'wikieditor-toolbar-tool-table-insert' => 'Indsæt',
'wikieditor-toolbar-tool-table-cancel' => 'Annullér',
@@ -6610,6 +6677,7 @@ $messages['de'] = array(
'wikieditor-toolbar-tool-link-int-target-status-invalid' => 'Ungültiger Titel',
'wikieditor-toolbar-tool-link-int-target-status-external' => 'Externer Link',
'wikieditor-toolbar-tool-link-int-target-status-loading' => 'Prüfe, ob Seite vorhanden ist …',
+ 'wikieditor-toolbar-tool-link-int-target-status-disambig' => 'Begriffsklärungsseite',
'wikieditor-toolbar-tool-link-int-invalid' => 'Der angegebene Seitenname ist ungültig.',
'wikieditor-toolbar-tool-link-lookslikeinternal' => 'Die von dir angegebene URL wirkt wie eine, die auf eine andere Wikiseite verlinken würde.
Möchtest du daraus einen internen Link machen?',
@@ -6826,6 +6894,8 @@ Möchten Sie daraus einen internen Link machen?',
/** Zazaki (Zazaki)
* @author Erdemaslancan
+ * @author Gorizon
+ * @author Marmase
* @author Mirzali
* @author Xoser
*/
@@ -6861,7 +6931,7 @@ $messages['diq'] = array(
'wikieditor-toolbar' => 'nizamkerdışê çuyaya haceti',
'wikieditor-toolbar-desc' => 'Xacetê çuveyî pê enhanced usability bivurne',
'wikieditor-toolbar-preference' => 'çuyaya haceti yo dewlemendbiyayeyi aktif ker',
- 'wikieditor-toolbar-dialogs-preference' => "qey têare kerdışê gıre, tablo usb'ani mesajan aktif bıker",
+ 'wikieditor-toolbar-dialogs-preference' => "Qey têare kerdışê gıre, tablo usb'ani mesajan aktif bıkere",
'wikieditor-toolbar-hidesig' => 'Vanganê naman de serênan pela dı maka imzer bınımnê',
'wikieditor-toolbar-loading' => 'bar beno...',
'wikieditor-toolbar-tool-bold' => 'qalın',
@@ -6889,6 +6959,7 @@ $messages['diq'] = array(
'wikieditor-toolbar-tool-link-int-target-status-invalid' => 'Sernameyo xırab.',
'wikieditor-toolbar-tool-link-int-target-status-external' => 'Gırêy teberi',
'wikieditor-toolbar-tool-link-int-target-status-loading' => 'mewcudiyetê peli konrol beno',
+ 'wikieditor-toolbar-tool-link-int-target-status-disambig' => 'Pera maneyo bini',
'wikieditor-toolbar-tool-link-int-invalid' => 'Sernameyo ke şımayê vanê ravêrde niyo.',
'wikieditor-toolbar-tool-link-lookslikeinternal' => 'URLyo ke şıma nişan kerdo, pelê yewna wikiyi re gıre biyo aseno.
şıma wazeni no gıre yew gıreyo daxili bıbo?',
@@ -6907,10 +6978,10 @@ $messages['diq'] = array(
'wikieditor-toolbar-file-format-none' => 'çıniyo',
'wikieditor-toolbar-tool-file-insert' => 'Têare ker',
'wikieditor-toolbar-tool-file-cancel' => 'Bıterkne',
- 'wikieditor-toolbar-tool-reference' => 'çıme',
+ 'wikieditor-toolbar-tool-reference' => 'Referans',
'wikieditor-toolbar-tool-reference-example' => 'metnê notê bınini tiya kerê',
'wikieditor-toolbar-tool-reference-cancel' => 'Bıtexelne',
- 'wikieditor-toolbar-tool-reference-title' => 'Referance de bike',
+ 'wikieditor-toolbar-tool-reference-title' => 'Referans dek',
'wikieditor-toolbar-tool-reference-insert' => 'de bike',
'wikieditor-toolbar-tool-reference-text' => 'Nusteyê Referansi',
'wikieditor-toolbar-tool-signature' => 'tamğayê imza ve zamani',
@@ -6925,7 +6996,7 @@ $messages['diq'] = array(
'wikieditor-toolbar-group-format' => 'Format',
'wikieditor-toolbar-tool-ulist' => 'listeya maddeya işaretıni',
'wikieditor-toolbar-tool-ulist-example' => 'unsuro listeya maddeya işaretıni',
- 'wikieditor-toolbar-tool-olist' => 'listeya numreyıni',
+ 'wikieditor-toolbar-tool-olist' => 'Listeya nımreyın',
'wikieditor-toolbar-tool-olist-example' => 'unsuro listeya numreyıni',
'wikieditor-toolbar-tool-indent' => 'Paragraf',
'wikieditor-toolbar-tool-indent-example' => 'Rêza paragrafi',
@@ -6971,7 +7042,7 @@ $1:misal.jpg|nuşteyê resmi2',
'wikieditor-toolbar-tool-table-preview' => 'Verqayt',
'wikieditor-toolbar-tool-table-insert' => 'têare ker',
'wikieditor-toolbar-tool-table-cancel' => 'Bıterkne',
- 'wikieditor-toolbar-tool-table-toomany' => '$1 hucreyın ra ziyed tablo eştış pê no mesaj mumkin niyo', # Fuzzy
+ 'wikieditor-toolbar-tool-table-toomany' => '1000 hucrara ziyed tablo eştış pê no mesaj mumkın niyo',
'wikieditor-toolbar-tool-table-invalidnumber' => 'şıma pê yew amaro meqbul o satır u estun cı nêkewti',
'wikieditor-toolbar-tool-table-zero' => 'tablo ya ke tede satır u estun çinibo şıma nêşkeni têare bıkeri',
'wikieditor-toolbar-tool-replace' => 'bıgêr u bıvurn',
@@ -6985,7 +7056,7 @@ $1:misal.jpg|nuşteyê resmi2',
'wikieditor-toolbar-tool-replace-button-replaceall' => 'pêroyin bıvurn',
'wikieditor-toolbar-tool-replace-close' => 'Racnê',
'wikieditor-toolbar-tool-replace-nomatch' => 'çi yo ke şıma gêrenê cı çin o.',
- 'wikieditor-toolbar-tool-replace-success' => '$1 vurnayiş vıraziya.', # Fuzzy
+ 'wikieditor-toolbar-tool-replace-success' => '$1 {{PLURAL:$1|yedeg|yedegi}} vıraziya.',
'wikieditor-toolbar-tool-replace-emptysearch' => 'şıma qey cıgêrayiş taway/çiyek nênuşt',
'wikieditor-toolbar-tool-replace-invalidregex' => 'ifadeya normal a ke şıma kwene cı meqbul niya: $1',
'wikieditor-toolbar-section-characters' => 'karakterê xususiyî',
@@ -7011,7 +7082,7 @@ $1:misal.jpg|nuşteyê resmi2',
'wikieditor-toolbar-characters-endash' => 'tira kılme',
'wikieditor-toolbar-characters-emdash' => 'tira derge',
'wikieditor-toolbar-characters-minus' => 'işaretê kemiye',
- 'wikieditor-toolbar-section-help' => 'PeÅŸti',
+ 'wikieditor-toolbar-section-help' => 'Desteg',
'wikieditor-toolbar-help-heading-description' => 'Şınasnayış',
'wikieditor-toolbar-help-heading-syntax' => 'o yo ke şıma nuşt',
'wikieditor-toolbar-help-heading-result' => 'o yo ke şıma gırewt',
@@ -7021,7 +7092,7 @@ $1:misal.jpg|nuşteyê resmi2',
'wikieditor-toolbar-help-page-list' => 'Listey',
'wikieditor-toolbar-help-page-file' => 'dosyayi',
'wikieditor-toolbar-help-page-reference' => 'Çımey',
- 'wikieditor-toolbar-help-page-discussion' => 'werê-ameyiş/munaqeşa',
+ 'wikieditor-toolbar-help-page-discussion' => 'Vaten',
'wikieditor-toolbar-help-content-italic-description' => 'italik',
'wikieditor-toolbar-help-content-italic-syntax' => "''metno italik''",
'wikieditor-toolbar-help-content-italic-result' => '<em>metno italik</em>',
@@ -7052,13 +7123,13 @@ $1:misal.jpg|nuşteyê resmi2',
'wikieditor-toolbar-help-content-ulist-description' => 'listeya işareti ya maddeyın',
'wikieditor-toolbar-help-content-ulist-syntax' => '* unsurê listeyi<br />* unsurê listeyi',
'wikieditor-toolbar-help-content-ulist-result' => '<ul><li>unsurê listeyi</li><li>unsurê listeyi</li></ul>',
- 'wikieditor-toolbar-help-content-olist-description' => 'listeya numreyın',
+ 'wikieditor-toolbar-help-content-olist-description' => 'Listeya nımreyın',
'wikieditor-toolbar-help-content-olist-syntax' => '# unsurê listeyi<br /># unsurê listeyi',
'wikieditor-toolbar-help-content-olist-result' => '<ol><li>unsurê listeyi</li><li>unsurê listeyi</li></ol>',
'wikieditor-toolbar-help-content-file-description' => 'dosyaya weradaye/nımıte',
'wikieditor-toolbar-help-content-file-syntax' => '[[$1:Example.png|thumb|Nuşteyê resîmî]]',
'wikieditor-toolbar-help-content-file-result' => "<div style='width:104px;' class='thumbinner'><a title='Caption text' class='image' href='#'><img height='50' width='100' border='0' class='thumbimage' src='$2/WikiEditor/modules/images/toolbar/example-image.png' alt=''/></a><div class='thumbcaption'><div class='magnify'><a title='Enlarge' class='internal' href='#'><img height='11' width='15' alt='' src='$1/common/images/magnify-clip.png'/></a></div>metnê resmi</div></div>",
- 'wikieditor-toolbar-help-content-reference-description' => 'çıme/referans',
+ 'wikieditor-toolbar-help-content-reference-description' => 'Referans',
'wikieditor-toolbar-help-content-reference-syntax' => 'metnê peli.&lt;ref name="tesel kerdış/cerebnayiş"&gt;[http://www.misal.org metnê gıreyi], zeylê metni.&lt;/ref&gt;',
'wikieditor-toolbar-help-content-reference-result' => "metnê peli.<sup><a href='#'>[1]</a></sup>",
'wikieditor-toolbar-help-content-rereference-description' => 'şuxulnayişê zeylê o çımeyi',
@@ -7109,7 +7180,7 @@ $messages['dsb'] = array(
'wikieditor-toolbar' => 'Wobźěłowańska rědowa kšoma',
'wikieditor-toolbar-desc' => 'Rědowa kšoma za wobźěłowanje bokow z pólěpšoneju wužywajobnosću',
'wikieditor-toolbar-preference' => 'Pólěpšonu wobźěłowańsku rědowu kšomu aktiwěrowaś',
- 'wikieditor-toolbar-dialogs-preference' => 'Dialogi za zasajźenje wótkazow, tabelow a hynakšego zmóžniś',
+ 'wikieditor-toolbar-dialogs-preference' => 'Dialogi za zasajźenje wótkazow, tabelow a hynakšego zmóžniś', # Fuzzy
'wikieditor-toolbar-hidesig' => 'Pódpisowy tÅ‚oÄaÅ¡k w bokach w gÅ‚ownem mjenjowem rumje schowaÅ›',
'wikieditor-toolbar-loading' => 'Zacytujo se...',
'wikieditor-toolbar-tool-bold' => 'Tucny',
@@ -7365,7 +7436,7 @@ $messages['el'] = array(
'wikieditor-toolbar' => 'ΕπεξεÏγασία εÏγαλειοθήκης',
'wikieditor-toolbar-desc' => 'ΜπάÏα εÏγαλείων επεξεÏγασίας σελίδων με πεÏισσότεÏες δυνατότητες χÏήσης',
'wikieditor-toolbar-preference' => 'ΕνεÏγοποιήστε την μπάÏα εÏγαλείων με τις πεÏισσότεÏες δυνατότητες επεξεÏγασίας',
- 'wikieditor-toolbar-dialogs-preference' => 'ΕνεÏγοποιήστε παÏάθυÏα διαλόγων για την εισαγωγή συνδέσμων, πινάκων και άλλων',
+ 'wikieditor-toolbar-dialogs-preference' => 'ΕνεÏγοποιήστε παÏάθυÏα διαλόγων για την εισαγωγή συνδέσμων, πινάκων και άλλων', # Fuzzy
'wikieditor-toolbar-hidesig' => 'ΚÏÏψε το κουμπί υπογÏαφής από σελίδες στον κÏÏιο χώÏο ονομάτων',
'wikieditor-toolbar-loading' => 'ΦόÏτωση...',
'wikieditor-toolbar-tool-bold' => 'Έντονα',
@@ -7617,7 +7688,7 @@ $messages['eo'] = array(
'wikieditor-toolbar' => 'Ilobreto por redaktoj',
'wikieditor-toolbar-desc' => 'Ilobreto por redaktoj, kun plibonigita uzebleco',
'wikieditor-toolbar-preference' => 'EnÅalti plibonigitan ilobreton por redaktoj',
- 'wikieditor-toolbar-dialogs-preference' => 'EnÅalti dialogujojn por aldoni ligilojn, tabelojn kaj pli',
+ 'wikieditor-toolbar-dialogs-preference' => 'EnÅalti dialogujojn por aldoni ligilojn, tabelojn kaj pli', # Fuzzy
'wikieditor-toolbar-hidesig' => 'KaÅi la subskribo-butonon de paÄoj en la ĉefa nomspaco',
'wikieditor-toolbar-loading' => 'ÅœarÄante...',
'wikieditor-toolbar-tool-bold' => 'Diklitera',
@@ -7851,12 +7922,12 @@ $messages['es'] = array(
'wikieditor' => 'Interfaz avanzada de edición de wikitexto',
'wikieditor-desc' => 'Provee de una interfaz extensible de edición de wikitexto y varios módulos que ofrecen características',
'wikieditor-wikitext-tab' => 'Wikitexto',
- 'wikieditor-loading' => 'Cargando',
+ 'wikieditor-loading' => 'Cargando…',
'wikieditor-preview-preference' => 'Habilitar previsualización comparativa',
'wikieditor-preview-tab' => 'Previsualizar',
'wikieditor-preview-changes-tab' => 'Cambios',
'wikieditor-preview-loading' => 'Cargando...',
- 'wikieditor-previewDialog-preference' => 'Habilitar diálogo de vista previa',
+ 'wikieditor-previewDialog-preference' => 'Activar el diálogo de previsualización',
'wikieditor-previewDialog-tab' => 'Previsualizar',
'wikieditor-previewDialog-loading' => 'Cargando...',
'wikieditor-publish-preference' => 'Habilitar publicación paso a paso',
@@ -7879,7 +7950,7 @@ $messages['es'] = array(
'wikieditor-toolbar' => 'Barra de herramientas de edición',
'wikieditor-toolbar-desc' => 'Barra de herramientas de la página de edición con usabilidad mejorada',
'wikieditor-toolbar-preference' => 'Habilitar la barra de herramientas de edición mejorada',
- 'wikieditor-toolbar-dialogs-preference' => 'Habilitar diálogos para insertar enlaces, tablas y más',
+ 'wikieditor-toolbar-dialogs-preference' => 'Activar los asistentes para insertar enlaces y tablas, y la función de buscar y reemplazar',
'wikieditor-toolbar-hidesig' => 'Ocultar el botón firmar de las páginas en el espacio de nombres principal',
'wikieditor-toolbar-loading' => 'Cargando...',
'wikieditor-toolbar-tool-bold' => 'Negrita',
@@ -7906,21 +7977,22 @@ $messages['es'] = array(
'wikieditor-toolbar-tool-link-int-target-status-notexists' => 'No existe la página',
'wikieditor-toolbar-tool-link-int-target-status-invalid' => 'Título inválido',
'wikieditor-toolbar-tool-link-int-target-status-external' => 'Enlace externo',
- 'wikieditor-toolbar-tool-link-int-target-status-loading' => 'Revisando existencia de la página...',
+ 'wikieditor-toolbar-tool-link-int-target-status-loading' => 'Comprobando que la página existe…',
+ 'wikieditor-toolbar-tool-link-int-target-status-disambig' => 'Página de desambiguación',
'wikieditor-toolbar-tool-link-int-invalid' => 'El título que ha especificado no es válido.',
'wikieditor-toolbar-tool-link-lookslikeinternal' => 'EL URL que has especificado parece que tenia como finalidad ser un vínculo para otra página wiki.
¿Deseas hacerlo un vínculo interno?',
'wikieditor-toolbar-tool-link-lookslikeinternal-int' => 'Enlace interno',
'wikieditor-toolbar-tool-link-lookslikeinternal-ext' => 'Enlace externo',
'wikieditor-toolbar-tool-link-empty' => 'No has escrito nada a qué vincular.',
- 'wikieditor-toolbar-tool-file' => 'Archivo empotrado',
+ 'wikieditor-toolbar-tool-file' => 'Archivo incrustado',
'wikieditor-toolbar-tool-file-example' => 'Ejemplo.jpg',
'wikieditor-toolbar-tool-file-title' => 'Insertar archivo',
'wikieditor-toolbar-file-target' => 'Nombre de archivo:',
'wikieditor-toolbar-file-caption' => 'Leyenda:',
'wikieditor-toolbar-file-size' => 'Tamaño:',
'wikieditor-toolbar-file-float' => 'Alinear:',
- 'wikieditor-toolbar-file-default' => '(por defecto)',
+ 'wikieditor-toolbar-file-default' => '(predeterminado)',
'wikieditor-toolbar-file-format' => 'Formato:',
'wikieditor-toolbar-file-format-none' => 'ninguno',
'wikieditor-toolbar-tool-file-insert' => 'Insertar',
@@ -7942,11 +8014,11 @@ $messages['es'] = array(
'wikieditor-toolbar-tool-heading-example' => 'Texto de encabezado',
'wikieditor-toolbar-group-format' => 'Formato',
'wikieditor-toolbar-tool-ulist' => 'Lista viñeteada',
- 'wikieditor-toolbar-tool-ulist-example' => 'Ãtem de lista de viñetas',
+ 'wikieditor-toolbar-tool-ulist-example' => 'Elemento de lista de viñetas',
'wikieditor-toolbar-tool-olist' => 'Lista numerada',
- 'wikieditor-toolbar-tool-olist-example' => 'Ãtem de lista numerada',
- 'wikieditor-toolbar-tool-indent' => 'Indentación',
- 'wikieditor-toolbar-tool-indent-example' => 'Línea indentada',
+ 'wikieditor-toolbar-tool-olist-example' => 'Elemento de lista numerada',
+ 'wikieditor-toolbar-tool-indent' => 'Sangría',
+ 'wikieditor-toolbar-tool-indent-example' => 'Línea con sangría',
'wikieditor-toolbar-tool-nowiki' => 'Sin formato wiki',
'wikieditor-toolbar-tool-nowiki-example' => 'Introduzca texto sin formato aquí',
'wikieditor-toolbar-tool-redirect' => 'Redirección',
@@ -7955,15 +8027,15 @@ $messages['es'] = array(
'wikieditor-toolbar-tool-big-example' => 'Texto grande',
'wikieditor-toolbar-tool-small' => 'Pequeño',
'wikieditor-toolbar-tool-small-example' => 'Texto pequeño',
- 'wikieditor-toolbar-tool-superscript' => 'Superescrito',
- 'wikieditor-toolbar-tool-superscript-example' => 'Texto superescrito',
- 'wikieditor-toolbar-tool-subscript' => 'Suscribir',
- 'wikieditor-toolbar-tool-subscript-example' => 'Texto suscrito',
+ 'wikieditor-toolbar-tool-superscript' => 'Superíndice',
+ 'wikieditor-toolbar-tool-superscript-example' => 'Texto en superíndice',
+ 'wikieditor-toolbar-tool-subscript' => 'Subíndice',
+ 'wikieditor-toolbar-tool-subscript-example' => 'Texto en subíndice',
'wikieditor-toolbar-group-insert' => 'Insertar',
'wikieditor-toolbar-tool-gallery' => 'Galería de fotos',
'wikieditor-toolbar-tool-gallery-example' => '$1:Ejemplo.jpg|Descripción1
$1:Ejemplo.jpg|Descripción2',
- 'wikieditor-toolbar-tool-newline' => 'Nueva línea',
+ 'wikieditor-toolbar-tool-newline' => 'Línea nueva',
'wikieditor-toolbar-tool-table' => 'Tabla',
'wikieditor-toolbar-tool-table-example-old' => '-
! encabezado 1
@@ -7979,7 +8051,7 @@ $1:Ejemplo.jpg|Descripción2',
| fila 2, celda 3',
'wikieditor-toolbar-tool-table-example-cell-text' => 'Texto de celda',
'wikieditor-toolbar-tool-table-example-header' => 'Texto de encabezado',
- 'wikieditor-toolbar-tool-table-title' => 'Inserte tabla',
+ 'wikieditor-toolbar-tool-table-title' => 'Insertar una tabla',
'wikieditor-toolbar-tool-table-dimensions-rows' => 'Filas',
'wikieditor-toolbar-tool-table-dimensions-columns' => 'Columnas',
'wikieditor-toolbar-tool-table-dimensions-header' => 'Incluir encabezado de fila',
@@ -7989,21 +8061,21 @@ $1:Ejemplo.jpg|Descripción2',
'wikieditor-toolbar-tool-table-preview' => 'Previsualización',
'wikieditor-toolbar-tool-table-insert' => 'Insertar',
'wikieditor-toolbar-tool-table-cancel' => 'Cancelar',
- 'wikieditor-toolbar-tool-table-toomany' => 'Insertar una tabla con más de $1 celdas no es posible con este cuadro de diálogo.', # Fuzzy
+ 'wikieditor-toolbar-tool-table-toomany' => 'No se puede insertar una tabla con más de mil celdas con este diálogo.',
'wikieditor-toolbar-tool-table-invalidnumber' => 'No se ha introducido un número válido de filas o columnas.',
'wikieditor-toolbar-tool-table-zero' => 'No se puede insertar una tabla con cero filas o columnas.',
'wikieditor-toolbar-tool-replace' => 'Buscar y reemplazar',
'wikieditor-toolbar-tool-replace-title' => 'Buscar y reemplazar',
'wikieditor-toolbar-tool-replace-search' => 'Buscar:',
'wikieditor-toolbar-tool-replace-replace' => 'Reemplazar por:',
- 'wikieditor-toolbar-tool-replace-case' => 'Considerar mayúsculas',
+ 'wikieditor-toolbar-tool-replace-case' => 'Distinguir mayúsculas y minúsculas',
'wikieditor-toolbar-tool-replace-regex' => 'Tratar la cadena de búsqueda como expresión regular',
'wikieditor-toolbar-tool-replace-button-findnext' => 'Buscar siguiente',
'wikieditor-toolbar-tool-replace-button-replace' => 'Reemplazar',
'wikieditor-toolbar-tool-replace-button-replaceall' => 'Reemplazar todo',
'wikieditor-toolbar-tool-replace-close' => 'Cerrar',
'wikieditor-toolbar-tool-replace-nomatch' => 'Su búsqueda no halló resultados.',
- 'wikieditor-toolbar-tool-replace-success' => '$1 reemplazos hechos', # Fuzzy
+ 'wikieditor-toolbar-tool-replace-success' => 'Se {{PLURAL:$1|realizó|realizaron}} $1 {{PLURAL:$1|reemplazo|reemplazos}}.',
'wikieditor-toolbar-tool-replace-emptysearch' => 'No ingresó nada para buscar.',
'wikieditor-toolbar-tool-replace-invalidregex' => 'La expresión regular que ha introducido es inválida: $1',
'wikieditor-toolbar-section-characters' => 'Caracteres especiales',
@@ -8023,17 +8095,17 @@ $1:Ejemplo.jpg|Descripción2',
'wikieditor-toolbar-characters-page-sinhala' => 'Sinhala',
'wikieditor-toolbar-characters-page-gujarati' => 'Gujarati',
'wikieditor-toolbar-characters-page-devanagari' => 'Devanagari',
- 'wikieditor-toolbar-characters-page-thai' => 'Thai',
+ 'wikieditor-toolbar-characters-page-thai' => 'Tailandés',
'wikieditor-toolbar-characters-page-lao' => 'Lao',
- 'wikieditor-toolbar-characters-page-khmer' => 'Khmer',
- 'wikieditor-toolbar-characters-endash' => 'guión corto',
- 'wikieditor-toolbar-characters-emdash' => 'guión largo',
+ 'wikieditor-toolbar-characters-page-khmer' => 'Jemer',
+ 'wikieditor-toolbar-characters-endash' => 'semirraya',
+ 'wikieditor-toolbar-characters-emdash' => 'raya',
'wikieditor-toolbar-characters-minus' => 'signo menos',
'wikieditor-toolbar-section-help' => 'Ayuda',
'wikieditor-toolbar-help-heading-description' => 'Descripción',
- 'wikieditor-toolbar-help-heading-syntax' => 'Lo que escribe',
- 'wikieditor-toolbar-help-heading-result' => 'Lo que obtiene',
- 'wikieditor-toolbar-help-page-format' => 'Formateando',
+ 'wikieditor-toolbar-help-heading-syntax' => 'Lo que escribes',
+ 'wikieditor-toolbar-help-heading-result' => 'Lo que obtienes',
+ 'wikieditor-toolbar-help-page-format' => 'Formato',
'wikieditor-toolbar-help-page-link' => 'Enlaces',
'wikieditor-toolbar-help-page-heading' => 'Encabezados',
'wikieditor-toolbar-help-page-list' => 'Listas',
@@ -8055,16 +8127,16 @@ $1:Ejemplo.jpg|Descripción2',
'wikieditor-toolbar-help-content-xlink-description' => 'Enlace externo',
'wikieditor-toolbar-help-content-xlink-syntax' => '[http://www.example.org Etiqueta del enlace]<br />[http://www.example.org]<br />http://www.example.org',
'wikieditor-toolbar-help-content-xlink-result' => "<a href='#' class='external'>Etiqueta del enlace</a><br /><a href='#' class='external autonumber'>[1]</a><br /><a href='#' class='external'>http://www.example.org</a>",
- 'wikieditor-toolbar-help-content-heading2-description' => 'Encabezado de 2º nivel',
+ 'wikieditor-toolbar-help-content-heading2-description' => 'Encabezado de 2.º nivel',
'wikieditor-toolbar-help-content-heading2-syntax' => '== Texto de encabezado ==',
'wikieditor-toolbar-help-content-heading2-result' => '<h2>Texto de encabezado</h2>',
- 'wikieditor-toolbar-help-content-heading3-description' => 'Encabezado de 3º nivel',
+ 'wikieditor-toolbar-help-content-heading3-description' => 'Encabezado de tercer nivel',
'wikieditor-toolbar-help-content-heading3-syntax' => '=== Texto de encabezado ===',
'wikieditor-toolbar-help-content-heading3-result' => '<h3>Texto de encabezado</h3>',
- 'wikieditor-toolbar-help-content-heading4-description' => 'Encabezado de 4º nivel',
+ 'wikieditor-toolbar-help-content-heading4-description' => 'Encabezado de 4.º nivel',
'wikieditor-toolbar-help-content-heading4-syntax' => '==== Texto de encabezado ====',
'wikieditor-toolbar-help-content-heading4-result' => '<h4>Texto de encabezado</h4>',
- 'wikieditor-toolbar-help-content-heading5-description' => 'Encabezado de 5º nivel',
+ 'wikieditor-toolbar-help-content-heading5-description' => 'Encabezado de 5.º nivel',
'wikieditor-toolbar-help-content-heading5-syntax' => '===== Texto de encabezado =====',
'wikieditor-toolbar-help-content-heading5-result' => '<h5>Texto de encabezado</h5>',
'wikieditor-toolbar-help-content-ulist-description' => 'Lista viñeteada',
@@ -8073,7 +8145,7 @@ $1:Ejemplo.jpg|Descripción2',
'wikieditor-toolbar-help-content-olist-description' => 'Lista numerada',
'wikieditor-toolbar-help-content-olist-syntax' => '# Elemento de la lista<br /># Elemento de la lista',
'wikieditor-toolbar-help-content-olist-result' => '<ol><li>Elemento de la lista</li><li>Elemento de la lista</li></ol>',
- 'wikieditor-toolbar-help-content-file-description' => 'Archivo empotrado',
+ 'wikieditor-toolbar-help-content-file-description' => 'Archivo incrustado',
'wikieditor-toolbar-help-content-file-syntax' => '[[$1:Ejemplo.png|thumb|Texto de la leyenda]]',
'wikieditor-toolbar-help-content-file-result' => "<div style='width:104px;' class='thumbinner'><a title='Caption text' class='image' href='#'><img height='50' width='100' border='0' class='thumbimage' src='$2/WikiEditor/modules/images/toolbar/example-image.png' alt=''/></a><div class='thumbcaption'><div class='magnify'><a title='Enlarge' class='internal' href='#'><img height='11' width='15' alt='' src='$1/common/images/magnify-clip.png'/></a></div>Texto leyenda</div></div>",
'wikieditor-toolbar-help-content-reference-description' => 'Referencia',
@@ -8087,9 +8159,9 @@ $1:Ejemplo.jpg|Descripción2',
'wikieditor-toolbar-help-content-signaturetimestamp-result' => "<a href='#' title='{{#special:mypage}}'>Nombre de usuario</a> (<a href='#' title='{{#special:mytalk}}'>discusión</a>) 15:54, 10 June 2009 (UTC)",
'wikieditor-toolbar-help-content-signature-description' => 'Firma',
'wikieditor-toolbar-help-content-signature-result' => "<a href='#' title='{{#special:mypage}}'>Nombre de usuario</a> (<a href='#' title='{{#special:mytalk}}'>discusión</a>)",
- 'wikieditor-toolbar-help-content-indent-description' => 'Indentado',
- 'wikieditor-toolbar-help-content-indent-syntax' => 'Texto normal<br />:Texto indentado<br />::Texto indentado',
- 'wikieditor-toolbar-help-content-indent-result' => 'Texto normal<dl><dd>Texto indentado<dl><dd>Texto indentado</dd></dl></dd></dl>',
+ 'wikieditor-toolbar-help-content-indent-description' => 'Sangría',
+ 'wikieditor-toolbar-help-content-indent-syntax' => 'Texto normal<br />:Texto con sangría<br />::Texto con sangría',
+ 'wikieditor-toolbar-help-content-indent-result' => 'Texto normal<dl><dd>Texto con sangría<dl><dd>Texto con sangría</dd></dl></dd></dl>',
);
/** Estonian (eesti)
@@ -8103,7 +8175,7 @@ $messages['et'] = array(
'wikieditor-desc' => 'Sisaldab vikiteksti laiendatud redigeerimisliidest ja palju redigeerimisfunktsioone.',
'wikieditor-wikitext-tab' => 'Vikitekst',
'wikieditor-loading' => 'Laadimine...',
- 'wikieditor-preview-preference' => 'Kuva eelvaade külgmisel sakil',
+ 'wikieditor-preview-preference' => 'Kasuta kõrvalkaardil kuvatavat eelvaadet',
'wikieditor-preview-tab' => 'Eelvaade',
'wikieditor-preview-changes-tab' => 'Muudatused',
'wikieditor-preview-loading' => 'Laadimine...',
@@ -8129,7 +8201,7 @@ $messages['et'] = array(
'wikieditor-toolbar' => 'Toimetamise tööriistariba',
'wikieditor-toolbar-desc' => 'Täiustatud kasutushõlpsusega redigeerimislehekülje tööriistariba',
'wikieditor-toolbar-preference' => 'Kasuta laiendatud redigeerimisriba',
- 'wikieditor-toolbar-dialogs-preference' => 'Kasuta tabelite ja muu lisamiseks dialoogikaste',
+ 'wikieditor-toolbar-dialogs-preference' => 'Kasuta viisardeid tabelite lisamisel ning otsi- ja asendusfunktsiooni jaoks',
'wikieditor-toolbar-hidesig' => 'Peida põhinimeruumi lehekülgedel allkirjanupp',
'wikieditor-toolbar-loading' => 'Laadimine...',
'wikieditor-toolbar-tool-bold' => 'Rasvane',
@@ -8157,6 +8229,7 @@ $messages['et'] = array(
'wikieditor-toolbar-tool-link-int-target-status-invalid' => 'Vigane pealkiri',
'wikieditor-toolbar-tool-link-int-target-status-external' => 'Välislink',
'wikieditor-toolbar-tool-link-int-target-status-loading' => 'Lehekülje olemasolu kindlakstegemine...',
+ 'wikieditor-toolbar-tool-link-int-target-status-disambig' => 'Täpsustuslehekülg',
'wikieditor-toolbar-tool-link-int-invalid' => 'Määratud pealkiri on vigane.',
'wikieditor-toolbar-tool-link-lookslikeinternal' => 'Paistab, et sisestatud internetiaadress viitab teisele vikileheküljele.
Kas soovid sellest siselingi teha?',
@@ -8366,7 +8439,7 @@ $messages['eu'] = array(
'wikieditor-publish-button-publish' => 'Argitaratu',
'wikieditor-publish-button-cancel' => 'Utzi',
'wikieditor-publish-dialog-title' => '{{SITENAME}}era argitaratu',
- 'wikieditor-publish-dialog-summary' => 'Laburpena (Egindako aldaketak laburki azaldu):',
+ 'wikieditor-publish-dialog-summary' => 'Laburpena (azaldu itzazu egin dituzun aldaketak, laburki):',
'wikieditor-publish-dialog-minor' => 'Aldaketa txikia',
'wikieditor-publish-dialog-watch' => 'Orrialde hau jarraitu',
'wikieditor-publish-dialog-publish' => 'Argitaratu',
@@ -8382,7 +8455,7 @@ $messages['eu'] = array(
'wikieditor-toolbar' => 'Tresna-barra aldatzen',
'wikieditor-toolbar-desc' => 'Orrialdeko editatzeko barra aldatu era erabilgarritasun hobetuarekin',
'wikieditor-toolbar-preference' => 'Editatzeko tresna barra hobetua gaitu',
- 'wikieditor-toolbar-dialogs-preference' => 'Elkarrizketa kutxak gaitu loturak, taula eta bestelakoak sartzeko',
+ 'wikieditor-toolbar-dialogs-preference' => 'Elkarrizketa kutxak gaitu loturak, taula eta bestelakoak sartzeko', # Fuzzy
'wikieditor-toolbar-loading' => 'Kargatzen...',
'wikieditor-toolbar-tool-bold' => 'Lodia',
'wikieditor-toolbar-tool-bold-example' => 'Letra lodiko testua',
@@ -8596,12 +8669,12 @@ $messages['fa'] = array(
'wikieditor' => 'رابط ویرایش پیشرÙته ویکی‌متن',
'wikieditor-desc' => 'یک رابط ویرایش پیشرÙته ویکی‌متن Ùˆ چندین پودمان دارای قابلیت Ùراهم می‌کند',
'wikieditor-wikitext-tab' => 'ویکی‌متن',
- 'wikieditor-loading' => 'در حال بارگیری',
+ 'wikieditor-loading' => 'در حال بارگیری...',
'wikieditor-preview-preference' => 'Ùعال‌سازی پیش‌نمایش کنار یک دیگر',
'wikieditor-preview-tab' => 'پیش‌نمایش',
'wikieditor-preview-changes-tab' => 'تغییرها',
'wikieditor-preview-loading' => 'در حال بارگیری...',
- 'wikieditor-previewDialog-preference' => 'Ùعال کردن پنجره‌های تعاملی پیش‌نمایش',
+ 'wikieditor-previewDialog-preference' => 'Ùعال‌کردن پنجره‌های تعاملی پیش‌نمایش',
'wikieditor-previewDialog-tab' => 'پیش‌نمایش',
'wikieditor-previewDialog-loading' => 'در حال بارگیری...',
'wikieditor-publish-preference' => 'Ùعال‌سازی انتشار گام‌به‌گام',
@@ -8624,7 +8697,7 @@ $messages['fa'] = array(
'wikieditor-toolbar' => 'نوار ابزار ویرایش',
'wikieditor-toolbar-desc' => 'نوار ابزار ویرایش صÙحه با استÙاده‌پذیری بالاتر',
'wikieditor-toolbar-preference' => 'Ùعال‌کردن نوارابزار ویرایش پیشرÙته',
- 'wikieditor-toolbar-dialogs-preference' => 'Ùعال‌سازی پنجره‌های تعاملی برای وارد کردن پیوندها، جدول‌ها Ùˆ غیره',
+ 'wikieditor-toolbar-dialogs-preference' => 'Ùعال‌سازی پنجره‌های تعاملی برای وارد کردن پیوندها، جدول‌ها همراه با دستور جستجو Ùˆ جایگزینی',
'wikieditor-toolbar-hidesig' => 'نهÙتن دکمهٔ امضا از صÙحه‌های Ùضای نام اصلی',
'wikieditor-toolbar-loading' => 'در حال بارگیری...',
'wikieditor-toolbar-tool-bold' => 'پررنگ',
@@ -8652,6 +8725,7 @@ $messages['fa'] = array(
'wikieditor-toolbar-tool-link-int-target-status-invalid' => 'عنوان نادرست',
'wikieditor-toolbar-tool-link-int-target-status-external' => 'پیوند به بیرون',
'wikieditor-toolbar-tool-link-int-target-status-loading' => 'بررسی وجود داشتن صÙحه...',
+ 'wikieditor-toolbar-tool-link-int-target-status-disambig' => 'صÙحهٔ ابهام‌زدائی',
'wikieditor-toolbar-tool-link-int-invalid' => 'عنوان تعیین‌شده نامعتبر است.',
'wikieditor-toolbar-tool-link-lookslikeinternal' => 'نشانی اینترنتی Ú©Ù‡ وارد کردید به Ø´Ú©Ù„ÛŒ است Ú©Ù‡ نمایانگر یک پیوند به صÙحه‌ای داخل ویکی است. آیا می‌خواهید آن را به یک پیوند داخلی تبدیل کنید؟',
'wikieditor-toolbar-tool-link-lookslikeinternal-int' => 'پیوند داخلی',
@@ -8733,7 +8807,7 @@ $1:مثال.jpg|عنوان ۲',
'wikieditor-toolbar-tool-table-preview' => 'پیش‌نمایش',
'wikieditor-toolbar-tool-table-insert' => 'اÙزودن',
'wikieditor-toolbar-tool-table-cancel' => 'لغو',
- 'wikieditor-toolbar-tool-table-toomany' => 'اضاÙÙ‡ کردن جدولی با بیش از $1 خانه توسط این ابزار ممکن نیست.', # Fuzzy
+ 'wikieditor-toolbar-tool-table-toomany' => 'اضاÙÙ‡ کردن جدولی با بیش از Û±Û°Û°Û° خانه توسط این ابزار ممکن نیست.',
'wikieditor-toolbar-tool-table-invalidnumber' => 'شما عدد درستی برای تعداد ردیÙ‌ها Ùˆ ستون‌ها وارد نکرده‌اید.',
'wikieditor-toolbar-tool-table-zero' => 'شما نمی‌توانید جدولی با صÙر ردی٠یا ستون اضاÙÙ‡ کنید.',
'wikieditor-toolbar-tool-replace' => 'یاÙتن Ùˆ جایگزین کردن',
@@ -8747,7 +8821,7 @@ $1:مثال.jpg|عنوان ۲',
'wikieditor-toolbar-tool-replace-button-replaceall' => 'جایگزین کردن همه موارد',
'wikieditor-toolbar-tool-replace-close' => 'بستن',
'wikieditor-toolbar-tool-replace-nomatch' => 'جستجوی شما با هیچ موردی مطابقت نداشت.',
- 'wikieditor-toolbar-tool-replace-success' => '$1 جایگزینی انجام شد.', # Fuzzy
+ 'wikieditor-toolbar-tool-replace-success' => '$1 {{PLURAL:$1|جایگزینی|جایگزینی}} انجام شد.',
'wikieditor-toolbar-tool-replace-emptysearch' => 'شما چیزی برای جستجو وارد نکردید.',
'wikieditor-toolbar-tool-replace-invalidregex' => 'عبارت باقاعده‌ای که وارد کردید مجاز نیست: $1',
'wikieditor-toolbar-section-characters' => 'نویسه‌های ویژه',
@@ -8759,7 +8833,7 @@ $1:مثال.jpg|عنوان ۲',
'wikieditor-toolbar-characters-page-cyrillic' => 'سیریلیک',
'wikieditor-toolbar-characters-page-arabic' => 'عربی',
'wikieditor-toolbar-characters-page-arabicextended' => 'عربی گسترش‌یاÙته',
- 'wikieditor-toolbar-characters-page-persian' => 'پارسی',
+ 'wikieditor-toolbar-characters-page-persian' => 'Ùارسی',
'wikieditor-toolbar-characters-page-hebrew' => 'عبری',
'wikieditor-toolbar-characters-page-bangla' => 'بنگالی',
'wikieditor-toolbar-characters-page-tamil' => 'تامیلی',
@@ -8844,6 +8918,7 @@ $1:مثال.jpg|عنوان ۲',
* @author Nedergard
* @author Nike
* @author Olli
+ * @author Pxos
* @author Silvonen
* @author Str4nd
* @author Stryn
@@ -8882,7 +8957,7 @@ $messages['fi'] = array(
'wikieditor-toolbar' => 'Työkalupalkki muokkaukseen',
'wikieditor-toolbar-desc' => 'Muokkaussivun työkalupalkki paremmalla käytettävyydellä.',
'wikieditor-toolbar-preference' => 'Ota käyttöön parannettu työkalupalkki muokkauksissa',
- 'wikieditor-toolbar-dialogs-preference' => 'Ota käyttöön valintatoiminto, jonka avulla voit lisätä linkkejä, taulukoita ja muuta',
+ 'wikieditor-toolbar-dialogs-preference' => 'Ota käyttöön valintatoiminto, jonka avulla voit lisätä linkkejä, taulukoita ja muuta', # Fuzzy
'wikieditor-toolbar-hidesig' => 'Piilota allekirjoituspainike sivuilta päänimiavaruudessa',
'wikieditor-toolbar-loading' => 'Ladataan…',
'wikieditor-toolbar-tool-bold' => 'Lihavointi',
@@ -8910,6 +8985,7 @@ $messages['fi'] = array(
'wikieditor-toolbar-tool-link-int-target-status-invalid' => 'Virheellinen otsikko',
'wikieditor-toolbar-tool-link-int-target-status-external' => 'Ulkoinen linkki',
'wikieditor-toolbar-tool-link-int-target-status-loading' => 'Tarkastetaan sivun olemassaolo…',
+ 'wikieditor-toolbar-tool-link-int-target-status-disambig' => 'Täsmennyssivu',
'wikieditor-toolbar-tool-link-int-invalid' => 'Antamasi otsikko on virheellinen.',
'wikieditor-toolbar-tool-link-lookslikeinternal' => 'URL-osoite, jonka annoit näyttää siltä kuin se olisi linkki toiselle wikisivulle.
Haluatko tehdä siitä sisäisen linkin?',
@@ -9108,6 +9184,7 @@ $1:Esimerkki.jpg|Kuvateksti2',
* @author PieRRoMaN
* @author Urhixidur
* @author Verdy p
+ * @author Wyz
* @author Zetud
*/
$messages['fr'] = array(
@@ -9130,7 +9207,7 @@ $messages['fr'] = array(
'wikieditor-publish-dialog-minor' => 'Modification mineure',
'wikieditor-publish-dialog-watch' => 'Suivre cette page',
'wikieditor-publish-dialog-publish' => 'Publier',
- 'wikieditor-publish-dialog-goback' => 'Revenir en arrière',
+ 'wikieditor-publish-dialog-goback' => 'Retour',
'wikieditor-template-editor-preference' => 'Activer la modification à base de formulaires des modèles wiki',
'wikieditor-template-editor-dialog-title' => 'Modifier le modèle',
'wikieditor-template-editor-dialog-submit' => 'Mettre à jour',
@@ -9142,7 +9219,7 @@ $messages['fr'] = array(
'wikieditor-toolbar' => 'Barre d’outils de modification',
'wikieditor-toolbar-desc' => 'Barre d’outils de modification avec l’utilisabilité améliorée',
'wikieditor-toolbar-preference' => 'Activer la barre d’outils améliorée',
- 'wikieditor-toolbar-dialogs-preference' => 'Activer les boîtes de dialogue pour ajouter des liens, des tableaux et plus',
+ 'wikieditor-toolbar-dialogs-preference' => 'Activer les assistants pour ajouter des liens, des tableaux ainsi que la fonction de recherche et remplacement',
'wikieditor-toolbar-hidesig' => "Masquer le bouton de signature dans les pages de l'espace de noms principal",
'wikieditor-toolbar-loading' => 'Chargement...',
'wikieditor-toolbar-tool-bold' => 'Gras',
@@ -9170,6 +9247,7 @@ $messages['fr'] = array(
'wikieditor-toolbar-tool-link-int-target-status-invalid' => 'Titre invalide',
'wikieditor-toolbar-tool-link-int-target-status-external' => 'Lien externe',
'wikieditor-toolbar-tool-link-int-target-status-loading' => 'Vérification de l’existence de la page...',
+ 'wikieditor-toolbar-tool-link-int-target-status-disambig' => 'Page d’homonymie',
'wikieditor-toolbar-tool-link-int-invalid' => 'Le titre que vous avez spécifié est incorrect.',
'wikieditor-toolbar-tool-link-lookslikeinternal' => 'L’URL que vous avez spécifiée semble mener à une autre page du wiki.
Voulez-vous utiliser un lien interne à la place ?',
@@ -9390,7 +9468,7 @@ $messages['frp'] = array(
'wikieditor-toolbar' => 'Bârra d’outils d’èdicion',
'wikieditor-toolbar-desc' => 'Bârra d’outils d’èdicion avouéc l’utilisabilitât mèlyorâ',
'wikieditor-toolbar-preference' => 'Activar la bârra d’outils d’èdicion mèlyorâ',
- 'wikieditor-toolbar-dialogs-preference' => 'Activar les bouètes de dialogo por apondre des lims, des tablôs et ples',
+ 'wikieditor-toolbar-dialogs-preference' => 'Activar les bouètes de dialogo por apondre des lims, des tablôs et ples', # Fuzzy
'wikieditor-toolbar-hidesig' => 'Cachiér lo boton de signatura dens les pâges de l’èspâço de noms principâl',
'wikieditor-toolbar-loading' => 'Chargement...',
'wikieditor-toolbar-tool-bold' => 'Grâs',
@@ -9659,6 +9737,7 @@ $messages['ga'] = array(
/** Scottish Gaelic (Gàidhlig)
* @author Akerbeltz
+ * @author Shirayuki
*/
$messages['gd'] = array(
'wikieditor' => 'Eadar-aghaidh deasachadh wikitext adhartach',
@@ -9692,7 +9771,7 @@ $messages['gd'] = array(
'wikieditor-toolbar' => 'Am bàr-inneil deasachaidh',
'wikieditor-toolbar-desc' => 'Am bàr-inneil deasachaidh le comasan a bharrachd',
'wikieditor-toolbar-preference' => 'Cuir am bàr-inneil le comasan a bharrachd an comas',
- 'wikieditor-toolbar-dialogs-preference' => 'Cuir an comas na còmhraidhean airson ceanglaichean, clàir is rudan eile a chur a-steach',
+ 'wikieditor-toolbar-dialogs-preference' => 'Cuir an comas na draoidhean airson ceanglaichean, clàran agus am foincsean airson lorg a dhèanamh no rudan a chur an àite rudan eile',
'wikieditor-toolbar-loading' => "'Ga luchdadh...",
'wikieditor-toolbar-tool-bold' => 'Trom',
'wikieditor-toolbar-tool-bold-example' => 'Teacs trom',
@@ -9919,7 +9998,7 @@ $messages['gl'] = array(
'wikieditor-toolbar' => 'Barra de ferramentas de edición',
'wikieditor-toolbar-desc' => 'Editar a páxina da barra de ferramentas cunha mellor usabilidade',
'wikieditor-toolbar-preference' => 'Activar a barra de ferramentas de edición mellorada',
- 'wikieditor-toolbar-dialogs-preference' => 'Activar os diálogos para engadir ligazóns, táboas e máis',
+ 'wikieditor-toolbar-dialogs-preference' => 'Activar os diálogos para engadir ligazóns, táboas, así como a función de buscar e substituír',
'wikieditor-toolbar-hidesig' => 'Agochar o botón de sinatura nas páxinas do espazo de nomes principal',
'wikieditor-toolbar-loading' => 'Cargando...',
'wikieditor-toolbar-tool-bold' => 'Negra',
@@ -9947,6 +10026,7 @@ $messages['gl'] = array(
'wikieditor-toolbar-tool-link-int-target-status-invalid' => 'Título non válido',
'wikieditor-toolbar-tool-link-int-target-status-external' => 'Ligazón externa',
'wikieditor-toolbar-tool-link-int-target-status-loading' => 'Comprobando a existencia da páxina...',
+ 'wikieditor-toolbar-tool-link-int-target-status-disambig' => 'Páxina de homónimos',
'wikieditor-toolbar-tool-link-int-invalid' => 'O título que especificou non é válido.',
'wikieditor-toolbar-tool-link-lookslikeinternal' => 'O enderezo URL que especificou semella ser unha ligazón cara a outra páxina do wiki.
Quere converter ese enderezo nunha ligazón interna?',
@@ -10263,7 +10343,7 @@ $messages['gsw'] = array(
'wikieditor-toolbar' => 'Wärchzygchäschtli bearbeite',
'wikieditor-toolbar-desc' => 'Wärchzygchäschtli mit ere verbesserete Benutzerfrejndligkeit bearbeite',
'wikieditor-toolbar-preference' => 'Verbesseret Bearbeitigs-Wärchzygchäschtli meglig mache',
- 'wikieditor-toolbar-dialogs-preference' => 'Dialog aktiviere zum Links, Tabälle usw. yysetze',
+ 'wikieditor-toolbar-dialogs-preference' => 'Dialog aktiviere zum Links, Tabälle usw. yysetze', # Fuzzy
'wikieditor-toolbar-hidesig' => 'Dr Unterschriftebutton bi Syte im Artikelnamensruum uusblände',
'wikieditor-toolbar-loading' => 'Am Lade ...',
'wikieditor-toolbar-tool-bold' => 'Fätt',
@@ -10510,7 +10590,7 @@ $messages['gu'] = array(
'wikieditor-toolbar' => 'ફેરફાર સાધન કંપાસ',
'wikieditor-toolbar-desc' => 'પૃષà«àª àª¨àª¾ ફેરફાર સાધનો ને વધારેલ વપરાશ સાધનો ધરાવતી પેટી ઉમેરી મà«àª•à«‹',
'wikieditor-toolbar-preference' => 'અદà«àª¯àª¤àª¨ સંપાદન સાધનો સકà«àª°à«€àª¯ કરો',
- 'wikieditor-toolbar-dialogs-preference' => 'કડીઓ, કોઠા અને અનà«àª¯ વસà«àª¤à«àª“ ઉમેરવા સંભાષણ સકà«àª°à«€àª¯ કરો',
+ 'wikieditor-toolbar-dialogs-preference' => 'કડીઓ, કોઠા અને અનà«àª¯ વસà«àª¤à«àª“ ઉમેરવા સંભાષણ સકà«àª°à«€àª¯ કરો', # Fuzzy
'wikieditor-toolbar-hidesig' => 'મà«àª–à«àª¯ નામ સà«àª¥àª³ પરના પાના પરથી હસà«àª¤àª¾àª•à«àª·àª° બટન હટાવો',
'wikieditor-toolbar-loading' => 'લવાઇ રહà«àª¯à«àª‚ છે...',
'wikieditor-toolbar-tool-bold' => 'ઘાટà«àª‚',
@@ -10748,7 +10828,7 @@ $messages['gv'] = array(
'wikieditor-toolbar' => 'Barr greieyn reaghey',
'wikieditor-toolbar-desc' => 'Barr greieyn reaghey tooilley yn-ymmydey',
'wikieditor-toolbar-preference' => 'Lhiggey da barr greieyn reaghey tooilley yn-ymmydey',
- 'wikieditor-toolbar-dialogs-preference' => 'Lhiggey da kishtaghyn cooney dys cur stiagh kianglaghyn, taabylyn as reddyn elley',
+ 'wikieditor-toolbar-dialogs-preference' => 'Lhiggey da kishtaghyn cooney dys cur stiagh kianglaghyn, taabylyn as reddyn elley', # Fuzzy
'wikieditor-toolbar-loading' => 'Laadey...',
'wikieditor-toolbar-tool-bold' => 'Trome',
'wikieditor-toolbar-tool-bold-example' => 'Teks trome',
@@ -10997,7 +11077,7 @@ $messages['he'] = array(
'wikieditor-toolbar' => 'סרגל עריכה',
'wikieditor-toolbar-desc' => 'הרחבת השמישות של סרגל עריכת הדף',
'wikieditor-toolbar-preference' => 'הפעלת סרגל עריכה משופר',
- 'wikieditor-toolbar-dialogs-preference' => 'הפעלת תיבות דו־שיח להוספת קישורי×, טבל×ות ועוד',
+ 'wikieditor-toolbar-dialogs-preference' => 'הפעלת ××©×¤×™× ×œ×”×•×¡×¤×ª ×§×™×©×•×¨×™× ×•×˜×‘×œ×ות וכפתור חיפוש והחלפה',
'wikieditor-toolbar-hidesig' => '×œ×”×—×‘×™× ×ת כפתור החתימה ×ž×”×“×¤×™× ×‘×ž×¨×—×‘ הר×שי',
'wikieditor-toolbar-loading' => 'בטעינה...',
'wikieditor-toolbar-tool-bold' => 'הדגשה',
@@ -11025,6 +11105,7 @@ $messages['he'] = array(
'wikieditor-toolbar-tool-link-int-target-status-invalid' => 'כותרת בלתי תקינה',
'wikieditor-toolbar-tool-link-int-target-status-external' => 'קישור חיצוני',
'wikieditor-toolbar-tool-link-int-target-status-loading' => 'בדיקה ×”×× ×”×“×£ קיי×...',
+ 'wikieditor-toolbar-tool-link-int-target-status-disambig' => 'דף פירושוני×',
'wikieditor-toolbar-tool-link-int-invalid' => 'הכותרת שצוינה ××™× ×” תקינה.',
'wikieditor-toolbar-tool-link-lookslikeinternal' => 'הכתובת ×©×¦×™×™× ×ª× × ×¨×ית ×›×ילו ×”×™× ×ž×™×•×¢×“×ª לקשר לדף ×חר בוויקי. ×”×× ×‘×¨×¦×•× ×›× ×œ×”×¤×•×š ×–×ת לקישור פנימי?',
'wikieditor-toolbar-tool-link-lookslikeinternal-int' => 'קישור פנימי',
@@ -11443,8 +11524,10 @@ $messages['hif-latn'] = array(
/** Croatian (hrvatski)
* @author Bugoslav
+ * @author Eleassar
* @author Ex13
* @author Excaliboor
+ * @author MaGa
* @author Roberta F.
* @author SpeedyGonsales
*/
@@ -11463,7 +11546,7 @@ $messages['hr'] = array(
'wikieditor-publish-preference' => 'Omogućiti korak-po-korak izdavanje',
'wikieditor-publish-button-publish' => 'Objaviti',
'wikieditor-publish-button-cancel' => 'Odustani',
- 'wikieditor-publish-dialog-title' => 'Objavi na {{SITENAME}}',
+ 'wikieditor-publish-dialog-title' => 'Objavi na {{GRAMMAR:dajalnik|{{SITENAME}}}}',
'wikieditor-publish-dialog-summary' => 'Uredi sažetak (kratko opiÅ¡ite promjene koje ste uÄinili):',
'wikieditor-publish-dialog-minor' => 'Manja promjena',
'wikieditor-publish-dialog-watch' => 'Prati ovu stranicu',
@@ -11480,7 +11563,7 @@ $messages['hr'] = array(
'wikieditor-toolbar' => 'Alatna vrpca',
'wikieditor-toolbar-desc' => 'Alatna vrpca za uređivanje s poboljšanom uporabljivošću',
'wikieditor-toolbar-preference' => 'Omogući poboljšanu alatnu traku',
- 'wikieditor-toolbar-dialogs-preference' => 'Dopusti upitnike za unos veza, tablica i ostalog',
+ 'wikieditor-toolbar-dialogs-preference' => 'Dopusti upitnike za unos veza, tablica i ostalog', # Fuzzy
'wikieditor-toolbar-hidesig' => 'Sakrij gumb potpisa sa stranica u glavnom imenskom prostoru',
'wikieditor-toolbar-loading' => 'UÄitavam...',
'wikieditor-toolbar-tool-bold' => 'Podebljano',
@@ -11519,7 +11602,7 @@ $messages['hr'] = array(
'wikieditor-toolbar-tool-reference' => 'Bilješke',
'wikieditor-toolbar-tool-reference-example' => 'Umetni tekst fusnote ovdje',
'wikieditor-toolbar-tool-reference-cancel' => 'Odustani',
- 'wikieditor-toolbar-tool-reference-title' => 'Umetni poveznicu',
+ 'wikieditor-toolbar-tool-reference-title' => 'Umetni izvor',
'wikieditor-toolbar-tool-reference-insert' => 'Umetni',
'wikieditor-toolbar-tool-reference-text' => 'Referentni tekst',
'wikieditor-toolbar-tool-signature' => 'Potpis i datum',
@@ -11711,7 +11794,7 @@ $messages['hsb'] = array(
'wikieditor-toolbar' => 'Gratowa lajsta za wobdźěłowanje',
'wikieditor-toolbar-desc' => 'Gratowa lajsta za wobdźěłowanje stronow z polěpšenej wužiwajomnosću',
'wikieditor-toolbar-preference' => 'Polěpšenu gratowu lajstu za wobdźěłowanje aktiwizować',
- 'wikieditor-toolbar-dialogs-preference' => 'Dialogi za zasunjenje wotkazow, tabelow a hinašeho zmóžnić',
+ 'wikieditor-toolbar-dialogs-preference' => 'Dialogi za zasunjenje wotkazow, tabelow a hinašeho zmóžnić', # Fuzzy
'wikieditor-toolbar-hidesig' => 'Podpisowe tłóÄatko w stronach we hÅ‚ownym mjenowym rumje schować',
'wikieditor-toolbar-loading' => 'ÄŒita so...',
'wikieditor-toolbar-tool-bold' => 'TuÄny',
@@ -11965,7 +12048,7 @@ $messages['hu'] = array(
'wikieditor-toolbar' => 'Szerkesztő-eszköztár',
'wikieditor-toolbar-desc' => 'Használhatóbb szerkesztő eszköztár',
'wikieditor-toolbar-preference' => 'Fejlettebb szerkesztő-eszköztár használata',
- 'wikieditor-toolbar-dialogs-preference' => 'Párbeszédablakok engedélyezése hivatkozások, táblázatok és egyebek beillesztéséhez',
+ 'wikieditor-toolbar-dialogs-preference' => 'Párbeszédablakok engedélyezése hivatkozások, táblázatok és egyebek beillesztéséhez', # Fuzzy
'wikieditor-toolbar-hidesig' => 'Aláírás gomb elrejtése a szócikknévtérben',
'wikieditor-toolbar-loading' => 'Betöltés…',
'wikieditor-toolbar-tool-bold' => 'Félkövér',
@@ -12180,8 +12263,10 @@ $1:Példa.jpg|képaláírás2',
* @author Xelgen
*/
$messages['hy'] = array(
- 'wikieditor-preview-preference' => 'Ô±Õ¯Õ¿Õ«Õ¾Õ¡ÖÕ¶Õ¥Õ¬ կողք–կողքի Õ¶Õ¡Õ­Õ¡Õ¤Õ«Õ¿Õ¸Ö‚Õ´Õ¨',
+ 'wikieditor-loading' => 'Բեռնվում է…',
+ 'wikieditor-preview-preference' => 'Õ„Õ«Õ¡ÖÕ¶Õ¥Õ¬ կողք–կողքի Õ¶Õ¡Õ­Õ¡Õ¤Õ«Õ¿Õ¸Ö‚Õ´Õ¨',
'wikieditor-preview-tab' => 'Õ†Õ¡Õ­Õ¡Õ¤Õ«Õ¿Õ¥Õ¬',
+ 'wikieditor-preview-changes-tab' => 'Õ“Õ¸ÖƒÕ¸Õ­Õ¸Ö‚Õ©ÕµÕ¸Ö‚Õ¶Õ¶Õ¥Ö€',
'wikieditor-preview-loading' => 'Բեռնում…',
'wikieditor-previewDialog-tab' => 'Õ†Õ¡Õ­Õ¡Õ¤Õ«Õ¿Õ¥Õ¬',
'wikieditor-previewDialog-loading' => 'Բեռնում…',
@@ -12193,13 +12278,17 @@ $messages['hy'] = array(
'wikieditor-publish-dialog-watch' => 'Õ€Õ½Õ¯Õ¥Õ¬ Õ¡ÕµÕ½ Õ§Õ»Õ¨',
'wikieditor-publish-dialog-publish' => 'Õ€Ö€Õ¡Õ¿Õ¡Ö€Õ¡Õ¯Õ¥Õ¬',
'wikieditor-publish-dialog-goback' => 'Õ€Õ¥Õ¿ Õ£Õ¶Õ¡Õ¬',
+ 'wikieditor-template-editor-dialog-title' => 'Ô½Õ´Õ¢Õ¡Õ£Ö€Õ¥Õ¬ Õ¯Õ¡Õ²Õ¡ÕºÕ¡Ö€Õ¨',
+ 'wikieditor-template-editor-dialog-submit' => 'Ô¹Õ¡Ö€Õ´Õ¡ÖÕ¶Õ¥Õ¬',
+ 'wikieditor-template-editor-dialog-cancel' => 'Ô²Õ¥Õ¯Õ¡Õ¶Õ¥Õ¬',
'wikieditor-toc-preference' => 'Ô±Õ¯Õ¿Õ«Õ¾Õ¡ÖÕ¶Õ¥Õ¬ Õ¶Õ¡Õ¾Õ¡Ö€Õ¯Õ¥Õ¬Õ« Õ¢Õ¸Õ¾Õ¡Õ¶Õ¤Õ¡Õ¯Õ¸Ö‚Õ©ÕµÕ¡Õ¶ ÖÕ¡Õ¶Õ¯',
'wikieditor-toc-show' => 'Õ‘Õ¸Ö‚ÖÕ¡Õ¤Ö€Õ¥Õ¬ Õ¢Õ¸Õ¾Õ¡Õ¶Õ¤Õ¡Õ¯Õ¸Ö‚Õ©ÕµÕ¸Ö‚Õ¶Õ¨',
'wikieditor-toc-hide' => 'Ô¹Õ¡Ö„ÖÕ¶Õ¥Õ¬ Õ¢Õ¸Õ¾Õ¡Õ¶Õ¤Õ¡Õ¯Õ¸Ö‚Õ©ÕµÕ¸Ö‚Õ¶Õ¨',
'wikieditor-toolbar' => 'Ô½Õ´Õ¢Õ¡Õ£Ö€Õ´Õ¡Õ¶ Õ¾Õ¡Õ°Õ¡Õ¶Õ¡Õ¯',
'wikieditor-toolbar-desc' => 'Ô²Õ¡Ö€Õ±Ö€Õ¡ÖÖ€Õ¡Õ® Õ°Õ¡Ö€Õ´Õ¡Ö€Õ¡Õ¾Õ¥Õ¿Õ¸Ö‚Õ©ÕµÕ¡Õ´Õ¢ Õ­Õ´Õ¢Õ¡Õ£Ö€Õ´Õ¡Õ¶ Õ¾Õ¡Õ°Õ¡Õ¶Õ¡Õ¯',
'wikieditor-toolbar-preference' => 'Ô±Õ¯Õ¿Õ«Õ¾Õ¡ÖÕ¶Õ¥Õ¬ Õ¢Õ¡Ö€Õ¥Õ¬Õ¡Õ¾Õ¾Õ¡Õ® Õ­Õ´Õ¢Õ¡Õ£Ö€Õ´Õ¡Õ¶ Õ¾Õ¡Õ°Õ¡Õ¶Õ¡Õ¯Õ¨',
- 'wikieditor-toolbar-dialogs-preference' => 'Ô±Õ¯Õ¿Õ«Õ¾Õ¡ÖÕ¶Õ¥Õ¬ Õ¥Ö€Õ¯Õ­Õ¸Õ½Õ¸Ö‚Õ©ÕµÕ¸Ö‚Õ¶Õ¶Õ¥Ö€Õ¨ Õ°Õ²Õ¸Ö‚Õ´Õ¶Õ¥Ö€Õ«, Õ¡Õ²ÕµÕ¸Ö‚Õ½Õ¡Õ¯Õ¶Õ¥Ö€Õ« Ö‡ Õ¡ÕµÕ¬Õ¶Õ« Õ°Õ¡Õ´Õ¡Ö€',
+ 'wikieditor-toolbar-dialogs-preference' => 'Ô±Õ¯Õ¿Õ«Õ¾Õ¡ÖÕ¶Õ¥Õ¬ Õ¥Ö€Õ¯Õ­Õ¸Õ½Õ¸Ö‚Õ©ÕµÕ¸Ö‚Õ¶Õ¶Õ¥Ö€Õ¨ Õ°Õ²Õ¸Ö‚Õ´Õ¶Õ¥Ö€Õ«, Õ¡Õ²ÕµÕ¸Ö‚Õ½Õ¡Õ¯Õ¶Õ¥Ö€Õ« Ö‡ Õ¡ÕµÕ¬Õ¶Õ« Õ°Õ¡Õ´Õ¡Ö€', # Fuzzy
+ 'wikieditor-toolbar-hidesig' => 'Ô¹Õ¡Ö„ÖÕ¶Õ¥Õ¬ Õ½Õ¿Õ¸Ö€Õ¡Õ£Ö€Õ¸Ö‚Õ©ÕµÕ¡Õ¶ Õ¯Õ¸Õ³Õ¡Õ¯Õ¨ Õ£Õ¬Õ­Õ¡Õ¾Õ¸Ö€ Õ¡Õ¶Õ¾Õ¡Õ¶Õ¡Õ¿Õ¡Ö€Õ¡Õ®Ö„Õ« Õ§Õ»Õ¥Ö€Õ¸Ö‚Õ´',
'wikieditor-toolbar-loading' => 'Բեռնում…',
'wikieditor-toolbar-tool-bold' => 'Ô¹Õ¡Õ¾Õ¡Õ¿Õ¡Õ¼',
'wikieditor-toolbar-tool-bold-example' => 'Ô¹Õ¡Õ¾Õ¡Õ¿Õ¡Õ¼ Õ¿Õ¥Ö„Õ½Õ¿',
@@ -12234,6 +12323,16 @@ $messages['hy'] = array(
'wikieditor-toolbar-tool-link-empty' => 'Ô´Õ¸Ö‚Ö„ Õ°Õ²Õ¾Õ¥Õ¬Õ¸Ö‚ Õ¸Ö€Ö‡Õ§ Õ¢Õ¡Õ¶ Õ¹Õ¥Ö„ Õ¶Õ·Õ¥Õ¬Ö‰',
'wikieditor-toolbar-tool-file' => 'Õ†Õ¥Ö€Õ¯Õ¡Õ¼Õ¸Ö‚ÖÕ¾Õ¡Õ® Õ¶Õ«Õ·Ö„',
'wikieditor-toolbar-tool-file-example' => 'Õ•Ö€Õ«Õ¶Õ¡Õ¯.jpg',
+ 'wikieditor-toolbar-tool-file-title' => 'Ô±Õ¾Õ¥Õ¬Õ¡ÖÕ¶Õ¥Õ¬ Õ¶Õ«Õ·Ö„',
+ 'wikieditor-toolbar-file-target' => 'Նիշքի անուն․',
+ 'wikieditor-toolbar-file-caption' => 'Նկարագրություն․',
+ 'wikieditor-toolbar-file-size' => 'Չափս․',
+ 'wikieditor-toolbar-file-float' => 'Դիրք․',
+ 'wikieditor-toolbar-file-default' => '(Õ¬Õ¼Õ¥Õ¬ÕµÕ¡ÕµÕ¶)',
+ 'wikieditor-toolbar-file-format' => 'Õեսք․',
+ 'wikieditor-toolbar-file-format-none' => 'Õ¸Õ¹ Õ´Õ«',
+ 'wikieditor-toolbar-tool-file-insert' => 'Ô±Õ¾Õ¥Õ¬Õ¡ÖÕ¶Õ¥Õ¬',
+ 'wikieditor-toolbar-tool-file-cancel' => 'Ô²Õ¥Õ¯Õ¡Õ¶Õ¥Õ¬',
'wikieditor-toolbar-tool-reference' => 'Ô¾Õ¡Õ¶Õ¸Õ©Õ¡Õ£Ö€Õ¸Ö‚Õ©ÕµÕ¸Ö‚Õ¶',
'wikieditor-toolbar-tool-reference-example' => 'Ô³Ö€Õ¥Ö„ Õ¡ÕµÕ½Õ¿Õ¥Õ² Õ®Õ¡Õ¶Õ¸Õ©Õ¡Õ£Ö€Õ¸Ö‚Õ©ÕµÕ¡Õ¶ Õ¿Õ¥Ö„Õ½Õ¿Õ¨',
'wikieditor-toolbar-tool-reference-cancel' => 'Ô²Õ¥Õ¯Õ¡Õ¶Õ¥Õ¬',
@@ -12298,7 +12397,7 @@ $1:Example.jpg|Õ†Õ¯Õ¡Ö€Õ¡Õ£Ö€Õ¸Ö‚Õ©ÕµÕ¸Ö‚Õ¶2',
'wikieditor-toolbar-tool-table-preview' => 'Õ†Õ¡Õ­Õ¡Õ¤Õ«Õ¿Õ¸Ö‚Õ´',
'wikieditor-toolbar-tool-table-insert' => 'Ô±Õ¾Õ¥Õ¬Õ¡ÖÕ¶Õ¥Õ¬',
'wikieditor-toolbar-tool-table-cancel' => 'Ô²Õ¥Õ¯Õ¡Õ¶Õ¥Õ¬',
- 'wikieditor-toolbar-tool-table-toomany' => 'Ô±ÕµÕ½ Õ¥Ö€Õ¯Õ­Õ¸Õ½Õ¸Ö‚Õ©ÕµÕ¡Õ¶ Õ´Õ«Õ»Õ¸ÖÕ¸Õ¾ Õ°Õ¶Õ¡Ö€Õ¡Õ¾Õ¸Ö€ Õ¹Õ§ $1 Õ¾Õ¡Õ¶Õ¤Õ¡Õ¯Õ«Ö Õ¡Õ¾Õ¥Õ¬ Õ¾Õ¡Õ¶Õ¤Õ¡Õ¯ Õ¸Ö‚Õ¶Õ¥ÖÕ¸Õ² Õ¡Õ²ÕµÕ¸Ö‚Õ½Õ¡Õ¯ Õ½Õ¿Õ¥Õ²Õ®Õ¥Õ¬Ö‰', # Fuzzy
+ 'wikieditor-toolbar-tool-table-toomany' => 'Ô±ÕµÕ½ Õ¥Ö€Õ¯Õ­Õ¸Õ½Õ¸Ö‚Õ©ÕµÕ¡Õ¶ Õ´Õ«Õ»Õ¸ÖÕ¸Õ¾ Õ°Õ¶Õ¡Ö€Õ¡Õ¾Õ¸Ö€ Õ¹Õ§ 1000-Õ«Ö Õ¡Õ¾Õ¥Õ¬ Õ¾Õ¡Õ¶Õ¤Õ¡Õ¯ Õ¸Ö‚Õ¶Õ¥ÖÕ¸Õ² Õ¡Õ²ÕµÕ¸Ö‚Õ½Õ¡Õ¯ Õ½Õ¿Õ¥Õ²Õ®Õ¥Õ¬Ö‰',
'wikieditor-toolbar-tool-table-invalidnumber' => 'Ô´Õ¸Ö‚Ö„ Õ¹Õ¥Ö„ Õ¶Õ·Õ¥Õ¬ Õ¿Õ¸Õ²Õ¥Ö€Õ« Õ¯Õ¡Õ´ Õ½ÕµÕ¸Ö‚Õ¶Õ¡Õ¯Õ¶Õ¥Ö€Õ« Õ©Õ¸Ö‚ÕµÕ¬Õ¡Õ¿Ö€Õ¥Õ¬Õ« Ö„Õ¡Õ¶Õ¡Õ¯Ö‰',
'wikieditor-toolbar-tool-table-zero' => 'Ô´Õ¸Ö‚Ö„ Õ¹Õ¥Ö„ Õ¯Õ¡Ö€Õ¸Õ² Õ¡Õ¾Õ¥Õ¬Õ¡ÖÕ¶Õ¥Õ¬ Õ¿Õ¸Õ²Õ¥Ö€Õ« Õ¯Õ¡Õ´ Õ½ÕµÕ¸Ö‚Õ¶Õ¡Õ¯Õ¶Õ¥Ö€Õ« Õ¦Ö€Õ¸ÕµÕ¡Õ¯Õ¡Õ¶ Ö„Õ¡Õ¶Õ¡Õ¯Õ¸Ö‚Õ©ÕµÕ¡Õ´Õ¢ Õ¡Õ²ÕµÕ¸Ö‚Õ½Õ¡Õ¯Ö‰',
'wikieditor-toolbar-tool-replace' => 'ÕˆÖ€Õ¸Õ¶Õ¸Ö‚Õ´ Ö‡ ÖƒÕ¸Õ­Õ¡Ö€Õ«Õ¶Õ¸Ö‚Õ´',
@@ -12308,10 +12407,11 @@ $1:Example.jpg|Õ†Õ¯Õ¡Ö€Õ¡Õ£Ö€Õ¸Ö‚Õ©ÕµÕ¸Ö‚Õ¶2',
'wikieditor-toolbar-tool-replace-case' => 'Õ€Õ¡Õ´Õ¨Õ¶Õ¯Õ¸Ö‚Õ´ Õ¨Õ½Õ¿ Õ¿Õ¡Õ¼Õ¡Õ·Õ¡Ö€Õ« (Õ´Õ¥Õ®Õ¡Õ¿Õ¡Õ¼/ÖƒÕ¸Ö„Ö€Õ¡Õ¿Õ¡Õ¼)',
'wikieditor-toolbar-tool-replace-regex' => 'ÕˆÖ€Õ¸Õ¶Õ´Õ¡Õ¶ Õ¿Õ¸Õ²Õ¨ Õ¨Õ¶Õ¯Õ¡Õ¬Õ¥Õ¬ Õ¸Ö€ÕºÕ¥Õ½ regular expression',
'wikieditor-toolbar-tool-replace-button-findnext' => 'Ô³Õ¿Õ¶Õ¥Õ¬ Õ°Õ¡Õ»Õ¸Ö€Õ¤Õ¨',
+ 'wikieditor-toolbar-tool-replace-button-replace' => 'Õ“Õ¸Õ­Õ¡Ö€Õ«Õ¶Õ¥Õ¬',
'wikieditor-toolbar-tool-replace-button-replaceall' => 'Õ“Õ¸Õ­Õ¡Ö€Õ«Õ¶Õ¥Õ¬ Õ¢Õ¸Õ¬Õ¸Ö€Õ¨',
- 'wikieditor-toolbar-tool-replace-close' => 'Ô²Õ¥Õ¯Õ¡Õ¶Õ¥Õ¬', # Fuzzy
+ 'wikieditor-toolbar-tool-replace-close' => 'Ô²Õ¥Õ¯Õ¡Õ¶Õ¥Õ¬',
'wikieditor-toolbar-tool-replace-nomatch' => 'ÕÕ¥Ö€ Õ¸Ö€Õ¸Õ¶Õ´Õ¡Õ¶Õ¨ Õ°Õ¡Õ´Õ¡ÕºÕ¡Õ¿Õ¡Õ½Õ­Õ¡Õ¶Õ¸Õ² Õ¡Ö€Õ¤ÕµÕ¸Ö‚Õ¶Ö„Õ¶Õ¥Ö€ Õ¹Õ¥Õ¶ Õ£Õ¿Õ¶Õ¾Õ¥Õ¬Ö‰',
- 'wikieditor-toolbar-tool-replace-success' => 'Ô¿Õ¡Õ¿Õ¡Ö€Õ¾Õ¥Õ¬ Õ§ $1 ÖƒÕ¸Õ­Õ¡Ö€Õ«Õ¶Õ¸Ö‚Õ´Ö‰', # Fuzzy
+ 'wikieditor-toolbar-tool-replace-success' => 'Ô¿Õ¡Õ¿Õ¡Ö€Õ¾Õ¥Õ¬ Õ§ $1 {{PLURAL:$1|ÖƒÕ¸Õ­Õ¡Ö€Õ«Õ¶Õ¸Ö‚Õ´}}Ö‰',
'wikieditor-toolbar-tool-replace-emptysearch' => 'Ô´Õ¸Ö‚Ö„ Õ¸Ö€Õ¸Õ¶Õ¥Õ¬Õ¸Ö‚ Õ¸Ö€Ö‡Õ§ Õ¢Õ¡Õ¶ Õ¹Õ¥Ö„ Õ¶Õ·Õ¥Õ¬Ö‰',
'wikieditor-toolbar-tool-replace-invalidregex' => 'ÕÕ¥Ö€ Õ¶Õ·Õ¡Õ® regular expression-Õ¨ Õ½Õ­Õ¡Õ¬ է․ $1',
'wikieditor-toolbar-section-characters' => 'Õ€Õ¡Õ¿Õ¸Ö‚Õ¯ Õ¶Õ·Õ¡Õ¶Õ¶Õ¥Ö€',
@@ -12323,11 +12423,20 @@ $1:Example.jpg|Õ†Õ¯Õ¡Ö€Õ¡Õ£Ö€Õ¸Ö‚Õ©ÕµÕ¸Ö‚Õ¶2',
'wikieditor-toolbar-characters-page-cyrillic' => 'Ô¿Õ«Ö€Õ«Õ¬Õ«ÖÕ¡',
'wikieditor-toolbar-characters-page-arabic' => 'Ô±Ö€Õ¡Õ¢Õ¥Ö€Õ¥Õ¶',
'wikieditor-toolbar-characters-page-arabicextended' => 'Ô±Ö€Õ¡Õ¢Õ¥Ö€Õ¥Õ¶ Õ¨Õ¶Õ¤Õ¬Õ¡ÕµÕ¶Õ¾Õ¡Õ®',
+ 'wikieditor-toolbar-characters-page-persian' => 'ÕŠÕ¡Ö€Õ½Õ¯Õ¥Ö€Õ¥Õ¶',
'wikieditor-toolbar-characters-page-hebrew' => 'ÔµÕ¢Ö€Õ¡ÕµÕ¥Ö€Õ¥Õ¶',
'wikieditor-toolbar-characters-page-bangla' => 'Ô²Õ¥Õ¶Õ£Õ¡Õ¬Õ¥Ö€Õ¥Õ¶',
+ 'wikieditor-toolbar-characters-page-tamil' => 'Ô¹Õ¡Õ´Õ«Õ¬Õ¥Ö€Õ¥Õ¶',
'wikieditor-toolbar-characters-page-telugu' => 'ÕÕ¥Õ¬Õ¸Ö‚Õ£Õ¸Ö‚',
'wikieditor-toolbar-characters-page-sinhala' => 'ÕÕ«Õ¶Õ°Õ¡Õ¬Õ¥Ö€Õ¥Õ¶',
'wikieditor-toolbar-characters-page-gujarati' => 'Ô³Õ¸Ö‚Õ»Õ¡Ö€Õ¡Õ¿Õ«',
+ 'wikieditor-toolbar-characters-page-devanagari' => 'Ô´Õ¥Õ¾Õ¡Õ¶Õ£Õ¡Ö€Õ«',
+ 'wikieditor-toolbar-characters-page-thai' => 'Ô¹Õ¡ÕµÕ¥Ö€Õ¥Õ¶',
+ 'wikieditor-toolbar-characters-page-lao' => 'Ô¼Õ¡Õ¸Õ¥Ö€Õ¥Õ¶',
+ 'wikieditor-toolbar-characters-page-khmer' => 'Ô¿Õ­Õ´Õ¥Ö€',
+ 'wikieditor-toolbar-characters-endash' => 'Õ¸ Õ£Õ®Õ«Õ¯ (en dash)',
+ 'wikieditor-toolbar-characters-emdash' => 'Õ¡ Õ£Õ®Õ«Õ¯ (em dash)',
+ 'wikieditor-toolbar-characters-minus' => 'Õ°Õ¡Õ¶Õ¡Õ®Õ« Õ¶Õ·Õ¡Õ¶',
'wikieditor-toolbar-section-help' => 'Õ•Õ£Õ¶Õ¸Ö‚Õ©ÕµÕ¸Ö‚Õ¶',
'wikieditor-toolbar-help-heading-description' => 'Õ†Õ¯Õ¡Ö€Õ¡Õ£Ö€Õ¸Ö‚Õ©ÕµÕ¸Ö‚Õ¶',
'wikieditor-toolbar-help-heading-syntax' => 'Ô»Õ¶Õ¹ Õ¥Ö„ Õ°Õ¡Õ¾Õ¡Ö„Õ¸Ö‚Õ´',
@@ -12383,7 +12492,7 @@ $1:Example.jpg|Õ†Õ¯Õ¡Ö€Õ¡Õ£Ö€Õ¸Ö‚Õ©ÕµÕ¸Ö‚Õ¶2',
'wikieditor-toolbar-help-content-showreferences-description' => 'Õ‘Õ¸Ö‚ÖÕ¡Õ¤Ö€Õ¥Õ¬ Õ®Õ¡Õ¶Õ¸Õ©Õ¡Õ£Ö€Õ¸Ö‚Õ©ÕµÕ¸Ö‚Õ¶Õ¶Õ¥Ö€Õ¨',
'wikieditor-toolbar-help-content-showreferences-result' => "<ol class='references'><li id='cite_note-test-0'><b><a title='' href='#'>^</a></b> <a rel='nofollow' title='http://www.example.org' class='external text' href='#'>Õ€Õ²Õ´Õ¡Õ¶ Õ¿Õ¥Ö„Õ½Õ¿</a>, Õ°Õ¡Õ¾Õ¥Õ¬ÕµÕ¡Õ¬ Õ¿Õ¥Ö„Õ½Õ¿Ö‰</li></ol>",
'wikieditor-toolbar-help-content-signaturetimestamp-description' => 'ÕÕ¿Õ¸Ö€Õ¡Õ£Ö€Õ¸Ö‚Õ©ÕµÕ¸Ö‚Õ¶Õ¨ Õ¡Õ´Õ½Õ¡Õ©Õ¾Õ¸Õ¾',
- 'wikieditor-toolbar-help-content-signaturetimestamp-result' => "<a href='#' title='{{#special:mypage}}'>Õ„Õ¡Õ½Õ¶Õ¡Õ¯ÖÕ« Ô±Õ¶Õ¸Ö‚Õ¶</a> (<a href='#' title='{{#special:mytalk}}'>Ö„Õ¶Õ¶Õ¡Ö€Õ¯Õ¸Ö‚Õ´</a>) 15:54, 29 Õ°Õ¸Ö‚Õ¶Õ«Õ½ 2009 (UTC)",
+ 'wikieditor-toolbar-help-content-signaturetimestamp-result' => "<a href='#' title='{{#special:mypage}}'>Õ„Õ¡Õ½Õ¶Õ¡Õ¯ÖÕ« Õ¡Õ¶Õ¸Ö‚Õ¶</a> (<a href='#' title='{{#special:mytalk}}'>Ö„Õ¶Õ¶Õ¡Ö€Õ¯Õ¸Ö‚Õ´</a>) 15:54, 10 Õ°Õ¸Ö‚Õ¶Õ«Õ½ 2009 (UTC)",
'wikieditor-toolbar-help-content-signature-description' => 'ÕÕ¿Õ¸Ö€Õ¡Õ£Ö€Õ¸Ö‚Õ©ÕµÕ¸Ö‚Õ¶',
'wikieditor-toolbar-help-content-signature-result' => "<a href='#' title='{{#special:mypage}}'>Õ„Õ¡Õ½Õ¶Õ¡Õ¯ÖÕ« Ô±Õ¶Õ¸Ö‚Õ¶</a> (<a href='#' title='{{#special:mytalk}}'>Ö„Õ¶Õ¶Õ¡Ö€Õ¯Õ¸Ö‚Õ´</a>)",
'wikieditor-toolbar-help-content-indent-description' => 'Ô½Õ¸Ö€Ö„Õ«Ö',
@@ -12426,7 +12535,7 @@ $messages['ia'] = array(
'wikieditor-toolbar' => 'Instrumentario de modification',
'wikieditor-toolbar-desc' => 'Barra con instrumentos de modification con augmento de usabilitate',
'wikieditor-toolbar-preference' => 'Activar le instrumentario de modification meliorate',
- 'wikieditor-toolbar-dialogs-preference' => 'Activar dialogos pro inserer ligamines, tabulas e plus',
+ 'wikieditor-toolbar-dialogs-preference' => 'Activar dialogos pro inserer ligamines, tabulas e plus', # Fuzzy
'wikieditor-toolbar-hidesig' => 'Celar le button de signatura in paginas in le spatio de nomines principal',
'wikieditor-toolbar-loading' => 'Cargamento in curso…',
'wikieditor-toolbar-tool-bold' => 'Grasse',
@@ -12675,7 +12784,7 @@ $messages['id'] = array(
'wikieditor-toolbar' => 'Bilah alat penyuntingan',
'wikieditor-toolbar-desc' => 'Bilah alat penyuntingan dengan kebergunaan yang ditingkatkan',
'wikieditor-toolbar-preference' => 'Aktifkan bilah alat penyuntingan yang telah ditingkatkan',
- 'wikieditor-toolbar-dialogs-preference' => 'Aktifkan bantuan untuk menambahkan pranala, tabel dan lainnya',
+ 'wikieditor-toolbar-dialogs-preference' => 'Aktifkan bantuan untuk menambahkan pranala, tabel dan lainnya', # Fuzzy
'wikieditor-toolbar-hidesig' => 'Sembunyikan tombol tanda tangan dari halaman pada ruang nama utama',
'wikieditor-toolbar-loading' => 'Mengunggah...',
'wikieditor-toolbar-tool-bold' => 'Tebal',
@@ -12718,6 +12827,7 @@ Apakah Anda ingin membuatnya menjadi pranala internal?',
'wikieditor-toolbar-file-float' => 'Rata:',
'wikieditor-toolbar-file-default' => '(baku)',
'wikieditor-toolbar-file-format' => 'Format:',
+ 'wikieditor-toolbar-file-format-none' => 'tidak ada',
'wikieditor-toolbar-tool-file-insert' => 'Sisipkan',
'wikieditor-toolbar-tool-file-cancel' => 'Batal',
'wikieditor-toolbar-tool-reference' => 'Referensi',
@@ -12850,16 +12960,16 @@ $1:Contoh.jpg|Judul2',
'wikieditor-toolbar-help-content-xlink-description' => 'Pranala luar',
'wikieditor-toolbar-help-content-xlink-syntax' => '[http://www.contoh.org Label pranala]<br />[http://www.contoh.org]<br />http://www.contoh.org',
'wikieditor-toolbar-help-content-xlink-result' => "<a href='#' class='external'>Label pranala</a><br /><a href='#' class='external autonumber'>[1]</a><br /><a href='#' class='external'>http://www.contoh.org</a>",
- 'wikieditor-toolbar-help-content-heading2-description' => 'Judul bagian tingkat kedua',
+ 'wikieditor-toolbar-help-content-heading2-description' => 'Judul tingkat 2',
'wikieditor-toolbar-help-content-heading2-syntax' => '== Teks judul ==',
'wikieditor-toolbar-help-content-heading2-result' => '<h2>Teks judul</h2>',
- 'wikieditor-toolbar-help-content-heading3-description' => 'Judul bagian tingkat ketiga',
+ 'wikieditor-toolbar-help-content-heading3-description' => 'Judul tingkat 3',
'wikieditor-toolbar-help-content-heading3-syntax' => '=== Teks judul ===',
'wikieditor-toolbar-help-content-heading3-result' => '<h3>Teks judul</h3>',
- 'wikieditor-toolbar-help-content-heading4-description' => 'Judul bagian tingkat keempat',
+ 'wikieditor-toolbar-help-content-heading4-description' => 'Judul tingkat 4',
'wikieditor-toolbar-help-content-heading4-syntax' => '==== Teks judul ====',
'wikieditor-toolbar-help-content-heading4-result' => '<h4>Teks judul</h4>',
- 'wikieditor-toolbar-help-content-heading5-description' => 'Judul bagian tingkat kelima',
+ 'wikieditor-toolbar-help-content-heading5-description' => 'Judul tingkat 5',
'wikieditor-toolbar-help-content-heading5-syntax' => '===== Teks judul =====',
'wikieditor-toolbar-help-content-heading5-result' => '<h5>Teks judul</h5>',
'wikieditor-toolbar-help-content-ulist-description' => 'Daftar berpoin',
@@ -13013,7 +13123,7 @@ $messages['ilo'] = array(
'wikieditor-toolbar' => 'Ramit a baras ti panag-urnos',
'wikieditor-toolbar-desc' => 'Ramit ti baras ti panag-urnos nga addan ti napasayaat a panag-usar',
'wikieditor-toolbar-preference' => 'Pakabaelanna ti napasayaat a ramit ti baras a panag-urnos',
- 'wikieditor-toolbar-dialogs-preference' => 'Pakabaekanna dagiti panakisinnarita para iti panagisengngat kadagiti panilpo, tab-tabla ken adu pay',
+ 'wikieditor-toolbar-dialogs-preference' => 'Pakabaelanna dagiti mangngarading para iti panangisengngat kadagiti silpo, tab-tabla ken ti pay panagbiruk ken panagisukat nga annong',
'wikieditor-toolbar-hidesig' => 'Ilemmeng ti pirma a buton manipud kadagiti panid iti umuna a nagan ti lugar',
'wikieditor-toolbar-loading' => 'Agkarkarga...',
'wikieditor-toolbar-tool-bold' => 'Napuskol',
@@ -13041,6 +13151,7 @@ $messages['ilo'] = array(
'wikieditor-toolbar-tool-link-int-target-status-invalid' => 'Imbalido a titulo',
'wikieditor-toolbar-tool-link-int-target-status-external' => 'Kasilpo iti ruar',
'wikieditor-toolbar-tool-link-int-target-status-loading' => 'Kitkitaen no adda ti panid...',
+ 'wikieditor-toolbar-tool-link-int-target-status-disambig' => 'Panangilawlawag a panid',
'wikieditor-toolbar-tool-link-int-invalid' => 'Ti titulo a nainaganam ket imbalido.',
'wikieditor-toolbar-tool-link-lookslikeinternal' => 'Ti URL a nainaganam ket kasla naaramid a panilpo iti sabali a panid ti wiki.
Kayatmo nga aramiden daytoy nga akinuneg a panilpo?',
@@ -13340,7 +13451,7 @@ $messages['is'] = array(
'wikieditor-toc-hide' => 'Fela efnisyfirlit',
'wikieditor-toolbar' => 'Breytingarstika',
'wikieditor-toolbar-desc' => 'Breytingarstika með auknu notagildi',
- 'wikieditor-toolbar-dialogs-preference' => 'Virkja valmynd fyrir innsetningu tengla, taflna og fleira',
+ 'wikieditor-toolbar-dialogs-preference' => 'Virkja valmynd fyrir innsetningu tengla, taflna og fleira', # Fuzzy
'wikieditor-toolbar-hidesig' => 'Fela undirskriftar hnappinn á síðum í aðalnafnrými',
'wikieditor-toolbar-loading' => 'Hleð...',
'wikieditor-toolbar-tool-bold' => 'Feitletrað',
@@ -13592,7 +13703,7 @@ $messages['it'] = array(
'wikieditor-toolbar' => 'Barra degli strumenti di modifica',
'wikieditor-toolbar-desc' => 'Barra degli strumenti di modifica della pagina con migliorata usabilità',
'wikieditor-toolbar-preference' => 'Abilita barra degli strumenti di modifica avanzata',
- 'wikieditor-toolbar-dialogs-preference' => "Abilita le finestre per l'inserimento di link, tabelle ed altro",
+ 'wikieditor-toolbar-dialogs-preference' => "Abilita le finestre per l'inserimento di collegamenti, tabelle e la funzione di cerca e sostituisci",
'wikieditor-toolbar-hidesig' => 'Nasconde il pulsante della firma dalle pagine nel namespace principale',
'wikieditor-toolbar-loading' => 'Caricamento in corso...',
'wikieditor-toolbar-tool-bold' => 'Grassetto',
@@ -13620,6 +13731,7 @@ $messages['it'] = array(
'wikieditor-toolbar-tool-link-int-target-status-invalid' => 'Titolo non valido',
'wikieditor-toolbar-tool-link-int-target-status-external' => 'Collegamento esterno',
'wikieditor-toolbar-tool-link-int-target-status-loading' => "Controllo dell'esistenza della pagina in corso....",
+ 'wikieditor-toolbar-tool-link-int-target-status-disambig' => 'Pagina di disambiguazione',
'wikieditor-toolbar-tool-link-int-invalid' => 'Il titolo che hai specificato non è valido.',
'wikieditor-toolbar-tool-link-lookslikeinternal' => "La URL che hai indicato sembra un link verso un'altra pagina wiki.
Vuoi che sia un link interno?",
@@ -13848,7 +13960,7 @@ $messages['ja'] = array(
'wikieditor-toolbar' => '編集ツールãƒãƒ¼',
'wikieditor-toolbar-desc' => '使ã„ã‚„ã™ã•ã®å‘上ã—ãŸãƒšãƒ¼ã‚¸ç·¨é›†ãƒ„ールãƒãƒ¼',
'wikieditor-toolbar-preference' => '改良型編集ツールãƒãƒ¼ã‚’有効ã«ã™ã‚‹',
- 'wikieditor-toolbar-dialogs-preference' => 'リンクや表ãªã©ã®æŒ¿å…¥ãƒ€ã‚¤ã‚¢ãƒ­ã‚°ã‚’有効ã«ã™ã‚‹',
+ 'wikieditor-toolbar-dialogs-preference' => 'リンクや表ã®æŒ¿å…¥ã€ãŠã‚ˆã³æ¤œç´¢ã¨ç½®æ›ã®ãŸã‚ã®ã‚¦ã‚£ã‚¶ãƒ¼ãƒ‰ã‚’有効ã«ã™ã‚‹',
'wikieditor-toolbar-hidesig' => '標準åå‰ç©ºé–“ã§ç½²åボタンをéžè¡¨ç¤ºã«ã™ã‚‹',
'wikieditor-toolbar-loading' => '読ã¿è¾¼ã¿ä¸­...',
'wikieditor-toolbar-tool-bold' => '太字',
@@ -13876,6 +13988,7 @@ $messages['ja'] = array(
'wikieditor-toolbar-tool-link-int-target-status-invalid' => 'ページåã¨ã—ã¦ç„¡åŠ¹ã§ã™',
'wikieditor-toolbar-tool-link-int-target-status-external' => '外部リンク',
'wikieditor-toolbar-tool-link-int-target-status-loading' => 'ページã®å­˜åœ¨ã‚’確èªä¸­...',
+ 'wikieditor-toolbar-tool-link-int-target-status-disambig' => '曖昧ã•å›žé¿ãƒšãƒ¼ã‚¸',
'wikieditor-toolbar-tool-link-int-invalid' => '指定ã—ãŸãƒšãƒ¼ã‚¸åã¯ç„¡åŠ¹ã§ã™ã€‚',
'wikieditor-toolbar-tool-link-lookslikeinternal' => '指定ã—㟠URL ã¯åˆ¥ã®ã‚¦ã‚£ã‚­ãƒšãƒ¼ã‚¸ã¸ã®ãƒªãƒ³ã‚¯ã®ã‚ˆã†ã§ã™ã€‚
ã“れを内部リンクã«ã—ã¾ã™ã‹?',
@@ -13924,9 +14037,9 @@ $messages['ja'] = array(
'wikieditor-toolbar-tool-big-example' => '大ããªãƒ†ã‚­ã‚¹ãƒˆ',
'wikieditor-toolbar-tool-small' => 'å°',
'wikieditor-toolbar-tool-small-example' => 'å°ã•ãªãƒ†ã‚­ã‚¹ãƒˆ',
- 'wikieditor-toolbar-tool-superscript' => '上付ã文字',
+ 'wikieditor-toolbar-tool-superscript' => '上付ã',
'wikieditor-toolbar-tool-superscript-example' => '上付ã文字',
- 'wikieditor-toolbar-tool-subscript' => '下付ã文字',
+ 'wikieditor-toolbar-tool-subscript' => '下付ã',
'wikieditor-toolbar-tool-subscript-example' => '下付ã文字',
'wikieditor-toolbar-group-insert' => '挿入',
'wikieditor-toolbar-tool-gallery' => 'ç”»åƒã‚®ãƒ£ãƒ©ãƒªãƒ¼',
@@ -14107,7 +14220,7 @@ $messages['jv'] = array(
'wikieditor-toolbar' => 'Bilah prangkat panyuntingan',
'wikieditor-toolbar-desc' => 'Sunting bilah prangkat kaca mawa kagunan canggih',
'wikieditor-toolbar-preference' => 'Urubaké bilah prangkat panyuntingan canggih',
- 'wikieditor-toolbar-dialogs-preference' => 'Urubaké dialog kanggo nglebokaké pranala, tabèl lan liyané',
+ 'wikieditor-toolbar-dialogs-preference' => 'Urubaké dialog kanggo nglebokaké pranala, tabèl lan liyané', # Fuzzy
'wikieditor-toolbar-hidesig' => 'Dhelikaké pencetan tapak asta saka kaca-kaca nèng bilik jeneng utama',
'wikieditor-toolbar-loading' => 'Ngemot...',
'wikieditor-toolbar-tool-bold' => 'Kandel',
@@ -14351,7 +14464,7 @@ $messages['ka'] = array(
'wikieditor-toolbar' => 'რედáƒáƒ¥áƒ¢áƒ˜áƒ áƒ”ბის პáƒáƒœáƒ”ლი',
'wikieditor-toolbar-desc' => 'რედáƒáƒ¥áƒ¢áƒ˜áƒ áƒ”ბის პáƒáƒœáƒ”ლი გáƒáƒ£áƒ›áƒ¯áƒáƒ‘ესებული იუზáƒáƒ‘ილითით',
'wikieditor-toolbar-preference' => 'ჩáƒáƒ áƒ—ეთ რედáƒáƒ¥áƒ¢áƒ˜áƒ áƒ”ბის გáƒáƒ£áƒ›áƒ¯áƒáƒ‘ესებული პáƒáƒœáƒ”ლი',
- 'wikieditor-toolbar-dialogs-preference' => 'ჩáƒáƒ áƒ—ეთ დიáƒáƒšáƒáƒ’ები ბმულების, ტáƒáƒ‘ულებისრდრსხვრáƒáƒ‘იექტების ჩáƒáƒ¡áƒáƒ¡áƒ›áƒ”ლáƒáƒ“',
+ 'wikieditor-toolbar-dialogs-preference' => 'ბმულების, ცხრილებისრდრსხვრáƒáƒ‘იექტების ჩáƒáƒ¡áƒáƒ¡áƒ›áƒ”ლáƒáƒ“ ჩáƒáƒ áƒ—ეთ დიáƒáƒšáƒáƒ’ები', # Fuzzy
'wikieditor-toolbar-hidesig' => 'ხელმáƒáƒ¬áƒ”რის ღილáƒáƒ™áƒ˜áƒ¡ დáƒáƒ›áƒáƒšáƒ•áƒ სáƒáƒ®áƒ”ლთრსივრცის ძირითáƒáƒ“ გვერდებზე',
'wikieditor-toolbar-loading' => 'იტვირთებáƒâ€¦',
'wikieditor-toolbar-tool-bold' => 'მუქი',
@@ -14580,6 +14693,7 @@ $messages['kiu'] = array(
);
/** Kazakh (Cyrillic script) (қазақша (кирил)‎)
+ * @author Arystanbek
* @author GaiJin
* @author Kaztrans
*/
@@ -14594,13 +14708,20 @@ $messages['kk-cyrl'] = array(
'wikieditor-previewDialog-loading' => 'Күте тұр...',
'wikieditor-publish-button-publish' => 'ЖариÑлау',
'wikieditor-publish-button-cancel' => 'Болдырмау',
+ 'wikieditor-publish-dialog-title' => '{{SITENAME}} Ñайтына жариÑлау',
'wikieditor-publish-dialog-minor' => 'Шағын өңдеме',
'wikieditor-publish-dialog-watch' => 'Бұл бетті бақылау',
'wikieditor-publish-dialog-publish' => 'ЖариÑлау',
'wikieditor-publish-dialog-goback' => 'Ðртқа',
+ 'wikieditor-template-editor-dialog-title' => 'Үлгіні өңдеу',
'wikieditor-template-editor-dialog-submit' => 'Жаңарту',
'wikieditor-template-editor-dialog-cancel' => 'Болдырмау',
+ 'wikieditor-templates-preference' => 'Үлгі түруін қоÑу',
+ 'wikieditor-toc-preference' => 'Мағұлыматтар навигациÑлық кеÑтеÑін қоÑу',
+ 'wikieditor-toc-show' => 'Мазмұнды көрÑету',
+ 'wikieditor-toc-hide' => 'Мазмұнды жаÑыру',
'wikieditor-toolbar' => 'Өңдеу жақтауы',
+ 'wikieditor-toolbar-hidesig' => 'Ðегізгі еÑім кеңіÑтігіндегі беттерден қолтаңба батырмаÑын жаÑыру',
'wikieditor-toolbar-loading' => 'Жүктеуде…',
'wikieditor-toolbar-tool-bold' => 'Жуан жазу',
'wikieditor-toolbar-tool-bold-example' => 'Жуан мәтін',
@@ -14609,11 +14730,17 @@ $messages['kk-cyrl'] = array(
'wikieditor-toolbar-tool-ilink' => 'Ішкі Ñілтеме',
'wikieditor-toolbar-tool-ilink-example' => 'Сілтеме тақырыбы',
'wikieditor-toolbar-tool-xlink' => 'Сыртқы Ñілтеме (алдына http:// енгізуін ұмытпаңыз)',
- 'wikieditor-toolbar-tool-xlink-example' => 'http://www.example.com Ñілтеме тақырыбы',
+ 'wikieditor-toolbar-tool-xlink-example' => 'http://www.мыÑал.com Ñілтеме тақырыбы',
'wikieditor-toolbar-tool-link' => 'Сілтеме',
'wikieditor-toolbar-tool-link-title' => 'Сілтеме қою',
'wikieditor-toolbar-tool-link-int' => 'уики бетіне бару',
+ 'wikieditor-toolbar-tool-link-int-target' => 'ÐÑ‹Ñана беті немеÑе URL:',
+ 'wikieditor-toolbar-tool-link-int-target-tooltip' => 'Бет атауы немеÑе URL',
'wikieditor-toolbar-tool-link-int-text' => 'КөрÑетілетін мәтін:',
+ 'wikieditor-toolbar-tool-link-int-text-tooltip' => 'КөрÑетілетін мәтін',
+ 'wikieditor-toolbar-tool-link-ext' => 'Сыртқы уеб бетіне бару',
+ 'wikieditor-toolbar-tool-link-ext-target' => 'URL Ñілтеме:',
+ 'wikieditor-toolbar-tool-link-ext-text' => 'Мәтінді Ñілтеме:',
'wikieditor-toolbar-tool-link-insert' => 'Сілтеме енгізу',
'wikieditor-toolbar-tool-link-cancel' => 'Болдырмау',
'wikieditor-toolbar-tool-link-int-target-status-exists' => 'Бұл бет бар',
@@ -14624,7 +14751,19 @@ $messages['kk-cyrl'] = array(
'wikieditor-toolbar-tool-link-lookslikeinternal-int' => 'Ішкі Ñілтеме',
'wikieditor-toolbar-tool-link-lookslikeinternal-ext' => 'Сыртқы Ñілтеме',
'wikieditor-toolbar-tool-file' => 'Файл орнату',
+ 'wikieditor-toolbar-tool-file-example' => 'МыÑал.jpg',
+ 'wikieditor-toolbar-tool-file-title' => 'Файл кіріÑтіру',
+ 'wikieditor-toolbar-file-target' => 'Файл атауы:',
+ 'wikieditor-toolbar-file-caption' => 'Тақырыбы',
+ 'wikieditor-toolbar-file-size' => 'Өлшемі:',
+ 'wikieditor-toolbar-file-float' => 'Туралау:',
+ 'wikieditor-toolbar-file-default' => '(әдепкі)',
+ 'wikieditor-toolbar-file-format' => 'Пішімі:',
+ 'wikieditor-toolbar-file-format-none' => 'Ешқандай',
+ 'wikieditor-toolbar-tool-file-insert' => 'КіріÑтіру',
+ 'wikieditor-toolbar-tool-file-cancel' => 'Болдырмау',
'wikieditor-toolbar-tool-reference' => 'Дереккөз',
+ 'wikieditor-toolbar-tool-reference-example' => 'Мұнда Ñ‚Ò¯Ñірінді мәтін кіріÑÑ‚Ñ–Ñ€',
'wikieditor-toolbar-tool-reference-cancel' => 'Болдырмау',
'wikieditor-toolbar-tool-reference-title' => 'Дереккөз енгізу',
'wikieditor-toolbar-tool-reference-insert' => 'Енгізу',
@@ -14648,6 +14787,7 @@ $messages['kk-cyrl'] = array(
'wikieditor-toolbar-tool-nowiki' => 'Уики-форматтауды елемеу',
'wikieditor-toolbar-tool-nowiki-example' => 'Форматтауды қажет етпейтін мәтінді мында енгізіңіз',
'wikieditor-toolbar-tool-redirect' => 'Ðйдау',
+ 'wikieditor-toolbar-tool-redirect-example' => 'ÐÑ‹Ñана бет атауы',
'wikieditor-toolbar-tool-big' => 'Ірі жазу',
'wikieditor-toolbar-tool-big-example' => 'Ірі жазу',
'wikieditor-toolbar-tool-small' => 'Кішірек жазу',
@@ -14685,6 +14825,8 @@ $1:Example.jpg|СипаттамаÑÑ‹2',
'wikieditor-toolbar-tool-table-preview' => 'Қарап шығу',
'wikieditor-toolbar-tool-table-insert' => 'Енгізу',
'wikieditor-toolbar-tool-table-cancel' => 'Болдырмау',
+ 'wikieditor-toolbar-tool-table-invalidnumber' => 'Сіз бағандар немеÑе қатарлар бойынша жарамды нөмір енгізбедіңіз.',
+ 'wikieditor-toolbar-tool-table-zero' => 'Сіз нөлдік қатар немеÑе баған бойынша кеÑте кіріÑтіре алмайÑыз.',
'wikieditor-toolbar-tool-replace' => 'Іздеу және алмаÑтыру',
'wikieditor-toolbar-tool-replace-title' => 'Іздеу және алмаÑтыру',
'wikieditor-toolbar-tool-replace-search' => 'Іздеу:',
@@ -14696,12 +14838,28 @@ $1:Example.jpg|СипаттамаÑÑ‹2',
'wikieditor-toolbar-tool-replace-button-replaceall' => 'Барлығын алмаÑтыру',
'wikieditor-toolbar-tool-replace-close' => 'Жабу',
'wikieditor-toolbar-tool-replace-nomatch' => 'Сіздің Ñұрауыңыз бойынша еш нәрÑе табылмады.',
- 'wikieditor-toolbar-tool-replace-success' => '$1 алмаÑтыру жаÑалды.', # Fuzzy
+ 'wikieditor-toolbar-tool-replace-success' => '$1 {{PLURAL:$1|алмаÑтыру|алмаÑтырулар}} жаÑалды.',
+ 'wikieditor-toolbar-tool-replace-emptysearch' => 'Іздеу үшін ештеңе енгізбедіңіз.',
'wikieditor-toolbar-section-characters' => 'Ðрнайы таңбалар',
'wikieditor-toolbar-characters-page-latin' => 'Латын',
+ 'wikieditor-toolbar-characters-page-latinextended' => 'Кеңейтілген латын',
'wikieditor-toolbar-characters-page-symbols' => 'Белгілер',
+ 'wikieditor-toolbar-characters-page-greek' => 'Грек',
+ 'wikieditor-toolbar-characters-page-cyrillic' => 'Кирилл',
+ 'wikieditor-toolbar-characters-page-arabic' => 'Ðраб',
+ 'wikieditor-toolbar-characters-page-arabicextended' => 'Кеңейтілген араб',
+ 'wikieditor-toolbar-characters-page-persian' => 'ПарÑÑ‹',
'wikieditor-toolbar-section-help' => 'Ðнықтама',
'wikieditor-toolbar-help-heading-description' => 'СипаттамаÑÑ‹',
+ 'wikieditor-toolbar-help-heading-syntax' => 'Жазғаныңыз',
+ 'wikieditor-toolbar-help-heading-result' => 'Ðлғаныңыз',
+ 'wikieditor-toolbar-help-page-format' => 'Форматтау',
+ 'wikieditor-toolbar-help-page-link' => 'Сілтемелер',
+ 'wikieditor-toolbar-help-page-heading' => 'Бөлімдер',
+ 'wikieditor-toolbar-help-page-list' => 'Тізімдер',
+ 'wikieditor-toolbar-help-page-file' => 'Файлдар',
+ 'wikieditor-toolbar-help-page-reference' => 'Дереккөздер',
+ 'wikieditor-toolbar-help-page-discussion' => 'Талқылау',
'wikieditor-toolbar-help-content-italic-description' => 'Көлбеу жазу',
'wikieditor-toolbar-help-content-italic-syntax' => "''Көлбеу мәтін''",
'wikieditor-toolbar-help-content-italic-result' => '<em>Көлбеу мәтін</em>',
@@ -14712,7 +14870,11 @@ $1:Example.jpg|СипаттамаÑÑ‹2',
'wikieditor-toolbar-help-content-bolditalic-syntax' => "'''''Жуан көлбеу мәтін'''''",
'wikieditor-toolbar-help-content-bolditalic-result' => '<strong><em>Жуан көлбеу мәтін</em></strong>',
'wikieditor-toolbar-help-content-ilink-description' => 'Ішкі Ñілтеме',
+ 'wikieditor-toolbar-help-content-ilink-syntax' => '[[Бет атауы|Сілтеме деңгейі]]<br />[[Бет атауы]]',
+ 'wikieditor-toolbar-help-content-ilink-result' => "<a href='#'>Сілтеме деңгейі</a><br /><a href='#'>Бет атауы</a>",
'wikieditor-toolbar-help-content-xlink-description' => 'Сыртқы Ñілтеме',
+ 'wikieditor-toolbar-help-content-xlink-syntax' => '[http://www.мыÑал.org Сілтеме деңгейі]<br />[http://www.мыÑал.org]<br />http://www.мыÑал.org',
+ 'wikieditor-toolbar-help-content-xlink-result' => "<a href='#' class='external'>Сілтеме деңгейі</a><br /><a href='#' class='external autonumber'>[1]</a><br /><a href='#' class='external'>http://www.мыÑал.org</a>",
'wikieditor-toolbar-help-content-heading2-description' => '2-ші деңгейлі бөлім',
'wikieditor-toolbar-help-content-heading2-syntax' => '== Бөлім мәтіні ==',
'wikieditor-toolbar-help-content-heading2-result' => '<h2>Бөлім мәтіні</h2>',
@@ -14726,14 +14888,27 @@ $1:Example.jpg|СипаттамаÑÑ‹2',
'wikieditor-toolbar-help-content-heading5-syntax' => '===== Бөлім мәтіні =====',
'wikieditor-toolbar-help-content-heading5-result' => '<h5>Бөлім мәтіні</h5>',
'wikieditor-toolbar-help-content-ulist-description' => 'Таңбаланған тізім',
+ 'wikieditor-toolbar-help-content-ulist-syntax' => '* Элемент тізімі<br />* Элемент тізімі',
+ 'wikieditor-toolbar-help-content-ulist-result' => '<ul><li>Элемент тізімі</li><li>Элемент тізімі</li></ul>',
'wikieditor-toolbar-help-content-olist-description' => 'Ðөмірленген тізім',
+ 'wikieditor-toolbar-help-content-olist-syntax' => '# Элемент тізімі<br /># Элемент тізімі',
+ 'wikieditor-toolbar-help-content-olist-result' => '<ol><li>Элемент тізімі</li><li>Элемент тізімі</li></ol>',
'wikieditor-toolbar-help-content-file-description' => 'Файл орнату',
'wikieditor-toolbar-help-content-file-syntax' => '[[$1:Example.png|thumb|Файл тақырыбы]]',
'wikieditor-toolbar-help-content-reference-description' => 'Дереккөз',
+ 'wikieditor-toolbar-help-content-reference-syntax' => 'Бет мәтіні.&lt;ref name="test"&gt;[http://www.мыÑал.org Сілтеме мәтіні], қоÑымша мәтін.&lt;/ref&gt;',
+ 'wikieditor-toolbar-help-content-reference-result' => "Бет мәтіні.<sup><a href='#'>[1]</a></sup>",
+ 'wikieditor-toolbar-help-content-rereference-description' => 'Кейбір дереккөздердің қоÑымша қолданылуы',
+ 'wikieditor-toolbar-help-content-rereference-result' => "Бет мәтіні.<sup><a href='#'>[1]</a></sup>",
'wikieditor-toolbar-help-content-showreferences-description' => 'Дереккөзін көрÑету',
+ 'wikieditor-toolbar-help-content-showreferences-result' => "<ol class='references'><li id='cite_note-test-0'><b><a title='' href='#'>^</a></b> <a rel='nofollow' title='http://www.мыÑал.org' class='external text' href='#'>Сілтеме мәтіні</a>, қоÑымша мәтін.</li></ol>",
'wikieditor-toolbar-help-content-signaturetimestamp-description' => 'Қолтаңба және уақыт',
+ 'wikieditor-toolbar-help-content-signaturetimestamp-result' => "<a href='#' title='{{#special:mypage}}'>ҚатыÑушы еÑімі</a> (<a href='#' title='{{#special:mytalk}}'>талқылауы</a>) 15:54, 10 June 2009 (UTC)",
'wikieditor-toolbar-help-content-signature-description' => 'Қолтаңба',
+ 'wikieditor-toolbar-help-content-signature-result' => "<a href='#' title='{{#special:mypage}}'>ҚатыÑушы еÑімі</a> (<a href='#' title='{{#special:mytalk}}'>талқ</a>)",
'wikieditor-toolbar-help-content-indent-description' => 'ШегініÑ',
+ 'wikieditor-toolbar-help-content-indent-syntax' => 'Қалыпты мәтін<br />:Шегінген мәтін<br />::Шегінген мәтін',
+ 'wikieditor-toolbar-help-content-indent-result' => 'Қалыпты мәтін<dl><dd>Шегінген мәтін<dl><dd>Шегінген мәтін</dd></dl></dd></dl>',
);
/** Khmer (ភាសាážáŸ’មែរ)
@@ -14764,7 +14939,7 @@ $messages['km'] = array(
'wikieditor-toc-hide' => 'លាក់ážáŸ’លឹមសារ',
'wikieditor-toolbar' => 'របារឧបករណáŸáž€áŸ‚ប្រែ',
'wikieditor-toolbar-preference' => 'ប្រើរបារឧបករណáŸáž€áŸ‚ប្រែទំនើប',
- 'wikieditor-toolbar-dialogs-preference' => 'ប្រើផ្ទាំងពិសáŸážŸážŸáŸ†ážšáž¶áž”់បញ្ចូលážáŸ†ážŽáž—្ជាប់ ážáž¶ážšáž¶áž„ ជាដើម',
+ 'wikieditor-toolbar-dialogs-preference' => 'ប្រើផ្ទាំងពិសáŸážŸážŸáŸ†ážšáž¶áž”់បញ្ចូលážáŸ†ážŽáž—្ជាប់ ážáž¶ážšáž¶áž„ ជាដើម', # Fuzzy
'wikieditor-toolbar-loading' => 'កំពុងផ្ទុក…',
'wikieditor-toolbar-tool-bold' => 'អក្សរដិáž',
'wikieditor-toolbar-tool-bold-example' => 'អážáŸ’ážáž”ទជាអក្សរដិáž',
@@ -15014,13 +15189,13 @@ $messages['ko'] = array(
'wikieditor-publish-button-publish' => '게시',
'wikieditor-publish-button-cancel' => '취소',
'wikieditor-publish-dialog-title' => '{{SITENAME}}ì— ê²Œì‹œ',
- 'wikieditor-publish-dialog-summary' => '편집 요약 (ë¬´ì—‡ì„ íŽ¸ì§‘í–ˆëŠ”ì§€ 간략하게 설명합니다):',
+ 'wikieditor-publish-dialog-summary' => '편집 요약 (바꾼 ë‚´ìš©ì„ ê°„ëžµí•˜ê²Œ 설명하세요):',
'wikieditor-publish-dialog-minor' => '사소한 편집',
'wikieditor-publish-dialog-watch' => 'ì´ ë¬¸ì„œ 주시하기',
'wikieditor-publish-dialog-publish' => '게시',
'wikieditor-publish-dialog-goback' => 'ëŒì•„가기',
'wikieditor-template-editor-preference' => '위키 í‹€ì˜ ì–‘ì‹ ê¸°ë°˜ íŽ¸ì§‘ì„ í™œì„±í™”í•˜ê¸°',
- 'wikieditor-template-editor-dialog-title' => '틀 편집하기',
+ 'wikieditor-template-editor-dialog-title' => '틀 편집',
'wikieditor-template-editor-dialog-submit' => 'ì—…ë°ì´íŠ¸',
'wikieditor-template-editor-dialog-cancel' => '취소',
'wikieditor-templates-preference' => '틀 접기 활성화하기',
@@ -15030,7 +15205,7 @@ $messages['ko'] = array(
'wikieditor-toolbar' => '편집 툴바',
'wikieditor-toolbar-desc' => 'ì‚¬ìš©ì„±ì´ í–¥ìƒëœ 편집 툴바',
'wikieditor-toolbar-preference' => 'ê¸°ëŠ¥ì´ í–¥ìƒëœ 편집 툴바 사용하기',
- 'wikieditor-toolbar-dialogs-preference' => 'ë§í¬ì™€ í‘œ ë“±ì„ ì‚½ìž…í•  ë•Œ 대화 ìƒìž 사용하기',
+ 'wikieditor-toolbar-dialogs-preference' => 'ë§í¬ì™€ í‘œ 넣기 ë¿ë§Œ ì•„ë‹ˆë¼ ì°¾ì•„ 바꾸기 ê¸°ëŠ¥ì„ ìœ„í•œ 마법사를 활성화',
'wikieditor-toolbar-hidesig' => 'ì¼ë°˜ 문서 ì´ë¦„공간ì—ì„œ 서명 단추를 숨기기',
'wikieditor-toolbar-loading' => '불러오는 중...',
'wikieditor-toolbar-tool-bold' => 'êµµì€ ê¸€ì”¨',
@@ -15042,7 +15217,7 @@ $messages['ko'] = array(
'wikieditor-toolbar-tool-xlink' => '바깥 ë§í¬ (주소 ì•žì— http://ê°€ 있어야 합니다)',
'wikieditor-toolbar-tool-xlink-example' => 'http://www.example.com ë§í¬ ì´ë¦„',
'wikieditor-toolbar-tool-link' => 'ë§í¬',
- 'wikieditor-toolbar-tool-link-title' => 'ë§í¬ 추가',
+ 'wikieditor-toolbar-tool-link-title' => 'ë§í¬ 넣기',
'wikieditor-toolbar-tool-link-int' => '위키 문서로 연결',
'wikieditor-toolbar-tool-link-int-target' => 'ëŒ€ìƒ ë¬¸ì„œ ë˜ëŠ” URL:',
'wikieditor-toolbar-tool-link-int-target-tooltip' => '문서 제목 ë˜ëŠ” URL',
@@ -15051,13 +15226,14 @@ $messages['ko'] = array(
'wikieditor-toolbar-tool-link-ext' => '바깥 웹 페ì´ì§€ë¡œ ì—°ê²°',
'wikieditor-toolbar-tool-link-ext-target' => 'ë§í¬ URL:',
'wikieditor-toolbar-tool-link-ext-text' => 'ë§í¬ í…스트:',
- 'wikieditor-toolbar-tool-link-insert' => 'ë§í¬ 추가하기',
+ 'wikieditor-toolbar-tool-link-insert' => 'ë§í¬ 넣기',
'wikieditor-toolbar-tool-link-cancel' => '취소',
'wikieditor-toolbar-tool-link-int-target-status-exists' => '문서가 존재합니다.',
'wikieditor-toolbar-tool-link-int-target-status-notexists' => '문서가 존재하지 않습니다.',
'wikieditor-toolbar-tool-link-int-target-status-invalid' => 'ì œëª©ì´ ìž˜ëª»ë˜ì—ˆìŠµë‹ˆë‹¤.',
'wikieditor-toolbar-tool-link-int-target-status-external' => '바깥 ë§í¬',
'wikieditor-toolbar-tool-link-int-target-status-loading' => '문서가 존재하는 지 í™•ì¸ ì¤‘...',
+ 'wikieditor-toolbar-tool-link-int-target-status-disambig' => 'ë™ìŒì´ì˜ 문서',
'wikieditor-toolbar-tool-link-int-invalid' => '입력한 ì œëª©ì´ ìž˜ëª»ë˜ì—ˆìŠµë‹ˆë‹¤.',
'wikieditor-toolbar-tool-link-lookslikeinternal' => '입력한 URLì€ ë‹¤ë¥¸ 내부 ë¬¸ì„œì¼ ìˆ˜ 있습니다.
안쪽 ë§í¬ë¡œ 바꾸겠습니까?',
@@ -15066,7 +15242,7 @@ $messages['ko'] = array(
'wikieditor-toolbar-tool-link-empty' => 'ë§í¬í•  대ìƒì„ 입력하지 않았습니다.',
'wikieditor-toolbar-tool-file' => 'íŒŒì¼ ë„£ê¸°',
'wikieditor-toolbar-tool-file-example' => 'Example.jpg',
- 'wikieditor-toolbar-tool-file-title' => 'íŒŒì¼ ì¶”ê°€í•˜ê¸°',
+ 'wikieditor-toolbar-tool-file-title' => 'íŒŒì¼ ë„£ê¸°',
'wikieditor-toolbar-file-target' => 'íŒŒì¼ ì´ë¦„:',
'wikieditor-toolbar-file-caption' => '설명:',
'wikieditor-toolbar-file-size' => 'í¬ê¸°:',
@@ -15074,16 +15250,16 @@ $messages['ko'] = array(
'wikieditor-toolbar-file-default' => '(기본값)',
'wikieditor-toolbar-file-format' => '형ì‹:',
'wikieditor-toolbar-file-format-none' => 'ì—†ìŒ',
- 'wikieditor-toolbar-tool-file-insert' => '추가',
+ 'wikieditor-toolbar-tool-file-insert' => '넣기',
'wikieditor-toolbar-tool-file-cancel' => '취소',
- 'wikieditor-toolbar-tool-reference' => '주ì„',
- 'wikieditor-toolbar-tool-reference-example' => 'ì—¬ê¸°ì— ì¶œì²˜ ë‚´ìš©ì„ ì ì–´ 주세요',
+ 'wikieditor-toolbar-tool-reference' => '출처',
+ 'wikieditor-toolbar-tool-reference-example' => 'ì—¬ê¸°ì— ì£¼ì„ ë‚´ìš©ì„ ì ì–´ 주세요',
'wikieditor-toolbar-tool-reference-cancel' => '취소',
- 'wikieditor-toolbar-tool-reference-title' => 'ì£¼ì„ ì¶”ê°€',
- 'wikieditor-toolbar-tool-reference-insert' => '추가',
- 'wikieditor-toolbar-tool-reference-text' => '참조 í…스트',
+ 'wikieditor-toolbar-tool-reference-title' => '출처 넣기',
+ 'wikieditor-toolbar-tool-reference-insert' => '넣기',
+ 'wikieditor-toolbar-tool-reference-text' => '출처 í…스트',
'wikieditor-toolbar-tool-signature' => '서명 ë° ì‹œê°',
- 'wikieditor-toolbar-section-advanced' => '고급 기능',
+ 'wikieditor-toolbar-section-advanced' => '고급',
'wikieditor-toolbar-tool-heading' => '문단 제목',
'wikieditor-toolbar-tool-heading-1' => '1단계',
'wikieditor-toolbar-tool-heading-2' => '2단계',
@@ -15110,8 +15286,8 @@ $messages['ko'] = array(
'wikieditor-toolbar-tool-superscript-example' => '위 첨ìž',
'wikieditor-toolbar-tool-subscript' => '아래 첨ìž',
'wikieditor-toolbar-tool-subscript-example' => '아래 첨ìž',
- 'wikieditor-toolbar-group-insert' => '추가',
- 'wikieditor-toolbar-tool-gallery' => '화랑',
+ 'wikieditor-toolbar-group-insert' => '넣기',
+ 'wikieditor-toolbar-tool-gallery' => '사진 갤러리',
'wikieditor-toolbar-tool-gallery-example' => '$1:Example.jpg|설명1
$1:Example.jpg|설명2',
'wikieditor-toolbar-tool-newline' => '새 줄',
@@ -15130,7 +15306,7 @@ $1:Example.jpg|설명2',
| 2í–‰ 3ì—´',
'wikieditor-toolbar-tool-table-example-cell-text' => 'ì…€ ë‚´ìš©',
'wikieditor-toolbar-tool-table-example-header' => '표 제목',
- 'wikieditor-toolbar-tool-table-title' => '표 추가하기',
+ 'wikieditor-toolbar-tool-table-title' => '표 넣기',
'wikieditor-toolbar-tool-table-dimensions-rows' => 'í–‰',
'wikieditor-toolbar-tool-table-dimensions-columns' => 'ì—´',
'wikieditor-toolbar-tool-table-dimensions-header' => 'í‘œ ì œëª©ëž€ì„ í¬í•¨ì‹œí‚¤ê¸°',
@@ -15138,14 +15314,14 @@ $1:Example.jpg|설명2',
'wikieditor-toolbar-tool-table-sortable' => '표를 정렬 가능하게 만들기',
'wikieditor-toolbar-tool-table-example' => 'ì…€ ë‚´ìš©',
'wikieditor-toolbar-tool-table-preview' => '미리 보기',
- 'wikieditor-toolbar-tool-table-insert' => '추가',
+ 'wikieditor-toolbar-tool-table-insert' => '넣기',
'wikieditor-toolbar-tool-table-cancel' => '취소',
- 'wikieditor-toolbar-tool-table-toomany' => 'ì´ ê¸°ëŠ¥ì„ í†µí•´ì„œëŠ” 1000ê°œ ì´ìƒì˜ ì…€ì„ ê°€ì§„ í‹€ì„ ì¶”ê°€í•  수 없습니다.',
- 'wikieditor-toolbar-tool-table-invalidnumber' => 'í–‰ì´ë‚˜ ì—´ì˜ ê°œìˆ˜ë¥¼ 잘못 입력하였습니다.',
- 'wikieditor-toolbar-tool-table-zero' => 'í–‰ì´ë‚˜ ì—´ì˜ ê°œìˆ˜ê°€ 0ì¸ í‘œë¥¼ 추가할 수 없습니다.',
+ 'wikieditor-toolbar-tool-table-toomany' => 'ì´ ê¸°ëŠ¥ì„ í†µí•´ì„œëŠ” 1000ê°œ ì´ìƒì˜ ì…€ì„ ê°€ì§„ í‹€ì„ ë„£ì„ ìˆ˜ 없습니다.',
+ 'wikieditor-toolbar-tool-table-invalidnumber' => 'í–‰ì´ë‚˜ ì—´ì˜ ê°œìˆ˜ë¥¼ 잘못 입력했습니다.',
+ 'wikieditor-toolbar-tool-table-zero' => 'í–‰ì´ë‚˜ ì—´ì˜ ê°œìˆ˜ê°€ 0ì¸ í‘œë¥¼ ë„£ì„ ìˆ˜ 없습니다.',
'wikieditor-toolbar-tool-replace' => '찾아 바꾸기',
'wikieditor-toolbar-tool-replace-title' => '찾아 바꾸기',
- 'wikieditor-toolbar-tool-replace-search' => '찾기:',
+ 'wikieditor-toolbar-tool-replace-search' => 'ì°¾ì„ ëŒ€ìƒ:',
'wikieditor-toolbar-tool-replace-replace' => '바꾸기:',
'wikieditor-toolbar-tool-replace-case' => '대소문ìžë¥¼ 구별',
'wikieditor-toolbar-tool-replace-regex' => 'ì°¾ì„ ë¬¸ìžì—´ì— ì •ê·œ 표현ì‹ì„ ì ìš©',
@@ -15189,7 +15365,7 @@ $1:Example.jpg|설명2',
'wikieditor-toolbar-help-page-heading' => '문단 제목',
'wikieditor-toolbar-help-page-list' => '목ë¡',
'wikieditor-toolbar-help-page-file' => '파ì¼',
- 'wikieditor-toolbar-help-page-reference' => '주ì„',
+ 'wikieditor-toolbar-help-page-reference' => '출처',
'wikieditor-toolbar-help-page-discussion' => '토론',
'wikieditor-toolbar-help-content-italic-description' => 'ê¸°ìš¸ì¸ ê¸€ì”¨',
'wikieditor-toolbar-help-content-italic-syntax' => "''ê¸°ìš¸ì¸ ê¸€ì”¨''",
@@ -15227,7 +15403,7 @@ $1:Example.jpg|설명2',
'wikieditor-toolbar-help-content-file-description' => 'íŒŒì¼ ë„£ê¸°',
'wikieditor-toolbar-help-content-file-syntax' => '[[$1:Example.png|thumb|그림 설명]]',
'wikieditor-toolbar-help-content-file-result' => "<div style='width:104px;' class='thumbinner'><a title='Caption text' class='image' href='#'><img height='50' width='100' border='0' class='thumbimage' src='$2/WikiEditor/modules/images/toolbar/example-image.png' alt=''/></a><div class='thumbcaption'><div class='magnify'><a title='실제 í¬ê¸°ë¡œ' class='internal' href='#'><img height='11' width='15' alt='' src='$1/common/images/magnify-clip.png'/></a></div>그림 설명</div></div>",
- 'wikieditor-toolbar-help-content-reference-description' => '주ì„',
+ 'wikieditor-toolbar-help-content-reference-description' => '출처',
'wikieditor-toolbar-help-content-reference-syntax' => '문서 ë‚´ìš©.&lt;ref name="test"&gt;[http://www.example.org ë§í¬ 제목], 기타 설명.&lt;/ref&gt;',
'wikieditor-toolbar-help-content-reference-result' => "문서 내용.<sup><a href='#'>[1]</a></sup>",
'wikieditor-toolbar-help-content-rereference-description' => 'ê¸°ì¡´ì— ë¶™ì¸ ì¶œì²˜ 재사용하기',
@@ -15276,7 +15452,7 @@ $messages['krc'] = array(
'wikieditor-toolbar' => 'Тюзетиулени панели',
'wikieditor-toolbar-desc' => 'Хайырланыр мадары игиленнген тюрлендириу панель',
'wikieditor-toolbar-preference' => 'Игиленнген тюрлендириу панелни джандыр',
- 'wikieditor-toolbar-dialogs-preference' => 'Джибериулени, таблицаланы Ñмда андан башханы къошар ючюн диалогланы джандыр',
+ 'wikieditor-toolbar-dialogs-preference' => 'Джибериулени, таблицаланы Ñмда андан башханы къошар ючюн диалогланы джандыр', # Fuzzy
'wikieditor-toolbar-loading' => 'Джюклениу...',
'wikieditor-toolbar-tool-bold' => 'Къалын',
'wikieditor-toolbar-tool-bold-example' => 'Къалын джазыу',
@@ -15507,7 +15683,7 @@ $messages['ksh'] = array(
'wikieditor-toolbar' => 'Werkzüsh för et Ändere',
'wikieditor-toolbar-desc' => 'Verbesserte Werkzüsh för et Ändere',
'wikieditor-toolbar-preference' => 'Donn et ußföerlesh Werkzüsh för et Ändere aanzeije (bruch Java_Skripp)',
- 'wikieditor-toolbar-dialogs-preference' => 'Donn de Lengks aanzeije för Lengks, Tabälle, un mieh en Sigge em Wiki ennzefööje',
+ 'wikieditor-toolbar-dialogs-preference' => 'Donn de Lengks aanzeije för Lengks, Tabälle, un mieh en Sigge em Wiki ennzefööje', # Fuzzy
'wikieditor-toolbar-hidesig' => 'Donn dä Knopp för de „Ongerschreff“ nit aanzeije för nomaale Sigge vum Wiki singem Enhalld.',
'wikieditor-toolbar-loading' => 'Ben aam Laade{{int:ellipsis}}',
'wikieditor-toolbar-tool-bold' => 'Fätte Schreff',
@@ -15760,11 +15936,12 @@ $messages['ku-latn'] = array(
'wikieditor-toolbar-tool-link-int-target-status-notexists' => 'Rûpel tune',
'wikieditor-toolbar-tool-link-lookslikeinternal-ext' => 'Girêdanên derve',
'wikieditor-toolbar-tool-file-example' => 'Mînak.jpg',
- 'wikieditor-toolbar-tool-reference' => 'Referans',
+ 'wikieditor-toolbar-tool-file-insert' => 'Tevlî bike',
+ 'wikieditor-toolbar-tool-reference' => 'Çavkanî',
'wikieditor-toolbar-tool-reference-cancel' => 'Betal bike',
- 'wikieditor-toolbar-tool-reference-title' => 'Referans têxe',
- 'wikieditor-toolbar-tool-reference-insert' => 'Têxistin',
- 'wikieditor-toolbar-tool-reference-text' => 'Teksta referansê',
+ 'wikieditor-toolbar-tool-reference-title' => 'Çavkaniyek têxe',
+ 'wikieditor-toolbar-tool-reference-insert' => 'Tevlî bike',
+ 'wikieditor-toolbar-tool-reference-text' => 'Nivîsa çavkaniyê',
'wikieditor-toolbar-tool-signature' => 'Destnîşan û demxeya demê',
'wikieditor-toolbar-section-advanced' => 'Pêşketî',
'wikieditor-toolbar-tool-heading' => 'Sernivîs',
@@ -15781,6 +15958,7 @@ $messages['ku-latn'] = array(
'wikieditor-toolbar-tool-big' => 'Mezin',
'wikieditor-toolbar-tool-big-example' => 'Nivîsa girdek',
'wikieditor-toolbar-tool-small' => 'Biçûk',
+ 'wikieditor-toolbar-group-insert' => 'Tevlî bike',
'wikieditor-toolbar-tool-gallery' => 'Pêşangeha wêneyan',
'wikieditor-toolbar-tool-newline' => 'Rêzika nû',
'wikieditor-toolbar-tool-table' => 'Tablo',
@@ -15788,7 +15966,7 @@ $messages['ku-latn'] = array(
'wikieditor-toolbar-tool-table-dimensions-columns' => 'Sitûn',
'wikieditor-toolbar-tool-table-example' => 'Mînak',
'wikieditor-toolbar-tool-table-preview' => 'Pêşdîtin',
- 'wikieditor-toolbar-tool-table-insert' => 'Têxistin',
+ 'wikieditor-toolbar-tool-table-insert' => 'Tevlî bike',
'wikieditor-toolbar-tool-table-cancel' => 'Betal bike',
'wikieditor-toolbar-tool-replace-close' => 'Girtin',
'wikieditor-toolbar-section-characters' => 'Karakterên taybet',
@@ -15819,14 +15997,15 @@ $messages['ku-latn'] = array(
'wikieditor-toolbar-help-page-reference' => 'Referans',
'wikieditor-toolbar-help-page-discussion' => 'Gotûbêj',
'wikieditor-toolbar-help-content-italic-description' => 'Xwahr',
- 'wikieditor-toolbar-help-content-italic-syntax' => "''Nivîşa îtalîk''",
+ 'wikieditor-toolbar-help-content-italic-syntax' => "''Nivîsa xwahr''",
'wikieditor-toolbar-help-content-italic-result' => '<em>Nivîsa xwahr</em>',
'wikieditor-toolbar-help-content-bold-description' => 'Stûr',
'wikieditor-toolbar-help-content-bold-syntax' => "'''Nivîsa stûr'''",
'wikieditor-toolbar-help-content-bold-result' => '<strong>Nivîsa stûr</strong>',
'wikieditor-toolbar-help-content-bolditalic-description' => 'Stûr û xwahr',
- 'wikieditor-toolbar-help-content-bolditalic-result' => '<strong><em>Nivîsa qalind û îtalîk</em></strong>',
- 'wikieditor-toolbar-help-content-ilink-description' => 'Lînka hundirî',
+ 'wikieditor-toolbar-help-content-bolditalic-syntax' => "'''''Nivîsa stûr û xwahr'''''",
+ 'wikieditor-toolbar-help-content-bolditalic-result' => '<strong><em>Nivîsa stûr û xwahr</em></strong>',
+ 'wikieditor-toolbar-help-content-ilink-description' => 'Girêdana hundirî',
'wikieditor-toolbar-help-content-xlink-description' => 'Girêdana derve',
'wikieditor-toolbar-help-content-reference-description' => 'Referans',
'wikieditor-toolbar-help-content-signature-description' => 'ÃŽmze',
@@ -15838,65 +16017,65 @@ $messages['ku-latn'] = array(
* @author Nrowe
*/
$messages['kw'] = array(
- 'wikieditor-wikitext-tab' => 'Wikitext',
- 'wikieditor-loading' => 'Ow carga...',
+ 'wikieditor-wikitext-tab' => 'Wikitekst',
+ 'wikieditor-loading' => 'Ow karga...',
'wikieditor-preview-tab' => 'Ragweles',
'wikieditor-preview-changes-tab' => 'Chanjyow',
- 'wikieditor-preview-loading' => 'Ow carga...',
+ 'wikieditor-preview-loading' => 'Ow karga...',
'wikieditor-previewDialog-tab' => 'Ragwel',
- 'wikieditor-previewDialog-loading' => 'Ow carga...',
+ 'wikieditor-previewDialog-loading' => 'Ow karga...',
'wikieditor-publish-button-publish' => 'Dyllo',
- 'wikieditor-publish-button-cancel' => 'Hedhy',
+ 'wikieditor-publish-button-cancel' => 'Hedhi',
'wikieditor-publish-dialog-title' => 'Dyllo war {{SITENAME}}',
- 'wikieditor-publish-dialog-minor' => 'Chanj bian',
- 'wikieditor-publish-dialog-watch' => 'Golyas an folen-ma',
+ 'wikieditor-publish-dialog-minor' => 'Chanj byhan',
+ 'wikieditor-publish-dialog-watch' => 'Golya an folen-ma',
'wikieditor-publish-dialog-publish' => 'Dyllo',
- 'wikieditor-template-editor-dialog-submit' => 'Nowedhy',
- 'wikieditor-template-editor-dialog-cancel' => 'Hedhy',
+ 'wikieditor-template-editor-dialog-submit' => 'Nowedhi',
+ 'wikieditor-template-editor-dialog-cancel' => 'Hedhi',
'wikieditor-toolbar' => 'Toulvar chanjya',
- 'wikieditor-toolbar-desc' => 'Toulvar folen chanjya gans devnydh gwellhes',
- 'wikieditor-toolbar-preference' => 'Galosegy an toulvar chanjya gwellhes',
- 'wikieditor-toolbar-loading' => 'Ow carga...',
+ 'wikieditor-toolbar-desc' => 'Toulvar folen janjya gans devnydh gwellhes',
+ 'wikieditor-toolbar-preference' => 'Galosegi an toulvar chanjya gwellhes',
+ 'wikieditor-toolbar-loading' => 'Ow karga...',
'wikieditor-toolbar-tool-bold' => 'Tew',
- 'wikieditor-toolbar-tool-bold-example' => 'Text tew',
+ 'wikieditor-toolbar-tool-bold-example' => 'Tekst tew',
'wikieditor-toolbar-tool-italic' => 'Italek',
- 'wikieditor-toolbar-tool-italic-example' => 'Text italek',
+ 'wikieditor-toolbar-tool-italic-example' => 'Tekst italek',
'wikieditor-toolbar-tool-ilink' => 'Kevren bervedhel',
'wikieditor-toolbar-tool-ilink-example' => 'Titel an gevren',
- 'wikieditor-toolbar-tool-xlink' => 'Kevren a-ves (na ankevowgh an rager http://)',
+ 'wikieditor-toolbar-tool-xlink' => 'Kevren a-ves (na ankevewgh an rager http://)',
'wikieditor-toolbar-tool-xlink-example' => 'http://www.example.com titel an gevren',
'wikieditor-toolbar-tool-link' => 'Kevren',
'wikieditor-toolbar-tool-link-title' => 'Keworra kevren',
- 'wikieditor-toolbar-tool-link-int' => 'War-tu folen wiki',
+ 'wikieditor-toolbar-tool-link-int' => 'War-tu ha folen wiki',
'wikieditor-toolbar-tool-link-int-target' => 'Folen po URL kosten:',
'wikieditor-toolbar-tool-link-int-target-tooltip' => 'Titel po URL an folen:',
- 'wikieditor-toolbar-tool-link-int-text' => 'Text rag disqwedhes:',
- 'wikieditor-toolbar-tool-link-int-text-tooltip' => 'Text dhe vos disqwedhys',
- 'wikieditor-toolbar-tool-link-ext' => 'War-tu folen wias a-ves',
+ 'wikieditor-toolbar-tool-link-int-text' => 'An tekst rag diskwedhes:',
+ 'wikieditor-toolbar-tool-link-int-text-tooltip' => 'An tekst rag diskwedhes',
+ 'wikieditor-toolbar-tool-link-ext' => 'War-tu ha folen wias a-ves',
'wikieditor-toolbar-tool-link-ext-target' => 'URL an gevren:',
- 'wikieditor-toolbar-tool-link-ext-text' => 'Text an gevren:',
+ 'wikieditor-toolbar-tool-link-ext-text' => 'Tekst an gevren:',
'wikieditor-toolbar-tool-link-insert' => 'Keworra kevren',
- 'wikieditor-toolbar-tool-link-cancel' => 'Hedhy',
+ 'wikieditor-toolbar-tool-link-cancel' => 'Hedhi',
'wikieditor-toolbar-tool-link-int-target-status-invalid' => 'Titel drog',
'wikieditor-toolbar-tool-link-int-target-status-external' => 'Kevren a-ves',
'wikieditor-toolbar-tool-link-int-invalid' => 'Drog yw an titel res genowgh.',
'wikieditor-toolbar-tool-link-lookslikeinternal' => 'Yth hevel bos an URL res genowgh ow kevrenna dhe folen wiki aral.
-Eus whans dhywgh y dreylya dhe gevren bervedhel?',
+Eus hwans dhywgh y dreylya dhe gevren bervedhel?',
'wikieditor-toolbar-tool-link-lookslikeinternal-int' => 'Kevren bervedhel',
'wikieditor-toolbar-tool-link-lookslikeinternal-ext' => 'Kevren a-ves',
- 'wikieditor-toolbar-tool-link-empty' => 'Ny wrussowgh why entra tra vedh dhe gevrenna dhodho.',
+ 'wikieditor-toolbar-tool-link-empty' => 'Ny entersowgh tra vydh dhe gevrenna dhodho.',
'wikieditor-toolbar-tool-file' => 'Restren neythys',
'wikieditor-toolbar-tool-file-example' => 'Ensampel.jpg',
'wikieditor-toolbar-tool-file-title' => 'Keworra restren',
'wikieditor-toolbar-file-target' => 'Hanow an restren:',
- 'wikieditor-toolbar-file-size' => 'Mens:',
- 'wikieditor-toolbar-tool-file-cancel' => 'Hedhy',
+ 'wikieditor-toolbar-file-size' => 'Myns:',
+ 'wikieditor-toolbar-tool-file-cancel' => 'Hedhi',
'wikieditor-toolbar-tool-reference' => 'Devyn',
- 'wikieditor-toolbar-tool-reference-example' => 'Entrowgh text an drosnoten omma',
- 'wikieditor-toolbar-tool-reference-cancel' => 'Hedhy',
+ 'wikieditor-toolbar-tool-reference-example' => 'Entrewgh tekst an drosnoten omma',
+ 'wikieditor-toolbar-tool-reference-cancel' => 'Hedhi',
'wikieditor-toolbar-tool-reference-title' => 'Keworra devyn',
'wikieditor-toolbar-tool-reference-insert' => 'Keworra',
- 'wikieditor-toolbar-tool-reference-text' => 'Text an devyn',
+ 'wikieditor-toolbar-tool-reference-text' => 'Tekst an devyn',
'wikieditor-toolbar-tool-signature' => 'Sinans ha dedhyans',
'wikieditor-toolbar-section-advanced' => 'Avonsys',
'wikieditor-toolbar-tool-heading' => 'Titel',
@@ -15905,31 +16084,31 @@ Eus whans dhywgh y dreylya dhe gevren bervedhel?',
'wikieditor-toolbar-tool-heading-3' => 'Nivel 3',
'wikieditor-toolbar-tool-heading-4' => 'Nivel 4',
'wikieditor-toolbar-tool-heading-5' => 'Nivel 5',
- 'wikieditor-toolbar-tool-heading-example' => 'Text an titel',
+ 'wikieditor-toolbar-tool-heading-example' => 'Tekst an bennlinen',
'wikieditor-toolbar-group-format' => 'Furvyans',
'wikieditor-toolbar-tool-ulist' => 'Rol bulettys',
'wikieditor-toolbar-tool-ulist-example' => "Elven a'n rol bulettys",
'wikieditor-toolbar-tool-olist' => 'Rol niverys',
'wikieditor-toolbar-tool-olist-example' => "Elven a'n rol niverys",
- 'wikieditor-toolbar-tool-indent' => 'Crybans',
+ 'wikieditor-toolbar-tool-indent' => 'Krybans',
'wikieditor-toolbar-tool-indent-example' => 'Linen grybys',
'wikieditor-toolbar-tool-nowiki' => 'Heb furvyans wiki',
- 'wikieditor-toolbar-tool-nowiki-example' => 'Keworrowgh text heb furvyans omma',
- 'wikieditor-toolbar-tool-redirect' => 'Daswedyans',
+ 'wikieditor-toolbar-tool-nowiki-example' => 'Keworrewgh tekst heb furvyans omma',
+ 'wikieditor-toolbar-tool-redirect' => 'Daskedyans',
'wikieditor-toolbar-tool-redirect-example' => 'Hanow an folen gosten',
'wikieditor-toolbar-tool-big' => 'Bras',
- 'wikieditor-toolbar-tool-big-example' => 'Text bras',
- 'wikieditor-toolbar-tool-small' => 'Bian',
- 'wikieditor-toolbar-tool-small-example' => 'Text bian',
- 'wikieditor-toolbar-tool-superscript' => 'Gorscrif',
- 'wikieditor-toolbar-tool-superscript-example' => 'Tekst gorscrif',
- 'wikieditor-toolbar-tool-subscript' => 'Isscrif',
- 'wikieditor-toolbar-tool-subscript-example' => 'Text isscrif',
+ 'wikieditor-toolbar-tool-big-example' => 'Tekst bras',
+ 'wikieditor-toolbar-tool-small' => 'Byhan',
+ 'wikieditor-toolbar-tool-small-example' => 'Tekst byhan',
+ 'wikieditor-toolbar-tool-superscript' => 'Gorskrif',
+ 'wikieditor-toolbar-tool-superscript-example' => 'Tekst gorskrif',
+ 'wikieditor-toolbar-tool-subscript' => 'Isskrif',
+ 'wikieditor-toolbar-tool-subscript-example' => 'Tekst isskrif',
'wikieditor-toolbar-group-insert' => 'Keworra',
'wikieditor-toolbar-tool-gallery' => 'Mirva imajys',
- 'wikieditor-toolbar-tool-gallery-example' => '$1:Ensampel.jpg|Descrifans1
-$1:Ensampel.jpg|Descrifans2',
- 'wikieditor-toolbar-tool-newline' => 'Linen noweth',
+ 'wikieditor-toolbar-tool-gallery-example' => '$1:Ensampel.jpg|Deskrifans1
+$1:Ensampel.jpg|Deskrifans2',
+ 'wikieditor-toolbar-tool-newline' => 'Linen nowyth',
'wikieditor-toolbar-tool-table' => 'Tabel',
'wikieditor-toolbar-tool-table-example-old' => '-
! pennlinen 1
@@ -15943,35 +16122,35 @@ $1:Ensampel.jpg|Descrifans2',
| rew 2, kellik 1
| rew 2, kellik 2
| rew 2, kellik 3',
- 'wikieditor-toolbar-tool-table-example-cell-text' => 'Text an kellik',
+ 'wikieditor-toolbar-tool-table-example-cell-text' => 'Tekst an kellik',
'wikieditor-toolbar-tool-table-example-header' => 'Text an bennlinen',
- 'wikieditor-toolbar-tool-table-title' => 'Gorra tabel a-bervedh',
+ 'wikieditor-toolbar-tool-table-title' => 'Keworra tabel',
'wikieditor-toolbar-tool-table-dimensions-rows' => 'Rewyow',
- 'wikieditor-toolbar-tool-table-dimensions-columns' => 'Colovennow',
+ 'wikieditor-toolbar-tool-table-dimensions-columns' => 'Kolovennow',
'wikieditor-toolbar-tool-table-dimensions-header' => 'Keworra rew pennlinen',
'wikieditor-toolbar-tool-table-wikitable' => 'Keworra emlow',
- 'wikieditor-toolbar-tool-table-sortable' => 'Gwul sortyadow an tabel',
+ 'wikieditor-toolbar-tool-table-sortable' => 'Gul sortyadow an tabel',
'wikieditor-toolbar-tool-table-example' => 'Ensampel',
'wikieditor-toolbar-tool-table-preview' => 'Ragwel',
'wikieditor-toolbar-tool-table-insert' => 'Keworra',
- 'wikieditor-toolbar-tool-table-cancel' => 'Hedhy',
- 'wikieditor-toolbar-tool-table-invalidnumber' => 'Nyns eus entrys genowgh niver da a rewyow po colovennow.',
- 'wikieditor-toolbar-tool-table-zero' => 'Ny yllowgh why gorra a-bervedh tabel heb rew po coloven.',
- 'wikieditor-toolbar-tool-replace' => 'Whilas ha kemeres le',
- 'wikieditor-toolbar-tool-replace-title' => 'Whilas ha kemeres le',
- 'wikieditor-toolbar-tool-replace-search' => 'Whilas:',
+ 'wikieditor-toolbar-tool-table-cancel' => 'Hedhi',
+ 'wikieditor-toolbar-tool-table-invalidnumber' => 'Ny entersowgh niver da a rewyow po kolovennow.',
+ 'wikieditor-toolbar-tool-table-zero' => 'Ny yllowgh keworra tabel heb rew po koloven vyth.',
+ 'wikieditor-toolbar-tool-replace' => 'Hwilas ha kemeres le',
+ 'wikieditor-toolbar-tool-replace-title' => 'Hwilas ha kemeres le',
+ 'wikieditor-toolbar-tool-replace-search' => 'Hwilas:',
'wikieditor-toolbar-tool-replace-replace' => 'Kemeres le gans:',
- 'wikieditor-toolbar-tool-replace-button-findnext' => 'Cavos an nessa',
+ 'wikieditor-toolbar-tool-replace-button-findnext' => 'Kavos an nessa',
'wikieditor-toolbar-tool-replace-button-replaceall' => 'Kemeres le pub tra',
'wikieditor-toolbar-tool-replace-close' => 'Degea',
- 'wikieditor-toolbar-tool-replace-nomatch' => 'Ny wrug agas whilans machya tra veth.',
- 'wikieditor-toolbar-tool-replace-emptysearch' => 'Ny wrussowgh why entra tra veth dhe whilas.',
+ 'wikieditor-toolbar-tool-replace-nomatch' => 'Ny omdhesedhas agas hwilans orth tra vyth.',
+ 'wikieditor-toolbar-tool-replace-emptysearch' => 'Ny entersowgh tra vyth dhe hwilas.',
'wikieditor-toolbar-section-characters' => 'Lytherennow arbennek',
'wikieditor-toolbar-characters-page-latin' => 'Latin',
'wikieditor-toolbar-characters-page-latinextended' => 'Latin ystynnys',
- 'wikieditor-toolbar-characters-page-ipa' => 'LFK (IPA)',
+ 'wikieditor-toolbar-characters-page-ipa' => 'IPA',
'wikieditor-toolbar-characters-page-symbols' => 'Arwodhyow',
- 'wikieditor-toolbar-characters-page-greek' => 'Greca',
+ 'wikieditor-toolbar-characters-page-greek' => 'Greka',
'wikieditor-toolbar-characters-page-arabic' => 'Arabek',
'wikieditor-toolbar-characters-page-arabicextended' => 'Arabek ystynnys',
'wikieditor-toolbar-characters-page-persian' => 'Persek',
@@ -15984,43 +16163,43 @@ $1:Ensampel.jpg|Descrifans2',
'wikieditor-toolbar-characters-page-lao' => 'Laosek',
'wikieditor-toolbar-characters-page-khmer' => 'Khmer',
'wikieditor-toolbar-section-help' => 'Gweres',
- 'wikieditor-toolbar-help-heading-description' => 'Descrifans',
- 'wikieditor-toolbar-help-heading-syntax' => 'An peth yw scrifys',
+ 'wikieditor-toolbar-help-heading-description' => 'Deskrifans',
+ 'wikieditor-toolbar-help-heading-syntax' => 'An pyth a skrifowgh',
'wikieditor-toolbar-help-heading-result' => 'An sewyans',
'wikieditor-toolbar-help-page-format' => 'Furvyans',
'wikieditor-toolbar-help-page-link' => 'Kevrennow',
- 'wikieditor-toolbar-help-page-heading' => 'Titlys',
+ 'wikieditor-toolbar-help-page-heading' => 'Pennlinennow',
'wikieditor-toolbar-help-page-list' => 'Rolyow',
'wikieditor-toolbar-help-page-file' => 'Restrennow',
'wikieditor-toolbar-help-page-reference' => 'Devynnow',
- 'wikieditor-toolbar-help-page-discussion' => 'Kescows',
+ 'wikieditor-toolbar-help-page-discussion' => 'Keskows',
'wikieditor-toolbar-help-content-italic-description' => 'Italek',
- 'wikieditor-toolbar-help-content-italic-syntax' => "''Text italek''",
- 'wikieditor-toolbar-help-content-italic-result' => '<em>Text italek</em>',
+ 'wikieditor-toolbar-help-content-italic-syntax' => "''Tekst italek''",
+ 'wikieditor-toolbar-help-content-italic-result' => '<em>Tekst italek</em>',
'wikieditor-toolbar-help-content-bold-description' => 'Tew',
- 'wikieditor-toolbar-help-content-bold-syntax' => "'''Text tew'''",
- 'wikieditor-toolbar-help-content-bold-result' => '<strong>Text tew</strong>',
+ 'wikieditor-toolbar-help-content-bold-syntax' => "'''Tekst tew'''",
+ 'wikieditor-toolbar-help-content-bold-result' => '<strong>Tekst tew</strong>',
'wikieditor-toolbar-help-content-bolditalic-description' => 'Tew &amp; italek',
- 'wikieditor-toolbar-help-content-bolditalic-syntax' => "'''''Text tew &amp; italek'''''",
- 'wikieditor-toolbar-help-content-bolditalic-result' => '<strong><em>Text tew &amp; italek</em></strong>',
+ 'wikieditor-toolbar-help-content-bolditalic-syntax' => "'''''Tekst tew &amp; italek'''''",
+ 'wikieditor-toolbar-help-content-bolditalic-result' => '<strong><em>Tekst tew &amp; italek</em></strong>',
'wikieditor-toolbar-help-content-ilink-description' => 'Kevren bervedhel',
- 'wikieditor-toolbar-help-content-ilink-syntax' => '[[Titel an folen|Text an gevren]]<br />[[Titel an folen]]',
- 'wikieditor-toolbar-help-content-ilink-result' => "<a href='#'>Text an gevren</a><br /><a href='#'>Titel an folen</a>",
+ 'wikieditor-toolbar-help-content-ilink-syntax' => '[[Titel an folen|Tekst an gevren]]<br />[[Titel an folen]]',
+ 'wikieditor-toolbar-help-content-ilink-result' => "<a href='#'>Tekst an gevren</a><br /><a href='#'>Titel an folen</a>",
'wikieditor-toolbar-help-content-xlink-description' => 'Kevren bervedhel',
- 'wikieditor-toolbar-help-content-xlink-syntax' => '[http://www.ensampel.org Text an gevren]<br />[http://www.ensampel.org]<br />http://www.ensampel.org',
- 'wikieditor-toolbar-help-content-xlink-result' => "<a href='#' class='external'>Text an gevren</a><br /><a href='#' class='external autonumber'>[1]</a><br /><a href='#' class='external'>http://www.ensampel.org</a>",
- 'wikieditor-toolbar-help-content-heading2-description' => 'Titel nivel 2',
- 'wikieditor-toolbar-help-content-heading2-syntax' => '== Text an titel ==',
- 'wikieditor-toolbar-help-content-heading2-result' => '<h2>Text an titel</h2>',
- 'wikieditor-toolbar-help-content-heading3-description' => 'Titel nivel 3',
- 'wikieditor-toolbar-help-content-heading3-syntax' => '=== Text an titel ===',
- 'wikieditor-toolbar-help-content-heading3-result' => '<h3>Text an titel</h3>',
- 'wikieditor-toolbar-help-content-heading4-description' => 'Titel nivel 4',
- 'wikieditor-toolbar-help-content-heading4-syntax' => '==== Text an titel ====',
- 'wikieditor-toolbar-help-content-heading4-result' => '<h4>Text an titel</h4>',
- 'wikieditor-toolbar-help-content-heading5-description' => 'Titel nivel 5',
- 'wikieditor-toolbar-help-content-heading5-syntax' => '===== Text an titel =====',
- 'wikieditor-toolbar-help-content-heading5-result' => '<h5>Text an titel</h5>',
+ 'wikieditor-toolbar-help-content-xlink-syntax' => '[http://www.ensampel.org Tekst an gevren]<br />[http://www.ensampel.org]<br />http://www.ensampel.org',
+ 'wikieditor-toolbar-help-content-xlink-result' => "<a href='#' class='external'>Tekst an gevren</a><br /><a href='#' class='external autonumber'>[1]</a><br /><a href='#' class='external'>http://www.ensampel.org</a>",
+ 'wikieditor-toolbar-help-content-heading2-description' => 'Pennlinen nivel 2',
+ 'wikieditor-toolbar-help-content-heading2-syntax' => '== Tekst an bennlinen ==',
+ 'wikieditor-toolbar-help-content-heading2-result' => '<h2>Tekst an bennlinen</h2>',
+ 'wikieditor-toolbar-help-content-heading3-description' => 'Pennlinen nivel 3',
+ 'wikieditor-toolbar-help-content-heading3-syntax' => '=== Tekst an bennlinen ===',
+ 'wikieditor-toolbar-help-content-heading3-result' => '<h3>Tekst an bennlinen</h3>',
+ 'wikieditor-toolbar-help-content-heading4-description' => 'Pennlinen nivel 4',
+ 'wikieditor-toolbar-help-content-heading4-syntax' => '==== Tekst an bennlinen ====',
+ 'wikieditor-toolbar-help-content-heading4-result' => '<h4>Tekst an bennlinen</h4>',
+ 'wikieditor-toolbar-help-content-heading5-description' => 'Pennlinen nivel 5',
+ 'wikieditor-toolbar-help-content-heading5-syntax' => '===== Tekst an bennlinen =====',
+ 'wikieditor-toolbar-help-content-heading5-result' => '<h5>Tekst an bennlinen</h5>',
'wikieditor-toolbar-help-content-ulist-description' => 'Rol bulettys',
'wikieditor-toolbar-help-content-ulist-syntax' => "* Elven a'n rol<br />* Elven a'n rol",
'wikieditor-toolbar-help-content-ulist-result' => "<ul><li>Elven a'n rol</li><li>Elven a'n rol</li></ul>",
@@ -16028,28 +16207,56 @@ $1:Ensampel.jpg|Descrifans2',
'wikieditor-toolbar-help-content-olist-syntax' => "# Elven a'n rol<br /># Elven a'n rol",
'wikieditor-toolbar-help-content-olist-result' => "<ol><li>Elven a'n rol</li><li>Elven a'n rol</li></ol>",
'wikieditor-toolbar-help-content-file-description' => 'Restren neythys',
- 'wikieditor-toolbar-help-content-file-syntax' => '[[$1:Ensampel.png|thumb|Text an descrifans]]',
- 'wikieditor-toolbar-help-content-file-result' => "<div style='width:104px;' class='thumbinner'><a title='Text an descrifans' class='image' href='#'><img height='50' width='100' border='0' class='thumbimage' src='$2/WikiEditor/modules/images/toolbar/example-image.png' alt=''/></a><div class='thumbcaption'><div class='magnify'><a title='Brashe' class='internal' href='#'><img height='11' width='15' alt='' src='$1/common/images/magnify-clip.png'/></a></div>Text an descrifans</div></div>",
+ 'wikieditor-toolbar-help-content-file-syntax' => '[[$1:Ensampel.png|thumb|Tekst an deskrifans]]',
+ 'wikieditor-toolbar-help-content-file-result' => "<div style='width:104px;' class='thumbinner'><a title='Tekst an deskrifans' class='image' href='#'><img height='50' width='100' border='0' class='thumbimage' src='$2/WikiEditor/modules/images/toolbar/example-image.png' alt=''/></a><div class='thumbcaption'><div class='magnify'><a title='Brashe' class='internal' href='#'><img height='11' width='15' alt='' src='$1/common/images/magnify-clip.png'/></a></div>Tekst an deskrifans</div></div>",
'wikieditor-toolbar-help-content-reference-description' => 'Devyn',
- 'wikieditor-toolbar-help-content-reference-syntax' => 'Text an folen.&lt;ref name="test"&gt;[http://www.ensampel.org Text an gevren], text keworansel.&lt;/ref&gt;',
- 'wikieditor-toolbar-help-content-reference-result' => "Text an folen.<sup><a href='#'>[1]</a></sup>",
+ 'wikieditor-toolbar-help-content-reference-syntax' => 'Tekst an folen.&lt;ref name="test"&gt;[http://www.ensampel.org Tekst an gevren], tekst keworansel.&lt;/ref&gt;',
+ 'wikieditor-toolbar-help-content-reference-result' => "Tekst an folen.<sup><a href='#'>[1]</a></sup>",
'wikieditor-toolbar-help-content-rereference-description' => "Devnydh keworansel a'n keth devyn",
- 'wikieditor-toolbar-help-content-rereference-result' => "Text an folen.<sup><a href='#'>[1]</a></sup>",
- 'wikieditor-toolbar-help-content-showreferences-description' => 'Disqwedhes devynnow',
- 'wikieditor-toolbar-help-content-showreferences-result' => "<ol class='references'><li id='cite_note-test-0'><b><a title='' href='#'>^</a></b> <a rel='nofollow' title='http://www.ensampel.org' class='external text' href='#'>Text an gevren</a>, text keworansel.</li></ol>",
+ 'wikieditor-toolbar-help-content-rereference-result' => "Tekst an folen.<sup><a href='#'>[1]</a></sup>",
+ 'wikieditor-toolbar-help-content-showreferences-description' => 'Diskwedhes devynnow',
+ 'wikieditor-toolbar-help-content-showreferences-result' => "<ol class='references'><li id='cite_note-test-0'><b><a title='' href='#'>^</a></b> <a rel='nofollow' title='http://www.ensampel.org' class='external text' href='#'>Tekst an gevren</a>, tekst keworansel.</li></ol>",
'wikieditor-toolbar-help-content-signaturetimestamp-description' => 'Sinans gans an dedhyans',
- 'wikieditor-toolbar-help-content-signaturetimestamp-result' => "<a href='#' title='{{#special:mypage}}'>Hanow usyer</a> (<a href='#' title='{{#special:mytalk}}'>kescows</a>) 15:54, 10 Metheven 2009 (UTC)",
+ 'wikieditor-toolbar-help-content-signaturetimestamp-result' => "<a href='#' title='{{#special:mypage}}'>Hanow usyer</a> (<a href='#' title='{{#special:mytalk}}'>keskows</a>) 15:54, 10 Metheven 2009 (UTC)",
'wikieditor-toolbar-help-content-signature-description' => 'Sinans',
- 'wikieditor-toolbar-help-content-signature-result' => "<a href='#' title='{{#special:mypage}}'>Hanow usyer</a> (<a href='#' title='{{#special:mytalk}}'>kescows</a>)",
- 'wikieditor-toolbar-help-content-indent-description' => 'Cryba',
- 'wikieditor-toolbar-help-content-indent-syntax' => 'Text usadow<br />:Text crybys<br />::Text crybys',
- 'wikieditor-toolbar-help-content-indent-result' => 'Text usadow<dl><dd>Text crybys<dl><dd>Text crybys</dd></dl></dd></dl>',
+ 'wikieditor-toolbar-help-content-signature-result' => "<a href='#' title='{{#special:mypage}}'>Hanow devnydhyer</a> (<a href='#' title='{{#special:mytalk}}'>keskows</a>)",
+ 'wikieditor-toolbar-help-content-indent-description' => 'Kryba',
+ 'wikieditor-toolbar-help-content-indent-syntax' => 'Tekst usadow<br />:Tekst krybys<br />::Tekst krybys',
+ 'wikieditor-toolbar-help-content-indent-result' => 'Tekst usadow<dl><dd>Tekst krybys<dl><dd>Tekst krybys</dd></dl></dd></dl>',
);
-/** Kirghiz (Кыргызча)
+/** Kyrgyz (Кыргызча)
* @author Chorobek
+ * @author Викиней
*/
$messages['ky'] = array(
+ 'wikieditor-loading' => 'Жүктөлүүдө...',
+ 'wikieditor-preview-changes-tab' => 'Өзгөртүүлөр',
+ 'wikieditor-preview-loading' => 'Жүктөлүүдө...',
+ 'wikieditor-previewDialog-loading' => 'Жүктөлүүдө...',
+ 'wikieditor-publish-button-cancel' => 'Жокко чыгаруу',
+ 'wikieditor-publish-dialog-goback' => 'Ðртка',
+ 'wikieditor-template-editor-dialog-cancel' => 'Жокко чыгаруу',
+ 'wikieditor-toolbar-loading' => 'Жүктөлүүдө...',
+ 'wikieditor-toolbar-tool-bold' => 'Калың',
+ 'wikieditor-toolbar-tool-bold-example' => 'Калың текÑÑ‚',
+ 'wikieditor-toolbar-tool-italic' => 'Жантык',
+ 'wikieditor-toolbar-tool-italic-example' => 'жантык текÑÑ‚',
+ 'wikieditor-toolbar-tool-ilink-example' => 'Шилтеменин аты',
+ 'wikieditor-toolbar-tool-link' => 'Шилтеме',
+ 'wikieditor-toolbar-tool-link-title' => 'Шилтеме коюу',
+ 'wikieditor-toolbar-tool-link-ext-target' => 'URL шилтемеÑи:',
+ 'wikieditor-toolbar-tool-link-ext-text' => 'Шилтеменин текÑти:',
+ 'wikieditor-toolbar-tool-link-insert' => 'Шилтеме коюу',
+ 'wikieditor-toolbar-tool-link-cancel' => 'Жокко чыгаруу',
+ 'wikieditor-toolbar-file-target' => 'Файл аты:',
+ 'wikieditor-toolbar-file-size' => 'Өлчөм:',
+ 'wikieditor-toolbar-file-float' => 'Тегиздөө:',
+ 'wikieditor-toolbar-file-format-none' => 'жок',
+ 'wikieditor-toolbar-tool-file-insert' => 'Киргизүү',
+ 'wikieditor-toolbar-tool-file-cancel' => 'Жокко чыгаруу',
+ 'wikieditor-toolbar-tool-reference-cancel' => 'Жокко чыгаруу',
+ 'wikieditor-toolbar-tool-reference-insert' => 'Киргизүү',
'wikieditor-toolbar-section-advanced' => 'Кеңейтилген',
'wikieditor-toolbar-tool-heading' => 'Баш Ñөз',
'wikieditor-toolbar-tool-heading-1' => '1 ДеңгÑÑл',
@@ -16107,7 +16314,7 @@ $1:Example.jpg|БаÑндама2',
'wikieditor-toolbar-tool-table-preview' => 'Ðлдын ала көргөз',
'wikieditor-toolbar-tool-table-insert' => 'Киргиз',
'wikieditor-toolbar-tool-table-cancel' => 'Жокко чыгар',
- 'wikieditor-toolbar-tool-table-toomany' => 'Бул баарлашууда $1 ашык көзөнөгү бар жадыбал койгонго мүмкүн ÑмеÑ.', # Fuzzy
+ 'wikieditor-toolbar-tool-table-toomany' => 'Бул баарлашууда 1000ден ашык көзөнөгү бар жадыбал коюууга мүмкүн ÑмеÑ.',
'wikieditor-toolbar-tool-table-invalidnumber' => 'Сиз Ñаптардын же тилкелердин туура ÑÐ¼ÐµÑ Ñанын көргөздүңүз',
'wikieditor-toolbar-tool-table-zero' => 'Сиз бир дагы Ñабы же тилкеÑи жок жадыбал киргизе албайÑыз',
'wikieditor-toolbar-tool-replace' => 'Таап алмаштыр',
@@ -16121,7 +16328,7 @@ $1:Example.jpg|БаÑндама2',
'wikieditor-toolbar-tool-replace-button-replaceall' => 'Баарын алмаштыр',
'wikieditor-toolbar-tool-replace-close' => 'Жап',
'wikieditor-toolbar-tool-replace-nomatch' => 'Сиздин талап боюнча Ñчтеке табылган жок',
- 'wikieditor-toolbar-tool-replace-success' => '$1 алмаштыруу болду.', # Fuzzy
+ 'wikieditor-toolbar-tool-replace-success' => '$1 {{PLURAL:$1|өзгөртүү|өзгөртүүлөр}} аткарылды.',
'wikieditor-toolbar-tool-replace-emptysearch' => 'Сиз издегенге Ñч нерÑе көргөзгөн жокÑуз.',
'wikieditor-toolbar-tool-replace-invalidregex' => 'Сиз киргизген регулÑрдуу айтылыш туура ÑмеÑ: $1',
'wikieditor-toolbar-section-characters' => 'Ðтайын белгилер',
@@ -16208,6 +16415,7 @@ $1:Example.jpg|БаÑндама2',
);
/** Latin (Latina)
+ * @author Autokrator
* @author OrbiliusMagister
* @author UV
*/
@@ -16240,6 +16448,7 @@ $messages['la'] = array(
'wikieditor-toolbar-tool-reference' => 'Referentia bibliographica',
'wikieditor-toolbar-tool-reference-title' => 'Referentiam bibliographicam addere',
'wikieditor-toolbar-tool-signature' => 'Subscriptio tua cum indicatione temporis',
+ 'wikieditor-toolbar-section-advanced' => 'Plura',
'wikieditor-toolbar-tool-heading-1' => 'Planities 1',
'wikieditor-toolbar-tool-big' => 'Magna',
'wikieditor-toolbar-tool-big-example' => 'Textus magnus',
@@ -16267,8 +16476,12 @@ $1:Exemplum.jpg|Descriptio 2',
'wikieditor-toolbar-characters-page-telugu' => 'Telugu',
'wikieditor-toolbar-section-help' => 'Adiutatum',
'wikieditor-toolbar-help-heading-description' => 'Descriptio',
+ 'wikieditor-toolbar-help-heading-syntax' => 'Quod scribis',
+ 'wikieditor-toolbar-help-heading-result' => 'Quod accipies',
'wikieditor-toolbar-help-page-format' => 'Formatio',
'wikieditor-toolbar-help-page-link' => 'Nexus',
+ 'wikieditor-toolbar-help-page-heading' => 'Tituli',
+ 'wikieditor-toolbar-help-page-list' => 'Indices',
'wikieditor-toolbar-help-page-file' => 'Fasciculi',
'wikieditor-toolbar-help-page-reference' => 'Referentiae bibliographicae',
'wikieditor-toolbar-help-page-discussion' => 'Disputatio',
@@ -16287,11 +16500,31 @@ $1:Exemplum.jpg|Descriptio 2',
'wikieditor-toolbar-help-content-xlink-description' => 'Nexus externus',
'wikieditor-toolbar-help-content-xlink-syntax' => '[http://www.example.org Titulus nexus]<br />[http://www.example.org]<br />http://www.example.org',
'wikieditor-toolbar-help-content-xlink-result' => "<a href='#' class='external'>Titulus nexus</a><br /><a href='#' class='external autonumber'>[1]</a><br /><a href='#' class='external'>http://www.example.org</a>",
+ 'wikieditor-toolbar-help-content-heading2-description' => 'Secundi ordinis titulus',
+ 'wikieditor-toolbar-help-content-heading2-syntax' => '== Textus tituli ==',
+ 'wikieditor-toolbar-help-content-heading2-result' => '<h2>Textus tituli</h2>',
+ 'wikieditor-toolbar-help-content-heading3-description' => 'Tertii ordinis titulus',
+ 'wikieditor-toolbar-help-content-heading3-syntax' => '=== Textus tituli ===',
+ 'wikieditor-toolbar-help-content-heading3-result' => '<h3>Textus tituli</h3>',
+ 'wikieditor-toolbar-help-content-heading4-description' => 'Quarti ordinis titulus',
+ 'wikieditor-toolbar-help-content-heading4-syntax' => '==== Textus tituli ====',
+ 'wikieditor-toolbar-help-content-heading4-result' => '<h4>Textus tituli</h4>',
+ 'wikieditor-toolbar-help-content-heading5-description' => 'Quinti ordinis titulus',
+ 'wikieditor-toolbar-help-content-heading5-syntax' => '===== Textus tituli =====',
+ 'wikieditor-toolbar-help-content-heading5-result' => '<h5>Textus tituli</h5>',
+ 'wikieditor-toolbar-help-content-ulist-description' => 'Index globosus',
+ 'wikieditor-toolbar-help-content-ulist-syntax' => '* Res indicata<br />* Res indicata',
+ 'wikieditor-toolbar-help-content-ulist-result' => '<ul><li>Res indicata</li><li>Res indicata</li></ul>',
'wikieditor-toolbar-help-content-file-description' => 'Fasciculus in pagina impositus',
'wikieditor-toolbar-help-content-file-syntax' => '[[$1:Exemplum.png|thumb|Descriptio fasciculi]]', # Fuzzy
'wikieditor-toolbar-help-content-file-result' => "<div style='width:104px;' class='thumbinner'><a title='Descriptio fasciculi' class='image' href='#'><img height='50' width='100' border='0' class='thumbimage' src='$2/WikiEditor/modules/images/toolbar/example-image.png' alt=''/></a><div class='thumbcaption'><div class='magnify'><a title='Augere' class='internal' href='#'><img height='11' width='15' alt='' src='$1/common/images/magnify-clip.png'/></a></div>Descriptio fasciculi</div></div>",
'wikieditor-toolbar-help-content-reference-description' => 'Referentia bibliographica',
+ 'wikieditor-toolbar-help-content-reference-syntax' => 'Textus paginae.&lt;ref name="test"&gt;[http://www.example.org Textus nexus], textus additus.&lt;/ref&gt;',
+ 'wikieditor-toolbar-help-content-reference-result' => "Textus paginae.<sup><a href='#'>[1]</a></sup>",
+ 'wikieditor-toolbar-help-content-rereference-description' => 'Eiusdem referentiae usus additus',
+ 'wikieditor-toolbar-help-content-rereference-result' => "Textus paginae.<sup><a href='#'>[1]</a></sup>",
'wikieditor-toolbar-help-content-showreferences-description' => 'Referentias bibliographicas monstrare',
+ 'wikieditor-toolbar-help-content-showreferences-result' => "<ol class='references'><li id='cite_note-test-0'><b><a title='' href='#'>^</a></b> <a rel='nofollow' title='http://www.example.org' class='external text' href='#'>Textus nexus</a>, textus additus.</li></ol>",
'wikieditor-toolbar-help-content-signaturetimestamp-description' => 'Subscriptio tua cum indicatione temporis',
'wikieditor-toolbar-help-content-signaturetimestamp-result' => "<a href='#' title='{{#special:mypage}}'>Nomen usoris</a> (<a href='#' title='{{#special:mytalk}}'>disputatio</a>) 15:54, 10 Iunii 2009 (UTC)",
'wikieditor-toolbar-help-content-signature-description' => 'Subscriptio',
@@ -16300,10 +16533,11 @@ $1:Exemplum.jpg|Descriptio 2',
/** Luxembourgish (Lëtzebuergesch)
* @author Robby
+ * @author Soued031
*/
$messages['lb'] = array(
'wikieditor' => "Erweiderten Interface fir d'Änner vu Wikitext",
- 'wikieditor-desc' => "Liwwert en erweiderbaren Interface fir d'Ännere vu Wikitext a vill Module mat Fonctiounen",
+ 'wikieditor-desc' => "Liwwert en erweiderbaren Interface fir d'Ännere vu Wikitext a vill Module mat Funktiounen",
'wikieditor-wikitext-tab' => 'WikiText',
'wikieditor-loading' => 'Lueden',
'wikieditor-preview-preference' => 'side-by-side kucken ouni ze späicheren aschalten',
@@ -16333,7 +16567,7 @@ $messages['lb'] = array(
'wikieditor-toolbar' => 'Toolbar änneren',
'wikieditor-toolbar-desc' => 'Toolbar vun de Säitenännerunge mat erweiderter Benotzerfrëndlechkeet',
'wikieditor-toolbar-preference' => 'Déi erweidert Ännerungs-Toolbar aktivéieren',
- 'wikieditor-toolbar-dialogs-preference' => "Dialoge fir d'Drasetze vu Linken, Tabellen a méi aschalten",
+ 'wikieditor-toolbar-dialogs-preference' => "Assistente fir d'Drasetze vu Linken, Tabellen genee sou wéi d'Funktioun 'sichen an ersetzen' aschalten",
'wikieditor-toolbar-hidesig' => 'Den Ënnerschrëftsknäppchen op Säiten am Haaptnummraum verstoppen',
'wikieditor-toolbar-loading' => 'Lueden...',
'wikieditor-toolbar-tool-bold' => 'Fettgedréckt',
@@ -16361,6 +16595,7 @@ $messages['lb'] = array(
'wikieditor-toolbar-tool-link-int-target-status-invalid' => 'Net valabelen Titel',
'wikieditor-toolbar-tool-link-int-target-status-external' => 'Externe Link',
'wikieditor-toolbar-tool-link-int-target-status-loading' => "Et gëtt nogekuckt ob et d'Säit gëtt...",
+ 'wikieditor-toolbar-tool-link-int-target-status-disambig' => 'Homonymie-Säit',
'wikieditor-toolbar-tool-link-int-invalid' => 'Den Titel deen Dir uginn hutt ass net valabel.',
'wikieditor-toolbar-tool-link-lookslikeinternal' => 'Déi URL déi dir uginn hutt gesäit aus wéi e Link op eng aner Wikisäit. Wëllt dir doraus en interne Link maachen?',
'wikieditor-toolbar-tool-link-lookslikeinternal-int' => 'Interne Link',
@@ -16370,6 +16605,7 @@ $messages['lb'] = array(
'wikieditor-toolbar-tool-file-example' => 'Beispill.jpg',
'wikieditor-toolbar-tool-file-title' => 'Fichier drasetzen',
'wikieditor-toolbar-file-target' => 'Numm vum Fichier:',
+ 'wikieditor-toolbar-file-caption' => 'Beschreiwung:',
'wikieditor-toolbar-file-size' => 'Gréisst:',
'wikieditor-toolbar-file-float' => 'Ausriichtung:',
'wikieditor-toolbar-file-default' => '(Standard)',
@@ -16597,7 +16833,7 @@ $messages['li'] = array(
'wikieditor-toolbar' => 'Bewèrkingswèrkbalk',
'wikieditor-toolbar-desc' => 'Nuje bewèrkingsbalk',
'wikieditor-toolbar-preference' => 'Gebroek de nuje bewèrkingsbalk',
- 'wikieditor-toolbar-dialogs-preference' => 'Zèt inveurvensters aan',
+ 'wikieditor-toolbar-dialogs-preference' => 'Zèt inveurvensters aan', # Fuzzy
'wikieditor-toolbar-hidesig' => 'Verberg de knoep veur óngerteikene in dees naamruumde',
'wikieditor-toolbar-loading' => 'Laje…',
'wikieditor-toolbar-tool-bold' => 'Vèt',
@@ -16797,6 +17033,83 @@ $1:Veurbeildj2|Biesjrif2',
'wikieditor-toolbar-help-content-indent-result' => 'Normaal teks<dl><dd>Ingesprónge teks<dl><dd>Ingesprónge teks</dd></dl></dd></dl>',
);
+/** لوری (لوری)
+ * @author Mogoeilor
+ */
+$messages['lrc'] = array(
+ 'wikieditor' => 'كاروری پيشرÙته ويراشتگر ويكی متن',
+ 'wikieditor-wikitext-tab' => 'ويكی متن',
+ 'wikieditor-loading' => 'د حالت سوار كرد',
+ 'wikieditor-preview-tab' => 'پيش زمينه',
+ 'wikieditor-preview-changes-tab' => 'آلشتيا',
+ 'wikieditor-preview-loading' => 'د حالت سوار كرد',
+ 'wikieditor-previewDialog-tab' => 'پيش زمينه',
+ 'wikieditor-previewDialog-loading' => 'د حالت سوار كرد',
+ 'wikieditor-publish-preference' => 'توانايی پا وه پا سی انتشار',
+ 'wikieditor-publish-button-publish' => 'منتشر كردن',
+ 'wikieditor-publish-button-cancel' => 'رد كردن',
+ 'wikieditor-publish-dialog-title' => 'انتشار سی{{نوم مالگه}}',
+ 'wikieditor-publish-dialog-minor' => 'ويرايشت كؤچك',
+ 'wikieditor-publish-dialog-watch' => 'ديئن ای بلگه',
+ 'wikieditor-publish-dialog-publish' => 'منتشر كردن',
+ 'wikieditor-publish-dialog-goback' => 'ورئرد',
+ 'wikieditor-template-editor-dialog-title' => 'قالو ويرايشت',
+ 'wikieditor-template-editor-dialog-submit' => 'روزآمد كردن',
+ 'wikieditor-template-editor-dialog-cancel' => 'رد كردن',
+ 'wikieditor-toc-show' => 'نشون ديئن محتوايا',
+ 'wikieditor-toc-hide' => 'قام كردن محتوايا',
+ 'wikieditor-toolbar' => 'اوزارگه ويرايشت',
+ 'wikieditor-toolbar-loading' => 'د حالت سوار كرد',
+ 'wikieditor-toolbar-tool-bold' => 'توپر',
+ 'wikieditor-toolbar-tool-bold-example' => 'متن توپر بيه',
+ 'wikieditor-toolbar-tool-italic' => 'كج كوله',
+ 'wikieditor-toolbar-tool-italic-example' => 'نوشته كج كوله',
+ 'wikieditor-toolbar-tool-ilink' => 'لینک مئن ون',
+ 'wikieditor-toolbar-tool-ilink-example' => 'عنوان لينك',
+ 'wikieditor-toolbar-tool-xlink-example' => 'http://www.example.com نوم ديس ون',
+ 'wikieditor-toolbar-tool-link' => 'ديس ون',
+ 'wikieditor-toolbar-tool-link-int' => 'سی ويكی بلگه',
+ 'wikieditor-toolbar-tool-link-cancel' => 'رد كردن',
+ 'wikieditor-toolbar-file-size' => 'انازه',
+ 'wikieditor-toolbar-file-float' => 'د راست چيين',
+ 'wikieditor-toolbar-file-default' => 'پيش Ùرض',
+ 'wikieditor-toolbar-file-format' => 'قالو',
+ 'wikieditor-toolbar-file-format-none' => 'هيش كوم',
+ 'wikieditor-toolbar-tool-file-insert' => 'دائن',
+ 'wikieditor-toolbar-tool-file-cancel' => 'رد كردن',
+ 'wikieditor-toolbar-tool-reference' => 'سرچشمه',
+ 'wikieditor-toolbar-tool-reference-cancel' => 'رد كردن',
+ 'wikieditor-toolbar-tool-reference-title' => 'دائن سرچشمه',
+ 'wikieditor-toolbar-tool-reference-insert' => 'دائن',
+ 'wikieditor-toolbar-section-advanced' => 'پيشرÙته',
+ 'wikieditor-toolbar-tool-heading' => 'سربلگه',
+ 'wikieditor-toolbar-tool-small' => 'كؤچك',
+ 'wikieditor-toolbar-tool-small-example' => 'متن كؤچك',
+ 'wikieditor-toolbar-group-insert' => 'دائن',
+ 'wikieditor-toolbar-tool-newline' => 'خط تازه',
+ 'wikieditor-toolbar-tool-table' => 'جعوه',
+ 'wikieditor-toolbar-tool-replace-close' => 'بسن',
+ 'wikieditor-toolbar-characters-page-latin' => 'لاتين',
+ 'wikieditor-toolbar-characters-page-symbols' => 'نماديا',
+ 'wikieditor-toolbar-characters-page-greek' => 'هلنی',
+ 'wikieditor-toolbar-characters-page-cyrillic' => 'سريليك',
+ 'wikieditor-toolbar-characters-page-arabic' => 'عروی',
+ 'wikieditor-toolbar-characters-page-persian' => 'Ùارسی',
+ 'wikieditor-toolbar-characters-page-hebrew' => 'عبری',
+ 'wikieditor-toolbar-characters-page-bangla' => 'بانگلا',
+ 'wikieditor-toolbar-characters-page-tamil' => 'تاميل',
+ 'wikieditor-toolbar-characters-page-telugu' => 'تلوگو',
+ 'wikieditor-toolbar-characters-page-sinhala' => 'سين هالا',
+ 'wikieditor-toolbar-characters-page-gujarati' => 'گجرات',
+ 'wikieditor-toolbar-characters-page-devanagari' => 'دوانگاری',
+ 'wikieditor-toolbar-characters-page-thai' => 'تايی',
+ 'wikieditor-toolbar-characters-page-lao' => 'لائو',
+ 'wikieditor-toolbar-characters-page-khmer' => 'خمر',
+ 'wikieditor-toolbar-section-help' => 'هومياری',
+ 'wikieditor-toolbar-help-page-discussion' => 'Ú¯Ù¾',
+ 'wikieditor-toolbar-help-content-indent-description' => 'مئن رئته',
+);
+
/** Lithuanian (lietuvių)
* @author Eitvys200
* @author Garas
@@ -16836,7 +17149,7 @@ $messages['lt'] = array(
'wikieditor-toolbar' => 'Redagavimo įrankių juosta',
'wikieditor-toolbar-desc' => 'Redaguoti įrankių juostą, siekiant didesnio praktiškumo',
'wikieditor-toolbar-preference' => 'Įjungti naudingesnę įrankių juostą',
- 'wikieditor-toolbar-dialogs-preference' => 'Įjungti dialogus įterpti nuorodas, lenteles ir daugiau',
+ 'wikieditor-toolbar-dialogs-preference' => 'Įjungti dialogus įterpti nuorodas, lenteles ir daugiau', # Fuzzy
'wikieditor-toolbar-loading' => 'Kraunama...',
'wikieditor-toolbar-tool-bold' => 'Paryškinti',
'wikieditor-toolbar-tool-bold-example' => 'Paryškinti tekstą',
@@ -17272,7 +17585,7 @@ $messages['lv'] = array(
'wikieditor-toolbar' => 'Rediģēšanas rīku josla',
'wikieditor-toolbar-desc' => 'Rediģēšanas rīku josla ar uzlabotu lietojamību',
'wikieditor-toolbar-preference' => 'Izmantot paplaÅ¡inÄto rediģēšanas rÄ«kjoslu',
- 'wikieditor-toolbar-dialogs-preference' => 'Izmantot dialoga logus saišu, tabulu u.c. ievietošanai',
+ 'wikieditor-toolbar-dialogs-preference' => 'Izmantot dialoga logus saišu, tabulu u.c. ievietošanai', # Fuzzy
'wikieditor-toolbar-loading' => 'IelÄdē…',
'wikieditor-toolbar-tool-bold' => 'Pustrekns',
'wikieditor-toolbar-tool-bold-example' => 'Pustrekns teksts',
@@ -17472,6 +17785,13 @@ $1:Example.jpg|Apraksts2',
'wikieditor-toolbar-help-content-indent-result' => 'Teksts bez atkÄpes<dl><dd>Teksts ar atkÄpi<dl><dd>Teksts ar atkÄpi</dd></dl></dd></dl>',
);
+/** Literary Chinese (文言)
+ * @author Yanteng3
+ */
+$messages['lzh'] = array(
+ 'wikieditor-loading' => '載之……',
+);
+
/** Lazuri (Lazuri)
* @author Bombola
*/
@@ -17571,7 +17891,7 @@ $messages['min'] = array(
'wikieditor-toolbar' => 'Bilah suntiang',
'wikieditor-toolbar-desc' => 'Laman bilah suntiang jo kagunoan lanjuik',
'wikieditor-toolbar-preference' => 'Aktipan bilah panyuntiangan tingkek lanjuik',
- 'wikieditor-toolbar-dialogs-preference' => 'Aktipan bantuan untuak manambah pautan, tabel dan lainnyo',
+ 'wikieditor-toolbar-dialogs-preference' => 'Aktipan bantuan untuak manambah pautan, tabel dan lainnyo', # Fuzzy
'wikieditor-toolbar-hidesig' => 'Suruakan tombol tando tangan dari laman pado ruang namo utama',
'wikieditor-toolbar-loading' => 'Loading...',
'wikieditor-toolbar-tool-bold' => 'Taba',
@@ -17823,7 +18143,7 @@ $messages['mk'] = array(
'wikieditor-toolbar' => 'Ðлатник за уредување',
'wikieditor-toolbar-desc' => 'Ðлатник за уредување Ñо подобрена употребливоÑÑ‚',
'wikieditor-toolbar-preference' => 'Вклучи го подобрениот алатник за уредување',
- 'wikieditor-toolbar-dialogs-preference' => 'Овозможи дијалози за вметнување врÑки, табели и повеќе',
+ 'wikieditor-toolbar-dialogs-preference' => 'Овозможи помошници за вметнување врÑки, табели, како и можноÑта за пребарување и замена',
'wikieditor-toolbar-hidesig' => 'Скриј го копчето за Ð¿Ð¾Ñ‚Ð¿Ð¸Ñ Ð½Ð° Ñтраниците во главниот именÑки проÑтор',
'wikieditor-toolbar-loading' => 'Вчитувам...',
'wikieditor-toolbar-tool-bold' => 'Задебелено',
@@ -17851,6 +18171,7 @@ $messages['mk'] = array(
'wikieditor-toolbar-tool-link-int-target-status-invalid' => 'Погрешен наÑлов',
'wikieditor-toolbar-tool-link-int-target-status-external' => 'Ðадворешна врÑка',
'wikieditor-toolbar-tool-link-int-target-status-loading' => 'Проверувам дали поÑтои Ñтраницата...',
+ 'wikieditor-toolbar-tool-link-int-target-status-disambig' => 'ПојаÑнителна Ñтраница',
'wikieditor-toolbar-tool-link-int-invalid' => 'Ðаведениот наÑлов е неважечки.',
'wikieditor-toolbar-tool-link-lookslikeinternal' => 'URL адреÑата која ја назначивте изгледа како врÑка до друга вики-Ñтраница. Сакате ова да биде внатрешна врÑка?',
'wikieditor-toolbar-tool-link-lookslikeinternal-int' => 'Внатрешна врÑка',
@@ -18073,7 +18394,7 @@ $messages['ml'] = array(
'wikieditor-toolbar' => 'തിരàµà´¤àµà´¤àµ½ പണിപàµà´ªàµ†à´Ÿàµà´Ÿà´¿',
'wikieditor-toolbar-desc' => 'തിരàµà´¤àµà´¤à´¾à´¨àµà´³àµà´³ താളിൽ മെചàµà´šà´ªàµà´ªàµ†à´Ÿàµà´Ÿ ഉപയോഗതàµà´¤à´¿à´¨à´¾à´¯àµà´³àµà´³ പണിപàµà´ªàµ†à´Ÿàµà´Ÿà´¿',
'wikieditor-toolbar-preference' => 'തിരàµà´¤àµà´¤àµà´µà´¾à´¨àµà´³àµà´³ വിശദ പണിപàµà´ªàµ†à´Ÿàµà´Ÿà´¿ ഉപയോഗപàµà´ªàµ†à´Ÿàµà´¤àµà´¤àµà´•',
- 'wikieditor-toolbar-dialogs-preference' => 'à´•à´£àµà´£à´¿à´•àµ¾, പടàµà´Ÿà´¿à´•à´•àµ¾ à´¤àµà´Ÿà´™àµà´™à´¿à´¯à´µ ഉൾപàµà´ªàµ†à´Ÿàµà´¤àµà´¤à´¾à´¨àµà´³àµà´³ സൗകരàµà´¯à´‚ സജàµà´œà´®à´¾à´•àµà´•àµà´•',
+ 'wikieditor-toolbar-dialogs-preference' => 'à´•à´£àµà´£à´¿à´•àµ¾, പടàµà´Ÿà´¿à´•à´•àµ¾ à´’à´ªàµà´ªà´‚ തിരഞàµà´žàµ à´•à´£àµà´Ÿàµ†à´¤àµà´¤à´¾à´¨àµà´‚ മാറàµà´±à´¾à´¨àµà´‚ ഉളàµà´³ സൗകരàµà´¯à´‚ à´¤àµà´Ÿà´™àµà´™à´¿à´¯à´µ ഉൾപàµà´ªàµ†à´Ÿàµà´¤àµà´¤à´¾à´¨àµà´³àµà´³ വഴികാടàµà´Ÿà´¿ സജàµà´œà´®à´¾à´•àµà´•àµà´•',
'wikieditor-toolbar-hidesig' => 'à´ªàµà´°à´§à´¾à´¨ നാമമേഖലയിലàµà´³àµà´³ താളàµà´•à´³à´¿àµ½ à´’à´ªàµà´ªà´¿à´Ÿà´¾à´¨àµà´³àµà´³ ബടàµà´Ÿàµº മറയàµà´•àµà´•àµà´•',
'wikieditor-toolbar-loading' => 'ശേഖരികàµà´•àµà´¨àµà´¨àµ...',
'wikieditor-toolbar-tool-bold' => 'à´•à´Ÿàµà´ªàµà´ªà´¿à´•àµà´•àµà´•',
@@ -18101,6 +18422,7 @@ $messages['ml'] = array(
'wikieditor-toolbar-tool-link-int-target-status-invalid' => 'അസാധàµà´µà´¾à´¯ തലകàµà´•àµ†à´Ÿàµà´Ÿàµ',
'wikieditor-toolbar-tool-link-int-target-status-external' => 'à´ªàµà´±à´¤àµà´¤àµ‡à´¯àµà´•àµà´•àµà´³àµà´³ à´•à´£àµà´£à´¿',
'wikieditor-toolbar-tool-link-int-target-status-loading' => 'താൾ നിലനിൽകàµà´•àµà´¨àµà´¨àµà´£àµà´Ÿàµ‹ à´Žà´¨àµà´¨àµ പരിശോധികàµà´•àµà´¨àµà´¨àµ...',
+ 'wikieditor-toolbar-tool-link-int-target-status-disambig' => 'വിവകàµà´·à´¿à´¤à´¤à´¾àµ¾',
'wikieditor-toolbar-tool-link-int-invalid' => 'താങàµà´•àµ¾ നൽകിയ തലകàµà´•àµ†à´Ÿàµà´Ÿàµ അസാധàµà´µà´¾à´£àµ.',
'wikieditor-toolbar-tool-link-lookslikeinternal' => 'താങàµà´•àµ¾ à´µàµà´¯à´•àµà´¤à´®à´¾à´•àµà´•à´¿à´¯ യൂ.ആർ.എൽ. à´•à´£àµà´Ÿà´¿à´Ÿàµà´Ÿàµ മറàµà´±àµŠà´°àµ വികàµà´•à´¿ താളിലേയàµà´•àµà´•àµà´³àµà´³à´¤à´¾à´£àµ†à´¨àµà´¨àµ തോനàµà´¨àµà´¨àµà´¨àµ. ഇതൊരൠആഭàµà´¯à´¨àµà´¤à´° à´•à´£àµà´£à´¿ ആകàµà´•à´£àµ‹?',
'wikieditor-toolbar-tool-link-lookslikeinternal-int' => 'ആഭàµà´¯à´¨àµà´¤à´° à´•à´£àµà´£à´¿',
@@ -18220,6 +18542,7 @@ $1:Example.jpg|à´•àµà´±à´¿à´ªàµà´ªàµ2',
'wikieditor-toolbar-characters-page-lao' => 'ലാവോ',
'wikieditor-toolbar-characters-page-khmer' => 'ഖെമർ',
'wikieditor-toolbar-characters-endash' => 'ഇം ഡാഷàµ',
+ 'wikieditor-toolbar-characters-emdash' => 'à´Žà´‚ ഡാഷàµ',
'wikieditor-toolbar-characters-minus' => 'à´µàµà´¯à´µà´•à´²à´¨ à´šà´¿à´¹àµà´¨à´‚',
'wikieditor-toolbar-section-help' => 'സഹായം',
'wikieditor-toolbar-help-heading-description' => 'വിവരണം',
@@ -18310,22 +18633,22 @@ $messages['mr'] = array(
'wikieditor' => 'विकिमजकूर संपादनाची विकसित सà¥à¤µà¤¿à¤§à¤¾',
'wikieditor-desc' => 'विसà¥à¤¤à¤¾à¤°à¤£à¥€à¤¯ विकिमजकà¥à¤° संपादन आंतरपृषà¥à¤  (इंटरफेस) आणि बरà¥â€à¤¯à¤¾à¤š वैशिषà¥à¤Ÿà¥à¤¯à¤ªà¥‚रà¥à¤£ निशà¥à¤šà¤¯à¤¿à¤•à¤¾ (मॊडà¥à¤¯à¥‚लà¥à¤¸) पà¥à¤°à¤µà¤¤à¥‡',
'wikieditor-wikitext-tab' => 'विकिमजकूर',
- 'wikieditor-loading' => 'चढवत आहे…',
+ 'wikieditor-loading' => 'पà¥à¤°à¤­à¤¾à¤°à¤£ करीत आहे',
'wikieditor-preview-preference' => 'सोबतच आजà¥-बाजूस दिसणारी à¤à¤²à¤• शकà¥à¤¯ करा.',
'wikieditor-preview-tab' => 'à¤à¤²à¤•',
'wikieditor-preview-changes-tab' => 'बदल',
- 'wikieditor-preview-loading' => 'चढवत आहे…',
+ 'wikieditor-preview-loading' => 'पà¥à¤°à¤­à¤¾à¤°à¤£ करीत आहे',
'wikieditor-previewDialog-preference' => '"à¤à¤²à¤• पहा" चौकट सकà¥à¤·à¤® करा',
'wikieditor-previewDialog-tab' => 'à¤à¤²à¤• पहा',
- 'wikieditor-previewDialog-loading' => 'चढवत आहे…',
+ 'wikieditor-previewDialog-loading' => 'पà¥à¤°à¤­à¤¾à¤°à¤£ करीत आहे',
'wikieditor-publish-preference' => 'टपà¥à¤ªà¥à¤¯à¤¾-टपà¥à¤ªà¥à¤¯à¤¾à¤¨à¥‡ पà¥à¤°à¤•à¤¾à¤¶à¤¨ शकà¥à¤¯ करा',
'wikieditor-publish-button-publish' => 'पà¥à¤°à¤•à¤¾à¤¶à¤¿à¤¤ करा
दाखवा',
'wikieditor-publish-button-cancel' => 'रदà¥à¤¦ करा',
'wikieditor-publish-dialog-title' => '{{संकेतसà¥à¤¥à¤³à¤¨à¤¾à¤µ}} येथे पà¥à¤°à¤¦à¤°à¥à¤¶à¤¿à¤¤ करा',
- 'wikieditor-publish-dialog-summary' => 'बदलांचा आढावा :(आपण केलेलà¥à¤¯à¤¾ बदलांचे थोडकà¥à¤¯à¤¾à¤¤ वरà¥à¤£à¤¨ करा.)',
+ 'wikieditor-publish-dialog-summary' => 'बदलांचा सारांश :(आपण केलेलà¥à¤¯à¤¾ बदलांचे थोडकà¥à¤¯à¤¾à¤¤ वरà¥à¤£à¤¨ करा):',
'wikieditor-publish-dialog-minor' => 'छोटा बदल',
- 'wikieditor-publish-dialog-watch' => 'या पानावर बदलांसाठी लकà¥à¤· ठेवा',
+ 'wikieditor-publish-dialog-watch' => 'पान निरीकà¥à¤·à¤£à¤¾à¤‚तरà¥à¤—त ठेवा',
'wikieditor-publish-dialog-publish' => 'पà¥à¤°à¤•à¤¾à¤¶à¤¿à¤¤ करा',
'wikieditor-publish-dialog-goback' => 'मागे जा',
'wikieditor-template-editor-preference' => 'विकि साचà¥à¤¯à¤¾à¤‚ची नमà¥à¤¨à¤¾ संपादन सकà¥à¤·à¤® करा',
@@ -18340,13 +18663,13 @@ $messages['mr'] = array(
'wikieditor-toolbar' => 'संपादन साधनपटà¥à¤Ÿà¥€',
'wikieditor-toolbar-desc' => 'सà¥à¤²à¤­à¥€à¤•à¤°à¤£à¤¾à¤¨à¥‡ वरà¥à¤§à¤¿à¤¤ संपादनपान साधनपटà¥à¤Ÿà¥€',
'wikieditor-toolbar-preference' => 'वरà¥à¤§à¤¿à¤¤ संपादन साधनपटà¥à¤Ÿà¥€ सकà¥à¤·à¤® करा',
- 'wikieditor-toolbar-dialogs-preference' => 'दà¥à¤µà¥‡, सारणà¥à¤¯à¤¾ (टेबल) आणि इतर भरणà¥à¤¯à¤¾à¤•à¤°à¤¿à¤¤à¤¾ dialogs सकà¥à¤·à¤® करा',
+ 'wikieditor-toolbar-dialogs-preference' => 'दà¥à¤µà¥‡, सारणà¥à¤¯à¤¾ (टेबल) आणि इतर भरणà¥à¤¯à¤¾à¤•à¤°à¤¿à¤¤à¤¾ dialogs सकà¥à¤·à¤® करा', # Fuzzy
'wikieditor-toolbar-hidesig' => 'मà¥à¤–à¥à¤¯ नामविशà¥à¤µà¤¾à¤¤à¥€à¤² पानांपासून सà¥à¤µà¤¾à¤•à¥à¤·à¤°à¥€à¤šà¥€ कळ लपवा',
- 'wikieditor-toolbar-loading' => 'चढवत आहे…',
+ 'wikieditor-toolbar-loading' => 'पà¥à¤°à¤­à¤¾à¤°à¤£ करीत आहे',
'wikieditor-toolbar-tool-bold' => 'ठळक',
'wikieditor-toolbar-tool-bold-example' => 'ठळक मजकूर',
'wikieditor-toolbar-tool-italic' => 'तिरपी मà¥à¤¦à¥à¤°à¤¾à¤•à¥à¤·à¤°à¥‡',
- 'wikieditor-toolbar-tool-italic-example' => 'तिरपी मà¥à¤¦à¥à¤°à¤¾à¤•à¥à¤·à¤°à¥‡',
+ 'wikieditor-toolbar-tool-italic-example' => 'तिरपà¥à¤¯à¤¾ मà¥à¤¦à¥à¤°à¤¾à¤•à¥à¤·à¤°à¤¾à¤¤à¥€à¤² मजकूर',
'wikieditor-toolbar-tool-ilink' => 'अंतरà¥à¤—त दà¥à¤µà¤¾',
'wikieditor-toolbar-tool-ilink-example' => 'शीरà¥à¤·à¤•à¤¾à¤¸ दà¥à¤µà¤¾ दà¥à¤¯à¤¾',
'wikieditor-toolbar-tool-xlink' => 'बाहà¥à¤¯ दà¥à¤µà¥à¤¯à¤¾à¤¤ (http:// हा उपसरà¥à¤— विसरू नका)',
@@ -18367,7 +18690,7 @@ $messages['mr'] = array(
'wikieditor-toolbar-tool-link-int-target-status-notexists' => 'पान असà¥à¤¤à¤¿à¤¤à¥à¤µà¤¾à¤¤ नाही',
'wikieditor-toolbar-tool-link-int-target-status-invalid' => 'अगà¥à¤°à¤¾à¤¹à¥à¤¯ शीरà¥à¤·à¤•',
'wikieditor-toolbar-tool-link-int-target-status-external' => 'बाहà¥à¤¯ दà¥à¤µà¤¾',
- 'wikieditor-toolbar-tool-link-int-target-status-loading' => 'पानाचे असà¥à¤¤à¤¿à¤¤à¥à¤µ तपासत आहे...',
+ 'wikieditor-toolbar-tool-link-int-target-status-loading' => 'पान असà¥à¤¤à¤¿à¤¤à¥à¤µ आहे काय ते तपासत आहे...',
'wikieditor-toolbar-tool-link-int-invalid' => 'तà¥à¤®à¥à¤¹à¥€ नमूद केलेले शीरà¥à¤·à¤• अगà¥à¤°à¤¾à¤¹à¥à¤¯ आहे.',
'wikieditor-toolbar-tool-link-lookslikeinternal' => 'तà¥à¤®à¥à¤¹à¥€ नमूद केलेली यूआरà¤à¤² इतर विकिपानास जोडावयाची आहे असे दिसते. तà¥à¤®à¥à¤¹à¤¾à¤²à¤¾ अंतरà¥à¤—त दà¥à¤µà¤¾ बनवायचा आहे काय ?',
'wikieditor-toolbar-tool-link-lookslikeinternal-int' => 'अंतरà¥à¤—त दà¥à¤µà¤¾',
@@ -18377,13 +18700,13 @@ $messages['mr'] = array(
'wikieditor-toolbar-tool-file-example' => 'उदाहरण.jpg',
'wikieditor-toolbar-tool-file-title' => 'चितà¥à¤° टाका',
'wikieditor-toolbar-file-target' => 'संचिकेचे नाव:',
- 'wikieditor-toolbar-file-caption' => 'वरà¥à¤£à¤¨:',
+ 'wikieditor-toolbar-file-caption' => 'मथळा:',
'wikieditor-toolbar-file-size' => 'आकार:',
'wikieditor-toolbar-file-float' => 'समास:',
- 'wikieditor-toolbar-file-format' => 'पà¥à¤°à¤•à¤¾à¤°',
+ 'wikieditor-toolbar-file-format' => 'पà¥à¤°à¤¾à¤°à¥à¤ª:',
'wikieditor-toolbar-file-format-none' => 'काहीही नाही',
'wikieditor-toolbar-tool-file-insert' => 'समाविषà¥à¤Ÿ करा',
- 'wikieditor-toolbar-tool-file-cancel' => 'रदà¥à¤¦',
+ 'wikieditor-toolbar-tool-file-cancel' => 'रदà¥à¤¦ करा',
'wikieditor-toolbar-tool-reference' => 'संदरà¥à¤­',
'wikieditor-toolbar-tool-reference-example' => 'तळटीप मजकूर येथे भरा',
'wikieditor-toolbar-tool-reference-cancel' => 'रदà¥à¤¦ करा',
@@ -18399,10 +18722,10 @@ $messages['mr'] = array(
'wikieditor-toolbar-tool-heading-4' => 'सà¥à¤¤à¤° ४',
'wikieditor-toolbar-tool-heading-5' => 'सà¥à¤¤à¤° ५',
'wikieditor-toolbar-tool-heading-example' => 'अगà¥à¤°à¤¶à¥€à¤°à¥à¤· मजकूर',
- 'wikieditor-toolbar-group-format' => 'आराखडा',
+ 'wikieditor-toolbar-group-format' => 'पà¥à¤°à¤¾à¤°à¥à¤ª',
'wikieditor-toolbar-tool-ulist' => 'बिंदी कà¥à¤°à¤®à¤¾à¤‚कन',
'wikieditor-toolbar-tool-ulist-example' => 'बिंदी कà¥à¤°à¤®à¤¾à¤‚कन घटक',
- 'wikieditor-toolbar-tool-olist' => 'अनà¥à¤•à¥à¤°à¤® यादी',
+ 'wikieditor-toolbar-tool-olist' => 'अनà¥à¤•à¥à¤°à¤®à¤¿à¤¤ यादी',
'wikieditor-toolbar-tool-olist-example' => 'अनà¥à¤•à¥à¤°à¤® यादी घटक',
'wikieditor-toolbar-tool-indent' => 'समासांतर',
'wikieditor-toolbar-tool-indent-example' => 'समासांतर ओळ',
@@ -18440,7 +18763,7 @@ $1:Example.jpg|चितà¥à¤°à¤ªà¤°à¤¿à¤šà¤¯ २',
'wikieditor-toolbar-tool-table-title' => 'सारणी समाविषà¥à¤Ÿ करा',
'wikieditor-toolbar-tool-table-dimensions-rows' => 'ओळी',
'wikieditor-toolbar-tool-table-dimensions-columns' => 'रकाना',
- 'wikieditor-toolbar-tool-table-dimensions-header' => 'मथळा ओळ जोडा',
+ 'wikieditor-toolbar-tool-table-dimensions-header' => 'शीरà¥à¤· ओळ जोडा',
'wikieditor-toolbar-tool-table-wikitable' => 'काठासहीत शैली',
'wikieditor-toolbar-tool-table-sortable' => 'सारणी कà¥à¤°à¤®à¤¾à¤¨à¥à¤¸à¤¾à¤°à¥€ करणà¥à¤¯à¤¾à¤œà¥‹à¤—ी करा',
'wikieditor-toolbar-tool-table-example' => 'उदाहरण',
@@ -18483,7 +18806,7 @@ $1:Example.jpg|चितà¥à¤°à¤ªà¤°à¤¿à¤šà¤¯ २',
'wikieditor-toolbar-characters-page-devanagari' => 'देवनागरी',
'wikieditor-toolbar-characters-page-thai' => 'थाई भाषा',
'wikieditor-toolbar-characters-page-lao' => 'लाऒ भाषा',
- 'wikieditor-toolbar-characters-page-khmer' => 'खमेर',
+ 'wikieditor-toolbar-characters-page-khmer' => 'खà¥à¤®à¥‡à¤°',
'wikieditor-toolbar-characters-minus' => 'ॠण चिनà¥à¤¹',
'wikieditor-toolbar-section-help' => 'साहायà¥à¤¯',
'wikieditor-toolbar-help-heading-description' => 'वरà¥à¤£à¤¨',
@@ -18526,7 +18849,7 @@ $1:Example.jpg|चितà¥à¤°à¤ªà¤°à¤¿à¤šà¤¯ २',
'wikieditor-toolbar-help-content-ulist-description' => 'बिंदीकà¥à¤°à¤®à¤¾à¤‚कीत यादी',
'wikieditor-toolbar-help-content-ulist-syntax' => '* यादी कलम<br />* यादी कलम',
'wikieditor-toolbar-help-content-ulist-result' => '<ul><li>यादी घटक</li><li>यादी घटक</li></ul>',
- 'wikieditor-toolbar-help-content-olist-description' => 'अनà¥à¤•à¥à¤°à¤® यादी',
+ 'wikieditor-toolbar-help-content-olist-description' => 'अनà¥à¤•à¥à¤°à¤®à¤¿à¤¤ यादी',
'wikieditor-toolbar-help-content-olist-syntax' => '# यादी घटक<br /># यादी घटक',
'wikieditor-toolbar-help-content-olist-result' => '<ol><li>यादी घटक</li><li>यादी घटक</li></ol>',
'wikieditor-toolbar-help-content-file-description' => 'संलगà¥à¤¨ संचिका',
@@ -18540,8 +18863,7 @@ $1:Example.jpg|चितà¥à¤°à¤ªà¤°à¤¿à¤šà¤¯ २',
'wikieditor-toolbar-help-content-rereference-result' => "पान मजकूर.<sup><a href='#'>[1]</a></sup>",
'wikieditor-toolbar-help-content-showreferences-description' => 'संदरà¥à¤­ दरà¥à¤¶à¤µà¤¾',
'wikieditor-toolbar-help-content-showreferences-result' => "<ol class='references'><li id='cite_note-test-0'><b><a title='' href='#'>^</a></b> <a rel='nofollow' title='http://www.example.org' class='external text' href='#'>Link text</a>, additional text.</li></ol>",
- 'wikieditor-toolbar-help-content-signaturetimestamp-description' => 'वेळेसह तà¥à¤®à¤šà¥€ सही
-तà¥à¤®à¤šà¥€ सही व वेळ',
+ 'wikieditor-toolbar-help-content-signaturetimestamp-description' => 'सही आणि वेळठसा',
'wikieditor-toolbar-help-content-signaturetimestamp-result' => "<a href='#' title='{{#special:mypage}}'>सदसà¥à¤¯à¤¨à¤¾à¤µ</a> (<a href='#' title='{{#special:mytalk}}'>चरà¥à¤šà¤¾</a>) 15:54, 10 June 2009 (UTC)",
'wikieditor-toolbar-help-content-signature-description' => 'सही',
'wikieditor-toolbar-help-content-signature-result' => "<a href='#' title='{{#विशेष:माà¤à¥‡à¤¸à¤¦à¤¸à¥à¤¯à¤ªà¤¾à¤¨}}'>सदसà¥à¤¯à¤¨à¤¾à¤µ</a> (<a href='#' title='{{#विशेष:माà¤à¥à¤¯à¤¾à¤šà¤°à¥à¤šà¤¾}}'>चरà¥à¤šà¤¾</a>)",
@@ -18590,7 +18912,7 @@ $messages['ms'] = array(
'wikieditor-toolbar' => 'Bar alatan penyuntingan',
'wikieditor-toolbar-desc' => 'Bar alatan penyuntingan maju',
'wikieditor-toolbar-preference' => 'Bolehkan alatan penyuntingan maju',
- 'wikieditor-toolbar-dialogs-preference' => 'Aktifkan dialog untuk menyelitkan pautan, jadual dan lain-lain',
+ 'wikieditor-toolbar-dialogs-preference' => 'Bolehkan pendeta untuk menyisipkan pautan di samping juga fungsi cari dan ganti',
'wikieditor-toolbar-hidesig' => 'Sorokkan butang tandatangan daripada laman-laman dalam ruang nama utama',
'wikieditor-toolbar-loading' => 'Memuatkan...',
'wikieditor-toolbar-tool-bold' => 'Teks tebal',
@@ -18618,6 +18940,7 @@ $messages['ms'] = array(
'wikieditor-toolbar-tool-link-int-target-status-invalid' => 'Tajuk tidak sah',
'wikieditor-toolbar-tool-link-int-target-status-external' => 'Pautan luar',
'wikieditor-toolbar-tool-link-int-target-status-loading' => 'Memeriksa kewujudan laman...',
+ 'wikieditor-toolbar-tool-link-int-target-status-disambig' => 'Halaman nyahkekaburan',
'wikieditor-toolbar-tool-link-int-invalid' => 'Tajuk yang anda nyatakan tidak sah.',
'wikieditor-toolbar-tool-link-lookslikeinternal' => 'URL yang diselitkan merupakan halaman wiki? Adakah anda ingin menyelitkan pautan dalaman?',
'wikieditor-toolbar-tool-link-lookslikeinternal-int' => 'Pautan dalaman',
@@ -18839,7 +19162,7 @@ $messages['mt'] = array(
'wikieditor-toolbar' => 'Kaxxa tal-għodda għall-immodifikar',
'wikieditor-toolbar-desc' => "Immodifika l-kaxxa tal-għodda b'akbar użabilità",
'wikieditor-toolbar-preference' => 'Awtorizza l-użu tal-kaxxa tal-għodda estiża',
- 'wikieditor-toolbar-dialogs-preference' => "Awtorizza l-għajnuna għaż-żieda ta' test wiki avvanzat",
+ 'wikieditor-toolbar-dialogs-preference' => "Awtorizza l-għajnuna għaż-żieda ta' test wiki avvanzat", # Fuzzy
'wikieditor-toolbar-hidesig' => 'Aħbi l-buttuna tal-firma mill-paġni tal-ispazju tal-isem prinċipali',
'wikieditor-toolbar-loading' => "Tiela'...",
'wikieditor-toolbar-tool-bold' => 'Tipa ħoxna',
@@ -19113,7 +19436,7 @@ $messages['nah'] = array(
'wikieditor-toolbar' => 'Tlayêyèktlàlilòkàtekitiâpalli',
'wikieditor-toolbar-desc' => 'Ìtekitiâpal in tlayêyèktlàlilòkàtlaìxtlapalli ìwàn okảchi kuâkualli tlamantli tlatekitiliskàyòtl',
'wikieditor-toolbar-preference' => 'Motekitìltìs in okảchi kualli tekitiâpalli tlèn ìka tlayêyèktlàlilo',
- 'wikieditor-toolbar-dialogs-preference' => 'Motekitìltìs tlanônòtzaliskàyòtl tlèn ìnka tlatzòtzòwìltlàlilòs, tlatlapaltlàlilòs wàn oksẻki îtlàtlèn monẻkis motlàlìs',
+ 'wikieditor-toolbar-dialogs-preference' => 'Motekitìltìs tlanônòtzaliskàyòtl tlèn ìnka tlatzòtzòwìltlàlilòs, tlatlapaltlàlilòs wàn oksẻki îtlàtlèn monẻkis motlàlìs', # Fuzzy
'wikieditor-toolbar-hidesig' => 'Motlàtìs in machiòpàchitl ìwikpa ìtlaìxtlapalwàn in achkàuhtòkâyẻyàntli',
'wikieditor-toolbar-loading' => 'Motlamàmaltîtỉka....',
'wikieditor-toolbar-tool-bold' => 'Tlìltik',
@@ -19255,10 +19578,11 @@ $messages['nah'] = array(
'wikieditor-toolbar-help-content-indent-result' => 'Sâsanỉman tlâkuilòlmantli<dl><dd>Tlâtlapouhki tlakuilòlmantli<dl><dd>Tlâtlapouhki tlâkuilòlmantli</dd></dl></dd></dl>',
);
-/** Norwegian Bokmål (norsk (bokmål)‎)
+/** Norwegian Bokmål (norsk bokmål)
* @author Danmichaelo
* @author Event
* @author Haakon K
+ * @author Jeblad
* @author Jsoby
* @author Laaknor
* @author Nghtwlkr
@@ -19268,14 +19592,14 @@ $messages['nb'] = array(
'wikieditor' => 'Avansert grensesnitt for redigering av wikitekst',
'wikieditor-desc' => 'Gir et utvidbart tekstredigeringsgrensesnitt og mange utvidelsesmoduler',
'wikieditor-wikitext-tab' => 'Wikitekst',
- 'wikieditor-loading' => 'Laster',
+ 'wikieditor-loading' => 'Laster…',
'wikieditor-preview-preference' => 'Aktiver forhåndsvisning side-ved-side',
'wikieditor-preview-tab' => 'Forhåndsvisning',
'wikieditor-preview-changes-tab' => 'Endringer',
- 'wikieditor-preview-loading' => 'Laster...',
+ 'wikieditor-preview-loading' => 'Laster…',
'wikieditor-previewDialog-preference' => 'Aktiver forhåndsvisningsdialog',
'wikieditor-previewDialog-tab' => 'Forhåndsvisning',
- 'wikieditor-previewDialog-loading' => 'Laster...',
+ 'wikieditor-previewDialog-loading' => 'Laster…',
'wikieditor-publish-preference' => 'Aktiver steg-for-steg publisering',
'wikieditor-publish-button-publish' => 'Publiser',
'wikieditor-publish-button-cancel' => 'Avbryt',
@@ -19296,9 +19620,9 @@ $messages['nb'] = array(
'wikieditor-toolbar' => 'Verktøylinje for redigering',
'wikieditor-toolbar-desc' => 'Verktøylinje for redigering med utvidet brukervennlighet',
'wikieditor-toolbar-preference' => 'Aktiver utvidet verktøylinje for redigering',
- 'wikieditor-toolbar-dialogs-preference' => 'Slå på dialoger for innsetting av lenker, tabeller og mer',
+ 'wikieditor-toolbar-dialogs-preference' => 'Slå på dialoger for innsetting av lenker, tabeller og mer', # Fuzzy
'wikieditor-toolbar-hidesig' => 'Skjul signaturknappen fra sider i hovednavnerommet',
- 'wikieditor-toolbar-loading' => 'Laster...',
+ 'wikieditor-toolbar-loading' => 'Laster…',
'wikieditor-toolbar-tool-bold' => 'Fet',
'wikieditor-toolbar-tool-bold-example' => 'Fet tekst',
'wikieditor-toolbar-tool-italic' => 'Kursiv',
@@ -19323,7 +19647,7 @@ $messages['nb'] = array(
'wikieditor-toolbar-tool-link-int-target-status-notexists' => 'Siden finnes ikke',
'wikieditor-toolbar-tool-link-int-target-status-invalid' => 'Ugyldig tittel',
'wikieditor-toolbar-tool-link-int-target-status-external' => 'Ekstern lenke',
- 'wikieditor-toolbar-tool-link-int-target-status-loading' => 'Kontrollerer om siden finnes...',
+ 'wikieditor-toolbar-tool-link-int-target-status-loading' => 'Kontrollerer om siden finnes…',
'wikieditor-toolbar-tool-link-int-invalid' => 'Tittelen du gav er ugyldig',
'wikieditor-toolbar-tool-link-lookslikeinternal' => 'URLen du la inn ser ut som en lenke til en annen wikiside. Vil du gjøre den til en internlenke?',
'wikieditor-toolbar-tool-link-lookslikeinternal-int' => 'Intern lenke',
@@ -19405,7 +19729,7 @@ $1:Example.jpg|Bildetekst2',
'wikieditor-toolbar-tool-table-preview' => 'Forhåndsvisning',
'wikieditor-toolbar-tool-table-insert' => 'Sett inn',
'wikieditor-toolbar-tool-table-cancel' => 'Avbryt',
- 'wikieditor-toolbar-tool-table-toomany' => 'Det er ikke mulig å sette inn mer enn $1 celler med denne boksen.', # Fuzzy
+ 'wikieditor-toolbar-tool-table-toomany' => 'Det er ikke mulig å sette inn mer enn $1 celler med denne dialogen.', # Fuzzy
'wikieditor-toolbar-tool-table-invalidnumber' => 'Du har ikke skrevet inn et gyldig antall rader eller kolonner.',
'wikieditor-toolbar-tool-table-zero' => 'De kan ikke sette inn en tabell med null rader eller kolonner.',
'wikieditor-toolbar-tool-replace' => 'Søk og erstatt',
@@ -19419,7 +19743,7 @@ $1:Example.jpg|Bildetekst2',
'wikieditor-toolbar-tool-replace-button-replaceall' => 'Erstatt alle',
'wikieditor-toolbar-tool-replace-close' => 'Lukk',
'wikieditor-toolbar-tool-replace-nomatch' => 'Søket ga ingen resultater.',
- 'wikieditor-toolbar-tool-replace-success' => 'Gjorde $1 erstating(er).', # Fuzzy
+ 'wikieditor-toolbar-tool-replace-success' => '{{PLURAL:$1|En erstatning|$1 erstatninger}} utført.',
'wikieditor-toolbar-tool-replace-emptysearch' => 'Du skrev ikke inn noe å søke etter.',
'wikieditor-toolbar-tool-replace-invalidregex' => 'Det regulære uttrykket du skrev inn er ugyldig: $1',
'wikieditor-toolbar-section-characters' => 'Spesialtegn',
@@ -19510,18 +19834,21 @@ $1:Example.jpg|Bildetekst2',
'wikieditor-toolbar-help-content-indent-result' => 'Normal tekst<dl><dd>Innrykket tekst<dl><dd>Innrykket tekst</dd></dl></dd></dl>',
);
-/** Nedersaksies (Nedersaksies)
+/** Low Saxon (Netherlands) (Nedersaksies)
* @author Servien
*/
$messages['nds-nl'] = array(
'wikieditor' => 'Uutebreien tekstverwarker veur wikitekste',
- 'wikieditor-desc' => "Hierdeur krie-j n tekstverwarker veur wikitekste die'j uut kunnen breien en modules mit extra funksies",
+ 'wikieditor-desc' => "Hierdeur krie'j n tekstverwarker veur wikitekste die'j uut kunnen breien en modules mit extra funksies",
'wikieditor-wikitext-tab' => 'Wikitekste',
- 'wikieditor-loading' => 'An t laojen',
+ 'wikieditor-loading' => 'An t laojen...',
'wikieditor-preview-preference' => 'Bewarken en naokieken naos mekaar',
'wikieditor-preview-tab' => 'Naokieken',
'wikieditor-preview-changes-tab' => 'Wiezigingen',
'wikieditor-preview-loading' => 'An t laojen...',
+ 'wikieditor-previewDialog-preference' => 't Naokiekvienster anzetten',
+ 'wikieditor-previewDialog-tab' => 'Naokieken',
+ 'wikieditor-previewDialog-loading' => 'An t laojen...',
'wikieditor-publish-preference' => 'Stap veur stap publiseren inschakelen',
'wikieditor-publish-button-publish' => 'Publiseren',
'wikieditor-publish-button-cancel' => 'Aofbreken',
@@ -19542,8 +19869,9 @@ $messages['nds-nl'] = array(
'wikieditor-toolbar' => 'Bewarkingswarkbalke',
'wikieditor-toolbar-desc' => 'Bewarkingsbalke die makkeliker te gebruken is',
'wikieditor-toolbar-preference' => 'De uutebreien bewarkingsbalke anzetten',
- 'wikieditor-toolbar-dialogs-preference' => 'Dialogen veur t plaotsen van verwiezingen, tabellen en meer inschakelen',
- 'wikieditor-toolbar-loading' => 'Bezig mit laojen...',
+ 'wikieditor-toolbar-dialogs-preference' => 'Dialogen inschakelen veur t plaotsen van verwiezingen, tabellen en zeuken en vervangen',
+ 'wikieditor-toolbar-hidesig' => 'De knoppe veur ondertekenen in disse naamruumte verbargen',
+ 'wikieditor-toolbar-loading' => 'An t laojen...',
'wikieditor-toolbar-tool-bold' => 'Vet',
'wikieditor-toolbar-tool-bold-example' => 'Vet-edrokten tekste',
'wikieditor-toolbar-tool-italic' => 'Schunedrokt',
@@ -19569,6 +19897,7 @@ $messages['nds-nl'] = array(
'wikieditor-toolbar-tool-link-int-target-status-invalid' => 'Ongeldige ziednaam',
'wikieditor-toolbar-tool-link-int-target-status-external' => 'Uutgaonde verwiezing',
'wikieditor-toolbar-tool-link-int-target-status-loading' => 'Is an t kieken of disse zied al besteet...',
+ 'wikieditor-toolbar-tool-link-int-target-status-disambig' => 'Deurverwieszied',
'wikieditor-toolbar-tool-link-int-invalid' => 'De op-egeven zied is ongeldig.',
'wikieditor-toolbar-tool-link-lookslikeinternal' => "t Lik as of t webadres da'j op-egeven hebben n verwiezing naor n aandere wikizied mut ween.
Wi'j der n interne verwiezing van maken?",
@@ -19577,6 +19906,16 @@ Wi'j der n interne verwiezing van maken?",
'wikieditor-toolbar-tool-link-empty' => 'Je hebben niks op-egeven um naor te verwiezen.',
'wikieditor-toolbar-tool-file' => 'Bestaand derbie doon',
'wikieditor-toolbar-tool-file-example' => 'Veurbeeld.jpg',
+ 'wikieditor-toolbar-tool-file-title' => 'Bestaand derbie doon',
+ 'wikieditor-toolbar-file-target' => 'Bestaandsnaam:',
+ 'wikieditor-toolbar-file-caption' => 'Bieschrift:',
+ 'wikieditor-toolbar-file-size' => 'Grootte:',
+ 'wikieditor-toolbar-file-float' => 'Uutliening:',
+ 'wikieditor-toolbar-file-default' => '(standard)',
+ 'wikieditor-toolbar-file-format' => 'Opmaak:',
+ 'wikieditor-toolbar-file-format-none' => 'gien',
+ 'wikieditor-toolbar-tool-file-insert' => 'Derbie doon',
+ 'wikieditor-toolbar-tool-file-cancel' => 'Aofbreken',
'wikieditor-toolbar-tool-reference' => 'Referensie',
'wikieditor-toolbar-tool-reference-example' => 'Plaots hier tekste veur de vootnote',
'wikieditor-toolbar-tool-reference-cancel' => 'Aofbreken',
@@ -19641,7 +19980,7 @@ $1:Veurbeeld2|Bieschrift2',
'wikieditor-toolbar-tool-table-preview' => 'Naokieken',
'wikieditor-toolbar-tool-table-insert' => 'Invoegen',
'wikieditor-toolbar-tool-table-cancel' => 'Aofbreken',
- 'wikieditor-toolbar-tool-table-toomany' => 'Je kunnen via dit dialoogvienster gien tabel derbie doon mit meer as $1 sellen.', # Fuzzy
+ 'wikieditor-toolbar-tool-table-toomany' => 'Je kunnen via dit dialoogvienster gien tabel derbie doon mit meer as 1000 sellen.',
'wikieditor-toolbar-tool-table-invalidnumber' => 'Je hebben nog gien geldig antal regels of kolommen op-egeven.',
'wikieditor-toolbar-tool-table-zero' => 'Je kunnen gien tabel derbie doon zonder regels of kolommen.',
'wikieditor-toolbar-tool-replace' => 'Zeuken en vervangen',
@@ -19651,10 +19990,11 @@ $1:Veurbeeld2|Bieschrift2',
'wikieditor-toolbar-tool-replace-case' => 'Heufdlettergeveulig',
'wikieditor-toolbar-tool-replace-regex' => 'De zeukreeks as reguliere expressie behaandelen',
'wikieditor-toolbar-tool-replace-button-findnext' => 'Volgende zeuken',
+ 'wikieditor-toolbar-tool-replace-button-replace' => 'Vervangen',
'wikieditor-toolbar-tool-replace-button-replaceall' => 'Alles vervangen',
'wikieditor-toolbar-tool-replace-close' => 'Sluten',
'wikieditor-toolbar-tool-replace-nomatch' => 'Joew zeukopdrach hef niks op-eleverd.',
- 'wikieditor-toolbar-tool-replace-success' => 'Der bin $1 vervangingen edaon.', # Fuzzy
+ 'wikieditor-toolbar-tool-replace-success' => 'Der {{PLURAL:$1|is één vervanging|bin $1 vervangingen}} edaon.',
'wikieditor-toolbar-tool-replace-emptysearch' => 'Je hebben gien zeukterm op-egeven.',
'wikieditor-toolbar-tool-replace-invalidregex' => "De reguliere die'j op-egeven hebben is ongeldig: $1",
'wikieditor-toolbar-section-characters' => 'Spesiale tekens',
@@ -19665,12 +20005,21 @@ $1:Veurbeeld2|Bieschrift2',
'wikieditor-toolbar-characters-page-greek' => 'Grieks',
'wikieditor-toolbar-characters-page-cyrillic' => 'Kyrillies',
'wikieditor-toolbar-characters-page-arabic' => 'Arabies',
+ 'wikieditor-toolbar-characters-page-arabicextended' => 'Arabies uutebreid',
'wikieditor-toolbar-characters-page-persian' => 'Perzies',
'wikieditor-toolbar-characters-page-hebrew' => 'Hebreeuws',
'wikieditor-toolbar-characters-page-bangla' => 'Bengaals',
+ 'wikieditor-toolbar-characters-page-tamil' => 'Tamil',
'wikieditor-toolbar-characters-page-telugu' => 'Telugu',
'wikieditor-toolbar-characters-page-sinhala' => 'Singalees',
'wikieditor-toolbar-characters-page-gujarati' => 'Gujarati',
+ 'wikieditor-toolbar-characters-page-devanagari' => 'Devanagari',
+ 'wikieditor-toolbar-characters-page-thai' => 'Thai',
+ 'wikieditor-toolbar-characters-page-lao' => 'Laotiaans',
+ 'wikieditor-toolbar-characters-page-khmer' => 'Khmer',
+ 'wikieditor-toolbar-characters-endash' => 'liggend streepjen',
+ 'wikieditor-toolbar-characters-emdash' => 'gedachtenstreepjen',
+ 'wikieditor-toolbar-characters-minus' => 'minteken',
'wikieditor-toolbar-section-help' => 'Hulpe',
'wikieditor-toolbar-help-heading-description' => 'Beschrieving',
'wikieditor-toolbar-help-heading-syntax' => "Wa'j tikken",
@@ -19750,6 +20099,7 @@ $messages['ne'] = array(
/** Dutch (Nederlands)
* @author Hamaryns
* @author McDutchie
+ * @author Romaine
* @author SPQRobin
* @author Siebrand
* @author Tvdm
@@ -19787,7 +20137,7 @@ $messages['nl'] = array(
'wikieditor-toolbar' => 'Bewerkingswerkbalk',
'wikieditor-toolbar-desc' => 'Bewerkingsbalk die eenvoudiger te gebruiken is',
'wikieditor-toolbar-preference' => 'Uitgebreide bewerkingsbalk inschakelen',
- 'wikieditor-toolbar-dialogs-preference' => 'Dialogen voor het toevoegen van koppelingen, tabellen en meer inschakelen',
+ 'wikieditor-toolbar-dialogs-preference' => 'Dialogen inschakelen voor het toevoegen van koppelingen, tabellen, en zoeken en vervangen',
'wikieditor-toolbar-hidesig' => 'De knop voor ondertekenen in deze naamruimte verbergen',
'wikieditor-toolbar-loading' => 'Bezig met laden…',
'wikieditor-toolbar-tool-bold' => 'Vet',
@@ -19815,6 +20165,7 @@ $messages['nl'] = array(
'wikieditor-toolbar-tool-link-int-target-status-invalid' => 'Ongeldige paginanaam',
'wikieditor-toolbar-tool-link-int-target-status-external' => 'Externe koppeling',
'wikieditor-toolbar-tool-link-int-target-status-loading' => 'Bezig met controleren of de pagina al bestaat...',
+ 'wikieditor-toolbar-tool-link-int-target-status-disambig' => 'Doorverwijspagina',
'wikieditor-toolbar-tool-link-int-invalid' => 'De opgegeven pagina is ongeldig.',
'wikieditor-toolbar-tool-link-lookslikeinternal' => 'De URL die u hebt opgegeven lijkt bedoeld te zijn als koppeling naar een andere wikipagina.
Wilt u er een interne koppeling van maken?',
@@ -20018,7 +20369,7 @@ Wil je er een interne koppeling van maken?',
'wikieditor-toolbar-help-heading-result' => 'Wat je te zien krijgt',
);
-/** Norwegian Nynorsk (norsk (nynorsk)‎)
+/** Norwegian Nynorsk (norsk nynorsk)
* @author Eirik
* @author Gunnernett
* @author Harald Khan
@@ -20055,7 +20406,7 @@ $messages['nn'] = array(
'wikieditor-toolbar' => 'Verktøyline for redigering',
'wikieditor-toolbar-desc' => 'Ei meir brukarvenleg verktøylinje for redigering',
'wikieditor-toolbar-preference' => 'Ta i bruk utvida verktøylinje for redigering',
- 'wikieditor-toolbar-dialogs-preference' => 'Aktiver dialogar for insetjing av lenkjer, tabellar og meir',
+ 'wikieditor-toolbar-dialogs-preference' => 'Aktiver dialogar for insetjing av lenkjer, tabellar og meir', # Fuzzy
'wikieditor-toolbar-loading' => 'Lastar …',
'wikieditor-toolbar-tool-bold' => 'Feit',
'wikieditor-toolbar-tool-bold-example' => 'Feit tekst',
@@ -20290,6 +20641,7 @@ $messages['nso'] = array(
);
/** Occitan (occitan)
+ * @author Beta16
* @author Boulaur
* @author Cedric31
* @author Jfblanc
@@ -20324,10 +20676,10 @@ $messages['oc'] = array(
'wikieditor-toc-preference' => "Activar l'ensenhador navigable",
'wikieditor-toc-show' => 'Afichar lo contengut',
'wikieditor-toc-hide' => 'Amagar lo contengut',
- 'wikieditor-toolbar' => 'Modificacion de la barra d’espleches',
- 'wikieditor-toolbar-desc' => "Modificacion de la barra d'espleches amb l'utilizabilitat melhorada",
- 'wikieditor-toolbar-preference' => "Activar la barra d'espleches melhorada",
- 'wikieditor-toolbar-dialogs-preference' => 'Activar las bóstias de dialòg per apondre de ligams, de tablèus e mai encara',
+ 'wikieditor-toolbar' => 'Barra d’aisinas de modificacion',
+ 'wikieditor-toolbar-desc' => "Modificacion de la barra d'aisinas amb l'utilizabilitat melhorada",
+ 'wikieditor-toolbar-preference' => "Activar la barra d'aisinas melhorada",
+ 'wikieditor-toolbar-dialogs-preference' => 'Activar las bóstias de dialòg per apondre de ligams, de tablèus e mai encara', # Fuzzy
'wikieditor-toolbar-hidesig' => "Amagar lo boton de signatura dins las paginas de l'espaci de noms principal",
'wikieditor-toolbar-loading' => 'Cargament ...',
'wikieditor-toolbar-tool-bold' => 'Gras',
@@ -20364,7 +20716,7 @@ $messages['oc'] = array(
'wikieditor-toolbar-tool-file-example' => 'Exemple.jpg',
'wikieditor-toolbar-tool-file-title' => 'Importar un fichièr',
'wikieditor-toolbar-file-target' => 'Nom de fichièr :',
- 'wikieditor-toolbar-file-caption' => 'Legenda :',
+ 'wikieditor-toolbar-file-caption' => 'Legenda:',
'wikieditor-toolbar-file-size' => 'Talha :',
'wikieditor-toolbar-file-float' => 'Alinhament :',
'wikieditor-toolbar-file-default' => '(per defaut)',
@@ -20539,7 +20891,7 @@ $1:Exemple.jpg|Descripcion 2',
'wikieditor-toolbar-help-content-indent-result' => 'Tèxte normal<dl><dd>Tèxte indentat<dl><dd>Tèxte indentat</dd></dl></dd></dl>',
);
-/** Oriya (ଓଡ଼ିଆ)
+/** Oriya (ଓଡ଼ିଆ)
* @author Ansumang
* @author Jnanaranjan Sahu
* @author Odisha1
@@ -20572,223 +20924,223 @@ $messages['or'] = array(
'wikieditor-template-editor-dialog-submit' => 'ଅପଡେଟ',
'wikieditor-template-editor-dialog-cancel' => 'ନାକଚ',
'wikieditor-templates-preference' => 'ଛାଞà­à¬šà¬° ଦେଖାଇବା-ଲà­à¬šà¬¾à¬‡à¬¬à¬¾ ସà­à¬¬à¬¿à¬§ ସଚଳ କରିବେ',
- 'wikieditor-toc-preference' => 'ଖୋଜା ଯାଇପାରà­à¬¥à¬¿à¬¬à¬¾ ସୂଚି',
- 'wikieditor-toc-show' => 'ସୂଚି ଦେଖାଇବେ',
- 'wikieditor-toc-hide' => 'ସୂଚି ଲà­à¬šà¬¾à¬‡à¬¬à­‡',
- 'wikieditor-toolbar' => 'ସମà­à¬ªà¬¾à¬¦à¬¨à¬¾ ଉପକରଣ ପଟିକା',
- 'wikieditor-toolbar-desc' => 'ଅଧିକ ବà­à­Ÿà¬¬à¬¹à¬¾à¬° ସà­à¬¬à¬¿à¬§à¬¾ ସହ ପୃଷà­à¬ à¬¾ ସମà­à¬ªà¬¾à¬¦à¬¨à¬¾ ଉପକରଣ ପଟିକା',
- 'wikieditor-toolbar-preference' => 'ଉନà­à¬¨à¬¤ ସମà­à¬ªà¬¾à¬¦à¬¨à¬¾ ଉପକରଣ ପେଡ଼ିକୠସଚଳ କରିବେ',
- 'wikieditor-toolbar-dialogs-preference' => 'ଲିଙà­à¬•, ସାରଣୀ ଓ ଅଧିକ ସà­à¬¬à¬¿à¬§à¬¾ ସବୠଯୋଡ଼ିବା ନିମନà­à¬¤à­‡ ଆଦେଶ ସଚଳ କରାଇବେ',
- 'wikieditor-toolbar-hidesig' => 'ମୂଳ ନେମସà­à¬ªà­‡à¬¸à¬°à­‡ ପୃଷà­à¬ à¬¾à¬®à¬¾à¬¨à¬™à­à¬•à¬°à­ ସନà­à¬¤à¬• ଦେବା ସà­à¬¬à¬¿à¬§à¬¾à¬Ÿà¬¿à¬•à­ ଲà­à¬šà¬¾à¬‡à¬¦à­‡à¬¬à­‡',
+ 'wikieditor-toc-preference' => 'ଖୋଜା ଯାଇପାରà­à¬¥à¬¿à¬¬à¬¾ ସୂଚୀ',
+ 'wikieditor-toc-show' => 'ସୂଚୀ ଦେଖାଇବେ',
+ 'wikieditor-toc-hide' => 'ସୂଚୀ ଲà­à¬šà¬¾à¬‡à¬¬à­‡',
+ 'wikieditor-toolbar' => 'ସମà­à¬ªà¬¾à¬¦à¬¨à¬¾ ଉପକରଣ ଟà­à¬²à¬¬à¬¾à¬°',
+ 'wikieditor-toolbar-desc' => 'ଅଧିକ ବà­à­Ÿà¬¬à¬¹à¬¾à¬° ସà­à¬¬à¬¿à¬§à¬¾ ସହ ପୃଷà­à¬ à¬¾ ସମà­à¬ªà¬¾à¬¦à¬¨à¬¾ ଉପକରଣ ଟà­à¬²à¬¬à¬¾à¬°',
+ 'wikieditor-toolbar-preference' => 'ଉନà­à¬¨à¬¤ ସମà­à¬ªà¬¾à¬¦à¬¨à¬¾ ଉପକରଣ ଟà­à¬²à¬¬à¬¾à¬° ସଚଳ କରନà­à¬¤à­',
+ 'wikieditor-toolbar-dialogs-preference' => 'ଲିଙà­à¬•, ସାରଣୀ ଓ ଅଧିକ ସà­à¬¬à¬¿à¬§à¬¾ ସବୠଯୋଡ଼ିବା ନିମନà­à¬¤à­‡ ଆଦେଶ ସଚଳ କରାଇବେ', # Fuzzy
+ 'wikieditor-toolbar-hidesig' => 'ମୂଳ ନେମସà­à¬ªà­‡à¬¸à¬°à­‡ ପୃଷà­à¬ à¬¾à¬®à¬¾à¬¨à¬™à­à¬•à¬°à­ ସନà­à¬¤à¬• (Sign) ଦେବା ସà­à¬¬à¬¿à¬§à¬¾à¬Ÿà¬¿à¬•à­ ଲà­à¬šà¬¾à¬‡à¬¦à­‡à¬¬à­‡',
'wikieditor-toolbar-loading' => 'ଖୋଲà­à¬…ଛି...',
- 'wikieditor-toolbar-tool-bold' => 'ମୋଟା ଅକà­à¬·à¬°',
- 'wikieditor-toolbar-tool-bold-example' => 'ମୋଟା ଲେଖା',
- 'wikieditor-toolbar-tool-italic' => 'ତେରେଛା',
- 'wikieditor-toolbar-tool-italic-example' => 'ତେରେଛା ଲେଖା',
- 'wikieditor-toolbar-tool-ilink' => 'ଭିତର ଲିଙà­à¬•',
- 'wikieditor-toolbar-tool-ilink-example' => 'ଲିଙà­à¬• ଶିରୋନାମା',
- 'wikieditor-toolbar-tool-xlink' => 'ବାହାର ଲିଙà­à¬• (http:// ଆଗରେ ଲଗାଇବାକୠମନେରଖିଥିବେ)',
- 'wikieditor-toolbar-tool-xlink-example' => 'http://www.example.com ଲିଙà­à¬• ଶିରୋନାମା',
+ 'wikieditor-toolbar-tool-bold' => 'ବୋଲà­â€Œà¬¡ (Bold)',
+ 'wikieditor-toolbar-tool-bold-example' => 'ବୋଲà­â€Œà¬¡ (Bold) ଲେଖା',
+ 'wikieditor-toolbar-tool-italic' => 'ତେରେଛା (Italic)',
+ 'wikieditor-toolbar-tool-italic-example' => 'ତେରେଛା ଲେଖା (Italic text)',
+ 'wikieditor-toolbar-tool-ilink' => 'ଇଣà­à¬Ÿà¬°à¬¨à¬¾à¬² ଲିଙà­à¬•',
+ 'wikieditor-toolbar-tool-ilink-example' => 'ଲିଙà­à¬• ଶିରୋନାମ',
+ 'wikieditor-toolbar-tool-xlink' => 'ବାହାର ଲିଙà­à¬• (ଲିଙà­à¬• ଆଗରୠhttp:// ଲଗାଇବେ)',
+ 'wikieditor-toolbar-tool-xlink-example' => 'http://www.example.com ଲିଙà­à¬• ଶିରୋନାମ',
'wikieditor-toolbar-tool-link' => 'ଲିଙà­à¬•',
- 'wikieditor-toolbar-tool-link-title' => 'ଲିଙà­à¬• ପà­à¬°à¬¾à¬‡à¬¬à­‡',
+ 'wikieditor-toolbar-tool-link-title' => 'ଲିଙà­à¬• ଭରିବେ',
'wikieditor-toolbar-tool-link-int' => 'à¬à¬• ଉଇକି ପୃଷà­à¬ à¬¾à¬•à­',
- 'wikieditor-toolbar-tool-link-int-target' => 'ଲକà­à¬· ପୃଷà­à¬ à¬¾ ବା URL:',
- 'wikieditor-toolbar-tool-link-int-target-tooltip' => 'ପୃଷà­à¬ à¬¾ ଶିରୋନାମା ଅବା URL',
- 'wikieditor-toolbar-tool-link-int-text' => 'ଦେଖଣା ଲେଖା:',
- 'wikieditor-toolbar-tool-link-int-text-tooltip' => 'ଦେଖଣା ଲେଖା',
- 'wikieditor-toolbar-tool-link-ext' => 'à¬à¬• ବାହାର ଵେବ ପୃଷà­à¬ à¬¾ ନିମନà­à¬¤à­‡',
+ 'wikieditor-toolbar-tool-link-int-target' => 'ଖୋଜିବାକୠଚାହà­à¬à¬¥à¬¿à¬¬à¬¾ ପୃଷà­à¬ à¬¾ ବା URL:',
+ 'wikieditor-toolbar-tool-link-int-target-tooltip' => 'ପୃଷà­à¬ à¬¾ ଶିରୋନାମ କିମà­à¬¬à¬¾ URL',
+ 'wikieditor-toolbar-tool-link-int-text' => 'ପà­à¬°à¬¦à¬°à­à¬¶à¬¿à¬¤ ହେବାକୠଥିବା ଲେଖା:',
+ 'wikieditor-toolbar-tool-link-int-text-tooltip' => 'ପà­à¬°à¬¦à¬°à­à¬¶à¬¿à¬¤ ହେବାକୠଥିବା ଲେଖା',
+ 'wikieditor-toolbar-tool-link-ext' => 'à¬à¬• ଉଇକି ବାହାର ୱେବ ପୃଷà­à¬ à¬¾à¬•à­',
'wikieditor-toolbar-tool-link-ext-target' => 'ଲିଙà­à¬• URL:',
'wikieditor-toolbar-tool-link-ext-text' => 'ଲିଙà­à¬• ଲେଖା:',
- 'wikieditor-toolbar-tool-link-insert' => 'ଲିଙà­à¬• ପà­à¬°à¬¾à¬‡à¬¬à­‡',
+ 'wikieditor-toolbar-tool-link-insert' => 'ଲିଙà­à¬• ଭରିବେ',
'wikieditor-toolbar-tool-link-cancel' => 'ନାକଚ',
- 'wikieditor-toolbar-tool-link-int-target-status-exists' => 'ପୃଷà­à¬ à¬¾à¬Ÿà¬¿ ଅଛି',
+ 'wikieditor-toolbar-tool-link-int-target-status-exists' => 'ପୃଷà­à¬ à¬¾à¬Ÿà¬¿ ଆଗରୠଅଛି',
'wikieditor-toolbar-tool-link-int-target-status-notexists' => 'ପୃଷà­à¬ à¬¾à¬Ÿà¬¿ ନାହିà¬',
- 'wikieditor-toolbar-tool-link-int-target-status-invalid' => 'ଅଚଳ ଶିରୋନାମା',
+ 'wikieditor-toolbar-tool-link-int-target-status-invalid' => 'ଅକାମୀ ଶିରୋନାମ',
'wikieditor-toolbar-tool-link-int-target-status-external' => 'ବାହାର ଲିଙà­à¬•',
- 'wikieditor-toolbar-tool-link-int-target-status-loading' => 'ପୃଷà­à¬ à¬¾à¬° ସà­à¬¥à¬¿à¬¤à¬¿ ଦେଖà­à¬…ଛି...',
- 'wikieditor-toolbar-tool-link-int-invalid' => 'ଆପଣ ଦେଇଥିବା ଶିରୋନାମାଟି ଅଚଳ ଅଟେ ।',
- 'wikieditor-toolbar-tool-link-lookslikeinternal' => 'ଆପଣ ଦେଇଥିବା URL ଟି ଆଉ ଗୋଟେ ଉଇକି ପୃଷà­à¬ à¬¾à¬° ଲିଙà­à¬• ଭଳି ବୋଧ ହେଉଛି ।
-ଆପଣ à¬à¬¹à¬¾à¬•à­ à¬à¬• ଭିତର ଲିଙà­à¬• କରିବାକୠଚାହାନà­à¬¤à¬¿ କି?',
- 'wikieditor-toolbar-tool-link-lookslikeinternal-int' => 'ଭିତର ଲିଙà­à¬•',
+ 'wikieditor-toolbar-tool-link-int-target-status-loading' => 'ପୃଷà­à¬ à¬¾à¬Ÿà¬¿ ଅଛି କି ନାହିଠଖୋଜà­à¬›à¬¿...',
+ 'wikieditor-toolbar-tool-link-int-invalid' => 'ଆପଣ ଦେଇଥିବା ଶିରୋନାମଟି କାମ କରà­à¬¨à¬¾à¬¹à¬¿à¬ ।',
+ 'wikieditor-toolbar-tool-link-lookslikeinternal' => 'ଆପଣ ଦେଇଥିବା URL ଟି ଆଉ ଗୋଟେ ଉଇକି ପୃଷà­à¬ à¬¾à¬° ଲିଙà­à¬• ଭଳି ଲାଗà­à¬›à¬¿ ।
+ଆପଣ à¬à¬¹à¬¾à¬•à­ à¬à¬• ଇଣà­à¬Ÿà¬°à¬²à¬¿à¬™à­à¬• କରିବାକୠଚାହାà¬à¬¨à­à¬¤à¬¿ କି?',
+ 'wikieditor-toolbar-tool-link-lookslikeinternal-int' => 'ଇଣà­à¬Ÿà¬°à¬¨à¬¾à¬² ଲିଙà­à¬•',
'wikieditor-toolbar-tool-link-lookslikeinternal-ext' => 'ବାହାର ଲିଙà­à¬•',
'wikieditor-toolbar-tool-link-empty' => 'ଆପଣ କିଛି ଲିଙà­à¬• ସମà­à¬ªà¬°à­à¬•à¬¿à¬¤ କରିବା ପାଇଠଦେଇନାହାନà­à¬¤à¬¿ ।',
- 'wikieditor-toolbar-tool-file' => 'à¬à¬®à¬¬à­‡à¬¡à¬¼ ହୋଇ ଥିବା ଫାଇଲ',
- 'wikieditor-toolbar-tool-file-example' => 'ଉଦାହରଣ.jpg',
- 'wikieditor-toolbar-tool-file-title' => 'ଫାଇଲà­â€Œ ପà­à¬°à¬¾à¬¨à­à¬¤à­',
- 'wikieditor-toolbar-file-target' => 'ଫାଇଲ ନାମ:',
- 'wikieditor-toolbar-file-caption' => 'ଶିରୋନାମା:',
+ 'wikieditor-toolbar-tool-file' => 'à¬à¬®à¬¬à­‡à¬¡à¬¼ ହୋଇଥିବା ଫାଇଲ',
+ 'wikieditor-toolbar-tool-file-example' => 'Example.jpg',
+ 'wikieditor-toolbar-tool-file-title' => 'ଫାଇଲ ଭରନà­à¬¤à­',
+ 'wikieditor-toolbar-file-target' => 'Filename:',
+ 'wikieditor-toolbar-file-caption' => 'ଶିରୋନାମ:',
'wikieditor-toolbar-file-size' => 'ଆକାର:',
'wikieditor-toolbar-file-float' => 'ସଜାଣି:',
- 'wikieditor-toolbar-file-default' => '(ମୂଳ)',
+ 'wikieditor-toolbar-file-default' => '(default)',
'wikieditor-toolbar-file-format' => 'ସଜାଣି:',
'wikieditor-toolbar-file-format-none' => 'କିଛି ନାହିà¬',
'wikieditor-toolbar-tool-file-insert' => 'ଭରିବେ',
'wikieditor-toolbar-tool-file-cancel' => 'ନାକଚ',
'wikieditor-toolbar-tool-reference' => 'ଆଧାର',
- 'wikieditor-toolbar-tool-reference-example' => 'à¬à¬ à¬¾à¬°à­‡ ପାଦଟୀକାଟି ରଖିବେ',
+ 'wikieditor-toolbar-tool-reference-example' => 'à¬à¬ à¬¾à¬°à­‡ ପାଦଟୀକାଟି ଭରିବେ',
'wikieditor-toolbar-tool-reference-cancel' => 'ନାକଚ',
'wikieditor-toolbar-tool-reference-title' => 'ଆଧାର ଦେବେ',
'wikieditor-toolbar-tool-reference-insert' => 'ଭରିବେ',
- 'wikieditor-toolbar-tool-reference-text' => 'ଆଧାର ଲେଖା',
- 'wikieditor-toolbar-tool-signature' => 'ସନà­à¬¤à¬• ଓ ସମୟଚିହà­à¬¨',
- 'wikieditor-toolbar-section-advanced' => 'ଉନà­à¬¨à¬¤',
- 'wikieditor-toolbar-tool-heading' => 'ଶିରୋନାମା',
- 'wikieditor-toolbar-tool-heading-1' => 'ସà­à¬¤à¬° à­§',
- 'wikieditor-toolbar-tool-heading-2' => 'ସà­à¬¤à¬° à­¨',
- 'wikieditor-toolbar-tool-heading-3' => 'ସà­à¬¤à¬° à­©',
- 'wikieditor-toolbar-tool-heading-4' => 'ସà­à¬¤à¬° à­ª',
- 'wikieditor-toolbar-tool-heading-5' => 'ସà­à¬¤à¬° à­«',
- 'wikieditor-toolbar-tool-heading-example' => 'ଶିରୋନାମା ଲେଖା',
- 'wikieditor-toolbar-group-format' => 'ସଜାଣି',
+ 'wikieditor-toolbar-tool-reference-text' => 'ଆଧାର ଟେକà­à¬¸à¬Ÿ',
+ 'wikieditor-toolbar-tool-signature' => 'ସନà­à¬¤à¬• ଓ ସମୟଚିହà­à¬¨ (Signature & timestamp)',
+ 'wikieditor-toolbar-section-advanced' => 'ଉନà­à¬¨à¬¤ (Advanced)',
+ 'wikieditor-toolbar-tool-heading' => 'ଶିରୋନାମ',
+ 'wikieditor-toolbar-tool-heading-1' => 'ସୋପାନ ୧',
+ 'wikieditor-toolbar-tool-heading-2' => 'ସୋପାନ ୨',
+ 'wikieditor-toolbar-tool-heading-3' => 'ସୋପାନ ୩',
+ 'wikieditor-toolbar-tool-heading-4' => 'ସୋପାନ ୪',
+ 'wikieditor-toolbar-tool-heading-5' => 'ସୋପାନ ୫',
+ 'wikieditor-toolbar-tool-heading-example' => 'ଶିରୋନାମ ଲେଖା',
+ 'wikieditor-toolbar-group-format' => 'ଫରମାଟ',
'wikieditor-toolbar-tool-ulist' => 'ବିନà­à¬¦à­ ଦିଆ ତାଲିକା',
'wikieditor-toolbar-tool-ulist-example' => 'ବିନà­à¬¦à­ ଦିଆ ତାଲିକା ବସà­à¬¤à­',
'wikieditor-toolbar-tool-olist' => 'ସଂଖà­à­Ÿà¬¾à¬¦à¬¿à¬† ତାଲିକା',
'wikieditor-toolbar-tool-olist-example' => 'ସଂଖà­à­Ÿà¬¾ ଦିଆ ତାଲିକା ବସà­à¬¤à­',
'wikieditor-toolbar-tool-indent' => 'ଅନà­à¬šà­à¬›à­‡à¬¦ ଛାଡ଼',
'wikieditor-toolbar-tool-indent-example' => 'ମାରà­à¬œà¬¿à¬¨à¬°à­ ଆରମà­à¬­ ଧାଡ଼ି',
- 'wikieditor-toolbar-tool-nowiki' => 'ଉଇକି ସଜାଣି ବିନା',
- 'wikieditor-toolbar-tool-nowiki-example' => 'ଅସଜଡ଼ା ଲେଖା à¬à¬ à¬¾à¬°à­‡ ଭରିବେ',
+ 'wikieditor-toolbar-tool-nowiki' => 'ଉଇକି ଫରମାଟିଂ ରହିତ',
+ 'wikieditor-toolbar-tool-nowiki-example' => 'ନନ-ଫରମାଟେଡ଼ ଲେଖା à¬à¬ à¬¾à¬°à­‡ ଭରିବେ',
'wikieditor-toolbar-tool-redirect' => 'ପà­à¬¨à¬ªà­à¬°à­‡à¬°à¬£',
- 'wikieditor-toolbar-tool-redirect-example' => 'ମà­à¬•à¬¾à¬® ପୃଷà­à¬ à¬¾à¬° ନାମ',
+ 'wikieditor-toolbar-tool-redirect-example' => 'ଠିକ ପୃଷà­à¬ à¬¾à¬° ନାମ',
'wikieditor-toolbar-tool-big' => 'ବଡ଼',
'wikieditor-toolbar-tool-big-example' => 'ବଡ଼ ଅକà­à¬·à¬°',
'wikieditor-toolbar-tool-small' => 'ଛୋଟ',
'wikieditor-toolbar-tool-small-example' => 'ଛୋଟ ଅକà­à¬·à¬°',
- 'wikieditor-toolbar-tool-superscript' => 'ଉପର ଅକà­à¬·à¬°',
- 'wikieditor-toolbar-tool-superscript-example' => 'ଉପର ଛୋଟ ଅକà­à¬·à¬°',
- 'wikieditor-toolbar-tool-subscript' => 'ପାଦାଙà­à¬•',
- 'wikieditor-toolbar-tool-subscript-example' => 'ପାଦାଙà­à¬•',
+ 'wikieditor-toolbar-tool-superscript' => 'ସà­à¬ªà¬°à¬¸à­à¬•à­à¬°à¬¿à¬ªà­à¬Ÿ',
+ 'wikieditor-toolbar-tool-superscript-example' => 'ସà­à¬ªà¬°à¬¸à­à¬•à­à¬°à¬¿à¬ªà­à¬Ÿ ଅକà­à¬·à¬°',
+ 'wikieditor-toolbar-tool-subscript' => 'ସବସà­à¬•à­à¬°à¬¿à¬ªà­à¬Ÿ',
+ 'wikieditor-toolbar-tool-subscript-example' => 'ସବସà­à¬•à­à¬°à¬¿à¬ªà­à¬Ÿ ଅକà­à¬·à¬°',
'wikieditor-toolbar-group-insert' => 'ଭରିବେ',
'wikieditor-toolbar-tool-gallery' => 'ଛବି ସମୂହ',
- 'wikieditor-toolbar-tool-gallery-example' => '$1:ଉଦାହରଣ.jpg|ଶିରୋନାମା୧
-$1:ଉଦାହରଣ.jpg|ଶିରୋନାମା୨',
+ 'wikieditor-toolbar-tool-gallery-example' => '$1:Example.jpg|Caption1
+$1:Example.jpg|Caption2',
'wikieditor-toolbar-tool-newline' => 'ନୂଆ ଧାଡ଼ି',
- 'wikieditor-toolbar-tool-table' => 'ସାରଣୀ',
+ 'wikieditor-toolbar-tool-table' => 'ସାରଣୀ (Table)',
'wikieditor-toolbar-tool-table-example-old' => '-
-! ଶିରୋନାମା ୧
-! ଶିରୋନାମା ୨
-! ଶିରୋନାମା ୩
+! header 1
+! header 2
+! header 3
|-
-| ଧାଡ଼ି ୧, କୋଷ ୧
-| ଧାଡ଼ି ୧, କୋଷ ୨
-| ଧାଡ଼ି ୧, କୋଷ ୩
+| row 1, cell 1
+| row 1, cell 2
+| row 1, cell 3
|-
-| ଧାଡ଼ି ୨, କୋଷ ୧
-| ଧାଡ଼ି ୨, କୋଷ ୨
-| ଧାଡ଼ି ୨, କୋଷ ୩',
- 'wikieditor-toolbar-tool-table-example-cell-text' => 'କୋଷ ଲେଖା',
- 'wikieditor-toolbar-tool-table-example-header' => 'ଶିରୋନାମା ଲେଖା',
- 'wikieditor-toolbar-tool-table-title' => 'ସାରଣିଟିଠପà­à¬°à¬¾à¬¨à­à¬¤à­',
+| row 2, cell 1
+| row 2, cell 2
+| row 2, cell 3',
+ 'wikieditor-toolbar-tool-table-example-cell-text' => 'Cell ଲେଖା',
+ 'wikieditor-toolbar-tool-table-example-header' => 'ଶିରୋନାମ ଲେଖା',
+ 'wikieditor-toolbar-tool-table-title' => 'ସାରଣୀଟିଠଭରନà­à¬¤à­ [Insert table]',
'wikieditor-toolbar-tool-table-dimensions-rows' => 'ଧାଡ଼ି',
'wikieditor-toolbar-tool-table-dimensions-columns' => 'ସà­à¬¤à¬®à­à¬­à¬¸à¬¬à­',
- 'wikieditor-toolbar-tool-table-dimensions-header' => 'ଉପର ଶିରୋନାମା ଧାଡ଼ି',
+ 'wikieditor-toolbar-tool-table-dimensions-header' => 'ଉପର ଶିରୋନାମ ଧାଡ଼ି',
'wikieditor-toolbar-tool-table-wikitable' => 'ସୀମା ସହିତ ସଜାଣି',
- 'wikieditor-toolbar-tool-table-sortable' => 'ଶà­à¬°à­‡à¬£à­€ ଅନà­à¬¸à¬¾à¬°à­‡ ସାରଣି ତିଆରି କରିବେ',
+ 'wikieditor-toolbar-tool-table-sortable' => 'ଶà­à¬°à­‡à¬£à­€ ଅନà­à¬¸à¬¾à¬°à­‡ ସାରଣୀ ଗଢ଼ିବେ',
'wikieditor-toolbar-tool-table-example' => 'ଉଦାହରଣ',
- 'wikieditor-toolbar-tool-table-preview' => 'ସାଇତା ଆଗରୠଦେଖଣା',
+ 'wikieditor-toolbar-tool-table-preview' => 'ସାଇତିବା ଆଗରୠଦେଖଣା',
'wikieditor-toolbar-tool-table-insert' => 'ଭରିବେ',
'wikieditor-toolbar-tool-table-cancel' => 'ନାକଚ',
- 'wikieditor-toolbar-tool-table-toomany' => 'à¬à¬¹à¬¿ ଆଦେଶରେ 1000 ରୠଅଧିକ କୋଷ ଥିବା ସାରଣୀ ପà­à¬°à¬¾à¬‡à¬¬à¬¾ ସମà­à¬­à¬¬à¬ªà¬° ନà­à¬¹à­‡à¬ ।',
- 'wikieditor-toolbar-tool-table-invalidnumber' => 'ଆପଣ à¬à¬• ସଠିକ ଧାଡ଼ି ଓ ସà­à¬¤à¬®à­à¬­ ସଂଖà­à­Ÿà¬¾ ଦେଇ ନାହାନà­à¬¤à¬¿ ।',
- 'wikieditor-toolbar-tool-table-zero' => 'ଆପଣ କିଛି ଧାଡ଼ି ବ ସà­à¬¤à¬®à­à¬­ ନଥାଇ ସାରଣୀଟିଠପà­à¬°à¬¾à¬‡à¬ªà¬¾à¬°à¬¿à¬¬à­‡ ନାହିଠ।',
- 'wikieditor-toolbar-tool-replace' => 'ଖୋଜି ବଦଳାଇବେ',
- 'wikieditor-toolbar-tool-replace-title' => 'ଖୋଜି ବଦଳାଇବେ',
+ 'wikieditor-toolbar-tool-table-toomany' => 'à¬à¬¹à¬¿ ଡାà¬à¬²à¬—ରେ ୧୦୦୦ ରୠଅଧିକ କୋଷ ଥିବା ସାରଣୀ ପà­à¬°à¬¾à¬‡à¬¬à¬¾ ସମà­à¬­à¬¬à¬ªà¬° ନà­à¬¹à­‡à¬ ।',
+ 'wikieditor-toolbar-tool-table-invalidnumber' => 'ଆପଣ à¬à¬• ସଠିକ ଧାଡ଼ି ଓ ସà­à¬¤à¬®à­à¬­ ସଂଖà­à­Ÿà¬¾ ଦେଇ ନାହାà¬à¬¨à­à¬¤à¬¿ ।',
+ 'wikieditor-toolbar-tool-table-zero' => 'ଆପଣ କିଛି ଧାଡ଼ି ବା ସà­à¬¤à¬®à­à¬­ ନଥାଇ ସାରଣୀଟିଠଭରିପାରିବେ ନାହିଠ।',
+ 'wikieditor-toolbar-tool-replace' => 'ଖୋଜିକରି ବଦଳାନà­à¬¤à­',
+ 'wikieditor-toolbar-tool-replace-title' => 'ଖୋଜି ବଦଳାନà­à¬¤à­',
'wikieditor-toolbar-tool-replace-search' => 'ଖୋଜିବେ:',
'wikieditor-toolbar-tool-replace-replace' => 'ପà­à¬°à¬¤à¬¿à¬¬à¬¦à¬³:',
- 'wikieditor-toolbar-tool-replace-case' => 'ବଡ଼ ଛୋଟ ଅକà­à¬·à¬° ମେଳାଇବେ',
- 'wikieditor-toolbar-tool-replace-regex' => 'à¬à¬• ସାଧାରଣ ଦେଖଣା ଭାବରେ ପà­à¬°à¬¶à­à¬¨à¬Ÿà¬¿ ଖୋଜିବେ',
+ 'wikieditor-toolbar-tool-replace-case' => 'ଛୋଟ ବଡ଼ ଅକà­à¬·à¬° ମେଳାନà­à¬¤à­',
+ 'wikieditor-toolbar-tool-replace-regex' => 'à¬à¬• ରେଗà­à¬²à¬¾à¬° à¬à¬•à­à¬¸à¬ªà­à¬°à­‡à¬¸à¬¨ ଭାବରେ ପà­à¬°à¬¶à­à¬¨à¬Ÿà¬¿ ଖୋଜନà­à¬¤à­',
'wikieditor-toolbar-tool-replace-button-findnext' => 'ଆଗାମୀ ଖୋଜିବେ',
'wikieditor-toolbar-tool-replace-button-replace' => 'ପà­à¬°à¬¤à¬¿à¬¬à¬¦à¬³',
'wikieditor-toolbar-tool-replace-button-replaceall' => 'ସବୠବଦଳାଇବେ',
'wikieditor-toolbar-tool-replace-close' => 'ବନà­à¬¦ କରିବେ',
- 'wikieditor-toolbar-tool-replace-nomatch' => 'ଆପଣଙà­à¬• ଖୋଜା କାହା ସଙà­à¬—à­‡ ମେଳ ଖାଇଲା ନାହିà¬',
- 'wikieditor-toolbar-tool-replace-success' => '!$1 {{PLURAL:$1|ପà­à¬°à¬¤à¬¿à¬¬à¬¦à¬³|ପà­à¬°à¬¤à¬¿à¬¬à¬¦à¬³à¬—à­à¬¡à¬¿à¬•}} କରାଗଲା ।',
- 'wikieditor-toolbar-tool-replace-emptysearch' => 'ଆପଣ କିଛି ଖୋଜିବା ପାଇଠଦେଇନାହାନà­à¬¤à¬¿ ।',
- 'wikieditor-toolbar-tool-replace-invalidregex' => 'ଆପଣ ଦେଇଥିବା ନିୟମିତ ଅଭିବà­à­Ÿà¬•à­à¬¤à¬¿ ଅବୈଧ ଅଟେ : $1',
+ 'wikieditor-toolbar-tool-replace-nomatch' => 'ଆପଣଙà­à¬• ଖୋଜା କାହା ସଙà­à¬—à­‡ ମେଳ ହେଲାନାହିଠ।',
+ 'wikieditor-toolbar-tool-replace-success' => '$1 {{PLURAL:$1|ପà­à¬°à¬¤à¬¿à¬¬à¬¦à¬³|ପà­à¬°à¬¤à¬¿à¬¬à¬¦à¬³à¬®à¬¾à¬¨}} କରାଗଲା ।',
+ 'wikieditor-toolbar-tool-replace-emptysearch' => 'ଆପଣ କିଛି ଖୋଜିନାହାà¬à¬¨à­à¬¤à¬¿ ।',
+ 'wikieditor-toolbar-tool-replace-invalidregex' => 'ଆପଣ ଦେଇଥିବା ରେଗà­à¬²à¬¾à¬° à¬à¬•à­à¬¸â€Œà¬ªà­à¬°à­‡à¬¸à¬¨â€Œà¬Ÿà¬¿ ଭà­à¬²: $1',
'wikieditor-toolbar-section-characters' => 'ବିଶେଷ ସଙà­à¬•à­‡à¬¤',
'wikieditor-toolbar-characters-page-latin' => 'ଲାଟିନ',
'wikieditor-toolbar-characters-page-latinextended' => 'ଲାଟିନ ଅଧିକ ଅକà­à¬·à¬°',
'wikieditor-toolbar-characters-page-ipa' => 'IPA',
'wikieditor-toolbar-characters-page-symbols' => 'ସଙà­à¬•à­‡à¬¤',
- 'wikieditor-toolbar-characters-page-greek' => 'ଗà­à¬°à¬¿à¬•',
+ 'wikieditor-toolbar-characters-page-greek' => 'ଗà­à¬°à­€à¬•',
'wikieditor-toolbar-characters-page-cyrillic' => 'ସିରିଲିକ',
'wikieditor-toolbar-characters-page-arabic' => 'ଆରବୀ',
- 'wikieditor-toolbar-characters-page-arabicextended' => 'ଆରବିକ ଅଧିକ ଅକà­à¬·à¬°',
- 'wikieditor-toolbar-characters-page-persian' => 'ପାରସିକ',
- 'wikieditor-toolbar-characters-page-hebrew' => 'ହିବà­à¬°à­',
+ 'wikieditor-toolbar-characters-page-arabicextended' => 'ଆରବୀ ଅଧିକ ଅକà­à¬·à¬°',
+ 'wikieditor-toolbar-characters-page-persian' => 'ପାରସୀକ',
+ 'wikieditor-toolbar-characters-page-hebrew' => 'ହିବà­à¬°à­',
'wikieditor-toolbar-characters-page-bangla' => 'ବଙà­à¬—ଳା',
'wikieditor-toolbar-characters-page-tamil' => 'ତାମିଲ',
'wikieditor-toolbar-characters-page-telugu' => 'ତେଲà­à¬—à­',
- 'wikieditor-toolbar-characters-page-sinhala' => 'ସିଂହଳି',
- 'wikieditor-toolbar-characters-page-gujarati' => 'ଗà­à¬œà­à¬°à¬¾à¬Ÿà¬¿',
+ 'wikieditor-toolbar-characters-page-sinhala' => 'ସିଂହଳୀ',
+ 'wikieditor-toolbar-characters-page-gujarati' => 'ଗà­à¬œà­à¬°à¬¾à¬Ÿà­€',
'wikieditor-toolbar-characters-page-devanagari' => 'ଦେବନାଗରୀ',
'wikieditor-toolbar-characters-page-thai' => 'ଥାଇ',
'wikieditor-toolbar-characters-page-lao' => 'ଲାଓ',
- 'wikieditor-toolbar-characters-page-khmer' => 'କମେର ଭାଷା',
+ 'wikieditor-toolbar-characters-page-khmer' => 'ଖମେର ଭାଷା',
'wikieditor-toolbar-characters-endash' => 'en ଡà­à­Ÿà¬¾à¬¸',
- 'wikieditor-toolbar-characters-emdash' => 'em ଡà­à­Ÿà¬¾à¬¸',
- 'wikieditor-toolbar-characters-minus' => 'ମିନà­à¬—à­à¬¡à¬¿à¬•à¬° ଚିହà­à¬¨',
- 'wikieditor-toolbar-section-help' => 'ସହଯୋଗ',
- 'wikieditor-toolbar-help-heading-description' => 'ବିବରଣୀ',
- 'wikieditor-toolbar-help-heading-syntax' => 'ଆପଣ କଣ ଟାଇପ କରିବେ',
- 'wikieditor-toolbar-help-heading-result' => 'ଆପଣ କଣ ପାଇବେ',
- 'wikieditor-toolbar-help-page-format' => 'ସଜାଣି',
+ 'wikieditor-toolbar-characters-emdash' => 'em dash',
+ 'wikieditor-toolbar-characters-minus' => 'ମେନà­à¬—à­à¬¡à¬¿à¬•à¬° ଚିହà­à¬¨',
+ 'wikieditor-toolbar-section-help' => 'ସହଯୋଗ (Help)',
+ 'wikieditor-toolbar-help-heading-description' => 'ବରà­à¬£à­à¬£à¬¨à¬¾',
+ 'wikieditor-toolbar-help-heading-syntax' => 'ଆପଣ ଯାହା ଟାଇପ କରିବେ',
+ 'wikieditor-toolbar-help-heading-result' => 'ଆପଣ ଯାହା ଦେଖିବେ',
+ 'wikieditor-toolbar-help-page-format' => 'ଫରମାଟିଂ',
'wikieditor-toolbar-help-page-link' => 'ଲିଙà­à¬•',
- 'wikieditor-toolbar-help-page-heading' => 'ଶିରୋନାମା',
+ 'wikieditor-toolbar-help-page-heading' => 'ଶିରୋନାମ',
'wikieditor-toolbar-help-page-list' => 'ତାଲିକା',
'wikieditor-toolbar-help-page-file' => 'ଫାଇଲ',
'wikieditor-toolbar-help-page-reference' => 'ଆଧାର',
'wikieditor-toolbar-help-page-discussion' => 'ଆଲୋଚନା',
- 'wikieditor-toolbar-help-content-italic-description' => 'ତେରେଛା',
- 'wikieditor-toolbar-help-content-italic-syntax' => "''ତେରେଛା ଲେଖା''",
- 'wikieditor-toolbar-help-content-italic-result' => '<em>ତେରେଛା ଲେଖା</em>',
- 'wikieditor-toolbar-help-content-bold-description' => 'ମୋଟା ଅକà­à¬·à¬°',
- 'wikieditor-toolbar-help-content-bold-syntax' => "'''ମୋଟା ଅକà­à¬·à¬°'''",
- 'wikieditor-toolbar-help-content-bold-result' => '<strong>ମୋଟା ଲେଖା</strong>',
- 'wikieditor-toolbar-help-content-bolditalic-description' => 'ମୋଟା ଓ ତେରେଛା',
- 'wikieditor-toolbar-help-content-bolditalic-syntax' => "'''''ମୋଟା ଓ ତେରେଛା ଅକà­à¬·à¬°'''''",
- 'wikieditor-toolbar-help-content-bolditalic-result' => '<strong><em>ମୋଟା ଓ ତେରେଛା ଅକà­à¬·à¬°</em></strong>',
- 'wikieditor-toolbar-help-content-ilink-description' => 'ଭିତର ଲିଙà­à¬•',
- 'wikieditor-toolbar-help-content-ilink-syntax' => '[[ପୃଷà­à¬ à¬¾ ନାମ|ଲିଙà­à¬• ନାମ]]<br />[[ପୃଷà­à¬ à¬¾ ନାମ]]',
- 'wikieditor-toolbar-help-content-ilink-result' => "<a href='#'>ଲିଙà­à¬• ନାମ</a><br /><a href='#'>ପୃଷà­à¬ à¬¾ ନାମ</a>",
+ 'wikieditor-toolbar-help-content-italic-description' => 'Italic',
+ 'wikieditor-toolbar-help-content-italic-syntax' => "''Italic text''",
+ 'wikieditor-toolbar-help-content-italic-result' => '<em>Italic text</em>',
+ 'wikieditor-toolbar-help-content-bold-description' => 'Bold',
+ 'wikieditor-toolbar-help-content-bold-syntax' => "'''Bold text'''",
+ 'wikieditor-toolbar-help-content-bold-result' => '<strong>Bold text</strong>',
+ 'wikieditor-toolbar-help-content-bolditalic-description' => 'Bold &amp; italic',
+ 'wikieditor-toolbar-help-content-bolditalic-syntax' => "'''''Bold &amp; italic text'''''",
+ 'wikieditor-toolbar-help-content-bolditalic-result' => '<strong><em>Bold &amp; italic text</em></strong>',
+ 'wikieditor-toolbar-help-content-ilink-description' => 'ଇଣà­à¬Ÿà¬°à¬¨à¬¾à¬² ଲିଙà­à¬•',
+ 'wikieditor-toolbar-help-content-ilink-syntax' => '[[Page title|Link label]]<br />[[Page title]]',
+ 'wikieditor-toolbar-help-content-ilink-result' => "<a href='#'>Link label</a><br /><a href='#'>ପୃଷà­à¬ à¬¾à¬° ନାମ</a>",
'wikieditor-toolbar-help-content-xlink-description' => 'ବାହାର ଲିଙà­à¬•',
- 'wikieditor-toolbar-help-content-xlink-syntax' => '[http://www.example.org ଲିଙà­à¬• ନାମ]<br />[http://www.example.org]<br />http://www.example.org',
+ 'wikieditor-toolbar-help-content-xlink-syntax' => '[http://www.example.org Link label]<br />[http://www.example.org]<br />http://www.example.org',
'wikieditor-toolbar-help-content-xlink-result' => "<a href='#' class='ବାହାର'>ଲିଙà­à¬• ନାମ</a><br /><a href='#' class='external autonumber'>[1]</a><br /><a href='#' class='ବାହାର'>http://www.example.org</a>",
- 'wikieditor-toolbar-help-content-heading2-description' => '୨ୟ ସà­à¬¤à¬°à¬° ଶିରୋନାମା',
- 'wikieditor-toolbar-help-content-heading2-syntax' => '== ଶିରୋନାମା ==',
- 'wikieditor-toolbar-help-content-heading2-result' => '<h2>ଶିରୋନାମା ଲେଖା</h2>',
- 'wikieditor-toolbar-help-content-heading3-description' => 'à­©à­Ÿ ସà­à¬¤à¬°à¬° ଶିରୋନାମା',
- 'wikieditor-toolbar-help-content-heading3-syntax' => '=== ଶିରୋନାମା ===',
- 'wikieditor-toolbar-help-content-heading3-result' => '<h3>ଶିରୋନାମା ଲେଖା</h3>',
- 'wikieditor-toolbar-help-content-heading4-description' => '୪ରà­à¬¥ ସà­à¬¤à¬°à¬° ଶିରୋନାମା',
- 'wikieditor-toolbar-help-content-heading4-syntax' => '==== ଶିରୋନାମା ====',
- 'wikieditor-toolbar-help-content-heading4-result' => '<h4>ଶିରୋନାମା ଲେଖା</h4>',
- 'wikieditor-toolbar-help-content-heading5-description' => '୫ମ ସà­à¬¤à¬°à¬° ଶିରୋନାମା',
- 'wikieditor-toolbar-help-content-heading5-syntax' => '===== ଶିରୋନାମା =====',
- 'wikieditor-toolbar-help-content-heading5-result' => '<h5>ଶିରୋନାମା ଲେଖା</h5>',
+ 'wikieditor-toolbar-help-content-heading2-description' => '୨ୟ ସà­à¬¤à¬°à¬° ଶିରୋନାମ',
+ 'wikieditor-toolbar-help-content-heading2-syntax' => '== ଶିରୋନାମ ==',
+ 'wikieditor-toolbar-help-content-heading2-result' => '<h2>ଶିରୋନାମ ଲେଖା</h2>',
+ 'wikieditor-toolbar-help-content-heading3-description' => '୩ୟ ସୋପାନର ଶିରୋନାମ',
+ 'wikieditor-toolbar-help-content-heading3-syntax' => '=== ଶିରୋନାମ ===',
+ 'wikieditor-toolbar-help-content-heading3-result' => '<h3>ଶିରୋନାମ ଲେଖା</h3>',
+ 'wikieditor-toolbar-help-content-heading4-description' => '୪ରà­à¬¥ ସୋପାନର ଶିରୋନାମ',
+ 'wikieditor-toolbar-help-content-heading4-syntax' => '==== ଶିରୋନାମ ଲେଖା ====',
+ 'wikieditor-toolbar-help-content-heading4-result' => '<h4>ଶିରୋନାମ ଲେଖା</h4>',
+ 'wikieditor-toolbar-help-content-heading5-description' => '୫ମ ସୋପାନର ଶିରୋନାମ',
+ 'wikieditor-toolbar-help-content-heading5-syntax' => '===== ଶିରୋନାମ =====',
+ 'wikieditor-toolbar-help-content-heading5-result' => '<h5>ଶିରୋନାମ ଲେଖା</h5>',
'wikieditor-toolbar-help-content-ulist-description' => 'ବିନà­à¬¦à­ ଦିଆ ତାଲିକା',
- 'wikieditor-toolbar-help-content-ulist-syntax' => '* ତାଲିକା ଚିଜ<br />* ତାଲିକା ଚିଜ',
- 'wikieditor-toolbar-help-content-ulist-result' => '<ul><li>ତାଲିକା ଚିଜ</li><li>ତାଲିକା ଚିଜ</li></ul>',
+ 'wikieditor-toolbar-help-content-ulist-syntax' => '* ତାଲିକା ବସà­à¬¤à­<br />* ତାଲିକା ବସà­à¬¤à­',
+ 'wikieditor-toolbar-help-content-ulist-result' => '<ul><li>ତାଲିକା ବସà­à¬¤à­</li><li>ତାଲିକା ବସà­à¬¤à­</li></ul>',
'wikieditor-toolbar-help-content-olist-description' => 'ସଂଖà­à­Ÿà¬¾à¬¦à¬¿à¬† ତାଲିକା',
- 'wikieditor-toolbar-help-content-olist-syntax' => '# ତାଲିକା ଚିଜ<br /># ତାଲିକା ଚିଜ',
- 'wikieditor-toolbar-help-content-olist-result' => '<ol><li>ତାଲିକା ଚିଜ</li><li>ତାଲିକା ଚିଜ</li></ol>',
- 'wikieditor-toolbar-help-content-file-description' => 'à¬à¬®à¬¬à­‡à¬¡à¬¼ ହୋଇ ଥିବା ଫାଇଲ',
- 'wikieditor-toolbar-help-content-file-syntax' => '[[$1:ଉଦାହରଣ.png|thumb|ଶିରୋନାମା ଲେଖା]]',
- 'wikieditor-toolbar-help-content-file-result' => "<div style='width:104px;' class='thumbinner'><a title='ଶିରୋନାମା ଲେଖା' class='image' href='#'><img height='50' width='100' border='0' class='thumbimage' src='$2/WikiEditor/modules/images/toolbar/example-image.png' alt=''/></a><div class='thumbcaption'><div class='magnify'><a title='ବଡ଼ କରିବେ' class='internal' href='#'><img height='11' width='15' alt='' src='$1/common/images/magnify-clip.png'/></a></div>ଶିରୋନାମା ଲେଖା</div></div>",
+ 'wikieditor-toolbar-help-content-olist-syntax' => '# ତାଲିକା ବସà­à¬¤à­<br /># ତାଲିକା ବସà­à¬¤à­',
+ 'wikieditor-toolbar-help-content-olist-result' => '<ol><li>ତାଲିକା ବସà­à¬¤à­</li><li>ତାଲିକା ବସà­à¬¤à­</li></ol>',
+ 'wikieditor-toolbar-help-content-file-description' => 'à¬à¬®à¬¬à­‡à¬¡à¬¼ ହୋଇଥିବା ଫାଇଲ',
+ 'wikieditor-toolbar-help-content-file-syntax' => '[[$1:Example.png|thumb|Caption text]]',
+ 'wikieditor-toolbar-help-content-file-result' => "<div style='width:104px;' class='thumbinner'><a title='ଶିରୋନାମ ଲେଖା' class='image' href='#'><img height='50' width='100' border='0' class='thumbimage' src='$2/WikiEditor/modules/images/toolbar/example-image.png' alt=''/></a><div class='thumbcaption'><div class='magnify'><a title='ବଢ଼ାଇବେ' class='internal' href='#'><img height='11' width='15' alt='' src='$1/common/images/magnify-clip.png'/></a></div>ଶିରୋନାମ ଲେଖା</div></div>",
'wikieditor-toolbar-help-content-reference-description' => 'ଆଧାର',
- 'wikieditor-toolbar-help-content-reference-syntax' => 'ପୃଷà­à¬ à¬¾ ଲେଖା.&lt;ref name="test"&gt;[http://www.example.org Link text], ଅତିରିକà­à¬¤ ଲେଖା ।&lt;/ref&gt;',
+ 'wikieditor-toolbar-help-content-reference-syntax' => 'Page text.&lt;ref name="test"&gt;[http://www.example.org Link text], additional text.&lt;/ref&gt;',
'wikieditor-toolbar-help-content-reference-result' => "ପୃଷà­à¬ à¬¾ ଲେଖା ।<sup><a href='#'>[1]</a></sup>",
- 'wikieditor-toolbar-help-content-rereference-description' => 'à¬à¬• ଆଧାରର ଅତିରିକà­à¬¤ ବà­à­Ÿà¬¬à¬¹à¬¾à¬°',
+ 'wikieditor-toolbar-help-content-rereference-description' => 'à¬à¬• ଆଧାରର ଅଧିକ ବà­à­Ÿà¬¬à¬¹à¬¾à¬°',
'wikieditor-toolbar-help-content-rereference-result' => "ପୃଷà­à¬ à¬¾ ଲେଖା ।<sup><a href='#'>[1]</a></sup>",
- 'wikieditor-toolbar-help-content-showreferences-description' => 'ଦେଖଣା ଆଧାରସମୂହ',
- 'wikieditor-toolbar-help-content-showreferences-result' => "<ol class='references'><li id='cite_note-test-0'><b><a title='' href='#'>^</a></b> <a rel='nofollow' title='http://www.example.org' class='external text' href='#'>Link text</a>, ଅଧିକ ବିବରଣୀ ।</li></ol>",
- 'wikieditor-toolbar-help-content-signaturetimestamp-description' => 'ସନà­à¬¤à¬• ସହିତ ସମୟଚିହà­à¬¨',
- 'wikieditor-toolbar-help-content-signaturetimestamp-result' => "<a href='#' title='{{#special:mypage}}'>ଇଉଜର ନାମ</a> (<a href='#' title='{{#special:mytalk}}'>ଆଲୋଚନା</a>) 15:54, 10 June 2009 (UTC)",
- 'wikieditor-toolbar-help-content-signature-description' => 'ସନà­à¬¤à¬•',
- 'wikieditor-toolbar-help-content-signature-result' => "<a href='#' title='{{#special:mypage}}'>ଇଉଜର ନାମ</a> (<a href='#' title='{{#special:mytalk}}'>ଆଲୋଚନା</a>)",
+ 'wikieditor-toolbar-help-content-showreferences-description' => 'ଡିସ‌ପà­à¬²à­‡ ଆଧାରସମୂହ',
+ 'wikieditor-toolbar-help-content-showreferences-result' => "<ol class='references'><li id='cite_note-test-0'><b><a title='' href='#'>^</a></b> <a rel='nofollow' title='http://www.example.org' class='external text' href='#'>Link text</a>, ଅଧିକ ଲେଖା ।</li></ol>",
+ 'wikieditor-toolbar-help-content-signaturetimestamp-description' => 'ସନà­à¬¤à¬• ଓ ସମୟଚିହà­à¬¨ (Signature with timestamp)',
+ 'wikieditor-toolbar-help-content-signaturetimestamp-result' => "<a href='#' title='{{#special:mypage}}'>Username</a> (<a href='#' title='{{#special:mytalk}}'>talk</a>) 15:54, 10 June 2009 (UTC)",
+ 'wikieditor-toolbar-help-content-signature-description' => 'ସନà­à¬¤à¬• (Signature)',
+ 'wikieditor-toolbar-help-content-signature-result' => "<a href='#' title='{{#special:mypage}}'>Username</a> (<a href='#' title='{{#special:mytalk}}'>talk</a>)",
'wikieditor-toolbar-help-content-indent-description' => 'ଅନà­à¬šà­à¬›à­‡à¬¦ ଛାଡ଼',
'wikieditor-toolbar-help-content-indent-syntax' => 'ସାଧାରଣ ଲେଖା<br />:ମାରà­à¬œà¬¿à¬¨ ଦିଆ ଲେଖା<br />::ମାରà­à¬œà¬¿à¬¨ ଦିଆ ଲେଖା',
- 'wikieditor-toolbar-help-content-indent-result' => 'ସାଧାରଣ ଲେଖା<dl><dd>ମାରà­à¬œà¬¿à¬¨ ଦିଆ ଲେଖା<dl><dd>ମାରà­à¬œà¬¿à¬¨ ଦିଆ ଲେଖା</dd></dl></dd></dl>',
+ 'wikieditor-toolbar-help-content-indent-result' => 'Normal text<dl><dd>Indented text<dl><dd>Indented text</dd></dl></dd></dl>',
);
/** Ossetic (Ирон)
@@ -20826,7 +21178,7 @@ $messages['os'] = array(
'wikieditor-toolbar' => 'Ивыны панель',
'wikieditor-toolbar-desc' => 'Æнцонгонд архайдимæ ивыны панель',
'wikieditor-toolbar-preference' => 'Хуыздæргонд ивыны панель баиу кæнын',
- 'wikieditor-toolbar-dialogs-preference' => 'Æрвитæн Ñ‚Ñ‹ÑÑын, таблицæ æмæ æндæрты диалогтæ баиу кæнын',
+ 'wikieditor-toolbar-dialogs-preference' => 'Æрвитæн Ñ‚Ñ‹ÑÑын, таблицæ æмæ æндæрты диалогтæ баиу кæнын', # Fuzzy
'wikieditor-toolbar-hidesig' => 'КъухæрфыÑÑ‚ равзарæн Ñæйраг номдоны фæрÑтæй айÑын',
'wikieditor-toolbar-loading' => 'Æвгæд цæуы...',
'wikieditor-toolbar-tool-bold' => 'Бæзджын',
@@ -21039,6 +21391,214 @@ $1:Example.jpg|ФыÑÑ‚2',
'wikieditor-toolbar-help-content-indent-result' => 'Ðæуи текÑÑ‚<dl><dd>ХаÑÑ‚ текÑÑ‚<dl><dd>ХаÑÑ‚ текÑÑ‚</dd></dl></dd></dl>',
);
+/** Punjabi (ਪੰਜਾਬੀ)
+ * @author Babanwalia
+ */
+$messages['pa'] = array(
+ 'wikieditor-wikitext-tab' => 'ਵਿਕੀਲਿਖਤ',
+ 'wikieditor-loading' => 'ਲੋਡ ਕੀਤਾ ਜਾ ਰਿਹਾ ਹੈ…',
+ 'wikieditor-preview-tab' => 'à¨à¨²à¨•',
+ 'wikieditor-preview-changes-tab' => 'ਤਬਦੀਲੀਆਂ',
+ 'wikieditor-preview-loading' => 'ਲੋਡ ਕੀਤਾ ਜਾ ਰਿਹਾ ਹੈ...',
+ 'wikieditor-previewDialog-preference' => 'à¨à¨²à¨• ਡੱਬਾ ਚਾਲੂ ਕਰੋ',
+ 'wikieditor-previewDialog-tab' => 'à¨à¨²à¨•',
+ 'wikieditor-previewDialog-loading' => 'ਲੋਡ ਕੀਤਾ ਜਾ ਰਿਹਾ ਹੈ…',
+ 'wikieditor-publish-preference' => 'ਕਦਮ ਦਰ ਕਦਮ ਛਾਪਾ ਚਾਲੂ ਕਰੋ',
+ 'wikieditor-publish-button-publish' => 'ਛਾਪੋ',
+ 'wikieditor-publish-button-cancel' => 'ਰੱਦ ਕਰੋ',
+ 'wikieditor-publish-dialog-title' => "{{SITENAME}} 'ਤੇ ਛਾਪੋ",
+ 'wikieditor-publish-dialog-summary' => 'ਸੋਧ ਸਾਰ (ਆਪਣੀਆਂ ਤਬਦੀਲੀਆਂ ਦੀ ਸੰਖੇਪ ਸਾਰ ਦਿਓ):',
+ 'wikieditor-publish-dialog-minor' => 'ਛੋਟੀ ਸੋਧ',
+ 'wikieditor-publish-dialog-watch' => 'ਇਹ ਸਫ਼ਾ ਵਾਚੋ',
+ 'wikieditor-publish-dialog-publish' => 'ਛਾਪੋ',
+ 'wikieditor-publish-dialog-goback' => 'ਪਿੱਛੇ ਜਾਓ',
+ 'wikieditor-template-editor-preference' => 'ਵਿਕੀ ਫਰਮਿਆਂ ਦੀ ਫ਼ਾਰਮ-ਅਧਾਰਤ ਸੋਧ ਚਾਲੂ ਕਰੋ',
+ 'wikieditor-template-editor-dialog-title' => 'ਫਰਮਾ ਸੋਧੋ',
+ 'wikieditor-template-editor-dialog-submit' => 'ਅੱਪਡੇਟ',
+ 'wikieditor-template-editor-dialog-cancel' => 'ਰੱਦ ਕਰੋ',
+ 'wikieditor-templates-preference' => 'ਫਰਮੇ ਦਾ ਸਮੇਟਨਾ ਚਾਲੂ ਕਰੋ',
+ 'wikieditor-toc-preference' => 'ਫੇਰੀਯੋਗ ਸਮੱਗਰੀ ਸਾਰਨੀ ਚਾਲੂ ਕਰੋ',
+ 'wikieditor-toc-show' => 'ਸਮੱਗਰੀ ਵਿਖਾਓ',
+ 'wikieditor-toc-hide' => 'ਸਮੱਗਰੀ ਲà©à¨•à¨¾à¨“',
+ 'wikieditor-toolbar' => 'ਸੰਦਬਕਸਾ ਸੋਧਿਆ ਜਾ ਰਿਹਾ ਹੈ',
+ 'wikieditor-toolbar-loading' => 'ਲੋਡ ਕੀਤਾ ਜਾ ਰਿਹਾ ਹੈ…',
+ 'wikieditor-toolbar-tool-bold' => 'ਮੋਟੇ ਅੱਖਰਾਂ ਵਿਚ',
+ 'wikieditor-toolbar-tool-bold-example' => 'ਮੋਟੀ ਲਿਖਤ',
+ 'wikieditor-toolbar-tool-italic' => 'ਟੇਢਾ',
+ 'wikieditor-toolbar-tool-italic-example' => 'ਟੇਢੀ ਲਿਖਤ',
+ 'wikieditor-toolbar-tool-ilink' => 'ਅੰਦਰੂਨੀ ਕੜੀ',
+ 'wikieditor-toolbar-tool-ilink-example' => 'ਕੜੀ ਦਾ ਸਿਰਲੇਖ',
+ 'wikieditor-toolbar-tool-xlink' => 'ਬਾਹਰੀ ਕੜੀ (ਯਾਦ ਰੱਖੋ http:// prefix)',
+ 'wikieditor-toolbar-tool-xlink-example' => 'http://www.example.com ਕੜੀ ਦਾ ਸਿਰਲੇਖ',
+ 'wikieditor-toolbar-tool-link' => 'ਕੜੀ',
+ 'wikieditor-toolbar-tool-link-title' => 'ਕੜੀ ਜੋੜੋ',
+ 'wikieditor-toolbar-tool-link-int' => 'ਵਿਕੀ ਸਫ਼ੇ ਨਾਲ਼',
+ 'wikieditor-toolbar-tool-link-int-target' => 'ਨਿਸ਼ਾਨਾਨà©à¨®à¨¾ ਸਫ਼ਾ ਜਾਂ URL:',
+ 'wikieditor-toolbar-tool-link-int-target-tooltip' => 'ਸਫ਼ੇ ਦਾ ਸਿਰਲੇਖ ਜਾਂ URL',
+ 'wikieditor-toolbar-tool-link-int-text' => 'ਵਿਖਾਉਣ ਲਈ ਲਿਖਤ:',
+ 'wikieditor-toolbar-tool-link-int-text-tooltip' => 'ਵਿਖਾਉਣ ਲਈ ਲਿਖਤ',
+ 'wikieditor-toolbar-tool-link-ext' => 'ਬਾਹਰੀ ਵੈੱਬ ਸਫ਼ੇ ਵੱਲ',
+ 'wikieditor-toolbar-tool-link-ext-target' => 'ਕੜੀ ਦਾ URL:',
+ 'wikieditor-toolbar-tool-link-ext-text' => 'ਕੜੀ ਦੀ ਲਿਖਤ:',
+ 'wikieditor-toolbar-tool-link-insert' => 'ਕੜੀ ਜੋੜੋ',
+ 'wikieditor-toolbar-tool-link-cancel' => 'ਰੱਦ ਕਰੋ',
+ 'wikieditor-toolbar-tool-link-int-target-status-exists' => 'ਸਫ਼ਾ ਮੌਜੂਦ ਹੈ',
+ 'wikieditor-toolbar-tool-link-int-target-status-notexists' => 'ਸਫ਼ਾ ਮੌਜੂਦ ਨਹੀਂ ਹੈ',
+ 'wikieditor-toolbar-tool-link-int-target-status-invalid' => 'ਗ਼ਲਤ ਸਿਰਲੇਖ',
+ 'wikieditor-toolbar-tool-link-int-target-status-external' => 'ਬਾਹਰੀ ਕੜੀ',
+ 'wikieditor-toolbar-tool-link-int-target-status-loading' => 'ਸਫ਼ੇ ਦੀ ਮੌਜੂਦਗੀ ਚੈੱਕ ਹੋ ਰਹੀ ਹੈ...',
+ 'wikieditor-toolbar-tool-link-int-invalid' => 'ਤà©à¨¹à¨¾à¨¡à¨¾ ਦੱਸਿਆ ਹੋਇਆ ਸਿਰਲੇਖ ਗ਼ਲਤ ਹੈ।',
+ 'wikieditor-toolbar-tool-link-lookslikeinternal-int' => 'ਅੰਦਰੂਨੀ ਕੜੀ',
+ 'wikieditor-toolbar-tool-link-lookslikeinternal-ext' => 'ਬਾਹਰੀ ਕੜੀ',
+ 'wikieditor-toolbar-tool-link-empty' => 'ਤà©à¨¸à©€à¨‚ ਕà©à¨ ਜੋੜਨ ਲਈ ਭਰਿਆ ਹੀ ਨਹੀਂ।',
+ 'wikieditor-toolbar-tool-file-example' => 'ਮਿਸਾਲ.jpg',
+ 'wikieditor-toolbar-tool-file-title' => 'ਫ਼ਾਈਲ ਜੋੜੋ',
+ 'wikieditor-toolbar-file-target' => 'ਫ਼ਾਈਲ ਦਾ ਨਾਂ:',
+ 'wikieditor-toolbar-file-caption' => 'ਸਿਰਲੇਖ:',
+ 'wikieditor-toolbar-file-size' => 'ਅਕਾਰ:',
+ 'wikieditor-toolbar-file-float' => 'ਪੰਗਤ:',
+ 'wikieditor-toolbar-file-default' => '(ਮੂਲ)',
+ 'wikieditor-toolbar-file-format' => 'ਰੂਪ:',
+ 'wikieditor-toolbar-file-format-none' => 'ਕੋਈ ਨਹੀਂ',
+ 'wikieditor-toolbar-tool-file-insert' => 'ਜੋੜੋ',
+ 'wikieditor-toolbar-tool-file-cancel' => 'ਰੱਦ ਕਰੋ',
+ 'wikieditor-toolbar-tool-reference' => 'ਹਵਾਲਾ',
+ 'wikieditor-toolbar-tool-reference-example' => 'ਪਗਨੋਟ ਦੀ ਲਿਖਤ ਇੱਥੇ ਭਰੋ',
+ 'wikieditor-toolbar-tool-reference-cancel' => 'ਰੱਦ ਕਰੋ',
+ 'wikieditor-toolbar-tool-reference-title' => 'ਹਵਾਲਾ ਜੋੜੋ',
+ 'wikieditor-toolbar-tool-reference-insert' => 'ਜੋੜੋ',
+ 'wikieditor-toolbar-tool-reference-text' => 'ਹਵਾਲੇ ਦੀ ਲਿਖਤ',
+ 'wikieditor-toolbar-tool-signature' => 'ਦਸਤਖ਼ਤ ਅਤੇ ਸਮੇਂ ਦੀ ਮੋਹਰ',
+ 'wikieditor-toolbar-section-advanced' => 'ਉੱਨਤ',
+ 'wikieditor-toolbar-tool-heading' => 'ਸਿਰਨਾਵਾਂ',
+ 'wikieditor-toolbar-tool-heading-1' => 'ਪੱਧਰ ੧',
+ 'wikieditor-toolbar-tool-heading-2' => 'ਪੱਧਰ ੨',
+ 'wikieditor-toolbar-tool-heading-3' => 'ਪੱਧਰ ੩',
+ 'wikieditor-toolbar-tool-heading-4' => 'ਪੱਧਰ ੪',
+ 'wikieditor-toolbar-tool-heading-5' => 'ਪੱਧਰ ੫',
+ 'wikieditor-toolbar-tool-heading-example' => 'ਸਿਰਨਾਵੇਂ ਦੀ ਲਿਖਤ',
+ 'wikieditor-toolbar-group-format' => 'ਰੂਪ',
+ 'wikieditor-toolbar-tool-ulist' => 'ਨਿਸ਼ਾਨਦਾਇਕ ਸੂਚੀ',
+ 'wikieditor-toolbar-tool-ulist-example' => 'ਨਿਸ਼ਾਨਦਾਇਕ ਸੂਚੀ ਦੀ ਵਸਤੂ',
+ 'wikieditor-toolbar-tool-olist' => 'ਗਿਣਤੀਦਾਇਕ ਸੂਚੀ',
+ 'wikieditor-toolbar-tool-olist-example' => 'ਗਿਣਤੀਦਾਇਕ ਸੂਚੀ ਦੀ ਵਸਤੂ',
+ 'wikieditor-toolbar-tool-indent' => 'ਹਾਸ਼ੀਆ',
+ 'wikieditor-toolbar-tool-indent-example' => 'ਹਾਸ਼ੀਆਈ ਰੇਖਾ',
+ 'wikieditor-toolbar-tool-nowiki' => 'ਕੋਈ ਵਿਕੀ ਰੂਪਕਰਨ ਨਹੀਂ',
+ 'wikieditor-toolbar-tool-nowiki-example' => 'ਇੱਥੇ ਗ਼ੈਰ-ਰੂਪਕਿਰਤ ਲਿਖਤ ਭਰੋ',
+ 'wikieditor-toolbar-tool-redirect' => 'ਮà©à©œ-ਦਿਸ਼ਾ',
+ 'wikieditor-toolbar-tool-redirect-example' => 'ਨਿਸ਼ਾਨਾਨà©à¨®à¨¾ ਸਫ਼ੇ ਦਾ ਨਾਂ',
+ 'wikieditor-toolbar-tool-big' => 'ਵੱਡਾ',
+ 'wikieditor-toolbar-tool-big-example' => 'ਵੱਡੀ ਲਿਖਤ',
+ 'wikieditor-toolbar-tool-small' => 'ਛੋਟਾ',
+ 'wikieditor-toolbar-tool-small-example' => 'ਛੋਟੀ ਲਿਖਤ',
+ 'wikieditor-toolbar-tool-superscript' => 'ਉਤਲੀ ਲਿਖਤ',
+ 'wikieditor-toolbar-tool-superscript-example' => 'ਉਤਲੀ ਲਿਖਤ',
+ 'wikieditor-toolbar-tool-subscript' => 'ਹੇਠਲੀ ਲਿਖਤ',
+ 'wikieditor-toolbar-tool-subscript-example' => 'ਹੇਠਲੀ ਲਿਖਤ',
+ 'wikieditor-toolbar-group-insert' => 'ਜੋੜੋ',
+ 'wikieditor-toolbar-tool-gallery' => 'ਤਸਵੀਰਾਂ ਦੀ ਗੈਲਰੀ',
+ 'wikieditor-toolbar-tool-gallery-example' => '$1:ਮਿਸਾਲ.jpg|ਸਿਰਲੇਖ੧
+$1:ਮਿਸਾਲ.jpg|ਸਿਰਲੇਖ੨',
+ 'wikieditor-toolbar-tool-newline' => 'ਨਵੀਂ ਲਾਈਨ',
+ 'wikieditor-toolbar-tool-table' => 'ਸਾਰਨੀ',
+ 'wikieditor-toolbar-tool-table-example-header' => 'ਸਿਰਨਾਵੇਂ ਦੀ ਲਿਖਤ',
+ 'wikieditor-toolbar-tool-table-title' => 'ਸਾਰਨੀ ਜੋੜੋ',
+ 'wikieditor-toolbar-tool-table-dimensions-rows' => 'ਕਤਾਰਾਂ',
+ 'wikieditor-toolbar-tool-table-dimensions-columns' => 'ਕਾਲਮ',
+ 'wikieditor-toolbar-tool-table-dimensions-header' => 'ਸਿਰਨਾਵੇਂ ਦੀ ਕਤਾਰ ਜੋੜੋ',
+ 'wikieditor-toolbar-tool-table-example' => 'ਮਿਸਾਲ',
+ 'wikieditor-toolbar-tool-table-preview' => 'à¨à¨²à¨•',
+ 'wikieditor-toolbar-tool-table-insert' => 'ਜੋੜੋ',
+ 'wikieditor-toolbar-tool-table-cancel' => 'ਰੱਦ ਕਰੋ',
+ 'wikieditor-toolbar-tool-table-invalidnumber' => 'ਤà©à¨¸à©€à¨‚ ਕਤਾਰਾਂ ਜਾਂ ਕਾਲਮਾਂ ਦੀ ਸਹੀ ਗਿਣਤੀ ਨਹੀਂ ਭਰੀ ਹੈ।',
+ 'wikieditor-toolbar-tool-table-zero' => 'ਤà©à¨¸à©€à¨‚ ਸਿਫ਼ਰ ਕਤਾਰਾਂ ਜਾਂ ਕਾਲਮਾਂ ਵਾਲੀ ਸਾਰਨੀ ਨਹੀਂ ਬਣਾ ਸਕਦੇ।',
+ 'wikieditor-toolbar-tool-replace' => 'ਖੋਜੋ ਅਤੇ ਵਾਪਸ ਰੱਖੋ',
+ 'wikieditor-toolbar-tool-replace-title' => 'ਖੋਜੋ ਅਤੇ ਵਾਪਸ ਰੱਖੋ',
+ 'wikieditor-toolbar-tool-replace-search' => 'ਖੋਜੋ:',
+ 'wikieditor-toolbar-tool-replace-button-findnext' => 'ਅਗਲਾ ਲੱਭੋ',
+ 'wikieditor-toolbar-tool-replace-close' => 'ਬੰਦ ਕਰੋ',
+ 'wikieditor-toolbar-tool-replace-nomatch' => 'ਤà©à¨¹à¨¾à¨¡à©€ ਖੋਜ ਨੇ ਕਿਸੇ ਨਾਲ਼ ਮੇਲ ਨਹੀਂ ਖਾਧਾ।',
+ 'wikieditor-toolbar-tool-replace-emptysearch' => 'ਤà©à¨¸à©€à¨‚ ਲੱਭਣ ਲਈ ਕà©à¨ ਨਹੀਂ ਭਰਿਆ।',
+ 'wikieditor-toolbar-section-characters' => 'ਖ਼ਾਸ ਚਿੰਨà©à¨¹',
+ 'wikieditor-toolbar-characters-page-latin' => 'ਲਾਤੀਨੀ',
+ 'wikieditor-toolbar-characters-page-latinextended' => 'ਲਾਤੀਨੀ ਤੋਂ ਛà©à©±à¨Ÿ',
+ 'wikieditor-toolbar-characters-page-ipa' => 'ਆਈ੦ਪੀ੦à¨',
+ 'wikieditor-toolbar-characters-page-symbols' => 'ਨਿਸ਼ਾਨ',
+ 'wikieditor-toolbar-characters-page-greek' => 'ਯੂਨਾਨੀ',
+ 'wikieditor-toolbar-characters-page-cyrillic' => 'ਸਿਰੀਲਿਕ',
+ 'wikieditor-toolbar-characters-page-arabic' => 'ਅਰਬੀ',
+ 'wikieditor-toolbar-characters-page-arabicextended' => 'ਅਰਬੀ ਵਿਸਥਾਰੀ',
+ 'wikieditor-toolbar-characters-page-persian' => 'ਫ਼ਾਰਸੀ',
+ 'wikieditor-toolbar-characters-page-hebrew' => 'ਹਿਬਰੂ',
+ 'wikieditor-toolbar-characters-page-bangla' => 'ਬਾਂਗਲਾ',
+ 'wikieditor-toolbar-characters-page-tamil' => 'ਤਾਮਿਲ',
+ 'wikieditor-toolbar-characters-page-telugu' => 'ਤੇਲਗੂ',
+ 'wikieditor-toolbar-characters-page-sinhala' => 'ਸਿਨਹਾਲਾ',
+ 'wikieditor-toolbar-characters-page-gujarati' => 'ਗà©à¨œà¨°à¨¾à¨¤à©€',
+ 'wikieditor-toolbar-characters-page-devanagari' => 'ਦੇਵਨਾਗਰੀ',
+ 'wikieditor-toolbar-characters-page-thai' => 'ਥਾਈ',
+ 'wikieditor-toolbar-characters-page-lao' => 'ਲਾਓ',
+ 'wikieditor-toolbar-characters-page-khmer' => 'ਖ਼ਮੇਰ',
+ 'wikieditor-toolbar-characters-endash' => 'ਅੰਗਰੇਜ਼ੀ ਡੈਸ਼',
+ 'wikieditor-toolbar-characters-emdash' => 'em ਡੈਸ਼',
+ 'wikieditor-toolbar-characters-minus' => 'ਘਟਾਓ ਦਾ ਨਿਸ਼ਾਨ',
+ 'wikieditor-toolbar-section-help' => 'ਮਦਦ',
+ 'wikieditor-toolbar-help-heading-description' => 'ਵੇਰਵਾ',
+ 'wikieditor-toolbar-help-heading-syntax' => 'ਜੋ ਤà©à¨¸à©€à¨‚ ਟਾਈਪ ਕਰਦੇ ਹੋ',
+ 'wikieditor-toolbar-help-heading-result' => 'ਜੋ ਤà©à¨¹à¨¾à¨¨à©‚à©° ਮਿਲਦਾ ਹੈ',
+ 'wikieditor-toolbar-help-page-link' => 'ਕੜੀਆਂ',
+ 'wikieditor-toolbar-help-page-heading' => 'ਸਿਰਨਾਵੇਂ',
+ 'wikieditor-toolbar-help-page-list' => 'ਸੂਚੀਆਂ',
+ 'wikieditor-toolbar-help-page-file' => 'ਫ਼ਾਈਲਾਂ',
+ 'wikieditor-toolbar-help-page-reference' => 'ਹਵਾਲੇ',
+ 'wikieditor-toolbar-help-page-discussion' => 'ਚਰਚਾ',
+ 'wikieditor-toolbar-help-content-italic-description' => 'ਟੇਢਾ',
+ 'wikieditor-toolbar-help-content-italic-syntax' => "''ਟੇਢੀ ਲਿਖਤ''",
+ 'wikieditor-toolbar-help-content-italic-result' => '<em>ਟੇਢੀ ਲਿਖਤ</em>',
+ 'wikieditor-toolbar-help-content-bold-description' => 'ਮੋਟਾ',
+ 'wikieditor-toolbar-help-content-bold-syntax' => "'''ਮੋਟੀ ਲਿਖਤ'''",
+ 'wikieditor-toolbar-help-content-bold-result' => '<strong>ਮੋਟੀ ਲਿਖਤ</strong>',
+ 'wikieditor-toolbar-help-content-bolditalic-description' => 'ਮੋਟਾ &amp; ਟੇਢਾ',
+ 'wikieditor-toolbar-help-content-bolditalic-syntax' => "'''''ਮੋਟੀ &amp; ਟੇਢੀ ਲਿਖਤ'''''",
+ 'wikieditor-toolbar-help-content-bolditalic-result' => '<strong><em>ਮੋਟੀ &amp; ਟੇਢੀ ਲਿਖਤ</em></strong>',
+ 'wikieditor-toolbar-help-content-ilink-description' => 'ਅੰਦਰੂਨੀ ਕੜੀ',
+ 'wikieditor-toolbar-help-content-ilink-syntax' => '[[ਸਫ਼ਾ ਸਿਰਲੇਖ|ਕੜੀ ਲੇਬਲ]]<br />[[ਸਫ਼ਾ ਸਿਰਲੇਖ]]',
+ 'wikieditor-toolbar-help-content-ilink-result' => "<a href='#'>ਕੜੀ ਲੇਬਲ</a><br /><a href='#'>ਸਫ਼ਾ ਸਿਰਲੇਖ</a>",
+ 'wikieditor-toolbar-help-content-xlink-description' => 'ਬਾਹਰੀ ਕੜੀ',
+ 'wikieditor-toolbar-help-content-xlink-syntax' => '[http://www.example.org ਕੜੀ ਲੇਬਲ]<br />[http://www.example.org]<br />http://www.example.org',
+ 'wikieditor-toolbar-help-content-heading2-description' => 'ਦੂਜੇ ਪੱਧਰ ਦਾ ਸਿਰਨਾਵਾਂ',
+ 'wikieditor-toolbar-help-content-heading2-syntax' => '== ਸਿਰਨਾਵੇਂ ਦੀ ਲਿਖਤ ==',
+ 'wikieditor-toolbar-help-content-heading2-result' => '<h2>ਸਿਰਨਾਵੇਂ ਦੀ ਲਿਖਤ</h2>',
+ 'wikieditor-toolbar-help-content-heading3-description' => 'ਤੀਜੇ ਪੱਧਰ ਦਾ ਸਿਰਨਾਵਾਂ',
+ 'wikieditor-toolbar-help-content-heading3-syntax' => '=== ਸਿਰਨਾਵੇਂ ਦੀ ਲਿਖਤ ===',
+ 'wikieditor-toolbar-help-content-heading3-result' => '<h3>ਸਿਰਨਾਵੇਂ ਦੀ ਲਿਖਤ</h3>',
+ 'wikieditor-toolbar-help-content-heading4-description' => 'ਚੌਥੇ ਪੱਧਰ ਦਾ ਸਿਰਨਾਵਾਂ',
+ 'wikieditor-toolbar-help-content-heading4-syntax' => '==== ਸਿਰਨਾਵੇਂ ਦੀ ਲਿਖਤ ====',
+ 'wikieditor-toolbar-help-content-heading4-result' => '<h4>ਸਿਰਨਾਵੇਂ ਦੀ ਲਿਖਤ</h4>',
+ 'wikieditor-toolbar-help-content-heading5-description' => '੫ਵੇਂ ਪੱਧਰ ਦਾ ਸਿਰਨਾਵਾਂ',
+ 'wikieditor-toolbar-help-content-heading5-syntax' => '===== ਸਿਰਨਾਵੇਂ ਦੀ ਲਿਖਤ =====',
+ 'wikieditor-toolbar-help-content-heading5-result' => '<h5>ਸਿਰਨਾਵੇਂ ਦੀ ਲਿਖਤ</h5>',
+ 'wikieditor-toolbar-help-content-ulist-description' => 'ਨਿਸ਼ਾਨਦਾਇਕ ਸੂਚੀ',
+ 'wikieditor-toolbar-help-content-ulist-syntax' => '* ਸੂਚੀ ਦੀ ਵਸਤੂ<br />* ਸੂਚੀ ਦੀ ਵਸਤੂ',
+ 'wikieditor-toolbar-help-content-ulist-result' => '<ul><li>ਸੂਚੀ ਦੀ ਵਸਤੂ</li><li>ਸੂਚੀ ਦੀ ਵਸਤੂ</li></ul>',
+ 'wikieditor-toolbar-help-content-olist-description' => 'ਗਿਣਤੀਦਾਇਕ ਸੂਚੀ',
+ 'wikieditor-toolbar-help-content-olist-syntax' => '# ਸੂਚੀ ਦੀ ਵਸਤੂ<br /># ਸੂਚੀ ਦੀ ਵਸਤੂ',
+ 'wikieditor-toolbar-help-content-olist-result' => '<ol><li>ਸੂਚੀ ਦੀ ਵਸਤੂ</li><li>ਸੂਚੀ ਦੀ ਵਸਤੂ</li></ol>',
+ 'wikieditor-toolbar-help-content-reference-description' => 'ਹਵਾਲਾ',
+ 'wikieditor-toolbar-help-content-reference-syntax' => 'ਸਫ਼ਾ ਲਿਖਤ।&lt;ref name="test"&gt;[http://www.example.org ਕੜੀ ਲਿਖਤ], ਵਧੀਕ ਲਿਖਤ।&lt;/ref&gt;',
+ 'wikieditor-toolbar-help-content-reference-result' => "ਸਫ਼ਾ ਲਿਖਤ।<sup><a href='#'>[੧]</a></sup>",
+ 'wikieditor-toolbar-help-content-rereference-description' => 'ਉਸੇ ਹਵਾਲੇ ਦੀ ਵਧੀਕ ਵਰਤੋਂ',
+ 'wikieditor-toolbar-help-content-rereference-result' => "ਸਫ਼ੇ ਦੀ ਲਿਖਤ।<sup><a href='#'>[1]</a></sup>",
+ 'wikieditor-toolbar-help-content-showreferences-description' => 'ਹਵਾਲੇ ਵਿਖਾਓ',
+ 'wikieditor-toolbar-help-content-showreferences-result' => "<ol class='references'><li id='cite_note-test-0'><b><a title='' href='#'>^</a></b> <a rel='nofollow' title='http://www.example.org' class='external text' href='#'>ਕੜੀ ਲਿਖਤ</a>, ਵਧੀਕ ਲਿਖਤ।</li></ol>",
+ 'wikieditor-toolbar-help-content-signaturetimestamp-description' => 'ਸਮੇਂ ਦੀ ਮੋਹਰ ਸਮੇਤ ਦਸਤਖ਼ਤ',
+ 'wikieditor-toolbar-help-content-signaturetimestamp-result' => "<a href='#' title='{{#special:mypage}}'>ਵਰਤੋਂਕਾਰ ਨਾਂ</a> (<a href='#' title='{{#special:mytalk}}'>talk</a>) ੧੫:੫੪, ੧੦ ਜੂਨ ੨੦੦੯ (ਯੂਟੀਸੀ)",
+ 'wikieditor-toolbar-help-content-signature-description' => 'ਦਸਤਖ਼ਤ',
+ 'wikieditor-toolbar-help-content-signature-result' => "<a href='#' title='{{#special:mypage}}'>ਵਰਤੋਂਕਾਰ ਨਾਂ</a> (<a href='#' title='{{#special:mytalk}}'>ਗੱਲਬਾਤ</a>)",
+ 'wikieditor-toolbar-help-content-indent-description' => 'ਹਾਸ਼ੀਠਤੋਂ ਦੂਰ',
+);
+
/** Deitsch (Deitsch)
* @author Xqt
*/
@@ -21177,7 +21737,7 @@ $messages['pl'] = array(
'wikieditor-toolbar' => 'Pasek narzędzi edycyjnych',
'wikieditor-toolbar-desc' => 'Ułatwiający pracę pasek narzędzi edycyjnych',
'wikieditor-toolbar-preference' => 'Włącz rozszerzony pasek narzędzi edycyjnych',
- 'wikieditor-toolbar-dialogs-preference' => 'Włącz okienka dodawania linków, tabel itp.',
+ 'wikieditor-toolbar-dialogs-preference' => 'Włącz kreatory dodawania linków, tabel itp.',
'wikieditor-toolbar-hidesig' => 'Ukryj przycisk podpisu na stronach głównej przestrzeni nazw',
'wikieditor-toolbar-loading' => 'Åadowanie...',
'wikieditor-toolbar-tool-bold' => 'Wytłuszczenie',
@@ -21205,6 +21765,7 @@ $messages['pl'] = array(
'wikieditor-toolbar-tool-link-int-target-status-invalid' => 'Nieprawidłowy tytuł',
'wikieditor-toolbar-tool-link-int-target-status-external' => 'Link zewnętrzny',
'wikieditor-toolbar-tool-link-int-target-status-loading' => 'Sprawdzanie czy strona istnieje…',
+ 'wikieditor-toolbar-tool-link-int-target-status-disambig' => 'Strona ujednoznaczniajÄ…ca',
'wikieditor-toolbar-tool-link-int-invalid' => 'Wprowadzony tytuł jest nieprawidłowy.',
'wikieditor-toolbar-tool-link-lookslikeinternal' => 'Podany URL wygląda jak link do innej strony wiki. Czy chcesz, aby był to link wewnętrzny?',
'wikieditor-toolbar-tool-link-lookslikeinternal-int' => 'Link wewnętrzny',
@@ -21426,7 +21987,7 @@ $messages['pms'] = array(
'wikieditor-toolbar' => "Bara d'utiss ëd modìfica",
'wikieditor-toolbar-desc' => "Bara d'utiss ëd modìfica con dovrabilità ameliorà",
'wikieditor-toolbar-preference' => "Ativé la bara d'utiss ameliorà",
- 'wikieditor-toolbar-dialogs-preference' => "Ativé ij quàder ëd diàlogh për anserì anliure, tàule e d'àutr",
+ 'wikieditor-toolbar-dialogs-preference' => "Ativé j'assistent për gionté dle anliure, dle tàule e ëdcò la fonsion d'arserca e rampiass",
'wikieditor-toolbar-hidesig' => 'Stërmé ël boton ëd firma ant le pàgine ëd lë spassi nominal prinsipal',
'wikieditor-toolbar-loading' => 'Cariament...',
'wikieditor-toolbar-tool-bold' => 'Grassèt',
@@ -21454,6 +22015,7 @@ $messages['pms'] = array(
'wikieditor-toolbar-tool-link-int-target-status-invalid' => 'Tìtol nen vàlid',
'wikieditor-toolbar-tool-link-int-target-status-external' => 'Anliura esterna',
'wikieditor-toolbar-tool-link-int-target-status-loading' => "Verìfica ëd l'esistensa dla pàgina...",
+ 'wikieditor-toolbar-tool-link-int-target-status-disambig' => "Pàgina d'omonimìa",
'wikieditor-toolbar-tool-link-int-invalid' => "Ël tìtol ch'a l'ha spessificà a va pa bin.",
'wikieditor-toolbar-tool-link-lookslikeinternal' => "L'URL ch'a l'ha spessificà a smijërìa n'anliura a n'àutra pàgina wiki. Veul-lo fene n'anliura anterna?",
'wikieditor-toolbar-tool-link-lookslikeinternal-int' => 'Anliura anterna',
@@ -21640,6 +22202,7 @@ $1:Esempi.jpg|Descrission2',
/** Western Punjabi (پنجابی)
* @author BMRG14
+ * @author Ebraminio
* @author Khalid Mahmood
*/
$messages['pnb'] = array(
@@ -21674,7 +22237,7 @@ $messages['pnb'] = array(
'wikieditor-toolbar' => 'لکھت اوزار',
'wikieditor-toolbar-desc' => 'اوزار پٹی چ تبدیلی ورتن کرکے کرو۔',
'wikieditor-toolbar-preference' => 'ودیا اوزار پٹی نوں چالو کرو۔',
- 'wikieditor-toolbar-dialogs-preference' => 'ڈائیلاگ نوں قابل کرو جوڑ یا پعاڑے یا Ûور رلان لئی۔',
+ 'wikieditor-toolbar-dialogs-preference' => 'ڈائیلاگ نوں قابل کرو جوڑ یا پعاڑے یا Ûور رلان لئی۔', # Fuzzy
'wikieditor-toolbar-hidesig' => 'دسخص بٹن نوں ناںتھاں صÙیاں توں لکاؤ۔',
'wikieditor-toolbar-loading' => 'لوڈنگ۔۔۔',
'wikieditor-toolbar-tool-bold' => 'موٹا',
@@ -21798,7 +22361,7 @@ $1:ادھارن.جےپیجی|سرخی2',
'wikieditor-toolbar-characters-page-cyrillic' => 'سریلیک',
'wikieditor-toolbar-characters-page-arabic' => 'عربی',
'wikieditor-toolbar-characters-page-arabicextended' => 'عربی ودویں',
- 'wikieditor-toolbar-characters-page-persian' => 'پارسی',
+ 'wikieditor-toolbar-characters-page-persian' => 'Ùارسی',
'wikieditor-toolbar-characters-page-hebrew' => 'عبرانی',
'wikieditor-toolbar-characters-page-bangla' => 'بنگالی',
'wikieditor-toolbar-characters-page-telugu' => 'تلیگو',
@@ -21887,7 +22450,7 @@ $messages['ps'] = array(
'wikieditor' => 'د پرمختللی ويکي متن د سمون ليدنمخ',
'wikieditor-wikitext-tab' => 'ويکي متن',
'wikieditor-loading' => 'برسÛرÛØ¯Ù†Û Ú©Û Ø¯ÛŒ...',
- 'wikieditor-preview-preference' => 'څنګ په څنګ مخليدنه چارنده کول',
+ 'wikieditor-preview-preference' => 'څنگ په څنگ مخليدنه چارنول',
'wikieditor-preview-tab' => 'مخليدنه',
'wikieditor-preview-changes-tab' => 'بدلونونه',
'wikieditor-preview-loading' => 'برسÛرÛØ¯Ù†Û Ú©Û Ø¯ÛŒ...',
@@ -21895,19 +22458,19 @@ $messages['ps'] = array(
'wikieditor-previewDialog-loading' => 'برسÛرÛØ¯Ù†Û Ú©Û Ø¯ÛŒ...',
'wikieditor-publish-preference' => 'ګام په ګام خپرÛدنه چارنده کول',
'wikieditor-publish-button-publish' => 'خپرول',
- 'wikieditor-publish-button-cancel' => 'ناګارل',
+ 'wikieditor-publish-button-cancel' => 'ناگارل',
'wikieditor-publish-dialog-title' => '{{SITENAME}} Ú©Û Ø®Ù¾Ø±ÙˆÙ„',
- 'wikieditor-publish-dialog-summary' => 'د سمون لنډيز (په لنډه توګه د خپلو بدلونونو څرګندونه ÙˆÚ©Ú“Û):',
+ 'wikieditor-publish-dialog-summary' => 'د سمون لنډيز (په لنډه توگه د خپلو بدلونونو څرگندونه ÙˆÚ©Ú“Û):',
'wikieditor-publish-dialog-minor' => 'وړوکی سمون',
'wikieditor-publish-dialog-watch' => 'همدا مخ کتل',
'wikieditor-publish-dialog-publish' => 'خپرول',
'wikieditor-publish-dialog-goback' => 'پر شا تلل',
'wikieditor-template-editor-dialog-title' => 'Ú©ÙŠÙ†Ú‰Û Ø³Ù…ÙˆÙ„',
'wikieditor-template-editor-dialog-submit' => 'اوسمهالول',
- 'wikieditor-template-editor-dialog-cancel' => 'ناګارل',
+ 'wikieditor-template-editor-dialog-cancel' => 'ناگارل',
'wikieditor-templates-preference' => 'Ú©ÙŠÙ†Ú‰Û ØºÚول چارنده کول',
- 'wikieditor-toc-show' => 'Ù…ÛÙ†Úپانګه ښکاره کول',
- 'wikieditor-toc-hide' => 'Ù…ÛÙ†Úپانګه پټول',
+ 'wikieditor-toc-show' => 'Ù…ÛÙ†Úپانگه ښکاره کول',
+ 'wikieditor-toc-hide' => 'Ù…ÛÙ†Úپانگه پټول',
'wikieditor-toolbar' => 'د سمون توکپټه',
'wikieditor-toolbar-loading' => 'برسÛرÛØ¯Ù†Û Ú©Û Ø¯ÛŒ...',
'wikieditor-toolbar-tool-bold' => 'زغرد',
@@ -21929,13 +22492,13 @@ $messages['ps'] = array(
'wikieditor-toolbar-tool-link-ext-target' => 'د ØªÚ“Ù†Û URL:',
'wikieditor-toolbar-tool-link-ext-text' => 'د ØªÚ“Ù†Û Ù…ØªÙ†:',
'wikieditor-toolbar-tool-link-insert' => 'تړنه ورټومبل',
- 'wikieditor-toolbar-tool-link-cancel' => 'ناګارل',
+ 'wikieditor-toolbar-tool-link-cancel' => 'ناگارل',
'wikieditor-toolbar-tool-link-int-target-status-exists' => 'Ù¾Ø¯Û Ù†ÙˆÙ… مخ شته',
'wikieditor-toolbar-tool-link-int-target-status-notexists' => 'Ù¾Ø¯Û Ù†ÙˆÙ… مخ نشته',
'wikieditor-toolbar-tool-link-int-target-status-invalid' => 'ناسم سرليک',
'wikieditor-toolbar-tool-link-int-target-status-external' => 'Ø¨Ø§Ù†Ø¯Ù†Û ØªÚ“Ù†Ù‡',
'wikieditor-toolbar-tool-link-int-target-status-loading' => 'د مخ د شتون څارنه...',
- 'wikieditor-toolbar-tool-link-int-invalid' => 'Ø³ØªØ§Ø³Û Úانګړی شوی سرليک سم نه وو.',
+ 'wikieditor-toolbar-tool-link-int-invalid' => 'Ø³ØªØ§Ø³Û Úانگړی شوی سرليک سم نه وو.',
'wikieditor-toolbar-tool-link-lookslikeinternal-int' => 'Ú©ÙˆØ±Ù†Û ØªÚ“Ù†Ù‡',
'wikieditor-toolbar-tool-link-lookslikeinternal-ext' => 'Ø¨Ø§Ù†Ø¯Ù†Û ØªÚ“Ù†Ù‡',
'wikieditor-toolbar-tool-file' => 'خښه Ø´ÙˆÛ Ø¯ÙˆØªÙ†Ù‡',
@@ -21944,11 +22507,11 @@ $messages['ps'] = array(
'wikieditor-toolbar-file-default' => '(تلواليز)',
'wikieditor-toolbar-file-format' => 'بڼه:',
'wikieditor-toolbar-tool-file-insert' => 'ورټومبل',
- 'wikieditor-toolbar-tool-file-cancel' => 'ناګارل',
+ 'wikieditor-toolbar-tool-file-cancel' => 'ناگارل',
'wikieditor-toolbar-tool-reference' => 'سرچينه',
'wikieditor-toolbar-tool-reference-example' => 'د پايڅوړ متن دلته وليکÛ',
- 'wikieditor-toolbar-tool-reference-cancel' => 'ناګارل',
- 'wikieditor-toolbar-tool-reference-title' => 'سرچينه ورګډول',
+ 'wikieditor-toolbar-tool-reference-cancel' => 'ناگارل',
+ 'wikieditor-toolbar-tool-reference-title' => 'سرچينه ورگډول',
'wikieditor-toolbar-tool-reference-insert' => 'ورټومبل',
'wikieditor-toolbar-tool-reference-text' => 'د Ø³Ø±Ú†ÙŠÙ†Û Ù…ØªÙ†',
'wikieditor-toolbar-tool-signature' => 'لاسليک او د وخت ټاپه',
@@ -21961,8 +22524,8 @@ $messages['ps'] = array(
'wikieditor-toolbar-tool-heading-5' => 'Ûµ Ú©Ú†Ù‡',
'wikieditor-toolbar-tool-heading-example' => 'د سرليک متن',
'wikieditor-toolbar-group-format' => 'بڼه',
- 'wikieditor-toolbar-tool-ulist' => 'Ú«ÙˆÙ„Û Ø¯Ø§Ø±Ù‡ لړليک',
- 'wikieditor-toolbar-tool-ulist-example' => 'د Ú«ÙˆÙ„Û Ø¯Ø§Ø±Ù‡ لړليک توکی',
+ 'wikieditor-toolbar-tool-ulist' => 'Ú¯ÙˆÙ„Û Ø¯Ø§Ø±Ù‡ لړليک',
+ 'wikieditor-toolbar-tool-ulist-example' => 'د Ú¯ÙˆÙ„Û Ø¯Ø§Ø±Ù‡ لړليک توکی',
'wikieditor-toolbar-tool-olist' => 'شمÛرن لړليک',
'wikieditor-toolbar-tool-redirect-example' => 'د هدÙÙŠ مخ نوم',
'wikieditor-toolbar-tool-big' => 'لوی',
@@ -21994,11 +22557,11 @@ $messages['ps'] = array(
'wikieditor-toolbar-tool-table-dimensions-rows' => 'ليکÛ',
'wikieditor-toolbar-tool-table-dimensions-columns' => 'ستنÛ',
'wikieditor-toolbar-tool-table-wikitable' => 'ډول او پولÛ',
- 'wikieditor-toolbar-tool-table-sortable' => 'لښتيال د اوډون ÙˆÚ“ ګرÚول',
- 'wikieditor-toolbar-tool-table-example' => 'بÛÙ„Ú«Ù‡',
+ 'wikieditor-toolbar-tool-table-sortable' => 'لښتيال اوډون ÙˆÚ“ گرÚول',
+ 'wikieditor-toolbar-tool-table-example' => 'بÛÙ„Ú¯Ù‡',
'wikieditor-toolbar-tool-table-preview' => 'مخليدنه',
'wikieditor-toolbar-tool-table-insert' => 'ورټومبل',
- 'wikieditor-toolbar-tool-table-cancel' => 'ناګارل',
+ 'wikieditor-toolbar-tool-table-cancel' => 'ناگارل',
'wikieditor-toolbar-tool-replace' => 'پلټل او Úايناستول',
'wikieditor-toolbar-tool-replace-title' => 'پلټل او Úايناستول',
'wikieditor-toolbar-tool-replace-search' => 'پلټنه د:',
@@ -22009,7 +22572,7 @@ $messages['ps'] = array(
'wikieditor-toolbar-tool-replace-button-replaceall' => 'ټول Úايناستول',
'wikieditor-toolbar-tool-replace-close' => 'تړل',
'wikieditor-toolbar-tool-replace-nomatch' => 'Ø³ØªØ§Ø³Û Ù¾Ù„Ù¼Ù†Ù‡ د Ù‡ÛÚ… کوم شي سره اړونده نه وه.',
- 'wikieditor-toolbar-section-characters' => 'Úانګړي توري',
+ 'wikieditor-toolbar-section-characters' => 'Úانگړي توري',
'wikieditor-toolbar-characters-page-latin' => 'لاتين',
'wikieditor-toolbar-characters-page-latinextended' => 'غÚÛدلی لاتين',
'wikieditor-toolbar-characters-page-ipa' => 'ن.غ.ا',
@@ -22030,7 +22593,7 @@ $messages['ps'] = array(
'wikieditor-toolbar-characters-page-lao' => 'لاوي',
'wikieditor-toolbar-characters-page-khmer' => 'خمري',
'wikieditor-toolbar-section-help' => 'لارښود',
- 'wikieditor-toolbar-help-heading-description' => 'څرګندونه',
+ 'wikieditor-toolbar-help-heading-description' => 'څرگندونه',
'wikieditor-toolbar-help-heading-syntax' => 'هغه Ú…Ù‡ Ú†Û Ù„ÙŠÚ©Û',
'wikieditor-toolbar-help-heading-result' => 'هغه Ú…Ù‡ Ú†Û Ù„Ø§Ø³ ته راوړÛ',
'wikieditor-toolbar-help-page-link' => 'تړنÛ',
@@ -22063,7 +22626,7 @@ $messages['ps'] = array(
'wikieditor-toolbar-help-content-heading5-description' => 'د پينÚÙ…Û Ú©Ú†Û Ø³Ø±Ù„ÙŠÚ©',
'wikieditor-toolbar-help-content-heading5-syntax' => '===== د سرليک متن =====',
'wikieditor-toolbar-help-content-heading5-result' => '<h5>د سرليک متن</h5>',
- 'wikieditor-toolbar-help-content-ulist-description' => 'Ú«ÙˆÙ„Û Ø¯Ø§Ø±Ù‡ لړليک',
+ 'wikieditor-toolbar-help-content-ulist-description' => 'Ú¯ÙˆÙ„Û Ø¯Ø§Ø±Ù‡ لړليک',
'wikieditor-toolbar-help-content-ulist-syntax' => '* د لړليک توکی<br />* د لړليک توکی',
'wikieditor-toolbar-help-content-ulist-result' => '<ul><li>د لړليک توکی</li><li>د لړليک توکی</li></ul>',
'wikieditor-toolbar-help-content-olist-description' => 'شمÛرن لړليک',
@@ -22109,7 +22672,7 @@ $messages['pt'] = array(
'wikieditor-preview-tab' => 'Antevisão',
'wikieditor-preview-changes-tab' => 'Alterações',
'wikieditor-preview-loading' => 'A carregar…',
- 'wikieditor-previewDialog-preference' => 'Activar o diálogo de antevisão',
+ 'wikieditor-previewDialog-preference' => 'Ativar o diálogo de antevisão',
'wikieditor-previewDialog-tab' => 'Antevisão',
'wikieditor-previewDialog-loading' => 'A carregar…',
'wikieditor-publish-preference' => 'Possibilitar publicação passo a passo',
@@ -22131,8 +22694,8 @@ $messages['pt'] = array(
'wikieditor-toc-hide' => 'Esconder conteúdo',
'wikieditor-toolbar' => 'Barra de ferramentas de edição',
'wikieditor-toolbar-desc' => 'Barra de ferramentas de edição com usabilidade melhorada',
- 'wikieditor-toolbar-preference' => 'Activar a barra de ferramentas de edição melhorada',
- 'wikieditor-toolbar-dialogs-preference' => 'Possibilitar diálogos de inserção de links, tabelas e outros',
+ 'wikieditor-toolbar-preference' => 'Ativar a barra de ferramentas de edição melhorada',
+ 'wikieditor-toolbar-dialogs-preference' => 'Possibilitar diálogos de inserção de links, tabelas e outros', # Fuzzy
'wikieditor-toolbar-hidesig' => 'Esconder o botão da assinatura nas páginas do espaço nominal principal',
'wikieditor-toolbar-loading' => 'A carregar…',
'wikieditor-toolbar-tool-bold' => 'Negrito',
@@ -22200,7 +22763,7 @@ $messages['pt'] = array(
'wikieditor-toolbar-tool-indent-example' => 'Linha indentada',
'wikieditor-toolbar-tool-nowiki' => 'Sem formatação wiki',
'wikieditor-toolbar-tool-nowiki-example' => 'Inserir aqui texto sem formatação',
- 'wikieditor-toolbar-tool-redirect' => 'Redireccionamento',
+ 'wikieditor-toolbar-tool-redirect' => 'Redirecionamento',
'wikieditor-toolbar-tool-redirect-example' => 'Nome da página de destino',
'wikieditor-toolbar-tool-big' => 'Grande',
'wikieditor-toolbar-tool-big-example' => 'Texto grande',
@@ -22254,7 +22817,7 @@ $1:Exemplo2.jpg|Legenda2',
'wikieditor-toolbar-tool-replace-button-replaceall' => 'Substituir todos',
'wikieditor-toolbar-tool-replace-close' => 'Fechar',
'wikieditor-toolbar-tool-replace-nomatch' => 'A sua pesquisa não produziu resultados.',
- 'wikieditor-toolbar-tool-replace-success' => 'Substituições realizadas: $1.', # Fuzzy
+ 'wikieditor-toolbar-tool-replace-success' => '$1 {{PLURAL:$1|substituição realizada|substituições realizadas}}.',
'wikieditor-toolbar-tool-replace-emptysearch' => 'Não introduziu nada para pesquisar.',
'wikieditor-toolbar-tool-replace-invalidregex' => "A expressão regular ''(regex)'' que introduziu é inválida: $1",
'wikieditor-toolbar-section-characters' => 'Caracteres especiais',
@@ -22341,13 +22904,14 @@ $1:Exemplo2.jpg|Legenda2',
);
/** Brazilian Portuguese (português do Brasil)
+ * @author Cainamarques
* @author Daemorris
* @author Everton137
* @author Giro720
* @author Hamilton Abreu
* @author Helder.wiki
- * @author Heldergeovane
* @author Lijealso
+ * @author Luckas
* @author Luckas Blade
* @author MetalBrasil
* @author Rafael Vargas
@@ -22385,7 +22949,7 @@ $messages['pt-br'] = array(
'wikieditor-toolbar' => 'Barra de ferramentas de edição',
'wikieditor-toolbar-desc' => 'Barra de ferramentas de edição com usabilidade melhorada',
'wikieditor-toolbar-preference' => 'Ativar a barra de ferramentas de edição melhorada',
- 'wikieditor-toolbar-dialogs-preference' => 'Possibilitar diálogos de inserção de ligações, tabelas e outros',
+ 'wikieditor-toolbar-dialogs-preference' => 'Possibilitar diálogos de inserção de ligações, tabelas assim como a função de buscar e substituir',
'wikieditor-toolbar-hidesig' => 'Esconder o botão da assinatura nas páginas do espaço nominal principal',
'wikieditor-toolbar-loading' => 'Carregando...',
'wikieditor-toolbar-tool-bold' => 'Negrito',
@@ -22413,6 +22977,7 @@ $messages['pt-br'] = array(
'wikieditor-toolbar-tool-link-int-target-status-invalid' => 'Título inválido',
'wikieditor-toolbar-tool-link-int-target-status-external' => 'Link externo',
'wikieditor-toolbar-tool-link-int-target-status-loading' => 'Verificando existência da página...',
+ 'wikieditor-toolbar-tool-link-int-target-status-disambig' => 'Página de desambiguação',
'wikieditor-toolbar-tool-link-int-invalid' => 'O título que você especificou é inválido.',
'wikieditor-toolbar-tool-link-lookslikeinternal' => 'A URL que você especificou parece ser um link para outra página do wiki. Você deseja usar como link interno?',
'wikieditor-toolbar-tool-link-lookslikeinternal-int' => 'Link interno',
@@ -22427,6 +22992,7 @@ $messages['pt-br'] = array(
'wikieditor-toolbar-file-float' => 'Alinhamento:',
'wikieditor-toolbar-file-default' => '(padrão)',
'wikieditor-toolbar-file-format' => 'Formato:',
+ 'wikieditor-toolbar-file-format-none' => 'nenhum',
'wikieditor-toolbar-tool-file-insert' => 'Inserir',
'wikieditor-toolbar-tool-file-cancel' => 'Cancelar',
'wikieditor-toolbar-tool-reference' => 'Referência',
@@ -22493,7 +23059,7 @@ $1:Exemplo.jpg|Legenda2',
'wikieditor-toolbar-tool-table-preview' => 'Pré-visualização',
'wikieditor-toolbar-tool-table-insert' => 'Inserir',
'wikieditor-toolbar-tool-table-cancel' => 'Cancelar',
- 'wikieditor-toolbar-tool-table-toomany' => 'Não é possível inserir uma tabela com mais de $1 colunas com esta interface.', # Fuzzy
+ 'wikieditor-toolbar-tool-table-toomany' => 'Não é possível inserir uma tabela com mais de 1000 células com esta interface.',
'wikieditor-toolbar-tool-table-invalidnumber' => 'Você não introduziu um número válido de linhas ou colunas.',
'wikieditor-toolbar-tool-table-zero' => 'Você não pode inserir uma tabela com zero linhas ou colunas.',
'wikieditor-toolbar-tool-replace' => 'Localizar e substituir',
@@ -22507,7 +23073,7 @@ $1:Exemplo.jpg|Legenda2',
'wikieditor-toolbar-tool-replace-button-replaceall' => 'Substituir todos',
'wikieditor-toolbar-tool-replace-close' => 'Fechar',
'wikieditor-toolbar-tool-replace-nomatch' => 'Não houve coincidências para a sua pesquisa.',
- 'wikieditor-toolbar-tool-replace-success' => 'Substituições realizadas: $1.', # Fuzzy
+ 'wikieditor-toolbar-tool-replace-success' => '$1 {{PLURAL:$1|substituição realizada|substituições realizadas}}.',
'wikieditor-toolbar-tool-replace-emptysearch' => 'Você não introduziu nada para buscar.',
'wikieditor-toolbar-tool-replace-invalidregex' => "A expressão regular ''(regex)'' que você introduziu é inválida: $1",
'wikieditor-toolbar-section-characters' => 'Caracteres especiais',
@@ -22628,7 +23194,7 @@ $messages['qu'] = array(
'wikieditor-toolbar' => "Llamk'apunapaq butunnintin uma siq'i",
'wikieditor-toolbar-desc' => "Kallpachasqa llamk'apunapaq butunnintin uma siq'i",
'wikieditor-toolbar-preference' => "Kallpachasqa llamk'apunapaq butunnintin uma siq'ita atichiy",
- 'wikieditor-toolbar-dialogs-preference' => "T'inkikunapaq, wachuchasqakunapaq, aswanpaqpas willanakuykunata atichiy",
+ 'wikieditor-toolbar-dialogs-preference' => "T'inkikunata, wachuchasqakunata sat'inapaq, maskanapaq huknachanapaqpas layqakunata atichiy",
'wikieditor-toolbar-hidesig' => "Uma suti k'iti p'anqakunamanta silq'uy butunta pakay",
'wikieditor-toolbar-loading' => 'Chaqnamuspa…',
'wikieditor-toolbar-tool-bold' => 'Yanasapa',
@@ -22656,6 +23222,7 @@ $messages['qu'] = array(
'wikieditor-toolbar-tool-link-int-target-status-invalid' => "P'anqap sutinqa manam allinchu",
'wikieditor-toolbar-tool-link-int-target-status-external' => "Hawa t'inki",
'wikieditor-toolbar-tool-link-int-target-status-loading' => "P'anqa kachkayta llanchichkaspa...",
+ 'wikieditor-toolbar-tool-link-int-target-status-disambig' => "Sut'ichana qillqa",
'wikieditor-toolbar-tool-link-int-invalid' => "Qusqayki p'anqap sutinqa manam allinchu.",
'wikieditor-toolbar-tool-link-lookslikeinternal' => "Qusqayki URL nisqaqa huk wiki p'anqaman t'inkimuqmanmi rik'chakun. Ukhu t'inkiri kachunchu?",
'wikieditor-toolbar-tool-link-lookslikeinternal-int' => "Ukhu t'inki",
@@ -22879,7 +23446,7 @@ $messages['ro'] = array(
'wikieditor-toolbar' => 'Modificarea barei de instrumente',
'wikieditor-toolbar-desc' => 'Modificarea barei de instrumente cu utilizare ridicată',
'wikieditor-toolbar-preference' => 'Activează varianta îmbunătățită a barei de unelte',
- 'wikieditor-toolbar-dialogs-preference' => 'Activează casetele de dialog pentru inserarea legăturilor, tabelelor și a altor funcționalități',
+ 'wikieditor-toolbar-dialogs-preference' => 'Activează casetele de dialog pentru inserarea legăturilor, tabelelor și a altor funcționalități', # Fuzzy
'wikieditor-toolbar-hidesig' => 'Ascunde butonul de semnătură în cazul paginilor din spațiul de nume principal',
'wikieditor-toolbar-loading' => 'Se încarcă...',
'wikieditor-toolbar-tool-bold' => 'Aldin',
@@ -23127,7 +23694,7 @@ $messages['roa-tara'] = array(
'wikieditor-toolbar' => 'Barre de le cangiaminde',
'wikieditor-toolbar-desc' => "Cange 'a pàgene d'a barre de le struminde cu l'usabbilità avanzate",
'wikieditor-toolbar-preference' => "Abbilite 'a barre de le struminde pe le cangiaminde avanzate",
- 'wikieditor-toolbar-dialogs-preference' => "Abbilite le dialoghe pe l'inzerimende de collegaminde, tabbelle e otre cose",
+ 'wikieditor-toolbar-dialogs-preference' => "Abbilite le procedure guidate pe l'inzerimende de collegaminde, tabbelle e otre cose pa funzione de ricerche e sostituzione",
'wikieditor-toolbar-hidesig' => "Scunne 'u buttone d'a firme da le pàggene jndr'à 'u namespace prengepàle",
'wikieditor-toolbar-loading' => 'Stoche a careche…',
'wikieditor-toolbar-tool-bold' => 'Grascette',
@@ -23155,6 +23722,7 @@ $messages['roa-tara'] = array(
'wikieditor-toolbar-tool-link-int-target-status-invalid' => 'Titole invalide',
'wikieditor-toolbar-tool-link-int-target-status-external' => 'Collegaminde fore a Uicchipèdie',
'wikieditor-toolbar-tool-link-int-target-status-loading' => "Stoche a verifiche l'esistenze d'a pàgene...",
+ 'wikieditor-toolbar-tool-link-int-target-status-disambig' => 'Pàgene de disambbiguazione',
'wikieditor-toolbar-tool-link-int-invalid' => "'U titele ca è specificate jè invalide.",
'wikieditor-toolbar-tool-link-lookslikeinternal' => "'A URL ca tu è specificate pare manghe ca vò ccù punde a 'n'otra pàgene de Uicchi. Ce vuè ccù face 'nu collegamende inderne?",
'wikieditor-toolbar-tool-link-lookslikeinternal-int' => "Collegamende jndr'à Uicchipèdie",
@@ -23350,6 +23918,7 @@ $1:Example.jpg|Titele2',
* @author KPu3uC B Poccuu
* @author Kaganer
* @author Lockal
+ * @author Okras
* @author Temuri rajavi
* @author ÐлекÑандр Сигачёв
*/
@@ -23385,7 +23954,7 @@ $messages['ru'] = array(
'wikieditor-toolbar' => 'Панель редактированиÑ',
'wikieditor-toolbar-desc' => 'Панель редактированиÑ, более ÑƒÐ´Ð¾Ð±Ð½Ð°Ñ Ð² иÑпользовании',
'wikieditor-toolbar-preference' => 'Включить улучшенную панель редактированиÑ',
- 'wikieditor-toolbar-dialogs-preference' => 'Включить диалоги Ð´Ð»Ñ Ð²Ñтавки ÑÑылок, таблиц и других объектов',
+ 'wikieditor-toolbar-dialogs-preference' => 'Включить маÑтера Ð´Ð»Ñ Ð²Ñтавки ÑÑылок, таблиц, а также функции вÑтавки и замены',
'wikieditor-toolbar-hidesig' => 'Скрыть кнопку подпиÑи на Ñтраницах оÑновного проÑтранÑтва имён',
'wikieditor-toolbar-loading' => 'Загрузка…',
'wikieditor-toolbar-tool-bold' => 'Полужирный',
@@ -23413,6 +23982,7 @@ $messages['ru'] = array(
'wikieditor-toolbar-tool-link-int-target-status-invalid' => 'ÐедопуÑтимое название',
'wikieditor-toolbar-tool-link-int-target-status-external' => 'ВнешнÑÑ ÑÑылка',
'wikieditor-toolbar-tool-link-int-target-status-loading' => 'Проверка ÑущеÑÑ‚Ð²Ð¾Ð²Ð°Ð½Ð¸Ñ Ñтраницы…',
+ 'wikieditor-toolbar-tool-link-int-target-status-disambig' => 'Страницы Ñ€Ð°Ð·Ñ€ÐµÑˆÐµÐ½Ð¸Ñ Ð½ÐµÐ¾Ð´Ð½Ð¾Ð·Ð½Ð°Ñ‡Ð½Ð¾Ñтей',
'wikieditor-toolbar-tool-link-int-invalid' => 'Указанное название недопуÑтимо.',
'wikieditor-toolbar-tool-link-lookslikeinternal' => 'Указанный вами URL похож на ÑÑылку на другую вики-Ñтраницу. Ð’Ñ‹ хотите Ñделать данную ÑÑылку внутренней?',
'wikieditor-toolbar-tool-link-lookslikeinternal-int' => 'ВнутреннÑÑ ÑÑылка',
@@ -23509,7 +24079,7 @@ $1:Example.jpg|ОпиÑание2',
'wikieditor-toolbar-tool-replace-button-replaceall' => 'Заменить вÑе',
'wikieditor-toolbar-tool-replace-close' => 'Закрыть',
'wikieditor-toolbar-tool-replace-nomatch' => 'По вашему запроÑу ничего не найдено.',
- 'wikieditor-toolbar-tool-replace-success' => 'Произведено замен: $1.', # Fuzzy
+ 'wikieditor-toolbar-tool-replace-success' => '$1 {{PLURAL:$1|замена произведена|замены произведены|замен произведено}}.',
'wikieditor-toolbar-tool-replace-emptysearch' => 'Ð’Ñ‹ не указали что Ñледует иÑкать.',
'wikieditor-toolbar-tool-replace-invalidregex' => 'Введённое вами регулÑрное выражение ошибочно: $1',
'wikieditor-toolbar-section-characters' => 'СпецÑимволы',
@@ -23532,6 +24102,7 @@ $1:Example.jpg|ОпиÑание2',
'wikieditor-toolbar-characters-page-thai' => 'ТайÑкие',
'wikieditor-toolbar-characters-page-lao' => 'ЛаоÑÑкие',
'wikieditor-toolbar-characters-page-khmer' => 'КхмерÑкие',
+ 'wikieditor-toolbar-characters-endash' => 'Ñреднее тире',
'wikieditor-toolbar-characters-emdash' => 'длинное тире',
'wikieditor-toolbar-characters-minus' => 'знак минуÑ',
'wikieditor-toolbar-section-help' => 'Справка',
@@ -23636,7 +24207,7 @@ $messages['rue'] = array(
'wikieditor-toolbar' => 'Едітачный панел інштрументів',
'wikieditor-toolbar-desc' => 'Едітачный панел інштрументів з вылїпшенов хоÑновательноÑтёв',
'wikieditor-toolbar-preference' => 'Запнути вылїпшеный панел інштрументів',
- 'wikieditor-toolbar-dialogs-preference' => 'Поволити діалоґы про Ð²ÐºÐ»Ð°Ð´Ð°Ð½Ñ Ð¾Ð´ÐºÐ°Ð·Ñ–Ð², таблиць ітд.',
+ 'wikieditor-toolbar-dialogs-preference' => 'Поволити діалоґы про Ð²ÐºÐ»Ð°Ð´Ð°Ð½Ñ Ð¾Ð´ÐºÐ°Ð·Ñ–Ð², таблиць ітд.', # Fuzzy
'wikieditor-toolbar-hidesig' => 'Скрыти клапку підпиÑу на Ñторінках у головнім проÑторї назв',
'wikieditor-toolbar-loading' => 'ÐаграванÑ...',
'wikieditor-toolbar-tool-bold' => 'Тучне',
@@ -23874,7 +24445,7 @@ $messages['sa'] = array(
'wikieditor-toolbar' => 'उपकरणपेटिका समà¥à¤ªà¤¾à¤¦à¥à¤¯à¤¤à¤¾à¤®à¥',
'wikieditor-toolbar-desc' => 'विवृदà¥à¤§à¥‹à¤ªà¤¯à¥‹à¤—यà¥à¤•à¥à¤¤à¤®à¥ उपकरणपेटिकापृषà¥à¤ à¤‚ समà¥à¤ªà¤¾à¤¦à¥à¤¯à¤¤à¤¾à¤®à¥',
'wikieditor-toolbar-preference' => 'विवृदà¥à¤§à¥‹à¤ªà¤•à¤°à¤£à¤ªà¥‡à¤Ÿà¤¿à¤•à¤¾à¤¯à¤¾à¤ƒ समà¥à¤ªà¤¾à¤¦à¤¨à¤‚ सकà¥à¤°à¤¿à¤¯à¤‚ कà¥à¤°à¤¿à¤¯à¤¤à¤¾à¤®à¥',
- 'wikieditor-toolbar-dialogs-preference' => 'अनà¥à¤¬à¤¨à¥à¤§à¤•à¥‹à¤·à¥à¤Ÿà¤•à¤¾à¤¦à¥€à¤¨à¤¾à¤‚ समायोजनाय समà¥à¤­à¤¾à¤·à¤£à¤‚ सकà¥à¤°à¤¿à¤¯à¤‚ करोतà¥',
+ 'wikieditor-toolbar-dialogs-preference' => 'अनà¥à¤¬à¤¨à¥à¤§à¤•à¥‹à¤·à¥à¤Ÿà¤•à¤¾à¤¦à¥€à¤¨à¤¾à¤‚ समायोजनाय समà¥à¤­à¤¾à¤·à¤£à¤‚ सकà¥à¤°à¤¿à¤¯à¤‚ करोतà¥', # Fuzzy
'wikieditor-toolbar-hidesig' => 'मà¥à¤–à¥à¤¯à¤¨à¤¾à¤®à¤¾à¤µà¤•à¤¾à¤¶à¤ªà¥ƒà¤·à¥à¤ à¥‡à¤·à¥ हसà¥à¤¤à¤¾à¤•à¥à¤·à¤°à¤•à¥à¤¡à¥à¤®à¤²à¤‚ विलोपयतà¥',
'wikieditor-toolbar-loading' => 'आरोपà¥à¤¯à¤®à¤¾à¤£à¤®à¤¸à¥à¤¤à¤¿.....',
'wikieditor-toolbar-tool-bold' => 'सà¥à¤¥à¥‚लकà¥à¤·à¤°à¤®à¥',
@@ -24092,11 +24663,11 @@ $messages['sah'] = array(
'wikieditor-wikitext-tab' => 'Биики тиÑкиÑ',
'wikieditor-loading' => 'Хачайдааһын',
'wikieditor-preview-preference' => 'Инники көрүүнү ÑÑргÑÑÑ‚ÑһиннÑÑ€Ñ ÐºÓ©Ñ€Ð´Ó©Ñ€',
- 'wikieditor-preview-tab' => 'Инники көрүү',
+ 'wikieditor-preview-tab' => 'Холоон көрүү',
'wikieditor-preview-changes-tab' => 'Уларыйыылар',
'wikieditor-preview-loading' => 'Хачайдана турар...',
'wikieditor-previewDialog-preference' => 'Ð­Ñ€Ð´Ñ ÐºÓ©Ñ€Ò¯Ò¯ диалогын холбуурга',
- 'wikieditor-previewDialog-tab' => 'Инники көрүү',
+ 'wikieditor-previewDialog-tab' => 'Холоон көрүү',
'wikieditor-previewDialog-loading' => 'Хачайдана турар...',
'wikieditor-publish-preference' => 'Биирдии хаамыынан бÑчÑÑÐºÐºÑ Ñ‚Ð°Ò»Ð°Ð°Ñ€Ñ‹Ñ‹Ð½Ñ‹ холбоо',
'wikieditor-publish-button-publish' => 'БÑчÑÑÐºÐºÑ Ñ‚Ð°Ò»Ð°Ð°Ñ€Ð°Ñ€Ð³Ð°',
@@ -24118,7 +24689,7 @@ $messages['sah'] = array(
'wikieditor-toolbar' => 'Көннөрүү хаптаһына (панель)',
'wikieditor-toolbar-desc' => 'ТупÑарыллыбыт уларытыы хаптаһына',
'wikieditor-toolbar-preference' => 'ТупÑарыллыбыт уларытыы хаптаһынын холбуурга',
- 'wikieditor-toolbar-dialogs-preference' => 'СигÑлÑри, таабыллары уонна атын объектары киллÑÑ€ÑÑ€ Ñамалыктары холбуурга',
+ 'wikieditor-toolbar-dialogs-preference' => 'СигÑлÑри, таабыллары уонна атын объектары киллÑÑ€ÑÑ€ Ñамалыктары холбуурга', # Fuzzy
'wikieditor-toolbar-loading' => 'КиллÑрии...',
'wikieditor-toolbar-tool-bold' => 'Модьу',
'wikieditor-toolbar-tool-bold-example' => 'Модьу бичик',
@@ -24331,7 +24902,7 @@ $messages['sc'] = array(
'wikieditor-toolbar' => "Barra de is ainas pro s'acontzu",
'wikieditor-toolbar-desc' => "Barra de is ainas pro s'acontzu megiorada",
'wikieditor-toolbar-preference' => 'Abilita sa barra de is ainas megiorada',
- 'wikieditor-toolbar-dialogs-preference' => 'Abilita is bentanas pro insertare ligàmines, tabellas e àteru',
+ 'wikieditor-toolbar-dialogs-preference' => 'Abilita is bentanas pro insertare ligàmines, tabellas e àteru', # Fuzzy
'wikieditor-toolbar-loading' => 'Carrigamentu...',
'wikieditor-toolbar-tool-bold' => 'Grassu',
'wikieditor-toolbar-tool-bold-example' => 'Testu grassu',
@@ -24554,7 +25125,7 @@ $messages['scn'] = array(
'wikieditor-toolbar' => 'Barra dî strummenta di canci',
'wikieditor-toolbar-desc' => 'Barra dî strummenta di canci dâ pàggina cu na megghiu usabbilità',
'wikieditor-toolbar-preference' => 'Abbilita la barra avanzata dî strummenta di canci',
- 'wikieditor-toolbar-dialogs-preference' => 'Abbilita li finestri di dialugu pi nsirìri liami, tabbelli e àutri cosi',
+ 'wikieditor-toolbar-dialogs-preference' => 'Abbilita li finestri di dialugu pi nsirìri liami, tabbelli e àutri cosi', # Fuzzy
'wikieditor-toolbar-loading' => 'Caricamentu in corsu...',
'wikieditor-toolbar-tool-bold' => 'Grassettu',
'wikieditor-toolbar-tool-bold-example' => 'Testu in grassettu',
@@ -24812,7 +25383,7 @@ $messages['si'] = array(
'wikieditor-toolbar' => 'සංස්කරණ මෙවලම් තීරුව',
'wikieditor-toolbar-desc' => 'වර්ධිත පරිà·à·“ලන à·„à·à¶šà·’යà·à·€ සහිත සංස්කරණ පිටු මෙවලම් තීරුව',
'wikieditor-toolbar-preference' => 'වර්ධිත මෙවලම් තීරුව සක්â€à¶»à·“ය කරන්න',
- 'wikieditor-toolbar-dialogs-preference' => 'දියුණු කළ විකි පෙළක් ඇතුල් කිරීම à·ƒâ€à¶³à·„෠උදව් සක්â€à¶»à·“ය කරන්න',
+ 'wikieditor-toolbar-dialogs-preference' => 'දියුණු කළ විකි පෙළක් ඇතුල් කිරීම à·ƒâ€à¶³à·„෠උදව් සක්â€à¶»à·“ය කරන්න', # Fuzzy
'wikieditor-toolbar-hidesig' => 'ප්â€à¶»à¶°à·à¶± නà·à¶¸à¶…වකà·à·à¶ºà·š තිබෙන පිටුවල අත්සන් බොත්තම සඟවන්න',
'wikieditor-toolbar-loading' => 'ප්â€à¶»à·€à·šà·à¶±à¶º වෙමින් පවතී...',
'wikieditor-toolbar-tool-bold' => 'තද පà·à·„෠අකුරු',
@@ -25062,7 +25633,7 @@ $messages['sk'] = array(
'wikieditor-toolbar' => 'Panel nástrojov na úpravy',
'wikieditor-toolbar-desc' => 'Panel nástrojov na úpravy stránky s rozšírenou použiteľnosťou',
'wikieditor-toolbar-preference' => 'Zapnúť rozšírený panel nástrojov na úpravy',
- 'wikieditor-toolbar-dialogs-preference' => 'PovoliÅ¥ dialógy na vkladanie odkazov, tabuliek atÄ.',
+ 'wikieditor-toolbar-dialogs-preference' => 'PovoliÅ¥ dialógy na vkladanie odkazov, tabuliek atÄ.', # Fuzzy
'wikieditor-toolbar-hidesig' => 'SkryÅ¥ tlaÄidlo podpis zo stránok v hlavnom mennom priestore',
'wikieditor-toolbar-loading' => 'NaÄítava sa...',
'wikieditor-toolbar-tool-bold' => 'Hrubý',
@@ -25261,6 +25832,7 @@ $1:Príklad.jpg|Popis2',
/** Slovenian (slovenÅ¡Äina)
* @author Dbc334
+ * @author Eleassar
* @author Yerpo
*/
$messages['sl'] = array(
@@ -25295,7 +25867,7 @@ $messages['sl'] = array(
'wikieditor-toolbar' => 'Urejevalna orodna vrstica',
'wikieditor-toolbar-desc' => 'Urejevalna orodna vrstica z veÄjo uporabnostjo',
'wikieditor-toolbar-preference' => 'OmogoÄi izboljÅ¡ano urejevalno vrstico',
- 'wikieditor-toolbar-dialogs-preference' => 'OmogoÄi pogovorna okna za vstavljanje povezav, tabel itn.',
+ 'wikieditor-toolbar-dialogs-preference' => 'OmogoÄi Äarovnike za vstavljanje povezav in tabel, kakor tudi funkcijo iÅ¡Äi in zamenjaj',
'wikieditor-toolbar-hidesig' => 'Skrij gumb za podpis s strani v glavnem imenskem prostoru',
'wikieditor-toolbar-loading' => 'Nalaganje ...',
'wikieditor-toolbar-tool-bold' => 'Krepko',
@@ -25323,6 +25895,7 @@ $messages['sl'] = array(
'wikieditor-toolbar-tool-link-int-target-status-invalid' => 'Neveljaven naslov',
'wikieditor-toolbar-tool-link-int-target-status-external' => 'Zunanja povezava',
'wikieditor-toolbar-tool-link-int-target-status-loading' => 'Preverjanje obstoja strani ...',
+ 'wikieditor-toolbar-tool-link-int-target-status-disambig' => 'RazloÄitvena stran',
'wikieditor-toolbar-tool-link-int-invalid' => 'Navedeni naslov ni veljaven.',
'wikieditor-toolbar-tool-link-lookslikeinternal' => 'Navedeni URL izgleda kot povezava na drugo wikistran. Ali jo želite narediti notranjo povezavo?',
'wikieditor-toolbar-tool-link-lookslikeinternal-int' => 'Notranja povezava',
@@ -25543,7 +26116,7 @@ $messages['sq'] = array(
'wikieditor-toolbar' => 'Redaktoni trat me vegla',
'wikieditor-toolbar-desc' => 'Redaktoni shiritin e veglave të faqes me përdorshmëri të zgjeruar',
'wikieditor-toolbar-preference' => 'Aktizoni redaktimin e zgjeruar të shiritit të mjeteve',
- 'wikieditor-toolbar-dialogs-preference' => 'Aktivizoni dialogun për të futur lidhjet, tabelët etj.',
+ 'wikieditor-toolbar-dialogs-preference' => 'Aktivizoni dialogun për të futur lidhjet, tabelët etj.', # Fuzzy
'wikieditor-toolbar-loading' => 'Duke punuar...',
'wikieditor-toolbar-tool-bold' => 'Trashë',
'wikieditor-toolbar-tool-bold-example' => 'Tekst i trashë',
@@ -25779,7 +26352,7 @@ $messages['sr-ec'] = array(
'wikieditor-toolbar' => 'Ðлатна трака за уређивање',
'wikieditor-toolbar-desc' => 'Ðлатна трака за уређивање Ñ Ð¿Ð¾Ð±Ð¾Ñ™ÑˆÐ°Ð½Ð¾Ð¼ употребљивошћу',
'wikieditor-toolbar-preference' => 'Омогући побољшану траку за уређивање',
- 'wikieditor-toolbar-dialogs-preference' => 'Омогући прозорчад за убацивање веза, табела и више',
+ 'wikieditor-toolbar-dialogs-preference' => 'Омогући прозорчад за убацивање веза, табела и више', # Fuzzy
'wikieditor-toolbar-hidesig' => 'Сакриј дугме за Ð¿Ð¾Ñ‚Ð¿Ð¸Ñ Ð½Ð° Ñтраницама у главном именÑком проÑтору',
'wikieditor-toolbar-loading' => 'Учитавам…',
'wikieditor-toolbar-tool-bold' => 'Подебљано',
@@ -26026,7 +26599,7 @@ $messages['sr-el'] = array(
'wikieditor-toolbar' => 'Alatna traka za uređivanje',
'wikieditor-toolbar-desc' => 'Alatna traka za uređivanje s poboljšanom upotrebljivošću',
'wikieditor-toolbar-preference' => 'Omogući poboljšanu traku za uređivanje',
- 'wikieditor-toolbar-dialogs-preference' => 'Omogući prozorÄad za ubacivanje veza, tabela i viÅ¡e',
+ 'wikieditor-toolbar-dialogs-preference' => 'Omogući prozorÄad za ubacivanje veza, tabela i viÅ¡e', # Fuzzy
'wikieditor-toolbar-hidesig' => 'Sakrij dugme za potpis na stranicama u glavnom imenskom prostoru',
'wikieditor-toolbar-loading' => 'UÄitavanje...',
'wikieditor-toolbar-tool-bold' => 'Podebljan',
@@ -26472,7 +27045,7 @@ $messages['sv'] = array(
'wikieditor-previewDialog-preference' => 'Aktivera förhandsgranska',
'wikieditor-previewDialog-tab' => 'Förhandsgranska',
'wikieditor-previewDialog-loading' => 'Laddar...',
- 'wikieditor-publish-preference' => 'Aktivera steg-efter-steg-publicering',
+ 'wikieditor-publish-preference' => 'Aktivera steg-för-steg-publicering',
'wikieditor-publish-button-publish' => 'Publicera',
'wikieditor-publish-button-cancel' => 'Avbryt',
'wikieditor-publish-dialog-title' => 'Publicera i {{SITENAME}}',
@@ -26492,7 +27065,7 @@ $messages['sv'] = array(
'wikieditor-toolbar' => 'Redigeringsverktygsrad',
'wikieditor-toolbar-desc' => 'Redigeringsverktygsrad med utökad användbarhet',
'wikieditor-toolbar-preference' => 'Aktivera utökad redigeringsverktygsrad',
- 'wikieditor-toolbar-dialogs-preference' => 'Aktivera dialoger för inläggning av länkar, tabeller och annat',
+ 'wikieditor-toolbar-dialogs-preference' => 'Aktivera guider för att lägga in länkar, tabeller såväl som sök- och ersättningsfunktionen',
'wikieditor-toolbar-hidesig' => 'Dölj knappen signatur på sidor i huvudnamnrymden',
'wikieditor-toolbar-loading' => 'Laddar...',
'wikieditor-toolbar-tool-bold' => 'Fet',
@@ -26520,6 +27093,7 @@ $messages['sv'] = array(
'wikieditor-toolbar-tool-link-int-target-status-invalid' => 'Ogiltig titel',
'wikieditor-toolbar-tool-link-int-target-status-external' => 'Extern länk',
'wikieditor-toolbar-tool-link-int-target-status-loading' => 'Kontrollerar om sidan existerar...',
+ 'wikieditor-toolbar-tool-link-int-target-status-disambig' => 'Förgreningssida',
'wikieditor-toolbar-tool-link-int-invalid' => 'Titeln du angav är ogiltig.',
'wikieditor-toolbar-tool-link-lookslikeinternal' => 'URL:et du specificerade ser ut att vara avsett som en länk till en annan wikisida. Vill du göra det till en intern länk?',
'wikieditor-toolbar-tool-link-lookslikeinternal-int' => 'Intern länk',
@@ -26601,7 +27175,7 @@ $1:Exempel.jpg|Bildtext2',
'wikieditor-toolbar-tool-table-preview' => 'Förhandsgranska',
'wikieditor-toolbar-tool-table-insert' => 'Sätt in',
'wikieditor-toolbar-tool-table-cancel' => 'Avbryt',
- 'wikieditor-toolbar-tool-table-toomany' => 'Att sätta in en tabell med fler än $1 celler är inte möjligt med denna dialog.', # Fuzzy
+ 'wikieditor-toolbar-tool-table-toomany' => 'Att sätta in en tabell med fler än 1000 celler är inte möjligt med denna dialog.',
'wikieditor-toolbar-tool-table-invalidnumber' => 'Du har inte angett ett giltigt antal rader eller kolumner.',
'wikieditor-toolbar-tool-table-zero' => 'Du kan inte sätta in en tabell med noll rader eller kolumner.',
'wikieditor-toolbar-tool-replace' => 'Sök och ersätt',
@@ -26740,7 +27314,7 @@ $messages['sw'] = array(
'wikieditor-toolbar' => 'Mwambaa zana wa kuhariri',
'wikieditor-toolbar-desc' => 'Mwambaa zana wa kuhariri uliozidishwa',
'wikieditor-toolbar-preference' => 'Tumia mwambaa zana wa kuhariri uliozidishwa',
- 'wikieditor-toolbar-dialogs-preference' => 'Kuwezesha visanduku vya zana za kuingiza viungo, jedwali na mengineyo',
+ 'wikieditor-toolbar-dialogs-preference' => 'Kuwezesha visanduku vya zana za kuingiza viungo, jedwali na mengineyo', # Fuzzy
'wikieditor-toolbar-loading' => 'Inapakizwa...',
'wikieditor-toolbar-tool-bold' => 'Koze',
'wikieditor-toolbar-tool-bold-example' => 'Maandishi ya kooze',
@@ -26772,15 +27346,15 @@ $messages['sw'] = array(
'wikieditor-toolbar-tool-link-lookslikeinternal-int' => 'Kiungo cha ndani',
'wikieditor-toolbar-tool-link-lookslikeinternal-ext' => 'Kiungo cha nje',
'wikieditor-toolbar-tool-link-empty' => 'Hukuandika kitu cha kuunganisha naye.',
- 'wikieditor-toolbar-tool-file' => 'Faili futike',
+ 'wikieditor-toolbar-tool-file' => 'Ingiza faili',
'wikieditor-toolbar-tool-file-example' => 'Mfano.jpg',
'wikieditor-toolbar-tool-file-title' => 'Ingiza faili',
'wikieditor-toolbar-file-target' => 'Jina la faili:',
'wikieditor-toolbar-file-size' => 'Ukubwa:',
'wikieditor-toolbar-tool-file-insert' => 'Ingiza',
'wikieditor-toolbar-tool-file-cancel' => 'Ghairi',
- 'wikieditor-toolbar-tool-reference' => 'Tiniwayo',
- 'wikieditor-toolbar-tool-reference-example' => 'Weka maneno ya tiniwayo hapa',
+ 'wikieditor-toolbar-tool-reference' => 'Marejeo',
+ 'wikieditor-toolbar-tool-reference-example' => 'Weka maneno ya marejeo hapa',
'wikieditor-toolbar-tool-reference-cancel' => 'Batilisha',
'wikieditor-toolbar-tool-reference-title' => 'Ingiza marejeo',
'wikieditor-toolbar-tool-reference-insert' => 'Ingiza',
@@ -26888,7 +27462,7 @@ Idadi ya mistari au ya safu si halali.',
'wikieditor-toolbar-help-page-heading' => 'Vichwa',
'wikieditor-toolbar-help-page-list' => 'Orodha',
'wikieditor-toolbar-help-page-file' => 'Mafaili',
- 'wikieditor-toolbar-help-page-reference' => 'Tiniwayo',
+ 'wikieditor-toolbar-help-page-reference' => 'Marejeo',
'wikieditor-toolbar-help-page-discussion' => 'Majadiliano',
'wikieditor-toolbar-help-content-italic-description' => 'Italiki',
'wikieditor-toolbar-help-content-italic-syntax' => "''Maandishi ya italiki''",
@@ -26923,15 +27497,15 @@ Idadi ya mistari au ya safu si halali.',
'wikieditor-toolbar-help-content-olist-description' => 'Orodha zenye namba',
'wikieditor-toolbar-help-content-olist-syntax' => '# Aya<br /># Aya',
'wikieditor-toolbar-help-content-olist-result' => '<ol><li>Aya</li><li>Aya</li></ol>',
- 'wikieditor-toolbar-help-content-file-description' => 'Faili futike',
+ 'wikieditor-toolbar-help-content-file-description' => 'Ingiza faili',
'wikieditor-toolbar-help-content-file-syntax' => '[[$1:Example.png|thumb|Maelezo mafupi]]',
'wikieditor-toolbar-help-content-file-result' => "<div style='width:104px;' class='thumbinner'><a title='Maelezo mafupi' class='image' href='#'><img height='50' width='100' border='0' class='thumbimage' src='$2/WikiEditor/modules/images/toolbar/example-image.png' alt=''/></a><div class='thumbcaption'><div class='magnify'><a title='Kuza' class='internal' href='#'><img height='11' width='15' alt='' src='$1/common/images/magnify-clip.png'/></a></div>Maelezo mafupi</div></div>",
- 'wikieditor-toolbar-help-content-reference-description' => 'Tiniwayo',
+ 'wikieditor-toolbar-help-content-reference-description' => 'Marejeo',
'wikieditor-toolbar-help-content-reference-syntax' => 'Maandishi ya ukurasa.&lt;ref name="mfano"&gt;[http://www.example.org Maandishi ya kiungo], maandishi mengine.&lt;/ref&gt;',
'wikieditor-toolbar-help-content-reference-result' => "Maandiko.<sup><a href='#'>[1]</a></sup>",
- 'wikieditor-toolbar-help-content-rereference-description' => 'Kutumia tiniwayo fulani kwa mara nyingine',
+ 'wikieditor-toolbar-help-content-rereference-description' => 'Kutumia marejeo fulani kwa mara nyingine',
'wikieditor-toolbar-help-content-rereference-result' => "Maandiko.<sup><a href='#'>[1]</a></sup>",
- 'wikieditor-toolbar-help-content-showreferences-description' => 'Onyesha tiniwayo',
+ 'wikieditor-toolbar-help-content-showreferences-description' => 'Onyesha marejeo',
'wikieditor-toolbar-help-content-showreferences-result' => "<ol class='references'><li id='cite_note-test-0'><b><a title='' href='#'>^</a></b> <a rel='nofollow' title='http://www.example.org' class='external text' href='#'>Maandishi ya kiungo</a>, maandishi mengine.</li></ol>",
'wikieditor-toolbar-help-content-signaturetimestamp-description' => 'Sahihi pamoja na stempu ya saa',
'wikieditor-toolbar-help-content-signaturetimestamp-result' => "<a href='#' title='{{#special:mypage}}'>Jina la mtumiaji</a> (<a href='#' title='{{#special:mytalk}}'>majadiliano</a>) 15:54, 10 June 2009 (UTC)",
@@ -27230,7 +27804,7 @@ $messages['te'] = array(
'wikieditor-toc-hide' => 'విషయసూచికని దాచà±',
'wikieditor-toolbar' => 'ఎడిటింగౠటూలà±â€Œà°¬à°¾à°°à±',
'wikieditor-toolbar-desc' => 'మెరà±à°—ైన ఉపయోగశీలతో దిదà±à°¦à±à°¬à°¾à°Ÿà± పేజీ పనిమà±à°Ÿà±à°²à°ªà°Ÿà±à°Ÿà±€',
- 'wikieditor-toolbar-dialogs-preference' => 'లంకెలà±, పటà±à°Ÿà°¿à°•à°²à± మరియౠమరెనà±à°¨à°¿à°‚టినే చేరà±à°šà°¡à°¾à°¨à°¿à°•à°¿ సంవాదపేటికలనౠచేతనంచేయి',
+ 'wikieditor-toolbar-dialogs-preference' => 'లంకెలà±, పటà±à°Ÿà°¿à°•à°²à± మరియౠమరెనà±à°¨à°¿à°‚టినే చేరà±à°šà°¡à°¾à°¨à°¿à°•à°¿ సంవాదపేటికలనౠచేతనంచేయి', # Fuzzy
'wikieditor-toolbar-loading' => 'లోడవà±à°¤à±‹à°‚ది...',
'wikieditor-toolbar-tool-bold' => 'బొదà±à°¦à±',
'wikieditor-toolbar-tool-bold-example' => 'బొదà±à°¦à± పాఠà±à°¯à°‚',
@@ -27455,7 +28029,7 @@ $messages['th'] = array(
'wikieditor-toolbar' => 'à¹à¸–บเครื่องมือสำหรับà¸à¸²à¸£à¹à¸à¹‰à¹„ข',
'wikieditor-toolbar-desc' => 'à¹à¸–บเครื่องมือเสริมความสามารถà¸à¸²à¸£à¹ƒà¸Šà¹‰à¸‡à¸²à¸™à¹ƒà¸™à¸à¸²à¸£à¹à¸à¹‰à¹„ขหน้า',
'wikieditor-toolbar-preference' => 'เปิดใช้à¹à¸–บเครื่องมือเสริมความสามารถà¸à¸²à¸£à¹à¸à¹‰à¹„ข',
- 'wikieditor-toolbar-dialogs-preference' => 'เปิดà¸à¸¥à¹ˆà¸­à¸‡à¹‚ต้ตอบสำหรับà¸à¸²à¸£à¹à¸—รà¸à¸¥à¸´à¸‡à¸à¹Œ ตาราง à¹à¸¥à¸°à¸­à¸·à¹ˆà¸™à¹†',
+ 'wikieditor-toolbar-dialogs-preference' => 'เปิดà¸à¸¥à¹ˆà¸­à¸‡à¹‚ต้ตอบสำหรับà¸à¸²à¸£à¹à¸—รà¸à¸¥à¸´à¸‡à¸à¹Œ ตาราง à¹à¸¥à¸°à¸­à¸·à¹ˆà¸™à¹†', # Fuzzy
'wikieditor-toolbar-loading' => 'à¸à¸³à¸¥à¸±à¸‡à¸”ึงข้อมูล...',
'wikieditor-toolbar-tool-bold' => 'ตัวหนา',
'wikieditor-toolbar-tool-bold-example' => 'ข้อความตัวหนา',
@@ -27679,7 +28253,7 @@ $messages['tk'] = array(
'wikieditor-toolbar' => 'Redaktirleme gural paneli',
'wikieditor-toolbar-desc' => 'Güýçlendirilen oňaýlylyk bilen sahypa gural panelini redaktirle',
'wikieditor-toolbar-preference' => 'Güýçlendirilen redaktirleme gural panelini aç',
- 'wikieditor-toolbar-dialogs-preference' => 'Çykgytlary, tablisalary we ýenekileri girizmek üçin dialoglary aç',
+ 'wikieditor-toolbar-dialogs-preference' => 'Çykgytlary, tablisalary we ýenekileri girizmek üçin dialoglary aç', # Fuzzy
'wikieditor-toolbar-loading' => 'Yüklenýär...',
'wikieditor-toolbar-tool-bold' => 'Goýy',
'wikieditor-toolbar-tool-bold-example' => 'Goýy tekst',
@@ -27909,7 +28483,7 @@ $messages['tl'] = array(
'wikieditor-toolbar' => 'Kahong kasangkapan na pamatnugot',
'wikieditor-toolbar-desc' => 'Kahong kasangkapan na pamatnugot na may pinainam na pagkanagagamit',
'wikieditor-toolbar-preference' => 'Paganahin ang pinainam na kahong kasangkapang pamatnugot',
- 'wikieditor-toolbar-dialogs-preference' => 'Paganahin ang mga salitaan para sa pagsisingit ng mga kawing, mga tabla at marami pa',
+ 'wikieditor-toolbar-dialogs-preference' => 'Paganahin ang mga salitaan para sa pagsisingit ng mga kawing, mga tabla at marami pa', # Fuzzy
'wikieditor-toolbar-hidesig' => 'Itago ang pindutan ng lagda magmula sa mga pahina sa loob ng pangunahing puwang ng pangalan',
'wikieditor-toolbar-loading' => 'Ikinakarga...',
'wikieditor-toolbar-tool-bold' => 'Makapal',
@@ -28140,6 +28714,7 @@ $messages['tpi'] = array(
* @author Joseph
* @author Koc61
* @author Manco Capac
+ * @author Rapsar
* @author Sadrettin
* @author Srhat
* @author Vito Genovese
@@ -28176,7 +28751,7 @@ $messages['tr'] = array(
'wikieditor-toolbar' => 'Araç çubuğu düzenleme',
'wikieditor-toolbar-desc' => 'Gelişmiş kullanılabilirlik ile sayfa araç çubuğunu düzenle',
'wikieditor-toolbar-preference' => 'Gelişmiş düzenleme araç çubuğunu etkinleştir',
- 'wikieditor-toolbar-dialogs-preference' => 'Bağlantılar, tablolar ve daha fazlasını eklemek için iletileri etkinleştir',
+ 'wikieditor-toolbar-dialogs-preference' => 'Bağlantılar, tablolar ve daha fazlasını eklemek için iletileri etkinleştir', # Fuzzy
'wikieditor-toolbar-hidesig' => 'Ana ad boşluğundaki sayfalardan imza düğmesini gizle',
'wikieditor-toolbar-loading' => 'Yükleniyor...',
'wikieditor-toolbar-tool-bold' => 'Kalın',
@@ -28204,6 +28779,7 @@ $messages['tr'] = array(
'wikieditor-toolbar-tool-link-int-target-status-invalid' => 'Geçersiz başlık',
'wikieditor-toolbar-tool-link-int-target-status-external' => 'Dış bağlantı',
'wikieditor-toolbar-tool-link-int-target-status-loading' => 'Sayfanın mevcudiyeti denetleniyor...',
+ 'wikieditor-toolbar-tool-link-int-target-status-disambig' => 'Anlam ayrımı sayfası',
'wikieditor-toolbar-tool-link-int-invalid' => 'Belirttiğiniz başlık geçersiz.',
'wikieditor-toolbar-tool-link-lookslikeinternal' => 'Belirttiğiniz URL, başka bir viki sayfasına bir bağlantı yapılmak istenmiş gibi görünüyor. Bunu dahili bir bağlantı yapmak ister misiniz?',
'wikieditor-toolbar-tool-link-lookslikeinternal-int' => 'Dahili bağlantı',
@@ -28413,7 +28989,7 @@ $messages['tt-cyrl'] = array(
'wikieditor-toolbar' => 'Төзәтү панеле',
'wikieditor-toolbar-desc' => 'Яңартылган үзгәртү панеле',
'wikieditor-toolbar-preference' => 'Яңа үзгәртү панелен куллана башлау',
- 'wikieditor-toolbar-dialogs-preference' => 'Сылтамалар, табыннар һәм башка җиÑемнәрне кую',
+ 'wikieditor-toolbar-dialogs-preference' => 'Сылтамалар, табыннар һәм башка җиÑемнәрне кую', # Fuzzy
'wikieditor-toolbar-loading' => 'Йөкләү...',
'wikieditor-toolbar-tool-bold' => 'Куе Ñ‚Ó©Ñ',
'wikieditor-toolbar-tool-bold-example' => 'Калын Ñзылыш',
@@ -28755,6 +29331,7 @@ $messages['ug-arab'] = array(
/** Ukrainian (українÑька)
* @author AS
* @author Ahonc
+ * @author Andriykopanytsia
* @author AtUkr
* @author Base
* @author Dim Grits
@@ -28796,7 +29373,7 @@ $messages['uk'] = array(
'wikieditor-toolbar' => 'Панель заÑобів редагуваннÑ',
'wikieditor-toolbar-desc' => 'Панель заÑобів Ñ€ÐµÐ´Ð°Ð³ÑƒÐ²Ð°Ð½Ð½Ñ Ð· покращеною ужитковіÑÑ‚ÑŽ',
'wikieditor-toolbar-preference' => 'Увімкнути покращену панель заÑобів редагуваннÑ',
- 'wikieditor-toolbar-dialogs-preference' => 'Увімкнути діалоги Ð´Ð»Ñ Ð¿Ð¾ÑˆÑƒÐºÑƒ Ñ– заміни, Ð´Ð¾Ð´Ð°Ð²Ð°Ð½Ð½Ñ Ð¿Ð¾Ñилань, таблиць та іншого',
+ 'wikieditor-toolbar-dialogs-preference' => 'Увімкнути майÑтри Ð´Ð»Ñ Ð´Ð¾Ð´Ð°Ð²Ð°Ð½Ð½Ñ Ð¿Ð¾Ñилань, таблиць, а також функції пошуку Ñ– заміни',
'wikieditor-toolbar-hidesig' => 'Приховати кнопку підпиÑу зі Ñторінок в оÑновному проÑторі назв',
'wikieditor-toolbar-loading' => 'ЗавантаженнÑ…',
'wikieditor-toolbar-tool-bold' => 'Жирний',
@@ -28824,6 +29401,7 @@ $messages['uk'] = array(
'wikieditor-toolbar-tool-link-int-target-status-invalid' => 'ÐеприпуÑтима назва',
'wikieditor-toolbar-tool-link-int-target-status-external' => 'Зовнішнє поÑиланнÑ',
'wikieditor-toolbar-tool-link-int-target-status-loading' => 'Перевірка наÑвноÑÑ‚Ñ– Ñторінки...',
+ 'wikieditor-toolbar-tool-link-int-target-status-disambig' => 'Сторінка неоднозначноÑÑ‚Ñ–',
'wikieditor-toolbar-tool-link-int-invalid' => 'Зазначена назва неприпуÑтима.',
'wikieditor-toolbar-tool-link-lookslikeinternal' => 'Зазначений вами URL виглÑдає Ñк поÑÐ¸Ð»Ð°Ð½Ð½Ñ Ð½Ð° іншу вікі-Ñторінку. Ви хочете зробити його внутрішнім поÑиланнÑм?',
'wikieditor-toolbar-tool-link-lookslikeinternal-int' => 'Внутрішнє поÑиланнÑ',
@@ -29013,6 +29591,7 @@ $1:Example.jpg|ОпиÑ2',
/** Urdu (اردو)
* @author BMRG14
+ * @author Ebraminio
* @author محبوب عالم
* @author පසිඳු කà·à·€à·’න්ද
*/
@@ -29046,7 +29625,7 @@ $messages['ur'] = array(
'wikieditor-toc-hide' => 'مشتملات چھپاؤ',
'wikieditor-toolbar' => 'تدوینی اوزارتختÛ',
'wikieditor-toolbar-preference' => 'اÙØ²ÙˆØ¯Û ØªØ¯ÙˆÛŒÙ†ÛŒ Ø§ÙˆØ²Ø§Ø±ØªØ®ØªÛ Ùعال کرو',
- 'wikieditor-toolbar-dialogs-preference' => 'رابطو اور جدولوں ÙˆØºÛŒØ±Û Ú©Û’ ادخال کیلئے Ù…Ú©Ø§Ù„Ù…Û Ø¬Ø§Øª Ùعال کرو',
+ 'wikieditor-toolbar-dialogs-preference' => 'رابطو اور جدولوں ÙˆØºÛŒØ±Û Ú©Û’ ادخال کیلئے Ù…Ú©Ø§Ù„Ù…Û Ø¬Ø§Øª Ùعال کرو', # Fuzzy
'wikieditor-toolbar-loading' => 'لَدرÛا ÛÛ’Û”Û”',
'wikieditor-toolbar-tool-bold' => 'جلی',
'wikieditor-toolbar-tool-bold-example' => 'دبیز متن',
@@ -29175,7 +29754,7 @@ $1:مثال.jpg|تعقیب2',
'wikieditor-toolbar-characters-page-greek' => 'یونانی',
'wikieditor-toolbar-characters-page-arabic' => 'عربی',
'wikieditor-toolbar-characters-page-arabicextended' => 'عربی توسیع شدÛ',
- 'wikieditor-toolbar-characters-page-persian' => 'پارسی',
+ 'wikieditor-toolbar-characters-page-persian' => 'Ùارسی',
'wikieditor-toolbar-characters-page-hebrew' => 'عبرانی',
'wikieditor-toolbar-characters-page-bangla' => 'بنگالی',
'wikieditor-toolbar-characters-page-tamil' => 'تامل',
@@ -29269,7 +29848,7 @@ $messages['uz'] = array(
'wikieditor-toolbar' => 'Tahrirlash darchasi',
'wikieditor-toolbar-desc' => 'Foydalanishga qulayroq boʻlgan tahrirlash darchasi',
'wikieditor-toolbar-preference' => 'Yaxshilangan tahrirlash darchasini yoqish',
- 'wikieditor-toolbar-dialogs-preference' => 'Havolalar, jadvallar va boshqa obyektlarni qoʻyish uchun dialoglarni yoqish',
+ 'wikieditor-toolbar-dialogs-preference' => 'Havolalar, jadvallar va boshqa obyektlarni qoʻyish uchun dialoglarni yoqish', # Fuzzy
'wikieditor-toolbar-hidesig' => 'Asosiy nomfazodagi sahifalarda imzo tugmasini yashirish',
'wikieditor-toolbar-loading' => 'Yuklash...',
'wikieditor-toolbar-tool-bold' => 'Qalin',
@@ -29380,7 +29959,7 @@ $1:Example.jpg|Izoh2',
'wikieditor-toolbar-tool-table-cancel' => 'Bekor',
'wikieditor-toolbar-tool-table-toomany' => 'Ushbu dialog 1000 ta katakdan katta hajmdagi jadvalni qoʻyish imkonini bermaydi.',
'wikieditor-toolbar-tool-table-invalidnumber' => 'Toʻgʻri qator yoki ustun miqdorini koʻrsatmadingiz.',
- 'wikieditor-toolbar-tool-table-zero' => 'Siz nol miqdordagi qatorli yoki ustunli jadval qoʻya olmaysiz.',
+ 'wikieditor-toolbar-tool-table-zero' => 'Qatorlarsiz yoki ustunlarsiz jadval qoʻyib boʻlmaydi.',
'wikieditor-toolbar-tool-replace' => 'Qidirish va almashtirish',
'wikieditor-toolbar-tool-replace-title' => 'Qidirish va almashtirish',
'wikieditor-toolbar-tool-replace-search' => 'Qidirish:',
@@ -29519,7 +30098,7 @@ $messages['vec'] = array(
'wikieditor-toolbar' => 'Bara dei strumenti de modifica',
'wikieditor-toolbar-desc' => 'Modifica bara dei strumenti de la pàgina co na magiore uxabilità',
'wikieditor-toolbar-preference' => 'Abilita bara dei strumenti de modifica avansada',
- 'wikieditor-toolbar-dialogs-preference' => 'Intacar i ajuti par xontar colegamenti, tabèle e altro',
+ 'wikieditor-toolbar-dialogs-preference' => 'Intacar le finestre par xontar colegamenti, tabèle e la funsion de serca e sostituissi',
'wikieditor-toolbar-hidesig' => "Sconde el boton de ła firma da łe pàjine inte'l namespace prinsipałe",
'wikieditor-toolbar-loading' => "So' drio cargar...",
'wikieditor-toolbar-tool-bold' => 'Graseto',
@@ -29854,7 +30433,7 @@ $messages['vi'] = array(
'wikieditor-toolbar' => 'Thanh công cụ sửa đổi',
'wikieditor-toolbar-desc' => 'Thanh công cụ ở trang sửa đổi được cải tiến để dễ sử dụng hơn',
'wikieditor-toolbar-preference' => 'Sử dụng thanh công cụ sửa đổi nâng cao',
- 'wikieditor-toolbar-dialogs-preference' => 'Mở hộp thoại để chèn liên kết, bảng, v.v.',
+ 'wikieditor-toolbar-dialogs-preference' => 'Mở hộp thoại để chèn liên kết và bảng, cũng như hộp thoại tìm và thay',
'wikieditor-toolbar-hidesig' => 'Ẩn nút ký tên từ các trang trong không gian tên chính',
'wikieditor-toolbar-loading' => 'Äang tải…',
'wikieditor-toolbar-tool-bold' => 'Äậm',
@@ -29882,6 +30461,7 @@ $messages['vi'] = array(
'wikieditor-toolbar-tool-link-int-target-status-invalid' => 'Tá»±a sai',
'wikieditor-toolbar-tool-link-int-target-status-external' => 'Liên kết ngoài',
'wikieditor-toolbar-tool-link-int-target-status-loading' => 'Kiểm tra trang đã tồn tại chưa...',
+ 'wikieditor-toolbar-tool-link-int-target-status-disambig' => 'Trang định hướng',
'wikieditor-toolbar-tool-link-int-invalid' => 'Tên trang chỉ định không hợp lệ.',
'wikieditor-toolbar-tool-link-lookslikeinternal' => 'Hình nhÆ° bạn đã chá»n URL chỉ đến trang wiki khác. Bạn có muốn biến nó thành liên kết ná»™i bá»™ không?',
'wikieditor-toolbar-tool-link-lookslikeinternal-int' => 'Liên kết nội bộ',
@@ -30078,7 +30658,7 @@ $messages['vo'] = array(
'wikieditor-toolbar-tool-link-int-target' => 'Tiäd pada:',
'wikieditor-toolbar-tool-link-int-text' => 'Vödem yüma',
'wikieditor-toolbar-tool-link-cancel' => 'Nosükön',
- 'wikieditor-toolbar-group-format' => 'Lised', # Fuzzy
+ 'wikieditor-toolbar-group-format' => 'Fomät',
'wikieditor-toolbar-tool-big' => 'Gretik',
'wikieditor-toolbar-tool-big-example' => 'Vödem gretik',
'wikieditor-toolbar-tool-table' => 'Taib',
@@ -30100,7 +30680,7 @@ $messages['wo'] = array(
'wikieditor-toolbar' => 'Banqaasu jumtukaayu coppite',
'wikieditor-toolbar-desc' => 'Banqaasu jumtukaayu coppite bees gënal ag jëfandikoom',
'wikieditor-toolbar-preference' => 'Doxal banqaasu jumtukaayu coppite bees gënal bi',
- 'wikieditor-toolbar-dialogs-preference' => 'Doxal palanteeri duggaluwaayu lëkkalekaay, xaatim ak yeneen',
+ 'wikieditor-toolbar-dialogs-preference' => 'Doxal palanteeri duggaluwaayu lëkkalekaay, xaatim ak yeneen', # Fuzzy
'wikieditor-toolbar-loading' => 'Ci yoonu yeb...',
'wikieditor-toolbar-tool-bold' => 'Duuf',
'wikieditor-toolbar-tool-bold-example' => 'Mbind mu duuf',
@@ -30248,7 +30828,7 @@ $messages['yi'] = array(
'wikieditor-toolbar' => 'רעד×קטירונג געצייג־פ×ס',
'wikieditor-toolbar-desc' => 'רעד×ַקטירן בל×ַט געצייגפ×ַס מיט פֿ×ַרברייטערטער ניצלעכקייט',
'wikieditor-toolbar-preference' => '×ַקטיווירן פֿ×ַרברייטערטן רעד×ַקטירונג פ×ַס',
- 'wikieditor-toolbar-dialogs-preference' => 'דערמעגלעכן די×ָל××’ קעסטלעך פֿ×ַר ×ַרײַנלייגן לינקען, ט×ַבעלעס ×ון × ×ך',
+ 'wikieditor-toolbar-dialogs-preference' => 'דערמעגלעכן ×סיסט×נטן פֿ×ַר ×ַרײַנלייגן לינקען, ט×ַבעלעס ווי ×ויך די זוכן ×ון פֿ×ַרבײַטן פֿונקציע.',
'wikieditor-toolbar-hidesig' => 'ב××”×לטן ד×ס ×ונטערשריפט קנעפל פון בלעטער ×ין ×“×¢× ×”×•×™×¤×˜ × ×מענטייל',
'wikieditor-toolbar-loading' => '×ָנל×ָדן...',
'wikieditor-toolbar-tool-bold' => 'דיק',
@@ -30493,7 +31073,7 @@ $messages['yo'] = array(
'wikieditor-toolbar' => 'Àtúná¹£e sí pẹpẹ irinṣẹÌ',
'wikieditor-toolbar-desc' => 'Àtúná¹£e ojúewé pẹpẹ iriná¹£áº¹Ì pẹ̀lú ìṣeémúlò amúdára',
'wikieditor-toolbar-preference' => 'ÃŒgbàláyè pẹpẹ iriná¹£áº¹Ì Ã túná¹£e mímúdára',
- 'wikieditor-toolbar-dialogs-preference' => 'ÃŒgbàláyè àwá»n pátákó àkíyèsí fún ìkìbá»Ì€ ìjápá»Ì€, tábìlì àti bẹÌẹ̀bẹÌẹ̀ lá»',
+ 'wikieditor-toolbar-dialogs-preference' => 'ÃŒgbàláyè àwá»n pátákó àkíyèsí fún ìkìbá»Ì€ ìjápá»Ì€, tábìlì àti bẹÌẹ̀bẹÌẹ̀ lá»', # Fuzzy
'wikieditor-toolbar-loading' => 'Óúnbá»Ì€wá...',
'wikieditor-toolbar-tool-bold' => 'Kedere',
'wikieditor-toolbar-tool-bold-example' => 'ÃŒká» kedere',
@@ -30721,7 +31301,7 @@ $messages['yue'] = array(
'wikieditor-toolbar' => '編輯工具列',
'wikieditor-toolbar-desc' => '加強å¯ç”¨æ€§å˜…編輯版工具',
'wikieditor-toolbar-preference' => 'é–‹ç€åŠ å¼·ç·¨è¼¯å·¥å…·åˆ—',
- 'wikieditor-toolbar-dialogs-preference' => '啟用信æ¯æ¡†åŽ»æä¾›æ’入連çµåŒè¡¨æ ¼ç­‰å˜…幫助',
+ 'wikieditor-toolbar-dialogs-preference' => '啟用信æ¯æ¡†åŽ»æä¾›æ’入連çµåŒè¡¨æ ¼ç­‰å˜…幫助', # Fuzzy
'wikieditor-toolbar-loading' => '載入緊...',
'wikieditor-toolbar-tool-bold' => 'ç²—é«”',
'wikieditor-toolbar-tool-bold-example' => '粗體字',
@@ -30941,6 +31521,7 @@ Bangla',
* @author Gaoxuewei
* @author Hydra
* @author Liangent
+ * @author Liuxinyu970226
* @author Onecountry
* @author PhiLiP
* @author Shirayuki
@@ -30978,9 +31559,9 @@ $messages['zh-hans'] = array(
'wikieditor-toc-show' => '显示内容',
'wikieditor-toc-hide' => 'éšè—内容',
'wikieditor-toolbar' => '编辑工具æ ',
- 'wikieditor-toolbar-desc' => '具有增强å¯ç”¨æ€§çš„页é¢ç¼–辑工具',
- 'wikieditor-toolbar-preference' => 'å¯ç”¨å¢žå¼ºç¼–辑工具æ ',
- 'wikieditor-toolbar-dialogs-preference' => 'å¯ç”¨å¯¹è¯æ¡†æ’入链接ã€è¡¨æ ¼ç­‰',
+ 'wikieditor-toolbar-desc' => '有增强的使用性能的页é¢ç¼–辑工具æ ',
+ 'wikieditor-toolbar-preference' => 'å¯ç”¨å¢žå¼ºçš„编辑工具æ ',
+ 'wikieditor-toolbar-dialogs-preference' => 'å¯ç”¨æ’入链接表格å‘导åŠæŸ¥æ‰¾å’Œæ›¿æ¢åŠŸèƒ½',
'wikieditor-toolbar-hidesig' => '在主å字空间中éšè—ç­¾å按钮',
'wikieditor-toolbar-loading' => '正在载入',
'wikieditor-toolbar-tool-bold' => '粗体',
@@ -31008,6 +31589,7 @@ $messages['zh-hans'] = array(
'wikieditor-toolbar-tool-link-int-target-status-invalid' => '无效标题',
'wikieditor-toolbar-tool-link-int-target-status-external' => '外部链接',
'wikieditor-toolbar-tool-link-int-target-status-loading' => '检查页é¢æ˜¯å¦å­˜åœ¨â€¦â€¦',
+ 'wikieditor-toolbar-tool-link-int-target-status-disambig' => '消歧义页é¢',
'wikieditor-toolbar-tool-link-int-invalid' => '您指定的标题无效。',
'wikieditor-toolbar-tool-link-lookslikeinternal' => '您输入的网å€ä¼¼ä¹ŽæŒ‡å‘å¦ä¸€ä¸ªwiki页é¢ï¼Œæ˜¯å¦å¸Œæœ›å°†å…¶æ”¹ä¸ºå†…部链接?',
'wikieditor-toolbar-tool-link-lookslikeinternal-int' => '内部链接',
@@ -31018,7 +31600,7 @@ $messages['zh-hans'] = array(
'wikieditor-toolbar-tool-file-title' => 'æ’入文件',
'wikieditor-toolbar-file-target' => '文件å:',
'wikieditor-toolbar-file-caption' => '标题:',
- 'wikieditor-toolbar-file-size' => '大å°ï¼š',
+ 'wikieditor-toolbar-file-size' => '尺寸:',
'wikieditor-toolbar-file-float' => '对é½ï¼š',
'wikieditor-toolbar-file-default' => '(默认)',
'wikieditor-toolbar-file-format' => 'æ ¼å¼ï¼š',
@@ -31026,7 +31608,7 @@ $messages['zh-hans'] = array(
'wikieditor-toolbar-tool-file-insert' => 'æ’å…¥',
'wikieditor-toolbar-tool-file-cancel' => 'å–消',
'wikieditor-toolbar-tool-reference' => 'å‚考',
- 'wikieditor-toolbar-tool-reference-example' => '在此处æ’入注释文字',
+ 'wikieditor-toolbar-tool-reference-example' => '请在这里æ’入注释文字',
'wikieditor-toolbar-tool-reference-cancel' => 'å–消',
'wikieditor-toolbar-tool-reference-title' => 'æ’入注释内容',
'wikieditor-toolbar-tool-reference-insert' => 'æ’å…¥',
@@ -31048,7 +31630,7 @@ $messages['zh-hans'] = array(
'wikieditor-toolbar-tool-indent' => '缩进',
'wikieditor-toolbar-tool-indent-example' => '已缩进行',
'wikieditor-toolbar-tool-nowiki' => 'éžç»´åŸºæ ¼å¼æ–‡å­—',
- 'wikieditor-toolbar-tool-nowiki-example' => '在此处æ’å…¥éžç»´åŸºæ ¼å¼æ–‡å­—',
+ 'wikieditor-toolbar-tool-nowiki-example' => '请在这里æ’å…¥éžæ ¼å¼åŒ–文字',
'wikieditor-toolbar-tool-redirect' => 'é‡å®šå‘',
'wikieditor-toolbar-tool-redirect-example' => '目标页å称',
'wikieditor-toolbar-tool-big' => '大å·',
@@ -31118,10 +31700,10 @@ $1:Example.jpg|标题2',
'wikieditor-toolbar-characters-page-persian' => '波斯语',
'wikieditor-toolbar-characters-page-hebrew' => '希伯æ¥å­—æ¯',
'wikieditor-toolbar-characters-page-bangla' => '孟加拉',
- 'wikieditor-toolbar-characters-page-tamil' => '泰米尔',
+ 'wikieditor-toolbar-characters-page-tamil' => '泰米尔数字和符å·',
'wikieditor-toolbar-characters-page-telugu' => 'æ³°å¢å›ºå­—æ¯',
- 'wikieditor-toolbar-characters-page-sinhala' => '僧伽罗字æ¯',
- 'wikieditor-toolbar-characters-page-gujarati' => 'å¤å‰æ‹‰ç‰¹å­—æ¯',
+ 'wikieditor-toolbar-characters-page-sinhala' => '僧伽罗语',
+ 'wikieditor-toolbar-characters-page-gujarati' => 'å¤å‰æ‹‰ç‰¹è¯­',
'wikieditor-toolbar-characters-page-devanagari' => '梵文',
'wikieditor-toolbar-characters-page-thai' => '泰语',
'wikieditor-toolbar-characters-page-lao' => 'è€æŒè¯­',
@@ -31195,11 +31777,13 @@ $1:Example.jpg|标题2',
/** Traditional Chinese (中文(ç¹é«”)‎)
* @author Anakmalaysia
+ * @author Ch.Andrew
* @author Frankou
* @author Gaoxuewei
* @author Horacewai2
* @author KaiesTse
* @author Liangent
+ * @author Liuxinyu970226
* @author Mark85296341
* @author Oapbtommy
* @author PhiLiP
@@ -31241,7 +31825,7 @@ $messages['zh-hant'] = array(
'wikieditor-toolbar' => '編輯工具列',
'wikieditor-toolbar-desc' => 'å¯ç”¨æ€§æ›´ä½³ä¹‹ç·¨è¼¯å·¥å…·',
'wikieditor-toolbar-preference' => '啟用加強編輯工具列',
- 'wikieditor-toolbar-dialogs-preference' => '使用å°è©±æ¡†æ’入連çµã€è¡¨æ ¼ç­‰',
+ 'wikieditor-toolbar-dialogs-preference' => '啟用精éˆä¾†æ’入連çµã€è¡¨æ ¼ä»¥åŠæœå°‹èˆ‡å–代函數',
'wikieditor-toolbar-hidesig' => '從主å字空間的é é¢ä¸­éš±è—ç°½å按鈕',
'wikieditor-toolbar-loading' => '載入中...',
'wikieditor-toolbar-tool-bold' => 'ç²—é«”',
@@ -31269,6 +31853,7 @@ $messages['zh-hant'] = array(
'wikieditor-toolbar-tool-link-int-target-status-invalid' => '無效標題',
'wikieditor-toolbar-tool-link-int-target-status-external' => '外部連çµ',
'wikieditor-toolbar-tool-link-int-target-status-loading' => '正檢查é é¢æ˜¯å¦å­˜åœ¨â€¦â€¦',
+ 'wikieditor-toolbar-tool-link-int-target-status-disambig' => '消歧義é ',
'wikieditor-toolbar-tool-link-int-invalid' => '所指定標題無效。',
'wikieditor-toolbar-tool-link-lookslikeinternal' => '閣下所輸入 URL 似乎指å‘å¦ä¸€å€‹ wiki é é¢ï¼Œè«‹å•é ˆå¦è½‰ç‚ºå…§éƒ¨é€£çµï¼Ÿ',
'wikieditor-toolbar-tool-link-lookslikeinternal-int' => '內部連çµ',
diff --git a/extensions/WikiEditor/WikiEditor.php b/extensions/WikiEditor/WikiEditor.php
index dc6df0a6..103c9eb9 100644
--- a/extensions/WikiEditor/WikiEditor.php
+++ b/extensions/WikiEditor/WikiEditor.php
@@ -239,6 +239,7 @@ $wgResourceModules += array(
'wikieditor-toolbar-tool-link-int-target-status-invalid',
'wikieditor-toolbar-tool-link-int-target-status-external',
'wikieditor-toolbar-tool-link-int-target-status-loading',
+ 'wikieditor-toolbar-tool-link-int-target-status-disambig',
'wikieditor-toolbar-tool-link-int-invalid',
'wikieditor-toolbar-tool-link-lookslikeinternal',
'wikieditor-toolbar-tool-link-lookslikeinternal-int',
diff --git a/extensions/WikiEditor/modules/ext.wikiEditor.css b/extensions/WikiEditor/modules/ext.wikiEditor.css
index f0665730..30a27326 100644
--- a/extensions/WikiEditor/modules/ext.wikiEditor.css
+++ b/extensions/WikiEditor/modules/ext.wikiEditor.css
@@ -2,19 +2,16 @@
* CSS for WikiEditor
*/
-/* This ID (#editform) could change in MediaWiki */
form#editform {
margin: 0;
padding: 0;
}
-/* These IDs (#wpSummaryLabel and #wpSummary) could change in MediaWiki */
#wpSummary,
#wpSummaryLabel {
margin-bottom: 1em;
}
-/* This ID (#wpTextbox1) could change in MediaWiki */
.wikiEditor-ui textarea#wpTextbox1 {
border: none;
padding: 0;
@@ -26,3 +23,9 @@ form#editform {
.wikiEditor-ui .wikiEditor-ui-text > textarea#wpTextbox1 {
margin: 0;
}
+
+/* Hide vanilla MediaWiki's "Editing help" link, as we provide it in the toolbar */
+.editButtons .editHelp,
+.editButtons .mw-editButtons-pipe-separator {
+ display: none;
+}
diff --git a/extensions/WikiEditor/modules/ext.wikiEditor.dialogs.js b/extensions/WikiEditor/modules/ext.wikiEditor.dialogs.js
index 0e0dd090..c6d327f8 100644
--- a/extensions/WikiEditor/modules/ext.wikiEditor.dialogs.js
+++ b/extensions/WikiEditor/modules/ext.wikiEditor.dialogs.js
@@ -1,15 +1,14 @@
/*
* JavaScript for WikiEditor Dialogs
*/
-
-$( document ).ready( function() {
+jQuery( document ).ready( function ( $ ) {
if ( !$.wikiEditor.isSupported( $.wikiEditor.modules.dialogs ) ) {
return;
}
-
+
// Replace icons
$.wikiEditor.modules.dialogs.config.replaceIcons( $( '#wpTextbox1' ) );
-
+
// Add dialogs module
$( '#wpTextbox1' ).wikiEditor( 'addModule', $.wikiEditor.modules.dialogs.config.getDefaultConfig() );
} );
diff --git a/extensions/WikiEditor/modules/ext.wikiEditor.highlight.js b/extensions/WikiEditor/modules/ext.wikiEditor.highlight.js
index a6b43851..92515cfd 100644
--- a/extensions/WikiEditor/modules/ext.wikiEditor.highlight.js
+++ b/extensions/WikiEditor/modules/ext.wikiEditor.highlight.js
@@ -1,8 +1,7 @@
/*
* JavaScript for WikiEditor Highlighting
*/
-
-$( document ).ready( function() {
+jQuery( document ).ready( function ( $ ) {
// Add highlight module
$( '#wpTextbox1' ).wikiEditor( 'addModule', 'highlight' );
} );
diff --git a/extensions/WikiEditor/modules/ext.wikiEditor.js b/extensions/WikiEditor/modules/ext.wikiEditor.js
index 6056e63b..46087989 100644
--- a/extensions/WikiEditor/modules/ext.wikiEditor.js
+++ b/extensions/WikiEditor/modules/ext.wikiEditor.js
@@ -1,8 +1,7 @@
/*
* JavaScript for WikiEditor
*/
-
-$( document ).ready( function() {
+jQuery( document ).ready( function ( $ ) {
// Initialize wikiEditor
$( '#wpTextbox1' ).wikiEditor();
} );
diff --git a/extensions/WikiEditor/modules/ext.wikiEditor.preview.js b/extensions/WikiEditor/modules/ext.wikiEditor.preview.js
index 3fbca82d..cdc00f7b 100644
--- a/extensions/WikiEditor/modules/ext.wikiEditor.preview.js
+++ b/extensions/WikiEditor/modules/ext.wikiEditor.preview.js
@@ -1,8 +1,7 @@
/*
* JavaScript for WikiEditor Preview module
*/
-
-$( document ).ready( function() {
+jQuery( document ).ready( function ( $ ) {
// Add preview module
$( 'textarea#wpTextbox1' ).wikiEditor( 'addModule', 'preview' );
} );
diff --git a/extensions/WikiEditor/modules/ext.wikiEditor.previewDialog.js b/extensions/WikiEditor/modules/ext.wikiEditor.previewDialog.js
index 67f97e00..3b1acd7c 100644
--- a/extensions/WikiEditor/modules/ext.wikiEditor.previewDialog.js
+++ b/extensions/WikiEditor/modules/ext.wikiEditor.previewDialog.js
@@ -1,8 +1,7 @@
/*
* JavaScript for WikiEditor Preview Dialog
*/
-
-$( document ).ready( function() {
+jQuery( document ).ready( function ( $ ) {
// Add preview module
$( 'textarea#wpTextbox1' ).wikiEditor( 'addModule', 'previewDialog' );
} );
diff --git a/extensions/WikiEditor/modules/ext.wikiEditor.publish.js b/extensions/WikiEditor/modules/ext.wikiEditor.publish.js
index d874478c..423766d2 100644
--- a/extensions/WikiEditor/modules/ext.wikiEditor.publish.js
+++ b/extensions/WikiEditor/modules/ext.wikiEditor.publish.js
@@ -1,8 +1,7 @@
/*
* JavaScript for WikiEditor Publish module
*/
-
-$( document ).ready( function() {
+jQuery( document ).ready( function ( $ ) {
// Add publish module
$( '#wpTextbox1' ).wikiEditor( 'addModule', 'publish' );
} );
diff --git a/extensions/WikiEditor/modules/ext.wikiEditor.templateEditor.js b/extensions/WikiEditor/modules/ext.wikiEditor.templateEditor.js
index 8879d10d..660a14fb 100644
--- a/extensions/WikiEditor/modules/ext.wikiEditor.templateEditor.js
+++ b/extensions/WikiEditor/modules/ext.wikiEditor.templateEditor.js
@@ -1,12 +1,13 @@
/*
* JavaScript for WikiEditor Template Editor
*/
-
-$( document ).ready( function () {
- // Disable in template namespace
- if ( mw.config.get( 'wgNamespaceNumber' ) === 10 ) {
- return true;
- }
- // Add template editor module
- $( 'textarea#wpTextbox1' ).wikiEditor( 'addModule', 'templateEditor' );
-});
+( function ( mw, $ ) {
+ $( document ).ready( function () {
+ // Disable in template namespace
+ if ( mw.config.get( 'wgNamespaceNumber' ) === 10 ) {
+ return true;
+ }
+ // Add template editor module
+ $( 'textarea#wpTextbox1' ).wikiEditor( 'addModule', 'templateEditor' );
+ } );
+}( mediaWiki, jQuery ) );
diff --git a/extensions/WikiEditor/modules/ext.wikiEditor.templates.js b/extensions/WikiEditor/modules/ext.wikiEditor.templates.js
index 6eae6de5..fec51866 100644
--- a/extensions/WikiEditor/modules/ext.wikiEditor.templates.js
+++ b/extensions/WikiEditor/modules/ext.wikiEditor.templates.js
@@ -1,12 +1,13 @@
/*
* JavaScript for WikiEditor Templates
*/
-
-$( document ).ready( function () {
- // Disable for template namespace
- if ( mw.config.get( 'wgNamespaceNumber' ) === 10 ) {
- return true;
- }
- // Add templates module
- $( '#wpTextbox1' ).wikiEditor( 'addModule', 'templates' );
-} );
+( function ( mw, $ ) {
+ $( document ).ready( function () {
+ // Disable for template namespace
+ if ( mw.config.get( 'wgNamespaceNumber' ) === 10 ) {
+ return true;
+ }
+ // Add templates module
+ $( '#wpTextbox1' ).wikiEditor( 'addModule', 'templates' );
+ } );
+}( mediaWiki, jQuery ) );
diff --git a/extensions/WikiEditor/modules/ext.wikiEditor.tests.toolbar.js b/extensions/WikiEditor/modules/ext.wikiEditor.tests.toolbar.js
index d4ffe5ae..7ed765e9 100644
--- a/extensions/WikiEditor/modules/ext.wikiEditor.tests.toolbar.js
+++ b/extensions/WikiEditor/modules/ext.wikiEditor.tests.toolbar.js
@@ -4,7 +4,7 @@
var textareaId = '#wpTextbox1';
var wikiEditorTests = {
// Add emoticons section
- add_sections_toolbar: {
+ 'add_sections_toolbar': {
call: 'addToToolbar',
data: {
'sections': {
@@ -159,8 +159,8 @@ var wikiEditorTests = {
data: {
section: 'info',
page: 'removeme'
- },
- test: '*[rel=info].section *[rel=removeme].page',
+ },
+ test: '*[rel=info].section *[rel=removeme].page',
pre: 1,
post: 0
},
@@ -171,8 +171,8 @@ var wikiEditorTests = {
section: 'info',
page: 'emoticons',
'character': ':))'
- },
- test: '*[rel=info].section *[rel=emoticons].page *[rel=":))"]',
+ },
+ test: '*[rel=info].section *[rel=emoticons].page *[rel=":))"]',
pre: 1,
post: 0
},
@@ -211,7 +211,7 @@ jQuery(document).ready( function ( $ ) {
return false;
}
- var test, pre, post,
+ var test, pre, post, i,
messages = [ 'Running tests for wikiEditor API' ],
$target = $( textareaId ),
$ui = $target.data( 'wikiEditor-context' ).$ui,
@@ -234,13 +234,13 @@ jQuery(document).ready( function ( $ ) {
}
if ( window.console ) {
- for ( var i = 0; i < messages.length; i++ ) {
+ for ( i = 0; i < messages.length; i++ ) {
window.console.log( messages[i] );
}
}
$(this)
- .attr( 'title', messages.join( " | " ) )
+ .attr( 'title', messages.join( ' | ' ) )
.text( passes + ' / ' + tests + ' were successful' )
.css( 'backgroundColor', passes < tests ? 'red' : 'green' )
.data( 'testDone', 'true' )
diff --git a/extensions/WikiEditor/modules/ext.wikiEditor.toc.js b/extensions/WikiEditor/modules/ext.wikiEditor.toc.js
index 264e9f86..1fc542c5 100644
--- a/extensions/WikiEditor/modules/ext.wikiEditor.toc.js
+++ b/extensions/WikiEditor/modules/ext.wikiEditor.toc.js
@@ -1,8 +1,7 @@
/*
* JavaScript for WikiEditor Table of Contents
*/
-
-$( document ).ready( function() {
+jQuery( document ).ready( function ( $ ) {
// Add table of contents module
$( '#wpTextbox1' ).wikiEditor( 'addModule', 'toc' );
} );
diff --git a/extensions/WikiEditor/modules/ext.wikiEditor.toolbar.hideSig.js b/extensions/WikiEditor/modules/ext.wikiEditor.toolbar.hideSig.js
index 3bc0f0b4..48d30274 100644
--- a/extensions/WikiEditor/modules/ext.wikiEditor.toolbar.hideSig.js
+++ b/extensions/WikiEditor/modules/ext.wikiEditor.toolbar.hideSig.js
@@ -1,7 +1,7 @@
/*
* Remove the signature button if the main namespace is edited.
*/
-$( document ).ready( function() {
+jQuery( document ).ready( function ( $ ) {
// This module is designed not to depend on ext.wikiEditor or jquery.wikiEditor.
// Removing this dependency fixed various bugs, but it does mean that we have to
// account for the situation where $.wikiEditor is not present
@@ -11,4 +11,4 @@ $( document ).ready( function() {
if ( $( 'body' ).hasClass( 'ns-0' ) ) {
$( '#wpTextbox1' ).wikiEditor( 'removeFromToolbar', { 'section': 'main', 'group': 'insert', 'tool': 'signature' } );
}
-});
+} );
diff --git a/extensions/WikiEditor/modules/ext.wikiEditor.toolbar.js b/extensions/WikiEditor/modules/ext.wikiEditor.toolbar.js
index 5cdeae57..3f30c0c4 100644
--- a/extensions/WikiEditor/modules/ext.wikiEditor.toolbar.js
+++ b/extensions/WikiEditor/modules/ext.wikiEditor.toolbar.js
@@ -1,8 +1,7 @@
/*
* JavaScript for WikiEditor Toolbar
*/
-
-$( document ).ready( function() {
+jQuery( document ).ready( function ( $ ) {
if ( !$.wikiEditor.isSupported( $.wikiEditor.modules.toolbar ) ) {
$( '.wikiEditor-oldToolbar' ).show();
return;
diff --git a/extensions/WikiEditor/modules/images/dialogs/insert-disambiguation.png b/extensions/WikiEditor/modules/images/dialogs/insert-disambiguation.png
new file mode 100644
index 00000000..f9057763
--- /dev/null
+++ b/extensions/WikiEditor/modules/images/dialogs/insert-disambiguation.png
Binary files differ
diff --git a/extensions/WikiEditor/modules/jquery.wikiEditor.css b/extensions/WikiEditor/modules/jquery.wikiEditor.css
index d8e331cc..6e05ff03 100644
--- a/extensions/WikiEditor/modules/jquery.wikiEditor.css
+++ b/extensions/WikiEditor/modules/jquery.wikiEditor.css
@@ -19,9 +19,6 @@
.wikiEditor-ui textarea:focus {
outline: none;
}
-.wikiEditor-ui .wikiEditor-ui-bottom {
-
-}
.wikiEditor-ui .wikiEditor-ui-text {
line-height: 0;
}
diff --git a/extensions/WikiEditor/modules/jquery.wikiEditor.dialogs.config.css b/extensions/WikiEditor/modules/jquery.wikiEditor.dialogs.config.css
index efde00fb..39d9d50e 100644
--- a/extensions/WikiEditor/modules/jquery.wikiEditor.dialogs.config.css
+++ b/extensions/WikiEditor/modules/jquery.wikiEditor.dialogs.config.css
@@ -55,7 +55,8 @@
#wikieditor-toolbar-link-int-target-status-exists,
#wikieditor-toolbar-link-int-target-status-notexists,
#wikieditor-toolbar-link-int-target-status-invalid,
-#wikieditor-toolbar-link-int-target-status-external {
+#wikieditor-toolbar-link-int-target-status-external,
+#wikieditor-toolbar-link-int-target-status-disambig {
padding-left: 30px;
background-position: 0 50%;
background-repeat: no-repeat;
@@ -80,6 +81,11 @@
background-image: url(images/dialogs/insert-link-external.png);
background-position: left;
}
+#wikieditor-toolbar-link-int-target-status-disambig {
+ /* @embed */
+ background-image: url(images/dialogs/insert-disambiguation.png);
+ background-position: left;
+}
/* File dialog */
#wikieditor-toolbar-file-target,
#wikieditor-toolbar-file-caption {
diff --git a/extensions/WikiEditor/modules/jquery.wikiEditor.dialogs.config.js b/extensions/WikiEditor/modules/jquery.wikiEditor.dialogs.config.js
index 146de0f9..f37d004e 100644
--- a/extensions/WikiEditor/modules/jquery.wikiEditor.dialogs.config.js
+++ b/extensions/WikiEditor/modules/jquery.wikiEditor.dialogs.config.js
@@ -1,6 +1,8 @@
/**
* Configuration of Dialog module for wikiEditor
*/
+/*jshint curly:false, noarg:false, quotmark:false, onevar:false */
+/*global alert */
( function ( $, mw ) {
$.wikiEditor.modules.dialogs.config = {
@@ -188,45 +190,45 @@ $.wikiEditor.modules.dialogs.config = {
// Show loading spinner while waiting for the API to respond
updateWidget( 'loading' );
// Call the API to check page status, saving the request object so it can be aborted if
- // necessary
+ // necessary.
+ // This used to request a page that would show whether or not the target exists, but we can
+ // also check whether it has the disambiguation property and still get existence information.
+ // If the Disambiguator extension is not installed then such a property won't be set.
$( '#wikieditor-toolbar-link-int-target-status' ).data(
'request',
- $.ajax( {
- url: mw.util.wikiScript( 'api' ),
- dataType: 'json',
- data: {
- action: 'query',
- indexpageids: '',
- titles: target,
- converttitles: '',
- format: 'json'
- },
- success: function ( data ) {
- var status;
- if ( !data || !data.query ) {
- // This happens in some weird cases
- status = false;
- } else {
- var page = data.query.pages[data.query.pageids[0]];
- status = 'exists';
- if ( page.missing !== undefined ) {
- status = 'notexists';
- } else if ( page.invalid !== undefined ) {
- status = 'invalid';
- }
- }
- // Cache the status of the link target if the force internal
- // parameter was not passed
- if ( !internal ) {
- cache[target] = status;
+ ( new mw.Api() ).get( {
+ action: 'query',
+ prop: 'pageprops',
+ titles: target,
+ ppprop: 'disambiguation',
+ indexpageids: true
+ } ).done( function ( data ) {
+ var status;
+ if ( !data.query ) {
+ // This happens in some weird cases
+ status = false;
+ } else {
+ var page = data.query.pages[data.query.pageids[0]];
+ status = 'exists';
+ if ( page.missing !== undefined ) {
+ status = 'notexists';
+ } else if ( page.invalid !== undefined ) {
+ status = 'invalid';
+ } else if ( page.pageprops !== undefined ) {
+ status = 'disambig';
}
- updateWidget( status );
}
+ // Cache the status of the link target if the force internal
+ // parameter was not passed
+ if ( !internal ) {
+ cache[target] = status;
+ }
+ updateWidget( status );
} )
);
}
$( '#wikieditor-toolbar-link-type-int, #wikieditor-toolbar-link-type-ext' ).click( function () {
- if ( $( '#wikieditor-toolbar-link-type-ext' ).is( ':checked' ) ) {
+ if ( $( '#wikieditor-toolbar-link-type-ext' ).prop( 'checked' ) ) {
// Abort previous request
var request = $( '#wikieditor-toolbar-link-int-target-status' ).data( 'request' );
if ( request ) {
@@ -234,8 +236,9 @@ $.wikiEditor.modules.dialogs.config = {
}
updateWidget( 'external' );
}
- if ( $( '#wikieditor-toolbar-link-type-int' ).is( ':checked' ) )
+ if ( $( '#wikieditor-toolbar-link-type-int' ).prop( 'checked' ) ) {
updateExistence( true );
+ }
});
// Set labels of tabs based on rel values
$(this).find( '[rel]' ).each( function () {
@@ -250,12 +253,12 @@ $.wikiEditor.modules.dialogs.config = {
.data( 'tooltip', mw.msg( 'wikieditor-toolbar-tool-link-int-text-tooltip' ) );
$( '#wikieditor-toolbar-link-int-target, #wikieditor-toolbar-link-int-text' )
.each( function () {
- var tooltip = mw.msg( $( this ).attr( 'id' ) + '-tooltip' );
- if ( $( this ).val() === '' )
+ if ( $( this ).val() === '' ) {
$( this )
.addClass( 'wikieditor-toolbar-dialog-hint' )
.val( $( this ).data( 'tooltip' ) )
.data( 'tooltip-mode', true );
+ }
} )
.focus( function () {
if ( $( this ).val() === $( this ).data( 'tooltip' ) ) {
@@ -295,26 +298,30 @@ $.wikiEditor.modules.dialogs.config = {
$( '#wikieditor-toolbar-link-type-int' ).prop( 'checked', true );
updateExistence();
}
- if ( $( '#wikieditor-toolbar-link-int-text' ).data( 'untouched' ) )
+ /*jshint eqeqeq:false */
+ if ( $( '#wikieditor-toolbar-link-int-text' ).data( 'untouched' ) ) {
if ( $( '#wikieditor-toolbar-link-int-target' ).val() ==
- $( '#wikieditor-toolbar-link-int-target' ).data( 'tooltip' ) ) {
- $( '#wikieditor-toolbar-link-int-text' )
- .addClass( 'wikieditor-toolbar-dialog-hint' )
- .val( $( '#wikieditor-toolbar-link-int-text' ).data( 'tooltip' ) )
- .change();
- } else {
- $( '#wikieditor-toolbar-link-int-text' )
- .val( $( '#wikieditor-toolbar-link-int-target' ).val() )
- .change();
- }
+ $( '#wikieditor-toolbar-link-int-target' ).data( 'tooltip' )
+ ) {
+ $( '#wikieditor-toolbar-link-int-text' )
+ .addClass( 'wikieditor-toolbar-dialog-hint' )
+ .val( $( '#wikieditor-toolbar-link-int-text' ).data( 'tooltip' ) )
+ .change();
+ } else {
+ $( '#wikieditor-toolbar-link-int-text' )
+ .val( $( '#wikieditor-toolbar-link-int-target' ).val() )
+ .change();
+ }
+ }
}, 0 );
});
$( '#wikieditor-toolbar-link-int-text' ).bind( 'change keydown paste cut', function () {
var oldVal = $(this).val();
var that = this;
setTimeout( function () {
- if ( $(that).val() !== oldVal )
+ if ( $(that).val() !== oldVal ) {
$(that).data( 'untouched', false );
+ }
}, 0 );
});
// Add images to the page existence widget, which will be shown mutually exclusively to communicate if
@@ -324,6 +331,7 @@ $.wikiEditor.modules.dialogs.config = {
var invalidMsg = mw.msg( 'wikieditor-toolbar-tool-link-int-target-status-invalid' );
var externalMsg = mw.msg( 'wikieditor-toolbar-tool-link-int-target-status-external' );
var loadingMsg = mw.msg( 'wikieditor-toolbar-tool-link-int-target-status-loading' );
+ var disambigMsg = mw.msg( 'wikieditor-toolbar-tool-link-int-target-status-disambig' );
$( '#wikieditor-toolbar-link-int-target-status' )
.append( $( '<div>' )
.attr( 'id', 'wikieditor-toolbar-link-int-target-status-exists' )
@@ -349,6 +357,10 @@ $.wikiEditor.modules.dialogs.config = {
'title': loadingMsg
} ) )
)
+ .append( $( '<div>' )
+ .attr( 'id', 'wikieditor-toolbar-link-int-target-status-disambig' )
+ .append( disambigMsg )
+ )
.data( 'existencecache', {} )
.children().hide();
@@ -374,7 +386,7 @@ $.wikiEditor.modules.dialogs.config = {
// Title suggestions
$( '#wikieditor-toolbar-link-int-target' ).data( 'suggcache', {} ).suggestions( {
- fetch: function ( query ) {
+ fetch: function () {
var that = this;
var title = $(this).val();
@@ -603,7 +615,7 @@ $.wikiEditor.modules.dialogs.config = {
// Execute the action associated with the first button
// when the user presses Enter
$(this).closest( '.ui-dialog' ).keypress( function ( e ) {
- if ( ( e.keyCode || e.which ) == 13 ) {
+ if ( ( e.keyCode || e.which ) === 13 ) {
var button = $(this).data( 'dialogaction' ) || $(this).find( 'button:first' );
button.click();
e.preventDefault();
@@ -701,7 +713,7 @@ $.wikiEditor.modules.dialogs.config = {
// Execute the action associated with the first button
// when the user presses Enter
$( this ).closest( '.ui-dialog' ).keypress( function ( e ) {
- if ( ( e.keyCode || e.which ) == 13 ) {
+ if ( ( e.keyCode || e.which ) === 13 ) {
var button = $( this ).data( 'dialogaction' ) || $( this ).find( 'button:first' );
button.click();
e.preventDefault();
@@ -973,7 +985,7 @@ $.wikiEditor.modules.dialogs.config = {
var hiddenHTML = $( '.wikieditor-toolbar-table-preview-hidden' ).html();
$( '.wikieditor-toolbar-table-preview-header' ).html( hiddenHTML );
$( '.wikieditor-toolbar-table-preview-hidden' ).html( headerHTML );
- if ( typeof jQuery.fn.tablesorter == 'function' ) {
+ if ( typeof jQuery.fn.tablesorter === 'function' ) {
$( '#wikieditor-toolbar-table-preview, #wikieditor-toolbar-table-preview2' )
.filter( '.sortable' )
.tablesorter();
@@ -1065,7 +1077,7 @@ $.wikiEditor.modules.dialogs.config = {
// Execute the action associated with the first button
// when the user presses Enter
$(this).closest( '.ui-dialog' ).keypress( function ( e ) {
- if ( ( e.keyCode || e.which ) == 13 ) {
+ if ( ( e.keyCode || e.which ) === 13 ) {
var button = $(this).data( 'dialogaction' ) || $(this).find( 'button:first' );
button.click();
e.preventDefault();
@@ -1197,7 +1209,7 @@ $.wikiEditor.modules.dialogs.config = {
if ( !match ) {
$( '#wikieditor-toolbar-replace-nomatch' ).show();
- } else if ( mode == 'replaceAll' ) {
+ } else if ( mode === 'replaceAll' ) {
// Instead of using repetitive .match() calls, we use one .match() call with /g
// and indexOf() followed by substr() to find the offsets. This is actually
// faster because our indexOf+substr loop is faster than a match loop, and the
@@ -1232,7 +1244,7 @@ $.wikiEditor.modules.dialogs.config = {
$(this).data( 'offset', 0 );
} else {
- if ( mode == 'replace' ) {
+ if ( mode === 'replace' ) {
var actualReplacement;
if (isRegex) {
@@ -1325,7 +1337,7 @@ $.wikiEditor.modules.dialogs.config = {
// Execute the action associated with the first button
// when the user presses Enter
$(this).closest( '.ui-dialog' ).keypress( function ( e ) {
- if ( ( e.keyCode || e.which ) == 13 ) {
+ if ( ( e.keyCode || e.which ) === 13 ) {
var button = $(this).data( 'dialogaction' ) || $(this).find( 'button:first' );
button.click();
e.preventDefault();
@@ -1345,12 +1357,12 @@ $.wikiEditor.modules.dialogs.config = {
$( textbox )
.bind( 'keypress.srdialog', function ( e ) {
- if ( e.which == 13 ) {
+ if ( e.which === 13 ) {
// Enter
var button = dialog.data( 'dialogaction' ) || dialog.find( 'button:first' );
button.click();
e.preventDefault();
- } else if ( e.which == 27 ) {
+ } else if ( e.which === 27 ) {
// Escape
$(that).dialog( 'close' );
}
diff --git a/extensions/WikiEditor/modules/jquery.wikiEditor.dialogs.js b/extensions/WikiEditor/modules/jquery.wikiEditor.dialogs.js
index f6d86d78..6d92966f 100644
--- a/extensions/WikiEditor/modules/jquery.wikiEditor.dialogs.js
+++ b/extensions/WikiEditor/modules/jquery.wikiEditor.dialogs.js
@@ -42,8 +42,8 @@ $.wikiEditor.modules.dialogs = {
},
openDialog: function ( context, module ) {
if ( module in $.wikiEditor.modules.dialogs.modules ) {
- var mod = $.wikiEditor.modules.dialogs.modules[module];
- var $dialog = $( '#' + mod.id );
+ var mod = $.wikiEditor.modules.dialogs.modules[module],
+ $dialog = $( '#' + mod.id );
if ( $dialog.length === 0 ) {
$.wikiEditor.modules.dialogs.fn.reallyCreate( context, mod, module );
$dialog = $( '#' + mod.id );
@@ -82,7 +82,7 @@ $.wikiEditor.modules.dialogs = {
module = config[mod];
// Only create the dialog if it's supported, isn't filtered and doesn't exist yet
filtered = false;
- if ( typeof module.filters != 'undefined' ) {
+ if ( typeof module.filters !== 'undefined' ) {
for ( i = 0; i < module.filters.length; i++ ) {
if ( $( module.filters[i] ).length === 0 ) {
filtered = true;
@@ -92,7 +92,7 @@ $.wikiEditor.modules.dialogs = {
}
// If the dialog already exists, but for another textarea, simply remove it
$existingDialog = $( '#' + module.id );
- if ( $existingDialog.length > 0 && $existingDialog.data( 'context' ).$textarea != context.$textarea ) {
+ if ( $existingDialog.length > 0 && $existingDialog.data( 'context' ).$textarea !== context.$textarea ) {
$existingDialog.remove();
}
// Re-select from the DOM, we might have removed the dialog just now
@@ -119,13 +119,13 @@ $.wikiEditor.modules.dialogs = {
* @param {String} name Dialog name (key in $.wikiEditor.modules.dialogs.modules)
*/
reallyCreate: function ( context, module, name ) {
- var msg,
+ var msg, dialogDiv,
configuration = module.dialog;
// Add some stuff to configuration
configuration.bgiframe = true;
configuration.autoOpen = false;
// By default our dialogs are modal, unless explicitely defined in their specific configuration.
- if( typeof configuration.modal == "undefined" ) {
+ if( typeof configuration.modal === 'undefined' ) {
configuration.modal = true;
}
configuration.title = $.wikiEditor.autoMsg( module, 'title' );
@@ -138,7 +138,7 @@ $.wikiEditor.modules.dialogs = {
}
configuration.buttons = configuration.newButtons;
// Create the dialog <div>
- var dialogDiv = $( '<div>' )
+ dialogDiv = $( '<div>' )
.attr( 'id', module.id )
.html( module.html )
.data( 'context', context )
@@ -171,26 +171,28 @@ $.wikiEditor.modules.dialogs = {
* NOTE: This function assumes $.ui.dialog has already been loaded
*/
resize: function () {
- var wrapper = $(this).closest( '.ui-dialog' );
- var oldWidth = wrapper.width();
- // Make sure elements don't wrapped so we get an accurate idea of whether they really fit. Also temporarily show
- // hidden elements. Work around jQuery bug where <div style="display: inline;"/> inside a dialog is both
- // :visible and :hidden
- var oldHidden = $(this).find( '*' ).not( ':visible' );
+ var oldWS, thisWidth, wrapperWidth,
+ wrapper = $(this).closest( '.ui-dialog' ),
+ oldWidth = wrapper.width(),
+ // Make sure elements don't wrapped so we get an accurate idea of whether they really fit. Also temporarily show
+ // hidden elements. Work around jQuery bug where <div style="display: inline;"/> inside a dialog is both
+ // :visible and :hidden
+ oldHidden = $(this).find( '*' ).not( ':visible' );
+
// Save the style attributes of the hidden elements to restore them later. Calling hide() after show() messes up
// for elements hidden with a class
oldHidden.each( function () {
$(this).data( 'oldstyle', $(this).attr( 'style' ) );
});
oldHidden.show();
- var oldWS = $(this).css( 'white-space' );
+ oldWS = $(this).css( 'white-space' );
$(this).css( 'white-space', 'nowrap' );
if ( wrapper.width() <= $(this).get(0).scrollWidth ) {
- var thisWidth = $(this).data( 'thisWidth' ) ? $(this).data( 'thisWidth' ) : 0;
+ thisWidth = $(this).data( 'thisWidth' ) ? $(this).data( 'thisWidth' ) : 0;
thisWidth = Math.max( $(this).get(0).width, thisWidth );
$(this).width( thisWidth );
$(this).data( 'thisWidth', thisWidth );
- var wrapperWidth = $(this).data( 'wrapperWidth' ) ? $(this).data( 'wrapperWidth' ) : 0;
+ wrapperWidth = $(this).data( 'wrapperWidth' ) ? $(this).data( 'wrapperWidth' ) : 0;
wrapperWidth = Math.max( wrapper.get(0).scrollWidth, wrapperWidth );
wrapper.width( wrapperWidth );
$(this).data( 'wrapperWidth', wrapperWidth );
diff --git a/extensions/WikiEditor/modules/jquery.wikiEditor.highlight.js b/extensions/WikiEditor/modules/jquery.wikiEditor.highlight.js
index 9d964fa7..f646e456 100644
--- a/extensions/WikiEditor/modules/jquery.wikiEditor.highlight.js
+++ b/extensions/WikiEditor/modules/jquery.wikiEditor.highlight.js
@@ -20,13 +20,21 @@ $.wikiEditor.modules.highlight = {
* Internally used event handlers
*/
evt: {
+ /**
+ * @param context
+ * @param event
+ */
delayedChange: function ( context, event ) {
- if ( event.data.scope == 'realchange' ) {
+ if ( event.data.scope === 'realchange' ) {
$.wikiEditor.modules.highlight.fn.scan( context );
$.wikiEditor.modules.highlight.fn.mark( context, event.data.scope );
}
},
- ready: function ( context, event ) {
+ /**
+ * @param context
+ * @param event
+ */
+ ready: function ( context ) {
$.wikiEditor.modules.highlight.fn.scan( context );
$.wikiEditor.modules.highlight.fn.mark( context, 'ready' );
}
@@ -39,19 +47,22 @@ $.wikiEditor.modules.highlight = {
/**
* Creates a highlight module within a wikiEditor
*
+ * @param context
* @param config Configuration object to create module from
*/
- create: function ( context, config ) {
+ create: function ( context ) {
context.modules.highlight.markersStr = '';
},
/**
* Scans text division for tokens
*
+ * @param context
* @param division
*/
- scan: function ( context, division ) {
+ scan: function ( context ) {
var tokenArray, text, module, exp,
- left, right, match;
+ left, right, match,
+ regex, label, markAfter, offset;
/*jshint eqnull: true */
// Remove all existing tokens
@@ -65,11 +76,11 @@ $.wikiEditor.modules.highlight = {
if ( module in $.wikiEditor.modules && 'exp' in $.wikiEditor.modules[module] ) {
for ( exp in $.wikiEditor.modules[module].exp ) {
// Prepare configuration
- var regex = $.wikiEditor.modules[module].exp[exp].regex;
- var label = $.wikiEditor.modules[module].exp[exp].label;
- var markAfter = $.wikiEditor.modules[module].exp[exp].markAfter || false;
+ regex = $.wikiEditor.modules[module].exp[exp].regex;
+ label = $.wikiEditor.modules[module].exp[exp].label;
+ markAfter = $.wikiEditor.modules[module].exp[exp].markAfter || false;
// Search for tokens
- var offset = 0;
+ offset = 0;
while ( ( match = text.substr( offset ).match( regex ) ) != null ) {
right = ( left = offset + match.index ) + match[0].length;
tokenArray[tokenArray.length] = {
@@ -95,16 +106,19 @@ $.wikiEditor.modules.highlight = {
/**
* Marks up text with HTML
*
+ * @param context
* @param division
* @param tokens
*/
// FIXME: What do division and tokens do?
// TODO: Document the scan() and mark() APIs somewhere
- mark: function ( context, division, tokens ) {
- var i, subtracted, oldLength, j, o;
+ mark: function ( context, division ) {
+ /*jshint eqeqeq:false, onevar:false */
+ var i, subtracted, oldLength, j, o,
+ markers;
// Reset markers
- var markers = [];
+ markers = [];
// Recycle markers that will be skipped in this run
if ( context.modules.highlight.markers && division !== '' ) {
@@ -353,8 +367,9 @@ $.wikiEditor.modules.highlight = {
// Don't remove these either
return true;
}
- if ( marker && typeof marker.beforeUnwrap === 'function' )
+ if ( marker && typeof marker.beforeUnwrap === 'function' ) {
marker.beforeUnwrap( this );
+ }
if ( ( marker && marker.anchor === 'tag' ) || $(this).is( 'p' ) ) {
// Remove all classes
$(this).removeAttr( 'class' );
diff --git a/extensions/WikiEditor/modules/jquery.wikiEditor.iframe.js b/extensions/WikiEditor/modules/jquery.wikiEditor.iframe.js
index 4d425012..538fcb18 100644
--- a/extensions/WikiEditor/modules/jquery.wikiEditor.iframe.js
+++ b/extensions/WikiEditor/modules/jquery.wikiEditor.iframe.js
@@ -1,6 +1,6 @@
/* IFrame extension for wikiEditor */
-
-( function( $ ) { $.wikiEditor.extensions.iframe = function( context ) {
+/*jshint onevar:false, boss:true */
+( function ( $ ) { $.wikiEditor.extensions.iframe = function ( context ) {
/*
* Event Handlers
@@ -14,18 +14,18 @@ context.evt = $.extend( context.evt, {
* function is to both classify the scope of changes as 'division' or 'character' and to prevent further
* processing of events which did not actually change the content of the iframe.
*/
- 'keydown': function( event ) {
+ keydown: function ( event ) {
switch ( event.which ) {
case 90: // z
case 89: // y
- if ( event.which == 89 && !$.browser.msie ) {
+ if ( event.which === 89 && !$.browser.msie ) {
// only handle y events for IE
return true;
} else if ( ( event.ctrlKey || event.metaKey ) && context.history.length ) {
// HistoryPosition is a negative number between -1 and -context.history.length, in other words
// it's the number of steps backwards from the latest state.
var newPosition;
- if ( event.shiftKey || event.which == 89 ) {
+ if ( event.shiftKey || event.which === 89 ) {
// Redo
newPosition = context.historyPosition + 1;
} else {
@@ -35,7 +35,7 @@ context.evt = $.extend( context.evt, {
// Only act if we are switching to a valid state
if ( newPosition >= ( context.history.length * -1 ) && newPosition < 0 ) {
// Make sure we run the history storing code before we make this change
- context.fn.updateHistory( context.oldDelayedHTML != context.$content.html() );
+ context.fn.updateHistory( context.oldDelayedHTML !== context.$content.html() );
context.oldDelayedHistoryPosition = context.historyPosition;
context.historyPosition = newPosition;
// Change state
@@ -65,8 +65,8 @@ context.evt = $.extend( context.evt, {
var $tabindexList = $( '[tabindex]:visible' ).sort( function( a, b ) {
return a.tabIndex - b.tabIndex;
} );
- for( var i=0; i < $tabindexList.length; i++ ) {
- if( $tabindexList.eq( i ).attr( 'id' ) == context.$iframe.attr( 'id' ) ) {
+ for ( var i=0; i < $tabindexList.length; i++ ) {
+ if ( $tabindexList.eq( i ).attr( 'id' ) === context.$iframe.attr( 'id' ) ) {
$tabindexList.get( i + 1 ).focus();
break;
}
@@ -74,48 +74,48 @@ context.evt = $.extend( context.evt, {
return false;
}
break;
- case 86: //v
- if ( event.ctrlKey && $.browser.msie && 'paste' in context.evt ) {
- //paste, intercepted for IE
- context.evt.paste( event );
- }
- break;
+ case 86: //v
+ if ( event.ctrlKey && $.browser.msie && 'paste' in context.evt ) {
+ //paste, intercepted for IE
+ context.evt.paste( event );
+ }
+ break;
}
return true;
},
- 'change': function( event ) {
+ change: function ( event ) {
event.data.scope = 'division';
var newHTML = context.$content.html();
- if ( context.oldHTML != newHTML ) {
+ if ( context.oldHTML !== newHTML ) {
context.fn.purgeOffsets();
context.oldHTML = newHTML;
event.data.scope = 'realchange';
}
// Never let the body be totally empty
- if ( context.$content.children().length == 0 ) {
+ if ( context.$content.children().length === 0 ) {
context.$content.append( '<p></p>' );
}
return true;
},
- 'delayedChange': function( event ) {
+ delayedChange: function ( event ) {
event.data.scope = 'division';
var newHTML = context.$content.html();
- if ( context.oldDelayedHTML != newHTML ) {
+ if ( context.oldDelayedHTML !== newHTML ) {
context.oldDelayedHTML = newHTML;
event.data.scope = 'realchange';
// Surround by <p> if it does not already have it
var cursorPos = context.fn.getCaretPosition();
var t = context.fn.getOffset( cursorPos[0] );
- if ( ! $.browser.msie && t && t.node.nodeName == '#text' && t.node.parentNode.nodeName.toLowerCase() == 'body' ) {
- $( t.node ).wrap( "<p></p>" );
+ if ( ! $.browser.msie && t && t.node.nodeName === '#text' && t.node.parentNode.nodeName.toLowerCase() === 'body' ) {
+ $( t.node ).wrap( '<p></p>' );
context.fn.purgeOffsets();
context.fn.setSelection( { start: cursorPos[0], end: cursorPos[1] } );
}
}
- context.fn.updateHistory( event.data.scope == 'realchange' );
+ context.fn.updateHistory( event.data.scope === 'realchange' );
return true;
},
- 'cut': function( event ) {
+ cut: function ( event ) {
setTimeout( function() {
context.$content.find( 'br' ).each( function() {
if ( $(this).parent().is( 'body' ) ) {
@@ -125,7 +125,7 @@ context.evt = $.extend( context.evt, {
}, 100 );
return true;
},
- 'paste': function( event ) {
+ paste: function ( event ) {
// Save the cursor position to restore it after all this voodoo
var cursorPos = context.fn.getCaretPosition();
var oldLength = context.fn.getContents().length;
@@ -138,6 +138,7 @@ context.evt = $.extend( context.evt, {
}
setTimeout( function() {
+ /*jshint eqnull:true */
// Kill stuff we know we don't want
context.$content.find( 'script,style,img,input,select,textarea,hr,button,link,meta' ).remove();
var nodeToDelete = [];
@@ -152,30 +153,31 @@ context.evt = $.extend( context.evt, {
}
if ( elementAtCursor == null || elementAtCursor.node == null ) {
context.$content.prepend( '<p class = wikiEditor></p>' );
- firstDirtyNode = context.$content.children()[0];
+ firstDirtyNode = context.$content.children()[0];
} else {
firstDirtyNode = elementAtCursor.node;
}
- //this is ugly but seems like the best way to handle the case where we select and replace all editor contents
+ // This is ugly but seems like the best way to handle the case where we select and replace all editor contents
try {
+ /*jshint expr:true */
firstDirtyNode.parentNode;
} catch ( err ) {
context.$content.prepend( '<p class = wikiEditor></p>' );
- firstDirtyNode = context.$content.children()[0];
+ firstDirtyNode = context.$content.children()[0];
}
while ( firstDirtyNode != null ) {
//we're going to replace the contents of the entire parent node.
- while ( firstDirtyNode.parentNode && firstDirtyNode.parentNode.nodeName != 'BODY'
- && ! $( firstDirtyNode ).hasClass( 'wikiEditor' )
- ) {
+ while ( firstDirtyNode.parentNode && firstDirtyNode.parentNode.nodeName !== 'BODY' &&
+ !$( firstDirtyNode ).hasClass( 'wikiEditor' )
+ ) {
firstDirtyNode = firstDirtyNode.parentNode;
}
//go back till we find the first pasted node
- while ( firstDirtyNode.previousSibling != null
- && ! $( firstDirtyNode.previousSibling ).hasClass( 'wikiEditor' )
- ) {
+ while ( firstDirtyNode.previousSibling != null &&
+ !$( firstDirtyNode.previousSibling ).hasClass( 'wikiEditor' )
+ ) {
if ( $( firstDirtyNode.previousSibling ).hasClass( '#comment' ) ) {
$( firstDirtyNode ).remove();
@@ -185,9 +187,9 @@ context.evt = $.extend( context.evt, {
}
if ( firstDirtyNode.previousSibling != null ) {
- $lastDirtyNode = $( firstDirtyNode.previousSibling );
+ $lastDirtyNode = $( firstDirtyNode.previousSibling );
} else {
- $lastDirtyNode = $( firstDirtyNode );
+ $lastDirtyNode = $( firstDirtyNode );
}
var cc = makeContentCollector( $.browser, null );
@@ -218,7 +220,7 @@ context.evt = $.extend( context.evt, {
}
- if( !pastedPretty && $.browser.msie && i == 0 ) {
+ if ( !pastedPretty && $.browser.msie && i === 0 ) {
continue;
}
$newElement = $( '<p class="wikiEditor pasted" ></p>' );
@@ -241,7 +243,7 @@ context.evt = $.extend( context.evt, {
//anything without wikiEditor class was pasted.
$selection = context.$content.find( ':not(.wikiEditor)' );
- if ( $selection.length == 0 ) {
+ if ( $selection.length === 0 ) {
break;
} else {
firstDirtyNode = $selection.eq( 0 )[0];
@@ -260,7 +262,7 @@ context.evt = $.extend( context.evt, {
}, 0 );
return true;
},
- 'ready': function( event ) {
+ ready: function ( event ) {
// Initialize our history queue
if ( context.$content ) {
context.history.push( { 'html': context.$content.html(), 'sel': context.fn.getCaretPosition() } );
@@ -275,7 +277,11 @@ context.evt = $.extend( context.evt, {
* Internally used functions
*/
context.fn = $.extend( context.fn, {
- 'highlightLine': function( $element, mode ) {
+ /**
+ * @param {jQuery} $element
+ * @param mode
+ */
+ highlightLine: function ( $element ) {
if ( !$element.is( 'p' ) ) {
$element = $element.closest( 'p' );
}
@@ -283,7 +289,7 @@ context.fn = $.extend( context.fn, {
setTimeout( function() { $element.animate( { 'backgroundColor': 'white' }, 'slow' ); }, 100 );
setTimeout( function() { $element.css( 'backgroundColor', 'white' ); }, 1000 );
},
- 'htmlToText': function( html ) {
+ htmlToText: function ( html ) {
// This function is slow for large inputs, so aggressively cache input/output pairs
if ( html in context.htmlToTextMap ) {
return context.htmlToTextMap[html];
@@ -294,15 +300,15 @@ context.fn = $.extend( context.fn, {
// IE does overzealous whitespace collapsing for $( '<pre />' ).html( html );
// We also do <br> and easy cases for <p> conversion here, complicated cases are handled later
html = html
- .replace( /\r?\n/g, "" ) // IE7 inserts newlines before block elements
- .replace( /&nbsp;/g, " " ) // We inserted these to prevent IE from collapsing spaces
- .replace( /\<br[^\>]*\>\<\/p\>/gi, '</p>' ) // Remove trailing <br> from <p>
- .replace( /\<\/p\>\s*\<p[^\>]*\>/gi, "\n" ) // Easy case for <p> conversion
- .replace( /\<br[^\>]*\>/gi, "\n" ) // <br> conversion
- .replace( /\<\/p\>(\n*)\<p[^\>]*\>/gi, "$1\n" )
+ .replace( /\r?\n/g, '' ) // IE7 inserts newlines before block elements
+ .replace( /&nbsp;/g, ' ' ) // We inserted these to prevent IE from collapsing spaces
+ .replace( /<br[^\>]*\><\/p\>/gi, '</p>' ) // Remove trailing <br> from <p>
+ .replace( /<\/p\>\s*<p[^\>]*\>/gi, '\n' ) // Easy case for <p> conversion
+ .replace( /<br[^\>]*\>/gi, '\n' ) // <br> conversion
+ .replace( /<\/p\>(\n*)<p[^\>]*\>/gi, '$1\n' )
// Un-nest <p> tags
- .replace( /\<p[^\>]*\><p[^\>]*\>/gi, '<p>' )
- .replace( /\<\/p\><\/p\>/gi, '</p>' );
+ .replace( /<p[^\>]*\><p[^\>]*\>/gi, '<p>' )
+ .replace( /<\/p\><\/p\>/gi, '</p>' );
// Save leading and trailing whitespace now and restore it later. IE eats it all, and even Firefox
// won't leave everything alone
var leading = html.match( /^\s*/ )[0];
@@ -311,8 +317,8 @@ context.fn = $.extend( context.fn, {
var $pre = $( '<pre>' + html + '</pre>' );
$pre.find( '.wikiEditor-noinclude' ).each( function() { $( this ).remove(); } );
// Convert tabs, <p>s and <br>s back
- $pre.find( '.wikiEditor-tab' ).each( function() { $( this ).text( "\t" ); } );
- $pre.find( 'br' ).each( function() { $( this ).replaceWith( "\n" ); } );
+ $pre.find( '.wikiEditor-tab' ).each( function() { $( this ).text( '\t' ); } );
+ $pre.find( 'br' ).each( function() { $( this ).replaceWith( '\n' ); } );
// Converting <p>s is wrong if there's nothing before them, so check that.
// .find( '* + p' ) isn't good enough because textnodes aren't considered
$pre.find( 'p' ).each( function() {
@@ -323,21 +329,21 @@ context.fn = $.extend( context.fn, {
// Check for preceding text
var t = new context.fn.rawTraverser( this.firstChild, this, $pre.get( 0 ), true ).prev();
- while ( t && t.node.nodeName != '#text' && t.node.nodeName != 'BR' && t.node.nodeName != 'P' ) {
+ while ( t && t.node.nodeName !== '#text' && t.node.nodeName !== 'BR' && t.node.nodeName !== 'P' ) {
t = t.prev();
}
if ( t ) {
- text = "\n" + text;
+ text = '\n' + text;
}
// Check for following text
t = new context.fn.rawTraverser( this.lastChild, this, $pre.get( 0 ), true ).next();
- while ( t && t.node.nodeName != '#text' && t.node.nodeName != 'BR' && t.node.nodeName != 'P' ) {
+ while ( t && t.node.nodeName !== '#text' && t.node.nodeName !== 'BR' && t.node.nodeName !== 'P' ) {
t = t.next();
}
- if ( t && !t.inP && t.node.nodeName == '#text' && t.node.nodeValue.charAt( 0 ) != '\n'
- && t.node.nodeValue.charAt( 0 ) != '\r' ) {
- text += "\n";
+ if ( t && !t.inP && t.node.nodeName === '#text' && t.node.nodeValue.charAt( 0 ) !== '\n' &&
+ t.node.nodeValue.charAt( 0 ) !== '\r' ) {
+ text += '\n';
}
$( this ).text( text );
} );
@@ -357,8 +363,8 @@ context.fn = $.extend( context.fn, {
* @param strict If true, the element the selection starts in cannot match (default: false)
* @return jQuery object or null if unknown
*/
- 'beforeSelection': function( classname, strict ) {
- if ( typeof classname == 'undefined' ) {
+ beforeSelection: function ( classname, strict ) {
+ if ( typeof classname === 'undefined' ) {
classname = '';
}
var e = null, offset = null;
@@ -381,7 +387,7 @@ context.fn = $.extend( context.fn, {
// When the cursor is on an empty line, Opera gives us a bogus range object with
// startContainer=endContainer=body and startOffset=endOffset=1
var body = context.$iframe[0].contentWindow.document.body;
- if ( $.browser.opera && e == body && offset == 1 ) {
+ if ( $.browser.opera && e === body && offset === 1 ) {
return null;
}
}
@@ -400,14 +406,14 @@ context.fn = $.extend( context.fn, {
return null;
}
var seekPos = context.fn.htmlToText( range2.htmlText ).length;
- var offset = context.fn.getOffset( seekPos );
+ offset = context.fn.getOffset( seekPos );
e = offset ? offset.node : null;
offset = offset ? offset.offset : null;
if ( !e ) {
return null;
}
}
- if ( e.nodeName != '#text' ) {
+ if ( e.nodeName !== '#text' ) {
// The selection is not in a textnode, but between two non-text nodes
// (usually inside the <body> between two <br>s). Go to the rightmost
// child of the node just before the selection
@@ -425,7 +431,7 @@ context.fn = $.extend( context.fn, {
// constructor thousands of times is very inefficient
var classStr = ' ' + classname + ' ';
while ( e ) {
- if ( !strict && ( !classname || ( ' ' + e.className + ' ' ).indexOf( classStr ) != -1 ) ) {
+ if ( !strict && ( !classname || ( ' ' + e.className + ' ' ).indexOf( classStr ) !== -1 ) ) {
return $( e );
}
var next = e.previousSibling;
@@ -440,7 +446,7 @@ context.fn = $.extend( context.fn, {
/**
* Object used by traverser(). Don't use this unless you know what you're doing
*/
- 'rawTraverser': function( node, inP, ancestor, skipNoinclude ) {
+ rawTraverser: function ( node, inP, ancestor, skipNoinclude ) {
this.node = node;
this.inP = inP;
this.ancestor = ancestor;
@@ -450,16 +456,16 @@ context.fn = $.extend( context.fn, {
var nextInP = this.inP;
while ( p && !p.nextSibling ) {
p = p.parentNode;
- if ( p == this.ancestor ) {
+ if ( p === this.ancestor ) {
// We're back at the ancestor, stop here
p = null;
}
- if ( p && p.nodeName == "P" ) {
+ if ( p && p.nodeName === 'P' ) {
nextInP = null;
}
}
p = p ? p.nextSibling : null;
- if ( p && p.nodeName == "P" ) {
+ if ( p && p.nodeName === 'P' ) {
nextInP = p;
}
do {
@@ -467,13 +473,13 @@ context.fn = $.extend( context.fn, {
// Don't use $( p ).hasClass( 'wikiEditor-noinclude' ) because
// $() is slow in a tight loop
if ( this.skipNoinclude ) {
- while ( p && ( ' ' + p.className + ' ' ).indexOf( ' wikiEditor-noinclude ' ) != -1 ) {
+ while ( p && ( ' ' + p.className + ' ' ).indexOf( ' wikiEditor-noinclude ' ) !== -1 ) {
p = p.nextSibling;
}
}
if ( p && p.firstChild ) {
p = p.firstChild;
- if ( p.nodeName == "P" ) {
+ if ( p.nodeName === 'P' ) {
nextInP = p;
}
}
@@ -487,16 +493,16 @@ context.fn = $.extend( context.fn, {
var prevInP = this.inP;
while ( p && !p.previousSibling ) {
p = p.parentNode;
- if ( p == this.ancestor ) {
+ if ( p === this.ancestor ) {
// We're back at the ancestor, stop here
p = null;
}
- if ( p && p.nodeName == "P" ) {
+ if ( p && p.nodeName === 'P' ) {
prevInP = null;
}
}
p = p ? p.previousSibling : null;
- if ( p && p.nodeName == "P" ) {
+ if ( p && p.nodeName === 'P' ) {
prevInP = p;
}
do {
@@ -510,7 +516,7 @@ context.fn = $.extend( context.fn, {
}
if ( p && p.lastChild ) {
p = p.lastChild;
- if ( p.nodeName == "P" ) {
+ if ( p.nodeName == 'P' ) {
prevInP = p;
}
}
@@ -528,28 +534,28 @@ context.fn = $.extend( context.fn, {
* @return Traverser object, use .next() or .prev() to get a traverser object referring to the
* previous/next node
*/
- 'traverser': function( start ) {
+ traverser: function ( start ) {
// Find the leftmost leaf node in the tree
var startNode = start.jquery ? start.get( 0 ) : start;
var node = startNode;
- var inP = node.nodeName == "P" ? node : null;
+ var inP = node.nodeName === 'P' ? node : null;
do {
// Filter nodes with the wikiEditor-noinclude class
// Don't use $( p ).hasClass( 'wikiEditor-noinclude' ) because
// $() is slow in a tight loop
- while ( node && ( ' ' + node.className + ' ' ).indexOf( ' wikiEditor-noinclude ' ) != -1 ) {
+ while ( node && ( ' ' + node.className + ' ' ).indexOf( ' wikiEditor-noinclude ' ) !== -1 ) {
node = node.nextSibling;
}
if ( node && node.firstChild ) {
node = node.firstChild;
- if ( node.nodeName == "P" ) {
+ if ( node.nodeName === 'P' ) {
inP = node;
}
}
} while ( node && node.firstChild );
return new context.fn.rawTraverser( node, inP, startNode, true );
},
- 'getOffset': function( offset ) {
+ getOffset: function ( offset ) {
if ( !context.offsets ) {
context.fn.refreshOffsets();
}
@@ -578,21 +584,21 @@ context.fn = $.extend( context.fn, {
'lastTextNode': base.lastTextNode
};
},
- 'purgeOffsets': function() {
+ purgeOffsets: function () {
context.offsets = null;
},
- 'refreshOffsets': function() {
+ refreshOffsets: function () {
context.offsets = [ ];
var t = context.fn.traverser( context.$content );
var pos = 0, lastTextNode = null;
while ( t ) {
- if ( t.node.nodeName != '#text' && t.node.nodeName != 'BR' ) {
+ if ( t.node.nodeName !== '#text' && t.node.nodeName !== 'BR' ) {
t = t.next();
continue;
}
- var nextPos = t.node.nodeName == '#text' ? pos + t.node.nodeValue.length : pos + 1;
+ var nextPos = t.node.nodeName === '#text' ? pos + t.node.nodeValue.length : pos + 1;
var nextT = t.next();
- var leavingP = t.node.nodeName == '#text' && t.inP && nextT && ( !nextT.inP || nextT.inP != t.inP );
+ var leavingP = t.node.nodeName === '#text' && t.inP && nextT && ( !nextT.inP || nextT.inP !== t.inP );
context.offsets[pos] = {
'node': t.node,
'offset': 0,
@@ -610,27 +616,27 @@ context.fn = $.extend( context.fn, {
};
}
pos = nextPos + ( leavingP ? 1 : 0 );
- if ( t.node.nodeName == '#text' ) {
+ if ( t.node.nodeName === '#text' ) {
lastTextNode = t.node;
}
t = nextT;
}
},
- 'saveCursorAndScrollTop': function() {
+ saveCursorAndScrollTop: function () {
// Stub out textarea behavior
return;
},
- 'restoreCursorAndScrollTop': function() {
+ restoreCursorAndScrollTop: function () {
// Stub out textarea behavior
return;
},
- 'saveSelection': function() {
+ saveSelection: function () {
if ( $.client.profile().name === 'msie' ) {
context.$iframe[0].contentWindow.focus();
context.savedSelection = context.$iframe[0].contentWindow.document.selection.createRange();
}
},
- 'restoreSelection': function() {
+ restoreSelection: function () {
if ( $.client.profile().name === 'msie' && context.savedSelection !== null ) {
context.$iframe[0].contentWindow.focus();
context.savedSelection.select();
@@ -640,10 +646,10 @@ context.fn = $.extend( context.fn, {
/**
* Update the history queue
*
- * @param htmlChange pass true or false to inidicate if there was a text change that should potentially
+ * @param htmlChange Pass true or false to inidicate if there was a text change that should potentially
* be given a new history state.
*/
- 'updateHistory': function( htmlChange ) {
+ updateHistory: function ( htmlChange ) {
var newHTML = context.$content.html();
var newSel = context.fn.getCaretPosition();
// Was text changed? Was it because of a REDO or UNDO action?
@@ -675,7 +681,7 @@ context.fn = $.extend( context.fn, {
/**
* Sets up the iframe in place of the textarea to allow more advanced operations
*/
- 'setupIframe': function() {
+ setupIframe: function () {
context.$iframe = $( '<iframe></iframe>' )
.attr( {
'frameBorder': 0,
@@ -834,7 +840,7 @@ context.fn = $.extend( context.fn, {
* equivilant functionality to the otherwise textarea-based functionality.
*/
- 'getElementAtCursor': function() {
+ getElementAtCursor: function () {
if ( context.$iframe[0].contentWindow.getSelection ) {
// Firefox and Opera
var selection = context.$iframe[0].contentWindow.getSelection();
@@ -855,7 +861,7 @@ context.fn = $.extend( context.fn, {
/**
* Gets the complete contents of the iframe (in plain text, not HTML)
*/
- 'getContents': function() {
+ getContents: function () {
// For <p></p>, .html() returns <p>&nbsp;</p> in IE
// This seems to convince IE while not affecting display
if ( !context.$content ) {
@@ -880,7 +886,7 @@ context.fn = $.extend( context.fn, {
* Gets the currently selected text in the content
* DO NOT CALL THIS DIRECTLY, use $.textSelection( 'functionname', options ) instead
*/
- 'getSelection': function() {
+ getSelection: function () {
var retval;
if ( context.$iframe[0].contentWindow.getSelection ) {
// Firefox and Opera
@@ -915,7 +921,7 @@ context.fn = $.extend( context.fn, {
* selection is empty.
* DO NOT CALL THIS DIRECTLY, use $.textSelection( 'functionname', options ) instead
*/
- 'encapsulateSelection': function( options ) {
+ encapsulateSelection: function ( options ) {
var selText = $(this).textSelection( 'getSelection' );
var selTextArr;
var collapseToEnd = false;
@@ -1127,7 +1133,7 @@ context.fn = $.extend( context.fn, {
* Gets the position (in resolution of bytes not nessecarily characters) in a textarea
* DO NOT CALL THIS DIRECTLY, use $.textSelection( 'functionname', options ) instead
*/
- 'getCaretPosition': function( options ) {
+ getCaretPosition: function ( options ) {
var startPos = null, endPos = null;
if ( context.$iframe[0].contentWindow.getSelection ) {
var selection = context.$iframe[0].contentWindow.getSelection();
@@ -1264,7 +1270,7 @@ context.fn = $.extend( context.fn, {
* @param startContainer Element in iframe to start selection in. If not set, start is a character offset
* @param endContainer Element in iframe to end selection in. If not set, end is a character offset
*/
- 'setSelection': function( options ) {
+ setSelection: function ( options ) {
var sc = options.startContainer, ec = options.endContainer;
sc = sc && sc.jquery ? sc[0] : sc;
ec = ec && ec.jquery ? ec[0] : ec;
@@ -1351,7 +1357,7 @@ context.fn = $.extend( context.fn, {
* Scroll a textarea to the current cursor position. You can set the cursor position with setSelection()
* DO NOT CALL THIS DIRECTLY, use $.textSelection( 'functionname', options ) instead
*/
- 'scrollToCaretPosition': function( options ) {
+ scrollToCaretPosition: function ( options ) {
context.fn.scrollToTop( context.fn.getElementAtCursor(), true );
},
/**
@@ -1361,7 +1367,7 @@ context.fn = $.extend( context.fn, {
* @param $element jQuery object containing an element in the iframe
* @param force If true, scroll the element even if it's already visible
*/
- 'scrollToTop': function( $element, force ) {
+ scrollToTop: function ( $element, force ) {
var html = context.$content.closest( 'html' ),
body = context.$content.closest( 'body' ),
parentHtml = $( 'html' ),
diff --git a/extensions/WikiEditor/modules/jquery.wikiEditor.js b/extensions/WikiEditor/modules/jquery.wikiEditor.js
index 6e87a45f..460203ff 100644
--- a/extensions/WikiEditor/modules/jquery.wikiEditor.js
+++ b/extensions/WikiEditor/modules/jquery.wikiEditor.js
@@ -8,7 +8,8 @@
* $( 'textarea#wpTextbox1' ).wikiEditor( 'addModule', 'toolbar', { ... config ... } );
*
*/
-( function ( $ ) {
+/*jshint onevar:false, boss:true */
+( function ( $, mw ) {
/**
* Global static object for wikiEditor that provides generally useful functionality to all modules and contexts.
@@ -113,7 +114,7 @@ $.wikiEditor = {
isRequired: function ( module, requirement ) {
if ( typeof module.req !== 'undefined' ) {
for ( var req in module.req ) {
- if ( module.req[req] == requirement ) {
+ if ( module.req[req] === requirement ) {
return true;
}
}
@@ -132,9 +133,10 @@ $.wikiEditor = {
* with the key 'bar'.
*/
autoMsg: function ( object, property ) {
+ var i, p;
// Accept array of possible properties, of which the first one found will be used
- if ( typeof property == 'object' ) {
- for ( var i in property ) {
+ if ( typeof property === 'object' ) {
+ for ( i in property ) {
if ( property[i] in object || property[i] + 'Msg' in object ) {
property = property[i];
break;
@@ -144,11 +146,11 @@ $.wikiEditor = {
if ( property in object ) {
return object[property];
} else if ( property + 'Msg' in object ) {
- var p = object[property + 'Msg'];
+ p = object[property + 'Msg'];
if ( $.isArray( p ) && p.length >= 2 ) {
- return mediaWiki.msg.apply( mediaWiki.msg, p );
+ return mw.message.apply( mw.message, p ).plain();
} else {
- return mediaWiki.msg( p );
+ return mw.message( p ).plain();
}
} else {
return '';
@@ -181,7 +183,7 @@ $.wikiEditor = {
var src = $.wikiEditor.autoLang( icon, lang );
path = path || $.wikiEditor.imgPath;
// Prepend path if src is not absolute
- if ( src.substr( 0, 7 ) != 'http://' && src.substr( 0, 8 ) != 'https://' && src[0] != '/' ) {
+ if ( src.substr( 0, 7 ) !== 'http://' && src.substr( 0, 8 ) !== 'https://' && src[0] !== '/' ) {
src = path + src;
}
return src + '?' + mw.loader.version( 'jquery.wikiEditor' );
@@ -197,9 +199,9 @@ $.wikiEditor = {
*/
autoIconOrOffset: function ( icon, offset, path, lang ) {
lang = lang || mw.config.get( 'wgUserLanguage' );
- if ( typeof offset == 'object' && lang in offset ) {
+ if ( typeof offset === 'object' && lang in offset ) {
return offset[lang];
- } else if ( typeof icon == 'object' && lang in icon ) {
+ } else if ( typeof icon === 'object' && lang in icon ) {
return $.wikiEditor.autoIcon( icon, undefined, lang );
} else {
return $.wikiEditor.autoLang( offset, lang );
@@ -223,7 +225,7 @@ if ( !$.wikiEditor.isSupported() ) {
// where we left off
var context = $(this).data( 'wikiEditor-context' );
// On first call, we need to set things up, but on all following calls we can skip right to the API handling
-if ( !context || typeof context == 'undefined' ) {
+if ( !context || typeof context === 'undefined' ) {
// Star filling the context with useful data - any jQuery selections, as usual should be named with a preceding $
context = {
@@ -276,14 +278,14 @@ if ( !context || typeof context == 'undefined' ) {
'addModule': function ( context, data ) {
var module, call,
modules = {};
- if ( typeof data == 'string' ) {
+ if ( typeof data === 'string' ) {
modules[data] = {};
- } else if ( typeof data == 'object' ) {
+ } else if ( typeof data === 'object' ) {
modules = data;
}
for ( module in modules ) {
// Check for the existance of an available / supported module with a matching name and a create function
- if ( typeof module == 'string' && typeof $.wikiEditor.modules[module] !== 'undefined' &&
+ if ( typeof module === 'string' && typeof $.wikiEditor.modules[module] !== 'undefined' &&
$.wikiEditor.isSupported( $.wikiEditor.modules[module] ) )
{
// Extend the context's core API with this module's own API calls
@@ -326,11 +328,11 @@ if ( !context || typeof context == 'undefined' ) {
*/
trigger: function ( name, event ) {
// Event is an optional argument, but from here on out, at least the type field should be dependable
- if ( typeof event == 'undefined' ) {
+ if ( typeof event === 'undefined' ) {
event = { 'type': 'custom' };
}
// Ensure there's a place for extra information to live
- if ( typeof event.data == 'undefined' ) {
+ if ( typeof event.data === 'undefined' ) {
event.data = {};
}
@@ -393,7 +395,7 @@ if ( !context || typeof context == 'undefined' ) {
// Return the newly appended tab
return $( '<div>' )
.attr( 'rel', 'wikiEditor-ui-view-' + options.name )
- .addClass( context.view == options.name ? 'current' : null )
+ .addClass( context.view === options.name ? 'current' : null )
.append( $( '<a>' )
.attr( 'href', '#' )
.mousedown( function () {
@@ -406,7 +408,7 @@ if ( !context || typeof context == 'undefined' ) {
context.$tabs.find( 'div' ).removeClass( 'current' );
$(this).parent().addClass( 'current' );
$(this).blur();
- if ( 'init' in options && typeof options.init == 'function' ) {
+ if ( 'init' in options && typeof options.init === 'function' ) {
options.init( context );
}
event.preventDefault();
@@ -539,9 +541,9 @@ if ( !context || typeof context == 'undefined' ) {
var args = $.makeArray( arguments );
// Dynamically setup core extensions for modules that are required
-if ( args[0] == 'addModule' && typeof args[1] !== 'undefined' ) {
+if ( args[0] === 'addModule' && typeof args[1] !== 'undefined' ) {
var modules = args[1];
- if ( typeof modules !== "object" ) {
+ if ( typeof modules !== 'object' ) {
modules = {};
modules[args[1]] = '';
}
@@ -577,4 +579,4 @@ return $(this).data( 'wikiEditor-context', context );
};
-}( jQuery ) );
+}( jQuery, mediaWiki ) );
diff --git a/extensions/WikiEditor/modules/jquery.wikiEditor.preview.js b/extensions/WikiEditor/modules/jquery.wikiEditor.preview.js
index 39907364..372d2e8e 100644
--- a/extensions/WikiEditor/modules/jquery.wikiEditor.preview.js
+++ b/extensions/WikiEditor/modules/jquery.wikiEditor.preview.js
@@ -1,6 +1,6 @@
/* Preview module for wikiEditor */
( function ( $, mw ) {
-
+/*jshint onevar:false */
$.wikiEditor.modules.preview = {
/**
@@ -32,7 +32,7 @@ fn: {
* @param context Context object of editor to create module in
* @param config Configuration object to create module from
*/
- create: function ( context, config ) {
+ create: function ( context ) {
if ( 'initialized' in context.modules.preview ) {
return;
}
@@ -65,9 +65,9 @@ fn: {
},
function ( data ) {
if (
- typeof data.parse == 'undefined' ||
- typeof data.parse.text == 'undefined' ||
- typeof data.parse.text['*'] == 'undefined'
+ typeof data.parse === 'undefined' ||
+ typeof data.parse.text === 'undefined' ||
+ typeof data.parse.text['*'] === 'undefined'
) {
return;
}
@@ -89,7 +89,7 @@ fn: {
// Gets the latest copy of the wikitext
var wikitext = context.$textarea.textSelection( 'getContents' );
// Aborts when nothing has changed since the last time
- if ( context.modules.preview.changesText == wikitext ) {
+ if ( context.modules.preview.changesText === wikitext ) {
return;
}
context.$changesTab.find( 'table.diff tbody' ).empty();
@@ -115,8 +115,9 @@ fn: {
rvprop: ''
};
var section = $( '[name="wpSection"]' ).val();
- if ( section !== '' )
+ if ( section !== '' ) {
postdata2.rvsection = section;
+ }
$.post( mw.util.wikiScript( 'api' ), postdata2, function ( data ) {
// Add diff CSS
diff --git a/extensions/WikiEditor/modules/jquery.wikiEditor.previewDialog.js b/extensions/WikiEditor/modules/jquery.wikiEditor.previewDialog.js
index ca88c79a..5381e605 100644
--- a/extensions/WikiEditor/modules/jquery.wikiEditor.previewDialog.js
+++ b/extensions/WikiEditor/modules/jquery.wikiEditor.previewDialog.js
@@ -1,5 +1,6 @@
/* Publish module for wikiEditor */
-( function( $ ) { $.wikiEditor.modules.previewDialog = {
+/*jshint onevar:false */
+( function ( $, mw ) { $.wikiEditor.modules.previewDialog = {
/**
* Compatability map
@@ -29,7 +30,7 @@ fn: {
* @param context Context object of editor to create module in
* @param config Configuration object to create module from
*/
- create: function( context, config ) {
+ create: function( context ) {
// Build the dialog behind the Publish button
var dialogID = 'wikiEditor-' + context.instance + '-preview-dialog';
$.wikiEditor.modules.dialogs.fn.create(
@@ -78,7 +79,7 @@ fn: {
.css( 'top', '25px' );
// $dialog.dialog( 'option', 'width', $( 'body' ).width() - 300 );
// Aborts when nothing has changed since the last preview
- if ( context.modules.preview.previewText == wikitext ) {
+ if ( context.modules.preview.previewText === wikitext ) {
return;
}
@@ -96,9 +97,9 @@ fn: {
},
function( data ) {
if (
- typeof data.parse == 'undefined' ||
- typeof data.parse.text == 'undefined' ||
- typeof data.parse.text['*'] == 'undefined'
+ typeof data.parse === 'undefined' ||
+ typeof data.parse.text === 'undefined' ||
+ typeof data.parse.text['*'] === 'undefined'
) {
return;
}
@@ -128,4 +129,4 @@ fn: {
}
}
-}; } )( jQuery );
+}; } )( jQuery, mediaWiki );
diff --git a/extensions/WikiEditor/modules/jquery.wikiEditor.publish.js b/extensions/WikiEditor/modules/jquery.wikiEditor.publish.js
index b61140dc..058fa1b3 100644
--- a/extensions/WikiEditor/modules/jquery.wikiEditor.publish.js
+++ b/extensions/WikiEditor/modules/jquery.wikiEditor.publish.js
@@ -1,4 +1,5 @@
/* Publish module for wikiEditor */
+/*jshint onevar:false */
( function ( $ ) {
$.wikiEditor.modules.publish = {
@@ -31,7 +32,7 @@ fn: {
* @param context Context object of editor to create module in
* @param config Configuration object to create module from
*/
- create: function ( context, config ) {
+ create: function ( context ) {
// Build the dialog behind the Publish button
var dialogID = 'wikiEditor-' + context.instance + '-dialog';
$.wikiEditor.modules.dialogs.fn.create(
@@ -89,16 +90,18 @@ fn: {
);
/* END OF REALLY DIRTY HACK */
- if ( $( '#wpMinoredit' ).length === 0 )
+ if ( $( '#wpMinoredit' ).length === 0 ) {
$( '#wikiEditor-' + context.instance + '-dialog-minor' ).hide();
- else if ( $( '#wpMinoredit' ).is( ':checked' ) )
+ } else if ( $( '#wpMinoredit' ).prop( 'checked' ) ) {
$( '#wikiEditor-' + context.instance + '-dialog-minor' )
.prop( 'checked', true );
- if ( $( '#wpWatchthis' ).length === 0 )
+ }
+ if ( $( '#wpWatchthis' ).length === 0 ) {
$( '#wikiEditor-' + context.instance + '-dialog-watch' ).hide();
- else if ( $( '#wpWatchthis' ).is( ':checked' ) )
+ } else if ( $( '#wpWatchthis' ).prop( 'checked' ) ) {
$( '#wikiEditor-' + context.instance + '-dialog-watch' )
.prop( 'checked', true );
+ }
$(this).find( 'form' ).submit( function ( e ) {
$(this).closest( '.ui-dialog' ).find( 'button:first' ).click();
diff --git a/extensions/WikiEditor/modules/jquery.wikiEditor.templateEditor.js b/extensions/WikiEditor/modules/jquery.wikiEditor.templateEditor.js
index bd00325f..3cbd5ba5 100644
--- a/extensions/WikiEditor/modules/jquery.wikiEditor.templateEditor.js
+++ b/extensions/WikiEditor/modules/jquery.wikiEditor.templateEditor.js
@@ -1,5 +1,6 @@
/* TemplateEditor module for wikiEditor */
-( function( $ ) { $.wikiEditor.modules.templateEditor = {
+/*jshint quotmark:false, onevar:false */
+( function ( $ ) { $.wikiEditor.modules.templateEditor = {
/**
* Name mappings, dirty hack which will be removed once "TemplateInfo" extension is more fully supported
*/
@@ -37,9 +38,13 @@
*/
evt: {
- mark: function( context, event ) {
+ /**
+ * @param context
+ * @param event
+ */
+ mark: function( context ) {
// The markers returned by this function are skipped on realchange, so don't regenerate them in that case
- if ( context.modules.highlight.currentScope == 'realchange' ) {
+ if ( context.modules.highlight.currentScope === 'realchange' ) {
return;
}
@@ -47,10 +52,9 @@ evt: {
var markers = context.modules.highlight.markers;
var tokenArray = context.modules.highlight.tokenArray;
// Collect matching level 0 template call boundaries from the tokenArray
- var level = 0;
var tokenIndex = 0;
while ( tokenIndex < tokenArray.length ){
- while ( tokenIndex < tokenArray.length && tokenArray[tokenIndex].label != 'TEMPLATE_BEGIN' ) {
+ while ( tokenIndex < tokenArray.length && tokenArray[tokenIndex].label !== 'TEMPLATE_BEGIN' ) {
tokenIndex++;
}
//open template
@@ -58,19 +62,18 @@ evt: {
var beginIndex = tokenIndex;
var endIndex = -1; //no match found
var openTemplates = 1;
- var templatesMatched = false;
- while ( tokenIndex < tokenArray.length - 1 && endIndex == -1 ) {
+ while ( tokenIndex < tokenArray.length - 1 && endIndex === -1 ) {
tokenIndex++;
- if ( tokenArray[tokenIndex].label == 'TEMPLATE_BEGIN' ) {
+ if ( tokenArray[tokenIndex].label === 'TEMPLATE_BEGIN' ) {
openTemplates++;
- } else if ( tokenArray[tokenIndex].label == 'TEMPLATE_END' ) {
+ } else if ( tokenArray[tokenIndex].label === 'TEMPLATE_END' ) {
openTemplates--;
- if ( openTemplates == 0 ) {
+ if ( openTemplates === 0 ) {
endIndex = tokenIndex;
} //we can stop looping
}
}//while finding template ending
- if ( endIndex != -1 ) {
+ if ( endIndex !== -1 ) {
markers.push( {
start: tokenArray[beginIndex].offset,
end: tokenArray[endIndex].offset,
@@ -92,7 +95,7 @@ evt: {
}
},
onSkip: function( node ) {
- if ( $( node ).html() == $( node ).data( 'oldHTML' ) ) {
+ if ( $( node ).html() === $( node ).data( 'oldHTML' ) ) {
// No change
return;
}
@@ -104,7 +107,7 @@ evt: {
if ( $( node ).parent().hasClass( 'wikiEditor-template' ) ) {
var $label = $( node ).parent().find( '.wikiEditor-template-label' );
var displayName = $.wikiEditor.modules.templateEditor.fn.getTemplateDisplayName( model );
- if ( $label.text() != displayName ) {
+ if ( $label.text() !== displayName ) {
$label.text( displayName );
}
}
@@ -119,7 +122,7 @@ evt: {
$.wikiEditor.modules.templateEditor.fn.bindTemplateEvents( $( node ) );
}
},
- getAnchor: function( ca1, ca2 ) {
+ getAnchor: function( ca1 ) {
return $( ca1.parentNode ).is( 'span.wikiEditor-template-text' ) ?
ca1.parentNode : null;
},
@@ -142,7 +145,9 @@ evt: {
var $evtElem = event.jQueryNode;
if ( $evtElem.hasClass( 'wikiEditor-template-label' ) ) {
// Allow anything if the command or control key are depressed
- if ( event.ctrlKey || event.metaKey ) return true;
+ if ( event.ctrlKey || event.metaKey ) {
+ return true;
+ }
switch ( event.which ) {
case 13: // Enter
$evtElem.click();
@@ -177,14 +182,22 @@ evt: {
}
}
},
- keyup: function( context, event ) {
+ /**
+ * @param context
+ * @param event
+ */
+ keyup: function( context ) {
// Rest our ignoreKeypress variable if it's set to true
if ( context.$iframe.data( 'ignoreKeypress' ) ) {
context.$iframe.data( 'ignoreKeypress', false );
}
return true;
},
- keypress: function( context, event ) {
+ /**
+ * @param context
+ * @param event
+ */
+ keypress: function( context ) {
// If this event is from a keydown event which we want to block, ignore it
return ( context.$iframe.data( 'ignoreKeypress' ) ? false : true );
}
@@ -210,7 +223,7 @@ fn: {
* @param context Context object of editor to create module in
* @param config Configuration object to create module from
*/
- create: function( context, config ) {
+ create: function( context ) {
// Initialize module within the context
context.modules.templateEditor = {};
},
@@ -220,8 +233,7 @@ fn: {
*/
wrapTemplate: function( $wrapper ) {
var model = $wrapper.data( 'model' );
- var context = $wrapper.data( 'marker' ).context;
- var $template = $wrapper
+ $wrapper
.wrap( '<span class="wikiEditor-template"></span>' )
.addClass( 'wikiEditor-template-text wikiEditor-template-text-shrunken' )
.parent()
@@ -249,7 +261,7 @@ fn: {
bindTemplateEvents: function( $wrapper ) {
var $template = $wrapper.parent( '.wikiEditor-template' );
- if ( typeof ( opera ) == "undefined" ) {
+ if ( typeof opera === 'undefined' ) {
$template.parent().attr('contentEditable', 'false');
}
@@ -274,7 +286,7 @@ fn: {
* Toggle the visisbilty of the wikitext for a given template
* @param $wrapper The origianl wrapper we want expand/collapse
*/
- toggleWikiTextEditor: function( $wrapper ) {
+ toggleWikiTextEditor: function( $wrapper ) {
var context = $wrapper.data( 'marker' ).context;
var $template = $wrapper.parent( '.wikiEditor-template' );
context.fn.purgeOffsets();
@@ -285,11 +297,11 @@ fn: {
var $templateText = $template.find( '.wikiEditor-template-text' );
$templateText.toggleClass( 'wikiEditor-template-text-shrunken' );
$templateText.toggleClass( 'wikiEditor-template-text-visible' );
- if( $templateText.hasClass('wikiEditor-template-text-shrunken') ){
+ if ( $templateText.hasClass('wikiEditor-template-text-shrunken') ){
//we just closed the template
// Update the model if we need to
- if ( $templateText.html() != $templateText.data( 'oldHTML' ) ) {
+ if ( $templateText.html() !== $templateText.data( 'oldHTML' ) ) {
var templateModel = $.wikiEditor.modules.templateEditor.fn.updateModel( $templateText );
//this is the only place the template name can be changed; keep the template name in sync
@@ -350,7 +362,7 @@ fn: {
var $templateText = $templateDiv.children( '.wikiEditor-template-text' );
var templateModel = $templateText.data( 'model' );
// Update the model if we need to
- if ( $templateText.html() != $templateText.data( 'oldHTML' ) ) {
+ if ( $templateText.html() !== $templateText.data( 'oldHTML' ) ) {
templateModel = $.wikiEditor.modules.templateEditor.fn.updateModel( $templateText );
}
@@ -362,11 +374,11 @@ fn: {
var $rows = $fields.find( '.wikiEditor-template-dialog-field-wrapper' );
for ( var paramIndex in params ) {
var param = params[paramIndex];
- if ( typeof param.name == 'undefined' ) {
+ if ( typeof param.name === 'undefined' ) {
// param is the template name, skip it
continue;
}
- var paramText = typeof param == 'string' ?
+ var paramText = typeof param === 'string' ?
param.name.replace( /[\_\-]/g, ' ' ) :
param.name;
var paramVal = templateModel.getValue( param.name );
@@ -397,11 +409,13 @@ fn: {
.data( 'expanded', false )
.bind( 'cut paste keypress click change', function( e ) {
// If this was fired by a tab keypress, let it go
- if ( e.keyCode == '9' ) return true;
+ if ( e.keyCode === 9 || e.keyCode === '9' ) {
+ return true;
+ }
var $this = $( this );
setTimeout( function() {
var expanded = $this.data( 'expanded' );
- if ( $this.val().indexOf( '\n' ) != -1 || $this.val().length > 24 ) {
+ if ( $this.val().indexOf( '\n' ) !== -1 || $this.val().length > 24 ) {
if ( !expanded ) {
$this.animate( { 'height': '4.5em' }, 'fast' );
$this.data( 'expanded', true );
@@ -455,7 +469,7 @@ fn: {
updateModel: function( $templateText, model ) {
var context = $templateText.data( 'marker' ).context;
var text;
- if ( typeof model == 'undefined' ) {
+ if ( typeof model === 'undefined' ) {
text = context.fn.htmlToText( $templateText.html() );
} else {
text = model.getText();
@@ -464,7 +478,7 @@ fn: {
$templateText.text( text );
$templateText.html( $templateText.html().replace( /\n/g, '<br />' ) );
$templateText.data( 'oldHTML', $templateText.html() );
- if ( typeof model == 'undefined' ) {
+ if ( typeof model === 'undefined' ) {
model = new $.wikiEditor.modules.templateEditor.fn.model( text );
$templateText.data( 'model', model );
}
@@ -476,9 +490,9 @@ fn: {
*/
getTemplateDisplayName: function ( model ) {
var tName = model.getName();
- if( model.getValue( 'name' ) != '' ) {
+ if( model.getValue( 'name' ) !== '' ) {
return tName + ': ' + model.getValue( 'name' );
- } else if( model.getValue( 'Name' ) != '' ) {
+ } else if( model.getValue( 'Name' ) !== '' ) {
return tName + ': ' + model.getValue( 'Name' );
} else if( tName.toLowerCase() in $.wikiEditor.modules.templateEditor.nameMappings ) {
return tName + ': ' + model.getValue( $.wikiEditor.modules.templateEditor.nameMappings[tName.toLowerCase()] );
@@ -541,27 +555,28 @@ fn: {
var retVal;
if ( isNaN( name ) ) {
// It's a string!
- if ( typeof paramsByName[name] == 'undefined' ) {
+ if ( typeof paramsByName[name] === 'undefined' ) {
// Does not exist
- return "";
+ return '';
}
rangeIndex = paramsByName[name];
} else {
// It's a number!
- rangeIndex = parseInt( name );
+ rangeIndex = parseInt( name, 10 );
}
- if ( typeof params[rangeIndex] == 'undefined' ) {
+ if ( typeof params[rangeIndex] === 'undefined' ) {
// Does not exist
- return "";
+ return '';
}
valueRange = ranges[params[rangeIndex].valueIndex];
- if ( typeof valueRange.newVal == 'undefined' || original ) {
+ if ( typeof valueRange.newVal === 'undefined' || original ) {
// Value unchanged, return original wikitext
retVal = wikitext.substring( valueRange.begin, valueRange.end );
} else {
// New value exists, return new value
retVal = valueRange.newVal;
}
+ /*jshint eqnull:true */
if ( value != null ) {
ranges[params[rangeIndex].valueIndex].newVal = value;
}
@@ -574,7 +589,7 @@ fn: {
* Get template name
*/
this.getName = function() {
- if( typeof ranges[templateNameIndex].newVal == 'undefined' ) {
+ if( typeof ranges[templateNameIndex].newVal === 'undefined' ) {
return wikitext.substring( ranges[templateNameIndex].begin, ranges[templateNameIndex].end );
} else {
return ranges[templateNameIndex].newVal;
@@ -635,9 +650,9 @@ fn: {
* Get modified template text
*/
this.getText = function() {
- newText = "";
- for ( i = 0 ; i < ranges.length; i++ ) {
- if( typeof ranges[i].newVal == 'undefined' ) {
+ var newText = "";
+ for ( var i = 0 ; i < ranges.length; i++ ) {
+ if( typeof ranges[i].newVal === 'undefined' ) {
newText += wikitext.substring( ranges[i].begin, ranges[i].end );
} else {
newText += ranges[i].newVal;
@@ -659,7 +674,7 @@ fn: {
var adjustment = 0;
for (var i = 0 ; i < ranges.length; i++ ) {
ranges[i].begin += adjustment;
- if( typeof ranges[i].adjust != 'undefined' ) {
+ if ( typeof ranges[i].adjust !== 'undefined' ) {
adjustment += ranges[i].adjust();
// NOTE: adjust should be a function that has the information necessary to calculate the length of
// this 'segment'
@@ -680,15 +695,16 @@ fn: {
// Get rid of first {{ with whitespace
var sanatizedStr = wikitext.replace( /{{/, " " );
// Replace end
- endBraces = sanatizedStr.match( /}}\s*$/ );
+ var endBraces = sanatizedStr.match( /}}\s*$/ );
if ( endBraces ) {
sanatizedStr = sanatizedStr.substring( 0, endBraces.index ) + " " +
sanatizedStr.substring( endBraces.index + 2 );
}
+ var startIndex, endIndex, sanatizedSegment, openBraces, brace;
//treat HTML comments like whitespace
- while ( sanatizedStr.indexOf( '<!' ) != -1 ) {
+ while ( sanatizedStr.indexOf( '<!' ) !== -1 ) {
startIndex = sanatizedStr.indexOf( '<!' );
endIndex = sanatizedStr.indexOf('-->') + 3;
if( endIndex < 3 ){
@@ -700,26 +716,26 @@ fn: {
}
// Match the open braces we just found with equivalent closing braces note, works for any level of braces
- while ( sanatizedStr.indexOf( '{{' ) != -1 ) {
+ while ( sanatizedStr.indexOf( '{{' ) !== -1 ) {
startIndex = sanatizedStr.indexOf( '{{' ) + 1;
openBraces = 2;
endIndex = startIndex;
while ( (openBraces > 0) && (endIndex < sanatizedStr.length) ) {
- var brace = sanatizedStr[++endIndex];
- openBraces += brace == '}' ? -1 : brace == '{' ? 1 : 0;
+ brace = sanatizedStr[++endIndex];
+ openBraces += brace === '}' ? -1 : brace === '{' ? 1 : 0;
}
sanatizedSegment = sanatizedStr.substring( startIndex,endIndex ).replace( /[{}|=]/g , 'X' );
sanatizedStr =
sanatizedStr.substring( 0, startIndex ) + sanatizedSegment + sanatizedStr.substring( endIndex );
}
//links, images, etc, which also can nest
- while ( sanatizedStr.indexOf( '[[' ) != -1 ) {
+ while ( sanatizedStr.indexOf( '[[' ) !== -1 ) {
startIndex = sanatizedStr.indexOf( '[[' ) + 1;
openBraces = 2;
endIndex = startIndex;
while ( (openBraces > 0) && (endIndex < sanatizedStr.length) ) {
- var brace = sanatizedStr[++endIndex];
- openBraces += brace == ']' ? -1 : brace == '[' ? 1 : 0;
+ brace = sanatizedStr[++endIndex];
+ openBraces += brace === ']' ? -1 : brace === '[' ? 1 : 0;
}
sanatizedSegment = sanatizedStr.substring( startIndex,endIndex ).replace( /[\[\]|=]/g , 'X' );
sanatizedStr =
@@ -733,14 +749,16 @@ fn: {
var params = [];
var templateNameIndex = 0;
var doneParsing = false;
- oldDivider = 0;
- divider = sanatizedStr.indexOf( '|', oldDivider );
- if ( divider == -1 ) {
+ var oldDivider = 0;
+ var divider = sanatizedStr.indexOf( '|', oldDivider );
+ if ( divider === -1 ) {
divider = sanatizedStr.length;
doneParsing = true;
collapsible = false; //zero params
}
- nameMatch = sanatizedStr.substring( 0, divider ).match( /[^\s]/ );
+ var nameMatch = sanatizedStr.substring( 0, divider ).match( /[^\s]/ );
+ var nameEndMatch;
+ /*jshint eqnull:true */
if ( nameMatch != null ) {
ranges.push( new Range( 0 ,nameMatch.index ) ); //whitespace and squiggles upto the name
nameEndMatch = sanatizedStr.substring( 0 , divider ).match( /[^\s]\s*$/ ); //last nonwhitespace character
@@ -758,18 +776,21 @@ fn: {
* Start looping over params
*/
var currentParamNumber = 0;
+ var currentField, currentValue, valueBeginIndex, valueBegin, valueEnd;
+ var nameIndex, equalsIndex, valueIndex;
+ var currentName, nameBegin, nameBeginIndex, nameEnd, nameEndIndex;
var valueEndIndex = ranges[templateNameIndex].end;
var paramsByName = [];
while ( !doneParsing ) {
currentParamNumber++;
oldDivider = divider;
divider = sanatizedStr.indexOf( '|', oldDivider + 1 );
- if ( divider == -1 ) {
+ if ( divider === -1 ) {
divider = sanatizedStr.length;
doneParsing = true;
}
currentField = sanatizedStr.substring( oldDivider+1, divider );
- if ( currentField.indexOf( '=' ) == -1 ) {
+ if ( currentField.indexOf( '=' ) === -1 ) {
// anonymous field, gets a number
//default values, since we'll allow empty values
diff --git a/extensions/WikiEditor/modules/jquery.wikiEditor.templates.js b/extensions/WikiEditor/modules/jquery.wikiEditor.templates.js
index b303e3fa..b0462563 100644
--- a/extensions/WikiEditor/modules/jquery.wikiEditor.templates.js
+++ b/extensions/WikiEditor/modules/jquery.wikiEditor.templates.js
@@ -1,22 +1,23 @@
/* Templates Module for wikiEditor */
-( function( $ ) { $.wikiEditor.modules.templates = {
+/*jshint onevar:false */
+( function ( $ ) { $.wikiEditor.modules.templates = {
/**
* Core Requirements
*/
-'req': [ 'iframe' ],
+req: [ 'iframe' ],
/**
* Object Templates
*/
-'tpl': {
- 'marker': {
- 'type': 'template',
- 'anchor': 'wrap',
- 'skipDivision': 'realchange',
- 'afterWrap': function( node ) {
+tpl: {
+ marker: {
+ type: 'template',
+ anchor: 'wrap',
+ skipDivision: 'realchange',
+ afterWrap: function ( node ) {
$( node ).addClass( 'wikiEditor-template' );
},
- 'getAnchor': function( ca1, ca2 ) {
+ getAnchor: function ( ca1 ) {
return $( ca1.parentNode ).is( '.wikiEditor-template' ) ? ca1.parentNode : null;
}
}
@@ -24,10 +25,14 @@
/**
* Event handlers
*/
-'evt': {
- 'mark': function( context, event ) {
+evt: {
+ /**
+ * @param context
+ * @param event
+ */
+ mark: function ( context ) {
// The markers returned by this function are skipped on realchange, so don't regenerate them in that case
- if ( context.modules.highlight.currentScope == 'realchange' ) {
+ if ( context.modules.highlight.currentScope === 'realchange' ) {
return;
}
// Get references to the markers and tokens from the current context
@@ -36,14 +41,14 @@
// Use depth-tracking to extract top-level templates from tokens
var depth = 0, bias, start;
for ( var i in tokens ) {
- depth += ( bias = tokens[i].label == 'TEMPLATE_BEGIN' ? 1 : ( tokens[i].label == 'TEMPLATE_END' ? -1 : 0 ) );
- if ( bias > 0 && depth == 1 ) {
+ depth += ( bias = tokens[i].label === 'TEMPLATE_BEGIN' ? 1 : ( tokens[i].label === 'TEMPLATE_END' ? -1 : 0 ) );
+ if ( bias > 0 && depth === 1 ) {
// Top-level opening - use offset as start
start = tokens[i].offset;
- } else if ( bias < 0 && depth == 0 ) {
+ } else if ( bias < 0 && depth === 0 ) {
// Top-level closing - use offset as end
markers[markers.length] = $.extend(
- { 'context': context, 'start': start, 'end': tokens[i].offset },
+ { context: context, start: start, end: tokens[i].offset },
$.wikiEditor.modules.templates.tpl.marker
);
}
@@ -53,15 +58,19 @@
}
}
},
-'exp': [
- { 'regex': /{{/, 'label': "TEMPLATE_BEGIN" },
- { 'regex': /}}/, 'label': "TEMPLATE_END", 'markAfter': true }
+exp: [
+ { regex: /{{/, label: 'TEMPLATE_BEGIN' },
+ { regex: /}}/, label: 'TEMPLATE_END', markAfter: true }
],
/**
* Internally used functions
*/
-'fn': {
- 'create': function( context, config ) {
+fn: {
+ /**
+ * @param context
+ * @param config
+ */
+ create: function () {
// Do some stuff here...
}
}
diff --git a/extensions/WikiEditor/modules/jquery.wikiEditor.toc.js b/extensions/WikiEditor/modules/jquery.wikiEditor.toc.js
index 54b8a863..3f186db6 100644
--- a/extensions/WikiEditor/modules/jquery.wikiEditor.toc.js
+++ b/extensions/WikiEditor/modules/jquery.wikiEditor.toc.js
@@ -1,31 +1,32 @@
/* TOC Module for wikiEditor */
-( function( $ ) { $.wikiEditor.modules.toc = {
+/*jshint onevar:false */
+( function ( $, mw ) { $.wikiEditor.modules.toc = {
/**
* Compatability map
*/
-'browsers': {
+browsers: {
// Left-to-right languages
- 'ltr': {
- 'msie': [['>=', 7]],
- 'firefox': [['>=', 3]],
- 'opera': [['>=', 10]],
- 'safari': [['>=', 4]],
- 'chrome': [['>=', 4]]
+ ltr: {
+ msie: [['>=', 7]],
+ firefox: [['>=', 3]],
+ opera: [['>=', 10]],
+ safari: [['>=', 4]],
+ chrome: [['>=', 4]]
},
// Right-to-left languages
- 'rtl': {
- 'msie': [['>=', 8]],
- 'firefox': [['>=', 3]],
- 'opera': [['>=', 10]],
- 'safari': [['>=', 4]],
- 'chrome': [['>=', 4]]
+ rtl: {
+ msie: [['>=', 8]],
+ firefox: [['>=', 3]],
+ opera: [['>=', 10]],
+ safari: [['>=', 4]],
+ chrome: [['>=', 4]]
}
},
/**
* Core Requirements
*/
-'req': [ 'iframe' ],
+req: [ 'iframe' ],
/**
* Configuration
*/
@@ -51,10 +52,18 @@ api: {
* Event handlers
*/
evt: {
- change: function( context, event ) {
+ /**
+ * @param context
+ * @param event
+ */
+ change: function( context ) {
$.wikiEditor.modules.toc.fn.update( context );
},
- ready: function( context, event ) {
+ /**
+ * @param context
+ * @param event
+ */
+ ready: function( context ) {
// Add the TOC to the document
$.wikiEditor.modules.toc.fn.build( context );
if ( !context.$content ) {
@@ -68,28 +77,32 @@ evt: {
$.wikiEditor.modules.toc.fn.improveUI();
$.wikiEditor.modules.toc.evt.resize( context );
},
- resize: function( context, event ) {
+ /**
+ * @param context
+ * @param event
+ */
+ resize: function( context ) {
var availableWidth = context.$wikitext.width() - parseFloat( $.wikiEditor.modules.toc.cfg.textMinimumWidth ),
totalMinWidth = parseFloat( $.wikiEditor.modules.toc.cfg.minimumWidth ) +
parseFloat( $.wikiEditor.modules.toc.cfg.textMinimumWidth );
context.$ui.find( '.wikiEditor-ui-right' )
.resizable( 'option', 'maxWidth', availableWidth );
- if ( context.modules.toc.$toc.data( 'positionMode' ) != 'disabled' &&
+ if ( context.modules.toc.$toc.data( 'positionMode' ) !== 'disabled' &&
context.$wikitext.width() < totalMinWidth ) {
$.wikiEditor.modules.toc.fn.disable( context );
- } else if ( context.modules.toc.$toc.data( 'positionMode' ) == 'disabled' &&
+ } else if ( context.modules.toc.$toc.data( 'positionMode' ) === 'disabled' &&
context.$wikitext.width() > totalMinWidth ) {
$.wikiEditor.modules.toc.fn.enable( context );
- } else if ( context.modules.toc.$toc.data( 'positionMode' ) == 'regular' &&
+ } else if ( context.modules.toc.$toc.data( 'positionMode' ) === 'regular' &&
context.$ui.find( '.wikiEditor-ui-right' ).width() > availableWidth ) {
//switch mode
$.wikiEditor.modules.toc.fn.switchLayout( context );
- } else if ( context.modules.toc.$toc.data( 'positionMode' ) == 'goofy' &&
+ } else if ( context.modules.toc.$toc.data( 'positionMode' ) === 'goofy' &&
context.modules.toc.$toc.data( 'previousWidth' ) < context.$wikitext.width() ) {
//switch mode
$.wikiEditor.modules.toc.fn.switchLayout( context );
}
- if ( context.modules.toc.$toc.data( 'positionMode' ) == 'goofy' ) {
+ if ( context.modules.toc.$toc.data( 'positionMode' ) === 'goofy' ) {
context.modules.toc.$toc.find( 'div' ).autoEllipsis(
{ 'position': 'right', 'tooltip': true, 'restoreText': true }
);
@@ -105,14 +118,18 @@ evt: {
// store the width of the view for comparison on next resize
context.modules.toc.$toc.data( 'previousWidth', context.$wikitext.width() );
},
- mark: function( context, event ) {
+ /**
+ * @param context
+ * @param event
+ */
+ mark: function( context ) {
var hash = '';
var markers = context.modules.highlight.markers;
var tokenArray = context.modules.highlight.tokenArray;
var outline = context.data.outline = [];
var h = 0;
for ( var i = 0; i < tokenArray.length; i++ ) {
- if ( tokenArray[i].label != 'TOC_HEADER' ) {
+ if ( tokenArray[i].label !== 'TOC_HEADER' ) {
continue;
}
h++;
@@ -134,14 +151,14 @@ evt: {
},
onSkip: function( node ) {
var marker = $( node ).data( 'marker' );
- if ( $( node ).data( 'section' ) != marker.index ) {
+ if ( $( node ).data( 'section' ) !== marker.index ) {
$( node )
.removeClass( 'wikiEditor-toc-section-' + $( node ).data( 'section' ) )
.addClass( 'wikiEditor-toc-section-' + marker.index )
.data( 'section', marker.index );
}
},
- getAnchor: function( ca1, ca2 ) {
+ getAnchor: function( ca1 ) {
return $( ca1.parentNode ).is( '.wikiEditor-toc-header' ) ?
ca1.parentNode : null;
}
@@ -154,7 +171,7 @@ evt: {
} );
}
// Only update the TOC if it's been changed - we do this by comparing a hash of the headings this time to last
- if ( typeof context.modules.toc.lastHash == 'undefined' || context.modules.toc.lastHash !== hash ) {
+ if ( typeof context.modules.toc.lastHash === 'undefined' || context.modules.toc.lastHash !== hash ) {
$.wikiEditor.modules.toc.fn.build( context );
$.wikiEditor.modules.toc.fn.update( context );
// Remember the changed version
@@ -175,13 +192,13 @@ fn: {
* @param {Object} context Context object of editor to create module in
* @param {Object} config Configuration object to create module from
*/
- create: function( context, config ) {
+ create: function( context ) {
if ( '$toc' in context.modules.toc ) {
return;
}
$.wikiEditor.modules.toc.cfg.rtl = $( 'body' ).is( '.rtl' );
$.wikiEditor.modules.toc.cfg.flexProperty = $.wikiEditor.modules.toc.cfg.rtl ? 'marginLeft' : 'marginRight';
- var height = context.$ui.find( '.wikiEditor-ui-left' ).height();
+ context.$ui.find( '.wikiEditor-ui-left' ).height();
context.modules.toc.$toc = $( '<div>' )
.addClass( 'wikiEditor-ui-toc' )
.data( 'context', context )
@@ -196,14 +213,14 @@ fn: {
},
redraw: function( context, fixedWidth ) {
fixedWidth = parseFloat( fixedWidth );
- if( context.modules.toc.$toc.data( 'positionMode' ) == 'regular' ) {
+ if ( context.modules.toc.$toc.data( 'positionMode' ) === 'regular' ) {
context.$ui.find( '.wikiEditor-ui-right' )
.css( 'width', fixedWidth + 'px' );
context.$ui.find( '.wikiEditor-ui-left' )
.css( $.wikiEditor.modules.toc.cfg.flexProperty, ( -1 * fixedWidth ) + 'px' )
.children()
.css( $.wikiEditor.modules.toc.cfg.flexProperty, fixedWidth + 'px' );
- } else if( context.modules.toc.$toc.data( 'positionMode' ) == 'goofy' ) {
+ } else if( context.modules.toc.$toc.data( 'positionMode' ) === 'goofy' ) {
context.$ui.find( '.wikiEditor-ui-left' )
.css( 'width', fixedWidth );
context.$ui.find( '.wikiEditor-ui-right' )
@@ -212,10 +229,10 @@ fn: {
}
},
switchLayout: function( context ) {
- var width,
- height = context.$ui.find( '.wikiEditor-ui-right' ).height();
- if ( context.modules.toc.$toc.data( 'positionMode' ) == 'regular'
- && !context.modules.toc.$toc.data( 'collapsed' )
+ var width;
+ context.$ui.find( '.wikiEditor-ui-right' ).height();
+ if ( context.modules.toc.$toc.data( 'positionMode' ) === 'regular' &&
+ !context.modules.toc.$toc.data( 'collapsed' )
) {
// store position mode
context.modules.toc.$toc.data( 'positionMode', 'goofy' );
@@ -237,7 +254,7 @@ fn: {
'left' : $.wikiEditor.modules.toc.cfg.rtl ? 0 : 'auto' } );
context.$wikitext
.css( 'position', 'relative' );
- } else if ( context.modules.toc.$toc.data( 'positionMode' ) == 'goofy' ) {
+ } else if ( context.modules.toc.$toc.data( 'positionMode' ) === 'goofy' ) {
// store position mode
context.modules.toc.$toc.data( 'positionMode', 'regular' );
// set width
@@ -260,7 +277,7 @@ fn: {
if ( context.modules.toc.$toc.data( 'collapsed' ) ) {
context.$ui.find( '.wikiEditor-ui-toc-expandControl' ).hide();
} else {
- if( context.modules.toc.$toc.data( 'positionMode' ) == 'goofy' ) {
+ if( context.modules.toc.$toc.data( 'positionMode' ) === 'goofy' ) {
$.wikiEditor.modules.toc.fn.switchLayout( context );
}
context.$ui.find( '.wikiEditor-ui-right' ).hide();
@@ -296,7 +313,7 @@ fn: {
*
* @param {Object} context
*/
- update: function( context ) {
+ update: function () {
//temporarily commenting this out because it is causing all kinds of cursor
//and text jumping issues in IE. WIll get back to this --pdhanda
/*
@@ -333,10 +350,10 @@ fn: {
*
* @param {Object} event Event object with context as data
*/
- collapse: function( event ) {
+ collapse: function () {
var $this = $( this ),
context = $this.data( 'context' );
- if( context.modules.toc.$toc.data( 'positionMode' ) == 'goofy' ) {
+ if ( context.modules.toc.$toc.data( 'positionMode' ) === 'goofy' ) {
$.wikiEditor.modules.toc.fn.switchLayout( context );
}
var pT = $this.parent().position().top - 1;
@@ -366,7 +383,7 @@ fn: {
// Let the UI know things have moved around
context.fn.trigger( 'tocCollapse' );
context.fn.trigger( 'resize' );
- } );
+ } );
$.cookie( 'wikiEditor-' + context.instance + '-toc-width', 0 );
return false;
@@ -377,15 +394,19 @@ fn: {
*
* @param {Object} event Event object with context as data
*/
- expand: function( event ) {
+ expand: function () {
var $this = $( this ),
context = $this.data( 'context' ),
openWidth = parseFloat( context.modules.toc.$toc.data( 'openWidth' ) ),
availableSpace = context.$wikitext.width() - parseFloat( $.wikiEditor.modules.toc.cfg.textMinimumWidth );
- if ( availableSpace < $.wikiEditor.modules.toc.cfg.textMinmumWidth ) return false;
+ if ( availableSpace < $.wikiEditor.modules.toc.cfg.textMinmumWidth ) {
+ return false;
+ }
context.modules.toc.$toc.data( 'collapsed', false );
// check if we've got enough room to open to our stored width
- if ( availableSpace < openWidth ) openWidth = availableSpace;
+ if ( availableSpace < openWidth ) {
+ openWidth = availableSpace;
+ }
context.$ui.find( '.wikiEditor-ui-toc-expandControl' ).hide();
var leftParam = {}, leftChildParam = {};
leftParam[ $.wikiEditor.modules.toc.cfg.flexProperty ] = parseFloat( openWidth ) * -1;
@@ -407,7 +428,7 @@ fn: {
'top': 'auto' } );
context.fn.trigger( 'tocExpand' );
context.fn.trigger( 'resize' );
- } );
+ } );
$.cookie( 'wikiEditor-' + context.instance + '-toc-width',
context.modules.toc.$toc.data( 'openWidth' ) );
return false;
@@ -432,7 +453,7 @@ fn: {
}
var sections = [];
for ( var i = offset; i < outline.length; i++ ) {
- if ( outline[i].nLevel == level ) {
+ if ( outline[i].nLevel === level ) {
var sub = buildStructure( outline, i + 1, level + 1 );
if ( sub.length ) {
outline[i].sections = sub;
@@ -462,8 +483,9 @@ fn: {
.click( function( event ) {
var wrapper = context.$content.find(
'.wikiEditor-toc-section-' + $( this ).data( 'index' ) );
- if ( wrapper.length === 0 )
+ if ( wrapper.length === 0 ) {
wrapper = context.$content;
+ }
context.fn.scrollToTop( wrapper, true );
context.$textarea.textSelection( 'setSelection', {
'start': 0,
@@ -481,8 +503,9 @@ fn: {
event.preventDefault();
} )
.text( structure[i].text );
- if ( structure[i].text === '' )
+ if ( structure[i].text === '' ) {
div.html( '&nbsp;' );
+ }
var item = $( '<li>' ).append( div );
if ( structure[i].sections !== undefined ) {
item.append( buildList( structure[i].sections ) );
@@ -546,7 +569,7 @@ fn: {
.data( 'wikiEditor-ui-left', context.$ui.find( '.wikiEditor-ui-left' ) )
.resizable( { handles: 'w,e', preventPositionLeftChange: true,
minWidth: parseFloat( $.wikiEditor.modules.toc.cfg.minimumWidth ),
- start: function( e, ui ) {
+ start: function () {
var $this = $( this );
// Toss a transparent cover over our iframe
$( '<div>' )
@@ -562,7 +585,7 @@ fn: {
.appendTo( context.$ui.find( '.wikiEditor-ui-left' ) );
$this.resizable( 'option', 'maxWidth', $this.parent().width() -
parseFloat( $.wikiEditor.modules.toc.cfg.textMinimumWidth ) );
- if(context.modules.toc.$toc.data( 'positionMode' ) == 'goofy' ) {
+ if ( context.modules.toc.$toc.data( 'positionMode' ) === 'goofy' ) {
$.wikiEditor.modules.toc.fn.switchLayout( context );
}
},
@@ -596,7 +619,7 @@ fn: {
var handle = $.wikiEditor.modules.toc.cfg.rtl ? 'w' : 'e';
context.$ui.find( '.ui-resizable-' + handle )
.removeClass( 'ui-resizable-' + handle )
- .addClass( 'ui-resizable-' + ( handle == 'w' ? 'e' : 'w' ) )
+ .addClass( 'ui-resizable-' + ( handle === 'w' ? 'e' : 'w' ) )
.addClass( 'wikiEditor-ui-toc-resize-grip' );
// Bind collapse and expand event handlers to the TOC
context.modules.toc.$toc
@@ -604,12 +627,13 @@ fn: {
.bind( 'expand.wikiEditor-toc', $.wikiEditor.modules.toc.fn.expand );
context.modules.toc.$toc.data( 'openWidth', $.wikiEditor.modules.toc.cfg.defaultWidth );
// If the toc-width cookie is set, reset the widths based upon that
- if ( $.cookie( 'wikiEditor-' + context.instance + '-toc-width' ) == 0 ) {
+ if ( $.cookie( 'wikiEditor-' + context.instance + '-toc-width' ) === 0 ) {
context.modules.toc.$toc.trigger( 'collapse.wikiEditor-toc', { data: context } );
} else if ( $.cookie( 'wikiEditor-' + context.instance + '-toc-width' ) > 0 ) {
var initialWidth = $.cookie( 'wikiEditor-' + context.instance + '-toc-width' );
- if( initialWidth < parseFloat( $.wikiEditor.modules.toc.cfg.minimumWidth ) )
+ if ( initialWidth < parseFloat( $.wikiEditor.modules.toc.cfg.minimumWidth ) ) {
initialWidth = parseFloat( $.wikiEditor.modules.toc.cfg.minimumWidth ) + 1;
+ }
context.modules.toc.$toc.data( 'openWidth', initialWidth + 'px' );
$.wikiEditor.modules.toc.fn.redraw( context, initialWidth );
}
@@ -664,7 +688,7 @@ fn: {
* Extending resizable to allow west resizing without altering the left position attribute
*/
$.ui.plugin.add( 'resizable', 'preventPositionLeftChange', {
- resize: function( event, ui ) {
+ resize: function () {
$( this ).data( 'resizable' ).position.left = 0;
}
} );
@@ -673,4 +697,4 @@ fn: {
};
-} ) ( jQuery );
+} )( jQuery, mediaWiki );
diff --git a/extensions/WikiEditor/modules/jquery.wikiEditor.toolbar.config.js b/extensions/WikiEditor/modules/jquery.wikiEditor.toolbar.config.js
index c9d0f797..780eb2c3 100644
--- a/extensions/WikiEditor/modules/jquery.wikiEditor.toolbar.config.js
+++ b/extensions/WikiEditor/modules/jquery.wikiEditor.toolbar.config.js
@@ -1,7 +1,8 @@
/**
* Configuration of Toolbar module for wikiEditor
*/
-( function( $ ) { $.wikiEditor.modules.toolbar.config = {
+/*jshint camelcase:false, quotmark:false */
+( function ( $, mw ) { $.wikiEditor.modules.toolbar.config = {
getDefaultConfig: function() {
var fileNamespace = mw.config.get( 'wgFormattedNamespaces' )[6];
@@ -45,6 +46,7 @@ getDefaultConfig: function() {
'hu': 'format-bold-F.png',
'it': 'format-bold-G.png',
'ka': 'format-bold-ka.png',
+ 'ky': 'format-bold-ru.png',
'nl': 'format-bold-V.png',
'os': 'format-bold-os.png',
'pt': 'format-bold-N.png',
@@ -78,6 +80,7 @@ getDefaultConfig: function() {
'es': [2, -790],
'he': [2, -862],
'it': [2, -790],
+ 'ky': [2, -934],
'nl': [2, -790],
'pt': [2, -862],
'pt-br': [2, -862],
@@ -98,6 +101,7 @@ getDefaultConfig: function() {
'hu': 'format-italic-D.png',
'it': 'format-italic-C.png',
'ka': 'format-italic-ka.png',
+ 'ky': 'format-italic-K.png',
'nl': 'format-italic-C.png',
'os': 'format-italic-K.png',
'pt': 'format-italic-I.png',
@@ -812,7 +816,7 @@ getDefaultConfig: function() {
"\u047A", "\u047B", // Round Omega (old cyrillic)
"\u047c", "\u047d", // Cyr Omega with Titlo (old cyrillic)
"\u047e", "\u047f", // Cyr Ot (old cyrillic)
- "\u0480", "\u0481", // Cyr Koppa (old cyrillic)
+ "\u0480", "\u0481" // Cyr Koppa (old cyrillic)
]
},
// The core 28-letter alphabet, special letters for the Arabic language,
@@ -1449,4 +1453,4 @@ getDefaultConfig: function() {
} };
}
-}; } ) ( jQuery );
+}; } ) ( jQuery, mediaWiki );
diff --git a/extensions/WikiEditor/modules/jquery.wikiEditor.toolbar.js b/extensions/WikiEditor/modules/jquery.wikiEditor.toolbar.js
index b43dff47..71592b53 100644
--- a/extensions/WikiEditor/modules/jquery.wikiEditor.toolbar.js
+++ b/extensions/WikiEditor/modules/jquery.wikiEditor.toolbar.js
@@ -1,6 +1,7 @@
/**
* Toolbar module for wikiEditor
*/
+/*jshint onevar:false */
( function ( mw, $ ) { $.wikiEditor.modules.toolbar = {
/**
@@ -17,7 +18,7 @@ api : {
var $sections = context.modules.toolbar.$toolbar.find( 'div.sections' ),
$tabs = context.modules.toolbar.$toolbar.find( 'div.tabs' );
for ( var section in data[type] ) {
- if ( section == 'main' ) {
+ if ( section === 'main' ) {
// Section
context.modules.toolbar.$toolbar.prepend(
$.wikiEditor.modules.toolbar.fn.buildSection(
@@ -145,28 +146,28 @@ api : {
}
},
removeFromToolbar : function( context, data ) {
- if ( typeof data.section == 'string' ) {
+ if ( typeof data.section === 'string' ) {
// Section
var tab = 'div.tabs span[rel="' + data.section + '"].tab';
var target = 'div[rel="' + data.section + '"].section';
var group = null;
- if ( typeof data.group == 'string' ) {
+ if ( typeof data.group === 'string' ) {
// Toolbar group
target += ' div[rel="' + data.group + '"].group';
- if ( typeof data.tool == 'string' ) {
+ if ( typeof data.tool === 'string' ) {
// Save for later checking if empty
group = target;
// Tool
target += ' a[rel="' + data.tool + '"].tool';
}
- } else if ( typeof data.page == 'string' ) {
+ } else if ( typeof data.page === 'string' ) {
// Booklet page
var index = target + ' div.index div[rel="' + data.page + '"]';
target += ' div.pages div[rel="' + data.page + '"].page';
- if ( typeof data.character == 'string' ) {
+ if ( typeof data.character === 'string' ) {
// Character
target += ' span[rel="' + data.character + '"]';
- } else if ( typeof data.row == 'number' ) {
+ } else if ( typeof data.row === 'number' ) {
// Table row
target += ' table tr:not(:has(th)):eq(' + data.row + ')';
} else {
@@ -198,7 +199,11 @@ api : {
* Event handlers
*/
evt: {
- resize: function( context, event ) {
+ /**
+ * @param context
+ * @param event
+ */
+ resize: function( context ) {
context.$ui.find( '.sections' ).height( context.$ui.find( '.sections .section-visible' ).outerHeight() );
},
tocCollapse: function( context, event ) {
@@ -235,7 +240,7 @@ fn: {
* @param {Object} action
* @param {Object} source
*/
- doAction : function( context, action, source ) {
+ doAction : function( context, action ) {
switch ( action.type ) {
case 'replace':
case 'encapsulate':
@@ -244,7 +249,7 @@ fn: {
'peri' : $.wikiEditor.autoMsg( action.options, 'peri' ),
'post' : $.wikiEditor.autoMsg( action.options, 'post' )
};
- var replace = action.type == 'replace';
+ var replace = action.type === 'replace';
if ( 'regex' in action.options && 'regexReplace' in action.options ) {
var selection = context.$textarea.textSelection( 'getSelection' );
if ( selection !== '' && selection.match( action.options.regex ) ) {
@@ -263,7 +268,7 @@ fn: {
}
break;
case 'callback':
- if ( typeof action.execute == 'function' ) {
+ if ( typeof action.execute === 'function' ) {
action.execute( context );
}
break;
@@ -287,7 +292,7 @@ fn: {
if ( tool ) {
// Consider a group with only hidden tools empty as well
// .is( ':visible' ) always returns false because tool is not attached to the DOM yet
- empty = empty && tool.css( 'display' ) == 'none';
+ empty = empty && tool.css( 'display' ) === 'none';
$group.append( tool );
}
}
@@ -314,13 +319,13 @@ fn: {
var offsetOrIcon = $.wikiEditor.autoIconOrOffset( tool.icon, tool.offset,
$.wikiEditor.imgPath + 'toolbar/'
);
- if ( typeof offsetOrIcon == 'object' ) {
+ if ( typeof offsetOrIcon === 'object' ) {
$button = $( '<a/>' )
.attr( {
'href' : '#',
- 'alt' : label,
'title' : label,
'rel' : id,
+ 'role' : 'button',
'class' : 'tool tool-button wikiEditor-toolbar-spritedButton'
} )
.text( label )
@@ -336,6 +341,7 @@ fn: {
'alt' : label,
'title' : label,
'rel' : id,
+ 'role' : 'button',
'class' : 'tool tool-button'
} );
}
@@ -446,7 +452,7 @@ fn: {
} );
},
buildPage : function( context, id, page ) {
- var html;
+ var html, i;
var $page = $( '<div/>' ).attr( {
'class' : 'page page-' + id,
'rel' : id
@@ -460,7 +466,7 @@ fn: {
html += $.wikiEditor.modules.toolbar.fn.buildHeading( context, page.headings );
}
if ( 'rows' in page ) {
- for ( var i = 0; i < page.rows.length; i++ ) {
+ for ( i = 0; i < page.rows.length; i++ ) {
html += $.wikiEditor.modules.toolbar.fn.buildRow( context, page.rows[i] );
}
}
@@ -483,7 +489,7 @@ fn: {
}
if ( 'characters' in page ) {
html = '';
- for ( var i = 0; i < page.characters.length; i++ ) {
+ for ( i = 0; i < page.characters.length; i++ ) {
html += $.wikiEditor.modules.toolbar.fn.buildCharacter( page.characters[i], actions );
}
$characters
@@ -526,7 +532,7 @@ fn: {
return html + '</tr>';
},
buildCharacter : function( character, actions ) {
- if ( typeof character == 'string' ) {
+ if ( typeof character === 'string' ) {
character = {
'label' : character,
'action' : {
@@ -563,8 +569,9 @@ fn: {
return mw.html.element( 'span', { 'rel': character.label }, character.label );
}
}
- mw.log( "A character for the toolbar was undefined. This is not supposed to happen. Double check the config." );
- return ""; // bug 31673; also an additional fix for bug 24208...
+ mw.log( 'A character for the toolbar was undefined. This is not supposed to happen. Double check the config.' );
+ // bug 31673; also an additional fix for bug 24208...
+ return '';
},
buildTab : function( context, id, section ) {
var selected = $.cookie( 'wikiEditor-' + context.instance + '-toolbar-section' );
@@ -574,11 +581,16 @@ fn: {
}
var $link =
$( '<a/>' )
- .addClass( selected == id ? 'current' : null )
- .attr( 'href', '#' )
+ .addClass( selected === id ? 'current' : null )
+ .attr( {
+ href: '#',
+ role: 'button',
+ 'aria-pressed': 'false',
+ 'aria-controls': 'wikiEditor-section-' + id
+ } )
.text( $.wikiEditor.autoMsg( section, 'label' ) )
.data( 'context', context )
- .mouseup( function( e ) {
+ .mouseup( function () {
$(this).blur();
} )
.mousedown( function( e ) {
@@ -587,14 +599,23 @@ fn: {
return false;
} )
.click( function( e ) {
+ // We have to set aria-pressed over here, as NVDA wont recognize it
+ // if we do it in the below .each as it seems
+ $(this).attr( 'aria-pressed', 'true' );
+ $( '.tab > a' ).each( function( i, elem ) {
+ if ( elem !== e.target ) {
+ $( elem ).attr( 'aria-pressed', 'false' );
+ }
+ } );
var $sections = $(this).data( 'context' ).$ui.find( '.sections' );
var $section =
$(this).data( 'context' ).$ui.find( '.section-' + $(this).parent().attr( 'rel' ) );
- var show = $section.css( 'display' ) == 'none';
- var $previousSections = $section.parent().find( '.section-visible' );
- $previousSections.css( 'position', 'absolute' );
- $previousSections.removeClass( 'section-visible' );
- $previousSections.fadeOut( 'fast', function() { $(this).css( 'position', 'static' ); } );
+ var show = $section.css( 'display' ) === 'none';
+ $section.parent().find( '.section-visible' )
+ .css( 'position', 'absolute' )
+ .attr( 'aria-expanded', 'false' )
+ .removeClass( 'section-visible' )
+ .fadeOut( 'fast', function() { $(this).css( 'position', 'static' ); } );
$(this).parent().parent().find( 'a' ).removeClass( 'current' );
$sections.css( 'overflow', 'hidden' );
var animate = function( $that ) {
@@ -606,8 +627,9 @@ fn: {
} );
};
if ( show ) {
- $section.addClass( 'section-visible' );
- $section.fadeIn( 'fast' );
+ $section.addClass( 'section-visible' )
+ .attr( 'aria-expanded', 'true' )
+ .fadeIn( 'fast' );
if ( $section.hasClass( 'loading' ) ) {
// Loading of this section was deferred, load it now
var $that = $(this);
@@ -646,9 +668,13 @@ fn: {
.append( $link );
},
buildSection: function( context, id, section ) {
- var $section = $( '<div/>' ).attr( { 'class': section.type + ' section section-' + id, 'rel': id } );
+ var $section = $( '<div/>' ).attr( {
+ 'class': section.type + ' section section-' + id,
+ 'rel': id,
+ id: 'wikiEditor-section-' + id
+ } );
var selected = $.cookie( 'wikiEditor-' + context.instance + '-toolbar-section' );
- var show = selected == id;
+ var show = selected === id;
if ( section.deferLoad !== undefined && section.deferLoad && id !== 'main' && !show ) {
// This class shows the spinner and serves as a marker for the click handler in buildTab()
@@ -663,7 +689,10 @@ fn: {
// Show or hide section
if ( id !== 'main' ) {
- $section.css( 'display', show ? 'block' : 'none' );
+ $section
+ .css( 'display', show ? 'block' : 'none' )
+ .attr( 'aria-expanded', show ? 'true' : 'false' );
+
if ( show ) {
$section.addClass( 'section-visible' );
}
@@ -701,6 +730,7 @@ fn: {
}
},
updateBookletSelection : function( context, id, $pages, $index ) {
+ /*jshint eqnull:true */
var cookie = 'wikiEditor-' + context.instance + '-booklet-' + id + '-page';
var selected = $.cookie( cookie );
// Re-save cookie
@@ -724,7 +754,7 @@ fn: {
context.modules.toolbar.$toolbar.append( $( '<div/>' ).css( 'clear', 'both' ) );
var sectionQueue = [];
for ( var section in config ) {
- if ( section == 'main' ) {
+ if ( section === 'main' ) {
context.modules.toolbar.$toolbar.prepend(
$.wikiEditor.modules.toolbar.fn.buildSection( context, section, config[section] )
);
diff --git a/img_auth.php b/img_auth.php
index ccaa8af0..c8759ec8 100644
--- a/img_auth.php
+++ b/img_auth.php
@@ -40,11 +40,7 @@
*/
define( 'MW_NO_OUTPUT_COMPRESSION', 1 );
-if ( isset( $_SERVER['MW_COMPILED'] ) ) {
- require ( 'core/includes/WebStart.php' );
-} else {
- require ( __DIR__ . '/includes/WebStart.php' );
-}
+require __DIR__ . '/includes/WebStart.php';
wfProfileIn( 'img_auth.php' );
# Set action base paths so that WebRequest::getPathInfo()
@@ -117,6 +113,8 @@ function wfImageAuthMain() {
}
// Run hook for extension authorization plugins
+ /** @var $result array */
+ $result = null;
if ( !wfRunHooks( 'ImgAuthBeforeStream', array( &$title, &$path, &$name, &$result ) ) ) {
wfForbidden( $result[0], $result[1], array_slice( $result, 2 ) );
return;
diff --git a/includes/Action.php b/includes/Action.php
index 2e0c88ba..4b6e4468 100644
--- a/includes/Action.php
+++ b/includes/Action.php
@@ -59,7 +59,7 @@ abstract class Action {
* the action is disabled, or null if it's not recognised
* @param $action String
* @param $overrides Array
- * @return bool|null|string
+ * @return bool|null|string|callable
*/
final private static function getClass( $action, array $overrides ) {
global $wgActions;
@@ -89,12 +89,18 @@ abstract class Action {
* if it is not recognised
*/
final public static function factory( $action, Page $page, IContextSource $context = null ) {
- $class = self::getClass( $action, $page->getActionOverrides() );
- if ( $class ) {
- $obj = new $class( $page, $context );
+ $classOrCallable = self::getClass( $action, $page->getActionOverrides() );
+
+ if ( is_string( $classOrCallable ) ) {
+ $obj = new $classOrCallable( $page, $context );
return $obj;
}
- return $class;
+
+ if ( is_callable( $classOrCallable ) ) {
+ return call_user_func_array( $classOrCallable, array( $page, $context ) );
+ }
+
+ return $classOrCallable;
}
/**
@@ -136,7 +142,7 @@ abstract class Action {
return 'view';
}
- $action = Action::factory( $actionName, $context->getWikiPage() );
+ $action = Action::factory( $actionName, $context->getWikiPage(), $context );
if ( $action instanceof Action ) {
return $action->getName();
}
@@ -161,8 +167,14 @@ abstract class Action {
final public function getContext() {
if ( $this->context instanceof IContextSource ) {
return $this->context;
+ } else if ( $this->page instanceof Article ) {
+ // NOTE: $this->page can be a WikiPage, which does not have a context.
+ wfDebug( __METHOD__ . ': no context known, falling back to Article\'s context.' );
+ return $this->page->getContext();
}
- return $this->page->getContext();
+
+ wfWarn( __METHOD__ . ': no context known, falling back to RequestContext::getMain().' );
+ return RequestContext::getMain();
}
/**
@@ -213,7 +225,7 @@ abstract class Action {
/**
* Shortcut to get the user Language being used for this instance
*
- * @deprecated 1.19 Use getLanguage instead
+ * @deprecated since 1.19 Use getLanguage instead
* @return Language
*/
final public function getLang() {
@@ -241,12 +253,20 @@ abstract class Action {
}
/**
- * Protected constructor: use Action::factory( $action, $page ) to actually build
- * these things in the real world
+ * Constructor.
+ *
+ * Only public since 1.21
+ *
* @param $page Page
* @param $context IContextSource
*/
- protected function __construct( Page $page, IContextSource $context = null ) {
+ public function __construct( Page $page, IContextSource $context = null ) {
+ if ( $context === null ) {
+ wfWarn( __METHOD__ . ' called without providing a Context object.' );
+ // NOTE: We could try to initialize $context using $page->getContext(),
+ // if $page is an Article. That however seems to not work seamlessly.
+ }
+
$this->page = $page;
$this->context = $context;
}
@@ -374,18 +394,23 @@ abstract class FormAction extends Action {
* Add pre- or post-text to the form
* @return String HTML which will be sent to $form->addPreText()
*/
- protected function preText() { return ''; }
+ protected function preText() {
+ return '';
+ }
/**
* @return string
*/
- protected function postText() { return ''; }
+ protected function postText() {
+ return '';
+ }
/**
* Play with the HTMLForm if you need to more substantially
* @param $form HTMLForm
*/
- protected function alterForm( HTMLForm $form ) {}
+ protected function alterForm( HTMLForm $form ) {
+ }
/**
* Get the HTMLForm to control behavior
@@ -464,7 +489,7 @@ abstract class FormAction extends Action {
public function execute( array $data = null, $captureErrors = true ) {
try {
// Set a new context so output doesn't leak.
- $this->context = clone $this->page->getContext();
+ $this->context = clone $this->getContext();
// This will throw exceptions if there's a problem
$this->checkCanExecute( $this->getUser() );
@@ -553,7 +578,7 @@ abstract class FormlessAction extends Action {
public function execute( array $data = null, $captureErrors = true ) {
try {
// Set a new context so output doesn't leak.
- $this->context = clone $this->page->getContext();
+ $this->context = clone $this->getContext();
if ( is_array( $data ) ) {
$this->context->setRequest( new FauxRequest( $data, false ) );
}
diff --git a/includes/AjaxDispatcher.php b/includes/AjaxDispatcher.php
index b00cf309..c9ca1283 100644
--- a/includes/AjaxDispatcher.php
+++ b/includes/AjaxDispatcher.php
@@ -63,7 +63,7 @@ class AjaxDispatcher {
$this->mode = "post";
}
- switch( $this->mode ) {
+ switch ( $this->mode ) {
case 'get':
$this->func_name = isset( $_GET["rs"] ) ? $_GET["rs"] : '';
if ( ! empty( $_GET["rsargs"] ) ) {
@@ -111,15 +111,13 @@ class AjaxDispatcher {
wfHttpError(
400,
'Bad Request',
- "unknown function " . (string) $this->func_name
+ "unknown function " . $this->func_name
);
- } elseif ( !in_array( 'read', User::getGroupPermissions( array( '*' ) ), true )
- && !$wgUser->isAllowed( 'read' ) )
- {
+ } elseif ( !User::isEveryoneAllowed( 'read' ) && !$wgUser->isAllowed( 'read' ) ) {
wfHttpError(
403,
'Forbidden',
- 'You must log in to view pages.' );
+ 'You are not allowed to view pages.' );
} else {
wfDebug( __METHOD__ . ' dispatching ' . $this->func_name . "\n" );
diff --git a/includes/AjaxResponse.php b/includes/AjaxResponse.php
index 138f808a..d5536529 100644
--- a/includes/AjaxResponse.php
+++ b/includes/AjaxResponse.php
@@ -210,7 +210,7 @@ class AjaxResponse {
* @param $timestamp string
* @return bool Returns true if the response code was set to 304 Not Modified.
*/
- function checkLastModified ( $timestamp ) {
+ function checkLastModified( $timestamp ) {
global $wgCachePages, $wgCacheEpoch, $wgUser;
$fname = 'AjaxResponse::checkLastModified';
diff --git a/includes/ArrayUtils.php b/includes/ArrayUtils.php
index 0b74f06a..985271f7 100644
--- a/includes/ArrayUtils.php
+++ b/includes/ArrayUtils.php
@@ -39,7 +39,7 @@ class ArrayUtils {
*
* @return bool|int|string
*/
- public static function pickRandom( $weights ){
+ public static function pickRandom( $weights ) {
if ( !is_array( $weights ) || count( $weights ) == 0 ) {
return false;
}
diff --git a/includes/Article.php b/includes/Article.php
index 9b4afe44..0b18221a 100644
--- a/includes/Article.php
+++ b/includes/Article.php
@@ -25,7 +25,7 @@
*
* This maintains WikiPage functions for backwards compatibility.
*
- * @todo move and rewrite code to an Action class
+ * @todo Move and rewrite code to an Action class
*
* See design.txt for an overview.
* Note: edit user interface and cache support functions have been
@@ -160,7 +160,7 @@ class Article implements Page {
$page = null;
wfRunHooks( 'ArticleFromTitle', array( &$title, &$page ) );
if ( !$page ) {
- switch( $title->getNamespace() ) {
+ switch ( $title->getNamespace() ) {
case NS_FILE:
$page = new ImagePage( $title );
break;
@@ -385,7 +385,8 @@ class Article implements Page {
$content = $this->fetchContentObject();
- $this->mContent = ContentHandler::getContentText( $content ); #@todo: get rid of mContent everywhere!
+ // @todo Get rid of mContent everywhere!
+ $this->mContent = ContentHandler::getContentText( $content );
ContentHandler::runLegacyHooks( 'ArticleAfterFetchContent', array( &$this, &$this->mContent ) );
wfProfileOut( __METHOD__ );
@@ -609,7 +610,7 @@ class Article implements Page {
$this->mParserOutput = false;
while ( !$outputDone && ++$pass ) {
- switch( $pass ) {
+ switch ( $pass ) {
case 1:
wfRunHooks( 'ArticleViewHeader', array( &$this, &$outputDone, &$useParserCache ) );
break;
@@ -673,12 +674,12 @@ class Article implements Page {
wfDebug( __METHOD__ . ": showing CSS/JS source\n" );
$this->showCssOrJsPage();
$outputDone = true;
- } elseif( !wfRunHooks( 'ArticleContentViewCustom',
+ } elseif ( !wfRunHooks( 'ArticleContentViewCustom',
array( $this->fetchContentObject(), $this->getTitle(), $outputPage ) ) ) {
# Allow extensions do their own custom view for certain pages
$outputDone = true;
- } elseif( !ContentHandler::runLegacyHooks( 'ArticleViewCustom',
+ } elseif ( !ContentHandler::runLegacyHooks( 'ArticleViewCustom',
array( $this->fetchContentObject(), $this->getTitle(), $outputPage ) ) ) {
# Allow extensions do their own custom view for certain pages
@@ -787,7 +788,7 @@ class Article implements Page {
* Show a diff page according to current request variables. For use within
* Article::view() only, other callers should use the DifferenceEngine class.
*
- * @todo: make protected
+ * @todo Make protected
*/
public function showDiffPage() {
$request = $this->getContext()->getRequest();
@@ -854,11 +855,11 @@ class Article implements Page {
/**
* Get the robot policy to be used for the current view
* @param string $action the action= GET parameter
- * @param $pOutput ParserOutput
+ * @param $pOutput ParserOutput|null
* @return Array the policy that should be set
* TODO: actions other than 'view'
*/
- public function getRobotPolicy( $action, $pOutput ) {
+ public function getRobotPolicy( $action, $pOutput = null ) {
global $wgArticleRobotPolicies, $wgNamespaceRobotPolicies, $wgDefaultRobotPolicy;
$ns = $this->getTitle()->getNamespace();
@@ -875,7 +876,7 @@ class Article implements Page {
}
if ( Block::newFromTarget( $specificTarget, $vagueTarget ) instanceof Block ) {
return array(
- 'index' => 'noindex',
+ 'index' => 'noindex',
'follow' => 'nofollow'
);
}
@@ -884,19 +885,19 @@ class Article implements Page {
if ( $this->mPage->getID() === 0 || $this->getOldID() ) {
# Non-articles (special pages etc), and old revisions
return array(
- 'index' => 'noindex',
+ 'index' => 'noindex',
'follow' => 'nofollow'
);
} elseif ( $this->getContext()->getOutput()->isPrintable() ) {
# Discourage indexing of printable versions, but encourage following
return array(
- 'index' => 'noindex',
+ 'index' => 'noindex',
'follow' => 'follow'
);
} elseif ( $this->getContext()->getRequest()->getInt( 'curid' ) ) {
# For ?curid=x urls, disallow indexing
return array(
- 'index' => 'noindex',
+ 'index' => 'noindex',
'follow' => 'follow'
);
}
@@ -988,8 +989,9 @@ class Article implements Page {
// Set the fragment if one was specified in the redirect
if ( strval( $this->getTitle()->getFragment() ) != '' ) {
- $fragment = Xml::escapeJsString( $this->getTitle()->getFragmentForURL() );
- $outputPage->addInlineScript( "redirectToFragment(\"$fragment\");" );
+ $outputPage->addInlineScript( Xml::encodeJsCall(
+ 'redirectToFragment', array( $this->getTitle()->getFragmentForURL() )
+ ) );
}
// Add a <link rel="canonical"> tag
@@ -1035,11 +1037,10 @@ class Article implements Page {
$this->getContext()->getOutput()->addWikiMsg( 'anontalkpagetext' );
}
- # If we have been passed an &rcid= parameter, we want to give the user a
- # chance to mark this new article as patrolled.
- $this->showPatrolFooter();
+ // Show a footer allowing the user to patrol the shown revision or page if possible
+ $patrolFooterShown = $this->showPatrolFooter();
- wfRunHooks( 'ArticleViewFooter', array( $this ) );
+ wfRunHooks( 'ArticleViewFooter', array( $this, $patrolFooterShown ) );
}
@@ -1049,21 +1050,92 @@ class Article implements Page {
* desired, does nothing.
* Side effect: When the patrol link is build, this method will call
* OutputPage::preventClickjacking() and load mediawiki.page.patrol.ajax.
+ *
+ * @return bool
*/
public function showPatrolFooter() {
- $request = $this->getContext()->getRequest();
+ global $wgUseNPPatrol, $wgUseRCPatrol, $wgEnableAPI, $wgEnableWriteAPI;
+
$outputPage = $this->getContext()->getOutput();
$user = $this->getContext()->getUser();
- $rcid = $request->getVal( 'rcid' );
+ $cache = wfGetMainCache();
+ $rc = false;
- if ( !$rcid || !$this->getTitle()->quickUserCan( 'patrol', $user ) ) {
- return;
+ if ( !$this->getTitle()->quickUserCan( 'patrol', $user ) || !( $wgUseRCPatrol || $wgUseNPPatrol ) ) {
+ // Patrolling is disabled or the user isn't allowed to
+ return false;
+ }
+
+ wfProfileIn( __METHOD__ );
+
+ // New page patrol: Get the timestamp of the oldest revison which
+ // the revision table holds for the given page. Then we look
+ // whether it's within the RC lifespan and if it is, we try
+ // to get the recentchanges row belonging to that entry
+ // (with rc_new = 1).
+
+ // Check for cached results
+ if ( $cache->get( wfMemcKey( 'NotPatrollablePage', $this->getTitle()->getArticleID() ) ) ) {
+ wfProfileOut( __METHOD__ );
+ return false;
}
+ if ( $this->mRevision && !RecentChange::isInRCLifespan( $this->mRevision->getTimestamp(), 21600 ) ) {
+ // The current revision is already older than what could be in the RC table
+ // 6h tolerance because the RC might not be cleaned out regularly
+ wfProfileOut( __METHOD__ );
+ return false;
+ }
+
+ $dbr = wfGetDB( DB_SLAVE );
+ $oldestRevisionTimestamp = $dbr->selectField(
+ 'revision',
+ 'MIN( rev_timestamp )',
+ array( 'rev_page' => $this->getTitle()->getArticleID() ),
+ __METHOD__
+ );
+
+ if ( $oldestRevisionTimestamp && RecentChange::isInRCLifespan( $oldestRevisionTimestamp, 21600 ) ) {
+ // 6h tolerance because the RC might not be cleaned out regularly
+ $rc = RecentChange::newFromConds(
+ array(
+ 'rc_new' => 1,
+ 'rc_timestamp' => $oldestRevisionTimestamp,
+ 'rc_namespace' => $this->getTitle()->getNamespace(),
+ 'rc_cur_id' => $this->getTitle()->getArticleID(),
+ 'rc_patrolled' => 0
+ ),
+ __METHOD__,
+ array( 'USE INDEX' => 'new_name_timestamp' )
+ );
+ }
+
+ if ( !$rc ) {
+ // No RC entry around
+
+ // Cache the information we gathered above in case we can't patrol
+ // Don't cache in case we can patrol as this could change
+ $cache->set( wfMemcKey( 'NotPatrollablePage', $this->getTitle()->getArticleID() ), '1' );
+
+ wfProfileOut( __METHOD__ );
+ return false;
+ }
+
+ if ( $rc->getPerformer()->getName() == $user->getName() ) {
+ // Don't show a patrol link for own creations. If the user could
+ // patrol them, they already would be patrolled
+ wfProfileOut( __METHOD__ );
+ return false;
+ }
+
+ $rcid = $rc->getAttribute( 'rc_id' );
+
$token = $user->getEditToken( $rcid );
$outputPage->preventClickjacking();
- $outputPage->addModules( 'mediawiki.page.patrol.ajax' );
+ if ( $wgEnableAPI && $wgEnableWriteAPI && $user->isAllowed( 'writeapi' ) ) {
+ $outputPage->addModules( 'mediawiki.page.patrol.ajax' );
+ }
$link = Linker::linkKnown(
$this->getTitle(),
@@ -1081,6 +1153,9 @@ class Article implements Page {
wfMessage( 'markaspatrolledlink' )->rawParams( $link )->escaped() .
'</div>'
);
+
+ wfProfileOut( __METHOD__ );
+ return true;
}
/**
@@ -1090,6 +1165,7 @@ class Article implements Page {
public function showMissingArticle() {
global $wgSend404Code;
$outputPage = $this->getContext()->getOutput();
+ // Whether the page is a root user page of an existing user (but not a subpage)
$validUserPage = false;
# Show info in user (talk) namespace. Does the user exist? Is he blocked?
@@ -1099,7 +1175,7 @@ class Article implements Page {
$user = User::newFromName( $rootPart, false /* allow IP users*/ );
$ip = User::isIP( $rootPart );
- if ( !($user && $user->isLoggedIn()) && !$ip ) { # User does not exist
+ if ( !( $user && $user->isLoggedIn() ) && !$ip ) { # User does not exist
$outputPage->wrapWikiMsg( "<div class=\"mw-userpage-userdoesnotexist error\">\n\$1\n</div>",
array( 'userpage-userdoesnotexist-view', wfEscapeWikiText( $rootPart ) ) );
} elseif ( $user->isBlocked() ) { # Show log extract if the user is currently blocked
@@ -1117,9 +1193,9 @@ class Article implements Page {
)
)
);
- $validUserPage = true;
+ $validUserPage = !$this->getTitle()->isSubpage();
} else {
- $validUserPage = true;
+ $validUserPage = !$this->getTitle()->isSubpage();
}
}
@@ -1139,6 +1215,13 @@ class Article implements Page {
$this->getContext()->getRequest()->response()->header( "HTTP/1.1 404 Not Found" );
}
+ if ( $validUserPage ) {
+ // Also apply the robot policy for nonexisting user pages (as those aren't served as 404)
+ $policy = $this->getRobotPolicy( 'view' );
+ $outputPage->setIndexPolicy( $policy['index'] );
+ $outputPage->setFollowPolicy( $policy['follow'] );
+ }
+
$hookResult = wfRunHooks( 'BeforeDisplayNoArticleText', array( $this ) );
if ( ! $hookResult ) {
@@ -1188,7 +1271,7 @@ class Article implements Page {
} elseif ( $this->getContext()->getRequest()->getInt( 'unhide' ) != 1 ) {
# Give explanation and add a link to view the revision...
$oldid = intval( $this->getOldID() );
- $link = $this->getTitle()->getFullUrl( "oldid={$oldid}&unhide=1" );
+ $link = $this->getTitle()->getFullURL( "oldid={$oldid}&unhide=1" );
$msg = $this->mRevision->isDeleted( Revision::DELETED_RESTRICTED ) ?
'rev-suppressed-text-unhide' : 'rev-deleted-text-unhide';
$outputPage->wrapWikiMsg( "<div class='mw-warning plainlinks'>\n$1\n</div>\n",
@@ -1470,13 +1553,7 @@ class Article implements Page {
$this->doDelete( $reason, $suppress );
- if ( $user->isLoggedIn() && $request->getCheck( 'wpWatch' ) != $user->isWatched( $title ) ) {
- if ( $request->getCheck( 'wpWatch' ) ) {
- WatchAction::doWatch( $title, $user );
- } else {
- WatchAction::doUnwatch( $title, $user );
- }
- }
+ WatchAction::doWatchOrUnwatch( $request->getCheck( 'wpWatch' ), $title, $user );
return;
}
diff --git a/includes/AuthPlugin.php b/includes/AuthPlugin.php
index a4658176..84cf3d5e 100644
--- a/includes/AuthPlugin.php
+++ b/includes/AuthPlugin.php
@@ -213,6 +213,19 @@ class AuthPlugin {
}
/**
+ * Update user groups in the external authentication database.
+ * Return true if successful.
+ *
+ * @param $user User object.
+ * @param $addgroups Groups to add.
+ * @param $delgroups Groups to remove.
+ * @return Boolean
+ */
+ public function updateExternalDBGroups( $user, $addgroups, $delgroups = array() ) {
+ return true;
+ }
+
+ /**
* Check to see if external accounts can be created.
* Return true if external accounts can be created.
* @return Boolean
diff --git a/includes/AutoLoader.php b/includes/AutoLoader.php
index 3555e2c3..0706fe3f 100644
--- a/includes/AutoLoader.php
+++ b/includes/AutoLoader.php
@@ -55,7 +55,6 @@ $wgAutoloadLocalClasses = array(
'CdbWriter_DBA' => 'includes/Cdb.php',
'CdbWriter_PHP' => 'includes/Cdb_PHP.php',
'ChangesFeed' => 'includes/ChangesFeed.php',
- 'ChangesList' => 'includes/ChangesList.php',
'ChangeTags' => 'includes/ChangeTags.php',
'ChannelFeed' => 'includes/Feed.php',
'Collation' => 'includes/Collation.php',
@@ -65,10 +64,10 @@ $wgAutoloadLocalClasses = array(
'ConfEditorToken' => 'includes/ConfEditor.php',
'Cookie' => 'includes/Cookie.php',
'CookieJar' => 'includes/Cookie.php',
- 'MWCryptRand' => 'includes/CryptRand.php',
'CurlHttpRequest' => 'includes/HttpFunctions.php',
'DeferrableUpdate' => 'includes/DeferredUpdates.php',
'DeferredUpdates' => 'includes/DeferredUpdates.php',
+ 'MWCallableUpdate' => 'includes/CallableUpdate.php',
'DeprecatedGlobal' => 'includes/DeprecatedGlobal.php',
'DerivativeRequest' => 'includes/WebRequest.php',
'DiffHistoryBlob' => 'includes/HistoryBlob.php',
@@ -87,16 +86,8 @@ $wgAutoloadLocalClasses = array(
'DumpPipeOutput' => 'includes/Export.php',
'EditPage' => 'includes/EditPage.php',
'EmailNotification' => 'includes/UserMailer.php',
- 'EnhancedChangesList' => 'includes/ChangesList.php',
'ErrorPageError' => 'includes/Exception.php',
'ExplodeIterator' => 'includes/StringUtils.php',
- 'ExternalEdit' => 'includes/ExternalEdit.php',
- 'ExternalStore' => 'includes/externalstore/ExternalStore.php',
- 'ExternalStoreDB' => 'includes/externalstore/ExternalStoreDB.php',
- 'ExternalStoreHttp' => 'includes/externalstore/ExternalStoreHttp.php',
- 'ExternalStoreMedium' => 'includes/externalstore/ExternalStoreMedium.php',
- 'ExternalStoreMwstore' => 'includes/externalstore/ExternalStoreMwstore.php',
- 'ExternalUser' => 'includes/ExternalUser.php',
'FakeTitle' => 'includes/FakeTitle.php',
'Fallback' => 'includes/Fallback.php',
'FatalError' => 'includes/Exception.php',
@@ -111,22 +102,27 @@ $wgAutoloadLocalClasses = array(
'FormOptions' => 'includes/FormOptions.php',
'FormSpecialPage' => 'includes/SpecialPage.php',
'GitInfo' => 'includes/GitInfo.php',
+ 'HashRing' => 'includes/HashRing.php',
'HashtableReplacer' => 'includes/StringUtils.php',
'HistoryBlob' => 'includes/HistoryBlob.php',
'HistoryBlobCurStub' => 'includes/HistoryBlob.php',
'HistoryBlobStub' => 'includes/HistoryBlob.php',
'Hooks' => 'includes/Hooks.php',
'Html' => 'includes/Html.php',
+ 'HtmlFormatter' => 'includes/HtmlFormatter.php',
'HTMLApiField' => 'includes/HTMLForm.php',
+ 'HTMLButtonField' => 'includes/HTMLForm.php',
'HTMLCheckField' => 'includes/HTMLForm.php',
'HTMLCheckMatrix' => 'includes/HTMLForm.php',
'HTMLEditTools' => 'includes/HTMLForm.php',
'HTMLFloatField' => 'includes/HTMLForm.php',
'HTMLForm' => 'includes/HTMLForm.php',
'HTMLFormField' => 'includes/HTMLForm.php',
+ 'HTMLFormFieldRequiredOptionsException' => 'includes/HTMLForm.php',
'HTMLHiddenField' => 'includes/HTMLForm.php',
'HTMLInfoField' => 'includes/HTMLForm.php',
'HTMLIntField' => 'includes/HTMLForm.php',
+ 'HTMLNestedFilterable' => 'includes/HTMLForm.php',
'HTMLMultiSelectField' => 'includes/HTMLForm.php',
'HTMLRadioField' => 'includes/HTMLForm.php',
'HTMLSelectAndOtherField' => 'includes/HTMLForm.php',
@@ -140,7 +136,6 @@ $wgAutoloadLocalClasses = array(
'ICacheHelper' => 'includes/CacheHelper.php',
'IcuCollation' => 'includes/Collation.php',
'IdentityCollation' => 'includes/Collation.php',
- 'ImageGallery' => 'includes/ImageGallery.php',
'ImageHistoryList' => 'includes/ImagePage.php',
'ImageHistoryPseudoPager' => 'includes/ImagePage.php',
'ImagePage' => 'includes/ImagePage.php',
@@ -156,7 +151,6 @@ $wgAutoloadLocalClasses = array(
'LCStore_CDB' => 'includes/cache/LocalisationCache.php',
'LCStore_DB' => 'includes/cache/LocalisationCache.php',
'LCStore_Null' => 'includes/cache/LocalisationCache.php',
- 'LegacyTemplate' => 'includes/SkinLegacy.php',
'License' => 'includes/Licenses.php',
'Licenses' => 'includes/Licenses.php',
'Linker' => 'includes/Linker.php',
@@ -174,6 +168,7 @@ $wgAutoloadLocalClasses = array(
'Message' => 'includes/Message.php',
'MessageBlobStore' => 'includes/MessageBlobStore.php',
'MimeMagic' => 'includes/MimeMagic.php',
+ 'MWCryptRand' => 'includes/MWCryptRand.php',
'MWException' => 'includes/Exception.php',
'MWExceptionHandler' => 'includes/Exception.php',
'MWFunction' => 'includes/MWFunction.php',
@@ -181,7 +176,6 @@ $wgAutoloadLocalClasses = array(
'MWHttpRequest' => 'includes/HttpFunctions.php',
'MWInit' => 'includes/Init.php',
'MWNamespace' => 'includes/Namespace.php',
- 'OldChangesList' => 'includes/ChangesList.php',
'OutputPage' => 'includes/OutputPage.php',
'Page' => 'includes/WikiPage.php',
'PageQueryPage' => 'includes/PageQueryPage.php',
@@ -194,6 +188,7 @@ $wgAutoloadLocalClasses = array(
'PoolCounter' => 'includes/PoolCounter.php',
'PoolCounter_Stub' => 'includes/PoolCounter.php',
'PoolCounterWork' => 'includes/PoolCounter.php',
+ 'PoolCounterWorkViaCallback' => 'includes/PoolCounter.php',
'PoolWorkArticleView' => 'includes/WikiPage.php',
'Preferences' => 'includes/Preferences.php',
'PreferencesForm' => 'includes/Preferences.php',
@@ -202,10 +197,8 @@ $wgAutoloadLocalClasses = array(
'QueryPage' => 'includes/QueryPage.php',
'QuickTemplate' => 'includes/SkinTemplate.php',
'RawMessage' => 'includes/Message.php',
- 'RCCacheEntry' => 'includes/ChangesList.php',
'RdfMetaData' => 'includes/Metadata.php',
'ReadOnlyError' => 'includes/Exception.php',
- 'RecentChange' => 'includes/RecentChange.php',
'RedirectSpecialArticle' => 'includes/SpecialPage.php',
'RedirectSpecialPage' => 'includes/SpecialPage.php',
'RegexlikeReplacer' => 'includes/StringUtils.php',
@@ -228,7 +221,6 @@ $wgAutoloadLocalClasses = array(
'SiteStatsInit' => 'includes/SiteStats.php',
'SiteStatsUpdate' => 'includes/SiteStats.php',
'Skin' => 'includes/Skin.php',
- 'SkinLegacy' => 'includes/SkinLegacy.php',
'SkinTemplate' => 'includes/SkinTemplate.php',
'SpecialCreateAccount' => 'includes/SpecialPage.php',
'SpecialListAdmins' => 'includes/SpecialPage.php',
@@ -237,11 +229,13 @@ $wgAutoloadLocalClasses = array(
'SpecialMypage' => 'includes/SpecialPage.php',
'SpecialMytalk' => 'includes/SpecialPage.php',
'SpecialMyuploads' => 'includes/SpecialPage.php',
+ 'SpecialAllMyUploads' => 'includes/SpecialPage.php',
'SpecialPage' => 'includes/SpecialPage.php',
'SpecialPageFactory' => 'includes/SpecialPageFactory.php',
'SpecialRedirectToSpecial' => 'includes/SpecialPage.php',
'SquidPurgeClient' => 'includes/SquidPurgeClient.php',
'SquidPurgeClientPool' => 'includes/SquidPurgeClient.php',
+ 'StatCounter' => 'includes/StatCounter.php',
'Status' => 'includes/Status.php',
'StreamFile' => 'includes/StreamFile.php',
'StringUtils' => 'includes/StringUtils.php',
@@ -415,6 +409,7 @@ $wgAutoloadLocalClasses = array(
'ApiQueryQueryPage' => 'includes/api/ApiQueryQueryPage.php',
'ApiQueryRandom' => 'includes/api/ApiQueryRandom.php',
'ApiQueryRecentChanges' => 'includes/api/ApiQueryRecentChanges.php',
+ 'ApiQueryFileRepoInfo' => 'includes/api/ApiQueryFileRepoInfo.php',
'ApiQueryRevisions' => 'includes/api/ApiQueryRevisions.php',
'ApiQuerySearch' => 'includes/api/ApiQuerySearch.php',
'ApiQuerySiteinfo' => 'includes/api/ApiQuerySiteinfo.php',
@@ -457,6 +452,13 @@ $wgAutoloadLocalClasses = array(
'TitleDependency' => 'includes/cache/CacheDependency.php',
'TitleListDependency' => 'includes/cache/CacheDependency.php',
+ # includes/changes
+ 'ChangesList' => 'includes/changes/ChangesList.php',
+ 'EnhancedChangesList' => 'includes/changes/EnhancedChangesList.php',
+ 'OldChangesList' => 'includes/changes/OldChangesList.php',
+ 'RCCacheEntry' => 'includes/changes/RCCacheEntry.php',
+ 'RecentChange' => 'includes/changes/RecentChange.php',
+
# includes/clientpool
'RedisConnectionPool' => 'includes/clientpool/RedisConnectionPool.php',
'RedisConnRef' => 'includes/clientpool/RedisConnectionPool.php',
@@ -473,11 +475,13 @@ $wgAutoloadLocalClasses = array(
# includes/db
'Blob' => 'includes/db/DatabaseUtility.php',
- 'ChronologyProtector' => 'includes/db/LBFactory.php',
+ 'ChronologyProtector' => 'includes/db/ChronologyProtector.php',
'CloneDatabase' => 'includes/db/CloneDatabase.php',
'DatabaseBase' => 'includes/db/Database.php',
'DatabaseMssql' => 'includes/db/DatabaseMssql.php',
'DatabaseMysql' => 'includes/db/DatabaseMysql.php',
+ 'DatabaseMysqlBase' => 'includes/db/DatabaseMysqlBase.php',
+ 'DatabaseMysqli' => 'includes/db/DatabaseMysqli.php',
'DatabaseOracle' => 'includes/db/DatabaseOracle.php',
'DatabasePostgres' => 'includes/db/DatabasePostgres.php',
'DatabaseSqlite' => 'includes/db/DatabaseSqlite.php',
@@ -485,8 +489,10 @@ $wgAutoloadLocalClasses = array(
'DatabaseType' => 'includes/db/Database.php',
'DBAccessError' => 'includes/db/LBFactory.php',
'DBConnectionError' => 'includes/db/DatabaseError.php',
+ 'DBConnRef' => 'includes/db/LoadBalancer.php',
'DBError' => 'includes/db/DatabaseError.php',
'DBObject' => 'includes/db/DatabaseUtility.php',
+ 'IDatabase' => 'includes/db/Database.php',
'IORMRow' => 'includes/db/IORMRow.php',
'IORMTable' => 'includes/db/IORMTable.php',
'DBMasterPos' => 'includes/db/DatabaseUtility.php',
@@ -507,8 +513,8 @@ $wgAutoloadLocalClasses = array(
'LoadMonitor_Null' => 'includes/db/LoadMonitor.php',
'MssqlField' => 'includes/db/DatabaseMssql.php',
'MssqlResult' => 'includes/db/DatabaseMssql.php',
- 'MySQLField' => 'includes/db/DatabaseMysql.php',
- 'MySQLMasterPos' => 'includes/db/DatabaseMysql.php',
+ 'MySQLField' => 'includes/db/DatabaseMysqlBase.php',
+ 'MySQLMasterPos' => 'includes/db/DatabaseMysqlBase.php',
'ORAField' => 'includes/db/DatabaseOracle.php',
'ORAResult' => 'includes/db/DatabaseOracle.php',
'ORMIterator' => 'includes/db/ORMIterator.php',
@@ -543,14 +549,17 @@ $wgAutoloadLocalClasses = array(
'WikiDiff3' => 'includes/diff/WikiDiff3.php',
'WordLevelDiff' => 'includes/diff/DairikiDiff.php',
- # includes/extauth
- 'ExternalUser_Hardcoded' => 'includes/extauth/Hardcoded.php',
- 'ExternalUser_MediaWiki' => 'includes/extauth/MediaWiki.php',
- 'ExternalUser_vB' => 'includes/extauth/vB.php',
+ # includes/externalstore
+ 'ExternalStore' => 'includes/externalstore/ExternalStore.php',
+ 'ExternalStoreDB' => 'includes/externalstore/ExternalStoreDB.php',
+ 'ExternalStoreHttp' => 'includes/externalstore/ExternalStoreHttp.php',
+ 'ExternalStoreMedium' => 'includes/externalstore/ExternalStoreMedium.php',
+ 'ExternalStoreMwstore' => 'includes/externalstore/ExternalStoreMwstore.php',
# includes/filebackend
'FileBackendGroup' => 'includes/filebackend/FileBackendGroup.php',
'FileBackend' => 'includes/filebackend/FileBackend.php',
+ 'FileBackendError' => 'includes/filebackend/FileBackend.php',
'FileBackendStore' => 'includes/filebackend/FileBackendStore.php',
'FileBackendStoreShardListIterator' => 'includes/filebackend/FileBackendStore.php',
'FileBackendStoreShardDirIterator' => 'includes/filebackend/FileBackendStore.php',
@@ -582,6 +591,7 @@ $wgAutoloadLocalClasses = array(
'QuorumLockManager' => 'includes/filebackend/lockmanager/QuorumLockManager.php',
'MySqlLockManager' => 'includes/filebackend/lockmanager/DBLockManager.php',
'PostgreSqlLockManager' => 'includes/filebackend/lockmanager/DBLockManager.php',
+ 'RedisLockManager' => 'includes/filebackend/lockmanager/RedisLockManager.php',
'NullLockManager' => 'includes/filebackend/lockmanager/LockManager.php',
'FileOp' => 'includes/filebackend/FileOp.php',
'FileOpBatch' => 'includes/filebackend/FileOpBatch.php',
@@ -657,11 +667,15 @@ $wgAutoloadLocalClasses = array(
# includes/job
'Job' => 'includes/job/Job.php',
'JobQueue' => 'includes/job/JobQueue.php',
- 'JobQueueAggregator' => 'includes/job/JobQueueAggregator.php',
- 'JobQueueAggregatorMemc' => 'includes/job/JobQueueAggregatorMemc.php',
- 'JobQueueAggregatorRedis' => 'includes/job/JobQueueAggregatorRedis.php',
+ 'JobQueueAggregator' => 'includes/job/aggregator/JobQueueAggregator.php',
+ 'JobQueueAggregatorMemc' => 'includes/job/aggregator/JobQueueAggregatorMemc.php',
+ 'JobQueueAggregatorRedis' => 'includes/job/aggregator/JobQueueAggregatorRedis.php',
'JobQueueDB' => 'includes/job/JobQueueDB.php',
+ 'JobQueueConnectionError' => 'includes/job/JobQueue.php',
+ 'JobQueueError' => 'includes/job/JobQueue.php',
'JobQueueGroup' => 'includes/job/JobQueueGroup.php',
+ 'JobQueueFederated' => 'includes/job/JobQueueFederated.php',
+ 'JobQueueRedis' => 'includes/job/JobQueueRedis.php',
# includes/job/jobs
'DoubleRedirectJob' => 'includes/job/jobs/DoubleRedirectJob.php',
@@ -678,8 +692,6 @@ $wgAutoloadLocalClasses = array(
# includes/json
'FormatJson' => 'includes/json/FormatJson.php',
- 'Services_JSON' => 'includes/json/Services_JSON.php',
- 'Services_JSON_Error' => 'includes/json/Services_JSON.php',
# includes/libs
'CSSJanus' => 'includes/libs/CSSJanus.php',
@@ -697,9 +709,16 @@ $wgAutoloadLocalClasses = array(
'JSToken' => 'includes/libs/jsminplus.php',
'JSTokenizer' => 'includes/libs/jsminplus.php',
+ # includes/libs/lessphp
+ 'lessc' => 'includes/libs/lessc.inc.php',
+ 'lessc_parser' => 'includes/libs/lessc.inc.php',
+ 'lessc_formatter_classic' => 'includes/libs/lessc.inc.php',
+ 'lessc_formatter_compressed' => 'includes/libs/lessc.inc.php',
+ 'lessc_formatter_lessjs' => 'includes/libs/lessc.inc.php',
+
# includes/logging
'DatabaseLogEntry' => 'includes/logging/LogEntry.php',
- 'DeleteLogFormatter' => 'includes/logging/LogFormatter.php',
+ 'DeleteLogFormatter' => 'includes/logging/DeleteLogFormatter.php',
'LegacyLogFormatter' => 'includes/logging/LogFormatter.php',
'LogEntry' => 'includes/logging/LogEntry.php',
'LogEventsList' => 'includes/logging/LogEventsList.php',
@@ -708,12 +727,22 @@ $wgAutoloadLocalClasses = array(
'LogPage' => 'includes/logging/LogPage.php',
'LogPager' => 'includes/logging/LogPager.php',
'ManualLogEntry' => 'includes/logging/LogEntry.php',
- 'MoveLogFormatter' => 'includes/logging/LogFormatter.php',
- 'NewUsersLogFormatter' => 'includes/logging/LogFormatter.php',
+ 'MoveLogFormatter' => 'includes/logging/MoveLogFormatter.php',
+ 'NewUsersLogFormatter' => 'includes/logging/NewUsersLogFormatter.php',
'PatrolLog' => 'includes/logging/PatrolLog.php',
- 'PatrolLogFormatter' => 'includes/logging/LogFormatter.php',
+ 'PatrolLogFormatter' => 'includes/logging/PatrolLogFormatter.php',
'RCDatabaseLogEntry' => 'includes/logging/LogEntry.php',
- 'RightsLogFormatter' => 'includes/logging/LogFormatter.php',
+ 'RightsLogFormatter' => 'includes/logging/RightsLogFormatter.php',
+
+ # Image gallery
+
+ 'ImageGallery' => 'includes/gallery/TraditionalImageGallery.php',
+ 'ImageGalleryBase' => 'includes/gallery/ImageGalleryBase.php',
+ 'NolinesImageGallery' => 'includes/gallery/NolinesImageGallery.php',
+ 'TraditionalImageGallery' => 'includes/gallery/TraditionalImageGallery.php',
+ 'PackedImageGallery' => 'includes/gallery/PackedImageGallery.php',
+ 'PackedHoverImageGallery' => 'includes/gallery/PackedOverlayImageGallery.php',
+ 'PackedOverlayImageGallery' => 'includes/gallery/PackedOverlayImageGallery.php',
# includes/media
'BitmapHandler' => 'includes/media/Bitmap.php',
@@ -775,12 +804,10 @@ $wgAutoloadLocalClasses = array(
# includes/parser
'CacheTime' => 'includes/parser/CacheTime.php',
- 'CoreLinkFunctions' => 'includes/parser/CoreLinkFunctions.php',
'CoreParserFunctions' => 'includes/parser/CoreParserFunctions.php',
'CoreTagHooks' => 'includes/parser/CoreTagHooks.php',
'DateFormatter' => 'includes/parser/DateFormatter.php',
'LinkHolderArray' => 'includes/parser/LinkHolderArray.php',
- 'LinkMarkerReplacer' => 'includes/parser/Parser_LinkHooks.php',
'MWTidy' => 'includes/parser/Tidy.php',
'MWTidyWrapper' => 'includes/parser/Tidy.php',
'PPCustomFrame_DOM' => 'includes/parser/Preprocessor_DOM.php',
@@ -808,7 +835,6 @@ $wgAutoloadLocalClasses = array(
'ParserOptions' => 'includes/parser/ParserOptions.php',
'ParserOutput' => 'includes/parser/ParserOutput.php',
'Parser_DiffTest' => 'includes/parser/Parser_DiffTest.php',
- 'Parser_LinkHooks' => 'includes/parser/Parser_LinkHooks.php',
'Preprocessor' => 'includes/parser/Preprocessor.php',
'Preprocessor_DOM' => 'includes/parser/Preprocessor_DOM.php',
'Preprocessor_Hash' => 'includes/parser/Preprocessor_Hash.php',
@@ -821,12 +847,22 @@ $wgAutoloadLocalClasses = array(
'ProfilerSimpleTrace' => 'includes/profiler/ProfilerSimpleTrace.php',
'ProfilerSimpleUDP' => 'includes/profiler/ProfilerSimpleUDP.php',
'ProfilerStub' => 'includes/profiler/ProfilerStub.php',
+ 'ProfileSection' => 'includes/profiler/Profiler.php',
+
+ # includes/rcfeed
+ 'RCFeedEngine' => 'includes/rcfeed/RCFeedEngine.php',
+ 'RedisPubSubFeedEngine' => 'includes/rcfeed/RedisPubSubFeedEngine.php',
+ 'UDPRCFeedEngine' => 'includes/rcfeed/UDPRCFeedEngine.php',
+ 'RCFeedFormatter' => 'includes/rcfeed/RCFeedFormatter.php',
+ 'IRCColourfulRCFeedFormatter' => 'includes/rcfeed/IRCColourfulRCFeedFormatter.php',
+ 'JSONRCFeedFormatter' => 'includes/rcfeed/JSONRCFeedFormatter.php',
# includes/resourceloader
'ResourceLoader' => 'includes/resourceloader/ResourceLoader.php',
'ResourceLoaderContext' => 'includes/resourceloader/ResourceLoaderContext.php',
'ResourceLoaderFileModule' => 'includes/resourceloader/ResourceLoaderFileModule.php',
'ResourceLoaderFilePageModule' => 'includes/resourceloader/ResourceLoaderFilePageModule.php',
+ 'ResourceLoaderLESSFunctions' => 'includes/resourceloader/ResourceLoaderLESSFunctions.php',
'ResourceLoaderModule' => 'includes/resourceloader/ResourceLoaderModule.php',
'ResourceLoaderNoscriptModule' => 'includes/resourceloader/ResourceLoaderNoscriptModule.php',
'ResourceLoaderSiteModule' => 'includes/resourceloader/ResourceLoaderSiteModule.php',
@@ -874,7 +910,6 @@ $wgAutoloadLocalClasses = array(
'SearchResultTooMany' => 'includes/search/SearchEngine.php',
'SearchSqlite' => 'includes/search/SearchSqlite.php',
'SearchUpdate' => 'includes/search/SearchUpdate.php',
- 'SearchUpdateMyISAM' => 'includes/search/SearchUpdate.php',
'SqliteSearchResultSet' => 'includes/search/SearchSqlite.php',
'SqlSearchResultSet' => 'includes/search/SearchEngine.php',
@@ -899,7 +934,6 @@ $wgAutoloadLocalClasses = array(
'DeadendPagesPage' => 'includes/specials/SpecialDeadendpages.php',
'DeletedContribsPager' => 'includes/specials/SpecialDeletedContributions.php',
'DeletedContributionsPage' => 'includes/specials/SpecialDeletedContributions.php',
- 'DisambiguationsPage' => 'includes/specials/SpecialDisambiguations.php',
'DoubleRedirectsPage' => 'includes/specials/SpecialDoubleRedirects.php',
'EditWatchlistCheckboxSeriesField' => 'includes/specials/SpecialEditWatchlist.php',
'EditWatchlistNormalHTMLForm' => 'includes/specials/SpecialEditWatchlist.php',
@@ -940,7 +974,6 @@ $wgAutoloadLocalClasses = array(
'SpecialBlankpage' => 'includes/specials/SpecialBlankpage.php',
'SpecialBlock' => 'includes/specials/SpecialBlock.php',
'SpecialBlockList' => 'includes/specials/SpecialBlockList.php',
- 'SpecialBlockme' => 'includes/specials/SpecialBlockme.php',
'SpecialBookSources' => 'includes/specials/SpecialBooksources.php',
'SpecialCachedPage' => 'includes/specials/SpecialCachedPage.php',
'SpecialCategories' => 'includes/specials/SpecialCategories.php',
@@ -969,9 +1002,12 @@ $wgAutoloadLocalClasses = array(
'SpecialPrefixindex' => 'includes/specials/SpecialPrefixindex.php',
'SpecialProtectedpages' => 'includes/specials/SpecialProtectedpages.php',
'SpecialProtectedtitles' => 'includes/specials/SpecialProtectedtitles.php',
+ 'SpecialRandomInCategory' => 'includes/specials/SpecialRandomInCategory.php',
'SpecialRandomredirect' => 'includes/specials/SpecialRandomredirect.php',
'SpecialRecentChanges' => 'includes/specials/SpecialRecentchanges.php',
'SpecialRecentchangeslinked' => 'includes/specials/SpecialRecentchangeslinked.php',
+ 'SpecialRedirect' => 'includes/specials/SpecialRedirect.php',
+ 'SpecialResetTokens' => 'includes/specials/SpecialResetTokens.php',
'SpecialRevisionDelete' => 'includes/specials/SpecialRevisiondelete.php',
'SpecialSearch' => 'includes/specials/SpecialSearch.php',
'SpecialSpecialpages' => 'includes/specials/SpecialSpecialpages.php',
@@ -1021,6 +1057,7 @@ $wgAutoloadLocalClasses = array(
'UploadFromUrl' => 'includes/upload/UploadFromUrl.php',
'UploadStash' => 'includes/upload/UploadStash.php',
'UploadStashBadPathException' => 'includes/upload/UploadStash.php',
+ 'UploadStashException' => 'includes/upload/UploadStash.php',
'UploadStashFile' => 'includes/upload/UploadStash.php',
'UploadStashFileException' => 'includes/upload/UploadStash.php',
'UploadStashFileNotFoundException' => 'includes/upload/UploadStash.php',
@@ -1091,17 +1128,10 @@ $wgAutoloadLocalClasses = array(
'CologneBlueTemplate' => 'skins/CologneBlue.php',
'ModernTemplate' => 'skins/Modern.php',
'MonoBookTemplate' => 'skins/MonoBook.php',
- 'NostalgiaTemplate' => 'skins/Nostalgia.php',
- 'SkinChick' => 'skins/Chick.php',
'SkinCologneBlue' => 'skins/CologneBlue.php',
'SkinModern' => 'skins/Modern.php',
'SkinMonoBook' => 'skins/MonoBook.php',
- 'SkinMySkin' => 'skins/MySkin.php',
- 'SkinNostalgia' => 'skins/Nostalgia.php',
- 'SkinSimple' => 'skins/Simple.php',
- 'SkinStandard' => 'skins/Standard.php',
'SkinVector' => 'skins/Vector.php',
- 'StandardTemplate' => 'skins/Standard.php',
'VectorTemplate' => 'skins/Vector.php',
);
@@ -1117,12 +1147,13 @@ class AutoLoader {
static function autoload( $className ) {
global $wgAutoloadClasses, $wgAutoloadLocalClasses;
- // Workaround for PHP bug <https://bugs.php.net/bug.php?id=49143> (5.3.2. is broken, it's fixed in 5.3.6).
- // Strip leading backslashes from class names. When namespaces are used, leading backslashes are used to indicate
- // the top-level namespace, e.g. \foo\Bar. When used like this in the code, the leading backslash isn't passed to
- // the auto-loader ($className would be 'foo\Bar'). However, if a class is accessed using a string instead of a
- // class literal (e.g. $class = '\foo\Bar'; new $class()), then some versions of PHP do not strip the leading
- // backlash in this case, causing autoloading to fail.
+ // Workaround for PHP bug <https://bugs.php.net/bug.php?id=49143> (5.3.2. is broken, it's
+ // fixed in 5.3.6). Strip leading backslashes from class names. When namespaces are used,
+ // leading backslashes are used to indicate the top-level namespace, e.g. \foo\Bar. When
+ // used like this in the code, the leading backslash isn't passed to the auto-loader
+ // ($className would be 'foo\Bar'). However, if a class is accessed using a string instead
+ // of a class literal (e.g. $class = '\foo\Bar'; new $class()), then some versions of PHP
+ // do not strip the leading backlash in this case, causing autoloading to fail.
$className = ltrim( $className, '\\' );
if ( isset( $wgAutoloadLocalClasses[$className] ) ) {
@@ -1157,7 +1188,7 @@ class AutoLoader {
$filename = "$IP/$filename";
}
- require( $filename );
+ require $filename;
return true;
}
@@ -1175,12 +1206,4 @@ class AutoLoader {
}
}
-if ( function_exists( 'spl_autoload_register' ) ) {
- spl_autoload_register( array( 'AutoLoader', 'autoload' ) );
-} else {
- function __autoload( $class ) {
- AutoLoader::autoload( $class );
- }
-
- ini_set( 'unserialize_callback_func', '__autoload' );
-}
+spl_autoload_register( array( 'AutoLoader', 'autoload' ) );
diff --git a/includes/Autopromote.php b/includes/Autopromote.php
index 604b9248..170d7abf 100644
--- a/includes/Autopromote.php
+++ b/includes/Autopromote.php
@@ -126,7 +126,8 @@ class Autopromote {
return false;
} elseif ( $cond[0] == '^' ) { // XOR (exactly one cond passes)
if ( count( $cond ) > 3 ) {
- wfWarn( 'recCheckCondition() given XOR ("^") condition on three or more conditions. Check your $wgAutopromote and $wgAutopromoteOnce settings.' );
+ wfWarn( 'recCheckCondition() given XOR ("^") condition on three or more conditions.' .
+ ' Check your $wgAutopromote and $wgAutopromoteOnce settings.' );
}
return self::recCheckCondition( $cond[1], $user )
xor self::recCheckCondition( $cond[2], $user );
@@ -165,7 +166,7 @@ class Autopromote {
return false;
}
- switch( $cond[0] ) {
+ switch ( $cond[0] ) {
case APCOND_EMAILCONFIRMED:
if ( Sanitizer::validateEmail( $user->getEmail() ) ) {
if ( $wgEmailAuthentication ) {
diff --git a/includes/Block.php b/includes/Block.php
index 7ee36ce9..34b89e73 100644
--- a/includes/Block.php
+++ b/includes/Block.php
@@ -65,11 +65,11 @@ class Block {
$timestamp = 0, $auto = 0, $expiry = '', $anonOnly = 0, $createAccount = 0, $enableAutoblock = 0,
$hideName = 0, $blockEmail = 0, $allowUsertalk = 0, $byText = '' )
{
- if( $timestamp === 0 ) {
+ if ( $timestamp === 0 ) {
$timestamp = wfTimestampNow();
}
- if( count( func_get_args() ) > 0 ) {
+ if ( count( func_get_args() ) > 0 ) {
# Soon... :D
# wfDeprecated( __METHOD__ . " with arguments" );
}
@@ -206,16 +206,16 @@ class Block {
*/
public function load( $address = '', $user = 0 ) {
wfDeprecated( __METHOD__, '1.18' );
- if( $user ) {
+ if ( $user ) {
$username = User::whoIs( $user );
$block = self::newFromTarget( $username, $address );
} else {
$block = self::newFromTarget( null, $address );
}
- if( $block instanceof Block ) {
+ if ( $block instanceof Block ) {
# This is mildly evil, but hey, it's B/C :D
- foreach( $block as $variable => $value ) {
+ foreach ( $block as $variable => $value ) {
$this->$variable = $value;
}
return true;
@@ -237,7 +237,7 @@ class Block {
protected function newLoad( $vagueTarget = null ) {
$db = wfGetDB( $this->mFromMaster ? DB_MASTER : DB_SLAVE );
- if( $this->type !== null ) {
+ if ( $this->type !== null ) {
$conds = array(
'ipb_address' => array( (string)$this->target ),
);
@@ -247,9 +247,9 @@ class Block {
# Be aware that the != '' check is explicit, since empty values will be
# passed by some callers (bug 29116)
- if( $vagueTarget != '' ) {
+ if ( $vagueTarget != '' ) {
list( $target, $type ) = self::parseTarget( $vagueTarget );
- switch( $type ) {
+ switch ( $type ) {
case self::TYPE_USER:
# Slightly weird, but who are we to argue?
$conds['ipb_address'][] = (string)$target;
@@ -285,20 +285,20 @@ class Block {
# This is begging for $this = $bestBlock, but that's not allowed in PHP :(
$bestBlockPreventsEdit = null;
- foreach( $res as $row ) {
+ foreach ( $res as $row ) {
$block = self::newFromRow( $row );
# Don't use expired blocks
- if( $block->deleteIfExpired() ) {
+ if ( $block->deleteIfExpired() ) {
continue;
}
# Don't use anon only blocks on users
- if( $this->type == self::TYPE_USER && !$block->isHardblock() ) {
+ if ( $this->type == self::TYPE_USER && !$block->isHardblock() ) {
continue;
}
- if( $block->getType() == self::TYPE_RANGE ) {
+ if ( $block->getType() == self::TYPE_RANGE ) {
# This is the number of bits that are allowed to vary in the block, give
# or take some floating point errors
$end = wfBaseconvert( $block->getRangeEnd(), 16, 10 );
@@ -313,14 +313,14 @@ class Block {
$score = $block->getType();
}
- if( $score < $bestBlockScore ) {
+ if ( $score < $bestBlockScore ) {
$bestBlockScore = $score;
$bestRow = $row;
$bestBlockPreventsEdit = $block->prevents( 'edit' );
}
}
- if( $bestRow !== null ) {
+ if ( $bestRow !== null ) {
$this->initFromRow( $bestRow );
$this->prevents( 'edit', $bestBlockPreventsEdit );
return true;
@@ -511,7 +511,7 @@ class Block {
* @return Array
*/
protected function getDatabaseArray( $db = null ) {
- if( !$db ) {
+ if ( !$db ) {
$db = wfGetDB( DB_SLAVE );
}
$expiry = $db->encodeExpiry( $this->mExpiry );
@@ -579,7 +579,7 @@ class Block {
global $wgPutIPinRC;
// No IPs are in recentchanges table, so nothing to select
- if( !$wgPutIPinRC ) {
+ if ( !$wgPutIPinRC ) {
return;
}
@@ -601,7 +601,9 @@ class Block {
foreach ( $res as $row ) {
if ( $row->rc_ip ) {
$id = $block->doAutoblock( $row->rc_ip );
- if ( $id ) $blockIds[] = $id;
+ if ( $id ) {
+ $blockIds[] = $id;
+ }
}
}
}
@@ -681,7 +683,7 @@ class Block {
if ( $ipblock ) {
# Check if the block is an autoblock and would exceed the user block
# if renewed. If so, do nothing, otherwise prolong the block time...
- if ( $ipblock->mAuto && // @TODO: why not compare $ipblock->mExpiry?
+ if ( $ipblock->mAuto && // @todo Why not compare $ipblock->mExpiry?
$this->mExpiry > Block::getAutoblockExpiry( $ipblock->mTimestamp )
) {
# Reset block timestamp to now and its expiry to
@@ -793,7 +795,7 @@ class Block {
* @return String IP in Hex form
*/
public function getRangeStart() {
- switch( $this->type ) {
+ switch ( $this->type ) {
case self::TYPE_USER:
return '';
case self::TYPE_IP:
@@ -801,17 +803,18 @@ class Block {
case self::TYPE_RANGE:
list( $start, /*...*/ ) = IP::parseRange( $this->target );
return $start;
- default: throw new MWException( "Block with invalid type" );
+ default:
+ throw new MWException( "Block with invalid type" );
}
}
/**
- * Get the IP address at the start of the range in Hex form
+ * Get the IP address at the end of the range in Hex form
* @throws MWException
* @return String IP in Hex form
*/
public function getRangeEnd() {
- switch( $this->type ) {
+ switch ( $this->type ) {
case self::TYPE_USER:
return '';
case self::TYPE_IP:
@@ -819,7 +822,8 @@ class Block {
case self::TYPE_RANGE:
list( /*...*/, $end ) = IP::parseRange( $this->target );
return $end;
- default: throw new MWException( "Block with invalid type" );
+ default:
+ throw new MWException( "Block with invalid type" );
}
}
@@ -907,7 +911,7 @@ class Block {
* @return Bool
*/
public function prevents( $action, $x = null ) {
- switch( $action ) {
+ switch ( $action ) {
case 'edit':
# For now... <evil laugh>
return true;
@@ -997,11 +1001,16 @@ class Block {
* Purge expired blocks from the ipblocks table
*/
public static function purgeExpired() {
- if ( !wfReadOnly() ) {
- $dbw = wfGetDB( DB_MASTER );
- $dbw->delete( 'ipblocks',
- array( 'ipb_expiry < ' . $dbw->addQuotes( $dbw->timestamp() ) ), __METHOD__ );
+ if ( wfReadOnly() ) {
+ return;
}
+
+ $method = __METHOD__;
+ $dbw = wfGetDB( DB_MASTER );
+ $dbw->onTransactionIdle( function() use ( $dbw, $method ) {
+ $dbw->delete( 'ipblocks',
+ array( 'ipb_expiry < ' . $dbw->addQuotes( $dbw->timestamp() ) ), $method );
+ } );
}
/**
@@ -1050,30 +1059,216 @@ class Block {
public static function newFromTarget( $specificTarget, $vagueTarget = null, $fromMaster = false ) {
list( $target, $type ) = self::parseTarget( $specificTarget );
- if( $type == Block::TYPE_ID || $type == Block::TYPE_AUTO ) {
+ if ( $type == Block::TYPE_ID || $type == Block::TYPE_AUTO ) {
return Block::newFromID( $target );
- } elseif( $target === null && $vagueTarget == '' ) {
+ } elseif ( $target === null && $vagueTarget == '' ) {
# We're not going to find anything useful here
# Be aware that the == '' check is explicit, since empty values will be
# passed by some callers (bug 29116)
return null;
- } elseif( in_array( $type, array( Block::TYPE_USER, Block::TYPE_IP, Block::TYPE_RANGE, null ) ) ) {
+ } elseif ( in_array( $type, array( Block::TYPE_USER, Block::TYPE_IP, Block::TYPE_RANGE, null ) ) ) {
$block = new Block();
$block->fromMaster( $fromMaster );
- if( $type !== null ) {
+ if ( $type !== null ) {
$block->setTarget( $target );
}
- if( $block->newLoad( $vagueTarget ) ) {
+ if ( $block->newLoad( $vagueTarget ) ) {
return $block;
}
}
return null;
}
+
+ /**
+ * Get all blocks that match any IP from an array of IP addresses
+ *
+ * @param Array $ipChain list of IPs (strings), usually retrieved from the
+ * X-Forwarded-For header of the request
+ * @param Bool $isAnon Exclude anonymous-only blocks if false
+ * @param Bool $fromMaster Whether to query the master or slave database
+ * @return Array of Blocks
+ * @since 1.22
+ */
+ public static function getBlocksForIPList( array $ipChain, $isAnon, $fromMaster = false ) {
+ if ( !count( $ipChain ) ) {
+ return array();
+ }
+
+ wfProfileIn( __METHOD__ );
+ $conds = array();
+ foreach ( array_unique( $ipChain ) as $ipaddr ) {
+ # Discard invalid IP addresses. Since XFF can be spoofed and we do not
+ # necessarily trust the header given to us, make sure that we are only
+ # checking for blocks on well-formatted IP addresses (IPv4 and IPv6).
+ # Do not treat private IP spaces as special as it may be desirable for wikis
+ # to block those IP ranges in order to stop misbehaving proxies that spoof XFF.
+ if ( !IP::isValid( $ipaddr ) ) {
+ continue;
+ }
+ # Don't check trusted IPs (includes local squids which will be in every request)
+ if ( wfIsTrustedProxy( $ipaddr ) ) {
+ continue;
+ }
+ # Check both the original IP (to check against single blocks), as well as build
+ # the clause to check for rangeblocks for the given IP.
+ $conds['ipb_address'][] = $ipaddr;
+ $conds[] = self::getRangeCond( IP::toHex( $ipaddr ) );
+ }
+
+ if ( !count( $conds ) ) {
+ wfProfileOut( __METHOD__ );
+ return array();
+ }
+
+ if ( $fromMaster ) {
+ $db = wfGetDB( DB_MASTER );
+ } else {
+ $db = wfGetDB( DB_SLAVE );
+ }
+ $conds = $db->makeList( $conds, LIST_OR );
+ if ( !$isAnon ) {
+ $conds = array( $conds, 'ipb_anon_only' => 0 );
+ }
+ $selectFields = array_merge(
+ array( 'ipb_range_start', 'ipb_range_end' ),
+ Block::selectFields()
+ );
+ $rows = $db->select( 'ipblocks',
+ $selectFields,
+ $conds,
+ __METHOD__
+ );
+
+ $blocks = array();
+ foreach ( $rows as $row ) {
+ $block = self::newFromRow( $row );
+ if ( !$block->deleteIfExpired() ) {
+ $blocks[] = $block;
+ }
+ }
+
+ wfProfileOut( __METHOD__ );
+ return $blocks;
+ }
+
+ /**
+ * From a list of multiple blocks, find the most exact and strongest Block.
+ * The logic for finding the "best" block is:
+ * - Blocks that match the block's target IP are preferred over ones in a range
+ * - Hardblocks are chosen over softblocks that prevent account creation
+ * - Softblocks that prevent account creation are chosen over other softblocks
+ * - Other softblocks are chosen over autoblocks
+ * - If there are multiple exact or range blocks at the same level, the one chosen
+ * is random
+
+ * @param Array $ipChain list of IPs (strings). This is used to determine how "close"
+ * a block is to the server, and if a block matches exactly, or is in a range.
+ * The order is furthest from the server to nearest e.g., (Browser, proxy1, proxy2,
+ * local-squid, ...)
+ * @param Array $block Array of blocks
+ * @return Block|null the "best" block from the list
+ */
+ public static function chooseBlock( array $blocks, array $ipChain ) {
+ if ( !count( $blocks ) ) {
+ return null;
+ } elseif ( count( $blocks ) == 1 ) {
+ return $blocks[0];
+ }
+
+ wfProfileIn( __METHOD__ );
+
+ // Sort hard blocks before soft ones and secondarily sort blocks
+ // that disable account creation before those that don't.
+ usort( $blocks, function( Block $a, Block $b ) {
+ $aWeight = (int)$a->isHardblock() . (int)$a->prevents( 'createaccount' );
+ $bWeight = (int)$b->isHardblock() . (int)$b->prevents( 'createaccount' );
+ return strcmp( $bWeight, $aWeight ); // highest weight first
+ } );
+
+ $blocksListExact = array(
+ 'hard' => false,
+ 'disable_create' => false,
+ 'other' => false,
+ 'auto' => false
+ );
+ $blocksListRange = array(
+ 'hard' => false,
+ 'disable_create' => false,
+ 'other' => false,
+ 'auto' => false
+ );
+ $ipChain = array_reverse( $ipChain );
+
+ foreach ( $blocks as $block ) {
+ // Stop searching if we have already have a "better" block. This
+ // is why the order of the blocks matters
+ if ( !$block->isHardblock() && $blocksListExact['hard'] ) {
+ break;
+ } elseif ( !$block->prevents( 'createaccount' ) && $blocksListExact['disable_create'] ) {
+ break;
+ }
+
+ foreach ( $ipChain as $checkip ) {
+ $checkipHex = IP::toHex( $checkip );
+ if ( (string)$block->getTarget() === $checkip ) {
+ if ( $block->isHardblock() ) {
+ $blocksListExact['hard'] = $blocksListExact['hard'] ?: $block;
+ } elseif ( $block->prevents( 'createaccount' ) ) {
+ $blocksListExact['disable_create'] = $blocksListExact['disable_create'] ?: $block;
+ } elseif ( $block->mAuto ) {
+ $blocksListExact['auto'] = $blocksListExact['auto'] ?: $block;
+ } else {
+ $blocksListExact['other'] = $blocksListExact['other'] ?: $block;
+ }
+ // We found closest exact match in the ip list, so go to the next Block
+ break;
+ } elseif ( array_filter( $blocksListExact ) == array()
+ && $block->getRangeStart() <= $checkipHex
+ && $block->getRangeEnd() >= $checkipHex
+ ) {
+ if ( $block->isHardblock() ) {
+ $blocksListRange['hard'] = $blocksListRange['hard'] ?: $block;
+ } elseif ( $block->prevents( 'createaccount' ) ) {
+ $blocksListRange['disable_create'] = $blocksListRange['disable_create'] ?: $block;
+ } elseif ( $block->mAuto ) {
+ $blocksListRange['auto'] = $blocksListRange['auto'] ?: $block;
+ } else {
+ $blocksListRange['other'] = $blocksListRange['other'] ?: $block;
+ }
+ break;
+ }
+ }
+ }
+
+ if ( array_filter( $blocksListExact ) == array() ) {
+ $blocksList = &$blocksListRange;
+ } else {
+ $blocksList = &$blocksListExact;
+ }
+
+ $chosenBlock = null;
+ if ( $blocksList['hard'] ) {
+ $chosenBlock = $blocksList['hard'];
+ } elseif ( $blocksList['disable_create'] ) {
+ $chosenBlock = $blocksList['disable_create'];
+ } elseif ( $blocksList['other'] ) {
+ $chosenBlock = $blocksList['other'];
+ } elseif ( $blocksList['auto'] ) {
+ $chosenBlock = $blocksList['auto'];
+ } else {
+ wfProfileOut( __METHOD__ );
+ throw new MWException( "Proxy block found, but couldn't be classified." );
+ }
+
+ wfProfileOut( __METHOD__ );
+ return $chosenBlock;
+ }
+
/**
* From an existing Block, get the target and the type of target.
* Note that, except for null, it is always safe to treat the target
@@ -1085,13 +1280,13 @@ class Block {
*/
public static function parseTarget( $target ) {
# We may have been through this before
- if( $target instanceof User ) {
- if( IP::isValid( $target->getName() ) ) {
+ if ( $target instanceof User ) {
+ if ( IP::isValid( $target->getName() ) ) {
return array( $target, self::TYPE_IP );
} else {
return array( $target, self::TYPE_USER );
}
- } elseif( $target === null ) {
+ } elseif ( $target === null ) {
return array( null, null );
}
@@ -1112,7 +1307,7 @@ class Block {
# Consider the possibility that this is not a username at all
# but actually an old subpage (bug #29797)
- if( strpos( $target, '/' ) !== false ) {
+ if ( strpos( $target, '/' ) !== false ) {
# An old subpage, drill down to the user behind it
$parts = explode( '/', $target );
$target = $parts[0];
@@ -1198,4 +1393,43 @@ class Block {
public function setBlocker( $user ) {
$this->blocker = $user;
}
+
+ /**
+ * Get the key and parameters for the corresponding error message.
+ *
+ * @since 1.22
+ * @param IContextSource $context
+ * @return array
+ */
+ public function getPermissionsError( IContextSource $context ) {
+ $blocker = $this->getBlocker();
+ if ( $blocker instanceof User ) { // local user
+ $blockerUserpage = $blocker->getUserPage();
+ $link = "[[{$blockerUserpage->getPrefixedText()}|{$blockerUserpage->getText()}]]";
+ } else { // foreign user
+ $link = $blocker;
+ }
+
+ $reason = $this->mReason;
+ if ( $reason == '' ) {
+ $reason = $context->msg( 'blockednoreason' )->text();
+ }
+
+ /* $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. */
+ $intended = $this->getTarget();
+
+ $lang = $context->getLanguage();
+ return array(
+ $this->mAuto ? 'autoblockedtext' : 'blockedtext',
+ $link,
+ $reason,
+ $context->getRequest()->getIP(),
+ $this->getByName(),
+ $this->getId(),
+ $lang->formatExpiry( $this->mExpiry ),
+ (string)$intended,
+ $lang->timeanddate( wfTimestamp( TS_MW, $this->mTimestamp ), true ),
+ );
+ }
}
diff --git a/includes/CallableUpdate.php b/includes/CallableUpdate.php
new file mode 100644
index 00000000..6eb55413
--- /dev/null
+++ b/includes/CallableUpdate.php
@@ -0,0 +1,30 @@
+<?php
+
+/**
+ * Deferrable Update for closure/callback
+ */
+class MWCallableUpdate implements DeferrableUpdate {
+
+ /**
+ * @var closure/callabck
+ */
+ private $callback;
+
+ /**
+ * @param callable $callback
+ */
+ public function __construct( $callback ) {
+ if ( !is_callable( $callback ) ) {
+ throw new MWException( 'Not a valid callback/closure!' );
+ }
+ $this->callback = $callback;
+ }
+
+ /**
+ * Run the update
+ */
+ public function doUpdate() {
+ call_user_func( $this->callback );
+ }
+
+}
diff --git a/includes/Category.php b/includes/Category.php
index 868d6c46..126b8fee 100644
--- a/includes/Category.php
+++ b/includes/Category.php
@@ -40,7 +40,8 @@ class Category {
/** Counts of membership (cat_pages, cat_subcats, cat_files) */
private $mPages = null, $mSubcats = null, $mFiles = null;
- private function __construct() { }
+ private function __construct() {
+ }
/**
* Set up all member variables using a database query.
diff --git a/includes/CategoryPage.php b/includes/CategoryPage.php
index 43ab4dbd..ba71aa01 100644
--- a/includes/CategoryPage.php
+++ b/includes/CategoryPage.php
@@ -106,7 +106,13 @@ class CategoryPage extends Article {
unset( $reqArray["from"] );
unset( $reqArray["to"] );
- $viewer = new $this->mCategoryViewerClass( $this->getContext()->getTitle(), $this->getContext(), $from, $until, $reqArray );
+ $viewer = new $this->mCategoryViewerClass(
+ $this->getContext()->getTitle(),
+ $this->getContext(),
+ $from,
+ $until,
+ $reqArray
+ );
$this->getContext()->getOutput()->addHTML( $viewer->getHTML() );
}
}
diff --git a/includes/CategoryViewer.php b/includes/CategoryViewer.php
index 970adb53..55d9c1e5 100644
--- a/includes/CategoryViewer.php
+++ b/includes/CategoryViewer.php
@@ -141,8 +141,17 @@ class CategoryViewer extends ContextSource {
$this->children = array();
$this->children_start_char = array();
if ( $this->showGallery ) {
- $this->gallery = new ImageGallery();
+ // Note that null for mode is taken to mean use default.
+ $mode = $this->getRequest()->getVal( 'gallerymode', null );
+ try {
+ $this->gallery = ImageGalleryBase::factory( $mode );
+ } catch ( MWException $e ) {
+ // User specified something invalid, fallback to default.
+ $this->gallery = ImageGalleryBase::factory();
+ }
+
$this->gallery->setHideBadImages();
+ $this->gallery->setContext( $this->getContext() );
} else {
$this->imgsNoGallery = array();
$this->imgsNoGallery_start_char = array();
@@ -526,7 +535,10 @@ class CategoryViewer extends ContextSource {
$first = true;
foreach ( $colContents as $char => $articles ) {
- $ret .= '<h3>' . htmlspecialchars( $char );
+ # Change space to non-breaking space to keep headers aligned
+ $h3char = $char === ' ' ? '&#160;' : htmlspecialchars( $char );
+
+ $ret .= '<h3>' . $h3char;
if ( $first && $char === $prevchar ) {
# We're continuing a previous chunk at the top of a new
# column, so add " cont." after the letter.
@@ -645,28 +657,23 @@ class CategoryViewer extends ContextSource {
* returned? This function says what. Each type is considered independently
* of the other types.
*
- * Note for grepping: uses the messages category-article-count,
- * category-article-count-limited, category-subcat-count,
- * category-subcat-count-limited, category-file-count,
- * category-file-count-limited.
- *
* @param int $rescnt The number of items returned by our database query.
* @param int $dbcnt The number of items according to the category table.
* @param string $type 'subcat', 'article', or 'file'
- * @return String: A message giving the number of items, to output to HTML.
+ * @return string: A message giving the number of items, to output to HTML.
*/
private function getCountMessage( $rescnt, $dbcnt, $type ) {
- # There are three cases:
- # 1) The category table figure seems sane. It might be wrong, but
- # we can't do anything about it if we don't recalculate it on ev-
- # ery category view.
- # 2) The category table figure isn't sane, like it's smaller than the
- # number of actual results, *but* the number of results is less
- # than $this->limit and there's no offset. In this case we still
- # know the right figure.
- # 3) We have no idea.
-
- # Check if there's a "from" or "until" for anything
+ // There are three cases:
+ // 1) The category table figure seems sane. It might be wrong, but
+ // we can't do anything about it if we don't recalculate it on ev-
+ // ery category view.
+ // 2) The category table figure isn't sane, like it's smaller than the
+ // number of actual results, *but* the number of results is less
+ // than $this->limit and there's no offset. In this case we still
+ // know the right figure.
+ // 3) We have no idea.
+
+ // 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.
@@ -686,19 +693,22 @@ class CategoryViewer extends ContextSource {
if ( $dbcnt == $rescnt ||
( ( $rescnt == $this->limit || $fromOrUntil ) && $dbcnt > $rescnt )
) {
- # Case 1: seems sane.
+ // Case 1: seems sane.
$totalcnt = $dbcnt;
} 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
- # quick due to the small number of entries.
+ // 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
+ // quick due to the small number of entries.
$totalcnt = $rescnt;
$this->cat->refreshCounts();
} else {
- # Case 3: hopeless. Don't give a total count at all.
+ // Case 3: hopeless. Don't give a total count at all.
+ // Messages: category-subcat-count-limited, category-article-count-limited,
+ // category-file-count-limited
return $this->msg( "category-$type-count-limited" )->numParams( $rescnt )->parseAsBlock();
}
+ // Messages: category-subcat-count, category-article-count, category-file-count
return $this->msg( "category-$type-count" )->numParams( $rescnt, $totalcnt )->parseAsBlock();
}
}
diff --git a/includes/Cdb.php b/includes/Cdb.php
index a142c7cb..81c0afe1 100644
--- a/includes/Cdb.php
+++ b/includes/Cdb.php
@@ -133,7 +133,7 @@ class CdbReader_DBA {
}
function close() {
- if( isset( $this->handle ) ) {
+ if ( isset( $this->handle ) ) {
dba_close( $this->handle );
}
unset( $this->handle );
@@ -164,7 +164,7 @@ class CdbWriter_DBA {
}
function close() {
- if( isset( $this->handle ) ) {
+ if ( isset( $this->handle ) ) {
dba_close( $this->handle );
}
if ( wfIsWindows() ) {
diff --git a/includes/Cdb_PHP.php b/includes/Cdb_PHP.php
index 71b55f87..a38b9a86 100644
--- a/includes/Cdb_PHP.php
+++ b/includes/Cdb_PHP.php
@@ -73,10 +73,10 @@ class CdbFunctions {
public static function hash( $s ) {
$h = 5381;
for ( $i = 0; $i < strlen( $s ); $i++ ) {
- $h5 = ($h << 5) & 0xffffffff;
+ $h5 = ( $h << 5 ) & 0xffffffff;
// Do a 32-bit sum
// Inlined here for speed
- $sum = ($h & 0x3fffffff) + ($h5 & 0x3fffffff);
+ $sum = ( $h & 0x3fffffff ) + ( $h5 & 0x3fffffff );
$h =
(
( $sum & 0x40000000 ? 1 : 0 )
@@ -138,7 +138,7 @@ class CdbReader_PHP extends CdbReader {
}
function close() {
- if( isset( $this->handle ) ) {
+ if ( isset( $this->handle ) ) {
fclose( $this->handle );
}
unset( $this->handle );
@@ -332,7 +332,7 @@ class CdbWriter_PHP extends CdbWriter {
*/
public function close() {
$this->finish();
- if( isset( $this->handle ) ) {
+ if ( isset( $this->handle ) ) {
fclose( $this->handle );
}
if ( wfIsWindows() && file_exists( $this->realFileName ) ) {
@@ -411,7 +411,7 @@ class CdbWriter_PHP extends CdbWriter {
// Calculate the number of items that will be in each hashtable
$counts = array_fill( 0, 256, 0 );
foreach ( $this->hplist as $item ) {
- ++ $counts[ 255 & $item['h'] ];
+ ++ $counts[255 & $item['h']];
}
// Fill in $starts with the *end* indexes
@@ -450,9 +450,11 @@ class CdbWriter_PHP extends CdbWriter {
$hp = $packedTables[$starts[$i] + $u];
$where = CdbFunctions::unsignedMod(
CdbFunctions::unsignedShiftRight( $hp['h'], 8 ), $len );
- while ( $hashtable[$where]['p'] )
- if ( ++$where == $len )
+ while ( $hashtable[$where]['p'] ) {
+ if ( ++$where == $len ) {
$where = 0;
+ }
+ }
$hashtable[$where] = $hp;
}
diff --git a/includes/ChangeTags.php b/includes/ChangeTags.php
index 3adf58f8..3fc27f9a 100644
--- a/includes/ChangeTags.php
+++ b/includes/ChangeTags.php
@@ -34,17 +34,18 @@ class ChangeTags {
* - classes: Array of strings: CSS classes used in the generated html, one class for each tag
*
*/
- static function formatSummaryRow( $tags, $page ) {
+ public static function formatSummaryRow( $tags, $page ) {
global $wgLang;
- if( !$tags )
+ if ( !$tags ) {
return array( '', array() );
+ }
$classes = array();
$tags = explode( ',', $tags );
$displayTags = array();
- foreach( $tags as $tag ) {
+ foreach ( $tags as $tag ) {
$displayTags[] = Xml::tags(
'span',
array( 'class' => 'mw-tag-marker ' .
@@ -53,7 +54,10 @@ class ChangeTags {
);
$classes[] = Sanitizer::escapeClass( "mw-tag-$tag" );
}
- $markers = wfMessage( 'parentheses' )->rawParams( $wgLang->commaList( $displayTags ) )->text();
+ $markers = wfMessage( 'tag-list-wrapper' )
+ ->numParams( count( $displayTags ) )
+ ->rawParams( $wgLang->commaList( $displayTags ) )
+ ->parse();
$markers = Xml::tags( 'span', array( 'class' => 'mw-tag-markers' ), $markers );
return array( $markers, $classes );
@@ -67,7 +71,7 @@ class ChangeTags {
* @return String: Short description of the tag from "mediawiki:tag-$tag" if this message exists,
* html-escaped version of $tag otherwise
*/
- static function tagDescription( $tag ) {
+ public static function tagDescription( $tag ) {
$msg = wfMessage( "tag-$tag" );
return $msg->exists() ? $msg->parse() : htmlspecialchars( $tag );
}
@@ -86,28 +90,29 @@ class ChangeTags {
*
* @exception MWException when $rc_id, $rev_id and $log_id are all null
*/
- static function addTags( $tags, $rc_id = null, $rev_id = null, $log_id = null, $params = null ) {
+ public static function addTags( $tags, $rc_id = null, $rev_id = null, $log_id = null, $params = null ) {
if ( !is_array( $tags ) ) {
$tags = array( $tags );
}
$tags = array_filter( $tags ); // Make sure we're submitting all tags...
- if( !$rc_id && !$rev_id && !$log_id ) {
- throw new MWException( "At least one of: RCID, revision ID, and log ID MUST be specified when adding a tag to a change!" );
+ if ( !$rc_id && !$rev_id && !$log_id ) {
+ throw new MWException( 'At least one of: RCID, revision ID, and log ID MUST be ' .
+ 'specified when adding a tag to a change!' );
}
$dbr = wfGetDB( DB_SLAVE );
// Might as well look for rcids and so on.
- if( !$rc_id ) {
+ if ( !$rc_id ) {
$dbr = wfGetDB( DB_MASTER ); // Info might be out of date, somewhat fractionally, on slave.
- if( $log_id ) {
+ if ( $log_id ) {
$rc_id = $dbr->selectField( 'recentchanges', 'rc_id', array( 'rc_logid' => $log_id ), __METHOD__ );
- } elseif( $rev_id ) {
+ } elseif ( $rev_id ) {
$rc_id = $dbr->selectField( 'recentchanges', 'rc_id', array( 'rc_this_oldid' => $rev_id ), __METHOD__ );
}
- } elseif( !$log_id && !$rev_id ) {
+ } elseif ( !$log_id && !$rev_id ) {
$dbr = wfGetDB( DB_MASTER ); // Info might be out of date, somewhat fractionally, on slave.
$log_id = $dbr->selectField( 'recentchanges', 'rc_logid', array( 'rc_id' => $rc_id ), __METHOD__ );
$rev_id = $dbr->selectField( 'recentchanges', 'rc_this_oldid', array( 'rc_id' => $rc_id ), __METHOD__ );
@@ -138,7 +143,7 @@ class ChangeTags {
// Insert the tags rows.
$tagsRows = array();
- foreach( $tags as $tag ) { // Filter so we don't insert NULLs as zero accidentally.
+ foreach ( $tags as $tag ) { // Filter so we don't insert NULLs as zero accidentally.
$tagsRows[] = array_filter(
array(
'ct_tag' => $tag,
@@ -169,18 +174,18 @@ class ChangeTags {
*
* @throws MWException When unable to determine appropriate JOIN condition for tagging
*/
- static function modifyDisplayQuery( &$tables, &$fields, &$conds,
+ public static function modifyDisplayQuery( &$tables, &$fields, &$conds,
&$join_conds, &$options, $filter_tag = false ) {
global $wgRequest, $wgUseTagFilter;
- if( $filter_tag === false ) {
+ if ( $filter_tag === false ) {
$filter_tag = $wgRequest->getVal( 'tagfilter' );
}
// Figure out which conditions can be done.
if ( in_array( 'recentchanges', $tables ) ) {
$join_cond = 'rc_id';
- } elseif( in_array( 'logging', $tables ) ) {
+ } elseif ( in_array( 'logging', $tables ) ) {
$join_cond = 'log_id';
} elseif ( in_array( 'revision', $tables ) ) {
$join_cond = 'rev_id';
@@ -193,14 +198,12 @@ class ChangeTags {
$join_conds['tag_summary'] = array( 'LEFT JOIN', "ts_$join_cond=$join_cond" );
$fields[] = 'ts_tags';
- if( $wgUseTagFilter && $filter_tag ) {
+ if ( $wgUseTagFilter && $filter_tag ) {
// Somebody wants to filter on a tag.
// Add an INNER JOIN on change_tag
// FORCE INDEX -- change_tags will almost ALWAYS be the correct query plan.
- global $wgOldChangeTagsIndex;
- $index = $wgOldChangeTagsIndex ? 'ct_tag' : 'change_tag_tag_id';
- $options['USE INDEX'] = array( 'change_tag' => $index );
+ $options['USE INDEX'] = array( 'change_tag' => 'change_tag_tag_id' );
unset( $options['FORCE INDEX'] );
$tables[] = 'change_tag';
$join_conds['change_tag'] = array( 'INNER JOIN', "ct_$join_cond=$join_cond" );
@@ -252,7 +255,7 @@ class ChangeTags {
*
* @return Array of strings: tags
*/
- static function listDefinedTags() {
+ public static function listDefinedTags() {
// Caching...
global $wgMemc;
$key = wfMemcKey( 'valid-tags' );
@@ -278,4 +281,34 @@ class ChangeTags {
$wgMemc->set( $key, $emptyTags, 300 );
return $emptyTags;
}
+
+ /**
+ * Returns a map of any tags used on the wiki to number of edits
+ * tagged with them, ordered descending by the hitcount.
+ *
+ * @return array Array of string => int
+ */
+ public static function tagUsageStatistics() {
+ $out = array();
+
+ $dbr = wfGetDB( DB_SLAVE );
+ $res = $dbr->select(
+ 'change_tag',
+ array( 'ct_tag', 'hitcount' => 'count(*)' ),
+ array(),
+ __METHOD__,
+ array( 'GROUP BY' => 'ct_tag', 'ORDER BY' => 'hitcount DESC' )
+ );
+
+ foreach ( $res as $row ) {
+ $out[$row->ct_tag] = $row->hitcount;
+ }
+ foreach ( self::listDefinedTags() as $tag ) {
+ if ( !isset( $out[$tag] ) ) {
+ $out[$tag] = 0;
+ }
+ }
+
+ return $out;
+ }
}
diff --git a/includes/ChangesFeed.php b/includes/ChangesFeed.php
index 476de5bd..0736c507 100644
--- a/includes/ChangesFeed.php
+++ b/includes/ChangesFeed.php
@@ -54,7 +54,7 @@ class ChangesFeed {
return false;
}
- if( !array_key_exists( $this->format, $wgFeedClasses ) ) {
+ if ( !array_key_exists( $this->format, $wgFeedClasses ) ) {
// falling back to atom
$this->format = 'atom';
}
@@ -92,7 +92,7 @@ class ChangesFeed {
* gets it quick too.
*/
$cachedFeed = $this->loadFromCache( $lastmod, $timekey, $key );
- if( is_string( $cachedFeed ) ) {
+ if ( is_string( $cachedFeed ) ) {
wfDebug( "RC: Outputting cached feed\n" );
$feed->httpHeaders();
echo $cachedFeed;
@@ -134,7 +134,7 @@ class ChangesFeed {
$feedLastmod = $messageMemc->get( $timekey );
- if( ( $wgFeedCacheTimeout > 0 ) && $feedLastmod ) {
+ if ( ( $wgFeedCacheTimeout > 0 ) && $feedLastmod ) {
/**
* If the cached feed was rendered very recently, we may
* go ahead and use it even if there have been edits made
@@ -146,7 +146,7 @@ class ChangesFeed {
$feedLastmodUnix = wfTimestamp( TS_UNIX, $feedLastmod );
$lastmodUnix = wfTimestamp( TS_UNIX, $lastmod );
- if( $feedAge < $wgFeedCacheTimeout || $feedLastmodUnix > $lastmodUnix) {
+ if ( $feedAge < $wgFeedCacheTimeout || $feedLastmodUnix > $lastmodUnix ) {
wfDebug( "RC: loading feed from cache ($key; $feedLastmod; $lastmod)...\n" );
if ( $feedLastmodUnix < $lastmodUnix ) {
$wgOut->setLastModified( $feedLastmod ); // bug 21916
@@ -172,30 +172,32 @@ class ChangesFeed {
# Merge adjacent edits by one user
$sorted = array();
$n = 0;
- foreach( $rows as $obj ) {
- if( $n > 0 &&
+ foreach ( $rows as $obj ) {
+ if ( $n > 0 &&
$obj->rc_type == RC_EDIT &&
$obj->rc_namespace >= 0 &&
- $obj->rc_cur_id == $sorted[$n-1]->rc_cur_id &&
- $obj->rc_user_text == $sorted[$n-1]->rc_user_text ) {
- $sorted[$n-1]->rc_last_oldid = $obj->rc_last_oldid;
+ $obj->rc_cur_id == $sorted[$n - 1]->rc_cur_id &&
+ $obj->rc_user_text == $sorted[$n - 1]->rc_user_text ) {
+ $sorted[$n - 1]->rc_last_oldid = $obj->rc_last_oldid;
} else {
$sorted[$n] = $obj;
$n++;
}
}
- foreach( $sorted as $obj ) {
+ foreach ( $sorted as $obj ) {
$title = Title::makeTitle( $obj->rc_namespace, $obj->rc_title );
- $talkpage = MWNamespace::canTalk( $obj->rc_namespace ) ? $title->getTalkPage()->getFullUrl() : '';
+ $talkpage = MWNamespace::canTalk( $obj->rc_namespace ) ? $title->getTalkPage()->getFullURL() : '';
// Skip items with deleted content (avoids partially complete/inconsistent output)
- if( $obj->rc_deleted ) continue;
+ if ( $obj->rc_deleted ) {
+ continue;
+ }
if ( $obj->rc_this_oldid ) {
- $url = $title->getFullURL(
- 'diff=' . $obj->rc_this_oldid .
- '&oldid=' . $obj->rc_last_oldid
- );
+ $url = $title->getFullURL( array(
+ 'diff' => $obj->rc_this_oldid,
+ 'oldid' => $obj->rc_last_oldid,
+ ) );
} else {
// log entry or something like that.
$url = $title->getFullURL();
@@ -206,7 +208,8 @@ class ChangesFeed {
FeedUtils::formatDiff( $obj ),
$url,
$obj->rc_timestamp,
- ( $obj->rc_deleted & Revision::DELETED_USER ) ? wfMessage( 'rev-deleted-user' )->escaped() : $obj->rc_user_text,
+ ( $obj->rc_deleted & Revision::DELETED_USER )
+ ? wfMessage( 'rev-deleted-user' )->escaped() : $obj->rc_user_text,
$talkpage
);
$feed->outItem( $item );
diff --git a/includes/ChangesList.php b/includes/ChangesList.php
deleted file mode 100644
index 8461001e..00000000
--- a/includes/ChangesList.php
+++ /dev/null
@@ -1,1304 +0,0 @@
-<?php
-/**
- * Classes to show lists of changes.
- *
- * These can be:
- * - watchlist
- * - related changes
- * - recent changes
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License along
- * with this program; if not, write to the Free Software Foundation, Inc.,
- * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
- * http://www.gnu.org/copyleft/gpl.html
- *
- * @file
- */
-
-/**
- * @todo document
- */
-class RCCacheEntry extends RecentChange {
- var $secureName, $link;
- var $curlink, $difflink, $lastlink, $usertalklink, $versionlink;
- var $userlink, $timestamp, $watched;
-
- /**
- * @param $rc RecentChange
- * @return RCCacheEntry
- */
- static function newFromParent( $rc ) {
- $rc2 = new RCCacheEntry;
- $rc2->mAttribs = $rc->mAttribs;
- $rc2->mExtra = $rc->mExtra;
- return $rc2;
- }
-}
-
-/**
- * Base class for all changes lists
- */
-class ChangesList extends ContextSource {
-
- /**
- * @var Skin
- */
- public $skin;
-
- protected $watchlist = false;
-
- protected $message;
-
- /**
- * Changeslist constructor
- *
- * @param $obj Skin or IContextSource
- */
- public function __construct( $obj ) {
- if ( $obj instanceof IContextSource ) {
- $this->setContext( $obj );
- $this->skin = $obj->getSkin();
- } else {
- $this->setContext( $obj->getContext() );
- $this->skin = $obj;
- }
- $this->preCacheMessages();
- }
-
- /**
- * Fetch an appropriate changes list class for the main context
- * This first argument used to be an User object.
- *
- * @deprecated in 1.18; use newFromContext() instead
- * @param string|User $unused Unused
- * @return ChangesList|EnhancedChangesList|OldChangesList derivative
- */
- public static function newFromUser( $unused ) {
- wfDeprecated( __METHOD__, '1.18' );
- return self::newFromContext( RequestContext::getMain() );
- }
-
- /**
- * Fetch an appropriate changes list class for the specified context
- * Some users might want to use an enhanced list format, for instance
- *
- * @param $context IContextSource to use
- * @return ChangesList|EnhancedChangesList|OldChangesList derivative
- */
- public static function newFromContext( IContextSource $context ) {
- $user = $context->getUser();
- $sk = $context->getSkin();
- $list = null;
- if( wfRunHooks( 'FetchChangesList', array( $user, &$sk, &$list ) ) ) {
- $new = $context->getRequest()->getBool( 'enhanced', $user->getOption( 'usenewrc' ) );
- return $new ? new EnhancedChangesList( $context ) : new OldChangesList( $context );
- } else {
- return $list;
- }
- }
-
- /**
- * Sets the list to use a "<li class='watchlist-(namespace)-(page)'>" tag
- * @param $value Boolean
- */
- public function setWatchlistDivs( $value = true ) {
- $this->watchlist = $value;
- }
-
- /**
- * 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
- */
- private function preCacheMessages() {
- if( !isset( $this->message ) ) {
- foreach ( explode( ' ', 'cur diff hist last blocklink history ' .
- 'semicolon-separator pipe-separator' ) as $msg ) {
- $this->message[$msg] = $this->msg( $msg )->escaped();
- }
- }
- }
-
- /**
- * Returns the appropriate flags for new page, minor change and patrolling
- * @param array $flags Associative array of 'flag' => Bool
- * @param string $nothing to use for empty space
- * @return String
- */
- protected function recentChangesFlags( $flags, $nothing = '&#160;' ) {
- $f = '';
- foreach( array( 'newpage', 'minor', 'bot', 'unpatrolled' ) as $flag ) {
- $f .= isset( $flags[$flag] ) && $flags[$flag]
- ? self::flag( $flag )
- : $nothing;
- }
- return $f;
- }
-
- /**
- * Provide the "<abbr>" element appropriate to a given abbreviated flag,
- * namely the flag indicating a new page, a minor edit, a bot edit, or an
- * unpatrolled edit. By default in English it will contain "N", "m", "b",
- * "!" respectively, plus it will have an appropriate title and class.
- *
- * @param string $flag 'newpage', 'unpatrolled', 'minor', or 'bot'
- * @return String: Raw HTML
- */
- public static function flag( $flag ) {
- static $messages = null;
- if ( is_null( $messages ) ) {
- $messages = array(
- 'newpage' => array( 'newpageletter', 'recentchanges-label-newpage' ),
- 'minoredit' => array( 'minoreditletter', 'recentchanges-label-minor' ),
- 'botedit' => array( 'boteditletter', 'recentchanges-label-bot' ),
- 'unpatrolled' => array( 'unpatrolledletter', 'recentchanges-label-unpatrolled' ),
- );
- foreach( $messages as &$value ) {
- $value[0] = wfMessage( $value[0] )->escaped();
- $value[1] = wfMessage( $value[1] )->escaped();
- }
- }
-
- # Inconsistent naming, bleh
- $map = array(
- 'newpage' => 'newpage',
- 'minor' => 'minoredit',
- 'bot' => 'botedit',
- 'unpatrolled' => 'unpatrolled',
- 'minoredit' => 'minoredit',
- 'botedit' => 'botedit',
- );
- $flag = $map[$flag];
-
- return "<abbr class='$flag' title='" . $messages[$flag][1] . "'>" . $messages[$flag][0] . '</abbr>';
- }
-
- /**
- * Returns text for the start of the tabular part of RC
- * @return String
- */
- public function beginRecentChangesList() {
- $this->rc_cache = array();
- $this->rcMoveIndex = 0;
- $this->rcCacheIndex = 0;
- $this->lastdate = '';
- $this->rclistOpen = false;
- $this->getOutput()->addModuleStyles( 'mediawiki.special.changeslist' );
- return '';
- }
-
- /**
- * Show formatted char difference
- * @param $old Integer: bytes
- * @param $new Integer: bytes
- * @param $context IContextSource context to use
- * @return String
- */
- public static function showCharacterDifference( $old, $new, IContextSource $context = null ) {
- global $wgRCChangedSizeThreshold, $wgMiserMode;
-
- if ( !$context ) {
- $context = RequestContext::getMain();
- }
-
- $new = (int)$new;
- $old = (int)$old;
- $szdiff = $new - $old;
-
- $lang = $context->getLanguage();
- $code = $lang->getCode();
- static $fastCharDiff = array();
- if ( !isset( $fastCharDiff[$code] ) ) {
- $fastCharDiff[$code] = $wgMiserMode || $context->msg( 'rc-change-size' )->plain() === '$1';
- }
-
- $formattedSize = $lang->formatNum( $szdiff );
-
- if ( !$fastCharDiff[$code] ) {
- $formattedSize = $context->msg( 'rc-change-size', $formattedSize )->text();
- }
-
- if( abs( $szdiff ) > abs( $wgRCChangedSizeThreshold ) ) {
- $tag = 'strong';
- } else {
- $tag = 'span';
- }
-
- if ( $szdiff === 0 ) {
- $formattedSizeClass = 'mw-plusminus-null';
- }
- if ( $szdiff > 0 ) {
- $formattedSize = '+' . $formattedSize;
- $formattedSizeClass = 'mw-plusminus-pos';
- }
- if ( $szdiff < 0 ) {
- $formattedSizeClass = 'mw-plusminus-neg';
- }
-
- $formattedTotalSize = $context->msg( 'rc-change-size-new' )->numParams( $new )->text();
-
- return Html::element( $tag,
- array( 'dir' => 'ltr', 'class' => $formattedSizeClass, 'title' => $formattedTotalSize ),
- $context->msg( 'parentheses', $formattedSize )->plain() ) . $lang->getDirMark();
- }
-
- /**
- * Format the character difference of one or several changes.
- *
- * @param $old RecentChange
- * @param $new RecentChange last change to use, if not provided, $old will be used
- * @return string HTML fragment
- */
- public function formatCharacterDifference( RecentChange $old, RecentChange $new = null ) {
- $oldlen = $old->mAttribs['rc_old_len'];
-
- if ( $new ) {
- $newlen = $new->mAttribs['rc_new_len'];
- } else {
- $newlen = $old->mAttribs['rc_new_len'];
- }
-
- if( $oldlen === null || $newlen === null ) {
- return '';
- }
-
- return self::showCharacterDifference( $oldlen, $newlen, $this->getContext() );
- }
-
- /**
- * Returns text for the end of RC
- * @return String
- */
- public function endRecentChangesList() {
- if( $this->rclistOpen ) {
- return "</ul>\n";
- } else {
- return '';
- }
- }
-
- /**
- * @param string $s HTML to update
- * @param $rc_timestamp mixed
- */
- public function insertDateHeader( &$s, $rc_timestamp ) {
- # Make date header if necessary
- $date = $this->getLanguage()->userDate( $rc_timestamp, $this->getUser() );
- if( $date != $this->lastdate ) {
- if( $this->lastdate != '' ) {
- $s .= "</ul>\n";
- }
- $s .= Xml::element( 'h4', null, $date ) . "\n<ul class=\"special\">";
- $this->lastdate = $date;
- $this->rclistOpen = true;
- }
- }
-
- /**
- * @param string $s HTML to update
- * @param $title Title
- * @param $logtype string
- */
- public function insertLog( &$s, $title, $logtype ) {
- $page = new LogPage( $logtype );
- $logname = $page->getName()->escaped();
- $s .= $this->msg( 'parentheses' )->rawParams( Linker::linkKnown( $title, $logname ) )->escaped();
- }
-
- /**
- * @param string $s HTML to update
- * @param $rc RecentChange
- * @param $unpatrolled
- */
- public function insertDiffHist( &$s, &$rc, $unpatrolled ) {
- # Diff link
- if( $rc->mAttribs['rc_type'] == RC_NEW || $rc->mAttribs['rc_type'] == RC_LOG ) {
- $diffLink = $this->message['diff'];
- } elseif ( !self::userCan( $rc, Revision::DELETED_TEXT, $this->getUser() ) ) {
- $diffLink = $this->message['diff'];
- } else {
- $query = array(
- 'curid' => $rc->mAttribs['rc_cur_id'],
- 'diff' => $rc->mAttribs['rc_this_oldid'],
- 'oldid' => $rc->mAttribs['rc_last_oldid']
- );
-
- if( $unpatrolled ) {
- $query['rcid'] = $rc->mAttribs['rc_id'];
- };
-
- $diffLink = Linker::linkKnown(
- $rc->getTitle(),
- $this->message['diff'],
- array( 'tabindex' => $rc->counter ),
- $query
- );
- }
- $diffhist = $diffLink . $this->message['pipe-separator'];
- # History link
- $diffhist .= Linker::linkKnown(
- $rc->getTitle(),
- $this->message['hist'],
- array(),
- array(
- 'curid' => $rc->mAttribs['rc_cur_id'],
- 'action' => 'history'
- )
- );
- $s .= $this->msg( 'parentheses' )->rawParams( $diffhist )->escaped() . ' <span class="mw-changeslist-separator">. .</span> ';
- }
-
- /**
- * @param string $s HTML to update
- * @param $rc RecentChange
- * @param $unpatrolled
- * @param $watched
- */
- public function insertArticleLink( &$s, &$rc, $unpatrolled, $watched ) {
- # If it's a new article, there is no diff link, but if it hasn't been
- # patrolled yet, we need to give users a way to do so
- $params = array();
-
- if ( $unpatrolled && $rc->mAttribs['rc_type'] == RC_NEW ) {
- $params['rcid'] = $rc->mAttribs['rc_id'];
- }
-
- $articlelink = Linker::linkKnown(
- $rc->getTitle(),
- null,
- array( 'class' => 'mw-changeslist-title' ),
- $params
- );
- if( $this->isDeleted( $rc, Revision::DELETED_TEXT ) ) {
- $articlelink = '<span class="history-deleted">' . $articlelink . '</span>';
- }
- # To allow for boldening pages watched by this user
- $articlelink = "<span class=\"mw-title\">{$articlelink}</span>";
- # RTL/LTR marker
- $articlelink .= $this->getLanguage()->getDirMark();
-
- wfRunHooks( 'ChangesListInsertArticleLink',
- array( &$this, &$articlelink, &$s, &$rc, $unpatrolled, $watched ) );
-
- $s .= " $articlelink";
- }
-
- /**
- * Get the timestamp from $rc formatted with current user's settings
- * and a separator
- *
- * @param $rc RecentChange
- * @return string HTML fragment
- */
- public function getTimestamp( $rc ) {
- return $this->message['semicolon-separator'] . '<span class="mw-changeslist-date">' .
- $this->getLanguage()->userTime( $rc->mAttribs['rc_timestamp'], $this->getUser() ) . '</span> <span class="mw-changeslist-separator">. .</span> ';
- }
-
- /**
- * Insert time timestamp string from $rc into $s
- *
- * @param string $s HTML to update
- * @param $rc RecentChange
- */
- public function insertTimestamp( &$s, $rc ) {
- $s .= $this->getTimestamp( $rc );
- }
-
- /**
- * Insert links to user page, user talk page and eventually a blocking link
- *
- * @param &$s String HTML to update
- * @param &$rc RecentChange
- */
- public function insertUserRelatedLinks( &$s, &$rc ) {
- if( $this->isDeleted( $rc, Revision::DELETED_USER ) ) {
- $s .= ' <span class="history-deleted">' . $this->msg( 'rev-deleted-user' )->escaped() . '</span>';
- } else {
- $s .= $this->getLanguage()->getDirMark() . Linker::userLink( $rc->mAttribs['rc_user'],
- $rc->mAttribs['rc_user_text'] );
- $s .= Linker::userToolLinks( $rc->mAttribs['rc_user'], $rc->mAttribs['rc_user_text'] );
- }
- }
-
- /**
- * Insert a formatted action
- *
- * @param $rc RecentChange
- * @return string
- */
- public function insertLogEntry( $rc ) {
- $formatter = LogFormatter::newFromRow( $rc->mAttribs );
- $formatter->setContext( $this->getContext() );
- $formatter->setShowUserToolLinks( true );
- $mark = $this->getLanguage()->getDirMark();
- return $formatter->getActionText() . " $mark" . $formatter->getComment();
- }
-
- /**
- * Insert a formatted comment
- * @param $rc RecentChange
- * @return string
- */
- public function insertComment( $rc ) {
- if( $rc->mAttribs['rc_type'] != RC_MOVE && $rc->mAttribs['rc_type'] != RC_MOVE_OVER_REDIRECT ) {
- if( $this->isDeleted( $rc, Revision::DELETED_COMMENT ) ) {
- return ' <span class="history-deleted">' . $this->msg( 'rev-deleted-comment' )->escaped() . '</span>';
- } else {
- return Linker::commentBlock( $rc->mAttribs['rc_comment'], $rc->getTitle() );
- }
- }
- return '';
- }
-
- /**
- * Check whether to enable recent changes patrol features
- * @return Boolean
- */
- public static function usePatrol() {
- global $wgUser;
- return $wgUser->useRCPatrol();
- }
-
- /**
- * Returns the string which indicates the number of watching users
- * @return string
- */
- protected function numberofWatchingusers( $count ) {
- static $cache = array();
- if( $count > 0 ) {
- if( !isset( $cache[$count] ) ) {
- $cache[$count] = $this->msg( 'number_of_watching_users_RCview' )->numParams( $count )->escaped();
- }
- return $cache[$count];
- } else {
- return '';
- }
- }
-
- /**
- * Determine if said field of a revision is hidden
- * @param $rc RCCacheEntry
- * @param $field Integer: one of DELETED_* bitfield constants
- * @return Boolean
- */
- public static function isDeleted( $rc, $field ) {
- return ( $rc->mAttribs['rc_deleted'] & $field ) == $field;
- }
-
- /**
- * Determine if the current user is allowed to view a particular
- * field of this revision, if it's marked as deleted.
- * @param $rc RCCacheEntry
- * @param $field Integer
- * @param $user User object to check, or null to use $wgUser
- * @return Boolean
- */
- public static function userCan( $rc, $field, User $user = null ) {
- if( $rc->mAttribs['rc_type'] == RC_LOG ) {
- return LogEventsList::userCanBitfield( $rc->mAttribs['rc_deleted'], $field, $user );
- } else {
- return Revision::userCanBitfield( $rc->mAttribs['rc_deleted'], $field, $user );
- }
- }
-
- /**
- * @param $link string
- * @param $watched bool
- * @return string
- */
- protected function maybeWatchedLink( $link, $watched = false ) {
- if( $watched ) {
- return '<strong class="mw-watched">' . $link . '</strong>';
- } else {
- return '<span class="mw-rc-unwatched">' . $link . '</span>';
- }
- }
-
- /** Inserts a rollback link
- *
- * @param $s string
- * @param $rc RecentChange
- */
- public function insertRollback( &$s, &$rc ) {
- if( $rc->mAttribs['rc_type'] != RC_NEW && $rc->mAttribs['rc_this_oldid'] && $rc->mAttribs['rc_cur_id'] ) {
- $page = $rc->getTitle();
- /** Check for rollback and edit permissions, disallow special pages, and only
- * show a link on the top-most revision */
- if ( $this->getUser()->isAllowed( 'rollback' ) && $rc->mAttribs['page_latest'] == $rc->mAttribs['rc_this_oldid'] )
- {
- $rev = new Revision( array(
- 'title' => $page,
- 'id' => $rc->mAttribs['rc_this_oldid'],
- 'user' => $rc->mAttribs['rc_user'],
- 'user_text' => $rc->mAttribs['rc_user_text'],
- 'deleted' => $rc->mAttribs['rc_deleted']
- ) );
- $s .= ' '.Linker::generateRollback( $rev, $this->getContext() );
- }
- }
- }
-
- /**
- * @param $s string
- * @param $rc RecentChange
- * @param $classes
- */
- public function insertTags( &$s, &$rc, &$classes ) {
- if ( empty( $rc->mAttribs['ts_tags'] ) )
- return;
-
- list( $tagSummary, $newClasses ) = ChangeTags::formatSummaryRow( $rc->mAttribs['ts_tags'], 'changeslist' );
- $classes = array_merge( $classes, $newClasses );
- $s .= ' ' . $tagSummary;
- }
-
- public function insertExtra( &$s, &$rc, &$classes ) {
- // Empty, used for subclasses to add anything special.
- }
-
- protected function showAsUnpatrolled( RecentChange $rc ) {
- $unpatrolled = false;
- if ( !$rc->mAttribs['rc_patrolled'] ) {
- if ( $this->getUser()->useRCPatrol() ) {
- $unpatrolled = true;
- } elseif ( $this->getUser()->useNPPatrol() && $rc->mAttribs['rc_type'] == RC_NEW ) {
- $unpatrolled = true;
- }
- }
- return $unpatrolled;
- }
-}
-
-/**
- * Generate a list of changes using the good old system (no javascript)
- */
-class OldChangesList extends ChangesList {
- /**
- * Format a line using the old system (aka without any javascript).
- *
- * @param $rc RecentChange, passed by reference
- * @param bool $watched (default false)
- * @param int $linenumber (default null)
- *
- * @return string|bool
- */
- public function recentChangesLine( &$rc, $watched = false, $linenumber = null ) {
- global $wgRCShowChangedSize;
- wfProfileIn( __METHOD__ );
-
- # Should patrol-related stuff be shown?
- $unpatrolled = $this->showAsUnpatrolled( $rc );
-
- $dateheader = ''; // $s now contains only <li>...</li>, for hooks' convenience.
- $this->insertDateHeader( $dateheader, $rc->mAttribs['rc_timestamp'] );
-
- $s = '';
- $classes = array();
- // use mw-line-even/mw-line-odd class only if linenumber is given (feature from bug 14468)
- if( $linenumber ) {
- if( $linenumber & 1 ) {
- $classes[] = 'mw-line-odd';
- }
- else {
- $classes[] = 'mw-line-even';
- }
- }
-
- // Indicate watched status on the line to allow for more
- // comprehensive styling.
- $classes[] = $watched ? 'mw-changeslist-line-watched' : 'mw-changeslist-line-not-watched';
-
- // Moved pages (very very old, not supported anymore)
- if( $rc->mAttribs['rc_type'] == RC_MOVE || $rc->mAttribs['rc_type'] == RC_MOVE_OVER_REDIRECT ) {
- // Log entries
- } elseif( $rc->mAttribs['rc_log_type'] ) {
- $logtitle = SpecialPage::getTitleFor( 'Log', $rc->mAttribs['rc_log_type'] );
- $this->insertLog( $s, $logtitle, $rc->mAttribs['rc_log_type'] );
- // Log entries (old format) or log targets, and special pages
- } elseif( $rc->mAttribs['rc_namespace'] == NS_SPECIAL ) {
- list( $name, $subpage ) = SpecialPageFactory::resolveAlias( $rc->mAttribs['rc_title'] );
- if( $name == 'Log' ) {
- $this->insertLog( $s, $rc->getTitle(), $subpage );
- }
- // Regular entries
- } else {
- $this->insertDiffHist( $s, $rc, $unpatrolled );
- # M, N, b and ! (minor, new, bot and unpatrolled)
- $s .= $this->recentChangesFlags(
- array(
- 'newpage' => $rc->mAttribs['rc_type'] == RC_NEW,
- 'minor' => $rc->mAttribs['rc_minor'],
- 'unpatrolled' => $unpatrolled,
- 'bot' => $rc->mAttribs['rc_bot']
- ),
- ''
- );
- $this->insertArticleLink( $s, $rc, $unpatrolled, $watched );
- }
- # Edit/log timestamp
- $this->insertTimestamp( $s, $rc );
- # Bytes added or removed
- if ( $wgRCShowChangedSize ) {
- $cd = $this->formatCharacterDifference( $rc );
- if ( $cd !== '' ) {
- $s .= $cd . ' <span class="mw-changeslist-separator">. .</span> ';
- }
- }
-
- if ( $rc->mAttribs['rc_type'] == RC_LOG ) {
- $s .= $this->insertLogEntry( $rc );
- } else {
- # User tool links
- $this->insertUserRelatedLinks( $s, $rc );
- # LTR/RTL direction mark
- $s .= $this->getLanguage()->getDirMark();
- $s .= $this->insertComment( $rc );
- }
-
- # Tags
- $this->insertTags( $s, $rc, $classes );
- # Rollback
- $this->insertRollback( $s, $rc );
- # For subclasses
- $this->insertExtra( $s, $rc, $classes );
-
- # How many users watch this page
- if( $rc->numberofWatchingusers > 0 ) {
- $s .= ' ' . $this->numberofWatchingusers( $rc->numberofWatchingusers );
- }
-
- if( $this->watchlist ) {
- $classes[] = Sanitizer::escapeClass( 'watchlist-' . $rc->mAttribs['rc_namespace'] . '-' . $rc->mAttribs['rc_title'] );
- }
-
- if ( !wfRunHooks( 'OldChangesListRecentChangesLine', array( &$this, &$s, $rc, &$classes ) ) ) {
- wfProfileOut( __METHOD__ );
- return false;
- }
-
- wfProfileOut( __METHOD__ );
- return "$dateheader<li class=\"" . implode( ' ', $classes ) . "\">" . $s . "</li>\n";
- }
-}
-
-/**
- * Generate a list of changes using an Enhanced system (uses javascript).
- */
-class EnhancedChangesList extends ChangesList {
-
- protected $rc_cache;
-
- /**
- * Add the JavaScript file for enhanced changeslist
- * @return String
- */
- public function beginRecentChangesList() {
- $this->rc_cache = array();
- $this->rcMoveIndex = 0;
- $this->rcCacheIndex = 0;
- $this->lastdate = '';
- $this->rclistOpen = false;
- $this->getOutput()->addModuleStyles( 'mediawiki.special.changeslist' );
- return '';
- }
- /**
- * Format a line for enhanced recentchange (aka with javascript and block of lines).
- *
- * @param $baseRC RecentChange
- * @param $watched bool
- *
- * @return string
- */
- public function recentChangesLine( &$baseRC, $watched = false ) {
- wfProfileIn( __METHOD__ );
-
- # Create a specialised object
- $rc = RCCacheEntry::newFromParent( $baseRC );
-
- $curIdEq = array( 'curid' => $rc->mAttribs['rc_cur_id'] );
-
- # If it's a new day, add the headline and flush the cache
- $date = $this->getLanguage()->userDate( $rc->mAttribs['rc_timestamp'], $this->getUser() );
- $ret = '';
- if( $date != $this->lastdate ) {
- # Process current cache
- $ret = $this->recentChangesBlock();
- $this->rc_cache = array();
- $ret .= Xml::element( 'h4', null, $date ) . "\n";
- $this->lastdate = $date;
- }
-
- # Should patrol-related stuff be shown?
- $rc->unpatrolled = $this->showAsUnpatrolled( $rc );
-
- $showdifflinks = true;
- # Make article link
- $type = $rc->mAttribs['rc_type'];
- $logType = $rc->mAttribs['rc_log_type'];
- // Page moves, very old style, not supported anymore
- if( $type == RC_MOVE || $type == RC_MOVE_OVER_REDIRECT ) {
- // New unpatrolled pages
- } elseif( $rc->unpatrolled && $type == RC_NEW ) {
- $clink = Linker::linkKnown( $rc->getTitle(), null, array(),
- array( 'rcid' => $rc->mAttribs['rc_id'] ) );
- // Log entries
- } elseif( $type == RC_LOG ) {
- if( $logType ) {
- $logtitle = SpecialPage::getTitleFor( 'Log', $logType );
- $logpage = new LogPage( $logType );
- $logname = $logpage->getName()->escaped();
- $clink = $this->msg( 'parentheses' )->rawParams( Linker::linkKnown( $logtitle, $logname ) )->escaped();
- } else {
- $clink = Linker::link( $rc->getTitle() );
- }
- $watched = false;
- // Log entries (old format) and special pages
- } elseif( $rc->mAttribs['rc_namespace'] == NS_SPECIAL ) {
- wfDebug( "Unexpected special page in recentchanges\n" );
- $clink = '';
- // Edits
- } else {
- $clink = Linker::linkKnown( $rc->getTitle() );
- }
-
- # Don't show unusable diff links
- if ( !ChangesList::userCan( $rc, Revision::DELETED_TEXT, $this->getUser() ) ) {
- $showdifflinks = false;
- }
-
- $time = $this->getLanguage()->userTime( $rc->mAttribs['rc_timestamp'], $this->getUser() );
- $rc->watched = $watched;
- $rc->link = $clink;
- $rc->timestamp = $time;
- $rc->numberofWatchingusers = $baseRC->numberofWatchingusers;
-
- # Make "cur" and "diff" links. Do not use link(), it is too slow if
- # called too many times (50% of CPU time on RecentChanges!).
- $thisOldid = $rc->mAttribs['rc_this_oldid'];
- $lastOldid = $rc->mAttribs['rc_last_oldid'];
- if( $rc->unpatrolled ) {
- $rcIdQuery = array( 'rcid' => $rc->mAttribs['rc_id'] );
- } else {
- $rcIdQuery = array();
- }
- $querycur = $curIdEq + array( 'diff' => '0', 'oldid' => $thisOldid );
- $querydiff = $curIdEq + array( 'diff' => $thisOldid, 'oldid' =>
- $lastOldid ) + $rcIdQuery;
-
- if( !$showdifflinks ) {
- $curLink = $this->message['cur'];
- $diffLink = $this->message['diff'];
- } elseif( in_array( $type, array( RC_NEW, RC_LOG, RC_MOVE, RC_MOVE_OVER_REDIRECT ) ) ) {
- if ( $type != RC_NEW ) {
- $curLink = $this->message['cur'];
- } else {
- $curUrl = htmlspecialchars( $rc->getTitle()->getLinkURL( $querycur ) );
- $curLink = "<a href=\"$curUrl\" tabindex=\"{$baseRC->counter}\">{$this->message['cur']}</a>";
- }
- $diffLink = $this->message['diff'];
- } else {
- $diffUrl = htmlspecialchars( $rc->getTitle()->getLinkURL( $querydiff ) );
- $curUrl = htmlspecialchars( $rc->getTitle()->getLinkURL( $querycur ) );
- $diffLink = "<a href=\"$diffUrl\" tabindex=\"{$baseRC->counter}\">{$this->message['diff']}</a>";
- $curLink = "<a href=\"$curUrl\" tabindex=\"{$baseRC->counter}\">{$this->message['cur']}</a>";
- }
-
- # Make "last" link
- if( !$showdifflinks || !$lastOldid ) {
- $lastLink = $this->message['last'];
- } elseif( in_array( $type, array( RC_LOG, RC_MOVE, RC_MOVE_OVER_REDIRECT ) ) ) {
- $lastLink = $this->message['last'];
- } else {
- $lastLink = Linker::linkKnown( $rc->getTitle(), $this->message['last'],
- array(), $curIdEq + array( 'diff' => $thisOldid, 'oldid' => $lastOldid ) + $rcIdQuery );
- }
-
- # Make user links
- if( $this->isDeleted( $rc, Revision::DELETED_USER ) ) {
- $rc->userlink = ' <span class="history-deleted">' . $this->msg( 'rev-deleted-user' )->escaped() . '</span>';
- } else {
- $rc->userlink = Linker::userLink( $rc->mAttribs['rc_user'], $rc->mAttribs['rc_user_text'] );
- $rc->usertalklink = Linker::userToolLinks( $rc->mAttribs['rc_user'], $rc->mAttribs['rc_user_text'] );
- }
-
- $rc->lastlink = $lastLink;
- $rc->curlink = $curLink;
- $rc->difflink = $diffLink;
-
- # Put accumulated information into the cache, for later display
- # Page moves go on their own line
- $title = $rc->getTitle();
- $secureName = $title->getPrefixedDBkey();
- if( $type == RC_MOVE || $type == RC_MOVE_OVER_REDIRECT ) {
- # Use an @ character to prevent collision with page names
- $this->rc_cache['@@' . ($this->rcMoveIndex++)] = array( $rc );
- } else {
- # Logs are grouped by type
- if( $type == RC_LOG ) {
- $secureName = SpecialPage::getTitleFor( 'Log', $logType )->getPrefixedDBkey();
- }
- if( !isset( $this->rc_cache[$secureName] ) ) {
- $this->rc_cache[$secureName] = array();
- }
-
- array_push( $this->rc_cache[$secureName], $rc );
- }
-
- wfProfileOut( __METHOD__ );
-
- return $ret;
- }
-
- /**
- * Enhanced RC group
- * @return string
- */
- protected function recentChangesBlockGroup( $block ) {
- global $wgRCShowChangedSize;
-
- wfProfileIn( __METHOD__ );
-
- # Add the namespace and title of the block as part of the class
- $classes = array( 'mw-collapsible', 'mw-collapsed', 'mw-enhanced-rc' );
- if ( $block[0]->mAttribs['rc_log_type'] ) {
- # Log entry
- $classes[] = Sanitizer::escapeClass( 'mw-changeslist-log-'
- . $block[0]->mAttribs['rc_log_type'] . '-' . $block[0]->mAttribs['rc_title'] );
- } else {
- $classes[] = Sanitizer::escapeClass( 'mw-changeslist-ns'
- . $block[0]->mAttribs['rc_namespace'] . '-' . $block[0]->mAttribs['rc_title'] );
- }
- $classes[] = $block[0]->watched ? 'mw-changeslist-line-watched' : 'mw-changeslist-line-not-watched';
- $r = Html::openElement( 'table', array( 'class' => $classes ) ) .
- Html::openElement( 'tr' );
-
- # Collate list of users
- $userlinks = array();
- # Other properties
- $unpatrolled = false;
- $isnew = false;
- $allBots = true;
- $allMinors = true;
- $curId = $currentRevision = 0;
- # Some catalyst variables...
- $namehidden = true;
- $allLogs = true;
- foreach( $block as $rcObj ) {
- $oldid = $rcObj->mAttribs['rc_last_oldid'];
- if( $rcObj->mAttribs['rc_type'] == RC_NEW ) {
- $isnew = true;
- }
- // If all log actions to this page were hidden, then don't
- // give the name of the affected page for this block!
- if( !$this->isDeleted( $rcObj, LogPage::DELETED_ACTION ) ) {
- $namehidden = false;
- }
- $u = $rcObj->userlink;
- if( !isset( $userlinks[$u] ) ) {
- $userlinks[$u] = 0;
- }
- if( $rcObj->unpatrolled ) {
- $unpatrolled = true;
- }
- if( $rcObj->mAttribs['rc_type'] != RC_LOG ) {
- $allLogs = false;
- }
- # Get the latest entry with a page_id and oldid
- # since logs may not have these.
- if( !$curId && $rcObj->mAttribs['rc_cur_id'] ) {
- $curId = $rcObj->mAttribs['rc_cur_id'];
- }
- if( !$currentRevision && $rcObj->mAttribs['rc_this_oldid'] ) {
- $currentRevision = $rcObj->mAttribs['rc_this_oldid'];
- }
-
- if( !$rcObj->mAttribs['rc_bot'] ) {
- $allBots = false;
- }
- if( !$rcObj->mAttribs['rc_minor'] ) {
- $allMinors = false;
- }
-
- $userlinks[$u]++;
- }
-
- # Sort the list and convert to text
- krsort( $userlinks );
- asort( $userlinks );
- $users = array();
- foreach( $userlinks as $userlink => $count) {
- $text = $userlink;
- $text .= $this->getLanguage()->getDirMark();
- if( $count > 1 ) {
- $text .= ' ' . $this->msg( 'parentheses' )->rawParams( $this->getLanguage()->formatNum( $count ) . '×' )->escaped();
- }
- array_push( $users, $text );
- }
-
- $users = ' <span class="changedby">'
- . $this->msg( 'brackets' )->rawParams(
- implode( $this->message['semicolon-separator'], $users )
- )->escaped() . '</span>';
-
- $tl = '<span class="mw-collapsible-toggle mw-enhancedchanges-arrow mw-enhancedchanges-arrow-space"></span>';
- $r .= "<td>$tl</td>";
-
- # Main line
- $r .= '<td class="mw-enhanced-rc">' . $this->recentChangesFlags( array(
- 'newpage' => $isnew, # show, when one have this flag
- 'minor' => $allMinors, # show only, when all have this flag
- 'unpatrolled' => $unpatrolled, # show, when one have this flag
- 'bot' => $allBots, # show only, when all have this flag
- ) );
-
- # Timestamp
- $r .= '&#160;' . $block[0]->timestamp . '&#160;</td><td>';
-
- # Article link
- if( $namehidden ) {
- $r .= ' <span class="history-deleted">' . $this->msg( 'rev-deleted-event' )->escaped() . '</span>';
- } elseif( $allLogs ) {
- $r .= $this->maybeWatchedLink( $block[0]->link, $block[0]->watched );
- } else {
- $this->insertArticleLink( $r, $block[0], $block[0]->unpatrolled, $block[0]->watched );
- }
-
- $r .= $this->getLanguage()->getDirMark();
-
- $queryParams['curid'] = $curId;
- # Changes message
- $n = count( $block );
- static $nchanges = array();
- if ( !isset( $nchanges[$n] ) ) {
- $nchanges[$n] = $this->msg( 'nchanges' )->numParams( $n )->escaped();
- }
- # Total change link
- $r .= ' ';
- $logtext = '';
- if( !$allLogs ) {
- if( !ChangesList::userCan( $rcObj, Revision::DELETED_TEXT, $this->getUser() ) ) {
- $logtext .= $nchanges[$n];
- } elseif( $isnew ) {
- $logtext .= $nchanges[$n];
- } else {
- $params = $queryParams;
- $params['diff'] = $currentRevision;
- $params['oldid'] = $oldid;
-
- $logtext .= Linker::link(
- $block[0]->getTitle(),
- $nchanges[$n],
- array(),
- $params,
- array( 'known', 'noclasses' )
- );
- }
- }
-
- # History
- if( $allLogs ) {
- // don't show history link for logs
- } elseif( $namehidden || !$block[0]->getTitle()->exists() ) {
- $logtext .= $this->message['pipe-separator'] . $this->message['hist'];
- } else {
- $params = $queryParams;
- $params['action'] = 'history';
-
- $logtext .= $this->message['pipe-separator'] .
- Linker::linkKnown(
- $block[0]->getTitle(),
- $this->message['hist'],
- array(),
- $params
- );
- }
-
- if( $logtext !== '' ) {
- $r .= $this->msg( 'parentheses' )->rawParams( $logtext )->escaped();
- }
-
- $r .= ' <span class="mw-changeslist-separator">. .</span> ';
-
- # Character difference (does not apply if only log items)
- if( $wgRCShowChangedSize && !$allLogs ) {
- $last = 0;
- $first = count( $block ) - 1;
- # Some events (like logs) have an "empty" size, so we need to skip those...
- while( $last < $first && $block[$last]->mAttribs['rc_new_len'] === null ) {
- $last++;
- }
- while( $first > $last && $block[$first]->mAttribs['rc_old_len'] === null ) {
- $first--;
- }
- # Get net change
- $chardiff = $this->formatCharacterDifference( $block[$first], $block[$last] );
-
- if( $chardiff == '' ) {
- $r .= ' ';
- } else {
- $r .= ' ' . $chardiff. ' <span class="mw-changeslist-separator">. .</span> ';
- }
- }
-
- $r .= $users;
- $r .= $this->numberofWatchingusers( $block[0]->numberofWatchingusers );
-
- # Sub-entries
- foreach( $block as $rcObj ) {
- # Classes to apply -- TODO implement
- $classes = array();
- $type = $rcObj->mAttribs['rc_type'];
-
- $r .= '<tr><td></td><td class="mw-enhanced-rc">';
- $r .= $this->recentChangesFlags( array(
- 'newpage' => $type == RC_NEW,
- 'minor' => $rcObj->mAttribs['rc_minor'],
- 'unpatrolled' => $rcObj->unpatrolled,
- 'bot' => $rcObj->mAttribs['rc_bot'],
- ) );
- $r .= '&#160;</td><td class="mw-enhanced-rc-nested"><span class="mw-enhanced-rc-time">';
-
- $params = $queryParams;
-
- if( $rcObj->mAttribs['rc_this_oldid'] != 0 ) {
- $params['oldid'] = $rcObj->mAttribs['rc_this_oldid'];
- }
-
- # Log timestamp
- if( $type == RC_LOG ) {
- $link = $rcObj->timestamp;
- # Revision link
- } elseif( !ChangesList::userCan( $rcObj, Revision::DELETED_TEXT, $this->getUser() ) ) {
- $link = '<span class="history-deleted">' . $rcObj->timestamp . '</span> ';
- } else {
- if ( $rcObj->unpatrolled && $type == RC_NEW) {
- $params['rcid'] = $rcObj->mAttribs['rc_id'];
- }
-
- $link = Linker::linkKnown(
- $rcObj->getTitle(),
- $rcObj->timestamp,
- array(),
- $params
- );
- if( $this->isDeleted( $rcObj, Revision::DELETED_TEXT ) ) {
- $link = '<span class="history-deleted">' . $link . '</span> ';
- }
- }
- $r .= $link . '</span>';
-
- if ( !$type == RC_LOG || $type == RC_NEW ) {
- $r .= ' ' . $this->msg( 'parentheses' )->rawParams( $rcObj->curlink . $this->message['pipe-separator'] . $rcObj->lastlink )->escaped();
- }
- $r .= ' <span class="mw-changeslist-separator">. .</span> ';
-
- # Character diff
- if ( $wgRCShowChangedSize ) {
- $cd = $this->formatCharacterDifference( $rcObj );
- if ( $cd !== '' ) {
- $r .= $cd . ' <span class="mw-changeslist-separator">. .</span> ';
- }
- }
-
- if ( $rcObj->mAttribs['rc_type'] == RC_LOG ) {
- $r .= $this->insertLogEntry( $rcObj );
- } else {
- # User links
- $r .= $rcObj->userlink;
- $r .= $rcObj->usertalklink;
- $r .= $this->insertComment( $rcObj );
- }
-
- # Rollback
- $this->insertRollback( $r, $rcObj );
- # Tags
- $this->insertTags( $r, $rcObj, $classes );
-
- $r .= "</td></tr>\n";
- }
- $r .= "</table>\n";
-
- $this->rcCacheIndex++;
-
- wfProfileOut( __METHOD__ );
-
- return $r;
- }
-
- /**
- * Generate HTML for an arrow or placeholder graphic
- * @param string $dir one of '', 'd', 'l', 'r'
- * @param string $alt text
- * @param string $title text
- * @return String: HTML "<img>" tag
- */
- protected function arrow( $dir, $alt = '', $title = '' ) {
- global $wgStylePath;
- $encUrl = htmlspecialchars( $wgStylePath . '/common/images/Arr_' . $dir . '.png' );
- $encAlt = htmlspecialchars( $alt );
- $encTitle = htmlspecialchars( $title );
- return "<img src=\"$encUrl\" width=\"12\" height=\"12\" alt=\"$encAlt\" title=\"$encTitle\" />";
- }
-
- /**
- * Generate HTML for a right- or left-facing arrow,
- * depending on language direction.
- * @return String: HTML "<img>" tag
- */
- protected function sideArrow() {
- $dir = $this->getLanguage()->isRTL() ? 'l' : 'r';
- return $this->arrow( $dir, '+', $this->msg( 'rc-enhanced-expand' )->text() );
- }
-
- /**
- * Generate HTML for a down-facing arrow
- * depending on language direction.
- * @return String: HTML "<img>" tag
- */
- protected function downArrow() {
- return $this->arrow( 'd', '-', $this->msg( 'rc-enhanced-hide' )->text() );
- }
-
- /**
- * Generate HTML for a spacer image
- * @return String: HTML "<img>" tag
- */
- protected function spacerArrow() {
- return $this->arrow( '', codepointToUtf8( 0xa0 ) ); // non-breaking space
- }
-
- /**
- * Enhanced RC ungrouped line.
- *
- * @param $rcObj RecentChange
- * @return String: a HTML formatted line (generated using $r)
- */
- protected function recentChangesBlockLine( $rcObj ) {
- global $wgRCShowChangedSize;
-
- wfProfileIn( __METHOD__ );
- $query['curid'] = $rcObj->mAttribs['rc_cur_id'];
-
- $type = $rcObj->mAttribs['rc_type'];
- $logType = $rcObj->mAttribs['rc_log_type'];
- $classes = array( 'mw-enhanced-rc' );
- if( $logType ) {
- # Log entry
- $classes[] = Sanitizer::escapeClass( 'mw-changeslist-log-'
- . $logType . '-' . $rcObj->mAttribs['rc_title'] );
- } else {
- $classes[] = Sanitizer::escapeClass( 'mw-changeslist-ns' .
- $rcObj->mAttribs['rc_namespace'] . '-' . $rcObj->mAttribs['rc_title'] );
- }
- $classes[] = $rcObj->watched ? 'mw-changeslist-line-watched' : 'mw-changeslist-line-not-watched';
- $r = Html::openElement( 'table', array( 'class' => $classes ) ) .
- Html::openElement( 'tr' );
-
- $r .= '<td class="mw-enhanced-rc"><span class="mw-enhancedchanges-arrow-space"></span>';
- # Flag and Timestamp
- if( $type == RC_MOVE || $type == RC_MOVE_OVER_REDIRECT ) {
- $r .= '&#160;&#160;&#160;&#160;'; // 4 flags -> 4 spaces
- } else {
- $r .= $this->recentChangesFlags( array(
- 'newpage' => $type == RC_NEW,
- 'minor' => $rcObj->mAttribs['rc_minor'],
- 'unpatrolled' => $rcObj->unpatrolled,
- 'bot' => $rcObj->mAttribs['rc_bot'],
- ) );
- }
- $r .= '&#160;' . $rcObj->timestamp . '&#160;</td><td>';
- # Article or log link
- if( $logType ) {
- $logPage = new LogPage( $logType );
- $logTitle = SpecialPage::getTitleFor( 'Log', $logType );
- $logName = $logPage->getName()->escaped();
- $r .= $this->msg( 'parentheses' )->rawParams( Linker::linkKnown( $logTitle, $logName ) )->escaped();
- } else {
- $this->insertArticleLink( $r, $rcObj, $rcObj->unpatrolled, $rcObj->watched );
- }
- # Diff and hist links
- if ( $type != RC_LOG ) {
- $query['action'] = 'history';
- $r .= ' ' . $this->msg( 'parentheses' )->rawParams( $rcObj->difflink . $this->message['pipe-separator'] . Linker::linkKnown(
- $rcObj->getTitle(),
- $this->message['hist'],
- array(),
- $query
- ) )->escaped();
- }
- $r .= ' <span class="mw-changeslist-separator">. .</span> ';
- # Character diff
- if ( $wgRCShowChangedSize ) {
- $cd = $this->formatCharacterDifference( $rcObj );
- if ( $cd !== '' ) {
- $r .= $cd . ' <span class="mw-changeslist-separator">. .</span> ';
- }
- }
-
- if ( $type == RC_LOG ) {
- $r .= $this->insertLogEntry( $rcObj );
- } else {
- $r .= ' ' . $rcObj->userlink . $rcObj->usertalklink;
- $r .= $this->insertComment( $rcObj );
- $this->insertRollback( $r, $rcObj );
- }
-
- # Tags
- $this->insertTags( $r, $rcObj, $classes );
- # Show how many people are watching this if enabled
- $r .= $this->numberofWatchingusers( $rcObj->numberofWatchingusers );
-
- $r .= "</td></tr></table>\n";
-
- wfProfileOut( __METHOD__ );
-
- return $r;
- }
-
- /**
- * If enhanced RC is in use, this function takes the previously cached
- * RC lines, arranges them, and outputs the HTML
- *
- * @return string
- */
- protected function recentChangesBlock() {
- if( count ( $this->rc_cache ) == 0 ) {
- return '';
- }
-
- wfProfileIn( __METHOD__ );
-
- $blockOut = '';
- foreach( $this->rc_cache as $block ) {
- if( count( $block ) < 2 ) {
- $blockOut .= $this->recentChangesBlockLine( array_shift( $block ) );
- } else {
- $blockOut .= $this->recentChangesBlockGroup( $block );
- }
- }
-
- wfProfileOut( __METHOD__ );
-
- return '<div>' . $blockOut . '</div>';
- }
-
- /**
- * Returns text for the end of RC
- * If enhanced RC is in use, returns pretty much all the text
- * @return string
- */
- public function endRecentChangesList() {
- return $this->recentChangesBlock() . parent::endRecentChangesList();
- }
-
-}
diff --git a/includes/Collation.php b/includes/Collation.php
index 6bba019b..b0252c70 100644
--- a/includes/Collation.php
+++ b/includes/Collation.php
@@ -40,7 +40,7 @@ abstract class Collation {
* @return Collation
*/
static function factory( $collationName ) {
- switch( $collationName ) {
+ switch ( $collationName ) {
case 'uppercase':
return new UppercaseCollation;
case 'identity':
@@ -49,7 +49,7 @@ abstract class Collation {
return new IcuCollation( 'root' );
default:
$match = array();
- if ( preg_match( '/^uca-([a-z-]+)$/', $collationName, $match ) ) {
+ if ( preg_match( '/^uca-([a-z@=-]+)$/', $collationName, $match ) ) {
return new IcuCollation( $match[1] );
}
@@ -62,7 +62,7 @@ abstract class Collation {
}
// If all else fails...
- throw new MWException( __METHOD__.": unknown collation type \"$collationName\"" );
+ throw new MWException( __METHOD__ . ": unknown collation type \"$collationName\"" );
}
}
@@ -214,6 +214,7 @@ class IcuCollation extends Collation {
'pt' => array(),
'ru' => array(),
'sv' => array( "Å", "Ä", "Ö" ),
+ 'sv@collation=standard' => array( "Å", "Ä", "Ö" ),
'uk' => array( "Ò", "Ь" ),
'vi' => array( "Ä‚", "Â", "Ä", "Ê", "Ô", "Æ ", "Ư" ),
// Not verified, but likely correct
@@ -235,6 +236,7 @@ class IcuCollation extends Collation {
'es' => array( "Ñ" ),
'et' => array( "Š", "Ž", "Õ", "Ä", "Ö", "Ü" ),
'eu' => array( "Ñ" ),
+ 'fa' => array( "Ø¢", "Ø¡", "Ù‡" ),
'fo' => array( "Ã", "Ã", "Ã", "Ó", "Ú", "Ã", "Æ", "Ø", "Ã…" ),
'fr' => array(),
'fur' => array( "À", "Ã", "Â", "È", "ÃŒ", "Ã’", "Ù" ),
@@ -349,21 +351,21 @@ class IcuCollation extends Collation {
$cacheEntry = $cache->get( $cacheKey );
if ( $cacheEntry && isset( $cacheEntry['version'] )
- && $cacheEntry['version'] == self::FIRST_LETTER_VERSION )
- {
+ && $cacheEntry['version'] == self::FIRST_LETTER_VERSION
+ ) {
$this->firstLetterData = $cacheEntry;
return $this->firstLetterData;
}
// Generate data from serialized data file
- if ( isset ( self::$tailoringFirstLetters[$this->locale] ) ) {
+ if ( isset( self::$tailoringFirstLetters[$this->locale] ) ) {
$letters = wfGetPrecompiledData( "first-letters-root.ser" );
// Append additional characters
$letters = array_merge( $letters, self::$tailoringFirstLetters[$this->locale] );
// Remove unnecessary ones, if any
- if ( isset( self::$tailoringFirstLetters[ '-' . $this->locale ] ) ) {
- $letters = array_diff( $letters, self::$tailoringFirstLetters[ '-' . $this->locale ] );
+ if ( isset( self::$tailoringFirstLetters['-' . $this->locale] ) ) {
+ $letters = array_diff( $letters, self::$tailoringFirstLetters['-' . $this->locale] );
}
} else {
$letters = wfGetPrecompiledData( "first-letters-{$this->locale}.ser" );
@@ -430,7 +432,7 @@ class IcuCollation extends Collation {
$prev = false;
$duplicatePrefixes = array();
- foreach( $letterMap as $key => $value ) {
+ foreach ( $letterMap as $key => $value ) {
// Remove terminator byte. Otherwise the prefix
// comparison will get hung up on that.
$trimmedKey = rtrim( $key, "\0" );
@@ -456,7 +458,7 @@ class IcuCollation extends Collation {
}
$prev = $trimmedKey;
}
- foreach( $duplicatePrefixes as $badKey ) {
+ foreach ( $duplicatePrefixes as $badKey ) {
wfDebug( "Removing '{$letterMap[$badKey]}' from first letters." );
unset( $letterMap[$badKey] );
// This code assumes that unsetting does not change sort order.
diff --git a/includes/ConfEditor.php b/includes/ConfEditor.php
index 1d9ca921..67cb87db 100644
--- a/includes/ConfEditor.php
+++ b/includes/ConfEditor.php
@@ -278,19 +278,23 @@ class ConfEditor {
function getVars() {
$vars = array();
$this->parse();
- foreach( $this->pathInfo as $path => $data ) {
- if ( $path[0] != '$' )
+ foreach ( $this->pathInfo as $path => $data ) {
+ if ( $path[0] != '$' ) {
continue;
+ }
$trimmedPath = substr( $path, 1 );
$name = $data['name'];
- if ( $name[0] == '@' )
+ if ( $name[0] == '@' ) {
continue;
- if ( $name[0] == '$' )
+ }
+ if ( $name[0] == '$' ) {
$name = substr( $name, 1 );
+ }
$parentPath = substr( $trimmedPath, 0,
strlen( $trimmedPath ) - strlen( $name ) );
- if( substr( $parentPath, -1 ) == '/' )
+ if ( substr( $parentPath, -1 ) == '/' ) {
$parentPath = substr( $parentPath, 0, -1 );
+ }
$value = substr( $this->text, $data['valueStartByte'],
$data['valueEndByte'] - $data['valueStartByte']
@@ -315,13 +319,15 @@ class ConfEditor {
$target =& $array;
if ( $path !== '' ) {
foreach ( $pathArr as $p ) {
- if( !isset( $target[$p] ) )
+ if ( !isset( $target[$p] ) ) {
$target[$p] = array();
+ }
$target =& $target[$p];
}
}
- if ( !isset( $target[$key] ) )
+ if ( !isset( $target[$key] ) ) {
$target[$key] = $value;
+ }
}
/**
@@ -329,25 +335,30 @@ class ConfEditor {
* @return mixed Parsed value
*/
function parseScalar( $str ) {
- if ( $str !== '' && $str[0] == '\'' )
+ if ( $str !== '' && $str[0] == '\'' ) {
// Single-quoted string
// @todo FIXME: trim() call is due to mystery bug where whitespace gets
// appended to the token; without it we ended up reading in the
// extra quote on the end!
return strtr( substr( trim( $str ), 1, -1 ),
array( '\\\'' => '\'', '\\\\' => '\\' ) );
- if ( $str !== '' && $str[0] == '"' )
+ }
+ if ( $str !== '' && $str[0] == '"' ) {
// Double-quoted string
// @todo FIXME: trim() call is due to mystery bug where whitespace gets
// appended to the token; without it we ended up reading in the
// extra quote on the end!
return stripcslashes( substr( trim( $str ), 1, -1 ) );
- if ( substr( $str, 0, 4 ) == 'true' )
+ }
+ if ( substr( $str, 0, 4 ) == 'true' ) {
return true;
- if ( substr( $str, 0, 5 ) == 'false' )
+ }
+ if ( substr( $str, 0, 5 ) == 'false' ) {
return false;
- if ( substr( $str, 0, 4 ) == 'null' )
+ }
+ if ( substr( $str, 0, 4 ) == 'null' ) {
return null;
+ }
// Must be some kind of numeric value, so let PHP's weak typing
// be useful for a change
return $str;
@@ -537,7 +548,7 @@ class ConfEditor {
*/
function getIndent( $pos, $key = false, $arrowPos = false ) {
$arrowIndent = ' ';
- if ( $pos == 0 || $this->text[$pos-1] == "\n" ) {
+ if ( $pos == 0 || $this->text[$pos - 1] == "\n" ) {
$indentLength = strspn( $this->text, " \t", $pos );
$indent = substr( $this->text, $pos, $indentLength );
} else {
@@ -559,7 +570,7 @@ class ConfEditor {
public function parse() {
$this->initParse();
$this->pushState( 'file' );
- $this->pushPath( '@extra-' . ($this->serial++) );
+ $this->pushPath( '@extra-' . ( $this->serial++ ) );
$token = $this->firstToken();
while ( !$token->isEnd() ) {
@@ -617,19 +628,21 @@ class ConfEditor {
$this->expect( '=' );
$this->skipSpace();
$this->startPathValue();
- if ( $arrayAssign )
+ if ( $arrayAssign ) {
$this->pushState( 'expression', 'array assign end' );
- else
+ } else {
$this->pushState( 'expression', 'statement end' );
+ }
break;
case 'array assign end':
case 'statement end':
$this->endPathValue();
- if ( $state == 'array assign end' )
+ if ( $state == 'array assign end' ) {
$this->popPath();
+ }
$this->skipSpace();
$this->expect( ';' );
- $this->nextPath( '@extra-' . ($this->serial++) );
+ $this->nextPath( '@extra-' . ( $this->serial++ ) );
break;
case 'expression':
$token = $this->skipSpace();
@@ -649,7 +662,7 @@ class ConfEditor {
$this->skipSpace();
$this->expect( '(' );
$this->skipSpace();
- $this->pushPath( '@extra-' . ($this->serial++) );
+ $this->pushPath( '@extra-' . ( $this->serial++ ) );
if ( $this->isAhead( ')' ) ) {
// Empty array
$this->pushState( 'array end' );
@@ -681,7 +694,7 @@ class ConfEditor {
$this->endPathValue();
$this->markComma();
$this->nextToken();
- $this->nextPath( '@extra-' . ($this->serial++) );
+ $this->nextPath( '@extra-' . ( $this->serial++ ) );
// Look ahead to find ending bracket
if ( $this->isAhead( ")" ) ) {
// Found ending bracket, no continuation
@@ -1056,7 +1069,7 @@ class ConfEditorParseError extends MWException {
$lines = StringUtils::explode( "\n", $text );
foreach ( $lines as $lineNum => $line ) {
if ( $lineNum == $this->lineNum - 1 ) {
- return "$line\n" .str_repeat( ' ', $this->colNum - 1 ) . "^\n";
+ return "$line\n" . str_repeat( ' ', $this->colNum - 1 ) . "^\n";
}
}
return '';
diff --git a/includes/Cookie.php b/includes/Cookie.php
index 27a85072..ecf4667d 100644
--- a/includes/Cookie.php
+++ b/includes/Cookie.php
@@ -82,7 +82,8 @@ class Cookie {
* http://publicsuffix.org/
*
* @todo fixme fails to detect 3-letter top-level domains
- * @todo fixme fails to detect 2-letter top-level domains for single-domain use (probably not a big problem in practice, but there are test cases)
+ * @todo fixme fails to detect 2-letter top-level domains for single-domain use (probably
+ * not a big problem in practice, but there are test cases)
*
* @param string $domain the domain to validate
* @param string $originDomain (optional) the domain the cookie originates from
@@ -197,7 +198,7 @@ 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.
*/
@@ -235,7 +236,7 @@ class CookieJar {
* @param string $domain cookie's domain
* @return null
*/
- public function parseCookieResponseHeader ( $cookie, $domain ) {
+ public function parseCookieResponseHeader( $cookie, $domain ) {
$len = strlen( 'Set-Cookie:' );
if ( substr_compare( 'Set-Cookie:', $cookie, 0, $len, true ) === 0 ) {
diff --git a/includes/DataUpdate.php b/includes/DataUpdate.php
index c1076b23..7b9ac281 100644
--- a/includes/DataUpdate.php
+++ b/includes/DataUpdate.php
@@ -78,7 +78,9 @@ abstract class DataUpdate implements DeferrableUpdate {
* @throws Exception|null
*/
public static function runUpdates( $updates ) {
- if ( empty( $updates ) ) return; # nothing to do
+ if ( empty( $updates ) ) {
+ return; # nothing to do
+ }
$open_transactions = array();
$exception = null;
diff --git a/includes/DefaultSettings.php b/includes/DefaultSettings.php
index a56ef849..0fc59fb2 100644
--- a/includes/DefaultSettings.php
+++ b/includes/DefaultSettings.php
@@ -63,7 +63,7 @@ $wgConf = new SiteConfiguration;
* MediaWiki version number
* @since 1.2
*/
-$wgVersion = '1.21.3';
+$wgVersion = '1.22.0';
/**
* Name of the site. It must be changed in LocalSettings.php
@@ -172,14 +172,6 @@ $wgScriptExtension = '.php';
$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;
-
-/**
* The URL path to load.php.
*
* Defaults to "{$wgScriptPath}/load{$wgScriptExtension}".
@@ -274,7 +266,6 @@ $wgAppleTouchIcon = false;
*
* @see wfTempDir()
* @note Default changed to false in MediaWiki 1.20.
- *
*/
$wgTmpDirectory = false;
@@ -317,7 +308,9 @@ $wgActionPaths = array();
* @{
*/
-/** Uploads have to be specially set up to be secure */
+/**
+ * Uploads have to be specially set up to be secure
+ */
$wgEnableUploads = false;
/**
@@ -325,24 +318,22 @@ $wgEnableUploads = false;
*/
$wgUploadStashMaxAge = 6 * 3600; // 6 hours
-/** Allows to move images and other media files */
+/**
+ * Allows to move images and other media files
+ */
$wgAllowImageMoving = true;
/**
* Enable deferred upload tasks that use the job queue.
* Only enable this if job runners are set up for both the
* 'AssembleUploadChunks' and 'PublishStashedFile' job types.
+ *
+ * @note If you use suhosin, this setting is incompatible with
+ * suhosin.session.encrypt.
*/
$wgEnableAsyncUploads = false;
/**
- * Allow chunked uploads. This should only really be needed if you
- * use the UploadWizard extension or allow huge file uploads.
- * https://www.mediawiki.org/wiki/API:Upload#Chunked_uploading
- */
-$wgAllowChunkedUploads = false;
-
-/**
* These are additional characters that should be replaced with '-' in filenames
*/
$wgIllegalFileChars = ":";
@@ -456,7 +447,9 @@ $wgImgAuthPublicTest = true;
*/
$wgLocalFileRepo = false;
-/** @see $wgLocalFileRepo */
+/**
+ * @see $wgLocalFileRepo
+ */
$wgForeignFileRepos = array();
/**
@@ -512,11 +505,11 @@ $wgFileBackends = array();
$wgLockManagers = array();
/**
- * Show EXIF data, on by default if available.
- * Requires PHP's EXIF extension: http://www.php.net/manual/en/ref.exif.php
+ * 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 following lines to the "Windows
+ * To enable Exif functions, add the following lines to the "Windows
* extensions" section of php.ini:
* @code{.ini}
* extension=extensions/php_mbstring.dll
@@ -547,22 +540,36 @@ $wgUpdateCompatibleMetadata = false;
*/
$wgUseSharedUploads = false;
-/** Full path on the web server where shared uploads can be found */
+/**
+ * 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? */
+/**
+ * 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. */
+/**
+ * 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. */
+/**
+ * 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. */
+/**
+ * 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 */
+/**
+ * Cache shared metadata in memcached.
+ * Don't do this if the commons wiki is in a different memcached domain
+ */
$wgCacheSharedUploads = true;
/**
@@ -599,6 +606,27 @@ $wgCopyUploadsFromSpecialUpload = false;
$wgCopyUploadProxy = false;
/**
+ * Different timeout for upload by url
+ * This could be useful since when fetching large files, you may want a
+ * timeout longer than the default $wgHTTPTimeout. False means fallback
+ * to default.
+ *
+ * @since 1.22
+ */
+$wgCopyUploadTimeout = false;
+
+/**
+ * Different timeout for upload by url when run as a background job
+ * This could be useful since when fetching large files via job queue,
+ * you may want a different timeout, especially because there is no
+ * http request being kept alive.
+ *
+ * false means fallback to $wgCopyUploadTimeout.
+ * @since 1.22
+ */
+$wgCopyUploadAsyncTimeout = false;
+
+/**
* Max size for uploads, in bytes. If not set to an array, applies to all
* uploads. If set to an array, per upload type maximums can be set, using the
* file and url keys. If the * key is set this value will be used as maximum
@@ -613,7 +641,6 @@ $wgCopyUploadProxy = false;
* @endcode
* Sets the maximum for all uploads to 250 kB except for upload-by-url, which
* will have a maximum of 500 kB.
- *
*/
$wgMaxUploadSize = 1024 * 1024 * 100; # 100MB
@@ -648,6 +675,7 @@ $wgUploadMissingFileUrl = false;
* @endcode
*/
$wgThumbnailScriptPath = false;
+
/**
* @see $wgThumbnailScriptPath
*/
@@ -699,7 +727,7 @@ $wgFileExtensions = array( 'png', 'gif', 'jpg', 'jpeg' );
* Files with these extensions will never be allowed as uploads.
* An array of file extensions to blacklist. You should append to this array
* if you want to blacklist additional files.
- * */
+ */
$wgFileBlacklist = array(
# HTML may contain cookie-stealing JavaScript and web bugs
'html', 'htm', 'js', 'jsb', 'mhtml', 'mht', 'xhtml', 'xht',
@@ -826,15 +854,25 @@ $wgContentHandlers = array(
* Use Image Magick instead of PHP builtin functions.
*/
$wgUseImageMagick = false;
-/** The convert command shipped with ImageMagick */
+
+/**
+ * The convert command shipped with ImageMagick
+ */
$wgImageMagickConvertCommand = '/usr/bin/convert';
-/** The identify command shipped with ImageMagick */
+
+/**
+ * The identify command shipped with ImageMagick
+ */
$wgImageMagickIdentifyCommand = '/usr/bin/identify';
-/** Sharpening parameter to ImageMagick */
+/**
+ * Sharpening parameter to ImageMagick
+ */
$wgSharpenParameter = '0x0.4';
-/** Reduction in linear dimensions below which sharpening will be enabled */
+/**
+ * Reduction in linear dimensions below which sharpening will be enabled
+ */
$wgSharpenReductionThreshold = 0.85;
/**
@@ -857,15 +895,15 @@ $wgImageMagickTempDir = false;
*/
$wgCustomConvertCommand = false;
-/** used for lossless jpeg rotation
+/**
+ * used for lossless jpeg rotation
*
* @since 1.21
- * **/
+ */
$wgJpegTran = '/usr/bin/jpegtran';
-
/**
- * Some tests and extensions use exiv2 to manipulate the EXIF metadata in some
+ * Some tests and extensions use exiv2 to manipulate the Exif metadata in some
* image formats.
*/
$wgExiv2Command = '/usr/bin/exiv2';
@@ -889,16 +927,23 @@ $wgSVGConverters = array(
'ImagickExt' => array( 'SvgHandler::rasterizeImagickExt' ),
);
-/** Pick a converter defined in $wgSVGConverters */
+/**
+ * Pick a converter defined in $wgSVGConverters
+ */
$wgSVGConverter = 'ImageMagick';
-/** If not in the executable PATH, specify the SVG converter path. */
+/**
+ * If not in the executable PATH, specify the SVG converter path.
+ */
$wgSVGConverterPath = '';
-/** Don't scale a SVG larger than this */
+/**
+ * Don't scale a SVG larger than this
+ */
$wgSVGMaxSize = 2048;
-/** Don't read SVG metadata beyond this point.
+/**
+ * Don't read SVG metadata beyond this point.
* Default is 1024*256 bytes
*/
$wgSVGMetadataCutoff = 262144;
@@ -930,6 +975,7 @@ $wgAllowTitlesInSVG = false;
* 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
@@ -937,6 +983,7 @@ $wgMaxImageArea = 1.25e7;
* 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.
@@ -987,7 +1034,9 @@ $wgGenerateThumbnailOnParse = true;
*/
$wgShowArchiveThumbnails = true;
-/** Obsolete, always true, kept for compatibility with extensions */
+/**
+ * Obsolete, always true, kept for compatibility with extensions
+ */
$wgUseImageResize = true;
/**
@@ -1053,29 +1102,31 @@ $wgAntivirusSetup = array(
),
);
-/** Determines if a failed virus scan (AV_SCAN_FAILED) will cause the file to be rejected. */
+/**
+ * Determines if a failed virus scan (AV_SCAN_FAILED) will cause the file to be rejected.
+ */
$wgAntivirusRequired = true;
-/** Determines if the mime type of uploaded files should be checked */
+/**
+ * Determines if the mime type of uploaded files should be checked
+ */
$wgVerifyMimeType = true;
-/** Sets the mime type definition file to use by MimeMagic.php. */
+/**
+ * Sets the mime type definition file to use by MimeMagic.php.
+ * Set to null, to use built-in defaults only.
+ * example: $wgMimeTypeFile = '/etc/mime.types';
+ */
$wgMimeTypeFile = 'includes/mime.types';
-#$wgMimeTypeFile = '/etc/mime.types';
-#$wgMimeTypeFile = null; #use built-in defaults only.
-
-/** Sets the mime type info file to use by MimeMagic.php. */
-$wgMimeInfoFile = 'includes/mime.info';
-#$wgMimeInfoFile = null; #use built-in defaults only.
/**
- * 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 library.
+ * Sets the mime type info file to use by MimeMagic.php.
+ * Set to null, to use built-in defaults only.
*/
-$wgLoadFileinfoExtension = false;
+$wgMimeInfoFile = 'includes/mime.info';
-/** Sets an external mime detector program. The command must print only
+/**
+ * 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.
@@ -1145,6 +1196,7 @@ $wgGalleryOptions = array(
'imageHeight' => 120, // Height of the cells containing images in galleries (in "px")
'captionLength' => 25, // Length of caption to truncate (in characters)
'showBytes' => true, // Show the filesize in bytes in categories
+ 'mode' => 'traditional',
);
/**
@@ -1173,25 +1225,26 @@ $wgResponsiveImages = true;
* @name DJVU settings
* @{
*/
+
/**
* Path of the djvudump executable
* Enable this and $wgDjvuRenderer to enable djvu rendering
+ * example: $wgDjvuDump = 'djvudump';
*/
-# $wgDjvuDump = 'djvudump';
$wgDjvuDump = null;
/**
* Path of the ddjvu DJVU renderer
* Enable this and $wgDjvuDump to enable djvu rendering
+ * example: $wgDjvuRenderer = 'ddjvu';
*/
-# $wgDjvuRenderer = 'ddjvu';
$wgDjvuRenderer = null;
/**
* Path of the djvutxt DJVU text extraction utility
* Enable this and $wgDjvuDump to enable text layer extraction from djvu files
+ * example: $wgDjvuTxt = 'djvutxt';
*/
-# $wgDjvuTxt = 'djvutxt';
$wgDjvuTxt = null;
/**
@@ -1216,10 +1269,12 @@ $wgDjvuToXML = null;
* Set this to false to output the ppm file directly.
*/
$wgDjvuPostProcessor = 'pnmtojpeg';
+
/**
* File extension for the DJVU post processor output
*/
$wgDjvuOutputExtension = 'jpg';
+
/** @} */ # end of DJvu }
/** @} */ # end of file uploads }
@@ -1334,7 +1389,8 @@ $wgAllowHTMLEmail = false;
$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 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)"
@@ -1400,33 +1456,61 @@ $wgEnotifUseRealName = false;
*/
$wgUsersNotifiedOnAllChanges = array();
-
/** @} */ # 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';
-/** Database username */
+
+/**
+ * Database username
+ */
$wgDBuser = 'wikiuser';
-/** Database user's password */
+
+/**
+ * Database user's password
+ */
$wgDBpassword = '';
-/** Database type */
+
+/**
+ * Database type
+ */
$wgDBtype = 'mysql';
-/** Whether to use SSL in DB connection. */
+
+/**
+ * Whether to use SSL in DB connection.
+ */
$wgDBssl = false;
-/** Whether to use compression in DB connection. */
+
+/**
+ * Whether to use compression in DB connection.
+ */
$wgDBcompress = false;
-/** Separate username 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. */
+
+/**
+ * Separate password for maintenance tasks. Leave as null to use the default.
+ */
$wgDBadminpassword = null;
/**
@@ -1437,9 +1521,23 @@ $wgDBadminpassword = null;
*/
$wgSearchType = null;
-/** Table name prefix */
+/**
+ * Alternative search types
+ * Sometimes you want to support multiple search engines for testing. This
+ * allows users to select their search engine of choice via url parameters
+ * to Special:Search and the action=search API. If using this, there's no
+ * need to add $wgSearchType to it, that is handled automatically.
+ */
+$wgSearchTypeAlternatives = null;
+
+/**
+ * Table name prefix
+ */
$wgDBprefix = '';
-/** MySQL table options to use during installation or update */
+
+/**
+ * MySQL table options to use during installation or update
+ */
$wgDBTableOptions = 'ENGINE=InnoDB';
/**
@@ -1450,10 +1548,14 @@ $wgDBTableOptions = 'ENGINE=InnoDB';
*/
$wgSQLMode = '';
-/** Mediawiki schema */
+/**
+ * Mediawiki schema
+ */
$wgDBmwschema = 'mediawiki';
-/** To override default SQLite data directory ($docroot/../data) */
+/**
+ * To override default SQLite data directory ($docroot/../data)
+ */
$wgSQLiteDataDir = '';
/**
@@ -1487,9 +1589,14 @@ $wgAllDBsAreLocalhost = false;
*/
$wgSharedDB = null;
-/** @see $wgSharedDB */
+/**
+ * @see $wgSharedDB
+ */
$wgSharedPrefix = false;
-/** @see $wgSharedDB */
+
+/**
+ * @see $wgSharedDB
+ */
$wgSharedTables = array( 'user', 'user_properties' );
/**
@@ -1509,11 +1616,11 @@ $wgSharedTables = array( 'user', 'user_properties' );
* - 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)
* - DBO_PERSISTENT -- enables persistent database connections
* - DBO_SSL -- uses SSL/TLS encryption in database connections, if available
- * - DBO_COMPRESS -- uses internal compression in database connections, if available
+ * - DBO_COMPRESS -- uses internal compression in database connections,
+ * if available
*
* - max lag: (optional) Maximum replication lag before a slave will taken out of rotation
* - max threads: (optional) Maximum number of running threads
@@ -1552,10 +1659,14 @@ $wgDBservers = false;
*/
$wgLBFactoryConf = array( 'class' => 'LBFactory_Simple' );
-/** How long to wait for a slave to catch up to the master */
+/**
+ * How long to wait for a slave to catch up to the master
+ */
$wgMasterWaitTimeout = 10;
-/** File to log database errors to */
+/**
+ * File to log database errors to
+ */
$wgDBerrorLog = false;
/**
@@ -1578,7 +1689,9 @@ $wgDBerrorLog = false;
*/
$wgDBerrorLogTZ = false;
-/** When to give an error message */
+/**
+ * When to give an error message
+ */
$wgDBClusterTimeout = 10;
/**
@@ -1607,6 +1720,35 @@ $wgDBAvgStatusPoll = 2000;
$wgDBmysql5 = false;
/**
+ * Set true to enable Oracle DCRP (supported from 11gR1 onward)
+ *
+ * To use this feature set to true and use a datasource defined as
+ * POOLED (i.e. in tnsnames definition set server=pooled in connect_data
+ * block).
+ *
+ * Starting from 11gR1 you can use DCRP (Database Resident Connection
+ * Pool) that maintains established sessions and reuses them on new
+ * connections.
+ *
+ * Not completely tested, but it should fall back on normal connection
+ * in case the pool is full or the datasource is not configured as
+ * pooled.
+ * And the other way around; using oci_pconnect on a non pooled
+ * datasource should produce a normal connection.
+ *
+ * When it comes to frequent shortlived DB connections like with MW
+ * Oracle tends to s***. The problem is the driver connects to the
+ * database reasonably fast, but establishing a session takes time and
+ * resources. MW does not rely on session state (as it does not use
+ * features such as package variables) so establishing a valid session
+ * is in this case an unwanted overhead that just slows things down.
+ *
+ * @warning EXPERIMENTAL!
+ *
+ */
+$wgDBOracleDRCP = false;
+
+/**
* Other wikis on this site, can be administered from a single developer
* account.
* Array numeric key => database name
@@ -1619,13 +1761,11 @@ $wgLocalDatabases = array();
* show a more obvious warning.
*/
$wgSlaveLagWarning = 10;
-/** @see $wgSlaveLagWarning */
-$wgSlaveLagCritical = 30;
/**
- * Use old names for change_tags indices.
+ * @see $wgSlaveLagWarning
*/
-$wgOldChangeTagsIndex = false;
+$wgSlaveLagCritical = 30;
/**@}*/ # End of DB settings }
@@ -1637,8 +1777,8 @@ $wgOldChangeTagsIndex = false;
/**
* 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.
+ * 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;
@@ -1701,23 +1841,36 @@ $wgRevisionCacheExpiry = 0;
* @name Performance hacks and limits
* @{
*/
-/** Disable database-intensive features */
+
+/**
+ * Disable database-intensive features
+ */
$wgMiserMode = false;
-/** Disable all query pages if miser mode is on, not just some */
+
+/**
+ * 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 */
+
+/**
+ * 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" */
+
+/**
+ * Number of links to a page required before it is deemed "wanted"
+ */
$wgWantedPagesThreshold = 1;
-/** Enable slow parser functions */
+
+/**
+ * Enable slow parser functions
+ */
$wgAllowSlowParserFunctions = false;
-/** Allow schema updates */
-$wgAllowSchemaUpdates = true;
/**
- * Do DELETE/INSERT for link updates instead of incremental
+ * Allow schema updates
*/
-$wgUseDumbLinkUpdate = false;
+$wgAllowSchemaUpdates = true;
/**
* Anti-lock flags - bitfield
@@ -1886,11 +2039,15 @@ $wgObjectCacheSessionExpiry = 3600;
*/
$wgSessionHandler = null;
-/** If enabled, will send MemCached debugging information to $wgDebugLogFile */
+/**
+ * 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' );
+/**
+ * The list of MemCached servers and port numbers
+ */
+$wgMemCachedServers = array( '127.0.0.1:11211' );
/**
* Use persistent connections to MemCached, which are shared across multiple
@@ -1910,13 +2067,6 @@ $wgMemCachedTimeout = 500000;
$wgUseLocalMessageCache = false;
/**
- * Defines format of local cache.
- * - true: Serialized object
- * - false: PHP source file (Warning - security risk)
- */
-$wgLocalMessageCacheSerialized = true;
-
-/**
* Instead of caching everything, only cache those messages which have
* been customised in the site content language. This means that
* MediaWiki:Foo/ja is ignored if MediaWiki:Foo doesn't exist.
@@ -1952,7 +2102,9 @@ $wgLocalisationCacheConf = array(
'manualRecache' => false,
);
-/** Allow client-side caching of pages */
+/**
+ * Allow client-side caching of pages
+ */
$wgCachePages = true;
/**
@@ -2038,7 +2190,8 @@ $wgUseGzip = false;
*/
$wgUseETag = false;
-/** Clock skew or the one-second resolution of time() can occasionally cause cache
+/**
+ * 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.
@@ -2077,13 +2230,18 @@ $wgInvalidateCacheOnLocalSettingsChange = true;
*/
$wgUseSquid = false;
-/** If you run Squid3 with ESI support, enable this (default: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) */
+/**
+ * Send X-Vary-Options header for better caching (requires patched Squid)
+ */
$wgUseXVO = false;
-/** Add X-Forwarded-Proto to the Vary and X-Vary-Options headers for API
+/**
+ * Add X-Forwarded-Proto to the Vary and X-Vary-Options headers for API
* requests and RSS/Atom feeds. Use this if you have an SSL termination setup
* and need to split the cache between HTTP and HTTPS for API requests,
* feed requests and HTTP redirect responses in order to prevent cache
@@ -2131,7 +2289,9 @@ $wgSquidServers = array();
*/
$wgSquidServersNoPurge = array();
-/** Maximum number of titles to purge in any one client operation */
+/**
+ * Maximum number of titles to purge in any one client operation
+ */
$wgMaxSquidPurgeTitles = 400;
/**
@@ -2163,12 +2323,12 @@ $wgSquidPurgeUseHostHeader = true;
* Each key in this array is a regular expression to match against the purged
* URL, or an empty string to match all URLs. The purged URL is matched against
* the regexes in the order specified, and the first rule whose regex matches
- * is used.
+ * is used, all remaining rules will thus be ignored.
*
- * Example configuration to send purges for upload.wikimedia.org to one
+ * @par Example configuration to send purges for upload.wikimedia.org to one
* multicast group and all other purges to another:
* @code
- * $wgHTCPMulticastRouting = array(
+ * $wgHTCPRouting = array(
* '|^https?://upload\.wikimedia\.org|' => array(
* 'host' => '239.128.0.113',
* 'port' => 4827,
@@ -2180,11 +2340,44 @@ $wgSquidPurgeUseHostHeader = true;
* );
* @endcode
*
- * @since 1.20
+ * You can also pass an array of hosts to send purges too. This is useful when
+ * you have several multicast groups or unicast address that should receive a
+ * given purge. Multiple hosts support was introduced in MediaWiki 1.22.
+ *
+ * @par Example of sending purges to multiple hosts:
+ * @code
+ * $wgHTCPRouting = array(
+ * '' => array(
+ * // Purges to text caches using multicast
+ * array( 'host' => '239.128.0.114', 'port' => '4827' ),
+ * // Purges to a hardcoded list of caches
+ * array( 'host' => '10.88.66.1', 'port' => '4827' ),
+ * array( 'host' => '10.88.66.2', 'port' => '4827' ),
+ * array( 'host' => '10.88.66.3', 'port' => '4827' ),
+ * ),
+ * );
+ * @endcode
+ *
+ * @since 1.22
+ *
+ * $wgHTCPRouting replaces $wgHTCPMulticastRouting that was introduced in 1.20.
+ * For back compatibility purposes, whenever its array is empty
+ * $wgHTCPMutlicastRouting will be used as a fallback if it not null.
*
* @see $wgHTCPMulticastTTL
*/
-$wgHTCPMulticastRouting = array();
+$wgHTCPRouting = array();
+
+/**
+ * @deprecated since 1.22, please use $wgHTCPRouting instead.
+ *
+ * Whenever this is set and $wgHTCPRouting evaluates to false, $wgHTCPRouting
+ * will be set to this value.
+ * This is merely for back compatibility.
+ *
+ * @since 1.20
+ */
+$wgHTCPMulticastRouting = null;
/**
* HTCP multicast address. Set this to a multicast IP address to enable HTCP.
@@ -2192,29 +2385,34 @@ $wgHTCPMulticastRouting = array();
* Note that MediaWiki uses the old non-RFC compliant HTCP format, which was
* present in the earliest Squid implementations of the protocol.
*
- * This setting is DEPRECATED in favor of $wgHTCPMulticastRouting , and kept
- * for backwards compatibility only. If $wgHTCPMulticastRouting is set, this
- * setting is ignored. If $wgHTCPMulticastRouting is not set and this setting
- * is, it is used to populate $wgHTCPMulticastRouting.
+ * This setting is DEPRECATED in favor of $wgHTCPRouting , and kept for
+ * backwards compatibility only. If $wgHTCPRouting is set, this setting is
+ * ignored. If $wgHTCPRouting is not set and this setting is, it is used to
+ * populate $wgHTCPRouting.
*
- * @deprecated since 1.20 in favor of $wgHTCPMulticastRouting
+ * @deprecated since 1.20 in favor of $wgHTCPMulticastRouting and since 1.22 in
+ * favor of $wgHTCPRouting.
*/
$wgHTCPMulticastAddress = false;
/**
* HTCP multicast port.
- * @deprecated since 1.20 in favor of $wgHTCPMulticastRouting
+ * @deprecated since 1.20 in favor of $wgHTCPMulticastRouting and since 1.22 in
+ * favor of $wgHTCPRouting.
+ *
* @see $wgHTCPMulticastAddress
*/
$wgHTCPPort = 4827;
/**
* HTCP multicast TTL.
- * @see $wgHTCPMulticastRouting
+ * @see $wgHTCPRouting
*/
$wgHTCPMulticastTTL = 1;
-/** Should forwarded Private IPs be accepted? */
+/**
+ * Should forwarded Private IPs be accepted?
+ */
$wgUsePrivateIPs = false;
/** @} */ # end of HTTP proxy settings
@@ -2258,13 +2456,19 @@ $wgLangObjCacheSize = 10;
*/
$wgGrammarForms = array();
-/** Treat language links as magic connectors, not inline links */
+/**
+ * Treat language links as magic connectors, not inline links
+ */
$wgInterwikiMagic = true;
-/** Hide interlanguage links from the sidebar */
+/**
+ * Hide interlanguage links from the sidebar
+ */
$wgHideInterlanguageLinks = false;
-/** List of language names or overrides for default names in Names.php */
+/**
+ * List of language names or overrides for default names in Names.php
+ */
$wgExtraLanguageNames = array();
/**
@@ -2364,7 +2568,8 @@ $wgBrowserBlackList = array(
'/^Mozilla\/4\.[^ ]+ [^(]*?\((?!compatible).*; [UIN]/',
/**
- * MSIE on Mac OS 9 is teh sux0r, converts þ to <thorn>, ð to <eth>, Þ to <THORN> and à to <ETH>
+ * 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)
@@ -2372,7 +2577,7 @@ $wgBrowserBlackList = array(
* - 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/w/index.php?diff=12356041&oldid=12355864
* @link http://en.wikipedia.org/wiki/Template%3AOS9
*/
'/^Mozilla\/4\.0 \(compatible; MSIE \d+\.\d+; Mac_PowerPC\)/',
@@ -2403,6 +2608,7 @@ $wgLegacySchemaConversion = false;
* the interface is set to English.
*/
$wgAmericanDates = false;
+
/**
* For Hindi and Arabic use local numerals instead of Western style (0-9)
* numerals in interface.
@@ -2425,16 +2631,24 @@ $wgMsgCacheExpiry = 86400;
*/
$wgMaxMsgCacheEntrySize = 10000;
-/** Whether to enable language variant conversion. */
+/**
+ * Whether to enable language variant conversion.
+ */
$wgDisableLangConversion = false;
-/** Whether to enable language variant conversion for links. */
+/**
+ * Whether to enable language variant conversion for links.
+ */
$wgDisableTitleConversion = false;
-/** Whether to enable canonical language links in meta data. */
+/**
+ * Whether to enable canonical language links in meta data.
+ */
$wgCanonicalLanguageLinks = true;
-/** Default variant code, if false, the default will be the language code */
+/**
+ * Default variant code, if false, the default will be the language code
+ */
$wgDefaultLanguageVariant = false;
/**
@@ -2538,52 +2752,44 @@ $wgLocalTZoffset = null;
* @{
*/
-/** The default Content-Type header. */
-$wgMimeType = 'text/html';
-
-/**
- * The content type used in script tags. This is mostly going to be ignored if
- * $wgHtml5 is true, at least for actual HTML output, since HTML5 doesn't
- * require a MIME type for JavaScript or CSS (those are the default script and
- * style languages).
- */
-$wgJsMimeType = 'text/javascript';
-
/**
- * The HTML document type. Ignored if $wgHtml5 is true, since <!DOCTYPE html>
- * doesn't actually have a doctype part to put this variable's contents in.
+ * The default Content-Type header.
*/
-$wgDocType = '-//W3C//DTD XHTML 1.0 Transitional//EN';
+$wgMimeType = 'text/html';
/**
- * The URL of the document type declaration. Ignored if $wgHtml5 is true,
- * since HTML5 has no DTD, and <!DOCTYPE html> doesn't actually have a DTD part
- * to put this variable's contents in.
+ * Previously used as content type in HTML script tags. This is now ignored since
+ * HTML5 doesn't require a MIME type for script tags (javascript is the default).
+ * It was also previously used by RawAction to determine the ctype query parameter
+ * value that will result in a javascript response.
+ * @deprecated since 1.22
*/
-$wgDTD = 'http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd';
+$wgJsMimeType = null;
/**
- * The default xmlns attribute. Ignored if $wgHtml5 is true (or it's supposed
- * to be), since we don't currently support XHTML5, and in HTML5 (i.e., served
- * as text/html) the attribute has no effect, so why bother?
+ * The default xmlns attribute. The option to define this has been removed.
+ * The value of this variable is no longer used by core and is set to a fixed
+ * value in Setup.php for compatibility with extensions that depend on the value
+ * of this variable being set. Such a dependency however is deprecated.
+ * @deprecated since 1.22
*/
-$wgXhtmlDefaultNamespace = 'http://www.w3.org/1999/xhtml';
+$wgXhtmlDefaultNamespace = null;
/**
- * 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. If it's true, a number of other settings will be irrelevant
- * and have no effect.
+ * Previously used to determine if we should output an HTML5 doctype.
+ * This is no longer used as we always output HTML5 now. For compatibility with
+ * extensions that still check the value of this config it's value is now forced
+ * to true by Setup.php.
+ * @deprecated since 1.22
*/
$wgHtml5 = true;
/**
* Defines the value of the version attribute in the &lt;html&gt; tag, if any.
- * This is ignored if $wgHtml5 is false. If $wgAllowRdfaAttributes and
- * $wgHtml5 are both true, and this evaluates to boolean false (like if it's
- * left at the default null value), it will be auto-initialized to the correct
- * value for RDFa+HTML5. As such, you should have no reason to ever actually
- * set this to anything.
+ * If $wgAllowRdfaAttributes is true, and this evaluates to boolean false
+ * (like if it's left at the default null value), it will be auto-initialized
+ * to the correct value for RDFa+HTML5. As such, you should have no reason to
+ * ever actually set this to anything.
*/
$wgHtml5Version = null;
@@ -2594,7 +2800,7 @@ $wgHtml5Version = null;
$wgAllowRdfaAttributes = false;
/**
- * Enabled HTML5 microdata attributes for use in wikitext, if $wgHtml5 is also true.
+ * Enabled HTML5 microdata attributes for use in wikitext.
*/
$wgAllowMicrodataAttributes = false;
@@ -2628,8 +2834,7 @@ $wgWellFormedXml = true;
* Normally we wouldn't have to define this in the root "<html>"
* element, but IE needs it there in some circumstances.
*
- * This is ignored if $wgHtml5 is true, for the same reason as
- * $wgXhtmlDefaultNamespace.
+ * This is ignored if $wgMimeType is set to a non-XML mimetype.
*/
$wgXhtmlNamespaces = array();
@@ -2679,34 +2884,11 @@ $wgDefaultSkin = 'vector';
* remove from the .../skins/ directory
*/
$wgSkipSkin = '';
-/** Array for more like $wgSkipSkin. */
-$wgSkipSkins = array();
/**
- * 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.
+ * Array for more like $wgSkipSkin.
*/
-$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;
+$wgSkipSkins = array();
/**
* Allow user Javascript page?
@@ -2729,10 +2911,14 @@ $wgAllowUserCss = false;
*/
$wgAllowUserCssPrefs = true;
-/** Use the site's Javascript page? */
+/**
+ * Use the site's Javascript page?
+ */
$wgUseSiteJs = true;
-/** Use the site's Cascading Style Sheets (CSS)? */
+/**
+ * Use the site's Cascading Style Sheets (CSS)?
+ */
$wgUseSiteCss = true;
/**
@@ -2771,7 +2957,6 @@ $wgEditPageFrameOptions = 'DENY';
* - 'SAMEORIGIN': Allow framing by pages on the same domain.
* - false: Allow all framing.
*/
-
$wgApiFrameOptions = 'DENY';
/**
@@ -2807,9 +2992,10 @@ $wgExperimentalHtmlIds = false;
* 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
+ * - 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 element around the text or icon, if not set an a element will not be outputted
+ * - url: The url to use in the a element around the text or icon, if not set an a element 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.
@@ -2851,7 +3037,7 @@ $wgVectorUseSimpleSearch = true;
* - true = use an icon watch/unwatch button
* - false = use watch/unwatch text link
*/
-$wgVectorUseIconWatch = false;
+$wgVectorUseIconWatch = true;
/**
* Display user edit counts in various prominent places.
@@ -3052,8 +3238,10 @@ $wgLegacyJavaScriptGlobals = true;
*
* If set to a negative number, ResourceLoader will assume there is no query
* string length limit.
+ *
+ * Defaults to a value based on php configuration.
*/
-$wgResourceLoaderMaxQueryLength = -1;
+$wgResourceLoaderMaxQueryLength = false;
/**
* If set to true, JavaScript modules loaded from wiki pages will be parsed
@@ -3081,6 +3269,59 @@ $wgResourceLoaderValidateStaticJS = false;
*/
$wgResourceLoaderExperimentalAsyncLoading = false;
+/**
+ * Global LESS variables. An associative array binding variable names to CSS
+ * string values.
+ *
+ * Because the hashed contents of this array are used to construct the cache key
+ * that ResourceLoader uses to look up LESS compilation results, updating this
+ * array can be used to deliberately invalidate the set of cached results.
+ *
+ * @par Example:
+ * @code
+ * $wgResourceLoaderLESSVars = array(
+ * 'baseFontSize' => '1em',
+ * 'smallFontSize' => '0.75em',
+ * 'WikimediaBlue' => '#006699',
+ * );
+ * @endcode
+ * @since 1.22
+ */
+$wgResourceLoaderLESSVars = array();
+
+/**
+ * Custom LESS functions. An associative array mapping function name to PHP
+ * callable.
+ *
+ * Changes to LESS functions do not trigger cache invalidation. If you update
+ * the behavior of a LESS function and need to invalidate stale compilation
+ * results, you can touch one of values in $wgResourceLoaderLESSVars, as
+ * documented above.
+ *
+ * @since 1.22
+ */
+$wgResourceLoaderLESSFunctions = array(
+ 'embeddable' => 'ResourceLoaderLESSFunctions::embeddable',
+ 'embed' => 'ResourceLoaderLESSFunctions::embed',
+);
+
+/**
+ * Default import paths for LESS modules. LESS files referenced in @import
+ * statements will be looked up here first, and relative to the importing file
+ * second. To avoid collisions, it's important for the LESS files in these
+ * directories to have a common, predictable file name prefix.
+ *
+ * Extensions need not (and should not) register paths in
+ * $wgResourceLoaderLESSImportPaths. The import path includes the path of the
+ * currently compiling LESS file, which allows each extension to freely import
+ * files from its own tree.
+ *
+ * @since 1.22
+ */
+$wgResourceLoaderLESSImportPaths = array(
+ "$IP/resources/mediawiki.less/",
+);
+
/** @} */ # End of resource loader settings }
/*************************************************************************//**
@@ -3167,7 +3408,8 @@ $wgNamespaceAliases = array();
* - []{}|# 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 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,
@@ -3201,6 +3443,7 @@ $wgInterwikiExpiry = 10800;
* @name Interwiki caching settings.
* @{
*/
+
/**
*$wgInterwikiCache specifies path to constant database file.
*
@@ -3215,6 +3458,7 @@ $wgInterwikiExpiry = 10800;
* data layout.
*/
$wgInterwikiCache = false;
+
/**
* Specify number of domains to check for messages.
* - 1: Just wiki(db)-level
@@ -3222,10 +3466,12 @@ $wgInterwikiCache = false;
* - 3: site levels
*/
$wgInterwikiScopes = 3;
+
/**
- * $wgInterwikiFallbackSite - if unable to resolve from cache
+ * Fallback site, if unable to resolve from cache
*/
$wgInterwikiFallbackSite = 'wiki';
+
/** @} */ # end of Interwiki caching settings.
/**
@@ -3270,7 +3516,8 @@ $wgCapitalLinks = true;
*/
$wgCapitalLinkOverrides = array();
-/** Which namespaces should support subpages?
+/**
+ * Which namespaces should support subpages?
* See Language.php for a list of namespaces.
*/
$wgNamespacesWithSubpages = array(
@@ -3313,7 +3560,7 @@ $wgMaxRedirects = 1;
* 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' );
+$wgInvalidRedirectTargets = array( 'Filepath', 'Mypage', 'Mytalk', 'Redirect' );
/** @} */ # End of title and interwiki settings }
@@ -3349,7 +3596,9 @@ $wgParserConf = array(
#'preprocessorClass' => 'Preprocessor_Hash',
);
-/** Maximum indent level of toc. */
+/**
+ * Maximum indent level of toc.
+ */
$wgMaxTocLevel = 999;
/**
@@ -3377,25 +3626,41 @@ $wgMaxGeneratedPPNodeCount = 1000000;
*/
$wgMaxTemplateDepth = 40;
-/** @see $wgMaxTemplateDepth */
+/**
+ * @see $wgMaxTemplateDepth
+ */
$wgMaxPPExpandDepth = 40;
-/** The external URL protocols */
+/**
+ * The external URL protocols
+ */
$wgUrlProtocols = array(
'http://',
'https://',
'ftp://',
+ 'ftps://', // If we allow ftp:// we should allow the secure version.
+ 'ssh://',
+ 'sftp://', // SFTP > FTP
'irc://',
'ircs://', // @bug 28503
+ 'xmpp:', // Another open communication protocol
+ 'sip:',
+ 'sips:',
'gopher://',
'telnet://', // Well if we're going to support the above.. -ævar
'nntp://', // @bug 3808 RFC 1738
'worldwind://',
'mailto:',
+ 'tel:', // If we can make emails linkable, why not phone numbers?
+ 'sms:', // Likewise this is standardized too
'news:',
'svn://',
'git://',
'mms://',
+ 'bitcoin:', // Even registerProtocolHandler whitelists this along with mailto:
+ 'magnet:', // No reason to reject torrents over magnet: when they're allowed over http://
+ 'urn:', // Allow URNs to be used in Microdata/RDFa <link ... href="urn:...">s
+ 'geo:', // urls define geo locations, they're useful in Microdata/RDFa and for coordinates
'//', // for protocol-relative URLs
);
@@ -3404,7 +3669,9 @@ $wgUrlProtocols = array(
*/
$wgCleanSignatures = true;
-/** Whether to allow inline image pointing to other websites */
+/**
+ * Whether to allow inline image pointing to other websites
+ */
$wgAllowExternalImages = false;
/**
@@ -3421,7 +3688,8 @@ $wgAllowExternalImages = false;
*/
$wgAllowExternalImagesFrom = '';
-/** If $wgAllowExternalImages is false, you can allow an on-wiki
+/**
+ * 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.
@@ -3457,15 +3725,30 @@ $wgAllowImageTag = false;
* 'extension=tidy.so' to php.ini.
*/
$wgUseTidy = false;
-/** @see $wgUseTidy */
+
+/**
+ * @see $wgUseTidy
+ */
$wgAlwaysUseTidy = false;
-/** @see $wgUseTidy */
+
+/**
+ * @see $wgUseTidy
+ */
$wgTidyBin = 'tidy';
-/** @see $wgUseTidy */
+
+/**
+ * @see $wgUseTidy
+ */
$wgTidyConf = $IP . '/includes/tidy.conf';
-/** @see $wgUseTidy */
+
+/**
+ * @see $wgUseTidy
+ */
$wgTidyOpts = '';
-/** @see $wgUseTidy */
+
+/**
+ * @see $wgUseTidy
+ */
$wgTidyInternal = extension_loaded( 'tidy' );
/**
@@ -3474,7 +3757,8 @@ $wgTidyInternal = extension_loaded( 'tidy' );
*/
$wgDebugTidy = false;
-/** Allow raw, unchecked HTML in "<html>...</html>" sections.
+/**
+ * Allow raw, unchecked HTML in "<html>...</html>" sections.
* THIS IS VERY DANGEROUS on a publicly editable site, so USE wgGroupPermissions
* TO RESTRICT EDITING to only those that you trust
*/
@@ -3518,8 +3802,9 @@ $wgNoFollowDomainExceptions = array();
$wgAllowDisplayTitle = true;
/**
- * For consistency, restrict DISPLAYTITLE to titles that normalize to the same
- * canonical DB key.
+ * For consistency, restrict DISPLAYTITLE to text that normalizes to the same
+ * canonical DB key. Also disallow some inline CSS rules like display: none;
+ * which can cause the text to be hidden or unselectable.
*/
$wgRestrictDisplayTitle = true;
@@ -3536,12 +3821,13 @@ $wgExpensiveParserFunctionLimit = 100;
$wgPreprocessorCacheThreshold = 1000;
/**
- * Enable interwiki transcluding. Only when iw_trans=1.
+ * Enable interwiki transcluding. Only when iw_trans=1 in the interwiki table.
*/
$wgEnableScaryTranscluding = false;
/**
- * (see next option $wgGlobalDatabase).
+ * Expiry time for transcluded templates cached in transcache database table.
+ * Only used $wgEnableInterwikiTranscluding is set to true.
*/
$wgTranscludeCacheExpiry = 3600;
@@ -3591,7 +3877,8 @@ $wgHitcounterUpdateFreq = 1;
/**
* 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.
+ * the number shown on Special:Statistics, Special:ActiveUsers, and the
+ * {{NUMBEROFACTIVEUSERS}} magic word in wikitext.
* You might want to leave this as the default value, to provide comparable
* numbers between different wikis.
*/
@@ -3604,7 +3891,9 @@ $wgActiveUserDays = 30;
* @{
*/
-/** For compatibility with old installations set to false */
+/**
+ * For compatibility with old installations set to false
+ */
$wgPasswordSalt = true;
/**
@@ -3647,7 +3936,7 @@ $wgReservedUsernames = array(
'ScriptImporter', // Default user name used by maintenance/importSiteScripts.php
'msg:double-redirect-fixer', // Automatic double redirect fix
'msg:usermessage-editor', // Default user for leaving user messages
- 'msg:proxyblocker', // For Special:Blockme
+ 'msg:proxyblocker', // For $wgProxyList and Special:Blockme (removed in 1.22)
);
/**
@@ -3655,7 +3944,6 @@ $wgReservedUsernames = array(
* preferences used by anonymous visitors and newly created accounts.
* For instance, to disable section editing links:
* $wgDefaultUserOptions ['editsection'] = 0;
- *
*/
$wgDefaultUserOptions = array(
'ccmeonemails' => 0,
@@ -3673,8 +3961,6 @@ $wgDefaultUserOptions = array(
'enotifusertalkpages' => 1,
'enotifwatchlistpages' => 0,
'extendwatchlist' => 0,
- 'externaldiff' => 0,
- 'externaleditor' => 0,
'fancysig' => 0,
'forceeditsummary' => 0,
'gender' => 'unknown',
@@ -3691,14 +3977,12 @@ $wgDefaultUserOptions = array(
'numberheadings' => 0,
'previewonfirst' => 0,
'previewontop' => 1,
- 'quickbar' => 5,
'rcdays' => 7,
'rclimit' => 50,
'rememberpassword' => 0,
'rows' => 25,
'searchlimit' => 20,
'showhiddencats' => 0,
- 'showjumplinks' => 1,
'shownumberswatching' => 1,
'showtoc' => 1,
'showtoolbar' => 1,
@@ -3708,6 +3992,7 @@ $wgDefaultUserOptions = array(
'underline' => 2,
'uselivepreview' => 0,
'usenewrc' => 0,
+ 'vector-simplesearch' => 1,
'watchcreations' => 0,
'watchdefault' => 0,
'watchdeletion' => 0,
@@ -3720,9 +4005,13 @@ $wgDefaultUserOptions = array(
'watchlisthidepatrolled' => 0,
'watchmoves' => 0,
'wllimit' => 250,
+ 'useeditwarning' => 1,
+ 'prefershttps' => 1,
);
-/** An array of preferences to not show for the user */
+/**
+ * An array of preferences to not show for the user
+ */
$wgHiddenPrefs = array();
/**
@@ -3744,63 +4033,6 @@ $wgInvalidUsernameCharacters = '@';
$wgUserrightsInterwikiDelimiter = '@';
/**
- * 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.
- */
-$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'.
- *
- * 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();
-
-/**
* 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/050039.html
@@ -3808,13 +4040,6 @@ $wgAllowPrefChange = array();
*/
$wgSecureLogin = false;
-/**
- * By default, keep users logged in via HTTPS when $wgSecureLogin is also
- * true. Users opt-out of HTTPS when they login by de-selecting the checkbox.
- * @since 1.21
- */
-$wgSecureLoginDefaultHTTPS = true;
-
/** @} */ # end user accounts }
/************************************************************************//**
@@ -3832,7 +4057,9 @@ $wgAutoblockExpiry = 86400;
*/
$wgBlockAllowsUTEdit = false;
-/** Allow sysops to ban users from accessing Emailuser */
+/**
+ * Allow sysops to ban users from accessing Emailuser
+ */
$wgSysopEmailBans = true;
/**
@@ -3950,6 +4177,13 @@ $wgGroupPermissions['*']['edit'] = true;
$wgGroupPermissions['*']['createpage'] = true;
$wgGroupPermissions['*']['createtalk'] = true;
$wgGroupPermissions['*']['writeapi'] = true;
+$wgGroupPermissions['*']['editmyusercss'] = true;
+$wgGroupPermissions['*']['editmyuserjs'] = true;
+$wgGroupPermissions['*']['viewmywatchlist'] = true;
+$wgGroupPermissions['*']['editmywatchlist'] = true;
+$wgGroupPermissions['*']['viewmyprivateinfo'] = true;
+$wgGroupPermissions['*']['editmyprivateinfo'] = true;
+$wgGroupPermissions['*']['editmyoptions'] = true;
#$wgGroupPermissions['*']['patrolmarks'] = false; // let anons see what was patrolled
// Implicit group for all logged-in accounts
@@ -3971,25 +4205,29 @@ $wgGroupPermissions['user']['sendemail'] = true;
// Implicit group for accounts that pass $wgAutoConfirmAge
$wgGroupPermissions['autoconfirmed']['autoconfirmed'] = true;
+$wgGroupPermissions['autoconfirmed']['editsemiprotected'] = true;
// Users with bot privilege can have their edits hidden
// from various log pages by default
$wgGroupPermissions['bot']['bot'] = true;
$wgGroupPermissions['bot']['autoconfirmed'] = true;
+$wgGroupPermissions['bot']['editsemiprotected'] = true;
$wgGroupPermissions['bot']['nominornewtalk'] = true;
$wgGroupPermissions['bot']['autopatrol'] = true;
$wgGroupPermissions['bot']['suppressredirect'] = true;
$wgGroupPermissions['bot']['apihighlimits'] = true;
$wgGroupPermissions['bot']['writeapi'] = true;
-#$wgGroupPermissions['bot']['editprotected'] = true; // can edit all protected pages without cascade protection enabled
// Most extra permission abilities go to this group
$wgGroupPermissions['sysop']['block'] = true;
$wgGroupPermissions['sysop']['createaccount'] = true;
$wgGroupPermissions['sysop']['delete'] = true;
-$wgGroupPermissions['sysop']['bigdelete'] = true; // can be separately configured for pages with > $wgDeleteRevisionsLimit revs
-$wgGroupPermissions['sysop']['deletedhistory'] = true; // can view deleted history entries, but not see or restore the text
-$wgGroupPermissions['sysop']['deletedtext'] = true; // can view deleted revision text
+// can be separately configured for pages with > $wgDeleteRevisionsLimit revs
+$wgGroupPermissions['sysop']['bigdelete'] = true;
+// can view deleted history entries, but not see or restore the text
+$wgGroupPermissions['sysop']['deletedhistory'] = true;
+// can view deleted revision text
+$wgGroupPermissions['sysop']['deletedtext'] = true;
$wgGroupPermissions['sysop']['undelete'] = true;
$wgGroupPermissions['sysop']['editinterface'] = true;
$wgGroupPermissions['sysop']['editusercss'] = true;
@@ -4002,6 +4240,7 @@ $wgGroupPermissions['sysop']['move-rootuserpages'] = true;
$wgGroupPermissions['sysop']['patrol'] = true;
$wgGroupPermissions['sysop']['autopatrol'] = true;
$wgGroupPermissions['sysop']['protect'] = true;
+$wgGroupPermissions['sysop']['editprotected'] = true;
$wgGroupPermissions['sysop']['proxyunbannable'] = true;
$wgGroupPermissions['sysop']['rollback'] = true;
$wgGroupPermissions['sysop']['upload'] = true;
@@ -4009,6 +4248,7 @@ $wgGroupPermissions['sysop']['reupload'] = true;
$wgGroupPermissions['sysop']['reupload-shared'] = true;
$wgGroupPermissions['sysop']['unwatchedpages'] = true;
$wgGroupPermissions['sysop']['autoconfirmed'] = true;
+$wgGroupPermissions['sysop']['editsemiprotected'] = true;
$wgGroupPermissions['sysop']['ipblock-exempt'] = true;
$wgGroupPermissions['sysop']['blockemail'] = true;
$wgGroupPermissions['sysop']['markbotedits'] = true;
@@ -4084,11 +4324,12 @@ $wgImplicitGroups = array( '*', 'user', 'autoconfirmed' );
* @endcode
* This allows users in the '*' group (i.e. any user) to remove themselves from
* any group that they happen to be in.
- *
*/
$wgGroupsAddToSelf = array();
-/** @see $wgGroupsAddToSelf */
+/**
+ * @see $wgGroupsAddToSelf
+ */
$wgGroupsRemoveFromSelf = array();
/**
@@ -4108,11 +4349,37 @@ $wgRestrictionTypes = array( 'create', 'edit', 'move', 'upload' );
* dictates the order on the protection form's lists.
*
* - '' will be ignored (i.e. unprotected)
- * - 'sysop' is quietly rewritten to 'protect' for backwards compatibility
+ * - 'autoconfirmed' is quietly rewritten to 'editsemiprotected' for backwards compatibility
+ * - 'sysop' is quietly rewritten to 'editprotected' for backwards compatibility
*/
$wgRestrictionLevels = array( '', 'autoconfirmed', 'sysop' );
/**
+ * Restriction levels that can be used with cascading protection
+ *
+ * A page can only be protected with cascading protection if the
+ * requested restriction level is included in this array.
+ *
+ * 'autoconfirmed' is quietly rewritten to 'editsemiprotected' for backwards compatibility.
+ * 'sysop' is quietly rewritten to 'editprotected' for backwards compatibility.
+ */
+$wgCascadingRestrictionLevels = array( 'sysop' );
+
+/**
+ * Restriction levels that should be considered "semiprotected"
+ *
+ * Certain places in the interface recognize a dichotomy between "protected"
+ * and "semiprotected", without further distinguishing the specific levels. In
+ * general, if anyone can be eligible to edit a protection level merely by
+ * reaching some condition in $wgAutopromote, it should probably be considered
+ * "semiprotected".
+ *
+ * 'autoconfirmed' is quietly rewritten to 'editsemiprotected' for backwards compatibility.
+ * 'sysop' is not changed, since it really shouldn't be here.
+ */
+$wgSemiprotectedRestrictionLevels = array( 'autoconfirmed' );
+
+/**
* Set the minimum permissions required to edit pages in each
* namespace. If you list more than one permission, a user must
* have all of them to edit pages in that namespace.
@@ -4248,7 +4515,10 @@ $wgAutopromoteOnceLogInRC = true;
* @endcode
*/
$wgAddGroups = array();
-/** @see $wgAddGroups */
+
+/**
+ * @see $wgAddGroups
+ */
$wgRemoveGroups = array();
/**
@@ -4283,7 +4553,9 @@ $wgAccountCreationThrottle = 0;
*/
$wgSpamRegex = array();
-/** Same as the above except for edit summaries */
+/**
+ * Same as the above except for edit summaries
+ */
$wgSummarySpamRegex = array();
/**
@@ -4337,6 +4609,13 @@ $wgSorbsUrl = array();
$wgProxyWhitelist = array();
/**
+ * Whether to look at the X-Forwarded-For header's list of (potentially spoofed)
+ * IPs and apply IP blocks to them. This allows for IP blocks to work with correctly-configured
+ * (transparent) proxies without needing to block the proxies themselves.
+ */
+$wgApplyIpBlocksToXff = false;
+
+/**
* Simple rate limiter options to brake edit floods.
*
* Maximum number actions allowed in the given number of seconds; after that
@@ -4362,7 +4641,7 @@ $wgRateLimits = array(
'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
+ 'subnet' => null, // ... within a /24 subnet in IPv4 or /64 in IPv6
),
'move' => array(
'user' => null,
@@ -4370,11 +4649,25 @@ $wgRateLimits = array(
'ip' => null,
'subnet' => null,
),
- 'mailpassword' => array(
+ 'mailpassword' => array( // triggering password resets emails
'anon' => null,
),
- 'emailuser' => array(
+ 'emailuser' => array( // emailing other users using MediaWiki
+ 'user' => null,
+ ),
+ 'linkpurge' => array( // purges of link tables
+ 'anon' => null,
'user' => null,
+ 'newbie' => null,
+ 'ip' => null,
+ 'subnet' => null,
+ ),
+ 'renderfile' => array( // files rendered via thumb.php or thumb_handler.php
+ 'anon' => null,
+ 'user' => null,
+ 'newbie' => null,
+ 'ip' => null,
+ 'subnet' => null,
),
);
@@ -4417,22 +4710,8 @@ $wgPasswordAttemptThrottle = array( 'count' => 5, 'seconds' => 300 );
*/
/**
- * If you enable this, every editor's IP address will be scanned for open HTTP
- * proxies.
- *
- * @warning 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.
- *
+ * This should always be customised in LocalSettings.php
*/
-$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/maintenance/proxyCheck.php";
-/** */
-$wgProxyMemcExpiry = 86400;
-/** This should always be customised in LocalSettings.php */
$wgSecretKey = false;
/**
@@ -4516,10 +4795,14 @@ $wgHttpOnlyBlacklist = array(
'/^Mozilla\/4\.0 \(compatible; MSIE \d+\.\d+; Mac_PowerPC\)/',
);
-/** A list of cookies that vary the cache (for use by extensions) */
+/**
+ * A list of cookies that vary the cache (for use by extensions)
+ */
$wgCacheVaryCookies = array();
-/** Override to customise the session name */
+/**
+ * Override to customise the session name
+ */
$wgSessionName = false;
/** @} */ # end of cookie settings }
@@ -4537,7 +4820,7 @@ $wgSessionName = false;
*/
$wgUseTeX = false;
-/* @} */ # end LaTeX }
+/** @} */ # end LaTeX }
/************************************************************************//**
* @name Profiling, testing and debugging
@@ -4676,10 +4959,14 @@ $wgDevelopmentWarnings = false;
*/
$wgDeprecationReleaseLimit = false;
-/** Only record profiling info for pages that took longer than this */
+/**
+ * Only record profiling info for pages that took longer than this
+ */
$wgProfileLimit = 0.0;
-/** Don't put non-profiling info into log file */
+/**
+ * Don't put non-profiling info into log file
+ */
$wgProfileOnly = false;
/**
@@ -4694,10 +4981,14 @@ $wgProfileOnly = false;
*/
$wgProfileToDatabase = false;
-/** If true, print a raw call tree instead of per-function report */
+/**
+ * If true, print a raw call tree instead of per-function report
+ */
$wgProfileCallTree = false;
-/** Should application server host be put into profiling table */
+/**
+ * Should application server host be put into profiling table
+ */
$wgProfilePerHost = false;
/**
@@ -4714,10 +5005,25 @@ $wgUDPProfilerHost = '127.0.0.1';
*/
$wgUDPProfilerPort = '3811';
-/** Detects non-matching wfProfileIn/wfProfileOut calls */
+/**
+ * Format string for the UDP profiler. The UDP profiler invokes sprintf() with
+ * (profile id, count, cpu, cpu_sq, real, real_sq, entry name) as arguments.
+ * You can use sprintf's argument numbering/swapping capability to repeat,
+ * re-order or omit fields.
+ *
+ * @see $wgStatsFormatString
+ * @since 1.22
+ */
+$wgUDPProfilerFormatString = "%s - %d %f %f %f %f %s\n";
+
+/**
+ * Detects non-matching wfProfileIn/wfProfileOut calls
+ */
$wgDebugProfiling = false;
-/** Output debug message on every wfProfileIn/wfProfileOut */
+/**
+ * Output debug message on every wfProfileIn/wfProfileOut
+ */
$wgDebugFunctionEntry = false;
/**
@@ -4736,7 +5042,21 @@ $wgStatsMethod = 'cache';
*/
$wgAggregateStatsID = false;
-/** Whereas to count the number of time an article is viewed.
+/**
+ * When $wgStatsMethod is 'udp', this variable specifies how stats should be
+ * formatted. Its value should be a format string suitable for a sprintf()
+ * invocation with (id, count, key) arguments, where 'id' is either
+ * $wgAggregateStatsID or the DB name, 'count' is the value by which the metric
+ * is being incremented, and 'key' is the metric name.
+ *
+ * @see $wgUDPProfilerFormatString
+ * @see $wgAggregateStatsID
+ * @since 1.22
+ */
+$wgStatsFormatString = "stats/%s - %s 1 1 1 1 %s\n";
+
+/**
+ * Whereas to count the number of time an article is viewed.
* Does not work if pages are cached (for example with squid).
*/
$wgDisableCounters = false;
@@ -4867,7 +5187,6 @@ $wgCountTotalSearchHits = false;
* PHP wrapper to avoid firing up mediawiki for every keystroke
*
* Placeholders: {searchTerms}
- *
*/
$wgOpenSearchTemplate = false;
@@ -4919,7 +5238,6 @@ $wgNamespacesToBeSearchedHelp = array(
* logged-in users.
* Useful for big wikis to maintain different search profiles for anonymous and
* logged-in users.
- *
*/
$wgSearchEverythingOnlyLoggedIn = false;
@@ -5011,12 +5329,8 @@ $wgPreviewOnOpenNamespaces = array(
);
/**
- * Activate external editor interface for files and pages
- * See http://www.mediawiki.org/wiki/Manual:External_editors
+ * Go button goes straight to the edit screen if the article doesn't exist.
*/
-$wgUseExternalEditor = true;
-
-/** Go button goes straight to the edit screen if the article doesn't exist. */
$wgGoToEdit = false;
/**
@@ -5050,7 +5364,9 @@ if ( !isset( $wgCommandLineMode ) ) {
}
/** @endcond */
-/** For colorized maintenance script output, is your terminal background dark ? */
+/**
+ * For colorized maintenance script output, is your terminal background dark ?
+ */
$wgCommandLineDarkBg = false;
/**
@@ -5091,6 +5407,11 @@ $wgReadOnlyFile = false;
$wgUpgradeKey = false;
/**
+ * Fully specified path to git binary
+ */
+$wgGitBin = '/usr/bin/git';
+
+/**
* Map GIT repository URLs to viewer URLs to provide links in Special:Version
*
* Key is a pattern passed to preg_match() and preg_replace(),
@@ -5098,12 +5419,14 @@ $wgUpgradeKey = false;
* The value is the replacement for the key (it can contain $1, etc.)
* %h will be replaced by the short SHA-1 (7 first chars) and %H by the
* full SHA-1 of the HEAD revision.
+ * %r will be replaced with a URL-encoded version of $1.
*
* @since 1.20
*/
$wgGitRepositoryViewers = array(
- 'https://gerrit.wikimedia.org/r/p/(.*)' => 'https://gerrit.wikimedia.org/r/gitweb?p=$1;h=%H',
- 'ssh://(?:[a-z0-9_]+@)?gerrit.wikimedia.org:29418/(.*)' => 'https://gerrit.wikimedia.org/r/gitweb?p=$1;h=%H',
+ 'https://gerrit.wikimedia.org/r/p/(.*)' => 'https://git.wikimedia.org/commit/%r/%H',
+ 'ssh://(?:[a-z0-9_]+@)?gerrit.wikimedia.org:29418/(.*)'
+ => 'https://git.wikimedia.org/commit/%r/%H',
);
/** @} */ # End of maintenance }
@@ -5139,11 +5462,15 @@ $wgRCLinkDays = array( 1, 3, 7, 14, 30 );
/**
* Send recent changes updates via UDP. The updates will be formatted for IRC.
* Set this to the IP address of the receiver.
+ *
+ * @deprecated since 1.22, use $wgRCFeeds
*/
$wgRC2UDPAddress = false;
/**
* Port number for RC updates
+ *
+ * @deprecated since 1.22, use $wgRCFeeds
*/
$wgRC2UDPPort = false;
@@ -5152,42 +5479,108 @@ $wgRC2UDPPort = false;
* This can be used to identify the wiki. A script is available called
* mxircecho.py which listens on a UDP port, and uses a prefix ending in a
* tab to identify the IRC channel to send the log line to.
+ *
+ * @deprecated since 1.22, use $wgRCFeeds
*/
$wgRC2UDPPrefix = '';
/**
* If this is set to true, $wgLocalInterwiki will be prepended to links in the
* IRC feed. If this is set to a string, that string will be used as the prefix.
+ *
+ * @deprecated since 1.22, use $wgRCFeeds
*/
$wgRC2UDPInterwikiPrefix = false;
/**
* Set to true to omit "bot" edits (by users with the bot permission) from the
* UDP feed.
+ *
+ * @deprecated since 1.22, use $wgRCFeeds
*/
$wgRC2UDPOmitBots = false;
/**
+ * Destinations to which notifications about recent changes
+ * should be sent.
+ *
+ * As of MediaWiki 1.22, the only supported 'engine' parameter option in core
+ * is 'UDPRCFeedEngine', which is used to send recent changes over UDP to the
+ * specified server.
+ * The common options are:
+ * * 'uri' -- the address to which the notices are to be sent.
+ * * 'formatter' -- the class name (implementing RCFeedFormatter) which will
+ * produce the text to send.
+ * * 'omit_bots' -- whether the bot edits should be in the feed
+ * The IRC-specific options are:
+ * * 'add_interwiki_prefix' -- whether the titles should be prefixed with
+ * $wgLocalInterwiki.
+ * The JSON-specific options are:
+ * * 'channel' -- if set, the 'channel' parameter is also set in JSON values.
+ *
+ * To ensure backwards-compatability, whenever $wgRC2UDPAddress is set, a
+ * 'default' feed will be created reusing the deprecated $wgRC2UDP* variables.
+ *
+ * @example $wgRCFeeds['example'] = array(
+ * 'formatter' => 'JSONRCFeedFormatter',
+ * 'uri' => "udp://localhost:1336",
+ * 'add_interwiki_prefix' => false,
+ * 'omit_bots' => true,
+ * );
+ * @example $wgRCFeeds['exampleirc'] = array(
+ * 'formatter' => 'IRCColourfulRCFeedFormatter',
+ * 'uri' => "udp://localhost:1338",
+ * 'add_interwiki_prefix' => false,
+ * 'omit_bots' => true,
+ * );
+ * @since 1.22
+ */
+$wgRCFeeds = array();
+
+/**
+ * Used by RecentChange::getEngine to find the correct engine to use for a given URI scheme.
+ * Keys are scheme names, values are names of engine classes.
+ */
+$wgRCEngines = array(
+ 'redis' => 'RedisPubSubFeedEngine',
+ 'udp' => 'UDPRCFeedEngine',
+);
+
+/**
* Enable user search in Special:Newpages
* This is really a temporary hack around an index install bug on some Wikipedias.
* Kill it once fixed.
*/
$wgEnableNewpagesUserFilter = true;
-/** Use RC Patrolling to check for vandalism */
+/**
+ * Use RC Patrolling to check for vandalism
+ */
$wgUseRCPatrol = true;
-/** Use new page patrolling to check new pages on Special:Newpages */
+/**
+ * Use new page patrolling to check new pages on Special:Newpages
+ */
$wgUseNPPatrol = true;
-/** Provide syndication feeds (RSS, Atom) for, e.g., Recentchanges, Newpages */
+/**
+ * Log autopatrol actions to the log table
+ */
+$wgLogAutopatrol = 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. */
+/**
+ * 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.
+/**
+ * _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.
*
@@ -5196,11 +5589,14 @@ $wgFeedLimit = 50;
*/
$wgFeedCacheTimeout = 60;
-/** When generating Recentchanges RSS/Atom feed, diffs will not be generated for
- * pages larger than this size. */
+/**
+ * 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
+/**
+ * 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).
* Should be a format as key (either 'rss' or 'atom') and an URL to the feed
@@ -5229,11 +5625,19 @@ $wgFeedClasses = array(
*/
$wgAdvertisedFeedTypes = array( 'atom' );
-/** Show watching users in recent changes, watchlist and page history views */
+/**
+ * Show watching users in recent changes, watchlist and page history views
+ */
$wgRCShowWatchingUsers = false; # UPO
-/** Show watching users in Page views */
+
+/**
+ * Show watching users in Page views
+ */
$wgPageShowWatchingUsers = false;
-/** Show the amount of changed characters in recent changes */
+
+/**
+ * Show the amount of changed characters in recent changes
+ */
$wgRCShowChangedSize = true;
/**
@@ -5245,7 +5649,8 @@ $wgRCChangedSizeThreshold = 500;
/**
* Show "Updated (since my last visit)" marker in RC view, watchlist and history
- * view for watched pages with new changes */
+ * view for watched pages with new changes
+ */
$wgShowUpdatedMarker = true;
/**
@@ -5274,6 +5679,33 @@ $wgUseTagFilter = true;
*/
$wgUnwatchedPageThreshold = false;
+/**
+ * Flags (letter symbols) shown in recent changes and watchlist to indicate
+ * certain types of edits.
+ *
+ * To register a new one:
+ * @code
+ * $wgRecentChangesFlags['flag'] => array(
+ * 'letter' => 'letter-msg',
+ * 'title' => 'tooltip-msg'
+ * );
+ * @endcode
+ *
+ * Optional 'class' allows to set a css class different than the flag name.
+ *
+ * @since 1.22
+ */
+$wgRecentChangesFlags = array(
+ 'newpage' => array( 'letter' => 'newpageletter',
+ 'title' => 'recentchanges-label-newpage' ),
+ 'minor' => array( 'letter' => 'minoreditletter',
+ 'title' => 'recentchanges-label-minor', 'class' => 'minoredit' ),
+ 'bot' => array( 'letter' => 'boteditletter',
+ 'title' => 'recentchanges-label-bot', 'class' => 'botedit' ),
+ 'unpatrolled' => array( 'letter' => 'unpatrolledletter',
+ 'title' => 'recentchanges-label-unpatrolled' ),
+);
+
/** @} */ # end RC/watchlist }
/************************************************************************//**
@@ -5291,15 +5723,17 @@ $wgUnwatchedPageThreshold = false;
$wgRightsPage = null;
/**
- * Set this to specify an external URL containing details about the content license used on your wiki.
+ * Set this to specify an external URL containing details about the content license used on your
+ * wiki.
* If $wgRightsPage is set then this setting is ignored.
*/
$wgRightsUrl = null;
/**
- * If either $wgRightsUrl or $wgRightsPage is specified then this variable gives the text for the link.
- * If using $wgRightsUrl then this value must be specified. If using $wgRightsPage then the name of the
- * page will also be used as the link if this variable is not set.
+ * If either $wgRightsUrl or $wgRightsPage is specified then this variable gives the text for the
+ * link.
+ * If using $wgRightsUrl then this value must be specified. If using $wgRightsPage then the name
+ * of the page will also be used as the link if this variable is not set.
*/
$wgRightsText = null;
@@ -5319,7 +5753,9 @@ $wgLicenseTerms = false;
*/
$wgCopyrightIcon = null;
-/** Set this to true if you want detailed copyright information forms on Upload. */
+/**
+ * Set this to true if you want detailed copyright information forms on Upload.
+ */
$wgUseCopyrightUpload = false;
/**
@@ -5331,8 +5767,10 @@ $wgUseCopyrightUpload = false;
*/
$wgMaxCredits = 0;
-/** If there are more than $wgMaxCredits authors, show $wgMaxCredits of them.
- * Otherwise, link to a separate credits page. */
+/**
+ * If there are more than $wgMaxCredits authors, show $wgMaxCredits of them.
+ * Otherwise, link to a separate credits page.
+ */
$wgShowCreditsIfMax = true;
/** @} */ # end of copyright and credits settings }
@@ -5435,6 +5873,13 @@ $wgExtensionFunctions = array();
$wgExtensionMessagesFiles = array();
/**
+ * Array of files with list(s) of extension entry points to be used in
+ * maintenance/mergeMessageFileList.php
+ * @since 1.22
+ */
+$wgExtensionEntryPointListFiles = array();
+
+/**
* Parser output hooks.
* This is an associative array where the key is an extension-defined tag
* (typically the extension name), and the value is a PHP callback.
@@ -5451,6 +5896,11 @@ $wgExtensionMessagesFiles = array();
$wgParserOutputHooks = array();
/**
+ * Whether to include the NewPP limit report as a HTML comment
+ */
+$wgEnableParserLimitReporting = true;
+
+/**
* List of valid skin names.
* The key should be the name in all lower case, the value should be a properly
* cased name for the skin. This value will be prefixed with "Skin" to create the
@@ -5521,17 +5971,24 @@ $wgAuth = null;
* @endcode
* - A function with some data:
* @code
- * $wgHooks['event_name'][] = array($function, $data);
+ * $wgHooks['event_name'][] = array( $function, $data );
* @endcode
* - A an object method:
* @code
- * $wgHooks['event_name'][] = array($object, 'method');
+ * $wgHooks['event_name'][] = array( $object, 'method' );
+ * @endcode
+ * - A closure:
+ * @code
+ * $wgHooks['event_name'][] = function ( $hookParam ) {
+ * // Handler code goes here.
+ * };
* @endcode
*
* @warning You should always append to an event array or you will end up
* deleting a previous registered hook.
*
- * @todo Does it support PHP closures?
+ * @warning Hook handlers should be registered at file scope. Registering
+ * handlers after file scope can lead to unexpected results due to caching.
*/
$wgHooks = array();
@@ -5543,7 +6000,6 @@ $wgJobClasses = array(
'refreshLinks' => 'RefreshLinksJob',
'refreshLinks2' => 'RefreshLinksJob2',
'htmlCacheUpdate' => 'HTMLCacheUpdateJob',
- 'html_cache_update' => 'HTMLCacheUpdateJob', // backwards-compatible
'sendMail' => 'EmaillingJob',
'enotifNotify' => 'EnotifNotifyJob',
'fixDoubleRedirect' => 'DoubleRedirectJob',
@@ -5843,12 +6299,13 @@ $wgDisableQueryPageUpdate = false;
* List of special pages, followed by what subtitle they should go under
* at Special:SpecialPages
*
- * @deprecated 1.21 Override SpecialPage::getGroupName instead
+ * @deprecated since 1.21 Override SpecialPage::getGroupName instead
*/
$wgSpecialPageGroups = array();
-/** Whether or not to sort special pages in Special:Specialpages */
-
+/**
+ * Whether or not to sort special pages in Special:Specialpages
+ */
$wgSortSpecialPages = true;
/**
@@ -6066,6 +6523,16 @@ $wgAPIRequestLog = false;
$wgAPICacheHelpTimeout = 60 * 60;
/**
+ * The ApiQueryQueryPages module should skip pages that are redundant to true
+ * API queries.
+ */
+$wgAPIUselessQueryPages = array(
+ 'MIMEsearch', // aiprop=mime
+ 'LinkSearch', // list=exturlusage
+ 'FileDuplicateSearch', // prop=duplicatefiles
+);
+
+/**
* Enable AJAX framework
*/
$wgUseAjax = true;
@@ -6119,7 +6586,6 @@ $wgCrossSiteAJAXdomains = array();
* even if they match one of the domains allowed by $wgCrossSiteAJAXdomains
* Uses the same syntax as $wgCrossSiteAJAXdomains
*/
-
$wgCrossSiteAJAXdomainExceptions = array();
/** @} */ # End AJAX and API }
@@ -6132,7 +6598,7 @@ $wgCrossSiteAJAXdomainExceptions = array();
/**
* Maximum amount of virtual memory available to shell processes under linux, in KB.
*/
-$wgMaxShellMemory = 102400;
+$wgMaxShellMemory = 307200;
/**
* Maximum file size created by shell processes under linux, in KB
@@ -6210,6 +6676,12 @@ $wgAsyncHTTPTimeout = 25;
*/
$wgHTTPProxy = false;
+/**
+ * Timeout for connections done internally (in seconds)
+ * Only works for curl
+ */
+$wgHTTPConnectTimeout = 5e0;
+
/** @} */ # End HTTP client }
/************************************************************************//**
@@ -6248,61 +6720,13 @@ $wgMaxBacklinksInvalidate = false;
/** @} */ # End job queue }
/************************************************************************//**
- * @name HipHop compilation
+ * @name Miscellaneous
* @{
*/
/**
- * The build directory for HipHop compilation.
- * Defaults to '$IP/maintenance/hiphop/build'.
- */
-$wgHipHopBuildDirectory = false;
-
-/**
- * The HipHop build type. Can be either "Debug" or "Release".
+ * Name of the external diff engine to use
*/
-$wgHipHopBuildType = 'Debug';
-
-/**
- * Number of parallel processes to use during HipHop compilation, or "detect"
- * to guess from system properties.
- */
-$wgHipHopCompilerProcs = 'detect';
-
-/**
- * Filesystem extensions directory. Defaults to $IP/../extensions.
- *
- * To compile extensions with HipHop, set $wgExtensionsDirectory correctly,
- * and use code like:
- * @code
- * require( MWInit::extensionSetupPath( 'Extension/Extension.php' ) );
- * @endcode
- *
- * to include the extension setup file from LocalSettings.php. It is not
- * necessary to set this variable unless you use MWInit::extensionSetupPath().
- */
-$wgExtensionsDirectory = false;
-
-/**
- * A list of files that should be compiled into a HipHop build, in addition to
- * those listed in $wgAutoloadClasses. Add to this array in an extension setup
- * file in order to add files to the build.
- *
- * The files listed here must either be either absolute paths under $IP or
- * under $wgExtensionsDirectory, or paths relative to the virtual source root
- * "$IP/..", i.e. starting with "phase3" for core files, and "extensions" for
- * extension files.
- */
-$wgCompiledFiles = array();
-
-/** @} */ # End of HipHop compilation }
-
-/************************************************************************//**
- * @name Miscellaneous
- * @{
- */
-
-/** Name of the external diff engine to use */
$wgExternalDiffEngine = false;
/**
@@ -6372,25 +6796,18 @@ $wgPoolCounterConf = null;
$wgUploadMaintenance = false;
/**
- * Allows running of selenium tests via maintenance/tests/RunSeleniumTests.php
- */
-$wgEnableSelenium = false;
-$wgSeleniumTestConfigs = array();
-$wgSeleniumConfigFile = null;
-$wgDBtestuser = ''; //db user that has permission to create and drop the test databases only
-$wgDBtestpassword = '';
-
-/**
- * Associative array mapping namespace IDs to the name of the content model pages in that namespace should have by
- * default (use the CONTENT_MODEL_XXX constants). If no special content type is defined for a given namespace,
- * pages in that namespace will use the CONTENT_MODEL_WIKITEXT (except for the special case of JS and CS pages).
+ * Associative array mapping namespace IDs to the name of the content model pages in that namespace
+ * should have by default (use the CONTENT_MODEL_XXX constants). If no special content type is
+ * defined for a given namespace, pages in that namespace will use the CONTENT_MODEL_WIKITEXT
+ * (except for the special case of JS and CS pages).
*
* @since 1.21
*/
$wgNamespaceContentModels = array();
/**
- * How to react if a plain text version of a non-text Content object is requested using ContentHandler::getContentText():
+ * How to react if a plain text version of a non-text Content object is requested using
+ * ContentHandler::getContentText():
*
* * 'ignore': return null
* * 'fail': throw an MWException
@@ -6402,14 +6819,14 @@ $wgContentHandlerTextFallback = 'ignore';
/**
* Set to false to disable use of the database fields introduced by the ContentHandler facility.
- * This way, the ContentHandler facility can be used without any additional information in the database.
- * A page's content model is then derived solely from the page's title. This however means that changing
- * a page's default model (e.g. using $wgNamespaceContentModels) will break the page and/or make the content
- * inaccessible. This also means that pages can not be moved to a title that would default to a different
- * content model.
+ * This way, the ContentHandler facility can be used without any additional information in the
+ * database. A page's content model is then derived solely from the page's title. This however
+ * means that changing a page's default model (e.g. using $wgNamespaceContentModels) will break
+ * the page and/or make the content inaccessible. This also means that pages can not be moved to
+ * a title that would default to a different content model.
*
- * Overall, with $wgContentHandlerUseDB = false, no database updates are needed, but content handling
- * is less robust and less flexible.
+ * Overall, with $wgContentHandlerUseDB = false, no database updates are needed, but content
+ * handling is less robust and less flexible.
*
* @since 1.21
*/
@@ -6420,7 +6837,7 @@ $wgContentHandlerUseDB = true;
* of texts are also rendered as wikitext, it only means that links, magic words, etc will have
* the effect on the database they would have on a wikitext page.
*
- * @todo: On the long run, it would be nice to put categories etc into a separate structure,
+ * @todo On the long run, it would be nice to put categories etc into a separate structure,
* or at least parse only the contents of comments in the scripts.
*
* @since 1.21
@@ -6448,6 +6865,12 @@ $wgSiteTypes = array(
);
/**
+ * Formerly a list of files for HipHop compilation
+ * @deprecated since 1.22
+ */
+$wgCompiledFiles = array();
+
+/**
* For really cool vim folding this needs to be at the end:
* vim: foldmarker=@{,@} foldmethod=marker
* @}
diff --git a/includes/DeferredUpdates.php b/includes/DeferredUpdates.php
index 89c4df68..c385f138 100644
--- a/includes/DeferredUpdates.php
+++ b/includes/DeferredUpdates.php
@@ -64,6 +64,16 @@ class DeferredUpdates {
}
/**
+ * Add a callable update. In a lot of cases, we just need a callback/closure,
+ * defining a new DeferrableUpdate object is not necessary
+ * @see MWCallableUpdate::__construct()
+ * @param callable $callable
+ */
+ public static function addCallableUpdate( $callable ) {
+ self::addUpdate( new MWCallableUpdate( $callable ) );
+ }
+
+ /**
* Do any deferred updates and clear the list
*
* @param string $commit set to 'commit' to commit after every update to
@@ -99,7 +109,7 @@ class DeferredUpdates {
// be reported to the user since the output is already sent.
// Instead we just log them.
if ( !$e instanceof ErrorPageError ) {
- wfDebugLog( 'exception', $e->getLogMessage() );
+ MWExceptionHandler::logException( $e );
}
}
}
diff --git a/includes/Defines.php b/includes/Defines.php
index c4a86335..86c5520b 100644
--- a/includes/Defines.php
+++ b/includes/Defines.php
@@ -197,14 +197,14 @@ define( 'EDIT_AUTOSUMMARY', 64 );
define( 'LIST_COMMA', 0 );
define( 'LIST_AND', 1 );
define( 'LIST_SET', 2 );
-define( 'LIST_NAMES', 3);
-define( 'LIST_OR', 4);
+define( 'LIST_NAMES', 3 );
+define( 'LIST_OR', 4 );
/**@}*/
/**
* Unicode and normalisation related
*/
-require_once __DIR__.'/normal/UtfNormalDefines.php';
+require_once __DIR__ . '/normal/UtfNormalDefines.php';
/**@{
* Hook support constants
@@ -237,11 +237,6 @@ define( 'SFH_OBJECT_ARGS', 2 );
/**@}*/
/**
- * Flags for Parser::setLinkHook
- */
-define( 'SLH_PATTERN', 1 );
-
-/**
* Flags for Parser::replaceLinkHolders
*/
define( 'RLH_FOR_UPDATE', 1 );
diff --git a/includes/EditPage.php b/includes/EditPage.php
index 8b2dbb5f..530e2674 100644
--- a/includes/EditPage.php
+++ b/includes/EditPage.php
@@ -100,7 +100,7 @@ class EditPage {
/**
* Status: user tried to create this page, but is not allowed to do that
- * ( Title->usercan('create') == false )
+ * ( Title->userCan('create') == false )
*/
const AS_NO_CREATE_PERMISSION = 223;
@@ -487,7 +487,7 @@ class EditPage {
// The edit page was reached via a red link.
// Redirect to the article page and let them click the edit tab if
// they really want a permission error.
- $wgOut->redirect( $this->mTitle->getFullUrl() );
+ $wgOut->redirect( $this->mTitle->getFullURL() );
return;
}
@@ -521,6 +521,8 @@ class EditPage {
$wgOut->addHTML( Html::rawElement( 'div', array( 'class' => 'templatesUsed' ),
Linker::formatTemplates( $this->getTemplates() ) ) );
+ $wgOut->addModules( 'mediawiki.action.edit.collapsibleFooter' );
+
if ( $this->mTitle->exists() ) {
$wgOut->returnToMain( null, $this->mTitle );
}
@@ -540,7 +542,7 @@ class EditPage {
// The edit page was reached via a red link.
// Redirect to the article page and let them click the edit tab if
// they really want a permission error.
- $wgOut->redirect( $this->mTitle->getFullUrl() );
+ $wgOut->redirect( $this->mTitle->getFullURL() );
} else {
$wgOut->readOnlyPage( $source, $protected, $reasons, $action );
}
@@ -621,6 +623,7 @@ class EditPage {
$this->section = $request->getVal( 'wpSection', $request->getVal( 'section' ) );
if ( $this->section !== null && $this->section !== '' && !$this->isSectionEditSupported() ) {
+ wfProfileOut( __METHOD__ );
throw new ErrorPageError( 'sectioneditnotsupported-title', 'sectioneditnotsupported-text' );
}
@@ -663,6 +666,11 @@ class EditPage {
$this->edittime = $request->getVal( 'wpEdittime' );
$this->starttime = $request->getVal( 'wpStarttime' );
+ $undidRev = $request->getInt( 'wpUndidRevision' );
+ if ( $undidRev ) {
+ $this->undidRev = $undidRev;
+ }
+
$this->scrolltop = $request->getIntOrNull( 'wpScrolltop' );
if ( $this->textbox1 === '' && $request->getVal( 'wpTextbox1' ) === null ) {
@@ -832,7 +840,6 @@ class EditPage {
if ( $this->textbox1 === false ) {
return false;
}
- wfProxyCheck();
return true;
}
@@ -897,7 +904,9 @@ class EditPage {
$orig = $this->getOriginalContent();
$content = $orig ? $orig->getSection( $this->section ) : null;
- if ( !$content ) $content = $def_content;
+ if ( !$content ) {
+ $content = $def_content;
+ }
} else {
$undoafter = $wgRequest->getInt( 'undoafter' );
$undo = $wgRequest->getInt( 'undo' );
@@ -932,7 +941,19 @@ class EditPage {
# If we just undid one rev, use an autosummary
$firstrev = $oldrev->getNext();
if ( $firstrev && $firstrev->getId() == $undo ) {
- $undoSummary = wfMessage( 'undo-summary', $undo, $undorev->getUserText() )->inContentLanguage()->text();
+ $userText = $undorev->getUserText();
+ if ( $userText === '' ) {
+ $undoSummary = wfMessage(
+ 'undo-summary-username-hidden',
+ $undo
+ )->inContentLanguage()->text();
+ } else {
+ $undoSummary = wfMessage(
+ 'undo-summary',
+ $undo,
+ $userText
+ )->inContentLanguage()->text();
+ }
if ( $this->summary === '' ) {
$this->summary = $undoSummary;
} else {
@@ -950,6 +971,7 @@ class EditPage {
$undoMsg = 'norev';
}
+ // Messages: undo-success, undo-failure, undo-norev
$class = ( $undoMsg == 'success' ? '' : 'error ' ) . "mw-undo-{$undoMsg}";
$this->editFormPageTop .= $wgOut->parse( "<div class=\"{$class}\">" .
wfMessage( 'undo-' . $undoMsg )->plain() . '</div>', true, /* interface */true );
@@ -985,7 +1007,9 @@ class EditPage {
}
$revision = $this->mArticle->getRevisionFetched();
if ( $revision === null ) {
- if ( !$this->contentModel ) $this->contentModel = $this->getTitle()->getContentModel();
+ if ( !$this->contentModel ) {
+ $this->contentModel = $this->getTitle()->getContentModel();
+ }
$handler = ContentHandler::getForModelID( $this->contentModel );
return $handler->makeEmptyContent();
@@ -1007,7 +1031,9 @@ class EditPage {
$content = $rev ? $rev->getContent( Revision::RAW ) : null;
if ( $content === false || $content === null ) {
- if ( !$this->contentModel ) $this->contentModel = $this->getTitle()->getContentModel();
+ if ( !$this->contentModel ) {
+ $this->contentModel = $this->getTitle()->getContentModel();
+ }
$handler = ContentHandler::getForModelID( $this->contentModel );
return $handler->makeEmptyContent();
@@ -1157,20 +1183,20 @@ class EditPage {
* marked HttpOnly. The JavaScript code converts the cookie to a wgPostEdit config
* variable.
*
- * Since WebResponse::setcookie does not allow forcing HttpOnly for a single
- * cookie, we have to use PHP's setcookie() directly.
- *
* We use a path of '/' since wgCookiePath is not exposed to JS
*
* If the variable were set on the server, it would be cached, which is unwanted
* since the post-edit state should only apply to the load right after the save.
*/
protected function setPostEditCookie() {
- global $wgCookiePrefix, $wgCookieDomain;
$revisionId = $this->mArticle->getLatest();
$postEditKey = self::POST_EDIT_COOKIE_KEY_PREFIX . $revisionId;
- setcookie( $wgCookiePrefix . $postEditKey, '1', time() + self::POST_EDIT_COOKIE_DURATION, '/', $wgCookieDomain );
+ $response = RequestContext::getMain()->getRequest()->response();
+ $response->setcookie( $postEditKey, '1', time() + self::POST_EDIT_COOKIE_DURATION, array(
+ 'path' => '/',
+ 'httpOnly' => false,
+ ) );
}
/**
@@ -1213,7 +1239,7 @@ class EditPage {
case self::AS_SUCCESS_NEW_ARTICLE:
$query = $resultDetails['redirect'] ? 'redirect=no' : '';
- $anchor = isset ( $resultDetails['sectionanchor'] ) ? $resultDetails['sectionanchor'] : '';
+ $anchor = isset( $resultDetails['sectionanchor'] ) ? $resultDetails['sectionanchor'] : '';
$wgOut->redirect( $this->mTitle->getFullURL( $query ) . $anchor );
return false;
@@ -1355,6 +1381,24 @@ class EditPage {
return $status;
}
+ $spam = $wgRequest->getText( 'wpAntispam' );
+ if ( $spam !== '' ) {
+ wfDebugLog(
+ 'SimpleAntiSpam',
+ $wgUser->getName() .
+ ' editing "' .
+ $this->mTitle->getPrefixedText() .
+ '" submitted bogus field "' .
+ $spam .
+ '"'
+ );
+ $status->fatal( 'spamprotectionmatch', false );
+ $status->value = self::AS_SPAM_ERROR;
+ wfProfileOut( __METHOD__ . '-checks' );
+ wfProfileOut( __METHOD__ );
+ return $status;
+ }
+
try {
# Construct Content object
$textbox_content = $this->toEditContent( $this->textbox1 );
@@ -1381,6 +1425,18 @@ class EditPage {
# Check for spam
$match = self::matchSummarySpamRegex( $this->summary );
+ if ( $match === false && $this->section == 'new' ) {
+ # $wgSpamRegex is enforced on this new heading/summary because, unlike
+ # regular summaries, it is added to the actual wikitext.
+ if ( $this->sectiontitle !== '' ) {
+ # This branch is taken when the API is used with the 'sectiontitle' parameter.
+ $match = self::matchSpamRegex( $this->sectiontitle );
+ } else {
+ # This branch is taken when the "Add Topic" user interface is used, or the API
+ # is used with the 'summary' parameter.
+ $match = self::matchSpamRegex( $this->summary );
+ }
+ }
if ( $match === false ) {
$match = self::matchSpamRegex( $this->textbox1 );
}
@@ -1454,7 +1510,7 @@ class EditPage {
wfProfileOut( __METHOD__ );
return $status;
}
- if ( $wgUser->pingLimiter() ) {
+ if ( $wgUser->pingLimiter() || $wgUser->pingLimiter( 'linkpurge', 0 ) ) {
$status->fatal( 'actionthrottledtext' );
$status->value = self::AS_RATE_LIMITED;
wfProfileOut( __METHOD__ . '-checks' );
@@ -1488,8 +1544,17 @@ class EditPage {
return $status;
}
- # Don't save a new article if it's blank.
- if ( $this->textbox1 == '' ) {
+ // Don't save a new page if it's blank or if it's a MediaWiki:
+ // message with content equivalent to default (allow empty pages
+ // in this case to disable messages, see bug 50124)
+ $defaultMessageText = $this->mTitle->getDefaultMessageText();
+ if ( $this->mTitle->getNamespace() === NS_MEDIAWIKI && $defaultMessageText !== false ) {
+ $defaultText = $defaultMessageText;
+ } else {
+ $defaultText = '';
+ }
+
+ if ( $this->textbox1 === $defaultText ) {
$status->setResult( false, self::AS_BLANK_ARTICLE );
wfProfileOut( __METHOD__ );
return $status;
@@ -1566,8 +1631,7 @@ class EditPage {
}
}
- // If sectiontitle is set, use it, otherwise use the summary as the section title (for
- // backwards compatibility with old forms/bots).
+ // If sectiontitle is set, use it, otherwise use the summary as the section title.
if ( $this->sectiontitle !== '' ) {
$sectionTitle = $this->sectiontitle;
} else {
@@ -1724,6 +1788,10 @@ class EditPage {
}
$result['nullEdit'] = $doEditStatus->hasMessage( 'edit-no-change' );
+ if ( $result['nullEdit'] ) {
+ // We don't know if it was a null edit until now, so increment here
+ $wgUser->pingLimiter( 'linkpurge' );
+ }
$result['redirect'] = $content->isRedirect();
$this->updateWatchlist();
wfProfileOut( __METHOD__ );
@@ -1736,7 +1804,9 @@ class EditPage {
protected function updateWatchlist() {
global $wgUser;
- if ( $wgUser->isLoggedIn() && $this->watchthis != $wgUser->isWatched( $this->mTitle ) ) {
+ if ( $wgUser->isLoggedIn()
+ && $this->watchthis != $wgUser->isWatched( $this->mTitle, WatchedItem::IGNORE_USER_RIGHTS )
+ ) {
$fname = __METHOD__;
$title = $this->mTitle;
$watch = $this->watchthis;
@@ -1745,11 +1815,7 @@ class EditPage {
$dbw = wfGetDB( DB_MASTER );
$dbw->onTransactionIdle( function() use ( $dbw, $title, $watch, $wgUser, $fname ) {
$dbw->begin( $fname );
- if ( $watch ) {
- WatchAction::doWatch( $title, $wgUser );
- } else {
- WatchAction::doUnwatch( $title, $wgUser );
- }
+ WatchAction::doWatchOrUnwatch( $watch, $title, $wgUser );
$dbw->commit( $fname );
} );
}
@@ -1854,11 +1920,11 @@ class EditPage {
}
/**
- * Check given input text against $wgSpamRegex, and return the text of the first match.
+ * Check given input text against $wgSummarySpamRegex, and return the text of the first match.
*
* @param $text string
*
- * @return string|bool matching string or false
+ * @return string|bool matching string or false
*/
public static function matchSummarySpamRegex( $text ) {
global $wgSummarySpamRegex;
@@ -1885,10 +1951,16 @@ class EditPage {
global $wgOut, $wgUser;
$wgOut->addModules( 'mediawiki.action.edit' );
+ $wgOut->addModuleStyles( 'mediawiki.action.edit.styles' );
if ( $wgUser->getOption( 'uselivepreview', false ) ) {
$wgOut->addModules( 'mediawiki.action.edit.preview' );
}
+
+ if ( $wgUser->getOption( 'useeditwarning', false ) ) {
+ $wgOut->addModules( 'mediawiki.action.edit.editWarning' );
+ }
+
// Bug #19334: textarea jumps when editing articles in IE8
$wgOut->addStyle( 'common/IE80Fixes.css', 'screen', 'IE 8' );
@@ -1928,15 +2000,15 @@ class EditPage {
if ( $namespace == NS_MEDIAWIKI ) {
# Show a warning if editing an interface message
$wgOut->wrapWikiMsg( "<div class='mw-editinginterface'>\n$1\n</div>", 'editinginterface' );
- } else if( $namespace == NS_FILE ) {
+ } elseif ( $namespace == NS_FILE ) {
# Show a hint to shared repo
$file = wfFindFile( $this->mTitle );
- if( $file && !$file->isLocal() ) {
+ if ( $file && !$file->isLocal() ) {
$descUrl = $file->getDescriptionUrl();
# there must be a description url to show a hint to shared repo
- if( $descUrl ) {
- if( !$this->mTitle->exists() ) {
- $wgOut->wrapWikiMsg( "<div class=\"mw-sharedupload-desc-create\">\n$1\n</div>", array (
+ if ( $descUrl ) {
+ if ( !$this->mTitle->exists() ) {
+ $wgOut->wrapWikiMsg( "<div class=\"mw-sharedupload-desc-create\">\n$1\n</div>", array(
'sharedupload-desc-create', $file->getRepo()->getDisplayName(), $descUrl
) );
} else {
@@ -2126,7 +2198,7 @@ class EditPage {
}
}
- //@todo: add EditForm plugin interface and use it here!
+ // @todo add EditForm plugin interface and use it here!
// search for textarea1 and textares2, and allow EditForm to override all uses.
$wgOut->addHTML( Html::openElement( 'form', array( 'id' => self::EDITFORM_ID, 'name' => self::EDITFORM_ID,
'method' => 'post', 'action' => $this->getActionURL( $this->getContextTitle() ),
@@ -2136,6 +2208,14 @@ class EditPage {
call_user_func_array( $formCallback, array( &$wgOut ) );
}
+ // Add an empty field to trip up spambots
+ $wgOut->addHTML(
+ Xml::openElement( 'div', array( 'id' => 'antispam-container', 'style' => 'display: none;' ) )
+ . Html::rawElement( 'label', array( 'for' => 'wpAntiSpam' ), wfMessage( 'simpleantispam-label' )->parse() )
+ . Xml::element( 'input', array( 'type' => 'text', 'name' => 'wpAntispam', 'id' => 'wpAntispam', 'value' => '' ) )
+ . Xml::closeElement( 'div' )
+ );
+
wfRunHooks( 'EditPage::showEditForm:fields', array( &$this, &$wgOut ) );
// Put these up at the top to ensure they aren't lost on early form submission
@@ -2161,7 +2241,7 @@ class EditPage {
}
# When the summary is hidden, also hide them on preview/show changes
- if( $this->nosummary ) {
+ if ( $this->nosummary ) {
$wgOut->addHTML( Html::hidden( 'nosummary', true ) );
}
@@ -2239,6 +2319,11 @@ class EditPage {
$wgOut->addHTML( Html::rawElement( 'div', array( 'class' => 'hiddencats' ),
Linker::formatHiddenCategories( $this->mArticle->getHiddenCategories() ) ) );
+ $wgOut->addHTML( Html::rawElement( 'div', array( 'class' => 'limitreport' ),
+ self::getPreviewLimitReport( $this->mParserOutput ) ) );
+
+ $wgOut->addModules( 'mediawiki.action.edit.collapsibleFooter' );
+
if ( $this->isConflict ) {
try {
$this->showConflict();
@@ -2282,7 +2367,7 @@ class EditPage {
}
// Add edit notices
- $wgOut->addHTML( implode( "\n", $this->mTitle->getEditNotices() ) );
+ $wgOut->addHTML( implode( "\n", $this->mTitle->getEditNotices( $this->oldid ) ) );
if ( $this->isConflict ) {
$wgOut->wrapWikiMsg( "<div class='mw-explainconflict'>\n$1\n</div>", 'explainconflict' );
@@ -2509,7 +2594,7 @@ class EditPage {
global $wgParser;
if ( $isSubjectPreview ) {
- $summary = wfMessage( 'newsectionsummary', $wgParser->stripSectionName( $summary ) )
+ $summary = wfMessage( 'newsectionsummary' )->rawParams( $wgParser->stripSectionName( $summary ) )
->inContentLanguage()->text();
}
@@ -2626,7 +2711,7 @@ HTML
$attribs = $customAttribs + array(
'accesskey' => ',',
- 'id' => $name,
+ 'id' => $name,
'cols' => $wgUser->getIntOption( 'cols' ),
'rows' => $wgUser->getIntOption( 'rows' ),
'style' => '' // avoid php notices when appending preferences (appending allows customAttribs['style'] to still work
@@ -2702,9 +2787,9 @@ HTML
$oldtitlemsg = 'currentrev';
# if message does not exist, show diff against the preloaded default
- if( $this->mTitle->getNamespace() == NS_MEDIAWIKI && !$this->mTitle->exists() ) {
+ if ( $this->mTitle->getNamespace() == NS_MEDIAWIKI && !$this->mTitle->exists() ) {
$oldtext = $this->mTitle->getDefaultMessageText();
- if( $oldtext !== false ) {
+ if ( $oldtext !== false ) {
$oldtitlemsg = 'defaultmessagetext';
$oldContent = $this->toEditContent( $oldtext );
} else {
@@ -2799,7 +2884,15 @@ HTML
return self::getCopyrightWarning( $this->mTitle );
}
- public static function getCopyrightWarning( $title ) {
+ /**
+ * Get the copyright warning, by default returns wikitext
+ *
+ * @param Title $title
+ * @param string $format output format, valid values are any function of
+ * a Message object
+ * @return string
+ */
+ public static function getCopyrightWarning( $title, $format = 'plain' ) {
global $wgRightsText;
if ( $wgRightsText ) {
$copywarnMsg = array( 'copyrightwarning',
@@ -2813,7 +2906,60 @@ HTML
wfRunHooks( 'EditPageCopyrightWarning', array( $title, &$copywarnMsg ) );
return "<div id=\"editpage-copywarn\">\n" .
- call_user_func_array( 'wfMessage', $copywarnMsg )->plain() . "\n</div>";
+ call_user_func_array( 'wfMessage', $copywarnMsg )->$format() . "\n</div>";
+ }
+
+ /**
+ * Get the Limit report for page previews
+ *
+ * @since 1.22
+ * @param ParserOutput $output ParserOutput object from the parse
+ * @return string HTML
+ */
+ public static function getPreviewLimitReport( $output ) {
+ if ( !$output || !$output->getLimitReportData() ) {
+ return '';
+ }
+
+ wfProfileIn( __METHOD__ );
+
+ $limitReport = Html::rawElement( 'div', array( 'class' => 'mw-limitReportExplanation' ),
+ wfMessage( 'limitreport-title' )->parseAsBlock()
+ );
+
+ // Show/hide animation doesn't work correctly on a table, so wrap it in a div.
+ $limitReport .= Html::openElement( 'div', array( 'class' => 'preview-limit-report-wrapper' ) );
+
+ $limitReport .= Html::openElement( 'table', array(
+ 'class' => 'preview-limit-report wikitable'
+ ) ) .
+ Html::openElement( 'tbody' );
+
+ foreach ( $output->getLimitReportData() as $key => $value ) {
+ if ( wfRunHooks( 'ParserLimitReportFormat',
+ array( $key, $value, &$limitReport, true, true )
+ ) ) {
+ $keyMsg = wfMessage( $key );
+ $valueMsg = wfMessage( array( "$key-value-html", "$key-value" ) );
+ if ( !$valueMsg->exists() ) {
+ $valueMsg = new RawMessage( '$1' );
+ }
+ if ( !$keyMsg->isDisabled() && !$valueMsg->isDisabled() ) {
+ $limitReport .= Html::openElement( 'tr' ) .
+ Html::rawElement( 'th', null, $keyMsg->parse() ) .
+ Html::rawElement( 'td', null, $valueMsg->params( $value )->parse() ) .
+ Html::closeElement( 'tr' );
+ }
+ }
+ }
+
+ $limitReport .= Html::closeElement( 'tbody' ) .
+ Html::closeElement( 'table' ) .
+ Html::closeElement( 'div' );
+
+ wfProfileOut( __METHOD__ );
+
+ return $limitReport;
}
protected function showStandardInputs( &$tabindex = 2 ) {
@@ -2838,7 +2984,9 @@ HTML
$cancel = $this->getCancelLink();
if ( $cancel !== '' ) {
- $cancel .= wfMessage( 'pipe-separator' )->text();
+ $cancel .= Html::element( 'span',
+ array( 'class' => 'mw-editButtons-pipe-separator' ),
+ wfMessage( 'pipe-separator' )->text() );
}
$edithelpurl = Skin::makeInternalOrExternalUrl( wfMessage( 'edithelppage' )->inContentLanguage()->text() );
$edithelp = '<a target="helpwindow" href="' . $edithelpurl . '">' .
@@ -3028,9 +3176,9 @@ HTML
# don't parse non-wikitext pages, show message about preview
if ( $this->mTitle->isCssJsSubpage() || $this->mTitle->isCssOrJsPage() ) {
- if( $this->mTitle->isCssJsSubpage() ) {
+ if ( $this->mTitle->isCssJsSubpage() ) {
$level = 'user';
- } elseif( $this->mTitle->isCssOrJsPage() ) {
+ } elseif ( $this->mTitle->isCssOrJsPage() ) {
$level = 'site';
} else {
$level = false;
@@ -3046,7 +3194,7 @@ HTML
# Used messages to make sure grep find them:
# Messages: usercsspreview, userjspreview, sitecsspreview, sitejspreview
- if( $level && $format ) {
+ if ( $level && $format ) {
$note = "<div id='mw-{$level}{$format}preview'>" . wfMessage( "{$level}{$format}preview" )->text() . "</div>";
}
}
@@ -3098,9 +3246,9 @@ HTML
'<h2 id="mw-previewheader">' . wfMessage( 'preview' )->escaped() . "</h2>" .
$wgOut->parse( $note, true, /* interface */true ) . $conflict . "</div>\n";
- $pageLang = $this->mTitle->getPageLanguage();
- $attribs = array( 'lang' => $pageLang->getCode(), 'dir' => $pageLang->getDir(),
- 'class' => 'mw-content-' . $pageLang->getDir() );
+ $pageViewLang = $this->mTitle->getPageViewLanguage();
+ $attribs = array( 'lang' => $pageViewLang->getHtmlCode(), 'dir' => $pageViewLang->getDir(),
+ 'class' => 'mw-content-' . $pageViewLang->getDir() );
$previewHTML = Html::rawElement( 'div', $attribs, $previewHTML );
wfProfileOut( __METHOD__ );
@@ -3314,9 +3462,9 @@ HTML
$minorLabel = wfMessage( 'minoredit' )->parse();
if ( $wgUser->isAllowed( 'minoredit' ) ) {
$attribs = array(
- 'tabindex' => ++$tabindex,
+ 'tabindex' => ++$tabindex,
'accesskey' => wfMessage( 'accesskey-minoredit' )->text(),
- 'id' => 'wpMinoredit',
+ 'id' => 'wpMinoredit',
);
$checkboxes['minor'] =
Xml::check( 'wpMinoredit', $checked['minor'], $attribs ) .
@@ -3330,9 +3478,9 @@ HTML
$checkboxes['watch'] = '';
if ( $wgUser->isLoggedIn() ) {
$attribs = array(
- 'tabindex' => ++$tabindex,
+ 'tabindex' => ++$tabindex,
'accesskey' => wfMessage( 'accesskey-watch' )->text(),
- 'id' => 'wpWatchthis',
+ 'id' => 'wpWatchthis',
);
$checkboxes['watch'] =
Xml::check( 'wpWatchthis', $checked['watch'], $attribs ) .
@@ -3356,37 +3504,37 @@ HTML
$buttons = array();
$temp = array(
- 'id' => 'wpSave',
- 'name' => 'wpSave',
- 'type' => 'submit',
- 'tabindex' => ++$tabindex,
- 'value' => wfMessage( 'savearticle' )->text(),
+ 'id' => 'wpSave',
+ 'name' => 'wpSave',
+ 'type' => 'submit',
+ 'tabindex' => ++$tabindex,
+ 'value' => wfMessage( 'savearticle' )->text(),
'accesskey' => wfMessage( 'accesskey-save' )->text(),
- 'title' => wfMessage( 'tooltip-save' )->text() . ' [' . wfMessage( 'accesskey-save' )->text() . ']',
+ 'title' => wfMessage( 'tooltip-save' )->text() . ' [' . wfMessage( 'accesskey-save' )->text() . ']',
);
$buttons['save'] = Xml::element( 'input', $temp, '' );
++$tabindex; // use the same for preview and live preview
$temp = array(
- 'id' => 'wpPreview',
- 'name' => 'wpPreview',
- 'type' => 'submit',
- 'tabindex' => $tabindex,
- 'value' => wfMessage( 'showpreview' )->text(),
+ 'id' => 'wpPreview',
+ 'name' => 'wpPreview',
+ 'type' => 'submit',
+ 'tabindex' => $tabindex,
+ 'value' => wfMessage( 'showpreview' )->text(),
'accesskey' => wfMessage( 'accesskey-preview' )->text(),
- 'title' => wfMessage( 'tooltip-preview' )->text() . ' [' . wfMessage( 'accesskey-preview' )->text() . ']',
+ 'title' => wfMessage( 'tooltip-preview' )->text() . ' [' . wfMessage( 'accesskey-preview' )->text() . ']',
);
$buttons['preview'] = Xml::element( 'input', $temp, '' );
$buttons['live'] = '';
$temp = array(
- 'id' => 'wpDiff',
- 'name' => 'wpDiff',
- 'type' => 'submit',
- 'tabindex' => ++$tabindex,
- 'value' => wfMessage( 'showdiff' )->text(),
+ 'id' => 'wpDiff',
+ 'name' => 'wpDiff',
+ 'type' => 'submit',
+ 'tabindex' => ++$tabindex,
+ 'value' => wfMessage( 'showdiff' )->text(),
'accesskey' => wfMessage( 'accesskey-diff' )->text(),
- 'title' => wfMessage( 'tooltip-diff' )->text() . ' [' . wfMessage( 'accesskey-diff' )->text() . ']',
+ 'title' => wfMessage( 'tooltip-diff' )->text() . ' [' . wfMessage( 'accesskey-diff' )->text() . ']',
);
$buttons['diff'] = Xml::element( 'input', $temp, '' );
@@ -3506,7 +3654,7 @@ HTML
global $wgOut, $wgLang;
$this->textbox2 = $this->textbox1;
- if( is_array( $match ) ) {
+ if ( is_array( $match ) ) {
$match = $wgLang->listToText( $match );
}
$wgOut->prepareErrorPage( wfMessage( 'spamprotectiontitle' ) );
diff --git a/includes/Exception.php b/includes/Exception.php
index 0bd7a2a7..5bad88c2 100644
--- a/includes/Exception.php
+++ b/includes/Exception.php
@@ -30,7 +30,6 @@
* @ingroup Exception
*/
class MWException extends Exception {
- var $logId;
/**
* Should the exception use $wgOut to output the error?
@@ -45,6 +44,16 @@ class MWException extends Exception {
}
/**
+ * Whether to log this exception in the exception debug log.
+ *
+ * @since 1.23
+ * @return boolean
+ */
+ function isLoggable() {
+ return true;
+ }
+
+ /**
* Can the extension use the Message class/wfMessage to get i18n-ed messages?
*
* @return bool
@@ -75,11 +84,11 @@ class MWException extends Exception {
return null; // Just silently ignore
}
- if ( !array_key_exists( $name, $wgExceptionHooks ) || !is_array( $wgExceptionHooks[ $name ] ) ) {
+ if ( !array_key_exists( $name, $wgExceptionHooks ) || !is_array( $wgExceptionHooks[$name] ) ) {
return null;
}
- $hooks = $wgExceptionHooks[ $name ];
+ $hooks = $wgExceptionHooks[$name];
$callargs = array_merge( array( $this ), $args );
foreach ( $hooks as $hook ) {
@@ -126,13 +135,12 @@ class MWException extends Exception {
global $wgShowExceptionDetails;
if ( $wgShowExceptionDetails ) {
- return '<p>' . nl2br( htmlspecialchars( $this->getMessage() ) ) .
- '</p><p>Backtrace:</p><p>' . nl2br( htmlspecialchars( $this->getTraceAsString() ) ) .
+ return '<p>' . nl2br( htmlspecialchars( MWExceptionHandler::getLogMessage( $this ) ) ) .
+ '</p><p>Backtrace:</p><p>' . nl2br( htmlspecialchars( MWExceptionHandler::getRedactedTraceAsString( $this ) ) ) .
"</p>\n";
} else {
- return
- "<div class=\"errorbox\">" .
- '[' . $this->getLogId() . '] ' .
+ return "<div class=\"errorbox\">" .
+ '[' . MWExceptionHandler::getLogId( $this ) . '] ' .
gmdate( 'Y-m-d H:i:s' ) .
": Fatal exception of type " . get_class( $this ) . "</div>\n" .
"<!-- Set \$wgShowExceptionDetails = true; " .
@@ -152,8 +160,8 @@ class MWException extends Exception {
global $wgShowExceptionDetails;
if ( $wgShowExceptionDetails ) {
- return $this->getMessage() .
- "\nBacktrace:\n" . $this->getTraceAsString() . "\n";
+ return MWExceptionHandler::getLogMessage( $this ) .
+ "\nBacktrace:\n" . MWExceptionHandler::getRedactedTraceAsString( $this ) . "\n";
} else {
return "Set \$wgShowExceptionDetails = true; " .
"in LocalSettings.php to show detailed debugging information.\n";
@@ -170,43 +178,28 @@ class MWException extends Exception {
}
/**
- * Get a random ID for this error.
- * This allows to link the exception to its corresponding log entry when
- * $wgShowExceptionDetails is set to false.
+ * Get a the ID for this error.
*
+ * @since 1.20
+ * @deprecated since 1.22 Use MWExceptionHandler::getLogId instead.
* @return string
*/
function getLogId() {
- if ( $this->logId === null ) {
- $this->logId = wfRandomString( 8 );
- }
- return $this->logId;
+ wfDeprecated( __METHOD__, '1.22' );
+ return MWExceptionHandler::getLogId( $this );
}
/**
* Return the requested URL and point to file and line number from which the
* exception occurred
*
+ * @since 1.8
+ * @deprecated since 1.22 Use MWExceptionHandler::getLogMessage instead.
* @return string
*/
function getLogMessage() {
- global $wgRequest;
-
- $id = $this->getLogId();
- $file = $this->getFile();
- $line = $this->getLine();
- $message = $this->getMessage();
-
- if ( isset( $wgRequest ) && !$wgRequest instanceof FauxRequest ) {
- $url = $wgRequest->getRequestURL();
- if ( !$url ) {
- $url = '[no URL]';
- }
- } else {
- $url = '[no req]';
- }
-
- return "[$id] $url Exception from line $line of $file: $message";
+ wfDeprecated( __METHOD__, '1.22' );
+ return MWExceptionHandler::getLogMessage( $this );
}
/**
@@ -248,16 +241,9 @@ class MWException extends Exception {
* It will be either HTML or plain text based on isCommandLine().
*/
function report() {
- global $wgLogExceptionBacktrace;
- $log = $this->getLogMessage();
+ global $wgMimeType;
- if ( $log ) {
- if ( $wgLogExceptionBacktrace ) {
- wfDebugLog( 'exception', $log . "\n" . $this->getTraceAsString() . "\n" );
- } else {
- wfDebugLog( 'exception', $log );
- }
- }
+ MWExceptionHandler::logException( $this );
if ( defined( 'MW_API' ) ) {
// Unhandled API exception, we can't be sure that format printer is alive
@@ -268,6 +254,7 @@ class MWException extends Exception {
} else {
header( "HTTP/1.1 500 MediaWiki exception" );
header( "Status: 500 MediaWiki exception", true );
+ header( "Content-Type: $wgMimeType; charset=utf-8", true );
$this->reportHTML();
}
@@ -329,11 +316,17 @@ class ErrorPageError extends MWException {
$this->msg = $msg;
$this->params = $params;
- if( $msg instanceof Message ) {
- parent::__construct( $msg );
+ // Bug 44111: Messages in the log files should be in English and not
+ // customized by the local wiki. So get the default English version for
+ // passing to the parent constructor. Our overridden report() below
+ // makes sure that the page shown to the user is not forced to English.
+ if ( $msg instanceof Message ) {
+ $enMsg = clone( $msg );
} else {
- parent::__construct( wfMessage( $msg )->text() );
+ $enMsg = wfMessage( $msg, $params );
}
+ $enMsg->inLanguage( 'en' )->useDatabase( false );
+ parent::__construct( $enMsg->text() );
}
function report() {
@@ -461,39 +454,9 @@ class ThrottledError extends ErrorPageError {
*/
class UserBlockedError extends ErrorPageError {
public function __construct( Block $block ) {
- global $wgLang, $wgRequest;
-
- $blocker = $block->getBlocker();
- if ( $blocker instanceof User ) { // local user
- $blockerUserpage = $block->getBlocker()->getUserPage();
- $link = "[[{$blockerUserpage->getPrefixedText()}|{$blockerUserpage->getText()}]]";
- } else { // foreign user
- $link = $blocker;
- }
-
- $reason = $block->mReason;
- if( $reason == '' ) {
- $reason = wfMessage( 'blockednoreason' )->text();
- }
-
- /* $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. */
- $intended = $block->getTarget();
-
- parent::__construct(
- 'blockedtitle',
- $block->mAuto ? 'autoblockedtext' : 'blockedtext',
- array(
- $link,
- $reason,
- $wgRequest->getIP(),
- $block->getByName(),
- $block->getId(),
- $wgLang->formatExpiry( $block->mExpiry ),
- $intended,
- $wgLang->timeanddate( wfTimestamp( TS_MW, $block->mTimestamp ), true )
- )
- );
+ // @todo FIXME: Implement a more proper way to get context here.
+ $params = $block->getPermissionsError( RequestContext::getMain() );
+ parent::__construct( 'blockedtitle', array_shift( $params ), $params );
}
}
@@ -611,7 +574,7 @@ class HttpError extends MWException {
$content = htmlspecialchars( $this->content );
}
- return "<!DOCTYPE html>\n".
+ return "<!DOCTYPE html>\n" .
"<html><head><title>$header</title></head>\n" .
"<body><h1>$header</h1><p>$content</p></body></html>\n";
}
@@ -648,8 +611,10 @@ class MWExceptionHandler {
$message = "MediaWiki internal error.\n\n";
if ( $wgShowExceptionDetails ) {
- $message .= 'Original exception: ' . $e->__toString() . "\n\n" .
- 'Exception caught inside exception handler: ' . $e2->__toString();
+ $message .= 'Original exception: ' . self::getLogMessage( $e ) .
+ "\nBacktrace:\n" . self::getRedactedTraceAsString( $e ) .
+ "\n\nException caught inside exception handler: " . self::getLogMessage( $e2 ) .
+ "\nBacktrace:\n" . self::getRedactedTraceAsString( $e2 );
} else {
$message .= "Exception caught inside exception handler.\n\n" .
"Set \$wgShowExceptionDetails = true; at the bottom of LocalSettings.php " .
@@ -665,11 +630,11 @@ class MWExceptionHandler {
}
}
} else {
- $message = "Unexpected non-MediaWiki exception encountered, of type \"" . get_class( $e ) . "\"\n" .
- $e->__toString() . "\n";
+ $message = "Unexpected non-MediaWiki exception encountered, of type \"" . get_class( $e ) . "\"";
if ( $wgShowExceptionDetails ) {
- $message .= "\n" . $e->getTraceAsString() . "\n";
+ $message .= "\n" . MWExceptionHandler::getLogMessage( $e ) . "\nBacktrace:\n" .
+ self::getRedactedTraceAsString( $e ) . "\n";
}
if ( $cmdLine ) {
@@ -692,7 +657,7 @@ class MWExceptionHandler {
if ( defined( 'STDERR' ) ) {
fwrite( STDERR, $message );
} else {
- echo( $message );
+ echo $message;
}
}
@@ -715,11 +680,145 @@ class MWExceptionHandler {
// Final cleanup
if ( $wgFullyInitialised ) {
try {
- wfLogProfilingData(); // uses $wgRequest, hence the $wgFullyInitialised condition
- } catch ( Exception $e ) {}
+ // uses $wgRequest, hence the $wgFullyInitialised condition
+ wfLogProfilingData();
+ } catch ( Exception $e ) {
+ }
}
// Exit value should be nonzero for the benefit of shell jobs
exit( 1 );
}
+
+ /**
+ * Generate a string representation of an exception's stack trace
+ *
+ * Like Exception::getTraceAsString, but replaces argument values with
+ * argument type or class name.
+ *
+ * @param Exception $e
+ * @return string
+ */
+ public static function getRedactedTraceAsString( Exception $e ) {
+ $text = '';
+
+ foreach ( self::getRedactedTrace( $e ) as $level => $frame ) {
+ if ( isset( $frame['file'] ) && isset( $frame['line'] ) ) {
+ $text .= "#{$level} {$frame['file']}({$frame['line']}): ";
+ } else {
+ // 'file' and 'line' are unset for calls via call_user_func (bug 55634)
+ // This matches behaviour of Exception::getTraceAsString to instead
+ // display "[internal function]".
+ $text .= "#{$level} [internal function]: ";
+ }
+
+ if ( isset( $frame['class'] ) ) {
+ $text .= $frame['class'] . $frame['type'] . $frame['function'];
+ } else {
+ $text .= $frame['function'];
+ }
+
+ if ( isset( $frame['args'] ) ) {
+ $text .= '(' . implode( ', ', $frame['args'] ) . ")\n";
+ } else {
+ $text .= "()\n";
+ }
+ }
+
+ $level = $level + 1;
+ $text .= "#{$level} {main}";
+
+ return $text;
+ }
+
+ /**
+ * Return a copy of an exception's backtrace as an array.
+ *
+ * Like Exception::getTrace, but replaces each element in each frame's
+ * argument array with the name of its class (if the element is an object)
+ * or its type (if the element is a PHP primitive).
+ *
+ * @since 1.22
+ * @param Exception $e
+ * @return array
+ */
+ public static function getRedactedTrace( Exception $e ) {
+ return array_map( function ( $frame ) {
+ if ( isset( $frame['args'] ) ) {
+ $frame['args'] = array_map( function ( $arg ) {
+ return is_object( $arg ) ? get_class( $arg ) : gettype( $arg );
+ }, $frame['args'] );
+ }
+ return $frame;
+ }, $e->getTrace() );
+ }
+
+
+ /**
+ * Get the ID for this error.
+ *
+ * The ID is saved so that one can match the one output to the user (when
+ * $wgShowExceptionDetails is set to false), to the entry in the debug log.
+ *
+ * @since 1.22
+ * @param Exception $e
+ * @return string
+ */
+ public static function getLogId( Exception $e ) {
+ if ( !isset( $e->_mwLogId ) ) {
+ $e->_mwLogId = wfRandomString( 8 );
+ }
+ return $e->_mwLogId;
+ }
+
+ /**
+ * Return the requested URL and point to file and line number from which the
+ * exception occurred.
+ *
+ * @since 1.22
+ * @param Exception $e
+ * @return string
+ */
+ public static function getLogMessage( Exception $e ) {
+ global $wgRequest;
+
+ $id = self::getLogId( $e );
+ $file = $e->getFile();
+ $line = $e->getLine();
+ $message = $e->getMessage();
+
+ if ( isset( $wgRequest ) && !$wgRequest instanceof FauxRequest ) {
+ $url = $wgRequest->getRequestURL();
+ if ( !$url ) {
+ $url = '[no URL]';
+ }
+ } else {
+ $url = '[no req]';
+ }
+
+ return "[$id] $url Exception from line $line of $file: $message";
+ }
+
+ /**
+ * Log an exception to the exception log (if enabled).
+ *
+ * This method must not assume the exception is an MWException,
+ * it is also used to handle PHP errors or errors from other libraries.
+ *
+ * @since 1.22
+ * @param Exception $e
+ */
+ public static function logException( Exception $e ) {
+ global $wgLogExceptionBacktrace;
+
+ if ( !( $e instanceof MWException ) || $e->isLoggable() ) {
+ $log = self::getLogMessage( $e );
+ if ( $wgLogExceptionBacktrace ) {
+ wfDebugLog( 'exception', $log . "\n" . $e->getTraceAsString() . "\n" );
+ } else {
+ wfDebugLog( 'exception', $log );
+ }
+ }
+ }
+
}
diff --git a/includes/Export.php b/includes/Export.php
index d8cc0242..98de4c00 100644
--- a/includes/Export.php
+++ b/includes/Export.php
@@ -249,9 +249,13 @@ class WikiExporter {
$where = array( 'user_id = log_user' );
# Hide private logs
$hideLogs = LogEventsList::getExcludeClause( $this->db );
- if ( $hideLogs ) $where[] = $hideLogs;
+ if ( $hideLogs ) {
+ $where[] = $hideLogs;
+ }
# Add on any caller specified conditions
- if ( $cond ) $where[] = $cond;
+ if ( $cond ) {
+ $where[] = $cond;
+ }
# Get logging table name for logging.* clause
$logging = $this->db->tableName( 'logging' );
@@ -296,6 +300,7 @@ class WikiExporter {
}
// Inform caller about problem
+ wfProfileOut( __METHOD__ );
throw $e;
}
# For page dumps...
@@ -541,7 +546,7 @@ class XmlDumpWriter {
* @return string
*/
function homelink() {
- return Xml::element( 'base', array(), Title::newMainPage()->getCanonicalUrl() );
+ return Xml::element( 'base', array(), Title::newMainPage()->getCanonicalURL() );
}
/**
@@ -563,8 +568,9 @@ class XmlDumpWriter {
foreach ( $wgContLang->getFormattedNamespaces() as $ns => $title ) {
$spaces .= ' ' .
Xml::element( 'namespace',
- array( 'key' => $ns,
- 'case' => MWNamespace::isCapitalized( $ns ) ? 'first-letter' : 'case-sensitive',
+ array(
+ 'key' => $ns,
+ 'case' => MWNamespace::isCapitalized( $ns ) ? 'first-letter' : 'case-sensitive',
), $title ) . "\n";
}
$spaces .= " </namespaces>";
@@ -593,7 +599,7 @@ class XmlDumpWriter {
$out = " <page>\n";
$title = Title::makeTitle( $row->page_namespace, $row->page_title );
$out .= ' ' . Xml::elementClean( 'title', array(), self::canonicalTitle( $title ) ) . "\n";
- $out .= ' ' . Xml::element( 'ns', array(), strval( $row->page_namespace) ) . "\n";
+ $out .= ' ' . Xml::element( 'ns', array(), strval( $row->page_namespace ) ) . "\n";
$out .= ' ' . Xml::element( 'id', array(), strval( $row->page_id ) ) . "\n";
if ( $row->page_is_redirect ) {
$page = WikiPage::factory( $title );
@@ -636,7 +642,7 @@ class XmlDumpWriter {
$out = " <revision>\n";
$out .= " " . Xml::element( 'id', null, strval( $row->rev_id ) ) . "\n";
- if( isset( $row->rev_parent_id ) && $row->rev_parent_id ) {
+ if ( isset( $row->rev_parent_id ) && $row->rev_parent_id ) {
$out .= " " . Xml::element( 'parentid', null, strval( $row->rev_parent_id ) ) . "\n";
}
@@ -683,7 +689,7 @@ class XmlDumpWriter {
$content_model = strval( $row->rev_content_model );
} else {
// probably using $wgContentHandlerUseDB = false;
- // @todo: test!
+ // @todo test!
$title = Title::makeTitle( $row->page_namespace, $row->page_title );
$content_model = ContentHandler::getDefaultModelFor( $title );
}
@@ -694,7 +700,7 @@ class XmlDumpWriter {
$content_format = strval( $row->rev_content_format );
} else {
// probably using $wgContentHandlerUseDB = false;
- // @todo: test!
+ // @todo test!
$content_handler = ContentHandler::getForModelID( $content_model );
$content_format = $content_handler->getDefaultFormat();
}
@@ -818,10 +824,13 @@ class XmlDumpWriter {
$archiveName = '';
}
if ( $dumpContents ) {
+ $be = $file->getRepo()->getBackend();
# Dump file as base64
# Uses only XML-safe characters, so does not need escaping
+ # @TODO: too bad this loads the contents into memory (script might swap)
$contents = ' <contents encoding="base64">' .
- chunk_split( base64_encode( file_get_contents( $file->getPath() ) ) ) .
+ chunk_split( base64_encode(
+ $be->getFileContents( array( 'src' => $file->getPath() ) ) ) ) .
" </contents>\n";
} else {
$contents = '';
@@ -837,7 +846,7 @@ class XmlDumpWriter {
" " . $comment . "\n" .
" " . Xml::element( 'filename', null, $file->getName() ) . "\n" .
$archiveName .
- " " . Xml::element( 'src', null, $file->getCanonicalUrl() ) . "\n" .
+ " " . Xml::element( 'src', null, $file->getCanonicalURL() ) . "\n" .
" " . Xml::element( 'size', null, $file->getSize() ) . "\n" .
" " . Xml::element( 'sha1base36', null, $file->getSha1() ) . "\n" .
" " . Xml::element( 'rel', null, $file->getRel() ) . "\n" .
@@ -1185,7 +1194,7 @@ class Dump7ZipOutput extends DumpPipeOutput {
// Suppress annoying useless crap from p7zip
// Unfortunately this could suppress real error messages too
$command .= ' >' . wfGetNull() . ' 2>&1';
- return( $command );
+ return $command;
}
/**
diff --git a/includes/ExternalEdit.php b/includes/ExternalEdit.php
deleted file mode 100644
index 11e94230..00000000
--- a/includes/ExternalEdit.php
+++ /dev/null
@@ -1,132 +0,0 @@
-<?php
-/**
- * External editors support
- *
- * License: Public domain
- *
- * @file
- * @author Erik Moeller <moeller@scireview.de>
- */
-
-/**
- * Support for external editors to modify both text and files
- * in external applications. It works as follows: MediaWiki
- * sends a meta-file with the MIME type 'application/x-external-editor'
- * to the client. The user has to associate that MIME type with
- * a helper application (a reference implementation in Perl
- * can be found in extensions/ee), which will launch the editor,
- * and save the modified data back to the server.
- *
- */
-class ExternalEdit extends ContextSource {
-
- /**
- * Array of URLs to link to
- * @var Array
- */
- private $urls;
-
- /**
- * Constructor
- * @param $context IContextSource context to use
- * @param $urls array
- */
- public function __construct( IContextSource $context, array $urls = array() ) {
- $this->setContext( $context );
- $this->urls = $urls;
- }
-
- /**
- * Check whether external edit or diff should be used.
- *
- * @param $context IContextSource context to use
- * @param string $type can be either 'edit' or 'diff'
- * @return Bool
- */
- public static function useExternalEngine( IContextSource $context, $type ) {
- global $wgUseExternalEditor;
-
- if ( !$wgUseExternalEditor ) {
- return false;
- }
-
- $pref = $type == 'diff' ? 'externaldiff' : 'externaleditor';
- $request = $context->getRequest();
-
- return !$request->getVal( 'internaledit' ) &&
- ( $context->getUser()->getOption( $pref ) || $request->getVal( 'externaledit' ) );
- }
-
- /**
- * Output the information for the external editor
- */
- public function execute() {
- global $wgContLang, $wgScript, $wgScriptPath, $wgCanonicalServer;
-
- $this->getOutput()->disable();
-
- $response = $this->getRequest()->response();
- $response->header( 'Content-type: application/x-external-editor; charset=utf-8' );
- $response->header( 'Cache-control: no-cache' );
-
- $special = $wgContLang->getNsText( NS_SPECIAL );
-
- # $type can be "Edit text", "Edit file" or "Diff text" at the moment
- # See the protocol specifications at [[m:Help:External editors/Tech]] for
- # details.
- if ( count( $this->urls ) ) {
- $urls = $this->urls;
- $type = "Diff text";
- } elseif ( $this->getRequest()->getVal( 'mode' ) == 'file' ) {
- $type = "Edit file";
- $image = wfLocalFile( $this->getTitle() );
- if ( $image ) {
- $urls = array(
- 'File' => array(
- 'Extension' => $image->getExtension(),
- 'URL' => $image->getCanonicalURL()
- )
- );
- } else {
- $urls = array();
- }
- } else {
- $type = "Edit text";
- # *.wiki file extension is used by some editors for syntax
- # highlighting, so we follow that convention
- $urls = array( 'File' => array(
- 'Extension' => 'wiki',
- 'URL' => $this->getTitle()->getCanonicalURL(
- array( 'action' => 'edit', 'internaledit' => 'true' ) )
- ) );
- }
-
- $files = '';
- foreach( $urls as $key => $vars ) {
- $files .= "\n[$key]\n";
- foreach( $vars as $varname => $varval ) {
- $files .= "$varname=$varval\n";
- }
- }
-
- $url = $this->getTitle()->getFullURL(
- $this->getRequest()->appendQueryValue( 'internaledit', 1, true ) );
-
- $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
-Script={$wgCanonicalServer}{$wgScript}
-Server={$wgCanonicalServer}
-Path={$wgScriptPath}
-Special namespace=$special
-$files
-CONTROL;
- echo $control;
- }
-}
diff --git a/includes/ExternalUser.php b/includes/ExternalUser.php
deleted file mode 100644
index 580b9896..00000000
--- a/includes/ExternalUser.php
+++ /dev/null
@@ -1,309 +0,0 @@
-<?php
-/**
- * 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
- *
- * @file
- */
-
-/**
- * @defgroup ExternalUser ExternalUser
- */
-
-/**
- * A class intended to supplement, and perhaps eventually replace, AuthPlugin.
- * See: http://www.mediawiki.org/wiki/ExternalAuth
- *
- * The class represents a user whose data is in a foreign database. The
- * database may have entirely different conventions from MediaWiki, but it's
- * assumed to at least support the concept of a user id (possibly not an
- * integer), a user name (possibly not meeting MediaWiki's username
- * requirements), and a password.
- *
- * @ingroup ExternalUser
- */
-abstract class ExternalUser {
- protected function __construct() {}
-
- /**
- * Wrappers around initFrom*().
- */
-
- /**
- * @param $name string
- * @return mixed ExternalUser, or false on failure
- */
- public static function newFromName( $name ) {
- global $wgExternalAuthType;
- if ( is_null( $wgExternalAuthType ) ) {
- return false;
- }
- $obj = new $wgExternalAuthType;
- if ( !$obj->initFromName( $name ) ) {
- return false;
- }
- return $obj;
- }
-
- /**
- * @param $id string
- * @return mixed ExternalUser, or false on failure
- */
- public static function newFromId( $id ) {
- global $wgExternalAuthType;
- if ( is_null( $wgExternalAuthType ) ) {
- return false;
- }
- $obj = new $wgExternalAuthType;
- if ( !$obj->initFromId( $id ) ) {
- return false;
- }
- return $obj;
- }
-
- /**
- * @return mixed ExternalUser, or false on failure
- */
- public static function newFromCookie() {
- global $wgExternalAuthType;
- if ( is_null( $wgExternalAuthType ) ) {
- return false;
- }
- $obj = new $wgExternalAuthType;
- if ( !$obj->initFromCookie() ) {
- return false;
- }
- return $obj;
- }
-
- /**
- * Creates the object corresponding to the given User object, assuming the
- * user exists on the wiki and is linked to an external account. If either
- * of these is false, this will return false.
- *
- * This is a wrapper around newFromId().
- *
- * @param $user User
- * @return ExternalUser|bool False on failure
- */
- public static function newFromUser( $user ) {
- global $wgExternalAuthType;
- if ( is_null( $wgExternalAuthType ) ) {
- # Short-circuit to avoid database query in common case so no one
- # kills me
- return false;
- }
-
- $dbr = wfGetDB( DB_SLAVE );
- $id = $dbr->selectField( 'external_user', 'eu_external_id',
- array( 'eu_local_id' => $user->getId() ), __METHOD__ );
- if ( $id === false ) {
- return false;
- }
- return self::newFromId( $id );
- }
-
- /**
- * Given a name, which is a string exactly as input by the user in the
- * login form but with whitespace stripped, initialize this object to be
- * the corresponding ExternalUser. Return true if successful, otherwise
- * false.
- *
- * @param $name string
- * @return bool Success?
- */
- abstract protected function initFromName( $name );
-
- /**
- * Given an id, which was at some previous point in history returned by
- * getId(), initialize this object to be the corresponding ExternalUser.
- * Return true if successful, false otherwise.
- *
- * @param $id string
- * @return bool Success?
- */
- abstract protected function initFromId( $id );
-
- /**
- * Try to magically initialize the user from cookies or similar information
- * so he or she can be logged in on just viewing the wiki. If this is
- * impossible to do, just return false.
- *
- * TODO: Actually use this.
- *
- * @return bool Success?
- */
- protected function initFromCookie() {
- return false;
- }
-
- /**
- * This must return some identifier that stably, uniquely identifies the
- * user. In a typical web application, this could be an integer
- * representing the "user id". In other cases, it might be a string. In
- * any event, the return value should be a string between 1 and 255
- * characters in length; must uniquely identify the user in the foreign
- * database; and, if at all possible, should be permanent.
- *
- * This will only ever be used to reconstruct this ExternalUser object via
- * newFromId(). The resulting object in that case should correspond to the
- * same user, even if details have changed in the interim (e.g., renames or
- * preference changes).
- *
- * @return string
- */
- abstract public function getId();
-
- /**
- * This must return the name that the user would normally use for login to
- * the external database. It is subject to no particular restrictions
- * beyond rudimentary sanity, and in particular may be invalid as a
- * MediaWiki username. It's used to auto-generate an account name that
- * *is* valid for MediaWiki, either with or without user input, but
- * basically is only a hint.
- *
- * @return string
- */
- abstract public function getName();
-
- /**
- * Is the given password valid for the external user? The password is
- * provided in plaintext.
- *
- * @param $password string
- * @return bool
- */
- abstract public function authenticate( $password );
-
- /**
- * Retrieve the value corresponding to the given preference key. The most
- * important values are:
- *
- * - emailaddress
- * - language
- *
- * The value must meet MediaWiki's requirements for values of this type,
- * and will be checked for validity before use. If the preference makes no
- * sense for the backend, or it makes sense but is unset for this user, or
- * is unrecognized, return null.
- *
- * $pref will never equal 'password', since passwords are usually hashed
- * and cannot be directly retrieved. authenticate() is used for this
- * instead.
- *
- * TODO: Currently this is only called for 'emailaddress'; generalize! Add
- * some config option to decide which values are grabbed on user
- * initialization.
- *
- * @param $pref string
- * @return mixed
- */
- public function getPref( $pref ) {
- return null;
- }
-
- /**
- * Return an array of identifiers for all the foreign groups that this user
- * has. The identifiers are opaque objects that only need to be
- * specifiable by the administrator in LocalSettings.php when configuring
- * $wgAutopromote. They may be, for instance, strings or integers.
- *
- * TODO: Support this in $wgAutopromote.
- *
- * @return array
- */
- public function getGroups() {
- return array();
- }
-
- /**
- * Given a preference key (e.g., 'emailaddress'), provide an HTML message
- * telling the user how to change it in the external database. The
- * administrator has specified that this preference cannot be changed on
- * the wiki, and may only be changed in the foreign database. If no
- * message is available, such as for an unrecognized preference, return
- * false.
- *
- * TODO: Use this somewhere.
- *
- * @param $pref string
- * @return mixed String or false
- */
- public static function getPrefMessage( $pref ) {
- return false;
- }
-
- /**
- * Set the given preference key to the given value. Two important
- * preference keys that you might want to implement are 'password' and
- * 'emailaddress'. If the set fails, such as because the preference is
- * unrecognized or because the external database can't be changed right
- * now, return false. If it succeeds, return true.
- *
- * If applicable, you should make sure to validate the new value against
- * any constraints the external database may have, since MediaWiki may have
- * more limited constraints (e.g., on password strength).
- *
- * TODO: Untested.
- *
- * @param $key string
- * @param $value string
- * @return bool Success?
- */
- public static function setPref( $key, $value ) {
- return false;
- }
-
- /**
- * Create a link for future reference between this object and the provided
- * user_id. If the user was already linked, the old link will be
- * overwritten.
- *
- * This is part of the core code and is not overridable by specific
- * plugins. It's in this class only for convenience.
- *
- * @param int $id user_id
- */
- final public function linkToLocal( $id ) {
- $dbw = wfGetDB( DB_MASTER );
- $dbw->replace( 'external_user',
- array( 'eu_local_id', 'eu_external_id' ),
- array( 'eu_local_id' => $id,
- 'eu_external_id' => $this->getId() ),
- __METHOD__ );
- }
-
- /**
- * Check whether this external user id is already linked with
- * a local user.
- * @return Mixed User if the account is linked, Null otherwise.
- */
- final public function getLocalUser() {
- $dbr = wfGetDB( DB_SLAVE );
- $row = $dbr->selectRow(
- 'external_user',
- '*',
- array( 'eu_external_id' => $this->getId() )
- );
- return $row
- ? User::newFromId( $row->eu_local_id )
- : null;
- }
-
-}
diff --git a/includes/Fallback.php b/includes/Fallback.php
index 2e19a095..cdf6c88e 100644
--- a/includes/Fallback.php
+++ b/includes/Fallback.php
@@ -35,13 +35,13 @@ class Fallback {
if ( substr( $to, -8 ) == '//IGNORE' ) {
$to = substr( $to, 0, strlen( $to ) - 8 );
}
- if( strcasecmp( $from, $to ) == 0 ) {
+ if ( strcasecmp( $from, $to ) == 0 ) {
return $string;
}
- if( strcasecmp( $from, 'utf-8' ) == 0 ) {
+ if ( strcasecmp( $from, 'utf-8' ) == 0 ) {
return utf8_decode( $string );
}
- if( strcasecmp( $to, 'utf-8' ) == 0 ) {
+ if ( strcasecmp( $to, 'utf-8' ) == 0 ) {
return utf8_encode( $string );
}
return $string;
@@ -64,12 +64,12 @@ class Fallback {
* @return string
*/
public static function mb_substr( $str, $start, $count = 'end' ) {
- if( $start != 0 ) {
+ if ( $start != 0 ) {
$split = self::mb_substr_split_unicode( $str, intval( $start ) );
$str = substr( $str, $split );
}
- if( $count !== 'end' ) {
+ if ( $count !== 'end' ) {
$split = self::mb_substr_split_unicode( $str, intval( $count ) );
$str = substr( $str, 0, $split );
}
@@ -83,14 +83,14 @@ class Fallback {
* @return int
*/
public static function mb_substr_split_unicode( $str, $splitPos ) {
- if( $splitPos == 0 ) {
+ if ( $splitPos == 0 ) {
return 0;
}
$byteLen = strlen( $str );
- if( $splitPos > 0 ) {
- if( $splitPos > 256 ) {
+ 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.
@@ -104,7 +104,7 @@ class Fallback {
$bytePos = 0;
}
- while( $charPos++ < $splitPos ) {
+ while ( $charPos++ < $splitPos ) {
++$bytePos;
// Move past any tail bytes
while ( $bytePos < $byteLen && $str[$bytePos] >= "\x80" && $str[$bytePos] < "\xc0" ) {
@@ -115,7 +115,7 @@ class Fallback {
$splitPosX = $splitPos + 1;
$charPos = 0; // relative to end of string; we don't care about the actual char position here
$bytePos = $byteLen;
- while( $bytePos > 0 && $charPos-- >= $splitPosX ) {
+ while ( $bytePos > 0 && $charPos-- >= $splitPosX ) {
--$bytePos;
// Move past any tail bytes
while ( $bytePos > 0 && $str[$bytePos] >= "\x80" && $str[$bytePos] < "\xc0" ) {
@@ -138,12 +138,12 @@ class Fallback {
$total = 0;
// Count ASCII bytes
- for( $i = 0; $i < 0x80; $i++ ) {
+ for ( $i = 0; $i < 0x80; $i++ ) {
$total += $counts[$i];
}
// Count multibyte sequence heads
- for( $i = 0xc0; $i < 0xff; $i++ ) {
+ for ( $i = 0xc0; $i < 0xff; $i++ ) {
$total += $counts[$i];
}
return $total;
@@ -163,7 +163,7 @@ class Fallback {
$ar = array();
preg_match( '/' . $needle . '/u', $haystack, $ar, PREG_OFFSET_CAPTURE, $offset );
- if( isset( $ar[0][1] ) ) {
+ if ( isset( $ar[0][1] ) ) {
return $ar[0][1];
} else {
return false;
@@ -184,7 +184,7 @@ class Fallback {
$ar = array();
preg_match_all( '/' . $needle . '/u', $haystack, $ar, PREG_OFFSET_CAPTURE, $offset );
- if( isset( $ar[0] ) && count( $ar[0] ) > 0 &&
+ 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 {
diff --git a/includes/Feed.php b/includes/Feed.php
index caf2e571..635b04e4 100644
--- a/includes/Feed.php
+++ b/includes/Feed.php
@@ -245,7 +245,7 @@ abstract class ChannelFeed extends FeedItem {
global $wgRequest;
$ctype = $wgRequest->getVal( 'ctype', 'application/xml' );
$allowedctypes = array( 'application/xml', 'text/xml', 'application/rss+xml', 'application/atom+xml' );
- return (in_array( $ctype, $allowedctypes ) ? $ctype : 'application/xml');
+ return ( in_array( $ctype, $allowedctypes ) ? $ctype : 'application/xml' );
}
/**
@@ -306,13 +306,13 @@ class RSSFeed extends ChannelFeed {
function outItem( $item ) {
?>
<item>
- <title><?php print $item->getTitle() ?></title>
- <link><?php print wfExpandUrl( $item->getUrl(), PROTO_CURRENT ) ?></link>
- <guid<?php if( !$item->rssIsPermalink ) print ' isPermaLink="false"' ?>><?php print $item->getUniqueId() ?></guid>
+ <title><?php print $item->getTitle(); ?></title>
+ <link><?php print wfExpandUrl( $item->getUrl(), PROTO_CURRENT ); ?></link>
+ <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 }?>
- <?php if( $item->getComments() ) { ?><comments><?php print wfExpandUrl( $item->getComments(), PROTO_CURRENT ) ?></comments><?php }?>
+ <?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 }?>
+ <?php if ( $item->getComments() ) { ?><comments><?php print wfExpandUrl( $item->getComments(), PROTO_CURRENT ); ?></comments><?php }?>
</item>
<?php
}
@@ -392,15 +392,15 @@ class AtomFeed extends ChannelFeed {
global $wgMimeType;
?>
<entry>
- <id><?php print $item->getUniqueId() ?></id>
- <title><?php print $item->getTitle() ?></title>
- <link rel="alternate" type="<?php print $wgMimeType ?>" href="<?php print wfExpandUrl( $item->getUrl(), PROTO_CURRENT ) ?>"/>
- <?php if( $item->getDate() ) { ?>
- <updated><?php print $this->formatTime( $item->getDate() ) ?>Z</updated>
+ <id><?php print $item->getUniqueId(); ?></id>
+ <title><?php print $item->getTitle(); ?></title>
+ <link rel="alternate" type="<?php print $wgMimeType ?>" href="<?php print wfExpandUrl( $item->getUrl(), PROTO_CURRENT ); ?>"/>
+ <?php if ( $item->getDate() ) { ?>
+ <updated><?php print $this->formatTime( $item->getDate() ); ?>Z</updated>
<?php } ?>
<summary type="html"><?php print $item->getDescription() ?></summary>
- <?php if( $item->getAuthor() ) { ?><author><name><?php print $item->getAuthor() ?></name></author><?php }?>
+ <?php if ( $item->getAuthor() ) { ?><author><name><?php print $item->getAuthor(); ?></name></author><?php }?>
</entry>
<?php /* @todo FIXME: Need to add comments
diff --git a/includes/FeedUtils.php b/includes/FeedUtils.php
index adc1f781..22cb52be 100644
--- a/includes/FeedUtils.php
+++ b/includes/FeedUtils.php
@@ -59,7 +59,7 @@ class FeedUtils {
return false;
}
- if( !isset( $wgFeedClasses[$type] ) ) {
+ if ( !isset( $wgFeedClasses[$type] ) ) {
$wgOut->addWikiMsg( 'feed-invalid' );
return false;
}
@@ -77,14 +77,14 @@ class FeedUtils {
$titleObj = Title::makeTitle( $row->rc_namespace, $row->rc_title );
$timestamp = wfTimestamp( TS_MW, $row->rc_timestamp );
$actiontext = '';
- if( $row->rc_type == RC_LOG ) {
+ if ( $row->rc_type == RC_LOG ) {
$rcRow = (array)$row; // newFromRow() only accepts arrays for RC rows
$actiontext = LogFormatter::newFromRow( $rcRow )->getActionText();
}
return self::formatDiffRow( $titleObj,
$row->rc_last_oldid, $row->rc_this_oldid,
$timestamp,
- ($row->rc_deleted & Revision::DELETED_COMMENT)
+ $row->rc_deleted & Revision::DELETED_COMMENT
? wfMessage( 'rev-deleted-comment' )->escaped()
: $row->rc_comment,
$actiontext
@@ -121,13 +121,13 @@ class FeedUtils {
// Can't diff special pages, unreadable pages or pages with no new revision
// to compare against: just return the text.
- if( $title->getNamespace() < 0 || $accErrors || !$newid ) {
+ if ( $title->getNamespace() < 0 || $accErrors || !$newid ) {
wfProfileOut( __METHOD__ );
return $completeText;
}
- if( $oldid ) {
- wfProfileIn( __METHOD__."-dodiff" );
+ if ( $oldid ) {
+ wfProfileIn( __METHOD__ . "-dodiff" );
#$diffText = $de->getDiff( wfMessage( 'revisionasof',
# $wgLang->timeanddate( $timestamp ),
@@ -168,10 +168,10 @@ class FeedUtils {
$diffText = UtfNormal::cleanUp( $diffText );
$diffText = self::applyDiffStyle( $diffText );
}
- wfProfileOut( __METHOD__."-dodiff" );
+ wfProfileOut( __METHOD__ . "-dodiff" );
} else {
$rev = Revision::newFromId( $newid );
- if( $wgFeedDiffCutoff <= 0 || is_null( $rev ) ) {
+ if ( $wgFeedDiffCutoff <= 0 || is_null( $rev ) ) {
$newContent = ContentHandler::getForTitle( $title )->makeEmptyContent();
} else {
$newContent = $rev->getContent();
@@ -220,10 +220,11 @@ class FeedUtils {
* @return string
*/
protected static function getDiffLink( Title $title, $newid, $oldid = null ) {
- $queryParameters = ($oldid == null)
- ? "diff={$newid}"
- : "diff={$newid}&oldid={$oldid}";
- $diffUrl = $title->getFullUrl( $queryParameters );
+ $queryParameters = array( 'diff' => $newid );
+ if ( $oldid != null ) {
+ $queryParameters['oldid'] = $oldid;
+ }
+ $diffUrl = $title->getFullURL( $queryParameters );
$diffLink = Html::element( 'a', array( 'href' => $diffUrl ),
wfMessage( 'showdiff' )->inContentLanguage()->text() );
@@ -250,7 +251,7 @@ class FeedUtils {
'diffchange' => 'font-weight: bold; text-decoration: none;',
);
- foreach( $styles as $class => $style ) {
+ foreach ( $styles as $class => $style ) {
$text = preg_replace( "/(<[^>]+)class=(['\"])$class\\2([^>]*>)/",
"\\1style=\"$style\"\\3", $text );
}
diff --git a/includes/FileDeleteForm.php b/includes/FileDeleteForm.php
index 28403cca..65d82b87 100644
--- a/includes/FileDeleteForm.php
+++ b/includes/FileDeleteForm.php
@@ -82,18 +82,18 @@ class FileDeleteForm {
# Flag to hide all contents of the archived revisions
$suppress = $wgRequest->getVal( 'wpSuppress' ) && $wgUser->isAllowed( 'suppressrevision' );
- if( $this->oldimage ) {
+ if ( $this->oldimage ) {
$this->oldfile = RepoGroup::singleton()->getLocalRepo()->newFromArchiveName( $this->title, $this->oldimage );
}
- if( !self::haveDeletableFile( $this->file, $this->oldfile, $this->oldimage ) ) {
+ if ( !self::haveDeletableFile( $this->file, $this->oldfile, $this->oldimage ) ) {
$wgOut->addHTML( $this->prepareMessage( 'filedelete-nofile' ) );
$wgOut->addReturnTo( $this->title );
return;
}
// Perform the deletion if appropriate
- if( $wgRequest->wasPosted() && $wgUser->matchEditToken( $token, $this->oldimage ) ) {
+ if ( $wgRequest->wasPosted() && $wgUser->matchEditToken( $token, $this->oldimage ) ) {
$deleteReasonList = $wgRequest->getText( 'wpDeleteReasonList' );
$deleteReason = $wgRequest->getText( 'wpReason' );
@@ -109,24 +109,18 @@ class FileDeleteForm {
$status = self::doDelete( $this->title, $this->file, $this->oldimage, $reason, $suppress, $wgUser );
- if( !$status->isGood() ) {
+ if ( !$status->isGood() ) {
$wgOut->addHTML( '<h2>' . $this->prepareMessage( 'filedeleteerror-short' ) . "</h2>\n" );
$wgOut->addWikiText( '<div class="error">' . $status->getWikiText( 'filedeleteerror-short', 'filedeleteerror-long' ) . '</div>' );
}
- if( $status->ok ) {
+ if ( $status->ok ) {
$wgOut->setPageTitle( wfMessage( 'actioncomplete' ) );
$wgOut->addHTML( $this->prepareMessage( 'filedelete-success' ) );
// Return to the main page if we just deleted all versions of the
// file, otherwise go back to the description page
$wgOut->addReturnTo( $this->oldimage ? $this->title : Title::newMainPage() );
- if ( $wgUser->isLoggedIn() && $wgRequest->getCheck( 'wpWatch' ) != $wgUser->isWatched( $this->title ) ) {
- if ( $wgRequest->getCheck( 'wpWatch' ) ) {
- WatchAction::doWatch( $this->title, $wgUser );
- } else {
- WatchAction::doUnwatch( $this->title, $wgUser );
- }
- }
+ WatchAction::doWatchOrUnwatch( $wgRequest->getCheck( 'wpWatch' ), $this->title, $wgUser );
}
return;
}
@@ -153,13 +147,13 @@ class FileDeleteForm {
$user = $wgUser;
}
- if( $oldimage ) {
+ if ( $oldimage ) {
$page = null;
$status = $file->deleteOld( $oldimage, $reason, $suppress );
- if( $status->ok ) {
+ if ( $status->ok ) {
// Need to do a log item
$logComment = wfMessage( 'deletedrevision', $oldimage )->inContentLanguage()->text();
- if( trim( $reason ) != '' ) {
+ if ( trim( $reason ) != '' ) {
$logComment .= wfMessage( 'colon-separator' )
->inContentLanguage()->text() . $reason;
}
@@ -187,7 +181,7 @@ class FileDeleteForm {
// or revision is missing, so check for isOK() rather than isGood()
if ( $deleteStatus->isOK() ) {
$status = $file->delete( $reason, $suppress );
- if( $status->isOK() ) {
+ if ( $status->isOK() ) {
$dbw->commit( __METHOD__ );
} else {
$dbw->rollback( __METHOD__ );
@@ -213,7 +207,7 @@ class FileDeleteForm {
private function showForm() {
global $wgOut, $wgUser, $wgRequest;
- if( $wgUser->isAllowed( 'suppressrevision' ) ) {
+ if ( $wgUser->isAllowed( 'suppressrevision' ) ) {
$suppress = "<tr id=\"wpDeleteSuppressRow\">
<td></td>
<td class='mw-input'><strong>" .
@@ -258,7 +252,7 @@ class FileDeleteForm {
"</td>
</tr>
{$suppress}";
- if( $wgUser->isLoggedIn() ) {
+ if ( $wgUser->isLoggedIn() ) {
$form .= "
<tr>
<td></td>
@@ -314,7 +308,7 @@ class FileDeleteForm {
*/
private function prepareMessage( $message ) {
global $wgLang;
- if( $this->oldimage ) {
+ if ( $this->oldimage ) {
return wfMessage(
"{$message}-old", # To ensure grep will find them: 'filedelete-intro-old', 'filedelete-nofile-old', 'filedelete-success-old'
wfEscapeWikiText( $this->title->getText() ),
@@ -375,11 +369,11 @@ class FileDeleteForm {
$q = array();
$q['action'] = 'delete';
- if( $this->oldimage ) {
+ if ( $this->oldimage ) {
$q['oldimage'] = $this->oldimage;
}
- return $this->title->getLocalUrl( $q );
+ return $this->title->getLocalURL( $q );
}
/**
diff --git a/includes/ForkController.php b/includes/ForkController.php
index 89ad9553..ced45af6 100644
--- a/includes/ForkController.php
+++ b/includes/ForkController.php
@@ -121,7 +121,9 @@ class ForkController {
if ( function_exists( 'pcntl_signal_dispatch' ) ) {
pcntl_signal_dispatch();
} else {
- declare (ticks=1) { $status = $status; }
+ declare( ticks = 1 ) {
+ $status = $status;
+ }
}
// Respond to TERM signal
if ( $this->termReceived ) {
diff --git a/includes/FormOptions.php b/includes/FormOptions.php
index 8477ed98..54822e32 100644
--- a/includes/FormOptions.php
+++ b/includes/FormOptions.php
@@ -28,7 +28,8 @@
/**
* Helper class to keep track of options when mixing links and form elements.
*
- * @todo This badly need some examples and tests :-)
+ * @todo This badly needs some examples and tests :) The usage in SpecialRecentchanges class is a
+ * good ersatz in the meantime.
*/
class FormOptions implements ArrayAccess {
/** @name Type constants
@@ -50,12 +51,26 @@ class FormOptions implements ArrayAccess {
/* @} */
/**
- * @todo Document!
+ * Map of known option names to information about them.
+ *
+ * Each value is an array with the following keys:
+ * - 'default' - the default value as passed to add()
+ * - 'value' - current value, start with null, can be set by various functions
+ * - 'consumed' - true/false, whether the option was consumed using
+ * consumeValue() or consumeValues()
+ * - 'type' - one of the type constants (but never AUTO)
*/
protected $options = array();
# Setting up
+ /**
+ * Add an option to be handled by this FormOptions instance.
+ *
+ * @param string $name Request parameter name
+ * @param mixed $default Default value when the request parameter is not present
+ * @param int $type One of the type constants (optional, defaults to AUTO)
+ */
public function add( $name, $default, $type = self::AUTO ) {
$option = array();
$option['default'] = $default;
@@ -71,20 +86,25 @@ class FormOptions implements ArrayAccess {
$this->options[$name] = $option;
}
+ /**
+ * Remove an option being handled by this FormOptions instance. This is the inverse of add().
+ *
+ * @param string $name Request parameter name
+ */
public function delete( $name ) {
$this->validateName( $name, true );
unset( $this->options[$name] );
}
/**
- * Used to find out which type the data is.
- * All types are defined in the 'Type constants' section of this class
- * Please note we do not support detection of INTNULL MediaWiki type
- * which will be assumed as INT if the data is an integer.
+ * Used to find out which type the data is. All types are defined in the 'Type constants' section
+ * of this class.
*
- * @param $data Mixed: value to guess type for
- * @throws MWException
- * @exception MWException Unsupported datatype
+ * Detection of the INTNULL type is not supported; INT will be assumed if the data is an integer,
+ * MWException will be thrown if it's null.
+ *
+ * @param mixed $data Value to guess the type for
+ * @throws MWException If unable to guess the type
* @return int Type constant
*/
public static function guessType( $data ) {
@@ -102,12 +122,12 @@ class FormOptions implements ArrayAccess {
# Handling values
/**
- * Verify the given option name exist.
+ * Verify that the given option name exists.
*
- * @param string $name option name
- * @param $strict Boolean: throw an exception when the option does not exist (default false)
+ * @param string $name Option name
+ * @param bool $strict Throw an exception when the option doesn't exist instead of returning false
* @throws MWException
- * @return Boolean: true if option exist, false otherwise
+ * @return bool True if the option exists, false otherwise
*/
public function validateName( $name, $strict = false ) {
if ( !isset( $this->options[$name] ) ) {
@@ -117,16 +137,17 @@ class FormOptions implements ArrayAccess {
return false;
}
}
+
return true;
}
/**
* Use to set the value of an option.
*
- * @param string $name option name
- * @param $value Mixed: value for the option
- * @param $force Boolean: whether to set the value when it is equivalent to the default value for this option (default false).
- * @return null
+ * @param string $name Option name
+ * @param mixed $value Value for the option
+ * @param bool $force Whether to set the value when it is equivalent to the default value for this
+ * option (default false).
*/
public function setValue( $name, $value, $force = false ) {
$this->validateName( $name, true );
@@ -140,11 +161,10 @@ class FormOptions implements ArrayAccess {
}
/**
- * Get the value for the given option name.
- * Internally use getValueReal()
+ * Get the value for the given option name. Uses getValueReal() internally.
*
- * @param string $name option name
- * @return Mixed
+ * @param string $name Option name
+ * @return mixed
*/
public function getValue( $name ) {
$this->validateName( $name, true );
@@ -153,9 +173,10 @@ class FormOptions implements ArrayAccess {
}
/**
- * @todo Document
- * @param array $option array structure describing the option
- * @return Mixed. Value or the default value if it is null
+ * Return current option value, based on a structure taken from $options.
+ *
+ * @param array $option Array structure describing the option
+ * @return mixed Value, or the default value if it is null
*/
protected function getValueReal( $option ) {
if ( $option['value'] !== null ) {
@@ -167,9 +188,8 @@ class FormOptions implements ArrayAccess {
/**
* Delete the option value.
- * This will make future calls to getValue() return the default value.
- * @param string $name option name
- * @return null
+ * This will make future calls to getValue() return the default value.
+ * @param string $name Option name
*/
public function reset( $name ) {
$this->validateName( $name, true );
@@ -177,10 +197,13 @@ class FormOptions implements ArrayAccess {
}
/**
- * @todo Document
+ * Get the value of given option and mark it as 'consumed'. Consumed options are not returned
+ * by getUnconsumedValues().
+ *
+ * @see consumeValues()
+ * @throws MWException If the option does not exist
* @param string $name Option name
- * @throws MWException If option does not exist.
- * @return mixed Value or the default value if it is null.
+ * @return mixed Value, or the default value if it is null
*/
public function consumeValue( $name ) {
$this->validateName( $name, true );
@@ -190,11 +213,15 @@ class FormOptions implements ArrayAccess {
}
/**
- * @todo Document
- * @param array $names array of option names
- * @return null
+ * Get the values of given options and mark them as 'consumed'. Consumed options are not returned
+ * by getUnconsumedValues().
+ *
+ * @see consumeValue()
+ * @throws MWException If any option does not exist
+ * @param array $names Array of option names as strings
+ * @return array Array of option values, or the default values if they are null
*/
- public function consumeValues( /*Array*/ $names ) {
+ public function consumeValues( $names ) {
$out = array();
foreach ( $names as $name ) {
@@ -213,9 +240,7 @@ class FormOptions implements ArrayAccess {
* @param string $name option name
* @param int $min minimum value
* @param int $max maximum value
- * @throws MWException
- * @exception MWException Option is not of type int
- * @return null
+ * @throws MWException If option is not of type INT
*/
public function validateIntBounds( $name, $min, $max ) {
$this->validateName( $name, true );
@@ -231,9 +256,10 @@ class FormOptions implements ArrayAccess {
}
/**
- * Getting the data out for use
- * @param $all Boolean: whether to include unchanged options (default: false)
- * @return Array
+ * Get all remaining values which have not been consumed by consumeValue() or consumeValues().
+ *
+ * @param bool $all Whether to include unchanged options (default: false)
+ * @return array
*/
public function getUnconsumedValues( $all = false ) {
$values = array();
@@ -251,7 +277,7 @@ class FormOptions implements ArrayAccess {
/**
* Return options modified as an array ( name => value )
- * @return Array
+ * @return array
*/
public function getChangedValues() {
$values = array();
@@ -266,8 +292,8 @@ class FormOptions implements ArrayAccess {
}
/**
- * Format options to an array ( name => value)
- * @return Array
+ * Format options to an array ( name => value )
+ * @return array
*/
public function getAllValues() {
$values = array();
@@ -281,24 +307,38 @@ class FormOptions implements ArrayAccess {
# Reading values
- public function fetchValuesFromRequest( WebRequest $r, $values = false ) {
- if ( !$values ) {
- $values = array_keys( $this->options );
+ /**
+ * Fetch values for all options (or selected options) from the given WebRequest, making them
+ * available for accessing with getValue() or consumeValue() etc.
+ *
+ * @param WebRequest $r The request to fetch values from
+ * @param array $optionKeys Which options to fetch the values for (default:
+ * all of them). Note that passing an empty array will also result in
+ * values for all keys being fetched.
+ * @throws MWException If the type of any option is invalid
+ */
+ public function fetchValuesFromRequest( WebRequest $r, $optionKeys = null ) {
+ if ( !$optionKeys ) {
+ $optionKeys = array_keys( $this->options );
}
- foreach ( $values as $name ) {
+ foreach ( $optionKeys as $name ) {
$default = $this->options[$name]['default'];
$type = $this->options[$name]['type'];
- switch( $type ) {
+ switch ( $type ) {
case self::BOOL:
- $value = $r->getBool( $name, $default ); break;
+ $value = $r->getBool( $name, $default );
+ break;
case self::INT:
- $value = $r->getInt( $name, $default ); break;
+ $value = $r->getInt( $name, $default );
+ break;
case self::STRING:
- $value = $r->getText( $name, $default ); break;
+ $value = $r->getText( $name, $default );
+ break;
case self::INTNULL:
- $value = $r->getIntOrNull( $name ); break;
+ $value = $r->getIntOrNull( $name );
+ break;
default:
throw new MWException( 'Unsupported datatype' );
}
@@ -310,29 +350,26 @@ class FormOptions implements ArrayAccess {
}
/** @name ArrayAccess functions
- * Those function implements PHP ArrayAccess interface
+ * These functions implement the ArrayAccess PHP interface.
* @see http://php.net/manual/en/class.arrayaccess.php
*/
/* @{ */
- /**
- * Whether option exist
- * @return bool
- */
+ /** Whether the option exists. */
public function offsetExists( $name ) {
return isset( $this->options[$name] );
}
- /**
- * Retrieve an option value
- * @return Mixed
- */
+
+ /** Retrieve an option value. */
public function offsetGet( $name ) {
return $this->getValue( $name );
}
- /** Set an option to given value */
+
+ /** Set an option to given value. */
public function offsetSet( $name, $value ) {
$this->setValue( $name, $value );
}
- /** Delete the option */
+
+ /** Delete the option. */
public function offsetUnset( $name ) {
$this->delete( $name );
}
diff --git a/includes/GitInfo.php b/includes/GitInfo.php
index 6f7f8020..f49f9be1 100644
--- a/includes/GitInfo.php
+++ b/includes/GitInfo.php
@@ -121,6 +121,32 @@ class GitInfo {
}
/**
+ * Return the commit date of HEAD entry of the git code repository
+ *
+ * @since 1.22
+ * @return int|bool Commit date (UNIX timestamp) or false
+ */
+ public function getHeadCommitDate() {
+ global $wgGitBin;
+
+ if ( !is_file( $wgGitBin ) || !is_executable( $wgGitBin ) ) {
+ return false;
+ }
+
+ $environment = array( "GIT_DIR" => $this->basedir );
+ $cmd = wfEscapeShellArg( $wgGitBin ) . " show -s --format=format:%ct HEAD";
+ $retc = false;
+ $commitDate = wfShellExec( $cmd, $retc, $environment );
+
+ if ( $retc !== 0 ) {
+ return false;
+ } else {
+ return (int)$commitDate;
+ }
+
+ }
+
+ /**
* Return the name of the current branch, or HEAD if not found
* @return string The branch name, HEAD, or false
*/
@@ -136,7 +162,7 @@ class GitInfo {
/**
* Get an URL to a web viewer link to the HEAD revision.
*
- * @return string|bool string if an URL is available or false otherwise.
+ * @return string|bool string if a URL is available or false otherwise.
*/
public function getHeadViewUrl() {
$config = "{$this->basedir}/config";
@@ -151,7 +177,7 @@ class GitInfo {
if ( isset( $configArray['remote origin'] ) ) {
$remote = $configArray['remote origin'];
} else {
- foreach( $configArray as $sectionName => $sectionConf ) {
+ foreach ( $configArray as $sectionName => $sectionConf ) {
if ( substr( $sectionName, 0, 6 ) == 'remote' ) {
$remote = $sectionConf;
}
@@ -166,14 +192,15 @@ class GitInfo {
if ( substr( $url, -4 ) !== '.git' ) {
$url .= '.git';
}
- foreach( self::getViewers() as $repo => $viewer ) {
+ foreach ( self::getViewers() as $repo => $viewer ) {
$pattern = '#^' . $repo . '$#';
- if ( preg_match( $pattern, $url ) ) {
+ if ( preg_match( $pattern, $url, $matches ) ) {
$viewerUrl = preg_replace( $pattern, $viewer, $url );
$headSHA1 = $this->getHeadSHA1();
$replacements = array(
'%h' => substr( $headSHA1, 0, 7 ),
- '%H' => $headSHA1
+ '%H' => $headSHA1,
+ '%r' => urlencode( $matches[1] ),
);
return strtr( $viewerUrl, $replacements );
}
@@ -212,7 +239,7 @@ class GitInfo {
protected static function getViewers() {
global $wgGitRepositoryViewers;
- if( self::$viewers === false ) {
+ if ( self::$viewers === false ) {
self::$viewers = $wgGitRepositoryViewers;
wfRunHooks( 'GitViewers', array( &self::$viewers ) );
}
diff --git a/includes/GlobalFunctions.php b/includes/GlobalFunctions.php
index 016736f4..77c09e53 100644
--- a/includes/GlobalFunctions.php
+++ b/includes/GlobalFunctions.php
@@ -35,7 +35,7 @@ if ( !defined( 'MEDIAWIKI' ) ) {
* PHP extensions may be included here.
*/
-if( !function_exists( 'iconv' ) ) {
+if ( !function_exists( 'iconv' ) ) {
/**
* @codeCoverageIgnore
* @return string
@@ -73,7 +73,7 @@ if ( !function_exists( 'mb_strlen' ) ) {
}
}
-if( !function_exists( 'mb_strpos' ) ) {
+if ( !function_exists( 'mb_strpos' ) ) {
/**
* @codeCoverageIgnore
* @return int
@@ -84,7 +84,7 @@ if( !function_exists( 'mb_strpos' ) ) {
}
-if( !function_exists( 'mb_strrpos' ) ) {
+if ( !function_exists( 'mb_strrpos' ) ) {
/**
* @codeCoverageIgnore
* @return int
@@ -94,24 +94,16 @@ if( !function_exists( 'mb_strrpos' ) ) {
}
}
-// Support for Wietse Venema's taint feature
-if ( !function_exists( 'istainted' ) ) {
+// gzdecode function only exists in PHP >= 5.4.0
+// http://php.net/gzdecode
+if ( !function_exists( 'gzdecode' ) ) {
/**
* @codeCoverageIgnore
- * @return int
+ * @return string
*/
- function istainted( $var ) {
- return 0;
+ function gzdecode( $data ) {
+ return gzinflate( substr( $data, 10, -8 ) );
}
- /** @codeCoverageIgnore */
- function taint( $var, $level = 0 ) {}
- /** @codeCoverageIgnore */
- function untaint( $var, $level = 0 ) {}
- define( 'TC_HTML', 1 );
- define( 'TC_SHELL', 1 );
- define( 'TC_MYSQL', 1 );
- define( 'TC_PCRE', 1 );
- define( 'TC_SELF', 1 );
}
/// @endcond
@@ -126,19 +118,19 @@ function wfArrayDiff2( $a, $b ) {
}
/**
- * @param $a
- * @param $b
+ * @param $a array|string
+ * @param $b array|string
* @return int
*/
function wfArrayDiff2_cmp( $a, $b ) {
- if ( !is_array( $a ) ) {
+ if ( is_string( $a ) && is_string( $b ) ) {
return strcmp( $a, $b );
} elseif ( count( $a ) !== count( $b ) ) {
return count( $a ) < count( $b ) ? -1 : 1;
} else {
reset( $a );
reset( $b );
- while( ( list( , $valueA ) = each( $a ) ) && ( list( , $valueB ) = each( $b ) ) ) {
+ while ( ( list( , $valueA ) = each( $a ) ) && ( list( , $valueB ) = each( $b ) ) ) {
$cmp = strcmp( $valueA, $valueB );
if ( $cmp !== 0 ) {
return $cmp;
@@ -150,14 +142,16 @@ function wfArrayDiff2_cmp( $a, $b ) {
/**
* Array lookup
- * Returns an array where the values in the first array are replaced by the
- * values in the second array with the corresponding keys
+ * Returns an array where the values in array $b are replaced by the
+ * values in array $a with the corresponding keys
*
+ * @deprecated since 1.22; use array_intersect_key()
* @param $a Array
* @param $b Array
* @return array
*/
function wfArrayLookup( $a, $b ) {
+ wfDeprecated( __FUNCTION__, '1.22' );
return array_flip( array_intersect( array_flip( $a ), array_keys( $b ) ) );
}
@@ -183,11 +177,13 @@ function wfAppendToArrayIfNotDefault( $key, $value, $default, &$changed ) {
* Backwards array plus for people who haven't bothered to read the PHP manual
* XXX: will not darn your socks for you.
*
+ * @deprecated since 1.22; use array_replace()
* @param $array1 Array
* @param [$array2, [...]] Arrays
* @return Array
*/
function wfArrayMerge( $array1/* ... */ ) {
+ wfDeprecated( __FUNCTION__, '1.22' );
$args = func_get_args();
$args = array_reverse( $args, true );
$out = array();
@@ -262,7 +258,7 @@ function wfArrayInsertAfter( array $array, array $insert, $after ) {
*/
function wfObjectToArray( $objOrArray, $recursive = true ) {
$array = array();
- if( is_object( $objOrArray ) ) {
+ if ( is_object( $objOrArray ) ) {
$objOrArray = get_object_vars( $objOrArray );
}
foreach ( $objOrArray as $key => $value ) {
@@ -277,24 +273,6 @@ function wfObjectToArray( $objOrArray, $recursive = true ) {
}
/**
- * Wrapper around array_map() which also taints variables
- *
- * @param $function Callback
- * @param $input Array
- * @return Array
- */
-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;
-}
-
-/**
* Get a random decimal value between 0 and 1, in a way
* not likely to give duplicate values for any realistic
* number of articles.
@@ -322,8 +300,8 @@ function wfRandom() {
*/
function wfRandomString( $length = 32 ) {
$str = '';
- while ( strlen( $str ) < $length ) {
- $str .= dechex( mt_rand() );
+ for ( $n = 0; $n < $length; $n += 7 ) {
+ $str .= sprintf( '%07x', mt_rand() & 0xfffffff );
}
return substr( $str, 0, $length );
}
@@ -480,8 +458,8 @@ function wfAppendQuery( $url, $query ) {
if ( is_array( $query ) ) {
$query = wfArrayToCgi( $query );
}
- if( $query != '' ) {
- if( false === strpos( $url, '?' ) ) {
+ if ( $query != '' ) {
+ if ( false === strpos( $url, '?' ) ) {
$url .= '?';
} else {
$url .= '&';
@@ -913,10 +891,10 @@ function wfMakeUrlIndexes( $url ) {
function wfMatchesDomainList( $url, $domains ) {
$bits = wfParseUrl( $url );
if ( is_array( $bits ) && isset( $bits['host'] ) ) {
+ $host = '.' . $bits['host'];
foreach ( (array)$domains as $domain ) {
- // FIXME: This gives false positives. http://nds-nl.wikipedia.org will match nl.wikipedia.org
- // We should use something that interprets dots instead
- if ( substr( $bits['host'], -strlen( $domain ) ) === $domain ) {
+ $domain = '.' . $domain;
+ if ( substr( $host, -strlen( $domain ) ) === $domain ) {
return true;
}
}
@@ -953,14 +931,12 @@ function wfDebug( $text, $logonly = false ) {
MWDebug::debugMsg( $text );
}
- if ( wfRunHooks( 'Debug', array( $text, null /* no log group */ ) ) ) {
- if ( $wgDebugLogFile != '' && !$wgProfileOnly ) {
- # Strip unprintables; they can switch terminal modes when binary data
- # gets dumped, which is pretty annoying.
- $text = preg_replace( '![\x00-\x08\x0b\x0c\x0e-\x1f]!', ' ', $text );
- $text = $wgDebugLogPrefix . $text;
- wfErrorLog( $text, $wgDebugLogFile );
- }
+ if ( $wgDebugLogFile != '' && !$wgProfileOnly ) {
+ # Strip unprintables; they can switch terminal modes when binary data
+ # gets dumped, which is pretty annoying.
+ $text = preg_replace( '![\x00-\x08\x0b\x0c\x0e-\x1f]!', ' ', $text );
+ $text = $wgDebugLogPrefix . $text;
+ wfErrorLog( $text, $wgDebugLogFile );
}
}
@@ -1011,7 +987,7 @@ function wfDebugTimer() {
*/
function wfDebugMem( $exact = false ) {
$mem = memory_get_usage();
- if( !$exact ) {
+ if ( !$exact ) {
$mem = floor( $mem / 1024 ) . ' kilobytes';
} else {
$mem .= ' bytes';
@@ -1031,15 +1007,13 @@ function wfDebugMem( $exact = false ) {
function wfDebugLog( $logGroup, $text, $public = true ) {
global $wgDebugLogGroups;
$text = trim( $text ) . "\n";
- if( isset( $wgDebugLogGroups[$logGroup] ) ) {
+ if ( isset( $wgDebugLogGroups[$logGroup] ) ) {
$time = wfTimestamp( TS_DB );
$wiki = wfWikiID();
$host = wfHostname();
- if ( wfRunHooks( 'Debug', array( $text, $logGroup ) ) ) {
- wfErrorLog( "$time $host $wiki: $text", $wgDebugLogGroups[$logGroup] );
- }
+ wfErrorLog( "$time $host $wiki: $text", $wgDebugLogGroups[$logGroup] );
} elseif ( $public === true ) {
- wfDebug( "[$logGroup] $text", true );
+ wfDebug( "[$logGroup] $text", false );
}
}
@@ -1093,16 +1067,29 @@ function wfDeprecated( $function, $version = false, $component = false, $callerO
/**
* Send a warning either to the debug log or in a PHP error depending on
- * $wgDevelopmentWarnings
+ * $wgDevelopmentWarnings. To log warnings in production, use wfLogWarning() instead.
*
* @param string $msg message to send
* @param $callerOffset Integer: number of items to go back in the backtrace to
* find the correct caller (1 = function calling wfWarn, ...)
- * @param $level Integer: PHP error level; only used when $wgDevelopmentWarnings
- * is true
+ * @param $level Integer: PHP error level; defaults to E_USER_NOTICE;
+ * only used when $wgDevelopmentWarnings is true
*/
function wfWarn( $msg, $callerOffset = 1, $level = E_USER_NOTICE ) {
- MWDebug::warning( $msg, $callerOffset + 1, $level );
+ MWDebug::warning( $msg, $callerOffset + 1, $level, 'auto' );
+}
+
+/**
+ * Send a warning as a PHP error and the debug log. This is intended for logging
+ * warnings in production. For logging development warnings, use WfWarn instead.
+ *
+ * @param $msg String: message to send
+ * @param $callerOffset Integer: number of items to go back in the backtrace to
+ * find the correct caller (1 = function calling wfLogWarning, ...)
+ * @param $level Integer: PHP error level; defaults to E_USER_WARNING
+ */
+function wfLogWarning( $msg, $callerOffset = 1, $level = E_USER_WARNING ) {
+ MWDebug::warning( $msg, $callerOffset + 1, $level, 'production' );
}
/**
@@ -1177,6 +1164,8 @@ function wfLogProfilingData() {
global $wgRequestTime, $wgDebugLogFile, $wgDebugRawPage, $wgRequest;
global $wgProfileLimit, $wgUser;
+ StatCounter::singleton()->flush();
+
$profiler = Profiler::instance();
# Profiling must actually be enabled...
@@ -1240,84 +1229,35 @@ function wfLogProfilingData() {
* @return void
*/
function wfIncrStats( $key, $count = 1 ) {
- global $wgStatsMethod;
-
- $count = intval( $count );
- if ( $count == 0 ) {
- return;
- }
-
- if( $wgStatsMethod == 'udp' ) {
- global $wgUDPProfilerHost, $wgUDPProfilerPort, $wgAggregateStatsID;
- static $socket;
-
- $id = $wgAggregateStatsID !== false ? $wgAggregateStatsID : wfWikiID();
-
- if ( !$socket ) {
- $socket = socket_create( AF_INET, SOCK_DGRAM, SOL_UDP );
- $statline = "stats/{$id} - 1 1 1 1 1 -total\n";
- socket_sendto(
- $socket,
- $statline,
- strlen( $statline ),
- 0,
- $wgUDPProfilerHost,
- $wgUDPProfilerPort
- );
- }
- $statline = "stats/{$id} - {$count} 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 );
- if ( is_null( $wgMemc->incr( $key, $count ) ) ) {
- $wgMemc->add( $key, $count );
- }
- } else {
- // Disabled
- }
+ StatCounter::singleton()->incr( $key, $count );
}
/**
- * Check if the wiki read-only lock file is present. This can be used to lock
- * off editing functions, but doesn't guarantee that the database will not be
- * modified.
+ * Check whether the wiki is in read-only mode.
*
* @return bool
*/
function wfReadOnly() {
- global $wgReadOnlyFile, $wgReadOnly;
-
- if ( !is_null( $wgReadOnly ) ) {
- return (bool)$wgReadOnly;
- }
- if ( $wgReadOnlyFile == '' ) {
- return false;
- }
- // Set $wgReadOnly for faster access next time
- if ( is_file( $wgReadOnlyFile ) ) {
- $wgReadOnly = file_get_contents( $wgReadOnlyFile );
- } else {
- $wgReadOnly = false;
- }
- return (bool)$wgReadOnly;
+ return wfReadOnlyReason() !== false;
}
/**
- * @return bool
+ * Get the value of $wgReadOnly or the contents of $wgReadOnlyFile.
+ *
+ * @return string|bool: String when in read-only mode; false otherwise
*/
function wfReadOnlyReason() {
- global $wgReadOnly;
- wfReadOnly();
+ global $wgReadOnly, $wgReadOnlyFile;
+
+ if ( $wgReadOnly === null ) {
+ // Set $wgReadOnly for faster access next time
+ if ( is_file( $wgReadOnlyFile ) && filesize( $wgReadOnlyFile ) > 0 ) {
+ $wgReadOnly = file_get_contents( $wgReadOnlyFile );
+ } else {
+ $wgReadOnly = false;
+ }
+ }
+
return $wgReadOnly;
}
@@ -1339,27 +1279,27 @@ function wfReadOnlyReason() {
function wfGetLangObj( $langcode = false ) {
# Identify which language to get or create a language object for.
# Using is_object here due to Stub objects.
- if( is_object( $langcode ) ) {
+ if ( is_object( $langcode ) ) {
# Great, we already have the object (hopefully)!
return $langcode;
}
global $wgContLang, $wgLanguageCode;
- if( $langcode === true || $langcode === $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 === false || $langcode === $wgLang->getCode() ) {
+ 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::fetchLanguageNames() );
- if( in_array( $langcode, $validCodes ) ) {
+ if ( in_array( $langcode, $validCodes ) ) {
# $langcode corresponds to a valid language.
return Language::factory( $langcode );
}
@@ -1414,7 +1354,7 @@ function wfMessage( $key /*...*/) {
*/
function wfMessageFallback( /*...*/ ) {
$args = func_get_args();
- return MWFunction::callArray( 'Message::newFallbackSequence', $args );
+ return call_user_func_array( 'Message::newFallbackSequence', $args );
}
/**
@@ -1492,7 +1432,7 @@ function wfMsgForContent( $key ) {
$args = func_get_args();
array_shift( $args );
$forcontent = true;
- if( is_array( $wgForceUIMsgAsContentMsg ) &&
+ if ( is_array( $wgForceUIMsgAsContentMsg ) &&
in_array( $key, $wgForceUIMsgAsContentMsg ) )
{
$forcontent = false;
@@ -1515,7 +1455,7 @@ function wfMsgForContentNoTrans( $key ) {
$args = func_get_args();
array_shift( $args );
$forcontent = true;
- if( is_array( $wgForceUIMsgAsContentMsg ) &&
+ if ( is_array( $wgForceUIMsgAsContentMsg ) &&
in_array( $key, $wgForceUIMsgAsContentMsg ) )
{
$forcontent = false;
@@ -1564,7 +1504,7 @@ function wfMsgGetKey( $key, $useDB = true, $langCode = false, $transform = true
$cache = MessageCache::singleton();
$message = $cache->get( $key, $useDB, $langCode );
- if( $message === false ) {
+ if ( $message === false ) {
$message = '&lt;' . htmlspecialchars( $key ) . '&gt;';
} elseif ( $transform ) {
$message = $cache->transform( $message );
@@ -1591,7 +1531,7 @@ function wfMsgReplaceArgs( $message, $args ) {
$args = array_values( $args[0] );
}
$replacementKeys = array();
- foreach( $args as $n => $param ) {
+ foreach ( $args as $n => $param ) {
$replacementKeys['$' . ( $n + 1 )] = $param;
}
$message = strtr( $message, $replacementKeys );
@@ -1675,11 +1615,11 @@ function wfMsgExt( $key, $options ) {
array_shift( $args );
$options = (array)$options;
- foreach( $options as $arrayKey => $option ) {
- if( !preg_match( '/^[0-9]+|language$/', $arrayKey ) ) {
+ foreach ( $options as $arrayKey => $option ) {
+ if ( !preg_match( '/^[0-9]+|language$/', $arrayKey ) ) {
# An unknown index, neither numeric nor "language"
wfWarn( "wfMsgExt called with incorrect parameter key $arrayKey", 1, E_USER_WARNING );
- } elseif( preg_match( '/^[0-9]+$/', $arrayKey ) && !in_array( $option,
+ } elseif ( preg_match( '/^[0-9]+$/', $arrayKey ) && !in_array( $option,
array( 'parse', 'parseinline', 'escape', 'escapenoentities',
'replaceafter', 'parsemag', 'content' ) ) ) {
# A numeric index with unknown value
@@ -1687,11 +1627,11 @@ function wfMsgExt( $key, $options ) {
}
}
- if( in_array( 'content', $options, true ) ) {
+ if ( in_array( 'content', $options, true ) ) {
$forContent = true;
$langCode = true;
$langCodeObj = null;
- } elseif( array_key_exists( 'language', $options ) ) {
+ } elseif ( array_key_exists( 'language', $options ) ) {
$forContent = false;
$langCode = wfGetLangObj( $options['language'] );
$langCodeObj = $langCode;
@@ -1703,13 +1643,13 @@ 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 );
}
$messageCache = MessageCache::singleton();
$parseInline = in_array( 'parseinline', $options, true );
- if( in_array( 'parse', $options, true ) || $parseInline ) {
+ if ( in_array( 'parse', $options, true ) || $parseInline ) {
$string = $messageCache->parse( $string, null, true, !$forContent, $langCodeObj );
if ( $string instanceof ParserOutput ) {
$string = $string->getText();
@@ -1717,7 +1657,7 @@ function wfMsgExt( $key, $options ) {
if ( $parseInline ) {
$m = array();
- if( preg_match( '/^<p>(.*)\n?<\/p>\n?$/sU', $string, $m ) ) {
+ if ( preg_match( '/^<p>(.*)\n?<\/p>\n?$/sU', $string, $m ) ) {
$string = $m[1];
}
}
@@ -1732,7 +1672,7 @@ function wfMsgExt( $key, $options ) {
$string = Sanitizer::escapeHtmlAllowEntities( $string );
}
- if( in_array( 'replaceafter', $options, true ) ) {
+ if ( in_array( 'replaceafter', $options, true ) ) {
$string = wfMsgReplaceArgs( $string, $args );
}
@@ -1741,7 +1681,7 @@ function wfMsgExt( $key, $options ) {
/**
* Since wfMsg() and co suck, they don't return false if the message key they
- * looked up didn't exist but a XHTML string, this function checks for the
+ * looked up didn't exist but instead the key wrapped in <>'s, this function checks for the
* nonexistence of messages by checking the MessageCache::get() result directly.
*
* @deprecated since 1.18. Use Message::isDisabled().
@@ -1759,10 +1699,12 @@ function wfEmptyMsg( $key ) {
* Throw a debugging exception. This function previously once exited the process,
* but now throws an exception instead, with similar results.
*
+ * @deprecated since 1.22; just throw an MWException yourself
* @param string $msg message shown when dying.
* @throws MWException
*/
function wfDebugDieBacktrace( $msg = '' ) {
+ wfDeprecated( __FUNCTION__, '1.22' );
throw new MWException( $msg );
}
@@ -1779,7 +1721,7 @@ function wfHostname() {
# Hostname overriding
global $wgOverrideHostname;
- if( $wgOverrideHostname !== false ) {
+ if ( $wgOverrideHostname !== false ) {
# Set static and skip any detection
$host = $wgOverrideHostname;
return $host;
@@ -1791,7 +1733,7 @@ function wfHostname() {
} else {
$uname = false;
}
- if( is_array( $uname ) && isset( $uname['nodename'] ) ) {
+ if ( is_array( $uname ) && isset( $uname['nodename'] ) ) {
$host = $uname['nodename'];
} elseif ( getenv( 'COMPUTERNAME' ) ) {
# Windows computer name
@@ -1838,7 +1780,7 @@ function wfReportTime() {
function wfDebugBacktrace( $limit = 0 ) {
static $disabled = null;
- if( extension_loaded( 'Zend Optimizer' ) ) {
+ if ( extension_loaded( 'Zend Optimizer' ) ) {
wfDebug( "Zend Optimizer detected; skipping debug_backtrace for safety.\n" );
return array();
}
@@ -1878,14 +1820,14 @@ function wfBacktrace() {
$msg = "<ul>\n";
}
$backtrace = wfDebugBacktrace();
- foreach( $backtrace as $call ) {
- if( isset( $call['file'] ) ) {
+ foreach ( $backtrace as $call ) {
+ if ( isset( $call['file'] ) ) {
$f = explode( DIRECTORY_SEPARATOR, $call['file'] );
$file = $f[count( $f ) - 1];
} else {
$file = '-';
}
- if( isset( $call['line'] ) ) {
+ if ( isset( $call['line'] ) ) {
$line = $call['line'];
} else {
$line = '-';
@@ -1895,7 +1837,7 @@ function wfBacktrace() {
} else {
$msg .= '<li>' . $file . ' line ' . $line . ' calls ';
}
- if( !empty( $call['class'] ) ) {
+ if ( !empty( $call['class'] ) ) {
$msg .= $call['class'] . $call['type'];
}
$msg .= $call['function'] . '()';
@@ -1993,11 +1935,11 @@ function wfViewPrevNext( $offset, $limit, $link, $query = '', $atend = false ) {
$query = wfCgiToArray( $query );
- if( is_object( $link ) ) {
+ if ( is_object( $link ) ) {
$title = $link;
} else {
$title = Title::newFromText( $link );
- if( is_null( $title ) ) {
+ if ( is_null( $title ) ) {
return false;
}
}
@@ -2006,23 +1948,6 @@ function wfViewPrevNext( $offset, $limit, $link, $query = '', $atend = false ) {
}
/**
- * Make a list item, used by various special pages
- *
- * @param string $page Page link
- * @param string $details Text between brackets
- * @param $oppositedm Boolean Add the direction mark opposite to your
- * language, to display text properly
- * @return String
- * @deprecated since 1.19; use Language::specialList() instead
- */
-function wfSpecialList( $page, $details, $oppositedm = true ) {
- wfDeprecated( __METHOD__, '1.19' );
-
- global $wgLang;
- return $wgLang->specialList( $page, $details, $oppositedm );
-}
-
-/**
* @todo document
* @todo FIXME: We may want to blacklist some broken browsers
*
@@ -2033,16 +1958,16 @@ function wfClientAcceptsGzip( $force = false ) {
static $result = null;
if ( $result === null || $force ) {
$result = false;
- if( isset( $_SERVER['HTTP_ACCEPT_ENCODING'] ) ) {
+ if ( isset( $_SERVER['HTTP_ACCEPT_ENCODING'] ) ) {
# @todo FIXME: We may want to blacklist some broken browsers
$m = array();
- if( preg_match(
+ 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 ) ) {
+ if ( isset( $m[2] ) && ( $m[1] == 'q' ) && ( $m[2] == 0 ) ) {
$result = false;
return $result;
}
@@ -2078,22 +2003,54 @@ function wfCheckLimits( $deflimit = 50, $optionname = 'rclimit' ) {
* @return String
*/
function wfEscapeWikiText( $text ) {
- $text = strtr( "\n$text", array(
- '"' => '&#34;', '&' => '&#38;', "'" => '&#39;', '<' => '&#60;',
- '=' => '&#61;', '>' => '&#62;', '[' => '&#91;', ']' => '&#93;',
- '{' => '&#123;', '|' => '&#124;', '}' => '&#125;',
- "\n#" => "\n&#35;", "\n*" => "\n&#42;",
- "\n:" => "\n&#58;", "\n;" => "\n&#59;",
- '://' => '&#58;//', 'ISBN ' => 'ISBN&#32;', 'RFC ' => 'RFC&#32;',
- ) );
- return substr( $text, 1 );
+ static $repl = null, $repl2 = null;
+ if ( $repl === null ) {
+ $repl = array(
+ '"' => '&#34;', '&' => '&#38;', "'" => '&#39;', '<' => '&#60;',
+ '=' => '&#61;', '>' => '&#62;', '[' => '&#91;', ']' => '&#93;',
+ '{' => '&#123;', '|' => '&#124;', '}' => '&#125;', ';' => '&#59;',
+ "\n#" => "\n&#35;", "\r#" => "\r&#35;",
+ "\n*" => "\n&#42;", "\r*" => "\r&#42;",
+ "\n:" => "\n&#58;", "\r:" => "\r&#58;",
+ "\n " => "\n&#32;", "\r " => "\r&#32;",
+ "\n\n" => "\n&#10;", "\r\n" => "&#13;\n",
+ "\n\r" => "\n&#13;", "\r\r" => "\r&#13;",
+ "\n\t" => "\n&#9;", "\r\t" => "\r&#9;", // "\n\t\n" is treated like "\n\n"
+ "\n----" => "\n&#45;---", "\r----" => "\r&#45;---",
+ '__' => '_&#95;', '://' => '&#58;//',
+ );
+
+ // We have to catch everything "\s" matches in PCRE
+ foreach ( array( 'ISBN', 'RFC', 'PMID' ) as $magic ) {
+ $repl["$magic "] = "$magic&#32;";
+ $repl["$magic\t"] = "$magic&#9;";
+ $repl["$magic\r"] = "$magic&#13;";
+ $repl["$magic\n"] = "$magic&#10;";
+ $repl["$magic\f"] = "$magic&#12;";
+ }
+
+ // And handle protocols that don't use "://"
+ global $wgUrlProtocols;
+ $repl2 = array();
+ foreach ( $wgUrlProtocols as $prot ) {
+ if ( substr( $prot, -1 ) === ':' ) {
+ $repl2[] = preg_quote( substr( $prot, 0, -1 ), '/' );
+ }
+ }
+ $repl2 = $repl2 ? '/\b(' . join( '|', $repl2 ) . '):/i' : '/^(?!)/';
+ }
+ $text = substr( strtr( "\n$text", $repl ), 1 );
+ $text = preg_replace( $repl2, '$1&#58;', $text );
+ return $text;
}
/**
* Get the current unix timestamp with microseconds. Useful for profiling
+ * @deprecated since 1.22; call microtime() directly
* @return Float
*/
function wfTime() {
+ wfDeprecated( __FUNCTION__, '1.22' );
return microtime( true );
}
@@ -2195,14 +2152,14 @@ function wfHttpError( $code, $label, $desc ) {
* @param $resetGzipEncoding Bool
*/
function wfResetOutputBuffers( $resetGzipEncoding = true ) {
- if( $resetGzipEncoding ) {
+ if ( $resetGzipEncoding ) {
// Suppress Content-Encoding and Content-Length
// headers from 1.10+s wfOutputHandler
global $wgDisableOutputCompression;
$wgDisableOutputCompression = true;
}
- while( $status = ob_get_status() ) {
- if( $status['type'] == 0 /* PHP_OUTPUT_HANDLER_INTERNAL */ ) {
+ while ( $status = ob_get_status() ) {
+ if ( $status['type'] == 0 /* PHP_OUTPUT_HANDLER_INTERNAL */ ) {
// Probably from zlib.output_compression or other
// PHP-internal setting which can't be removed.
//
@@ -2210,13 +2167,13 @@ function wfResetOutputBuffers( $resetGzipEncoding = true ) {
// output behavior.
break;
}
- if( !ob_end_clean() ) {
+ if ( !ob_end_clean() ) {
// Could not remove output buffer handler; abort now
// to avoid getting in some kind of infinite loop.
break;
}
- if( $resetGzipEncoding ) {
- if( $status['name'] == 'ob_gzhandler' ) {
+ if ( $resetGzipEncoding ) {
+ if ( $status['name'] == 'ob_gzhandler' ) {
// Reset the 'Content-Encoding' field set by this handler
// so we can start fresh.
header_remove( 'Content-Encoding' );
@@ -2252,7 +2209,7 @@ function wfClearOutputBuffers() {
*/
function wfAcceptToPrefs( $accept, $def = '*/*' ) {
# No arg means accept anything (per HTTP spec)
- if( !$accept ) {
+ if ( !$accept ) {
return array( $def => 1.0 );
}
@@ -2260,7 +2217,7 @@ function wfAcceptToPrefs( $accept, $def = '*/*' ) {
$parts = explode( ',', $accept );
- foreach( $parts as $part ) {
+ foreach ( $parts as $part ) {
# @todo FIXME: Doesn't deal with params like 'text/html; level=1'
$values = explode( ';', trim( $part ) );
$match = array();
@@ -2287,13 +2244,13 @@ 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 );
- if( array_key_exists( $parts[0] . '/*', $avail ) ) {
+ if ( array_key_exists( $parts[0] . '/*', $avail ) ) {
return $parts[0] . '/*';
- } elseif( array_key_exists( '*/*', $avail ) ) {
+ } elseif ( array_key_exists( '*/*', $avail ) ) {
return '*/*';
} else {
return null;
@@ -2317,21 +2274,21 @@ function mimeTypeMatch( $type, $avail ) {
function wfNegotiateType( $cprefs, $sprefs ) {
$combine = array();
- foreach( array_keys( $sprefs ) as $type ) {
+ foreach ( array_keys( $sprefs ) as $type ) {
$parts = explode( '/', $type );
- if( $parts[1] != '*' ) {
+ if ( $parts[1] != '*' ) {
$ckey = mimeTypeMatch( $type, $cprefs );
- if( $ckey ) {
+ if ( $ckey ) {
$combine[$type] = $sprefs[$type] * $cprefs[$ckey];
}
}
}
- foreach( array_keys( $cprefs ) as $type ) {
+ foreach ( array_keys( $cprefs ) as $type ) {
$parts = explode( '/', $type );
- if( $parts[1] != '*' && !array_key_exists( $type, $sprefs ) ) {
+ if ( $parts[1] != '*' && !array_key_exists( $type, $sprefs ) ) {
$skey = mimeTypeMatch( $type, $sprefs );
- if( $skey ) {
+ if ( $skey ) {
$combine[$type] = $sprefs[$skey] * $cprefs[$type];
}
}
@@ -2340,8 +2297,8 @@ function wfNegotiateType( $cprefs, $sprefs ) {
$bestq = 0;
$besttype = null;
- foreach( array_keys( $combine ) as $type ) {
- if( $combine[$type] > $bestq ) {
+ foreach ( array_keys( $combine ) as $type ) {
+ if ( $combine[$type] > $bestq ) {
$besttype = $type;
$bestq = $combine[$type];
}
@@ -2447,7 +2404,7 @@ function wfTimestamp( $outputtype = TS_UNIX, $ts = 0 ) {
try {
$timestamp = new MWTimestamp( $ts );
return $timestamp->getTimestamp( $outputtype );
- } catch( TimestampException $e ) {
+ } catch ( TimestampException $e ) {
wfDebug( "wfTimestamp() fed bogus time value: TYPE=$outputtype; VALUE=$ts\n" );
return false;
}
@@ -2462,7 +2419,7 @@ function wfTimestamp( $outputtype = TS_UNIX, $ts = 0 ) {
* @return String
*/
function wfTimestampOrNull( $outputtype = TS_UNIX, $ts = null ) {
- if( is_null( $ts ) ) {
+ if ( is_null( $ts ) ) {
return null;
} else {
return wfTimestamp( $outputtype, $ts );
@@ -2498,7 +2455,7 @@ function wfIsWindows() {
* @return Bool
*/
function wfIsHipHop() {
- return function_exists( 'hphp_thread_set_warmup_enabled' );
+ return defined( 'HPHP_VERSION' );
}
/**
@@ -2533,8 +2490,8 @@ function wfTempDir() {
$tmpDir = array_map( "getenv", array( 'TMPDIR', 'TMP', 'TEMP' ) );
- foreach( $tmpDir as $tmp ) {
- if( $tmp && file_exists( $tmp ) && is_dir( $tmp ) && is_writable( $tmp ) ) {
+ foreach ( $tmpDir as $tmp ) {
+ if ( $tmp && file_exists( $tmp ) && is_dir( $tmp ) && is_writable( $tmp ) ) {
return $tmp;
}
}
@@ -2561,7 +2518,7 @@ function wfMkdirParents( $dir, $mode = null, $caller = null ) {
wfDebug( "$caller: called wfMkdirParents($dir)\n" );
}
- if( strval( $dir ) === '' || file_exists( $dir ) ) {
+ if ( strval( $dir ) === '' || ( file_exists( $dir ) && is_dir( $dir ) ) ) {
return true;
}
@@ -2576,10 +2533,14 @@ function wfMkdirParents( $dir, $mode = null, $caller = null ) {
$ok = mkdir( $dir, $mode, true ); // PHP5 <3
wfRestoreWarnings();
- if( !$ok ) {
+ if ( !$ok ) {
+ //directory may have been created on another request since we last checked
+ if ( is_dir( $dir ) ) {
+ return true;
+ }
+
// PHP doesn't report the path in its warning message, so add our own to aid in diagnosis.
- trigger_error( sprintf( "%s: failed to mkdir \"%s\" mode 0%o", __FUNCTION__, $dir, $mode ),
- E_USER_WARNING );
+ wfLogWarning( sprintf( "failed to mkdir \"%s\" mode 0%o", $dir, $mode ) );
}
return $ok;
}
@@ -2630,7 +2591,9 @@ function wfPercent( $nr, $acc = 2, $round = true ) {
function in_string( $needle, $str, $insensitive = false ) {
wfDeprecated( __METHOD__, '1.21' );
$func = 'strpos';
- if( $insensitive ) $func = 'stripos';
+ if ( $insensitive ) {
+ $func = 'stripos';
+ }
return $func( $str, $needle ) !== false;
}
@@ -2659,47 +2622,15 @@ function in_string( $needle, $str, $insensitive = false ) {
* @return Bool
*/
function wfIniGetBool( $setting ) {
- $val = ini_get( $setting );
+ $val = strtolower( ini_get( $setting ) );
// 'on' and 'true' can't have whitespace around them, but '1' can.
- return strtolower( $val ) == 'on'
- || strtolower( $val ) == 'true'
- || strtolower( $val ) == 'yes'
+ return $val == 'on'
+ || $val == 'true'
+ || $val == 'yes'
|| preg_match( "/^\s*[+-]?0*[1-9]/", $val ); // approx C atoi() function
}
/**
- * 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 string $extension A PHP extension. The file suffix (.so or .dll)
- * should be omitted
- * @param string $fileName Name of the library, if not $extension.suffix
- * @return Bool - Whether or not the extension is loaded
- */
-function wfDl( $extension, $fileName = null ) {
- if( extension_loaded( $extension ) ) {
- return true;
- }
-
- $canDl = false;
- if( PHP_SAPI == 'cli' || PHP_SAPI == 'cgi' || PHP_SAPI == 'embed' ) {
- $canDl = ( function_exists( 'dl' ) && is_callable( 'dl' )
- && wfIniGetBool( 'enable_dl' ) && !wfIniGetBool( 'safe_mode' ) );
- }
-
- if( $canDl ) {
- $fileName = $fileName ? $fileName : $extension;
- if( wfIsWindows() ) {
- $fileName = 'php_' . $fileName;
- }
- wfSuppressWarnings();
- dl( $fileName . '.' . PHP_SHLIB_SUFFIX );
- wfRestoreWarnings();
- }
- return extension_loaded( $extension );
-}
-
-/**
* 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.
@@ -2764,25 +2695,15 @@ function wfEscapeShellArg() {
}
/**
- * Execute a shell command, with time and memory limits mirrored from the PHP
- * configuration if supported.
- * @param string $cmd Command line, properly escaped for shell.
- * @param &$retval null|Mixed optional, will receive the program's exit code.
- * (non-zero is usually failure)
- * @param array $environ optional environment variables which should be
- * added to the executed command environment.
- * @param array $limits optional array with limits(filesize, memory, time, walltime)
- * this overwrites the global wgShellMax* limits.
- * @return string collected stdout as a string (trailing newlines stripped)
+ * Check if wfShellExec() is effectively disabled via php.ini config
+ * @return bool|string False or one of (safemode,disabled)
+ * @since 1.22
*/
-function wfShellExec( $cmd, &$retval = null, $environ = array(), $limits = array() ) {
- global $IP, $wgMaxShellMemory, $wgMaxShellFileSize, $wgMaxShellTime,
- $wgMaxShellWallClockTime, $wgShellCgroup;
-
- static $disabled;
+function wfShellExecDisabled() {
+ static $disabled = null;
if ( is_null( $disabled ) ) {
$disabled = false;
- if( wfIniGetBool( 'safe_mode' ) ) {
+ if ( wfIniGetBool( 'safe_mode' ) ) {
wfDebug( "wfShellExec can't run in safe_mode, PHP's exec functions are too broken.\n" );
$disabled = 'safemode';
} else {
@@ -2795,6 +2716,28 @@ function wfShellExec( $cmd, &$retval = null, $environ = array(), $limits = array
}
}
}
+ return $disabled;
+}
+
+/**
+ * Execute a shell command, with time and memory limits mirrored from the PHP
+ * configuration if supported.
+ * @param string $cmd Command line, properly escaped for shell.
+ * @param &$retval null|Mixed optional, will receive the program's exit code.
+ * (non-zero is usually failure)
+ * @param array $environ optional environment variables which should be
+ * added to the executed command environment.
+ * @param array $limits optional array with limits(filesize, memory, time, walltime)
+ * this overwrites the global wgShellMax* limits.
+ * @param array $options Array of options. Only one is "duplicateStderr" => true, which
+ * Which duplicates stderr to stdout, including errors from limit.sh
+ * @return string collected stdout as a string
+ */
+function wfShellExec( $cmd, &$retval = null, $environ = array(), $limits = array(), $options = array() ) {
+ global $IP, $wgMaxShellMemory, $wgMaxShellFileSize, $wgMaxShellTime,
+ $wgMaxShellWallClockTime, $wgShellCgroup;
+
+ $disabled = wfShellExecDisabled();
if ( $disabled ) {
$retval = 1;
return $disabled == 'safemode' ?
@@ -2802,10 +2745,12 @@ function wfShellExec( $cmd, &$retval = null, $environ = array(), $limits = array
'Unable to run external programs, passthru() is disabled.';
}
+ $includeStderr = isset( $options['duplicateStderr'] ) && $options['duplicateStderr'];
+
wfInitShellLocale();
$envcmd = '';
- foreach( $environ as $k => $v ) {
+ 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
@@ -2839,17 +2784,25 @@ function wfShellExec( $cmd, &$retval = null, $environ = array(), $limits = array
$cmd = '/bin/bash ' . escapeshellarg( "$IP/includes/limit.sh" ) . ' ' .
escapeshellarg( $cmd ) . ' ' .
escapeshellarg(
+ "MW_INCLUDE_STDERR=" . ( $includeStderr ? '1' : '' ) . ';' .
"MW_CPU_LIMIT=$time; " .
'MW_CGROUP=' . escapeshellarg( $wgShellCgroup ) . '; ' .
"MW_MEM_LIMIT=$mem; " .
"MW_FILE_SIZE_LIMIT=$filesize; " .
"MW_WALL_CLOCK_LIMIT=$wallTime"
);
+ } elseif ( $includeStderr ) {
+ $cmd .= ' 2>&1';
}
+ } elseif ( $includeStderr ) {
+ $cmd .= ' 2>&1';
}
wfDebug( "wfShellExec: $cmd\n" );
- $retval = 1; // error by default?
+ // Default to an unusual value that shouldn't happen naturally,
+ // so in the unlikely event of a weird php bug, it would be
+ // more obvious what happened.
+ $retval = 200;
ob_start();
passthru( $cmd, $retval );
$output = ob_get_contents();
@@ -2862,6 +2815,24 @@ function wfShellExec( $cmd, &$retval = null, $environ = array(), $limits = array
}
/**
+ * Execute a shell command, returning both stdout and stderr. Convenience
+ * function, as all the arguments to wfShellExec can become unwieldy.
+ *
+ * @note This also includes errors from limit.sh, e.g. if $wgMaxShellFileSize is exceeded.
+ * @param string $cmd Command line, properly escaped for shell.
+ * @param &$retval null|Mixed optional, will receive the program's exit code.
+ * (non-zero is usually failure)
+ * @param array $environ optional environment variables which should be
+ * added to the executed command environment.
+ * @param array $limits optional array with limits(filesize, memory, time, walltime)
+ * this overwrites the global wgShellMax* limits.
+ * @return string collected stdout and stderr as a string
+ */
+function wfShellExecWithStderr( $cmd, &$retval = null, $environ = array(), $limits = array() ) {
+ return wfShellExec( $cmd, $retval, $environ, $limits, array( 'duplicateStderr' => true ) );
+}
+
+/**
* Workaround for http://bugs.php.net/bug.php?id=45132
* escapeshellarg() destroys non-ASCII characters if LANG is not a UTF-8 locale
*/
@@ -2930,7 +2901,7 @@ function wfMerge( $old, $mine, $yours, &$result ) {
$haveDiff3 = $wgDiff3 && file_exists( $wgDiff3 );
wfRestoreWarnings();
- if( !$haveDiff3 ) {
+ if ( !$haveDiff3 ) {
wfDebug( "diff3 not found\n" );
return false;
}
@@ -2959,7 +2930,7 @@ function wfMerge( $old, $mine, $yours, &$result ) {
wfEscapeShellArg( $yourtextName );
$handle = popen( $cmd, 'r' );
- if( fgets( $handle, 1024 ) ) {
+ if ( fgets( $handle, 1024 ) ) {
$conflict = true;
} else {
$conflict = false;
@@ -3011,7 +2982,7 @@ function wfDiff( $before, $after, $params = '-u' ) {
# This check may also protect against code injection in
# case of broken installations.
- if( !$haveDiff ) {
+ if ( !$haveDiff ) {
wfDebug( "diff executable not found\n" );
$diffs = new Diff( explode( "\n", $before ), explode( "\n", $after ) );
$format = new UnifiedDiffFormatter();
@@ -3125,7 +3096,7 @@ function wfBaseName( $path, $suffix = '' ) {
? ''
: ( '(?:' . preg_quote( $suffix, '#' ) . ')?' );
$matches = array();
- if( preg_match( "#([^/\\\\]*?){$encSuffix}[/\\\\]*$#", $path, $matches ) ) {
+ if ( preg_match( "#([^/\\\\]*?){$encSuffix}[/\\\\]*$#", $path, $matches ) ) {
return $matches[1];
} else {
return '';
@@ -3153,21 +3124,21 @@ function wfRelativePath( $path, $from ) {
$pieces = explode( DIRECTORY_SEPARATOR, dirname( $path ) );
$against = explode( DIRECTORY_SEPARATOR, $from );
- if( $pieces[0] !== $against[0] ) {
+ if ( $pieces[0] !== $against[0] ) {
// Non-matching Windows drive letters?
// Return a full path.
return $path;
}
// Trim off common prefix
- while( count( $pieces ) && count( $against )
+ while ( count( $pieces ) && count( $against )
&& $pieces[0] == $against[0] ) {
array_shift( $pieces );
array_shift( $against );
}
// relative dots to bump us to the parent
- while( count( $against ) ) {
+ while ( count( $against ) ) {
array_unshift( $pieces, '..' );
array_shift( $against );
}
@@ -3206,20 +3177,20 @@ function wfDoUpdates( $commit = '' ) {
*/
function wfBaseConvert( $input, $sourceBase, $destBase, $pad = 1, $lowercase = true, $engine = 'auto' ) {
$input = (string)$input;
- if(
+ if (
$sourceBase < 2 ||
$sourceBase > 36 ||
$destBase < 2 ||
$destBase > 36 ||
- $sourceBase != (int) $sourceBase ||
- $destBase != (int) $destBase ||
- $pad != (int) $pad ||
+ $sourceBase != (int)$sourceBase ||
+ $destBase != (int)$destBase ||
+ $pad != (int)$pad ||
!preg_match( "/^[" . substr( '0123456789abcdefghijklmnopqrstuvwxyz', 0, $sourceBase ) . "]+$/i", $input )
) {
return false;
}
- static $baseChars = array (
+ static $baseChars = array(
10 => 'a', 11 => 'b', 12 => 'c', 13 => 'd', 14 => 'e', 15 => 'f',
16 => 'g', 17 => 'h', 18 => 'i', 19 => 'j', 20 => 'k', 21 => 'l',
22 => 'm', 23 => 'n', 24 => 'o', 25 => 'p', 26 => 'q', 27 => 'r',
@@ -3234,40 +3205,40 @@ function wfBaseConvert( $input, $sourceBase, $destBase, $pad = 1, $lowercase = t
'u' => 30, 'v' => 31, 'w' => 32, 'x' => 33, 'y' => 34, 'z' => 35
);
- if( extension_loaded( 'gmp' ) && ( $engine == 'auto' || $engine == 'gmp' ) ) {
+ if ( extension_loaded( 'gmp' ) && ( $engine == 'auto' || $engine == 'gmp' ) ) {
$result = gmp_strval( gmp_init( $input, $sourceBase ), $destBase );
- } elseif( extension_loaded( 'bcmath' ) && ( $engine == 'auto' || $engine == 'bcmath' ) ) {
+ } elseif ( extension_loaded( 'bcmath' ) && ( $engine == 'auto' || $engine == 'bcmath' ) ) {
$decimal = '0';
- foreach( str_split( strtolower( $input ) ) as $char ) {
+ foreach ( str_split( strtolower( $input ) ) as $char ) {
$decimal = bcmul( $decimal, $sourceBase );
$decimal = bcadd( $decimal, $baseChars[$char] );
}
- for( $result = ''; bccomp( $decimal, 0 ); $decimal = bcdiv( $decimal, $destBase, 0 ) ) {
+ for ( $result = ''; bccomp( $decimal, 0 ); $decimal = bcdiv( $decimal, $destBase, 0 ) ) {
$result .= $baseChars[bcmod( $decimal, $destBase )];
}
$result = strrev( $result );
} else {
$inDigits = array();
- foreach( str_split( strtolower( $input ) ) as $char ) {
+ foreach ( str_split( strtolower( $input ) ) as $char ) {
$inDigits[] = $baseChars[$char];
}
// Iterate over the input, modulo-ing out an output digit
// at a time until input is gone.
$result = '';
- while( $inDigits ) {
+ while ( $inDigits ) {
$work = 0;
$workDigits = array();
// Long division...
- foreach( $inDigits as $digit ) {
+ foreach ( $inDigits as $digit ) {
$work *= $sourceBase;
$work += $digit;
- if( $workDigits || $work >= $destBase ) {
- $workDigits[] = (int) ( $work / $destBase );
+ if ( $workDigits || $work >= $destBase ) {
+ $workDigits[] = (int)( $work / $destBase );
}
$work %= $destBase;
}
@@ -3283,7 +3254,7 @@ function wfBaseConvert( $input, $sourceBase, $destBase, $pad = 1, $lowercase = t
$result = strrev( $result );
}
- if( !$lowercase ) {
+ if ( !$lowercase ) {
$result = strtoupper( $result );
}
@@ -3309,9 +3280,9 @@ function wfCreateObject( $name, $p ) {
function wfHttpOnlySafe() {
global $wgHttpOnlyBlacklist;
- if( isset( $_SERVER['HTTP_USER_AGENT'] ) ) {
- foreach( $wgHttpOnlyBlacklist as $regex ) {
- if( preg_match( $regex, $_SERVER['HTTP_USER_AGENT'] ) ) {
+ if ( isset( $_SERVER['HTTP_USER_AGENT'] ) ) {
+ foreach ( $wgHttpOnlyBlacklist as $regex ) {
+ if ( preg_match( $regex, $_SERVER['HTTP_USER_AGENT'] ) ) {
return false;
}
}
@@ -3338,7 +3309,7 @@ function wfCheckEntropy() {
*/
function wfFixSessionID() {
// If the cookie or session id is already set we already have a session and should abort
- if ( isset( $_COOKIE[ session_name() ] ) || session_id() ) {
+ if ( isset( $_COOKIE[session_name()] ) || session_id() ) {
return;
}
@@ -3356,6 +3327,27 @@ function wfFixSessionID() {
}
/**
+ * Reset the session_id
+ * @since 1.22
+ */
+function wfResetSessionID() {
+ global $wgCookieSecure;
+ $oldSessionId = session_id();
+ $cookieParams = session_get_cookie_params();
+ if ( wfCheckEntropy() && $wgCookieSecure == $cookieParams['secure'] ) {
+ session_regenerate_id( false );
+ } else {
+ $tmp = $_SESSION;
+ session_destroy();
+ wfSetupSession( MWCryptRand::generateHex( 32 ) );
+ $_SESSION = $tmp;
+ }
+ $newSessionId = session_id();
+ wfRunHooks( 'ResetSessionID', array( $oldSessionId, $newSessionId ) );
+}
+
+
+/**
* Initialise php session
*
* @param $sessionId Bool
@@ -3363,9 +3355,9 @@ function wfFixSessionID() {
function wfSetupSession( $sessionId = false ) {
global $wgSessionsInMemcached, $wgSessionsInObjectCache, $wgCookiePath, $wgCookieDomain,
$wgCookieSecure, $wgCookieHttpOnly, $wgSessionHandler;
- if( $wgSessionsInObjectCache || $wgSessionsInMemcached ) {
+ if ( $wgSessionsInObjectCache || $wgSessionsInMemcached ) {
ObjectCacheSessionHandler::install();
- } elseif( $wgSessionHandler && $wgSessionHandler != ini_get( 'session.save_handler' ) ) {
+ } 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 );
@@ -3440,7 +3432,7 @@ function wfForeignMemcKey( $db, $prefix /*, ... */ ) {
} else {
$key = $db . ':' . implode( ':', $args );
}
- return $key;
+ return str_replace( ' ', '_', $key );
}
/**
@@ -3588,7 +3580,7 @@ function wfScript( $script = 'index' ) {
global $wgScriptPath, $wgScriptExtension, $wgScript, $wgLoadScript;
if ( $script === 'index' ) {
return $wgScript;
- } else if ( $script === 'load' ) {
+ } elseif ( $script === 'load' ) {
return $wgLoadScript;
} else {
return "{$wgScriptPath}/{$script}{$wgScriptExtension}";
@@ -3601,7 +3593,7 @@ function wfScript( $script = 'index' ) {
* @return string script URL
*/
function wfGetScriptUrl() {
- if( isset( $_SERVER['SCRIPT_NAME'] ) ) {
+ if ( isset( $_SERVER['SCRIPT_NAME'] ) ) {
#
# as it was called, minus the query string.
#
@@ -3649,15 +3641,22 @@ function wfGetNull() {
*
* @param $maxLag Integer (deprecated)
* @param $wiki mixed Wiki identifier accepted by wfGetLB
+ * @param $cluster string cluster name accepted by LBFactory
*/
-function wfWaitForSlaves( $maxLag = false, $wiki = false ) {
- $lb = wfGetLB( $wiki );
+function wfWaitForSlaves( $maxLag = false, $wiki = false, $cluster = false ) {
+ $lb = ( $cluster !== false )
+ ? wfGetLBFactory()->getExternalLB( $cluster )
+ : wfGetLB( $wiki );
// 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 );
+ $dbw = $lb->getConnection( DB_MASTER, array(), $wiki );
$pos = $dbw->getMasterPos();
- $lb->waitForAll( $pos );
+ // The DBMS may not support getMasterPos() or the whole
+ // load balancer might be fake (e.g. $wgAllDBsAreLocalhost).
+ if ( $pos !== false ) {
+ $lb->waitForAll( $pos );
+ }
}
}
@@ -3739,9 +3738,9 @@ function wfStripIllegalFilenameChars( $name ) {
function wfMemoryLimit() {
global $wgMemoryLimit;
$memlimit = wfShorthandToInteger( ini_get( 'memory_limit' ) );
- if( $memlimit != -1 ) {
+ if ( $memlimit != -1 ) {
$conflimit = wfShorthandToInteger( $wgMemoryLimit );
- if( $conflimit == -1 ) {
+ if ( $conflimit == -1 ) {
wfDebug( "Removing PHP's memory limit\n" );
wfSuppressWarnings();
ini_set( 'memory_limit', $conflimit );
@@ -3766,12 +3765,12 @@ function wfMemoryLimit() {
*/
function wfShorthandToInteger( $string = '' ) {
$string = trim( $string );
- if( $string === '' ) {
+ if ( $string === '' ) {
return -1;
}
$last = $string[strlen( $string ) - 1];
$val = intval( $string );
- switch( $last ) {
+ switch ( $last ) {
case 'g':
case 'G':
$val *= 1024;
@@ -3799,22 +3798,17 @@ function wfBCP47( $code ) {
$codeSegment = explode( '-', $code );
$codeBCP = array();
foreach ( $codeSegment as $segNo => $seg ) {
- if ( count( $codeSegment ) > 0 ) {
- // when previous segment is x, it is a private segment and should be lc
- if( $segNo > 0 && strtolower( $codeSegment[( $segNo - 1 )] ) == 'x' ) {
- $codeBCP[$segNo] = strtolower( $seg );
- // ISO 3166 country code
- } elseif ( ( strlen( $seg ) == 2 ) && ( $segNo > 0 ) ) {
- $codeBCP[$segNo] = strtoupper( $seg );
- // ISO 15924 script code
- } elseif ( ( strlen( $seg ) == 4 ) && ( $segNo > 0 ) ) {
- $codeBCP[$segNo] = ucfirst( strtolower( $seg ) );
- // Use lowercase for other cases
- } else {
- $codeBCP[$segNo] = strtolower( $seg );
- }
+ // when previous segment is x, it is a private segment and should be lc
+ if ( $segNo > 0 && strtolower( $codeSegment[( $segNo - 1 )] ) == 'x' ) {
+ $codeBCP[$segNo] = strtolower( $seg );
+ // ISO 3166 country code
+ } elseif ( ( strlen( $seg ) == 2 ) && ( $segNo > 0 ) ) {
+ $codeBCP[$segNo] = strtoupper( $seg );
+ // ISO 15924 script code
+ } elseif ( ( strlen( $seg ) == 4 ) && ( $segNo > 0 ) ) {
+ $codeBCP[$segNo] = ucfirst( strtolower( $seg ) );
+ // Use lowercase for other cases
} else {
- // Use lowercase for single segment
$codeBCP[$segNo] = strtolower( $seg );
}
}
@@ -3879,7 +3873,7 @@ function wfGetLangConverterCacheStorage() {
* @param array $args parameters passed to hook functions
* @return Boolean True if no handler aborted the hook
*/
-function wfRunHooks( $event, $args = array() ) {
+function wfRunHooks( $event, array $args = array() ) {
return Hooks::run( $event, $args );
}
@@ -3897,7 +3891,7 @@ function wfRunHooks( $event, $args = array() ) {
* @throws MWException if $data not long enough, or if unpack fails
* @return array Associative array of the extracted data
*/
-function wfUnpack( $format, $data, $length=false ) {
+function wfUnpack( $format, $data, $length = false ) {
if ( $length !== false ) {
$realLen = strlen( $data );
if ( $realLen < $length ) {
@@ -3939,19 +3933,19 @@ function wfIsBadImage( $name, $contextTitle = false, $blacklist = null ) {
# Handle redirects
$redirectTitle = RepoGroup::singleton()->checkRedirect( Title::makeTitle( NS_FILE, $name ) );
- if( $redirectTitle ) {
- $name = $redirectTitle->getDbKey();
+ if ( $redirectTitle ) {
+ $name = $redirectTitle->getDBkey();
}
# Run the extension hook
$bad = false;
- if( !wfRunHooks( 'BadImage', array( $name, &$bad ) ) ) {
+ if ( !wfRunHooks( 'BadImage', array( $name, &$bad ) ) ) {
wfProfileOut( __METHOD__ );
return $bad;
}
$cacheable = ( $blacklist === null );
- if( $cacheable && $badImageCache !== null ) {
+ if ( $cacheable && $badImageCache !== null ) {
$badImages = $badImageCache;
} else { // cache miss
if ( $blacklist === null ) {
@@ -3960,7 +3954,7 @@ function wfIsBadImage( $name, $contextTitle = false, $blacklist = null ) {
# Build the list now
$badImages = array();
$lines = explode( "\n", $blacklist );
- foreach( $lines as $line ) {
+ foreach ( $lines as $line ) {
# List items only
if ( substr( $line, 0, 1 ) !== '*' ) {
continue;
@@ -3999,3 +3993,16 @@ function wfIsBadImage( $name, $contextTitle = false, $blacklist = null ) {
wfProfileOut( __METHOD__ );
return $bad;
}
+
+/**
+ * Determine whether the client at a given source IP is likely to be able to
+ * access the wiki via HTTPS.
+ *
+ * @param string $ip The IPv4/6 address in the normal human-readable form
+ * @return boolean
+ */
+function wfCanIPUseHTTPS( $ip ) {
+ $canDo = true;
+ wfRunHooks( 'CanIPUseHTTPS', array( $ip, &$canDo ) );
+ return !!$canDo;
+}
diff --git a/includes/HTMLForm.php b/includes/HTMLForm.php
index 68639739..d260862c 100644
--- a/includes/HTMLForm.php
+++ b/includes/HTMLForm.php
@@ -83,9 +83,8 @@
* $form = new HTMLForm( $someFields );
* $form->setMethod( 'get' )
* ->setWrapperLegendMsg( 'message-key' )
- * ->suppressReset()
* ->prepareForm()
- * ->displayForm();
+ * ->displayForm( '' );
* @endcode
* Note that you will have prepareForm and displayForm at the end. Other
* methods call done after that would simply not be part of the form :(
@@ -95,7 +94,7 @@
class HTMLForm extends ContextSource {
// A mapping of 'type' inputs onto standard HTMLFormField subclasses
- static $typeMappings = array(
+ public static $typeMappings = array(
'api' => 'HTMLApiField',
'text' => 'HTMLTextField',
'textarea' => 'HTMLTextAreaField',
@@ -128,6 +127,7 @@ class HTMLForm extends ContextSource {
protected $mFieldTree;
protected $mShowReset = false;
+ protected $mShowSubmit = true;
public $mFieldData;
protected $mSubmitCallback;
@@ -140,6 +140,7 @@ class HTMLForm extends ContextSource {
protected $mSectionFooters = array();
protected $mPost = '';
protected $mId;
+ protected $mTableId = '';
protected $mSubmitID;
protected $mSubmitName;
@@ -186,6 +187,7 @@ class HTMLForm extends ContextSource {
'table',
'div',
'raw',
+ 'vform',
);
/**
@@ -200,12 +202,12 @@ class HTMLForm extends ContextSource {
$this->setContext( $context );
$this->mTitle = false; // We don't need them to set a title
$this->mMessagePrefix = $messagePrefix;
- } else {
+ } elseif ( is_null( $context ) && $messagePrefix !== '' ) {
+ $this->mMessagePrefix = $messagePrefix;
+ } elseif ( is_string( $context ) && $messagePrefix === '' ) {
// B/C since 1.18
- if ( is_string( $context ) && $messagePrefix === '' ) {
- // it's actually $messagePrefix
- $this->mMessagePrefix = $context;
- }
+ // it's actually $messagePrefix
+ $this->mMessagePrefix = $context;
}
// Expand out into a tree.
@@ -222,8 +224,15 @@ class HTMLForm extends ContextSource {
}
$field = self::loadInputFromParameters( $fieldname, $info );
+ // FIXME During field's construct, the parent form isn't available!
+ // could add a 'parent' name-value to $info, could add a third parameter.
$field->mParent = $this;
+ // vform gets too much space if empty labels generate HTML.
+ if ( $this->isVForm() ) {
+ $field->setShowEmptyLabel( false );
+ }
+
$setSection =& $loadedDescriptor;
if ( $section ) {
$sectionParts = explode( '/', $section );
@@ -256,7 +265,7 @@ class HTMLForm extends ContextSource {
*/
public function setDisplayFormat( $format ) {
if ( !in_array( $format, $this->availableDisplayFormats ) ) {
- throw new MWException ( 'Display format must be one of ' . print_r( $this->availableDisplayFormats, true ) );
+ throw new MWException( 'Display format must be one of ' . print_r( $this->availableDisplayFormats, true ) );
}
$this->displayFormat = $format;
return $this;
@@ -272,11 +281,22 @@ class HTMLForm extends ContextSource {
}
/**
+ * Test if displayFormat is 'vform'
+ * @since 1.22
+ * @return Bool
+ */
+ public function isVForm() {
+ return $this->displayFormat === 'vform';
+ }
+
+ /**
* Add the HTMLForm-specific JavaScript, if it hasn't been
* done already.
* @deprecated since 1.18 load modules with ResourceLoader instead
*/
- static function addJS() { wfDeprecated( __METHOD__, '1.18' ); }
+ static function addJS() {
+ wfDeprecated( __METHOD__, '1.18' );
+ }
/**
* Initialise a new Object for the field
@@ -572,6 +592,21 @@ class HTMLForm extends ContextSource {
}
/**
+ * Add an array of hidden fields to the output
+ *
+ * @since 1.22
+ * @param array $fields Associative array of fields to add;
+ * mapping names to their values
+ * @return HTMLForm $this for chaining calls
+ */
+ public function addHiddenFields( array $fields ) {
+ foreach ( $fields as $name => $value ) {
+ $this->mHiddenFields[] = array( $value, array( 'name' => $name ) );
+ }
+ return $this;
+ }
+
+ /**
* Add a button to the form
* @param string $name field name.
* @param string $value field value
@@ -585,8 +620,8 @@ class HTMLForm extends ContextSource {
}
/**
- * Display the form (sending to $wgOut), with an appropriate error
- * message or stack of messages, and any validation errors, etc.
+ * Display the form (sending to the context's OutputPage object), with an
+ * appropriate error message or stack of messages, and any validation errors, etc.
*
* @attention You should call prepareForm() before calling this function.
* Moreover, when doing method chaining this should be the very last method
@@ -608,6 +643,11 @@ class HTMLForm extends ContextSource {
# For good measure (it is the default)
$this->getOutput()->preventClickjacking();
$this->getOutput()->addModules( 'mediawiki.htmlform' );
+ if ( $this->isVForm() ) {
+ $this->getOutput()->addModuleStyles( 'mediawiki.ui' );
+ // TODO should vertical form set setWrapperLegend( false )
+ // to hide ugly fieldsets?
+ }
$html = ''
. $this->getErrors( $submitResult )
@@ -640,15 +680,18 @@ class HTMLForm extends ContextSource {
: 'application/x-www-form-urlencoded';
# Attributes
$attribs = array(
- 'action' => $this->mAction === false ? $this->getTitle()->getFullURL() : $this->mAction,
- 'method' => $this->mMethod,
- 'class' => 'visualClear',
+ 'action' => $this->getAction(),
+ 'method' => $this->getMethod(),
+ 'class' => array( 'visualClear' ),
'enctype' => $encType,
);
if ( !empty( $this->mId ) ) {
$attribs['id'] = $this->mId;
}
+ if ( $this->isVForm() ) {
+ array_push( $attribs['class'], 'mw-ui-vform', 'mw-ui-container' );
+ }
return Html::rawElement( 'form', $attribs, $html );
}
@@ -682,24 +725,40 @@ class HTMLForm extends ContextSource {
* @return String HTML.
*/
function getButtons() {
- $html = '';
- $attribs = array();
+ $html = '<span class="mw-htmlform-submit-buttons">';
- if ( isset( $this->mSubmitID ) ) {
- $attribs['id'] = $this->mSubmitID;
- }
+ if ( $this->mShowSubmit ) {
+ $attribs = array();
- if ( isset( $this->mSubmitName ) ) {
- $attribs['name'] = $this->mSubmitName;
- }
+ if ( isset( $this->mSubmitID ) ) {
+ $attribs['id'] = $this->mSubmitID;
+ }
- if ( isset( $this->mSubmitTooltip ) ) {
- $attribs += Linker::tooltipAndAccesskeyAttribs( $this->mSubmitTooltip );
- }
+ if ( isset( $this->mSubmitName ) ) {
+ $attribs['name'] = $this->mSubmitName;
+ }
- $attribs['class'] = 'mw-htmlform-submit';
+ if ( isset( $this->mSubmitTooltip ) ) {
+ $attribs += Linker::tooltipAndAccesskeyAttribs( $this->mSubmitTooltip );
+ }
- $html .= Xml::submitButton( $this->getSubmitText(), $attribs ) . "\n";
+ $attribs['class'] = array( 'mw-htmlform-submit' );
+
+ if ( $this->isVForm() ) {
+ // mw-ui-block is necessary because the buttons aren't necessarily in an
+ // immediate child div of the vform.
+ array_push( $attribs['class'], 'mw-ui-button', 'mw-ui-big', 'mw-ui-primary', 'mw-ui-block' );
+ }
+
+ $html .= Xml::submitButton( $this->getSubmitText(), $attribs ) . "\n";
+
+ // Buttons are top-level form elements in table and div layouts,
+ // but vform wants all elements inside divs to get spaced-out block
+ // styling.
+ if ( $this->isVForm() ) {
+ $html = Html::rawElement( 'div', null, "\n$html\n" );
+ }
+ }
if ( $this->mShowReset ) {
$html .= Html::element(
@@ -729,6 +788,8 @@ class HTMLForm extends ContextSource {
$html .= Html::element( 'input', $attrs );
}
+ $html .= '</span>';
+
return $html;
}
@@ -737,7 +798,7 @@ class HTMLForm extends ContextSource {
* @return String
*/
function getBody() {
- return $this->displaySection( $this->mFieldTree );
+ return $this->displaySection( $this->mFieldTree, $this->mTableId );
}
/**
@@ -852,6 +913,33 @@ class HTMLForm extends ContextSource {
}
/**
+ * Stop a default submit button being shown for this form. This implies that an
+ * alternate submit method must be provided manually.
+ *
+ * @since 1.22
+ *
+ * @param bool $suppressSubmit Set to false to re-enable the button again
+ *
+ * @return HTMLForm $this for chaining calls
+ */
+ function suppressDefaultSubmit( $suppressSubmit = true ) {
+ $this->mShowSubmit = !$suppressSubmit;
+ return $this;
+ }
+
+ /**
+ * Set the id of the \<table\> or outermost \<div\> element.
+ *
+ * @since 1.22
+ * @param string $id new value of the id attribute, or "" to remove
+ * @return HTMLForm $this for chaining calls
+ */
+ public function setTableId( $id ) {
+ $this->mTableId = $id;
+ return $this;
+ }
+
+ /**
* @param string $id DOM id for the form
* @return HTMLForm $this for chaining calls (since 1.20)
*/
@@ -859,10 +947,12 @@ class HTMLForm extends ContextSource {
$this->mId = $id;
return $this;
}
+
/**
* Prompt the whole form to be wrapped in a "<fieldset>", with
* this text as its "<legend>" element.
- * @param string $legend HTML to go inside the "<legend>" element.
+ * @param string|false $legend HTML to go inside the "<legend>" element, or
+ * false for no <legend>
* Will be escaped
* @return HTMLForm $this for chaining calls (since 1.20)
*/
@@ -931,19 +1021,30 @@ class HTMLForm extends ContextSource {
/**
* @todo Document
- * @param $fields array[]|HTMLFormField[] array of fields (either arrays or objects)
+ * @param array[]|HTMLFormField[] $fields array of fields (either arrays or objects)
* @param string $sectionName ID attribute of the "<table>" tag for this section, ignored if empty
* @param string $fieldsetIDPrefix ID prefix for the "<fieldset>" tag of each subsection, ignored if empty
+ * @param boolean &$hasUserVisibleFields Whether the section had user-visible fields
* @return String
*/
- public function displaySection( $fields, $sectionName = '', $fieldsetIDPrefix = '' ) {
+ public function displaySection( $fields, $sectionName = '', $fieldsetIDPrefix = '', &$hasUserVisibleFields = false ) {
$displayFormat = $this->getDisplayFormat();
$html = '';
$subsectionHtml = '';
$hasLabel = false;
- $getFieldHtmlMethod = ( $displayFormat == 'table' ) ? 'getTableRow' : 'get' . ucfirst( $displayFormat );
+ switch( $displayFormat ) {
+ case 'table':
+ $getFieldHtmlMethod = 'getTableRow';
+ break;
+ case 'vform':
+ // Close enough to a div.
+ $getFieldHtmlMethod = 'getDiv';
+ break;
+ default:
+ $getFieldHtmlMethod = 'get' . ucfirst( $displayFormat );
+ }
foreach ( $fields as $key => $value ) {
if ( $value instanceof HTMLFormField ) {
@@ -956,20 +1057,38 @@ class HTMLForm extends ContextSource {
if ( $labelValue != '&#160;' && $labelValue !== '' ) {
$hasLabel = true;
}
- } elseif ( is_array( $value ) ) {
- $section = $this->displaySection( $value, $key, "$fieldsetIDPrefix$key-" );
- $legend = $this->getLegend( $key );
- if ( isset( $this->mSectionHeaders[$key] ) ) {
- $section = $this->mSectionHeaders[$key] . $section;
- }
- if ( isset( $this->mSectionFooters[$key] ) ) {
- $section .= $this->mSectionFooters[$key];
+
+ if ( get_class( $value ) !== 'HTMLHiddenField' &&
+ get_class( $value ) !== 'HTMLApiField' ) {
+ $hasUserVisibleFields = true;
}
- $attributes = array();
- if ( $fieldsetIDPrefix ) {
- $attributes['id'] = Sanitizer::escapeId( "$fieldsetIDPrefix$key" );
+ } elseif ( is_array( $value ) ) {
+ $subsectionHasVisibleFields = false;
+ $section = $this->displaySection( $value, "mw-htmlform-$key", "$fieldsetIDPrefix$key-", $subsectionHasVisibleFields );
+ $legend = null;
+
+ if ( $subsectionHasVisibleFields === true ) {
+ // Display the section with various niceties.
+ $hasUserVisibleFields = true;
+
+ $legend = $this->getLegend( $key );
+
+ if ( isset( $this->mSectionHeaders[$key] ) ) {
+ $section = $this->mSectionHeaders[$key] . $section;
+ }
+ if ( isset( $this->mSectionFooters[$key] ) ) {
+ $section .= $this->mSectionFooters[$key];
+ }
+
+ $attributes = array();
+ if ( $fieldsetIDPrefix ) {
+ $attributes['id'] = Sanitizer::escapeId( "$fieldsetIDPrefix$key" );
+ }
+ $subsectionHtml .= Xml::fieldset( $legend, $section, $attributes ) . "\n";
+ } else {
+ // Just return the inputs, nothing fancy.
+ $subsectionHtml .= $section;
}
- $subsectionHtml .= Xml::fieldset( $legend, $section, $attributes ) . "\n";
}
}
@@ -985,13 +1104,13 @@ class HTMLForm extends ContextSource {
);
if ( $sectionName ) {
- $attribs['id'] = Sanitizer::escapeId( "mw-htmlform-$sectionName" );
+ $attribs['id'] = Sanitizer::escapeId( $sectionName );
}
if ( $displayFormat === 'table' ) {
$html = Html::rawElement( 'table', $attribs,
Html::rawElement( 'tbody', array(), "\n$html\n" ) ) . "\n";
- } elseif ( $displayFormat === 'div' ) {
+ } elseif ( $displayFormat === 'div' || $displayFormat === 'vform' ) {
$html = Html::rawElement( 'div', $attribs, "\n$html\n" );
}
}
@@ -1074,6 +1193,32 @@ class HTMLForm extends ContextSource {
return $this;
}
+ /**
+ * Get the value for the action attribute of the form.
+ *
+ * @since 1.22
+ *
+ * @return string
+ */
+ public function getAction() {
+ global $wgScript, $wgArticlePath;
+
+ // If an action is alredy provided, return it
+ if ( $this->mAction !== false ) {
+ return $this->mAction;
+ }
+
+ // Check whether we are in GET mode and $wgArticlePath contains a "?"
+ // meaning that getLocalURL() would return something like "index.php?title=...".
+ // As browser remove the query string before submitting GET forms,
+ // it means that the title would be lost. In such case use $wgScript instead
+ // and put title in an hidden field (see getHiddenFields()).
+ if ( strpos( $wgArticlePath, '?' ) !== false && $this->getMethod() === 'get' ) {
+ return $wgScript;
+ }
+
+ return $this->getTitle()->getLocalURL();
+ }
}
/**
@@ -1092,6 +1237,12 @@ abstract class HTMLFormField {
protected $mDefault;
/**
+ * @var bool If true will generate an empty div element with no label
+ * @since 1.22
+ */
+ protected $mShowEmptyLabels = true;
+
+ /**
* @var HTMLForm
*/
public $mParent;
@@ -1167,6 +1318,18 @@ abstract class HTMLFormField {
}
/**
+ * Tell the field whether to generate a separate label element if its label
+ * is blank.
+ *
+ * @since 1.22
+ * @param bool $show Set to false to not generate a label.
+ * @return void
+ */
+ public function setShowEmptyLabel( $show ) {
+ $this->mShowEmptyLabels = $show;
+ }
+
+ /**
* Get the value that this input has been set to from a posted form,
* or the input's default value if it has not been set.
* @param $request WebRequest
@@ -1183,6 +1346,8 @@ abstract class HTMLFormField {
/**
* Initialise the object
* @param array $params Associative Array. See HTMLForm doc for syntax.
+ *
+ * @since 1.22 The 'label' attribute no longer accepts raw HTML, use 'label-raw' instead
* @throws MWException
*/
function __construct( $params ) {
@@ -1201,7 +1366,14 @@ abstract class HTMLFormField {
$this->mLabel = wfMessage( $msg, $msgInfo )->parse();
} elseif ( isset( $params['label'] ) ) {
- $this->mLabel = $params['label'];
+ if ( $params['label'] === '&#160;' ) {
+ // Apparently some things set &nbsp directly and in an odd format
+ $this->mLabel = '&#160;';
+ } else {
+ $this->mLabel = htmlspecialchars( $params['label'] );
+ }
+ } elseif ( isset( $params['label-raw'] ) ) {
+ $this->mLabel = $params['label-raw'];
}
$this->mName = "wp{$params['fieldname']}";
@@ -1246,6 +1418,10 @@ abstract class HTMLFormField {
if ( isset( $params['flatlist'] ) ) {
$this->mClass .= ' mw-htmlform-flatlist';
}
+
+ if ( isset( $params['hidelabel'] ) ) {
+ $this->mShowEmptyLabels = false;
+ }
}
/**
@@ -1306,13 +1482,22 @@ abstract class HTMLFormField {
$cellAttributes = array();
$label = $this->getLabelHtml( $cellAttributes );
+ $outerDivClass = array(
+ 'mw-input',
+ 'mw-htmlform-nolabel' => ( $label === '' )
+ );
+
$field = Html::rawElement(
'div',
- array( 'class' => 'mw-input' ) + $cellAttributes,
+ array( 'class' => $outerDivClass ) + $cellAttributes,
$inputHtml . "\n$errors"
);
+ $divCssClasses = array( "mw-htmlform-field-$fieldType", $this->mClass, $errorClass );
+ if ( $this->mParent->isVForm() ) {
+ $divCssClasses[] = 'mw-ui-vform-div';
+ }
$html = Html::rawElement( 'div',
- array( 'class' => "mw-htmlform-field-$fieldType {$this->mClass} $errorClass" ),
+ array( 'class' => $divCssClasses ),
$label . $field );
$html .= $helptext;
return $html;
@@ -1437,7 +1622,7 @@ abstract class HTMLFormField {
}
function getLabel() {
- return $this->mLabel;
+ return is_null( $this->mLabel ) ? '' : $this->mLabel;
}
function getLabelHtml( $cellAttributes = array() ) {
@@ -1449,20 +1634,32 @@ abstract class HTMLFormField {
$for['for'] = $this->mID;
}
+ $labelValue = trim( $this->getLabel() );
+ $hasLabel = false;
+ if ( $labelValue !== '&#160;' && $labelValue !== '' ) {
+ $hasLabel = true;
+ }
+
$displayFormat = $this->mParent->getDisplayFormat();
- $labelElement = Html::rawElement( 'label', $for, $this->getLabel() );
+ $html = '';
- if ( $displayFormat == 'table' ) {
- return Html::rawElement( 'td', array( 'class' => 'mw-label' ) + $cellAttributes,
- Html::rawElement( 'label', $for, $this->getLabel() )
+ if ( $displayFormat === 'table' ) {
+ $html = Html::rawElement( 'td', array( 'class' => 'mw-label' ) + $cellAttributes,
+ Html::rawElement( 'label', $for, $labelValue )
);
- } elseif ( $displayFormat == 'div' ) {
- return Html::rawElement( 'div', array( 'class' => 'mw-label' ) + $cellAttributes,
- Html::rawElement( 'label', $for, $this->getLabel() )
- );
- } else {
- return $labelElement;
+ } elseif ( $hasLabel || $this->mShowEmptyLabels ) {
+ if ( $displayFormat === 'div' ) {
+ $html = Html::rawElement(
+ 'div',
+ array( 'class' => 'mw-label' ) + $cellAttributes,
+ Html::rawElement( 'label', $for, $labelValue )
+ );
+ } else {
+ $html = Html::rawElement( 'label', $for, $labelValue );
+ }
}
+
+ return $html;
}
function getDefault() {
@@ -1602,16 +1799,19 @@ class HTMLTextField extends HTMLFormField {
}
}
class HTMLTextAreaField extends HTMLFormField {
+ const DEFAULT_COLS = 80;
+ const DEFAULT_ROWS = 25;
+
function getCols() {
return isset( $this->mParams['cols'] )
? $this->mParams['cols']
- : 80;
+ : static::DEFAULT_COLS;
}
function getRows() {
return isset( $this->mParams['rows'] )
? $this->mParams['rows']
- : 25;
+ : static::DEFAULT_ROWS;
}
function getInputHTML( $value ) {
@@ -1741,8 +1941,25 @@ class HTMLCheckField extends HTMLFormField {
$attr['class'] = $this->mClass;
}
- return Xml::check( $this->mName, $value, $attr ) . '&#160;' .
- Html::rawElement( 'label', array( 'for' => $this->mID ), $this->mLabel );
+ if ( $this->mParent->isVForm() ) {
+ // Nest checkbox inside label.
+ return Html::rawElement(
+ 'label',
+ array(
+ 'class' => 'mw-ui-checkbox-label'
+ ),
+ Xml::check(
+ $this->mName,
+ $value,
+ $attr
+ ) .
+ // Html:rawElement doesn't escape contents.
+ htmlspecialchars( $this->mLabel )
+ );
+ } else {
+ return Xml::check( $this->mName, $value, $attr ) . '&#160;' .
+ Html::rawElement( 'label', array( 'for' => $this->mID ), $this->mLabel );
+ }
}
/**
@@ -1755,6 +1972,13 @@ class HTMLCheckField extends HTMLFormField {
}
/**
+ * checkboxes don't need a label.
+ */
+ protected function needsLabel() {
+ return false;
+ }
+
+ /**
* @param $request WebRequest
* @return String
*/
@@ -1786,9 +2010,39 @@ class HTMLCheckField extends HTMLFormField {
* A checkbox matrix
* Operates similarly to HTMLMultiSelectField, but instead of using an array of
* options, uses an array of rows and an array of columns to dynamically
- * construct a matrix of options.
+ * construct a matrix of options. The tags used to identify a particular cell
+ * are of the form "columnName-rowName"
+ *
+ * Options:
+ * - columns
+ * - Required list of columns in the matrix.
+ * - rows
+ * - Required list of rows in the matrix.
+ * - force-options-on
+ * - Accepts array of column-row tags to be displayed as enabled but unavailable to change
+ * - force-options-off
+ * - Accepts array of column-row tags to be displayed as disabled but unavailable to change.
+ * - tooltips
+ * - Optional array mapping row label to tooltip content
+ * - tooltip-class
+ * - Optional CSS class used on tooltip container span. Defaults to mw-icon-question.
*/
-class HTMLCheckMatrix extends HTMLFormField {
+class HTMLCheckMatrix extends HTMLFormField implements HTMLNestedFilterable {
+
+ static private $requiredParams = array(
+ // Required by underlying HTMLFormField
+ 'fieldname',
+ // Required by HTMLCheckMatrix
+ 'rows', 'columns'
+ );
+
+ public function __construct( $params ) {
+ $missing = array_diff( self::$requiredParams, array_keys( $params ) );
+ if ( $missing ) {
+ throw new HTMLFormFieldRequiredOptionsException( $this, $missing );
+ }
+ parent::__construct( $params );
+ }
function validate( $value, $alldata ) {
$rows = $this->mParams['rows'];
@@ -1848,27 +2102,42 @@ class HTMLCheckMatrix extends HTMLFormField {
}
$tableContents .= Html::rawElement( 'tr', array(), "\n$headerContents\n" );
+ $tooltipClass = 'mw-icon-question';
+ if ( isset( $this->mParams['tooltip-class'] ) ) {
+ $tooltipClass = $this->mParams['tooltip-class'];
+ }
+
// Build the options matrix
foreach ( $rows as $rowLabel => $rowTag ) {
+ // Append tooltip if configured
+ if ( isset( $this->mParams['tooltips'][$rowLabel] ) ) {
+ $tooltipAttribs = array(
+ 'class' => "mw-htmlform-tooltip $tooltipClass",
+ 'title' => $this->mParams['tooltips'][$rowLabel],
+ );
+ $rowLabel .= ' ' . Html::element( 'span', $tooltipAttribs, '' );
+ }
$rowContents = Html::rawElement( 'td', array(), $rowLabel );
foreach ( $columns as $columnTag ) {
- // Knock out any options that are not wanted
- if ( isset( $this->mParams['remove-options'] )
- && in_array( "$columnTag-$rowTag", $this->mParams['remove-options'] ) )
- {
- $rowContents .= Html::rawElement( 'td', array(), '&#160;' );
- } else {
- // Construct the checkbox
- $thisAttribs = array(
- 'id' => "{$this->mID}-$columnTag-$rowTag",
- 'value' => $columnTag . '-' . $rowTag
- );
- $checkbox = Xml::check(
- $this->mName . '[]',
- in_array( $columnTag . '-' . $rowTag, (array)$value, true ),
- $attribs + $thisAttribs );
- $rowContents .= Html::rawElement( 'td', array(), $checkbox );
+ $thisTag = "$columnTag-$rowTag";
+ // Construct the checkbox
+ $thisAttribs = array(
+ 'id' => "{$this->mID}-$thisTag",
+ 'value' => $thisTag,
+ );
+ $checked = in_array( $thisTag, (array)$value, true );
+ if ( $this->isTagForcedOff( $thisTag ) ) {
+ $checked = false;
+ $thisAttribs['disabled'] = 1;
+ } elseif ( $this->isTagForcedOn( $thisTag ) ) {
+ $checked = true;
+ $thisAttribs['disabled'] = 1;
}
+ $rowContents .= Html::rawElement(
+ 'td',
+ array(),
+ Xml::check( "{$this->mName}[]", $checked, $attribs + $thisAttribs )
+ );
}
$tableContents .= Html::rawElement( 'tr', array(), "\n$rowContents\n" );
}
@@ -1880,6 +2149,16 @@ class HTMLCheckMatrix extends HTMLFormField {
return $html;
}
+ protected function isTagForcedOff( $tag ) {
+ return isset( $this->mParams['force-options-off'] )
+ && in_array( $tag, $this->mParams['force-options-off'] );
+ }
+
+ protected function isTagForcedOn( $tag ) {
+ return isset( $this->mParams['force-options-on'] )
+ && in_array( $tag, $this->mParams['force-options-on'] );
+ }
+
/**
* Get the complete table row for the input, including help text,
* labels, and whatever.
@@ -1944,6 +2223,27 @@ class HTMLCheckMatrix extends HTMLFormField {
return array();
}
}
+
+ function filterDataForSubmit( $data ) {
+ $columns = HTMLFormField::flattenOptions( $this->mParams['columns'] );
+ $rows = HTMLFormField::flattenOptions( $this->mParams['rows'] );
+ $res = array();
+ foreach ( $columns as $column ) {
+ foreach ( $rows as $row ) {
+ // Make sure option hasn't been forced
+ $thisTag = "$column-$row";
+ if ( $this->isTagForcedOff( $thisTag ) ) {
+ $res[$thisTag] = false;
+ } elseif ( $this->isTagForcedOn( $thisTag ) ) {
+ $res[$thisTag] = true;
+ } else {
+ $res[$thisTag] = in_array( $thisTag, $data );
+ }
+ }
+ }
+
+ return $res;
+ }
}
/**
@@ -1959,10 +2259,11 @@ class HTMLSelectField extends HTMLFormField {
$validOptions = HTMLFormField::flattenOptions( $this->mParams['options'] );
- if ( in_array( $value, $validOptions ) )
+ if ( in_array( $value, $validOptions ) ) {
return true;
- else
+ } else {
return $this->msg( 'htmlform-select-badoption' )->parse();
+ }
}
function getInputHTML( $value ) {
@@ -1996,7 +2297,6 @@ class HTMLSelectField extends HTMLFormField {
* Select dropdown field, with an additional "other" textbox.
*/
class HTMLSelectOrOtherField extends HTMLTextField {
- static $jsAdded = false;
function __construct( $params ) {
if ( !in_array( 'other', $params['options'], true ) ) {
@@ -2085,7 +2385,7 @@ class HTMLSelectOrOtherField extends HTMLTextField {
/**
* Multi-select field
*/
-class HTMLMultiSelectField extends HTMLFormField {
+class HTMLMultiSelectField extends HTMLFormField implements HTMLNestedFilterable {
function validate( $value, $alldata ) {
$p = parent::validate( $value, $alldata );
@@ -2178,6 +2478,17 @@ class HTMLMultiSelectField extends HTMLFormField {
}
}
+ function filterDataForSubmit( $data ) {
+ $options = HTMLFormField::flattenOptions( $this->mParams['options'] );
+
+ $res = array();
+ foreach ( $options as $opt ) {
+ $res["$opt"] = in_array( $opt, $data );
+ }
+
+ return $res;
+ }
+
protected function needsLabel() {
return false;
}
@@ -2512,14 +2823,28 @@ class HTMLHiddenField extends HTMLFormField {
return $this->getTableRow( $value );
}
- 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 {
+class HTMLSubmitField extends HTMLButtonField {
+ protected $buttonType = 'submit';
+}
+
+/**
+ * Adds a generic button inline to the form. Does not do anything, you must add
+ * click handling code in JavaScript. Use a HTMLSubmitField if you merely
+ * wish to add a submit button to a form.
+ *
+ * @since 1.22
+ */
+class HTMLButtonField extends HTMLFormField {
+ protected $buttonType = 'button';
public function __construct( $info ) {
$info['nodata'] = true;
@@ -2527,13 +2852,20 @@ class HTMLSubmitField extends HTMLFormField {
}
public function getInputHTML( $value ) {
- return Xml::submitButton(
+ $attr = array(
+ 'class' => 'mw-htmlform-submit ' . $this->mClass,
+ 'id' => $this->mID,
+ );
+
+ if ( !empty( $this->mParams['disabled'] ) ) {
+ $attr['disabled'] = 'disabled';
+ }
+
+ return Html::input(
+ $this->mName,
$value,
- array(
- 'class' => 'mw-htmlform-submit ' . $this->mClass,
- 'name' => $this->mName,
- 'id' => $this->mID,
- )
+ $this->buttonType,
+ $attr
);
}
@@ -2612,3 +2944,22 @@ class HTMLApiField extends HTMLFormField {
return '';
}
}
+
+interface HTMLNestedFilterable {
+ /**
+ * Support for seperating multi-option preferences into multiple preferences
+ * Due to lack of array support.
+ * @param $data array
+ */
+ function filterDataForSubmit( $data );
+}
+
+class HTMLFormFieldRequiredOptionsException extends MWException {
+ public function __construct( HTMLFormField $field, array $missing ) {
+ parent::__construct( sprintf(
+ "Form type `%s` expected the following parameters to be set: %s",
+ get_class( $field ),
+ implode( ', ', $missing )
+ ) );
+ }
+}
diff --git a/includes/HashRing.php b/includes/HashRing.php
new file mode 100644
index 00000000..930f8c0a
--- /dev/null
+++ b/includes/HashRing.php
@@ -0,0 +1,142 @@
+<?php
+/**
+ * Convenience class for weighted consistent hash rings.
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with this program; if not, write 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 Aaron Schulz
+ */
+
+/**
+ * Convenience class for weighted consistent hash rings
+ *
+ * @since 1.22
+ */
+class HashRing {
+ /** @var Array (location => weight) */
+ protected $sourceMap = array();
+ /** @var Array (location => (start, end)) */
+ protected $ring = array();
+
+ const RING_SIZE = 268435456; // 2^28
+
+ /**
+ * @param array $map (location => weight)
+ */
+ public function __construct( array $map ) {
+ $map = array_filter( $map, function( $w ) { return $w > 0; } );
+ if ( !count( $map ) ) {
+ throw new MWException( "Ring is empty or all weights are zero." );
+ }
+ $this->sourceMap = $map;
+ // Sort the locations based on the hash of their names
+ $hashes = array();
+ foreach ( $map as $location => $weight ) {
+ $hashes[$location] = sha1( $location );
+ }
+ uksort( $map, function ( $a, $b ) use ( $hashes ) {
+ return strcmp( $hashes[$a], $hashes[$b] );
+ } );
+ // Fit the map to weight-proportionate one with a space of size RING_SIZE
+ $sum = array_sum( $map );
+ $standardMap = array();
+ foreach ( $map as $location => $weight ) {
+ $standardMap[$location] = (int)floor( $weight / $sum * self::RING_SIZE );
+ }
+ // Build a ring of RING_SIZE spots, with each location at a spot in location hash order
+ $index = 0;
+ foreach ( $standardMap as $location => $weight ) {
+ // Location covers half-closed interval [$index,$index + $weight)
+ $this->ring[$location] = array( $index, $index + $weight );
+ $index += $weight;
+ }
+ // Make sure the last location covers what is left
+ end( $this->ring );
+ $this->ring[key( $this->ring )][1] = self::RING_SIZE;
+ }
+
+ /**
+ * Get the location of an item on the ring
+ *
+ * @param string $item
+ * @return string Location
+ */
+ public function getLocation( $item ) {
+ $locations = $this->getLocations( $item, 1 );
+ return $locations[0];
+ }
+
+ /**
+ * Get the location of an item on the ring, as well as the next clockwise locations
+ *
+ * @param string $item
+ * @param integer $limit Maximum number of locations to return
+ * @return array List of locations
+ */
+ public function getLocations( $item, $limit ) {
+ $locations = array();
+ $primaryLocation = null;
+ $spot = hexdec( substr( sha1( $item ), 0, 7 ) ); // first 28 bits
+ foreach ( $this->ring as $location => $range ) {
+ if ( count( $locations ) >= $limit ) {
+ break;
+ }
+ // The $primaryLocation is the location the item spot is in.
+ // After that is reached, keep appending the next locations.
+ if ( ( $range[0] <= $spot && $spot < $range[1] ) || $primaryLocation !== null ) {
+ if ( $primaryLocation === null ) {
+ $primaryLocation = $location;
+ }
+ $locations[] = $location;
+ }
+ }
+ // If more locations are requested, wrap-around and keep adding them
+ reset( $this->ring );
+ while ( count( $locations ) < $limit ) {
+ list( $location, ) = each( $this->ring );
+ if ( $location === $primaryLocation ) {
+ break; // don't go in circles
+ }
+ $locations[] = $location;
+ }
+ return $locations;
+ }
+
+ /**
+ * Get the map of locations to weight (ignores 0-weight items)
+ *
+ * @return array
+ */
+ public function getLocationWeights() {
+ return $this->sourceMap;
+ }
+
+ /**
+ * Get a new hash ring with a location removed from the ring
+ *
+ * @param string $location
+ * @return HashRing|bool Returns false if no non-zero weighted spots are left
+ */
+ public function newWithoutLocation( $location ) {
+ $map = $this->sourceMap;
+ unset( $map[$location] );
+ if ( count( $map ) ) {
+ return new self( $map );
+ }
+ return false;
+ }
+}
diff --git a/includes/HistoryBlob.php b/includes/HistoryBlob.php
index 1af733a2..31aa0f87 100644
--- a/includes/HistoryBlob.php
+++ b/includes/HistoryBlob.php
@@ -143,7 +143,7 @@ class ConcatenatedGzipHistoryBlob implements HistoryBlob
* Compress the bulk data in the object
*/
public function compress() {
- if ( !$this->mCompressed ) {
+ if ( !$this->mCompressed ) {
$this->mItems = gzdeflate( serialize( $this->mItems ) );
$this->mCompressed = true;
}
@@ -231,16 +231,16 @@ class HistoryBlobStub {
* @return string
*/
function getText() {
- if( isset( self::$blobCache[$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 ) );
- if( !$row ) {
+ if ( !$row ) {
return false;
}
$flags = explode( ',', $row->old_flags );
- if( in_array( 'external', $flags ) ) {
+ if ( in_array( 'external', $flags ) ) {
$url = $row->old_text;
$parts = explode( '://', $url, 2 );
if ( !isset( $parts[1] ) || $parts[1] == '' ) {
@@ -249,11 +249,11 @@ class HistoryBlobStub {
$row->old_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 ) ) {
// This shouldn't happen, but a bug in the compress script
// may at times gzip-compress a HistoryBlob object row.
$obj = unserialize( gzinflate( $row->old_text ) );
@@ -261,7 +261,7 @@ class HistoryBlobStub {
$obj = unserialize( $row->old_text );
}
- if( !is_object( $obj ) ) {
+ if ( !is_object( $obj ) ) {
// Correct for old double-serialization bug.
$obj = unserialize( $obj );
}
@@ -318,7 +318,7 @@ class HistoryBlobCurStub {
function getText() {
$dbr = wfGetDB( DB_SLAVE );
$row = $dbr->selectRow( 'cur', array( 'cur_text' ), array( 'cur_id' => $this->mCurId ) );
- if( !$row ) {
+ if ( !$row ) {
return false;
}
return $row->cur_text;
@@ -530,7 +530,7 @@ class DiffHistoryBlob implements HistoryBlob {
$header = unpack( 'Vofp/Vcsize', substr( $diff, 0, 8 ) );
- # Check the checksum if hash/mhash is available
+ # Check the checksum if hash extension is available
$ofp = $this->xdiffAdler32( $base );
if ( $ofp !== false && $ofp !== substr( $diff, 0, 4 ) ) {
wfDebug( __METHOD__ . ": incorrect base checksum\n" );
@@ -577,24 +577,23 @@ class DiffHistoryBlob implements HistoryBlob {
* Compute a binary "Adler-32" checksum as defined by LibXDiff, i.e. with
* the bytes backwards and initialised with 0 instead of 1. See bug 34428.
*
- * Returns false if no hashing library is available
+ * @param string $s
+ * @return string|bool: false if the hash extension is not available
*/
function xdiffAdler32( $s ) {
+ if ( !function_exists( 'hash' ) ) {
+ return false;
+ }
+
static $init;
if ( $init === null ) {
$init = str_repeat( "\xf0", 205 ) . "\xee" . str_repeat( "\xf0", 67 ) . "\x02";
}
+
// The real Adler-32 checksum of $init is zero, so it initialises the
// state to zero, as it is at the start of LibXDiff's checksum
// algorithm. Appending the subject string then simulates LibXDiff.
- if ( function_exists( 'hash' ) ) {
- $hash = hash( 'adler32', $init . $s, true );
- } elseif ( function_exists( 'mhash' ) ) {
- $hash = mhash( MHASH_ADLER32, $init . $s );
- } else {
- return false;
- }
- return strrev( $hash );
+ return strrev( hash( 'adler32', $init . $s, true ) );
}
function uncompress() {
diff --git a/includes/Hooks.php b/includes/Hooks.php
index 8cc7acea..396e360d 100644
--- a/includes/Hooks.php
+++ b/includes/Hooks.php
@@ -1,4 +1,5 @@
<?php
+
/**
* A tool for running hook functions.
*
@@ -37,40 +38,43 @@ class MWHookException extends MWException {}
*/
class Hooks {
+ /**
+ * Array of events mapped to an array of callbacks to be run
+ * when that event is triggered.
+ */
protected static $handlers = array();
/**
- * Clears hooks registered via Hooks::register(). Does not touch $wgHooks.
- * This is intended for use while testing and will fail if MW_PHPUNIT_TEST is not defined.
+ * Attach an event handler to a given hook.
*
- * @since 1.21
- *
- * @param string $name the name of the hook to clear.
+ * @param string $name Name of hook
+ * @param mixed $callback Callback function to attach
*
- * @throws MWException if not in testing mode.
+ * @since 1.18
*/
- public static function clear( $name ) {
- if ( !defined( 'MW_PHPUNIT_TEST' ) ) {
- throw new MWException( 'can not reset hooks in operation.' );
+ public static function register( $name, $callback ) {
+ if ( !isset( self::$handlers[$name] ) ) {
+ self::$handlers[$name] = array();
}
- unset( self::$handlers[$name] );
+ self::$handlers[$name][] = $callback;
}
/**
- * Attach an event handler to a given hook
+ * Clears hooks registered via Hooks::register(). Does not touch $wgHooks.
+ * This is intended for use while testing and will fail if MW_PHPUNIT_TEST is not defined.
*
- * @since 1.18
+ * @param string $name the name of the hook to clear.
*
- * @param string $name name of hook
- * @param $callback Mixed: callback function to attach
+ * @since 1.21
+ * @throws MWException if not in testing mode.
*/
- public static function register( $name, $callback ) {
- if( !isset( self::$handlers[$name] ) ) {
- self::$handlers[$name] = array();
+ public static function clear( $name ) {
+ if ( !defined( 'MW_PHPUNIT_TEST' ) ) {
+ throw new MWException( 'Cannot reset hooks in operation.' );
}
- self::$handlers[$name][] = $callback;
+ unset( self::$handlers[$name] );
}
/**
@@ -79,216 +83,139 @@ class Hooks {
*
* @since 1.18
*
- * @param string $name name of hook
- * @return Boolean: true if the hook has a function registered to it
+ * @param string $name Name of hook
+ * @return bool True if the hook has a function registered to it
*/
public static function isRegistered( $name ) {
global $wgHooks;
-
return !empty( $wgHooks[$name] ) || !empty( self::$handlers[$name] );
}
/**
* Returns an array of all the event functions attached to a hook
* This combines functions registered via Hooks::register and with $wgHooks.
- * @since 1.18
*
- * @throws MWException
- * @throws FatalError
- * @param string $name name of the hook
+ * @since 1.18
*
+ * @param string $name Name of the hook
* @return array
*/
public static function getHandlers( $name ) {
global $wgHooks;
- // Return quickly in the most common case
- if ( empty( self::$handlers[$name] ) && empty( $wgHooks[$name] ) ) {
+ if ( !self::isRegistered( $name ) ) {
return array();
- }
-
- if ( !is_array( self::$handlers ) ) {
- throw new MWException( "Local hooks array is not an array!\n" );
- }
-
- if ( !is_array( $wgHooks ) ) {
- throw new MWException( "Global hooks array is not an array!\n" );
- }
-
- if ( empty( Hooks::$handlers[$name] ) ) {
- $hooks = $wgHooks[$name];
- } elseif ( empty( $wgHooks[$name] ) ) {
- $hooks = Hooks::$handlers[$name];
+ } elseif ( !isset( self::$handlers[$name] ) ) {
+ return $wgHooks[$name];
+ } elseif ( !isset( $wgHooks[$name] ) ) {
+ return self::$handlers[$name];
} else {
- // so they are both not empty...
- $hooks = array_merge( Hooks::$handlers[$name], $wgHooks[$name] );
+ return array_merge( self::$handlers[$name], $wgHooks[$name] );
}
-
- if ( !is_array( $hooks ) ) {
- throw new MWException( "Hooks array for event '$name' is not an array!\n" );
- }
-
- return $hooks;
}
/**
- * Call hook functions defined in Hooks::register
+ * Call hook functions defined in Hooks::register and $wgHooks.
*
- * @param string $event event name
- * @param $args Array: parameters passed to hook functions
+ * For a certain hook event, fetch the array of hook events and
+ * process them. Determine the proper callback for each hook and
+ * then call the actual hook using the appropriate arguments.
+ * Finally, process the return value and return/throw accordingly.
*
+ * @param string $event Event name
+ * @param array $args Array of parameters passed to hook functions
+ * @return bool True if no handler aborted the hook
+ *
+ * @since 1.22 A hook function is not required to return a value for
+ * processing to continue. Not returning a value (or explicitly
+ * returning null) is equivalent to returning true.
* @throws MWException
* @throws FatalError
- * @return Boolean True if no handler aborted the hook
*/
- public static function run( $event, $args = array() ) {
- global $wgHooks;
-
- // Return quickly in the most common case
- if ( empty( self::$handlers[$event] ) && empty( $wgHooks[$event] ) ) {
- return true;
- }
-
+ public static function run( $event, array $args = array() ) {
wfProfileIn( 'hook: ' . $event );
- $hooks = self::getHandlers( $event );
+ foreach ( self::getHandlers( $event ) as $hook ) {
+ // Turn non-array values into an array. (Can't use casting because of objects.)
+ if ( !is_array( $hook ) ) {
+ $hook = array( $hook );
+ }
- foreach ( $hooks as $hook ) {
- $object = null;
- $method = null;
- $func = null;
- $data = null;
- $have_data = false;
- $closure = false;
- $badhookmsg = false;
+ if ( !array_filter( $hook ) ) {
+ // Either array is empty or it's an array filled with null/false/empty.
+ continue;
+ } elseif ( is_array( $hook[0] ) ) {
+ // First element is an array, meaning the developer intended
+ // the first element to be a callback. Merge it in so that
+ // processing can be uniform.
+ $hook = array_merge( $hook[0], array_slice( $hook, 1 ) );
+ }
/**
* $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 array of object, method, and data.
*/
- if ( is_array( $hook ) ) {
- if ( count( $hook ) < 1 ) {
- throw new MWException( 'Empty array in hooks for ' . $event . "\n" );
- } elseif ( is_object( $hook[0] ) ) {
- $object = $hook[0];
- if ( $object instanceof Closure ) {
- $closure = true;
- if ( count( $hook ) > 1 ) {
- $data = $hook[1];
- $have_data = true;
- }
- } else {
- if ( count( $hook ) < 2 ) {
- $method = 'on' . $event;
- } else {
- $method = $hook[1];
- if ( count( $hook ) > 2 ) {
- $data = $hook[2];
- $have_data = true;
- }
- }
- }
- } elseif ( is_string( $hook[0] ) ) {
- $func = $hook[0];
- if ( count( $hook ) > 1) {
- $data = $hook[1];
- $have_data = true;
- }
- } else {
- throw new MWException( 'Unknown datatype in hooks for ' . $event . "\n" );
- }
- } elseif ( is_string( $hook ) ) { # functions look like strings, too
- $func = $hook;
- } elseif ( is_object( $hook ) ) {
- $object = $hook;
- if ( $object instanceof Closure ) {
- $closure = true;
- } else {
- $method = "on" . $event;
+ if ( $hook[0] instanceof Closure ) {
+ $func = "hook-$event-closure";
+ $callback = array_shift( $hook );
+ } elseif ( is_object( $hook[0] ) ) {
+ $object = array_shift( $hook );
+ $method = array_shift( $hook );
+
+ // If no method was specified, default to on$event.
+ if ( $method === null ) {
+ $method = "on$event";
}
- } else {
- throw new MWException( 'Unknown datatype in hooks for ' . $event . "\n" );
- }
-
- /* We put the first data element on, if needed. */
- if ( $have_data ) {
- $hook_args = array_merge( array( $data ), $args );
- } else {
- $hook_args = $args;
- }
- if ( $closure ) {
- $callback = $object;
- $func = "hook-$event-closure";
- } elseif ( isset( $object ) ) {
$func = get_class( $object ) . '::' . $method;
$callback = array( $object, $method );
+ } elseif ( is_string( $hook[0] ) ) {
+ $func = $callback = array_shift( $hook );
} else {
- $callback = $func;
+ throw new MWException( 'Unknown datatype in hooks for ' . $event . "\n" );
}
// Run autoloader (workaround for call_user_func_array bug)
- is_callable( $callback );
+ // and throw error if not callable.
+ if ( !is_callable( $callback ) ) {
+ throw new MWException( 'Invalid callback in hooks for ' . $event . "\n" );
+ }
- /**
- * 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.
+ /*
+ * Call the hook. The documentation of call_user_func_array says
+ * false is returned on failure. However, if the function signature
+ * does not match the call signature, PHP will issue an warning and
+ * return null instead. The following code catches that warning and
+ * provides better error message.
*/
$retval = null;
- set_error_handler( 'Hooks::hookErrorHandler' );
+ $badhookmsg = null;
+ $hook_args = array_merge( $hook, $args );
+
+ // Profile first in case the Profiler causes errors.
wfProfileIn( $func );
+ set_error_handler( 'Hooks::hookErrorHandler' );
try {
$retval = call_user_func_array( $callback, $hook_args );
} catch ( MWHookException $e ) {
$badhookmsg = $e->getMessage();
}
- wfProfileOut( $func );
restore_error_handler();
+ wfProfileOut( $func );
- /* String return is an error; false return means stop processing. */
+ // Process the return value.
if ( is_string( $retval ) ) {
+ // String returned means error.
throw new FatalError( $retval );
- } elseif( $retval === null ) {
- if ( $closure ) {
- $prettyFunc = "$event closure";
- } elseif( is_array( $callback ) ) {
- if( is_object( $callback[0] ) ) {
- $prettyClass = get_class( $callback[0] );
- } else {
- $prettyClass = strval( $callback[0] );
- }
- $prettyFunc = $prettyClass . '::' . strval( $callback[1] );
- } else {
- $prettyFunc = strval( $callback );
- }
- 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.'
- );
- }
- } elseif ( !$retval ) {
+ } elseif ( $badhookmsg !== null ) {
+ // Exception was thrown from Hooks::hookErrorHandler.
+ throw new MWException(
+ 'Detected bug in an extension! ' .
+ "Hook $func has invalid call signature; " . $badhookmsg
+ );
+ } elseif ( $retval === false ) {
wfProfileOut( 'hook: ' . $event );
+ // False was returned. Stop processing, but no error.
return false;
}
}
@@ -298,18 +225,21 @@ class Hooks {
}
/**
+ * Handle PHP errors issued inside a hook. Catch errors that have to do with
+ * a function expecting a reference, and let all others pass through.
+ *
* This REALLY should be protected... but it's public for compatibility
*
* @since 1.18
*
- * @param int $errno Unused
- * @param string $errstr error message
- * @throws MWHookException
- * @return Boolean: false
+ * @param int $errno Error number (unused)
+ * @param string $errstr Error message
+ * @throws MWHookException If the error has to do with the function signature
+ * @return bool Always returns false
*/
public static function hookErrorHandler( $errno, $errstr ) {
if ( strpos( $errstr, 'expected to be a reference, value given' ) !== false ) {
- throw new MWHookException( $errstr );
+ throw new MWHookException( $errstr, $errno );
}
return false;
}
diff --git a/includes/Html.php b/includes/Html.php
index af4b4bbf..932f753e 100644
--- a/includes/Html.php
+++ b/includes/Html.php
@@ -36,8 +36,8 @@
*
* There are two important configuration options this class uses:
*
- * $wgHtml5: If this is set to false, then all output should be valid XHTML 1.0
- * Transitional.
+ * $wgMimeType: If this is set to an xml mimetype then output should be
+ * valid XHTML5.
* $wgWellFormedXml: If this is set to true, then all output should be
* well-formed XML (quotes on attributes, self-closing tags, etc.).
*
@@ -101,19 +101,6 @@ class Html {
'itemscope',
);
- private static $HTMLFiveOnlyAttribs = array(
- 'autocomplete',
- 'autofocus',
- 'max',
- 'min',
- 'multiple',
- 'pattern',
- 'placeholder',
- 'required',
- 'step',
- 'spellcheck',
- );
-
/**
* Returns an HTML element in a string. The major advantage here over
* manually typing out the HTML is that it will escape all attribute
@@ -177,7 +164,7 @@ class Html {
* @return string
*/
public static function openElement( $element, $attribs = array() ) {
- global $wgHtml5, $wgWellFormedXml;
+ global $wgWellFormedXml;
$attribs = (array)$attribs;
// This is not required in HTML5, but let's do it anyway, for
// consistency and better compression.
@@ -185,7 +172,7 @@ class Html {
// 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>
+ // <http://www.whatwg.org/html/syntax.html#optional-tags>
if ( !$wgWellFormedXml && !$attribs
&& in_array( $element, array( 'html', 'head' ) ) ) {
return '';
@@ -204,36 +191,28 @@ class Html {
'image',
'reset',
'button',
- );
- // Allow more input types in HTML5 mode
- if( $wgHtml5 ) {
- $validTypes = array_merge( $validTypes, array(
- 'datetime',
- 'datetime-local',
- 'date',
- 'month',
- 'time',
- 'week',
- 'number',
- 'range',
- 'email',
- 'url',
- 'search',
- 'tel',
- 'color',
- ) );
- }
+ // HTML input types
+ 'datetime',
+ 'datetime-local',
+ 'date',
+ 'month',
+ 'time',
+ 'week',
+ 'number',
+ 'range',
+ 'email',
+ 'url',
+ 'search',
+ 'tel',
+ 'color',
+ );
if ( isset( $attribs['type'] )
&& !in_array( $attribs['type'], $validTypes ) ) {
unset( $attribs['type'] );
}
}
- if ( !$wgHtml5 && $element == 'textarea' && isset( $attribs['maxlength'] ) ) {
- unset( $attribs['maxlength'] );
- }
-
// According to standard the default type for <button> elements is "submit".
// Depending on compatibility mode IE might use "button", instead.
// We enforce the standard "submit".
@@ -259,7 +238,7 @@ class Html {
$element = strtolower( $element );
// Reference:
- // http://www.whatwg.org/specs/web-apps/current-work/multipage/syntax.html#optional-tags
+ // http://www.whatwg.org/html/syntax.html#optional-tags
if ( !$wgWellFormedXml && in_array( $element, array(
'html',
'head',
@@ -294,12 +273,6 @@ class Html {
* @return array An array of attributes functionally identical to $attribs
*/
private static function dropDefaults( $element, $attribs ) {
- // Don't bother doing anything if we aren't outputting HTML5; it's too
- // much of a pain to maintain two sets of defaults.
- global $wgHtml5;
- if ( !$wgHtml5 ) {
- return $attribs;
- }
// Whenever altering this array, please provide a covering test case
// in HtmlTest::provideElementsWithAttributesHavingDefaultValues
@@ -340,7 +313,7 @@ class Html {
foreach ( $attribs as $attrib => $value ) {
$lcattrib = strtolower( $attrib );
- if( is_array( $value ) ) {
+ if ( is_array( $value ) ) {
$value = implode( ' ', $value );
} else {
$value = strval( $value );
@@ -444,11 +417,12 @@ class Html {
* (starting with a space if at least one attribute is output)
*/
public static function expandAttributes( $attribs ) {
- global $wgHtml5, $wgWellFormedXml;
+ global $wgWellFormedXml;
$ret = '';
$attribs = (array)$attribs;
foreach ( $attribs as $key => $value ) {
+ // Support intuitive array( 'checked' => true/false ) form
if ( $value === false || is_null( $value ) ) {
continue;
}
@@ -460,15 +434,10 @@ class Html {
$key = $value;
}
- // Not technically required in HTML5, but required in XHTML 1.0,
- // and we'd like consistency and better compression anyway.
+ // Not technically required in HTML5 but we'd like consistency
+ // and better compression anyway.
$key = strtolower( $key );
- // Here we're blacklisting some HTML5-only attributes...
- if ( !$wgHtml5 && in_array( $key, self::$HTMLFiveOnlyAttribs ) ) {
- continue;
- }
-
// Bug 23769: Blacklist all form validation attributes for now. Current
// (June 2010) WebKit has no UI, so the form just refuses to submit
// without telling the user why, which is much worse than failing
@@ -552,15 +521,12 @@ class Html {
}
if ( in_array( $key, self::$boolAttribs ) ) {
- // In XHTML 1.0 Transitional, the value needs to be equal to the
- // key. In HTML5, we can leave the value empty instead. If we
- // don't need well-formed XML, we can omit the = entirely.
+ // In HTML5, we can leave the value empty. If we don't need
+ // well-formed XML, we can omit the = entirely.
if ( !$wgWellFormedXml ) {
$ret .= " $key";
- } elseif ( $wgHtml5 ) {
- $ret .= " $key=\"\"";
} else {
- $ret .= " $key=\"$key\"";
+ $ret .= " $key=\"\"";
}
} else {
// Apparently we need to entity-encode \n, \r, \t, although the
@@ -602,14 +568,10 @@ class Html {
* @return string Raw HTML
*/
public static function inlineScript( $contents ) {
- global $wgHtml5, $wgJsMimeType, $wgWellFormedXml;
+ global $wgWellFormedXml;
$attrs = array();
- if ( !$wgHtml5 ) {
- $attrs['type'] = $wgJsMimeType;
- }
-
if ( $wgWellFormedXml && preg_match( '/[<&]/', $contents ) ) {
$contents = "/*<![CDATA[*/$contents/*]]>*/";
}
@@ -625,14 +587,8 @@ class Html {
* @return string Raw HTML
*/
public static function linkedScript( $url ) {
- global $wgHtml5, $wgJsMimeType;
-
$attrs = array( 'src' => $url );
- if ( !$wgHtml5 ) {
- $attrs['type'] = $wgJsMimeType;
- }
-
return self::element( 'script', $attrs );
}
@@ -677,8 +633,7 @@ class Html {
/**
* Convenience function to produce an "<input>" element. This supports the
- * new HTML5 input types and attributes, and will silently strip them if
- * $wgHtml5 is false.
+ * new HTML5 input types and attributes.
*
* @param $name string name attribute
* @param $value mixed value attribute
@@ -712,9 +667,7 @@ class Html {
* Convenience function to produce an "<input>" element.
*
* This supports leaving out the cols= and rows= which Xml requires and are
- * required by HTML4/XHTML but not required by HTML5 and will silently set
- * cols="" and rows="" if $wgHtml5 is false and cols and rows are omitted
- * (HTML4 validates present but empty cols="" and rows="" as valid).
+ * required by HTML4/XHTML but not required by HTML5.
*
* @param $name string name attribute
* @param $value string value attribute
@@ -723,20 +676,8 @@ class Html {
* @return string Raw HTML
*/
public static function textarea( $name, $value = '', $attribs = array() ) {
- global $wgHtml5;
-
$attribs['name'] = $name;
- if ( !$wgHtml5 ) {
- if ( !isset( $attribs['cols'] ) ) {
- $attribs['cols'] = "";
- }
-
- if ( !isset( $attribs['rows'] ) ) {
- $attribs['rows'] = "";
- }
- }
-
if ( substr( $value, 0, 1 ) == "\n" ) {
// Workaround for bug 12130: browsers eat the initial newline
// assuming that it's just for show, but they do keep the later
@@ -859,28 +800,29 @@ class Html {
public static function htmlHeader( $attribs = array() ) {
$ret = '';
- global $wgMimeType;
-
- if ( self::isXmlMimeType( $wgMimeType ) ) {
- $ret .= "<?xml version=\"1.0\" encoding=\"UTF-8\" ?" . ">\n";
- }
+ global $wgHtml5Version, $wgMimeType, $wgXhtmlNamespaces;
- global $wgHtml5, $wgHtml5Version, $wgDocType, $wgDTD;
- global $wgXhtmlNamespaces, $wgXhtmlDefaultNamespace;
+ $isXHTML = self::isXmlMimeType( $wgMimeType );
- if ( $wgHtml5 ) {
- $ret .= "<!DOCTYPE html>\n";
+ if ( $isXHTML ) { // XHTML5
+ // XML mimetyped markup should have an xml header.
+ // However a DOCTYPE is not needed.
+ $ret .= "<?xml version=\"1.0\" encoding=\"UTF-8\" ?" . ">\n";
- if ( $wgHtml5Version ) {
- $attribs['version'] = $wgHtml5Version;
- }
- } else {
- $ret .= "<!DOCTYPE html PUBLIC \"$wgDocType\" \"$wgDTD\">\n";
- $attribs['xmlns'] = $wgXhtmlDefaultNamespace;
+ // Add the standard xmlns
+ $attribs['xmlns'] = 'http://www.w3.org/1999/xhtml';
+ // And support custom namespaces
foreach ( $wgXhtmlNamespaces as $tag => $ns ) {
$attribs["xmlns:$tag"] = $ns;
}
+ } else { // HTML5
+ // DOCTYPE
+ $ret .= "<!DOCTYPE html>\n";
+ }
+
+ if ( $wgHtml5Version ) {
+ $attribs['version'] = $wgHtml5Version;
}
$html = Html::openElement( 'html', $attribs );
@@ -901,14 +843,11 @@ class Html {
* @return Boolean
*/
public static function isXmlMimeType( $mimetype ) {
- switch ( $mimetype ) {
- case 'text/xml':
- case 'application/xhtml+xml':
- case 'application/xml':
- return true;
- default:
- return false;
- }
+ # http://www.whatwg.org/html/infrastructure.html#xml-mime-type
+ # * text/xml
+ # * application/xml
+ # * Any mimetype with a subtype ending in +xml (this implicitly includes application/xhtml+xml)
+ return (bool)preg_match( '!^(text|application)/xml$|^.+/.+\+xml$!', $mimetype );
}
/**
@@ -926,22 +865,22 @@ class Html {
global $wgStylePath;
if ( $useStylePath ) {
- $icon = $wgStylePath.'/common/images/'.$icon;
+ $icon = $wgStylePath . '/common/images/' . $icon;
}
$s = Html::openElement( 'div', array( 'class' => "mw-infobox $class" ) );
- $s .= Html::openElement( 'div', array( 'class' => 'mw-infobox-left' ) ).
+ $s .= Html::openElement( 'div', array( 'class' => 'mw-infobox-left' ) ) .
Html::element( 'img',
array(
'src' => $icon,
'alt' => $alt,
)
- ).
+ ) .
Html::closeElement( 'div' );
- $s .= Html::openElement( 'div', array( 'class' => 'mw-infobox-right' ) ).
- $text.
+ $s .= Html::openElement( 'div', array( 'class' => 'mw-infobox-right' ) ) .
+ $text .
Html::closeElement( 'div' );
$s .= Html::element( 'div', array( 'style' => 'clear: left;' ), ' ' );
@@ -962,9 +901,9 @@ class Html {
*/
static function srcSet( $urls ) {
$candidates = array();
- foreach( $urls as $density => $url ) {
+ foreach ( $urls as $density => $url ) {
// Image candidate syntax per current whatwg live spec, 2012-09-23:
- // http://www.whatwg.org/specs/web-apps/current-work/multipage/embedded-content-1.html#attr-img-srcset
+ // http://www.whatwg.org/html/embedded-content-1.html#attr-img-srcset
$candidates[] = "{$url} {$density}x";
}
return implode( ", ", $candidates );
diff --git a/includes/HtmlFormatter.php b/includes/HtmlFormatter.php
new file mode 100644
index 00000000..248a76fe
--- /dev/null
+++ b/includes/HtmlFormatter.php
@@ -0,0 +1,356 @@
+<?php
+/**
+ * Performs transformations of HTML by wrapping around libxml2 and working
+ * around its countless bugs.
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with this program; if not, write 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 HtmlFormatter {
+ /**
+ * @var DOMDocument
+ */
+ private $doc;
+
+ private $html;
+ private $itemsToRemove = array();
+ private $elementsToFlatten = array();
+ protected $removeMedia = false;
+
+ /**
+ * Constructor
+ *
+ * @param string $html: Text to process
+ */
+ public function __construct( $html ) {
+ $this->html = $html;
+ }
+
+ /**
+ * Turns a chunk of HTML into a proper document
+ * @param string $html
+ * @return string
+ */
+ public static function wrapHTML( $html ) {
+ return '<!doctype html><html><head></head><body>' . $html . '</body></html>';
+ }
+
+ /**
+ * Override this in descendant class to modify HTML after it has been converted from DOM tree
+ * @param string $html: HTML to process
+ * @return string: Processed HTML
+ */
+ protected function onHtmlReady( $html ) {
+ return $html;
+ }
+
+ /**
+ * @return DOMDocument: DOM to manipulate
+ */
+ public function getDoc() {
+ if ( !$this->doc ) {
+ $html = mb_convert_encoding( $this->html, 'HTML-ENTITIES', 'UTF-8' );
+
+ // Workaround for bug that caused spaces before references
+ // to disappear during processing:
+ // https://bugzilla.wikimedia.org/show_bug.cgi?id=53086
+ //
+ // Please replace with a better fix if one can be found.
+ $html = str_replace( ' <', '&#32;<', $html );
+
+ libxml_use_internal_errors( true );
+ $loader = libxml_disable_entity_loader();
+ $this->doc = new DOMDocument();
+ $this->doc->strictErrorChecking = false;
+ $this->doc->loadHTML( $html );
+ libxml_disable_entity_loader( $loader );
+ libxml_use_internal_errors( false );
+ $this->doc->encoding = 'UTF-8';
+ }
+ return $this->doc;
+ }
+
+ /**
+ * Sets whether images/videos/sounds should be removed from output
+ * @param bool $flag
+ */
+ public function setRemoveMedia( $flag = true ) {
+ $this->removeMedia = $flag;
+ }
+
+ /**
+ * Adds one or more selector of content to remove. A subset of CSS selector
+ * syntax is supported:
+ *
+ * <tag>
+ * <tag>.class
+ * .<class>
+ * #<id>
+ *
+ * @param Array|string $selectors: Selector(s) of stuff to remove
+ */
+ public function remove( $selectors ) {
+ $this->itemsToRemove = array_merge( $this->itemsToRemove, (array)$selectors );
+ }
+
+ /**
+ * Adds one or more element name to the list to flatten (remove tag, but not its content)
+ * Can accept undelimited regexes
+ *
+ * Note this interface may fail in surprising unexpected ways due to usage of regexes,
+ * so should not be relied on for HTML markup security measures.
+ *
+ * @param Array|string $elements: Name(s) of tag(s) to flatten
+ */
+ public function flatten( $elements ) {
+ $this->elementsToFlatten = array_merge( $this->elementsToFlatten, (array)$elements );
+ }
+
+ /**
+ * Instructs the formatter to flatten all tags
+ */
+ public function flattenAllTags() {
+ $this->flatten( '[?!]?[a-z0-9]+' );
+ }
+
+ /**
+ * Removes content we've chosen to remove
+ */
+ public function filterContent() {
+ wfProfileIn( __METHOD__ );
+ $removals = $this->parseItemsToRemove();
+
+ if ( !$removals ) {
+ wfProfileOut( __METHOD__ );
+ return;
+ }
+
+ $doc = $this->getDoc();
+
+ // Remove tags
+
+ // You can't remove DOMNodes from a DOMNodeList as you're iterating
+ // over them in a foreach loop. It will seemingly leave the internal
+ // iterator on the foreach out of wack and results will be quite
+ // strange. Though, making a queue of items to remove seems to work.
+ $domElemsToRemove = array();
+ foreach ( $removals['TAG'] as $tagToRemove ) {
+ $tagToRemoveNodes = $doc->getElementsByTagName( $tagToRemove );
+ foreach ( $tagToRemoveNodes as $tagToRemoveNode ) {
+ if ( $tagToRemoveNode ) {
+ $domElemsToRemove[] = $tagToRemoveNode;
+ }
+ }
+ }
+
+ $this->removeElements( $domElemsToRemove );
+
+ // Elements with named IDs
+ $domElemsToRemove = array();
+ foreach ( $removals['ID'] as $itemToRemove ) {
+ $itemToRemoveNode = $doc->getElementById( $itemToRemove );
+ if ( $itemToRemoveNode ) {
+ $domElemsToRemove[] = $itemToRemoveNode;
+ }
+ }
+ $this->removeElements( $domElemsToRemove );
+
+ // CSS Classes
+ $domElemsToRemove = array();
+ $xpath = new DOMXpath( $doc );
+ foreach ( $removals['CLASS'] as $classToRemove ) {
+ $elements = $xpath->query( '//*[contains(@class, "' . $classToRemove . '")]' );
+
+ /** @var $element DOMElement */
+ foreach ( $elements as $element ) {
+ $classes = $element->getAttribute( 'class' );
+ if ( preg_match( "/\b$classToRemove\b/", $classes ) && $element->parentNode ) {
+ $domElemsToRemove[] = $element;
+ }
+ }
+ }
+ $this->removeElements( $domElemsToRemove );
+
+ // Tags with CSS Classes
+ foreach ( $removals['TAG_CLASS'] as $classToRemove ) {
+ $parts = explode( '.', $classToRemove );
+
+ $elements = $xpath->query(
+ '//' . $parts[0] . '[@class="' . $parts[1] . '"]'
+ );
+
+ $this->removeElements( $elements );
+ }
+
+ wfProfileOut( __METHOD__ );
+ }
+
+ /**
+ * Removes a list of elelments from DOMDocument
+ * @param array|DOMNodeList $elements
+ */
+ private function removeElements( $elements ) {
+ $list = $elements;
+ if ( $elements instanceof DOMNodeList ) {
+ $list = array();
+ foreach ( $elements as $element ) {
+ $list[] = $element;
+ }
+ }
+ /** @var $element DOMElement */
+ foreach ( $list as $element ) {
+ if ( $element->parentNode ) {
+ $element->parentNode->removeChild( $element );
+ }
+ }
+ }
+
+ /**
+ * libxml in its usual pointlessness converts many chars to entities - this function
+ * perfoms a reverse conversion
+ * @param string $html
+ * @return string
+ */
+ private function fixLibXML( $html ) {
+ wfProfileIn( __METHOD__ );
+ static $replacements;
+ if ( ! $replacements ) {
+ // We don't include rules like '&#34;' => '&amp;quot;' because entities had already been
+ // normalized by libxml. Using this function with input not sanitized by libxml is UNSAFE!
+ $replacements = new ReplacementArray( array(
+ '&quot;' => '&amp;quot;',
+ '&amp;' => '&amp;amp;',
+ '&lt;' => '&amp;lt;',
+ '&gt;' => '&amp;gt;',
+ ) );
+ }
+ $html = $replacements->replace( $html );
+ $html = mb_convert_encoding( $html, 'UTF-8', 'HTML-ENTITIES' );
+ wfProfileOut( __METHOD__ );
+ return $html;
+ }
+
+ /**
+ * Performs final transformations and returns resulting HTML
+ *
+ * @param DOMElement|string|null $element: ID of element to get HTML from or false to get it from the whole tree
+ * @return string: Processed HTML
+ */
+ public function getText( $element = null ) {
+ wfProfileIn( __METHOD__ );
+
+ if ( $this->doc ) {
+ if ( $element !== null && !( $element instanceof DOMElement ) ) {
+ $element = $this->doc->getElementById( $element );
+ }
+ if ( $element ) {
+ $body = $this->doc->getElementsByTagName( 'body' )->item( 0 );
+ $nodesArray = array();
+ foreach ( $body->childNodes as $node ) {
+ $nodesArray[] = $node;
+ }
+ foreach ( $nodesArray as $nodeArray ) {
+ $body->removeChild( $nodeArray );
+ }
+ $body->appendChild( $element );
+ }
+ $html = $this->doc->saveHTML();
+ $html = $this->fixLibXml( $html );
+ } else {
+ $html = $this->html;
+ }
+ if ( wfIsWindows() ) {
+ // Appears to be cleanup for CRLF misprocessing of unknown origin
+ // when running server on Windows platform.
+ //
+ // If this error continues in the future, please track it down in the
+ // XML code paths if possible and fix there.
+ $html = str_replace( '&#13;', '', $html );
+ }
+ $html = preg_replace( '/<!--.*?-->|^.*?<body>|<\/body>.*$/s', '', $html );
+ $html = $this->onHtmlReady( $html );
+
+ if ( $this->elementsToFlatten ) {
+ $elements = implode( '|', $this->elementsToFlatten );
+ $html = preg_replace( "#</?($elements)\\b[^>]*>#is", '', $html );
+ }
+
+ wfProfileOut( __METHOD__ );
+ return $html;
+ }
+
+ /**
+ * @param $selector: CSS selector to parse
+ * @param $type
+ * @param $rawName
+ * @return bool: Whether the selector was successfully recognised
+ */
+ protected function parseSelector( $selector, &$type, &$rawName ) {
+ if ( strpos( $selector, '.' ) === 0 ) {
+ $type = 'CLASS';
+ $rawName = substr( $selector, 1 );
+ } elseif ( strpos( $selector, '#' ) === 0 ) {
+ $type = 'ID';
+ $rawName = substr( $selector, 1 );
+ } elseif ( strpos( $selector, '.' ) !== 0 &&
+ strpos( $selector, '.' ) !== false )
+ {
+ $type = 'TAG_CLASS';
+ $rawName = $selector;
+ } elseif ( strpos( $selector, '[' ) === false
+ && strpos( $selector, ']' ) === false )
+ {
+ $type = 'TAG';
+ $rawName = $selector;
+ } else {
+ throw new MWException( __METHOD__ . "(): unrecognized selector '$selector'" );
+ }
+
+ return true;
+ }
+
+ /**
+ * Transforms CSS selectors into an internal representation suitable for processing
+ * @return array
+ */
+ protected function parseItemsToRemove() {
+ wfProfileIn( __METHOD__ );
+ $removals = array(
+ 'ID' => array(),
+ 'TAG' => array(),
+ 'CLASS' => array(),
+ 'TAG_CLASS' => array(),
+ );
+
+ foreach ( $this->itemsToRemove as $itemToRemove ) {
+ $type = '';
+ $rawName = '';
+ if ( $this->parseSelector( $itemToRemove, $type, $rawName ) ) {
+ $removals[$type][] = $rawName;
+ }
+ }
+
+ if ( $this->removeMedia ) {
+ $removals['TAG'][] = 'img';
+ $removals['TAG'][] = 'audio';
+ $removals['TAG'][] = 'video';
+ }
+
+ wfProfileOut( __METHOD__ );
+ return $removals;
+ }
+}
diff --git a/includes/HttpFunctions.php b/includes/HttpFunctions.php
index dc65c67e..78c2ac7a 100644
--- a/includes/HttpFunctions.php
+++ b/includes/HttpFunctions.php
@@ -40,14 +40,15 @@ class Http {
* @param array $options options to pass to MWHttpRequest object.
* Possible keys for the array:
* - timeout Timeout length in seconds
+ * - connectTimeout Timeout for connection, in seconds (curl only)
* - postData An array of key-value pairs or a url-encoded form data
* - proxy The proxy to use.
* Otherwise it will use $wgHTTPProxy (if set)
* Otherwise it will use the environment variable "http_proxy" (if set)
* - noProxy Don't use any proxy at all. Takes precedence over proxy value(s).
- * - sslVerifyHost (curl only) Verify hostname against certificate
- * - sslVerifyCert (curl only) Verify SSL certificate
- * - caInfo (curl only) Provide CA information
+ * - sslVerifyHost Verify hostname against certificate
+ * - sslVerifyCert Verify SSL certificate
+ * - caInfo 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,
@@ -58,20 +59,26 @@ class Http {
*/
public static function request( $method, $url, $options = array() ) {
wfDebug( "HTTP: $method: $url\n" );
+ wfProfileIn( __METHOD__ . "-$method" );
+
$options['method'] = strtoupper( $method );
if ( !isset( $options['timeout'] ) ) {
$options['timeout'] = 'default';
}
+ if ( !isset( $options['connectTimeout'] ) ) {
+ $options['connectTimeout'] = 'default';
+ }
$req = MWHttpRequest::factory( $url, $options );
$status = $req->execute();
+ $content = false;
if ( $status->isOK() ) {
- return $req->getContent();
- } else {
- return false;
+ $content = $req->getContent();
}
+ wfProfileOut( __METHOD__ . "-$method" );
+ return $content;
}
/**
@@ -213,7 +220,7 @@ class MWHttpRequest {
* @param array $options (optional) extra params to pass (see Http::request())
*/
protected function __construct( $url, $options = array() ) {
- global $wgHTTPTimeout;
+ global $wgHTTPTimeout, $wgHTTPConnectTimeout;
$this->url = wfExpandUrl( $url, PROTO_HTTP );
$this->parsedUrl = wfParseUrl( $this->url );
@@ -229,7 +236,12 @@ class MWHttpRequest {
} else {
$this->timeout = $wgHTTPTimeout;
}
- if( isset( $options['userAgent'] ) ) {
+ if ( isset( $options['connectTimeout'] ) && $options['connectTimeout'] != 'default' ) {
+ $this->connectTimeout = $options['connectTimeout'];
+ } else {
+ $this->connectTimeout = $wgHTTPConnectTimeout;
+ }
+ if ( isset( $options['userAgent'] ) ) {
$this->setUserAgent( $options['userAgent'] );
}
@@ -277,7 +289,7 @@ class MWHttpRequest {
' Http::$httpEngine is set to "curl"' );
}
- switch( Http::$httpEngine ) {
+ switch ( Http::$httpEngine ) {
case 'curl':
return new CurlHttpRequest( $url, $options );
case 'php':
@@ -302,7 +314,7 @@ class MWHttpRequest {
/**
* Set the parameters of the request
-
+ *
* @param $args Array
* @todo overload the args param
*/
@@ -427,6 +439,8 @@ class MWHttpRequest {
public function execute() {
global $wgTitle;
+ wfProfileIn( __METHOD__ );
+
$this->content = "";
if ( strtoupper( $this->method ) == "HEAD" ) {
@@ -446,6 +460,8 @@ class MWHttpRequest {
if ( !isset( $this->reqHeaders['User-Agent'] ) ) {
$this->setUserAgent( Http::userAgent() );
}
+
+ wfProfileOut( __METHOD__ );
}
/**
@@ -454,6 +470,8 @@ class MWHttpRequest {
* found in an array in the member variable headerList.
*/
protected function parseHeader() {
+ wfProfileIn( __METHOD__ );
+
$lastname = "";
foreach ( $this->headerList as $header ) {
@@ -470,6 +488,8 @@ class MWHttpRequest {
}
$this->parseCookies();
+
+ wfProfileOut( __METHOD__ );
}
/**
@@ -552,8 +572,8 @@ class MWHttpRequest {
$this->parseHeader();
}
- if ( isset( $this->respHeaders[strtolower ( $header ) ] ) ) {
- $v = $this->respHeaders[strtolower ( $header ) ];
+ if ( isset( $this->respHeaders[strtolower( $header )] ) ) {
+ $v = $this->respHeaders[strtolower( $header )];
return $v[count( $v ) - 1];
}
@@ -603,6 +623,8 @@ class MWHttpRequest {
* Parse the cookies in the response headers and store them in the cookie jar.
*/
protected function parseCookies() {
+ wfProfileIn( __METHOD__ );
+
if ( !$this->cookieJar ) {
$this->cookieJar = new CookieJar;
}
@@ -613,6 +635,8 @@ class MWHttpRequest {
$this->cookieJar->parseCookieResponseHeader( $cookie, $url['host'] );
}
}
+
+ wfProfileOut( __METHOD__ );
}
/**
@@ -631,17 +655,17 @@ class MWHttpRequest {
$headers = $this->getResponseHeaders();
//return full url (fix for incorrect but handled relative location)
- if ( isset( $headers[ 'location' ] ) ) {
- $locations = $headers[ 'location' ];
+ if ( isset( $headers['location'] ) ) {
+ $locations = $headers['location'];
$domain = '';
$foundRelativeURI = false;
$countLocations = count( $locations );
for ( $i = $countLocations - 1; $i >= 0; $i-- ) {
- $url = parse_url( $locations[ $i ] );
+ $url = parse_url( $locations[$i] );
if ( isset( $url['host'] ) ) {
- $domain = $url[ 'scheme' ] . '://' . $url[ 'host' ];
+ $domain = $url['scheme'] . '://' . $url['host'];
break; //found correct URI (with host)
} else {
$foundRelativeURI = true;
@@ -650,15 +674,15 @@ class MWHttpRequest {
if ( $foundRelativeURI ) {
if ( $domain ) {
- return $domain . $locations[ $countLocations - 1 ];
+ return $domain . $locations[$countLocations - 1];
} else {
$url = parse_url( $this->url );
- if ( isset($url[ 'host' ]) ) {
- return $url[ 'scheme' ] . '://' . $url[ 'host' ] . $locations[ $countLocations - 1 ];
+ if ( isset( $url['host'] ) ) {
+ return $url['scheme'] . '://' . $url['host'] . $locations[$countLocations - 1];
}
}
} else {
- return $locations[ $countLocations - 1 ];
+ return $locations[$countLocations - 1];
}
}
@@ -681,11 +705,6 @@ class MWHttpRequest {
class CurlHttpRequest extends MWHttpRequest {
const SUPPORTS_FILE_POSTS = true;
- static $curlMessageMap = array(
- 6 => 'http-host-unreachable',
- 28 => 'http-timed-out'
- );
-
protected $curlOptions = array();
protected $headerText = "";
@@ -700,14 +719,18 @@ class CurlHttpRequest extends MWHttpRequest {
}
public function execute() {
+ wfProfileIn( __METHOD__ );
+
parent::execute();
if ( !$this->status->isOK() ) {
+ wfProfileOut( __METHOD__ );
return $this->status;
}
$this->curlOptions[CURLOPT_PROXY] = $this->proxy;
$this->curlOptions[CURLOPT_TIMEOUT] = $this->timeout;
+ $this->curlOptions[CURLOPT_CONNECTTIMEOUT_MS] = $this->connectTimeout * 1000;
$this->curlOptions[CURLOPT_HTTP_VERSION] = CURL_HTTP_VERSION_1_0;
$this->curlOptions[CURLOPT_WRITEFUNCTION] = $this->callback;
$this->curlOptions[CURLOPT_HEADERFUNCTION] = array( $this, "readHeader" );
@@ -746,6 +769,7 @@ class CurlHttpRequest extends MWHttpRequest {
$curlHandle = curl_init( $this->url );
if ( !curl_setopt_array( $curlHandle, $this->curlOptions ) ) {
+ wfProfileOut( __METHOD__ );
throw new MWException( "Error setting curl options." );
}
@@ -760,14 +784,11 @@ class CurlHttpRequest extends MWHttpRequest {
wfRestoreWarnings();
}
- if ( false === curl_exec( $curlHandle ) ) {
- $code = curl_error( $curlHandle );
-
- if ( isset( self::$curlMessageMap[$code] ) ) {
- $this->status->fatal( self::$curlMessageMap[$code] );
- } else {
- $this->status->fatal( 'http-curl-error', curl_error( $curlHandle ) );
- }
+ $curlRes = curl_exec( $curlHandle );
+ if ( curl_errno( $curlHandle ) == CURLE_OPERATION_TIMEOUTED ) {
+ $this->status->fatal( 'http-timed-out', $this->url );
+ } elseif ( $curlRes === false ) {
+ $this->status->fatal( 'http-curl-error', curl_error( $curlHandle ) );
} else {
$this->headerList = explode( "\r\n", $this->headerText );
}
@@ -777,6 +798,8 @@ class CurlHttpRequest extends MWHttpRequest {
$this->parseHeader();
$this->setStatus();
+ wfProfileOut( __METHOD__ );
+
return $this->status;
}
@@ -811,6 +834,8 @@ class PhpHttpRequest extends MWHttpRequest {
}
public function execute() {
+ wfProfileIn( __METHOD__ );
+
parent::execute();
if ( is_array( $this->postData ) ) {
@@ -826,7 +851,7 @@ class PhpHttpRequest extends MWHttpRequest {
if ( $this->method == 'POST' ) {
// Required for HTTP 1.0 POSTs
$this->reqHeaders['Content-Length'] = strlen( $this->postData );
- if( !isset( $this->reqHeaders['Content-Type'] ) ) {
+ if ( !isset( $this->reqHeaders['Content-Type'] ) ) {
$this->reqHeaders['Content-Type'] = "application/x-www-form-urlencoded";
}
}
@@ -860,7 +885,23 @@ class PhpHttpRequest extends MWHttpRequest {
$options['timeout'] = $this->timeout;
- $context = stream_context_create( array( 'http' => $options ) );
+ if ( $this->sslVerifyHost ) {
+ $options['CN_match'] = $this->parsedUrl['host'];
+ }
+ if ( $this->sslVerifyCert ) {
+ $options['verify_peer'] = true;
+ }
+
+ if ( is_dir( $this->caInfo ) ) {
+ $options['capath'] = $this->caInfo;
+ } elseif ( is_file( $this->caInfo ) ) {
+ $options['cafile'] = $this->caInfo;
+ } elseif ( $this->caInfo ) {
+ throw new MWException( "Invalid CA info passed: {$this->caInfo}" );
+ }
+
+ $scheme = $this->parsedUrl['scheme'];
+ $context = stream_context_create( array( "$scheme" => $options ) );
$this->headerList = array();
$reqCount = 0;
@@ -903,18 +944,19 @@ class PhpHttpRequest extends MWHttpRequest {
if ( $fh === false ) {
$this->status->fatal( 'http-request-error' );
+ wfProfileOut( __METHOD__ );
return $this->status;
}
if ( $result['timed_out'] ) {
$this->status->fatal( 'http-timed-out', $this->url );
+ wfProfileOut( __METHOD__ );
return $this->status;
}
// If everything went OK, or we received some error code
// get the response body content.
- if ( $this->status->isOK()
- || (int)$this->respStatus >= 300) {
+ if ( $this->status->isOK() || (int)$this->respStatus >= 300 ) {
while ( !feof( $fh ) ) {
$buf = fread( $fh, 8192 );
@@ -930,6 +972,8 @@ class PhpHttpRequest extends MWHttpRequest {
}
fclose( $fh );
+ wfProfileOut( __METHOD__ );
+
return $this->status;
}
}
diff --git a/includes/IP.php b/includes/IP.php
index 72b9a52c..73834a59 100644
--- a/includes/IP.php
+++ b/includes/IP.php
@@ -33,24 +33,17 @@ 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_PREFIX', '(12[0-8]|1[01][0-9]|[1-9]?\d)');
+define( 'RE_IPV6_PREFIX', '(12[0-8]|1[01][0-9]|[1-9]?\d)' );
define( 'RE_IPV6_ADD',
'(?:' . // 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 one "::" in the middle (the ^ makes the test fail if none found)
+ RE_IPV6_WORD . '(?::((?(-1)|:))?' . RE_IPV6_WORD . '){1,6}(?(-2)|^)' .
'|' . // 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 );
@@ -212,7 +205,7 @@ class IP {
$longest = $match;
$longestPos = $pos;
}
- $offset += ( $pos + strlen( $match ) ); // advance
+ $offset = ( $pos + strlen( $match ) ); // advance
}
if ( $longest !== false ) {
// Replace this portion of the string with the '::' abbreviation
@@ -392,11 +385,11 @@ class IP {
static $privateRanges = false;
if ( !$privateRanges ) {
$privateRanges = array(
- array( '10.0.0.0', '10.255.255.255' ), # RFC 1918 (private)
- array( '172.16.0.0', '172.31.255.255' ), # "
- array( '192.168.0.0', '192.168.255.255' ), # "
- array( '0.0.0.0', '0.255.255.255' ), # this network
- array( '127.0.0.0', '127.255.255.255' ), # loopback
+ array( '10.0.0.0', '10.255.255.255' ), # RFC 1918 (private)
+ array( '172.16.0.0', '172.31.255.255' ), # RFC 1918 (private)
+ array( '192.168.0.0', '192.168.255.255' ), # RFC 1918 (private)
+ array( '0.0.0.0', '0.255.255.255' ), # this network
+ array( '127.0.0.0', '127.255.255.255' ), # loopback
);
}
@@ -492,6 +485,11 @@ class IP {
$n = ip2long( $ip );
if ( $n < 0 ) {
$n += pow( 2, 32 );
+ # On 32-bit platforms (and on Windows), 2^32 does not fit into an int,
+ # so $n becomes a float. We convert it to string instead.
+ if ( is_float( $n ) ) {
+ $n = (string)$n;
+ }
}
}
return $n;
@@ -526,7 +524,7 @@ class IP {
if ( $bits == 0 ) {
$network = 0;
} else {
- $network &= ~( ( 1 << ( 32 - $bits ) ) - 1);
+ $network &= ~( ( 1 << ( 32 - $bits ) ) - 1 );
}
# Convert to unsigned
if ( $network < 0 ) {
diff --git a/includes/ImagePage.php b/includes/ImagePage.php
index b3a485aa..7ea06b0e 100644
--- a/includes/ImagePage.php
+++ b/includes/ImagePage.php
@@ -206,7 +206,7 @@ class ImagePage extends Article {
}
// Add remote Filepage.css
- if( !$this->repo->isLocal() ) {
+ if ( !$this->repo->isLocal() ) {
$css = $this->repo->getDescriptionStylesheetUrl();
if ( $css ) {
$out->addStyle( $css );
@@ -250,7 +250,7 @@ class ImagePage extends Article {
*
* @todo FIXME: Bad interface, see note on MediaHandler::formatMetadata().
*
- * @param array $metadata the array containing the EXIF data
+ * @param array $metadata the array containing the Exif data
* @return String The metadata table. This is treated as Wikitext (!)
*/
protected function makeMetadataTable( $metadata ) {
@@ -311,6 +311,12 @@ class ImagePage extends Article {
} else {
$params = array( 'page' => $page );
}
+
+ $renderLang = $request->getVal( 'lang' );
+ if ( !is_null( $renderLang ) ) {
+ $params['lang'] = $renderLang;
+ }
+
$width_orig = $this->displayImg->getWidth( $page );
$width = $width_orig;
$height_orig = $this->displayImg->getHeight( $page );
@@ -395,6 +401,7 @@ class ImagePage extends Article {
$isMulti = $this->displayImg->isMultipage() && $this->displayImg->pageCount() > 1;
if ( $isMulti ) {
+ $out->addModules( 'mediawiki.page.image.pagination' );
$out->addHTML( '<table class="multipageimage"><tr><td>' );
}
@@ -444,7 +451,6 @@ class ImagePage extends Article {
$formParams = array(
'name' => 'pageselector',
'action' => $wgScript,
- 'onchange' => 'document.pageselector.submit();',
);
$options = array();
for ( $i = 1; $i <= $count; $i++ ) {
@@ -597,7 +603,7 @@ EOT
$descText = $this->mPage->getFile()->getDescriptionText();
/* Add canonical to head if there is no local page for this shared file */
- if( $descUrl && $this->mPage->getID() == 0 ) {
+ if ( $descUrl && $this->mPage->getID() == 0 ) {
$out->setCanonicalUrl( $descUrl );
}
@@ -631,7 +637,7 @@ EOT
* external editing (and instructions link) etc.
*/
protected function uploadLinksBox() {
- global $wgEnableUploads, $wgUseExternalEditor;
+ global $wgEnableUploads;
if ( !$wgEnableUploads ) {
return;
@@ -654,25 +660,6 @@ EOT
$out->addHTML( "<li id=\"mw-imagepage-upload-disallowed\">" . $this->getContext()->msg( 'upload-disallowed-here' )->escaped() . "</li>\n" );
}
- # External editing link
- if ( $wgUseExternalEditor ) {
- $elink = Linker::linkKnown(
- $this->getTitle(),
- wfMessage( 'edit-externally' )->escaped(),
- array(),
- array(
- 'action' => 'edit',
- 'externaledit' => 'true',
- 'mode' => 'file'
- )
- );
- $out->addHTML(
- '<li id="mw-imagepage-edit-external">' . $elink . ' <small>' .
- wfMessage( 'edit-externally-help' )->parse() .
- "</small></li>\n"
- );
- }
-
$out->addHTML( "</ul>\n" );
}
@@ -719,7 +706,7 @@ EOT
$limit = 100;
$out = $this->getContext()->getOutput();
- $res = $this->queryImageLinks( $this->getTitle()->getDbKey(), $limit + 1);
+ $res = $this->queryImageLinks( $this->getTitle()->getDBkey(), $limit + 1 );
$rows = array();
$redirects = array();
foreach ( $res as $row ) {
@@ -772,13 +759,21 @@ EOT
// Create links for every element
$currentCount = 0;
- foreach( $rows as $element ) {
+ foreach ( $rows as $element ) {
$currentCount++;
if ( $currentCount > $limit ) {
break;
}
- $link = Linker::linkKnown( Title::makeTitle( $element->page_namespace, $element->page_title ) );
+ $query = array();
+ # Add a redirect=no to make redirect pages reachable
+ if ( isset( $redirects[$element->page_title] ) ) {
+ $query['redirect'] = 'no';
+ }
+ $link = Linker::linkKnown(
+ Title::makeTitle( $element->page_namespace, $element->page_title ),
+ null, array(), $query
+ );
if ( !isset( $redirects[$element->page_title] ) ) {
# No redirects
$liContents = $link;
diff --git a/includes/ImageQueryPage.php b/includes/ImageQueryPage.php
index f9f6ceed..75f7ba64 100644
--- a/includes/ImageQueryPage.php
+++ b/includes/ImageQueryPage.php
@@ -29,25 +29,25 @@
* @author Rob Church <robchur@gmail.com>
*/
abstract class ImageQueryPage extends QueryPage {
-
/**
* Format and output report results using the given information plus
* OutputPage
*
- * @param $out OutputPage to print to
- * @param $skin Skin: user skin to use [unused]
- * @param $dbr DatabaseBase (read) connection to use
- * @param $res Integer: result pointer
- * @param $num Integer: number of available result rows
- * @param $offset Integer: paging offset
+ * @param OutputPage $out OutputPage to print to
+ * @param Skin $skin User skin to use [unused]
+ * @param DatabaseBase $dbr (read) connection to use
+ * @param int $res Result pointer
+ * @param int $num Number of available result rows
+ * @param int $offset Paging offset
*/
protected function outputResults( $out, $skin, $dbr, $res, $num, $offset ) {
- if( $num > 0 ) {
- $gallery = new ImageGallery();
+ if ( $num > 0 ) {
+ $gallery = ImageGalleryBase::factory();
+ $gallery->setContext( $this->getContext() );
# $res might contain the whole 1,000 rows, so we read up to
# $num [should update this to use a Pager]
- for( $i = 0; $i < $num && $row = $dbr->fetchObject( $res ); $i++ ) {
+ for ( $i = 0; $i < $num && $row = $dbr->fetchObject( $res ); $i++ ) {
$namespace = isset( $row->namespace ) ? $row->namespace : NS_FILE;
$title = Title::makeTitleSafe( $namespace, $row->title );
if ( $title instanceof Title && $title->getNamespace() == NS_FILE ) {
@@ -65,11 +65,10 @@ abstract class ImageQueryPage extends QueryPage {
/**
* Get additional HTML to be shown in a results' cell
*
- * @param $row Object: result row
- * @return String
+ * @param object $row Result row
+ * @return string
*/
protected function getCellHtml( $row ) {
return '';
}
-
}
diff --git a/includes/Import.php b/includes/Import.php
index bb5d6349..8b7af02a 100644
--- a/includes/Import.php
+++ b/includes/Import.php
@@ -47,7 +47,7 @@ class WikiImporter {
stream_wrapper_register( 'uploadsource', 'UploadSourceAdapter' );
$id = UploadSourceAdapter::registerSource( $source );
- if (defined( 'LIBXML_PARSEHUGE' ) ) {
+ if ( defined( 'LIBXML_PARSEHUGE' ) ) {
$this->reader->open( "uploadsource://$id", null, LIBXML_PARSEHUGE );
} else {
$this->reader->open( "uploadsource://$id" );
@@ -66,7 +66,7 @@ class WikiImporter {
}
private function debug( $data ) {
- if( $this->mDebug ) {
+ if ( $this->mDebug ) {
wfDebug( "IMPORT: $data\n" );
}
}
@@ -188,10 +188,10 @@ class WikiImporter {
* @return bool
*/
public function setTargetNamespace( $namespace ) {
- if( is_null( $namespace ) ) {
+ if ( is_null( $namespace ) ) {
// Don't override namespaces
$this->mTargetNamespace = null;
- } elseif( $namespace >= 0 ) {
+ } elseif ( $namespace >= 0 ) {
// @todo FIXME: Check for validity
$this->mTargetNamespace = intval( $namespace );
} else {
@@ -206,16 +206,16 @@ class WikiImporter {
*/
public function setTargetRootPage( $rootpage ) {
$status = Status::newGood();
- if( is_null( $rootpage ) ) {
+ if ( is_null( $rootpage ) ) {
// No rootpage
$this->mTargetRootPage = null;
- } elseif( $rootpage !== '' ) {
+ } elseif ( $rootpage !== '' ) {
$rootpage = rtrim( $rootpage, '/' ); //avoid double slashes
$title = Title::newFromText( $rootpage, !is_null( $this->mTargetNamespace ) ? $this->mTargetNamespace : NS_MAIN );
- if( !$title || $title->isExternal() ) {
+ if ( !$title || $title->isExternal() ) {
$status->fatal( 'import-rootpage-invalid' );
} else {
- if( !MWNamespace::hasSubpages( $title->getNamespace() ) ) {
+ if ( !MWNamespace::hasSubpages( $title->getNamespace() ) ) {
global $wgContLang;
$displayNSText = $title->getNamespace() == NS_MAIN
@@ -304,7 +304,7 @@ class WikiImporter {
*/
public function debugRevisionHandler( &$revision ) {
$this->debug( "Got revision:" );
- if( is_object( $revision->title ) ) {
+ if ( is_object( $revision->title ) ) {
$this->debug( "-- Title: " . $revision->title->getPrefixedText() );
} else {
$this->debug( "-- Title: <invalid>" );
@@ -320,7 +320,7 @@ class WikiImporter {
* @param $title Title
*/
function pageCallback( $title ) {
- if( isset( $this->mPageCallback ) ) {
+ if ( isset( $this->mPageCallback ) ) {
call_user_func( $this->mPageCallback, $title );
}
}
@@ -334,7 +334,7 @@ class WikiImporter {
* @param array $pageInfo associative array of page information
*/
private function pageOutCallback( $title, $origTitle, $revCount, $sucCount, $pageInfo ) {
- if( isset( $this->mPageOutCallback ) ) {
+ if ( isset( $this->mPageOutCallback ) ) {
$args = func_get_args();
call_user_func_array( $this->mPageOutCallback, $args );
}
@@ -376,12 +376,12 @@ class WikiImporter {
* @access private
*/
private function nodeContents() {
- if( $this->reader->isEmptyElement ) {
+ if ( $this->reader->isEmptyElement ) {
return "";
}
$buffer = "";
- while( $this->reader->read() ) {
- switch( $this->reader->nodeType ) {
+ while ( $this->reader->read() ) {
+ switch ( $this->reader->nodeType ) {
case XmlReader::TEXT:
case XmlReader::SIGNIFICANT_WHITESPACE:
$buffer .= $this->reader->value;
@@ -420,19 +420,19 @@ class WikiImporter {
"END_ELEMENT",
"END_ENTITY",
"XML_DECLARATION",
- );
+ );
$lookup = array();
- foreach( $xmlReaderConstants as $name ) {
- $lookup[constant("XmlReader::$name")] = $name;
+ foreach ( $xmlReaderConstants as $name ) {
+ $lookup[constant( "XmlReader::$name" )] = $name;
}
}
- print( var_dump(
+ print var_dump(
$lookup[$this->reader->nodeType],
$this->reader->name,
$this->reader->value
- )."\n\n" );
+ ) . "\n\n";
}
/**
@@ -450,7 +450,7 @@ class WikiImporter {
if ( $this->reader->name != 'mediawiki' ) {
libxml_disable_entity_loader( $oldDisable );
- throw new MWException( "Expected <mediawiki> tag, got ".
+ throw new MWException( "Expected <mediawiki> tag, got " .
$this->reader->name );
}
$this->debug( "<mediawiki> tag is correct." );
@@ -463,7 +463,7 @@ class WikiImporter {
$tag = $this->reader->name;
$type = $this->reader->nodeType;
- if ( !wfRunHooks( 'ImportHandleToplevelXMLTag', $this ) ) {
+ if ( !wfRunHooks( 'ImportHandleToplevelXMLTag', array( $this ) ) ) {
// Do nothing
} elseif ( $tag == 'mediawiki' && $type == XmlReader::END_ELEMENT ) {
break;
@@ -522,8 +522,9 @@ class WikiImporter {
$tag = $this->reader->name;
- if ( !wfRunHooks( 'ImportHandleLogItemXMLTag',
- $this, $logInfo ) ) {
+ if ( !wfRunHooks( 'ImportHandleLogItemXMLTag', array(
+ $this, $logInfo
+ ) ) ) {
// Do nothing
} elseif ( in_array( $tag, $normalFields ) ) {
$logInfo[$tag] = $this->nodeContents();
@@ -639,8 +640,9 @@ class WikiImporter {
$tag = $this->reader->name;
- if ( !wfRunHooks( 'ImportHandleRevisionXMLTag', $this,
- $pageInfo, $revisionInfo ) ) {
+ if ( !wfRunHooks( 'ImportHandleRevisionXMLTag', array(
+ $this, $pageInfo, $revisionInfo
+ ) ) ) {
// Do nothing
} elseif ( in_array( $tag, $normalFields ) ) {
$revisionInfo[$tag] = $this->nodeContents();
@@ -666,7 +668,7 @@ class WikiImporter {
private function processRevision( $pageInfo, $revisionInfo ) {
$revision = new WikiRevision;
- if( isset( $revisionInfo['id'] ) ) {
+ if ( isset( $revisionInfo['id'] ) ) {
$revision->setID( $revisionInfo['id'] );
}
if ( isset( $revisionInfo['text'] ) ) {
@@ -725,8 +727,9 @@ class WikiImporter {
$tag = $this->reader->name;
- if ( !wfRunHooks( 'ImportHandleUploadXMLTag', $this,
- $pageInfo ) ) {
+ if ( !wfRunHooks( 'ImportHandleUploadXMLTag', array(
+ $this, $pageInfo
+ ) ) ) {
// Do nothing
} elseif ( in_array( $tag, $normalFields ) ) {
$uploadInfo[$tag] = $this->nodeContents();
@@ -840,33 +843,33 @@ class WikiImporter {
$workTitle = $text;
$origTitle = Title::newFromText( $workTitle );
- if( !is_null( $this->mTargetNamespace ) && !is_null( $origTitle ) ) {
+ if ( !is_null( $this->mTargetNamespace ) && !is_null( $origTitle ) ) {
# makeTitleSafe, because $origTitle can have a interwiki (different setting of interwiki map)
# and than dbKey can begin with a lowercase char
$title = Title::makeTitleSafe( $this->mTargetNamespace,
$origTitle->getDBkey() );
} else {
- if( !is_null( $this->mTargetRootPage ) ) {
+ if ( !is_null( $this->mTargetRootPage ) ) {
$workTitle = $this->mTargetRootPage . '/' . $workTitle;
}
$title = Title::newFromText( $workTitle );
}
- if( is_null( $title ) ) {
+ if ( is_null( $title ) ) {
# Invalid page title? Ignore the page
$this->notice( 'import-error-invalid', $workTitle );
return false;
- } elseif( $title->isExternal() ) {
+ } elseif ( $title->isExternal() ) {
$this->notice( 'import-error-interwiki', $title->getPrefixedText() );
return false;
- } elseif( !$title->canExist() ) {
+ } elseif ( !$title->canExist() ) {
$this->notice( 'import-error-special', $title->getPrefixedText() );
return false;
- } elseif( !$title->userCan( 'edit' ) && !$wgCommandLineMode ) {
+ } elseif ( !$title->userCan( 'edit' ) && !$wgCommandLineMode ) {
# Do not import if the importing wiki user cannot edit this page
$this->notice( 'import-error-edit', $title->getPrefixedText() );
return false;
- } elseif( !$title->exists() && !$title->userCan( 'create' ) && !$wgCommandLineMode ) {
+ } elseif ( !$title->exists() && !$title->userCan( 'create' ) && !$wgCommandLineMode ) {
# Do not import if the importing wiki user cannot create this page
$this->notice( 'import-error-create', $title->getPrefixedText() );
return false;
@@ -997,12 +1000,12 @@ class XMLReader2 extends XMLReader {
* @return bool|string
*/
function nodeContents() {
- if( $this->isEmptyElement ) {
+ if ( $this->isEmptyElement ) {
return "";
}
$buffer = "";
- while( $this->read() ) {
- switch( $this->nodeType ) {
+ while ( $this->read() ) {
+ switch ( $this->nodeType ) {
case XmlReader::TEXT:
case XmlReader::SIGNIFICANT_WHITESPACE:
$buffer .= $this->value;
@@ -1051,9 +1054,9 @@ class WikiRevision {
* @throws MWException
*/
function setTitle( $title ) {
- if( is_object( $title ) ) {
+ if ( is_object( $title ) ) {
$this->title = $title;
- } elseif( is_null( $title ) ) {
+ } elseif ( is_null( $title ) ) {
throw new MWException( "WikiRevision given a null title in import. You may need to adjust \$wgLegalTitleChars." );
} else {
throw new MWException( "WikiRevision given non-object title in import." );
@@ -1369,7 +1372,7 @@ class WikiRevision {
# Sneak a single revision into place
$user = User::newFromName( $this->getUser() );
- if( $user ) {
+ if ( $user ) {
$userId = intval( $user->getId() );
$userText = $user->getName();
$userObj = $user;
@@ -1384,7 +1387,7 @@ class WikiRevision {
$linkCache->clear();
$page = WikiPage::factory( $this->title );
- if( !$page->exists() ) {
+ if ( !$page->exists() ) {
# must create the page...
$pageId = $page->insertOn( $dbw );
$created = true;
@@ -1400,7 +1403,7 @@ class WikiRevision {
'rev_comment' => $this->getComment() ),
__METHOD__
);
- if( $prior ) {
+ if ( $prior ) {
// @todo FIXME: This could fail slightly for multiple matches :P
wfDebug( __METHOD__ . ": skipping existing revision for [[" .
$this->title->getPrefixedText() . "]], timestamp " . $this->timestamp . "\n" );
@@ -1440,7 +1443,7 @@ class WikiRevision {
function importLogItem() {
$dbw = wfGetDB( DB_MASTER );
# @todo FIXME: This will not record autoblocks
- if( !$this->getTitle() ) {
+ if ( !$this->getTitle() ) {
wfDebug( __METHOD__ . ": skipping invalid {$this->type}/{$this->action} log time, timestamp " .
$this->timestamp . "\n" );
return;
@@ -1459,7 +1462,7 @@ class WikiRevision {
__METHOD__
);
// @todo FIXME: This could fail slightly for multiple matches :P
- if( $prior ) {
+ if ( $prior ) {
wfDebug( __METHOD__ . ": skipping existing item for Log:{$this->type}/{$this->action}, timestamp " .
$this->timestamp . "\n" );
return;
@@ -1500,7 +1503,7 @@ class WikiRevision {
wfDebug( __METHOD__ . "File already exists; importing as $archiveName\n" );
}
}
- if( !$file ) {
+ if ( !$file ) {
wfDebug( __METHOD__ . ': Bad file for ' . $this->getTitle() . "\n" );
return false;
}
@@ -1512,7 +1515,7 @@ class WikiRevision {
$source = $this->downloadSource();
$flags |= File::DELETE_SOURCE;
}
- if( !$source ) {
+ if ( !$source ) {
wfDebug( __METHOD__ . ": Could not fetch remote file.\n" );
return false;
}
@@ -1551,13 +1554,13 @@ class WikiRevision {
*/
function downloadSource() {
global $wgEnableUploads;
- if( !$wgEnableUploads ) {
+ if ( !$wgEnableUploads ) {
return false;
}
$tempo = tempnam( wfTempDir(), 'download' );
$f = fopen( $tempo, 'wb' );
- if( !$f ) {
+ if ( !$f ) {
wfDebug( "IMPORT: couldn't write to temp file $tempo\n" );
return false;
}
@@ -1565,7 +1568,7 @@ class WikiRevision {
// @todo FIXME!
$src = $this->getSrc();
$data = Http::get( $src );
- if( !$data ) {
+ if ( !$data ) {
wfDebug( "IMPORT: couldn't fetch source $src\n" );
fclose( $f );
unlink( $tempo );
@@ -1601,7 +1604,7 @@ class ImportStringSource {
* @return bool|string
*/
function readChunk() {
- if( $this->atEnd() ) {
+ if ( $this->atEnd() ) {
return false;
}
$this->mRead = true;
@@ -1640,7 +1643,7 @@ class ImportStreamSource {
wfSuppressWarnings();
$file = fopen( $filename, 'rt' );
wfRestoreWarnings();
- if( !$file ) {
+ if ( !$file ) {
return Status::newFatal( "importcantopen" );
}
return Status::newGood( new ImportStreamSource( $file ) );
@@ -1653,11 +1656,11 @@ class ImportStreamSource {
static function newFromUpload( $fieldname = "xmlimport" ) {
$upload =& $_FILES[$fieldname];
- if( $upload === null || !$upload['name'] ) {
+ if ( $upload === null || !$upload['name'] ) {
return Status::newFatal( 'importnofile' );
}
- if( !empty( $upload['error'] ) ) {
- switch( $upload['error'] ) {
+ if ( !empty( $upload['error'] ) ) {
+ switch ( $upload['error'] ) {
case 1: # The uploaded file exceeds the upload_max_filesize directive in php.ini.
return Status::newFatal( 'importuploaderrorsize' );
case 2: # The uploaded file exceeds the MAX_FILE_SIZE directive that was specified in the HTML form.
@@ -1671,7 +1674,7 @@ class ImportStreamSource {
}
$fname = $upload['tmp_name'];
- if( is_uploaded_file( $fname ) ) {
+ if ( is_uploaded_file( $fname ) ) {
return ImportStreamSource::newFromFile( $fname );
} else {
return Status::newFatal( 'importnofile' );
@@ -1690,7 +1693,7 @@ class ImportStreamSource {
# otherwise prevent importing from large sites, such
# as the Wikimedia cluster, etc.
$data = Http::request( $method, $url, array( 'followRedirects' => true ) );
- if( $data !== false ) {
+ if ( $data !== false ) {
$file = tmpfile();
fwrite( $file, $data );
fflush( $file );
@@ -1710,18 +1713,24 @@ class ImportStreamSource {
* @return Status
*/
public static function newFromInterwiki( $interwiki, $page, $history = false, $templates = false, $pageLinkDepth = 0 ) {
- if( $page == '' ) {
+ if ( $page == '' ) {
return Status::newFatal( 'import-noarticle' );
}
$link = Title::newFromText( "$interwiki:Special:Export/$page" );
- if( is_null( $link ) || $link->getInterwiki() == '' ) {
+ if ( is_null( $link ) || $link->getInterwiki() == '' ) {
return Status::newFatal( 'importbadinterwiki' );
} else {
$params = array();
- if ( $history ) $params['history'] = 1;
- if ( $templates ) $params['templates'] = 1;
- if ( $pageLinkDepth ) $params['pagelink-depth'] = $pageLinkDepth;
- $url = $link->getFullUrl( $params );
+ if ( $history ) {
+ $params['history'] = 1;
+ }
+ if ( $templates ) {
+ $params['templates'] = 1;
+ }
+ if ( $pageLinkDepth ) {
+ $params['pagelink-depth'] = $pageLinkDepth;
+ }
+ $url = $link->getFullURL( $params );
# For interwikis, use POST to avoid redirects.
return ImportStreamSource::newFromURL( $url, "POST" );
}
diff --git a/includes/Init.php b/includes/Init.php
index 66f9544d..64431f09 100644
--- a/includes/Init.php
+++ b/includes/Init.php
@@ -2,6 +2,9 @@
/**
* Some functions that are useful during startup.
*
+ * This class previously contained some functionality related to a PHP compiler
+ * called hphpc. That compiler has now been discontinued.
+ *
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
@@ -22,40 +25,35 @@
/**
* Some functions that are useful during startup.
+ *
+ * This class previously contained some functionality related to a PHP compiler
+ * called hphpc. That compiler has now been discontinued. All methods are now
+ * deprecated.
*/
class MWInit {
static $compilerVersion;
/**
- * Get the version of HipHop used to compile, or false if MediaWiki was not
- * compiled. This works by having our build script insert a special function
- * into the compiled code.
+ * @deprecated since 1.22
*/
static function getCompilerVersion() {
- if ( self::$compilerVersion === null ) {
- if ( self::functionExists( 'wfHipHopCompilerVersion' ) ) {
- self::$compilerVersion = wfHipHopCompilerVersion();
- } else {
- self::$compilerVersion = false;
- }
- }
- return self::$compilerVersion;
+ return false;
}
/**
* Returns true if we are running under HipHop, whether in compiled or
* interpreted mode.
*
+ * @deprecated since 1.22
* @return bool
*/
static function isHipHop() {
- return function_exists( 'hphp_thread_set_warmup_enabled' );
+ return defined( 'HPHP_VERSION' );
}
/**
- * Get a fully-qualified path for a source file relative to $IP. Including
- * such a path under HipHop will force the file to be interpreted. This is
- * useful for configuration files.
+ * Get a fully-qualified path for a source file relative to $IP.
+ * @deprecated since 1.22
*
* @param $file string
*
@@ -67,117 +65,39 @@ class MWInit {
}
/**
- * If we are running code compiled by HipHop, this will pass through the
- * input path, assumed to be relative to $IP. If the code is interpreted,
- * it will converted to a fully qualified path. It is necessary to use a
- * path which is relative to $IP in order to make HipHop use its compiled
- * code.
- *
+ * @deprecated since 1.22
* @param $file string
- *
* @return string
*/
static function compiledPath( $file ) {
global $IP;
-
- if ( defined( 'MW_COMPILED' ) ) {
- return "phase3/$file";
- } else {
- return "$IP/$file";
- }
- }
-
- /**
- * The equivalent of MWInit::interpretedPath() but for files relative to the
- * extensions directory.
- *
- * @param $file string
- * @return string
- */
- static function extInterpretedPath( $file ) {
- return self::getExtensionsDirectory() . '/' . $file;
+ return "$IP/$file";
}
/**
- * The equivalent of MWInit::compiledPath() but for files relative to the
- * extensions directory. Any files referenced in this way must be registered
- * for compilation by including them in $wgCompiledFiles.
+ * @deprecated since 1.22
* @param $file string
* @return string
*/
static function extCompiledPath( $file ) {
- if ( defined( 'MW_COMPILED' ) ) {
- return "extensions/$file";
- } else {
- return self::getExtensionsDirectory() . '/' . $file;
- }
+ return false;
}
/**
- * Register an extension setup file and return its path for compiled
- * inclusion. Use this function in LocalSettings.php to add extensions
- * to the build. For example:
- *
- * require( MWInit::extSetupPath( 'ParserFunctions/ParserFunctions.php' ) );
- *
- * @param string $extRel The path relative to the extensions directory, as defined by
- * $wgExtensionsDirectory.
- *
- * @return string
- */
- static function extSetupPath( $extRel ) {
- $baseRel = "extensions/$extRel";
- if ( defined( 'MW_COMPILED' ) ) {
- return $baseRel;
- } else {
- global $wgCompiledFiles;
- $wgCompiledFiles[] = $baseRel;
- return self::getExtensionsDirectory() . '/' . $extRel;
- }
- }
-
- /**
- * @return bool|string
- */
- static function getExtensionsDirectory() {
- global $wgExtensionsDirectory, $IP;
- if ( $wgExtensionsDirectory === false ) {
- $wgExtensionsDirectory = "$IP/../extensions";
- }
- return $wgExtensionsDirectory;
- }
-
- /**
- * Determine whether a class exists, using a method which works under HipHop.
- *
- * Note that it's not possible to implement this with any variant of
- * class_exists(), because class_exists() returns false for classes which
- * are compiled in.
- *
- * Calling class_exists() on a literal string causes the class to be made
- * "volatile", which means (as of March 2011) that the class is broken and
- * can't be used at all. So don't do that. See
- * https://github.com/facebook/hiphop-php/issues/314
+ * Deprecated wrapper for class_exists()
+ * @deprecated since 1.22
*
* @param $class string
*
* @return bool
*/
static function classExists( $class ) {
- try {
- $r = new ReflectionClass( $class );
- } catch( ReflectionException $r ) {
- $r = false;
- }
- return $r !== false;
+ return class_exists( $class );
}
/**
- * Determine whether a method exists within a class, using a method which works
- * under HipHop.
- *
- * Note that under HipHop when method_exists is given a string for it's class
- * such as to test for a static method has the same issues as class_exists does.
+ * Deprecated wrapper for method_exists()
+ * @deprecated since 1.22
*
* @param $class string
* @param $method string
@@ -185,34 +105,25 @@ class MWInit {
* @return bool
*/
static function methodExists( $class, $method ) {
- try {
- $r = new ReflectionMethod( $class, $method );
- } catch( ReflectionException $r ) {
- $r = false;
- }
- return $r !== false;
+ return method_exists( $class, $method );
}
/**
- * Determine whether a function exists, using a method which works under
- * HipHop.
+ * Deprecated wrapper for function_exists()
+ * @deprecated since 1.22
*
* @param $function string
*
* @return bool
*/
static function functionExists( $function ) {
- try {
- $r = new ReflectionFunction( $function );
- } catch( ReflectionException $r ) {
- $r = false;
- }
- return $r !== false;
+ return function_exists( $function );
}
/**
- * Call a static method of a class with variable arguments without causing
- * it to become volatile.
+ * Deprecated wrapper for call_user_func_array()
+ * @deprecated since 1.22
+ *
* @param $className string
* @param $methodName string
* @param $args array
@@ -220,7 +131,6 @@ class MWInit {
* @return mixed
*/
static function callStaticMethod( $className, $methodName, $args ) {
- $r = new ReflectionMethod( $className, $methodName );
- return $r->invokeArgs( null, $args );
+ return call_user_func_array( array( $className, $methodName ), $args );
}
}
diff --git a/includes/Licenses.php b/includes/Licenses.php
index e8aee0b5..6c582aaf 100644
--- a/includes/Licenses.php
+++ b/includes/Licenses.php
@@ -105,7 +105,7 @@ class Licenses extends HTMLFormField {
protected function stackItem( &$list, $path, $item ) {
$position =& $list;
if ( $path ) {
- foreach( $path as $key ) {
+ foreach ( $path as $key ) {
$position =& $position[$key];
}
}
diff --git a/includes/LinkFilter.php b/includes/LinkFilter.php
index 11b65595..d552c696 100644
--- a/includes/LinkFilter.php
+++ b/includes/LinkFilter.php
@@ -152,11 +152,11 @@ class LinkFilter {
* @return array filtered array
*/
public static function keepOneWildcard( $arr ) {
- if( !is_array( $arr ) ) {
+ if ( !is_array( $arr ) ) {
return $arr;
}
- foreach( $arr as $key => $value ) {
+ foreach ( $arr as $key => $value ) {
if ( $value instanceof LikeMatch ) {
return array_slice( $arr, 0, $key + 1 );
}
diff --git a/includes/Linker.php b/includes/Linker.php
index 972adfce..23ece751 100644
--- a/includes/Linker.php
+++ b/includes/Linker.php
@@ -199,7 +199,7 @@ class Linker {
return "<!-- ERROR -->$html";
}
- if( is_string( $query ) ) {
+ if ( is_string( $query ) ) {
// some functions withing core using this still hand over query strings
wfDeprecated( __METHOD__ . ' with parameter $query as string (should be array)', '1.20' );
$query = wfCgiToArray( $query );
@@ -238,7 +238,7 @@ class Linker {
# Note: we want the href attribute first, for prettiness.
$attribs = array( 'href' => self::linkUrl( $target, $query, $options ) );
if ( in_array( 'forcearticlepath', $options ) && $oldquery ) {
- $attribs['href'] = wfAppendQuery( $attribs['href'], wfArrayToCgi( $oldquery ) );
+ $attribs['href'] = wfAppendQuery( $attribs['href'], $oldquery );
}
$attribs = array_merge(
@@ -612,7 +612,7 @@ class Linker {
$hp['width'] = $file->getWidth( $page );
}
- if ( isset( $fp['thumbnail'] ) || isset( $fp['framed'] ) || isset( $fp['frameless'] ) || !$hp['width'] ) {
+ if ( isset( $fp['thumbnail'] ) || isset( $fp['manualthumb'] ) || isset( $fp['framed'] ) || isset( $fp['frameless'] ) || !$hp['width'] ) {
global $wgThumbLimits, $wgThumbUpright;
if ( $widthOption === null || !isset( $wgThumbLimits[$widthOption] ) ) {
$widthOption = User::getDefaultOption( 'thumbsize' );
@@ -644,7 +644,7 @@ class Linker {
# If a thumbnail width has not been provided, it is set
# to the default user option as specified in Language*.php
if ( $fp['align'] == '' ) {
- if( $parser instanceof Parser ) {
+ if ( $parser instanceof Parser ) {
$fp['align'] = $parser->getTargetLanguage()->alignEnd();
} else {
# backwards compatibility, remove with makeImageLink2()
@@ -786,10 +786,18 @@ class Linker {
$hp =& $handlerParams;
$page = isset( $hp['page'] ) ? $hp['page'] : false;
- if ( !isset( $fp['align'] ) ) $fp['align'] = 'right';
- if ( !isset( $fp['alt'] ) ) $fp['alt'] = '';
- if ( !isset( $fp['title'] ) ) $fp['title'] = '';
- if ( !isset( $fp['caption'] ) ) $fp['caption'] = '';
+ if ( !isset( $fp['align'] ) ) {
+ $fp['align'] = 'right';
+ }
+ if ( !isset( $fp['alt'] ) ) {
+ $fp['alt'] = '';
+ }
+ if ( !isset( $fp['title'] ) ) {
+ $fp['title'] = '';
+ }
+ if ( !isset( $fp['caption'] ) ) {
+ $fp['caption'] = '';
+ }
if ( empty( $hp['width'] ) ) {
// Reduce width for upright images when parameter 'upright' is used
@@ -797,6 +805,7 @@ class Linker {
}
$thumb = false;
$noscale = false;
+ $manualthumb = false;
if ( !$exists ) {
$outerWidth = $hp['width'] + 2;
@@ -808,6 +817,7 @@ class Linker {
$manual_img = wfFindFile( $manual_title );
if ( $manual_img ) {
$thumb = $manual_img->getUnscaledThumb( $hp );
+ $manualthumb = true;
} else {
$exists = false;
}
@@ -838,7 +848,13 @@ class Linker {
# zoom icon still needs it, so we make a unique query for it. See bug 14771
$url = $title->getLocalURL( $query );
if ( $page ) {
- $url = wfAppendQuery( $url, 'page=' . urlencode( $page ) );
+ $url = wfAppendQuery( $url, array( 'page' => $page ) );
+ }
+ if ( $manualthumb &&
+ !isset( $fp['link-title'] ) &&
+ !isset( $fp['link-url'] ) &&
+ !isset( $fp['no-link'] ) ) {
+ $fp['link-url'] = $url;
}
$s = "<div class=\"thumb t{$fp['align']}\"><div class=\"thumbinner\" style=\"width:{$outerWidth}px;\">";
@@ -849,7 +865,7 @@ class Linker {
$s .= wfMessage( 'thumbnail_error', '' )->escaped();
$zoomIcon = '';
} else {
- if ( !$noscale ) {
+ if ( !$noscale && !$manualthumb ) {
self::processResponsiveImages( $file, $thumb, $hp );
}
$params = array(
@@ -961,17 +977,18 @@ class Linker {
*/
protected static function getUploadUrl( $destFile, $query = '' ) {
global $wgUploadMissingFileUrl, $wgUploadNavigationUrl;
- $q = 'wpDestFile=' . $destFile->getPartialUrl();
- if ( $query != '' )
+ $q = 'wpDestFile=' . $destFile->getPartialURL();
+ if ( $query != '' ) {
$q .= '&' . $query;
+ }
if ( $wgUploadMissingFileUrl ) {
return wfAppendQuery( $wgUploadMissingFileUrl, $q );
- } elseif( $wgUploadNavigationUrl ) {
+ } elseif ( $wgUploadNavigationUrl ) {
return wfAppendQuery( $wgUploadNavigationUrl, $q );
} else {
$upload = SpecialPage::getTitleFor( 'Upload' );
- return $upload->getLocalUrl( $q );
+ return $upload->getLocalURL( $q );
}
}
@@ -1442,8 +1459,9 @@ class Linker {
$trail = "";
}
$linkRegexp = '/\[\[(.*?)\]\]' . preg_quote( $trail, '/' ) . '/';
- if ( isset( $match[1][0] ) && $match[1][0] == ':' )
+ if ( isset( $match[1][0] ) && $match[1][0] == ':' ) {
$match[1] = substr( $match[1], 1 );
+ }
list( $inside, $trail ) = self::splitTrail( $trail );
$linkText = $text;
@@ -1527,7 +1545,7 @@ class Linker {
$nodotdot = substr( $nodotdot, 3 );
}
if ( $dotdotcount > 0 ) {
- $exploded = explode( '/', $contextTitle->GetPrefixedText() );
+ $exploded = explode( '/', $contextTitle->getPrefixedText() );
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
@@ -1670,10 +1688,10 @@ class Linker {
$lang = wfGetLangObj( $lang );
$title = wfMessage( 'toc' )->inLanguage( $lang )->escaped();
- return '<table id="toc" class="toc"><tr><td>'
+ return '<div id="toc" class="toc">'
. '<div id="toctitle"><h2>' . $title . "</h2></div>\n"
. $toc
- . "</ul>\n</td></tr></table>\n";
+ . "</ul>\n</div>\n";
}
/**
@@ -1687,13 +1705,14 @@ class Linker {
$toc = '';
$lastLevel = 0;
foreach ( $tree as $section ) {
- if ( $section['toclevel'] > $lastLevel )
+ if ( $section['toclevel'] > $lastLevel ) {
$toc .= self::tocIndent();
- elseif ( $section['toclevel'] < $lastLevel )
+ } elseif ( $section['toclevel'] < $lastLevel ) {
$toc .= self::tocUnindent(
$lastLevel - $section['toclevel'] );
- else
+ } else {
$toc .= self::tocLineEnd();
+ }
$toc .= self::tocLine( $section['anchor'],
$section['line'], $section['number'],
@@ -1721,8 +1740,8 @@ class Linker {
*/
public static function makeHeadline( $level, $attribs, $anchor, $html, $link, $legacyAnchor = false ) {
$ret = "<h$level$attribs"
+ . "<span class=\"mw-headline\" id=\"$anchor\">$html</span>"
. $link
- . " <span class=\"mw-headline\" id=\"$anchor\">$html</span>"
. "</h$level>";
if ( $legacyAnchor !== false ) {
$ret = "<div id=\"$legacyAnchor\"></div>$ret";
@@ -1887,21 +1906,21 @@ class Linker {
}
$disableRollbackEditCount = false;
- if( $wgMiserMode ) {
- foreach( $disableRollbackEditCountSpecialPage as $specialPage ) {
- if( $context->getTitle()->isSpecial( $specialPage ) ) {
+ if ( $wgMiserMode ) {
+ foreach ( $disableRollbackEditCountSpecialPage as $specialPage ) {
+ if ( $context->getTitle()->isSpecial( $specialPage ) ) {
$disableRollbackEditCount = true;
break;
}
}
}
- if( !$disableRollbackEditCount && is_int( $wgShowRollbackEditCount ) && $wgShowRollbackEditCount > 0 ) {
+ if ( !$disableRollbackEditCount && is_int( $wgShowRollbackEditCount ) && $wgShowRollbackEditCount > 0 ) {
if ( !is_numeric( $editCount ) ) {
$editCount = self::getRollbackEditCount( $rev, false );
}
- if( $editCount > $wgShowRollbackEditCount ) {
+ if ( $editCount > $wgShowRollbackEditCount ) {
$editCount_output = $context->msg( 'rollbacklinkcount-morethan' )->numParams( $wgShowRollbackEditCount )->parse();
} else {
$editCount_output = $context->msg( 'rollbacklinkcount' )->numParams( $editCount )->parse();
@@ -1941,6 +1960,7 @@ class Linker {
* @return String: HTML output
*/
public static function formatTemplates( $templates, $preview = false, $section = false, $more = null ) {
+ global $wgLang;
wfProfileIn( __METHOD__ );
$outText = '';
@@ -1968,13 +1988,28 @@ class Linker {
usort( $templates, 'Title::compare' );
foreach ( $templates as $titleObj ) {
- $r = $titleObj->getRestrictions( 'edit' );
- if ( in_array( 'sysop', $r ) ) {
- $protected = wfMessage( 'template-protected' )->parse();
- } elseif ( in_array( 'autoconfirmed', $r ) ) {
- $protected = wfMessage( 'template-semiprotected' )->parse();
- } else {
- $protected = '';
+ $protected = '';
+ $restrictions = $titleObj->getRestrictions( 'edit' );
+ if ( $restrictions ) {
+ // Check backwards-compatible messages
+ $msg = null;
+ if ( $restrictions === array( 'sysop' ) ) {
+ $msg = wfMessage( 'template-protected' );
+ } elseif ( $restrictions === array( 'autoconfirmed' ) ) {
+ $msg = wfMessage( 'template-semiprotected' );
+ }
+ if ( $msg && !$msg->isDisabled() ) {
+ $protected = $msg->parse();
+ } else {
+ // Construct the message from restriction-level-*
+ // e.g. restriction-level-sysop, restriction-level-autoconfirmed
+ $msgs = array();
+ foreach ( $restrictions as $r ) {
+ $msgs[] = wfMessage( "restriction-level-$r" )->parse();
+ }
+ $protected = wfMessage( 'parentheses' )
+ ->rawParams( $wgLang->commaList( $msgs ) )->escaped();
+ }
}
if ( $titleObj->quickUserCan( 'edit' ) ) {
$editLink = self::link(
diff --git a/includes/LinksUpdate.php b/includes/LinksUpdate.php
index d99ae22d..fdd0e3c1 100644
--- a/includes/LinksUpdate.php
+++ b/includes/LinksUpdate.php
@@ -27,7 +27,7 @@
*/
class LinksUpdate extends SqlDataUpdate {
- // @todo: make members protected, but make sure extensions don't break
+ // @todo make members protected, but make sure extensions don't break
public $mId, //!< Page ID of the article linked from
$mTitle, //!< Title object of the article linked from
@@ -44,6 +44,16 @@ class LinksUpdate extends SqlDataUpdate {
$mRecursive; //!< Whether to queue jobs for recursive updates
/**
+ * @var null|array Added links if calculated.
+ */
+ private $linkInsertions = null;
+
+ /**
+ * @var null|array Deleted links if calculated.
+ */
+ private $linkDeletions = null;
+
+ /**
* Constructor
*
* @param $title Title of the page we're updating
@@ -112,14 +122,8 @@ class LinksUpdate extends SqlDataUpdate {
* Update link tables with outgoing links from an updated article
*/
public function doUpdate() {
- global $wgUseDumbLinkUpdate;
-
wfRunHooks( 'LinksUpdate', array( &$this ) );
- if ( $wgUseDumbLinkUpdate ) {
- $this->doDumbUpdate();
- } else {
- $this->doIncrementalUpdate();
- }
+ $this->doIncrementalUpdate();
wfRunHooks( 'LinksUpdateComplete', array( &$this ) );
}
@@ -128,8 +132,9 @@ class LinksUpdate extends SqlDataUpdate {
# Page links
$existing = $this->getExistingLinks();
- $this->incrTableUpdate( 'pagelinks', 'pl', $this->getLinkDeletions( $existing ),
- $this->getLinkInsertions( $existing ) );
+ $this->linkDeletions = $this->getLinkDeletions( $existing );
+ $this->linkInsertions = $this->getLinkInsertions( $existing );
+ $this->incrTableUpdate( 'pagelinks', 'pl', $this->linkDeletions, $this->linkInsertions );
# Image links
$existing = $this->getExistingImages();
@@ -198,61 +203,35 @@ class LinksUpdate extends SqlDataUpdate {
}
/**
- * Link update which clears the previous entries and inserts new ones
- * May be slower or faster depending on level of lock contention and write speed of DB
- * Also useful where link table corruption needs to be repaired, e.g. in refreshLinks.php
+ * Queue recursive jobs for this page
+ *
+ * Which means do LinksUpdate on all templates
+ * that include the current page, using the job queue.
*/
- protected function doDumbUpdate() {
- wfProfileIn( __METHOD__ );
-
- # Refresh category pages and image description pages
- $existing = $this->getExistingCategories();
- $categoryInserts = array_diff_assoc( $this->mCategories, $existing );
- $categoryDeletes = array_diff_assoc( $existing, $this->mCategories );
- $categoryUpdates = $categoryInserts + $categoryDeletes;
- $existing = $this->getExistingImages();
- $imageUpdates = array_diff_key( $existing, $this->mImages ) + array_diff_key( $this->mImages, $existing );
-
- $this->dumbTableUpdate( 'pagelinks', $this->getLinkInsertions(), 'pl_from' );
- $this->dumbTableUpdate( 'imagelinks', $this->getImageInsertions(), 'il_from' );
- $this->dumbTableUpdate( 'categorylinks', $this->getCategoryInsertions(), 'cl_from' );
- $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
- # pages which were changed, and fix the category table count
- $this->invalidateCategories( $categoryUpdates );
- $this->updateCategoryCounts( $categoryInserts, $categoryDeletes );
- $this->invalidateImageDescriptions( $imageUpdates );
-
- # Refresh links of all pages including this page
- # This will be in a separate transaction
- if ( $this->mRecursive ) {
- $this->queueRecursiveJobs();
- }
-
- wfProfileOut( __METHOD__ );
+ function queueRecursiveJobs() {
+ self::queueRecursiveJobsForTable( $this->mTitle, 'templatelinks' );
}
- function queueRecursiveJobs() {
+ /**
+ * Queue a RefreshLinks job for any table.
+ *
+ * @param Title $title Title to do job for
+ * @param String $table Table to use (e.g. 'templatelinks')
+ */
+ public static function queueRecursiveJobsForTable( Title $title, $table ) {
wfProfileIn( __METHOD__ );
-
- if ( $this->mTitle->getBacklinkCache()->hasLinks( 'templatelinks' ) ) {
+ if ( $title->getBacklinkCache()->hasLinks( $table ) ) {
$job = new RefreshLinksJob2(
- $this->mTitle,
+ $title,
array(
- 'table' => 'templatelinks',
+ 'table' => $table,
) + Job::newRootJobParams( // "overall" refresh links job info
- "refreshlinks:templatelinks:{$this->mTitle->getPrefixedText()}"
+ "refreshlinks:{$table}:{$title->getPrefixedText()}"
)
);
JobQueueGroup::singleton()->push( $job );
JobQueueGroup::singleton()->deduplicateRootJob( $job );
}
-
wfProfileOut( __METHOD__ );
}
@@ -283,21 +262,6 @@ class LinksUpdate extends SqlDataUpdate {
}
/**
- * @param $table
- * @param $insertions
- * @param $fromField
- */
- private function dumbTableUpdate( $table, $insertions, $fromField ) {
- $this->mDb->delete( $table, array( $fromField => $this->mId ), __METHOD__ );
- if ( count( $insertions ) ) {
- # The link array was constructed without FOR UPDATE, so there may
- # be collisions. This may cause minor link table inconsistencies,
- # which is better than crippling the site with lock contention.
- $this->mDb->insert( $table, $insertions, __METHOD__, array( 'IGNORE' ) );
- }
- }
-
- /**
* Update a table by doing a delete query then an insert query
* @param $table
* @param $prefix
@@ -354,7 +318,7 @@ class LinksUpdate extends SqlDataUpdate {
*/
private function getLinkInsertions( $existing = array() ) {
$arr = array();
- foreach( $this->mLinks as $ns => $dbkeys ) {
+ foreach ( $this->mLinks as $ns => $dbkeys ) {
$diffs = isset( $existing[$ns] )
? array_diff_key( $dbkeys, $existing[$ns] )
: $dbkeys;
@@ -376,7 +340,7 @@ class LinksUpdate extends SqlDataUpdate {
*/
private function getTemplateInsertions( $existing = array() ) {
$arr = array();
- foreach( $this->mTemplates as $ns => $dbkeys ) {
+ foreach ( $this->mTemplates as $ns => $dbkeys ) {
$diffs = isset( $existing[$ns] ) ? array_diff_key( $dbkeys, $existing[$ns] ) : $dbkeys;
foreach ( $diffs as $dbk => $id ) {
$arr[] = array(
@@ -398,7 +362,7 @@ class LinksUpdate extends SqlDataUpdate {
private function getImageInsertions( $existing = array() ) {
$arr = array();
$diffs = array_diff_key( $this->mImages, $existing );
- foreach( $diffs as $iname => $dummy ) {
+ foreach ( $diffs as $iname => $dummy ) {
$arr[] = array(
'il_from' => $this->mId,
'il_to' => $iname
@@ -415,8 +379,8 @@ class LinksUpdate extends SqlDataUpdate {
private function getExternalInsertions( $existing = array() ) {
$arr = array();
$diffs = array_diff_key( $this->mExternals, $existing );
- foreach( $diffs as $url => $dummy ) {
- foreach( wfMakeUrlIndexes( $url ) as $index ) {
+ foreach ( $diffs as $url => $dummy ) {
+ foreach ( wfMakeUrlIndexes( $url ) as $index ) {
$arr[] = array(
'el_from' => $this->mId,
'el_to' => $url,
@@ -481,7 +445,7 @@ class LinksUpdate extends SqlDataUpdate {
private function getInterlangInsertions( $existing = array() ) {
$diffs = array_diff_assoc( $this->mInterlangs, $existing );
$arr = array();
- foreach( $diffs as $lang => $title ) {
+ foreach ( $diffs as $lang => $title ) {
$arr[] = array(
'll_from' => $this->mId,
'll_lang' => $lang,
@@ -517,7 +481,7 @@ class LinksUpdate extends SqlDataUpdate {
*/
private function getInterwikiInsertions( $existing = array() ) {
$arr = array();
- foreach( $this->mInterwikis as $prefix => $dbkeys ) {
+ foreach ( $this->mInterwikis as $prefix => $dbkeys ) {
$diffs = isset( $existing[$prefix] ) ? array_diff_key( $dbkeys, $existing[$prefix] ) : $dbkeys;
foreach ( $diffs as $dbk => $id ) {
$arr[] = array(
@@ -807,6 +771,40 @@ class LinksUpdate extends SqlDataUpdate {
}
}
}
+
+ /**
+ * Fetch page links added by this LinksUpdate. Only available after the update is complete.
+ * @since 1.22
+ * @return null|array of Titles
+ */
+ public function getAddedLinks() {
+ if ( $this->linkInsertions === null ) {
+ return null;
+ }
+ $result = array();
+ foreach ( $this->linkInsertions as $insertion ) {
+ $result[] = Title::makeTitle( $insertion[ 'pl_namespace' ], $insertion[ 'pl_title' ] );
+ }
+ return $result;
+ }
+
+ /**
+ * Fetch page links removed by this LinksUpdate. Only available after the update is complete.
+ * @since 1.22
+ * @return null|array of Titles
+ */
+ public function getRemovedLinks() {
+ if ( $this->linkDeletions === null ) {
+ return null;
+ }
+ $result = array();
+ foreach ( $this->linkDeletions as $ns => $titles ) {
+ foreach ( $titles as $title => $unused ) {
+ $result[] = Title::makeTitle( $ns, $title );
+ }
+ }
+ return $result;
+ }
}
/**
@@ -840,22 +838,20 @@ class LinksDeletionUpdate extends SqlDataUpdate {
$id = $this->mPage->getId();
# Delete restrictions for it
- $this->mDb->delete( 'page_restrictions', array ( 'pr_page' => $id ), __METHOD__ );
+ $this->mDb->delete( 'page_restrictions', array( 'pr_page' => $id ), __METHOD__ );
# Fix category table counts
$cats = array();
$res = $this->mDb->select( 'categorylinks', 'cl_to', array( 'cl_from' => $id ), __METHOD__ );
foreach ( $res as $row ) {
- $cats [] = $row->cl_to;
+ $cats[] = $row->cl_to;
}
$this->mPage->updateCategoryCounts( array(), $cats );
# If using cascading deletes, we can skip some explicit deletes
if ( !$this->mDb->cascadingDeletes() ) {
- $this->mDb->delete( 'revision', array( 'rev_page' => $id ), __METHOD__ );
-
# Delete outgoing links
$this->mDb->delete( 'pagelinks', array( 'pl_from' => $id ), __METHOD__ );
$this->mDb->delete( 'imagelinks', array( 'il_from' => $id ), __METHOD__ );
diff --git a/includes/CryptRand.php b/includes/MWCryptRand.php
index d0305d8b..bac018e8 100644
--- a/includes/CryptRand.php
+++ b/includes/MWCryptRand.php
@@ -106,7 +106,7 @@ class MWCryptRand {
}
}
// The absolute filename itself will differ from install to install so don't leave it out
- if( ( $path = realpath( $file ) ) !== false ) {
+ if ( ( $path = realpath( $file ) ) !== false ) {
$state .= $path;
} else {
$state .= $file;
diff --git a/includes/MWFunction.php b/includes/MWFunction.php
index 36fcc30b..6d11d178 100644
--- a/includes/MWFunction.php
+++ b/includes/MWFunction.php
@@ -23,48 +23,24 @@
class MWFunction {
/**
- * @param $callback
- * @return array
- * @throws MWException
- */
- protected static function cleanCallback( $callback ) {
- if( is_string( $callback ) ) {
- if ( strpos( $callback, '::' ) !== false ) {
- // PHP 5.1 cannot use call_user_func( 'Class::Method' )
- // It can only handle only call_user_func( array( 'Class', 'Method' ) )
- $callback = explode( '::', $callback, 2);
- }
- }
-
- if( count( $callback ) == 2 && $callback[0] == 'self' || $callback[0] == 'parent' ) {
- throw new MWException( 'MWFunction cannot call self::method() or parent::method()' );
- }
-
- // Run autoloader (workaround for call_user_func_array bug: http://bugs.php.net/bug.php?id=51329)
- is_callable( $callback );
-
- return $callback;
- }
-
- /**
+ * @deprecated since 1.22; use call_user_func()
* @param $callback
* @return mixed
*/
public static function call( $callback ) {
- $callback = self::cleanCallback( $callback );
-
+ wfDeprecated( __METHOD__, '1.22' );
$args = func_get_args();
-
return call_user_func_array( 'call_user_func', $args );
}
/**
+ * @deprecated since 1.22; use call_user_func_array()
* @param $callback
* @param $argsarams
* @return mixed
*/
public static function callArray( $callback, $argsarams ) {
- $callback = self::cleanCallback( $callback );
+ wfDeprecated( __METHOD__, '1.22' );
return call_user_func_array( $callback, $argsarams );
}
@@ -74,7 +50,7 @@ class MWFunction {
* @return object
*/
public static function newObj( $class, $args = array() ) {
- if( !count( $args ) ) {
+ if ( !count( $args ) ) {
return new $class;
}
diff --git a/includes/MagicWord.php b/includes/MagicWord.php
index 7b669249..427a1adc 100644
--- a/includes/MagicWord.php
+++ b/includes/MagicWord.php
@@ -124,6 +124,7 @@ class MagicWord {
'revisionyear',
'revisiontimestamp',
'revisionuser',
+ 'revisionsize',
'subpagename',
'subpagenamee',
'talkspace',
@@ -138,6 +139,8 @@ class MagicWord {
'numberofactiveusers',
'numberofpages',
'currentversion',
+ 'rootpagename',
+ 'rootpagenamee',
'basepagename',
'basepagenamee',
'currenttimestamp',
@@ -149,7 +152,7 @@ class MagicWord {
);
/* Array of caching hints for ParserCache */
- static public $mCacheTTLs = array (
+ static public $mCacheTTLs = array(
'currentmonth' => 86400,
'currentmonth1' => 86400,
'currentmonthname' => 86400,
@@ -308,9 +311,9 @@ class MagicWord {
$this->mId = $id;
$wgContLang->getMagic( $this );
if ( !$this->mSynonyms ) {
- $this->mSynonyms = array( 'dkjsagfjsgashfajsh' );
+ $this->mSynonyms = array( 'brionmademeputthishere' );
+ wfProfileOut( __METHOD__ );
throw new MWException( "Error: invalid magic word '$id'" );
- #wfDebugLog( 'exception', "Error: invalid magic word '$id'\n" );
}
wfProfileOut( __METHOD__ );
}
@@ -326,9 +329,10 @@ class MagicWord {
usort( $synonyms, array( $this, 'compareStringLength' ) );
$escSyn = array();
- foreach ( $synonyms 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 );
$case = $this->mCaseSensitive ? '' : 'iu';
@@ -381,8 +385,9 @@ class MagicWord {
* @return string
*/
function getRegexCase() {
- if ( $this->mRegex === '' )
+ if ( $this->mRegex === '' ) {
$this->initRegex();
+ }
return $this->mCaseSensitive ? '' : 'iu';
}
@@ -509,7 +514,7 @@ class MagicWord {
*/
function replace( $replacement, $subject, $limit = -1 ) {
$res = preg_replace( $this->getRegex(), StringUtils::escapeRegexReplacement( $replacement ), $subject, $limit );
- $this->mModified = !($res === $subject);
+ $this->mModified = $res !== $subject;
return $res;
}
@@ -525,7 +530,7 @@ class MagicWord {
*/
function substituteCallback( $text, $callback ) {
$res = preg_replace_callback( $this->getVariableRegex(), $callback, $text );
- $this->mModified = !($res === $text);
+ $this->mModified = $res !== $text;
return $res;
}
@@ -597,14 +602,14 @@ class MagicWord {
function replaceMultiple( $magicarr, $subject, &$result ) {
$search = array();
$replace = array();
- foreach( $magicarr as $id => $replacement ) {
+ foreach ( $magicarr as $id => $replacement ) {
$mw = MagicWord::get( $id );
$search[] = $mw->getRegex();
$replace[] = $replacement;
}
$result = preg_replace( $search, $replace, $subject );
- return !($result === $subject);
+ return $result !== $subject;
}
/**
diff --git a/includes/MappedIterator.php b/includes/MappedIterator.php
index b4376f44..70d20327 100644
--- a/includes/MappedIterator.php
+++ b/includes/MappedIterator.php
@@ -26,11 +26,15 @@
*
* @since 1.21
*/
-class MappedIterator implements Iterator {
- /** @var Iterator */
- protected $baseIterator;
- /** @var Closure */
+class MappedIterator extends FilterIterator {
+ /** @var callable */
protected $vCallback;
+ /** @var callable */
+ protected $aCallback;
+ /** @var array */
+ protected $cache = array();
+
+ protected $rewound = false; // boolean; whether rewind() has been called
/**
* Build an new iterator from a base iterator by having the former wrap the
@@ -38,59 +42,73 @@ class MappedIterator implements Iterator {
* The callback takes the result of current() on the base iterator as an argument.
* The keys of the base iterator are reused verbatim.
*
+ * An "accept" callback can also be provided which will be called for each value in
+ * the base iterator (post-callback) and will return true if that value should be
+ * included in iteration of the MappedIterator (otherwise it will be filtered out).
+ *
* @param Iterator|Array $iter
- * @param Closure $vCallback
+ * @param callable $vCallback Value transformation callback
+ * @param array $options Options map (includes "accept") (since 1.22)
* @throws MWException
*/
- public function __construct( $iter, Closure $vCallback ) {
+ public function __construct( $iter, $vCallback, array $options = array() ) {
if ( is_array( $iter ) ) {
- $this->baseIterator = new ArrayIterator( $iter );
+ $baseIterator = new ArrayIterator( $iter );
} elseif ( $iter instanceof Iterator ) {
- $this->baseIterator = $iter;
+ $baseIterator = $iter;
} else {
throw new MWException( "Invalid base iterator provided." );
}
+ parent::__construct( $baseIterator );
$this->vCallback = $vCallback;
- }
+ $this->aCallback = isset( $options['accept'] ) ? $options['accept'] : null;
+ }
+
+ public function next() {
+ $this->cache = array();
+ parent::next();
+ }
- /**
- * @return void
- */
public function rewind() {
- $this->baseIterator->rewind();
+ $this->rewound = true;
+ $this->cache = array();
+ parent::rewind();
}
- /**
- * @return Mixed|null Returns null if out of range
- */
- public function current() {
- if ( !$this->baseIterator->valid() ) {
- return null; // out of range
+ public function accept() {
+ $value = call_user_func( $this->vCallback, $this->getInnerIterator()->current() );
+ $ok = ( $this->aCallback ) ? call_user_func( $this->aCallback, $value ) : true;
+ if ( $ok ) {
+ $this->cache['current'] = $value;
}
- return call_user_func_array( $this->vCallback, array( $this->baseIterator->current() ) );
+ return $ok;
}
- /**
- * @return Mixed|null Returns null if out of range
- */
public function key() {
- if ( !$this->baseIterator->valid() ) {
- return null; // out of range
- }
- return $this->baseIterator->key();
+ $this->init();
+ return parent::key();
}
- /**
- * @return void
- */
- public function next() {
- $this->baseIterator->next();
+ public function valid() {
+ $this->init();
+ return parent::valid();
+ }
+
+ public function current() {
+ $this->init();
+ if ( parent::valid() ) {
+ return $this->cache['current'];
+ } else {
+ return null; // out of range
+ }
}
/**
- * @return bool
+ * Obviate the usual need for rewind() before using a FilterIterator in a manual loop
*/
- public function valid() {
- return $this->baseIterator->valid();
+ protected function init() {
+ if ( !$this->rewound ) {
+ $this->rewind();
+ }
}
}
diff --git a/includes/Message.php b/includes/Message.php
index 5719f830..57c6264d 100644
--- a/includes/Message.php
+++ b/includes/Message.php
@@ -234,7 +234,13 @@ class Message {
* @return string
*/
public function getKey() {
- return $this->key;
+ if ( is_array( $this->key ) ) {
+ // May happen if some kind of fallback is applied.
+ // For now, just use the first key. We really need a better solution.
+ return $this->key[0];
+ } else {
+ return $this->key;
+ }
}
/**
@@ -326,7 +332,7 @@ class Message {
if ( isset( $params[0] ) && is_array( $params[0] ) ) {
$params = $params[0];
}
- foreach( $params as $param ) {
+ foreach ( $params as $param ) {
$this->parameters[] = self::rawParam( $param );
}
return $this;
@@ -344,13 +350,103 @@ class Message {
if ( isset( $params[0] ) && is_array( $params[0] ) ) {
$params = $params[0];
}
- foreach( $params as $param ) {
+ foreach ( $params as $param ) {
$this->parameters[] = self::numParam( $param );
}
return $this;
}
/**
+ * Add parameters that are durations of time and will be passed through
+ * Language::formatDuration before substitution
+ * @since 1.22
+ * @param Varargs: numeric parameters (or single argument that is array of numeric parameters)
+ * @return Message: $this
+ */
+ public function durationParams( /*...*/ ) {
+ $params = func_get_args();
+ if ( isset( $params[0] ) && is_array( $params[0] ) ) {
+ $params = $params[0];
+ }
+ foreach ( $params as $param ) {
+ $this->parameters[] = self::durationParam( $param );
+ }
+ return $this;
+ }
+
+ /**
+ * Add parameters that are expiration times and will be passed through
+ * Language::formatExpiry before substitution
+ * @since 1.22
+ * @param Varargs: numeric parameters (or single argument that is array of numeric parameters)
+ * @return Message: $this
+ */
+ public function expiryParams( /*...*/ ) {
+ $params = func_get_args();
+ if ( isset( $params[0] ) && is_array( $params[0] ) ) {
+ $params = $params[0];
+ }
+ foreach ( $params as $param ) {
+ $this->parameters[] = self::expiryParam( $param );
+ }
+ return $this;
+ }
+
+ /**
+ * Add parameters that are time periods and will be passed through
+ * Language::formatTimePeriod before substitution
+ * @since 1.22
+ * @param Varargs: numeric parameters (or single argument that is array of numeric parameters)
+ * @return Message: $this
+ */
+ public function timeperiodParams( /*...*/ ) {
+ $params = func_get_args();
+ if ( isset( $params[0] ) && is_array( $params[0] ) ) {
+ $params = $params[0];
+ }
+ foreach ( $params as $param ) {
+ $this->parameters[] = self::timeperiodParam( $param );
+ }
+ return $this;
+ }
+
+ /**
+ * Add parameters that are file sizes and will be passed through
+ * Language::formatSize before substitution
+ * @since 1.22
+ * @param Varargs: numeric parameters (or single argument that is array of numeric parameters)
+ * @return Message: $this
+ */
+ public function sizeParams( /*...*/ ) {
+ $params = func_get_args();
+ if ( isset( $params[0] ) && is_array( $params[0] ) ) {
+ $params = $params[0];
+ }
+ foreach ( $params as $param ) {
+ $this->parameters[] = self::sizeParam( $param );
+ }
+ return $this;
+ }
+
+ /**
+ * Add parameters that are bitrates and will be passed through
+ * Language::formatBitrate before substitution
+ * @since 1.22
+ * @param Varargs: numeric parameters (or single argument that is array of numeric parameters)
+ * @return Message: $this
+ */
+ public function bitrateParams( /*...*/ ) {
+ $params = func_get_args();
+ if ( isset( $params[0] ) && is_array( $params[0] ) ) {
+ $params = $params[0];
+ }
+ foreach ( $params as $param ) {
+ $this->parameters[] = self::bitrateParam( $param );
+ }
+ return $this;
+ }
+
+ /**
* Set the language and the title from a context object
* @since 1.19
* @param $context IContextSource
@@ -377,7 +473,7 @@ class Message {
if ( $lang instanceof Language || $lang instanceof StubUserLang ) {
$this->language = $lang;
} elseif ( is_string( $lang ) ) {
- if( $this->language->getCode() != $lang ) {
+ if ( $this->language->getCode() != $lang ) {
$this->language = Language::factory( $lang );
}
} else {
@@ -417,7 +513,7 @@ class Message {
* @since 1.20
*/
public function setInterfaceMessageFlag( $value ) {
- $this->interface = (bool) $value;
+ $this->interface = (bool)$value;
return $this;
}
@@ -428,7 +524,7 @@ class Message {
* @return Message: $this
*/
public function useDatabase( $value ) {
- $this->useDatabase = (bool) $value;
+ $this->useDatabase = (bool)$value;
return $this;
}
@@ -484,17 +580,17 @@ class Message {
$string = $this->replaceParameters( $string, 'before' );
# Maybe transform using the full parser
- if( $this->format === 'parse' ) {
+ if ( $this->format === 'parse' ) {
$string = $this->parseText( $string );
$m = array();
- if( preg_match( '/^<p>(.*)\n?<\/p>\n?$/sU', $string, $m ) ) {
+ if ( preg_match( '/^<p>(.*)\n?<\/p>\n?$/sU', $string, $m ) ) {
$string = $m[1];
}
- } elseif( $this->format === 'block-parse' ) {
+ } elseif ( $this->format === 'block-parse' ) {
$string = $this->parseText( $string );
- } elseif( $this->format === 'text' ) {
+ } elseif ( $this->format === 'text' ) {
$string = $this->transformText( $string );
- } elseif( $this->format === 'escaped' ) {
+ } elseif ( $this->format === 'escaped' ) {
$string = $this->transformText( $string );
$string = htmlspecialchars( $string, ENT_QUOTES, 'UTF-8', false );
}
@@ -633,6 +729,51 @@ class Message {
}
/**
+ * @since 1.22
+ * @param $value
+ * @return array
+ */
+ public static function durationParam( $value ) {
+ return array( 'duration' => $value );
+ }
+
+ /**
+ * @since 1.22
+ * @param $value
+ * @return array
+ */
+ public static function expiryParam( $value ) {
+ return array( 'expiry' => $value );
+ }
+
+ /**
+ * @since 1.22
+ * @param $value
+ * @return array
+ */
+ public static function timeperiodParam( $value ) {
+ return array( 'period' => $value );
+ }
+
+ /**
+ * @since 1.22
+ * @param $value
+ * @return array
+ */
+ public static function sizeParam( $value ) {
+ return array( 'size' => $value );
+ }
+
+ /**
+ * @since 1.22
+ * @param $value
+ * @return array
+ */
+ public static function bitrateParam( $value ) {
+ return array( 'bitrate' => $value );
+ }
+
+ /**
* Substitutes any parameters into the message text.
* @since 1.17
* @param string $message the message text
@@ -641,10 +782,10 @@ class Message {
*/
protected function replaceParameters( $message, $type = 'before' ) {
$replacementKeys = array();
- foreach( $this->parameters as $n => $param ) {
+ foreach ( $this->parameters as $n => $param ) {
list( $paramType, $value ) = $this->extractParam( $param );
if ( $type === $paramType ) {
- $replacementKeys['$' . ($n + 1)] = $value;
+ $replacementKeys['$' . ( $n + 1 )] = $value;
}
}
$message = strtr( $message, $replacementKeys );
@@ -658,20 +799,37 @@ class Message {
* @return Tuple(type, value)
*/
protected function extractParam( $param ) {
- if ( is_array( $param ) && isset( $param['raw'] ) ) {
- return array( 'after', $param['raw'] );
- } elseif ( is_array( $param ) && isset( $param['num'] ) ) {
- // Replace number params always in before step for now.
- // No support for combined raw and num params
- return array( 'before', $this->language->formatNum( $param['num'] ) );
- } elseif ( !is_array( $param ) ) {
- return array( 'before', $param );
+ if ( is_array( $param ) ) {
+ if ( isset( $param['raw'] ) ) {
+ return array( 'after', $param['raw'] );
+ } elseif ( isset( $param['num'] ) ) {
+ // Replace number params always in before step for now.
+ // No support for combined raw and num params
+ return array( 'before', $this->language->formatNum( $param['num'] ) );
+ } elseif ( isset( $param['duration'] ) ) {
+ return array( 'before', $this->language->formatDuration( $param['duration'] ) );
+ } elseif ( isset( $param['expiry'] ) ) {
+ return array( 'before', $this->language->formatExpiry( $param['expiry'] ) );
+ } elseif ( isset( $param['period'] ) ) {
+ return array( 'before', $this->language->formatTimePeriod( $param['period'] ) );
+ } elseif ( isset( $param['size'] ) ) {
+ return array( 'before', $this->language->formatSize( $param['size'] ) );
+ } elseif ( isset( $param['bitrate'] ) ) {
+ return array( 'before', $this->language->formatBitrate( $param['bitrate'] ) );
+ } else {
+ trigger_error(
+ "Invalid message parameter: " . htmlspecialchars( serialize( $param ) ),
+ E_USER_WARNING
+ );
+ return array( 'before', '[INVALID]' );
+ }
+ } elseif ( $param instanceof Message ) {
+ // Message objects should not be before parameters because
+ // then they'll get double escaped. If the message needs to be
+ // escaped, it'll happen right here when we call toString().
+ return array( 'after', $param->toString() );
} else {
- trigger_error(
- "Invalid message parameter: " . htmlspecialchars( serialize( $param ) ),
- E_USER_WARNING
- );
- return array( 'before', '[INVALID]' );
+ return array( 'before', $param );
}
}
@@ -760,7 +918,7 @@ class RawMessage extends Message {
*/
public function fetchMessage() {
// Just in case the message is unset somewhere.
- if( !isset( $this->message ) ) {
+ if ( !isset( $this->message ) ) {
$this->message = $this->key;
}
return $this->message;
diff --git a/includes/Metadata.php b/includes/Metadata.php
index 0b8014a7..37df489c 100644
--- a/includes/Metadata.php
+++ b/includes/Metadata.php
@@ -42,7 +42,7 @@ abstract class RdfMetaData {
$httpaccept = isset( $_SERVER['HTTP_ACCEPT'] ) ? $_SERVER['HTTP_ACCEPT'] : null;
$rdftype = wfNegotiateType( wfAcceptToPrefs( $httpaccept ), wfAcceptToPrefs( self::RDF_TYPE_PREFS ) );
- if( !$rdftype ) {
+ if ( !$rdftype ) {
throw new HttpError( 406, wfMessage( 'notacceptable' ) );
}
@@ -70,7 +70,7 @@ abstract class RdfMetaData {
$lastEditor = User::newFromId( $this->mArticle->getUser() );
$this->person( 'creator', $lastEditor );
- foreach( $this->mArticle->getContributors() as $user ) {
+ foreach ( $this->mArticle->getContributors() as $user ) {
$this->person( 'contributor', $user );
}
@@ -89,13 +89,13 @@ abstract class RdfMetaData {
}
protected function pageOrString( $name, $page, $str ) {
- if( $page instanceof Title ) {
+ if ( $page instanceof Title ) {
$nt = $page;
} else {
$nt = Title::newFromText( $page );
}
- if( !$nt || $nt->getArticleID() == 0 ) {
+ if ( !$nt || $nt->getArticleID() == 0 ) {
$this->element( $name, $str );
} else {
$this->page( $name, $nt );
@@ -107,7 +107,7 @@ abstract class RdfMetaData {
* @param $title Title
*/
protected function page( $name, $title ) {
- $this->url( $name, $title->getFullUrl() );
+ $this->url( $name, $title->getFullURL() );
}
protected function url( $name, $url ) {
@@ -116,11 +116,13 @@ abstract class RdfMetaData {
}
protected function person( $name, User $user ) {
- if( $user->isAnon() ) {
+ global $wgHiddenPrefs;
+
+ if ( $user->isAnon() ) {
$this->element( $name, wfMessage( 'anonymous' )->numParams( 1 )->text() );
} else {
$real = $user->getRealName();
- if( $real ) {
+ if ( $real && !in_array( 'realname', $wgHiddenPrefs ) ) {
$this->element( $name, $real );
} else {
$userName = $user->getName();
@@ -140,12 +142,12 @@ abstract class RdfMetaData {
protected function rights() {
global $wgRightsPage, $wgRightsUrl, $wgRightsText;
- if( $wgRightsPage && ( $nt = Title::newFromText( $wgRightsPage ) )
+ if ( $wgRightsPage && ( $nt = Title::newFromText( $wgRightsPage ) )
&& ( $nt->getArticleID() != 0 ) ) {
$this->page( 'rights', $nt );
- } elseif( $wgRightsUrl ) {
+ } elseif ( $wgRightsUrl ) {
$this->url( 'rights', $wgRightsUrl );
- } elseif( $wgRightsText ) {
+ } elseif ( $wgRightsText ) {
$this->element( 'rights', $wgRightsText );
}
}
@@ -153,11 +155,11 @@ abstract class RdfMetaData {
protected function getTerms( $url ) {
global $wgLicenseTerms;
- if( $wgLicenseTerms ) {
+ if ( $wgLicenseTerms ) {
return $wgLicenseTerms;
} else {
$known = $this->getKnownLicenses();
- if( isset( $known[$url] ) ) {
+ if ( isset( $known[$url] ) ) {
return $known[$url];
} else {
return array();
@@ -173,7 +175,7 @@ abstract class RdfMetaData {
foreach ( $ccVersions as $version ) {
foreach ( $ccLicenses as $license ) {
- if( $version == '2.0' && substr( $license, 0, 2 ) != 'by' ) {
+ if ( $version == '2.0' && substr( $license, 0, 2 ) != 'by' ) {
# 2.0 dropped the non-attribs licenses
continue;
}
diff --git a/includes/MimeMagic.php b/includes/MimeMagic.php
index edabd54c..8220e92f 100644
--- a/includes/MimeMagic.php
+++ b/includes/MimeMagic.php
@@ -39,7 +39,7 @@
* 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
+define( 'MM_WELL_KNOWN_MIME_TYPES', <<<END_STRING
application/ogg ogx ogg ogm ogv oga spx
application/pdf pdf
application/vnd.oasis.opendocument.chart odc
@@ -91,7 +91,7 @@ END_STRING
* An extensive list of well known mime types is provided by
* the file mime.info in the includes directory.
*/
-define('MM_WELL_KNOWN_MIME_INFO', <<<END_STRING
+define( 'MM_WELL_KNOWN_MIME_INFO', <<<END_STRING
application/pdf [OFFICE]
application/vnd.oasis.opendocument.chart [OFFICE]
application/vnd.oasis.opendocument.chart-template [OFFICE]
@@ -169,10 +169,6 @@ class MimeMagic {
*/
private static $instance;
- /** True if the fileinfo extension has been loaded
- */
- private static $extensionLoaded = false;
-
/** Initializes the MimeMagic object. This is called by MimeMagic::singleton().
*
* This constructor parses the mime.types and mime.info files and build internal mappings.
@@ -182,7 +178,7 @@ class MimeMagic {
* --- load mime.types ---
*/
- global $wgMimeTypeFile, $IP, $wgLoadFileinfoExtension;
+ global $wgMimeTypeFile, $IP;
$types = MM_WELL_KNOWN_MIME_TYPES;
@@ -190,11 +186,6 @@ class MimeMagic {
$wgMimeTypeFile = "$IP/$wgMimeTypeFile";
}
- if ( $wgLoadFileinfoExtension && !self::$extensionLoaded ) {
- self::$extensionLoaded = true;
- wfDl( 'fileinfo' );
- }
-
if ( $wgMimeTypeFile ) {
if ( is_file( $wgMimeTypeFile ) and is_readable( $wgMimeTypeFile ) ) {
wfDebug( __METHOD__ . ": loading mime types from $wgMimeTypeFile\n" );
@@ -231,7 +222,7 @@ class MimeMagic {
}
$mime = substr( $s, 0, $i );
- $ext = trim( substr( $s, $i+1 ) );
+ $ext = trim( substr( $s, $i + 1 ) );
if ( empty( $ext ) ) {
continue;
@@ -432,7 +423,7 @@ class MimeMagic {
$ext = explode( ' ', $ext );
$extension = strtolower( $extension );
- return in_array( $extension, $ext );
+ return in_array( $extension, $ext );
}
/**
@@ -560,7 +551,7 @@ class MimeMagic {
$mime = $this->doGuessMimeType( $file, $ext );
- if( !$mime ) {
+ if ( !$mime ) {
wfDebug( __METHOD__ . ": internal type detection failed for $file (.$ext)...\n" );
$mime = $this->detectMimeType( $file, $ext );
}
@@ -587,7 +578,7 @@ class MimeMagic {
$f = fopen( $file, 'rt' );
wfRestoreWarnings();
- if( !$f ) {
+ if ( !$f ) {
return 'unknown/unknown';
}
$head = fread( $f, 1024 );
@@ -628,7 +619,7 @@ class MimeMagic {
$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 );
+ $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";
@@ -642,7 +633,7 @@ class MimeMagic {
}
/* Look for WebP */
- if ( strncmp( $head, "RIFF", 4 ) == 0 && strncmp( substr( $head, 8, 8), "WEBPVP8 ", 8 ) == 0 ) {
+ 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";
}
@@ -689,11 +680,11 @@ class MimeMagic {
$script_type = null;
# detect by shebang
- if ( substr( $head, 0, 2) == "#!" ) {
+ if ( substr( $head, 0, 2 ) == "#!" ) {
$script_type = "ASCII";
- } elseif ( substr( $head, 0, 5) == "\xef\xbb\xbf#!" ) {
+ } elseif ( substr( $head, 0, 5 ) == "\xef\xbb\xbf#!" ) {
$script_type = "UTF-8";
- } elseif ( substr( $head, 0, 7) == "\xfe\xff\x00#\x00!" ) {
+ } elseif ( substr( $head, 0, 7 ) == "\xfe\xff\x00#\x00!" ) {
$script_type = "UTF-16BE";
} elseif ( substr( $head, 0, 7 ) == "\xff\xfe#\x00!" ) {
$script_type = "UTF-16LE";
@@ -705,8 +696,8 @@ class MimeMagic {
$pack = array( 'UTF-16BE' => 'n*', 'UTF-16LE' => 'v*' );
$chars = unpack( $pack[$script_type], substr( $head, 2 ) );
$head = '';
- foreach( $chars as $codepoint ) {
- if( $codepoint < 128 ) {
+ foreach ( $chars as $codepoint ) {
+ if ( $codepoint < 128 ) {
$head .= chr( $codepoint );
} else {
$head .= '?';
@@ -733,7 +724,7 @@ class MimeMagic {
$gis = getimagesize( $file );
wfRestoreWarnings();
- if( $gis && isset( $gis['mime'] ) ) {
+ if ( $gis && isset( $gis['mime'] ) ) {
$mime = $gis['mime'];
wfDebug( __METHOD__ . ": getimagesize detected $file as $mime\n" );
return $mime;
@@ -741,7 +732,7 @@ class MimeMagic {
// Also test DjVu
$deja = new DjVuImage( $file );
- if( $deja->isValid() ) {
+ if ( $deja->isValid() ) {
wfDebug( __METHOD__ . ": detected $file as image/vnd.djvu\n" );
return 'image/vnd.djvu';
}
@@ -763,7 +754,7 @@ class MimeMagic {
* @return string
*/
function detectZipType( $header, $tail = null, $ext = false ) {
- if( $ext ) { # TODO: remove $ext param
+ if ( $ext ) { # TODO: remove $ext param
wfDebug( __METHOD__ . ": WARNING: use of the \$ext parameter is deprecated. " .
"Use improveTypeFromExtension(\$mime, \$ext) instead.\n" );
}
@@ -804,7 +795,7 @@ class MimeMagic {
* 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) ) {
+ if ( $this->isMatchingExtension( $ext, $mime ) ) {
/* A known file extension for an OPC file,
* find the proper mime type for that file extension
*/
@@ -815,12 +806,12 @@ class MimeMagic {
}
wfDebug( __METHOD__ . ": detected an Open Packaging Conventions archive: $mime\n" );
} elseif ( substr( $header, 0, 8 ) == "\xd0\xcf\x11\xe0\xa1\xb1\x1a\xe1" &&
- ($headerpos = strpos( $tail, "PK\x03\x04" ) ) !== false &&
+ ( $headerpos = strpos( $tail, "PK\x03\x04" ) ) !== false &&
preg_match( $openxmlRegex, substr( $tail, $headerpos + 30 ) ) ) {
- if ( substr( $header, 512, 4) == "\xEC\xA5\xC1\x00" ) {
+ if ( substr( $header, 512, 4 ) == "\xEC\xA5\xC1\x00" ) {
$mime = "application/msword";
}
- switch( substr( $header, 512, 6) ) {
+ 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":
@@ -876,9 +867,8 @@ class MimeMagic {
$m = null;
if ( $wgMimeDetectorCommand ) {
- // @todo FIXME: Use wfShellExec
- $fn = wfEscapeShellArg( $file );
- $m = `$wgMimeDetectorCommand $fn`;
+ $args = wfEscapeShellArg( $file );
+ $m = wfShellExec( "$wgMimeDetectorCommand $args" );
} elseif ( function_exists( "finfo_open" ) && function_exists( "finfo_file" ) ) {
# This required the fileinfo extension by PECL,
@@ -897,7 +887,7 @@ class MimeMagic {
$m = finfo_file( $mime_magic_resource, $file );
finfo_close( $mime_magic_resource );
} else {
- wfDebug( __METHOD__ . ": finfo_open failed on ".FILEINFO_MIME."!\n" );
+ wfDebug( __METHOD__ . ": finfo_open failed on " . FILEINFO_MIME . "!\n" );
}
} elseif ( function_exists( "mime_content_type" ) ) {
@@ -935,7 +925,7 @@ class MimeMagic {
$ext = strtolower( $i ? substr( $file, $i + 1 ) : '' );
}
if ( $ext ) {
- if( $this->isRecognizableExtension( $ext ) ) {
+ if ( $this->isRecognizableExtension( $ext ) ) {
wfDebug( __METHOD__ . ": refusing to guess mime type for .$ext file, we should have recognized it\n" );
} else {
$m = $this->guessTypesForExtension( $ext );
@@ -968,12 +958,12 @@ class MimeMagic {
* @return (int?string?) a value to be used with the MEDIATYPE_xxx constants.
*/
function getMediaType( $path = null, $mime = null ) {
- if( !$mime && !$path ) {
+ if ( !$mime && !$path ) {
return MEDIATYPE_UNKNOWN;
}
// If mime type is unknown, guess it
- if( !$mime ) {
+ if ( !$mime ) {
$mime = $this->guessMimeType( $path, false );
}
@@ -983,22 +973,30 @@ class MimeMagic {
// Read a chunk of the file
$f = fopen( $path, "rt" );
- if ( !$f ) return MEDIATYPE_UNKNOWN;
+ if ( !$f ) {
+ return MEDIATYPE_UNKNOWN;
+ }
$head = fread( $f, 256 );
fclose( $f );
$head = strtolower( $head );
// This is an UGLY HACK, file should be parsed correctly
- if ( strpos( $head, 'theora' ) !== false ) return MEDIATYPE_VIDEO;
- elseif ( strpos( $head, 'vorbis' ) !== false ) return MEDIATYPE_AUDIO;
- elseif ( strpos( $head, 'flac' ) !== false ) return MEDIATYPE_AUDIO;
- elseif ( strpos( $head, 'speex' ) !== false ) return MEDIATYPE_AUDIO;
- else return MEDIATYPE_MULTIMEDIA;
+ if ( strpos( $head, 'theora' ) !== false ) {
+ return MEDIATYPE_VIDEO;
+ } elseif ( strpos( $head, 'vorbis' ) !== false ) {
+ return MEDIATYPE_AUDIO;
+ } elseif ( strpos( $head, 'flac' ) !== false ) {
+ return MEDIATYPE_AUDIO;
+ } elseif ( strpos( $head, 'speex' ) !== false ) {
+ return MEDIATYPE_AUDIO;
+ } else {
+ return MEDIATYPE_MULTIMEDIA;
+ }
}
// Check for entry for full mime type
- if( $mime ) {
+ if ( $mime ) {
$type = $this->findMediaType( $mime );
if ( $type !== MEDIATYPE_UNKNOWN ) {
return $type;
@@ -1029,7 +1027,7 @@ class MimeMagic {
}
}
- if( !$type ) {
+ if ( !$type ) {
$type = MEDIATYPE_UNKNOWN;
}
diff --git a/includes/Namespace.php b/includes/Namespace.php
index fccfbedb..5c8e63b7 100644
--- a/includes/Namespace.php
+++ b/includes/Namespace.php
@@ -334,7 +334,7 @@ class MWNamespace {
public static function getContentNamespaces() {
global $wgContentNamespaces;
if ( !is_array( $wgContentNamespaces ) || $wgContentNamespaces === array() ) {
- return NS_MAIN;
+ return array( NS_MAIN );
} elseif ( !in_array( NS_MAIN, $wgContentNamespaces ) ) {
// always force NS_MAIN to be part of array (to match the algorithm used by isContent)
return array_merge( array( NS_MAIN ), $wgContentNamespaces );
@@ -387,9 +387,9 @@ class MWNamespace {
if ( in_array( $index, self::$alwaysCapitalizedNamespaces ) ) {
return true;
}
- if ( isset( $wgCapitalLinkOverrides[ $index ] ) ) {
+ if ( isset( $wgCapitalLinkOverrides[$index] ) ) {
// $wgCapitalLinkOverrides is explicitly set
- return $wgCapitalLinkOverrides[ $index ];
+ return $wgCapitalLinkOverrides[$index];
}
// Default to the global setting
return $wgCapitalLinks;
diff --git a/includes/OutputHandler.php b/includes/OutputHandler.php
index 6b40c307..3860b8e2 100644
--- a/includes/OutputHandler.php
+++ b/includes/OutputHandler.php
@@ -31,11 +31,19 @@ function wfOutputHandler( $s ) {
global $wgDisableOutputCompression, $wgValidateAllHtml;
$s = wfMangleFlashPolicy( $s );
if ( $wgValidateAllHtml ) {
- $headers = apache_response_headers();
- $isHTML = true;
- foreach ( $headers as $name => $value ) {
- if ( strtolower( $name ) == 'content-type' && strpos( $value, 'text/html' ) === false && strpos( $value, 'application/xhtml+xml' ) === false ) {
- $isHTML = false;
+ $headers = headers_list();
+ $isHTML = false;
+ foreach ( $headers as $header ) {
+ $parts = explode( ':', $header, 2 );
+ if ( count( $parts ) !== 2 ) {
+ continue;
+ }
+ $name = strtolower( trim( $parts[0] ) );
+ $value = trim( $parts[1] );
+ if ( $name == 'content-type' && ( strpos( $value, 'text/html' ) === 0
+ || strpos( $value, 'application/xhtml+xml' ) === 0 )
+ ) {
+ $isHTML = true;
break;
}
}
@@ -64,10 +72,10 @@ function wfOutputHandler( $s ) {
*/
function wfRequestExtension() {
/// @todo FIXME: this sort of dupes some code in WebRequest::getRequestUrl()
- if( isset( $_SERVER['REQUEST_URI'] ) ) {
+ if ( isset( $_SERVER['REQUEST_URI'] ) ) {
// Strip the query string...
list( $path ) = explode( '?', $_SERVER['REQUEST_URI'], 2 );
- } elseif( isset( $_SERVER['SCRIPT_NAME'] ) ) {
+ } elseif ( isset( $_SERVER['SCRIPT_NAME'] ) ) {
// Probably IIS. QUERY_STRING appears separately.
$path = $_SERVER['SCRIPT_NAME'];
} else {
@@ -76,7 +84,7 @@ function wfRequestExtension() {
}
$period = strrpos( $path, '.' );
- if( $period !== false ) {
+ if ( $period !== false ) {
return strtolower( substr( $path, $period ) );
}
return '';
@@ -91,17 +99,17 @@ function wfRequestExtension() {
* @return string
*/
function wfGzipHandler( $s ) {
- if( !function_exists( 'gzencode' ) ) {
+ if ( !function_exists( 'gzencode' ) ) {
wfDebug( __FUNCTION__ . "() skipping compression (gzencode unavailable)\n" );
return $s;
}
- if( headers_sent() ) {
+ if ( headers_sent() ) {
wfDebug( __FUNCTION__ . "() skipping compression (headers already sent)\n" );
return $s;
}
$ext = wfRequestExtension();
- if( $ext == '.gz' || $ext == '.tgz' ) {
+ if ( $ext == '.gz' || $ext == '.tgz' ) {
// Don't do gzip compression if the URL path ends in .gz or .tgz
// This confuses Safari and triggers a download of the page,
// even though it's pretty clearly labeled as viewable HTML.
@@ -109,7 +117,7 @@ function wfGzipHandler( $s ) {
return $s;
}
- if( wfClientAcceptsGzip() ) {
+ if ( wfClientAcceptsGzip() ) {
wfDebug( __FUNCTION__ . "() is compressing output\n" );
header( 'Content-Encoding: gzip' );
$s = gzencode( $s, 6 );
@@ -177,20 +185,8 @@ function wfHtmlValidationHandler( $s ) {
header( 'Cache-Control: no-cache' );
- $out = <<<EOT
-<!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>
-<title>HTML validation error</title>
-<style>
-.highlight { background-color: #ffc }
-li { white-space: pre }
-</style>
-</head>
-<body>
-<h1>HTML validation error</h1>
-<ul>
-EOT;
+ $out = Html::element( 'h1', null, 'HTML validation error' );
+ $out .= Html::openElement( 'ul' );
$error = strtok( $errors, "\n" );
$badLines = array();
@@ -198,26 +194,40 @@ EOT;
if ( preg_match( '/^line (\d+)/', $error, $m ) ) {
$lineNum = intval( $m[1] );
$badLines[$lineNum] = true;
- $out .= "<li><a href=\"#line-{$lineNum}\">" . htmlspecialchars( $error ) . "</a></li>\n";
+ $out .= Html::rawElement( 'li', null,
+ Html::element( 'a', array( 'href' => "#line-{$lineNum}" ), $error ) ) . "\n";
}
$error = strtok( "\n" );
}
- $out .= '</ul>';
- $out .= '<pre>' . htmlspecialchars( $errors ) . '</pre>';
- $out .= "<ol>\n";
+ $out .= Html::closeElement( 'ul' );
+ $out .= Html::element( 'pre', null, $errors );
+ $out .= Html::openElement( 'ol' ) . "\n";
$line = strtok( $s, "\n" );
$i = 1;
while ( $line !== false ) {
+ $attrs = array();
if ( isset( $badLines[$i] ) ) {
- $out .= "<li class=\"highlight\" id=\"line-$i\">";
- } else {
- $out .= '<li>';
+ $attrs['class'] = 'highlight';
+ $attrs['id'] = "line-$i";
}
- $out .= htmlspecialchars( $line ) . "</li>\n";
+ $out .= Html::element( 'li', $attrs, $line ) . "\n";
$line = strtok( "\n" );
$i++;
}
- $out .= '</ol></body></html>';
+ $out .= Html::closeElement( 'ol' );
+
+ $style = <<<CSS
+.highlight { background-color: #ffc }
+li { white-space: pre }
+CSS;
+
+ $out = Html::htmlHeader( array( 'lang' => 'en', 'dir' => 'ltr' ) ) .
+ Html::rawElement( 'head', null,
+ Html::element( 'title', null, 'HTML validation error' ) .
+ Html::inlineStyle( $style ) ) .
+ Html::rawElement( 'body', null, $out ) .
+ Html::closeElement( 'html' );
+
return $out;
}
diff --git a/includes/OutputPage.php b/includes/OutputPage.php
index 1e0c396a..7f0454f6 100644
--- a/includes/OutputPage.php
+++ b/includes/OutputPage.php
@@ -39,9 +39,6 @@ class OutputPage extends ContextSource {
/// Should be private. Used with addMeta() which adds "<meta>"
var $mMetatags = array();
- /// "<meta keywords='stuff'>" most of the time the first 10 links to an article
- var $mKeywords = array();
-
var $mLinktags = array();
var $mCanonicalUrl = false;
@@ -254,6 +251,16 @@ class OutputPage extends ContextSource {
private $mProperties = array();
/**
+ * @var string|null: ResourceLoader target for load.php links. If null, will be omitted
+ */
+ private $mTarget = null;
+
+ /**
+ * @var bool: Whether output should contain table of contents
+ */
+ private $mEnableTOC = true;
+
+ /**
* Constructor for OutputPage. This should not be called directly.
* Instead a new RequestContext should be created and it will implicitly create
* a OutputPage tied to that context.
@@ -309,19 +316,6 @@ class OutputPage extends ContextSource {
}
/**
- * Add a keyword or a list of keywords in the page header
- *
- * @param string $text or array of strings
- */
- function addKeyword( $text ) {
- if( is_array( $text ) ) {
- $this->mKeywords = array_merge( $this->mKeywords, $text );
- } else {
- array_push( $this->mKeywords, $text );
- }
- }
-
- /**
* Add a new \<link\> tag to the page header.
*
* Note: use setCanonicalUrl() for rel=canonical.
@@ -408,13 +402,14 @@ class OutputPage extends ContextSource {
public function addScriptFile( $file, $version = null ) {
global $wgStylePath, $wgStyleVersion;
// See if $file parameter is an absolute URL or begins with a slash
- if( substr( $file, 0, 1 ) == '/' || preg_match( '#^[a-z]*://#i', $file ) ) {
+ if ( substr( $file, 0, 1 ) == '/' || preg_match( '#^[a-z]*://#i', $file ) ) {
$path = $file;
} else {
$path = "{$wgStylePath}/common/{$file}";
}
- if ( is_null( $version ) )
+ if ( is_null( $version ) ) {
$version = $wgStyleVersion;
+ }
$this->addScript( Html::linkedScript( wfAppendQuery( $path, $version ) ) );
}
@@ -447,11 +442,12 @@ class OutputPage extends ContextSource {
protected function filterModules( $modules, $position = null, $type = ResourceLoaderModule::TYPE_COMBINED ) {
$resourceLoader = $this->getResourceLoader();
$filteredModules = array();
- foreach( $modules as $val ) {
+ foreach ( $modules as $val ) {
$module = $resourceLoader->getModule( $val );
- if( $module instanceof ResourceLoaderModule
+ if ( $module instanceof ResourceLoaderModule
&& $module->getOrigin() <= $this->getAllowedModules( $type )
- && ( is_null( $position ) || $module->getPosition() == $position ) )
+ && ( is_null( $position ) || $module->getPosition() == $position )
+ && ( !$this->mTarget || in_array( $this->mTarget, $module->getTargets() ) ) )
{
$filteredModules[] = $val;
}
@@ -557,6 +553,22 @@ class OutputPage extends ContextSource {
}
/**
+ * @return null|string: ResourceLoader target
+ */
+ public function getTarget() {
+ return $this->mTarget;
+ }
+
+ /**
+ * Sets ResourceLoader target for load.php links. If null, will be omitted
+ *
+ * @param $target string|null
+ */
+ public function setTarget( $target ) {
+ $this->mTarget = $target;
+ }
+
+ /**
* Get an array of head items
*
* @return Array
@@ -662,20 +674,20 @@ class OutputPage extends ContextSource {
*
* @param $timestamp string
*
- * @return Boolean: true iff cache-ok headers was sent.
+ * @return Boolean: true if cache-ok headers was sent.
*/
public function checkLastModified( $timestamp ) {
- global $wgCachePages, $wgCacheEpoch;
+ global $wgCachePages, $wgCacheEpoch, $wgUseSquid, $wgSquidMaxage;
if ( !$timestamp || $timestamp == '19700101000000' ) {
wfDebug( __METHOD__ . ": CACHE DISABLED, NO TIMESTAMP\n" );
return false;
}
- if( !$wgCachePages ) {
+ if ( !$wgCachePages ) {
wfDebug( __METHOD__ . ": CACHE DISABLED\n", false );
return false;
}
- if( $this->getUser()->getOption( 'nocache' ) ) {
+ if ( $this->getUser()->getOption( 'nocache' ) ) {
wfDebug( __METHOD__ . ": USER DISABLED CACHE\n", false );
return false;
}
@@ -686,6 +698,10 @@ class OutputPage extends ContextSource {
'user' => $this->getUser()->getTouched(),
'epoch' => $wgCacheEpoch
);
+ if ( $wgUseSquid ) {
+ // bug 44570: the core page itself may not change, but resources might
+ $modifiedTimes['sepoch'] = wfTimestamp( TS_MW, time() - $wgSquidMaxage );
+ }
wfRunHooks( 'OutputPageCheckLastModified', array( &$modifiedTimes ) );
$maxModified = max( $modifiedTimes );
@@ -724,7 +740,7 @@ class OutputPage extends ContextSource {
wfTimestamp( TS_ISO_8601, $clientHeaderTime ) . "\n", false );
wfDebug( __METHOD__ . ": effective Last-Modified: " .
wfTimestamp( TS_ISO_8601, $maxModified ) . "\n", false );
- if( $clientHeaderTime < $maxModified ) {
+ if ( $clientHeaderTime < $maxModified ) {
wfDebug( __METHOD__ . ": STALE, $info\n", false );
return false;
}
@@ -766,10 +782,10 @@ class OutputPage extends ContextSource {
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'] );
}
}
@@ -783,7 +799,7 @@ class OutputPage extends ContextSource {
*/
public function setIndexPolicy( $policy ) {
$policy = trim( $policy );
- if( in_array( $policy, array( 'index', 'noindex' ) ) ) {
+ if ( in_array( $policy, array( 'index', 'noindex' ) ) ) {
$this->mIndexPolicy = $policy;
}
}
@@ -797,7 +813,7 @@ class OutputPage extends ContextSource {
*/
public function setFollowPolicy( $policy ) {
$policy = trim( $policy );
- if( in_array( $policy, array( 'follow', 'nofollow' ) ) ) {
+ if ( in_array( $policy, array( 'follow', 'nofollow' ) ) ) {
$this->mFollowPolicy = $policy;
}
}
@@ -1269,7 +1285,6 @@ class OutputPage extends ContextSource {
* Return whether user JavaScript is allowed for this page
* @deprecated since 1.18 Load modules with ResourceLoader, and origin and
* trustworthiness is identified and enforced automagically.
- * Will be removed in 1.20.
* @return Boolean
*/
public function isUserJsAllowed() {
@@ -1284,7 +1299,7 @@ class OutputPage extends ContextSource {
* @return Int ResourceLoaderModule ORIGIN_ class constant
*/
public function getAllowedModules( $type ) {
- if( $type == ResourceLoaderModule::TYPE_COMBINED ) {
+ if ( $type == ResourceLoaderModule::TYPE_COMBINED ) {
return min( array_values( $this->mAllowedModules ) );
} else {
return isset( $this->mAllowedModules[$type] )
@@ -1401,7 +1416,7 @@ class OutputPage extends ContextSource {
* @param $timestamp Mixed: string, or null
* @return Mixed: previous value
*/
- public function setRevisionTimestamp( $timestamp) {
+ public function setRevisionTimestamp( $timestamp ) {
return wfSetVar( $this->mRevisionTimestamp, $timestamp );
}
@@ -1524,7 +1539,7 @@ class OutputPage extends ContextSource {
$popts = $this->parserOptions();
$oldTidy = $popts->setTidy( $tidy );
- $popts->setInterfaceMessage( (bool) $interface );
+ $popts->setInterfaceMessage( (bool)$interface );
$parserOutput = $wgParser->parse(
$text, $title, $popts,
@@ -1582,6 +1597,10 @@ class OutputPage extends ContextSource {
}
}
+ // Link flags are ignored for now, but may in the future be
+ // used to mark individual language links.
+ $linkFlags = array();
+ wfRunHooks( 'LanguageLinks', array( $this->getTitle(), &$this->mLanguageLinks, &$linkFlags ) );
wfRunHooks( 'OutputPageParserOutput', array( &$this, $parserOutput ) );
}
@@ -1592,6 +1611,7 @@ class OutputPage extends ContextSource {
*/
function addParserOutput( &$parserOutput ) {
$this->addParserOutputNoText( $parserOutput );
+ $parserOutput->setTOCEnabled( $this->mEnableTOC );
$text = $parserOutput->getText();
wfRunHooks( 'OutputPageBeforeHTML', array( &$this, &$text ) );
$this->addHTML( $text );
@@ -1626,7 +1646,7 @@ class OutputPage extends ContextSource {
public function parse( $text, $linestart = true, $interface = false, $language = null ) {
global $wgParser;
- if( is_null( $this->getTitle() ) ) {
+ if ( is_null( $this->getTitle() ) ) {
throw new MWException( 'Empty $mTitle in ' . __METHOD__ );
}
@@ -1707,6 +1727,7 @@ class OutputPage extends ContextSource {
array(
"{$wgCookiePrefix}Token",
"{$wgCookiePrefix}LoggedOut",
+ "forceHTTPS",
session_name()
),
$wgCacheVaryCookies
@@ -1750,8 +1771,8 @@ class OutputPage extends ContextSource {
public function addVaryHeader( $header, $option = null ) {
if ( !array_key_exists( $header, $this->mVaryHeader ) ) {
$this->mVaryHeader[$header] = (array)$option;
- } elseif( is_array( $option ) ) {
- if( is_array( $this->mVaryHeader[$header] ) ) {
+ } elseif ( is_array( $option ) ) {
+ if ( is_array( $this->mVaryHeader[$header] ) ) {
$this->mVaryHeader[$header] = array_merge( $this->mVaryHeader[$header], $option );
} else {
$this->mVaryHeader[$header] = $option;
@@ -1785,7 +1806,7 @@ class OutputPage extends ContextSource {
$this->addVaryHeader( 'Cookie', $cookiesOption );
$headers = array();
- foreach( $this->mVaryHeader as $header => $option ) {
+ foreach ( $this->mVaryHeader as $header => $option ) {
$newheader = $header;
if ( is_array( $option ) && count( $option ) > 0 ) {
$newheader .= ';' . implode( ';', $option );
@@ -1807,11 +1828,11 @@ class OutputPage extends ContextSource {
*/
function addAcceptLanguage() {
$lang = $this->getTitle()->getPageLanguage();
- if( !$this->getRequest()->getCheck( 'variant' ) && $lang->hasVariants() ) {
+ if ( !$this->getRequest()->getCheck( 'variant' ) && $lang->hasVariants() ) {
$variants = $lang->getVariants();
$aloption = array();
foreach ( $variants as $variant ) {
- if( $variant === $lang->getCode() ) {
+ if ( $variant === $lang->getCode() ) {
continue;
} else {
$aloption[] = 'string-contains=' . $variant;
@@ -1892,12 +1913,11 @@ class OutputPage extends ContextSource {
$response->header( $this->getXVO() );
}
- if( $this->mEnableClientCache ) {
- if(
+ if ( $this->mEnableClientCache ) {
+ 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
# to revalidate against the proxy on each visit.
@@ -1924,7 +1944,7 @@ class OutputPage extends ContextSource {
$response->header( 'Expires: ' . gmdate( 'D, d M Y H:i:s', 0 ) . ' GMT' );
$response->header( "Cache-Control: private, must-revalidate, max-age=0" );
}
- if( $this->mLastModified ) {
+ if ( $this->mLastModified ) {
$response->header( "Last-Modified: {$this->mLastModified}" );
}
} else {
@@ -1957,9 +1977,10 @@ class OutputPage extends ContextSource {
* the object, let's actually output it:
*/
public function output() {
- global $wgLanguageCode, $wgDebugRedirects, $wgMimeType, $wgVaryOnXFP;
+ global $wgLanguageCode, $wgDebugRedirects, $wgMimeType, $wgVaryOnXFP,
+ $wgUseAjax, $wgResponsiveImages;
- if( $this->mDoNothing ) {
+ if ( $this->mDoNothing ) {
return;
}
@@ -1974,9 +1995,9 @@ class OutputPage extends ContextSource {
$redirect = $this->mRedirect;
$code = $this->mRedirectCode;
- if( wfRunHooks( "BeforePageRedirect", array( $this, &$redirect, &$code ) ) ) {
- if( $code == '301' || $code == '303' ) {
- if( !$wgDebugRedirects ) {
+ if ( wfRunHooks( "BeforePageRedirect", array( $this, &$redirect, &$code ) ) ) {
+ if ( $code == '301' || $code == '303' ) {
+ if ( !$wgDebugRedirects ) {
$message = HttpStatus::getMessage( $code );
$response->header( "HTTP/1.1 $code $message" );
}
@@ -1988,7 +2009,7 @@ class OutputPage extends ContextSource {
$this->sendCacheControl();
$response->header( "Content-Type: text/html; charset=utf-8" );
- if( $wgDebugRedirects ) {
+ if ( $wgDebugRedirects ) {
$url = htmlspecialchars( $redirect );
print "<html>\n<head>\n<title>Redirect</title>\n</head>\n<body>\n";
print "<p>Location: <a href=\"$url\">$url</a></p>\n";
@@ -2020,11 +2041,34 @@ class OutputPage extends ContextSource {
}
if ( $this->mArticleBodyOnly ) {
- $this->out( $this->mBodytext );
+ echo $this->mBodytext;
} else {
- $this->addDefaultModules();
$sk = $this->getSkin();
+ // add skin specific modules
+ $modules = $sk->getDefaultModules();
+
+ // enforce various default modules for all skins
+ $coreModules = array(
+ // keep this list as small as possible
+ 'mediawiki.page.startup',
+ 'mediawiki.user',
+ );
+
+ // Support for high-density display images if enabled
+ if ( $wgResponsiveImages ) {
+ $coreModules[] = 'mediawiki.hidpi';
+ }
+
+ $this->addModules( $coreModules );
+ foreach ( $modules as $group ) {
+ $this->addModules( $group );
+ }
+ MWDebug::addModules( $this );
+ if ( $wgUseAjax ) {
+ // FIXME: deprecate? - not clear why this is useful
+ wfRunHooks( 'AjaxAddScript', array( &$this ) );
+ }
// Hook that allows last minute changes to the output page, e.g.
// adding of CSS or Javascript by extensions.
@@ -2046,11 +2090,13 @@ class OutputPage extends ContextSource {
}
/**
- * Actually output something with print().
+ * Actually output something with print.
*
* @param string $ins the string to output
+ * @deprecated since 1.22 Use echo yourself.
*/
public function out( $ins ) {
+ wfDeprecated( __METHOD__, '1.22' );
print $ins;
}
@@ -2097,7 +2143,7 @@ class OutputPage extends ContextSource {
* @param array $params message parameters; ignored if $msg is a Message object
*/
public function showErrorPage( $title, $msg, $params = array() ) {
- if( !$title instanceof Message ) {
+ if ( !$title instanceof Message ) {
$title = $this->msg( $title );
}
@@ -2238,7 +2284,7 @@ class OutputPage extends ContextSource {
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( array( $this, 'msg' ), $error )->plain();
$text .= "</li>\n";
@@ -2286,7 +2332,7 @@ class OutputPage extends ContextSource {
if ( !empty( $reasons ) ) {
// Permissions error
- if( $source ) {
+ if ( $source ) {
$this->setPageTitle( $this->msg( 'viewsource-title', $this->getTitle()->getPrefixedText() ) );
$this->addBacklinkSubtitle( $this->getTitle() );
} else {
@@ -2299,7 +2345,7 @@ class OutputPage extends ContextSource {
}
// Show source, if supplied
- if( is_string( $source ) ) {
+ if ( is_string( $source ) ) {
$this->addWikiMsg( 'viewsourcetext' );
$pageLang = $this->getTitle()->getPageLanguage();
@@ -2325,7 +2371,7 @@ $templates
# If the title doesn't exist, it's fairly pointless to print a return
# link to it. After all, you just tried editing it and couldn't, so
# what's there to do there?
- if( $this->getTitle()->exists() ) {
+ if ( $this->getTitle()->exists() ) {
$this->returnToMain( null, $this->getTitle() );
}
}
@@ -2349,7 +2395,7 @@ $templates
*/
public function showLagWarning( $lag ) {
global $wgSlaveLagWarning, $wgSlaveLagCritical;
- if( $lag >= $wgSlaveLagWarning ) {
+ if ( $lag >= $wgSlaveLagWarning ) {
$message = $lag < $wgSlaveLagCritical
? 'lag-warn-normal'
: 'lag-warn-high';
@@ -2393,15 +2439,6 @@ $templates
* @param $options Options array to pass to Linker
*/
public function addReturnTo( $title, $query = array(), $text = null, $options = array() ) {
- if( in_array( 'http', $options ) ) {
- $proto = PROTO_HTTP;
- } elseif( in_array( 'https', $options ) ) {
- $proto = PROTO_HTTPS;
- } else {
- $proto = PROTO_RELATIVE;
- }
-
- $this->addLink( array( 'rel' => 'next', 'href' => $title->getFullURL( '', false, $proto ) ) );
$link = $this->msg( 'returnto' )->rawParams(
Linker::link( $title, $text, array(), $query, $options ) )->escaped();
$this->addHTML( "<p id=\"mw-returnto\">{$link}</p>\n" );
@@ -2446,15 +2483,11 @@ $templates
* @return String: The doctype, opening "<html>", and head element.
*/
public function headElement( Skin $sk, $includeStyle = true ) {
- global $wgContLang;
+ global $wgContLang, $wgMimeType;
$userdir = $this->getLanguage()->getDir();
$sitedir = $wgContLang->getDir();
- if ( $sk->commonPrintStylesheet() ) {
- $this->addModuleStyles( 'mediawiki.legacy.wikiprintable' );
- }
-
$ret = Html::htmlHeader( array( 'lang' => $this->getLanguage()->getHtmlCode(), 'dir' => $userdir, 'class' => 'client-nojs' ) );
if ( $this->getHTMLTitle() == '' ) {
@@ -2467,10 +2500,22 @@ $templates
$ret .= "$openHead\n";
}
+ if ( !Html::isXmlMimeType( $wgMimeType ) ) {
+ // Add <meta charset="UTF-8">
+ // This should be before <title> since it defines the charset used by
+ // text including the text inside <title>.
+ // The spec recommends defining XHTML5's charset using the XML declaration
+ // instead of meta.
+ // Our XML declaration is output by Html::htmlHeader.
+ // http://www.whatwg.org/html/semantics.html#attr-meta-http-equiv-content-type
+ // http://www.whatwg.org/html/semantics.html#charset
+ $ret .= Html::element( 'meta', array( 'charset' => 'UTF-8' ) );
+ }
+
$ret .= Html::element( 'title', null, $this->getHTMLTitle() ) . "\n";
$ret .= implode( "\n", array(
- $this->getHeadLinks( null, true ),
+ $this->getHeadLinks(),
$this->buildCssLinks(),
$this->getHeadScripts(),
$this->getHeadItems()
@@ -2481,20 +2526,29 @@ $templates
$ret .= "$closeHead\n";
}
- $bodyAttrs = array();
+ $bodyClasses = array();
+ $bodyClasses[] = 'mediawiki';
# Classes for LTR/RTL directionality support
- $bodyAttrs['class'] = "mediawiki $userdir sitedir-$sitedir";
+ $bodyClasses[] = $userdir;
+ $bodyClasses[] = "sitedir-$sitedir";
if ( $this->getLanguage()->capitalizeAllNouns() ) {
# A <body> class is probably not the best way to do this . . .
- $bodyAttrs['class'] .= ' capitalize-all-nouns';
+ $bodyClasses[] = 'capitalize-all-nouns';
}
- $bodyAttrs['class'] .= ' ' . $sk->getPageClasses( $this->getTitle() );
- $bodyAttrs['class'] .= ' skin-' . Sanitizer::escapeClass( $sk->getSkinName() );
- $bodyAttrs['class'] .= ' action-' . Sanitizer::escapeClass( Action::getActionName( $this->getContext() ) );
- $sk->addToBodyAttributes( $this, $bodyAttrs ); // Allow skins to add body attributes they need
+ $bodyClasses[] = $sk->getPageClasses( $this->getTitle() );
+ $bodyClasses[] = 'skin-' . Sanitizer::escapeClass( $sk->getSkinName() );
+ $bodyClasses[] = 'action-' . Sanitizer::escapeClass( Action::getActionName( $this->getContext() ) );
+
+ $bodyAttrs = array();
+ // While the implode() is not strictly needed, it's used for backwards compatibility
+ // (this used to be built as a string and hooks likely still expect that).
+ $bodyAttrs['class'] = implode( ' ', $bodyClasses );
+
+ // Allow skins and extensions to add body attributes they need
+ $sk->addToBodyAttributes( $this, $bodyAttrs );
wfRunHooks( 'OutputPageBodyAttributes', array( $this, $sk, &$bodyAttrs ) );
$ret .= Html::openElement( 'body', $bodyAttrs ) . "\n";
@@ -2503,59 +2557,6 @@ $templates
}
/**
- * Add the default ResourceLoader modules to this object
- */
- private function addDefaultModules() {
- global $wgIncludeLegacyJavaScript, $wgPreloadJavaScriptMwUtil, $wgUseAjax,
- $wgAjaxWatch, $wgResponsiveImages;
-
- // Add base resources
- $this->addModules( array(
- 'mediawiki.user',
- 'mediawiki.page.startup',
- 'mediawiki.page.ready',
- ) );
- if ( $wgIncludeLegacyJavaScript ) {
- $this->addModules( 'mediawiki.legacy.wikibits' );
- }
-
- if ( $wgPreloadJavaScriptMwUtil ) {
- $this->addModules( 'mediawiki.util' );
- }
-
- MWDebug::addModules( $this );
-
- // Add various resources if required
- if ( $wgUseAjax ) {
- $this->addModules( 'mediawiki.legacy.ajax' );
-
- wfRunHooks( 'AjaxAddScript', array( &$this ) );
-
- if( $wgAjaxWatch && $this->getUser()->isLoggedIn() ) {
- $this->addModules( 'mediawiki.page.watch.ajax' );
- }
-
- if ( !$this->getUser()->getOption( 'disablesuggest', false ) ) {
- $this->addModules( 'mediawiki.searchSuggest' );
- }
- }
-
- if ( $this->getUser()->getBoolOption( 'editsectiononrightclick' ) ) {
- $this->addModules( 'mediawiki.action.view.rightClickEdit' );
- }
-
- # Crazy edit-on-double-click stuff
- if ( $this->isArticle() && $this->getUser()->getOption( 'editondblclick' ) ) {
- $this->addModules( 'mediawiki.action.view.dblClickEdit' );
- }
-
- // Support for high-density display images
- if ( $wgResponsiveImages ) {
- $this->addModules( 'mediawiki.hidpi' );
- }
- }
-
- /**
* Get a ResourceLoader object associated with this OutputPage
*
* @return ResourceLoader
@@ -2579,7 +2580,7 @@ $templates
protected function makeResourceLoaderLink( $modules, $only, $useESI = false, array $extraQuery = array(), $loadCall = false ) {
global $wgResourceLoaderUseESI;
- $modules = (array) $modules;
+ $modules = (array)$modules;
if ( !count( $modules ) ) {
return '';
@@ -2600,6 +2601,9 @@ $templates
return $links;
}
}
+ if ( !is_null( $this->mTarget ) ) {
+ $extraQuery['target'] = $this->mTarget;
+ }
// Create keyed-by-group list of module objects from modules list
$groups = array();
@@ -2612,8 +2616,8 @@ $templates
&& $only == ResourceLoaderModule::TYPE_SCRIPTS )
|| ( $module->getOrigin() > $this->getAllowedModules( ResourceLoaderModule::TYPE_STYLES )
&& $only == ResourceLoaderModule::TYPE_STYLES )
- )
- {
+ || ( $this->mTarget && !in_array( $this->mTarget, $module->getTargets() ) )
+ ) {
continue;
}
@@ -2648,7 +2652,7 @@ $templates
);
$context = new ResourceLoaderContext( $resourceLoader, new FauxRequest( $query ) );
// Extract modules that know they're empty
- $emptyModules = array ();
+ $emptyModules = array();
foreach ( $grpModules as $key => $module ) {
if ( $module->isKnownEmpty( $context ) ) {
$emptyModules[$key] = 'ready';
@@ -2659,13 +2663,9 @@ $templates
if ( count( $emptyModules ) > 0 && $only !== ResourceLoaderModule::TYPE_STYLES ) {
// If we're only getting the styles, we don't need to do anything for empty modules.
$links .= Html::inlineScript(
-
ResourceLoader::makeLoaderConditionalScript(
-
ResourceLoader::makeLoaderStateScript( $emptyModules )
-
)
-
) . "\n";
}
@@ -2732,7 +2732,7 @@ $templates
// Automatically select style/script elements
if ( $only === ResourceLoaderModule::TYPE_STYLES ) {
$link = Html::linkedStyle( $url );
- } else if ( $loadCall ) {
+ } elseif ( $loadCall ) {
$link = Html::inlineScript(
ResourceLoader::makeLoaderConditionalScript(
Xml::encodeJsCall( 'mw.loader.load', array( $url, 'text/javascript', true ) )
@@ -2743,7 +2743,7 @@ $templates
}
}
- if( $group == 'noscript' ) {
+ if ( $group == 'noscript' ) {
$links .= Html::rawElement( 'noscript', array(), $link ) . "\n";
} else {
$links .= $link . "\n";
@@ -2847,14 +2847,14 @@ $templates
);
$defaultModules['site'] = 'loading';
} else {
- // The wiki is configured to not allow a site module.
- $defaultModules['site'] = 'missing';
+ // Site module is empty, save request by marking ready in advance (bug 46857)
+ $defaultModules['site'] = 'ready';
}
// Add user JS if enabled
if ( $wgAllowUserJs ) {
if ( $this->getUser()->isLoggedIn() ) {
- if( $this->getTitle() && $this->getTitle()->isJsSubpage() && $this->userCanPreview() ) {
+ if ( $this->getTitle() && $this->getTitle()->isJsSubpage() && $this->userCanPreview() ) {
# XXX: additional security check/prompt?
// We're on a preview of a JS subpage
// Exclude this page from the user module in case it's in there (bug 26283)
@@ -2874,15 +2874,14 @@ $templates
}
$defaultModules['user'] = 'loading';
} else {
- // Non-logged-in users have no user module. Treat it as empty and 'ready' to avoid
- // blocking default gadgets that might depend on it. Although arguably default-enabled
- // gadgets should not depend on the user module, it's harmless and less error-prone to
- // handle this case.
+ // Non-logged-in users have an empty user module.
+ // Save request by marking ready in advance (bug 46857)
$defaultModules['user'] = 'ready';
}
} else {
- // User JS disabled
- $defaultModules['user'] = 'missing';
+ // User modules are disabled on this wiki.
+ // Save request by marking ready in advance (bug 46857)
+ $defaultModules['user'] = 'ready';
}
// Group JS is only enabled if site JS is enabled.
@@ -2893,13 +2892,13 @@ $templates
);
$defaultModules['user.groups'] = 'loading';
} else {
- // Non-logged-in users have no user.groups module. Treat it as empty and 'ready' to
- // avoid blocking gadgets that might depend upon the module.
+ // Non-logged-in users have no user.groups module.
+ // Save request by marking ready in advance (bug 46857)
$defaultModules['user.groups'] = 'ready';
}
} else {
// Site (and group JS) disabled
- $defaultModules['user.groups'] = 'missing';
+ $defaultModules['user.groups'] = 'ready';
}
$loaderInit = '';
@@ -2927,11 +2926,18 @@ $templates
*/
function getBottomScripts() {
global $wgResourceLoaderExperimentalAsyncLoading;
+
+ // Optimise jQuery ready event cross-browser.
+ // This also enforces $.isReady to be true at </body> which fixes the
+ // mw.loader bug in Firefox with using document.write between </body>
+ // and the DOMContentReady event (bug 47457).
+ $html = Html::inlineScript( 'window.jQuery && jQuery.ready();' );
+
if ( !$wgResourceLoaderExperimentalAsyncLoading ) {
- return $this->getScriptsForBottomQueue( false );
- } else {
- return '';
+ $html .= $this->getScriptsForBottomQueue( false );
}
+
+ return $html;
}
/**
@@ -2966,24 +2972,24 @@ $templates
public function getJSVars() {
global $wgContLang;
- $latestRevID = 0;
- $pageID = 0;
- $canonicalName = false; # bug 21115
+ $curRevisionId = 0;
+ $articleId = 0;
+ $canonicalSpecialPageName = false; # bug 21115
$title = $this->getTitle();
$ns = $title->getNamespace();
- $nsname = MWNamespace::exists( $ns ) ? MWNamespace::getCanonicalName( $ns ) : $title->getNsText();
+ $canonicalNamespace = MWNamespace::exists( $ns ) ? MWNamespace::getCanonicalName( $ns ) : $title->getNsText();
// Get the relevant title so that AJAX features can use the correct page name
// when making API requests from certain special pages (bug 34972).
$relevantTitle = $this->getSkin()->getRelevantTitle();
if ( $ns == NS_SPECIAL ) {
- list( $canonicalName, /*...*/ ) = SpecialPageFactory::resolveAlias( $title->getDBkey() );
+ list( $canonicalSpecialPageName, /*...*/ ) = SpecialPageFactory::resolveAlias( $title->getDBkey() );
} elseif ( $this->canUseWikiPage() ) {
$wikiPage = $this->getWikiPage();
- $latestRevID = $wikiPage->getLatest();
- $pageID = $wikiPage->getId();
+ $curRevisionId = $wikiPage->getLatest();
+ $articleId = $wikiPage->getId();
}
$lang = $title->getPageLanguage();
@@ -3005,20 +3011,23 @@ $templates
$user = $this->getUser();
$vars = array(
- 'wgCanonicalNamespace' => $nsname,
- 'wgCanonicalSpecialPageName' => $canonicalName,
+ 'wgCanonicalNamespace' => $canonicalNamespace,
+ 'wgCanonicalSpecialPageName' => $canonicalSpecialPageName,
'wgNamespaceNumber' => $title->getNamespace(),
'wgPageName' => $title->getPrefixedDBkey(),
'wgTitle' => $title->getText(),
- 'wgCurRevisionId' => $latestRevID,
- 'wgArticleId' => $pageID,
+ 'wgCurRevisionId' => $curRevisionId,
+ 'wgRevisionId' => (int)$this->getRevisionId(),
+ 'wgArticleId' => $articleId,
'wgIsArticle' => $this->isArticle(),
+ 'wgIsRedirect' => $title->isRedirect(),
'wgAction' => Action::getActionName( $this->getContext() ),
'wgUserName' => $user->isAnon() ? null : $user->getName(),
'wgUserGroups' => $user->getEffectiveGroups(),
'wgCategories' => $this->getCategories(),
'wgBreakFrames' => $this->getFrameOptions() == 'DENY',
'wgPageContentLanguage' => $lang->getCode(),
+ 'wgPageContentModel' => $title->getContentModel(),
'wgSeparatorTransformTable' => $compactSeparatorTransTable,
'wgDigitTransformTable' => $compactDigitTransTable,
'wgDefaultDateFormat' => $lang->getDefaultDateFormat(),
@@ -3031,10 +3040,16 @@ $templates
$vars['wgUserEditCount'] = $user->getEditCount();
$userReg = wfTimestampOrNull( TS_UNIX, $user->getRegistration() );
$vars['wgUserRegistration'] = $userReg !== null ? ( $userReg * 1000 ) : null;
+ // Get the revision ID of the oldest new message on the user's talk
+ // page. This can be used for constructing new message alerts on
+ // the client side.
+ $vars['wgUserNewMsgRevisionId'] = $user->getNewMessageRevisionId();
}
if ( $wgContLang->hasVariants() ) {
$vars['wgUserVariant'] = $wgContLang->getPreferredVariant();
}
+ // Same test as SkinTemplate
+ $vars['wgIsProbablyEditable'] = $title->quickUserCan( 'edit', $user ) && ( $title->exists() || $title->quickUserCan( 'create', $user ) );
foreach ( $title->getRestrictionTypes() as $type ) {
$vars['wgRestriction' . ucfirst( $type )] = $title->getRestrictions( $type );
}
@@ -3080,13 +3095,11 @@ $templates
}
/**
- * @param bool $addContentType Whether "<meta>" specifying content type should be returned
- *
* @return array in format "link name or number => 'link html'".
*/
- public function getHeadLinksArray( $addContentType = false ) {
+ public function getHeadLinksArray() {
global $wgUniversalEditButton, $wgFavicon, $wgAppleTouchIcon, $wgEnableAPI,
- $wgSitename, $wgVersion, $wgHtml5, $wgMimeType,
+ $wgSitename, $wgVersion,
$wgFeed, $wgOverrideSiteFeed, $wgAdvertisedFeedTypes,
$wgDisableLangConversion, $wgCanonicalLanguageLinks,
$wgRightsPage, $wgRightsUrl;
@@ -3095,30 +3108,13 @@ $templates
$canonicalUrl = $this->mCanonicalUrl;
- if ( $addContentType ) {
- if ( $wgHtml5 ) {
- # More succinct than <meta http-equiv=Content-Type>, has the
- # same effect
- $tags['meta-charset'] = Html::element( 'meta', array( 'charset' => 'UTF-8' ) );
- } else {
- $tags['meta-content-type'] = Html::element( 'meta', array(
- 'http-equiv' => 'Content-Type',
- 'content' => "$wgMimeType; charset=UTF-8"
- ) );
- $tags['meta-content-style-type'] = Html::element( 'meta', array( // bug 15835
- 'http-equiv' => 'Content-Style-Type',
- 'content' => 'text/css'
- ) );
- }
- }
-
$tags['meta-generator'] = Html::element( 'meta', array(
'name' => 'generator',
'content' => "MediaWiki $wgVersion",
) );
$p = "{$this->mIndexPolicy},{$this->mFollowPolicy}";
- if( $p !== 'index,follow' ) {
+ if ( $p !== 'index,follow' ) {
// http://www.robotstxt.org/wc/meta-user.html
// Only show if it's different from the default robots policy
$tags['meta-robots'] = Html::element( 'meta', array(
@@ -3127,21 +3123,6 @@ $templates
) );
}
- if ( count( $this->mKeywords ) > 0 ) {
- $strip = array(
- "/<.*?" . ">/" => '',
- "/_/" => ' '
- );
- $tags['meta-keywords'] = Html::element( 'meta', array(
- 'name' => 'keywords',
- 'content' => preg_replace(
- array_keys( $strip ),
- array_values( $strip ),
- implode( ',', $this->mKeywords )
- )
- ) );
- }
-
foreach ( $this->mMetatags as $tag ) {
if ( 0 == strcasecmp( 'http:', substr( $tag[0], 0, 5 ) ) ) {
$a = 'http-equiv';
@@ -3233,7 +3214,7 @@ $templates
foreach ( $variants as $_v ) {
$tags["variant-$_v"] = Html::element( 'link', array(
'rel' => 'alternate',
- 'hreflang' => $_v,
+ 'hreflang' => wfBCP47( $_v ),
'href' => $this->getTitle()->getLocalURL( array( 'variant' => $_v ) ) )
);
}
@@ -3266,7 +3247,7 @@ $templates
# Feeds
if ( $wgFeed ) {
- foreach( $this->getSyndicationLinks() as $format => $link ) {
+ foreach ( $this->getSyndicationLinks() as $format => $link ) {
# Use the page name for the title. In principle, this could
# lead to issues with having the same name for different feeds
# corresponding to the same page, but we can't avoid that at
@@ -3301,7 +3282,7 @@ $templates
foreach ( $wgAdvertisedFeedTypes as $format ) {
$tags[] = $this->feedLink(
$format,
- $rctitle->getLocalURL( "feed={$format}" ),
+ $rctitle->getLocalURL( array( 'feed' => $format ) ),
$this->msg( "site-{$format}-feed", $wgSitename )->text() # For grep: 'site-rss-feed', 'site-atom-feed'.
);
}
@@ -3329,13 +3310,10 @@ $templates
}
/**
- * @param $unused
- * @param bool $addContentType Whether "<meta>" specifying content type should be returned
- *
* @return string HTML tag links to be put in the header.
*/
- public function getHeadLinks( $unused = null, $addContentType = false ) {
- return implode( "\n", $this->getHeadLinksArray( $addContentType ) );
+ public function getHeadLinks() {
+ return implode( "\n", $this->getHeadLinksArray() );
}
/**
@@ -3368,13 +3346,13 @@ $templates
$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;
@@ -3386,7 +3364,7 @@ $templates
* @param string $flip Set to 'flip' to flip the CSS if needed
*/
public function addInlineStyle( $style_css, $flip = 'noflip' ) {
- if( $flip === 'flip' && $this->getLanguage()->isRTL() ) {
+ if ( $flip === 'flip' && $this->getLanguage()->isRTL() ) {
# If wanted, and the interface is right-to-left, flip the CSS
$style_css = CSSJanus::transform( $style_css, true, false );
}
@@ -3416,7 +3394,7 @@ $templates
if ( $wgUseSiteCss ) {
$moduleStyles[] = 'site';
$moduleStyles[] = 'noscript';
- if( $this->getUser()->isLoggedIn() ) {
+ if ( $this->getUser()->isLoggedIn() ) {
$moduleStyles[] = 'user.groups';
}
}
@@ -3497,9 +3475,9 @@ $templates
}
$this->mExtStyles = array();
- foreach( $this->styles as $file => $options ) {
+ foreach ( $this->styles as $file => $options ) {
$link = $this->styleLink( $file, $options );
- if( $link ) {
+ if ( $link ) {
$links[$file] = $link;
}
}
@@ -3515,22 +3493,22 @@ $templates
* @return String: HTML fragment
*/
protected function styleLink( $style, $options ) {
- if( isset( $options['dir'] ) ) {
- if( $this->getLanguage()->getDir() != $options['dir'] ) {
+ if ( isset( $options['dir'] ) ) {
+ if ( $this->getLanguage()->getDir() != $options['dir'] ) {
return '';
}
}
- if( isset( $options['media'] ) ) {
+ if ( isset( $options['media'] ) ) {
$media = self::transformCssMedia( $options['media'] );
- if( is_null( $media ) ) {
+ if ( is_null( $media ) ) {
return '';
}
} else {
$media = 'all';
}
- if( substr( $style, 0, 1 ) == '/' ||
+ if ( substr( $style, 0, 1 ) == '/' ||
substr( $style, 0, 5 ) == 'http:' ||
substr( $style, 0, 6 ) == 'https:' ) {
$url = $style;
@@ -3541,7 +3519,7 @@ $templates
$link = Html::linkedStyle( $url, $media );
- if( isset( $options['condition'] ) ) {
+ if ( isset( $options['condition'] ) ) {
$condition = htmlspecialchars( $options['condition'] );
$link = "<!--[if $condition]>$link<![endif]-->";
}
@@ -3556,7 +3534,7 @@ $templates
* this stylesheet
*/
public static function transformCssMedia( $media ) {
- global $wgRequest, $wgHandheldForIPhone;
+ global $wgRequest;
// http://www.w3.org/TR/css3-mediaqueries/#syntax
$screenMediaQueryRegex = '/^(?:only\s+)?screen\b/i';
@@ -3566,11 +3544,11 @@ $templates
'printable' => 'print',
'handheld' => 'handheld',
);
- foreach( $switches as $switch => $targetMedia ) {
- if( $wgRequest->getBool( $switch ) ) {
- if( $media == $targetMedia ) {
+ foreach ( $switches as $switch => $targetMedia ) {
+ if ( $wgRequest->getBool( $switch ) ) {
+ if ( $media == $targetMedia ) {
$media = '';
- } elseif( preg_match( $screenMediaQueryRegex, $media ) === 1 ) {
+ } elseif ( preg_match( $screenMediaQueryRegex, $media ) === 1 ) {
// This regex will not attempt to understand a comma-separated media_query_list
//
// Example supported values for $media: 'screen', 'only screen', 'screen and (min-width: 982px)' ),
@@ -3581,25 +3559,13 @@ $templates
// we don't want simple 'screen' but we might want screen queries that
// have a max-width or something, so we'll pass all others on and let the
// client do the query.
- if( $targetMedia == 'print' || $media == 'screen' ) {
+ if ( $targetMedia == 'print' || $media == 'screen' ) {
return null;
}
}
}
}
- // Expand longer media queries as iPhone doesn't grok 'handheld'
- if( $wgHandheldForIPhone ) {
- $mediaAliases = array(
- 'screen' => 'screen and (min-device-width: 481px)',
- 'handheld' => 'handheld, only screen and (max-device-width: 480px)',
- );
-
- if( isset( $mediaAliases[$media] ) ) {
- $media = $mediaAliases[$media];
- }
- }
-
return $media;
}
@@ -3688,4 +3654,20 @@ $templates
return array();
}
+ /**
+ * Enables/disables TOC, doesn't override __NOTOC__
+ * @param bool $flag
+ * @since 1.22
+ */
+ public function enableTOC( $flag = true ) {
+ $this->mEnableTOC = $flag;
+ }
+
+ /**
+ * @return bool
+ * @since 1.22
+ */
+ public function isTOCEnabled() {
+ return $this->mEnableTOC;
+ }
}
diff --git a/includes/PHPVersionError.php b/includes/PHPVersionError.php
index 7749bf1f..02d3546f 100644
--- a/includes/PHPVersionError.php
+++ b/includes/PHPVersionError.php
@@ -38,7 +38,7 @@
* version are hardcoded here
*/
function wfPHPVersionError( $type ) {
- $mwVersion = '1.21';
+ $mwVersion = '1.22';
$minimumVersionPHP = '5.3.2';
$phpVersion = phpversion();
@@ -61,12 +61,12 @@ function wfPHPVersionError( $type ) {
header( 'Pragma: no-cache' );
$finalOutput = <<<HTML
-<!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'>
+<!DOCTYPE html>
+<html lang="en" dir="ltr">
<head>
+ <meta charset="UTF-8" />
<title>MediaWiki {$mwVersion}</title>
- <meta http-equiv='Content-Type' content='text/html; charset=utf-8' />
- <style type='text/css' media='screen'>
+ <style media='screen'>
body {
color: #000;
background-color: #fff;
@@ -112,6 +112,6 @@ HTML;
$finalOutput = ( $type == 'load.php' ) ? "/* $message */" : $message;
header( "$protocol 500 MediaWiki configuration Error" );
}
- echo( "$finalOutput\n" );
+ echo "$finalOutput\n";
die( 1 );
}
diff --git a/includes/PageQueryPage.php b/includes/PageQueryPage.php
index 01a2439f..61a535d6 100644
--- a/includes/PageQueryPage.php
+++ b/includes/PageQueryPage.php
@@ -27,12 +27,11 @@
* @ingroup SpecialPage
*/
abstract class PageQueryPage extends QueryPage {
-
/**
* Format the result as a simple link to the page
*
- * @param $skin Skin
- * @param $row Object: result row
+ * @param Skin $skin
+ * @param object $row Result row
* @return string
*/
public function formatResult( $skin, $row ) {
diff --git a/includes/Pager.php b/includes/Pager.php
index 9c514927..4a14c7e0 100644
--- a/includes/Pager.php
+++ b/includes/Pager.php
@@ -150,18 +150,19 @@ abstract class IndexPager extends ContextSource implements Pager {
}
$this->mIsBackwards = ( $this->mRequest->getVal( 'dir' ) == 'prev' );
- $this->mDb = wfGetDB( DB_SLAVE );
+ # Let the subclass set the DB here; otherwise use a slave DB for the current wiki
+ $this->mDb = $this->mDb ?: wfGetDB( DB_SLAVE );
$index = $this->getIndexField(); // column to sort on
$extraSort = $this->getExtraSortFields(); // extra columns to sort on for query planning
$order = $this->mRequest->getVal( 'order' );
- if( is_array( $index ) && isset( $index[$order] ) ) {
+ if ( is_array( $index ) && isset( $index[$order] ) ) {
$this->mOrderType = $order;
$this->mIndexField = $index[$order];
$this->mExtraSortFields = isset( $extraSort[$order] )
? (array)$extraSort[$order]
: array();
- } elseif( is_array( $index ) ) {
+ } elseif ( is_array( $index ) ) {
# First element is the default
reset( $index );
list( $this->mOrderType, $this->mIndexField ) = each( $index );
@@ -175,7 +176,7 @@ abstract class IndexPager extends ContextSource implements Pager {
$this->mExtraSortFields = (array)$extraSort;
}
- if( !isset( $this->mDefaultDirection ) ) {
+ if ( !isset( $this->mDefaultDirection ) ) {
$dir = $this->getDefaultDirections();
$this->mDefaultDirection = is_array( $dir )
? $dir[$this->mOrderType]
@@ -256,7 +257,7 @@ abstract class IndexPager extends ContextSource implements Pager {
* @param $limit Int|String
*/
function setLimit( $limit ) {
- $limit = (int) $limit;
+ $limit = (int)$limit;
// WebRequest::getLimitOffset() puts a cap of 5000, so do same here.
if ( $limit > 5000 ) {
$limit = 5000;
@@ -456,12 +457,12 @@ abstract class IndexPager extends ContextSource implements Pager {
}
$attrs = array();
- if( in_array( $type, array( 'first', 'prev', 'next', 'last' ) ) ) {
+ if ( in_array( $type, array( 'first', 'prev', 'next', 'last' ) ) ) {
# HTML5 rel attributes
$attrs['rel'] = $type;
}
- if( $type ) {
+ if ( $type ) {
$attrs['class'] = "mw-{$type}link";
}
@@ -593,7 +594,7 @@ abstract class IndexPager extends ContextSource implements Pager {
$this->doQuery();
}
// Hide navigation by default if there is nothing to page
- return !($this->mIsFirst && $this->mIsLast);
+ return !( $this->mIsFirst && $this->mIsLast );
}
/**
@@ -698,7 +699,9 @@ abstract class IndexPager extends ContextSource implements Pager {
*
* @return Array
*/
- protected function getExtraSortFields() { return array(); }
+ protected function getExtraSortFields() {
+ return array();
+ }
/**
* Return the default sorting direction: false for ascending, true for
@@ -719,7 +722,9 @@ abstract class IndexPager extends ContextSource implements Pager {
*
* @return Boolean
*/
- protected function getDefaultDirections() { return false; }
+ protected function getDefaultDirections() {
+ return false;
+ }
}
/**
@@ -739,7 +744,7 @@ abstract class AlphabeticPager extends IndexPager {
return '';
}
- if( isset( $this->mNavigationBar ) ) {
+ if ( isset( $this->mNavigationBar ) ) {
return $this->mNavigationBar;
}
@@ -762,7 +767,7 @@ abstract class AlphabeticPager extends IndexPager {
$this->msg( 'viewprevnext' )->rawParams( $pagingLinks['prev'],
$pagingLinks['next'], $limits )->escaped();
- if( !is_array( $this->getIndexField() ) ) {
+ if ( !is_array( $this->getIndexField() ) ) {
# Early return to avoid undue nesting
return $this->mNavigationBar;
}
@@ -770,14 +775,14 @@ abstract class AlphabeticPager extends IndexPager {
$extra = '';
$first = true;
$msgs = $this->getOrderTypeMessages();
- foreach( array_keys( $msgs ) as $order ) {
- if( $first ) {
+ foreach ( array_keys( $msgs ) as $order ) {
+ if ( $first ) {
$first = false;
} else {
$extra .= $this->msg( 'pipe-separator' )->escaped();
}
- if( $order == $this->mOrderType ) {
+ if ( $order == $this->mOrderType ) {
$extra .= $this->msg( $msgs[$order] )->escaped();
} else {
$extra .= $this->makeLink(
@@ -787,7 +792,7 @@ abstract class AlphabeticPager extends IndexPager {
}
}
- if( $extra !== '' ) {
+ if ( $extra !== '' ) {
$extra = ' ' . $this->msg( 'parentheses' )->rawParams( $extra )->escaped();
$this->mNavigationBar .= $extra;
}
@@ -868,9 +873,10 @@ abstract class ReverseChronologicalPager extends IndexPager {
$year = $this->mYear;
} else {
// If no year given, assume the current one
- $year = gmdate( 'Y' );
+ $timestamp = MWTimestamp::getInstance();
+ $year = $timestamp->format( 'Y' );
// If this month hasn't happened yet this year, go back to last year's month
- if( $this->mMonth > gmdate( 'n' ) ) {
+ if ( $this->mMonth > $timestamp->format( 'n' ) ) {
$year--;
}
}
@@ -917,7 +923,9 @@ abstract class TablePager extends IndexPager {
}
$this->mSort = $this->getRequest()->getText( 'sort' );
- if ( !array_key_exists( $this->mSort, $this->getFieldNames() ) ) {
+ if ( !array_key_exists( $this->mSort, $this->getFieldNames() )
+ || !$this->isFieldSortable( $this->mSort )
+ ) {
$this->mSort = $this->getDefaultSort();
}
if ( $this->getRequest()->getBool( 'asc' ) ) {
@@ -935,16 +943,15 @@ abstract class TablePager extends IndexPager {
*/
function getStartBody() {
global $wgStylePath;
- $tableClass = htmlspecialchars( $this->getTableClass() );
- $sortClass = htmlspecialchars( $this->getSortHeaderClass() );
+ $sortClass = $this->getSortHeaderClass();
- $s = "<table style='border:1px;' class=\"mw-datatable $tableClass\"><thead><tr>\n";
+ $s = '';
$fields = $this->getFieldNames();
# Make table header
foreach ( $fields as $field => $name ) {
if ( strval( $name ) == '' ) {
- $s .= "<th>&#160;</th>\n";
+ $s .= Html::rawElement( 'th', array(), '&#160;' ) . "\n";
} elseif ( $this->isFieldSortable( $field ) ) {
$query = array( 'sort' => $field, 'limit' => $this->mLimit );
if ( $field == $this->mSort ) {
@@ -963,20 +970,26 @@ abstract class TablePager extends IndexPager {
$query['desc'] = '1';
$alt = $this->msg( 'ascending_abbrev' )->escaped();
}
- $image = htmlspecialchars( "$wgStylePath/common/images/$image" );
+ $image = "$wgStylePath/common/images/$image";
$link = $this->makeLink(
- "<img width=\"12\" height=\"12\" alt=\"$alt\" src=\"$image\" />" .
- htmlspecialchars( $name ), $query );
- $s .= "<th class=\"$sortClass\">$link</th>\n";
+ Html::element( 'img', array( 'width' => 12, 'height' => 12,
+ 'alt' => $alt, 'src' => $image ) ) . htmlspecialchars( $name ), $query );
+ $s .= Html::rawElement( 'th', array( 'class' => $sortClass ), $link ) . "\n";
} else {
- $s .= '<th>' . $this->makeLink( htmlspecialchars( $name ), $query ) . "</th>\n";
+ $s .= Html::rawElement( 'th', array(),
+ $this->makeLink( htmlspecialchars( $name ), $query ) ) . "\n";
}
} else {
- $s .= '<th>' . htmlspecialchars( $name ) . "</th>\n";
+ $s .= Html::element( 'th', array(), $name ) . "\n";
}
}
- $s .= "</tr></thead><tbody>\n";
- return $s;
+
+ $tableClass = $this->getTableClass();
+ $ret = Html::openElement( 'table', array( 'style' => 'border:1px;', 'class' => "mw-datatable $tableClass" ) );
+ $ret .= Html::rawElement( 'thead', array(), Html::rawElement( 'tr', array(), "\n" . $s . "\n" ) );
+ $ret .= Html::openElement( 'tbody' ) . "\n";
+
+ return $ret;
}
/**
@@ -993,8 +1006,9 @@ abstract class TablePager extends IndexPager {
*/
function getEmptyBody() {
$colspan = count( $this->getFieldNames() );
- $msgEmpty = $this->msg( 'table_pager_empty' )->escaped();
- return "<tr><td colspan=\"$colspan\">$msgEmpty</td></tr>\n";
+ $msgEmpty = $this->msg( 'table_pager_empty' )->text();
+ return Html::rawElement( 'tr', array(),
+ Html::element( 'td', array( 'colspan' => $colspan ), $msgEmpty ) );
}
/**
@@ -1004,7 +1018,7 @@ abstract class TablePager extends IndexPager {
*/
function formatRow( $row ) {
$this->mCurrentRow = $row; // In case formatValue etc need to know
- $s = Xml::openElement( 'tr', $this->getRowAttrs( $row ) );
+ $s = Html::openElement( 'tr', $this->getRowAttrs( $row ) ) . "\n";
$fieldNames = $this->getFieldNames();
foreach ( $fieldNames as $field => $name ) {
@@ -1015,10 +1029,10 @@ abstract class TablePager extends IndexPager {
$formatted = '&#160;';
}
- $s .= Xml::tags( 'td', $this->getCellAttrs( $field, $value ), $formatted );
+ $s .= Html::rawElement( 'td', $this->getCellAttrs( $field, $value ), $formatted ) . "\n";
}
- $s .= "</tr>\n";
+ $s .= Html::closeElement( 'tr' ) . "\n";
return $s;
}
@@ -1130,7 +1144,7 @@ abstract class TablePager extends IndexPager {
'next' => 'arrow_disabled_right_25.png',
'last' => 'arrow_disabled_last_25.png',
);
- if( $this->getLanguage()->isRTL() ) {
+ if ( $this->getLanguage()->isRTL() ) {
$keys = array_keys( $labels );
$images = array_combine( $keys, array_reverse( $images ) );
$disabledImages = array_combine( $keys, array_reverse( $disabledImages ) );
@@ -1140,49 +1154,67 @@ abstract class TablePager extends IndexPager {
$disabledTexts = array();
foreach ( $labels as $type => $label ) {
$msgLabel = $this->msg( $label )->escaped();
- $linkTexts[$type] = "<img src=\"$path/{$images[$type]}\" alt=\"$msgLabel\"/><br />$msgLabel";
- $disabledTexts[$type] = "<img src=\"$path/{$disabledImages[$type]}\" alt=\"$msgLabel\"/><br />$msgLabel";
+ $linkTexts[$type] = Html::element( 'img', array( 'src' => "$path/{$images[$type]}",
+ 'alt' => $msgLabel ) ) . "<br />$msgLabel";
+ $disabledTexts[$type] = Html::element( 'img', array( 'src' => "$path/{$disabledImages[$type]}",
+ 'alt' => $msgLabel ) ) . "<br />$msgLabel";
}
$links = $this->getPagingLinks( $linkTexts, $disabledTexts );
- $navClass = htmlspecialchars( $this->getNavClass() );
- $s = "<table class=\"$navClass\"><tr>\n";
+ $s = Html::openElement( 'table', array( 'class' => $this->getNavClass() ) );
+ $s .= Html::openElement( 'tr' ) . "\n";
$width = 100 / count( $links ) . '%';
foreach ( $labels as $type => $label ) {
- $s .= "<td style='width:$width;'>{$links[$type]}</td>\n";
+ $s .= Html::rawElement( 'td', array( 'style' => "width:$width;" ), $links[$type] ) . "\n";
}
- $s .= "</tr></table>\n";
+ $s .= Html::closeElement( 'tr' ) . Html::closeElement( 'table' ) . "\n";
return $s;
}
/**
* Get a "<select>" element which has options for each of the allowed limits
*
+ * @param $attribs String: Extra attributes to set
* @return String: HTML fragment
*/
- public function getLimitSelect() {
+ public function getLimitSelect( $attribs = array() ) {
+ $select = new XmlSelect( 'limit', false, $this->mLimit );
+ $select->addOptions( $this->getLimitSelectList() );
+ foreach ( $attribs as $name => $value ) {
+ $select->setAttribute( $name, $value );
+ }
+ return $select->getHTML();
+ }
+
+ /**
+ * Get a list of items to show in a "<select>" element of limits.
+ * This can be passed directly to XmlSelect::addOptions().
+ *
+ * @since 1.22
+ * @return array
+ */
+ public function getLimitSelectList() {
# 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";
+ $ret = array();
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
# will be a string.
- if( is_int( $value ) ) {
+ if ( is_int( $value ) ) {
$limit = $value;
$text = $this->getLanguage()->formatNum( $limit );
} else {
$limit = $key;
$text = $value;
}
- $s .= Xml::option( $text, $limit, $limit == $this->mLimit ) . "\n";
+ $ret[$text] = $limit;
}
- $s .= Html::closeElement( 'select' );
- return $s;
+ return $ret;
}
/**
@@ -1201,9 +1233,7 @@ abstract class TablePager extends IndexPager {
}
$s = '';
foreach ( $query as $name => $value ) {
- $encName = htmlspecialchars( $name );
- $encValue = htmlspecialchars( $value );
- $s .= "<input type=\"hidden\" name=\"$encName\" value=\"$encValue\"/>\n";
+ $s .= Html::hidden( $name, $value ) . "\n";
}
return $s;
}
@@ -1216,12 +1246,14 @@ abstract class TablePager extends IndexPager {
function getLimitForm() {
global $wgScript;
- return Xml::openElement(
+ return Html::rawElement(
'form',
array(
'method' => 'get',
'action' => $wgScript
- ) ) . "\n" . $this->getLimitDropdown() . "</form>\n";
+ ),
+ "\n" . $this->getLimitDropdown()
+ ) . "\n";
}
/**
diff --git a/includes/PathRouter.php b/includes/PathRouter.php
index fc891bb3..435e09ef 100644
--- a/includes/PathRouter.php
+++ b/includes/PathRouter.php
@@ -141,10 +141,10 @@ class PathRouter {
}
$pattern = (object)array(
- 'path' => $path,
- 'params' => $params,
+ 'path' => $path,
+ 'params' => $params,
'options' => $options,
- 'key' => $key,
+ 'key' => $key,
);
$pattern->weight = self::makeWeight( $pattern );
$this->patterns[] = $pattern;
@@ -185,7 +185,7 @@ class PathRouter {
*/
protected function sortByWeight() {
$weights = array();
- foreach( $this->patterns as $key => $pattern ) {
+ foreach ( $this->patterns as $key => $pattern ) {
$weights[$key] = $pattern->weight;
}
array_multisort( $weights, SORT_DESC, SORT_NUMERIC, $this->patterns );
@@ -203,7 +203,7 @@ class PathRouter {
$path = explode( '/', $pattern->path );
# For each level of the path
- foreach( $path as $piece ) {
+ foreach ( $path as $piece ) {
if ( preg_match( '/^\$(\d+|key)$/u', $piece ) ) {
# For a piece that is only a $1 variable add 1 points of weight
$weight += 1;
diff --git a/includes/PoolCounter.php b/includes/PoolCounter.php
index 2ebef04e..2dac9388 100644
--- a/includes/PoolCounter.php
+++ b/includes/PoolCounter.php
@@ -22,25 +22,24 @@
*/
/**
- * When you have many workers (threads/servers) giving service, and a
+ * 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,
+ * 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'
* since this effect triggered on the english wikipedia on the day Michael
* Jackson died, the biographical article got hit with several edits per
* minutes and hundreds of read hits.
*
- * The PoolCounter provides semaphore semantics for restricting the number
+ * 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
+ * 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 */
@@ -52,39 +51,26 @@ abstract class PoolCounter {
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();
+ /** @var string All workers with the same key share the lock */
+ protected $key;
+ /** @var integer Maximum number of workers doing the task simultaneously */
+ protected $workers;
+ /** @var integer If this number of workers are already working/waiting, fail instead of wait */
+ protected $maxqueue;
+ /** @var float Maximum time in seconds to wait for the lock */
+ protected $timeout;
/**
- * $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.
+ * @param array $conf
+ * @param string $type
+ * @param string $key
*/
- protected $key, $workers, $maxqueue, $timeout;
+ protected function __construct( $conf, $type, $key ) {
+ $this->key = $key;
+ $this->workers = $conf['workers'];
+ $this->maxqueue = $conf['maxqueue'];
+ $this->timeout = $conf['timeout'];
+ }
/**
* Create a Pool counter. This should only be called from the PoolWorks.
@@ -105,58 +91,74 @@ abstract class PoolCounter {
return new $class( $conf, $type, $key );
}
- 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 {
-
/**
- * @return Status
+ * I want to do this task and I need to do it myself.
+ *
+ * @return Status Value is one of Locked/Error
*/
- function acquireForMe() {
- return Status::newGood( PoolCounter::LOCKED );
- }
+ abstract public function acquireForMe();
/**
- * @return Status
+ * 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 Status Value is one of Locked/Done/Error
*/
- function acquireForAnyone() {
- return Status::newGood( PoolCounter::LOCKED );
- }
+ abstract public function acquireForAnyone();
/**
- * @return Status
+ * I have successfully finished my task.
+ * Lets another one grab the lock, and returns the workers
+ * waiting on acquireForAnyone()
+ *
+ * @return Status value is one of Released/NotLocked/Error
*/
- function release() {
- return Status::newGood( PoolCounter::RELEASED );
- }
+ abstract public function release();
+}
+class PoolCounter_Stub extends PoolCounter {
public function __construct() {
/* No parameters needed */
}
+
+ public function acquireForMe() {
+ return Status::newGood( PoolCounter::LOCKED );
+ }
+
+ public function acquireForAnyone() {
+ return Status::newGood( PoolCounter::LOCKED );
+ }
+
+ public function release() {
+ return Status::newGood( PoolCounter::RELEASED );
+ }
}
/**
- * Handy class for dealing with PoolCounters using class members instead of callbacks.
+ * Class for dealing with PoolCounters using class members
*/
abstract class PoolCounterWork {
protected $cacheable = false; //Does this override getCachedWork() ?
/**
- * Actually perform the work, caching it if needed.
+ * @param string $type The type of PoolCounter to use
+ * @param string $key Key that identifies the queue this work is placed on
*/
- abstract function doWork();
+ public function __construct( $type, $key ) {
+ $this->poolCounter = PoolCounter::factory( $type, $key );
+ }
+
+ /**
+ * Actually perform the work, caching it if needed
+ * @return mixed work result or false
+ */
+ abstract public function doWork();
/**
* Retrieve the work from cache
* @return mixed work result or false
*/
- function getCachedWork() {
+ public function getCachedWork() {
return false;
}
@@ -165,7 +167,7 @@ abstract class PoolCounterWork {
* message.
* @return mixed work result or false
*/
- function fallback() {
+ public function fallback() {
return false;
}
@@ -181,17 +183,28 @@ abstract class PoolCounterWork {
* Log an error
*
* @param $status Status
+ * @return void
*/
function logError( $status ) {
wfDebugLog( 'poolcounter', $status->getWikiText() );
}
/**
- * Get the result of the work (whatever it is), or false.
+ * Get the result of the work (whatever it is), or the result of the error() function.
+ * This returns the result of the first applicable method that returns a non-false value,
+ * where the methods are checked in the following order:
+ * - a) doWork() : Applies if the work is exclusive or no another process
+ * is doing it, and on the condition that either this process
+ * successfully entered the pool or the pool counter is down.
+ * - b) doCachedWork() : Applies if the work is cacheable and this blocked on another
+ * process which finished the work.
+ * - c) fallback() : Applies for all remaining cases.
+ * If these all fall through (by returning false), then the result of error() is returned.
+ *
* @param $skipcache bool
- * @return bool|mixed
+ * @return mixed
*/
- function execute( $skipcache = false ) {
+ public function execute( $skipcache = false ) {
if ( $this->cacheable && !$skipcache ) {
$status = $this->poolCounter->acquireForAnyone();
} else {
@@ -232,15 +245,85 @@ abstract class PoolCounterWork {
/* These two cases should never be hit... */
case PoolCounter::ERROR:
default:
- $errors = array( PoolCounter::QUEUE_FULL => 'pool-queuefull', PoolCounter::TIMEOUT => 'pool-timeout' );
+ $errors = array(
+ PoolCounter::QUEUE_FULL => 'pool-queuefull',
+ PoolCounter::TIMEOUT => 'pool-timeout' );
- $status = Status::newFatal( isset( $errors[$status->value] ) ? $errors[$status->value] : 'pool-errorunknown' );
+ $status = Status::newFatal( isset( $errors[$status->value] )
+ ? $errors[$status->value]
+ : 'pool-errorunknown' );
$this->logError( $status );
return $this->error( $status );
}
}
+}
- function __construct( $type, $key ) {
- $this->poolCounter = PoolCounter::factory( $type, $key );
+/**
+ * Convenience class for dealing with PoolCounters using callbacks
+ * @since 1.22
+ */
+class PoolCounterWorkViaCallback extends PoolCounterWork {
+ /** @var callable */
+ protected $doWork;
+ /** @var callable|null */
+ protected $doCachedWork;
+ /** @var callable|null */
+ protected $fallback;
+ /** @var callable|null */
+ protected $error;
+
+ /**
+ * Build a PoolCounterWork class from a type, key, and callback map.
+ *
+ * The callback map must at least have a callback for the 'doWork' method.
+ * Additionally, callbacks can be provided for the 'doCachedWork', 'fallback',
+ * and 'error' methods. Methods without callbacks will be no-ops that return false.
+ * If a 'doCachedWork' callback is provided, then execute() may wait for any prior
+ * process in the pool to finish and reuse its cached result.
+ *
+ * @param string $type
+ * @param string $key
+ * @param array $callbacks Map of callbacks
+ * @throws MWException
+ */
+ public function __construct( $type, $key, array $callbacks ) {
+ parent::__construct( $type, $key );
+ foreach ( array( 'doWork', 'doCachedWork', 'fallback', 'error' ) as $name ) {
+ if ( isset( $callbacks[$name] ) ) {
+ if ( !is_callable( $callbacks[$name] ) ) {
+ throw new MWException( "Invalid callback provided for '$name' function." );
+ }
+ $this->$name = $callbacks[$name];
+ }
+ }
+ if ( !isset( $this->doWork ) ) {
+ throw new MWException( "No callback provided for 'doWork' function." );
+ }
+ $this->cacheable = isset( $this->doCachedWork );
+ }
+
+ public function doWork() {
+ return call_user_func_array( $this->doWork, array() );
+ }
+
+ public function getCachedWork() {
+ if ( $this->doCachedWork ) {
+ return call_user_func_array( $this->doCachedWork, array() );
+ }
+ return false;
+ }
+
+ function fallback() {
+ if ( $this->fallback ) {
+ return call_user_func_array( $this->fallback, array() );
+ }
+ return false;
+ }
+
+ function error( $status ) {
+ if ( $this->error ) {
+ return call_user_func_array( $this->error, array( $status ) );
+ }
+ return false;
}
}
diff --git a/includes/Preferences.php b/includes/Preferences.php
index 56dba05e..c9caf4f7 100644
--- a/includes/Preferences.php
+++ b/includes/Preferences.php
@@ -56,6 +56,12 @@ class Preferences {
'searchlimit' => array( 'Preferences', 'filterIntval' ),
);
+ // Stuff that shouldn't be saved as a preference.
+ private static $saveBlacklist = array(
+ 'realname',
+ 'emailaddress',
+ );
+
/**
* @throws MWException
* @param $user User
@@ -90,10 +96,19 @@ class Preferences {
}
}
+ ## Make sure that form fields have their parent set. See bug 41337.
+ $dummyForm = new HTMLForm( array(), $context );
+
+ $disable = !$user->isAllowed( 'editmyoptions' );
+
## Prod in defaults from the user
foreach ( $defaultPreferences as $name => &$info ) {
$prefFromUser = self::getOptionFromUser( $name, $info, $user );
+ if ( $disable && !in_array( $name, self::$saveBlacklist ) ) {
+ $info['disabled'] = 'disabled';
+ }
$field = HTMLForm::loadInputFromParameters( $name, $info ); // For validation
+ $field->mParent = $dummyForm;
$defaultOptions = User::getDefaultOptions();
$globalDefault = isset( $defaultOptions[$name] )
? $defaultOptions[$name]
@@ -153,7 +168,7 @@ class Preferences {
foreach ( $columns as $column ) {
foreach ( $rows as $row ) {
- if ( $user->getOption( "$prefix-$column-$row" ) ) {
+ if ( $user->getOption( "$prefix$column-$row" ) ) {
$val[] = "$column-$row";
}
}
@@ -173,7 +188,8 @@ class Preferences {
global $wgAuth, $wgContLang, $wgParser, $wgCookieExpiration, $wgLanguageCode,
$wgDisableTitleConversion, $wgDisableLangConversion, $wgMaxSigChars,
$wgEnableEmail, $wgEmailConfirmToEdit, $wgEnableUserEmail, $wgEmailAuthentication,
- $wgEnotifWatchlist, $wgEnotifUserTalk, $wgEnotifRevealEditorAddress;
+ $wgEnotifWatchlist, $wgEnotifUserTalk, $wgEnotifRevealEditorAddress,
+ $wgSecureLogin;
// retrieving user name for GENDER and misc.
$userName = $user->getName();
@@ -225,10 +241,14 @@ class Preferences {
'section' => 'personal/info',
);
+ $editCount = Linker::link( SpecialPage::getTitleFor( "Contributions", $userName ),
+ $lang->formatNum( $user->getEditCount() ) );
+
$defaultPreferences['editcount'] = array(
'type' => 'info',
+ 'raw' => true,
'label-message' => 'prefs-edits',
- 'default' => $lang->formatNum( $user->getEditCount() ),
+ 'default' => $editCount,
'section' => 'personal/info',
);
@@ -248,28 +268,20 @@ class Preferences {
);
}
+ $canViewPrivateInfo = $user->isAllowed( 'viewmyprivateinfo' );
+ $canEditPrivateInfo = $user->isAllowed( 'editmyprivateinfo' );
+
// Actually changeable stuff
$defaultPreferences['realname'] = array(
- 'type' => $wgAuth->allowPropChange( 'realname' ) ? 'text' : 'info',
+ // (not really "private", but still shouldn't be edited without permission)
+ 'type' => $canEditPrivateInfo && $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(
- $context->msg( 'gender-male' )->text() => 'male',
- $context->msg( 'gender-female' )->text() => 'female',
- $context->msg( 'gender-unknown' )->text() => 'unknown',
- ),
- 'label-message' => 'yourgender',
- 'help-message' => 'prefs-help-gender',
- );
-
- if ( $wgAuth->allowPasswordChange() ) {
+ if ( $canEditPrivateInfo && $wgAuth->allowPasswordChange() ) {
$link = Linker::link( SpecialPage::getTitleFor( 'ChangePassword' ),
$context->msg( 'prefs-resetpass' )->escaped(), array(),
array( 'returnto' => SpecialPage::getTitleFor( 'Preferences' )->getPrefixedText() ) );
@@ -290,6 +302,15 @@ class Preferences {
'section' => 'personal/info',
);
}
+ // Only show preferhttps if secure login is turned on
+ if ( $wgSecureLogin && wfCanIPUseHTTPS( $context->getRequest()->getIP() ) ) {
+ $defaultPreferences['prefershttps'] = array(
+ 'type' => 'toggle',
+ 'label-message' => 'tog-prefershttps',
+ 'help-message' => 'prefs-help-prefershttps',
+ 'section' => 'personal/info'
+ );
+ }
// Language
$languages = Language::fetchLanguageNames( null, 'mw' );
@@ -310,39 +331,74 @@ class Preferences {
'label-message' => 'yourlanguage',
);
- /* see if there are multiple language variants to choose from*/
- $variantArray = array();
+ $defaultPreferences['gender'] = array(
+ 'type' => 'radio',
+ 'section' => 'personal/i18n',
+ 'options' => array(
+ $context->msg( 'parentheses',
+ $context->msg( 'gender-unknown' )->text()
+ )->text() => 'unknown',
+ $context->msg( 'gender-female' )->text() => 'female',
+ $context->msg( 'gender-male' )->text() => 'male',
+ ),
+ 'label-message' => 'yourgender',
+ 'help-message' => 'prefs-help-gender',
+ );
+
+ // see if there are multiple language variants to choose from
if ( !$wgDisableLangConversion ) {
- $variants = $wgContLang->getVariants();
+ foreach ( LanguageConverter::$languagesWithVariants as $langCode ) {
+ if ( $langCode == $wgContLang->getCode() ) {
+ $variants = $wgContLang->getVariants();
- foreach ( $variants as $v ) {
- $v = str_replace( '_', '-', strtolower( $v ) );
- $variantArray[$v] = $wgContLang->getVariantname( $v, false );
- }
+ if ( count( $variants ) <= 1 ) {
+ continue;
+ }
- $options = array();
- foreach ( $variantArray as $code => $name ) {
- $display = wfBCP47( $code ) . ' - ' . $name;
- $options[$display] = $code;
- }
+ $variantArray = array();
+ foreach ( $variants as $v ) {
+ $v = str_replace( '_', '-', strtolower( $v ) );
+ $variantArray[$v] = $lang->getVariantname( $v, false );
+ }
- if ( count( $variantArray ) > 1 ) {
- $defaultPreferences['variant'] = array(
- 'label-message' => 'yourvariant',
- 'type' => 'select',
- 'options' => $options,
- 'section' => 'personal/i18n',
- 'help-message' => 'prefs-help-variant',
- );
+ $options = array();
+ foreach ( $variantArray as $code => $name ) {
+ $display = wfBCP47( $code ) . ' - ' . $name;
+ $options[$display] = $code;
+ }
+
+ $defaultPreferences['variant'] = array(
+ 'label-message' => 'yourvariant',
+ 'type' => 'select',
+ 'options' => $options,
+ 'section' => 'personal/i18n',
+ 'help-message' => 'prefs-help-variant',
+ );
+
+ if ( !$wgDisableTitleConversion ) {
+ $defaultPreferences['noconvertlink'] = array(
+ 'type' => 'toggle',
+ 'section' => 'personal/i18n',
+ 'label-message' => 'tog-noconvertlink',
+ );
+ }
+ } else {
+ $defaultPreferences["variant-$langCode"] = array(
+ 'type' => 'api',
+ );
+ }
}
}
- if ( count( $variantArray ) > 1 && !$wgDisableLangConversion && !$wgDisableTitleConversion ) {
- $defaultPreferences['noconvertlink'] =
- array(
+ // Stuff from Language::getExtraUserToggles()
+ // FIXME is this dead code? $extraUserToggles doesn't seem to be defined for any language
+ $toggles = $wgContLang->getExtraUserToggles();
+
+ foreach ( $toggles as $toggle ) {
+ $defaultPreferences[$toggle] = array(
'type' => 'toggle',
'section' => 'personal/i18n',
- 'label-message' => 'tog-noconvertlink',
+ 'label-message' => "tog-$toggle",
);
}
@@ -374,43 +430,45 @@ class Preferences {
## Email stuff
if ( $wgEnableEmail ) {
- $helpMessages[] = $wgEmailConfirmToEdit
- ? 'prefs-help-email-required'
- : 'prefs-help-email';
-
- if( $wgEnableUserEmail ) {
- // additional messages when users can send email to each other
- $helpMessages[] = 'prefs-help-email-others';
- }
+ if ( $canViewPrivateInfo ) {
+ $helpMessages[] = $wgEmailConfirmToEdit
+ ? 'prefs-help-email-required'
+ : 'prefs-help-email';
+
+ if ( $wgEnableUserEmail ) {
+ // additional messages when users can send email to each other
+ $helpMessages[] = 'prefs-help-email-others';
+ }
- $link = Linker::link(
- SpecialPage::getTitleFor( 'ChangeEmail' ),
- $context->msg( $user->getEmail() ? 'prefs-changeemail' : 'prefs-setemail' )->escaped(),
- array(),
- array( 'returnto' => SpecialPage::getTitleFor( 'Preferences' )->getPrefixedText() ) );
+ $emailAddress = $user->getEmail() ? htmlspecialchars( $user->getEmail() ) : '';
+ if ( $canEditPrivateInfo && $wgAuth->allowPropChange( 'emailaddress' ) ) {
+ $link = Linker::link(
+ SpecialPage::getTitleFor( 'ChangeEmail' ),
+ $context->msg( $user->getEmail() ? 'prefs-changeemail' : 'prefs-setemail' )->escaped(),
+ array(),
+ array( 'returnto' => SpecialPage::getTitleFor( 'Preferences' )->getPrefixedText() ) );
+
+ $emailAddress .= $emailAddress == '' ? $link : (
+ $context->msg( 'word-separator' )->plain()
+ . $context->msg( 'parentheses' )->rawParams( $link )->plain()
+ );
+ }
- $emailAddress = $user->getEmail() ? htmlspecialchars( $user->getEmail() ) : '';
- if ( $wgAuth->allowPropChange( 'emailaddress' ) ) {
- $emailAddress .= $emailAddress == '' ? $link : (
- $context->msg( 'word-separator' )->plain()
- . $context->msg( 'parentheses' )->rawParams( $link )->plain()
+ $defaultPreferences['emailaddress'] = array(
+ 'type' => 'info',
+ 'raw' => true,
+ 'default' => $emailAddress,
+ 'label-message' => 'youremail',
+ 'section' => 'personal/email',
+ 'help-messages' => $helpMessages,
+ # 'cssclass' chosen below
);
}
- $defaultPreferences['emailaddress'] = array(
- 'type' => 'info',
- 'raw' => true,
- 'default' => $emailAddress,
- 'label-message' => 'youremail',
- 'section' => 'personal/email',
- 'help-messages' => $helpMessages,
- # 'cssclass' chosen below
- );
-
$disableEmailPrefs = false;
- $emailauthenticationclass = 'mw-email-not-authenticated';
if ( $wgEmailAuthentication ) {
+ $emailauthenticationclass = 'mw-email-not-authenticated';
if ( $user->getEmail() ) {
if ( $user->getEmailAuthenticationTimestamp() ) {
// date and time are separate parameters to facilitate localisation.
@@ -432,7 +490,7 @@ class Preferences {
SpecialPage::getTitleFor( 'Confirmemail' ),
$context->msg( 'emailconfirmlink' )->escaped()
) . '<br />';
- $emailauthenticationclass="mw-email-not-authenticated";
+ $emailauthenticationclass = "mw-email-not-authenticated";
}
} else {
$disableEmailPrefs = true;
@@ -440,17 +498,19 @@ class Preferences {
$emailauthenticationclass = 'mw-email-none';
}
- $defaultPreferences['emailauthentication'] = array(
- 'type' => 'info',
- 'raw' => true,
- 'section' => 'personal/email',
- 'label-message' => 'prefs-emailconfirm-label',
- 'default' => $emailauthenticated,
- # Apply the same CSS class used on the input to the message:
- 'cssclass' => $emailauthenticationclass,
- );
+ if ( $canViewPrivateInfo ) {
+ $defaultPreferences['emailauthentication'] = array(
+ 'type' => 'info',
+ 'raw' => true,
+ 'section' => 'personal/email',
+ 'label-message' => 'prefs-emailconfirm-label',
+ 'default' => $emailauthenticated,
+ # Apply the same CSS class used on the input to the message:
+ 'cssclass' => $emailauthenticationclass,
+ );
+ $defaultPreferences['emailaddress']['cssclass'] = $emailauthenticationclass;
+ }
}
- $defaultPreferences['emailaddress']['cssclass'] = $emailauthenticationclass;
if ( $wgEnableUserEmail && $user->isAllowed( 'sendemail' ) ) {
$defaultPreferences['disablemail'] = array(
@@ -546,18 +606,6 @@ class Preferences {
'section' => 'rendering/skin',
);
}
-
- $selectedSkin = $user->getOption( 'skin' );
- if ( in_array( $selectedSkin, array( 'cologneblue', 'standard' ) ) ) {
- $settings = array_flip( $context->getLanguage()->getQuickbarSettings() );
-
- $defaultPreferences['quickbar'] = array(
- 'type' => 'radio',
- 'options' => $settings,
- 'section' => 'rendering/skin',
- 'label-message' => 'qbsettings',
- );
- }
}
/**
@@ -660,6 +708,18 @@ class Preferences {
* @param $defaultPreferences Array
*/
static function renderingPreferences( $user, IContextSource $context, &$defaultPreferences ) {
+ ## Diffs ####################################
+ $defaultPreferences['diffonly'] = array(
+ 'type' => 'toggle',
+ 'section' => 'rendering/diffs',
+ 'label-message' => 'tog-diffonly',
+ );
+ $defaultPreferences['norollbackdiff'] = array(
+ 'type' => 'toggle',
+ 'section' => 'rendering/diffs',
+ 'label-message' => 'tog-norollbackdiff',
+ );
+
## Page Rendering ##############################
global $wgAllowUserCssPrefs;
if ( $wgAllowUserCssPrefs ) {
@@ -686,7 +746,7 @@ class Preferences {
'section' => 'rendering/advancedrendering',
'options' => $stubThresholdOptions,
'size' => 20,
- 'label' => $context->msg( 'stub-threshold' )->text(), // Raw HTML message. Yay?
+ 'label-raw' => $context->msg( 'stub-threshold' )->text(), // Raw HTML message. Yay?
);
if ( $wgAllowUserCssPrefs ) {
@@ -706,11 +766,6 @@ class Preferences {
'section' => 'rendering/advancedrendering',
'label-message' => 'tog-showhiddencats'
);
- $defaultPreferences['showjumplinks'] = array(
- 'type' => 'toggle',
- 'section' => 'rendering/advancedrendering',
- 'label-message' => 'tog-showjumplinks',
- );
if ( $wgAllowUserCssPrefs ) {
$defaultPreferences['justify'] = array(
@@ -733,28 +788,31 @@ class Preferences {
* @param $defaultPreferences Array
*/
static function editingPreferences( $user, IContextSource $context, &$defaultPreferences ) {
- global $wgUseExternalEditor, $wgAllowUserCssPrefs;
+ global $wgAllowUserCssPrefs;
## Editing #####################################
- $defaultPreferences['cols'] = array(
- 'type' => 'int',
- 'label-message' => 'columns',
- 'section' => 'editing/textboxsize',
- 'min' => 4,
- 'max' => 1000,
+ 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['rows'] = array(
- 'type' => 'int',
- 'label-message' => 'rows',
- 'section' => 'editing/textboxsize',
- 'min' => 4,
- 'max' => 1000,
+ $defaultPreferences['editondblclick'] = array(
+ 'type' => 'toggle',
+ 'section' => 'editing/advancedediting',
+ 'label-message' => 'tog-editondblclick',
);
if ( $wgAllowUserCssPrefs ) {
$defaultPreferences['editfont'] = array(
'type' => 'select',
- 'section' => 'editing/advancedediting',
+ 'section' => 'editing/editor',
'label-message' => 'editfont-style',
'options' => array(
$context->msg( 'editfont-default' )->text() => 'default',
@@ -764,72 +822,59 @@ class Preferences {
)
);
}
- $defaultPreferences['previewontop'] = array(
- 'type' => 'toggle',
- 'section' => 'editing/advancedediting',
- 'label-message' => 'tog-previewontop',
+ $defaultPreferences['cols'] = array(
+ 'type' => 'int',
+ 'label-message' => 'columns',
+ 'section' => 'editing/editor',
+ 'min' => 4,
+ 'max' => 1000,
);
- $defaultPreferences['previewonfirst'] = array(
- 'type' => 'toggle',
- 'section' => 'editing/advancedediting',
- 'label-message' => 'tog-previewonfirst',
+ $defaultPreferences['rows'] = array(
+ 'type' => 'int',
+ 'label-message' => 'rows',
+ 'section' => 'editing/editor',
+ 'min' => 4,
+ 'max' => 1000,
);
-
- if ( $wgAllowUserCssPrefs ) {
- $defaultPreferences['editsection'] = array(
+ if ( $user->isAllowed( 'minoredit' ) ) {
+ $defaultPreferences['minordefault'] = array(
'type' => 'toggle',
- 'section' => 'editing/advancedediting',
- 'label-message' => 'tog-editsection',
+ 'section' => 'editing/editor',
+ 'label-message' => 'tog-minordefault',
);
}
- $defaultPreferences['editsectiononrightclick'] = array(
+ $defaultPreferences['forceeditsummary'] = array(
'type' => 'toggle',
- 'section' => 'editing/advancedediting',
- 'label-message' => 'tog-editsectiononrightclick',
+ 'section' => 'editing/editor',
+ 'label-message' => 'tog-forceeditsummary',
);
- $defaultPreferences['editondblclick'] = array(
+ $defaultPreferences['useeditwarning'] = array(
'type' => 'toggle',
- 'section' => 'editing/advancedediting',
- 'label-message' => 'tog-editondblclick',
+ 'section' => 'editing/editor',
+ 'label-message' => 'tog-useeditwarning',
);
$defaultPreferences['showtoolbar'] = array(
'type' => 'toggle',
- 'section' => 'editing/advancedediting',
+ 'section' => 'editing/editor',
'label-message' => 'tog-showtoolbar',
);
- if ( $user->isAllowed( 'minoredit' ) ) {
- $defaultPreferences['minordefault'] = array(
- 'type' => 'toggle',
- 'section' => 'editing/advancedediting',
- 'label-message' => 'tog-minordefault',
- );
- }
-
- 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(
+ $defaultPreferences['previewonfirst'] = array(
'type' => 'toggle',
- 'section' => 'editing/advancedediting',
- 'label-message' => 'tog-forceeditsummary',
+ 'section' => 'editing/preview',
+ 'label-message' => 'tog-previewonfirst',
+ );
+ $defaultPreferences['previewontop'] = array(
+ 'type' => 'toggle',
+ 'section' => 'editing/preview',
+ 'label-message' => 'tog-previewontop',
);
-
$defaultPreferences['uselivepreview'] = array(
'type' => 'toggle',
- 'section' => 'editing/advancedediting',
+ 'section' => 'editing/preview',
'label-message' => 'tog-uselivepreview',
);
+
}
/**
@@ -956,19 +1001,6 @@ class Preferences {
);
}
- if ( $wgEnableAPI ) {
- # Some random gibberish as a proposed default
- // @todo Fixme: this should use CryptRand but we may not want to read urandom on every view
- $hash = sha1( mt_rand() . microtime( true ) );
-
- $defaultPreferences['watchlisttoken'] = array(
- 'type' => 'text',
- 'section' => 'watchlist/advancedwatchlist',
- 'label-message' => 'prefs-watchlist-token',
- 'help' => $context->msg( 'prefs-help-watchlist-token', $hash )->escaped()
- );
- }
-
$watchTypes = array(
'edit' => 'watchdefault',
'move' => 'watchmoves',
@@ -982,6 +1014,8 @@ class Preferences {
foreach ( $watchTypes as $action => $pref ) {
if ( $user->isAllowed( $action ) ) {
+ // Messages:
+ // tog-watchdefault, tog-watchmoves, tog-watchdeletion, tog-watchcreations
$defaultPreferences[$pref] = array(
'type' => 'toggle',
'section' => 'watchlist/advancedwatchlist',
@@ -989,6 +1023,19 @@ class Preferences {
);
}
}
+
+ if ( $wgEnableAPI ) {
+ $defaultPreferences['watchlisttoken'] = array(
+ 'type' => 'api',
+ );
+ $defaultPreferences['watchlisttoken-info'] = array(
+ 'type' => 'info',
+ 'section' => 'watchlist/tokenwatchlist',
+ 'label-message' => 'prefs-watchlist-token',
+ 'default' => $user->getTokenFromOption( 'watchlisttoken' ),
+ 'help-message' => 'prefs-help-watchlist-token2',
+ );
+ }
}
/**
@@ -1030,8 +1077,9 @@ class Preferences {
$nsOptions = $wgContLang->getFormattedNamespaces();
$nsOptions[0] = $context->msg( 'blanknamespace' )->text();
foreach ( $nsOptions as $ns => $name ) {
- if ( $ns < 0 )
+ if ( $ns < 0 ) {
unset( $nsOptions[$ns] );
+ }
}
$defaultPreferences['searchnamespaces'] = array(
@@ -1044,35 +1092,9 @@ class Preferences {
}
/**
- * @param $user User
- * @param $context IContextSource
- * @param $defaultPreferences Array
+ * Dummy, kept for backwards-compatibility.
*/
static function miscPreferences( $user, IContextSource $context, &$defaultPreferences ) {
- global $wgContLang;
-
- ## 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',
- );
-
- // Stuff from Language::getExtraUserToggles()
- $toggles = $wgContLang->getExtraUserToggles();
-
- foreach ( $toggles as $toggle ) {
- $defaultPreferences[$toggle] = array(
- 'type' => 'toggle',
- 'section' => 'personal/i18n',
- 'label-message' => "tog-$toggle",
- );
- }
}
/**
@@ -1110,7 +1132,7 @@ class Preferences {
}
# Create preview link
- $mplink = htmlspecialchars( $mptitle->getLocalURL( "useskin=$skinkey" ) );
+ $mplink = htmlspecialchars( $mptitle->getLocalURL( array( 'useskin' => $skinkey ) ) );
$linkTools[] = "<a target='_blank' href=\"$mplink\">$previewtext</a>";
# Create links to user CSS/JS pages
@@ -1278,15 +1300,17 @@ class Preferences {
}
/**
+ * @param $context IContextSource
* @return array
*/
static function getTimezoneOptions( IContextSource $context ) {
$opt = array();
- global $wgLocalTZoffset, $wgLocaltimezone;
- // Check that $wgLocalTZoffset is the same as $wgLocaltimezone
- if ( $wgLocalTZoffset == date( 'Z' ) / 60 ) {
- $server_tz_msg = $context->msg( 'timezoneuseserverdefault', $wgLocaltimezone )->text();
+ global $wgLocalTZoffset;
+ $timestamp = MWTimestamp::getLocalInstance();
+ // Check that $wgLocalTZoffset is the same as the local time zone offset
+ if ( $wgLocalTZoffset == $timestamp->format( 'Z' ) / 60 ) {
+ $server_tz_msg = $context->msg( 'timezoneuseserverdefault', $timestamp->getTimezone()->getName() )->text();
} else {
$tzstring = sprintf( '%+03d:%02d', floor( $wgLocalTZoffset / 60 ), abs( $wgLocalTZoffset ) % 60 );
$server_tz_msg = $context->msg( 'timezoneuseserverdefault', $tzstring )->text();
@@ -1368,7 +1392,9 @@ class Preferences {
$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;
}
@@ -1382,6 +1408,8 @@ class Preferences {
}
/**
+ * Handle the form submission if everything validated properly
+ *
* @param $formData
* @param $form PreferencesForm
* @param $entryPoint string
@@ -1393,6 +1421,10 @@ class Preferences {
$user = $form->getModifiedUser();
$result = true;
+ if ( !$user->isAllowedAny( 'editmyprivateinfo', 'editmyoptions' ) ) {
+ return Status::newFatal( 'mypreferencesprotected' );
+ }
+
// Filter input
foreach ( array_keys( $formData ) as $name ) {
if ( isset( self::$saveFilters[$name] ) ) {
@@ -1401,40 +1433,37 @@ class Preferences {
}
}
- // Stuff that shouldn't be saved as a preference.
- $saveBlacklist = array(
- 'realname',
- 'emailaddress',
- );
-
// Fortunately, the realname field is MUCH simpler
- if ( !in_array( 'realname', $wgHiddenPrefs ) ) {
+ // (not really "private", but still shouldn't be edited without permission)
+ if ( !in_array( 'realname', $wgHiddenPrefs ) && $user->isAllowed( 'editmyprivateinfo' ) ) {
$realName = $formData['realname'];
$user->setRealName( $realName );
}
- foreach ( $saveBlacklist as $b ) {
- unset( $formData[$b] );
- }
+ if ( $user->isAllowed( 'editmyoptions' ) ) {
+ foreach ( self::$saveBlacklist as $b ) {
+ unset( $formData[$b] );
+ }
- # If users have saved a value for a preference which has subsequently been disabled
- # via $wgHiddenPrefs, we don't want to destroy that setting in case the preference
- # is subsequently re-enabled
- # TODO: maintenance script to actually delete these
- foreach( $wgHiddenPrefs as $pref ) {
- # If the user has not set a non-default value here, the default will be returned
- # and subsequently discarded
- $formData[$pref] = $user->getOption( $pref, null, true );
- }
+ # If users have saved a value for a preference which has subsequently been disabled
+ # via $wgHiddenPrefs, we don't want to destroy that setting in case the preference
+ # is subsequently re-enabled
+ # TODO: maintenance script to actually delete these
+ foreach ( $wgHiddenPrefs as $pref ) {
+ # If the user has not set a non-default value here, the default will be returned
+ # and subsequently discarded
+ $formData[$pref] = $user->getOption( $pref, null, true );
+ }
- // Keep old preferences from interfering due to back-compat code, etc.
- $user->resetOptions( 'unused', $form->getContext() );
+ // Keep old preferences from interfering due to back-compat code, etc.
+ $user->resetOptions( 'unused', $form->getContext() );
- foreach ( $formData as $key => $value ) {
- $user->setOption( $key, $value );
- }
+ foreach ( $formData as $key => $value ) {
+ $user->setOption( $key, $value );
+ }
- $user->saveSettings();
+ $user->saveSettings();
+ }
$wgAuth->updateExternalDB( $user );
@@ -1469,7 +1498,8 @@ class Preferences {
/**
* Try to set a user's email address.
* This does *not* try to validate the address.
- * Caller is responsible for checking $wgAuth.
+ * Caller is responsible for checking $wgAuth and 'editmyprivateinfo'
+ * right.
*
* @deprecated in 1.20; use User::setEmailWithConfirmation() instead.
* @param $user User
@@ -1488,7 +1518,7 @@ class Preferences {
}
/**
- * @deprecated in 1.19; will be removed in 1.20.
+ * @deprecated in 1.19
* @param $user User
* @return array
*/
@@ -1558,52 +1588,37 @@ class PreferencesForm extends HTMLForm {
* @return String
*/
function getButtons() {
+ if ( !$this->getModifiedUser()->isAllowedAny( 'editmyprivateinfo', 'editmyoptions' ) ) {
+ return '';
+ }
+
$html = parent::getButtons();
- $t = SpecialPage::getTitleFor( 'Preferences', 'reset' );
+ if ( $this->getModifiedUser()->isAllowed( 'editmyoptions' ) ) {
+ $t = SpecialPage::getTitleFor( 'Preferences', 'reset' );
- $html .= "\n" . Linker::link( $t, $this->msg( 'restoreprefs' )->escaped() );
+ $html .= "\n" . Linker::link( $t, $this->msg( 'restoreprefs' )->escaped() );
- $html = Xml::tags( 'div', array( 'class' => 'mw-prefs-buttons' ), $html );
+ $html = Xml::tags( 'div', array( 'class' => 'mw-prefs-buttons' ), $html );
+ }
return $html;
}
/**
+ * Separate multi-option preferences into multiple preferences, since we
+ * have to store them separately
* @param $data array
* @return array
*/
function filterDataForSubmit( $data ) {
- // Support for separating multi-option preferences into multiple preferences
- // Due to lack of array support.
foreach ( $this->mFlatFields as $fieldname => $field ) {
- $info = $field->mParams;
-
- if ( $field instanceof HTMLMultiSelectField ) {
- $options = HTMLFormField::flattenOptions( $info['options'] );
+ if ( $field instanceof HTMLNestedFilterable ) {
+ $info = $field->mParams;
$prefix = isset( $info['prefix'] ) ? $info['prefix'] : $fieldname;
-
- foreach ( $options as $opt ) {
- $data["$prefix$opt"] = in_array( $opt, $data[$fieldname] );
+ foreach ( $field->filterDataForSubmit( $data[$fieldname] ) as $key => $value ) {
+ $data["$prefix$key"] = $value;
}
-
- unset( $data[$fieldname] );
-
- } elseif ( $field instanceof HTMLCheckMatrix ) {
- $columns = HTMLFormField::flattenOptions( $info['columns'] );
- $rows = HTMLFormField::flattenOptions( $info['rows'] );
- $prefix = isset( $info['prefix'] ) ? $info['prefix'] : $fieldname;
- foreach ( $columns as $column ) {
- foreach ( $rows as $row ) {
- // Make sure option hasn't been removed
- if ( !isset( $info['remove-options'] )
- || !in_array( "$column-$row", $info['remove-options'] ) )
- {
- $data["$prefix-$column-$row"] = in_array( "$column-$row", $data[$fieldname] );
- }
- }
- }
-
unset( $data[$fieldname] );
}
}
diff --git a/includes/PrefixSearch.php b/includes/PrefixSearch.php
index d37d9e80..3c464c58 100644
--- a/includes/PrefixSearch.php
+++ b/includes/PrefixSearch.php
@@ -37,16 +37,16 @@ class PrefixSearch {
*/
public static function titleSearch( $search, $limit, $namespaces = array() ) {
$search = trim( $search );
- if( $search == '' ) {
+ if ( $search == '' ) {
return array(); // Return empty result
}
$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() == '' ) {
+ if ( $title && $title->getInterwiki() == '' ) {
$ns = array( $title->getNamespace() );
- if( $ns[0] == NS_MAIN ) {
+ if ( $ns[0] == NS_MAIN ) {
$ns = $namespaces; // no explicit prefix, use default namespaces
}
return self::searchBackend(
@@ -55,7 +55,7 @@ class PrefixSearch {
// Is this a namespace prefix?
$title = Title::newFromText( $search . 'Dummy' );
- if( $title && $title->getText() == 'Dummy'
+ if ( $title && $title->getText() == 'Dummy'
&& $title->getNamespace() != NS_MAIN
&& $title->getInterwiki() == '' ) {
return self::searchBackend(
@@ -73,16 +73,16 @@ class PrefixSearch {
* @return Array of strings
*/
protected static function searchBackend( $namespaces, $search, $limit ) {
- if( count( $namespaces ) == 1 ) {
+ if ( count( $namespaces ) == 1 ) {
$ns = $namespaces[0];
- if( $ns == NS_MEDIA ) {
+ if ( $ns == NS_MEDIA ) {
$namespaces = array( NS_FILE );
- } elseif( $ns == NS_SPECIAL ) {
+ } elseif ( $ns == NS_SPECIAL ) {
return self::specialSearch( $search, $limit );
}
}
$srchres = array();
- if( wfRunHooks( 'PrefixSearchBackend', array( $namespaces, $search, $limit, &$srchres ) ) ) {
+ if ( wfRunHooks( 'PrefixSearchBackend', array( $namespaces, $search, $limit, &$srchres ) ) ) {
return self::defaultSearchBackend( $namespaces, $search, $limit );
}
return $srchres;
@@ -106,24 +106,24 @@ class PrefixSearch {
// Unlike SpecialPage itself, we want the canonical forms of both
// canonical and alias title forms...
$keys = array();
- foreach( SpecialPageFactory::getList() as $page => $class ) {
+ foreach ( SpecialPageFactory::getList() as $page => $class ) {
$keys[$wgContLang->caseFold( $page )] = $page;
}
- foreach( $wgContLang->getSpecialPageAliases() as $page => $aliases ) {
- if( !array_key_exists( $page, SpecialPageFactory::getList() ) ) {# bug 20885
+ foreach ( $wgContLang->getSpecialPageAliases() as $page => $aliases ) {
+ if ( !array_key_exists( $page, SpecialPageFactory::getList() ) ) {# bug 20885
continue;
}
- foreach( $aliases as $alias ) {
+ foreach ( $aliases as $alias ) {
$keys[$wgContLang->caseFold( $alias )] = $alias;
}
}
ksort( $keys );
$srchres = array();
- foreach( $keys as $pageKey => $page ) {
- if( $searchKey === '' || strpos( $pageKey, $searchKey ) === 0 ) {
+ foreach ( $keys as $pageKey => $page ) {
+ if ( $searchKey === '' || strpos( $pageKey, $searchKey ) === 0 ) {
wfSuppressWarnings();
// bug 27671: Don't use SpecialPage::getTitleFor() here because it
// localizes its input leading to searches for e.g. Special:All
@@ -133,7 +133,7 @@ class PrefixSearch {
wfRestoreWarnings();
}
- if( count( $srchres ) >= $limit ) {
+ if ( count( $srchres ) >= $limit ) {
break;
}
}
@@ -154,7 +154,7 @@ class PrefixSearch {
*/
protected static function defaultSearchBackend( $namespaces, $search, $limit ) {
$ns = array_shift( $namespaces ); // support only one namespace
- if( in_array( NS_MAIN, $namespaces ) ) {
+ if ( in_array( NS_MAIN, $namespaces ) ) {
$ns = NS_MAIN; // if searching on many always default to main
}
@@ -175,7 +175,7 @@ class PrefixSearch {
$data = $module->getResultData();
// Reformat useful data for future printing by JSON engine
- $srchres = array ();
+ $srchres = array();
foreach ( (array)$data['query']['allpages'] as $pageinfo ) {
// Note: this data will no be printable by the xml engine
// because it does not support lists of unnamed items
@@ -196,14 +196,14 @@ class PrefixSearch {
// We will look at each given namespace against wgContLang namespaces
$validNamespaces = $wgContLang->getNamespaces();
- if( is_array( $namespaces ) && count( $namespaces ) > 0 ) {
+ if ( is_array( $namespaces ) && count( $namespaces ) > 0 ) {
$valid = array();
foreach ( $namespaces as $ns ) {
- if( is_numeric( $ns ) && array_key_exists( $ns, $validNamespaces ) ) {
+ if ( is_numeric( $ns ) && array_key_exists( $ns, $validNamespaces ) ) {
$valid[] = $ns;
}
}
- if( count( $valid ) > 0 ) {
+ if ( count( $valid ) > 0 ) {
return $valid;
}
}
diff --git a/includes/ProtectionForm.php b/includes/ProtectionForm.php
index d7b88400..f10317a9 100644
--- a/includes/ProtectionForm.php
+++ b/includes/ProtectionForm.php
@@ -91,7 +91,7 @@ class ProtectionForm {
$this->mReasonSelection = $wgRequest->getText( 'wpProtectReasonSelection' );
$this->mCascade = $wgRequest->getBool( 'mwProtect-cascade', $this->mCascade );
- foreach( $this->mApplicableTypes as $action ) {
+ foreach ( $this->mApplicableTypes as $action ) {
// @todo FIXME: This form currently requires individual selections,
// but the db allows multiples separated by commas.
@@ -132,15 +132,20 @@ class ProtectionForm {
}
$val = $wgRequest->getVal( "mwProtect-level-$action" );
- if( isset( $val ) && in_array( $val, $wgRestrictionLevels ) ) {
+ if ( isset( $val ) && in_array( $val, $wgRestrictionLevels ) ) {
// Prevent users from setting levels that they cannot later unset
- if( $val == 'sysop' ) {
- // Special case, rewrite sysop to either protect and editprotected
- if( !$wgUser->isAllowedAny( 'protect', 'editprotected' ) )
+ if ( $val == 'sysop' ) {
+ // Special case, rewrite sysop to editprotected
+ if ( !$wgUser->isAllowed( 'editprotected' ) ) {
continue;
- } else {
- if( !$wgUser->isAllowed( $val ) )
+ }
+ } elseif ( $val == 'autoconfirmed' ) {
+ // Special case, rewrite autoconfirmed to editsemiprotected
+ if ( !$wgUser->isAllowed( 'editsemiprotected' ) ) {
continue;
+ }
+ } elseif ( !$wgUser->isAllowed( $val ) ) {
+ continue;
}
$this->mRestrictions[$action] = $val;
}
@@ -188,10 +193,10 @@ class ProtectionForm {
throw new ErrorPageError( 'protect-badnamespace-title', 'protect-badnamespace-text' );
}
- if( $wgRequest->wasPosted() ) {
- if( $this->save() ) {
+ if ( $wgRequest->wasPosted() ) {
+ if ( $this->save() ) {
$q = $this->mArticle->isRedirect() ? 'redirect=no' : '';
- $wgOut->redirect( $this->mTitle->getFullUrl( $q ) );
+ $wgOut->redirect( $this->mTitle->getFullURL( $q ) );
}
} else {
$this->show();
@@ -282,10 +287,11 @@ class ProtectionForm {
$reasonstr = $this->mReason;
}
$expiry = array();
- foreach( $this->mApplicableTypes as $action ) {
+ foreach ( $this->mApplicableTypes as $action ) {
$expiry[$action] = $this->getExpiry( $action );
- if( empty( $this->mRestrictions[$action] ) )
+ if ( empty( $this->mRestrictions[$action] ) ) {
continue; // unprotected
+ }
if ( !$expiry[$action] ) {
$this->show( array( 'protect_expiry_invalid' ) );
return false;
@@ -296,13 +302,7 @@ class ProtectionForm {
}
}
- # They shouldn't be able to do this anyway, but just to make sure, ensure that cascading restrictions aren't being applied
- # to a semi-protected page.
- $edit_restriction = isset( $this->mRestrictions['edit'] ) ? $this->mRestrictions['edit'] : '';
$this->mCascade = $wgRequest->getBool( 'mwProtect-cascade' );
- if ( $this->mCascade && ($edit_restriction != 'protect') &&
- !User::groupHasPermission( $edit_restriction, 'protect' ) )
- $this->mCascade = false;
$status = $this->mArticle->doUpdateRestrictions( $this->mRestrictions, $expiry, $this->mCascade, $reasonstr, $wgUser );
@@ -318,23 +318,18 @@ class ProtectionForm {
* you can also return an array of message name and its parameters
*/
$errorMsg = '';
- if( !wfRunHooks( 'ProtectionForm::save', array( $this->mArticle, &$errorMsg ) ) ) {
+ if ( !wfRunHooks( 'ProtectionForm::save', array( $this->mArticle, &$errorMsg, $reasonstr ) ) ) {
if ( $errorMsg == '' ) {
$errorMsg = array( 'hookaborted' );
}
}
- if( $errorMsg != '' ) {
+ if ( $errorMsg != '' ) {
$this->show( $errorMsg );
return false;
}
- if ( $wgUser->isLoggedIn() && $wgRequest->getCheck( 'mwProtectWatch' ) != $wgUser->isWatched( $this->mTitle ) ) {
- if ( $wgRequest->getCheck( 'mwProtectWatch' ) ) {
- WatchAction::doWatch( $this->mTitle, $wgUser );
- } else {
- WatchAction::doUnwatch( $this->mTitle, $wgUser );
- }
- }
+ WatchAction::doWatchOrUnwatch( $wgRequest->getCheck( 'mwProtectWatch' ), $this->mTitle, $wgUser );
+
return true;
}
@@ -356,10 +351,10 @@ class ProtectionForm {
);
$out = '';
- if( !$this->disabled ) {
+ if ( !$this->disabled ) {
$wgOut->addModules( 'mediawiki.legacy.protect' );
$out .= Xml::openElement( 'form', array( 'method' => 'post',
- 'action' => $this->mTitle->getLocalUrl( 'action=protect' ),
+ 'action' => $this->mTitle->getLocalURL( 'action=protect' ),
'id' => 'mw-Protect-Form', 'onsubmit' => 'ProtectionForm.enableUnchainedInputs(true)' ) );
}
@@ -368,10 +363,12 @@ class ProtectionForm {
Xml::openElement( 'table', array( 'id' => 'mwProtectSet' ) ) .
Xml::openElement( 'tbody' );
- foreach( $this->mRestrictions as $action => $selected ) {
- /* Not all languages have V_x <-> N_x relation */
+ // Not all languages have V_x <-> N_x relation
+ foreach ( $this->mRestrictions as $action => $selected ) {
+ // Messages:
+ // restriction-edit, restriction-move, restriction-create, restriction-upload
$msg = wfMessage( 'restriction-' . $action );
- $out .= "<tr><td>".
+ $out .= "<tr><td>" .
Xml::openElement( 'fieldset' ) .
Xml::element( 'legend', null, $msg->exists() ? $msg->text() : $action ) .
Xml::openElement( 'table', array( 'id' => "mw-protect-table-$action" ) ) .
@@ -384,7 +381,7 @@ class ProtectionForm {
'mwProtect-reason', 4 );
$scExpiryOptions = wfMessage( 'protect-expiry-options' )->inContentLanguage()->text();
- $showProtectOptions = ($scExpiryOptions !== '-' && !$this->disabled);
+ $showProtectOptions = $scExpiryOptions !== '-' && !$this->disabled;
$mProtectexpiry = Xml::label(
wfMessage( 'protectexpiry' )->text(),
@@ -412,7 +409,7 @@ class ProtectionForm {
wfMessage( 'protect-othertime-op' )->text(),
"othertime"
) . "\n";
- foreach( explode( ',', $scExpiryOptions ) as $option ) {
+ foreach ( explode( ',', $scExpiryOptions ) as $option ) {
if ( strpos( $option, ":" ) === false ) {
$show = $value = $option;
} else {
@@ -423,7 +420,7 @@ class ProtectionForm {
$expiryFormOptions .= Xml::option( $show, $value, $this->mExpirySelection[$action] === $value ) . "\n";
}
# Add expiry dropdown
- if( $showProtectOptions && !$this->disabled ) {
+ if ( $showProtectOptions && !$this->disabled ) {
$out .= "
<table><tr>
<td class='mw-label'>
@@ -463,7 +460,7 @@ class ProtectionForm {
$out .= Xml::closeElement( 'tbody' ) . Xml::closeElement( 'table' );
// JavaScript will add another row with a value-chaining checkbox
- if( $this->mTitle->exists() ) {
+ if ( $this->mTitle->exists() ) {
$out .= Xml::openElement( 'table', array( 'id' => 'mw-protect-table2' ) ) .
Xml::openElement( 'tbody' );
$out .= '<tr>
@@ -481,7 +478,7 @@ class ProtectionForm {
}
# Add manual and custom reason field/selects as well as submit
- if( !$this->disabled ) {
+ if ( !$this->disabled ) {
$out .= Xml::openElement( 'table', array( 'id' => 'mw-protect-table3' ) ) .
Xml::openElement( 'tbody' );
$out .= "
@@ -506,7 +503,7 @@ class ProtectionForm {
"</td>
</tr>";
# Disallow watching is user is not logged in
- if( $wgUser->isLoggedIn() ) {
+ if ( $wgUser->isLoggedIn() ) {
$out .= "
<tr>
<td></td>
@@ -562,15 +559,22 @@ class ProtectionForm {
global $wgRestrictionLevels, $wgUser;
$levels = array();
- foreach( $wgRestrictionLevels as $key ) {
+ foreach ( $wgRestrictionLevels as $key ) {
//don't let them choose levels above their own (aka so they can still unprotect and edit the page). but only when the form isn't disabled
- if( $key == 'sysop' ) {
- //special case, rewrite sysop to protect and editprotected
- if( !$wgUser->isAllowedAny( 'protect', 'editprotected' ) && !$this->disabled )
+ if ( $key == 'sysop' ) {
+ //special case, rewrite sysop to editprotected
+ if ( !$wgUser->isAllowed( 'editprotected' ) && !$this->disabled ) {
+ continue;
+ }
+ } elseif ( $key == 'autoconfirmed' ) {
+ //special case, rewrite autoconfirmed to editsemiprotected
+ if ( !$wgUser->isAllowed( 'editsemiprotected' ) && !$this->disabled ) {
continue;
+ }
} else {
- if( !$wgUser->isAllowed( $key ) && !$this->disabled )
+ if ( !$wgUser->isAllowed( $key ) && !$this->disabled ) {
continue;
+ }
}
$levels[] = $key;
}
@@ -584,7 +588,7 @@ class ProtectionForm {
) + $this->disabledAttrib;
$out = Xml::openElement( 'select', $attribs );
- foreach( $levels as $key ) {
+ foreach ( $levels as $key ) {
$out .= Xml::option( $this->getOptionLabel( $key ), $key, $key == $selected );
}
$out .= Xml::closeElement( 'select' );
@@ -598,11 +602,12 @@ class ProtectionForm {
* @return String
*/
private function getOptionLabel( $permission ) {
- if( $permission == '' ) {
+ if ( $permission == '' ) {
return wfMessage( 'protect-default' )->text();
} else {
+ // Messages: protect-level-autoconfirmed, protect-level-sysop
$msg = wfMessage( "protect-level-{$permission}" );
- if( $msg->exists() ) {
+ if ( $msg->exists() ) {
return $msg->text();
}
return wfMessage( 'protect-fallback', $permission )->text();
@@ -610,16 +615,9 @@ class ProtectionForm {
}
function buildCleanupScript() {
- global $wgRestrictionLevels, $wgOut;
-
- $cascadeableLevels = array();
- foreach( $wgRestrictionLevels as $key ) {
- if ( User::groupHasPermission( $key, 'protect' )
- || $key == 'protect'
- ) {
- $cascadeableLevels[] = $key;
- }
- }
+ global $wgCascadingRestrictionLevels, $wgOut;
+
+ $cascadeableLevels = $wgCascadingRestrictionLevels;
$options = array(
'tableId' => 'mwProtectSet',
'labelText' => wfMessage( 'protect-unchain-permissions' )->plain(),
diff --git a/includes/ProxyTools.php b/includes/ProxyTools.php
index b54a9a35..bf1c4059 100644
--- a/includes/ProxyTools.php
+++ b/includes/ProxyTools.php
@@ -84,43 +84,3 @@ function wfIsConfiguredProxy( $ip ) {
in_array( $ip, $wgSquidServersNoPurge );
return $trusted;
}
-
-/**
- * Forks processes to scan the originating IP for an open proxy server
- * MemCached can be used to skip IPs that have already been scanned
- */
-function wfProxyCheck() {
- global $wgBlockOpenProxies, $wgProxyPorts, $wgProxyScriptPath;
- global $wgMemc, $wgProxyMemcExpiry, $wgRequest;
- global $wgProxyKey;
-
- if ( !$wgBlockOpenProxies ) {
- return;
- }
-
- $ip = $wgRequest->getIP();
-
- # Get MemCached key
- $mcKey = wfMemcKey( 'proxy', 'ip', $ip );
- $mcValue = $wgMemc->get( $mcKey );
- $skip = (bool)$mcValue;
-
- # Fork the processes
- if ( !$skip ) {
- $title = SpecialPage::getTitleFor( 'Blockme' );
- $iphash = md5( $ip . $wgProxyKey );
- $url = wfExpandUrl( $title->getFullURL( 'ip=' . $iphash ), PROTO_HTTP );
-
- foreach ( $wgProxyPorts as $port ) {
- $params = implode( ' ', array(
- escapeshellarg( $wgProxyScriptPath ),
- escapeshellarg( $ip ),
- escapeshellarg( $port ),
- escapeshellarg( $url )
- ));
- exec( "php $params >" . wfGetNull() . " 2>&1 &" );
- }
- # Set MemCached key
- $wgMemc->set( $mcKey, 1, $wgProxyMemcExpiry );
- }
-}
diff --git a/includes/QueryPage.php b/includes/QueryPage.php
index e1f24fa9..51b5706f 100644
--- a/includes/QueryPage.php
+++ b/includes/QueryPage.php
@@ -35,7 +35,6 @@ $wgQueryPages = array(
array( 'AncientPagesPage', 'Ancientpages' ),
array( 'BrokenRedirectsPage', 'BrokenRedirects' ),
array( 'DeadendPagesPage', 'Deadendpages' ),
- array( 'DisambiguationsPage', 'Disambiguations' ),
array( 'DoubleRedirectsPage', 'DoubleRedirects' ),
array( 'FileDuplicateSearchPage', 'FileDuplicateSearch' ),
array( 'LinkSearchPage', 'LinkSearch' ),
@@ -69,8 +68,9 @@ $wgQueryPages = array(
wfRunHooks( 'wgQueryPages', array( &$wgQueryPages ) );
global $wgDisableCounters;
-if ( !$wgDisableCounters )
+if ( !$wgDisableCounters ) {
$wgQueryPages[] = array( 'PopularPagesPage', 'Popularpages' );
+}
/**
* This is a class for doing query pages; since they're almost all the same,
@@ -89,7 +89,7 @@ abstract class QueryPage extends SpecialPage {
/**
* The offset and limit in use, as passed to the query() function
*
- * @var integer
+ * @var int
*/
var $offset = 0;
var $limit = 0;
@@ -111,7 +111,7 @@ abstract class QueryPage extends SpecialPage {
/**
* A mutator for $this->listoutput;
*
- * @param $bool Boolean
+ * @param bool $bool
*/
function setListoutput( $bool ) {
$this->listoutput = $bool;
@@ -186,7 +186,7 @@ abstract class QueryPage extends SpecialPage {
/**
* Override to sort by increasing values
*
- * @return Boolean
+ * @return bool
*/
function sortDescending() {
return true;
@@ -197,7 +197,7 @@ abstract class QueryPage extends SpecialPage {
* don't let it run in miser mode. $wgDisableQueryPages causes all query
* pages to be declared expensive. Some query pages are always expensive.
*
- * @return Boolean
+ * @return bool
*/
function isExpensive() {
global $wgDisableQueryPages;
@@ -208,7 +208,7 @@ abstract class QueryPage extends SpecialPage {
* Is the output of this query cacheable? Non-cacheable expensive pages
* will be disabled in miser mode and will not have their results written
* to the querycache table.
- * @return Boolean
+ * @return bool
* @since 1.18
*/
public function isCacheable() {
@@ -219,7 +219,7 @@ abstract class QueryPage extends SpecialPage {
* Whether or not the output of the page in question is retrieved from
* the database cache.
*
- * @return Boolean
+ * @return bool
*/
function isCached() {
global $wgMiserMode;
@@ -230,7 +230,7 @@ abstract class QueryPage extends SpecialPage {
/**
* Sometime we don't want to build rss / atom feeds.
*
- * @return Boolean
+ * @return bool
*/
function isSyndicated() {
return true;
@@ -241,19 +241,16 @@ abstract class QueryPage extends SpecialPage {
* skin; you can use it for making links. The result is a single row of
* result data. You should be able to grab SQL results off of it.
* If the function returns false, the line output will be skipped.
- * @param $skin Skin
- * @param $result object Result row
- * @return mixed String or false to skip
- *
- * @param $skin Skin object
- * @param $result Object: database row
+ * @param Skin $skin
+ * @param object $result Result row
+ * @return string|bool String or false to skip
*/
abstract function formatResult( $skin, $result );
/**
* The content returned by this function will be output before any result
*
- * @return String
+ * @return string
*/
function getPageHeader() {
return '';
@@ -264,7 +261,7 @@ abstract class QueryPage extends SpecialPage {
* as an associative array. They will be encoded and added to the paging
* links (prev/next/lengths).
*
- * @return Array
+ * @return array
*/
function linkParameters() {
return array();
@@ -285,8 +282,9 @@ abstract class QueryPage extends SpecialPage {
/**
* Clear the cache and save new results
*
- * @param $limit Integer: limit for SQL statement
- * @param $ignoreErrors Boolean: whether to ignore database errors
+ * @param int|bool $limit Limit for SQL statement
+ * @param bool $ignoreErrors Whether to ignore database errors
+ * @throws DBError|Exception
* @return bool|int
*/
function recache( $limit, $ignoreErrors = true ) {
@@ -351,8 +349,8 @@ abstract class QueryPage extends SpecialPage {
/**
* Run the query and return the result
- * @param $limit mixed Numerical limit or false for no limit
- * @param $offset mixed Numerical offset or false for no offset
+ * @param int|bool $limit Numerical limit or false for no limit
+ * @param int|bool $offset Numerical offset or false for no offset
* @return ResultWrapper
* @since 1.18
*/
@@ -361,23 +359,28 @@ abstract class QueryPage extends SpecialPage {
$dbr = wfGetDB( DB_SLAVE );
$query = $this->getQueryInfo();
$order = $this->getOrderFields();
+
if ( $this->sortDescending() ) {
foreach ( $order as &$field ) {
$field .= ' DESC';
}
}
+
if ( is_array( $query ) ) {
$tables = isset( $query['tables'] ) ? (array)$query['tables'] : array();
$fields = isset( $query['fields'] ) ? (array)$query['fields'] : array();
$conds = isset( $query['conds'] ) ? (array)$query['conds'] : array();
$options = isset( $query['options'] ) ? (array)$query['options'] : array();
$join_conds = isset( $query['join_conds'] ) ? (array)$query['join_conds'] : array();
+
if ( count( $order ) ) {
$options['ORDER BY'] = $order;
}
+
if ( $limit !== false ) {
$options['LIMIT'] = intval( $limit );
}
+
if ( $offset !== false ) {
$options['OFFSET'] = intval( $offset );
}
@@ -392,11 +395,14 @@ abstract class QueryPage extends SpecialPage {
$sql = $dbr->limitResult( $sql, $limit, $offset );
$res = $dbr->query( $sql, $fname );
}
+
return $dbr->resultObject( $res );
}
/**
* Somewhat deprecated, you probably want to be using execute()
+ * @param int|bool $offset
+ * @oaram int|bool $limit
* @return ResultWrapper
*/
function doQuery( $offset = false, $limit = false ) {
@@ -409,14 +415,14 @@ abstract class QueryPage extends SpecialPage {
/**
* Fetch the query results from the query cache
- * @param $limit mixed Numerical limit or false for no limit
- * @param $offset mixed Numerical offset or false for no offset
+ * @param int|bool $limit Numerical limit or false for no limit
+ * @param int|bool $offset Numerical offset or false for no offset
* @return ResultWrapper
* @since 1.18
*/
function fetchFromCache( $limit, $offset = false ) {
$dbr = wfGetDB( DB_SLAVE );
- $options = array ();
+ $options = array();
if ( $limit !== false ) {
$options['LIMIT'] = intval( $limit );
}
@@ -451,6 +457,7 @@ abstract class QueryPage extends SpecialPage {
/**
* This is the actual workhorse. It does everything needed to make a
* real, honest-to-gosh query page.
+ * @para $par
* @return int
*/
function execute( $par ) {
@@ -562,12 +569,12 @@ abstract class QueryPage extends SpecialPage {
* Format and output report results using the given information plus
* OutputPage
*
- * @param $out OutputPage to print to
- * @param $skin Skin: user skin to use
- * @param $dbr Database (read) connection to use
- * @param $res Integer: result pointer
- * @param $num Integer: number of available result rows
- * @param $offset Integer: paging offset
+ * @param OutputPage $out OutputPage to print to
+ * @param Skin $skin User skin to use
+ * @param DatabaseBase $dbr Database (read) connection to use
+ * @param int $res Result pointer
+ * @param int $num Number of available result rows
+ * @param int $offset Paging offset
*/
protected function outputResults( $out, $skin, $dbr, $res, $num, $offset ) {
global $wgContLang;
@@ -580,7 +587,7 @@ abstract class QueryPage extends SpecialPage {
# $res might contain the whole 1,000 rows, so we read up to
# $num [should update this to use a Pager]
- for ( $i = 0; $i < $num && $row = $dbr->fetchObject( $res ); $i++ ) {
+ for ( $i = 0; $i < $num && $row = $res->fetchObject(); $i++ ) {
$line = $this->formatResult( $skin, $row );
if ( $line ) {
$attr = ( isset( $row->usepatrol ) && $row->usepatrol && $row->patrolled == 0 )
@@ -635,25 +642,26 @@ abstract class QueryPage extends SpecialPage {
/**
* Do any necessary preprocessing of the result object.
+ * @param DatabaseBase $db
+ * @param ResultWrapper $res
*/
function preprocessResults( $db, $res ) {}
/**
* Similar to above, but packaging in a syndicated feed instead of a web page
+ * @param string $class
+ * @param int $limit
* @return bool
*/
function doFeed( $class = '', $limit = 50 ) {
- global $wgFeed, $wgFeedClasses;
+ global $wgFeed, $wgFeedClasses, $wgFeedLimit;
if ( !$wgFeed ) {
$this->getOutput()->addWikiMsg( 'feed-unavailable' );
return false;
}
- global $wgFeedLimit;
- if ( $limit > $wgFeedLimit ) {
- $limit = $wgFeedLimit;
- }
+ $limit = min( $limit, $wgFeedLimit );
if ( isset( $wgFeedClasses[$class] ) ) {
$feed = new $wgFeedClasses[$class](
@@ -680,6 +688,7 @@ abstract class QueryPage extends SpecialPage {
/**
* Override for custom handling. If the titles/links are ok, just do
* feedItemDesc()
+ * @param object $row
* @return FeedItem|null
*/
function feedResult( $row ) {
@@ -735,7 +744,6 @@ abstract class QueryPage extends SpecialPage {
* WantedPages, WantedTemplates, etc
*/
abstract class WantedQueryPage extends QueryPage {
-
function isExpensive() {
return true;
}
@@ -746,6 +754,8 @@ abstract class WantedQueryPage extends QueryPage {
/**
* Cache page existence for performance
+ * @param DatabaseBase $db
+ * @param ResultWrapper $res
*/
function preprocessResults( $db, $res ) {
if ( !$res->numRows() ) {
@@ -777,8 +787,8 @@ abstract class WantedQueryPage extends QueryPage {
/**
* Format an individual result
*
- * @param $skin Skin to use for UI elements
- * @param $result Result row
+ * @param Skin $skin Skin to use for UI elements
+ * @param object $result Result row
* @return string
*/
public function formatResult( $skin, $result ) {
@@ -812,8 +822,8 @@ abstract class WantedQueryPage extends QueryPage {
/**
* Make a "what links here" link for a given title
*
- * @param $title Title to make the link for
- * @param $result Object: result row
+ * @param Title $title Title to make the link for
+ * @param object $result Result row
* @return string
*/
private function makeWlhLink( $title, $result ) {
diff --git a/includes/Revision.php b/includes/Revision.php
index 2b34984b..233eac01 100644
--- a/includes/Revision.php
+++ b/includes/Revision.php
@@ -61,6 +61,11 @@ class Revision implements IDBAccessObject {
*/
protected $mContentHandler;
+ /**
+ * @var int
+ */
+ protected $mQueryFlags = 0;
+
// Revision deletion constants
const DELETED_TEXT = 1;
const DELETED_COMMENT = 2;
@@ -106,16 +111,18 @@ class Revision implements IDBAccessObject {
public static function newFromTitle( $title, $id = 0, $flags = 0 ) {
$conds = array(
'page_namespace' => $title->getNamespace(),
- 'page_title' => $title->getDBkey()
+ 'page_title' => $title->getDBkey()
);
if ( $id ) {
// Use the specified ID
$conds['rev_id'] = $id;
+ return self::newFromConds( $conds, (int)$flags );
} else {
// Use a join to get the latest revision
$conds[] = 'rev_id=page_latest';
+ $db = wfGetDB( ( $flags & self::READ_LATEST ) ? DB_MASTER : DB_SLAVE );
+ return self::loadFromConds( $db, $conds, $flags );
}
- return self::newFromConds( $conds, (int)$flags );
}
/**
@@ -228,8 +235,8 @@ class Revision implements IDBAccessObject {
* @return Revision or null
*/
public static function loadFromPageId( $db, $pageid, $id = 0 ) {
- $conds = array( 'rev_page' => intval( $pageid ), 'page_id' => intval( $pageid ) );
- if( $id ) {
+ $conds = array( 'rev_page' => intval( $pageid ), 'page_id' => intval( $pageid ) );
+ if ( $id ) {
$conds['rev_id'] = intval( $id );
} else {
$conds[] = 'rev_id=page_latest';
@@ -248,7 +255,7 @@ class Revision implements IDBAccessObject {
* @return Revision or null
*/
public static function loadFromTitle( $db, $title, $id = 0 ) {
- if( $id ) {
+ if ( $id ) {
$matchId = intval( $id );
} else {
$matchId = 'page_latest';
@@ -257,7 +264,7 @@ class Revision implements IDBAccessObject {
array(
"rev_id=$matchId",
'page_namespace' => $title->getNamespace(),
- 'page_title' => $title->getDBkey()
+ 'page_title' => $title->getDBkey()
)
);
}
@@ -275,9 +282,9 @@ class Revision implements IDBAccessObject {
public static function loadFromTimestamp( $db, $title, $timestamp ) {
return self::loadFromConds( $db,
array(
- 'rev_timestamp' => $db->timestamp( $timestamp ),
+ 'rev_timestamp' => $db->timestamp( $timestamp ),
'page_namespace' => $title->getNamespace(),
- 'page_title' => $title->getDBkey()
+ 'page_title' => $title->getDBkey()
)
);
}
@@ -298,6 +305,9 @@ class Revision implements IDBAccessObject {
$rev = self::loadFromConds( $dbw, $conditions, $flags );
}
}
+ if ( $rev ) {
+ $rev->mQueryFlags = $flags;
+ }
return $rev;
}
@@ -312,9 +322,9 @@ class Revision implements IDBAccessObject {
*/
private static function loadFromConds( $db, $conditions, $flags = 0 ) {
$res = self::fetchFromConds( $db, $conditions, $flags );
- if( $res ) {
+ if ( $res ) {
$row = $res->fetchObject();
- if( $row ) {
+ if ( $row ) {
$ret = new Revision( $row );
return $ret;
}
@@ -337,7 +347,7 @@ class Revision implements IDBAccessObject {
array(
'rev_id=page_latest',
'page_namespace' => $title->getNamespace(),
- 'page_title' => $title->getDBkey()
+ 'page_title' => $title->getDBkey()
)
);
}
@@ -489,7 +499,7 @@ class Revision implements IDBAccessObject {
* @access private
*/
function __construct( $row ) {
- if( is_object( $row ) ) {
+ if ( is_object( $row ) ) {
$this->mId = intval( $row->rev_id );
$this->mPage = intval( $row->rev_page );
$this->mTextId = intval( $row->rev_text_id );
@@ -517,7 +527,7 @@ class Revision implements IDBAccessObject {
$this->mSha1 = $row->rev_sha1;
}
- if( isset( $row->page_latest ) ) {
+ if ( isset( $row->page_latest ) ) {
$this->mCurrent = ( $row->rev_id == $row->page_latest );
$this->mTitle = Title::newFromRow( $row );
} else {
@@ -525,13 +535,13 @@ class Revision implements IDBAccessObject {
$this->mTitle = null;
}
- if( !isset( $row->rev_content_model ) || is_null( $row->rev_content_model ) ) {
+ if ( !isset( $row->rev_content_model ) || is_null( $row->rev_content_model ) ) {
$this->mContentModel = null; # determine on demand if needed
} else {
$this->mContentModel = strval( $row->rev_content_model );
}
- if( !isset( $row->rev_content_format ) || is_null( $row->rev_content_format ) ) {
+ if ( !isset( $row->rev_content_format ) || is_null( $row->rev_content_format ) ) {
$this->mContentFormat = null; # determine on demand if needed
} else {
$this->mContentFormat = strval( $row->rev_content_format );
@@ -539,7 +549,7 @@ class Revision implements IDBAccessObject {
// Lazy extraction...
$this->mText = null;
- if( isset( $row->old_text ) ) {
+ if ( isset( $row->old_text ) ) {
$this->mTextRow = $row;
} else {
// 'text' table row entry will be lazy-loaded
@@ -554,13 +564,13 @@ class Revision implements IDBAccessObject {
$this->mUserText = $row->user_name; // logged-in user
}
$this->mOrigUserText = $row->rev_user_text;
- } elseif( is_array( $row ) ) {
+ } elseif ( is_array( $row ) ) {
// Build a new revision to be saved...
global $wgUser; // ugh
# if we have a content object, use it to set the model and type
if ( !empty( $row['content'] ) ) {
- //@todo: when is that set? test with external store setup! check out insertOn() [dk]
+ // @todo when is that set? test with external store setup! check out insertOn() [dk]
if ( !empty( $row['text_id'] ) ) {
throw new MWException( "Text already stored in external store (id {$row['text_id']}), " .
"can't serialize content object" );
@@ -714,10 +724,10 @@ class Revision implements IDBAccessObject {
* @return Title|null
*/
public function getTitle() {
- if( isset( $this->mTitle ) ) {
+ if ( isset( $this->mTitle ) ) {
return $this->mTitle;
}
- if( !is_null( $this->mId ) ) { //rev_id is defined as NOT NULL, but this revision may not yet have been inserted.
+ if ( !is_null( $this->mId ) ) { //rev_id is defined as NOT NULL, but this revision may not yet have been inserted.
$dbr = wfGetDB( DB_SLAVE );
$row = $dbr->selectRow(
array( 'page', 'revision' ),
@@ -769,9 +779,9 @@ class Revision implements IDBAccessObject {
* @return Integer
*/
public function getUser( $audience = self::FOR_PUBLIC, User $user = null ) {
- if( $audience == self::FOR_PUBLIC && $this->isDeleted( self::DELETED_USER ) ) {
+ if ( $audience == self::FOR_PUBLIC && $this->isDeleted( self::DELETED_USER ) ) {
return 0;
- } elseif( $audience == self::FOR_THIS_USER && !$this->userCan( self::DELETED_USER, $user ) ) {
+ } elseif ( $audience == self::FOR_THIS_USER && !$this->userCan( self::DELETED_USER, $user ) ) {
return 0;
} else {
return $this->mUser;
@@ -801,9 +811,9 @@ class Revision implements IDBAccessObject {
* @return string
*/
public function getUserText( $audience = self::FOR_PUBLIC, User $user = null ) {
- if( $audience == self::FOR_PUBLIC && $this->isDeleted( self::DELETED_USER ) ) {
+ if ( $audience == self::FOR_PUBLIC && $this->isDeleted( self::DELETED_USER ) ) {
return '';
- } elseif( $audience == self::FOR_THIS_USER && !$this->userCan( self::DELETED_USER, $user ) ) {
+ } elseif ( $audience == self::FOR_THIS_USER && !$this->userCan( self::DELETED_USER, $user ) ) {
return '';
} else {
return $this->getRawUserText();
@@ -841,9 +851,9 @@ class Revision implements IDBAccessObject {
* @return String
*/
function getComment( $audience = self::FOR_PUBLIC, User $user = null ) {
- if( $audience == self::FOR_PUBLIC && $this->isDeleted( self::DELETED_COMMENT ) ) {
+ if ( $audience == self::FOR_PUBLIC && $this->isDeleted( self::DELETED_COMMENT ) ) {
return '';
- } elseif( $audience == self::FOR_THIS_USER && !$this->userCan( self::DELETED_COMMENT, $user ) ) {
+ } elseif ( $audience == self::FOR_THIS_USER && !$this->userCan( self::DELETED_COMMENT, $user ) ) {
return '';
} else {
return $this->mComment;
@@ -867,24 +877,37 @@ class Revision implements IDBAccessObject {
}
/**
- * @return Integer rcid of the unpatrolled row, zero if there isn't one
+ * @return integer rcid of the unpatrolled row, zero if there isn't one
*/
public function isUnpatrolled() {
- if( $this->mUnpatrolled !== null ) {
+ if ( $this->mUnpatrolled !== null ) {
return $this->mUnpatrolled;
}
+ $rc = $this->getRecentChange();
+ if ( $rc && $rc->getAttribute( 'rc_patrolled' ) == 0 ) {
+ $this->mUnpatrolled = $rc->getAttribute( 'rc_id' );
+ } else {
+ $this->mUnpatrolled = 0;
+ }
+ return $this->mUnpatrolled;
+ }
+
+ /**
+ * Get the RC object belonging to the current revision, if there's one
+ *
+ * @since 1.22
+ * @return RecentChange|null
+ */
+ public function getRecentChange() {
$dbr = wfGetDB( DB_SLAVE );
- $this->mUnpatrolled = $dbr->selectField( 'recentchanges',
- 'rc_id',
- array( // Add redundant user,timestamp condition so we can use the existing index
- 'rc_user_text' => $this->getRawUserText(),
- 'rc_timestamp' => $dbr->timestamp( $this->getTimestamp() ),
- 'rc_this_oldid' => $this->getId(),
- 'rc_patrolled' => 0
+ return RecentChange::newFromConds(
+ array(
+ 'rc_user_text' => $this->getRawUserText(),
+ 'rc_timestamp' => $dbr->timestamp( $this->getTimestamp() ),
+ 'rc_this_oldid' => $this->getId()
),
__METHOD__
);
- return (int)$this->mUnpatrolled;
}
/**
@@ -918,7 +941,7 @@ class Revision implements IDBAccessObject {
* to the $audience parameter
*
* @deprecated in 1.21, use getContent() instead
- * @todo: replace usage in core
+ * @todo Replace usage in core
* @return String
*/
public function getText( $audience = self::FOR_PUBLIC, User $user = null ) {
@@ -943,9 +966,9 @@ class Revision implements IDBAccessObject {
* @return Content|null
*/
public function getContent( $audience = self::FOR_PUBLIC, User $user = null ) {
- if( $audience == self::FOR_PUBLIC && $this->isDeleted( self::DELETED_TEXT ) ) {
+ if ( $audience == self::FOR_PUBLIC && $this->isDeleted( self::DELETED_TEXT ) ) {
return null;
- } elseif( $audience == self::FOR_THIS_USER && !$this->userCan( self::DELETED_TEXT, $user ) ) {
+ } elseif ( $audience == self::FOR_THIS_USER && !$this->userCan( self::DELETED_TEXT, $user ) ) {
return null;
} else {
return $this->getContentInternal();
@@ -983,6 +1006,10 @@ class Revision implements IDBAccessObject {
* @return String
*/
public function getSerializedData() {
+ if ( is_null( $this->mText ) ) {
+ $this->mText = $this->loadText();
+ }
+
return $this->mText;
}
@@ -996,9 +1023,9 @@ class Revision implements IDBAccessObject {
* @return Content|null the Revision's content, or null on failure.
*/
protected function getContentInternal() {
- if( is_null( $this->mContent ) ) {
+ if ( is_null( $this->mContent ) ) {
// Revision is immutable. Load on demand:
- if( is_null( $this->mText ) ) {
+ if ( is_null( $this->mText ) ) {
$this->mText = $this->loadText();
}
@@ -1097,9 +1124,9 @@ class Revision implements IDBAccessObject {
* @return Revision|null
*/
public function getPrevious() {
- if( $this->getTitle() ) {
+ if ( $this->getTitle() ) {
$prev = $this->getTitle()->getPreviousRevisionID( $this->getId() );
- if( $prev ) {
+ if ( $prev ) {
return self::newFromTitle( $this->getTitle(), $prev );
}
}
@@ -1112,7 +1139,7 @@ class Revision implements IDBAccessObject {
* @return Revision or null
*/
public function getNext() {
- if( $this->getTitle() ) {
+ if ( $this->getTitle() ) {
$next = $this->getTitle()->getNextRevisionID( $this->getId() );
if ( $next ) {
return self::newFromTitle( $this->getTitle(), $next );
@@ -1129,11 +1156,11 @@ class Revision implements IDBAccessObject {
* @return Integer
*/
private function getPreviousRevisionId( $db ) {
- if( is_null( $this->mPage ) ) {
+ if ( is_null( $this->mPage ) ) {
return 0;
}
# Use page_latest if ID is not given
- if( !$this->mId ) {
+ if ( !$this->mId ) {
$prevId = $db->selectField( 'page', 'page_latest',
array( 'page_id' => $this->mPage ),
__METHOD__ );
@@ -1166,13 +1193,13 @@ class Revision implements IDBAccessObject {
$textField = $prefix . 'text';
$flagsField = $prefix . 'flags';
- if( isset( $row->$flagsField ) ) {
+ if ( isset( $row->$flagsField ) ) {
$flags = explode( ',', $row->$flagsField );
} else {
$flags = array();
}
- if( isset( $row->$textField ) ) {
+ if ( isset( $row->$textField ) ) {
$text = $row->$textField;
} else {
wfProfileOut( __METHOD__ );
@@ -1183,7 +1210,7 @@ class Revision implements IDBAccessObject {
if ( in_array( 'external', $flags ) ) {
$url = $text;
$parts = explode( '://', $url, 2 );
- if( count( $parts ) == 1 || $parts[1] == '' ) {
+ if ( count( $parts ) == 1 || $parts[1] == '' ) {
wfProfileOut( __METHOD__ );
return false;
}
@@ -1192,35 +1219,7 @@ class Revision implements IDBAccessObject {
// If the text was fetched without an error, convert it
if ( $text !== false ) {
- if( in_array( 'gzip', $flags ) ) {
- # Deal with optional compression of archived pages.
- # This can be done periodically via maintenance/compressOld.php, and
- # as pages are saved if $wgCompressRevisions is set.
- $text = gzinflate( $text );
- }
-
- if( in_array( 'object', $flags ) ) {
- # Generic compressed storage
- $obj = unserialize( $text );
- if ( !is_object( $obj ) ) {
- // Invalid object
- wfProfileOut( __METHOD__ );
- return false;
- }
- $text = $obj->getText();
- }
-
- global $wgLegacyEncoding;
- if( $text !== false && $wgLegacyEncoding
- && !in_array( 'utf-8', $flags ) && !in_array( 'utf8', $flags ) )
- {
- # Old revisions kept around in a legacy encoding?
- # Upconvert on demand.
- # ("utf8" checked for compatibility with some broken
- # conversion scripts 2008-12-30)
- global $wgContLang;
- $text = $wgContLang->iconv( $wgLegacyEncoding, 'UTF-8', $text );
- }
+ $text = self::decompressRevisionText( $text, $flags );
}
wfProfileOut( __METHOD__ );
return $text;
@@ -1244,8 +1243,8 @@ class Revision implements IDBAccessObject {
# on load if $wgLegacyCharset is set in the future.
$flags[] = 'utf-8';
- if( $wgCompressRevisions ) {
- if( function_exists( 'gzdeflate' ) ) {
+ if ( $wgCompressRevisions ) {
+ if ( function_exists( 'gzdeflate' ) ) {
$text = gzdeflate( $text );
$flags[] = 'gzip';
} else {
@@ -1256,6 +1255,46 @@ class Revision implements IDBAccessObject {
}
/**
+ * Re-converts revision text according to it's flags.
+ *
+ * @param $text Mixed: reference to a text
+ * @param $flags array: compression flags
+ * @return String|bool decompressed text, or false on failure
+ */
+ public static function decompressRevisionText( $text, $flags ) {
+ if ( in_array( 'gzip', $flags ) ) {
+ # Deal with optional compression of archived pages.
+ # This can be done periodically via maintenance/compressOld.php, and
+ # as pages are saved if $wgCompressRevisions is set.
+ $text = gzinflate( $text );
+ }
+
+ if ( in_array( 'object', $flags ) ) {
+ # Generic compressed storage
+ $obj = unserialize( $text );
+ if ( !is_object( $obj ) ) {
+ // Invalid object
+ return false;
+ }
+ $text = $obj->getText();
+ }
+
+ global $wgLegacyEncoding;
+ if ( $text !== false && $wgLegacyEncoding
+ && !in_array( 'utf-8', $flags ) && !in_array( 'utf8', $flags ) )
+ {
+ # Old revisions kept around in a legacy encoding?
+ # Upconvert on demand.
+ # ("utf8" checked for compatibility with some broken
+ # conversion scripts 2008-12-30)
+ global $wgContLang;
+ $text = $wgContLang->iconv( $wgLegacyEncoding, 'UTF-8', $text );
+ }
+
+ return $text;
+ }
+
+ /**
* Insert a new revision into the database, returning the new revision ID
* number on success and dies horribly on failure.
*
@@ -1274,32 +1313,35 @@ class Revision implements IDBAccessObject {
$flags = self::compressRevisionText( $data );
# Write to external storage if required
- if( $wgDefaultExternalStore ) {
+ if ( $wgDefaultExternalStore ) {
// Store and get the URL
$data = ExternalStore::insertToDefault( $data );
- if( !$data ) {
+ if ( !$data ) {
+ wfProfileOut( __METHOD__ );
throw new MWException( "Unable to store text to external storage" );
}
- if( $flags ) {
+ if ( $flags ) {
$flags .= ',';
}
$flags .= 'external';
}
# Record the text (or external storage URL) to the text table
- if( !isset( $this->mTextId ) ) {
+ if ( !isset( $this->mTextId ) ) {
$old_id = $dbw->nextSequenceValue( 'text_old_id_seq' );
$dbw->insert( 'text',
array(
- 'old_id' => $old_id,
- 'old_text' => $data,
+ 'old_id' => $old_id,
+ 'old_text' => $data,
'old_flags' => $flags,
), __METHOD__
);
$this->mTextId = $dbw->insertId();
}
- if ( $this->mComment === null ) $this->mComment = "";
+ if ( $this->mComment === null ) {
+ $this->mComment = "";
+ }
# Record the edit in revisions
$rev_id = isset( $this->mId )
@@ -1334,14 +1376,15 @@ class Revision implements IDBAccessObject {
$title = $this->getTitle();
if ( $title === null ) {
+ wfProfileOut( __METHOD__ );
throw new MWException( "Insufficient information to determine the title of the revision's page!" );
}
$defaultModel = ContentHandler::getDefaultModelFor( $title );
$defaultFormat = ContentHandler::getForModelID( $defaultModel )->getDefaultFormat();
- $row[ 'rev_content_model' ] = ( $model === $defaultModel ) ? null : $model;
- $row[ 'rev_content_format' ] = ( $format === $defaultFormat ) ? null : $format;
+ $row['rev_content_model'] = ( $model === $defaultModel ) ? null : $model;
+ $row['rev_content_format'] = ( $format === $defaultFormat ) ? null : $format;
}
$dbw->insert( 'revision', $row, __METHOD__ );
@@ -1422,9 +1465,9 @@ class Revision implements IDBAccessObject {
global $wgRevisionCacheExpiry, $wgMemc;
$textId = $this->getTextId();
$key = wfMemcKey( 'revisiontext', 'textid', $textId );
- if( $wgRevisionCacheExpiry ) {
+ if ( $wgRevisionCacheExpiry ) {
$text = $wgMemc->get( $key );
- if( is_string( $text ) ) {
+ if ( is_string( $text ) ) {
wfDebug( __METHOD__ . ": got id $textId from cache\n" );
wfProfileOut( __METHOD__ );
return $text;
@@ -1439,28 +1482,38 @@ class Revision implements IDBAccessObject {
$row = null;
}
- if( !$row ) {
+ if ( !$row ) {
// Text data is immutable; check slaves first.
$dbr = wfGetDB( DB_SLAVE );
$row = $dbr->selectRow( 'text',
array( 'old_text', 'old_flags' ),
- array( 'old_id' => $this->getTextId() ),
+ array( 'old_id' => $textId ),
__METHOD__ );
}
- if( !$row && wfGetLB()->getServerCount() > 1 ) {
- // Possible slave lag!
+ // Fallback to the master in case of slave lag. Also use FOR UPDATE if it was
+ // used to fetch this revision to avoid missing the row due to REPEATABLE-READ.
+ $forUpdate = ( $this->mQueryFlags & self::READ_LOCKING == self::READ_LOCKING );
+ if ( !$row && ( $forUpdate || wfGetLB()->getServerCount() > 1 ) ) {
$dbw = wfGetDB( DB_MASTER );
$row = $dbw->selectRow( 'text',
array( 'old_text', 'old_flags' ),
- array( 'old_id' => $this->getTextId() ),
- __METHOD__ );
+ array( 'old_id' => $textId ),
+ __METHOD__,
+ $forUpdate ? array( 'FOR UPDATE' ) : array() );
+ }
+
+ if ( !$row ) {
+ wfDebugLog( 'Revision', "No text row with ID '$textId' (revision {$this->getId()})." );
}
$text = self::getRevisionText( $row );
+ if ( $row && $text === false ) {
+ wfDebugLog( 'Revision', "No blob for text row '$textId' (revision {$this->getId()})." );
+ }
# No negative caching -- negative hits on text rows may be due to corrupted slave servers
- if( $wgRevisionCacheExpiry && $text !== false ) {
+ if ( $wgRevisionCacheExpiry && $text !== false ) {
$wgMemc->set( $key, $text, $wgRevisionCacheExpiry );
}
@@ -1505,7 +1558,7 @@ class Revision implements IDBAccessObject {
),
__METHOD__ );
- if( $current ) {
+ if ( $current ) {
$row = array(
'page' => $pageId,
'comment' => $summary,
@@ -1517,8 +1570,8 @@ class Revision implements IDBAccessObject {
);
if ( $wgContentHandlerUseDB ) {
- $row[ 'content_model' ] = $current->rev_content_model;
- $row[ 'content_format' ] = $current->rev_content_format;
+ $row['content_model'] = $current->rev_content_model;
+ $row['content_format'] = $current->rev_content_format;
}
$revision = new Revision( $row );
@@ -1558,7 +1611,7 @@ class Revision implements IDBAccessObject {
* @return Boolean
*/
public static function userCanBitfield( $bitfield, $field, User $user = null ) {
- if( $bitfield & $field ) { // aspect is deleted
+ if ( $bitfield & $field ) { // aspect is deleted
if ( $bitfield & self::DELETED_RESTRICTED ) {
$permission = 'suppressrevision';
} elseif ( $field & self::DELETED_TEXT ) {
@@ -1611,7 +1664,7 @@ class Revision implements IDBAccessObject {
static function countByPageId( $db, $id ) {
$row = $db->selectRow( 'revision', array( 'revCount' => 'COUNT(*)' ),
array( 'rev_page' => $id ), __METHOD__ );
- if( $row ) {
+ if ( $row ) {
return $row->revCount;
}
return 0;
@@ -1626,7 +1679,7 @@ class Revision implements IDBAccessObject {
*/
static function countByTitle( $db, $title ) {
$id = $title->getArticleID();
- if( $id ) {
+ if ( $id ) {
return self::countByPageId( $db, $id );
}
return 0;
@@ -1648,7 +1701,9 @@ class Revision implements IDBAccessObject {
* @return bool True if the given user was the only one to edit since the given timestamp
*/
public static function userWasLastToEdit( $db, $pageId, $userId, $since ) {
- if ( !$userId ) return false;
+ if ( !$userId ) {
+ return false;
+ }
if ( is_int( $db ) ) {
$db = wfGetDB( $db );
diff --git a/includes/RevisionList.php b/includes/RevisionList.php
index d87c540f..1b865bb0 100644
--- a/includes/RevisionList.php
+++ b/includes/RevisionList.php
@@ -105,7 +105,7 @@ abstract class RevisionListBase extends ContextSource {
* @return int
*/
public function length() {
- if( !$this->res ) {
+ if ( !$this->res ) {
return 0;
} else {
return $this->res->numRows();
@@ -352,8 +352,7 @@ class RevisionItem extends RevisionItemBase {
if ( $this->isDeleted() && !$this->canViewContent() ) {
return $this->context->msg( 'diff' )->escaped();
} else {
- return
- Linker::link(
+ return Linker::link(
$this->list->title,
$this->context->msg( 'diff' )->escaped(),
array(),
diff --git a/includes/Sanitizer.php b/includes/Sanitizer.php
index 849e4d66..499d8218 100644
--- a/includes/Sanitizer.php
+++ b/includes/Sanitizer.php
@@ -1,6 +1,6 @@
<?php
/**
- * XHTML sanitizer for %MediaWiki.
+ * HTML sanitizer for %MediaWiki.
*
* Copyright © 2002-2005 Brion Vibber <brion@pobox.com> et al
* http://www.mediawiki.org/
@@ -25,7 +25,7 @@
*/
/**
- * XHTML sanitizer for MediaWiki
+ * HTML sanitizer for MediaWiki
* @ingroup Parser
*/
class Sanitizer {
@@ -54,9 +54,8 @@ class Sanitizer {
* List of all named character entities defined in HTML 4.01
* http://www.w3.org/TR/html4/sgml/entities.html
* As well as &apos; which is only defined starting in XHTML1.
- * @private
*/
- static $htmlEntities = array(
+ private static $htmlEntities = array(
'Aacute' => 193,
'aacute' => 225,
'Acirc' => 194,
@@ -315,7 +314,7 @@ class Sanitizer {
/**
* Character entity aliases accepted by MediaWiki
*/
- static $htmlEntityAliases = array(
+ private static $htmlEntityAliases = array(
'רלמ' => 'rlm',
'رلم' => 'rlm',
);
@@ -323,7 +322,7 @@ class Sanitizer {
/**
* Lazy-initialised attributes regex, see getAttribsRegex()
*/
- static $attribsRegex;
+ private static $attribsRegex;
/**
* Regular expression to match HTML/XML attribute pairs within a tag.
@@ -357,14 +356,17 @@ class Sanitizer {
* removes HTML comments
* @private
* @param $text String
- * @param $processCallback Callback to do any variable or parameter replacements in HTML attribute values
+ * @param $processCallback Callback to do any variable or parameter
+ * replacements in HTML attribute values
* @param array $args for the processing callback
* @param array $extratags for any extra tags to include
* @param array $removetags for any tags (default or extra) to exclude
* @return string
*/
- static function removeHTMLtags( $text, $processCallback = null, $args = array(), $extratags = array(), $removetags = array() ) {
- global $wgUseTidy, $wgHtml5, $wgAllowMicrodataAttributes, $wgAllowImageTag;
+ static function removeHTMLtags( $text, $processCallback = null,
+ $args = array(), $extratags = array(), $removetags = array()
+ ) {
+ global $wgUseTidy, $wgAllowMicrodataAttributes, $wgAllowImageTag;
static $htmlpairsStatic, $htmlsingle, $htmlsingleonly, $htmlnest, $tabletags,
$htmllist, $listtags, $htmlsingleallowed, $htmlelementsStatic, $staticInitialised;
@@ -373,7 +375,7 @@ class Sanitizer {
// Base our staticInitialised variable off of the global config state so that if the globals
// are changed (like in the screwed up test system) we will re-initialise the settings.
- $globalContext = implode( '-', compact( 'wgHtml5', 'wgAllowMicrodataAttributes', 'wgAllowImageTag' ) );
+ $globalContext = implode( '-', compact( 'wgAllowMicrodataAttributes', 'wgAllowImageTag' ) );
if ( !$staticInitialised || $staticInitialised != $globalContext ) {
$htmlpairsStatic = array( # Tags that must be closed
@@ -382,30 +384,28 @@ class Sanitizer {
'strike', 'strong', 'tt', 'var', 'div', 'center',
'blockquote', 'ol', 'ul', 'dl', 'table', 'caption', 'pre',
'ruby', 'rt', 'rb', 'rp', 'p', 'span', 'abbr', 'dfn',
- 'kbd', 'samp'
+ 'kbd', 'samp', 'data', 'time', 'mark'
);
- if ( $wgHtml5 ) {
- $htmlpairsStatic = array_merge( $htmlpairsStatic, array( 'data', 'time', 'mark' ) );
- }
$htmlsingle = array(
- 'br', 'hr', 'li', 'dt', 'dd'
+ 'br', 'wbr', 'hr', 'li', 'dt', 'dd'
);
$htmlsingleonly = array( # Elements that cannot have close tags
- 'br', 'hr'
+ 'br', 'wbr', 'hr'
);
- if ( $wgHtml5 && $wgAllowMicrodataAttributes ) {
+ if ( $wgAllowMicrodataAttributes ) {
$htmlsingle[] = $htmlsingleonly[] = 'meta';
$htmlsingle[] = $htmlsingleonly[] = 'link';
}
$htmlnest = array( # Tags that can be nested--??
'table', 'tr', 'td', 'th', 'div', 'blockquote', 'ol', 'ul',
- 'li', 'dl', 'dt', 'dd', 'font', 'big', 'small', 'sub', 'sup', 'span'
+ 'li', 'dl', 'dt', 'dd', 'font', 'big', 'small', 'sub', 'sup', 'span',
+ 'var', 'kbd', 'samp', 'em', 'strong', 'q', 'ruby', 'bdo'
);
$tabletags = array( # Can only appear inside table, we will close them
'td', 'th', 'tr',
);
$htmllist = array( # Tags used by list
- 'ul','ol',
+ 'ul', 'ol',
);
$listtags = array( # Tags that can appear in a list
'li',
@@ -446,7 +446,7 @@ class Sanitizer {
# $params: String between element name and >
# $brace: Ending '>' or '/>'
# $rest: Everything until the next element of $bits
- if( preg_match( '!^(/?)(\\w+)([^>]*?)(/{0,1}>)([^<]*)$!', $x, $regs ) ) {
+ if ( preg_match( '!^(/?)([^\\s/>]+)([^>]*?)(/{0,1}>)([^<]*)$!', $x, $regs ) ) {
list( /* $qbar */, $slash, $t, $params, $brace, $rest ) = $regs;
} else {
$slash = $t = $params = $brace = $rest = null;
@@ -507,7 +507,7 @@ class Sanitizer {
!in_array( 'table', $tagstack ) ) {
$badtag = true;
} elseif ( in_array( $t, $tagstack ) &&
- !isset( $htmlnest [$t ] ) ) {
+ !isset( $htmlnest[$t] ) ) {
$badtag = true;
# Is it a self closed htmlpair ? (bug 5487)
} elseif ( $brace == '/>' &&
@@ -537,7 +537,7 @@ class Sanitizer {
# Replace any variables or template parameters with
# plaintext results.
- if( is_callable( $processCallback ) ) {
+ if ( is_callable( $processCallback ) ) {
call_user_func_array( $processCallback, array( &$params, $args ) );
}
@@ -555,12 +555,14 @@ class Sanitizer {
continue;
}
}
- $text .= '&lt;' . str_replace( '>', '&gt;', $x);
+ $text .= '&lt;' . str_replace( '>', '&gt;', $x );
}
# Close off any remaining tags
- while ( is_array( $tagstack ) && ($t = array_pop( $tagstack )) ) {
+ while ( is_array( $tagstack ) && ( $t = array_pop( $tagstack ) ) ) {
$text .= "</$t>\n";
- if ( $t == 'table' ) { $tagstack = array_pop( $tablestack ); }
+ if ( $t == 'table' ) {
+ $tagstack = array_pop( $tablestack );
+ }
}
} else {
# this might be possible using tidy itself
@@ -570,7 +572,7 @@ class Sanitizer {
@list( /* $qbar */, $slash, $t, $params, $brace, $rest ) = $regs;
$badtag = false;
if ( isset( $htmlelements[$t = strtolower( $t )] ) ) {
- if( is_callable( $processCallback ) ) {
+ if ( is_callable( $processCallback ) ) {
call_user_func_array( $processCallback, array( &$params, $args ) );
}
@@ -585,7 +587,7 @@ class Sanitizer {
continue;
}
}
- $text .= '&lt;' . str_replace( '>', '&gt;', $x);
+ $text .= '&lt;' . str_replace( '>', '&gt;', $x );
}
}
wfProfileOut( __METHOD__ );
@@ -604,7 +606,7 @@ class Sanitizer {
*/
static function removeHTMLcomments( $text ) {
wfProfileIn( __METHOD__ );
- while ( ($start = strpos( $text, '<!--' ) ) !== false ) {
+ while ( ( $start = strpos( $text, '<!--' ) ) !== false ) {
$end = strpos( $text, '-->', $start + 4 );
if ( $end === false ) {
# Unterminated comment; bail out
@@ -621,9 +623,11 @@ class Sanitizer {
$spaceStart--;
$spaceLen++;
}
- while ( substr( $text, $spaceStart + $spaceLen, 1 ) === ' ' )
+ while ( substr( $text, $spaceStart + $spaceLen, 1 ) === ' ' ) {
$spaceLen++;
- if ( substr( $text, $spaceStart, 1 ) === "\n" and substr( $text, $spaceStart + $spaceLen, 1 ) === "\n" ) {
+ }
+ if ( substr( $text, $spaceStart, 1 ) === "\n"
+ && substr( $text, $spaceStart + $spaceLen, 1 ) === "\n" ) {
# Remove the comment, leading and trailing
# spaces, and leave only one newline.
$text = substr_replace( $text, "\n", $spaceStart, $spaceLen + 1 );
@@ -706,13 +710,13 @@ class Sanitizer {
* @todo Check for unique id attribute :P
*/
static function validateAttributes( $attribs, $whitelist ) {
- global $wgAllowRdfaAttributes, $wgAllowMicrodataAttributes, $wgHtml5;
+ global $wgAllowRdfaAttributes, $wgAllowMicrodataAttributes;
$whitelist = array_flip( $whitelist );
$hrefExp = '/^(' . wfUrlProtocols() . ')[^\s]+$/';
$out = array();
- foreach( $attribs as $attribute => $value ) {
+ foreach ( $attribs as $attribute => $value ) {
#allow XML namespace declaration if RDFa is enabled
if ( $wgAllowRdfaAttributes && preg_match( self::XMLNS_ATTRIBUTE_PATTERN, $attribute ) ) {
if ( !preg_match( self::EVIL_URI_PATTERN, $value ) ) {
@@ -722,14 +726,14 @@ class Sanitizer {
continue;
}
- # Allow any attribute beginning with "data-", if in HTML5 mode
- if ( !($wgHtml5 && preg_match( '/^data-/i', $attribute )) && !isset( $whitelist[$attribute] ) ) {
+ # Allow any attribute beginning with "data-"
+ if ( !preg_match( '/^data-/i', $attribute ) && !isset( $whitelist[$attribute] ) ) {
continue;
}
# Strip javascript "expression" from stylesheets.
# http://msdn.microsoft.com/workshop/author/dhtml/overview/recalc.asp
- if( $attribute == 'style' ) {
+ if ( $attribute == 'style' ) {
$value = Sanitizer::checkCss( $value );
}
@@ -739,7 +743,7 @@ class Sanitizer {
# WAI-ARIA
# http://www.w3.org/TR/wai-aria/
- # http://www.whatwg.org/specs/web-apps/current-work/multipage/elements.html#wai-aria
+ # http://www.whatwg.org/html/elements.html#wai-aria
# For now we only support role="presentation" until we work out what roles should be
# usable by content and we ensure that our code explicitly rejects patterns that
# violate HTML5's ARIA restrictions.
@@ -747,13 +751,18 @@ class Sanitizer {
continue;
}
- //RDFa and microdata properties allow URLs, URIs and/or CURIs. check them for sanity
- if ( $attribute === 'rel' || $attribute === 'rev' ||
- $attribute === 'about' || $attribute === 'property' || $attribute === 'resource' || #RDFa
- $attribute === 'datatype' || $attribute === 'typeof' || #RDFa
- $attribute === 'itemid' || $attribute === 'itemprop' || $attribute === 'itemref' || #HTML5 microdata
- $attribute === 'itemscope' || $attribute === 'itemtype' ) { #HTML5 microdata
-
+ // RDFa and microdata properties allow URLs, URIs and/or CURIs.
+ // Check them for sanity.
+ if ( $attribute === 'rel' || $attribute === 'rev'
+ # RDFa
+ || $attribute === 'about' || $attribute === 'property'
+ || $attribute === 'resource' || $attribute === 'datatype'
+ || $attribute === 'typeof'
+ # HTML5 microdata
+ || $attribute === 'itemid' || $attribute === 'itemprop'
+ || $attribute === 'itemref' || $attribute === 'itemscope'
+ || $attribute === 'itemtype'
+ ) {
//Paranoia. Allow "simple" values but suppress javascript
if ( preg_match( self::EVIL_URI_PATTERN, $value ) ) {
continue;
@@ -765,7 +774,7 @@ class Sanitizer {
if ( $attribute === 'href' || $attribute === 'src' ) {
if ( !preg_match( $hrefExp, $value ) ) {
continue; //drop any href or src attributes not using an allowed protocol.
- //NOTE: this also drops all relative URLs
+ // NOTE: this also drops all relative URLs
}
}
@@ -798,9 +807,10 @@ class Sanitizer {
*/
static function mergeAttributes( $a, $b ) {
$out = array_merge( $a, $b );
- if( isset( $a['class'] ) && isset( $b['class'] )
- && is_string( $a['class'] ) && is_string( $b['class'] )
- && $a['class'] !== $b['class'] ) {
+ if ( isset( $a['class'] ) && isset( $b['class'] )
+ && is_string( $a['class'] ) && is_string( $b['class'] )
+ && $a['class'] !== $b['class']
+ ) {
$classes = preg_split( '/\s+/', "{$a['class']} {$b['class']}",
-1, PREG_SPLIT_NO_EMPTY );
$out['class'] = implode( ' ', array_unique( $classes ) );
@@ -811,9 +821,10 @@ class Sanitizer {
/**
* Pick apart some CSS and check it for forbidden or unsafe structures.
* Returns a sanitized string. This sanitized string will have
- * character references and escape sequences decoded, and comments
- * stripped. If the input is just too evil, only a comment complaining
- * about evilness will be returned.
+ * character references and escape sequences decoded and comments
+ * stripped (unless it is itself one valid comment, in which case the value
+ * will be passed through). If the input is just too evil, only a comment
+ * complaining about evilness will be returned.
*
* Currently URL references, 'expression', 'tps' are forbidden.
*
@@ -854,60 +865,28 @@ class Sanitizer {
$value = preg_replace_callback( $decodeRegex,
array( __CLASS__, 'cssDecodeCallback' ), $value );
- // Normalize Halfwidth and Fullwidth Unicode block that IE6 might treat as ascii
- $value = preg_replace_callback(
- '/[ï¼-z]/u', // U+FF01 to U+FF5A
- function ( $matches ) {
- $cp = utf8ToCodepoint( $matches[0] );
- if ( $cp === false ) {
- return '';
- }
- return chr( $cp - 65248 ); // ASCII range \x21-\x7A
- },
- $value
- );
-
- // Convert more characters IE6 might treat as ascii
- // U+0280, U+0274, U+207F, U+029F, U+026A, U+207D, U+208D
- $value = str_replace(
- array( 'Ê€', 'É´', 'â¿', 'ÊŸ', 'ɪ', 'â½', 'â‚' ),
- array( 'r', 'n', 'n', 'l', 'i', '(', '(' ),
- $value
- );
-
- // Remove any comments; IE gets token splitting wrong
- // This must be done AFTER decoding character references and
- // escape sequences, because those steps can introduce comments
- // This step cannot introduce character references or escape
- // sequences, because it replaces comments with spaces rather
- // than removing them completely.
- $value = StringUtils::delimiterReplace( '/*', '*/', ' ', $value );
-
- // Remove anything after a comment-start token, to guard against
- // incorrect client implementations.
- $commentPos = strpos( $value, '/*' );
- if ( $commentPos !== false ) {
- $value = substr( $value, 0, $commentPos );
+ // Let the value through if it's nothing but a single comment, to
+ // allow other functions which may reject it to pass some error
+ // message through.
+ if ( !preg_match( '! ^ \s* /\* [^*\\/]* \*/ \s* $ !x', $value ) ) {
+ // Remove any comments; IE gets token splitting wrong
+ // This must be done AFTER decoding character references and
+ // escape sequences, because those steps can introduce comments
+ // This step cannot introduce character references or escape
+ // sequences, because it replaces comments with spaces rather
+ // than removing them completely.
+ $value = StringUtils::delimiterReplace( '/*', '*/', ' ', $value );
+
+ // Remove anything after a comment-start token, to guard against
+ // incorrect client implementations.
+ $commentPos = strpos( $value, '/*' );
+ if ( $commentPos !== false ) {
+ $value = substr( $value, 0, $commentPos );
+ }
}
- // S followed by repeat, iteration, or prolonged sound marks,
- // which IE will treat as "ss"
- $value = preg_replace(
- '/s(?:
- \xE3\x80\xB1 | # U+3031
- \xE3\x82\x9D | # U+309D
- \xE3\x83\xBC | # U+30FC
- \xE3\x83\xBD | # U+30FD
- \xEF\xB9\xBC | # U+FE7C
- \xEF\xB9\xBD | # U+FE7D
- \xEF\xBD\xB0 # U+FF70
- )/ix',
- 'ss',
- $value
- );
-
// Reject problematic keywords and control characters
- if ( preg_match( '/[\000-\010\013\016-\037\177]/', $value ) ) {
+ if ( preg_match( '/[\000-\010\016-\037\177]/', $value ) ) {
return '/* invalid control char */';
} elseif ( preg_match( '! expression | filter\s*: | accelerator\s*: | url\s*\( | image\s*\( | image-set\s*\( !ix', $value ) ) {
return '/* insecure input */';
@@ -960,21 +939,14 @@ class Sanitizer {
* @return String
*/
static function fixTagAttributes( $text, $element ) {
- if( trim( $text ) == '' ) {
+ if ( trim( $text ) == '' ) {
return '';
}
$decoded = Sanitizer::decodeTagAttributes( $text );
$stripped = Sanitizer::validateTagAttributes( $decoded, $element );
- $attribs = array();
- foreach( $stripped as $attribute => $value ) {
- $encAttribute = htmlspecialchars( $attribute );
- $encValue = Sanitizer::safeEncodeAttribute( $value );
-
- $attribs[] = "$encAttribute=\"$encValue\"";
- }
- return count( $attribs ) ? ' ' . implode( ' ', $attribs ) : '';
+ return Sanitizer::safeEncodeTagAttributes( $stripped );
}
/**
@@ -1047,7 +1019,7 @@ class Sanitizer {
* in the id and
* name attributes
* @see http://www.w3.org/TR/html401/struct/links.html#h-12.2.3 Anchors with the id attribute
- * @see http://www.whatwg.org/specs/web-apps/current-work/multipage/elements.html#the-id-attribute
+ * @see http://www.whatwg.org/html/elements.html#the-id-attribute
* HTML5 definition of id attribute
*
* @param string $id id to escape
@@ -1062,10 +1034,10 @@ class Sanitizer {
* @return String
*/
static function escapeId( $id, $options = array() ) {
- global $wgHtml5, $wgExperimentalHtmlIds;
+ global $wgExperimentalHtmlIds;
$options = (array)$options;
- if ( $wgHtml5 && $wgExperimentalHtmlIds && !in_array( 'legacy', $options ) ) {
+ if ( $wgExperimentalHtmlIds && !in_array( 'legacy', $options ) ) {
$id = Sanitizer::decodeCharReferences( $id );
$id = preg_replace( '/[ \t\n\r\f_\'"&#%]+/', '_', $id );
$id = trim( $id, '_' );
@@ -1146,13 +1118,13 @@ class Sanitizer {
* @return Array
*/
public static function decodeTagAttributes( $text ) {
- if( trim( $text ) == '' ) {
+ if ( trim( $text ) == '' ) {
return array();
}
$attribs = array();
$pairs = array();
- if( !preg_match_all(
+ if ( !preg_match_all(
self::getAttribsRegex(),
$text,
$pairs,
@@ -1160,7 +1132,7 @@ class Sanitizer {
return $attribs;
}
- foreach( $pairs as $set ) {
+ foreach ( $pairs as $set ) {
$attribute = strtolower( $set[1] );
$value = Sanitizer::getTagAttributeCallback( $set );
@@ -1175,6 +1147,24 @@ class Sanitizer {
}
/**
+ * Build a partial tag string from an associative array of attribute
+ * names and values as returned by decodeTagAttributes.
+ *
+ * @param $assoc_array Array
+ * @return String
+ */
+ public static function safeEncodeTagAttributes( $assoc_array ) {
+ $attribs = array();
+ foreach ( $assoc_array as $attribute => $value ) {
+ $encAttribute = htmlspecialchars( $attribute );
+ $encValue = Sanitizer::safeEncodeAttribute( $value );
+
+ $attribs[] = "$encAttribute=\"$encValue\"";
+ }
+ return count( $attribs ) ? ' ' . implode( ' ', $attribs ) : '';
+ }
+
+ /**
* Pick the appropriate attribute value from a match set from the
* attribs regex matches.
*
@@ -1183,19 +1173,19 @@ class Sanitizer {
* @return String
*/
private static function getTagAttributeCallback( $set ) {
- if( isset( $set[6] ) ) {
+ if ( isset( $set[6] ) ) {
# Illegal #XXXXXX color with no quotes.
return $set[6];
- } elseif( isset( $set[5] ) ) {
+ } elseif ( isset( $set[5] ) ) {
# No quotes.
return $set[5];
- } elseif( isset( $set[4] ) ) {
+ } elseif ( isset( $set[4] ) ) {
# Single-quoted
return $set[4];
- } elseif( isset( $set[3] ) ) {
+ } elseif ( isset( $set[3] ) ) {
# Double-quoted
return $set[3];
- } elseif( !isset( $set[2] ) ) {
+ } elseif ( !isset( $set[2] ) ) {
# In XHTML, attributes must have a value.
# For 'reduced' form, return explicitly the attribute name here.
return $set[1];
@@ -1271,14 +1261,14 @@ class Sanitizer {
*/
static function normalizeCharReferencesCallback( $matches ) {
$ret = null;
- if( $matches[1] != '' ) {
+ if ( $matches[1] != '' ) {
$ret = Sanitizer::normalizeEntity( $matches[1] );
- } elseif( $matches[2] != '' ) {
+ } elseif ( $matches[2] != '' ) {
$ret = Sanitizer::decCharReference( $matches[2] );
- } elseif( $matches[3] != '' ) {
+ } elseif ( $matches[3] != '' ) {
$ret = Sanitizer::hexCharReference( $matches[3] );
}
- if( is_null( $ret ) ) {
+ if ( is_null( $ret ) ) {
return htmlspecialchars( $matches[0] );
} else {
return $ret;
@@ -1314,7 +1304,7 @@ class Sanitizer {
*/
static function decCharReference( $codepoint ) {
$point = intval( $codepoint );
- if( Sanitizer::validateCodepoint( $point ) ) {
+ if ( Sanitizer::validateCodepoint( $point ) ) {
return sprintf( '&#%d;', $point );
} else {
return null;
@@ -1327,7 +1317,7 @@ class Sanitizer {
*/
static function hexCharReference( $codepoint ) {
$point = hexdec( $codepoint );
- if( Sanitizer::validateCodepoint( $point ) ) {
+ if ( Sanitizer::validateCodepoint( $point ) ) {
return sprintf( '&#x%x;', $point );
} else {
return null;
@@ -1340,12 +1330,12 @@ class Sanitizer {
* @return Boolean
*/
private static function validateCodepoint( $codepoint ) {
- return ($codepoint == 0x09)
- || ($codepoint == 0x0a)
- || ($codepoint == 0x0d)
- || ($codepoint >= 0x20 && $codepoint <= 0xd7ff)
- || ($codepoint >= 0xe000 && $codepoint <= 0xfffd)
- || ($codepoint >= 0x10000 && $codepoint <= 0x10ffff);
+ return $codepoint == 0x09
+ || $codepoint == 0x0a
+ || $codepoint == 0x0d
+ || ( $codepoint >= 0x20 && $codepoint <= 0xd7ff )
+ || ( $codepoint >= 0xe000 && $codepoint <= 0xfffd )
+ || ( $codepoint >= 0x10000 && $codepoint <= 0x10ffff );
}
/**
@@ -1391,12 +1381,12 @@ class Sanitizer {
* @return String
*/
static function decodeCharReferencesCallback( $matches ) {
- if( $matches[1] != '' ) {
+ if ( $matches[1] != '' ) {
return Sanitizer::decodeEntity( $matches[1] );
- } elseif( $matches[2] != '' ) {
- return Sanitizer::decodeChar( intval( $matches[2] ) );
- } elseif( $matches[3] != '' ) {
- return Sanitizer::decodeChar( hexdec( $matches[3] ) );
+ } elseif ( $matches[2] != '' ) {
+ return Sanitizer::decodeChar( intval( $matches[2] ) );
+ } elseif ( $matches[3] != '' ) {
+ return Sanitizer::decodeChar( hexdec( $matches[3] ) );
}
# Last case should be an ampersand by itself
return $matches[0];
@@ -1410,7 +1400,7 @@ class Sanitizer {
* @private
*/
static function decodeChar( $codepoint ) {
- if( Sanitizer::validateCodepoint( $codepoint ) ) {
+ if ( Sanitizer::validateCodepoint( $codepoint ) ) {
return codepointToUtf8( $codepoint );
} else {
return UTF8_REPLACEMENT;
@@ -1429,7 +1419,7 @@ class Sanitizer {
if ( isset( self::$htmlEntityAliases[$name] ) ) {
$name = self::$htmlEntityAliases[$name];
}
- if( isset( self::$htmlEntities[$name] ) ) {
+ if ( isset( self::$htmlEntities[$name] ) ) {
return codepointToUtf8( self::$htmlEntities[$name] );
} else {
return "&$name;";
@@ -1455,10 +1445,10 @@ class Sanitizer {
* @return Array
*/
static function setupAttributeWhitelist() {
- global $wgAllowRdfaAttributes, $wgHtml5, $wgAllowMicrodataAttributes;
+ global $wgAllowRdfaAttributes, $wgAllowMicrodataAttributes;
static $whitelist, $staticInitialised;
- $globalContext = implode( '-', compact( 'wgAllowRdfaAttributes', 'wgHtml5', 'wgAllowMicrodataAttributes' ) );
+ $globalContext = implode( '-', compact( 'wgAllowRdfaAttributes', 'wgAllowMicrodataAttributes' ) );
if ( isset( $whitelist ) && $staticInitialised == $globalContext ) {
return $whitelist;
@@ -1478,32 +1468,35 @@ class Sanitizer {
);
if ( $wgAllowRdfaAttributes ) {
- #RDFa attributes as specified in section 9 of http://www.w3.org/TR/2008/REC-rdfa-syntax-20081014
+ # RDFa attributes as specified in section 9 of
+ # http://www.w3.org/TR/2008/REC-rdfa-syntax-20081014
$common = array_merge( $common, array(
- 'about', 'property', 'resource', 'datatype', 'typeof',
+ 'about', 'property', 'resource', 'datatype', 'typeof',
) );
}
- if ( $wgHtml5 && $wgAllowMicrodataAttributes ) {
- # add HTML5 microdata tags as specified by http://www.whatwg.org/specs/web-apps/current-work/multipage/microdata.html#the-microdata-model
+ if ( $wgAllowMicrodataAttributes ) {
+ # add HTML5 microdata tags as specified by
+ # http://www.whatwg.org/html/microdata.html#the-microdata-model
$common = array_merge( $common, array(
- 'itemid', 'itemprop', 'itemref', 'itemscope', 'itemtype'
+ 'itemid', 'itemprop', 'itemref', 'itemscope', 'itemtype'
) );
}
$block = array_merge( $common, array( 'align' ) );
$tablealign = array( 'align', 'char', 'charoff', 'valign' );
- $tablecell = array( 'abbr',
- 'axis',
- 'headers',
- 'scope',
- 'rowspan',
- 'colspan',
- 'nowrap', # deprecated
- 'width', # deprecated
- 'height', # deprecated
- 'bgcolor' # deprecated
- );
+ $tablecell = array(
+ 'abbr',
+ 'axis',
+ 'headers',
+ 'scope',
+ 'rowspan',
+ 'colspan',
+ 'nowrap', # deprecated
+ 'width', # deprecated
+ 'height', # deprecated
+ 'bgcolor', # deprecated
+ );
# Numbers refer to sections in HTML 4.01 standard describing the element.
# See: http://www.w3.org/TR/html4/
@@ -1553,6 +1546,9 @@ class Sanitizer {
# 9.3.2
'br' => array( 'id', 'class', 'title', 'style', 'clear' ),
+ # http://www.whatwg.org/html/text-level-semantics.html#the-wbr-element
+ 'wbr' => array( 'id', 'class', 'title', 'style' ),
+
# 9.3.4
'pre' => array_merge( $common, array( 'width' ) ),
@@ -1596,7 +1592,9 @@ class Sanitizer {
'td' => array_merge( $common, $tablecell, $tablealign ),
'th' => array_merge( $common, $tablecell, $tablealign ),
- # 12.2 # NOTE: <a> is not allowed directly, but the attrib whitelist is used from the Parser object
+ # 12.2
+ # NOTE: <a> is not allowed directly, but the attrib
+ # whitelist is used from the Parser object
'a' => array_merge( $common, array( 'href', 'rel', 'rev' ) ), # rel/rev esp. for RDFa
# 13.2
@@ -1622,8 +1620,8 @@ class Sanitizer {
# 15.3
'hr' => array_merge( $common, array( 'noshade', 'size', 'width' ) ),
- # XHTML Ruby annotation text module, simple ruby only.
- # http://www.w3c.org/TR/ruby/
+ # HTML Ruby annotation text module, simple ruby only.
+ # http://www.whatwg.org/html/text-level-semantics.html#the-ruby-element
'ruby' => $common,
# rbc
# rtc
@@ -1639,25 +1637,20 @@ class Sanitizer {
# HTML 5 section 4.6
'bdi' => $common,
- );
-
- if ( $wgHtml5 ) {
# HTML5 elements, defined by:
- # http://www.whatwg.org/specs/web-apps/current-work/multipage/
- $whitelist += array(
- 'data' => array_merge( $common, array( 'value' ) ),
- 'time' => array_merge( $common, array( 'datetime' ) ),
- 'mark' => $common,
-
- // meta and link are only permitted by removeHTMLtags when Microdata
- // is enabled so we don't bother adding a conditional to hide these
- // Also meta and link are only valid in WikiText as Microdata elements
- // (ie: validateTag rejects tags missing the attributes needed for Microdata)
- // So we don't bother including $common attributes that have no purpose.
- 'meta' => array( 'itemprop', 'content' ),
- 'link' => array( 'itemprop', 'href' ),
- );
- }
+ # http://www.whatwg.org/html/
+ 'data' => array_merge( $common, array( 'value' ) ),
+ 'time' => array_merge( $common, array( 'datetime' ) ),
+ 'mark' => $common,
+
+ // meta and link are only permitted by removeHTMLtags when Microdata
+ // is enabled so we don't bother adding a conditional to hide these
+ // Also meta and link are only valid in WikiText as Microdata elements
+ // (ie: validateTag rejects tags missing the attributes needed for Microdata)
+ // So we don't bother including $common attributes that have no purpose.
+ 'meta' => array( 'itemprop', 'content' ),
+ 'link' => array( 'itemprop', 'href' ),
+ );
$staticInitialised = $globalContext;
@@ -1696,7 +1689,7 @@ class Sanitizer {
*/
static function hackDocType() {
$out = "<!DOCTYPE html [\n";
- foreach( self::$htmlEntities as $entity => $codepoint ) {
+ foreach ( self::$htmlEntities as $entity => $codepoint ) {
$out .= "<!ENTITY $entity \"&#$codepoint;\">";
}
$out .= "]>\n";
@@ -1718,7 +1711,7 @@ class Sanitizer {
# Validate hostname portion
$matches = array();
- if( preg_match( '!^([^:]+:)(//[^/]+)?(.*)$!iD', $url, $matches ) ) {
+ if ( preg_match( '!^([^:]+:)(//[^/]+)?(.*)$!iD', $url, $matches ) ) {
list( /* $whole */, $protocol, $host, $rest ) = $matches;
// Characters that will be ignored in IDNs.
@@ -1762,7 +1755,7 @@ class Sanitizer {
* Does a string look like an e-mail 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
+ * http://www.whatwg.org/html/states-of-the-type-attribute.html#valid-e-mail-address
* Which as of 2011-01-24 says:
*
* A valid e-mail address is a string that matches the ABNF production
@@ -1788,7 +1781,7 @@ class Sanitizer {
*/
public static function validateEmail( $addr ) {
$result = null;
- if( !wfRunHooks( 'isValidEmailAddr', array( $addr, &$result ) ) ) {
+ if ( !wfRunHooks( 'isValidEmailAddr', array( $addr, &$result ) ) ) {
return $result;
}
@@ -1807,6 +1800,6 @@ class Sanitizer {
$ # End of string
/ix"; // case Insensitive, eXtended
- return (bool) preg_match( $HTML5_email_regexp, $addr );
+ return (bool)preg_match( $HTML5_email_regexp, $addr );
}
}
diff --git a/includes/ScopedCallback.php b/includes/ScopedCallback.php
index 1d5b26bf..ef22e0a3 100644
--- a/includes/ScopedCallback.php
+++ b/includes/ScopedCallback.php
@@ -22,19 +22,52 @@
/**
* Class for asserting that a callback happens when an dummy object leaves scope
+ *
+ * @since 1.21
*/
class ScopedCallback {
- /** @var Closure */
+ /** @var callable */
protected $callback;
/**
- * @param $callback Closure
+ * @param callable $callback
+ * @throws MWException
*/
- public function __construct( Closure $callback ) {
+ public function __construct( $callback ) {
+ if ( !is_callable( $callback ) ) {
+ throw new MWException( "Provided callback is not valid." );
+ }
$this->callback = $callback;
}
+ /**
+ * Trigger a scoped callback and destroy it.
+ * This is the same is just setting it to null.
+ *
+ * @param ScopedCallback $sc
+ */
+ public static function consume( ScopedCallback &$sc = null ) {
+ $sc = null;
+ }
+
+ /**
+ * Destroy a scoped callback without triggering it
+ *
+ * @param ScopedCallback $sc
+ */
+ public static function cancel( ScopedCallback &$sc = null ) {
+ if ( $sc ) {
+ $sc->callback = null;
+ }
+ $sc = null;
+ }
+
+ /**
+ * Trigger the callback when this leaves scope
+ */
function __destruct() {
- call_user_func( $this->callback );
+ if ( $this->callback !== null ) {
+ call_user_func( $this->callback );
+ }
}
}
diff --git a/includes/SeleniumWebSettings.php b/includes/SeleniumWebSettings.php
deleted file mode 100644
index 7715484e..00000000
--- a/includes/SeleniumWebSettings.php
+++ /dev/null
@@ -1,221 +0,0 @@
-<?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
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License along
- * with this program; if not, write 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 );
-}
-
-require_once( "$IP/includes/GlobalFunctions.php" );
-
-$fname = 'SeleniumWebSettings.php';
-wfProfileIn( $fname );
-
-$cookiePrefix = $wgSitename . '-';
-$cookieName = $cookiePrefix . 'Selenium';
-
-// this is a fallback SQL file
-$testSqlFile = false;
-$testImageZip = false;
-
-// 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
- );
- }
-
- $testIncludes = array(); // array containing all the includes needed for this test
- $testGlobalConfigs = array(); // an array containing all the global configs needed for this test
- $testResourceFiles = array(); // an array containing all the resource files needed for this test
- $callback = $wgSeleniumTestConfigs[$setupTestSuiteName];
- call_user_func_array( $callback, array( &$testIncludes, &$testGlobalConfigs, &$testResourceFiles));
-
- if ( isset( $testResourceFiles['images'] ) ) {
- $testImageZip = $testResourceFiles['images'];
- }
-
- if ( isset( $testResourceFiles['db'] ) ) {
- $testSqlFile = $testResourceFiles['db'];
- $testResourceName = getTestResourceNameFromTestSuiteName( $setupTestSuiteName );
-
- switchToTestResources( $testResourceName, false ); // false means do not switch database yet
- setupTestResources( $testResourceName, $testSqlFile, $testImageZip );
- }
-}
-
-// clear the cookie based on a request param
-if ( isset( $_GET['clearTestSuite'] ) ) {
- $testSuiteName = getTestSuiteNameFromCookie( $cookieName );
-
- $expire = time() - 600;
- setcookie(
- $cookieName,
- '',
- $expire,
- $wgCookiePath,
- $wgCookieDomain,
- $wgCookieSecure,
- true
- );
-
- $testResourceName = getTestResourceNameFromTestSuiteName( $testSuiteName );
- teardownTestResources( $testResourceName );
-}
-
-// if a cookie is found, run the appropriate callback to get the config params.
-if ( isset( $_COOKIE[$cookieName] ) ) {
- $testSuiteName = getTestSuiteNameFromCookie( $cookieName );
- if ( !isset( $wgSeleniumTestConfigs[$testSuiteName] ) ) {
- return;
- }
-
- $testIncludes = array(); // array containing all the includes needed for this test
- $testGlobalConfigs = array(); // an array containing all the global configs needed for this test
- $testResourceFiles = array(); // an array containing all the resource files needed for this test
- $callback = $wgSeleniumTestConfigs[$testSuiteName];
- call_user_func_array( $callback, array( &$testIncludes, &$testGlobalConfigs, &$testResourceFiles));
-
- if ( isset( $testResourceFiles['db'] ) ) {
- $testResourceName = getTestResourceNameFromTestSuiteName( $testSuiteName );
- switchToTestResources( $testResourceName );
- }
- 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 );
-
-function getTestSuiteNameFromCookie( $cookieName ) {
- $testSuiteName = null;
- if ( isset( $_COOKIE[$cookieName] ) ) {
- $testSuiteName = $_COOKIE[$cookieName];
- }
- return $testSuiteName;
-}
-
-function getTestResourceNameFromTestSuiteName( $testSuiteName ) {
- $testResourceName = null;
- if ( isset( $testSuiteName ) ) {
- $testResourceName = $testSuiteName;
- }
- return $testResourceName;
-}
-
-function getTestUploadPathFromResourceName( $testResourceName ) {
- global $IP;
- $testUploadPath = "$IP/images/$testResourceName";
- return $testUploadPath;
-}
-
-function setupTestResources( $testResourceName, $testSqlFile, $testImageZip ) {
- global $wgDBname;
-
- // Basic security. Do not allow to drop productive database.
- if ( $testResourceName == $wgDBname ) {
- die( 'Cannot override productive database.' );
- }
- if ( $testResourceName == '' ) {
- die( 'Cannot identify a test the resources should be installed for.' );
- }
-
- // create tables
- $dbw = wfGetDB( DB_MASTER );
- $dbw->query( 'DROP DATABASE IF EXISTS ' . $testResourceName );
- $dbw->query( 'CREATE DATABASE ' . $testResourceName );
-
- // do not set the new DB name before database is setup
- $wgDBname = $testResourceName;
- $dbw->selectDB( $testResourceName );
- // populate from SQL file
- if ( $testSqlFile ) {
- $dbw->sourceFile( $testSqlFile );
- }
-
- // create test image dir
- $testUploadPath = getTestUploadPathFromResourceName( $testResourceName );
- if ( !file_exists( $testUploadPath ) ) {
- mkdir( $testUploadPath );
- }
-
- if ( $testImageZip ) {
- $zip = new ZipArchive();
- $zip->open( $testImageZip );
- $zip->extractTo( $testUploadPath );
- $zip->close();
- }
-}
-
-function teardownTestResources( $testResourceName ) {
- // remove test database
- $dbw = wfGetDB( DB_MASTER );
- $dbw->query( 'DROP DATABASE IF EXISTS ' . $testResourceName );
-
- $testUploadPath = getTestUploadPathFromResourceName( $testResourceName );
- // remove test image dir
- if ( file_exists( $testUploadPath ) ) {
- wfRecursiveRemoveDir( $testUploadPath );
- }
-}
-
-function switchToTestResources( $testResourceName, $switchDB = true ) {
- global $wgDBuser, $wgDBpassword, $wgDBname;
- global $wgDBtestuser, $wgDBtestpassword;
- global $wgUploadPath;
-
- if ( $switchDB ) {
- $wgDBname = $testResourceName;
- }
- $wgDBuser = $wgDBtestuser;
- $wgDBpassword = $wgDBtestpassword;
-
- $testUploadPath = getTestUploadPathFromResourceName( $testResourceName );
- $wgUploadPath = $testUploadPath;
-}
diff --git a/includes/Setup.php b/includes/Setup.php
index e87b200f..2e083d83 100644
--- a/includes/Setup.php
+++ b/includes/Setup.php
@@ -44,9 +44,12 @@ 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 ( $wgScript === false ) {
+ $wgScript = "$wgScriptPath/index$wgScriptExtension";
+}
+if ( $wgLoadScript === false ) {
+ $wgLoadScript = "$wgScriptPath/load$wgScriptExtension";
+}
if ( $wgArticlePath === false ) {
if ( $wgUsePathInfo ) {
@@ -62,24 +65,38 @@ if ( !empty( $wgActionPaths ) && !isset( $wgActionPaths['view'] ) ) {
$wgActionPaths['view'] = $wgArticlePath;
}
-if ( !empty( $wgActionPaths ) && !isset( $wgActionPaths['view'] ) ) {
- # 'view' is assumed the default action path everywhere in the code
- # but is rarely filled in $wgActionPaths
- $wgActionPaths['view'] = $wgArticlePath;
+if ( $wgStylePath === false ) {
+ $wgStylePath = "$wgScriptPath/skins";
+}
+if ( $wgLocalStylePath === false ) {
+ $wgLocalStylePath = "$wgScriptPath/skins";
+}
+if ( $wgStyleDirectory === false ) {
+ $wgStyleDirectory = "$IP/skins";
+}
+if ( $wgExtensionAssetsPath === false ) {
+ $wgExtensionAssetsPath = "$wgScriptPath/extensions";
}
-if ( $wgStylePath === false ) $wgStylePath = "$wgScriptPath/skins";
-if ( $wgLocalStylePath === false ) $wgLocalStylePath = "$wgScriptPath/skins";
-if ( $wgStyleDirectory === false ) $wgStyleDirectory = "$IP/skins";
-if ( $wgExtensionAssetsPath === false ) $wgExtensionAssetsPath = "$wgScriptPath/extensions";
-
-if ( $wgLogo === false ) $wgLogo = "$wgStylePath/common/images/wiki.png";
+if ( $wgLogo === false ) {
+ $wgLogo = "$wgStylePath/common/images/wiki.png";
+}
-if ( $wgUploadPath === false ) $wgUploadPath = "$wgScriptPath/images";
-if ( $wgUploadDirectory === false ) $wgUploadDirectory = "$IP/images";
-if ( $wgReadOnlyFile === false ) $wgReadOnlyFile = "{$wgUploadDirectory}/lock_yBgMBwiR";
-if ( $wgFileCacheDirectory === false ) $wgFileCacheDirectory = "{$wgUploadDirectory}/cache";
-if ( $wgDeletedDirectory === false ) $wgDeletedDirectory = "{$wgUploadDirectory}/deleted";
+if ( $wgUploadPath === false ) {
+ $wgUploadPath = "$wgScriptPath/images";
+}
+if ( $wgUploadDirectory === false ) {
+ $wgUploadDirectory = "$IP/images";
+}
+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'];
@@ -130,13 +147,13 @@ $wgNamespaceAliases['Image_talk'] = NS_FILE_TALK;
* Initialise $wgLockManagers to include basic FS version
*/
$wgLockManagers[] = array(
- 'name' => 'fsLockManager',
- 'class' => 'FSLockManager',
+ 'name' => 'fsLockManager',
+ 'class' => 'FSLockManager',
'lockDirectory' => "{$wgUploadDirectory}/lockdir",
);
$wgLockManagers[] = array(
- 'name' => 'nullLockManager',
- 'class' => 'NullLockManager',
+ 'name' => 'nullLockManager',
+ 'class' => 'NullLockManager',
);
/**
@@ -202,15 +219,15 @@ if ( $wgUseSharedUploads ) {
}
if ( $wgUseInstantCommons ) {
$wgForeignFileRepos[] = array(
- 'class' => 'ForeignAPIRepo',
- 'name' => 'wikimediacommons',
- 'apibase' => WebRequest::detectProtocol() === 'https' ?
+ 'class' => 'ForeignAPIRepo',
+ 'name' => 'wikimediacommons',
+ 'apibase' => WebRequest::detectProtocol() === 'https' ?
'https://commons.wikimedia.org/w/api.php' :
'http://commons.wikimedia.org/w/api.php',
- 'hashLevels' => 2,
- 'fetchDescription' => true,
+ 'hashLevels' => 2,
+ 'fetchDescription' => true,
'descriptionCacheExpiry' => 43200,
- 'apiThumbCacheExpiry' => 86400,
+ 'apiThumbCacheExpiry' => 86400,
);
}
/*
@@ -276,6 +293,13 @@ if ( $wgMetaNamespace === false ) {
$wgMetaNamespace = str_replace( ' ', '_', $wgSitename );
}
+
+// Default value is either the suhosin limit or -1 for unlimited
+if ( $wgResourceLoaderMaxQueryLength === false ) {
+ $maxValueLength = ini_get( 'suhosin.get.max_value_length' );
+ $wgResourceLoaderMaxQueryLength = $maxValueLength > 0 ? $maxValueLength : -1;
+}
+
/**
* Definitions of the NS_ constants are in Defines.php
* @private
@@ -301,7 +325,7 @@ $wgCanonicalNamespaceNames = array(
);
/// @todo UGLY UGLY
-if( is_array( $wgExtraNamespaces ) ) {
+if ( is_array( $wgExtraNamespaces ) ) {
$wgCanonicalNamespaceNames = $wgCanonicalNamespaceNames + $wgExtraNamespaces;
}
@@ -323,11 +347,17 @@ if ( !$wgEnotifMinorEdits ) {
}
# $wgDisabledActions is deprecated as of 1.18
-foreach( $wgDisabledActions as $action ) {
+foreach ( $wgDisabledActions as $action ) {
$wgActions[$action] = false;
}
-if ( !$wgHtml5Version && $wgHtml5 && $wgAllowRdfaAttributes ) {
+# We always output HTML5 since 1.22, overriding these is no longer supported
+# we set them here for extensions that depend on its value.
+$wgHtml5 = true;
+$wgXhtmlDefaultNamespace = 'http://www.w3.org/1999/xhtml';
+$wgJsMimeType = 'text/javascript';
+
+if ( !$wgHtml5Version && $wgAllowRdfaAttributes ) {
# see http://www.w3.org/TR/rdfa-in-html/#document-conformance
if ( $wgMimeType == 'application/xhtml+xml' ) {
$wgHtml5Version = 'XHTML+RDFa 1.0';
@@ -347,10 +377,6 @@ if ( $wgInvalidateCacheOnLocalSettingsChange ) {
$wgCacheEpoch = max( $wgCacheEpoch, gmdate( 'YmdHis', @filemtime( "$IP/LocalSettings.php" ) ) );
}
-if ( $wgAjaxUploadDestCheck ) {
- $wgAjaxExportList[] = 'SpecialUpload::ajaxGetExistsWarning';
-}
-
if ( $wgNewUserLog ) {
# Add a new log type
$wgLogTypes[] = 'newusers';
@@ -367,6 +393,15 @@ if ( $wgCookieSecure === 'detect' ) {
$wgCookieSecure = ( WebRequest::detectProtocol() === 'https' );
}
+if ( $wgRC2UDPAddress ) {
+ $wgRCFeeds['default'] = array(
+ 'formatter' => 'IRCColourfulRCFeedFormatter',
+ 'uri' => "udp://$wgRC2UDPAddress:$wgRC2UDPPort/$wgRC2UDPPrefix",
+ 'add_interwiki_prefix' => &$wgRC2UDPInterwikiPrefix,
+ 'omit_bots' => &$wgRC2UDPOmitBots,
+ );
+}
+
// Disable MWDebug for command line mode, this prevents MWDebug from eating up
// all the memory from logging SQL queries on maintenance scripts
global $wgCommandLineMode;
@@ -374,22 +409,20 @@ if ( $wgDebugToolbar && !$wgCommandLineMode ) {
MWDebug::init();
}
-if ( !defined( 'MW_COMPILED' ) ) {
- if ( !MWInit::classExists( 'AutoLoader' ) ) {
- require_once( "$IP/includes/AutoLoader.php" );
- }
+if ( !class_exists( 'AutoLoader' ) ) {
+ require_once "$IP/includes/AutoLoader.php";
+}
- wfProfileIn( $fname . '-exception' );
- MWExceptionHandler::installHandler();
- wfProfileOut( $fname . '-exception' );
+wfProfileIn( $fname . '-exception' );
+MWExceptionHandler::installHandler();
+wfProfileOut( $fname . '-exception' );
- wfProfileIn( $fname . '-includes' );
- require_once( "$IP/includes/normal/UtfNormalUtil.php" );
- require_once( "$IP/includes/GlobalFunctions.php" );
- require_once( "$IP/includes/ProxyTools.php" );
- require_once( "$IP/includes/normal/UtfNormalDefines.php" );
- wfProfileOut( $fname . '-includes' );
-}
+wfProfileIn( $fname . '-includes' );
+require_once "$IP/includes/normal/UtfNormalUtil.php";
+require_once "$IP/includes/GlobalFunctions.php";
+require_once "$IP/includes/ProxyTools.php";
+require_once "$IP/includes/normal/UtfNormalDefines.php";
+wfProfileOut( $fname . '-includes' );
if ( $wgSecureLogin && substr( $wgServer, 0, 2 ) !== '//' ) {
$wgSecureLogin = false;
@@ -406,9 +439,16 @@ if ( $wgCanonicalServer === false ) {
$wgCanonicalServer = wfExpandUrl( $wgServer, PROTO_HTTP );
}
-// Initialize $wgHTCPMulticastRouting from backwards-compatible settings
-if ( !$wgHTCPMulticastRouting && $wgHTCPMulticastAddress ) {
- $wgHTCPMulticastRouting = array(
+// $wgHTCPMulticastRouting got renamed to $wgHTCPRouting in MediaWiki 1.22
+// ensure back compatibility.
+if ( !$wgHTCPRouting && $wgHTCPMulticastRouting ) {
+ $wgHTCPRouting = $wgHTCPMulticastRouting;
+}
+
+// Initialize $wgHTCPRouting from backwards-compatible settings that
+// comes from pre 1.20 version.
+if ( !$wgHTCPRouting && $wgHTCPMulticastAddress ) {
+ $wgHTCPRouting = array(
'' => array(
'host' => $wgHTCPMulticastAddress,
'port' => $wgHTCPPort,
@@ -426,14 +466,14 @@ wfMemoryLimit();
* that happens whenever you use a date function without the timezone being
* explicitly set. Inspired by phpMyAdmin's treatment of the problem.
*/
-if ( is_null( $wgLocaltimezone) ) {
+if ( is_null( $wgLocaltimezone ) ) {
wfSuppressWarnings();
$wgLocaltimezone = date_default_timezone_get();
wfRestoreWarnings();
}
date_default_timezone_set( $wgLocaltimezone );
-if( is_null( $wgLocalTZoffset ) ) {
+if ( is_null( $wgLocalTZoffset ) ) {
$wgLocalTZoffset = date( 'Z' ) / 60;
}
@@ -539,10 +579,11 @@ foreach ( $wgExtensionFunctions as $func ) {
if ( is_object( $func ) && $func instanceof Closure ) {
$profName = $fname . '-extensions-closure';
} elseif ( is_array( $func ) ) {
- if ( is_object( $func[0] ) )
+ if ( is_object( $func[0] ) ) {
$profName = $fname . '-extensions-' . get_class( $func[0] ) . '::' . $func[1];
- else
+ } else {
$profName = $fname . '-extensions-' . implode( '::', $func );
+ }
} else {
$profName = $fname . '-extensions-' . strval( $func );
}
diff --git a/includes/SiteConfiguration.php b/includes/SiteConfiguration.php
index bbc14a12..fa871fe0 100644
--- a/includes/SiteConfiguration.php
+++ b/includes/SiteConfiguration.php
@@ -191,11 +191,11 @@ class SiteConfiguration {
*/
protected function getSetting( $settingName, $wiki, /*array*/ $params ) {
$retval = null;
- if( array_key_exists( $settingName, $this->settings ) ) {
+ if ( array_key_exists( $settingName, $this->settings ) ) {
$thisSetting =& $this->settings[$settingName];
do {
// Do individual wiki settings
- if( array_key_exists( $wiki, $thisSetting ) ) {
+ if ( array_key_exists( $wiki, $thisSetting ) ) {
$retval = $thisSetting[$wiki];
break;
} elseif ( array_key_exists( "+$wiki", $thisSetting ) && is_array( $thisSetting["+$wiki"] ) ) {
@@ -203,16 +203,16 @@ class SiteConfiguration {
}
// Do tag settings
- foreach( $params['tags'] as $tag ) {
- if( array_key_exists( $tag, $thisSetting ) ) {
+ foreach ( $params['tags'] as $tag ) {
+ if ( array_key_exists( $tag, $thisSetting ) ) {
if ( isset( $retval ) && is_array( $retval ) && is_array( $thisSetting[$tag] ) ) {
$retval = self::arrayMerge( $retval, $thisSetting[$tag] );
} else {
$retval = $thisSetting[$tag];
}
break 2;
- } elseif( array_key_exists( "+$tag", $thisSetting ) && is_array( $thisSetting["+$tag"] ) ) {
- if( !isset( $retval ) ) {
+ } elseif ( array_key_exists( "+$tag", $thisSetting ) && is_array( $thisSetting["+$tag"] ) ) {
+ if ( !isset( $retval ) ) {
$retval = array();
}
$retval = self::arrayMerge( $retval, $thisSetting["+$tag"] );
@@ -220,15 +220,15 @@ class SiteConfiguration {
}
// Do suffix settings
$suffix = $params['suffix'];
- if( !is_null( $suffix ) ) {
- if( array_key_exists( $suffix, $thisSetting ) ) {
+ if ( !is_null( $suffix ) ) {
+ if ( array_key_exists( $suffix, $thisSetting ) ) {
if ( isset( $retval ) && is_array( $retval ) && is_array( $thisSetting[$suffix] ) ) {
$retval = self::arrayMerge( $retval, $thisSetting[$suffix] );
} else {
$retval = $thisSetting[$suffix];
}
break;
- } elseif ( array_key_exists( "+$suffix", $thisSetting ) && is_array($thisSetting["+$suffix"]) ) {
+ } elseif ( array_key_exists( "+$suffix", $thisSetting ) && is_array( $thisSetting["+$suffix"] ) ) {
if ( !isset( $retval ) ) {
$retval = array();
}
@@ -237,8 +237,8 @@ class SiteConfiguration {
}
// Fall back to default.
- if( array_key_exists( 'default', $thisSetting ) ) {
- if( is_array( $retval ) && is_array( $thisSetting['default'] ) ) {
+ if ( array_key_exists( 'default', $thisSetting ) ) {
+ if ( is_array( $retval ) && is_array( $thisSetting['default'] ) ) {
$retval = self::arrayMerge( $retval, $thisSetting['default'] );
} else {
$retval = $thisSetting['default'];
@@ -248,7 +248,7 @@ class SiteConfiguration {
} while ( false );
}
- if( !is_null( $retval ) && count( $params['params'] ) ) {
+ if ( !is_null( $retval ) && count( $params['params'] ) ) {
foreach ( $params['params'] as $key => $value ) {
$retval = $this->doReplace( '$' . $key, $value, $retval );
}
@@ -266,10 +266,10 @@ class SiteConfiguration {
* @return string
*/
function doReplace( $from, $to, $in ) {
- if( is_string( $in ) ) {
+ if ( is_string( $in ) ) {
return str_replace( $from, $to, $in );
- } elseif( is_array( $in ) ) {
- foreach( $in as $key => $val ) {
+ } elseif ( is_array( $in ) ) {
+ foreach ( $in as $key => $val ) {
$in[$key] = $this->doReplace( $from, $to, $val );
}
return $in;
@@ -289,7 +289,7 @@ class SiteConfiguration {
public function getAll( $wiki, $suffix = null, $params = array(), $wikiTags = array() ) {
$params = $this->mergeParams( $wiki, $suffix, $params, $wikiTags );
$localSettings = array();
- foreach( $this->settings as $varname => $stuff ) {
+ foreach ( $this->settings as $varname => $stuff ) {
$append = false;
$var = $varname;
if ( substr( $varname, 0, 1 ) == '+' ) {
@@ -317,7 +317,7 @@ class SiteConfiguration {
* @return bool The value of the setting requested.
*/
public function getBool( $setting, $wiki, $suffix = null, $wikiTags = array() ) {
- return (bool)($this->get( $setting, $wiki, $suffix, array(), $wikiTags ) );
+ return (bool)$this->get( $setting, $wiki, $suffix, array(), $wikiTags );
}
/**
@@ -409,18 +409,18 @@ class SiteConfiguration {
'params' => array(),
);
- if( !is_callable( $this->siteParamsCallback ) ) {
+ if ( !is_callable( $this->siteParamsCallback ) ) {
return $default;
}
$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] ) ) ) {
+ foreach ( $default as $name => $def ) {
+ if ( !isset( $ret[$name] ) || ( is_array( $default[$name] ) && !is_array( $ret[$name] ) ) ) {
$ret[$name] = $default[$name];
}
}
@@ -443,7 +443,7 @@ class SiteConfiguration {
protected function mergeParams( $wiki, $suffix, /*array*/ $params, /*array*/ $wikiTags ) {
$ret = $this->getWikiParams( $wiki );
- if( is_null( $ret['suffix'] ) ) {
+ if ( is_null( $ret['suffix'] ) ) {
$ret['suffix'] = $suffix;
}
@@ -452,10 +452,10 @@ class SiteConfiguration {
$ret['params'] += $params;
// Automatically fill that ones if needed
- if( !isset( $ret['params']['lang'] ) && !is_null( $ret['lang'] ) ) {
+ if ( !isset( $ret['params']['lang'] ) && !is_null( $ret['lang'] ) ) {
$ret['params']['lang'] = $ret['lang'];
}
- if( !isset( $ret['params']['site'] ) && !is_null( $ret['suffix'] ) ) {
+ if ( !isset( $ret['params']['site'] ) && !is_null( $ret['suffix'] ) ) {
$ret['params']['site'] = $ret['suffix'];
}
@@ -471,19 +471,19 @@ class SiteConfiguration {
public function siteFromDB( $db ) {
// Allow override
$def = $this->getWikiParams( $db );
- if( !is_null( $def['suffix'] ) && !is_null( $def['lang'] ) ) {
+ if ( !is_null( $def['suffix'] ) && !is_null( $def['lang'] ) ) {
return array( $def['suffix'], $def['lang'] );
}
$site = null;
$lang = null;
- foreach ( $this->suffixes as $suffix ) {
+ foreach ( $this->suffixes as $altSite => $suffix ) {
if ( $suffix === '' ) {
$site = '';
$lang = $db;
break;
} elseif ( substr( $db, -strlen( $suffix ) ) == $suffix ) {
- $site = $suffix == 'wiki' ? 'wikipedia' : $suffix;
+ $site = is_numeric( $altSite ) ? $suffix : $altSite;
$lang = substr( $db, 0, strlen( $db ) - strlen( $suffix ) );
break;
}
@@ -574,8 +574,8 @@ class SiteConfiguration {
*/
static function arrayMerge( $array1/* ... */ ) {
$out = $array1;
- for( $i = 1; $i < func_num_args(); $i++ ) {
- foreach( func_get_arg( $i ) as $key => $value ) {
+ for ( $i = 1; $i < func_num_args(); $i++ ) {
+ foreach ( func_get_arg( $i ) as $key => $value ) {
if ( isset( $out[$key] ) && is_array( $out[$key] ) && is_array( $value ) ) {
$out[$key] = self::arrayMerge( $out[$key], $value );
} elseif ( !isset( $out[$key] ) || !$out[$key] && !is_numeric( $key ) ) {
diff --git a/includes/SiteStats.php b/includes/SiteStats.php
index b7be29d6..355993c6 100644
--- a/includes/SiteStats.php
+++ b/includes/SiteStats.php
@@ -61,13 +61,13 @@ class SiteStats {
wfDebug( __METHOD__ . ": reading site_stats from slave\n" );
$row = self::doLoad( wfGetDB( DB_SLAVE ) );
- if( !self::isSane( $row ) ) {
+ if ( !self::isSane( $row ) ) {
// Might have just been initialized during this request? Underflow?
wfDebug( __METHOD__ . ": site_stats damaged or missing on slave\n" );
$row = self::doLoad( wfGetDB( DB_MASTER ) );
}
- if( !self::isSane( $row ) ) {
+ if ( !self::isSane( $row ) ) {
// Normally the site_stats table is initialized at install time.
// Some manual construction scenarios may leave the table empty or
// broken, however, for instance when importing from a dump into a
@@ -79,7 +79,7 @@ class SiteStats {
$row = self::doLoad( wfGetDB( DB_MASTER ) );
}
- if( !self::isSane( $row ) ) {
+ if ( !self::isSane( $row ) ) {
wfDebug( __METHOD__ . ": site_stats persistently nonsensical o_O\n" );
}
return $row;
@@ -189,7 +189,7 @@ class SiteStats {
static function jobs() {
if ( !isset( self::$jobs ) ) {
$dbr = wfGetDB( DB_SLAVE );
- self::$jobs = $dbr->estimateRowCount( 'job' );
+ self::$jobs = array_sum( JobQueueGroup::singleton()->getQueueSizes() );
/* Zero rows still do single row read for row that doesn't exist, but people are annoyed by that */
if ( self::$jobs == 1 ) {
self::$jobs = 0;
@@ -205,7 +205,7 @@ class SiteStats {
*/
static function pagesInNs( $ns ) {
wfProfileIn( __METHOD__ );
- if( !isset( self::$pageCount[$ns] ) ) {
+ if ( !isset( self::$pageCount[$ns] ) ) {
$dbr = wfGetDB( DB_SLAVE );
self::$pageCount[$ns] = (int)$dbr->selectField(
'page',
@@ -226,20 +226,24 @@ class SiteStats {
* @return bool
*/
private static function isSane( $row ) {
- if(
- $row === false
+ if ( $row === false
|| $row->ss_total_pages < $row->ss_good_articles
|| $row->ss_total_edits < $row->ss_total_pages
+ || $row->ss_users < $row->ss_active_users
) {
return false;
}
// Now check for underflow/overflow
- foreach( array( 'total_views', 'total_edits', 'good_articles',
- 'total_pages', 'users', 'images' ) as $member ) {
- if(
- $row->{"ss_$member"} > 2000000000
- || $row->{"ss_$member"} < 0
- ) {
+ foreach ( array(
+ 'ss_total_views',
+ 'ss_total_edits',
+ 'ss_good_articles',
+ 'ss_total_pages',
+ 'ss_users',
+ 'ss_active_users',
+ 'ss_images',
+ ) as $member ) {
+ if ( $row->$member > 2000000000 || $row->$member < 0 ) {
return false;
}
}
@@ -258,7 +262,7 @@ class SiteStatsUpdate implements DeferrableUpdate {
protected $users = 0;
protected $images = 0;
- // @TODO: deprecate this constructor
+ // @todo deprecate this constructor
function __construct( $views, $edits, $good, $pages = 0, $users = 0 ) {
$this->views = $views;
$this->edits = $edits;
@@ -293,50 +297,56 @@ class SiteStatsUpdate implements DeferrableUpdate {
if ( $rate && ( $rate < 0 || mt_rand( 0, $rate - 1 ) != 0 ) ) {
$this->doUpdatePendingDeltas();
} else {
- $dbw = wfGetDB( DB_MASTER );
-
- $lockKey = wfMemcKey( 'site_stats' ); // prepend wiki ID
- if ( $rate ) {
- // Lock the table so we don't have double DB/memcached updates
- if ( !$dbw->lockIsFree( $lockKey, __METHOD__ )
- || !$dbw->lock( $lockKey, __METHOD__, 1 ) // 1 sec timeout
- ) {
- $this->doUpdatePendingDeltas();
- return;
- }
- $pd = $this->getPendingDeltas();
- // Piggy-back the async deltas onto those of this stats update....
- $this->views += ( $pd['ss_total_views']['+'] - $pd['ss_total_views']['-'] );
- $this->edits += ( $pd['ss_total_edits']['+'] - $pd['ss_total_edits']['-'] );
- $this->articles += ( $pd['ss_good_articles']['+'] - $pd['ss_good_articles']['-'] );
- $this->pages += ( $pd['ss_total_pages']['+'] - $pd['ss_total_pages']['-'] );
- $this->users += ( $pd['ss_users']['+'] - $pd['ss_users']['-'] );
- $this->images += ( $pd['ss_images']['+'] - $pd['ss_images']['-'] );
- }
-
// Need a separate transaction because this a global lock
- $dbw->begin( __METHOD__ );
-
- // Build up an SQL query of deltas and apply them...
- $updates = '';
- $this->appendUpdate( $updates, 'ss_total_views', $this->views );
- $this->appendUpdate( $updates, 'ss_total_edits', $this->edits );
- $this->appendUpdate( $updates, 'ss_good_articles', $this->articles );
- $this->appendUpdate( $updates, 'ss_total_pages', $this->pages );
- $this->appendUpdate( $updates, 'ss_users', $this->users );
- $this->appendUpdate( $updates, 'ss_images', $this->images );
- if ( $updates != '' ) {
- $dbw->update( 'site_stats', array( $updates ), array(), __METHOD__ );
- }
+ wfGetDB( DB_MASTER )->onTransactionIdle( array( $this, 'tryDBUpdateInternal' ) );
+ }
+ }
- if ( $rate ) {
- // Decrement the async deltas now that we applied them
- $this->removePendingDeltas( $pd );
- // Commit the updates and unlock the table
- $dbw->unlock( $lockKey, __METHOD__ );
+ /**
+ * Do not call this outside of SiteStatsUpdate
+ *
+ * @return void
+ */
+ public function tryDBUpdateInternal() {
+ global $wgSiteStatsAsyncFactor;
+
+ $dbw = wfGetDB( DB_MASTER );
+ $lockKey = wfMemcKey( 'site_stats' ); // prepend wiki ID
+ if ( $wgSiteStatsAsyncFactor ) {
+ // Lock the table so we don't have double DB/memcached updates
+ if ( !$dbw->lockIsFree( $lockKey, __METHOD__ )
+ || !$dbw->lock( $lockKey, __METHOD__, 1 ) // 1 sec timeout
+ ) {
+ $this->doUpdatePendingDeltas();
+ return;
}
+ $pd = $this->getPendingDeltas();
+ // Piggy-back the async deltas onto those of this stats update....
+ $this->views += ( $pd['ss_total_views']['+'] - $pd['ss_total_views']['-'] );
+ $this->edits += ( $pd['ss_total_edits']['+'] - $pd['ss_total_edits']['-'] );
+ $this->articles += ( $pd['ss_good_articles']['+'] - $pd['ss_good_articles']['-'] );
+ $this->pages += ( $pd['ss_total_pages']['+'] - $pd['ss_total_pages']['-'] );
+ $this->users += ( $pd['ss_users']['+'] - $pd['ss_users']['-'] );
+ $this->images += ( $pd['ss_images']['+'] - $pd['ss_images']['-'] );
+ }
+
+ // Build up an SQL query of deltas and apply them...
+ $updates = '';
+ $this->appendUpdate( $updates, 'ss_total_views', $this->views );
+ $this->appendUpdate( $updates, 'ss_total_edits', $this->edits );
+ $this->appendUpdate( $updates, 'ss_good_articles', $this->articles );
+ $this->appendUpdate( $updates, 'ss_total_pages', $this->pages );
+ $this->appendUpdate( $updates, 'ss_users', $this->users );
+ $this->appendUpdate( $updates, 'ss_images', $this->images );
+ if ( $updates != '' ) {
+ $dbw->update( 'site_stats', array( $updates ), array(), __METHOD__ );
+ }
- $dbw->commit( __METHOD__ );
+ if ( $wgSiteStatsAsyncFactor ) {
+ // Decrement the async deltas now that we applied them
+ $this->removePendingDeltas( $pd );
+ // Commit the updates and unlock the table
+ $dbw->unlock( $lockKey, __METHOD__ );
}
}
@@ -356,7 +366,7 @@ class SiteStatsUpdate implements DeferrableUpdate {
'rc_user != 0',
'rc_bot' => 0,
'rc_log_type != ' . $dbr->addQuotes( 'newusers' ) . ' OR rc_log_type IS NULL',
- 'rc_timestamp >= ' . $dbr->addQuotes( $dbr->timestamp( wfTimestamp( TS_UNIX ) - $wgActiveUserDays*24*3600 ) ),
+ 'rc_timestamp >= ' . $dbr->addQuotes( $dbr->timestamp( wfTimestamp( TS_UNIX ) - $wgActiveUserDays * 24 * 3600 ) ),
),
__METHOD__
);
@@ -592,19 +602,19 @@ class SiteStatsInit {
$counter->files();
// Only do views if we don't want to not count them
- if( $options['views'] ) {
+ if ( $options['views'] ) {
$counter->views();
}
// Update/refresh
- if( $options['update'] ) {
+ if ( $options['update'] ) {
$counter->update();
} else {
$counter->refresh();
}
// Count active users if need be
- if( $options['activeUsers'] ) {
+ if ( $options['activeUsers'] ) {
SiteStatsUpdate::cacheUpdate( wfGetDB( DB_MASTER ) );
}
}
diff --git a/includes/Skin.php b/includes/Skin.php
index 0cc1086c..5801806c 100644
--- a/includes/Skin.php
+++ b/includes/Skin.php
@@ -25,7 +25,7 @@
*/
/**
- * The main skin class that provide methods and properties for all other skins.
+ * The main skin class which provides methods and properties for all other skins.
* This base class is also the "Standard" skin.
*
* See docs/skin.txt for more information.
@@ -56,17 +56,19 @@ abstract class Skin extends ContextSource {
$skinDir = dir( $wgStyleDirectory );
- # while code from www.php.net
- while ( false !== ( $file = $skinDir->read() ) ) {
- // Skip non-PHP files, hidden files, and '.dep' includes
- $matches = array();
+ if ( $skinDir !== false && $skinDir !== null ) {
+ # while code from www.php.net
+ while ( false !== ( $file = $skinDir->read() ) ) {
+ // Skip non-PHP files, hidden files, and '.dep' includes
+ $matches = array();
- if ( preg_match( '/^([^.]*)\.php$/', $file, $matches ) ) {
- $aSkin = $matches[1];
- $wgValidSkinNames[strtolower( $aSkin )] = $aSkin;
+ if ( preg_match( '/^([^.]*)\.php$/', $file, $matches ) ) {
+ $aSkin = $matches[1];
+ $wgValidSkinNames[strtolower( $aSkin )] = $aSkin;
+ }
}
+ $skinDir->close();
}
- $skinDir->close();
$skinsInitialised = true;
wfProfileOut( __METHOD__ . '-init' );
}
@@ -79,14 +81,15 @@ abstract class Skin extends ContextSource {
*/
static function getSkinNameMessages() {
$messages = array();
- foreach( self::getSkinNames() as $skinKey => $skinName ) {
+ foreach ( self::getSkinNames() as $skinKey => $skinName ) {
+ // Messages: skinname-cologneblue, skinname-monobook, skinname-modern, skinname-vector
$messages[] = "skinname-$skinKey";
}
return $messages;
}
/**
- * Fetch the list of usable skins in regards to $wgSkipSkins.
+ * Fetch the list of user-selectable skins in regards to $wgSkipSkins.
* Useful for Special:Preferences and other places where you
* only want to show skins users _can_ use.
* @return array of strings
@@ -94,13 +97,13 @@ abstract class Skin extends ContextSource {
public static function getUsableSkins() {
global $wgSkipSkins;
- $usableSkins = self::getSkinNames();
+ $allowedSkins = self::getSkinNames();
foreach ( $wgSkipSkins as $skip ) {
- unset( $usableSkins[$skip] );
+ unset( $allowedSkins[$skip] );
}
- return $usableSkins;
+ return $allowedSkins;
}
/**
@@ -129,7 +132,6 @@ abstract class Skin extends ContextSource {
// in the user preferences.
$fallback = array(
0 => $wgDefaultSkin,
- 1 => 'nostalgia',
2 => 'cologneblue'
);
@@ -161,23 +163,19 @@ abstract class Skin extends ContextSource {
$className = "Skin{$skinName}";
# Grab the skin class and initialise it.
- if ( !MWInit::classExists( $className ) ) {
+ if ( !class_exists( $className ) ) {
- if ( !defined( 'MW_COMPILED' ) ) {
- require_once( "{$wgStyleDirectory}/{$skinName}.php" );
- }
+ require_once "{$wgStyleDirectory}/{$skinName}.php";
# Check if we got if not fallback to default skin
- if ( !MWInit::classExists( $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 = 'SkinVector';
- if ( !defined( 'MW_COMPILED' ) ) {
- require_once( "{$wgStyleDirectory}/Vector.php" );
- }
+ require_once "{$wgStyleDirectory}/Vector.php";
}
}
$skin = new $className( $key );
@@ -201,6 +199,68 @@ abstract class Skin extends ContextSource {
}
/**
+ * Defines the ResourceLoader modules that should be added to the skin
+ * It is recommended that skins wishing to override call parent::getDefaultModules()
+ * and substitute out any modules they wish to change by using a key to look them up
+ * @return Array of modules with helper keys for easy overriding
+ */
+ public function getDefaultModules() {
+ global $wgIncludeLegacyJavaScript, $wgPreloadJavaScriptMwUtil, $wgUseAjax,
+ $wgAjaxWatch, $wgEnableAPI, $wgEnableWriteAPI;
+
+ $out = $this->getOutput();
+ $user = $out->getUser();
+ $modules = array(
+ // modules that enhance the page content in some way
+ 'content' => array(
+ 'mediawiki.page.ready',
+ ),
+ // modules that exist for legacy reasons
+ 'legacy' => array(),
+ // modules relating to search functionality
+ 'search' => array(),
+ // modules relating to functionality relating to watching an article
+ 'watch' => array(),
+ // modules which relate to the current users preferences
+ 'user' => array(),
+ );
+ if ( $wgIncludeLegacyJavaScript ) {
+ $modules['legacy'][] = 'mediawiki.legacy.wikibits';
+ }
+
+ if ( $wgPreloadJavaScriptMwUtil ) {
+ $modules['legacy'][] = 'mediawiki.util';
+ }
+
+ // Add various resources if required
+ if ( $wgUseAjax ) {
+ $modules['legacy'][] = 'mediawiki.legacy.ajax';
+
+ if ( $wgEnableAPI ) {
+ if ( $wgEnableWriteAPI && $wgAjaxWatch && $user->isLoggedIn()
+ && $user->isAllowed( 'writeapi' )
+ ) {
+ $modules['watch'][] = 'mediawiki.page.watch.ajax';
+ }
+
+ if ( !$user->getOption( 'disablesuggest', false ) ) {
+ $modules['search'][] = 'mediawiki.searchSuggest';
+ }
+ }
+ }
+
+ if ( $user->getBoolOption( 'editsectiononrightclick' ) ) {
+ $modules['user'][] = 'mediawiki.action.view.rightClickEdit';
+ }
+
+ // Crazy edit-on-double-click stuff
+ if ( $out->isArticle() && $user->getOption( 'editondblclick' ) ) {
+ $modules['user'][] = 'mediawiki.action.view.dblClickEdit';
+ }
+ return $modules;
+ }
+
+ /**
* Preload the existence of three commonly-requested pages in a single query
*/
function preloadExistence() {
@@ -290,7 +350,7 @@ abstract class Skin extends ContextSource {
return $this->mRelevantUser;
}
$title = $this->getRelevantTitle();
- if( $title->hasSubjectNamespace( NS_USER ) ) {
+ if ( $title->hasSubjectNamespace( NS_USER ) ) {
$rootUser = $title->getRootText();
if ( User::isIP( $rootUser ) ) {
$this->mRelevantUser = User::newFromName( $rootUser, false );
@@ -667,7 +727,7 @@ abstract class Skin extends ContextSource {
if ( $c > 1 ) {
$subpages .= $wgLang->getDirMarkEntity() . $this->msg( 'pipe-separator' )->escaped();
- } else {
+ } else {
$subpages .= '&lt; ';
}
@@ -1014,7 +1074,7 @@ abstract class Skin extends ContextSource {
*/
static function makeSpecialUrl( $name, $urlaction = '', $proto = null ) {
$title = SpecialPage::getSafeTitleFor( $name );
- if( is_null( $proto ) ) {
+ if ( is_null( $proto ) ) {
return $title->getLocalURL( $urlaction );
} else {
return $title->getFullURL( $urlaction, false, $proto );
@@ -1252,7 +1312,7 @@ abstract class Skin extends ContextSource {
}
global $wgExternalLinkTarget;
- if ( $wgExternalLinkTarget) {
+ if ( $wgExternalLinkTarget ) {
$extraAttribs['target'] = $wgExternalLinkTarget;
}
} else {
@@ -1282,28 +1342,43 @@ abstract class Skin extends ContextSource {
}
/**
- * Should we load mediawiki.legacy.wikiprintable? Skins that have their own
- * print stylesheet should override this and return false. (This is an
- * ugly hack to get Monobook to play nicely with OutputPage::headElement().)
+ * This function previously controlled whether the 'mediawiki.legacy.wikiprintable' module
+ * should be loaded by OutputPage. That module no longer exists and the return value of this
+ * method is ignored.
*
+ * If your skin doesn't provide its own print styles, the 'mediawiki.legacy.commonPrint' module
+ * can be used instead (SkinTemplate-based skins do it automatically).
+ *
+ * @deprecated since 1.22
* @return bool
*/
public function commonPrintStylesheet() {
- return true;
+ wfDeprecated( __METHOD__, '1.22' );
+ return false;
}
/**
- * Gets new talk page messages for the current user.
- * @return MediaWiki message or if no new talk page messages, nothing
+ * Gets new talk page messages for the current user and returns an
+ * appropriate alert message (or an empty string if there are no messages)
+ * @return String
*/
function getNewtalks() {
+
+ $newMessagesAlert = '';
+ $user = $this->getUser();
+ $newtalks = $user->getNewMessageLinks();
$out = $this->getOutput();
- $newtalks = $this->getUser()->getNewMessageLinks();
- $ntl = '';
+ // Allow extensions to disable or modify the new messages alert
+ if ( !wfRunHooks( 'GetNewMessagesAlert', array( &$newMessagesAlert, $newtalks, $user, $out ) ) ) {
+ return '';
+ }
+ if ( $newMessagesAlert ) {
+ return $newMessagesAlert;
+ }
if ( count( $newtalks ) == 1 && $newtalks[0]['wiki'] === wfWikiID() ) {
- $uTalkTitle = $this->getUser()->getTalkPage();
+ $uTalkTitle = $user->getTalkPage();
if ( !$uTalkTitle->equals( $out->getTitle() ) ) {
$lastSeenRev = isset( $newtalks[0]['rev'] ) ? $newtalks[0]['rev'] : null;
@@ -1342,26 +1417,25 @@ abstract class Skin extends ContextSource {
);
if ( $nofAuthors >= 1 && $nofAuthors <= 10 ) {
- $ntl = $this->msg(
+ $newMessagesAlert = $this->msg(
'youhavenewmessagesfromusers',
$newMessagesLink,
$newMessagesDiffLink
)->numParams( $nofAuthors );
} else {
// $nofAuthors === 11 signifies "11 or more" ("more than 10")
- $ntl = $this->msg(
+ $newMessagesAlert = $this->msg(
$nofAuthors > 10 ? 'youhavenewmessagesmanyusers' : 'youhavenewmessages',
$newMessagesLink,
$newMessagesDiffLink
);
}
- $ntl = $ntl->text();
+ $newMessagesAlert = $newMessagesAlert->text();
# Disable Squid cache
$out->setSquidMaxage( 0 );
}
} elseif ( count( $newtalks ) ) {
- // _>" " for BC <= 1.16
- $sep = str_replace( '_', ' ', $this->msg( 'newtalkseparator' )->escaped() );
+ $sep = $this->msg( 'newtalkseparator' )->escaped();
$msgs = array();
foreach ( $newtalks as $newtalk ) {
@@ -1371,11 +1445,11 @@ abstract class Skin extends ContextSource {
);
}
$parts = implode( $sep, $msgs );
- $ntl = $this->msg( 'youhavenewmessagesmulti' )->rawParams( $parts )->escaped();
+ $newMessagesAlert = $this->msg( 'youhavenewmessagesmulti' )->rawParams( $parts )->escaped();
$out->setSquidMaxage( 0 );
}
- return $ntl;
+ return $newMessagesAlert;
}
/**
@@ -1391,17 +1465,17 @@ abstract class Skin extends ContextSource {
$needParse = false;
- if( $name === 'default' ) {
+ if ( $name === 'default' ) {
// special case
global $wgSiteNotice;
$notice = $wgSiteNotice;
- if( empty( $notice ) ) {
+ if ( empty( $notice ) ) {
wfProfileOut( __METHOD__ );
return false;
}
} else {
$msg = $this->msg( $name )->inContentLanguage();
- if( $msg->isDisabled() ) {
+ if ( $msg->isDisabled() ) {
wfProfileOut( __METHOD__ );
return false;
}
@@ -1411,8 +1485,8 @@ abstract class Skin extends ContextSource {
// Use the extra hash appender to let eg SSL variants separately cache.
$key = wfMemcKey( $name . $wgRenderHashAppend );
$cachedNotice = $parserMemc->get( $key );
- if( is_array( $cachedNotice ) ) {
- if( md5( $notice ) == $cachedNotice['hash'] ) {
+ if ( is_array( $cachedNotice ) ) {
+ if ( md5( $notice ) == $cachedNotice['hash'] ) {
$notice = $cachedNotice['html'];
} else {
$needParse = true;
@@ -1515,31 +1589,12 @@ abstract class Skin extends ContextSource {
array( 'noclasses', 'known' )
);
- # Run the old hook. This takes up half of the function . . . hopefully
- # we can rid of it someday.
- $attribs = '';
- if ( $tooltip ) {
- $attribs = wfMessage( 'editsectionhint' )->rawParams( $tooltip )
- ->inLanguage( $lang )->escaped();
- $attribs = " title=\"$attribs\"";
- }
- $result = null;
- 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 = wfMessage( 'editsection-brackets' )->rawParams( $result )
- ->inLanguage( $lang )->escaped();
- 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 = wfMessage( 'editsection-brackets' )->rawParams( $link )
- ->inLanguage( $lang )->escaped();
- $result = "<span class=\"editsection\">$result</span>";
+ # Add the brackets and the span and run the hook.
+ $result = '<span class="mw-editsection">'
+ . '<span class="mw-editsection-bracket">[</span>'
+ . $link
+ . '<span class="mw-editsection-bracket">]</span>'
+ . '</span>';
wfRunHooks( 'DoEditSectionLink', array( $this, $nt, $section, $tooltip, &$result, $lang ) );
return $result;
@@ -1557,6 +1612,7 @@ abstract class Skin extends ContextSource {
function __call( $fname, $args ) {
$realFunction = array( 'Linker', $fname );
if ( is_callable( $realFunction ) ) {
+ wfDeprecated( get_class( $this ) . '::' . $fname, '1.21' );
return call_user_func_array( $realFunction, $args );
} else {
$className = get_class( $this );
diff --git a/includes/SkinLegacy.php b/includes/SkinLegacy.php
deleted file mode 100644
index b9766a9f..00000000
--- a/includes/SkinLegacy.php
+++ /dev/null
@@ -1,882 +0,0 @@
-<?php
-/**
- * Base class for legacy 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
- */
-
-class SkinLegacy extends SkinTemplate {
- var $useHeadElement = true;
- protected $mWatchLinkNum = 0; // Appended to end of watch link id's
-
- /**
- * Add skin specific stylesheets
- * @param $out OutputPage
- */
- function setupSkinUserCss( OutputPage $out ) {
- $out->addModuleStyles( 'mediawiki.legacy.shared' );
- $out->addModuleStyles( 'mediawiki.legacy.oldshared' );
- }
-
- public function commonPrintStylesheet() {
- return true;
- }
-
- /**
- * This was for the old skins and for users with 640x480 screen.
- * Please note old skins are still used and might prove useful for
- * users having old computers or visually impaired.
- */
- var $mSuppressQuickbar = false;
-
- /**
- * Suppress the quickbar from the output, only for skin supporting
- * the quickbar
- */
- public function suppressQuickbar() {
- $this->mSuppressQuickbar = true;
- }
-
- /**
- * Return whether the quickbar should be suppressed from the output
- *
- * @return Boolean
- */
- public function isQuickbarSuppressed() {
- return $this->mSuppressQuickbar;
- }
-
- function qbSetting() {
- global $wgUser;
- if ( $this->isQuickbarSuppressed() ) {
- return 0;
- }
- $q = $wgUser->getOption( 'quickbar', 0 );
- if( $q == 5 ) {
- # 5 is the default, which chooses the setting
- # depending on the directionality of your interface language
- global $wgLang;
- return $wgLang->isRTL() ? 2 : 1;
- }
- return $q;
- }
-
-}
-
-class LegacyTemplate extends BaseTemplate {
-
- // How many search boxes have we made? Avoid duplicate id's.
- protected $searchboxes = '';
-
- function execute() {
- $this->html( 'headelement' );
- echo $this->beforeContent();
- $this->html( 'bodytext' );
- echo "\n";
- echo $this->afterContent();
- $this->html( 'dataAfterContent' );
- $this->printTrail();
- echo "\n</body></html>";
- }
-
- /**
- * This will be called immediately after the "<body>" tag. Split into
- * two functions to make it easier to subclass.
- * @return string
- */
- function beforeContent() {
- return $this->doBeforeContent();
- }
-
- function doBeforeContent() {
- global $wgLang;
- wfProfileIn( __METHOD__ );
-
- $s = '';
-
- $langlinks = $this->otherLanguages();
- if ( $langlinks ) {
- $rows = 2;
- $borderhack = '';
- } else {
- $rows = 1;
- $langlinks = false;
- $borderhack = 'class="top"';
- }
-
- $s .= "\n<div id='content'>\n<div id='topbar'>\n" .
- "<table cellspacing='0' style='width: 100%;'>\n<tr>\n";
-
- if ( $this->getSkin()->qbSetting() == 0 ) {
- $s .= "<td class='top' style='text-align: left; vertical-align: top;' rowspan='{$rows}'>\n" .
- $this->getSkin()->logoText( $wgLang->alignStart() ) . '</td>';
- }
-
- $l = $wgLang->alignStart();
- $s .= "<td {$borderhack} style='text-align: $l; vertical-align: top;'>\n";
-
- $s .= $this->topLinks();
- $s .= '<p class="subtitle">' . $this->pageTitleLinks() . "</p>\n";
-
- $r = $wgLang->alignEnd();
- $s .= "</td>\n<td {$borderhack} style='text-align: $r; vertical-align: top;' nowrap='nowrap'>";
- $s .= $this->nameAndLogin();
- $s .= "\n<br />" . $this->searchForm() . '</td>';
-
- if ( $langlinks ) {
- $s .= "</tr>\n<tr>\n<td class='top' colspan=\"2\">$langlinks</td>\n";
- }
-
- $s .= "</tr>\n</table>\n</div>\n";
- $s .= "\n<div id='article'>\n";
-
- $notice = $this->getSkin()->getSiteNotice();
-
- if ( $notice ) {
- $s .= "\n<div id='siteNotice'>$notice</div>\n";
- }
- $s .= $this->pageTitle();
- $s .= $this->pageSubtitle();
- $s .= $this->getSkin()->getCategories();
-
- wfProfileOut( __METHOD__ );
- return $s;
- }
-
- /**
- * This gets called shortly before the "</body>" tag.
- * @return String HTML to be put before "</body>"
- */
- function afterContent() {
- return $this->doAfterContent();
- }
-
- /** overloaded by derived classes
- * @return string
- */
- function doAfterContent() {
- return '</div></div>';
- }
-
- function searchForm() {
- global $wgRequest, $wgUseTwoButtonsSearchForm;
-
- $search = $wgRequest->getText( 'search' );
-
- $s = '<form id="searchform' . $this->searchboxes . '" name="search" class="inline" method="post" action="'
- . $this->getSkin()->escapeSearchLink() . "\">\n"
- . '<input type="text" id="searchInput' . $this->searchboxes . '" name="search" size="19" value="'
- . htmlspecialchars( substr( $search, 0, 256 ) ) . "\" />\n"
- . '<input type="submit" name="go" value="' . wfMessage( 'searcharticle' )->text() . '" />';
-
- if ( $wgUseTwoButtonsSearchForm ) {
- $s .= '&#160;<input type="submit" name="fulltext" value="' . wfMessage( 'searchbutton' )->text() . "\" />\n";
- } else {
- $s .= ' <a href="' . $this->getSkin()->escapeSearchLink() . '" rel="search">' . wfMessage( 'powersearch-legend' )->text() . "</a>\n";
- }
-
- $s .= '</form>';
-
- // Ensure unique id's for search boxes made after the first
- $this->searchboxes = $this->searchboxes == '' ? 2 : $this->searchboxes + 1;
-
- return $s;
- }
-
- function pageStats() {
- $ret = array();
- $items = array( 'viewcount', 'credits', 'lastmod', 'numberofwatchingusers', 'copyright' );
-
- foreach( $items as $item ) {
- if ( $this->data[$item] !== false ) {
- $ret[] = $this->data[$item];
- }
- }
-
- return implode( ' ', $ret );
- }
-
- function topLinks() {
- global $wgOut;
-
- $s = array(
- $this->getSkin()->mainPageLink(),
- Linker::specialLink( 'Recentchanges' )
- );
-
- if ( $wgOut->isArticleRelated() ) {
- $s[] = $this->editThisPage();
- $s[] = $this->historyLink();
- }
-
- # Many people don't like this dropdown box
- # $s[] = $this->specialPagesList();
-
- if ( $this->variantLinks() ) {
- $s[] = $this->variantLinks();
- }
-
- if ( $this->extensionTabLinks() ) {
- $s[] = $this->extensionTabLinks();
- }
-
- // @todo FIXME: Is using Language::pipeList impossible here? Do not quite understand the use of the newline
- return implode( $s, wfMessage( 'pipe-separator' )->escaped() . "\n" );
- }
-
- /**
- * Language/charset variant links for classic-style skins
- * @return string
- */
- function variantLinks() {
- $s = '';
-
- /* show links to different language variants */
- global $wgDisableLangConversion, $wgLang;
-
- $title = $this->getSkin()->getTitle();
- $lang = $title->getPageLanguage();
- $variants = $lang->getVariants();
-
- if ( !$wgDisableLangConversion && count( $variants ) > 1
- && !$title->isSpecialPage() ) {
- foreach ( $variants as $code ) {
- $varname = $lang->getVariantname( $code );
-
- if ( $varname == 'disable' ) {
- continue;
- }
- $s = $wgLang->pipeList( array(
- $s,
- '<a href="' . htmlspecialchars( $title->getLocalURL( 'variant=' . $code ) ) . '" lang="' . $code . '" hreflang="' . $code . '">' . htmlspecialchars( $varname ) . '</a>'
- ) );
- }
- }
-
- return $s;
- }
-
- /**
- * Compatibility for extensions adding functionality through tabs.
- * Eventually these old skins should be replaced with SkinTemplate-based
- * versions, sigh...
- * @return string
- * @todo Exterminate! ...that, and replace it with normal SkinTemplate stuff
- */
- function extensionTabLinks() {
- $tabs = array();
- $out = '';
- $s = array();
- wfRunHooks( 'SkinTemplateTabs', array( $this->getSkin(), &$tabs ) );
- foreach ( $tabs as $tab ) {
- $s[] = Xml::element( 'a',
- array( 'href' => $tab['href'] ),
- $tab['text'] );
- }
-
- if ( count( $s ) ) {
- global $wgLang;
-
- $out = wfMessage( 'pipe-separator' )->escaped();
- $out .= $wgLang->pipeList( $s );
- }
-
- return $out;
- }
-
- function bottomLinks() {
- global $wgOut, $wgUser;
- $sep = wfMessage( 'pipe-separator' )->escaped() . "\n";
-
- $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();
-
- $title = $this->getSkin()->getTitle();
-
- if (
- $title->getNamespace() == NS_USER ||
- $title->getNamespace() == NS_USER_TALK
- ) {
- $id = User::idFromName( $title->getText() );
- $ip = User::isIP( $title->getText() );
-
- # Both anons and non-anons have contributions list
- if ( $id || $ip ) {
- $element[] = $this->userContribsLink();
- }
-
- if ( $this->getSkin()->showEmailUser( $id ) ) {
- $element[] = $this->emailUserLink();
- }
- }
-
- $s = implode( $element, $sep );
-
- if ( $title->getArticleID() ) {
- $s .= "\n<br />";
-
- // Delete/protect/move links for privileged users
- if ( $wgUser->isAllowed( 'delete' ) ) {
- $s .= $this->deleteThisPage();
- }
-
- if ( $wgUser->isAllowed( 'protect' ) && $title->getRestrictionTypes() ) {
- $s .= $sep . $this->protectThisPage();
- }
-
- if ( $wgUser->isAllowed( 'move' ) ) {
- $s .= $sep . $this->moveThisPage();
- }
- }
-
- $s .= "<br />\n" . $this->otherLanguages();
- }
-
- return $s;
- }
-
- function otherLanguages() {
- global $wgOut, $wgLang, $wgHideInterlanguageLinks;
-
- if ( $wgHideInterlanguageLinks ) {
- return '';
- }
-
- $a = $wgOut->getLanguageLinks();
-
- if ( 0 == count( $a ) ) {
- return '';
- }
-
- $s = wfMessage( 'otherlanguages' )->text() . wfMessage( 'colon-separator' )->text();
- $first = true;
-
- if ( $wgLang->isRTL() ) {
- $s .= '<span dir="ltr">';
- }
-
- foreach ( $a as $l ) {
- if ( !$first ) {
- $s .= wfMessage( 'pipe-separator' )->escaped();
- }
-
- $first = false;
-
- $nt = Title::newFromText( $l );
- $text = Language::fetchLanguageName( $nt->getInterwiki() );
-
- $s .= Html::element( 'a',
- array( 'href' => $nt->getFullURL(), 'title' => $nt->getText(), 'class' => "external" ),
- $text == '' ? $l : $text );
- }
-
- if ( $wgLang->isRTL() ) {
- $s .= '</span>';
- }
-
- return $s;
- }
-
- /**
- * Show a drop-down box of special pages
- * @return string
- */
- function specialPagesList() {
- global $wgScript;
-
- $select = new XmlSelect( 'title' );
- $pages = SpecialPageFactory::getUsablePages();
- array_unshift( $pages, SpecialPageFactory::getPage( 'SpecialPages' ) );
- foreach ( $pages as $obj ) {
- $select->addOption( $obj->getDescription(),
- $obj->getTitle()->getPrefixedDBkey() );
- }
-
- return Html::rawElement( 'form',
- array( 'id' => 'specialpages', 'method' => 'get', 'action' => $wgScript ),
- $select->getHTML() . Xml::submitButton( wfMessage( 'go' )->text() ) );
- }
-
- function pageTitleLinks() {
- global $wgOut, $wgUser, $wgRequest, $wgLang;
-
- $oldid = $wgRequest->getVal( 'oldid' );
- $diff = $wgRequest->getVal( 'diff' );
- $action = $wgRequest->getText( 'action' );
-
- $skin = $this->getSkin();
- $title = $skin->getTitle();
-
- $s[] = $this->printableLink();
- $disclaimer = $skin->disclaimerLink(); # may be empty
-
- if ( $disclaimer ) {
- $s[] = $disclaimer;
- }
-
- $privacy = $skin->privacyLink(); # may be empty too
-
- if ( $privacy ) {
- $s[] = $privacy;
- }
-
- if ( $wgOut->isArticleRelated() ) {
- if ( $title->getNamespace() == NS_FILE ) {
- $image = wfFindFile( $title );
-
- if ( $image ) {
- $href = $image->getURL();
- $s[] = Html::element( 'a', array( 'href' => $href,
- 'title' => $href ), $title->getText() );
-
- }
- }
- }
-
- if ( 'history' == $action || isset( $diff ) || isset( $oldid ) ) {
- $s[] .= Linker::linkKnown(
- $title,
- wfMessage( 'currentrev' )->text()
- );
- }
-
- if ( $wgUser->getNewtalk() ) {
- # do not show "You have new messages" text when we are viewing our
- # own talk page
- if ( !$title->equals( $wgUser->getTalkPage() ) ) {
- $tl = Linker::linkKnown(
- $wgUser->getTalkPage(),
- wfMessage( 'newmessageslink' )->escaped(),
- array(),
- array( 'redirect' => 'no' )
- );
-
- $dl = Linker::linkKnown(
- $wgUser->getTalkPage(),
- wfMessage( 'newmessagesdifflink' )->escaped(),
- array(),
- array( 'diff' => 'cur' )
- );
- $s[] = '<strong>' . wfMessage( 'youhavenewmessages', $tl, $dl )->text() . '</strong>';
- # disable caching
- $wgOut->setSquidMaxage( 0 );
- $wgOut->enableClientCache( false );
- }
- }
-
- $undelete = $skin->getUndeleteLink();
-
- if ( !empty( $undelete ) ) {
- $s[] = $undelete;
- }
-
- return $wgLang->pipeList( $s );
- }
-
- /**
- * Gets the h1 element with the page title.
- * @return string
- */
- function pageTitle() {
- global $wgOut;
- $s = '<h1 class="pagetitle"><span dir="auto">' . $wgOut->getPageTitle() . '</span></h1>';
- return $s;
- }
-
- function pageSubtitle() {
- global $wgOut;
-
- $sub = $wgOut->getSubtitle();
-
- if ( $sub == '' ) {
- global $wgExtraSubtitle;
- $sub = wfMessage( 'tagline' )->parse() . $wgExtraSubtitle;
- }
-
- $subpages = $this->getSkin()->subPageSubtitle();
- $sub .= !empty( $subpages ) ? "</p><p class='subpages'>$subpages" : '';
- $s = "<p class='subtitle'>{$sub}</p>\n";
-
- return $s;
- }
-
- function printableLink() {
- global $wgOut, $wgRequest, $wgLang;
-
- $s = array();
-
- if ( !$wgOut->isPrintable() ) {
- $printurl = htmlspecialchars( $this->getSkin()->getTitle()->getLocalUrl(
- $wgRequest->appendQueryValue( 'printable', 'yes', true ) ) );
- $s[] = "<a href=\"$printurl\" rel=\"alternate\">"
- . wfMessage( 'printableversion' )->text() . '</a>';
- }
-
- if ( $wgOut->isSyndicated() ) {
- foreach ( $wgOut->getSyndicationLinks() as $format => $link ) {
- $feedurl = htmlspecialchars( $link );
- $s[] = "<a href=\"$feedurl\" rel=\"alternate\" type=\"application/{$format}+xml\""
- . " class=\"feedlink\">" . wfMessage( "feed-$format" )->escaped() . "</a>";
- }
- }
- return $wgLang->pipeList( $s );
- }
-
- /**
- * @deprecated in 1.19
- * @return string
- */
- function getQuickbarCompensator( $rows = 1 ) {
- wfDeprecated( __METHOD__, '1.19' );
- return "<td style='width: 152px;' rowspan='{$rows}'>&#160;</td>";
- }
-
- function editThisPage() {
- global $wgOut;
-
- if ( !$wgOut->isArticleRelated() ) {
- $s = wfMessage( 'protectedpage' )->text();
- } else {
- $title = $this->getSkin()->getTitle();
- if ( $title->quickUserCan( 'edit' ) && $title->exists() ) {
- $t = wfMessage( 'editthispage' )->text();
- } elseif ( $title->quickUserCan( 'create' ) && !$title->exists() ) {
- $t = wfMessage( 'create-this-page' )->text();
- } else {
- $t = wfMessage( 'viewsource' )->text();
- }
-
- $s = Linker::linkKnown(
- $title,
- $t,
- array(),
- $this->getSkin()->editUrlOptions()
- );
- }
-
- return $s;
- }
-
- function deleteThisPage() {
- global $wgUser, $wgRequest;
-
- $diff = $wgRequest->getVal( 'diff' );
- $title = $this->getSkin()->getTitle();
-
- if ( $title->getArticleID() && ( !$diff ) && $wgUser->isAllowed( 'delete' ) ) {
- $t = wfMessage( 'deletethispage' )->text();
-
- $s = Linker::linkKnown(
- $title,
- $t,
- array(),
- array( 'action' => 'delete' )
- );
- } else {
- $s = '';
- }
-
- return $s;
- }
-
- function protectThisPage() {
- global $wgUser, $wgRequest;
-
- $diff = $wgRequest->getVal( 'diff' );
- $title = $this->getSkin()->getTitle();
-
- if ( $title->getArticleID() && ( ! $diff ) && $wgUser->isAllowed( 'protect' ) && $title->getRestrictionTypes() ) {
- if ( $title->isProtected() ) {
- $text = wfMessage( 'unprotectthispage' )->text();
- $query = array( 'action' => 'unprotect' );
- } else {
- $text = wfMessage( 'protectthispage' )->text();
- $query = array( 'action' => 'protect' );
- }
-
- $s = Linker::linkKnown(
- $title,
- $text,
- array(),
- $query
- );
- } else {
- $s = '';
- }
-
- return $s;
- }
-
- function watchThisPage() {
- global $wgOut, $wgUser;
- ++$this->mWatchLinkNum;
-
- // Cache
- $title = $this->getSkin()->getTitle();
-
- if ( $wgOut->isArticleRelated() ) {
- if ( $wgUser->isWatched( $title ) ) {
- $text = wfMessage( 'unwatchthispage' )->text();
- $query = array(
- 'action' => 'unwatch',
- 'token' => UnwatchAction::getUnwatchToken( $title, $wgUser ),
- );
- $id = 'mw-unwatch-link' . $this->mWatchLinkNum;
- } else {
- $text = wfMessage( 'watchthispage' )->text();
- $query = array(
- 'action' => 'watch',
- 'token' => WatchAction::getWatchToken( $title, $wgUser ),
- );
- $id = 'mw-watch-link' . $this->mWatchLinkNum;
- }
-
- $s = Linker::linkKnown(
- $title,
- $text,
- array( 'id' => $id ),
- $query
- );
- } else {
- $s = wfMessage( 'notanarticle' )->text();
- }
-
- return $s;
- }
-
- function moveThisPage() {
- if ( $this->getSkin()->getTitle()->quickUserCan( 'move' ) ) {
- return Linker::linkKnown(
- SpecialPage::getTitleFor( 'Movepage' ),
- wfMessage( 'movethispage' )->text(),
- array(),
- array( 'target' => $this->getSkin()->getTitle()->getPrefixedDBkey() )
- );
- } else {
- // no message if page is protected - would be redundant
- return '';
- }
- }
-
- function historyLink() {
- return Linker::link(
- $this->getSkin()->getTitle(),
- wfMessage( 'history' )->escaped(),
- array( 'rel' => 'archives' ),
- array( 'action' => 'history' )
- );
- }
-
- function whatLinksHere() {
- return Linker::linkKnown(
- SpecialPage::getTitleFor( 'Whatlinkshere', $this->getSkin()->getTitle()->getPrefixedDBkey() ),
- wfMessage( 'whatlinkshere' )->escaped()
- );
- }
-
- function userContribsLink() {
- return Linker::linkKnown(
- SpecialPage::getTitleFor( 'Contributions', $this->getSkin()->getTitle()->getDBkey() ),
- wfMessage( 'contributions' )->escaped()
- );
- }
-
- function emailUserLink() {
- return Linker::linkKnown(
- SpecialPage::getTitleFor( 'Emailuser', $this->getSkin()->getTitle()->getDBkey() ),
- wfMessage( 'emailuser' )->escaped()
- );
- }
-
- function watchPageLinksLink() {
- global $wgOut;
-
- if ( !$wgOut->isArticleRelated() ) {
- return wfMessage( 'parentheses', wfMessage( 'notanarticle' )->text() )->escaped();
- } else {
- return Linker::linkKnown(
- SpecialPage::getTitleFor( 'Recentchangeslinked', $this->getSkin()->getTitle()->getPrefixedDBkey() ),
- wfMessage( 'recentchangeslinked-toolbox' )->escaped()
- );
- }
- }
-
- function talkLink() {
- $title = $this->getSkin()->getTitle();
- if ( NS_SPECIAL == $title->getNamespace() ) {
- # No discussion links for special pages
- return '';
- }
-
- $linkOptions = array();
-
- if ( $title->isTalkPage() ) {
- $link = $title->getSubjectPage();
- switch( $link->getNamespace() ) {
- case NS_MAIN:
- $text = wfMessage( 'articlepage' );
- break;
- case NS_USER:
- $text = wfMessage( 'userpage' );
- break;
- case NS_PROJECT:
- $text = wfMessage( 'projectpage' );
- break;
- case NS_FILE:
- $text = wfMessage( 'imagepage' );
- # Make link known if image exists, even if the desc. page doesn't.
- if ( wfFindFile( $link ) )
- $linkOptions[] = 'known';
- break;
- case NS_MEDIAWIKI:
- $text = wfMessage( 'mediawikipage' );
- break;
- case NS_TEMPLATE:
- $text = wfMessage( 'templatepage' );
- break;
- case NS_HELP:
- $text = wfMessage( 'viewhelppage' );
- break;
- case NS_CATEGORY:
- $text = wfMessage( 'categorypage' );
- break;
- default:
- $text = wfMessage( 'articlepage' );
- }
- } else {
- $link = $title->getTalkPage();
- $text = wfMessage( 'talkpage' );
- }
-
- $s = Linker::link( $link, $text->text(), array(), array(), $linkOptions );
-
- return $s;
- }
-
- function commentLink() {
- global $wgOut;
-
- $title = $this->getSkin()->getTitle();
- if ( $title->isSpecialPage() ) {
- return '';
- }
-
- # __NEWSECTIONLINK___ changes behavior here
- # If it is present, the link points to this page, otherwise
- # it points to the talk page
- if ( !$title->isTalkPage() && !$wgOut->showNewSectionLink() ) {
- $title = $title->getTalkPage();
- }
-
- return Linker::linkKnown(
- $title,
- wfMessage( 'postcomment' )->text(),
- array(),
- array(
- 'action' => 'edit',
- 'section' => 'new'
- )
- );
- }
-
- function getUploadLink() {
- global $wgUploadNavigationUrl;
-
- if ( $wgUploadNavigationUrl ) {
- # Using an empty class attribute to avoid automatic setting of "external" class
- return Linker::makeExternalLink( $wgUploadNavigationUrl,
- wfMessage( 'upload' )->escaped(),
- false, null, array( 'class' => '' ) );
- } else {
- return Linker::linkKnown(
- SpecialPage::getTitleFor( 'Upload' ),
- wfMessage( 'upload' )->escaped()
- );
- }
- }
-
- function nameAndLogin() {
- global $wgUser, $wgLang, $wgRequest;
-
- $returnTo = $this->getSkin()->getTitle();
- $ret = '';
-
- if ( $wgUser->isAnon() ) {
- if ( $this->getSkin()->showIPinHeader() ) {
- $name = $wgRequest->getIP();
-
- $talkLink = Linker::link( $wgUser->getTalkPage(),
- $wgLang->getNsText( NS_TALK ) );
- $talkLink = wfMessage( 'parentheses' )->rawParams( $talkLink )->escaped();
-
- $ret .= "$name $talkLink";
- } else {
- $ret .= wfMessage( 'notloggedin' )->text();
- }
-
- $query = array();
-
- if ( !$returnTo->isSpecial( 'Userlogout' ) ) {
- $query['returnto'] = $returnTo->getPrefixedDBkey();
- }
-
- $loginlink = $wgUser->isAllowed( 'createaccount' )
- ? 'nav-login-createaccount'
- : 'login';
- $ret .= "\n<br />" . Linker::link(
- SpecialPage::getTitleFor( 'Userlogin' ),
- wfMessage( $loginlink )->text(), array(), $query
- );
- } else {
- $talkLink = Linker::link( $wgUser->getTalkPage(),
- $wgLang->getNsText( NS_TALK ) );
- $talkLink = wfMessage( 'parentheses' )->rawParams( $talkLink )->escaped();
-
- $ret .= Linker::link( $wgUser->getUserPage(),
- htmlspecialchars( $wgUser->getName() ) );
- $ret .= " $talkLink<br />";
- $ret .= $wgLang->pipeList( array(
- Linker::link(
- SpecialPage::getTitleFor( 'Userlogout' ), wfMessage( 'logout' )->text(),
- array(), array( 'returnto' => $returnTo->getPrefixedDBkey() )
- ),
- Linker::specialLink( 'Preferences' ),
- ) );
- }
-
- $ret = $wgLang->pipeList( array(
- $ret,
- Linker::link(
- Title::newFromText( wfMessage( 'helppage' )->inContentLanguage()->text() ),
- wfMessage( 'help' )->text()
- ),
- ) );
-
- return $ret;
- }
-}
diff --git a/includes/SkinTemplate.php b/includes/SkinTemplate.php
index 59e1ccff..53f11998 100644
--- a/includes/SkinTemplate.php
+++ b/includes/SkinTemplate.php
@@ -43,7 +43,7 @@ class MediaWiki_I18N {
$value = wfMessage( $value )->text();
// interpolate variables
$m = array();
- while( preg_match( '/\$([0-9]*?)/sm', $value, $m ) ) {
+ while ( preg_match( '/\$([0-9]*?)/sm', $value, $m ) ) {
list( $src, $var ) = $m;
wfSuppressWarnings();
$varValue = $this->_context[$var];
@@ -123,38 +123,61 @@ class SkinTemplate extends Skin {
}
/**
- * initialize various variables and generate the template
+ * Generates array of language links for the current page
*
- * @param $out OutputPage
+ * @return array
+ * @public
*/
- function outputPage( OutputPage $out=null ) {
- global $wgContLang;
- global $wgScript, $wgStylePath;
- global $wgMimeType, $wgJsMimeType;
- global $wgXhtmlDefaultNamespace, $wgXhtmlNamespaces, $wgHtml5Version;
- global $wgDisableCounters, $wgSitename, $wgLogo, $wgHideInterlanguageLinks;
- global $wgMaxCredits, $wgShowCreditsIfMax;
- global $wgPageShowWatchingUsers;
- global $wgArticlePath, $wgScriptPath, $wgServer;
+ public function getLanguages() {
+ global $wgHideInterlanguageLinks;
+ $out = $this->getOutput();
+ $userLang = $this->getLanguage();
- wfProfileIn( __METHOD__ );
- Profiler::instance()->setTemplated( true );
+ # Language links
+ $language_urls = array();
- $oldContext = null;
- if ( $out !== null ) {
- // @todo Add wfDeprecated in 1.20
- $oldContext = $this->getContext();
- $this->setContext( $out->getContext() );
+ if ( !$wgHideInterlanguageLinks ) {
+ foreach ( $out->getLanguageLinks() as $languageLinkText ) {
+ $languageLinkParts = explode( ':', $languageLinkText, 2 );
+ $class = 'interwiki-' . $languageLinkParts[0];
+ unset( $languageLinkParts );
+ $languageLinkTitle = Title::newFromText( $languageLinkText );
+ if ( $languageLinkTitle ) {
+ $ilInterwikiCode = $languageLinkTitle->getInterwiki();
+ $ilLangName = Language::fetchLanguageName( $ilInterwikiCode );
+
+ if ( strval( $ilLangName ) === '' ) {
+ $ilLangName = $languageLinkText;
+ } else {
+ $ilLangName = $this->formatLanguageName( $ilLangName );
+ }
+
+ // CLDR extension or similar is required to localize the language name;
+ // otherwise we'll end up with the autonym again.
+ $ilLangLocalName = Language::fetchLanguageName( $ilInterwikiCode, $userLang->getCode() );
+
+ $language_urls[] = array(
+ 'href' => $languageLinkTitle->getFullURL(),
+ 'text' => $ilLangName,
+ 'title' => wfMessage( 'interlanguage-link-title', $languageLinkTitle->getText(), $ilLangLocalName )->text(),
+ 'class' => $class,
+ 'lang' => wfBCP47( $ilInterwikiCode ),
+ 'hreflang' => wfBCP47( $ilInterwikiCode ),
+ );
+ }
+ }
}
+ return $language_urls;
+ }
+
+ protected function setupTemplateForOutput() {
+ wfProfileIn( __METHOD__ );
- $out = $this->getOutput();
$request = $this->getRequest();
$user = $this->getUser();
$title = $this->getTitle();
wfProfileIn( __METHOD__ . '-init' );
- $this->initPage( $out );
-
$tpl = $this->setupTemplate( $this->template, 'skins' );
wfProfileOut( __METHOD__ . '-init' );
@@ -183,6 +206,47 @@ class SkinTemplate extends Skin {
wfProfileOut( __METHOD__ . '-stuff' );
+ wfProfileOut( __METHOD__ );
+
+ return $tpl;
+ }
+
+ /**
+ * initialize various variables and generate the template
+ *
+ * @param $out OutputPage
+ */
+ function outputPage( OutputPage $out = null ) {
+ global $wgContLang;
+ global $wgScript, $wgStylePath;
+ global $wgMimeType, $wgJsMimeType;
+ global $wgXhtmlNamespaces, $wgHtml5Version;
+ global $wgDisableCounters, $wgSitename, $wgLogo;
+ global $wgMaxCredits, $wgShowCreditsIfMax;
+ global $wgPageShowWatchingUsers;
+ global $wgArticlePath, $wgScriptPath, $wgServer;
+
+ wfProfileIn( __METHOD__ );
+ Profiler::instance()->setTemplated( true );
+
+ $oldContext = null;
+ if ( $out !== null ) {
+ // @todo Add wfDeprecated in 1.20
+ $oldContext = $this->getContext();
+ $this->setContext( $out->getContext() );
+ }
+
+ $out = $this->getOutput();
+ $request = $this->getRequest();
+ $user = $this->getUser();
+ $title = $this->getTitle();
+
+ wfProfileIn( __METHOD__ . '-init' );
+ $this->initPage( $out );
+ wfProfileOut( __METHOD__ . '-init' );
+
+ $tpl = $this->setupTemplateForOutput();
+
wfProfileIn( __METHOD__ . '-stuff-head' );
if ( !$this->useHeadElement ) {
$tpl->set( 'pagecss', false );
@@ -193,7 +257,7 @@ class SkinTemplate extends Skin {
$tpl->set( 'jsvarurl', false );
- $tpl->setRef( 'xhtmldefaultnamespace', $wgXhtmlDefaultNamespace );
+ $tpl->set( 'xhtmldefaultnamespace', 'http://www.w3.org/1999/xhtml' );
$tpl->set( 'xhtmlnamespaces', $wgXhtmlNamespaces );
$tpl->set( 'html5version', $wgHtml5Version );
$tpl->set( 'headlinks', $out->getHeadLinks() );
@@ -229,10 +293,11 @@ class SkinTemplate extends Skin {
}
$tpl->set( 'catlinks', $this->getCategories() );
- if( $out->isSyndicated() ) {
+ if ( $out->isSyndicated() ) {
$feeds = array();
- foreach( $out->getSyndicationLinks() as $format => $link ) {
+ foreach ( $out->getSyndicationLinks() as $format => $link ) {
$feeds[$format] = array(
+ // Messages: feed-atom, feed-rss
'text' => $this->msg( "feed-$format" )->text(),
'href' => $link
);
@@ -280,7 +345,7 @@ class SkinTemplate extends Skin {
$tpl->set( 'rtl', $userLang->isRTL() );
$tpl->set( 'capitalizeallnouns', $userLang->capitalizeAllNouns() ? ' capitalize-all-nouns' : '' );
- $tpl->set( 'showjumplinks', $user->getOption( 'showjumplinks' ) );
+ $tpl->set( 'showjumplinks', true ); // showjumplinks preference has been removed
$tpl->set( 'username', $this->loggedin ? $this->username : null );
$tpl->setRef( 'userpage', $this->userpage );
$tpl->setRef( 'userpageurl', $this->userpageUrlDetails['href'] );
@@ -409,36 +474,7 @@ class SkinTemplate extends Skin {
$out->mBodytext = Html::rawElement( 'div', $realBodyAttribs, $out->mBodytext );
$tpl->setRef( 'bodytext', $out->mBodytext );
- # Language links
- $language_urls = array();
-
- if ( !$wgHideInterlanguageLinks ) {
- foreach( $out->getLanguageLinks() as $languageLinkText ) {
- $languageLinkParts = explode( ':', $languageLinkText, 2 );
- $class = 'interwiki-' . $languageLinkParts[0];
- unset( $languageLinkParts );
- $languageLinkTitle = Title::newFromText( $languageLinkText );
- if ( $languageLinkTitle ) {
- $ilInterwikiCode = $languageLinkTitle->getInterwiki();
- $ilLangName = Language::fetchLanguageName( $ilInterwikiCode );
-
- if ( strval( $ilLangName ) === '' ) {
- $ilLangName = $languageLinkText;
- } else {
- $ilLangName = $this->formatLanguageName( $ilLangName );
- }
-
- $language_urls[] = array(
- 'href' => $languageLinkTitle->getFullURL(),
- 'text' => $ilLangName,
- 'title' => $languageLinkTitle->getText(),
- 'class' => $class,
- 'lang' => $ilInterwikiCode,
- 'hreflang' => $ilInterwikiCode
- );
- }
- }
- }
+ $language_urls = $this->getLanguages();
if ( count( $language_urls ) ) {
$tpl->setRef( 'language_urls', $language_urls );
} else {
@@ -469,7 +505,7 @@ class SkinTemplate extends Skin {
$tpl->set( 'reporttime', wfReportTime() );
// original version by hansm
- if( !wfRunHooks( 'SkinTemplateOutputPageBeforeExec', array( &$this, &$tpl ) ) ) {
+ if ( !wfRunHooks( 'SkinTemplateOutputPageBeforeExec', array( &$this, &$tpl ) ) ) {
wfDebug( __METHOD__ . ": Hook SkinTemplateOutputPageBeforeExec broke outputPage execution!\n" );
}
@@ -502,6 +538,20 @@ class SkinTemplate extends Skin {
}
/**
+ * Get the HTML for the p-personal list
+ * @return string
+ */
+ public function getPersonalToolsList() {
+ $tpl = $this->setupTemplateForOutput();
+ $tpl->set( 'personal_urls', $this->buildPersonalUrls() );
+ $html = '';
+ foreach ( $tpl->getPersonalTools() as $key => $item ) {
+ $html .= $tpl->makeListItem( $key, $item );
+ }
+ return $html;
+ }
+
+ /**
* Format language name for use in sidebar interlanguage links list.
* By default it is capitalized.
*
@@ -544,8 +594,6 @@ class SkinTemplate extends Skin {
* @return array
*/
protected function buildPersonalUrls() {
- global $wgSecureLogin;
-
$title = $this->getTitle();
$request = $this->getRequest();
$pageurl = $title->getLocalURL();
@@ -568,17 +616,13 @@ class SkinTemplate extends Skin {
if ( strval( $page ) !== '' ) {
$a['returnto'] = $page;
$query = $request->getVal( 'returntoquery', $this->thisquery );
- if( $query != '' ) {
+ if ( $query != '' ) {
$a['returntoquery'] = $query;
}
}
- if ( $wgSecureLogin && $request->detectProtocol() === 'https' ) {
- $a['wpStickHTTPS'] = true;
- }
-
$returnto = wfArrayToCgi( $a );
- if( $this->loggedin ) {
+ if ( $this->loggedin ) {
$personal_urls['userpage'] = array(
'text' => $this->username,
'href' => &$this->userpageUrlDetails['href'],
@@ -599,12 +643,15 @@ class SkinTemplate extends Skin {
'href' => $href,
'active' => ( $href == $pageurl )
);
- $href = self::makeSpecialUrl( 'Watchlist' );
- $personal_urls['watchlist'] = array(
- 'text' => $this->msg( 'mywatchlist' )->text(),
- 'href' => $href,
- 'active' => ( $href == $pageurl )
- );
+
+ if ( $this->getUser()->isAllowed( 'viewmywatchlist' ) ) {
+ $href = self::makeSpecialUrl( 'Watchlist' );
+ $personal_urls['watchlist'] = array(
+ 'text' => $this->msg( 'mywatchlist' )->text(),
+ 'href' => $href,
+ 'active' => ( $href == $pageurl )
+ );
+ }
# We need to do an explicit check for Special:Contributions, as we
# have to match both the title, and the target, which could come
@@ -614,7 +661,7 @@ class SkinTemplate extends Skin {
# thickens, because the Title object is altered for special pages,
# so it doesn't contain the original alias-with-subpage.
$origTitle = Title::newFromText( $request->getText( 'title' ) );
- if( $origTitle instanceof Title && $origTitle->isSpecialPage() ) {
+ if ( $origTitle instanceof Title && $origTitle->isSpecialPage() ) {
list( $spName, $spPar ) = SpecialPageFactory::resolveAlias( $origTitle->getText() );
$active = $spName == 'Contributions'
&& ( ( $spPar && $spPar == $this->username )
@@ -645,24 +692,19 @@ class SkinTemplate extends Skin {
: 'login';
$is_signup = $request->getText( 'type' ) == 'signup';
- # anonlogin & login are the same
- $proto = $wgSecureLogin ? PROTO_HTTPS : null;
-
$login_id = $this->showIPinHeader() ? 'anonlogin' : 'login';
$login_url = array(
'text' => $this->msg( $loginlink )->text(),
- 'href' => self::makeSpecialUrl( 'Userlogin', $returnto, $proto ),
+ 'href' => self::makeSpecialUrl( 'Userlogin', $returnto ),
'active' => $title->isSpecial( 'Userlogin' ) && ( $loginlink == 'nav-login-createaccount' || !$is_signup ),
- 'class' => $wgSecureLogin ? 'link-https' : ''
);
$createaccount_url = array(
'text' => $this->msg( 'createaccount' )->text(),
- 'href' => self::makeSpecialUrl( 'Userlogin', "$returnto&type=signup", $proto ),
+ 'href' => self::makeSpecialUrl( 'Userlogin', "$returnto&type=signup" ),
'active' => $title->isSpecial( 'Userlogin' ) && $is_signup,
- 'class' => $wgSecureLogin ? 'link-https' : ''
);
- if( $this->showIPinHeader() ) {
+ if ( $this->showIPinHeader() ) {
$href = &$this->userpageUrlDetails['href'];
$personal_urls['anonuserpage'] = array(
'text' => $this->username,
@@ -705,10 +747,10 @@ class SkinTemplate extends Skin {
*/
function tabAction( $title, $message, $selected, $query = '', $checkEdit = false ) {
$classes = array();
- if( $selected ) {
+ if ( $selected ) {
$classes[] = 'selected';
}
- if( $checkEdit && !$title->isKnown() ) {
+ if ( $checkEdit && !$title->isKnown() ) {
$classes[] = 'new';
if ( $query !== '' ) {
$query = 'action=edit&redlink=1&' . $query;
@@ -733,7 +775,7 @@ class SkinTemplate extends Skin {
}
$result = array();
- if( !wfRunHooks( 'SkinTemplateTabAction', array( &$this,
+ if ( !wfRunHooks( 'SkinTemplateTabAction', array( &$this,
$title, $message, $selected, $checkEdit,
&$classes, &$query, &$text, &$result ) ) ) {
return $result;
@@ -742,13 +784,13 @@ class SkinTemplate extends Skin {
return array(
'class' => implode( ' ', $classes ),
'text' => $text,
- 'href' => $title->getLocalUrl( $query ),
+ 'href' => $title->getLocalURL( $query ),
'primary' => true );
}
function makeTalkUrlDetails( $name, $urlaction = '' ) {
$title = Title::newFromText( $name );
- if( !is_object( $title ) ) {
+ if ( !is_object( $title ) ) {
throw new MWException( __METHOD__ . " given invalid pagename $name" );
}
$title = $title->getTalkPage();
@@ -761,7 +803,7 @@ class SkinTemplate extends Skin {
function makeArticleUrlDetails( $name, $urlaction = '' ) {
$title = Title::newFromText( $name );
- $title= $title->getSubjectPage();
+ $title = $title->getSubjectPage();
self::checkTitle( $title, $name );
return array(
'href' => $title->getLocalURL( $urlaction ),
@@ -831,7 +873,7 @@ class SkinTemplate extends Skin {
wfRunHooks( 'SkinTemplatePreventOtherActiveTabs', array( &$this, &$preventActiveTabs ) );
// Checks if page is some kind of content
- if( $title->canExist() ) {
+ if ( $title->canExist() ) {
// Gets page objects for the related namespaces
$subjectPage = $title->getSubjectPage();
$talkPage = $title->getTalkPage();
@@ -978,7 +1020,7 @@ class SkinTemplate extends Skin {
wfProfileOut( __METHOD__ . '-live' );
// Checks if the user is logged in
- if ( $this->loggedin ) {
+ if ( $this->loggedin && $user->isAllowedAll( 'viewmywatchlist', 'editmywatchlist' ) ) {
/**
* The following actions use messages which, if made particular to
* the any specific skins, would break the Ajax code which makes this
@@ -1018,21 +1060,16 @@ class SkinTemplate extends Skin {
$params = array();
}
// Loops over each variant
- foreach( $variants as $code ) {
+ foreach ( $variants as $code ) {
// Gets variant name from language code
$varname = $pageLang->getVariantname( $code );
- // Checks if the variant is marked as disabled
- if( $varname == 'disable' ) {
- // Skips this variant
- continue;
- }
// Appends variant link
$content_navigation['variants'][] = array(
'class' => ( $code == $preferred ) ? 'selected' : false,
'text' => $varname,
'href' => $title->getLocalURL( array( 'variant' => $code ) + $params ),
- 'lang' => $code,
- 'hreflang' => $code
+ 'lang' => wfBCP47( $code ),
+ 'hreflang' => wfBCP47( $code ),
);
}
}
@@ -1156,9 +1193,9 @@ class SkinTemplate extends Skin {
$nav_urls = array();
$nav_urls['mainpage'] = array( 'href' => self::makeMainPageUrl() );
- if( $wgUploadNavigationUrl ) {
+ if ( $wgUploadNavigationUrl ) {
$nav_urls['upload'] = array( 'href' => $wgUploadNavigationUrl );
- } elseif( UploadBase::isEnabled() && UploadBase::isAllowed( $this->getUser() ) === true ) {
+ } elseif ( UploadBase::isEnabled() && UploadBase::isAllowed( $this->getUser() ) === true ) {
$nav_urls['upload'] = array( 'href' => self::makeSpecialUrl( 'Upload' ) );
} else {
$nav_urls['upload'] = false;
@@ -1178,15 +1215,15 @@ class SkinTemplate extends Skin {
// A print stylesheet is attached to all pages, but nobody ever
// figures that out. :) Add a link...
- if ( $out->isArticle() ) {
- if ( !$out->isPrintable() ) {
- $nav_urls['print'] = array(
- 'text' => $this->msg( 'printableversion' )->text(),
- 'href' => $this->getTitle()->getLocalURL(
- $request->appendQueryValue( 'printable', 'yes', true ) )
- );
- }
+ if ( !$out->isPrintable() && ( $out->isArticle() || $this->getTitle()->isSpecialPage() ) ) {
+ $nav_urls['print'] = array(
+ 'text' => $this->msg( 'printableversion' )->text(),
+ 'href' => $this->getTitle()->getLocalURL(
+ $request->appendQueryValue( 'printable', 'yes', true ) )
+ );
+ }
+ if ( $out->isArticle() ) {
// Also add a "permalink" while we're at it
$revid = $this->getRevisionId();
if ( $revid ) {
@@ -1203,7 +1240,7 @@ class SkinTemplate extends Skin {
if ( $out->isArticleRelated() ) {
$nav_urls['whatlinkshere'] = array(
- 'href' => SpecialPage::getTitleFor( 'Whatlinkshere', $this->thispage )->getLocalUrl()
+ 'href' => SpecialPage::getTitleFor( 'Whatlinkshere', $this->thispage )->getLocalURL()
);
$nav_urls['info'] = array(
@@ -1213,7 +1250,7 @@ class SkinTemplate extends Skin {
if ( $this->getTitle()->getArticleID() ) {
$nav_urls['recentchangeslinked'] = array(
- 'href' => SpecialPage::getTitleFor( 'Recentchangeslinked', $this->thispage )->getLocalUrl()
+ 'href' => SpecialPage::getTitleFor( 'Recentchangeslinked', $this->thispage )->getLocalURL()
);
}
}
@@ -1243,11 +1280,14 @@ class SkinTemplate extends Skin {
);
}
- $sur = new UserrightsPage;
- if ( $sur->userCanExecute( $this->getUser() ) ) {
- $nav_urls['userrights'] = array(
- 'href' => self::makeSpecialUrlSubpage( 'Userrights', $rootUser )
- );
+ if ( !$user->isAnon() ) {
+ $sur = new UserrightsPage;
+ $sur->setContext( $this->getContext() );
+ if ( $sur->userCanExecute( $this->getUser() ) ) {
+ $nav_urls['userrights'] = array(
+ 'href' => self::makeSpecialUrlSubpage( 'Userrights', $rootUser )
+ );
+ }
}
}
@@ -1263,10 +1303,6 @@ class SkinTemplate extends Skin {
function getNameSpaceKey() {
return $this->getTitle()->getNamespaceKey();
}
-
- public function commonPrintStylesheet() {
- return false;
- }
}
/**
@@ -1293,6 +1329,21 @@ abstract class QuickTemplate {
}
/**
+ * Gets the template data requested
+ * @since 1.22
+ * @param string $name Key for the data
+ * @param mixed $default Optional default (or null)
+ * @return mixed The value of the data requested or the deafult
+ */
+ public function get( $name, $default = null ) {
+ if ( isset( $this->data[$name] ) ) {
+ return $this->data[$name];
+ } else {
+ return $default;
+ }
+ }
+
+ /**
* @param $name
* @param $value
*/
@@ -1322,8 +1373,10 @@ abstract class QuickTemplate {
/**
* @private
+ * @deprecated since 1.21; use Xml::encodeJsVar() or Xml::encodeJsCall() instead
*/
function jstext( $str ) {
+ wfDeprecated( __METHOD__, '1.21' );
echo Xml::escapeJsString( $this->data[$str] );
}
@@ -1492,7 +1545,7 @@ abstract class BaseTemplate extends QuickTemplate {
*/
function getPersonalTools() {
$personal_tools = array();
- foreach ( $this->data['personal_urls'] as $key => $plink ) {
+ foreach ( $this->get( 'personal_urls' ) as $key => $plink ) {
# The class on a personal_urls item is meant to go on the <a> instead
# of the <li> so we have to use a single item "links" array instead
# of using most of the personal_url's keys directly.
@@ -1506,8 +1559,9 @@ abstract class BaseTemplate extends QuickTemplate {
$ptool['active'] = $plink['active'];
}
foreach ( array( 'href', 'class', 'text' ) as $k ) {
- if ( isset( $plink[$k] ) )
+ if ( isset( $plink[$k] ) ) {
$ptool['links'][0][$k] = $plink[$k];
+ }
}
$personal_tools[$key] = $ptool;
}
@@ -1546,39 +1600,39 @@ abstract class BaseTemplate extends QuickTemplate {
case 'SEARCH':
// Search is a special case, skins should custom implement this
$boxes[$boxName] = array(
- 'id' => 'p-search',
- 'header' => $this->getMsg( 'search' )->text(),
+ 'id' => 'p-search',
+ 'header' => $this->getMsg( 'search' )->text(),
'generated' => false,
- 'content' => true,
+ 'content' => true,
);
break;
case 'TOOLBOX':
$msgObj = $this->getMsg( 'toolbox' );
$boxes[$boxName] = array(
- 'id' => 'p-tb',
- 'header' => $msgObj->exists() ? $msgObj->text() : 'toolbox',
+ 'id' => 'p-tb',
+ 'header' => $msgObj->exists() ? $msgObj->text() : 'toolbox',
'generated' => false,
- 'content' => $this->getToolbox(),
+ 'content' => $this->getToolbox(),
);
break;
case 'LANGUAGES':
if ( $this->data['language_urls'] ) {
$msgObj = $this->getMsg( 'otherlanguages' );
$boxes[$boxName] = array(
- 'id' => 'p-lang',
- 'header' => $msgObj->exists() ? $msgObj->text() : 'otherlanguages',
+ 'id' => 'p-lang',
+ 'header' => $msgObj->exists() ? $msgObj->text() : 'otherlanguages',
'generated' => false,
- 'content' => $this->data['language_urls'],
+ 'content' => $this->data['language_urls'],
);
}
break;
default:
$msgObj = $this->getMsg( $boxName );
$boxes[$boxName] = array(
- 'id' => "p-$boxName",
- 'header' => $msgObj->exists() ? $msgObj->text() : $boxName,
+ 'id' => "p-$boxName",
+ 'header' => $msgObj->exists() ? $msgObj->text() : $boxName,
'generated' => true,
- 'content' => $content,
+ 'content' => $content,
);
break;
}
@@ -1618,10 +1672,10 @@ abstract class BaseTemplate extends QuickTemplate {
} else {
if ( $hookContents ) {
$boxes['TOOLBOXEND'] = array(
- 'id' => 'p-toolboxend',
- 'header' => $boxes['TOOLBOX']['header'],
+ 'id' => 'p-toolboxend',
+ 'header' => $boxes['TOOLBOX']['header'],
'generated' => false,
- 'content' => "<ul>{$hookContents}</ul>",
+ 'content' => "<ul>{$hookContents}</ul>",
);
// HACK: Make sure that TOOLBOXEND is sorted next to TOOLBOX
$boxes2 = array();
@@ -1663,6 +1717,10 @@ abstract class BaseTemplate extends QuickTemplate {
* on the link) is present it will be used to generate a tooltip and
* accesskey for the link.
*
+ * The keys "context" and "primary" are ignored; these keys are used
+ * internally by skins and are not supposed to be included in the HTML
+ * output.
+ *
* If you don't want an accesskey, set $item['tooltiponly'] = true;
*
* @param array $options can be used to affect the output of a link.
@@ -1703,7 +1761,7 @@ abstract class BaseTemplate extends QuickTemplate {
if ( isset( $item['href'] ) || isset( $options['link-fallback'] ) ) {
$attrs = $item;
- foreach ( array( 'single-id', 'text', 'msg', 'tooltiponly' ) as $k ) {
+ foreach ( array( 'single-id', 'text', 'msg', 'tooltiponly', 'context', 'primary' ) as $k ) {
unset( $attrs[$k] );
}
@@ -1807,14 +1865,15 @@ abstract class BaseTemplate extends QuickTemplate {
$realAttrs = array(
'type' => 'search',
'name' => 'search',
- 'value' => isset( $this->data['search'] ) ? $this->data['search'] : '',
+ 'placeholder' => wfMessage( 'searchsuggest-search' )->text(),
+ 'value' => $this->get( 'search', '' ),
);
$realAttrs = array_merge( $realAttrs, Linker::tooltipAndAccesskeyAttribs( 'search' ), $attrs );
return Html::element( 'input', $realAttrs );
}
function makeSearchButton( $mode, $attrs = array() ) {
- switch( $mode ) {
+ switch ( $mode ) {
case 'go':
case 'fulltext':
$realAttrs = array(
@@ -1866,14 +1925,14 @@ abstract class BaseTemplate extends QuickTemplate {
* @return array|mixed
*/
function getFooterLinks( $option = null ) {
- $footerlinks = $this->data['footerlinks'];
+ $footerlinks = $this->get( 'footerlinks' );
// Reduce footer links down to only those which are being used
$validFooterLinks = array();
- foreach( $footerlinks as $category => $links ) {
+ foreach ( $footerlinks as $category => $links ) {
$validFooterLinks[$category] = array();
- foreach( $links as $link ) {
- if( isset( $this->data[$link] ) && $this->data[$link] ) {
+ foreach ( $links as $link ) {
+ if ( isset( $this->data[$link] ) && $this->data[$link] ) {
$validFooterLinks[$category][] = $link;
}
}
@@ -1906,7 +1965,7 @@ abstract class BaseTemplate extends QuickTemplate {
*/
function getFooterIcons( $option = null ) {
// Generate additional footer icons
- $footericons = $this->data['footericons'];
+ $footericons = $this->get( 'footericons' );
if ( $option == 'icononly' ) {
// Unset any icons which don't have an image
@@ -1939,9 +1998,10 @@ abstract class BaseTemplate extends QuickTemplate {
* body and html tags.
*/
function printTrail() { ?>
+<?php echo MWDebug::getDebugHTML( $this->getSkin()->getContext() ); ?>
<?php $this->html( 'bottomscripts' ); /* JS call to runBodyOnloadHook */ ?>
<?php $this->html( 'reporttime' ) ?>
-<?php echo MWDebug::getDebugHTML( $this->getSkin()->getContext() );
+<?php
}
}
diff --git a/includes/SpecialPage.php b/includes/SpecialPage.php
index c32738f8..a6195fc4 100644
--- a/includes/SpecialPage.php
+++ b/includes/SpecialPage.php
@@ -27,7 +27,6 @@
* @ingroup SpecialPage
*/
class SpecialPage {
-
// The canonical name of this special page
// Also used for the default <h1> heading, @see getDescription()
protected $mName;
@@ -305,12 +304,14 @@ class SpecialPage {
* If you override execute(), you can recover the default behavior 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 bool $listed whether the page is listed in Special:Specialpages
- * @param $function Callback|Bool: 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 bool $includable whether the page can be included in normal pages
+ * @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 bool $listed Whether the page is listed in Special:Specialpages
+ * @param Callback|Bool $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 bool $includable Whether the page can be included in normal pages
*/
public function __construct(
$name = '', $restriction = '', $listed = true,
@@ -322,12 +323,14 @@ class SpecialPage {
/**
* Do the real work for the constructor, mainly so __call() can intercept
* calls to SpecialPage()
- * @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 bool $listed whether the page is listed in Special:Specialpages
- * @param $function Callback|Bool: 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 bool $includable whether the page can be included in normal pages
+ * @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 bool $listed Whether the page is listed in Special:Specialpages
+ * @param Callback|Bool $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 bool $includable Whether the page can be included in normal pages
*/
private function init( $name, $restriction, $listed, $function, $file, $includable ) {
$this->mName = $name;
@@ -445,7 +448,10 @@ class SpecialPage {
* @return Mixed
* @deprecated since 1.18
*/
- function name( $x = null ) { wfDeprecated( __METHOD__, '1.18' ); return wfSetVar( $this->mName, $x ); }
+ function name( $x = null ) {
+ wfDeprecated( __METHOD__, '1.18' );
+ return wfSetVar( $this->mName, $x );
+ }
/**
* These mutators are very evil, as the relevant variables should not mutate. So
@@ -454,7 +460,10 @@ class SpecialPage {
* @return Mixed
* @deprecated since 1.18
*/
- function restriction( $x = null ) { wfDeprecated( __METHOD__, '1.18' ); return wfSetVar( $this->mRestriction, $x ); }
+ function restriction( $x = null ) {
+ wfDeprecated( __METHOD__, '1.18' );
+ return wfSetVar( $this->mRestriction, $x );
+ }
/**
* These mutators are very evil, as the relevant variables should not mutate. So
@@ -463,7 +472,10 @@ class SpecialPage {
* @return Mixed
* @deprecated since 1.18
*/
- function func( $x = null ) { wfDeprecated( __METHOD__, '1.18' ); return wfSetVar( $this->mFunction, $x ); }
+ function func( $x = null ) {
+ wfDeprecated( __METHOD__, '1.18' );
+ return wfSetVar( $this->mFunction, $x );
+ }
/**
* These mutators are very evil, as the relevant variables should not mutate. So
@@ -472,7 +484,10 @@ class SpecialPage {
* @return Mixed
* @deprecated since 1.18
*/
- function file( $x = null ) { wfDeprecated( __METHOD__, '1.18' ); return wfSetVar( $this->mFile, $x ); }
+ function file( $x = null ) {
+ wfDeprecated( __METHOD__, '1.18' );
+ return wfSetVar( $this->mFile, $x );
+ }
/**
* These mutators are very evil, as the relevant variables should not mutate. So
@@ -481,7 +496,10 @@ class SpecialPage {
* @return Mixed
* @deprecated since 1.18
*/
- function includable( $x = null ) { wfDeprecated( __METHOD__, '1.18' ); return wfSetVar( $this->mIncludable, $x ); }
+ function includable( $x = null ) {
+ wfDeprecated( __METHOD__, '1.18' );
+ return wfSetVar( $this->mIncludable, $x );
+ }
/**
* Whether the special page is being evaluated via transclusion
@@ -535,7 +553,7 @@ class SpecialPage {
* pages?
*/
public function isRestricted() {
- // DWIM: If all anons can do something, then it is not restricted
+ // DWIM: If anons can do something, then it is not restricted
return $this->mRestriction != '' && !User::groupHasPermission( '*', $this->mRestriction );
}
@@ -661,7 +679,7 @@ class SpecialPage {
$func = $this->mFunction;
// only load file if the function does not exist
if ( !is_callable( $func ) && $this->mFile ) {
- require_once( $this->mFile );
+ require_once $this->mFile;
}
$this->outputHeader();
call_user_func( $func, $subPage, $this );
@@ -734,7 +752,8 @@ class SpecialPage {
if ( $this->mContext instanceof IContextSource ) {
return $this->mContext;
} else {
- wfDebug( __METHOD__ . " called and \$mContext is null. Return RequestContext::getMain(); for sanity\n" );
+ wfDebug( __METHOD__ . " called and \$mContext is null. " .
+ "Return RequestContext::getMain(); for sanity\n" );
return RequestContext::getMain();
}
}
@@ -782,7 +801,7 @@ class SpecialPage {
/**
* Shortcut to get user's language
*
- * @deprecated 1.19 Use getLanguage instead
+ * @deprecated since 1.19 Use getLanguage instead
* @return Language
* @since 1.18
*/
@@ -842,11 +861,11 @@ class SpecialPage {
protected function addFeedLinks( $params ) {
global $wgFeedClasses;
- $feedTemplate = wfScript( 'api' ) . '?';
+ $feedTemplate = wfScript( 'api' );
foreach ( $wgFeedClasses as $format => $class ) {
$theseParams = $params + array( 'feedformat' => $format );
- $url = $feedTemplate . wfArrayToCgi( $theseParams );
+ $url = wfAppendQuery( $feedTemplate, $theseParams );
$this->getOutput()->addFeedLink( $format, $url );
}
}
@@ -909,6 +928,11 @@ class SpecialPage {
* a new structure for SpecialPages
*/
abstract class FormSpecialPage extends SpecialPage {
+ /**
+ * The sub-page of the special page.
+ * @var string
+ */
+ protected $par = null;
/**
* Get an HTMLForm descriptor array
@@ -917,17 +941,27 @@ abstract class FormSpecialPage extends SpecialPage {
abstract protected function getFormFields();
/**
- * Add pre- or post-text to the form
+ * Add pre-text to the form
* @return String HTML which will be sent to $form->addPreText()
*/
- protected function preText() { return ''; }
- protected function postText() { return ''; }
+ protected function preText() {
+ return '';
+ }
+
+ /**
+ * Add post-text to the form
+ * @return String HTML which will be sent to $form->addPostText()
+ */
+ protected function postText() {
+ return '';
+ }
/**
* Play with the HTMLForm if you need to more substantially
* @param $form HTMLForm
*/
- protected function alterForm( HTMLForm $form ) {}
+ protected function alterForm( HTMLForm $form ) {
+ }
/**
* Get message prefix for HTMLForm
@@ -948,9 +982,18 @@ abstract class FormSpecialPage extends SpecialPage {
$form = new HTMLForm( $this->fields, $this->getContext(), $this->getMessagePrefix() );
$form->setSubmitCallback( array( $this, 'onSubmit' ) );
- $form->setWrapperLegend( $this->msg( $this->getMessagePrefix() . '-legend' ) );
- $form->addHeaderText(
- $this->msg( $this->getMessagePrefix() . '-text' )->parseAsBlock() );
+ // If the form is a compact vertical form, then don't output this ugly
+ // fieldset surrounding it.
+ // XXX Special pages can setDisplayFormat to 'vform' in alterForm(), but that
+ // is called after this.
+ if ( !$form->isVForm() ) {
+ $form->setWrapperLegendMsg( $this->getMessagePrefix() . '-legend' );
+ }
+
+ $headerMsg = $this->msg( $this->getMessagePrefix() . '-text' );
+ if ( !$headerMsg->isDisabled() ) {
+ $form->addHeaderText( $headerMsg->parseAsBlock() );
+ }
// Retain query parameters (uselang etc)
$params = array_diff_key(
@@ -977,8 +1020,10 @@ abstract class FormSpecialPage extends SpecialPage {
/**
* Do something exciting on successful processing of the form, most likely to show a
* confirmation message
+ * @since 1.22 Default is to do nothing
*/
- abstract public function onSuccess();
+ public function onSuccess() {
+ }
/**
* Basic SpecialPage workflow: get a form, send it to the user; get some data back,
@@ -1000,9 +1045,11 @@ abstract class FormSpecialPage extends SpecialPage {
/**
* Maybe do something interesting with the subpage parameter
- * @param $par String
+ * @param string $par
*/
- protected function setParameter( $par ) {}
+ protected function setParameter( $par ) {
+ $this->par = $par;
+ }
/**
* Called from execute() to check if the given user can perform this action.
@@ -1090,17 +1137,16 @@ abstract class RedirectSpecialPage extends UnlistedSpecialPage {
$query = $this->getRedirectQuery();
// Redirect to a page title with possible query parameters
if ( $redirect instanceof Title ) {
- $url = $redirect->getFullUrl( $query );
+ $url = $redirect->getFullURL( $query );
$this->getOutput()->redirect( $url );
return $redirect;
- // Redirect to index.php with query parameters
} elseif ( $redirect === true ) {
- global $wgScript;
- $url = $wgScript . '?' . wfArrayToCgi( $query );
+ // Redirect to index.php with query parameters
+ $url = wfAppendQuery( wfScript( 'index' ), $query );
$this->getOutput()->redirect( $url );
return $redirect;
} else {
- $class = __CLASS__;
+ $class = get_class( $this );
throw new MWException( "RedirectSpecialPage $class doesn't redirect!" );
}
}
@@ -1140,6 +1186,7 @@ abstract class RedirectSpecialPage extends UnlistedSpecialPage {
}
abstract class SpecialRedirectToSpecial extends RedirectSpecialPage {
+ // @todo FIXME: Visibility must be declared
var $redirName, $redirSubpage;
function __construct(
@@ -1186,7 +1233,16 @@ class SpecialListBots extends SpecialRedirectToSpecial {
*/
class SpecialCreateAccount extends SpecialRedirectToSpecial {
function __construct() {
- parent::__construct( 'CreateAccount', 'Userlogin', 'signup', array( 'uselang' ) );
+ parent::__construct( 'CreateAccount', 'Userlogin', 'signup', array( 'returnto', 'returntoquery', 'uselang' ) );
+ }
+
+ // No reason to hide this link on Special:Specialpages
+ public function isListed() {
+ return true;
+ }
+
+ protected function getGroupName() {
+ return 'login';
}
}
/**
@@ -1216,7 +1272,7 @@ class SpecialCreateAccount extends SpecialRedirectToSpecial {
* - limit, offset: Useful for linking to history of one's own user page or
* user talk page. For example, this would be a link to "the last edit to your
* user talk page in the year 2010":
- * http://en.wikipedia.org/w/index.php?title=Special:MyPage&offset=20110000000000&limit=1&action=history
+ * http://en.wikipedia.org/wiki/Special:MyPage?offset=20110000000000&limit=1&action=history
*
* - feed: would allow linking to the current user's RSS feed for their user
* talk page:
@@ -1270,9 +1326,9 @@ abstract class RedirectSpecialArticle extends RedirectSpecialPage {
'action',
'redirect', 'rdfrom',
# Options for preloaded edits
- 'preload', 'editintro', 'preloadtitle', 'summary',
+ 'preload', 'editintro', 'preloadtitle', 'summary', 'nosummary',
# Options for overriding user settings
- 'preview', 'internaledit', 'externaledit', 'mode',
+ 'preview', 'internaledit', 'externaledit', 'mode', 'minor', 'watchthis',
# Options for history/diffs
'section', 'oldid', 'diff', 'dir',
'limit', 'offset', 'feed',
@@ -1345,7 +1401,7 @@ class SpecialMycontributions extends RedirectSpecialPage {
class SpecialMyuploads extends RedirectSpecialPage {
function __construct() {
parent::__construct( 'Myuploads' );
- $this->mAllowedRedirectParams = array( 'limit' );
+ $this->mAllowedRedirectParams = array( 'limit', 'ilshowall', 'ilsearch' );
}
function getRedirect( $subpage ) {
@@ -1354,6 +1410,22 @@ class SpecialMyuploads extends RedirectSpecialPage {
}
/**
+ * Redirect Special:Listfiles?user=$wgUser&ilshowall=true
+ */
+class SpecialAllMyUploads extends RedirectSpecialPage {
+ function __construct() {
+ parent::__construct( 'AllMyUploads' );
+ $this->mAllowedRedirectParams = array( 'limit', 'ilsearch' );
+ }
+
+ function getRedirect( $subpage ) {
+ $this->mAddedRedirectParams['ilshowall'] = 1;
+ return SpecialPage::getTitleFor( 'Listfiles', $this->getUser()->getName() );
+ }
+}
+
+
+/**
* Redirect from Special:PermanentLink/### to index.php?oldid=###
*/
class SpecialPermanentLink extends RedirectSpecialPage {
diff --git a/includes/SpecialPageFactory.php b/includes/SpecialPageFactory.php
index 7368ab77..11edc8ac 100644
--- a/includes/SpecialPageFactory.php
+++ b/includes/SpecialPageFactory.php
@@ -78,7 +78,6 @@ class SpecialPageFactory {
'Allpages' => 'SpecialAllpages',
'Prefixindex' => 'SpecialPrefixindex',
'Categories' => 'SpecialCategories',
- 'Disambiguations' => 'DisambiguationsPage',
'Listredirects' => 'ListredirectsPage',
'PagesWithProp' => 'SpecialPagesWithProp',
@@ -94,6 +93,7 @@ class SpecialPageFactory {
'PasswordReset' => 'SpecialPasswordReset',
'DeletedContributions' => 'DeletedContributionsPage',
'Preferences' => 'SpecialPreferences',
+ 'ResetTokens' => 'SpecialResetTokens',
'Contributions' => 'SpecialContributions',
'Listgrouprights' => 'SpecialListGroupRights',
'Listusers' => 'SpecialListUsers',
@@ -130,6 +130,7 @@ class SpecialPageFactory {
// Redirecting special pages
'LinkSearch' => 'LinkSearchPage',
'Randompage' => 'Randompage',
+ 'RandomInCategory' => 'SpecialRandomInCategory',
'Randomredirect' => 'SpecialRandomredirect',
// High use pages
@@ -154,14 +155,15 @@ class SpecialPageFactory {
// Unlisted / redirects
'Blankpage' => 'SpecialBlankpage',
- 'Blockme' => 'SpecialBlockme',
'Emailuser' => 'SpecialEmailUser',
'Movepage' => 'MovePageForm',
'Mycontributions' => 'SpecialMycontributions',
'Mypage' => 'SpecialMypage',
'Mytalk' => 'SpecialMytalk',
'Myuploads' => 'SpecialMyuploads',
+ 'AllMyUploads' => 'SpecialAllMyUploads',
'PermanentLink' => 'SpecialPermanentLink',
+ 'Redirect' => 'SpecialRedirect',
'Revisiondelete' => 'SpecialRevisionDelete',
'Specialpages' => 'SpecialSpecialpages',
'Userlogout' => 'SpecialUserlogout',
@@ -200,7 +202,7 @@ class SpecialPageFactory {
self::$mList['ChangeEmail'] = 'SpecialChangeEmail';
}
- if( $wgEnableJavaScriptTest ) {
+ if ( $wgEnableJavaScriptTest ) {
self::$mList['JavaScriptTest'] = 'SpecialJavaScriptTest';
}
@@ -286,7 +288,7 @@ class SpecialPageFactory {
*
* @param $page Mixed: SpecialPage or string
* @param $group String
- * @deprecated 1.21 Override SpecialPage::getGroupName
+ * @deprecated since 1.21 Override SpecialPage::getGroupName
*/
public static function setGroup( $page, $group ) {
wfDeprecated( __METHOD__, '1.21' );
@@ -301,7 +303,7 @@ class SpecialPageFactory {
*
* @param $page SpecialPage
* @return String
- * @deprecated 1.21 Use SpecialPage::getFinalGroupName
+ * @deprecated since 1.21 Use SpecialPage::getFinalGroupName
*/
public static function getGroup( &$page ) {
wfDeprecated( __METHOD__, '1.21' );
@@ -464,9 +466,8 @@ class SpecialPageFactory {
if ( $name != $page->getLocalName() && !$context->getRequest()->wasPosted() ) {
$query = $context->getRequest()->getQueryValues();
unset( $query['title'] );
- $query = wfArrayToCgi( $query );
$title = $page->getTitle( $par );
- $url = $title->getFullUrl( $query );
+ $url = $title->getFullURL( $query );
$context->getOutput()->redirect( $url );
wfProfileOut( __METHOD__ );
return $title;
diff --git a/includes/SqlDataUpdate.php b/includes/SqlDataUpdate.php
index 79dcdc59..51188d85 100644
--- a/includes/SqlDataUpdate.php
+++ b/includes/SqlDataUpdate.php
@@ -56,7 +56,7 @@ abstract class SqlDataUpdate extends DataUpdate {
$this->mOptions = array( 'FOR UPDATE' );
}
- // @todo: get connection only when it's needed? make sure that doesn't break anything, especially transactions!
+ // @todo get connection only when it's needed? make sure that doesn't break anything, especially transactions!
$this->mDb = wfGetDB( DB_MASTER );
$this->mWithTransaction = $withTransaction;
diff --git a/includes/StatCounter.php b/includes/StatCounter.php
new file mode 100644
index 00000000..1373f3d5
--- /dev/null
+++ b/includes/StatCounter.php
@@ -0,0 +1,150 @@
+<?php
+/**
+ * @defgroup StatCounter StatCounter
+ *
+ * StatCounter is used to increment arbitrary keys for profiling reasons.
+ * The key/values are persisted in several possible ways (see $wgStatsMethod).
+ */
+
+/**
+ * Aggregator for wfIncrStats() that batches updates per request.
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with this program; if not, write 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 StatCounter
+ * @author Aaron Schulz
+ */
+
+/**
+ * Aggregator for wfIncrStats() that batches updates per request.
+ * This avoids spamming the collector many times for the same key.
+ *
+ * @ingroup StatCounter
+ */
+class StatCounter {
+ /** @var Array */
+ protected $deltas = array(); // (key => count)
+
+ protected function __construct() {}
+
+ /**
+ * @return StatCounter
+ */
+ public static function singleton() {
+ static $instance = null;
+ if ( !$instance ) {
+ $instance = new self();
+ }
+ return $instance;
+ }
+
+ /**
+ * Increment a key by delta $count
+ *
+ * @param string $key
+ * @param integer $count
+ * @return void
+ */
+ public function incr( $key, $count = 1 ) {
+ $this->deltas[$key] = isset( $this->deltas[$key] ) ? $this->deltas[$key] : 0;
+ $this->deltas[$key] += $count;
+ if ( PHP_SAPI === 'cli' ) {
+ $this->flush();
+ }
+ }
+
+ /**
+ * Flush all pending deltas to persistent storage
+ *
+ * @return void
+ */
+ public function flush() {
+ global $wgStatsMethod;
+
+ $deltas = array_filter( $this->deltas ); // remove 0 valued entries
+ if ( $wgStatsMethod === 'udp' ) {
+ $this->sendDeltasUDP( $deltas );
+ } elseif ( $wgStatsMethod === 'cache' ) {
+ $this->sendDeltasMemc( $deltas );
+ } else {
+ // disabled
+ }
+ $this->deltas = array();
+ }
+
+ /**
+ * @param array $deltas
+ * @return void
+ */
+ protected function sendDeltasUDP( array $deltas ) {
+ global $wgUDPProfilerHost, $wgUDPProfilerPort, $wgAggregateStatsID,
+ $wgStatsFormatString;
+
+ $id = strlen( $wgAggregateStatsID ) ? $wgAggregateStatsID : wfWikiID();
+
+ $lines = array();
+ foreach ( $deltas as $key => $count ) {
+ $lines[] = sprintf( $wgStatsFormatString, $id, $count, $key );
+ }
+
+ if ( count( $lines ) ) {
+ static $socket = null;
+ if ( !$socket ) {
+ $socket = socket_create( AF_INET, SOCK_DGRAM, SOL_UDP );
+ }
+ $packet = '';
+ $packets = array();
+ foreach ( $lines as $line ) {
+ if ( ( strlen( $packet ) + strlen( $line ) ) > 1450 ) {
+ $packets[] = $packet;
+ $packet = '';
+ }
+ $packet .= $line;
+ }
+ if ( $packet != '' ) {
+ $packets[] = $packet;
+ }
+ foreach ( $packets as $packet ) {
+ wfSuppressWarnings();
+ socket_sendto(
+ $socket,
+ $packet,
+ strlen( $packet ),
+ 0,
+ $wgUDPProfilerHost,
+ $wgUDPProfilerPort
+ );
+ wfRestoreWarnings();
+ }
+ }
+ }
+
+ /**
+ * @param array $deltas
+ * @return void
+ */
+ protected function sendDeltasMemc( array $deltas ) {
+ global $wgMemc;
+
+ foreach ( $deltas as $key => $count ) {
+ $ckey = wfMemcKey( 'stats', $key );
+ if ( $wgMemc->incr( $ckey, $count ) === null ) {
+ $wgMemc->add( $ckey, $count );
+ }
+ }
+ }
+}
diff --git a/includes/Status.php b/includes/Status.php
index 5d6236f7..928f8ebd 100644
--- a/includes/Status.php
+++ b/includes/Status.php
@@ -31,6 +31,11 @@
* An operation which is not OK should have errors so that the user can be
* informed as to what went wrong. Calling the fatal() function sets an error
* message and simultaneously switches off the OK flag.
+ *
+ * The recommended pattern for Status objects is to return a Status object
+ * unconditionally, i.e. both on success and on failure -- so that the
+ * developer of the calling code is reminded that the function can fail, and
+ * so that a lack of error-handling will be explicit.
*/
class Status {
var $ok = true;
@@ -183,15 +188,18 @@ class Status {
}
}
if ( count( $this->errors ) == 1 ) {
- $s = $this->getErrorMessage( $this->errors[0] );
+ $s = $this->getErrorMessage( $this->errors[0] )->plain();
if ( $shortContext ) {
$s = wfMessage( $shortContext, $s )->plain();
} elseif ( $longContext ) {
$s = wfMessage( $longContext, "* $s\n" )->plain();
}
} else {
- $s = '* '. implode( "\n* ",
- $this->getErrorMessageArray( $this->errors ) ) . "\n";
+ $errors = $this->getErrorMessageArray( $this->errors );
+ foreach ( $errors as &$error ) {
+ $error = $error->plain();
+ }
+ $s = '* ' . implode( "\n* ", $errors ) . "\n";
if ( $longContext ) {
$s = wfMessage( $longContext, $s )->plain();
} elseif ( $shortContext ) {
@@ -202,6 +210,56 @@ class Status {
}
/**
+ * Get the error list as a Message object
+ *
+ * @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
+ * @return Message
+ */
+ function getMessage( $shortContext = false, $longContext = false ) {
+ if ( count( $this->errors ) == 0 ) {
+ if ( $this->ok ) {
+ $this->fatal( 'internalerror_info',
+ __METHOD__ . " called for a good result, this is incorrect\n" );
+ } else {
+ $this->fatal( 'internalerror_info',
+ __METHOD__ . ": Invalid result object: no error text but not OK\n" );
+ }
+ }
+ if ( count( $this->errors ) == 1 ) {
+ $s = $this->getErrorMessage( $this->errors[0] );
+ if ( $shortContext ) {
+ $s = wfMessage( $shortContext, $s );
+ } elseif ( $longContext ) {
+ $wrapper = new RawMessage( "* \$1\n" );
+ $wrapper->params( $s )->parse();
+ $s = wfMessage( $longContext, $wrapper );
+ }
+ } else {
+ $msgs = $this->getErrorMessageArray( $this->errors );
+ $msgCount = count( $msgs );
+
+ if ( $shortContext ) {
+ $msgCount++;
+ }
+
+ $wrapper = new RawMessage( '* $' . implode( "\n* \$", range( 1, $msgCount ) ) );
+ $s = $wrapper->params( $msgs )->parse();
+
+ if ( $longContext ) {
+ $s = wfMessage( $longContext, $wrapper );
+ } elseif ( $shortContext ) {
+ $wrapper = new RawMessage( "\n\$1\n", $wrapper );
+ $wrapper->parse();
+ $s = wfMessage( $shortContext, $wrapper );
+ }
+ }
+
+ return $s;
+ }
+
+ /**
* Return the message for a single error.
* @param $error Mixed With an array & two values keyed by
* 'message' and 'params', use those keys-value pairs.
@@ -212,7 +270,7 @@ class Status {
*/
protected function getErrorMessage( $error ) {
if ( is_array( $error ) ) {
- if( isset( $error['message'] ) && $error['message'] instanceof Message ) {
+ if ( isset( $error['message'] ) && $error['message'] instanceof Message ) {
$msg = $error['message'];
} elseif ( isset( $error['message'] ) && isset( $error['params'] ) ) {
$msg = wfMessage( $error['message'],
@@ -225,7 +283,7 @@ class Status {
} else {
$msg = wfMessage( $error );
}
- return $msg->plain();
+ return $msg;
}
/**
@@ -234,7 +292,7 @@ class Status {
*
* @note: this does not perform a full wikitext to HTML conversion, it merely applies
* a message transformation.
- * @todo: figure out whether that is actually The Right Thing.
+ * @todo figure out whether that is actually The Right Thing.
*/
public function getHTML( $shortContext = false, $longContext = false ) {
$text = $this->getWikiText( $shortContext, $longContext );
@@ -269,7 +327,8 @@ class Status {
/**
* Get the list of errors (but not warnings)
*
- * @return Array
+ * @return array A list in which each entry is an array with a message key as its first element.
+ * The remaining array elements are the message parameters.
*/
function getErrorsArray() {
return $this->getStatusArray( "error" );
@@ -278,7 +337,8 @@ class Status {
/**
* Get the list of warnings (but not errors)
*
- * @return Array
+ * @return array A list in which each entry is an array with a message key as its first element.
+ * The remaining array elements are the message parameters.
*/
function getWarningsArray() {
return $this->getStatusArray( "warning" );
@@ -294,9 +354,9 @@ class Status {
$result = array();
foreach ( $this->errors as $error ) {
if ( $error['type'] === $type ) {
- if( $error['message'] instanceof Message ) {
- $result[] = $error['message'];
- } elseif( $error['params'] ) {
+ if ( $error['message'] instanceof Message ) {
+ $result[] = array_merge( array( $error['message']->getKey() ), $error['message']->getParams() );
+ } elseif ( $error['params'] ) {
$result[] = array_merge( array( $error['message'] ), $error['params'] );
} else {
$result[] = array( $error['message'] );
@@ -365,15 +425,6 @@ class Status {
}
/**
- * Backward compatibility function for WikiError -> Status migration
- *
- * @return String
- */
- public function getMessage() {
- return $this->getWikiText();
- }
-
- /**
* @return mixed
*/
public function getValue() {
diff --git a/includes/StreamFile.php b/includes/StreamFile.php
index f5e4acff..1ad643ac 100644
--- a/includes/StreamFile.php
+++ b/includes/StreamFile.php
@@ -42,6 +42,7 @@ class StreamFile {
wfProfileIn( __METHOD__ );
if ( FileBackend::isStoragePath( $fname ) ) { // sanity
+ wfProfileOut( __METHOD__ );
throw new MWException( __FUNCTION__ . " given storage path '$fname'." );
}
diff --git a/includes/StringUtils.php b/includes/StringUtils.php
index f4c98f1d..c1545e6e 100644
--- a/includes/StringUtils.php
+++ b/includes/StringUtils.php
@@ -38,6 +38,9 @@ class StringUtils {
* unit testing our internal implementation.
*
* @since 1.21
+ * @note In MediaWiki 1.21, this function did not provide proper UTF-8 validation.
+ * In particular, the pure PHP code path did not in fact check for overlong forms.
+ * Beware of this when backporting code to that version of MediaWiki.
*
* @param string $value String to check
* @param boolean $disableMbstring Whether to use the pure PHP
@@ -47,26 +50,64 @@ class StringUtils {
* @return boolean Whether the given $value is a valid UTF-8 encoded string
*/
static function isUtf8( $value, $disableMbstring = false ) {
+ $value = (string)$value;
- if ( preg_match( '/[\x80-\xff]/', $value ) === 0 ) {
- # no high bit set, this is pure ASCII which is de facto
- # valid UTF-8
+ // If the mbstring extension is loaded, use it. However, before PHP 5.4, values above
+ // U+10FFFF are incorrectly allowed, so we have to check for them separately.
+ if ( !$disableMbstring && function_exists( 'mb_check_encoding' ) ) {
+ static $newPHP;
+ if ( $newPHP === null ) {
+ $newPHP = !mb_check_encoding( "\xf4\x90\x80\x80", 'UTF-8' );
+ }
+
+ return mb_check_encoding( $value, 'UTF-8' ) &&
+ ( $newPHP || preg_match( "/\xf4[\x90-\xbf]|[\xf5-\xff]/S", $value ) === 0 );
+ }
+
+ if ( preg_match( "/[\x80-\xff]/S", $value ) === 0 ) {
+ // String contains only ASCII characters, has to be valid
return true;
}
- if ( !$disableMbstring && function_exists( 'mb_check_encoding' ) ) {
- return mb_check_encoding( $value, 'UTF-8' );
- } else {
- $hasUtf8 = preg_match( '/^(?>
- [\x00-\x7f]
- | [\xc0-\xdf][\x80-\xbf]
- | [\xe0-\xef][\x80-\xbf]{2}
- | [\xf0-\xf7][\x80-\xbf]{3}
- | [\xf8-\xfb][\x80-\xbf]{4}
- | \xfc[\x84-\xbf][\x80-\xbf]{4}
- )+$/x', $value );
- return ($hasUtf8 > 0 );
+ // PCRE implements repetition using recursion; to avoid a stack overflow (and segfault)
+ // for large input, we check for invalid sequences (<= 5 bytes) rather than valid
+ // sequences, which can be as long as the input string is. Multiple short regexes are
+ // used rather than a single long regex for performance.
+ static $regexes;
+ if ( $regexes === null ) {
+ $cont = "[\x80-\xbf]";
+ $after = "(?!$cont)"; // "(?:[^\x80-\xbf]|$)" would work here
+ $regexes = array(
+ // Continuation byte at the start
+ "/^$cont/",
+
+ // ASCII byte followed by a continuation byte
+ "/[\\x00-\x7f]$cont/S",
+
+ // Illegal byte
+ "/[\xc0\xc1\xf5-\xff]/S",
+
+ // Invalid 2-byte sequence, or valid one then an extra continuation byte
+ "/[\xc2-\xdf](?!$cont$after)/S",
+
+ // Invalid 3-byte sequence, or valid one then an extra continuation byte
+ "/\xe0(?![\xa0-\xbf]$cont$after)/",
+ "/[\xe1-\xec\xee\xef](?!$cont{2}$after)/S",
+ "/\xed(?![\x80-\x9f]$cont$after)/",
+
+ // Invalid 4-byte sequence, or valid one then an extra continuation byte
+ "/\xf0(?![\x90-\xbf]$cont{2}$after)/",
+ "/[\xf1-\xf3](?!$cont{3}$after)/S",
+ "/\xf4(?![\x80-\x8f]$cont{2}$after)/",
+ );
}
+
+ foreach ( $regexes as $regex ) {
+ if ( preg_match( $regex, $value ) !== 0 ) {
+ return false;
+ }
+ }
+ return true;
}
/**
@@ -217,8 +258,8 @@ class StringUtils {
/**
* More or less "markup-safe" explode()
* Ignores any instances of the separator inside <...>
- * @param $separator String
- * @param $text String
+ * @param string $separator
+ * @param string $text
* @return array
*/
static function explodeMarkup( $separator, $text ) {
@@ -233,7 +274,7 @@ class StringUtils {
// Explode, then put the replaced separators back in
$items = explode( $separator, $cleaned );
- foreach( $items as $i => $str ) {
+ foreach ( $items as $i => $str ) {
$items[$i] = str_replace( $placeholder, $separator, $str );
}
@@ -244,8 +285,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 );
@@ -256,8 +297,8 @@ class StringUtils {
/**
* Workalike for explode() with limited memory usage.
* Returns an Iterator
- * @param $separator
- * @param $subject
+ * @param string $separator
+ * @param string $subject
* @return ArrayIterator|ExplodeIterator
*/
static function explode( $separator, $subject ) {
@@ -290,14 +331,14 @@ class RegexlikeReplacer extends Replacer {
var $r;
/**
- * @param $r string
+ * @param string $r
*/
function __construct( $r ) {
$this->r = $r;
}
/**
- * @param $matches array
+ * @param array $matches
* @return string
*/
function replace( $matches ) {
@@ -318,7 +359,7 @@ class DoubleReplacer extends Replacer {
/**
* @param $from
* @param $to
- * @param $index int
+ * @param int $index
*/
function __construct( $from, $to, $index = 0 ) {
$this->from = $from;
@@ -327,7 +368,7 @@ class DoubleReplacer extends Replacer {
}
/**
- * @param $matches array
+ * @param array $matches
* @return mixed
*/
function replace( $matches ) {
@@ -343,7 +384,7 @@ class HashtableReplacer extends Replacer {
/**
* @param $table
- * @param $index int
+ * @param int $index
*/
function __construct( $table, $index = 0 ) {
$this->table = $table;
@@ -351,7 +392,7 @@ class HashtableReplacer extends Replacer {
}
/**
- * @param $matches array
+ * @param array $matches
* @return mixed
*/
function replace( $matches ) {
@@ -389,6 +430,7 @@ class ReplacementArray {
/**
* Set the whole replacement array at once
+ * @param array $data
*/
function setArray( $data ) {
$this->data = $data;
@@ -404,8 +446,8 @@ class ReplacementArray {
/**
* Set an element of the replacement array
- * @param $from string
- * @param $to string
+ * @param string $from
+ * @param string $to
*/
function setPair( $from, $to ) {
$this->data[$from] = $to;
@@ -413,7 +455,7 @@ class ReplacementArray {
}
/**
- * @param $data array
+ * @param array $data
*/
function mergeArray( $data ) {
$this->data = array_merge( $this->data, $data );
@@ -421,7 +463,7 @@ class ReplacementArray {
}
/**
- * @param $other
+ * @param ReplacementArray $other
*/
function merge( $other ) {
$this->data = array_merge( $this->data, $other->data );
@@ -429,7 +471,7 @@ class ReplacementArray {
}
/**
- * @param $from string
+ * @param string $from
*/
function removePair( $from ) {
unset( $this->data[$from] );
@@ -437,31 +479,31 @@ class ReplacementArray {
}
/**
- * @param $data array
+ * @param array $data
*/
function removeArray( $data ) {
- foreach( $data as $from => $to ) {
+ foreach ( $data as $from => $to ) {
$this->removePair( $from );
}
$this->fss = false;
}
/**
- * @param $subject string
+ * @param string $subject
* @return string
*/
function replace( $subject ) {
if ( function_exists( 'fss_prep_replace' ) ) {
- wfProfileIn( __METHOD__.'-fss' );
+ wfProfileIn( __METHOD__ . '-fss' );
if ( $this->fss === false ) {
$this->fss = fss_prep_replace( $this->data );
}
$result = fss_exec_replace( $this->fss, $subject );
- wfProfileOut( __METHOD__.'-fss' );
+ wfProfileOut( __METHOD__ . '-fss' );
} else {
- wfProfileIn( __METHOD__.'-strtr' );
+ wfProfileIn( __METHOD__ . '-strtr' );
$result = strtr( $subject, $this->data );
- wfProfileOut( __METHOD__.'-strtr' );
+ wfProfileOut( __METHOD__ . '-strtr' );
}
return $result;
}
@@ -494,15 +536,15 @@ class ExplodeIterator implements Iterator {
/**
* Construct a DelimIterator
- * @param $delim string
- * @param $s string
+ * @param string $delim
+ * @param string $subject
*/
- function __construct( $delim, $s ) {
- $this->subject = $s;
+ function __construct( $delim, $subject ) {
+ $this->subject = $subject;
$this->delim = $delim;
// Micro-optimisation (theoretical)
- $this->subjectLength = strlen( $s );
+ $this->subjectLength = strlen( $subject );
$this->delimLength = strlen( $delim );
$this->rewind();
@@ -530,6 +572,9 @@ class ExplodeIterator implements Iterator {
return $this->current;
}
+ /**
+ * @return int|bool Current position or boolean false if invalid
+ */
function key() {
return $this->curPos;
}
diff --git a/includes/StubObject.php b/includes/StubObject.php
index f0a35740..a3970f34 100644
--- a/includes/StubObject.php
+++ b/includes/StubObject.php
@@ -25,6 +25,12 @@
* their associated module code by deferring initialisation until the first
* method call.
*
+ * Note on reference parameters:
+ *
+ * If the called method takes any parameters by reference, the __call magic
+ * here won't work correctly. The solution is to unstub the object before
+ * calling the method.
+ *
* Note on unstub loops:
*
* Unstub loops (infinite recursion) sometimes occur when a constructor calls
@@ -60,7 +66,21 @@ class StubObject {
* @return Boolean: true if $obj is not an instance of StubObject class.
*/
static function isRealObject( $obj ) {
- return is_object( $obj ) && !($obj instanceof StubObject);
+ return is_object( $obj ) && !$obj instanceof StubObject;
+ }
+
+ /**
+ * Unstubs an object, if it is a stub object. Can be used to break a
+ * infinite loop when unstubbing an object or to avoid reference parameter
+ * breakage.
+ *
+ * @param $obj Object to check.
+ * @return void
+ */
+ static function unstub( $obj ) {
+ if ( $obj instanceof StubObject ) {
+ $obj->_unstub( 'unstub', 3 );
+ }
}
/**
@@ -113,7 +133,7 @@ class StubObject {
function _unstub( $name = '_unstub', $level = 2 ) {
static $recursionLevel = 0;
- if ( !($GLOBALS[$this->mGlobal] instanceof StubObject) ) {
+ if ( !$GLOBALS[$this->mGlobal] instanceof StubObject ) {
return $GLOBALS[$this->mGlobal]; // already unstubbed.
}
@@ -122,6 +142,7 @@ class StubObject {
wfProfileIn( $fname );
$caller = wfGetCaller( $level );
if ( ++$recursionLevel > 2 ) {
+ wfProfileOut( $fname );
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" );
diff --git a/includes/Timestamp.php b/includes/Timestamp.php
index 1cf99a79..edcd6a88 100644
--- a/includes/Timestamp.php
+++ b/includes/Timestamp.php
@@ -45,26 +45,10 @@ class MWTimestamp {
);
/**
- * Different units for human readable timestamps.
- * @see MWTimestamp::getHumanTimestamp
+ * The actual timestamp being wrapped (DateTime object).
+ * @var DateTime
*/
- private static $units = array(
- "milliseconds" => 1,
- "seconds" => 1000, // 1000 milliseconds per second
- "minutes" => 60, // 60 seconds per minute
- "hours" => 60, // 60 minutes per hour
- "days" => 24, // 24 hours per day
- "months" => 30, // approximately 30 days per month
- "years" => 12, // 12 months per year
- );
-
- /**
- * The actual timestamp being wrapped. Either a DateTime
- * object or a string with a Unix timestamp depending on
- * PHP.
- * @var string|DateTime
- */
- private $timestamp;
+ public $timestamp;
/**
* Make a new timestamp and set it to the specified time,
@@ -130,10 +114,10 @@ class MWTimestamp {
# asctime
$strtime = $ts;
} else {
- throw new TimestampException( __METHOD__ . " : Invalid timestamp - $ts" );
+ throw new TimestampException( __METHOD__ . ": Invalid timestamp - $ts" );
}
- if( !$strtime ) {
+ if ( !$strtime ) {
$da = array_map( 'intval', $da );
$da[0] = "%04d-%02d-%02dT%02d:%02d:%02d.00+00:00";
$strtime = call_user_func_array( "sprintf", $da );
@@ -141,12 +125,12 @@ class MWTimestamp {
try {
$final = new DateTime( $strtime, new DateTimeZone( 'GMT' ) );
- } catch(Exception $e) {
- throw new TimestampException( __METHOD__ . ' Invalid timestamp format.' );
+ } catch ( Exception $e ) {
+ throw new TimestampException( __METHOD__ . ': Invalid timestamp format.', $e->getCode(), $e );
}
- if( $final === false ) {
- throw new TimestampException( __METHOD__ . ' Invalid timestamp format.' );
+ if ( $final === false ) {
+ throw new TimestampException( __METHOD__ . ': Invalid timestamp format.' );
}
$this->timestamp = $final;
}
@@ -164,20 +148,11 @@ class MWTimestamp {
* @return string The formatted timestamp
*/
public function getTimestamp( $style = TS_UNIX ) {
- if( !isset( self::$formats[$style] ) ) {
- throw new TimestampException( __METHOD__ . ' : Illegal timestamp output type.' );
+ if ( !isset( self::$formats[$style] ) ) {
+ throw new TimestampException( __METHOD__ . ': Illegal timestamp output type.' );
}
- if( is_object( $this->timestamp ) ) {
- // DateTime object was used, call DateTime::format.
- $output = $this->timestamp->format( self::$formats[$style] );
- } elseif( TS_UNIX == $style ) {
- // Unix timestamp was used and is wanted, just return it.
- $output = $this->timestamp;
- } else {
- // Unix timestamp was used, use gmdate().
- $output = gmdate( self::$formats[$style], $this->timestamp );
- }
+ $output = $this->timestamp->format( self::$formats[$style] );
if ( ( $style == TS_RFC2822 ) || ( $style == TS_POSTGRES ) ) {
$output .= ' GMT';
@@ -194,31 +169,143 @@ class MWTimestamp {
* largest possible unit is used.
*
* @since 1.20
+ * @since 1.22 Uses Language::getHumanTimestamp to produce the timestamp
+ *
+ * @param MWTimestamp|null $relativeTo The base timestamp to compare to (defaults to now)
+ * @param User|null $user User the timestamp is being generated for (or null to use main context's user)
+ * @param Language|null $lang Language to use to make the human timestamp (or null to use main context's language)
+ * @return string Formatted timestamp
+ */
+ public function getHumanTimestamp( MWTimestamp $relativeTo = null, User $user = null, Language $lang = null ) {
+ if ( $relativeTo === null ) {
+ $relativeTo = new self();
+ }
+ if ( $user === null ) {
+ $user = RequestContext::getMain()->getUser();
+ }
+ if ( $lang === null ) {
+ $lang = RequestContext::getMain()->getLanguage();
+ }
+
+ // Adjust for the user's timezone.
+ $offsetThis = $this->offsetForUser( $user );
+ $offsetRel = $relativeTo->offsetForUser( $user );
+
+ $ts = '';
+ if ( wfRunHooks( 'GetHumanTimestamp', array( &$ts, $this, $relativeTo, $user, $lang ) ) ) {
+ $ts = $lang->getHumanTimestamp( $this, $relativeTo, $user );
+ }
+
+ // Reset the timezone on the objects.
+ $this->timestamp->sub( $offsetThis );
+ $relativeTo->timestamp->sub( $offsetRel );
+
+ return $ts;
+ }
+
+ /**
+ * Adjust the timestamp depending on the given user's preferences.
*
- * @return Message Formatted timestamp
+ * @since 1.22
+ *
+ * @param User $user User to take preferences from
+ * @param[out] MWTimestamp $ts Timestamp to adjust
+ * @return DateInterval Offset that was applied to the timestamp
*/
- public function getHumanTimestamp() {
- $then = $this->getTimestamp( TS_UNIX );
- $now = time();
- $timeago = ($now - $then) * 1000;
- $message = false;
-
- foreach( self::$units as $unit => $factor ) {
- $next = $timeago / $factor;
- if( $next < 1 ) {
- break;
+ public function offsetForUser( User $user ) {
+ global $wgLocalTZoffset;
+
+ $option = $user->getOption( 'timecorrection' );
+ $data = explode( '|', $option, 3 );
+
+ // First handle the case of an actual timezone being specified.
+ if ( $data[0] == 'ZoneInfo' ) {
+ try {
+ $tz = new DateTimeZone( $data[2] );
+ } catch ( Exception $e ) {
+ $tz = false;
+ }
+
+ if ( $tz ) {
+ $this->timestamp->setTimezone( $tz );
+ return new DateInterval( 'P0Y' );
} else {
- $timeago = $next;
- $message = array( $unit, floor( $timeago ) );
+ $data[0] = 'Offset';
}
}
- if( $message ) {
- $initial = call_user_func_array( 'wfMessage', $message );
- return wfMessage( 'ago', $initial->parse() );
+ $diff = 0;
+ // If $option is in fact a pipe-separated value, check the
+ // first value.
+ if ( $data[0] == 'System' ) {
+ // First value is System, so use the system offset.
+ if ( isset( $wgLocalTZoffset ) ) {
+ $diff = $wgLocalTZoffset;
+ }
+ } elseif ( $data[0] == 'Offset' ) {
+ // First value is Offset, so use the specified offset
+ $diff = (int)$data[1];
} else {
- return wfMessage( 'just-now' );
+ // $option actually isn't a pipe separated value, but instead
+ // a comma separated value. Isn't MediaWiki fun?
+ $data = explode( ':', $option );
+ if ( count( $data ) >= 2 ) {
+ // Combination hours and minutes.
+ $diff = abs( (int)$data[0] ) * 60 + (int)$data[1];
+ if ( (int)$data[0] < 0 ) {
+ $diff *= -1;
+ }
+ } else {
+ // Just hours.
+ $diff = (int)$data[0] * 60;
+ }
+ }
+
+ $interval = new DateInterval( 'PT' . abs( $diff ) . 'M' );
+ if ( $diff < 1 ) {
+ $interval->invert = 1;
}
+
+ $this->timestamp->add( $interval );
+ return $interval;
+ }
+
+ /**
+ * Generate a purely relative timestamp, i.e., represent the time elapsed between
+ * the given base timestamp and this object.
+ *
+ * @param MWTimestamp $relativeTo Relative base timestamp (defaults to now)
+ * @param User $user Use to use offset for
+ * @param Language $lang Language to use
+ * @param array $chosenIntervals Intervals to use to represent it
+ * @return string Relative timestamp
+ */
+ public function getRelativeTimestamp(
+ MWTimestamp $relativeTo = null,
+ User $user = null,
+ Language $lang = null,
+ array $chosenIntervals = array()
+ ) {
+ if ( $relativeTo === null ) {
+ $relativeTo = new self;
+ }
+ if ( $user === null ) {
+ $user = RequestContext::getMain()->getUser();
+ }
+ if ( $lang === null ) {
+ $lang = RequestContext::getMain()->getLanguage();
+ }
+
+ $ts = '';
+ $diff = $this->diff( $relativeTo );
+ if ( wfRunHooks( 'GetRelativeTimestamp', array( &$ts, &$diff, $this, $relativeTo, $user, $lang ) ) ) {
+ $seconds = ( ( ( $diff->days * 24 + $diff->h ) * 60 + $diff->i ) * 60 + $diff->s );
+ $ts = wfMessage( 'ago', $lang->formatDuration( $seconds, $chosenIntervals ) )
+ ->inLanguage( $lang )
+ ->text();
+ }
+
+ return $ts;
}
/**
@@ -229,6 +316,78 @@ class MWTimestamp {
public function __toString() {
return $this->getTimestamp();
}
+
+ /**
+ * Calculate the difference between two MWTimestamp objects.
+ *
+ * @since 1.22
+ * @param MWTimestamp $relativeTo Base time to calculate difference from
+ * @return DateInterval|bool The DateInterval object representing the difference between the two dates or false on failure
+ */
+ public function diff( MWTimestamp $relativeTo ) {
+ return $this->timestamp->diff( $relativeTo->timestamp );
+ }
+
+ /**
+ * Set the timezone of this timestamp to the specified timezone.
+ *
+ * @since 1.22
+ * @param String $timezone Timezone to set
+ * @throws TimestampException
+ */
+ public function setTimezone( $timezone ) {
+ try {
+ $this->timestamp->setTimezone( new DateTimeZone( $timezone ) );
+ } catch ( Exception $e ) {
+ throw new TimestampException( __METHOD__ . ': Invalid timezone.', $e->getCode(), $e );
+ }
+ }
+
+ /**
+ * Get the timezone of this timestamp.
+ *
+ * @since 1.22
+ * @return DateTimeZone The timezone
+ */
+ public function getTimezone() {
+ return $this->timestamp->getTimezone();
+ }
+
+ /**
+ * Format the timestamp in a given format.
+ *
+ * @since 1.22
+ * @param string $format Pattern to format in
+ * @return string The formatted timestamp
+ */
+ public function format( $format ) {
+ return $this->timestamp->format( $format );
+ }
+
+ /**
+ * Get a timestamp instance in the server local timezone ($wgLocaltimezone)
+ *
+ * @since 1.22
+ * @param bool|string $ts Timestamp to set, or false for current time
+ * @return MWTimestamp the local instance
+ */
+ public static function getLocalInstance( $ts = false ) {
+ global $wgLocaltimezone;
+ $timestamp = new self( $ts );
+ $timestamp->setTimezone( $wgLocaltimezone );
+ return $timestamp;
+ }
+
+ /**
+ * Get a timestamp instance in GMT
+ *
+ * @since 1.22
+ * @param bool|string $ts Timestamp to set, or false for current time
+ * @return MWTimestamp the instance
+ */
+ public static function getInstance( $ts = false ) {
+ return new self( $ts );
+ }
}
/**
diff --git a/includes/Title.php b/includes/Title.php
index ca66aaec..21872e45 100644
--- a/includes/Title.php
+++ b/includes/Title.php
@@ -225,7 +225,7 @@ class Title {
*
* @param int $id the page_id corresponding to the Title to create
* @param int $flags use Title::GAID_FOR_UPDATE to use master
- * @return Title the new object, or NULL on an error
+ * @return Title|null the new object, or NULL on an error
*/
public static function newFromID( $id, $flags = 0 ) {
$db = ( $flags & self::GAID_FOR_UPDATE ) ? wfGetDB( DB_MASTER ) : wfGetDB( DB_SLAVE );
@@ -289,18 +289,23 @@ class Title {
*/
public function loadFromRow( $row ) {
if ( $row ) { // page found
- if ( isset( $row->page_id ) )
+ if ( isset( $row->page_id ) ) {
$this->mArticleID = (int)$row->page_id;
- if ( isset( $row->page_len ) )
+ }
+ if ( isset( $row->page_len ) ) {
$this->mLength = (int)$row->page_len;
- if ( isset( $row->page_is_redirect ) )
+ }
+ if ( isset( $row->page_is_redirect ) ) {
$this->mRedirect = (bool)$row->page_is_redirect;
- if ( isset( $row->page_latest ) )
+ }
+ if ( isset( $row->page_latest ) ) {
$this->mLatestID = (int)$row->page_latest;
- if ( isset( $row->page_content_model ) )
+ }
+ if ( isset( $row->page_content_model ) ) {
$this->mContentModel = strval( $row->page_content_model );
- else
+ } else {
$this->mContentModel = false; # initialized lazily in getContentModel()
+ }
} else { // page not found
$this->mArticleID = 0;
$this->mLength = 0;
@@ -487,6 +492,108 @@ class Title {
}
/**
+ * Utility method for converting a character sequence from bytes to Unicode.
+ *
+ * Primary usecase being converting $wgLegalTitleChars to a sequence usable in
+ * javascript, as PHP uses UTF-8 bytes where javascript uses Unicode code units.
+ *
+ * @param string $byteClass
+ * @return string
+ */
+ public static function convertByteClassToUnicodeClass( $byteClass ) {
+ $length = strlen( $byteClass );
+ // Input token queue
+ $x0 = $x1 = $x2 = '';
+ // Decoded queue
+ $d0 = $d1 = $d2 = '';
+ // Decoded integer codepoints
+ $ord0 = $ord1 = $ord2 = 0;
+ // Re-encoded queue
+ $r0 = $r1 = $r2 = '';
+ // Output
+ $out = '';
+ // Flags
+ $allowUnicode = false;
+ for ( $pos = 0; $pos < $length; $pos++ ) {
+ // Shift the queues down
+ $x2 = $x1;
+ $x1 = $x0;
+ $d2 = $d1;
+ $d1 = $d0;
+ $ord2 = $ord1;
+ $ord1 = $ord0;
+ $r2 = $r1;
+ $r1 = $r0;
+ // Load the current input token and decoded values
+ $inChar = $byteClass[$pos];
+ if ( $inChar == '\\' ) {
+ if ( preg_match( '/x([0-9a-fA-F]{2})/A', $byteClass, $m, 0, $pos + 1 ) ) {
+ $x0 = $inChar . $m[0];
+ $d0 = chr( hexdec( $m[1] ) );
+ $pos += strlen( $m[0] );
+ } elseif ( preg_match( '/[0-7]{3}/A', $byteClass, $m, 0, $pos + 1 ) ) {
+ $x0 = $inChar . $m[0];
+ $d0 = chr( octdec( $m[0] ) );
+ $pos += strlen( $m[0] );
+ } elseif ( $pos + 1 >= $length ) {
+ $x0 = $d0 = '\\';
+ } else {
+ $d0 = $byteClass[$pos + 1];
+ $x0 = $inChar . $d0;
+ $pos += 1;
+ }
+ } else {
+ $x0 = $d0 = $inChar;
+ }
+ $ord0 = ord( $d0 );
+ // Load the current re-encoded value
+ if ( $ord0 < 32 || $ord0 == 0x7f ) {
+ $r0 = sprintf( '\x%02x', $ord0 );
+ } elseif ( $ord0 >= 0x80 ) {
+ // Allow unicode if a single high-bit character appears
+ $r0 = sprintf( '\x%02x', $ord0 );
+ $allowUnicode = true;
+ } elseif ( strpos( '-\\[]^', $d0 ) !== false ) {
+ $r0 = '\\' . $d0;
+ } else {
+ $r0 = $d0;
+ }
+ // Do the output
+ if ( $x0 !== '' && $x1 === '-' && $x2 !== '' ) {
+ // Range
+ if ( $ord2 > $ord0 ) {
+ // Empty range
+ } elseif ( $ord0 >= 0x80 ) {
+ // Unicode range
+ $allowUnicode = true;
+ if ( $ord2 < 0x80 ) {
+ // Keep the non-unicode section of the range
+ $out .= "$r2-\\x7F";
+ }
+ } else {
+ // Normal range
+ $out .= "$r2-$r0";
+ }
+ // Reset state to the initial value
+ $x0 = $x1 = $d0 = $d1 = $r0 = $r1 = '';
+ } elseif ( $ord2 < 0x80 ) {
+ // ASCII character
+ $out .= $r2;
+ }
+ }
+ if ( $ord1 < 0x80 ) {
+ $out .= $r1;
+ }
+ if ( $ord0 < 0x80 ) {
+ $out .= $r0;
+ }
+ if ( $allowUnicode ) {
+ $out .= '\u0080-\uFFFF';
+ }
+ return $out;
+ }
+
+ /**
* Get a string representation of a title suitable for
* including in a search index
*
@@ -689,7 +796,7 @@ class Title {
$this->mContentModel = ContentHandler::getDefaultModelFor( $this );
}
- if( !$this->mContentModel ) {
+ if ( !$this->mContentModel ) {
throw new MWException( 'Failed to determine content model!' );
}
@@ -752,7 +859,7 @@ class Title {
*/
public function getTalkNsText() {
global $wgContLang;
- return( $wgContLang->getNsText( MWNamespace::getTalk( $this->mNamespace ) ) );
+ return $wgContLang->getNsText( MWNamespace::getTalk( $this->mNamespace ) );
}
/**
@@ -761,7 +868,7 @@ class Title {
* @return Bool TRUE or FALSE
*/
public function canTalk() {
- return( MWNamespace::canTalk( $this->mNamespace ) );
+ return MWNamespace::canTalk( $this->mNamespace );
}
/**
@@ -939,7 +1046,7 @@ class Title {
* @return Bool
*/
public function isConversionTable() {
- //@todo: ConversionTable should become a separate content model.
+ // @todo ConversionTable should become a separate content model.
return $this->getNamespace() == NS_MEDIAWIKI &&
strpos( $this->getText(), 'Conversiontable/' ) === 0;
@@ -995,10 +1102,11 @@ class Title {
*/
public function getSkinFromCssJsSubpage() {
$subpage = explode( '/', $this->mTextform );
- $subpage = $subpage[ count( $subpage ) - 1 ];
+ $subpage = $subpage[count( $subpage ) - 1];
$lastdot = strrpos( $subpage, '.' );
- if ( $lastdot === false )
+ if ( $lastdot === false ) {
return $subpage; # Never happens: only called for names ending in '.css' or '.js'
+ }
return substr( $subpage, 0, $lastdot );
}
@@ -1269,10 +1377,10 @@ class Title {
*/
public function getSubpageText() {
if ( !MWNamespace::hasSubpages( $this->mNamespace ) ) {
- return( $this->mTextform );
+ return $this->mTextform;
}
$parts = explode( '/', $this->mTextform );
- return( $parts[count( $parts ) - 1] );
+ return $parts[count( $parts ) - 1];
}
/**
@@ -1312,7 +1420,7 @@ class Title {
public function getSubpageUrlForm() {
$text = $this->getSubpageText();
$text = wfUrlencode( str_replace( ' ', '_', $text ) );
- return( $text );
+ return $text;
}
/**
@@ -1327,8 +1435,8 @@ class Title {
}
/**
- * Helper to fix up the get{Local,Full,Link,Canonical}URL args
- * get{Canonical,Full,Link,Local}URL methods accepted an optional
+ * Helper to fix up the get{Canonical,Full,Link,Local,Internal}URL args
+ * get{Canonical,Full,Link,Local,Internal}URL methods accepted an optional
* second argument named variant. This was deprecated in favor
* of passing an array of option with a "variant" key
* Once $query2 is removed for good, this helper can be dropped
@@ -1340,8 +1448,10 @@ class Title {
* @return String
*/
private static function fixUrlQueryArgs( $query, $query2 = false ) {
- if( $query2 !== false ) {
- wfDeprecated( "Title::get{Canonical,Full,Link,Local} method called with a second parameter is deprecated. Add your parameter to an array passed as the first parameter.", "1.19" );
+ if ( $query2 !== false ) {
+ wfDeprecated( "Title::get{Canonical,Full,Link,Local,Internal}URL " .
+ "method called with a second parameter is deprecated. Add your " .
+ "parameter to an array passed as the first parameter.", "1.19" );
}
if ( is_array( $query ) ) {
$query = wfArrayToCgi( $query );
@@ -1399,7 +1509,6 @@ class Title {
* Get a URL with no fragment or server name. If this page is generated
* with action=render, $wgServer is prepended.
*
-
* @param string|array $query an optional query string,
* not used for interwiki links. Can be specified as an associative array as well,
* e.g., array( 'action' => 'edit' ) (keys and values will be URL-escaped).
@@ -1434,7 +1543,7 @@ class Title {
$url = str_replace( '$1', $dbkey, $wgArticlePath );
wfRunHooks( 'GetLocalURL::Article', array( &$this, &$url ) );
} else {
- global $wgVariantArticlePath, $wgActionPaths;
+ global $wgVariantArticlePath, $wgActionPaths, $wgContLang;
$url = false;
$matches = array();
@@ -1456,6 +1565,7 @@ class Title {
if ( $url === false &&
$wgVariantArticlePath &&
+ $wgContLang->getCode() === $this->getPageLanguage()->getCode() &&
$this->getPageLanguage()->hasVariants() &&
preg_match( '/^variant=([^&]*)$/', $query, $matches ) )
{
@@ -1732,6 +1842,10 @@ class Title {
* @return Array list of errors
*/
private function checkQuickPermissions( $action, $user, $errors, $doExpensiveQueries, $short ) {
+ if ( !wfRunHooks( 'TitleQuickPermissions', array( $this, $user, $action, &$errors, $doExpensiveQueries, $short ) ) ) {
+ return $errors;
+ }
+
if ( $action == 'create' ) {
if (
( $this->isTalkPage() && !$user->isAllowed( 'createtalk' ) ) ||
@@ -1880,12 +1994,19 @@ class Title {
# Protect css/js subpages of user pages
# XXX: this might be better using restrictions
# XXX: right 'editusercssjs' is deprecated, for backward compatibility only
- if ( $action != 'patrol' && !$user->isAllowed( 'editusercssjs' )
- && !preg_match( '/^' . preg_quote( $user->getName(), '/' ) . '\//', $this->mTextform ) ) {
- if ( $this->isCssSubpage() && !$user->isAllowed( 'editusercss' ) ) {
- $errors[] = array( 'customcssprotected' );
- } elseif ( $this->isJsSubpage() && !$user->isAllowed( 'edituserjs' ) ) {
- $errors[] = array( 'customjsprotected' );
+ if ( $action != 'patrol' && !$user->isAllowed( 'editusercssjs' ) ) {
+ if ( preg_match( '/^' . preg_quote( $user->getName(), '/' ) . '\//', $this->mTextform ) ) {
+ if ( $this->isCssSubpage() && !$user->isAllowedAny( 'editmyusercss', 'editusercss' ) ) {
+ $errors[] = array( 'mycustomcssprotected' );
+ } elseif ( $this->isJsSubpage() && !$user->isAllowedAny( 'editmyuserjs', 'edituserjs' ) ) {
+ $errors[] = array( 'mycustomjsprotected' );
+ }
+ } else {
+ if ( $this->isCssSubpage() && !$user->isAllowed( 'editusercss' ) ) {
+ $errors[] = array( 'customcssprotected' );
+ } elseif ( $this->isJsSubpage() && !$user->isAllowed( 'edituserjs' ) ) {
+ $errors[] = array( 'customjsprotected' );
+ }
}
}
@@ -1907,18 +2028,21 @@ class Title {
*/
private function checkPageRestrictions( $action, $user, $errors, $doExpensiveQueries, $short ) {
foreach ( $this->getRestrictions( $action ) as $right ) {
- // Backwards compatibility, rewrite sysop -> protect
+ // Backwards compatibility, rewrite sysop -> editprotected
if ( $right == 'sysop' ) {
- $right = 'protect';
+ $right = 'editprotected';
}
- if ( $right != '' && !$user->isAllowed( $right ) ) {
- // Users with 'editprotected' permission can edit protected pages
- // without cascading option turned on.
- if ( $action != 'edit' || !$user->isAllowed( 'editprotected' )
- || $this->mCascadeRestriction )
- {
- $errors[] = array( 'protectedpagetext', $right );
- }
+ // Backwards compatibility, rewrite autoconfirmed -> editsemiprotected
+ if ( $right == 'autoconfirmed' ) {
+ $right = 'editsemiprotected';
+ }
+ if ( $right == '' ) {
+ continue;
+ }
+ if ( !$user->isAllowed( $right ) ) {
+ $errors[] = array( 'protectedpagetext', $right );
+ } elseif ( $this->mCascadeRestriction && !$user->isAllowed( 'protect' ) ) {
+ $errors[] = array( 'protectedpagetext', 'protect' );
}
}
@@ -1950,11 +2074,19 @@ class Title {
# This is only for protection restrictions, not for all actions
if ( isset( $restrictions[$action] ) ) {
foreach ( $restrictions[$action] as $right ) {
- $right = ( $right == 'sysop' ) ? 'protect' : $right;
- if ( $right != '' && !$user->isAllowed( $right ) ) {
+ // Backwards compatibility, rewrite sysop -> editprotected
+ if ( $right == 'sysop' ) {
+ $right = 'editprotected';
+ }
+ // Backwards compatibility, rewrite autoconfirmed -> editsemiprotected
+ if ( $right == 'autoconfirmed' ) {
+ $right = 'editsemiprotected';
+ }
+ if ( $right != '' && !$user->isAllowedAll( 'protect', $right ) ) {
$pages = '';
- foreach ( $cascadingSources as $page )
+ foreach ( $cascadingSources as $page ) {
$pages .= '* [[:' . $page->getPrefixedText() . "]]\n";
+ }
$errors[] = array( 'cascadeprotected', count( $cascadingSources ), $pages );
}
}
@@ -1985,11 +2117,14 @@ class Title {
}
} elseif ( $action == 'create' ) {
$title_protection = $this->getTitleProtection();
- if( $title_protection ) {
- if( $title_protection['pt_create_perm'] == 'sysop' ) {
- $title_protection['pt_create_perm'] = 'protect'; // B/C
+ if ( $title_protection ) {
+ if ( $title_protection['pt_create_perm'] == 'sysop' ) {
+ $title_protection['pt_create_perm'] = 'editprotected'; // B/C
+ }
+ if ( $title_protection['pt_create_perm'] == 'autoconfirmed' ) {
+ $title_protection['pt_create_perm'] = 'editsemiprotected'; // B/C
}
- if( $title_protection['pt_create_perm'] == '' ||
+ 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'] );
@@ -2034,11 +2169,11 @@ class Title {
private function checkUserBlock( $action, $user, $errors, $doExpensiveQueries, $short ) {
// Account creation blocks handled at userlogin.
// Unblocking handled in SpecialUnblock
- if( !$doExpensiveQueries || in_array( $action, array( 'createaccount', 'unblock' ) ) ) {
+ if ( !$doExpensiveQueries || in_array( $action, array( 'createaccount', 'unblock' ) ) ) {
return $errors;
}
- global $wgContLang, $wgLang, $wgEmailConfirmToEdit;
+ global $wgEmailConfirmToEdit;
if ( $wgEmailConfirmToEdit && !$user->isEmailConfirmed() ) {
$errors[] = array( 'confirmedittext' );
@@ -2047,39 +2182,9 @@ class Title {
if ( ( $action == 'edit' || $action == 'create' ) && !$user->isBlockedFrom( $this ) ) {
// Don't block the user from editing their own talk page unless they've been
// explicitly blocked from that too.
- } elseif( $user->isBlocked() && $user->mBlock->prevents( $action ) !== false ) {
- $block = $user->getBlock();
-
- // This is from OutputPage::blockedPage
- // Copied at r23888 by werdna
-
- $id = $user->blockedBy();
- $reason = $user->blockedFor();
- if ( $reason == '' ) {
- $reason = wfMessage( 'blockednoreason' )->text();
- }
- $ip = $user->getRequest()->getIP();
-
- if ( is_numeric( $id ) ) {
- $name = User::whoIs( $id );
- } else {
- $name = $id;
- }
-
- $link = '[[' . $wgContLang->getNsText( NS_USER ) . ":{$name}|{$name}]]";
- $blockid = $block->getId();
- $blockExpiry = $block->getExpiry();
- $blockTimestamp = $wgLang->timeanddate( wfTimestamp( TS_MW, $block->mTimestamp ), true );
- if ( $blockExpiry == 'infinity' ) {
- $blockExpiry = wfMessage( 'infiniteblock' )->text();
- } else {
- $blockExpiry = $wgLang->timeanddate( wfTimestamp( TS_MW, $blockExpiry ), true );
- }
-
- $intended = strval( $block->getTarget() );
-
- $errors[] = array( ( $block->mAuto ? 'autoblockedtext' : 'blockedtext' ), $link, $reason, $ip, $name,
- $blockid, $blockExpiry, $intended, $blockTimestamp );
+ } elseif ( $user->isBlocked() && $user->mBlock->prevents( $action ) !== false ) {
+ // @todo FIXME: Pass the relevant context into this function.
+ $errors[] = $user->getBlock()->getPermissionsError( RequestContext::getMain() );
}
return $errors;
@@ -2097,34 +2202,10 @@ class Title {
* @return Array list of errors
*/
private function checkReadPermissions( $action, $user, $errors, $doExpensiveQueries, $short ) {
- global $wgWhitelistRead, $wgWhitelistReadRegexp, $wgRevokePermissions;
- static $useShortcut = null;
-
- # Initialize the $useShortcut boolean, to determine if we can skip quite a bit of code below
- if ( is_null( $useShortcut ) ) {
- $useShortcut = true;
- if ( !User::groupHasPermission( '*', 'read' ) ) {
- # Not a public wiki, so no shortcut
- $useShortcut = false;
- } 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'] ) ) {
- # We might be removing the read right from the user, so no shortcut
- $useShortcut = false;
- break;
- }
- }
- }
- }
+ global $wgWhitelistRead, $wgWhitelistReadRegexp;
$whitelisted = false;
- if ( $useShortcut ) {
+ if ( User::isEveryoneAllowed( 'read' ) ) {
# Shortcut for public wikis, allows skipping quite a bit of code
$whitelisted = true;
} elseif ( $user->isAllowed( 'read' ) ) {
@@ -2165,7 +2246,7 @@ class Title {
}
}
- if( !$whitelisted && is_array( $wgWhitelistReadRegexp ) && !empty( $wgWhitelistReadRegexp ) ) {
+ if ( !$whitelisted && is_array( $wgWhitelistReadRegexp ) && !empty( $wgWhitelistReadRegexp ) ) {
$name = $this->getPrefixedText();
// Check for regex whitelisting
foreach ( $wgWhitelistReadRegexp as $listItem ) {
@@ -2250,7 +2331,7 @@ class Title {
}
$errors = array();
- while( count( $checks ) > 0 &&
+ while ( count( $checks ) > 0 &&
!( $short && count( $errors ) > 0 ) ) {
$method = array_shift( $checks );
$errors = $this->$method( $action, $user, $errors, $doExpensiveQueries, $short );
@@ -2261,36 +2342,6 @@ class Title {
}
/**
- * Protect css subpages of user pages: can $wgUser edit
- * this page?
- *
- * @deprecated in 1.19; will be removed in 1.20. Use getUserPermissionsErrors() instead.
- * @return Bool
- */
- public function userCanEditCssSubpage() {
- global $wgUser;
- wfDeprecated( __METHOD__, '1.19' );
- return ( ( $wgUser->isAllowedAll( 'editusercssjs', 'editusercss' ) )
- || preg_match( '/^' . preg_quote( $wgUser->getName(), '/' ) . '\//', $this->mTextform ) );
- }
-
- /**
- * Protect js subpages of user pages: can $wgUser edit
- * this page?
- *
- * @deprecated in 1.19; will be removed in 1.20. Use getUserPermissionsErrors() instead.
- * @return Bool
- */
- public function userCanEditJsSubpage() {
- global $wgUser;
- wfDeprecated( __METHOD__, '1.19' );
- return (
- ( $wgUser->isAllowedAll( 'editusercssjs', 'edituserjs' ) )
- || preg_match( '/^' . preg_quote( $wgUser->getName(), '/' ) . '\//', $this->mTextform )
- );
- }
-
- /**
* 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
@@ -2371,7 +2422,7 @@ class Title {
/**
* Update the title protection status
*
- * @deprecated in 1.19; will be removed in 1.20. Use WikiPage::doUpdateRestrictions() instead.
+ * @deprecated in 1.19; use WikiPage::doUpdateRestrictions() instead.
* @param $create_perm String Permission required for creation
* @param string $reason Reason for protection
* @param string $expiry Expiry timestamp
@@ -2407,29 +2458,31 @@ class Title {
}
/**
- * Is this page "semi-protected" - the *only* protection is autoconfirm?
+ * Is this page "semi-protected" - the *only* protection levels are listed
+ * in $wgSemiprotectedRestrictionLevels?
*
* @param string $action Action to check (default: edit)
* @return Bool
*/
public function isSemiProtected( $action = 'edit' ) {
- if ( $this->exists() ) {
- $restrictions = $this->getRestrictions( $action );
- if ( count( $restrictions ) > 0 ) {
- foreach ( $restrictions as $restriction ) {
- if ( strtolower( $restriction ) != 'autoconfirmed' ) {
- return false;
- }
- }
- } else {
- # Not protected
- return false;
- }
- return true;
- } else {
- # If it doesn't exist, it can't be protected
+ global $wgSemiprotectedRestrictionLevels;
+
+ $restrictions = $this->getRestrictions( $action );
+ $semi = $wgSemiprotectedRestrictionLevels;
+ if ( !$restrictions || !$semi ) {
+ // Not protected, or all protection is full protection
return false;
}
+
+ // Remap autoconfirmed to editsemiprotected for BC
+ foreach ( array_keys( $semi, 'autoconfirmed' ) as $key ) {
+ $semi[$key] = 'editsemiprotected';
+ }
+ foreach ( array_keys( $restrictions, 'autoconfirmed' ) as $key ) {
+ $restrictions[$key] = 'editsemiprotected';
+ }
+
+ return !array_diff( $restrictions, $semi );
}
/**
@@ -2445,7 +2498,7 @@ class Title {
$restrictionTypes = $this->getRestrictionTypes();
# Special pages have inherent protection
- if( $this->isSpecialPage() ) {
+ if ( $this->isSpecialPage() ) {
return true;
}
@@ -2692,7 +2745,7 @@ class Title {
$this->mRestrictions['move'] = explode( ',', trim( $temp[0] ) );
} else {
$restriction = trim( $temp[1] );
- if( $restriction != '' ) { //some old entries are empty
+ if ( $restriction != '' ) { //some old entries are empty
$this->mRestrictions[$temp[0]] = explode( ',', $restriction );
}
}
@@ -2711,8 +2764,9 @@ class Title {
foreach ( $rows as $row ) {
// 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,
// But I don't really see any harm in leaving it in Block for now -werdna
@@ -2798,18 +2852,20 @@ class Title {
return;
}
+ $method = __METHOD__;
$dbw = wfGetDB( DB_MASTER );
- $dbw->delete(
- 'page_restrictions',
- array( 'pr_expiry < ' . $dbw->addQuotes( $dbw->timestamp() ) ),
- __METHOD__
- );
-
- $dbw->delete(
- 'protected_titles',
- array( 'pt_expiry < ' . $dbw->addQuotes( $dbw->timestamp() ) ),
- __METHOD__
- );
+ $dbw->onTransactionIdle( function() use ( $dbw, $method ) {
+ $dbw->delete(
+ 'page_restrictions',
+ array( 'pr_expiry < ' . $dbw->addQuotes( $dbw->timestamp() ) ),
+ $method
+ );
+ $dbw->delete(
+ 'protected_titles',
+ array( 'pt_expiry < ' . $dbw->addQuotes( $dbw->timestamp() ) ),
+ $method
+ );
+ } );
}
/**
@@ -2960,11 +3016,13 @@ class Title {
$linkCache = LinkCache::singleton();
$cached = $linkCache->getGoodLinkFieldObj( $this, 'redirect' );
if ( $cached === null ) {
- // TODO: check the assumption that the cache actually knows about this title
- // and handle this, such as get the title from the database.
- // See https://bugzilla.wikimedia.org/show_bug.cgi?id=37209
- wfDebug( "LinkCache doesn't currently know about this title: " . $this->getPrefixedDBkey() );
- wfDebug( wfBacktrace() );
+ # Trust LinkCache's state over our own
+ # LinkCache is telling us that the page doesn't exist, despite there being cached
+ # data relating to an existing page in $this->mArticleID. Updaters should clear
+ # LinkCache as appropriate, or use $flags = Title::GAID_FOR_UPDATE. If that flag is
+ # set, then LinkCache will definitely be up to date here, since getArticleID() forces
+ # LinkCache to refresh its data from the master.
+ return $this->mRedirect = false;
}
$this->mRedirect = (bool)$cached;
@@ -2989,11 +3047,9 @@ class Title {
}
$linkCache = LinkCache::singleton();
$cached = $linkCache->getGoodLinkFieldObj( $this, 'length' );
- if ( $cached === null ) { # check the assumption that the cache actually knows about this title
- # XXX: this does apparently happen, see https://bugzilla.wikimedia.org/show_bug.cgi?id=37209
- # as a stop gap, perhaps log this, but don't throw an exception?
- wfDebug( "LinkCache doesn't currently know about this title: " . $this->getPrefixedDBkey() );
- wfDebug( wfBacktrace() );
+ if ( $cached === null ) {
+ # Trust LinkCache's state over our own, as for isRedirect()
+ return $this->mLength = 0;
}
$this->mLength = intval( $cached );
@@ -3005,7 +3061,6 @@ class Title {
* What is the page_latest field for this page?
*
* @param int $flags a bit field; may be Title::GAID_FOR_UPDATE to select for update
- * @throws MWException
* @return Int or 0 if the page doesn't exist
*/
public function getLatestRevID( $flags = 0 ) {
@@ -3019,10 +3074,9 @@ class Title {
$linkCache = LinkCache::singleton();
$linkCache->addLinkObj( $this );
$cached = $linkCache->getGoodLinkFieldObj( $this, 'revision' );
- if ( $cached === null ) { # check the assumption that the cache actually knows about this title
- # XXX: this does apparently happen, see https://bugzilla.wikimedia.org/show_bug.cgi?id=37209
- # as a stop gap, perhaps log this, but don't throw an exception?
- throw new MWException( "LinkCache doesn't currently know about this title: " . $this->getPrefixedDBkey() );
+ if ( $cached === null ) {
+ # Trust LinkCache's state over our own, as for isRedirect()
+ return $this->mLatestID = 0;
}
$this->mLatestID = intval( $cached );
@@ -3111,7 +3165,7 @@ class Title {
return false;
}
- if ( false !== strpos( $dbkey, UTF8_REPLACEMENT ) ) {
+ if ( strpos( $dbkey, UTF8_REPLACEMENT ) !== false ) {
# Contained illegal UTF-8 sequences or forbidden Unicode chars.
return false;
}
@@ -3248,6 +3302,7 @@ class Title {
# Can't make a link to a namespace alone... "empty" local links can only be
# self-links with a fragment identifier.
+ # TODO: Why do we exclude NS_MAIN (bug 54044)
if ( $dbkey == '' && $this->mInterwiki == '' && $this->mNamespace != NS_MAIN ) {
return false;
}
@@ -3301,7 +3356,7 @@ class Title {
array(
"{$prefix}_from=page_id",
"{$prefix}_namespace" => $this->getNamespace(),
- "{$prefix}_title" => $this->getDBkey() ),
+ "{$prefix}_title" => $this->getDBkey() ),
__METHOD__,
$options
);
@@ -3366,7 +3421,9 @@ class Title {
$titleField = "{$prefix}_title";
$fields = array( $namespaceFiled, $titleField, 'page_id', 'page_len', 'page_is_redirect', 'page_latest' );
- if ( $wgContentHandlerUseDB ) $fields[] = 'page_content_model';
+ if ( $wgContentHandlerUseDB ) {
+ $fields[] = 'page_content_model';
+ }
$res = $db->select(
array( $table, 'page' ),
@@ -3465,6 +3522,7 @@ class Title {
}
}
+ wfRunHooks( 'TitleSquidURLs', array( $this, &$urls ) );
return $urls;
}
@@ -3585,7 +3643,13 @@ class Title {
}
} else {
$tp = $nt->getTitleProtection();
- $right = ( $tp['pt_create_perm'] == 'sysop' ) ? 'protect' : $tp['pt_create_perm'];
+ $right = $tp['pt_create_perm'];
+ if ( $right == 'sysop' ) {
+ $right = 'editprotected'; // B/C
+ }
+ if ( $right == 'autoconfirmed' ) {
+ $right = 'editsemiprotected'; // B/C
+ }
if ( $tp and !$wgUser->isAllowed( $right ) ) {
$errors[] = array( 'cantmove-titleprotected' );
}
@@ -3659,6 +3723,8 @@ class Title {
$createRedirect = true;
}
+ wfRunHooks( 'TitleMove', array( $this, $nt, $wgUser ) );
+
// 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 );
@@ -3711,12 +3777,12 @@ class Title {
# Protect the redirect title as the title used to be...
$dbw->insertSelect( 'page_restrictions', 'page_restrictions',
array(
- 'pr_page' => $redirid,
- 'pr_type' => 'pr_type',
- 'pr_level' => 'pr_level',
+ 'pr_page' => $redirid,
+ 'pr_type' => 'pr_type',
+ 'pr_level' => 'pr_level',
'pr_cascade' => 'pr_cascade',
- 'pr_user' => 'pr_user',
- 'pr_expiry' => 'pr_expiry'
+ 'pr_user' => 'pr_user',
+ 'pr_expiry' => 'pr_expiry'
),
array( 'pr_page' => $pageid ),
__METHOD__,
@@ -3733,7 +3799,7 @@ class Title {
$comment .= wfMessage( 'colon-separator' )->inContentLanguage()->text() . $reason;
}
// @todo FIXME: $params?
- $log->addEntry( 'move_prot', $nt, $comment, array( $this->getPrefixedText() ) );
+ $log->addEntry( 'move_prot', $nt, $comment, array( $this->getPrefixedText() ), $wgUser );
}
# Update watchlists
@@ -3775,7 +3841,8 @@ class Title {
if ( $createRedirect ) {
$contentHandler = ContentHandler::getForTitle( $this );
- $redirectContent = $contentHandler->makeRedirectContent( $nt );
+ $redirectContent = $contentHandler->makeRedirectContent( $nt,
+ wfMessage( 'move-redirect-text' )->inContentLanguage()->plain() );
// NOTE: If this page's content model does not support redirects, $redirectContent will be null.
} else {
@@ -3830,14 +3897,20 @@ class Title {
$dbw->update( 'page',
/* SET */ array(
'page_namespace' => $nt->getNamespace(),
- 'page_title' => $nt->getDBkey(),
+ 'page_title' => $nt->getDBkey(),
),
/* WHERE */ array( 'page_id' => $oldid ),
__METHOD__
);
- $this->resetArticleID( 0 );
+ // clean up the old title before reset article id - bug 45348
+ if ( !$redirectContent ) {
+ WikiPage::onArticleDelete( $this );
+ }
+
+ $this->resetArticleID( 0 ); // 0 == non existing
$nt->resetArticleID( $oldid );
+ $newpage->loadPageData( WikiPage::READ_LOCKING ); // bug 46397
$newpage->updateRevisionOn( $dbw, $nullRevision );
@@ -3851,17 +3924,17 @@ class Title {
}
# Recreate the redirect, this time in the other direction.
- if ( !$redirectContent ) {
- WikiPage::onArticleDelete( $this );
- } else {
+ if ( $redirectContent ) {
$redirectArticle = WikiPage::factory( $this );
+ $redirectArticle->loadFromRow( false, WikiPage::READ_LOCKING ); // bug 46397
$newid = $redirectArticle->insertOn( $dbw );
if ( $newid ) { // sanity
+ $this->resetArticleID( $newid );
$redirectRevision = new Revision( array(
- 'title' => $this, // for determining the default content model
- 'page' => $newid,
+ 'title' => $this, // for determining the default content model
+ 'page' => $newid,
'comment' => $comment,
- 'content' => $redirectContent ) );
+ 'content' => $redirectContent ) );
$redirectRevision->insertOn( $dbw );
$redirectArticle->updateRevisionOn( $dbw, $redirectRevision, 0 );
@@ -3963,7 +4036,9 @@ class Title {
# Is it a redirect?
$fields = array( 'page_is_redirect', 'page_latest', 'page_id' );
- if ( $wgContentHandlerUseDB ) $fields[] = 'page_content_model';
+ if ( $wgContentHandlerUseDB ) {
+ $fields[] = 'page_content_model';
+ }
$row = $dbw->selectRow( 'page',
$fields,
@@ -4017,7 +4092,7 @@ class Title {
}
# Get the article text
$rev = Revision::newFromTitle( $nt, false, Revision::READ_LATEST );
- if( !is_object( $rev ) ) {
+ if ( !is_object( $rev ) ) {
return false;
}
$content = $rev->getContent();
@@ -4070,8 +4145,8 @@ class Title {
if ( $res->numRows() > 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();
+ // $data[] = Title::newFromText($wgContLang->getNsText ( NS_CATEGORY ).':'.$row->cl_to);
+ $data[$wgContLang->getNsText( NS_CATEGORY ) . ':' . $row->cl_to] = $this->getFullText();
}
}
return $data;
@@ -4319,7 +4394,7 @@ class Title {
// No DB query needed if $old and $new are the same or successive revisions:
if ( $old->getId() === $new->getId() ) {
return ( $old_cmp === '>' && $new_cmp === '<' ) ? 0 : 1;
- } else if ( $old->getId() === $new->getParentId() ) {
+ } elseif ( $old->getId() === $new->getParentId() ) {
if ( $old_cmp === '>' || $new_cmp === '<' ) {
return ( $old_cmp === '>' && $new_cmp === '<' ) ? 0 : 1;
}
@@ -4414,7 +4489,7 @@ class Title {
return true; // any interwiki link might be viewable, for all we know
}
- switch( $this->mNamespace ) {
+ switch ( $this->mNamespace ) {
case NS_MEDIA:
case NS_FILE:
// file exists, possibly in a foreign repo
@@ -4500,27 +4575,23 @@ class Title {
* @return Bool true if the update succeeded
*/
public function invalidateCache() {
- global $wgMemc;
if ( wfReadOnly() ) {
return false;
}
- $dbw = wfGetDB( DB_MASTER );
- $success = $dbw->update(
- 'page',
- array( 'page_touched' => $dbw->timestamp() ),
- $this->pageCond(),
- __METHOD__
- );
- HTMLFileCache::clearFileCache( $this );
- // Clear page info.
- $revision = WikiPage::factory( $this )->getRevision();
- if( $revision !== null ) {
- $memcKey = wfMemcKey( 'infoaction', $this->getPrefixedText(), $revision->getId() );
- $success = $success && $wgMemc->delete( $memcKey );
- }
+ $method = __METHOD__;
+ $dbw = wfGetDB( DB_MASTER );
+ $conds = $this->pageCond();
+ $dbw->onTransactionIdle( function() use ( $dbw, $conds, $method ) {
+ $dbw->update(
+ 'page',
+ array( 'page_touched' => $dbw->timestamp() ),
+ $conds,
+ $method
+ );
+ } );
- return $success;
+ return true;
}
/**
@@ -4568,7 +4639,7 @@ class Title {
if ( array_key_exists( $uid, $this->mNotificationTimestamp ) ) {
return $this->mNotificationTimestamp[$uid];
}
- if ( !$uid || !$wgShowUpdatedMarker ) {
+ if ( !$uid || !$wgShowUpdatedMarker || !$user->isAllowed( 'viewmywatchlist' ) ) {
return $this->mNotificationTimestamp[$uid] = false;
}
// Don't cache too much!
@@ -4791,9 +4862,10 @@ class Title {
* they will already be wrapped in paragraphs.
*
* @since 1.21
+ * @param int oldid Revision ID that's being edited
* @return Array
*/
- public function getEditNotices() {
+ public function getEditNotices( $oldid = 0 ) {
$notices = array();
# Optional notices on a per-namespace and per-page basis
@@ -4820,6 +4892,8 @@ class Title {
$notices[$editnoticeText] = $editnoticeMsg->parseAsBlock();
}
}
+
+ wfRunHooks( 'TitleGetEditNotices', array( $this, $oldid, &$notices ) );
return $notices;
}
}
diff --git a/includes/UIDGenerator.php b/includes/UIDGenerator.php
index b042d8c7..963e51a4 100644
--- a/includes/UIDGenerator.php
+++ b/includes/UIDGenerator.php
@@ -239,9 +239,9 @@ class UIDGenerator {
$data = explode( ' ', fgets( $handle ) ); // "<clk seq> <sec> <msec> <counter> <offset>"
$clockChanged = false; // clock set back significantly?
if ( count( $data ) == 5 ) { // last UID info already initialized
- $clkSeq = (int) $data[0] % $clockSeqSize;
- $prevTime = array( (int) $data[1], (int) $data[2] );
- $offset = (int) $data[4] % $counterSize; // random counter offset
+ $clkSeq = (int)$data[0] % $clockSeqSize;
+ $prevTime = array( (int)$data[1], (int)$data[2] );
+ $offset = (int)$data[4] % $counterSize; // random counter offset
$counter = 0; // counter for UIDs with the same timestamp
// Delay until the clock reaches the time of the last ID.
// This detects any microtime() drift among processes.
@@ -251,7 +251,7 @@ class UIDGenerator {
$time = self::millitime();
} elseif ( $time == $prevTime ) {
// Bump the counter if there are timestamp collisions
- $counter = (int) $data[3] % $counterSize;
+ $counter = (int)$data[3] % $counterSize;
if ( ++$counter >= $counterSize ) { // sanity (starts at 0)
flock( $handle, LOCK_UN ); // abort
throw new MWException( "Counter overflow for timestamp value." );
@@ -304,7 +304,7 @@ class UIDGenerator {
if ( $ct >= $time ) { // http://php.net/manual/en/language.operators.comparison.php
return $ct; // current timestamp is higher than $time
}
- } while ( ( ( $time[0] - $ct[0] )*1000 + ( $time[1] - $ct[1] ) ) <= 10 );
+ } while ( ( ( $time[0] - $ct[0] ) * 1000 + ( $time[1] - $ct[1] ) ) <= 10 );
return false;
}
@@ -315,25 +315,12 @@ class UIDGenerator {
*/
protected function millisecondsSinceEpochBinary( array $time ) {
list( $sec, $msec ) = $time;
- if ( PHP_INT_SIZE >= 8 ) { // 64 bit integers
- $ts = ( 1000 * $sec + $msec );
- $id_bin = str_pad( decbin( $ts % pow( 2, 46 ) ), 46, '0', STR_PAD_LEFT );
- } elseif ( extension_loaded( 'gmp' ) ) {
- $ts = gmp_mod( // wrap around
- gmp_add( gmp_mul( (string) $sec, (string) 1000 ), (string) $msec ),
- gmp_pow( '2', '46' )
- );
- $id_bin = str_pad( gmp_strval( $ts, 2 ), 46, '0', STR_PAD_LEFT );
- } elseif ( extension_loaded( 'bcmath' ) ) {
- $ts = bcmod( // wrap around
- bcadd( bcmul( $sec, 1000 ), $msec ),
- bcpow( 2, 46 )
- );
- $id_bin = wfBaseConvert( $ts, 10, 2, 46 );
- } else {
- throw new MWException( 'bcmath or gmp extension required for 32 bit machines.' );
+ $ts = 1000 * $sec + $msec;
+ if ( $ts > pow( 2, 52 ) ) {
+ throw new MWException( __METHOD__ .
+ ': sorry, this function doesn\'t work after the year 144680' );
}
- return $id_bin;
+ return substr( wfBaseConvert( $ts, 10, 2, 46 ), -46 );
}
/**
@@ -341,7 +328,7 @@ class UIDGenerator {
*/
protected static function millitime() {
list( $msec, $sec ) = explode( ' ', microtime() );
- return array( (int) $sec, (int) ( $msec * 1000 ) );
+ return array( (int)$sec, (int)( $msec * 1000 ) );
}
function __destruct() {
diff --git a/includes/User.php b/includes/User.php
index 6b7348a8..12912e1c 100644
--- a/includes/User.php
+++ b/includes/User.php
@@ -124,6 +124,12 @@ class User {
'edit',
'editinterface',
'editprotected',
+ 'editmyoptions',
+ 'editmyprivateinfo',
+ 'editmyusercss',
+ 'editmyuserjs',
+ 'editmywatchlist',
+ 'editsemiprotected',
'editusercssjs', #deprecated
'editusercss',
'edituserjs',
@@ -164,6 +170,8 @@ class User {
'upload_by_url',
'userrights',
'userrights-interwiki',
+ 'viewmyprivateinfo',
+ 'viewmywatchlist',
'writeapi',
);
/**
@@ -251,7 +259,7 @@ class User {
}
/**
- * @return String
+ * @return string
*/
function __toString() {
return $this->getName();
@@ -266,7 +274,7 @@ class User {
}
wfProfileIn( __METHOD__ );
- # Set it now to avoid infinite recursion in accessors
+ // Set it now to avoid infinite recursion in accessors
$this->mLoadedItems = true;
switch ( $this->mFrom ) {
@@ -276,7 +284,7 @@ class User {
case 'name':
$this->mId = self::idFromName( $this->mName );
if ( !$this->mId ) {
- # Nonexistent user placeholder object
+ // Nonexistent user placeholder object
$this->loadDefaults( $this->mName );
} else {
$this->loadFromId();
@@ -286,7 +294,7 @@ class User {
$this->loadFromId();
break;
case 'session':
- if( !$this->loadFromSession() ) {
+ if ( !$this->loadFromSession() ) {
// Loading from session failed. Load defaults.
$this->loadDefaults();
}
@@ -301,7 +309,7 @@ class User {
/**
* Load user table data, given mId has already been set.
- * @return Bool false if the ID does not exist, true otherwise
+ * @return bool false if the ID does not exist, true otherwise
*/
public function loadFromId() {
global $wgMemc;
@@ -310,25 +318,25 @@ class User {
return false;
}
- # Try cache
+ // Try cache
$key = wfMemcKey( 'user', 'id', $this->mId );
$data = $wgMemc->get( $key );
if ( !is_array( $data ) || $data['mVersion'] < MW_USER_VERSION ) {
- # Object is expired, load from DB
+ // Object is expired, load from DB
$data = false;
}
if ( !$data ) {
wfDebug( "User: cache miss for user {$this->mId}\n" );
- # Load from DB
+ // Load from DB
if ( !$this->loadFromDatabase() ) {
- # Can't load from ID, user is anonymous
+ // Can't load from ID, user is anonymous
return false;
}
$this->saveToCache();
} else {
wfDebug( "User: got user {$this->mId} from cache\n" );
- # Restore from cache
+ // Restore from cache
foreach ( self::$mCacheVars as $name ) {
$this->$name = $data[$name];
}
@@ -370,14 +378,14 @@ class User {
* you have both an ID and a name handy.
*
* @param string $name Username, validated by Title::newFromText()
- * @param string|Bool $validate Validate username. Takes the same parameters as
- * User::getCanonicalName(), except that true is accepted as an alias
- * for 'valid', for BC.
+ * @param string|bool $validate Validate username. Takes the same parameters as
+ * User::getCanonicalName(), except that true is accepted as an alias
+ * for 'valid', for BC.
*
* @return User|bool 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.
+ * (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.
*/
public static function newFromName( $name, $validate = 'valid' ) {
if ( $validate === true ) {
@@ -387,7 +395,7 @@ class User {
if ( $name === false ) {
return false;
} else {
- # Create unloaded user object
+ // Create unloaded user object
$u = new User;
$u->mName = $name;
$u->mFrom = 'name';
@@ -418,7 +426,7 @@ class User {
* If the code is invalid or has expired, returns NULL.
*
* @param string $code Confirmation code
- * @return User object, or null
+ * @return User|null
*/
public static function newFromConfirmationCode( $code ) {
$dbr = wfGetDB( DB_SLAVE );
@@ -426,7 +434,7 @@ class User {
'user_email_token' => md5( $code ),
'user_email_token_expires > ' . $dbr->addQuotes( $dbr->timestamp() ),
) );
- if( $id !== false ) {
+ if ( $id !== false ) {
return User::newFromId( $id );
} else {
return null;
@@ -437,7 +445,7 @@ class User {
* Create a new user object using data from session or cookies. If the
* login credentials are invalid, the result is an anonymous user.
*
- * @param $request WebRequest object to use; $wgRequest will be used if omitted.
+ * @param WebRequest $request Object to use; $wgRequest will be used if omitted.
* @return User object
*/
public static function newFromSession( WebRequest $request = null ) {
@@ -472,7 +480,7 @@ class User {
/**
* Get the username corresponding to a given user ID
* @param int $id User ID
- * @return String|bool The corresponding username
+ * @return string|bool The corresponding username
*/
public static function whoIs( $id ) {
return UserCache::singleton()->getProp( $id, 'name' );
@@ -482,7 +490,7 @@ class User {
* Get the real name of a user given their user ID
*
* @param int $id User ID
- * @return String|bool The corresponding user's real name
+ * @return string|bool The corresponding user's real name
*/
public static function whoIsReal( $id ) {
return UserCache::singleton()->getProp( $id, 'real_name' );
@@ -491,12 +499,12 @@ class User {
/**
* Get database id given a user name
* @param string $name Username
- * @return Int|Null The corresponding user's ID, or null if user is nonexistent
+ * @return int|null The corresponding user's ID, or null if user is nonexistent
*/
public static function idFromName( $name ) {
$nt = Title::makeTitleSafe( NS_USER, $name );
- if( is_null( $nt ) ) {
- # Illegal name
+ if ( is_null( $nt ) ) {
+ // Illegal name
return null;
}
@@ -542,8 +550,8 @@ class User {
* addresses like this, if we allowed accounts like this to be created
* new users could get the old edits of these anonymous users.
*
- * @param string $name to match
- * @return Bool
+ * @param string $name Name to match
+ * @return bool
*/
public static function isIP( $name ) {
return preg_match( '/^\d{1,3}\.\d{1,3}\.\d{1,3}\.(?:xxx|\d{1,3})$/', $name ) || IP::isIPv6( $name );
@@ -557,8 +565,8 @@ class User {
* is longer than the maximum allowed username size or doesn't begin with
* a capital letter.
*
- * @param string $name to match
- * @return Bool
+ * @param string $name Name to match
+ * @return bool
*/
public static function isValidUserName( $name ) {
global $wgContLang, $wgMaxNameChars;
@@ -576,7 +584,7 @@ class User {
// Ensure that the name can't be misresolved as a different title,
// such as with extra namespace keys at the start.
$parsed = Title::newFromText( $name );
- if( is_null( $parsed )
+ if ( is_null( $parsed )
|| $parsed->getNamespace()
|| strcmp( $name, $parsed->getPrefixedText() ) ) {
wfDebugLog( 'username', __METHOD__ .
@@ -594,7 +602,7 @@ class User {
'\x{3000}' . # ideographic space
'\x{e000}-\x{f8ff}' . # private use
']/u';
- if( preg_match( $unicodeBlacklist, $name ) ) {
+ if ( preg_match( $unicodeBlacklist, $name ) ) {
wfDebugLog( 'username', __METHOD__ .
": '$name' invalid due to blacklisted characters" );
return false;
@@ -611,8 +619,8 @@ class User {
* If an account already exists in this form, login will be blocked
* by a failure to pass this function.
*
- * @param string $name to match
- * @return Bool
+ * @param string $name Name to match
+ * @return bool
*/
public static function isUsableName( $name ) {
global $wgReservedUsernames;
@@ -649,7 +657,7 @@ class User {
* isValidUserName() to avoid disrupting existing accounts.
*
* @param string $name to match
- * @return Bool
+ * @return bool
*/
public static function isCreatableName( $name ) {
global $wgInvalidUsernameCharacters;
@@ -657,15 +665,15 @@ class User {
// 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 ) {
+ 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 ) ) {
+ if ( $wgInvalidUsernameCharacters !== '' ) {
+ if ( preg_match( '/[' . preg_quote( $wgInvalidUsernameCharacters, '/' ) . ']/', $name ) ) {
wfDebugLog( 'username', __METHOD__ .
": '$name' invalid due to wgInvalidUsernameCharacters" );
return false;
@@ -679,7 +687,7 @@ class User {
* Is the input a valid password for this user?
*
* @param string $password Desired password
- * @return Bool
+ * @return bool
*/
public function isValidPassword( $password ) {
//simple boolean wrapper for getPasswordValidity
@@ -702,15 +710,16 @@ class User {
$result = false; //init $result to false for the internal checks
- if( !wfRunHooks( 'isValidPassword', array( $password, &$result, $this ) ) )
+ if ( !wfRunHooks( 'isValidPassword', array( $password, &$result, $this ) ) ) {
return $result;
+ }
if ( $result === false ) {
- if( strlen( $password ) < $wgMinimalPasswordLength ) {
+ if ( strlen( $password ) < $wgMinimalPasswordLength ) {
return 'passwordtooshort';
} elseif ( $wgContLang->lc( $password ) == $wgContLang->lc( $this->mName ) ) {
return 'password-name-match';
- } elseif ( isset( $blockedLogins[ $this->getName() ] ) && $password == $blockedLogins[ $this->getName() ] ) {
+ } 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
@@ -719,7 +728,7 @@ class User {
//a valid password.
return true;
}
- } elseif( $result === true ) {
+ } elseif ( $result === true ) {
return true;
} else {
return $result; //the isValidPassword hook set a string $result and returned true
@@ -730,7 +739,7 @@ class User {
* Does a string look like an e-mail 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
+ * http://www.whatwg.org/html/states-of-the-type-attribute.html#valid-e-mail-address
* Which as of 2011-01-24 says:
*
* A valid e-mail address is a string that matches the ABNF production
@@ -750,7 +759,7 @@ class User {
* pass validation here.
*
* @param string $addr E-mail address
- * @return Bool
+ * @return bool
* @deprecated since 1.18 call Sanitizer::isValidEmail() directly
*/
public static function isValidEmailAddr( $addr ) {
@@ -762,7 +771,7 @@ class User {
* Given unvalidated user input, return a canonical username, or false if
* the username is invalid.
* @param string $name User input
- * @param string|Bool $validate type of validation to use:
+ * @param string|bool $validate type of validation to use:
* - false No validation
* - 'valid' Valid for batch processes
* - 'usable' Valid for batch processes and login
@@ -772,25 +781,26 @@ class User {
* @return bool|string
*/
public static function getCanonicalName( $name, $validate = 'valid' ) {
- # Force usernames to capital
+ // Force usernames to capital
global $wgContLang;
$name = $wgContLang->ucfirst( $name );
# Reject names containing '#'; these will be cleaned up
# with title normalisation, but then it's too late to
# check elsewhere
- if( strpos( $name, '#' ) !== false )
+ if ( strpos( $name, '#' ) !== false ) {
return false;
+ }
- # Clean up name according to title rules
+ // Clean up name according to title rules
$t = ( $validate === 'valid' ) ?
Title::newFromText( $name ) : Title::makeTitle( NS_USER, $name );
- # Check for invalid titles
- if( is_null( $t ) ) {
+ // Check for invalid titles
+ if ( is_null( $t ) ) {
return false;
}
- # Reject various classes of invalid names
+ // Reject various classes of invalid names
global $wgAuth;
$name = $wgAuth->getCanonicalName( $t->getText() );
@@ -822,7 +832,7 @@ class User {
* Count the number of edits of a user
*
* @param int $uid User ID to check
- * @return Int the user's edit count
+ * @return int The user's edit count
*
* @deprecated since 1.21 in favour of User::getEditCount
*/
@@ -835,7 +845,7 @@ class User {
/**
* Return a random password.
*
- * @return String new random password
+ * @return string New random password
*/
public static function randomPassword() {
global $wgMinimalPasswordLength;
@@ -870,7 +880,7 @@ class User {
$this->mOptionsLoaded = false;
$loggedOut = $this->getRequest()->getCookie( 'LoggedOut' );
- if( $loggedOut !== null ) {
+ if ( $loggedOut !== null ) {
$this->mTouched = wfTimestamp( TS_MW, $loggedOut );
} else {
$this->mTouched = '1'; # Allow any pages to be cached
@@ -898,7 +908,7 @@ class User {
* @param string $all 'all' to check if the whole object has been loaded
* or any other string to check if only the item is available (e.g.
* for optimisation)
- * @return Boolean
+ * @return boolean
*/
public function isItemLoaded( $item, $all = 'all' ) {
return ( $this->mLoadedItems === true && $all === 'all' ) ||
@@ -908,9 +918,9 @@ class User {
/**
* Set that an item has been loaded
*
- * @param $item String
+ * @param string $item
*/
- private function setItemLoaded( $item ) {
+ protected function setItemLoaded( $item ) {
if ( is_array( $this->mLoadedItems ) ) {
$this->mLoadedItems[$item] = true;
}
@@ -918,25 +928,15 @@ class User {
/**
* Load user data from the session or login cookie.
- * @return Bool True if the user is logged in, false otherwise.
+ * @return bool True if the user is logged in, false otherwise.
*/
private function loadFromSession() {
- global $wgExternalAuthType, $wgAutocreatePolicy;
-
$result = null;
wfRunHooks( 'UserLoadFromSession', array( $this, &$result ) );
if ( $result !== null ) {
return $result;
}
- if ( $wgExternalAuthType && $wgAutocreatePolicy == 'view' ) {
- $extUser = ExternalUser::newFromCookie();
- if ( $extUser ) {
- # TODO: Automatically create the user here (or probably a bit
- # lower down, in fact)
- }
- }
-
$request = $this->getRequest();
$cookieId = $request->getCookie( 'UserID' );
@@ -944,7 +944,7 @@ class User {
if ( $cookieId !== null ) {
$sId = intval( $cookieId );
- if( $sessId !== null && $cookieId != $sessId ) {
+ if ( $sessId !== null && $cookieId != $sessId ) {
wfDebugLog( 'loginSessions', "Session user ID ($sessId) and
cookie user ID ($sId) don't match!" );
return false;
@@ -967,13 +967,13 @@ class User {
$proposedUser = User::newFromId( $sId );
if ( !$proposedUser->isLoggedIn() ) {
- # Not a valid ID
+ // Not a valid ID
return false;
}
global $wgBlockDisablesLogin;
- if( $wgBlockDisablesLogin && $proposedUser->isBlocked() ) {
- # User blocked and we've disabled blocked user logins
+ if ( $wgBlockDisablesLogin && $proposedUser->isBlocked() ) {
+ // User blocked and we've disabled blocked user logins
return false;
}
@@ -987,7 +987,7 @@ class User {
$passwordCorrect = ( strlen( $token ) && $token === $request->getCookie( 'Token' ) );
$from = 'cookie';
} else {
- # No session or persistent login cookie
+ // No session or persistent login cookie
return false;
}
@@ -997,7 +997,7 @@ class User {
wfDebug( "User: logged in from $from\n" );
return true;
} else {
- # Invalid credentials
+ // Invalid credentials
wfDebug( "User: can't log in from $from, invalid credentials\n" );
return false;
}
@@ -1007,14 +1007,14 @@ class User {
* Load user and user_group data from the database.
* $this->mId must be set, this is how the user is identified.
*
- * @return Bool True if the user exists, false if the user is anonymous
+ * @return bool True if the user exists, false if the user is anonymous
*/
public function loadFromDatabase() {
- # Paranoia
+ // Paranoia
$this->mId = intval( $this->mId );
- /** Anonymous user */
- if( !$this->mId ) {
+ // Anonymous user
+ if ( !$this->mId ) {
$this->loadDefaults();
return false;
}
@@ -1025,13 +1025,13 @@ class User {
wfRunHooks( 'UserLoadFromDatabase', array( $this, &$s ) );
if ( $s !== false ) {
- # Initialise user table data
+ // Initialise user table data
$this->loadFromRow( $s );
$this->mGroups = null; // deferred
$this->getEditCount(); // revalidation for nulls
return true;
} else {
- # Invalid user_id
+ // Invalid user_id
$this->mId = 0;
$this->loadDefaults();
return false;
@@ -1162,16 +1162,20 @@ class User {
* @see $wgAutopromoteOnce
*/
public function addAutopromoteOnceGroups( $event ) {
- global $wgAutopromoteOnceLogInRC;
+ global $wgAutopromoteOnceLogInRC, $wgAuth;
$toPromote = array();
if ( $this->getId() ) {
$toPromote = Autopromote::getAutopromoteOnceGroups( $this, $event );
if ( count( $toPromote ) ) {
$oldGroups = $this->getGroups(); // previous groups
+
foreach ( $toPromote as $group ) {
$this->addGroup( $group );
}
+ // update groups in external authentication database
+ $wgAuth->updateExternalDBGroups( $this, $toPromote );
+
$newGroups = array_merge( $oldGroups, $toPromote ); // all groups
$logEntry = new ManualLogEntry( 'rights', 'autopromote' );
@@ -1194,7 +1198,7 @@ class User {
* Clear various cached data stored in this object. The cache of the user table
* data (i.e. self::$mCacheVars) is not cleared unless $reloadFrom is given.
*
- * @param bool|String $reloadFrom Reload user and user_groups table data from a
+ * @param bool|string $reloadFrom Reload user and user_groups table data from a
* given source. May be "name", "id", "defaults", "session", or false for
* no reload.
*/
@@ -1235,11 +1239,13 @@ class User {
}
$defOpt = $wgDefaultUserOptions;
- # default language setting
- $defOpt['variant'] = $wgContLang->getCode();
+ // Default language setting
$defOpt['language'] = $wgContLang->getCode();
- foreach( SearchEngine::searchableNamespaces() as $nsnum => $nsname ) {
- $defOpt['searchNs'.$nsnum] = !empty( $wgNamespacesToBeSearchedDefault[$nsnum] );
+ foreach ( LanguageConverter::$languagesWithVariants as $langCode ) {
+ $defOpt[$langCode == $wgContLang->getCode() ? 'variant' : "variant-$langCode"] = $langCode;
+ }
+ foreach ( SearchEngine::searchableNamespaces() as $nsnum => $nsname ) {
+ $defOpt['searchNs' . $nsnum] = !empty( $wgNamespacesToBeSearchedDefault[$nsnum] );
}
$defOpt['skin'] = $wgDefaultSkin;
@@ -1252,11 +1258,11 @@ class User {
* Get a given default option value.
*
* @param string $opt Name of option to retrieve
- * @return String Default option value
+ * @return string Default option value
*/
public static function getDefaultOption( $opt ) {
$defOpts = self::getDefaultOptions();
- if( isset( $defOpts[$opt] ) ) {
+ if ( isset( $defOpts[$opt] ) ) {
return $defOpts[$opt];
} else {
return null;
@@ -1271,14 +1277,14 @@ class User {
* done against master.
*/
private function getBlockedStatus( $bFromSlave = true ) {
- global $wgProxyWhitelist, $wgUser;
+ global $wgProxyWhitelist, $wgUser, $wgApplyIpBlocksToXff;
if ( -1 != $this->mBlockedby ) {
return;
}
wfProfileIn( __METHOD__ );
- wfDebug( __METHOD__.": checking...\n" );
+ wfDebug( __METHOD__ . ": checking...\n" );
// Initialize data...
// Otherwise something ends up stomping on $this->mBlockedby when
@@ -1296,14 +1302,14 @@ class User {
$ip = null;
}
- # User/IP blocking
+ // User/IP blocking
$block = Block::newFromTarget( $this, $ip, !$bFromSlave );
- # Proxy blocking
+ // Proxy blocking
if ( !$block instanceof Block && $ip !== null && !$this->isAllowed( 'proxyunbannable' )
&& !in_array( $ip, $wgProxyWhitelist ) )
{
- # Local list
+ // Local list
if ( self::isLocallyBlockedProxy( $ip ) ) {
$block = new Block;
$block->setBlocker( wfMessage( 'proxyblocker' )->text() );
@@ -1317,6 +1323,25 @@ class User {
}
}
+ // (bug 23343) Apply IP blocks to the contents of XFF headers, if enabled
+ if ( !$block instanceof Block
+ && $wgApplyIpBlocksToXff
+ && $ip !== null
+ && !$this->isAllowed( 'proxyunbannable' )
+ && !in_array( $ip, $wgProxyWhitelist )
+ ) {
+ $xff = $this->getRequest()->getHeader( 'X-Forwarded-For' );
+ $xff = array_map( 'trim', explode( ',', $xff ) );
+ $xff = array_diff( $xff, array( $ip ) );
+ $xffblocks = Block::getBlocksForIPList( $xff, $this->isAnon(), !$bFromSlave );
+ $block = Block::chooseBlock( $xffblocks, $xff );
+ if ( $block instanceof Block ) {
+ # Mangle the reason to alert the user that the block
+ # originated from matching the X-Forwarded-For header.
+ $block->mReason = wfMessage( 'xffblockreason', $block->mReason )->text();
+ }
+ }
+
if ( $block instanceof Block ) {
wfDebug( __METHOD__ . ": Found block.\n" );
$this->mBlock = $block;
@@ -1330,7 +1355,7 @@ class User {
$this->mAllowUsertalk = false;
}
- # Extensions
+ // Extensions
wfRunHooks( 'GetBlockedStatus', array( &$this ) );
wfProfileOut( __METHOD__ );
@@ -1341,17 +1366,19 @@ class User {
*
* @param string $ip IP to check
* @param bool $checkWhitelist whether to check the whitelist first
- * @return Bool True if blacklisted.
+ * @return bool True if blacklisted.
*/
public function isDnsBlacklisted( $ip, $checkWhitelist = false ) {
global $wgEnableSorbs, $wgEnableDnsBlacklist,
$wgSorbsUrl, $wgDnsBlacklistUrls, $wgProxyWhitelist;
- if ( !$wgEnableDnsBlacklist && !$wgEnableSorbs )
+ if ( !$wgEnableDnsBlacklist && !$wgEnableSorbs ) {
return false;
+ }
- if ( $checkWhitelist && in_array( $ip, $wgProxyWhitelist ) )
+ if ( $checkWhitelist && in_array( $ip, $wgProxyWhitelist ) ) {
return false;
+ }
$urls = array_merge( $wgDnsBlacklistUrls, (array)$wgSorbsUrl );
return $this->inDnsBlacklist( $ip, $urls );
@@ -1362,23 +1389,23 @@ class User {
*
* @param string $ip IP to check
* @param string|array $bases of Strings: URL of the DNS blacklist
- * @return Bool True if blacklisted.
+ * @return bool True if blacklisted.
*/
public function inDnsBlacklist( $ip, $bases ) {
wfProfileIn( __METHOD__ );
$found = false;
// @todo FIXME: IPv6 ??? (http://bugs.php.net/bug.php?id=33170)
- if( IP::isIPv4( $ip ) ) {
- # Reverse IP, bug 21255
+ if ( IP::isIPv4( $ip ) ) {
+ // Reverse IP, bug 21255
$ipReversed = implode( '.', array_reverse( explode( '.', $ip ) ) );
- foreach( (array)$bases as $base ) {
- # Make hostname
- # If we have an access key, use that too (ProjectHoneypot, etc.)
- if( is_array( $base ) ) {
- if( count( $base ) >= 2 ) {
- # Access key is 1, base URL is 0
+ foreach ( (array)$bases as $base ) {
+ // Make hostname
+ // If we have an access key, use that too (ProjectHoneypot, etc.)
+ if ( is_array( $base ) ) {
+ if ( count( $base ) >= 2 ) {
+ // Access key is 1, base URL is 0
$host = "{$base[1]}.$ipReversed.{$base[0]}";
} else {
$host = "$ipReversed.{$base[0]}";
@@ -1387,10 +1414,10 @@ class User {
$host = "$ipReversed.$base";
}
- # Send query
+ // Send query
$ipList = gethostbynamel( $host );
- if( $ipList ) {
+ if ( $ipList ) {
wfDebugLog( 'dnsblacklist', "Hostname $host is {$ipList[0]}, it's a proxy says $base!\n" );
$found = true;
break;
@@ -1420,7 +1447,7 @@ class User {
wfProfileIn( __METHOD__ );
if ( !is_array( $wgProxyList ) ) {
- # Load from the specified file
+ // Load from the specified file
$wgProxyList = array_map( 'trim', file( $wgProxyList ) );
}
@@ -1429,7 +1456,7 @@ class User {
} elseif ( array_search( $ip, $wgProxyList ) !== false ) {
$ret = true;
} elseif ( array_key_exists( $ip, $wgProxyList ) ) {
- # Old-style flipped proxy list
+ // Old-style flipped proxy list
$ret = true;
} else {
$ret = false;
@@ -1441,11 +1468,11 @@ class User {
/**
* Is this user subject to rate limiting?
*
- * @return Bool True if rate limited
+ * @return bool True if rate limited
*/
public function isPingLimitable() {
global $wgRateLimitsExcludedIPs;
- if( in_array( $this->getRequest()->getIP(), $wgRateLimitsExcludedIPs ) ) {
+ if ( in_array( $this->getRequest()->getIP(), $wgRateLimitsExcludedIPs ) ) {
// No other good way currently to disable rate limits
// for specific IPs. :P
// But this is a crappy hack and should die.
@@ -1462,23 +1489,25 @@ class User {
* last-hit counters will be shared across wikis.
*
* @param string $action Action to enforce; 'edit' if unspecified
- * @return Bool True if a rate limiter was tripped
+ * @param integer $incrBy Positive amount to increment counter by [defaults to 1]
+ * @return bool True if a rate limiter was tripped
*/
- public function pingLimiter( $action = 'edit' ) {
- # Call the 'PingLimiter' hook
+ public function pingLimiter( $action = 'edit', $incrBy = 1 ) {
+ // Call the 'PingLimiter' hook
$result = false;
- if( !wfRunHooks( 'PingLimiter', array( &$this, $action, &$result ) ) ) {
+ if ( !wfRunHooks( 'PingLimiter', array( &$this, $action, &$result, $incrBy ) ) ) {
return $result;
}
global $wgRateLimits;
- if( !isset( $wgRateLimits[$action] ) ) {
+ if ( !isset( $wgRateLimits[$action] ) ) {
return false;
}
- # Some groups shouldn't trigger the ping limiter, ever
- if( !$this->isPingLimitable() )
+ // Some groups shouldn't trigger the ping limiter, ever
+ if ( !$this->isPingLimitable() ) {
return false;
+ }
global $wgMemc, $wgRateLimitLog;
wfProfileIn( __METHOD__ );
@@ -1486,27 +1515,37 @@ class User {
$limits = $wgRateLimits[$action];
$keys = array();
$id = $this->getId();
- $ip = $this->getRequest()->getIP();
$userLimit = false;
- if( isset( $limits['anon'] ) && $id == 0 ) {
+ if ( isset( $limits['anon'] ) && $id == 0 ) {
$keys[wfMemcKey( 'limiter', $action, 'anon' )] = $limits['anon'];
}
- if( isset( $limits['user'] ) && $id != 0 ) {
+ if ( isset( $limits['user'] ) && $id != 0 ) {
$userLimit = $limits['user'];
}
- if( $this->isNewbie() ) {
- if( isset( $limits['newbie'] ) && $id != 0 ) {
+ if ( $this->isNewbie() ) {
+ if ( isset( $limits['newbie'] ) && $id != 0 ) {
$keys[wfMemcKey( 'limiter', $action, 'user', $id )] = $limits['newbie'];
}
- if( isset( $limits['ip'] ) ) {
+ if ( isset( $limits['ip'] ) ) {
+ $ip = $this->getRequest()->getIP();
$keys["mediawiki:limiter:$action:ip:$ip"] = $limits['ip'];
}
- $matches = array();
- if( isset( $limits['subnet'] ) && preg_match( '/^(\d+\.\d+\.\d+)\.\d+$/', $ip, $matches ) ) {
- $subnet = $matches[1];
- $keys["mediawiki:limiter:$action:subnet:$subnet"] = $limits['subnet'];
+ if ( isset( $limits['subnet'] ) ) {
+ $ip = $this->getRequest()->getIP();
+ $matches = array();
+ $subnet = false;
+ if ( IP::isIPv6( $ip ) ) {
+ $parts = IP::parseRange( "$ip/64" );
+ $subnet = $parts[0];
+ } elseif ( preg_match( '/^(\d+\.\d+\.\d+)\.\d+$/', $ip, $matches ) ) {
+ // IPv4
+ $subnet = $matches[1];
+ }
+ if ( $subnet !== false ) {
+ $keys["mediawiki:limiter:$action:subnet:$subnet"] = $limits['subnet'];
+ }
}
}
// Check for group-specific permissions
@@ -1520,20 +1559,21 @@ class User {
}
// Set the user limit key
if ( $userLimit !== false ) {
- wfDebug( __METHOD__ . ": effective user limit: $userLimit\n" );
- $keys[ wfMemcKey( 'limiter', $action, 'user', $id ) ] = $userLimit;
+ list( $max, $period ) = $userLimit;
+ wfDebug( __METHOD__ . ": effective user limit: $max in {$period}s\n" );
+ $keys[wfMemcKey( 'limiter', $action, 'user', $id )] = $userLimit;
}
$triggered = false;
- foreach( $keys as $key => $limit ) {
+ foreach ( $keys as $key => $limit ) {
list( $max, $period ) = $limit;
$summary = "(limit $max in {$period}s)";
$count = $wgMemc->get( $key );
// Already pinged?
- if( $count ) {
- if( $count >= $max ) {
+ if ( $count ) {
+ if ( $count >= $max ) {
wfDebug( __METHOD__ . ": tripped! $key at $count $summary\n" );
- if( $wgRateLimitLog ) {
+ if ( $wgRateLimitLog ) {
wfSuppressWarnings();
file_put_contents( $wgRateLimitLog, wfTimestamp( TS_MW ) . ' ' . wfWikiID() . ': ' . $this->getName() . " tripped $key at $count $summary\n", FILE_APPEND );
wfRestoreWarnings();
@@ -1544,9 +1584,13 @@ class User {
}
} else {
wfDebug( __METHOD__ . ": adding record for $key $summary\n" );
- $wgMemc->add( $key, 0, intval( $period ) ); // first ping
+ if ( $incrBy > 0 ) {
+ $wgMemc->add( $key, 0, intval( $period ) ); // first ping
+ }
+ }
+ if ( $incrBy > 0 ) {
+ $wgMemc->incr( $key, $incrBy );
}
- $wgMemc->incr( $key );
}
wfProfileOut( __METHOD__ );
@@ -1557,7 +1601,7 @@ class User {
* Check if user is blocked
*
* @param bool $bFromSlave Whether to check the slave database instead of the master
- * @return Bool True if blocked, false otherwise
+ * @return bool True if blocked, false otherwise
*/
public function isBlocked( $bFromSlave = true ) { // hacked from false due to horrible probs on site
return $this->getBlock( $bFromSlave ) instanceof Block && $this->getBlock()->prevents( 'edit' );
@@ -1577,9 +1621,9 @@ class User {
/**
* Check if user is blocked from editing a particular article
*
- * @param $title Title to check
+ * @param Title $title Title to check
* @param bool $bFromSlave whether to check the slave database instead of the master
- * @return Bool
+ * @return bool
*/
function isBlockedFrom( $title, $bFromSlave = false ) {
global $wgBlockAllowsUTEdit;
@@ -1587,7 +1631,7 @@ class User {
$blocked = $this->isBlocked( $bFromSlave );
$allowUsertalk = ( $wgBlockAllowsUTEdit ? $this->mAllowUsertalk : false );
- # If a user's name is suppressed, they cannot make edits anywhere
+ // If a user's name is suppressed, they cannot make edits anywhere
if ( !$this->mHideName && $allowUsertalk && $title->getText() === $this->getName() &&
$title->getNamespace() == NS_USER_TALK ) {
$blocked = false;
@@ -1602,7 +1646,7 @@ class User {
/**
* If user is blocked, return the name of the user who placed the block
- * @return String name of blocker
+ * @return string Name of blocker
*/
public function blockedBy() {
$this->getBlockedStatus();
@@ -1611,7 +1655,7 @@ class User {
/**
* If user is blocked, return the specified reason for the block
- * @return String Blocking reason
+ * @return string Blocking reason
*/
public function blockedFor() {
$this->getBlockedStatus();
@@ -1620,7 +1664,7 @@ class User {
/**
* If user is blocked, return the ID for the block
- * @return Int Block ID
+ * @return int Block ID
*/
public function getBlockId() {
$this->getBlockedStatus();
@@ -1633,16 +1677,16 @@ class User {
* This is intended for quick UI checks.
*
* @param string $ip IP address, uses current client if none given
- * @return Bool True if blocked, false otherwise
+ * @return bool True if blocked, false otherwise
*/
public function isBlockedGlobally( $ip = '' ) {
- if( $this->mBlockedGlobally !== null ) {
+ if ( $this->mBlockedGlobally !== null ) {
return $this->mBlockedGlobally;
}
// User is already an IP?
- if( IP::isIPAddress( $this->getName() ) ) {
+ if ( IP::isIPAddress( $this->getName() ) ) {
$ip = $this->getName();
- } elseif( !$ip ) {
+ } elseif ( !$ip ) {
$ip = $this->getRequest()->getIP();
}
$blocked = false;
@@ -1654,13 +1698,14 @@ class User {
/**
* Check if user account is locked
*
- * @return Bool True if locked, false otherwise
+ * @return bool True if locked, false otherwise
*/
public function isLocked() {
- if( $this->mLocked !== null ) {
+ if ( $this->mLocked !== null ) {
return $this->mLocked;
}
global $wgAuth;
+ StubObject::unstub( $wgAuth );
$authUser = $wgAuth->getUserInstance( $this );
$this->mLocked = (bool)$authUser->isLocked();
return $this->mLocked;
@@ -1669,15 +1714,16 @@ class User {
/**
* Check if user account is hidden
*
- * @return Bool True if hidden, false otherwise
+ * @return bool True if hidden, false otherwise
*/
public function isHidden() {
- if( $this->mHideName !== null ) {
+ if ( $this->mHideName !== null ) {
return $this->mHideName;
}
$this->getBlockedStatus();
- if( !$this->mHideName ) {
+ if ( !$this->mHideName ) {
global $wgAuth;
+ StubObject::unstub( $wgAuth );
$authUser = $wgAuth->getUserInstance( $this );
$this->mHideName = (bool)$authUser->isHidden();
}
@@ -1686,14 +1732,13 @@ class User {
/**
* Get the user's ID.
- * @return Int The user's ID; 0 if the user is anonymous or nonexistent
+ * @return int The user's ID; 0 if the user is anonymous or nonexistent
*/
public function getId() {
- if( $this->mId === null && $this->mName !== null
- && User::isIP( $this->mName ) ) {
+ if ( $this->mId === null && $this->mName !== null && User::isIP( $this->mName ) ) {
// Special case, we know the user is anonymous
return 0;
- } elseif( !$this->isItemLoaded( 'id' ) ) {
+ } elseif ( !$this->isItemLoaded( 'id' ) ) {
// Don't load if this was initialized from an ID
$this->load();
}
@@ -1711,16 +1756,16 @@ class User {
/**
* Get the user name, or the IP of an anonymous user
- * @return String User's name or IP address
+ * @return string User's name or IP address
*/
public function getName() {
if ( $this->isItemLoaded( 'name', 'only' ) ) {
- # Special case optimisation
+ // Special case optimisation
return $this->mName;
} else {
$this->load();
if ( $this->mName === false ) {
- # Clean up IPs
+ // Clean up IPs
$this->mName = IP::sanitizeIP( $this->getRequest()->getIP() );
}
return $this->mName;
@@ -1747,7 +1792,7 @@ class User {
/**
* Get the user's name escaped by underscores.
- * @return String Username escaped by underscores.
+ * @return string Username escaped by underscores.
*/
public function getTitleKey() {
return str_replace( ' ', '_', $this->getName() );
@@ -1755,27 +1800,27 @@ class User {
/**
* Check if the user has new messages.
- * @return Bool True if the user has new messages
+ * @return bool True if the user has new messages
*/
public function getNewtalk() {
$this->load();
- # Load the newtalk status if it is unloaded (mNewtalk=-1)
- if( $this->mNewtalk === -1 ) {
+ // Load the newtalk status if it is unloaded (mNewtalk=-1)
+ if ( $this->mNewtalk === -1 ) {
$this->mNewtalk = false; # reset talk page status
- # Check memcached separately for anons, who have no
- # entire User object stored in there.
- if( !$this->mId ) {
+ // Check memcached separately for anons, who have no
+ // entire User object stored in there.
+ if ( !$this->mId ) {
global $wgDisableAnonTalk;
- if( $wgDisableAnonTalk ) {
+ if ( $wgDisableAnonTalk ) {
// Anon newtalk disabled by configuration.
$this->mNewtalk = false;
} else {
global $wgMemc;
$key = wfMemcKey( 'newtalk', 'ip', $this->getName() );
$newtalk = $wgMemc->get( $key );
- if( strval( $newtalk ) !== '' ) {
+ if ( strval( $newtalk ) !== '' ) {
$this->mNewtalk = (bool)$newtalk;
} else {
// Since we are caching this, make sure it is up to date by getting it
@@ -1793,14 +1838,23 @@ class User {
}
/**
- * Return the talk page(s) this user has new messages on.
- * @return Array of String page URLs
+ * Return the data needed to construct links for new talk page message
+ * alerts. If there are new messages, this will return an associative array
+ * with the following data:
+ * wiki: The database name of the wiki
+ * link: Root-relative link to the user's talk page
+ * rev: The last talk page revision that the user has seen or null. This
+ * is useful for building diff links.
+ * If there are no new messages, it returns an empty array.
+ * @note This function was designed to accomodate multiple talk pages, but
+ * currently only returns a single link and revision.
+ * @return Array
*/
public function getNewMessageLinks() {
$talks = array();
- if( !wfRunHooks( 'UserRetrieveNewTalks', array( &$this, &$talks ) ) ) {
+ if ( !wfRunHooks( 'UserRetrieveNewTalks', array( &$this, &$talks ) ) ) {
return $talks;
- } elseif( !$this->getNewtalk() ) {
+ } elseif ( !$this->getNewtalk() ) {
return array();
}
$utp = $this->getTalkPage();
@@ -1815,13 +1869,36 @@ class User {
}
/**
+ * Get the revision ID for the last talk page revision viewed by the talk
+ * page owner.
+ * @return int|null Revision ID or null
+ */
+ public function getNewMessageRevisionId() {
+ $newMessageRevisionId = null;
+ $newMessageLinks = $this->getNewMessageLinks();
+ if ( $newMessageLinks ) {
+ // Note: getNewMessageLinks() never returns more than a single link
+ // and it is always for the same wiki, but we double-check here in
+ // case that changes some time in the future.
+ if ( count( $newMessageLinks ) === 1
+ && $newMessageLinks[0]['wiki'] === wfWikiID()
+ && $newMessageLinks[0]['rev']
+ ) {
+ $newMessageRevision = $newMessageLinks[0]['rev'];
+ $newMessageRevisionId = $newMessageRevision->getId();
+ }
+ }
+ return $newMessageRevisionId;
+ }
+
+ /**
* Internal uncached check for new messages
*
* @see getNewtalk()
* @param string $field 'user_ip' for anonymous users, 'user_id' otherwise
- * @param string|Int $id User's IP address for anonymous users, User ID otherwise
+ * @param string|int $id User's IP address for anonymous users, User ID otherwise
* @param bool $fromMaster true to fetch from the master, false for a slave
- * @return Bool True if the user has new messages
+ * @return bool True if the user has new messages
*/
protected function checkNewtalk( $field, $id, $fromMaster = false ) {
if ( $fromMaster ) {
@@ -1837,9 +1914,9 @@ class User {
/**
* Add or update the new messages flag
* @param string $field 'user_ip' for anonymous users, 'user_id' otherwise
- * @param string|Int $id User's IP address for anonymous users, User ID otherwise
+ * @param string|int $id User's IP address for anonymous users, User ID otherwise
* @param $curRev Revision new, as yet unseen revision of the user talk page. Ignored if null.
- * @return Bool True if successful, false otherwise
+ * @return bool True if successful, false otherwise
*/
protected function updateNewtalk( $field, $id, $curRev = null ) {
// Get timestamp of the talk page revision prior to the current one
@@ -1863,8 +1940,8 @@ class User {
/**
* Clear the new messages flag for the given user
* @param string $field 'user_ip' for anonymous users, 'user_id' otherwise
- * @param string|Int $id User's IP address for anonymous users, User ID otherwise
- * @return Bool True if successful, false otherwise
+ * @param string|int $id User's IP address for anonymous users, User ID otherwise
+ * @return bool True if successful, false otherwise
*/
protected function deleteNewtalk( $field, $id ) {
$dbw = wfGetDB( DB_MASTER );
@@ -1886,14 +1963,14 @@ class User {
* @param $curRev Revision new, as yet unseen revision of the user talk page. Ignored if null or !$val.
*/
public function setNewtalk( $val, $curRev = null ) {
- if( wfReadOnly() ) {
+ if ( wfReadOnly() ) {
return;
}
$this->load();
$this->mNewtalk = $val;
- if( $this->isAnon() ) {
+ if ( $this->isAnon() ) {
$field = 'user_ip';
$id = $this->getName();
} else {
@@ -1902,13 +1979,13 @@ class User {
}
global $wgMemc;
- if( $val ) {
+ if ( $val ) {
$changed = $this->updateNewtalk( $field, $id, $curRev );
} else {
$changed = $this->deleteNewtalk( $field, $id );
}
- if( $this->isAnon() ) {
+ if ( $this->isAnon() ) {
// Anons have a separate memcached space, since
// user records aren't kept for them.
$key = wfMemcKey( 'newtalk', 'ip', $id );
@@ -1922,7 +1999,7 @@ class User {
/**
* Generate a current or new-future timestamp to be stored in the
* user_touched field when we update things.
- * @return String Timestamp in TS_MW format
+ * @return string Timestamp in TS_MW format
*/
private static function newTouchedTimestamp() {
global $wgClockSkewFudge;
@@ -1938,7 +2015,7 @@ class User {
*/
private function clearSharedCache() {
$this->load();
- if( $this->mId ) {
+ if ( $this->mId ) {
global $wgMemc;
$wgMemc->delete( wfMemcKey( 'user', 'id', $this->mId ) );
}
@@ -1950,28 +2027,30 @@ class User {
* for reload on the next hit.
*/
public function invalidateCache() {
- if( wfReadOnly() ) {
+ if ( wfReadOnly() ) {
return;
}
$this->load();
- if( $this->mId ) {
+ if ( $this->mId ) {
$this->mTouched = self::newTouchedTimestamp();
$dbw = wfGetDB( DB_MASTER );
-
- // Prevent contention slams by checking user_touched first
- $now = $dbw->timestamp( $this->mTouched );
- $needsPurge = $dbw->selectField( 'user', '1',
- array( 'user_id' => $this->mId, 'user_touched < ' . $dbw->addQuotes( $now ) )
- );
- if ( $needsPurge ) {
- $dbw->update( 'user',
- array( 'user_touched' => $now ),
- array( 'user_id' => $this->mId, 'user_touched < ' . $dbw->addQuotes( $now ) ),
- __METHOD__
- );
- }
-
+ $userid = $this->mId;
+ $touched = $this->mTouched;
+ $method = __METHOD__;
+ $dbw->onTransactionIdle( function() use ( $dbw, $userid, $touched, $method ) {
+ // Prevent contention slams by checking user_touched first
+ $encTouched = $dbw->addQuotes( $dbw->timestamp( $touched ) );
+ $needsPurge = $dbw->selectField( 'user', '1',
+ array( 'user_id' => $userid, 'user_touched < ' . $encTouched ) );
+ if ( $needsPurge ) {
+ $dbw->update( 'user',
+ array( 'user_touched' => $dbw->timestamp( $touched ) ),
+ array( 'user_id' => $userid, 'user_touched < ' . $encTouched ),
+ $method
+ );
+ }
+ } );
$this->clearSharedCache();
}
}
@@ -1979,7 +2058,6 @@ class User {
/**
* Validate the cache for this account.
* @param string $timestamp A timestamp in TS_MW format
- *
* @return bool
*/
public function validateCache( $timestamp ) {
@@ -1989,7 +2067,7 @@ class User {
/**
* Get the user touched timestamp
- * @return String timestamp
+ * @return string timestamp
*/
public function getTouched() {
$this->load();
@@ -2015,12 +2093,12 @@ class User {
public function setPassword( $str ) {
global $wgAuth;
- if( $str !== null ) {
- if( !$wgAuth->allowPasswordChange() ) {
+ if ( $str !== null ) {
+ if ( !$wgAuth->allowPasswordChange() ) {
throw new PasswordError( wfMessage( 'password-change-forbidden' )->text() );
}
- if( !$this->isValidPassword( $str ) ) {
+ if ( !$this->isValidPassword( $str ) ) {
global $wgMinimalPasswordLength;
$valid = $this->getPasswordValidity( $str );
if ( is_array( $valid ) ) {
@@ -2034,7 +2112,7 @@ class User {
}
}
- if( !$wgAuth->setPassword( $this, $str ) ) {
+ if ( !$wgAuth->setPassword( $this, $str ) ) {
throw new PasswordError( wfMessage( 'externaldberror' )->text() );
}
@@ -2047,14 +2125,14 @@ class User {
* Set the password and reset the random token unconditionally.
*
* @param string|null $str New password to set or null to set an invalid
- * password hash meaning that the user will not be able to log in
- * through the web interface.
+ * password hash meaning that the user will not be able to log in
+ * through the web interface.
*/
public function setInternalPassword( $str ) {
$this->load();
$this->setToken();
- if( $str === null ) {
+ if ( $str === null ) {
// Save an invalid hash...
$this->mPassword = '';
} else {
@@ -2067,7 +2145,7 @@ class User {
/**
* Get the user's current token.
* @param bool $forceCreation Force the generation of a new token if the user doesn't have one (default=true for backwards compatibility)
- * @return String Token
+ * @return string Token
*/
public function getToken( $forceCreation = true ) {
$this->load();
@@ -2109,7 +2187,7 @@ class User {
/**
* Has password reminder email been sent within the last
* $wgPasswordReminderResendTime hours?
- * @return Bool
+ * @return bool
*/
public function isPasswordReminderThrottled() {
global $wgPasswordReminderResendTime;
@@ -2123,7 +2201,7 @@ class User {
/**
* Get the user's e-mail address
- * @return String User's email address
+ * @return string User's email address
*/
public function getEmail() {
$this->load();
@@ -2133,7 +2211,7 @@ class User {
/**
* Get the timestamp of the user's e-mail authentication
- * @return String TS_MW timestamp
+ * @return string TS_MW timestamp
*/
public function getEmailAuthenticationTimestamp() {
$this->load();
@@ -2147,7 +2225,7 @@ class User {
*/
public function setEmail( $str ) {
$this->load();
- if( $str == $this->mEmail ) {
+ if ( $str == $this->mEmail ) {
return;
}
$this->mEmail = $str;
@@ -2177,11 +2255,11 @@ class User {
$this->setEmail( $str );
if ( $str !== '' && $wgEmailAuthentication ) {
- # Send a confirmation request to the new address if needed
+ // Send a confirmation request to the new address if needed
$type = $oldaddr != '' ? 'changed' : 'set';
$result = $this->sendConfirmationMail( $type );
if ( $result->isGood() ) {
- # Say the the caller that a confirmation mail has been sent
+ // Say the the caller that a confirmation mail has been sent
$result->value = 'eauth';
}
} else {
@@ -2193,7 +2271,7 @@ class User {
/**
* Get the user's real name
- * @return String User's real name
+ * @return string User's real name
*/
public function getRealName() {
if ( !$this->isItemLoaded( 'realname' ) ) {
@@ -2217,8 +2295,8 @@ class User {
*
* @param string $oname The option to check
* @param string $defaultOverride A default value returned if the option does not exist
- * @param bool $ignoreHidden = whether to ignore the effects of $wgHiddenPrefs
- * @return String User's current value for the option
+ * @param bool $ignoreHidden Whether to ignore the effects of $wgHiddenPrefs
+ * @return string User's current value for the option
* @see getBoolOption()
* @see getIntOption()
*/
@@ -2231,7 +2309,7 @@ class User {
# set it, and then it was disabled removing their ability to change it). But
# we don't want to erase the preferences in the database in case the preference
# is re-enabled again. So don't touch $mOptions, just override the returned value
- if( in_array( $oname, $wgHiddenPrefs ) && !$ignoreHidden ) {
+ if ( !$ignoreHidden && in_array( $oname, $wgHiddenPrefs ) ) {
return self::getDefaultOption( $oname );
}
@@ -2257,9 +2335,9 @@ class User {
# set it, and then it was disabled removing their ability to change it). But
# we don't want to erase the preferences in the database in case the preference
# is re-enabled again. So don't touch $mOptions, just override the returned value
- foreach( $wgHiddenPrefs as $pref ) {
+ foreach ( $wgHiddenPrefs as $pref ) {
$default = self::getDefaultOption( $pref );
- if( $default !== null ) {
+ if ( $default !== null ) {
$options[$pref] = $default;
}
}
@@ -2271,7 +2349,7 @@ class User {
* Get the user's current setting for a given option, as a boolean value.
*
* @param string $oname The option to check
- * @return Bool User's current value for the option
+ * @return bool User's current value for the option
* @see getOption()
*/
public function getBoolOption( $oname ) {
@@ -2279,16 +2357,16 @@ class User {
}
/**
- * Get the user's current setting for a given option, as a boolean value.
+ * Get the user's current setting for a given option, as an integer value.
*
* @param string $oname The option to check
* @param int $defaultOverride A default value returned if the option does not exist
- * @return Int User's current value for the option
+ * @return int User's current value for the option
* @see getOption()
*/
public function getIntOption( $oname, $defaultOverride = 0 ) {
$val = $this->getOption( $oname );
- if( $val == '' ) {
+ if ( $val == '' ) {
$val = $defaultOverride;
}
return intval( $val );
@@ -2298,13 +2376,13 @@ class User {
* Set the given option for a user.
*
* @param string $oname The option to set
- * @param $val mixed New value to set
+ * @param mixed $val New value to set
*/
public function setOption( $oname, $val ) {
$this->loadOptions();
// Explicitly NULL values should refer to defaults
- if( is_null( $val ) ) {
+ if ( is_null( $val ) ) {
$val = self::getDefaultOption( $oname );
}
@@ -2312,6 +2390,49 @@ class User {
}
/**
+ * Get a token stored in the preferences (like the watchlist one),
+ * resetting it if it's empty (and saving changes).
+ *
+ * @param string $oname The option name to retrieve the token from
+ * @return string|bool User's current value for the option, or false if this option is disabled.
+ * @see resetTokenFromOption()
+ * @see getOption()
+ */
+ public function getTokenFromOption( $oname ) {
+ global $wgHiddenPrefs;
+ if ( in_array( $oname, $wgHiddenPrefs ) ) {
+ return false;
+ }
+
+ $token = $this->getOption( $oname );
+ if ( !$token ) {
+ $token = $this->resetTokenFromOption( $oname );
+ $this->saveSettings();
+ }
+ return $token;
+ }
+
+ /**
+ * Reset a token stored in the preferences (like the watchlist one).
+ * *Does not* save user's preferences (similarly to setOption()).
+ *
+ * @param string $oname The option name to reset the token in
+ * @return string|bool New token value, or false if this option is disabled.
+ * @see getTokenFromOption()
+ * @see setOption()
+ */
+ public function resetTokenFromOption( $oname ) {
+ global $wgHiddenPrefs;
+ if ( in_array( $oname, $wgHiddenPrefs ) ) {
+ return false;
+ }
+
+ $token = MWCryptRand::generateHex( 40 );
+ $this->setOption( $oname, $token );
+ return $token;
+ }
+
+ /**
* Return a list of the types of user options currently returned by
* User::getOptionKinds().
*
@@ -2400,9 +2521,9 @@ class User {
foreach ( $options as $key => $value ) {
if ( isset( $prefs[$key] ) ) {
$mapping[$key] = 'registered';
- } elseif( isset( $multiselectOptions[$key] ) ) {
+ } elseif ( isset( $multiselectOptions[$key] ) ) {
$mapping[$key] = 'registered-multiselect';
- } elseif( isset( $checkmatrixOptions[$key] ) ) {
+ } elseif ( isset( $checkmatrixOptions[$key] ) ) {
$mapping[$key] = 'registered-checkmatrix';
} elseif ( substr( $key, 0, 7 ) === 'userjs-' ) {
$mapping[$key] = 'userjs';
@@ -2422,11 +2543,11 @@ class User {
* and 'all', which forces a reset of *all* preferences and overrides everything else.
*
* @param array|string $resetKinds which kinds of preferences to reset. Defaults to
- * array( 'registered', 'registered-multiselect', 'registered-checkmatrix', 'unused' )
- * for backwards-compatibility.
+ * array( 'registered', 'registered-multiselect', 'registered-checkmatrix', 'unused' )
+ * for backwards-compatibility.
* @param $context IContextSource|null context source used when $resetKinds
- * does not contain 'all', passed to getOptionKinds().
- * Defaults to RequestContext::getMain() when null.
+ * does not contain 'all', passed to getOptionKinds().
+ * Defaults to RequestContext::getMain() when null.
*/
public function resetOptions(
$resetKinds = array( 'registered', 'registered-multiselect', 'registered-checkmatrix', 'unused' ),
@@ -2469,7 +2590,7 @@ class User {
/**
* Get the user's preferred date format.
- * @return String User's preferred date format
+ * @return string User's preferred date format
*/
public function getDatePreference() {
// Important migration for old data rows
@@ -2486,6 +2607,26 @@ class User {
}
/**
+ * Determine based on the wiki configuration and the user's options,
+ * whether this user must be over HTTPS no matter what.
+ *
+ * @return bool
+ */
+ public function requiresHTTPS() {
+ global $wgSecureLogin;
+ if ( !$wgSecureLogin ) {
+ return false;
+ } else {
+ $https = $this->getBoolOption( 'prefershttps' );
+ wfRunHooks( 'UserRequiresHTTPS', array( $this, &$https ) );
+ if ( $https ) {
+ $https = wfCanIPUseHTTPS( $this->getRequest()->getIP() );
+ }
+ return $https;
+ }
+ }
+
+ /**
* Get the user preferred stub threshold
*
* @return int
@@ -2494,8 +2635,8 @@ class User {
global $wgMaxArticleSize; # Maximum article size, in Kb
$threshold = $this->getIntOption( 'stubthreshold' );
if ( $threshold > $wgMaxArticleSize * 1024 ) {
- # If they have set an impossible value, disable the preference
- # so we can use the parser cache again.
+ // If they have set an impossible value, disable the preference
+ // so we can use the parser cache again.
$threshold = 0;
}
return $threshold;
@@ -2540,7 +2681,7 @@ class User {
$this->getGroups(), // explicit groups
$this->getAutomaticGroups( $recache ) // implicit groups
) );
- # Hook for additional groups
+ // Hook for additional groups
wfRunHooks( 'UserEffectiveGroups', array( &$this, &$this->mEffectiveGroups ) );
// Force reindexation of groups when a hook has unset one of them
$this->mEffectiveGroups = array_values( array_unique( $this->mEffectiveGroups ) );
@@ -2569,8 +2710,8 @@ class User {
) );
}
if ( $recache ) {
- # Assure data consistency with rights/groups,
- # as getEffectiveGroups() depends on this function
+ // Assure data consistency with rights/groups,
+ // as getEffectiveGroups() depends on this function
$this->mEffectiveGroups = null;
}
wfProfileOut( __METHOD__ );
@@ -2588,14 +2729,14 @@ class User {
* @return array Names of the groups the user has belonged to.
*/
public function getFormerGroups() {
- if( is_null( $this->mFormerGroups ) ) {
+ if ( is_null( $this->mFormerGroups ) ) {
$dbr = wfGetDB( DB_MASTER );
$res = $dbr->select( 'user_former_groups',
array( 'ufg_group' ),
array( 'ufg_user' => $this->mId ),
__METHOD__ );
$this->mFormerGroups = array();
- foreach( $res as $row ) {
+ foreach ( $res as $row ) {
$this->mFormerGroups[] = $row->ufg_group;
}
}
@@ -2604,7 +2745,7 @@ class User {
/**
* Get the user's edit count.
- * @return Int
+ * @return int, null for anonymous users
*/
public function getEditCount() {
if ( !$this->getId() ) {
@@ -2622,14 +2763,14 @@ class User {
__METHOD__
);
- if( $count === null ) {
+ if ( $count === null ) {
// it has not been initialized. do so.
$count = $this->initEditCount();
}
- $this->mEditCount = intval( $count );
+ $this->mEditCount = $count;
wfProfileOut( __METHOD__ );
}
- return $this->mEditCount;
+ return (int)$this->mEditCount;
}
/**
@@ -2638,9 +2779,9 @@ class User {
* @param string $group Name of the group to add
*/
public function addGroup( $group ) {
- if( wfRunHooks( 'UserAddGroup', array( $this, &$group ) ) ) {
+ if ( wfRunHooks( 'UserAddGroup', array( $this, &$group ) ) ) {
$dbw = wfGetDB( DB_MASTER );
- if( $this->getId() ) {
+ if ( $this->getId() ) {
$dbw->insert( 'user_groups',
array(
'ug_user' => $this->getID(),
@@ -2652,7 +2793,14 @@ class User {
}
$this->loadGroups();
$this->mGroups[] = $group;
- $this->mRights = User::getGroupPermissions( $this->getEffectiveGroups( true ) );
+ // In case loadGroups was not called before, we now have the right twice.
+ // Get rid of the duplicate.
+ $this->mGroups = array_unique( $this->mGroups );
+
+ // Refresh the groups caches, and clear the rights cache so it will be
+ // refreshed on the next call to $this->getRights().
+ $this->getEffectiveGroups( true );
+ $this->mRights = null;
$this->invalidateCache();
}
@@ -2664,7 +2812,7 @@ class User {
*/
public function removeGroup( $group ) {
$this->load();
- if( wfRunHooks( 'UserRemoveGroup', array( $this, &$group ) ) ) {
+ if ( wfRunHooks( 'UserRemoveGroup', array( $this, &$group ) ) ) {
$dbw = wfGetDB( DB_MASTER );
$dbw->delete( 'user_groups',
array(
@@ -2682,14 +2830,18 @@ class User {
}
$this->loadGroups();
$this->mGroups = array_diff( $this->mGroups, array( $group ) );
- $this->mRights = User::getGroupPermissions( $this->getEffectiveGroups( true ) );
+
+ // Refresh the groups caches, and clear the rights cache so it will be
+ // refreshed on the next call to $this->getRights().
+ $this->getEffectiveGroups( true );
+ $this->mRights = null;
$this->invalidateCache();
}
/**
* Get whether the user is logged in
- * @return Bool
+ * @return bool
*/
public function isLoggedIn() {
return $this->getID() != 0;
@@ -2697,7 +2849,7 @@ class User {
/**
* Get whether the user is anonymous
- * @return Bool
+ * @return bool
*/
public function isAnon() {
return !$this->isLoggedIn();
@@ -2707,14 +2859,14 @@ class User {
* Check if user is allowed to access a feature / make an action
*
* @internal param \String $varargs permissions to test
- * @return Boolean: True if user is allowed to perform *any* of the given actions
+ * @return boolean: True if user is allowed to perform *any* of the given actions
*
* @return bool
*/
public function isAllowedAny( /*...*/ ) {
$permissions = func_get_args();
- foreach( $permissions as $permission ) {
- if( $this->isAllowed( $permission ) ) {
+ foreach ( $permissions as $permission ) {
+ if ( $this->isAllowed( $permission ) ) {
return true;
}
}
@@ -2728,8 +2880,8 @@ class User {
*/
public function isAllowedAll( /*...*/ ) {
$permissions = func_get_args();
- foreach( $permissions as $permission ) {
- if( !$this->isAllowed( $permission ) ) {
+ foreach ( $permissions as $permission ) {
+ if ( !$this->isAllowed( $permission ) ) {
return false;
}
}
@@ -2738,27 +2890,28 @@ class User {
/**
* Internal mechanics of testing a permission
- * @param $action String
+ * @param string $action
* @return bool
*/
public function isAllowed( $action = '' ) {
if ( $action === '' ) {
return true; // In the spirit of DWIM
}
- # Patrolling may not be enabled
- if( $action === 'patrol' || $action === 'autopatrol' ) {
+ // Patrolling may not be enabled
+ if ( $action === 'patrol' || $action === 'autopatrol' ) {
global $wgUseRCPatrol, $wgUseNPPatrol;
- if( !$wgUseRCPatrol && !$wgUseNPPatrol )
+ if ( !$wgUseRCPatrol && !$wgUseNPPatrol ) {
return false;
+ }
}
- # Use strict parameter to avoid matching numeric 0 accidentally inserted
- # by misconfiguration: 0 == 'foo'
+ // Use strict parameter to avoid matching numeric 0 accidentally inserted
+ // by misconfiguration: 0 == 'foo'
return in_array( $action, $this->getRights(), true );
}
/**
* Check whether to enable recent changes patrol features for this user
- * @return Boolean: True or false
+ * @return boolean: True or false
*/
public function useRCPatrol() {
global $wgUseRCPatrol;
@@ -2767,11 +2920,14 @@ class User {
/**
* Check whether to enable new pages patrol features for this user
- * @return Bool True or false
+ * @return bool True or false
*/
public function useNPPatrol() {
global $wgUseRCPatrol, $wgUseNPPatrol;
- return( ( $wgUseRCPatrol || $wgUseNPPatrol ) && ( $this->isAllowedAny( 'patrol', 'patrolmarks' ) ) );
+ return (
+ ( $wgUseRCPatrol || $wgUseNPPatrol )
+ && ( $this->isAllowedAny( 'patrol', 'patrolmarks' ) )
+ );
}
/**
@@ -2802,11 +2958,14 @@ class User {
/**
* Get a WatchedItem for this user and $title.
*
+ * @since 1.22 $checkRights parameter added
* @param $title Title
+ * @param $checkRights int Whether to check 'viewmywatchlist'/'editmywatchlist' rights.
+ * Pass WatchedItem::CHECK_USER_RIGHTS or WatchedItem::IGNORE_USER_RIGHTS.
* @return WatchedItem
*/
- public function getWatchedItem( $title ) {
- $key = $title->getNamespace() . ':' . $title->getDBkey();
+ public function getWatchedItem( $title, $checkRights = WatchedItem::CHECK_USER_RIGHTS ) {
+ $key = $checkRights . ':' . $title->getNamespace() . ':' . $title->getDBkey();
if ( isset( $this->mWatchedItems[$key] ) ) {
return $this->mWatchedItems[$key];
@@ -2816,34 +2975,43 @@ class User {
$this->mWatchedItems = array();
}
- $this->mWatchedItems[$key] = WatchedItem::fromUserTitle( $this, $title );
+ $this->mWatchedItems[$key] = WatchedItem::fromUserTitle( $this, $title, $checkRights );
return $this->mWatchedItems[$key];
}
/**
* Check the watched status of an article.
+ * @since 1.22 $checkRights parameter added
* @param $title Title of the article to look at
- * @return Bool
+ * @param $checkRights int Whether to check 'viewmywatchlist'/'editmywatchlist' rights.
+ * Pass WatchedItem::CHECK_USER_RIGHTS or WatchedItem::IGNORE_USER_RIGHTS.
+ * @return bool
*/
- public function isWatched( $title ) {
- return $this->getWatchedItem( $title )->isWatched();
+ public function isWatched( $title, $checkRights = WatchedItem::CHECK_USER_RIGHTS ) {
+ return $this->getWatchedItem( $title, $checkRights )->isWatched();
}
/**
* Watch an article.
+ * @since 1.22 $checkRights parameter added
* @param $title Title of the article to look at
+ * @param $checkRights int Whether to check 'viewmywatchlist'/'editmywatchlist' rights.
+ * Pass WatchedItem::CHECK_USER_RIGHTS or WatchedItem::IGNORE_USER_RIGHTS.
*/
- public function addWatch( $title ) {
- $this->getWatchedItem( $title )->addWatch();
+ public function addWatch( $title, $checkRights = WatchedItem::CHECK_USER_RIGHTS ) {
+ $this->getWatchedItem( $title, $checkRights )->addWatch();
$this->invalidateCache();
}
/**
* Stop watching an article.
+ * @since 1.22 $checkRights parameter added
* @param $title Title of the article to look at
+ * @param $checkRights int Whether to check 'viewmywatchlist'/'editmywatchlist' rights.
+ * Pass WatchedItem::CHECK_USER_RIGHTS or WatchedItem::IGNORE_USER_RIGHTS.
*/
- public function removeWatch( $title ) {
- $this->getWatchedItem( $title )->removeWatch();
+ public function removeWatch( $title, $checkRights = WatchedItem::CHECK_USER_RIGHTS ) {
+ $this->getWatchedItem( $title, $checkRights )->removeWatch();
$this->invalidateCache();
}
@@ -2851,28 +3019,35 @@ class User {
* Clear the user's notification timestamp for the given title.
* If e-notif e-mails are on, they will receive notification mails on
* the next change of the page if it's watched etc.
+ * @note If the user doesn't have 'editmywatchlist', this will do nothing.
* @param $title Title of the article to look at
*/
public function clearNotification( &$title ) {
global $wgUseEnotif, $wgShowUpdatedMarker;
- # Do nothing if the database is locked to writes
- if( wfReadOnly() ) {
+ // Do nothing if the database is locked to writes
+ if ( wfReadOnly() ) {
+ return;
+ }
+
+ // Do nothing if not allowed to edit the watchlist
+ if ( !$this->isAllowed( 'editmywatchlist' ) ) {
return;
}
- if( $title->getNamespace() == NS_USER_TALK &&
+ if ( $title->getNamespace() == NS_USER_TALK &&
$title->getText() == $this->getName() ) {
- if( !wfRunHooks( 'UserClearNewTalkNotification', array( &$this ) ) )
+ if ( !wfRunHooks( 'UserClearNewTalkNotification', array( &$this ) ) ) {
return;
+ }
$this->setNewtalk( false );
}
- if( !$wgUseEnotif && !$wgShowUpdatedMarker ) {
+ if ( !$wgUseEnotif && !$wgShowUpdatedMarker ) {
return;
}
- if( $this->isAnon() ) {
+ if ( $this->isAnon() ) {
// Nothing else to do...
return;
}
@@ -2895,19 +3070,25 @@ class User {
* Resets all of the given user's page-change notification timestamps.
* If e-notif e-mails are on, they will receive notification mails on
* the next change of any watched page.
+ * @note If the user doesn't have 'editmywatchlist', this will do nothing.
*/
public function clearAllNotifications() {
if ( wfReadOnly() ) {
return;
}
+ // Do nothing if not allowed to edit the watchlist
+ if ( !$this->isAllowed( 'editmywatchlist' ) ) {
+ return;
+ }
+
global $wgUseEnotif, $wgShowUpdatedMarker;
if ( !$wgUseEnotif && !$wgShowUpdatedMarker ) {
$this->setNewtalk( false );
return;
}
$id = $this->getId();
- if( $id != 0 ) {
+ if ( $id != 0 ) {
$dbw = wfGetDB( DB_MASTER );
$dbw->update( 'watchlist',
array( /* SET */
@@ -2929,8 +3110,9 @@ class User {
*/
private function decodeOptions( $str ) {
wfDeprecated( __METHOD__, '1.19' );
- if( !$str )
+ if ( !$str ) {
return;
+ }
$this->mOptionsLoaded = true;
$this->mOptionOverrides = array();
@@ -2955,21 +3137,28 @@ class User {
* @param string $value Value to set
* @param int $exp Expiration time, as a UNIX time value;
* if 0 or not specified, use the default $wgCookieExpiration
- * @param $secure Bool
+ * @param bool $secure
* true: Force setting the secure attribute when setting the cookie
* false: Force NOT setting the secure attribute when setting the cookie
* null (default): Use the default ($wgCookieSecure) to set the secure attribute
+ * @param array $params Array of options sent passed to WebResponse::setcookie()
*/
- protected function setCookie( $name, $value, $exp = 0, $secure = null ) {
- $this->getRequest()->response()->setcookie( $name, $value, $exp, null, null, $secure );
+ protected function setCookie( $name, $value, $exp = 0, $secure = null, $params = array() ) {
+ $params['secure'] = $secure;
+ $this->getRequest()->response()->setcookie( $name, $value, $exp, $params );
}
/**
* Clear a cookie on the user's client
* @param string $name Name of the cookie to clear
+ * @param bool $secure
+ * true: Force setting the secure attribute when setting the cookie
+ * false: Force NOT setting the secure attribute when setting the cookie
+ * null (default): Use the default ($wgCookieSecure) to set the secure attribute
+ * @param array $params Array of options sent passed to WebResponse::setcookie()
*/
- protected function clearCookie( $name ) {
- $this->setCookie( $name, '', time() - 86400 );
+ protected function clearCookie( $name, $secure = null, $params = array() ) {
+ $this->setCookie( $name, '', time() - 86400, $secure, $params );
}
/**
@@ -3027,10 +3216,22 @@ class User {
/**
* If wpStickHTTPS was selected, also set an insecure cookie that
* will cause the site to redirect the user to HTTPS, if they access
- * it over HTTP. Bug 29898.
+ * it over HTTP. Bug 29898. Use an un-prefixed cookie, so it's the same
+ * as the one set by centralauth (bug 53538). Also set it to session, or
+ * standard time setting, based on if rememberme was set.
*/
- if ( $request->getCheck( 'wpStickHTTPS' ) ) {
- $this->setCookie( 'forceHTTPS', 'true', time() + 2592000, false ); //30 days
+ if ( $request->getCheck( 'wpStickHTTPS' ) || $this->requiresHTTPS() ) {
+ $time = null;
+ if ( ( 1 == $this->getOption( 'rememberpassword' ) ) ) {
+ $time = 0; // set to $wgCookieExpiration
+ }
+ $this->setCookie(
+ 'forceHTTPS',
+ 'true',
+ $time,
+ false,
+ array( 'prefix' => '' ) // no prefix
+ );
}
}
@@ -3038,7 +3239,7 @@ class User {
* Log this user out.
*/
public function logout() {
- if( wfRunHooks( 'UserLogout', array( &$this ) ) ) {
+ if ( wfRunHooks( 'UserLogout', array( &$this ) ) ) {
$this->doLogout();
}
}
@@ -3054,10 +3255,10 @@ class User {
$this->clearCookie( 'UserID' );
$this->clearCookie( 'Token' );
- $this->clearCookie( 'forceHTTPS' );
+ $this->clearCookie( 'forceHTTPS', false, array( 'prefix' => '' ) );
- # Remember when user logged out, to prevent seeing cached pages
- $this->setCookie( 'LoggedOut', wfTimestampNow(), time() + 86400 );
+ // Remember when user logged out, to prevent seeing cached pages
+ $this->setCookie( 'LoggedOut', time(), time() + 86400 );
}
/**
@@ -3068,8 +3269,12 @@ class User {
global $wgAuth;
$this->load();
- if ( wfReadOnly() ) { return; }
- if ( 0 == $this->mId ) { return; }
+ if ( wfReadOnly() ) {
+ return;
+ }
+ if ( 0 == $this->mId ) {
+ return;
+ }
$this->mTouched = self::newTouchedTimestamp();
if ( !$wgAuth->allowSetLocalPassword() ) {
@@ -3104,11 +3309,13 @@ class User {
/**
* If only this user's username is known, and it exists, return the user ID.
- * @return Int
+ * @return int
*/
public function idForName() {
$s = trim( $this->getName() );
- if ( $s === '' ) return 0;
+ if ( $s === '' ) {
+ return 0;
+ }
$dbr = wfGetDB( DB_SLAVE );
$id = $dbr->selectField( 'user', 'user_id', array( 'user_name' => $s ), __METHOD__ );
@@ -3206,6 +3413,7 @@ class User {
$this->mTouched = self::newTouchedTimestamp();
$dbw = wfGetDB( DB_MASTER );
+ $inWrite = $dbw->writesOrCallbacksPending();
$seqVal = $dbw->nextSequenceValue( 'user_user_id_seq' );
$dbw->insert( 'user',
array(
@@ -3225,6 +3433,12 @@ class User {
array( 'IGNORE' )
);
if ( !$dbw->affectedRows() ) {
+ if ( !$inWrite ) {
+ // XXX: Get out of REPEATABLE-READ so the SELECT below works.
+ // Often this case happens early in views before any writes.
+ // This shows up at least with CentralAuth.
+ $dbw->commit( __METHOD__, 'flush' );
+ }
$this->mId = $dbw->selectField( 'user', 'user_id',
array( 'user_name' => $this->mName ), __METHOD__ );
$loaded = false;
@@ -3234,8 +3448,8 @@ class User {
}
}
if ( !$loaded ) {
- throw new MWException( __METHOD__. ": hit a key conflict attempting " .
- "to insert a user row, but then it doesn't exist when we select it!" );
+ throw new MWException( __METHOD__ . ": hit a key conflict attempting " .
+ "to insert user '{$this->mName}' row, but it was not present in select!" );
}
return Status::newFatal( 'userexists' );
}
@@ -3292,13 +3506,13 @@ class User {
* settings.
*
* @deprecated since 1.17 use the ParserOptions object to get the relevant options
- * @return String Page rendering hash
+ * @return string Page rendering hash
*/
public function getPageRenderingHash() {
wfDeprecated( __METHOD__, '1.17' );
global $wgRenderHashAppend, $wgLang, $wgContLang;
- if( $this->mHash ) {
+ if ( $this->mHash ) {
return $this->mHash;
}
@@ -3332,11 +3546,11 @@ class User {
/**
* Get whether the user is explicitly blocked from account creation.
- * @return Bool|Block
+ * @return bool|Block
*/
public function isBlockedFromCreateAccount() {
$this->getBlockedStatus();
- if( $this->mBlock && $this->mBlock->prevents( 'createaccount' ) ) {
+ if ( $this->mBlock && $this->mBlock->prevents( 'createaccount' ) ) {
return $this->mBlock;
}
@@ -3353,7 +3567,7 @@ class User {
/**
* Get whether the user is blocked from using Special:Emailuser.
- * @return Bool
+ * @return bool
*/
public function isBlockedFromEmailuser() {
$this->getBlockedStatus();
@@ -3362,7 +3576,7 @@ class User {
/**
* Get whether the user is allowed to create an account.
- * @return Bool
+ * @return bool
*/
function isAllowedToCreateAccount() {
return $this->isAllowed( 'createaccount' ) && !$this->isBlockedFromCreateAccount();
@@ -3390,7 +3604,7 @@ class User {
/**
* Determine whether the user is a newbie. Newbies are either
* anonymous IPs, or the most recently created accounts.
- * @return Bool
+ * @return bool
*/
public function isNewbie() {
return !$this->isAllowed( 'autoconfirmed' );
@@ -3399,7 +3613,7 @@ class User {
/**
* Check to see if the given clear-text password is one of the accepted passwords
* @param string $password user password.
- * @return Boolean: True if the given password is correct, otherwise False.
+ * @return boolean: True if the given password is correct, otherwise False.
*/
public function checkPassword( $password ) {
global $wgAuth, $wgLegacyEncoding;
@@ -3410,24 +3624,24 @@ class User {
// to. Certain authentication plugins do NOT want to save
// domain passwords in a mysql database, so we should
// check this (in case $wgAuth->strict() is false).
- if( !$this->isValidPassword( $password ) ) {
+ if ( !$this->isValidPassword( $password ) ) {
return false;
}
- if( $wgAuth->authenticate( $this->getName(), $password ) ) {
+ if ( $wgAuth->authenticate( $this->getName(), $password ) ) {
return true;
- } elseif( $wgAuth->strict() ) {
- /* Auth plugin doesn't allow local authentication */
+ } elseif ( $wgAuth->strict() ) {
+ // Auth plugin doesn't allow local authentication
return false;
- } elseif( $wgAuth->strictUserAuth( $this->getName() ) ) {
- /* Auth plugin doesn't allow local authentication for this user name */
+ } elseif ( $wgAuth->strictUserAuth( $this->getName() ) ) {
+ // Auth plugin doesn't allow local authentication for this user name
return false;
}
if ( self::comparePasswords( $this->mPassword, $password, $this->mId ) ) {
return true;
} elseif ( $wgLegacyEncoding ) {
- # Some wikis were converted from ISO 8859-1 to UTF-8, the passwords can't be converted
- # Check for this with iconv
+ // Some wikis were converted from ISO 8859-1 to UTF-8, the passwords can't be converted
+ // Check for this with iconv
$cp1252Password = iconv( 'UTF-8', 'WINDOWS-1252//TRANSLIT', $password );
if ( $cp1252Password != $password &&
self::comparePasswords( $this->mPassword, $cp1252Password, $this->mId ) )
@@ -3444,13 +3658,13 @@ class User {
*
* @param $plaintext string
*
- * @return Boolean: True if matches, false otherwise
+ * @return boolean: True if matches, false otherwise
*/
public function checkTemporaryPassword( $plaintext ) {
global $wgNewPasswordExpiry;
$this->load();
- if( self::comparePasswords( $this->mNewpassword, $plaintext, $this->getId() ) ) {
+ if ( self::comparePasswords( $this->mNewpassword, $plaintext, $this->getId() ) ) {
if ( is_null( $this->mNewpassTime ) ) {
return true;
}
@@ -3467,7 +3681,7 @@ class User {
*
* @param string|array $salt of Strings Optional function-specific data for hashing
* @param $request WebRequest object to use or null to use $wgRequest
- * @return String The new edit token
+ * @return string The new edit token
*/
public function editToken( $salt = '', $request = null ) {
wfDeprecated( __METHOD__, '1.19' );
@@ -3484,7 +3698,7 @@ class User {
*
* @param string|array $salt of Strings Optional function-specific data for hashing
* @param $request WebRequest object to use or null to use $wgRequest
- * @return String The new edit token
+ * @return string The new edit token
*/
public function getEditToken( $salt = '', $request = null ) {
if ( $request == null ) {
@@ -3499,7 +3713,7 @@ class User {
$token = MWCryptRand::generateHex( 32 );
$request->setSessionData( 'wsEditToken', $token );
}
- if( is_array( $salt ) ) {
+ if ( is_array( $salt ) ) {
$salt = implode( '|', $salt );
}
return md5( $token . $salt ) . EDIT_TOKEN_SUFFIX;
@@ -3509,8 +3723,8 @@ class User {
/**
* Generate a looking random token for various uses.
*
- * @return String The new random token
- * @deprecated since 1.20; Use MWCryptRand for secure purposes or wfRandomString for pseudo-randomness
+ * @return string The new random token
+ * @deprecated since 1.20: Use MWCryptRand for secure purposes or wfRandomString for pseudo-randomness
*/
public static function generateToken() {
return MWCryptRand::generateHex( 32 );
@@ -3524,8 +3738,8 @@ class User {
*
* @param string $val Input value to compare
* @param string $salt Optional function-specific data for hashing
- * @param $request WebRequest object to use or null to use $wgRequest
- * @return Boolean: Whether the token matches
+ * @param WebRequest $request Object to use or null to use $wgRequest
+ * @return boolean: Whether the token matches
*/
public function matchEditToken( $val, $salt = '', $request = null ) {
$sessionToken = $this->getEditToken( $salt, $request );
@@ -3541,8 +3755,8 @@ class User {
*
* @param string $val Input value to compare
* @param string $salt Optional function-specific data for hashing
- * @param $request WebRequest object to use or null to use $wgRequest
- * @return Boolean: Whether the token matches
+ * @param WebRequest $request object to use or null to use $wgRequest
+ * @return boolean: Whether the token matches
*/
public function matchEditTokenNoSuffix( $val, $salt = '', $request = null ) {
$sessionToken = $this->getEditToken( $salt, $request );
@@ -3569,6 +3783,7 @@ class User {
} elseif ( $type === true ) {
$message = 'confirmemail_body_changed';
} else {
+ // Messages: confirmemail_body_changed, confirmemail_body_set
$message = 'confirmemail_body_' . $type;
}
@@ -3594,7 +3809,7 @@ class User {
* @return Status
*/
public function sendMail( $subject, $body, $from = null, $replyto = null ) {
- if( is_null( $from ) ) {
+ if ( is_null( $from ) ) {
global $wgPasswordSender, $wgPasswordSenderName;
$sender = new MailAddress( $wgPasswordSender, $wgPasswordSenderName );
} else {
@@ -3613,9 +3828,9 @@ class User {
* this change to the database.
*
* @param &$expiration \mixed Accepts the expiration time
- * @return String New token
+ * @return string New token
*/
- private function confirmationToken( &$expiration ) {
+ protected function confirmationToken( &$expiration ) {
global $wgUserEmailConfirmationTokenExpiry;
$now = time();
$expires = $now + $wgUserEmailConfirmationTokenExpiry;
@@ -3631,18 +3846,18 @@ class User {
/**
* Return a URL the user can use to confirm their email address.
* @param string $token Accepts the email confirmation token
- * @return String New token URL
+ * @return string New token URL
*/
- private function confirmationTokenUrl( $token ) {
+ protected function confirmationTokenUrl( $token ) {
return $this->getTokenUrl( 'ConfirmEmail', $token );
}
/**
* Return a URL the user can use to invalidate their email address.
* @param string $token Accepts the email confirmation token
- * @return String New token URL
+ * @return string New token URL
*/
- private function invalidationTokenUrl( $token ) {
+ protected function invalidationTokenUrl( $token ) {
return $this->getTokenUrl( 'InvalidateEmail', $token );
}
@@ -3658,12 +3873,12 @@ class User {
*
* @param string $page Special page
* @param string $token Token
- * @return String Formatted URL
+ * @return string Formatted URL
*/
protected function getTokenUrl( $page, $token ) {
// Hack to bypass localization of 'Special:'
$title = Title::makeTitle( NS_MAIN, "Special:$page/$token" );
- return $title->getCanonicalUrl();
+ return $title->getCanonicalURL();
}
/**
@@ -3674,8 +3889,12 @@ class User {
* @return bool
*/
public function confirmEmail() {
- $this->setEmailAuthenticationTimestamp( wfTimestampNow() );
- wfRunHooks( 'ConfirmEmailComplete', array( $this ) );
+ // Check if it's already confirmed, so we don't touch the database
+ // and fire the ConfirmEmailComplete hook on redundant confirmations.
+ if ( !$this->isEmailConfirmed() ) {
+ $this->setEmailAuthenticationTimestamp( wfTimestampNow() );
+ wfRunHooks( 'ConfirmEmailComplete', array( $this ) );
+ }
return true;
}
@@ -3708,11 +3927,11 @@ class User {
/**
* Is this user allowed to send e-mails within limits of current
* site configuration?
- * @return Bool
+ * @return bool
*/
public function canSendEmail() {
global $wgEnableEmail, $wgEnableUserEmail;
- if( !$wgEnableEmail || !$wgEnableUserEmail || !$this->isAllowed( 'sendemail' ) ) {
+ if ( !$wgEnableEmail || !$wgEnableUserEmail || !$this->isAllowed( 'sendemail' ) ) {
return false;
}
$canSend = $this->isEmailConfirmed();
@@ -3723,7 +3942,7 @@ class User {
/**
* Is this user allowed to receive e-mails within limits of current
* site configuration?
- * @return Bool
+ * @return bool
*/
public function canReceiveEmail() {
return $this->isEmailConfirmed() && !$this->getOption( 'disablemail' );
@@ -3737,20 +3956,20 @@ class User {
* confirmed their address by returning a code or using a password
* sent to the address from the wiki.
*
- * @return Bool
+ * @return bool
*/
public function isEmailConfirmed() {
global $wgEmailAuthentication;
$this->load();
$confirmed = true;
- if( wfRunHooks( 'EmailConfirmed', array( &$this, &$confirmed ) ) ) {
- if( $this->isAnon() ) {
+ if ( wfRunHooks( 'EmailConfirmed', array( &$this, &$confirmed ) ) ) {
+ if ( $this->isAnon() ) {
return false;
}
- if( !Sanitizer::validateEmail( $this->mEmail ) ) {
+ if ( !Sanitizer::validateEmail( $this->mEmail ) ) {
return false;
}
- if( $wgEmailAuthentication && !$this->getEmailAuthenticationTimestamp() ) {
+ if ( $wgEmailAuthentication && !$this->getEmailAuthenticationTimestamp() ) {
return false;
}
return true;
@@ -3761,7 +3980,7 @@ class User {
/**
* Check whether there is an outstanding request for e-mail confirmation.
- * @return Bool
+ * @return bool
*/
public function isEmailConfirmationPending() {
global $wgEmailAuthentication;
@@ -3774,9 +3993,9 @@ class User {
/**
* Get the timestamp of account creation.
*
- * @return String|Bool|Null Timestamp of account creation, false for
- * non-existent/anonymous user accounts, or null if existing account
- * but information is not in database.
+ * @return string|bool|null Timestamp of account creation, false for
+ * non-existent/anonymous user accounts, or null if existing account
+ * but information is not in database.
*/
public function getRegistration() {
if ( $this->isAnon() ) {
@@ -3789,11 +4008,11 @@ class User {
/**
* Get the timestamp of the first edit
*
- * @return String|Bool Timestamp of first edit, or false for
- * non-existent/anonymous user accounts.
+ * @return string|bool Timestamp of first edit, or false for
+ * non-existent/anonymous user accounts.
*/
public function getFirstEditTimestamp() {
- if( $this->getId() == 0 ) {
+ if ( $this->getId() == 0 ) {
return false; // anons
}
$dbr = wfGetDB( DB_SLAVE );
@@ -3802,7 +4021,7 @@ class User {
__METHOD__,
array( 'ORDER BY' => 'rev_timestamp ASC' )
);
- if( !$time ) {
+ if ( !$time ) {
return false; // no edits
}
return wfTimestamp( TS_MW, $time );
@@ -3818,16 +4037,16 @@ class User {
global $wgGroupPermissions, $wgRevokePermissions;
$rights = array();
// grant every granted permission first
- foreach( $groups as $group ) {
- if( isset( $wgGroupPermissions[$group] ) ) {
+ foreach ( $groups as $group ) {
+ if ( isset( $wgGroupPermissions[$group] ) ) {
$rights = array_merge( $rights,
// array_filter removes empty items
array_keys( array_filter( $wgGroupPermissions[$group] ) ) );
}
}
// now revoke the revoked permissions
- foreach( $groups as $group ) {
- if( isset( $wgRevokePermissions[$group] ) ) {
+ foreach ( $groups as $group ) {
+ if ( isset( $wgRevokePermissions[$group] ) ) {
$rights = array_diff( $rights,
array_keys( array_filter( $wgRevokePermissions[$group] ) ) );
}
@@ -3855,6 +4074,11 @@ class User {
/**
* Check, if the given group has the given permission
*
+ * If you're wanting to check whether all users have a permission, use
+ * User::isEveryoneAllowed() instead. That properly checks if it's revoked
+ * from anyone.
+ *
+ * @since 1.21
* @param string $group Group to check
* @param string $role Role to check
* @return bool
@@ -3866,10 +4090,50 @@ class User {
}
/**
+ * Check if all users have the given permission
+ *
+ * @since 1.22
+ * @param string $right Right to check
+ * @return bool
+ */
+ public static function isEveryoneAllowed( $right ) {
+ global $wgGroupPermissions, $wgRevokePermissions;
+ static $cache = array();
+
+ // Use the cached results, except in unit tests which rely on
+ // being able change the permission mid-request
+ if ( isset( $cache[$right] ) && !defined( 'MW_PHPUNIT_TEST' ) ) {
+ return $cache[$right];
+ }
+
+ if ( !isset( $wgGroupPermissions['*'][$right] ) || !$wgGroupPermissions['*'][$right] ) {
+ $cache[$right] = false;
+ return false;
+ }
+
+ // If it's revoked anywhere, then everyone doesn't have it
+ foreach ( $wgRevokePermissions as $rights ) {
+ if ( isset( $rights[$right] ) && $rights[$right] ) {
+ $cache[$right] = false;
+ return false;
+ }
+ }
+
+ // Allow extensions (e.g. OAuth) to say false
+ if ( !wfRunHooks( 'UserIsEveryoneAllowed', array( $right ) ) ) {
+ $cache[$right] = false;
+ return false;
+ }
+
+ $cache[$right] = true;
+ return true;
+ }
+
+ /**
* Get the localized descriptive name for a group, if it exists
*
* @param string $group Internal group name
- * @return String Localized descriptive group name
+ * @return string Localized descriptive group name
*/
public static function getGroupName( $group ) {
$msg = wfMessage( "group-$group" );
@@ -3881,7 +4145,7 @@ class User {
*
* @param string $group Internal group name
* @param string $username Username for gender (since 1.19)
- * @return String Localized name for group member
+ * @return string Localized name for group member
*/
public static function getGroupMember( $group, $username = '#' ) {
$msg = wfMessage( "group-$group-member", $username );
@@ -3934,14 +4198,15 @@ class User {
* Get the title of a page describing a particular group
*
* @param string $group Internal group name
- * @return Title|Bool Title of the page if it exists, false otherwise
+ * @return Title|bool Title of the page if it exists, false otherwise
*/
public static function getGroupPage( $group ) {
$msg = wfMessage( 'grouppage-' . $group )->inContentLanguage();
- if( $msg->exists() ) {
+ if ( $msg->exists() ) {
$title = Title::newFromText( $msg->text() );
- if( is_object( $title ) )
+ if ( is_object( $title ) ) {
return $title;
+ }
}
return false;
}
@@ -3952,14 +4217,14 @@ class User {
*
* @param string $group Internal name of the group
* @param string $text The text of the link
- * @return String HTML link to the group
+ * @return string HTML link to the group
*/
public static function makeGroupLinkHTML( $group, $text = '' ) {
- if( $text == '' ) {
+ if ( $text == '' ) {
$text = self::getGroupName( $group );
}
$title = self::getGroupPage( $group );
- if( $title ) {
+ if ( $title ) {
return Linker::link( $title, htmlspecialchars( $text ) );
} else {
return $text;
@@ -3972,14 +4237,14 @@ class User {
*
* @param string $group Internal name of the group
* @param string $text The text of the link
- * @return String Wikilink to the group
+ * @return string Wikilink to the group
*/
public static function makeGroupLinkWiki( $group, $text = '' ) {
- if( $text == '' ) {
+ if ( $text == '' ) {
$text = self::getGroupName( $group );
}
$title = self::getGroupPage( $group );
- if( $title ) {
+ if ( $title ) {
$page = $title->getPrefixedText();
return "[[$page|$text]]";
} else {
@@ -4000,53 +4265,53 @@ class User {
global $wgAddGroups, $wgRemoveGroups, $wgGroupsAddToSelf, $wgGroupsRemoveFromSelf;
$groups = array( 'add' => array(), 'remove' => array(), 'add-self' => array(), 'remove-self' => array() );
- if( empty( $wgAddGroups[$group] ) ) {
+ if ( empty( $wgAddGroups[$group] ) ) {
// Don't add anything to $groups
- } elseif( $wgAddGroups[$group] === true ) {
+ } elseif ( $wgAddGroups[$group] === true ) {
// You get everything
$groups['add'] = self::getAllGroups();
- } elseif( is_array( $wgAddGroups[$group] ) ) {
+ } elseif ( is_array( $wgAddGroups[$group] ) ) {
$groups['add'] = $wgAddGroups[$group];
}
// Same thing for remove
- if( empty( $wgRemoveGroups[$group] ) ) {
- } elseif( $wgRemoveGroups[$group] === true ) {
+ if ( empty( $wgRemoveGroups[$group] ) ) {
+ } elseif ( $wgRemoveGroups[$group] === true ) {
$groups['remove'] = self::getAllGroups();
- } elseif( is_array( $wgRemoveGroups[$group] ) ) {
+ } elseif ( is_array( $wgRemoveGroups[$group] ) ) {
$groups['remove'] = $wgRemoveGroups[$group];
}
// Re-map numeric keys of AddToSelf/RemoveFromSelf to the 'user' key for backwards compatibility
- if( empty( $wgGroupsAddToSelf['user']) || $wgGroupsAddToSelf['user'] !== true ) {
- foreach( $wgGroupsAddToSelf as $key => $value ) {
- if( is_int( $key ) ) {
+ if ( empty( $wgGroupsAddToSelf['user'] ) || $wgGroupsAddToSelf['user'] !== true ) {
+ foreach ( $wgGroupsAddToSelf as $key => $value ) {
+ if ( is_int( $key ) ) {
$wgGroupsAddToSelf['user'][] = $value;
}
}
}
- if( empty( $wgGroupsRemoveFromSelf['user']) || $wgGroupsRemoveFromSelf['user'] !== true ) {
- foreach( $wgGroupsRemoveFromSelf as $key => $value ) {
- if( is_int( $key ) ) {
+ if ( empty( $wgGroupsRemoveFromSelf['user'] ) || $wgGroupsRemoveFromSelf['user'] !== true ) {
+ foreach ( $wgGroupsRemoveFromSelf as $key => $value ) {
+ if ( is_int( $key ) ) {
$wgGroupsRemoveFromSelf['user'][] = $value;
}
}
}
// Now figure out what groups the user can add to him/herself
- if( empty( $wgGroupsAddToSelf[$group] ) ) {
- } elseif( $wgGroupsAddToSelf[$group] === true ) {
+ if ( empty( $wgGroupsAddToSelf[$group] ) ) {
+ } elseif ( $wgGroupsAddToSelf[$group] === true ) {
// No idea WHY this would be used, but it's there
$groups['add-self'] = User::getAllGroups();
- } elseif( is_array( $wgGroupsAddToSelf[$group] ) ) {
+ } elseif ( is_array( $wgGroupsAddToSelf[$group] ) ) {
$groups['add-self'] = $wgGroupsAddToSelf[$group];
}
- if( empty( $wgGroupsRemoveFromSelf[$group] ) ) {
- } elseif( $wgGroupsRemoveFromSelf[$group] === true ) {
+ if ( empty( $wgGroupsRemoveFromSelf[$group] ) ) {
+ } elseif ( $wgGroupsRemoveFromSelf[$group] === true ) {
$groups['remove-self'] = User::getAllGroups();
- } elseif( is_array( $wgGroupsRemoveFromSelf[$group] ) ) {
+ } elseif ( is_array( $wgGroupsRemoveFromSelf[$group] ) ) {
$groups['remove-self'] = $wgGroupsRemoveFromSelf[$group];
}
@@ -4061,7 +4326,7 @@ class User {
* 'remove-self' => array( removable groups from self) )
*/
public function changeableGroups() {
- if( $this->isAllowed( 'userrights' ) ) {
+ if ( $this->isAllowed( 'userrights' ) ) {
// This group gives the right to modify everything (reverse-
// compatibility with old "userrights lets you change
// everything")
@@ -4084,7 +4349,7 @@ class User {
);
$addergroups = $this->getEffectiveGroups();
- foreach( $addergroups as $addergroup ) {
+ foreach ( $addergroups as $addergroup ) {
$groups = array_merge_recursive(
$groups, $this->changeableByGroup( $addergroup )
);
@@ -4101,7 +4366,7 @@ class User {
* Will have no effect for anonymous users.
*/
public function incEditCount() {
- if( !$this->isAnon() ) {
+ if ( !$this->isAnon() ) {
$dbw = wfGetDB( DB_MASTER );
$dbw->update(
'user',
@@ -4111,10 +4376,10 @@ class User {
);
// Lazy initialization check...
- if( $dbw->affectedRows() == 0 ) {
+ if ( $dbw->affectedRows() == 0 ) {
// Now here's a goddamn hack...
$dbr = wfGetDB( DB_SLAVE );
- if( $dbr !== $dbw ) {
+ if ( $dbr !== $dbw ) {
// If we actually have a slave server, the count is
// at least one behind because the current transaction
// has not been committed and replicated.
@@ -4135,13 +4400,13 @@ class User {
* Initialize user_editcount from data out of the revision table
*
* @param $add Integer Edits to add to the count from the revision table
- * @return Integer Number of edits
+ * @return integer Number of edits
*/
protected function initEditCount( $add = 0 ) {
// Pull from a slave to be less cruel to servers
// Accuracy isn't the point anyway here
$dbr = wfGetDB( DB_SLAVE );
- $count = (int) $dbr->selectField(
+ $count = (int)$dbr->selectField(
'revision',
'COUNT(rev_user)',
array( 'rev_user' => $this->getId() ),
@@ -4164,7 +4429,7 @@ class User {
* Get the description of a given right
*
* @param string $right Right to query
- * @return String Localized description of the right
+ * @return string Localized description of the right
*/
public static function getRightDescription( $right ) {
$key = "right-$right";
@@ -4177,7 +4442,7 @@ class User {
*
* @param string $password Plain-text password
* @param string $userId User ID
- * @return String Password hash
+ * @return string Password hash
*/
public static function oldCrypt( $password, $userId ) {
global $wgPasswordSalt;
@@ -4193,19 +4458,18 @@ class User {
*
* @param string $password Plain-text password
* @param bool|string $salt Optional salt, may be random or the user ID.
-
- * If unspecified or false, will generate one automatically
- * @return String Password hash
+ * If unspecified or false, will generate one automatically
+ * @return string Password hash
*/
public static function crypt( $password, $salt = false ) {
global $wgPasswordSalt;
$hash = '';
- if( !wfRunHooks( 'UserCryptPassword', array( &$password, &$salt, &$wgPasswordSalt, &$hash ) ) ) {
+ if ( !wfRunHooks( 'UserCryptPassword', array( &$password, &$salt, &$wgPasswordSalt, &$hash ) ) ) {
return $hash;
}
- if( $wgPasswordSalt ) {
+ if ( $wgPasswordSalt ) {
if ( $salt === false ) {
$salt = MWCryptRand::generateHex( 8 );
}
@@ -4223,25 +4487,25 @@ class User {
* @param string $password Plain-text password to compare
* @param string|bool $userId User ID for old-style password salt
*
- * @return Boolean
+ * @return boolean
*/
public static function comparePasswords( $hash, $password, $userId = false ) {
$type = substr( $hash, 0, 3 );
$result = false;
- if( !wfRunHooks( 'UserComparePasswords', array( &$hash, &$password, &$userId, &$result ) ) ) {
+ if ( !wfRunHooks( 'UserComparePasswords', array( &$hash, &$password, &$userId, &$result ) ) ) {
return $result;
}
if ( $type == ':A:' ) {
- # Unsalted
+ // Unsalted
return md5( $password ) === substr( $hash, 3 );
} elseif ( $type == ':B:' ) {
- # Salted
+ // Salted
list( $salt, $realHash ) = explode( ':', substr( $hash, 3 ), 2 );
- return md5( $salt.'-'.md5( $password ) ) === $realHash;
+ return md5( $salt . '-' . md5( $password ) ) === $realHash;
} else {
- # Old-style
+ // Old-style
return self::oldCrypt( $password, $userId ) === $hash;
}
}
@@ -4257,6 +4521,7 @@ class User {
* no matter the value of $wgUser
* - 'create2' for a logged in user creating an account for someone else
* - 'byemail' when the created user will receive its password by e-mail
+ * - 'autocreate' when the user is automatically created (such as by CentralAuth).
* - Boolean means whether the account was created by e-mail (deprecated):
* - true will be converted to 'byemail'
* - false will be converted to 'create' if this object is the same as
@@ -4268,7 +4533,7 @@ class User {
*/
public function addNewUserLogEntry( $action = false, $reason = '' ) {
global $wgUser, $wgNewUserLog;
- if( empty( $wgNewUserLog ) ) {
+ if ( empty( $wgNewUserLog ) ) {
return true; // disabled
}
@@ -4348,11 +4613,11 @@ class User {
// Maybe load from the object
if ( !is_null( $this->mOptionOverrides ) ) {
wfDebug( "User: loading options for user " . $this->getId() . " from override cache.\n" );
- foreach( $this->mOptionOverrides as $key => $value ) {
+ foreach ( $this->mOptionOverrides as $key => $value ) {
$this->mOptions[$key] = $value;
}
} else {
- if( !is_array( $data ) ) {
+ if ( !is_array( $data ) ) {
wfDebug( "User: loading options for user " . $this->getId() . " from database.\n" );
// Load from database
$dbr = wfGetDB( DB_SLAVE );
@@ -4385,8 +4650,6 @@ class User {
* @todo document
*/
protected function saveOptions() {
- global $wgAllowPrefChange;
-
$this->loadOptions();
// Not using getOptions(), to keep hidden preferences in database
@@ -4394,15 +4657,14 @@ class User {
// Allow hooks to abort, for instance to save to a global profile.
// Reset options to default state before saving.
- if( !wfRunHooks( 'UserSaveOptions', array( $this, &$saveOptions ) ) ) {
+ if ( !wfRunHooks( 'UserSaveOptions', array( $this, &$saveOptions ) ) ) {
return;
}
- $extuser = ExternalUser::newFromUser( $this );
$userId = $this->getId();
$insert_rows = array();
- foreach( $saveOptions as $key => $value ) {
- # Don't bother storing default values
+ foreach ( $saveOptions as $key => $value ) {
+ // Don't bother storing default values
$defaultOption = self::getDefaultOption( $key );
if ( ( is_null( $defaultOption ) &&
!( $value === false || is_null( $value ) ) ) ||
@@ -4413,21 +4675,21 @@ class User {
'up_value' => $value,
);
}
- if ( $extuser && isset( $wgAllowPrefChange[$key] ) ) {
- switch ( $wgAllowPrefChange[$key] ) {
- case 'local':
- case 'message':
- break;
- case 'semiglobal':
- case 'global':
- $extuser->setPref( $key, $value );
- }
- }
}
$dbw = wfGetDB( DB_MASTER );
- $dbw->delete( 'user_properties', array( 'up_user' => $userId ), __METHOD__ );
- $dbw->insert( 'user_properties', $insert_rows, __METHOD__ );
+ $hasRows = $dbw->selectField( 'user_properties', '1',
+ array( 'up_user' => $userId ), __METHOD__ );
+
+ if ( $hasRows ) {
+ // Only do this delete if there is something there. A very large portion of
+ // calls to this function are for setting 'rememberpassword' for new accounts.
+ // Doing this delete for new accounts with no rows in the table rougly causes
+ // gap locks on [max user ID,+infinity) which causes high contention since many
+ // updates will pile up on each other since they are for higher (newer) user IDs.
+ $dbw->delete( 'user_properties', array( 'up_user' => $userId ), __METHOD__ );
+ }
+ $dbw->insert( 'user_properties', $insert_rows, __METHOD__, array( 'IGNORE' ) );
}
/**
@@ -4451,8 +4713,7 @@ class User {
*
* @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
- * get confused by the boolean attribute syntax used.)
+ * That will get confused by the boolean attribute syntax used.)
*/
public static function passwordChangeInputAttribs() {
global $wgMinimalPasswordLength;
@@ -4512,4 +4773,26 @@ class User {
'user_editcount',
);
}
+
+ /**
+ * Factory function for fatal permission-denied errors
+ *
+ * @since 1.22
+ * @param string $permission User right required
+ * @return Status
+ */
+ static function newFatalPermissionDeniedStatus( $permission ) {
+ global $wgLang;
+
+ $groups = array_map(
+ array( 'User', 'makeGroupLinkWiki' ),
+ User::getGroupsWithPermission( $permission )
+ );
+
+ if ( $groups ) {
+ return Status::newFatal( 'badaccess-groups', $wgLang->commaList( $groups ), count( $groups ) );
+ } else {
+ return Status::newFatal( 'badaccess-group0' );
+ }
+ }
}
diff --git a/includes/UserArray.php b/includes/UserArray.php
index 3b8f5c10..1f55ef35 100644
--- a/includes/UserArray.php
+++ b/includes/UserArray.php
@@ -44,7 +44,7 @@ abstract class UserArray implements Iterator {
$ids = array_map( 'intval', (array)$ids ); // paranoia
if ( !$ids ) {
// Database::select() doesn't like empty arrays
- return new ArrayIterator(array());
+ return new ArrayIterator( array() );
}
$dbr = wfGetDB( DB_SLAVE );
$res = $dbr->select( 'user', '*', array( 'user_id' => $ids ),
diff --git a/includes/UserMailer.php b/includes/UserMailer.php
index 6eb99172..8ab10b2d 100644
--- a/includes/UserMailer.php
+++ b/includes/UserMailer.php
@@ -119,7 +119,7 @@ class UserMailer {
*/
static function arrayToHeaderString( $headers, $endl = "\n" ) {
$strings = array();
- foreach( $headers as $name => $value ) {
+ foreach ( $headers as $name => $value ) {
$strings[] = "$name: $value";
}
return implode( $endl, $strings );
@@ -241,7 +241,7 @@ class UserMailer {
$headers['Reply-To'] = $replyto->toString();
}
- $headers['Date'] = date( 'r' );
+ $headers['Date'] = MWTimestamp::getLocalInstance()->format( 'r' );
$headers['Message-ID'] = self::makeMsgId();
$headers['X-Mailer'] = 'MediaWiki mailer';
@@ -258,14 +258,16 @@ class UserMailer {
wfDebug( "Assembling multipart mime email\n" );
if ( !stream_resolve_include_path( 'Mail/mime.php' ) ) {
wfDebug( "PEAR Mail_Mime package is not installed. Falling back to text email.\n" );
+ // remove the html body for text email fall back
+ $body = $body['text'];
}
else {
- require_once( 'Mail/mime.php' );
+ require_once 'Mail/mime.php';
if ( wfIsWindows() ) {
$body['text'] = str_replace( "\n", "\r\n", $body['text'] );
$body['html'] = str_replace( "\n", "\r\n", $body['html'] );
}
- $mime = new Mail_mime( array( 'eol' => $endl ) );
+ $mime = new Mail_mime( array( 'eol' => $endl, 'text_charset' => 'UTF-8', 'html_charset' => 'UTF-8' ) );
$mime->setTXTBody( $body['text'] );
$mime->setHTMLBody( $body['html'] );
$body = $mime->get(); // must call get() before headers()
@@ -300,7 +302,7 @@ class UserMailer {
if ( !stream_resolve_include_path( 'Mail.php' ) ) {
throw new MWException( 'PEAR mail package is not installed' );
}
- require_once( 'Mail.php' );
+ require_once 'Mail.php';
wfSuppressWarnings();
@@ -338,7 +340,7 @@ class UserMailer {
#
# PHP mail()
#
- if( count( $to ) > 1 ) {
+ if ( count( $to ) > 1 ) {
$headers['To'] = 'undisclosed-recipients:;';
}
$headers = self::arrayToHeaderString( $headers, $endl );
@@ -409,7 +411,7 @@ class UserMailer {
*/
public static function quotedPrintable( $string, $charset = '' ) {
# Probably incomplete; see RFC 2045
- if( empty( $charset ) ) {
+ if ( empty( $charset ) ) {
$charset = 'UTF-8';
}
$charset = strtoupper( $charset );
@@ -417,7 +419,7 @@ class UserMailer {
$illegal = '\x00-\x08\x0b\x0c\x0e-\x1f\x7f-\xff=';
$replace = $illegal . '\t ?_';
- if( !preg_match( "/[$illegal]/", $string ) ) {
+ if ( !preg_match( "/[$illegal]/", $string ) ) {
return $string;
}
$out = "=?$charset?Q?";
@@ -605,6 +607,7 @@ class EmailNotification {
wfRunHooks( 'UpdateUserMailerFormattedPageStatus', array( &$formattedPageStatus ) );
if ( !in_array( $this->pageStatus, $formattedPageStatus ) ) {
+ wfProfileOut( __METHOD__ );
throw new MWException( 'Not a valid page status!' );
}
@@ -667,11 +670,13 @@ class EmailNotification {
} elseif ( $targetUser->getOption( 'enotifusertalkpages' ) &&
( !$minorEdit || $targetUser->getOption( 'enotifminoredits' ) ) )
{
- if ( $targetUser->isEmailConfirmed() ) {
+ if ( !$targetUser->isEmailConfirmed() ) {
+ wfDebug( __METHOD__ . ": talk page owner doesn't have validated email\n" );
+ } elseif ( !wfRunHooks( 'AbortTalkPageEmailNotification', array( $targetUser, $title ) ) ) {
+ wfDebug( __METHOD__ . ": talk page update notification is aborted for this user\n" );
+ } else {
wfDebug( __METHOD__ . ": sending talk page update notification\n" );
return true;
- } else {
- wfDebug( __METHOD__ . ": talk page owner doesn't have validated email\n" );
}
} else {
wfDebug( __METHOD__ . ": talk page owner doesn't want notifications\n" );
@@ -696,20 +701,20 @@ class EmailNotification {
$keys = array();
$postTransformKeys = array();
- $pageTitleUrl = $this->title->getCanonicalUrl();
+ $pageTitleUrl = $this->title->getCanonicalURL();
$pageTitle = $this->title->getPrefixedText();
if ( $this->oldid ) {
// Always show a link to the diff which triggered the mail. See bug 32210.
$keys['$NEWPAGE'] = "\n\n" . wfMessage( 'enotif_lastdiff',
- $this->title->getCanonicalUrl( 'diff=next&oldid=' . $this->oldid ) )
+ $this->title->getCanonicalURL( array( 'diff' => 'next', 'oldid' => $this->oldid ) ) )
->inContentLanguage()->text();
if ( !$wgEnotifImpersonal ) {
// For personal mail, also show a link to the diff of all changes
// since last visited.
$keys['$NEWPAGE'] .= "\n\n" . wfMessage( 'enotif_lastvisited',
- $this->title->getCanonicalUrl( 'diff=0&oldid=' . $this->oldid ) )
+ $this->title->getCanonicalURL( array( 'diff' => '0', 'oldid' => $this->oldid ) ) )
->inContentLanguage()->text();
}
$keys['$OLDID'] = $this->oldid;
@@ -724,10 +729,10 @@ class EmailNotification {
}
$keys['$PAGETITLE'] = $this->title->getPrefixedText();
- $keys['$PAGETITLE_URL'] = $this->title->getCanonicalUrl();
+ $keys['$PAGETITLE_URL'] = $this->title->getCanonicalURL();
$keys['$PAGEMINOREDIT'] = $this->minorEdit ?
wfMessage( 'minoredit' )->inContentLanguage()->text() : '';
- $keys['$UNWATCHURL'] = $this->title->getCanonicalUrl( 'action=unwatch' );
+ $keys['$UNWATCHURL'] = $this->title->getCanonicalURL( 'action=unwatch' );
if ( $this->editor->isAnon() ) {
# real anon (user:xxx.xxx.xxx.xxx)
@@ -738,18 +743,25 @@ class EmailNotification {
} else {
$keys['$PAGEEDITOR'] = $wgEnotifUseRealName ? $this->editor->getRealName() : $this->editor->getName();
$emailPage = SpecialPage::getSafeTitleFor( 'Emailuser', $this->editor->getName() );
- $keys['$PAGEEDITOR_EMAIL'] = $emailPage->getCanonicalUrl();
+ $keys['$PAGEEDITOR_EMAIL'] = $emailPage->getCanonicalURL();
}
- $keys['$PAGEEDITOR_WIKI'] = $this->editor->getUserPage()->getCanonicalUrl();
+ $keys['$PAGEEDITOR_WIKI'] = $this->editor->getUserPage()->getCanonicalURL();
# Replace this after transforming the message, bug 35019
$postTransformKeys['$PAGESUMMARY'] = $this->summary == '' ? ' - ' : $this->summary;
- # Now build message's subject and body
+ // Now build message's subject and body
+
+ // Messages:
+ // enotif_subject_deleted, enotif_subject_created, enotif_subject_moved,
+ // enotif_subject_restored, enotif_subject_changed
$this->subject = wfMessage( 'enotif_subject_' . $this->pageStatus )->inContentLanguage()
->params( $pageTitle, $keys['$PAGEEDITOR'] )->text();
+ // Messages:
+ // enotif_body_intro_deleted, enotif_body_intro_created, enotif_body_intro_moved,
+ // enotif_body_intro_restored, enotif_body_intro_changed
$keys['$PAGEINTRO'] = wfMessage( 'enotif_body_intro_' . $this->pageStatus )
->inContentLanguage()->params( $pageTitle, $keys['$PAGEEDITOR'], $pageTitleUrl )
->text();
@@ -790,8 +802,9 @@ class EmailNotification {
function compose( $user ) {
global $wgEnotifImpersonal;
- if ( !$this->composed_common )
+ if ( !$this->composed_common ) {
$this->composeCommonMailtext();
+ }
if ( $wgEnotifImpersonal ) {
$this->mailTargets[] = new MailAddress( $user );
diff --git a/includes/UserRightsProxy.php b/includes/UserRightsProxy.php
index cd5dff84..a8a22be7 100644
--- a/includes/UserRightsProxy.php
+++ b/includes/UserRightsProxy.php
@@ -74,7 +74,7 @@ class UserRightsProxy {
*/
public static function whoIs( $database, $id, $ignoreInvalidDB = false ) {
$user = self::newFromId( $database, $id, $ignoreInvalidDB );
- if( $user ) {
+ if ( $user ) {
return $user->name;
} else {
return false;
@@ -114,12 +114,12 @@ class UserRightsProxy {
*/
private static function newFromLookup( $database, $field, $value, $ignoreInvalidDB = false ) {
$db = self::getDB( $database, $ignoreInvalidDB );
- if( $db ) {
+ if ( $db ) {
$row = $db->selectRow( 'user',
array( 'user_id', 'user_name' ),
array( $field => $value ),
__METHOD__ );
- if( $row !== false ) {
+ if ( $row !== false ) {
return new UserRightsProxy( $db, $database,
$row->user_name,
intval( $row->user_id ) );
@@ -138,8 +138,8 @@ class UserRightsProxy {
*/
public static function getDB( $database, $ignoreInvalidDB = false ) {
global $wgDBname;
- if( self::validDatabase( $database ) ) {
- if( $database == $wgDBname ) {
+ if ( $ignoreInvalidDB || self::validDatabase( $database ) ) {
+ if ( $database == $wgDBname ) {
// Hmm... this shouldn't happen though. :)
return wfGetDB( DB_MASTER );
} else {
diff --git a/includes/WatchedItem.php b/includes/WatchedItem.php
index 5ac92f73..1e07e7c7 100644
--- a/includes/WatchedItem.php
+++ b/includes/WatchedItem.php
@@ -27,19 +27,37 @@
* @ingroup Watchlist
*/
class WatchedItem {
- var $mTitle, $mUser;
+ /**
+ * Constant to specify that user rights 'editmywatchlist' and
+ * 'viewmywatchlist' should not be checked.
+ * @since 1.22
+ */
+ const IGNORE_USER_RIGHTS = 0;
+
+ /**
+ * Constant to specify that user rights 'editmywatchlist' and
+ * 'viewmywatchlist' should be checked.
+ * @since 1.22
+ */
+ const CHECK_USER_RIGHTS = 1;
+
+ var $mTitle, $mUser, $mCheckRights;
private $loaded = false, $watched, $timestamp;
/**
* Create a WatchedItem object with the given user and title
+ * @since 1.22 $checkRights parameter added
* @param $user User: the user to use for (un)watching
* @param $title Title: the title we're going to (un)watch
+ * @param $checkRights int: Whether to check the 'viewmywatchlist' and 'editmywatchlist' rights.
+ * Pass either WatchedItem::IGNORE_USER_RIGHTS or WatchedItem::CHECK_USER_RIGHTS.
* @return WatchedItem object
*/
- public static function fromUserTitle( $user, $title ) {
+ public static function fromUserTitle( $user, $title, $checkRights = WatchedItem::CHECK_USER_RIGHTS ) {
$wl = new WatchedItem;
$wl->mUser = $user;
$wl->mTitle = $title;
+ $wl->mCheckRights = $checkRights;
return $wl;
}
@@ -89,6 +107,12 @@ class WatchedItem {
}
$this->loaded = true;
+ // Only loggedin user can have a watchlist
+ if ( $this->mUser->isAnon() ) {
+ $this->watched = false;
+ return;
+ }
+
# Pages and their talk pages are considered equivalent for watching;
# remember that talk namespaces are numbered as page namespace+1.
@@ -105,10 +129,22 @@ class WatchedItem {
}
/**
+ * Check permissions
+ * @param $what string: 'viewmywatchlist' or 'editmywatchlist'
+ */
+ private function isAllowed( $what ) {
+ return !$this->mCheckRights || $this->mUser->isAllowed( $what );
+ }
+
+ /**
* Is mTitle being watched by mUser?
* @return bool
*/
public function isWatched() {
+ if ( !$this->isAllowed( 'viewmywatchlist' ) ) {
+ return false;
+ }
+
$this->load();
return $this->watched;
}
@@ -120,6 +156,10 @@ class WatchedItem {
* the wl_notificationtimestamp field otherwise
*/
public function getNotificationTimestamp() {
+ if ( !$this->isAllowed( 'viewmywatchlist' ) ) {
+ return false;
+ }
+
$this->load();
if ( $this->watched ) {
return $this->timestamp;
@@ -135,6 +175,11 @@ class WatchedItem {
* page is not watched or the notification timestamp is already NULL.
*/
public function resetNotificationTimestamp( $force = '' ) {
+ // Only loggedin user can have a watchlist
+ if ( wfReadOnly() || $this->mUser->isAnon() || !$this->isAllowed( 'editmywatchlist' ) ) {
+ return;
+ }
+
if ( $force != 'force' ) {
$this->load();
if ( !$this->watched || $this->timestamp === null ) {
@@ -153,11 +198,17 @@ class WatchedItem {
/**
* Given a title and user (assumes the object is setup), add the watch to the
* database.
- * @return bool (always true)
+ * @return bool
*/
public function addWatch() {
wfProfileIn( __METHOD__ );
+ // Only loggedin user can have a watchlist
+ if ( wfReadOnly() || $this->mUser->isAnon() || !$this->isAllowed( 'editmywatchlist' ) ) {
+ wfProfileOut( __METHOD__ );
+ return false;
+ }
+
// Use INSERT IGNORE to avoid overwriting the notification timestamp
// if there's already an entry for this page
$dbw = wfGetDB( DB_MASTER );
@@ -192,6 +243,12 @@ class WatchedItem {
public function removeWatch() {
wfProfileIn( __METHOD__ );
+ // Only loggedin user can have a watchlist
+ if ( wfReadOnly() || $this->mUser->isAnon() || !$this->isAllowed( 'editmywatchlist' ) ) {
+ wfProfileOut( __METHOD__ );
+ return false;
+ }
+
$success = false;
$dbw = wfGetDB( DB_MASTER );
$dbw->delete( 'watchlist',
@@ -268,7 +325,7 @@ class WatchedItem {
);
}
- if( empty( $values ) ) {
+ if ( empty( $values ) ) {
// Nothing to do
return true;
}
diff --git a/includes/WebRequest.php b/includes/WebRequest.php
index 98007ef8..b17cb9ec 100644
--- a/includes/WebRequest.php
+++ b/includes/WebRequest.php
@@ -91,11 +91,11 @@ class WebRequest {
wfSuppressWarnings();
$a = parse_url( $url );
wfRestoreWarnings();
- if( $a ) {
+ if ( $a ) {
$path = isset( $a['path'] ) ? $a['path'] : '';
global $wgScript;
- if( $path == $wgScript && $want !== 'all' ) {
+ if ( $path == $wgScript && $want !== 'all' ) {
// Script inside a rewrite path?
// Abort to keep from breaking...
return $matches;
@@ -106,7 +106,7 @@ class WebRequest {
// Raw PATH_INFO style
$router->add( "$wgScript/$1" );
- if( isset( $_SERVER['SCRIPT_NAME'] )
+ if ( isset( $_SERVER['SCRIPT_NAME'] )
&& preg_match( '/\.php5?/', $_SERVER['SCRIPT_NAME'] ) )
{
# Check for SCRIPT_NAME, we handle index.php explicitly
@@ -116,17 +116,17 @@ class WebRequest {
}
global $wgArticlePath;
- if( $wgArticlePath ) {
+ if ( $wgArticlePath ) {
$router->add( $wgArticlePath );
}
global $wgActionPaths;
- if( $wgActionPaths ) {
+ if ( $wgActionPaths ) {
$router->add( $wgActionPaths, array( 'action' => '$key' ) );
}
global $wgVariantArticlePath, $wgContLang;
- if( $wgVariantArticlePath ) {
+ if ( $wgVariantArticlePath ) {
$router->add( $wgVariantArticlePath,
array( 'variant' => '$2' ),
array( '$2' => $wgContLang->getVariants() )
@@ -224,7 +224,7 @@ class WebRequest {
}
$matches = self::getPathInfo( 'title' );
- foreach( $matches as $key => $val) {
+ foreach ( $matches as $key => $val ) {
$this->data[$key] = $_GET[$key] = $_REQUEST[$key] = $val;
}
}
@@ -240,15 +240,15 @@ class WebRequest {
* @return array of URL variables to interpolate; empty if no match
*/
static function extractTitle( $path, $bases, $key = false ) {
- foreach( (array)$bases as $keyValue => $base ) {
+ foreach ( (array)$bases as $keyValue => $base ) {
// Find the part after $wgArticlePath
$base = str_replace( '$1', '', $base );
$baseLen = strlen( $base );
- if( substr( $path, 0, $baseLen ) == $base ) {
+ if ( substr( $path, 0, $baseLen ) == $base ) {
$raw = substr( $path, $baseLen );
- if( $raw !== '' ) {
+ if ( $raw !== '' ) {
$matches = array( 'title' => rawurldecode( $raw ) );
- if( $key ) {
+ if ( $key ) {
$matches[$key] = $keyValue;
}
return $matches;
@@ -271,8 +271,8 @@ class WebRequest {
*/
private function &fix_magic_quotes( &$arr, $topLevel = true ) {
$clean = array();
- foreach( $arr as $key => $val ) {
- if( is_array( $val ) ) {
+ foreach ( $arr as $key => $val ) {
+ if ( is_array( $val ) ) {
$cleanKey = $topLevel ? stripslashes( $key ) : $key;
$clean[$cleanKey] = $this->fix_magic_quotes( $arr[$key], false );
} else {
@@ -293,7 +293,7 @@ class WebRequest {
private function checkMagicQuotes() {
$mustFixQuotes = function_exists( 'get_magic_quotes_gpc' )
&& get_magic_quotes_gpc();
- if( $mustFixQuotes ) {
+ if ( $mustFixQuotes ) {
$this->fix_magic_quotes( $_COOKIE );
$this->fix_magic_quotes( $_ENV );
$this->fix_magic_quotes( $_GET );
@@ -311,8 +311,8 @@ class WebRequest {
* @private
*/
function normalizeUnicode( $data ) {
- if( is_array( $data ) ) {
- foreach( $data as $key => $val ) {
+ if ( is_array( $data ) ) {
+ foreach ( $data as $key => $val ) {
$data[$key] = $this->normalizeUnicode( $val );
}
} else {
@@ -335,19 +335,18 @@ class WebRequest {
# http://us2.php.net/variables.external#language.variables.external.dot-in-names
# Work around PHP *feature* to avoid *bugs* elsewhere.
$name = strtr( $name, '.', '_' );
- if( isset( $arr[$name] ) ) {
+ if ( isset( $arr[$name] ) ) {
global $wgContLang;
$data = $arr[$name];
- if( isset( $_GET[$name] ) && !is_array( $data ) ) {
+ if ( isset( $_GET[$name] ) && !is_array( $data ) ) {
# Check for alternate/legacy character encoding.
- if( isset( $wgContLang ) ) {
+ if ( isset( $wgContLang ) ) {
$data = $wgContLang->checkTitleEncoding( $data );
}
}
$data = $this->normalizeUnicode( $data );
return $data;
} else {
- taint( $default );
return $default;
}
}
@@ -364,10 +363,10 @@ class WebRequest {
*/
public function getVal( $name, $default = null ) {
$val = $this->getGPCVal( $this->data, $name, $default );
- if( is_array( $val ) ) {
+ if ( is_array( $val ) ) {
$val = $default;
}
- if( is_null( $val ) ) {
+ if ( is_null( $val ) ) {
return $val;
} else {
return (string)$val;
@@ -414,7 +413,7 @@ class WebRequest {
*/
public function getArray( $name, $default = null ) {
$val = $this->getGPCVal( $this->data, $name, $default );
- if( is_null( $val ) ) {
+ if ( is_null( $val ) ) {
return null;
} else {
return (array)$val;
@@ -433,7 +432,7 @@ class WebRequest {
*/
public function getIntArray( $name, $default = null ) {
$val = $this->getArray( $name, $default );
- if( is_array( $val ) ) {
+ if ( is_array( $val ) ) {
$val = array_map( 'intval', $val );
}
return $val;
@@ -570,6 +569,44 @@ class WebRequest {
}
/**
+ * Return the contents of the Query with no decoding. Use when you need to
+ * know exactly what was sent, e.g. for an OAuth signature over the elements.
+ *
+ * @return String
+ */
+ public function getRawQueryString() {
+ return $_SERVER['QUERY_STRING'];
+ }
+
+ /**
+ * Return the contents of the POST with no decoding. Use when you need to
+ * know exactly what was sent, e.g. for an OAuth signature over the elements.
+ *
+ * @return String
+ */
+ public function getRawPostString() {
+ if ( !$this->wasPosted() ) {
+ return '';
+ }
+ return $this->getRawInput();
+ }
+
+ /**
+ * Return the raw request body, with no processing. Cached since some methods
+ * disallow reading the stream more than once. As stated in the php docs, this
+ * does not work with enctype="multipart/form-data".
+ *
+ * @return String
+ */
+ public function getRawInput() {
+ static $input = false;
+ if ( $input === false ) {
+ $input = file_get_contents( 'php://input' );
+ }
+ return $input;
+ }
+
+ /**
* Get the HTTP method used for this request.
*
* @return String
@@ -603,7 +640,7 @@ class WebRequest {
* @return Boolean
*/
public function checkSessionCookie() {
- return isset( $_COOKIE[ session_name() ] );
+ return isset( $_COOKIE[session_name()] );
}
/**
@@ -615,7 +652,7 @@ class WebRequest {
* @return Mixed: cookie value or $default if the cookie not set
*/
public function getCookie( $key, $prefix = null, $default = null ) {
- if( $prefix === null ) {
+ if ( $prefix === null ) {
global $wgCookiePrefix;
$prefix = $wgCookiePrefix;
}
@@ -630,14 +667,14 @@ class WebRequest {
* @return String
*/
public function getRequestURL() {
- if( isset( $_SERVER['REQUEST_URI'] ) && strlen( $_SERVER['REQUEST_URI'] ) ) {
+ if ( isset( $_SERVER['REQUEST_URI'] ) && strlen( $_SERVER['REQUEST_URI'] ) ) {
$base = $_SERVER['REQUEST_URI'];
} elseif ( isset( $_SERVER['HTTP_X_ORIGINAL_URL'] ) && strlen( $_SERVER['HTTP_X_ORIGINAL_URL'] ) ) {
// Probably IIS; doesn't set REQUEST_URI
$base = $_SERVER['HTTP_X_ORIGINAL_URL'];
- } elseif( isset( $_SERVER['SCRIPT_NAME'] ) ) {
+ } elseif ( isset( $_SERVER['SCRIPT_NAME'] ) ) {
$base = $_SERVER['SCRIPT_NAME'];
- if( isset( $_SERVER['QUERY_STRING'] ) && $_SERVER['QUERY_STRING'] != '' ) {
+ if ( isset( $_SERVER['QUERY_STRING'] ) && $_SERVER['QUERY_STRING'] != '' ) {
$base .= '?' . $_SERVER['QUERY_STRING'];
}
} else {
@@ -651,14 +688,16 @@ class WebRequest {
// need to strip it or we get false-positive redirect loops
// or weird output URLs
$hash = strpos( $base, '#' );
- if( $hash !== false ) {
+ if ( $hash !== false ) {
$base = substr( $base, 0, $hash );
}
- if( $base[0] == '/' ) {
- return $base;
+
+ if ( $base[0] == '/' ) {
+ // More than one slash will look like it is protocol relative
+ return preg_replace( '!^/+!', '/', $base );
} else {
// We may get paths with a host prepended; strip it.
- return preg_replace( '!^[^:]+://[^/]+/!', '/', $base );
+ return preg_replace( '!^[^:]+://[^/]+/+!', '/', $base );
}
}
@@ -737,21 +776,21 @@ class WebRequest {
global $wgUser;
$limit = $this->getInt( 'limit', 0 );
- if( $limit < 0 ) {
+ if ( $limit < 0 ) {
$limit = 0;
}
- if( ( $limit == 0 ) && ( $optionname != '' ) ) {
+ if ( ( $limit == 0 ) && ( $optionname != '' ) ) {
$limit = $wgUser->getIntOption( $optionname );
}
- if( $limit <= 0 ) {
+ if ( $limit <= 0 ) {
$limit = $deflimit;
}
- if( $limit > 5000 ) {
+ if ( $limit > 5000 ) {
$limit = 5000; # We have *some* limits...
}
$offset = $this->getInt( 'offset', 0 );
- if( $offset < 0 ) {
+ if ( $offset < 0 ) {
$offset = 0;
}
@@ -842,9 +881,10 @@ class WebRequest {
return;
}
- if ( function_exists( 'apache_request_headers' ) ) {
- foreach ( apache_request_headers() as $tempName => $tempValue ) {
- $this->headers[ strtoupper( $tempName ) ] = $tempValue;
+ $apacheHeaders = function_exists( 'apache_request_headers' ) ? apache_request_headers() : false;
+ if ( $apacheHeaders ) {
+ foreach ( $apacheHeaders as $tempName => $tempValue ) {
+ $this->headers[strtoupper( $tempName )] = $tempValue;
}
} else {
foreach ( $_SERVER as $name => $value ) {
@@ -891,7 +931,7 @@ class WebRequest {
* @return Mixed
*/
public function getSessionData( $key ) {
- if( !isset( $_SESSION[$key] ) ) {
+ if ( !isset( $_SESSION[$key] ) ) {
return null;
}
return $_SESSION[$key];
@@ -1097,19 +1137,28 @@ HTML;
array_unshift( $ipchain, $ip );
}
- # Step through XFF list and find the last address in the list which is a trusted server
- # Set $ip to the IP address given by that trusted server, unless the address is not sensible (e.g. private)
+ # Step through XFF list and find the last address in the list which is a
+ # trusted server. Set $ip to the IP address given by that trusted server,
+ # unless the address is not sensible (e.g. private). However, prefer private
+ # IP addresses over proxy servers controlled by this site (more sensible).
foreach ( $ipchain as $i => $curIP ) {
- $curIP = IP::canonicalize( $curIP );
- if ( wfIsTrustedProxy( $curIP ) ) {
- if ( isset( $ipchain[$i + 1] ) ) {
- if ( $wgUsePrivateIPs || IP::isPublic( $ipchain[$i + 1 ] ) ) {
- $ip = $ipchain[$i + 1];
+ $curIP = IP::sanitizeIP( IP::canonicalize( $curIP ) );
+ if ( wfIsTrustedProxy( $curIP ) && isset( $ipchain[$i + 1] ) ) {
+ if ( wfIsConfiguredProxy( $curIP ) || // bug 48919; treat IP as sane
+ IP::isPublic( $ipchain[$i + 1] ) ||
+ $wgUsePrivateIPs
+ ) {
+ $nextIP = IP::canonicalize( $ipchain[$i + 1] );
+ if ( !$nextIP && wfIsConfiguredProxy( $ip ) ) {
+ // We have not yet made it past CDN/proxy servers of this site,
+ // so either they are misconfigured or there is some IP spoofing.
+ throw new MWException( "Invalid IP given in XFF '$forwardedFor'." );
}
+ $ip = $nextIP;
+ continue;
}
- } else {
- break;
}
+ break;
}
}
@@ -1117,7 +1166,7 @@ HTML;
wfRunHooks( 'GetIP', array( &$ip ) );
if ( !$ip ) {
- throw new MWException( "Unable to determine IP" );
+ throw new MWException( "Unable to determine IP." );
}
wfDebug( "IP: $ip\n" );
@@ -1266,13 +1315,13 @@ class FauxRequest extends WebRequest {
* @throws MWException
*/
public function __construct( $data = array(), $wasPosted = false, $session = null ) {
- if( is_array( $data ) ) {
+ if ( is_array( $data ) ) {
$this->data = $data;
} else {
throw new MWException( "FauxRequest() got bogus data" );
}
$this->wasPosted = $wasPosted;
- if( $session ) {
+ if ( $session ) {
$this->session = $session;
}
}
@@ -1337,10 +1386,11 @@ class FauxRequest extends WebRequest {
}
/**
- * @param $name
+ * @param string $name The name of the header to get (case insensitive).
* @return bool|string
*/
public function getHeader( $name ) {
+ $name = strtoupper( $name );
return isset( $this->headers[$name] ) ? $this->headers[$name] : false;
}
@@ -1349,6 +1399,7 @@ class FauxRequest extends WebRequest {
* @param $val string
*/
public function setHeader( $name, $val ) {
+ $name = strtoupper( $name );
$this->headers[$name] = $val;
}
@@ -1357,7 +1408,7 @@ class FauxRequest extends WebRequest {
* @return mixed
*/
public function getSessionData( $key ) {
- if( isset( $this->session[$key] ) ) {
+ if ( isset( $this->session[$key] ) ) {
return $this->session[$key];
}
return null;
@@ -1387,6 +1438,30 @@ class FauxRequest extends WebRequest {
}
/**
+ * FauxRequests shouldn't depend on raw request data (but that could be implemented here)
+ * @return String
+ */
+ public function getRawQueryString() {
+ return '';
+ }
+
+ /**
+ * FauxRequests shouldn't depend on raw request data (but that could be implemented here)
+ * @return String
+ */
+ public function getRawPostString() {
+ return '';
+ }
+
+ /**
+ * FauxRequests shouldn't depend on raw request data (but that could be implemented here)
+ * @return String
+ */
+ public function getRawInput() {
+ return '';
+ }
+
+ /**
* @param array $extWhitelist
* @return bool
*/
diff --git a/includes/WebResponse.php b/includes/WebResponse.php
index 8e15d712..ab7524c2 100644
--- a/includes/WebResponse.php
+++ b/includes/WebResponse.php
@@ -42,56 +42,81 @@ class WebResponse {
* Set the browser cookie
* @param string $name name of cookie
* @param string $value value to give cookie
- * @param int $expire Unix timestamp (in seconds) when the cookie should expire.
+ * @param int|null $expire Unix timestamp (in seconds) when the cookie should expire.
* 0 (the default) causes it to expire $wgCookieExpiration seconds from now.
- * @param string $prefix Prefix to use, if not $wgCookiePrefix (use '' for no prefix)
- * @param string $domain Cookie domain to use, if not $wgCookieDomain
- * @param $forceSecure Bool:
- * true: force the cookie to be set with the secure attribute
- * false: force the cookie to be set without the secure attribute
- * null: use the value from $wgCookieSecure
+ * null causes it to be a session cookie.
+ * @param array $options Assoc of additional cookie options:
+ * prefix: string, name prefix ($wgCookiePrefix)
+ * domain: string, cookie domain ($wgCookieDomain)
+ * path: string, cookie path ($wgCookiePath)
+ * secure: bool, secure attribute ($wgCookieSecure)
+ * httpOnly: bool, httpOnly attribute ($wgCookieHttpOnly)
+ * raw: bool, if true uses PHP's setrawcookie() instead of setcookie()
+ * For backwards compatability, if $options is not an array then it and
+ * the following two parameters will be interpreted as values for
+ * 'prefix', 'domain', and 'secure'
+ * @since 1.22 Replaced $prefix, $domain, and $forceSecure with $options
*/
- public function setcookie( $name, $value, $expire = 0, $prefix = null, $domain = null, $forceSecure = null ) {
+ public function setcookie( $name, $value, $expire = 0, $options = null ) {
global $wgCookiePath, $wgCookiePrefix, $wgCookieDomain;
global $wgCookieSecure, $wgCookieExpiration, $wgCookieHttpOnly;
- if ( $expire == 0 ) {
- $expire = time() + $wgCookieExpiration;
- }
- if( $prefix === null ) {
- $prefix = $wgCookiePrefix;
+
+ if ( !is_array( $options ) ) {
+ // Backwards compatability
+ $options = array( 'prefix' => $options );
+ if ( func_num_args() >= 5 ) {
+ $options['domain'] = func_get_arg( 4 );
+ }
+ if ( func_num_args() >= 6 ) {
+ $options['secure'] = func_get_arg( 5 );
+ }
}
- if( $domain === null ) {
- $domain = $wgCookieDomain;
+ $options = array_filter( $options, function ( $a ) {
+ return $a !== null;
+ } ) + array(
+ 'prefix' => $wgCookiePrefix,
+ 'domain' => $wgCookieDomain,
+ 'path' => $wgCookiePath,
+ 'secure' => $wgCookieSecure,
+ 'httpOnly' => $wgCookieHttpOnly,
+ 'raw' => false,
+ );
+
+ if ( $expire === null ) {
+ $expire = 0; // Session cookie
+ } elseif ( $expire == 0 && $wgCookieExpiration != 0 ) {
+ $expire = time() + $wgCookieExpiration;
}
- if ( is_null( $forceSecure ) ) {
- $secureCookie = $wgCookieSecure;
- } else {
- $secureCookie = $forceSecure;
+ // Don't mark the cookie as httpOnly if the requesting user-agent is
+ // known to have trouble with httpOnly cookies.
+ if ( !wfHttpOnlySafe() ) {
+ $options['httpOnly'] = false;
}
- // Mark the cookie as httpOnly if $wgCookieHttpOnly is true,
- // unless the requesting user-agent is known to have trouble with
- // httpOnly cookies.
- $httpOnlySafe = $wgCookieHttpOnly && wfHttpOnlySafe();
-
- wfDebugLog( 'cookie',
- 'setcookie: "' . implode( '", "',
- array(
- $prefix . $name,
- $value,
- $expire,
- $wgCookiePath,
- $domain,
- $secureCookie,
- $httpOnlySafe ) ) . '"' );
- setcookie( $prefix . $name,
- $value,
- $expire,
- $wgCookiePath,
- $domain,
- $secureCookie,
- $httpOnlySafe );
+ $func = $options['raw'] ? 'setrawcookie' : 'setcookie';
+
+ if ( wfRunHooks( 'WebResponseSetCookie', array( &$name, &$value, &$expire, $options ) ) ) {
+ wfDebugLog( 'cookie',
+ $func . ': "' . implode( '", "',
+ array(
+ $options['prefix'] . $name,
+ $value,
+ $expire,
+ $options['path'],
+ $options['domain'],
+ $options['secure'],
+ $options['httpOnly'] ) ) . '"' );
+
+ call_user_func( $func,
+ $options['prefix'] . $name,
+ $value,
+ $expire,
+ $options['path'],
+ $options['domain'],
+ $options['secure'],
+ $options['httpOnly'] );
+ }
}
}
@@ -116,7 +141,9 @@ class FauxResponse extends WebResponse {
} else {
list( $key, $val ) = array_map( 'trim', explode( ":", $string, 2 ) );
- if( $replace || !isset( $this->headers[$key] ) ) {
+ $key = strtoupper( $key );
+
+ if ( $replace || !isset( $this->headers[$key] ) ) {
$this->headers[$key] = $val;
}
}
@@ -127,10 +154,12 @@ class FauxResponse extends WebResponse {
}
/**
- * @param $key string
+ * @param string $key The name of the header to get (case insensitive).
* @return string
*/
public function getheader( $key ) {
+ $key = strtoupper( $key );
+
if ( isset( $this->headers[$key] ) ) {
return $this->headers[$key];
}
@@ -152,11 +181,9 @@ class FauxResponse extends WebResponse {
* @param string $name name of cookie
* @param string $value value to give cookie
* @param int $expire number of seconds til cookie expires (Default: 0)
- * @param $prefix TODO DOCUMENT (Default: null)
- * @param $domain TODO DOCUMENT (Default: null)
- * @param $forceSecure TODO DOCUMENT (Default: null)
+ * @param array $options ignored
*/
- public function setcookie( $name, $value, $expire = 0, $prefix = null, $domain = null, $forceSecure = null ) {
+ public function setcookie( $name, $value, $expire = 0, $options = null ) {
$this->cookies[$name] = $value;
}
diff --git a/includes/WebStart.php b/includes/WebStart.php
index e6f31355..58c953af 100644
--- a/includes/WebStart.php
+++ b/includes/WebStart.php
@@ -48,7 +48,7 @@ if ( ini_get( 'register_globals' ) ) {
'HTTP_SESSION_VARS'
);
foreach ( $_REQUEST as $name => $value ) {
- if( in_array( $name, $verboten ) ) {
+ if ( in_array( $name, $verboten ) ) {
header( "HTTP/1.1 500 Internal Server Error" );
echo "register_globals security paranoia: trying to overwrite superglobals, aborting.";
die( -1 );
@@ -84,62 +84,56 @@ define( 'MEDIAWIKI', true );
# if we don't have permissions on parent directories.
$IP = getenv( 'MW_INSTALL_PATH' );
if ( $IP === false ) {
- if( realpath( '.' ) ) {
+ if ( realpath( '.' ) ) {
$IP = realpath( '.' );
} else {
$IP = dirname( __DIR__ );
}
}
-if ( isset( $_SERVER['MW_COMPILED'] ) ) {
- define( 'MW_COMPILED', 1 );
-} else {
- # Get MWInit class
- require_once( "$IP/includes/Init.php" );
-
- # Start the autoloader, so that extensions can derive classes from core files
- require_once( "$IP/includes/AutoLoader.php" );
+# Start the autoloader, so that extensions can derive classes from core files
+require_once "$IP/includes/AutoLoader.php";
- # Load the profiler
- require_once( "$IP/includes/profiler/Profiler.php" );
+# Load the profiler
+require_once "$IP/includes/profiler/Profiler.php";
- # Load up some global defines.
- require_once( "$IP/includes/Defines.php" );
-}
+# Load up some global defines.
+require_once "$IP/includes/Defines.php";
# Start the profiler
$wgProfiler = array();
if ( file_exists( "$IP/StartProfiler.php" ) ) {
- require( "$IP/StartProfiler.php" );
+ require "$IP/StartProfiler.php";
}
wfProfileIn( 'WebStart.php-conf' );
# Load default settings
-require_once( MWInit::compiledPath( "includes/DefaultSettings.php" ) );
+require_once "$IP/includes/DefaultSettings.php";
+
+# Load composer's autoloader if present
+if ( is_readable( "$IP/vendor/autoload.php" ) ) {
+ require_once "$IP/vendor/autoload.php";
+}
if ( defined( 'MW_CONFIG_CALLBACK' ) ) {
# Use a callback function to configure MediaWiki
- MWFunction::call( MW_CONFIG_CALLBACK );
+ call_user_func( MW_CONFIG_CALLBACK );
} else {
if ( !defined( 'MW_CONFIG_FILE' ) ) {
- define( 'MW_CONFIG_FILE', MWInit::interpretedPath( 'LocalSettings.php' ) );
+ 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" );
+ 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( MW_CONFIG_FILE );
-}
-
-if ( $wgEnableSelenium ) {
- require_once( MWInit::compiledPath( "includes/SeleniumWebSettings.php" ) );
+ require_once MW_CONFIG_FILE;
}
wfProfileOut( 'WebStart.php-conf' );
@@ -150,13 +144,11 @@ wfProfileIn( 'WebStart.php-ob_start' );
# 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 ) {
- if ( !defined( 'MW_COMPILED' ) ) {
- require_once( "$IP/includes/OutputHandler.php" );
- }
+ require_once "$IP/includes/OutputHandler.php";
ob_start( 'wfOutputHandler' );
}
wfProfileOut( 'WebStart.php-ob_start' );
if ( !defined( 'MW_NO_SETUP' ) ) {
- require_once( MWInit::compiledPath( "includes/Setup.php" ) );
+ require_once "$IP/includes/Setup.php";
}
diff --git a/includes/Wiki.php b/includes/Wiki.php
index f8f699c9..ae75bf33 100644
--- a/includes/Wiki.php
+++ b/includes/Wiki.php
@@ -85,8 +85,6 @@ class MediaWiki {
} 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();
} else {
$ret = Title::newFromURL( $title );
// Alias NS_MEDIA page URLs to NS_FILE...we only use NS_MEDIA
@@ -102,8 +100,12 @@ class MediaWiki {
$wgContLang->findVariantLink( $title, $ret );
}
}
- // For non-special titles, check for implicit titles
- if ( is_null( $ret ) || !$ret->isSpecialPage() ) {
+
+ // If title is not provided, always allow oldid and diff to set the title.
+ // If title is provided, allow oldid and diff to override the title, unless
+ // we are talking about a special page which might use these parameters for
+ // other purposes.
+ if ( $ret === null || !$ret->isSpecialPage() ) {
// We can have urls with just ?diff=,?oldid= or even just ?diff=
$oldid = $request->getInt( 'oldid' );
$oldid = $oldid ? $oldid : $request->getInt( 'diff' );
@@ -114,6 +116,11 @@ class MediaWiki {
}
}
+ // Use the main page as default title if nothing else has been provided
+ if ( $ret === null && strval( $title ) === '' && $action !== 'delete' ) {
+ $ret = Title::newMainPage();
+ }
+
if ( $ret === null || ( $ret->getDBkey() == '' && $ret->getInterwiki() == '' ) ) {
$ret = SpecialPage::getTitleFor( 'Badtitle' );
}
@@ -126,7 +133,7 @@ class MediaWiki {
* @return Title
*/
public function getTitle() {
- if( $this->context->getTitle() === null ) {
+ if ( $this->context->getTitle() === null ) {
$this->context->setTitle( $this->parseTitle() );
}
return $this->context->getTitle();
@@ -227,7 +234,7 @@ class MediaWiki {
if ( $title->getInterwiki() != '' ) {
$rdfrom = $request->getVal( 'rdfrom' );
if ( $rdfrom ) {
- $url = $title->getFullURL( 'rdfrom=' . urlencode( $rdfrom ) );
+ $url = $title->getFullURL( array( 'rdfrom' => $rdfrom ) );
} else {
$query = $request->getValues();
unset( $query['title'] );
@@ -307,7 +314,8 @@ class MediaWiki {
$output->redirect( $article );
} else {
wfProfileOut( __METHOD__ );
- throw new MWException( "Shouldn't happen: MediaWiki::initializeArticle() returned neither an object nor a URL" );
+ throw new MWException( "Shouldn't happen: MediaWiki::initializeArticle()"
+ . " returned neither an object nor a URL" );
}
}
@@ -427,7 +435,8 @@ class MediaWiki {
$act = $this->getAction();
- $action = Action::factory( $act, $page );
+ $action = Action::factory( $act, $page, $this->context );
+
if ( $action instanceof Action ) {
# Let Squid cache things if we can purge them.
if ( $wgUseSquid &&
@@ -480,7 +489,7 @@ class MediaWiki {
$resp->header( 'Retry-After: ' . max( intval( $maxLag ), 5 ) );
$resp->header( 'X-Database-Lag: ' . intval( $lag ) );
$resp->header( 'Content-Type: text/plain' );
- if( $wgShowHostnames ) {
+ if ( $wgShowHostnames ) {
echo "Waiting for $host: $lag seconds lagged\n";
} else {
echo "Waiting for a database server: $lag seconds lagged\n";
@@ -502,23 +511,6 @@ class MediaWiki {
$request = $this->context->getRequest();
- if ( $request->getCookie( 'forceHTTPS' )
- && $request->detectProtocol() == 'http'
- && $request->getMethod() == 'GET'
- ) {
- $redirUrl = $request->getFullRequestURL();
- $redirUrl = str_replace( 'http://', 'https://', $redirUrl );
-
- // Setup dummy Title, otherwise OutputPage::redirect will fail
- $title = Title::newFromText( NS_MAIN, 'REDIR' );
- $this->context->setTitle( $title );
- $output = $this->context->getOutput();
- $output->redirect( $redirUrl );
- $output->output();
- wfProfileOut( __METHOD__ );
- return;
- }
-
// Send Ajax requests to the Ajax dispatcher.
if ( $wgUseAjax && $request->getVal( 'action', 'view' ) == 'ajax' ) {
@@ -539,6 +531,51 @@ class MediaWiki {
$action = $this->getAction();
$wgTitle = $title;
+ // If the user has forceHTTPS set to true, or if the user
+ // is in a group requiring HTTPS, or if they have the HTTPS
+ // preference set, redirect them to HTTPS.
+ // Note: Do this after $wgTitle is setup, otherwise the hooks run from
+ // isLoggedIn() will do all sorts of weird stuff.
+ if (
+ (
+ $request->getCookie( 'forceHTTPS', '' ) ||
+ // check for prefixed version for currently logged in users
+ $request->getCookie( 'forceHTTPS' ) ||
+ // Avoid checking the user and groups unless it's enabled.
+ (
+ $this->context->getUser()->isLoggedIn()
+ && $this->context->getUser()->requiresHTTPS()
+ )
+ ) &&
+ $request->detectProtocol() == 'http'
+ ) {
+ $oldUrl = $request->getFullRequestURL();
+ $redirUrl = str_replace( 'http://', 'https://', $oldUrl );
+
+ if ( $request->wasPosted() ) {
+ // This is weird and we'd hope it almost never happens. This
+ // means that a POST came in via HTTP and policy requires us
+ // redirecting to HTTPS. It's likely such a request is going
+ // to fail due to post data being lost, but let's try anyway
+ // and just log the instance.
+ //
+ // @todo @fixme See if we could issue a 307 or 308 here, need
+ // to see how clients (automated & browser) behave when we do
+ wfDebugLog( 'RedirectedPosts', "Redirected from HTTP to HTTPS: $oldUrl" );
+ }
+
+ // Setup dummy Title, otherwise OutputPage::redirect will fail
+ $title = Title::newFromText( NS_MAIN, 'REDIR' );
+ $this->context->setTitle( $title );
+ $output = $this->context->getOutput();
+ // Since we only do this redir to change proto, always send a vary header
+ $output->addVaryHeader( 'X-Forwarded-Proto' );
+ $output->redirect( $redirUrl );
+ $output->output();
+ wfProfileOut( __METHOD__ );
+ return;
+ }
+
if ( $wgUseFileCache && $title->getNamespace() >= 0 ) {
wfProfileIn( 'main-try-filecache' );
if ( HTMLFileCache::useFileCache( $this->context ) ) {
@@ -599,7 +636,7 @@ class MediaWiki {
* Do a job from the job queue
*/
private function doJobs() {
- global $wgJobRunRate;
+ global $wgJobRunRate, $wgPhpCli, $IP;
if ( $wgJobRunRate <= 0 || wfReadOnly() ) {
return;
@@ -615,23 +652,43 @@ class MediaWiki {
$n = intval( $wgJobRunRate );
}
- $group = JobQueueGroup::singleton();
- do {
- $job = $group->pop( JobQueueGroup::USE_CACHE ); // job from any queue
- if ( $job ) {
- $output = $job->toString() . "\n";
- $t = - microtime( true );
- $success = $job->run();
- $group->ack( $job ); // done
- $t += microtime( true );
- $t = round( $t * 1000 );
- if ( !$success ) {
- $output .= "Error: " . $job->getLastError() . ", Time: $t ms\n";
- } else {
- $output .= "Success, Time: $t ms\n";
- }
- wfDebugLog( 'jobqueue', $output );
+ if ( !wfShellExecDisabled() && is_executable( $wgPhpCli ) ) {
+ // Start a background process to run some of the jobs.
+ // This will be asynchronous on *nix though not on Windows.
+ wfProfileIn( __METHOD__ . '-exec' );
+ $retVal = 1;
+ $cmd = wfShellWikiCmd( "$IP/maintenance/runJobs.php", array( '--maxjobs', $n ) );
+ wfShellExec( "$cmd &", $retVal );
+ wfProfileOut( __METHOD__ . '-exec' );
+ } else {
+ try {
+ // Fallback to running the jobs here while the user waits
+ $group = JobQueueGroup::singleton();
+ do {
+ $job = $group->pop( JobQueueGroup::USE_CACHE ); // job from any queue
+ if ( $job ) {
+ $output = $job->toString() . "\n";
+ $t = - microtime( true );
+ wfProfileIn( __METHOD__ . '-' . get_class( $job ) );
+ $success = $job->run();
+ wfProfileOut( __METHOD__ . '-' . get_class( $job ) );
+ $group->ack( $job ); // done
+ $t += microtime( true );
+ $t = round( $t * 1000 );
+ if ( $success === false ) {
+ $output .= "Error: " . $job->getLastError() . ", Time: $t ms\n";
+ } else {
+ $output .= "Success, Time: $t ms\n";
+ }
+ wfDebugLog( 'jobqueue', $output );
+ }
+ } while ( --$n && $job );
+ } catch ( MWException $e ) {
+ // We don't want exceptions thrown during job execution to
+ // be reported to the user since the output is already sent.
+ // Instead we just log them.
+ MWExceptionHandler::logException( $e );
}
- } while ( --$n && $job );
+ }
}
}
diff --git a/includes/WikiError.php b/includes/WikiError.php
index 62781213..08eb8004 100644
--- a/includes/WikiError.php
+++ b/includes/WikiError.php
@@ -143,7 +143,7 @@ class WikiXmlError extends WikiError {
}
function _extractContext( $context, $offset ) {
- if( is_null( $context ) ) {
+ if ( is_null( $context ) ) {
return null;
} else {
// Hopefully integer overflow will be handled transparently here
diff --git a/includes/WikiFilePage.php b/includes/WikiFilePage.php
index 5e603d37..fe1ff88a 100644
--- a/includes/WikiFilePage.php
+++ b/includes/WikiFilePage.php
@@ -183,6 +183,10 @@ class WikiFilePage extends WikiPage {
// to be updated (in case the cached information is wrong)
$this->mFile->purgeCache( array( 'forThumbRefresh' => true ) );
}
+ if ( $this->mRepo ) {
+ // Purge redirect cache
+ $this->mRepo->invalidateImageRedirect( $this->mTitle );
+ }
return parent::doPurge();
}
}
diff --git a/includes/WikiMap.php b/includes/WikiMap.php
index b04a7842..da4416de 100644
--- a/includes/WikiMap.php
+++ b/includes/WikiMap.php
@@ -37,13 +37,18 @@ class WikiMap {
$wgConf->loadFullData();
list( $major, $minor ) = $wgConf->siteFromDB( $wikiID );
- if( $major === null ) {
+ if ( $major === null ) {
return null;
}
- $canonicalServer = $wgConf->get( 'wgCanonicalServer', $wikiID, $major,
- array( 'lang' => $minor, 'site' => $major ) );
$server = $wgConf->get( 'wgServer', $wikiID, $major,
array( 'lang' => $minor, 'site' => $major ) );
+
+ $canonicalServer = $wgConf->get( 'wgCanonicalServer', $wikiID, $major,
+ array( 'lang' => $minor, 'site' => $major ) );
+ if ( $canonicalServer === false || $canonicalServer === null ) {
+ $canonicalServer = $server;
+ }
+
$path = $wgConf->get( 'wgArticlePath', $wikiID, $major,
array( 'lang' => $minor, 'site' => $major ) );
return new WikiReference( $major, $minor, $canonicalServer, $path, $server );
@@ -73,7 +78,7 @@ class WikiMap {
* @param string $text link's text; optional, default to "User:$user"
* @return String: HTML link or false if the wiki was not found
*/
- public static function foreignUserLink( $wikiID, $user, $text=null ) {
+ public static function foreignUserLink( $wikiID, $user, $text = null ) {
return self::makeForeignLink( $wikiID, "User:$user", $text );
}
@@ -85,7 +90,7 @@ class WikiMap {
* @param string $text link's text; optional, default to $page
* @return String: HTML link or false if the wiki was not found
*/
- public static function makeForeignLink( $wikiID, $page, $text=null ) {
+ public static function makeForeignLink( $wikiID, $page, $text = null ) {
if ( !$text ) {
$text = $page;
}
@@ -211,15 +216,14 @@ class WikiReference {
}
/**
- * Get a URL based on $wgServer, like Title::getFullUrl() would produce
+ * Get a URL based on $wgServer, like Title::getFullURL() would produce
* when called locally on the wiki.
*
* @param string $page page name (must be normalized before calling this function!)
* @return String: URL
*/
public function getFullUrl( $page ) {
- return
- $this->mServer .
+ return $this->mServer .
$this->getLocalUrl( $page );
}
}
diff --git a/includes/WikiPage.php b/includes/WikiPage.php
index de881ef6..7c3dc937 100644
--- a/includes/WikiPage.php
+++ b/includes/WikiPage.php
@@ -23,7 +23,8 @@
/**
* Abstract class for type hinting (accepts WikiPage, Article, ImagePage, CategoryPage)
*/
-interface Page {}
+interface Page {
+}
/**
* Class representing a MediaWiki article and history.
@@ -51,6 +52,11 @@ class WikiPage implements Page, IDBAccessObject {
/**@}}*/
/**
+ * @var int
+ */
+ protected $mId = null;
+
+ /**
* @var int; one of the READ_* constants
*/
protected $mDataLoadedFrom = self::READ_NONE;
@@ -182,7 +188,7 @@ class WikiPage implements Page, IDBAccessObject {
* (and only when) $wgActions[$action] === true. This allows subclasses
* to override the default behavior.
*
- * @todo: move this UI stuff somewhere else
+ * @todo Move this UI stuff somewhere else
*
* @return Array
*/
@@ -228,6 +234,7 @@ class WikiPage implements Page, IDBAccessObject {
* @return void
*/
protected function clearCacheFields() {
+ $this->mId = null;
$this->mCounter = null;
$this->mRedirectTarget = null; // Title object if set
$this->mLastRevision = null; // Latest revision
@@ -299,7 +306,7 @@ class WikiPage implements Page, IDBAccessObject {
public function pageDataFromTitle( $dbr, $title, $options = array() ) {
return $this->pageData( $dbr, array(
'page_namespace' => $title->getNamespace(),
- 'page_title' => $title->getDBkey() ), $options );
+ 'page_title' => $title->getDBkey() ), $options );
}
/**
@@ -381,10 +388,11 @@ class WikiPage implements Page, IDBAccessObject {
// Old-fashioned restrictions
$this->mTitle->loadRestrictions( $data->page_restrictions );
- $this->mCounter = intval( $data->page_counter );
- $this->mTouched = wfTimestamp( TS_MW, $data->page_touched );
- $this->mIsRedirect = intval( $data->page_is_redirect );
- $this->mLatest = intval( $data->page_latest );
+ $this->mId = intval( $data->page_id );
+ $this->mCounter = intval( $data->page_counter );
+ $this->mTouched = wfTimestamp( TS_MW, $data->page_touched );
+ $this->mIsRedirect = intval( $data->page_is_redirect );
+ $this->mLatest = intval( $data->page_latest );
// Bug 37225: $latest may no longer match the cached latest Revision object.
// Double-check the ID of any cached latest Revision object for consistency.
if ( $this->mLastRevision && $this->mLastRevision->getId() != $this->mLatest ) {
@@ -397,6 +405,8 @@ class WikiPage implements Page, IDBAccessObject {
$this->mTitle->loadFromRow( false );
$this->clearCacheFields();
+
+ $this->mId = 0;
}
$this->mDataLoaded = true;
@@ -407,14 +417,20 @@ class WikiPage implements Page, IDBAccessObject {
* @return int Page ID
*/
public function getId() {
- return $this->mTitle->getArticleID();
+ if ( !$this->mDataLoaded ) {
+ $this->loadPageData();
+ }
+ return $this->mId;
}
/**
* @return bool Whether or not the page exists in the database
*/
public function exists() {
- return $this->mTitle->exists();
+ if ( !$this->mDataLoaded ) {
+ $this->loadPageData();
+ }
+ return $this->mId > 0;
}
/**
@@ -426,7 +442,7 @@ class WikiPage implements Page, IDBAccessObject {
* @return bool
*/
public function hasViewableContent() {
- return $this->mTitle->exists() || $this->mTitle->isAlwaysKnown();
+ return $this->exists() || $this->mTitle->isAlwaysKnown();
}
/**
@@ -447,7 +463,9 @@ class WikiPage implements Page, IDBAccessObject {
*/
public function isRedirect() {
$content = $this->getContent();
- if ( !$content ) return false;
+ if ( !$content ) {
+ return false;
+ }
return $content->isRedirect();
}
@@ -524,6 +542,7 @@ class WikiPage implements Page, IDBAccessObject {
$db = wfGetDB( DB_SLAVE );
$revSelectFields = Revision::selectFields();
+ $row = null;
while ( $continue ) {
$row = $db->selectRow(
array( 'page', 'revision' ),
@@ -631,7 +650,7 @@ class WikiPage implements Page, IDBAccessObject {
* @return String|false The text of the current revision
* @deprecated as of 1.21, getContent() should be used instead.
*/
- public function getText( $audience = Revision::FOR_PUBLIC, User $user = null ) { // @todo: deprecated, replace usage!
+ public function getText( $audience = Revision::FOR_PUBLIC, User $user = null ) { // @todo deprecated, replace usage!
ContentHandler::deprecated( __METHOD__, '1.21' );
$this->loadLastEdit();
@@ -782,7 +801,7 @@ class WikiPage implements Page, IDBAccessObject {
public function setCachedLastEditTime( $timestamp ) {
global $wgMemc;
$key = wfMemcKey( 'page-lastedit', md5( $this->mTitle->getPrefixedDBkey() ) );
- $wgMemc->set( $key, wfTimestamp( TS_MW, $timestamp ), 60*15 );
+ $wgMemc->set( $key, wfTimestamp( TS_MW, $timestamp ), 60 * 15 );
}
/**
@@ -891,10 +910,10 @@ class WikiPage implements Page, IDBAccessObject {
$dbw = wfGetDB( DB_MASTER );
$dbw->replace( 'redirect', array( 'rd_from' ),
array(
- 'rd_from' => $this->getId(),
+ 'rd_from' => $this->getId(),
'rd_namespace' => $rt->getNamespace(),
- 'rd_title' => $rt->getDBkey(),
- 'rd_fragment' => $rt->getFragment(),
+ 'rd_title' => $rt->getDBkey(),
+ 'rd_fragment' => $rt->getFragment(),
'rd_interwiki' => $rt->getInterwiki(),
),
__METHOD__
@@ -929,7 +948,7 @@ class WikiPage implements Page, IDBAccessObject {
// This can be hard to reverse and may produce loops,
// so they may be disabled in the site configuration.
$source = $this->mTitle->getFullURL( 'redirect=no' );
- return $rt->getFullURL( 'rdfrom=' . urlencode( $source ) );
+ return $rt->getFullURL( array( 'rdfrom' => $source ) );
} else {
// External pages pages without "local" bit set are not valid
// redirect targets
@@ -1006,8 +1025,8 @@ class WikiPage implements Page, IDBAccessObject {
/**
* Get the last N authors
- * @param $num Integer: number of revisions to get
- * @param string $revLatest the latest rev_id, selected from the master (optional)
+ * @param int $num Number of revisions to get
+ * @param int|string $revLatest the latest rev_id, selected from the master (optional)
* @return array Array of authors, duplicates not removed
*/
public function getLastNAuthors( $num, $revLatest = 0 ) {
@@ -1068,7 +1087,7 @@ class WikiPage implements Page, IDBAccessObject {
return $wgEnableParserCache
&& $parserOptions->getStubThreshold() == 0
- && $this->mTitle->exists()
+ && $this->exists()
&& ( $oldid === null || $oldid === 0 || $oldid === $this->getLatest() )
&& $this->getContentHandler()->isParserCacheSupported();
}
@@ -1078,8 +1097,8 @@ class WikiPage implements Page, IDBAccessObject {
* The parser cache will be used if possible.
*
* @since 1.19
- * @param $parserOptions ParserOptions to use for the parse operation
- * @param $oldid Revision ID to get the text from, passing null or 0 will
+ * @param ParserOptions $parserOptions ParserOptions to use for the parse operation
+ * @param null|int $oldid Revision ID to get the text from, passing null or 0 will
* get the current revision (default value)
*
* @return ParserOutput or false if the revision was not found
@@ -1124,7 +1143,7 @@ class WikiPage implements Page, IDBAccessObject {
}
// Don't update page view counters on views from bot users (bug 14044)
- if ( !$wgDisableCounters && !$user->isAllowed( 'bot' ) && $this->mTitle->exists() ) {
+ if ( !$wgDisableCounters && !$user->isAllowed( 'bot' ) && $this->exists() ) {
DeferredUpdates::addUpdate( new ViewCountUpdate( $this->getId() ) );
DeferredUpdates::addUpdate( new SiteStatsUpdate( 1, 0, 0 ) );
}
@@ -1140,13 +1159,12 @@ class WikiPage implements Page, IDBAccessObject {
public function doPurge() {
global $wgUseSquid;
- if( !wfRunHooks( 'ArticlePurge', array( &$this ) ) ) {
+ if ( !wfRunHooks( 'ArticlePurge', array( &$this ) ) ) {
return false;
}
// Invalidate the cache
$this->mTitle->invalidateCache();
- $this->clear();
if ( $wgUseSquid ) {
// Commit the transaction before the purge is sent
@@ -1159,16 +1177,18 @@ class WikiPage implements Page, IDBAccessObject {
}
if ( $this->mTitle->getNamespace() == NS_MEDIAWIKI ) {
- // @todo: move this logic to MessageCache
+ // @todo move this logic to MessageCache
- if ( $this->mTitle->exists() ) {
+ if ( $this->exists() ) {
// NOTE: use transclusion text for messages.
// This is consistent with MessageCache::getMsgFromNamespace()
$content = $this->getContent();
$text = $content === null ? null : $content->getWikitextForTransclusion();
- if ( $text === null ) $text = false;
+ if ( $text === null ) {
+ $text = false;
+ }
} else {
$text = false;
}
@@ -1210,6 +1230,7 @@ class WikiPage implements Page, IDBAccessObject {
if ( $affected ) {
$newid = $dbw->insertId();
+ $this->mId = $newid;
$this->mTitle->resetArticleID( $newid );
}
wfProfileOut( __METHOD__ );
@@ -1258,7 +1279,7 @@ class WikiPage implements Page, IDBAccessObject {
);
if ( $wgContentHandlerUseDB ) {
- $row[ 'page_content_model' ] = $revision->getContentModel();
+ $row['page_content_model'] = $revision->getContentModel();
}
$dbw->update( 'page',
@@ -1436,12 +1457,12 @@ class WikiPage implements Page, IDBAccessObject {
}
/**
- * Returns true iff this page's content model supports sections.
+ * Returns true if this page's content model supports sections.
*
* @return boolean whether sections are supported.
*
- * @todo: the skin should check this and not offer section functionality if sections are not supported.
- * @todo: the EditPage should check this and not offer section functionality if sections are not supported.
+ * @todo The skin should check this and not offer section functionality if sections are not supported.
+ * @todo The EditPage should check this and not offer section functionality if sections are not supported.
*/
public function supportsSections() {
return $this->getContentHandler()->supportsSections();
@@ -1466,6 +1487,7 @@ class WikiPage implements Page, IDBAccessObject {
$newContent = $sectionContent;
} else {
if ( !$this->supportsSections() ) {
+ wfProfileOut( __METHOD__ );
throw new MWException( "sections not supported for content model " . $this->getContentHandler()->getModelID() );
}
@@ -1507,7 +1529,7 @@ class WikiPage implements Page, IDBAccessObject {
*/
function checkFlags( $flags ) {
if ( !( $flags & EDIT_NEW ) && !( $flags & EDIT_UPDATE ) ) {
- if ( $this->mTitle->getArticleID() ) {
+ if ( $this->exists() ) {
$flags |= EDIT_UPDATE;
} else {
$flags |= EDIT_NEW;
@@ -1602,7 +1624,7 @@ class WikiPage implements Page, IDBAccessObject {
* edit-already-exists error will be returned. These two conditions are also possible with
* auto-detection due to MediaWiki's performance-optimised locking strategy.
*
- * @param bool|\the $baseRevId the revision ID this edit was based off, if any
+ * @param bool|int $baseRevId the revision ID this edit was based off, if any
* @param $user User the user doing the edit
* @param $serialisation_format String: format for storing the content in the database
*
@@ -1682,12 +1704,18 @@ class WikiPage implements Page, IDBAccessObject {
// Provide autosummaries if one is not provided and autosummaries are enabled.
if ( $wgUseAutomaticEditSummaries && $flags & EDIT_AUTOSUMMARY && $summary == '' ) {
- if ( !$old_content ) $old_content = null;
+ if ( !$old_content ) {
+ $old_content = null;
+ }
$summary = $handler->getAutosummary( $old_content, $content, $flags );
}
$editInfo = $this->prepareContentForEdit( $content, null, $user, $serialisation_format );
$serialized = $editInfo->pst;
+
+ /**
+ * @var Content $content
+ */
$content = $editInfo->pstContent;
$newsize = $content->getSize();
@@ -1731,6 +1759,7 @@ class WikiPage implements Page, IDBAccessObject {
if ( $changed ) {
if ( !$content->isValid() ) {
+ wfProfileOut( __METHOD__ );
throw new MWException( "New content failed validity check!" );
}
@@ -1933,7 +1962,7 @@ class WikiPage implements Page, IDBAccessObject {
$options = $this->getContentHandler()->makeParserOptions( $context );
if ( $this->getTitle()->isConversionTable() ) {
- //@todo: ConversionTable should become a separate content model, so we don't need special cases like this one.
+ // @todo ConversionTable should become a separate content model, so we don't need special cases like this one.
$options->disableContentConversion();
}
@@ -1956,16 +1985,18 @@ class WikiPage implements Page, IDBAccessObject {
* Prepare content which is about to be saved.
* Returns a stdclass with source, pst and output members
*
- * @param \Content $content
- * @param null $revid
- * @param null|\User $user
- * @param null $serialization_format
+ * @param Content $content
+ * @param int|null $revid
+ * @param User|null $user
+ * @param string|null $serialization_format
*
* @return bool|object
*
* @since 1.21
*/
- public function prepareContentForEdit( Content $content, $revid = null, User $user = null, $serialization_format = null ) {
+ public function prepareContentForEdit( Content $content, $revid = null, User $user = null,
+ $serialization_format = null
+ ) {
global $wgContLang, $wgUser;
$user = is_null( $user ) ? $wgUser : $user;
//XXX: check $user->getId() here???
@@ -2030,7 +2061,8 @@ class WikiPage implements Page, IDBAccessObject {
$content = $revision->getContent();
// Parse the text
- // Be careful not to double-PST: $text is usually already PST-ed once
+ // Be careful not to do pre-save transform twice: $text is usually
+ // already pre-save transformed once.
if ( !$this->mPreparedEdit || $this->mPreparedEdit->output->getFlag( 'vary-revision' ) ) {
wfDebug( __METHOD__ . ": No prepared edit or vary-revision is set...\n" );
$editInfo = $this->prepareContentForEdit( $content, $revision->getId(), $user );
@@ -2047,7 +2079,9 @@ class WikiPage implements Page, IDBAccessObject {
// Update the links tables and other secondary data
if ( $content ) {
- $updates = $content->getSecondaryDataUpdates( $this->getTitle(), null, true, $editInfo->output );
+ $recursive = $options['changed']; // bug 50785
+ $updates = $content->getSecondaryDataUpdates(
+ $this->getTitle(), null, $recursive, $editInfo->output );
DataUpdate::runUpdates( $updates );
}
@@ -2057,19 +2091,11 @@ class WikiPage implements Page, IDBAccessObject {
if ( 0 == mt_rand( 0, 99 ) ) {
// 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 );
- $dbw->delete(
- 'recentchanges',
- array( 'rc_timestamp < ' . $dbw->addQuotes( $cutoff ) ),
- __METHOD__
- );
+ RecentChange::purgeExpiredChanges();
}
}
- if ( !$this->mTitle->exists() ) {
+ if ( !$this->exists() ) {
wfProfileOut( __METHOD__ );
return;
}
@@ -2093,8 +2119,7 @@ class WikiPage implements Page, IDBAccessObject {
}
DeferredUpdates::addUpdate( new SiteStatsUpdate( 0, 1, $good, $total ) );
- DeferredUpdates::addUpdate( new SearchUpdate( $id, $title, $content->getTextForSearchIndex() ) );
- // @TODO: let the search engine decide what to do with the content object
+ DeferredUpdates::addUpdate( new SearchUpdate( $id, $title, $content ) );
// If this is another user's talk page, update newtalk.
// Don't do this if $options['changed'] = false (null-edits) nor if
@@ -2104,17 +2129,20 @@ class WikiPage implements Page, IDBAccessObject {
&& $shortTitle != $user->getTitleKey()
&& !( $revision->isMinor() && $user->isAllowed( 'nominornewtalk' ) )
) {
- if ( wfRunHooks( 'ArticleEditUpdateNewTalk', array( &$this ) ) ) {
- $other = User::newFromName( $shortTitle, false );
- if ( !$other ) {
- wfDebug( __METHOD__ . ": invalid username\n" );
- } elseif ( User::isIP( $shortTitle ) ) {
- // An anonymous user
- $other->setNewtalk( true, $revision );
- } elseif ( $other->isLoggedIn() ) {
- $other->setNewtalk( true, $revision );
- } else {
- wfDebug( __METHOD__ . ": don't need to notify a nonexistent user\n" );
+ $recipient = User::newFromName( $shortTitle, false );
+ if ( !$recipient ) {
+ wfDebug( __METHOD__ . ": invalid username\n" );
+ } else {
+ // Allow extensions to prevent user notification when a new message is added to their talk page
+ if ( wfRunHooks( 'ArticleEditUpdateNewTalk', array( &$this, $recipient ) ) ) {
+ if ( User::isIP( $shortTitle ) ) {
+ // An anonymous user
+ $recipient->setNewtalk( true, $revision );
+ } elseif ( $recipient->isLoggedIn() ) {
+ $recipient->setNewtalk( true, $revision );
+ } else {
+ wfDebug( __METHOD__ . ": don't need to notify a nonexistent user\n" );
+ }
}
}
}
@@ -2122,12 +2150,14 @@ class WikiPage implements Page, IDBAccessObject {
if ( $this->mTitle->getNamespace() == NS_MEDIAWIKI ) {
// XXX: could skip pseudo-messages like js/css here, based on content model.
$msgtext = $content ? $content->getWikitextForTransclusion() : null;
- if ( $msgtext === false || $msgtext === null ) $msgtext = '';
+ if ( $msgtext === false || $msgtext === null ) {
+ $msgtext = '';
+ }
MessageCache::singleton()->replace( $shortTitle, $msgtext );
}
- if( $options['created'] ) {
+ if ( $options['created'] ) {
self::onArticleCreate( $this->mTitle );
} else {
self::onArticleEdit( $this->mTitle );
@@ -2152,7 +2182,7 @@ class WikiPage implements Page, IDBAccessObject {
ContentHandler::deprecated( __METHOD__, "1.21" );
$content = ContentHandler::makeContent( $text, $this->getTitle() );
- return $this->doQuickEditContent( $content, $user, $comment, $minor );
+ $this->doQuickEditContent( $content, $user, $comment, $minor );
}
/**
@@ -2160,13 +2190,15 @@ class WikiPage implements Page, IDBAccessObject {
* The article must already exist; link tables etc
* are not updated, caches are not flushed.
*
- * @param $content Content: content submitted
- * @param $user User The relevant user
+ * @param Content $content Content submitted
+ * @param User $user The relevant user
* @param string $comment comment submitted
- * @param $serialisation_format String: format for storing the content in the database
- * @param $minor Boolean: whereas it's a minor modification
+ * @param string $serialisation_format Format for storing the content in the database
+ * @param bool $minor Whereas it's a minor modification
*/
- public function doQuickEditContent( Content $content, User $user, $comment = '', $minor = 0, $serialisation_format = null ) {
+ public function doQuickEditContent( Content $content, User $user, $comment = '', $minor = false,
+ $serialisation_format = null
+ ) {
wfProfileIn( __METHOD__ );
$serialized = $content->serialize( $serialisation_format );
@@ -2193,14 +2225,14 @@ class WikiPage implements Page, IDBAccessObject {
* This works for protection both existing and non-existing pages.
*
* @param array $limit set of restriction keys
- * @param $reason String
- * @param &$cascade Integer. Set to false if cascading protection isn't allowed.
* @param array $expiry per restriction type expiration
- * @param $user User The user updating the restrictions
+ * @param int &$cascade Set to false if cascading protection isn't allowed.
+ * @param string $reason
+ * @param User $user The user updating the restrictions
* @return Status
*/
public function doUpdateRestrictions( array $limit, array $expiry, &$cascade, $reason, User $user ) {
- global $wgContLang;
+ global $wgCascadingRestrictionLevels;
if ( wfReadOnly() ) {
return Status::newFatal( 'readonlytext', wfReadOnlyReason() );
@@ -2208,7 +2240,7 @@ class WikiPage implements Page, IDBAccessObject {
$restrictionTypes = $this->mTitle->getRestrictionTypes();
- $id = $this->mTitle->getArticleID();
+ $id = $this->getId();
if ( !$cascade ) {
$cascade = false;
@@ -2273,65 +2305,40 @@ class WikiPage implements Page, IDBAccessObject {
$logAction = 'protect';
}
- $encodedExpiry = array();
- $protectDescription = '';
- # Some bots may parse IRC lines, which are generated from log entries which contain plain
- # protect description text. Keep them in old format to avoid breaking compatibility.
- # TODO: Fix protection log to store structured description and format it on-the-fly.
- $protectDescriptionLog = '';
- foreach ( $limit as $action => $restrictions ) {
- $encodedExpiry[$action] = $dbw->encodeExpiry( $expiry[$action] );
- if ( $restrictions != '' ) {
- $protectDescriptionLog .= $wgContLang->getDirMark() . "[$action=$restrictions] (";
- # $action is one of $wgRestrictionTypes = array( 'create', 'edit', 'move', 'upload' ).
- # All possible message keys are listed here for easier grepping:
- # * restriction-create
- # * restriction-edit
- # * restriction-move
- # * restriction-upload
- $actionText = wfMessage( 'restriction-' . $action )->inContentLanguage()->text();
- # $restrictions is one of $wgRestrictionLevels = array( '', 'autoconfirmed', 'sysop' ),
- # with '' filtered out. All possible message keys are listed below:
- # * protect-level-autoconfirmed
- # * protect-level-sysop
- $restrictionsText = wfMessage( 'protect-level-' . $restrictions )->inContentLanguage()->text();
- if ( $encodedExpiry[$action] != 'infinity' ) {
- $expiryText = wfMessage(
- 'protect-expiring',
- $wgContLang->timeanddate( $expiry[$action], false, false ),
- $wgContLang->date( $expiry[$action], false, false ),
- $wgContLang->time( $expiry[$action], false, false )
- )->inContentLanguage()->text();
- } else {
- $expiryText = wfMessage( 'protect-expiry-indefinite' )
- ->inContentLanguage()->text();
- }
-
- if ( $protectDescription !== '' ) {
- $protectDescription .= wfMessage( 'word-separator' )->inContentLanguage()->text();
- }
- $protectDescription .= wfMessage( 'protect-summary-desc' )
- ->params( $actionText, $restrictionsText, $expiryText )
- ->inContentLanguage()->text();
- $protectDescriptionLog .= $expiryText . ') ';
- }
- }
- $protectDescriptionLog = trim( $protectDescriptionLog );
-
if ( $id ) { // Protection of existing page
if ( !wfRunHooks( 'ArticleProtect', array( &$this, &$user, $limit, $reason ) ) ) {
return Status::newGood();
}
- // Only restrictions with the 'protect' right can cascade...
- // Otherwise, people who cannot normally protect can "protect" pages via transclusion
+ // Only certain restrictions can cascade...
$editrestriction = isset( $limit['edit'] ) ? array( $limit['edit'] ) : $this->mTitle->getRestrictions( 'edit' );
+ foreach ( array_keys( $editrestriction, 'sysop' ) as $key ) {
+ $editrestriction[$key] = 'editprotected'; // backwards compatibility
+ }
+ foreach ( array_keys( $editrestriction, 'autoconfirmed' ) as $key ) {
+ $editrestriction[$key] = 'editsemiprotected'; // backwards compatibility
+ }
+
+ $cascadingRestrictionLevels = $wgCascadingRestrictionLevels;
+ foreach ( array_keys( $cascadingRestrictionLevels, 'sysop' ) as $key ) {
+ $cascadingRestrictionLevels[$key] = 'editprotected'; // backwards compatibility
+ }
+ foreach ( array_keys( $cascadingRestrictionLevels, 'autoconfirmed' ) as $key ) {
+ $cascadingRestrictionLevels[$key] = 'editsemiprotected'; // backwards compatibility
+ }
// The schema allows multiple restrictions
- if ( !in_array( 'protect', $editrestriction ) && !in_array( 'sysop', $editrestriction ) ) {
+ if ( !array_intersect( $editrestriction, $cascadingRestrictionLevels ) ) {
$cascade = false;
}
+ // insert null revision to identify the page protection change as edit summary
+ $latest = $this->getLatest();
+ $nullRevision = $this->insertProtectNullRevision( $revCommentMsg, $limit, $expiry, $cascade, $reason );
+ if ( $nullRevision === null ) {
+ return Status::newFatal( 'no-null-revision', $this->mTitle->getPrefixedText() );
+ }
+
// Update restrictions table
foreach ( $limit as $action => $restrictions ) {
if ( $restrictions != '' ) {
@@ -2340,7 +2347,7 @@ class WikiPage implements Page, IDBAccessObject {
'pr_type' => $action,
'pr_level' => $restrictions,
'pr_cascade' => ( $cascade && $action == 'edit' ) ? 1 : 0,
- 'pr_expiry' => $encodedExpiry[$action]
+ 'pr_expiry' => $dbw->encodeExpiry( $expiry[$action] )
),
__METHOD__
);
@@ -2350,41 +2357,12 @@ class WikiPage implements Page, IDBAccessObject {
}
}
- // Prepare a null revision to be added to the history
- $editComment = $wgContLang->ucfirst(
- wfMessage(
- $revCommentMsg,
- $this->mTitle->getPrefixedText()
- )->inContentLanguage()->text()
- );
- if ( $reason ) {
- $editComment .= wfMessage( 'colon-separator' )->inContentLanguage()->text() . $reason;
- }
- if ( $protectDescription ) {
- $editComment .= wfMessage( 'word-separator' )->inContentLanguage()->text();
- $editComment .= wfMessage( 'parentheses' )->params( $protectDescription )->inContentLanguage()->text();
- }
- if ( $cascade ) {
- $editComment .= wfMessage( 'word-separator' )->inContentLanguage()->text();
- $editComment .= wfMessage( 'brackets' )->params(
- wfMessage( 'protect-summary-cascade' )->inContentLanguage()->text()
- )->inContentLanguage()->text();
- }
-
- // Insert a null revision
- $nullRevision = Revision::newNullRevision( $dbw, $id, $editComment, true );
- $nullRevId = $nullRevision->insertOn( $dbw );
-
- $latest = $this->getLatest();
- // Update page record
- $dbw->update( 'page',
- array( /* SET */
- 'page_touched' => $dbw->timestamp(),
- 'page_restrictions' => '',
- 'page_latest' => $nullRevId
- ), array( /* WHERE */
- 'page_id' => $id
- ), __METHOD__
+ // Clear out legacy restriction fields
+ $dbw->update(
+ 'page',
+ array( 'page_restrictions' => '' ),
+ array( 'page_id' => $id ),
+ __METHOD__
);
wfRunHooks( 'NewRevisionFromEditComplete', array( $this, $nullRevision, $latest, $user ) );
@@ -2401,7 +2379,7 @@ class WikiPage implements Page, IDBAccessObject {
'pt_title' => $this->mTitle->getDBkey(),
'pt_create_perm' => $limit['create'],
'pt_timestamp' => $dbw->encodeExpiry( wfTimestampNow() ),
- 'pt_expiry' => $encodedExpiry['create'],
+ 'pt_expiry' => $dbw->encodeExpiry( $expiry['create'] ),
'pt_user' => $user->getId(),
'pt_reason' => $reason,
), __METHOD__
@@ -2417,21 +2395,154 @@ class WikiPage implements Page, IDBAccessObject {
}
$this->mTitle->flushRestrictions();
+ InfoAction::invalidateCache( $this->mTitle );
if ( $logAction == 'unprotect' ) {
- $logParams = array();
+ $params = array();
} else {
- $logParams = array( $protectDescriptionLog, $cascade ? 'cascade' : '' );
+ $protectDescriptionLog = $this->protectDescriptionLog( $limit, $expiry );
+ $params = array( $protectDescriptionLog, $cascade ? 'cascade' : '' );
}
// Update the protection log
$log = new LogPage( 'protect' );
- $log->addEntry( $logAction, $this->mTitle, trim( $reason ), $logParams, $user );
+ $log->addEntry( $logAction, $this->mTitle, trim( $reason ), $params, $user );
return Status::newGood();
}
/**
+ * Insert a new null revision for this page.
+ *
+ * @param string $revCommentMsg comment message key for the revision
+ * @param array $limit set of restriction keys
+ * @param array $expiry per restriction type expiration
+ * @param int $cascade Set to false if cascading protection isn't allowed.
+ * @param string $reason
+ * @return Revision|null on error
+ */
+ public function insertProtectNullRevision( $revCommentMsg, array $limit, array $expiry, $cascade, $reason ) {
+ global $wgContLang;
+ $dbw = wfGetDB( DB_MASTER );
+
+ // Prepare a null revision to be added to the history
+ $editComment = $wgContLang->ucfirst(
+ wfMessage(
+ $revCommentMsg,
+ $this->mTitle->getPrefixedText()
+ )->inContentLanguage()->text()
+ );
+ if ( $reason ) {
+ $editComment .= wfMessage( 'colon-separator' )->inContentLanguage()->text() . $reason;
+ }
+ $protectDescription = $this->protectDescription( $limit, $expiry );
+ if ( $protectDescription ) {
+ $editComment .= wfMessage( 'word-separator' )->inContentLanguage()->text();
+ $editComment .= wfMessage( 'parentheses' )->params( $protectDescription )->inContentLanguage()->text();
+ }
+ if ( $cascade ) {
+ $editComment .= wfMessage( 'word-separator' )->inContentLanguage()->text();
+ $editComment .= wfMessage( 'brackets' )->params(
+ wfMessage( 'protect-summary-cascade' )->inContentLanguage()->text()
+ )->inContentLanguage()->text();
+ }
+
+ $nullRev = Revision::newNullRevision( $dbw, $this->getId(), $editComment, true );
+ if ( $nullRev ) {
+ $nullRev->insertOn( $dbw );
+
+ // Update page record and touch page
+ $oldLatest = $nullRev->getParentId();
+ $this->updateRevisionOn( $dbw, $nullRev, $oldLatest );
+ }
+
+ return $nullRev;
+ }
+
+ /**
+ * @param string $expiry 14-char timestamp or "infinity", or false if the input was invalid
+ * @return string
+ */
+ protected function formatExpiry( $expiry ) {
+ global $wgContLang;
+ $dbr = wfGetDB( DB_SLAVE );
+
+ $encodedExpiry = $dbr->encodeExpiry( $expiry );
+ if ( $encodedExpiry != 'infinity' ) {
+ return wfMessage(
+ 'protect-expiring',
+ $wgContLang->timeanddate( $expiry, false, false ),
+ $wgContLang->date( $expiry, false, false ),
+ $wgContLang->time( $expiry, false, false )
+ )->inContentLanguage()->text();
+ } else {
+ return wfMessage( 'protect-expiry-indefinite' )
+ ->inContentLanguage()->text();
+ }
+ }
+
+ /**
+ * Builds the description to serve as comment for the edit.
+ *
+ * @param array $limit set of restriction keys
+ * @param array $expiry per restriction type expiration
+ * @return string
+ */
+ public function protectDescription( array $limit, array $expiry ) {
+ $protectDescription = '';
+
+ foreach ( array_filter( $limit ) as $action => $restrictions ) {
+ # $action is one of $wgRestrictionTypes = array( 'create', 'edit', 'move', 'upload' ).
+ # All possible message keys are listed here for easier grepping:
+ # * restriction-create
+ # * restriction-edit
+ # * restriction-move
+ # * restriction-upload
+ $actionText = wfMessage( 'restriction-' . $action )->inContentLanguage()->text();
+ # $restrictions is one of $wgRestrictionLevels = array( '', 'autoconfirmed', 'sysop' ),
+ # with '' filtered out. All possible message keys are listed below:
+ # * protect-level-autoconfirmed
+ # * protect-level-sysop
+ $restrictionsText = wfMessage( 'protect-level-' . $restrictions )->inContentLanguage()->text();
+
+ $expiryText = $this->formatExpiry( $expiry[$action] );
+
+ if ( $protectDescription !== '' ) {
+ $protectDescription .= wfMessage( 'word-separator' )->inContentLanguage()->text();
+ }
+ $protectDescription .= wfMessage( 'protect-summary-desc' )
+ ->params( $actionText, $restrictionsText, $expiryText )
+ ->inContentLanguage()->text();
+ }
+
+ return $protectDescription;
+ }
+
+ /**
+ * Builds the description to serve as comment for the log entry.
+ *
+ * Some bots may parse IRC lines, which are generated from log entries which contain plain
+ * protect description text. Keep them in old format to avoid breaking compatibility.
+ * TODO: Fix protection log to store structured description and format it on-the-fly.
+ *
+ * @param array $limit set of restriction keys
+ * @param array $expiry per restriction type expiration
+ * @return string
+ */
+ public function protectDescriptionLog( array $limit, array $expiry ) {
+ global $wgContLang;
+
+ $protectDescriptionLog = '';
+
+ foreach ( array_filter( $limit ) as $action => $restrictions ) {
+ $expiryText = $this->formatExpiry( $expiry[$action] );
+ $protectDescriptionLog .= $wgContLang->getDirMark() . "[$action=$restrictions] ($expiryText)";
+ }
+
+ return trim( $protectDescriptionLog );
+ }
+
+ /**
* Take an array of page restrictions and flatten it to a string
* suitable for insertion into the page_restrictions field.
* @param $limit Array
@@ -2446,10 +2557,8 @@ class WikiPage implements Page, IDBAccessObject {
$bits = array();
ksort( $limit );
- foreach ( $limit as $action => $restrictions ) {
- if ( $restrictions != '' ) {
- $bits[] = "$action=$restrictions";
- }
+ foreach ( array_filter( $limit ) as $action => $restrictions ) {
+ $bits[] = "$action=$restrictions";
}
return implode( ':', $bits );
@@ -2575,8 +2684,8 @@ class WikiPage implements Page, IDBAccessObject {
);
if ( $wgContentHandlerUseDB ) {
- $row[ 'ar_content_model' ] = 'rev_content_model';
- $row[ 'ar_content_format' ] = 'rev_content_format';
+ $row['ar_content_model'] = 'rev_content_model';
+ $row['ar_content_format'] = 'rev_content_format';
}
$dbw->insertSelect( 'archive', array( 'page', 'revision' ),
@@ -2589,7 +2698,7 @@ class WikiPage implements Page, IDBAccessObject {
// 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
+ $ok = ( $dbw->affectedRows() > 0 ); // $id could be laggy
if ( !$ok ) {
$dbw->rollback( __METHOD__ );
@@ -2597,6 +2706,10 @@ class WikiPage implements Page, IDBAccessObject {
return $status;
}
+ if ( !$dbw->cascadingDeletes() ) {
+ $dbw->delete( 'revision', array( 'rev_page' => $id ), __METHOD__ );
+ }
+
$this->doDeleteUpdates( $id, $content );
// Log the deletion, if the page was suppressed, log it at Oversight instead
@@ -2621,7 +2734,7 @@ class WikiPage implements Page, IDBAccessObject {
/**
* Do some database updates after deletion
*
- * @param int $id page_id value of the page being deleted (B/C, currently unused)
+ * @param int $id page_id value of the page being deleted
* @param $content Content: optional page content to be used when determining the required updates.
* This may be needed because $this->getContent() may already return null when the page proper was deleted.
*/
@@ -2636,11 +2749,11 @@ class WikiPage implements Page, IDBAccessObject {
// Clear caches
WikiPage::onArticleDelete( $this->mTitle );
- // Reset this object
- $this->clear();
+ // Reset this object and the Title object
+ $this->loadFromRow( false, self::READ_LATEST );
- // Clear the cached article id so the interface doesn't act like we exist
- $this->mTitle->resetArticleID( 0 );
+ // Search engine
+ DeferredUpdates::addUpdate( new SearchUpdate( $id, $this->mTitle ) );
}
/**
@@ -2650,7 +2763,7 @@ class WikiPage implements Page, IDBAccessObject {
* performs permissions checks on $user, then calls commitRollback()
* to do the dirty work
*
- * @todo: separate the business/permission stuff out from backend code
+ * @todo Separate the business/permission stuff out from backend code
*
* @param string $fromP Name of the user whose edits to rollback.
* @param string $summary Custom summary. Set to default summary if empty.
@@ -2794,7 +2907,7 @@ class WikiPage implements Page, IDBAccessObject {
$wgContLang->timeanddate( wfTimestamp( TS_MW, $s->rev_timestamp ) ),
$current->getId(), $wgContLang->timeanddate( $current->getTimestamp() )
);
- if( $summary instanceof Message ) {
+ if ( $summary instanceof Message ) {
$summary = $summary->params( $args )->inContentLanguage()->text();
} else {
$summary = wfMsgReplaceArgs( $summary, $args );
@@ -2835,8 +2948,8 @@ class WikiPage implements Page, IDBAccessObject {
$resultDetails = array(
'summary' => $summary,
'current' => $current,
- 'target' => $target,
- 'newid' => $revId
+ 'target' => $target,
+ 'newid' => $revId
);
return array();
@@ -2890,6 +3003,7 @@ class WikiPage implements Page, IDBAccessObject {
// File cache
HTMLFileCache::clearFileCache( $title );
+ InfoAction::invalidateCache( $title );
// Messages
if ( $title->getNamespace() == NS_MEDIAWIKI ) {
@@ -2918,7 +3032,7 @@ class WikiPage implements Page, IDBAccessObject {
* 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
+ * @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 ) {
// Invalidate caches of articles which include this page
@@ -2932,11 +3046,35 @@ class WikiPage implements Page, IDBAccessObject {
// Clear file cache for this page only
HTMLFileCache::clearFileCache( $title );
+ InfoAction::invalidateCache( $title );
}
/**#@-*/
/**
+ * Returns a list of categories this page is a member of.
+ * Results will include hidden categories
+ *
+ * @return TitleArray
+ */
+ public function getCategories() {
+ $id = $this->getId();
+ if ( $id == 0 ) {
+ return TitleArray::newFromResult( new FakeResultWrapper( array() ) );
+ }
+
+ $dbr = wfGetDB( DB_SLAVE );
+ $res = $dbr->select( 'categorylinks',
+ array( 'cl_to AS page_title, ' . NS_CATEGORY . ' AS page_namespace' ),
+ // Have to do that since DatabaseBase::fieldNamesWithAlias treats numeric indexes
+ // as not being aliases, and NS_CATEGORY is numeric
+ array( 'cl_from' => $id ),
+ __METHOD__ );
+
+ return TitleArray::newFromResult( $res );
+ }
+
+ /**
* Returns a list of hidden categories this page is a member of.
* Uses the page_props and categorylinks tables.
*
@@ -2944,7 +3082,7 @@ class WikiPage implements Page, IDBAccessObject {
*/
public function getHiddenCategories() {
$result = array();
- $id = $this->mTitle->getArticleID();
+ $id = $this->getId();
if ( $id == 0 ) {
return array();
@@ -3005,69 +3143,65 @@ class WikiPage implements Page, IDBAccessObject {
* @param array $added The names of categories that were added
* @param array $deleted The names of categories that were deleted
*/
- public function updateCategoryCounts( $added, $deleted ) {
- $ns = $this->mTitle->getNamespace();
+ public function updateCategoryCounts( array $added, array $deleted ) {
+ $that = $this;
+ $method = __METHOD__;
$dbw = wfGetDB( DB_MASTER );
- // First make sure the rows exist. If one of the "deleted" ones didn't
- // exist, we might legitimately not create it, but it's simpler to just
- // create it and then give it a negative value, since the value is bogus
- // anyway.
- //
- // Sometimes I wish we had INSERT ... ON DUPLICATE KEY UPDATE.
- $insertCats = array_merge( $added, $deleted );
- if ( !$insertCats ) {
- // Okay, nothing to do
- return;
- }
-
- $insertRows = array();
-
- foreach ( $insertCats as $cat ) {
- $insertRows[] = array(
- 'cat_id' => $dbw->nextSequenceValue( 'category_cat_id_seq' ),
- 'cat_title' => $cat
- );
- }
- $dbw->insert( 'category', $insertRows, __METHOD__, 'IGNORE' );
-
- $addFields = array( 'cat_pages = cat_pages + 1' );
- $removeFields = array( 'cat_pages = cat_pages - 1' );
+ // Do this at the end of the commit to reduce lock wait timeouts
+ $dbw->onTransactionPreCommitOrIdle(
+ function() use ( $dbw, $that, $method, $added, $deleted ) {
+ $ns = $that->getTitle()->getNamespace();
+
+ $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';
+ } elseif ( $ns == NS_FILE ) {
+ $addFields[] = 'cat_files = cat_files + 1';
+ $removeFields[] = 'cat_files = cat_files - 1';
+ }
- if ( $ns == NS_CATEGORY ) {
- $addFields[] = 'cat_subcats = cat_subcats + 1';
- $removeFields[] = 'cat_subcats = cat_subcats - 1';
- } elseif ( $ns == NS_FILE ) {
- $addFields[] = 'cat_files = cat_files + 1';
- $removeFields[] = 'cat_files = cat_files - 1';
- }
+ if ( count( $added ) ) {
+ $insertRows = array();
+ foreach ( $added as $cat ) {
+ $insertRows[] = array(
+ 'cat_title' => $cat,
+ 'cat_pages' => 1,
+ 'cat_subcats' => ( $ns == NS_CATEGORY ) ? 1 : 0,
+ 'cat_files' => ( $ns == NS_FILE ) ? 1 : 0,
+ );
+ }
+ $dbw->upsert(
+ 'category',
+ $insertRows,
+ array( 'cat_title' ),
+ $addFields,
+ $method
+ );
+ }
- if ( $added ) {
- $dbw->update(
- 'category',
- $addFields,
- array( 'cat_title' => $added ),
- __METHOD__
- );
- }
+ if ( count( $deleted ) ) {
+ $dbw->update(
+ 'category',
+ $removeFields,
+ array( 'cat_title' => $deleted ),
+ $method
+ );
+ }
- if ( $deleted ) {
- $dbw->update(
- 'category',
- $removeFields,
- array( 'cat_title' => $deleted ),
- __METHOD__
- );
- }
+ foreach ( $added as $catName ) {
+ $cat = Category::newFromName( $catName );
+ wfRunHooks( 'CategoryAfterPageAdded', array( $cat, $that ) );
+ }
- foreach( $added as $catName ) {
- $cat = Category::newFromName( $catName );
- wfRunHooks( 'CategoryAfterPageAdded', array( $cat, $this ) );
- }
- foreach( $deleted as $catName ) {
- $cat = Category::newFromName( $catName );
- wfRunHooks( 'CategoryAfterPageRemoved', array( $cat, $this ) );
- }
+ foreach ( $deleted as $catName ) {
+ $cat = Category::newFromName( $catName );
+ wfRunHooks( 'CategoryAfterPageRemoved', array( $cat, $that ) );
+ }
+ }
+ );
}
/**
@@ -3088,7 +3222,7 @@ class WikiPage implements Page, IDBAccessObject {
// are visible.
// Get templates from templatelinks
- $id = $this->mTitle->getArticleID();
+ $id = $this->getId();
$tlTemplates = array();
@@ -3233,7 +3367,7 @@ class WikiPage implements Page, IDBAccessObject {
public function viewUpdates() {
wfDeprecated( __METHOD__, '1.18' );
global $wgUser;
- return $this->doViewUpdates( $wgUser );
+ $this->doViewUpdates( $wgUser );
}
/**
@@ -3318,7 +3452,7 @@ class PoolWorkArticleView extends PoolCounterWork {
/**
* Constructor
*
- * @param $page Page
+ * @param $page Page|WikiPage
* @param $revid Integer: ID of the revision being parsed
* @param $useParserCache Boolean: whether to use the parser cache
* @param $parserOptions parserOptions to use for the parse operation
@@ -3373,7 +3507,7 @@ class PoolWorkArticleView extends PoolCounterWork {
function doWork() {
global $wgUseFileCache;
- // @todo: several of the methods called on $this->page are not declared in Page, but present
+ // @todo several of the methods called on $this->page are not declared in Page, but present
// in WikiPage and delegated by Article.
$isCurrent = $this->revid === $this->page->getLatest();
@@ -3398,6 +3532,9 @@ class PoolWorkArticleView extends PoolCounterWork {
return false;
}
+ // Reduce effects of race conditions for slow parses (bug 46014)
+ $cacheTime = wfTimestampNow();
+
$time = - microtime( true );
$this->parserOutput = $content->getParserOutput( $this->page->getTitle(), $this->revid, $this->parserOptions );
$time += microtime( true );
@@ -3409,7 +3546,8 @@ class PoolWorkArticleView extends PoolCounterWork {
}
if ( $this->cacheable && $this->parserOutput->isCacheable() ) {
- ParserCache::singleton()->save( $this->parserOutput, $this->page, $this->parserOptions );
+ ParserCache::singleton()->save(
+ $this->parserOutput, $this->page, $this->parserOptions, $cacheTime );
}
// Make sure file cache is not used on uncacheable content.
diff --git a/includes/Xml.php b/includes/Xml.php
index 57a4fcf6..ac0539d1 100644
--- a/includes/Xml.php
+++ b/includes/Xml.php
@@ -38,13 +38,13 @@ class Xml {
*/
public static function element( $element, $attribs = null, $contents = '', $allowShortTag = true ) {
$out = '<' . $element;
- if( !is_null( $attribs ) ) {
+ if ( !is_null( $attribs ) ) {
$out .= self::expandAttributes( $attribs );
}
- if( is_null( $contents ) ) {
+ if ( is_null( $contents ) ) {
$out .= '>';
} else {
- if( $allowShortTag && $contents === '' ) {
+ if ( $allowShortTag && $contents === '' ) {
$out .= ' />';
} else {
$out .= '>' . htmlspecialchars( $contents ) . "</$element>";
@@ -64,10 +64,10 @@ class Xml {
*/
public static function expandAttributes( $attribs ) {
$out = '';
- if( is_null( $attribs ) ) {
+ if ( is_null( $attribs ) ) {
return null;
- } elseif( is_array( $attribs ) ) {
- foreach( $attribs as $name => $val ) {
+ } elseif ( is_array( $attribs ) ) {
+ foreach ( $attribs as $name => $val ) {
$out .= " {$name}=\"" . Sanitizer::encodeAttribute( $val ) . '"';
}
return $out;
@@ -88,10 +88,10 @@ class Xml {
*/
public static function elementClean( $element, $attribs = array(), $contents = '' ) {
global $wgContLang;
- if( $attribs ) {
+ if ( $attribs ) {
$attribs = array_map( array( 'UtfNormal', 'cleanUp' ), $attribs );
}
- if( $contents ) {
+ if ( $contents ) {
wfProfileIn( __METHOD__ . '-norm' );
$contents = $wgContLang->normalize( $contents );
wfProfileOut( __METHOD__ . '-norm' );
@@ -115,7 +115,9 @@ class Xml {
* @param string $element element name
* @return string
*/
- public static function closeElement( $element ) { return "</$element>"; }
+ public static function closeElement( $element ) {
+ return "</$element>";
+ }
/**
* Same as Xml::element(), but does not escape contents. Handy when the
@@ -144,11 +146,11 @@ class Xml {
wfDeprecated( __METHOD__, '1.19' );
return Html::namespaceSelector( array(
'selected' => $selected,
- 'all' => $all,
- 'label' => $label,
+ 'all' => $all,
+ 'label' => $label,
), array(
- 'name' => $element_name,
- 'id' => 'namespace',
+ 'name' => $element_name,
+ 'id' => 'namespace',
'class' => 'namespaceselector',
) );
}
@@ -164,12 +166,15 @@ class Xml {
public static function monthSelector( $selected = '', $allmonths = null, $id = 'month' ) {
global $wgLang;
$options = array();
- if( is_null( $selected ) )
+ if ( is_null( $selected ) ) {
$selected = '';
- if( !is_null( $allmonths ) )
+ }
+ if ( !is_null( $allmonths ) ) {
$options[] = self::option( wfMessage( 'monthsall' )->text(), $allmonths, $selected === $allmonths );
- for( $i = 1; $i < 13; $i++ )
+ }
+ for ( $i = 1; $i < 13; $i++ ) {
$options[] = self::option( $wgLang->getMonthName( $i ), $i, $selected === $i );
+ }
return self::openElement( 'select', array( 'id' => $id, 'name' => 'month', 'class' => 'mw-month-selector' ) )
. implode( "\n", $options )
. self::closeElement( 'select' );
@@ -182,17 +187,18 @@ class Xml {
*/
public static function dateMenu( $year, $month ) {
# Offset overrides year/month selection
- if( $month && $month !== -1 ) {
+ if ( $month && $month !== -1 ) {
$encMonth = intval( $month );
} else {
$encMonth = '';
}
- if( $year ) {
+ if ( $year ) {
$encYear = intval( $year );
- } elseif( $encMonth ) {
- $thisMonth = intval( gmdate( 'n' ) );
- $thisYear = intval( gmdate( 'Y' ) );
- if( intval( $encMonth ) > $thisMonth ) {
+ } elseif ( $encMonth ) {
+ $timestamp = MWTimestamp::getInstance();
+ $thisMonth = intval( $timestamp->format( 'n' ) );
+ $thisYear = intval( $timestamp->format( 'Y' ) );
+ if ( intval( $encMonth ) > $thisMonth ) {
$thisYear--;
}
$encYear = $thisYear;
@@ -200,9 +206,9 @@ class Xml {
$encYear = '';
}
$inputAttribs = array( 'id' => 'year', 'maxlength' => 4, 'size' => 7 );
- return self::label( wfMessage( 'year' )->text(), 'year' ) . ' '.
- Html::input( 'year', $encYear, 'number', $inputAttribs ) . ' '.
- self::label( wfMessage( 'month' )->text(), 'month' ) . ' '.
+ return self::label( wfMessage( 'year' )->text(), 'year' ) . ' ' .
+ Html::input( 'year', $encYear, 'number', $inputAttribs ) . ' ' .
+ self::label( wfMessage( 'month' )->text(), 'month' ) . ' ' .
self::monthSelector( $encMonth, -1 );
}
@@ -224,7 +230,7 @@ class Xml {
// Make sure the site language is in the list;
// a custom language code might not have a defined name...
- if( !array_key_exists( $wgLanguageCode, $languages ) ) {
+ if ( !array_key_exists( $wgLanguageCode, $languages ) ) {
$languages[$wgLanguageCode] = $wgLanguageCode;
}
@@ -237,14 +243,14 @@ class Xml {
*/
$selected = isset( $languages[$selected] ) ? $selected : $wgLanguageCode;
$options = "\n";
- foreach( $languages as $code => $name ) {
- $options .= Xml::option( "$code - $name", $code, ($code == $selected) ) . "\n";
+ foreach ( $languages as $code => $name ) {
+ $options .= Xml::option( "$code - $name", $code, $code == $selected ) . "\n";
}
$attrs = array( 'id' => 'wpUserLanguage', 'name' => 'wpUserLanguage' );
$attrs = array_merge( $attrs, $overrideAttrs );
- if( $msg === null ) {
+ if ( $msg === null ) {
$msg = wfMessage( 'yourlanguage' );
}
return array(
@@ -288,11 +294,11 @@ class Xml {
public static function input( $name, $size = false, $value = false, $attribs = array() ) {
$attributes = array( 'name' => $name );
- if( $size ) {
+ if ( $size ) {
$attributes['size'] = $size;
}
- if( $value !== false ) { // maybe 0
+ if ( $value !== false ) { // maybe 0
$attributes['value'] = $value;
}
@@ -330,7 +336,7 @@ class Xml {
* @param array $attribs other attributes
* @return string HTML
*/
- public static function check( $name, $checked = false, $attribs=array() ) {
+ public static function check( $name, $checked = false, $attribs = array() ) {
return self::element( 'input', array_merge(
array(
'name' => $name,
@@ -369,10 +375,10 @@ class Xml {
$a = array( 'for' => $id );
# FIXME avoid copy pasting below:
- if( isset( $attribs['class'] ) ) {
+ if ( isset( $attribs['class'] ) ) {
$a['class'] = $attribs['class'];
}
- if( isset( $attribs['title'] ) ) {
+ if ( isset( $attribs['title'] ) ) {
$a['title'] = $attribs['title'];
}
@@ -389,7 +395,7 @@ class Xml {
* @param array $attribs other attributes
* @return string HTML
*/
- public static function inputLabel( $label, $name, $id, $size=false, $value=false, $attribs = array() ) {
+ 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 . '&#160;' . $input;
}
@@ -460,18 +466,18 @@ class Xml {
/**
* Convenience function to build an HTML drop-down list item.
- * @param string $text text for this item
+ * @param string $text text for this item. Will be HTML escaped
* @param string $value form submission value; if empty, use text
* @param $selected boolean: if true, will be the default selected item
* @param array $attribs optional additional HTML attributes
* @return string HTML
*/
- public static function option( $text, $value=null, $selected = false,
+ public static function option( $text, $value = null, $selected = false,
$attribs = array() ) {
- if( !is_null( $value ) ) {
+ if ( !is_null( $value ) ) {
$attribs['value'] = $value;
}
- if( $selected ) {
+ if ( $selected ) {
$attribs['selected'] = 'selected';
}
return Html::element( 'option', $attribs, $text );
@@ -488,47 +494,53 @@ class Xml {
* @param $tabindex Mixed: Value of the tabindex attribute
* @return string
*/
- public static function listDropDown( $name= '', $list = '', $other = '', $selected = '', $class = '', $tabindex = null ) {
+ public static function listDropDown( $name = '', $list = '', $other = '', $selected = '', $class = '', $tabindex = null ) {
$optgroup = false;
$options = self::option( $other, 'other', $selected === 'other' );
- foreach ( explode( "\n", $list ) as $option) {
+ foreach ( explode( "\n", $list ) as $option ) {
$value = trim( $option );
if ( $value == '' ) {
continue;
- } elseif ( substr( $value, 0, 1) == '*' && substr( $value, 1, 1) != '*' ) {
+ } elseif ( substr( $value, 0, 1 ) == '*' && substr( $value, 1, 1 ) != '*' ) {
// A new group is starting ...
$value = trim( substr( $value, 1 ) );
- if( $optgroup ) $options .= self::closeElement( 'optgroup' );
+ if ( $optgroup ) {
+ $options .= self::closeElement( 'optgroup' );
+ }
$options .= self::openElement( 'optgroup', array( 'label' => $value ) );
$optgroup = true;
- } elseif ( substr( $value, 0, 2) == '**' ) {
+ } elseif ( substr( $value, 0, 2 ) == '**' ) {
// groupmember
$value = trim( substr( $value, 2 ) );
$options .= self::option( $value, $value, $selected === $value );
} else {
// groupless reason list
- if( $optgroup ) $options .= self::closeElement( 'optgroup' );
+ if ( $optgroup ) {
+ $options .= self::closeElement( 'optgroup' );
+ }
$options .= self::option( $value, $value, $selected === $value );
$optgroup = false;
}
}
- if( $optgroup ) $options .= self::closeElement( 'optgroup' );
+ if ( $optgroup ) {
+ $options .= self::closeElement( 'optgroup' );
+ }
$attribs = array();
- if( $name ) {
+ if ( $name ) {
$attribs['id'] = $name;
$attribs['name'] = $name;
}
- if( $class ) {
+ if ( $class ) {
$attribs['class'] = $class;
}
- if( $tabindex ) {
+ if ( $tabindex ) {
$attribs['tabindex'] = $tabindex;
}
@@ -590,6 +602,7 @@ class Xml {
* for JavaScript source code.
* Illegal control characters are assumed not to be present.
*
+ * @deprecated since 1.21; use Xml::encodeJsVar() or Xml::encodeJsCall() instead
* @param string $string to escape
* @return String
*/
@@ -621,72 +634,46 @@ class Xml {
}
/**
- * Encode a variable of unknown type to JavaScript.
- * Arrays are converted to JS arrays, objects are converted to JS associative
- * arrays (objects). So cast your PHP associative arrays to objects before
- * passing them to here.
+ * Encode a variable of arbitrary type to JavaScript.
+ * If the value is an XmlJsCode object, pass through the object's value verbatim.
*
- * @param $value
+ * @note Only use this function for generating JavaScript code. If generating output
+ * for a proper JSON parser, just call FormatJson::encode() directly.
*
- * @return string
+ * @param mixed $value The value being encoded. Can be any type except a resource.
+ * @param bool $pretty If true, add non-significant whitespace to improve readability.
+ * @return string|bool: String if successful; false upon failure
*/
- public static function encodeJsVar( $value ) {
- if ( is_bool( $value ) ) {
- $s = $value ? 'true' : 'false';
- } elseif ( is_null( $value ) ) {
- $s = 'null';
- } 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
- ) {
- $s = '[';
- foreach ( $value as $elt ) {
- if ( $s != '[' ) {
- $s .= ',';
- }
- $s .= self::encodeJsVar( $elt );
- }
- $s .= ']';
- } elseif ( $value instanceof XmlJsCode ) {
- $s = $value->value;
- } elseif ( is_object( $value ) || is_array( $value ) ) {
- // Objects and associative arrays
- $s = '{';
- foreach ( (array)$value as $name => $elt ) {
- if ( $s != '{' ) {
- $s .= ',';
- }
-
- $s .= '"' . self::escapeJsString( $name ) . '":' .
- self::encodeJsVar( $elt );
- }
- $s .= '}';
- } else {
- $s = '"' . self::escapeJsString( $value ) . '"';
+ public static function encodeJsVar( $value, $pretty = false ) {
+ if ( $value instanceof XmlJsCode ) {
+ return $value->value;
}
- return $s;
+ return FormatJson::encode( $value, $pretty, FormatJson::UTF8_OK );
}
/**
* Create a call to a JavaScript function. The supplied arguments will be
* encoded using Xml::encodeJsVar().
*
+ * @since 1.17
* @param string $name The name of the function to call, or a JavaScript expression
* which evaluates to a function object which is called.
- * @param array $args of arguments to pass to the function.
- *
- * @since 1.17
- *
- * @return string
+ * @param array $args The arguments to pass to the function.
+ * @param bool $pretty If true, add non-significant whitespace to improve readability.
+ * @return string|bool: String if successful; false upon failure
*/
- public static function encodeJsCall( $name, $args ) {
+ public static function encodeJsCall( $name, $args, $pretty = false ) {
foreach ( $args as &$arg ) {
- $arg = Xml::encodeJsVar( $arg );
+ $arg = Xml::encodeJsVar( $arg, $pretty );
+ if ( $arg === false ) {
+ return false;
+ }
}
- return "$name(" . implode( ', ', $args ) . ");\n";
+ return "$name(" . ( $pretty
+ ? ( ' ' . implode( ', ', $args ) . ' ' )
+ : implode( ',', $args )
+ ) . ");";
}
/**
@@ -704,7 +691,7 @@ class Xml {
# case folding violates XML standard, turn it off
xml_parser_set_option( $parser, XML_OPTION_CASE_FOLDING, false );
- if( !xml_parse( $parser, $text, true ) ) {
+ if ( !xml_parse( $parser, $text, true ) ) {
//$err = xml_error_string( xml_get_error_code( $parser ) );
//$position = xml_get_current_byte_index( $parser );
//$fragment = $this->extractFragment( $html, $position );
@@ -753,26 +740,32 @@ class Xml {
/**
* Generate a form (without the opening form element).
* Output optionally includes a submit button.
- * @param array $fields Associative array, key is message corresponding to a description for the field (colon is in the message), value is appropriate input.
- * @param string $submitLabel A message containing a label for the submit button.
+ * @param array $fields Associative array, key is the name of a message that contains a description for the field, value is an HTML string containing the appropriate input.
+ * @param string $submitLabel The name of a message containing a label for the submit button.
+ * @param array $submitAttribs The attributes to add to the submit button
* @return string HTML form.
*/
- public static function buildForm( $fields, $submitLabel = null ) {
+ public static function buildForm( $fields, $submitLabel = null, $submitAttribs = array() ) {
$form = '';
$form .= "<table><tbody>";
- foreach( $fields as $labelmsg => $input ) {
+ foreach ( $fields as $labelmsg => $input ) {
$id = "mw-$labelmsg";
$form .= Xml::openElement( 'tr', array( 'id' => $id ) );
+
+ // TODO use a <label> here for accessibility purposes - will need
+ // to either not use a table to build the form, or find the ID of
+ // the input somehow.
+
$form .= Xml::tags( 'td', array( 'class' => 'mw-label' ), wfMessage( $labelmsg )->parse() );
$form .= Xml::openElement( 'td', array( 'class' => 'mw-input' ) ) . $input . Xml::closeElement( 'td' );
$form .= Xml::closeElement( 'tr' );
}
- if( $submitLabel ) {
+ if ( $submitLabel ) {
$form .= Xml::openElement( 'tr' );
$form .= Xml::tags( 'td', array(), '' );
- $form .= Xml::openElement( 'td', array( 'class' => 'mw-submit' ) ) . Xml::submitButton( wfMessage( $submitLabel )->text() ) . Xml::closeElement( 'td' );
+ $form .= Xml::openElement( 'td', array( 'class' => 'mw-submit' ) ) . Xml::submitButton( wfMessage( $submitLabel )->text(), $submitAttribs ) . Xml::closeElement( 'td' );
$form .= Xml::closeElement( 'tr' );
}
@@ -794,7 +787,7 @@ class Xml {
if ( is_array( $headers ) ) {
$s .= Xml::openElement( 'thead', $attribs );
- foreach( $headers as $id => $header ) {
+ foreach ( $headers as $id => $header ) {
$attribs = array();
if ( is_string( $id ) ) {
@@ -806,7 +799,7 @@ class Xml {
$s .= Xml::closeElement( 'thead' );
}
- foreach( $rows as $id => $row ) {
+ foreach ( $rows as $id => $row ) {
$attribs = array();
if ( is_string( $id ) ) {
@@ -830,8 +823,7 @@ class Xml {
public static function buildTableRow( $attribs, $cells ) {
$s = Xml::openElement( 'tr', $attribs );
- foreach( $cells as $id => $cell ) {
-
+ foreach ( $cells as $id => $cell ) {
$attribs = array();
if ( is_string( $id ) ) {
@@ -899,7 +891,7 @@ class XmlSelect {
*/
public function addOption( $name, $value = false ) {
// Stab stab stab
- $value = ($value !== false) ? $value : $name;
+ $value = $value !== false ? $value : $name;
$this->options[] = array( $name => $value );
}
@@ -927,7 +919,7 @@ class XmlSelect {
static function formatOptions( $options, $default = false ) {
$data = '';
- foreach( $options as $label => $value ) {
+ foreach ( $options as $label => $value ) {
if ( is_array( $value ) ) {
$contents = self::formatOptions( $value, $default );
$data .= Html::rawElement( 'optgroup', array( 'label' => $label ), $contents ) . "\n";
@@ -963,6 +955,11 @@ class XmlSelect {
* Xml::encodeJsVar( new XmlJsCode( 'a + b' ) );
*
* Returns "a + b".
+ *
+ * @note As of 1.21, XmlJsCode objects cannot be nested inside objects or arrays. The sole
+ * exception is the $args argument to Xml::encodeJsCall() because Xml::encodeJsVar() is
+ * called for each individual element in that array.
+ *
* @since 1.17
*/
class XmlJsCode {
diff --git a/includes/XmlTypeCheck.php b/includes/XmlTypeCheck.php
index 2e184606..92ca7d80 100644
--- a/includes/XmlTypeCheck.php
+++ b/includes/XmlTypeCheck.php
@@ -40,16 +40,52 @@ class XmlTypeCheck {
public $rootElement = '';
/**
- * @param string $file filename
- * @param $filterCallback callable (optional)
+ * @param string $input a filename or string containing the XML element
+ * @param callable $filterCallback (optional)
* Function to call to do additional custom validity checks from the
* SAX element handler event. This gives you access to the element
* namespace, name, and attributes, but not to text contents.
* Filter should return 'true' to toggle on $this->filterMatch
+ * @param boolean $isFile (optional) indicates if the first parameter is a
+ * filename (default, true) or if it is a string (false)
*/
- function __construct( $file, $filterCallback=null ) {
+ function __construct( $input, $filterCallback = null, $isFile = true ) {
$this->filterCallback = $filterCallback;
- $this->run( $file );
+ if ( $isFile ) {
+ $this->validateFromFile( $input );
+ } else {
+ $this->validateFromString( $input );
+ }
+ }
+
+ /**
+ * Alternative constructor: from filename
+ *
+ * @param string $fname the filename of an XML document
+ * @param callable $filterCallback (optional)
+ * Function to call to do additional custom validity checks from the
+ * SAX element handler event. This gives you access to the element
+ * namespace, name, and attributes, but not to text contents.
+ * Filter should return 'true' to toggle on $this->filterMatch
+ * @return XmlTypeCheck
+ */
+ public static function newFromFilename( $fname, $filterCallback = null ) {
+ return new self( $fname, $filterCallback, true );
+ }
+
+ /**
+ * Alternative constructor: from string
+ *
+ * @param string $string a string containing an XML element
+ * @param callable $filterCallback (optional)
+ * Function to call to do additional custom validity checks from the
+ * SAX element handler event. This gives you access to the element
+ * namespace, name, and attributes, but not to text contents.
+ * Filter should return 'true' to toggle on $this->filterMatch
+ * @return XmlTypeCheck
+ */
+ public static function newFromString( $string, $filterCallback = null ) {
+ return new self( $string, $filterCallback, false );
}
/**
@@ -62,15 +98,23 @@ class XmlTypeCheck {
}
/**
- * @param $fname
+ * Get an XML parser with the root element handler.
+ * @see XmlTypeCheck::rootElementOpen()
+ * @return resource a resource handle for the XML parser
*/
- private function run( $fname ) {
+ private function getParser() {
$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_element_handler( $parser, array( $this, 'rootElementOpen' ), false );
+ return $parser;
+ }
+
+ /**
+ * @param string $fname the filename
+ */
+ private function validateFromFile( $fname ) {
+ $parser = $this->getParser();
if ( file_exists( $fname ) ) {
$file = fopen( $fname, "rb" );
@@ -78,24 +122,38 @@ class XmlTypeCheck {
do {
$chunk = fread( $file, 32768 );
$ret = xml_parse( $parser, $chunk, feof( $file ) );
- if( $ret == 0 ) {
- // XML isn't well-formed!
+ if ( $ret == 0 ) {
+ $this->wellFormed = false;
fclose( $file );
xml_parser_free( $parser );
return;
}
- } while( !feof( $file ) );
+ } while ( !feof( $file ) );
fclose( $file );
}
}
-
$this->wellFormed = true;
xml_parser_free( $parser );
}
/**
+ *
+ * @param string $string the XML-input-string to be checked.
+ */
+ private function validateFromString( $string ) {
+ $parser = $this->getParser();
+ $ret = xml_parse( $parser, $string, true );
+ xml_parser_free( $parser );
+ if ( $ret == 0 ) {
+ $this->wellFormed = false;
+ return;
+ }
+ $this->wellFormed = true;
+ }
+
+ /**
* @param $parser
* @param $name
* @param $attribs
@@ -103,7 +161,7 @@ class XmlTypeCheck {
private function rootElementOpen( $parser, $name, $attribs ) {
$this->rootElement = $name;
- if( is_callable( $this->filterCallback ) ) {
+ if ( is_callable( $this->filterCallback ) ) {
xml_set_element_handler( $parser, array( $this, 'elementOpen' ), false );
$this->elementOpen( $parser, $name, $attribs );
} else {
@@ -118,7 +176,7 @@ class XmlTypeCheck {
* @param $attribs
*/
private function elementOpen( $parser, $name, $attribs ) {
- if( call_user_func( $this->filterCallback, $name, $attribs ) ) {
+ if ( call_user_func( $this->filterCallback, $name, $attribs ) ) {
// Filter hit!
$this->filterMatch = true;
}
diff --git a/includes/ZhClient.php b/includes/ZhClient.php
index fd03ec45..c5955aec 100644
--- a/includes/ZhClient.php
+++ b/includes/ZhClient.php
@@ -81,14 +81,14 @@ class ZhClient {
$result = fgets( $this->mFP, 1024 );
list( $status, $len ) = explode( ' ', $result );
- if( $status == 'ERROR' ) {
+ if ( $status == 'ERROR' ) {
// $len is actually the error code...
print "zhdaemon error $len<br />\n";
return false;
}
$bytesread = 0;
$data = '';
- while( !feof( $this->mFP ) && $bytesread < $len ) {
+ while ( !feof( $this->mFP ) && $bytesread < $len ) {
$str = fread( $this->mFP, $len - $bytesread );
$bytesread += strlen( $str );
$data .= $str;
@@ -131,7 +131,7 @@ class ZhClient {
$info = explode( ';', $infoline );
$ret = array();
$i = 0;
- foreach( $info as $variant ) {
+ foreach ( $info as $variant ) {
list( $code, $len ) = explode( ' ', $variant );
$ret[strtolower( $code )] = substr( $data, $i, $len );
$i += $len;
diff --git a/includes/ZipDirectoryReader.php b/includes/ZipDirectoryReader.php
index 646180d2..307efcea 100644
--- a/includes/ZipDirectoryReader.php
+++ b/includes/ZipDirectoryReader.php
@@ -162,7 +162,7 @@ class ZipDirectoryReader {
|| $this->eocdr['CD entries total'] == 0xffff )
{
$this->error( 'zip-unsupported', 'Central directory header indicates ZIP64, ' .
- 'but we are in legacy mode. Rejecting this upload is necessary to avoid '.
+ 'but we are in legacy mode. Rejecting this upload is necessary to avoid ' .
'opening vulnerabilities on clients using OpenJDK 7 or later.' );
}
diff --git a/includes/actions/CreditsAction.php b/includes/actions/CreditsAction.php
index 4d3c41be..0a2bf306 100644
--- a/includes/actions/CreditsAction.php
+++ b/includes/actions/CreditsAction.php
@@ -79,17 +79,17 @@ class CreditsAction extends FormlessAction {
/**
* Get the last author with the last modification time
- * @param $article Article object
+ * @param Page $page
* @return String HTML
*/
- protected function getAuthor( Page $article ) {
- $user = User::newFromName( $article->getUserText(), false );
+ protected function getAuthor( Page $page ) {
+ $user = User::newFromName( $page->getUserText(), false );
- $timestamp = $article->getTimestamp();
+ $timestamp = $page->getTimestamp();
if ( $timestamp ) {
$lang = $this->getLanguage();
- $d = $lang->date( $article->getTimestamp(), true );
- $t = $lang->time( $article->getTimestamp(), true );
+ $d = $lang->date( $page->getTimestamp(), true );
+ $t = $lang->time( $page->getTimestamp(), true );
} else {
$d = '';
$t = '';
@@ -114,9 +114,10 @@ class CreditsAction extends FormlessAction {
# Hmm... too many to fit!
if ( $cnt > 0 && $contributors->count() > $cnt ) {
$others_link = $this->othersLink();
- if ( !$showIfMax )
+ if ( !$showIfMax ) {
return $this->msg( 'othercontribs' )->rawParams(
$others_link )->params( $contributors->count() )->escaped();
+ }
}
$real_names = array();
diff --git a/includes/actions/EditAction.php b/includes/actions/EditAction.php
index dec3d841..3dd4c483 100644
--- a/includes/actions/EditAction.php
+++ b/includes/actions/EditAction.php
@@ -43,21 +43,11 @@ class EditAction extends FormlessAction {
public function show() {
$page = $this->page;
- $request = $this->getRequest();
$user = $this->getUser();
- $context = $this->getContext();
if ( wfRunHooks( 'CustomEditor', array( $page, $user ) ) ) {
- if ( ExternalEdit::useExternalEngine( $context, 'edit' )
- && $this->getName() == 'edit' && !$request->getVal( 'section' )
- && !$request->getVal( 'oldid' ) )
- {
- $extedit = new ExternalEdit( $context );
- $extedit->execute();
- } else {
- $editor = new EditPage( $page );
- $editor->edit();
- }
+ $editor = new EditPage( $page );
+ $editor->edit();
}
}
diff --git a/includes/actions/HistoryAction.php b/includes/actions/HistoryAction.php
index 245a5bdc..e58791ea 100644
--- a/includes/actions/HistoryAction.php
+++ b/includes/actions/HistoryAction.php
@@ -115,7 +115,7 @@ class HistoryAction extends FormlessAction {
// Setup page variables.
$out->setFeedAppendQuery( 'action=history' );
- $out->addModules( array( 'mediawiki.legacy.history', 'mediawiki.action.history' ) );
+ $out->addModules( 'mediawiki.action.history' );
// Handle atom/RSS feeds.
$feedType = $request->getVal( 'feed' );
@@ -178,7 +178,7 @@ class HistoryAction extends FormlessAction {
) .
Html::hidden( 'title', $this->getTitle()->getPrefixedDBkey() ) . "\n" .
Html::hidden( 'action', 'history' ) . "\n" .
- Xml::dateMenu( ( $year == null ? date( "Y" ) : $year ), $month ) . '&#160;' .
+ Xml::dateMenu( ( $year == null ? MWTimestamp::getLocalInstance()->format( 'Y' ) : $year ), $month ) . '&#160;' .
( $tagSelector ? ( implode( '&#160;', $tagSelector ) . '&#160;' ) : '' ) .
$checkDeleted .
Xml::submitButton( $this->msg( 'allpagessubmit' )->text() ) . "\n" .
@@ -211,7 +211,7 @@ class HistoryAction extends FormlessAction {
*/
function fetchRevisions( $limit, $offset, $direction ) {
// Fail if article doesn't exist.
- if( !$this->getTitle()->exists() ) {
+ if ( !$this->getTitle()->exists() ) {
return new FakeResultWrapper( array() );
}
@@ -256,15 +256,14 @@ class HistoryAction extends FormlessAction {
$this->getTitle()->getPrefixedText() . ' - ' .
$this->msg( 'history-feed-title' )->inContentLanguage()->text(),
$this->msg( 'history-feed-description' )->inContentLanguage()->text(),
- $this->getTitle()->getFullUrl( 'action=history' )
+ $this->getTitle()->getFullURL( 'action=history' )
);
// Get a limit on number of feed entries. Provide a sane default
// of 10 if none is defined (but limit to $wgFeedLimit max)
$limit = $request->getInt( 'limit', 10 );
- if ( $limit > $wgFeedLimit || $limit < 1 ) {
- $limit = 10;
- }
+ $limit = min( max( $limit, 1 ), $wgFeedLimit );
+
$items = $this->fetchRevisions( $limit, 0, HistoryPage::DIR_NEXT );
// Generate feed elements enclosed between header and footer.
@@ -283,10 +282,10 @@ class HistoryAction extends FormlessAction {
return new FeedItem(
$this->msg( 'nohistory' )->inContentLanguage()->text(),
$this->msg( 'history-feed-empty' )->inContentLanguage()->parseAsBlock(),
- $this->getTitle()->getFullUrl(),
+ $this->getTitle()->getFullURL(),
wfTimestamp( TS_MW ),
'',
- $this->getTitle()->getTalkPage()->getFullUrl()
+ $this->getTitle()->getTalkPage()->getFullURL()
);
}
@@ -323,10 +322,10 @@ class HistoryAction extends FormlessAction {
return new FeedItem(
$title,
$text,
- $this->getTitle()->getFullUrl( 'diff=' . $rev->getId() . '&oldid=prev' ),
+ $this->getTitle()->getFullURL( 'diff=' . $rev->getId() . '&oldid=prev' ),
$rev->getTimestamp(),
$rev->getUserText(),
- $this->getTitle()->getTalkPage()->getFullUrl()
+ $this->getTitle()->getTalkPage()->getFullURL()
);
}
}
@@ -367,15 +366,13 @@ class HistoryPager extends ReverseChronologicalPager {
function getQueryInfo() {
$queryInfo = array(
- 'tables' => array( 'revision', 'user' ),
- 'fields' => array_merge( Revision::selectFields(), Revision::selectUserFields() ),
- 'conds' => array_merge(
+ 'tables' => array( 'revision', 'user' ),
+ 'fields' => array_merge( Revision::selectFields(), Revision::selectUserFields() ),
+ 'conds' => array_merge(
array( 'rev_page' => $this->getWikiPage()->getId() ),
$this->conds ),
'options' => array( 'USE INDEX' => array( 'revision' => 'page_timestamp' ) ),
- 'join_conds' => array(
- 'user' => Revision::userJoinCond(),
- 'tag_summary' => array( 'LEFT JOIN', 'ts_rev_id=rev_id' ) ),
+ 'join_conds' => array( 'user' => Revision::userJoinCond() ),
);
ChangeTags::modifyDisplayQuery(
$queryInfo['tables'],
@@ -413,10 +410,10 @@ class HistoryPager extends ReverseChronologicalPager {
$batch = new LinkBatch();
$revIds = array();
foreach ( $this->mResult as $row ) {
- if( $row->rev_parent_id ) {
+ if ( $row->rev_parent_id ) {
$revIds[] = $row->rev_parent_id;
}
- if( !is_null( $row->user_name ) ) {
+ if ( !is_null( $row->user_name ) ) {
$batch->add( NS_USER, $row->user_name );
$batch->add( NS_USER_TALK, $row->user_name );
} else { # for anons or usernames of imported revisions
@@ -649,9 +646,9 @@ class HistoryPager extends ReverseChronologicalPager {
$this->msg( 'editundo' )->escaped(),
$undoTooltip,
array(
- 'action' => 'edit',
+ 'action' => 'edit',
'undoafter' => $prevRev->getId(),
- 'undo' => $rev->getId()
+ 'undo' => $rev->getId()
)
);
$tools[] = "<span class=\"mw-history-undo\">{$undolink}</span>";
@@ -661,7 +658,7 @@ class HistoryPager extends ReverseChronologicalPager {
wfRunHooks( 'HistoryRevisionTools', array( $rev, &$tools ) );
if ( $tools ) {
- $s2 .= ' '. $this->msg( 'parentheses' )->rawParams( $lang->pipeList( $tools ) )->escaped();
+ $s2 .= ' ' . $this->msg( 'parentheses' )->rawParams( $lang->pipeList( $tools ) )->escaped();
}
# Tags
@@ -788,13 +785,13 @@ class HistoryPager extends ReverseChronologicalPager {
function diffButtons( $rev, $firstInList ) {
if ( $this->getNumRows() > 1 ) {
$id = $rev->getId();
- $radio = array( 'type' => 'radio', 'value' => $id );
- /** @todo: move title texts to javascript */
+ $radio = array( 'type' => 'radio', 'value' => $id );
+ /** @todo Move title texts to javascript */
if ( $firstInList ) {
$first = Xml::element( 'input',
array_merge( $radio, array(
'style' => 'visibility:hidden',
- 'name' => 'oldid',
+ 'name' => 'oldid',
'id' => 'mw-oldid-null' ) )
);
$checkmark = array( 'checked' => 'checked' );
@@ -811,13 +808,13 @@ class HistoryPager extends ReverseChronologicalPager {
}
$first = Xml::element( 'input',
array_merge( $radio, $checkmark, array(
- 'name' => 'oldid',
+ 'name' => 'oldid',
'id' => "mw-oldid-$id" ) ) );
$checkmark = array();
}
$second = Xml::element( 'input',
array_merge( $radio, $checkmark, array(
- 'name' => 'diff',
+ 'name' => 'diff',
'id' => "mw-diff-$id" ) ) );
return $first . $second;
} else {
diff --git a/includes/actions/InfoAction.php b/includes/actions/InfoAction.php
index 1e312d7a..7fc90339 100644
--- a/includes/actions/InfoAction.php
+++ b/includes/actions/InfoAction.php
@@ -28,6 +28,8 @@
* @ingroup Actions
*/
class InfoAction extends FormlessAction {
+ const CACHE_VERSION = '2013-03-17';
+
/**
* Returns the name of the action this object responds to.
*
@@ -56,6 +58,22 @@ class InfoAction extends FormlessAction {
}
/**
+ * Clear the info cache for a given Title.
+ *
+ * @since 1.22
+ * @param Title $title Title to clear cache for
+ */
+ public static function invalidateCache( Title $title ) {
+ global $wgMemc;
+ // Clear page info.
+ $revision = WikiPage::factory( $title )->getRevision();
+ if ( $revision !== null ) {
+ $key = wfMemcKey( 'infoaction', sha1( $title->getPrefixedText() ), $revision->getId() );
+ $wgMemc->delete( $key );
+ }
+ }
+
+ /**
* Shows page information on GET request.
*
* @return string Page information that will be added to the output
@@ -100,12 +118,16 @@ class InfoAction extends FormlessAction {
// Render page information
foreach ( $pageInfo as $header => $infoTable ) {
+ // Messages:
+ // pageinfo-header-basic, pageinfo-header-edits, pageinfo-header-restrictions,
+ // pageinfo-header-properties, pageinfo-category-info
$content .= $this->makeHeader( $this->msg( "pageinfo-${header}" )->escaped() ) . "\n";
$table = "\n";
foreach ( $infoTable as $infoRow ) {
$name = ( $infoRow[0] instanceof Message ) ? $infoRow[0]->escaped() : $infoRow[0];
$value = ( $infoRow[1] instanceof Message ) ? $infoRow[1]->escaped() : $infoRow[1];
- $table = $this->addRow( $table, $name, $value ) . "\n";
+ $id = ( $infoRow[0] instanceof Message ) ? $infoRow[0]->getKey() : null;
+ $table = $this->addRow( $table, $name, $value, $id ) . "\n";
}
$content = $this->addTable( $content, $table ) . "\n";
}
@@ -126,7 +148,7 @@ class InfoAction extends FormlessAction {
/**
* Creates a header that can be added to the output.
*
- * @param $header The header text.
+ * @param string $header The header text.
* @return string The HTML.
*/
protected function makeHeader( $header ) {
@@ -140,10 +162,11 @@ class InfoAction extends FormlessAction {
* @param string $table The table that will be added to the content
* @param string $name The name of the row
* @param string $value The value of the row
+ * @param string $id The ID to use for the 'tr' element
* @return string The table with the row added
*/
- protected function addRow( $table, $name, $value ) {
- return $table . Html::rawElement( 'tr', array(),
+ protected function addRow( $table, $name, $value, $id ) {
+ return $table . Html::rawElement( 'tr', $id === null ? array() : array( 'id' => 'mw-' . $id ),
Html::rawElement( 'td', array( 'style' => 'vertical-align: top;' ), $name ) .
Html::rawElement( 'td', array(), $value )
);
@@ -169,18 +192,22 @@ class InfoAction extends FormlessAction {
* @return array
*/
protected function pageInfo() {
- global $wgContLang, $wgRCMaxAge, $wgMemc, $wgUnwatchedPageThreshold, $wgPageInfoTransclusionLimit;
+ global $wgContLang, $wgRCMaxAge, $wgMemc,
+ $wgUnwatchedPageThreshold, $wgPageInfoTransclusionLimit;
$user = $this->getUser();
$lang = $this->getLanguage();
$title = $this->getTitle();
$id = $title->getArticleID();
- $memcKey = wfMemcKey( 'infoaction', sha1( $title->getPrefixedText() ), $this->page->getLatest() );
+ $memcKey = wfMemcKey( 'infoaction',
+ sha1( $title->getPrefixedText() ), $this->page->getLatest() );
$pageCounts = $wgMemc->get( $memcKey );
- if ( $pageCounts === false ) {
+ $version = isset( $pageCounts['cacheversion'] ) ? $pageCounts['cacheversion'] : false;
+ if ( $pageCounts === false || $version !== self::CACHE_VERSION ) {
// Get page information that would be too "expensive" to retrieve by normal means
$pageCounts = self::pageCounts( $title );
+ $pageCounts['cacheversion'] = self::CACHE_VERSION;
$wgMemc->set( $memcKey, $pageCounts );
}
@@ -229,7 +256,7 @@ class InfoAction extends FormlessAction {
}
// Default sort key
- $sortKey = $title->getCategorySortKey();
+ $sortKey = $title->getCategorySortkey();
if ( !empty( $pageProperties['defaultsort'] ) ) {
$sortKey = $pageProperties['defaultsort'];
}
@@ -259,6 +286,7 @@ class InfoAction extends FormlessAction {
// Use robot policy logic
$policy = $this->page->getRobotPolicy( 'view', $pOutput );
$pageInfo['header-basic'][] = array(
+ // Messages: pageinfo-robot-index, pageinfo-robot-noindex
$this->msg( 'pageinfo-robot-policy' ), $this->msg( "pageinfo-robot-${policy['index']}" )
);
@@ -373,6 +401,7 @@ class InfoAction extends FormlessAction {
$message = $this->msg( 'protect-default' )->escaped();
} else {
// Administrators only
+ // Messages: protect-level-autoconfirmed, protect-level-sysop
$message = $this->msg( "protect-level-$protectionLevel" );
if ( $message->isDisabled() ) {
// Require "$1" permission
@@ -382,6 +411,8 @@ class InfoAction extends FormlessAction {
}
}
+ // Messages: restriction-edit, restriction-move, restriction-create,
+ // restriction-upload
$pageInfo['header-restrictions'][] = array(
$this->msg( "restriction-$restrictionType" ), $message
);
@@ -587,7 +618,7 @@ class InfoAction extends FormlessAction {
if ( !$wgDisableCounters ) {
// Number of views
- $views = (int) $dbr->selectField(
+ $views = (int)$dbr->selectField(
'page',
'page_counter',
array( 'page_id' => $id ),
@@ -597,19 +628,19 @@ class InfoAction extends FormlessAction {
}
// Number of page watchers
- $watchers = (int) $dbr->selectField(
+ $watchers = (int)$dbr->selectField(
'watchlist',
'COUNT(*)',
array(
'wl_namespace' => $title->getNamespace(),
- 'wl_title' => $title->getDBkey(),
+ 'wl_title' => $title->getDBkey(),
),
__METHOD__
);
$result['watchers'] = $watchers;
// Total number of edits
- $edits = (int) $dbr->selectField(
+ $edits = (int)$dbr->selectField(
'revision',
'COUNT(rev_page)',
array( 'rev_page' => $id ),
@@ -618,7 +649,7 @@ class InfoAction extends FormlessAction {
$result['edits'] = $edits;
// Total number of distinct authors
- $authors = (int) $dbr->selectField(
+ $authors = (int)$dbr->selectField(
'revision',
'COUNT(DISTINCT rev_user_text)',
array( 'rev_page' => $id ),
@@ -630,7 +661,7 @@ class InfoAction extends FormlessAction {
$threshold = $dbr->timestamp( time() - $wgRCMaxAge );
// Recent number of edits
- $edits = (int) $dbr->selectField(
+ $edits = (int)$dbr->selectField(
'revision',
'COUNT(rev_page)',
array(
@@ -642,7 +673,7 @@ class InfoAction extends FormlessAction {
$result['recent_edits'] = $edits;
// Recent number of distinct authors
- $authors = (int) $dbr->selectField(
+ $authors = (int)$dbr->selectField(
'revision',
'COUNT(DISTINCT rev_user_text)',
array(
@@ -660,7 +691,7 @@ class InfoAction extends FormlessAction {
// Subpages of this page (redirects)
$conds['page_is_redirect'] = 1;
- $result['subpages']['redirects'] = (int) $dbr->selectField(
+ $result['subpages']['redirects'] = (int)$dbr->selectField(
'page',
'COUNT(page_id)',
$conds,
@@ -668,7 +699,7 @@ class InfoAction extends FormlessAction {
// Subpages of this page (non-redirects)
$conds['page_is_redirect'] = 0;
- $result['subpages']['nonredirects'] = (int) $dbr->selectField(
+ $result['subpages']['nonredirects'] = (int)$dbr->selectField(
'page',
'COUNT(page_id)',
$conds,
@@ -681,7 +712,7 @@ class InfoAction extends FormlessAction {
}
// Counts for the number of transclusion links (to/from)
- $result['transclusion']['to'] = (int) $dbr->selectField(
+ $result['transclusion']['to'] = (int)$dbr->selectField(
'templatelinks',
'COUNT(tl_from)',
array(
@@ -691,7 +722,7 @@ class InfoAction extends FormlessAction {
__METHOD__
);
- $result['transclusion']['from'] = (int) $dbr->selectField(
+ $result['transclusion']['from'] = (int)$dbr->selectField(
'templatelinks',
'COUNT(*)',
array( 'tl_from' => $title->getArticleID() ),
diff --git a/includes/actions/PurgeAction.php b/includes/actions/PurgeAction.php
index 00bb961d..ed0bff7b 100644
--- a/includes/actions/PurgeAction.php
+++ b/includes/actions/PurgeAction.php
@@ -71,7 +71,7 @@ class PurgeAction extends FormAction {
$this->getRequest()->getQueryValues(),
array( 'title' => null, 'action' => null )
) );
- if( $this->onSubmit( array() ) ) {
+ if ( $this->onSubmit( array() ) ) {
$this->onSuccess();
}
} else {
@@ -96,6 +96,6 @@ class PurgeAction extends FormAction {
}
public function onSuccess() {
- $this->getOutput()->redirect( $this->getTitle()->getFullUrl( $this->redirectParams ) );
+ $this->getOutput()->redirect( $this->getTitle()->getFullURL( $this->redirectParams ) );
}
}
diff --git a/includes/actions/RawAction.php b/includes/actions/RawAction.php
index 12ce9f98..32751e45 100644
--- a/includes/actions/RawAction.php
+++ b/includes/actions/RawAction.php
@@ -48,7 +48,7 @@ class RawAction extends FormlessAction {
}
function onView() {
- global $wgSquidMaxage, $wgForcedRawSMaxage, $wgJsMimeType;
+ global $wgSquidMaxage, $wgForcedRawSMaxage;
$this->getOutput()->disable();
$request = $this->getRequest();
@@ -79,7 +79,7 @@ class RawAction extends FormlessAction {
# Force caching for CSS and JS raw content, default: 5 minutes
if ( $smaxage === null ) {
- if ( $contentType == 'text/css' || $contentType == $wgJsMimeType ) {
+ if ( $contentType == 'text/css' || $contentType == 'text/javascript' ) {
$smaxage = intval( $wgForcedRawSMaxage );
} else {
$smaxage = 0;
@@ -93,10 +93,7 @@ class RawAction extends FormlessAction {
$response->header( 'Content-type: ' . $contentType . '; charset=UTF-8' );
# Output may contain user-specific data;
# vary generated content for open sessions on private wikis
- $privateCache = !User::groupHasPermission( '*', 'read' ) && ( $smaxage == 0 || session_id() != '' );
- // Bug 53032 - make this private if user is logged in,
- // so we don't accidentally cache cookies
- $privateCache = $privateCache ?: $this->getUser()->isLoggedIn();
+ $privateCache = !User::isEveryoneAllowed( 'read' ) && ( $smaxage == 0 || session_id() != '' );
# allow the client to cache this for 24 hours
$mode = $privateCache ? 'private' : 'public';
$response->header( 'Cache-Control: ' . $mode . ', s-maxage=' . $smaxage . ', max-age=' . $maxage );
@@ -128,7 +125,7 @@ class RawAction extends FormlessAction {
global $wgParser;
# No longer used
- if( $this->mGen ) {
+ if ( $this->mGen ) {
return '';
}
@@ -197,18 +194,18 @@ class RawAction extends FormlessAction {
switch ( $this->getRequest()->getText( 'direction' ) ) {
case 'next':
# output next revision, or nothing if there isn't one
- if( $oldid ) {
- $oldid = $this->getTitle()->getNextRevisionId( $oldid );
+ if ( $oldid ) {
+ $oldid = $this->getTitle()->getNextRevisionID( $oldid );
}
$oldid = $oldid ? $oldid : -1;
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
$oldid = $this->page->getLatest();
}
- $prev = $this->getTitle()->getPreviousRevisionId( $oldid );
+ $prev = $this->getTitle()->getPreviousRevisionID( $oldid );
$oldid = $prev ? $prev : -1;
break;
case 'cur':
@@ -224,20 +221,18 @@ class RawAction extends FormlessAction {
* @return String
*/
public function getContentType() {
- global $wgJsMimeType;
-
$ctype = $this->getRequest()->getVal( 'ctype' );
if ( $ctype == '' ) {
$gen = $this->getRequest()->getVal( 'gen' );
if ( $gen == 'js' ) {
- $ctype = $wgJsMimeType;
+ $ctype = 'text/javascript';
} elseif ( $gen == 'css' ) {
$ctype = 'text/css';
}
}
- $allowedCTypes = array( 'text/x-wiki', $wgJsMimeType, 'text/css', 'application/x-zope-edit' );
+ $allowedCTypes = array( 'text/x-wiki', 'text/javascript', 'text/css', 'application/x-zope-edit' );
if ( $ctype == '' || !in_array( $ctype, $allowedCTypes ) ) {
$ctype = 'text/x-wiki';
}
@@ -254,6 +249,10 @@ class RawAction extends FormlessAction {
class RawPage extends RawAction {
public $mOldId;
+ /**
+ * @param Page $page
+ * @param WebRequest|bool $request The WebRequest (default: false).
+ */
function __construct( Page $page, $request = false ) {
wfDeprecated( __CLASS__, '1.19' );
parent::__construct( $page );
diff --git a/includes/actions/WatchAction.php b/includes/actions/WatchAction.php
index ae5f76c6..929c1b5f 100644
--- a/includes/actions/WatchAction.php
+++ b/includes/actions/WatchAction.php
@@ -87,24 +87,72 @@ class WatchAction extends FormAction {
return parent::checkCanExecute( $user );
}
- public static function doWatch( Title $title, User $user ) {
+ /**
+ * Watch or unwatch a page
+ * @since 1.22
+ * @param bool $watch Whether to watch or unwatch the page
+ * @param Title $title Page to watch/unwatch
+ * @param User $user User who is watching/unwatching
+ * @return Status
+ */
+ public static function doWatchOrUnwatch( $watch, Title $title, User $user ) {
+ if ( $user->isLoggedIn() && $user->isWatched( $title, WatchedItem::IGNORE_USER_RIGHTS ) != $watch ) {
+ // If the user doesn't have 'editmywatchlist', we still want to
+ // allow them to add but not remove items via edits and such.
+ if ( $watch ) {
+ return self::doWatch( $title, $user, WatchedItem::IGNORE_USER_RIGHTS );
+ } else {
+ return self::doUnwatch( $title, $user );
+ }
+ }
+ return Status::newGood();
+ }
+
+ /**
+ * Watch a page
+ * @since 1.22 Returns Status, $checkRights parameter added
+ * @param Title $title Page to watch/unwatch
+ * @param User $user User who is watching/unwatching
+ * @param int $checkRights Passed through to $user->addWatch()
+ * @return Status
+ */
+ public static function doWatch( Title $title, User $user, $checkRights = WatchedItem::CHECK_USER_RIGHTS ) {
+ if ( $checkRights !== WatchedItem::IGNORE_USER_RIGHTS && !$user->isAllowed( 'editmywatchlist' ) ) {
+ return User::newFatalPermissionDeniedStatus( 'editmywatchlist' );
+ }
+
$page = WikiPage::factory( $title );
- if ( wfRunHooks( 'WatchArticle', array( &$user, &$page ) ) ) {
- $user->addWatch( $title );
+ $status = Status::newFatal( 'hookaborted' );
+ if ( wfRunHooks( 'WatchArticle', array( &$user, &$page, &$status ) ) ) {
+ $status = Status::newGood();
+ $user->addWatch( $title, $checkRights );
wfRunHooks( 'WatchArticleComplete', array( &$user, &$page ) );
}
- return true;
+ return $status;
}
- public static function doUnwatch( Title $title, User $user ) {
+ /**
+ * Unwatch a page
+ * @since 1.22 Returns Status
+ * @param Title $title Page to watch/unwatch
+ * @param User $user User who is watching/unwatching
+ * @return Status
+ */
+ public static function doUnwatch( Title $title, User $user ) {
+ if ( !$user->isAllowed( 'editmywatchlist' ) ) {
+ return User::newFatalPermissionDeniedStatus( 'editmywatchlist' );
+ }
+
$page = WikiPage::factory( $title );
- if ( wfRunHooks( 'UnwatchArticle', array( &$user, &$page ) ) ) {
+ $status = Status::newFatal( 'hookaborted' );
+ if ( wfRunHooks( 'UnwatchArticle', array( &$user, &$page, &$status ) ) ) {
+ $status = Status::newGood();
$user->removeWatch( $title );
wfRunHooks( 'UnwatchArticleComplete', array( &$user, &$page ) );
}
- return true;
+ return $status;
}
/**
diff --git a/includes/api/ApiBase.php b/includes/api/ApiBase.php
index 9351a8d8..ce6ecda6 100644
--- a/includes/api/ApiBase.php
+++ b/includes/api/ApiBase.php
@@ -304,15 +304,14 @@ abstract class ApiBase extends ContextSource {
}
$examples = $this->getExamples();
- if ( $examples !== false && $examples !== '' ) {
+ if ( $examples ) {
if ( !is_array( $examples ) ) {
$examples = array(
$examples
);
}
$msg .= "Example" . ( count( $examples ) > 1 ? 's' : '' ) . ":\n";
- foreach( $examples as $k => $v ) {
-
+ foreach ( $examples as $k => $v ) {
if ( is_numeric( $k ) ) {
$msg .= " $v\n";
} else {
@@ -445,7 +444,7 @@ abstract class ApiBase extends ContextSource {
$hintPipeSeparated = false;
break;
case 'limit':
- $desc .= $paramPrefix . "No more than {$paramSettings[self :: PARAM_MAX]}";
+ $desc .= $paramPrefix . "No more than {$paramSettings[self::PARAM_MAX]}";
if ( isset( $paramSettings[self::PARAM_MAX2] ) ) {
$desc .= " ({$paramSettings[self::PARAM_MAX2]} for bots)";
}
@@ -689,9 +688,9 @@ abstract class ApiBase extends ContextSource {
array( $this, "parameterNotEmpty" ) ) ), $required );
if ( count( $intersection ) > 1 ) {
- $this->dieUsage( "The parameters {$p}" . implode( ", {$p}", $intersection ) . ' can not be used together', "{$p}invalidparammix" );
+ $this->dieUsage( "The parameters {$p}" . implode( ", {$p}", $intersection ) . ' can not be used together', 'invalidparammix' );
} elseif ( count( $intersection ) == 0 ) {
- $this->dieUsage( "One of the parameters {$p}" . implode( ", {$p}", $required ) . ' is required', "{$p}missingparam" );
+ $this->dieUsage( "One of the parameters {$p}" . implode( ", {$p}", $required ) . ' is required', 'missingparam' );
}
}
@@ -725,7 +724,7 @@ abstract class ApiBase extends ContextSource {
array( $this, "parameterNotEmpty" ) ) ), $required );
if ( count( $intersection ) > 1 ) {
- $this->dieUsage( "The parameters {$p}" . implode( ", {$p}", $intersection ) . ' can not be used together', "{$p}invalidparammix" );
+ $this->dieUsage( "The parameters {$p}" . implode( ", {$p}", $intersection ) . ' can not be used together', 'invalidparammix' );
}
}
@@ -822,9 +821,9 @@ abstract class ApiBase extends ContextSource {
* If not set will magically default to either watchdefault or watchcreations
* @return bool
*/
- protected function getWatchlistValue ( $watchlist, $titleObj, $userOption = null ) {
+ protected function getWatchlistValue( $watchlist, $titleObj, $userOption = null ) {
- $userWatching = $this->getUser()->isWatched( $titleObj );
+ $userWatching = $this->getUser()->isWatched( $titleObj, WatchedItem::IGNORE_USER_RIGHTS );
switch ( $watchlist ) {
case 'watch':
@@ -866,12 +865,7 @@ abstract class ApiBase extends ContextSource {
return;
}
- $user = $this->getUser();
- if ( $value ) {
- WatchAction::doWatch( $titleObj, $user );
- } else {
- WatchAction::doUnwatch( $titleObj, $user );
- }
+ WatchAction::doWatchOrUnwatch( $value, $titleObj, $this->getUser() );
}
/**
@@ -967,9 +961,9 @@ abstract class ApiBase extends ContextSource {
}
break;
case 'integer': // Force everything using intval() and optionally validate limits
- $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] )
+ $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_array( $value ) ) {
@@ -1081,7 +1075,7 @@ abstract class ApiBase extends ContextSource {
if ( !$allowMultiple && count( $valuesList ) != 1 ) {
// Bug 33482 - Allow entries with | in them for non-multiple values
- if ( in_array( $value, $allowedValues ) ) {
+ if ( in_array( $value, $allowedValues, true ) ) {
return $value;
}
@@ -1165,7 +1159,7 @@ abstract class ApiBase extends ContextSource {
/**
* Validate and normalize of parameters of type 'user'
* @param string $value Parameter value
- * @param string $encParamName Parameter value
+ * @param string $encParamName Parameter name
* @return string Validated and normalized parameter
*/
private function validateUser( $value, $encParamName ) {
@@ -1223,6 +1217,44 @@ abstract class ApiBase extends ContextSource {
}
/**
+ * Throw a UsageException based on the errors in the Status object.
+ *
+ * @since 1.22
+ * @param Status $status Status object
+ * @throws UsageException
+ */
+ public function dieStatus( $status ) {
+ if ( $status->isGood() ) {
+ throw new MWException( 'Successful status passed to ApiBase::dieStatus' );
+ }
+
+ $errors = $status->getErrorsArray();
+ if ( !$errors ) {
+ // No errors? Assume the warnings should be treated as errors
+ $errors = $status->getWarningsArray();
+ }
+ if ( !$errors ) {
+ // Still no errors? Punt
+ $errors = array( array( 'unknownerror-nocode' ) );
+ }
+
+ // Cannot use dieUsageMsg() because extensions might return custom
+ // error messages.
+ if ( $errors[0] instanceof Message ) {
+ $msg = $errors[0];
+ $code = $msg->getKey();
+ } else {
+ $code = array_shift( $errors[0] );
+ $msg = wfMessage( $code, $errors[0] );
+ }
+ if ( isset( ApiBase::$messageMap[$code] ) ) {
+ // Translate message to code, for backwards compatability
+ $code = ApiBase::$messageMap[$code]['code'];
+ }
+ $this->dieUsage( $msg->inLanguage( 'en' )->useDatabase( false )->plain(), $code );
+ }
+
+ /**
* Array that maps message keys to error messages. $1 and friends are replaced.
*/
public static $messageMap = array(
@@ -1372,6 +1404,7 @@ abstract class ApiBase extends ContextSource {
'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.' ),
'copyuploadbaddomain' => array( 'code' => 'copyuploadbaddomain', 'info' => 'Uploads by URL are not allowed from this domain.' ),
+ 'copyuploadbadurl' => array( 'code' => 'copyuploadbadurl', 'info' => 'Upload not allowed from this URL.' ),
'filename-tooshort' => array( 'code' => 'filename-tooshort', 'info' => 'The filename is too short' ),
'filename-toolong' => array( 'code' => 'filename-toolong', 'info' => 'The filename is too long' ),
@@ -1397,7 +1430,7 @@ abstract class ApiBase extends ContextSource {
public function dieUsageMsg( $error ) {
# most of the time we send a 1 element, so we might as well send it as
# a string and make this an array here.
- if( is_string( $error ) ) {
+ if ( is_string( $error ) ) {
$error = array( $error );
}
$parsed = $this->parseMsg( $error );
@@ -1412,10 +1445,10 @@ abstract class ApiBase extends ContextSource {
*/
public function dieUsageMsgOrDebug( $error ) {
global $wgDebugAPI;
- if( $wgDebugAPI !== true ) {
+ if ( $wgDebugAPI !== true ) {
$this->dieUsageMsg( $error );
} else {
- if( is_string( $error ) ) {
+ if ( is_string( $error ) ) {
$error = array( $error );
}
$parsed = $this->parseMsg( $error );
@@ -1448,7 +1481,7 @@ abstract class ApiBase extends ContextSource {
// Check whether the error array was nested
// array( array( <code>, <params> ), array( <another_code>, <params> ) )
- if( is_array( $key ) ) {
+ if ( is_array( $key ) ) {
$error = $key;
$key = array_shift( $error );
}
@@ -1470,7 +1503,7 @@ abstract class ApiBase extends ContextSource {
* @param string $message Error message
*/
protected static function dieDebug( $method, $message ) {
- wfDebugDieBacktrace( "Internal error in $method: $message" );
+ throw new MWException( "Internal error in $method: $message" );
}
/**
@@ -1535,7 +1568,7 @@ abstract class ApiBase extends ContextSource {
public function getWatchlistUser( $params ) {
if ( !is_null( $params['owner'] ) && !is_null( $params['token'] ) ) {
$user = User::newFromName( $params['owner'], false );
- if ( !($user && $user->getId()) ) {
+ if ( !( $user && $user->getId() ) ) {
$this->dieUsage( 'Specified user does not exist', 'bad_wlowner' );
}
$token = $user->getOption( 'watchlisttoken' );
@@ -1546,6 +1579,9 @@ abstract class ApiBase extends ContextSource {
if ( !$this->getUser()->isLoggedIn() ) {
$this->dieUsage( 'You must be logged-in to have a watchlist', 'notloggedin' );
}
+ if ( !$this->getUser()->isAllowed( 'viewmywatchlist' ) ) {
+ $this->dieUsage( 'You don\'t have permission to view your watchlist', 'permissiondenied' );
+ }
$user = $this->getUser();
}
return $user;
@@ -1560,6 +1596,10 @@ abstract class ApiBase extends ContextSource {
/**
* Returns a list of all possible errors returned by the module
+ *
+ * Don't call this function directly: use getFinalPossibleErrors() to allow
+ * hooks to modify parameters as needed.
+ *
* @return array in the format of array( key, param1, param2, ... ) or array( 'code' => ..., 'info' => ... )
*/
public function getPossibleErrors() {
@@ -1574,10 +1614,9 @@ abstract class ApiBase extends ContextSource {
}
if ( array_key_exists( 'continue', $params ) ) {
$ret[] = array(
- array(
- 'code' => 'badcontinue',
- 'info' => 'Invalid continue param. You should pass the original value returned by the previous query'
- ) );
+ 'code' => 'badcontinue',
+ 'info' => 'Invalid continue param. You should pass the original value returned by the previous query'
+ );
}
}
@@ -1595,7 +1634,12 @@ abstract class ApiBase extends ContextSource {
}
if ( $this->needsToken() ) {
- $ret[] = array( 'missingparam', 'token' );
+ if ( !isset( $params['token'][ApiBase::PARAM_REQUIRED] )
+ || !$params['token'][ApiBase::PARAM_REQUIRED]
+ ) {
+ // Add token as possible missing parameter, if not already done
+ $ret[] = array( 'missingparam', 'token' );
+ }
$ret[] = array( 'sessionfailure' );
}
@@ -1603,6 +1647,19 @@ abstract class ApiBase extends ContextSource {
}
/**
+ * Get final list of possible errors, after hooks have had a chance to
+ * tweak it as needed.
+ *
+ * @return array
+ * @since 1.22
+ */
+ public function getFinalPossibleErrors() {
+ $possibleErrors = $this->getPossibleErrors();
+ wfRunHooks( 'APIGetPossibleErrors', array( $this, &$possibleErrors ) );
+ return $possibleErrors;
+ }
+
+ /**
* Parses a list of errors into a standardised format
* @param array $errors List of errors. Items can be in the for array( key, param1, param2, ... ) or array( 'code' => ..., 'info' => ... )
* @return array Parsed list of errors with items in the form array( 'code' => ..., 'info' => ... )
diff --git a/includes/api/ApiBlock.php b/includes/api/ApiBlock.php
index 6f3d1e4f..975153ac 100644
--- a/includes/api/ApiBlock.php
+++ b/includes/api/ApiBlock.php
@@ -98,7 +98,7 @@ class ApiBlock extends ApiBase {
$res['userID'] = $target instanceof User ? $target->getId() : 0;
$block = Block::newFromTarget( $target );
- if( $block instanceof Block ) {
+ if ( $block instanceof Block ) {
$res['expiry'] = $block->mExpiry == $this->getDB()->getInfinity()
? 'infinite'
: wfTimestamp( TS_ISO_8601, $block->mExpiry );
diff --git a/includes/api/ApiComparePages.php b/includes/api/ApiComparePages.php
index 79ffcb0a..1e35c349 100644
--- a/includes/api/ApiComparePages.php
+++ b/includes/api/ApiComparePages.php
@@ -81,17 +81,17 @@ class ApiComparePages extends ApiBase {
* @return int
*/
private function revisionOrTitleOrId( $revision, $titleText, $titleId ) {
- if( $revision ) {
+ if ( $revision ) {
return $revision;
- } elseif( $titleText ) {
+ } elseif ( $titleText ) {
$title = Title::newFromText( $titleText );
- if( !$title || $title->isExternal() ) {
+ if ( !$title || $title->isExternal() ) {
$this->dieUsageMsg( array( 'invalidtitle', $titleText ) );
}
return $title->getLatestRevID();
} elseif ( $titleId ) {
$title = Title::newFromID( $titleId );
- if( !$title ) {
+ if ( !$title ) {
$this->dieUsageMsg( array( 'nosuchpageid', $titleId ) );
}
return $title->getLatestRevID();
diff --git a/includes/api/ApiCreateAccount.php b/includes/api/ApiCreateAccount.php
index 69748c93..0e752c56 100644
--- a/includes/api/ApiCreateAccount.php
+++ b/includes/api/ApiCreateAccount.php
@@ -47,17 +47,19 @@ class ApiCreateAccount extends ApiBase {
$params = $this->extractRequestParams();
- $result = array();
-
// Init session if necessary
if ( session_id() == '' ) {
wfSetupSession();
}
- if( $params['mailpassword'] && !$params['email'] ) {
+ if ( $params['mailpassword'] && !$params['email'] ) {
$this->dieUsageMsg( 'noemail' );
}
+ if ( $params['language'] && !Language::isSupportedLanguage( $params['language'] ) ) {
+ $this->dieUsage( 'Invalid language parameter', 'langinvalid' );
+ }
+
$context = new DerivativeContext( $this->getContext() );
$context->setRequest( new DerivativeRequest(
$this->getContext()->getRequest(),
@@ -82,22 +84,20 @@ class ApiCreateAccount extends ApiBase {
$status = $loginForm->addNewaccountInternal();
$result = array();
- if( $status->isGood() ) {
+ if ( $status->isGood() ) {
// Success!
+ global $wgEmailAuthentication;
$user = $status->getValue();
- // 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, $wgEmailAuthentication;
- if( $wgLoginLanguageSelector && $params['language'] ) {
+ if ( $params['language'] ) {
$user->setOption( 'language', $params['language'] );
}
- if( $params['mailpassword'] ) {
+ if ( $params['mailpassword'] ) {
// If mailpassword was set, disable the password and send an email.
$user->setPassword( null );
$status->merge( $loginForm->mailPasswordInternal( $user, false, 'createaccount-title', 'createaccount-text' ) );
- } elseif( $wgEmailAuthentication && Sanitizer::validateEmail( $user->getEmail() ) ) {
+ } elseif ( $wgEmailAuthentication && Sanitizer::validateEmail( $user->getEmail() ) ) {
// Send out an email authentication message if needed
$status->merge( $user->sendConfirmationMail() );
}
@@ -124,33 +124,23 @@ class ApiCreateAccount extends ApiBase {
$apiResult = $this->getResult();
- if( $status->hasMessage( 'sessionfailure' ) || $status->hasMessage( 'nocookiesfornew' ) ) {
+ if ( $status->hasMessage( 'sessionfailure' ) || $status->hasMessage( 'nocookiesfornew' ) ) {
// Token was incorrect, so add it to result, but don't throw an exception
// since not having the correct token is part of the normal
// flow of events.
$result['token'] = LoginForm::getCreateaccountToken();
$result['result'] = 'needtoken';
- } elseif( !$status->isOK() ) {
+ } elseif ( !$status->isOK() ) {
// There was an error. Die now.
- // Cannot use dieUsageMsg() directly because extensions
- // might return custom error messages.
- $errors = $status->getErrorsArray();
- if( $errors[0] instanceof Message ) {
- $code = 'aborted';
- $desc = $errors[0];
- } else {
- $code = array_shift( $errors[0] );
- $desc = wfMessage( $code, $errors[0] );
- }
- $this->dieUsage( $desc, $code );
- } elseif( !$status->isGood() ) {
+ $this->dieStatus( $status );
+ } elseif ( !$status->isGood() ) {
// Status is not good, but OK. This means warnings.
$result['result'] = 'warning';
// Add any warnings to the result
$warnings = $status->getErrorsByType( 'warning' );
- if( $warnings ) {
- foreach( $warnings as &$warning ) {
+ if ( $warnings ) {
+ foreach ( $warnings as &$warning ) {
$apiResult->setIndexedTagName( $warning['params'], 'param' );
}
$apiResult->setIndexedTagName( $warnings, 'warning' );
@@ -263,8 +253,8 @@ class ApiCreateAccount extends ApiBase {
$errors = parent::getPossibleErrors();
// All local errors are from LoginForm, which means they're actually message keys.
- foreach( $localErrors as $error ) {
- $errors[] = array( 'code' => $error, 'info' => wfMessage( $error )->parse() );
+ foreach ( $localErrors as $error ) {
+ $errors[] = array( 'code' => $error, 'info' => wfMessage( $error )->inLanguage( 'en' )->useDatabase( false )->parse() );
}
$errors[] = array(
@@ -279,12 +269,16 @@ class ApiCreateAccount extends ApiBase {
'code' => 'aborted',
'info' => 'Account creation aborted by hook (info may vary)'
);
+ $errors[] = array(
+ 'code' => 'langinvalid',
+ 'info' => 'Invalid language parameter'
+ );
// 'passwordtooshort' has parameters. :(
global $wgMinimalPasswordLength;
$errors[] = array(
'code' => 'passwordtooshort',
- 'info' => wfMessage( 'passwordtooshort', $wgMinimalPasswordLength )->parse()
+ 'info' => wfMessage( 'passwordtooshort', $wgMinimalPasswordLength )->inLanguage( 'en' )->useDatabase( false )->parse()
);
return $errors;
}
diff --git a/includes/api/ApiDelete.php b/includes/api/ApiDelete.php
index d1f0806e..aea10482 100644
--- a/includes/api/ApiDelete.php
+++ b/includes/api/ApiDelete.php
@@ -61,8 +61,7 @@ class ApiDelete extends ApiBase {
$this->dieUsageMsg( $status[0] );
}
if ( !$status->isGood() ) {
- $errors = $status->getErrorsArray();
- $this->dieUsageMsg( $errors[0] ); // We don't care about multiple errors, just report one of them
+ $this->dieStatus( $status );
}
// Deprecated parameters
diff --git a/includes/api/ApiEditPage.php b/includes/api/ApiEditPage.php
index 4916145b..bd61895b 100644
--- a/includes/api/ApiEditPage.php
+++ b/includes/api/ApiEditPage.php
@@ -100,7 +100,7 @@ class ApiEditPage extends ApiBase {
$name = $titleObj->getPrefixedDBkey();
$model = $contentHandler->getModelID();
- $this->dieUsage( "The requested format $contentFormat is not supported for content model ".
+ $this->dieUsage( "The requested format $contentFormat is not supported for content model " .
" $model used by $name", 'badformat' );
}
@@ -146,7 +146,7 @@ class ApiEditPage extends ApiBase {
}
}
- // @todo: Add support for appending/prepending to the Content interface
+ // @todo Add support for appending/prepending to the Content interface
if ( !( $content instanceof TextContent ) ) {
$mode = $contentHandler->getModelID();
@@ -159,12 +159,17 @@ class ApiEditPage extends ApiBase {
$this->dieUsage( "Sections are not supported for this content model: $modelName.", 'sectionsnotsupported' );
}
- // Process the content for section edits
- $section = intval( $params['section'] );
- $content = $content->getSection( $section );
+ if ( $params['section'] == 'new' ) {
+ // DWIM if they're trying to prepend/append to a new section.
+ $content = null;
+ } else {
+ // Process the content for section edits
+ $section = intval( $params['section'] );
+ $content = $content->getSection( $section );
- if ( !$content ) {
- $this->dieUsage( "There is no section {$section}.", 'nosuchsection' );
+ if ( !$content ) {
+ $this->dieUsage( "There is no section {$section}.", 'nosuchsection' );
+ }
}
}
@@ -262,7 +267,7 @@ class ApiEditPage extends ApiBase {
$requestArray['wpStarttime'] = wfTimestampNow(); // Fake wpStartime
}
- if ( $params['minor'] || ( !$params['notminor'] && $user->getOption( 'minordefault' ) ) ) {
+ if ( $params['minor'] || ( !$params['notminor'] && $user->getOption( 'minordefault' ) ) ) {
$requestArray['wpMinoredit'] = '';
}
@@ -275,6 +280,10 @@ class ApiEditPage extends ApiBase {
if ( $section == 0 && $params['section'] != '0' && $params['section'] != 'new' ) {
$this->dieUsage( "The section parameter must be set to an integer or 'new'", "invalidsection" );
}
+ $content = $pageObj->getContent();
+ if ( $section !== 0 && ( !$content || !$content->getSection( $section ) ) ) {
+ $this->dieUsage( "There is no section {$section}.", 'nosuchsection' );
+ }
$requestArray['wpSection'] = $params['section'];
} else {
$requestArray['wpSection'] = '';
@@ -293,6 +302,10 @@ class ApiEditPage extends ApiBase {
$requestArray['wpWatchthis'] = '';
}
+ // Pass through anything else we might have been given, to support extensions
+ // This is kind of a hack but it's the best we can do to make extensions work
+ $requestArray += $this->getRequest()->getValues();
+
global $wgTitle, $wgRequest;
$req = new DerivativeRequest( $this->getRequest(), $requestArray, true );
@@ -316,11 +329,37 @@ class ApiEditPage extends ApiBase {
$ep->setContextTitle( $titleObj );
$ep->importFormData( $req );
+ $content = $ep->textbox1;
+
+ // The following is needed to give the hook the full content of the
+ // new revision rather than just the current section. (Bug 52077)
+ if ( !is_null( $params['section'] ) && $contentHandler->supportsSections() && $titleObj->exists() ) {
+
+ $sectionTitle = '';
+ // If sectiontitle is set, use it, otherwise use the summary as the section title (for
+ // backwards compatibility with old forms/bots).
+ if ( $ep->sectiontitle !== '' ) {
+ $sectionTitle = $ep->sectiontitle;
+ } else {
+ $sectionTitle = $ep->summary;
+ }
+
+ $contentObj = $contentHandler->unserializeContent( $content, $contentFormat );
+
+ $fullContentObj = $articleObject->replaceSectionContent( $params['section'], $contentObj, $sectionTitle );
+ if ( $fullContentObj ) {
+ $content = $fullContentObj->serialize( $contentFormat );
+ } else {
+ // This most likely means we have an edit conflict which means that the edit
+ // wont succeed anyway.
+ $this->dieUsageMsg( 'editconflict' );
+ }
+ }
// Run hooks
// Handle APIEditBeforeSave parameters
$r = array();
- if ( !wfRunHooks( 'APIEditBeforeSave', array( $ep, $ep->textbox1, &$r ) ) ) {
+ if ( !wfRunHooks( 'APIEditBeforeSave', array( $ep, $content, &$r ) ) ) {
if ( count( $r ) ) {
$r['result'] = 'Failure';
$apiResult->addValue( null, $this->getModuleName(), $r );
@@ -342,7 +381,7 @@ class ApiEditPage extends ApiBase {
$wgRequest = $oldRequest;
global $wgMaxArticleSize;
- switch( $status->value ) {
+ switch ( $status->value ) {
case EditPage::AS_HOOK_ERROR:
case EditPage::AS_HOOK_ERROR_EXPECTED:
$this->dieUsageMsg( 'hookaborted' );
diff --git a/includes/api/ApiExpandTemplates.php b/includes/api/ApiExpandTemplates.php
index f5898fb3..d5c789c3 100644
--- a/includes/api/ApiExpandTemplates.php
+++ b/includes/api/ApiExpandTemplates.php
@@ -65,14 +65,14 @@ class ApiExpandTemplates extends ApiBase {
$xml = $dom->__toString();
}
$xml_result = array();
- $result->setContent( $xml_result, $xml );
+ ApiResult::setContent( $xml_result, $xml );
$result->addValue( null, 'parsetree', $xml_result );
}
$retval = $wgParser->preprocess( $params['text'], $title_obj, $options );
// Return result
$retval_array = array();
- $result->setContent( $retval_array, $retval );
+ ApiResult::setContent( $retval_array, $retval );
$result->addValue( null, $this->getModuleName(), $retval_array );
}
diff --git a/includes/api/ApiFeedContributions.php b/includes/api/ApiFeedContributions.php
index 015a9922..05691093 100644
--- a/includes/api/ApiFeedContributions.php
+++ b/includes/api/ApiFeedContributions.php
@@ -43,11 +43,11 @@ class ApiFeedContributions extends ApiBase {
global $wgFeed, $wgFeedClasses, $wgSitename, $wgLanguageCode;
- if( !$wgFeed ) {
+ if ( !$wgFeed ) {
$this->dieUsage( 'Syndication feeds are not available', 'feed-unavailable' );
}
- if( !isset( $wgFeedClasses[$params['feedformat']] ) ) {
+ if ( !isset( $wgFeedClasses[$params['feedformat']] ) ) {
$this->dieUsage( 'Invalid subscription feed type', 'feed-invalid' );
}
@@ -82,7 +82,7 @@ class ApiFeedContributions extends ApiBase {
) );
$feedItems = array();
- if( $pager->getNumRows() > 0 ) {
+ if ( $pager->getNumRows() > 0 ) {
foreach ( $pager->mResult as $row ) {
$feedItems[] = $this->feedItem( $row );
}
@@ -93,7 +93,7 @@ class ApiFeedContributions extends ApiBase {
protected function feedItem( $row ) {
$title = Title::makeTitle( intval( $row->page_namespace ), $row->page_title );
- if( $title ) {
+ if ( $title && $title->userCan( 'read', $this->getUser() ) ) {
$date = $row->rev_timestamp;
$comments = $title->getTalkPage()->getFullURL();
$revision = Revision::newFromRow( $row );
@@ -106,9 +106,8 @@ class ApiFeedContributions extends ApiBase {
$this->feedItemAuthor( $revision ),
$comments
);
- } else {
- return null;
}
+ return null;
}
/**
@@ -124,7 +123,7 @@ class ApiFeedContributions extends ApiBase {
* @return string
*/
protected function feedItemDesc( $revision ) {
- if( $revision ) {
+ if ( $revision ) {
$msg = wfMessage( 'colon-separator' )->inContentLanguage()->text();
$content = $revision->getContent();
@@ -149,7 +148,7 @@ class ApiFeedContributions extends ApiBase {
public function getAllowedParams() {
global $wgFeedClasses;
$feedFormatNames = array_keys( $wgFeedClasses );
- return array (
+ return array(
'feedformat' => array(
ApiBase::PARAM_DFLT => 'rss',
ApiBase::PARAM_TYPE => $feedFormatNames
diff --git a/includes/api/ApiFeedWatchlist.php b/includes/api/ApiFeedWatchlist.php
index 6c793b36..fbb70fbc 100644
--- a/includes/api/ApiFeedWatchlist.php
+++ b/includes/api/ApiFeedWatchlist.php
@@ -33,6 +33,10 @@
*/
class ApiFeedWatchlist extends ApiBase {
+ private $watchlistModule = null;
+ private $linkToDiffs = false;
+ private $linkToSections = false;
+
/**
* This module uses a custom feed wrapper printer.
*
@@ -42,8 +46,6 @@ 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.
@@ -54,11 +56,11 @@ class ApiFeedWatchlist extends ApiBase {
try {
$params = $this->extractRequestParams();
- if( !$wgFeed ) {
+ if ( !$wgFeed ) {
$this->dieUsage( 'Syndication feeds are not available', 'feed-unavailable' );
}
- if( !isset( $wgFeedClasses[$params['feedformat']] ) ) {
+ if ( !isset( $wgFeedClasses[$params['feedformat']] ) ) {
$this->dieUsage( 'Invalid subscription feed type', 'feed-invalid' );
}
@@ -74,7 +76,7 @@ class ApiFeedWatchlist extends ApiBase {
'wlprop' => 'title|user|comment|timestamp',
'wldir' => 'older', // reverse order - from newest to oldest
'wlend' => $endTime, // stop at this time
- 'wllimit' => ( 50 > $wgFeedLimit ) ? $wgFeedLimit : 50
+ 'wllimit' => min( 50, $wgFeedLimit )
);
if ( $params['wlowner'] !== null ) {
@@ -86,6 +88,12 @@ class ApiFeedWatchlist extends ApiBase {
if ( $params['wlexcludeuser'] !== null ) {
$fauxReqArr['wlexcludeuser'] = $params['wlexcludeuser'];
}
+ if ( $params['wlshow'] !== null ) {
+ $fauxReqArr['wlshow'] = $params['wlshow'];
+ }
+ if ( $params['wltype'] !== null ) {
+ $fauxReqArr['wltype'] = $params['wltype'];
+ }
// Support linking to diffs instead of article
if ( $params['linktodiffs'] ) {
@@ -93,6 +101,12 @@ class ApiFeedWatchlist extends ApiBase {
$fauxReqArr['wlprop'] .= '|ids';
}
+ // Support linking directly to sections when possible
+ // (possible only if section name is present in comment)
+ if ( $params['linktosections'] ) {
+ $this->linkToSections = true;
+ }
+
// Check for 'allrev' parameter, and if found, show all revisions to each page on wl.
if ( $params['allrev'] ) {
$fauxReqArr['wlallrev'] = '';
@@ -160,6 +174,18 @@ class ApiFeedWatchlist extends ApiBase {
$titleUrl = $title->getFullURL();
}
$comment = isset( $info['comment'] ) ? $info['comment'] : null;
+
+ // Create an anchor to section.
+ // The anchor won't work for sections that have dupes on page
+ // as there's no way to strip that info from ApiWatchlist (apparently?).
+ // RegExp in the line below is equal to Linker::formatAutocomments().
+ if ( $this->linkToSections && $comment !== null && preg_match( '!(.*)/\*\s*(.*?)\s*\*/(.*)!', $comment, $matches ) ) {
+ global $wgParser;
+ $sectionTitle = $wgParser->stripSectionName( $matches[2] );
+ $sectionTitle = Sanitizer::normalizeSectionNameWhitespace( $sectionTitle );
+ $titleUrl .= Title::newFromText( '#' . $sectionTitle )->getFragmentForURL();
+ }
+
$timestamp = $info['timestamp'];
$user = $info['user'];
@@ -168,10 +194,18 @@ class ApiFeedWatchlist extends ApiBase {
return new FeedItem( $titleStr, $completeText, $titleUrl, $timestamp, $user );
}
- public function getAllowedParams() {
+ private function getWatchlistModule() {
+ if ( $this->watchlistModule === null ) {
+ $this->watchlistModule = $this->getMain()->getModuleManager()->getModule( 'query' )
+ ->getModuleManager()->getModule( 'watchlist' );
+ }
+ return $this->watchlistModule;
+ }
+
+ public function getAllowedParams( $flags = 0 ) {
global $wgFeedClasses;
$feedFormatNames = array_keys( $wgFeedClasses );
- return array (
+ $ret = array(
'feedformat' => array(
ApiBase::PARAM_DFLT => 'rss',
ApiBase::PARAM_TYPE => $feedFormatNames
@@ -182,29 +216,41 @@ class ApiFeedWatchlist extends ApiBase {
ApiBase::PARAM_MIN => 1,
ApiBase::PARAM_MAX => 72,
),
- 'allrev' => false,
- 'wlowner' => array(
- ApiBase::PARAM_TYPE => 'user'
- ),
- 'wltoken' => array(
- ApiBase::PARAM_TYPE => 'string'
- ),
- 'wlexcludeuser' => array(
- ApiBase::PARAM_TYPE => 'user'
- ),
'linktodiffs' => false,
+ 'linktosections' => false,
);
+ if ( $flags ) {
+ $wlparams = $this->getWatchlistModule()->getAllowedParams( $flags );
+ $ret['allrev'] = $wlparams['allrev'];
+ $ret['wlowner'] = $wlparams['owner'];
+ $ret['wltoken'] = $wlparams['token'];
+ $ret['wlshow'] = $wlparams['show'];
+ $ret['wltype'] = $wlparams['type'];
+ $ret['wlexcludeuser'] = $wlparams['excludeuser'];
+ } else {
+ $ret['allrev'] = null;
+ $ret['wlowner'] = null;
+ $ret['wltoken'] = null;
+ $ret['wlshow'] = null;
+ $ret['wltype'] = null;
+ $ret['wlexcludeuser'] = null;
+ }
+ return $ret;
}
public function getParamDescription() {
+ $wldescr = $this->getWatchlistModule()->getParamDescription();
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 {$this->getModulePrefix()}wltoken if it's not you)",
- 'wltoken' => 'Security token that requested user set in their preferences',
- 'wlexcludeuser' => 'A user whose edits should not be shown in the watchlist',
+ 'hours' => 'List pages modified within this many hours from now',
'linktodiffs' => 'Link to change differences instead of article pages',
+ 'linktosections' => 'Link directly to changed sections if possible',
+ 'allrev' => $wldescr['allrev'],
+ 'wlowner' => $wldescr['owner'],
+ 'wltoken' => $wldescr['token'],
+ 'wlshow' => $wldescr['show'],
+ 'wltype' => $wldescr['type'],
+ 'wlexcludeuser' => $wldescr['excludeuser'],
);
}
diff --git a/includes/api/ApiFormatBase.php b/includes/api/ApiFormatBase.php
index d8aa1634..b89fb3a7 100644
--- a/includes/api/ApiFormatBase.php
+++ b/includes/api/ApiFormatBase.php
@@ -85,7 +85,7 @@ abstract class ApiFormatBase extends ApiBase {
*
* @param bool $b Whether or not ampersands should be escaped.
*/
- public function setUnescapeAmps ( $b ) {
+ public function setUnescapeAmps( $b ) {
$this->mUnescapeAmps = $b;
}
@@ -170,12 +170,12 @@ abstract class ApiFormatBase extends ApiBase {
?>
<br />
<small>
-You are looking at the HTML representation of the <?php echo( $this->mFormat ); ?> format.<br />
+You are looking at the HTML representation of the <?php echo $this->mFormat; ?> format.<br />
HTML is good for debugging, but is unsuitable for application use.<br />
Specify the format parameter to change the output format.<br />
-To see the non HTML representation of the <?php echo( $this->mFormat ); ?> format, set format=<?php echo( strtolower( $this->mFormat ) ); ?>.<br />
+To see the non HTML representation of the <?php echo $this->mFormat; ?> format, set format=<?php echo strtolower( $this->mFormat ); ?>.<br />
See the <a href='https://www.mediawiki.org/wiki/API'>complete documentation</a>, or
-<a href='<?php echo( $script ); ?>'>API help</a> for more information.
+<a href='<?php echo $script; ?>'>API help</a> for more information.
</small>
<pre style='white-space: pre-wrap;'>
<?php
diff --git a/includes/api/ApiFormatJson.php b/includes/api/ApiFormatJson.php
index abb63480..342a580f 100644
--- a/includes/api/ApiFormatJson.php
+++ b/includes/api/ApiFormatJson.php
@@ -56,30 +56,32 @@ class ApiFormatJson extends ApiFormatBase {
}
public function execute() {
- $prefix = $suffix = '';
-
$params = $this->extractRequestParams();
+ $json = FormatJson::encode(
+ $this->getResultData(),
+ $this->getIsHtml(),
+ $params['utf8'] ? FormatJson::ALL_OK : FormatJson::XMLMETA_OK
+ );
$callback = $params['callback'];
- if ( !is_null( $callback ) ) {
- $prefix = preg_replace( "/[^][.\\'\\\"_A-Za-z0-9]/", '', $callback ) . '(';
- $suffix = ')';
+ if ( $callback !== null ) {
+ $callback = preg_replace( "/[^][.\\'\\\"_A-Za-z0-9]/", '', $callback );
+ $this->printText( "$callback($json)" );
+ } else {
+ $this->printText( $json );
}
- $this->printText(
- $prefix .
- FormatJson::encode( $this->getResultData(), $this->getIsHtml() ) .
- $suffix
- );
}
public function getAllowedParams() {
return array(
- 'callback' => null,
+ 'callback' => null,
+ 'utf8' => false,
);
}
public function getParamDescription() {
return array(
'callback' => 'If specified, wraps the output into a given function call. For safety, all user-specific data will be restricted.',
+ 'utf8' => 'If specified, encodes most (but not all) non-ASCII characters as UTF-8 instead of replacing them with hexadecimal escape sequences.',
);
}
diff --git a/includes/api/ApiFormatWddx.php b/includes/api/ApiFormatWddx.php
index 62b69bb6..5685d937 100644
--- a/includes/api/ApiFormatWddx.php
+++ b/includes/api/ApiFormatWddx.php
@@ -46,7 +46,7 @@ class ApiFormatWddx extends ApiFormatBase {
} else {
// Don't do newlines and indentation if we weren't asked
// for pretty output
- $nl = ( $this->getIsHtml() ? '' : "\n" );
+ $nl = ( $this->getIsHtml() ? "\n" : '' );
$indstr = ' ';
$this->printText( "<?xml version=\"1.0\"?>$nl" );
$this->printText( "<wddxPacket version=\"1.0\">$nl" );
@@ -64,44 +64,43 @@ class ApiFormatWddx extends ApiFormatBase {
* @param $indent int
*/
function slowWddxPrinter( $elemValue, $indent = 0 ) {
- $indstr = ( $this->getIsHtml() ? '' : str_repeat( ' ', $indent ) );
- $indstr2 = ( $this->getIsHtml() ? '' : str_repeat( ' ', $indent + 2 ) );
- $nl = ( $this->getIsHtml() ? '' : "\n" );
- switch ( gettype( $elemValue ) ) {
- case 'array':
- // Check whether we've got an associative array (<struct>)
- // or a regular array (<array>)
- $cnt = count( $elemValue );
- if ( $cnt == 0 || array_keys( $elemValue ) === range( 0, $cnt - 1 ) ) {
- // Regular array
- $this->printText( $indstr . Xml::element( 'array', array(
- 'length' => $cnt ), null ) . $nl );
- foreach ( $elemValue as $subElemValue ) {
- $this->slowWddxPrinter( $subElemValue, $indent + 2 );
- }
- $this->printText( "$indstr</array>$nl" );
- } else {
- // Associative array (<struct>)
- $this->printText( "$indstr<struct>$nl" );
- foreach ( $elemValue as $subElemName => $subElemValue ) {
- $this->printText( $indstr2 . Xml::element( 'var', array(
- 'name' => $subElemName
- ), null ) . $nl );
- $this->slowWddxPrinter( $subElemValue, $indent + 4 );
- $this->printText( "$indstr2</var>$nl" );
- }
- $this->printText( "$indstr</struct>$nl" );
+ $indstr = ( $this->getIsHtml() ? str_repeat( ' ', $indent ) : '' );
+ $indstr2 = ( $this->getIsHtml() ? str_repeat( ' ', $indent + 2 ) : '' );
+ $nl = ( $this->getIsHtml() ? "\n" : '' );
+ if ( is_array( $elemValue ) ) {
+ // Check whether we've got an associative array (<struct>)
+ // or a regular array (<array>)
+ $cnt = count( $elemValue );
+ if ( $cnt == 0 || array_keys( $elemValue ) === range( 0, $cnt - 1 ) ) {
+ // Regular array
+ $this->printText( $indstr . Xml::element( 'array', array(
+ 'length' => $cnt ), null ) . $nl );
+ foreach ( $elemValue as $subElemValue ) {
+ $this->slowWddxPrinter( $subElemValue, $indent + 2 );
}
- break;
- case 'integer':
- case 'double':
- $this->printText( $indstr . Xml::element( 'number', null, $elemValue ) . $nl );
- break;
- case 'string':
- $this->printText( $indstr . Xml::element( 'string', null, $elemValue ) . $nl );
- break;
- default:
- ApiBase::dieDebug( __METHOD__, 'Unknown type ' . gettype( $elemValue ) );
+ $this->printText( "$indstr</array>$nl" );
+ } else {
+ // Associative array (<struct>)
+ $this->printText( "$indstr<struct>$nl" );
+ foreach ( $elemValue as $subElemName => $subElemValue ) {
+ $this->printText( $indstr2 . Xml::element( 'var', array(
+ 'name' => $subElemName
+ ), null ) . $nl );
+ $this->slowWddxPrinter( $subElemValue, $indent + 4 );
+ $this->printText( "$indstr2</var>$nl" );
+ }
+ $this->printText( "$indstr</struct>$nl" );
+ }
+ } elseif ( is_int( $elemValue ) || is_float( $elemValue ) ) {
+ $this->printText( $indstr . Xml::element( 'number', null, $elemValue ) . $nl );
+ } elseif ( is_string( $elemValue ) ) {
+ $this->printText( $indstr . Xml::element( 'string', null, $elemValue ) . $nl );
+ } elseif ( is_bool( $elemValue ) ) {
+ $this->printText( $indstr . Xml::element( 'boolean',
+ array( 'value' => $elemValue ? 'true' : 'false' ) ) . $nl
+ );
+ } else {
+ ApiBase::dieDebug( __METHOD__, 'Unknown type ' . gettype( $elemValue ) );
}
}
diff --git a/includes/api/ApiFormatXml.php b/includes/api/ApiFormatXml.php
index b4e8e330..4ec149c0 100644
--- a/includes/api/ApiFormatXml.php
+++ b/includes/api/ApiFormatXml.php
@@ -32,7 +32,6 @@ class ApiFormatXml extends ApiFormatBase {
private $mRootElemName = 'api';
public static $namespace = 'http://www.mediawiki.org/xml/api/';
- private $mDoubleQuote = false;
private $mIncludeNamespace = false;
private $mXslt = null;
@@ -50,7 +49,6 @@ class ApiFormatXml extends ApiFormatBase {
public function execute() {
$params = $this->extractRequestParams();
- $this->mDoubleQuote = $params['xmldoublequote'];
$this->mIncludeNamespace = $params['includexmlnamespace'];
$this->mXslt = $params['xslt'];
@@ -71,8 +69,7 @@ class ApiFormatXml extends ApiFormatBase {
$this->printText(
self::recXmlPrint( $this->mRootElemName,
$data,
- $this->getIsHtml() ? - 2 : null,
- $this->mDoubleQuote
+ $this->getIsHtml() ? - 2 : null
)
);
}
@@ -117,11 +114,10 @@ class ApiFormatXml extends ApiFormatBase {
* @param $elemName
* @param $elemValue
* @param $indent
- * @param $doublequote bool
*
* @return string
*/
- public static function recXmlPrint( $elemName, $elemValue, $indent, $doublequote = false ) {
+ public static function recXmlPrint( $elemName, $elemValue, $indent ) {
$retval = '';
if ( !is_null( $indent ) ) {
$indent += 2;
@@ -131,84 +127,71 @@ class ApiFormatXml extends ApiFormatBase {
}
$elemName = str_replace( ' ', '_', $elemName );
- switch ( gettype( $elemValue ) ) {
- case 'array':
- if ( isset( $elemValue['*'] ) ) {
- $subElemContent = $elemValue['*'];
- if ( $doublequote ) {
- $subElemContent = Sanitizer::encodeAttribute( $subElemContent );
- }
- unset( $elemValue['*'] );
-
- // Add xml:space="preserve" to the
- // element so XML parsers will leave
- // whitespace in the content alone
- $elemValue['xml:space'] = 'preserve';
- } else {
- $subElemContent = null;
+ if ( is_array( $elemValue ) ) {
+ if ( isset( $elemValue['*'] ) ) {
+ $subElemContent = $elemValue['*'];
+ unset( $elemValue['*'] );
+
+ // Add xml:space="preserve" to the
+ // element so XML parsers will leave
+ // whitespace in the content alone
+ $elemValue['xml:space'] = 'preserve';
+ } else {
+ $subElemContent = null;
+ }
+
+ if ( isset( $elemValue['_element'] ) ) {
+ $subElemIndName = $elemValue['_element'];
+ unset( $elemValue['_element'] );
+ } else {
+ $subElemIndName = null;
+ }
+
+ $indElements = array();
+ $subElements = array();
+ foreach ( $elemValue as $subElemId => & $subElemValue ) {
+ if ( is_int( $subElemId ) ) {
+ $indElements[] = $subElemValue;
+ unset( $elemValue[$subElemId] );
+ } elseif ( is_array( $subElemValue ) ) {
+ $subElements[$subElemId] = $subElemValue;
+ unset( $elemValue[$subElemId] );
}
+ }
- if ( isset( $elemValue['_element'] ) ) {
- $subElemIndName = $elemValue['_element'];
- unset( $elemValue['_element'] );
- } else {
- $subElemIndName = null;
- }
+ if ( is_null( $subElemIndName ) && count( $indElements ) ) {
+ ApiBase::dieDebug( __METHOD__, "($elemName, ...) has integer keys without _element value. Use ApiResult::setIndexedTagName()." );
+ }
- $indElements = array();
- $subElements = array();
- foreach ( $elemValue as $subElemId => & $subElemValue ) {
- if ( is_string( $subElemValue ) && $doublequote ) {
- $subElemValue = Sanitizer::encodeAttribute( $subElemValue );
- }
-
- if ( gettype( $subElemId ) === 'integer' ) {
- $indElements[] = $subElemValue;
- unset( $elemValue[$subElemId] );
- } elseif ( is_array( $subElemValue ) ) {
- $subElements[$subElemId] = $subElemValue;
- unset ( $elemValue[$subElemId] );
- }
- }
+ if ( count( $subElements ) && count( $indElements ) && !is_null( $subElemContent ) ) {
+ ApiBase::dieDebug( __METHOD__, "($elemName, ...) has content and subelements" );
+ }
- if ( is_null( $subElemIndName ) && count( $indElements ) ) {
- ApiBase::dieDebug( __METHOD__, "($elemName, ...) has integer keys without _element value. Use ApiResult::setIndexedTagName()." );
- }
+ if ( !is_null( $subElemContent ) ) {
+ $retval .= $indstr . Xml::element( $elemName, $elemValue, $subElemContent );
+ } elseif ( !count( $indElements ) && !count( $subElements ) ) {
+ $retval .= $indstr . Xml::element( $elemName, $elemValue );
+ } else {
+ $retval .= $indstr . Xml::element( $elemName, $elemValue, null );
- if ( count( $subElements ) && count( $indElements ) && !is_null( $subElemContent ) ) {
- ApiBase::dieDebug( __METHOD__, "($elemName, ...) has content and subelements" );
+ foreach ( $subElements as $subElemId => & $subElemValue ) {
+ $retval .= self::recXmlPrint( $subElemId, $subElemValue, $indent );
}
- if ( !is_null( $subElemContent ) ) {
- $retval .= $indstr . Xml::element( $elemName, $elemValue, $subElemContent );
- } elseif ( !count( $indElements ) && !count( $subElements ) ) {
- $retval .= $indstr . Xml::element( $elemName, $elemValue );
- } else {
- $retval .= $indstr . Xml::element( $elemName, $elemValue, null );
-
- foreach ( $subElements as $subElemId => & $subElemValue ) {
- $retval .= self::recXmlPrint( $subElemId, $subElemValue, $indent );
- }
-
- foreach ( $indElements as &$subElemValue ) {
- $retval .= self::recXmlPrint( $subElemIndName, $subElemValue, $indent );
- }
-
- $retval .= $indstr . Xml::closeElement( $elemName );
+ foreach ( $indElements as &$subElemValue ) {
+ $retval .= self::recXmlPrint( $subElemIndName, $subElemValue, $indent );
}
- break;
- case 'object':
- // ignore
- break;
- default:
- // to make sure null value doesn't produce unclosed element,
- // which is what Xml::element( $elemName, null, null ) returns
- if ( $elemValue === null ) {
- $retval .= $indstr . Xml::element( $elemName );
- } else {
- $retval .= $indstr . Xml::element( $elemName, null, $elemValue );
- }
- break;
+
+ $retval .= $indstr . Xml::closeElement( $elemName );
+ }
+ } elseif ( !is_object( $elemValue ) ) {
+ // to make sure null value doesn't produce unclosed element,
+ // which is what Xml::element( $elemName, null, null ) returns
+ if ( $elemValue === null ) {
+ $retval .= $indstr . Xml::element( $elemName );
+ } else {
+ $retval .= $indstr . Xml::element( $elemName, null, $elemValue );
+ }
}
return $retval;
}
@@ -232,7 +215,6 @@ class ApiFormatXml extends ApiFormatBase {
public function getAllowedParams() {
return array(
- 'xmldoublequote' => false,
'xslt' => null,
'includexmlnamespace' => false,
);
@@ -240,7 +222,6 @@ class ApiFormatXml extends ApiFormatBase {
public function getParamDescription() {
return array(
- 'xmldoublequote' => 'If specified, double quotes all attributes and content',
'xslt' => 'If specified, adds <xslt> as stylesheet. This should be a wiki page '
. 'in the MediaWiki namespace whose page name ends with ".xsl"',
'includexmlnamespace' => 'If specified, adds an XML namespace'
diff --git a/includes/api/ApiImageRotate.php b/includes/api/ApiImageRotate.php
index b2d75825..7a60e831 100644
--- a/includes/api/ApiImageRotate.php
+++ b/includes/api/ApiImageRotate.php
@@ -22,7 +22,6 @@
*/
class ApiImageRotate extends ApiBase {
-
private $mPageSet = null;
public function __construct( $main, $action ) {
@@ -38,32 +37,29 @@ class ApiImageRotate extends ApiBase {
*/
private static function addValues( array &$result, $values, $flag = null, $name = null ) {
foreach ( $values as $val ) {
- if( $val instanceof Title ) {
+ if ( $val instanceof Title ) {
$v = array();
ApiQueryBase::addTitleInfo( $v, $val );
- } elseif( $name !== null ) {
+ } elseif ( $name !== null ) {
$v = array( $name => $val );
} else {
$v = $val;
}
- if( $flag !== null ) {
+ if ( $flag !== null ) {
$v[$flag] = '';
}
$result[] = $v;
}
}
-
public function execute() {
$params = $this->extractRequestParams();
- $rotation = $params[ 'rotation' ];
- $user = $this->getUser();
+ $rotation = $params['rotation'];
$pageSet = $this->getPageSet();
$pageSet->execute();
$result = array();
- $result = array();
self::addValues( $result, $pageSet->getInvalidTitles(), 'invalid', 'title' );
self::addValues( $result, $pageSet->getSpecialTitles(), 'special', 'title' );
@@ -111,15 +107,17 @@ class ApiImageRotate extends ApiBase {
continue;
}
$ext = strtolower( pathinfo( "$srcPath", PATHINFO_EXTENSION ) );
- $tmpFile = TempFSFile::factory( 'rotate_', $ext);
+ $tmpFile = TempFSFile::factory( 'rotate_', $ext );
$dstPath = $tmpFile->getPath();
$err = $handler->rotate( $file, array(
"srcPath" => $srcPath,
"dstPath" => $dstPath,
- "rotation"=> $rotation
+ "rotation" => $rotation
) );
if ( !$err ) {
- $comment = wfMessage( 'rotate-comment' )->numParams( $rotation )->text();
+ $comment = wfMessage(
+ 'rotate-comment'
+ )->numParams( $rotation )->inContentLanguage()->text();
$status = $file->upload( $dstPath,
$comment, $comment, 0, false, false, $this->getUser() );
if ( $status->isGood() ) {
@@ -152,13 +150,14 @@ class ApiImageRotate extends ApiBase {
/**
* Checks that the user has permissions to perform rotations.
- * @param $user User The user to check.
+ * @param User $user The user to check
+ * @param Title $title
* @return string|null Permission error message, or null if there is no error
*/
protected function checkPermissions( $user, $title ) {
$permissionErrors = array_merge(
- $title->getUserPermissionsErrors( 'edit' , $user ),
- $title->getUserPermissionsErrors( 'upload' , $user )
+ $title->getUserPermissionsErrors( 'edit', $user ),
+ $title->getUserPermissionsErrors( 'upload', $user )
);
if ( $permissionErrors ) {
@@ -179,7 +178,6 @@ class ApiImageRotate extends ApiBase {
}
public function getAllowedParams( $flags = 0 ) {
- $pageSet = $this->getPageSet();
$result = array(
'rotation' => array(
ApiBase::PARAM_TYPE => array( '90', '180', '270' ),
@@ -198,7 +196,7 @@ class ApiImageRotate extends ApiBase {
public function getParamDescription() {
$pageSet = $this->getPageSet();
- return $pageSet->getParamDescription() + array(
+ return $pageSet->getFinalParamDescription() + array(
'rotation' => 'Degrees to rotate image clockwise',
'token' => 'Edit token. You can get one of these through action=tokens',
);
@@ -220,7 +218,7 @@ class ApiImageRotate extends ApiBase {
$pageSet = $this->getPageSet();
return array_merge(
parent::getPossibleErrors(),
- $pageSet->getPossibleErrors()
+ $pageSet->getFinalPossibleErrors()
);
}
diff --git a/includes/api/ApiImport.php b/includes/api/ApiImport.php
index 1f0a5fab..f48a822e 100644
--- a/includes/api/ApiImport.php
+++ b/includes/api/ApiImport.php
@@ -57,7 +57,7 @@ class ApiImport extends ApiBase {
$source = ImportStreamSource::newFromUpload( 'xml' );
}
if ( !$source->isOK() ) {
- $this->dieUsageMsg( $source->getErrorsArray() );
+ $this->dieStatus( $source );
}
$importer = new WikiImporter( $source->value );
@@ -66,8 +66,8 @@ class ApiImport extends ApiBase {
}
if ( isset( $params['rootpage'] ) ) {
$statusRootPage = $importer->setTargetRootPage( $params['rootpage'] );
- if( !$statusRootPage->isGood() ) {
- $this->dieUsageMsg( $statusRootPage->getErrorsArray() );
+ if ( !$statusRootPage->isGood() ) {
+ $this->dieStatus( $statusRootPage );
}
}
$reporter = new ApiImportReporter(
diff --git a/includes/api/ApiMain.php b/includes/api/ApiMain.php
index 7b2fd914..c11f16cb 100644
--- a/includes/api/ApiMain.php
+++ b/includes/api/ApiMain.php
@@ -83,7 +83,7 @@ class ApiMain extends ApiBase {
'import' => 'ApiImport',
'userrights' => 'ApiUserrights',
'options' => 'ApiOptions',
- 'imagerotate' =>'ApiImageRotate',
+ 'imagerotate' => 'ApiImageRotate',
);
/**
@@ -274,7 +274,7 @@ class ApiMain extends ApiBase {
return;
}
- if ( !User::groupHasPermission( '*', 'read' ) ) {
+ if ( !User::isEveryoneAllowed( 'read' ) ) {
// Private wiki, only private headers
if ( $mode !== 'private' ) {
wfDebug( __METHOD__ . ": ignoring request for $mode cache mode, private wiki\n" );
@@ -383,13 +383,8 @@ class ApiMain extends ApiBase {
wfRunHooks( 'ApiMain::onException', array( $this, $e ) );
// Log it
- if ( $e instanceof MWException && !( $e instanceof UsageException ) ) {
- global $wgLogExceptionBacktrace;
- if ( $wgLogExceptionBacktrace ) {
- wfDebugLog( 'exception', $e->getLogMessage() . "\n" . $e->getTraceAsString() . "\n" );
- } else {
- wfDebugLog( 'exception', $e->getLogMessage() );
- }
+ if ( !( $e instanceof UsageException ) ) {
+ MWExceptionHandler::logException( $e );
}
// Handle any kind of exception by outputting properly formatted error message.
@@ -418,7 +413,7 @@ class ApiMain extends ApiBase {
}
// Log the request whether or not there was an error
- $this->logRequest( microtime( true ) - $t);
+ $this->logRequest( microtime( true ) - $t );
// Send cache headers after any code which might generate an error, to
// avoid sending public cache headers for errors.
@@ -609,7 +604,7 @@ class ApiMain extends ApiBase {
$result = $this->getResult();
// Printer may not be initialized if the extractRequestParams() fails for the main module
- if ( !isset ( $this->mPrinter ) ) {
+ 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 ( !$this->mModuleMgr->isDefined( $value, 'format' ) ) {
@@ -763,7 +758,7 @@ class ApiMain extends ApiBase {
*/
protected function checkExecutePermissions( $module ) {
$user = $this->getUser();
- if ( $module->isReadMode() && !User::groupHasPermission( '*', 'read' ) &&
+ if ( $module->isReadMode() && !User::isEveryoneAllowed( 'read' ) &&
!$user->isAllowed( 'read' ) )
{
$this->dieUsageMsg( 'readrequired' );
@@ -782,7 +777,7 @@ class ApiMain extends ApiBase {
// Allow extensions to stop execution for arbitrary reasons.
$message = false;
- if( !wfRunHooks( 'ApiCheckCanExecute', array( $module, $user, &$message ) ) ) {
+ if ( !wfRunHooks( 'ApiCheckCanExecute', array( $module, $user, &$message ) ) ) {
$this->dieUsageMsg( $message );
}
}
@@ -857,7 +852,7 @@ class ApiMain extends ApiBase {
' ' . $request->getMethod() .
' ' . wfUrlencode( str_replace( ' ', '_', $this->getUser()->getName() ) ) .
' ' . $request->getIP() .
- ' T=' . $milliseconds .'ms';
+ ' T=' . $milliseconds . 'ms';
foreach ( $this->getParamsUsed() as $name ) {
$value = $request->getVal( $name );
if ( $value === null ) {
@@ -944,7 +939,7 @@ class ApiMain extends ApiBase {
$unusedParams = array_diff( $allParams, $paramsUsed );
}
- if( count( $unusedParams ) ) {
+ if ( count( $unusedParams ) ) {
$s = count( $unusedParams ) > 1 ? 's' : '';
$this->setWarning( "Unrecognized parameter$s: '" . implode( $unusedParams, "', '" ) . "'" );
}
@@ -957,7 +952,7 @@ class ApiMain extends ApiBase {
*/
protected function printResult( $isError ) {
global $wgDebugAPI;
- if( $wgDebugAPI !== false ) {
+ if ( $wgDebugAPI !== false ) {
$this->setWarning( 'SECURITY WARNING: $wgDebugAPI is enabled' );
}
@@ -1002,7 +997,7 @@ class ApiMain extends ApiBase {
ApiBase::PARAM_DFLT => 'help',
ApiBase::PARAM_TYPE => $this->mModuleMgr->getNames( 'action' )
),
- 'maxlag' => array(
+ 'maxlag' => array(
ApiBase::PARAM_TYPE => 'integer'
),
'smaxage' => array(
@@ -1014,7 +1009,7 @@ class ApiMain extends ApiBase {
ApiBase::PARAM_DFLT => 0
),
'requestid' => null,
- 'servedby' => false,
+ 'servedby' => false,
'origin' => null,
);
}
@@ -1042,6 +1037,7 @@ class ApiMain extends ApiBase {
'servedby' => 'Include the hostname that served the request in the results. Unconditionally shown on error',
'origin' => array(
'When accessing the API using a cross-domain AJAX request (CORS), set this to the originating domain.',
+ 'This must be included in any pre-flight request, and therefore must be part of the request URI (not the POST body).',
'This must match one of the origins in the Origin: header exactly, so it has to be set to something like http://en.wikipedia.org or https://meta.wikimedia.org .',
'If this parameter does not match the Origin: header, a 403 response will be returned.',
'If this parameter matches the Origin: header and the origin is whitelisted, an Access-Control-Allow-Origin header will be set.',
@@ -1114,7 +1110,7 @@ class ApiMain extends ApiBase {
return array(
'API developers:',
' Roan Kattouw "<Firstname>.<Lastname>@gmail.com" (lead developer Sep 2007-2009)',
- ' Victor Vasiliev - vasilvv at gee mail dot com',
+ ' Victor Vasiliev - vasilvv @ gmail . com',
' Bryan Tong Minh - bryan . tongminh @ gmail . com',
' Sam Reed - sam @ reedyboy . net',
' Yuri Astrakhan "<Firstname><Lastname>@gmail.com" (creator, lead developer Sep 2006-Sep 2007, 2012-present)',
@@ -1143,7 +1139,7 @@ class ApiMain extends ApiBase {
$this->setHelp();
// Get help text from cache if present
$key = wfMemcKey( 'apihelp', $this->getModuleName(),
- SpecialVersion::getVersion( 'nodb' ) );
+ str_replace( ' ', '_', SpecialVersion::getVersion( 'nodb' ) ) );
if ( $wgAPICacheHelpTimeout > 0 ) {
$cached = $wgMemc->get( $key );
if ( $cached ) {
diff --git a/includes/api/ApiMove.php b/includes/api/ApiMove.php
index 3e846e3b..c18036cf 100644
--- a/includes/api/ApiMove.php
+++ b/includes/api/ApiMove.php
@@ -88,7 +88,7 @@ class ApiMove extends ApiBase {
$r['redirectcreated'] = '';
}
- if( $toTitleExists ) {
+ if ( $toTitleExists ) {
$r['moveoverredirect'] = '';
}
@@ -99,7 +99,7 @@ class ApiMove extends ApiBase {
if ( $retval === true ) {
$r['talkfrom'] = $fromTalk->getPrefixedText();
$r['talkto'] = $toTalk->getPrefixedText();
- if( $toTalkExists ) {
+ if ( $toTalkExists ) {
$r['talkmoveoverredirect'] = '';
}
} else {
diff --git a/includes/api/ApiOpenSearch.php b/includes/api/ApiOpenSearch.php
index caf361ac..315ace37 100644
--- a/includes/api/ApiOpenSearch.php
+++ b/includes/api/ApiOpenSearch.php
@@ -1,7 +1,5 @@
<?php
/**
- *
- *
* Created on Oct 13, 2006
*
* Copyright © 2006 Yuri Astrakhan "<Firstname><Lastname>@gmail.com"
@@ -29,8 +27,20 @@
*/
class ApiOpenSearch extends ApiBase {
+ /**
+ * Override built-in handling of format parameter.
+ * Only JSON is supported.
+ *
+ * @return ApiFormatBase
+ */
public function getCustomPrinter() {
- return $this->getMain()->createPrinterByName( 'json' );
+ $params = $this->extractRequestParams();
+ $format = $params['format'];
+ $allowed = array( 'json', 'jsonfm' );
+ if ( in_array( $format, $allowed ) ) {
+ return $this->getMain()->createPrinterByName( $format );
+ }
+ return $this->getMain()->createPrinterByName( $allowed[0] );
}
public function execute() {
@@ -94,6 +104,10 @@ class ApiOpenSearch extends ApiBase {
ApiBase::PARAM_ISMULTI => true
),
'suggest' => false,
+ 'format' => array(
+ ApiBase::PARAM_DFLT => 'json',
+ ApiBase::PARAM_TYPE => array( 'json', 'jsonfm' ),
+ )
);
}
@@ -103,6 +117,7 @@ class ApiOpenSearch extends ApiBase {
'limit' => 'Maximum amount of results to return',
'namespace' => 'Namespaces to search',
'suggest' => 'Do nothing if $wgEnableOpenSearchSuggest is false',
+ 'format' => 'The format of the output',
);
}
diff --git a/includes/api/ApiOptions.php b/includes/api/ApiOptions.php
index 8c996a26..7256066d 100644
--- a/includes/api/ApiOptions.php
+++ b/includes/api/ApiOptions.php
@@ -42,6 +42,10 @@ class ApiOptions extends ApiBase {
$this->dieUsage( 'Anonymous users cannot change preferences', 'notloggedin' );
}
+ if ( !$user->isAllowed( 'editmyoptions' ) ) {
+ $this->dieUsage( 'You don\'t have permission to edit your options', 'permissiondenied' );
+ }
+
$params = $this->extractRequestParams();
$changed = false;
@@ -50,7 +54,7 @@ class ApiOptions extends ApiBase {
}
if ( $params['reset'] ) {
- $user->resetOptions( $params['resetkinds'] );
+ $user->resetOptions( $params['resetkinds'], $this->getContext() );
$changed = true;
}
@@ -83,7 +87,7 @@ class ApiOptions extends ApiBase {
case 'registered-checkmatrix':
// A key for a multiselect or checkmatrix option.
$validation = true;
- $value = $value !== null ? (bool) $value : null;
+ $value = $value !== null ? (bool)$value : null;
break;
case 'userjs':
// Allow non-default preferences prefixed with 'userjs-', to be set by user scripts
diff --git a/includes/api/ApiPageSet.php b/includes/api/ApiPageSet.php
index 074efe4b..b05cb2b6 100644
--- a/includes/api/ApiPageSet.php
+++ b/includes/api/ApiPageSet.php
@@ -69,6 +69,9 @@ class ApiPageSet extends ApiBase {
private $mFakePageId = -1;
private $mCacheMode = 'public';
private $mRequestedPageFields = array();
+ /**
+ * @var int
+ */
private $mDefaultNamespace = NS_MAIN;
/**
@@ -149,7 +152,6 @@ class ApiPageSet extends ApiBase {
if ( !$isDryRun ) {
$generator->executeGenerator( $this );
wfRunHooks( 'APIQueryGeneratorAfterExecute', array( &$generator, &$this ) );
- $this->resolvePendingRedirects();
} else {
// Prevent warnings from being reported on these parameters
$main = $this->getMain();
@@ -160,6 +162,10 @@ class ApiPageSet extends ApiBase {
$generator->profileOut();
$this->profileIn();
+ if ( !$isDryRun ) {
+ $this->resolvePendingRedirects();
+ }
+
if ( !$isQuery ) {
// If this pageset is not part of the query, we called profileIn() above
$dbSource->profileOut();
@@ -185,7 +191,7 @@ class ApiPageSet extends ApiBase {
if ( !$isDryRun ) {
// Populate page information with the original user input
- switch( $dataSource ) {
+ switch ( $dataSource ) {
case 'titles':
$this->initFromTitles( $this->mParams['titles'] );
break;
@@ -404,7 +410,7 @@ class ApiPageSet extends ApiBase {
* @return array of raw_prefixed_title (string) => prefixed_title (string)
* @since 1.21
*/
- public function getNormalizedTitlesAsResult( $result = null ) {
+ public function getNormalizedTitlesAsResult( $result = null ) {
$values = array();
foreach ( $this->getNormalizedTitles() as $rawTitleStr => $titleStr ) {
$values[] = array(
@@ -595,13 +601,13 @@ class ApiPageSet extends ApiBase {
}
foreach ( $this->mRequestedPageFields as $fieldName => &$fieldValues ) {
- $fieldValues[$pageId] = $row-> $fieldName;
+ $fieldValues[$pageId] = $row->$fieldName;
}
}
/**
* Do not use, does nothing, will be removed
- * @deprecated 1.21
+ * @deprecated since 1.21
*/
public function finishPageSetGeneration() {
wfDeprecated( __METHOD__, '1.21' );
@@ -859,7 +865,7 @@ class ApiPageSet extends ApiBase {
$from = $this->mPendingRedirectIDs[$rdfrom]->getPrefixedText();
$to = Title::makeTitle( $row->rd_namespace, $row->rd_title, $row->rd_fragment, $row->rd_interwiki );
unset( $this->mPendingRedirectIDs[$rdfrom] );
- if ( !isset( $this->mAllPages[$row->rd_namespace][$row->rd_title] ) ) {
+ if ( !$to->isExternal() && !isset( $this->mAllPages[$row->rd_namespace][$row->rd_title] ) ) {
$lb->add( $row->rd_namespace, $row->rd_title );
}
$this->mRedirectTitles[$from] = $to;
diff --git a/includes/api/ApiParamInfo.php b/includes/api/ApiParamInfo.php
index 27f8cefd..3e1a7531 100644
--- a/includes/api/ApiParamInfo.php
+++ b/includes/api/ApiParamInfo.php
@@ -149,7 +149,7 @@ class ApiParamInfo extends ApiBase {
$item = array();
if ( is_numeric( $k ) ) {
$retval['examples'] .= $v;
- $result->setContent( $item, $v );
+ ApiResult::setContent( $item, $v );
} else {
if ( !is_array( $v ) ) {
$item['description'] = $v;
@@ -157,7 +157,7 @@ class ApiParamInfo extends ApiBase {
$item['description'] = implode( $v, "\n" );
}
$retval['examples'] .= $item['description'] . ' ' . $k;
- $result->setContent( $item, $k );
+ ApiResult::setContent( $item, $k );
}
$retval['allexamples'][] = $item;
}
@@ -300,7 +300,7 @@ class ApiParamInfo extends ApiBase {
}
// Errors
- $retval['errors'] = $this->parseErrors( $obj->getPossibleErrors() );
+ $retval['errors'] = $this->parseErrors( $obj->getFinalPossibleErrors() );
$result->setIndexedTagName( $retval['errors'], 'error' );
return $retval;
diff --git a/includes/api/ApiParse.php b/includes/api/ApiParse.php
index 09b7a882..a369994b 100644
--- a/includes/api/ApiParse.php
+++ b/includes/api/ApiParse.php
@@ -44,6 +44,14 @@ class ApiParse extends ApiBase {
$params = $this->extractRequestParams();
$text = $params['text'];
$title = $params['title'];
+ if ( $title === null ) {
+ $titleProvided = false;
+ // A title is needed for parsing, so arbitrarily choose one
+ $title = 'API';
+ } else {
+ $titleProvided = true;
+ }
+
$page = $params['page'];
$pageid = $params['pageid'];
$oldid = $params['oldid'];
@@ -51,7 +59,7 @@ class ApiParse extends ApiBase {
$model = $params['contentmodel'];
$format = $params['contentformat'];
- if ( !is_null( $page ) && ( !is_null( $text ) || $title != 'API' ) ) {
+ if ( !is_null( $page ) && ( !is_null( $text ) || $titleProvided ) ) {
$this->dieUsage( 'The page parameter cannot be used together with the text and title parameters', 'params' );
}
@@ -94,8 +102,7 @@ class ApiParse extends ApiBase {
$titleObj = $rev->getTitle();
$wgTitle = $titleObj;
$pageObj = WikiPage::factory( $titleObj );
- $popts = $pageObj->makeParserOptions( $this->getContext() );
- $popts->enableLimitReport( !$params['disablepp'] );
+ $popts = $this->makeParserOptions( $pageObj, $params );
// If for some reason the "oldid" is actually the current revision, it may be cached
if ( $rev->isCurrent() ) {
@@ -152,8 +159,7 @@ class ApiParse extends ApiBase {
$oldid = $pageObj->getLatest();
}
- $popts = $pageObj->makeParserOptions( $this->getContext() );
- $popts->enableLimitReport( !$params['disablepp'] );
+ $popts = $this->makeParserOptions( $pageObj, $params );
// Potentially cached
$p_result = $this->getParsedContent( $pageObj, $popts, $pageid,
@@ -170,11 +176,24 @@ class ApiParse extends ApiBase {
$wgTitle = $titleObj;
$pageObj = WikiPage::factory( $titleObj );
- $popts = $pageObj->makeParserOptions( $this->getContext() );
- $popts->enableLimitReport( !$params['disablepp'] );
+ $popts = $this->makeParserOptions( $pageObj, $params );
if ( is_null( $text ) ) {
- $this->dieUsage( 'The text parameter should be passed with the title parameter. Should you be using the "page" parameter instead?', 'params' );
+ if ( $titleProvided && ( $prop || $params['generatexml'] ) ) {
+ $this->setWarning(
+ "'title' used without 'text', and parsed page properties were requested " .
+ "(did you mean to use 'page' instead of 'title'?)"
+ );
+ }
+ // Prevent warning from ContentHandler::makeContent()
+ $text = '';
+ }
+
+ // If we are parsing text, do not use the content model of the default
+ // API title, but default to wikitext to keep BC.
+ if ( !$titleProvided && is_null( $model ) ) {
+ $model = CONTENT_MODEL_WIKITEXT;
+ $this->setWarning( "No 'title' or 'contentmodel' was given, assuming $model." );
}
try {
@@ -194,10 +213,10 @@ class ApiParse extends ApiBase {
// Build a result and bail out
$result_array = array();
$result_array['text'] = array();
- $result->setContent( $result_array['text'], $this->pstContent->serialize( $format ) );
+ ApiResult::setContent( $result_array['text'], $this->pstContent->serialize( $format ) );
if ( isset( $prop['wikitext'] ) ) {
$result_array['wikitext'] = array();
- $result->setContent( $result_array['wikitext'], $this->content->serialize( $format ) );
+ ApiResult::setContent( $result_array['wikitext'], $this->content->serialize( $format ) );
}
$result->addValue( null, $this->getModuleName(), $result_array );
return;
@@ -225,21 +244,35 @@ class ApiParse extends ApiBase {
if ( isset( $prop['text'] ) ) {
$result_array['text'] = array();
- $result->setContent( $result_array['text'], $p_result->getText() );
+ ApiResult::setContent( $result_array['text'], $p_result->getText() );
}
if ( !is_null( $params['summary'] ) ) {
$result_array['parsedsummary'] = array();
- $result->setContent( $result_array['parsedsummary'], Linker::formatComment( $params['summary'], $titleObj ) );
+ ApiResult::setContent( $result_array['parsedsummary'], Linker::formatComment( $params['summary'], $titleObj ) );
+ }
+
+ if ( isset( $prop['langlinks'] ) || isset( $prop['languageshtml'] ) ) {
+ $langlinks = $p_result->getLanguageLinks();
+
+ if ( $params['effectivelanglinks'] ) {
+ // Link flags are ignored for now, but may in the future be
+ // included in the result.
+ $linkFlags = array();
+ wfRunHooks( 'LanguageLinks', array( $titleObj, &$langlinks, &$linkFlags ) );
+ }
+ } else {
+ $langlinks = false;
}
if ( isset( $prop['langlinks'] ) ) {
- $result_array['langlinks'] = $this->formatLangLinks( $p_result->getLanguageLinks() );
+ $result_array['langlinks'] = $this->formatLangLinks( $langlinks );
}
if ( isset( $prop['languageshtml'] ) ) {
- $languagesHtml = $this->languagesHtml( $p_result->getLanguageLinks() );
+ $languagesHtml = $this->languagesHtml( $langlinks );
+
$result_array['languageshtml'] = array();
- $result->setContent( $result_array['languageshtml'], $languagesHtml );
+ ApiResult::setContent( $result_array['languageshtml'], $languagesHtml );
}
if ( isset( $prop['categories'] ) ) {
$result_array['categories'] = $this->formatCategoryLinks( $p_result->getCategories() );
@@ -247,7 +280,7 @@ class ApiParse extends ApiBase {
if ( isset( $prop['categorieshtml'] ) ) {
$categoriesHtml = $this->categoriesHtml( $p_result->getCategories() );
$result_array['categorieshtml'] = array();
- $result->setContent( $result_array['categorieshtml'], $categoriesHtml );
+ ApiResult::setContent( $result_array['categorieshtml'], $categoriesHtml );
}
if ( isset( $prop['links'] ) ) {
$result_array['links'] = $this->formatLinks( $p_result->getLinks() );
@@ -288,7 +321,7 @@ class ApiParse extends ApiBase {
if ( isset( $prop['headhtml'] ) ) {
$result_array['headhtml'] = array();
- $result->setContent( $result_array['headhtml'], $context->getOutput()->headElement( $context->getSkin() ) );
+ ApiResult::setContent( $result_array['headhtml'], $context->getOutput()->headElement( $context->getSkin() ) );
}
}
@@ -298,10 +331,10 @@ class ApiParse extends ApiBase {
if ( isset( $prop['wikitext'] ) ) {
$result_array['wikitext'] = array();
- $result->setContent( $result_array['wikitext'], $this->content->serialize( $format ) );
+ ApiResult::setContent( $result_array['wikitext'], $this->content->serialize( $format ) );
if ( !is_null( $this->pstContent ) ) {
$result_array['psttext'] = array();
- $result->setContent( $result_array['psttext'], $this->pstContent->serialize( $format ) );
+ ApiResult::setContent( $result_array['psttext'], $this->pstContent->serialize( $format ) );
}
}
if ( isset( $prop['properties'] ) ) {
@@ -321,7 +354,7 @@ class ApiParse extends ApiBase {
$xml = $dom->__toString();
}
$result_array['parsetree'] = array();
- $result->setContent( $result_array['parsetree'], $xml );
+ ApiResult::setContent( $result_array['parsetree'], $xml );
}
$result_mapping = array(
@@ -346,6 +379,26 @@ class ApiParse extends ApiBase {
}
/**
+ * Constructs a ParserOptions object
+ *
+ * @param WikiPage $pageObj
+ * @param array $params
+ *
+ * @return ParserOptions
+ */
+ protected function makeParserOptions( WikiPage $pageObj, array $params ) {
+ wfProfileIn( __METHOD__ );
+
+ $popts = $pageObj->makeParserOptions( $this->getContext() );
+ $popts->enableLimitReport( !$params['disablepp'] );
+ $popts->setIsPreview( $params['preview'] || $params['sectionpreview'] );
+ $popts->setIsSectionPreview( $params['sectionpreview'] );
+
+ wfProfileOut( __METHOD__ );
+ return $popts;
+ }
+
+ /**
* @param $page WikiPage
* @param $popts ParserOptions
* @param $pageId Int
@@ -400,7 +453,7 @@ class ApiParse extends ApiBase {
if ( $title ) {
$entry['url'] = wfExpandUrl( $title->getFullURL(), PROTO_CURRENT );
}
- $this->getResult()->setContent( $entry, $bits[1] );
+ ApiResult::setContent( $entry, $bits[1] );
$result[] = $entry;
}
return $result;
@@ -411,7 +464,7 @@ class ApiParse extends ApiBase {
foreach ( $links as $link => $sortkey ) {
$entry = array();
$entry['sortkey'] = $sortkey;
- $this->getResult()->setContent( $entry, $link );
+ ApiResult::setContent( $entry, $link );
$result[] = $entry;
}
return $result;
@@ -465,7 +518,7 @@ class ApiParse extends ApiBase {
foreach ( $nslinks as $title => $id ) {
$entry = array();
$entry['ns'] = $ns;
- $this->getResult()->setContent( $entry, Title::makeTitle( $ns, $title )->getFullText() );
+ ApiResult::setContent( $entry, Title::makeTitle( $ns, $title )->getFullText() );
if ( $id != 0 ) {
$entry['exists'] = '';
}
@@ -487,7 +540,7 @@ class ApiParse extends ApiBase {
$entry['url'] = wfExpandUrl( $title->getFullURL(), PROTO_CURRENT );
}
- $this->getResult()->setContent( $entry, $title->getFullText() );
+ ApiResult::setContent( $entry, $title->getFullText() );
$result[] = $entry;
}
}
@@ -499,7 +552,7 @@ class ApiParse extends ApiBase {
foreach ( $headItems as $tag => $content ) {
$entry = array();
$entry['tag'] = $tag;
- $this->getResult()->setContent( $entry, $content );
+ ApiResult::setContent( $entry, $content );
$result[] = $entry;
}
return $result;
@@ -510,7 +563,7 @@ class ApiParse extends ApiBase {
foreach ( $properties as $name => $value ) {
$entry = array();
$entry['name'] = $name;
- $this->getResult()->setContent( $entry, $value );
+ ApiResult::setContent( $entry, $value );
$result[] = $entry;
}
return $result;
@@ -521,7 +574,7 @@ class ApiParse extends ApiBase {
foreach ( $css as $file => $link ) {
$entry = array();
$entry['file'] = $file;
- $this->getResult()->setContent( $entry, $link );
+ ApiResult::setContent( $entry, $link );
$result[] = $entry;
}
return $result;
@@ -537,9 +590,7 @@ class ApiParse extends ApiBase {
public function getAllowedParams() {
return array(
- 'title' => array(
- ApiBase::PARAM_DFLT => 'API',
- ),
+ 'title' => null,
'text' => null,
'summary' => null,
'page' => null,
@@ -575,10 +626,13 @@ class ApiParse extends ApiBase {
),
'pst' => false,
'onlypst' => false,
+ 'effectivelanglinks' => false,
'uselang' => null,
'section' => null,
'disablepp' => false,
'generatexml' => false,
+ 'preview' => false,
+ 'sectionpreview' => false,
'contentformat' => array(
ApiBase::PARAM_TYPE => ContentHandler::getAllContentFormats(),
),
@@ -590,11 +644,13 @@ class ApiParse extends ApiBase {
public function getParamDescription() {
$p = $this->getModulePrefix();
+ $wikitext = CONTENT_MODEL_WIKITEXT;
return array(
- 'text' => 'Wikitext to parse',
+ 'text' => "Text to parse. Use {$p}title or {$p}contentmodel to control the content model",
'summary' => 'Summary to parse',
'redirects' => "If the {$p}page or the {$p}pageid parameter is set to a redirect, resolve it",
- 'title' => 'Title of page the text belongs to',
+ 'title' => "Title of page the text belongs to. " .
+ "If omitted, \"API\" is used as the title with content model $wikitext",
'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",
@@ -618,34 +674,52 @@ class ApiParse extends ApiBase {
' wikitext - Gives the original wikitext that was parsed',
' properties - Gives various properties defined in the parsed wikitext',
),
+ 'effectivelanglinks' => array(
+ 'Includes language links supplied by extensions',
+ '(for use with prop=langlinks|languageshtml)',
+ ),
'pst' => array(
'Do a pre-save transform on the input before parsing it',
- 'Ignored if page, pageid or oldid is used'
+ "Only valid when used with {$p}text",
),
'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'
+ 'Returns the same wikitext, after a PST has been applied.',
+ "Only valid when used with {$p}text",
),
'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',
- 'generatexml' => 'Generate XML parse tree (requires prop=wikitext)',
- 'contentformat' => 'Content serialization format used for the input text',
- 'contentmodel' => 'Content model of the new content',
+ 'generatexml' => "Generate XML parse tree (requires contentmodel=$wikitext)",
+ 'preview' => 'Parse in preview mode',
+ 'sectionpreview' => 'Parse in section preview mode (enables preview mode too)',
+ 'contentformat' => array(
+ 'Content serialization format used for the input text',
+ "Only valid when used with {$p}text",
+ ),
+ 'contentmodel' => array(
+ "Content model of the input text. Default is the model of the " .
+ "specified ${p}title, or $wikitext if ${p}title is not specified",
+ "Only valid when used with {$p}text",
+ ),
);
}
public function getDescription() {
+ $p = $this->getModulePrefix();
return array(
- 'Parses wikitext and returns parser output',
+ 'Parses content and returns parser output',
'See the various prop-Modules of action=query to get information from the current version of a page',
+ 'There are several ways to specify the text to parse:',
+ "1) Specify a page or revision, using {$p}page, {$p}pageid, or {$p}oldid.",
+ "2) Specify content explicitly, using {$p}text, {$p}title, and {$p}contentmodel.",
+ "3) Specify only a summary to parse. {$p}prop should be given an empty value.",
);
}
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' => 'params', 'info' => 'The text parameter should be passed with the title parameter. Should you be using the "page" parameter instead?' ),
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' ),
@@ -660,7 +734,10 @@ class ApiParse extends ApiBase {
public function getExamples() {
return array(
- 'api.php?action=parse&text={{Project:Sandbox}}'
+ 'api.php?action=parse&page=Project:Sandbox' => 'Parse a page',
+ 'api.php?action=parse&text={{Project:Sandbox}}' => 'Parse wikitext',
+ 'api.php?action=parse&text={{PAGENAME}}&title=Test' => 'Parse wikitext, specifying the page title',
+ 'api.php?action=parse&summary=Some+[[link]]&prop=' => 'Parse a summary',
);
}
diff --git a/includes/api/ApiPatrol.php b/includes/api/ApiPatrol.php
index 4d4fbba9..bd2fde2b 100644
--- a/includes/api/ApiPatrol.php
+++ b/includes/api/ApiPatrol.php
@@ -35,11 +35,27 @@ class ApiPatrol extends ApiBase {
*/
public function execute() {
$params = $this->extractRequestParams();
-
- $rc = RecentChange::newFromID( $params['rcid'] );
- if ( !$rc instanceof RecentChange ) {
- $this->dieUsageMsg( array( 'nosuchrcid', $params['rcid'] ) );
+ $this->requireOnlyOneParameter( $params, 'rcid', 'revid' );
+
+ if ( isset( $params['rcid'] ) ) {
+ $rc = RecentChange::newFromID( $params['rcid'] );
+ if ( !$rc ) {
+ $this->dieUsageMsg( array( 'nosuchrcid', $params['rcid'] ) );
+ }
+ } else {
+ $rev = Revision::newFromId( $params['revid'] );
+ if ( !$rev ) {
+ $this->dieUsageMsg( array( 'nosuchrevid', $params['revid'] ) );
+ }
+ $rc = $rev->getRecentChange();
+ if ( !$rc ) {
+ $this->dieUsage(
+ 'The revision ' . $params['revid'] . " can't be patrolled as it's too old",
+ 'notpatrollable'
+ );
+ }
}
+
$retval = $rc->doMarkPatrolled( $this->getUser() );
if ( $retval ) {
@@ -66,8 +82,10 @@ class ApiPatrol extends ApiBase {
ApiBase::PARAM_REQUIRED => true
),
'rcid' => array(
- ApiBase::PARAM_TYPE => 'integer',
- ApiBase::PARAM_REQUIRED => true
+ ApiBase::PARAM_TYPE => 'integer'
+ ),
+ 'revid' => array(
+ ApiBase::PARAM_TYPE => 'integer'
),
);
}
@@ -76,6 +94,7 @@ class ApiPatrol extends ApiBase {
return array(
'token' => 'Patrol token obtained from list=recentchanges',
'rcid' => 'Recentchanges ID to patrol',
+ 'revid' => 'Revision ID to patrol',
);
}
@@ -94,8 +113,16 @@ class ApiPatrol extends ApiBase {
}
public function getPossibleErrors() {
- return array_merge( parent::getPossibleErrors(), array(
- array( 'nosuchrcid', 'rcid' ),
+ return array_merge(
+ parent::getPossibleErrors(),
+ parent::getRequireOnlyOneParameterErrorMessages( array( 'rcid', 'revid' ) ),
+ array(
+ array( 'nosuchrcid', 'rcid' ),
+ array( 'nosuchrevid', 'revid' ),
+ array(
+ 'code' => 'notpatrollable',
+ 'info' => "The revision can't be patrolled as it's too old"
+ )
) );
}
@@ -109,7 +136,8 @@ class ApiPatrol extends ApiBase {
public function getExamples() {
return array(
- 'api.php?action=patrol&token=123abc&rcid=230672766'
+ 'api.php?action=patrol&token=123abc&rcid=230672766',
+ 'api.php?action=patrol&token=123abc&revid=230672766'
);
}
diff --git a/includes/api/ApiProtect.php b/includes/api/ApiProtect.php
index 503c6920..7830c8b4 100644
--- a/includes/api/ApiProtect.php
+++ b/includes/api/ApiProtect.php
@@ -103,8 +103,7 @@ class ApiProtect extends ApiBase {
$status = $pageObj->doUpdateRestrictions( $protections, $expiryarray, $cascade, $params['reason'], $this->getUser() );
if ( !$status->isOK() ) {
- $errors = $status->getErrorsArray();
- $this->dieUsageMsg( $errors[0] );
+ $this->dieStatus( $status );
}
$res = array(
'title' => $titleObj->getPrefixedText(),
diff --git a/includes/api/ApiPurge.php b/includes/api/ApiPurge.php
index 134f4a0d..0812ba51 100644
--- a/includes/api/ApiPurge.php
+++ b/includes/api/ApiPurge.php
@@ -42,15 +42,15 @@ class ApiPurge extends ApiBase {
*/
private static function addValues( array &$result, $values, $flag = null, $name = null ) {
foreach ( $values as $val ) {
- if( $val instanceof Title ) {
+ if ( $val instanceof Title ) {
$v = array();
ApiQueryBase::addTitleInfo( $v, $val );
- } elseif( $name !== null ) {
+ } elseif ( $name !== null ) {
$v = array( $name => $val );
} else {
$v = $val;
}
- if( $flag !== null ) {
+ if ( $flag !== null ) {
$v[$flag] = '';
}
$result[] = $v;
@@ -64,6 +64,7 @@ class ApiPurge extends ApiBase {
$params = $this->extractRequestParams();
$forceLinkUpdate = $params['forcelinkupdate'];
+ $forceRecursiveLinkUpdate = $params['forcerecursivelinkupdate'];
$pageSet = $this->getPageSet();
$pageSet->execute();
@@ -82,8 +83,8 @@ class ApiPurge extends ApiBase {
$page->doPurge(); // Directly purge and skip the UI part of purge().
$r['purged'] = '';
- if ( $forceLinkUpdate ) {
- if ( !$this->getUser()->pingLimiter() ) {
+ if ( $forceLinkUpdate || $forceRecursiveLinkUpdate ) {
+ if ( !$this->getUser()->pingLimiter( 'linkpurge' ) ) {
global $wgEnableParserCache;
$popts = $page->makeParserOptions( 'canonical' );
@@ -93,7 +94,8 @@ class ApiPurge extends ApiBase {
$p_result = $content->getParserOutput( $title, $page->getLatest(), $popts, $wgEnableParserCache );
# Update the links tables
- $updates = $content->getSecondaryDataUpdates( $title, null, true, $p_result );
+ $updates = $content->getSecondaryDataUpdates(
+ $title, null, $forceRecursiveLinkUpdate, $p_result );
DataUpdate::runUpdates( $updates );
$r['linkupdate'] = '';
@@ -150,7 +152,10 @@ class ApiPurge extends ApiBase {
}
public function getAllowedParams( $flags = 0 ) {
- $result = array( 'forcelinkupdate' => false );
+ $result = array(
+ 'forcelinkupdate' => false,
+ 'forcerecursivelinkupdate' => false
+ );
if ( $flags ) {
$result += $this->getPageSet()->getFinalParams( $flags );
}
@@ -158,8 +163,12 @@ class ApiPurge extends ApiBase {
}
public function getParamDescription() {
- return $this->getPageSet()->getParamDescription()
- + array( 'forcelinkupdate' => 'Update the links tables' );
+ return $this->getPageSet()->getFinalParamDescription()
+ + array(
+ 'forcelinkupdate' => 'Update the links tables',
+ 'forcerecursivelinkupdate' => 'Update the links table, and update ' .
+ 'the links tables for any page that uses this page as a template',
+ );
}
public function getResultProperties() {
@@ -204,7 +213,7 @@ class ApiPurge extends ApiBase {
public function getPossibleErrors() {
return array_merge(
parent::getPossibleErrors(),
- $this->getPageSet()->getPossibleErrors()
+ $this->getPageSet()->getFinalPossibleErrors()
);
}
diff --git a/includes/api/ApiQuery.php b/includes/api/ApiQuery.php
index f69ad234..e03837fc 100644
--- a/includes/api/ApiQuery.php
+++ b/includes/api/ApiQuery.php
@@ -64,6 +64,7 @@ class ApiQuery extends ApiBase {
*/
private static $QueryListModules = array(
'allcategories' => 'ApiQueryAllCategories',
+ 'allfileusages' => 'ApiQueryAllLinks',
'allimages' => 'ApiQueryAllImages',
'alllinks' => 'ApiQueryAllLinks',
'allpages' => 'ApiQueryAllPages',
@@ -102,6 +103,7 @@ class ApiQuery extends ApiBase {
'allmessages' => 'ApiQueryAllMessages',
'siteinfo' => 'ApiQuerySiteinfo',
'userinfo' => 'ApiQueryUserInfo',
+ 'filerepoinfo' => 'ApiQueryFileRepoInfo',
);
/**
@@ -382,7 +384,6 @@ class ApiQuery extends ApiBase {
$modules = $allModules;
$tmp = $completeModules;
$wasPosted = $this->getRequest()->wasPosted();
- $main = $this->getMain();
/** @var $module ApiQueryBase */
foreach ( $allModules as $moduleName => $module ) {
@@ -513,7 +514,7 @@ class ApiQuery extends ApiBase {
ApiQueryBase::addTitleInfo( $vals, $title );
$vals['special'] = '';
if ( $title->isSpecialPage() &&
- !SpecialPageFactory::exists( $title->getDbKey() ) ) {
+ !SpecialPageFactory::exists( $title->getDBkey() ) ) {
$vals['missing'] = '';
} elseif ( $title->getNamespace() == NS_MEDIA &&
!wfFindFile( $title ) ) {
@@ -697,7 +698,7 @@ class ApiQuery extends ApiBase {
}
public function getParamDescription() {
- return $this->getPageSet()->getParamDescription() + array(
+ return $this->getPageSet()->getFinalParamDescription() + 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',
@@ -723,7 +724,7 @@ class ApiQuery extends ApiBase {
public function getPossibleErrors() {
return array_merge(
parent::getPossibleErrors(),
- $this->getPageSet()->getPossibleErrors()
+ $this->getPageSet()->getFinalPossibleErrors()
);
}
@@ -736,6 +737,7 @@ class ApiQuery extends ApiBase {
public function getHelpUrls() {
return array(
+ 'https://www.mediawiki.org/wiki/API:Query',
'https://www.mediawiki.org/wiki/API:Meta',
'https://www.mediawiki.org/wiki/API:Properties',
'https://www.mediawiki.org/wiki/API:Lists',
diff --git a/includes/api/ApiQueryAllCategories.php b/includes/api/ApiQueryAllCategories.php
index 496a0eb8..3f5c6ee7 100644
--- a/includes/api/ApiQueryAllCategories.php
+++ b/includes/api/ApiQueryAllCategories.php
@@ -76,7 +76,7 @@ class ApiQueryAllCategories extends ApiQueryGeneratorBase {
if ( $dir == 'newer' ) {
$this->addWhereRange( 'cat_pages', 'newer', $min, $max );
} else {
- $this->addWhereRange( 'cat_pages', 'older', $max, $min);
+ $this->addWhereRange( 'cat_pages', 'older', $max, $min );
}
if ( isset( $params['prefix'] ) ) {
@@ -121,7 +121,7 @@ class ApiQueryAllCategories extends ApiQueryGeneratorBase {
$pages[] = $titleObj;
} else {
$item = array();
- $result->setContent( $item, $titleObj->getText() );
+ ApiResult::setContent( $item, $titleObj->getText() );
if ( isset( $prop['size'] ) ) {
$item['size'] = intval( $row->cat_pages );
$item['pages'] = $row->cat_pages - $row->cat_subcats - $row->cat_files;
diff --git a/includes/api/ApiQueryAllImages.php b/includes/api/ApiQueryAllImages.php
index e24b162c..ccc7a3a2 100644
--- a/includes/api/ApiQueryAllImages.php
+++ b/includes/api/ApiQueryAllImages.php
@@ -189,7 +189,7 @@ class ApiQueryAllImages extends ApiQueryGeneratorBase {
if ( !is_null( $params['mime'] ) ) {
global $wgMiserMode;
- if ( $wgMiserMode ) {
+ if ( $wgMiserMode ) {
$this->dieUsage( 'MIME search disabled in Miser Mode', 'mimesearchdisabled' );
}
@@ -260,7 +260,7 @@ class ApiQueryAllImages extends ApiQueryGeneratorBase {
}
public function getAllowedParams() {
- return array (
+ return array(
'sort' => array(
ApiBase::PARAM_DFLT => 'name',
ApiBase::PARAM_TYPE => array(
diff --git a/includes/api/ApiQueryAllLinks.php b/includes/api/ApiQueryAllLinks.php
index e355f8b0..47d1bcef 100644
--- a/includes/api/ApiQueryAllLinks.php
+++ b/includes/api/ApiQueryAllLinks.php
@@ -37,24 +37,41 @@ class ApiQueryAllLinks extends ApiQueryGeneratorBase {
$prefix = 'al';
$this->table = 'pagelinks';
$this->tablePrefix = 'pl_';
+ $this->fieldTitle = 'title';
$this->dfltNamespace = NS_MAIN;
+ $this->hasNamespace = true;
$this->indexTag = 'l';
$this->description = 'Enumerate all links that point to a given namespace';
- $this->descriptionLink = 'link';
- $this->descriptionLinked = 'linked';
+ $this->descriptionWhat = 'link';
+ $this->descriptionTargets = 'linked titles';
$this->descriptionLinking = 'linking';
break;
case 'alltransclusions':
$prefix = 'at';
$this->table = 'templatelinks';
$this->tablePrefix = 'tl_';
+ $this->fieldTitle = 'title';
$this->dfltNamespace = NS_TEMPLATE;
+ $this->hasNamespace = true;
$this->indexTag = 't';
$this->description = 'List all transclusions (pages embedded using {{x}}), including non-existing';
- $this->descriptionLink = 'transclusion';
- $this->descriptionLinked = 'transcluded';
+ $this->descriptionWhat = 'transclusion';
+ $this->descriptionTargets = 'transcluded titles';
$this->descriptionLinking = 'transcluding';
break;
+ case 'allfileusages':
+ $prefix = 'af';
+ $this->table = 'imagelinks';
+ $this->tablePrefix = 'il_';
+ $this->fieldTitle = 'to';
+ $this->dfltNamespace = NS_FILE;
+ $this->hasNamespace = false;
+ $this->indexTag = 'f';
+ $this->description = 'List all file usages, including non-existing';
+ $this->descriptionWhat = 'file';
+ $this->descriptionTargets = 'file titles';
+ $this->descriptionLinking = 'using';
+ break;
default:
ApiBase::dieDebug( __METHOD__, 'Unknown module name' );
}
@@ -83,21 +100,29 @@ class ApiQueryAllLinks extends ApiQueryGeneratorBase {
$params = $this->extractRequestParams();
$pfx = $this->tablePrefix;
+ $fieldTitle = $this->fieldTitle;
$prop = array_flip( $params['prop'] );
$fld_ids = isset( $prop['ids'] );
$fld_title = isset( $prop['title'] );
+ if ( $this->hasNamespace ) {
+ $namespace = $params['namespace'];
+ } else {
+ $namespace = $this->dfltNamespace;
+ }
if ( $params['unique'] ) {
if ( $fld_ids ) {
$this->dieUsage(
- "{$this->getModuleName()} cannot return corresponding page ids in unique {$this->descriptionLink}s mode",
+ "{$this->getModuleName()} cannot return corresponding page ids in unique {$this->descriptionWhat}s mode",
'params' );
}
$this->addOption( 'DISTINCT' );
}
$this->addTables( $this->table );
- $this->addWhereFld( $pfx . 'namespace', $params['namespace'] );
+ if ( $this->hasNamespace ) {
+ $this->addWhereFld( $pfx . 'namespace', $namespace );
+ }
$continue = !is_null( $params['continue'] );
if ( $continue ) {
@@ -106,14 +131,14 @@ class ApiQueryAllLinks extends ApiQueryGeneratorBase {
if ( $params['unique'] ) {
$this->dieContinueUsageIf( count( $continueArr ) != 1 );
$continueTitle = $db->addQuotes( $continueArr[0] );
- $this->addWhere( "{$pfx}title $op= $continueTitle" );
+ $this->addWhere( "{$pfx}{$fieldTitle} $op= $continueTitle" );
} else {
$this->dieContinueUsageIf( count( $continueArr ) != 2 );
$continueTitle = $db->addQuotes( $continueArr[0] );
$continueFrom = intval( $continueArr[1] );
$this->addWhere(
- "{$pfx}title $op $continueTitle OR " .
- "({$pfx}title = $continueTitle AND " .
+ "{$pfx}{$fieldTitle} $op $continueTitle OR " .
+ "({$pfx}{$fieldTitle} = $continueTitle AND " .
"{$pfx}from $op= $continueFrom)"
);
}
@@ -122,22 +147,24 @@ class ApiQueryAllLinks extends ApiQueryGeneratorBase {
// 'continue' always overrides 'from'
$from = ( $continue || is_null( $params['from'] ) ? null : $this->titlePartToKey( $params['from'] ) );
$to = ( is_null( $params['to'] ) ? null : $this->titlePartToKey( $params['to'] ) );
- $this->addWhereRange( $pfx . 'title', 'newer', $from, $to );
+ $this->addWhereRange( $pfx . $fieldTitle, 'newer', $from, $to );
if ( isset( $params['prefix'] ) ) {
- $this->addWhere( $pfx . 'title' . $db->buildLike( $this->titlePartToKey( $params['prefix'] ), $db->anyString() ) );
+ $this->addWhere( $pfx . $fieldTitle . $db->buildLike( $this->titlePartToKey( $params['prefix'] ), $db->anyString() ) );
}
- $this->addFields( array( 'pl_title' => $pfx . 'title' ) );
+ $this->addFields( array( 'pl_title' => $pfx . $fieldTitle ) );
$this->addFieldsIf( array( 'pl_from' => $pfx . 'from' ), !$params['unique'] );
- $this->addOption( 'USE INDEX', $pfx . 'namespace' );
+ if ( $this->hasNamespace ) {
+ $this->addOption( 'USE INDEX', $pfx . 'namespace' );
+ }
$limit = $params['limit'];
$this->addOption( 'LIMIT', $limit + 1 );
$sort = ( $params['dir'] == 'descending' ? ' DESC' : '' );
$orderBy = array();
- $orderBy[] = $pfx . 'title' . $sort;
+ $orderBy[] = $pfx . $fieldTitle . $sort;
if ( !$params['unique'] ) {
$orderBy[] = $pfx . 'from' . $sort;
}
@@ -166,7 +193,7 @@ class ApiQueryAllLinks extends ApiQueryGeneratorBase {
$vals['fromid'] = intval( $row->pl_from );
}
if ( $fld_title ) {
- $title = Title::makeTitle( $params['namespace'], $row->pl_title );
+ $title = Title::makeTitle( $namespace, $row->pl_title );
ApiQueryBase::addTitleInfo( $vals, $title );
}
$fit = $result->addValue( array( 'query', $this->getModuleName() ), null, $vals );
@@ -179,7 +206,7 @@ class ApiQueryAllLinks extends ApiQueryGeneratorBase {
break;
}
} elseif ( $params['unique'] ) {
- $titles[] = Title::makeTitle( $params['namespace'], $row->pl_title );
+ $titles[] = Title::makeTitle( $namespace, $row->pl_title );
} else {
$pageids[] = $row->pl_from;
}
@@ -195,7 +222,7 @@ class ApiQueryAllLinks extends ApiQueryGeneratorBase {
}
public function getAllowedParams() {
- return array(
+ $allowedParams = array(
'continue' => null,
'from' => null,
'to' => null,
@@ -228,30 +255,39 @@ class ApiQueryAllLinks extends ApiQueryGeneratorBase {
)
),
);
+ if ( !$this->hasNamespace ) {
+ unset( $allowedParams['namespace'] );
+ }
+ return $allowedParams;
}
public function getParamDescription() {
$p = $this->getModulePrefix();
- $link = $this->descriptionLink;
+ $what = $this->descriptionWhat;
+ $targets = $this->descriptionTargets;
$linking = $this->descriptionLinking;
- return array(
- 'from' => "The title of the $link to start enumerating from",
- 'to' => "The title of the $link to stop enumerating at",
- 'prefix' => "Search for all $link titles that begin with this value",
+ $paramDescription = array(
+ 'from' => "The title of the $what to start enumerating from",
+ 'to' => "The title of the $what to stop enumerating at",
+ 'prefix' => "Search for all $targets that begin with this value",
'unique' => array(
- "Only show distinct $link titles. Cannot be used with {$p}prop=ids.",
- 'When used as a generator, yields target pages instead of source pages.',
+ "Only show distinct $targets. Cannot be used with {$p}prop=ids.",
+ 'When used as a generator, yields target pages instead of source pages.',
),
'prop' => array(
'What pieces of information to include',
" ids - Adds the pageid of the $linking page (Cannot be used with {$p}unique)",
- " title - Adds the title of the $link",
+ " title - Adds the title of the $what",
),
'namespace' => 'The namespace to enumerate',
- 'limit' => "How many total items to return",
+ 'limit' => 'How many total items to return',
'continue' => 'When more results are available, use this to continue',
'dir' => 'The direction in which to list',
);
+ if ( !$this->hasNamespace ) {
+ unset( $paramDescription['namespace'] );
+ }
+ return $paramDescription;
}
public function getResultProperties() {
@@ -272,29 +308,31 @@ class ApiQueryAllLinks extends ApiQueryGeneratorBase {
public function getPossibleErrors() {
$m = $this->getModuleName();
- $link = $this->descriptionLink;
+ $what = $this->descriptionWhat;
return array_merge( parent::getPossibleErrors(), array(
- array( 'code' => 'params', 'info' => "{$m} cannot return corresponding page ids in unique {$link}s mode" ),
+ array( 'code' => 'params', 'info' => "{$m} cannot return corresponding page ids in unique {$what}s mode" ),
) );
}
public function getExamples() {
$p = $this->getModulePrefix();
- $link = $this->descriptionLink;
- $linked = $this->descriptionLinked;
+ $name = $this->getModuleName();
+ $what = $this->descriptionWhat;
+ $targets = $this->descriptionTargets;
return array(
- "api.php?action=query&list=all{$link}s&{$p}from=B&{$p}prop=ids|title"
- => "List $linked titles with page ids they are from, including missing ones. Start at B",
- "api.php?action=query&list=all{$link}s&{$p}unique=&{$p}from=B"
- => "List unique $linked titles",
- "api.php?action=query&generator=all{$link}s&g{$p}unique=&g{$p}from=B"
- => "Gets all $link targets, marking the missing ones",
- "api.php?action=query&generator=all{$link}s&g{$p}from=B"
- => "Gets pages containing the {$link}s",
+ "api.php?action=query&list={$name}&{$p}from=B&{$p}prop=ids|title"
+ => "List $targets with page ids they are from, including missing ones. Start at B",
+ "api.php?action=query&list={$name}&{$p}unique=&{$p}from=B"
+ => "List unique $targets",
+ "api.php?action=query&generator={$name}&g{$p}unique=&g{$p}from=B"
+ => "Gets all $targets, marking the missing ones",
+ "api.php?action=query&generator={$name}&g{$p}from=B"
+ => "Gets pages containing the {$what}s",
);
}
public function getHelpUrls() {
- return "https://www.mediawiki.org/wiki/API:All{$this->descriptionLink}s";
+ $name = ucfirst( $this->getModuleName() );
+ return "https://www.mediawiki.org/wiki/API:{$name}";
}
}
diff --git a/includes/api/ApiQueryAllMessages.php b/includes/api/ApiQueryAllMessages.php
index c9811b0d..d47c7b76 100644
--- a/includes/api/ApiQueryAllMessages.php
+++ b/includes/api/ApiQueryAllMessages.php
@@ -87,7 +87,7 @@ class ApiQueryAllMessages extends ApiQueryBase {
foreach ( $messages_target as $message ) {
// === 0: must be at beginning of string (position 0)
if ( strpos( $message, $params['prefix'] ) === 0 ) {
- if( !$skip ) {
+ if ( !$skip ) {
$skip = true;
}
$messages_filtered[] = $message;
diff --git a/includes/api/ApiQueryAllPages.php b/includes/api/ApiQueryAllPages.php
index d718b967..d95980c2 100644
--- a/includes/api/ApiQueryAllPages.php
+++ b/includes/api/ApiQueryAllPages.php
@@ -174,7 +174,7 @@ class ApiQueryAllPages extends ApiQueryGeneratorBase {
$res = $this->select( __METHOD__ );
//Get gender information
- if( MWNamespace::hasGenderDistinction( $params['namespace'] ) ) {
+ if ( MWNamespace::hasGenderDistinction( $params['namespace'] ) ) {
$users = array();
foreach ( $res as $row ) {
$users[] = $row->page_title;
@@ -304,7 +304,10 @@ class ApiQueryAllPages extends ApiQueryGeneratorBase {
'prtype' => 'Limit to protected pages only',
'prlevel' => "The protection level (must be used with {$p}prtype= parameter)",
'prfiltercascade' => "Filter protections based on cascadingness (ignored when {$p}prtype isn't set)",
- 'filterlanglinks' => 'Filter based on whether a page has langlinks',
+ 'filterlanglinks' => array(
+ 'Filter based on whether a page has langlinks',
+ 'Note that this may not consider langlinks added by extensions.',
+ ),
'limit' => 'How many total pages to return.',
'prexpiry' => array(
'Which protection expiry to filter the page on',
diff --git a/includes/api/ApiQueryAllUsers.php b/includes/api/ApiQueryAllUsers.php
index 7283aa00..1948a51a 100644
--- a/includes/api/ApiQueryAllUsers.php
+++ b/includes/api/ApiQueryAllUsers.php
@@ -83,12 +83,12 @@ class ApiQueryAllUsers extends ApiQueryBase {
if ( !is_null( $params['rights'] ) && count( $params['rights'] ) ) {
$groups = array();
- foreach( $params['rights'] as $r ) {
+ foreach ( $params['rights'] as $r ) {
$groups = array_merge( $groups, User::getGroupsWithPermission( $r ) );
}
// no group with the given right(s) exists, no need for a query
- if( !count( $groups ) ) {
+ if ( !count( $groups ) ) {
$this->getResult()->setIndexedTagName_internal( array( 'query', $this->getModuleName() ), '' );
return;
}
diff --git a/includes/api/ApiQueryBacklinks.php b/includes/api/ApiQueryBacklinks.php
index 3ef6b840..2d1089a7 100644
--- a/includes/api/ApiQueryBacklinks.php
+++ b/includes/api/ApiQueryBacklinks.php
@@ -229,10 +229,10 @@ class ApiQueryBacklinks extends ApiQueryGeneratorBase {
$orderBy = array();
$sort = ( $this->params['dir'] == 'descending' ? ' DESC' : '' );
// Don't order by namespace/title if it's constant in the WHERE clause
- if( $this->hasNS && count( array_unique( $allRedirNs ) ) != 1 ) {
+ if ( $this->hasNS && count( array_unique( $allRedirNs ) ) != 1 ) {
$orderBy[] = $this->bl_ns . $sort;
}
- if( count( array_unique( $allRedirDBkey ) ) != 1 ) {
+ if ( count( array_unique( $allRedirDBkey ) ) != 1 ) {
$orderBy[] = $this->bl_title . $sort;
}
$orderBy[] = $this->bl_from . $sort;
@@ -255,6 +255,9 @@ class ApiQueryBacklinks extends ApiQueryGeneratorBase {
if ( $this->params['limit'] == 'max' ) {
$this->params['limit'] = $this->getMain()->canApiHighLimits() ? $botMax : $userMax;
$result->setParsedLimit( $this->getModuleName(), $this->params['limit'] );
+ } else {
+ $this->params['limit'] = intval( $this->params['limit'] );
+ $this->validateLimit( 'limit', $this->params['limit'], 1, $userMax, $botMax );
}
$this->processContinue();
@@ -294,9 +297,9 @@ class ApiQueryBacklinks extends ApiQueryGeneratorBase {
// 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 } ];
+ $parentID = $this->pageMap[$row->{$this->bl_ns}][$row->{$this->bl_title}];
} else {
- $parentID = $this->pageMap[NS_FILE][$row-> { $this->bl_title } ];
+ $parentID = $this->pageMap[NS_FILE][$row->{$this->bl_title}];
}
$this->continueStr = $this->getContinueRedirStr( $parentID, $row->page_id );
break;
@@ -377,8 +380,8 @@ class ApiQueryBacklinks extends ApiQueryGeneratorBase {
if ( $row->page_is_redirect ) {
$a['redirect'] = '';
}
- $ns = $this->hasNS ? $row-> { $this->bl_ns } : NS_FILE;
- $parentID = $this->pageMap[$ns][$row-> { $this->bl_title } ];
+ $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
$this->resultArr[$parentID]['redirlinks'][] = $a;
$this->getResult()->setIndexedTagName( $this->resultArr[$parentID]['redirlinks'], $this->bl_code );
diff --git a/includes/api/ApiQueryBase.php b/includes/api/ApiQueryBase.php
index 7819ead4..8668e04b 100644
--- a/includes/api/ApiQueryBase.php
+++ b/includes/api/ApiQueryBase.php
@@ -432,7 +432,7 @@ abstract class ApiQueryBase extends ApiBase {
if ( trim( $key ) == '' ) {
return '';
}
- $t = Title::newFromDbKey( $key );
+ $t = Title::newFromDBkey( $key );
// This really shouldn't happen but we gotta check anyway
if ( !$t ) {
$this->dieUsageMsg( array( 'invalidtitle', $key ) );
@@ -478,7 +478,7 @@ abstract class ApiQueryBase extends ApiBase {
* @param $protocol String
* @return null|string
*/
- public function prepareUrlQuerySearchString( $query = null, $protocol = null) {
+ public function prepareUrlQuerySearchString( $query = null, $protocol = null ) {
$db = $this->getDb();
if ( !is_null( $query ) || $query != '' ) {
if ( is_null( $protocol ) ) {
diff --git a/includes/api/ApiQueryBlocks.php b/includes/api/ApiQueryBlocks.php
index d9be9f28..e3c27f5e 100644
--- a/includes/api/ApiQueryBlocks.php
+++ b/includes/api/ApiQueryBlocks.php
@@ -63,7 +63,7 @@ class ApiQueryBlocks extends ApiQueryBase {
$this->addTables( 'ipblocks' );
$this->addFields( 'ipb_auto' );
- $this->addFieldsIf ( 'ipb_id', $fld_id );
+ $this->addFieldsIf( 'ipb_id', $fld_id );
$this->addFieldsIf( array( 'ipb_address', 'ipb_user' ), $fld_user || $fld_userid );
$this->addFieldsIf( 'ipb_by_text', $fld_by );
$this->addFieldsIf( 'ipb_by', $fld_byid );
@@ -91,17 +91,30 @@ class ApiQueryBlocks extends ApiQueryBase {
$this->addWhereFld( 'ipb_auto', 0 );
}
if ( isset( $params['ip'] ) ) {
- list( $ip, $range ) = IP::parseCIDR( $params['ip'] );
- 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 );
+ global $wgBlockCIDRLimit;
+ if ( IP::isIPv4( $params['ip'] ) ) {
+ $type = 'IPv4';
+ $cidrLimit = $wgBlockCIDRLimit['IPv4'];
+ $prefixLen = 0;
+ } elseif ( IP::isIPv6( $params['ip'] ) ) {
+ $type = 'IPv6';
+ $cidrLimit = $wgBlockCIDRLimit['IPv6'];
+ $prefixLen = 3; // IP::toHex output is prefixed with "v6-"
} else {
- $lower = $upper = IP::toHex( $params['ip'] );
+ $this->dieUsage( 'IP parameter is not valid', 'param_ip' );
}
- $prefix = substr( $lower, 0, 4 );
+
+ # Check range validity, if it's a CIDR
+ list( $ip, $range ) = IP::parseCIDR( $params['ip'] );
+ if ( $ip !== false && $range !== false && $range < $cidrLimit ) {
+ $this->dieUsage( "$type CIDR ranges broader than /$cidrLimit are not accepted", 'cidrtoobroad' );
+ }
+
+ # Let IP::parseRange handle calculating $upper, instead of duplicating the logic here.
+ list( $lower, $upper ) = IP::parseRange( $params['ip'] );
+
+ # Extract the common prefix to any rangeblock affecting this IP/CIDR
+ $prefix = substr( $lower, 0, $prefixLen + floor( $cidrLimit / 4 ) );
# Fairly hard to make a malicious SQL statement out of hex characters,
# but it is good practice to add quotes
@@ -120,10 +133,10 @@ class ApiQueryBlocks extends ApiQueryBase {
$show = array_flip( $params['show'] );
/* Check for conflicting parameters. */
- if ( ( isset ( $show['account'] ) && isset ( $show['!account'] ) )
- || ( isset ( $show['ip'] ) && isset ( $show['!ip'] ) )
- || ( isset ( $show['range'] ) && isset ( $show['!range'] ) )
- || ( isset ( $show['temp'] ) && isset ( $show['!temp'] ) )
+ if ( ( isset( $show['account'] ) && isset( $show['!account'] ) )
+ || ( isset( $show['ip'] ) && isset( $show['!ip'] ) )
+ || ( isset( $show['range'] ) && isset( $show['!range'] ) )
+ || ( isset( $show['temp'] ) && isset( $show['!temp'] ) )
) {
$this->dieUsageMsg( 'show' );
}
@@ -294,6 +307,7 @@ class ApiQueryBlocks extends ApiQueryBase {
}
public function getParamDescription() {
+ global $wgBlockCIDRLimit;
$p = $this->getModulePrefix();
return array(
'start' => 'The timestamp to start enumerating from',
@@ -301,8 +315,12 @@ class ApiQueryBlocks extends ApiQueryBase {
'dir' => $this->getDirectionDescription( $p ),
'ids' => 'List of block IDs to list (optional)',
'users' => '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' ),
+ '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 " .
+ "IPv4/{$wgBlockCIDRLimit['IPv4']} or IPv6/{$wgBlockCIDRLimit['IPv6']} " .
+ "are not accepted"
+ ),
'limit' => 'The maximum amount of blocks to list',
'prop' => array(
'Which properties to get',
@@ -383,10 +401,19 @@ class ApiQueryBlocks extends ApiQueryBase {
}
public function getPossibleErrors() {
+ global $wgBlockCIDRLimit;
return array_merge( parent::getPossibleErrors(),
$this->getRequireOnlyOneParameterErrorMessages( array( 'users', 'ip' ) ),
array(
- array( 'code' => 'cidrtoobroad', 'info' => 'CIDR ranges broader than /16 are not accepted' ),
+ array(
+ 'code' => 'cidrtoobroad',
+ 'info' => "IPv4 CIDR ranges broader than /{$wgBlockCIDRLimit['IPv4']} are not accepted"
+ ),
+ array(
+ 'code' => 'cidrtoobroad',
+ 'info' => "IPv6 CIDR ranges broader than /{$wgBlockCIDRLimit['IPv6']} are not accepted"
+ ),
+ array( 'code' => 'param_ip', 'info' => 'IP parameter is not valid' ),
array( 'code' => 'param_user', 'info' => 'User parameter may not be empty' ),
array( 'code' => 'param_user', 'info' => 'User name user is not valid' ),
array( 'show' ),
diff --git a/includes/api/ApiQueryCategories.php b/includes/api/ApiQueryCategories.php
index 69a64415..5d714f57 100644
--- a/includes/api/ApiQueryCategories.php
+++ b/includes/api/ApiQueryCategories.php
@@ -49,7 +49,6 @@ class ApiQueryCategories extends ApiQueryGeneratorBase {
/**
* @param $resultPageSet ApiPageSet
- * @return
*/
private function run( $resultPageSet = null ) {
if ( $this->getPageSet()->getGoodTitleCount() == 0 ) {
@@ -174,7 +173,7 @@ class ApiQueryCategories extends ApiQueryGeneratorBase {
break;
}
- $titles[] = Title :: makeTitle( NS_CATEGORY, $row->cl_to );
+ $titles[] = Title::makeTitle( NS_CATEGORY, $row->cl_to );
}
$resultPageSet->populateFromTitles( $titles );
}
@@ -184,7 +183,7 @@ class ApiQueryCategories extends ApiQueryGeneratorBase {
return array(
'prop' => array(
ApiBase::PARAM_ISMULTI => true,
- ApiBase::PARAM_TYPE => array (
+ ApiBase::PARAM_TYPE => array(
'sortkey',
'timestamp',
'hidden',
diff --git a/includes/api/ApiQueryCategoryMembers.php b/includes/api/ApiQueryCategoryMembers.php
index 9dbd8593..704d108a 100644
--- a/includes/api/ApiQueryCategoryMembers.php
+++ b/includes/api/ApiQueryCategoryMembers.php
@@ -217,7 +217,7 @@ class ApiQueryCategoryMembers extends ApiQueryGeneratorBase {
if ( $fld_sortkeyprefix ) {
$vals['sortkeyprefix'] = $row->cl_sortkey_prefix;
}
- if ( $fld_type ) {
+ if ( $fld_type ) {
$vals['type'] = $row->cl_type;
}
if ( $fld_timestamp ) {
@@ -258,7 +258,7 @@ class ApiQueryCategoryMembers extends ApiQueryGeneratorBase {
'prop' => array(
ApiBase::PARAM_DFLT => 'ids|title',
ApiBase::PARAM_ISMULTI => true,
- ApiBase::PARAM_TYPE => array (
+ ApiBase::PARAM_TYPE => array(
'ids',
'title',
'sortkey',
@@ -267,7 +267,7 @@ class ApiQueryCategoryMembers extends ApiQueryGeneratorBase {
'timestamp',
)
),
- 'namespace' => array (
+ 'namespace' => array(
ApiBase::PARAM_ISMULTI => true,
ApiBase::PARAM_TYPE => 'namespace',
),
diff --git a/includes/api/ApiQueryDeletedrevs.php b/includes/api/ApiQueryDeletedrevs.php
index 890e4ecf..82733133 100644
--- a/includes/api/ApiQueryDeletedrevs.php
+++ b/includes/api/ApiQueryDeletedrevs.php
@@ -50,7 +50,7 @@ class ApiQueryDeletedrevs extends ApiQueryBase {
$fld_user = isset( $prop['user'] );
$fld_userid = isset( $prop['userid'] );
$fld_comment = isset( $prop['comment'] );
- $fld_parsedcomment = isset ( $prop['parsedcomment'] );
+ $fld_parsedcomment = isset( $prop['parsedcomment'] );
$fld_minor = isset( $prop['minor'] );
$fld_len = isset( $prop['len'] );
$fld_sha1 = isset( $prop['sha1'] );
@@ -79,13 +79,13 @@ class ApiQueryDeletedrevs extends ApiQueryBase {
if ( $mode == 'revs' || $mode == 'user' ) {
// Ignore namespace and unique due to inability to know whether they were purposely set
- foreach( array( 'from', 'to', 'prefix', /*'namespace', 'unique'*/ ) as $p ) {
+ foreach ( array( 'from', 'to', 'prefix', /*'namespace', 'unique'*/ ) as $p ) {
if ( !is_null( $params[$p] ) ) {
$this->dieUsage( "The '{$p}' parameter cannot be used in modes 1 or 2", 'badparams' );
}
}
} else {
- foreach( array( 'start', 'end' ) as $p ) {
+ foreach ( array( 'start', 'end' ) as $p ) {
if ( !is_null( $params[$p] ) ) {
$this->dieUsage( "The {$p} parameter cannot be used in mode 3", 'badparams' );
}
diff --git a/includes/api/ApiQueryDuplicateFiles.php b/includes/api/ApiQueryDuplicateFiles.php
index 18dcba85..0311fa7f 100644
--- a/includes/api/ApiQueryDuplicateFiles.php
+++ b/includes/api/ApiQueryDuplicateFiles.php
@@ -48,8 +48,7 @@ class ApiQueryDuplicateFiles extends ApiQueryGeneratorBase {
}
/**
- * @param $resultPageSet ApiPageSet
- * @return
+ * @param ApiPageSet $resultPageSet
*/
private function run( $resultPageSet = null ) {
$params = $this->extractRequestParams();
@@ -59,7 +58,7 @@ class ApiQueryDuplicateFiles extends ApiQueryGeneratorBase {
}
$images = $namespaces[NS_FILE];
- if( $params['dir'] == 'descending' ) {
+ if ( $params['dir'] == 'descending' ) {
$images = array_reverse( $images );
}
@@ -80,7 +79,7 @@ class ApiQueryDuplicateFiles extends ApiQueryGeneratorBase {
}
$filesToFind = array_keys( $images );
- if( $params['localonly'] ) {
+ if ( $params['localonly'] ) {
$files = RepoGroup::singleton()->getLocalRepo()->findFiles( $filesToFind );
} else {
$files = RepoGroup::singleton()->findFiles( $filesToFind );
@@ -98,29 +97,29 @@ class ApiQueryDuplicateFiles extends ApiQueryGeneratorBase {
// find all files with the hashes, result format is: array( hash => array( dup1, dup2 ), hash1 => ... )
$filesToFindBySha1s = array_unique( array_values( $sha1s ) );
- if( $params['localonly'] ) {
+ if ( $params['localonly'] ) {
$filesBySha1s = RepoGroup::singleton()->getLocalRepo()->findBySha1s( $filesToFindBySha1s );
} else {
$filesBySha1s = RepoGroup::singleton()->findBySha1s( $filesToFindBySha1s );
}
// iterate over $images to handle continue param correct
- foreach( $images as $image => $pageId ) {
- if( !isset( $sha1s[$image] ) ) {
+ foreach ( $images as $image => $pageId ) {
+ if ( !isset( $sha1s[$image] ) ) {
continue; //file does not exist
}
$sha1 = $sha1s[$image];
$dupFiles = $filesBySha1s[$sha1];
- if( $params['dir'] == 'descending' ) {
+ if ( $params['dir'] == 'descending' ) {
$dupFiles = array_reverse( $dupFiles );
}
/** @var $dupFile File */
foreach ( $dupFiles as $dupFile ) {
$dupName = $dupFile->getName();
- if( $image == $dupName && $dupFile->isLocal() ) {
+ if ( $image == $dupName && $dupFile->isLocal() ) {
continue; //ignore the local file itself
}
- if( $skipUntilThisDup !== false && $dupName < $skipUntilThisDup ) {
+ if ( $skipUntilThisDup !== false && $dupName < $skipUntilThisDup ) {
continue; //skip to pos after the image from continue param
}
$skipUntilThisDup = false;
@@ -139,7 +138,7 @@ class ApiQueryDuplicateFiles extends ApiQueryGeneratorBase {
'user' => $dupFile->getUser( 'text' ),
'timestamp' => wfTimestamp( TS_ISO_8601, $dupFile->getTimestamp() )
);
- if( !$dupFile->isLocal() ) {
+ if ( !$dupFile->isLocal() ) {
$r['shared'] = '';
}
$fit = $this->addPageSubItem( $pageId, $r );
@@ -149,7 +148,7 @@ class ApiQueryDuplicateFiles extends ApiQueryGeneratorBase {
}
}
}
- if( !$fit ) {
+ if ( !$fit ) {
break;
}
}
diff --git a/includes/api/ApiQueryExtLinksUsage.php b/includes/api/ApiQueryExtLinksUsage.php
index eb9cdf9e..456e87ba 100644
--- a/includes/api/ApiQueryExtLinksUsage.php
+++ b/includes/api/ApiQueryExtLinksUsage.php
@@ -123,7 +123,7 @@ class ApiQueryExtLinksUsage extends ApiQueryGeneratorBase {
if ( $fld_url ) {
$to = $row->el_to;
// expand protocol-relative urls
- if( $params['expandurl'] ) {
+ if ( $params['expandurl'] ) {
$to = wfExpandUrl( $to, PROTO_CANONICAL );
}
$vals['url'] = $to;
@@ -218,13 +218,13 @@ class ApiQueryExtLinksUsage extends ApiQueryGeneratorBase {
),
'offset' => 'Used for paging. Use the value returned for "continue"',
'protocol' => array(
- "Protocol of the url. If empty and {$p}query set, the protocol is http.",
+ "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.',
- 'expandurl' => 'Expand protocol-relative urls with the canonical protocol',
+ 'expandurl' => 'Expand protocol-relative URLs with the canonical protocol',
);
if ( $wgMiserMode ) {
diff --git a/includes/api/ApiQueryExternalLinks.php b/includes/api/ApiQueryExternalLinks.php
index 761b49ea..583ef697 100644
--- a/includes/api/ApiQueryExternalLinks.php
+++ b/includes/api/ApiQueryExternalLinks.php
@@ -88,7 +88,7 @@ class ApiQueryExternalLinks extends ApiQueryBase {
$entry = array();
$to = $row->el_to;
// expand protocol-relative urls
- if( $params['expandurl'] ) {
+ if ( $params['expandurl'] ) {
$to = wfExpandUrl( $to, PROTO_CANONICAL );
}
ApiResult::setContent( $entry, $to );
@@ -131,11 +131,11 @@ class ApiQueryExternalLinks extends ApiQueryBase {
'limit' => 'How many links to return',
'offset' => 'When more results are available, use this to continue',
'protocol' => array(
- "Protocol of the url. If empty and {$p}query set, the protocol is http.",
+ "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. Useful for checking whether a certain page contains a certain external url',
- 'expandurl' => 'Expand protocol-relative urls with the canonical protocol',
+ 'expandurl' => 'Expand protocol-relative URLs with the canonical protocol',
);
}
@@ -148,7 +148,7 @@ class ApiQueryExternalLinks extends ApiQueryBase {
}
public function getDescription() {
- return 'Returns all external urls (not interwikis) from the given page(s)';
+ return 'Returns all external URLs (not interwikis) from the given page(s)';
}
public function getPossibleErrors() {
diff --git a/includes/api/ApiQueryFileRepoInfo.php b/includes/api/ApiQueryFileRepoInfo.php
new file mode 100644
index 00000000..3a353533
--- /dev/null
+++ b/includes/api/ApiQueryFileRepoInfo.php
@@ -0,0 +1,115 @@
+<?php
+/**
+ * Copyright © 2013 Mark Holmquist <mtraceur@member.fsf.org>
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with this program; if not, write to the Free Software Foundation, Inc.,
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ * http://www.gnu.org/copyleft/gpl.html
+ *
+ * @file
+ * @since 1.22
+ */
+
+/**
+ * A query action to return meta information about the foreign file repos
+ * configured on the wiki.
+ *
+ * @ingroup API
+ */
+class ApiQueryFileRepoInfo extends ApiQueryBase {
+
+ public function __construct( $query, $moduleName ) {
+ parent::__construct( $query, $moduleName, 'fri' );
+ }
+
+ protected function getInitialisedRepoGroup() {
+ $repoGroup = RepoGroup::singleton();
+
+ if ( !$repoGroup->reposInitialised ) {
+ $repoGroup->initialiseRepos();
+ }
+
+ return $repoGroup;
+ }
+
+ public function execute() {
+ $params = $this->extractRequestParams();
+ $props = array_flip( $params['prop'] );
+
+ $repos = array();
+
+ $repoGroup = $this->getInitialisedRepoGroup();
+
+ $repoGroup->forEachForeignRepo( function ( $repo ) use ( &$repos, $props ) {
+ $repos[] = array_intersect_key( $repo->getInfo(), $props );
+ } );
+
+ $repos[] = array_intersect_key( $repoGroup->localRepo->getInfo(), $props );
+
+ $result = $this->getResult();
+ $result->setIndexedTagName( $repos, 'repo' );
+ $result->addValue( array( 'query' ), 'repos', $repos );
+ }
+
+ public function getCacheMode( $params ) {
+ return 'public';
+ }
+
+ public function getAllowedParams() {
+ $props = $this->getProps();
+
+ return array(
+ 'prop' => array(
+ ApiBase::PARAM_DFLT => join( '|', $props ),
+ ApiBase::PARAM_ISMULTI => true,
+ ApiBase::PARAM_TYPE => $props,
+ ),
+ );
+ }
+
+ public function getProps() {
+ $props = array();
+ $repoGroup = $this->getInitialisedRepoGroup();
+
+ $repoGroup->forEachForeignRepo( function ( $repo ) use ( &$props ) {
+ $props = array_merge( $props, array_keys( $repo->getInfo() ) );
+ } );
+
+ return array_values( array_unique( array_merge( $props, array_keys( $repoGroup->localRepo->getInfo() ) ) ) );
+ }
+
+ public function getParamDescription() {
+ $p = $this->getModulePrefix();
+ return array(
+ 'prop' => array(
+ 'Which repository properties to get (there may be more available on some wikis):',
+ ' apiurl - URL to the repository API - helpful for getting image info from the host.',
+ ' name - The key of the repository - used in e.g. $wgForeignFileRepos and imageinfo return values.',
+ ' displayname - The human-readable name of the repository wiki.',
+ ' rooturl - Root URL for image paths.',
+ ' local - Whether that repository is the local one or not.',
+ ),
+ );
+ }
+
+ public function getDescription() {
+ return 'Return meta information about image repositories configured on the wiki.';
+ }
+
+ public function getExamples() {
+ return array(
+ 'api.php?action=query&meta=filerepoinfo&friprop=apiurl|name|displayname',
+ );
+ }
+}
diff --git a/includes/api/ApiQueryFilearchive.php b/includes/api/ApiQueryFilearchive.php
index 021074a9..f53cd386 100644
--- a/includes/api/ApiQueryFilearchive.php
+++ b/includes/api/ApiQueryFilearchive.php
@@ -218,7 +218,7 @@ class ApiQueryFilearchive extends ApiQueryBase {
}
public function getAllowedParams() {
- return array (
+ return array(
'from' => null,
'continue' => null,
'to' => null,
@@ -281,7 +281,7 @@ class ApiQueryFilearchive extends ApiQueryBase {
' parseddescription - Parse the description on the version',
' mime - Adds MIME of the image',
' mediatype - Adds the media type of the image',
- ' metadata - Lists EXIF metadata for the version of the image',
+ ' metadata - Lists Exif metadata for the version of the image',
' bitdepth - Adds the bit depth of the version',
' archivename - Adds the file name of the archive version for non-latest versions'
),
@@ -373,4 +373,8 @@ class ApiQueryFilearchive extends ApiQueryBase {
),
);
}
+
+ public function getHelpUrls() {
+ return 'https://www.mediawiki.org/wiki/API:Filearchive';
+ }
}
diff --git a/includes/api/ApiQueryIWBacklinks.php b/includes/api/ApiQueryIWBacklinks.php
index b47d31f2..ebae3e76 100644
--- a/includes/api/ApiQueryIWBacklinks.php
+++ b/includes/api/ApiQueryIWBacklinks.php
@@ -239,4 +239,8 @@ class ApiQueryIWBacklinks extends ApiQueryGeneratorBase {
'api.php?action=query&generator=iwbacklinks&giwbltitle=Test&giwblprefix=wikibooks&prop=info'
);
}
+
+ public function getHelpUrls() {
+ return 'https://www.mediawiki.org/wiki/API:Iwbacklinks';
+ }
}
diff --git a/includes/api/ApiQueryIWLinks.php b/includes/api/ApiQueryIWLinks.php
index fc77b4e6..be539311 100644
--- a/includes/api/ApiQueryIWLinks.php
+++ b/includes/api/ApiQueryIWLinks.php
@@ -81,8 +81,8 @@ class ApiQueryIWLinks extends ApiQueryBase {
$this->addOption( 'ORDER BY', 'iwl_from' . $sort );
} else {
$this->addOption( 'ORDER BY', array(
- 'iwl_title' . $sort,
- 'iwl_from' . $sort
+ 'iwl_from' . $sort,
+ 'iwl_title' . $sort
));
}
} else {
@@ -90,9 +90,10 @@ class ApiQueryIWLinks extends ApiQueryBase {
if ( count( $this->getPageSet()->getGoodTitles() ) == 1 ) {
$this->addOption( 'ORDER BY', 'iwl_prefix' . $sort );
} else {
- $this->addOption( 'ORDER BY', array (
+ $this->addOption( 'ORDER BY', array(
'iwl_from' . $sort,
- 'iwl_prefix' . $sort
+ 'iwl_prefix' . $sort,
+ 'iwl_title' . $sort
));
}
}
@@ -192,4 +193,8 @@ class ApiQueryIWLinks extends ApiQueryBase {
'api.php?action=query&prop=iwlinks&titles=Main%20Page' => 'Get interwiki links from the [[Main Page]]',
);
}
+
+ public function getHelpUrls() {
+ return 'https://www.mediawiki.org/wiki/API:Iwlinks';
+ }
}
diff --git a/includes/api/ApiQueryImageInfo.php b/includes/api/ApiQueryImageInfo.php
index 95c2745a..0ea28684 100644
--- a/includes/api/ApiQueryImageInfo.php
+++ b/includes/api/ApiQueryImageInfo.php
@@ -72,7 +72,7 @@ class ApiQueryImageInfo extends ApiQueryBase {
$result = $this->getResult();
//search only inside the local repo
- if( $params['localonly'] ) {
+ if ( $params['localonly'] ) {
$images = RepoGroup::singleton()->getLocalRepo()->findFiles( $titles );
} else {
$images = RepoGroup::singleton()->findFiles( $titles );
@@ -82,12 +82,17 @@ class ApiQueryImageInfo extends ApiQueryBase {
$start = $title === $fromTitle ? $fromTimestamp : $params['start'];
if ( !isset( $images[$title] ) ) {
- $result->addValue(
- array( 'query', 'pages', intval( $pageId ) ),
- 'imagerepository', ''
- );
- // The above can't fail because it doesn't increase the result size
- continue;
+ if ( isset( $prop['uploadwarning'] ) ) {
+ // Uploadwarning needs info about non-existing files
+ $images[$title] = wfLocalFile( $title );
+ } else {
+ $result->addValue(
+ array( 'query', 'pages', intval( $pageId ) ),
+ 'imagerepository', ''
+ );
+ // The above can't fail because it doesn't increase the result size
+ continue;
+ }
}
/** @var $img File */
@@ -170,9 +175,12 @@ class ApiQueryImageInfo extends ApiQueryBase {
}
break;
}
- $fit = $this->addPageSubItem( $pageId,
- self::getInfo( $oldie, $prop, $result,
- $finalThumbParams, $params['metadataversion'] ) );
+ $fit = self::getTransformCount() < self::TRANSFORM_LIMIT &&
+ $this->addPageSubItem( $pageId,
+ self::getInfo( $oldie, $prop, $result,
+ $finalThumbParams, $params['metadataversion']
+ )
+ );
if ( !$fit ) {
if ( count( $pageIds[NS_FILE] ) == 1 ) {
$this->setContinueEnumParameter( 'start',
@@ -199,21 +207,20 @@ class ApiQueryImageInfo extends ApiQueryBase {
public function getScale( $params ) {
$p = $this->getModulePrefix();
- // Height and width.
- 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'];
+ } elseif ( $params['urlheight'] != -1 ) {
+ // Height is specified but width isn't
+ // Don't set $scale['width']; this signals mergeThumbParams() to fill it with the image's width
+ $scale = array();
+ $scale['height'] = $params['urlheight'];
} else {
$scale = null;
if ( $params['urlparam'] ) {
$this->dieUsage( "{$p}urlparam requires {$p}urlwidth", "urlparam_no_width" );
}
- return $scale;
}
return $scale;
@@ -228,7 +235,21 @@ class ApiQueryImageInfo extends ApiQueryBase {
* @param string $otherParams of otherParams (iiurlparam).
* @return Array of parameters for transform.
*/
- protected function mergeThumbParams ( $image, $thumbParams, $otherParams ) {
+ protected function mergeThumbParams( $image, $thumbParams, $otherParams ) {
+ global $wgThumbLimits;
+
+ if ( !isset( $thumbParams['width'] ) && isset( $thumbParams['height'] ) ) {
+ // We want to limit only by height in this situation, so pass the
+ // image's full width as the limiting width. But some file types
+ // don't have a width of their own, so pick something arbitrary so
+ // thumbnailing the default icon works.
+ if ( $image->getWidth() <= 0 ) {
+ $thumbParams['width'] = max( $wgThumbLimits );
+ } else {
+ $thumbParams['width'] = $image->getWidth();
+ }
+ }
+
if ( !$otherParams ) {
return $thumbParams;
}
@@ -254,8 +275,8 @@ class ApiQueryImageInfo extends ApiQueryBase {
if ( isset( $paramList['width'] ) ) {
if ( intval( $paramList['width'] ) != intval( $thumbParams['width'] ) ) {
- $this->dieUsage( "{$p}urlparam had width of {$paramList['width']} but "
- . "{$p}urlwidth was {$thumbParams['width']}", "urlparam_urlwidth_mismatch" );
+ $this->setWarning( "Ignoring width value set in {$p}urlparam ({$paramList['width']}) "
+ . "in favor of width value derived from {$p}urlwidth/{$p}urlheight ({$thumbParams['width']})" );
}
}
@@ -342,6 +363,7 @@ class ApiQueryImageInfo extends ApiQueryBase {
$mediatype = isset( $prop['mediatype'] );
$archive = isset( $prop['archivename'] );
$bitdepth = isset( $prop['bitdepth'] );
+ $uploadwarning = isset( $prop['uploadwarning'] );
if ( ( $url || $sha1 || $meta || $mime || $mediatype || $archive || $bitdepth )
&& $file->isDeleted( File::DELETED_FILE ) ) {
@@ -411,6 +433,10 @@ class ApiQueryImageInfo extends ApiQueryBase {
$vals['bitdepth'] = $file->getBitDepth();
}
+ if ( $uploadwarning ) {
+ $vals['html'] = SpecialUpload::getExistsWarning( UploadBase::getExistsWarning( $file ) );
+ }
+
return $vals;
}
@@ -461,7 +487,7 @@ class ApiQueryImageInfo extends ApiQueryBase {
if ( $start === null ) {
$start = $img->getTimestamp();
}
- return $img->getOriginalTitle()->getText() . '|' . $start;
+ return $img->getOriginalTitle()->getDBkey() . '|' . $start;
}
public function getAllowedParams() {
@@ -537,9 +563,10 @@ class ApiQueryImageInfo extends ApiQueryBase {
'thumbmime' => ' thumbmime - Adds MIME type of the image thumbnail' .
' (requires url and param ' . $modulePrefix . 'urlwidth)',
'mediatype' => ' mediatype - Adds the media type of the image',
- 'metadata' => ' metadata - Lists EXIF metadata for the version of the image',
+ 'metadata' => ' metadata - Lists Exif metadata for the version of the image',
'archivename' => ' archivename - Adds the file name of the archive version for non-latest versions',
'bitdepth' => ' bitdepth - Adds the bit depth of the version',
+ 'uploadwarning' => ' uploadwarning - Used by the Special:Upload page to get information about an existing file. Not intended for use outside MediaWiki core',
);
}
@@ -547,7 +574,7 @@ class ApiQueryImageInfo extends ApiQueryBase {
* Returns the descriptions for the properties provided by getPropertyNames()
*
* @param array $filter List of properties to filter out
- *
+ * @param string $modulePrefix
* @return array
*/
public static function getPropertyDescriptions( $filter = array(), $modulePrefix = '' ) {
@@ -566,11 +593,12 @@ class ApiQueryImageInfo extends ApiQueryBase {
return array(
'prop' => self::getPropertyDescriptions( array(), $p ),
'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",
+ 'For performance reasons if this option is used, ' .
+ 'no more than ' . self::TRANSFORM_LIMIT . ' scaled images will be returned.' ),
+ 'urlheight' => "Similar to {$p}urlwidth.",
'urlparam' => array( "A handler specific parameter string. For example, pdf's ",
"might use 'page15-100px'. {$p}urlwidth must be used and be consistent with {$p}urlparam" ),
- 'limit' => 'How many image revisions to return',
+ 'limit' => 'How many image revisions to return per image',
'start' => 'Timestamp to start listing from',
'end' => 'Timestamp to stop listing at',
'metadataversion' => array( "Version of metadata to use. if 'latest' is specified, use latest version.",
@@ -714,8 +742,6 @@ class ApiQueryImageInfo extends ApiQueryBase {
array( 'code' => "{$p}urlwidth", 'info' => "{$p}urlheight cannot be used without {$p}urlwidth" ),
array( 'code' => 'urlparam', 'info' => "Invalid value for {$p}urlparam" ),
array( 'code' => 'urlparam_no_width', 'info' => "{$p}urlparam requires {$p}urlwidth" ),
- array( 'code' => 'urlparam_urlwidth_mismatch', 'info' => "The width set in {$p}urlparm doesn't " .
- "match the one in {$p}urlwidth" ),
) );
}
diff --git a/includes/api/ApiQueryInfo.php b/includes/api/ApiQueryInfo.php
index 37cd9159..017684ed 100644
--- a/includes/api/ApiQueryInfo.php
+++ b/includes/api/ApiQueryInfo.php
@@ -56,11 +56,11 @@ class ApiQueryInfo extends ApiQueryBase {
* @return void
*/
public function requestExtraData( $pageSet ) {
- global $wgDisableCounters;
+ global $wgDisableCounters, $wgContentHandlerUseDB;
$pageSet->requestField( 'page_restrictions' );
// when resolving redirects, no page will have this field
- if( !$pageSet->isResolvingRedirects() ) {
+ if ( !$pageSet->isResolvingRedirects() ) {
$pageSet->requestField( 'page_is_redirect' );
}
$pageSet->requestField( 'page_is_new' );
@@ -70,6 +70,9 @@ class ApiQueryInfo extends ApiQueryBase {
$pageSet->requestField( 'page_touched' );
$pageSet->requestField( 'page_latest' );
$pageSet->requestField( 'page_len' );
+ if ( $wgContentHandlerUseDB ) {
+ $pageSet->requestField( 'page_content_model' );
+ }
}
/**
@@ -348,6 +351,10 @@ class ApiQueryInfo extends ApiQueryBase {
$titleExists = $pageid > 0; //$title->exists() needs pageid, which is not set for all title objects
$ns = $title->getNamespace();
$dbkey = $title->getDBkey();
+
+ $pageInfo['contentmodel'] = $title->getContentModel();
+ $pageInfo['pagelanguage'] = $title->getPageLanguage()->getCode();
+
if ( $titleExists ) {
global $wgDisableCounters;
@@ -476,7 +483,7 @@ class ApiQueryInfo extends ApiQueryBase {
$this->protections[$title->getNamespace()][$title->getDBkey()][] = $a;
}
// Also check old restrictions
- foreach( $this->titles as $pageId => $title ) {
+ foreach ( $this->titles as $pageId => $title ) {
if ( $this->pageRestrictions[$pageId] ) {
$namespace = $title->getNamespace();
$dbKey = $title->getDBkey();
@@ -662,7 +669,9 @@ class ApiQueryInfo extends ApiQueryBase {
private function getWatchedInfo() {
$user = $this->getUser();
- if ( $user->isAnon() || count( $this->everything ) == 0 ) {
+ if ( $user->isAnon() || count( $this->everything ) == 0
+ || !$user->isAllowed( 'viewmywatchlist' )
+ ) {
return;
}
@@ -819,7 +828,8 @@ class ApiQueryInfo extends ApiQueryBase {
'starttimestamp' => array(
ApiBase::PROP_TYPE => 'timestamp',
ApiBase::PROP_NULLABLE => true
- )
+ ),
+ 'contentmodel' => 'string',
),
'watched' => array(
'watched' => 'boolean'
diff --git a/includes/api/ApiQueryLangBacklinks.php b/includes/api/ApiQueryLangBacklinks.php
index 7a4880a4..5bd451b6 100644
--- a/includes/api/ApiQueryLangBacklinks.php
+++ b/includes/api/ApiQueryLangBacklinks.php
@@ -195,7 +195,7 @@ class ApiQueryLangBacklinks extends ApiQueryGeneratorBase {
'prop' => array(
'Which properties to get',
' lllang - Adds the language code of the language link',
- ' lltitle - Adds the title of the language ink',
+ ' lltitle - Adds the title of the language link',
),
'limit' => 'How many total pages to return',
'dir' => 'The direction in which to list',
@@ -223,7 +223,8 @@ class ApiQueryLangBacklinks extends ApiQueryGeneratorBase {
return array( 'Find all pages that link to the given language link.',
'Can be used to find all links with a language code, or',
'all links to a title (with a given language).',
- 'Using neither parameter is effectively "All Language Links"',
+ 'Using neither parameter is effectively "All Language Links".',
+ 'Note that this may not consider language links added by extensions.',
);
}
@@ -239,4 +240,8 @@ class ApiQueryLangBacklinks extends ApiQueryGeneratorBase {
'api.php?action=query&generator=langbacklinks&glbltitle=Test&glbllang=fr&prop=info'
);
}
+
+ public function getHelpUrls() {
+ return 'https://www.mediawiki.org/wiki/API:Langbacklinks';
+ }
}
diff --git a/includes/api/ApiQueryLangLinks.php b/includes/api/ApiQueryLangLinks.php
index ac65d2d2..aa796e31 100644
--- a/includes/api/ApiQueryLangLinks.php
+++ b/includes/api/ApiQueryLangLinks.php
@@ -67,18 +67,19 @@ class ApiQueryLangLinks extends ApiQueryBase {
);
}
- $sort = ( $params['dir'] == 'descending' ? ' DESC' : '' );
- if ( isset( $params['lang'] ) ) {
+ //FIXME: (follow-up) To allow extensions to add to the language links, we need
+ // to load them all, add the extra links, then apply paging.
+ // Should not be terrible, it's not going to be more than a few hundred links.
+
+ // Note that, since (ll_from, ll_lang) is a unique key, we don't need
+ // to sort by ll_title to ensure deterministic ordering.
+ $sort = ( $params['dir'] == 'descending' ? ' DESC' : '' );
+ if ( isset( $params['lang'] ) ) {
$this->addWhereFld( 'll_lang', $params['lang'] );
if ( isset( $params['title'] ) ) {
$this->addWhereFld( 'll_title', $params['title'] );
- $this->addOption( 'ORDER BY', 'll_from' . $sort );
- } else {
- $this->addOption( 'ORDER BY', array(
- 'll_title' . $sort,
- 'll_from' . $sort
- ));
}
+ $this->addOption( 'ORDER BY', 'll_from' . $sort );
} else {
// Don't order by ll_from if it's constant in the WHERE clause
if ( count( $this->getPageSet()->getGoodTitles() ) == 1 ) {
diff --git a/includes/api/ApiQueryLogEvents.php b/includes/api/ApiQueryLogEvents.php
index 73dcea49..1a2719ed 100644
--- a/includes/api/ApiQueryLogEvents.php
+++ b/includes/api/ApiQueryLogEvents.php
@@ -49,12 +49,12 @@ class ApiQueryLogEvents extends ApiQueryBase {
$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_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_parsedcomment = isset( $prop['parsedcomment'] );
$this->fld_details = isset( $prop['details'] );
$this->fld_tags = isset( $prop['tags'] );
@@ -67,7 +67,7 @@ class ApiQueryLogEvents extends ApiQueryBase {
$this->addTables( array( 'logging', 'user', 'page' ) );
$this->addOption( 'STRAIGHT_JOIN' );
$this->addJoinConds( array(
- 'user' => array( 'JOIN',
+ 'user' => array( 'LEFT JOIN',
'user_id=log_user' ),
'page' => array( 'LEFT JOIN',
array( 'log_namespace=page_namespace',
@@ -82,8 +82,8 @@ class ApiQueryLogEvents extends ApiQueryBase {
) );
$this->addFieldsIf( array( 'log_id', 'page_id' ), $this->fld_ids );
- $this->addFieldsIf( array( 'log_user', 'user_name' ), $this->fld_user );
- $this->addFieldsIf( 'user_id', $this->fld_userid );
+ $this->addFieldsIf( array( 'log_user', 'log_user_text', 'user_name' ), $this->fld_user );
+ $this->addFieldsIf( 'log_user', $this->fld_userid );
$this->addFieldsIf( array( 'log_namespace', '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 );
@@ -98,8 +98,7 @@ class ApiQueryLogEvents extends ApiQueryBase {
$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'] = 'change_tag_tag_id';
}
if ( !is_null( $params['action'] ) ) {
@@ -241,7 +240,7 @@ class ApiQueryLogEvents extends ApiQueryBase {
break;
case 'rights':
$vals2 = array();
- if( $legacy ) {
+ if ( $legacy ) {
list( $vals2['old'], $vals2['new'] ) = $params;
} else {
$vals2['new'] = implode( ', ', $params['5::newgroups'] );
@@ -265,6 +264,11 @@ class ApiQueryLogEvents extends ApiQueryBase {
$vals[$type] = $vals2;
$params = null;
break;
+ case 'upload':
+ if ( isset( $params['img_timestamp'] ) ) {
+ $params['img_timestamp'] = wfTimestamp( TS_ISO_8601, $params['img_timestamp'] );
+ }
+ break;
}
if ( !is_null( $params ) ) {
$logParams = array();
@@ -331,10 +335,10 @@ class ApiQueryLogEvents extends ApiQueryBase {
$vals['userhidden'] = '';
} else {
if ( $this->fld_user ) {
- $vals['user'] = $row->user_name;
+ $vals['user'] = $row->user_name === null ? $row->log_user_text : $row->user_name;
}
if ( $this->fld_userid ) {
- $vals['userid'] = $row->user_id;
+ $vals['userid'] = $row->log_user;
}
if ( !$row->log_user ) {
diff --git a/includes/api/ApiQueryORM.php b/includes/api/ApiQueryORM.php
index 41d8f11c..a23ff06b 100644
--- a/includes/api/ApiQueryORM.php
+++ b/includes/api/ApiQueryORM.php
@@ -228,7 +228,7 @@ abstract class ApiQueryORM extends ApiQueryBase {
* @return array
*/
public function getAllowedParams() {
- $params = array (
+ $params = array(
'props' => array(
ApiBase::PARAM_TYPE => $this->getTable()->getFieldNames(),
ApiBase::PARAM_ISMULTI => true,
@@ -252,7 +252,7 @@ abstract class ApiQueryORM extends ApiQueryBase {
* @return array
*/
public function getParamDescription() {
- $descriptions = array (
+ $descriptions = array(
'props' => 'Fields to query',
'continue' => 'Offset number from where to continue the query',
'limit' => 'Max amount of rows to return',
diff --git a/includes/api/ApiQueryPagesWithProp.php b/includes/api/ApiQueryPagesWithProp.php
index 0132fc3e..6f2f02e4 100644
--- a/includes/api/ApiQueryPagesWithProp.php
+++ b/includes/api/ApiQueryPagesWithProp.php
@@ -133,7 +133,7 @@ class ApiQueryPagesWithProp extends ApiQueryGeneratorBase {
'prop' => array(
ApiBase::PARAM_DFLT => 'ids|title',
ApiBase::PARAM_ISMULTI => true,
- ApiBase::PARAM_TYPE => array (
+ ApiBase::PARAM_TYPE => array(
'ids',
'title',
'value',
diff --git a/includes/api/ApiQueryProtectedTitles.php b/includes/api/ApiQueryProtectedTitles.php
index 4aa00007..222ad074 100644
--- a/includes/api/ApiQueryProtectedTitles.php
+++ b/includes/api/ApiQueryProtectedTitles.php
@@ -157,7 +157,7 @@ class ApiQueryProtectedTitles extends ApiQueryGeneratorBase {
ApiBase::PARAM_ISMULTI => true,
ApiBase::PARAM_TYPE => array_diff( $wgRestrictionLevels, array( '' ) )
),
- 'limit' => array (
+ 'limit' => array(
ApiBase::PARAM_DFLT => 10,
ApiBase::PARAM_TYPE => 'limit',
ApiBase::PARAM_MIN => 1,
diff --git a/includes/api/ApiQueryQueryPage.php b/includes/api/ApiQueryQueryPage.php
index b03bdfb8..79fe0498 100644
--- a/includes/api/ApiQueryQueryPage.php
+++ b/includes/api/ApiQueryQueryPage.php
@@ -32,27 +32,18 @@
class ApiQueryQueryPage extends ApiQueryGeneratorBase {
private $qpMap;
- /**
- * Some query pages are useless because they're available elsewhere in the API
- */
- private $uselessQueryPages = array(
- 'MIMEsearch', // aiprop=mime
- 'LinkSearch', // list=exturlusage
- 'FileDuplicateSearch', // prop=duplicatefiles
- );
-
public function __construct( $query, $moduleName ) {
parent::__construct( $query, $moduleName, 'qp' );
// We need to do this to make sure $wgQueryPages is set up
// This SUCKS
global $IP;
- require_once( "$IP/includes/QueryPage.php" );
+ require_once "$IP/includes/QueryPage.php";
// Build mapping from special page names to QueryPage classes
- global $wgQueryPages;
+ global $wgQueryPages, $wgAPIUselessQueryPages;
$this->qpMap = array();
foreach ( $wgQueryPages as $page ) {
- if( !in_array( $page[1], $this->uselessQueryPages ) ) {
+ if ( !in_array( $page[1], $wgAPIUselessQueryPages ) ) {
$this->qpMap[$page[1]] = $page[0];
}
}
@@ -222,4 +213,8 @@ class ApiQueryQueryPage extends ApiQueryGeneratorBase {
'api.php?action=query&list=querypage&qppage=Ancientpages'
);
}
+
+ public function getHelpUrls() {
+ return 'https://www.mediawiki.org/wiki/API:Querypage';
+ }
}
diff --git a/includes/api/ApiQueryRandom.php b/includes/api/ApiQueryRandom.php
index ae3bb893..2754bdae 100644
--- a/includes/api/ApiQueryRandom.php
+++ b/includes/api/ApiQueryRandom.php
@@ -185,4 +185,8 @@ class ApiQueryRandom extends ApiQueryGeneratorBase {
public function getExamples() {
return 'api.php?action=query&list=random&rnnamespace=0&rnlimit=2';
}
+
+ public function getHelpUrls() {
+ return 'https://www.mediawiki.org/wiki/API:Random';
+ }
}
diff --git a/includes/api/ApiQueryRecentChanges.php b/includes/api/ApiQueryRecentChanges.php
index 8aceab22..6b10bdc6 100644
--- a/includes/api/ApiQueryRecentChanges.php
+++ b/includes/api/ApiQueryRecentChanges.php
@@ -39,7 +39,7 @@ class ApiQueryRecentChanges extends ApiQueryGeneratorBase {
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, $token = array();
+ $fld_tags = false, $fld_sha1 = false, $token = array();
private $tokenFunctions;
@@ -121,6 +121,7 @@ class ApiQueryRecentChanges extends ApiQueryGeneratorBase {
$this->fld_patrolled = isset( $prop['patrolled'] );
$this->fld_loginfo = isset( $prop['loginfo'] );
$this->fld_tags = isset( $prop['tags'] );
+ $this->fld_sha1 = isset( $prop['sha1'] );
}
public function execute() {
@@ -273,6 +274,12 @@ class ApiQueryRecentChanges extends ApiQueryGeneratorBase {
$this->addFields( 'ts_tags' );
}
+ if ( $this->fld_sha1 ) {
+ $this->addTables( 'revision' );
+ $this->addJoinConds( array( 'revision' => array( 'LEFT JOIN', array( 'rc_this_oldid=rev_id' ) ) ) );
+ $this->addFields( array( 'rev_sha1', 'rev_deleted' ) );
+ }
+
if ( $params['toponly'] || $showRedirects ) {
$this->addTables( 'page' );
$this->addJoinConds( array( 'page' => array( 'LEFT JOIN', array( 'rc_namespace=page_namespace', 'rc_title=page_title' ) ) ) );
@@ -287,8 +294,7 @@ class ApiQueryRecentChanges extends ApiQueryGeneratorBase {
$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'] = 'change_tag_tag_id';
}
$this->token = $params['token'];
@@ -475,6 +481,19 @@ class ApiQueryRecentChanges extends ApiQueryGeneratorBase {
}
}
+ if ( $this->fld_sha1 && $row->rev_sha1 !== null ) {
+ // The RevDel check should currently never pass due to the
+ // rc_deleted = 0 condition in the WHERE clause, but in case that
+ // ever changes we check it here too.
+ if ( $row->rev_deleted & Revision::DELETED_TEXT ) {
+ $vals['sha1hidden'] = '';
+ } elseif ( $row->rev_sha1 !== '' ) {
+ $vals['sha1'] = wfBaseConvert( $row->rev_sha1, 36, 16, 40 );
+ } else {
+ $vals['sha1'] = '';
+ }
+ }
+
if ( !is_null( $this->token ) ) {
$tokenFunctions = $this->getTokenFunctions();
foreach ( $this->token as $t ) {
@@ -499,7 +518,7 @@ class ApiQueryRecentChanges extends ApiQueryGeneratorBase {
}
return $retval;
}
- switch( $type ) {
+ switch ( $type ) {
case 'edit':
return RC_EDIT;
case 'new':
@@ -571,7 +590,8 @@ class ApiQueryRecentChanges extends ApiQueryGeneratorBase {
'redirect',
'patrolled',
'loginfo',
- 'tags'
+ 'tags',
+ 'sha1',
)
),
'token' => array(
@@ -638,6 +658,7 @@ class ApiQueryRecentChanges extends ApiQueryGeneratorBase {
' patrolled - Tags edits that have been patrolled',
' loginfo - Adds log information (logid, logtype, etc) to log entries',
' tags - Lists tags for the entry',
+ ' sha1 - Adds the content checksum for entries associated with a revision',
),
'token' => 'Which tokens to obtain for each change',
'show' => array(
@@ -735,7 +756,17 @@ class ApiQueryRecentChanges extends ApiQueryGeneratorBase {
ApiBase::PROP_TYPE => 'string',
ApiBase::PROP_NULLABLE => true
)
- )
+ ),
+ 'sha1' => array(
+ 'sha1' => array(
+ ApiBase::PROP_TYPE => 'string',
+ ApiBase::PROP_NULLABLE => true
+ ),
+ 'sha1hidden' => array(
+ ApiBase::PROP_TYPE => 'boolean',
+ ApiBase::PROP_NULLABLE => true
+ ),
+ ),
);
self::addTokenProperties( $props, $this->getTokenFunctions() );
diff --git a/includes/api/ApiQueryRevisions.php b/includes/api/ApiQueryRevisions.php
index 192fe873..415288ef 100644
--- a/includes/api/ApiQueryRevisions.php
+++ b/includes/api/ApiQueryRevisions.php
@@ -146,17 +146,17 @@ class ApiQueryRevisions extends ApiQueryBase {
$prop = array_flip( $params['prop'] );
// Optional fields
- $this->fld_ids = isset ( $prop['ids'] );
+ $this->fld_ids = isset( $prop['ids'] );
// $this->addFieldsIf('rev_text_id', $this->fld_ids); // should this be exposed?
- $this->fld_flags = isset ( $prop['flags'] );
- $this->fld_timestamp = isset ( $prop['timestamp'] );
- $this->fld_comment = isset ( $prop['comment'] );
- $this->fld_parsedcomment = isset ( $prop['parsedcomment'] );
- $this->fld_size = isset ( $prop['size'] );
- $this->fld_sha1 = isset ( $prop['sha1'] );
- $this->fld_contentmodel = isset ( $prop['contentmodel'] );
+ $this->fld_flags = isset( $prop['flags'] );
+ $this->fld_timestamp = isset( $prop['timestamp'] );
+ $this->fld_comment = isset( $prop['comment'] );
+ $this->fld_parsedcomment = isset( $prop['parsedcomment'] );
+ $this->fld_size = isset( $prop['size'] );
+ $this->fld_sha1 = isset( $prop['sha1'] );
+ $this->fld_contentmodel = isset( $prop['contentmodel'] );
$this->fld_userid = isset( $prop['userid'] );
- $this->fld_user = isset ( $prop['user'] );
+ $this->fld_user = isset( $prop['user'] );
$this->token = $params['token'];
if ( !empty( $params['contentformat'] ) ) {
@@ -189,8 +189,7 @@ class ApiQueryRevisions extends ApiQueryBase {
$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'] = 'change_tag_tag_id';
}
if ( isset( $prop['content'] ) || !is_null( $this->difftotext ) ) {
@@ -520,7 +519,7 @@ class ApiQueryRevisions extends ApiQueryBase {
} else {
$this->setWarning( "Conversion to XML is supported for wikitext only, " .
$title->getPrefixedDBkey() .
- " uses content model " . $content->getModel() . ")" );
+ " uses content model " . $content->getModel() );
}
}
@@ -533,7 +532,7 @@ class ApiQueryRevisions extends ApiQueryBase {
} else {
$this->setWarning( "Template expansion is supported for wikitext only, " .
$title->getPrefixedDBkey() .
- " uses content model " . $content->getModel() . ")" );
+ " uses content model " . $content->getModel() );
$text = false;
}
@@ -550,7 +549,7 @@ class ApiQueryRevisions extends ApiQueryBase {
if ( !$content->isSupportedFormat( $format ) ) {
$name = $title->getPrefixedDBkey();
- $this->dieUsage( "The requested format {$this->contentFormat} is not supported ".
+ $this->dieUsage( "The requested format {$this->contentFormat} is not supported " .
"for content model $model used by $name", 'badformat' );
}
@@ -593,7 +592,7 @@ class ApiQueryRevisions extends ApiQueryBase {
$name = $title->getPrefixedDBkey();
- $this->dieUsage( "The requested format {$this->contentFormat} is not supported for ".
+ $this->dieUsage( "The requested format {$this->contentFormat} is not supported for " .
"content model $model used by $name", 'badformat' );
}
diff --git a/includes/api/ApiQuerySearch.php b/includes/api/ApiQuerySearch.php
index 86183391..36b55979 100644
--- a/includes/api/ApiQuerySearch.php
+++ b/includes/api/ApiQuerySearch.php
@@ -31,6 +31,14 @@
*/
class ApiQuerySearch extends ApiQueryGeneratorBase {
+ /**
+ * When $wgSearchType is null, $wgSearchAlternatives[0] is null. Null isn't
+ * a valid option for an array for PARAM_TYPE, so we'll use a fake name
+ * that can't possibly be a class name and describes what the null behavior
+ * does
+ */
+ const BACKEND_NULL_PARAM = 'database-backed';
+
public function __construct( $query, $moduleName ) {
parent::__construct( $query, $moduleName, 'sr' );
}
@@ -59,7 +67,8 @@ class ApiQuerySearch extends ApiQueryGeneratorBase {
$prop = array_flip( $params['prop'] );
// Create search engine instance and set options
- $search = SearchEngine::create();
+ $search = isset( $params['backend'] ) && $params['backend'] != self::BACKEND_NULL_PARAM ?
+ SearchEngine::create( $params['backend'] ) : SearchEngine::create();
$search->setLimitOffset( $limit + 1, $params['offset'] );
$search->setNamespaces( $params['namespace'] );
$search->showRedirects = $params['redirects'];
@@ -93,6 +102,8 @@ class ApiQuerySearch extends ApiQueryGeneratorBase {
}
if ( is_null( $matches ) ) {
$this->dieUsage( "{$what} search is disabled", "search-{$what}-disabled" );
+ } elseif ( $matches instanceof Status && !$matches->isGood() ) {
+ $this->dieUsage( $matches->getWikiText(), 'search-error' );
}
$apiResult = $this->getResult();
@@ -199,7 +210,9 @@ class ApiQuerySearch extends ApiQueryGeneratorBase {
}
public function getAllowedParams() {
- return array(
+ global $wgSearchType;
+
+ $params = array(
'search' => array(
ApiBase::PARAM_TYPE => 'string',
ApiBase::PARAM_REQUIRED => true
@@ -252,10 +265,23 @@ class ApiQuerySearch extends ApiQueryGeneratorBase {
ApiBase::PARAM_MAX2 => ApiBase::LIMIT_SML2
)
);
+
+ $alternatives = SearchEngine::getSearchTypes();
+ if ( count( $alternatives ) > 1 ) {
+ if ( $alternatives[0] === null ) {
+ $alternatives[0] = self::BACKEND_NULL_PARAM;
+ }
+ $params['backend'] = array(
+ ApiBase::PARAM_DFLT => $wgSearchType,
+ ApiBase::PARAM_TYPE => $alternatives,
+ );
+ }
+
+ return $params;
}
public function getParamDescription() {
- return array(
+ $descriptions = 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',
@@ -278,6 +304,12 @@ class ApiQuerySearch extends ApiQueryGeneratorBase {
'offset' => 'Use this value to continue paging (return by query)',
'limit' => 'How many total pages to return'
);
+
+ if ( count( SearchEngine::getSearchTypes() ) > 1 ) {
+ $descriptions['backend'] = 'Which search backend to use, if not the default';
+ }
+
+ return $descriptions;
}
public function getResultProperties() {
@@ -345,6 +377,7 @@ class ApiQuerySearch extends ApiQueryGeneratorBase {
return array_merge( parent::getPossibleErrors(), array(
array( 'code' => 'search-text-disabled', 'info' => 'text search is disabled' ),
array( 'code' => 'search-title-disabled', 'info' => 'title search is disabled' ),
+ array( 'code' => 'search-error', 'info' => 'search error has occurred' ),
) );
}
diff --git a/includes/api/ApiQuerySiteinfo.php b/includes/api/ApiQuerySiteinfo.php
index 810e1d6b..a7767062 100644
--- a/includes/api/ApiQuerySiteinfo.php
+++ b/includes/api/ApiQuerySiteinfo.php
@@ -121,14 +121,29 @@ class ApiQuerySiteinfo extends ApiQueryBase {
$data = array();
$mainPage = Title::newMainPage();
$data['mainpage'] = $mainPage->getPrefixedText();
- $data['base'] = wfExpandUrl( $mainPage->getFullUrl(), PROTO_CURRENT );
+ $data['base'] = wfExpandUrl( $mainPage->getFullURL(), PROTO_CURRENT );
$data['sitename'] = $GLOBALS['wgSitename'];
+ $data['logo'] = $GLOBALS['wgLogo'];
$data['generator'] = "MediaWiki {$GLOBALS['wgVersion']}";
$data['phpversion'] = phpversion();
$data['phpsapi'] = PHP_SAPI;
$data['dbtype'] = $GLOBALS['wgDBtype'];
$data['dbversion'] = $this->getDB()->getServerVersion();
+ $allowFrom = array( '' );
+ $allowException = true;
+ if ( !$GLOBALS['wgAllowExternalImages'] ) {
+ if ( $GLOBALS['wgEnableImageWhitelist'] ) {
+ $data['imagewhitelistenabled'] = '';
+ }
+ $allowFrom = $GLOBALS['wgAllowExternalImagesFrom'];
+ $allowException = !empty( $allowFrom );
+ }
+ if ( $allowException ) {
+ $data['externalimages'] = (array)$allowFrom;
+ $this->getResult()->setIndexedTagName( $data['externalimages'], 'prefix' );
+ }
+
if ( !$wgDisableLangConversion ) {
$data['langconversion'] = '';
}
@@ -170,15 +185,15 @@ class ApiQuerySiteinfo extends ApiQueryBase {
$data['lang'] = $GLOBALS['wgLanguageCode'];
$fallbacks = array();
- foreach( $wgContLang->getFallbackLanguages() as $code ) {
+ foreach ( $wgContLang->getFallbackLanguages() as $code ) {
$fallbacks[] = array( 'code' => $code );
}
$data['fallback'] = $fallbacks;
$this->getResult()->setIndexedTagName( $data['fallback'], 'lang' );
- if( $wgContLang->hasVariants() ) {
+ if ( $wgContLang->hasVariants() ) {
$variants = array();
- foreach( $wgContLang->getVariants() as $code ) {
+ foreach ( $wgContLang->getVariants() as $code ) {
$variants[] = array( 'code' => $code );
}
$data['variants'] = $variants;
@@ -281,6 +296,8 @@ class ApiQuerySiteinfo extends ApiQueryBase {
$data[] = $item;
}
+ sort( $data );
+
$this->getResult()->setIndexedTagName( $data, 'ns' );
return $this->getResult()->addValue( 'query', $property, $data );
}
@@ -345,10 +362,10 @@ class ApiQuerySiteinfo extends ApiQueryBase {
$val['language'] = $langNames[$prefix];
}
$val['url'] = wfExpandUrl( $row['iw_url'], PROTO_CURRENT );
- if( isset( $row['iw_wikiid'] ) ) {
+ if ( isset( $row['iw_wikiid'] ) ) {
$val['wikiid'] = $row['iw_wikiid'];
}
- if( isset( $row['iw_api'] ) ) {
+ if ( isset( $row['iw_api'] ) ) {
$val['api'] = $row['iw_api'];
}
@@ -404,11 +421,15 @@ class ApiQuerySiteinfo extends ApiQueryBase {
$data['activeusers'] = intval( SiteStats::activeUsers() );
$data['admins'] = intval( SiteStats::numberingroup( 'sysop' ) );
$data['jobs'] = intval( SiteStats::jobs() );
+
+ wfRunHooks( 'APIQuerySiteInfoStatisticsInfo', array( &$data ) );
+
return $this->getResult()->addValue( 'query', $property, $data );
}
protected function appendUserGroups( $property, $numberInGroup ) {
- global $wgGroupPermissions, $wgAddGroups, $wgRemoveGroups, $wgGroupsAddToSelf, $wgGroupsRemoveFromSelf;
+ global $wgGroupPermissions, $wgAddGroups, $wgRemoveGroups;
+ global $wgGroupsAddToSelf, $wgGroupsRemoveFromSelf;
$data = array();
$result = $this->getResult();
@@ -456,7 +477,7 @@ class ApiQuerySiteinfo extends ApiQueryBase {
global $wgFileExtensions;
$data = array();
- foreach ( $wgFileExtensions as $ext ) {
+ foreach ( array_unique( $wgFileExtensions ) as $ext ) {
$data[] = array( 'ext' => $ext );
}
$this->getResult()->setIndexedTagName( $data, 'fe' );
@@ -520,7 +541,7 @@ class ApiQuerySiteinfo extends ApiQueryBase {
$data = array(
'url' => $url ? $url : '',
- 'text' => $text ? $text : ''
+ 'text' => $text ? $text : ''
);
return $this->getResult()->addValue( 'query', $property, $data );
@@ -544,9 +565,17 @@ class ApiQuerySiteinfo extends ApiQueryBase {
public function appendSkins( $property ) {
$data = array();
+ $usable = Skin::getUsableSkins();
+ $default = Skin::normalizeKey( 'default' );
foreach ( Skin::getSkinNames() as $name => $displayName ) {
$skin = array( 'code' => $name );
ApiResult::setContent( $skin, $displayName );
+ if ( !isset( $usable[$name] ) ) {
+ $skin['unusable'] = '';
+ }
+ if ( $name === $default ) {
+ $skin['default'] = '';
+ }
$data[] = $skin;
}
$this->getResult()->setIndexedTagName( $data, 'skin' );
@@ -661,13 +690,15 @@ class ApiQuerySiteinfo extends ApiQueryBase {
' specialpagealiases - List of special page aliases',
' magicwords - List of magic words and their aliases',
' statistics - Returns site statistics',
- " interwikimap - Returns interwiki map (optionally filtered, (optionally localised by using {$p}inlanguagecode))",
+ " interwikimap - Returns interwiki map " .
+ "(optionally filtered, (optionally localised by using {$p}inlanguagecode))",
' 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 (optionally localised by using {$p}inlanguagecode)",
+ " languages - Returns a list of languages MediaWiki supports" .
+ "(optionally localised by using {$p}inlanguagecode)",
' skins - Returns a list of all enabled skins',
' extensiontags - Returns a list of parser extension tags',
' functionhooks - Returns a list of parser function hooks',
@@ -675,7 +706,7 @@ class ApiQuerySiteinfo extends ApiQueryBase {
' variables - Returns a list of variable IDs',
' protocols - Returns a list of protocols that are allowed in external links.',
),
- 'filteriw' => 'Return only local or only nonlocal entries of the interwiki map',
+ 'filteriw' => 'Return only local or only nonlocal entries of the interwiki map',
'showalldb' => 'List all database servers, not just the one lagging the most',
'numberingroup' => 'Lists the number of users in user groups',
'inlanguagecode' => 'Language code for localised language names (best effort, use CLDR extension)',
@@ -687,9 +718,10 @@ class ApiQuerySiteinfo extends ApiQueryBase {
}
public function getPossibleErrors() {
- return array_merge( parent::getPossibleErrors(), array(
- array( 'code' => 'includeAllDenied', 'info' => 'Cannot view all servers info unless $wgShowHostnames is true' ),
- ) );
+ return array_merge( parent::getPossibleErrors(), array( array(
+ 'code' => 'includeAllDenied',
+ 'info' => 'Cannot view all servers info unless $wgShowHostnames is true'
+ ), ) );
}
public function getExamples() {
diff --git a/includes/api/ApiQueryTags.php b/includes/api/ApiQueryTags.php
index e0637ff7..732df9a4 100644
--- a/includes/api/ApiQueryTags.php
+++ b/includes/api/ApiQueryTags.php
@@ -133,8 +133,7 @@ class ApiQueryTags extends ApiQueryBase {
public function getAllowedParams() {
return array(
- 'continue' => array(
- ),
+ 'continue' => null,
'limit' => array(
ApiBase::PARAM_DFLT => 10,
ApiBase::PARAM_TYPE => 'limit',
@@ -195,4 +194,8 @@ class ApiQueryTags extends ApiQueryBase {
'api.php?action=query&list=tags&tgprop=displayname|description|hitcount'
);
}
+
+ public function getHelpUrls() {
+ return 'https://www.mediawiki.org/wiki/API:Tags';
+ }
}
diff --git a/includes/api/ApiQueryUserContributions.php b/includes/api/ApiQueryUserContributions.php
index 597c412d..9a9be7b2 100644
--- a/includes/api/ApiQueryUserContributions.php
+++ b/includes/api/ApiQueryUserContributions.php
@@ -48,7 +48,7 @@ class ApiQueryContributions extends ApiQueryBase {
$this->fld_ids = isset( $prop['ids'] );
$this->fld_title = isset( $prop['title'] );
$this->fld_comment = isset( $prop['comment'] );
- $this->fld_parsedcomment = isset ( $prop['parsedcomment'] );
+ $this->fld_parsedcomment = isset( $prop['parsedcomment'] );
$this->fld_size = isset( $prop['size'] );
$this->fld_sizediff = isset( $prop['sizediff'] );
$this->fld_flags = isset( $prop['flags'] );
@@ -83,10 +83,10 @@ class ApiQueryContributions extends ApiQueryBase {
// Do the actual query.
$res = $this->select( __METHOD__ );
- if( $this->fld_sizediff ) {
+ if ( $this->fld_sizediff ) {
$revIds = array();
foreach ( $res as $row ) {
- if( $row->rev_parent_id ) {
+ if ( $row->rev_parent_id ) {
$revIds[] = $row->rev_parent_id;
}
}
@@ -255,7 +255,7 @@ class ApiQueryContributions extends ApiQueryBase {
$this->addFieldsIf( 'rev_comment', $this->fld_comment || $this->fld_parsedcomment );
$this->addFieldsIf( 'rev_len', $this->fld_size || $this->fld_sizediff );
$this->addFieldsIf( 'rev_minor_edit', $this->fld_flags );
- $this->addFieldsIf( 'rev_parent_id', $this->fld_flags || $this->fld_sizediff );
+ $this->addFieldsIf( 'rev_parent_id', $this->fld_flags || $this->fld_sizediff || $this->fld_ids );
$this->addFieldsIf( 'rc_patrolled', $this->fld_patrolled );
if ( $this->fld_tags ) {
@@ -268,8 +268,7 @@ class ApiQueryContributions extends ApiQueryBase {
$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'] = 'change_tag_tag_id';
}
if ( $this->params['toponly'] ) {
@@ -297,6 +296,10 @@ class ApiQueryContributions extends ApiQueryBase {
$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?
+
+ if ( !is_null( $row->rev_parent_id ) ) {
+ $vals['parentid'] = intval( $row->rev_parent_id );
+ }
}
$title = Title::makeTitle( $row->page_namespace, $row->page_title );
@@ -474,7 +477,11 @@ class ApiQueryContributions extends ApiQueryBase {
),
'ids' => array(
'pageid' => 'integer',
- 'revid' => 'integer'
+ 'revid' => 'integer',
+ 'parentid' => array(
+ ApiBase::PROP_TYPE => 'integer',
+ ApiBase::PROP_NULLABLE => true
+ )
),
'title' => array(
'ns' => 'namespace',
diff --git a/includes/api/ApiQueryUserInfo.php b/includes/api/ApiQueryUserInfo.php
index 1a491eca..3c85ea69 100644
--- a/includes/api/ApiQueryUserInfo.php
+++ b/includes/api/ApiQueryUserInfo.php
@@ -104,12 +104,15 @@ class ApiQueryUserInfo extends ApiQueryBase {
}
if ( isset( $this->prop['preferencestoken'] ) &&
- is_null( $this->getMain()->getRequest()->getVal( 'callback' ) )
+ is_null( $this->getMain()->getRequest()->getVal( 'callback' ) ) &&
+ $user->isAllowed( 'editmyoptions' )
) {
$vals['preferencestoken'] = $user->getEditToken( '', $this->getMain()->getRequest() );
}
if ( isset( $this->prop['editcount'] ) ) {
+ // use intval to prevent null if a non-logged-in user calls
+ // api.php?format=jsonfm&action=query&meta=userinfo&uiprop=editcount
$vals['editcount'] = intval( $user->getEditCount() );
}
@@ -121,11 +124,13 @@ class ApiQueryUserInfo extends ApiQueryBase {
$vals['realname'] = $user->getRealName();
}
- if ( isset( $this->prop['email'] ) ) {
- $vals['email'] = $user->getEmail();
- $auth = $user->getEmailAuthenticationTimestamp();
- if ( !is_null( $auth ) ) {
- $vals['emailauthenticated'] = wfTimestamp( TS_ISO_8601, $auth );
+ if ( $user->isAllowed( 'viewmyprivateinfo' ) ) {
+ if ( isset( $this->prop['email'] ) ) {
+ $vals['email'] = $user->getEmail();
+ $auth = $user->getEmailAuthenticationTimestamp();
+ if ( !is_null( $auth ) ) {
+ $vals['emailauthenticated'] = wfTimestamp( TS_ISO_8601, $auth );
+ }
}
}
@@ -167,8 +172,9 @@ class ApiQueryUserInfo extends ApiQueryBase {
if ( $user->isNewbie() ) {
$categories[] = 'ip';
$categories[] = 'subnet';
- if ( !$user->isAnon() )
+ if ( !$user->isAnon() ) {
$categories[] = 'newbie';
+ }
}
$categories = array_merge( $categories, $user->getGroups() );
diff --git a/includes/api/ApiQueryUsers.php b/includes/api/ApiQueryUsers.php
index 72ab7866..dccfee67 100644
--- a/includes/api/ApiQueryUsers.php
+++ b/includes/api/ApiQueryUsers.php
@@ -127,7 +127,7 @@ class ApiQueryUsers extends ApiQueryBase {
$this->addFields( array( 'user_name', 'ug_group' ) );
$userGroupsRes = $this->select( __METHOD__ );
- foreach( $userGroupsRes as $row ) {
+ foreach ( $userGroupsRes as $row ) {
$userGroups[$row->user_name][] = $row->ug_group;
}
}
@@ -149,7 +149,7 @@ class ApiQueryUsers extends ApiQueryBase {
$data[$name]['name'] = $name;
if ( isset( $this->prop['editcount'] ) ) {
- $data[$name]['editcount'] = intval( $user->getEditCount() );
+ $data[$name]['editcount'] = $user->getEditCount();
}
if ( isset( $this->prop['registration'] ) ) {
@@ -204,11 +204,13 @@ class ApiQueryUsers extends ApiQueryBase {
}
}
+ $context = $this->getContext();
// Second pass: add result data to $retval
foreach ( $goodNames as $u ) {
if ( !isset( $data[$u] ) ) {
$data[$u] = array( 'name' => $u );
$urPage = new UserrightsPage;
+ $urPage->setContext( $context );
$iwUser = $urPage->fetchUser( $u );
if ( $iwUser instanceof UserRightsProxy ) {
diff --git a/includes/api/ApiQueryWatchlist.php b/includes/api/ApiQueryWatchlist.php
index 90b12c14..22843f50 100644
--- a/includes/api/ApiQueryWatchlist.php
+++ b/includes/api/ApiQueryWatchlist.php
@@ -68,7 +68,7 @@ class ApiQueryWatchlist extends ApiQueryGeneratorBase {
$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_parsedcomment = isset( $prop['parsedcomment'] );
$this->fld_timestamp = isset( $prop['timestamp'] );
$this->fld_sizes = isset( $prop['sizes'] );
$this->fld_patrol = isset( $prop['patrol'] );
@@ -135,7 +135,7 @@ class ApiQueryWatchlist extends ApiQueryGeneratorBase {
if ( !$params['allrev'] ) {
$this->addTables( 'page' );
- $this->addJoinConds( array( 'page' => array( 'LEFT JOIN','rc_cur_id=page_id' ) ) );
+ $this->addJoinConds( array( 'page' => array( 'LEFT JOIN', 'rc_cur_id=page_id' ) ) );
$this->addWhere( 'rc_this_oldid=page_latest OR rc_type=' . RC_LOG );
}
@@ -143,12 +143,11 @@ class ApiQueryWatchlist extends ApiQueryGeneratorBase {
$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['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['patrolled'] ) && isset( $show['!patrolled'] ) )
+ ) {
$this->dieUsageMsg( 'show' );
}
@@ -171,6 +170,10 @@ class ApiQueryWatchlist extends ApiQueryGeneratorBase {
$this->addWhereIf( 'rc_patrolled != 0', isset( $show['patrolled'] ) );
}
+ if ( !is_null( $params['type'] ) ) {
+ $this->addWhereFld( 'rc_type', $this->parseRCType( $params['type'] ) );
+ }
+
if ( !is_null( $params['user'] ) && !is_null( $params['excludeuser'] ) ) {
$this->dieUsage( 'user and excludeuser cannot be used together', 'user-excludeuser' );
}
@@ -226,6 +229,32 @@ class ApiQueryWatchlist extends ApiQueryGeneratorBase {
private function extractRowInfo( $row ) {
$vals = array();
+ $type = intval( $row->rc_type );
+
+ /* Determine what kind of change this was. */
+ switch ( $type ) {
+ case RC_EDIT:
+ $vals['type'] = 'edit';
+ break;
+ case RC_NEW:
+ $vals['type'] = 'new';
+ break;
+ case RC_MOVE:
+ $vals['type'] = 'move';
+ break;
+ case RC_LOG:
+ $vals['type'] = 'log';
+ break;
+ case RC_EXTERNAL:
+ $vals['type'] = 'external';
+ break;
+ case RC_MOVE_OVER_REDIRECT:
+ $vals['type'] = 'move over redirect';
+ break;
+ default:
+ $vals['type'] = $type;
+ }
+
if ( $this->fld_ids ) {
$vals['pageid'] = intval( $row->rc_cur_id );
$vals['revid'] = intval( $row->rc_this_oldid );
@@ -312,6 +341,27 @@ class ApiQueryWatchlist extends ApiQueryGeneratorBase {
return $vals;
}
+ /* Copied from ApiQueryRecentChanges. */
+ 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;
+ case 'external':
+ return RC_EXTERNAL;
+ }
+ }
+
public function getAllowedParams() {
return array(
'allrev' => false,
@@ -321,7 +371,7 @@ class ApiQueryWatchlist extends ApiQueryGeneratorBase {
'end' => array(
ApiBase::PARAM_TYPE => 'timestamp'
),
- 'namespace' => array (
+ 'namespace' => array(
ApiBase::PARAM_ISMULTI => true,
ApiBase::PARAM_TYPE => 'namespace'
),
@@ -376,6 +426,15 @@ class ApiQueryWatchlist extends ApiQueryGeneratorBase {
'!patrolled',
)
),
+ 'type' => array(
+ ApiBase::PARAM_ISMULTI => true,
+ ApiBase::PARAM_TYPE => array(
+ 'edit',
+ 'external',
+ 'new',
+ 'log',
+ )
+ ),
'owner' => array(
ApiBase::PARAM_TYPE => 'user'
),
@@ -415,6 +474,13 @@ class ApiQueryWatchlist extends ApiQueryGeneratorBase {
'Show only items that meet this criteria.',
"For example, to see only minor edits done by logged-in users, set {$p}show=minor|!anon"
),
+ 'type' => array(
+ 'Which types of changes to show',
+ ' edit - Regular page edits',
+ ' external - External changes',
+ ' new - Page creations',
+ ' log - Log entries',
+ ),
'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'
);
@@ -423,6 +489,17 @@ class ApiQueryWatchlist extends ApiQueryGeneratorBase {
public function getResultProperties() {
global $wgLogTypes;
return array(
+ '' => array(
+ 'type' => array(
+ ApiBase::PROP_TYPE => array(
+ 'edit',
+ 'new',
+ 'move',
+ 'log',
+ 'move over redirect'
+ )
+ )
+ ),
'ids' => array(
'pageid' => 'integer',
'revid' => 'integer',
diff --git a/includes/api/ApiQueryWatchlistRaw.php b/includes/api/ApiQueryWatchlistRaw.php
index 2cb4d9eb..ea4e724a 100644
--- a/includes/api/ApiQueryWatchlistRaw.php
+++ b/includes/api/ApiQueryWatchlistRaw.php
@@ -222,4 +222,8 @@ class ApiQueryWatchlistRaw extends ApiQueryGeneratorBase {
'api.php?action=query&generator=watchlistraw&gwrshow=changed&prop=revisions',
);
}
+
+ public function getHelpUrls() {
+ return 'https://www.mediawiki.org/wiki/API:Watchlistraw';
+ }
}
diff --git a/includes/api/ApiRsd.php b/includes/api/ApiRsd.php
index c4a1328c..d219c91c 100644
--- a/includes/api/ApiRsd.php
+++ b/includes/api/ApiRsd.php
@@ -40,7 +40,7 @@ class ApiRsd extends ApiBase {
$service = array( 'apis' => $this->formatRsdApiList() );
ApiResult::setContent( $service, 'MediaWiki', 'engineName' );
ApiResult::setContent( $service, 'https://www.mediawiki.org/', 'engineLink' );
- ApiResult::setContent( $service, Title::newMainPage()->getCanonicalUrl(), 'homePageLink' );
+ ApiResult::setContent( $service, Title::newMainPage()->getCanonicalURL(), 'homePageLink' );
$result->setIndexedTagName( $service['apis'], 'api' );
diff --git a/includes/api/ApiSetNotificationTimestamp.php b/includes/api/ApiSetNotificationTimestamp.php
index 58d5d9ab..53a68fde 100644
--- a/includes/api/ApiSetNotificationTimestamp.php
+++ b/includes/api/ApiSetNotificationTimestamp.php
@@ -39,6 +39,9 @@ class ApiSetNotificationTimestamp extends ApiBase {
if ( $user->isAnon() ) {
$this->dieUsage( 'Anonymous users cannot use watchlist change notifications', 'notloggedin' );
}
+ if ( !$user->isAllowed( 'editmywatchlist' ) ) {
+ $this->dieUsage( 'You don\'t have permission to edit your watchlist', 'permissiondenied' );
+ }
$params = $this->extractRequestParams();
$this->requireMaxOneParameter( $params, 'timestamp', 'torevid', 'newerthanrevid' );
@@ -212,7 +215,7 @@ class ApiSetNotificationTimestamp extends ApiBase {
}
public function getParamDescription() {
- return $this->getPageSet()->getParamDescription() + array(
+ return $this->getPageSet()->getFinalParamDescription() + array(
'entirewatchlist' => 'Work on all watched pages',
'timestamp' => 'Timestamp to which to set the notification timestamp',
'torevid' => 'Revision to set the notification timestamp to (one page only)',
@@ -270,7 +273,7 @@ class ApiSetNotificationTimestamp extends ApiBase {
$ps = $this->getPageSet();
return array_merge(
parent::getPossibleErrors(),
- $ps->getPossibleErrors(),
+ $ps->getFinalPossibleErrors(),
$this->getRequireMaxOneParameterErrorMessages(
array( 'timestamp', 'torevid', 'newerthanrevid' ) ),
$this->getRequireOnlyOneParameterErrorMessages(
diff --git a/includes/api/ApiUpload.php b/includes/api/ApiUpload.php
index 7d67aa6e..467eccf8 100644
--- a/includes/api/ApiUpload.php
+++ b/includes/api/ApiUpload.php
@@ -56,15 +56,19 @@ class ApiUpload extends ApiBase {
$this->mParams['chunk'] = $request->getFileName( 'chunk' );
// Copy the session key to the file key, for backward compatibility.
- if( !$this->mParams['filekey'] && $this->mParams['sessionkey'] ) {
+ if ( !$this->mParams['filekey'] && $this->mParams['sessionkey'] ) {
$this->mParams['filekey'] = $this->mParams['sessionkey'];
}
// Select an upload module
- if ( !$this->selectUploadModule() ) {
- return; // not a true upload, but a status request or similar
- } elseif ( !isset( $this->mUpload ) ) {
- $this->dieUsage( 'No upload module set', 'nomodule' );
+ try {
+ if ( !$this->selectUploadModule() ) {
+ return; // not a true upload, but a status request or similar
+ } elseif ( !isset( $this->mUpload ) ) {
+ $this->dieUsage( 'No upload module set', 'nomodule' );
+ }
+ } catch ( UploadStashException $e ) { // XXX: don't spam exception log
+ $this->dieUsage( get_class( $e ) . ": " . $e->getMessage(), 'stasherror' );
}
// First check permission to upload
@@ -82,7 +86,7 @@ class ApiUpload extends ApiBase {
// Check if the uploaded file is sane
if ( $this->mParams['chunk'] ) {
$maxSize = $this->mUpload->getMaxUploadSize();
- if( $this->mParams['filesize'] > $maxSize ) {
+ if ( $this->mParams['filesize'] > $maxSize ) {
$this->dieUsage( 'The file you submitted was too large', 'file-too-large' );
}
if ( !$this->mUpload->getTitle() ) {
@@ -106,9 +110,13 @@ class ApiUpload extends ApiBase {
}
// Get the result based on the current upload context:
- $result = $this->getContextResult();
- if ( $result['result'] === 'Success' ) {
- $result['imageinfo'] = $this->mUpload->getImageInfo( $this->getResult() );
+ try {
+ $result = $this->getContextResult();
+ if ( $result['result'] === 'Success' ) {
+ $result['imageinfo'] = $this->mUpload->getImageInfo( $this->getResult() );
+ }
+ } catch ( UploadStashException $e ) { // XXX: don't spam exception log
+ $this->dieUsage( get_class( $e ) . ": " . $e->getMessage(), 'stasherror' );
}
$this->getResult()->addValue( null, $this->getModuleName(), $result );
@@ -144,7 +152,7 @@ class ApiUpload extends ApiBase {
* @return array
*/
private function getStashResult( $warnings ) {
- $result = array ();
+ $result = array();
// 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 {
@@ -216,27 +224,27 @@ class ApiUpload extends ApiBase {
// Check we added the last chunk:
if ( $this->mParams['offset'] + $chunkSize == $this->mParams['filesize'] ) {
if ( $this->mParams['async'] ) {
- $progress = UploadBase::getSessionStatus( $this->mParams['filekey'] );
+ $progress = UploadBase::getSessionStatus( $filekey );
if ( $progress && $progress['result'] === 'Poll' ) {
$this->dieUsage( "Chunk assembly already in progress.", 'stashfailed' );
}
UploadBase::setSessionStatus(
- $this->mParams['filekey'],
+ $filekey,
array( 'result' => 'Poll',
'stage' => 'queued', 'status' => Status::newGood() )
);
$ok = JobQueueGroup::singleton()->push( new AssembleUploadChunksJob(
- Title::makeTitle( NS_FILE, $this->mParams['filekey'] ),
+ Title::makeTitle( NS_FILE, $filekey ),
array(
- 'filename' => $this->mParams['filename'],
- 'filekey' => $this->mParams['filekey'],
- 'session' => $this->getContext()->exportSession()
+ 'filename' => $this->mParams['filename'],
+ 'filekey' => $filekey,
+ 'session' => $this->getContext()->exportSession()
)
) );
if ( $ok ) {
$result['result'] = 'Poll';
} else {
- UploadBase::setSessionStatus( $this->mParams['filekey'], false );
+ UploadBase::setSessionStatus( $filekey, false );
$this->dieUsage(
"Failed to start AssembleUploadChunks.php", 'stashfailed' );
}
@@ -358,11 +366,9 @@ class ApiUpload extends ApiBase {
}
if ( $this->mParams['chunk'] ) {
- $this->checkChunkedEnabled();
-
// Chunk upload
$this->mUpload = new UploadFromChunks();
- if( isset( $this->mParams['filekey'] ) ) {
+ if ( isset( $this->mParams['filekey'] ) ) {
// handle new chunk
$this->mUpload->continueChunks(
$this->mParams['filename'],
@@ -404,6 +410,10 @@ class ApiUpload extends ApiBase {
$this->dieUsageMsg( 'copyuploadbaddomain' );
}
+ if ( !UploadFromUrl::isAllowedUrl( $this->mParams['url'] ) ) {
+ $this->dieUsageMsg( 'copyuploadbadurl' );
+ }
+
$async = false;
if ( $this->mParams['asyncdownload'] ) {
$this->checkAsyncDownloadEnabled();
@@ -452,9 +462,9 @@ class ApiUpload extends ApiBase {
$verification = $this->mUpload->verifyUpload();
if ( $verification['status'] === UploadBase::OK ) {
return;
- } else {
- return $this->checkVerification( $verification );
}
+
+ $this->checkVerification( $verification );
}
/**
@@ -463,8 +473,8 @@ class ApiUpload extends ApiBase {
protected function checkVerification( array $verification ) {
global $wgFileExtensions;
- // TODO: Move them to ApiBase's message map
- switch( $verification['status'] ) {
+ // @todo Move them to ApiBase's message map
+ switch ( $verification['status'] ) {
// Recoverable errors
case UploadBase::MIN_LENGTH_PARTNAME:
$this->dieRecoverableError( 'filename-tooshort', 'filename' );
@@ -494,7 +504,7 @@ class ApiUpload extends ApiBase {
case UploadBase::FILETYPE_BADTYPE:
$extradata = array(
'filetype' => $verification['finalExt'],
- 'allowed' => $wgFileExtensions
+ 'allowed' => array_values( array_unique( $wgFileExtensions ) )
);
$this->getResult()->setIndexedTagName( $extradata['allowed'], 'ext' );
@@ -555,7 +565,8 @@ class ApiUpload extends ApiBase {
if ( isset( $warnings['exists'] ) ) {
$warning = $warnings['exists'];
unset( $warnings['exists'] );
- $warnings[$warning['warning']] = $warning['file']->getName();
+ $localFile = isset( $warning['normalizedFile'] ) ? $warning['normalizedFile'] : $warning['file'];
+ $warnings[$warning['warning']] = $localFile->getName();
}
}
return $warnings;
@@ -596,12 +607,12 @@ class ApiUpload extends ApiBase {
$ok = JobQueueGroup::singleton()->push( new PublishStashedFileJob(
Title::makeTitle( NS_FILE, $this->mParams['filename'] ),
array(
- 'filename' => $this->mParams['filename'],
- 'filekey' => $this->mParams['filekey'],
- 'comment' => $this->mParams['comment'],
- 'text' => $this->mParams['text'],
- 'watch' => $watch,
- 'session' => $this->getContext()->exportSession()
+ 'filename' => $this->mParams['filename'],
+ 'filekey' => $this->mParams['filekey'],
+ 'comment' => $this->mParams['comment'],
+ 'text' => $this->mParams['text'],
+ 'watch' => $watch,
+ 'session' => $this->getContext()->exportSession()
)
) );
if ( $ok ) {
@@ -653,13 +664,6 @@ class ApiUpload extends ApiBase {
}
}
- protected function checkChunkedEnabled() {
- global $wgAllowChunkedUploads;
- if ( !$wgAllowChunkedUploads ) {
- $this->dieUsage( 'Chunked uploads disabled', 'chunkeduploaddisabled' );
- }
- }
-
public function mustBePosted() {
return true;
}
@@ -816,7 +820,7 @@ class ApiUpload extends ApiBase {
array( 'code' => 'publishfailed', 'info' => 'Publishing of stashed file failed' ),
array( 'code' => 'internal-error', 'info' => 'An internal error occurred' ),
array( 'code' => 'asynccopyuploaddisabled', 'info' => 'Asynchronous copy uploads disabled' ),
- array( 'code' => 'chunkeduploaddisabled', 'info' => 'Chunked uploads disabled' ),
+ array( 'code' => 'stasherror', 'info' => 'An upload stash error occurred' ),
array( 'fileexists-forbidden' ),
array( 'fileexists-shared-forbidden' ),
)
diff --git a/includes/api/ApiUserrights.php b/includes/api/ApiUserrights.php
index b9b1eeda..7d308285 100644
--- a/includes/api/ApiUserrights.php
+++ b/includes/api/ApiUserrights.php
@@ -38,6 +38,7 @@ class ApiUserrights extends ApiBase {
$user = $this->getUrUser();
$form = new UserrightsPage;
+ $form->setContext( $this->getContext() );
$r['user'] = $user->getName();
$r['userid'] = $user->getId();
list( $r['added'], $r['removed'] ) =
@@ -62,10 +63,10 @@ class ApiUserrights extends ApiBase {
$params = $this->extractRequestParams();
$form = new UserrightsPage;
+ $form->setContext( $this->getContext() );
$status = $form->fetchUser( $params['user'] );
if ( !$status->isOK() ) {
- $errors = $status->getErrorsArray();
- $this->dieUsageMsg( $errors[0] );
+ $this->dieStatus( $status );
} else {
$user = $status->value;
}
@@ -83,7 +84,7 @@ class ApiUserrights extends ApiBase {
}
public function getAllowedParams() {
- return array (
+ return array(
'user' => array(
ApiBase::PARAM_TYPE => 'string',
ApiBase::PARAM_REQUIRED => true
diff --git a/includes/api/ApiWatch.php b/includes/api/ApiWatch.php
index 3e51299f..c7d636a1 100644
--- a/includes/api/ApiWatch.php
+++ b/includes/api/ApiWatch.php
@@ -36,6 +36,9 @@ class ApiWatch extends ApiBase {
if ( !$user->isLoggedIn() ) {
$this->dieUsage( 'You must be logged-in to have a watchlist', 'notloggedin' );
}
+ if ( !$user->isAllowed( 'editmywatchlist' ) ) {
+ $this->dieUsage( 'You don\'t have permission to edit your watchlist', 'permissiondenied' );
+ }
$params = $this->extractRequestParams();
$title = Title::newFromText( $params['title'] );
@@ -57,19 +60,19 @@ class ApiWatch extends ApiBase {
if ( $params['unwatch'] ) {
$res['unwatched'] = '';
$res['message'] = $this->msg( 'removedwatchtext', $title->getPrefixedText() )->title( $title )->parseAsBlock();
- $success = UnwatchAction::doUnwatch( $title, $user );
+ $status = UnwatchAction::doUnwatch( $title, $user );
} else {
$res['watched'] = '';
$res['message'] = $this->msg( 'addedwatchtext', $title->getPrefixedText() )->title( $title )->parseAsBlock();
- $success = WatchAction::doWatch( $title, $user );
+ $status = WatchAction::doWatch( $title, $user );
}
if ( !is_null( $oldLang ) ) {
$this->getContext()->setLanguage( $oldLang ); // Reset language to $oldLang
}
- if ( !$success ) {
- $this->dieUsageMsg( 'hookaborted' );
+ if ( !$status->isOK() ) {
+ $this->dieStatus( $status );
}
$this->getResult()->addValue( null, $this->getModuleName(), $res );
}
diff --git a/includes/cache/BacklinkCache.php b/includes/cache/BacklinkCache.php
index a59cc9a2..193f20fe 100644
--- a/includes/cache/BacklinkCache.php
+++ b/includes/cache/BacklinkCache.php
@@ -20,6 +20,7 @@
*
* @file
* @author Tim Starling
+ * @author Aaron Schulz
* @copyright © 2009, Tim Starling, Domas Mituzas
* @copyright © 2010, Max Sem
* @copyright © 2011, Antoine Musso
@@ -103,7 +104,7 @@ class BacklinkCache {
self::$cache = new ProcessCacheLRU( 1 );
}
$dbKey = $title->getPrefixedDBkey();
- if ( !self::$cache->has( $dbKey, 'obj' ) ) {
+ if ( !self::$cache->has( $dbKey, 'obj', 3600 ) ) {
self::$cache->set( $dbKey, 'obj', new self( $title ) );
}
return self::$cache->get( $dbKey, 'obj' );
@@ -147,71 +148,73 @@ class BacklinkCache {
if ( !isset( $this->db ) ) {
$this->db = wfGetDB( DB_SLAVE );
}
-
return $this->db;
}
/**
* Get the backlinks for a given table. Cached in process memory only.
* @param $table String
- * @param $startId Integer or false
- * @param $endId Integer or false
+ * @param $startId Integer|false
+ * @param $endId Integer|false
+ * @param $max Integer|INF
* @return TitleArrayFromResult
*/
- public function getLinks( $table, $startId = false, $endId = false ) {
+ public function getLinks( $table, $startId = false, $endId = false, $max = INF ) {
+ return TitleArray::newFromResult( $this->queryLinks( $table, $startId, $endId, $max ) );
+ }
+
+ /**
+ * Get the backlinks for a given table. Cached in process memory only.
+ * @param $table String
+ * @param $startId Integer|false
+ * @param $endId Integer|false
+ * @param $max Integer|INF
+ * @return ResultWrapper
+ */
+ protected function queryLinks( $table, $startId, $endId, $max ) {
wfProfileIn( __METHOD__ );
$fromField = $this->getPrefix( $table ) . '_from';
- if ( $startId || $endId ) {
- // Partial range, not cached
- wfDebug( __METHOD__ . ": from DB (uncacheable range)\n" );
+ if ( !$startId && !$endId && is_infinite( $max )
+ && isset( $this->fullResultCache[$table] ) )
+ {
+ wfDebug( __METHOD__ . ": got results from cache\n" );
+ $res = $this->fullResultCache[$table];
+ } else {
+ wfDebug( __METHOD__ . ": got results from DB\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 );
}
+ $options = array( 'STRAIGHT_JOIN', 'ORDER BY' => $fromField );
+ if ( is_finite( $max ) && $max > 0 ) {
+ $options['LIMIT'] = $max;
+ }
$res = $this->getDB()->select(
array( $table, 'page' ),
array( 'page_namespace', 'page_title', 'page_id' ),
$conds,
__METHOD__,
- array(
- 'STRAIGHT_JOIN',
- 'ORDER BY' => $fromField
- ) );
- $ta = TitleArray::newFromResult( $res );
-
- wfProfileOut( __METHOD__ );
- return $ta;
- }
+ $options
+ );
- // @todo FIXME: Make this a function?
- if ( !isset( $this->fullResultCache[$table] ) ) {
- wfDebug( __METHOD__ . ": from DB\n" );
- $res = $this->getDB()->select(
- array( $table, 'page' ),
- array( 'page_namespace', 'page_title', 'page_id' ),
- $this->getConditions( $table ),
- __METHOD__,
- array(
- 'STRAIGHT_JOIN',
- 'ORDER BY' => $fromField,
- ) );
- $this->fullResultCache[$table] = $res;
+ if ( !$startId && !$endId && $res->numRows() < $max ) {
+ // The full results fit within the limit, so cache them
+ $this->fullResultCache[$table] = $res;
+ } else {
+ wfDebug( __METHOD__ . ": results from DB were uncacheable\n" );
+ }
}
- $ta = TitleArray::newFromResult( $this->fullResultCache[$table] );
-
wfProfileOut( __METHOD__ );
- return $ta;
+ return $res;
}
/**
@@ -234,7 +237,7 @@ class BacklinkCache {
} else {
$prefix = null;
wfRunHooks( 'BacklinkCacheGetPrefix', array( $table, &$prefix ) );
- if( $prefix ) {
+ if ( $prefix ) {
return $prefix;
} else {
throw new MWException( "Invalid table \"$table\" in " . __CLASS__ );
@@ -289,7 +292,7 @@ class BacklinkCache {
default:
$conds = null;
wfRunHooks( 'BacklinkCacheGetConditions', array( $table, $this->title, &$conds ) );
- if( !$conds ) {
+ if ( !$conds ) {
throw new MWException( "Invalid table \"$table\" in " . __CLASS__ );
}
}
@@ -309,7 +312,7 @@ class BacklinkCache {
/**
* Get the approximate number of backlinks
* @param $table String
- * @param $max integer Only count up to this many backlinks
+ * @param $max integer|INF Only count up to this many backlinks
* @return integer
*/
public function getNumLinks( $table, $max = INF ) {
@@ -335,20 +338,12 @@ class BacklinkCache {
}
// 4) fetch from the database ...
- if ( is_infinite( $max ) ) { // full count
- $count = $this->getLinks( $table )->count();
+ $count = $this->getLinks( $table, false, false, $max )->count();
+ if ( $count < $max ) { // full count
$wgMemc->set( $memcKey, $count, self::CACHE_EXPIRY );
- } else { // with limit
- $count = $this->getDB()->select(
- array( $table, 'page' ),
- '1',
- $this->getConditions( $table ),
- __METHOD__,
- array( 'LIMIT' => $max )
- )->numRows();
}
- return $count;
+ return min( $max, $count );
}
/**
@@ -395,8 +390,28 @@ class BacklinkCache {
}
// 4) ... finally fetch from the slow database :(
- $this->getLinks( $table );
- $cacheEntry = $this->partitionResult( $this->fullResultCache[$table], $batchSize );
+ $cacheEntry = array( 'numRows' => 0, 'batches' => array() ); // final result
+ // Do the selects in batches to avoid client-side OOMs (bug 43452).
+ // Use a LIMIT that plays well with $batchSize to keep equal sized partitions.
+ $selectSize = max( $batchSize, 200000 - ( 200000 % $batchSize ) );
+ $start = false;
+ do {
+ $res = $this->queryLinks( $table, $start, false, $selectSize );
+ $partitions = $this->partitionResult( $res, $batchSize, false );
+ // Merge the link count and range partitions for this chunk
+ $cacheEntry['numRows'] += $partitions['numRows'];
+ $cacheEntry['batches'] = array_merge( $cacheEntry['batches'], $partitions['batches'] );
+ if ( count( $partitions['batches'] ) ) {
+ list( $lStart, $lEnd ) = end( $partitions['batches'] );
+ $start = $lEnd + 1; // pick up after this inclusive range
+ }
+ } while ( $partitions['numRows'] >= $selectSize );
+ // Make sure the first range has start=false and the last one has end=false
+ if ( count( $cacheEntry['batches'] ) ) {
+ $cacheEntry['batches'][0][0] = false;
+ $cacheEntry['batches'][count( $cacheEntry['batches'] ) - 1][1] = false;
+ }
+
// Save partitions to memcached
$wgMemc->set( $memcKey, $cacheEntry, self::CACHE_EXPIRY );
@@ -412,31 +427,32 @@ class BacklinkCache {
* Partition a DB result with backlinks in it into batches
* @param $res ResultWrapper database result
* @param $batchSize integer
+ * @param $isComplete bool Whether $res includes all the backlinks
* @throws MWException
- * @return array @see
+ * @return array
*/
- protected function partitionResult( $res, $batchSize ) {
+ protected function partitionResult( $res, $batchSize, $isComplete = true ) {
$batches = array();
$numRows = $res->numRows();
$numBatches = ceil( $numRows / $batchSize );
for ( $i = 0; $i < $numBatches; $i++ ) {
- if ( $i == 0 ) {
+ if ( $i == 0 && $isComplete ) {
$start = false;
} else {
- $rowNum = intval( $numRows * $i / $numBatches );
+ $rowNum = $i * $batchSize;
$res->seek( $rowNum );
$row = $res->fetchObject();
- $start = $row->page_id;
+ $start = (int)$row->page_id;
}
- if ( $i == $numBatches - 1 ) {
+ if ( $i == ( $numBatches - 1 ) && $isComplete ) {
$end = false;
} else {
- $rowNum = intval( $numRows * ( $i + 1 ) / $numBatches );
+ $rowNum = min( $numRows - 1, ( $i + 1 ) * $batchSize - 1 );
$res->seek( $rowNum );
$row = $res->fetchObject();
- $end = $row->page_id - 1;
+ $end = (int)$row->page_id;
}
# Sanity check order
diff --git a/includes/cache/CacheDependency.php b/includes/cache/CacheDependency.php
index 0f047e80..32bcdf7f 100644
--- a/includes/cache/CacheDependency.php
+++ b/includes/cache/CacheDependency.php
@@ -404,7 +404,7 @@ class GlobalDependency extends CacheDependency {
* @return bool
*/
function isExpired() {
- if( !isset( $GLOBALS[$this->name] ) ) {
+ if ( !isset( $GLOBALS[$this->name] ) ) {
return true;
}
return $GLOBALS[$this->name] != $this->value;
diff --git a/includes/cache/FileCacheBase.php b/includes/cache/FileCacheBase.php
index 30a72174..d4bf5ee6 100644
--- a/includes/cache/FileCacheBase.php
+++ b/includes/cache/FileCacheBase.php
@@ -35,7 +35,7 @@ abstract class FileCacheBase {
/* lazy loaded */
protected $mCached;
- /* @TODO: configurable? */
+ /* @todo configurable? */
const MISS_FACTOR = 15; // log 1 every MISS_FACTOR cache misses
const MISS_TTL_SEC = 3600; // how many seconds ago is "recent"
@@ -138,7 +138,7 @@ abstract class FileCacheBase {
* @return string
*/
public function fetchText() {
- if( $this->useGzip() ) {
+ if ( $this->useGzip() ) {
$fh = gzopen( $this->cachePath(), 'rb' );
return stream_get_contents( $fh );
} else {
@@ -163,7 +163,7 @@ abstract class FileCacheBase {
$this->checkCacheDirs(); // build parent dir
if ( !file_put_contents( $this->cachePath(), $text, LOCK_EX ) ) {
- wfDebug( __METHOD__ . "() failed saving ". $this->cachePath() . "\n" );
+ wfDebug( __METHOD__ . "() failed saving " . $this->cachePath() . "\n" );
$this->mCached = null;
return false;
}
diff --git a/includes/cache/GenderCache.php b/includes/cache/GenderCache.php
index 63e4226d..a933527a 100644
--- a/includes/cache/GenderCache.php
+++ b/includes/cache/GenderCache.php
@@ -66,15 +66,14 @@ class GenderCache {
public function getGenderOf( $username, $caller = '' ) {
global $wgUser;
- if( $username instanceof User ) {
+ if ( $username instanceof User ) {
$username = $username->getName();
}
$username = self::normalizeUsername( $username );
if ( !isset( $this->cache[$username] ) ) {
-
if ( $this->misses >= $this->missLimit && $wgUser->getName() !== $username ) {
- if( $this->misses === $this->missLimit ) {
+ if ( $this->misses === $this->missLimit ) {
$this->misses++;
wfDebug( __METHOD__ . ": too many misses, returning default onwards\n" );
}
@@ -84,7 +83,6 @@ class GenderCache {
$this->misses++;
$this->doQuery( $username, $caller );
}
-
}
/* Undefined if there is a valid username which for some reason doesn't
@@ -102,7 +100,9 @@ class GenderCache {
public function doLinkBatch( $data, $caller = '' ) {
$users = array();
foreach ( $data as $ns => $pagenames ) {
- if ( !MWNamespace::hasGenderDistinction( $ns ) ) continue;
+ if ( !MWNamespace::hasGenderDistinction( $ns ) ) {
+ continue;
+ }
foreach ( array_keys( $pagenames ) as $username ) {
$users[$username] = true;
}
@@ -143,14 +143,14 @@ class GenderCache {
$default = $this->getDefault();
$usersToCheck = array();
- foreach ( (array) $users as $value ) {
+ foreach ( (array)$users as $value ) {
$name = self::normalizeUsername( $value );
// Skip users whose gender setting we already know
if ( !isset( $this->cache[$name] ) ) {
// For existing users, this value will be overwritten by the correct value
$this->cache[$name] = $default;
// query only for valid names, which can be in the database
- if( User::isValidUserName( $name ) ) {
+ if ( User::isValidUserName( $name ) ) {
$usersToCheck[] = $name;
}
}
diff --git a/includes/cache/HTMLCacheUpdate.php b/includes/cache/HTMLCacheUpdate.php
index 88e79281..992809ef 100644
--- a/includes/cache/HTMLCacheUpdate.php
+++ b/includes/cache/HTMLCacheUpdate.php
@@ -46,8 +46,6 @@ class HTMLCacheUpdate implements DeferrableUpdate {
}
public function doUpdate() {
- global $wgMaxBacklinksInvalidate;
-
wfProfileIn( __METHOD__ );
$job = new HTMLCacheUpdateJob(
@@ -60,13 +58,14 @@ class HTMLCacheUpdate implements DeferrableUpdate {
);
$count = $this->mTitle->getBacklinkCache()->getNumLinks( $this->mTable, 200 );
- if ( $wgMaxBacklinksInvalidate !== false && $count > $wgMaxBacklinksInvalidate ) {
- wfDebug( "Skipped HTML cache invalidation of {$this->mTitle->getPrefixedText()}." );
- } elseif ( $count >= 200 ) { // many backlinks
+ if ( $count >= 200 ) { // many backlinks
JobQueueGroup::singleton()->push( $job );
JobQueueGroup::singleton()->deduplicateRootJob( $job );
} else { // few backlinks ($count might be off even if 0)
- $job->run(); // just do the purge query now
+ $dbw = wfGetDB( DB_MASTER );
+ $dbw->onTransactionIdle( function() use ( $job ) {
+ $job->run(); // just do the purge query now
+ } );
}
wfProfileOut( __METHOD__ );
diff --git a/includes/cache/HTMLFileCache.php b/includes/cache/HTMLFileCache.php
index 055fd685..ab379116 100644
--- a/includes/cache/HTMLFileCache.php
+++ b/includes/cache/HTMLFileCache.php
@@ -163,7 +163,7 @@ class HTMLFileCache extends FileCacheBase {
return $text;
}
- wfDebug( __METHOD__ . "()\n", false);
+ wfDebug( __METHOD__ . "()\n", false );
$now = wfTimestampNow();
if ( $this->useGzip() ) {
@@ -182,7 +182,7 @@ class HTMLFileCache extends FileCacheBase {
// gzip output to buffer as needed and set headers...
if ( $this->useGzip() ) {
- // @TODO: ugly wfClientAcceptsGzip() function - use context!
+ // @todo Ugly wfClientAcceptsGzip() function - use context!
if ( wfClientAcceptsGzip() ) {
header( 'Content-Encoding: gzip' );
return $compressed;
diff --git a/includes/cache/LinkBatch.php b/includes/cache/LinkBatch.php
index 72a2e8e5..48b60aa9 100644
--- a/includes/cache/LinkBatch.php
+++ b/includes/cache/LinkBatch.php
@@ -39,7 +39,7 @@ class LinkBatch {
protected $caller;
function __construct( $arr = array() ) {
- foreach( $arr as $item ) {
+ foreach ( $arr as $item ) {
$this->addObj( $item );
}
}
@@ -98,7 +98,7 @@ class LinkBatch {
* @return bool
*/
public function isEmpty() {
- return ($this->getSize() == 0);
+ return $this->getSize() == 0;
}
/**
diff --git a/includes/cache/LinkCache.php b/includes/cache/LinkCache.php
index 0e41e265..54de1989 100644
--- a/includes/cache/LinkCache.php
+++ b/includes/cache/LinkCache.php
@@ -35,18 +35,44 @@ class LinkCache {
private $mGoodLinkFields = array();
private $mBadLinks = array();
private $mForUpdate = false;
+ private $useDatabase = true;
/**
- * Get an instance of this class
+ * @var LinkCache
+ */
+ protected static $instance;
+
+ /**
+ * Get an instance of this class.
*
* @return LinkCache
*/
static function &singleton() {
- static $instance;
- if ( !isset( $instance ) ) {
- $instance = new LinkCache;
+ if ( self::$instance ) {
+ return self::$instance;
}
- return $instance;
+ self::$instance = new LinkCache;
+ return self::$instance;
+ }
+
+ /**
+ * Destroy the singleton instance, a new one will be created next time
+ * singleton() is called.
+ * @since 1.22
+ */
+ static function destroySingleton() {
+ self::$instance = null;
+ }
+
+ /**
+ * Set the singleton instance to a given object.
+ * Since we do not have an interface for LinkCache, you have to be sure the
+ * given object implements all the LinkCache public methods.
+ * @param LinkCache $instance
+ * @since 1.22
+ */
+ static function setSingleton( LinkCache $instance ) {
+ self::$instance = $instance;
}
/**
@@ -156,8 +182,13 @@ class LinkCache {
unset( $this->mGoodLinkFields[$dbkey] );
}
- public function getGoodLinks() { return $this->mGoodLinks; }
- public function getBadLinks() { return array_keys( $this->mBadLinks ); }
+ public function getGoodLinks() {
+ return $this->mGoodLinks;
+ }
+
+ public function getBadLinks() {
+ return array_keys( $this->mBadLinks );
+ }
/**
* Add a title to the link cache, return the page_id or zero if non-existent
@@ -167,7 +198,7 @@ class LinkCache {
*/
public function addLink( $title ) {
$nt = Title::newFromDBkey( $title );
- if( $nt ) {
+ if ( $nt ) {
return $this->addLinkObj( $nt );
} else {
return 0;
@@ -175,6 +206,19 @@ class LinkCache {
}
/**
+ * Enable or disable database use.
+ * @since 1.22
+ * @param $value Boolean
+ * @return Boolean
+ */
+ public function useDatabase( $value = null ) {
+ if ( $value !== null ) {
+ $this->useDatabase = (bool)$value;
+ }
+ return $this->useDatabase;
+ }
+
+ /**
* Add a title to the link cache, return the page_id or zero if non-existent
*
* @param $nt Title object to add
@@ -201,6 +245,10 @@ class LinkCache {
return 0;
}
+ if( !$this->useDatabase ) {
+ return 0;
+ }
+
# Some fields heavily used for linking...
if ( $this->mForUpdate ) {
$db = wfGetDB( DB_MASTER );
@@ -215,7 +263,9 @@ class LinkCache {
}
$f = array( 'page_id', 'page_len', 'page_is_redirect', 'page_latest' );
- if ( $wgContentHandlerUseDB ) $f[] = 'page_content_model';
+ if ( $wgContentHandlerUseDB ) {
+ $f[] = 'page_content_model';
+ }
$s = $db->selectRow( 'page', $f,
array( 'page_namespace' => $nt->getNamespace(), 'page_title' => $nt->getDBkey() ),
diff --git a/includes/cache/LocalisationCache.php b/includes/cache/LocalisationCache.php
index 009b9507..1bfd17bd 100644
--- a/includes/cache/LocalisationCache.php
+++ b/includes/cache/LocalisationCache.php
@@ -110,7 +110,7 @@ class LocalisationCache {
'dateFormats', 'datePreferences', 'datePreferenceMigrationMap',
'defaultDateFormat', 'extraUserToggles', 'specialPageAliases',
'imageFiles', 'preloadedMessages', 'namespaceGenderAliases',
- 'digitGroupingPattern', 'pluralRules', 'compiledPluralRules',
+ 'digitGroupingPattern', 'pluralRules', 'pluralRuleTypes', 'compiledPluralRules',
);
/**
@@ -160,6 +160,20 @@ class LocalisationCache {
*/
var $pluralRules = null;
+ /**
+ * Associative array of cached plural rule types. The key is the language
+ * code, the value is an array of plural rule types for that language. For
+ * example, $pluralRuleTypes['ar'] = ['zero', 'one', 'two', 'few', 'many'].
+ * The index for each rule type matches the index for the rule in
+ * $pluralRules, thus allowing correlation between the two. The reason we
+ * don't just use the type names as the keys in $pluralRules is because
+ * Language::convertPlural applies the rules based on numeric order (or
+ * explicit numeric parameter), not based on the name of the rule type. For
+ * example, {{plural:count|wordform1|wordform2|wordform3}}, rather than
+ * {{plural:count|one=wordform1|two=wordform2|many=wordform3}}.
+ */
+ var $pluralRuleTypes = null;
+
var $mergeableKeys = null;
/**
@@ -340,7 +354,6 @@ class LocalisationCache {
* @param $code
* @param $key
* @param $subkey
- * @return
*/
protected function loadSubitem( $code, $key, $subkey ) {
if ( !in_array( $key, self::$splitKeys ) ) {
@@ -370,6 +383,9 @@ class LocalisationCache {
/**
* Returns true if the cache identified by $code is missing or expired.
+ *
+ * @param string $code
+ *
* @return bool
*/
public function isExpired( $code ) {
@@ -480,9 +496,10 @@ class LocalisationCache {
* @return array
*/
protected function readPHPFile( $_fileName, $_fileType ) {
+ wfProfileIn( __METHOD__ );
// Disable APC caching
$_apcEnabled = ini_set( 'apc.cache_by_default', '0' );
- include( $_fileName );
+ include $_fileName;
ini_set( 'apc.cache_by_default', $_apcEnabled );
if ( $_fileType == 'core' || $_fileType == 'extension' ) {
@@ -490,8 +507,10 @@ class LocalisationCache {
} elseif ( $_fileType == 'aliases' ) {
$data = compact( 'aliases' );
} else {
+ wfProfileOut( __METHOD__ );
throw new MWException( __METHOD__ . ": Invalid file type: $_fileType" );
}
+ wfProfileOut( __METHOD__ );
return $data;
}
@@ -506,7 +525,7 @@ class LocalisationCache {
}
try {
$compiledRules = CLDRPluralRuleEvaluator::compile( $rules );
- } catch( CLDRPluralRuleError $e ) {
+ } catch ( CLDRPluralRuleError $e ) {
wfDebugLog( 'l10n', $e->getMessage() . "\n" );
return array();
}
@@ -519,17 +538,8 @@ class LocalisationCache {
* @since 1.20
*/
public function getPluralRules( $code ) {
- global $IP;
-
if ( $this->pluralRules === null ) {
- $cldrPlural = "$IP/languages/data/plurals.xml";
- $mwPlural = "$IP/languages/data/plurals-mediawiki.xml";
- // Load CLDR plural rules
- $this->loadPluralFile( $cldrPlural );
- if ( file_exists( $mwPlural ) ) {
- // Override or extend
- $this->loadPluralFile( $mwPlural );
- }
+ $this->loadPluralFiles();
}
if ( !isset( $this->pluralRules[$code] ) ) {
return null;
@@ -539,6 +549,37 @@ class LocalisationCache {
}
/**
+ * Get the plural rule types for a given language from the XML files.
+ * Cached.
+ * @since 1.22
+ */
+ public function getPluralRuleTypes( $code ) {
+ if ( $this->pluralRuleTypes === null ) {
+ $this->loadPluralFiles();
+ }
+ if ( !isset( $this->pluralRuleTypes[$code] ) ) {
+ return null;
+ } else {
+ return $this->pluralRuleTypes[$code];
+ }
+ }
+
+ /**
+ * Load the plural XML files.
+ */
+ protected function loadPluralFiles() {
+ global $IP;
+ $cldrPlural = "$IP/languages/data/plurals.xml";
+ $mwPlural = "$IP/languages/data/plurals-mediawiki.xml";
+ // Load CLDR plural rules
+ $this->loadPluralFile( $cldrPlural );
+ if ( file_exists( $mwPlural ) ) {
+ // Override or extend
+ $this->loadPluralFile( $mwPlural );
+ }
+ }
+
+ /**
* Load a plural XML file with the given filename, compile the relevant
* rules, and save the compiled rules in a process-local cache.
*/
@@ -549,12 +590,16 @@ class LocalisationCache {
foreach ( $rulesets as $ruleset ) {
$codes = $ruleset->getAttribute( 'locales' );
$rules = array();
+ $ruleTypes = array();
$ruleElements = $ruleset->getElementsByTagName( "pluralRule" );
foreach ( $ruleElements as $elt ) {
+ $ruleType = $elt->getAttribute( 'count' );
$rules[] = $elt->nodeValue;
+ $ruleTypes[] = $ruleType;
}
foreach ( explode( ' ', $codes ) as $code ) {
$this->pluralRules[$code] = $rules;
+ $this->pluralRuleTypes[$code] = $ruleTypes;
}
}
}
@@ -566,9 +611,11 @@ class LocalisationCache {
*/
protected function readSourceFilesAndRegisterDeps( $code, &$deps ) {
global $IP;
+ wfProfileIn( __METHOD__ );
$fileName = Language::getMessagesFileName( $code );
if ( !file_exists( $fileName ) ) {
+ wfProfileOut( __METHOD__ );
return false;
}
@@ -579,10 +626,13 @@ class LocalisationCache {
$data['pluralRules'] = $this->getPluralRules( $code );
# And for PHP
$data['compiledPluralRules'] = $this->getCompiledPluralRules( $code );
+ # Load plural rule types
+ $data['pluralRuleTypes'] = $this->getPluralRuleTypes( $code );
$deps['plurals'] = new FileDependency( "$IP/languages/data/plurals.xml" );
$deps['plurals-mw'] = new FileDependency( "$IP/languages/data/plurals-mediawiki.xml" );
+ wfProfileOut( __METHOD__ );
return $data;
}
@@ -673,6 +723,7 @@ class LocalisationCache {
wfProfileIn( __METHOD__ );
if ( !$code ) {
+ wfProfileOut( __METHOD__ );
throw new MWException( "Invalid language code requested" );
}
$this->recachedLangs[$code] = true;
@@ -741,6 +792,7 @@ class LocalisationCache {
# This is done after the core because we know the fallback sequence now.
# But it has a higher precedence for merging so that we can support things
# like site-specific message overrides.
+ wfProfileIn( __METHOD__ . '-extensions' );
$allData = $initialData;
foreach ( $wgExtensionMessagesFiles as $fileName ) {
$data = $this->readPHPFile( $fileName, 'extension' );
@@ -761,6 +813,7 @@ class LocalisationCache {
foreach ( $coreData as $key => $item ) {
$this->mergeItem( $key, $allData[$key], $item );
}
+ wfProfileOut( __METHOD__ . '-extensions' );
# Add cache dependencies for any referenced globals
$deps['wgExtensionMessagesFiles'] = new GlobalDependency( 'wgExtensionMessagesFiles' );
@@ -786,6 +839,10 @@ class LocalisationCache {
if ( $allData['compiledPluralRules'] === null ) {
$allData['compiledPluralRules'] = array();
}
+ # If there were no plural rule types, return an empty array
+ if ( $allData['pluralRuleTypes'] === null ) {
+ $allData['pluralRuleTypes'] = array();
+ }
# Set the list keys
$allData['list'] = array();
@@ -796,6 +853,7 @@ class LocalisationCache {
wfRunHooks( 'LocalisationCacheRecache', array( $this, $code, &$allData ) );
if ( is_null( $allData['namespaceNames'] ) ) {
+ wfProfileOut( __METHOD__ );
throw new MWException( __METHOD__ . ': Localisation data failed sanity check! ' .
'Check that your languages/messages/MessagesEn.php file is intact.' );
}
@@ -810,6 +868,7 @@ class LocalisationCache {
}
# Save to the persistent cache
+ wfProfileIn( __METHOD__ . '-write' );
$this->store->startWrite( $code );
foreach ( $allData as $key => $value ) {
if ( in_array( $key, self::$splitKeys ) ) {
@@ -821,6 +880,7 @@ class LocalisationCache {
}
}
$this->store->finishWrite();
+ wfProfileOut( __METHOD__ . '-write' );
# Clear out the MessageBlobStore
# HACK: If using a null (i.e. disabled) storage backend, we
@@ -868,6 +928,7 @@ class LocalisationCache {
unset( $this->loadedItems[$code] );
unset( $this->loadedSubitems[$code] );
unset( $this->initialisedLangs[$code] );
+ unset( $this->shallowFallbacks[$code] );
foreach ( $this->shallowFallbacks as $shallowCode => $fbCode ) {
if ( $fbCode === $code ) {
@@ -921,7 +982,7 @@ interface LCStore {
/**
* Start a write transaction.
- * @param $code Language code
+ * @param string $code Language code
*/
function startWrite( $code );
@@ -933,8 +994,8 @@ interface LCStore {
/**
* Set a key to a given value. startWrite() must be called before this
* is called, and finishWrite() must be called afterwards.
- * @param $key
- * @param $value
+ * @param string $key
+ * @param mixed $value
*/
function set( $key, $value );
}
@@ -1284,5 +1345,4 @@ class LocalisationCache_BulkLoad extends LocalisationCache {
$this->unload( $code );
}
}
-
}
diff --git a/includes/cache/MessageCache.php b/includes/cache/MessageCache.php
index c406b5c3..a92c87f4 100644
--- a/includes/cache/MessageCache.php
+++ b/includes/cache/MessageCache.php
@@ -22,14 +22,29 @@
*/
/**
- *
+ * MediaWiki message cache structure version.
+ * Bump this whenever the message cache format has changed.
*/
-define( 'MSG_LOAD_TIMEOUT', 60 );
-define( 'MSG_LOCK_TIMEOUT', 10 );
-define( 'MSG_WAIT_TIMEOUT', 10 );
define( 'MSG_CACHE_VERSION', 1 );
/**
+ * Memcached timeout when loading a key.
+ * See MessageCache::load()
+ */
+define( 'MSG_LOAD_TIMEOUT', 60 );
+
+/**
+ * Memcached timeout when locking a key for a writing operation.
+ * See MessageCache::lock()
+ */
+define( 'MSG_LOCK_TIMEOUT', 30 );
+/**
+ * Number of times we will try to acquire a lock from Memcached.
+ * This comes in addition to MSG_LOCK_TIMEOUT.
+ */
+define( 'MSG_WAIT_TIMEOUT', 30 );
+
+/**
* Message cache
* Performs various MediaWiki namespace-related functions
* @ingroup Cache
@@ -44,10 +59,16 @@ class MessageCache {
*/
protected $mCache;
- // Should mean that database cannot be used, but check
+ /**
+ * Should mean that database cannot be used, but check
+ * @var bool $mDisable
+ */
protected $mDisable;
- /// Lifetime for cache, used by object caching
+ /**
+ * Lifetime for cache, used by object caching.
+ * Set on construction, see __construct().
+ */
protected $mExpiry;
/**
@@ -56,18 +77,21 @@ class MessageCache {
*/
protected $mParserOptions, $mParser;
- /// Variable for tracking which variables are already loaded
+ /**
+ * Variable for tracking which variables are already loaded
+ * @var array $mLoadedLanguages
+ */
protected $mLoadedLanguages = array();
/**
* Singleton instance
*
- * @var MessageCache
+ * @var MessageCache $instance
*/
private static $instance;
/**
- * @var bool
+ * @var bool $mInParser
*/
protected $mInParser = false;
@@ -75,12 +99,16 @@ class MessageCache {
* Get the signleton instance of this class
*
* @since 1.18
- * @return MessageCache object
+ * @return MessageCache
*/
public static function singleton() {
if ( is_null( self::$instance ) ) {
global $wgUseDatabaseMessages, $wgMsgCacheExpiry;
- self::$instance = new self( wfGetMessageCacheStorage(), $wgUseDatabaseMessages, $wgMsgCacheExpiry );
+ self::$instance = new self(
+ wfGetMessageCacheStorage(),
+ $wgUseDatabaseMessages,
+ $wgMsgCacheExpiry
+ );
}
return self::$instance;
}
@@ -94,6 +122,11 @@ class MessageCache {
self::$instance = null;
}
+ /**
+ * @param ObjectCache $memCached A cache instance. If none, fall back to CACHE_NONE.
+ * @param bool $useDB
+ * @param int $expiry Lifetime for cache. @see $mExpiry.
+ */
function __construct( $memCached, $useDB, $expiry ) {
if ( !$memCached ) {
$memCached = wfGetCache( CACHE_NONE );
@@ -119,15 +152,13 @@ class MessageCache {
/**
* Try to load the cache from a local file.
- * Actual format of the file depends on the $wgLocalMessageCacheSerialized
- * setting.
*
* @param string $hash the hash of contents, to check validity.
- * @param $code Mixed: Optional language code, see documenation of load().
- * @return bool on failure.
+ * @param Mixed $code Optional language code, see documenation of load().
+ * @return array The cache array
*/
- function loadFromLocal( $hash, $code ) {
- global $wgCacheDirectory, $wgLocalMessageCacheSerialized;
+ function getLocalCache( $hash, $code ) {
+ global $wgCacheDirectory;
$filename = "$wgCacheDirectory/messages-" . wfWikiID() . "-$code";
@@ -139,31 +170,19 @@ class MessageCache {
return false; // No cache file
}
- if ( $wgLocalMessageCacheSerialized ) {
- // Check to see if the file has the hash specified
- $localHash = fread( $file, 32 );
- if ( $hash === $localHash ) {
- // All good, get the rest of it
- $serialized = '';
- while ( !feof( $file ) ) {
- $serialized .= fread( $file, 100000 );
- }
- fclose( $file );
- return $this->setCache( unserialize( $serialized ), $code );
- } else {
- fclose( $file );
- return false; // Wrong hash
+ // Check to see if the file has the hash specified
+ $localHash = fread( $file, 32 );
+ if ( $hash === $localHash ) {
+ // All good, get the rest of it
+ $serialized = '';
+ while ( !feof( $file ) ) {
+ $serialized .= fread( $file, 100000 );
}
+ fclose( $file );
+ return unserialize( $serialized );
} else {
- $localHash = substr( fread( $file, 40 ), 8 );
fclose( $file );
- if ( $hash != $localHash ) {
- return false; // Wrong hash
- }
-
- # Require overwrites the member variable or just shadows it?
- require( $filename );
- return $this->setCache( $this->mCache, $code );
+ return false; // Wrong hash
}
}
@@ -192,55 +211,6 @@ class MessageCache {
wfRestoreWarnings();
}
- function saveToScript( $array, $hash, $code ) {
- global $wgCacheDirectory;
-
- $filename = "$wgCacheDirectory/messages-" . wfWikiID() . "-$code";
- $tempFilename = $filename . '.tmp';
- wfMkdirParents( $wgCacheDirectory, null, __METHOD__ ); // might fail
-
- wfSuppressWarnings();
- $file = fopen( $tempFilename, 'w' );
- wfRestoreWarnings();
-
- if ( !$file ) {
- wfDebug( "Unable to open local cache file for writing\n" );
- return;
- }
-
- fwrite( $file, "<?php\n//$hash\n\n \$this->mCache = array(" );
-
- foreach ( $array as $key => $message ) {
- $key = $this->escapeForScript( $key );
- $message = $this->escapeForScript( $message );
- fwrite( $file, "'$key' => '$message',\n" );
- }
-
- fwrite( $file, ");\n?>" );
- fclose( $file);
- rename( $tempFilename, $filename );
- }
-
- function escapeForScript( $string ) {
- $string = str_replace( '\\', '\\\\', $string );
- $string = str_replace( '\'', '\\\'', $string );
- return $string;
- }
-
- /**
- * Set the cache to $cache, if it is valid. Otherwise set the cache to false.
- *
- * @return bool
- */
- function setCache( $cache, $code ) {
- if ( isset( $cache['VERSION'] ) && $cache['VERSION'] == MSG_CACHE_VERSION ) {
- $this->mCache[$code] = $cache;
- return true;
- } else {
- return false;
- }
- }
-
/**
* Loads messages from caches or from database in this order:
* (1) local message cache (if $wgUseLocalMessageCache is enabled)
@@ -257,16 +227,14 @@ class MessageCache {
* or false if populating empty cache fails. Also returns true if MessageCache
* is disabled.
*
- * @param bool|String $code String: language to which load messages
+ * @param bool|String $code Language to which load messages
* @throws MWException
* @return bool
*/
function load( $code = false ) {
global $wgUseLocalMessageCache;
- $exception = null; // deferred error
-
- if( !is_string( $code ) ) {
+ if ( !is_string( $code ) ) {
# This isn't really nice, so at least make a note about it and try to
# fall back
wfDebug( __METHOD__ . " called without providing a language code\n" );
@@ -291,94 +259,161 @@ class MessageCache {
# Loading code starts
wfProfileIn( __METHOD__ );
$success = false; # Keep track of success
+ $staleCache = false; # a cache array with expired data, or false if none has been loaded
$where = array(); # Debug info, delayed to avoid spamming debug log too much
$cacheKey = wfMemcKey( 'messages', $code ); # Key in memc for messages
- # (1) local cache
+ # Local cache
# Hash of the contents is stored in memcache, to detect if local cache goes
- # out of date (due to update in other thread?)
+ # out of date (e.g. due to replace() on some other server)
if ( $wgUseLocalMessageCache ) {
wfProfileIn( __METHOD__ . '-fromlocal' );
$hash = $this->mMemc->get( wfMemcKey( 'messages', $code, 'hash' ) );
if ( $hash ) {
- $success = $this->loadFromLocal( $hash, $code );
- if ( $success ) $where[] = 'got from local cache';
+ $cache = $this->getLocalCache( $hash, $code );
+ if ( !$cache ) {
+ $where[] = 'local cache is empty or has the wrong hash';
+ } elseif ( $this->isCacheExpired( $cache ) ) {
+ $where[] = 'local cache is expired';
+ $staleCache = $cache;
+ } else {
+ $where[] = 'got from local cache';
+ $success = true;
+ $this->mCache[$code] = $cache;
+ }
}
wfProfileOut( __METHOD__ . '-fromlocal' );
}
- # (2) memcache
- # Fails if nothing in cache, or in the wrong version.
if ( !$success ) {
- wfProfileIn( __METHOD__ . '-fromcache' );
- $cache = $this->mMemc->get( $cacheKey );
- $success = $this->setCache( $cache, $code );
- if ( $success ) {
- $where[] = 'got from global cache';
- $this->saveToCaches( $cache, false, $code );
- }
- wfProfileOut( __METHOD__ . '-fromcache' );
- }
+ # Try the global cache. If it is empty, try to acquire a lock. If
+ # the lock can't be acquired, wait for the other thread to finish
+ # and then try the global cache a second time.
+ for ( $failedAttempts = 0; $failedAttempts < 2; $failedAttempts++ ) {
+ wfProfileIn( __METHOD__ . '-fromcache' );
+ $cache = $this->mMemc->get( $cacheKey );
+ if ( !$cache ) {
+ $where[] = 'global cache is empty';
+ } elseif ( $this->isCacheExpired( $cache ) ) {
+ $where[] = 'global cache is expired';
+ $staleCache = $cache;
+ } else {
+ $where[] = 'got from global cache';
+ $this->mCache[$code] = $cache;
+ $this->saveToCaches( $cache, 'local-only', $code );
+ $success = true;
+ }
- # (3)
- # Nothing in caches... so we need create one and store it in caches
- if ( !$success ) {
- $where[] = 'cache is empty';
- $where[] = 'loading from database';
-
- if ( $this->lock( $cacheKey ) ) {
- $that = $this;
- $osc = new ScopedCallback( function() use ( $that, $cacheKey ) {
- $that->unlock( $cacheKey );
- } );
- }
- # Limit the concurrency of loadFromDB to a single process
- # This prevents the site from going down when the cache expires
- $statusKey = wfMemcKey( 'messages', $code, 'status' );
- $success = $this->mMemc->add( $statusKey, 'loading', MSG_LOAD_TIMEOUT );
- if ( $success ) { // acquired lock
- $cache = $this->mMemc;
- $isc = new ScopedCallback( function() use ( $cache, $statusKey ) {
- $cache->delete( $statusKey );
- } );
- $cache = $this->loadFromDB( $code );
- $success = $this->setCache( $cache, $code );
- if ( $success ) { // messages loaded
- $success = $this->saveToCaches( $cache, true, $code );
- $isc = null; // unlock
- if ( !$success ) {
- $this->mMemc->set( $statusKey, 'error', 60 * 5 );
- wfDebug( __METHOD__ . ": set() error: restart memcached server!\n" );
- $exception = new MWException( "Could not save cache for '$code'." );
+ wfProfileOut( __METHOD__ . '-fromcache' );
+
+ if ( $success ) {
+ # Done, no need to retry
+ break;
+ }
+
+ # We need to call loadFromDB. Limit the concurrency to a single
+ # process. This prevents the site from going down when the cache
+ # expires.
+ $statusKey = wfMemcKey( 'messages', $code, 'status' );
+ $acquired = $this->mMemc->add( $statusKey, 'loading', MSG_LOAD_TIMEOUT );
+ if ( $acquired ) {
+ # Unlock the status key if there is an exception
+ $that = $this;
+ $statusUnlocker = new ScopedCallback( function () use ( $that, $statusKey ) {
+ $that->mMemc->delete( $statusKey );
+ } );
+
+ # Now let's regenerate
+ $where[] = 'loading from database';
+
+ # Lock the cache to prevent conflicting writes
+ # If this lock fails, it doesn't really matter, it just means the
+ # write is potentially non-atomic, e.g. the results of a replace()
+ # may be discarded.
+ if ( $this->lock( $cacheKey ) ) {
+ $mainUnlocker = new ScopedCallback( function () use ( $that, $cacheKey ) {
+ $that->unlock( $cacheKey );
+ } );
+ } else {
+ $mainUnlocker = null;
+ $where[] = 'could not acquire main lock';
+ }
+
+ $cache = $this->loadFromDB( $code );
+ $this->mCache[$code] = $cache;
+ $success = true;
+ $saveSuccess = $this->saveToCaches( $cache, 'all', $code );
+
+ # Unlock
+ ScopedCallback::consume( $mainUnlocker );
+ ScopedCallback::consume( $statusUnlocker );
+
+ if ( !$saveSuccess ) {
+ # Cache save has failed.
+ # There are two main scenarios where this could be a problem:
+ #
+ # - The cache is more than the maximum size (typically
+ # 1MB compressed).
+ #
+ # - Memcached has no space remaining in the relevant slab
+ # class. This is unlikely with recent versions of
+ # memcached.
+ #
+ # Either way, if there is a local cache, nothing bad will
+ # happen. If there is no local cache, disabling the message
+ # cache for all requests avoids incurring a loadFromDB()
+ # overhead on every request, and thus saves the wiki from
+ # complete downtime under moderate traffic conditions.
+ if ( !$wgUseLocalMessageCache ) {
+ $this->mMemc->set( $statusKey, 'error', 60 * 5 );
+ $where[] = 'could not save cache, disabled globally for 5 minutes';
+ } else {
+ $where[] = "could not save global cache";
+ }
}
+
+ # Load from DB complete, no need to retry
+ break;
+ } elseif ( $staleCache ) {
+ # Use the stale cache while some other thread constructs the new one
+ $where[] = 'using stale cache';
+ $this->mCache[$code] = $staleCache;
+ $success = true;
+ break;
+ } elseif ( $failedAttempts > 0 ) {
+ # Already retried once, still failed, so don't do another lock/unlock cycle
+ # This case will typically be hit if memcached is down, or if
+ # loadFromDB() takes longer than MSG_WAIT_TIMEOUT
+ $where[] = "could not acquire status key.";
+ break;
} else {
- $isc = null; // unlock
- $exception = new MWException( "Could not load cache from DB for '$code'." );
+ $status = $this->mMemc->get( $statusKey );
+ if ( $status === 'error' ) {
+ # Disable cache
+ break;
+ } else {
+ # Wait for the other thread to finish, then retry
+ $where[] = 'waited for other thread to complete';
+ $this->lock( $cacheKey );
+ $this->unlock( $cacheKey );
+ }
}
- } else {
- $exception = new MWException( "Could not acquire '$statusKey' lock." );
}
- $osc = null; // unlock
}
if ( !$success ) {
+ $where[] = 'loading FAILED - cache is disabled';
$this->mDisable = true;
$this->mCache = false;
- // This used to go on, but that led to lots of nasty side
- // effects like gadgets and sidebar getting cached with their
- // default content
- if ( $exception instanceof Exception ) {
- throw $exception;
- } else {
- throw new MWException( "MessageCache failed to load messages" );
- }
+ # This used to throw an exception, but that led to nasty side effects like
+ # the whole wiki being instantly down if the memcached server died
} else {
# All good, just record the success
- $info = implode( ', ', $where );
- wfDebug( __METHOD__ . ": Loading $code... $info\n" );
$this->mLoadedLanguages[$code] = true;
}
+ $info = implode( ', ', $where );
+ wfDebug( __METHOD__ . ": Loading $code... $info\n" );
wfProfileOut( __METHOD__ );
return $success;
}
@@ -388,8 +423,8 @@ class MessageCache {
* $wgMaxMsgCacheEntrySize are assigned a special value, and are loaded
* on-demand from the database later.
*
- * @param string $code language code.
- * @return Array: loaded messages for storing in caches.
+ * @param string $code Language code.
+ * @return array Loaded messages for storing in caches.
*/
function loadFromDB( $code ) {
wfProfileIn( __METHOD__ );
@@ -449,11 +484,15 @@ class MessageCache {
foreach ( $res as $row ) {
$text = Revision::getRevisionText( $row );
- if( $text === false ) {
+ if ( $text === false ) {
// Failed to fetch data; possible ES errors?
// Store a marker to fetch on-demand as a workaround...
$entry = '!TOO BIG';
- wfDebugLog( 'MessageCache', __METHOD__ . ": failed to load message page text for {$row->page_title} ($code)" );
+ wfDebugLog(
+ 'MessageCache',
+ __METHOD__
+ . ": failed to load message page text for {$row->page_title} ($code)"
+ );
} else {
$entry = ' ' . $text;
}
@@ -461,6 +500,7 @@ class MessageCache {
}
$cache['VERSION'] = MSG_CACHE_VERSION;
+ $cache['EXPIRY'] = wfTimestamp( TS_MW, time() + $this->mExpiry );
wfProfileOut( __METHOD__ );
return $cache;
}
@@ -468,8 +508,8 @@ class MessageCache {
/**
* Updates cache as necessary when message page is changed
*
- * @param string $title name of the page changed.
- * @param $text Mixed: new contents of the page.
+ * @param string $title Name of the page changed.
+ * @param mixed $text New contents of the page.
*/
public function replace( $title, $text ) {
global $wgMaxMsgCacheEntrySize;
@@ -502,7 +542,7 @@ class MessageCache {
}
# Update caches
- $this->saveToCaches( $this->mCache[$code], true, $code );
+ $this->saveToCaches( $this->mCache[$code], 'all', $code );
$this->unlock( $cacheKey );
// Also delete cached sidebar... just in case it is affected
@@ -529,21 +569,41 @@ class MessageCache {
}
/**
+ * Is the given cache array expired due to time passing or a version change?
+ *
+ * @param $cache
+ * @return bool
+ */
+ protected function isCacheExpired( $cache ) {
+ if ( !isset( $cache['VERSION'] ) || !isset( $cache['EXPIRY'] ) ) {
+ return true;
+ }
+ if ( $cache['VERSION'] != MSG_CACHE_VERSION ) {
+ return true;
+ }
+ if ( wfTimestampNow() >= $cache['EXPIRY'] ) {
+ return true;
+ }
+ return false;
+ }
+
+ /**
* Shortcut to update caches.
*
- * @param array $cache cached messages with a version.
- * @param bool $memc Wether to update or not memcache.
- * @param string $code Language code.
- * @return bool on somekind of error.
+ * @param array $cache Cached messages with a version.
+ * @param string $dest Either "local-only" to save to local caches only
+ * or "all" to save to all caches.
+ * @param string|bool $code Language code (default: false)
+ * @return bool
*/
- protected function saveToCaches( $cache, $memc = true, $code = false ) {
+ protected function saveToCaches( $cache, $dest, $code = false ) {
wfProfileIn( __METHOD__ );
- global $wgUseLocalMessageCache, $wgLocalMessageCacheSerialized;
+ global $wgUseLocalMessageCache;
$cacheKey = wfMemcKey( 'messages', $code );
- if ( $memc ) {
- $success = $this->mMemc->set( $cacheKey, $cache, $this->mExpiry );
+ if ( $dest === 'all' ) {
+ $success = $this->mMemc->set( $cacheKey, $cache );
} else {
$success = true;
}
@@ -552,12 +612,8 @@ class MessageCache {
if ( $wgUseLocalMessageCache ) {
$serialized = serialize( $cache );
$hash = md5( $serialized );
- $this->mMemc->set( wfMemcKey( 'messages', $code, 'hash' ), $hash, $this->mExpiry );
- if ( $wgLocalMessageCacheSerialized ) {
- $this->saveToLocal( $serialized, $hash, $code );
- } else {
- $this->saveToScript( $cache, $hash, $code );
- }
+ $this->mMemc->set( wfMemcKey( 'messages', $code, 'hash' ), $hash );
+ $this->saveToLocal( $serialized, $hash, $code );
}
wfProfileOut( __METHOD__ );
@@ -565,19 +621,35 @@ class MessageCache {
}
/**
- * Represents a write lock on the messages key
+ * Represents a write lock on the messages key.
*
- * @param $key string
+ * Will retry MessageCache::MSG_WAIT_TIMEOUT times, each operations having
+ * a timeout of MessageCache::MSG_LOCK_TIMEOUT.
*
+ * @param string $key
* @return Boolean: success
*/
function lock( $key ) {
$lockKey = $key . ':lock';
- for ( $i = 0; $i < MSG_WAIT_TIMEOUT && !$this->mMemc->add( $lockKey, 1, MSG_LOCK_TIMEOUT ); $i++ ) {
+ $acquired = false;
+ $testDone = false;
+ for ( $i = 0; $i < MSG_WAIT_TIMEOUT && !$acquired; $i++ ) {
+ $acquired = $this->mMemc->add( $lockKey, 1, MSG_LOCK_TIMEOUT );
+ if ( $acquired ) {
+ break;
+ }
+
+ # Fail fast if memcached is totally down
+ if ( !$testDone ) {
+ $testDone = true;
+ if ( !$this->mMemc->set( wfMemcKey( 'test' ), 'test', 1 ) ) {
+ break;
+ }
+ }
sleep( 1 );
}
- return $i >= MSG_WAIT_TIMEOUT;
+ return $acquired;
}
function unlock( $key ) {
@@ -588,51 +660,62 @@ class MessageCache {
/**
* Get a message from either the content language or the user language.
*
- * @param string $key the message cache key
- * @param $useDB Boolean: get the message from the DB, false to use only
- * the localisation
- * @param bool|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 $isFullKey Boolean: specifies whether $key is a two part key
+ * First, assemble a list of languages to attempt getting the message from. This
+ * chain begins with the requested language and its fallbacks and then continues with
+ * the content language and its fallbacks. For each language in the chain, the following
+ * process will occur (in this order):
+ * 1. If a language-specific override, i.e., [[MW:msg/lang]], is available, use that.
+ * Note: for the content language, there is no /lang subpage.
+ * 2. Fetch from the static CDB cache.
+ * 3. If available, check the database for fallback language overrides.
+ *
+ * This process provides a number of guarantees. When changing this code, make sure all
+ * of these guarantees are preserved.
+ * * If the requested language is *not* the content language, then the CDB cache for that
+ * specific language will take precedence over the root database page ([[MW:msg]]).
+ * * Fallbacks will be just that: fallbacks. A fallback language will never be reached if
+ * the message is available *anywhere* in the language for which it is a fallback.
+ *
+ * @param string $key the message key
+ * @param bool $useDB If true, look for the message in the DB, false
+ * to use only the compiled l10n cache.
+ * @param bool|string|object $langcode Code of the language to get the message for.
+ * - If string and a valid code, will create a standard language object
+ * - If string but not a valid code, will create a basic language object
+ * - If boolean and false, create object from the current users language
+ * - If boolean and true, create object from the wikis content language
+ * - If language object, use it as given
+ * @param bool $isFullKey specifies whether $key is a two part key
* "msg/lang".
*
- * @throws MWException
- * @return string|bool
+ * @throws MWException when given an invalid key
+ * @return string|bool False if the message doesn't exist, otherwise the message (which can be empty)
*/
function get( $key, $useDB = true, $langcode = true, $isFullKey = false ) {
- global $wgLanguageCode, $wgContLang;
+ global $wgContLang;
- if ( is_int( $key ) ) {
- // "Non-string key given" exception sometimes happens for numerical strings that become ints somewhere on their way here
- $key = strval( $key );
- }
+ $section = new ProfileSection( __METHOD__ );
- if ( !is_string( $key ) ) {
+ if ( is_int( $key ) ) {
+ // Fix numerical strings that somehow become ints
+ // on their way here
+ $key = (string)$key;
+ } elseif ( !is_string( $key ) ) {
throw new MWException( 'Non-string key given' );
- }
-
- if ( strval( $key ) === '' ) {
- # Shortcut: the empty key is always missing
+ } elseif ( $key === '' ) {
+ // Shortcut: the empty key is always missing
return false;
}
- $lang = wfGetLangObj( $langcode );
- if ( !$lang ) {
- throw new MWException( "Bad lang code $langcode given" );
+ // For full keys, get the language code from the key
+ $pos = strrpos( $key, '/' );
+ if ( $isFullKey && $pos !== false ) {
+ $langcode = substr( $key, $pos + 1 );
+ $key = substr( $key, 0, $pos );
}
- $langcode = $lang->getCode();
-
- $message = false;
-
- # Normalise title-case input (with some inlining)
- $lckey = str_replace( ' ', '_', $key );
+ // Normalise title-case input (with some inlining)
+ $lckey = strtr( $key, ' ', '_' );
if ( ord( $key ) < 128 ) {
$lckey[0] = strtolower( $lckey[0] );
$uckey = ucfirst( $lckey );
@@ -641,80 +724,160 @@ class MessageCache {
$uckey = $wgContLang->ucfirst( $lckey );
}
- # Try the MediaWiki namespace
- if( !$this->mDisable && $useDB ) {
- $title = $uckey;
- if( !$isFullKey && ( $langcode != $wgLanguageCode ) ) {
- $title .= '/' . $langcode;
- }
- $message = $this->getMsgFromNamespace( $title, $langcode );
- }
+ // Loop through each language in the fallback list until we find something useful
+ $lang = wfGetLangObj( $langcode );
+ $message = $this->getMessageFromFallbackChain( $lang, $lckey, $uckey, !$this->mDisable && $useDB );
- # Try the array in the language object
+ // If we still have no message, maybe the key was in fact a full key so try that
if ( $message === false ) {
- $message = $lang->getMessage( $lckey );
- if ( is_null( $message ) ) {
- $message = false;
- }
- }
-
- # Try the array of another language
- if( $message === false ) {
$parts = explode( '/', $lckey );
- # We may get calls for things that are http-urls from sidebar
- # Let's not load nonexistent languages for those
- # They usually have more than one slash.
+ // We may get calls for things that are http-urls from sidebar
+ // Let's not load nonexistent languages for those
+ // They usually have more than one slash.
if ( count( $parts ) == 2 && $parts[1] !== '' ) {
$message = Language::getMessageFor( $parts[0], $parts[1] );
- if ( is_null( $message ) ) {
+ if ( $message === null ) {
$message = false;
}
}
}
- # Is this a custom message? Try the default language in the db...
- if( ( $message === false || $message === '-' ) &&
- !$this->mDisable && $useDB &&
- !$isFullKey && ( $langcode != $wgLanguageCode ) ) {
+ // Post-processing if the message exists
+ if ( $message !== false ) {
+ // Fix whitespace
+ $message = str_replace(
+ array(
+ # Fix for trailing whitespace, removed by textarea
+ '&#32;',
+ # Fix for NBSP, converted to space by firefox
+ '&nbsp;',
+ '&#160;',
+ ),
+ array(
+ ' ',
+ "\xc2\xa0",
+ "\xc2\xa0"
+ ),
+ $message
+ );
+ }
+
+ return $message;
+ }
+
+ /**
+ * Given a language, try and fetch a message from that language, then the
+ * fallbacks of that language, then the site language, then the fallbacks for the
+ * site language.
+ *
+ * @param Language $lang Requested language
+ * @param string $lckey Lowercase key for the message
+ * @param string $uckey Uppercase key for the message
+ * @param bool $useDB Whether to use the database
+ *
+ * @see MessageCache::get
+ * @return string|bool The message, or false if not found
+ */
+ protected function getMessageFromFallbackChain( $lang, $lckey, $uckey, $useDB ) {
+ global $wgLanguageCode, $wgContLang;
+
+ $langcode = $lang->getCode();
+ $message = false;
+
+ // First try the requested language.
+ if ( $useDB ) {
+ if ( $langcode === $wgLanguageCode ) {
+ // Messages created in the content language will not have the /lang extension
+ $message = $this->getMsgFromNamespace( $uckey, $langcode );
+ } else {
+ $message = $this->getMsgFromNamespace( "$uckey/$langcode", $langcode );
+ }
+ }
+
+ if ( $message !== false ) {
+ return $message;
+ }
+
+ // Check the CDB cache
+ $message = $lang->getMessage( $lckey );
+ if ( $message !== null ) {
+ return $message;
+ }
+
+ list( $fallbackChain, $siteFallbackChain ) = Language::getFallbacksIncludingSiteLanguage( $langcode );
+
+ // Next try checking the database for all of the fallback languages of the requested language.
+ if ( $useDB ) {
+ foreach ( $fallbackChain as $code ) {
+ if ( $code === $wgLanguageCode ) {
+ // Messages created in the content language will not have the /lang extension
+ $message = $this->getMsgFromNamespace( $uckey, $code );
+ } else {
+ $message = $this->getMsgFromNamespace( "$uckey/$code", $code );
+ }
+
+ if ( $message !== false ) {
+ // Found the message.
+ return $message;
+ }
+ }
+ }
+
+ // Now try checking the site language.
+ if ( $useDB ) {
$message = $this->getMsgFromNamespace( $uckey, $wgLanguageCode );
+ if ( $message !== false ) {
+ return $message;
+ }
}
- # Final fallback
- if( $message === false ) {
- return false;
+ $message = $wgContLang->getMessage( $lckey );
+ if ( $message !== null ) {
+ return $message;
}
- # Fix whitespace
- $message = strtr( $message,
- array(
- # Fix for trailing whitespace, removed by textarea
- '&#32;' => ' ',
- # Fix for NBSP, converted to space by firefox
- '&nbsp;' => "\xc2\xa0",
- '&#160;' => "\xc2\xa0",
- ) );
+ // Finally try the DB for the site language's fallbacks.
+ if ( $useDB ) {
+ foreach ( $siteFallbackChain as $code ) {
+ $message = $this->getMsgFromNamespace( "$uckey/$code", $code );
+ if ( $message === false && $code === $wgLanguageCode ) {
+ // Messages created in the content language will not have the /lang extension
+ $message = $this->getMsgFromNamespace( $uckey, $code );
+ }
- return $message;
+ if ( $message !== false ) {
+ // Found the message.
+ return $message;
+ }
+ }
+ }
+
+ return false;
}
/**
* Get a message from the MediaWiki namespace, with caching. The key must
* first be converted to two-part lang/msg form if necessary.
*
- * @param string $title Message cache key with initial uppercase letter.
- * @param string $code code denoting the language to try.
+ * Unlike self::get(), this function doesn't resolve fallback chains, and
+ * some callers require this behavior. LanguageConverter::parseCachedTable()
+ * and self::get() are some examples in core.
*
- * @return string|bool False on failure
+ * @param string $title Message cache key with initial uppercase letter.
+ * @param string $code Code denoting the language to try.
+ * @return string|bool The message, or false if it does not exist or on error
*/
function getMsgFromNamespace( $title, $code ) {
$this->load( $code );
if ( isset( $this->mCache[$code][$title] ) ) {
$entry = $this->mCache[$code][$title];
if ( substr( $entry, 0, 1 ) === ' ' ) {
- return substr( $entry, 1 );
+ // The message exists, so make sure a string
+ // is returned.
+ return (string)substr( $entry, 1 );
} elseif ( $entry === '!NONEXISTENT' ) {
return false;
- } elseif( $entry === '!TOO BIG' ) {
+ } elseif ( $entry === '!TOO BIG' ) {
// Fall through and try invididual message cache below
}
} else {
@@ -734,7 +897,9 @@ class MessageCache {
if ( $entry ) {
if ( substr( $entry, 0, 1 ) === ' ' ) {
$this->mCache[$code][$title] = $entry;
- return substr( $entry, 1 );
+ // The message exists, so make sure a string
+ // is returned.
+ return (string)substr( $entry, 1 );
} elseif ( $entry === '!NONEXISTENT' ) {
$this->mCache[$code][$title] = '!NONEXISTENT';
return false;
@@ -752,17 +917,24 @@ class MessageCache {
$content = $revision->getContent();
if ( !$content ) {
// A possibly temporary loading failure.
- wfDebugLog( 'MessageCache', __METHOD__ . ": failed to load message page text for {$title} ($code)" );
+ wfDebugLog(
+ 'MessageCache',
+ __METHOD__ . ": failed to load message page text for {$title} ($code)"
+ );
$message = null; // no negative caching
} else {
// XXX: Is this the right way to turn a Content object into a message?
- // NOTE: $content is typically either WikitextContent, JavaScriptContent or CssContent.
- // MessageContent is *not* used for storing messages, it's only used for wrapping them when needed.
+ // NOTE: $content is typically either WikitextContent, JavaScriptContent or
+ // CssContent. MessageContent is *not* used for storing messages, it's
+ // only used for wrapping them when needed.
$message = $content->getWikitextForTransclusion();
if ( $message === false || $message === null ) {
- wfDebugLog( 'MessageCache', __METHOD__ . ": message content doesn't provide wikitext "
- . "(content model: " . $content->getContentHandler() . ")" );
+ wfDebugLog(
+ 'MessageCache',
+ __METHOD__ . ": message content doesn't provide wikitext "
+ . "(content model: " . $content->getContentHandler() . ")"
+ );
$message = false; // negative caching
} else {
@@ -783,15 +955,15 @@ class MessageCache {
}
/**
- * @param $message string
- * @param $interface bool
- * @param $language
- * @param $title Title
+ * @param string $message
+ * @param bool $interface
+ * @param string $language Language code
+ * @param Title $title
* @return string
*/
function transform( $message, $interface = false, $language = null, $title = null ) {
// Avoid creating parser if nothing to transform
- if( strpos( $message, '{{' ) === false ) {
+ if ( strpos( $message, '{{' ) === false ) {
return $message;
}
@@ -835,14 +1007,16 @@ class MessageCache {
}
/**
- * @param $text string
- * @param $title Title
- * @param $linestart bool
- * @param $interface bool
- * @param $language
+ * @param string $text
+ * @param Title $title
+ * @param bool $linestart Whether or not this is at the start of a line
+ * @param bool $interface Whether this is an interface message
+ * @param string $language Language code
* @return ParserOutput|string
*/
- public function parse( $text, $title = null, $linestart = true, $interface = false, $language = null ) {
+ public function parse( $text, $title = null, $linestart = true,
+ $interface = false, $language = null
+ ) {
if ( $this->mInParser ) {
return htmlspecialchars( $text );
}
@@ -901,12 +1075,12 @@ class MessageCache {
public function figureMessage( $key ) {
global $wgLanguageCode;
$pieces = explode( '/', $key );
- if( count( $pieces ) < 2 ) {
+ if ( count( $pieces ) < 2 ) {
return array( $key, $wgLanguageCode );
}
$lang = array_pop( $pieces );
- if( !Language::fetchLanguageName( $lang, null, 'mw' ) ) {
+ if ( !Language::fetchLanguageName( $lang, null, 'mw' ) ) {
return array( $key, $wgLanguageCode );
}
@@ -919,7 +1093,7 @@ class MessageCache {
* If $code is the content language code, this will return all message keys
* for which MediaWiki:msgkey exists. If $code is another language code, this
* will ONLY return message keys for which MediaWiki:msgkey/$code exists.
- * @param $code string
+ * @param string $code Language code
* @return array of message keys (strings)
*/
public function getAllMessageKeys( $code ) {
@@ -929,9 +1103,12 @@ class MessageCache {
// Apparently load() failed
return null;
}
- $cache = $this->mCache[$code]; // Copy the cache
- unset( $cache['VERSION'] ); // Remove the VERSION key
- $cache = array_diff( $cache, array( '!NONEXISTENT' ) ); // Remove any !NONEXISTENT keys
+ // Remove administrative keys
+ $cache = $this->mCache[$code];
+ unset( $cache['VERSION'] );
+ unset( $cache['EXPIRY'] );
+ // Remove any !NONEXISTENT keys
+ $cache = array_diff( $cache, array( '!NONEXISTENT' ) );
// Keys may appear with a capital first letter. lcfirst them.
return array_map( array( $wgContLang, 'lcfirst' ), array_keys( $cache ) );
}
diff --git a/includes/cache/ResourceFileCache.php b/includes/cache/ResourceFileCache.php
index 61f1e8c3..2ad7b853 100644
--- a/includes/cache/ResourceFileCache.php
+++ b/includes/cache/ResourceFileCache.php
@@ -29,7 +29,7 @@
class ResourceFileCache extends FileCacheBase {
protected $mCacheWorthy;
- /* @TODO: configurable? */
+ /* @todo configurable? */
const MISS_THRESHOLD = 360; // 6/min * 60 min
/**
diff --git a/includes/cache/SquidUpdate.php b/includes/cache/SquidUpdate.php
index 39bf4c9f..71afeba9 100644
--- a/includes/cache/SquidUpdate.php
+++ b/includes/cache/SquidUpdate.php
@@ -26,32 +26,42 @@
* @ingroup Cache
*/
class SquidUpdate {
- var $urlArr, $mMaxTitles;
/**
- * @param $urlArr array
- * @param $maxTitles bool|int
+ * Collection of URLs to purge.
+ * @var array
*/
- function __construct( $urlArr = array(), $maxTitles = false ) {
+ protected $urlArr;
+
+ /**
+ * @param array $urlArr Collection of URLs to purge
+ * @param bool|int $maxTitles Maximum number of unique URLs to purge
+ */
+ public function __construct( $urlArr = array(), $maxTitles = false ) {
global $wgMaxSquidPurgeTitles;
if ( $maxTitles === false ) {
- $this->mMaxTitles = $wgMaxSquidPurgeTitles;
- } else {
- $this->mMaxTitles = $maxTitles;
+ $maxTitles = $wgMaxSquidPurgeTitles;
}
- $urlArr = array_unique( $urlArr ); // Remove duplicates
- if ( count( $urlArr ) > $this->mMaxTitles ) {
- $urlArr = array_slice( $urlArr, 0, $this->mMaxTitles );
+
+ // Remove duplicate URLs from list
+ $urlArr = array_unique( $urlArr );
+ if ( count( $urlArr ) > $maxTitles ) {
+ // Truncate to desired maximum URL count
+ $urlArr = array_slice( $urlArr, 0, $maxTitles );
}
$this->urlArr = $urlArr;
}
/**
- * @param $title Title
+ * Create a SquidUpdate from the given Title object.
+ *
+ * The resulting SquidUpdate will purge the given Title's URLs as well as
+ * the pages that link to it. Capped at $wgMaxSquidPurgeTitles total URLs.
*
+ * @param Title $title
* @return SquidUpdate
*/
- static function newFromLinksTo( &$title ) {
+ public static function newFromLinksTo( Title $title ) {
global $wgMaxSquidPurgeTitles;
wfProfileIn( __METHOD__ );
@@ -79,12 +89,11 @@ class SquidUpdate {
/**
* Create a SquidUpdate from an array of Title objects, or a TitleArray object
*
- * @param $titles array
- * @param $urlArr array
- *
+ * @param array $titles
+ * @param array $urlArr
* @return SquidUpdate
*/
- static function newFromTitles( $titles, $urlArr = array() ) {
+ public static function newFromTitles( $titles, $urlArr = array() ) {
global $wgMaxSquidPurgeTitles;
$i = 0;
foreach ( $titles as $title ) {
@@ -97,20 +106,19 @@ class SquidUpdate {
}
/**
- * @param $title Title
- *
+ * @param Title $title
* @return SquidUpdate
*/
- static function newSimplePurge( &$title ) {
+ public static function newSimplePurge( Title $title ) {
$urlArr = $title->getSquidURLs();
return new SquidUpdate( $urlArr );
}
/**
- * Purges the list of URLs passed to the constructor
+ * Purges the list of URLs passed to the constructor.
*/
- function doUpdate() {
- SquidUpdate::purge( $this->urlArr );
+ public function doUpdate() {
+ self::purge( $this->urlArr );
}
/**
@@ -119,27 +127,30 @@ class SquidUpdate {
* (example: $urlArr[] = 'http://my.host/something')
* XXX report broken Squids per mail or log
*
- * @param $urlArr array
- * @return void
+ * @param array $urlArr List of full URLs to purge
*/
- static function purge( $urlArr ) {
- global $wgSquidServers, $wgHTCPMulticastRouting;
+ public static function purge( $urlArr ) {
+ global $wgSquidServers, $wgHTCPRouting;
- if( !$urlArr ) {
+ if ( !$urlArr ) {
return;
}
- wfDebug( "Squid purge: " . implode( ' ', $urlArr ) . "\n" );
+ wfDebugLog( 'squid', __METHOD__ . ': ' . implode( ' ', $urlArr ) . "\n" );
- if ( $wgHTCPMulticastRouting ) {
- SquidUpdate::HTCPPurge( $urlArr );
+ if ( $wgHTCPRouting ) {
+ self::HTCPPurge( $urlArr );
}
wfProfileIn( __METHOD__ );
- $urlArr = array_unique( $urlArr ); // Remove duplicates
- $maxSocketsPerSquid = 8; // socket cap per Squid
- $urlsPerSocket = 400; // 400 seems to be a good tradeoff, opening a socket takes a while
+ // Remove duplicate URLs
+ $urlArr = array_unique( $urlArr );
+ // Maximum number of parallel connections per squid
+ $maxSocketsPerSquid = 8;
+ // Number of requests to send per socket
+ // 400 seems to be a good tradeoff, opening a socket takes a while
+ $urlsPerSocket = 400;
$socketsPerSquid = ceil( count( $urlArr ) / $urlsPerSocket );
if ( $socketsPerSquid > $maxSocketsPerSquid ) {
$socketsPerSquid = $maxSocketsPerSquid;
@@ -162,17 +173,20 @@ class SquidUpdate {
}
/**
+ * Send Hyper Text Caching Protocol (HTCP) CLR requests.
+ *
* @throws MWException
- * @param $urlArr array
+ * @param array $urlArr Collection of URLs to purge
*/
- static function HTCPPurge( $urlArr ) {
- global $wgHTCPMulticastRouting, $wgHTCPMulticastTTL;
+ public static function HTCPPurge( $urlArr ) {
+ global $wgHTCPRouting, $wgHTCPMulticastTTL;
wfProfileIn( __METHOD__ );
- $htcpOpCLR = 4; // HTCP CLR
+ // HTCP CLR operation
+ $htcpOpCLR = 4;
// @todo FIXME: PHP doesn't support these socket constants (include/linux/in.h)
- if( !defined( "IPPROTO_IP" ) ) {
+ if ( !defined( "IPPROTO_IP" ) ) {
define( "IPPROTO_IP", 0 );
define( "IP_MULTICAST_LOOP", 34 );
define( "IP_MULTICAST_TTL", 33 );
@@ -180,55 +194,73 @@ class SquidUpdate {
// pfsockopen doesn't work because we need set_sock_opt
$conn = socket_create( AF_INET, SOCK_DGRAM, SOL_UDP );
- if ( $conn ) {
- // Set socket options
- socket_set_option( $conn, IPPROTO_IP, IP_MULTICAST_LOOP, 0 );
- if ( $wgHTCPMulticastTTL != 1 )
- socket_set_option( $conn, IPPROTO_IP, IP_MULTICAST_TTL,
- $wgHTCPMulticastTTL );
-
- $urlArr = array_unique( $urlArr ); // Remove duplicates
- foreach ( $urlArr as $url ) {
- if( !is_string( $url ) ) {
- throw new MWException( 'Bad purge URL' );
- }
- $url = SquidUpdate::expand( $url );
- $conf = self::getRuleForURL( $url, $wgHTCPMulticastRouting );
- if ( !$conf ) {
- wfDebug( "No HTCP rule configured for URL $url , skipping\n" );
- continue;
- }
- if ( !isset( $conf['host'] ) || !isset( $conf['port'] ) ) {
+ if ( ! $conn ) {
+ $errstr = socket_strerror( socket_last_error() );
+ wfDebugLog( 'squid', __METHOD__ .
+ ": Error opening UDP socket: $errstr\n" );
+ wfProfileOut( __METHOD__ );
+ return;
+ }
+
+ // Set socket options
+ socket_set_option( $conn, IPPROTO_IP, IP_MULTICAST_LOOP, 0 );
+ if ( $wgHTCPMulticastTTL != 1 ) {
+ // Set multicast time to live (hop count) option on socket
+ socket_set_option( $conn, IPPROTO_IP, IP_MULTICAST_TTL,
+ $wgHTCPMulticastTTL );
+ }
+
+ // Remove duplicate URLs from collection
+ $urlArr = array_unique( $urlArr );
+ foreach ( $urlArr as $url ) {
+ if ( !is_string( $url ) ) {
+ wfProfileOut( __METHOD__ );
+ throw new MWException( 'Bad purge URL' );
+ }
+ $url = self::expand( $url );
+ $conf = self::getRuleForURL( $url, $wgHTCPRouting );
+ if ( !$conf ) {
+ wfDebugLog( 'squid', __METHOD__ .
+ "No HTCP rule configured for URL {$url} , skipping\n" );
+ continue;
+ }
+
+ if ( isset( $conf['host'] ) && isset( $conf['port'] ) ) {
+ // Normalize single entries
+ $conf = array( $conf );
+ }
+ foreach ( $conf as $subconf ) {
+ if ( !isset( $subconf['host'] ) || !isset( $subconf['port'] ) ) {
+ wfProfileOut( __METHOD__ );
throw new MWException( "Invalid HTCP rule for URL $url\n" );
}
+ }
- // Construct a minimal HTCP request diagram
- // as per RFC 2756
- // Opcode 'CLR', no response desired, no auth
- $htcpTransID = rand();
+ // Construct a minimal HTCP request diagram
+ // as per RFC 2756
+ // Opcode 'CLR', no response desired, no auth
+ $htcpTransID = rand();
- $htcpSpecifier = pack( 'na4na*na8n',
- 4, 'HEAD', strlen( $url ), $url,
- 8, 'HTTP/1.0', 0 );
+ $htcpSpecifier = pack( 'na4na*na8n',
+ 4, 'HEAD', strlen( $url ), $url,
+ 8, 'HTTP/1.0', 0 );
- $htcpDataLen = 8 + 2 + strlen( $htcpSpecifier );
- $htcpLen = 4 + $htcpDataLen + 2;
+ $htcpDataLen = 8 + 2 + strlen( $htcpSpecifier );
+ $htcpLen = 4 + $htcpDataLen + 2;
- // Note! Squid gets the bit order of the first
- // word wrong, wrt the RFC. Apparently no other
- // implementation exists, so adapt to Squid
- $htcpPacket = pack( 'nxxnCxNxxa*n',
- $htcpLen, $htcpDataLen, $htcpOpCLR,
- $htcpTransID, $htcpSpecifier, 2);
+ // Note! Squid gets the bit order of the first
+ // word wrong, wrt the RFC. Apparently no other
+ // implementation exists, so adapt to Squid
+ $htcpPacket = pack( 'nxxnCxNxxa*n',
+ $htcpLen, $htcpDataLen, $htcpOpCLR,
+ $htcpTransID, $htcpSpecifier, 2 );
- // Send out
- wfDebug( "Purging URL $url via HTCP\n" );
+ wfDebugLog( 'squid', __METHOD__ .
+ "Purging URL $url via HTCP\n" );
+ foreach ( $conf as $subconf ) {
socket_sendto( $conn, $htcpPacket, $htcpLen, 0,
- $conf['host'], $conf['port'] );
+ $subconf['host'], $subconf['port'] );
}
- } else {
- $errstr = socket_strerror( socket_last_error() );
- wfDebug( __METHOD__ . "(): Error opening UDP socket: $errstr\n" );
}
wfProfileOut( __METHOD__ );
}
@@ -244,21 +276,20 @@ class SquidUpdate {
*
* Client functions should not need to call this.
*
- * @param $url string
- *
+ * @param string $url
* @return string
*/
- static function expand( $url ) {
+ public static function expand( $url ) {
return wfExpandUrl( $url, PROTO_INTERNAL );
}
/**
* Find the HTCP routing rule to use for a given URL.
* @param string $url URL to match
- * @param array $rules Array of rules, see $wgHTCPMulticastRouting for format and behavior
+ * @param array $rules Array of rules, see $wgHTCPRouting for format and behavior
* @return mixed Element of $rules that matched, or false if nothing matched
*/
- static function getRuleForURL( $url, $rules ) {
+ private static function getRuleForURL( $url, $rules ) {
foreach ( $rules as $regex => $routing ) {
if ( $regex === '' || preg_match( $regex, $url ) ) {
return $routing;
diff --git a/includes/cache/UserCache.php b/includes/cache/UserCache.php
index bfbacfaa..6085f586 100644
--- a/includes/cache/UserCache.php
+++ b/includes/cache/UserCache.php
@@ -59,6 +59,17 @@ class UserCache {
}
/**
+ * Get the name of a user or return $ip if the user ID is 0
+ *
+ * @param integer $userId
+ * @param string $ip
+ * @since 1.22
+ */
+ public function getUserName( $userId, $ip ) {
+ return $userId > 0 ? $this->getProp( $userId, 'name' ) : $ip;
+ }
+
+ /**
* Preloads user names for given list of users.
* @param array $userIds List of user IDs
* @param array $options Option flags; include 'userpage' and 'usertalk'
@@ -70,6 +81,8 @@ class UserCache {
$usersToCheck = array();
$usersToQuery = array();
+ $userIds = array_unique( $userIds );
+
foreach ( $userIds as $userId ) {
$userId = (int)$userId;
if ( $userId <= 0 ) {
diff --git a/includes/changes/ChangesList.php b/includes/changes/ChangesList.php
new file mode 100644
index 00000000..bf800c46
--- /dev/null
+++ b/includes/changes/ChangesList.php
@@ -0,0 +1,552 @@
+<?php
+/**
+ * Base class for all changes lists.
+ *
+ * The class is used for formatting recent changes, related changes and 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
+ */
+
+class ChangesList extends ContextSource {
+
+ /**
+ * @var Skin
+ */
+ public $skin;
+
+ protected $watchlist = false;
+
+ protected $message;
+
+ /**
+ * Changeslist constructor
+ *
+ * @param $obj Skin or IContextSource
+ */
+ public function __construct( $obj ) {
+ if ( $obj instanceof IContextSource ) {
+ $this->setContext( $obj );
+ $this->skin = $obj->getSkin();
+ } else {
+ $this->setContext( $obj->getContext() );
+ $this->skin = $obj;
+ }
+ $this->preCacheMessages();
+ }
+
+ /**
+ * Fetch an appropriate changes list class for the main context
+ * This first argument used to be an User object.
+ *
+ * @deprecated in 1.18; use newFromContext() instead
+ * @param string|User $unused Unused
+ * @return ChangesList|EnhancedChangesList|OldChangesList derivative
+ */
+ public static function newFromUser( $unused ) {
+ wfDeprecated( __METHOD__, '1.18' );
+ return self::newFromContext( RequestContext::getMain() );
+ }
+
+ /**
+ * Fetch an appropriate changes list class for the specified context
+ * Some users might want to use an enhanced list format, for instance
+ *
+ * @param $context IContextSource to use
+ * @return ChangesList|EnhancedChangesList|OldChangesList derivative
+ */
+ public static function newFromContext( IContextSource $context ) {
+ $user = $context->getUser();
+ $sk = $context->getSkin();
+ $list = null;
+ if ( wfRunHooks( 'FetchChangesList', array( $user, &$sk, &$list ) ) ) {
+ $new = $context->getRequest()->getBool( 'enhanced', $user->getOption( 'usenewrc' ) );
+ return $new ? new EnhancedChangesList( $context ) : new OldChangesList( $context );
+ } else {
+ return $list;
+ }
+ }
+
+ /**
+ * Sets the list to use a "<li class='watchlist-(namespace)-(page)'>" tag
+ * @param $value Boolean
+ */
+ public function setWatchlistDivs( $value = true ) {
+ $this->watchlist = $value;
+ }
+
+ /**
+ * 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
+ */
+ private function preCacheMessages() {
+ if ( !isset( $this->message ) ) {
+ foreach ( array(
+ 'cur', 'diff', 'hist', 'enhancedrc-history', 'last', 'blocklink', 'history',
+ 'semicolon-separator', 'pipe-separator' ) as $msg
+ ) {
+ $this->message[$msg] = $this->msg( $msg )->escaped();
+ }
+ }
+ }
+
+ /**
+ * Returns the appropriate flags for new page, minor change and patrolling
+ * @param array $flags Associative array of 'flag' => Bool
+ * @param string $nothing to use for empty space
+ * @return String
+ */
+ public function recentChangesFlags( $flags, $nothing = '&#160;' ) {
+ global $wgRecentChangesFlags;
+ $f = '';
+ foreach ( array_keys( $wgRecentChangesFlags ) as $flag ) {
+ $f .= isset( $flags[$flag] ) && $flags[$flag]
+ ? self::flag( $flag )
+ : $nothing;
+ }
+ return $f;
+ }
+
+ /**
+ * Provide the "<abbr>" element appropriate to a given abbreviated flag,
+ * namely the flag indicating a new page, a minor edit, a bot edit, or an
+ * unpatrolled edit. By default in English it will contain "N", "m", "b",
+ * "!" respectively, plus it will have an appropriate title and class.
+ *
+ * @param string $flag One key of $wgRecentChangesFlags
+ * @return String: Raw HTML
+ */
+ public static function flag( $flag ) {
+ static $flagInfos = null;
+ if ( is_null( $flagInfos ) ) {
+ global $wgRecentChangesFlags;
+ $flagInfos = array();
+ foreach ( $wgRecentChangesFlags as $key => $value ) {
+ $flagInfos[$key]['letter'] = wfMessage( $value['letter'] )->escaped();
+ $flagInfos[$key]['title'] = wfMessage( $value['title'] )->escaped();
+ // Allow customized class name, fall back to flag name
+ $flagInfos[$key]['class'] = Sanitizer::escapeClass(
+ isset( $value['class'] ) ? $value['class'] : $key );
+ }
+ }
+
+ // Inconsistent naming, bleh, kepted for b/c
+ $map = array(
+ 'minoredit' => 'minor',
+ 'botedit' => 'bot',
+ );
+ if ( isset( $map[$flag] ) ) {
+ $flag = $map[$flag];
+ }
+
+ return "<abbr class='" . $flagInfos[$flag]['class'] . "' title='" . $flagInfos[$flag]['title'] . "'>" .
+ $flagInfos[$flag]['letter'] .
+ '</abbr>';
+ }
+
+ /**
+ * Returns text for the start of the tabular part of RC
+ * @return String
+ */
+ public function beginRecentChangesList() {
+ $this->rc_cache = array();
+ $this->rcMoveIndex = 0;
+ $this->rcCacheIndex = 0;
+ $this->lastdate = '';
+ $this->rclistOpen = false;
+ $this->getOutput()->addModuleStyles( 'mediawiki.special.changeslist' );
+ return '';
+ }
+
+ /**
+ * Show formatted char difference
+ * @param $old Integer: bytes
+ * @param $new Integer: bytes
+ * @param $context IContextSource context to use
+ * @return String
+ */
+ public static function showCharacterDifference( $old, $new, IContextSource $context = null ) {
+ global $wgRCChangedSizeThreshold, $wgMiserMode;
+
+ if ( !$context ) {
+ $context = RequestContext::getMain();
+ }
+
+ $new = (int)$new;
+ $old = (int)$old;
+ $szdiff = $new - $old;
+
+ $lang = $context->getLanguage();
+ $code = $lang->getCode();
+ static $fastCharDiff = array();
+ if ( !isset( $fastCharDiff[$code] ) ) {
+ $fastCharDiff[$code] = $wgMiserMode || $context->msg( 'rc-change-size' )->plain() === '$1';
+ }
+
+ $formattedSize = $lang->formatNum( $szdiff );
+
+ if ( !$fastCharDiff[$code] ) {
+ $formattedSize = $context->msg( 'rc-change-size', $formattedSize )->text();
+ }
+
+ if ( abs( $szdiff ) > abs( $wgRCChangedSizeThreshold ) ) {
+ $tag = 'strong';
+ } else {
+ $tag = 'span';
+ }
+
+ if ( $szdiff === 0 ) {
+ $formattedSizeClass = 'mw-plusminus-null';
+ }
+ if ( $szdiff > 0 ) {
+ $formattedSize = '+' . $formattedSize;
+ $formattedSizeClass = 'mw-plusminus-pos';
+ }
+ if ( $szdiff < 0 ) {
+ $formattedSizeClass = 'mw-plusminus-neg';
+ }
+
+ $formattedTotalSize = $context->msg( 'rc-change-size-new' )->numParams( $new )->text();
+
+ return Html::element( $tag,
+ array( 'dir' => 'ltr', 'class' => $formattedSizeClass, 'title' => $formattedTotalSize ),
+ $context->msg( 'parentheses', $formattedSize )->plain() ) . $lang->getDirMark();
+ }
+
+ /**
+ * Format the character difference of one or several changes.
+ *
+ * @param $old RecentChange
+ * @param $new RecentChange last change to use, if not provided, $old will be used
+ * @return string HTML fragment
+ */
+ public function formatCharacterDifference( RecentChange $old, RecentChange $new = null ) {
+ $oldlen = $old->mAttribs['rc_old_len'];
+
+ if ( $new ) {
+ $newlen = $new->mAttribs['rc_new_len'];
+ } else {
+ $newlen = $old->mAttribs['rc_new_len'];
+ }
+
+ if ( $oldlen === null || $newlen === null ) {
+ return '';
+ }
+
+ return self::showCharacterDifference( $oldlen, $newlen, $this->getContext() );
+ }
+
+ /**
+ * Returns text for the end of RC
+ * @return String
+ */
+ public function endRecentChangesList() {
+ if ( $this->rclistOpen ) {
+ return "</ul>\n";
+ } else {
+ return '';
+ }
+ }
+
+ /**
+ * @param string $s HTML to update
+ * @param $rc_timestamp mixed
+ */
+ public function insertDateHeader( &$s, $rc_timestamp ) {
+ # Make date header if necessary
+ $date = $this->getLanguage()->userDate( $rc_timestamp, $this->getUser() );
+ if ( $date != $this->lastdate ) {
+ if ( $this->lastdate != '' ) {
+ $s .= "</ul>\n";
+ }
+ $s .= Xml::element( 'h4', null, $date ) . "\n<ul class=\"special\">";
+ $this->lastdate = $date;
+ $this->rclistOpen = true;
+ }
+ }
+
+ /**
+ * @param string $s HTML to update
+ * @param $title Title
+ * @param $logtype string
+ */
+ public function insertLog( &$s, $title, $logtype ) {
+ $page = new LogPage( $logtype );
+ $logname = $page->getName()->escaped();
+ $s .= $this->msg( 'parentheses' )->rawParams( Linker::linkKnown( $title, $logname ) )->escaped();
+ }
+
+ /**
+ * @param string $s HTML to update
+ * @param $rc RecentChange
+ * @param $unpatrolled
+ */
+ public function insertDiffHist( &$s, &$rc, $unpatrolled ) {
+ # Diff link
+ if ( $rc->mAttribs['rc_type'] == RC_NEW || $rc->mAttribs['rc_type'] == RC_LOG ) {
+ $diffLink = $this->message['diff'];
+ } elseif ( !self::userCan( $rc, Revision::DELETED_TEXT, $this->getUser() ) ) {
+ $diffLink = $this->message['diff'];
+ } else {
+ $query = array(
+ 'curid' => $rc->mAttribs['rc_cur_id'],
+ 'diff' => $rc->mAttribs['rc_this_oldid'],
+ 'oldid' => $rc->mAttribs['rc_last_oldid']
+ );
+
+ $diffLink = Linker::linkKnown(
+ $rc->getTitle(),
+ $this->message['diff'],
+ array( 'tabindex' => $rc->counter ),
+ $query
+ );
+ }
+ $diffhist = $diffLink . $this->message['pipe-separator'];
+ # History link
+ $diffhist .= Linker::linkKnown(
+ $rc->getTitle(),
+ $this->message['hist'],
+ array(),
+ array(
+ 'curid' => $rc->mAttribs['rc_cur_id'],
+ 'action' => 'history'
+ )
+ );
+ $s .= $this->msg( 'parentheses' )->rawParams( $diffhist )->escaped() . ' <span class="mw-changeslist-separator">. .</span> ';
+ }
+
+ /**
+ * @param string $s HTML to update
+ * @param $rc RecentChange
+ * @param $unpatrolled
+ * @param $watched
+ */
+ public function insertArticleLink( &$s, &$rc, $unpatrolled, $watched ) {
+ $params = array();
+
+ $articlelink = Linker::linkKnown(
+ $rc->getTitle(),
+ null,
+ array( 'class' => 'mw-changeslist-title' ),
+ $params
+ );
+ if ( $this->isDeleted( $rc, Revision::DELETED_TEXT ) ) {
+ $articlelink = '<span class="history-deleted">' . $articlelink . '</span>';
+ }
+ # To allow for boldening pages watched by this user
+ $articlelink = "<span class=\"mw-title\">{$articlelink}</span>";
+ # RTL/LTR marker
+ $articlelink .= $this->getLanguage()->getDirMark();
+
+ wfRunHooks( 'ChangesListInsertArticleLink',
+ array( &$this, &$articlelink, &$s, &$rc, $unpatrolled, $watched ) );
+
+ $s .= " $articlelink";
+ }
+
+ /**
+ * Get the timestamp from $rc formatted with current user's settings
+ * and a separator
+ *
+ * @param $rc RecentChange
+ * @return string HTML fragment
+ */
+ public function getTimestamp( $rc ) {
+ return $this->message['semicolon-separator'] . '<span class="mw-changeslist-date">' .
+ $this->getLanguage()->userTime( $rc->mAttribs['rc_timestamp'], $this->getUser() ) . '</span> <span class="mw-changeslist-separator">. .</span> ';
+ }
+
+ /**
+ * Insert time timestamp string from $rc into $s
+ *
+ * @param string $s HTML to update
+ * @param $rc RecentChange
+ */
+ public function insertTimestamp( &$s, $rc ) {
+ $s .= $this->getTimestamp( $rc );
+ }
+
+ /**
+ * Insert links to user page, user talk page and eventually a blocking link
+ *
+ * @param &$s String HTML to update
+ * @param &$rc RecentChange
+ */
+ public function insertUserRelatedLinks( &$s, &$rc ) {
+ if ( $this->isDeleted( $rc, Revision::DELETED_USER ) ) {
+ $s .= ' <span class="history-deleted">' . $this->msg( 'rev-deleted-user' )->escaped() . '</span>';
+ } else {
+ $s .= $this->getLanguage()->getDirMark() . Linker::userLink( $rc->mAttribs['rc_user'],
+ $rc->mAttribs['rc_user_text'] );
+ $s .= Linker::userToolLinks( $rc->mAttribs['rc_user'], $rc->mAttribs['rc_user_text'] );
+ }
+ }
+
+ /**
+ * Insert a formatted action
+ *
+ * @param $rc RecentChange
+ * @return string
+ */
+ public function insertLogEntry( $rc ) {
+ $formatter = LogFormatter::newFromRow( $rc->mAttribs );
+ $formatter->setContext( $this->getContext() );
+ $formatter->setShowUserToolLinks( true );
+ $mark = $this->getLanguage()->getDirMark();
+ return $formatter->getActionText() . " $mark" . $formatter->getComment();
+ }
+
+ /**
+ * Insert a formatted comment
+ * @param $rc RecentChange
+ * @return string
+ */
+ public function insertComment( $rc ) {
+ if ( $rc->mAttribs['rc_type'] != RC_MOVE && $rc->mAttribs['rc_type'] != RC_MOVE_OVER_REDIRECT ) {
+ if ( $this->isDeleted( $rc, Revision::DELETED_COMMENT ) ) {
+ return ' <span class="history-deleted">' . $this->msg( 'rev-deleted-comment' )->escaped() . '</span>';
+ } else {
+ return Linker::commentBlock( $rc->mAttribs['rc_comment'], $rc->getTitle() );
+ }
+ }
+ return '';
+ }
+
+ /**
+ * Check whether to enable recent changes patrol features
+ *
+ * @deprecated since 1.22
+ * @return Boolean
+ */
+ public static function usePatrol() {
+ global $wgUser;
+
+ wfDeprecated( __METHOD__, '1.22' );
+
+ return $wgUser->useRCPatrol();
+ }
+
+ /**
+ * Returns the string which indicates the number of watching users
+ * @return string
+ */
+ protected function numberofWatchingusers( $count ) {
+ static $cache = array();
+ if ( $count > 0 ) {
+ if ( !isset( $cache[$count] ) ) {
+ $cache[$count] = $this->msg( 'number_of_watching_users_RCview' )->numParams( $count )->escaped();
+ }
+ return $cache[$count];
+ } else {
+ return '';
+ }
+ }
+
+ /**
+ * Determine if said field of a revision is hidden
+ * @param $rc RCCacheEntry
+ * @param $field Integer: one of DELETED_* bitfield constants
+ * @return Boolean
+ */
+ public static function isDeleted( $rc, $field ) {
+ return ( $rc->mAttribs['rc_deleted'] & $field ) == $field;
+ }
+
+ /**
+ * Determine if the current user is allowed to view a particular
+ * field of this revision, if it's marked as deleted.
+ * @param $rc RCCacheEntry
+ * @param $field Integer
+ * @param $user User object to check, or null to use $wgUser
+ * @return Boolean
+ */
+ public static function userCan( $rc, $field, User $user = null ) {
+ if ( $rc->mAttribs['rc_type'] == RC_LOG ) {
+ return LogEventsList::userCanBitfield( $rc->mAttribs['rc_deleted'], $field, $user );
+ } else {
+ return Revision::userCanBitfield( $rc->mAttribs['rc_deleted'], $field, $user );
+ }
+ }
+
+ /**
+ * @param $link string
+ * @param $watched bool
+ * @return string
+ */
+ protected function maybeWatchedLink( $link, $watched = false ) {
+ if ( $watched ) {
+ return '<strong class="mw-watched">' . $link . '</strong>';
+ } else {
+ return '<span class="mw-rc-unwatched">' . $link . '</span>';
+ }
+ }
+
+ /** Inserts a rollback link
+ *
+ * @param $s string
+ * @param $rc RecentChange
+ */
+ public function insertRollback( &$s, &$rc ) {
+ if ( $rc->mAttribs['rc_type'] == RC_EDIT && $rc->mAttribs['rc_this_oldid'] && $rc->mAttribs['rc_cur_id'] ) {
+ $page = $rc->getTitle();
+ /** Check for rollback and edit permissions, disallow special pages, and only
+ * show a link on the top-most revision */
+ if ( $this->getUser()->isAllowed( 'rollback' ) && $rc->mAttribs['page_latest'] == $rc->mAttribs['rc_this_oldid'] )
+ {
+ $rev = new Revision( array(
+ 'title' => $page,
+ 'id' => $rc->mAttribs['rc_this_oldid'],
+ 'user' => $rc->mAttribs['rc_user'],
+ 'user_text' => $rc->mAttribs['rc_user_text'],
+ 'deleted' => $rc->mAttribs['rc_deleted']
+ ) );
+ $s .= ' ' . Linker::generateRollback( $rev, $this->getContext() );
+ }
+ }
+ }
+
+ /**
+ * @param $s string
+ * @param $rc RecentChange
+ * @param $classes
+ */
+ public function insertTags( &$s, &$rc, &$classes ) {
+ if ( empty( $rc->mAttribs['ts_tags'] ) ) {
+ return;
+ }
+
+ list( $tagSummary, $newClasses ) = ChangeTags::formatSummaryRow( $rc->mAttribs['ts_tags'], 'changeslist' );
+ $classes = array_merge( $classes, $newClasses );
+ $s .= ' ' . $tagSummary;
+ }
+
+ public function insertExtra( &$s, &$rc, &$classes ) {
+ // Empty, used for subclasses to add anything special.
+ }
+
+ protected function showAsUnpatrolled( RecentChange $rc ) {
+ $unpatrolled = false;
+ if ( !$rc->mAttribs['rc_patrolled'] ) {
+ if ( $this->getUser()->useRCPatrol() ) {
+ $unpatrolled = true;
+ } elseif ( $this->getUser()->useNPPatrol() && $rc->mAttribs['rc_type'] == RC_NEW ) {
+ $unpatrolled = true;
+ }
+ }
+ return $unpatrolled;
+ }
+}
diff --git a/includes/changes/EnhancedChangesList.php b/includes/changes/EnhancedChangesList.php
new file mode 100644
index 00000000..433adb37
--- /dev/null
+++ b/includes/changes/EnhancedChangesList.php
@@ -0,0 +1,662 @@
+<?php
+/**
+ * Generates a list of changes using an Enhanced system (uses javascript).
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with this program; if not, write 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 EnhancedChangesList extends ChangesList {
+
+ protected $rc_cache;
+
+ /**
+ * Add the JavaScript file for enhanced changeslist
+ * @return String
+ */
+ public function beginRecentChangesList() {
+ $this->rc_cache = array();
+ $this->rcMoveIndex = 0;
+ $this->rcCacheIndex = 0;
+ $this->lastdate = '';
+ $this->rclistOpen = false;
+ $this->getOutput()->addModuleStyles( array(
+ 'mediawiki.special.changeslist',
+ 'mediawiki.special.changeslist.enhanced',
+ ) );
+ $this->getOutput()->addModules( array(
+ 'jquery.makeCollapsible',
+ 'mediawiki.icon',
+ ) );
+ return '';
+ }
+ /**
+ * Format a line for enhanced recentchange (aka with javascript and block of lines).
+ *
+ * @param $baseRC RecentChange
+ * @param $watched bool
+ *
+ * @return string
+ */
+ public function recentChangesLine( &$baseRC, $watched = false ) {
+ wfProfileIn( __METHOD__ );
+
+ # Create a specialised object
+ $rc = RCCacheEntry::newFromParent( $baseRC );
+
+ $curIdEq = array( 'curid' => $rc->mAttribs['rc_cur_id'] );
+
+ # If it's a new day, add the headline and flush the cache
+ $date = $this->getLanguage()->userDate( $rc->mAttribs['rc_timestamp'], $this->getUser() );
+ $ret = '';
+ if ( $date != $this->lastdate ) {
+ # Process current cache
+ $ret = $this->recentChangesBlock();
+ $this->rc_cache = array();
+ $ret .= Xml::element( 'h4', null, $date ) . "\n";
+ $this->lastdate = $date;
+ }
+
+ # Should patrol-related stuff be shown?
+ $rc->unpatrolled = $this->showAsUnpatrolled( $rc );
+
+ $showdifflinks = true;
+ # Make article link
+ $type = $rc->mAttribs['rc_type'];
+ $logType = $rc->mAttribs['rc_log_type'];
+ // Page moves, very old style, not supported anymore
+ if ( $type == RC_MOVE || $type == RC_MOVE_OVER_REDIRECT ) {
+ // New unpatrolled pages
+ } elseif ( $rc->unpatrolled && $type == RC_NEW ) {
+ $clink = Linker::linkKnown( $rc->getTitle() );
+ // Log entries
+ } elseif ( $type == RC_LOG ) {
+ if ( $logType ) {
+ $logtitle = SpecialPage::getTitleFor( 'Log', $logType );
+ $logpage = new LogPage( $logType );
+ $logname = $logpage->getName()->escaped();
+ $clink = $this->msg( 'parentheses' )->rawParams( Linker::linkKnown( $logtitle, $logname ) )->escaped();
+ } else {
+ $clink = Linker::link( $rc->getTitle() );
+ }
+ $watched = false;
+ // Log entries (old format) and special pages
+ } elseif ( $rc->mAttribs['rc_namespace'] == NS_SPECIAL ) {
+ wfDebug( "Unexpected special page in recentchanges\n" );
+ $clink = '';
+ // Edits
+ } else {
+ $clink = Linker::linkKnown( $rc->getTitle() );
+ }
+
+ # Don't show unusable diff links
+ if ( !ChangesList::userCan( $rc, Revision::DELETED_TEXT, $this->getUser() ) ) {
+ $showdifflinks = false;
+ }
+
+ $time = $this->getLanguage()->userTime( $rc->mAttribs['rc_timestamp'], $this->getUser() );
+ $rc->watched = $watched;
+ $rc->link = $clink;
+ $rc->timestamp = $time;
+ $rc->numberofWatchingusers = $baseRC->numberofWatchingusers;
+
+ # Make "cur" and "diff" links. Do not use link(), it is too slow if
+ # called too many times (50% of CPU time on RecentChanges!).
+ $thisOldid = $rc->mAttribs['rc_this_oldid'];
+ $lastOldid = $rc->mAttribs['rc_last_oldid'];
+
+ $querycur = $curIdEq + array( 'diff' => '0', 'oldid' => $thisOldid );
+ $querydiff = $curIdEq + array( 'diff' => $thisOldid, 'oldid' => $lastOldid );
+
+ if ( !$showdifflinks ) {
+ $curLink = $this->message['cur'];
+ $diffLink = $this->message['diff'];
+ } elseif ( in_array( $type, array( RC_NEW, RC_LOG, RC_MOVE, RC_MOVE_OVER_REDIRECT ) ) ) {
+ if ( $type != RC_NEW ) {
+ $curLink = $this->message['cur'];
+ } else {
+ $curUrl = htmlspecialchars( $rc->getTitle()->getLinkURL( $querycur ) );
+ $curLink = "<a href=\"$curUrl\" tabindex=\"{$baseRC->counter}\">{$this->message['cur']}</a>";
+ }
+ $diffLink = $this->message['diff'];
+ } else {
+ $diffUrl = htmlspecialchars( $rc->getTitle()->getLinkURL( $querydiff ) );
+ $curUrl = htmlspecialchars( $rc->getTitle()->getLinkURL( $querycur ) );
+ $diffLink = "<a href=\"$diffUrl\" tabindex=\"{$baseRC->counter}\">{$this->message['diff']}</a>";
+ $curLink = "<a href=\"$curUrl\" tabindex=\"{$baseRC->counter}\">{$this->message['cur']}</a>";
+ }
+
+ # Make "last" link
+ if ( !$showdifflinks || !$lastOldid ) {
+ $lastLink = $this->message['last'];
+ } elseif ( in_array( $type, array( RC_LOG, RC_MOVE, RC_MOVE_OVER_REDIRECT ) ) ) {
+ $lastLink = $this->message['last'];
+ } else {
+ $lastLink = Linker::linkKnown( $rc->getTitle(), $this->message['last'],
+ array(), $curIdEq + array( 'diff' => $thisOldid, 'oldid' => $lastOldid ) );
+ }
+
+ # Make user links
+ if ( $this->isDeleted( $rc, Revision::DELETED_USER ) ) {
+ $rc->userlink = ' <span class="history-deleted">' . $this->msg( 'rev-deleted-user' )->escaped() . '</span>';
+ } else {
+ $rc->userlink = Linker::userLink( $rc->mAttribs['rc_user'], $rc->mAttribs['rc_user_text'] );
+ $rc->usertalklink = Linker::userToolLinks( $rc->mAttribs['rc_user'], $rc->mAttribs['rc_user_text'] );
+ }
+
+ $rc->lastlink = $lastLink;
+ $rc->curlink = $curLink;
+ $rc->difflink = $diffLink;
+
+ # Put accumulated information into the cache, for later display
+ # Page moves go on their own line
+ $title = $rc->getTitle();
+ $secureName = $title->getPrefixedDBkey();
+ if ( $type == RC_MOVE || $type == RC_MOVE_OVER_REDIRECT ) {
+ # Use an @ character to prevent collision with page names
+ $this->rc_cache['@@' . ( $this->rcMoveIndex++ )] = array( $rc );
+ } else {
+ # Logs are grouped by type
+ if ( $type == RC_LOG ) {
+ $secureName = SpecialPage::getTitleFor( 'Log', $logType )->getPrefixedDBkey();
+ }
+ if ( !isset( $this->rc_cache[$secureName] ) ) {
+ $this->rc_cache[$secureName] = array();
+ }
+
+ array_push( $this->rc_cache[$secureName], $rc );
+ }
+
+ wfProfileOut( __METHOD__ );
+
+ return $ret;
+ }
+
+ /**
+ * Enhanced RC group
+ * @return string
+ */
+ protected function recentChangesBlockGroup( $block ) {
+ global $wgRCShowChangedSize;
+
+ wfProfileIn( __METHOD__ );
+
+ # Add the namespace and title of the block as part of the class
+ $classes = array( 'mw-collapsible', 'mw-collapsed', 'mw-enhanced-rc' );
+ if ( $block[0]->mAttribs['rc_log_type'] ) {
+ # Log entry
+ $classes[] = Sanitizer::escapeClass( 'mw-changeslist-log-'
+ . $block[0]->mAttribs['rc_log_type'] . '-' . $block[0]->mAttribs['rc_title'] );
+ } else {
+ $classes[] = Sanitizer::escapeClass( 'mw-changeslist-ns'
+ . $block[0]->mAttribs['rc_namespace'] . '-' . $block[0]->mAttribs['rc_title'] );
+ }
+ $classes[] = $block[0]->watched && $block[0]->mAttribs['rc_timestamp'] >= $block[0]->watched
+ ? 'mw-changeslist-line-watched' : 'mw-changeslist-line-not-watched';
+ $r = Html::openElement( 'table', array( 'class' => $classes ) ) .
+ Html::openElement( 'tr' );
+
+ # Collate list of users
+ $userlinks = array();
+ # Other properties
+ $unpatrolled = false;
+ $isnew = false;
+ $allBots = true;
+ $allMinors = true;
+ $curId = $currentRevision = 0;
+ # Some catalyst variables...
+ $namehidden = true;
+ $allLogs = true;
+ foreach ( $block as $rcObj ) {
+ $oldid = $rcObj->mAttribs['rc_last_oldid'];
+ if ( $rcObj->mAttribs['rc_type'] == RC_NEW ) {
+ $isnew = true;
+ }
+ // If all log actions to this page were hidden, then don't
+ // give the name of the affected page for this block!
+ if ( !$this->isDeleted( $rcObj, LogPage::DELETED_ACTION ) ) {
+ $namehidden = false;
+ }
+ $u = $rcObj->userlink;
+ if ( !isset( $userlinks[$u] ) ) {
+ $userlinks[$u] = 0;
+ }
+ if ( $rcObj->unpatrolled ) {
+ $unpatrolled = true;
+ }
+ if ( $rcObj->mAttribs['rc_type'] != RC_LOG ) {
+ $allLogs = false;
+ }
+ # Get the latest entry with a page_id and oldid
+ # since logs may not have these.
+ if ( !$curId && $rcObj->mAttribs['rc_cur_id'] ) {
+ $curId = $rcObj->mAttribs['rc_cur_id'];
+ }
+ if ( !$currentRevision && $rcObj->mAttribs['rc_this_oldid'] ) {
+ $currentRevision = $rcObj->mAttribs['rc_this_oldid'];
+ }
+
+ if ( !$rcObj->mAttribs['rc_bot'] ) {
+ $allBots = false;
+ }
+ if ( !$rcObj->mAttribs['rc_minor'] ) {
+ $allMinors = false;
+ }
+
+ $userlinks[$u]++;
+ }
+
+ # Sort the list and convert to text
+ krsort( $userlinks );
+ asort( $userlinks );
+ $users = array();
+ foreach ( $userlinks as $userlink => $count ) {
+ $text = $userlink;
+ $text .= $this->getLanguage()->getDirMark();
+ if ( $count > 1 ) {
+ $text .= ' ' . $this->msg( 'parentheses' )->rawParams( $this->getLanguage()->formatNum( $count ) . '×' )->escaped();
+ }
+ array_push( $users, $text );
+ }
+
+ $users = ' <span class="changedby">'
+ . $this->msg( 'brackets' )->rawParams(
+ implode( $this->message['semicolon-separator'], $users )
+ )->escaped() . '</span>';
+
+ $tl = '<span class="mw-collapsible-toggle mw-collapsible-arrow mw-enhancedchanges-arrow mw-enhancedchanges-arrow-space"></span>';
+ $r .= "<td>$tl</td>";
+
+ # Main line
+ $r .= '<td class="mw-enhanced-rc">' . $this->recentChangesFlags( array(
+ 'newpage' => $isnew, # show, when one have this flag
+ 'minor' => $allMinors, # show only, when all have this flag
+ 'unpatrolled' => $unpatrolled, # show, when one have this flag
+ 'bot' => $allBots, # show only, when all have this flag
+ ) );
+
+ # Timestamp
+ $r .= '&#160;' . $block[0]->timestamp . '&#160;</td><td>';
+
+ # Article link
+ if ( $namehidden ) {
+ $r .= ' <span class="history-deleted">' . $this->msg( 'rev-deleted-event' )->escaped() . '</span>';
+ } elseif ( $allLogs ) {
+ $r .= $this->maybeWatchedLink( $block[0]->link, $block[0]->watched );
+ } else {
+ $this->insertArticleLink( $r, $block[0], $block[0]->unpatrolled, $block[0]->watched );
+ }
+
+ $r .= $this->getLanguage()->getDirMark();
+
+ $queryParams['curid'] = $curId;
+
+ # Changes message
+ static $nchanges = array();
+ static $sinceLastVisitMsg = array();
+
+ $n = count( $block );
+ if ( !isset( $nchanges[$n] ) ) {
+ $nchanges[$n] = $this->msg( 'nchanges' )->numParams( $n )->escaped();
+ }
+
+ $sinceLast = 0;
+ $unvisitedOldid = null;
+ foreach ( $block as $rcObj ) {
+ // Same logic as below inside main foreach
+ if ( $rcObj->watched && $rcObj->mAttribs['rc_timestamp'] >= $rcObj->watched ) {
+ $sinceLast++;
+ $unvisitedOldid = $rcObj->mAttribs['rc_last_oldid'];
+ }
+ }
+ if ( !isset( $sinceLastVisitMsg[$sinceLast] ) ) {
+ $sinceLastVisitMsg[$sinceLast] =
+ $this->msg( 'enhancedrc-since-last-visit' )->numParams( $sinceLast )->escaped();
+ }
+
+ # Total change link
+ $r .= ' ';
+ $logtext = '';
+ if ( !$allLogs ) {
+ if ( !ChangesList::userCan( $rcObj, Revision::DELETED_TEXT, $this->getUser() ) ) {
+ $logtext .= $nchanges[$n];
+ } elseif ( $isnew ) {
+ $logtext .= $nchanges[$n];
+ } else {
+ $logtext .= Linker::link(
+ $block[0]->getTitle(),
+ $nchanges[$n],
+ array(),
+ $queryParams + array(
+ 'diff' => $currentRevision,
+ 'oldid' => $oldid,
+ ),
+ array( 'known', 'noclasses' )
+ );
+ if ( $sinceLast > 0 && $sinceLast < $n ) {
+ $logtext .= $this->message['pipe-separator'] . Linker::link(
+ $block[0]->getTitle(),
+ $sinceLastVisitMsg[$sinceLast],
+ array(),
+ $queryParams + array(
+ 'diff' => $currentRevision,
+ 'oldid' => $unvisitedOldid,
+ ),
+ array( 'known', 'noclasses' )
+ );
+ }
+ }
+ }
+
+ # History
+ if ( $allLogs ) {
+ // don't show history link for logs
+ } elseif ( $namehidden || !$block[0]->getTitle()->exists() ) {
+ $logtext .= $this->message['pipe-separator'] . $this->message['enhancedrc-history'];
+ } else {
+ $params = $queryParams;
+ $params['action'] = 'history';
+
+ $logtext .= $this->message['pipe-separator'] .
+ Linker::linkKnown(
+ $block[0]->getTitle(),
+ $this->message['enhancedrc-history'],
+ array(),
+ $params
+ );
+ }
+
+ if ( $logtext !== '' ) {
+ $r .= $this->msg( 'parentheses' )->rawParams( $logtext )->escaped();
+ }
+
+ $r .= ' <span class="mw-changeslist-separator">. .</span> ';
+
+ # Character difference (does not apply if only log items)
+ if ( $wgRCShowChangedSize && !$allLogs ) {
+ $last = 0;
+ $first = count( $block ) - 1;
+ # Some events (like logs) have an "empty" size, so we need to skip those...
+ while ( $last < $first && $block[$last]->mAttribs['rc_new_len'] === null ) {
+ $last++;
+ }
+ while ( $first > $last && $block[$first]->mAttribs['rc_old_len'] === null ) {
+ $first--;
+ }
+ # Get net change
+ $chardiff = $this->formatCharacterDifference( $block[$first], $block[$last] );
+
+ if ( $chardiff == '' ) {
+ $r .= ' ';
+ } else {
+ $r .= ' ' . $chardiff . ' <span class="mw-changeslist-separator">. .</span> ';
+ }
+ }
+
+ $r .= $users;
+ $r .= $this->numberofWatchingusers( $block[0]->numberofWatchingusers );
+
+ # Sub-entries
+ foreach ( $block as $rcObj ) {
+ # Classes to apply -- TODO implement
+ $classes = array();
+ $type = $rcObj->mAttribs['rc_type'];
+
+ $trClass = $rcObj->watched && $rcObj->mAttribs['rc_timestamp'] >= $rcObj->watched
+ ? ' class="mw-enhanced-watched"' : '';
+
+ $r .= '<tr' . $trClass . '><td></td><td class="mw-enhanced-rc">';
+ $r .= $this->recentChangesFlags( array(
+ 'newpage' => $type == RC_NEW,
+ 'minor' => $rcObj->mAttribs['rc_minor'],
+ 'unpatrolled' => $rcObj->unpatrolled,
+ 'bot' => $rcObj->mAttribs['rc_bot'],
+ ) );
+ $r .= '&#160;</td><td class="mw-enhanced-rc-nested"><span class="mw-enhanced-rc-time">';
+
+ $params = $queryParams;
+
+ if ( $rcObj->mAttribs['rc_this_oldid'] != 0 ) {
+ $params['oldid'] = $rcObj->mAttribs['rc_this_oldid'];
+ }
+
+ # Log timestamp
+ if ( $type == RC_LOG ) {
+ $link = $rcObj->timestamp;
+ # Revision link
+ } elseif ( !ChangesList::userCan( $rcObj, Revision::DELETED_TEXT, $this->getUser() ) ) {
+ $link = '<span class="history-deleted">' . $rcObj->timestamp . '</span> ';
+ } else {
+
+ $link = Linker::linkKnown(
+ $rcObj->getTitle(),
+ $rcObj->timestamp,
+ array(),
+ $params
+ );
+ if ( $this->isDeleted( $rcObj, Revision::DELETED_TEXT ) ) {
+ $link = '<span class="history-deleted">' . $link . '</span> ';
+ }
+ }
+ $r .= $link . '</span>';
+
+ if ( !$type == RC_LOG || $type == RC_NEW ) {
+ $r .= ' ' . $this->msg( 'parentheses' )->rawParams( $rcObj->curlink . $this->message['pipe-separator'] . $rcObj->lastlink )->escaped();
+ }
+ $r .= ' <span class="mw-changeslist-separator">. .</span> ';
+
+ # Character diff
+ if ( $wgRCShowChangedSize ) {
+ $cd = $this->formatCharacterDifference( $rcObj );
+ if ( $cd !== '' ) {
+ $r .= $cd . ' <span class="mw-changeslist-separator">. .</span> ';
+ }
+ }
+
+ if ( $rcObj->mAttribs['rc_type'] == RC_LOG ) {
+ $r .= $this->insertLogEntry( $rcObj );
+ } else {
+ # User links
+ $r .= $rcObj->userlink;
+ $r .= $rcObj->usertalklink;
+ $r .= $this->insertComment( $rcObj );
+ }
+
+ # Rollback
+ $this->insertRollback( $r, $rcObj );
+ # Tags
+ $this->insertTags( $r, $rcObj, $classes );
+
+ $r .= "</td></tr>\n";
+ }
+ $r .= "</table>\n";
+
+ $this->rcCacheIndex++;
+
+ wfProfileOut( __METHOD__ );
+
+ return $r;
+ }
+
+ /**
+ * Generate HTML for an arrow or placeholder graphic
+ * @param string $dir one of '', 'd', 'l', 'r'
+ * @param string $alt text
+ * @param string $title text
+ * @return String: HTML "<img>" tag
+ */
+ protected function arrow( $dir, $alt = '', $title = '' ) {
+ global $wgStylePath;
+ $encUrl = htmlspecialchars( $wgStylePath . '/common/images/Arr_' . $dir . '.png' );
+ $encAlt = htmlspecialchars( $alt );
+ $encTitle = htmlspecialchars( $title );
+ return "<img src=\"$encUrl\" width=\"12\" height=\"12\" alt=\"$encAlt\" title=\"$encTitle\" />";
+ }
+
+ /**
+ * Generate HTML for a right- or left-facing arrow,
+ * depending on language direction.
+ * @return String: HTML "<img>" tag
+ */
+ protected function sideArrow() {
+ $dir = $this->getLanguage()->isRTL() ? 'l' : 'r';
+ return $this->arrow( $dir, '+', $this->msg( 'rc-enhanced-expand' )->text() );
+ }
+
+ /**
+ * Generate HTML for a down-facing arrow
+ * depending on language direction.
+ * @return String: HTML "<img>" tag
+ */
+ protected function downArrow() {
+ return $this->arrow( 'd', '-', $this->msg( 'rc-enhanced-hide' )->text() );
+ }
+
+ /**
+ * Generate HTML for a spacer image
+ * @return String: HTML "<img>" tag
+ */
+ protected function spacerArrow() {
+ return $this->arrow( '', codepointToUtf8( 0xa0 ) ); // non-breaking space
+ }
+
+ /**
+ * Enhanced RC ungrouped line.
+ *
+ * @param $rcObj RecentChange
+ * @return String: a HTML formatted line (generated using $r)
+ */
+ protected function recentChangesBlockLine( $rcObj ) {
+ global $wgRCShowChangedSize;
+
+ wfProfileIn( __METHOD__ );
+ $query['curid'] = $rcObj->mAttribs['rc_cur_id'];
+
+ $type = $rcObj->mAttribs['rc_type'];
+ $logType = $rcObj->mAttribs['rc_log_type'];
+ $classes = array( 'mw-enhanced-rc' );
+ if ( $logType ) {
+ # Log entry
+ $classes[] = Sanitizer::escapeClass( 'mw-changeslist-log-'
+ . $logType . '-' . $rcObj->mAttribs['rc_title'] );
+ } else {
+ $classes[] = Sanitizer::escapeClass( 'mw-changeslist-ns' .
+ $rcObj->mAttribs['rc_namespace'] . '-' . $rcObj->mAttribs['rc_title'] );
+ }
+ $classes[] = $rcObj->watched && $rcObj->mAttribs['rc_timestamp'] >= $rcObj->watched
+ ? 'mw-changeslist-line-watched' : 'mw-changeslist-line-not-watched';
+ $r = Html::openElement( 'table', array( 'class' => $classes ) ) .
+ Html::openElement( 'tr' );
+
+ $r .= '<td class="mw-enhanced-rc"><span class="mw-enhancedchanges-arrow-space"></span>';
+ # Flag and Timestamp
+ if ( $type == RC_MOVE || $type == RC_MOVE_OVER_REDIRECT ) {
+ $r .= $this->recentChangesFlags( array() ); // no flags, but need the placeholders
+ } else {
+ $r .= $this->recentChangesFlags( array(
+ 'newpage' => $type == RC_NEW,
+ 'minor' => $rcObj->mAttribs['rc_minor'],
+ 'unpatrolled' => $rcObj->unpatrolled,
+ 'bot' => $rcObj->mAttribs['rc_bot'],
+ ) );
+ }
+ $r .= '&#160;' . $rcObj->timestamp . '&#160;</td><td>';
+ # Article or log link
+ if ( $logType ) {
+ $logPage = new LogPage( $logType );
+ $logTitle = SpecialPage::getTitleFor( 'Log', $logType );
+ $logName = $logPage->getName()->escaped();
+ $r .= $this->msg( 'parentheses' )->rawParams( Linker::linkKnown( $logTitle, $logName ) )->escaped();
+ } else {
+ $this->insertArticleLink( $r, $rcObj, $rcObj->unpatrolled, $rcObj->watched );
+ }
+ # Diff and hist links
+ if ( $type != RC_LOG ) {
+ $query['action'] = 'history';
+ $r .= ' ' . $this->msg( 'parentheses' )->rawParams( $rcObj->difflink . $this->message['pipe-separator'] . Linker::linkKnown(
+ $rcObj->getTitle(),
+ $this->message['hist'],
+ array(),
+ $query
+ ) )->escaped();
+ }
+ $r .= ' <span class="mw-changeslist-separator">. .</span> ';
+ # Character diff
+ if ( $wgRCShowChangedSize ) {
+ $cd = $this->formatCharacterDifference( $rcObj );
+ if ( $cd !== '' ) {
+ $r .= $cd . ' <span class="mw-changeslist-separator">. .</span> ';
+ }
+ }
+
+ if ( $type == RC_LOG ) {
+ $r .= $this->insertLogEntry( $rcObj );
+ } else {
+ $r .= ' ' . $rcObj->userlink . $rcObj->usertalklink;
+ $r .= $this->insertComment( $rcObj );
+ $this->insertRollback( $r, $rcObj );
+ }
+
+ # Tags
+ $this->insertTags( $r, $rcObj, $classes );
+ # Show how many people are watching this if enabled
+ $r .= $this->numberofWatchingusers( $rcObj->numberofWatchingusers );
+
+ $r .= "</td></tr></table>\n";
+
+ wfProfileOut( __METHOD__ );
+
+ return $r;
+ }
+
+ /**
+ * If enhanced RC is in use, this function takes the previously cached
+ * RC lines, arranges them, and outputs the HTML
+ *
+ * @return string
+ */
+ protected function recentChangesBlock() {
+ if ( count ( $this->rc_cache ) == 0 ) {
+ return '';
+ }
+
+ wfProfileIn( __METHOD__ );
+
+ $blockOut = '';
+ foreach ( $this->rc_cache as $block ) {
+ if ( count( $block ) < 2 ) {
+ $blockOut .= $this->recentChangesBlockLine( array_shift( $block ) );
+ } else {
+ $blockOut .= $this->recentChangesBlockGroup( $block );
+ }
+ }
+
+ wfProfileOut( __METHOD__ );
+
+ return '<div>' . $blockOut . '</div>';
+ }
+
+ /**
+ * Returns text for the end of RC
+ * If enhanced RC is in use, returns pretty much all the text
+ * @return string
+ */
+ public function endRecentChangesList() {
+ return $this->recentChangesBlock() . parent::endRecentChangesList();
+ }
+
+}
diff --git a/includes/changes/OldChangesList.php b/includes/changes/OldChangesList.php
new file mode 100644
index 00000000..a7fe9342
--- /dev/null
+++ b/includes/changes/OldChangesList.php
@@ -0,0 +1,130 @@
+<?php
+/**
+ * Generate a list of changes using the good old system (no javascript).
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with this program; if not, write 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 OldChangesList extends ChangesList {
+
+ /**
+ * Format a line using the old system (aka without any javascript).
+ *
+ * @param $rc RecentChange, passed by reference
+ * @param bool $watched (default false)
+ * @param int $linenumber (default null)
+ *
+ * @return string|bool
+ */
+ public function recentChangesLine( &$rc, $watched = false, $linenumber = null ) {
+ global $wgRCShowChangedSize;
+ wfProfileIn( __METHOD__ );
+
+ # Should patrol-related stuff be shown?
+ $unpatrolled = $this->showAsUnpatrolled( $rc );
+
+ $dateheader = ''; // $s now contains only <li>...</li>, for hooks' convenience.
+ $this->insertDateHeader( $dateheader, $rc->mAttribs['rc_timestamp'] );
+
+ $s = '';
+ $classes = array();
+ // use mw-line-even/mw-line-odd class only if linenumber is given (feature from bug 14468)
+ if ( $linenumber ) {
+ if ( $linenumber & 1 ) {
+ $classes[] = 'mw-line-odd';
+ } else {
+ $classes[] = 'mw-line-even';
+ }
+ }
+
+ // Indicate watched status on the line to allow for more
+ // comprehensive styling.
+ $classes[] = $watched && $rc->mAttribs['rc_timestamp'] >= $watched
+ ? 'mw-changeslist-line-watched' : 'mw-changeslist-line-not-watched';
+
+ // Moved pages (very very old, not supported anymore)
+ if ( $rc->mAttribs['rc_type'] == RC_MOVE || $rc->mAttribs['rc_type'] == RC_MOVE_OVER_REDIRECT ) {
+ // Log entries
+ } elseif ( $rc->mAttribs['rc_log_type'] ) {
+ $logtitle = SpecialPage::getTitleFor( 'Log', $rc->mAttribs['rc_log_type'] );
+ $this->insertLog( $s, $logtitle, $rc->mAttribs['rc_log_type'] );
+ // Log entries (old format) or log targets, and special pages
+ } elseif ( $rc->mAttribs['rc_namespace'] == NS_SPECIAL ) {
+ list( $name, $subpage ) = SpecialPageFactory::resolveAlias( $rc->mAttribs['rc_title'] );
+ if ( $name == 'Log' ) {
+ $this->insertLog( $s, $rc->getTitle(), $subpage );
+ }
+ // Regular entries
+ } else {
+ $this->insertDiffHist( $s, $rc, $unpatrolled );
+ # M, N, b and ! (minor, new, bot and unpatrolled)
+ $s .= $this->recentChangesFlags(
+ array(
+ 'newpage' => $rc->mAttribs['rc_type'] == RC_NEW,
+ 'minor' => $rc->mAttribs['rc_minor'],
+ 'unpatrolled' => $unpatrolled,
+ 'bot' => $rc->mAttribs['rc_bot']
+ ),
+ ''
+ );
+ $this->insertArticleLink( $s, $rc, $unpatrolled, $watched );
+ }
+ # Edit/log timestamp
+ $this->insertTimestamp( $s, $rc );
+ # Bytes added or removed
+ if ( $wgRCShowChangedSize ) {
+ $cd = $this->formatCharacterDifference( $rc );
+ if ( $cd !== '' ) {
+ $s .= $cd . ' <span class="mw-changeslist-separator">. .</span> ';
+ }
+ }
+
+ if ( $rc->mAttribs['rc_type'] == RC_LOG ) {
+ $s .= $this->insertLogEntry( $rc );
+ } else {
+ # User tool links
+ $this->insertUserRelatedLinks( $s, $rc );
+ # LTR/RTL direction mark
+ $s .= $this->getLanguage()->getDirMark();
+ $s .= $this->insertComment( $rc );
+ }
+
+ # Tags
+ $this->insertTags( $s, $rc, $classes );
+ # Rollback
+ $this->insertRollback( $s, $rc );
+ # For subclasses
+ $this->insertExtra( $s, $rc, $classes );
+
+ # How many users watch this page
+ if ( $rc->numberofWatchingusers > 0 ) {
+ $s .= ' ' . $this->numberofWatchingusers( $rc->numberofWatchingusers );
+ }
+
+ if ( $this->watchlist ) {
+ $classes[] = Sanitizer::escapeClass( 'watchlist-' . $rc->mAttribs['rc_namespace'] . '-' . $rc->mAttribs['rc_title'] );
+ }
+
+ if ( !wfRunHooks( 'OldChangesListRecentChangesLine', array( &$this, &$s, $rc, &$classes ) ) ) {
+ wfProfileOut( __METHOD__ );
+ return false;
+ }
+
+ wfProfileOut( __METHOD__ );
+ return "$dateheader<li class=\"" . implode( ' ', $classes ) . "\">" . $s . "</li>\n";
+ }
+}
diff --git a/redirect.php5 b/includes/changes/RCCacheEntry.php
index b65f69aa..9aef3d30 100644
--- a/redirect.php5
+++ b/includes/changes/RCCacheEntry.php
@@ -1,8 +1,5 @@
<?php
/**
- * Version of redirect.php to used in web server requiring .php5 extension
- * to execute scripts with PHP5 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
@@ -20,5 +17,19 @@
*
* @file
*/
+class RCCacheEntry extends RecentChange {
+ var $secureName, $link;
+ var $curlink, $difflink, $lastlink, $usertalklink, $versionlink;
+ var $userlink, $timestamp, $watched;
-require './redirect.php';
+ /**
+ * @param $rc RecentChange
+ * @return RCCacheEntry
+ */
+ static function newFromParent( $rc ) {
+ $rc2 = new RCCacheEntry;
+ $rc2->mAttribs = $rc->mAttribs;
+ $rc2->mExtra = $rc->mExtra;
+ return $rc2;
+ }
+}
diff --git a/includes/RecentChange.php b/includes/changes/RecentChange.php
index d7cf995c..980bd0a0 100644
--- a/includes/RecentChange.php
+++ b/includes/changes/RecentChange.php
@@ -96,10 +96,12 @@ class RecentChange {
}
/**
+ * @deprecated in 1.22
* @param $row
* @return RecentChange
*/
public static function newFromCurRow( $row ) {
+ wfDeprecated( __METHOD__, '1.22' );
$rc = new RecentChange;
$rc->loadFromCurRow( $row );
$rc->notificationtimestamp = false;
@@ -122,11 +124,12 @@ class RecentChange {
*
* @param array $conds of conditions
* @param $fname Mixed: override the method name in profiling/logs
+ * @param $options Array Query options
* @return RecentChange
*/
- public static function newFromConds( $conds, $fname = __METHOD__ ) {
+ public static function newFromConds( $conds, $fname = __METHOD__, $options = array() ) {
$dbr = wfGetDB( DB_SLAVE );
- $row = $dbr->selectRow( 'recentchanges', self::selectFields(), $conds, $fname );
+ $row = $dbr->selectRow( 'recentchanges', self::selectFields(), $conds, $fname, $options );
if ( $row !== false ) {
return self::newFromRow( $row );
} else {
@@ -260,7 +263,7 @@ class RecentChange {
# Notify external application via UDP
if ( !$noudp ) {
- $this->notifyRC2UDP();
+ $this->notifyRCFeeds();
}
# E-mail notifications
@@ -281,52 +284,96 @@ class RecentChange {
}
}
+ /**
+ * @deprecated since 1.22, use notifyRCFeeds instead.
+ */
public function notifyRC2UDP() {
- global $wgRC2UDPAddress, $wgRC2UDPOmitBots;
- # Notify external application via UDP
- if ( $wgRC2UDPAddress && ( !$this->mAttribs['rc_bot'] || !$wgRC2UDPOmitBots ) ) {
- self::sendToUDP( $this->getIRCLine() );
- }
+ wfDeprecated( __METHOD__, '1.22' );
+ $this->notifyRCFeeds();
}
/**
* Send some text to UDP.
- * @see RecentChange::cleanupForIRC
- * @param string $line text to send
- * @param string $address defaults to $wgRC2UDPAddress.
- * @param string $prefix defaults to $wgRC2UDPPrefix.
- * @param int $port defaults to $wgRC2UDPPort. (Since 1.17)
- * @return Boolean: success
+ * @deprecated since 1.22
*/
public static function sendToUDP( $line, $address = '', $prefix = '', $port = '' ) {
- global $wgRC2UDPAddress, $wgRC2UDPPrefix, $wgRC2UDPPort;
+ global $wgRC2UDPAddress, $wgRC2UDPInterwikiPrefix, $wgRC2UDPPort, $wgRC2UDPPrefix;
+
+ wfDeprecated( __METHOD__, '1.22' );
+
# 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, $port );
- socket_close( $conn );
- return true;
+
+ $engine = new UDPRCFeedEngine();
+ $feed = array(
+ 'uri' => "udp://$address:$port/$prefix",
+ 'formatter' => 'IRCColourfulRCFeedFormatter',
+ 'add_interwiki_prefix' => $wgRC2UDPInterwikiPrefix,
+ );
+
+ return $engine->send( $feed, $line );
+ }
+
+ /**
+ * Notify all the feeds about the change.
+ */
+ public function notifyRCFeeds() {
+ global $wgRCFeeds;
+
+ foreach ( $wgRCFeeds as $feed ) {
+ $engine = self::getEngine( $feed['uri'] );
+
+ if ( isset( $this->mExtra['actionCommentIRC'] ) ) {
+ $actionComment = $this->mExtra['actionCommentIRC'];
} else {
- wfDebug( __METHOD__ . ": failed to create UDP socket\n" );
+ $actionComment = null;
+ }
+
+ $omitBots = isset( $feed['omit_bots'] ) ? $feed['omit_bots'] : false;
+
+ if (
+ ( $omitBots && $this->mAttribs['rc_bot'] ) ||
+ $this->mAttribs['rc_type'] == RC_EXTERNAL
+ ) {
+ continue;
}
+
+ $formatter = new $feed['formatter']();
+ $line = $formatter->getLine( $feed, $this, $actionComment );
+
+ $engine->send( $feed, $line );
+ }
+ }
+
+ /**
+ * Gets the stream engine object for a given URI from $wgRCEngines
+ *
+ * @param $uri string URI to get the engine object for
+ * @return object The engine object
+ */
+ private static function getEngine( $uri ) {
+ global $wgRCEngines;
+
+ $scheme = parse_url( $uri, PHP_URL_SCHEME );
+ if ( !$scheme ) {
+ throw new MWException( __FUNCTION__ . ": Invalid stream logger URI: '$uri'" );
}
- return false;
+
+ if ( !isset( $wgRCEngines[$scheme] ) ) {
+ throw new MWException( __FUNCTION__ . ": Unknown stream logger URI scheme: $scheme" );
+ }
+
+ return new $wgRCEngines[$scheme];
}
/**
- * Remove newlines, carriage returns and decode html entities
- * @param $text String
- * @return String
+ * @deprecated since 1.22, moved to IRCColourfulRCFeedFormatter
*/
public static function cleanupForIRC( $text ) {
- return Sanitizer::decodeCharReferences( str_replace( array( "\n", "\r" ), array( "", "" ), $text ) );
+ wfDeprecated( __METHOD__, '1.22' );
+ return IRCColourfulRCFeedFormatter::cleanupForIRC( $text );
}
/**
@@ -407,6 +454,9 @@ class RecentChange {
),
__METHOD__
);
+ // Invalidate the page cache after the page has been patrolled
+ // to make sure that the Patrol link isn't visible any longer!
+ $this->getTitle()->invalidateCache();
return $dbw->affectedRows();
}
@@ -651,9 +701,11 @@ class RecentChange {
/**
* Makes a pseudo-RC entry from a cur row
*
+ * @deprected in 1.22
* @param $row
*/
public function loadFromCurRow( $row ) {
+ wfDeprecated( __METHOD__, '1.22' );
$this->mAttribs = array(
'rc_timestamp' => wfTimestamp( TS_MW, $row->rev_timestamp ),
'rc_cur_time' => $row->rev_timestamp,
@@ -721,89 +773,6 @@ class RecentChange {
}
/**
- * @return string
- */
- public function getIRCLine() {
- global $wgUseRCPatrol, $wgUseNPPatrol, $wgRC2UDPInterwikiPrefix, $wgLocalInterwiki,
- $wgCanonicalServer, $wgScript;
-
- if ( $this->mAttribs['rc_type'] == RC_LOG ) {
- // Don't use SpecialPage::getTitleFor, backwards compatibility with
- // IRC API which expects "Log".
- $titleObj = Title::newFromText( 'Log/' . $this->mAttribs['rc_log_type'], NS_SPECIAL );
- } else {
- $titleObj =& $this->getTitle();
- }
- $title = $titleObj->getPrefixedText();
- $title = self::cleanupForIRC( $title );
-
- if ( $this->mAttribs['rc_type'] == RC_LOG ) {
- $url = '';
- } else {
- $url = $wgCanonicalServer . $wgScript;
- if ( $this->mAttribs['rc_type'] == RC_NEW ) {
- $query = '?oldid=' . $this->mAttribs['rc_this_oldid'];
- } else {
- $query = '?diff=' . $this->mAttribs['rc_this_oldid'] . '&oldid=' . $this->mAttribs['rc_last_oldid'];
- }
- if ( $wgUseRCPatrol || ( $this->mAttribs['rc_type'] == RC_NEW && $wgUseNPPatrol ) ) {
- $query .= '&rcid=' . $this->mAttribs['rc_id'];
- }
- // HACK: We need this hook for WMF's secure server setup
- wfRunHooks( 'IRCLineURL', array( &$url, &$query ) );
- $url .= $query;
- }
-
- if ( $this->mAttribs['rc_old_len'] !== null && $this->mAttribs['rc_new_len'] !== null ) {
- $szdiff = $this->mAttribs['rc_new_len'] - $this->mAttribs['rc_old_len'];
- if ( $szdiff < -500 ) {
- $szdiff = "\002$szdiff\002";
- } elseif ( $szdiff >= 0 ) {
- $szdiff = '+' . $szdiff;
- }
- // @todo i18n with parentheses in content language?
- $szdiff = '(' . $szdiff . ')';
- } else {
- $szdiff = '';
- }
-
- $user = self::cleanupForIRC( $this->mAttribs['rc_user_text'] );
-
- if ( $this->mAttribs['rc_type'] == RC_LOG ) {
- $targetText = $this->getTitle()->getPrefixedText();
- $comment = self::cleanupForIRC( str_replace( "[[$targetText]]", "[[\00302$targetText\00310]]", $this->mExtra['actionCommentIRC'] ) );
- $flag = $this->mAttribs['rc_log_action'];
- } else {
- $comment = self::cleanupForIRC( $this->mAttribs['rc_comment'] );
- $flag = '';
- if ( !$this->mAttribs['rc_patrolled'] && ( $wgUseRCPatrol || $this->mAttribs['rc_type'] == RC_NEW && $wgUseNPPatrol ) ) {
- $flag .= '!';
- }
- $flag .= ( $this->mAttribs['rc_type'] == RC_NEW ? "N" : "" ) . ( $this->mAttribs['rc_minor'] ? "M" : "" ) . ( $this->mAttribs['rc_bot'] ? "B" : "" );
- }
-
- if ( $wgRC2UDPInterwikiPrefix === true && $wgLocalInterwiki !== false ) {
- $prefix = $wgLocalInterwiki;
- } elseif ( $wgRC2UDPInterwikiPrefix ) {
- $prefix = $wgRC2UDPInterwikiPrefix;
- } else {
- $prefix = false;
- }
- if ( $prefix !== false ) {
- $titleString = "\00314[[\00303$prefix:\00307$title\00314]]";
- } else {
- $titleString = "\00314[[\00307$title\00314]]";
- }
-
- # see http://www.irssi.org/documentation/formats for some colour codes. prefix is \003,
- # no colour (\003) switches back to the term default
- $fullString = "$titleString\0034 $flag\00310 " .
- "\00302$url\003 \0035*\003 \00303$user\003 \0035*\003 $szdiff \00310$comment\003\n";
-
- return $fullString;
- }
-
- /**
* Returns the change size (HTML).
* The lengths can be given optionally.
* @param $old int
@@ -823,6 +792,29 @@ class RecentChange {
return ChangesList::showCharacterDifference( $old, $new );
}
+ /**
+ * Purge expired changes from the recentchanges table
+ * @since 1.22
+ */
+ public static function purgeExpiredChanges() {
+ if ( wfReadOnly() ) {
+ return;
+ }
+
+ $method = __METHOD__;
+ $dbw = wfGetDB( DB_MASTER );
+ $dbw->onTransactionIdle( function() use ( $dbw, $method ) {
+ global $wgRCMaxAge;
+
+ $cutoff = $dbw->timestamp( time() - $wgRCMaxAge );
+ $dbw->delete(
+ 'recentchanges',
+ array( 'rc_timestamp < ' . $dbw->addQuotes( $cutoff ) ),
+ $method
+ );
+ } );
+ }
+
private static function checkIPAddress( $ip ) {
global $wgRequest;
if ( $ip ) {
@@ -837,4 +829,18 @@ class RecentChange {
}
return $ip;
}
+
+ /**
+ * Check whether the given timestamp is new enough to have a RC row with a given tolerance
+ * as the recentchanges table might not be cleared out regularly (so older entries might exist)
+ * or rows which will be deleted soon shouldn't be included.
+ *
+ * @param $timestamp mixed MWTimestamp compatible timestamp
+ * @param $tolerance integer Tolerance in seconds
+ * @return bool
+ */
+ public static function isInRCLifespan( $timestamp, $tolerance = 0 ) {
+ global $wgRCMaxAge;
+ return wfTimestamp( TS_UNIX, $timestamp ) > time() - $tolerance - $wgRCMaxAge;
+ }
}
diff --git a/includes/clientpool/RedisConnectionPool.php b/includes/clientpool/RedisConnectionPool.php
index 5c7c4f20..ef71b182 100644
--- a/includes/clientpool/RedisConnectionPool.php
+++ b/includes/clientpool/RedisConnectionPool.php
@@ -1,6 +1,6 @@
<?php
/**
- * PhpRedis client connection pooling manager.
+ * Redis client connection pooling manager.
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
@@ -23,7 +23,7 @@
*/
/**
- * Helper class to manage redis connections using PhpRedis.
+ * Helper class to manage Redis connections.
*
* This can be used to get handle wrappers that free the handle when the wrapper
* leaves scope. The maximum number of free handles (connections) is configurable.
@@ -36,39 +36,43 @@
* @since 1.21
*/
class RedisConnectionPool {
- // Settings for all connections in this pool
- protected $connectTimeout; // string; connection timeout
- protected $persistent; // bool; whether connections persist
- protected $password; // string; plaintext auth password
- protected $serializer; // integer; the serializer to use (Redis::SERIALIZER_*)
+ /**
+ * @name Pool settings.
+ * Settings there are shared for any connection made in this pool.
+ * See the singleton() method documentation for more details.
+ * @{
+ */
+ /** @var string Connection timeout in seconds */
+ protected $connectTimeout;
+ /** @var string Plaintext auth password */
+ protected $password;
+ /** @var bool Whether connections persist */
+ protected $persistent;
+ /** @var integer Serializer to use (Redis::SERIALIZER_*) */
+ protected $serializer;
+ /** @} */
- protected $idlePoolSize = 0; // integer; current idle pool size
+ /** @var integer Current idle pool size */
+ protected $idlePoolSize = 0;
/** @var Array (server name => ((connection info array),...) */
protected $connections = array();
/** @var Array (server name => UNIX timestamp) */
protected $downServers = array();
- /** @var Array */
- protected static $instances = array(); // (pool ID => RedisConnectionPool)
+ /** @var Array (pool ID => RedisConnectionPool) */
+ protected static $instances = array();
- const SERVER_DOWN_TTL = 30; // integer; seconds to cache servers as "down"
+ /** integer; seconds to cache servers as "down". */
+ const SERVER_DOWN_TTL = 30;
/**
- * $options include:
- * - connectTimeout : The timeout for new connections, in seconds.
- * Optional, default is 1 second.
- * - persistent : Set this to true to allow connections to persist across
- * multiple web requests. False by default.
- * - password : The authentication password, will be sent to Redis in clear text.
- * Optional, if it is unspecified, no AUTH command will be sent.
- * - serializer : Set to "php", "igbinary", or "none". Default is "php".
* @param array $options
*/
protected function __construct( array $options ) {
- if ( !extension_loaded( 'redis' ) ) {
- throw new MWException( __CLASS__. ' requires the phpredis extension: ' .
- 'https://github.com/nicolasff/phpredis' );
+ if ( !class_exists( 'Redis' ) ) {
+ throw new MWException( __CLASS__ . ' requires a Redis client library. ' .
+ 'See https://www.mediawiki.org/wiki/Redis#Setup' );
}
$this->connectTimeout = $options['connectTimeout'];
$this->persistent = $options['persistent'];
@@ -103,6 +107,14 @@ class RedisConnectionPool {
/**
* @param $options Array
+ * $options include:
+ * - connectTimeout : The timeout for new connections, in seconds.
+ * Optional, default is 1 second.
+ * - persistent : Set this to true to allow connections to persist across
+ * multiple web requests. False by default.
+ * - password : The authentication password, will be sent to Redis in clear text.
+ * Optional, if it is unspecified, no AUTH command will be sent.
+ * - serializer : Set to "php", "igbinary", or "none". Default is "php".
* @return RedisConnectionPool
*/
public static function singleton( array $options ) {
@@ -164,7 +176,7 @@ class RedisConnectionPool {
// TCP connection
$hostPort = IP::splitHostAndPort( $server );
if ( !$hostPort ) {
- throw new MWException( __CLASS__.": invalid configured server \"$server\"" );
+ throw new MWException( __CLASS__ . ": invalid configured server \"$server\"" );
}
list( $host, $port ) = $hostPort;
if ( $port === false ) {
@@ -302,6 +314,38 @@ class RedisConnRef {
return call_user_func_array( array( $this->conn, $name ), $arguments );
}
+ /**
+ * @param string $script
+ * @param array $params
+ * @param integer $numKeys
+ * @return mixed
+ * @throws RedisException
+ */
+ public function luaEval( $script, array $params, $numKeys ) {
+ $sha1 = sha1( $script ); // 40 char hex
+ $conn = $this->conn; // convenience
+
+ // Try to run the server-side cached copy of the script
+ $conn->clearLastError();
+ $res = $conn->evalSha( $sha1, $params, $numKeys );
+ // If the script is not in cache, use eval() to retry and cache it
+ if ( preg_match( '/^NOSCRIPT/', $conn->getLastError() ) ) {
+ $conn->clearLastError();
+ $res = $conn->eval( $script, $params, $numKeys );
+ wfDebugLog( 'redis', "Used eval() for Lua script $sha1." );
+ }
+
+ if ( $conn->getLastError() ) { // script bug?
+ wfDebugLog( 'redis', "Lua script error: " . $conn->getLastError() );
+ }
+
+ return $res;
+ }
+
+ /**
+ * @param RedisConnRef $conn
+ * @return bool
+ */
public function isConnIdentical( Redis $conn ) {
return $this->conn === $conn;
}
diff --git a/includes/content/Content.php b/includes/content/Content.php
index 72729b09..5a90e092 100644
--- a/includes/content/Content.php
+++ b/includes/content/Content.php
@@ -40,8 +40,8 @@ interface Content {
* building a full text search index. If no useful representation exists,
* this method returns an empty string.
*
- * @todo: test that this actually works
- * @todo: make sure this also works with LuceneSearch / WikiSearch
+ * @todo Test that this actually works
+ * @todo Make sure this also works with LuceneSearch / WikiSearch
*/
public function getTextForSearchIndex();
@@ -51,11 +51,11 @@ interface Content {
* @return string|false The wikitext to include when another page includes this
* content, or false if the content is not includable in a wikitext page.
*
- * @todo allow native handling, bypassing wikitext representation, like
- * for includable special pages.
- * @todo allow transclusion into other content models than Wikitext!
- * @todo used in WikiPage and MessageCache to get message text. Not so
- * nice. What should we use instead?!
+ * @todo Allow native handling, bypassing wikitext representation, like
+ * for includable special pages.
+ * @todo Allow transclusion into other content models than Wikitext!
+ * @todo Used in WikiPage and MessageCache to get message text. Not so
+ * nice. What should we use instead?!
*/
public function getWikitextForTransclusion();
diff --git a/includes/content/ContentHandler.php b/includes/content/ContentHandler.php
index 9c201955..2a92e233 100644
--- a/includes/content/ContentHandler.php
+++ b/includes/content/ContentHandler.php
@@ -319,7 +319,7 @@ abstract class ContentHandler {
wfRunHooks( 'ContentHandlerForModelID', array( $modelId, &$handler ) );
if ( $handler === null ) {
- throw new MWException( "No handler for model '$modelId'' registered in \$wgContentHandlers" );
+ throw new MWException( "No handler for model '$modelId' registered in \$wgContentHandlers" );
}
if ( !( $handler instanceof ContentHandler ) ) {
@@ -449,10 +449,11 @@ abstract class ContentHandler {
* @since 1.21
*
* @param Title $destination the page to redirect to.
+ * @param string $text text to include in the redirect, if possible.
*
* @return Content
*/
- public function makeRedirectContent( Title $destination ) {
+ public function makeRedirectContent( Title $destination, $text = '' ) {
return null;
}
@@ -937,7 +938,7 @@ abstract class ContentHandler {
* @return ParserOptions
*/
public function makeParserOptions( $context ) {
- global $wgContLang;
+ global $wgContLang, $wgEnableParserLimitReporting;
if ( $context instanceof IContextSource ) {
$options = ParserOptions::newFromContext( $context );
@@ -949,7 +950,7 @@ abstract class ContentHandler {
throw new MWException( "Bad context for parser options: $context" );
}
- $options->enableLimitReport(); // show inclusion/loop reports
+ $options->enableLimitReport( $wgEnableParserLimitReporting ); // show inclusion/loop reports
$options->setTidy( true ); // fix bad HTML
return $options;
@@ -1060,7 +1061,7 @@ abstract class ContentHandler {
if ( isset( $handler[1] ) ) {
$info .= '::' . $handler[1];
}
- } else if ( is_object( $handler ) ) {
+ } elseif ( is_object( $handler ) ) {
$info = get_class( $handler[0] );
$info .= '::on' . $event;
} else {
@@ -1086,8 +1087,8 @@ abstract class ContentHandler {
$contentObjects[$k] = $v;
$v = $v->serialize();
- $contentTexts[ $k ] = $v;
- $args[ $k ] = $v;
+ $contentTexts[$k] = $v;
+ $args[$k] = $v;
}
}
@@ -1098,7 +1099,7 @@ abstract class ContentHandler {
foreach ( $contentTexts as $k => $orig ) {
/* @var Content $content */
- $modified = $args[ $k ];
+ $modified = $args[$k];
$content = $contentObjects[$k];
if ( $modified !== $orig ) {
@@ -1106,7 +1107,7 @@ abstract class ContentHandler {
$content = $content->getContentHandler()->unserializeContent( $modified );
}
- $args[ $k ] = $content;
+ $args[$k] = $content;
}
return $ok;
diff --git a/includes/content/CssContent.php b/includes/content/CssContent.php
index 569d122d..03cc2d00 100644
--- a/includes/content/CssContent.php
+++ b/includes/content/CssContent.php
@@ -46,7 +46,7 @@ class CssContent extends TextContent {
*/
public function preSaveTransform( Title $title, User $user, ParserOptions $popts ) {
global $wgParser;
- // @todo: make pre-save transformation optional for script pages
+ // @todo Make pre-save transformation optional for script pages
$text = $this->getNativeData();
$pst = $wgParser->preSaveTransform( $text, $title, $user, $popts );
diff --git a/includes/content/JavaScriptContent.php b/includes/content/JavaScriptContent.php
index 9cd947f9..2ae572be 100644
--- a/includes/content/JavaScriptContent.php
+++ b/includes/content/JavaScriptContent.php
@@ -46,7 +46,7 @@ class JavaScriptContent extends TextContent {
*/
public function preSaveTransform( Title $title, User $user, ParserOptions $popts ) {
global $wgParser;
- // @todo: make pre-save transformation optional for script pages
+ // @todo Make pre-save transformation optional for script pages
// See bug #32858
$text = $this->getNativeData();
diff --git a/includes/content/TextContent.php b/includes/content/TextContent.php
index 8fafcb63..f66dacd7 100644
--- a/includes/content/TextContent.php
+++ b/includes/content/TextContent.php
@@ -171,7 +171,7 @@ class TextContent extends AbstractContent {
$this->checkModelID( $that->getModel() );
- # @todo: could implement this in DifferenceEngine and just delegate here?
+ // @todo could implement this in DifferenceEngine and just delegate here?
if ( !$lang ) {
$lang = $wgContLang;
diff --git a/includes/content/WikitextContent.php b/includes/content/WikitextContent.php
index 8be4ebab..26337db9 100644
--- a/includes/content/WikitextContent.php
+++ b/includes/content/WikitextContent.php
@@ -61,7 +61,8 @@ class WikitextContent extends TextContent {
$myModelId = $this->getModel();
$sectionModelId = $with->getModel();
- if ( $sectionModelId != $myModelId ) {
+ if ( $sectionModelId != $myModelId ) {
+ wfProfileOut( __METHOD__ );
throw new MWException( "Incompatible content model for section: " .
"document uses $myModelId but " .
"section uses $sectionModelId." );
diff --git a/includes/content/WikitextContentHandler.php b/includes/content/WikitextContentHandler.php
index e1dcc668..b1b461fb 100644
--- a/includes/content/WikitextContentHandler.php
+++ b/includes/content/WikitextContentHandler.php
@@ -55,12 +55,27 @@ class WikitextContentHandler extends TextContentHandler {
* @see ContentHandler::makeRedirectContent
*
* @param Title $destination the page to redirect to.
+ * @param string $text text to include in the redirect, if possible.
*
* @return Content
*/
- public function makeRedirectContent( Title $destination ) {
+ public function makeRedirectContent( Title $destination, $text = '' ) {
+ $optionalColon = '';
+
+ if ( $destination->getNamespace() == NS_CATEGORY ) {
+ $optionalColon = ':';
+ } else {
+ $iw = $destination->getInterwiki();
+ if ( $iw && Language::fetchLanguageName( $iw, null, 'mw' ) ) {
+ $optionalColon = ':';
+ }
+ }
+
$mwRedir = MagicWord::get( 'redirect' );
- $redirectText = $mwRedir->getSynonym( 0 ) . ' [[' . $destination->getPrefixedText() . ']]';
+ $redirectText = $mwRedir->getSynonym( 0 ) . ' [[' . $optionalColon . $destination->getFullText() . ']]';
+ if ( $text != '' ) {
+ $redirectText .= "\n" . $text;
+ }
return new WikitextContent( $redirectText );
}
diff --git a/includes/context/ContextSource.php b/includes/context/ContextSource.php
index 33f51cb9..e13cfa88 100644
--- a/includes/context/ContextSource.php
+++ b/includes/context/ContextSource.php
@@ -125,7 +125,7 @@ abstract class ContextSource implements IContextSource {
/**
* Get the Language object
*
- * @deprecated 1.19 Use getLanguage instead
+ * @deprecated since 1.19 Use getLanguage instead
* @return Language
*/
public function getLang() {
diff --git a/includes/context/DerivativeContext.php b/includes/context/DerivativeContext.php
index b9a70068..fd9bf963 100644
--- a/includes/context/DerivativeContext.php
+++ b/includes/context/DerivativeContext.php
@@ -100,7 +100,10 @@ class DerivativeContext extends ContextSource {
*
* @param Title $t
*/
- public function setTitle( Title $t ) {
+ public function setTitle( $t ) {
+ if ( $t !== null && !$t instanceof Title ) {
+ throw new MWException( __METHOD__ . " expects an instance of Title" );
+ }
$this->title = $t;
}
@@ -209,7 +212,7 @@ class DerivativeContext extends ContextSource {
/**
* Set the Language object
*
- * @deprecated 1.19 Use setLanguage instead
+ * @deprecated since 1.19 Use setLanguage instead
* @param Language|string $l Language instance or language code
*/
public function setLang( $l ) {
@@ -237,7 +240,7 @@ class DerivativeContext extends ContextSource {
}
/**
- * @deprecated 1.19 Use getLanguage instead
+ * @deprecated since 1.19 Use getLanguage instead
* @return Language
*/
public function getLang() {
@@ -281,4 +284,20 @@ class DerivativeContext extends ContextSource {
return $this->getContext()->getSkin();
}
}
+
+ /**
+ * Get a message using the current context.
+ *
+ * This can't just inherit from ContextSource, since then
+ * it would set only the original context, and not take
+ * into account any changes.
+ *
+ * @param String Message name
+ * @param Variable number of message arguments
+ * @return Message
+ */
+ public function msg() {
+ $args = func_get_args();
+ return call_user_func_array( 'wfMessage', $args )->setContext( $this );
+ }
}
diff --git a/includes/context/IContextSource.php b/includes/context/IContextSource.php
index c7b221b9..35d5aed6 100644
--- a/includes/context/IContextSource.php
+++ b/includes/context/IContextSource.php
@@ -79,7 +79,7 @@ interface IContextSource {
/**
* Get the Language object
*
- * @deprecated 1.19 Use getLanguage instead
+ * @deprecated since 1.19 Use getLanguage instead
* @return Language
*/
public function getLang();
diff --git a/includes/context/RequestContext.php b/includes/context/RequestContext.php
index 6aefc98e..01ec57c0 100644
--- a/includes/context/RequestContext.php
+++ b/includes/context/RequestContext.php
@@ -90,7 +90,10 @@ class RequestContext implements IContextSource {
*
* @param Title $t
*/
- public function setTitle( Title $t ) {
+ public function setTitle( $t ) {
+ if ( $t !== null && !$t instanceof Title ) {
+ throw new MWException( __METHOD__ . " expects an instance of Title" );
+ }
$this->title = $t;
// Erase the WikiPage so a new one with the new title gets created.
$this->wikipage = null;
@@ -233,7 +236,7 @@ class RequestContext implements IContextSource {
/**
* Set the Language object
*
- * @deprecated 1.19 Use setLanguage instead
+ * @deprecated since 1.19 Use setLanguage instead
* @param Language|string $l Language instance or language code
*/
public function setLang( $l ) {
@@ -261,7 +264,7 @@ class RequestContext implements IContextSource {
}
/**
- * @deprecated 1.19 Use getLanguage instead
+ * @deprecated since 1.19 Use getLanguage instead
* @return Language
*/
public function getLang() {
@@ -401,10 +404,10 @@ class RequestContext implements IContextSource {
*/
public function exportSession() {
return array(
- 'ip' => $this->getRequest()->getIP(),
- 'headers' => $this->getRequest()->getAllHeaders(),
+ 'ip' => $this->getRequest()->getIP(),
+ 'headers' => $this->getRequest()->getAllHeaders(),
'sessionId' => session_id(),
- 'userId' => $this->getUser()->getId()
+ 'userId' => $this->getUser()->getId()
);
}
@@ -417,7 +420,9 @@ class RequestContext implements IContextSource {
* This will setup the session from the given ID. This is useful when
* background scripts inherit context when acting on behalf of a user.
*
- * $param array $params Result of RequestContext::exportSession()
+ * @note suhosin.session.encrypt may interfere with this method.
+ *
+ * @param array $params Result of RequestContext::exportSession()
* @return ScopedCallback
* @throws MWException
* @since 1.21
diff --git a/includes/db/ChronologyProtector.php b/includes/db/ChronologyProtector.php
new file mode 100644
index 00000000..de5e72c3
--- /dev/null
+++ b/includes/db/ChronologyProtector.php
@@ -0,0 +1,106 @@
+<?php
+/**
+ * Generator of database load balancing objects.
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with this program; if not, write to the Free Software Foundation, Inc.,
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ * http://www.gnu.org/copyleft/gpl.html
+ *
+ * @file
+ * @ingroup Database
+ */
+
+/**
+ * Class for ensuring a consistent ordering of events as seen by the user, despite replication.
+ * Kind of like Hawking's [[Chronology Protection Agency]].
+ */
+class ChronologyProtector {
+ /** @var Array (DB master name => position) */
+ protected $startupPositions = array();
+ /** @var Array (DB master name => position) */
+ protected $shutdownPositions = array();
+
+ protected $initialized = false; // bool; whether the session data was loaded
+
+ /**
+ * Initialise a LoadBalancer to give it appropriate chronology protection.
+ *
+ * If the session has a previous master position recorded, this will try to
+ * make sure that the next query to a slave of that master will see changes up
+ * to that position by delaying execution. The delay may timeout and allow stale
+ * data if no non-lagged slaves are available.
+ *
+ * @param $lb LoadBalancer
+ * @return void
+ */
+ public function initLB( LoadBalancer $lb ) {
+ if ( $lb->getServerCount() <= 1 ) {
+ return; // non-replicated setup
+ }
+ if ( !$this->initialized ) {
+ $this->initialized = true;
+ if ( isset( $_SESSION[__CLASS__] ) && is_array( $_SESSION[__CLASS__] ) ) {
+ $this->startupPositions = $_SESSION[__CLASS__];
+ }
+ }
+ $masterName = $lb->getServerName( 0 );
+ if ( !empty( $this->startupPositions[$masterName] ) ) {
+ $info = $lb->parentInfo();
+ $pos = $this->startupPositions[$masterName];
+ wfDebug( __METHOD__ . ": LB " . $info['id'] . " waiting for master pos $pos\n" );
+ $lb->waitFor( $pos );
+ }
+ }
+
+ /**
+ * Notify the ChronologyProtector that the LoadBalancer is about to shut
+ * down. Saves replication positions.
+ *
+ * @param $lb LoadBalancer
+ * @return void
+ */
+ public function shutdownLB( LoadBalancer $lb ) {
+ if ( session_id() == '' || $lb->getServerCount() <= 1 ) {
+ return; // don't start a session; don't bother with non-replicated setups
+ }
+ $masterName = $lb->getServerName( 0 );
+ if ( isset( $this->shutdownPositions[$masterName] ) ) {
+ return; // already done
+ }
+ // Only save the position if writes have been done on the connection
+ $db = $lb->getAnyOpenConnection( 0 );
+ $info = $lb->parentInfo();
+ if ( !$db || !$db->doneWrites() ) {
+ wfDebug( __METHOD__ . ": LB {$info['id']}, no writes done\n" );
+ return;
+ }
+ $pos = $db->getMasterPos();
+ wfDebug( __METHOD__ . ": LB {$info['id']} has master pos $pos\n" );
+ $this->shutdownPositions[$masterName] = $pos;
+ }
+
+ /**
+ * Notify the ChronologyProtector that the LBFactory is done calling shutdownLB() for now.
+ * May commit chronology data to persistent storage.
+ *
+ * @return void
+ */
+ public function shutdown() {
+ if ( session_id() != '' && count( $this->shutdownPositions ) ) {
+ wfDebug( __METHOD__ . ": saving master pos for " .
+ count( $this->shutdownPositions ) . " master(s)\n" );
+ $_SESSION[__CLASS__] = $this->shutdownPositions;
+ }
+ }
+}
diff --git a/includes/db/CloneDatabase.php b/includes/db/CloneDatabase.php
index 4e443741..819925cb 100644
--- a/includes/db/CloneDatabase.php
+++ b/includes/db/CloneDatabase.php
@@ -87,7 +87,7 @@ class CloneDatabase {
* Clone the table structure
*/
public function cloneTableStructure() {
- foreach( $this->tablesToClone as $tbl ) {
+ foreach ( $this->tablesToClone 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.
@@ -98,7 +98,7 @@ class CloneDatabase {
self::changePrefix( $this->newTablePrefix );
$newTableName = $this->db->tableName( $tbl, 'raw' );
- if( $this->dropCurrentTables && !in_array( $this->db->getType(), array( 'postgres', 'oracle' ) ) ) {
+ if ( $this->dropCurrentTables && !in_array( $this->db->getType(), array( 'postgres', 'oracle' ) ) ) {
$this->db->dropTable( $tbl, __METHOD__ );
wfDebug( __METHOD__ . " dropping {$newTableName}\n", true );
//Dropping the oldTable because the prefix was changed
@@ -115,9 +115,9 @@ class CloneDatabase {
* @param bool $dropTables Optionally drop the tables we created
*/
public function destroy( $dropTables = false ) {
- if( $dropTables ) {
+ if ( $dropTables ) {
self::changePrefix( $this->newTablePrefix );
- foreach( $this->tablesToClone as $tbl ) {
+ foreach ( $this->tablesToClone as $tbl ) {
$this->db->dropTable( $tbl );
}
}
@@ -127,7 +127,7 @@ class CloneDatabase {
/**
* Change the table prefix on all open DB connections/
*
- * @param $prefix
+ * @param $prefix
* @return void
*/
public static function changePrefix( $prefix ) {
@@ -137,8 +137,8 @@ class CloneDatabase {
}
/**
- * @param $lb LoadBalancer
- * @param $prefix
+ * @param $lb LoadBalancer
+ * @param $prefix
* @return void
*/
public static function changeLBPrefix( $lb, $prefix ) {
@@ -146,8 +146,8 @@ class CloneDatabase {
}
/**
- * @param $db DatabaseBase
- * @param $prefix
+ * @param $db DatabaseBase
+ * @param $prefix
* @return void
*/
public static function changeDBPrefix( $db, $prefix ) {
diff --git a/includes/db/Database.php b/includes/db/Database.php
index 65a74abf..10645608 100644
--- a/includes/db/Database.php
+++ b/includes/db/Database.php
@@ -24,13 +24,6 @@
* @ingroup Database
*/
-/** Number of times to re-try an operation in case of deadlock */
-define( 'DEADLOCK_TRIES', 4 );
-/** Minimum time to wait before retry, in microseconds */
-define( 'DEADLOCK_DELAY_MIN', 500000 );
-/** Maximum time to wait before retry */
-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
@@ -165,7 +158,7 @@ interface DatabaseType {
* @param string $fname 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' );
+ function indexInfo( $table, $index, $fname = __METHOD__ );
/**
* Get the number of rows affected by the last write query
@@ -191,7 +184,7 @@ interface DatabaseType {
*
* @return string: wikitext of a link to the server software's web site
*/
- static function getSoftwareLink();
+ function getSoftwareLink();
/**
* A string describing the current software version, like from
@@ -212,10 +205,22 @@ interface DatabaseType {
}
/**
+ * Interface for classes that implement or wrap DatabaseBase
+ * @ingroup Database
+ */
+interface IDatabase {}
+
+/**
* Database abstraction object
* @ingroup Database
*/
-abstract class DatabaseBase implements DatabaseType {
+abstract class DatabaseBase implements IDatabase, DatabaseType {
+ /** Number of times to re-try an operation in case of deadlock */
+ const DEADLOCK_TRIES = 4;
+ /** Minimum time to wait before retry, in microseconds */
+ const DEADLOCK_DELAY_MIN = 500000;
+ /** Maximum time to wait before retry */
+ const DEADLOCK_DELAY_MAX = 1500000;
# ------------------------------------------------------------------------------
# Variables
@@ -230,14 +235,14 @@ abstract class DatabaseBase implements DatabaseType {
protected $mConn = null;
protected $mOpened = false;
- /**
- * @since 1.20
- * @var array of Closure
- */
+ /** @var callable[] */
protected $mTrxIdleCallbacks = array();
+ /** @var callable[] */
+ protected $mTrxPreCommitCallbacks = array();
protected $mTablePrefix;
protected $mFlags;
+ protected $mForeign;
protected $mTrxLevel = 0;
protected $mErrorCount = 0;
protected $mLBInfo = array();
@@ -282,6 +287,12 @@ abstract class DatabaseBase implements DatabaseType {
*/
protected $fileHandle = null;
+ /**
+ * @since 1.22
+ * @var Process cache of VIEWs names in the database
+ */
+ protected $allViews = null;
+
# ------------------------------------------------------------------------------
# Accessors
# ------------------------------------------------------------------------------
@@ -355,6 +366,8 @@ abstract class DatabaseBase implements DatabaseType {
* code should use lastErrno() and lastError() to handle the
* situation as appropriate.
*
+ * Do not use this function outside of the Database classes.
+ *
* @param $ignoreErrors bool|null
*
* @return bool The previous value of the flag.
@@ -553,12 +566,14 @@ abstract class DatabaseBase implements DatabaseType {
/**
* Returns true if there is a transaction open with possible write
- * queries or transaction idle callbacks waiting on it to finish.
+ * queries or transaction pre-commit/idle callbacks waiting on it to finish.
*
* @return bool
*/
public function writesOrCallbacksPending() {
- return $this->mTrxLevel && ( $this->mTrxDoneWrites || $this->mTrxIdleCallbacks );
+ return $this->mTrxLevel && (
+ $this->mTrxDoneWrites || $this->mTrxIdleCallbacks || $this->mTrxPreCommitCallbacks
+ );
}
/**
@@ -575,7 +590,6 @@ abstract class DatabaseBase implements DatabaseType {
* @param $flag Integer: DBO_* constants from Defines.php:
* - DBO_DEBUG: output some debug info (same as debug())
* - DBO_NOBUFFER: don't buffer results (inverse of bufferResults())
- * - DBO_IGNORE: ignore errors (same as ignoreErrors())
* - DBO_TRX: automatically start transactions
* - DBO_DEFAULT: automatically sets DBO_TRX if not in command line mode
* and removes it in command line mode
@@ -584,7 +598,7 @@ abstract class DatabaseBase implements DatabaseType {
public function setFlag( $flag ) {
global $wgDebugDBTransactions;
$this->mFlags |= $flag;
- if ( ( $flag & DBO_TRX) & $wgDebugDBTransactions ) {
+ if ( ( $flag & DBO_TRX ) & $wgDebugDBTransactions ) {
wfDebug( "Implicit transactions are now disabled.\n" );
}
}
@@ -654,15 +668,28 @@ abstract class DatabaseBase implements DatabaseType {
/**
* Constructor.
+ *
+ * FIXME: It is possible to construct a Database object with no associated
+ * connection object, by specifying no parameters to __construct(). This
+ * feature is deprecated and should be removed.
+ *
+ * FIXME: The long list of formal parameters here is not really appropriate
+ * for MySQL, and not at all appropriate for any other DBMS. It should be
+ * replaced by named parameters as in DatabaseBase::factory().
+ *
+ * DatabaseBase subclasses should not be constructed directly in external
+ * code. DatabaseBase::factory() should be used instead.
+ *
* @param string $server database server host
* @param string $user database user name
* @param string $password database user password
* @param string $dbName database name
* @param $flags
* @param string $tablePrefix database table prefixes. By default use the prefix gave in LocalSettings.php
+ * @param bool $foreign disable some operations specific to local databases
*/
function __construct( $server = false, $user = false, $password = false, $dbName = false,
- $flags = 0, $tablePrefix = 'get from global'
+ $flags = 0, $tablePrefix = 'get from global', $foreign = false
) {
global $wgDBprefix, $wgCommandLineMode, $wgDebugDBTransactions;
@@ -689,6 +716,8 @@ abstract class DatabaseBase implements DatabaseType {
$this->mTablePrefix = $tablePrefix;
}
+ $this->mForeign = $foreign;
+
if ( $user ) {
$this->open( $server, $user, $password, $dbName );
}
@@ -706,7 +735,7 @@ abstract class DatabaseBase implements DatabaseType {
/**
* 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 ) );
+ * $class = 'Database' . ucfirst( strtolower( $dbType ) );
* 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
@@ -714,7 +743,6 @@ abstract class DatabaseBase implements DatabaseType {
* 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()
*
@@ -722,24 +750,55 @@ abstract class DatabaseBase implements DatabaseType {
*
* @param string $dbType A possible DB type
* @param array $p An array of options to pass to the constructor.
- * Valid options are: host, user, password, dbname, flags, tablePrefix
+ * Valid options are: host, user, password, dbname, flags, tablePrefix, driver
* @return DatabaseBase subclass or null
*/
final public static function factory( $dbType, $p = array() ) {
$canonicalDBTypes = array(
- 'mysql', 'postgres', 'sqlite', 'oracle', 'mssql'
+ 'mysql' => array( 'mysqli', 'mysql' ),
+ 'postgres' => array(),
+ 'sqlite' => array(),
+ 'oracle' => array(),
+ 'mssql' => array(),
);
+
+ $driver = false;
$dbType = strtolower( $dbType );
- $class = 'Database' . ucfirst( $dbType );
+ if ( isset( $canonicalDBTypes[$dbType] ) && $canonicalDBTypes[$dbType] ) {
+ $possibleDrivers = $canonicalDBTypes[$dbType];
+ if ( !empty( $p['driver'] ) ) {
+ if ( in_array( $p['driver'], $possibleDrivers ) ) {
+ $driver = $p['driver'];
+ } else {
+ throw new MWException( __METHOD__ .
+ " cannot construct Database with type '$dbType' and driver '{$p['driver']}'" );
+ }
+ } else {
+ foreach ( $possibleDrivers as $posDriver ) {
+ if ( extension_loaded( $posDriver ) ) {
+ $driver = $posDriver;
+ break;
+ }
+ }
+ }
+ } else {
+ $driver = $dbType;
+ }
+ if ( $driver === false ) {
+ throw new MWException( __METHOD__ .
+ " no viable database extension found for type '$dbType'" );
+ }
- if( in_array( $dbType, $canonicalDBTypes ) || ( class_exists( $class ) && is_subclass_of( $class, 'DatabaseBase' ) ) ) {
+ $class = 'Database' . ucfirst( $driver );
+ if ( class_exists( $class ) && is_subclass_of( $class, 'DatabaseBase' ) ) {
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'
+ isset( $p['tablePrefix'] ) ? $p['tablePrefix'] : 'get from global',
+ isset( $p['foreign'] ) ? $p['foreign'] : false
);
} else {
return null;
@@ -772,8 +831,9 @@ abstract class DatabaseBase implements DatabaseType {
/**
* @param $errno
* @param $errstr
+ * @access private
*/
- protected function connectionErrorHandler( $errno, $errstr ) {
+ public function connectionErrorHandler( $errno, $errstr ) {
$this->mPHPError = $errstr;
}
@@ -870,23 +930,8 @@ abstract class DatabaseBase implements DatabaseType {
* @return boolean|ResultWrapper. true for a successful write query, ResultWrapper object
* for a successful read query, or false on failure if $tempIgnore set
*/
- public function query( $sql, $fname = '', $tempIgnore = false ) {
- $isMaster = !is_null( $this->getLBInfo( 'master' ) );
- if ( !Profiler::instance()->isStub() ) {
- # generalizeSQL will probably cut down the query to reasonable
- # logging size most of the time. The substr is really just a sanity check.
-
- if ( $isMaster ) {
- $queryProf = 'query-m: ' . substr( DatabaseBase::generalizeSQL( $sql ), 0, 255 );
- $totalProf = 'DatabaseBase::query-master';
- } else {
- $queryProf = 'query: ' . substr( DatabaseBase::generalizeSQL( $sql ), 0, 255 );
- $totalProf = 'DatabaseBase::query';
- }
-
- wfProfileIn( $totalProf );
- wfProfileIn( $queryProf );
- }
+ public function query( $sql, $fname = __METHOD__, $tempIgnore = false ) {
+ global $wgUser, $wgDebugDBTransactions;
$this->mLastQuery = $sql;
if ( !$this->mDoneWrites && $this->isWriteQuery( $sql ) ) {
@@ -896,7 +941,6 @@ abstract class DatabaseBase implements DatabaseType {
}
# Add a comment for easy SHOW PROCESSLIST interpretation
- global $wgUser;
if ( is_object( $wgUser ) && $wgUser->isItemLoaded( 'name' ) ) {
$userName = $wgUser->getName();
if ( mb_strlen( $userName ) > 15 ) {
@@ -920,7 +964,6 @@ abstract class DatabaseBase implements DatabaseType {
# is really used by application
$sqlstart = substr( $sql, 0, 10 ); // very much worth it, benchmark certified(tm)
if ( strpos( $sqlstart, "SHOW " ) !== 0 && strpos( $sqlstart, "SET " ) !== 0 ) {
- global $wgDebugDBTransactions;
if ( $wgDebugDBTransactions ) {
wfDebug( "Implicit transaction start.\n" );
}
@@ -932,6 +975,22 @@ abstract class DatabaseBase implements DatabaseType {
# Keep track of whether the transaction has write queries pending
if ( $this->mTrxLevel && !$this->mTrxDoneWrites && $this->isWriteQuery( $sql ) ) {
$this->mTrxDoneWrites = true;
+ Profiler::instance()->transactionWritingIn( $this->mServer, $this->mDBname );
+ }
+
+ $isMaster = !is_null( $this->getLBInfo( 'master' ) );
+ if ( !Profiler::instance()->isStub() ) {
+ # generalizeSQL will probably cut down the query to reasonable
+ # logging size most of the time. The substr is really just a sanity check.
+ if ( $isMaster ) {
+ $queryProf = 'query-m: ' . substr( DatabaseBase::generalizeSQL( $sql ), 0, 255 );
+ $totalProf = 'DatabaseBase::query-master';
+ } else {
+ $queryProf = 'query: ' . substr( DatabaseBase::generalizeSQL( $sql ), 0, 255 );
+ $totalProf = 'DatabaseBase::query';
+ }
+ wfProfileIn( $totalProf );
+ wfProfileIn( $queryProf );
}
if ( $this->debug() ) {
@@ -945,10 +1004,6 @@ abstract class DatabaseBase implements DatabaseType {
wfDebug( "Query {$this->mDBname} ($cnt) ($master): $sqlx\n" );
}
- if ( istainted( $sql ) & TC_MYSQL ) {
- throw new MWException( 'Tainted query found' );
- }
-
$queryId = MWDebug::query( $sql, $fname, $isMaster );
# Do the query and handle errors
@@ -961,6 +1016,7 @@ abstract class DatabaseBase implements DatabaseType {
# Transaction is gone, like it or not
$this->mTrxLevel = 0;
$this->mTrxIdleCallbacks = array(); // cancel
+ $this->mTrxPreCommitCallbacks = array(); // cancel
wfDebug( "Connection lost, reconnecting...\n" );
if ( $this->ping() ) {
@@ -1091,17 +1147,22 @@ abstract class DatabaseBase implements DatabaseType {
* @return String
*/
protected function fillPreparedArg( $matches ) {
- switch( $matches[1] ) {
- case '\\?': return '?';
- case '\\!': return '!';
- case '\\&': return '&';
+ switch ( $matches[1] ) {
+ case '\\?':
+ return '?';
+ case '\\!':
+ return '!';
+ case '\\&':
+ return '&';
}
list( /* $n */, $arg ) = each( $this->preparedArgs );
- switch( $matches[1] ) {
- case '?': return $this->addQuotes( $arg );
- case '!': return $arg;
+ switch ( $matches[1] ) {
+ case '?':
+ return $this->addQuotes( $arg );
+ case '!':
+ return $arg;
case '&':
# return $this->addQuotes( file_get_contents( $arg ) );
throw new DBUnexpectedError( $this, '& mode is not implemented. If it\'s really needed, uncomment the line above.' );
@@ -1117,7 +1178,8 @@ abstract class DatabaseBase implements DatabaseType {
*
* @param $res Mixed: A SQL result
*/
- public function freeResult( $res ) {}
+ public function freeResult( $res ) {
+ }
/**
* A SELECT wrapper which returns a single field from a single result row.
@@ -1136,9 +1198,9 @@ abstract class DatabaseBase implements DatabaseType {
*
* @return bool|mixed The value from the field, or false on failure.
*/
- public function selectField( $table, $var, $cond = '', $fname = 'DatabaseBase::selectField',
- $options = array() )
- {
+ public function selectField( $table, $var, $cond = '', $fname = __METHOD__,
+ $options = array()
+ ) {
if ( !is_array( $options ) ) {
$options = array( $options );
}
@@ -1236,7 +1298,7 @@ abstract class DatabaseBase implements DatabaseType {
$startOpts .= ' SQL_NO_CACHE';
}
- if ( isset( $options['USE INDEX'] ) && ! is_array( $options['USE INDEX'] ) ) {
+ if ( isset( $options['USE INDEX'] ) && is_string( $options['USE INDEX'] ) ) {
$useIndex = $this->useIndexClause( $options['USE INDEX'] );
} else {
$useIndex = '';
@@ -1427,7 +1489,7 @@ abstract class DatabaseBase implements DatabaseType {
* DBQueryError exception will be thrown, except if the "ignore errors"
* option was set, in which case false will be returned.
*/
- public function select( $table, $vars, $conds = '', $fname = 'DatabaseBase::select',
+ public function select( $table, $vars, $conds = '', $fname = __METHOD__,
$options = array(), $join_conds = array() ) {
$sql = $this->selectSQLText( $table, $vars, $conds, $fname, $options, $join_conds );
@@ -1450,7 +1512,7 @@ abstract class DatabaseBase implements DatabaseType {
* @return string SQL query string.
* @see DatabaseBase::select()
*/
- public function selectSQLText( $table, $vars, $conds = '', $fname = 'DatabaseBase::select',
+ public function selectSQLText( $table, $vars, $conds = '', $fname = __METHOD__,
$options = array(), $join_conds = array() )
{
if ( is_array( $vars ) ) {
@@ -1458,28 +1520,26 @@ abstract class DatabaseBase implements DatabaseType {
}
$options = (array)$options;
+ $useIndexes = ( isset( $options['USE INDEX'] ) && is_array( $options['USE INDEX'] ) )
+ ? $options['USE INDEX']
+ : array();
if ( is_array( $table ) ) {
- $useIndex = ( isset( $options['USE INDEX'] ) && is_array( $options['USE INDEX'] ) )
- ? $options['USE INDEX']
- : array();
- if ( count( $join_conds ) || count( $useIndex ) ) {
- $from = ' FROM ' .
- $this->tableNamesWithUseIndexOrJOIN( $table, $useIndex, $join_conds );
- } else {
- $from = ' FROM ' . implode( ',', $this->tableNamesWithAlias( $table ) );
- }
+ $from = ' FROM ' .
+ $this->tableNamesWithUseIndexOrJOIN( $table, $useIndexes, $join_conds );
} elseif ( $table != '' ) {
if ( $table[0] == ' ' ) {
$from = ' FROM ' . $table;
} else {
- $from = ' FROM ' . $this->tableName( $table );
+ $from = ' FROM ' .
+ $this->tableNamesWithUseIndexOrJOIN( array( $table ), $useIndexes, array() );
}
} else {
$from = '';
}
- list( $startOpts, $useIndex, $preLimitTail, $postLimitTail ) = $this->makeSelectOptions( $options );
+ list( $startOpts, $useIndex, $preLimitTail, $postLimitTail ) =
+ $this->makeSelectOptions( $options );
if ( !empty( $conds ) ) {
if ( is_array( $conds ) ) {
@@ -1517,7 +1577,7 @@ abstract class DatabaseBase implements DatabaseType {
*
* @return object|bool
*/
- public function selectRow( $table, $vars, $conds, $fname = 'DatabaseBase::selectRow',
+ public function selectRow( $table, $vars, $conds, $fname = __METHOD__,
$options = array(), $join_conds = array() )
{
$options = (array)$options;
@@ -1558,7 +1618,7 @@ abstract class DatabaseBase implements DatabaseType {
* @return Integer: row count
*/
public function estimateRowCount( $table, $vars = '*', $conds = '',
- $fname = 'DatabaseBase::estimateRowCount', $options = array() )
+ $fname = __METHOD__, $options = array() )
{
$rows = 0;
$res = $this->select( $table, array( 'rowcount' => 'COUNT(*)' ), $conds, $fname, $options );
@@ -1582,19 +1642,20 @@ abstract class DatabaseBase implements DatabaseType {
static function generalizeSQL( $sql ) {
# This does the same as the regexp below would do, but in such a way
# as to avoid crashing php on some large strings.
- # $sql = preg_replace ( "/'([^\\\\']|\\\\.)*'|\"([^\\\\\"]|\\\\.)*\"/", "'X'", $sql);
+ # $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( '/-?\d+(,-?\d+)+/s', 'N,...,N', $sql );
+ $sql = preg_replace( '/-?\d+/s', 'N', $sql );
return $sql;
}
@@ -1607,7 +1668,7 @@ abstract class DatabaseBase implements DatabaseType {
* @param string $fname calling function name (optional)
* @return Boolean: whether $table has filed $field
*/
- public function fieldExists( $table, $field, $fname = 'DatabaseBase::fieldExists' ) {
+ public function fieldExists( $table, $field, $fname = __METHOD__ ) {
$info = $this->fieldInfo( $table, $field );
return (bool)$info;
@@ -1624,8 +1685,8 @@ abstract class DatabaseBase implements DatabaseType {
*
* @return bool|null
*/
- public function indexExists( $table, $index, $fname = 'DatabaseBase::indexExists' ) {
- if( !$this->tableExists( $table ) ) {
+ public function indexExists( $table, $index, $fname = __METHOD__ ) {
+ if ( !$this->tableExists( $table ) ) {
return null;
}
@@ -1729,7 +1790,7 @@ abstract class DatabaseBase implements DatabaseType {
*
* @return bool
*/
- public function insert( $table, $a, $fname = 'DatabaseBase::insert', $options = array() ) {
+ public function insert( $table, $a, $fname = __METHOD__, $options = array() ) {
# No rows to insert, easy just return now
if ( !count( $a ) ) {
return true;
@@ -1828,7 +1889,7 @@ abstract class DatabaseBase implements DatabaseType {
* - LOW_PRIORITY: MySQL-specific, see MySQL manual.
* @return Boolean
*/
- function update( $table, $values, $conds, $fname = 'DatabaseBase::update', $options = array() ) {
+ function update( $table, $values, $conds, $fname = __METHOD__, $options = array() ) {
$table = $this->tableName( $table );
$opts = $this->makeUpdateOptions( $options );
$sql = "UPDATE $opts $table SET " . $this->makeList( $values, LIST_SET );
@@ -2065,6 +2126,7 @@ abstract class DatabaseBase implements DatabaseType {
} else {
list( $table ) = $dbDetails;
if ( $wgSharedDB !== null # We have a shared database
+ && $this->mForeign == false # We're not working on a foreign database
&& !$this->isQuotedIdentifier( $table ) # Paranoia check to prevent shared tables listing '`table`'
&& in_array( $table, $wgSharedTables ) # A shared table is selected
) {
@@ -2257,11 +2319,11 @@ abstract class DatabaseBase implements DatabaseType {
}
// We can't separate explicit JOIN clauses with ',', use ' ' for those
- $straightJoins = !empty( $ret ) ? implode( ',', $ret ) : "";
- $otherJoins = !empty( $retJOIN ) ? implode( ' ', $retJOIN ) : "";
+ $implicitJoins = !empty( $ret ) ? implode( ',', $ret ) : "";
+ $explicitJoins = !empty( $retJOIN ) ? implode( ' ', $retJOIN ) : "";
// Compile our final table clause
- return implode( ' ', array( $straightJoins, $otherJoins ) );
+ return implode( ' ', array( $implicitJoins, $explicitJoins ) );
}
/**
@@ -2274,9 +2336,9 @@ abstract class DatabaseBase implements DatabaseType {
protected function indexName( $index ) {
// Backwards-compatibility hack
$renamed = array(
- 'ar_usertext_timestamp' => 'usertext_timestamp',
- 'un_user_id' => 'user_id',
- 'un_user_ip' => 'user_ip',
+ 'ar_usertext_timestamp' => 'usertext_timestamp',
+ 'un_user_id' => 'user_id',
+ 'un_user_ip' => 'user_ip',
);
if ( isset( $renamed[$index] ) ) {
@@ -2287,8 +2349,7 @@ abstract class DatabaseBase implements DatabaseType {
}
/**
- * If it's a string, adds quotes and backslashes
- * Otherwise returns as-is
+ * Adds quotes and backslashes.
*
* @param $s string
*
@@ -2445,7 +2506,7 @@ abstract class DatabaseBase implements DatabaseType {
* a field name or an array of field names
* @param string $fname Calling function name (use __METHOD__) for logs/profiling
*/
- public function replace( $table, $uniqueIndexes, $rows, $fname = 'DatabaseBase::replace' ) {
+ public function replace( $table, $uniqueIndexes, $rows, $fname = __METHOD__ ) {
$quotedTable = $this->tableName( $table );
if ( count( $rows ) == 0 ) {
@@ -2457,7 +2518,7 @@ abstract class DatabaseBase implements DatabaseType {
$rows = array( $rows );
}
- foreach( $rows as $row ) {
+ foreach ( $rows as $row ) {
# Delete rows which collide
if ( $uniqueIndexes ) {
$sql = "DELETE FROM $quotedTable WHERE ";
@@ -2488,7 +2549,7 @@ abstract class DatabaseBase implements DatabaseType {
}
# Now insert the row
- $this->insert( $table, $row );
+ $this->insert( $table, $row, $fname );
}
}
@@ -2527,6 +2588,92 @@ abstract class DatabaseBase implements DatabaseType {
}
/**
+ * INSERT ON DUPLICATE KEY UPDATE wrapper, upserts an array into a table.
+ *
+ * This updates any conflicting rows (according to the unique indexes) using
+ * the provided SET clause and inserts any remaining (non-conflicted) rows.
+ *
+ * $rows may be either:
+ * - A single associative array. The array keys are the field names, and
+ * the values are the values to insert. The values are treated as data
+ * and will be quoted appropriately. If NULL is inserted, this will be
+ * converted to a database NULL.
+ * - An array with numeric keys, holding a list of associative arrays.
+ * This causes a multi-row INSERT on DBMSs that support it. The keys in
+ * each subarray must be identical to each other, and in the same order.
+ *
+ * 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.
+ *
+ * Usually throws a DBQueryError on failure. If errors are explicitly ignored,
+ * returns success.
+ *
+ * @param string $table Table name. This will be passed through DatabaseBase::tableName().
+ * @param array $rows A single row or list of rows to insert
+ * @param array $uniqueIndexes List of single field names or field name tuples
+ * @param array $set An array of values to SET. For each array element,
+ * the key gives the field name, and the value gives the data
+ * to set that field to. The data will be quoted by
+ * DatabaseBase::addQuotes().
+ * @param string $fname Calling function name (use __METHOD__) for logs/profiling
+ * @param array $options of options
+ *
+ * @return bool
+ * @since 1.22
+ */
+ public function upsert(
+ $table, array $rows, array $uniqueIndexes, array $set, $fname = __METHOD__
+ ) {
+ if ( !count( $rows ) ) {
+ return true; // nothing to do
+ }
+ $rows = is_array( reset( $rows ) ) ? $rows : array( $rows );
+
+ if ( count( $uniqueIndexes ) ) {
+ $clauses = array(); // list WHERE clauses that each identify a single row
+ foreach ( $rows as $row ) {
+ foreach ( $uniqueIndexes as $index ) {
+ $index = is_array( $index ) ? $index : array( $index ); // columns
+ $rowKey = array(); // unique key to this row
+ foreach ( $index as $column ) {
+ $rowKey[$column] = $row[$column];
+ }
+ $clauses[] = $this->makeList( $rowKey, LIST_AND );
+ }
+ }
+ $where = array( $this->makeList( $clauses, LIST_OR ) );
+ } else {
+ $where = false;
+ }
+
+ $useTrx = !$this->mTrxLevel;
+ if ( $useTrx ) {
+ $this->begin( $fname );
+ }
+ try {
+ # Update any existing conflicting row(s)
+ if ( $where !== false ) {
+ $ok = $this->update( $table, $set, $where, $fname );
+ } else {
+ $ok = true;
+ }
+ # Now insert any non-conflicting row(s)
+ $ok = $this->insert( $table, $rows, $fname, array( 'IGNORE' ) ) && $ok;
+ } catch ( Exception $e ) {
+ if ( $useTrx ) {
+ $this->rollback( $fname );
+ }
+ throw $e;
+ }
+ if ( $useTrx ) {
+ $this->commit( $fname );
+ }
+
+ return $ok;
+ }
+
+ /**
* DELETE where the condition is a join.
*
* MySQL overrides this to use a multi-table DELETE syntax, in other databases
@@ -2548,7 +2695,7 @@ abstract class DatabaseBase implements DatabaseType {
* @throws DBUnexpectedError
*/
public function deleteJoin( $delTable, $joinTable, $delVar, $joinVar, $conds,
- $fname = 'DatabaseBase::deleteJoin' )
+ $fname = __METHOD__ )
{
if ( !$conds ) {
throw new DBUnexpectedError( $this,
@@ -2614,7 +2761,7 @@ abstract class DatabaseBase implements DatabaseType {
* @throws DBUnexpectedError
* @return bool|ResultWrapper
*/
- public function delete( $table, $conds, $fname = 'DatabaseBase::delete' ) {
+ public function delete( $table, $conds, $fname = __METHOD__ ) {
if ( !$conds ) {
throw new DBUnexpectedError( $this, 'DatabaseBase::delete() called with no conditions' );
}
@@ -2623,7 +2770,10 @@ abstract class DatabaseBase implements DatabaseType {
$sql = "DELETE FROM $table";
if ( $conds != '*' ) {
- $sql .= ' WHERE ' . $this->makeList( $conds, LIST_AND );
+ if ( is_array( $conds ) ) {
+ $conds = $this->makeList( $conds, LIST_AND );
+ }
+ $sql .= ' WHERE ' . $conds;
}
return $this->query( $sql, $fname );
@@ -2656,7 +2806,7 @@ abstract class DatabaseBase implements DatabaseType {
* @return ResultWrapper
*/
public function insertSelect( $destTable, $srcTable, $varMap, $conds,
- $fname = 'DatabaseBase::insertSelect',
+ $fname = __METHOD__,
$insertOptions = array(), $selectOptions = array() )
{
$destTable = $this->tableName( $destTable );
@@ -2848,7 +2998,7 @@ abstract class DatabaseBase implements DatabaseType {
$args = func_get_args();
$function = array_shift( $args );
$oldIgnore = $this->ignoreErrors( true );
- $tries = DEADLOCK_TRIES;
+ $tries = self::DEADLOCK_TRIES;
if ( is_array( $function ) ) {
$fname = $function[0];
@@ -2865,7 +3015,7 @@ abstract class DatabaseBase implements DatabaseType {
if ( $errno ) {
if ( $this->wasDeadlock() ) {
# Retry
- usleep( mt_rand( DEADLOCK_DELAY_MIN, DEADLOCK_DELAY_MAX ) );
+ usleep( mt_rand( self::DEADLOCK_DELAY_MIN, self::DEADLOCK_DELAY_MAX ) );
} else {
$this->reportQueryError( $error, $errno, $sql, $fname );
}
@@ -2955,24 +3105,45 @@ abstract class DatabaseBase implements DatabaseType {
/**
* Run an anonymous function as soon as there is no transaction pending.
* If there is a transaction and it is rolled back, then the callback is cancelled.
+ * Queries in the function will run in AUTO-COMMIT mode unless there are begin() calls.
* Callbacks must commit any transactions that they begin.
*
- * This is useful for updates to different systems or separate transactions are needed.
+ * This is useful for updates to different systems or when separate transactions are needed.
+ * For example, one might want to enqueue jobs into a system outside the database, but only
+ * after the database is updated so that the jobs will see the data when they actually run.
+ * It can also be used for updates that easily cause deadlocks if locks are held too long.
*
+ * @param callable $callback
* @since 1.20
+ */
+ final public function onTransactionIdle( $callback ) {
+ $this->mTrxIdleCallbacks[] = array( $callback, wfGetCaller() );
+ if ( !$this->mTrxLevel ) {
+ $this->runOnTransactionIdleCallbacks();
+ }
+ }
+
+ /**
+ * Run an anonymous function before the current transaction commits or now if there is none.
+ * If there is a transaction and it is rolled back, then the callback is cancelled.
+ * Callbacks must not start nor commit any transactions.
+ *
+ * This is useful for updates that easily cause deadlocks if locks are held too long
+ * but where atomicity is strongly desired for these updates and some related updates.
*
- * @param Closure $callback
+ * @param callable $callback
+ * @since 1.22
*/
- final public function onTransactionIdle( Closure $callback ) {
+ final public function onTransactionPreCommitOrIdle( $callback ) {
if ( $this->mTrxLevel ) {
- $this->mTrxIdleCallbacks[] = $callback;
+ $this->mTrxPreCommitCallbacks[] = array( $callback, wfGetCaller() );
} else {
- $callback();
+ $this->onTransactionIdle( $callback ); // this will trigger immediately
}
}
/**
- * Actually run the "on transaction idle" callbacks.
+ * Actually any "on transaction idle" callbacks.
*
* @since 1.20
*/
@@ -2985,8 +3156,9 @@ abstract class DatabaseBase implements DatabaseType {
$this->mTrxIdleCallbacks = array(); // recursion guard
foreach ( $callbacks as $callback ) {
try {
+ list( $phpCallback ) = $callback;
$this->clearFlag( DBO_TRX ); // make each query its own transaction
- $callback();
+ call_user_func( $phpCallback );
$this->setFlag( $autoTrx ? DBO_TRX : 0 ); // restore automatic begin()
} catch ( Exception $e ) {}
}
@@ -2998,6 +3170,29 @@ abstract class DatabaseBase implements DatabaseType {
}
/**
+ * Actually any "on transaction pre-commit" callbacks.
+ *
+ * @since 1.22
+ */
+ protected function runOnTransactionPreCommitCallbacks() {
+ $e = null; // last exception
+ do { // callbacks may add callbacks :)
+ $callbacks = $this->mTrxPreCommitCallbacks;
+ $this->mTrxPreCommitCallbacks = array(); // recursion guard
+ foreach ( $callbacks as $callback ) {
+ try {
+ list( $phpCallback ) = $callback;
+ call_user_func( $phpCallback );
+ } catch ( Exception $e ) {}
+ }
+ } while ( count( $this->mTrxPreCommitCallbacks ) );
+
+ if ( $e instanceof Exception ) {
+ throw $e; // re-throw any last exception
+ }
+ }
+
+ /**
* Begin a transaction. If a transaction is already in progress, that transaction will be committed before the
* new transaction is started.
*
@@ -3009,7 +3204,7 @@ abstract class DatabaseBase implements DatabaseType {
*
* @param $fname string
*/
- final public function begin( $fname = 'DatabaseBase::begin' ) {
+ final public function begin( $fname = __METHOD__ ) {
global $wgDebugDBTransactions;
if ( $this->mTrxLevel ) { // implicit commit
@@ -3025,11 +3220,16 @@ abstract class DatabaseBase implements DatabaseType {
// log it if $wgDebugDBTransactions is enabled.
if ( $this->mTrxDoneWrites && $wgDebugDBTransactions ) {
wfDebug( "$fname: Automatic transaction with writes in progress" .
- " (from {$this->mTrxFname}), performing implicit commit!\n" );
+ " (from {$this->mTrxFname}), performing implicit commit!\n"
+ );
}
}
+ $this->runOnTransactionPreCommitCallbacks();
$this->doCommit( $fname );
+ if ( $this->mTrxDoneWrites ) {
+ Profiler::instance()->transactionWritingOut( $this->mServer, $this->mDBname );
+ }
$this->runOnTransactionIdleCallbacks();
}
@@ -3062,22 +3262,27 @@ abstract class DatabaseBase implements DatabaseType {
* This will silently break any ongoing explicit transaction. Only set the flush flag if you are sure
* that it is safe to ignore these warnings in your context.
*/
- final public function commit( $fname = 'DatabaseBase::commit', $flush = '' ) {
+ final public function commit( $fname = __METHOD__, $flush = '' ) {
if ( $flush != 'flush' ) {
if ( !$this->mTrxLevel ) {
wfWarn( "$fname: No transaction to commit, something got out of sync!" );
- } elseif( $this->mTrxAutomatic ) {
+ } elseif ( $this->mTrxAutomatic ) {
wfWarn( "$fname: Explicit commit of implicit transaction. Something may be out of sync!" );
}
} else {
if ( !$this->mTrxLevel ) {
return; // nothing to do
- } elseif( !$this->mTrxAutomatic ) {
+ } elseif ( !$this->mTrxAutomatic ) {
wfWarn( "$fname: Flushing an explicit transaction, getting out of sync!" );
}
}
+ $this->runOnTransactionPreCommitCallbacks();
$this->doCommit( $fname );
+ if ( $this->mTrxDoneWrites ) {
+ Profiler::instance()->transactionWritingOut( $this->mServer, $this->mDBname );
+ }
+ $this->mTrxDoneWrites = false;
$this->runOnTransactionIdleCallbacks();
}
@@ -3102,12 +3307,17 @@ abstract class DatabaseBase implements DatabaseType {
*
* @param $fname string
*/
- final public function rollback( $fname = 'DatabaseBase::rollback' ) {
+ final public function rollback( $fname = __METHOD__ ) {
if ( !$this->mTrxLevel ) {
wfWarn( "$fname: No transaction to rollback, something got out of sync!" );
}
$this->doRollback( $fname );
$this->mTrxIdleCallbacks = array(); // cancel
+ $this->mTrxPreCommitCallbacks = array(); // cancel
+ if ( $this->mTrxDoneWrites ) {
+ Profiler::instance()->transactionWritingOut( $this->mServer, $this->mDBname );
+ }
+ $this->mTrxDoneWrites = false;
}
/**
@@ -3139,8 +3349,8 @@ abstract class DatabaseBase implements DatabaseType {
* @return Boolean: true if operation was successful
*/
public function duplicateTableStructure( $oldName, $newName, $temporary = false,
- $fname = 'DatabaseBase::duplicateTableStructure' )
- {
+ $fname = __METHOD__
+ ) {
throw new MWException(
'DatabaseBase::duplicateTableStructure is not implemented in descendant class' );
}
@@ -3152,11 +3362,45 @@ abstract class DatabaseBase implements DatabaseType {
* @param string $fname calling function name
* @throws MWException
*/
- function listTables( $prefix = null, $fname = 'DatabaseBase::listTables' ) {
+ function listTables( $prefix = null, $fname = __METHOD__ ) {
throw new MWException( 'DatabaseBase::listTables is not implemented in descendant class' );
}
/**
+ * Reset the views process cache set by listViews()
+ * @since 1.22
+ */
+ final public function clearViewsCache() {
+ $this->allViews = null;
+ }
+
+ /**
+ * Lists all the VIEWs in the database
+ *
+ * For caching purposes the list of all views should be stored in
+ * $this->allViews. The process cache can be cleared with clearViewsCache()
+ *
+ * @param string $prefix Only show VIEWs with this prefix, eg. unit_test_
+ * @param string $fname Name of calling function
+ * @throws MWException
+ * @since 1.22
+ */
+ public function listViews( $prefix = null, $fname = __METHOD__ ) {
+ throw new MWException( 'DatabaseBase::listViews is not implemented in descendant class' );
+ }
+
+ /**
+ * Differentiates between a TABLE and a VIEW
+ *
+ * @param $name string: Name of the database-structure to test.
+ * @throws MWException
+ * @since 1.22
+ */
+ public function isView( $name ) {
+ throw new MWException( 'DatabaseBase::isView is not implemented in descendant class' );
+ }
+
+ /**
* Convert a timestamp in one of the formats accepted by wfTimestamp()
* to the format used for inserting into timestamp fields in this DBMS.
*
@@ -3285,7 +3529,8 @@ abstract class DatabaseBase implements DatabaseType {
* @param $options Array
* @return void
*/
- public function setSessionOptions( array $options ) {}
+ public function setSessionOptions( array $options ) {
+ }
/**
* Read and execute SQL commands from a file.
@@ -3375,7 +3620,7 @@ abstract class DatabaseBase implements DatabaseType {
* @return bool|string
*/
public function sourceStream( $fp, $lineCallback = false, $resultCallback = false,
- $fname = 'DatabaseBase::sourceStream', $inputCallback = false )
+ $fname = __METHOD__, $inputCallback = false )
{
$cmd = '';
@@ -3614,12 +3859,12 @@ abstract class DatabaseBase implements DatabaseType {
* @return bool|ResultWrapper
* @since 1.18
*/
- public function dropTable( $tableName, $fName = 'DatabaseBase::dropTable' ) {
- if( !$this->tableExists( $tableName, $fName ) ) {
+ public function dropTable( $tableName, $fName = __METHOD__ ) {
+ if ( !$this->tableExists( $tableName, $fName ) ) {
return false;
}
$sql = "DROP TABLE " . $this->tableName( $tableName );
- if( $this->cascadingDeletes() ) {
+ if ( $this->cascadingDeletes() ) {
$sql .= " CASCADE";
}
return $this->query( $sql, $fName );
@@ -3691,9 +3936,21 @@ abstract class DatabaseBase implements DatabaseType {
return (string)$this->mConn;
}
+ /**
+ * Run a few simple sanity checks
+ */
public function __destruct() {
- if ( count( $this->mTrxIdleCallbacks ) ) { // sanity
- trigger_error( "Transaction idle callbacks still pending." );
+ if ( $this->mTrxLevel && $this->mTrxDoneWrites ) {
+ trigger_error( "Uncommitted DB writes (transaction from {$this->mTrxFname})." );
+ }
+ if ( count( $this->mTrxIdleCallbacks ) || count( $this->mTrxPreCommitCallbacks ) ) {
+ $callers = array();
+ foreach ( $this->mTrxIdleCallbacks as $callbackInfo ) {
+ $callers[] = $callbackInfo[1];
+
+ }
+ $callers = implode( ', ', $callers );
+ trigger_error( "DB transaction callbacks still pending (from $callers)." );
}
}
}
diff --git a/includes/db/DatabaseError.php b/includes/db/DatabaseError.php
index 628a2afc..0875695f 100644
--- a/includes/db/DatabaseError.php
+++ b/includes/db/DatabaseError.php
@@ -43,24 +43,12 @@ class DBError extends MWException {
}
/**
- * @param $html string
- * @return string
- */
- protected function getContentMessage( $html ) {
- if ( $html ) {
- return nl2br( htmlspecialchars( $this->getMessage() ) );
- } else {
- return $this->getMessage();
- }
- }
-
- /**
* @return string
*/
function getText() {
global $wgShowDBErrorBacktrace;
- $s = $this->getContentMessage( false ) . "\n";
+ $s = $this->getTextContent() . "\n";
if ( $wgShowDBErrorBacktrace ) {
$s .= "Backtrace:\n" . $this->getTraceAsString() . "\n";
@@ -75,14 +63,29 @@ class DBError extends MWException {
function getHTML() {
global $wgShowDBErrorBacktrace;
- $s = $this->getContentMessage( true );
+ $s = $this->getHTMLContent();
if ( $wgShowDBErrorBacktrace ) {
- $s .= '<p>Backtrace:</p><p>' . nl2br( htmlspecialchars( $this->getTraceAsString() ) );
+ $s .= '<p>Backtrace:</p><p>' .
+ nl2br( htmlspecialchars( $this->getTraceAsString() ) ) . '</p>';
}
return $s;
}
+
+ /**
+ * @return string
+ */
+ protected function getTextContent() {
+ return $this->getMessage();
+ }
+
+ /**
+ * @return string
+ */
+ protected function getHTMLContent() {
+ return '<p>' . nl2br( htmlspecialchars( $this->getMessage() ) ) . '</p>';
+ }
}
/**
@@ -96,11 +99,12 @@ class DBConnectionError extends DBError {
if ( trim( $error ) != '' ) {
$msg .= ": $error";
+ } elseif ( $db ) {
+ $error = $this->db->getServer();
}
- $this->error = $error;
-
parent::__construct( $db, $msg );
+ $this->error = $error;
}
/**
@@ -130,10 +134,10 @@ class DBConnectionError extends DBError {
}
/**
- * @return bool
+ * @return boolean
*/
- function getLogMessage() {
- # Don't send to the exception log
+ function isLoggable() {
+ // Don't send to the exception log, already in dberror log
return false;
}
@@ -141,39 +145,51 @@ class DBConnectionError extends DBError {
* @return string
*/
function getPageTitle() {
- global $wgSitename;
- return htmlspecialchars( $this->msg( 'dberr-header', "$wgSitename has a problem" ) );
+ return $this->msg( 'dberr-header', 'This wiki has a problem' );
}
/**
* @return string
*/
function getHTML() {
- global $wgShowDBErrorBacktrace;
+ global $wgShowDBErrorBacktrace, $wgShowHostnames, $wgShowSQLErrors;
- $sorry = htmlspecialchars( $this->msg( 'dberr-problems', 'Sorry! This site is experiencing technical difficulties.' ) );
+ $sorry = htmlspecialchars( $this->msg( 'dberr-problems', "Sorry!\nThis site is experiencing technical difficulties." ) );
$again = htmlspecialchars( $this->msg( 'dberr-again', 'Try waiting a few minutes and reloading.' ) );
- $info = htmlspecialchars( $this->msg( 'dberr-info', '(Can\'t contact the database server: $1)' ) );
-
- # No database access
- MessageCache::singleton()->disable();
- if ( trim( $this->error ) == '' && $this->db ) {
- $this->error = $this->db->getProperty( 'mServer' );
+ if ( $wgShowHostnames || $wgShowSQLErrors ) {
+ $info = str_replace(
+ '$1', Html::element( 'span', array( 'dir' => 'ltr' ), $this->error ),
+ htmlspecialchars( $this->msg( 'dberr-info', '(Cannot contact the database server: $1)' ) )
+ );
+ } else {
+ $info = htmlspecialchars( $this->msg( 'dberr-info-hidden', '(Cannot contact the database server)' ) );
}
- $this->error = Html::element( 'span', array( 'dir' => 'ltr' ), $this->error );
+ # No database access
+ MessageCache::singleton()->disable();
- $noconnect = "<h1>$sorry</h1><p>$again</p><p><small>$info</small></p>";
- $text = str_replace( '$1', $this->error, $noconnect );
+ $text = "<h1>$sorry</h1><p>$again</p><p><small>$info</small></p>";
if ( $wgShowDBErrorBacktrace ) {
- $text .= '<p>Backtrace:</p><p>' . nl2br( htmlspecialchars( $this->getTraceAsString() ) );
+ $text .= '<p>Backtrace:</p><p>' .
+ nl2br( htmlspecialchars( $this->getTraceAsString() ) ) . '</p>';
}
- $extra = $this->searchForm();
+ $text .= '<hr />';
+ $text .= $this->searchForm();
- return "$text<hr />$extra";
+ return $text;
+ }
+
+ protected function getTextContent() {
+ global $wgShowHostnames, $wgShowSQLErrors;
+
+ if ( $wgShowHostnames || $wgShowSQLErrors ) {
+ return $this->getMessage();
+ } else {
+ return 'DB connection error';
+ }
}
public function reportHTML() {
@@ -188,7 +204,7 @@ class DBConnectionError extends DBError {
# Hack: extend the body for error messages
$cache = str_replace( array( '</html>', '</body>' ), '', $cache );
# Add cache notice...
- $cache .= '<div style="color:red;font-size:150%;font-weight:bold;">'.
+ $cache .= '<div style="color:red;font-size:150%;font-weight:bold;">' .
htmlspecialchars( $this->msg( 'dberr-cachederror',
'This is a cached copy of the requested page, and may not be up to date. ' ) ) .
'</div>';
@@ -302,55 +318,107 @@ class DBQueryError extends DBError {
}
/**
- * @param $html string
+ * @return boolean
+ */
+ function isLoggable() {
+ // Don't send to the exception log, already in dberror log
+ return false;
+ }
+
+ /**
* @return string
*/
- function getContentMessage( $html ) {
- if ( $this->useMessageCache() ) {
- if ( $html ) {
- $msg = 'dberrortext';
- $sql = htmlspecialchars( $this->getSQL() );
- $fname = htmlspecialchars( $this->fname );
- $error = htmlspecialchars( $this->error );
- } else {
- $msg = 'dberrortextcl';
- $sql = $this->getSQL();
- $fname = $this->fname;
- $error = $this->error;
+ function getPageTitle() {
+ return $this->msg( 'databaseerror', 'Database error' );
+ }
+
+ /**
+ * @return string
+ */
+ protected function getHTMLContent() {
+ $key = 'databaseerror-text';
+ $s = Html::element( 'p', array(), $this->msg( $key, $this->getFallbackMessage( $key ) ) );
+
+ $details = $this->getTechnicalDetails();
+ if ( $details ) {
+ $s .= '<ul>';
+ foreach ( $details as $key => $detail ) {
+ $s .= str_replace(
+ '$1', call_user_func_array( 'Html::element', $detail ),
+ Html::element( 'li', array(),
+ $this->msg( $key, $this->getFallbackMessage( $key ) )
+ )
+ );
}
- return wfMessage( $msg )->rawParams( $sql, $fname, $this->errno, $error )->text();
- } else {
- return parent::getContentMessage( $html );
+ $s .= '</ul>';
}
+
+ return $s;
}
/**
- * @return String
+ * @return string
*/
- function getSQL() {
- global $wgShowSQLErrors;
+ protected function getTextContent() {
+ $key = 'databaseerror-textcl';
+ $s = $this->msg( $key, $this->getFallbackMessage( $key ) ) . "\n";
- if ( !$wgShowSQLErrors ) {
- return $this->msg( 'sqlhidden', 'SQL hidden' );
- } else {
- return $this->sql;
+ foreach ( $this->getTechnicalDetails() as $key => $detail ) {
+ $s .= $this->msg( $key, $this->getFallbackMessage( $key ), $detail[2] ) . "\n";
}
+
+ return $s;
}
/**
- * @return bool
+ * Make a list of technical details that can be shown to the user. This information can
+ * aid in debugging yet may be useful to an attacker trying to exploit a security weakness
+ * in the software or server configuration.
+ *
+ * Thus no such details are shown by default, though if $wgShowHostnames is true, only the
+ * full SQL query is hidden; in fact, the error message often does contain a hostname, and
+ * sites using this option probably don't care much about "security by obscurity". Of course,
+ * if $wgShowSQLErrors is true, the SQL query *is* shown.
+ *
+ * @return array: Keys are message keys; values are arrays of arguments for Html::element().
+ * Array will be empty if users are not allowed to see any of these details at all.
*/
- function getLogMessage() {
- # Don't send to the exception log
- return false;
+ protected function getTechnicalDetails() {
+ global $wgShowHostnames, $wgShowSQLErrors;
+
+ $attribs = array( 'dir' => 'ltr' );
+ $details = array();
+
+ if ( $wgShowSQLErrors ) {
+ $details['databaseerror-query'] = array(
+ 'div', array( 'class' => 'mw-code' ) + $attribs, $this->sql );
+ }
+
+ if ( $wgShowHostnames || $wgShowSQLErrors ) {
+ $errorMessage = $this->errno . ' ' . $this->error;
+ $details['databaseerror-function'] = array( 'code', $attribs, $this->fname );
+ $details['databaseerror-error'] = array( 'samp', $attribs, $errorMessage );
+ }
+
+ return $details;
}
/**
- * @return String
+ * @param string $key Message key
+ * @return string: English message text
*/
- function getPageTitle() {
- return $this->msg( 'databaseerror', 'Database error' );
+ private function getFallbackMessage( $key ) {
+ $messages = array(
+ 'databaseerror-text' => 'A database query error has occurred.
+This may indicate a bug in the software.',
+ 'databaseerror-textcl' => 'A database query error has occurred.',
+ 'databaseerror-query' => 'Query: $1',
+ 'databaseerror-function' => 'Function: $1',
+ 'databaseerror-error' => 'Error: $1',
+ );
+ return $messages[$key];
}
+
}
/**
diff --git a/includes/db/DatabaseMssql.php b/includes/db/DatabaseMssql.php
index 6c45ffaf..240a097c 100644
--- a/includes/db/DatabaseMssql.php
+++ b/includes/db/DatabaseMssql.php
@@ -37,24 +37,31 @@ class DatabaseMssql extends DatabaseBase {
function cascadingDeletes() {
return true;
}
+
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;
}
@@ -89,7 +96,7 @@ class DatabaseMssql extends DatabaseBase {
$connectionInfo = array();
- if( $dbName ) {
+ if ( $dbName ) {
$connectionInfo['Database'] = $dbName;
}
@@ -102,7 +109,7 @@ class DatabaseMssql extends DatabaseBase {
$ntAuthPassTest = strtolower( $password );
// Decide which auth scenerio to use
- if( $ntAuthPassTest == 'ntauth' && $ntAuthUserTest == 'ntauth' ) {
+ if ( $ntAuthPassTest == 'ntauth' && $ntAuthUserTest == 'ntauth' ) {
// Don't add credentials to $connectionInfo
} else {
$connectionInfo['UID'] = $user;
@@ -148,7 +155,7 @@ class DatabaseMssql extends DatabaseBase {
}
// MSSQL doesn't have EXTRACT(epoch FROM XXX)
- if ( preg_match('#\bEXTRACT\s*?\(\s*?EPOCH\s+FROM\b#i', $sql, $matches ) ) {
+ 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 );
}
@@ -202,9 +209,9 @@ class DatabaseMssql extends DatabaseBase {
$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";
+ $strRet .= "SQLState: " . $arrError['SQLSTATE'] . "\n";
+ $strRet .= "Error Code: " . $arrError['code'] . "\n";
+ $strRet .= "Message: " . $arrError['message'] . "\n";
}
} else {
$strRet = "No errors found";
@@ -290,7 +297,7 @@ class DatabaseMssql extends DatabaseBase {
* (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 select( $table, $vars, $conds = '', $fname = 'DatabaseMssql::select', $options = array(), $join_conds = array() )
+ function select( $table, $vars, $conds = '', $fname = __METHOD__, $options = array(), $join_conds = array() )
{
$sql = $this->selectSQLText( $table, $vars, $conds, $fname, $options, $join_conds );
if ( isset( $options['EXPLAIN'] ) ) {
@@ -315,7 +322,7 @@ class DatabaseMssql extends DatabaseBase {
* (e.g. array( 'page' => array('LEFT JOIN','page_latest=rev_id') )
* @return string, the SQL text
*/
- function selectSQLText( $table, $vars, $conds = '', $fname = 'DatabaseMssql::select', $options = array(), $join_conds = array() ) {
+ function selectSQLText( $table, $vars, $conds = '', $fname = __METHOD__, $options = array(), $join_conds = array() ) {
if ( isset( $options['EXPLAIN'] ) ) {
unset( $options['EXPLAIN'] );
}
@@ -330,14 +337,16 @@ class DatabaseMssql extends DatabaseBase {
* Takes same arguments as Database::select()
* @return int
*/
- function estimateRowCount( $table, $vars = '*', $conds = '', $fname = 'DatabaseMssql::estimateRowCount', $options = array() ) {
+ function estimateRowCount( $table, $vars = '*', $conds = '', $fname = __METHOD__, $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'];
+ if ( isset( $row['EstimateRows'] ) ) {
+ $rows = $row['EstimateRows'];
+ }
}
return $rows;
}
@@ -347,7 +356,7 @@ class DatabaseMssql extends DatabaseBase {
* If errors are explicitly ignored, returns NULL on failure
* @return array|bool|null
*/
- function indexInfo( $table, $index, $fname = 'DatabaseMssql::indexExists' ) {
+ function indexInfo( $table, $index, $fname = __METHOD__ ) {
# 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 . "'";
@@ -392,7 +401,7 @@ class DatabaseMssql extends DatabaseBase {
* @throws DBQueryError
* @return bool
*/
- function insert( $table, $arrToInsert, $fname = 'DatabaseMssql::insert', $options = array() ) {
+ function insert( $table, $arrToInsert, $fname = __METHOD__, $options = array() ) {
# No rows to insert, easy just return now
if ( !count( $arrToInsert ) ) {
return true;
@@ -414,7 +423,7 @@ class DatabaseMssql extends DatabaseBase {
$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() ) {
+ if ( $res && $res->numrows() ) {
// There is an identity for this table.
$identity = array_pop( $res->fetch( SQLSRV_FETCH_ASSOC ) );
}
@@ -427,11 +436,11 @@ class DatabaseMssql extends DatabaseBase {
$identityClause = '';
// if we have an identity column
- if( $identity ) {
+ if ( $identity ) {
// iterate through
- foreach ($a as $k => $v ) {
+ foreach ( $a as $k => $v ) {
if ( $k == $identity ) {
- if( !is_null($v) ) {
+ 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;";
@@ -501,7 +510,7 @@ class DatabaseMssql extends DatabaseBase {
} elseif ( $ret != null ) {
// remember number of rows affected
$this->mAffectedRows = sqlsrv_rows_affected( $ret );
- if ( !is_null($identity) ) {
+ 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;
@@ -530,7 +539,7 @@ class DatabaseMssql extends DatabaseBase {
* @throws DBQueryError
* @return null|ResultWrapper
*/
- function insertSelect( $destTable, $srcTable, $varMap, $conds, $fname = 'DatabaseMssql::insertSelect',
+ function insertSelect( $destTable, $srcTable, $varMap, $conds, $fname = __METHOD__,
$insertOptions = array(), $selectOptions = array() ) {
$ret = parent::insertSelect( $destTable, $srcTable, $varMap, $conds, $fname, $insertOptions, $selectOptions );
@@ -645,7 +654,7 @@ class DatabaseMssql extends DatabaseBase {
/**
* @return string wikitext of a link to the server software's web site
*/
- public static function getSoftwareLink() {
+ public function getSoftwareLink() {
return "[http://www.microsoft.com/sql/ MS SQL Server]";
}
@@ -661,11 +670,11 @@ class DatabaseMssql extends DatabaseBase {
return $version;
}
- function tableExists ( $table, $fname = __METHOD__, $schema = false ) {
+ function tableExists( $table, $fname = __METHOD__, $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() );
+ print "Error in tableExists query: " . $this->getErrors();
return false;
}
if ( sqlsrv_fetch( $res ) ) {
@@ -679,12 +688,12 @@ class DatabaseMssql extends DatabaseBase {
* Query whether a given column exists in the mediawiki schema
* @return bool
*/
- function fieldExists( $table, $field, $fname = 'DatabaseMssql::fieldExists' ) {
+ function fieldExists( $table, $field, $fname = __METHOD__ ) {
$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() );
+ print "Error in fieldExists query: " . $this->getErrors();
return false;
}
if ( sqlsrv_fetch( $res ) ) {
@@ -699,7 +708,7 @@ class DatabaseMssql extends DatabaseBase {
$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() );
+ print "Error in fieldInfo query: " . $this->getErrors();
return false;
}
$meta = $this->fetchRow( $res );
@@ -712,7 +721,7 @@ class DatabaseMssql extends DatabaseBase {
/**
* Begin a transaction, committing any previously open transaction
*/
- protected function doBegin( $fname = 'DatabaseMssql::begin' ) {
+ protected function doBegin( $fname = __METHOD__ ) {
sqlsrv_begin_transaction( $this->mConn );
$this->mTrxLevel = 1;
}
@@ -720,7 +729,7 @@ class DatabaseMssql extends DatabaseBase {
/**
* End a transaction
*/
- protected function doCommit( $fname = 'DatabaseMssql::commit' ) {
+ protected function doCommit( $fname = __METHOD__ ) {
sqlsrv_commit( $this->mConn );
$this->mTrxLevel = 0;
}
@@ -729,7 +738,7 @@ class DatabaseMssql extends DatabaseBase {
* Rollback a transaction.
* No-op on non-transactional databases.
*/
- protected function doRollback( $fname = 'DatabaseMssql::rollback' ) {
+ protected function doRollback( $fname = __METHOD__ ) {
sqlsrv_rollback( $this->mConn );
$this->mTrxLevel = 0;
}
@@ -952,7 +961,7 @@ class DatabaseMssql extends DatabaseBase {
*/
class MssqlField implements Field {
private $name, $tablename, $default, $max_length, $nullable, $type;
- function __construct ( $info ) {
+ function __construct( $info ) {
$this->name = $info['COLUMN_NAME'];
$this->tablename = $info['TABLE_NAME'];
$this->default = $info['COLUMN_DEFAULT'];
@@ -1002,7 +1011,7 @@ class MssqlResult {
$rows = sqlsrv_fetch_array( $queryresult, SQLSRV_FETCH_ASSOC );
- foreach( $rows as $row ) {
+ foreach ( $rows as $row ) {
if ( $row !== null ) {
foreach ( $row as $k => $v ) {
if ( is_object( $v ) && method_exists( $v, 'format' ) ) {// DateTime Object
@@ -1040,7 +1049,7 @@ class MssqlResult {
$arrNum[] = $value;
}
}
- switch( $mode ) {
+ switch ( $mode ) {
case SQLSRV_FETCH_ASSOC:
$ret = $this->mRows[$this->mCursor];
break;
@@ -1093,37 +1102,96 @@ class MssqlResult {
$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;
+ 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;
}
diff --git a/includes/db/DatabaseMysql.php b/includes/db/DatabaseMysql.php
index 27aae188..956bb694 100644
--- a/includes/db/DatabaseMysql.php
+++ b/includes/db/DatabaseMysql.php
@@ -22,27 +22,19 @@
*/
/**
- * Database abstraction object for mySQL
- * Inherit all methods and properties of Database::Database()
+ * Database abstraction object for PHP extension mysql.
*
* @ingroup Database
* @see Database
*/
-class DatabaseMysql extends DatabaseBase {
-
- /**
- * @return string
- */
- function getType() {
- return 'mysql';
- }
+class DatabaseMysql extends DatabaseMysqlBase {
/**
* @param $sql string
* @return resource
*/
protected function doQuery( $sql ) {
- if( $this->bufferResults() ) {
+ if ( $this->bufferResults() ) {
$ret = mysql_query( $sql, $this->mConn );
} else {
$ret = mysql_unbuffered_query( $sql, $this->mConn );
@@ -50,39 +42,13 @@ class DatabaseMysql extends DatabaseBase {
return $ret;
}
- /**
- * @param $server string
- * @param $user string
- * @param $password string
- * @param $dbName string
- * @return bool
- * @throws DBConnectionError
- */
- function open( $server, $user, $password, $dbName ) {
- global $wgAllDBsAreLocalhost, $wgDBmysql5, $wgSQLMode;
- wfProfileIn( __METHOD__ );
-
- # Load mysql.so if we don't have it
- wfDl( 'mysql' );
-
+ protected function mysqlConnect( $realServer ) {
# Fail now
# Otherwise we get a suppressed fatal error, which is very hard to track down
- if ( !function_exists( 'mysql_connect' ) ) {
+ if ( !extension_loaded( 'mysql' ) ) {
throw new DBConnectionError( $this, "MySQL functions missing, have you compiled PHP with the --with-mysql option?\n" );
}
- # Debugging hack -- fake cluster
- if ( $wgAllDBsAreLocalhost ) {
- $realServer = 'localhost';
- } else {
- $realServer = $server;
- }
- $this->close();
- $this->mServer = $server;
- $this->mUser = $user;
- $this->mPassword = $password;
- $this->mDBname = $dbName;
-
$connFlags = 0;
if ( $this->mFlags & DBO_SSL ) {
$connFlags |= MYSQL_CLIENT_SSL;
@@ -91,81 +57,27 @@ class DatabaseMysql extends DatabaseBase {
$connFlags |= MYSQL_CLIENT_COMPRESS;
}
- wfProfileIn( "dbconnect-$server" );
-
- # The kernel's default SYN retransmission period is far too slow for us,
- # so we use a short timeout plus a manual retry. Retrying means that a small
- # but finite rate of SYN packet loss won't cause user-visible errors.
- $this->mConn = false;
if ( ini_get( 'mysql.connect_timeout' ) <= 3 ) {
$numAttempts = 2;
} else {
$numAttempts = 1;
}
- $this->installErrorHandler();
- for ( $i = 0; $i < $numAttempts && !$this->mConn; $i++ ) {
+
+ $conn = false;
+
+ for ( $i = 0; $i < $numAttempts && !$conn; $i++ ) {
if ( $i > 1 ) {
usleep( 1000 );
}
if ( $this->mFlags & DBO_PERSISTENT ) {
- $this->mConn = mysql_pconnect( $realServer, $user, $password, $connFlags );
+ $conn = mysql_pconnect( $realServer, $this->mUser, $this->mPassword, $connFlags );
} else {
# Create a new connection...
- $this->mConn = mysql_connect( $realServer, $user, $password, true, $connFlags );
- }
- #if ( $this->mConn === false ) {
- #$iplus = $i + 1;
- #wfLogDBError("Connect loop error $iplus of $max ($server): " . mysql_errno() . " - " . mysql_error()."\n");
- #}
- }
- $error = $this->restoreErrorHandler();
-
- wfProfileOut( "dbconnect-$server" );
-
- # Always log connection errors
- if ( !$this->mConn ) {
- if ( !$error ) {
- $error = $this->lastError();
- }
- wfLogDBError( "Error connecting to {$this->mServer}: $error\n" );
- wfDebug( "DB connection error\n" .
- "Server: $server, User: $user, Password: " .
- substr( $password, 0, 3 ) . "..., error: " . $error . "\n" );
-
- wfProfileOut( __METHOD__ );
- return $this->reportConnectionError( $error );
- }
-
- if ( $dbName != '' ) {
- wfSuppressWarnings();
- $success = mysql_select_db( $dbName, $this->mConn );
- wfRestoreWarnings();
- if ( !$success ) {
- wfLogDBError( "Error selecting database $dbName on server {$this->mServer}\n" );
- wfDebug( "Error selecting database $dbName on server {$this->mServer} " .
- "from client host " . wfHostname() . "\n" );
-
- wfProfileOut( __METHOD__ );
- return $this->reportConnectionError( "Error selecting database $dbName" );
+ $conn = mysql_connect( $realServer, $this->mUser, $this->mPassword, true, $connFlags );
}
}
- // Tell the server we're communicating with it in UTF-8.
- // This may engage various charset conversions.
- 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
- if ( is_string( $wgSQLMode ) ) {
- $mode = $this->addQuotes( $wgSQLMode );
- $this->query( "SET sql_mode = $mode", __METHOD__ );
- }
-
- $this->mOpened = true;
- wfProfileOut( __METHOD__ );
- return true;
+ return $conn;
}
/**
@@ -176,113 +88,6 @@ class DatabaseMysql extends DatabaseBase {
}
/**
- * @param $res ResultWrapper
- * @throws DBUnexpectedError
- */
- function freeResult( $res ) {
- if ( $res instanceof ResultWrapper ) {
- $res = $res->result;
- }
- wfSuppressWarnings();
- $ok = mysql_free_result( $res );
- wfRestoreWarnings();
- if ( !$ok ) {
- throw new DBUnexpectedError( $this, "Unable to free MySQL result" );
- }
- }
-
- /**
- * @param $res ResultWrapper
- * @return object|bool
- * @throws DBUnexpectedError
- */
- function fetchObject( $res ) {
- if ( $res instanceof ResultWrapper ) {
- $res = $res->result;
- }
- wfSuppressWarnings();
- $row = mysql_fetch_object( $res );
- wfRestoreWarnings();
-
- $errno = $this->lastErrno();
- // Unfortunately, mysql_fetch_object does not reset the last errno.
- // Only check for CR_SERVER_LOST and CR_UNKNOWN_ERROR, as
- // these are the only errors mysql_fetch_object can cause.
- // See http://dev.mysql.com/doc/refman/5.0/en/mysql-fetch-row.html.
- if( $errno == 2000 || $errno == 2013 ) {
- throw new DBUnexpectedError( $this, 'Error in fetchObject(): ' . htmlspecialchars( $this->lastError() ) );
- }
- return $row;
- }
-
- /**
- * @param $res ResultWrapper
- * @return array|bool
- * @throws DBUnexpectedError
- */
- function fetchRow( $res ) {
- if ( $res instanceof ResultWrapper ) {
- $res = $res->result;
- }
- wfSuppressWarnings();
- $row = mysql_fetch_array( $res );
- wfRestoreWarnings();
-
- $errno = $this->lastErrno();
- // Unfortunately, mysql_fetch_array does not reset the last errno.
- // Only check for CR_SERVER_LOST and CR_UNKNOWN_ERROR, as
- // these are the only errors mysql_fetch_object can cause.
- // See http://dev.mysql.com/doc/refman/5.0/en/mysql-fetch-row.html.
- if( $errno == 2000 || $errno == 2013 ) {
- throw new DBUnexpectedError( $this, 'Error in fetchRow(): ' . htmlspecialchars( $this->lastError() ) );
- }
- return $row;
- }
-
- /**
- * @throws DBUnexpectedError
- * @param $res ResultWrapper
- * @return int
- */
- function numRows( $res ) {
- if ( $res instanceof ResultWrapper ) {
- $res = $res->result;
- }
- wfSuppressWarnings();
- $n = mysql_num_rows( $res );
- wfRestoreWarnings();
- // Unfortunately, mysql_num_rows does not reset the last errno.
- // We are not checking for any errors here, since
- // these are no errors mysql_num_rows can cause.
- // See http://dev.mysql.com/doc/refman/5.0/en/mysql-fetch-row.html.
- // See https://bugzilla.wikimedia.org/42430
- return $n;
- }
-
- /**
- * @param $res ResultWrapper
- * @return int
- */
- function numFields( $res ) {
- if ( $res instanceof ResultWrapper ) {
- $res = $res->result;
- }
- return mysql_num_fields( $res );
- }
-
- /**
- * @param $res ResultWrapper
- * @param $n string
- * @return string
- */
- function fieldName( $res, $n ) {
- if ( $res instanceof ResultWrapper ) {
- $res = $res->result;
- }
- return mysql_field_name( $res, $n );
- }
-
- /**
* @return int
*/
function insertId() {
@@ -290,18 +95,6 @@ class DatabaseMysql extends DatabaseBase {
}
/**
- * @param $res ResultWrapper
- * @param $row
- * @return bool
- */
- function dataSeek( $res, $row ) {
- if ( $res instanceof ResultWrapper ) {
- $res = $res->result;
- }
- return mysql_data_seek( $res, $row );
- }
-
- /**
* @return int
*/
function lastErrno() {
@@ -313,27 +106,6 @@ class DatabaseMysql extends DatabaseBase {
}
/**
- * @return string
- */
- function lastError() {
- if ( $this->mConn ) {
- # Even if it's non-zero, it can still be invalid
- wfSuppressWarnings();
- $error = mysql_error( $this->mConn );
- if ( !$error ) {
- $error = mysql_error();
- }
- wfRestoreWarnings();
- } else {
- $error = mysql_error();
- }
- if( $error ) {
- $error .= ' (' . $this->mServer . ')';
- }
- return $error;
- }
-
- /**
* @return int
*/
function affectedRows() {
@@ -341,100 +113,6 @@ class DatabaseMysql extends DatabaseBase {
}
/**
- * @param $table string
- * @param $uniqueIndexes
- * @param $rows array
- * @param $fname string
- * @return ResultWrapper
- */
- function replace( $table, $uniqueIndexes, $rows, $fname = 'DatabaseMysql::replace' ) {
- return $this->nativeReplace( $table, $rows, $fname );
- }
-
- /**
- * Estimate rows in dataset
- * Returns estimated count, based on EXPLAIN output
- * Takes same arguments as Database::select()
- *
- * @param $table string|array
- * @param $vars string|array
- * @param $conds string|array
- * @param $fname string
- * @param $options string|array
- * @return int
- */
- 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 ) {
- return false;
- }
- if ( !$this->numRows( $res ) ) {
- return 0;
- }
-
- $rows = 1;
- foreach ( $res as $plan ) {
- $rows *= $plan->rows > 0 ? $plan->rows : 1; // avoid resetting to zero
- }
- return $rows;
- }
-
- /**
- * @param $table string
- * @param $field string
- * @return bool|MySQLField
- */
- function fieldInfo( $table, $field ) {
- $table = $this->tableName( $table );
- $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 );
- if( $field == $meta->name ) {
- return new MySQLField( $meta );
- }
- }
- return false;
- }
-
- /**
- * Get information about an index into an object
- * Returns false if the index does not exist
- *
- * @param $table string
- * @param $index string
- * @param $fname string
- * @return bool|array|null False or null on failure
- */
- 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;
- }
-
- /**
* @param $db
* @return bool
*/
@@ -444,596 +122,53 @@ class DatabaseMysql extends DatabaseBase {
}
/**
- * @param $s string
- *
- * @return string
- */
- function strencode( $s ) {
- $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".
- *
- * @param $s string
- *
- * @return string
- */
- public function addIdentifierQuotes( $s ) {
- return "`" . $this->strencode( $s ) . "`";
- }
-
- /**
- * @param $name string
- * @return bool
- */
- public function isQuotedIdentifier( $name ) {
- return strlen( $name ) && $name[0] == '`' && substr( $name, -1, 1 ) == '`';
- }
-
- /**
- * @return bool
- */
- function ping() {
- $ping = mysql_ping( $this->mConn );
- if ( $ping ) {
- 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.
- *
- * This will do a SHOW SLAVE STATUS
- *
- * @return int
- */
- function getLag() {
- if ( !is_null( $this->mFakeSlaveLag ) ) {
- wfDebug( "getLag: fake slave lagged {$this->mFakeSlaveLag} seconds\n" );
- return $this->mFakeSlaveLag;
- }
-
- return $this->getLagFromSlaveStatus();
- }
-
- /**
- * @return bool|int
- */
- function getLagFromSlaveStatus() {
- $res = $this->query( 'SHOW SLAVE STATUS', __METHOD__ );
- if ( !$res ) {
- return false;
- }
- $row = $res->fetchObject();
- if ( !$row ) {
- return false;
- }
- if ( strval( $row->Seconds_Behind_Master ) === '' ) {
- return false;
- } else {
- return intval( $row->Seconds_Behind_Master );
- }
- }
-
- /**
- * @deprecated in 1.19, use getLagFromSlaveStatus
- *
- * @return bool|int
- */
- function getLagFromProcesslist() {
- wfDeprecated( __METHOD__, '1.19' );
- $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;
- }
-
- /**
- * Wait for the slave to catch up to a given master position.
- *
- * @param $pos DBMasterPos object
- * @param $timeout Integer: the maximum number of seconds to wait for synchronisation
- * @return bool|string
- */
- function masterPosWait( DBMasterPos $pos, $timeout ) {
- $fname = 'DatabaseBase::masterPosWait';
- wfProfileIn( $fname );
-
- # Commit any open transactions
- if ( $this->mTrxLevel ) {
- $this->commit( __METHOD__ );
- }
-
- if ( !is_null( $this->mFakeSlaveLag ) ) {
- $status = parent::masterPosWait( $pos, $timeout );
- wfProfileOut( $fname );
- return $status;
- }
-
- # Call doQuery() directly, to avoid opening a transaction if DBO_TRX is set
- $encFile = $this->addQuotes( $pos->file );
- $encPos = intval( $pos->pos );
- $sql = "SELECT MASTER_POS_WAIT($encFile, $encPos, $timeout)";
- $res = $this->doQuery( $sql );
-
- if ( $res && $row = $this->fetchRow( $res ) ) {
- wfProfileOut( $fname );
- return $row[0];
- }
- wfProfileOut( $fname );
- return false;
- }
-
- /**
- * Get the position of the master from SHOW SLAVE STATUS
- *
- * @return MySQLMasterPos|bool
- */
- function getSlavePos() {
- if ( !is_null( $this->mFakeSlaveLag ) ) {
- return parent::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;
- return new MySQLMasterPos( $row->Relay_Master_Log_File, $pos );
- } else {
- return false;
- }
- }
-
- /**
- * Get the position of the master from SHOW MASTER STATUS
- *
- * @return MySQLMasterPos|bool
- */
- function getMasterPos() {
- if ( $this->mFakeMaster ) {
- return parent::getMasterPos();
- }
-
- $res = $this->query( 'SHOW MASTER STATUS', 'DatabaseBase::getMasterPos' );
- $row = $this->fetchObject( $res );
-
- if ( $row ) {
- return new MySQLMasterPos( $row->File, $row->Position );
- } else {
- return false;
- }
- }
-
- /**
* @return string
*/
function getServerVersion() {
return mysql_get_server_info( $this->mConn );
}
- /**
- * @param $index
- * @return string
- */
- function useIndexClause( $index ) {
- return "FORCE INDEX (" . $this->indexName( $index ) . ")";
- }
-
- /**
- * @return string
- */
- function lowPriorityOption() {
- return 'LOW_PRIORITY';
+ protected function mysqlFreeResult( $res ) {
+ return mysql_free_result( $res );
}
- /**
- * @return string
- */
- public static function getSoftwareLink() {
- return '[http://www.mysql.com/ MySQL]';
- }
-
- /**
- * @param $options array
- */
- public function setSessionOptions( array $options ) {
- if ( isset( $options['connTimeout'] ) ) {
- $timeout = (int)$options['connTimeout'];
- $this->query( "SET net_read_timeout=$timeout" );
- $this->query( "SET net_write_timeout=$timeout" );
- }
+ protected function mysqlFetchObject( $res ) {
+ return mysql_fetch_object( $res );
}
- public function streamStatementEnd( &$sql, &$newLine ) {
- if ( strtoupper( substr( $newLine, 0, 9 ) ) == 'DELIMITER' ) {
- preg_match( '/^DELIMITER\s+(\S+)/', $newLine, $m );
- $this->delimiter = $m[1];
- $newLine = '';
- }
- return parent::streamStatementEnd( $sql, $newLine );
+ protected function mysqlFetchArray( $res ) {
+ return mysql_fetch_array( $res );
}
- /**
- * Check to see if a named lock is available. This is non-blocking.
- *
- * @param string $lockName name of lock to poll
- * @param string $method name of method calling us
- * @return Boolean
- * @since 1.20
- */
- public function lockIsFree( $lockName, $method ) {
- $lockName = $this->addQuotes( $lockName );
- $result = $this->query( "SELECT IS_FREE_LOCK($lockName) AS lockstatus", $method );
- $row = $this->fetchObject( $result );
- return ( $row->lockstatus == 1 );
+ protected function mysqlNumRows( $res ) {
+ return mysql_num_rows( $res );
}
- /**
- * @param $lockName string
- * @param $method string
- * @param $timeout int
- * @return bool
- */
- public function lock( $lockName, $method, $timeout = 5 ) {
- $lockName = $this->addQuotes( $lockName );
- $result = $this->query( "SELECT GET_LOCK($lockName, $timeout) AS lockstatus", $method );
- $row = $this->fetchObject( $result );
-
- if( $row->lockstatus == 1 ) {
- return true;
- } else {
- wfDebug( __METHOD__ . " failed to acquire lock\n" );
- return false;
- }
- }
-
- /**
- * FROM MYSQL DOCS: http://dev.mysql.com/doc/refman/5.0/en/miscellaneous-functions.html#function_release-lock
- * @param $lockName string
- * @param $method string
- * @return bool
- */
- public function unlock( $lockName, $method ) {
- $lockName = $this->addQuotes( $lockName );
- $result = $this->query( "SELECT RELEASE_LOCK($lockName) as lockstatus", $method );
- $row = $this->fetchObject( $result );
- return ( $row->lockstatus == 1 );
- }
-
- /**
- * @param $read array
- * @param $write array
- * @param $method string
- * @param $lowPriority bool
- * @return bool
- */
- public function lockTables( $read, $write, $method, $lowPriority = true ) {
- $items = array();
-
- foreach( $write as $table ) {
- $tbl = $this->tableName( $table ) .
- ( $lowPriority ? ' LOW_PRIORITY' : '' ) .
- ' WRITE';
- $items[] = $tbl;
- }
- foreach( $read as $table ) {
- $items[] = $this->tableName( $table ) . ' READ';
- }
- $sql = "LOCK TABLES " . implode( ',', $items );
- $this->query( $sql, $method );
- return true;
- }
-
- /**
- * @param $method string
- * @return bool
- */
- public function unlockTables( $method ) {
- $this->query( "UNLOCK TABLES", $method );
- return true;
- }
-
- /**
- * 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';
- }
-
- /**
- * @param bool $value
- * @return mixed
- */
- public function setBigSelects( $value = true ) {
- if ( $value === 'default' ) {
- if ( $this->mDefaultBigSelects === null ) {
- # Function hasn't been called before so it must already be set to the default
- return;
- } else {
- $value = $this->mDefaultBigSelects;
- }
- } elseif ( $this->mDefaultBigSelects === null ) {
- $this->mDefaultBigSelects = (bool)$this->selectField( false, '@@sql_big_selects' );
- }
- $encValue = $value ? '1' : '0';
- $this->query( "SET sql_big_selects=$encValue", __METHOD__ );
- }
-
- /**
- * DELETE where the condition is a join. MySql uses multi-table deletes.
- * @param $delTable string
- * @param $joinTable string
- * @param $delVar string
- * @param $joinVar string
- * @param $conds array|string
- * @param bool|string $fname bool
- * @throws DBUnexpectedError
- * @return bool|ResultWrapper
- */
- function deleteJoin( $delTable, $joinTable, $delVar, $joinVar, $conds, $fname = 'DatabaseBase::deleteJoin' ) {
- if ( !$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 );
- }
-
- return $this->query( $sql, $fname );
- }
-
- /**
- * Determines how long the server has been up
- *
- * @return int
- */
- function getServerUptime() {
- $vars = $this->getMysqlStatus( 'Uptime' );
- return (int)$vars['Uptime'];
- }
-
- /**
- * Determines if the last failure was due to a deadlock
- *
- * @return bool
- */
- function wasDeadlock() {
- return $this->lastErrno() == 1213;
- }
-
- /**
- * Determines if the last failure was due to a lock timeout
- *
- * @return bool
- */
- function wasLockTimeout() {
- return $this->lastErrno() == 1205;
- }
-
- /**
- * Determines if the last query error was something that should be dealt
- * with by pinging the connection and reissuing the query
- *
- * @return bool
- */
- function wasErrorReissuable() {
- return $this->lastErrno() == 2013 || $this->lastErrno() == 2006;
- }
-
- /**
- * Determines if the last failure was due to the database being read-only.
- *
- * @return bool
- */
- function wasReadOnlyError() {
- return $this->lastErrno() == 1223 ||
- ( $this->lastErrno() == 1290 && strpos( $this->lastError(), '--read-only' ) !== false );
- }
-
- /**
- * @param $oldName
- * @param $newName
- * @param $temporary bool
- * @param $fname string
- */
- function duplicateTableStructure( $oldName, $newName, $temporary = false, $fname = 'DatabaseMysql::duplicateTableStructure' ) {
- $tmp = $temporary ? 'TEMPORARY ' : '';
- $newName = $this->addIdentifierQuotes( $newName );
- $oldName = $this->addIdentifierQuotes( $oldName );
- $query = "CREATE $tmp TABLE $newName (LIKE $oldName)";
- $this->query( $query, $fname );
- }
-
- /**
- * List all tables on the database
- *
- * @param string $prefix Only show tables with this prefix, e.g. mw_
- * @param string $fname calling function name
- * @return array
- */
- function listTables( $prefix = null, $fname = 'DatabaseMysql::listTables' ) {
- $result = $this->query( "SHOW TABLES", $fname);
-
- $endArray = array();
-
- foreach( $result as $table ) {
- $vars = get_object_vars( $table );
- $table = array_pop( $vars );
-
- if( !$prefix || strpos( $table, $prefix ) === 0 ) {
- $endArray[] = $table;
- }
- }
-
- return $endArray;
- }
-
- /**
- * @param $tableName
- * @param $fName string
- * @return bool|ResultWrapper
- */
- public function dropTable( $tableName, $fName = 'DatabaseMysql::dropTable' ) {
- if( !$this->tableExists( $tableName, $fName ) ) {
- return false;
- }
- return $this->query( "DROP TABLE IF EXISTS " . $this->tableName( $tableName ), $fName );
- }
-
- /**
- * @return array
- */
- protected function getDefaultSchemaVars() {
- $vars = parent::getDefaultSchemaVars();
- $vars['wgDBTableOptions'] = str_replace( 'TYPE', 'ENGINE', $GLOBALS['wgDBTableOptions'] );
- $vars['wgDBTableOptions'] = str_replace( 'CHARSET=mysql4', 'CHARSET=binary', $vars['wgDBTableOptions'] );
- return $vars;
- }
-
- /**
- * Get status information from SHOW STATUS in an associative array
- *
- * @param $which string
- * @return array
- */
- function getMysqlStatus( $which = "%" ) {
- $res = $this->query( "SHOW STATUS LIKE '{$which}'" );
- $status = array();
-
- foreach ( $res as $row ) {
- $status[$row->Variable_name] = $row->Value;
- }
-
- return $status;
- }
-
-}
-
-/**
- * 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;
- }
-
- /**
- * @return string
- */
- function name() {
- return $this->name;
- }
-
- /**
- * @return string
- */
- function tableName() {
- return $this->tableName;
- }
-
- /**
- * @return string
- */
- function type() {
- return $this->type;
+ protected function mysqlNumFields( $res ) {
+ return mysql_num_fields( $res );
}
- /**
- * @return bool
- */
- function isNullable() {
- return $this->nullable;
+ protected function mysqlFetchField( $res, $n ) {
+ return mysql_fetch_field( $res, $n );
}
- function defaultValue() {
- return $this->default;
+ protected function mysqlFieldName( $res, $n ) {
+ return mysql_field_name( $res, $n );
}
- /**
- * @return bool
- */
- function isKey() {
- return $this->is_key;
+ protected function mysqlDataSeek( $res, $row ) {
+ return mysql_data_seek( $res, $row );
}
- /**
- * @return bool
- */
- function isMultipleKey() {
- return $this->is_multiple;
+ protected function mysqlError( $conn = null ) {
+ return ( $conn !== null ) ? mysql_error( $conn ) : mysql_error(); // avoid warning
}
-}
-
-class MySQLMasterPos implements DBMasterPos {
- var $file, $pos;
- function __construct( $file, $pos ) {
- $this->file = $file;
- $this->pos = $pos;
+ protected function mysqlRealEscapeString( $s ) {
+ return mysql_real_escape_string( $s, $this->mConn );
}
- function __toString() {
- return "{$this->file}/{$this->pos}";
+ protected function mysqlPing() {
+ return mysql_ping( $this->mConn );
}
}
diff --git a/includes/db/DatabaseMysqlBase.php b/includes/db/DatabaseMysqlBase.php
new file mode 100644
index 00000000..26c9d247
--- /dev/null
+++ b/includes/db/DatabaseMysqlBase.php
@@ -0,0 +1,1154 @@
+<?php
+/**
+ * This is the MySQL database abstraction layer.
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with this program; if not, write to the Free Software Foundation, Inc.,
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ * http://www.gnu.org/copyleft/gpl.html
+ *
+ * @file
+ * @ingroup Database
+ */
+
+/**
+ * Database abstraction object for MySQL.
+ * Defines methods independent on used MySQL extension.
+ *
+ * @ingroup Database
+ * @since 1.22
+ * @see Database
+ */
+abstract class DatabaseMysqlBase extends DatabaseBase {
+ /** @var MysqlMasterPos */
+ protected $lastKnownSlavePos;
+
+ /**
+ * @return string
+ */
+ function getType() {
+ return 'mysql';
+ }
+
+ /**
+ * @param $server string
+ * @param $user string
+ * @param $password string
+ * @param $dbName string
+ * @return bool
+ * @throws DBConnectionError
+ */
+ function open( $server, $user, $password, $dbName ) {
+ global $wgAllDBsAreLocalhost, $wgDBmysql5, $wgSQLMode;
+ wfProfileIn( __METHOD__ );
+
+ # Debugging hack -- fake cluster
+ if ( $wgAllDBsAreLocalhost ) {
+ $realServer = 'localhost';
+ } else {
+ $realServer = $server;
+ }
+ $this->close();
+ $this->mServer = $server;
+ $this->mUser = $user;
+ $this->mPassword = $password;
+ $this->mDBname = $dbName;
+
+ wfProfileIn( "dbconnect-$server" );
+
+ # The kernel's default SYN retransmission period is far too slow for us,
+ # so we use a short timeout plus a manual retry. Retrying means that a small
+ # but finite rate of SYN packet loss won't cause user-visible errors.
+ $this->mConn = false;
+ $this->installErrorHandler();
+ try {
+ $this->mConn = $this->mysqlConnect( $realServer );
+ } catch ( Exception $ex ) {
+ wfProfileOut( "dbconnect-$server" );
+ wfProfileOut( __METHOD__ );
+ throw $ex;
+ }
+ $error = $this->restoreErrorHandler();
+
+ wfProfileOut( "dbconnect-$server" );
+
+ # Always log connection errors
+ if ( !$this->mConn ) {
+ if ( !$error ) {
+ $error = $this->lastError();
+ }
+ wfLogDBError( "Error connecting to {$this->mServer}: $error\n" );
+ wfDebug( "DB connection error\n" .
+ "Server: $server, User: $user, Password: " .
+ substr( $password, 0, 3 ) . "..., error: " . $error . "\n" );
+
+ wfProfileOut( __METHOD__ );
+ return $this->reportConnectionError( $error );
+ }
+
+ if ( $dbName != '' ) {
+ wfSuppressWarnings();
+ $success = $this->selectDB( $dbName );
+ wfRestoreWarnings();
+ if ( !$success ) {
+ wfLogDBError( "Error selecting database $dbName on server {$this->mServer}\n" );
+ wfDebug( "Error selecting database $dbName on server {$this->mServer} " .
+ "from client host " . wfHostname() . "\n" );
+
+ wfProfileOut( __METHOD__ );
+ return $this->reportConnectionError( "Error selecting database $dbName" );
+ }
+ }
+
+ // Tell the server we're communicating with it in UTF-8.
+ // This may engage various charset conversions.
+ 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
+ if ( is_string( $wgSQLMode ) ) {
+ $mode = $this->addQuotes( $wgSQLMode );
+ $this->query( "SET sql_mode = $mode", __METHOD__ );
+ }
+
+ $this->mOpened = true;
+ wfProfileOut( __METHOD__ );
+ return true;
+ }
+
+ /**
+ * Open a connection to a MySQL server
+ *
+ * @param $realServer string
+ * @return mixed Raw connection
+ * @throws DBConnectionError
+ */
+ abstract protected function mysqlConnect( $realServer );
+
+ /**
+ * @param $res ResultWrapper
+ * @throws DBUnexpectedError
+ */
+ function freeResult( $res ) {
+ if ( $res instanceof ResultWrapper ) {
+ $res = $res->result;
+ }
+ wfSuppressWarnings();
+ $ok = $this->mysqlFreeResult( $res );
+ wfRestoreWarnings();
+ if ( !$ok ) {
+ throw new DBUnexpectedError( $this, "Unable to free MySQL result" );
+ }
+ }
+
+ /**
+ * Free result memory
+ *
+ * @param $res Raw result
+ * @return bool
+ */
+ abstract protected function mysqlFreeResult( $res );
+
+ /**
+ * @param $res ResultWrapper
+ * @return object|bool
+ * @throws DBUnexpectedError
+ */
+ function fetchObject( $res ) {
+ if ( $res instanceof ResultWrapper ) {
+ $res = $res->result;
+ }
+ wfSuppressWarnings();
+ $row = $this->mysqlFetchObject( $res );
+ wfRestoreWarnings();
+
+ $errno = $this->lastErrno();
+ // Unfortunately, mysql_fetch_object does not reset the last errno.
+ // Only check for CR_SERVER_LOST and CR_UNKNOWN_ERROR, as
+ // these are the only errors mysql_fetch_object can cause.
+ // See http://dev.mysql.com/doc/refman/5.0/en/mysql-fetch-row.html.
+ if ( $errno == 2000 || $errno == 2013 ) {
+ throw new DBUnexpectedError( $this, 'Error in fetchObject(): ' . htmlspecialchars( $this->lastError() ) );
+ }
+ return $row;
+ }
+
+ /**
+ * Fetch a result row as an object
+ *
+ * @param $res Raw result
+ * @return stdClass
+ */
+ abstract protected function mysqlFetchObject( $res );
+
+ /**
+ * @param $res ResultWrapper
+ * @return array|bool
+ * @throws DBUnexpectedError
+ */
+ function fetchRow( $res ) {
+ if ( $res instanceof ResultWrapper ) {
+ $res = $res->result;
+ }
+ wfSuppressWarnings();
+ $row = $this->mysqlFetchArray( $res );
+ wfRestoreWarnings();
+
+ $errno = $this->lastErrno();
+ // Unfortunately, mysql_fetch_array does not reset the last errno.
+ // Only check for CR_SERVER_LOST and CR_UNKNOWN_ERROR, as
+ // these are the only errors mysql_fetch_array can cause.
+ // See http://dev.mysql.com/doc/refman/5.0/en/mysql-fetch-row.html.
+ if ( $errno == 2000 || $errno == 2013 ) {
+ throw new DBUnexpectedError( $this, 'Error in fetchRow(): ' . htmlspecialchars( $this->lastError() ) );
+ }
+ return $row;
+ }
+
+ /**
+ * Fetch a result row as an associative and numeric array
+ *
+ * @param $res Raw result
+ * @return array
+ */
+ abstract protected function mysqlFetchArray( $res );
+
+ /**
+ * @throws DBUnexpectedError
+ * @param $res ResultWrapper
+ * @return int
+ */
+ function numRows( $res ) {
+ if ( $res instanceof ResultWrapper ) {
+ $res = $res->result;
+ }
+ wfSuppressWarnings();
+ $n = $this->mysqlNumRows( $res );
+ wfRestoreWarnings();
+ // Unfortunately, mysql_num_rows does not reset the last errno.
+ // We are not checking for any errors here, since
+ // these are no errors mysql_num_rows can cause.
+ // See http://dev.mysql.com/doc/refman/5.0/en/mysql-fetch-row.html.
+ // See https://bugzilla.wikimedia.org/42430
+ return $n;
+ }
+
+ /**
+ * Get number of rows in result
+ *
+ * @param $res Raw result
+ * @return int
+ */
+ abstract protected function mysqlNumRows( $res );
+
+ /**
+ * @param $res ResultWrapper
+ * @return int
+ */
+ function numFields( $res ) {
+ if ( $res instanceof ResultWrapper ) {
+ $res = $res->result;
+ }
+ return $this->mysqlNumFields( $res );
+ }
+
+ /**
+ * Get number of fields in result
+ *
+ * @param $res Raw result
+ * @return int
+ */
+ abstract protected function mysqlNumFields( $res );
+
+ /**
+ * @param $res ResultWrapper
+ * @param $n string
+ * @return string
+ */
+ function fieldName( $res, $n ) {
+ if ( $res instanceof ResultWrapper ) {
+ $res = $res->result;
+ }
+ return $this->mysqlFieldName( $res, $n );
+ }
+
+ /**
+ * Get the name of the specified field in a result
+ *
+ * @param $res Raw result
+ * @param $n int
+ * @return string
+ */
+ abstract protected function mysqlFieldName( $res, $n );
+
+ /**
+ * @param $res ResultWrapper
+ * @param $row
+ * @return bool
+ */
+ function dataSeek( $res, $row ) {
+ if ( $res instanceof ResultWrapper ) {
+ $res = $res->result;
+ }
+ return $this->mysqlDataSeek( $res, $row );
+ }
+
+ /**
+ * Move internal result pointer
+ *
+ * @param $res Raw result
+ * @param $row int
+ * @return bool
+ */
+ abstract protected function mysqlDataSeek( $res, $row );
+
+ /**
+ * @return string
+ */
+ function lastError() {
+ if ( $this->mConn ) {
+ # Even if it's non-zero, it can still be invalid
+ wfSuppressWarnings();
+ $error = $this->mysqlError( $this->mConn );
+ if ( !$error ) {
+ $error = $this->mysqlError();
+ }
+ wfRestoreWarnings();
+ } else {
+ $error = $this->mysqlError();
+ }
+ if ( $error ) {
+ $error .= ' (' . $this->mServer . ')';
+ }
+ return $error;
+ }
+
+ /**
+ * Returns the text of the error message from previous MySQL operation
+ *
+ * @param $conn Raw connection
+ * @return string
+ */
+ abstract protected function mysqlError( $conn = null );
+
+ /**
+ * @param $table string
+ * @param $uniqueIndexes
+ * @param $rows array
+ * @param $fname string
+ * @return ResultWrapper
+ */
+ function replace( $table, $uniqueIndexes, $rows, $fname = __METHOD__ ) {
+ return $this->nativeReplace( $table, $rows, $fname );
+ }
+
+ /**
+ * Estimate rows in dataset
+ * Returns estimated count, based on EXPLAIN output
+ * Takes same arguments as Database::select()
+ *
+ * @param $table string|array
+ * @param $vars string|array
+ * @param $conds string|array
+ * @param $fname string
+ * @param $options string|array
+ * @return int
+ */
+ public function estimateRowCount( $table, $vars = '*', $conds = '', $fname = __METHOD__, $options = array() ) {
+ $options['EXPLAIN'] = true;
+ $res = $this->select( $table, $vars, $conds, $fname, $options );
+ if ( $res === false ) {
+ return false;
+ }
+ if ( !$this->numRows( $res ) ) {
+ return 0;
+ }
+
+ $rows = 1;
+ foreach ( $res as $plan ) {
+ $rows *= $plan->rows > 0 ? $plan->rows : 1; // avoid resetting to zero
+ }
+ return $rows;
+ }
+
+ /**
+ * @param $table string
+ * @param $field string
+ * @return bool|MySQLField
+ */
+ function fieldInfo( $table, $field ) {
+ $table = $this->tableName( $table );
+ $res = $this->query( "SELECT * FROM $table LIMIT 1", __METHOD__, true );
+ if ( !$res ) {
+ return false;
+ }
+ $n = $this->mysqlNumFields( $res->result );
+ for ( $i = 0; $i < $n; $i++ ) {
+ $meta = $this->mysqlFetchField( $res->result, $i );
+ if ( $field == $meta->name ) {
+ return new MySQLField( $meta );
+ }
+ }
+ return false;
+ }
+
+ /**
+ * Get column information from a result
+ *
+ * @param $res Raw result
+ * @param $n int
+ * @return stdClass
+ */
+ abstract protected function mysqlFetchField( $res, $n );
+
+ /**
+ * Get information about an index into an object
+ * Returns false if the index does not exist
+ *
+ * @param $table string
+ * @param $index string
+ * @param $fname string
+ * @return bool|array|null False or null on failure
+ */
+ function indexInfo( $table, $index, $fname = __METHOD__ ) {
+ # 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;
+ }
+
+ /**
+ * @param $s string
+ *
+ * @return string
+ */
+ function strencode( $s ) {
+ $sQuoted = $this->mysqlRealEscapeString( $s );
+
+ if ( $sQuoted === false ) {
+ $this->ping();
+ $sQuoted = $this->mysqlRealEscapeString( $s );
+ }
+ return $sQuoted;
+ }
+
+ /**
+ * MySQL uses `backticks` for identifier quoting instead of the sql standard "double quotes".
+ *
+ * @param $s string
+ *
+ * @return string
+ */
+ public function addIdentifierQuotes( $s ) {
+ // Characters in the range \u0001-\uFFFF are valid in a quoted identifier
+ // Remove NUL bytes and escape backticks by doubling
+ return '`' . str_replace( array( "\0", '`' ), array( '', '``' ), $s ) . '`';
+ }
+
+ /**
+ * @param $name string
+ * @return bool
+ */
+ public function isQuotedIdentifier( $name ) {
+ return strlen( $name ) && $name[0] == '`' && substr( $name, -1, 1 ) == '`';
+ }
+
+ /**
+ * @return bool
+ */
+ function ping() {
+ $ping = $this->mysqlPing();
+ if ( $ping ) {
+ return true;
+ }
+
+ $this->closeConnection();
+ $this->mOpened = false;
+ $this->mConn = false;
+ $this->open( $this->mServer, $this->mUser, $this->mPassword, $this->mDBname );
+ return true;
+ }
+
+ /**
+ * Ping a server connection or reconnect if there is no connection
+ *
+ * @return bool
+ */
+ abstract protected function mysqlPing();
+
+ /**
+ * Returns slave lag.
+ *
+ * This will do a SHOW SLAVE STATUS
+ *
+ * @return int
+ */
+ function getLag() {
+ if ( !is_null( $this->mFakeSlaveLag ) ) {
+ wfDebug( "getLag: fake slave lagged {$this->mFakeSlaveLag} seconds\n" );
+ return $this->mFakeSlaveLag;
+ }
+
+ return $this->getLagFromSlaveStatus();
+ }
+
+ /**
+ * @return bool|int
+ */
+ function getLagFromSlaveStatus() {
+ $res = $this->query( 'SHOW SLAVE STATUS', __METHOD__ );
+ if ( !$res ) {
+ return false;
+ }
+ $row = $res->fetchObject();
+ if ( !$row ) {
+ return false;
+ }
+ if ( strval( $row->Seconds_Behind_Master ) === '' ) {
+ return false;
+ } else {
+ return intval( $row->Seconds_Behind_Master );
+ }
+ }
+
+ /**
+ * @deprecated in 1.19, use getLagFromSlaveStatus
+ *
+ * @return bool|int
+ */
+ function getLagFromProcesslist() {
+ wfDeprecated( __METHOD__, '1.19' );
+ $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;
+ }
+
+ /**
+ * Wait for the slave to catch up to a given master position.
+ * @TODO: return values for this and base class are rubbish
+ *
+ * @param $pos DBMasterPos object
+ * @param $timeout Integer: the maximum number of seconds to wait for synchronisation
+ * @return bool|string
+ */
+ function masterPosWait( DBMasterPos $pos, $timeout ) {
+ if ( $this->lastKnownSlavePos && $this->lastKnownSlavePos->hasReached( $pos ) ) {
+ return '0'; // http://dev.mysql.com/doc/refman/5.0/en/miscellaneous-functions.html
+ }
+
+ wfProfileIn( __METHOD__ );
+ # Commit any open transactions
+ $this->commit( __METHOD__, 'flush' );
+
+ if ( !is_null( $this->mFakeSlaveLag ) ) {
+ $status = parent::masterPosWait( $pos, $timeout );
+ wfProfileOut( __METHOD__ );
+ return $status;
+ }
+
+ # Call doQuery() directly, to avoid opening a transaction if DBO_TRX is set
+ $encFile = $this->addQuotes( $pos->file );
+ $encPos = intval( $pos->pos );
+ $sql = "SELECT MASTER_POS_WAIT($encFile, $encPos, $timeout)";
+ $res = $this->doQuery( $sql );
+
+ $status = false;
+ if ( $res && $row = $this->fetchRow( $res ) ) {
+ $status = $row[0]; // can be NULL, -1, or 0+ per the MySQL manual
+ if ( ctype_digit( $status ) ) { // success
+ $this->lastKnownSlavePos = $pos;
+ }
+ }
+
+ wfProfileOut( __METHOD__ );
+ return $status;
+ }
+
+ /**
+ * Get the position of the master from SHOW SLAVE STATUS
+ *
+ * @return MySQLMasterPos|bool
+ */
+ function getSlavePos() {
+ if ( !is_null( $this->mFakeSlaveLag ) ) {
+ return parent::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;
+ return new MySQLMasterPos( $row->Relay_Master_Log_File, $pos );
+ } else {
+ return false;
+ }
+ }
+
+ /**
+ * Get the position of the master from SHOW MASTER STATUS
+ *
+ * @return MySQLMasterPos|bool
+ */
+ function getMasterPos() {
+ if ( $this->mFakeMaster ) {
+ return parent::getMasterPos();
+ }
+
+ $res = $this->query( 'SHOW MASTER STATUS', 'DatabaseBase::getMasterPos' );
+ $row = $this->fetchObject( $res );
+
+ if ( $row ) {
+ return new MySQLMasterPos( $row->File, $row->Position );
+ } else {
+ return false;
+ }
+ }
+
+ /**
+ * @param $index
+ * @return string
+ */
+ function useIndexClause( $index ) {
+ return "FORCE INDEX (" . $this->indexName( $index ) . ")";
+ }
+
+ /**
+ * @return string
+ */
+ function lowPriorityOption() {
+ return 'LOW_PRIORITY';
+ }
+
+ /**
+ * @return string
+ */
+ public function getSoftwareLink() {
+ return '[http://www.mysql.com/ MySQL]';
+ }
+
+ /**
+ * @param $options array
+ */
+ public function setSessionOptions( array $options ) {
+ if ( isset( $options['connTimeout'] ) ) {
+ $timeout = (int)$options['connTimeout'];
+ $this->query( "SET net_read_timeout=$timeout" );
+ $this->query( "SET net_write_timeout=$timeout" );
+ }
+ }
+
+ public function streamStatementEnd( &$sql, &$newLine ) {
+ if ( strtoupper( substr( $newLine, 0, 9 ) ) == 'DELIMITER' ) {
+ preg_match( '/^DELIMITER\s+(\S+)/', $newLine, $m );
+ $this->delimiter = $m[1];
+ $newLine = '';
+ }
+ return parent::streamStatementEnd( $sql, $newLine );
+ }
+
+ /**
+ * Check to see if a named lock is available. This is non-blocking.
+ *
+ * @param string $lockName name of lock to poll
+ * @param string $method name of method calling us
+ * @return Boolean
+ * @since 1.20
+ */
+ public function lockIsFree( $lockName, $method ) {
+ $lockName = $this->addQuotes( $lockName );
+ $result = $this->query( "SELECT IS_FREE_LOCK($lockName) AS lockstatus", $method );
+ $row = $this->fetchObject( $result );
+ return ( $row->lockstatus == 1 );
+ }
+
+ /**
+ * @param $lockName string
+ * @param $method string
+ * @param $timeout int
+ * @return bool
+ */
+ public function lock( $lockName, $method, $timeout = 5 ) {
+ $lockName = $this->addQuotes( $lockName );
+ $result = $this->query( "SELECT GET_LOCK($lockName, $timeout) AS lockstatus", $method );
+ $row = $this->fetchObject( $result );
+
+ if ( $row->lockstatus == 1 ) {
+ return true;
+ } else {
+ wfDebug( __METHOD__ . " failed to acquire lock\n" );
+ return false;
+ }
+ }
+
+ /**
+ * FROM MYSQL DOCS: http://dev.mysql.com/doc/refman/5.0/en/miscellaneous-functions.html#function_release-lock
+ * @param $lockName string
+ * @param $method string
+ * @return bool
+ */
+ public function unlock( $lockName, $method ) {
+ $lockName = $this->addQuotes( $lockName );
+ $result = $this->query( "SELECT RELEASE_LOCK($lockName) as lockstatus", $method );
+ $row = $this->fetchObject( $result );
+ return ( $row->lockstatus == 1 );
+ }
+
+ /**
+ * @param $read array
+ * @param $write array
+ * @param $method string
+ * @param $lowPriority bool
+ * @return bool
+ */
+ public function lockTables( $read, $write, $method, $lowPriority = true ) {
+ $items = array();
+
+ foreach ( $write as $table ) {
+ $tbl = $this->tableName( $table ) .
+ ( $lowPriority ? ' LOW_PRIORITY' : '' ) .
+ ' WRITE';
+ $items[] = $tbl;
+ }
+ foreach ( $read as $table ) {
+ $items[] = $this->tableName( $table ) . ' READ';
+ }
+ $sql = "LOCK TABLES " . implode( ',', $items );
+ $this->query( $sql, $method );
+ return true;
+ }
+
+ /**
+ * @param $method string
+ * @return bool
+ */
+ public function unlockTables( $method ) {
+ $this->query( "UNLOCK TABLES", $method );
+ return true;
+ }
+
+ /**
+ * 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';
+ }
+
+ /**
+ * @param bool $value
+ * @return mixed
+ */
+ public function setBigSelects( $value = true ) {
+ if ( $value === 'default' ) {
+ if ( $this->mDefaultBigSelects === null ) {
+ # Function hasn't been called before so it must already be set to the default
+ return;
+ } else {
+ $value = $this->mDefaultBigSelects;
+ }
+ } elseif ( $this->mDefaultBigSelects === null ) {
+ $this->mDefaultBigSelects = (bool)$this->selectField( false, '@@sql_big_selects' );
+ }
+ $encValue = $value ? '1' : '0';
+ $this->query( "SET sql_big_selects=$encValue", __METHOD__ );
+ }
+
+ /**
+ * DELETE where the condition is a join. MySql uses multi-table deletes.
+ * @param $delTable string
+ * @param $joinTable string
+ * @param $delVar string
+ * @param $joinVar string
+ * @param $conds array|string
+ * @param bool|string $fname bool
+ * @throws DBUnexpectedError
+ * @return bool|ResultWrapper
+ */
+ function deleteJoin( $delTable, $joinTable, $delVar, $joinVar, $conds, $fname = __METHOD__ ) {
+ if ( !$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 );
+ }
+
+ return $this->query( $sql, $fname );
+ }
+
+ /**
+ * @param string $table
+ * @param array $rows
+ * @param array $uniqueIndexes
+ * @param array $set
+ * @param string $fname
+ * @param array $options
+ * @return bool
+ */
+ public function upsert(
+ $table, array $rows, array $uniqueIndexes, array $set, $fname = __METHOD__
+ ) {
+ if ( !count( $rows ) ) {
+ return true; // nothing to do
+ }
+ $rows = is_array( reset( $rows ) ) ? $rows : array( $rows );
+
+ $table = $this->tableName( $table );
+ $columns = array_keys( $rows[0] );
+
+ $sql = "INSERT INTO $table (" . implode( ',', $columns ) . ') VALUES ';
+ $rowTuples = array();
+ foreach ( $rows as $row ) {
+ $rowTuples[] = '(' . $this->makeList( $row ) . ')';
+ }
+ $sql .= implode( ',', $rowTuples );
+ $sql .= " ON DUPLICATE KEY UPDATE " . $this->makeList( $set, LIST_SET );
+
+ return (bool)$this->query( $sql, $fname );
+ }
+
+ /**
+ * Determines how long the server has been up
+ *
+ * @return int
+ */
+ function getServerUptime() {
+ $vars = $this->getMysqlStatus( 'Uptime' );
+ return (int)$vars['Uptime'];
+ }
+
+ /**
+ * Determines if the last failure was due to a deadlock
+ *
+ * @return bool
+ */
+ function wasDeadlock() {
+ return $this->lastErrno() == 1213;
+ }
+
+ /**
+ * Determines if the last failure was due to a lock timeout
+ *
+ * @return bool
+ */
+ function wasLockTimeout() {
+ return $this->lastErrno() == 1205;
+ }
+
+ /**
+ * Determines if the last query error was something that should be dealt
+ * with by pinging the connection and reissuing the query
+ *
+ * @return bool
+ */
+ function wasErrorReissuable() {
+ return $this->lastErrno() == 2013 || $this->lastErrno() == 2006;
+ }
+
+ /**
+ * Determines if the last failure was due to the database being read-only.
+ *
+ * @return bool
+ */
+ function wasReadOnlyError() {
+ return $this->lastErrno() == 1223 ||
+ ( $this->lastErrno() == 1290 && strpos( $this->lastError(), '--read-only' ) !== false );
+ }
+
+ /**
+ * @param $oldName
+ * @param $newName
+ * @param $temporary bool
+ * @param $fname string
+ */
+ function duplicateTableStructure( $oldName, $newName, $temporary = false, $fname = __METHOD__ ) {
+ $tmp = $temporary ? 'TEMPORARY ' : '';
+ $newName = $this->addIdentifierQuotes( $newName );
+ $oldName = $this->addIdentifierQuotes( $oldName );
+ $query = "CREATE $tmp TABLE $newName (LIKE $oldName)";
+ $this->query( $query, $fname );
+ }
+
+ /**
+ * List all tables on the database
+ *
+ * @param string $prefix Only show tables with this prefix, e.g. mw_
+ * @param string $fname calling function name
+ * @return array
+ */
+ function listTables( $prefix = null, $fname = __METHOD__ ) {
+ $result = $this->query( "SHOW TABLES", $fname );
+
+ $endArray = array();
+
+ foreach ( $result as $table ) {
+ $vars = get_object_vars( $table );
+ $table = array_pop( $vars );
+
+ if ( !$prefix || strpos( $table, $prefix ) === 0 ) {
+ $endArray[] = $table;
+ }
+ }
+
+ return $endArray;
+ }
+
+ /**
+ * @param $tableName
+ * @param $fName string
+ * @return bool|ResultWrapper
+ */
+ public function dropTable( $tableName, $fName = __METHOD__ ) {
+ if ( !$this->tableExists( $tableName, $fName ) ) {
+ return false;
+ }
+ return $this->query( "DROP TABLE IF EXISTS " . $this->tableName( $tableName ), $fName );
+ }
+
+ /**
+ * @return array
+ */
+ protected function getDefaultSchemaVars() {
+ $vars = parent::getDefaultSchemaVars();
+ $vars['wgDBTableOptions'] = str_replace( 'TYPE', 'ENGINE', $GLOBALS['wgDBTableOptions'] );
+ $vars['wgDBTableOptions'] = str_replace( 'CHARSET=mysql4', 'CHARSET=binary', $vars['wgDBTableOptions'] );
+ return $vars;
+ }
+
+ /**
+ * Get status information from SHOW STATUS in an associative array
+ *
+ * @param $which string
+ * @return array
+ */
+ function getMysqlStatus( $which = "%" ) {
+ $res = $this->query( "SHOW STATUS LIKE '{$which}'" );
+ $status = array();
+
+ foreach ( $res as $row ) {
+ $status[$row->Variable_name] = $row->Value;
+ }
+
+ return $status;
+ }
+
+ /**
+ * Lists VIEWs in the database
+ *
+ * @param string $prefix Only show VIEWs with this prefix, eg.
+ * unit_test_, or $wgDBprefix. Default: null, would return all views.
+ * @param string $fname Name of calling function
+ * @return array
+ * @since 1.22
+ */
+ public function listViews( $prefix = null, $fname = __METHOD__ ) {
+
+ if ( !isset( $this->allViews ) ) {
+
+ // The name of the column containing the name of the VIEW
+ $propertyName = 'Tables_in_' . $this->mDBname;
+
+ // Query for the VIEWS
+ $result = $this->query( 'SHOW FULL TABLES WHERE TABLE_TYPE = "VIEW"' );
+ $this->allViews = array();
+ while ( ($row = $this->fetchRow($result)) !== false ) {
+ array_push( $this->allViews, $row[$propertyName] );
+ }
+ }
+
+ if ( is_null($prefix) || $prefix === '' ) {
+ return $this->allViews;
+ }
+
+ $filteredViews = array();
+ foreach ( $this->allViews as $viewName ) {
+ // Does the name of this VIEW start with the table-prefix?
+ if ( strpos( $viewName, $prefix ) === 0 ) {
+ array_push( $filteredViews, $viewName );
+ }
+ }
+ return $filteredViews;
+ }
+
+ /**
+ * Differentiates between a TABLE and a VIEW.
+ *
+ * @param $name string: Name of the TABLE/VIEW to test
+ * @return bool
+ * @since 1.22
+ */
+ public function isView( $name, $prefix = null ) {
+ return in_array( $name, $this->listViews( $prefix ) );
+ }
+
+}
+
+
+
+/**
+ * Utility class.
+ * @ingroup Database
+ */
+class MySQLField implements Field {
+ private $name, $tablename, $default, $max_length, $nullable,
+ $is_pk, $is_unique, $is_multiple, $is_key, $type, $binary;
+
+ 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;
+ $this->binary = isset( $info->binary ) ? $info->binary : false;
+ }
+
+ /**
+ * @return string
+ */
+ function name() {
+ return $this->name;
+ }
+
+ /**
+ * @return string
+ */
+ function tableName() {
+ return $this->tableName;
+ }
+
+ /**
+ * @return string
+ */
+ function type() {
+ return $this->type;
+ }
+
+ /**
+ * @return bool
+ */
+ function isNullable() {
+ return $this->nullable;
+ }
+
+ function defaultValue() {
+ return $this->default;
+ }
+
+ /**
+ * @return bool
+ */
+ function isKey() {
+ return $this->is_key;
+ }
+
+ /**
+ * @return bool
+ */
+ function isMultipleKey() {
+ return $this->is_multiple;
+ }
+
+ function isBinary() {
+ return $this->binary;
+ }
+}
+
+class MySQLMasterPos implements DBMasterPos {
+ var $file, $pos;
+
+ function __construct( $file, $pos ) {
+ $this->file = $file;
+ $this->pos = $pos;
+ }
+
+ function __toString() {
+ // e.g db1034-bin.000976/843431247
+ return "{$this->file}/{$this->pos}";
+ }
+
+ /**
+ * @return array|false (int, int)
+ */
+ protected function getCoordinates() {
+ $m = array();
+ if ( preg_match( '!\.(\d+)/(\d+)$!', (string)$this, $m ) ) {
+ return array( (int)$m[1], (int)$m[2] );
+ }
+ return false;
+ }
+
+ function hasReached( MySQLMasterPos $pos ) {
+ $thisPos = $this->getCoordinates();
+ $thatPos = $pos->getCoordinates();
+ return ( $thisPos && $thatPos && $thisPos >= $thatPos );
+ }
+}
diff --git a/includes/db/DatabaseMysqli.php b/includes/db/DatabaseMysqli.php
new file mode 100644
index 00000000..7761abe9
--- /dev/null
+++ b/includes/db/DatabaseMysqli.php
@@ -0,0 +1,194 @@
+<?php
+/**
+ * This is the MySQLi database abstraction layer.
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with this program; if not, write to the Free Software Foundation, Inc.,
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ * http://www.gnu.org/copyleft/gpl.html
+ *
+ * @file
+ * @ingroup Database
+ */
+
+/**
+ * Database abstraction object for PHP extension mysqli.
+ *
+ * @ingroup Database
+ * @since 1.22
+ * @see Database
+ */
+class DatabaseMysqli extends DatabaseMysqlBase {
+
+ /**
+ * @param $sql string
+ * @return resource
+ */
+ protected function doQuery( $sql ) {
+ if ( $this->bufferResults() ) {
+ $ret = $this->mConn->query( $sql );
+ } else {
+ $ret = $this->mConn->query( $sql, MYSQLI_USE_RESULT );
+ }
+ return $ret;
+ }
+
+ protected function mysqlConnect( $realServer ) {
+ # Fail now
+ # Otherwise we get a suppressed fatal error, which is very hard to track down
+ if ( !function_exists( 'mysqli_init' ) ) {
+ throw new DBConnectionError( $this, "MySQLi functions missing,"
+ . " have you compiled PHP with the --with-mysqli option?\n" );
+ }
+
+ $connFlags = 0;
+ if ( $this->mFlags & DBO_SSL ) {
+ $connFlags |= MYSQLI_CLIENT_SSL;
+ }
+ if ( $this->mFlags & DBO_COMPRESS ) {
+ $connFlags |= MYSQLI_CLIENT_COMPRESS;
+ }
+ if ( $this->mFlags & DBO_PERSISTENT ) {
+ $realServer = 'p:' . $realServer;
+ }
+
+ $mysqli = mysqli_init();
+ $numAttempts = 2;
+
+ for ( $i = 0; $i < $numAttempts; $i++ ) {
+ if ( $i > 1 ) {
+ usleep( 1000 );
+ }
+ if ( $mysqli->real_connect( $realServer, $this->mUser,
+ $this->mPassword, $this->mDBname, null, null, $connFlags ) )
+ {
+ return $mysqli;
+ }
+ }
+
+ return false;
+ }
+
+ /**
+ * @return bool
+ */
+ protected function closeConnection() {
+ return $this->mConn->close();
+ }
+
+ /**
+ * @return int
+ */
+ function insertId() {
+ return $this->mConn->insert_id;
+ }
+
+ /**
+ * @return int
+ */
+ function lastErrno() {
+ if ( $this->mConn ) {
+ return $this->mConn->errno;
+ } else {
+ return mysqli_connect_errno();
+ }
+ }
+
+ /**
+ * @return int
+ */
+ function affectedRows() {
+ return $this->mConn->affected_rows;
+ }
+
+ /**
+ * @param $db
+ * @return bool
+ */
+ function selectDB( $db ) {
+ $this->mDBname = $db;
+ return $this->mConn->select_db( $db );
+ }
+
+ /**
+ * @return string
+ */
+ function getServerVersion() {
+ return $this->mConn->server_info;
+ }
+
+ protected function mysqlFreeResult( $res ) {
+ $res->free_result();
+ return true;
+ }
+
+ protected function mysqlFetchObject( $res ) {
+ $object = $res->fetch_object();
+ if ( $object === null ) {
+ return false;
+ }
+ return $object;
+ }
+
+ protected function mysqlFetchArray( $res ) {
+ $array = $res->fetch_array();
+ if ( $array === null ) {
+ return false;
+ }
+ return $array;
+ }
+
+ protected function mysqlNumRows( $res ) {
+ return $res->num_rows;
+ }
+
+ protected function mysqlNumFields( $res ) {
+ return $res->field_count;
+ }
+
+ protected function mysqlFetchField( $res, $n ) {
+ $field = $res->fetch_field_direct( $n );
+ $field->not_null = $field->flags & MYSQLI_NOT_NULL_FLAG;
+ $field->primary_key = $field->flags & MYSQLI_PRI_KEY_FLAG;
+ $field->unique_key = $field->flags & MYSQLI_UNIQUE_KEY_FLAG;
+ $field->multiple_key = $field->flags & MYSQLI_MULTIPLE_KEY_FLAG;
+ $field->binary = $field->flags & MYSQLI_BINARY_FLAG;
+ return $field;
+ }
+
+ protected function mysqlFieldName( $res, $n ) {
+ $field = $res->fetch_field_direct( $n );
+ return $field->name;
+ }
+
+ protected function mysqlDataSeek( $res, $row ) {
+ return $res->data_seek( $row );
+ }
+
+ protected function mysqlError( $conn = null ) {
+ if ($conn === null) {
+ return mysqli_connect_error();
+ } else {
+ return $conn->error;
+ }
+ }
+
+ protected function mysqlRealEscapeString( $s ) {
+ return $this->mConn->real_escape_string( $s );
+ }
+
+ protected function mysqlPing() {
+ return $this->mConn->ping();
+ }
+
+}
diff --git a/includes/db/DatabaseOracle.php b/includes/db/DatabaseOracle.php
index 75b3550a..fbaa4da5 100644
--- a/includes/db/DatabaseOracle.php
+++ b/includes/db/DatabaseOracle.php
@@ -206,7 +206,7 @@ class DatabaseOracle extends DatabaseBase {
}
function __destruct() {
- if ($this->mOpened) {
+ if ( $this->mOpened ) {
wfSuppressWarnings();
$this->close();
wfRestoreWarnings();
@@ -249,6 +249,7 @@ class DatabaseOracle extends DatabaseBase {
* @return DatabaseBase|null
*/
function open( $server, $user, $password, $dbName ) {
+ global $wgDBOracleDRCP;
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" );
}
@@ -276,9 +277,16 @@ class DatabaseOracle extends DatabaseBase {
return;
}
+ if ( $wgDBOracleDRCP ) {
+ $this->setFlag( DBO_PERSISTENT );
+ }
+
$session_mode = $this->mFlags & DBO_SYSDBA ? OCI_SYSDBA : OCI_DEFAULT;
+
wfSuppressWarnings();
- if ( $this->mFlags & DBO_DEFAULT ) {
+ if ( $this->mFlags & DBO_PERSISTENT ) {
+ $this->mConn = oci_pconnect( $this->mUser, $this->mPassword, $this->mServer, $this->defaultCharset, $session_mode );
+ } elseif ( $this->mFlags & DBO_DEFAULT ) {
$this->mConn = oci_new_connect( $this->mUser, $this->mPassword, $this->mServer, $this->defaultCharset, $session_mode );
} else {
$this->mConn = oci_connect( $this->mUser, $this->mPassword, $this->mServer, $this->defaultCharset, $session_mode );
@@ -324,7 +332,7 @@ class DatabaseOracle extends DatabaseBase {
// handle some oracle specifics
// remove AS column/table/subquery namings
- if( !$this->getFlag( DBO_DDLMODE ) ) {
+ if ( !$this->getFlag( DBO_DDLMODE ) ) {
$sql = preg_replace( '/ as /i', ' ', $sql );
}
@@ -333,7 +341,7 @@ class DatabaseOracle extends DatabaseBase {
$union_unique = ( preg_match( '/\/\* UNION_UNIQUE \*\/ /', $sql ) != 0 );
// EXPLAIN syntax in Oracle is EXPLAIN PLAN FOR and it return nothing
// you have to select data from plan table after explain
- $explain_id = date( 'dmYHis' );
+ $explain_id = MWTimestamp::getLocalInstance()->format( 'dmYHis' );
$sql = preg_replace( '/^EXPLAIN /', 'EXPLAIN PLAN SET STATEMENT_ID = \'' . $explain_id . '\' FOR', $sql, 1, $explain_count );
@@ -456,15 +464,15 @@ class DatabaseOracle extends DatabaseBase {
* If errors are explicitly ignored, returns NULL on failure
* @return bool
*/
- function indexInfo( $table, $index, $fname = 'DatabaseOracle::indexExists' ) {
+ function indexInfo( $table, $index, $fname = __METHOD__ ) {
return false;
}
- function indexUnique( $table, $index, $fname = 'DatabaseOracle::indexUnique' ) {
+ function indexUnique( $table, $index, $fname = __METHOD__ ) {
return false;
}
- function insert( $table, $a, $fname = 'DatabaseOracle::insert', $options = array() ) {
+ function insert( $table, $a, $fname = __METHOD__, $options = array() ) {
if ( !count( $a ) ) {
return true;
}
@@ -493,7 +501,7 @@ class DatabaseOracle extends DatabaseBase {
return $retVal;
}
- private function fieldBindStatement ( $table, $col, &$val, $includeCol = false ) {
+ private function fieldBindStatement( $table, $col, &$val, $includeCol = false ) {
$col_info = $this->fieldInfoMulti( $table, $col );
$col_type = $col_info != false ? $col_info->type() : 'CONSTANT';
@@ -624,7 +632,7 @@ class DatabaseOracle extends DatabaseBase {
oci_free_statement( $stmt );
}
- function insertSelect( $destTable, $srcTable, $varMap, $conds, $fname = 'DatabaseOracle::insertSelect',
+ function insertSelect( $destTable, $srcTable, $varMap, $conds, $fname = __METHOD__,
$insertOptions = array(), $selectOptions = array() )
{
$destTable = $this->tableName( $destTable );
@@ -677,7 +685,7 @@ class DatabaseOracle extends DatabaseBase {
Using uppercase because that's the only way Oracle can handle
quoted tablenames
*/
- switch( $name ) {
+ switch ( $name ) {
case 'user':
$name = 'MWUSER';
break;
@@ -686,12 +694,12 @@ class DatabaseOracle extends DatabaseBase {
break;
}
- return parent::tableName( strtoupper( $name ), $format );
+ return strtoupper( parent::tableName( $name, $format ) );
}
function tableNameInternal( $name ) {
$name = $this->tableName( $name );
- return preg_replace( '/.*\.(.*)/', '$1', $name);
+ return preg_replace( '/.*\.(.*)/', '$1', $name );
}
/**
* Return the next in a sequence, save the value for retrieval via insertId()
@@ -756,14 +764,14 @@ class DatabaseOracle extends DatabaseBase {
function unionQueries( $sqls, $all ) {
$glue = ' UNION ALL ';
- return 'SELECT * ' . ( $all ? '':'/* UNION_UNIQUE */ ' ) . 'FROM (' . implode( $glue, $sqls ) . ')';
+ return 'SELECT * ' . ( $all ? '' : '/* UNION_UNIQUE */ ' ) . 'FROM (' . implode( $glue, $sqls ) . ')';
}
function wasDeadlock() {
return $this->lastErrno() == 'OCI-00060';
}
- function duplicateTableStructure( $oldName, $newName, $temporary = false, $fname = 'DatabaseOracle::duplicateTableStructure' ) {
+ function duplicateTableStructure( $oldName, $newName, $temporary = false, $fname = __METHOD__ ) {
$temporary = $temporary ? 'TRUE' : 'FALSE';
$newName = strtoupper( $newName );
@@ -776,7 +784,7 @@ class DatabaseOracle extends DatabaseBase {
return $this->doQuery( "BEGIN DUPLICATE_TABLE( '$tabName', '$oldPrefix', '$newPrefix', $temporary ); END;" );
}
- function listTables( $prefix = null, $fname = 'DatabaseOracle::listTables' ) {
+ function listTables( $prefix = null, $fname = __METHOD__ ) {
$listWhere = '';
if ( !empty( $prefix ) ) {
$listWhere = ' AND table_name LIKE \'' . strtoupper( $prefix ) . '%\'';
@@ -791,17 +799,18 @@ class DatabaseOracle extends DatabaseBase {
$endArray[] = strtoupper( $prefix . 'PAGE' );
$endArray[] = strtoupper( $prefix . 'IMAGE' );
$fixedOrderTabs = $endArray;
- while ( ($row = $result->fetchRow()) !== false ) {
- if ( !in_array( $row['table_name'], $fixedOrderTabs ) )
+ 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' ) {
+ public function dropTable( $tableName, $fName = __METHOD__ ) {
$tableName = $this->tableName( $tableName );
- if( !$this->tableExists( $tableName ) ) {
+ if ( !$this->tableExists( $tableName ) ) {
return false;
}
@@ -836,7 +845,7 @@ class DatabaseOracle extends DatabaseBase {
/**
* @return string wikitext of a link to the server software's web site
*/
- public static function getSoftwareLink() {
+ public function getSoftwareLink() {
return '[http://www.oracle.com/ Oracle]';
}
@@ -856,7 +865,7 @@ class DatabaseOracle extends DatabaseBase {
* Query whether a given index exists
* @return bool
*/
- function indexExists( $table, $index, $fname = 'DatabaseOracle::indexExists' ) {
+ function indexExists( $table, $index, $fname = __METHOD__ ) {
$table = $this->tableName( $table );
$table = strtoupper( $this->removeIdentifierQuotes( $table ) );
$index = strtoupper( $index );
@@ -874,7 +883,7 @@ class DatabaseOracle extends DatabaseBase {
/**
* Query whether a given table exists (in the given schema, or the default mw one if not given)
- * @return int
+ * @return bool
*/
function tableExists( $table, $fname = __METHOD__ ) {
$table = $this->tableName( $table );
@@ -882,13 +891,14 @@ class DatabaseOracle extends DatabaseBase {
$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();
- $res->free();
+ if ( $res && $res->numRows() > 0 ) {
+ $exists = true;
} else {
- $count = 0;
+ $exists = false;
}
- return $count;
+
+ $res->free();
+ return $exists;
}
/**
@@ -906,7 +916,7 @@ class DatabaseOracle extends DatabaseBase {
if ( is_array( $table ) ) {
$table = array_map( array( &$this, 'tableNameInternal' ), $table );
$tableWhere = 'IN (';
- foreach( $table as &$singleTable ) {
+ foreach ( $table as &$singleTable ) {
$singleTable = $this->removeIdentifierQuotes( $singleTable );
if ( isset( $this->mFieldInfoCache["$singleTable.$field"] ) ) {
return $this->mFieldInfoCache["$singleTable.$field"];
@@ -919,7 +929,7 @@ class DatabaseOracle extends DatabaseBase {
if ( isset( $this->mFieldInfoCache["$table.$field"] ) ) {
return $this->mFieldInfoCache["$table.$field"];
}
- $tableWhere = '= \''.$table.'\'';
+ $tableWhere = '= \'' . $table . '\'';
}
$fieldInfoStmt = oci_parse( $this->mConn, 'SELECT * FROM wiki_field_info_full WHERE table_name ' . $tableWhere . ' and column_name = \'' . $field . '\'' );
@@ -931,7 +941,7 @@ class DatabaseOracle extends DatabaseBase {
$res = new ORAResult( $this, $fieldInfoStmt );
if ( $res->numRows() == 0 ) {
if ( is_array( $table ) ) {
- foreach( $table as &$singleTable ) {
+ foreach ( $table as &$singleTable ) {
$this->mFieldInfoCache["$singleTable.$field"] = false;
}
} else {
@@ -960,12 +970,12 @@ class DatabaseOracle extends DatabaseBase {
return $this->fieldInfoMulti( $table, $field );
}
- protected function doBegin( $fname = 'DatabaseOracle::begin' ) {
+ protected function doBegin( $fname = __METHOD__ ) {
$this->mTrxLevel = 1;
$this->doQuery( 'SET CONSTRAINTS ALL DEFERRED' );
}
- protected function doCommit( $fname = 'DatabaseOracle::commit' ) {
+ protected function doCommit( $fname = __METHOD__ ) {
if ( $this->mTrxLevel ) {
$ret = oci_commit( $this->mConn );
if ( !$ret ) {
@@ -976,7 +986,7 @@ class DatabaseOracle extends DatabaseBase {
}
}
- protected function doRollback( $fname = 'DatabaseOracle::rollback' ) {
+ protected function doRollback( $fname = __METHOD__ ) {
if ( $this->mTrxLevel ) {
oci_rollback( $this->mConn );
$this->mTrxLevel = 0;
@@ -986,7 +996,7 @@ class DatabaseOracle extends DatabaseBase {
/* defines must comply with ^define\s*([^\s=]*)\s*=\s?'\{\$([^\}]*)\}'; */
function sourceStream( $fp, $lineCallback = false, $resultCallback = false,
- $fname = 'DatabaseOracle::sourceStream', $inputCallback = false ) {
+ $fname = __METHOD__, $inputCallback = false ) {
$cmd = '';
$done = false;
$dollarquote = false;
@@ -1121,16 +1131,16 @@ class DatabaseOracle extends DatabaseBase {
}
}
- private function wrapConditionsForWhere ( $table, $conds, $parentCol = null ) {
+ private function wrapConditionsForWhere( $table, $conds, $parentCol = null ) {
$conds2 = array();
foreach ( $conds as $col => $val ) {
if ( is_array( $val ) ) {
- $conds2[$col] = $this->wrapConditionsForWhere ( $table, $val, $col );
+ $conds2[$col] = $this->wrapConditionsForWhere( $table, $val, $col );
} else {
if ( is_numeric( $col ) && $parentCol != null ) {
- $this->wrapFieldForWhere ( $table, $parentCol, $val );
+ $this->wrapFieldForWhere( $table, $parentCol, $val );
} else {
- $this->wrapFieldForWhere ( $table, $col, $val );
+ $this->wrapFieldForWhere( $table, $col, $val );
}
$conds2[$col] = $val;
}
@@ -1138,7 +1148,7 @@ class DatabaseOracle extends DatabaseBase {
return $conds2;
}
- function selectRow( $table, $vars, $conds, $fname = 'DatabaseOracle::selectRow', $options = array(), $join_conds = array() ) {
+ function selectRow( $table, $vars, $conds, $fname = __METHOD__, $options = array(), $join_conds = array() ) {
if ( is_array( $conds ) ) {
$conds = $this->wrapConditionsForWhere( $table, $conds );
}
@@ -1187,7 +1197,7 @@ class DatabaseOracle extends DatabaseBase {
return array( $startOpts, $useIndex, $preLimitTail, $postLimitTail );
}
- public function delete( $table, $conds, $fname = 'DatabaseOracle::delete' ) {
+ public function delete( $table, $conds, $fname = __METHOD__ ) {
if ( is_array( $conds ) ) {
$conds = $this->wrapConditionsForWhere( $table, $conds );
}
@@ -1210,7 +1220,7 @@ class DatabaseOracle extends DatabaseBase {
return parent::delete( $table, $conds, $fname );
}
- function update( $table, $values, $conds, $fname = 'DatabaseOracle::update', $options = array() ) {
+ function update( $table, $values, $conds, $fname = __METHOD__, $options = array() ) {
global $wgContLang;
$table = $this->tableName( $table );
diff --git a/includes/db/DatabasePostgres.php b/includes/db/DatabasePostgres.php
index f32d7758..e564a162 100644
--- a/includes/db/DatabasePostgres.php
+++ b/includes/db/DatabasePostgres.php
@@ -117,7 +117,7 @@ SQL;
* @since 1.19
*/
function defaultValue() {
- if( $this->has_default ) {
+ if ( $this->has_default ) {
return $this->default;
} else {
return false;
@@ -139,15 +139,15 @@ class PostgresTransactionState {
array(
"desc" => "%s: Connection state changed from %s -> %s\n",
"states" => array(
- PGSQL_CONNECTION_OK => "OK",
- PGSQL_CONNECTION_BAD => "BAD"
+ PGSQL_CONNECTION_OK => "OK",
+ PGSQL_CONNECTION_BAD => "BAD"
)
),
array(
"desc" => "%s: Transaction state changed from %s -> %s\n",
"states" => array(
- PGSQL_TRANSACTION_IDLE => "IDLE",
- PGSQL_TRANSACTION_ACTIVE => "ACTIVE",
+ PGSQL_TRANSACTION_IDLE => "IDLE",
+ PGSQL_TRANSACTION_ACTIVE => "ACTIVE",
PGSQL_TRANSACTION_INTRANS => "TRANS",
PGSQL_TRANSACTION_INERROR => "ERROR",
PGSQL_TRANSACTION_UNKNOWN => "UNKNOWN"
@@ -189,7 +189,7 @@ class PostgresTransactionState {
}
protected function describe_changed( $status, $desc_table ) {
- if( isset( $desc_table[$status] ) ) {
+ if ( isset( $desc_table[$status] ) ) {
return $desc_table[$status];
} else {
return "STATUS " . $status;
@@ -218,7 +218,7 @@ class SavepointPostgres {
protected $id;
protected $didbegin;
- public function __construct ( $dbw, $id ) {
+ public function __construct( $dbw, $id ) {
$this->dbw = $dbw;
$this->id = $id;
$this->didbegin = false;
@@ -320,7 +320,7 @@ class DatabasePostgres extends DatabaseBase {
function hasConstraint( $name ) {
$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, $this->getCoreSchema() ) ."'";
+ pg_escape_string( $this->mConn, $name ) . "' AND n.nspname = '" . pg_escape_string( $this->mConn, $this->getCoreSchema() ) . "'";
$res = $this->doQuery( $SQL );
return $this->numRows( $res );
}
@@ -438,7 +438,7 @@ class DatabasePostgres extends DatabaseBase {
$sql = mb_convert_encoding( $sql, 'UTF-8' );
}
$this->mTransactionState->check();
- if( pg_send_query( $this->mConn, $sql ) === false ) {
+ if ( pg_send_query( $this->mConn, $sql ) === false ) {
throw new DBUnexpectedError( $this, "Unable to post new query to PostgreSQL\n" );
}
$this->mLastResult = pg_get_result( $this->mConn );
@@ -450,7 +450,7 @@ class DatabasePostgres extends DatabaseBase {
return $this->mLastResult;
}
- protected function dumpError () {
+ protected function dumpError() {
$diags = array( PGSQL_DIAG_SEVERITY,
PGSQL_DIAG_SQLSTATE,
PGSQL_DIAG_MESSAGE_PRIMARY,
@@ -464,7 +464,7 @@ class DatabasePostgres extends DatabaseBase {
PGSQL_DIAG_SOURCE_LINE,
PGSQL_DIAG_SOURCE_FUNCTION );
foreach ( $diags as $d ) {
- wfDebug( sprintf("PgSQL ERROR(%d): %s\n", $d, pg_result_error_field( $this->mLastResult, $d ) ) );
+ wfDebug( sprintf( "PgSQL ERROR(%d): %s\n", $d, pg_result_error_field( $this->mLastResult, $d ) ) );
}
}
@@ -482,7 +482,7 @@ class DatabasePostgres extends DatabaseBase {
parent::reportQueryError( $error, $errno, $sql, $fname, false );
}
- function queryIgnore( $sql, $fname = 'DatabasePostgres::queryIgnore' ) {
+ function queryIgnore( $sql, $fname = __METHOD__ ) {
return $this->query( $sql, $fname, true );
}
@@ -509,7 +509,7 @@ 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 ) ) {
+ if ( pg_last_error( $this->mConn ) ) {
throw new DBUnexpectedError( $this, 'SQL error: ' . htmlspecialchars( pg_last_error( $this->mConn ) ) );
}
return $row;
@@ -522,7 +522,7 @@ class DatabasePostgres extends DatabaseBase {
wfSuppressWarnings();
$row = pg_fetch_array( $res );
wfRestoreWarnings();
- if( 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;
@@ -535,7 +535,7 @@ class DatabasePostgres extends DatabaseBase {
wfSuppressWarnings();
$n = pg_num_rows( $res );
wfRestoreWarnings();
- if( 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;
@@ -556,8 +556,10 @@ class DatabasePostgres extends DatabaseBase {
}
/**
- * This must be called after nextSequenceVal
- * @return null
+ * Return the result of the last call to nextSequenceValue();
+ * This must be called after nextSequenceValue().
+ *
+ * @return integer|null
*/
function insertId() {
return $this->mInsertId;
@@ -594,7 +596,7 @@ 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 );
@@ -608,14 +610,14 @@ class DatabasePostgres extends DatabaseBase {
* Takes same arguments as Database::select()
* @return int
*/
- function estimateRowCount( $table, $vars = '*', $conds = '', $fname = 'DatabasePostgres::estimateRowCount', $options = array() ) {
+ function estimateRowCount( $table, $vars = '*', $conds = '', $fname = __METHOD__, $options = array() ) {
$options['EXPLAIN'] = true;
$res = $this->select( $table, $vars, $conds, $fname, $options );
$rows = -1;
if ( $res ) {
$row = $this->fetchRow( $res );
$count = array();
- if( preg_match( '/rows=(\d+)/', $row[0], $count ) ) {
+ if ( preg_match( '/rows=(\d+)/', $row[0], $count ) ) {
$rows = $count[1];
}
}
@@ -627,7 +629,7 @@ class DatabasePostgres extends DatabaseBase {
* If errors are explicitly ignored, returns NULL on failure
* @return bool|null
*/
- function indexInfo( $table, $index, $fname = 'DatabasePostgres::indexInfo' ) {
+ function indexInfo( $table, $index, $fname = __METHOD__ ) {
$sql = "SELECT indexname FROM pg_indexes WHERE tablename='$table'";
$res = $this->query( $sql, $fname );
if ( !$res ) {
@@ -647,9 +649,10 @@ class DatabasePostgres extends DatabaseBase {
* @since 1.19
* @return Array
*/
- function indexAttributes ( $index, $schema = false ) {
- if ( $schema === false )
+ function indexAttributes( $index, $schema = false ) {
+ if ( $schema === false ) {
$schema = $this->getCoreSchema();
+ }
/*
* A subquery would be not needed if we didn't care about the order
* of attributes, but we do
@@ -702,8 +705,8 @@ __INDEXATTR__;
return $a;
}
- function indexUnique( $table, $index, $fname = 'DatabasePostgres::indexUnique' ) {
- $sql = "SELECT indexname FROM pg_indexes WHERE tablename='{$table}'".
+ function indexUnique( $table, $index, $fname = __METHOD__ ) {
+ $sql = "SELECT indexname FROM pg_indexes WHERE tablename='{$table}'" .
" AND indexdef LIKE 'CREATE UNIQUE%(" .
$this->strencode( $this->indexName( $index ) ) .
")'";
@@ -730,7 +733,7 @@ __INDEXATTR__;
*
* @return bool Success of insert operation. IGNORE always returns true.
*/
- function insert( $table, $args, $fname = 'DatabasePostgres::insert', $options = array() ) {
+ function insert( $table, $args, $fname = __METHOD__, $options = array() ) {
if ( !count( $args ) ) {
return true;
}
@@ -847,12 +850,12 @@ __INDEXATTR__;
* @todo FIXME: Implement this a little better (seperate select/insert)?
* @return bool
*/
- function insertSelect( $destTable, $srcTable, $varMap, $conds, $fname = 'DatabasePostgres::insertSelect',
+ function insertSelect( $destTable, $srcTable, $varMap, $conds, $fname = __METHOD__,
$insertOptions = array(), $selectOptions = array() )
{
$destTable = $this->tableName( $destTable );
- if( !is_array( $insertOptions ) ) {
+ if ( !is_array( $insertOptions ) ) {
$insertOptions = array( $insertOptions );
}
@@ -868,11 +871,11 @@ __INDEXATTR__;
$savepoint->savepoint();
}
- 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 );
@@ -889,9 +892,9 @@ __INDEXATTR__;
$sql .= " $tailOpts";
$res = (bool)$this->query( $sql, $fname, $savepoint );
- if( $savepoint ) {
+ if ( $savepoint ) {
$bar = pg_last_error();
- if( $bar != false ) {
+ if ( $bar != false ) {
$savepoint->rollback();
} else {
$savepoint->release();
@@ -912,7 +915,7 @@ __INDEXATTR__;
function tableName( $name, $format = 'quoted' ) {
# Replace reserved words with better ones
- switch( $name ) {
+ switch ( $name ) {
case 'user':
return $this->realTableName( 'mwuser', $format );
case 'text':
@@ -958,7 +961,7 @@ __INDEXATTR__;
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 );
+ $res = $this->query( $sql );
$row = $this->fetchObject( $res );
if ( $row->ftype == 'varchar' ) {
$size = $row->size - 4;
@@ -976,21 +979,21 @@ __INDEXATTR__;
return $this->lastErrno() == '40P01';
}
- function duplicateTableStructure( $oldName, $newName, $temporary = false, $fname = 'DatabasePostgres::duplicateTableStructure' ) {
+ function duplicateTableStructure( $oldName, $newName, $temporary = false, $fname = __METHOD__ ) {
$newName = $this->addIdentifierQuotes( $newName );
$oldName = $this->addIdentifierQuotes( $oldName );
return $this->query( 'CREATE ' . ( $temporary ? 'TEMPORARY ' : '' ) . " TABLE $newName (LIKE $oldName INCLUDING DEFAULTS)", $fname );
}
- function listTables( $prefix = null, $fname = 'DatabasePostgres::listTables' ) {
+ function listTables( $prefix = null, $fname = __METHOD__ ) {
$eschema = $this->addQuotes( $this->getCoreSchema() );
$result = $this->query( "SELECT tablename FROM pg_tables WHERE schemaname = $eschema", $fname );
$endArray = array();
- foreach( $result as $table ) {
+ foreach ( $result as $table ) {
$vars = get_object_vars( $table );
$table = array_pop( $vars );
- if( !$prefix || strpos( $table, $prefix ) === 0 ) {
+ if ( !$prefix || strpos( $table, $prefix ) === 0 ) {
$endArray[] = $table;
}
}
@@ -1021,26 +1024,26 @@ __INDEXATTR__;
* @return string
*/
function pg_array_parse( $text, &$output, $limit = false, $offset = 1 ) {
- if( false === $limit ) {
- $limit = strlen( $text )-1;
+ if ( false === $limit ) {
+ $limit = strlen( $text ) - 1;
$output = array();
}
- if( '{}' == $text ) {
+ if ( '{}' == $text ) {
return $output;
}
do {
- if ( '{' != $text{$offset} ) {
+ if ( '{' != $text[$offset] ) {
preg_match( "/(\\{?\"([^\"\\\\]|\\\\.)*\"|[^,{}]+)+([,}]+)/",
$text, $match, 0, $offset );
$offset += strlen( $match[0] );
- $output[] = ( '"' != $match[1]{0}
+ $output[] = ( '"' != $match[1][0]
? $match[1]
: stripcslashes( substr( $match[1], 1, -1 ) ) );
if ( '},' == $match[3] ) {
return $output;
}
} else {
- $offset = $this->pg_array_parse( $text, $output, $limit, $offset+1 );
+ $offset = $this->pg_array_parse( $text, $output, $limit, $offset + 1 );
}
} while ( $limit > $offset );
return $output;
@@ -1056,7 +1059,7 @@ __INDEXATTR__;
/**
* @return string wikitext of a link to the server software's web site
*/
- public static function getSoftwareLink() {
+ public function getSoftwareLink() {
return '[http://www.postgresql.org/ PostgreSQL]';
}
@@ -1406,7 +1409,8 @@ SQL;
return array( $startOpts, $useIndex, $preLimitTail, $postLimitTail );
}
- function setFakeMaster( $enabled = true ) {}
+ function setFakeMaster( $enabled = true ) {
+ }
function getDBname() {
return $this->mDBname;
@@ -1473,7 +1477,7 @@ SQL;
sleep( 1 );
}
}
- wfDebug( __METHOD__." failed to acquire lock\n" );
+ wfDebug( __METHOD__ . " failed to acquire lock\n" );
return false;
}
diff --git a/includes/db/DatabaseSqlite.php b/includes/db/DatabaseSqlite.php
index 0789e1b1..4a51226f 100644
--- a/includes/db/DatabaseSqlite.php
+++ b/includes/db/DatabaseSqlite.php
@@ -52,9 +52,9 @@ class DatabaseSqlite extends DatabaseBase {
$this->mName = $dbName;
parent::__construct( $server, $user, $password, $dbName, $flags );
// parent doesn't open when $user is false, but we can work with $dbName
- if( $dbName ) {
+ if ( $dbName && !$this->isOpen() ) {
global $wgSharedDB;
- if( $this->open( $server, $user, $password, $dbName ) && $wgSharedDB ) {
+ if ( $this->open( $server, $user, $password, $dbName ) && $wgSharedDB ) {
$this->attachDatabase( $wgSharedDB );
}
}
@@ -68,7 +68,7 @@ class DatabaseSqlite extends DatabaseBase {
}
/**
- * @todo: check if it should be true like parent class
+ * @todo Check if it should be true like parent class
*
* @return bool
*/
@@ -90,6 +90,7 @@ class DatabaseSqlite extends DatabaseBase {
function open( $server, $user, $pass, $dbName ) {
global $wgSQLiteDataDir;
+ $this->close();
$fileName = self::generateFileName( $wgSQLiteDataDir, $dbName );
if ( !is_readable( $fileName ) ) {
$this->mConn = false;
@@ -200,7 +201,7 @@ class DatabaseSqlite extends DatabaseBase {
*
* @return ResultWrapper
*/
- function attachDatabase( $name, $file = false, $fname = 'DatabaseSqlite::attachDatabase' ) {
+ function attachDatabase( $name, $file = false, $fname = __METHOD__ ) {
global $wgSQLiteDataDir;
if ( !$file ) {
$file = self::generateFileName( $wgSQLiteDataDir, $name );
@@ -420,7 +421,7 @@ class DatabaseSqlite extends DatabaseBase {
*
* @return array
*/
- function indexInfo( $table, $index, $fname = 'DatabaseSqlite::indexExists' ) {
+ function indexInfo( $table, $index, $fname = __METHOD__ ) {
$sql = 'PRAGMA index_info(' . $this->addQuotes( $this->indexName( $index ) ) . ')';
$res = $this->query( $sql, $fname );
if ( !$res ) {
@@ -442,7 +443,7 @@ class DatabaseSqlite extends DatabaseBase {
* @param $fname string
* @return bool|null
*/
- function indexUnique( $table, $index, $fname = 'DatabaseSqlite::indexUnique' ) {
+ function indexUnique( $table, $index, $fname = __METHOD__ ) {
$row = $this->selectRow( 'sqlite_master', '*',
array(
'type' => 'index',
@@ -471,7 +472,7 @@ class DatabaseSqlite extends DatabaseBase {
*/
function makeSelectOptions( $options ) {
foreach ( $options as $k => $v ) {
- if ( is_numeric( $k ) && ($v == 'FOR UPDATE' || $v == 'LOCK IN SHARE MODE') ) {
+ if ( is_numeric( $k ) && ( $v == 'FOR UPDATE' || $v == 'LOCK IN SHARE MODE' ) ) {
$options[$k] = '';
}
}
@@ -514,7 +515,7 @@ class DatabaseSqlite extends DatabaseBase {
* Based on generic method (parent) with some prior SQLite-sepcific adjustments
* @return bool
*/
- function insert( $table, $a, $fname = 'DatabaseSqlite::insert', $options = array() ) {
+ function insert( $table, $a, $fname = __METHOD__, $options = array() ) {
if ( !count( $a ) ) {
return true;
}
@@ -541,8 +542,10 @@ class DatabaseSqlite extends DatabaseBase {
* @param $fname string
* @return bool|ResultWrapper
*/
- function replace( $table, $uniqueIndexes, $rows, $fname = 'DatabaseSqlite::replace' ) {
- if ( !count( $rows ) ) return true;
+ function replace( $table, $uniqueIndexes, $rows, $fname = __METHOD__ ) {
+ 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] ) ) {
@@ -610,7 +613,7 @@ class DatabaseSqlite extends DatabaseBase {
/**
* @return string wikitext of a link to the server software's web site
*/
- public static function getSoftwareLink() {
+ public function getSoftwareLink() {
return "[http://sqlite.org/ SQLite]";
}
@@ -653,7 +656,11 @@ class DatabaseSqlite extends DatabaseBase {
if ( $this->mTrxLevel == 1 ) {
$this->commit( __METHOD__ );
}
- $this->mConn->beginTransaction();
+ try {
+ $this->mConn->beginTransaction();
+ } catch ( PDOException $e ) {
+ throw new DBUnexpectedError( $this, 'Error in BEGIN query: ' . $e->getMessage() );
+ }
$this->mTrxLevel = 1;
}
@@ -661,7 +668,11 @@ class DatabaseSqlite extends DatabaseBase {
if ( $this->mTrxLevel == 0 ) {
return;
}
- $this->mConn->commit();
+ try {
+ $this->mConn->commit();
+ } catch ( PDOException $e ) {
+ throw new DBUnexpectedError( $this, 'Error in COMMIT query: ' . $e->getMessage() );
+ }
$this->mTrxLevel = 0;
}
@@ -707,7 +718,9 @@ class DatabaseSqlite extends DatabaseBase {
function addQuotes( $s ) {
if ( $s instanceof Blob ) {
return "x'" . bin2hex( $s->fetch() ) . "'";
- } else if ( strpos( $s, "\0" ) !== false ) {
+ } elseif ( is_bool( $s ) ) {
+ return (int)$s;
+ } elseif ( strpos( $s, "\0" ) !== false ) {
// SQLite doesn't support \0 in strings, so use the hex representation as a workaround.
// This is a known limitation of SQLite's mprintf function which PDO should work around,
// but doesn't. I have reported this to php.net as bug #63419:
@@ -813,7 +826,7 @@ class DatabaseSqlite extends DatabaseBase {
* @param $fname string
* @return bool|ResultWrapper
*/
- function duplicateTableStructure( $oldName, $newName, $temporary = false, $fname = 'DatabaseSqlite::duplicateTableStructure' ) {
+ function duplicateTableStructure( $oldName, $newName, $temporary = false, $fname = __METHOD__ ) {
$res = $this->query( "SELECT sql FROM sqlite_master WHERE tbl_name=" . $this->addQuotes( $oldName ) . " AND type='table'", $fname );
$obj = $this->fetchObject( $res );
if ( !$obj ) {
@@ -839,7 +852,7 @@ class DatabaseSqlite extends DatabaseBase {
*
* @return array
*/
- function listTables( $prefix = null, $fname = 'DatabaseSqlite::listTables' ) {
+ function listTables( $prefix = null, $fname = __METHOD__ ) {
$result = $this->select(
'sqlite_master',
'name',
@@ -848,11 +861,11 @@ class DatabaseSqlite extends DatabaseBase {
$endArray = array();
- foreach( $result as $table ) {
+ foreach ( $result as $table ) {
$vars = get_object_vars( $table );
$table = array_pop( $vars );
- if( !$prefix || strpos( $table, $prefix ) === 0 ) {
+ if ( !$prefix || strpos( $table, $prefix ) === 0 ) {
if ( strpos( $table, 'sqlite_' ) !== 0 ) {
$endArray[] = $table;
}
diff --git a/includes/db/DatabaseUtility.php b/includes/db/DatabaseUtility.php
index 9a1c8bde..de58bab6 100644
--- a/includes/db/DatabaseUtility.php
+++ b/includes/db/DatabaseUtility.php
@@ -253,7 +253,8 @@ class FakeResultWrapper extends ResultWrapper {
$this->pos = $row;
}
- function free() {}
+ function free() {
+ }
// Callers want to be able to access fields with $this->fieldName
function fetchObject() {
diff --git a/includes/db/IORMRow.php b/includes/db/IORMRow.php
index 6bc0cdd2..39411791 100644
--- a/includes/db/IORMRow.php
+++ b/includes/db/IORMRow.php
@@ -34,20 +34,10 @@
interface IORMRow {
/**
- * Constructor.
- *
- * @since 1.20
- *
- * @param IORMTable $table
- * @param array|null $fields
- * @param boolean $loadDefaults
- */
- public function __construct( IORMTable $table, $fields = null, $loadDefaults = false );
-
- /**
* Load the specified fields from the database.
*
* @since 1.20
+ * @deprecated since 1.22
*
* @param array|null $fields
* @param boolean $override
@@ -74,8 +64,9 @@ interface IORMRow {
* Gets the value of a field but first loads it if not done so already.
*
* @since 1.20
+ * @deprecated since 1.22
*
- * @param string$name
+ * @param string $name
*
* @return mixed
*/
@@ -155,6 +146,7 @@ interface IORMRow {
* Load the default values, via getDefaults.
*
* @since 1.20
+ * @deprecated since 1.22
*
* @param boolean $override
*/
@@ -167,6 +159,7 @@ interface IORMRow {
* @since 1.20
*
* @param string|null $functionName
+ * @deprecated since 1.22
*
* @return boolean Success indicator
*/
@@ -176,6 +169,7 @@ interface IORMRow {
* Removes the object from the database.
*
* @since 1.20
+ * @deprecated since 1.22
*
* @return boolean Success indicator
*/
@@ -215,9 +209,9 @@ interface IORMRow {
/**
* Add an amount (can be negative) to the specified field (needs to be numeric).
- * TODO: most off this stuff makes more sense in the table class
*
* @since 1.20
+ * @deprecated since 1.22
*
* @param string $field
* @param integer $amount
@@ -239,6 +233,7 @@ interface IORMRow {
* Computes and updates the values of the summary fields.
*
* @since 1.20
+ * @deprecated since 1.22
*
* @param array|string|null $summaryFields
*/
@@ -248,6 +243,7 @@ interface IORMRow {
* Sets the value for the @see $updateSummaries field.
*
* @since 1.20
+ * @deprecated since 1.22
*
* @param boolean $update
*/
@@ -257,6 +253,7 @@ interface IORMRow {
* Sets the value for the @see $inSummaryMode field.
*
* @since 1.20
+ * @deprecated since 1.22
*
* @param boolean $summaryMode
*/
@@ -266,6 +263,7 @@ interface IORMRow {
* Returns the table this IORMRow is a row in.
*
* @since 1.20
+ * @deprecated since 1.22
*
* @return IORMTable
*/
diff --git a/includes/db/LBFactory.php b/includes/db/LBFactory.php
index d469e867..16c43a00 100644
--- a/includes/db/LBFactory.php
+++ b/includes/db/LBFactory.php
@@ -134,7 +134,8 @@ abstract class LBFactory {
* Prepare all tracked load balancers for shutdown
* STUB
*/
- function shutdown() {}
+ function shutdown() {
+ }
/**
* Call a method of each tracked load balancer
@@ -201,7 +202,7 @@ class LBFactory_Simple extends LBFactory {
$flags |= DBO_COMPRESS;
}
- $servers = array(array(
+ $servers = array( array(
'host' => $wgDBserver,
'user' => $wgDBuser,
'password' => $wgDBpassword,
@@ -256,6 +257,7 @@ class LBFactory_Simple extends LBFactory {
if ( !isset( $this->extLBs[$cluster] ) ) {
$this->extLBs[$cluster] = $this->newExternalLB( $cluster, $wiki );
$this->extLBs[$cluster]->parentInfo( array( 'id' => "ext-$cluster" ) );
+ $this->chronProt->initLB( $this->extLBs[$cluster] );
}
return $this->extLBs[$cluster];
}
@@ -280,6 +282,9 @@ class LBFactory_Simple extends LBFactory {
if ( $this->mainLB ) {
$this->chronProt->shutdownLB( $this->mainLB );
}
+ foreach ( $this->extLBs as $extLB ) {
+ $this->chronProt->shutdownLB( $extLB );
+ }
$this->chronProt->shutdown();
$this->commitMasterChanges();
}
@@ -292,21 +297,27 @@ class LBFactory_Simple extends LBFactory {
* LBFactory::enableBackend() to return to normal behavior
*/
class LBFactory_Fake extends LBFactory {
- function __construct( $conf ) {}
+ function __construct( $conf ) {
+ }
- function newMainLB( $wiki = false) {
+ 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() ) {}
+
+ function forEachLB( $callback, $params = array() ) {
+ }
}
/**
@@ -317,76 +328,3 @@ class DBAccessError extends MWException {
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]].
- */
-class ChronologyProtector {
- var $startupPos;
- var $shutdownPos = array();
-
- /**
- * Initialise a LoadBalancer to give it appropriate chronology protection.
- *
- * @param $lb LoadBalancer
- */
- function initLB( $lb ) {
- if ( $this->startupPos === null ) {
- if ( !empty( $_SESSION[__CLASS__] ) ) {
- $this->startupPos = $_SESSION[__CLASS__];
- }
- }
- if ( !$this->startupPos ) {
- return;
- }
- $masterName = $lb->getServerName( 0 );
-
- if ( $lb->getServerCount() > 1 && !empty( $this->startupPos[$masterName] ) ) {
- $info = $lb->parentInfo();
- $pos = $this->startupPos[$masterName];
- wfDebug( __METHOD__ . ": LB " . $info['id'] . " waiting for master pos $pos\n" );
- $lb->waitFor( $this->startupPos[$masterName] );
- }
- }
-
- /**
- * Notify the ChronologyProtector that the LoadBalancer is about to shut
- * down. Saves replication positions.
- *
- * @param $lb LoadBalancer
- */
- function shutdownLB( $lb ) {
- // Don't start a session, don't bother with non-replicated setups
- if ( strval( session_id() ) == '' || $lb->getServerCount() <= 1 ) {
- return;
- }
- $masterName = $lb->getServerName( 0 );
- if ( isset( $this->shutdownPos[$masterName] ) ) {
- // Already done
- return;
- }
- // Only save the position if writes have been done on the connection
- $db = $lb->getAnyOpenConnection( 0 );
- $info = $lb->parentInfo();
- if ( !$db || !$db->doneWrites() ) {
- wfDebug( __METHOD__ . ": LB {$info['id']}, no writes done\n" );
- return;
- }
- $pos = $db->getMasterPos();
- wfDebug( __METHOD__ . ": LB {$info['id']} has master pos $pos\n" );
- $this->shutdownPos[$masterName] = $pos;
- }
-
- /**
- * Notify the ChronologyProtector that the LBFactory is done calling shutdownLB() for now.
- * May commit chronology data to persistent storage.
- */
- function shutdown() {
- if ( session_id() != '' && count( $this->shutdownPos ) ) {
- wfDebug( __METHOD__ . ": saving master pos for " .
- count( $this->shutdownPos ) . " master(s)\n" );
- $_SESSION[__CLASS__] = $this->shutdownPos;
- }
- }
-}
diff --git a/includes/db/LBFactory_Multi.php b/includes/db/LBFactory_Multi.php
index 2e4963d4..3043946a 100644
--- a/includes/db/LBFactory_Multi.php
+++ b/includes/db/LBFactory_Multi.php
@@ -145,8 +145,8 @@ class LBFactory_Multi extends LBFactory {
$section = $this->getSectionForWiki( $wiki );
if ( !isset( $this->mainLBs[$section] ) ) {
$lb = $this->newMainLB( $wiki, $section );
- $this->chronProt->initLB( $lb );
$lb->parentInfo( array( 'id' => "main-$section" ) );
+ $this->chronProt->initLB( $lb );
$this->mainLBs[$section] = $lb;
}
return $this->mainLBs[$section];
@@ -181,6 +181,7 @@ class LBFactory_Multi extends LBFactory {
if ( !isset( $this->extLBs[$cluster] ) ) {
$this->extLBs[$cluster] = $this->newExternalLB( $cluster, $wiki );
$this->extLBs[$cluster]->parentInfo( array( 'id' => "ext-$cluster" ) );
+ $this->chronProt->initLB( $this->extLBs[$cluster] );
}
return $this->extLBs[$cluster];
}
@@ -296,6 +297,9 @@ class LBFactory_Multi extends LBFactory {
foreach ( $this->mainLBs as $lb ) {
$this->chronProt->shutdownLB( $lb );
}
+ foreach ( $this->extLBs as $extLB ) {
+ $this->chronProt->shutdownLB( $extLB );
+ }
$this->chronProt->shutdown();
$this->commitMasterChanges();
}
diff --git a/includes/db/LoadBalancer.php b/includes/db/LoadBalancer.php
index 1e859278..857109db 100644
--- a/includes/db/LoadBalancer.php
+++ b/includes/db/LoadBalancer.php
@@ -78,7 +78,7 @@ class LoadBalancer {
}
}
- foreach( $params['servers'] as $i => $server ) {
+ foreach ( $params['servers'] as $i => $server ) {
$this->mLoads[$i] = $server['load'];
if ( isset( $server['groupLoads'] ) ) {
foreach ( $server['groupLoads'] as $group => $ratio ) {
@@ -117,7 +117,7 @@ class LoadBalancer {
* Given an array of non-normalised probabilities, this function will select
* an element and return the appropriate key
*
- * @deprecated 1.21, use ArrayUtils::pickRandom()
+ * @deprecated since 1.21, use ArrayUtils::pickRandom()
*
* @param $weights array
*
@@ -167,7 +167,7 @@ class LoadBalancer {
#wfDebugLog( 'connect', var_export( $loads, true ) );
# Return a random representative of the remainder
- return $this->pickRandom( $loads );
+ return ArrayUtils::pickRandom( $loads );
}
/**
@@ -219,6 +219,7 @@ class LoadBalancer {
}
if ( !$nonErrorLoads ) {
+ wfProfileOut( __METHOD__ );
throw new MWException( "Empty server array given to LoadBalancer" );
}
@@ -235,7 +236,7 @@ class LoadBalancer {
$currentLoads = $nonErrorLoads;
while ( count( $currentLoads ) ) {
if ( $wgReadOnly || $this->mAllowLagged || $laggedSlaveMode ) {
- $i = $this->pickRandom( $currentLoads );
+ $i = ArrayUtils::pickRandom( $currentLoads );
} else {
$i = $this->getRandomNonLagged( $currentLoads, $wiki );
if ( $i === false && count( $currentLoads ) != 0 ) {
@@ -243,7 +244,7 @@ class LoadBalancer {
wfDebugLog( 'replication', "All slaves lagged. Switch to read-only mode\n" );
$wgReadOnly = 'The database has been automatically locked ' .
'while the slave database servers catch up to the master';
- $i = $this->pickRandom( $currentLoads );
+ $i = ArrayUtils::pickRandom( $currentLoads );
$laggedSlaveMode = true;
}
}
@@ -348,7 +349,7 @@ class LoadBalancer {
* 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
- * @param $pos int
+ * @param $pos DBMasterPos
*/
public function waitFor( $pos ) {
wfProfileIn( __METHOD__ );
@@ -366,7 +367,7 @@ class LoadBalancer {
/**
* Set the master wait position and wait for ALL slaves to catch up to it
- * @param $pos int
+ * @param $pos DBMasterPos
*/
public function waitForAll( $pos ) {
wfProfileIn( __METHOD__ );
@@ -399,7 +400,7 @@ class LoadBalancer {
* @param $open bool
* @return bool
*/
- function doWait( $index, $open = false ) {
+ protected function doWait( $index, $open = false ) {
# Find a connection to wait on
$conn = $this->getAnyOpenConnection( $index );
if ( !$conn ) {
@@ -407,7 +408,7 @@ class LoadBalancer {
wfDebug( __METHOD__ . ": no connection open\n" );
return false;
} else {
- $conn = $this->openConnection( $index );
+ $conn = $this->openConnection( $index, '' );
if ( !$conn ) {
wfDebug( __METHOD__ . ": failed to open connection\n" );
return false;
@@ -443,8 +444,10 @@ class LoadBalancer {
wfProfileIn( __METHOD__ );
if ( $i == DB_LAST ) {
+ wfProfileOut( __METHOD__ );
throw new MWException( 'Attempt to call ' . __METHOD__ . ' with deprecated server index DB_LAST' );
} elseif ( $i === null || $i === false ) {
+ wfProfileOut( __METHOD__ );
throw new MWException( 'Attempt to call ' . __METHOD__ . ' with invalid server index' );
}
@@ -476,6 +479,7 @@ class LoadBalancer {
# Operation-based index
if ( $i == DB_SLAVE ) {
+ $this->mLastError = 'Unknown error'; // reset error string
$i = $this->getReaderIndex( false, $wiki );
# Couldn't find a working server in getReaderIndex()?
if ( $i === false ) {
@@ -542,6 +546,38 @@ class LoadBalancer {
}
/**
+ * Get a database connection handle reference
+ *
+ * The handle's methods wrap simply wrap those of a DatabaseBase handle
+ *
+ * @see LoadBalancer::getConnection() for parameter information
+ *
+ * @param integer $db
+ * @param mixed $groups
+ * @param string $wiki
+ * @return DBConnRef
+ */
+ public function getConnectionRef( $db, $groups = array(), $wiki = false ) {
+ return new DBConnRef( $this, $this->getConnection( $db, $groups, $wiki ) );
+ }
+
+ /**
+ * Get a database connection handle reference without connecting yet
+ *
+ * The handle's methods wrap simply wrap those of a DatabaseBase handle
+ *
+ * @see LoadBalancer::getConnection() for parameter information
+ *
+ * @param integer $db
+ * @param mixed $groups
+ * @param string $wiki
+ * @return DBConnRef
+ */
+ public function getLazyConnectionRef( $db, $groups = array(), $wiki = false ) {
+ return new DBConnRef( $this, array( $db, $groups, $wiki ) );
+ }
+
+ /**
* Open a connection to the server given by the specified index
* Index must be an actual index into the array.
* If the server is already open, returns it.
@@ -633,6 +669,7 @@ class LoadBalancer {
$server = $this->mServers[$i];
$server['serverIndex'] = $i;
$server['foreignPoolRefCount'] = 0;
+ $server['foreign'] = true;
$conn = $this->reallyOpenConnection( $server, $dbName );
if ( !$conn->isOpen() ) {
wfDebug( __METHOD__ . ": error opening connection for $i/$wiki\n" );
@@ -662,7 +699,7 @@ class LoadBalancer {
* @return bool
*/
function isOpen( $index ) {
- if( !is_integer( $index ) ) {
+ if ( !is_integer( $index ) ) {
return false;
}
return (bool)$this->getAnyOpenConnection( $index );
@@ -679,7 +716,7 @@ class LoadBalancer {
* @return DatabaseBase
*/
function reallyOpenConnection( $server, $dbNameOverride = false ) {
- if( !is_array( $server ) ) {
+ if ( !is_array( $server ) ) {
throw new MWException( 'You must update your load-balancing configuration. ' .
'See DefaultSettings.php entry for $wgDBservers.' );
}
@@ -830,7 +867,7 @@ class LoadBalancer {
*/
function closeAll() {
foreach ( $this->mConns as $conns2 ) {
- foreach ( $conns2 as $conns3 ) {
+ foreach ( $conns2 as $conns3 ) {
foreach ( $conns3 as $conn ) {
$conn->close();
}
@@ -1064,3 +1101,46 @@ class LoadBalancer {
$this->mLagTimes = null;
}
}
+
+/**
+ * Helper class to handle automatically marking connectons as reusable (via RAII pattern)
+ * as well handling deferring the actual network connection until the handle is used
+ *
+ * @ingroup Database
+ * @since 1.22
+ */
+class DBConnRef implements IDatabase {
+ /** @var LoadBalancer */
+ protected $lb;
+ /** @var DatabaseBase|null */
+ protected $conn;
+ /** @var Array|null */
+ protected $params;
+
+ /**
+ * @param $lb LoadBalancer
+ * @param $conn DatabaseBase|array Connection or (server index, group, wiki ID) array
+ */
+ public function __construct( LoadBalancer $lb, $conn ) {
+ $this->lb = $lb;
+ if ( $conn instanceof DatabaseBase ) {
+ $this->conn = $conn;
+ } else {
+ $this->params = $conn;
+ }
+ }
+
+ public function __call( $name, $arguments ) {
+ if ( $this->conn === null ) {
+ list( $db, $groups, $wiki ) = $this->params;
+ $this->conn = $this->lb->getConnection( $db, $groups, $wiki );
+ }
+ return call_user_func_array( array( $this->conn, $name ), $arguments );
+ }
+
+ function __destruct() {
+ if ( $this->conn !== null ) {
+ $this->lb->reuseConnection( $this->conn );
+ }
+ }
+}
diff --git a/includes/db/LoadMonitor.php b/includes/db/LoadMonitor.php
index ad7b3b2f..519e2dfd 100644
--- a/includes/db/LoadMonitor.php
+++ b/includes/db/LoadMonitor.php
@@ -135,18 +135,19 @@ class LoadMonitor_MySQL implements LoadMonitor {
$requestRate = 10;
global $wgMemc;
- if ( empty( $wgMemc ) )
+ if ( empty( $wgMemc ) ) {
$wgMemc = wfGetMainCache();
+ }
$masterName = $this->parent->getServerName( 0 );
$memcKey = wfMemcKey( 'lag_times', $masterName );
$times = $wgMemc->get( $memcKey );
- if ( $times ) {
+ if ( is_array( $times ) ) {
# Randomly recache with probability rising over $expiry
$elapsed = time() - $times['timestamp'];
$chance = max( 0, ( $expiry - $elapsed ) * $requestRate );
if ( mt_rand( 0, $chance ) != 0 ) {
- unset( $times['timestamp'] );
+ unset( $times['timestamp'] ); // hide from caller
wfProfileOut( __METHOD__ );
return $times;
}
@@ -156,6 +157,17 @@ class LoadMonitor_MySQL implements LoadMonitor {
}
# Cache key missing or expired
+ if ( $wgMemc->add( "$memcKey:lock", 1, 10 ) ) {
+ # Let this process alone update the cache value
+ $unlocker = new ScopedCallback( function() use ( $wgMemc, $memcKey ) {
+ $wgMemc->delete( $memcKey );
+ } );
+ } elseif ( is_array( $times ) ) {
+ # Could not acquire lock but an old cache exists, so use it
+ unset( $times['timestamp'] ); // hide from caller
+ wfProfileOut( __METHOD__ );
+ return $times;
+ }
$times = array();
foreach ( $serverIndexes as $i ) {
@@ -170,14 +182,11 @@ class LoadMonitor_MySQL implements LoadMonitor {
# Add a timestamp key so we know when it was cached
$times['timestamp'] = time();
- $wgMemc->set( $memcKey, $times, $expiry );
-
- # But don't give the timestamp to the caller
- unset( $times['timestamp'] );
- $lagTimes = $times;
+ $wgMemc->set( $memcKey, $times, $expiry + 10 );
+ unset( $times['timestamp'] ); // hide from caller
wfProfileOut( __METHOD__ );
- return $lagTimes;
+ return $times;
}
/**
diff --git a/includes/db/ORMRow.php b/includes/db/ORMRow.php
index 6c1f27ff..5ce3794d 100644
--- a/includes/db/ORMRow.php
+++ b/includes/db/ORMRow.php
@@ -43,17 +43,12 @@ class ORMRow implements IORMRow {
protected $fields = array( 'id' => null );
/**
- * @since 1.20
- * @var ORMTable
- */
- protected $table;
-
- /**
* If the object should update summaries of linked items when changed.
* For example, update the course_count field in universities when a course in courses is deleted.
* Settings this to false can prevent needless updating work in situations
* such as deleting a university, which will then delete all it's courses.
*
+ * @deprecated since 1.22
* @since 1.20
* @var bool
*/
@@ -64,21 +59,29 @@ class ORMRow implements IORMRow {
* This mode indicates that only summary fields got updated,
* which allows for optimizations.
*
+ * @deprecated since 1.22
* @since 1.20
* @var bool
*/
protected $inSummaryMode = false;
/**
+ * @deprecated since 1.22
+ * @since 1.20
+ * @var ORMTable|null
+ */
+ protected $table;
+
+ /**
* Constructor.
*
* @since 1.20
*
- * @param IORMTable $table
+ * @param IORMTable|null $table Deprecated since 1.22
* @param array|null $fields
- * @param boolean $loadDefaults
+ * @param boolean $loadDefaults Deprecated since 1.22
*/
- public function __construct( IORMTable $table, $fields = null, $loadDefaults = false ) {
+ public function __construct( IORMTable $table = null, $fields = null, $loadDefaults = false ) {
$this->table = $table;
if ( !is_array( $fields ) ) {
@@ -96,6 +99,7 @@ class ORMRow implements IORMRow {
* Load the specified fields from the database.
*
* @since 1.20
+ * @deprecated since 1.22
*
* @param array|null $fields
* @param boolean $override
@@ -160,6 +164,7 @@ class ORMRow implements IORMRow {
* Gets the value of a field but first loads it if not done so already.
*
* @since 1.20
+ * @deprecated since 1.22
*
* @param $name string
*
@@ -232,25 +237,10 @@ class ORMRow implements IORMRow {
}
/**
- * Sets multiple fields.
- *
- * @since 1.20
- *
- * @param array $fields The fields to set
- * @param boolean $override Override already set fields with the provided values?
- */
- public function setFields( array $fields, $override = true ) {
- foreach ( $fields as $name => $value ) {
- if ( $override || !$this->hasField( $name ) ) {
- $this->setField( $name, $value );
- }
- }
- }
-
- /**
* Gets the fields => values to write to the table.
*
* @since 1.20
+ * @deprecated since 1.22
*
* @return array
*/
@@ -269,10 +259,10 @@ class ORMRow implements IORMRow {
switch ( $type ) {
case 'array':
$value = (array)$value;
- // fall-through!
+ // fall-through!
case 'blob':
$value = serialize( $value );
- // fall-through!
+ // fall-through!
}
$values[$this->table->getPrefixedField( $name )] = $value;
@@ -283,6 +273,22 @@ class ORMRow implements IORMRow {
}
/**
+ * Sets multiple fields.
+ *
+ * @since 1.20
+ *
+ * @param array $fields The fields to set
+ * @param boolean $override Override already set fields with the provided values?
+ */
+ public function setFields( array $fields, $override = true ) {
+ foreach ( $fields as $name => $value ) {
+ if ( $override || !$this->hasField( $name ) ) {
+ $this->setField( $name, $value );
+ }
+ }
+ }
+
+ /**
* Serializes the object to an associative array which
* can then easily be converted into JSON or similar.
*
@@ -320,6 +326,7 @@ class ORMRow implements IORMRow {
* Load the default values, via getDefaults.
*
* @since 1.20
+ * @deprecated since 1.22
*
* @param boolean $override
*/
@@ -332,6 +339,7 @@ class ORMRow implements IORMRow {
* when it already exists, or inserting it when it doesn't.
*
* @since 1.20
+ * @deprecated since 1.22 Use IORMTable->updateRow or ->insertRow
*
* @param string|null $functionName
*
@@ -339,9 +347,9 @@ class ORMRow implements IORMRow {
*/
public function save( $functionName = null ) {
if ( $this->hasIdField() ) {
- return $this->saveExisting( $functionName );
+ return $this->table->updateRow( $this, $functionName );
} else {
- return $this->insert( $functionName );
+ return $this->table->insertRow( $this, $functionName );
}
}
@@ -349,6 +357,7 @@ class ORMRow implements IORMRow {
* Updates the object in the database.
*
* @since 1.20
+ * @deprecated since 1.22
*
* @param string|null $functionName
*
@@ -386,6 +395,7 @@ class ORMRow implements IORMRow {
* Inserts the object into the database.
*
* @since 1.20
+ * @deprecated since 1.22
*
* @param string|null $functionName
* @param array|null $options
@@ -418,16 +428,14 @@ class ORMRow implements IORMRow {
* Removes the object from the database.
*
* @since 1.20
+ * @deprecated since 1.22, use IORMTable->removeRow
*
* @return boolean Success indicator
*/
public function remove() {
$this->beforeRemove();
- $success = $this->table->delete( array( 'id' => $this->getId() ), __METHOD__ );
-
- // DatabaseBase::delete does not always return true for success as documented...
- $success = $success !== false;
+ $success = $this->table->removeRow( $this, __METHOD__ );
if ( $success ) {
$this->onRemoved();
@@ -440,6 +448,7 @@ class ORMRow implements IORMRow {
* Gets called before an object is removed from the database.
*
* @since 1.20
+ * @deprecated since 1.22
*/
protected function beforeRemove() {
$this->loadFields( $this->getBeforeRemoveFields(), false, true );
@@ -463,6 +472,7 @@ class ORMRow implements IORMRow {
* Can be overridden to get rid of linked data.
*
* @since 1.20
+ * @deprecated since 1.22
*/
protected function onRemoved() {
$this->setField( 'id', null );
@@ -503,51 +513,14 @@ class ORMRow implements IORMRow {
* @throws MWException
*/
public function setField( $name, $value ) {
- $fields = $this->table->getFields();
-
- if ( array_key_exists( $name, $fields ) ) {
- switch ( $fields[$name] ) {
- case 'int':
- $value = (int)$value;
- break;
- case 'float':
- $value = (float)$value;
- break;
- case 'bool':
- $value = (bool)$value;
- break;
- case 'array':
- if ( is_string( $value ) ) {
- $value = unserialize( $value );
- }
-
- if ( !is_array( $value ) ) {
- $value = array();
- }
- break;
- case 'blob':
- if ( is_string( $value ) ) {
- $value = unserialize( $value );
- }
- break;
- case 'id':
- if ( is_string( $value ) ) {
- $value = (int)$value;
- }
- break;
- }
-
- $this->fields[$name] = $value;
- } else {
- throw new MWException( 'Attempted to set unknown field ' . $name );
- }
+ $this->fields[$name] = $value;
}
/**
* Add an amount (can be negative) to the specified field (needs to be numeric).
- * TODO: most off this stuff makes more sense in the table class
*
* @since 1.20
+ * @deprecated since 1.22, use IORMTable->addToField
*
* @param string $field
* @param integer $amount
@@ -555,41 +528,14 @@ class ORMRow implements IORMRow {
* @return boolean Success indicator
*/
public function addToField( $field, $amount ) {
- if ( $amount == 0 ) {
- return true;
- }
-
- if ( !$this->hasIdField() ) {
- return false;
- }
-
- $absoluteAmount = abs( $amount );
- $isNegative = $amount < 0;
-
- $dbw = $this->table->getWriteDbConnection();
-
- $fullField = $this->table->getPrefixedField( $field );
-
- $success = $dbw->update(
- $this->table->getName(),
- array( "$fullField=$fullField" . ( $isNegative ? '-' : '+' ) . $absoluteAmount ),
- array( $this->table->getPrefixedField( 'id' ) => $this->getId() ),
- __METHOD__
- );
-
- if ( $success && $this->hasField( $field ) ) {
- $this->setField( $field, $this->getField( $field ) + $amount );
- }
-
- $this->table->releaseConnection( $dbw );
-
- return $success;
+ return $this->table->addToField( $this->getUpdateConditions(), $field, $amount );
}
/**
* Return the names of the fields.
*
* @since 1.20
+ * @deprecated since 1.22
*
* @return array
*/
@@ -601,6 +547,7 @@ class ORMRow implements IORMRow {
* Computes and updates the values of the summary fields.
*
* @since 1.20
+ * @deprecated since 1.22
*
* @param array|string|null $summaryFields
*/
@@ -612,6 +559,7 @@ class ORMRow implements IORMRow {
* Sets the value for the @see $updateSummaries field.
*
* @since 1.20
+ * @deprecated since 1.22
*
* @param boolean $update
*/
@@ -623,6 +571,7 @@ class ORMRow implements IORMRow {
* Sets the value for the @see $inSummaryMode field.
*
* @since 1.20
+ * @deprecated since 1.22
*
* @param boolean $summaryMode
*/
@@ -631,39 +580,10 @@ class ORMRow implements IORMRow {
}
/**
- * Return if any fields got changed.
- *
- * @since 1.20
- *
- * @param IORMRow $object
- * @param boolean|array $excludeSummaryFields
- * When set to true, summary field changes are ignored.
- * Can also be an array of fields to ignore.
- *
- * @return boolean
- */
- protected function fieldsChanged( IORMRow $object, $excludeSummaryFields = false ) {
- $exclusionFields = array();
-
- if ( $excludeSummaryFields !== false ) {
- $exclusionFields = is_array( $excludeSummaryFields ) ? $excludeSummaryFields : $this->table->getSummaryFields();
- }
-
- foreach ( $this->fields as $name => $value ) {
- $excluded = $excludeSummaryFields && in_array( $name, $exclusionFields );
-
- if ( !$excluded && $object->getField( $name ) !== $value ) {
- return true;
- }
- }
-
- return false;
- }
-
- /**
* Returns the table this IORMRow is a row in.
*
* @since 1.20
+ * @deprecated since 1.22
*
* @return IORMTable
*/
diff --git a/includes/db/ORMTable.php b/includes/db/ORMTable.php
index bcbe94a3..5f6723b9 100644
--- a/includes/db/ORMTable.php
+++ b/includes/db/ORMTable.php
@@ -814,10 +814,59 @@ class ORMTable extends DBAccessBase implements IORMTable {
*/
public function getFieldsFromDBResult( stdClass $result ) {
$result = (array)$result;
- return array_combine(
+
+ $rawFields = array_combine(
$this->unprefixFieldNames( array_keys( $result ) ),
array_values( $result )
);
+
+ $fieldDefinitions = $this->getFields();
+ $fields = array();
+
+ foreach ( $rawFields as $name => $value ) {
+ if ( array_key_exists( $name, $fieldDefinitions ) ) {
+ switch ( $fieldDefinitions[$name] ) {
+ case 'int':
+ $value = (int)$value;
+ break;
+ case 'float':
+ $value = (float)$value;
+ break;
+ case 'bool':
+ if ( is_string( $value ) ) {
+ $value = $value !== '0';
+ } elseif ( is_int( $value ) ) {
+ $value = $value !== 0;
+ }
+ break;
+ case 'array':
+ if ( is_string( $value ) ) {
+ $value = unserialize( $value );
+ }
+
+ if ( !is_array( $value ) ) {
+ $value = array();
+ }
+ break;
+ case 'blob':
+ if ( is_string( $value ) ) {
+ $value = unserialize( $value );
+ }
+ break;
+ case 'id':
+ if ( is_string( $value ) ) {
+ $value = (int)$value;
+ }
+ break;
+ }
+
+ $fields[$name] = $value;
+ } else {
+ throw new MWException( 'Attempted to set unknown field ' . $name );
+ }
+ }
+
+ return $fields;
}
/**
@@ -867,14 +916,15 @@ class ORMTable extends DBAccessBase implements IORMTable {
*
* @since 1.20
*
- * @param array $data
+ * @param array $fields
* @param boolean $loadDefaults
*
* @return IORMRow
*/
- public function newRow( array $data, $loadDefaults = false ) {
+ public function newRow( array $fields, $loadDefaults = false ) {
$class = $this->getRowClass();
- return new $class( $this, $data, $loadDefaults );
+
+ return new $class( $this, $fields, $loadDefaults );
}
/**
@@ -901,4 +951,157 @@ class ORMTable extends DBAccessBase implements IORMTable {
return array_key_exists( $name, $this->getFields() );
}
+ /**
+ * Updates the provided row in the database.
+ *
+ * @since 1.22
+ *
+ * @param IORMRow $row The row to save
+ * @param string|null $functionName
+ *
+ * @return boolean Success indicator
+ */
+ public function updateRow( IORMRow $row, $functionName = null ) {
+ $dbw = $this->getWriteDbConnection();
+
+ $success = $dbw->update(
+ $this->getName(),
+ $this->getWriteValues( $row ),
+ $this->getPrefixedValues( array( 'id' => $row->getId() ) ),
+ is_null( $functionName ) ? __METHOD__ : $functionName
+ );
+
+ $this->releaseConnection( $dbw );
+
+ // DatabaseBase::update does not always return true for success as documented...
+ return $success !== false;
+ }
+
+ /**
+ * Inserts the provided row into the database.
+ *
+ * @since 1.22
+ *
+ * @param IORMRow $row
+ * @param string|null $functionName
+ * @param array|null $options
+ *
+ * @return boolean Success indicator
+ */
+ public function insertRow( IORMRow $row, $functionName = null, array $options = null ) {
+ $dbw = $this->getWriteDbConnection();
+
+ $success = $dbw->insert(
+ $this->getName(),
+ $this->getWriteValues( $row ),
+ is_null( $functionName ) ? __METHOD__ : $functionName,
+ $options
+ );
+
+ // DatabaseBase::insert does not always return true for success as documented...
+ $success = $success !== false;
+
+ if ( $success ) {
+ $row->setField( 'id', $dbw->insertId() );
+ }
+
+ $this->releaseConnection( $dbw );
+
+ return $success;
+ }
+
+ /**
+ * Gets the fields => values to write to the table.
+ *
+ * @since 1.22
+ *
+ * @param IORMRow $row
+ *
+ * @return array
+ */
+ protected function getWriteValues( IORMRow $row ) {
+ $values = array();
+
+ $rowFields = $row->getFields();
+
+ foreach ( $this->getFields() as $name => $type ) {
+ if ( array_key_exists( $name, $rowFields ) ) {
+ $value = $rowFields[$name];
+
+ switch ( $type ) {
+ case 'array':
+ $value = (array)$value;
+ // fall-through!
+ case 'blob':
+ $value = serialize( $value );
+ // fall-through!
+ }
+
+ $values[$this->getPrefixedField( $name )] = $value;
+ }
+ }
+
+ return $values;
+ }
+
+ /**
+ * Removes the provided row from the database.
+ *
+ * @since 1.22
+ *
+ * @param IORMRow $row
+ * @param string|null $functionName
+ *
+ * @return boolean Success indicator
+ */
+ public function removeRow( IORMRow $row, $functionName = null ) {
+ $success = $this->delete(
+ array( 'id' => $row->getId() ),
+ is_null( $functionName ) ? __METHOD__ : $functionName
+ );
+
+ // DatabaseBase::delete does not always return true for success as documented...
+ return $success !== false;
+ }
+
+ /**
+ * Add an amount (can be negative) to the specified field (needs to be numeric).
+ *
+ * @since 1.22
+ *
+ * @param array $conditions
+ * @param string $field
+ * @param integer $amount
+ *
+ * @return boolean Success indicator
+ * @throws MWException
+ */
+ public function addToField( array $conditions, $field, $amount ) {
+ if ( !array_key_exists( $field, $this->fields ) ) {
+ throw new MWException( 'Unknown field "' . $field . '" provided' );
+ }
+
+ if ( $amount == 0 ) {
+ return true;
+ }
+
+ $absoluteAmount = abs( $amount );
+ $isNegative = $amount < 0;
+
+ $fullField = $this->getPrefixedField( $field );
+
+ $dbw = $this->getWriteDbConnection();
+
+ $success = $dbw->update(
+ $this->getName(),
+ array( "$fullField=$fullField" . ( $isNegative ? '-' : '+' ) . $absoluteAmount ),
+ $this->getPrefixedValues( $conditions ),
+ __METHOD__
+ ) !== false; // DatabaseBase::update does not always return true for success as documented...
+
+ $this->releaseConnection( $dbw );
+
+ return $success;
+ }
+
}
diff --git a/includes/debug/Debug.php b/includes/debug/Debug.php
index 8c39e1a1..6e9ccc41 100644
--- a/includes/debug/Debug.php
+++ b/includes/debug/Debug.php
@@ -1,6 +1,6 @@
<?php
/**
- * Debug toolbar related code
+ * Debug toolbar related code.
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
@@ -21,7 +21,7 @@
*/
/**
- * New debugger system that outputs a toolbar on page view
+ * New debugger system that outputs a toolbar on page view.
*
* By default, most methods do nothing ( self::$enabled = false ). You have
* to explicitly call MWDebug::init() to enabled them.
@@ -35,28 +35,28 @@ class MWDebug {
/**
* Log lines
*
- * @var array
+ * @var array $log
*/
protected static $log = array();
/**
- * Debug messages from wfDebug()
+ * Debug messages from wfDebug().
*
- * @var array
+ * @var array $debug
*/
protected static $debug = array();
/**
- * Queries
+ * SQL statements of the databses queries.
*
- * @var array
+ * @var array $query
*/
protected static $query = array();
/**
* Is the debugger enabled?
*
- * @var bool
+ * @var bool $enabled
*/
protected static $enabled = false;
@@ -64,7 +64,7 @@ class MWDebug {
* Array of functions that have already been warned, formatted
* function-caller to prevent a buttload of warnings
*
- * @var array
+ * @var array $deprecationWarnings
*/
protected static $deprecationWarnings = array();
@@ -135,10 +135,24 @@ class MWDebug {
* @since 1.19
* @param $msg string
* @param $callerOffset int
- * @param int $level A PHP error level. See sendWarning()
+ * @param $level int A PHP error level. See sendWarning()
+ * @param $log string: 'production' will always trigger a php error, 'auto'
+ * will trigger an error if $wgDevelopmentWarnings is true, and 'debug'
+ * will only write to the debug log(s).
+ *
* @return mixed
*/
- public static function warning( $msg, $callerOffset = 1, $level = E_USER_NOTICE ) {
+ public static function warning( $msg, $callerOffset = 1, $level = E_USER_NOTICE, $log = 'auto' ) {
+ global $wgDevelopmentWarnings;
+
+ if ( $log === 'auto' && !$wgDevelopmentWarnings ) {
+ $log = 'debug';
+ }
+
+ if ( $log === 'debug' ) {
+ $level = false;
+ }
+
$callerDescription = self::getCallerDescription( $callerOffset );
self::sendWarning( $msg, $callerDescription, $level );
@@ -212,7 +226,8 @@ class MWDebug {
}
if ( $sendToLog ) {
- self::sendWarning( $msg, $callerDescription, E_USER_DEPRECATED );
+ global $wgDevelopmentWarnings; // we could have a more specific $wgDeprecationWarnings setting.
+ self::sendWarning( $msg, $callerDescription, $wgDevelopmentWarnings ? E_USER_DEPRECATED : false );
}
if ( self::$enabled ) {
@@ -267,23 +282,21 @@ class MWDebug {
}
/**
- * Send a warning either to the debug log or by triggering an user PHP
- * error depending on $wgDevelopmentWarnings.
+ * Send a warning to the debug log and optionally also trigger a PHP
+ * error, depending on the $level argument.
*
- * @param string $msg Message to send
- * @param array $caller caller description get from getCallerDescription()
- * @param $level error level to use if $wgDevelopmentWarnings is true
+ * @param $msg string Message to send
+ * @param $caller array caller description get from getCallerDescription()
+ * @param $level int|bool error level to use; set to false to not trigger an error
*/
private static function sendWarning( $msg, $caller, $level ) {
- global $wgDevelopmentWarnings;
-
$msg .= ' [Called from ' . $caller['func'] . ' in ' . $caller['file'] . ']';
- if ( $wgDevelopmentWarnings ) {
+ if ( $level !== false ) {
trigger_error( $msg, $level );
- } else {
- wfDebug( "$msg\n" );
}
+
+ wfDebug( "$msg\n" );
}
/**
@@ -297,7 +310,7 @@ class MWDebug {
global $wgDebugComments, $wgShowDebug;
if ( self::$enabled || $wgDebugComments || $wgShowDebug ) {
- self::$debug[] = rtrim( $str );
+ self::$debug[] = rtrim( UtfNormal::cleanUp( $str ) );
}
}
@@ -319,7 +332,7 @@ class MWDebug {
self::$query[] = array(
'sql' => $sql,
'function' => $function,
- 'master' => (bool) $isMaster,
+ 'master' => (bool)$isMaster,
'time' => 0.0,
'_start' => microtime( true ),
);
@@ -471,10 +484,10 @@ class MWDebug {
// output errors as debug info, when display_errors is on
// this is necessary for all non html output of the api, because that clears all errors first
$obContents = ob_get_contents();
- if( $obContents ) {
+ if ( $obContents ) {
$obContentArray = explode( '<br />', $obContents );
- foreach( $obContentArray as $obContent ) {
- if( trim( $obContent ) ) {
+ foreach ( $obContentArray as $obContent ) {
+ if ( trim( $obContent ) ) {
self::debugMsg( Sanitizer::stripAllTags( $obContent ) );
}
}
@@ -485,15 +498,10 @@ class MWDebug {
$result->setIndexedTagName( $debugInfo, 'debuginfo' );
$result->setIndexedTagName( $debugInfo['log'], 'line' );
- foreach( $debugInfo['debugLog'] as $index => $debugLogText ) {
- $vals = array();
- ApiResult::setContent( $vals, $debugLogText );
- $debugInfo['debugLog'][$index] = $vals; //replace
- }
$result->setIndexedTagName( $debugInfo['debugLog'], 'msg' );
$result->setIndexedTagName( $debugInfo['queries'], 'query' );
$result->setIndexedTagName( $debugInfo['includes'], 'queries' );
- $result->addValue( array(), 'debuginfo', $debugInfo );
+ $result->addValue( null, 'debuginfo', $debugInfo );
}
/**
diff --git a/includes/diff/DairikiDiff.php b/includes/diff/DairikiDiff.php
index 94ffc066..298d7240 100644
--- a/includes/diff/DairikiDiff.php
+++ b/includes/diff/DairikiDiff.php
@@ -183,7 +183,7 @@ class _DiffEngine {
* @param $to_lines
* @return array
*/
- function diff ( $from_lines, $to_lines ) {
+ function diff( $from_lines, $to_lines ) {
wfProfileIn( __METHOD__ );
// Diff and store locally
@@ -241,7 +241,7 @@ class _DiffEngine {
* @param $from_lines
* @param $to_lines
*/
- function diff_local ( $from_lines, $to_lines ) {
+ function diff_local( $from_lines, $to_lines ) {
global $wgExternalDiffEngine;
wfProfileIn( __METHOD__ );
@@ -271,7 +271,8 @@ class _DiffEngine {
$this->xchanged[$skip] = $this->ychanged[$skip] = false;
}
// Skip trailing common lines.
- $xi = $n_from; $yi = $n_to;
+ $xi = $n_from;
+ $yi = $n_to;
for ( $endskip = 0; --$xi > $skip && --$yi > $skip; $endskip++ ) {
if ( $from_lines[$xi] !== $to_lines[$yi] ) {
break;
@@ -394,7 +395,7 @@ class _DiffEngine {
break;
}
}
- while ( list ( , $y ) = each( $matches ) ) {
+ while ( list( , $y ) = each( $matches ) ) {
if ( $y > $this->seq[$k -1] ) {
assert( '$y < $this->seq[$k]' );
// Optimization: this is a common case:
@@ -469,10 +470,9 @@ class _DiffEngine {
* @param $yoff
* @param $ylim
*/
- function _compareseq ( $xoff, $xlim, $yoff, $ylim ) {
+ function _compareseq( $xoff, $xlim, $yoff, $ylim ) {
// Slide down the bottom initial diagonal.
- while ( $xoff < $xlim && $yoff < $ylim
- && $this->xv[$xoff] == $this->yv[$yoff] ) {
+ while ( $xoff < $xlim && $yoff < $ylim && $this->xv[$xoff] == $this->yv[$yoff] ) {
++$xoff;
++$yoff;
}
@@ -491,7 +491,7 @@ class _DiffEngine {
// $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 );
+ list( $lcs, $seps ) = $this->_diag( $xoff, $xlim, $yoff, $ylim, $nchunks );
}
if ( $lcs == 0 ) {
@@ -508,7 +508,7 @@ class _DiffEngine {
reset( $seps );
$pt1 = $seps[0];
while ( $pt2 = next( $seps ) ) {
- $this->_compareseq ( $pt1[0], $pt2[0], $pt1[1], $pt2[1] );
+ $this->_compareseq( $pt1[0], $pt2[0], $pt1[1], $pt2[1] );
$pt1 = $pt2;
}
}
@@ -554,9 +554,11 @@ class _DiffEngine {
while ( $i < $len && ! $changed[$i] ) {
assert( '$j < $other_len && ! $other_changed[$j]' );
- $i++; $j++;
- while ( $j < $other_len && $other_changed[$j] )
+ $i++;
$j++;
+ while ( $j < $other_len && $other_changed[$j] ) {
+ $j++;
+ }
}
if ( $i == $len ) {
@@ -690,7 +692,7 @@ class Diff {
/**
* Check for empty diff.
*
- * @return bool True iff two sequences were identical.
+ * @return bool True if two sequences were identical.
*/
function isEmpty() {
foreach ( $this->edits as $edit ) {
@@ -1109,7 +1111,7 @@ class ArrayDiffFormatter extends DiffFormatter {
$newline = 1;
$retval = array();
foreach ( $diff->edits as $edit ) {
- switch( $edit->type ) {
+ switch ( $edit->type ) {
case 'add':
foreach ( $edit->closing as $l ) {
$retval[] = array(
@@ -1204,7 +1206,7 @@ class _HWLDF_WordAccumulator {
* @param $words
* @param $tag string
*/
- function addWords ( $words, $tag = '' ) {
+ function addWords( $words, $tag = '' ) {
if ( $tag != $this->_tag ) {
$this->_flushGroup( $tag );
}
@@ -1244,7 +1246,7 @@ class WordLevelDiff extends MappedDiff {
* @param $orig_lines
* @param $closing_lines
*/
- function __construct ( $orig_lines, $closing_lines ) {
+ function __construct( $orig_lines, $closing_lines ) {
wfProfileIn( __METHOD__ );
list( $orig_words, $orig_stripped ) = $this->_split( $orig_lines );
@@ -1282,8 +1284,12 @@ class WordLevelDiff extends MappedDiff {
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] );
+ foreach ( $m[0] as $word ) {
+ $words[] = $word;
+ }
+ foreach ( $m[1] as $stripped_word ) {
+ $stripped[] = $stripped_word;
+ }
}
}
}
diff --git a/includes/diff/DifferenceEngine.php b/includes/diff/DifferenceEngine.php
index 0f3c77ff..e436f58d 100644
--- a/includes/diff/DifferenceEngine.php
+++ b/includes/diff/DifferenceEngine.php
@@ -38,6 +38,7 @@ class DifferenceEngine extends ContextSource {
* @private
*/
var $mOldid, $mNewid;
+ var $mOldTags, $mNewTags;
/**
* @var Content
*/
@@ -48,7 +49,6 @@ class DifferenceEngine extends ContextSource {
* @var Title
*/
var $mOldPage, $mNewPage;
- var $mRcidMarkPatrolled;
/**
* @var Revision
@@ -80,8 +80,8 @@ class DifferenceEngine extends ContextSource {
* Constructor
* @param $context IContextSource context to use, anything else will be ignored
* @param $old Integer old ID we want to show and diff with.
- * @param string $new either 'prev' or 'next'.
- * @param $rcid Integer ??? FIXME (default 0)
+ * @param $new String either 'prev' or 'next'.
+ * @param $rcid Integer Deprecated, no longer used!
* @param $refreshCache boolean If set, refreshes the diff cache
* @param $unhide boolean If set, allow viewing deleted revs
*/
@@ -96,7 +96,6 @@ class DifferenceEngine extends ContextSource {
$this->mOldid = $old;
$this->mNewid = $new;
- $this->mRcidMarkPatrolled = intval( $rcid ); # force it to be an integer
$this->mRefreshCache = $refreshCache;
$this->unhide = $unhide;
}
@@ -186,10 +185,14 @@ class DifferenceEngine extends ContextSource {
$out = $this->getOutput();
$missing = array();
- if ( $this->mOldRev === null ) {
+ if ( $this->mOldRev === null ||
+ ( $this->mOldRev && $this->mOldContent === null )
+ ) {
$missing[] = $this->deletedIdMarker( $this->mOldid );
}
- if ( $this->mNewRev === null ) {
+ if ( $this->mNewRev === null ||
+ ( $this->mNewRev && $this->mNewContent === null )
+ ) {
$missing[] = $this->deletedIdMarker( $this->mNewid );
}
@@ -223,33 +226,6 @@ class DifferenceEngine extends ContextSource {
throw new PermissionsError( 'read', $permErrors );
}
- # 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 ( ExternalEdit::useExternalEngine( $this->getContext(), 'diff' ) ) {
- //TODO: come up with a good solution for non-text content here.
- // at least, the content format needs to be passed to the client somehow.
- // Currently, action=raw will just fail for non-text content.
-
- $urls = array(
- 'File' => array( 'Extension' => 'wiki', 'URL' =>
- # This should be mOldPage, but it may not be set, see below.
- $this->mNewPage->getCanonicalURL( array(
- 'action' => 'raw', 'oldid' => $this->mOldid ) )
- ),
- 'File2' => array( 'Extension' => 'wiki', 'URL' =>
- $this->mNewPage->getCanonicalURL( array(
- 'action' => 'raw', 'oldid' => $this->mNewid ) )
- ),
- );
-
- $externalEditor = new ExternalEdit( $this->getContext(), $urls );
- $externalEditor->execute();
-
- wfProfileOut( __METHOD__ );
- return;
- }
-
$rollback = '';
$undoLink = '';
@@ -279,11 +255,6 @@ class DifferenceEngine extends ContextSource {
} else {
wfRunHooks( 'DiffViewHeader', array( $this, $this->mOldRev, $this->mNewRev ) );
- $sk = $this->getSkin();
- if ( method_exists( $sk, 'suppressQuickbar' ) ) {
- $sk->suppressQuickbar();
- }
-
if ( $this->mNewPage->equals( $this->mOldPage ) ) {
$out->setPageTitle( $this->msg( 'difference-title', $this->mNewPage->getPrefixedText() ) );
$samePage = true;
@@ -304,7 +275,7 @@ class DifferenceEngine extends ContextSource {
}
if ( !$this->mOldRev->isDeleted( Revision::DELETED_TEXT ) && !$this->mNewRev->isDeleted( Revision::DELETED_TEXT ) ) {
$undoLink = Html::element( 'a', array(
- 'href' => $this->mNewPage->getLocalUrl( array(
+ 'href' => $this->mNewPage->getLocalURL( array(
'action' => 'edit',
'undoafter' => $this->mOldid,
'undo' => $this->mNewid ) ),
@@ -336,12 +307,14 @@ class DifferenceEngine extends ContextSource {
$ldel = $this->revisionDeleteLink( $this->mOldRev );
$oldRevisionHeader = $this->getRevisionHeader( $this->mOldRev, 'complete' );
+ $oldChangeTags = ChangeTags::formatSummaryRow( $this->mOldTags, 'diff' );
$oldHeader = '<div id="mw-diff-otitle1"><strong>' . $oldRevisionHeader . '</strong></div>' .
'<div id="mw-diff-otitle2">' .
Linker::revUserTools( $this->mOldRev, !$this->unhide ) . '</div>' .
'<div id="mw-diff-otitle3">' . $oldminor .
Linker::revComment( $this->mOldRev, !$diffOnly, !$this->unhide ) . $ldel . '</div>' .
+ '<div id="mw-diff-otitle5">' . $oldChangeTags[0] . '</div>' .
'<div id="mw-diff-otitle4">' . $prevlink . '</div>';
if ( $this->mOldRev->isDeleted( Revision::DELETED_TEXT ) ) {
@@ -387,18 +360,21 @@ class DifferenceEngine extends ContextSource {
$formattedRevisionTools[] = $this->msg( 'parentheses' )->rawParams( $tool )->escaped();
}
$newRevisionHeader = $this->getRevisionHeader( $this->mNewRev, 'complete' ) . ' ' . implode( ' ', $formattedRevisionTools );
+ $newChangeTags = ChangeTags::formatSummaryRow( $this->mNewTags, 'diff' );
$newHeader = '<div id="mw-diff-ntitle1"><strong>' . $newRevisionHeader . '</strong></div>' .
'<div id="mw-diff-ntitle2">' . Linker::revUserTools( $this->mNewRev, !$this->unhide ) .
" $rollback</div>" .
'<div id="mw-diff-ntitle3">' . $newminor .
Linker::revComment( $this->mNewRev, !$diffOnly, !$this->unhide ) . $rdel . '</div>' .
+ '<div id="mw-diff-ntitle5">' . $newChangeTags[0] . '</div>' .
'<div id="mw-diff-ntitle4">' . $nextlink . $this->markPatrolledLink() . '</div>';
if ( $this->mNewRev->isDeleted( Revision::DELETED_TEXT ) ) {
$deleted = true; // new revisions text is hidden
- if ( $this->mNewRev->isDeleted( Revision::DELETED_RESTRICTED ) )
+ if ( $this->mNewRev->isDeleted( Revision::DELETED_RESTRICTED ) ) {
$suppressed = true; // also suppressed
+ }
}
# If the diff cannot be shown due to a deleted revision, then output
@@ -414,7 +390,7 @@ class DifferenceEngine extends ContextSource {
array( $msg ) );
} else {
# Give explanation and add a link to view the diff...
- $link = $this->getTitle()->getFullUrl( $this->getRequest()->appendQueryValue( 'unhide', '1', true ) );
+ $link = $this->getTitle()->getFullURL( $this->getRequest()->appendQueryValue( 'unhide', '1', true ) );
$msg = $suppressed ? 'rev-suppressed-unhide-diff' : 'rev-deleted-unhide-diff';
$out->wrapWikiMsg( "<div id='mw-$msg' class='mw-warning plainlinks'>\n$1\n</div>\n", array( $msg, $link ) );
}
@@ -443,45 +419,48 @@ class DifferenceEngine extends ContextSource {
* @return String
*/
protected function markPatrolledLink() {
- global $wgUseRCPatrol;
+ global $wgUseRCPatrol, $wgEnableAPI, $wgEnableWriteAPI;
+ $user = $this->getUser();
if ( $this->mMarkPatrolledLink === null ) {
// Prepare a change patrol link, if applicable
- if ( $wgUseRCPatrol && $this->mNewPage->quickUserCan( 'patrol', $this->getUser() ) ) {
- // 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;
+ if (
+ // Is patrolling enabled and the user allowed to?
+ $wgUseRCPatrol && $this->mNewPage->quickUserCan( 'patrol', $user ) &&
+ // Only do this if the revision isn't more than 6 hours older
+ // than the Max RC age (6h because the RC might not be cleaned out regularly)
+ RecentChange::isInRCLifespan( $this->mNewRev->getTimestamp(), 21600 )
+ ) {
+ // Look for an unpatrolled change corresponding to this diff
+
+ $db = wfGetDB( DB_SLAVE );
+ $change = RecentChange::newFromConds(
+ array(
+ 'rc_timestamp' => $db->timestamp( $this->mNewRev->getTimestamp() ),
+ 'rc_this_oldid' => $this->mNewid,
+ 'rc_patrolled' => 0
+ ),
+ __METHOD__,
+ array( 'USE INDEX' => 'rc_timestamp' )
+ );
+
+ if ( $change && $change->getPerformer()->getName() !== $user->getName() ) {
+ $rcid = $change->getAttribute( 'rc_id' );
} 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;
- }
+ // None found or the page has been created by the current user.
+ // If the user could patrol this it already would be patrolled
+ $rcid = 0;
}
// Build the link
if ( $rcid ) {
$this->getOutput()->preventClickjacking();
- $this->getOutput()->addModules( 'mediawiki.page.patrol.ajax' );
+ if ( $wgEnableAPI && $wgEnableWriteAPI
+ && $user->isAllowed( 'writeapi' )
+ ) {
+ $this->getOutput()->addModules( 'mediawiki.page.patrol.ajax' );
+ }
- $token = $this->getUser()->getEditToken( $rcid );
+ $token = $user->getEditToken( $rcid );
$this->mMarkPatrolledLink = ' <span class="patrollink">[' . Linker::linkKnown(
$this->mNewPage,
$this->msg( 'markaspatrolleddiff' )->escaped(),
@@ -536,7 +515,7 @@ class DifferenceEngine extends ContextSource {
if ( $this->mNewPage->isCssJsSubpage() || $this->mNewPage->isCssOrJsPage() ) {
// Stolen from Article::view --AG 2007-10-11
// Give hooks a chance to customise the output
- // @TODO: standardize this crap into one function
+ // @todo standardize this crap into one function
if ( ContentHandler::runLegacyHooks( 'ShowRawCssJs', array( $this->mNewContent, $this->mNewPage, $out ) ) ) {
// NOTE: deprecated hook, B/C only
// use the content object's own rendering
@@ -545,9 +524,9 @@ class DifferenceEngine extends ContextSource {
$txt = $po ? $po->getText() : '';
$out->addHTML( $txt );
}
- } elseif( !wfRunHooks( 'ArticleContentViewCustom', array( $this->mNewContent, $this->mNewPage, $out ) ) ) {
+ } elseif ( !wfRunHooks( 'ArticleContentViewCustom', array( $this->mNewContent, $this->mNewPage, $out ) ) ) {
// Handled by extension
- } elseif( !ContentHandler::runLegacyHooks( 'ArticleViewCustom', array( $this->mNewContent, $this->mNewPage, $out ) ) ) {
+ } elseif ( !ContentHandler::runLegacyHooks( 'ArticleViewCustom', array( $this->mNewContent, $this->mNewPage, $out ) ) ) {
// NOTE: deprecated hook, B/C only
// Handled by extension
} else {
@@ -576,7 +555,7 @@ class DifferenceEngine extends ContextSource {
# Show categories etc.
$out->addParserOutputNoText( $parserOutput );
}
- } else if ( $parserOutput ) {
+ } elseif ( $parserOutput ) {
$out->addParserOutput( $parserOutput );
}
}
@@ -637,6 +616,10 @@ class DifferenceEngine extends ContextSource {
return false;
} else {
$multi = $this->getMultiNotice();
+ // Display a message when the diff is empty
+ if ( $body === '' ) {
+ $notice .= '<div class="mw-diff-empty">' . $this->msg( 'diff-empty' )->parse() . "</div>\n";
+ }
return $this->addHeader( $body, $otitle, $ntitle, $multi, $notice );
}
}
@@ -662,7 +645,6 @@ class DifferenceEngine extends ContextSource {
return false;
}
// Short-circuit
- // If mOldRev is false, it means that the
if ( $this->mOldRev === false || ( $this->mOldRev && $this->mNewRev
&& $this->mOldRev->getID() == $this->mNewRev->getID() ) )
{
@@ -714,24 +696,6 @@ class DifferenceEngine extends ContextSource {
}
/**
- * 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' );
- wfDl( 'php_wikidiff' );
- wfProfileOut( __METHOD__ . '-php_wikidiff.so' );
- }
- elseif ( $wgExternalDiffEngine == 'wikidiff2' && !function_exists( 'wikidiff2_do_diff' ) ) {
- wfProfileIn( __METHOD__ . '-php_wikidiff2.so' );
- wfDl( 'wikidiff2' );
- wfProfileOut( __METHOD__ . '-php_wikidiff2.so' );
- }
- }
-
- /**
* Generate a diff, no caching.
*
* This implementation uses generateTextDiffBody() to generate a diff based on the default
@@ -797,8 +761,6 @@ class DifferenceEngine extends ContextSource {
$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
@@ -893,7 +855,9 @@ class DifferenceEngine extends ContextSource {
}
function localiseLineNumbersCb( $matches ) {
- if ( $matches[1] === '1' && $this->mReducedLineNumbers ) return '';
+ if ( $matches[1] === '1' && $this->mReducedLineNumbers ) {
+ return '';
+ }
return $this->msg( 'lineno' )->numParams( $matches[1] )->escaped();
}
@@ -1024,11 +988,13 @@ class DifferenceEngine extends ContextSource {
$colspan = 1;
$multiColspan = 2;
}
- $header .= "
- <tr style='vertical-align: top;'>
- <td colspan='$colspan' class='diff-otitle'>{$otitle}</td>
- <td colspan='$colspan' class='diff-ntitle'>{$ntitle}</td>
- </tr>";
+ if ( $otitle || $ntitle ) {
+ $header .= "
+ <tr style='vertical-align: top;'>
+ <td colspan='$colspan' class='diff-otitle'>{$otitle}</td>
+ <td colspan='$colspan' class='diff-ntitle'>{$ntitle}</td>
+ </tr>";
+ }
}
if ( $multi != '' ) {
@@ -1169,6 +1135,25 @@ class DifferenceEngine extends ContextSource {
$this->mOldPage = $this->mOldRev->getTitle();
}
+ // Load tags information for both revisions
+ $dbr = wfGetDB( DB_SLAVE );
+ if ( $this->mOldid !== false ) {
+ $this->mOldTags = $dbr->selectField(
+ 'tag_summary',
+ 'ts_tags',
+ array( 'ts_rev_id' => $this->mOldid ),
+ __METHOD__
+ );
+ } else {
+ $this->mOldTags = false;
+ }
+ $this->mNewTags = $dbr->selectField(
+ 'tag_summary',
+ 'ts_tags',
+ array( 'ts_rev_id' => $this->mNewid ),
+ __METHOD__
+ );
+
return true;
}
@@ -1180,26 +1165,29 @@ class DifferenceEngine extends ContextSource {
function loadText() {
if ( $this->mTextLoaded == 2 ) {
return true;
- } else {
- // Whether it succeeds or fails, we don't want to try again
- $this->mTextLoaded = 2;
}
+ // Whether it succeeds or fails, we don't want to try again
+ $this->mTextLoaded = 2;
+
if ( !$this->loadRevisionData() ) {
return false;
}
+
if ( $this->mOldRev ) {
$this->mOldContent = $this->mOldRev->getContent( Revision::FOR_THIS_USER, $this->getUser() );
if ( $this->mOldContent === null ) {
return false;
}
}
+
if ( $this->mNewRev ) {
$this->mNewContent = $this->mNewRev->getContent( Revision::FOR_THIS_USER, $this->getUser() );
if ( $this->mNewContent === null ) {
return false;
}
}
+
return true;
}
@@ -1211,13 +1199,16 @@ class DifferenceEngine extends ContextSource {
function loadNewText() {
if ( $this->mTextLoaded >= 1 ) {
return true;
- } else {
- $this->mTextLoaded = 1;
}
+
+ $this->mTextLoaded = 1;
+
if ( !$this->loadRevisionData() ) {
return false;
}
+
$this->mNewContent = $this->mNewRev->getContent( Revision::FOR_THIS_USER, $this->getUser() );
+
return true;
}
}
diff --git a/includes/extauth/Hardcoded.php b/includes/extauth/Hardcoded.php
deleted file mode 100644
index dfb46742..00000000
--- a/includes/extauth/Hardcoded.php
+++ /dev/null
@@ -1,84 +0,0 @@
-<?php
-/**
- * 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
- * LocalSettings.php. It's mostly useful for testing. Example configuration:
- *
- * $wgExternalAuthType = 'ExternalUser_Hardcoded';
- * $wgExternalAuthConf = array(
- * 'Bob Smith' => array(
- * 'password' => 'literal string',
- * 'emailaddress' => 'bob@example.com',
- * ),
- * );
- *
- * Multiple names may be provided. The keys of the inner arrays can be either
- * 'password', or the name of any preference.
- *
- * @ingroup ExternalUser
- */
-class ExternalUser_Hardcoded extends ExternalUser {
- private $mName;
-
- protected function initFromName( $name ) {
- global $wgExternalAuthConf;
-
- if ( isset( $wgExternalAuthConf[$name] ) ) {
- $this->mName = $name;
- return true;
- }
- return false;
- }
-
- protected function initFromId( $id ) {
- return $this->initFromName( $id );
- }
-
- public function getId() {
- return $this->mName;
- }
-
- public function getName() {
- return $this->mName;
- }
-
- public function authenticate( $password ) {
- global $wgExternalAuthConf;
-
- return isset( $wgExternalAuthConf[$this->mName]['password'] )
- && $wgExternalAuthConf[$this->mName]['password'] == $password;
- }
-
- public function getPref( $pref ) {
- global $wgExternalAuthConf;
-
- if ( isset( $wgExternalAuthConf[$this->mName][$pref] ) ) {
- return $wgExternalAuthConf[$this->mName][$pref];
- }
- return null;
- }
-
- # TODO: Implement setPref() via regex on LocalSettings. (Just kidding.)
-}
diff --git a/includes/extauth/MediaWiki.php b/includes/extauth/MediaWiki.php
deleted file mode 100644
index c7f6a204..00000000
--- a/includes/extauth/MediaWiki.php
+++ /dev/null
@@ -1,168 +0,0 @@
-<?php
-/**
- * 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,
- * probably any version back to 1.5 or something. Example configuration:
- *
- * $wgExternalAuthType = 'ExternalUser_MediaWiki';
- * $wgExternalAuthConf = array(
- * 'DBtype' => 'mysql',
- * 'DBserver' => 'localhost',
- * 'DBname' => 'wikidb',
- * 'DBuser' => 'quasit',
- * 'DBpassword' => 'a5Cr:yf9u-6[{`g',
- * 'DBprefix' => '',
- * );
- *
- * All fields must be present. These mean the same things as $wgDBtype,
- * $wgDBserver, etc. This implementation is quite crude; it could easily
- * support multiple database servers, for instance, and memcached, and it
- * probably has bugs. Kind of hard to reuse code when things might rely on who
- * knows what configuration globals.
- *
- * If either wiki uses the UserComparePasswords hook, password authentication
- * might fail unexpectedly unless they both do the exact same validation.
- * There may be other corner cases like this where this will fail, but it
- * should be unlikely.
- *
- * @ingroup ExternalUser
- */
-class ExternalUser_MediaWiki extends ExternalUser {
- private $mRow;
-
- /**
- * @var DatabaseBase
- */
- private $mDb;
-
- /**
- * @param $name string
- * @return bool
- */
- protected function initFromName( $name ) {
- # We might not need the 'usable' bit, but let's be safe. Theoretically
- # this might return wrong results for old versions, but it's probably
- # good enough.
- $name = User::getCanonicalName( $name, 'usable' );
-
- if ( !is_string( $name ) ) {
- return false;
- }
-
- return $this->initFromCond( array( 'user_name' => $name ) );
- }
-
- /**
- * @param $id int
- * @return bool
- */
- protected function initFromId( $id ) {
- return $this->initFromCond( array( 'user_id' => $id ) );
- }
-
- /**
- * @param $cond array
- * @return bool
- */
- private function initFromCond( $cond ) {
- global $wgExternalAuthConf;
-
- $this->mDb = DatabaseBase::factory( $wgExternalAuthConf['DBtype'],
- array(
- 'host' => $wgExternalAuthConf['DBserver'],
- 'user' => $wgExternalAuthConf['DBuser'],
- 'password' => $wgExternalAuthConf['DBpassword'],
- 'dbname' => $wgExternalAuthConf['DBname'],
- 'tablePrefix' => $wgExternalAuthConf['DBprefix'],
- )
- );
-
- $row = $this->mDb->selectRow(
- 'user',
- array(
- 'user_name', 'user_id', 'user_password', 'user_email',
- 'user_email_authenticated'
- ),
- $cond,
- __METHOD__
- );
- if ( !$row ) {
- return false;
- }
- $this->mRow = $row;
-
- return true;
- }
-
- # TODO: Implement initFromCookie().
-
- public function getId() {
- return $this->mRow->user_id;
- }
-
- /**
- * @return string
- */
- public function getName() {
- return $this->mRow->user_name;
- }
-
- public function authenticate( $password ) {
- # This might be wrong if anyone actually uses the UserComparePasswords hook
- # (on either end), so don't use this if you those are incompatible.
- return User::comparePasswords( $this->mRow->user_password, $password,
- $this->mRow->user_id );
- }
-
- public function getPref( $pref ) {
- # @todo FIXME: Return other prefs too. Lots of global-riddled code that does
- # this normally.
- if ( $pref === 'emailaddress'
- && $this->row->user_email_authenticated !== null ) {
- return $this->mRow->user_email;
- }
- return null;
- }
-
- /**
- * @return array
- */
- public function getGroups() {
- # @todo FIXME: Untested.
- $groups = array();
- $res = $this->mDb->select(
- 'user_groups',
- 'ug_group',
- array( 'ug_user' => $this->mRow->user_id ),
- __METHOD__
- );
- foreach ( $res as $row ) {
- $groups[] = $row->ug_group;
- }
- return $groups;
- }
-
- # TODO: Implement setPref().
-}
diff --git a/includes/extauth/vB.php b/includes/extauth/vB.php
deleted file mode 100644
index 0565a2e3..00000000
--- a/includes/extauth/vB.php
+++ /dev/null
@@ -1,146 +0,0 @@
-<?php
-/**
- * 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
- * <http://www.vbulletin.com>, versions 3.5 and up. It calls no functions or
- * code, only reads from the database. Example lines to put in
- * LocalSettings.php:
- *
- * $wgExternalAuthType = 'ExternalUser_vB';
- * $wgExternalAuthConf = array(
- * 'server' => 'localhost',
- * 'username' => 'forum',
- * 'password' => 'udE,jSqDJ<""p=fI.K9',
- * 'dbname' => 'forum',
- * 'tablePrefix' => '',
- * 'cookieprefix' => 'bb'
- * );
- *
- * @ingroup ExternalUser
- */
-class ExternalUser_vB extends ExternalUser {
- private $mRow;
-
- protected function initFromName( $name ) {
- return $this->initFromCond( array( 'username' => $name ) );
- }
-
- protected function initFromId( $id ) {
- return $this->initFromCond( array( 'userid' => $id ) );
- }
-
- protected function initFromCookie() {
- # 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, $wgRequest;
- if ( !isset( $wgExternalAuthConf['cookieprefix'] ) ) {
- $prefix = 'bb';
- } else {
- $prefix = $wgExternalAuthConf['cookieprefix'];
- }
- if ( $wgRequest->getCookie( 'sessionhash', $prefix ) === null ) {
- return false;
- }
-
- $db = $this->getDb();
-
- $row = $db->selectRow(
- array( 'session', 'user' ),
- $this->getFields(),
- array(
- 'session.userid = user.userid',
- 'sessionhash' => $wgRequest->getCookie( 'sessionhash', $prefix ),
- ),
- __METHOD__
- );
- if ( !$row ) {
- return false;
- }
- $this->mRow = $row;
-
- return true;
- }
-
- private function initFromCond( $cond ) {
- $db = $this->getDb();
-
- $row = $db->selectRow(
- 'user',
- $this->getFields(),
- $cond,
- __METHOD__
- );
- if ( !$row ) {
- return false;
- }
- $this->mRow = $row;
-
- return true;
- }
-
- private function getDb() {
- global $wgExternalAuthConf;
- return DatabaseBase::factory( 'mysql',
- array(
- 'host' => $wgExternalAuthConf['server'],
- 'user' => $wgExternalAuthConf['username'],
- 'password' => $wgExternalAuthConf['password'],
- 'dbname' => $wgExternalAuthConf['dbname'],
- 'tablePrefix' => $wgExternalAuthConf['tablePrefix'],
- )
- );
- }
-
- private function getFields() {
- return array( 'user.userid', 'username', 'password', 'salt', 'email',
- 'usergroupid', 'membergroupids' );
- }
-
- public function getId() { return $this->mRow->userid; }
- public function getName() { return $this->mRow->username; }
-
- public function authenticate( $password ) {
- # vBulletin seemingly strips whitespace from passwords
- $password = trim( $password );
- return $this->mRow->password == md5( md5( $password )
- . $this->mRow->salt );
- }
-
- public function getPref( $pref ) {
- if ( $pref == 'emailaddress' && $this->mRow->email ) {
- # TODO: only return if validated?
- return $this->mRow->email;
- }
- return null;
- }
-
- public function getGroups() {
- $groups = array( $this->mRow->usergroupid );
- $groups = array_merge( $groups, explode( ',', $this->mRow->membergroupids ) );
- $groups = array_unique( $groups );
- return $groups;
- }
-}
diff --git a/includes/externalstore/ExternalStore.php b/includes/externalstore/ExternalStore.php
index 4ca193d4..462b0b90 100644
--- a/includes/externalstore/ExternalStore.php
+++ b/includes/externalstore/ExternalStore.php
@@ -60,7 +60,7 @@ class ExternalStore {
$class = 'ExternalStore' . ucfirst( $proto );
// Any custom modules should be added to $wgAutoLoadClasses for on-demand loading
- return MWInit::classExists( $class ) ? new $class( $params ) : false;
+ return class_exists( $class ) ? new $class( $params ) : false;
}
/**
@@ -91,6 +91,39 @@ class ExternalStore {
}
/**
+ * Fetch data from multiple URLs with a minimum of round trips
+ *
+ * @param array $urls The URLs of the text to get
+ * @return array Map from url to its data. Data is either string when found
+ * or false on failure.
+ */
+ public static function batchFetchFromURLs( array $urls ) {
+ $batches = array();
+ foreach ( $urls as $url ) {
+ $scheme = parse_url( $url, PHP_URL_SCHEME );
+ if ( $scheme ) {
+ $batches[$scheme][] = $url;
+ }
+ }
+ $retval = array();
+ foreach ( $batches as $proto => $batchedUrls ) {
+ $store = self::getStoreObject( $proto );
+ if ( $store === false ) {
+ continue;
+ }
+ $retval += $store->batchFetchFromURLs( $batchedUrls );
+ }
+ // invalid, not found, db dead, etc.
+ $missing = array_diff( $urls, array_keys( $retval ) );
+ if ( $missing ) {
+ foreach ( $missing as $url ) {
+ $retval[$url] = false;
+ }
+ }
+ return $retval;
+ }
+
+ /**
* Store a data item to an external store, identified by a partial URL
* The protocol part is used to identify the class, the rest is passed to the
* class itself as a parameter.
@@ -123,9 +156,10 @@ class ExternalStore {
/**
* Like insert() above, but does more of the work for us.
* This function does not need a url param, it builds it by
- * itself. It also fails-over to the next possible clusters.
+ * itself. It also fails-over to the next possible clusters
+ * provided by $wgDefaultExternalStore.
*
- * @param $data string
+ * @param string $data
* @param array $params Associative array of ExternalStoreMedium parameters
* @return string|bool The URL of the stored data item, or false on error
* @throws MWException
@@ -133,8 +167,23 @@ class ExternalStore {
public static function insertToDefault( $data, array $params = array() ) {
global $wgDefaultExternalStore;
+ return self::insertWithFallback( (array)$wgDefaultExternalStore, $data, $params );
+ }
+
+ /**
+ * Like insert() above, but does more of the work for us.
+ * This function does not need a url param, it builds it by
+ * itself. It also fails-over to the next possible clusters
+ * as provided in the first parameter.
+ *
+ * @param array $tryStores refer to $wgDefaultExternalStore
+ * @param string $data
+ * @param array $params Associative array of ExternalStoreMedium parameters
+ * @return string|bool The URL of the stored data item, or false on error
+ * @throws MWException
+ */
+ public static function insertWithFallback( array $tryStores, $data, array $params = array() ) {
$error = false;
- $tryStores = (array)$wgDefaultExternalStore;
while ( count( $tryStores ) > 0 ) {
$index = mt_rand( 0, count( $tryStores ) - 1 );
$storeUrl = $tryStores[$index];
diff --git a/includes/externalstore/ExternalStoreDB.php b/includes/externalstore/ExternalStoreDB.php
index 196e7f2c..46a89379 100644
--- a/includes/externalstore/ExternalStoreDB.php
+++ b/includes/externalstore/ExternalStoreDB.php
@@ -30,21 +30,13 @@
*/
class ExternalStoreDB extends ExternalStoreMedium {
/**
- * The URL returned is of the form of the form DB://cluster/id
+ * The provided URL is in the form of DB://cluster/id
* or DB://cluster/id/itemid for concatened storage.
*
* @see ExternalStoreMedium::fetchFromURL()
*/
public function fetchFromURL( $url ) {
- $path = explode( '/', $url );
- $cluster = $path[2];
- $id = $path[3];
- if ( isset( $path[4] ) ) {
- $itemID = $path[4];
- } else {
- $itemID = false;
- }
-
+ list( $cluster, $id, $itemID ) = $this->parseURL( $url );
$ret =& $this->fetchBlob( $cluster, $id, $itemID );
if ( $itemID !== false && $ret !== false ) {
@@ -54,6 +46,41 @@ class ExternalStoreDB extends ExternalStoreMedium {
}
/**
+ * Fetch data from given external store URLs.
+ * The provided URLs are in the form of DB://cluster/id
+ * or DB://cluster/id/itemid for concatened storage.
+ *
+ * @param array $urls An array of external store URLs
+ * @return array A map from url to stored content. Failed results
+ * are not represented.
+ */
+ public function batchFetchFromURLs( array $urls ) {
+ $batched = $inverseUrlMap = array();
+ foreach ( $urls as $url ) {
+ list( $cluster, $id, $itemID ) = $this->parseURL( $url );
+ $batched[$cluster][$id][] = $itemID;
+ // false $itemID gets cast to int, but should be ok
+ // since we do === from the $itemID in $batched
+ $inverseUrlMap[$cluster][$id][$itemID] = $url;
+ }
+ $ret = array();
+ foreach ( $batched as $cluster => $batchByCluster ) {
+ $res = $this->batchFetchBlobs( $cluster, $batchByCluster );
+ foreach ( $res as $id => $blob ) {
+ foreach ( $batchByCluster[$id] as $itemID ) {
+ $url = $inverseUrlMap[$cluster][$id][$itemID];
+ if ( $itemID === false ) {
+ $ret[$url] = $blob;
+ } else {
+ $ret[$url] = $blob->getItem( $itemID );
+ }
+ }
+ }
+ }
+ return $ret;
+ }
+
+ /**
* @see ExternalStoreMedium::store()
*/
public function store( $cluster, $data ) {
@@ -64,7 +91,7 @@ class ExternalStoreDB extends ExternalStoreMedium {
__METHOD__ );
$id = $dbw->insertId();
if ( !$id ) {
- throw new MWException( __METHOD__.': no insert ID' );
+ throw new MWException( __METHOD__ . ': no insert ID' );
}
if ( $dbw->getFlag( DBO_TRX ) ) {
$dbw->commit( __METHOD__ );
@@ -152,25 +179,31 @@ class ExternalStoreDB extends ExternalStoreMedium {
static $externalBlobCache = array();
$cacheID = ( $itemID === false ) ? "$cluster/$id" : "$cluster/$id/";
- if( isset( $externalBlobCache[$cacheID] ) ) {
- wfDebugLog( 'ExternalStoreDB-cache', "ExternalStoreDB::fetchBlob cache hit on $cacheID\n" );
+ if ( isset( $externalBlobCache[$cacheID] ) ) {
+ wfDebugLog( 'ExternalStoreDB-cache',
+ "ExternalStoreDB::fetchBlob cache hit on $cacheID\n" );
return $externalBlobCache[$cacheID];
}
- wfDebugLog( 'ExternalStoreDB-cache', "ExternalStoreDB::fetchBlob cache miss on $cacheID\n" );
+ wfDebugLog( 'ExternalStoreDB-cache',
+ "ExternalStoreDB::fetchBlob cache miss on $cacheID\n" );
$dbr =& $this->getSlave( $cluster );
- $ret = $dbr->selectField( $this->getTable( $dbr ), 'blob_text', array( 'blob_id' => $id ), __METHOD__ );
+ $ret = $dbr->selectField( $this->getTable( $dbr ),
+ 'blob_text', array( 'blob_id' => $id ), __METHOD__ );
if ( $ret === false ) {
- wfDebugLog( 'ExternalStoreDB', "ExternalStoreDB::fetchBlob master fallback on $cacheID\n" );
+ wfDebugLog( 'ExternalStoreDB',
+ "ExternalStoreDB::fetchBlob master fallback on $cacheID\n" );
// Try the master
$dbw =& $this->getMaster( $cluster );
- $ret = $dbw->selectField( $this->getTable( $dbw ), 'blob_text', array( 'blob_id' => $id ), __METHOD__ );
- if( $ret === false) {
- wfDebugLog( 'ExternalStoreDB', "ExternalStoreDB::fetchBlob master failed to find $cacheID\n" );
+ $ret = $dbw->selectField( $this->getTable( $dbw ),
+ 'blob_text', array( 'blob_id' => $id ), __METHOD__ );
+ if ( $ret === false ) {
+ wfDebugLog( 'ExternalStoreDB',
+ "ExternalStoreDB::fetchBlob master failed to find $cacheID\n" );
}
}
- if( $itemID !== false && $ret !== false ) {
+ if ( $itemID !== false && $ret !== false ) {
// Unserialise object; caller extracts item
$ret = unserialize( $ret );
}
@@ -178,4 +211,73 @@ class ExternalStoreDB extends ExternalStoreMedium {
$externalBlobCache = array( $cacheID => &$ret );
return $ret;
}
+
+ /**
+ * Fetch multiple blob items out of the database
+ *
+ * @param string $cluster A cluster name valid for use with LBFactory
+ * @param array $ids A map from the blob_id's to look for to the requested itemIDs in the blobs
+ * @return array A map from the blob_id's requested to their content. Unlocated ids are not represented
+ */
+ function batchFetchBlobs( $cluster, array $ids ) {
+ $dbr = $this->getSlave( $cluster );
+ $res = $dbr->select( $this->getTable( $dbr ),
+ array( 'blob_id', 'blob_text' ), array( 'blob_id' => array_keys( $ids ) ), __METHOD__ );
+ $ret = array();
+ if ( $res !== false ) {
+ $this->mergeBatchResult( $ret, $ids, $res );
+ }
+ if ( $ids ) {
+ wfDebugLog( __CLASS__, __METHOD__ .
+ " master fallback on '$cluster' for: " .
+ implode( ',', array_keys( $ids ) ) . "\n" );
+ // Try the master
+ $dbw = $this->getMaster( $cluster );
+ $res = $dbw->select( $this->getTable( $dbr ),
+ array( 'blob_id', 'blob_text' ),
+ array( 'blob_id' => array_keys( $ids ) ),
+ __METHOD__ );
+ if ( $res === false ) {
+ wfDebugLog( __CLASS__, __METHOD__ . " master failed on '$cluster'\n" );
+ } else {
+ $this->mergeBatchResult( $ret, $ids, $res );
+ }
+ }
+ if ( $ids ) {
+ wfDebugLog( __CLASS__, __METHOD__ .
+ " master on '$cluster' failed locating items: " .
+ implode( ',', array_keys( $ids ) ) . "\n" );
+ }
+ return $ret;
+ }
+
+ /**
+ * Helper function for self::batchFetchBlobs for merging master/slave results
+ * @param array &$ret Current self::batchFetchBlobs return value
+ * @param array &$ids Map from blob_id to requested itemIDs
+ * @param mixed $res DB result from DatabaseBase::select
+ */
+ private function mergeBatchResult( array &$ret, array &$ids, $res ) {
+ foreach ( $res as $row ) {
+ $id = $row->blob_id;
+ $itemIDs = $ids[$id];
+ unset( $ids[$id] ); // to track if everything is found
+ if ( count( $itemIDs ) === 1 && reset( $itemIDs ) === false ) {
+ // single result stored per blob
+ $ret[$id] = $row->blob_text;
+ } else {
+ // multi result stored per blob
+ $ret[$id] = unserialize( $row->blob_text );
+ }
+ }
+ }
+
+ protected function parseURL( $url ) {
+ $path = explode( '/', $url );
+ return array(
+ $path[2], // cluster
+ $path[3], // id
+ isset( $path[4] ) ? $path[4] : false // itemID
+ );
+ }
}
diff --git a/includes/externalstore/ExternalStoreMedium.php b/includes/externalstore/ExternalStoreMedium.php
index 41af7d87..02bdcb51 100644
--- a/includes/externalstore/ExternalStoreMedium.php
+++ b/includes/externalstore/ExternalStoreMedium.php
@@ -49,6 +49,25 @@ abstract class ExternalStoreMedium {
abstract public function fetchFromURL( $url );
/**
+ * Fetch data from given external store URLs.
+ *
+ * @param array $urls A list of external store URLs
+ * @return array Map from the url to the text stored. Unfound data is not represented
+ */
+ public function batchFetchFromURLs( array $urls ) {
+ $retval = array();
+ foreach ( $urls as $url ) {
+ $data = $this->fetchFromURL( $url );
+ // Dont return when false to allow for simpler implementations.
+ // errored urls are handled in ExternalStore::batchFetchFromURLs
+ if ( $data !== false ) {
+ $retval[$urls] = $data;
+ }
+ }
+ return $retval;
+ }
+
+ /**
* Insert a data item into a given location
*
* @param string $location the location name
diff --git a/includes/externalstore/ExternalStoreMwstore.php b/includes/externalstore/ExternalStoreMwstore.php
index 0911cca1..aa486796 100644
--- a/includes/externalstore/ExternalStoreMwstore.php
+++ b/includes/externalstore/ExternalStoreMwstore.php
@@ -47,6 +47,29 @@ class ExternalStoreMwstore extends ExternalStoreMedium {
}
/**
+ * Fetch data from given external store URLs.
+ * The URL returned is of the form of the form mwstore://backend/container/wiki/id
+ *
+ * @param array $urls An array of external store URLs
+ * @return array A map from url to stored content. Failed results are not represented.
+ */
+ public function batchFetchFromURLs( array $urls ) {
+ $pathsByBackend = array();
+ foreach ( $urls as $url ) {
+ $be = FileBackendGroup::singleton()->backendFromPath( $url );
+ if ( $be instanceof FileBackend ) {
+ $pathsByBackend[$be->getName()][] = $url;
+ }
+ }
+ $blobs = array();
+ foreach ( $pathsByBackend as $backendName => $paths ) {
+ $be = FileBackendGroup::get( $backendName );
+ $blobs = $blobs + $be->getFileContentsMulti( array( 'srcs' => $paths ) );
+ }
+ return $blobs;
+ }
+
+ /**
* @see ExternalStoreMedium::store()
*/
public function store( $backend, $data ) {
diff --git a/includes/filebackend/FSFile.php b/includes/filebackend/FSFile.php
index 7d0dbd52..8f0a1334 100644
--- a/includes/filebackend/FSFile.php
+++ b/includes/filebackend/FSFile.php
@@ -28,7 +28,7 @@
*/
class FSFile {
protected $path; // path to file
- private $sha1Base36 = null; // File Sha1Base36
+ protected $sha1Base36; // file SHA-1 in base 36
/**
* Sets up the file object
@@ -98,7 +98,7 @@ class FSFile {
* Get an associative array containing information about
* a file with the given storage path.
*
- * @param $ext Mixed: the file extension, or true to extract it from the filename.
+ * @param Mixed $ext: the file extension, or true to extract it from the filename.
* Set it to false to ignore the extension.
*
* @return array
@@ -171,7 +171,7 @@ class FSFile {
/**
* Exract image size information
*
- * @param $gis array
+ * @param array $gis
* @return Array
*/
protected function extractImageSizeInfo( array $gis ) {
@@ -194,7 +194,7 @@ class FSFile {
* 160 log 2 / log 36 = 30.95, so the 160-bit hash fills 31 digits in base 36
* fairly neatly.
*
- * @param $recache bool
+ * @param bool $recache
* @return bool|string False on failure
*/
public function getSha1Base36( $recache = false ) {
@@ -220,7 +220,7 @@ class FSFile {
/**
* Get the final file extension from a file system path
*
- * @param $path string
+ * @param string $path
* @return string
*/
public static function extensionFromPath( $path ) {
@@ -232,9 +232,8 @@ class FSFile {
* Get an associative array containing information about a file in the local filesystem.
*
* @param string $path absolute local filesystem path
- * @param $ext Mixed: the file extension, or true to extract it from the filename.
+ * @param Mixed $ext: the file extension, or true to extract it from the filename.
* Set it to false to ignore the extension.
- *
* @return array
*/
public static function getPropsFromPath( $path, $ext = true ) {
@@ -249,19 +248,11 @@ class FSFile {
* 160 log 2 / log 36 = 30.95, so the 160-bit hash fills 31 digits in base 36
* fairly neatly.
*
- * @param $path string
- * @param $recache bool
- *
+ * @param string $path
* @return bool|string False on failure
*/
- public static function getSha1Base36FromPath( $path, $recache = false ) {
- static $sha1Base36 = array();
-
- if ( !isset( $sha1Base36[$path] ) || $recache ) {
- $fsFile = new self( $path );
- $sha1Base36[$path] = $fsFile->getSha1Base36();
- }
-
- return $sha1Base36[$path];
+ public static function getSha1Base36FromPath( $path ) {
+ $fsFile = new self( $path );
+ return $fsFile->getSha1Base36();
}
}
diff --git a/includes/filebackend/FSFileBackend.php b/includes/filebackend/FSFileBackend.php
index c9769989..6d642162 100644
--- a/includes/filebackend/FSFileBackend.php
+++ b/includes/filebackend/FSFileBackend.php
@@ -82,12 +82,6 @@ class FSFileBackend extends FileBackendStore {
}
}
- /**
- * @see FileBackendStore::resolveContainerPath()
- * @param $container string
- * @param $relStoragePath string
- * @return null|string
- */
protected function resolveContainerPath( $container, $relStoragePath ) {
// Check that container has a root directory
if ( isset( $this->containerPaths[$container] ) || isset( $this->basePath ) ) {
@@ -121,8 +115,8 @@ class FSFileBackend extends FileBackendStore {
* Given the short (unresolved) and full (resolved) name of
* a container, return the file system path of the container.
*
- * @param $shortCont string
- * @param $fullCont string
+ * @param string $shortCont
+ * @param string $fullCont
* @return string|null
*/
protected function containerFSRoot( $shortCont, $fullCont ) {
@@ -153,10 +147,6 @@ class FSFileBackend extends FileBackendStore {
return $fsPath;
}
- /**
- * @see FileBackendStore::isPathUsableInternal()
- * @return bool
- */
public function isPathUsableInternal( $storagePath ) {
$fsPath = $this->resolveToFSPath( $storagePath );
if ( $fsPath === null ) {
@@ -178,10 +168,6 @@ class FSFileBackend extends FileBackendStore {
return $ok;
}
- /**
- * @see FileBackendStore::doCreateInternal()
- * @return Status
- */
protected function doCreateInternal( array $params ) {
$status = Status::newGood();
@@ -235,10 +221,6 @@ class FSFileBackend extends FileBackendStore {
}
}
- /**
- * @see FileBackendStore::doStoreInternal()
- * @return Status
- */
protected function doStoreInternal( array $params ) {
$status = Status::newGood();
@@ -284,10 +266,6 @@ class FSFileBackend extends FileBackendStore {
}
}
- /**
- * @see FileBackendStore::doCopyInternal()
- * @return Status
- */
protected function doCopyInternal( array $params ) {
$status = Status::newGood();
@@ -319,7 +297,7 @@ class FSFileBackend extends FileBackendStore {
$status->value = new FSFileOpHandle( $this, $params, 'Copy', $cmd, $dest );
} else { // immediate write
$this->trapWarnings();
- $ok = copy( $source, $dest );
+ $ok = ( $source === $dest ) ? true : copy( $source, $dest );
$this->untrapWarnings();
// In some cases (at least over NFS), copy() returns true when it fails
if ( !$ok || ( filesize( $source ) !== filesize( $dest ) ) ) {
@@ -348,10 +326,6 @@ class FSFileBackend extends FileBackendStore {
}
}
- /**
- * @see FileBackendStore::doMoveInternal()
- * @return Status
- */
protected function doMoveInternal( array $params ) {
$status = Status::newGood();
@@ -383,7 +357,7 @@ class FSFileBackend extends FileBackendStore {
$status->value = new FSFileOpHandle( $this, $params, 'Move', $cmd );
} else { // immediate write
$this->trapWarnings();
- $ok = rename( $source, $dest );
+ $ok = ( $source === $dest ) ? true : rename( $source, $dest );
$this->untrapWarnings();
clearstatcache(); // file no longer at source
if ( !$ok ) {
@@ -405,10 +379,6 @@ class FSFileBackend extends FileBackendStore {
}
}
- /**
- * @see FileBackendStore::doDeleteInternal()
- * @return Status
- */
protected function doDeleteInternal( array $params ) {
$status = Status::newGood();
@@ -454,10 +424,6 @@ class FSFileBackend extends FileBackendStore {
}
}
- /**
- * @see FileBackendStore::doPrepareInternal()
- * @return Status
- */
protected function doPrepareInternal( $fullCont, $dirRel, array $params ) {
$status = Status::newGood();
list( , $shortCont, ) = FileBackend::splitStoragePath( $params['dir'] );
@@ -481,10 +447,6 @@ class FSFileBackend extends FileBackendStore {
return $status;
}
- /**
- * @see FileBackendStore::doSecureInternal()
- * @return Status
- */
protected function doSecureInternal( $fullCont, $dirRel, array $params ) {
$status = Status::newGood();
list( , $shortCont, ) = FileBackend::splitStoragePath( $params['dir'] );
@@ -512,10 +474,6 @@ class FSFileBackend extends FileBackendStore {
return $status;
}
- /**
- * @see FileBackendStore::doPublishInternal()
- * @return Status
- */
protected function doPublishInternal( $fullCont, $dirRel, array $params ) {
$status = Status::newGood();
list( , $shortCont, ) = FileBackend::splitStoragePath( $params['dir'] );
@@ -543,10 +501,6 @@ class FSFileBackend extends FileBackendStore {
return $status;
}
- /**
- * @see FileBackendStore::doCleanInternal()
- * @return Status
- */
protected function doCleanInternal( $fullCont, $dirRel, array $params ) {
$status = Status::newGood();
list( , $shortCont, ) = FileBackend::splitStoragePath( $params['dir'] );
@@ -560,10 +514,6 @@ class FSFileBackend extends FileBackendStore {
return $status;
}
- /**
- * @see FileBackendStore::doFileExists()
- * @return array|bool|null
- */
protected function doGetFileStat( array $params ) {
$source = $this->resolveToFSPath( $params['src'] );
if ( $source === null ) {
@@ -577,7 +527,7 @@ class FSFileBackend extends FileBackendStore {
if ( $stat ) {
return array(
'mtime' => wfTimestamp( TS_MW, $stat['mtime'] ),
- 'size' => $stat['size']
+ 'size' => $stat['size']
);
} elseif ( !$hadError ) {
return false; // file does not exist
@@ -593,10 +543,6 @@ class FSFileBackend extends FileBackendStore {
clearstatcache(); // clear the PHP file stat cache
}
- /**
- * @see FileBackendStore::doDirectoryExists()
- * @return bool|null
- */
protected function doDirectoryExists( $fullCont, $dirRel, array $params ) {
list( , $shortCont, ) = FileBackend::splitStoragePath( $params['dir'] );
$contRoot = $this->containerFSRoot( $shortCont, $fullCont ); // must be valid
@@ -647,10 +593,6 @@ class FSFileBackend extends FileBackendStore {
return new FSFileBackendFileList( $dir, $params );
}
- /**
- * @see FileBackendStore::doGetLocalReferenceMulti()
- * @return Array
- */
protected function doGetLocalReferenceMulti( array $params ) {
$fsFiles = array(); // (path => FSFile)
@@ -666,10 +608,6 @@ class FSFileBackend extends FileBackendStore {
return $fsFiles;
}
- /**
- * @see FileBackendStore::doGetLocalCopyMulti()
- * @return Array
- */
protected function doGetLocalCopyMulti( array $params ) {
$tmpFiles = array(); // (path => TempFSFile)
@@ -702,18 +640,10 @@ class FSFileBackend extends FileBackendStore {
return $tmpFiles;
}
- /**
- * @see FileBackendStore::directoriesAreVirtual()
- * @return bool
- */
protected function directoriesAreVirtual() {
return false;
}
- /**
- * @see FileBackendStore::doExecuteOpHandlesInternal()
- * @return Array List of corresponding Status objects
- */
protected function doExecuteOpHandlesInternal( array $fileOpHandles ) {
$statuses = array();
@@ -807,11 +737,12 @@ class FSFileBackend extends FileBackendStore {
}
/**
- * @param $errno integer
- * @param $errstr string
+ * @param integer $errno
+ * @param string $errstr
* @return bool
+ * @access private
*/
- private function handleWarning( $errno, $errstr ) {
+ public function handleWarning( $errno, $errstr ) {
wfDebugLog( 'FSFileBackend', $errstr ); // more detailed error logging
$this->hadWarningErrors[count( $this->hadWarningErrors ) - 1] = true;
return true; // suppress from PHP handler
@@ -826,13 +757,15 @@ class FSFileOpHandle extends FileBackendStoreOpHandle {
public $chmodPath; // string; file to chmod
/**
- * @param $backend
- * @param $params array
- * @param $call
- * @param $cmd
- * @param $chmodPath null
+ * @param FSFileBackend $backend
+ * @param array $params
+ * @param string $call
+ * @param string $cmd
+ * @param integer|null $chmodPath
*/
- public function __construct( $backend, array $params, $call, $cmd, $chmodPath = null ) {
+ public function __construct(
+ FSFileBackend $backend, array $params, $call, $cmd, $chmodPath = null
+ ) {
$this->backend = $backend;
$this->params = $params;
$this->call = $call;
@@ -858,11 +791,11 @@ abstract class FSFileBackendList implements Iterator {
/**
* @param string $dir file system directory
- * @param $params array
+ * @param array $params
*/
public function __construct( $dir, array $params ) {
$path = realpath( $dir ); // normalize
- if( $path === false ) {
+ if ( $path === false ) {
$path = $dir;
}
$this->suffixStart = strlen( $path ) + 1; // size of "path/to/dir/"
@@ -921,8 +854,8 @@ abstract class FSFileBackendList implements Iterator {
try {
$this->iter->next();
$this->filterViaNext();
- } catch ( UnexpectedValueException $e ) {
- $this->iter = null;
+ } catch ( UnexpectedValueException $e ) { // bad permissions? deleted?
+ throw new FileBackendError( "File iterator gave UnexpectedValueException." );
}
++$this->pos;
}
@@ -936,8 +869,8 @@ abstract class FSFileBackendList implements Iterator {
try {
$this->iter->rewind();
$this->filterViaNext();
- } catch ( UnexpectedValueException $e ) {
- $this->iter = null;
+ } catch ( UnexpectedValueException $e ) { // bad permissions? deleted?
+ throw new FileBackendError( "File iterator gave UnexpectedValueException." );
}
}
@@ -958,12 +891,12 @@ abstract class FSFileBackendList implements Iterator {
* Return only the relative path and normalize slashes to FileBackend-style.
* Uses the "real path" since the suffix is based upon that.
*
- * @param $path string
+ * @param string $path
* @return string
*/
protected function getRelPath( $dir ) {
$path = realpath( $dir );
- if( $path === false ) {
+ if ( $path === false ) {
$path = $dir;
}
return strtr( substr( $path, $this->suffixStart ), '\\', '/' );
diff --git a/includes/filebackend/FileBackend.php b/includes/filebackend/FileBackend.php
index f40b8c16..f586578b 100644
--- a/includes/filebackend/FileBackend.php
+++ b/includes/filebackend/FileBackend.php
@@ -1,7 +1,6 @@
<?php
/**
* @defgroup FileBackend File backend
- * @ingroup FileRepo
*
* File backend is used to interact with file storage systems,
* such as the local file system, NFS, or cloud storage systems.
@@ -95,7 +94,7 @@ abstract class FileBackend {
* Allowed values are "implicit", "explicit" and "off".
* - concurrency : How many file operations can be done in parallel.
*
- * @param $config Array
+ * @param array $config
* @throws MWException
*/
public function __construct( array $config ) {
@@ -191,7 +190,6 @@ abstract class FileBackend {
* 'content' => <string of new file contents>,
* 'overwrite' => <boolean>,
* 'overwriteSame' => <boolean>,
- * 'disposition' => <Content-Disposition header value>,
* 'headers' => <HTTP header name/value map> # since 1.21
* );
* @endcode
@@ -204,7 +202,6 @@ abstract class FileBackend {
* 'dst' => <storage path>,
* 'overwrite' => <boolean>,
* 'overwriteSame' => <boolean>,
- * 'disposition' => <Content-Disposition header value>,
* 'headers' => <HTTP header name/value map> # since 1.21
* )
* @endcode
@@ -218,7 +215,7 @@ abstract class FileBackend {
* 'overwrite' => <boolean>,
* 'overwriteSame' => <boolean>,
* 'ignoreMissingSource' => <boolean>, # since 1.21
- * 'disposition' => <Content-Disposition header value>
+ * 'headers' => <HTTP header name/value map> # since 1.21
* )
* @endcode
*
@@ -231,7 +228,7 @@ abstract class FileBackend {
* 'overwrite' => <boolean>,
* 'overwriteSame' => <boolean>,
* 'ignoreMissingSource' => <boolean>, # since 1.21
- * 'disposition' => <Content-Disposition header value>
+ * 'headers' => <HTTP header name/value map> # since 1.21
* )
* @endcode
*
@@ -249,7 +246,6 @@ abstract class FileBackend {
* array(
* 'op' => 'describe',
* 'src' => <storage path>,
- * 'disposition' => <Content-Disposition header value>,
* 'headers' => <HTTP header name/value map>
* )
* @endcode
@@ -265,19 +261,19 @@ abstract class FileBackend {
* - ignoreMissingSource : The operation will simply succeed and do
* nothing if the source file does not exist.
* - overwrite : Any destination file will be overwritten.
- * - overwriteSame : An error will not be given if a file already
- * exists at the destination that has the same
- * contents as the new contents to be written there.
- * - disposition : If supplied, the backend will return a Content-Disposition
- * header when GETs/HEADs of the destination file are made.
- * Backends that don't support metadata ignore this.
- * See http://tools.ietf.org/html/rfc6266. (since 1.20)
- * - headers : If supplied, the backend will return these headers when
- * GETs/HEADs of the destination file are made. Header values
- * should be smaller than 256 bytes, often options or numbers.
- * Existing headers will remain, but these will replace any
- * conflicting previous headers, and headers will be removed
- * if they are set to an empty string.
+ * - overwriteSame : If a file already exists at the destination with the
+ * same contents, then do nothing to the destination file
+ * instead of giving an error. This does not compare headers.
+ * This option is ignored if 'overwrite' is already provided.
+ * - headers : If supplied, the result of merging these headers with any
+ * existing source file headers (replacing conflicting ones)
+ * will be set as the destination file headers. Headers are
+ * deleted if their value is set to the empty string. When a
+ * file has headers they are included in responses to GET and
+ * HEAD requests to the backing store for that file.
+ * Header values should be no larger than 255 bytes, except for
+ * Content-Disposition. The system might ignore or truncate any
+ * headers that are too long to store (exact limits will vary).
* Backends that don't support metadata ignore this. (since 1.21)
*
* $opts is an associative of boolean flags, including:
@@ -318,9 +314,17 @@ abstract class FileBackend {
if ( empty( $opts['bypassReadOnly'] ) && $this->isReadOnly() ) {
return Status::newFatal( 'backend-fail-readonly', $this->name, $this->readOnly );
}
+ if ( !count( $ops ) ) {
+ return Status::newGood(); // nothing to do
+ }
if ( empty( $opts['force'] ) ) { // sanity
unset( $opts['nonLocking'] );
}
+ foreach ( $ops as &$op ) {
+ if ( isset( $op['disposition'] ) ) { // b/c (MW 1.20)
+ $op['headers']['Content-Disposition'] = $op['disposition'];
+ }
+ }
$scope = $this->getScopedPHPBehaviorForOps(); // try to ignore client aborts
return $this->doOperationsInternal( $ops, $opts );
}
@@ -452,7 +456,6 @@ abstract class FileBackend {
* 'op' => 'create',
* 'dst' => <storage path>,
* 'content' => <string of new file contents>,
- * 'disposition' => <Content-Disposition header value>,
* 'headers' => <HTTP header name/value map> # since 1.21
* )
* @endcode
@@ -463,7 +466,6 @@ abstract class FileBackend {
* 'op' => 'store',
* 'src' => <file system path>,
* 'dst' => <storage path>,
- * 'disposition' => <Content-Disposition header value>,
* 'headers' => <HTTP header name/value map> # since 1.21
* )
* @endcode
@@ -475,7 +477,7 @@ abstract class FileBackend {
* 'src' => <storage path>,
* 'dst' => <storage path>,
* 'ignoreMissingSource' => <boolean>, # since 1.21
- * 'disposition' => <Content-Disposition header value>
+ * 'headers' => <HTTP header name/value map> # since 1.21
* )
* @endcode
*
@@ -486,7 +488,7 @@ abstract class FileBackend {
* 'src' => <storage path>,
* 'dst' => <storage path>,
* 'ignoreMissingSource' => <boolean>, # since 1.21
- * 'disposition' => <Content-Disposition header value>
+ * 'headers' => <HTTP header name/value map> # since 1.21
* )
* @endcode
*
@@ -504,7 +506,6 @@ abstract class FileBackend {
* array(
* 'op' => 'describe',
* 'src' => <storage path>,
- * 'disposition' => <Content-Disposition header value>,
* 'headers' => <HTTP header name/value map>
* )
* @endcode
@@ -519,13 +520,11 @@ abstract class FileBackend {
* @par Boolean flags for operations (operation-specific):
* - ignoreMissingSource : The operation will simply succeed and do
* nothing if the source file does not exist.
- * - disposition : When supplied, the backend will add a Content-Disposition
- * header when GETs/HEADs of the destination file are made.
- * Backends that don't support file metadata will ignore this.
- * See http://tools.ietf.org/html/rfc6266 (since 1.20).
* - headers : If supplied with a header name/value map, the backend will
* reply with these headers when GETs/HEADs of the destination
* file are made. Header values should be smaller than 256 bytes.
+ * Content-Disposition headers can be longer, though the system
+ * might ignore or truncate ones that are too long to store.
* Existing headers will remain, but these will replace any
* conflicting previous headers, and headers will be removed
* if they are set to an empty string.
@@ -549,8 +548,14 @@ abstract class FileBackend {
if ( empty( $opts['bypassReadOnly'] ) && $this->isReadOnly() ) {
return Status::newFatal( 'backend-fail-readonly', $this->name, $this->readOnly );
}
+ if ( !count( $ops ) ) {
+ return Status::newGood(); // nothing to do
+ }
foreach ( $ops as &$op ) {
$op['overwrite'] = true; // avoids RTTs in key/value stores
+ if ( isset( $op['disposition'] ) ) { // b/c (MW 1.20)
+ $op['headers']['Content-Disposition'] = $op['disposition'];
+ }
}
$scope = $this->getScopedPHPBehaviorForOps(); // try to ignore client aborts
return $this->doQuickOperationsInternal( $ops );
@@ -683,6 +688,8 @@ abstract class FileBackend {
* The 'noAccess' and 'noListing' parameters works the same as in secure(),
* except they are only applied *if* the directory/container had to be created.
* These flags should always be set for directories that have private files.
+ * However, setting them is not guaranteed to actually do anything.
+ * Additional server configuration may be needed to achieve the desired effect.
*
* @param array $params
* $params include:
@@ -710,7 +717,9 @@ abstract class FileBackend {
* the container it belongs to. FS backends might add .htaccess
* files whereas key/value store backends might revoke container
* access to the storage user representing end-users in web requests.
- * This is not guaranteed to actually do anything.
+ *
+ * This is not guaranteed to actually make files or listings publically hidden.
+ * Additional server configuration may be needed to achieve the desired effect.
*
* @param array $params
* $params include:
@@ -740,6 +749,9 @@ abstract class FileBackend {
* access to the storage user representing end-users in web requests.
* This essentially can undo the result of secure() calls.
*
+ * This is not guaranteed to actually make files or listings publically viewable.
+ * Additional server configuration may be needed to achieve the desired effect.
+ *
* @param array $params
* $params include:
* - dir : storage directory
@@ -797,7 +809,9 @@ abstract class FileBackend {
final protected function getScopedPHPBehaviorForOps() {
if ( php_sapi_name() != 'cli' ) { // http://bugs.php.net/bug.php?id=47540
$old = ignore_user_abort( true ); // avoid half-finished operations
- return new ScopedCallback( function() use ( $old ) { ignore_user_abort( $old ); } );
+ return new ScopedCallback( function() use ( $old ) {
+ ignore_user_abort( $old );
+ } );
}
return null;
}
@@ -1029,7 +1043,7 @@ abstract class FileBackend {
*
* Storage backends with eventual consistency might return stale data.
*
- * @param $params array
+ * @param array $params
* $params include:
* - dir : storage directory
* @return bool|null Returns null on failure
@@ -1047,7 +1061,9 @@ abstract class FileBackend {
*
* Storage backends with eventual consistency might return stale data.
*
- * @param $params array
+ * Failures during iteration can result in FileBackendError exceptions (since 1.22).
+ *
+ * @param array $params
* $params include:
* - dir : storage directory
* - topOnly : only return direct child dirs of the directory
@@ -1062,7 +1078,9 @@ abstract class FileBackend {
*
* Storage backends with eventual consistency might return stale data.
*
- * @param $params array
+ * Failures during iteration can result in FileBackendError exceptions (since 1.22).
+ *
+ * @param array $params
* $params include:
* - dir : storage directory
* @return Traversable|Array|null Returns null on failure
@@ -1082,10 +1100,13 @@ abstract class FileBackend {
*
* Storage backends with eventual consistency might return stale data.
*
- * @param $params array
+ * Failures during iteration can result in FileBackendError exceptions (since 1.22).
+ *
+ * @param array $params
* $params include:
- * - dir : storage directory
- * - topOnly : only return direct child files of the directory (since 1.20)
+ * - dir : storage directory
+ * - topOnly : only return direct child files of the directory (since 1.20)
+ * - adviseStat : set to true if stat requests will be made on the files (since 1.22)
* @return Traversable|Array|null Returns null on failure
*/
abstract public function getFileList( array $params );
@@ -1096,9 +1117,12 @@ abstract class FileBackend {
*
* Storage backends with eventual consistency might return stale data.
*
- * @param $params array
+ * Failures during iteration can result in FileBackendError exceptions (since 1.22).
+ *
+ * @param array $params
* $params include:
- * - dir : storage directory
+ * - dir : storage directory
+ * - adviseStat : set to true if stat requests will be made on the files (since 1.22)
* @return Traversable|Array|null Returns null on failure
* @since 1.20
*/
@@ -1131,10 +1155,11 @@ abstract class FileBackend {
* Callers should consider using getScopedFileLocks() instead.
*
* @param array $paths Storage paths
- * @param $type integer LockManager::LOCK_* constant
+ * @param integer $type LockManager::LOCK_* constant
* @return Status
*/
final public function lockFiles( array $paths, $type ) {
+ $paths = array_map( 'FileBackend::normalizeStoragePath', $paths );
return $this->lockManager->lock( $paths, $type );
}
@@ -1142,10 +1167,11 @@ abstract class FileBackend {
* Unlock the files at the given storage paths in the backend.
*
* @param array $paths Storage paths
- * @param $type integer LockManager::LOCK_* constant
+ * @param integer $type LockManager::LOCK_* constant
* @return Status
*/
final public function unlockFiles( array $paths, $type ) {
+ $paths = array_map( 'FileBackend::normalizeStoragePath', $paths );
return $this->lockManager->unlock( $paths, $type );
}
@@ -1157,12 +1183,21 @@ abstract class FileBackend {
* Once the return value goes out scope, the locks will be released and
* the status updated. Unlock fatals will not change the status "OK" value.
*
- * @param array $paths Storage paths
- * @param $type integer LockManager::LOCK_* constant
- * @param $status Status Status to update on lock/unlock
+ * @see ScopedLock::factory()
+ *
+ * @param array $paths List of storage paths or map of lock types to path lists
+ * @param integer|string $type LockManager::LOCK_* constant or "mixed"
+ * @param Status $status Status to update on lock/unlock
* @return ScopedLock|null Returns null on failure
*/
final public function getScopedFileLocks( array $paths, $type, Status $status ) {
+ if ( $type === 'mixed' ) {
+ foreach ( $paths as &$typePaths ) {
+ $typePaths = array_map( 'FileBackend::normalizeStoragePath', $typePaths );
+ }
+ } else {
+ $paths = array_map( 'FileBackend::normalizeStoragePath', $paths );
+ }
return ScopedLock::factory( $this->lockManager, $paths, $type, $status );
}
@@ -1178,7 +1213,7 @@ abstract class FileBackend {
* @see FileBackend::doOperations()
*
* @param array $ops List of file operations to FileBackend::doOperations()
- * @param $status Status Status to update on lock/unlock
+ * @param Status $status Status to update on lock/unlock
* @return Array List of ScopedFileLocks or null values
* @since 1.20
*/
@@ -1219,7 +1254,7 @@ abstract class FileBackend {
* Check if a given path is a "mwstore://" path.
* This does not do any further validation or any existence checks.
*
- * @param $path string
+ * @param string $path
* @return bool
*/
final public static function isStoragePath( $path ) {
@@ -1231,7 +1266,7 @@ abstract class FileBackend {
* and a relative file path. The relative path may be the empty string.
* This does not do any path normalization or traversal checks.
*
- * @param $storagePath string
+ * @param string $storagePath
* @return Array (backend, container, rel object) or (null, null, null)
*/
final public static function splitStoragePath( $storagePath ) {
@@ -1253,7 +1288,7 @@ abstract class FileBackend {
* Normalize a storage path by cleaning up directory separators.
* Returns null if the path is not of the format of a valid storage path.
*
- * @param $storagePath string
+ * @param string $storagePath
* @return string|null
*/
final public static function normalizeStoragePath( $storagePath ) {
@@ -1274,7 +1309,7 @@ abstract class FileBackend {
* This returns a path like "mwstore://backend/container",
* "mwstore://backend/container/...", or null if there is no parent.
*
- * @param $storagePath string
+ * @param string $storagePath
* @return string|null
*/
final public static function parentStoragePath( $storagePath ) {
@@ -1286,7 +1321,7 @@ abstract class FileBackend {
/**
* Get the final extension from a storage or FS path
*
- * @param $path string
+ * @param string $path
* @return string
*/
final public static function extensionFromPath( $path ) {
@@ -1297,7 +1332,7 @@ abstract class FileBackend {
/**
* Check if a relative path has no directory traversals
*
- * @param $path string
+ * @param string $path
* @return bool
* @since 1.20
*/
@@ -1363,3 +1398,9 @@ abstract class FileBackend {
return $path;
}
}
+
+/**
+ * @ingroup FileBackend
+ * @since 1.22
+ */
+class FileBackendError extends MWException {}
diff --git a/includes/filebackend/FileBackendGroup.php b/includes/filebackend/FileBackendGroup.php
index d790a996..be8a2076 100644
--- a/includes/filebackend/FileBackendGroup.php
+++ b/includes/filebackend/FileBackendGroup.php
@@ -95,17 +95,17 @@ class FileBackendGroup {
: 0644;
// Get the FS backend configuration
$autoBackends[] = array(
- 'name' => $backendName,
- 'class' => 'FSFileBackend',
- 'lockManager' => 'fsLockManager',
+ 'name' => $backendName,
+ 'class' => 'FSFileBackend',
+ 'lockManager' => 'fsLockManager',
'containerPaths' => array(
- "{$repoName}-public" => "{$directory}",
- "{$repoName}-thumb" => $thumbDir,
- "{$repoName}-transcoded" => $transcodedDir,
+ "{$repoName}-public" => "{$directory}",
+ "{$repoName}-thumb" => $thumbDir,
+ "{$repoName}-transcoded" => $transcodedDir,
"{$repoName}-deleted" => $deletedDir,
- "{$repoName}-temp" => "{$directory}/temp"
+ "{$repoName}-temp" => "{$directory}/temp"
),
- 'fileMode' => $fileMode,
+ 'fileMode' => $fileMode,
);
}
@@ -116,7 +116,7 @@ class FileBackendGroup {
/**
* Register an array of file backend configurations
*
- * @param $configs Array
+ * @param Array $configs
* @return void
* @throws MWException
*/
@@ -135,8 +135,8 @@ class FileBackendGroup {
unset( $config['class'] ); // backend won't need this
$this->backends[$name] = array(
- 'class' => $class,
- 'config' => $config,
+ 'class' => $class,
+ 'config' => $config,
'instance' => null
);
}
@@ -145,7 +145,7 @@ class FileBackendGroup {
/**
* Get the backend object with a given name
*
- * @param $name string
+ * @param string $name
* @return FileBackend
* @throws MWException
*/
@@ -165,7 +165,7 @@ class FileBackendGroup {
/**
* Get the config array for a backend object with a given name
*
- * @param $name string
+ * @param string $name
* @return Array
* @throws MWException
*/
@@ -180,7 +180,7 @@ class FileBackendGroup {
/**
* Get an appropriate backend object from a storage path
*
- * @param $storagePath string
+ * @param string $storagePath
* @return FileBackend|null Backend or null on failure
*/
public function backendFromPath( $storagePath ) {
diff --git a/includes/filebackend/FileBackendMultiWrite.php b/includes/filebackend/FileBackendMultiWrite.php
index 939315d1..97584a71 100644
--- a/includes/filebackend/FileBackendMultiWrite.php
+++ b/includes/filebackend/FileBackendMultiWrite.php
@@ -75,10 +75,13 @@ class FileBackendMultiWrite extends FileBackend {
* - autoResync : Automatically resync the clone backends to the master backend
* when pre-operation sync checks fail. This should only be used
* if the master backend is stable and not missing any files.
+ * Use "conservative" to limit resyncing to copying newer master
+ * backend files over older (or non-existing) clone backend files.
+ * Cases that cannot be handled will result in operation abortion.
* - noPushQuickOps : (hack) Only apply doQuickOperations() to the master backend.
* - noPushDirConts : (hack) Only apply directory functions to the master backend.
*
- * @param $config Array
+ * @param Array $config
* @throws MWException
*/
public function __construct( array $config ) {
@@ -86,7 +89,9 @@ class FileBackendMultiWrite extends FileBackend {
$this->syncChecks = isset( $config['syncChecks'] )
? $config['syncChecks']
: self::CHECK_SIZE;
- $this->autoResync = !empty( $config['autoResync'] );
+ $this->autoResync = isset( $config['autoResync'] )
+ ? $config['autoResync']
+ : false;
$this->noPushQuickOps = isset( $config['noPushQuickOps'] )
? $config['noPushQuickOps']
: false;
@@ -131,26 +136,15 @@ class FileBackendMultiWrite extends FileBackend {
}
}
- /**
- * @see FileBackend::doOperationsInternal()
- * @return Status
- */
final protected function doOperationsInternal( array $ops, array $opts ) {
$status = Status::newGood();
$mbe = $this->backends[$this->masterIndex]; // convenience
- // Get the paths to lock from the master backend
- $realOps = $this->substOpBatchPaths( $ops, $mbe );
- $paths = $mbe->getPathsToLockForOpsInternal( $mbe->getOperationsInternal( $realOps ) );
- // Get the paths under the proxy backend's name
- $paths['sh'] = $this->unsubstPaths( $paths['sh'] );
- $paths['ex'] = $this->unsubstPaths( $paths['ex'] );
// Try to lock those files for the scope of this function...
if ( empty( $opts['nonLocking'] ) ) {
// Try to lock those files for the scope of this function...
- $scopeLockS = $this->getScopedFileLocks( $paths['sh'], LockManager::LOCK_UW, $status );
- $scopeLockE = $this->getScopedFileLocks( $paths['ex'], LockManager::LOCK_EX, $status );
+ $scopeLock = $this->getScopedLocksForOps( $ops, $status );
if ( !$status->isOK() ) {
return $status; // abort
}
@@ -177,6 +171,7 @@ class FileBackendMultiWrite extends FileBackend {
}
}
// Actually attempt the operation batch on the master backend...
+ $realOps = $this->substOpBatchPaths( $ops, $mbe );
$masterStatus = $mbe->doOperations( $realOps, $opts );
$status->merge( $masterStatus );
// Propagate the operations to the clone backends if there were no unexpected errors
@@ -304,11 +299,11 @@ class FileBackendMultiWrite extends FileBackend {
$mBackend = $this->backends[$this->masterIndex];
foreach ( $paths as $path ) {
$mPath = $this->substPaths( $path, $mBackend );
- $mSha1 = $mBackend->getFileSha1Base36( array( 'src' => $mPath ) );
- $mExist = $mBackend->fileExists( array( 'src' => $mPath ) );
- // Check if the master backend is available...
- if ( $mExist === null ) {
+ $mSha1 = $mBackend->getFileSha1Base36( array( 'src' => $mPath, 'latest' => true ) );
+ $mStat = $mBackend->getFileStat( array( 'src' => $mPath, 'latest' => true ) );
+ if ( $mStat === null || ( $mSha1 !== false && !$mStat ) ) { // sanity
$status->fatal( 'backend-fail-internal', $this->name );
+ continue; // file is not available on the master backend...
}
// Check of all clone backends agree with the master...
foreach ( $this->backends as $index => $cBackend ) {
@@ -316,15 +311,31 @@ class FileBackendMultiWrite extends FileBackend {
continue; // master
}
$cPath = $this->substPaths( $path, $cBackend );
- $cSha1 = $cBackend->getFileSha1Base36( array( 'src' => $cPath ) );
+ $cSha1 = $cBackend->getFileSha1Base36( array( 'src' => $cPath, 'latest' => true ) );
+ $cStat = $cBackend->getFileStat( array( 'src' => $cPath, 'latest' => true ) );
+ if ( $cStat === null || ( $cSha1 !== false && !$cStat ) ) { // sanity
+ $status->fatal( 'backend-fail-internal', $cBackend->getName() );
+ continue; // file is not available on the clone backend...
+ }
if ( $mSha1 === $cSha1 ) {
// already synced; nothing to do
- } elseif ( $mSha1 ) { // file is in master
- $fsFile = $mBackend->getLocalReference( array( 'src' => $mPath ) );
+ } elseif ( $mSha1 !== false ) { // file is in master
+ if ( $this->autoResync === 'conservative'
+ && $cStat && $cStat['mtime'] > $mStat['mtime'] )
+ {
+ $status->fatal( 'backend-fail-synced', $path );
+ continue; // don't rollback data
+ }
+ $fsFile = $mBackend->getLocalReference(
+ array( 'src' => $mPath, 'latest' => true ) );
$status->merge( $cBackend->quickStore(
array( 'src' => $fsFile->getPath(), 'dst' => $cPath )
) );
- } elseif ( $mExist === false ) { // file is not in master
+ } elseif ( $mStat === false ) { // file is not in master
+ if ( $this->autoResync === 'conservative' ) {
+ $status->fatal( 'backend-fail-synced', $path );
+ continue; // don't delete data
+ }
$status->merge( $cBackend->quickDelete( array( 'src' => $cPath ) ) );
}
}
@@ -366,7 +377,7 @@ class FileBackendMultiWrite extends FileBackend {
* for a set of operations with that of a given internal backend.
*
* @param array $ops List of file operation arrays
- * @param $backend FileBackendStore
+ * @param FileBackendStore $backend
* @return Array
*/
protected function substOpBatchPaths( array $ops, FileBackendStore $backend ) {
@@ -387,7 +398,7 @@ class FileBackendMultiWrite extends FileBackend {
* Same as substOpBatchPaths() but for a single operation
*
* @param array $ops File operation array
- * @param $backend FileBackendStore
+ * @param FileBackendStore $backend
* @return Array
*/
protected function substOpPaths( array $ops, FileBackendStore $backend ) {
@@ -399,7 +410,7 @@ class FileBackendMultiWrite extends FileBackend {
* Substitute the backend of storage paths with an internal backend's name
*
* @param array|string $paths List of paths or single string path
- * @param $backend FileBackendStore
+ * @param FileBackendStore $backend
* @return Array|string
*/
protected function substPaths( $paths, FileBackendStore $backend ) {
@@ -424,10 +435,6 @@ class FileBackendMultiWrite extends FileBackend {
);
}
- /**
- * @see FileBackend::doQuickOperationsInternal()
- * @return Status
- */
protected function doQuickOperationsInternal( array $ops ) {
$status = Status::newGood();
// Do the operations on the master backend; setting Status fields...
@@ -457,14 +464,10 @@ class FileBackendMultiWrite extends FileBackend {
* @return bool Path container should have dir changes pushed to all backends
*/
protected function replicateContainerDirChanges( $path ) {
- list( , $shortCont, ) = self::splitStoragePath( $path );
+ list( , $shortCont, ) = self::splitStoragePath( $path );
return !in_array( $shortCont, $this->noPushDirConts );
}
- /**
- * @see FileBackend::doPrepare()
- * @return Status
- */
protected function doPrepare( array $params ) {
$status = Status::newGood();
$replicate = $this->replicateContainerDirChanges( $params['dir'] );
@@ -477,11 +480,6 @@ class FileBackendMultiWrite extends FileBackend {
return $status;
}
- /**
- * @see FileBackend::doSecure()
- * @param $params array
- * @return Status
- */
protected function doSecure( array $params ) {
$status = Status::newGood();
$replicate = $this->replicateContainerDirChanges( $params['dir'] );
@@ -494,11 +492,6 @@ class FileBackendMultiWrite extends FileBackend {
return $status;
}
- /**
- * @see FileBackend::doPublish()
- * @param $params array
- * @return Status
- */
protected function doPublish( array $params ) {
$status = Status::newGood();
$replicate = $this->replicateContainerDirChanges( $params['dir'] );
@@ -511,11 +504,6 @@ class FileBackendMultiWrite extends FileBackend {
return $status;
}
- /**
- * @see FileBackend::doClean()
- * @param $params array
- * @return Status
- */
protected function doClean( array $params ) {
$status = Status::newGood();
$replicate = $this->replicateContainerDirChanges( $params['dir'] );
@@ -528,62 +516,32 @@ class FileBackendMultiWrite extends FileBackend {
return $status;
}
- /**
- * @see FileBackend::concatenate()
- * @param $params array
- * @return Status
- */
public function concatenate( array $params ) {
// We are writing to an FS file, so we don't need to do this per-backend
$realParams = $this->substOpPaths( $params, $this->backends[$this->masterIndex] );
return $this->backends[$this->masterIndex]->concatenate( $realParams );
}
- /**
- * @see FileBackend::fileExists()
- * @param $params array
- * @return bool|null
- */
public function fileExists( array $params ) {
$realParams = $this->substOpPaths( $params, $this->backends[$this->masterIndex] );
return $this->backends[$this->masterIndex]->fileExists( $realParams );
}
- /**
- * @see FileBackend::getFileTimestamp()
- * @param $params array
- * @return bool|string
- */
public function getFileTimestamp( array $params ) {
$realParams = $this->substOpPaths( $params, $this->backends[$this->masterIndex] );
return $this->backends[$this->masterIndex]->getFileTimestamp( $realParams );
}
- /**
- * @see FileBackend::getFileSize()
- * @param $params array
- * @return bool|int
- */
public function getFileSize( array $params ) {
$realParams = $this->substOpPaths( $params, $this->backends[$this->masterIndex] );
return $this->backends[$this->masterIndex]->getFileSize( $realParams );
}
- /**
- * @see FileBackend::getFileStat()
- * @param $params array
- * @return Array|bool|null
- */
public function getFileStat( array $params ) {
$realParams = $this->substOpPaths( $params, $this->backends[$this->masterIndex] );
return $this->backends[$this->masterIndex]->getFileStat( $realParams );
}
- /**
- * @see FileBackend::getFileContentsMulti()
- * @param $params array
- * @return bool|string
- */
public function getFileContentsMulti( array $params ) {
$realParams = $this->substOpPaths( $params, $this->backends[$this->masterIndex] );
$contentsM = $this->backends[$this->masterIndex]->getFileContentsMulti( $realParams );
@@ -595,41 +553,21 @@ class FileBackendMultiWrite extends FileBackend {
return $contents;
}
- /**
- * @see FileBackend::getFileSha1Base36()
- * @param $params array
- * @return bool|string
- */
public function getFileSha1Base36( array $params ) {
$realParams = $this->substOpPaths( $params, $this->backends[$this->masterIndex] );
return $this->backends[$this->masterIndex]->getFileSha1Base36( $realParams );
}
- /**
- * @see FileBackend::getFileProps()
- * @param $params array
- * @return Array
- */
public function getFileProps( array $params ) {
$realParams = $this->substOpPaths( $params, $this->backends[$this->masterIndex] );
return $this->backends[$this->masterIndex]->getFileProps( $realParams );
}
- /**
- * @see FileBackend::streamFile()
- * @param $params array
- * @return \Status
- */
public function streamFile( array $params ) {
$realParams = $this->substOpPaths( $params, $this->backends[$this->masterIndex] );
return $this->backends[$this->masterIndex]->streamFile( $realParams );
}
- /**
- * @see FileBackend::getLocalReferenceMulti()
- * @param $params array
- * @return FSFile|null
- */
public function getLocalReferenceMulti( array $params ) {
$realParams = $this->substOpPaths( $params, $this->backends[$this->masterIndex] );
$fsFilesM = $this->backends[$this->masterIndex]->getLocalReferenceMulti( $realParams );
@@ -641,11 +579,6 @@ class FileBackendMultiWrite extends FileBackend {
return $fsFiles;
}
- /**
- * @see FileBackend::getLocalCopyMulti()
- * @param $params array
- * @return null|TempFSFile
- */
public function getLocalCopyMulti( array $params ) {
$realParams = $this->substOpPaths( $params, $this->backends[$this->masterIndex] );
$tempFilesM = $this->backends[$this->masterIndex]->getLocalCopyMulti( $realParams );
@@ -657,48 +590,26 @@ class FileBackendMultiWrite extends FileBackend {
return $tempFiles;
}
- /**
- * @see FileBackend::getFileHttpUrl()
- * @return string|null
- */
public function getFileHttpUrl( array $params ) {
$realParams = $this->substOpPaths( $params, $this->backends[$this->masterIndex] );
return $this->backends[$this->masterIndex]->getFileHttpUrl( $realParams );
}
- /**
- * @see FileBackend::directoryExists()
- * @param $params array
- * @return bool|null
- */
public function directoryExists( array $params ) {
$realParams = $this->substOpPaths( $params, $this->backends[$this->masterIndex] );
return $this->backends[$this->masterIndex]->directoryExists( $realParams );
}
- /**
- * @see FileBackend::getSubdirectoryList()
- * @param $params array
- * @return Array|null|Traversable
- */
public function getDirectoryList( array $params ) {
$realParams = $this->substOpPaths( $params, $this->backends[$this->masterIndex] );
return $this->backends[$this->masterIndex]->getDirectoryList( $realParams );
}
- /**
- * @see FileBackend::getFileList()
- * @param $params array
- * @return Array|null|\Traversable
- */
public function getFileList( array $params ) {
$realParams = $this->substOpPaths( $params, $this->backends[$this->masterIndex] );
return $this->backends[$this->masterIndex]->getFileList( $realParams );
}
- /**
- * @see FileBackend::clearCache()
- */
public function clearCache( array $paths = null ) {
foreach ( $this->backends as $backend ) {
$realPaths = is_array( $paths ) ? $this->substPaths( $paths, $backend ) : null;
@@ -706,19 +617,17 @@ class FileBackendMultiWrite extends FileBackend {
}
}
- /**
- * @see FileBackend::getScopedLocksForOps()
- */
public function getScopedLocksForOps( array $ops, Status $status ) {
- $fileOps = $this->backends[$this->masterIndex]->getOperationsInternal( $ops );
+ $realOps = $this->substOpBatchPaths( $ops, $this->backends[$this->masterIndex] );
+ $fileOps = $this->backends[$this->masterIndex]->getOperationsInternal( $realOps );
// Get the paths to lock from the master backend
$paths = $this->backends[$this->masterIndex]->getPathsToLockForOpsInternal( $fileOps );
// Get the paths under the proxy backend's name
- $paths['sh'] = $this->unsubstPaths( $paths['sh'] );
- $paths['ex'] = $this->unsubstPaths( $paths['ex'] );
- return array(
- $this->getScopedFileLocks( $paths['sh'], LockManager::LOCK_UW, $status ),
- $this->getScopedFileLocks( $paths['ex'], LockManager::LOCK_EX, $status )
+ $pbPaths = array(
+ LockManager::LOCK_UW => $this->unsubstPaths( $paths[LockManager::LOCK_UW] ),
+ LockManager::LOCK_EX => $this->unsubstPaths( $paths[LockManager::LOCK_EX] )
);
+ // Actually acquire the locks
+ return array( $this->getScopedFileLocks( $pbPaths, 'mixed', $status ) );
}
}
diff --git a/includes/filebackend/FileBackendStore.php b/includes/filebackend/FileBackendStore.php
index 3f1d1857..0921e99f 100644
--- a/includes/filebackend/FileBackendStore.php
+++ b/includes/filebackend/FileBackendStore.php
@@ -38,28 +38,43 @@
abstract class FileBackendStore extends FileBackend {
/** @var BagOStuff */
protected $memCache;
- /** @var ProcessCacheLRU */
- protected $cheapCache; // Map of paths to small (RAM/disk) cache items
- /** @var ProcessCacheLRU */
- protected $expensiveCache; // Map of paths to large (RAM/disk) cache items
+ /** @var ProcessCacheLRU Map of paths to small (RAM/disk) cache items */
+ protected $cheapCache;
+ /** @var ProcessCacheLRU Map of paths to large (RAM/disk) cache items */
+ protected $expensiveCache;
- /** @var Array Map of container names to sharding settings */
- protected $shardViaHashLevels = array(); // (container name => config array)
+ /** @var Array Map of container names to sharding config */
+ protected $shardViaHashLevels = array();
+
+ /** @var callback Method to get the MIME type of files */
+ protected $mimeCallback;
protected $maxFileSize = 4294967296; // integer bytes (4GiB)
const CACHE_TTL = 10; // integer; TTL in seconds for process cache entries
+ const CACHE_CHEAP_SIZE = 300; // integer; max entries in "cheap cache"
+ const CACHE_EXPENSIVE_SIZE = 5; // integer; max entries in "expensive cache"
/**
* @see FileBackend::__construct()
+ * Additional $config params include:
+ * - mimeCallback : Callback that takes (storage path, content, file system path) and
+ * returns the MIME type of the file or 'unknown/unknown'. The file
+ * system path parameter should be used if the content one is null.
*
- * @param $config Array
+ * @param array $config
*/
public function __construct( array $config ) {
parent::__construct( $config );
+ $this->mimeCallback = isset( $config['mimeCallback'] )
+ ? $config['mimeCallback']
+ : function( $storagePath, $content, $fsPath ) {
+ // @TODO: handle the case of extension-less files using the contents
+ return StreamFile::contentTypeFromPath( $storagePath ) ?: 'unknown/unknown';
+ };
$this->memCache = new EmptyBagOStuff(); // disabled by default
- $this->cheapCache = new ProcessCacheLRU( 300 );
- $this->expensiveCache = new ProcessCacheLRU( 5 );
+ $this->cheapCache = new ProcessCacheLRU( self::CACHE_CHEAP_SIZE );
+ $this->expensiveCache = new ProcessCacheLRU( self::CACHE_EXPENSIVE_SIZE );
}
/**
@@ -79,7 +94,7 @@ abstract class FileBackendStore extends FileBackend {
* written under it, and that any file already there is writable.
* Backends using key/value stores should check if the container exists.
*
- * @param $storagePath string
+ * @param string $storagePath
* @return bool
*/
abstract public function isPathUsableInternal( $storagePath );
@@ -92,7 +107,6 @@ abstract class FileBackendStore extends FileBackend {
* $params include:
* - content : the raw file contents
* - dst : destination storage path
- * - disposition : Content-Disposition header value for the destination
* - headers : HTTP header name/value map
* - async : Status will be returned immediately if supported.
* If the status is OK, then its value field will be
@@ -104,8 +118,7 @@ abstract class FileBackendStore extends FileBackend {
* @return Status
*/
final public function createInternal( array $params ) {
- wfProfileIn( __METHOD__ );
- wfProfileIn( __METHOD__ . '-' . $this->name );
+ $section = new ProfileSection( __METHOD__ . "-{$this->name}" );
if ( strlen( $params['content'] ) > $this->maxFileSizeInternal() ) {
$status = Status::newFatal( 'backend-fail-maxsize',
$params['dst'], $this->maxFileSizeInternal() );
@@ -116,8 +129,6 @@ abstract class FileBackendStore extends FileBackend {
$this->deleteFileCache( $params['dst'] ); // persistent cache
}
}
- wfProfileOut( __METHOD__ . '-' . $this->name );
- wfProfileOut( __METHOD__ );
return $status;
}
@@ -135,7 +146,6 @@ abstract class FileBackendStore extends FileBackend {
* $params include:
* - src : source path on disk
* - dst : destination storage path
- * - disposition : Content-Disposition header value for the destination
* - headers : HTTP header name/value map
* - async : Status will be returned immediately if supported.
* If the status is OK, then its value field will be
@@ -147,8 +157,7 @@ abstract class FileBackendStore extends FileBackend {
* @return Status
*/
final public function storeInternal( array $params ) {
- wfProfileIn( __METHOD__ );
- wfProfileIn( __METHOD__ . '-' . $this->name );
+ $section = new ProfileSection( __METHOD__ . "-{$this->name}" );
if ( filesize( $params['src'] ) > $this->maxFileSizeInternal() ) {
$status = Status::newFatal( 'backend-fail-maxsize',
$params['dst'], $this->maxFileSizeInternal() );
@@ -159,8 +168,6 @@ abstract class FileBackendStore extends FileBackend {
$this->deleteFileCache( $params['dst'] ); // persistent cache
}
}
- wfProfileOut( __METHOD__ . '-' . $this->name );
- wfProfileOut( __METHOD__ );
return $status;
}
@@ -179,7 +186,7 @@ abstract class FileBackendStore extends FileBackend {
* - src : source storage path
* - dst : destination storage path
* - ignoreMissingSource : do nothing if the source file does not exist
- * - disposition : Content-Disposition header value for the destination
+ * - headers : HTTP header name/value map
* - async : Status will be returned immediately if supported.
* If the status is OK, then its value field will be
* set to a FileBackendStoreOpHandle object.
@@ -190,15 +197,12 @@ abstract class FileBackendStore extends FileBackend {
* @return Status
*/
final public function copyInternal( array $params ) {
- wfProfileIn( __METHOD__ );
- wfProfileIn( __METHOD__ . '-' . $this->name );
+ $section = new ProfileSection( __METHOD__ . "-{$this->name}" );
$status = $this->doCopyInternal( $params );
$this->clearCache( array( $params['dst'] ) );
if ( !isset( $params['dstExists'] ) || $params['dstExists'] ) {
$this->deleteFileCache( $params['dst'] ); // persistent cache
}
- wfProfileOut( __METHOD__ . '-' . $this->name );
- wfProfileOut( __METHOD__ );
return $status;
}
@@ -223,13 +227,10 @@ abstract class FileBackendStore extends FileBackend {
* @return Status
*/
final public function deleteInternal( array $params ) {
- wfProfileIn( __METHOD__ );
- wfProfileIn( __METHOD__ . '-' . $this->name );
+ $section = new ProfileSection( __METHOD__ . "-{$this->name}" );
$status = $this->doDeleteInternal( $params );
$this->clearCache( array( $params['src'] ) );
$this->deleteFileCache( $params['src'] ); // persistent cache
- wfProfileOut( __METHOD__ . '-' . $this->name );
- wfProfileOut( __METHOD__ );
return $status;
}
@@ -248,7 +249,7 @@ abstract class FileBackendStore extends FileBackend {
* - src : source storage path
* - dst : destination storage path
* - ignoreMissingSource : do nothing if the source file does not exist
- * - disposition : Content-Disposition header value for the destination
+ * - headers : HTTP header name/value map
* - async : Status will be returned immediately if supported.
* If the status is OK, then its value field will be
* set to a FileBackendStoreOpHandle object.
@@ -259,16 +260,13 @@ abstract class FileBackendStore extends FileBackend {
* @return Status
*/
final public function moveInternal( array $params ) {
- wfProfileIn( __METHOD__ );
- wfProfileIn( __METHOD__ . '-' . $this->name );
+ $section = new ProfileSection( __METHOD__ . "-{$this->name}" );
$status = $this->doMoveInternal( $params );
$this->clearCache( array( $params['src'], $params['dst'] ) );
$this->deleteFileCache( $params['src'] ); // persistent cache
if ( !isset( $params['dstExists'] ) || $params['dstExists'] ) {
$this->deleteFileCache( $params['dst'] ); // persistent cache
}
- wfProfileOut( __METHOD__ . '-' . $this->name );
- wfProfileOut( __METHOD__ );
return $status;
}
@@ -278,10 +276,12 @@ abstract class FileBackendStore extends FileBackend {
*/
protected function doMoveInternal( array $params ) {
unset( $params['async'] ); // two steps, won't work here :)
+ $nsrc = FileBackend::normalizeStoragePath( $params['src'] );
+ $ndst = FileBackend::normalizeStoragePath( $params['dst'] );
// Copy source to dest
$status = $this->copyInternal( $params );
- if ( $status->isOK() ) {
- // Delete source (only fails due to races or medium going down)
+ if ( $nsrc !== $ndst && $status->isOK() ) {
+ // Delete source (only fails due to races or network problems)
$status->merge( $this->deleteInternal( array( 'src' => $params['src'] ) ) );
$status->setResult( true, $status->value ); // ignore delete() errors
}
@@ -294,7 +294,6 @@ abstract class FileBackendStore extends FileBackend {
*
* $params include:
* - src : source storage path
- * - disposition : Content-Disposition header value for the destination
* - headers : HTTP header name/value map
* - async : Status will be returned immediately if supported.
* If the status is OK, then its value field will be
@@ -304,13 +303,14 @@ abstract class FileBackendStore extends FileBackend {
* @return Status
*/
final public function describeInternal( array $params ) {
- wfProfileIn( __METHOD__ );
- wfProfileIn( __METHOD__ . '-' . $this->name );
- $status = $this->doDescribeInternal( $params );
- $this->clearCache( array( $params['src'] ) );
- $this->deleteFileCache( $params['src'] ); // persistent cache
- wfProfileOut( __METHOD__ . '-' . $this->name );
- wfProfileOut( __METHOD__ );
+ $section = new ProfileSection( __METHOD__ . "-{$this->name}" );
+ if ( count( $params['headers'] ) ) {
+ $status = $this->doDescribeInternal( $params );
+ $this->clearCache( array( $params['src'] ) );
+ $this->deleteFileCache( $params['src'] ); // persistent cache
+ } else {
+ $status = Status::newGood(); // nothing to do
+ }
return $status;
}
@@ -333,13 +333,8 @@ abstract class FileBackendStore extends FileBackend {
return Status::newGood();
}
- /**
- * @see FileBackend::concatenate()
- * @return Status
- */
final public function concatenate( array $params ) {
- wfProfileIn( __METHOD__ );
- wfProfileIn( __METHOD__ . '-' . $this->name );
+ $section = new ProfileSection( __METHOD__ . "-{$this->name}" );
$status = Status::newGood();
// Try to lock the source files for the scope of this function
@@ -355,8 +350,6 @@ abstract class FileBackendStore extends FileBackend {
}
}
- wfProfileOut( __METHOD__ . '-' . $this->name );
- wfProfileOut( __METHOD__ );
return $status;
}
@@ -426,20 +419,13 @@ abstract class FileBackendStore extends FileBackend {
return $status;
}
- /**
- * @see FileBackend::doPrepare()
- * @return Status
- */
final protected function doPrepare( array $params ) {
- wfProfileIn( __METHOD__ );
- wfProfileIn( __METHOD__ . '-' . $this->name );
-
+ $section = new ProfileSection( __METHOD__ . "-{$this->name}" );
$status = Status::newGood();
+
list( $fullCont, $dir, $shard ) = $this->resolveStoragePath( $params['dir'] );
if ( $dir === null ) {
$status->fatal( 'backend-fail-invalidpath', $params['dir'] );
- wfProfileOut( __METHOD__ . '-' . $this->name );
- wfProfileOut( __METHOD__ );
return $status; // invalid storage path
}
@@ -453,8 +439,6 @@ abstract class FileBackendStore extends FileBackend {
}
}
- wfProfileOut( __METHOD__ . '-' . $this->name );
- wfProfileOut( __METHOD__ );
return $status;
}
@@ -466,20 +450,13 @@ abstract class FileBackendStore extends FileBackend {
return Status::newGood();
}
- /**
- * @see FileBackend::doSecure()
- * @return Status
- */
final protected function doSecure( array $params ) {
- wfProfileIn( __METHOD__ );
- wfProfileIn( __METHOD__ . '-' . $this->name );
+ $section = new ProfileSection( __METHOD__ . "-{$this->name}" );
$status = Status::newGood();
list( $fullCont, $dir, $shard ) = $this->resolveStoragePath( $params['dir'] );
if ( $dir === null ) {
$status->fatal( 'backend-fail-invalidpath', $params['dir'] );
- wfProfileOut( __METHOD__ . '-' . $this->name );
- wfProfileOut( __METHOD__ );
return $status; // invalid storage path
}
@@ -493,8 +470,6 @@ abstract class FileBackendStore extends FileBackend {
}
}
- wfProfileOut( __METHOD__ . '-' . $this->name );
- wfProfileOut( __METHOD__ );
return $status;
}
@@ -506,20 +481,13 @@ abstract class FileBackendStore extends FileBackend {
return Status::newGood();
}
- /**
- * @see FileBackend::doPublish()
- * @return Status
- */
final protected function doPublish( array $params ) {
- wfProfileIn( __METHOD__ );
- wfProfileIn( __METHOD__ . '-' . $this->name );
+ $section = new ProfileSection( __METHOD__ . "-{$this->name}" );
$status = Status::newGood();
list( $fullCont, $dir, $shard ) = $this->resolveStoragePath( $params['dir'] );
if ( $dir === null ) {
$status->fatal( 'backend-fail-invalidpath', $params['dir'] );
- wfProfileOut( __METHOD__ . '-' . $this->name );
- wfProfileOut( __METHOD__ );
return $status; // invalid storage path
}
@@ -533,8 +501,6 @@ abstract class FileBackendStore extends FileBackend {
}
}
- wfProfileOut( __METHOD__ . '-' . $this->name );
- wfProfileOut( __METHOD__ );
return $status;
}
@@ -546,13 +512,8 @@ abstract class FileBackendStore extends FileBackend {
return Status::newGood();
}
- /**
- * @see FileBackend::doClean()
- * @return Status
- */
final protected function doClean( array $params ) {
- wfProfileIn( __METHOD__ );
- wfProfileIn( __METHOD__ . '-' . $this->name );
+ $section = new ProfileSection( __METHOD__ . "-{$this->name}" );
$status = Status::newGood();
// Recursive: first delete all empty subdirs recursively
@@ -570,8 +531,6 @@ abstract class FileBackendStore extends FileBackend {
list( $fullCont, $dir, $shard ) = $this->resolveStoragePath( $params['dir'] );
if ( $dir === null ) {
$status->fatal( 'backend-fail-invalidpath', $params['dir'] );
- wfProfileOut( __METHOD__ . '-' . $this->name );
- wfProfileOut( __METHOD__ );
return $status; // invalid storage path
}
@@ -579,8 +538,6 @@ abstract class FileBackendStore extends FileBackend {
$filesLockEx = array( $params['dir'] );
$scopedLockE = $this->getScopedFileLocks( $filesLockEx, LockManager::LOCK_EX, $status );
if ( !$status->isOK() ) {
- wfProfileOut( __METHOD__ . '-' . $this->name );
- wfProfileOut( __METHOD__ );
return $status; // abort
}
@@ -596,8 +553,6 @@ abstract class FileBackendStore extends FileBackend {
}
}
- wfProfileOut( __METHOD__ . '-' . $this->name );
- wfProfileOut( __METHOD__ );
return $status;
}
@@ -609,56 +564,30 @@ abstract class FileBackendStore extends FileBackend {
return Status::newGood();
}
- /**
- * @see FileBackend::fileExists()
- * @return bool|null
- */
final public function fileExists( array $params ) {
- wfProfileIn( __METHOD__ );
- wfProfileIn( __METHOD__ . '-' . $this->name );
+ $section = new ProfileSection( __METHOD__ . "-{$this->name}" );
$stat = $this->getFileStat( $params );
- wfProfileOut( __METHOD__ . '-' . $this->name );
- wfProfileOut( __METHOD__ );
return ( $stat === null ) ? null : (bool)$stat; // null => failure
}
- /**
- * @see FileBackend::getFileTimestamp()
- * @return bool
- */
final public function getFileTimestamp( array $params ) {
- wfProfileIn( __METHOD__ );
- wfProfileIn( __METHOD__ . '-' . $this->name );
+ $section = new ProfileSection( __METHOD__ . "-{$this->name}" );
$stat = $this->getFileStat( $params );
- wfProfileOut( __METHOD__ . '-' . $this->name );
- wfProfileOut( __METHOD__ );
return $stat ? $stat['mtime'] : false;
}
- /**
- * @see FileBackend::getFileSize()
- * @return bool
- */
final public function getFileSize( array $params ) {
- wfProfileIn( __METHOD__ );
- wfProfileIn( __METHOD__ . '-' . $this->name );
+ $section = new ProfileSection( __METHOD__ . "-{$this->name}" );
$stat = $this->getFileStat( $params );
- wfProfileOut( __METHOD__ . '-' . $this->name );
- wfProfileOut( __METHOD__ );
return $stat ? $stat['size'] : false;
}
- /**
- * @see FileBackend::getFileStat()
- * @return bool
- */
final public function getFileStat( array $params ) {
$path = self::normalizeStoragePath( $params['src'] );
if ( $path === null ) {
return false; // invalid storage path
}
- wfProfileIn( __METHOD__ );
- wfProfileIn( __METHOD__ . '-' . $this->name );
+ $section = new ProfileSection( __METHOD__ . "-{$this->name}" );
$latest = !empty( $params['latest'] ); // use latest data?
if ( !$this->cheapCache->has( $path, 'stat', self::CACHE_TTL ) ) {
$this->primeFileCache( array( $path ) ); // check persistent cache
@@ -669,14 +598,10 @@ abstract class FileBackendStore extends FileBackend {
// value was in fact fetched with the latest available data.
if ( is_array( $stat ) ) {
if ( !$latest || $stat['latest'] ) {
- wfProfileOut( __METHOD__ . '-' . $this->name );
- wfProfileOut( __METHOD__ );
return $stat;
}
} elseif ( in_array( $stat, array( 'NOT_EXIST', 'NOT_EXIST_LATEST' ) ) ) {
if ( !$latest || $stat === 'NOT_EXIST_LATEST' ) {
- wfProfileOut( __METHOD__ . '-' . $this->name );
- wfProfileOut( __METHOD__ );
return false;
}
}
@@ -696,12 +621,12 @@ abstract class FileBackendStore extends FileBackend {
}
} elseif ( $stat === false ) { // file does not exist
$this->cheapCache->set( $path, 'stat', $latest ? 'NOT_EXIST_LATEST' : 'NOT_EXIST' );
+ $this->cheapCache->set( $path, 'sha1', // the SHA-1 must be false too
+ array( 'hash' => false, 'latest' => $latest ) );
wfDebug( __METHOD__ . ": File $path does not exist.\n" );
} else { // an error occurred
wfDebug( __METHOD__ . ": Could not stat file $path.\n" );
}
- wfProfileOut( __METHOD__ . '-' . $this->name );
- wfProfileOut( __METHOD__ );
return $stat;
}
@@ -710,19 +635,12 @@ abstract class FileBackendStore extends FileBackend {
*/
abstract protected function doGetFileStat( array $params );
- /**
- * @see FileBackend::getFileContentsMulti()
- * @return Array
- */
public function getFileContentsMulti( array $params ) {
- wfProfileIn( __METHOD__ );
- wfProfileIn( __METHOD__ . '-' . $this->name );
+ $section = new ProfileSection( __METHOD__ . "-{$this->name}" );
$params = $this->setConcurrencyFlags( $params );
$contents = $this->doGetFileContentsMulti( $params );
- wfProfileOut( __METHOD__ . '-' . $this->name );
- wfProfileOut( __METHOD__ );
return $contents;
}
@@ -740,25 +658,18 @@ abstract class FileBackendStore extends FileBackend {
return $contents;
}
- /**
- * @see FileBackend::getFileSha1Base36()
- * @return bool|string
- */
final public function getFileSha1Base36( array $params ) {
$path = self::normalizeStoragePath( $params['src'] );
if ( $path === null ) {
return false; // invalid storage path
}
- wfProfileIn( __METHOD__ );
- wfProfileIn( __METHOD__ . '-' . $this->name );
+ $section = new ProfileSection( __METHOD__ . "-{$this->name}" );
$latest = !empty( $params['latest'] ); // use latest data?
if ( $this->cheapCache->has( $path, 'sha1', self::CACHE_TTL ) ) {
$stat = $this->cheapCache->get( $path, 'sha1' );
// If we want the latest data, check that this cached
// value was in fact fetched with the latest available data.
if ( !$latest || $stat['latest'] ) {
- wfProfileOut( __METHOD__ . '-' . $this->name );
- wfProfileOut( __METHOD__ );
return $stat['hash'];
}
}
@@ -768,8 +679,6 @@ abstract class FileBackendStore extends FileBackend {
wfProfileOut( __METHOD__ . '-miss-' . $this->name );
wfProfileOut( __METHOD__ . '-miss' );
$this->cheapCache->set( $path, 'sha1', array( 'hash' => $hash, 'latest' => $latest ) );
- wfProfileOut( __METHOD__ . '-' . $this->name );
- wfProfileOut( __METHOD__ );
return $hash;
}
@@ -786,27 +695,15 @@ abstract class FileBackendStore extends FileBackend {
}
}
- /**
- * @see FileBackend::getFileProps()
- * @return Array
- */
final public function getFileProps( array $params ) {
- wfProfileIn( __METHOD__ );
- wfProfileIn( __METHOD__ . '-' . $this->name );
+ $section = new ProfileSection( __METHOD__ . "-{$this->name}" );
$fsFile = $this->getLocalReference( $params );
$props = $fsFile ? $fsFile->getProps() : FSFile::placeholderProps();
- wfProfileOut( __METHOD__ . '-' . $this->name );
- wfProfileOut( __METHOD__ );
return $props;
}
- /**
- * @see FileBackend::getLocalReferenceMulti()
- * @return Array
- */
final public function getLocalReferenceMulti( array $params ) {
- wfProfileIn( __METHOD__ );
- wfProfileIn( __METHOD__ . '-' . $this->name );
+ $section = new ProfileSection( __METHOD__ . "-{$this->name}" );
$params = $this->setConcurrencyFlags( $params );
@@ -836,8 +733,6 @@ abstract class FileBackendStore extends FileBackend {
}
}
- wfProfileOut( __METHOD__ . '-' . $this->name );
- wfProfileOut( __METHOD__ );
return $fsFiles;
}
@@ -849,19 +744,12 @@ abstract class FileBackendStore extends FileBackend {
return $this->doGetLocalCopyMulti( $params );
}
- /**
- * @see FileBackend::getLocalCopyMulti()
- * @return Array
- */
final public function getLocalCopyMulti( array $params ) {
- wfProfileIn( __METHOD__ );
- wfProfileIn( __METHOD__ . '-' . $this->name );
+ $section = new ProfileSection( __METHOD__ . "-{$this->name}" );
$params = $this->setConcurrencyFlags( $params );
$tmpFiles = $this->doGetLocalCopyMulti( $params );
- wfProfileOut( __METHOD__ . '-' . $this->name );
- wfProfileOut( __METHOD__ );
return $tmpFiles;
}
@@ -879,13 +767,8 @@ abstract class FileBackendStore extends FileBackend {
return null; // not supported
}
- /**
- * @see FileBackend::streamFile()
- * @return Status
- */
final public function streamFile( array $params ) {
- wfProfileIn( __METHOD__ );
- wfProfileIn( __METHOD__ . '-' . $this->name );
+ $section = new ProfileSection( __METHOD__ . "-{$this->name}" );
$status = Status::newGood();
$info = $this->getFileStat( $params );
@@ -916,8 +799,6 @@ abstract class FileBackendStore extends FileBackend {
$status->fatal( 'backend-fail-stream', $params['src'] );
}
- wfProfileOut( __METHOD__ . '-' . $this->name );
- wfProfileOut( __METHOD__ );
return $status;
}
@@ -938,10 +819,6 @@ abstract class FileBackendStore extends FileBackend {
return $status;
}
- /**
- * @see FileBackend::directoryExists()
- * @return bool|null
- */
final public function directoryExists( array $params ) {
list( $fullCont, $dir, $shard ) = $this->resolveStoragePath( $params['dir'] );
if ( $dir === null ) {
@@ -976,10 +853,6 @@ abstract class FileBackendStore extends FileBackend {
*/
abstract protected function doDirectoryExists( $container, $dir, array $params );
- /**
- * @see FileBackend::getDirectoryList()
- * @return Traversable|Array|null Returns null on failure
- */
final public function getDirectoryList( array $params ) {
list( $fullCont, $dir, $shard ) = $this->resolveStoragePath( $params['dir'] );
if ( $dir === null ) { // invalid storage path
@@ -1009,10 +882,6 @@ abstract class FileBackendStore extends FileBackend {
*/
abstract public function getDirectoryListInternal( $container, $dir, array $params );
- /**
- * @see FileBackend::getFileList()
- * @return Traversable|Array|null Returns null on failure
- */
final public function getFileList( array $params ) {
list( $fullCont, $dir, $shard ) = $this->resolveStoragePath( $params['dir'] );
if ( $dir === null ) { // invalid storage path
@@ -1055,13 +924,13 @@ abstract class FileBackendStore extends FileBackend {
*/
final public function getOperationsInternal( array $ops ) {
$supportedOps = array(
- 'store' => 'StoreFileOp',
- 'copy' => 'CopyFileOp',
- 'move' => 'MoveFileOp',
- 'delete' => 'DeleteFileOp',
- 'create' => 'CreateFileOp',
+ 'store' => 'StoreFileOp',
+ 'copy' => 'CopyFileOp',
+ 'move' => 'MoveFileOp',
+ 'delete' => 'DeleteFileOp',
+ 'create' => 'CreateFileOp',
'describe' => 'DescribeFileOp',
- 'null' => 'NullFileOp'
+ 'null' => 'NullFileOp'
);
$performOps = array(); // array of FileOp objects
@@ -1084,12 +953,13 @@ abstract class FileBackendStore extends FileBackend {
/**
* Get a list of storage paths to lock for a list of operations
- * Returns an array with 'sh' (shared) and 'ex' (exclusive) keys,
- * each corresponding to a list of storage paths to be locked.
- * All returned paths are normalized.
+ * Returns an array with LockManager::LOCK_UW (shared locks) and
+ * LockManager::LOCK_EX (exclusive locks) keys, each corresponding
+ * to a list of storage paths to be locked. All returned paths are
+ * normalized.
*
* @param array $performOps List of FileOp objects
- * @return Array ('sh' => list of paths, 'ex' => list of paths)
+ * @return Array (LockManager::LOCK_UW => path list, LockManager::LOCK_EX => path list)
*/
final public function getPathsToLockForOpsInternal( array $performOps ) {
// Build up a list of files to lock...
@@ -1103,28 +973,19 @@ abstract class FileBackendStore extends FileBackend {
// Get a shared lock on the parent directory of each path changed
$paths['sh'] = array_merge( $paths['sh'], array_map( 'dirname', $paths['ex'] ) );
- return $paths;
+ return array(
+ LockManager::LOCK_UW => $paths['sh'],
+ LockManager::LOCK_EX => $paths['ex']
+ );
}
- /**
- * @see FileBackend::getScopedLocksForOps()
- * @return Array
- */
public function getScopedLocksForOps( array $ops, Status $status ) {
$paths = $this->getPathsToLockForOpsInternal( $this->getOperationsInternal( $ops ) );
- return array(
- $this->getScopedFileLocks( $paths['sh'], LockManager::LOCK_UW, $status ),
- $this->getScopedFileLocks( $paths['ex'], LockManager::LOCK_EX, $status )
- );
+ return array( $this->getScopedFileLocks( $paths, 'mixed', $status ) );
}
- /**
- * @see FileBackend::doOperationsInternal()
- * @return Status
- */
final protected function doOperationsInternal( array $ops, array $opts ) {
- wfProfileIn( __METHOD__ );
- wfProfileIn( __METHOD__ . '-' . $this->name );
+ $section = new ProfileSection( __METHOD__ . "-{$this->name}" );
$status = Status::newGood();
// Fix up custom header name/value pairs...
@@ -1138,11 +999,8 @@ abstract class FileBackendStore extends FileBackend {
// Build up a list of files to lock...
$paths = $this->getPathsToLockForOpsInternal( $performOps );
// Try to lock those files for the scope of this function...
- $scopeLockS = $this->getScopedFileLocks( $paths['sh'], LockManager::LOCK_UW, $status );
- $scopeLockE = $this->getScopedFileLocks( $paths['ex'], LockManager::LOCK_EX, $status );
+ $scopeLock = $this->getScopedFileLocks( $paths, 'mixed', $status );
if ( !$status->isOK() ) {
- wfProfileOut( __METHOD__ . '-' . $this->name );
- wfProfileOut( __METHOD__ );
return $status; // abort
}
}
@@ -1164,19 +1022,11 @@ abstract class FileBackendStore extends FileBackend {
$status->merge( $subStatus );
$status->success = $subStatus->success; // not done in merge()
- wfProfileOut( __METHOD__ . '-' . $this->name );
- wfProfileOut( __METHOD__ );
return $status;
}
- /**
- * @see FileBackend::doQuickOperationsInternal()
- * @return Status
- * @throws MWException
- */
final protected function doQuickOperationsInternal( array $ops ) {
- wfProfileIn( __METHOD__ );
- wfProfileIn( __METHOD__ . '-' . $this->name );
+ $section = new ProfileSection( __METHOD__ . "-{$this->name}" );
$status = Status::newGood();
// Fix up custom header name/value pairs...
@@ -1186,7 +1036,7 @@ abstract class FileBackendStore extends FileBackend {
$this->clearCache();
$supportedOps = array( 'create', 'store', 'copy', 'move', 'delete', 'null' );
- $async = ( $this->parallelize === 'implicit' );
+ $async = ( $this->parallelize === 'implicit' && count( $ops ) > 1 );
$maxConcurrency = $this->concurrency; // throttle
$statuses = array(); // array of (index => Status)
@@ -1195,8 +1045,6 @@ abstract class FileBackendStore extends FileBackend {
// Perform the sync-only ops and build up op handles for the async ops...
foreach ( $ops as $index => $params ) {
if ( !in_array( $params['op'], $supportedOps ) ) {
- wfProfileOut( __METHOD__ . '-' . $this->name );
- wfProfileOut( __METHOD__ );
throw new MWException( "Operation '{$params['op']}' is not supported." );
}
$method = $params['op'] . 'Internal'; // e.g. "storeInternal"
@@ -1230,8 +1078,6 @@ abstract class FileBackendStore extends FileBackend {
}
}
- wfProfileOut( __METHOD__ . '-' . $this->name );
- wfProfileOut( __METHOD__ );
return $status;
}
@@ -1245,8 +1091,7 @@ abstract class FileBackendStore extends FileBackend {
* @throws MWException
*/
final public function executeOpHandlesInternal( array $fileOpHandles ) {
- wfProfileIn( __METHOD__ );
- wfProfileIn( __METHOD__ . '-' . $this->name );
+ $section = new ProfileSection( __METHOD__ . "-{$this->name}" );
foreach ( $fileOpHandles as $fileOpHandle ) {
if ( !( $fileOpHandle instanceof FileBackendStoreOpHandle ) ) {
throw new MWException( "Given a non-FileBackendStoreOpHandle object." );
@@ -1258,8 +1103,6 @@ abstract class FileBackendStore extends FileBackend {
foreach ( $fileOpHandles as $fileOpHandle ) {
$fileOpHandle->closeResources();
}
- wfProfileOut( __METHOD__ . '-' . $this->name );
- wfProfileOut( __METHOD__ );
return $res;
}
@@ -1277,15 +1120,20 @@ abstract class FileBackendStore extends FileBackend {
}
/**
- * Strip long HTTP headers from a file operation
+ * Strip long HTTP headers from a file operation.
+ * Most headers are just numbers, but some are allowed to be long.
+ * This function is useful for cleaning up headers and avoiding backend
+ * specific errors, especially in the middle of batch file operations.
*
* @param array $op Same format as doOperation()
* @return Array
*/
protected function stripInvalidHeadersFromOp( array $op ) {
- if ( isset( $op['headers'] ) ) {
+ static $longs = array( 'Content-Disposition' );
+ if ( isset( $op['headers'] ) ) { // op sets HTTP headers
foreach ( $op['headers'] as $name => $value ) {
- if ( strlen( $name ) > 255 || strlen( $value ) > 255 ) {
+ $maxHVLen = in_array( $name, $longs ) ? INF : 255;
+ if ( strlen( $name ) > 255 || strlen( $value ) > $maxHVLen ) {
trigger_error( "Header '$name: $value' is too long." );
unset( $op['headers'][$name] );
} elseif ( !strlen( $value ) ) {
@@ -1296,9 +1144,6 @@ abstract class FileBackendStore extends FileBackend {
return $op;
}
- /**
- * @see FileBackend::preloadCache()
- */
final public function preloadCache( array $paths ) {
$fullConts = array(); // full container names
foreach ( $paths as $path ) {
@@ -1310,9 +1155,6 @@ abstract class FileBackendStore extends FileBackend {
$this->primeFileCache( $paths );
}
- /**
- * @see FileBackend::clearCache()
- */
final public function clearCache( array $paths = null ) {
if ( is_array( $paths ) ) {
$paths = array_map( 'FileBackend::normalizeStoragePath', $paths );
@@ -1353,7 +1195,7 @@ abstract class FileBackendStore extends FileBackend {
* Check if a container name is valid.
* This checks for for length and illegal characters.
*
- * @param $container string
+ * @param string $container
* @return bool
*/
final protected static function isValidContainerName( $container ) {
@@ -1375,7 +1217,7 @@ abstract class FileBackendStore extends FileBackend {
* this means that the path can only refer to a directory and can only
* be scanned by looking in all the container shards.
*
- * @param $storagePath string
+ * @param string $storagePath
* @return Array (container, path, container suffix) or (null, null, null) if invalid
*/
final protected function resolveStoragePath( $storagePath ) {
@@ -1405,16 +1247,22 @@ abstract class FileBackendStore extends FileBackend {
/**
* Like resolveStoragePath() except null values are returned if
- * the container is sharded and the shard could not be determined.
+ * the container is sharded and the shard could not be determined
+ * or if the path ends with '/'. The later case is illegal for FS
+ * backends and can confuse listings for object store backends.
+ *
+ * This function is used when resolving paths that must be valid
+ * locations for files. Directory and listing functions should
+ * generally just use resolveStoragePath() instead.
*
* @see FileBackendStore::resolveStoragePath()
*
- * @param $storagePath string
+ * @param string $storagePath
* @return Array (container, path) or (null, null) if invalid
*/
final protected function resolveStoragePathReal( $storagePath ) {
list( $container, $relPath, $cShard ) = $this->resolveStoragePath( $storagePath );
- if ( $cShard !== null ) {
+ if ( $cShard !== null && substr( $relPath, -1 ) !== '/' ) {
return array( $container, $relPath );
}
return array( null, null );
@@ -1474,7 +1322,7 @@ abstract class FileBackendStore extends FileBackend {
* If greater than 0, then all file storage paths within
* the container are required to be hashed accordingly.
*
- * @param $container string
+ * @param string $container
* @return Array (integer levels, integer base, repeat flag) or (0, 0, false)
*/
final protected function getContainerHashLevels( $container ) {
@@ -1494,7 +1342,7 @@ abstract class FileBackendStore extends FileBackend {
/**
* Get a list of full container shard suffixes for a container
*
- * @param $container string
+ * @param string $container
* @return Array
*/
final protected function getContainerSuffixes( $container ) {
@@ -1512,7 +1360,7 @@ abstract class FileBackendStore extends FileBackend {
/**
* Get the full container name, including the wiki ID prefix
*
- * @param $container string
+ * @param string $container
* @return string
*/
final protected function fullContainerName( $container ) {
@@ -1528,7 +1376,7 @@ abstract class FileBackendStore extends FileBackend {
* This is intended for internal use, such as encoding illegal chars.
* Subclasses can override this to be more restrictive.
*
- * @param $container string
+ * @param string $container
* @return string|null
*/
protected function resolveContainerName( $container ) {
@@ -1563,10 +1411,11 @@ abstract class FileBackendStore extends FileBackend {
* Set the cached info for a container
*
* @param string $container Resolved container name
- * @param $val mixed Information to cache
+ * @param array $val Information to cache
+ * @return void
*/
- final protected function setContainerCache( $container, $val ) {
- $this->memCache->add( $this->containerCacheKey( $container ), $val, 14*86400 );
+ final protected function setContainerCache( $container, array $val ) {
+ $this->memCache->add( $this->containerCacheKey( $container ), $val, 14 * 86400 );
}
/**
@@ -1574,6 +1423,7 @@ abstract class FileBackendStore extends FileBackend {
* The cache key is salted for a while to prevent race conditions.
*
* @param string $container Resolved container name
+ * @return void
*/
final protected function deleteContainerCache( $container ) {
if ( !$this->memCache->set( $this->containerCacheKey( $container ), 'PURGED', 300 ) ) {
@@ -1586,12 +1436,11 @@ abstract class FileBackendStore extends FileBackend {
* used in a list of container names, storage paths, or FileOp objects.
* This loads the persistent cache values into the process cache.
*
- * @param $items Array
+ * @param Array $items
* @return void
*/
final protected function primeContainerCache( array $items ) {
- wfProfileIn( __METHOD__ );
- wfProfileIn( __METHOD__ . '-' . $this->name );
+ $section = new ProfileSection( __METHOD__ . "-{$this->name}" );
$paths = array(); // list of storage paths
$contNames = array(); // (cache key => resolved container name)
@@ -1623,9 +1472,6 @@ abstract class FileBackendStore extends FileBackend {
// Populate the container process cache for the backend...
$this->doPrimeContainerCache( array_filter( $contInfo, 'is_array' ) );
-
- wfProfileOut( __METHOD__ . '-' . $this->name );
- wfProfileOut( __METHOD__ );
}
/**
@@ -1654,14 +1500,17 @@ abstract class FileBackendStore extends FileBackend {
* salting for the case when a file is created at a path were there was none before.
*
* @param string $path Storage path
- * @param $val mixed Information to cache
+ * @param array $val Stat information to cache
+ * @return void
*/
- final protected function setFileCache( $path, $val ) {
+ final protected function setFileCache( $path, array $val ) {
$path = FileBackend::normalizeStoragePath( $path );
if ( $path === null ) {
return; // invalid storage path
}
- $this->memCache->add( $this->fileCacheKey( $path ), $val, 7*86400 );
+ $age = time() - wfTimestamp( TS_UNIX, $val['mtime'] );
+ $ttl = min( 7 * 86400, max( 300, floor( .1 * $age ) ) );
+ $this->memCache->add( $this->fileCacheKey( $path ), $val, $ttl );
}
/**
@@ -1671,6 +1520,7 @@ abstract class FileBackendStore extends FileBackend {
* a file is created at a path were there was none before.
*
* @param string $path Storage path
+ * @return void
*/
final protected function deleteFileCache( $path ) {
$path = FileBackend::normalizeStoragePath( $path );
@@ -1691,8 +1541,7 @@ abstract class FileBackendStore extends FileBackend {
* @return void
*/
final protected function primeFileCache( array $items ) {
- wfProfileIn( __METHOD__ );
- wfProfileIn( __METHOD__ . '-' . $this->name );
+ $section = new ProfileSection( __METHOD__ . "-{$this->name}" );
$paths = array(); // list of storage paths
$pathNames = array(); // (cache key => storage path)
@@ -1726,9 +1575,6 @@ abstract class FileBackendStore extends FileBackend {
}
}
}
-
- wfProfileOut( __METHOD__ . '-' . $this->name );
- wfProfileOut( __METHOD__ );
}
/**
@@ -1750,6 +1596,18 @@ abstract class FileBackendStore extends FileBackend {
}
return $opts;
}
+
+ /**
+ * Get the content type to use in HEAD/GET requests for a file
+ *
+ * @param string $storagePath
+ * @param string|null $content File data
+ * @param string|null $fsPath File system path
+ * @return MIME type
+ */
+ protected function getContentType( $storagePath, $content, $fsPath ) {
+ return call_user_func_array( $this->mimeCallback, func_get_args() );
+ }
}
/**
@@ -1786,26 +1644,20 @@ abstract class FileBackendStoreOpHandle {
*
* @ingroup FileBackend
*/
-abstract class FileBackendStoreShardListIterator implements Iterator {
+abstract class FileBackendStoreShardListIterator extends FilterIterator {
/** @var FileBackendStore */
protected $backend;
/** @var Array */
protected $params;
- /** @var Array */
- protected $shardSuffixes;
+
protected $container; // string; full container name
protected $directory; // string; resolved relative path
- /** @var Traversable */
- protected $iter;
- protected $curShard = 0; // integer
- protected $pos = 0; // integer
-
/** @var Array */
protected $multiShardPaths = array(); // (rel path => 1)
/**
- * @param $backend FileBackendStore
+ * @param FileBackendStore $backend
* @param string $container Full storage container name
* @param string $dir Storage directory relative to container
* @param array $suffixes List of container shard suffixes
@@ -1817,142 +1669,56 @@ abstract class FileBackendStoreShardListIterator implements Iterator {
$this->backend = $backend;
$this->container = $container;
$this->directory = $dir;
- $this->shardSuffixes = $suffixes;
$this->params = $params;
- }
-
- /**
- * @see Iterator::key()
- * @return integer
- */
- public function key() {
- return $this->pos;
- }
- /**
- * @see Iterator::valid()
- * @return bool
- */
- public function valid() {
- if ( $this->iter instanceof Iterator ) {
- return $this->iter->valid();
- } elseif ( is_array( $this->iter ) ) {
- return ( current( $this->iter ) !== false ); // no paths can have this value
+ $iter = new AppendIterator();
+ foreach ( $suffixes as $suffix ) {
+ $iter->append( $this->listFromShard( $this->container . $suffix ) );
}
- return false; // some failure?
- }
-
- /**
- * @see Iterator::current()
- * @return string|bool String or false
- */
- public function current() {
- return ( $this->iter instanceof Iterator )
- ? $this->iter->current()
- : current( $this->iter );
- }
- /**
- * @see Iterator::next()
- * @return void
- */
- public function next() {
- ++$this->pos;
- ( $this->iter instanceof Iterator ) ? $this->iter->next() : next( $this->iter );
- do {
- $continue = false; // keep scanning shards?
- $this->filterViaNext(); // filter out duplicates
- // Find the next non-empty shard if no elements are left
- if ( !$this->valid() ) {
- $this->nextShardIteratorIfNotValid();
- $continue = $this->valid(); // re-filter unless we ran out of shards
- }
- } while ( $continue );
- }
-
- /**
- * @see Iterator::rewind()
- * @return void
- */
- public function rewind() {
- $this->pos = 0;
- $this->curShard = 0;
- $this->setIteratorFromCurrentShard();
- do {
- $continue = false; // keep scanning shards?
- $this->filterViaNext(); // filter out duplicates
- // Find the next non-empty shard if no elements are left
- if ( !$this->valid() ) {
- $this->nextShardIteratorIfNotValid();
- $continue = $this->valid(); // re-filter unless we ran out of shards
- }
- } while ( $continue );
- }
-
- /**
- * Filter out duplicate items by advancing to the next ones
- */
- protected function filterViaNext() {
- while ( $this->valid() ) {
- $rel = $this->iter->current(); // path relative to given directory
- $path = $this->params['dir'] . "/{$rel}"; // full storage path
- if ( $this->backend->isSingleShardPathInternal( $path ) ) {
- break; // path is only on one shard; no issue with duplicates
- } elseif ( isset( $this->multiShardPaths[$rel] ) ) {
- // Don't keep listing paths that are on multiple shards
- ( $this->iter instanceof Iterator ) ? $this->iter->next() : next( $this->iter );
- } else {
- $this->multiShardPaths[$rel] = 1;
- break;
- }
- }
+ parent::__construct( $iter );
}
- /**
- * If the list iterator for this container shard is out of items,
- * then move on to the next container that has items.
- * If there are none, then it advances to the last container.
- */
- protected function nextShardIteratorIfNotValid() {
- while ( !$this->valid() && ++$this->curShard < count( $this->shardSuffixes ) ) {
- $this->setIteratorFromCurrentShard();
+ public function accept() {
+ $rel = $this->getInnerIterator()->current(); // path relative to given directory
+ $path = $this->params['dir'] . "/{$rel}"; // full storage path
+ if ( $this->backend->isSingleShardPathInternal( $path ) ) {
+ return true; // path is only on one shard; no issue with duplicates
+ } elseif ( isset( $this->multiShardPaths[$rel] ) ) {
+ // Don't keep listing paths that are on multiple shards
+ return false;
+ } else {
+ $this->multiShardPaths[$rel] = 1;
+ return true;
}
}
- /**
- * Set the list iterator to that of the current container shard
- */
- protected function setIteratorFromCurrentShard() {
- $this->iter = $this->listFromShard(
- $this->container . $this->shardSuffixes[$this->curShard],
- $this->directory, $this->params );
- // Start loading results so that current() works
- if ( $this->iter ) {
- ( $this->iter instanceof Iterator ) ? $this->iter->rewind() : reset( $this->iter );
- }
+ public function rewind() {
+ parent::rewind();
+ $this->multiShardPaths = array();
}
/**
* Get the list for a given container shard
*
* @param string $container Resolved container name
- * @param string $dir Resolved path relative to container
- * @param array $params
- * @return Traversable|Array|null
+ * @return Iterator
*/
- abstract protected function listFromShard( $container, $dir, array $params );
+ abstract protected function listFromShard( $container );
}
/**
* Iterator for listing directories
*/
class FileBackendStoreShardDirIterator extends FileBackendStoreShardListIterator {
- /**
- * @see FileBackendStoreShardListIterator::listFromShard()
- * @return Array|null|Traversable
- */
- protected function listFromShard( $container, $dir, array $params ) {
- return $this->backend->getDirectoryListInternal( $container, $dir, $params );
+ protected function listFromShard( $container ) {
+ $list = $this->backend->getDirectoryListInternal(
+ $container, $this->directory, $this->params );
+ if ( $list === null ) {
+ return new ArrayIterator( array() );
+ } else {
+ return is_array( $list ) ? new ArrayIterator( $list ) : $list;
+ }
}
}
@@ -1960,11 +1726,13 @@ class FileBackendStoreShardDirIterator extends FileBackendStoreShardListIterator
* Iterator for listing regular files
*/
class FileBackendStoreShardFileIterator extends FileBackendStoreShardListIterator {
- /**
- * @see FileBackendStoreShardListIterator::listFromShard()
- * @return Array|null|Traversable
- */
- protected function listFromShard( $container, $dir, array $params ) {
- return $this->backend->getFileListInternal( $container, $dir, $params );
+ protected function listFromShard( $container ) {
+ $list = $this->backend->getFileListInternal(
+ $container, $this->directory, $this->params );
+ if ( $list === null ) {
+ return new ArrayIterator( array() );
+ } else {
+ return is_array( $list ) ? new ArrayIterator( $list ) : $list;
+ }
}
}
diff --git a/includes/filebackend/FileOp.php b/includes/filebackend/FileOp.php
index bb0ab578..fe833084 100644
--- a/includes/filebackend/FileOp.php
+++ b/includes/filebackend/FileOp.php
@@ -46,7 +46,7 @@ abstract class FileOp {
protected $doOperation = true; // boolean; operation is not a no-op
protected $sourceSha1; // string
- protected $destSameAsSource; // boolean
+ protected $overwriteSameCase; // boolean
protected $destExists; // boolean
/* Object life-cycle */
@@ -55,17 +55,19 @@ abstract class FileOp {
const STATE_ATTEMPTED = 3;
/**
- * Build a new file operation transaction
+ * Build a new batch file operation transaction
*
- * @param $backend FileBackendStore
- * @param $params Array
+ * @param FileBackendStore $backend
+ * @param Array $params
* @throws MWException
*/
final public function __construct( FileBackendStore $backend, array $params ) {
$this->backend = $backend;
list( $required, $optional ) = $this->allowedParams();
+ // @todo normalizeAnyStoragePaths() calls are overzealous, use a parameter list
foreach ( $required as $name ) {
if ( isset( $params[$name] ) ) {
+ // Normalize paths so the paths to the same file have the same string
$this->params[$name] = self::normalizeAnyStoragePaths( $params[$name] );
} else {
throw new MWException( "File operation missing parameter '$name'." );
@@ -73,6 +75,7 @@ abstract class FileOp {
}
foreach ( $optional as $name ) {
if ( isset( $params[$name] ) ) {
+ // Normalize paths so the paths to the same file have the same string
$this->params[$name] = self::normalizeAnyStoragePaths( $params[$name] );
}
}
@@ -82,7 +85,7 @@ abstract class FileOp {
/**
* Normalize $item or anything in $item that is a valid storage path
*
- * @param $item string|array
+ * @param string $item|array
* @return string|Array
*/
protected function normalizeAnyStoragePaths( $item ) {
@@ -102,7 +105,7 @@ abstract class FileOp {
/**
* Normalize a string if it is a valid storage path
*
- * @param $path string
+ * @param string $path
* @return string
*/
protected static function normalizeIfValidStoragePath( $path ) {
@@ -116,7 +119,7 @@ abstract class FileOp {
/**
* Set the batch UUID this operation belongs to
*
- * @param $batchId string
+ * @param string $batchId
* @return void
*/
final public function setBatchId( $batchId ) {
@@ -126,7 +129,7 @@ abstract class FileOp {
/**
* Get the value of the parameter with the given name
*
- * @param $name string
+ * @param string $name
* @return mixed Returns null if the parameter is not set
*/
final public function getParam( $name ) {
@@ -209,22 +212,22 @@ abstract class FileOp {
$pathsUsed = array_merge( $this->storagePathsRead(), $this->storagePathsChanged() );
foreach ( array_unique( $pathsUsed ) as $path ) {
$nullEntries[] = array( // assertion for recovery
- 'op' => 'null',
- 'path' => $path,
+ 'op' => 'null',
+ 'path' => $path,
'newSha1' => $this->fileSha1( $path, $oPredicates )
);
}
foreach ( $this->storagePathsChanged() as $path ) {
if ( $nPredicates['sha1'][$path] === false ) { // deleted
$deleteEntries[] = array(
- 'op' => 'delete',
- 'path' => $path,
+ 'op' => 'delete',
+ 'path' => $path,
'newSha1' => ''
);
} else { // created/updated
$updateEntries[] = array(
- 'op' => $this->fileExists( $path, $oPredicates ) ? 'update' : 'create',
- 'path' => $path,
+ 'op' => $this->fileExists( $path, $oPredicates ) ? 'update' : 'create',
+ 'path' => $path,
'newSha1' => $nPredicates['sha1'][$path]
);
}
@@ -237,7 +240,7 @@ abstract class FileOp {
* This must update $predicates for each path that the op can change
* except when a failing status object is returned.
*
- * @param $predicates Array
+ * @param Array $predicates
* @return Status
*/
final public function precheck( array &$predicates ) {
@@ -314,7 +317,7 @@ abstract class FileOp {
/**
* Adjust params to FileBackendStore internal file calls
*
- * @param $params Array
+ * @param Array $params
* @return Array (required params list, optional params list)
*/
protected function setFlags( array $params ) {
@@ -341,10 +344,10 @@ abstract class FileOp {
/**
* Check for errors with regards to the destination file already existing.
- * Also set the destExists, destSameAsSource and sourceSha1 member variables.
+ * Also set the destExists, overwriteSameCase and sourceSha1 member variables.
* A bad status will be returned if there is no chance it can be overwritten.
*
- * @param $predicates Array
+ * @param Array $predicates
* @return Status
*/
protected function precheckDestExistence( array $predicates ) {
@@ -354,7 +357,7 @@ abstract class FileOp {
if ( $this->sourceSha1 === null ) { // file in storage?
$this->sourceSha1 = $this->fileSha1( $this->params['src'], $predicates );
}
- $this->destSameAsSource = false;
+ $this->overwriteSameCase = false;
$this->destExists = $this->fileExists( $this->params['dst'], $predicates );
if ( $this->destExists ) {
if ( $this->getParam( 'overwrite' ) ) {
@@ -368,7 +371,7 @@ abstract class FileOp {
// Give an error if the files are not identical
$status->fatal( 'backend-fail-notsame', $this->params['dst'] );
} else {
- $this->destSameAsSource = true; // OK
+ $this->overwriteSameCase = true; // OK
}
return $status; // do nothing; either OK or bad status
} else {
@@ -381,7 +384,7 @@ abstract class FileOp {
/**
* precheckDestExistence() helper function to get the source file SHA-1.
- * Subclasses should overwride this iff the source is not in storage.
+ * Subclasses should overwride this if the source is not in storage.
*
* @return string|bool Returns false on failure
*/
@@ -393,7 +396,7 @@ abstract class FileOp {
* Check if a file will exist in storage when this operation is attempted
*
* @param string $source Storage path
- * @param $predicates Array
+ * @param Array $predicates
* @return bool
*/
final protected function fileExists( $source, array $predicates ) {
@@ -409,7 +412,7 @@ abstract class FileOp {
* Get the SHA-1 of a file in storage when this operation is attempted
*
* @param string $source Storage path
- * @param $predicates Array
+ * @param Array $predicates
* @return string|bool False on failure
*/
final protected function fileSha1( $source, array $predicates ) {
@@ -435,7 +438,7 @@ abstract class FileOp {
/**
* Log a file operation failure and preserve any temp files
*
- * @param $action string
+ * @param string $action
* @return void
*/
final public function logFailure( $action ) {
@@ -457,7 +460,7 @@ abstract class FileOp {
class CreateFileOp extends FileOp {
protected function allowedParams() {
return array( array( 'content', 'dst' ),
- array( 'overwrite', 'overwriteSame', 'disposition', 'headers' ) );
+ array( 'overwrite', 'overwriteSame', 'headers' ) );
}
protected function doPrecheck( array &$predicates ) {
@@ -485,27 +488,18 @@ class CreateFileOp extends FileOp {
return $status; // safe to call attempt()
}
- /**
- * @return Status
- */
protected function doAttempt() {
- if ( !$this->destSameAsSource ) {
+ if ( !$this->overwriteSameCase ) {
// Create the file at the destination
return $this->backend->createInternal( $this->setFlags( $this->params ) );
}
return Status::newGood();
}
- /**
- * @return bool|String
- */
protected function getSourceSha1Base36() {
return wfBaseConvert( sha1( $this->params['content'] ), 16, 36, 31 );
}
- /**
- * @return array
- */
public function storagePathsChanged() {
return array( $this->params['dst'] );
}
@@ -516,18 +510,11 @@ class CreateFileOp extends FileOp {
* Parameters for this operation are outlined in FileBackend::doOperations().
*/
class StoreFileOp extends FileOp {
- /**
- * @return array
- */
protected function allowedParams() {
return array( array( 'src', 'dst' ),
- array( 'overwrite', 'overwriteSame', 'disposition', 'headers' ) );
+ array( 'overwrite', 'overwriteSame', 'headers' ) );
}
- /**
- * @param $predicates array
- * @return Status
- */
protected function doPrecheck( array &$predicates ) {
$status = Status::newGood();
// Check if the source file exists on the file system
@@ -557,20 +544,14 @@ class StoreFileOp extends FileOp {
return $status; // safe to call attempt()
}
- /**
- * @return Status
- */
protected function doAttempt() {
- // Store the file at the destination
- if ( !$this->destSameAsSource ) {
+ if ( !$this->overwriteSameCase ) {
+ // Store the file at the destination
return $this->backend->storeInternal( $this->setFlags( $this->params ) );
}
return Status::newGood();
}
- /**
- * @return bool|string
- */
protected function getSourceSha1Base36() {
wfSuppressWarnings();
$hash = sha1_file( $this->params['src'] );
@@ -591,18 +572,11 @@ class StoreFileOp extends FileOp {
* Parameters for this operation are outlined in FileBackend::doOperations().
*/
class CopyFileOp extends FileOp {
- /**
- * @return array
- */
protected function allowedParams() {
return array( array( 'src', 'dst' ),
- array( 'overwrite', 'overwriteSame', 'ignoreMissingSource', 'disposition' ) );
+ array( 'overwrite', 'overwriteSame', 'ignoreMissingSource', 'headers' ) );
}
- /**
- * @param $predicates array
- * @return Status
- */
protected function doPrecheck( array &$predicates ) {
$status = Status::newGood();
// Check if the source file exists
@@ -634,30 +608,26 @@ class CopyFileOp extends FileOp {
return $status; // safe to call attempt()
}
- /**
- * @return Status
- */
protected function doAttempt() {
- // Do nothing if the src/dst paths are the same
- if ( $this->params['src'] !== $this->params['dst'] ) {
- // Copy the file into the destination
- if ( !$this->destSameAsSource ) {
- return $this->backend->copyInternal( $this->setFlags( $this->params ) );
- }
+ if ( $this->overwriteSameCase ) {
+ $status = Status::newGood(); // nothing to do
+ } elseif ( $this->params['src'] === $this->params['dst'] ) {
+ // Just update the destination file headers
+ $headers = $this->getParam( 'headers' ) ?: array();
+ $status = $this->backend->describeInternal( $this->setFlags( array(
+ 'src' => $this->params['dst'], 'headers' => $headers
+ ) ) );
+ } else {
+ // Copy the file to the destination
+ $status = $this->backend->copyInternal( $this->setFlags( $this->params ) );
}
- return Status::newGood();
+ return $status;
}
- /**
- * @return array
- */
public function storagePathsRead() {
return array( $this->params['src'] );
}
- /**
- * @return array
- */
public function storagePathsChanged() {
return array( $this->params['dst'] );
}
@@ -668,18 +638,11 @@ class CopyFileOp extends FileOp {
* Parameters for this operation are outlined in FileBackend::doOperations().
*/
class MoveFileOp extends FileOp {
- /**
- * @return array
- */
protected function allowedParams() {
return array( array( 'src', 'dst' ),
- array( 'overwrite', 'overwriteSame', 'ignoreMissingSource', 'disposition' ) );
+ array( 'overwrite', 'overwriteSame', 'ignoreMissingSource', 'headers' ) );
}
- /**
- * @param $predicates array
- * @return Status
- */
protected function doPrecheck( array &$predicates ) {
$status = Status::newGood();
// Check if the source file exists
@@ -713,34 +676,34 @@ class MoveFileOp extends FileOp {
return $status; // safe to call attempt()
}
- /**
- * @return Status
- */
protected function doAttempt() {
- // Do nothing if the src/dst paths are the same
- if ( $this->params['src'] !== $this->params['dst'] ) {
- if ( !$this->destSameAsSource ) {
- // Move the file into the destination
- return $this->backend->moveInternal( $this->setFlags( $this->params ) );
+ if ( $this->overwriteSameCase ) {
+ if ( $this->params['src'] === $this->params['dst'] ) {
+ // Do nothing to the destination (which is also the source)
+ $status = Status::newGood();
} else {
- // Just delete source as the destination needs no changes
- $params = array( 'src' => $this->params['src'] );
- return $this->backend->deleteInternal( $this->setFlags( $params ) );
+ // Just delete the source as the destination file needs no changes
+ $status = $this->backend->deleteInternal( $this->setFlags(
+ array( 'src' => $this->params['src'] )
+ ) );
}
+ } elseif ( $this->params['src'] === $this->params['dst'] ) {
+ // Just update the destination file headers
+ $headers = $this->getParam( 'headers' ) ?: array();
+ $status = $this->backend->describeInternal( $this->setFlags(
+ array( 'src' => $this->params['dst'], 'headers' => $headers )
+ ) );
+ } else {
+ // Move the file to the destination
+ $status = $this->backend->moveInternal( $this->setFlags( $this->params ) );
}
- return Status::newGood();
+ return $status;
}
- /**
- * @return array
- */
public function storagePathsRead() {
return array( $this->params['src'] );
}
- /**
- * @return array
- */
public function storagePathsChanged() {
return array( $this->params['src'], $this->params['dst'] );
}
@@ -751,17 +714,10 @@ class MoveFileOp extends FileOp {
* Parameters for this operation are outlined in FileBackend::doOperations().
*/
class DeleteFileOp extends FileOp {
- /**
- * @return array
- */
protected function allowedParams() {
return array( array( 'src' ), array( 'ignoreMissingSource' ) );
}
- /**
- * @param $predicates array
- * @return Status
- */
protected function doPrecheck( array &$predicates ) {
$status = Status::newGood();
// Check if the source file exists
@@ -788,17 +744,11 @@ class DeleteFileOp extends FileOp {
return $status; // safe to call attempt()
}
- /**
- * @return Status
- */
protected function doAttempt() {
// Delete the source file
return $this->backend->deleteInternal( $this->setFlags( $this->params ) );
}
- /**
- * @return array
- */
public function storagePathsChanged() {
return array( $this->params['src'] );
}
@@ -809,17 +759,10 @@ class DeleteFileOp extends FileOp {
* Parameters for this operation are outlined in FileBackend::doOperations().
*/
class DescribeFileOp extends FileOp {
- /**
- * @return array
- */
protected function allowedParams() {
- return array( array( 'src' ), array( 'disposition', 'headers' ) );
+ return array( array( 'src' ), array( 'headers' ) );
}
- /**
- * @param $predicates array
- * @return Status
- */
protected function doPrecheck( array &$predicates ) {
$status = Status::newGood();
// Check if the source file exists
@@ -840,17 +783,11 @@ class DescribeFileOp extends FileOp {
return $status; // safe to call attempt()
}
- /**
- * @return Status
- */
protected function doAttempt() {
// Update the source file's metadata
return $this->backend->describeInternal( $this->setFlags( $this->params ) );
}
- /**
- * @return array
- */
public function storagePathsChanged() {
return array( $this->params['src'] );
}
diff --git a/includes/filebackend/FileOpBatch.php b/includes/filebackend/FileOpBatch.php
index fc51d78a..785c0bc9 100644
--- a/includes/filebackend/FileOpBatch.php
+++ b/includes/filebackend/FileOpBatch.php
@@ -51,7 +51,7 @@ class FileOpBatch {
*
* @param array $performOps List of FileOp operations
* @param array $opts Batch operation options
- * @param $journal FileJournal Journal to log operations to
+ * @param FileJournal $journal Journal to log operations to
* @return Status
*/
public static function attempt( array $performOps, array $opts, FileJournal $journal ) {
@@ -145,8 +145,8 @@ class FileOpBatch {
* within any given sub-batch do not depend on each other.
* This will abort remaining ops on failure.
*
- * @param $pPerformOps Array
- * @param $status Status
+ * @param Array $pPerformOps
+ * @param Status $status
* @return bool Success
*/
protected static function runParallelBatches( array $pPerformOps, Status $status ) {
diff --git a/includes/filebackend/README b/includes/filebackend/README
index 6ab54810..569f3376 100644
--- a/includes/filebackend/README
+++ b/includes/filebackend/README
@@ -47,7 +47,7 @@ directories. See FileBackend.php for full documentation for each function.
The following basic operations are supported for reading from a backend:
On files:
-* state a file for basic information (timestamp, size)
+* stat a file for basic information (timestamp, size)
* read a file into a string or several files into a map of path names to strings
* download a file or set of files to a temporary file (on a mounted file system)
* get the SHA1 hash of a file
diff --git a/includes/filebackend/SwiftFileBackend.php b/includes/filebackend/SwiftFileBackend.php
index 0f3d97a3..db090a98 100644
--- a/includes/filebackend/SwiftFileBackend.php
+++ b/includes/filebackend/SwiftFileBackend.php
@@ -24,7 +24,7 @@
*/
/**
- * @brief Class for an OpenStack Swift based file backend.
+ * @brief Class for an OpenStack Swift (or Ceph RGW) based file backend.
*
* This requires the SwiftCloudFiles MediaWiki extension, which includes
* the php-cloudfiles library (https://github.com/rackspace/php-cloudfiles).
@@ -104,7 +104,7 @@ class SwiftFileBackend extends FileBackendStore {
*/
public function __construct( array $config ) {
parent::__construct( $config );
- if ( !MWInit::classExists( 'CF_Constants' ) ) {
+ if ( !class_exists( 'CF_Constants' ) ) {
throw new MWException( 'SwiftCloudFiles extension not installed.' );
}
// Required settings
@@ -132,7 +132,7 @@ class SwiftFileBackend extends FileBackendStore {
: false;
$this->swiftCDNExpiry = isset( $config['swiftCDNExpiry'] )
? $config['swiftCDNExpiry']
- : 12*3600; // 12 hours is safe (tokens last 24 hours per http://docs.openstack.org)
+ : 12 * 3600; // 12 hours is safe (tokens last 24 hours per http://docs.openstack.org)
$this->swiftCDNPurgable = isset( $config['swiftCDNPurgable'] )
? $config['swiftCDNPurgable']
: true;
@@ -172,10 +172,6 @@ class SwiftFileBackend extends FileBackendStore {
return $relStoragePath;
}
- /**
- * @see FileBackendStore::isPathUsableInternal()
- * @return bool
- */
public function isPathUsableInternal( $storagePath ) {
list( $container, $rel ) = $this->resolveStoragePathReal( $storagePath );
if ( $rel === null ) {
@@ -194,6 +190,18 @@ class SwiftFileBackend extends FileBackendStore {
}
/**
+ * @param array $headers
+ * @return array
+ */
+ protected function sanitizeHdrs( array $headers ) {
+ // By default, Swift has annoyingly low maximum header value limits
+ if ( isset( $headers['Content-Disposition'] ) ) {
+ $headers['Content-Disposition'] = $this->truncDisp( $headers['Content-Disposition'] );
+ }
+ return $headers;
+ }
+
+ /**
* @param string $disposition Content-Disposition header value
* @return string Truncated Content-Disposition header value to meet Swift limits
*/
@@ -211,10 +219,6 @@ class SwiftFileBackend extends FileBackendStore {
return $res;
}
- /**
- * @see FileBackendStore::doCreateInternal()
- * @return Status
- */
protected function doCreateInternal( array $params ) {
$status = Status::newGood();
@@ -248,17 +252,10 @@ class SwiftFileBackend extends FileBackendStore {
// The MD5 here will be checked within Swift against its own MD5.
$obj->set_etag( md5( $params['content'] ) );
// Use the same content type as StreamFile for security
- $obj->content_type = StreamFile::contentTypeFromPath( $params['dst'] );
- if ( !strlen( $obj->content_type ) ) { // special case
- $obj->content_type = 'unknown/unknown';
- }
- // Set the Content-Disposition header if requested
- if ( isset( $params['disposition'] ) ) {
- $obj->headers['Content-Disposition'] = $this->truncDisp( $params['disposition'] );
- }
+ $obj->content_type = $this->getContentType( $params['dst'], $params['content'], null );
// Set any other custom headers if requested
if ( isset( $params['headers'] ) ) {
- $obj->headers += $params['headers'];
+ $obj->headers += $this->sanitizeHdrs( $params['headers'] );
}
if ( !empty( $params['async'] ) ) { // deferred
$op = $obj->write_async( $params['content'] );
@@ -290,10 +287,6 @@ class SwiftFileBackend extends FileBackendStore {
}
}
- /**
- * @see FileBackendStore::doStoreInternal()
- * @return Status
- */
protected function doStoreInternal( array $params ) {
$status = Status::newGood();
@@ -333,17 +326,10 @@ class SwiftFileBackend extends FileBackendStore {
// The MD5 here will be checked within Swift against its own MD5.
$obj->set_etag( md5_file( $params['src'] ) );
// Use the same content type as StreamFile for security
- $obj->content_type = StreamFile::contentTypeFromPath( $params['dst'] );
- if ( !strlen( $obj->content_type ) ) { // special case
- $obj->content_type = 'unknown/unknown';
- }
- // Set the Content-Disposition header if requested
- if ( isset( $params['disposition'] ) ) {
- $obj->headers['Content-Disposition'] = $this->truncDisp( $params['disposition'] );
- }
+ $obj->content_type = $this->getContentType( $params['dst'], null, $params['src'] );
// Set any other custom headers if requested
if ( isset( $params['headers'] ) ) {
- $obj->headers += $params['headers'];
+ $obj->headers += $this->sanitizeHdrs( $params['headers'] );
}
if ( !empty( $params['async'] ) ) { // deferred
wfSuppressWarnings();
@@ -387,10 +373,6 @@ class SwiftFileBackend extends FileBackendStore {
}
}
- /**
- * @see FileBackendStore::doCopyInternal()
- * @return Status
- */
protected function doCopyInternal( array $params ) {
$status = Status::newGood();
@@ -424,8 +406,9 @@ class SwiftFileBackend extends FileBackendStore {
try {
$dstObj = new CF_Object( $dContObj, $dstRel, false, false ); // skip HEAD
$hdrs = array(); // source file headers to override with new values
- if ( isset( $params['disposition'] ) ) {
- $hdrs['Content-Disposition'] = $this->truncDisp( $params['disposition'] );
+ // Set any other custom headers if requested
+ if ( isset( $params['headers'] ) ) {
+ $hdrs += $this->sanitizeHdrs( $params['headers'] );
}
if ( !empty( $params['async'] ) ) { // deferred
$op = $sContObj->copy_object_to_async( $srcRel, $dContObj, $dstRel, null, $hdrs );
@@ -459,10 +442,6 @@ class SwiftFileBackend extends FileBackendStore {
}
}
- /**
- * @see FileBackendStore::doMoveInternal()
- * @return Status
- */
protected function doMoveInternal( array $params ) {
$status = Status::newGood();
@@ -497,8 +476,9 @@ class SwiftFileBackend extends FileBackendStore {
$srcObj = new CF_Object( $sContObj, $srcRel, false, false ); // skip HEAD
$dstObj = new CF_Object( $dContObj, $dstRel, false, false ); // skip HEAD
$hdrs = array(); // source file headers to override with new values
- if ( isset( $params['disposition'] ) ) {
- $hdrs['Content-Disposition'] = $this->truncDisp( $params['disposition'] );
+ // Set any other custom headers if requested
+ if ( isset( $params['headers'] ) ) {
+ $hdrs += $this->sanitizeHdrs( $params['headers'] );
}
if ( !empty( $params['async'] ) ) { // deferred
$op = $sContObj->move_object_to_async( $srcRel, $dContObj, $dstRel, null, $hdrs );
@@ -534,10 +514,6 @@ class SwiftFileBackend extends FileBackendStore {
}
}
- /**
- * @see FileBackendStore::doDeleteInternal()
- * @return Status
- */
protected function doDeleteInternal( array $params ) {
$status = Status::newGood();
@@ -590,10 +566,6 @@ class SwiftFileBackend extends FileBackendStore {
}
}
- /**
- * @see FileBackendStore::doDescribeInternal()
- * @return Status
- */
protected function doDescribeInternal( array $params ) {
$status = Status::newGood();
@@ -603,19 +575,15 @@ class SwiftFileBackend extends FileBackendStore {
return $status;
}
- $hdrs = isset( $params['headers'] ) ? $params['headers'] : array();
- // Set the Content-Disposition header if requested
- if ( isset( $params['disposition'] ) ) {
- $hdrs['Content-Disposition'] = $this->truncDisp( $params['disposition'] );
- }
-
try {
$sContObj = $this->getContainer( $srcCont );
// Get the latest version of the current metadata
$srcObj = $sContObj->get_object( $srcRel,
$this->headersFromParams( array( 'latest' => true ) ) );
// Merge in the metadata updates...
- $srcObj->headers = $hdrs + $srcObj->headers;
+ if ( isset( $params['headers'] ) ) {
+ $srcObj->headers = $this->sanitizeHdrs( $params['headers'] ) + $srcObj->headers;
+ }
$srcObj->sync_metadata(); // save to Swift
$this->purgeCDNCache( array( $srcObj ) );
} catch ( CDNNotEnabledException $e ) {
@@ -631,10 +599,6 @@ class SwiftFileBackend extends FileBackendStore {
return $status;
}
- /**
- * @see FileBackendStore::doPrepareInternal()
- * @return Status
- */
protected function doPrepareInternal( $fullCont, $dir, array $params ) {
$status = Status::newGood();
@@ -748,10 +712,6 @@ class SwiftFileBackend extends FileBackendStore {
return $status;
}
- /**
- * @see FileBackendStore::doCleanInternal()
- * @return Status
- */
protected function doCleanInternal( $fullCont, $dir, array $params ) {
$status = Status::newGood();
@@ -787,10 +747,6 @@ class SwiftFileBackend extends FileBackendStore {
return $status;
}
- /**
- * @see FileBackendStore::doFileExists()
- * @return array|bool|null
- */
protected function doGetFileStat( array $params ) {
list( $srcCont, $srcRel ) = $this->resolveStoragePathReal( $params['src'] );
if ( $srcRel === null ) {
@@ -805,8 +761,8 @@ class SwiftFileBackend extends FileBackendStore {
$stat = array(
// Convert dates like "Tue, 03 Jan 2012 22:01:04 GMT" to TS_MW
'mtime' => wfTimestamp( TS_MW, $srcObj->last_modified ),
- 'size' => (int)$srcObj->content_length,
- 'sha1' => $srcObj->getMetadataValue( 'Sha1base36' )
+ 'size' => (int)$srcObj->content_length,
+ 'sha1' => $srcObj->getMetadataValue( 'Sha1base36' )
);
} catch ( NoSuchContainerException $e ) {
} catch ( NoSuchObjectException $e ) {
@@ -821,7 +777,7 @@ class SwiftFileBackend extends FileBackendStore {
/**
* Fill in any missing object metadata and save it to Swift
*
- * @param $obj CF_Object
+ * @param CF_Object $obj
* @param string $path Storage path to object
* @return bool Success
* @throws Exception cloudfiles exceptions
@@ -852,10 +808,6 @@ class SwiftFileBackend extends FileBackendStore {
return false; // failed
}
- /**
- * @see FileBackendStore::doGetFileContentsMulti()
- * @return Array
- */
protected function doGetFileContentsMulti( array $params ) {
$contents = array();
@@ -965,24 +917,25 @@ class SwiftFileBackend extends FileBackendStore {
* @param string $fullCont Resolved container name
* @param string $dir Resolved storage directory with no trailing slash
* @param string|null $after Storage path of file to list items after
- * @param $limit integer Max number of items to list
- * @param array $params Includes flag for 'topOnly'
- * @return Array List of relative paths of dirs directly under $dir
+ * @param integer $limit Max number of items to list
+ * @param array $params Parameters for getDirectoryList()
+ * @return Array List of resolved paths of directories directly under $dir
+ * @throws FileBackendError
*/
public function getDirListPageInternal( $fullCont, $dir, &$after, $limit, array $params ) {
$dirs = array();
if ( $after === INF ) {
return $dirs; // nothing more
}
- wfProfileIn( __METHOD__ . '-' . $this->name );
+ $section = new ProfileSection( __METHOD__ . '-' . $this->name );
try {
$container = $this->getContainer( $fullCont );
$prefix = ( $dir == '' ) ? null : "{$dir}/";
// Non-recursive: only list dirs right under $dir
if ( !empty( $params['topOnly'] ) ) {
$objects = $container->list_objects( $limit, $after, $prefix, null, '/' );
- foreach ( $objects as $object ) { // files and dirs
+ foreach ( $objects as $object ) { // files and directories
if ( substr( $object, -1 ) === '/' ) {
$dirs[] = $object; // directories end in '/'
}
@@ -1013,6 +966,7 @@ class SwiftFileBackend extends FileBackendStore {
}
}
}
+ // Page on the unfiltered directory listing (what is returned may be filtered)
if ( count( $objects ) < $limit ) {
$after = INF; // avoid a second RTT
} else {
@@ -1022,9 +976,9 @@ class SwiftFileBackend extends FileBackendStore {
} catch ( CloudFilesException $e ) { // some other exception?
$this->handleException( $e, null, __METHOD__,
array( 'cont' => $fullCont, 'dir' => $dir ) );
+ throw new FileBackendError( "Got " . get_class( $e ) . " exception." );
}
- wfProfileOut( __METHOD__ . '-' . $this->name );
return $dirs;
}
@@ -1038,33 +992,49 @@ class SwiftFileBackend extends FileBackendStore {
* @param string $fullCont Resolved container name
* @param string $dir Resolved storage directory with no trailing slash
* @param string|null $after Storage path of file to list items after
- * @param $limit integer Max number of items to list
- * @param array $params Includes flag for 'topOnly'
- * @return Array List of relative paths of files under $dir
+ * @param integer $limit Max number of items to list
+ * @param array $params Parameters for getDirectoryList()
+ * @return Array List of resolved paths of files under $dir
+ * @throws FileBackendError
*/
public function getFileListPageInternal( $fullCont, $dir, &$after, $limit, array $params ) {
$files = array();
if ( $after === INF ) {
return $files; // nothing more
}
- wfProfileIn( __METHOD__ . '-' . $this->name );
+ $section = new ProfileSection( __METHOD__ . '-' . $this->name );
try {
$container = $this->getContainer( $fullCont );
$prefix = ( $dir == '' ) ? null : "{$dir}/";
// Non-recursive: only list files right under $dir
if ( !empty( $params['topOnly'] ) ) { // files and dirs
- $objects = $container->list_objects( $limit, $after, $prefix, null, '/' );
- foreach ( $objects as $object ) {
- if ( substr( $object, -1 ) !== '/' ) {
- $files[] = $object; // directories end in '/'
+ if ( !empty( $params['adviseStat'] ) ) {
+ $limit = min( $limit, self::CACHE_CHEAP_SIZE );
+ // Note: get_objects() does not include directories
+ $objects = $this->loadObjectListing( $params, $dir,
+ $container->get_objects( $limit, $after, $prefix, null, '/' ) );
+ $files = $objects;
+ } else {
+ $objects = $container->list_objects( $limit, $after, $prefix, null, '/' );
+ foreach ( $objects as $object ) { // files and directories
+ if ( substr( $object, -1 ) !== '/' ) {
+ $files[] = $object; // directories end in '/'
+ }
}
}
// Recursive: list all files under $dir and its subdirs
} else { // files
- $objects = $container->list_objects( $limit, $after, $prefix );
+ if ( !empty( $params['adviseStat'] ) ) {
+ $limit = min( $limit, self::CACHE_CHEAP_SIZE );
+ $objects = $this->loadObjectListing( $params, $dir,
+ $container->get_objects( $limit, $after, $prefix ) );
+ } else {
+ $objects = $container->list_objects( $limit, $after, $prefix );
+ }
$files = $objects;
}
+ // Page on the unfiltered object listing (what is returned may be filtered)
if ( count( $objects ) < $limit ) {
$after = INF; // avoid a second RTT
} else {
@@ -1074,29 +1044,57 @@ class SwiftFileBackend extends FileBackendStore {
} catch ( CloudFilesException $e ) { // some other exception?
$this->handleException( $e, null, __METHOD__,
array( 'cont' => $fullCont, 'dir' => $dir ) );
+ throw new FileBackendError( "Got " . get_class( $e ) . " exception." );
}
- wfProfileOut( __METHOD__ . '-' . $this->name );
return $files;
}
/**
- * @see FileBackendStore::doGetFileSha1base36()
- * @return bool
+ * Load a list of objects that belong under $dir into stat cache
+ * and return a list of the names of the objects in the same order.
+ *
+ * @param array $params Parameters for getDirectoryList()
+ * @param string $dir Resolved container directory path
+ * @param array $cfObjects List of CF_Object items
+ * @return array List of object names
*/
+ private function loadObjectListing( array $params, $dir, array $cfObjects ) {
+ $names = array();
+ $storageDir = rtrim( $params['dir'], '/' );
+ $suffixStart = ( $dir === '' ) ? 0 : strlen( $dir ) + 1; // size of "path/to/dir/"
+ // Iterate over the list *backwards* as this primes the stat cache, which is LRU.
+ // If this fills the cache and the caller stats an uncached file before stating
+ // the ones on the listing, there would be zero cache hits if this went forwards.
+ for ( end( $cfObjects ); key( $cfObjects ) !== null; prev( $cfObjects ) ) {
+ $object = current( $cfObjects );
+ $path = "{$storageDir}/" . substr( $object->name, $suffixStart );
+ $val = array(
+ // Convert dates like "Tue, 03 Jan 2012 22:01:04 GMT" to TS_MW
+ 'mtime' => wfTimestamp( TS_MW, $object->last_modified ),
+ 'size' => (int)$object->content_length,
+ 'latest' => false // eventually consistent
+ );
+ $this->cheapCache->set( $path, 'stat', $val );
+ $names[] = $object->name;
+ }
+ return array_reverse( $names ); // keep the paths in original order
+ }
+
protected function doGetFileSha1base36( array $params ) {
$stat = $this->getFileStat( $params );
if ( $stat ) {
+ if ( !isset( $stat['sha1'] ) ) {
+ // Stat entries filled by file listings don't include SHA1
+ $this->clearCache( array( $params['src'] ) );
+ $stat = $this->getFileStat( $params );
+ }
return $stat['sha1'];
} else {
return false;
}
}
- /**
- * @see FileBackendStore::doStreamFile()
- * @return Status
- */
protected function doStreamFile( array $params ) {
$status = Status::newGood();
@@ -1128,10 +1126,6 @@ class SwiftFileBackend extends FileBackendStore {
return $status;
}
- /**
- * @see FileBackendStore::doGetLocalCopyMulti()
- * @return null|TempFSFile
- */
protected function doGetLocalCopyMulti( array $params ) {
$tmpFiles = array();
@@ -1201,10 +1195,6 @@ class SwiftFileBackend extends FileBackendStore {
return $tmpFiles;
}
- /**
- * @see FileBackendStore::getFileHttpUrl()
- * @return string|null
- */
public function getFileHttpUrl( array $params ) {
if ( $this->swiftTempUrlKey != '' ||
( $this->rgwS3AccessKey != '' && $this->rgwS3SecretKey != '' ) )
@@ -1237,8 +1227,8 @@ class SwiftFileBackend extends FileBackendStore {
str_replace( '/swift/v1', '', // S3 API is the rgw default
$sContObj->cfs_http->getStorageUrl() . $spath ),
array(
- 'Signature' => $signature,
- 'Expires' => $expires,
+ 'Signature' => $signature,
+ 'Expires' => $expires,
'AWSAccessKeyId' => $this->rgwS3AccessKey )
);
}
@@ -1250,10 +1240,6 @@ class SwiftFileBackend extends FileBackendStore {
return null;
}
- /**
- * @see FileBackendStore::directoriesAreVirtual()
- * @return bool
- */
protected function directoriesAreVirtual() {
return true;
}
@@ -1274,10 +1260,6 @@ class SwiftFileBackend extends FileBackendStore {
return $hdrs;
}
- /**
- * @see FileBackendStore::doExecuteOpHandlesInternal()
- * @return Array List of corresponding Status objects
- */
protected function doExecuteOpHandlesInternal( array $fileOpHandles ) {
$statuses = array();
@@ -1314,7 +1296,7 @@ class SwiftFileBackend extends FileBackendStore {
* matches the expression and the request is not for a listing.
* Setting this to '*' effectively makes a container public.
* -".rlistings:<regex>" : Grants access if the request is from a referrer host that
- * matches the expression and the request for a listing.
+ * matches the expression and the request is for a listing.
*
* $writeGrps is a list of the possible criteria for a request to have
* access to write to a container. Each item is of the following format:
@@ -1325,7 +1307,7 @@ class SwiftFileBackend extends FileBackendStore {
* In general, we don't allow listings to end-users. It's not useful, isn't well-defined
* (lists are truncated to 10000 item with no way to page), and is just a performance risk.
*
- * @param $contObj CF_Container Swift container
+ * @param CF_Container $contObj Swift container
* @param array $readGrps List of read access routes
* @param array $writeGrps List of write access routes
* @return Status
@@ -1395,12 +1377,12 @@ class SwiftFileBackend extends FileBackendStore {
if ( is_array( $creds ) ) { // cache hit
$this->auth->load_cached_credentials(
$creds['auth_token'], $creds['storage_url'], $creds['cdnm_url'] );
- $this->sessionStarted = time() - ceil( $this->authTTL/2 ); // skew for worst case
+ $this->sessionStarted = time() - ceil( $this->authTTL / 2 ); // skew for worst case
} else { // cache miss
try {
$this->auth->authenticate();
$creds = $this->auth->export_credentials();
- $this->srvCache->add( $cacheKey, $creds, ceil( $this->authTTL/2 ) ); // cache
+ $this->srvCache->add( $cacheKey, $creds, ceil( $this->authTTL / 2 ) ); // cache
$this->sessionStarted = time();
} catch ( CloudFilesException $e ) {
$this->connException = $e; // don't keep re-trying
@@ -1433,7 +1415,7 @@ class SwiftFileBackend extends FileBackendStore {
/**
* Get the cache key for a container
*
- * @param $username string
+ * @param string $username
* @return string
*/
private function getCredsCacheKey( $username ) {
@@ -1496,10 +1478,6 @@ class SwiftFileBackend extends FileBackendStore {
$conn->delete_container( $container );
}
- /**
- * @see FileBackendStore::doPrimeContainerCache()
- * @return void
- */
protected function doPrimeContainerCache( array $containerInfo ) {
try {
$conn = $this->getConnection(); // Swift proxy connection
@@ -1517,9 +1495,9 @@ class SwiftFileBackend extends FileBackendStore {
* Log an unexpected exception for this backend.
* This also sets the Status object to have a fatal error.
*
- * @param $e Exception
- * @param $status Status|null
- * @param $func string
+ * @param Exception $e
+ * @param Status $status|null
+ * @param string $func
* @param array $params
* @return void
*/
@@ -1554,7 +1532,15 @@ class SwiftFileOpHandle extends FileBackendStoreOpHandle {
/** @var Array */
public $affectedObjects = array();
- public function __construct( $backend, array $params, $call, CF_Async_Op $cfOp ) {
+ /**
+ * @param SwiftFileBackend $backend
+ * @param array $params
+ * @param string $call
+ * @param CF_Async_Op $cfOp
+ */
+ public function __construct(
+ SwiftFileBackend $backend, array $params, $call, CF_Async_Op $cfOp
+ ) {
$this->backend = $backend;
$this->params = $params;
$this->call = $call;
@@ -1586,7 +1572,7 @@ abstract class SwiftFileBackendList implements Iterator {
const PAGE_SIZE = 9000; // file listing buffer size
/**
- * @param $backend SwiftFileBackend
+ * @param SwiftFileBackend $backend
* @param string $fullCont Resolved container name
* @param string $dir Resolved directory relative to container
* @param array $params
@@ -1660,10 +1646,10 @@ abstract class SwiftFileBackendList implements Iterator {
*
* @param string $container Resolved container name
* @param string $dir Resolved path relative to container
- * @param $after string|null
- * @param $limit integer
+ * @param string $after|null
+ * @param integer $limit
* @param array $params
- * @return Traversable|Array|null Returns null on failure
+ * @return Traversable|Array
*/
abstract protected function pageFromList( $container, $dir, &$after, $limit, array $params );
}
@@ -1682,7 +1668,7 @@ class SwiftFileBackendDirList extends SwiftFileBackendList {
/**
* @see SwiftFileBackendList::pageFromList()
- * @return Array|null
+ * @return Array
*/
protected function pageFromList( $container, $dir, &$after, $limit, array $params ) {
return $this->backend->getDirListPageInternal( $container, $dir, $after, $limit, $params );
@@ -1703,7 +1689,7 @@ class SwiftFileBackendFileList extends SwiftFileBackendList {
/**
* @see SwiftFileBackendList::pageFromList()
- * @return Array|null
+ * @return Array
*/
protected function pageFromList( $container, $dir, &$after, $limit, array $params ) {
return $this->backend->getFileListPageInternal( $container, $dir, $after, $limit, $params );
diff --git a/includes/filebackend/TempFSFile.php b/includes/filebackend/TempFSFile.php
index 11e125c1..8266e420 100644
--- a/includes/filebackend/TempFSFile.php
+++ b/includes/filebackend/TempFSFile.php
@@ -37,8 +37,8 @@ class TempFSFile extends FSFile {
* Make a new temporary file on the file system.
* Temporary files may be purged when the file object falls out of scope.
*
- * @param $prefix string
- * @param $extension string
+ * @param string $prefix
+ * @param string $extension
* @return TempFSFile|null
*/
public static function factory( $prefix, $extension = '' ) {
@@ -81,7 +81,7 @@ class TempFSFile extends FSFile {
/**
* Clean up the temporary file only after an object goes out of scope
*
- * @param $object Object
+ * @param Object $object
* @return TempFSFile This object
*/
public function bind( $object ) {
diff --git a/includes/filebackend/filejournal/DBFileJournal.php b/includes/filebackend/filejournal/DBFileJournal.php
index 73f29a95..9250aa5e 100644
--- a/includes/filebackend/filejournal/DBFileJournal.php
+++ b/includes/filebackend/filejournal/DBFileJournal.php
@@ -65,11 +65,11 @@ class DBFileJournal extends FileJournal {
foreach ( $entries as $entry ) {
$data[] = array(
'fj_batch_uuid' => $batchId,
- 'fj_backend' => $this->backend,
- 'fj_op' => $entry['op'],
- 'fj_path' => $entry['path'],
- 'fj_new_sha1' => $entry['newSha1'],
- 'fj_timestamp' => $dbw->timestamp( $now )
+ 'fj_backend' => $this->backend,
+ 'fj_op' => $entry['op'],
+ 'fj_path' => $entry['path'],
+ 'fj_new_sha1' => $entry['newSha1'],
+ 'fj_timestamp' => $dbw->timestamp( $now )
);
}
diff --git a/includes/filebackend/lockmanager/DBLockManager.php b/includes/filebackend/lockmanager/DBLockManager.php
index f02387dc..3e934ba5 100644
--- a/includes/filebackend/lockmanager/DBLockManager.php
+++ b/includes/filebackend/lockmanager/DBLockManager.php
@@ -110,6 +110,19 @@ abstract class DBLockManager extends QuorumLockManager {
$this->session = wfRandomString( 31 );
}
+ // @TODO: change this code to work in one batch
+ protected function getLocksOnServer( $lockSrv, array $pathsByType ) {
+ $status = Status::newGood();
+ foreach ( $pathsByType as $type => $paths ) {
+ $status->merge( $this->doGetLocksOnServer( $lockSrv, $paths, $type ) );
+ }
+ return $status;
+ }
+
+ protected function freeLocksOnServer( $lockSrv, array $pathsByType ) {
+ return Status::newGood();
+ }
+
/**
* @see QuorumLockManager::isServerUp()
* @return bool
@@ -252,7 +265,7 @@ class MySqlLockManager extends DBLockManager {
* @see DBLockManager::getLocksOnServer()
* @return Status
*/
- protected function getLocksOnServer( $lockSrv, array $paths, $type ) {
+ protected function doGetLocksOnServer( $lockSrv, array $paths, $type ) {
$status = Status::newGood();
$db = $this->getConnection( $lockSrv ); // checked in isServerUp()
@@ -319,14 +332,6 @@ class MySqlLockManager extends DBLockManager {
}
/**
- * @see QuorumLockManager::freeLocksOnServer()
- * @return Status
- */
- protected function freeLocksOnServer( $lockSrv, array $paths, $type ) {
- return Status::newGood(); // not supported
- }
-
- /**
* @see QuorumLockManager::releaseAllLocks()
* @return Status
*/
@@ -361,7 +366,7 @@ class PostgreSqlLockManager extends DBLockManager {
self::LOCK_EX => self::LOCK_EX
);
- protected function getLocksOnServer( $lockSrv, array $paths, $type ) {
+ protected function doGetLocksOnServer( $lockSrv, array $paths, $type ) {
$status = Status::newGood();
if ( !count( $paths ) ) {
return $status; // nothing to lock
@@ -369,7 +374,9 @@ class PostgreSqlLockManager extends DBLockManager {
$db = $this->getConnection( $lockSrv ); // checked in isServerUp()
$bigints = array_unique( array_map(
- function( $key ) { return wfBaseConvert( substr( $key, 0, 15 ), 16, 10 ); },
+ function( $key ) {
+ return wfBaseConvert( substr( $key, 0, 15 ), 16, 10 );
+ },
array_map( array( $this, 'sha1Base16Absolute' ), $paths )
) );
@@ -406,14 +413,6 @@ class PostgreSqlLockManager extends DBLockManager {
}
/**
- * @see QuorumLockManager::freeLocksOnServer()
- * @return Status
- */
- protected function freeLocksOnServer( $lockSrv, array $paths, $type ) {
- return Status::newGood(); // not supported
- }
-
- /**
* @see QuorumLockManager::releaseAllLocks()
* @return Status
*/
diff --git a/includes/filebackend/lockmanager/LockManager.php b/includes/filebackend/lockmanager/LockManager.php
index 0512a01b..dad8a624 100644
--- a/includes/filebackend/lockmanager/LockManager.php
+++ b/includes/filebackend/lockmanager/LockManager.php
@@ -56,7 +56,7 @@ abstract class LockManager {
protected $domain; // string; domain (usually wiki ID)
protected $lockTTL; // integer; maximum time locks can be held
- /* Lock types; stronger locks have higher values */
+ /** Lock types; stronger locks have higher values */
const LOCK_SH = 1; // shared lock (for reads)
const LOCK_UW = 2; // shared lock (for reads used to write elsewhere)
const LOCK_EX = 3; // exclusive lock (for writes)
@@ -76,10 +76,10 @@ abstract class LockManager {
if ( isset( $config['lockTTL'] ) ) {
$this->lockTTL = max( 1, $config['lockTTL'] );
} elseif ( PHP_SAPI === 'cli' ) {
- $this->lockTTL = 2*3600;
+ $this->lockTTL = 2 * 3600;
} else {
$met = ini_get( 'max_execution_time' ); // this is 0 in CLI mode
- $this->lockTTL = max( 5*60, 2*(int)$met );
+ $this->lockTTL = max( 5 * 60, 2 * (int)$met );
}
}
@@ -88,11 +88,36 @@ abstract class LockManager {
*
* @param array $paths List of resource names
* @param $type integer LockManager::LOCK_* constant
+ * @param integer $timeout Timeout in seconds (0 means non-blocking) (since 1.21)
* @return Status
*/
- final public function lock( array $paths, $type = self::LOCK_EX ) {
+ final public function lock( array $paths, $type = self::LOCK_EX, $timeout = 0 ) {
+ return $this->lockByType( array( $type => $paths ), $timeout );
+ }
+
+ /**
+ * Lock the resources at the given abstract paths
+ *
+ * @param array $pathsByType Map of LockManager::LOCK_* constants to lists of paths
+ * @param integer $timeout Timeout in seconds (0 means non-blocking) (since 1.21)
+ * @return Status
+ * @since 1.22
+ */
+ final public function lockByType( array $pathsByType, $timeout = 0 ) {
wfProfileIn( __METHOD__ );
- $status = $this->doLock( array_unique( $paths ), $this->lockTypeMap[$type] );
+ $status = Status::newGood();
+ $pathsByType = $this->normalizePathsByType( $pathsByType );
+ $msleep = array( 0, 50, 100, 300, 500 ); // retry backoff times
+ $start = microtime( true );
+ do {
+ $status = $this->doLockByType( $pathsByType );
+ $elapsed = microtime( true ) - $start;
+ if ( $status->isOK() || $elapsed >= $timeout || $elapsed < 0 ) {
+ break; // success, timeout, or clock set back
+ }
+ usleep( 1e3 * ( next( $msleep ) ?: 1000 ) ); // use 1 sec after enough times
+ $elapsed = microtime( true ) - $start;
+ } while ( $elapsed < $timeout && $elapsed >= 0 );
wfProfileOut( __METHOD__ );
return $status;
}
@@ -100,13 +125,25 @@ abstract class LockManager {
/**
* Unlock the resources at the given abstract paths
*
- * @param array $paths List of storage paths
+ * @param array $paths List of paths
* @param $type integer LockManager::LOCK_* constant
* @return Status
*/
final public function unlock( array $paths, $type = self::LOCK_EX ) {
+ return $this->unlockByType( array( $type => $paths ) );
+ }
+
+ /**
+ * Unlock the resources at the given abstract paths
+ *
+ * @param array $pathsByType Map of LockManager::LOCK_* constants to lists of paths
+ * @return Status
+ * @since 1.22
+ */
+ final public function unlockByType( array $pathsByType ) {
wfProfileIn( __METHOD__ );
- $status = $this->doUnlock( array_unique( $paths ), $this->lockTypeMap[$type] );
+ $pathsByType = $this->normalizePathsByType( $pathsByType );
+ $status = $this->doUnlockByType( $pathsByType );
wfProfileOut( __METHOD__ );
return $status;
}
@@ -136,20 +173,74 @@ abstract class LockManager {
}
/**
+ * Normalize the $paths array by converting LOCK_UW locks into the
+ * appropriate type and removing any duplicated paths for each lock type.
+ *
+ * @param array $paths Map of LockManager::LOCK_* constants to lists of paths
+ * @return Array
+ * @since 1.22
+ */
+ final protected function normalizePathsByType( array $pathsByType ) {
+ $res = array();
+ foreach ( $pathsByType as $type => $paths ) {
+ $res[$this->lockTypeMap[$type]] = array_unique( $paths );
+ }
+ return $res;
+ }
+
+ /**
+ * @see LockManager::lockByType()
+ * @param array $paths Map of LockManager::LOCK_* constants to lists of paths
+ * @return Status
+ * @since 1.22
+ */
+ protected function doLockByType( array $pathsByType ) {
+ $status = Status::newGood();
+ $lockedByType = array(); // map of (type => paths)
+ foreach ( $pathsByType as $type => $paths ) {
+ $status->merge( $this->doLock( $paths, $type ) );
+ if ( $status->isOK() ) {
+ $lockedByType[$type] = $paths;
+ } else {
+ // Release the subset of locks that were acquired
+ foreach ( $lockedByType as $type => $paths ) {
+ $status->merge( $this->doUnlock( $paths, $type ) );
+ }
+ break;
+ }
+ }
+ return $status;
+ }
+
+ /**
* Lock resources with the given keys and lock type
*
- * @param array $paths List of storage paths
+ * @param array $paths List of paths
* @param $type integer LockManager::LOCK_* constant
- * @return string
+ * @return Status
*/
abstract protected function doLock( array $paths, $type );
/**
+ * @see LockManager::unlockByType()
+ * @param array $paths Map of LockManager::LOCK_* constants to lists of paths
+ * @return Status
+ * @since 1.22
+ */
+ protected function doUnlockByType( array $pathsByType ) {
+ $status = Status::newGood();
+ foreach ( $pathsByType as $type => $paths ) {
+ $status->merge( $this->doUnlock( $paths, $type ) );
+ }
+ return $status;
+ }
+
+ /**
* Unlock resources with the given keys and lock type
*
- * @param array $paths List of storage paths
+ * @param array $paths List of paths
* @param $type integer LockManager::LOCK_* constant
- * @return string
+ * @return Status
*/
abstract protected function doUnlock( array $paths, $type );
}
@@ -159,22 +250,10 @@ abstract class LockManager {
* @since 1.19
*/
class NullLockManager extends LockManager {
- /**
- * @see LockManager::doLock()
- * @param $paths array
- * @param $type int
- * @return Status
- */
protected function doLock( array $paths, $type ) {
return Status::newGood();
}
- /**
- * @see LockManager::doUnlock()
- * @param $paths array
- * @param $type int
- * @return Status
- */
protected function doUnlock( array $paths, $type ) {
return Status::newGood();
}
diff --git a/includes/filebackend/lockmanager/LockManagerGroup.php b/includes/filebackend/lockmanager/LockManagerGroup.php
index ac0bd49b..9aff2415 100644
--- a/includes/filebackend/lockmanager/LockManagerGroup.php
+++ b/includes/filebackend/lockmanager/LockManagerGroup.php
@@ -97,8 +97,8 @@ class LockManagerGroup {
$class = $config['class'];
unset( $config['class'] ); // lock manager won't need this
$this->managers[$name] = array(
- 'class' => $class,
- 'config' => $config,
+ 'class' => $class,
+ 'config' => $config,
'instance' => null
);
}
diff --git a/includes/filebackend/lockmanager/MemcLockManager.php b/includes/filebackend/lockmanager/MemcLockManager.php
index fafc588a..5eab03ee 100644
--- a/includes/filebackend/lockmanager/MemcLockManager.php
+++ b/includes/filebackend/lockmanager/MemcLockManager.php
@@ -88,11 +88,44 @@ class MemcLockManager extends QuorumLockManager {
$this->session = wfRandomString( 32 );
}
+ // @TODO: change this code to work in one batch
+ protected function getLocksOnServer( $lockSrv, array $pathsByType ) {
+ $status = Status::newGood();
+
+ $lockedPaths = array();
+ foreach ( $pathsByType as $type => $paths ) {
+ $status->merge( $this->doGetLocksOnServer( $lockSrv, $paths, $type ) );
+ if ( $status->isOK() ) {
+ $lockedPaths[$type] = isset( $lockedPaths[$type] )
+ ? array_merge( $lockedPaths[$type], $paths )
+ : $paths;
+ } else {
+ foreach ( $lockedPaths as $type => $paths ) {
+ $status->merge( $this->doFreeLocksOnServer( $lockSrv, $paths, $type ) );
+ }
+ break;
+ }
+ }
+
+ return $status;
+ }
+
+ // @TODO: change this code to work in one batch
+ protected function freeLocksOnServer( $lockSrv, array $pathsByType ) {
+ $status = Status::newGood();
+
+ foreach ( $pathsByType as $type => $paths ) {
+ $status->merge( $this->doFreeLocksOnServer( $lockSrv, $paths, $type ) );
+ }
+
+ return $status;
+ }
+
/**
* @see QuorumLockManager::getLocksOnServer()
* @return Status
*/
- protected function getLocksOnServer( $lockSrv, array $paths, $type ) {
+ protected function doGetLocksOnServer( $lockSrv, array $paths, $type ) {
$status = Status::newGood();
$memc = $this->getCache( $lockSrv );
@@ -145,7 +178,7 @@ class MemcLockManager extends QuorumLockManager {
foreach ( $paths as $path ) {
$locksKey = $this->recordKeyForPath( $path );
$locksHeld = $lockRecords[$locksKey];
- $ok = $memc->set( $locksKey, $locksHeld, 7*86400 );
+ $ok = $memc->set( $locksKey, $locksHeld, 7 * 86400 );
if ( !$ok ) {
$status->fatal( 'lockmanager-fail-acquirelock', $path );
} else {
@@ -164,7 +197,7 @@ class MemcLockManager extends QuorumLockManager {
* @see QuorumLockManager::freeLocksOnServer()
* @return Status
*/
- protected function freeLocksOnServer( $lockSrv, array $paths, $type ) {
+ protected function doFreeLocksOnServer( $lockSrv, array $paths, $type ) {
$status = Status::newGood();
$memc = $this->getCache( $lockSrv );
@@ -297,7 +330,7 @@ class MemcLockManager extends QuorumLockManager {
$start = microtime( true );
do {
if ( ( ++$rounds % 4 ) == 0 ) {
- usleep( 1000*50 ); // 50 ms
+ usleep( 1000 * 50 ); // 50 ms
}
foreach ( array_diff( $keys, $lockedKeys ) as $key ) {
if ( $memc->add( "$key:mutex", 1, 180 ) ) { // lock record
diff --git a/includes/filebackend/lockmanager/QuorumLockManager.php b/includes/filebackend/lockmanager/QuorumLockManager.php
index b331b540..8356d32a 100644
--- a/includes/filebackend/lockmanager/QuorumLockManager.php
+++ b/includes/filebackend/lockmanager/QuorumLockManager.php
@@ -31,81 +31,86 @@
abstract class QuorumLockManager extends LockManager {
/** @var Array Map of bucket indexes to peer server lists */
protected $srvsByBucket = array(); // (bucket index => (lsrv1, lsrv2, ...))
+ /** @var Array Map of degraded buckets */
+ protected $degradedBuckets = array(); // (buckey index => UNIX timestamp)
- /**
- * @see LockManager::doLock()
- * @param $paths array
- * @param $type int
- * @return Status
- */
final protected function doLock( array $paths, $type ) {
+ return $this->doLockByType( array( $type => $paths ) );
+ }
+
+ final protected function doUnlock( array $paths, $type ) {
+ return $this->doUnlockByType( array( $type => $paths ) );
+ }
+
+ protected function doLockByType( array $pathsByType ) {
$status = Status::newGood();
- $pathsToLock = array(); // (bucket => paths)
+ $pathsToLock = array(); // (bucket => type => paths)
// Get locks that need to be acquired (buckets => locks)...
- foreach ( $paths as $path ) {
- if ( isset( $this->locksHeld[$path][$type] ) ) {
- ++$this->locksHeld[$path][$type];
- } else {
- $bucket = $this->getBucketFromPath( $path );
- $pathsToLock[$bucket][] = $path;
+ foreach ( $pathsByType as $type => $paths ) {
+ foreach ( $paths as $path ) {
+ if ( isset( $this->locksHeld[$path][$type] ) ) {
+ ++$this->locksHeld[$path][$type];
+ } else {
+ $bucket = $this->getBucketFromPath( $path );
+ $pathsToLock[$bucket][$type][] = $path;
+ }
}
}
- $lockedPaths = array(); // files locked in this attempt
+ $lockedPaths = array(); // files locked in this attempt (type => paths)
// Attempt to acquire these locks...
- foreach ( $pathsToLock as $bucket => $paths ) {
+ foreach ( $pathsToLock as $bucket => $pathsToLockByType ) {
// Try to acquire the locks for this bucket
- $status->merge( $this->doLockingRequestBucket( $bucket, $paths, $type ) );
+ $status->merge( $this->doLockingRequestBucket( $bucket, $pathsToLockByType ) );
if ( !$status->isOK() ) {
- $status->merge( $this->doUnlock( $lockedPaths, $type ) );
+ $status->merge( $this->doUnlockByType( $lockedPaths ) );
return $status;
}
// Record these locks as active
- foreach ( $paths as $path ) {
- $this->locksHeld[$path][$type] = 1; // locked
+ foreach ( $pathsToLockByType as $type => $paths ) {
+ foreach ( $paths as $path ) {
+ $this->locksHeld[$path][$type] = 1; // locked
+ // Keep track of what locks were made in this attempt
+ $lockedPaths[$type][] = $path;
+ }
}
- // Keep track of what locks were made in this attempt
- $lockedPaths = array_merge( $lockedPaths, $paths );
}
return $status;
}
- /**
- * @see LockManager::doUnlock()
- * @param $paths array
- * @param $type int
- * @return Status
- */
- final protected function doUnlock( array $paths, $type ) {
+ protected function doUnlockByType( array $pathsByType ) {
$status = Status::newGood();
- $pathsToUnlock = array();
- foreach ( $paths as $path ) {
- if ( !isset( $this->locksHeld[$path][$type] ) ) {
- $status->warning( 'lockmanager-notlocked', $path );
- } else {
- --$this->locksHeld[$path][$type];
- // Reference count the locks held and release locks when zero
- if ( $this->locksHeld[$path][$type] <= 0 ) {
- unset( $this->locksHeld[$path][$type] );
- $bucket = $this->getBucketFromPath( $path );
- $pathsToUnlock[$bucket][] = $path;
- }
- if ( !count( $this->locksHeld[$path] ) ) {
- unset( $this->locksHeld[$path] ); // no SH or EX locks left for key
+ $pathsToUnlock = array(); // (bucket => type => paths)
+ foreach ( $pathsByType as $type => $paths ) {
+ foreach ( $paths as $path ) {
+ if ( !isset( $this->locksHeld[$path][$type] ) ) {
+ $status->warning( 'lockmanager-notlocked', $path );
+ } else {
+ --$this->locksHeld[$path][$type];
+ // Reference count the locks held and release locks when zero
+ if ( $this->locksHeld[$path][$type] <= 0 ) {
+ unset( $this->locksHeld[$path][$type] );
+ $bucket = $this->getBucketFromPath( $path );
+ $pathsToUnlock[$bucket][$type][] = $path;
+ }
+ if ( !count( $this->locksHeld[$path] ) ) {
+ unset( $this->locksHeld[$path] ); // no SH or EX locks left for key
+ }
}
}
}
// Remove these specific locks if possible, or at least release
// all locks once this process is currently not holding any locks.
- foreach ( $pathsToUnlock as $bucket => $paths ) {
- $status->merge( $this->doUnlockingRequestBucket( $bucket, $paths, $type ) );
+ foreach ( $pathsToUnlock as $bucket => $pathsToUnlockByType ) {
+ $status->merge( $this->doUnlockingRequestBucket( $bucket, $pathsToUnlockByType ) );
}
if ( !count( $this->locksHeld ) ) {
$status->merge( $this->releaseAllLocks() );
+ $this->degradedBuckets = array(); // safe to retry the normal quorum
}
return $status;
@@ -116,25 +121,25 @@ abstract class QuorumLockManager extends LockManager {
* This is all or nothing; if any key is locked then this totally fails.
*
* @param $bucket integer
- * @param array $paths List of resource keys to lock
- * @param $type integer LockManager::LOCK_EX or LockManager::LOCK_SH
+ * @param array $pathsByType Map of LockManager::LOCK_* constants to lists of paths
* @return Status
*/
- final protected function doLockingRequestBucket( $bucket, array $paths, $type ) {
+ final protected function doLockingRequestBucket( $bucket, array $pathsByType ) {
$status = Status::newGood();
$yesVotes = 0; // locks made on trustable servers
$votesLeft = count( $this->srvsByBucket[$bucket] ); // remaining peers
- $quorum = floor( $votesLeft/2 + 1 ); // simple majority
+ $quorum = floor( $votesLeft / 2 + 1 ); // simple majority
// Get votes for each peer, in order, until we have enough...
foreach ( $this->srvsByBucket[$bucket] as $lockSrv ) {
if ( !$this->isServerUp( $lockSrv ) ) {
--$votesLeft;
$status->warning( 'lockmanager-fail-svr-acquire', $lockSrv );
+ $this->degradedBuckets[$bucket] = time();
continue; // server down?
}
// Attempt to acquire the lock on this peer
- $status->merge( $this->getLocksOnServer( $lockSrv, $paths, $type ) );
+ $status->merge( $this->getLocksOnServer( $lockSrv, $pathsByType ) );
if ( !$status->isOK() ) {
return $status; // vetoed; resource locked
}
@@ -158,21 +163,33 @@ abstract class QuorumLockManager extends LockManager {
* Attempt to release locks with the peers for a bucket
*
* @param $bucket integer
- * @param array $paths List of resource keys to lock
- * @param $type integer LockManager::LOCK_EX or LockManager::LOCK_SH
+ * @param array $pathsByType Map of LockManager::LOCK_* constants to lists of paths
* @return Status
*/
- final protected function doUnlockingRequestBucket( $bucket, array $paths, $type ) {
+ final protected function doUnlockingRequestBucket( $bucket, array $pathsByType ) {
$status = Status::newGood();
+ $yesVotes = 0; // locks freed on trustable servers
+ $votesLeft = count( $this->srvsByBucket[$bucket] ); // remaining peers
+ $quorum = floor( $votesLeft / 2 + 1 ); // simple majority
+ $isDegraded = isset( $this->degradedBuckets[$bucket] ); // not the normal quorum?
foreach ( $this->srvsByBucket[$bucket] as $lockSrv ) {
if ( !$this->isServerUp( $lockSrv ) ) {
- $status->fatal( 'lockmanager-fail-svr-release', $lockSrv );
+ $status->warning( 'lockmanager-fail-svr-release', $lockSrv );
// Attempt to release the lock on this peer
} else {
- $status->merge( $this->freeLocksOnServer( $lockSrv, $paths, $type ) );
+ $status->merge( $this->freeLocksOnServer( $lockSrv, $pathsByType ) );
+ ++$yesVotes; // success for this peer
+ // Normally the first peers form the quorum, and the others are ignored.
+ // Ignore them in this case, but not when an alternative quorum was used.
+ if ( $yesVotes >= $quorum && !$isDegraded ) {
+ break; // lock released
+ }
}
}
+ // Set a bad status if the quorum was not met.
+ // Assumes the same "up" servers as during the acquire step.
+ $status->setResult( $yesVotes >= $quorum );
return $status;
}
@@ -190,7 +207,8 @@ abstract class QuorumLockManager extends LockManager {
}
/**
- * Check if a lock server is up
+ * Check if a lock server is up.
+ * This should process cache results to reduce RTT.
*
* @param $lockSrv string
* @return bool
@@ -198,14 +216,13 @@ abstract class QuorumLockManager extends LockManager {
abstract protected function isServerUp( $lockSrv );
/**
- * Get a connection to a lock server and acquire locks on $paths
+ * Get a connection to a lock server and acquire locks
*
* @param $lockSrv string
- * @param $paths array
- * @param $type integer
+ * @param array $pathsByType Map of LockManager::LOCK_* constants to lists of paths
* @return Status
*/
- abstract protected function getLocksOnServer( $lockSrv, array $paths, $type );
+ abstract protected function getLocksOnServer( $lockSrv, array $pathsByType );
/**
* Get a connection to a lock server and release locks on $paths.
@@ -213,11 +230,10 @@ abstract class QuorumLockManager extends LockManager {
* Subclasses must effectively implement this or releaseAllLocks().
*
* @param $lockSrv string
- * @param $paths array
- * @param $type integer
+ * @param array $pathsByType Map of LockManager::LOCK_* constants to lists of paths
* @return Status
*/
- abstract protected function freeLocksOnServer( $lockSrv, array $paths, $type );
+ abstract protected function freeLocksOnServer( $lockSrv, array $pathsByType );
/**
* Release all locks that this session is holding.
diff --git a/includes/filebackend/lockmanager/RedisLockManager.php b/includes/filebackend/lockmanager/RedisLockManager.php
new file mode 100644
index 00000000..43b0198a
--- /dev/null
+++ b/includes/filebackend/lockmanager/RedisLockManager.php
@@ -0,0 +1,288 @@
+<?php
+/**
+ * Version of LockManager based on using redis servers.
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with this program; if not, write to the Free Software Foundation, Inc.,
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ * http://www.gnu.org/copyleft/gpl.html
+ *
+ * @file
+ * @ingroup LockManager
+ */
+
+/**
+ * Manage locks using redis servers.
+ *
+ * Version of LockManager based on using redis servers.
+ * This is meant for multi-wiki systems that may share files.
+ * All locks are non-blocking, which avoids deadlocks.
+ *
+ * All lock requests for a resource, identified by a hash string, will map to one
+ * bucket. Each bucket maps to one or several peer servers, each running redis.
+ * A majority of peers must agree for a lock to be acquired.
+ *
+ * This class requires Redis 2.6 as it makes use Lua scripts for fast atomic operations.
+ *
+ * @ingroup LockManager
+ * @since 1.22
+ */
+class RedisLockManager extends QuorumLockManager {
+ /** @var Array Mapping of lock types to the type actually used */
+ protected $lockTypeMap = array(
+ self::LOCK_SH => self::LOCK_SH,
+ self::LOCK_UW => self::LOCK_SH,
+ self::LOCK_EX => self::LOCK_EX
+ );
+
+ /** @var RedisConnectionPool */
+ protected $redisPool;
+ /** @var Array Map server names to hostname/IP and port numbers */
+ protected $lockServers = array();
+
+ protected $session = ''; // string; random UUID
+
+ /**
+ * Construct a new instance from configuration.
+ *
+ * $config paramaters include:
+ * - lockServers : Associative array of server names to "<IP>:<port>" strings.
+ * - srvsByBucket : Array of 1-16 consecutive integer keys, starting from 0,
+ * each having an odd-numbered list of server names (peers) as values.
+ * - redisConfig : Configuration for RedisConnectionPool::__construct().
+ *
+ * @param Array $config
+ * @throws MWException
+ */
+ public function __construct( array $config ) {
+ parent::__construct( $config );
+
+ $this->lockServers = $config['lockServers'];
+ // Sanitize srvsByBucket config to prevent PHP errors
+ $this->srvsByBucket = array_filter( $config['srvsByBucket'], 'is_array' );
+ $this->srvsByBucket = array_values( $this->srvsByBucket ); // consecutive
+
+ $config['redisConfig']['serializer'] = 'none';
+ $this->redisPool = RedisConnectionPool::singleton( $config['redisConfig'] );
+
+ $this->session = wfRandomString( 32 );
+ }
+
+ // @TODO: change this code to work in one batch
+ protected function getLocksOnServer( $lockSrv, array $pathsByType ) {
+ $status = Status::newGood();
+
+ $lockedPaths = array();
+ foreach ( $pathsByType as $type => $paths ) {
+ $status->merge( $this->doGetLocksOnServer( $lockSrv, $paths, $type ) );
+ if ( $status->isOK() ) {
+ $lockedPaths[$type] = isset( $lockedPaths[$type] )
+ ? array_merge( $lockedPaths[$type], $paths )
+ : $paths;
+ } else {
+ foreach ( $lockedPaths as $type => $paths ) {
+ $status->merge( $this->doFreeLocksOnServer( $lockSrv, $paths, $type ) );
+ }
+ break;
+ }
+ }
+
+ return $status;
+ }
+
+ // @TODO: change this code to work in one batch
+ protected function freeLocksOnServer( $lockSrv, array $pathsByType ) {
+ $status = Status::newGood();
+
+ foreach ( $pathsByType as $type => $paths ) {
+ $status->merge( $this->doFreeLocksOnServer( $lockSrv, $paths, $type ) );
+ }
+
+ return $status;
+ }
+
+ protected function doGetLocksOnServer( $lockSrv, array $paths, $type ) {
+ $status = Status::newGood();
+
+ $server = $this->lockServers[$lockSrv];
+ $conn = $this->redisPool->getConnection( $server );
+ if ( !$conn ) {
+ foreach ( $paths as $path ) {
+ $status->fatal( 'lockmanager-fail-acquirelock', $path );
+ }
+ return $status;
+ }
+
+ $keys = array_map( array( $this, 'recordKeyForPath' ), $paths ); // lock records
+
+ try {
+ static $script =
+<<<LUA
+ if ARGV[1] ~= 'EX' and ARGV[1] ~= 'SH' then
+ return redis.error_reply('Unrecognized lock type given (must be EX or SH)')
+ end
+ local failed = {}
+ -- Check that all the locks can be acquired
+ for i,resourceKey in ipairs(KEYS) do
+ local keyIsFree = true
+ local currentLocks = redis.call('hKeys',resourceKey)
+ for i,lockKey in ipairs(currentLocks) do
+ local _, _, type, session = string.find(lockKey,"(%w+):(%w+)")
+ -- Check any locks that are not owned by this session
+ if session ~= ARGV[2] then
+ local lockTimestamp = redis.call('hGet',resourceKey,lockKey)
+ if 1*lockTimestamp < ( ARGV[4] - ARGV[3] ) then
+ -- Lock is stale, so just prune it out
+ redis.call('hDel',resourceKey,lockKey)
+ elseif ARGV[1] == 'EX' or type == 'EX' then
+ keyIsFree = false
+ break
+ end
+ end
+ end
+ if not keyIsFree then
+ failed[#failed+1] = resourceKey
+ end
+ end
+ -- If all locks could be acquired, then do so
+ if #failed == 0 then
+ for i,resourceKey in ipairs(KEYS) do
+ redis.call('hSet',resourceKey,ARGV[1] .. ':' .. ARGV[2],ARGV[4])
+ -- In addition to invalidation logic, be sure to garbage collect
+ redis.call('expire',resourceKey,ARGV[3])
+ end
+ end
+ return failed
+LUA;
+ $res = $conn->luaEval( $script,
+ array_merge(
+ $keys, // KEYS[0], KEYS[1],...KEYS[N]
+ array(
+ $type === self::LOCK_SH ? 'SH' : 'EX', // ARGV[1]
+ $this->session, // ARGV[2]
+ $this->lockTTL, // ARGV[3]
+ time() // ARGV[4]
+ )
+ ),
+ count( $keys ) # number of first argument(s) that are keys
+ );
+ } catch ( RedisException $e ) {
+ $res = false;
+ $this->redisPool->handleException( $server, $conn, $e );
+ }
+
+ if ( $res === false ) {
+ foreach ( $paths as $path ) {
+ $status->fatal( 'lockmanager-fail-acquirelock', $path );
+ }
+ } else {
+ $pathsByKey = array_combine( $keys, $paths );
+ foreach ( $res as $key ) {
+ $status->fatal( 'lockmanager-fail-acquirelock', $pathsByKey[$key] );
+ }
+ }
+
+ return $status;
+ }
+
+ protected function doFreeLocksOnServer( $lockSrv, array $paths, $type ) {
+ $status = Status::newGood();
+
+ $server = $this->lockServers[$lockSrv];
+ $conn = $this->redisPool->getConnection( $server );
+ if ( !$conn ) {
+ foreach ( $paths as $path ) {
+ $status->fatal( 'lockmanager-fail-releaselock', $path );
+ }
+ return $status;
+ }
+
+ $keys = array_map( array( $this, 'recordKeyForPath' ), $paths ); // lock records
+
+ try {
+ static $script =
+<<<LUA
+ if ARGV[1] ~= 'EX' and ARGV[1] ~= 'SH' then
+ return redis.error_reply('Unrecognized lock type given (must be EX or SH)')
+ end
+ local failed = {}
+ for i,resourceKey in ipairs(KEYS) do
+ local released = redis.call('hDel',resourceKey,ARGV[1] .. ':' .. ARGV[2])
+ if released > 0 then
+ -- Remove the whole structure if it is now empty
+ if redis.call('hLen',resourceKey) == 0 then
+ redis.call('del',resourceKey)
+ end
+ else
+ failed[#failed+1] = resourceKey
+ end
+ end
+ return failed
+LUA;
+ $res = $conn->luaEval( $script,
+ array_merge(
+ $keys, // KEYS[0], KEYS[1],...KEYS[N]
+ array(
+ $type === self::LOCK_SH ? 'SH' : 'EX', // ARGV[1]
+ $this->session // ARGV[2]
+ )
+ ),
+ count( $keys ) # number of first argument(s) that are keys
+ );
+ } catch ( RedisException $e ) {
+ $res = false;
+ $this->redisPool->handleException( $server, $conn, $e );
+ }
+
+ if ( $res === false ) {
+ foreach ( $paths as $path ) {
+ $status->fatal( 'lockmanager-fail-releaselock', $path );
+ }
+ } else {
+ $pathsByKey = array_combine( $keys, $paths );
+ foreach ( $res as $key ) {
+ $status->fatal( 'lockmanager-fail-releaselock', $pathsByKey[$key] );
+ }
+ }
+
+ return $status;
+ }
+
+ protected function releaseAllLocks() {
+ return Status::newGood(); // not supported
+ }
+
+ protected function isServerUp( $lockSrv ) {
+ return (bool)$this->redisPool->getConnection( $this->lockServers[$lockSrv] );
+ }
+
+ /**
+ * @param $path string
+ * @return string
+ */
+ protected function recordKeyForPath( $path ) {
+ return implode( ':', array( __CLASS__, 'locks', $this->sha1Base36Absolute( $path ) ) );
+ }
+
+ /**
+ * Make sure remaining locks get cleared for sanity
+ */
+ function __destruct() {
+ while ( count( $this->locksHeld ) ) {
+ foreach ( $this->locksHeld as $path => $locks ) {
+ $this->doUnlock( array( $path ), self::LOCK_EX );
+ $this->doUnlock( array( $path ), self::LOCK_SH );
+ }
+ }
+ }
+}
diff --git a/includes/filebackend/lockmanager/ScopedLock.php b/includes/filebackend/lockmanager/ScopedLock.php
index edcb1d65..5faad4a6 100644
--- a/includes/filebackend/lockmanager/ScopedLock.php
+++ b/includes/filebackend/lockmanager/ScopedLock.php
@@ -36,24 +36,18 @@ class ScopedLock {
protected $manager;
/** @var Status */
protected $status;
- /** @var Array List of resource paths*/
- protected $paths;
-
- protected $type; // integer lock type
+ /** @var Array Map of lock types to resource paths */
+ protected $pathsByType;
/**
- * @param $manager LockManager
- * @param array $paths List of storage paths
- * @param $type integer LockManager::LOCK_* constant
- * @param $status Status
+ * @param LockManager $manager
+ * @param array $pathsByType Map of lock types to path lists
+ * @param Status $status
*/
- protected function __construct(
- LockManager $manager, array $paths, $type, Status $status
- ) {
+ protected function __construct( LockManager $manager, array $pathsByType, Status $status ) {
$this->manager = $manager;
- $this->paths = $paths;
+ $this->pathsByType = $pathsByType;
$this->status = $status;
- $this->type = $type;
}
/**
@@ -61,19 +55,24 @@ class ScopedLock {
* Any locks are released once this object goes out of scope.
* The status object is updated with any errors or warnings.
*
- * @param $manager LockManager
- * @param array $paths List of storage paths
- * @param $type integer LockManager::LOCK_* constant
- * @param $status Status
+ * $type can be "mixed" and $paths can be a map of types to paths (since 1.22).
+ * Otherwise $type should be an integer and $paths should be a list of paths.
+ *
+ * @param LockManager $manager
+ * @param array $paths List of storage paths or map of lock types to path lists
+ * @param integer|string $type LockManager::LOCK_* constant or "mixed"
+ * @param Status $status
+ * @param integer $timeout Timeout in seconds (0 means non-blocking) (since 1.22)
* @return ScopedLock|null Returns null on failure
*/
public static function factory(
- LockManager $manager, array $paths, $type, Status $status
+ LockManager $manager, array $paths, $type, Status $status, $timeout = 0
) {
- $lockStatus = $manager->lock( $paths, $type );
+ $pathsByType = is_integer( $type ) ? array( $type => $paths ) : $paths;
+ $lockStatus = $manager->lockByType( $pathsByType, $timeout );
$status->merge( $lockStatus );
if ( $lockStatus->isOK() ) {
- return new self( $manager, $paths, $type, $status );
+ return new self( $manager, $pathsByType, $status );
}
return null;
}
@@ -91,9 +90,12 @@ class ScopedLock {
$lock = null;
}
+ /**
+ * Release the locks when this goes out of scope
+ */
function __destruct() {
$wasOk = $this->status->isOK();
- $this->status->merge( $this->manager->unlock( $this->paths, $this->type ) );
+ $this->status->merge( $this->manager->unlockByType( $this->pathsByType ) );
if ( $wasOk ) {
// Make sure status is OK, despite any unlockFiles() fatals
$this->status->setResult( true, $this->status->value );
diff --git a/includes/filerepo/FSRepo.php b/includes/filerepo/FSRepo.php
index e49f37d2..42c9c945 100644
--- a/includes/filerepo/FSRepo.php
+++ b/includes/filerepo/FSRepo.php
@@ -56,16 +56,16 @@ class FSRepo extends FileRepo {
$repoName = $info['name'];
// Get the FS backend configuration
$backend = new FSFileBackend( array(
- 'name' => $info['name'] . '-backend',
- 'lockManager' => 'fsLockManager',
+ 'name' => $info['name'] . '-backend',
+ 'lockManager' => 'fsLockManager',
'containerPaths' => array(
- "{$repoName}-public" => "{$directory}",
- "{$repoName}-temp" => "{$directory}/temp",
- "{$repoName}-thumb" => $thumbDir,
- "{$repoName}-transcoded" => $transcodedDir,
+ "{$repoName}-public" => "{$directory}",
+ "{$repoName}-temp" => "{$directory}/temp",
+ "{$repoName}-thumb" => $thumbDir,
+ "{$repoName}-transcoded" => $transcodedDir,
"{$repoName}-deleted" => $deletedDir
),
- 'fileMode' => $fileMode,
+ 'fileMode' => $fileMode,
) );
// Update repo config to use this backend
$info['backend'] = $backend;
diff --git a/includes/filerepo/FileRepo.php b/includes/filerepo/FileRepo.php
index 366dd8a5..1195d5f8 100644
--- a/includes/filerepo/FileRepo.php
+++ b/includes/filerepo/FileRepo.php
@@ -67,7 +67,7 @@ class FileRepo {
*/
public function __construct( array $info = null ) {
// Verify required settings presence
- if(
+ if (
$info === null
|| !array_key_exists( 'name', $info )
|| !array_key_exists( 'backend', $info )
@@ -259,19 +259,19 @@ class FileRepo {
*/
public function resolveVirtualUrl( $url ) {
if ( substr( $url, 0, 9 ) != 'mwrepo://' ) {
- throw new MWException( __METHOD__.': unknown protocol' );
+ throw new MWException( __METHOD__ . ': unknown protocol' );
}
$bits = explode( '/', substr( $url, 9 ), 3 );
if ( count( $bits ) != 3 ) {
- throw new MWException( __METHOD__.": invalid mwrepo URL: $url" );
+ throw new MWException( __METHOD__ . ": invalid mwrepo URL: $url" );
}
list( $repo, $zone, $rel ) = $bits;
if ( $repo !== $this->name ) {
- throw new MWException( __METHOD__.": fetching from a foreign repo is not supported" );
+ throw new MWException( __METHOD__ . ": fetching from a foreign repo is not supported" );
}
$base = $this->getZonePath( $zone );
if ( !$base ) {
- throw new MWException( __METHOD__.": invalid zone: $zone" );
+ throw new MWException( __METHOD__ . ": invalid zone: $zone" );
}
return $base . '/' . rawurldecode( $rel );
}
@@ -383,7 +383,7 @@ class FileRepo {
return false;
}
$redir = $this->checkRedirect( $title );
- if ( $redir && $title->getNamespace() == NS_FILE) {
+ if ( $redir && $title->getNamespace() == NS_FILE ) {
$img = $this->newFile( $redir );
if ( !$img ) {
return false;
@@ -794,10 +794,10 @@ class FileRepo {
}
}
$operations[] = array(
- 'op' => $opName,
- 'src' => $srcPath,
- 'dst' => $dstPath,
- 'overwrite' => $flags & self::OVERWRITE,
+ 'op' => $opName,
+ 'src' => $srcPath,
+ 'dst' => $dstPath,
+ 'overwrite' => $flags & self::OVERWRITE,
'overwriteSame' => $flags & self::OVERWRITE_SAME,
);
}
@@ -917,9 +917,9 @@ class FileRepo {
$src = $this->resolveToStoragePath( $src );
$dst = $this->resolveToStoragePath( $dst );
$operations[] = array(
- 'op' => FileBackend::isStoragePath( $src ) ? 'copy' : 'store',
- 'src' => $src,
- 'dst' => $dst,
+ 'op' => FileBackend::isStoragePath( $src ) ? 'copy' : 'store',
+ 'src' => $src,
+ 'dst' => $dst,
'disposition' => isset( $triple[2] ) ? $triple[2] : null
);
$status->merge( $this->initDirectory( dirname( $dst ) ) );
@@ -942,8 +942,8 @@ class FileRepo {
$operations = array();
foreach ( $paths as $path ) {
$operations[] = array(
- 'op' => 'delete',
- 'src' => $this->resolveToStoragePath( $path ),
+ 'op' => 'delete',
+ 'src' => $this->resolveToStoragePath( $path ),
'ignoreMissingSource' => true
);
}
@@ -965,7 +965,7 @@ class FileRepo {
public function storeTemp( $originalName, $srcPath ) {
$this->assertWritableRepo(); // fail out if read-only
- $date = gmdate( "YmdHis" );
+ $date = MWTimestamp::getInstance()->format( 'YmdHis' );
$hashPath = $this->getHashPath( $originalName );
$dstUrlRel = $hashPath . $date . '!' . rawurlencode( $originalName );
$virtualUrl = $this->getVirtualUrl( 'temp' ) . '/' . $dstUrlRel;
@@ -987,7 +987,7 @@ class FileRepo {
$temp = $this->getVirtualUrl( 'temp' );
if ( substr( $virtualUrl, 0, strlen( $temp ) ) != $temp ) {
- wfDebug( __METHOD__.": Invalid temp virtual URL\n" );
+ wfDebug( __METHOD__ . ": Invalid temp virtual URL\n" );
return false;
}
@@ -1132,9 +1132,9 @@ class FileRepo {
// race conditions unless an functioning LockManager is used.
// LocalFile also uses SELECT FOR UPDATE for synchronization.
$operations[] = array(
- 'op' => 'copy',
- 'src' => $dstPath,
- 'dst' => $archivePath,
+ 'op' => 'copy',
+ 'src' => $dstPath,
+ 'dst' => $archivePath,
'ignoreMissingSource' => true
);
@@ -1142,28 +1142,28 @@ class FileRepo {
if ( FileBackend::isStoragePath( $srcPath ) ) {
if ( $flags & self::DELETE_SOURCE ) {
$operations[] = array(
- 'op' => 'move',
- 'src' => $srcPath,
- 'dst' => $dstPath,
+ 'op' => 'move',
+ 'src' => $srcPath,
+ 'dst' => $dstPath,
'overwrite' => true, // replace current
- 'headers' => $headers
+ 'headers' => $headers
);
} else {
$operations[] = array(
- 'op' => 'copy',
- 'src' => $srcPath,
- 'dst' => $dstPath,
+ 'op' => 'copy',
+ 'src' => $srcPath,
+ 'dst' => $dstPath,
'overwrite' => true, // replace current
- 'headers' => $headers
+ 'headers' => $headers
);
}
} else { // FS source path
$operations[] = array(
- 'op' => 'store',
- 'src' => $srcPath,
- 'dst' => $dstPath,
+ 'op' => 'store',
+ 'src' => $srcPath,
+ 'dst' => $dstPath,
'overwrite' => true, // replace current
- 'headers' => $headers
+ 'headers' => $headers
);
if ( $flags & self::DELETE_SOURCE ) {
$sourceFSFilesToDelete[] = $srcPath;
@@ -1306,9 +1306,9 @@ class FileRepo {
foreach ( $sourceDestPairs as $pair ) {
list( $srcRel, $archiveRel ) = $pair;
if ( !$this->validateFilename( $srcRel ) ) {
- throw new MWException( __METHOD__.':Validation error in $srcRel' );
+ throw new MWException( __METHOD__ . ':Validation error in $srcRel' );
} elseif ( !$this->validateFilename( $archiveRel ) ) {
- throw new MWException( __METHOD__.':Validation error in $archiveRel' );
+ throw new MWException( __METHOD__ . ':Validation error in $archiveRel' );
}
$publicRoot = $this->getZonePath( 'public' );
@@ -1324,9 +1324,9 @@ class FileRepo {
}
$operations[] = array(
- 'op' => 'move',
- 'src' => $srcPath,
- 'dst' => $archivePath,
+ 'op' => 'move',
+ 'src' => $srcPath,
+ 'dst' => $archivePath,
// We may have 2+ identical files being deleted,
// all of which will map to the same destination file
'overwriteSame' => true // also see bug 31792
@@ -1564,7 +1564,7 @@ class FileRepo {
public function newFatal( $message /*, parameters...*/ ) {
$params = func_get_args();
array_unshift( $params, $this );
- return MWInit::callStaticMethod( 'FileRepoStatus', 'newFatal', $params );
+ return call_user_func_array( array( 'FileRepoStatus', 'newFatal' ), $params );
}
/**
@@ -1671,29 +1671,29 @@ class FileRepo {
*/
public function getTempRepo() {
return new TempFileRepo( array(
- 'name' => "{$this->name}-temp",
- 'backend' => $this->backend,
- 'zones' => array(
+ 'name' => "{$this->name}-temp",
+ 'backend' => $this->backend,
+ 'zones' => array(
'public' => array(
'container' => $this->zones['temp']['container'],
'directory' => $this->zones['temp']['directory']
),
- 'thumb' => array(
+ 'thumb' => array(
'container' => $this->zones['thumb']['container'],
'directory' => ( $this->zones['thumb']['directory'] == '' )
? 'temp'
: $this->zones['thumb']['directory'] . '/temp'
),
- 'transcoded' => array(
+ 'transcoded' => array(
'container' => $this->zones['transcoded']['container'],
'directory' => ( $this->zones['transcoded']['directory'] == '' )
? 'temp'
: $this->zones['transcoded']['directory'] . '/temp'
)
),
- 'url' => $this->getZoneUrl( 'temp' ),
- 'thumbUrl' => $this->getZoneUrl( 'thumb' ) . '/temp',
- 'transcodedUrl' => $this->getZoneUrl( 'transcoded' ) . '/temp',
+ 'url' => $this->getZoneUrl( 'temp' ),
+ 'thumbUrl' => $this->getZoneUrl( 'thumb' ) . '/temp',
+ 'transcodedUrl' => $this->getZoneUrl( 'transcoded' ) . '/temp',
'hashLevels' => $this->hashLevels // performance
) );
}
@@ -1716,6 +1716,22 @@ class FileRepo {
* @throws MWException
*/
protected function assertWritableRepo() {}
+
+
+ /**
+ * Return information about the repository.
+ *
+ * @return array
+ * @since 1.22
+ */
+ public function getInfo() {
+ return array(
+ 'name' => $this->getName(),
+ 'displayname' => $this->getDisplayName(),
+ 'rootUrl' => $this->getRootUrl(),
+ 'local' => $this->isLocal(),
+ );
+ }
}
/**
diff --git a/includes/filerepo/ForeignAPIRepo.php b/includes/filerepo/ForeignAPIRepo.php
index ba574da1..5eec9a50 100644
--- a/includes/filerepo/ForeignAPIRepo.php
+++ b/includes/filerepo/ForeignAPIRepo.php
@@ -61,26 +61,34 @@ class ForeignAPIRepo extends FileRepo {
// http://commons.wikimedia.org/w/api.php
$this->mApiBase = isset( $info['apibase'] ) ? $info['apibase'] : null;
- if( isset( $info['apiThumbCacheExpiry'] ) ) {
+ if ( isset( $info['apiThumbCacheExpiry'] ) ) {
$this->apiThumbCacheExpiry = $info['apiThumbCacheExpiry'];
}
- if( isset( $info['fileCacheExpiry'] ) ) {
+ if ( isset( $info['fileCacheExpiry'] ) ) {
$this->fileCacheExpiry = $info['fileCacheExpiry'];
}
- if( !$this->scriptDirUrl ) {
+ if ( !$this->scriptDirUrl ) {
// hack for description fetches
$this->scriptDirUrl = dirname( $this->mApiBase );
}
// If we can cache thumbs we can guess sane defaults for these
- if( $this->canCacheThumbs() && !$this->url ) {
+ if ( $this->canCacheThumbs() && !$this->url ) {
$this->url = $wgLocalFileRepo['url'];
}
- if( $this->canCacheThumbs() && !$this->thumbUrl ) {
+ if ( $this->canCacheThumbs() && !$this->thumbUrl ) {
$this->thumbUrl = $this->url . '/thumb';
}
}
/**
+ * @return string
+ * @since 1.22
+ */
+ function getApiUrl() {
+ return $this->mApiBase;
+ }
+
+ /**
* Per docs in FileRepo, this needs to return false if we don't support versioned
* files. Well, we don't.
*
@@ -102,10 +110,10 @@ class ForeignAPIRepo extends FileRepo {
function fileExistsBatch( array $files ) {
$results = array();
foreach ( $files as $k => $f ) {
- if ( isset( $this->mFileExists[$k] ) ) {
- $results[$k] = true;
+ if ( isset( $this->mFileExists[$f] ) ) {
+ $results[$k] = $this->mFileExists[$f];
unset( $files[$k] );
- } elseif( self::isVirtualUrl( $f ) ) {
+ } elseif ( self::isVirtualUrl( $f ) ) {
# @todo FIXME: We need to be able to handle virtual
# URLs better, at least when we know they refer to the
# same repo.
@@ -120,11 +128,27 @@ class ForeignAPIRepo extends FileRepo {
$data = $this->fetchImageQuery( array( 'titles' => implode( $files, '|' ),
'prop' => 'imageinfo' ) );
- if( isset( $data['query']['pages'] ) ) {
- $i = 0;
- foreach( $files as $key => $file ) {
- $results[$key] = $this->mFileExists[$key] = !isset( $data['query']['pages'][$i]['missing'] );
- $i++;
+ if ( isset( $data['query']['pages'] ) ) {
+ # First, get results from the query. Note we only care whether the image exists,
+ # not whether it has a description page.
+ foreach ( $data['query']['pages'] as $p ) {
+ $this->mFileExists[$p['title']] = ( $p['imagerepository'] !== '' );
+ }
+ # Second, copy the results to any redirects that were queried
+ if ( isset( $data['query']['redirects'] ) ) {
+ foreach ( $data['query']['redirects'] as $r ) {
+ $this->mFileExists[$r['from']] = $this->mFileExists[$r['to']];
+ }
+ }
+ # Third, copy the results to any non-normalized titles that were queried
+ if ( isset( $data['query']['normalized'] ) ) {
+ foreach ( $data['query']['normalized'] as $n ) {
+ $this->mFileExists[$n['from']] = $this->mFileExists[$n['to']];
+ }
+ }
+ # Finally, copy the results to the output
+ foreach ( $files as $key => $file ) {
+ $results[$key] = $this->mFileExists[$file];
}
}
return $results;
@@ -143,38 +167,26 @@ class ForeignAPIRepo extends FileRepo {
* @return string
*/
function fetchImageQuery( $query ) {
- global $wgMemc;
+ global $wgMemc, $wgLanguageCode;
$query = array_merge( $query,
array(
- 'format' => 'json',
- 'action' => 'query',
+ 'format' => 'json',
+ 'action' => 'query',
'redirects' => 'true'
) );
- if ( $this->mApiBase ) {
- $url = wfAppendQuery( $this->mApiBase, $query );
- } else {
- $url = $this->makeUrl( $query, 'api' );
+
+ if ( !isset( $query['uselang'] ) ) { // uselang is unset or null
+ $query['uselang'] = $wgLanguageCode;
}
- if( !isset( $this->mQueryCache[$url] ) ) {
- $key = $this->getLocalCacheKey( 'ForeignAPIRepo', 'Metadata', md5( $url ) );
- $data = $wgMemc->get( $key );
- if( !$data ) {
- $data = self::httpGet( $url );
- if ( !$data ) {
- return null;
- }
- $wgMemc->set( $key, $data, 3600 );
- }
+ $data = $this->httpGetCached( 'Metadata', $query );
- if( count( $this->mQueryCache ) > 100 ) {
- // Keep the cache from growing infinitely
- $this->mQueryCache = array();
- }
- $this->mQueryCache[$url] = $data;
+ if ( $data ) {
+ return FormatJson::decode( $data, true );
+ } else {
+ return null;
}
- return FormatJson::decode( $this->mQueryCache[$url], true );
}
/**
@@ -182,9 +194,9 @@ class ForeignAPIRepo extends FileRepo {
* @return bool|array
*/
function getImageInfo( $data ) {
- if( $data && isset( $data['query']['pages'] ) ) {
- foreach( $data['query']['pages'] as $info ) {
- if( isset( $info['imageinfo'][0] ) ) {
+ if ( $data && isset( $data['query']['pages'] ) ) {
+ foreach ( $data['query']['pages'] as $info ) {
+ if ( isset( $info['imageinfo'][0] ) ) {
return $info['imageinfo'][0];
}
}
@@ -198,14 +210,15 @@ class ForeignAPIRepo extends FileRepo {
*/
function findBySha1( $hash ) {
$results = $this->fetchImageQuery( array(
- 'aisha1base36' => $hash,
- 'aiprop' => ForeignAPIFile::getProps(),
- 'list' => 'allimages', ) );
+ 'aisha1base36' => $hash,
+ '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'] ) ) {
+ if ( !isset( $img['name'] ) ) {
continue;
}
$ret[] = new ForeignAPIFile( Title::makeTitle( NS_FILE, $img['name'] ), $this, $img );
@@ -228,11 +241,11 @@ class ForeignAPIRepo extends FileRepo {
'iiprop' => 'url|timestamp',
'iiurlwidth' => $width,
'iiurlheight' => $height,
- 'iiurlparam' => $otherParams,
+ 'iiurlparam' => $otherParams,
'prop' => 'imageinfo' ) );
$info = $this->getImageInfo( $data );
- if( $data && $info && isset( $info['thumburl'] ) ) {
+ if ( $data && $info && isset( $info['thumburl'] ) ) {
wfDebug( __METHOD__ . " got remote thumb " . $info['thumburl'] . "\n" );
$result = $info;
return $info['thumburl'];
@@ -242,6 +255,40 @@ class ForeignAPIRepo extends FileRepo {
}
/**
+ * @param $name string
+ * @param $width int
+ * @param $height int
+ * @param $otherParams string
+ * @return bool|MediaTransformError
+ * @since 1.22
+ */
+ function getThumbError( $name, $width = -1, $height = -1, $otherParams = '', $lang = null ) {
+ $data = $this->fetchImageQuery( array(
+ 'titles' => 'File:' . $name,
+ 'iiprop' => 'url|timestamp',
+ 'iiurlwidth' => $width,
+ 'iiurlheight' => $height,
+ 'iiurlparam' => $otherParams,
+ 'prop' => 'imageinfo',
+ 'uselang' => $lang,
+ ) );
+ $info = $this->getImageInfo( $data );
+
+ if ( $data && $info && isset( $info['thumberror'] ) ) {
+ wfDebug( __METHOD__ . " got remote thumb error " . $info['thumberror'] . "\n" );
+ return new MediaTransformError(
+ 'thumbnail_error_remote',
+ $width,
+ $height,
+ $this->getDisplayName(),
+ $info['thumberror'] // already parsed message from foreign repo
+ );
+ } else {
+ return false;
+ }
+ }
+
+ /**
* Return the imageurl from cache if possible
*
* If the url has been requested today, get it from cache
@@ -268,11 +315,11 @@ class ForeignAPIRepo extends FileRepo {
/* Get the array of urls that we already know */
$knownThumbUrls = $wgMemc->get( $key );
- if( !$knownThumbUrls ) {
+ if ( !$knownThumbUrls ) {
/* No knownThumbUrls for this file */
$knownThumbUrls = array();
} else {
- if( isset( $knownThumbUrls[$sizekey] ) ) {
+ if ( isset( $knownThumbUrls[$sizekey] ) ) {
wfDebug( __METHOD__ . ': Got thumburl from local cache: ' .
"{$knownThumbUrls[$sizekey]} \n" );
return $knownThumbUrls[$sizekey];
@@ -283,14 +330,14 @@ class ForeignAPIRepo extends FileRepo {
$metadata = null;
$foreignUrl = $this->getThumbUrl( $name, $width, $height, $metadata, $params );
- if( !$foreignUrl ) {
+ 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 ) ) {
+ if ( !$this->validateFilename( $fileName ) ) {
wfDebug( __METHOD__ . " The deduced filename $fileName is not safe\n" );
return false;
}
@@ -298,15 +345,14 @@ class ForeignAPIRepo extends FileRepo {
$localFilename = $localPath . "/" . $fileName;
$localUrl = $this->getZoneUrl( 'thumb' ) . "/" . $this->getHashPath( $name ) . rawurlencode( $name ) . "/" . rawurlencode( $fileName );
- if( $backend->fileExists( array( 'src' => $localFilename ) )
- && isset( $metadata['timestamp'] ) )
- {
+ if ( $backend->fileExists( array( 'src' => $localFilename ) )
+ && isset( $metadata['timestamp'] ) ) {
wfDebug( __METHOD__ . " Thumbnail was already downloaded before\n" );
$modified = $backend->getFileTimestamp( array( 'src' => $localFilename ) );
$remoteModified = strtotime( $metadata['timestamp'] );
$current = time();
$diff = abs( $modified - $current );
- if( $remoteModified < $modified && $diff < $this->fileCacheExpiry ) {
+ if ( $remoteModified < $modified && $diff < $this->fileCacheExpiry ) {
/* Use our current and already downloaded thumbnail */
$knownThumbUrls[$sizekey] = $localUrl;
$wgMemc->set( $key, $knownThumbUrls, $this->apiThumbCacheExpiry );
@@ -315,7 +361,7 @@ class ForeignAPIRepo extends FileRepo {
/* There is a new Commons file, or existing thumbnail older than a month */
}
$thumb = self::httpGet( $foreignUrl );
- if( !$thumb ) {
+ if ( !$thumb ) {
wfDebug( __METHOD__ . " Could not download thumb\n" );
return false;
}
@@ -323,7 +369,7 @@ class ForeignAPIRepo extends FileRepo {
# @todo FIXME: Delete old thumbs that aren't being used. Maintenance script?
$backend->prepare( array( 'dir' => dirname( $localFilename ) ) );
$params = array( 'dst' => $localFilename, 'content' => $thumb );
- if( !$backend->quickCreate( $params )->isOK() ) {
+ if ( !$backend->quickCreate( $params )->isOK() ) {
wfDebug( __METHOD__ . " could not write to thumb path '$localFilename'\n" );
return $foreignUrl;
}
@@ -380,6 +426,36 @@ class ForeignAPIRepo extends FileRepo {
}
/**
+ * Get information about the repo - overrides/extends the parent
+ * class's information.
+ * @return array
+ * @since 1.22
+ */
+ function getInfo() {
+ $info = parent::getInfo();
+ $info['apiurl'] = $this->getApiUrl();
+
+ $query = array(
+ 'format' => 'json',
+ 'action' => 'query',
+ 'meta' => 'siteinfo',
+ 'siprop' => 'general',
+ );
+
+ $data = $this->httpGetCached( 'SiteInfo', $query, 7200 );
+
+ if ( $data ) {
+ $siteInfo = FormatJson::decode( $data, true );
+ $general = $siteInfo['query']['general'];
+
+ $info['articlepath'] = $general['articlepath'];
+ $info['server'] = $general['server'];
+ }
+
+ return $info;
+ }
+
+ /**
* Like a Http:get request, but with custom User-Agent.
* @see Http:get
* @param $url string
@@ -410,6 +486,46 @@ class ForeignAPIRepo extends FileRepo {
}
/**
+ * HTTP GET request to a mediawiki API (with caching)
+ * @param $target string Used in cache key creation, mostly
+ * @param $query array The query parameters for the API request
+ * @param $cacheTTL int Time to live for the memcached caching
+ */
+ public function httpGetCached( $target, $query, $cacheTTL = 3600 ) {
+ if ( $this->mApiBase ) {
+ $url = wfAppendQuery( $this->mApiBase, $query );
+ } else {
+ $url = $this->makeUrl( $query, 'api' );
+ }
+
+ if ( !isset( $this->mQueryCache[$url] ) ) {
+ global $wgMemc;
+
+ $key = $this->getLocalCacheKey( get_class( $this ), $target, md5( $url ) );
+ $data = $wgMemc->get( $key );
+
+ if ( !$data ) {
+ $data = self::httpGet( $url );
+
+ if ( !$data ) {
+ return null;
+ }
+
+ $wgMemc->set( $key, $data, $cacheTTL );
+ }
+
+ if ( count( $this->mQueryCache ) > 100 ) {
+ // Keep the cache from growing infinitely
+ $this->mQueryCache = array();
+ }
+
+ $this->mQueryCache[$url] = $data;
+ }
+
+ return $this->mQueryCache[$url];
+ }
+
+ /**
* @param $callback Array|string
* @throws MWException
*/
diff --git a/includes/filerepo/ForeignDBRepo.php b/includes/filerepo/ForeignDBRepo.php
index 18659852..37c65723 100644
--- a/includes/filerepo/ForeignDBRepo.php
+++ b/includes/filerepo/ForeignDBRepo.php
@@ -59,11 +59,12 @@ class ForeignDBRepo extends LocalRepo {
$this->dbConn = DatabaseBase::factory( $this->dbType,
array(
'host' => $this->dbServer,
- 'user' => $this->dbUser,
+ 'user' => $this->dbUser,
'password' => $this->dbPassword,
'dbname' => $this->dbName,
'flags' => $this->dbFlags,
- 'tablePrefix' => $this->tablePrefix
+ 'tablePrefix' => $this->tablePrefix,
+ 'foreign' => true,
)
);
}
diff --git a/includes/filerepo/LocalRepo.php b/includes/filerepo/LocalRepo.php
index be11b233..9b62243b 100644
--- a/includes/filerepo/LocalRepo.php
+++ b/includes/filerepo/LocalRepo.php
@@ -47,7 +47,7 @@ class LocalRepo extends FileRepo {
} elseif ( isset( $row->oi_name ) ) {
return call_user_func( $this->oldFileFromRowFactory, $row, $this );
} else {
- throw new MWException( __METHOD__.': invalid row' );
+ throw new MWException( __METHOD__ . ': invalid row' );
}
}
@@ -171,13 +171,13 @@ class LocalRepo extends FileRepo {
if ( $cachedValue === ' ' || $cachedValue === '' ) {
// Does not exist
return false;
- } elseif ( strval( $cachedValue ) !== '' ) {
+ } elseif ( strval( $cachedValue ) !== '' && $cachedValue !== ' PURGED' ) {
return Title::newFromText( $cachedValue, NS_FILE );
} // else $cachedValue is false or null: cache miss
$id = $this->getArticleID( $title );
- if( !$id ) {
- $wgMemc->set( $memcKey, " ", $expiry );
+ if ( !$id ) {
+ $wgMemc->add( $memcKey, " ", $expiry );
return false;
}
$dbr = $this->getSlaveDB();
@@ -188,12 +188,12 @@ class LocalRepo extends FileRepo {
__METHOD__
);
- if( $row && $row->rd_namespace == NS_FILE ) {
+ if ( $row && $row->rd_namespace == NS_FILE ) {
$targetTitle = Title::makeTitle( $row->rd_namespace, $row->rd_title );
- $wgMemc->set( $memcKey, $targetTitle->getDBkey(), $expiry );
+ $wgMemc->add( $memcKey, $targetTitle->getDBkey(), $expiry );
return $targetTitle;
} else {
- $wgMemc->set( $memcKey, '', $expiry );
+ $wgMemc->add( $memcKey, '', $expiry );
return false;
}
}
@@ -206,7 +206,7 @@ class LocalRepo extends FileRepo {
* @return bool|int|mixed
*/
protected function getArticleID( $title ) {
- if( !$title instanceof Title ) {
+ if ( !$title instanceof Title ) {
return 0;
}
$dbr = $this->getSlaveDB();
@@ -258,7 +258,7 @@ class LocalRepo extends FileRepo {
* @return array An Array of arrays or iterators of file objects and the hash as key
*/
function findBySha1s( array $hashes ) {
- if( !count( $hashes ) ) {
+ if ( !count( $hashes ) ) {
return array(); //empty parameter
}
@@ -281,17 +281,17 @@ class LocalRepo extends FileRepo {
return $result;
}
- /**
- * Return an array of files where the name starts with $prefix.
- *
- * @param string $prefix The prefix to search for
- * @param int $limit The maximum amount of files to return
- * @return array
- */
+ /**
+ * Return an array of files where the name starts with $prefix.
+ *
+ * @param string $prefix The prefix to search for
+ * @param int $limit The maximum amount of files to return
+ * @return array
+ */
public function findFilesByPrefix( $prefix, $limit ) {
$selectOptions = array( 'ORDER BY' => 'img_name', 'LIMIT' => intval( $limit ) );
- // Query database
+ // Query database
$dbr = $this->getSlaveDB();
$res = $dbr->select(
'image',
@@ -306,7 +306,7 @@ class LocalRepo extends FileRepo {
foreach ( $res as $row ) {
$files[] = $this->newFileFromRow( $row );
}
- return $files;
+ return $files;
}
/**
@@ -347,7 +347,11 @@ class LocalRepo extends FileRepo {
global $wgMemc;
$memcKey = $this->getSharedCacheKey( 'image_redirect', md5( $title->getDBkey() ) );
if ( $memcKey ) {
- $wgMemc->delete( $memcKey );
+ // Set a temporary value for the cache key, to ensure
+ // that this value stays purged long enough so that
+ // it isn't refreshed with a stale value due to a
+ // lagged slave.
+ $wgMemc->set( $memcKey, ' PURGED', 12 );
}
}
}
diff --git a/includes/filerepo/RepoGroup.php b/includes/filerepo/RepoGroup.php
index 02dfdad6..b2b9477a 100644
--- a/includes/filerepo/RepoGroup.php
+++ b/includes/filerepo/RepoGroup.php
@@ -209,7 +209,7 @@ class RepoGroup {
}
$redir = $this->localRepo->checkRedirect( $title );
- if( $redir ) {
+ if ( $redir ) {
return $redir;
}
foreach ( $this->foreignRepos as $repo ) {
@@ -238,7 +238,9 @@ class RepoGroup {
if ( !$file ) {
foreach ( $this->foreignRepos as $repo ) {
$file = $repo->findFileFromKey( $hash, $options );
- if ( $file ) break;
+ if ( $file ) {
+ break;
+ }
}
}
return $file;
@@ -279,7 +281,7 @@ class RepoGroup {
$result = array_merge_recursive( $result, $repo->findBySha1s( $hashes ) );
}
//sort the merged (and presorted) sublist of each hash
- foreach( $result as $hash => $files ) {
+ foreach ( $result as $hash => $files ) {
usort( $result[$hash], 'File::compare' );
}
return $result;
@@ -339,9 +341,9 @@ class RepoGroup {
* @return bool
*/
function forEachForeignRepo( $callback, $params = array() ) {
- foreach( $this->foreignRepos as $repo ) {
+ foreach ( $this->foreignRepos as $repo ) {
$args = array_merge( array( $repo ), $params );
- if( call_user_func_array( $callback, $args ) ) {
+ if ( call_user_func_array( $callback, $args ) ) {
return true;
}
}
diff --git a/includes/filerepo/file/ArchivedFile.php b/includes/filerepo/file/ArchivedFile.php
index 3f786197..749f11a5 100644
--- a/includes/filerepo/file/ArchivedFile.php
+++ b/includes/filerepo/file/ArchivedFile.php
@@ -90,7 +90,7 @@ class ArchivedFile {
$this->exists = false;
$this->sha1 = '';
- if( $title instanceof Title ) {
+ if ( $title instanceof Title ) {
$this->title = File::normalizeTitle( $title, 'exception' );
$this->name = $title->getDBkey();
}
@@ -119,22 +119,22 @@ class ArchivedFile {
}
$conds = array();
- if( $this->id > 0 ) {
+ if ( $this->id > 0 ) {
$conds['fa_id'] = $this->id;
}
- if( $this->key ) {
+ if ( $this->key ) {
$conds['fa_storage_group'] = $this->group;
$conds['fa_storage_key'] = $this->key;
}
- if( $this->title ) {
+ if ( $this->title ) {
$conds['fa_name'] = $this->title->getDBkey();
}
- if( !count( $conds ) ) {
+ if ( !count( $conds ) ) {
throw new MWException( "No specific information for retrieving archived file" );
}
- if( !$this->title || $this->title->getNamespace() == NS_FILE ) {
+ if ( !$this->title || $this->title->getNamespace() == NS_FILE ) {
$this->dataLoaded = true; // set it here, to have also true on miss
$dbr = wfGetDB( DB_SLAVE );
$row = $dbr->selectRow(
@@ -196,6 +196,7 @@ class ArchivedFile {
'fa_user_text',
'fa_timestamp',
'fa_deleted',
+ 'fa_deleted_timestamp', /* Used by LocalFileRestoreBatch */
'fa_sha1',
);
}
@@ -224,7 +225,7 @@ class ArchivedFile {
$this->user_text = $row->fa_user_text;
$this->timestamp = $row->fa_timestamp;
$this->deleted = $row->fa_deleted;
- if( isset( $row->fa_sha1 ) ) {
+ if ( isset( $row->fa_sha1 ) ) {
$this->sha1 = $row->fa_sha1;
} else {
// old row, populate from key
@@ -409,7 +410,7 @@ class ArchivedFile {
*/
public function getUser() {
$this->load();
- if( $this->isDeleted( File::DELETED_USER ) ) {
+ if ( $this->isDeleted( File::DELETED_USER ) ) {
return 0;
} else {
return $this->user;
@@ -423,7 +424,7 @@ class ArchivedFile {
*/
public function getUserText() {
$this->load();
- if( $this->isDeleted( File::DELETED_USER ) ) {
+ if ( $this->isDeleted( File::DELETED_USER ) ) {
return 0;
} else {
return $this->user_text;
@@ -437,7 +438,7 @@ class ArchivedFile {
*/
public function getDescription() {
$this->load();
- if( $this->isDeleted( File::DELETED_COMMENT ) ) {
+ if ( $this->isDeleted( File::DELETED_COMMENT ) ) {
return 0;
} else {
return $this->description;
@@ -491,7 +492,7 @@ class ArchivedFile {
*/
public function isDeleted( $field ) {
$this->load();
- return ($this->deleted & $field) == $field;
+ return ( $this->deleted & $field ) == $field;
}
/**
diff --git a/includes/filerepo/file/File.php b/includes/filerepo/file/File.php
index cecd0aee..ec5f927b 100644
--- a/includes/filerepo/file/File.php
+++ b/includes/filerepo/file/File.php
@@ -48,6 +48,7 @@
* @ingroup FileAbstraction
*/
abstract class File {
+ // Bitfield values akin to the Revision deletion constants
const DELETED_FILE = 1;
const DELETED_COMMENT = 2;
const DELETED_USER = 4;
@@ -201,9 +202,9 @@ abstract class File {
'mpeg' => 'mpg',
'tiff' => 'tif',
'ogv' => 'ogg' );
- if( isset( $squish[$lower] ) ) {
+ if ( isset( $squish[$lower] ) ) {
return $squish[$lower];
- } elseif( preg_match( '/^[0-9a-z]+$/', $lower ) ) {
+ } elseif ( preg_match( '/^[0-9a-z]+$/', $lower ) ) {
return $lower;
} else {
return '';
@@ -241,7 +242,7 @@ abstract class File {
* @return array ("text", "html") etc
*/
public static function splitMime( $mime ) {
- if( strpos( $mime, '/' ) !== false ) {
+ if ( strpos( $mime, '/' ) !== false ) {
return explode( '/', $mime, 2 );
} else {
return array( $mime, 'unknown' );
@@ -518,7 +519,7 @@ abstract class File {
* @param $version integer version number.
* @return Array containing metadata, or what was passed to it on fail (unserializing if not array)
*/
- public function convertMetadataVersion($metadata, $version) {
+ public function convertMetadataVersion( $metadata, $version ) {
$handler = $this->getHandler();
if ( !is_array( $metadata ) ) {
// Just to make the return type consistent
@@ -681,7 +682,7 @@ abstract class File {
if ( $mime === "unknown/unknown" ) {
return false; #unknown type, not trusted
}
- if ( in_array( $mime, $wgTrustedMediaFormats) ) {
+ if ( in_array( $mime, $wgTrustedMediaFormats ) ) {
return true;
}
@@ -737,7 +738,7 @@ abstract class File {
if ( $this->repo ) {
$script = $this->repo->getThumbScriptUrl();
if ( $script ) {
- $this->transformScript = "$script?f=" . urlencode( $this->getName() );
+ $this->transformScript = wfAppendQuery( $script, array( 'f' => $this->getName() ) );
}
}
}
@@ -841,8 +842,9 @@ abstract class File {
protected function transformErrorOutput( $thumbPath, $thumbUrl, $params, $flags ) {
global $wgIgnoreImageErrors;
- if ( $wgIgnoreImageErrors && !( $flags & self::RENDER_NOW ) ) {
- return $this->getHandler()->getTransform( $this, $thumbPath, $thumbUrl, $params );
+ $handler = $this->getHandler();
+ if ( $handler && $wgIgnoreImageErrors && !( $flags & self::RENDER_NOW ) ) {
+ return $handler->getTransform( $this, $thumbPath, $thumbUrl, $params );
} else {
return new MediaTransformError( 'thumbnail_error',
$params['width'], 0, wfMessage( 'thumbnail-dest-create' )->text() );
@@ -910,8 +912,7 @@ abstract class File {
// XXX: Pass in the storage path even though we are not rendering anything
// and the path is supposed to be an FS path. This is due to getScalerType()
// getting called on the path and clobbering $thumb->getUrl() if it's false.
- $thumb = $handler->getTransform(
- $this, $thumbPath, $thumbUrl, $params );
+ $thumb = $handler->getTransform( $this, $thumbPath, $thumbUrl, $params );
$thumb->setStoragePath( $thumbPath );
break;
}
@@ -1000,7 +1001,7 @@ abstract class File {
/**
* Get a MediaHandler instance for this file
*
- * @return MediaHandler
+ * @return MediaHandler|boolean Registered MediaHandler for file's mime type or false if none found
*/
function getHandler() {
if ( !isset( $this->handler ) ) {
@@ -1097,7 +1098,7 @@ abstract class File {
*
* @return array
*/
- function getHistory( $limit = null, $start = null, $end = null, $inc=true ) {
+ function getHistory( $limit = null, $start = null, $end = null, $inc = true ) {
return array();
}
@@ -1500,7 +1501,7 @@ abstract class File {
* Is this file a "deleted" file in a private archive?
* STUB
*
- * @param $field
+ * @param integer $field one of DELETED_* bitfield constants
*
* @return bool
*/
@@ -1656,18 +1657,22 @@ abstract class File {
/**
* Get the HTML text of the description page, if available
*
+ * @param $lang Language Optional language to fetch description in
* @return string
*/
- function getDescriptionText() {
+ function getDescriptionText( $lang = false ) {
global $wgMemc, $wgLang;
if ( !$this->repo || !$this->repo->fetchDescription ) {
return false;
}
- $renderUrl = $this->repo->getDescriptionRenderUrl( $this->getName(), $wgLang->getCode() );
+ if ( !$lang ) {
+ $lang = $wgLang;
+ }
+ $renderUrl = $this->repo->getDescriptionRenderUrl( $this->getName(), $lang->getCode() );
if ( $renderUrl ) {
if ( $this->repo->descriptionCacheExpiry > 0 ) {
wfDebug( "Attempting to get the description from cache..." );
- $key = $this->repo->getLocalCacheKey( 'RemoteFileDescription', 'url', $wgLang->getCode(),
+ $key = $this->repo->getLocalCacheKey( 'RemoteFileDescription', 'url', $lang->getCode(),
$this->getName() );
$obj = $wgMemc->get( $key );
if ( $obj ) {
diff --git a/includes/filerepo/file/ForeignAPIFile.php b/includes/filerepo/file/ForeignAPIFile.php
index a96c1f3f..ed96d446 100644
--- a/includes/filerepo/file/ForeignAPIFile.php
+++ b/includes/filerepo/file/ForeignAPIFile.php
@@ -54,22 +54,22 @@ class ForeignAPIFile extends File {
*/
static function newFromTitle( Title $title, $repo ) {
$data = $repo->fetchImageQuery( array(
- 'titles' => 'File:' . $title->getDBKey(),
- 'iiprop' => self::getProps(),
- 'prop' => 'imageinfo',
+ 'titles' => 'File:' . $title->getDBkey(),
+ 'iiprop' => self::getProps(),
+ 'prop' => 'imageinfo',
'iimetadataversion' => MediaHandler::getMetadataVersion()
) );
$info = $repo->getImageInfo( $data );
- if( $info ) {
+ if ( $info ) {
$lastRedirect = isset( $data['query']['redirects'] )
? count( $data['query']['redirects'] ) - 1
: -1;
- if( $lastRedirect >= 0 ) {
- $newtitle = Title::newFromText( $data['query']['redirects'][$lastRedirect]['to']);
+ if ( $lastRedirect >= 0 ) {
+ $newtitle = Title::newFromText( $data['query']['redirects'][$lastRedirect]['to'] );
$img = new self( $newtitle, $repo, $info, true );
- if( $img ) {
+ if ( $img ) {
$img->redirectedFrom( $title->getDBkey() );
}
} else {
@@ -86,7 +86,7 @@ class ForeignAPIFile extends File {
* @return string
*/
static function getProps() {
- return 'timestamp|user|comment|url|size|sha1|metadata|mime';
+ return 'timestamp|user|comment|url|size|sha1|metadata|mime|mediatype';
}
// Dummy functions...
@@ -111,7 +111,7 @@ class ForeignAPIFile extends File {
* @return bool|MediaTransformOutput
*/
function transform( $params, $flags = 0 ) {
- if( !$this->canRender() ) {
+ if ( !$this->canRender() ) {
// show icon
return parent::transform( $params, $flags );
}
@@ -119,12 +119,25 @@ class ForeignAPIFile extends File {
// Note, the this->canRender() check above implies
// that we have a handler, and it can do makeParamString.
$otherParams = $this->handler->makeParamString( $params );
+ $width = isset( $params['width'] ) ? $params['width'] : -1;
+ $height = isset( $params['height'] ) ? $params['height'] : -1;
$thumbUrl = $this->repo->getThumbUrlFromCache(
$this->getName(),
- isset( $params['width'] ) ? $params['width'] : -1,
- isset( $params['height'] ) ? $params['height'] : -1,
- $otherParams );
+ $width,
+ $height,
+ $otherParams
+ );
+ if ( $thumbUrl === false ) {
+ global $wgLang;
+ return $this->repo->getThumbError(
+ $this->getName(),
+ $width,
+ $height,
+ $otherParams,
+ $wgLang->getCode()
+ );
+ }
return $this->handler->getTransform( $this, 'bogus', $thumbUrl, $params );
}
@@ -161,12 +174,12 @@ class ForeignAPIFile extends File {
* @return array
*/
public static function parseMetadata( $metadata ) {
- if( !is_array( $metadata ) ) {
+ if ( !is_array( $metadata ) ) {
return $metadata;
}
$ret = array();
- foreach( $metadata as $meta ) {
- $ret[ $meta['name'] ] = self::parseMetadata( $meta['value'] );
+ foreach ( $metadata as $meta ) {
+ $ret[$meta['name']] = self::parseMetadata( $meta['value'] );
}
return $ret;
}
@@ -224,7 +237,7 @@ class ForeignAPIFile extends File {
* @return string
*/
function getMimeType() {
- if( !isset( $this->mInfo['mime'] ) ) {
+ if ( !isset( $this->mInfo['mime'] ) ) {
$magic = MimeMagic::singleton();
$this->mInfo['mime'] = $magic->guessTypesForExtension( $this->getExtension() );
}
@@ -232,10 +245,12 @@ class ForeignAPIFile extends File {
}
/**
- * @todo FIXME: May guess wrong on file types that can be eg audio or video
* @return int|string
*/
function getMediaType() {
+ if ( isset( $this->mInfo['mediatype'] ) ) {
+ return $this->mInfo['mediatype'];
+ }
$magic = MimeMagic::singleton();
return $magic->getMediaType( null, $this->getMimeType() );
}
diff --git a/includes/filerepo/file/ForeignDBFile.php b/includes/filerepo/file/ForeignDBFile.php
index ee5883c4..01d6b0f5 100644
--- a/includes/filerepo/file/ForeignDBFile.php
+++ b/includes/filerepo/file/ForeignDBFile.php
@@ -120,10 +120,11 @@ class ForeignDBFile extends LocalFile {
}
/**
+ * @param $lang Language Optional language to fetch description in.
* @return string
*/
- function getDescriptionText() {
+ function getDescriptionText( $lang = false ) {
// Restore remote behavior
- return File::getDescriptionText();
+ return File::getDescriptionText( $lang );
}
}
diff --git a/includes/filerepo/file/LocalFile.php b/includes/filerepo/file/LocalFile.php
index 4f50bfaa..fe769be2 100644
--- a/includes/filerepo/file/LocalFile.php
+++ b/includes/filerepo/file/LocalFile.php
@@ -382,6 +382,7 @@ class LocalFile extends File {
$this->$name = $value;
}
} else {
+ wfProfileOut( $fname );
throw new MWException( "Could not find data for image '{$this->getName()}'." );
}
@@ -531,15 +532,15 @@ class LocalFile extends File {
$dbw->update( 'image',
array(
- 'img_size' => $this->size, // sanity
- 'img_width' => $this->width,
- 'img_height' => $this->height,
- 'img_bits' => $this->bits,
+ 'img_size' => $this->size, // sanity
+ 'img_width' => $this->width,
+ 'img_height' => $this->height,
+ 'img_bits' => $this->bits,
'img_media_type' => $this->media_type,
'img_major_mime' => $major,
'img_minor_mime' => $minor,
- 'img_metadata' => $this->metadata,
- 'img_sha1' => $this->sha1,
+ 'img_metadata' => $dbw->encodeBlob($this->metadata),
+ 'img_sha1' => $this->sha1,
),
array( 'img_name' => $this->getName() ),
__METHOD__
@@ -603,17 +604,23 @@ class LocalFile extends File {
* Return the width of the image
*
* @param $page int
- * @return bool|int Returns false on error
+ * @return int
*/
public function getWidth( $page = 1 ) {
$this->load();
if ( $this->isMultipage() ) {
- $dim = $this->getHandler()->getPageDimensions( $this, $page );
+ $handler = $this->getHandler();
+ if ( !$handler ) {
+ return 0;
+ }
+ $dim = $handler->getPageDimensions( $this, $page );
if ( $dim ) {
return $dim['width'];
} else {
- return false;
+ // For non-paged media, the false goes through an
+ // intval, turning failure into 0, so do same here.
+ return 0;
}
} else {
return $this->width;
@@ -624,17 +631,23 @@ class LocalFile extends File {
* Return the height of the image
*
* @param $page int
- * @return bool|int Returns false on error
+ * @return int
*/
public function getHeight( $page = 1 ) {
$this->load();
if ( $this->isMultipage() ) {
- $dim = $this->getHandler()->getPageDimensions( $this, $page );
+ $handler = $this->getHandler();
+ if ( !$handler ) {
+ return 0;
+ }
+ $dim = $handler->getPageDimensions( $this, $page );
if ( $dim ) {
return $dim['height'];
} else {
- return false;
+ // For non-paged media, the false goes through an
+ // intval, turning failure into 0, so do same here.
+ return 0;
}
} else {
return $this->height;
@@ -775,10 +788,12 @@ class LocalFile extends File {
$backend = $this->repo->getBackend();
$files = array( $dir );
- $iterator = $backend->getFileList( array( 'dir' => $dir ) );
- foreach ( $iterator as $file ) {
- $files[] = $file;
- }
+ try {
+ $iterator = $backend->getFileList( array( 'dir' => $dir ) );
+ foreach ( $iterator as $file ) {
+ $files[] = $file;
+ }
+ } catch ( FileBackendError $e ) {} // suppress (bug 54674)
return $files;
}
@@ -793,7 +808,9 @@ class LocalFile extends File {
}
/**
- * Purge the shared history (OldLocalFile) cache
+ * Purge the shared history (OldLocalFile) cache.
+ *
+ * @note This used to purge old thumbnails as well.
*/
function purgeHistory() {
global $wgMemc;
@@ -801,20 +818,20 @@ class LocalFile extends File {
$hashedName = md5( $this->getName() );
$oldKey = $this->repo->getSharedCacheKey( 'oldfile', $hashedName );
- // Must purge thumbnails for old versions too! bug 30192
- foreach( $this->getHistory() as $oldFile ) {
- $oldFile->purgeThumbnails();
- }
-
if ( $oldKey ) {
$wgMemc->delete( $oldKey );
}
}
/**
- * Delete all previously generated thumbnails, refresh metadata in memcached and purge the squid
+ * Delete all previously generated thumbnails, refresh metadata in memcached and purge the squid.
+ *
+ * @param Array $options An array potentially with the key forThumbRefresh.
+ *
+ * @note This used to purge old thumbnails by default as well, but doesn't anymore.
*/
function purgeCache( $options = array() ) {
+ wfProfileIn( __METHOD__ );
// Refresh metadata cache
$this->purgeMetadataCache();
@@ -823,6 +840,7 @@ class LocalFile extends File {
// Purge squid cache for this file
SquidUpdate::purge( array( $this->getURL() ) );
+ wfProfileOut( __METHOD__ );
}
/**
@@ -844,7 +862,7 @@ class LocalFile extends File {
// Purge the squid
if ( $wgUseSquid ) {
$urls = array();
- foreach( $files as $file ) {
+ foreach ( $files as $file ) {
$urls[] = $this->getArchiveThumbUrl( $archiveName, $file );
}
SquidUpdate::purge( $urls );
@@ -865,7 +883,7 @@ class LocalFile extends File {
// Always purge all files from squid regardless of handler filters
if ( $wgUseSquid ) {
$urls = array();
- foreach( $files as $file ) {
+ foreach ( $files as $file ) {
$urls[] = $this->getThumbUrl( $file );
}
array_shift( $urls ); // don't purge directory
@@ -1195,20 +1213,20 @@ class LocalFile extends File {
# doesn't deadlock. SELECT FOR UPDATE causes a deadlock for every race condition.
$dbw->insert( 'image',
array(
- 'img_name' => $this->getName(),
- 'img_size' => $this->size,
- 'img_width' => intval( $this->width ),
- 'img_height' => intval( $this->height ),
- 'img_bits' => $this->bits,
- 'img_media_type' => $this->media_type,
- 'img_major_mime' => $this->major_mime,
- 'img_minor_mime' => $this->minor_mime,
- 'img_timestamp' => $timestamp,
+ 'img_name' => $this->getName(),
+ 'img_size' => $this->size,
+ 'img_width' => intval( $this->width ),
+ 'img_height' => intval( $this->height ),
+ 'img_bits' => $this->bits,
+ 'img_media_type' => $this->media_type,
+ 'img_major_mime' => $this->major_mime,
+ 'img_minor_mime' => $this->minor_mime,
+ 'img_timestamp' => $timestamp,
'img_description' => $comment,
- 'img_user' => $user->getId(),
- 'img_user_text' => $user->getName(),
- 'img_metadata' => $this->metadata,
- 'img_sha1' => $this->sha1
+ 'img_user' => $user->getId(),
+ 'img_user_text' => $user->getName(),
+ 'img_metadata' => $dbw->encodeBlob($this->metadata),
+ 'img_sha1' => $this->sha1
),
__METHOD__,
'IGNORE'
@@ -1258,7 +1276,7 @@ class LocalFile extends File {
'img_description' => $comment,
'img_user' => $user->getId(),
'img_user_text' => $user->getName(),
- 'img_metadata' => $this->metadata,
+ 'img_metadata' => $dbw->encodeBlob($this->metadata),
'img_sha1' => $this->sha1
),
array( 'img_name' => $this->getName() ),
@@ -1274,20 +1292,45 @@ class LocalFile extends File {
$wikiPage->setFile( $this );
# Add the log entry
- $log = new LogPage( 'upload' );
$action = $reupload ? 'overwrite' : 'upload';
- $logId = $log->addEntry( $action, $descTitle, $comment, array(), $user );
- wfProfileIn( __METHOD__ . '-edit' );
+ $logEntry = new ManualLogEntry( 'upload', $action );
+ $logEntry->setPerformer( $user );
+ $logEntry->setComment( $comment );
+ $logEntry->setTarget( $descTitle );
+
+ // Allow people using the api to associate log entries with the upload.
+ // Log has a timestamp, but sometimes different from upload timestamp.
+ $logEntry->setParameters(
+ array(
+ 'img_sha1' => $this->sha1,
+ 'img_timestamp' => $timestamp,
+ )
+ );
+ // Note we keep $logId around since during new image
+ // creation, page doesn't exist yet, so log_page = 0
+ // but we want it to point to the page we're making,
+ // so we later modify the log entry.
+ // For a similar reason, we avoid making an RC entry
+ // now and wait until the page exists.
+ $logId = $logEntry->insert();
+
$exists = $descTitle->exists();
+ if ( $exists ) {
+ // Page exists, do RC entry now (otherwise we wait for later).
+ $logEntry->publish( $logId );
+ }
+ wfProfileIn( __METHOD__ . '-edit' );
if ( $exists ) {
# Create a null revision
$latest = $descTitle->getLatestRevID();
+ $editSummary = LogFormatter::newFromEntry( $logEntry )->getPlainActionText();
+
$nullRevision = Revision::newNullRevision(
$dbw,
$descTitle->getArticleID(),
- $log->getRcComment(),
+ $editSummary,
false
);
if ( !is_null( $nullRevision ) ) {
@@ -1315,16 +1358,20 @@ class LocalFile extends File {
$content = ContentHandler::makeContent( $pageText, $descTitle );
$status = $wikiPage->doEditContent( $content, $comment, EDIT_NEW | EDIT_SUPPRESS_RC, false, $user );
- if ( isset( $status->value['revision'] ) ) { // XXX; doEdit() uses a transaction
- $dbw->begin( __METHOD__ );
+ $dbw->begin( __METHOD__ ); // XXX; doEdit() uses a transaction
+ // Now that the page exists, make an RC entry.
+ $logEntry->publish( $logId );
+ if ( isset( $status->value['revision'] ) ) {
$dbw->update( 'logging',
array( 'log_page' => $status->value['revision']->getPage() ),
array( 'log_id' => $logId ),
__METHOD__
);
- $dbw->commit( __METHOD__ ); // commit before anything bad can happen
}
+ $dbw->commit( __METHOD__ ); // commit before anything bad can happen
}
+
+
wfProfileOut( __METHOD__ . '-edit' );
# Save to cache and purge the squid
@@ -1351,11 +1398,17 @@ class LocalFile extends File {
# Invalidate cache for all pages using this file
$update = new HTMLCacheUpdate( $this->getTitle(), 'imagelinks' );
$update->doUpdate();
+ if ( !$reupload ) {
+ LinksUpdate::queueRecursiveJobsForTable( $this->getTitle(), 'imagelinks' );
+ }
# Invalidate cache for all pages that redirects on this page
$redirs = $this->getTitle()->getRedirectsHere();
foreach ( $redirs as $redir ) {
+ if ( !$reupload && $redir->getNamespace() === NS_FILE ) {
+ LinksUpdate::queueRecursiveJobsForTable( $redir, 'imagelinks' );
+ }
$update = new HTMLCacheUpdate( $redir, 'imagelinks' );
$update->doUpdate();
}
@@ -1405,7 +1458,7 @@ class LocalFile extends File {
$this->lock(); // begin
- $archiveName = wfTimestamp( TS_MW ) . '!'. $this->getName();
+ $archiveName = wfTimestamp( TS_MW ) . '!' . $this->getName();
$archiveRel = 'archive/' . $this->getHashPath() . $archiveName;
$flags = $flags & File::DELETE_SOURCE ? LocalRepo::DELETE_SOURCE : 0;
$status = $this->repo->publish( $srcPath, $dstRel, $archiveRel, $flags, $options );
@@ -1454,18 +1507,27 @@ class LocalFile extends File {
wfDebugLog( 'imagemove', "Finished moving {$this->name}" );
- $this->purgeEverything();
- foreach ( $archiveNames as $archiveName ) {
- $this->purgeOldThumbnails( $archiveName );
- }
+ // Purge the source and target files...
+ $oldTitleFile = wfLocalFile( $this->title );
+ $newTitleFile = wfLocalFile( $target );
+ // Hack: the lock()/unlock() pair is nested in a transaction so the locking is not
+ // tied to BEGIN/COMMIT. To avoid slow purges in the transaction, move them outside.
+ $this->getRepo()->getMasterDB()->onTransactionIdle(
+ function() use ( $oldTitleFile, $newTitleFile, $archiveNames ) {
+ $oldTitleFile->purgeEverything();
+ foreach ( $archiveNames as $archiveName ) {
+ $oldTitleFile->purgeOldThumbnails( $archiveName );
+ }
+ $newTitleFile->purgeEverything();
+ }
+ );
+
if ( $status->isOK() ) {
// Now switch the object
$this->title = $target;
// Force regeneration of the name and hashpath
unset( $this->name );
unset( $this->hashPath );
- // Purge the new image
- $this->purgeEverything();
}
return $status;
@@ -1484,7 +1546,6 @@ class LocalFile extends File {
* @return FileRepoStatus object.
*/
function delete( $reason, $suppress = false ) {
- global $wgUseSquid;
if ( $this->getRepo()->getReadOnlyReason() !== false ) {
return $this->readOnlyFatalStatus();
}
@@ -1502,19 +1563,28 @@ class LocalFile extends File {
DeferredUpdates::addUpdate( SiteStatsUpdate::factory( array( 'images' => -1 ) ) );
}
- $this->purgeEverything();
- foreach ( $archiveNames as $archiveName ) {
- $this->purgeOldThumbnails( $archiveName );
- }
+ // Hack: the lock()/unlock() pair is nested in a transaction so the locking is not
+ // tied to BEGIN/COMMIT. To avoid slow purges in the transaction, move them outside.
+ $file = $this;
+ $this->getRepo()->getMasterDB()->onTransactionIdle(
+ function() use ( $file, $archiveNames ) {
+ global $wgUseSquid;
- if ( $wgUseSquid ) {
- // Purge the squid
- $purgeUrls = array();
- foreach ($archiveNames as $archiveName ) {
- $purgeUrls[] = $this->getArchiveUrl( $archiveName );
+ $file->purgeEverything();
+ foreach ( $archiveNames as $archiveName ) {
+ $file->purgeOldThumbnails( $archiveName );
+ }
+
+ if ( $wgUseSquid ) {
+ // Purge the squid
+ $purgeUrls = array();
+ foreach ( $archiveNames as $archiveName ) {
+ $purgeUrls[] = $file->getArchiveUrl( $archiveName );
+ }
+ SquidUpdate::purge( $purgeUrls );
+ }
}
- SquidUpdate::purge( $purgeUrls );
- }
+ );
return $status;
}
@@ -1606,21 +1676,27 @@ class LocalFile extends File {
* @return String
*/
function getDescriptionUrl() {
- return $this->title->getLocalUrl();
+ return $this->title->getLocalURL();
}
/**
* Get the HTML text of the description page
* This is not used by ImagePage for local files, since (among other things)
* it skips the parser cache.
+ *
+ * @param $lang Language What language to get description in (Optional)
* @return bool|mixed
*/
- function getDescriptionText() {
+ function getDescriptionText( $lang = null ) {
$revision = Revision::newFromTitle( $this->title, false, Revision::READ_NORMAL );
- if ( !$revision ) return false;
+ if ( !$revision ) {
+ return false;
+ }
$content = $revision->getContent();
- if ( !$content ) return false;
- $pout = $content->getParserOutput( $this->title, null, new ParserOptions() );
+ if ( !$content ) {
+ return false;
+ }
+ $pout = $content->getParserOutput( $this->title, null, new ParserOptions( null, $lang ) );
return $pout->getText();
}
@@ -1674,11 +1750,13 @@ class LocalFile extends File {
}
/**
- * @return bool
+ * @return bool Whether to cache in RepoGroup (this avoids OOMs)
*/
function isCacheable() {
$this->load();
- return strlen( $this->metadata ) <= self::CACHE_FIELD_MAX_LEN; // avoid OOMs
+ // If extra data (metadata) was not loaded then it must have been large
+ return $this->extraDataLoaded
+ && strlen( serialize( $this->metadata ) ) <= self::CACHE_FIELD_MAX_LEN;
}
/**
@@ -1695,6 +1773,16 @@ class LocalFile extends File {
$this->lockedOwnTrx = true;
}
$this->locked++;
+ // Bug 54736: use simple lock to handle when the file does not exist.
+ // SELECT FOR UPDATE only locks records not the gaps where there are none.
+ $cache = wfGetMainCache();
+ $key = $this->getCacheKey();
+ if ( !$cache->lock( $key, 60 ) ) {
+ throw new MWException( "Could not acquire lock for '{$this->getName()}.'" );
+ }
+ $dbw->onTransactionIdle( function() use ( $cache, $key ) {
+ $cache->unlock( $key ); // release on commit
+ } );
}
return $dbw->selectField( 'image', '1',
@@ -2189,7 +2277,7 @@ class LocalFileRestoreBatch {
$deletedRel = $this->file->repo->getDeletedHashPath( $row->fa_storage_key ) . $row->fa_storage_key;
$deletedUrl = $this->file->repo->getVirtualUrl() . '/deleted/' . $deletedRel;
- if( isset( $row->fa_sha1 ) ) {
+ if ( isset( $row->fa_sha1 ) ) {
$sha1 = $row->fa_sha1;
} else {
// old row, populate from key
diff --git a/includes/filerepo/file/OldLocalFile.php b/includes/filerepo/file/OldLocalFile.php
index 5c505928..2c545963 100644
--- a/includes/filerepo/file/OldLocalFile.php
+++ b/includes/filerepo/file/OldLocalFile.php
@@ -218,6 +218,7 @@ class OldLocalFile extends LocalFile {
$this->$name = $value;
}
} else {
+ wfProfileOut( __METHOD__ );
throw new MWException( "Could not find data for image '{$this->archive_name}'." );
}
@@ -290,7 +291,7 @@ class OldLocalFile extends LocalFile {
*/
function isDeleted( $field ) {
$this->load();
- return ($this->deleted & $field) == $field;
+ return ( $this->deleted & $field ) == $field;
}
/**
diff --git a/includes/ImageGallery.php b/includes/gallery/ImageGalleryBase.php
index 1556ad94..f8b8c505 100644
--- a/includes/ImageGallery.php
+++ b/includes/gallery/ImageGalleryBase.php
@@ -27,8 +27,8 @@
*
* @ingroup Media
*/
-class ImageGallery {
- var $mImages, $mShowBytes, $mShowFilename;
+abstract class ImageGalleryBase extends ContextSource {
+ var $mImages, $mShowBytes, $mShowFilename, $mMode;
var $mCaption = false;
/**
@@ -50,18 +50,51 @@ class ImageGallery {
protected $mAttribs = array();
+ static private $modeMapping = false;
+
/**
- * Fixed margins
+ * Get a new image gallery. This is the method other callers
+ * should use to get a gallery.
+ *
+ * @param String|bool $mode Mode to use. False to use the default.
*/
- const THUMB_PADDING = 30;
- const GB_PADDING = 5;
- // 2px borders on each side + 2px implied padding on each side
- const GB_BORDERS = 8;
+ static function factory( $mode = false ) {
+ global $wgGalleryOptions, $wgContLang;
+ self::loadModes();
+ if ( !$mode ) {
+ $mode = $wgGalleryOptions['mode'];
+ }
+
+ $mode = $wgContLang->lc( $mode );
+
+ if ( isset( self::$modeMapping[$mode] ) ) {
+ return new self::$modeMapping[$mode]( $mode );
+ } else {
+ throw new MWException( "No gallery class registered for mode $mode" );
+ }
+ }
+
+ static private function loadModes() {
+ if ( self::$modeMapping === false ) {
+ self::$modeMapping = array(
+ 'traditional' => 'TraditionalImageGallery',
+ 'nolines' => 'NolinesImageGallery',
+ 'packed' => 'PackedImageGallery',
+ 'packed-hover' => 'PackedHoverImageGallery',
+ 'packed-overlay' => 'PackedOverlayImageGallery',
+ );
+ // Allow extensions to make a new gallery format.
+ wfRunHooks( 'GalleryGetModes', self::$modeMapping );
+ }
+ }
/**
* Create a new image gallery object.
+ *
+ * You should not call this directly, but instead use
+ * ImageGalleryBase::factory().
*/
- function __construct() {
+ function __construct( $mode = 'traditional' ) {
global $wgGalleryOptions;
$this->mImages = array();
$this->mShowBytes = $wgGalleryOptions['showBytes'];
@@ -72,10 +105,16 @@ class ImageGallery {
$this->mWidths = $wgGalleryOptions['imageWidth'];
$this->mHeights = $wgGalleryOptions['imageHeight'];
$this->mCaptionLength = $wgGalleryOptions['captionLength'];
+ $this->mMode = $mode;
}
/**
- * Register a parser object
+ * Register a parser object. If you do not set this
+ * and the output of this gallery ends up in parser
+ * cache, the javascript will break!
+ *
+ * @note This also triggers using the page's target
+ * language instead of the user language.
*
* @param $parser Parser
*/
@@ -143,6 +182,15 @@ class ImageGallery {
}
/**
+ * Allow setting additional options. This is meant
+ * to allow extensions to add additional parameters to
+ * <gallery> parser tag.
+ *
+ * @param Array $options Attributes of gallery tag.
+ */
+ public function setAdditionalOptions( $options ) { }
+
+ /**
* Instruct the class to use a specific skin for rendering
*
* @param $skin Skin object
@@ -160,13 +208,14 @@ class ImageGallery {
* @param $html String: Additional HTML text to be shown. The name and size of the image are always shown.
* @param $alt String: Alt text for the image
* @param $link String: Override image link (optional)
+ * @param $handlerOpts Array: Array of options for image handler (aka page number)
*/
- function add( $title, $html = '', $alt = '', $link = '' ) {
+ function add( $title, $html = '', $alt = '', $link = '', $handlerOpts = array() ) {
if ( $title instanceof File ) {
// Old calling convention
$title = $title->getTitle();
}
- $this->mImages[] = array( $title, $html, $alt, $link );
+ $this->mImages[] = array( $title, $html, $alt, $link, $handlerOpts );
wfDebug( 'ImageGallery::add ' . $title->getText() . "\n" );
}
@@ -176,13 +225,15 @@ class ImageGallery {
* @param $title Title object of the image that is added to the gallery
* @param $html String: Additional HTML text to be shown. The name and size of the image are always shown.
* @param $alt String: Alt text for the image
+ * @param $link String: Override image link (optional)
+ * @param $handlerOpts Array: Array of options for image handler (aka page number)
*/
- function insert( $title, $html = '', $alt = '' ) {
+ function insert( $title, $html = '', $alt = '', $link = '', $handlerOpts = array() ) {
if ( $title instanceof File ) {
// Old calling convention
$title = $title->getTitle();
}
- array_unshift( $this->mImages, array( &$title, $html, $alt ) );
+ array_unshift( $this->mImages, array( &$title, $html, $alt, $link, $handlerOpts ) );
}
/**
@@ -227,153 +278,11 @@ class ImageGallery {
}
/**
- * Return a HTML representation of the image gallery
+ * Display an html representation of the gallery
*
- * For each image in the gallery, display
- * - a thumbnail
- * - the image name
- * - the additional text provided when adding the image
- * - the size of the image
- *
- * @return string
+ * @return String The html
*/
- function toHTML() {
- 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'] : '';
- # _width is ignored by any sane browser. IE6 doesn't know max-width so it uses _width instead
- $this->mAttribs['style'] = "max-width: {$maxwidth}px;_width: {$maxwidth}px;" . $oldStyle;
- }
-
- $attribs = Sanitizer::mergeAttributes(
- array( 'class' => 'gallery' ), $this->mAttribs );
-
- $output = Xml::openElement( 'ul', $attribs );
- if ( $this->mCaption ) {
- $output .= "\n\t<li class='gallerycaption'>{$this->mCaption}</li>";
- }
-
- $lang = $this->getLang();
- $params = array(
- 'width' => $this->mWidths,
- 'height' => $this->mHeights
- );
- # Output each image...
- foreach ( $this->mImages as $pair ) {
- $nt = $pair[0];
- $text = $pair[1]; # "text" means "caption" here
- $alt = $pair[2];
- $link = $pair[3];
-
- $descQuery = false;
- if ( $nt->getNamespace() == NS_FILE ) {
- # Get the file...
- if ( $this->mParser instanceof Parser ) {
- # Give extensions a chance to select the file revision for us
- $options = array();
- wfRunHooks( 'BeforeParserFetchFileAndTitle',
- array( $this->mParser, $nt, &$options, &$descQuery ) );
- # Fetch and register the file (file title may be different via hooks)
- list( $img, $nt ) = $this->mParser->fetchFileAndTitle( $nt, $options );
- } else {
- $img = wfFindFile( $nt );
- }
- } else {
- $img = false;
- }
-
- 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: ' . ( 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: ' . ( self::THUMB_PADDING + $this->mHeights ) . 'px;">' .
- Linker::link(
- $nt,
- htmlspecialchars( $nt->getText() ),
- array(),
- array(),
- array( 'known', 'noclasses' )
- ) .
- '</div>';
- } elseif( !( $thumb = $img->transform( $params ) ) ) {
- # Error generating thumbnail.
- $thumbhtml = "\n\t\t\t" . '<div style="height: ' . ( self::THUMB_PADDING + $this->mHeights ) . 'px;">'
- . htmlspecialchars( $img->getLastError() ) . '</div>';
- } else {
- $vpad = ( self::THUMB_PADDING + $this->mHeights - $thumb->height ) /2;
-
- $imageParameters = array(
- 'desc-link' => true,
- 'desc-query' => $descQuery,
- 'alt' => $alt,
- 'custom-url-link' => $link
- );
- # In the absence of both alt text and caption, fall back on providing screen readers with the filename as alt text
- if ( $alt == '' && $text == '' ) {
- $imageParameters['alt'] = $nt->getText();
- }
-
- # Set both fixed width and min-height.
- $thumbhtml = "\n\t\t\t" .
- '<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:' . $vpad . 'px auto;">'
- . $thumb->toHtml( $imageParameters ) . '</div></div>';
-
- // Call parser transform hook
- if ( $this->mParser && $img->getHandler() ) {
- $img->getHandler()->parserTransformHook( $this->mParser, $img );
- }
- }
-
- //TODO
- // $linkTarget = Title::newFromText( $wgContLang->getNsText( MWNamespace::getUser() ) . ":{$ut}" );
- // $ul = Linker::link( $linkTarget, $ut );
-
- if( $this->mShowBytes ) {
- if( $img ) {
- $fileSize = htmlspecialchars( $lang->formatSize( $img->getSize() ) );
- } else {
- $fileSize = wfMessage( 'filemissing' )->escaped();
- }
- $fileSize = "$fileSize<br />\n";
- } else {
- $fileSize = '';
- }
-
- $textlink = $this->mShowFilename ?
- Linker::link(
- $nt,
- htmlspecialchars( $lang->truncate( $nt->getText(), $this->mCaptionLength ) ),
- array(),
- array(),
- array( 'known', 'noclasses' )
- ) . "<br />\n" :
- '';
-
- # ATTENTION: The newline after <div class="gallerytext"> is needed to accommodate htmltidy which
- # in version 4.8.6 generated crackpot html in its absence, see:
- # http://bugzilla.wikimedia.org/show_bug.cgi?id=1765 -Ævar
-
- # Weird double wrapping (the extra div inside the li) needed due to FF2 bug
- # Can be safely removed if FF2 falls completely out of existence
- $output .=
- "\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 . $fileSize
- . "\n\t\t\t</div>"
- . "\n\t\t</div></li>";
- }
- $output .= "\n</ul>";
-
- return $output;
- }
+ abstract public function toHTML();
/**
* @return Integer: number of images in the gallery
@@ -406,11 +315,17 @@ class ImageGallery {
* Determines the correct language to be used for this image gallery
* @return Language object
*/
- private function getLang() {
- global $wgLang;
+ protected function getRenderLang() {
return $this->mParser
? $this->mParser->getTargetLanguage()
- : $wgLang;
+ : $this->getLanguage();
}
-} //class
+ /* Old constants no longer used.
+ const THUMB_PADDING = 30;
+ const GB_PADDING = 5;
+ const GB_BORDERS = 8;
+ */
+
+}
+
diff --git a/skins/MySkin.php b/includes/gallery/NolinesImageGallery.php
index fb49b88d..6b0d0fa6 100644
--- a/skins/MySkin.php
+++ b/includes/gallery/NolinesImageGallery.php
@@ -1,7 +1,7 @@
<?php
/**
- * MySkin: Monobook without the CSS. The idea is that you
- * customise it using user or site CSS.
+ * Nolines image gallery. Like "traditional" but without borders and
+ * less padding.
*
* This 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,17 +19,20 @@
* http://www.gnu.org/copyleft/gpl.html
*
* @file
- * @ingroup Skins
*/
-if( !defined( 'MEDIAWIKI' ) )
- die( -1 );
+class NolinesImageGallery extends TraditionalImageGallery {
-/**
- * Inherit main code from SkinTemplate, set the CSS and template filter.
- * @ingroup Skins
- */
-class SkinMySkin extends SkinTemplate {
- var $skinname = 'myskin', $stylename = 'myskin',
- $template = 'MonoBookTemplate', $useHeadElement = true;
+ protected function getThumbPadding() {
+ return 0;
+ }
+
+ protected function getGBBorders() {
+ // This accounts for extra space between <li> elements.
+ return 4;
+ }
+
+ protected function getVPad( $boxHeight, $thumbHeight ) {
+ return 0;
+ }
}
diff --git a/includes/gallery/PackedImageGallery.php b/includes/gallery/PackedImageGallery.php
new file mode 100644
index 00000000..963ee6b9
--- /dev/null
+++ b/includes/gallery/PackedImageGallery.php
@@ -0,0 +1,105 @@
+<?php
+/**
+ * Packed image gallery. All images adjusted to be same height.
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with this program; if not, write 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 PackedImageGallery extends TraditionalImageGallery {
+
+ function __construct( $mode = 'traditional' ) {
+ parent::__construct( $mode );
+ // Does not support per row option.
+ $this->mPerRow = 0;
+ }
+
+ /**
+ * We artificially have 1.5 the resolution neccessary so that
+ * we can scale it up by that much on the client side, without
+ * worrying about requesting a new image.
+ */
+ const SCALE_FACTOR = 1.5;
+
+ protected function getVPad( $boxHeight, $thumbHeight ) {
+ return ( $this->getThumbPadding() + $boxHeight - $thumbHeight / self::SCALE_FACTOR ) / 2;
+ }
+
+ protected function getThumbPadding() {
+ return 0;
+ }
+
+ protected function getGBPadding() {
+ return 2;
+ }
+
+ /**
+ * @param File $img The file being transformed. May be false
+ */
+ protected function getThumbParams( $img ) {
+ if ( $img && $img->getMediaType() === MEDIATYPE_AUDIO ) {
+ $width = $this->mWidths;
+ } else {
+ // We want the width not to be the constraining
+ // factor, so use random big number.
+ $width = $this->mHeights * 10 + 100;
+ }
+ // self::SCALE_FACTOR so the js has some room to manipulate sizes.
+ return array(
+ 'width' => $width * self::SCALE_FACTOR,
+ 'height' => $this->mHeights * self::SCALE_FACTOR,
+ );
+ }
+
+ protected function getThumbDivWidth( $thumbWidth ) {
+ // Require at least 60px wide, so caption is wide enough to work.
+ if ( $thumbWidth < 60 * self::SCALE_FACTOR ) {
+ $thumbWidth = 60 * self::SCALE_FACTOR;
+ }
+ return $thumbWidth / self::SCALE_FACTOR + $this->getThumbPadding();
+ }
+
+ /**
+ * @param MediaTransformOutput|bool $thumb the thumbnail, or false if no thumb (which can happen)
+ */
+ protected function getGBWidth( $thumb ) {
+ $thumbWidth = $thumb ? $thumb->getWidth() : $this->mWidths * self::SCALE_FACTOR;
+ return $this->getThumbDivWidth( $thumbWidth ) + $this->getGBPadding();
+ }
+
+ protected function adjustImageParameters( $thumb, &$imageParameters ) {
+ // Re-adjust back to normal size.
+ $imageParameters['override-width'] = ceil( $thumb->getWidth() / self::SCALE_FACTOR );
+ $imageParameters['override-height'] = ceil( $thumb->getHeight() / self::SCALE_FACTOR );
+ }
+
+ /**
+ * Add javascript which auto-justifies the rows by manipulating the image sizes.
+ * Also ensures that the hover version of this degrades gracefully.
+ */
+ protected function getModules() {
+ return array( 'mediawiki.page.gallery' );
+ }
+
+ /**
+ * Do not support per-row on packed. It really doesn't work
+ * since the images have varying widths.
+ */
+ public function setPerRow( $num ) {
+ return;
+ }
+}
diff --git a/includes/gallery/PackedOverlayImageGallery.php b/includes/gallery/PackedOverlayImageGallery.php
new file mode 100644
index 00000000..bba06fcf
--- /dev/null
+++ b/includes/gallery/PackedOverlayImageGallery.php
@@ -0,0 +1,60 @@
+<?php
+/**
+ * Packed overlay image gallery. All images adjusted to be same height and
+ * image caption being placed over top of image.
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with this program; if not, write 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 PackedOverlayImageGallery extends PackedImageGallery {
+
+ /**
+ * Add the wrapper html around the thumb's caption
+ *
+ * @param String $galleryText The caption
+ * @param MediaTransformOutput|boolean $thumb The thumb this caption is for or false for bad image.
+ */
+ protected function wrapGalleryText( $galleryText, $thumb ) {
+
+ // If we have no text, do not output anything to avoid
+ // ugly white overlay.
+ if ( trim( $galleryText ) === '' ) {
+ return '';
+ }
+
+ # ATTENTION: The newline after <div class="gallerytext"> is needed to accommodate htmltidy which
+ # in version 4.8.6 generated crackpot html in its absence, see:
+ # http://bugzilla.wikimedia.org/show_bug.cgi?id=1765 -Ævar
+
+ $thumbWidth = $this->getGBWidth( $thumb ) - $this->getThumbPadding() - $this->getGBPadding();
+ $captionWidth = ceil( $thumbWidth - 20 );
+
+ $outerWrapper = '<div class="gallerytextwrapper" style="width: ' . $captionWidth . 'px">';
+ return "\n\t\t\t" . $outerWrapper . '<div class="gallerytext">' . "\n"
+ . $galleryText
+ . "\n\t\t\t</div>";
+ }
+}
+
+/**
+ * Same as Packed except different CSS is applied to make the
+ * caption only show up on hover. If a touch screen is detected,
+ * falls back to PackedHoverGallery. Degrades gracefully for
+ * screen readers.
+ */
+class PackedHoverImageGallery extends PackedOverlayImageGallery { }
diff --git a/includes/gallery/TraditionalImageGallery.php b/includes/gallery/TraditionalImageGallery.php
new file mode 100644
index 00000000..1f60fa69
--- /dev/null
+++ b/includes/gallery/TraditionalImageGallery.php
@@ -0,0 +1,328 @@
+<?php
+/**
+ * Image gallery.
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with this program; if not, write 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 TraditionalImageGallery extends ImageGalleryBase {
+
+
+ /**
+ * Return a HTML representation of the image gallery
+ *
+ * For each image in the gallery, display
+ * - a thumbnail
+ * - the image name
+ * - the additional text provided when adding the image
+ * - the size of the image
+ *
+ * @return string
+ */
+ function toHTML() {
+ if ( $this->mPerRow > 0 ) {
+ $maxwidth = $this->mPerRow * ( $this->mWidths + $this->getAllPadding() );
+ $oldStyle = isset( $this->mAttribs['style'] ) ? $this->mAttribs['style'] : '';
+ # _width is ignored by any sane browser. IE6 doesn't know max-width so it uses _width instead
+ $this->mAttribs['style'] = "max-width: {$maxwidth}px;_width: {$maxwidth}px;" . $oldStyle;
+ }
+
+ $attribs = Sanitizer::mergeAttributes(
+ array( 'class' => 'gallery mw-gallery-' . $this->mMode ), $this->mAttribs );
+
+ $modules = $this->getModules();
+
+ if ( $this->mParser ) {
+ $this->mParser->getOutput()->addModules( $modules );
+ } else {
+ $this->getOutput()->addModules( $modules );
+ }
+ $output = Xml::openElement( 'ul', $attribs );
+ if ( $this->mCaption ) {
+ $output .= "\n\t<li class='gallerycaption'>{$this->mCaption}</li>";
+ }
+
+ $lang = $this->getRenderLang();
+ # Output each image...
+ foreach ( $this->mImages as $pair ) {
+ $nt = $pair[0];
+ $text = $pair[1]; # "text" means "caption" here
+ $alt = $pair[2];
+ $link = $pair[3];
+
+ $descQuery = false;
+ if ( $nt->getNamespace() === NS_FILE ) {
+ # Get the file...
+ if ( $this->mParser instanceof Parser ) {
+ # Give extensions a chance to select the file revision for us
+ $options = array();
+ wfRunHooks( 'BeforeParserFetchFileAndTitle',
+ array( $this->mParser, $nt, &$options, &$descQuery ) );
+ # Fetch and register the file (file title may be different via hooks)
+ list( $img, $nt ) = $this->mParser->fetchFileAndTitle( $nt, $options );
+ } else {
+ $img = wfFindFile( $nt );
+ }
+ } else {
+ $img = false;
+ }
+
+ $params = $this->getThumbParams( $img );
+ // $pair[4] is per image handler options
+ $transformOptions = $params + $pair[4];
+
+ $thumb = false;
+
+ if ( !$img ) {
+ # We're dealing with a non-image, spit out the name and be done with it.
+ $thumbhtml = "\n\t\t\t" . '<div class="thumb" style="height: ' . ( $this->getThumbPadding() + $this->mHeights ) . 'px;">'
+ . htmlspecialchars( $nt->getText() ) . '</div>';
+
+ if ( $this->mParser instanceof Parser ) {
+ $this->mParser->addTrackingCategory( 'broken-file-category' );
+ }
+ } 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 class="thumb" style="height: ' . ( $this->getThumbPadding() + $this->mHeights ) . 'px;">' .
+ Linker::link(
+ $nt,
+ htmlspecialchars( $nt->getText() ),
+ array(),
+ array(),
+ array( 'known', 'noclasses' )
+ ) .
+ '</div>';
+ } elseif ( !( $thumb = $img->transform( $transformOptions ) ) ) {
+ # Error generating thumbnail.
+ $thumbhtml = "\n\t\t\t" . '<div class="thumb" style="height: ' . ( $this->getThumbPadding() + $this->mHeights ) . 'px;">'
+ . htmlspecialchars( $img->getLastError() ) . '</div>';
+ } else {
+ $vpad = $this->getVPad( $this->mHeights, $thumb->getHeight() );
+
+ $imageParameters = array(
+ 'desc-link' => true,
+ 'desc-query' => $descQuery,
+ 'alt' => $alt,
+ 'custom-url-link' => $link
+ );
+ # In the absence of both alt text and caption, fall back on providing screen readers with the filename as alt text
+ if ( $alt == '' && $text == '' ) {
+ $imageParameters['alt'] = $nt->getText();
+ }
+
+ $this->adjustImageParameters( $thumb, $imageParameters );
+
+ # Set both fixed width and min-height.
+ $thumbhtml = "\n\t\t\t" .
+ '<div class="thumb" style="width: ' . $this->getThumbDivWidth( $thumb->getWidth() ) . '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:' . $vpad . 'px auto;">'
+ . $thumb->toHtml( $imageParameters ) . '</div></div>';
+
+ // Call parser transform hook
+ if ( $this->mParser && $img->getHandler() ) {
+ $img->getHandler()->parserTransformHook( $this->mParser, $img );
+ }
+ }
+
+ //TODO
+ // $linkTarget = Title::newFromText( $wgContLang->getNsText( MWNamespace::getUser() ) . ":{$ut}" );
+ // $ul = Linker::link( $linkTarget, $ut );
+
+ if ( $this->mShowBytes ) {
+ if ( $img ) {
+ $fileSize = htmlspecialchars( $lang->formatSize( $img->getSize() ) );
+ } else {
+ $fileSize = $this->msg( 'filemissing' )->escaped();
+ }
+ $fileSize = "$fileSize<br />\n";
+ } else {
+ $fileSize = '';
+ }
+
+ $textlink = $this->mShowFilename ?
+ Linker::link(
+ $nt,
+ htmlspecialchars( $lang->truncate( $nt->getText(), $this->mCaptionLength ) ),
+ array(),
+ array(),
+ array( 'known', 'noclasses' )
+ ) . "<br />\n" :
+ '';
+
+
+ $galleryText = $textlink . $text . $fileSize;
+ $galleryText = $this->wrapGalleryText( $galleryText, $thumb );
+
+ # Weird double wrapping (the extra div inside the li) needed due to FF2 bug
+ # Can be safely removed if FF2 falls completely out of existence
+ $output .=
+ "\n\t\t" . '<li class="gallerybox" style="width: ' . $this->getGBWidth( $thumb ) . 'px">'
+ . '<div style="width: ' . $this->getGBWidth( $thumb ) . 'px">'
+ . $thumbhtml
+ . $galleryText
+ . "\n\t\t</div></li>";
+ }
+ $output .= "\n</ul>";
+
+ return $output;
+ }
+
+
+ /**
+ * Add the wrapper html around the thumb's caption
+ *
+ * @param String $galleryText The caption
+ * @param MediaTransformOutput|boolean $thumb The thumb this caption is for or false for bad image.
+ */
+ protected function wrapGalleryText( $galleryText, $thumb ) {
+ # ATTENTION: The newline after <div class="gallerytext"> is needed to accommodate htmltidy which
+ # in version 4.8.6 generated crackpot html in its absence, see:
+ # http://bugzilla.wikimedia.org/show_bug.cgi?id=1765 -Ævar
+
+ return "\n\t\t\t" . '<div class="gallerytext">' . "\n"
+ . $galleryText
+ . "\n\t\t\t</div>";
+ }
+
+ /**
+ * How much padding such the thumb have between image and inner div that
+ * that contains the border. This is both for verical and horizontal
+ * padding. (However, it is cut in half in the vertical direction).
+ * @return int
+ */
+ protected function getThumbPadding() {
+ return 30;
+ }
+
+ /**
+ *
+ * @note GB stands for gallerybox (as in the <li class="gallerybox"> element)
+ *
+ * @return int
+ */
+ protected function getGBPadding() {
+ return 5;
+ }
+
+ /**
+ * Get how much extra space the borders around the image takes up.
+ *
+ * For this mode, it is 2px borders on each side + 2px implied padding on
+ * each side from the stylesheet, giving us 2*2+2*2 = 8.
+ * @return int
+ */
+ protected function getGBBorders() {
+ return 8;
+ }
+
+ /**
+ * Get total padding.
+ *
+ * @return int How many pixels of whitespace surround the thumbnail.
+ */
+ protected function getAllPadding() {
+ return $this->getThumbPadding() + $this->getGBPadding() + $this->getGBBorders();
+ }
+
+ /**
+ * Get vertical padding for a thumbnail
+ *
+ * Generally this is the total height minus how high the thumb is.
+ *
+ * @param int $boxHeight How high we want the box to be.
+ * @param int $thumbHeight How high the thumbnail is.
+ * @return int How many vertical padding to add on each side.
+ */
+ protected function getVPad( $boxHeight, $thumbHeight ) {
+ return ( $this->getThumbPadding() + $boxHeight - $thumbHeight ) / 2;
+ }
+
+ /**
+ * Get the transform parameters for a thumbnail.
+ *
+ * @param File $img The file in question. May be false for invalid image
+ */
+ protected function getThumbParams( $img ) {
+ return array(
+ 'width' => $this->mWidths,
+ 'height' => $this->mHeights
+ );
+ }
+
+ /**
+ * Get the width of the inner div that contains the thumbnail in
+ * question. This is the div with the class of "thumb".
+ *
+ * @param int $thumbWidth The width of the thumbnail.
+ * @return int Width of inner thumb div.
+ */
+ protected function getThumbDivWidth( $thumbWidth ) {
+ return $this->mWidths + $this->getThumbPadding();
+ }
+
+ /**
+ * Width of gallerybox <li>.
+ *
+ * Generally is the width of the image, plus padding on image
+ * plus padding on gallerybox.
+ *
+ * @note Important: parameter will be false if no thumb used.
+ * @param Mixed $thumb MediaTransformObject object or false.
+ * @return int width of gallerybox element
+ */
+ protected function getGBWidth( $thumb ) {
+ return $this->mWidths + $this->getThumbPadding() + $this->getGBPadding();
+ }
+
+ /**
+ * Get a list of modules to include in the page.
+ *
+ * Primarily intended for subclasses.
+ *
+ * @return Array modules to include
+ */
+ protected function getModules() {
+ return array();
+ }
+
+ /**
+ * Adjust the image parameters for a thumbnail.
+ *
+ * Used by a subclass to insert extra high resolution images.
+ * @param MediaTransformOutput $thumb The thumbnail
+ * @param Array $imageParameters Array of options
+ */
+ protected function adjustImageParameters( $thumb, &$imageParameters ) { }
+}
+
+/**
+ * Backwards compatibility. This always uses traditional mode
+ * if called the old way, for extensions that may expect traditional
+ * mode.
+ *
+ * @deprecated 1.22 Use ImageGalleryBase::factory instead.
+ */
+class ImageGallery extends TraditionalImageGallery {
+ function __construct( $mode = 'traditional' ) {
+ wfDeprecated( __METHOD__, '1.22' );
+ parent::__construct( $mode );
+ }
+}
diff --git a/includes/installer/CliInstaller.php b/includes/installer/CliInstaller.php
index bb7e8776..f944fbed 100644
--- a/includes/installer/CliInstaller.php
+++ b/includes/installer/CliInstaller.php
@@ -114,7 +114,7 @@ class CliInstaller extends Installer {
*/
public function execute() {
$vars = Installer::getExistingLocalSettings();
- if( $vars ) {
+ if ( $vars ) {
$this->showStatusMessage(
Status::newFatal( "config-localsettings-cli-upgrade" )
);
@@ -137,6 +137,8 @@ class CliInstaller extends Installer {
}
public function startStage( $step ) {
+ // Messages: config-install-database, config-install-tables, config-install-interwiki,
+ // config-install-stats, config-install-keys, config-install-sysop, config-install-mainpage
$this->showMessage( "config-install-$step" );
}
@@ -166,6 +168,7 @@ class CliInstaller extends Installer {
$text = wfMessage( $msg, $params )->parse();
$text = preg_replace( '/<a href="(.*?)".*?>(.*?)<\/a>/', '$2 &lt;$1&gt;', $text );
+
return html_entity_decode( strip_tags( $text ), ENT_QUOTES );
}
@@ -195,15 +198,17 @@ class CliInstaller extends Installer {
if ( !$this->specifiedScriptPath ) {
$this->showMessage( 'config-no-cli-uri', $this->getVar( "wgScriptPath" ) );
}
+
return parent::envCheckPath();
}
protected function envGetDefaultServer() {
- return $this->getVar( 'wgServer' );
+ return null; // Do not guess if installing from CLI
}
public function dirIsExecutable( $dir, $url ) {
$this->showMessage( 'config-no-cli-uploads-check', $dir );
+
return false;
}
}
diff --git a/includes/installer/DatabaseInstaller.php b/includes/installer/DatabaseInstaller.php
index 3472b7ff..0110ac52 100644
--- a/includes/installer/DatabaseInstaller.php
+++ b/includes/installer/DatabaseInstaller.php
@@ -32,7 +32,7 @@ abstract class DatabaseInstaller {
/**
* The Installer object.
*
- * TODO: naming this parent is confusing, 'installer' would be clearer.
+ * @todo Naming this parent is confusing, 'installer' would be clearer.
*
* @var WebInstaller
*/
@@ -158,6 +158,7 @@ abstract class DatabaseInstaller {
$this->db->clearFlag( DBO_TRX );
$this->db->commit( __METHOD__ );
}
+
return $status;
}
@@ -173,9 +174,10 @@ abstract class DatabaseInstaller {
}
$this->db->selectDB( $this->getVar( 'wgDBname' ) );
- if( $this->db->tableExists( 'archive', __METHOD__ ) ) {
+ if ( $this->db->tableExists( 'archive', __METHOD__ ) ) {
$status->warning( 'config-install-tables-exist' );
$this->enableLB();
+
return $status;
}
@@ -183,7 +185,7 @@ abstract class DatabaseInstaller {
$this->db->begin( __METHOD__ );
$error = $this->db->sourceFile( $this->db->getSchemaPath() );
- if( $error !== true ) {
+ if ( $error !== true ) {
$this->db->reportQueryError( $error, 0, '', __METHOD__ );
$this->db->rollback( __METHOD__ );
$status->fatal( 'config-install-tables-failed', $error );
@@ -191,9 +193,10 @@ abstract class DatabaseInstaller {
$this->db->commit( __METHOD__ );
}
// Resume normal operations
- if( $status->isOk() ) {
+ if ( $status->isOk() ) {
$this->enableLB();
}
+
return $status;
}
@@ -279,6 +282,7 @@ abstract class DatabaseInstaller {
}
$up->purgeCache();
ob_end_flush();
+
return $ret;
}
@@ -288,14 +292,12 @@ abstract class DatabaseInstaller {
* 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() {
-
}
/**
@@ -319,15 +321,11 @@ abstract class DatabaseInstaller {
* Convenience function.
* Check if a named extension is present.
*
- * @see wfDl
* @param $name
* @return bool
*/
protected static function checkExtension( $name ) {
- wfSuppressWarnings();
- $compiled = wfDl( $name );
- wfRestoreWarnings();
- return $compiled;
+ return extension_loaded( $name );
}
/**
@@ -335,6 +333,8 @@ abstract class DatabaseInstaller {
* @return String
*/
public function getReadableName() {
+ // Messages: config-type-mysql, config-type-postgres, config-type-sqlite,
+ // config-type-oracle
return wfMessage( 'config-type-' . $this->getName() )->text();
}
@@ -369,6 +369,7 @@ abstract class DatabaseInstaller {
} elseif ( isset( $internal[$var] ) ) {
$default = $internal[$var];
}
+
return $this->parent->getVar( $var, $default );
}
@@ -396,6 +397,7 @@ abstract class DatabaseInstaller {
if ( !isset( $attribs ) ) {
$attribs = array();
}
+
return $this->parent->getTextBox( array(
'var' => $var,
'label' => $label,
@@ -422,6 +424,7 @@ abstract class DatabaseInstaller {
if ( !isset( $attribs ) ) {
$attribs = array();
}
+
return $this->parent->getPasswordBox( array(
'var' => $var,
'label' => $label,
@@ -440,6 +443,7 @@ abstract class DatabaseInstaller {
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,
@@ -447,7 +451,7 @@ abstract class DatabaseInstaller {
'controlName' => $name,
'value' => $value,
'help' => $helpData
- ));
+ ) );
}
/**
@@ -466,6 +470,7 @@ abstract class DatabaseInstaller {
public function getRadioSet( $params ) {
$params['controlName'] = $this->getName() . '_' . $params['var'];
$params['value'] = $this->getVar( $params['var'] );
+
return $this->parent->getRadioSet( $params );
}
@@ -499,7 +504,9 @@ abstract class DatabaseInstaller {
if ( !$this->db->selectDB( $this->getVar( 'wgDBname' ) ) ) {
return false;
}
- return $this->db->tableExists( 'cur', __METHOD__ ) || $this->db->tableExists( 'revision', __METHOD__ );
+
+ return $this->db->tableExists( 'cur', __METHOD__ ) ||
+ $this->db->tableExists( 'revision', __METHOD__ );
}
/**
@@ -508,11 +515,20 @@ abstract class DatabaseInstaller {
* @return String
*/
public function getInstallUserBox() {
- return
- Html::openElement( 'fieldset' ) .
+ return Html::openElement( 'fieldset' ) .
Html::element( 'legend', array(), wfMessage( 'config-db-install-account' )->text() ) .
- $this->getTextBox( '_InstallUser', 'config-db-username', array( 'dir' => 'ltr' ), $this->parent->getHelpBox( 'config-db-install-username' ) ) .
- $this->getPasswordBox( '_InstallPassword', 'config-db-password', array( 'dir' => 'ltr' ), $this->parent->getHelpBox( 'config-db-install-password' ) ) .
+ $this->getTextBox(
+ '_InstallUser',
+ 'config-db-username',
+ array( 'dir' => 'ltr' ),
+ $this->parent->getHelpBox( 'config-db-install-username' )
+ ) .
+ $this->getPasswordBox(
+ '_InstallPassword',
+ 'config-db-password',
+ array( 'dir' => 'ltr' ),
+ $this->parent->getHelpBox( 'config-db-install-password' )
+ ) .
Html::closeElement( 'fieldset' );
}
@@ -522,6 +538,7 @@ abstract class DatabaseInstaller {
*/
public function submitInstallUserBox() {
$this->setVarsFromRequest( array( '_InstallUser', '_InstallPassword' ) );
+
return Status::newGood();
}
@@ -550,6 +567,7 @@ abstract class DatabaseInstaller {
$s .= $this->getCheckBox( '_CreateDBAccount', 'config-db-web-create' );
}
$s .= Html::closeElement( 'div' ) . Html::closeElement( 'fieldset' );
+
return $s;
}
@@ -568,7 +586,7 @@ abstract class DatabaseInstaller {
$this->setVar( 'wgDBpassword', $this->getVar( '_InstallPassword' ) );
}
- if( $this->getVar( '_CreateDBAccount' ) && strval( $this->getVar( 'wgDBpassword' ) ) == '' ) {
+ if ( $this->getVar( '_CreateDBAccount' ) && strval( $this->getVar( 'wgDBpassword' ) ) == '' ) {
return Status::newFatal( 'config-db-password-empty', $this->getVar( 'wgDBuser' ) );
}
@@ -587,8 +605,9 @@ abstract class DatabaseInstaller {
}
$this->db->selectDB( $this->getVar( 'wgDBname' ) );
- if( $this->db->selectRow( 'interwiki', '*', array(), __METHOD__ ) ) {
+ if ( $this->db->selectRow( 'interwiki', '*', array(), __METHOD__ ) ) {
$status->warning( 'config-install-interwiki-exists' );
+
return $status;
}
global $IP;
@@ -600,9 +619,11 @@ abstract class DatabaseInstaller {
if ( !$rows ) {
return Status::newFatal( 'config-install-interwiki-list' );
}
- foreach( $rows as $row ) {
+ foreach ( $rows as $row ) {
$row = preg_replace( '/^\s*([^#]*?)\s*(#.*)?$/', '\\1', $row ); // strip comments - whee
- if ( $row == "" ) continue;
+ if ( $row == "" ) {
+ continue;
+ }
$row .= "||";
$interwikis[] = array_combine(
array( 'iw_prefix', 'iw_url', 'iw_local', 'iw_api', 'iw_wikiid' ),
@@ -610,6 +631,7 @@ abstract class DatabaseInstaller {
);
}
$this->db->insert( 'interwiki', $interwikis, __METHOD__ );
+
return Status::newGood();
}
diff --git a/includes/installer/DatabaseUpdater.php b/includes/installer/DatabaseUpdater.php
index 25f751c7..267b6c5a 100644
--- a/includes/installer/DatabaseUpdater.php
+++ b/includes/installer/DatabaseUpdater.php
@@ -21,7 +21,7 @@
* @ingroup Deployment
*/
-require_once( __DIR__ . '/../../maintenance/Maintenance.php' );
+require_once __DIR__ . '/../../maintenance/Maintenance.php';
/**
* Class for handling database updates. Roughly based off of updaters.inc, with
@@ -89,11 +89,6 @@ abstract class DatabaseUpdater {
protected $skipSchema = false;
/**
- * Hold the value of $wgContentHandlerUseDB during the upgrade.
- */
- protected $wgContentHandlerUseDB = true;
-
- /**
* Constructor
*
* @param $db DatabaseBase object to perform updates on
@@ -135,7 +130,8 @@ abstract class DatabaseUpdater {
}
/**
- * Loads LocalSettings.php, if needed, and initialises everything needed for LoadExtensionSchemaUpdates hook
+ * Loads LocalSettings.php, if needed, and initialises everything needed for
+ * LoadExtensionSchemaUpdates hook.
*/
private function loadExtensions() {
if ( !defined( 'MEDIAWIKI_INSTALL' ) ) {
@@ -162,8 +158,9 @@ abstract class DatabaseUpdater {
*/
public static function newForDB( &$db, $shared = false, $maintenance = null ) {
$type = $db->getType();
- if( in_array( $type, Installer::getDBTypes() ) ) {
+ 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' );
@@ -189,7 +186,7 @@ abstract class DatabaseUpdater {
return;
}
global $wgCommandLineMode;
- if( !$wgCommandLineMode ) {
+ if ( !$wgCommandLineMode ) {
$str = htmlspecialchars( $str );
}
echo $str;
@@ -293,11 +290,22 @@ abstract class DatabaseUpdater {
* @param string $tableName The table name
* @param string $oldIndexName The old index name
* @param string $newIndexName The new index name
- * @param $skipBothIndexExistWarning Boolean: Whether to warn if both the old and the new indexes exist. [facultative; by default, false]
+ * @param $skipBothIndexExistWarning Boolean: Whether to warn if both the old
+ * and the new indexes exist. [facultative; by default, false]
* @param string $sqlPath The path to the SQL change path
*/
- public function renameExtensionIndex( $tableName, $oldIndexName, $newIndexName, $sqlPath, $skipBothIndexExistWarning = false ) {
- $this->extensionUpdates[] = array( 'renameIndex', $tableName, $oldIndexName, $newIndexName, $skipBothIndexExistWarning, $sqlPath, true );
+ public function renameExtensionIndex( $tableName, $oldIndexName, $newIndexName,
+ $sqlPath, $skipBothIndexExistWarning = false
+ ) {
+ $this->extensionUpdates[] = array(
+ 'renameIndex',
+ $tableName,
+ $oldIndexName,
+ $newIndexName,
+ $skipBothIndexExistWarning,
+ $sqlPath,
+ true
+ );
}
/**
@@ -307,7 +315,7 @@ abstract class DatabaseUpdater {
* @param string $fieldName The field to be modified
* @param string $sqlPath The path to the SQL change path
*/
- public function modifyExtensionField( $tableName, $fieldName, $sqlPath) {
+ public function modifyExtensionField( $tableName, $fieldName, $sqlPath ) {
$this->extensionUpdates[] = array( 'modifyField', $tableName, $fieldName, $sqlPath, true );
}
@@ -362,7 +370,7 @@ abstract class DatabaseUpdater {
$updates = $this->updatesSkipped;
$this->updatesSkipped = array();
- foreach( $updates as $funcList ) {
+ foreach ( $updates as $funcList ) {
$func = $funcList[0];
$arg = $funcList[1];
$origParams = $funcList[2];
@@ -378,7 +386,7 @@ abstract class DatabaseUpdater {
* @param array $what what updates to perform
*/
public function doUpdates( $what = array( 'core', 'extensions', 'stats' ) ) {
- global $wgVersion, $wgLocalisationCacheConf;
+ global $wgVersion;
$this->db->begin( __METHOD__ );
$what = array_flip( $what );
@@ -395,17 +403,9 @@ abstract class DatabaseUpdater {
$this->checkStats();
}
- if ( isset( $what['purge'] ) ) {
- $this->purgeCache();
-
- if ( $wgLocalisationCacheConf['manualRecache'] ) {
- $this->rebuildLocalisationCache();
- }
- }
-
$this->setAppliedUpdates( $wgVersion, $this->updates );
- if( $this->fileHandle ) {
+ if ( $this->fileHandle ) {
$this->skipSchema = false;
$this->writeSchemaUpdateFile();
$this->setAppliedUpdates( "$wgVersion-schema", $this->updatesSkipped );
@@ -427,14 +427,14 @@ abstract class DatabaseUpdater {
foreach ( $updates as $params ) {
$origParams = $params;
$func = array_shift( $params );
- if( !is_array( $func ) && method_exists( $this, $func ) ) {
+ if ( !is_array( $func ) && method_exists( $this, $func ) ) {
$func = array( $this, $func );
} elseif ( $passSelf ) {
array_unshift( $params, $this );
}
$ret = call_user_func_array( $func, $params );
flush();
- if( $ret !== false ) {
+ if ( $ret !== false ) {
$updatesDone[] = $origParams;
} else {
$updatesSkipped[] = array( $func, $params, $origParams );
@@ -450,7 +450,7 @@ abstract class DatabaseUpdater {
*/
protected function setAppliedUpdates( $version, $updates = array() ) {
$this->db->clearFlag( DBO_DDLMODE );
- if( !$this->canUseNewUpdatelog() ) {
+ if ( !$this->canUseNewUpdatelog() ) {
return;
}
$key = "updatelist-$version-" . time();
@@ -475,6 +475,7 @@ abstract class DatabaseUpdater {
array( 'ul_key' => $key ),
__METHOD__
);
+
return (bool)$row;
}
@@ -488,7 +489,7 @@ abstract class DatabaseUpdater {
public function insertUpdateRow( $key, $val = null ) {
$this->db->clearFlag( DBO_DDLMODE );
$values = array( 'ul_key' => $key );
- if( $val && $this->canUseNewUpdatelog() ) {
+ if ( $val && $this->canUseNewUpdatelog() ) {
$values['ul_value'] = $val;
}
$this->db->insert( 'updatelog', $values, __METHOD__, 'IGNORE' );
@@ -551,21 +552,21 @@ abstract class DatabaseUpdater {
foreach ( $wgExtNewFields as $fieldRecord ) {
$updates[] = array(
'addField', $fieldRecord[0], $fieldRecord[1],
- $fieldRecord[2], true
+ $fieldRecord[2], true
);
}
foreach ( $wgExtNewIndexes as $fieldRecord ) {
$updates[] = array(
'addIndex', $fieldRecord[0], $fieldRecord[1],
- $fieldRecord[2], true
+ $fieldRecord[2], true
);
}
foreach ( $wgExtModifiedFields as $fieldRecord ) {
$updates[] = array(
'modifyField', $fieldRecord[0], $fieldRecord[1],
- $fieldRecord[2], true
+ $fieldRecord[2], true
);
}
@@ -605,9 +606,10 @@ abstract class DatabaseUpdater {
*/
public function appendLine( $line ) {
$line = rtrim( $line ) . ";\n";
- if( fwrite( $this->fileHandle, $line ) === false ) {
+ if ( fwrite( $this->fileHandle, $line ) === false ) {
throw new MWException( "trouble writing file" );
}
+
return false;
}
@@ -625,6 +627,7 @@ abstract class DatabaseUpdater {
}
if ( $this->skipSchema ) {
$this->output( "...skipping schema change ($msg).\n" );
+
return false;
}
@@ -633,12 +636,13 @@ abstract class DatabaseUpdater {
if ( !$isFullPath ) {
$path = $this->db->patchPath( $path );
}
- if( $this->fileHandle !== null ) {
+ if ( $this->fileHandle !== null ) {
$this->copyFile( $path );
} else {
$this->db->sourceFile( $path );
}
$this->output( "done.\n" );
+
return true;
}
@@ -660,6 +664,7 @@ abstract class DatabaseUpdater {
} else {
return $this->applyPatch( $patch, $fullpath, "Creating $name table" );
}
+
return true;
}
@@ -684,6 +689,7 @@ abstract class DatabaseUpdater {
} else {
return $this->applyPatch( $patch, $fullpath, "Adding $field field to table $table" );
}
+
return true;
}
@@ -703,11 +709,12 @@ abstract class DatabaseUpdater {
if ( !$this->db->tableExists( $table, __METHOD__ ) ) {
$this->output( "...skipping: '$table' table doesn't exist yet.\n" );
- } else if ( $this->db->indexExists( $table, $index, __METHOD__ ) ) {
+ } elseif ( $this->db->indexExists( $table, $index, __METHOD__ ) ) {
$this->output( "...index $index already set on $table table.\n" );
} else {
return $this->applyPatch( $patch, $fullpath, "Adding index $index to table $table" );
}
+
return true;
}
@@ -730,6 +737,7 @@ abstract class DatabaseUpdater {
} else {
$this->output( "...$table table does not contain $field field.\n" );
}
+
return true;
}
@@ -752,6 +760,7 @@ abstract class DatabaseUpdater {
} else {
$this->output( "...$index key doesn't exist.\n" );
}
+
return true;
}
@@ -761,12 +770,15 @@ abstract class DatabaseUpdater {
* @param string $table Name of the table to modify
* @param string $oldIndex Old name of the index
* @param string $newIndex New name of the index
- * @param $skipBothIndexExistWarning Boolean: Whether to warn if both the old and the new indexes exist.
+ * @param $skipBothIndexExistWarning Boolean: Whether to warn if both the
+ * old and the new indexes exist.
* @param string $patch Path to the patch file
* @param $fullpath Boolean: Whether to treat $patch path as a relative or not
* @return Boolean false if this was skipped because schema changes are skipped
*/
- protected function renameIndex( $table, $oldIndex, $newIndex, $skipBothIndexExistWarning, $patch, $fullpath = false ) {
+ protected function renameIndex( $table, $oldIndex, $newIndex,
+ $skipBothIndexExistWarning, $patch, $fullpath = false
+ ) {
if ( !$this->doTable( $table ) ) {
return true;
}
@@ -774,27 +786,37 @@ abstract class DatabaseUpdater {
// First requirement: the table must exist
if ( !$this->db->tableExists( $table, __METHOD__ ) ) {
$this->output( "...skipping: '$table' table doesn't exist yet.\n" );
+
return true;
}
// Second requirement: the new index must be missing
if ( $this->db->indexExists( $table, $newIndex, __METHOD__ ) ) {
$this->output( "...index $newIndex already set on $table table.\n" );
- if ( !$skipBothIndexExistWarning && $this->db->indexExists( $table, $oldIndex, __METHOD__ ) ) {
- $this->output( "...WARNING: $oldIndex still exists, despite it has been renamed into $newIndex (which also exists).\n" .
+ if ( !$skipBothIndexExistWarning &&
+ $this->db->indexExists( $table, $oldIndex, __METHOD__ )
+ ) {
+ $this->output( "...WARNING: $oldIndex still exists, despite it has " .
+ "been renamed into $newIndex (which also exists).\n" .
" $oldIndex should be manually removed if not needed anymore.\n" );
}
+
return true;
}
// Third requirement: the old index must exist
if ( !$this->db->indexExists( $table, $oldIndex, __METHOD__ ) ) {
$this->output( "...skipping: index $oldIndex doesn't exist.\n" );
+
return true;
}
// Requirements have been satisfied, patch can be applied
- return $this->applyPatch( $patch, $fullpath, "Renaming index $oldIndex into $newIndex to table $table" );
+ return $this->applyPatch(
+ $patch,
+ $fullpath,
+ "Renaming index $oldIndex into $newIndex to table $table"
+ );
}
/**
@@ -820,13 +842,13 @@ abstract class DatabaseUpdater {
$this->output( "$msg ..." );
$this->db->dropTable( $table, __METHOD__ );
$this->output( "done.\n" );
- }
- else {
+ } else {
return $this->applyPatch( $patch, $fullpath, $msg );
}
} else {
$this->output( "...$table doesn't exist.\n" );
}
+
return true;
}
@@ -848,13 +870,16 @@ abstract class DatabaseUpdater {
if ( !$this->db->tableExists( $table, __METHOD__ ) ) {
$this->output( "...$table table does not exist, skipping modify field patch.\n" );
} elseif ( !$this->db->fieldExists( $table, $field, __METHOD__ ) ) {
- $this->output( "...$field field does not exist in $table table, skipping modify field patch.\n" );
- } elseif( $this->updateRowExists( $updateKey ) ) {
+ $this->output( "...$field field does not exist in $table table, " .
+ "skipping modify field patch.\n" );
+ } elseif ( $this->updateRowExists( $updateKey ) ) {
$this->output( "...$field in table $table already modified by patch $patch.\n" );
} else {
$this->insertUpdateRow( $updateKey );
+
return $this->applyPatch( $patch, $fullpath, "Modifying $field field of table $table" );
}
+
return true;
}
@@ -886,6 +911,7 @@ abstract class DatabaseUpdater {
$this->output( "missing ss_total_pages, rebuilding...\n" );
} else {
$this->output( "done.\n" );
+
return;
}
SiteStatsInit::doAllAndCommit( $this->db );
@@ -917,9 +943,10 @@ abstract class DatabaseUpdater {
protected function doLogUsertextPopulation() {
if ( !$this->updateRowExists( 'populate log_usertext' ) ) {
$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" );
+ "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 = $this->maintenance->runChild( 'PopulateLogUsertext' );
$task->execute();
@@ -949,6 +976,7 @@ abstract class DatabaseUpdater {
protected function doUpdateTranscacheField() {
if ( $this->updateRowExists( 'convert transcache field' ) ) {
$this->output( "...transcache tc_time already converted.\n" );
+
return true;
}
@@ -967,9 +995,11 @@ abstract class DatabaseUpdater {
'COUNT(*)',
'cl_collation != ' . $this->db->addQuotes( $wgCategoryCollation ),
__METHOD__
- ) == 0 ) {
- $this->output( "...collations up-to-date.\n" );
- return;
+ ) == 0
+ ) {
+ $this->output( "...collations up-to-date.\n" );
+
+ return;
}
$this->output( "Updating category collations..." );
@@ -983,7 +1013,7 @@ abstract class DatabaseUpdater {
* Migrates user options from the user table blob to user_properties
*/
protected function doMigrateUserOptions() {
- if( $this->db->tableExists( 'user_properties' ) ) {
+ if ( $this->db->tableExists( 'user_properties' ) ) {
$cl = $this->maintenance->runChild( 'ConvertUserOptions', 'convertUserOptions.php' );
$cl->execute();
$this->output( "done.\n" );
@@ -1003,30 +1033,4 @@ abstract class DatabaseUpdater {
$cl->execute();
$this->output( "done.\n" );
}
-
- /**
- * Turns off content handler fields during parts of the upgrade
- * where they aren't available.
- */
- protected function disableContentHandlerUseDB() {
- global $wgContentHandlerUseDB;
-
- if( $wgContentHandlerUseDB ) {
- $this->output( "Turning off Content Handler DB fields for this part of upgrade.\n" );
- $this->holdContentHandlerUseDB = $wgContentHandlerUseDB;
- $wgContentHandlerUseDB = false;
- }
- }
-
- /**
- * Turns content handler fields back on.
- */
- protected function enableContentHandlerUseDB() {
- global $wgContentHandlerUseDB;
-
- if( $this->holdContentHandlerUseDB ) {
- $this->output( "Content Handler DB fields should be usable now.\n" );
- $wgContentHandlerUseDB = $this->holdContentHandlerUseDB;
- }
- }
}
diff --git a/includes/installer/InstallDocFormatter.php b/includes/installer/InstallDocFormatter.php
index a508e24c..6d3819cd 100644
--- a/includes/installer/InstallDocFormatter.php
+++ b/includes/installer/InstallDocFormatter.php
@@ -23,6 +23,7 @@
class InstallDocFormatter {
static function format( $text ) {
$obj = new self( $text );
+
return $obj->execute();
}
@@ -33,8 +34,8 @@ class InstallDocFormatter {
protected function execute() {
$text = $this->text;
// Use Unix line endings, escape some wikitext stuff
- $text = str_replace( array( '<', '{{', '[[', "\r" ),
- array( '&lt;', '&#123;&#123;', '&#91;&#91;', '' ), $text );
+ $text = str_replace( array( '<', '{{', '[[', '__', "\r" ),
+ array( '&lt;', '&#123;&#123;', '&#91;&#91;', '&#95;&#95;', '' ), $text );
// join word-wrapped lines into one
do {
$prev = $text;
@@ -46,7 +47,12 @@ class InstallDocFormatter {
// 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 );
+ $text = preg_replace_callback(
+ '/(\$wg[a-z0-9_]+)/i',
+ array( $this, 'replaceConfigLinks' ),
+ $text
+ );
+
return $text;
}
diff --git a/includes/installer/Installer.i18n.php b/includes/installer/Installer.i18n.php
index 85b877a8..edf5ff25 100644
--- a/includes/installer/Installer.i18n.php
+++ b/includes/installer/Installer.i18n.php
@@ -63,8 +63,8 @@ Check your php.ini and make sure <code>session.save_path</code> is set to an app
'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.",
+Basic checks will now be performed to see if this environment is suitable for MediaWiki installation.
+Remember to include this information if you seek support on how to complete the installation.",
'config-copyright' => "=== Copyright and Terms ===
$1
@@ -134,6 +134,10 @@ MediaWiki requires UTF-8 support to function correctly.",
This is probably too low.
The installation may fail!",
'config-ctype' => "'''Fatal:''' PHP must be compiled with support for the [http://www.php.net/manual/en/ctype.installation.php Ctype extension].",
+ 'config-json' => "'''Fatal:''' PHP was compiled without JSON support.
+You must install either the PHP JSON extension or the [http://pecl.php.net/package/jsonc PECL jsonc] extension before installing MediaWiki.
+* The PHP extension is included in Red Hat Enterprise Linux (CentOS) 5 and 6, though must be enabled in <code>/etc/php.ini</code> or <code>/etc/php.d/json.ini</code>.
+* Some Linux distributions released after May 2013 omit the PHP extension, instead packaging the PECL extension as <code>php5-json</code> or <code>php-pecl-jsonc</code>.",
'config-xcache' => '[http://xcache.lighttpd.net/ XCache] is installed',
'config-apc' => '[http://www.php.net/apc APC] is installed',
'config-wincache' => '[http://www.iis.net/download/WinCacheForPhp WinCache] is installed',
@@ -142,6 +146,8 @@ Object caching is not enabled.",
'config-mod-security' => "'''Warning:''' Your web server has [http://modsecurity.org/ mod_security] enabled. If misconfigured, it can cause problems for MediaWiki or other software that allows users to post arbitrary content.
Refer to [http://modsecurity.org/documentation/ mod_security documentation] or contact your host's support if you encounter random errors.",
'config-diff3-bad' => 'GNU diff3 not found.',
+ 'config-git' => 'Found the Git version control software: <code>$1</code>.',
+ 'config-git-bad' => 'Git version control software 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.
@@ -259,7 +265,7 @@ If you do not see the database system you are trying to use listed below, then f
'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 (.).',
+Use either "TNS Name" or an "Easy Connect" string ([http://docs.oracle.com/cd/E11882_01/network.112/e10836/naming.htm Oracle Naming Methods])',
'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".
@@ -315,7 +321,7 @@ 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 <code>LocalSettings.php</code> →',
+ 'config-regenerate' => 'Regenerate LocalSettings.php →',
'config-show-table-status' => '<code>SHOW TABLE STATUS</code> query failed!',
'config-unknown-collation' => "'''Warning:''' Database is using unrecognized collation.",
'config-db-web-account' => 'Database account for web access',
@@ -334,6 +340,12 @@ The account you specify here must already exist.',
If your MySQL installation supports InnoDB, it is highly recommended that you choose that instead.
If your MySQL installation does not support InnoDB, maybe it's time for an upgrade.",
+ 'config-mysql-only-myisam-dep' => "'''Warning:''' MyISAM is the only available storage engine for MySQL, which is not recommended for use with MediaWiki, because:
+* it barely supports concurrency due to table locking
+* it is more prone to corruption than other engines
+* the MediaWiki codebase does not always handle MyISAM as it should
+
+Your MySQL installation does not support InnoDB, maybe it's time for an upgrade.",
'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.
@@ -550,6 +562,9 @@ When that has been done, you can '''[$2 enter your wiki]'''.",
'config-download-localsettings' => 'Download <code>LocalSettings.php</code>',
'config-help' => 'help',
'config-nofile' => 'File "$1" could not be found. Has it been deleted?',
+ 'config-extension-link' => 'Did you know that your wiki supports [//www.mediawiki.org/wiki/Manual:Extensions extensions]?
+
+You can browse [//www.mediawiki.org/wiki/Category:Extensions_by_category extensions by category] or the [//www.mediawiki.org/wiki/Extension_Matrix Extension Matrix] to see the full list of extensions.',
'mainpagetext' => "'''MediaWiki has been successfully installed.'''",
'mainpagedocfooter' => "Consult the [//meta.wikimedia.org/wiki/Help:Contents User's Guide] for information on using the wiki software.
@@ -576,9 +591,10 @@ When that has been done, you can '''[$2 enter your wiki]'''.",
* @author Shirayuki
* @author Siebrand
* @author Umherirrender
+ * @author Waldir
*/
$messages['qqq'] = array(
- 'config-desc' => '{{desc}}',
+ 'config-desc' => 'Short description of the installer.',
'config-title' => 'Parameters:
* $1 is the version of MediaWiki that is being installed.',
'config-information' => '{{Identical|Information}}',
@@ -604,16 +620,32 @@ Used as error message.',
'config-page-name' => '{{Identical|Name}}',
'config-page-options' => '{{Identical|Options}}',
'config-page-install' => '{{Identical|Install}}',
+ 'config-page-complete' => '{{Identical|Complete}}',
+ 'config-page-releasenotes' => '{{Identical|Release notes}}',
'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-copyright' => 'This message follows {{msg-mw|config-env-good}}.
+
+Parameters:
+* $1 - copyright and author list',
'config-sidebar' => 'Maximum width for words is 24 characters. Only visible part of the translation counts to this limit.',
'config-env-php' => 'Parameters:
-* $1 is the version of PHP that has been installed.',
+* $1 - the version of PHP that has been installed
+See also:
+* {{msg-mw|config-env-php-toolow}}',
+ 'config-env-php-toolow' => 'Parameters:
+* $1 - the version of PHP that has been installed
+* $2 - minimum PHP version number
+See also:
+* {{msg-mw|config-env-php}}',
'config-unicode-pure-php-warning' => 'PECL is the name of a group producing standard pieces of software for PHP, and intl is the name of their library handling some aspects of internationalization.',
'config-unicode-update-warning' => "ICU is a body producing standard software tools for support of Unicode and other internationalization aspects. This message warns the system administrator installing MediaWiki that the server's software is not up-to-date and MediaWiki will have problems handling some characters.",
'config-no-db' => '{{doc-important|Do not translate "<code>./configure --with-mysql</code>" and "<code>php5-mysql</code>".}}
Parameters:
* $1 is comma separated list of database types supported by MediaWiki.',
+ 'config-outdated-sqlite' => 'Used as warning. Parameters:
+* $1 - the version of SQLite that has been installed
+* $2 - minimum version',
'config-no-fts3' => 'A "[[:wikipedia:Front and back ends|backend]]" is a system or component that ordinary users don\'t interact with directly and don\'t need to know about, and that is responsible for a distinct task or service - for example, a storage back-end is a generic system for storing data which other applications can use. Possible alternatives for back-end are "system" or "service", or (depending on context and language) even leave it untranslated.',
'config-magic-quotes-runtime' => '{{Related|Config-fatal}}',
'config-magic-quotes-sybase' => '{{Related|Config-fatal}}',
@@ -628,22 +660,46 @@ Parameters:
'config-memory-bad' => 'Parameters:
* $1 is the configured <code>memory_limit</code>.',
'config-ctype' => 'Message if support for [http://www.php.net/manual/en/ctype.installation.php Ctype] is missing from PHP',
+ 'config-json' => 'Message if support for [[wikipedia:JSON|JSON]] is missing from PHP.
+* "[[wikipedia:Red Hat Enterprise Linux|Red Hat Enterprise Linux]]" (RHEL) and "[[wikipedia:CentOS|CentOS]]" refer to two almost-identical Linux distributions. "5 and 6" refers to version 5 or 6 of either distribution. Because RHEL 7 likely will not include the PHP extension, do not translate as "5 or newer".
+* "The [http://www.php.net/json PHP extension]" is the JSON extension included with PHP 5.2 and newer.
+* "The [http://pecl.php.net/package/jsonc PECL extension]" is based on the PHP extension, though excludes code some distributions have found unacceptable (see [[bugzilla:47431]]).',
'config-xcache' => 'Message indicates if this program is available',
'config-apc' => 'Message indicates if this program is available',
'config-wincache' => 'Message indicates if this program is available',
+ 'config-git' => 'Message if Git version control software is available.
+Parameter:
+* $1 is the <code>Git</code> executable file name.',
+ 'config-git-bad' => 'Message if Git version control software is not found.',
'config-imagemagick' => '$1 is ImageMagick\'s <code>convert</code> executable file name.
Add dir="ltr" to the <nowiki><code></nowiki> for right-to-left languages.',
'config-no-cli-uri' => 'Parameters:
* $1 is the default value for scriptpath.',
+ 'config-using-server' => 'Used as a part of environment check result. Parameters:
+* $1 - default server name',
+ 'config-using-uri' => 'Used as a part of environment check result. Parameters:
+* $1 - server name
+* $2 - script path',
+ 'config-uploads-not-safe' => 'Used as a part of environment check result. Parameters:
+* $1 - name of directory for images: <code>$IP/images/</code>',
'config-no-cli-uploads-check' => 'CLI = [[w:Command-line interface|command-line interface]] (i.e. the installer runs as a command-line script, not using HTML interface via an internet browser)',
+ 'config-using531' => 'Used as error message. Parameters:
+* $1 - the version of PHP that has been installed',
'config-suhosin-max-value-length' => '{{doc-important|Do not translate "length", "suhosin.get.max_value_length", "php.ini", "$wgResourceLoaderMaxQueryLength" and "LocalSettings.php".}}
Message shown when PHP parameter <code>suhosin.get.max_value_length</code> is between 0 and 1023 (that max value is hard set in MediaWiki software).',
'config-db-host-help' => '{{doc-singularthey}}',
'config-db-host-oracle' => 'TNS = [[:wikipedia:Transparent Network Substrate|Transparent Network Substrate]] (<== wikipedia link)',
+ 'config-db-host-oracle-help' => 'See also:
+* {{msg-mw|Config-invalid-db-server-oracle}}',
'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-oracle-warn' => 'A "[[:wikipedia:Front and back ends|backend]]" is a system or component that ordinary users don\'t interact with directly and don\'t need to know about, and that is responsible for a distinct task or service - for example, a storage back-end is a generic system for storing data which other applications can use. Possible alternatives for back-end are "system" or "service", or (depending on context and language) even leave it untranslated.',
+ 'config-db-password-empty' => 'Used as error message. Parameters:
+* $1 - database username',
'config-db-account-lock' => "It might be easier to translate ''normal operation'' as \"also after the installation process\"",
+ 'config-mysql-old' => 'Used as error message. Parameters:
+* $1 - minimum version
+* $2 - the version of MySQL that has been installed',
'config-pg-test-error' => '* $1 - database name
* $2 - error message',
'config-sqlite-dir-help' => '{{doc-important|Do not translate <code>.htaccess</code> and <code>/var/lib/mediawiki/yourwiki</code>.}}
@@ -662,20 +718,105 @@ Used in help box.',
* $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-invalid-db-server-oracle' => 'Used as error message. Parameters:
+* $1 - database server name
+See also:
+* {{msg-mw|Config-db-host-oracle-help}}',
+ 'config-invalid-db-name' => 'Used as error message. Parameters:
+* $1 - database name
+See also:
+* {{msg-mw|Config-invalid-db-prefix}}',
+ 'config-invalid-db-prefix' => 'Used as error message. Parameters:
+* $1 - database prefix
+See also:
+* {{msg-mw|Config-invalid-db-name}}',
'config-connection-error' => '$1 is the external error from the database, such as "DB connection error: Access denied for user \'dba\'@\'localhost\' (using password: YES) (localhost)."
If you\'re translating this message to a right-to-left language, consider writing <nowiki><div dir="ltr">$1.</div></nowiki>. (When the bidi features for HTML5 will be implemented in the browsers, it will probably be a good idea to write it as <nowiki><div dir="auto">$1.</div></nowiki>.)',
'config-invalid-schema' => '*$1 - schema name',
+ 'config-db-sys-user-exists-oracle' => 'Used as error message. Parameters:
+* $1 - database username',
+ 'config-postgres-old' => 'Used as error message. Used as warning. Parameters:
+* $1 - minimum version
+* $2 - the version of PostgreSQL that has been installed',
+ 'config-sqlite-parent-unwritable-group' => 'Used as SQLite error message. Parameters:
+* $1 - data directory
+* $2 - "dirname" part of $1
+* $3 - "basename" part of $1
+* $4 - web server\'s primary group name
+See also:
+* {{msg-mw|Config-sqlite-parent-unwritable-nogroup}}',
+ 'config-sqlite-parent-unwritable-nogroup' => 'Used as SQLite error message. Parameters:
+* $1 - data directory
+* $2 - "dirname" part of $1
+* $3 - "basename" part of $1
+See also:
+* {{msg-mw|Config-sqlite-parent-unwritable-group}}',
+ 'config-sqlite-mkdir-error' => 'Used as SQLite error message. Parameters:
+* $1 - data directory name',
'config-sqlite-dir-unwritable' => 'webserver refers to a software like Apache or Lighttpd.',
+ 'config-sqlite-connection-error' => 'Used as SQLite error message. Parameters:
+* $1 - error message which SQLite server returned',
+ 'config-sqlite-readonly' => 'Used as SQLite error message. Parameters:
+* $1 - filename',
+ 'config-sqlite-cant-create-db' => 'Used as SQLite error message. Parameters:
+* $1 - filename',
'config-can-upgrade' => 'Parameters:
* $1 - Version or Revision indicator.',
+ 'config-upgrade-done' => 'Used as success message. Parameters:
+* $1 - full URL of index.php
+See also:
+* {{msg-mw|config-upgrade-done-no-regenerate}}',
+ 'config-upgrade-done-no-regenerate' => 'Used as success message. Parameters:
+* $1 - full URL of index.php
+See also:
+* {{msg-mw|config-upgrade-done}}',
+ 'config-regenerate' => 'This message appears in a button after LocalSettings.php is generated and downloaded at the end of the MediaWiki installation process.',
'config-show-table-status' => '{{doc-important|"<code>SHOW TABLE STATUS</code>" is a MySQL command. Do not translate this.}}',
'config-db-web-account-same' => 'checkbox label',
'config-db-web-create' => 'checkbox label',
- 'config-ns-generic' => '{{Identical|Project}}',
+ 'config-mysql-only-myisam-dep' => 'Used as warning message when mysql does not support the minimum suggested feature set.',
+ 'config-mysql-binary' => '{{Identical|Binary}}',
+ 'config-ns-generic' => 'Used as label for "namespace type" radio button.
+
+See also:
+* {{msg-mw|Config-ns-site-name}}
+* {{msg-mw|Config-ns-other}}
+{{Identical|Project}}',
+ 'config-ns-site-name' => 'Used as label for "namespace type" radio button. Parameters:
+* $1 - wiki name
+See also:
+* {{msg-mw|Config-ns-generic}}
+* {{msg-mw|Config-ns-other}}',
+ 'config-ns-other' => "Used as label for \"namespace type\" radio button.
+
+This message is followed by the input box which enables to '''specify''' a namespace name.
+
+See also:
+* {{msg-mw|Config-ns-site-name}}
+* {{msg-mw|Config-ns-generic}}",
+ 'config-ns-invalid' => 'Used as error message. Parameters:
+* $1 - namespace name
+See also:
+* {{msg-mw|Config-ns-conflict}}',
+ 'config-ns-conflict' => 'Used as error message. Parameters:
+* $1 - namespace name
+See also:
+* {{msg-mw|Config-ns-invalid}}',
'config-admin-name' => '{{Identical|Your name}}',
'config-admin-password' => '{{Identical|Password}}',
+ 'config-admin-name-invalid' => 'Used as error message. Parameters:
+* $1 - username of administrator',
'config-admin-email' => '{{Identical|E-mail address}}',
+ 'config-admin-error-user' => 'Used as error message. Parameters:
+* $1 - username of administrator
+See also:
+* {{msg-mw|Config-admin-error-password}}',
+ 'config-admin-error-password' => 'Used as error message. Parameters:
+* $1 - username of administrator
+* $2 - error message
+See also:
+* {{msg-mw|Config-admin-error-user}}',
'config-subscribe' => 'Used as label for the installer checkbox',
'config-subscribe-help' => '"Low-volume" in this context means that there will be few e-mails to that mailing list per time period.',
'config-profile-help' => 'Messages referenced:
@@ -687,10 +828,31 @@ If you\'re translating this message to a right-to-left language, consider writin
'config-email-user' => '{{Identical|Enable user-to-user e-mail}}',
'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' => '',
+ 'config-instantcommons' => 'Used as label for the checkbox.
+
+The help message for this checkbox is:
+* {{msg-mw|Config-instantcommons-help}}',
+ 'config-instantcommons-help' => 'Used as help message for the checkbox which is labeled {{msg-mw|config-instantcommons}}.',
'config-cc-not-chosen' => '{{doc-important|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 click "proceed" so as to return to the MediaWiki installer page.',
'config-memcached-servers' => '{{doc-important|Do not translate "memcached".}}
{{Identical|Memcached server}}',
+ 'config-memcache-badip' => 'Used as error message. Parameters:
+* $1 - IP address for Memcached
+See also:
+* {{msg-mw|Config-memcache-noport}}
+* {{msg-mw|Config-memcache-badport}}',
+ 'config-memcache-noport' => 'Used as error message. Parameters:
+* $1 - Memcached server name
+See also:
+* {{msg-mw|Config-memcache-badip}}
+* {{msg-mw|Config-memcache-badport}}',
+ 'config-memcache-badport' => 'Used as error message. Parameters:
+* $1 - 1 (hard-coded)
+* $2 - 65535 (hard-coded)
+See also:
+* {{msg-mw|Config-memcache-badip}}
+* {{msg-mw|Config-memcache-noport}}',
'config-extensions' => '{{Identical|Extension}}',
'config-extensions-help' => '{{doc-important|Do not translate <code>./extensions</code>.}}
Used in help box.',
@@ -717,6 +879,8 @@ Used in help box.',
'config-install-pg-schema-failed' => 'Parameters:
* $1 = database user name (usernames in the database are unrelated to wiki user names)
* $2 =',
+ 'config-pg-no-plpgsql' => 'Used as error message. Parameters:
+* $1 - database name',
'config-install-user' => 'Message indicates that the user is being created
See also:
@@ -729,9 +893,22 @@ See also:
*{{msg-mw|Config-install-keys}}
*{{msg-mw|Config-install-sysop}}
*{{msg-mw|Config-install-mainpage}}',
+ 'config-install-user-alreadyexists' => 'Used as warning. Parameters:
+* $1 - database username',
+ 'config-install-user-create-failed' => 'Used as MySQL warning and as PostgreSQL error. Parameters:
+* $1 - database username
+* $2 - detailed warning/error message',
'config-install-user-grant-failed' => 'Parameters:
* $1 is the database username for which granting rights failed
* $2 is the error message',
+ 'config-install-user-missing' => 'Used as PostgreSQL error message. Parameters:
+* $1 - database username
+See also:
+* {{msg-mw|Config-install-user-missing-create}}',
+ 'config-install-user-missing-create' => 'Used as PostgreSQL error message. Parameters:
+* $1 - database username
+See also:
+* {{msg-mw|Config-install-user-missing}}',
'config-install-tables' => 'Message indicates that the tables are being created
See also:
@@ -744,6 +921,8 @@ See also:
*{{msg-mw|Config-install-keys}}
*{{msg-mw|Config-install-sysop}}
*{{msg-mw|Config-install-mainpage}}',
+ 'config-install-tables-failed' => 'Used as PostgreSQL error message. Parameters:
+* $1 - detailed error message',
'config-install-interwiki' => 'Message indicates that the interwikitables are being populated
See also:
@@ -801,6 +980,8 @@ See also:
*{{msg-mw|Config-install-keys}}
*{{msg-mw|Config-install-sysop}}
*{{msg-mw|Config-install-mainpage}}',
+ 'config-install-mainpage-failed' => 'Used as error message. Parameters:
+* $1 - detailed error message',
'config-install-done' => 'Parameters:
* $1 is the URL to LocalSettings download
* $2 is a link to the wiki.
@@ -808,6 +989,9 @@ See also:
'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}}',
+ 'config-nofile' => 'Used as failure message. Parameters:
+* $1 - filename',
+ 'config-extension-link' => 'Shown on last page of installation to inform about possible extensions.',
'mainpagetext' => 'Along with {{msg-mw|mainpagedocfooter}}, the text you will see on the Main Page when your wiki is installed.',
'mainpagedocfooter' => 'Along with {{msg-mw|mainpagetext}}, the text you will see on the Main Page when your wiki is installed.
This might be a good place to put information about <nowiki>{{GRAMMAR:}}</nowiki>. See [[{{NAMESPACE}}:{{BASEPAGENAME}}/fi]] for an example. For languages having grammatical distinctions and not having an appropriate <nowiki>{{GRAMMAR:}}</nowiki> software available, a suggestion to check and possibly amend the messages having <nowiki>{{SITENAME}}</nowiki> may be valuable. See [[{{NAMESPACE}}:{{BASEPAGENAME}}/ksh]] for an example.',
@@ -890,12 +1074,10 @@ U gebruik tans $2.',
'config-sqlite-dir' => 'Gids vir SQLite se data:',
'config-oracle-def-ts' => 'Standaard tabelruimte:',
'config-oracle-temp-ts' => 'Tydelike tabelruimte:',
- 'config-type-ibm_db2' => 'IBM DB2',
'config-header-mysql' => 'MySQL-instellings',
'config-header-postgres' => 'PostgreSQL-instellings',
'config-header-sqlite' => 'SQLite-instellings',
'config-header-oracle' => 'Oracle-instellings',
- 'config-header-ibm_db2' => 'Instellings vir IBM DB2',
'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.',
@@ -903,7 +1085,7 @@ U gebruik tans $2.',
'config-upgrade-done-no-regenerate' => 'Opgradering is voltooi.
U kan nou [$1 u wiki gebruik].',
- 'config-regenerate' => 'Herskep <code>LocalSettings.php</code> →',
+ 'config-regenerate' => 'Herskep LocalSettings.php →',
'config-show-table-status' => 'Die uitvoer van <code>SHOW TABLE STATUS</code> het gefaal!',
'config-db-web-account' => 'Databasisgebruiker vir toegang tot die web',
'config-mysql-engine' => 'Stoor-enjin:',
@@ -1009,7 +1191,7 @@ $messages['aln'] = array(
* [//www.mediawiki.org/wiki/Help:Configuration_settings Konfigurimi i MediaWikit]
* [//www.mediawiki.org/wiki/Help:FAQ Pyetjet e shpeshta rreth MediaWikit]
-* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce Njoftime rreth MediaWikit]',
+* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce Njoftime rreth MediaWikit]', # Fuzzy
);
/** Amharic (አማርኛ)
@@ -1022,7 +1204,7 @@ $messages['am'] = array(
* [//www.mediawiki.org/wiki/Manual:Configuration_settings Configuration settings list]
* [//www.mediawiki.org/wiki/Manual:FAQ MediaWiki FAQ]
-* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce MediaWiki release mailing list]",
+* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce MediaWiki release mailing list]", # Fuzzy
);
/** Aragonese (aragonés)
@@ -1036,20 +1218,20 @@ $messages['an'] = array(
* [//www.mediawiki.org/wiki/Manual:Configuration_settings Lista de caracteristicas confegurables]
* [//www.mediawiki.org/wiki/Manual:FAQ Preguntas cutianas sobre MediaWiki (FAQ)]
-* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce Lista de correu sobre ta anuncios de MediaWiki]",
+* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce Lista de correu sobre ta anuncios de MediaWiki]", # Fuzzy
);
/** Old English (Ænglisc)
* @author Gott wisst
*/
$messages['ang'] = array(
- 'mainpagetext' => "'''MediaÇ·iki hafaþ ÈeÆ¿orden spÄ“diÈe inseted.'''",
+ 'mainpagetext' => "'''MediaWiki hafaþ geworden spēdige inseted.'''",
'mainpagedocfooter' => 'Þeahta þone [//meta.wikimedia.org/wiki/Help:Contents BrÅ«cenda LÇ£dend] on helpe mid þǣre nytte of Æ¿ikisÅftÆ¿are.
== BeÈinnunÈ ==
* [//www.mediawiki.org/wiki/Manual:Configuration_settings OnfæstnunÈa Èesetednessa Èetæl]
* [//www.mediawiki.org/wiki/Manual:FAQ Èœetæl oft ascodra ascunÈa ymb MediaÇ·iki]
-* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce Ç¢rendunÈÈetæl nÄ«Æ¿ra MediaÇ·iki forþsendnessa]',
+* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce Ç¢rendunÈÈetæl nÄ«Æ¿ra MediaÇ·iki forþsendnessa]', # Fuzzy
);
/** Arabic (العربية)
@@ -1115,7 +1297,7 @@ $messages['ary'] = array(
== L-bdaya mÄa MediaWiki ==
* [//www.mediawiki.org/wiki/Manual:Configuration_settings Lista dyal l-paramétraṫ dyal l-konfigurasyon]
* [//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]',
+* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce Lista dyal l-modakaraṫ Äla versyonaṫ jdad dyal MediaWiki]', # Fuzzy
);
/** Egyptian Spoken Arabic (مصرى)
@@ -1128,10 +1310,10 @@ $messages['arz'] = array(
* [//www.mediawiki.org/wiki/Manual:Configuration_settings لستة اعدادات الضبط]
* [//www.mediawiki.org/wiki/Manual:FAQ أسئلة بتكرر حوالين الميدياويكى]
-* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce لستة الايميلات بتاعة اعلانات الميدياويكى]',
+* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce لستة الايميلات بتاعة اعلانات الميدياويكى]', # Fuzzy
);
-/** Assamese (অসমীয়া)
+/** Assamese (অসমীয়া)
* @author Chaipau
* @author Gitartha.bordoloi
*/
@@ -1142,7 +1324,7 @@ $messages['as'] = array(
== আৰমà§à¦­à¦£à¦¿ কৰিবলৈ ==
* [//www.mediawiki.org/wiki/Manual:Configuration_settings Configuration settings list]
* [//www.mediawiki.org/wiki/Manual:FAQ MediaWiki FAQ]
-* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce MediaWiki release mailing list]",
+* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce MediaWiki release mailing list]", # Fuzzy
);
/** Asturian (asturianu)
@@ -1228,7 +1410,6 @@ $messages['az'] = array(
'config-page-install' => 'Nizamlama',
'config-page-complete' => 'Komplektləşdir!',
'config-charset-mysql5' => 'MySQL 4.1/5.0 UTF-8',
- 'config-type-ibm_db2' => 'IBM DB2',
'config-mysql-myisam' => 'MyISAM',
'config-mysql-utf8' => 'UTF-8',
'config-ns-generic' => 'LayihÉ™',
@@ -1242,7 +1423,7 @@ $messages['az'] = array(
== Faydalı keçidlər ==
* [//www.mediawiki.org/wiki/Manual:Configuration_settings Tənzimləmələrin siyahısı]
* [//www.mediawiki.org/wiki/Manual:FAQ MediaWiki haqqında tez-tez soruşulan suallar]
-* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce MediaWiki e-poçt siyahısı]',
+* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce MediaWiki e-poçt siyahısı]', # Fuzzy
);
/** Bashkir (башҡортÑа)
@@ -1255,7 +1436,7 @@ $messages['ba'] = array(
== Файҙалы Ñығанаҡтар ==
* [//www.mediawiki.org/wiki/Manual:Configuration_settings Көйләүҙәр иÑемлеге (инг.)];
* [//www.mediawiki.org/wiki/Manual:FAQ MediaWiki тураһында йыш бирелгән һорауҙар һәм Ñуаптар (инг.)];
-* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce MediaWiki-ның Ñңы верÑиÑлары тураһында хәбәрҙәр алып тороу].',
+* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce MediaWiki-ның Ñңы верÑиÑлары тураһында хәбәрҙәр алып тороу].', # Fuzzy
);
/** Bavarian (Boarisch)
@@ -1269,7 +1450,7 @@ $messages['bar'] = array(
* [//www.mediawiki.org/wiki/Manual:Configuration_settings Listen voh de Konfigurazionsvariaablen]
* [//www.mediawiki.org/wiki/Manual:FAQ MediaWiki-FAQ]
-* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce Mailinglisten voh de neichen MediaWiki-Versionen]',
+* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce Mailinglisten voh de neichen MediaWiki-Versionen]', # Fuzzy
);
/** Southern Balochi (بلوچی مکرانی)
@@ -1281,7 +1462,7 @@ $messages['bcc'] = array(
== شروع بیت ==
* [//www.mediawiki.org/wiki/Manual:Configuration_settings Configuration settings list]
* [//www.mediawiki.org/wiki/Manual:FAQ MediaWiki FAQ]
-* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce MediaWiki release mailing list]",
+* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce MediaWiki release mailing list]", # Fuzzy
);
/** Bikol Central (Bikol Central)
@@ -1294,7 +1475,7 @@ $messages['bcl'] = array(
* [//www.mediawiki.org/wiki/Manual:Configuration_settings Configuration settings list]
* [//www.mediawiki.org/wiki/Manual:FAQ MediaWiki FAQ]
-* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce MediaWiki release mailing list]",
+* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce MediaWiki release mailing list]", # Fuzzy
);
/** Belarusian (беларуÑкаÑ)
@@ -1307,7 +1488,7 @@ $messages['be'] = array(
* [//www.mediawiki.org/wiki/Manual:Configuration_settings Пералік параметраў канфігурацыі (англ.)]
* [//www.mediawiki.org/wiki/Manual:FAQ ЧÐПЫ MediaWiki (англ.)]
-* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce ЛіÑтаванне аб выпуÑках MediaWiki (англ.)]',
+* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce ЛіÑтаванне аб выпуÑках MediaWiki (англ.)]', # Fuzzy
);
/** Belarusian (TaraÅ¡kievica orthography) (беларуÑÐºÐ°Ñ (тарашкевіца)‎)
@@ -1448,6 +1629,8 @@ MediaWiki патрабуе падтрымкі UTF-8 Ð´Ð»Ñ Ñлушнай пра
'config-mod-security' => "'''ПапÑÑ€Ñджаньне''': на Вашым ÑžÑб-ÑÑрверы ўключаны [http://modsecurity.org/ mod_security]. У выпадку нÑÑлушнай наладцы, ён можа Ñтаць прычынай праблемаў Ð´Ð»Ñ MediaWiki ці іншага праграмнага забеÑьпÑчÑньнÑ, Ñкое дазвалÑе ўдзельнікам даÑылаць на ÑÑрвÑÑ€ любы зьмеÑÑ‚.
ГлÑдзіце [http://modsecurity.org/documentation/ дакумÑнтацыю mod_security] ці зьвÑрніцеÑÑ Ñž падтрымку Вашага хоÑту, калі Ñž Ð’Ð°Ñ ÑƒÐ·ÑŒÐ½Ñ–ÐºÐ°ÑŽÑ†ÑŒ Ð²Ñ‹Ð¿Ð°Ð´ÐºÐ¾Ð²Ñ‹Ñ Ð¿Ñ€Ð°Ð±Ð»ÐµÐ¼Ñ‹.",
'config-diff3-bad' => 'GNU diff3 Ð½Ñ Ð·Ð½Ð¾Ð¹Ð´Ð·ÐµÐ½Ñ‹.',
+ 'config-git' => 'Ð—Ð½Ð¾Ð¹Ð´Ð·ÐµÐ½Ð°Ñ ÑÑ‹ÑÑ‚Ñма канÑтролю вÑÑ€ÑÑ–ÑÑž Git: <code>$1</code>',
+ 'config-git-bad' => 'СыÑÑ‚Ñма кантролю вÑÑ€ÑÑ–ÑÑž Git Ð½Ñ Ð·Ð½Ð¾Ð¹Ð´Ð·ÐµÐ½Ð°Ñ.',
'config-imagemagick' => 'Знойдзены ImageMagick: <code>$1</code>.
ПаÑÑŒÐ»Ñ ÑžÐºÐ»ÑŽÑ‡ÑÐ½ÑŒÐ½Ñ Ð·Ð°Ð³Ñ€ÑƒÐ·Ð°Ðº будзе ўключанае маштабаваньне выÑваў.',
'config-gd' => 'GD падтрымліваецца ўбудавана.
@@ -1545,7 +1728,6 @@ ResourceLoader, Ñкладнік MediaWiki, будзе абходзіць гÑÑ‚
'config-type-postgres' => 'PostgreSQL',
'config-type-sqlite' => 'SQLite',
'config-type-oracle' => 'Oracle',
- 'config-type-ibm_db2' => 'IBM DB2',
'config-support-info' => 'MediaWiki падтрымлівае наÑÑ‚ÑƒÐ¿Ð½Ñ‹Ñ ÑÑ‹ÑÑ‚Ñмы базаў зьвеÑтак:
$1
@@ -1555,18 +1737,16 @@ $1
'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-support-ibm_db2' => '* $1 — база зьвеÑтак маштабу прадпрыемÑтва. ([http://www.php.net/manual/en/ibm-db2.installation.php Як ÑкампілÑваць PHP з падтрымкай IBM DB2])',
'config-header-mysql' => 'Ðалады MySQL',
'config-header-postgres' => 'Ðалады PostgreSQL',
'config-header-sqlite' => 'Ðалады SQLite',
'config-header-oracle' => 'Ðалады Oracle',
- 'config-header-ibm_db2' => 'Ðалады IBM DB2',
'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), Ñымбалі падкрÑÑьліваньнÑ(_) Ñ– кропкі (.).',
+Ðазва можа ўтрымліваць толькі ASCII-літары (a-z, A-Z), лічбы (0-9), Ñымбалі падкрÑÑьліваньнÑ(_) Ñ– кропкі (.).', # Fuzzy
'config-invalid-db-name' => 'ÐÑÑÐ»ÑƒÑˆÐ½Ð°Ñ Ð½Ð°Ð·Ð²Ð° базы зьвеÑтак «$1».
Ðазва можа ўтрымліваць толькі ASCII-літары (a-z, A-Z), лічбы (0-9), Ñымбалі падкрÑÑьліваньнÑ(_) Ñ– працÑжнікі (-).',
'config-invalid-db-prefix' => 'ÐÑÑлушны прÑÑ„Ñ–ÐºÑ Ð±Ð°Ð·Ñ‹ зьвеÑтак «$1».
@@ -1622,7 +1802,7 @@ chmod a+w $3</pre>',
'config-upgrade-done-no-regenerate' => 'Ðбнаўленьне Ñкончанае.
ЦÑпер Ð’Ñ‹ можаце [$1 пачаць працу з вікі].',
- 'config-regenerate' => 'РÑгенÑраваць <code>LocalSettings.php</code> →',
+ 'config-regenerate' => 'РÑгенÑраваць LocalSettings.php →',
'config-show-table-status' => "Запыт '<code>SHOW TABLE STATUS</code>' не атрымаўÑÑ!",
'config-unknown-collation' => "'''ПапÑÑ€Ñджаньне:''' база зьвеÑтак выкарыÑтоўвае нераÑпазнанае ÑупаÑтаўленьне.",
'config-db-web-account' => 'Рахунак базы зьвеÑтак Ð´Ð»Ñ Ð²Ñб-доÑтупу',
@@ -1652,7 +1832,6 @@ chmod a+w $3</pre>',
ГÑта болей ÑÑ„Ñктыўна за Ñ€Ñжым MySQL UTF-8, Ñ– дазвалÑе Вам выкарыÑтоўваць увеÑÑŒ дыÑпазон ÑымбалÑÑž Unicode.
У '''Ñ€Ñжыме UTF-8''', MySQL ведае, ÑÐºÐ°Ñ Ñ‚Ð°Ð±Ð»Ñ–Ñ†Ñ‹ ÑымбалÑÑž выкарыÑтоўваецца Ñž Вашых зьвеÑтках, Ñ– можа адпаведна прадÑтаўлÑць Ñ– канвÑртаваць Ñ–Ñ…, але гÑта не дазволіць Вам захоўваць Ñымбалі па-за межамі [//en.wikipedia.org/wiki/Mapping_of_Unicode_character_planes Базавага шматмоўнага дыÑпазону].",
- 'config-ibm_db2-low-db-pagesize' => "Ð’Ð°ÑˆÐ°Ñ Ð±Ð°Ð·Ð° зьвеÑтак DB2 мае таблічную праÑторну зь недаÑтатковым памерам Ñтаронкі. Памер Ñтаронкі муÑіць быць Ð½Ñ Ð¼ÐµÐ½Ñˆ за '''32к'''.",
'config-site-name' => 'Ðазва вікі:',
'config-site-name-help' => 'Ðазва будзе паказвацца Ñž загалоўку браўзÑра Ñ– Ñž некаторых іншых меÑцах.',
'config-site-name-blank' => 'УвÑдзіце назву Ñайта.',
@@ -1762,7 +1941,7 @@ chmod a+w $3</pre>',
'config-logo-help' => 'Ðфармленьне MediaWiki па змоўчваньні уключае праÑтору Ð´Ð»Ñ Ð»Ñгатыпу памерам 135×160 пікÑÑлÑÑž у верхнім левым куце.
Загрузіце выÑву адпаведнага памеру Ñ– увÑдзіце тут URL-адраÑ.
-Калі Ð’Ñ‹ не жадаеце мець ніÑкага лÑгатыпу, пакіньце поле пуÑтым.',
+Калі Ð’Ñ‹ не жадаеце мець ніÑкага лÑгатыпу, пакіньце поле пуÑтым.', # Fuzzy
'config-instantcommons' => 'Дазволіць Instant Commons',
'config-instantcommons-help' => '[//www.mediawiki.org/wiki/InstantCommons Instant Commons] — магчымаÑьць, ÑÐºÐ°Ñ Ð´Ð°Ð·Ð²Ð°Ð»Ñе вікі выкарыÑтоўваць выÑвы, гукі Ñ– Ñ–Ð½ÑˆÑ‹Ñ Ð¼ÑдыÑ, ÑÐºÑ–Ñ Ð·Ð½Ð°Ñ…Ð¾Ð´Ð·Ñцца на Ñайце [//commons.wikimedia.org/ Wikimedia Commons].
Каб гÑта зрабіць, MediaWiki патрабуе доÑтупу да ІнтÑрнÑту.
@@ -2071,7 +2250,6 @@ $1
Това включва Ñурови данни за потребителите (адреÑи за е-поща, хеширани пароли), както и изтрити верÑии на Ñтраници и друга чувÑтвителна и Ñ Ð¾Ð³Ñ€Ð°Ð½Ð¸Ñ‡ÐµÐ½ доÑтъп Ð¸Ð½Ñ„Ð¾Ñ€Ð¼Ð°Ñ†Ð¸Ñ Ð¾Ñ‚ и за уикито.
Базата от данни е препоръчително да Ñе разположи на друго мÑÑто, например в <code>/var/lib/mediawiki/yourwiki</code>.",
- 'config-type-ibm_db2' => 'IBM DB2',
'config-support-info' => 'МедиÑУики поддържа Ñледните ÑиÑтеми за бази от данни:
$1
@@ -2081,12 +2259,10 @@ $1
'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-support-ibm_db2' => '* $1 е комерÑиална фирмена база от данни. ([http://www.php.net/manual/en/ibm-db2.installation.php Как Ñе компилира PHP Ñ Ð¿Ð¾Ð´Ð´Ñ€ÑŠÐ¶ÐºÐ° на IBM DB2])',
'config-header-mysql' => 'ÐаÑтройки за MySQL',
'config-header-postgres' => 'ÐаÑтройки за PostgreSQL',
'config-header-sqlite' => 'ÐаÑтройки за SQLite',
'config-header-oracle' => 'ÐаÑтройки за Oracle',
- 'config-header-ibm_db2' => 'ÐаÑтройки за IBM DB2',
'config-invalid-db-type' => 'Ðевалиден тип база от данни',
'config-missing-db-name' => 'Ðеобходимо е да Ñе въведе ÑтойноÑÑ‚ за "Име на базата от данни"',
'config-missing-db-host' => 'Ðеобходимо е да Ñе въведе ÑтойноÑÑ‚ за "ХоÑÑ‚ на базата от данни"',
@@ -2148,7 +2324,7 @@ chmod a+w $3</pre>',
'config-upgrade-done-no-regenerate' => 'ОбновÑването приключи.
Вече е възможно [$1 да използвате уикито].',
- 'config-regenerate' => 'Създаване на <code>LocalSettings.php</code> →',
+ 'config-regenerate' => 'Създаване на LocalSettings.php →',
'config-show-table-status' => 'ЗаÑвката <code>SHOW TABLE STATUS</code> не Ñполучи!',
'config-unknown-collation' => "'''Предупреждение:''' Базата от данни използва неразпозната колациÑ.",
'config-db-web-account' => 'Сметка за уеб доÑтъп до базата от данни',
@@ -2286,7 +2462,7 @@ chmod a+w $3</pre>',
'config-logo-help' => 'Обликът по подразбиране на МедиÑУики вклчва мÑÑто Ñ Ñ€Ð°Ð·Ð¼ÐµÑ€Ð¸ 135Ñ…160 пикÑела за лого над Ñтраничното меню.
Ðко има наличен файл Ñ Ð¿Ð¾Ð´Ñ…Ð¾Ð´Ñщ размер, неговиÑÑ‚ Ð°Ð´Ñ€ÐµÑ Ð¼Ð¾Ð¶Ðµ да бъде поÑочен тук.
-Ðко не е необходимо лого, полето може да Ñе оÑтави празно.',
+Ðко не е необходимо лого, полето може да Ñе оÑтави празно.', # Fuzzy
'config-instantcommons' => 'Включване на Instant Commons',
'config-instantcommons-help' => '[//www.mediawiki.org/wiki/InstantCommons Instant Commons] е функционалноÑÑ‚, коÑто позволÑва на уикитата да използват картинки, звуци и друга медиа от Ñайта на Ð£Ð¸ÐºÐ¸Ð¼ÐµÐ´Ð¸Ñ [//commons.wikimedia.org/ ОбщомедиÑ].
За да е възможно това, МедиÑУики изиÑква доÑтъп до Интернет.
@@ -2399,7 +2575,7 @@ $messages['bjn'] = array(
== Gasan bamula ==
* [//www.mediawiki.org/wiki/Manual:Configuration_settings Daptar konpigurasi setélan]
* [//www.mediawiki.org/wiki/Manual:FAQ MediaWiki nang rancak ditakunakan]
-* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce MediaWiki rilis milis]',
+* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce MediaWiki rilis milis]', # Fuzzy
);
/** Bengali (বাংলা)
@@ -2445,12 +2621,10 @@ $messages['bn'] = array(
'config-sqlite-dir' => 'à¦à¦¸à¦•à¦¿à¦‰à¦²à¦¾à¦‡à¦Ÿ ডেটা ডিরেকà§à¦Ÿà¦°à¦¿:',
'config-oracle-def-ts' => 'পূরà§à¦¬à¦¨à¦¿à¦°à§à¦§à¦¾à¦°à¦¿à¦¤ টেবিলসà§à¦ªà§‡à¦¸',
'config-oracle-temp-ts' => 'সাময়কি টেবিলসà§à¦ªà§‡à¦¸:',
- 'config-type-ibm_db2' => 'আইবিà¦à¦® ডিবি২',
'config-header-mysql' => 'মাইà¦à¦¸à¦•à¦¿à¦‰à¦à¦² সেটিংস',
'config-header-postgres' => 'পোসà§à¦Ÿà¦—à§à¦°à§‡à¦à¦¸à¦•à¦¿à¦‰à¦à¦² সেটিংস',
'config-header-sqlite' => 'à¦à¦¸à¦•à¦¿à¦‰à¦²à¦¾à¦‡à¦Ÿ সেটিংস',
'config-header-oracle' => 'ওরাকল সেটিংস',
- 'config-header-ibm_db2' => 'আইবিà¦à¦® ডিবি২ সেটিংস',
'config-invalid-db-type' => 'ডেটাবেজের ধরন অগà§à¦°à¦¹à¦¯à§‹à¦—à§à¦¯',
'config-missing-db-name' => 'আপনাকে অবশà§à¦¯à¦‡ "ডেটাবেজ নাম"-à¦à¦° জনà§à¦¯ à¦à¦•à¦Ÿà¦¿ মান পà§à¦°à¦¬à§‡à¦¶ করাতে হবে',
'config-missing-db-host' => 'আপনাকে অবশà§à¦¯à¦‡ "ডেটাবেজ হোসà§à¦Ÿ"-à¦à¦° জনà§à¦¯ à¦à¦•à¦Ÿà¦¿ মান পà§à¦°à¦¬à§‡à¦¶ করাতে হবে',
@@ -2480,7 +2654,7 @@ $messages['bn'] = array(
'config-optional-continue' => 'আরও পà§à¦°à¦¶à§à¦¨ জিজà§à¦žà§‡à¦¸ করà§à¦¨à¥¤',
'config-optional-skip' => 'আমি ইতিমধà§à¦¯à§‡à¦‡ বিরকà§à¦¤ হয়ে গেছি, উইকিটি ইনà§à¦¸à¦Ÿà¦² করো।',
'config-profile' => 'বà§à¦¯à¦¬à¦¹à¦¾à¦°à¦•à¦¾à¦°à§€ অধিকার পà§à¦°à§‹à¦«à¦¾à¦‡à¦²:',
- 'config-profile-wiki' => 'গতানà§à¦—তিক উইকি',
+ 'config-profile-wiki' => 'গতানà§à¦—তিক উইকি', # Fuzzy
'config-profile-no-anon' => 'অà§à¦¯à¦¾à¦•à¦¾à¦‰à¦¨à§à¦Ÿ তৈরি করা বাধà§à¦¯à¦¤à¦¾à¦®à§‚লক',
'config-profile-fishbowl' => 'শà§à¦§à§à¦®à¦¾à¦¤à§à¦° নিরà§à¦§à¦¾à¦°à¦¿à¦¤ সমà§à¦ªà¦¾à¦¦à¦•à¦¦à§‡à¦° জনà§à¦¯à¦‡',
'config-profile-private' => 'বà§à¦¯à¦•à§à¦¤à¦¿à¦—ত উইকি',
@@ -2514,7 +2688,7 @@ $messages['bn'] = array(
* [//www.mediawiki.org/wiki/Manual:Configuration_settings কনফিগারেশন সেটিংস তালিকা]
* [//www.mediawiki.org/wiki/Manual:FAQ পà§à¦°à¦¶à§à¦¨à§‹à¦¤à§à¦¤à¦°à§‡ মিডিয়াউইকি]
-* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce মিডিয়াউইকি রিলিজের মেইলিং লিসà§à¦Ÿ]',
+* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce মিডিয়াউইকি রিলিজের মেইলিং লিসà§à¦Ÿ]', # Fuzzy
);
/** Bishnupria Manipuri (বিষà§à¦£à§à¦ªà§à¦°à¦¿à¦¯à¦¼à¦¾ মণিপà§à¦°à§€)
@@ -2527,7 +2701,7 @@ $messages['bpy'] = array(
* [//www.mediawiki.org/wiki/Manual:Configuration_settings কনফিগারেশন সেটিংর তালিকাহান]
* [//www.mediawiki.org/wiki/Manual:FAQ মিডিয়া উইকি আঙলাক]
-* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce মিডিয়া উইকির ফঙপার বারে মেইলর তালিকাহান]',
+* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce মিডিয়া উইকির ফঙপার বারে মেইলর তালিকাহান]', # Fuzzy
);
/** Breton (brezhoneg)
@@ -2773,7 +2947,7 @@ Da hizivaat anezho da VediaWiki $1, klikañ war '''Kenderc'hel'''.",
'config-upgrade-done-no-regenerate' => 'Hizivadenn kaset da benn.
Gallout a rit [$1 kregiñ da implijout ho wiki].',
- 'config-regenerate' => 'Adgenel <code>LocalSettings.php</code> →',
+ 'config-regenerate' => 'Adgenel LocalSettings.php →',
'config-show-table-status' => "C'hwitet ar reked <code>SHOW TABLE STATUS</code> !",
'config-unknown-collation' => "'''Diwallit :''' Emañ an diaz roadennoù o renkañ an traoù diouzh un urzh lizherennek dianav.",
'config-db-web-account' => 'Kont an diaz roadennoù evit ar voned Kenrouedad',
@@ -3036,16 +3210,26 @@ $messages['ca'] = array(
/** Chechen (нохчийн)
* @author Sasan700
+ * @author Умар
*/
$messages['ce'] = array(
+ 'config-your-language' => 'Хьан мотт:',
+ 'config-continue' => 'Кхин дӀа →',
+ 'config-page-language' => 'Мотт',
+ 'config-page-name' => 'ЦӀе',
'config-no-fts3' => "'''Тергам бе''': SQLite гулйина хуттург йоцуш [//sqlite.org/fts3.html FTS3] — лахар болхбеш хир дац оцу бухца.",
+ 'config-site-name' => 'Викин цӀе:',
+ 'config-site-name-blank' => 'Язъе Ñайтан цӀе.',
+ 'config-license' => 'Ðвторан бакъонаш а лицензи а:',
+ 'config-license-pd' => 'Юкъараллин хьал',
+ 'config-help' => 'гӀо',
'mainpagetext' => "'''Вики-белха гlÐ¸Ñ€Ñ Â«MediaWiki» кхочуш дика дlахlоттийна.'''",
'mainpagedocfooter' => 'Викийца болх бан хаамаш карор бу Ñ…lокху чохь [//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 ниÑвохааман куьйгаллица].
== Цхьаболу пайде гlирÑаш ==
* [//www.mediawiki.org/wiki/Manual:Configuration_settings ГlÐ¸Ñ€Ñ Ð½Ð¸Ñбан тарлушболу могlам];
* [//www.mediawiki.org/wiki/Manual:FAQ Сих Ñиха лушдолу хаттарш а жоьпаш оцу MediaWiki];
-* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce Хаам бохьуьйту араÑларца башхонца керла MediaWiki].',
+* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce Хаам бохьуьйту араÑларца башхонца керла MediaWiki].', # Fuzzy
);
/** Cebuano (Cebuano)
@@ -3057,17 +3241,36 @@ $messages['ceb'] = array(
== Pagsugod ==
* [//www.mediawiki.org/wiki/Manual:Configuration_settings Listahan sa mga setting sa kompigurasyon]
* [//www.mediawiki.org/wiki/Manual:FAQ FAQ sa MediaWiki]
-* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce Mailing list sa mga release sa MediaWiki]',
+* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce Mailing list sa mga release sa MediaWiki]', # Fuzzy
);
/** Sorani Kurdish (کوردی)
* @author Asoxor
* @author Calak
+ * @author Muhammed taha
*/
$messages['ckb'] = array(
'config-wiki-language' => 'زمانی ویکی:',
+ '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-copying' => 'لەبەردەگیرێتەوە',
+ 'config-page-upgradedoc' => 'نوێدەکرێتەوە',
+ 'config-page-existingwiki' => 'ویکی پێشوو',
+ 'config-restart' => 'بەڵێ، دەستی پێ بکەرەوە',
+ 'config-env-php' => 'PHP $1 دابەزێندرا.',
+ 'config-env-php-toolow' => 'PHP $1 دابەزێندرا.
+ھەرچۆنێک بێت میدیاویکی پێویستی بە PHP $2 یان بەرزتر ھەیە.',
'mainpagetext' => "'''میدیاویکی بە سەرکەوتوویی دامەزرا.'''",
'mainpagedocfooter' => 'لە [//meta.wikimedia.org/wiki/Help:Contents ڕێنوێنیی بەکارھێنەران] بۆ زانیاری سەبارەت بە بەکارھێنانی نەرمامێری ویکی کەڵک وەربگرە.
@@ -3089,7 +3292,7 @@ $messages['cps'] = array(
* [//www.mediawiki.org/wiki/Manual:Configuration_settings Lista sang mga setting sang konpigurayon]
* [//www.mediawiki.org/wiki/Manual:FAQ Mga perme napangkot sa MediaWiki]
-* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce Lista sang mga ginapadal-an sang sulat sang MediaWiki]',
+* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce Lista sang mga ginapadal-an sang sulat sang MediaWiki]', # Fuzzy
);
/** Crimean Turkish (Cyrillic script) (къырымтатарджа (Кирилл)‎)
@@ -3101,7 +3304,7 @@ $messages['crh-cyrl'] = array(
== Базы файдалы Ñайтлар ==
* [//www.mediawiki.org/wiki/Manual:Configuration_settings Олуджы Ñазламалар джедвели];
* [//www.mediawiki.org/wiki/Manual:FAQ MediaWiki боюнджа Ñыкъ берильген Ñуаллернен джеваплар];
-* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce MediaWiki-нинъ Ñнъы верÑиÑларынынъ чыкъувындан хабер йиберюв].",
+* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce MediaWiki-нинъ Ñнъы верÑиÑларынынъ чыкъувындан хабер йиберюв].", # Fuzzy
);
/** Crimean Turkish (Latin script) (qırımtatarca (Latin)‎)
@@ -3113,11 +3316,12 @@ $messages['crh-latn'] = array(
== Bazı faydalı saytlar ==
* [//www.mediawiki.org/wiki/Manual:Configuration_settings Olucı sazlamalar cedveli];
* [//www.mediawiki.org/wiki/Manual:FAQ MediaWiki boyunca sıq berilgen suallernen cevaplar];
-* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce MediaWiki-niñ yañı versiyalarınıñ çıquvından haber yiberüv].",
+* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce MediaWiki-niñ yañı versiyalarınıñ çıquvından haber yiberüv].", # Fuzzy
);
/** Czech (Äesky)
* @author Danny B.
+ * @author Jezevec
* @author Mormegil
* @author ì•„ë¼
*/
@@ -3172,8 +3376,8 @@ Zkontrolujte svůj soubor php.ini a ujistěte se, že <code>session.save_path</c
'config-help-restart' => 'Chcete smazat vÅ¡echny údaje, které jste zadali, a spustit proces instalace znovu od zaÄátku?',
'config-restart' => 'Ano, restartovat',
'config-welcome' => '=== Kontrola prostředí ===
-Provedou se základní kontroly, aby se zjistilo, zda je toto prostředí použitelné k instalaci MediaWiki.
-Pokud budete potřebovat při instalaci pomoc, měli byste sdělit výsledky těchto testů.',
+Nyní se provedou základní kontroly, aby se zjistilo, zda je toto prostředí použitelné k instalaci MediaWiki.
+Pokud budete potÅ™ebovat k dokonÄení instalace pomoc, nezapomeňte sdÄ›lit výsledky tÄ›chto testů.',
'config-copyright' => "=== Licence a podmínky ===
$1
@@ -3242,6 +3446,10 @@ MediaWiki vyžaduje ke správné funkci podporu UTF-8.",
To je pravděpodobně příliš málo.
Instalace může selhat!",
'config-ctype' => "'''Kritická chyba''': PHP musí být přeloženo s podporou pro [http://www.php.net/manual/en/ctype.installation.php rozšíření Ctype].",
+ 'config-json' => "'''Kritická chyba:''' PHP bylo přeloženo bez podpory JSON.
+PÅ™ed instalací MediaWiki musíte buÄ nainstalovat rozšíření PHP JSON nebo rozšíření [http://pecl.php.net/package/jsonc PECL jsonc].
+* Rozšíření PHP je souÄástí Red Hat Enterprise Linux (CentOS) 5 a 6, avÅ¡ak musí se povolit v <code>/etc/php.ini</code> nebo <code>/etc/php.d/json.ini</code>.
+* V některých linuxových distribucích vydaných po květnu 2013 může toto rozšíření PHP chybět a místo toho mohou používat rozšíření PECL jako <code>php5-json</code> nebo <code>php-pecl-jsonc</code>.",
'config-xcache' => 'Je nainstalována [http://xcache.lighttpd.net/ XCache]',
'config-apc' => 'Je nainstalováno [http://www.php.net/apc APC]',
'config-wincache' => 'Je nainstalována [http://www.iis.net/download/WinCacheForPhp WinCache]',
@@ -3250,6 +3458,8 @@ Kešování objektů bude vypnuto.",
'config-mod-security' => "'''UpozornÄ›ní''': váš webový server má zapnuto [http://modsecurity.org/ mod_security]. PÅ™i chybné konfiguraci může způsobovat potíže MediaWiki Äi dalším programům, které umožňují ukládat libovolný obsah.
Pokud narazíte na náhodné chyby, podívejte se do [http://modsecurity.org/documentation/ dokumentace mod_security] nebo kontaktujte technickou podporu vašeho poskytovatele.",
'config-diff3-bad' => 'Nebyl nalezen GNU diff3.',
+ 'config-git' => 'Nalezen software pro správu verzí Git: <code>$1</code>.',
+ 'config-git-bad' => 'Software pro správu verzí Git nebyl nalezen.',
'config-imagemagick' => 'Nalezen ImageMagick: <code>$1</code>.
Pokud povolíte naÄítání souborů, bude zapnuto vytváření náhledů.',
'config-gd' => 'Nalezena vestavěná grafická knihovna GD.
@@ -3348,7 +3558,6 @@ Zvažte umístění databáze někam zcela jinam, například do <code>/var/lib/
'config-type-postgres' => 'PostgreSQL',
'config-type-sqlite' => 'SQLite',
'config-type-oracle' => 'Věštba',
- 'config-type-ibm_db2' => 'IBM DB2',
'config-support-info' => 'MediaWiki podporuje následující databázové systémy:
$1
@@ -3358,18 +3567,16 @@ Pokud v nabídce níže nevidíte databázový systém, který chcete použít,
'config-support-postgres' => '* $1 je populární open-source databázový systém používaný jako alternativa k MySQL ([http://www.php.net/manual/en/pgsql.installation.php jak pÅ™eložit PHP s podporou PostgreSQL]). Mohou se vyskytnout jeÅ¡tÄ› nÄ›jaké menší chyby, použití v produkÄním prostÅ™edí se nedoporuÄuje.',
'config-support-sqlite' => '* $1 je velmi dobře podporovaný lehký databázový systém. ([http://www.php.net/manual/en/pdo.installation.php Jak přeložit PHP s podporou SQLite], používá PDO)',
'config-support-oracle' => '* $1 je komerÄní podniková databáze. ([http://www.php.net/manual/en/oci8.installation.php Jak pÅ™eložit PHP s podporou OCI8])',
- 'config-support-ibm_db2' => '* $1 je komerÄní podniková databáze. ([http://www.php.net/manual/en/ibm-db2.installation.php Jak pÅ™eložit PHP s podporou IBM DB2])',
'config-header-mysql' => 'Nastavení MySQL',
'config-header-postgres' => 'Nastavení PostgreSQL',
'config-header-sqlite' => 'Nastavení SQLite',
'config-header-oracle' => 'Nastavení Oracle',
- 'config-header-ibm_db2' => 'Nastavení IBM DB2',
'config-invalid-db-type' => 'Chybný typ databáze',
'config-missing-db-name' => 'Musíte zadat hodnotu pro „Jméno databáze“',
'config-missing-db-host' => 'Musíte zadat hodnotu pro „Databázový server“',
'config-missing-db-server-oracle' => 'Musíte zadat hodnotu pro „Databázové TNS“',
'config-invalid-db-server-oracle' => 'Chybné databázové TNS „$1“.
-Používejte pouze ASCII písmena (a-z, A-Z), Äísla (0-9), podtržítko (_) a teÄku (.).',
+Používejte buÄ â€žTNS Name“ nebo „Easy Connect“ (vizte [http://docs.oracle.com/cd/E11882_01/network.112/e10836/naming.htm Oracle Naming Methods]).',
'config-invalid-db-name' => 'Chybné jméno databáze „$1“.
Používejte pouze ASCII písmena (a-z, A-Z), Äísla (0-9), podtržítko (_) a spojovník (-).',
'config-invalid-db-prefix' => 'Chybný databázový prefix „$1“.
@@ -3425,7 +3632,7 @@ To se ale '''nedoporuÄuje''', pokud s wiki nemáte problémy.",
'config-upgrade-done-no-regenerate' => 'Aktualizace byla dokonÄena.
Svou wiki teÄ můžete [$1 zaÄít používat].',
- 'config-regenerate' => 'Přegenerovat <code>LocalSettings.php</code> →',
+ 'config-regenerate' => 'Přegenerovat LocalSettings.php →',
'config-show-table-status' => 'Dotaz <code>SHOW TABLE STATUS</code> se nezdařil!',
'config-unknown-collation' => "'''Upozornění:''' Databáze používá nerozpoznané řazení.",
'config-db-web-account' => 'Databázový úÄet pro webový přístup',
@@ -3444,6 +3651,12 @@ Svou wiki teÄ můžete [$1 zaÄít používat].',
Pokud vaÅ¡e instalace MySQL podporuje InnoDB, důraznÄ› doporuÄujeme použít spíše to.
Pokud vaÅ¡e instalace MySQL InnoDB nepodporuje, možná je Äas na aktualizaci.",
+ 'config-mysql-only-myisam-dep' => "'''UpozornÄ›ní:''' Jediným dostupným formátem dat pro MySQL je MyISAM, který se k užití pro MediaWiki nedoporuÄuje, protože:
+* téměř nepodporuje souÄasný přístup kvůli zamykání tabulek,
+* oproti jiným formátům je náchylnější k poškození,
+* kód MediaWiki nepodporuje MyISAM tak dobře, jak by bylo potřeba.
+
+VaÅ¡e instalace MySQL nepodporuje InnoDB, možná je na Äase upgradovat.",
'config-mysql-engine-help' => "'''InnoDB''' je téměř vždy nejlepší volba, neboÅ¥ má dobrou podporu souÄasného přístupu.
'''MyISAM''' může být rychlejší u instalací pro jednoho uživatele nebo jen pro Ätení.
@@ -3455,7 +3668,6 @@ Databáze MyISAM bývají poÅ¡kozeny ÄastÄ›ji než databáze InnoDB.",
To je výkonnější než UTF-8 režim MySQL a umožňuje využít plný rozsah znaků Unicode.
V '''režimu UTF-8''' bude MySQL znát znakovou sadu vašich dat a může je příslušně zobrazovat a převádět, ale neumožní vám uložit znaky mimo [//en.wikipedia.org/wiki/Mapping_of_Unicode_character_planes Basic Multilingual Plane].",
- 'config-ibm_db2-low-db-pagesize' => "VaÅ¡e DB2 databáze má implicitní tabulkový prostor s nedostateÄnou velikostí stránky. Velikost stránky musí být minimálnÄ› '''32K'''.",
'config-site-name' => 'Název wiki:',
'config-site-name-help' => 'Bude se zobrazovat v titulku prohlížeÄe a na dalších místech.',
'config-site-name-blank' => 'Zadejte název serveru.',
@@ -3565,6 +3777,8 @@ Tento adresář by ideálně neměl být dostupný z webu.',
'config-logo-help' => 'Základní vzhled MediaWiki zahrnuje místo pro logo o velikosti 135×160 pixelů nad boÄním menu.
NaÄtÄ›te obrázek odpovídající velikosti a zadejte sem jeho URL.
+Pokud je vaÅ¡e logo umístÄ›no relativnÄ› vůÄi <code>$wgStylePath</code> nebo <code>$wgScriptPath</code>, můžete zde tyto promÄ›nné použít.
+
Pokud logo nechcete, ponechte toto pole prázdné.',
'config-instantcommons' => 'Zapnout Instant Commons',
'config-instantcommons-help' => '[//www.mediawiki.org/wiki/InstantCommons Instant Commons] je funkce, která umožňuje wiki používat obrázky, zvuky a další mediální soubory ze serveru [//commons.wikimedia.org/wiki/Hlavn%C3%AD_strana Wikimedia Commons].
@@ -3658,6 +3872,9 @@ Až to dokonÄíte, můžete '''[$2 vstoupit do své wiki]'''.",
'config-download-localsettings' => 'Stáhnout <code>LocalSettings.php</code>',
'config-help' => 'nápověda',
'config-nofile' => 'Soubor „$1“ nelze nalézt. Byl smazán?',
+ 'config-extension-link' => 'Věděli jste, že vaše wiki podporuje [//www.mediawiki.org/wiki/Manual:Extensions rozšíření]?
+
+Můžete procházet [//www.mediawiki.org/wiki/Category:Extensions_by_category rozšíření po kategoriích] nebo si prohlédnout [//www.mediawiki.org/wiki/Extension_Matrix Matici rozšíření] obsahující úplný seznam.',
'mainpagetext' => "'''MediaWiki byla úspěšně nainstalována.'''",
'mainpagedocfooter' => '[//meta.wikimedia.org/wiki/Help:Contents Uživatelská příruÄka] vám napoví, jak MediaWiki používat.
@@ -3675,6 +3892,15 @@ $messages['csb'] = array(
'mainpagetext' => "'''MediaWiki òsta zainstalowónô.'''",
);
+/** Church Slavic (ÑловѣÌньÑкъ / ⰔⰎⰑⰂⰡâ°â° â°”â°â°Ÿ)
+ * @author ОйЛ
+ */
+$messages['cu'] = array(
+ 'config-page-language' => 'Ñ©ê™ê™‘къ',
+ 'config-page-name' => 'имѧ',
+ 'config-help' => 'помощь',
+);
+
/** Chuvash (Чӑвашла)
*/
$messages['cv'] = array(
@@ -3684,21 +3910,23 @@ $messages['cv'] = array(
== Пулăшма пултарĕç ==
* [//www.mediawiki.org/wiki/Manual:Configuration_settings ĔнерлевÑен ÑпиÑокĕ];
* [//www.mediawiki.org/wiki/Manual:FAQ MediaWiki тăрăх чаÑ-чаÑах ыйтакан ыйтуÑемпе хуравÑем];
-* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce MediaWiki çĕнĕ верÑи тухнине пĕлтерекен раÑÑылка].',
+* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce MediaWiki çĕнĕ верÑи тухнине пĕлтерекен раÑÑылка].', # Fuzzy
);
/** Welsh (Cymraeg)
+ * @author Lloffiwr
* @author Xxglennxx
*/
$messages['cy'] = array(
'mainpagetext' => "'''Wedi llwyddo gosod meddalwedd MediaWiki yma'''",
- 'mainpagedocfooter' => 'Ceir cymorth (yn Saesneg) ar ddefnyddio meddalwedd wici yn y [//meta.wikimedia.org/wiki/Help:Contents Canllaw Defnyddwyr] ar wefan Wikimedia.
+ 'mainpagedocfooter' => "Ceir cymorth (yn Saesneg) ar ddefnyddio meddalwedd wici yn y [//meta.wikimedia.org/wiki/Help:Contents Canllaw Defnyddwyr] ar wefan Wikimedia.
==Cychwyn arni==
* [//www.mediawiki.org/wiki/Manual:Configuration_settings Rhestr osodiadau wrth gyflunio]
* [//www.mediawiki.org/wiki/Manual:FAQ Cwestiynau poblogaidd ar MediaWiki]
-* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce Rhestr postio datganiadau MediaWiki]',
+* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce Rhestr postio datganiadau MediaWiki]
+* [//www.mediawiki.org/wiki/Localisation#Translation_resources Cyfieithu MediaWici i'ch iaith chi]",
);
/** Danish (dansk)
@@ -3711,10 +3939,11 @@ $messages['da'] = array(
== At komme i gang ==
* [//www.mediawiki.org/wiki/Manual:Configuration_settings Listen over opsætningsmuligheder]
* [//www.mediawiki.org/wiki/Manual:FAQ MediaWiki ofte stillede spørgsmål]
-* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce Postliste angående udgivelser af MediaWiki]',
+* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce Postliste angående udgivelser af MediaWiki]', # Fuzzy
);
/** German (Deutsch)
+ * @author Geitost
* @author Kghbln
* @author LWChris
* @author Metalhead64
@@ -3777,8 +4006,8 @@ Die Datei <code>php.ini</code> muss geprüft und es muss dabei sichergestellt we
'config-help-restart' => 'Sollen alle bereits eingegebenen Daten gelöscht und der Installationsvorgang erneut gestartet werden?',
'config-restart' => 'Ja, erneut starten',
'config-welcome' => '=== Prüfung der Installationsumgebung ===
-Die 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.',
+Die Basisprüfungen werden jetzt durchgeführt, um festzustellen, ob die Installationsumgebung für die Installation von MediaWiki geeignet ist.
+Nimm diese Information auf, falls du Unterstützung bei der Vervollständigung der Installation benötigst.',
'config-copyright' => "=== Lizenz und Nutzungsbedingungen ===
$1
@@ -3787,7 +4016,7 @@ Dieses Programm ist freie Software, d. h. es kann, gemäß den Bedingungen der v
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.",
+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' => '* [//www.mediawiki.org/wiki/MediaWiki/de Website von MediaWiki]
* [//www.mediawiki.org/wiki/Help:Contents/de Benutzeranleitung]
* [//www.mediawiki.org/wiki/Manual:Contents/de Administratorenanleitung]
@@ -3847,14 +4076,20 @@ MediaWiki benötigt die UTF-8-Unterstützung, um fehlerfrei lauffähig zu sein."
Dieser Wert ist wahrscheinlich zu niedrig.
Der Installationsvorgang könnte daher scheitern!",
'config-ctype' => "'''Fataler Fehler:''' PHP muss mit Unterstützung für das [http://www.php.net/manual/de/ctype.installation.php Modul ctype] kompiliert werden.",
+ 'config-json' => "'''Fatal:''' PHP wurde ohne JSON-Support kompiliert.
+Du musst entweder die PHP-JSON- oder die [http://pecl.php.net/package/jsonc PECL-jsonc]-Erweiterung installieren, bevor du MediaWiki installierst.
+* Die PHP-Erweiterung ist in Red Hat Enterprise Linux (CentOS) 5 und 6 enthalten, muss jedoch in <code>/etc/php.ini</code> oder <code>/etc/php.d/json.ini</code> aktiviert werden.
+* Einige Linux-Distributionen, die nach Mai 2013 veröffentlicht wurden, lassen die PHP-Erweiterung weg, stattdessen wird die PECL-Erweiterung als <code>php5-json</code> oder <code>php-pecl-jsonc</code> mitgeliefert.",
'config-xcache' => '[http://xcache.lighttpd.net/ XCache] ist installiert',
'config-apc' => '[http://www.php.net/apc APC] ist installiert',
'config-wincache' => '[http://www.iis.net/download/WinCacheForPhp WinCache] ist installiert',
- 'config-no-cache' => "'''Warnung:''' [http://www.php.net/apc APC], [http://xcache.lighttpd.net/ XCache] oder [http://www.iis.net/download/WinCacheForPhp WinCache] konnten nicht gefunden werden.
+ 'config-no-cache' => "'''Warnung:''' [http://www.php.net/apc APC], [http://xcache.lighttpd.net/ XCache] oder [http://www.iis.net/download/WinCacheForPhp WinCache] wurden nicht gefunden.
Das Objektcaching kann daher nicht aktiviert werden.",
'config-mod-security' => "'''Warnung:''' Auf dem Webserver wurde [http://modsecurity.org/ ModSecurity] aktiviert. Sofern falsch konfiguriert, kann dies zu Problemen mit MediaWiki sowie anderer Software auf dem Server führen und es Benutzern ermöglichen beliebige Inhalte im Wiki einzustellen.
Für weitere Informationen empfehlen wir die [http://modsecurity.org/documentation/ Dokumentation zu ModSecurity] oder den Kontakt zum Hoster, sofern Fehler auftreten.",
'config-diff3-bad' => 'GNU diff3 wurde nicht gefunden.',
+ 'config-git' => 'Die Git-Versionsverwaltungssoftware wurde gefunden: <code>$1</code>.',
+ 'config-git-bad' => 'Die Git-Versionsverwaltungssoftware 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.
@@ -3939,19 +4174,18 @@ Nur Änderungen daran vornehmen, sofern es gute Gründe dafür gibt.',
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.
+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>.",
+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-type-ibm_db2' => 'IBM DB2',
'config-support-info' => 'MediaWiki unterstützt die folgenden Datenbanksysteme:
$1
@@ -3961,18 +4195,16 @@ Sofern nicht das Datenbanksystem angezeigt wird, das verwendet werden soll, gibt
'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-support-ibm_db2' => '* $1 ist eine kommerzielle Unternehmensdatenbank ([http://www.php.net/manual/en/ibm-db2.installation.php PHP mit IBM-DB2-Support kompilieren])',
'config-header-mysql' => 'MySQL-Einstellungen',
'config-header-postgres' => 'PostgreSQL-Einstellungen',
'config-header-sqlite' => 'SQLite-Einstellungen',
'config-header-oracle' => 'Oracle-Einstellungen',
- 'config-header-ibm_db2' => 'IBM DB2-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.',
+Entweder „TNS Name“ oder eine „Easy Connect“-Zeichenfolge verwenden ([http://docs.oracle.com/cd/E11882_01/network.112/e10836/naming.htm Oracle-Benennungsmethoden])',
'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“.
@@ -4029,7 +4261,7 @@ Dies wird '''nicht empfohlen''', es sei denn, es treten Probleme mit dem Wiki au
'config-upgrade-done-no-regenerate' => 'Die Aktualisierung ist abgeschlossen.
Das Wiki kann nun [$1 genutzt werden].',
- 'config-regenerate' => '<code>LocalSettings.php</code> neu erstellen →',
+ 'config-regenerate' => 'LocalSettings.php neu erstellen →',
'config-show-table-status' => 'Die Abfrage <code>SHOW TABLE STATUS</code> ist gescheitert!',
'config-unknown-collation' => "'''Warnung:''' Die Datenbank nutzt eine unbekannte Kollation.",
'config-db-web-account' => 'Datenbankkonto für den Webzugriff',
@@ -4048,6 +4280,12 @@ Das hier angegebene Datenbankkonto muss daher bereits vorhanden sein.',
Sofern die vorhandene MySQL-Installation die Speicher-Engine InnoDB unterstützt, wird deren Verwendung eindringlich empfohlen.
Sofern sie sie nicht unterstützt, sollte eine entsprechende Aktualisierung nunmehr Erwägung gezogen werden.",
+ 'config-mysql-only-myisam-dep' => "'''Warnung:''' MyISAM ist die einzige verfügbare Speicher-Engine für MySQL, die nicht für die Verwendung mit MediaWiki empfohlen wird, da sie
+* aufgrund von Tabellensperrungen kaum die nebenläufige Ausführung von Aktionen unterstützt,
+* anfälliger für Datenprobleme ist und
+* von MediaWiki nicht immer adäquat unterstützt wird.
+
+Deine MySQL-Installation unterstützt nicht InnoDB. Eventuell muss eine Aktualisierung durchgeführt werden.",
'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.
@@ -4060,7 +4298,6 @@ Dies ist effizienter als der UTF-8-Modus von MySQL und ermöglicht so die Verwen
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 [//de.wikipedia.org/wiki/Basic_Multilingual_Plane#Gliederung_in_Ebenen_und_Bl.C3.B6cke ''Basic Multilingual Plane'' (BMP)] gespeichert werden.",
- 'config-ibm_db2-low-db-pagesize' => "Die DB2-Datenbank verfügt über einen Standardtabellenraum mit einer unzureichenden Seitengröße. Die Seitengröße muss '''32 000'' oder größer sein.",
'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' => 'Den Namen des Wikis angeben.',
@@ -4147,11 +4384,11 @@ Für den Fall, dass die E-Mail-Funktionen nicht benötigt werden, können sie hi
'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'''.",
+Die Aktivierung dieser Funktion wird bei offenen Wikis, mit Hinblick auf möglichen Missbrauch der E-Mail-Funktionen, '''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.',
+Bei vielen 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.
@@ -4163,9 +4400,11 @@ Hernach kann diese Option aktiviert werden.',
'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 links oberhalb der Seitenleiste über Platz für eine Logo mit den Maßen 135x160 Pixel.
+ 'config-logo-help' => 'Die Standardoberfläche von MediaWiki verfügt links oberhalb der Seitenleiste über Platz für ein Logo mit den Maßen 135x160 Pixel.
Bitte ein Logo in entsprechender Größe hochladen und die zugehörige URL an dieser Stelle angeben.
+Du kannst <code>$wgStylePath</code> oder <code>$wgScriptPath</code> verwenden, falls dein Logo relativ zu diesen Pfaden ist.
+
Sofern kein Logo benötigt wird, kann dieses Datenfeld leer bleiben.',
'config-instantcommons' => '„InstantCommons“ aktivieren',
'config-instantcommons-help' => '[//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 [//commons.wikimedia.org/ Wikimedia Commons] verfügbar sind.
@@ -4182,7 +4421,7 @@ Die Lizenz ist daher jetzt manuell einzugeben.',
Es wird sehr empfohlen es für mittelgroße bis große Wikis zu nutzen, aber auch für kleine Wikis ergeben sich erkennbare Geschwindigkeitsverbesserungen.',
'config-cache-none' => 'Kein Objektcaching (es wird keine Funktion entfernt, allerdings kann dies die Geschwindigkeit größerer Wikis negativ beeinflussen)',
'config-cache-accel' => 'Objektcaching von PHP (APC, XCache oder WinCache)',
- 'config-cache-memcached' => 'Memchached Cacheserver nutzen (erfordert einen zusätzliche Installationsvorgang mitsamt Konfiguration)',
+ 'config-cache-memcached' => 'Memcached Cacheserver nutzen (erfordert einen zusätzlichen 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:
@@ -4259,6 +4498,9 @@ Sobald alles erledigt wurde, kann auf das '''[$2 Wiki zugegriffen werden]'''. Wi
'config-download-localsettings' => '<code>LocalSettings.php</code> herunterladen',
'config-help' => 'Hilfe',
'config-nofile' => 'Die Datei „$1“ konnte nicht gefunden werden. Wurde sie gelöscht?',
+ 'config-extension-link' => 'Wusstest du, dass dein Wiki [//www.mediawiki.org/wiki/Manual:Extensions Erweiterungen] unterstützt?
+
+Du kannst [//www.mediawiki.org/wiki/Category:Extensions_by_category Erweiterungen nach Kategorie] durchsuchen oder die [//www.mediawiki.org/wiki/Extension_Matrix Erweiterungstabelle] ansehen, um eine volle Erweiterungsliste zu erhalten.',
'mainpagetext' => "'''MediaWiki wurde erfolgreich installiert.'''",
'mainpagedocfooter' => 'Hilfe zur Benutzung und Konfiguration der Wiki-Software findest du im [//meta.wikimedia.org/wiki/Help:Contents Benutzerhandbuch].
@@ -4279,7 +4521,7 @@ $messages['de-formal'] = array(
== Starthilfen ==
* [//www.mediawiki.org/wiki/Manual:Configuration_settings Liste der Konfigurationsvariablen]
* [//www.mediawiki.org/wiki/Manual:FAQ MediaWiki-FAQ]
-* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce Mailingliste neuer MediaWiki-Versionen]',
+* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce Mailingliste neuer MediaWiki-Versionen]', # Fuzzy
);
/** Zazaki (Zazaki)
@@ -4317,7 +4559,6 @@ $messages['diq'] = array(
'config-charset-mysql5-binary' => 'MySQL 4.1/5.0 dılet',
'config-charset-mysql5' => 'MySQL 4.1/5.0 UTF-8',
'config-db-port' => 'Portê database:',
- 'config-type-ibm_db2' => 'IBM DB2',
'config-header-mysql' => 'Sazkardışê MySQL',
'config-mysql-innodb' => 'InnoDB',
'config-mysql-myisam' => 'MyISAM',
@@ -4346,7 +4587,7 @@ $messages['diq'] = array(
* [//www.mediawiki.org/wiki/Manual:Configuration_settings Lista eyaranê vıraştışi]
* [//www.mediawiki.org/wiki/Manual:FAQ MediaWiki de ÇZP]
-* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce MediaWiki ra lista serbest-dayışê postey]',
+* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce MediaWiki ra lista serbest-dayışê postey]', # Fuzzy
);
/** Lower Sorbian (dolnoserbski)
@@ -4376,7 +4617,7 @@ $messages['dtp'] = array(
== Kopotimpuunan ==
* [//www.mediawiki.org/wiki/Manual:Configuration_settings Lis papatantu nuludan]
* [//www.mediawiki.org/wiki/Manual:FAQ Ponguhatan Koinsoruan om Simbar ModiaWiki]
-* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce Lis pininsuratan pinolabus do ModiaWiki]',
+* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce Lis pininsuratan pinolabus do ModiaWiki]', # Fuzzy
);
/** Greek (Ελληνικά)
@@ -4416,7 +4657,6 @@ $messages['el'] = array(
'config-header-postgres' => 'Ρυθμίσεις PostgreSQL',
'config-header-sqlite' => 'Ρυθμίσεις SQLite',
'config-header-oracle' => 'Ρυθμίσεις Oracle',
- 'config-header-ibm_db2' => 'Ρυθμίσεις IBM DB2',
'config-invalid-db-type' => 'Μη έγκυÏος Ï„Ïπος βάσης δεδομένων',
'config-mysql-utf8' => 'UTF-8',
'config-site-name' => 'Όνομα του βίκι:',
@@ -4484,13 +4724,15 @@ $messages['eo'] = array(
* [//www.mediawiki.org/wiki/Manual:Configuration_settings Listo de konfiguraĵoj] (angla)
* [//www.mediawiki.org/wiki/Manual:FAQ MediaWiki Oftaj Demandoj] (angla)
-* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce MediaWiki dissendolisto pri anoncoj] (angla)",
+* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce MediaWiki dissendolisto pri anoncoj] (angla)", # Fuzzy
);
/** Spanish (español)
* @author Armando-Martin
+ * @author Ciencia Al Poder
* @author Crazymadlover
* @author Danke7
+ * @author Fitoschido
* @author Locos epraix
* @author Od1n
* @author Platonides
@@ -4552,7 +4794,7 @@ Verifica tu php.ini y comprueba que <code>session.save_path</code> está estable
'config-restart' => 'Sí, reiniciarlo',
'config-welcome' => '=== Comprobación del entorno ===
Se realiza comprobaciones 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.',
+Deberás suministrar los resultados de tales comprobaciones si necesitas ayuda durante la instalación.', # Fuzzy
'config-copyright' => "=== Derechos de autor y Términos de uso ===
$1
@@ -4629,6 +4871,7 @@ El caché de objetos no está habilitado.",
'config-mod-security' => "''' Advertencia ''': Su servidor web tiene [http://modsecurity.org/ mod_security] habilitado. Si la configuración es incorrecta, puede causar problemas a MediaWiki u otro software que permita a los usuarios publicar contenido arbitrarios.
Consulte la [http://modsecurity.org/documentation/ documentación de mod_security] o contacte con el soporte de su servidor (''host'') si encuentra errores aleatorios.",
'config-diff3-bad' => 'GNU diff3 no se encuentra.',
+ 'config-git-bad' => 'No se encontró el software de control de versiones Git.',
'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.
@@ -4725,7 +4968,6 @@ Considere la posibilidad de poner la base de datos en algún otro sitio, por eje
'config-type-postgres' => 'PostgreSQL',
'config-type-sqlite' => 'SQLite',
'config-type-oracle' => 'Oracle',
- 'config-type-ibm_db2' => 'IBM DB2',
'config-support-info' => 'MediaWiki es compatible con los siguientes sistemas de bases de datos:
$1
@@ -4735,17 +4977,15 @@ Si no encuentras en el listado el sistema de base de datos que estás intentando
'config-support-postgres' => '$1 es un popular sistema de 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]). Puede haber algunos defectos menores destacables, y no es recomendable para uso en un entorno de producción.',
'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 usando 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-support-ibm_db2' => '* $1 es una base de datos comercial a nivel empresarial ([http://www.php.net/manual/es/ibm-db2.installation.php cómo compilar PHP con compatibilidad con ibm_db2]).', # Fuzzy
'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-header-ibm_db2' => 'Configuración de IBM DB2',
'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-missing-db-host' => 'Debe introducir un valor para "Servidor (host) de base de datos"',
'config-missing-db-server-oracle' => 'Debe introducir un valor para "TNS de la base de datos"',
- 'config-invalid-db-server-oracle' => 'El TNS de la base de datos, "$1", es inválido.Use sólo carateres ASCII: letras (a-z, A-Z), números (0-9), guiones bajos (_) y guiones (-).Usa sólo caracteres ASCII: letras (a-z, A-Z), dígitos (0-9), guiones bajos (_) y puntos (.).',
+ 'config-invalid-db-server-oracle' => 'El TNS de la base de datos, "$1", es inválido.Use sólo carateres ASCII: letras (a-z, A-Z), números (0-9), guiones bajos (_) y guiones (-).Usa sólo caracteres ASCII: letras (a-z, A-Z), dígitos (0-9), guiones bajos (_) y puntos (.).', # Fuzzy
'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), números (0-9), guiones bajos (_)y guiones (-).',
'config-invalid-db-prefix' => 'El prefijo de la base de datos "$1" es inválido.
@@ -4801,7 +5041,7 @@ Esto '''no se recomienda''' a menos que esté teniendo problemas con su wiki.",
'config-upgrade-done-no-regenerate' => 'Actualización completa.
Usted puede ahora [$1 empezar a usar su wiki].',
- 'config-regenerate' => 'Regenerar <code>LocalSettings.php</code> →',
+ 'config-regenerate' => 'Regenerar LocalSettings.php →',
'config-show-table-status' => '<code>SHOW TABLE STATUS</code> 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',
@@ -4831,7 +5071,6 @@ Las bases de datos MyISAM tienden a corromperse más a menudo que las bases de d
Esto es más eficiente que el modo UTF-8 de MySQL y le permite utilizar la gama completa de caracteres Unicode.
En '''modo UTF-8''', MySQL sabrá qué conjunto de caracteres emplean sus datos y puede presentarlos y convertirlos adecuadamente, pero no le permitirá almacenar caracteres por encima del [//en.wikipedia.org/wiki/Mapping_of_Unicode_character_planes plano multilingüe básico].",
- 'config-ibm_db2-low-db-pagesize' => "Su base de datos DB2 tiene un espacio de tablas por defecto con un tamaño de página insuficiente. El tamaño de página tiene que ser '''32 K''' o superior.",
'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.',
@@ -4875,7 +5114,7 @@ Ahora puedes saltarte el resto de pasos e instalar el wiki con valores predeterm
'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', # Fuzzy
+ 'config-profile-wiki' => 'Wiki abierto',
'config-profile-no-anon' => 'Creación de cuenta requerida',
'config-profile-fishbowl' => 'Sólo editores autorizados',
'config-profile-private' => 'Wiki privado',
@@ -4934,14 +5173,14 @@ Para obtener más información, lea la [//www.mediawiki.org/wiki/Manual:Security
Para habilitar la carga de archivos, cambie el modo en el subdirectorio <code>images</code> bajo el directorio raíz de MediaWiki para que el servidor web pueda escribir en él.
A continuación, habilite esta opción.',
- 'config-upload-deleted' => '*Directório para los archivos eliminados:',
+ 'config-upload-deleted' => '*Directorio 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-logo-help' => 'La apariencia por defecto de MediaWiki incluye espacio para un logotipo de 135x160 píxeles encima del menú de la barra lateral.
Cargue una imagen de tamaño adecuado e introduzca la dirección URL aquí.
-Si no desea un logotipo, deje esta casilla en blanco.',
+Si no desea un logotipo, deje esta casilla en blanco.', # Fuzzy
'config-instantcommons' => 'Habilitar Instant Commons',
'config-instantcommons-help' => '[//www.mediawiki.org/wiki/InstantCommons Instant Commons] es una característica que permite que los wikis puedan utilizar imágenes, sonidos y otros archivos multimedia que se encuentran en el sitio [//commons.wikimedia.org/ Wikimedia Commons].
Para ello, MediaWiki requiere acceso a Internet.
@@ -5051,7 +5290,7 @@ $messages['es-formal'] = array(
== Empezando ==
* [//www.mediawiki.org/wiki/Manual:Configuration_settings Lista de ajustes de configuración]
* [//www.mediawiki.org/wiki/Manual:FAQ/es FAQ de MediaWiki]
-* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce Lista de correo de anuncios de distribución de MediaWiki]',
+* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce Lista de correo de anuncios de distribución de MediaWiki]', # Fuzzy
);
/** Estonian (eesti)
@@ -5196,7 +5435,7 @@ $messages['eu'] = array(
'config-admin-password' => 'Pasahitza:',
'config-admin-password-confirm' => 'Pasahitza berriz:',
'config-admin-email' => 'E-posta helbidea:',
- 'config-profile-wiki' => 'Wiki tradizionala',
+ 'config-profile-wiki' => 'Wiki tradizionala', # Fuzzy
'config-profile-private' => 'Wiki pribatua',
'config-license' => 'Copyright eta lizentzia:',
'config-license-pd' => 'Domeinu Askea',
@@ -5212,7 +5451,7 @@ $messages['eu'] = array(
* [//www.mediawiki.org/wiki/Manual:Configuration_settings Konfigurazio balioen zerrenda]
* [//www.mediawiki.org/wiki/Manual:FAQ MediaWiki FAQ (Maiz egindako galderak)]
-* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce MediaWikiren argitalpenen posta zerrenda]',
+* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce MediaWikiren argitalpenen posta zerrenda]', # Fuzzy
);
/** Extremaduran (estremeñu)
@@ -5225,7 +5464,7 @@ $messages['ext'] = array(
* [//www.mediawiki.org/wiki/Manual:Configuration_settings Configuration settings list]
* [//www.mediawiki.org/wiki/Manual:FAQ MediaWiki FAQ]
-* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce MediaWiki release mailing list]",
+* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce MediaWiki release mailing list]", # Fuzzy
);
/** Persian (Ùارسی)
@@ -5316,6 +5555,7 @@ $messages['fa'] = array(
* @author Crt
* @author Nike
* @author Olli
+ * @author Silvonen
* @author Str4nd
* @author VezonThunder
* @author ì•„ë¼
@@ -5411,6 +5651,7 @@ Asennus saattaa epäonnistua!",
'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-db-charset' => 'Tietokannan merkistö',
'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',
@@ -5419,13 +5660,10 @@ Asennus saattaa epäonnistua!",
'config-type-postgres' => 'PostgreSQL',
'config-type-sqlite' => 'SQLite',
'config-type-oracle' => 'Oracle',
- 'config-type-ibm_db2' => 'IBM DB2',
- 'config-support-ibm_db2' => '* $1 on kaupallinen tietokanta yrityskäyttöön.', # Fuzzy
'config-header-mysql' => 'MySQL-asetukset',
'config-header-postgres' => 'PostgreSQL-asetukset',
'config-header-sqlite' => 'SQLite-asetukset',
'config-header-oracle' => 'Oracle-asetukset',
- 'config-header-ibm_db2' => 'IBM DB2 -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.
@@ -5449,7 +5687,7 @@ Tämä '''ei ole suositeltavaa''', jos wikissäsi ei ole ongelmia.",
'config-upgrade-done-no-regenerate' => 'Päivitys valmis.
Voit [$1 aloittaa wikin käytön].',
- 'config-regenerate' => 'Luo <code>LocalSettings.php</code> uudelleen →',
+ 'config-regenerate' => 'Luo LocalSettings.php uudelleen →',
'config-show-table-status' => 'Kysely <code>SHOW TABLE STATUS</code> epäonnistui!',
'config-mysql-engine' => 'Tallennusmoottori',
'config-mysql-innodb' => 'InnoDB',
@@ -5582,9 +5820,9 @@ Vérifiez votre fichier php.ini et assurez-vous que <code>session.save_path</cod
'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-welcome' => '=== Vérifications liées à l’environnement ===
+Des vérifications de base vont maintenant être effectuées pour voir si cet environnement est adapté à l’installation de MediaWiki.
+Rappelez-vous d’inclure ces informations si vous recherchez de l’aide sur la manière de terminer l’installation.',
'config-copyright' => "=== Droit d'auteur et conditions ===
$1
@@ -5653,6 +5891,10 @@ MédiaWiki nécessite la gestion d’UTF-8 pour fonctionner correctement.",
Cette valeur est probablement trop faible.
Il est possible que l’installation échoue !",
'config-ctype' => "'''Fatal ''': PHP doit être compilé avec le support pour l'[http://www.php.net/manual/en/ctype.installation.php extension Ctype].",
+ 'config-json' => "'''Erreur fatale :''' PHP a été compilé sans le support de JSON.
+Vous devez soit installez l’extension JSON de PHP ou l’extension [http://pecl.php.net/package/jsonc PECL jsonc] avant d’installer MediaWiki.
+* L’extension PHP est comprise dans Red Hat Enterprise Linux (CentOS) 5 et 6, mais doit être activée dans <code>/etc/php.ini</code> ou <code>/etc/php.d/json.ini</code>.
+* Certaines distributions Linux après mai 2013 ne comprennent pas l’extension PHP, mais oint mis à la place l’extension PECL sous al forme <code>php5-json</code> ou <code>php-pecl-jsonc</code>.",
'config-xcache' => '[http://xcache.lighttpd.net/ XCache] est installé',
'config-apc' => '[http://www.php.net/apc APC] est installé',
'config-wincache' => '[http://www.iis.net/download/WinCacheForPhp WinCache] est installé',
@@ -5661,6 +5903,8 @@ La mise en cache d'objets n'est pas activée.",
'config-mod-security' => "'''Attention''': Votre serveur web a [http://modsecurity.org/ mod_security] activé. S&il est mal configuré, cela peut poser des problèmes à MediaWiki ou à d'autres applications qui permettent aux utilisateurs de publier un contenu quelconque.
Reportez-vous à [http://modsecurity.org/documentation/ la documentation de mod_security] ou contactez le support de votre hébergeur si vous rencontrez des erreurs aléatoires.",
'config-diff3-bad' => 'GNU diff3 introuvable.',
+ 'config-git' => 'Logiciel de contrôle de version Git trouvé : <code>$1</code>.',
+ 'config-git-bad' => 'Logiciel de contrôle de version Git non trouvé.',
'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.
@@ -5754,7 +5998,6 @@ Envisagez de placer la base de données ailleurs, par exemple dans <code>/var/li
'config-type-postgres' => 'PostgreSQL',
'config-type-sqlite' => 'SQLite',
'config-type-oracle' => 'Oracle',
- 'config-type-ibm_db2' => 'IBM DB2',
'config-support-info' => "MediaWiki supporte ces systèmes de bases de données :
$1
@@ -5764,18 +6007,16 @@ Si vous ne voyez pas le système de base de données que vous essayez d'utiliser
'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]). Il peut contenir quelques bogues mineurs et n'est pas recommandé dans un environnement de production.",
'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-support-ibm_db2' => "* $1 est une base de données d'entreprise commerciale. ([http://www.php.net/manual/en/ibm-db2.installation.php Comment compiler PHP avec le support de DB2 d’IBM])",
'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-header-ibm_db2' => 'paramètres de IBM DB2',
'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 (.).',
+Utilisez uniquement la chaîne "TNS Name" ou "Easy Connect" ([http://docs.oracle.com/cd/E11882_01/network.112/e10836/naming.htm Méthodes de nommage Oracle])',
'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 ».
@@ -5831,7 +6072,7 @@ Ce '''n'est pas recommandé''' sauf si vous rencontrez des problèmes avec votre
'config-upgrade-done-no-regenerate' => 'Mise à jour terminée.
Vous pouvez maintenant [$1 commencer à utiliser votre wiki].',
- 'config-regenerate' => 'Regénérer <code>LocalSettings.php</code> →',
+ 'config-regenerate' => 'Regénérer LocalSettings.php →',
'config-show-table-status' => 'Échec de la requête <code>SHOW TABLE STATUS</code> !',
'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",
@@ -5848,6 +6089,12 @@ Le compte que vous spécifiez ici doit déjà exister.",
* il est plus sujet à la corruption que les autres moteurs
* le codebase MediaWiki ne gère pas toujours MyISAM comme il se doit
Si votre installation MySQL supporte InnoDB, il est fortement recommandé que vous le choisissez plutôt. Si votre installation MySQL ne supporte pas les tables InnoDB, il est peut-être temps de faire une mise à niveau.",
+ 'config-mysql-only-myisam-dep' => "'''Attention :''' MyISAM est le seul moteur de stockage disponible pour MySQL qui ne soit pas recommandé pour une utilsiation avec MédiaWiki, car :
+* il supporte très peu les accès concurrents à cause du verrouillage des tables
+* il est plus sujet à corruption que les autres moteurs
+* le code de base de MédiaWiki ne gère pas toujours MyISAM comme il faudrait
+
+Votre installation MySQL ne supporte pas InnoDB ; il est peut-être temps de la mettre à jour.",
'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.",
@@ -5858,7 +6105,6 @@ Si votre installation MySQL supporte InnoDB, il est fortement recommandé que vo
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 [//en.wikipedia.org/wiki/Mapping_of_Unicode_character_planes plan multilingue de base] (en anglais).",
- 'config-ibm_db2-low-db-pagesize' => "Votre base de données DB2 a un espace de stockage par défaut avec un pagesize insuffisant. Le pagesize doit être au minimum '''32K'''.",
'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.',
@@ -5963,10 +6209,12 @@ Ensuite, activez cette option.",
'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.
+ 'config-logo-help' => 'L’habillage par défaut de MediaWiki comprend l’espace pour un logo de 135x160 pixels au-dessus de la barre de menu latérale.
+Téléchargez une image de la taille appropriée, et entrez son URL ici.
+
+Vous pouvez utiliser <code>$wgStylePath</code> ou <code>$wgScriptPath</code> si votre logo est relatif à ces chemins.
-Si vous ne voulez pas d'un logo, laissez cette case vide.",
+Si vous ne voulez pas de logo, laissez cette case vide.',
'config-instantcommons' => "Activer ''InstantCommons''",
'config-instantcommons-help' => "[//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 [//commons.wikimedia.org/ Wikimedia Commons].
Pour se faire, il faut que MediaWiki accède à Internet.
@@ -6056,6 +6304,9 @@ Lorsque c'est fait, vous pouvez '''[$2 accéder à votre wiki]'''.",
'config-download-localsettings' => 'Télécharger <code>LocalSettings.php</code>',
'config-help' => 'aide',
'config-nofile' => 'Le fichier « $1 » est introuvable. A-t-il été supprimé ?',
+ 'config-extension-link' => 'Saviez-vous que votre wiki supporte [//www.mediawiki.org/wiki/Manual:Extensions des extensions] ?
+
+Vous pouvez consulter les [//www.mediawiki.org/wiki/Category:Extensions_by_category extensions par catégorie] ou la [//www.mediawiki.org/wiki/Extension_Matrix Matrice des extensions] pourvoir la liste complète des extensions.',
'mainpagetext' => "'''MediaWiki a été installé avec succès.'''",
'mainpagedocfooter' => 'Consultez le [//meta.wikimedia.org/wiki/Aide:Contenu Guide de l’utilisateur] pour plus d’informations sur l’utilisation de ce logiciel de wiki.
@@ -6076,7 +6327,7 @@ $messages['frc'] = array(
* [//www.mediawiki.org/wiki/Manual:Configuration_settings Réglage]
* [//www.mediawiki.org/wiki/Manual:FAQ MediaWiki: Questions Souvent Posées]
-* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce MediaWiki Liste à Malle]',
+* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce MediaWiki Liste à Malle]', # Fuzzy
);
/** Franco-Provençal (arpetan)
@@ -6137,18 +6388,16 @@ Portant, MediaWiki at fôta de PHP $2 ou ben ples hôt.',
'config-sqlite-dir' => 'Dossiér de les balyês SQLite :',
'config-oracle-def-ts' => "Èspâço de stocâjo (''tablespace'') per dèfôt :",
'config-oracle-temp-ts' => "Èspâço de stocâjo (''tablespace'') temporèro :",
- 'config-type-ibm_db2' => 'IBM DB2',
'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-header-ibm_db2' => 'Paramètres d’IBM DB2',
'config-invalid-db-type' => 'Tipo de bâsa de balyês envalido',
'config-missing-db-name' => 'Vos dête buchiér una valor por « Nom de la bâsa de balyês »',
'config-missing-db-host' => 'Vos dête buchiér una valor por « Hôto de la bâsa de balyês »',
'config-missing-db-server-oracle' => 'Vos dête buchiér una valor por « TNS de la bâsa de balyês »',
'config-sqlite-readonly' => 'Lo fichiér <code>$1</code> est pas accèssiblo en ècritura.',
- 'config-regenerate' => 'Refâre <code>LocalSettings.php</code> →',
+ 'config-regenerate' => 'Refâre LocalSettings.php →',
'config-show-table-status' => 'Falyita de la requéta <code>SHOW TABLE STATUS</code> !',
'config-db-web-account' => 'Compto de la bâsa de balyês por l’accès vouèbe',
'config-db-web-account-same' => 'Utilisâd lo mémo compto que por l’enstalacion',
@@ -6240,18 +6489,18 @@ Portant, MediaWiki at fôta de PHP $2 ou ben ples hôt.',
);
/** Northern Frisian (Nordfriisk)
+ * @author Murma174
* @author Pyt
*/
$messages['frr'] = array(
'mainpagetext' => "'''MediaWiki wörd ma erfolch instaliird.'''",
- 'mainpagedocfooter' => 'Heelp tu jü benjüting än konfigurasjoon foon e Wiki-software fanst dü önj dåt [//meta.wikimedia.org/wiki/Help:Contents Benutzerhandbuch].
-
-
-== Startheelpe ==
+ 'mainpagedocfooter' => "Consult the [//meta.wikimedia.org/wiki/Help:Contents User's Guide] for information on using the wiki software.
-* [//www.mediawiki.org/wiki/Manual:Configuration_settings Liste der Konfigurationsvariablen]
-* [//www.mediawiki.org/wiki/Manual:FAQ MediaWiki-FAQ]
-* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce Mailingliste neuer MediaWiki-Versionen]',
+== Getting started ==
+* [//www.mediawiki.org/wiki/Manual:Configuration_settings Configuration settings list]
+* [//www.mediawiki.org/wiki/Manual:FAQ MediaWiki FAQ]
+* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce MediaWiki release mailing list]
+* [//www.mediawiki.org/wiki/Localisation#Translation_resources Localise MediaWiki for your language]",
);
/** Friulian (furlan)
@@ -6270,7 +6519,7 @@ $messages['fy'] = array(
* [//www.mediawiki.org/wiki/Manual:Configuration_settings List mei ynstellings]
* [//www.mediawiki.org/wiki/Manual:FAQ Faak stelde fragen (FAQ)]
-* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce Mailinglist foar oankundigings fan nije ferzjes]",
+* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce Mailinglist foar oankundigings fan nije ferzjes]", # Fuzzy
);
/** Irish (Gaeilge)
@@ -6283,7 +6532,7 @@ $messages['ga'] = array(
'config-help' => 'Cuidiú',
'mainpagetext' => "'''D'éirigh le suiteáil MediaWiki.'''",
'mainpagedocfooter' => 'Féach ar [//meta.wikimedia.org/wiki/MediaWiki_localisation doiciméid um conas an chomhéadán a athrú]
-agus an [//meta.wikimedia.org/wiki/MediaWiki_User%27s_Guide Lámhleabhar úsáideora] chun cabhair úsáide agus fíoraíochta a fháil.',
+agus an [//meta.wikimedia.org/wiki/MediaWiki_User%27s_Guide Lámhleabhar úsáideora] chun cabhair úsáide agus fíoraíochta a fháil.', # Fuzzy
);
/** Gagauz (Gagauz)
@@ -6296,7 +6545,7 @@ $messages['gag'] = array(
* [//www.mediawiki.org/wiki/Manual:Configuration_settings Configuration settings list]
* [//www.mediawiki.org/wiki/Manual:FAQ MediaWiki FAQ]
-* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce MediaWiki release mailing list]",
+* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce MediaWiki release mailing list]", # Fuzzy
);
/** Simplified Gan script (赣语(简体)‎)
@@ -6309,20 +6558,21 @@ $messages['gan-hans'] = array(
* [//www.mediawiki.org/wiki/Manual:Configuration_settings MediaWiki é…置设定列表]
* [//www.mediawiki.org/wiki/Manual:FAQ MediaWiki 平常问题解答]
-* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce MediaWiki å‘布email清å•]',
+* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce MediaWiki å‘布email清å•]', # Fuzzy
);
/** Traditional Gan script (贛語(ç¹é«”)‎)
+ * @author Symane
*/
$messages['gan-hant'] = array(
- 'mainpagetext' => "'''安è£æ­£MediaWikiå˜ã€‚'''",
+ 'mainpagetext' => "'''安è£æ­£MediaWiki哩。'''",
'mainpagedocfooter' => 'åƒçœ‹[//meta.wikimedia.org/wiki/Help:Contents 用戶指å—]裡頭會話到啷用wiki軟件
== 開始使用 ==
* [//www.mediawiki.org/wiki/Manual:Configuration_settings MediaWiki é…置設定列表]
* [//www.mediawiki.org/wiki/Manual:FAQ MediaWiki 平常å•é¡Œè§£ç­”]
-* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce MediaWiki 發佈email清單]',
+* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce MediaWiki 發佈email清單]', # Fuzzy
);
/** Scottish Gaelic (Gàidhlig)
@@ -6396,8 +6646,8 @@ Comprobe o seu php.ini e asegúrese de que en <code>session.save_path</code> est
'config-help-restart' => 'Quere eliminar todos os datos gardados e reiniciar o proceso de instalación?',
'config-restart' => 'Si, reiniciala',
'config-welcome' => '=== Comprobación da contorna ===
-Cómpre realizar unhas comprobacións básicas para ver se a contorna é axeitada para a instalación de MediaWiki.
-Deberá proporcionar os resultados destas comprobacións se necesita axuda durante a instalación.',
+Cómpre realizar agora unhas comprobacións básicas para ver se a contorna é axeitada para a instalación de MediaWiki.
+Lembre incluír esta información se necesita axuda para completar a instalación.',
'config-copyright' => "=== Dereitos de autor e termos de uso ===
$1
@@ -6466,7 +6716,11 @@ MediaWiki necesita soporte UTF-8 para funcionar correctamente.",
'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-ctype' => "'''Fatal:''' O PHP debe compilarse co soporte para a [http://www.php.net/manual/en/ctype.installation.php extensión Ctype].",
+ 'config-ctype' => "'''Erro fatal:''' O PHP debe compilarse co soporte para a [http://www.php.net/manual/en/ctype.installation.php extensión Ctype].",
+ 'config-json' => "'''Erro fatal:''' O PHP compilouse sen o soporte de JSON.
+Debe instalar ben a extensión JSON do PHP ou a extensión [http://pecl.php.net/package/jsonc PECL jsonc] antes de instalar MediaWiki.
+* A extensión do PHP está incluída en Red Hat Enterprise Linux (CentOS) 5 e 6, mais debe activarse <code>/etc/php.ini</code> ou <code>/etc/php.d/json.ini</code>.
+* Algunhas distribucións do Linux lanzadas despois de maio de 2013 omiten a extensión do PHP, pero inclúen a extensión PECL como <code>php5-json</code> ou <code>php-pecl-jsonc</code>.",
'config-xcache' => '[http://xcache.lighttpd.net/ XCache] está instalado',
'config-apc' => '[http://www.php.net/apc APC] está instalado',
'config-wincache' => '[http://www.iis.net/download/WinCacheForPhp WinCache] está instalado',
@@ -6475,6 +6729,8 @@ A caché de obxectos está desactivada.",
'config-mod-security' => "'''Atención:''' O seu servidor web ten o [http://modsecurity.org/ mod_security] activado. Se estivese mal configurado, pode causar problemas a MediaWiki ou calquera outro software que permita aos usuarios publicar contidos arbitrarios.
Olle a [http://modsecurity.org/documentation/ documentación do mod_security] ou póñase en contacto co soporte do seu servidor se atopa erros aleatorios.",
'config-diff3-bad' => 'GNU diff3 non se atopou.',
+ 'config-git' => 'Atopouse o software de control da versión de Git: <code>$1</code>.',
+ 'config-git-bad' => 'Non se atopou o software de control da versión de Git.',
'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.
@@ -6571,7 +6827,6 @@ Considere poñer a base de datos nun só lugar, por exemplo en <code>/var/lib/me
'config-type-postgres' => 'PostgreSQL',
'config-type-sqlite' => 'SQLite',
'config-type-oracle' => 'Oracle',
- 'config-type-ibm_db2' => 'IBM DB2',
'config-support-info' => 'MediaWiki soporta os seguintes sistemas de bases de datos:
$1
@@ -6581,18 +6836,16 @@ Se non ve listado a continuación o sistema de base de datos que intenta usar, s
'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 nunha contorna 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 o PHP con soporte OCI8])',
- 'config-support-ibm_db2' => '* $1 é unha base de datos de empresa comercial. ([http://www.php.net/manual/en/ibm-db2.installation.php Como compilar o PHP con soporte IBM DB2])',
'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-header-ibm_db2' => 'Configuración de IBM DB2',
'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 (.).',
+Utilice só "TNS Name" ou unha cadea de texto "Easy Connect" ([http://docs.oracle.com/cd/E11882_01/network.112/e10836/naming.htm métodos de nomeamento de Oracle])',
'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.
@@ -6648,7 +6901,7 @@ 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 <code>LocalSettings.php</code> →',
+ 'config-regenerate' => 'Rexenerar LocalSettings.php →',
'config-show-table-status' => 'A pescuda <code>SHOW TABLE STATUS</code> 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',
@@ -6667,6 +6920,12 @@ A conta que se especifique aquí xa debe existir.',
Se a súa instalación MySQL soporta InnoDB, recoméndase elixilo no canto de MyISAM.
Se a súa instalación MySQL non soporta InnoDB, quizais sexa boa idea realizar unha actualización.",
+ 'config-mysql-only-myisam-dep' => "'''Atención:''' MyISAM é o único motor de almacenamento para MySQL, unha combinación non recomendada para MediaWiki, porque:
+* practicamente non soporta os accesos simultáneos debido ao bloqueo de táboas
+* é máis propenso a corromperse ca outros motores
+* o código base de MediaWiki non sempre manexa o MyISAM como debera
+
+A súa instalación MySQL non soporta InnoDB, quizais sexa boa idea realizar unha actualización.",
'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.
@@ -6679,7 +6938,6 @@ Isto é máis eficaz ca o modo UTF-8 de MySQL e permítelle usar o rango complet
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 [//en.wikipedia.org/wiki/Mapping_of_Unicode_character_planes plan multilingüe básico].",
- 'config-ibm_db2-low-db-pagesize' => "A súa base de datos DB2 ten un espazo de táboa cun tamaño de páxina insuficiente. O tamaño de páxina debe ser '''32k''' ou maior.",
'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.',
@@ -6788,6 +7046,8 @@ O ideal é que non sexa accesible desde a web.',
'config-logo-help' => 'A aparencia de MediaWiki por defecto inclúe espazo para un logo de 135x160 píxeles por riba do menú lateral.
Cargue unha imaxe do tamaño axeitado e introduza o enderezo URL aquí.
+Pode utilizar <code>$wgStylePath</code> ou <code>$wgScriptPath</code> se o seu logo está relacionado con esas rutas.
+
Se non quere un logo, deixe esta caixa en branco.',
'config-instantcommons' => 'Activar Instant Commons',
'config-instantcommons-help' => '[//www.mediawiki.org/wiki/InstantCommons InstantCommons] é unha característica que permite aos wikis usar imaxes, sons e outros ficheiros multimedia atopados no sitio da [//commons.wikimedia.org/wiki/Portada_galega Wikimedia Commons].
@@ -6880,7 +7140,10 @@ $3
Cando faga todo isto, xa poderá '''[$2 entrar no seu wiki]'''.",
'config-download-localsettings' => 'Descargar o <code>LocalSettings.php</code>',
'config-help' => 'axuda',
- 'config-nofile' => 'Non se puido atopar o ficheiro "$1". Se cadra, foi borrado?',
+ 'config-nofile' => 'Non se puido atopar o ficheiro "$1". Se cadra, foi borrado.',
+ 'config-extension-link' => 'Sabía que o seu wiki soporta [//www.mediawiki.org/wiki/Manual:Extensions extensións]?
+
+Pode explorar as [//www.mediawiki.org/wiki/Category:Extensions_by_category extensións por categoría] ou a [//www.mediawiki.org/wiki/Extension_Matrix matriz de extensións] para ollar a lista completa de extensións.',
'mainpagetext' => "'''MediaWiki instalouse correctamente.'''",
'mainpagedocfooter' => 'Consulte a [//meta.wikimedia.org/wiki/Help:Contents guía de usuario] para obter máis información sobre como usar o software wiki.
@@ -6910,7 +7173,7 @@ $messages['grc'] = array(
== ἌÏξασθε ==
* [//www.mediawiki.org/wiki/Manual:Configuration_settings Διαλογή παÏαμέτÏων διαμοÏφώσεως]
* [//www.mediawiki.org/wiki/Manual:FAQ MediaWiki: τὰ πολλάκις αἰτηθέντα]
-* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce Διαλογή διαλέξεων á¼Ï€á½¶ τῶν διανομῶν τῆς MediaWiki]',
+* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce Διαλογή διαλέξεων á¼Ï€á½¶ τῶν διανομῶν τῆς MediaWiki]', # Fuzzy
);
/** Swiss German (Alemannisch)
@@ -7025,6 +7288,7 @@ Miniaturaasichte vu Bilder sin megli, sobald s Uffelade vu Dateie aktiviert isch
);
/** Gujarati (ગà«àªœàª°àª¾àª¤à«€)
+ * @author Ashok modhvadia
* @author Dineshjk
*/
$messages['gu'] = array(
@@ -7034,7 +7298,8 @@ $messages['gu'] = array(
== શરૂઆતના તબકà«àª•à«‡ ==
* [//www.mediawiki.org/wiki/Manual:Configuration_settings કોનફીગà«àª¯à«àª°à«‡àª¶àª¨ સેટીંગà«àª¸àª¨à«€ યાદી]
* [//www.mediawiki.org/wiki/Manual:FAQ વારંવાર પà«àª›àª¾àª¤àª¾ પà«àª°àª¶à«àª¨à«‹]
-* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce મિડીયાવિકિ રીલીઠમેઇલીંગ લીસà«àªŸ]',
+* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce મિડીયાવિકિ રીલીઠમેઇલીંગ લીસà«àªŸ]
+* [//www.mediawiki.org/wiki/Localisation#Translation_resources Localise MediaWiki for your language]',
);
/** Manx (Gaelg)
@@ -7053,7 +7318,7 @@ $messages['hak'] = array(
* [//www.mediawiki.org/wiki/Manual:Configuration_settings MediaWiki Phi-chṳ sat-thin chhîn-tân]
* [//www.mediawiki.org/wiki/Manual:FAQ MediaWiki Phìn-sòng mun-thì kié-tap]
-* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce MediaWiki fat-phu email chhîn-tân]',
+* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce MediaWiki fat-phu email chhîn-tân]', # Fuzzy
);
/** Hawaiian (Hawai`i)
@@ -7289,7 +7554,6 @@ $1
כד××™ לשקול ×œ×©×™× ×ת מסד ×”× ×ª×•× ×™× ×‘×ž×§×•× ×חר לגמרי, למשל ב־<code dir="ltr">/var/lib/mediawiki/yourwik</code>.',
'config-oracle-def-ts' => 'מרחב טבל×ות לפי בררת מחדל (default tablespace):',
'config-oracle-temp-ts' => 'מרחב טבל×ות זמני (temporary tablespace):',
- 'config-type-ibm_db2' => 'IBM DB2',
'config-support-info' => 'מדיה־ויקי תומכת במערכות מסדי ×”× ×ª×•× ×™× ×”×‘×ות:
$1
@@ -7299,12 +7563,10 @@ $1
'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-support-ibm_db2' => '* $1 ×”×•× ×ž×¡×“ × ×ª×•× ×™× ×ž×¡×—×¨×™ ×רגוני. ([http://www.php.net/manual/en/ibm-db2.installation.php How to compile PHP with IBM DB2 support])',
'config-header-mysql' => 'הגדרות MySQL',
'config-header-postgres' => 'הגדרות PostgreSQL',
'config-header-sqlite' => 'הגדרות SQLite',
'config-header-oracle' => 'הגדרות Oracle',
- 'config-header-ibm_db2' => 'תצורת IBM DB2',
'config-invalid-db-type' => 'סוג מסד ×”× ×ª×•× ×™× ×©×’×•×™',
'config-missing-db-name' => 'עליך להזין ערך עבור "×©× ×ž×¡×“ הנתוני×"',
'config-missing-db-host' => 'יש להכניס ערך לשדה "שרת מסד הנתוני×"',
@@ -7366,7 +7628,7 @@ chmod a+w $3</pre></div>',
'config-upgrade-done-no-regenerate' => 'השדרוג הושל×.
עכשיו ×פשר [$1 להתחיל להשתמש בוויקי שלכ×].',
- 'config-regenerate' => 'לחולל מחדש ×ת <code>LocalSettings.php</code> â†',
+ 'config-regenerate' => 'לחולל מחדש ×ת LocalSettings.php â†',
'config-show-table-status' => 'ש×ילתת <code>SHOW TABLE STATUS</code> נכשלה!',
'config-unknown-collation' => "'''×זהרה:''' מסד ×”× ×ª×•× ×™× ×ž×©×ª×ž×© בשיטת מיון ש××™× ×” מוּכּרת.",
'config-db-web-account' => 'חשבון במסד ×”× ×ª×•× ×™× ×œ×’×™×©×” מהרשת',
@@ -7396,7 +7658,6 @@ chmod a+w $3</pre></div>',
×–×” יעיל יותר ממצב UTF-8 של MySQL ומ×פשר ×œ×›× ×œ×”×©×ª×ž×© בכל הטווח של תווי יוניקוד.
ב'''מצב UTF-8'''&rlm; (UTF-8 mode)&rlm; MySQL יֵדַע מה קבוצת ×”×ª×•×•×™× (character set) של הטקסט ×©×œ×›× ×•×™×¦×™×’ וימיר ×ותו בהת××, ×בל ×œ× ×™×פשר ×œ×›× ×œ×©×ž×•×¨ ×ª×•×•×™× ×©××™× × × ×ž×¦××™× ×‘×˜×•×•×— הרב־לשוני הבסיסי ([//en.wikipedia.org/wiki/Mapping_of_Unicode_character_planes Basic Multilingual Plane]).",
- 'config-ibm_db2-low-db-pagesize' => "במסד ×”× ×ª×•× ×™× DB2 ×©×œ×›× ×™×© מרחב טבל×ות לפי מחדלי ×¢× ×’×•×“×œ דף בלתי־מספיק. גודל הדף צריך להיות '''32K''' ×ו יותר.",
'config-site-name' => '×©× ×”×•×•×™×§×™:',
'config-site-name-help' => '×–×” יופיע בשורת הכותרת של הדפדפן ובמקומות ×¨×‘×™× ×חרי×.',
'config-site-name-blank' => '× × ×œ×”×–×™×Ÿ ×©× ×œ×תר.',
@@ -7505,7 +7766,7 @@ chmod a+w $3</pre></div>',
'config-logo-help' => 'המר××” ההתחלתי של מדיה־ויקי מכיל ×ž×§×•× ×œ×¡×ž×œ של 135 על 160 ×¤×™×§×¡×œ×™× ×‘×¤×™× ×” העליונה מעל תפריט הצד.
יש להעלות תמונה בגודל מת××™× ×•×œ×”×›× ×™×¡ ×ת הכתובת ×›×ן.
-×× ××™× ×›× ×¨×•×¦×™× ×¡×ž×œ, הש×ירו ×ת התיבה ×”×–×ת ריקה.',
+×× ××™× ×›× ×¨×•×¦×™× ×¡×ž×œ, הש×ירו ×ת התיבה ×”×–×ת ריקה.', # Fuzzy
'config-instantcommons' => 'להפעיל ×ת Instant Commons',
'config-instantcommons-help' => '[//www.mediawiki.org/wiki/InstantCommons Instant Commons] ×”×™× ×ª×›×•× ×” שמ×פשרת ל×תרי ויקי להשתמש בתמונות, ×‘×¦×œ×™×œ×™× ×•×‘×ž×“×™×” ×חרת שנמצ×ת ב×תר [//commons.wikimedia.org/ ויקישיתוף] (Wikimedia Commons).
כדי לעשות ×ת ×–×”, מדיה־ויקי צריך לגשת ל×ינטרנט.
@@ -7617,7 +7878,7 @@ $messages['hi'] = array(
== शà¥à¤°à¥à¤µà¤¾à¤¤ करें ==
* [//www.mediawiki.org/wiki/Manual:Configuration_settings कॉनà¥à¤«à¤¿à¤—रेशन सेटींगकी सूची]
* [//www.mediawiki.org/wiki/Manual:FAQ मीडियाविकिके बारे में पà¥à¤°à¤¾à¤¯: पूछे जाने वाले सवाल]
-* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce मीडियाविकि मेलिंग लिसà¥à¤Ÿ]',
+* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce मीडियाविकि मेलिंग लिसà¥à¤Ÿ]', # Fuzzy
);
/** Fiji Hindi (Latin script) (Fiji Hindi)
@@ -7630,7 +7891,7 @@ $messages['hif-latn'] = array(
== Getting started ==
* [//www.mediawiki.org/wiki/Manual:Configuration_settings Configuration settings list]
* [//www.mediawiki.org/wiki/Manual:FAQ MediaWiki FAQ]
-* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce MediaWiki release mailing list]",
+* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce MediaWiki release mailing list]", # Fuzzy
);
/** Hiligaynon (Ilonggo)
@@ -7643,7 +7904,7 @@ $messages['hil'] = array(
== Pag-umpisa ==
* [//www.mediawiki.org/wiki/Manual:Configuration_settings Lista sang mga konpigorasyon sang pagkay-o]
* [//www.mediawiki.org/wiki/Manual:FAQ Mga Masami Pamangkoton sa MediaWiki]
-* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce Lista sang mga ginapadal-an sang sulat kon may paguha-on nga MediaWiki]",
+* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce Lista sang mga ginapadal-an sang sulat kon may paguha-on nga MediaWiki]", # Fuzzy
);
/** Croatian (hrvatski)
@@ -7651,7 +7912,7 @@ $messages['hil'] = array(
$messages['hr'] = array(
'mainpagetext' => "'''Softver MediaWiki je uspješno instaliran.'''",
'mainpagedocfooter' => 'Pogledajte [//meta.wikimedia.org/wiki/MediaWiki_localisation dokumentaciju o prilagodbi suÄelja]
-i [//meta.wikimedia.org/wiki/MediaWiki_User%27s_Guide VodiÄ za suradnike] za pomoć pri uporabi i podeÅ¡avanju.',
+i [//meta.wikimedia.org/wiki/MediaWiki_User%27s_Guide VodiÄ za suradnike] za pomoć pri uporabi i podeÅ¡avanju.', # Fuzzy
);
/** Upper Sorbian (hornjoserbsce)
@@ -7843,7 +8104,7 @@ 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' => '<code>LocalSettings.php</code> znowa wutworić →',
+ 'config-regenerate' => 'LocalSettings.php znowa wutworić →',
'config-show-table-status' => 'Naprašowanje <code>SHOW TABLE STATUS</code> 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',
@@ -8012,7 +8273,7 @@ $messages['ht'] = array(
* [//www.mediawiki.org/wiki/Manual:Configuration_settings Lis paramèt yo pou konfigirasyon]
* [//www.mediawiki.org/wiki/Manyèl:FAQ MediaWiki FAQ]
-* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce Lis diskisyon ki parèt sou MediaWiki]',
+* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce Lis diskisyon ki parèt sou MediaWiki]', # Fuzzy
);
/** Hungarian (magyar)
@@ -8230,7 +8491,6 @@ A telepítő készít egy <code>.htaccess</code> fájlt az adatbázis mellé, az
Fontold meg az adatbázis más helyre történő elhelyezését, például a <code>/var/lib/mediawiki/tewikid</code> könyvtárba.",
'config-oracle-def-ts' => 'Alapértelmezett táblatér:',
'config-oracle-temp-ts' => 'Ideiglenes táblatér:',
- 'config-type-ibm_db2' => 'IBM DB2',
'config-support-info' => 'A MediaWiki a következő adatbázisrendszereket támogatja:
$1
@@ -8240,12 +8500,10 @@ Ha az alábbi listán nem találod azt a rendszert, melyet használni szeretnél
'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-support-ibm_db2' => '* Az $1 kereskedelmi vállalati adatbázisrendszer.', # Fuzzy
'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-header-ibm_db2' => 'IBM DB2-beállítások',
'config-invalid-db-type' => 'Érvénytelen adatbázistípus',
'config-missing-db-name' => 'Meg kell adnod az „Adatbázisnév†értékét',
'config-missing-db-host' => 'Meg kell adnod az „Adatbázis hosztneve†értékét',
@@ -8307,7 +8565,7 @@ Ez '''nem ajánlott''', csak akkor, ha problémák vannak a wikivel.",
'config-upgrade-done-no-regenerate' => "A frissítés befejeződött.
Most már '''[$1 beléphetsz a wikibe]'''.",
- 'config-regenerate' => '<code>LocalSettings.php</code> elkészítése újra →',
+ 'config-regenerate' => 'LocalSettings.php elkészítése újra →',
'config-show-table-status' => 'A <code>SHOW TABLE STATUS</code> 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',
@@ -8336,7 +8594,6 @@ A '''MyISAM''' gyorsabb megoldás lehet egyfelhasználós vagy csak olvasható k
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 [//en.wikipedia.org/wiki/Mapping_of_Unicode_character_planes Basic Multilingual Plane] felett vannak.",
- 'config-ibm_db2-low-db-pagesize' => "A DB2 adatbázisodnak alapértelmezett táblatere van elégtelen lapmérettel. A lapméretnek legalább '''32K'''-nak kell lennie.",
'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.',
@@ -8443,7 +8700,7 @@ Normális esetben ennek nem szabad elérhetőnek lennie az internetről.',
'config-logo-help' => 'A MediaWiki alapértelmezett felülete helyet ad egy 135×160 pixeles logónak a bal felső sarokban.
Tölts fel egy megfelelő méretű képet, majd írd be ide az URL-címét!
-Ha nem szeretnél logót használni, egyszerűen hagyd üresen a mezőt.',
+Ha nem szeretnél logót használni, egyszerűen hagyd üresen a mezőt.', # Fuzzy
'config-instantcommons' => 'Instant Commons engedélyezése',
'config-instantcommons-help' => 'Az [//www.mediawiki.org/wiki/InstantCommons Instant Commons] lehetővé teszi, hogy a wikin használhassák a [//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.
@@ -8628,7 +8885,7 @@ $messages['hy'] = array(
* [//www.mediawiki.org/wiki/Manual:Configuration_settings Configuration settings list]
* [//www.mediawiki.org/wiki/Manual:FAQ MediaWiki FAQ]
-* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce MediaWiki release mailing list]",
+* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce MediaWiki release mailing list]", # Fuzzy
);
/** Interlingua (interlingua)
@@ -8787,7 +9044,9 @@ 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-suhosin-max-value-length' => 'Suhosin es installate e limita le longitude del parametro GET a $1 bytes. Le componente ResourceLoader de MediaWiki pote contornar iste limite, ma isto degradara le rendimento. Si possibile, tu deberea mitter <code>suhosin.get.max_value_length</code> a 1024 o plus in <code>php.ini</code> , e mitter <code>$wgResourceLoaderMaxQueryLength</code> al mesme valor in LocalSettings.php .', # Fuzzy
+ 'config-suhosin-max-value-length' => 'Suhosin es installate e limita parametro <code>length</code> de GET a $1 bytes.
+Le componente ResourceLoader de MediaWiki va contornar iste limite, ma isto prejudicara le rendimento.
+Si possibile, tu deberea mitter <code>suhosin.get.max_value_length</code> a 1024 o superior in <code>php.ini</code>, e mitter <code>$wgResourceLoaderMaxQueryLength</code> al mesme valor in <code>LocalSettings.php</code>.',
'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.
@@ -8861,7 +9120,6 @@ Considera poner le base de datos in un loco completemente differente, per exempl
'config-type-postgres' => 'PostgreSQL',
'config-type-sqlite' => 'SQLite',
'config-type-oracle' => 'Oracle',
- 'config-type-ibm_db2' => 'IBM DB2',
'config-support-info' => 'MediaWiki supporta le sequente systemas de base de datos:
$1
@@ -8871,18 +9129,16 @@ Si tu non vide hic infra le systema de base de datos que tu tenta usar, alora se
'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-support-ibm_db2' => '* $1 es un systema commercial de base de datos pro interprisas.', # Fuzzy
'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-header-ibm_db2' => 'Configurationes pro IBM DB2',
'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 (.).',
+Usa o "TNS Name" o un catena "Easy Connect". ([http://docs.oracle.com/cd/E11882_01/network.112/e10836/naming.htm Methodos de nomenclatura de Oracle])',
'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.
@@ -8938,7 +9194,7 @@ 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 <code>LocalSettings.php</code> →',
+ 'config-regenerate' => 'Regenerar LocalSettings.php →',
'config-show-table-status' => 'Le consulta <code>SHOW TABLE STATUS</code> 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',
@@ -8968,7 +9224,6 @@ Le bases de datos MyISAM tende a esser corrumpite plus frequentemente que le bas
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 [//en.wikipedia.org/wiki/Mapping_of_Unicode_character_planes Plano Multilingue Basic].",
- 'config-ibm_db2-low-db-pagesize' => 'Tu base de datos DB2 ha un "tablespace" (spatio de tabella) predefinite con un "pagesize" (dimension de pagina) insufficiente. Le "pagesize" debe esser \'\'\'32K\'\'\' o plus.',
'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.',
@@ -9011,7 +9266,7 @@ 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', # Fuzzy
+ 'config-profile-wiki' => 'Wiki aperte',
'config-profile-no-anon' => 'Creation de conto obligatori',
'config-profile-fishbowl' => 'Modificatores autorisate solmente',
'config-profile-private' => 'Wiki private',
@@ -9021,13 +9276,13 @@ In MediaWiki, il es facile revider le modificationes recente, e reverter omne da
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.
+Le modello '''{{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 [//www.mediawiki.org/wiki/Manual:User_rights pertinente section del manual].", # Fuzzy
+Configurationes de derectos de usator plus complexe es disponibile post installation, vide le [//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',
@@ -9078,6 +9333,8 @@ Idealmente, isto non debe esser accessibile ab le web.',
'config-logo-help' => 'Le apparentia predefinite de MediaWiki include spatio pro un logotypo de 135×160 pixels supra le menu del barra lateral.
Incarga un imagine con le dimensiones appropriate, e entra le URL hic.
+Tu pote usar <code>$wgStylePath</code> o <code>$wgScriptPath</code> si le loco de tu logotypo es relative a iste camminos.
+
Si tu non vole un logotypo, lassa iste quadro vacue.',
'config-instantcommons' => 'Activar "Instant Commons"',
'config-instantcommons-help' => '[//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 [//commons.wikimedia.org/ Wikimedia Commons].
@@ -9112,7 +9369,7 @@ 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".', # Fuzzy
+Pro facer alterationes, clicca sur "{{int:config-back}}".',
'config-install-step-done' => 'finite',
'config-install-step-failed' => 'fallite',
'config-install-extensions' => 'Include le extensiones',
@@ -9178,7 +9435,8 @@ Post facer isto, tu pote '''[$2 entrar in tu wiki]'''.",
== Pro initiar ==
* [//www.mediawiki.org/wiki/Manual:Configuration_settings Lista de configurationes]
* [//www.mediawiki.org/wiki/Manual:FAQ FAQ a proposito de MediaWiki]
-* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce Lista de diffusion pro annuncios de nove versiones de MediaWiki]', # Fuzzy
+* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce Lista de diffusion pro annuncios de nove versiones de MediaWiki]
+* [//www.mediawiki.org/wiki/Localisation#Translation_resources Traducer MediaWiki in tu lingua]',
);
/** Indonesian (Bahasa Indonesia)
@@ -9476,7 +9734,7 @@ Tindakan ini '''tidak dianjurkan''' kecuali jika Anda mengalami masalah dengan w
'config-upgrade-done-no-regenerate' => 'Pemutakhiran selesai.
Anda sekarang dapat [$1 mulai menggunakan wiki Anda].',
- 'config-regenerate' => 'Regenerasi <code>LocalSettings.php</code> →',
+ 'config-regenerate' => 'Regenerasi LocalSettings.php →',
'config-show-table-status' => 'Kueri <code>SHOW TABLE STATUS</code> gagal!',
'config-unknown-collation' => "'''Peringatan:''' basis data menggunakan kolasi yang tidak dikenal.",
'config-db-web-account' => 'Akun basis data untuk akses web',
@@ -9604,7 +9862,7 @@ Idealnya, direktori ini tidak boleh dapat diakses dari web.',
'config-logo-help' => 'Kulit bawaan MediaWiki memberikan ruang untuk logo berukuran 135x160 piksel di atas menu bilah samping.
Unggah gambar dengan ukuran yang sesuai, lalu masukkan URL di sini.
-Jika Anda tidak ingin menyertakan logo, biarkan kotak ini kosong.',
+Jika Anda tidak ingin menyertakan logo, biarkan kotak ini kosong.', # Fuzzy
'config-instantcommons' => 'Aktifkan Instant Commons',
'config-instantcommons-help' => '[//www.mediawiki.org/wiki/InstantCommons Instant Commons] adalah fitur yang memungkinkan wiki untuk menggunakan gambar, suara, dan media lain dari [//commons.wikimedia.org/ Wikimedia Commons].
Untuk melakukannya, MediaWiki memerlukan akses ke Internet.
@@ -9742,7 +10000,7 @@ $messages['io'] = array(
== Komencar ==
* [//www.mediawiki.org/wiki/Manual:Configuration_settings Listo di ''Configuration setting'']
* [//www.mediawiki.org/wiki/Manual:FAQ MediaWiki OQQ]
-* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce MediaWiki nova versioni posto-listo]",
+* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce MediaWiki nova versioni posto-listo]", # Fuzzy
);
/** Icelandic (íslenska)
@@ -9755,7 +10013,7 @@ $messages['is'] = array(
* [//www.mediawiki.org/wiki/Manual:Configuration_settings Listi yfir uppsetningarstillingar]
* [//www.mediawiki.org/wiki/Manual:FAQ MediaWiki Algengar spurningar MediaWiki]
-* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce Póstlisti MediaWiki-útgáfa]',
+* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce Póstlisti MediaWiki-útgáfa]', # Fuzzy
);
/** Italian (italiano)
@@ -9817,8 +10075,8 @@ Controlla il tuo file php.ini ed assicurati che <code>session.save_path</code> Ã
'config-help-restart' => 'Vuoi cancellare tutti i dati salvati che hai inserito e riavviare il processo di installazione?',
'config-restart' => 'Sì, riavvia',
'config-welcome' => "=== Controllo dell'ambiente ===
-Vengono eseguiti controlli di base per vedere se questo ambiente è adatto per l'installazione di MediaWiki.
-Se hai bisogno di aiuto durante l'installazione, è necessario fornire i risultati di questi controlli.",
+Saranno eseguiti controlli di base per vedere se questo ambiente è adatto per l'installazione di MediaWiki.
+Ricordati di includere queste informazioni se chiedi assistenza su come completare l'installazione.",
'config-sidebar' => '* [//www.mediawiki.org Pagina principale MediaWiki]
* [//www.mediawiki.org/wiki/Aiuto:Guida ai contenuti per utenti]
* [//www.mediawiki.org/wiki/Manuale:Guida ai contenuti per admin]
@@ -9854,6 +10112,8 @@ L'installazione potrebbe non riuscire!",
'config-no-cache' => "'''Attenzione:''' [http://www.php.net/apc APC], [http://xcache.lighttpd.net/ XCache] o [http://www.iis.net/download/WinCacheForPhp WinCache] non sono stati trovati.
La caching degli oggetti non è attivata.",
'config-diff3-bad' => 'GNU diff3 non trovato.',
+ 'config-git' => 'Trovato software di controllo della versione Git: <code>$1</code>.',
+ 'config-git-bad' => 'Software di controllo della versione Git non trovato.',
'config-imagemagick' => 'Trovato ImageMagick: <code>$1</code>.
Le miniature delle immagini saranno presenti se gli upload vengono abilitati.',
'config-gd' => 'Trovata la GD Graphics Library built-in.
@@ -9865,16 +10125,50 @@ Installazione interrotta.",
'config-no-cli-uri' => "'''Attenzione''': --scriptpath non specificato, si utilizza il valore predefinito: <code>$1</code>.",
'config-using-server' => 'Nome server in uso "<nowiki>$1</nowiki>".',
'config-using-uri' => 'URL del server in uso "<nowiki>$1$2</nowiki>".',
+ 'config-brokenlibxml' => 'Il tuo sistema ha una combinazione di versioni di PHP e libxml2 che è difettosa e che può provocare un danneggiamento non visibile di dati in MediaWiki ed in altre applicazioni per il web.
+Aggiorna a PHP 5.2.9 o successivo, ed a libxml2 2.7.3 o successivo ([//bugs.php.net/bug.php?id=45996 il bug è studiato dal lato PHP]).
+Installazione interrotta.',
+ 'config-using531' => 'MediaWiki non può essere usato con il PHP $1 a causa di un bug che coinvolge i parametri di riferimento a <code>__call()</code>.
+Aggiorna a PHP 5.3.2 o superiore, o fai un downgrade tornando a PHP 5.3.0 per risolvere il problema.
+Installazione interrotta.',
'config-db-type' => 'Tipo di database:',
+ 'config-db-host' => 'Host del database:',
+ 'config-db-host-help' => 'Se il server del tuo database è su un server diverso, immetti qui il nome dell\'host o il suo indirizzo IP.
+
+Se stai utilizzando un web hosting condiviso, il tuo hosting provider dovrebbe fornirti il nome host corretto nella sua documentazione.
+
+Se stai installando su un server Windows con uso di MySQL, l\'uso di "localhost" potrebbe non funzionare correttamente come nome del server. In caso di problemi, prova a impostare "127.0.0.1" come indirizzo IP locale.
+
+Se usi PostgreSQL, lascia questo campo vuoto per consentire di connettersi tramite un socket Unix.',
+ 'config-db-host-oracle' => 'TNS del database:',
'config-db-wiki-settings' => 'Identifica questo wiki',
'config-db-name' => 'Nome del database:',
+ 'config-db-name-help' => 'Scegli un nome che identifica il tuo wiki.
+Non deve contenere spazi.
+
+Se utilizzi un web hosting condiviso, il tuo hosting provider o ti fornisce uno specifico nome di database da utilizzare, oppure ti consentirà di creare il database tramite un pannello di controllo.',
'config-db-name-oracle' => 'Schema del database:',
+ 'config-db-install-account' => "Account utente per l'installazione",
'config-db-username' => 'Nome utente del database:',
+ 'config-db-password' => 'Password del database:',
'config-db-password-empty' => 'Inserire una password per il nuovo utente del database: $1.
Anche se può essere possibile creare utenti senza password, questo non è sicuro.',
+ 'config-db-install-username' => "Inserisci il nome utente che verrà utilizzato per connettersi al database durante il processo di installazione.
+Questo non è il nome utente dell'account MediaWiki; ma quello per il tuo database.",
+ 'config-db-install-password' => "Inserisci la password che verrà utilizzato per connettersi al database durante il processo di installazione.
+Questa non è la password dell'account MediaWiki; ma quella per il tuo database.",
'config-db-install-help' => "Inserire il nome utente e la password che verranno usate per la connessione al database durante il processo d'installazione.",
+ 'config-db-account-lock' => 'Utilizza lo stesso nome utente e password durante il normale funzionamento',
+ 'config-db-wiki-account' => 'Account utente per il normale funzionamento',
+ 'config-db-wiki-help' => "Inserisci il nome utente e la password che verrà utilizzato per connettersi al database durante il normale funzionamento del wiki.
+Se l'account non esiste, e l'account di installazione dispone di privilegi sufficienti, verrà creato con privilegi minimi necessari per operare sul wiki.",
'config-db-prefix' => 'Prefisso tabella del database:',
+ 'config-db-prefix-help' => "Se hai bisogno di condividere un database tra più wiki, o tra MediaWiki e un'altra applicazione web, puoi scegliere di aggiungere un prefisso a tutti i nomi di tabella, per evitare conflitti.
+Non utilizzare spazi.
+
+Solitamente, questo campo viene lasciato vuoto.",
'config-db-charset' => 'Set di caratteri del database',
+ '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 con compatibilità UTF-8',
'config-mysql-old' => 'MySQL $1 o una versione successiva è necessaria, rilevata la $2.',
@@ -9884,25 +10178,77 @@ Anche se può essere possibile creare utenti senza password, questo non è sicur
Da cambiare solamente se si è sicuri di averne bisogno.',
'config-pg-test-error' => "Impossibile connettersi al database '''$1''': $2",
'config-sqlite-dir' => 'Directory data di SQLite:',
- 'config-type-ibm_db2' => 'IBM DB2',
+ 'config-oracle-def-ts' => 'Tablespace di default:',
+ 'config-oracle-temp-ts' => 'Tablespace temporaneo:',
+ 'config-support-info' => 'MediaWiki supporta i seguenti sistemi di database:
+
+$1
+
+Se fra quelli elencati qui sotto non vedi il sistema di database che vorresti utilizzare, seguire le istruzioni linkate sopra per abilitare il supporto.',
+ 'config-support-mysql' => '* $1 è la configurazione preferibile per MediaWiki ed è quella meglio supportata ([http://www.php.net/manual/en/mysql.installation.php come compilare PHP con supporto MySQL])',
'config-header-mysql' => 'Impostazioni MySQL',
'config-header-postgres' => 'Impostazioni PostgreSQL',
'config-header-sqlite' => 'Impostazioni SQLite',
'config-header-oracle' => 'Impostazioni Oracle',
- 'config-header-ibm_db2' => 'Impostazioni IBM DB2',
'config-invalid-db-type' => 'Tipo di database non valido',
'config-missing-db-name' => 'È necessario immettere un valore per "Nome del database"',
+ 'config-missing-db-host' => 'È necessario immettere un valore per "Host del database"',
+ 'config-missing-db-server-oracle' => 'È necessario immettere un valore per "TNS del database"',
+ 'config-invalid-db-name' => 'Nome di database "$1" non valido.
+Utilizza soltanto caratteri ASCII come lettere (a-z, A-Z), numeri (0-9), sottolineatura (_) e trattini (-).',
+ 'config-invalid-db-prefix' => 'Prefisso database "$1" non valido.
+Utilizza soltanto caratteri ASCII come lettere (a-z, A-Z), numeri (0-9), sottolineatura (_) e trattini (-).',
+ 'config-connection-error' => '$1.
+
+Controlla host, nome utente e password e prova ancora.',
+ 'config-db-sys-create-oracle' => "Il programma di installazione supporta solo l'utilizzo di un account SYSDBA per la creazione di un nuovo account.",
+ 'config-db-sys-user-exists-oracle' => 'L\'account utente "$1" esiste già. SYSDBA può essere usato solo per la creazione di un nuovo account!',
+ 'config-postgres-old' => 'PostgreSQL $1 o una versione successiva è necessaria, rilevata la $2.',
+ 'config-sqlite-name-help' => 'Scegli un nome che identifichi il tuo wiki.
+Non utilizzare spazi o trattini.
+Questo servirà per il nome del file di dati SQLite.',
+ 'config-sqlite-mkdir-error' => 'Errore durante la creazione della directory dati "$1".
+Controlla la posizione e riprova.',
+ 'config-sqlite-dir-unwritable' => 'Impossibile scrivere nella directory "$1".
+Modifica le autorizzazioni in modo che il webserver possa scrivere in essa e riprova.',
+ 'config-sqlite-connection-error' => '$1.
+
+Controlla la directory dati e il nome del database qui sotto, poi riprova.',
+ 'config-sqlite-readonly' => 'Il file <code>$1</code> non è scrivibile.',
+ 'config-sqlite-cant-create-db' => 'Impossibile creare il file di database <code>$1</code> .',
+ 'config-sqlite-fts3-downgrade' => 'Il PHP è mancante del supporto FTS3, declassamento tabelle in corso',
+ 'config-can-upgrade' => "Ci sono tabelle di MediaWiki in questo database.
+Per aggiornarle a MediaWiki $1, fai clic su '''continua'''.",
+ 'config-upgrade-done' => "Aggiornamento completo.
+
+Puoi [$1 iniziare ad usare il tuo wiki].
+
+Se vuoi rigenerare il tuo file <code>LocalSettings.php</code>, clicca sul pulsante sotto. Questa operazione '''non è raccomandata''', a meno che non hai problemi con il tuo wiki.",
+ 'config-upgrade-done-no-regenerate' => 'Aggiornamento completo.
+
+Puoi [$1 iniziare ad usare il tuo wiki].',
+ 'config-regenerate' => 'Rigenera LocalSettings.php →',
+ 'config-show-table-status' => 'La query <code>SHOW TABLE STATUS</code> è fallita!',
+ 'config-unknown-collation' => "'''Attenzione:''' il database utilizza regole di confronto non riconosciute.",
'config-db-web-account' => "Account del database per l'accesso web",
+ 'config-db-web-help' => 'Seleziona il nome utente e la password che il server web utilizzerà per connettersi al server di database, durante il normale funzionamento del wiki.',
+ 'config-db-web-account-same' => "Utilizza lo stesso account dell'installazione",
'config-db-web-create' => "Crea l'account se non esiste già",
+ 'config-db-web-no-create-privs' => "L'account usato per l'installazione non dispone dei privilegi necessari per creare un altro account.
+L'account indicato qui deve già esistere.",
'config-mysql-engine' => 'Storage engine:',
'config-mysql-innodb' => 'InnoDB',
'config-mysql-myisam' => 'MyISAM',
'config-mysql-charset' => 'Set di caratteri del database:',
'config-mysql-binary' => 'Binario',
'config-mysql-utf8' => 'UTF-8',
- 'config-ibm_db2-low-db-pagesize' => "Il database DB2 in uso ha una tablespace predefinita con un insufficiente pagesize, che dovrebbe essere '''32K''' o maggiore.",
+ 'config-site-name' => 'Nome del wiki:',
+ 'config-site-name-help' => 'Questo verrà visualizzato nella barra del titolo del browser e in vari altri posti.',
+ 'config-site-name-blank' => 'Inserisci il nome del sito.',
+ 'config-project-namespace' => 'Namespace del progetto:',
'config-ns-generic' => 'Progetto',
- 'config-ns-site-name' => 'Stesso nome wiki: $1',
+ 'config-ns-site-name' => 'Stesso nome del wiki: $1',
+ 'config-ns-other' => 'Altro (specificare)',
'config-ns-other-default' => 'MyWiki',
'config-admin-box' => 'Account amministratore',
'config-admin-name' => 'Tuo nome:',
@@ -9925,7 +10271,9 @@ Inserire un indirizzo email se si desidera effettuare l'iscrizione alla mailing
'config-almost-done' => 'Hai quasi finito!
Adesso puoi saltare la rimanente parte della configurazione e semplicemente installare la wiki.',
'config-optional-continue' => 'Fammi altre domande.',
- 'config-profile-wiki' => 'Wiki tradizionale', # Fuzzy
+ 'config-optional-skip' => 'Sono già stanco, installa solo il wiki.',
+ 'config-profile' => 'Profilo dei diritti utente:',
+ 'config-profile-wiki' => 'Wiki aperto',
'config-profile-no-anon' => 'Creazione utenza obbligatoria',
'config-profile-fishbowl' => 'Solo editori autorizzati',
'config-profile-private' => 'Wiki privata',
@@ -9944,8 +10292,13 @@ Se vuoi usare testi da Wikipedia, o desideri che Wikipedia possa essere in grado
In precedenza Wikipedia ha utilizzato la GNU Free Documentation License. La GFDL è una licenza valida, ma è di difficile comprensione e complica il riutilizzo dei contenuti.",
'config-email-settings' => 'Impostazioni email',
+ 'config-enable-email' => 'Abilita la posta elettronica in uscita',
'config-email-user' => 'Abilita invio email fra utenti',
+ 'config-email-usertalk' => 'Abilita le notifiche per le pagine di discussione utente',
+ 'config-email-watchlist' => 'Abilita le notifiche per gli osservati speciali',
'config-email-auth' => 'Abilita autenticazione via email',
+ 'config-email-sender' => 'Indirizzo email di ritorno:',
+ 'config-upload-settings' => 'Caricamenti di immagini e file',
'config-upload-enable' => 'Consentire il caricamento di file',
'config-upload-deleted' => 'Directory per i file cancellati:',
'config-logo' => 'URL del logo:',
@@ -9953,16 +10306,20 @@ In precedenza Wikipedia ha utilizzato la GNU Free Documentation License. La GFDL
'config-cc-again' => 'Seleziona di nuovo...',
'config-cc-not-chosen' => 'Scegliere quale licenza Creative Commons si desidera e cliccare su "procedi".',
'config-advanced-settings' => 'Configurazione avanzata',
+ 'config-memcached-servers' => 'Server di memcached:',
'config-memcache-needservers' => 'È stato selezionato il tipo di caching Memcached, ma non è stato impostato alcun server.',
'config-memcache-badip' => 'È stato inserito un indirizzo IP non valido per Memcached: $1.',
+ 'config-memcache-badport' => 'I numeri di porta per memcached dovrebbero essere tra $1 e $2.',
'config-extensions' => 'Estensioni',
'config-install-step-done' => 'fatto',
'config-install-step-failed' => 'non riuscito',
+ 'config-install-database' => 'Configurazione database',
'config-install-schema' => 'Creazione dello schema',
'config-install-user' => 'Creazione di utente del database',
'config-install-user-alreadyexists' => 'L\'utente "$1" è già presente',
'config-install-user-create-failed' => 'Creazione dell\'utente "$1" non riuscita: $2',
'config-install-user-missing' => 'L\'utente indicato "$1" non esiste.',
+ 'config-install-tables' => 'Creazione tabelle',
'config-install-tables-failed' => "'''Errore''': La creazione della tabella non è riuscita: $1",
'config-install-interwiki' => 'Riempimento della tabella interwiki predefinita',
'config-install-interwiki-list' => 'Impossibile leggere il file <code>interwiki.list</code>.',
@@ -9972,6 +10329,7 @@ In precedenza Wikipedia ha utilizzato la GNU Free Documentation License. La GFDL
'config-install-subscribe-fail' => 'Impossibile sottoscrivere mediawiki-announce: $1',
'config-install-subscribe-notpossible' => 'cURL non è installato e allow_url_fopen non è disponibile.',
'config-install-mainpage' => 'Creazione della pagina principale con contenuto predefinito',
+ 'config-install-extension-tables' => 'Creazione delle tabelle per le estensioni attivate',
'config-install-mainpage-failed' => 'Impossibile inserire la pagina principale: $1',
'config-download-localsettings' => 'Scarica <code>LocalSettings.php</code>',
'config-help' => 'aiuto',
@@ -9990,6 +10348,7 @@ I seguenti collegamenti sono in lingua inglese:
/** Japanese (日本語)
* @author Aphaia
+ * @author Fryed-peach
* @author Iwai.masaharu
* @author Mizusumashi
* @author Ninomy
@@ -9998,6 +10357,7 @@ I seguenti collegamenti sono in lingua inglese:
* @author Whym
* @author Yanajin66
* @author é’å­å®ˆæ­Œ
+ * @author ì•„ë¼
*/
$messages['ja'] = array(
'config-desc' => 'MediaWiki ã®ã‚¤ãƒ³ã‚¹ãƒˆãƒ¼ãƒ©ãƒ¼',
@@ -10052,8 +10412,8 @@ php.ini 内㧠<code>session.save_path</code> ãŒé©åˆ‡ãªãƒ‡ã‚£ãƒ¬ã‚¯ãƒˆãƒªã«è
'config-help-restart' => '入力ã—ãŸä¿å­˜ãƒ‡ãƒ¼ã‚¿ã‚’ã™ã¹ã¦æ¶ˆåŽ»ã—ã¦ã€ã‚¤ãƒ³ã‚¹ãƒˆãƒ¼ãƒ«ä½œæ¥­ã‚’å†èµ·å‹•ã—ã¾ã™ã‹?',
'config-restart' => 'ã¯ã„ã€å†èµ·å‹•ã—ã¾ã™',
'config-welcome' => '=== 環境ã®ç¢ºèª ===
-基本的ãªç¢ºèªã§ã¯ã€ç¾åœ¨ã®ç’°å¢ƒãŒMediaWikiã®ã‚¤ãƒ³ã‚¹ãƒˆãƒ¼ãƒ«ã«é©ã—ã¦ã„ã‚‹ã‹ã‚’確èªã—ã¾ã™ã€‚
-インストール中ã«åŠ©ã‘ãŒå¿…è¦ã«ãªã£ãŸå ´åˆã¯ã€ã“ã®ç¢ºèªçµæžœã‚’æä¾›ã—ã¦ãã ã•ã„。',
+基本的ãªç¢ºèªã§ã¯ã€ç¾åœ¨ã®ç’°å¢ƒãŒ MediaWiki ã®ã‚¤ãƒ³ã‚¹ãƒˆãƒ¼ãƒ«ã«é©ã—ã¦ã„ã‚‹ã‹ã‚’確èªã—ã¾ã™ã€‚
+インストール方法ã«ã¤ã„ã¦åŠ©ã‘ãŒå¿…è¦ã«ãªã£ãŸå ´åˆã¯ã€å¿…ãšã“ã®ç¢ºèªçµæžœã‚’æ·»ãˆã¦ãã ã•ã„。',
'config-copyright' => '=== 著作権ãŠã‚ˆã³è¦ç´„ ===
$1
@@ -10091,6 +10451,7 @@ Unicode ã‚’å°‘ã—ã§ã‚‚利用ã™ã‚‹å¯èƒ½æ€§ãŒã‚ã‚‹å ´åˆã¯ã€[//www.mediawik
共有サーãƒãƒ¼ã‚’使用ã—ã¦ã„ã‚‹å ´åˆã¯ã€é©åˆ‡ãªãƒ‡ãƒ¼ã‚¿ãƒ™ãƒ¼ã‚¹ ドライãƒãƒ¼ã®ã‚¤ãƒ³ã‚¹ãƒˆãƒ¼ãƒ«ã‚’ã€ã‚µãƒ¼ãƒãƒ¼ã®ç®¡ç†è€…ã«ä¾é ¼ã—ã¦ãã ã•ã„。
PHP を自分ã§ã‚³ãƒ³ãƒ‘イルã—ãŸå ´åˆã¯ã€ä¾‹ãˆã° <code>./configure --with-mysql</code> を実行ã—ã¦ã€ãƒ‡ãƒ¼ã‚¿ãƒ™ãƒ¼ã‚¹ クライアントを使用ã§ãるよã†ã«å†è¨­å®šã—ã¦ãã ã•ã„。
Debian ã¾ãŸã¯ Ubuntu ã®ãƒ‘ッケージã‹ã‚‰ PHP をインストールã—ãŸå ´åˆã¯ã€php5-mysql モジュールもインストールã™ã‚‹å¿…è¦ãŒã‚ã‚Šã¾ã™ã€‚',
+ 'config-outdated-sqlite' => "'''警告:''' ã‚ãªãŸã¯ SQLite $1 を使用ã—ã¦ã„ã¾ã™ãŒã€æœ€ä½Žé™å¿…è¦ãªãƒãƒ¼ã‚¸ãƒ§ãƒ³ $2 よりå¤ã„ãƒãƒ¼ã‚¸ãƒ§ãƒ³ã§ã™ã€‚SQLite ã¯åˆ©ç”¨ã§ãã¾ã›ã‚“。",
'config-no-fts3' => "'''警告:''' SQLite 㯠[//sqlite.org/fts3.html FTS3] モジュールãªã—ã§ã‚³ãƒ³ãƒ‘イルã•ã‚Œã¦ãŠã‚Šã€ã“ã®ãƒãƒƒã‚¯ã‚¨ãƒ³ãƒ‰ã§ã¯æ¤œç´¢æ©Ÿèƒ½ã¯åˆ©ç”¨ã§ããªããªã‚Šã¾ã™ã€‚",
'config-register-globals' => "'''警告: PHP ã® <code>[http://php.net/register_globals register_globals]</code> オプションãŒæœ‰åŠ¹ã«ãªã£ã¦ã„ã¾ã™ã€‚'''
'''å¯èƒ½ãªã‚‰ç„¡åŠ¹åŒ–ã—ã¦ãã ã•ã„。'''
@@ -10126,6 +10487,8 @@ MediaWiki ã‚’æ­£ã—ã動作ã•ã›ã‚‹ã«ã¯ã€UTF-8 対応ãŒå¿…è¦ã§ã™ã€‚",
'config-no-cache' => "'''警告:''' [http://www.php.net/apc APC]ã€[http://xcache.lighttpd.net/ XCache]ã€[http://www.iis.net/download/WinCacheForPhp WinCache] ã®ã„ãšã‚Œã‚‚見ã¤ã‹ã‚Šã¾ã›ã‚“ã§ã—ãŸã€‚
オブジェクトã®ã‚­ãƒ£ãƒƒã‚·ãƒ¥ã¯æœ‰åŠ¹åŒ–ã•ã‚Œã¾ã›ã‚“。",
'config-diff3-bad' => 'GNU diff3 ãŒè¦‹ã¤ã‹ã‚Šã¾ã›ã‚“。',
+ 'config-git' => 'ãƒãƒ¼ã‚¸ãƒ§ãƒ³ç®¡ç†ã‚½ãƒ•ãƒˆã‚¦ã‚§ã‚¢ Git ãŒè¦‹ã¤ã‹ã‚Šã¾ã—ãŸ: <code>$1</code>',
+ 'config-git-bad' => 'ãƒãƒ¼ã‚¸ãƒ§ãƒ³ç®¡ç†ã‚½ãƒ•ãƒˆã‚¦ã‚§ã‚¢ Git ãŒè¦‹ã¤ã‹ã‚Šã¾ã›ã‚“。',
'config-imagemagick' => 'ImageMagickãŒè¦‹ã¤ã‹ã‚Šã¾ã—ãŸ: <code>$1</code>。
アップロードãŒæœ‰åŠ¹ã§ã‚ã‚Œã°ã€ç”»åƒã®ã‚µãƒ ãƒã‚¤ãƒ«ã‚’利用ã§ãã¾ã™ã€‚',
'config-gd' => 'GDç”»åƒãƒ©ã‚¤ãƒ–ラリãŒå†…蔵ã•ã‚Œã¦ã„ã‚‹ã“ã¨ãŒç¢ºèªã•ã‚Œã¾ã—ãŸã€‚
@@ -10158,7 +10521,7 @@ Windowsã§MySQLを使用ã—ã¦ã„ã‚‹å ´åˆã«ã€ã€Œlocalhostã€ã¯ã€ã‚µãƒ¼ãƒãƒ
PostgreSQLを使用ã—ã¦ã„ã‚‹å ´åˆã€UNIXソケットã§æŽ¥ç¶šã™ã‚‹ã«ã¯ã“ã®æ¬„を空欄ã®ã¾ã¾ã«ã—ã¦ãã ã•ã„。',
'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-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' => 'ã“ã®ã‚¦ã‚£ã‚­ã‚’識別ã™ã‚‹åå‰ã‚’入力ã—ã¦ãã ã•ã„。
@@ -10236,16 +10599,16 @@ $1
'config-missing-db-host' => '「データベースã®ãƒ›ã‚¹ãƒˆã€ã‚’入力ã—ã¦ãã ã•ã„',
'config-missing-db-server-oracle' => '「データベース TNSã€ã®å€¤ã‚’入力ã—ã¦ãã ã•ã„',
'config-invalid-db-server-oracle' => '「$1ã€ã¯ç„¡åŠ¹ãªãƒ‡ãƒ¼ã‚¿ãƒ™ãƒ¼ã‚¹ TNS ã§ã™ã€‚
-アスキー英字(a-zã€A-Z)ã€æ•°å­—(0-9)ã€ã‚¢ãƒ³ãƒ€ãƒ¼ãƒãƒ¼(_)ã€ãƒ‰ãƒƒãƒˆ(.)ã®ã¿ã‚’使用ã—ã¦ãã ã•ã„。',
+「TNS åã€ã€ŒEasy Connectã€æ–‡å­—列ã®ã„ãšã‚Œã‹ã‚’使用ã—ã¦ãã ã•ã„ ([http://docs.oracle.com/cd/E11882_01/network.112/e10836/naming.htm Oracle ãƒãƒ¼ãƒŸãƒ³ã‚° メソッド])',
'config-invalid-db-name' => '「$1ã€ã¯ç„¡åŠ¹ãªãƒ‡ãƒ¼ã‚¿ãƒ™ãƒ¼ã‚¹åã§ã™ã€‚
-アスキー英字(a-zã€A-Z)ã€æ•°å­—(0-9)ã€ã‚¢ãƒ³ãƒ€ãƒ¼ãƒãƒ¼(_)ã€ãƒã‚¤ãƒ•ãƒ³(-)ã®ã¿ã‚’使用ã—ã¦ãã ã•ã„。',
- 'config-invalid-db-prefix' => '「$1ã€ã¯ç„¡åŠ¹ãªãƒ‡ãƒ¼ã‚¿ãƒ™ãƒ¼ã‚¹æŽ¥é ­èªžã§ã™ã€‚
-アスキー英字(a-z, A-Z)ã€æ•°å­—(0-9)ã€ä¸‹ç·š(_)ã€ãƒã‚¤ãƒ•ãƒ³(-)ã®ã¿ã‚’使用ã—ã¦ãã ã•ã„。',
+åŠè§’ã®è‹±æ•°å­— (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ã€ã¯ MediaWiki ã®ã‚¹ã‚­ãƒ¼ãƒžã¨ã—ã¦ç„¡åŠ¹ã§ã™ã€‚
-ASCII ã®è‹±æ•°å­— (a-zã€A-Zã€0-9)ã€ä¸‹ç·š (_) ã®ã¿ã‚’使用ã—ã¦ãã ã•ã„。',
+åŠè§’ã®è‹±æ•°å­— (a-zã€A-Zã€0-9)ã€ã‚¢ãƒ³ãƒ€ãƒ¼ã‚¹ã‚³ã‚¢ (_) ã®ã¿ã‚’使用ã—ã¦ãã ã•ã„。',
'config-postgres-old' => 'PostgreSQL $1 以é™ãŒå¿…è¦ã§ã™ã€‚ã”使用中㮠PostgreSQL 㯠$2 ã§ã™ã€‚',
'config-sqlite-name-help' => 'ã‚ãªãŸã®ã‚¦ã‚§ã‚­ã¨åŒä¸€æ€§ã®ã‚ã‚‹åå‰ã‚’é¸ã‚“ã§ãã ã•ã„。
空白ãŠã‚ˆã³ãƒã‚¤ãƒ•ãƒ³ã¯ä½¿ç”¨ã—ãªã„ã§ãã ã•ã„。
@@ -10285,12 +10648,12 @@ chmod a+w $3</pre>',
[$1 ウィキを使ã„始ã‚ã‚‹]ã“ã¨ãŒã§ãã¾ã™ã€‚
-ã‚‚ã—ã€<code>LocalSettings.php</code>ファイルをå†ç”Ÿæˆã—ãŸã„ã®ãªã‚‰ã°ã€ä¸‹ã®ãƒœã‚¿ãƒ³ã‚’押ã—ã¦ãã ã•ã„。
-ウィキã«å•é¡ŒãŒãªã„ã®ã§ã‚ã‚Œã°ã€ã“ã‚Œã¯'''推奨ã•ã‚Œã¾ã›ã‚“'''。",
+<code>LocalSettings.php</code> ファイルをå†ç”Ÿæˆã—ãŸã„å ´åˆã¯ã€ä¸‹ã®ãƒœã‚¿ãƒ³ã‚’押ã—ã¦ãã ã•ã„。
+ウィキã«å•é¡ŒãŒã‚ã‚‹å ´åˆã‚’除ãã€å†ç”Ÿæˆã¯'''推奨ã•ã‚Œã¾ã›ã‚“'''。",
'config-upgrade-done-no-regenerate' => 'アップグレードãŒå®Œäº†ã—ã¾ã—ãŸã€‚
[$1 ウィキã®ä½¿ç”¨ã‚’開始]ã™ã‚‹ã“ã¨ãŒã§ãã¾ã™ã€‚',
- 'config-regenerate' => '<code>LocalSettings.php</code> ã‚’å†ç”Ÿæˆâ†’',
+ 'config-regenerate' => 'LocalSettings.php ã‚’å†ç”Ÿæˆâ†’',
'config-show-table-status' => '<code>SHOW TABLE STATUS</code> クエリãŒå¤±æ•—ã—ã¾ã—ãŸ!',
'config-unknown-collation' => "'''警告:''' データベースã¯èªè­˜ã•ã‚Œãªã„ç…§åˆã‚’使用ã—ã¦ã„ã¾ã™ã€‚",
'config-db-web-account' => 'ウェブアクセスã®ãŸã‚ã®ãƒ‡ãƒ¼ã‚¿ãƒ™ãƒ¼ã‚¹ã‚¢ã‚«ã‚¦ãƒ³ãƒˆ',
@@ -10352,7 +10715,7 @@ chmod a+w $3</pre>',
'config-optional-continue' => 'ç§ã«ã‚‚ã£ã¨è³ªå•ã—ã¦ãã ã•ã„。',
'config-optional-skip' => 'ã‚‚ã†é£½ãã¦ã—ã¾ã£ãŸã®ã§ã€ã¨ã«ã‹ãウィキをインストールã—ã¦ãã ã•ã„。',
'config-profile' => '利用者権é™ã®ãƒ—ロファイル:',
- 'config-profile-wiki' => 'ä¼çµ±çš„ãªã‚¦ã‚£ã‚­', # Fuzzy
+ 'config-profile-wiki' => '公開ウィキ',
'config-profile-no-anon' => 'アカウントã®ä½œæˆãŒå¿…è¦',
'config-profile-fishbowl' => '承èªã•ã‚ŒãŸç·¨é›†è€…ã®ã¿',
'config-profile-private' => 'éžå…¬é–‹ã‚¦ã‚£ã‚­',
@@ -10415,15 +10778,17 @@ GFDLã¯æœ‰åŠ¹ãªãƒ©ã‚¤ã‚»ãƒ³ã‚¹ã§ã™ãŒã€å†…容をç†è§£ã™ã‚‹ã®ã¯å›°é›£ã§ã
'config-upload-deleted-help' => '削除ã•ã‚Œã‚‹ãƒ•ã‚¡ã‚¤ãƒ«ã‚’ä¿å­˜ã™ã‚‹ãŸã‚ã®ãƒ‡ã‚£ãƒ¬ã‚¯ãƒˆãƒªã‚’é¸æŠžã—ã¦ãã ã•ã„。
ã“ã‚ŒãŒã‚¦ã‚§ãƒ–ã‹ã‚‰ã‚¢ã‚¯ã‚»ã‚¹ã§ããªã„ã“ã¨ãŒç†æƒ³ã§ã™ã€‚',
'config-logo' => 'ロゴ ã®URL:',
- 'config-logo-help' => 'MediaWikiã®æ—¢å®šã®å¤–装ã§ã¯ã€ã‚µã‚¤ãƒ‰ãƒãƒ¼ä¸Šéƒ¨ã«135x160ピクセルã®ãƒ­ã‚´ç”¨ã®ä½™ç™½ãŒã‚ã‚Šã¾ã™ã€‚
-é©åˆ‡ãªã‚µã‚¤ã‚ºã®ç”»åƒã‚’アップロードã—ã¦ã€ãã®URLã‚’ã“ã“ã«å…¥åŠ›ã—ã¦ãã ã•ã„。
+ 'config-logo-help' => 'MediaWiki ã®æ—¢å®šã®å¤–装ã§ã¯ã€ã‚µã‚¤ãƒ‰ãƒãƒ¼ä¸Šéƒ¨ã«135x160ピクセルã®ãƒ­ã‚´ç”¨ã®ä½™ç™½ãŒã‚ã‚Šã¾ã™ã€‚
+é©åˆ‡ãªã‚µã‚¤ã‚ºã®ç”»åƒã‚’アップロードã—ã¦ã€ãã® URL ã‚’ã“ã“ã«å…¥åŠ›ã—ã¦ãã ã•ã„。
+
+ロゴãŒç›¸å¯¾ãƒ‘スã®å ´åˆã¯ã€<code>$wgStylePath</code> ã‚„ <code>$wgScriptPath</code> を使用ã§ãã¾ã™ã€‚
-ロゴãŒä¸è¦ã®å ´åˆã¯ã€ã“ã®ãƒœãƒƒã‚¯ã‚¹ã‚’空白ã®ã¾ã¾ã«ã—ã¦ãã ã•ã„。',
+ロゴãŒä¸è¦ã®å ´åˆã¯ã€ã“ã®æ¬„を空白ã®ã¾ã¾ã«ã—ã¦ãã ã•ã„。',
'config-instantcommons' => 'Instant Commons 機能を有効ã«ã™ã‚‹',
- 'config-instantcommons-help' => '[//www.mediawiki.org/wiki/InstantCommons InstantCommons]ã¯ã€[//commons.wikimedia.org/ ウィキメディア・コモンズ]ã®ã‚µã‚¤ãƒˆã§è¦‹ã¤ã‹ã£ãŸç”»åƒã‚„音声ã€ãã®ä»–ã®ãƒ¡ãƒ‡ã‚£ã‚¢ã‚’ウィキ上ã§åˆ©ç”¨ã™ã‚‹ã“ã¨ãŒã§ãるよã†ã«ãªã‚‹æ©Ÿèƒ½ã§ã™ã€‚
-ã“れを有効化ã™ã‚‹ã«ã¯ã€MediaWikiã¯ã‚¤ãƒ³ã‚¿ãƒ¼ãƒãƒƒãƒˆã«æŽ¥ç¶šã§ããªã‘ã‚Œã°ãªã‚Šã¾ã›ã‚“。
+ 'config-instantcommons-help' => '[//www.mediawiki.org/wiki/InstantCommons Instant Commons] ã¯ã€[//commons.wikimedia.org/ ウィキメディア・コモンズ]ã®ã‚µã‚¤ãƒˆã«ã‚ã‚‹ç”»åƒã€éŸ³å£°ã€ãã®ä»–ã®ãƒ¡ãƒ‡ã‚£ã‚¢ã‚’ウィキ上ã§åˆ©ç”¨ã§ãるよã†ã«ã™ã‚‹æ©Ÿèƒ½ã§ã™ã€‚
+ã“れを使用ã™ã‚‹ã«ã¯ã€MediaWiki ãŒã‚¤ãƒ³ã‚¿ãƒ¼ãƒãƒƒãƒˆã«æŽ¥ç¶šã§ãã‚‹å¿…è¦ãŒã‚ã‚Šã¾ã™ã€‚
-ウィキメディア・コモンズ以外ã®ã‚¦ã‚£ã‚­ã‚’åŒã˜ã‚ˆã†ã«è¨­å®šã™ã‚‹æ–¹æ³•ãªã©ã€ã“ã®æ©Ÿèƒ½ã«é–¢ã™ã‚‹è©³ç´°ãªæƒ…å ±ã¯ã€[//mediawiki.org/wiki/Manual:$wgForeignFileRepos マニュアル]ã‚’ã”覧ãã ã•ã„。',
+ウィキメディア・コモンズ以外ã®ã‚¦ã‚£ã‚­ã‚’åŒæ§˜ã«è¨­å®šã™ã‚‹æ‰‹é †ãªã©ã€ã“ã®æ©Ÿèƒ½ã«é–¢ã™ã‚‹è©³ç´°ãªæƒ…å ±ã¯ã€[//mediawiki.org/wiki/Manual:$wgForeignFileRepos マニュアル]ã‚’ã”覧ãã ã•ã„。',
'config-cc-error' => 'クリエイティブ・コモンズ・ライセンスã®é¸æŠžå™¨ã‹ã‚‰çµæžœãŒå¾—られã¾ã›ã‚“ã§ã—ãŸã€‚
ライセンスã®åå‰ã‚’手動ã§å…¥åŠ›ã—ã¦ãã ã•ã„。',
'config-cc-again' => 'ã‚‚ã†ä¸€åº¦é¸æŠžã—ã¦ãã ã•ã„...',
@@ -10440,6 +10805,9 @@ GFDLã¯æœ‰åŠ¹ãªãƒ©ã‚¤ã‚»ãƒ³ã‚¹ã§ã™ãŒã€å†…容をç†è§£ã™ã‚‹ã®ã¯å›°é›£ã§ã
カンマ区切りã§ã€åˆ©ç”¨ã™ã‚‹ç‰¹å®šã®ãƒãƒ¼ãƒˆã®æŒ‡å®šãŒå¿…è¦ã§ã™ã€‚例:
127.0.0.1:11211
192.168.1.25:1234',
+ 'config-memcache-noport' => 'Memcached サーãƒãƒ¼ $1 ã§ä½¿ç”¨ã™ã‚‹ãƒãƒ¼ãƒˆç•ªå·ã‚’指定ã—ã¦ã„ã¾ã›ã‚“。
+ãƒãƒ¼ãƒˆç•ªå·ãŒåˆ†ã‹ã‚‰ãªã„å ´åˆã€æ—¢å®šå€¤ã¯ 11211 ã§ã™ã€‚',
+ 'config-memcache-badport' => 'Memcached ã®ãƒãƒ¼ãƒˆç•ªå·ã¯ $1 ã‹ã‚‰ $2 ã®ç¯„囲ã«ã—ã¦ãã ã•ã„。',
'config-extensions' => '拡張機能',
'config-extensions-help' => '<code>./extensions</code>ディレクトリ内ã§ã€ä¸Šè¨˜ãƒªã‚¹ãƒˆã®æ‹¡å¼µæ©Ÿèƒ½ãŒç™ºè¦‹ã•ã‚Œã¾ã—ãŸã€‚
@@ -10457,6 +10825,7 @@ GFDLã¯æœ‰åŠ¹ãªãƒ©ã‚¤ã‚»ãƒ³ã‚¹ã§ã™ãŒã€å†…容をç†è§£ã™ã‚‹ã®ã¯å›°é›£ã§ã
'config-install-pg-schema-failed' => 'テーブルã®ä½œæˆã«å¤±æ•—ã—ã¾ã—ãŸã€‚
利用者「$1ã€ãŒã‚¹ã‚­ãƒ¼ãƒžã€Œ$2ã€ã«æ›¸ãè¾¼ã‚るよã†ã«ã—ã¦ãã ã•ã„。',
'config-install-pg-commit' => '変更をé€ä¿¡',
+ 'config-pg-no-plpgsql' => 'データベース $1 内㫠PL/pgSQL 言語をインストールã™ã‚‹å¿…è¦ãŒã‚ã‚Šã¾ã™ã€‚',
'config-install-user' => 'データベースユーザーã®ä½œæˆ',
'config-install-user-alreadyexists' => 'ユーザー「$1ã€ã¯æ—¢ã«å­˜åœ¨ã—ã¾ã™',
'config-install-user-create-failed' => 'ユーザー「$1ã€ã®ä½œæˆã«å¤±æ•—ã—ã¾ã—ãŸ: $2',
@@ -10515,7 +10884,7 @@ $messages['jam'] = array(
== Taatop ==
* [//www.mediawiki.org/wiki/Manual:Configuration_settings Configuration settings list]
* [//www.mediawiki.org/wiki/Manual:FAQ MediaWiki FAQ]
-* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce MediaWiki release mailing list]",
+* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce MediaWiki release mailing list]", # Fuzzy
);
/** Jutish (jysk)
@@ -10523,7 +10892,7 @@ $messages['jam'] = array(
*/
$messages['jut'] = array(
'mainpagetext' => "'''MediaWiki er nu installeret.'''",
- 'mainpagedocfooter' => "Se vores engelsksprÃ¥Äede [//meta.wikimedia.org/wiki/MediaWiki_localisation dokumentÃ¥sje tilpasnenge'm Ã¥f æ brugergrænseflade] og [//meta.wikimedia.org/wiki/MediaWiki_User%27s_Guide æ brugervejlednenge] før Ã¥plysnenger Ã¥psætnenge'm og anvendelse.",
+ 'mainpagedocfooter' => "Se vores engelsksprÃ¥Äede [//meta.wikimedia.org/wiki/MediaWiki_localisation dokumentÃ¥sje tilpasnenge'm Ã¥f æ brugergrænseflade] og [//meta.wikimedia.org/wiki/MediaWiki_User%27s_Guide æ brugervejlednenge] før Ã¥plysnenger Ã¥psætnenge'm og anvendelse.", # Fuzzy
);
/** Javanese (Basa Jawa)
@@ -10534,7 +10903,7 @@ $messages['jv'] = array(
== Miwiti panggunan ==
* [//www.mediawiki.org/wiki/Manual:Configuration_settings Daftar pangaturan préférènsi]
* [//www.mediawiki.org/wiki/Manual:FAQ MediaWiki FAQ]
-* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce Milis rilis MediaWiki]",
+* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce Milis rilis MediaWiki]", # Fuzzy
);
/** Georgian (ქáƒáƒ áƒ—ული)
@@ -10582,7 +10951,6 @@ $messages['ka'] = array(
'config-header-postgres' => 'PostgreSQL-ის პáƒáƒ áƒáƒ›áƒ”ტრები',
'config-header-sqlite' => 'SQLite-ის პáƒáƒ áƒáƒ›áƒ”ტრები',
'config-header-oracle' => 'Oracle-ის პáƒáƒ áƒáƒ›áƒ”ტრები',
- 'config-header-ibm_db2' => 'IBM DB2-ის პáƒáƒ áƒáƒ›áƒ”ტრები',
'config-invalid-db-type' => 'áƒáƒ áƒáƒ¡áƒ¬áƒáƒ áƒ˜ მáƒáƒœáƒáƒªáƒ”მთრბáƒáƒ–ის ტიპი',
'config-mysql-innodb' => 'InnoDB',
'config-mysql-myisam' => 'MyISAM',
@@ -10643,7 +11011,7 @@ $messages['kaa'] = array(
== Baslaw ushın ==
* [//www.mediawiki.org/wiki/Manual:Configuration_settings Konfiguratsiya sazlaw dizimi]
* [//www.mediawiki.org/wiki/Manual:FAQ MediaWikidin' Ko'p Soralatug'ın Sorawları]
-* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce MediaWiki haqqında xat tarqatıw dizimi]",
+* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce MediaWiki haqqında xat tarqatıw dizimi]", # Fuzzy
);
/** ÐдыгÑÐ±Ð·Ñ (ÐдыгÑбзÑ)
@@ -10657,14 +11025,14 @@ $messages['kbd-cyrl'] = array(
== КъыщхьÑпÑÐ³ÑŠÑƒÑ Ñ…ÑŠÑƒÑ„Ñ‹Ð½ÑƒÑ…ÑÑ€ ==
* [//www.mediawiki.org/wiki/Manual:Configuration_settings ЗÑгъÑзÑхуÑÐ³ÑŠÑƒÑ Ð³ÑƒÑÑ€ÑÑ…Ñм Ñ Ñ‚Ñ…Ñ‹Ð»ÑŠ];
* [//www.mediawiki.org/wiki/Manual:FAQ MediaWiki-м ÑƒÐ¿Ñ‰Ó€Ñ Ð½Ð°Ñ…ÑŠÑ‹Ð±Ñƒ ÑÑ‚Ñ…ÑÐ¼Ñ€Ñ Ñ Ð¶ÑуапхÑмрÑ];
-* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce MediaWiki-м и верÑÐ¸Ñ Ñ‰Ó€ÑÑƒÑ ÐºÑŠÑжахÑм Ñ ÐºÑŠÑӀохугъуÑ].',
+* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce MediaWiki-м и верÑÐ¸Ñ Ñ‰Ó€ÑÑƒÑ ÐºÑŠÑжахÑм Ñ ÐºÑŠÑӀохугъуÑ].', # Fuzzy
);
/** Khowar (کھوار)
* @author Rachitrali
*/
$messages['khw'] = array(
- 'mainpagetext' => "\"<big>'''میڈیاوکیو کامیابیو سورا چالو کورونو بیتی شیر۔.'''</big>\"",
+ 'mainpagetext' => "'''میڈیاوکیو کامیابیو سورا چالو کورونو بیتی شیر۔.'''",
);
/** Kirmanjki (Kırmancki)
@@ -10677,7 +11045,7 @@ $messages['kiu'] = array(
== Gamê verêni ==
* [//www.mediawiki.org/wiki/Manual:Configuration_settings Lista ayarunê vırastene]
* [//www.mediawiki.org/wiki/Manual:FAQ MediaWiki de ÇZP]
-* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce MediaWiki ra lista serbest-daena postey]",
+* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce MediaWiki ra lista serbest-daena postey]", # Fuzzy
);
/** Kazakh (Arabic script) (قازاقشا (تٴوتە)â€)
@@ -10689,7 +11057,7 @@ $messages['kk-arab'] = array(
== باستاۋ ٴۇشىن ==
* [//www.mediawiki.org/wiki/Manual:Configuration_settings باپتالىم قالاۋلارىنىڭ ٴتىزىمى]
* [//www.mediawiki.org/wiki/Manual:FAQ مەدىياۋىيكىيدىڭ جىيى قويىلعان ساۋالدارى]
-* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce مەدىياۋىيكىي شىعۋ تۋرالى حات تاراتۋ ٴتىزىمى]',
+* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce مەدىياۋىيكىي شىعۋ تۋرالى حات تاراتۋ ٴتىزىمى]', # Fuzzy
);
/** Kazakh (Cyrillic script) (қазақша (кирил)‎)
@@ -10701,7 +11069,7 @@ $messages['kk-cyrl'] = array(
== БаÑтау үшін ==
* [//www.mediawiki.org/wiki/Manual:Configuration_settings Бапталым қалауларының тізімі]
* [//www.mediawiki.org/wiki/Manual:FAQ МедиаУикидің Жиы Қойылған Сауалдары]
-* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce МедиаУики шығу туралы хат тарату тізімі]',
+* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce МедиаУики шығу туралы хат тарату тізімі]', # Fuzzy
);
/** Kazakh (Latin script) (qazaqşa (latın)‎)
@@ -10713,7 +11081,7 @@ $messages['kk-latn'] = array(
== Bastaw üşin ==
* [//www.mediawiki.org/wiki/Manual:Configuration_settings Baptalım qalawlarınıñ tizimi]
* [//www.mediawiki.org/wiki/Manual:FAQ MedïaWïkïdiñ Jïı Qoýılğan Sawaldarı]
-* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce MedïaWïkï şığw twralı xat taratw tizimi]',
+* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce MedïaWïkï şığw twralı xat taratw tizimi]', # Fuzzy
);
/** Khmer (ភាសាážáŸ’មែរ)
@@ -10743,7 +11111,7 @@ $messages['km'] = array(
* [//www.mediawiki.org/wiki/Manual:Configuration_settings បញ្ជីកំណážáŸ‹áž‘ម្រង់]
* [//www.mediawiki.org/wiki/Manual:FAQ/km សំណួរញឹកញាប់​មáŸážŒáž¶ážœáž·áž‚ី]
-* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce បញ្ជី​ពិភាក្សា​ការផ្សព្វផ្សាយ​របស់​មáŸážŒáž¶ážœáž·áž‚ី]',
+* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce បញ្ជី​ពិភាក្សា​ការផ្សព្វផ្សាយ​របស់​មáŸážŒáž¶ážœáž·áž‚ី]', # Fuzzy
);
/** Kannada (ಕನà³à²¨à²¡)
@@ -10756,7 +11124,7 @@ $messages['kn'] = array(
* [//www.mediawiki.org/wiki/Manual:Configuration_settings Configuration settings list]
* [//www.mediawiki.org/wiki/Manual:FAQ ಮೀಡಿಯವಿಕಿ FAQ]
-* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce MediaWiki release mailing list]',
+* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce MediaWiki release mailing list]', # Fuzzy
);
/** Korean (한국어)
@@ -10815,8 +11183,8 @@ php.ini를 확ì¸í•˜ê³  <code>session.save_path</code>ê°€ ì ì ˆí•œ 디렉토리
'config-help-restart' => '입력한 모든 ì €ìž¥ëœ ë°ì´í„°ë¥¼ 지우고 설치 ê³¼ì •ì„ ë‹¤ì‹œ 시작하겠습니까?',
'config-restart' => '예, 다시 시작합니다',
'config-welcome' => '=== 사용 환경 검사 ===
-ì´ í™˜ê²½ì´ ë¯¸ë””ì–´ìœ„í‚¤ ì„¤ì¹˜ì— ì í•©í•œì§€ 기본 검사를 실행합니다.
-설치 중 ë„ì›€ì´ í•„ìš”í•˜ë‹¤ë©´ ì´ ê²€ì‚¬ 결과를 함께 제공해주어야 합니다.',
+기본 검사는 지금 ì´ í™˜ê²½ì´ ë¯¸ë””ì–´ìœ„í‚¤ ì„¤ì¹˜ì— ì í•©í•œì§€ 수행합니다.
+설치를 완료하는 ë°©ë²•ì— ëŒ€í•œ 지ì›ì„ 찾는다면 ì´ ì •ë³´ë¥¼ í¬í•¨í•´ì•¼ 하는 ê²ƒì„ ê¸°ì–µí•˜ì„¸ìš”.',
'config-copyright' => "=== 저작권 ë° ì´ìš© 약관 ===
$1
@@ -10894,6 +11262,8 @@ Mandrake를 실행하고 있다면 php-xml 패키지를 설치하세요.',
'config-mod-security' => "'''경고''': 웹 ì„œë²„ì— [http://modsecurity.org/ mod_security]ê°€ 허용ë˜ì—ˆìŠµë‹ˆë‹¤. 잘못 ì„¤ì •ëœ ê²½ìš° 미디어위키나 사용ìžê°€ ìž„ì˜ì˜ 콘í…츠를 게시할 수 있는 다른 ì†Œí”„íŠ¸ì›¨ì–´ì— ëŒ€í•œ 문제를 ì¼ìœ¼í‚¬ 수 있습니다.
[http://modsecurity.org/documentation/ mod_security] 문서를 참고하거나 ìž„ì˜ì˜ 오류가 ë°œìƒí•  경우 í˜¸ìŠ¤íŠ¸ì˜ ì§€ì› ìš”ì²­ì— ë¬¸ì˜í•˜ì‹­ì‹œì˜¤.",
'config-diff3-bad' => 'GNU diff3를 ì°¾ì„ ìˆ˜ 없습니다.',
+ 'config-git' => 'Git 버전 관리 소프트웨어를 찾았습니다: <code>$1</code>.',
+ 'config-git-bad' => 'Git 버전 관리 소프트웨어를 ì°¾ì„ ìˆ˜ 없습니다.',
'config-imagemagick' => 'ImageMagick를 찾았습니다: <code>$1</code>.
올리기를 활성화할 경우 그림 섬네ì¼ì´ 활성화ë©ë‹ˆë‹¤.',
'config-gd' => 'ë‚´ìž¥ëœ GD 그래픽 ë¼ì´ë¸ŒëŸ¬ë¦¬ë¥¼ 찾았습니다.
@@ -10905,16 +11275,16 @@ Mandrake를 실행하고 있다면 php-xml 패키지를 설치하세요.',
'config-no-cli-uri' => "'''경고''': ê¸°ë³¸ê°’ì„ ì‚¬ìš©í•˜ì—¬ --scriptpath를 지정하지 않았습니다: <code>$1</code>.",
'config-using-server' => '"<nowiki>$1</nowiki>"(ì„)를 서버 ì´ë¦„으로 사용합니다.',
'config-using-uri' => '"<nowiki>$1$2</nowiki>"(ì„)를 서버 URLë¡œ 사용합니다.',
- 'config-uploads-not-safe' => "'''경고:''' ì˜¬ë¦¬ê¸°ì— ëŒ€í•œ 기본 디렉토리(<code>$1</code>)는 ìž„ì˜ì˜ 스í¬ë¦½íŠ¸ ì‹¤í–‰ì— ì·¨ì•½í•©ë‹ˆë‹¤.
+ 'config-uploads-not-safe' => "'''경고:''' ì˜¬ë¦¬ê¸°ì— ëŒ€í•œ 기본 디렉터리(<code>$1</code>)는 ìž„ì˜ì˜ 스í¬ë¦½íŠ¸ ì‹¤í–‰ì— ì·¨ì•½í•©ë‹ˆë‹¤.
미디어위키는 보안 ìœ„í˜‘ì— ëŒ€í•œ 모든 올린 파ì¼ì„ 검사하지만, 올리기를 활성화하기 ì „ì— [//www.mediawiki.org/wiki/Manual:Security#Upload_security ì´ ë³´ì•ˆ 취약ì ì„ í•´ê²°í•  것]ì„ ë§¤ìš° 권장합니다.",
- 'config-no-cli-uploads-check' => "'''경고:''' ì˜¬ë¦¬ê¸°ì— ëŒ€í•œ 기본 디렉토리(<code>$1</code>)는 CLI를 설치하는 ë™ì•ˆ ìž„ì˜ì˜ 스í¬ë¦½íŠ¸ ì‹¤í–‰ì— ëŒ€í•œ 취약ì ì— 대해 검사ë˜ì§€ 않습니다.",
+ 'config-no-cli-uploads-check' => "'''경고:''' ì˜¬ë¦¬ê¸°ì— ëŒ€í•œ 기본 디렉터리(<code>$1</code>)는 CLI를 설치하는 ë™ì•ˆ ìž„ì˜ì˜ 스í¬ë¦½íŠ¸ ì‹¤í–‰ì— ëŒ€í•œ 취약ì ì— 대해 검사ë˜ì§€ 않습니다.",
'config-brokenlibxml' => 'ì‹œìŠ¤í…œì— ë²„ê·¸ê°€ 있는 PHP와 libxml2ì˜ ì¡°í•©ì´ ìžˆìœ¼ë©° 미디어위키나 다른 웹 어플리케ì´ì…˜ì— 숨겨진 ë°ì´í„° ì†ìƒì„ ì¼ìœ¼í‚¬ 수 있습니다.
PHP 5.2.9 ì´í›„와 libxml2 2.7.3 ì´í›„ë¡œ 업그레ì´ë“œí•˜ì„¸ìš”. ([//bugs.php.net/bug.php?id=45996 PHPì— ì œê¸°í•œ 버그])
설치가 중단ë˜ì—ˆìŠµë‹ˆë‹¤.',
'config-using531' => '미디어위키는 <code>__call()</code>ì„ ì°¸ê³ ë¡œ 매개 변수를 í¬í•¨í•˜ëŠ” 버그로 ì¸í•´ PHP $1(와)ê³¼ 함께 사용할 수 없습니다.
문제를 해결하려면 PHP 5.3.2 ì´ìƒë¡œ 업그레ì´ë“œí•˜ê±°ë‚˜ PHP 5.3.0으로 다운그레ì´ë“œë¥¼ 하세요.
설치가 중단ë˜ì—ˆìŠµë‹ˆë‹¤.',
- 'config-suhosin-max-value-length' => 'Suhosinì´ ì„¤ì¹˜ë˜ì—ˆê³  $1 ë°”ì´íŠ¸ë¡œ GET 매개 ë³€ìˆ˜ì¸ <code>length</code>를 제한하고 있습니다.
+ 'config-suhosin-max-value-length' => '수호신(Suhosin)ì´ ì„¤ì¹˜ë˜ì—ˆê³  $1 ë°”ì´íŠ¸ë¡œ GET 매개 ë³€ìˆ˜ì¸ <code>length</code>를 제한하고 있습니다.
ë¯¸ë””ì–´ìœ„í‚¤ì˜ ResourceLoader 구성 요소는 ì´ ì œí•œì„ í•´ê²°í•˜ì§€ë§Œ ì„±ëŠ¥ì´ ì €í•˜ë©ë‹ˆë‹¤.
가능하면 <code>php.ini</code>ì˜ <code>suhosin.get.max_value_length</code>ì— 1024 ì´ìƒìœ¼ë¡œ 설정하고 <code>LocalSettings.php</code>ì˜ <code>$wgResourceLoaderMaxQueryLength</code>ì— ê°™ì€ ê°’ì„ ì„¤ì •í•´ì•¼ 합니다.',
'config-db-type' => 'ë°ì´í„°ë² ì´ìŠ¤ 종류:',
@@ -10927,7 +11297,7 @@ PHP 5.2.9 ì´í›„와 libxml2 2.7.3 ì´í›„ë¡œ 업그레ì´ë“œí•˜ì„¸ìš”. ([//bugs.p
PostgreSQLì„ ì‚¬ìš©í•˜ë©´ 유닉스 ì†Œì¼“ì„ í†µí•´ ì—°ê²°ë˜ë„ë¡ ìž…ë ¥ëž€ì„ ë¹„ì›Œë‘세요.',
'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-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' => '위키를 ì‹ë³„하기 위한 ì´ë¦„ì„ ì„ íƒí•˜ì„¸ìš”.
@@ -10975,7 +11345,7 @@ MySQLì˜ UTF-8 모드를 보다 ë” íš¨ìœ¨ì ì´ê³  유니코드 문ìžì˜ ì „ì²
'config-db-schema-help' => '보통 ì´ ìŠ¤í‚¤ë§ˆëŠ” 문제가 없습니다.
필요한 경우ì—만 바꾸세요.',
'config-pg-test-error' => "'''$1''' ë°ì´í„°ë² ì´ìŠ¤ì— ì—°ê²°í•  수 없습니다: $2",
- 'config-sqlite-dir' => 'SQLite ë°ì´í„° 디렉토리:',
+ 'config-sqlite-dir' => 'SQLite ë°ì´í„° 디렉터리:',
'config-sqlite-dir-help' => "SQLite는 í•˜ë‚˜ì˜ íŒŒì¼ì— 모든 ë°ì´í„°ë¥¼ 저장합니다.
제공하는 디렉토리는 설치하는 ë™ì•ˆ 웹 서버가 쓸 수 있어야 합니다.
@@ -10988,8 +11358,7 @@ MySQLì˜ UTF-8 모드를 보다 ë” íš¨ìœ¨ì ì´ê³  유니코드 문ìžì˜ ì „ì²
예를 들어 <code>/var/lib/mediawiki/yourwiki</code>와 ê°™ì´ ë‹¤ë¥¸ ê³³ì— ë°ì´í„°ë² ì´ìŠ¤ë¥¼ 넣는 ê²ƒì´ ì¢‹ìŠµë‹ˆë‹¤.",
'config-oracle-def-ts' => '기본 í…Œì´ë¸”공간:',
'config-oracle-temp-ts' => 'ìž„ì‹œ í…Œì´ë¸”공간:',
- 'config-type-oracle' => '오ë¼í´',
- 'config-type-ibm_db2' => 'IBM DB2',
+ 'config-type-oracle' => 'Oracle',
'config-support-info' => '미디어위키는 다ìŒì˜ ë°ì´í„°ë² ì´ìŠ¤ ì‹œìŠ¤í…œì„ ì§€ì›í•©ë‹ˆë‹¤:
$1
@@ -10999,18 +11368,16 @@ $1
'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-support-ibm_db2' => '* $1는 ìƒìš© 엔터프ë¼ì´ì¦ˆ ë°ì´í„°ë² ì´ìŠ¤ìž…니다.([http://www.php.net/manual/en/ibm-db2.installation.php IBM DB2를 지ì›í•˜ì—¬ PHP를 컴파ì¼í•˜ëŠ” 방법])',
'config-header-mysql' => 'MySQL 설정',
'config-header-postgres' => 'PostgreSQL 설정',
'config-header-sqlite' => 'SQLite 설정',
- 'config-header-oracle' => '오ë¼í´ 설정',
- 'config-header-ibm_db2' => 'IBM DB2 설정',
+ '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 ê¸€ìž (a-z, A-Z), ìˆ«ìž (0-9), 밑줄 (_)ê³¼ 하ì´í”ˆ (-)만 사용하세요.',
+"TNS Name"ì´ë‚˜ "Easy Connect" 문ìžì—´ 중 하나를 사용하세요 ([http://docs.oracle.com/cd/E11882_01/network.112/e10836/naming.htm Oracle 네ì´ë° 메서드])',
'config-invalid-db-name' => '"$1" ë°ì´í„°ë² ì´ìŠ¤ ì´ë¦„ì´ ìž˜ëª»ë˜ì—ˆìŠµë‹ˆë‹¤.
ASCII ê¸€ìž (a-z, A-Z), ìˆ«ìž (0-9), 밑줄 (_)ê³¼ 하ì´í”ˆ (-)만 사용하세요.',
'config-invalid-db-prefix' => '"$1" ë°ì´í„°ë² ì´ìŠ¤ ì ‘ë‘ì–´ê°€ 잘못ë습니다.
@@ -11066,7 +11433,7 @@ chmod a+w $3</pre>',
'config-upgrade-done-no-regenerate' => '업그레ì´ë“œê°€ 완료ë˜ì—ˆìŠµë‹ˆë‹¤.
ì´ì œ [$1 위키를 시작]í•  수 있습니다.',
- 'config-regenerate' => '<code>LocalSettings.php</code> 다시 만들기 →',
+ 'config-regenerate' => 'LocalSettings.php 다시 만들기 →',
'config-show-table-status' => '<code>SHOW TABLE STATUS</code> 쿼리를 실패했습니다!',
'config-unknown-collation' => "'''경고:''' ë°ì´í„°ë² ì´ìŠ¤ê°€ ì¸ì‹í•˜ì§€ 않는 ì •ë ¬ì„ ì‚¬ìš©í•˜ê³  있습니다.",
'config-db-web-account' => '웹 ì ‘ê·¼ì„ ìœ„í•œ ë°ì´í„°ë² ì´ìŠ¤ 계정',
@@ -11078,13 +11445,19 @@ chmod a+w $3</pre>',
'config-mysql-engine' => '스토리지 엔진:',
'config-mysql-innodb' => 'InnoDB',
'config-mysql-myisam' => 'MyISAM',
- 'config-mysql-myisam-dep' => "'''경고''': 미디어위키와 함께 사용하ë„ë¡ ê¶Œìž¥í•˜ì§€ 않는 MySQLì— ëŒ€í•œ 스토리지 엔진으로 MyISAMì„ ì„ íƒí•˜ì˜€ìŠµë‹ˆë‹¤. ì´ìœ ëŠ”:
-* í…Œì´ë¸”ì´ ìž ê²¨ìžˆì–´ ë™ì‹œì„±ì„ ê±°ì˜ ì§€ì›í•˜ì§€ 않습니다
-* 다른 엔진보다 ì†ìƒì´ ë” ìžì£¼ ë°œìƒí•©ë‹ˆë‹¤
-* 미디어위키 바탕 코드가 í•­ìƒ ì •ìƒì ìœ¼ë¡œ MyISAMì„ ì²˜ë¦¬í•˜ì§€ 않습니다
-
-MySQL 설치가 InnoDB를 지ì›í•œë‹¤ë©´ ê·¸ ì„ íƒ ëŒ€ì‹ ì— InnoDB를 ì„ íƒí•  ê²ƒì„ ë§¤ìš° 권장합니다.
-MySQL 설치가 InnoDB를 지ì›í•˜ì§€ 않는다면 ì•„ë§ˆë„ ì—…ê·¸ë ˆì´ë“œë¥¼ 해야 í•  ìˆ˜ë„ ìžˆìŠµë‹ˆë‹¤.",
+ 'config-mysql-myisam-dep' => "'''경고''': ë¯¸ë””ì–´ìœ„í‚¤ì— ì‚¬ìš©í•˜ì§€ 않는 ê²ƒì´ ì¢‹ì€ MySQLì— ëŒ€í•œ 스토리지 엔진으로 MyISAMì„ ì„ íƒí•˜ì˜€ìŠµë‹ˆë‹¤. ì´ìœ ëŠ”:
+* í…Œì´ë¸” ìž ê¸ˆì— ì˜í•´ 간신히 ë™ì‹œì„±ì„ 지ì›í•©ë‹ˆë‹¤
+* 다른 엔진보다 ì†ìƒí•˜ëŠ” ê²½í–¥ì´ ìžˆìŠµë‹ˆë‹¤
+* 미디어위키 코드베ì´ìŠ¤ê°€ í•­ìƒ ì •ìƒì ìœ¼ë¡œ MyISAMì„ ì²˜ë¦¬í•˜ì§€ 않습니다
+
+MySQL 설치가 InnoDB를 지ì›í•œë‹¤ë©´, ê·¸ ì„ íƒ ëŒ€ì‹ ì— InnoDB를 ì„ íƒí•  ê²ƒì„ ë§¤ìš° 권장합니다.
+MySQL 설치가 InnoDB를 지ì›í•˜ì§€ 않는다면, ì•„ë§ˆë„ ì—…ê·¸ë ˆì´ë“œë¥¼ í•  시간입니다.",
+ 'config-mysql-only-myisam-dep' => "'''경고''': ë¯¸ë””ì–´ìœ„í‚¤ì— ì‚¬ìš©í•˜ì§€ 않는 ê²ƒì´ ì¢‹ì€ MySQLì— ëŒ€í•œ 유ì¼í•˜ê²Œ 사용할 수 있는 스토리지 엔진입니다. ì´ìœ ëŠ”:
+* í…Œì´ë¸” ìž ê¸ˆì— ì˜í•´ 간신히 ë™ì‹œì„±ì„ 지ì›í•©ë‹ˆë‹¤
+* 다른 엔진보다 ì†ìƒí•˜ëŠ” ê²½í–¥ì´ ìžˆìŠµë‹ˆë‹¤
+* 미디어위키 코드베ì´ìŠ¤ê°€ í•­ìƒ ì •ìƒì ìœ¼ë¡œ MyISAMì„ ì²˜ë¦¬í•˜ì§€ 않습니다
+
+MySQL 설치가 InnoDB를 지ì›í•˜ì§€ 않으며, ì•„ë§ˆë„ ì—…ê·¸ë ˆì´ë“œë¥¼ í•  시간입니다.",
'config-mysql-engine-help' => "'''InnoDB'''는 ë™ì‹œì ì¸ 지ì›ì— 좋기 ë•Œë¬¸ì— ëŒ€ë¶€ë¶„ ìµœê³ ì˜ ì˜µì…˜ìž…ë‹ˆë‹¤.
'''MyISAM'''ì€ ë‹¨ì¼ ì‚¬ìš©ìž ë˜ëŠ” ì½ê¸° ì „ìš© ì„¤ì¹˜ì— ë¹ ë¥¼ 수 있습니다.
@@ -11096,7 +11469,6 @@ MyISAM ë°ì´í„°ë² ì´ìŠ¤ëŠ” InnoDB ë°ì´í„°ë² ì´ìŠ¤ë³´ë‹¤ ë” ìžì£¼ ì†ì‹¤ë
MySQLì˜ UTF-8 모드를 보다 ë” íš¨ìœ¨ì ì´ê³  유니코드 문ìžì˜ ì „ì²´ 범위를 사용할 수 있습니다.
'''UTF-8 모드'''ì—서는 MySQLì€ ë°ì´í„°ë¥¼ 설정하는 ë¬¸ìž ì§‘í•©ì„ ì•Œê³  있기 ë•Œë¬¸ì— ì ì ˆí•˜ê²Œ 표현하고 변환할 수 있지만
[//ko.wikipedia.org/wiki/%EC%9C%A0%EB%8B%88%EC%BD%94%EB%93%9C_%ED%8F%89%EB%A9%B4#.EA.B8.B0.EB.B3.B8_.EB.8B.A4.EA.B5.AD.EC.96.B4_.ED.8F.89.EB.A9.B4 기본 다국어 í‰ë©´] ë°–ì˜ ë¬¸ìžë¥¼ 저장할 수 없습니다.",
- 'config-ibm_db2-low-db-pagesize' => "DB2 ë°ì´í„°ë² ì´ìŠ¤ì— 부족한 페ì´ì§€ í¬ê¸°ê°€ 기본 í…Œì´ë¸” ê³µê°„ì— ìžˆìŠµë‹ˆë‹¤. 페ì´ì§€ í¬ê¸°ëŠ” '''32K''' ì´ìƒì´ì–´ì•¼ 합니다.",
'config-site-name' => '위키 ì´ë¦„:',
'config-site-name-help' => '브ë¼ìš°ì € 제목 표시줄과 다른 여러 ê³³ì— ë‚˜íƒ€ë‚©ë‹ˆë‹¤.',
'config-site-name-blank' => '사ì´íŠ¸ ì´ë¦„ì„ ìž…ë ¥í•˜ì„¸ìš”.',
@@ -11165,7 +11537,7 @@ MySQLì˜ UTF-8 모드를 보다 ë” íš¨ìœ¨ì ì´ê³  유니코드 문ìžì˜ ì „ì²
'config-license-gfdl' => 'GNU ìžìœ  문서 사용 허가서 1.3 ì´ìƒ',
'config-license-pd' => 'í¼ë¸”릭 ë„ë©”ì¸',
'config-license-cc-choose' => '다른 í¬ë¦¬ì—ì´í‹°ë¸Œ 커먼즈 ë¼ì´ì„ ìŠ¤ ì„ íƒ',
- 'config-license-help' => "ë§Žì€ ê³µê°œ 위키는 모든 기여를 [http://freedomdefined.org/Definition ìžìœ  ë¼ì´ì„ ìŠ¤] í•˜ì— ë„£ìŠµë‹ˆë‹¤.
+ 'config-license-help' => "ë§Žì€ ê³µê°œ 위키는 모든 기여를 [http://freedomdefined.org/Definition ìžìœ  ë¼ì´ì„ ìŠ¤]ì— ë”°ë¼ ë„£ìŠµë‹ˆë‹¤.
ì´ë ‡ê²Œ 하면 커뮤니티 ì†Œìœ ê¶Œì˜ ì´í•´ë¥¼ í•  수 있ë„ë¡ í•˜ê³  장기ì ì¸ 기여를 장려합니다.
ì¼ë°˜ì ìœ¼ë¡œ ê°œì¸ ë˜ëŠ” 회사 ìœ„í‚¤ì— ëŒ€í•´ì„œëŠ” 필요하지 않습니다.
@@ -11173,7 +11545,7 @@ MySQLì˜ UTF-8 모드를 보다 ë” íš¨ìœ¨ì ì´ê³  유니코드 문ìžì˜ ì „ì²
위키백과는 ì´ì „ì— GNU ìžìœ  문서 사용 허가서를 사용했습니다.
GFDLì€ ìœ íš¨í•œ ë¼ì´ì„ ìŠ¤ì´ì§€ë§Œ ë‚´ìš©ì„ ì´í•´í•˜ê¸° 어렵습니다.
-GFDL í•˜ì— ì‚¬ìš©ì„ í—ˆê°€í•œ ë‚´ìš©ì„ ìž¬ì‚¬ìš©í•˜ëŠ” ê²ƒë„ ì–´ë µìŠµë‹ˆë‹¤.",
+GFDLì— ë”°ë¼ ì‚¬ìš©ì´ í—ˆê°€ëœ ë‚´ìš©ì„ ìž¬ì‚¬ìš©í•˜ëŠ” ê²ƒë„ ì–´ë µìŠµë‹ˆë‹¤.",
'config-email-settings' => 'ì´ë©”ì¼ ì„¤ì •',
'config-enable-email' => '발신 ì´ë©”ì¼ í™œì„±í™”',
'config-enable-email-help' => 'ì´ë©”ì¼ì„ ìž‘ë™í•˜ë ¤ë©´ [http://www.php.net/manual/en/mail.configuration.php PHPì˜ ë©”ì¼ ì„¤ì •]ì„ ì˜¬ë°”ë¥´ê²Œ 설정해야 합니다.
@@ -11199,12 +11571,14 @@ GFDL í•˜ì— ì‚¬ìš©ì„ í—ˆê°€í•œ ë‚´ìš©ì„ ìž¬ì‚¬ìš©í•˜ëŠ” ê²ƒë„ ì–´ë µìŠµë‹ˆë‹¤
íŒŒì¼ ì˜¬ë¦¬ê¸°ë¥¼ 활성화하려면 ë¯¸ë””ì–´ìœ„í‚¤ì˜ ë£¨íŠ¸ ë””ë ‰í† ë¦¬ì— ìžˆëŠ” <code>images</code> 하위 디렉토리ì—ì„œ 웹 서버가 기ë¡í•  수 있ë„ë¡ ëª¨ë“œë¥¼ 바꿉니다.
ê·¸ ë‹¤ìŒ ì´ ì˜µì…˜ì„ í™œì„±í™”í•©ë‹ˆë‹¤.',
- 'config-upload-deleted' => 'ì‚­ì œëœ íŒŒì¼ì— 대한 디렉토리:',
+ 'config-upload-deleted' => 'ì‚­ì œëœ íŒŒì¼ì— 대한 디렉터리:',
'config-upload-deleted-help' => 'ì‚­ì œëœ íŒŒì¼ì„ 보관할 디렉토리를 ì„ íƒí•˜ì„¸ìš”.
ì´ìƒì ìœ¼ë¡œ 웹ì—ì„œ 접근할 수 없게 해야 합니다.',
'config-logo' => '로고 URL:',
- 'config-logo-help' => 'ë¯¸ë””ì–´ìœ„í‚¤ì˜ ê¸°ë³¸ ìŠ¤í‚¨ì€ ì‚¬ì´ë“œë°” 메뉴 ìœ„ì— 135×160 í”½ì…€ì˜ ë¡œê³ ë¥¼ í¬í•¨í•˜ê³  있습니다.
-ì ë‹¹í•œ í¬ê¸°ë¡œ ì´ë¯¸ì§€ë¥¼ 올리고 URLì„ ì—¬ê¸°ì— ìž…ë ¥í•˜ì„¸ìš”.
+ 'config-logo-help' => 'ë¯¸ë””ì–´ìœ„í‚¤ì˜ ê¸°ë³¸ ìŠ¤í‚¨ì€ ì‚¬ì´ë“œë°” 메뉴 ìœ„ì— 135×160 í”½ì…€ì˜ ë¡œê³ ì˜ ê³µê°„ì„ í¬í•¨í•˜ê³  있습니다.
+ì ë‹¹í•œ í¬ê¸°ë¡œ ê·¸ë¦¼ì„ ì˜¬ë¦¬ê³  ì—¬ê¸°ì— URLì„ ìž…ë ¥í•˜ì„¸ìš”.
+
+로고가 ìƒëŒ€ì ì¸ ê²½ë¡œì— ìžˆìœ¼ë©´ <code>$wgStylePath</code>나 <code>$wgScriptPath</code>를 사용할 수 있습니다.
로고 ì‚¬ìš©ì„ ì›í•˜ì§€ 않으면 ì´ ìƒìžë¥¼ 비우세요.',
'config-instantcommons' => 'ì¸ìŠ¤í„´íŠ¸ 공용 활성화',
@@ -11258,7 +11632,7 @@ GFDL í•˜ì— ì‚¬ìš©ì„ í—ˆê°€í•œ ë‚´ìš©ì„ ìž¬ì‚¬ìš©í•˜ëŠ” ê²ƒë„ ì–´ë µìŠµë‹ˆë‹¤
현재 미디어위키는 í…Œì´ë¸”ì„ ì›¹ 사용ìžê°€ 소유해야 합니다. 다른 웹 계정 ì´ë¦„ì„ ì§€ì •í•˜ê±°ë‚˜ "뒤로"를 í´ë¦­í•˜ê³  ì ì ˆí•œ ê¶Œí•œì˜ ì„¤ì¹˜í•  사용ìžë¥¼ 지정하세요.',
'config-install-user' => 'ë°ì´í„°ë² ì´ìŠ¤ 사용ìžë¥¼ 만드는 중',
- 'config-install-user-alreadyexists' => '"$1" 사용ìžê°€ ì´ë¯¸ 있습니다',
+ 'config-install-user-alreadyexists' => '"$1" 사용ìžê°€ ì´ë¯¸ 존재합니다',
'config-install-user-create-failed' => '"$1" ì‚¬ìš©ìž ë§Œë“œëŠ” 중 실패: $2',
'config-install-user-grant-failed' => '"$1" 사용ìžì— 대한 권한 부여 실패: $2',
'config-install-user-missing' => '지정한 "$1" 사용ìžê°€ 존재하지 않습니다.',
@@ -11287,18 +11661,21 @@ GFDL í•˜ì— ì‚¬ìš©ì„ í—ˆê°€í•œ ë‚´ìš©ì„ ìž¬ì‚¬ìš©í•˜ëŠ” ê²ƒë„ ì–´ë µìŠµë‹ˆë‹¤
설치 í”„ë¡œê·¸ëž¨ì´ <code>LocalSettings.php</code> 파ì¼ì„ 만들었습니다.
모든 ì„¤ì •ì´ í¬í•¨ë˜ì–´ 있습니다.
-파ì¼ì„ 다운로드하여 위키 ì„¤ì¹˜ì˜ ê±°ì ì— 넣어야 합니다. (index.php와 ê°™ì€ ë””ë ‰í† ë¦¬) 다운로드가 ìžë™ìœ¼ë¡œ 시작ë©ë‹ˆë‹¤.
+파ì¼ì„ 다운로드하여 위키 ì„¤ì¹˜ì˜ ê±°ì ì— 넣어야 합니다. (index.php와 ê°™ì€ ë””ë ‰í„°ë¦¬) 다운로드가 ìžë™ìœ¼ë¡œ 시작ë©ë‹ˆë‹¤.
다운로드가 제공ë˜ì§€ ì•Šì„ ê²½ìš°ë‚˜ ê·¸ê²ƒì„ ì·¨ì†Œí•œ 경우ì—는 ì•„ëž˜ì˜ ë§í¬ë¥¼ í´ë¦­í•˜ì—¬ 다운로드를 다시 시작할 수 있습니다:
$3
-'''참고''': ì´ ìƒì„±í•œ 설정 파ì¼ì„ 다운로드하지 ì•Šê³  설치를 ëë‚´ë©´ ì´ íŒŒì¼ì€ ë‚˜ì¤‘ì— ì‚¬ìš©í•  수 없습니다.
+'''참고:''' ì´ ìƒì„±í•œ 설정 파ì¼ì„ 다운로드하지 ì•Šê³  설치를 ëë‚´ë©´ ì´ íŒŒì¼ì€ ë‚˜ì¤‘ì— ì‚¬ìš©í•  수 없습니다.
완료ë˜ì—ˆìœ¼ë©´ '''[$2 ìœ„í‚¤ì— ë“¤ì–´ê°ˆ 수 있습니다]'''.",
'config-download-localsettings' => '<code>LocalSettings.php</code> 다운로드',
'config-help' => 'ë„움ë§',
'config-nofile' => '"$1" 파ì¼ì„ ì°¾ì„ ìˆ˜ 없습니다. ì´ë¯¸ ì‚­ì œë˜ì—ˆë‚˜ìš”?',
+ 'config-extension-link' => 'ë‹¹ì‹ ì˜ ìœ„í‚¤ê°€ [//www.mediawiki.org/wiki/Manual:Extensions 확장 기능]ì„ ì§€ì›í•œë‹¤ëŠ” ê²ƒì„ ì•Œê³  계십니까?
+
+ì „ì²´ 확장 ê¸°ëŠ¥ì˜ ëª©ë¡ì„ 확ì¸í•˜ë ¤ë©´ [//www.mediawiki.org/wiki/Category:Extensions_by_category 분류별 확장 기능]ì´ë‚˜ [//www.mediawiki.org/wiki/Extension_Matrix 확장 기능 í‘œ]를 찾아보실 수 있습니다.',
'mainpagetext' => "'''미디어위키가 성공ì ìœ¼ë¡œ 설치ë˜ì—ˆìŠµë‹ˆë‹¤.'''",
'mainpagedocfooter' => '[//meta.wikimedia.org/wiki/Help:Contents ì´ê³³]ì—ì„œ 위키 ì†Œí”„íŠ¸ì›¨ì–´ì— ëŒ€í•œ 정보를 ì–»ì„ ìˆ˜ 있습니다.
@@ -11320,7 +11697,7 @@ $messages['krc'] = array(
== Файдалы реÑурÑла ==
* [//www.mediawiki.org/wiki/Manual:Configuration_settings тюрлендириулени ÑпиÑогу (ингил.)];
* [//www.mediawiki.org/wiki/Manual:FAQ MediaWiki-ни ÑŽÑюнден кёб берилген Ñоруула];
-* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce MediaWiki-ни джангы верÑиÑÑыны чыкъгъанын билдириу пиÑьмола].",
+* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce MediaWiki-ни джангы верÑиÑÑыны чыкъгъанын билдириу пиÑьмола].", # Fuzzy
);
/** Colognian (Ripoarisch)
@@ -11450,7 +11827,7 @@ Dat heiß, mer moß en affschallde, söns jeiht nix.",
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>.',
+MediaWiki deiht et nit der ohne de Funxjohne för de rejolähre Ußdrök vun dä Zoot, wi <i lang="en">Perl</i> se kännt.',
'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.',
@@ -11465,6 +11842,8 @@ Et Enreeschte kunnt doh draan kappott jon!",
Et <i lang="en">object caching</i> es nit müjjelesh un ußjeschalldt.',
'config-mod-security' => "'''Opjepaß''': Dinge Webßööver hät <code lang=\"en\">[http://modsecurity.org/ mod_security]</code> enjeschalldt. Wann doh derbei en Enschtällong nit janz akeraat paßß, dann kann et goot sin, dat mer Probleme met MeedijaWiki un oc met ander Projramme kritt, die zohlööt, dat vun ußerhallef öhndsene Krohm op dä Webßööver jebraat wääde künnt.Beloor Der di Sigg <code lang=\"en\">[http://modsecurity.org/documentation/ mod_security documentation]</code> udder donn met dä Fachlück för Dinge Webßööver kalle, wann zohfälleje un koomijje Fähler bemerke deihß.",
'config-diff3-bad' => 'Mer han <i lang="en">GNU</i> <code lang="en">diff3</code> nit jefonge.',
+ 'config-git' => 'Mer han de Väsjohn <code>$1</code> vun däm Väsjohnsverwalldongsprojamm <i lang="en">Git</i> jefonge.',
+ 'config-git-bad' => 'Dat Väsjohnsverwalldongsprojamm <i lang="en">Git</i> ham_mer 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.
@@ -11484,7 +11863,7 @@ Heh jeihd et nit wigger.',
'config-using531' => 'MediaWiki läuf nit met PHP $1 zosamme wääje enem [//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-suhosin-max-value-length' => '<i lang="en">Suhosin</i> es enschtalleet. Dröm kann ene <code lang="en">GET</code>-Parrameeter nit övver {{PLURAL:$1|ei Byte|$q Bytes|noll Byte}} lang wääde. En MediaWiki singe <i lang="en">ResourceLoader</i> kütt doh zwa drömeröm, ävver dat brems. Wann müjelesch, doht <code lang="en">suhosin.get.max_value_length</code> en dä Dattei <code lang="en">php.ini</code> op 1024 Bytes udder drövver enschtälle. un dann moß <code lang="en">$wgResourceLoaderMaxQueryLength</code> en dä Dattei <code lang="en">LocalSettings.php</code> op däsälve Wäät jesaz wääde.', # Fuzzy
+ 'config-suhosin-max-value-length' => '<i lang="en">Suhosin</i> es enschtalleet. Dröm kann ene <code lang="en">GET</code>-Parrameeter nit övver {{PLURAL:$1|ei Byte|$1 Bytes|noll Byte}} lang wääde. Dem MediaWiki singe <i lang="en">ResourceLoader</i> kütt doh zwa drömeröm, ävver dat bräms. Wann müjelesch, doht <code lang="en">suhosin.get.max_value_length</code> en dä Dattei <code lang="en">php.ini</code> op 1024 Bytes udder drövver enschtälle, un dann moß <code lang="en">$wgResourceLoaderMaxQueryLength</code> en dä Dattei <code lang="en">LocalSettings.php</code> op däsälve Wäät jesaz wääde.',
'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 dämm sing <i lang="en">IP</i>-Addräß enjävve.
@@ -11566,7 +11945,6 @@ Donn Ding Daatebangk et beß janz woh anders hen, noh <code lang="en">/var/lib/m
'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-type-ibm_db2' => 'Dä <i lang="en">IBM</i> ier <i lang="en">DB2</i>',
'config-support-info' => 'MediaWiki kann met heh dä Daatebangk_Süßteeme zosamme jonn:
$1
@@ -11576,12 +11954,10 @@ Wann dat Daatebangk_Süßteem, wat De nämme wells, onge nit dobei es, dann donn
'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-support-ibm_db2' => '* $1 es en Datebengk för et Jeschäff un fö Ongernehme.', # Fuzzy
'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-header-ibm_db2' => 'De Enshtällunge för de <i lang="en">IBM</i> ier <i lang="en">DB2</i>',
'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.',
@@ -11658,6 +12034,13 @@ Dä aanjejovve Zohjang för der Nomaalbedrief moß dröm schunn enjersht sen!',
Wann Ding <i lang="en">MySQL</i> et Schpeischere en <i lang="en">InnoDB</i>-Datteije ongerschtöze deiht, dom_mer dat nohdröcklesch ämfähle.
Kann dä ẞööver dat nit, künnd et joode jelääjeheit sin, dä ens op der neuste Schtand ze bränge.',
+ 'config-mysql-only-myisam-dep' => '\'\'\'Opjepaß:\'\'\' <i lang="en">MyISAM</i> es de einzeje Zoot Speischerprojramm för <i lang="en">MySQL</i>, di nit för MediaWiki ze ämfähle es, weil:
+* wääje dem Schpärre vun jannze Tabälle sin koum paralleele Axjuhne en dä Daatebangk möjjelesch,
+* et es aanfällesch för Probleeme met de Daate es, un
+* et weed vun MediaWiki nit emmer jood ongerschtöz.
+
+Ding Enschtallazjuhn vum <i lang="en">MySQL</i> kann nit met <i lang="en">InnoDB</i> ömjonn.
+Wi wöhr et met ener neuere väsjohn vum <i lang="en">MySQL</i>?',
'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.
@@ -11670,7 +12053,6 @@ Dat es flöcker un spaasaamer wi et UTF-8 Fommaat vum <i lang=\"en\">MySQL</i> u
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 [//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-ibm_db2-low-db-pagesize' => "De <i lang=\"en\">DB2</i> Daatebangk heh hät ene standattmääßeje Plaz för Tabälle met zoh klein Sigge. Dä Plaz en de Sigge moß '''32K''' udder mieh sin.",
'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.',
@@ -11713,25 +12095,25 @@ Do künnts jez der Räß vun de einzel Enshtellunge övverjonn, un et Wiki tirä
'config-optional-continue' => 'De wells 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', # Fuzzy
+ 'config-profile-wiki' => 'En 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.
+ 'config-profile-help' => "Wikis loufe et bäß, wam_mer esu vill Lück wi möjjelesch draan metmaache un schrieve löht.
+Met MediaWiki es et ejfach, de neuste Änderonge 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.
+Bloß, mänsch eine häd_eruß jefonge, dat mer MediaWiki jood en en jruuße Zahl ongerscheidlijje Rolle bruche kann, un nit emmer es et leisch, 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-wiki}}''' löht jeder_ein metschrieve, och ohne sesch enzelogge.
-'''{{int:config-profile-no-anon}}''', dat sorsh för mieh seeshbaa Verantwootlishkeite, künnt ävver zohfällije Methellefer verschrecke.
+'''{{int:config-profile-no-anon}}''', dat sorsch för mieh seeschbaa Verantwootlischkeite, 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 [//www.mediawiki.org/wiki/Manual:User_rights zopaß Hölp em Handbooch] aan.", # Fuzzy
+Noch ander un un opwändijere Enschtellunge för de Rääschte sin möjjelesch, wann et Wiki ens aam Loufe es. Loor Der doför de [//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',
@@ -11780,6 +12162,8 @@ Et bäß es, wam_mer vum <i lang="en">world wide web</i> doh nit drahn kumme kan
'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.
+Do kanns <code lang="en">$wgStylePath</code> udder <code lang="en">$wgScriptPath</code> nämme, wann Ding Logo en einem vun dänne Pahde litt.
+
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">[//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">[//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.
@@ -11806,7 +12190,7 @@ Se sullte ein pro Reih opjeschrevve sin, un en Pooz (<i lang="en">port</i>) ier
'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' => 'Projramm-Zohsäz (<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.',
@@ -11814,7 +12198,7 @@ Do kann se heh un jez aanschallde, ävver se künnte noch zohsäzlesch Enshtellu
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}}“.', # Fuzzy
+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',
@@ -11874,14 +12258,18 @@ Wann De mem Ronger- un widder Huhlaade fäädesh bes, kanns De '''[\$2 en Ding W
'config-download-localsettings' => 'Donn di Dattei <code lang="en">LocalSettings.php</code> eronger laade',
'config-help' => 'Hölp',
'config-nofile' => 'De Dattei „$1“ ham_mer nit jefonge. Es di fottjeschmeße?',
+ 'config-extension-link' => 'Häs De jewoß, dat et Wiki [//www.mediawiki.org/wiki/Manual:Extensions Zohsazprojramme] hann kann?
+
+Do kanns [//www.mediawiki.org/wiki/Category:Extensions_by_category Zohsazprojramme noh Saachjroppe] söhke udder en de [//www.mediawiki.org/wiki/Extension_Matrix Tabäll met de Zohsazprojramme] kike, öm de kumplätte Leß met de Zohsazprojramme ze krijje.',
'mainpagetext' => "'''MediaWiki es jetz enstalleet.'''",
- 'mainpagedocfooter' => 'Luur en et (änglesche) [//meta.wikimedia.org/wiki/Help:Contents Handboch] wann De wesse wells wie de Wiki-Soffwär jebruch un bedeent wääde muss.
+ 'mainpagedocfooter' => 'Luur en et (änglesche) [//meta.wikimedia.org/wiki/Help:Contents Handbooch] wann De wesse wells wie de Wiki-Soffwär jebruch un bedeent wääde moß.
== För dä Aanfang ==
Dat es och all op Änglesch:
* [//www.mediawiki.org/wiki/Manual:Configuration_settings Configuration settings list]
* [//www.mediawiki.org/wiki/Manual:FAQ MediaWiki FAQ]
-* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce MediaWiki release mailing list]', # Fuzzy
+* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce MediaWiki release mailing list]
+* [//www.mediawiki.org/wiki/Localisation#Translation_resources Donn MediaWiki op Ding Schprooch aanpaße]',
);
/** Kurdish (Latin script) (Kurdî (latînî)‎)
@@ -11903,7 +12291,7 @@ $messages['ku-latn'] = array(
* [//www.mediawiki.org/wiki/Manual:Configuration_settings Lîsteya varîyablên konfîgûrasîyonê]
* [//www.mediawiki.org/wiki/Manual:FAQ MediaWiki FAQ]
-* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce Lîsteya e-nameyên versyonên nuh yê MediaWiki]',
+* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce Lîsteya e-nameyên versyonên nuh yê MediaWiki]', # Fuzzy
);
/** Ladino (Ladino)
@@ -11916,11 +12304,12 @@ $messages['lad'] = array(
== En Empeçando ==
* [//www.mediawiki.org/wiki/Manual:Configuration_settings La lista de los arreglamientos de la konfiggurasyón]
* [//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]',
+* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce La lista de las letrales (e-mail) de MedyaViki]', # Fuzzy
);
/** Luxembourgish (Lëtzebuergesch)
* @author Robby
+ * @author Soued031
* @author ì•„ë¼
*/
$messages['lb'] = array(
@@ -11930,6 +12319,8 @@ $messages['lb'] = array(
'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 <code>LocalSettings.php</code>.",
+ 'config-localsettings-cli-upgrade' => "E Fichier <code>LocalSettings.php</code> gouf fonnt.
+Fir dës Installatioun z'aktuaéliséieren start w.e.g. <code>update.php</code>",
'config-localsettings-key' => 'Aktualisatiounsschlëssel:',
'config-localsettings-badkey' => 'De Schlëssel deen Dir aginn hutt ass net korrekt',
'config-localsettings-incomplete' => 'De Fichier <code>LocalSettings.php</code> schéngt net komplett ze sinn.
@@ -11963,7 +12354,7 @@ Kuckt Är php.ini no a vergewëssert Iech datt <code>session.save_path</code> o
'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.",
+Dir sollt d'Resultater vun dëser Iwwerpréifung ugi wann Dir während der Installatioun Hëllef frot wéi Dir D'Installatioun ofschléisse kënnt.",
'config-sidebar' => '* [//www.mediawiki.org MediaWiki Haaptsäit]
* [//www.mediawiki.org/wiki/Help:Contents Benotzerguide]
* [//www.mediawiki.org/wiki/Manual:Contents Guide fir Administrateuren]
@@ -11987,9 +12378,10 @@ Dës Datebank-Type ginn ënnerstëtzt: $1.
Wann Dir op engem gesharte Server sidd, da frot Ären Hosting-Provider fir de passenden Datebank-Driver z'installéieren.
Wann Dir PHP selwer compiléiert hutt, da reconfiguréiert en mat dem ageschalten Datebank-Client, zum Beispill an deem Dir <code>./configure --with-mysql</code> benotzt.
Wann Dir PHP vun engem Debian oder Ubuntu Package aus installéiert hutt, da musst Dir och den php5-mysql Modul installéieren.",
+ 'config-outdated-sqlite' => "'''Warnung:''' SQLite $1 ass installéiert. Allerdengs brauch MediaWiki SQLite $2 oder méi nei. SQLite ass dofir net disponibel.",
'config-memory-bad' => "'''Opgepasst:''' De Parameter <code>memory_limit</code> vu PHP ass $1.
Dat ass wahrscheinlech ze niddreg.
-D'Installatioun kéint net fonctionnéieren.",
+D'Installatioun kéint net funktionéieren.",
'config-xcache' => '[http://xcache.lighttpd.net/ XCache] ass installéiert',
'config-apc' => '[http://www.php.net/apc APC] ass installéiert',
'config-wincache' => '[http://www.iis.net/download/WinCacheForPhp WinCache] ass installéiert',
@@ -11997,7 +12389,9 @@ D'Installatioun kéint net fonctionnéieren.",
'config-no-uri' => "'''Feeler:''' Déi aktuell URI konnt net festgestallt ginn.
Installatioun ofgebrach.",
'config-using-server' => 'De Servernumm "<nowiki>$1</nowiki>" gëtt benotzt.',
+ 'config-using-uri' => 'D\'Server URL "<nowiki>$1$2</nowiki>" gëtt benotzt.',
'config-db-type' => 'Datebanktyp:',
+ 'config-db-host' => 'Host vun der Datebank:',
'config-db-host-oracle' => 'Datebank-TNS:',
'config-db-wiki-settings' => 'Dës Wiki identifizéieren',
'config-db-name' => 'Numm vun der Datebank:',
@@ -12026,13 +12420,10 @@ Wann et de Kont net gëtt, a wann den Installatiouns-Kont genuch Rechter huet, g
'config-type-postgres' => 'PostgreSQL',
'config-type-sqlite' => 'SQLite',
'config-type-oracle' => 'Oracle',
- 'config-type-ibm_db2' => 'IBM DB2',
- 'config-support-ibm_db2' => '* $1 ass eng kommerziell Firma fir Datebanken', # Fuzzy
'config-header-mysql' => 'MySQL-Astellungen',
'config-header-postgres' => 'PostgreSQL-Astellungen',
'config-header-sqlite' => 'SQLite-Astellungen',
'config-header-oracle' => 'Oracle-Astellungen',
- 'config-header-ibm_db2' => 'IBM DB2-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-host' => 'Dir musst e Wäert fir "Database host" uginn',
@@ -12047,7 +12438,7 @@ E gëtt fir den Numm vum SQLite Date-Fichier benotzt.',
'config-upgrade-done-no-regenerate' => "D'Aktualisatioun ass ofgeschloss.
Dir kënnt elo [$1 ufänken Är Wiki ze benotzen]",
- 'config-regenerate' => '<code>LocalSettings.php</code> regeneréieren →',
+ 'config-regenerate' => 'LocalSettings.php regeneréieren →',
'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',
@@ -12074,18 +12465,18 @@ Dësen Numm gëtt da gebraucht fir sech an d\'Wiki anzeloggen.',
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-password-mismatch' => 'Déi zwee Passwierder Déi Dir aginn hutt stëmmen net iwwereneen.',
+ 'config-admin-email' => 'E-Mail-Adress:',
'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-admin-error-bademail' => 'Dir hutt eng E-Mail-Adress 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', # Fuzzy
+ 'config-profile-wiki' => 'Oppe Wiki',
'config-profile-no-anon' => 'Uleeë vun engem Benotzerkont verlaangt',
'config-profile-fishbowl' => 'Nëmmen autoriséiert Editeuren',
'config-profile-private' => 'Privat Wiki',
@@ -12101,39 +12492,45 @@ Dir kënnt elo déi Astellungen déi nach iwwreg sinn iwwersprangen an d'Wiki el
'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-upload-deleted' => 'Repertoire fir geläscht Fichieren:',
'config-logo' => 'URL vum Logo:',
'config-instantcommons' => '"Instant Commons" aktivéieren',
'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-step-failed' => 'huet net funktionéiert',
'config-install-extensions' => 'Mat den Ereiderungen',
'config-install-database' => 'Datebank gëtt installéiert',
+ 'config-install-pg-plpgsql' => 'No der Sprooch PL/pgSQL sichen',
'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-user-create-failed' => 'D\'Opmaache vum Benotzer "$1" huet net funktionéiert: $2',
+ 'config-install-user-grant-failed' => 'D\'Bäisetze vu Rechter fir de Benotzer "$1" huet net funktionéiert: $2',
'config-install-user-missing' => 'De Benotzer "$1" deen ugi gouf gëtt et net.',
+ 'config-install-user-missing-create' => 'De spezifizéierte Benotzer "$1" gëtt et net.
+Klickt d\'Checkbox "Benotzerkont uleeën" wann Dir dee Benotzer uleeë wëllt.',
'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',
+ 'config-install-mainpage' => 'Haaptsäit mat Standard-Inhalt gëtt ugeluecht',
'config-install-extension-tables' => "D'Tabelle fir déi aktivéiert Erweiderunge ginn ugeluecht",
'config-install-mainpage-failed' => "D'Haaptsäit konnt net dragesat ginn: $1",
'config-download-localsettings' => '<code>LocalSettings.php</code> eroflueden',
'config-help' => 'Hëllef',
'config-nofile' => 'De Fichier "$1" gouf net fonnt. Gouf e geläscht?',
'mainpagetext' => "'''MediaWiki gouf installéiert.'''",
- 'mainpagedocfooter' => "Kuckt w.e.g. [//meta.wikimedia.org/wiki/Help:Contents d'Benotzerhandbuch] fir den Interface ze personnaliséieren.
+ 'mainpagedocfooter' => "Kuckt w.e.g. [//meta.wikimedia.org/wiki/Help:Contents d'Benotzerhandbuch] fir Informatiounen iwwer de Gebruach vun der Wiki Software.
-== Starthëllefen ==
+== Fir unzefänken ==
* [//www.mediawiki.org/wiki/Manual:Configuration_settings Hëllef bei der Konfiguratioun]
* [//www.mediawiki.org/wiki/Manual:FAQ MediaWiki-FAQ]
-* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce Mailinglëscht vun neie MediaWiki-Versiounen]", # Fuzzy
+* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce Mailinglëscht vun neie MediaWiki-Versiounen]
+* [//www.mediawiki.org/wiki/Localisation#Translation_resources Lokaliséiert MediaWiki fir Är Sprooch]",
);
/** Lingua Franca Nova (Lingua Franca Nova)
@@ -12146,7 +12543,7 @@ $messages['lfn'] = array(
* [//www.mediawiki.org/wiki/Manual:Configuration_settings Lista de ajustas de la desinia]
* [//www.mediawiki.org/wiki/Manual:FAQ Demandas comun de MediaWiki]
-* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce Lista per receta anunsias de novas supra MediaWiki]',
+* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce Lista per receta anunsias de novas supra MediaWiki]', # Fuzzy
);
/** Ganda (Luganda)
@@ -12159,7 +12556,7 @@ $messages['lg'] = array(
== Amagezi agakuyamba okutandika ==
* [//www.mediawiki.org/wiki/Manual:Configuration_settings Lukalala lw'eby'enteekateeka yo]
* [//www.mediawiki.org/wiki/Manual:FAQ Ebiter'okubuuzibwa ku MediaWiki]
-* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce Wewandise ofunenga amawulire aga email ag'ebifa ku MediaWiki]",
+* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce Wewandise ofunenga amawulire aga email ag'ebifa ku MediaWiki]", # Fuzzy
);
/** Limburgish (Limburgs)
@@ -12172,7 +12569,7 @@ $messages['li'] = array(
* [//www.mediawiki.org/wiki/Manual:Configuration_settings Lies mit instellinge]
* [//www.mediawiki.org/wiki/Manual:FAQ MediaWiki VGV (FAQ)]
-* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce MediaWiki mailinglies veur nuuj versies]",
+* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce MediaWiki mailinglies veur nuuj versies]", # Fuzzy
);
/** Lao (ລາວ)
@@ -12183,8 +12580,11 @@ $messages['lo'] = array(
/** Lithuanian (lietuvių)
* @author Eitvys200
+ * @author Mantak111
*/
$messages['lt'] = array(
+ 'config-desc' => 'MediaWiki diegimas',
+ 'config-title' => 'MediaWiki $1 diegimas',
'config-information' => 'Informacija',
'config-your-language' => 'Jūsų kalba:',
'config-wiki-language' => 'Viki kalba:',
@@ -12192,6 +12592,8 @@ $messages['lt'] = array(
'config-continue' => 'Toliau →',
'config-page-language' => 'Kalba',
'config-page-welcome' => 'Sveiki atvykę į MediaWiki!',
+ 'config-page-dbconnect' => 'Prisijungti prie duomenų bazės',
+ 'config-page-dbsettings' => 'Duomenų bazės nustatymai',
'config-page-name' => 'Vardas',
'config-page-options' => 'Parinktys',
'config-page-install' => 'Įdiegti',
@@ -12201,13 +12603,22 @@ $messages['lt'] = array(
'config-page-copying' => 'Kopijuojama',
'config-page-upgradedoc' => 'Atnaujinama',
'config-restart' => 'Taip, paleiskite jį iš naujo',
+ 'config-env-php' => 'PHP $1 yra įdiegtas.',
+ 'config-env-php-toolow' => 'PHP $1 įdiegta.
+TaÄiau, MediaWiki reikia PHP $2 ar naujesnÄ—s.',
+ 'config-db-type' => 'Duomenų bazės tipas:',
+ 'config-db-host' => 'Duomenų bazės serveris:',
+ 'config-db-name' => 'Duomenų bazės pavadinimas:',
+ 'config-db-name-oracle' => 'Duomenų bazės schema:',
+ 'config-db-username' => 'Duomenų bazės vartotojo vardas:',
+ 'config-db-password' => 'Duomenų bazės slaptažodis:',
'config-charset-mysql5' => 'MySQL 4.1/5.0 UTF-8',
- 'config-type-ibm_db2' => 'IBM DB2',
+ 'config-db-port' => 'Duomenų bazės prievadas:',
+ 'config-db-schema' => 'MediaWiki schema:',
'config-header-mysql' => 'MySQL nustatymai',
'config-header-postgres' => 'PostgreSQL nustatymai',
'config-header-sqlite' => 'SQLite nustatymai',
'config-header-oracle' => 'Oracle nustatymai',
- 'config-header-ibm_db2' => 'IBM DB2 nustatymai',
'config-mysql-innodb' => 'InnoDB',
'config-mysql-myisam' => 'MyISAM',
'config-mysql-utf8' => 'UTF-8',
@@ -12216,6 +12627,7 @@ $messages['lt'] = array(
'config-project-namespace' => 'Projekto pavadinimas:',
'config-ns-generic' => 'Projektas',
'config-ns-site-name' => 'Toks pat kaip viki pavadinimas: $1',
+ 'config-ns-other-default' => 'ManoWiki',
'config-admin-box' => 'Administratoriaus paskyra',
'config-admin-name' => 'Jūsų vardas:',
'config-admin-password' => 'Slaptažodis:',
@@ -12228,7 +12640,7 @@ $messages['lt'] = array(
'config-optional-continue' => 'Paklausti daugiau klausimų.',
'config-optional-skip' => 'Man jau nuobodu, tiesiog įdiekite viki.',
'config-profile' => 'Vartotojo teisių paskyra:',
- 'config-profile-wiki' => 'TradicinÄ— viki',
+ 'config-profile-wiki' => 'TradicinÄ— viki', # Fuzzy
'config-profile-private' => 'Privati viki',
'config-license-pd' => 'Viešas Domenas',
'config-email-settings' => 'El. pašto nustatymai',
@@ -12239,7 +12651,25 @@ $messages['lt'] = array(
'config-install-step-done' => 'atlikta',
'config-install-step-failed' => 'nepavyko',
'config-install-schema' => 'Kuriama schema',
+ 'config-install-tables' => 'Kuriamos lentelÄ—s',
+ 'config-install-stats' => 'Inicijuojamos statistikos',
'config-install-keys' => 'Generuojami slapti raktai',
+ 'config-install-done' => "'''Sveikiname!'''
+Jūs sėkmingai įdiegėte MediaWiki.
+
+Įdiegimo programa sukūrė <code>LocalSettings.php</code> failą.
+Jame yra visos jūsų konfigūracijos.
+
+Jums reikÄ—s atsisiųsti ir įdÄ—ti jį į savo wiki įdiegimo bazÄ™ (paÄiame kataloge, kaip index.php). Atsisiuntimas turÄ—tų prasidÄ—ti automatiÅ¡kai.
+
+Jei atsisiuntimas nebuvo pasiÅ«lytas, arba jį atÅ¡aukÄ—te, galite iÅ¡ naujo atsisiųsti paspaudÄ™ žemiau esanÄiÄ… nuorodÄ…:
+
+$3
+
+'''Pastaba:''' Jei jūs to nepadarysite dabar, tada šis sukurtas konfigūracijos failas nebus galimas vėliau, jei išeisite iš įdiegimo be atsisiuntimo.
+
+Kai baigsite, jūs galėsite '''[$2 įeiti į savo wiki]'''.",
+ 'config-download-localsettings' => 'Atsisiųsti <code>LocalSettings.php</code>',
'config-help' => 'pagalba',
'mainpagetext' => "'''MediaWiki sėkmingai įdiegta.'''",
'mainpagedocfooter' => 'Informacijos apie wiki programinės įrangos naudojimą, ieškokite [//meta.wikimedia.org/wiki/Help:Contents žinyne].
@@ -12275,7 +12705,7 @@ $messages['lv'] = array(
== Pirmie soļi ==
* [//www.mediawiki.org/wiki/Manual:Configuration_settings KonfigurÄcijas iespÄ“ju saraksts]
* [//www.mediawiki.org/wiki/Manual:FAQ MediaWiki J&A]
-* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce ParakstÄ«ties uz paziņojumiem par jaunÄm MediaWiki versijÄm]',
+* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce ParakstÄ«ties uz paziņojumiem par jaunÄm MediaWiki versijÄm]', # Fuzzy
);
/** Literary Chinese (文言)
@@ -12288,7 +12718,7 @@ $messages['lzh'] = array(
* [//www.mediawiki.org/wiki/Manual:Configuration_settings Configuration settings list]
* [//www.mediawiki.org/wiki/Manual:FAQ MediaWiki FAQ]
-* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce MediaWiki release mailing list]",
+* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce MediaWiki release mailing list]", # Fuzzy
);
/** Lazuri (Lazuri)
@@ -12301,7 +12731,7 @@ $messages['lzz'] = array(
== Ağani na gyoç’k’u maxmarepe ==
* [//www.mediawiki.org/wiki/Manual:Configuration_settings Ok'iduÅŸi ayarepeÅŸi liste]
* [//www.mediawiki.org/wiki/Manual:FAQ MediaWiki P'anda Na-k'itxu K'itxalape]
-* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce MediaWiki e-mailepeÅŸiÅŸ liste]",
+* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce MediaWiki e-mailepeÅŸiÅŸ liste]", # Fuzzy
);
/** Maithili (मैथिली)
@@ -12314,7 +12744,7 @@ $messages['mai'] = array(
==पà¥à¤°à¤¾à¤°à¤®à¥à¤­ कोना करी==
* [//www.mediawiki.org/wiki/Manual:Configuration_settings Configuration settings list]
* [//www.mediawiki.org/wiki/Manual:FAQ MediaWiki FAQ]
-* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce MediaWiki release mailing list]",
+* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce MediaWiki release mailing list]", # Fuzzy
);
/** Moksha (мокшень)
@@ -12327,7 +12757,7 @@ $messages['mdf'] = array(
* [//www.mediawiki.org/wiki/Manual:Configuration_settings ВаÑьфневи арафнематнень кÑрькÑÑÑŒ]
* [//www.mediawiki.org/wiki/Manual:FAQ МедиаВикить СидеÑта Кеподеви КизефкÑне]
-* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce МедиаВикить од верзиÑтнень колга кулÑнь пачфтема]',
+* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce МедиаВикить од верзиÑтнень колга кулÑнь пачфтема]', # Fuzzy
);
/** Malagasy (Malagasy)
@@ -12361,7 +12791,7 @@ $messages['mg'] = array(
'config-admin-name' => 'Ny anaranao :',
'config-admin-password' => 'Tenimiafina :',
'config-admin-email' => 'Adiresy imailaka :',
- 'config-profile-wiki' => 'Wiki tsotra',
+ 'config-profile-wiki' => 'Wiki tsotra', # Fuzzy
'config-profile-no-anon' => 'Mila mamorona kaonty',
'config-profile-fishbowl' => 'Mpanova mahazo alalana ihany',
'config-profile-private' => 'Wiki tsy sarababem-bahoaka',
@@ -12385,7 +12815,7 @@ $messages['mg'] = array(
* [//www.mediawiki.org/wiki/Manual:Configuration_settings Lisitra ny paramètre de configuration]
* [//www.mediawiki.org/wiki/Manual:FAQ/fr FAQ momba ny MediaWiki]
-* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce Resaka momba ny fizaràn'ny MediaWiki]",
+* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce Resaka momba ny fizaràn'ny MediaWiki]", # Fuzzy
);
/** Eastern Mari (олык марий)
@@ -12395,17 +12825,18 @@ $messages['mhr'] = array(
);
/** Minangkabau (Baso Minangkabau)
+ * @author Iwan Novirion
* @author Luthfi94
*/
$messages['min'] = array(
'mainpagetext' => "'''MediaWiki alah tapasang jo sukses'''.",
- 'mainpagedocfooter' => 'Silakan baco [//www.mediawiki.org/wiki/Help:Contents/id Panduan Pangguno] untuak caro panggunoan parangkaik lunak wiki iko.
+ 'mainpagedocfooter' => 'Konsultasian [//meta.wikimedia.org/wiki/Help:Contents/min Panduan Panggunoan] untuak informasi caro panggunoan parangkaik lunak wiki.
== Mamulai panggunoan ==
-
-* [//www.mediawiki.org/wiki/Manual:Configuration_settings/id Dafta pangaturan konfigurasi]
-* [//www.mediawiki.org/wiki/Manual:FAQ/id Dafta patanyoan nan acok diajukan manganai MediaWiki]
-* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce Milis rilis MediaWiki]',
+* [//www.mediawiki.org/wiki/Manual:Configuration_settings/id Daftar pangaturan konfigurasi]
+* [//www.mediawiki.org/wiki/Manual:FAQ/id Daftar patanyoan nan acok diajukan manganai MediaWiki]
+* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce Milis rilis MediaWiki]
+* [//www.mediawiki.org/wiki/Localisation#Translation_resources Palokalan MediaWiki untuak bahaso Sanak]',
);
/** Macedonian (македонÑки)
@@ -12463,9 +12894,8 @@ $1',
'config-page-existingwiki' => 'ПоÑтоечко вики',
'config-help-restart' => 'Дали Ñакате да ги иÑчиÑтите Ñите зачувани податоци што ги внеÑовте и да ја започнете инÑталацијата одново?',
'config-restart' => 'Да, почни одново',
- 'config-welcome' => '=== Environmental checks ===
-Се вршат оÑновни проверки за да Ñе воÑтанови дали околината е погодна за инÑталирање на МедијаВики.
-Ðко ви затреба помош при инÑталацијата, ќе треба да ги наведете резултатите од овие проверки.',
+ 'config-welcome' => '=== Проверки на околината ===
+Сега ќе Ñе извршиме оÑновни проверки за да Ñе воÑтанови дали околината е погодна за инÑталирање на МедијаВики. Ðе заборавајте да ги приложите овие информации ако барате помош Ñо довршување на инÑталацијата.',
'config-copyright' => "=== ÐвторÑки права и уÑлови ===
$1
@@ -12536,6 +12966,10 @@ $1
Ова е веројатно премалку.
ИнÑталацијата може да не уÑпее!",
'config-ctype' => "'''Фатална грешка''': PHP мора да Ñе ÑоÑтави Ñо поддршка за [http://www.php.net/manual/en/ctype.installation.php додатокот Ctype].",
+ 'config-json' => "'''Кобно:''' PHP беше Ñрочен без поддршка од JSON.
+Ќе мора да го инÑталирате додатокот за JSON во PHP, или додатокот [http://pecl.php.net/package/jsonc PECL jsonc] пред да го инÑталирате МедијаВики.
+* Додатокот за PHP е вклучен во верзиите 5 и 6 на Linux (од Red Hat Enterprise) (CentOS), но мора да Ñе активира во <code>/etc/php.ini</code> или <code>/etc/php.d/json.ini</code>.
+* Ðекои варијанти на Linux излезени по мај 2013 г. не го Ñодржат додатокот за PHP, туку го пакуваат додатокот PECL како <code>php5-json</code> или <code>php-pecl-jsonc</code>.",
'config-xcache' => '[http://xcache.lighttpd.net/ XCache] е инÑталиран',
'config-apc' => '[http://www.php.net/apc APC] е инÑталиран',
'config-wincache' => '[http://www.iis.net/download/WinCacheForPhp WinCache] е инÑталиран',
@@ -12544,6 +12978,8 @@ $1
'config-mod-security' => "'''Предупредување''': на вашиот опÑлужувач има овозможено [http://modsecurity.org/ mod_security]. Ðко не е поÑтавено како што треба, ова може да предизвика проблеми кај МедијаВики и други програми што им овозможуваат на кориÑниците да објавуваат произволни Ñодржини.
Погледнете ја [http://modsecurity.org/documentation/ mod_security документацијата] или обратете Ñе кај домаќинот ако наидете на Ñлучајни грешки.",
'config-diff3-bad' => 'GNU diff3 не е пронајден.',
+ 'config-git' => 'Го пронајдов Git програмот за контрола на верзии: <code>$1</code>.',
+ 'config-git-bad' => 'Ðе го пронајдов Git-програмот за контрола на верзии.',
'config-imagemagick' => 'Пронајден е ImageMagick: <code>$1</code>.
Ðко овозможите подигање, тогаш ќе биде овозможена минијатуризација на Ñликите.',
'config-gd' => 'Утврдив дека има вградена GD графичка библиотека.
@@ -12637,7 +13073,6 @@ $1
'config-type-postgres' => 'PostgreSQL',
'config-type-sqlite' => 'SQLite',
'config-type-oracle' => 'Oracle',
- 'config-type-ibm_db2' => 'IBM DB2',
'config-support-info' => 'МедијаВики ги поддржува Ñледниве ÑиÑтеми на бази на податоци:
$1
@@ -12647,18 +13082,16 @@ $1
'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-support-ibm_db2' => '* $1 е комерцијална база на податоциза фирми. ([http://www.php.net/manual/en/ibm-db2.installation.php Како да ÑоÑтавите PHP Ñо поддршка за IBM DB2])',
'config-header-mysql' => 'Ðагодувања на MySQL',
'config-header-postgres' => 'Ðагодувања на PostgreSQL',
'config-header-sqlite' => 'Ðагодувања на SQLite',
'config-header-oracle' => 'Ðагодувања на Oracle',
- 'config-header-ibm_db2' => 'Ðагодувања на IBM DB2',
'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-server-oracle' => 'Ðеважечки TNS „$1“.
+КориÑтете или „TNS Name“ или низата „Easy Connect“ ([http://docs.oracle.com/cd/E11882_01/network.112/e10836/naming.htm Методи на именување за Oracle])',
'config-invalid-db-name' => 'Ðеважечко име на базата „$1“.
КориÑтете Ñамо ASCII-букви (a-z, A-Z), бројки (0-9), долни црти (_) и цртички (-).',
'config-invalid-db-prefix' => 'Ðеважечки Ð¿Ñ€ÐµÑ„Ð¸ÐºÑ Ð·Ð° базата „$1“.
@@ -12714,7 +13147,7 @@ chmod a+w $3</pre>',
'config-upgrade-done-no-regenerate' => 'Ðадградбата заврши.
Сега можете да [$1 почнете да го кориÑтите викито].',
- 'config-regenerate' => 'ПреÑоздај <code>LocalSettings.php</code> →',
+ 'config-regenerate' => 'ПреÑоздај LocalSettings.php →',
'config-show-table-status' => 'Барањето <code>SHOW TABLE STATUS</code> не уÑпеа!',
'config-unknown-collation' => "'''Предупредување:''' Базата кориÑни непрепознаена упатна Ñпоредба.",
'config-db-web-account' => 'Сметка на базата за мрежен приÑтап',
@@ -12733,6 +13166,11 @@ chmod a+w $3</pre>',
Ðко вашата инÑталација на MySQL поддржува InnoDB, тогаш Ñериозно препорачуваме да го кориÑтите него намеÑто MyISAM.
Ðко вашата инÑталација на MySQL не поддржува InnoDB, веројатно дошло време за надградба.",
+ 'config-mysql-only-myisam-dep' => "'''Предупредување:''' MyISAM е единÑтвениот доÑтапен Ñкладишен погон за MySQL, што не Ñе препорачува за употреба Ñо МедијаВики, бидејќи:
+* речиÑи не поддржува иÑтовремено извршување на задачите поради заклучувањето на табелите
+* поподложен е на раÑипувања од другите погони
+* кодната база на МедијаВИки не Ñекогаш работи иÑправно Ñо MyISAM
+Вашата инÑталација на MySQL не поддржува InnoDB. Можеби е време да ја надградите.",
'config-mysql-engine-help' => "'''InnoDB''' речиÑи Ñекогаш е најдобар избор, бидејќи има добра поддршка за едновременоÑÑ‚.
'''MyISAM''' може да е побрз кај инÑталациите наменети за Ñамо еден кориÑник или незапиÑни инÑталации (Ñамо читање).
@@ -12744,7 +13182,6 @@ chmod a+w $3</pre>',
Ова е поефикаÑно отколку TF-8 режимот на MySQL, и ви овозможува да ја кориÑтите целата палета на уникодни знаци.
Во '''UTF-8 режим''', MySQL ќе знае на кој збир знаци припаѓаат вашите податоци, и може Ñоодветно да ги претÑтави и претвори, но нема да ви дозволи да Ñкладиратезнаци над [//en.wikipedia.org/wiki/Mapping_of_Unicode_character_planes ОÑновната повеќејазична рамнина].",
- 'config-ibm_db2-low-db-pagesize' => "Вашата база на податоци DB2 има оÑновно-зададен табеларен проÑтор Ñо недоволна големина на Ñтраниците. Таа треба да изнеÑува барем '''32 килобајти'''.",
'config-site-name' => 'Име на викито:',
'config-site-name-help' => 'Ова ќе Ñе појавува во заглавната лента на прелиÑтувачот и на разни други меÑта.',
'config-site-name-blank' => 'ВнеÑете име на мрежното меÑто.',
@@ -12754,8 +13191,8 @@ chmod a+w $3</pre>',
'config-ns-other' => 'Друго (наведете)',
'config-ns-other-default' => 'МоеВики',
'config-project-namespace-help' => "По примерот на Википедија, многу викија ги чуваат Ñтраниците Ñо правила на поÑебно меÑто од Ñамите Ñодржини, Ñ‚.е. во „'''проектен именÑки проÑтор'''“.
-Сите наÑлови на Ñтраниците во овој именÑки проÑтор почнуваат Ñо извеÑен префикÑ, којшто можете да го укажете тука.
-По традиција префикÑот произлегува од името на викито, но не Ñмее да Ñодржи интерпункциÑки знаци како „#“ или „:“.",
+Сите наÑлови на Ñтраниците во овој именÑки проÑтор почнуваат Ñо извеÑна претÑтавка, којшто можете да го укажете тука.
+По традиција претÑтавката произлегува од името на викито, но не Ñмее да Ñодржи интерпункциÑки знаци како „#“ или „:“.",
'config-ns-invalid' => 'Ðазначениот именÑки проÑтор „<nowiki>$1</nowiki>“ е неважечки.
Ðазначете друг проектен именÑки проÑтор.',
'config-ns-conflict' => 'Ðаведениот именÑки проÑтор „<nowiki>$1</nowiki>“ Ñе коÑи Ñо оÑновниот именÑки проÑтор на МедијаВики.
@@ -12851,8 +13288,9 @@ chmod a+w $3</pre>',
'config-upload-deleted-help' => 'Одберете во која папка да Ñе архивираат избришаните податотеки.
Ðајдобро би било ако таа не е доÑтапна преку интернет.',
'config-logo' => 'URL за логото:',
- 'config-logo-help' => 'Матичното руво на МедијаВики има проÑтор за лого од 135 x 160 пикÑели над Ñтраничната лента.
-Подигнете Ñлика Ñо Ñоодветна големина, и тука внеÑете ја URL-адреÑата.
+ 'config-logo-help' => 'Матичното руво на МедијаВики има проÑтор за лого од 135x160 пикÑели над Ñтраничната лента.
+
+Можете да употребите <code>$wgStylePath</code> или <code>$wgScriptPath</code> ако вашето лого е релативно на тие патеки.
Ðко не Ñакате да имате лого, тогаш оÑтавете го ова поле празно.',
'config-instantcommons' => 'Овозможи Instant Commons',
@@ -12947,6 +13385,9 @@ $3
'config-download-localsettings' => 'Преземи го <code>LocalSettings.php</code>',
'config-help' => 'помош',
'config-nofile' => 'Податотеката „$1“ не е пронајдена. Да не е избришана?',
+ 'config-extension-link' => 'Дали Ñте знаеле дека вашето вики поддржува [//www.mediawiki.org/wiki/Manual:Extensions додатоци]?
+
+Можете да ги прелиÑтате [//www.mediawiki.org/wiki/Category:Extensions_by_category по категории] или да ја поÑетите [//www.mediawiki.org/wiki/Extension_Matrix матрицата], каде ќе најдете полн ÑпиÑок на додатоци.',
'mainpagetext' => "'''МедијаВики е уÑпешно инÑталиран.'''",
'mainpagedocfooter' => 'Погледнете го [//meta.wikimedia.org/wiki/Help:Contents УпатÑтвото за кориÑници] за подетални иформации како Ñе кориÑти вики-програмот.
@@ -13024,7 +13465,7 @@ $1
'config-connection-error' => '$1.
താഴെ നൽകിയിരികàµà´•àµà´¨àµà´¨ ഹോസàµà´±àµà´±àµ, ഉപയോകàµà´¤àµƒà´¨à´¾à´®à´‚, രഹസàµà´¯à´µà´¾à´•àµà´•àµ à´Žà´¨àµà´¨à´¿à´µ പരിശോധിചàµà´šàµ വീണàµà´Ÿàµà´‚ à´¶àµà´°à´®à´¿à´•àµà´•àµà´•.',
- 'config-regenerate' => '<code>LocalSettings.php</code> à´ªàµà´¨à´ƒà´¸àµƒà´·àµà´Ÿà´¿à´•àµà´•àµà´• →',
+ 'config-regenerate' => 'LocalSettings.php à´ªàµà´¨à´ƒà´¸àµƒà´·àµà´Ÿà´¿à´•àµà´•àµà´• →',
'config-mysql-engine' => 'à´¸àµà´±àµà´±àµ‹à´±àµ‡à´œàµ എൻജിൻ:',
'config-site-name' => 'വികàµà´•à´¿à´¯àµà´Ÿàµ† പേരàµ:',
'config-site-name-help' => 'ഇതൠബàµà´°àµ—സറിനàµà´±àµ† ടൈറàµà´±à´¿àµ½ ബാറിലàµà´‚ മറàµà´±à´¨àµ‡à´•à´‚ ഇടങàµà´™à´³à´¿à´²àµà´‚ à´ªàµà´°à´¦àµ¼à´¶à´¿à´ªàµà´ªà´¿à´•àµà´•à´ªàµà´ªàµ†à´Ÿàµà´‚.',
@@ -13124,7 +13565,7 @@ $messages['mn'] = array(
== ЭхлÑÑ… ==
* [//www.mediawiki.org/wiki/Manual:Configuration_settings Тохиргоо]
* [//www.mediawiki.org/wiki/Manual:FAQ МедиаВикигийн тогтмол тавигддаг аÑуултууд]
-* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce МедиаВикигийн мÑдÑÑний мÑйл Ñвуулах жагÑаалт]',
+* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce МедиаВикигийн мÑдÑÑний мÑйл Ñвуулах жагÑаалт]', # Fuzzy
);
/** Marathi (मराठी)
@@ -13137,7 +13578,7 @@ $messages['mr'] = array(
* [//www.mediawiki.org/wiki/Manual:Configuration_settings कॉनà¥à¤«à¤¿à¤—रेशन सेटींगची यादी]
* [//www.mediawiki.org/wiki/Manual:FAQ मीडियाविकी नेहमी विचारले जाणारे पà¥à¤°à¤¶à¥à¤¨]
-* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce मीडियाविकि मेलिंग लिसà¥à¤Ÿ]',
+* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce मीडियाविकि मेलिंग लिसà¥à¤Ÿ]', # Fuzzy
);
/** Malay (Bahasa Melayu)
@@ -13151,7 +13592,7 @@ $messages['ms'] = array(
'config-localsettings-key' => 'Kunci naik taraf:',
'config-localsettings-badkey' => 'Kunci yang anda berikan tidak betul.',
'config-session-error' => 'Ralat ketika memulakan sesi: $1',
- 'config-your-language' => 'Bahasa kamu:',
+ 'config-your-language' => 'Bahasa anda:',
'config-your-language-help' => 'Pilihkan bahasa untuk digunakan dalam proses pemasangan ini.',
'config-wiki-language' => 'Bahasa wiki:',
'config-wiki-language-help' => 'Pilih bahasa utama wiki yang bakal dicipta ini.',
@@ -13178,12 +13619,10 @@ Bagaimanapun, MediaWiki memerlukan PHP $2 ke atas.',
'config-unicode-using-utf8' => 'utf8_normalize.so oleh Brion Vibber digunakan untuk penormalan Unicode.',
'config-unicode-using-intl' => '[http://pecl.php.net/intl Sambungan intl PECL] digunakan untuk penormalan Unicode.',
'config-db-charset' => 'Peranggu aksara pangkalan data',
- 'config-type-ibm_db2' => 'IBM DB2',
'config-header-mysql' => 'Keutamaan MySQL',
'config-header-postgres' => 'Keutamaan PostgreSQL',
'config-header-sqlite' => 'Keutamaan SQLite',
'config-header-oracle' => 'Keutamaan Oracle',
- 'config-header-ibm_db2' => 'Keutamaan IBM DB2',
'config-invalid-db-type' => 'Jenis pangkalan data tidak sah',
'config-db-web-account-same' => 'Gunakan akaun yang sama seperti dalam pemasangan',
'config-db-web-create' => 'Ciptakan akaun jika belum wujud',
@@ -13225,11 +13664,12 @@ Bagaimanapun, MediaWiki memerlukan PHP $2 ke atas.',
'mainpagetext' => "'''MediaWiki telah berjaya dipasang.'''",
'mainpagedocfooter' => 'Sila rujuk [//meta.wikimedia.org/wiki/Help:Contents Panduan Penggunaan] untuk maklumat mengenai penggunaan perisian wiki ini.
-== Untuk bermula ==
+== Permulaan ==
* [//www.mediawiki.org/wiki/Manual:Configuration_settings Senarai tetapan konfigurasi]
* [//www.mediawiki.org/wiki/Manual:FAQ Soalan Lazim MediaWiki]
-* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce Senarai mel bagi keluaran MediaWiki]', # Fuzzy
+* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce Senarai surat keluaran MediaWiki]
+* [//www.mediawiki.org/wiki/Localisation#Translation_resources Terjemahkan MediaWiki ke dalam bahasa anda]',
);
/** Maltese (Malti)
@@ -13376,10 +13816,10 @@ $messages['nan'] = array(
== 入門 ==
* [//www.mediawiki.org/wiki/Manual:Configuration_settings é…置的設定]
* [//www.mediawiki.org/wiki/Manual:FAQ MediaWiki時常å•ç­”]
-* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce MediaWiki的公布列單]',
+* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce MediaWiki的公布列單]', # Fuzzy
);
-/** Norwegian Bokmål (norsk (bokmål)‎)
+/** Norwegian Bokmål (norsk bokmål)
* @author Event
* @author Nghtwlkr
* @author ì•„ë¼
@@ -13610,7 +14050,6 @@ Vurder å plassere databasen et helt annet sted, for eksempel i <code>/var/lib/m
'config-type-postgres' => 'PostgreSQL',
'config-type-sqlite' => 'SQLite',
'config-type-oracle' => 'Oracle',
- 'config-type-ibm_db2' => 'IBM DB2',
'config-support-info' => 'MediaWiki støtter følgende databasesystem:
$1
@@ -13620,12 +14059,10 @@ Hvis du ikke ser databasesystemet du prøver å bruke i listen nedenfor, følg i
'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]). Det kan være noen små utestående feil og det anbefales ikke for bruk i et produksjonsmiljø.',
'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-support-ibm_db2' => '* $1 er en kommersiell bedriftsdatabase.', # Fuzzy
'config-header-mysql' => 'MySQL-innstillinger',
'config-header-postgres' => 'PostgreSQL-innstillinger',
'config-header-sqlite' => 'SQLite-innstillinger',
'config-header-oracle' => 'Oracle-innstillinger',
- 'config-header-ibm_db2' => 'IBM DB2-innstillinger',
'config-invalid-db-type' => 'Ugyldig databasetype',
'config-missing-db-name' => 'Du må skrive inn en verdi for «Databasenavn»',
'config-missing-db-host' => 'Du må skrive inn en verdi for «Databasevert»',
@@ -13687,7 +14124,7 @@ Dette er '''ikke anbefalt''' med mindre du har problemer med wikien din.",
'config-upgrade-done-no-regenerate' => 'Oppgradering fullført.
Du kan nå [$1 begynne å bruke wikien din].',
- 'config-regenerate' => 'Regenerer <code>LocalSettings.php</code> →',
+ 'config-regenerate' => 'Regenerer LocalSettings.php →',
'config-show-table-status' => '<code>SHOW TABLE STATUS</code> etterspørselen mislyktes!',
'config-unknown-collation' => "'''Advarsel:''' Databasen bruker en ukjent sortering.",
'config-db-web-account' => 'Databasekonto for nettilgang',
@@ -13711,7 +14148,6 @@ Dette er mer effektivt enn MySQLs UTF-8 modus og tillater deg å bruke hele spek
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 «[//en.wikipedia.org/wiki/Mapping_of_Unicode_character_planes the Basic Multilingual Plane]».",
- 'config-ibm_db2-low-db-pagesize' => "DB2-databasen din har et standard tabellområde med en utilstrekkelig pagesize. Pagesize må være '''32K''' eller større.",
'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.',
@@ -13842,14 +14278,20 @@ For mer informasjon om denne funksjonen, inklusive instruksjoner om hvordan man
);
/** Low German (Plattdüütsch)
+ * @author Joachim Mos
*/
$messages['nds'] = array(
+ 'config-page-name' => 'Naam',
+ 'config-ns-generic' => 'Projekt',
+ 'config-admin-name' => 'Dien Naam:',
+ 'config-admin-password' => 'Passwoord:',
+ 'config-help' => 'Hülp',
'mainpagetext' => "'''De MediaWiki-Software is mit Spood installeert worrn.'''",
'mainpagedocfooter' => 'Kiek de [//meta.wikimedia.org/wiki/MediaWiki_localisation Dokumentatschoon för dat Anpassen vun de Brukerböversiet]
-un dat [//meta.wikimedia.org/wiki/MediaWiki_User%27s_Guide Brukerhandbook] för Hülp to de Bruuk un Konfiguratschoon.',
+un dat [//meta.wikimedia.org/wiki/MediaWiki_User%27s_Guide Brukerhandbook] för Hülp to de Bruuk un Konfiguratschoon.', # Fuzzy
);
-/** Nedersaksisch (Nedersaksisch)
+/** Low Saxon (Netherlands) (Nedersaksies)
* @author Servien
*/
$messages['nds-nl'] = array(
@@ -13859,7 +14301,8 @@ $messages['nds-nl'] = array(
== Meer hulpe ==
* [//www.mediawiki.org/wiki/Help:Configuration_settings Lieste mit instellingen]
* [//www.mediawiki.org/wiki/Help:FAQ MediaWiki-vragen die vake esteld wörden]
-* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce MediaWiki-postlieste veur nieje versies]',
+* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce MediaWiki-postlieste veur nieje versies]
+* [//www.mediawiki.org/wiki/Localisation#Translation_resources Maak MediaWiki beschikbaor in joew taal]',
);
/** Nepali (नेपाली)
@@ -13873,7 +14316,7 @@ $messages['ne'] = array(
== सà¥à¤°à¥‚ गरà¥à¤¨à¤•à¥‹ लागि ==
* [//www.mediawiki.org/wiki/Manual:Configuration_settings विनà¥à¤¯à¤¾à¤¸ सेटिङà¥à¤— सूची]
* [//www.mediawiki.org/wiki/Manual:FAQ मेडियाविकि सामानà¥à¤¯ पà¥à¤°à¤¶à¥à¤¨à¤•à¤¾ उतà¥à¤¤à¤°à¤¹à¤°à¥]
-* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce मेडियाविकि सà¥à¤šà¤¨à¤¾ मेलिङà¥à¤— सूची]',
+* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce मेडियाविकि सà¥à¤šà¤¨à¤¾ मेलिङà¥à¤— सूची]', # Fuzzy
);
/** Dutch (Nederlands)
@@ -14018,6 +14461,8 @@ Het cachen van objecten is niet ingeschakeld.",
'config-mod-security' => "'''Waarschuwing:''' uw webserver heeft de module [http://modsecurity.org/ mod_security] ingeschakeld. Als deze onjuist is ingesteld, kan dit problemen geven in combinatie met MediaWiki of andere software die gebruikers in staat stelt willekeurige inhoud te posten.
Lees de [http://modsecurity.org/documentation/ documentatie over mod_security] of neem contact op met de helpdesk van uw provider als u tegen problemen aanloopt.",
'config-diff3-bad' => 'GNU diff3 niet aangetroffen.',
+ 'config-git' => 'Versiecontrolesoftware git is aangetroffen: <code>$1</code>',
+ 'config-git-bad' => 'Geen git versiecontrolesoftware 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.
@@ -14115,7 +14560,6 @@ Overweeg om de database op een totaal andere plaats neer te zetten, bijvoorbeeld
'config-type-postgres' => 'PostgreSQL',
'config-type-sqlite' => 'SQLite',
'config-type-oracle' => 'Oracle',
- 'config-type-ibm_db2' => 'IBM DB2',
'config-support-info' => 'MediaWiki ondersteunt de volgende databasesystemen:
$1
@@ -14125,18 +14569,16 @@ Als u het databasesysteem dat u wilt gebruiken niet in de lijst terugvindt, volg
'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]). Het is mogelijk dat er een aantal bekende problemen zijn met MediaWiki in combinatie met deze database en daarom wordt PostgreSQL niet aanbevolen voor een productieomgeving.',
'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-support-ibm_db2' => '* $1 is een commerciële enterprisedatabase. ([http://www.php.net/manual/en/ibm-db2.installation.php Hoe PHP compolieren met ondersteuning voor IBM DB2])',
'config-header-mysql' => 'MySQL-instellingen',
'config-header-postgres' => 'PostgreSQL-instellingen',
'config-header-sqlite' => 'SQLite-instellingen',
'config-header-oracle' => 'Oracle-instellingen',
- 'config-header-ibm_db2' => 'Instellingen voor IBM DB2',
'config-invalid-db-type' => 'Ongeldig databasetype',
- 'config-missing-db-name' => 'U moet een waarde ingeven voor "Databasenaam"',
+ 'config-missing-db-name' => 'U moet een waarde opgeven 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-missing-db-server-oracle' => 'U moet een waarde opgeven voor "Database-TNS"',
+ 'config-invalid-db-server-oracle' => 'Ongeldige database-TNS "$1".
+Gebruik "TNS Names" of een "Easy Connect" tekst ([http://docs.oracle.com/cd/E11882_01/network.112/e10836/naming.htm Oracle naamgevingsmethoden])',
'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".
@@ -14194,7 +14636,7 @@ Dit is '''niet aan te raden''' tenzij u problemen hebt met uw wiki.",
'config-upgrade-done-no-regenerate' => 'Het bijwerken is afgerond.
U kunt nu [$1 uw wiki gebruiken].',
- 'config-regenerate' => '<code>LocalSettings.php</code> opnieuw aanmaken →',
+ 'config-regenerate' => 'LocalSettings.php opnieuw aanmaken →',
'config-show-table-status' => 'Het uitvoeren van <code>SHOW TABLE STATUS</code> is mislukt!',
'config-unknown-collation' => "'''Waarschuwing:''' de database gebruikt een collatie die niet wordt herkend.",
'config-db-web-account' => 'Databasegebruiker voor webtoegang',
@@ -14213,6 +14655,12 @@ De gebruiker die u hier opgeeft moet al bestaan.',
Als uw installatie van MySQL InnoDB ondersteunt, gebruik dat dan vooral.
Als uw installatie van MySQL geen ondersteuning heeft voor InnoDB, denk dan na over upgraden.",
+ 'config-mysql-only-myisam-dep' => "'''Waarschuwing:''' MyISAM is enige beschikbare opslagmethode voor MySQL, en deze wordt niet aangeraden voor gebruik met MediaWiki, omdat:
+* er nauwelijks ondersteuning is voor meerdere gelijktijdige transacties omdat tabellen op slot gezet worden;
+* tabellen makkelijker stuk kunnen gaan;
+* de code van MediaWiki niet altijd op de juiste wijze omgaat met MyISAM.
+
+Uw installatie van MySQL heeft geen ondersteuning voor InnoDB. We raden u aan om een meer recente versie te gebruiken.",
'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.
@@ -14225,7 +14673,6 @@ Dit is efficiënter dan de UTF-8-modus van MySQL en stelt u in staat de volledig
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 \"[//nl.wikipedia.org/wiki/Lijst_van_Unicode-subbereiken#Basic_Multilingual_Plane Basic Multilingual Plane]\" te boven gaan.",
- 'config-ibm_db2-low-db-pagesize' => "Uw DB2-database heeft een standaard tablespace met een onvoldoende grote pagesize. De pagesize moet tenminste '''32K''' zijn.",
'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.',
@@ -14235,11 +14682,11 @@ Het is dat niet mogelijk tekens op te slaan die de \"[//nl.wikipedia.org/wiki/Li
'config-ns-other' => 'Andere (geef 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.
+Alle paginanamen in deze naamruimte beginnen met een bepaald voorvoegsel dat u hier kunt opgeven.
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.
+ 'config-ns-invalid' => 'De opgegeven 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.
+ 'config-ns-conflict' => 'De opgegeven 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:',
@@ -14335,6 +14782,8 @@ Idealiter is deze map niet via het web te benaderen.',
'config-logo-help' => 'Het standaarduiterlijk van MediaWiki bevat ruimte voor een logo van 135x160 pixels boven het menu.
Upload een afbeelding met de juiste afmetingen en voer de URL hier in.
+U kunt <code>$wgStylePath</code> of <code>$wgScriptPath</code> gebruiken als uw logo relatief is aan een van deze paden.
+
Als u geen logo wilt gebruiken, kunt u dit veld leeg laten.',
'config-instantcommons' => 'Instant Commons inschakelen',
'config-instantcommons-help' => '[//www.mediawiki.org/wiki/InstantCommons Instant Commons] is functie die het mogelijk maakt om afbeeldingen, geluidsbestanden en andere mediabestanden te gebruiken van de website [//commons.wikimedia.org/ Wikimedia Commons].
@@ -14344,7 +14793,7 @@ Meer informatie over deze functie en hoe deze in te stellen voor andere wiki\'s
'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 Commonslicentie die u wilt gebruiken en klik op "doorgaan".',
+ 'config-cc-not-chosen' => 'Kies de Creative Commonslicentie 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.
@@ -14369,7 +14818,7 @@ De standaardpoort is 11211.',
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.",
+Ga 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 "{{int:config-back}}".',
'config-install-step-done' => 'afgerond',
@@ -14431,6 +14880,8 @@ Na het plaatsen van het bestand met instellingen kunt u '''[$2 uw wiki betreden]
'config-download-localsettings' => '<code>LocalSettings.php</code> downloaden',
'config-help' => 'hulp',
'config-nofile' => 'Het bestand "$1" is niet gevonden. Is het verwijderd?',
+ 'config-extension-link' => 'Weet u dat u [//www.mediawiki.org/wiki/Manual:Extensions uitbreidingen] kunt gebruiken voor uw wiki?
+U kunt [//www.mediawiki.org/wiki/Category:Extensions_by_category uitbreidingen op categorie] bekijken of ga naar de [//www.mediawiki.org/wiki/Extension_Matrix Uitbreidingenmatrix] om de volledige lijst met uitbreidingen te bekijken.',
'mainpagetext' => "'''De installatie van MediaWiki is geslaagd.'''",
'mainpagedocfooter' => 'Raadpleeg de [//meta.wikimedia.org/wiki/NL_Help:Inhoudsopgave handleiding] voor informatie over het gebruik van de wikisoftware.
@@ -14564,9 +15015,9 @@ Overweeg om de database op een totaal andere plaats neer te zetten, bijvoorbeeld
$1
Als je het databasesysteem dat je wilt gebruiken niet in de lijst terugvindt, volg dan de handleiding waarnaar hierboven wordt verwezen om ondersteuning toe te voegen.',
- 'config-missing-db-name' => 'Je moet een waarde ingeven voor "Databasenaam"',
+ 'config-missing-db-name' => 'Je moet een waarde opgeven voor "Databasenaam"',
'config-missing-db-host' => 'Je moet een waarde invoeren voor "Databaseserver"',
- 'config-missing-db-server-oracle' => 'Je moet een waarde voor "Database-TNS" ingeven',
+ 'config-missing-db-server-oracle' => 'Je moet een waarde opgeven voor "Database-TNS"',
'config-postgres-old' => 'PostgreSQL $1 of hoger is vereist.
Jij gebruikt $2.',
'config-sqlite-name-help' => 'Kies een naam die je wiki identificeert.
@@ -14595,9 +15046,8 @@ Dit is efficiënter dan de UTF-8-modus van MySQL en stelt je in staat de volledi
In '''UTF-8-modus''' kent MySQL de tekenset van je gegevens en kan de databaseserver ze juist weergeven en converteren.
Het is dat niet mogelijk tekens op te slaan die de \"[//nl.wikipedia.org/wiki/Lijst_van_Unicode-subbereiken#Basic_Multilingual_Plane Basic Multilingual Plane]\" te boven gaan.",
- 'config-ibm_db2-low-db-pagesize' => "Je DB2-database heeft een standaard tablespace met een onvoldoende grote pagesize. De pagesize moet tenminste '''32K''' zijn.",
'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 je hier kunt aangeven.
+Alle paginanamen in deze naamruimte beginnen met een bepaald voorvoegsel dat je hier kunt opgeven.
Dit voorvoegsel wordt meestal afgeleid van de naam van de wiki, maar het kan geen bijzondere tekens bevatten als \"#\" of \":\".",
'config-admin-name' => 'Je naam:',
'config-admin-password-mismatch' => 'De twee door jou ingevoerde wachtwoorden komen niet overeen.',
@@ -14641,8 +15091,8 @@ Daarmee wordt deze functie ingeschakeld.",
'config-logo-help' => 'Het standaarduiterlijk van MediaWiki bevat ruimte voor een logo van 135x160 pixels boven het menu.
Upload een afbeelding met de juiste afmetingen en voer de URL hier in.
-Als je geen logo wilt gebruiken, kan je dit veld leeg laten.',
- 'config-cc-not-chosen' => 'Kies alsjeblieft de Creative Commonslicentie die je wilt gebruiken en klik op "doorgaan".',
+Als je geen logo wilt gebruiken, kan je dit veld leeg laten.', # Fuzzy
+ 'config-cc-not-chosen' => 'Kies de Creative Commonslicentie die je wilt gebruiken en klik op "doorgaan".',
'config-memcache-needservers' => 'Je hebt Memcached geselecteerd als je cache, maar je hebt geen servers opgegeven.',
'config-memcache-badip' => 'Je hebt een ongeldig IP-adres ingevoerd voor Memcached: $1.',
'config-memcache-noport' => 'Je hebt geen poort opgegeven voor de Memcachedserver: $1.
@@ -14651,7 +15101,7 @@ De standaardpoort is 11211.',
Mogelijk moet je aanvullende instellingen maken, maar je kunt deze uitbreidingen nu inschakelen.',
'config-install-alreadydone' => "'''Waarschuwing:''' het lijkt alsof je MediaWiki al hebt geïnstalleerd en probeert het programma opnieuw te installeren.
-Ga alsjeblieft door naar de volgende pagina.",
+Ga door naar de volgende pagina.",
'config-install-begin' => 'Als je nu op "{{int:config-continue}}" klikt, begint de installatie van MediaWiki.
Als je nog wijzigingen wilt maken, klik dan op "Terug".', # Fuzzy
'config-pg-no-plpgsql' => 'Je moet de taal PL/pgSQL installeren in de database $1',
@@ -14688,7 +15138,7 @@ Na het plaatsen van het bestand met instellingen kan je '''[$2 je wiki betreden]
* [//www.mediawiki.org/wiki/Localisation#Translation_resources Maak MediaWiki beschikbaar in jouw taal]',
);
-/** Norwegian Nynorsk (norsk (nynorsk)‎)
+/** Norwegian Nynorsk (norsk nynorsk)
* @author Harald Khan
* @author Nghtwlkr
*/
@@ -14735,7 +15185,7 @@ Berre bruk ASCII-bokstavar (a-z, A-Z), tal (0-9) og undestrekar (_).',
==Kome i gang==
* [//www.mediawiki.org/wiki/Manual:Configuration_settings Liste over oppsettsinnstillingar]
* [//www.mediawiki.org/wiki/Manual:FAQ Spørsmål og svar om MediaWiki]
-* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce E-postliste med informasjon om nye MediaWiki-versjonar]',
+* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce E-postliste med informasjon om nye MediaWiki-versjonar]', # Fuzzy
);
/** Norwegian (bokmål)‬ (‪norsk (bokmål)‬) */
@@ -14744,8 +15194,61 @@ $messages['no'] = array(
);
/** Occitan (occitan)
+ * @author Cedric31
*/
$messages['oc'] = array(
+ 'config-desc' => 'Lo programa d’installacion de MediaWiki',
+ 'config-title' => 'Installacion de MediaWiki $1',
+ 'config-information' => 'Informacions',
+ 'config-localsettings-key' => 'Clau de mesa a jorn :',
+ 'config-localsettings-badkey' => "La clau qu'avètz provesida es incorrècta",
+ 'config-session-error' => "Error al moment de l'aviada de la sesilha : $1",
+ 'config-your-language' => 'Vòstra lenga :',
+ 'config-wiki-language' => 'Lenga del wiki :',
+ 'config-back' => '↠Retorn',
+ 'config-continue' => 'Contunhar →',
+ 'config-page-language' => 'Lenga',
+ 'config-page-welcome' => 'Benvenguda sus MediaWiki !',
+ 'config-page-dbconnect' => 'Se connectar a la banca de donadas',
+ 'config-page-dbsettings' => 'Paramètres de la banca de donadas',
+ 'config-page-name' => 'Nom',
+ 'config-page-options' => 'Opcions',
+ 'config-page-install' => 'Installar',
+ 'config-page-complete' => 'Acabat !',
+ 'config-page-restart' => 'Reaviar l’installacion',
+ 'config-page-readme' => 'Legissètz-me',
+ 'config-page-releasenotes' => 'Nòtas de version',
+ 'config-page-copying' => 'Còpia',
+ 'config-page-upgradedoc' => 'Mesa a jorn',
+ 'config-page-existingwiki' => 'Wiki existent',
+ 'config-restart' => 'Ã’c, lo reaviar',
+ 'config-env-php' => 'PHP $1 es installat.',
+ 'config-db-host-oracle' => 'Nom TNS de la banca de donadas :',
+ 'config-db-wiki-settings' => 'Identificar aqueste wiki',
+ 'config-db-name' => 'Nom de la banca de donadas :',
+ 'config-db-name-oracle' => 'Esquèma de banca de donadas :',
+ 'config-db-install-account' => "Compte d'utilizaire per l'installacion",
+ 'config-db-username' => "Nom d'utilizaire de la banca de donadas :",
+ 'config-db-password' => 'Senhal de la banca de donadas :',
+ '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 retrocompatible UTF-8',
+ 'config-db-port' => 'Pòrt de la banca de donadas :',
+ 'config-db-schema' => 'Esquèma per MediaWiki',
+ '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-mysql-engine' => "Motor d'emmagazinatge :",
+ 'config-mysql-innodb' => 'InnoDB',
+ 'config-mysql-myisam' => 'MyISAM',
+ 'config-mysql-binary' => 'Binari',
+ 'config-mysql-utf8' => 'UTF-8',
+ 'config-site-name' => 'Nom del wiki :',
+ 'config-ns-generic' => 'Projècte',
+ 'config-ns-other-default' => 'MonWiki',
+ 'config-admin-name' => 'Vòstre nom :',
+ 'config-admin-password' => 'Senhal :',
'mainpagetext' => "'''MediaWiki es estat installat amb succès.'''",
'mainpagedocfooter' => "Consultatz lo [//meta.wikimedia.org/wiki/Ajuda:Contengut Guida de l'utilizaire] per mai d'entresenhas sus l'utilizacion d'aqueste logicial.
@@ -14753,10 +15256,10 @@ $messages['oc'] = array(
* [//www.mediawiki.org/wiki/Manual:Configuration_settings Lista dels paramètres de configuracion]
* [//www.mediawiki.org/wiki/Manual:FAQ/fr FAQ MediaWiki]
-* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce Lista de discussions de las parucions de MediaWiki]",
+* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce Lista de discussions de las parucions de MediaWiki]", # Fuzzy
);
-/** Oriya (ଓଡ଼ିଆ)
+/** Oriya (ଓଡ଼ିଆ)
* @author Jnanaranjan Sahu
*/
$messages['or'] = array(
@@ -14791,7 +15294,7 @@ $messages['pam'] = array(
== Pamagumpisa ==
* [//www.mediawiki.org/wiki/Manual:Configuration_settings Configuration settings list]
* [//www.mediawiki.org/wiki/Manual:FAQ MediaWiki FAQ]
-* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce MediaWiki release mailing list]",
+* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce MediaWiki release mailing list]", # Fuzzy
);
/** Picard (Picard)
@@ -14815,13 +15318,16 @@ $messages['pdc'] = array(
* [//www.mediawiki.org/wiki/Manual:Configuration_settings Lischt vun Gnepp zum Konfiguriere]
* [//www.mediawiki.org/wiki/Manual:FAQ MediaWiki-FAQ]
-* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce Eposchde-Lischt fer neie MediaWiki-Versione]",
+* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce Eposchde-Lischt fer neie MediaWiki-Versione]", # Fuzzy
);
/** Polish (polski)
* @author Beau
* @author BeginaFelicysym
+ * @author Chrumps
* @author Holek
+ * @author Matma Rex
+ * @author Michał Roszka
* @author Saper
* @author Sp5uhe
* @author Woytecr
@@ -14880,8 +15386,8 @@ Sprawdź plik php.ini i upewnij się, że <code>session.save_path</code> wskazuj
'config-help-restart' => 'Czy chcesz usunąć wszystkie zapisane dane 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.',
+Teraz zostaną wykonane 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
@@ -14958,8 +15464,10 @@ Instalacja może się nie udać!",
'config-mod-security' => "''' Ostrzeżenie ''': Serwer sieci web ma włączone [http://modsecurity.org/ mod_security]. Jeśli niepoprawnie skonfigurowane, może być przyczyną problemów MediaWiki lub innego oprogramowania, które pozwala użytkownikom na wysyłanie dowolnej zawartości.
Sprawdź w [http://modsecurity.org/documentation/ dokumentacji mod_security] lub skontaktuj się z obsługa hosta, jeśli wystąpią losowe błędy.",
'config-diff3-bad' => 'Nie znaleziono GNU diff3.',
+ 'config-git' => 'Znaleziono oprogramowanie kontroli wersji Git: <code>$1</code>.',
+ 'config-git-bad' => 'Oprogramowanie systemu kontroli wersji Git nie zostało znalezione.',
'config-imagemagick' => 'Mamy zainstalowany ImageMagick <code>$1</code>, dzięki czemu będzie można pomniejszać załadowane grafiki.',
- 'config-gd' => 'Mamy wbudowaną bibliotekę graficzną GD, dzięki ceymu będzie można pomniejszać załadowane grafiki.',
+ 'config-gd' => 'Mamy wbudowaną bibliotekę graficzną GD, dzięki czemu będzie można pomniejszać załadowane grafiki.',
'config-no-scaling' => 'Nie można odnaleźć biblioteki GD lub ImageMagick. Nie będzie działać pomniejszanie załadowane grafiki.',
'config-no-uri' => "'''Błąd.''' Nie można określić aktualnego URI.
Instalacja została przerwana.",
@@ -14976,7 +15484,8 @@ Instalacja została przerwana.',
'config-using531' => 'MediaWiki nie może być używane z PHP $1 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.
Instalacja została przerwana.',
- 'config-suhosin-max-value-length' => 'Jest zainstalowany Suhosin i ogranicza długość parametru GET do $1 bajtów. Komponent ResourceLoader w MediaWiki wykona obejście tego ograniczenia, ale kosztem wydajności. Jeśli to możliwe należy ustawić <code>suhosin.get.max_value_length</code> na 1024 lub wyższej w <code>php.ini</code> oraz ustawić <code>$wgResourceLoaderMaxQueryLength</code> w LocalSettings.php na tę samą wartość.', # Fuzzy
+ 'config-suhosin-max-value-length' => 'Jest zainstalowany Suhosin i ogranicza długość parametru GET <code>length</code> do $1 bajtów. Komponent ResourceLoader w MediaWiki wykona obejście tego ograniczenia, ale kosztem wydajności.
+Jeśli to możliwe, należy ustawić <code>suhosin.get.max_value_length</code> na 1024 lub wyżej w <code>php.ini</code> oraz ustawić <code>$wgResourceLoaderMaxQueryLength</code> w <code>LocalSettings.php</code> na tę samą wartość.',
'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.
@@ -15048,7 +15557,6 @@ Zawiera ona nieopracowane dane użytkownika (adresy e-mail, zahaszowane hasła)
Warto rozważyć umieszczenie w bazie danych zupełnie gdzie indziej, na przykład w <code>/var/lib/mediawiki/yourwiki</code> .",
'config-oracle-def-ts' => 'Domyślna przestrzeń tabel',
'config-oracle-temp-ts' => 'Przestrzeń tabel tymczasowych',
- 'config-type-ibm_db2' => 'IBM DB2',
'config-support-info' => 'MediaWiki może współpracować z następującymi systemami baz danych:
$1
@@ -15058,18 +15566,16 @@ Poniżej wyświetlone są systemy baz danych gotowe do użycia. Jeżeli poniżej
'config-support-postgres' => '* $1 jest popularnym systemem baz danych, często stosowanym zamiast MySQL ([http://www.php.net/manual/en/pgsql.installation.php Zobacz, jak skompilować PHP ze wsparciem dla PostgreSQL]). Z powodu możliwości wystąpienia drobnych błędów, nie jest zalecana do wymagających wdrożeń.',
'config-support-sqlite' => '* $1 jest niewielkim systemem bazy danych, z którym MediaWiki bardzo dobrze współpracuje. ([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-support-ibm_db2' => '* $1 jest komercyjnÄ… zaawansowanÄ… bazÄ… danych.', # Fuzzy
'config-header-mysql' => 'Ustawienia MySQL',
'config-header-postgres' => 'Ustawienia PostgreSQL',
'config-header-sqlite' => 'Ustawienia SQLite',
'config-header-oracle' => 'Ustawienia Oracle',
- 'config-header-ibm_db2' => 'ustawienia dla IBM DB2',
'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 „Nazwa instancji bazy danych (TNS)â€',
'config-invalid-db-server-oracle' => 'NieprawidÅ‚owa nazwa instancji bazy danych (TNS) „$1â€.
-W nazwie można użyć wyłącznie liter ASCII (a-z, A-Z), cyfr (0-9), podkreślenia (_) i kropek (.).',
+Użyj "TNS Name" lub "Easy Connect" ([http://docs.oracle.com/cd/E11882_01/network.112/e10836/naming.htm Oracle Naming Methods])',
'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â€.
@@ -15125,7 +15631,7 @@ Jest to '''nie zalecane''', chyba że występują problemy z twoją wiki.",
'config-upgrade-done-no-regenerate' => 'Aktualizacja zakończona.
Możesz wreszcie [$1 zacząć korzystać ze swojej wiki].',
- 'config-regenerate' => 'Ponowne generowanie <code>LocalSettings.php</code> →',
+ 'config-regenerate' => 'Ponowne generowanie LocalSettings.php →',
'config-show-table-status' => 'Zapytanie „<code>SHOW TABLE STATUS</code>†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',
@@ -15144,6 +15650,12 @@ Konto, które wskazałeś tutaj musi już istnieć.',
Jeśli instalacja MySQL obsługuje InnoDB, jest wysoce zalecane, by to je wybrać.
Jeśli instalacja MySQL nie obsługuje InnoDB, być może nadszedł czas na jej uaktualnienie.",
+ 'config-mysql-only-myisam-dep' => "'''Ostrzeżenie:''' MyISAM jest jedynym dostępnym mechanizmem składowania dla MySQL, który nie jest zalecany do używania z MediaWiki, ponieważ:
+* słabo obsługuje współbieżność z powodu blokowania tabel
+* jest bardziej skłonny do uszkodzeń niż inne silniki
+* kod MediaWiki nie zawsze traktuje MyISAM jak powinien
+
+Twoja instalacja MySQL nie obsługuje InnoDB, być może jest to czas na aktualizację.",
'config-mysql-engine-help' => "'''InnoDB''' jest prawie zawsze najlepszą opcją, ponieważ posiada dobrą obsługę współbieżności.
'''MyISAM''' może być szybsze w instalacjach pojedynczego użytkownika lub tylko do odczytu.
@@ -15155,7 +15667,6 @@ Bazy danych MyISAM mają tendencję do ulegania uszkodzeniom częściej niż baz
Jest on bardziej wydajny niż tryb UTF-8 w MySQL i pozwala na używanie znaków pełnego zakresu Unicode.
W '''trybie UTF-8''', MySQL będzie znać zestaw znaków w jakim zakodowano dane, można też przedstawić i przekonwertuj je odpowiednio, ale nie pozwoli Ci przechowywać znaków spoza [//en.wikipedia.org/wiki/Mapping_of_Unicode_character_planes podstawowej płaszczyzny wielojęzyczności].",
- 'config-ibm_db2-low-db-pagesize' => "Baza danych DB2 posiada domyślny obszar tabel z niewystarczającym rozmiarem strony. Wartość rozmiaru strony musi być równa lub powyżej '''32 K'''.",
'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.',
@@ -15188,7 +15699,7 @@ Podaj innÄ… nazwÄ™.',
'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' => 'Zapisz się na [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce listę pocztową z ogłoszeniami 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-subscribe-noemail' => 'Próbowano subskrybować listę mailingową ogłoszeń wersji bez podania adresu e-mail.
@@ -15198,22 +15709,22 @@ 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', # Fuzzy
+ 'config-profile-wiki' => 'Otwarte wiki',
'config-profile-no-anon' => 'Wymagane utworzenie konta',
'config-profile-fishbowl' => 'Wyłącznie zatwierdzeni edytorzy',
'config-profile-private' => 'Prywatna wiki',
'config-profile-help' => "Strony typu wiki działają najlepiej, gdy pozwolisz je edytować tak wielu osobom, jak to możliwie.
-W MediaWiki, jest łatwe sprawdzenie ostatnich zmian i wycofać szkody, które są spowodowane przez naiwnych lub złośliwych użytkowników.
+W MediaWiki, można łatwo sprawdzić ostatnie zmiany i wycofać szkody, które są spowodowane przez naiwnych lub złośliwych użytkowników.
-Jednakże wielu uznało MediaWiki użytecznymi w różnorodnych rolach, a czasami nie jest łatwo przekonać wszystkich do korzyści ze sposobu działania wiki.
+Jednakże wielu uznało MediaWiki użytecznym w różnorodnych rolach, a czasami nie jest łatwo przekonać wszystkich do korzyści ze sposobu działania wiki. Masz więc wybór.
-Ustawienie '''{{int:config-profil-wiki}}''' pozwala każdemu na edycję, nawet bez logowania się.
-Wiki z '''{{int:config-profile-no-anon}}''' zawiera dodatkowe funkcje rozliczania się, ale może powstrzymać dorywczych współpracowników.
+Ustawienie '''{{int:config-profile-wiki}}''' pozwala każdemu na edycję, nawet bez logowania się.
+Wiki z '''{{int:config-profile-no-anon}}''' zawiera dodatkowe możliwości ale może powstrzymywać potencjalnych edytorów.
Scenariusz '''{{int:config-profile-fishbowl}}''' umożliwia zatwierdzonym użytkownikom edycję, ale wyświetlanie stron jest powszechnie dostępne, włącznie z historią.
-Ustawienie '''{{int:config-profile-private}}'' ' pozwala na wyświetlanie stron tylko zatwierdzonym użytkownikom, ta sama grupa może edytować.
+Ustawienie '''{{int:config-profile-private}}'' ' pozwala na wyświetlanie stron tylko zatwierdzonym użytkownikom, ta sama grupa może je edytować.
-Bardziej skomplikowane konfiguracje uprawnień użytkowników są dostępne po zakończeniu instalacji, zobacz [//www.mediawiki.org/wiki/Manual:User_rights odpowiednią część podręcznika].", # Fuzzy
+Bardziej skomplikowane konfiguracje uprawnień użytkowników są dostępne po zakończeniu instalacji, zobacz [//www.mediawiki.org/wiki/Manual:User_rights odpowiednią część podręcznika].",
'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',
@@ -15264,6 +15775,8 @@ Najlepiej, aby nie był on dostępny z internetu.',
'config-logo-help' => 'Domyślny motyw MediaWiki zawiera miejsce na logo wielkości 135 x 160 pikseli powyżej menu na pasku bocznym.
Prześlij obrazek o odpowiednim rozmiarze, a następnie wpisz jego URL tutaj.
+Możesz użyć <code>$wgStylePath</code> lub <code>$wgScriptPath</code> jeżeli twoje logo jest relatywne do tych ścieżek.
+
Jeśli nie chcesz logo, pozostaw to pole puste.',
'config-instantcommons' => 'WÅ‚Ä…cz Instant Commons',
'config-instantcommons-help' => '[//www.mediawiki.org/wiki/InstantCommons Instant Commons] jest funkcją, która pozwala wiki używać obrazów, dźwięków i innych mediów znalezionych na witrynie [//commons.wikimedia.org/ Wikimedia Commons].
@@ -15297,8 +15810,8 @@ Jeśli nie znasz numeru portu, wartością domyślną jest 11211.',
Mogą one wymagać dodatkowych czynności konfiguracyjnych, ale można je teraz włączyć',
'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-begin' => 'Po naciśnięciu "{{int:config-continue}}", rozpocznie się instalacji MediaWiki.
-Jeśli nadal chcesz dokonać zmian, naciśnij wstecz.', # Fuzzy
+ 'config-install-begin' => 'Po naciśnięciu "{{int:config-continue}}", rozpocznie się instalacja MediaWiki.
+Jeśli nadal chcesz dokonać zmian, naciśnij "{{int:config-back}}".',
'config-install-step-done' => 'gotowe',
'config-install-step-failed' => 'nieudane',
'config-install-extensions' => 'WÅ‚Ä…cznie z rozszerzeniami',
@@ -15340,29 +15853,33 @@ Tworzenie domyślnej listy pominięto.",
'config-install-extension-tables' => 'Tworzenie tabel dla aktywnych rozszerzeń',
'config-install-mainpage-failed' => 'Nie udało się wstawić strony głównej – $1',
'config-install-done' => "'''Gratulacje!'''
-Udało ci się zainstalować MediaWiki.
+Udało Ci się zainstalować MediaWiki.
Instalator wygenerował plik konfiguracyjny <code>LocalSettings.php</code>.
-Musisz go pobrać i umieścić go w korzeniu twojej instalacji wiki (tym samym katalogu co index.php). Pobieranie powinno zacząć się automatycznie.
+Musisz go pobrać i umieścić w katalogu głównym Twojej instalacji wiki (tym samym katalogu co index.php). Pobieranie powinno zacząć się automatycznie.
-Jeżeli pobieranie nie zostało zaproponowane, lub jeśli użytkownik anulował je, można ponownie uruchomić pobranie klikając poniższe łącze:
+Jeżeli pobieranie nie zostało zaproponowane lub jeśli użytkownik je anulował, można ponownie uruchomić pobranie klikając poniższe łącze:
$3
-'''Uwaga''': Jeśli tego nie zrobisz tego teraz, wygenerowany plik konfiguracyjny nie będzie już dostępny po zakończeniu instalacji.
+'''Uwaga''': Jeśli nie zrobisz tego teraz, wygenerowany plik konfiguracyjny nie będzie już dostępny po zakończeniu instalacji.
-Po załadowaniu pliku konfiguracyjnego możesz '''[ $2 wejść na wiki]'''.",
+Po załadowaniu pliku konfiguracyjnego możesz '''[$2 wejść na wiki]'''.",
'config-download-localsettings' => 'Pobierz <code>LocalSettings.php</code>',
'config-help' => 'pomoc',
'config-nofile' => 'Nie udało się odnaleźć pliku "$1". Czy nie został usunięty?',
+ 'config-extension-link' => 'Czy wiesz, że twoja wiki obsługuje [//www.mediawiki.org/wiki/Manual:Extensions/pl rozszerzenia]?
+
+Możesz przejrzeć [//www.mediawiki.org/wiki/Category:Extensions_by_category rozszerzenia według kategorii] lub [//www.mediawiki.org/wiki/Extension_Matrix Extension Matrix] aby zobaczyć pełną listę rozszerzeń.',
'mainpagetext' => "'''Instalacja MediaWiki powiodła się.'''",
'mainpagedocfooter' => 'Zobacz [//meta.wikimedia.org/wiki/Help:Contents przewodnik użytkownika] w celu uzyskania informacji o działaniu oprogramowania wiki.
== Na poczÄ…tek ==
-* [//www.mediawiki.org/wiki/Manual:Configuration_settings Lista ustawień konfiguracyjnych]
-* [//www.mediawiki.org/wiki/Manual:FAQ MediaWiki FAQ]
-* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce Komunikaty o nowych wersjach MediaWiki]', # Fuzzy
+* [//www.mediawiki.org/wiki/Manual:Configuration_settings/pl Lista ustawień konfiguracyjnych]
+* [//www.mediawiki.org/wiki/Manual:FAQ/pl MediaWiki FAQ]
+* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce Komunikaty o nowych wersjach MediaWiki]
+* [//www.mediawiki.org/wiki/Localisation#Translation_resources Przetłumacz MediaWiki na swój język]',
);
/** Piedmontese (Piemontèis)
@@ -15592,7 +16109,6 @@ Lòn a comprend ij dat brut ëd l'utent (adrëssa ëd pòsta eletrònica, ciav t
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-type-ibm_db2' => 'IBM DB2',
'config-support-info' => "MediaWiki a manten ij sistema ëd base ëd dàit sì-dapress:
$1
@@ -15602,12 +16118,10 @@ S'a vëd pa listà sì-sota ël sistema ëd base ëd dàit ch'a preuva a dovré,
'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]). A peulo ess-ie chèich cit bigat, e a l'é nen arcomandà ëd dovrelo an n'ambient ëd produssion.",
'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-support-ibm_db2' => "* $1 a l'é na base ëd dàit d'asiendal comersial.", # Fuzzy
'config-header-mysql' => 'Ampostassion MySQL',
'config-header-postgres' => 'Ampostassion PostgreSQL',
'config-header-sqlite' => 'Ampostassion SQLite',
'config-header-oracle' => 'Ampostassion Oracle',
- 'config-header-ibm_db2' => "Ampostassion d'IBM DB2",
'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-host' => 'A dev buteje un valor për "l\'òspit ëd la base ëd dàit"',
@@ -15667,7 +16181,7 @@ Sòn a l'è '''pa arcomandà''' gavà ch'a rancontra dij problema con soa wiki."
'config-upgrade-done-no-regenerate' => 'Agiornament complet.
It peule adess [$1 ancaminé a dovré toa wiki].',
- 'config-regenerate' => 'Generé torna <code>LocalSettings.php</code> →',
+ 'config-regenerate' => 'Generé torna LocalSettings.php →',
'config-show-table-status' => 'Arcesta <code>SHOW TABLE STATUS</code> 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à",
@@ -15697,7 +16211,6 @@ La base ëd dàit MyISAM a tira a corompse pi 'd soens che la base ëd dàit Inn
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 [//en.wikipedia.org/wiki/Mapping_of_Unicode_character_planes pian multilenghìstich ëd base].",
- 'config-ibm_db2-low-db-pagesize' => "Soa base ëd dàit DB2 a l'ha në spassi d'ambaronament predefinì con na dimension ëd pàgina insuficent. La dimension ëd pàgina a dev esse '''32K''' o pi gròssa.",
'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.",
@@ -15740,18 +16253,18 @@ 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' => 'Deurb wiki',
+ 'config-profile-wiki' => 'Wiki duverta',
'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 MediaWiki, a l'é bel fé revisioné j'ùltime modìfiche, e buté andré qualsëssìa dann che a sia fàit da dj'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à.
Ël model '''{{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.
+Na wiki con '''{{int:config-profile-no-anon}}''' a dà pì 'd contròl, ma a peul slontané dij contributor ocasionaj.
Ë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é.
@@ -15806,7 +16319,7 @@ Idealment, sòn a dovrìa pa esse acessìbil an sl'aragnà.",
'config-logo-help' => "La pel dë stàndard ëd MediaWiki a comprend lë spassi për na marca ëd 135x160 pontin dzora la lista dla bara lateral.
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.",
+S'a veul gnun-e marche, ch'a lassa ës camp bianch.", # Fuzzy
'config-instantcommons' => 'Abìlita Instant Commons',
'config-instantcommons-help' => "[//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 [//commons.wikimedia.org/ Wikimedia Commons].
Për dovré sossì, MediaWiki a l'ha da manca dl'acess a la ragnà.
@@ -15839,8 +16352,8 @@ S'a conòsse nen la pòrta, cola predefinìa a l'é 11211.",
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-begin' => 'An sgnacand "{{int:config-continue}}", a anandiërà l\'istalassion ëd MediaWiki.
-S\'a veul anco\' fé dle modìfiche, ch\'a sgnaca su "{{int:config-back}}".',
+ 'config-install-begin' => "An sgnacand su «{{int:config-continue}}», a anandiërà l'istalassion ëd MediaWiki.
+S'a veul anco' fé dle modìfiche, ch'a sgnaca su «{{int:config-back}}».",
'config-install-step-done' => 'fàit',
'config-install-step-failed' => 'falì',
'config-install-extensions' => "Comprende j'estension",
@@ -15926,7 +16439,7 @@ $messages['prg'] = array(
== En pagaūseņu ==
* [//www.mediawiki.org/wiki/Manual:Configuration_settings Configuration settings list]
* [//www.mediawiki.org/wiki/Manual:FAQ MediaWiki FAQ]
-* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce MediaWiki release mailing list]',
+* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce MediaWiki release mailing list]', # Fuzzy
);
/** Pashto (پښتو)
@@ -15940,7 +16453,7 @@ $messages['ps'] = array(
'config-page-welcome' => 'Ù…Ûډياويکي ته ÚšÙ‡ راغلاست!',
'config-page-name' => 'نوم',
'config-page-options' => 'خوښنÛ',
- 'config-page-install' => 'لګول',
+ 'config-page-install' => 'لگول',
'config-page-complete' => 'بشپړ!',
'config-env-php' => 'د $1 PHP نصب شو.',
'config-db-type' => 'د توکبنسټ ډول:',
@@ -15953,20 +16466,19 @@ $messages['ps'] = array(
'config-header-postgres' => 'د PostgreSQL امستنÛ',
'config-header-sqlite' => 'د SQLite امستنÛ',
'config-header-oracle' => 'د اورÛÚ©Ù„ امستنÛ',
- 'config-header-ibm_db2' => 'د IBM DB2 امستنÛ',
'config-sqlite-readonly' => 'د <code>$1</code> دوتنه د ليکلو وړ نه ده.',
'config-sqlite-cant-create-db' => 'د توکبنسټ دوتنه <code>$1</code> جوړه نه شوه.',
'config-site-name' => 'د ويکي نوم:',
'config-site-name-blank' => 'د ÙˆÛبÚÙŠ نوم وليکÛ.',
'config-project-namespace' => 'د Ù¾Ø±ÙˆÚ˜Û Ù†ÙˆÙ…-تشيال:',
'config-ns-generic' => 'پروژه',
- 'config-admin-box' => 'د پازوال ګڼون',
+ 'config-admin-box' => 'د پازوال گڼون',
'config-admin-name' => 'Ø³ØªØ§Ø³Û Ù†ÙˆÙ…:',
'config-admin-password' => 'پټنوم:',
'config-admin-password-confirm' => 'پټنوم يو ÚÙ„ بيا:',
'config-admin-email' => 'برÛښليک پته:',
- 'config-profile-wiki' => 'دوديزه ويکي', # Fuzzy
- 'config-license-pd' => 'ټولګړی شپول',
+ 'config-profile-wiki' => 'Ù¾Ø±Ø§Ù†ÙŠØ³ØªÛ ÙˆÙŠÚ©ÙŠ',
+ 'config-license-pd' => 'ټولگړی شپول',
'config-email-settings' => 'د برÛښليک امستنÛ',
'config-install-step-done' => 'ترسره شو',
'config-install-tables' => 'لښتيالونه جوړول',
@@ -15984,25 +16496,27 @@ $messages['ps'] = array(
/** Portuguese (português)
* @author Crazymadlover
* @author Hamilton Abreu
+ * @author Luckas
* @author Mormegil
* @author Platonides
* @author SandroHc
* @author Waldir
* @author ì•„ë¼
+ * @author 555
*/
$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.
+Para atualizar esta instalação, por favor introduza o valor de <code>$wgUpgradeKey</code> na caixa abaixo.
Encontra este valor no <code>LocalSettings.php</code>.',
'config-localsettings-cli-upgrade' => 'Foi detectada a existência de um ficheiro <code>LocalSettings.php</code>.
-Para actualizar esta instalação execute o <code>update.php</code>, por favor.',
- 'config-localsettings-key' => 'Chave de actualização:',
+Para atualizar esta instalação execute o <code>update.php</code>, por favor.',
+ 'config-localsettings-key' => 'Chave de atualizaçã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 <code>LocalSettings.php</code>:
+Para atualizar esta instalação, por favor coloque a seguinte linha no final do seu <code>LocalSettings.php</code>:
$1',
'config-localsettings-incomplete' => 'O ficheiro <code>LocalSettings.php</code> existente parece estar incompleto.
@@ -16017,17 +16531,17 @@ 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.',
+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' => 'Seleccione a língua que será usada durante o processo de instalação.',
+ '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' => 'Seleccione a língua que será predominante na 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' => 'Actualizar a instalação existente',
+ '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',
@@ -16037,13 +16551,13 @@ Verifique o seu php.ini e certifique-se de que em <code>session.save_path</code>
'config-page-readme' => 'Leia-me',
'config-page-releasenotes' => 'Notas de lançamento',
'config-page-copying' => 'A copiar',
- 'config-page-upgradedoc' => 'A actualizar',
+ 'config-page-upgradedoc' => 'Atualizando',
'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.',
+Se necessitar de pedir ajuda durante a instalação, deve fornecer os resultados destas verificações.', # Fuzzy
'config-copyright' => "=== Direitos de autor e Condições de uso ===
$1
@@ -16070,35 +16584,35 @@ 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-utf8' => 'A usar o utf8_normalize.so, por Brion Vibber, 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.
+ '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. 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 [//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 [//www.mediawiki.org/wiki/Unicode_normalization_considerations actualizá-la] se tem quaisquer preocupações sobre o uso do 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/ projeto ICU].
+Devia [//www.mediawiki.org/wiki/Unicode_normalization_considerations atualizá-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! Precisa de instalar um controlador para o PHP. São aceites os seguintes tipos de base de dados: $1.
Se usa alojamento partilhado, peça ao fornecedor do alojamento para instalar um controlador apropriado.
-Se foi você quem compilou o PHP, reconfigure-o com um cliente de base de dados activado; por exemplo, usando <code>./configure --with-mysql</code>.
+Se foi você quem compilou o PHP, reconfigure-o com um cliente de base de dados ativado; por exemplo, usando <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-outdated-sqlite' => "'''Aviso''': Tem a versão $1 do SQLite, que é anterior à versão mínima necessária, a $2. O SQLite não estará disponível.",
'config-no-fts3' => "'''Aviso''': O SQLite foi compilado sem o módulo [//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.'''
+ '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 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!'''
+ '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á ativada!'''
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!'''
+Não pode instalar ou usar o MediaWiki a menos que esta opção seja desativada.",
+ '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á ativada!'''
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!'''
+Não pode instalar ou usar o MediaWiki a menos que esta opção seja desativada.",
+ 'config-mbstring' => "'''Fatal: A opção [http://www.php.net/manual/en/ref.mbstring.php#mbstring.overload mbstring.func_overload] está ativada!'''
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!'''
+Não pode instalar ou usar o MediaWiki a menos que esta opção seja desativada.",
+ 'config-ze1' => "'''Fatal: A opção [http://www.php.net/manual/en/ini.core.php zend.ze1_compatibility_mode] está ativada!'''
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.
+Não pode instalar ou usar o MediaWiki a menos que esta opção seja desativada.",
+ 'config-safe-mode' => "'''Aviso:''' O [http://www.php.net/features.safe-mode safe mode] do PHP está ativo.
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.
@@ -16106,7 +16620,7 @@ 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.",
+O MediaWiki necessita do suporte UTF-8 para funcionar corretamente.",
'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.
@@ -16116,29 +16630,29 @@ A instalação poderá falhar!",
'config-apc' => '[http://www.php.net/apc APC] instalada',
'config-wincache' => '[http://www.iis.net/download/WinCacheForPhp WinCache] instalada',
'config-no-cache' => "'''Aviso:''' Não foi possível encontrar: [http://www.php.net/apc APC], [http://xcache.lighttpd.net/ XCache], nem [http://www.iis.net/download/WinCacheForPhp WinCache].
-A cache de objectos não será activada.",
+A cache de objetos não está ativada.",
'config-mod-security' => "'''Aviso''': O seu servidor de internet tem o [http://modsecurity.org/ mod_security] ativado. Se este estiver mal configurado, pode causar problemas ao MediaWiki ou a outros programas, permitindo que os utilizadores publiquem conteúdos arbitrários.
Consulte a [http://modsecurity.org/documentation/ mod_security documentação] ou peça apoio ao fornecedor do alojamento do seu servidor se encontrar erros aleatórios.",
'config-diff3-bad' => 'O GNU diff3 não foi encontrado.',
'config-imagemagick' => 'Foi encontrado o ImageMagick: <code>$1</code>.
-Se possibilitar uploads, a miniaturização de imagens será activada.',
+Se possibilitar uploads, a miniaturização de imagens será ativada.',
'config-gd' => 'Foi encontrada a biblioteca gráfica GD.
-Se possibilitar uploads, a miniaturização de imagens será activada.',
+Se possibilitar uploads, a miniaturização de imagens será ativada.',
'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 miniaturização de imagens será desativada.',
+ 'config-no-uri' => "'''Erro:''' Não foi possível determinar a URI atual.
A instalação foi abortada.",
'config-no-cli-uri' => "'''Aviso''': Não foi especificado um --scriptpath; por omissão, será usado: <code>$1</code>.",
'config-using-server' => 'Será usado o nome do servidor "<nowiki>$1</nowiki>".',
'config-using-uri' => 'Será usada a URL do servidor "<nowiki>$1$2</nowiki>".',
- '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.
+ 'config-uploads-not-safe' => "'''Aviso:''' O diretó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 [//www.mediawiki.org/wiki/Manual:Security#Upload_security vede esta vulnerabilidade de segurança] antes de possibilitar uploads.",
- 'config-no-cli-uploads-check' => "'''Aviso:''' O directório por omissão para uploads, <code>\$1</code>, não é verificado para determinar se é vulnerável à execução de código arbitrário durante a instalação por CLI (\"Command-line Interface\").",
+ 'config-no-cli-uploads-check' => "'''Aviso:''' O diretório por omissão para uploads, <code>\$1</code>, não é verificado para determinar se é vulnerável à execução de código arbitrário durante a instalação por CLI (\"Command-line Interface\").",
'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 ([//bugs.php.net/bug.php?id=45996 incidência reportada no PHP]).
+Atualize para o PHP versão 5.2.9 ou posterior e libxml2 versão 2.7.3 ou posterior ([//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.
+Para resolver este problema, atualize o PHP para a versão 5.3.2 ou posterior, ou reverta-o para a 5.3.0.
Instalação interrompida.',
'config-suhosin-max-value-length' => 'O Suhosin está instalado e limita a $1 bytes o comprimento do parâmetro GET. O componente ResourceLoader do MediaWiki pode tornear este limite, mas prejudicando o desempenho. Se lhe for possível, deve atribuir o valor 1024 ou maior ao parâmetro <code>suhosin.get.max_value_length</code> no ficheiro <code>php.ini</code>, e definir o mesmo valor para <code>$wgResourceLoaderMaxQueryLength</code> no ficheiro LocalSettings.php.', # Fuzzy
'config-db-type' => 'Tipo da base de dados:',
@@ -16161,9 +16675,9 @@ Se estiver a usar um servidor partilhado, o fornecedor do alojamento deve poder
'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.
+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 objetos 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.",
+Existe um script para criação de uma conta com os privilégios necessários no diretó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:',
@@ -16194,18 +16708,18 @@ mas não lhe permitirá armazenar caracteres acima do [//en.wikipedia.org/wiki/M
'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.
+ 'config-db-schema-help' => 'Normalmente, este esquema estará correto.
Altere-o só se souber que precisa de o fazer.',
'config-pg-test-error' => "Não foi possível criar uma ligação à base de dados '''$1''': $2",
- 'config-sqlite-dir' => 'Directório de dados do SQLite:',
+ 'config-sqlite-dir' => 'Diretó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.
+Durante a instalação, o servidor de internet precisa de ter permissão de escrita no diretó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.
+Este diretório '''não''' deve poder ser acedido diretamente 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.
+Juntamente com o diretó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 direto à base de dados.
+Isto inclui acesso aos dados dos utilizadores (endereços de correio eletró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:',
@@ -16214,28 +16728,25 @@ Considere colocar a base de dados num local completamente diferente, como, por e
'config-type-postgres' => 'PostgreSQL',
'config-type-sqlite' => 'SQLite',
'config-type-oracle' => 'Oracle',
- 'config-type-ibm_db2' => 'IBM DB2',
'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.',
+Se a plataforma que pretende usar não está listada abaixo, siga as instruções nos links acima para ativar 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]). Poderão existir alguns pequenos problemas e não é recomendado o seu uso em ambientes de exploração/produção.',
'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-support-ibm_db2' => '* $1 é uma base de dados empresarial.', # Fuzzy
'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-header-ibm_db2' => 'Configurações da IBM DB2',
'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.',
+Use só letras (a-z, A-Z), algarismos (0-9), sublinhados (_) e pontos (.) dos caracteres ASCII.', # Fuzzy
'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.
@@ -16251,51 +16762,51 @@ Use só letras (a-z, A-Z), algarismos (0-9) e sublinhados (_) dos caracteres ASC
'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>.
+ 'config-sqlite-parent-unwritable-group' => 'Não é possível criar o diretório de dados <code><nowiki>$1</nowiki></code>, porque o servidor de internet não tem permissão de escrita no diretó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 continuar, configure o diretó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>.
+ 'config-sqlite-parent-unwritable-nogroup' => 'Não é possível criar o diretório de dados <code><nowiki>$1</nowiki></code>, porque o servidor de internet não tem permissão de escrita no diretó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 continuar, configure o diretó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".
+ 'config-sqlite-mkdir-error' => 'Ocorreu um erro ao criar o diretó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".
+ 'config-sqlite-dir-unwritable' => 'Não foi possível escrever no diretó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.',
+Verifique o diretó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.
+Para atualizá-las para o MediaWiki $1, clique '''Continuar'''.",
+ 'config-upgrade-done' => "Atualizaçã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.
+ 'config-upgrade-done-no-regenerate' => 'Atualização terminada.
Agora pode [$1 começar a usar a sua wiki].',
- 'config-regenerate' => 'Regenerar o <code>LocalSettings.php</code> →',
+ 'config-regenerate' => 'Regenerar o LocalSettings.php →',
'config-show-table-status' => 'A consulta <code>SHOW TABLE STATUS</code> 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-help' => 'Selecione 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.
@@ -16303,13 +16814,13 @@ 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-myisam-dep' => "'''Aviso''': Seleccionou o MyISAM para motor de armazenamento do MySQL, uma combinação desaconselhada para usar com o MediaWiki porque:
+ 'config-mysql-myisam-dep' => "'''Aviso''': Selecionou o MyISAM para motor de armazenamento do MySQL, uma combinação desaconselhada para usar com o MediaWiki porque:
* praticamente não permite acessos simultâneos, devido aos bloqueios de tabelas
-* o MyISAM é mais susceptível a perdas da integridade dos dados do que outros motores
+* o MyISAM é mais suscetível a perdas da integridade dos dados do que outros motores
* o código do MediaWiki não trabalha devidamente com o MyISAM
Se a sua instalação do MySQL suporta InnoDB, é altamente recomendado que o escolha em vez do MyISAM.
-Se não suporta o InnoDB, talvez esta seja uma boa altura para fazer a actualização para a versão mais recente do MySQL.",
+Se não suporta o InnoDB, talvez esta seja uma boa altura para fazer a atualização para a versão mais recente do MySQL.",
'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.
@@ -16322,22 +16833,21 @@ Isto é mais eficiente do que o modo UTF-8 do MySQL e permite que sejam usados t
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 [//en.wikipedia.org/wiki/Mapping_of_Unicode_character_planes Plano Multilingue Básico].",
- 'config-ibm_db2-low-db-pagesize' => "A sua base de dados DB2 tem um tablespace padrão com um pagesize insuficiente. O pagesize tem de ser '''32K'' ou maior.",
'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-project-namespace' => 'Espaço nominal do projeto:',
+ 'config-ns-generic' => 'Projeto',
'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\'\'\'".
+ '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 projeto\'\'\'".
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.',
+Introduza um espaço nominal de projeto 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.',
+Especifique um espaço nominal do projeto diferente.',
'config-admin-box' => 'Conta de administrador',
'config-admin-name' => 'O seu nome:',
'config-admin-password' => 'Palavra-chave:',
@@ -16357,7 +16867,7 @@ Introduza um nome de utilizador diferente.',
'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.',
+Deve subscrevê-la e atualizar a sua instalação MediaWiki quando são lançadas versões novas.',
'config-subscribe-noemail' => 'Tentou subscrever a lista de divulgação dos anúncios de novas versões, sem fornecer um endereço de correio electrónico.
Para subscrever esta lista de divulgação tem de fornecer um endereço de correio electrónico.',
'config-almost-done' => 'Está quase a terminar!
@@ -16390,7 +16900,7 @@ Após a instalação, estarão disponíveis mais configurações de privilégios
'config-license-cc-0' => 'Creative Commons Zero (Domínio Público)',
'config-license-gfdl' => '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-cc-choose' => 'Selecione uma licença personalizada 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.
@@ -16401,19 +16911,19 @@ A licença anterior da Wikipédia era a licença GNU Free Documentation License.
A GFDL é uma licença válida, mas de difícil compreensão.
Também é difícil reutilizar conteúdos licenciados com a GFDL.',
'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-enable-email' => 'Ativar mensagens eletrónicas de saída',
+ 'config-enable-email-help' => 'Se quer que o correio eletrónico funcione, as [http://www.php.net/manual/en/mail.configuration.php definições de correio eletrónico do PHP] têm de estar configuradas corretamente.
+Se não pretende viabilizar qualquer funcionalidade de correio eletrónico, pode desativá-lo aqui.',
+ 'config-email-user' => 'Ativar mensagens eletrónicas entre utilizadores',
+ 'config-email-user-help' => 'Permitir que todos os utilizadores troquem entre si mensagens de correio eletrónico, se tiverem ativado esta funcionalidade nas suas preferências.',
+ 'config-email-usertalk' => 'Ativar 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 ativado esta funcionalidade nas suas preferências.',
+ 'config-email-watchlist' => 'Ativar 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 ativado esta funcionalidade nas suas preferências.',
+ 'config-email-auth' => 'Ativar autenticação do correio eletrónico',
+ 'config-email-auth-help' => "Se esta opção for ativada, os utilizadores têm de confirmar o seu endereço de correio eletrónico usando um link que lhes é enviado sempre que o definirem ou alterarem.
+Só os endereços de correio eletrónico autenticados podem receber mensagens eletrónicas dos outros utilizadores ou alterar as mensagens de notificação.
+É '''recomendado''' que esta opção seja ativada nas wikis de acesso público para impedir o uso abusivo das funcionalidades de correio eletró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.
@@ -16421,19 +16931,19 @@ Muitos servidores de correio electrónico exigem que pelo menos a parte do nome
'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 [//www.mediawiki.org/wiki/Manual:Security secção sobre segurança] do Manual Técnico.
+Para mais informações, leia a [//www.mediawiki.org/wiki/Manual:Security seçã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.',
+Para permitir o upload de ficheiros, altere as permissões do subdiretório <code>images</code> no diretório de raiz do MediaWiki para que o servidor de internet possa escrever nele.
+Depois ative esta opção.',
+ 'config-upload-deleted' => 'Diretório para os ficheiros apagados:',
+ 'config-upload-deleted-help' => 'Escolha um diretório onde serão arquivados os ficheiros apagados.
+O ideal é que este diretório não possa ser diretamente 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 acima do menu da barra lateral.
Coloque na wiki 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',
+Se não pretende usar um logótipo, deixe este campo em branco.', # Fuzzy
+ 'config-instantcommons' => 'Ativar Instant Commons',
'config-instantcommons-help' => 'O [//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 [//commons.wikimedia.org/ Wikimedia Commons].
Para poder usá-los, o MediaWiki necessita de acesso à internet.
@@ -16443,26 +16953,26 @@ 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-options' => 'Configuração da cache de objetos:',
+ 'config-cache-help' => 'A cache de objetos é usada para melhorar o desempenho do MediaWiki. Armazena dados usados com frequência.
+Sites de tamanho médio ou grande são altamente encorajados a ativar 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, XCache ou WinCache)',
+ 'config-cache-accel' => 'Cache de objetos do PHP (APC, 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-needservers' => 'Selecionou 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>.
+ 'config-extensions-help' => 'Foi detectada a existência das extensões listadas acima, no seu diretório <code>./extensions</code>.
-Estas talvez necessitem de configurações adicionais, mas pode activá-las agora',
+Estas talvez necessitem de configurações adicionais, mas pode ativá-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.
@@ -16480,7 +16990,7 @@ Certifique-se de que o utilizador "$1" pode escrever no esquema \'\'(schema)\'\'
'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-pg-not-in-role' => 'A conta que especificou para o utilizador da internet já existe.
-A conta que especificou para a instalação não é a de um super-utilizador e não pertence ao grupo de utilizadores de acesso pela internet, por isso não pode criar objectos que pertencem ao utilizador da internet.
+A conta que especificou para a instalação não é a de um super-utilizador e não pertence ao grupo de utilizadores de acesso pela internet, por isso não pode criar objetos que pertencem ao utilizador da internet.
O MediaWiki necessita que as tabelas pertençam ao utilizador da internet. Especifique outra conta de internet, ou clique "voltar" e especifique um utilizador com os privilégios necessários para a instalação.',
'config-install-user' => 'A criar o utilizador da base de dados',
@@ -16489,7 +16999,7 @@ O MediaWiki necessita que as tabelas pertençam ao utilizador da internet. Espec
'config-install-user-grant-failed' => 'A atribuição das permissões ao utilizador "$1" falhou: $2',
'config-install-user-missing' => 'O utilizador especificado, "$1", não existe.',
'config-install-user-missing-create' => 'O utilizador especificado, "$1", não existe.
-Marque a caixa de selecção "criar conta" abaixo se pretende criá-la, por favor.',
+Marque a caixa de seleção "criar conta" abaixo se pretende criá-la, por favor.',
'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.",
@@ -16505,7 +17015,7 @@ O preenchimento padrão desta tabela será saltado.",
'config-install-subscribe-fail' => 'Não foi possível subscrever a lista mediawiki-announce: $1',
'config-install-subscribe-notpossible' => 'cURL não está instalado e allow_url_fopen não está disponível.',
'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-extension-tables' => 'A criar as tabelas das extensões ativadas',
'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.
@@ -16513,7 +17023,7 @@ 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.
+Precisa de fazer o download do ficheiro e colocá-lo no diretório de raiz da sua instalação (o mesmo diretó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:
@@ -16536,8 +17046,10 @@ Depois de terminar o passo anterior, pode '''[$2 entrar na wiki]'''.",
);
/** Brazilian Portuguese (português do Brasil)
+ * @author Cainamarques
* @author Giro720
* @author Gustavo
+ * @author Luckas
* @author Marcionunes
* @author 555
*/
@@ -16549,13 +17061,19 @@ $messages['pt-br'] = array(
Para atualizar esta instalação, insira no box abaixo o valor de <code>$wgUpgradeKey</code>.
Essa informação pode ser encontrada no arquivo <code>LocalSettings.php</code>',
'config-localsettings-cli-upgrade' => 'Foi detectada a existência do arquivo <code><code>LocalSettings.php</code></code>.
-Esta instalação deverá ser atualizada através do <code>update.php</code>',
+Atualize esta instalação executando o arquivo <code>update.php</code>',
'config-localsettings-key' => 'Chave de atualização:',
'config-localsettings-badkey' => 'A chave fornecida 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 <code>LocalSettings.php</code>:
+Para atualizar esta instalação, insira a seguinte linha na parte inferior do seu <code>LocalSettings.php</code>:
+
+$1',
+ 'config-localsettings-incomplete' => 'O arquivo <code>LocalSettings.php</code> parece incompleto.
+A variável $1 não está definida.
+Altere seu <code>LocalSettings.php</code> com a definição dessa variável e clique em "{{int:Config-continue}}".',
+ 'config-localsettings-connection-error' => 'Ocorreu um erro ao conectar ao banco de dados através das configurações presentes ou no <code>LocalSettings.php</code> ou no <code>AdminSettings.php</code>. Corrija essas configurações e tente novamente.
-$ 1', # Fuzzy
+$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.
@@ -16563,31 +17081,32 @@ Você pode aumentar esta duração configurando <code>session.gc_maxlifetime</co
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-your-language' => 'Seu idioma:',
+ 'config-your-language-help' => 'Selecione o idioma que será usado durante o processo de instalação.',
+ 'config-wiki-language' => 'Idioma do wiki:',
+ 'config-wiki-language-help' => 'Selecione o idioma em que o wiki será predominantemente escrito.',
'config-back' => '↠Voltar',
'config-continue' => 'Continuar →',
- 'config-page-language' => 'Língua',
+ 'config-page-language' => 'Idioma',
'config-page-welcome' => 'Bem-vindo(a) ao MediaWiki!',
- 'config-page-dbconnect' => 'Ligar à base de dados',
+ 'config-page-dbconnect' => 'Conectar ao banco de dados',
'config-page-upgrade' => 'Atualizar a instalação existente',
- 'config-page-dbsettings' => 'Configurações da base de dados',
+ 'config-page-dbsettings' => 'Configurações do banco de dados',
'config-page-name' => 'Nome',
'config-page-options' => 'Opções',
'config-page-install' => 'Instalar',
- 'config-page-complete' => 'Terminado!',
+ 'config-page-complete' => 'Concluído!',
'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-page-existingwiki' => 'Wiki existente',
'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-welcome' => '=== Verificações de ambiente ===
+São realizadas verificações básicas para determinar se este ambiente é apropriado para a instalação do MediaWiki.
+Lembre-se de incluir estas informações se for procurar por suporte para a conclusão da instalação.',
'config-copyright' => "=== Direitos autorais e Termos de uso ===
$1
@@ -16598,28 +17117,52 @@ Este programa é distribuído na esperança de que seja útil, mas '''sem qualqu
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' => '* [//www.mediawiki.org/wiki/MediaWiki/pt Página principal do MediaWiki]
-* [//www.mediawiki.org/wiki/Help:Contents/pt Ajuda]
-* [//www.mediawiki.org/wiki/Manual:Contents/pt Manual técnico]
-* [//www.mediawiki.org/wiki/Manual:FAQ FAQ]', # Fuzzy
+ 'config-sidebar' => '* [//www.mediawiki.org/wiki/MediaWiki Página principal do MediaWiki]
+* [//www.mediawiki.org/wiki/Help:Contents Manual de uso]
+* [//www.mediawiki.org/wiki/Manual:Contents Manual administrativo]
+* [//www.mediawiki.org/wiki/Manual:FAQ FAQ]
+----
+* <doclink href=Readme>Leia-me</doclink>
+* <doclink href=ReleaseNotes>Notas de lançamento</doclink>
+* <doclink href=Copying>Licença</doclink>
+* <doclink href=UpgradeDoc>Como fazer upgrade</doclink>',
'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-utf8' => 'Usando o utf8_normalize.so, de Brion Vibber, 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 [//www.mediawiki.org/wiki/Unicode_normalization_considerations normalização Unicode].", # Fuzzy
- 'config-no-db' => 'Não foi possível encontrar um driver de banco de dados adequado!', # Fuzzy
+ '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 sendo usada, em seu lugar, a lenta implementação de PHP puro.
+Se o seu site tem um alto volume de tráfego, informe-se sobre a [//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! É necessário instalar um driver de banco de dados para o PHP.
+São suportados os seguintes tipos de bancos de dados: $1.
+
+Se estiver em uma hospedagem partilhada, peça à sua empresa de hospedagem para instalar um driver de banco de dados adequado.
+Se você mesmo tiver compilado o PHP, reconfigure-o com um cliente de banco de dados ativado usando, por exemplo, <code>./configure --with-mysql</code>.
+Se você instalou o PHP a partir de um pacote do Debian ou do Ubuntu, instale também o módulo php5-mysql.',
'config-no-fts3' => "' ' 'Aviso' ' ': O SQLite foi compilado sem o módulo [//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.
+ 'config-charset-mysql5-binary' => 'MySQL 4.1/5.0 binary',
+ 'config-charset-mysql5' => 'MySQL 4.1/5.0 UTF-8',
+ 'config-mysql-innodb' => 'InnoDB',
+ 'config-mysql-myisam' => 'MyISAM',
+ 'config-mysql-binary' => 'Binary',
+ 'config-mysql-utf8' => 'UTF-8',
+ 'config-ns-generic' => 'Projeto',
+ 'config-admin-box' => 'Conta de administrador',
+ 'config-admin-name' => 'Seu nome:',
+ 'config-admin-password' => 'Senha:',
+ 'config-license-pd' => 'Domínio público',
+ 'config-logo-help' => 'Faça o upload de uma imagem de tamanho adequado e insira seu URL aqui.
-Se você não pretende usar um logotipo, deixe este campo em branco.', # Fuzzy
+Você pode usar <code>$wgStylePath</code> ou <code>$wgScriptPath</code> se o seu logotipo for associado a esses diretórios.',
+ 'config-advanced-settings' => 'Configuração avançada',
+ 'config-extensions' => 'Extensões',
+ 'config-install-step-done' => 'feito',
+ 'config-help' => 'ajuda',
'mainpagetext' => "'''MediaWiki instalado com sucesso.'''",
'mainpagedocfooter' => 'Consulte o [//meta.wikimedia.org/wiki/Help:Contents Manual de Usuário] para informações de como usar o software wiki.
@@ -16627,7 +17170,8 @@ Se você não pretende usar um logotipo, deixe este campo em branco.', # Fuzzy
* [//www.mediawiki.org/wiki/Manual:Configuration_settings Lista de opções de configuração]
* [//www.mediawiki.org/wiki/Manual:FAQ FAQ do MediaWiki]
-* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce Lista de discussão com avisos de novas versões do MediaWiki]', # Fuzzy
+* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce Lista de discussão com avisos de novas versões do MediaWiki]
+* [//www.mediawiki.org/wiki/Localisation#Translation_resources Traduza o MediaWiki para seu idioma]',
);
/** Quechua (Runa Simi)
@@ -16672,7 +17216,7 @@ $messages['rm'] = array(
== Cumenzar ==
* [//www.mediawiki.org/wiki/Manual:Configuration_settings Glista da las opziuns per la configuraziun]
* [//www.mediawiki.org/wiki/Manual:FAQ MediaWiki FAQ]
-* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce Glista da mail da MediaWiki cun annunzias da novas versiuns]",
+* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce Glista da mail da MediaWiki cun annunzias da novas versiuns]", # Fuzzy
);
/** Romanian (română)
@@ -16729,12 +17273,10 @@ Totuși, MediaWiki necesită PHP $2 sau mai nou.',
'config-sqlite-dir' => 'Director de date SQLite:',
'config-oracle-def-ts' => 'SpaÈ›iu de stocare („tablespaceâ€) implicit:',
'config-oracle-temp-ts' => 'SpaÈ›iu de stocare („tablespaceâ€) temporar:',
- 'config-type-ibm_db2' => 'IBM DB2',
'config-header-mysql' => 'Setările MySQL',
'config-header-postgres' => 'Setări PostgreSQL',
'config-header-sqlite' => 'Setări SQLite',
'config-header-oracle' => 'Setări Oracle',
- 'config-header-ibm_db2' => 'Setări IBM DB2',
'config-invalid-db-type' => 'Tip de bază de date incorect',
'config-missing-db-name' => 'Trebuie să introduci o valoare pentru „Numele bazei de dateâ€',
'config-connection-error' => '$1.
@@ -16743,7 +17285,7 @@ Verificați gazda, numele de utilizator și parola și reîncercați.',
'config-upgrade-done-no-regenerate' => 'Actualizare completă.
Acum puteți [$1 începe să vă folosiți wikiul].',
- 'config-regenerate' => 'Regenerare <code>LocalSettings.php</code> →',
+ 'config-regenerate' => 'Regenerare LocalSettings.php →',
'config-unknown-collation' => 'AVERTISMENT: Baza de date folosește o colaționare nerecunoscută.',
'config-db-web-account' => 'Contul bazei de date pentru accesul web.',
'config-db-web-create' => 'Creați contul dacă nu există deja',
@@ -16829,8 +17371,29 @@ $messages['roa-tara'] = array(
'config-title' => 'Installazzione de MediaUicchi $1',
'config-information' => "'Mbormaziune",
'config-localsettings-key' => 'Chiave de aggiornamende:',
+ 'config-localsettings-badkey' => "'A chiave ca è date non g'è corrette.",
+ 'config-session-error' => "Errore facenne accumenzà 'a sessione: $1",
+ 'config-your-language' => "'A lènga toje:",
+ 'config-your-language-help' => "Scacchie 'na lènghe da ausà duranne 'u processe de installazzione:",
+ 'config-wiki-language' => 'Lènga de Uicchi:',
+ 'config-back' => '↠Rrète',
+ 'config-continue' => 'Condinue →',
'config-page-language' => 'Lènghe',
+ 'config-page-welcome' => "Bovègne jndr'à MediaUicchi!",
+ 'config-page-dbconnect' => "Collegate a 'u database",
+ 'config-page-upgrade' => "Aggiorne l'installazzione esistende",
+ 'config-page-dbsettings' => "'Mbostaziune d'u database",
'config-page-name' => 'Nome',
+ 'config-page-options' => 'Opziune',
+ 'config-page-install' => 'Installe',
+ 'config-page-complete' => 'Combletate!',
+ 'config-page-restart' => "Riavvie l'installazzione",
+ 'config-page-readme' => 'Liggeme',
+ 'config-page-releasenotes' => 'Note de rilasce',
+ 'config-page-copying' => 'Stoche a copie',
+ 'config-page-upgradedoc' => 'Aggiornamende',
+ 'config-page-existingwiki' => 'Uicchi esistende',
+ 'config-db-type' => 'Tipe de database:',
'config-db-charset' => "'Nzieme de carattere d'u database",
'config-charset-mysql5-binary' => 'MySQL 4.1/5.0 binary',
'config-charset-mysql5' => 'MySQL 4.1/5.0 UTF-8',
@@ -16841,6 +17404,8 @@ $messages['roa-tara'] = array(
'config-type-postgres' => 'PostgreSQL',
'config-type-sqlite' => 'SQLite',
'config-type-oracle' => 'Oracle',
+ 'config-mysql-innodb' => 'InnoDB',
+ 'config-mysql-myisam' => 'MyISAM',
'config-admin-email' => 'Indirizze e-mail:',
'config-install-step-done' => 'fatte',
'config-install-step-failed' => 'fallite',
@@ -16864,10 +17429,12 @@ $messages['roa-tara'] = array(
* @author DCamer
* @author Eleferen
* @author Express2000
+ * @author KPu3uC B Poccuu
* @author Kaganer
* @author Krinkle
* @author Lockal
* @author MaxSem
+ * @author Okras
* @author Yuriy Apostol
* @author ÐлекÑандр Сигачёв
* @author Сrower
@@ -16925,8 +17492,8 @@ $1',
'config-help-restart' => 'Ð’Ñ‹ хотите удалить вÑе Ñохранённые данные, которые вы ввели, и запуÑтить процеÑÑ ÑƒÑтановки заново?',
'config-restart' => 'Да, начать заново',
'config-welcome' => '=== Проверка Ð¾ÐºÑ€ÑƒÐ¶ÐµÐ½Ð¸Ñ ===
-ПроводÑÑ‚ÑÑ Ð±Ð°Ð·Ð¾Ð²Ñ‹Ðµ проверки Ñ Ñ†ÐµÐ»ÑŒÑŽ определить, подходит ли Ð´Ð°Ð½Ð½Ð°Ñ ÑиÑтема Ð´Ð»Ñ ÑƒÑтановки MediaWiki.
-Укажите результаты Ñтих проверок при обращении за помощью Ñ ÑƒÑтановкой.',
+Будут проведены базовые проверки Ñ Ñ†ÐµÐ»ÑŒÑŽ определить, подходит ли Ð´Ð°Ð½Ð½Ð°Ñ ÑиÑтема Ð´Ð»Ñ ÑƒÑтановки MediaWiki.
+Ðе забудьте включить Ñту информацию, еÑли вам потребуетÑÑ Ð¿Ð¾Ð¼Ð¾Ñ‰ÑŒ Ð´Ð»Ñ Ð·Ð°Ð²ÐµÑ€ÑˆÐµÐ½Ð¸Ñ ÑƒÑтановки.',
'config-copyright' => "=== ÐвторÑкие права и уÑÐ»Ð¾Ð²Ð¸Ñ ===
$1
@@ -16993,6 +17560,11 @@ MediaWiki требует поддержки UTF-8 Ð´Ð»Ñ ÐºÐ¾Ñ€Ñ€ÐµÐºÑ‚Ð½Ð¾Ð¹ Ñ€
'config-memory-bad' => "'''Внимание:''' размер PHP <code>memory_limit</code> ÑоÑтавлÑет $1.
ВероÑтно, Ñтого Ñлишком мало.
УÑтановка может потерпеть неудачу!",
+ 'config-ctype' => "'''Ð¤Ð°Ñ‚Ð°Ð»ÑŒÐ½Ð°Ñ Ð¾ÑˆÐ¸Ð±ÐºÐ°:''' PHP должен быть Ñкомпилирован Ñ Ð¿Ð¾Ð´Ð´ÐµÑ€Ð¶ÐºÐ¾Ð¹ [http://www.php.net/manual/ru/ctype.installation.php раÑÑˆÐ¸Ñ€ÐµÐ½Ð¸Ñ Ctype].",
+ 'config-json' => "'''Ð¤Ð°Ñ‚Ð°Ð»ÑŒÐ½Ð°Ñ Ð¾ÑˆÐ¸Ð±ÐºÐ°:''' PHP был Ñкомпилирован без поддержка JSON.
+Вам необходимо уÑтановить либо раÑширение PHP JSON, либо раÑширение [http://pecl.php.net/package/jsonc PECL jsonc] перед уÑтановкой MediaWiki.
+* PHP-раÑширение входит в ÑоÑтав Red Hat Enterprise Linux (CentOS) 5 и 6, Ñ…Ð¾Ñ‚Ñ Ð´Ð¾Ð»Ð¶Ð½Ð° быть включено в <code>/etc/php.ini</code> или <code>/etc/php.d/json.ini</code>.
+* Ðекоторые диÑтрибутивы Linux, выпущенные поÑле Ð¼Ð°Ñ 2013 года, не включают раÑширение PHP, вмеÑто того, чтобы упаковывать раÑширение PECL как <code>php5-json</code> или <code>php-pecl-jsonc</code>.",
'config-xcache' => '[http://xcache.lighttpd.net/ XCache] уÑтановлен',
'config-apc' => '[http://www.php.net/apc APC] уÑтановлен',
'config-wincache' => '[http://www.iis.net/download/WinCacheForPhp WinCache] уÑтановлен',
@@ -17001,6 +17573,8 @@ MediaWiki требует поддержки UTF-8 Ð´Ð»Ñ ÐºÐ¾Ñ€Ñ€ÐµÐºÑ‚Ð½Ð¾Ð¹ Ñ€
'config-mod-security' => "'''Внимание''': на вашем веб-Ñервере включен [http://modsecurity.org/ mod_security]. При неправильной наÑтройке он может вызывать проблемы Ð´Ð»Ñ MediaWiki или другого ПО, позволÑющего пользователÑм отправлÑÑ‚ÑŒ на Ñервер произвольный текÑÑ‚.
ОбратитеÑÑŒ к [http://modsecurity.org/documentation/ документации mod_security] или в поддержку вашего хоÑтера, еÑли при работе возникают непонÑтные ошибки.",
'config-diff3-bad' => 'GNU diff3 не найден.',
+ 'config-git' => 'Ðайдена ÑиÑтема ÐºÐ¾Ð½Ñ‚Ñ€Ð¾Ð»Ñ Ð²ÐµÑ€Ñий Git: <code>$1</code>.',
+ 'config-git-bad' => 'Программное обеÑпечение по управлению верÑиÑми Git не найдено.',
'config-imagemagick' => 'Обнаружен ImageMagick: <code>$1</code>.
Возможно отображение миниатюр изображений, еÑли вы разрешите закачки файлов.',
'config-gd' => 'Ðайдена вÑÑ‚Ñ€Ð¾ÐµÐ½Ð½Ð°Ñ Ð³Ñ€Ð°Ñ„Ð¸Ñ‡ÐµÑÐºÐ°Ñ Ð±Ð¸Ð±Ð»Ð¸Ð¾Ñ‚ÐµÐºÐ° GD.
@@ -17022,7 +17596,7 @@ MediaWiki требует поддержки UTF-8 Ð´Ð»Ñ ÐºÐ¾Ñ€Ñ€ÐµÐºÑ‚Ð½Ð¾Ð¹ Ñ€
'config-using531' => 'PHP $1 не ÑовмеÑтим Ñ MediaWiki из-за ошибки Ñ Ð¿Ð°Ñ€Ð°Ð¼ÐµÑ‚Ñ€Ð°Ð¼Ð¸-ÑÑылками при вызовах <code>__call()</code>.
ОбновитеÑÑŒ до PHP 5.3.2 и выше, или откатитеÑÑŒ до PHP 5.3.0, чтобы избежать Ñтой проблемы.
УÑтановка прервана.',
- 'config-suhosin-max-value-length' => 'Suhosin уÑтановлен и ограничивает длину параметра GET до $1 байт. Компонент MediaWiki ResourceLoader будет обходить Ñто ограничение, но Ñто Ñнизит производительноÑÑ‚ÑŒ. ЕÑли Ñто возможно, Ñледует уÑтановить <code>suhosin.get.max_value_length</code> 1024 или выше в <code>php.ini</code>, а также уÑтановить Ð´Ð»Ñ <code>$wgResourceLoaderMaxQueryLength</code> такое же значение в LocalSettings.php.', # Fuzzy
+ 'config-suhosin-max-value-length' => 'Suhosin уÑтановлен и ограничивает параметр GET <code>length</code> до $1 байт. Компонент MediaWiki ResourceLoader будет обходить Ñто ограничение, но Ñто Ñнизит производительноÑÑ‚ÑŒ. ЕÑли Ñто возможно, Ñледует уÑтановить <code>suhosin.get.max_value_length</code> в значение 1024 или выше в <code>php.ini</code>, а также уÑтановить Ð´Ð»Ñ <code>$wgResourceLoaderMaxQueryLength</code> такое же значение в LocalSettings.php.',
'config-db-type' => 'Тип базы данных:',
'config-db-host' => 'ХоÑÑ‚ базы данных:',
'config-db-host-help' => 'ЕÑли Ñервер базы данных находитÑÑ Ð½Ð° другом Ñервере, введите здеÑÑŒ его Ð¸Ð¼Ñ Ñ…Ð¾Ñта или IP-адреÑ.
@@ -17098,7 +17672,6 @@ MediaWiki требует поддержки UTF-8 Ð´Ð»Ñ ÐºÐ¾Ñ€Ñ€ÐµÐºÑ‚Ð½Ð¾Ð¹ Ñ€
'config-type-postgres' => 'PostgreSQL',
'config-type-sqlite' => 'SQLite',
'config-type-oracle' => 'Oracle',
- 'config-type-ibm_db2' => 'IBM DB2',
'config-support-info' => 'MediaWiki поддерживает Ñледующие СУБД:
$1
@@ -17108,18 +17681,16 @@ $1
'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-support-ibm_db2' => '$1 — коммерчеÑÐºÐ°Ñ Ð±Ð°Ð·Ð° данных маÑштаба предприÑтиÑ.', # Fuzzy
'config-header-mysql' => 'ÐаÑтройки MySQL',
'config-header-postgres' => 'ÐаÑтройки PostgreSQL',
'config-header-sqlite' => 'ÐаÑтройки SQLite',
'config-header-oracle' => 'ÐаÑтройки Oracle',
- 'config-header-ibm_db2' => 'ÐаÑтройки IBM DB2',
'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-server-oracle' => 'Ðеверное TNS базы данных «$1».
+ИÑпользуйте либо «TNS Name», либо Ñтроку «Easy Connect» ([http://docs.oracle.com/cd/E11882_01/network.112/e10836/naming.htm Методы Ð½Ð°Ð¸Ð¼ÐµÐ½Ð¾Ð²Ð°Ð½Ð¸Ñ Oracle])',
'config-invalid-db-name' => 'Ðеверное Ð¸Ð¼Ñ Ð±Ð°Ð·Ñ‹ данных «$1».
ИÑпользуйте только ASCII-Ñимволы (a-z, A-Z), цифры (0-9), знак Ð¿Ð¾Ð´Ñ‡Ñ‘Ñ€ÐºÐ¸Ð²Ð°Ð½Ð¸Ñ (_) и дефиÑ(-).',
'config-invalid-db-prefix' => 'Ðеверный Ð¿Ñ€ÐµÑ„Ð¸ÐºÑ Ð±Ð°Ð·Ñ‹ данных «$1».
@@ -17175,7 +17746,7 @@ chmod a+w $3</pre>',
'config-upgrade-done-no-regenerate' => 'Обновление завершено.
Теперь вы можете [$1 начать работу Ñ Ð²Ð¸ÐºÐ¸].',
- 'config-regenerate' => 'Создать <code>LocalSettings.php</code> заново →',
+ 'config-regenerate' => 'Создать LocalSettings.php заново →',
'config-show-table-status' => 'Ð—Ð°Ð¿Ñ€Ð¾Ñ Â«<code>SHOW TABLE STATUS</code>» не выполнен!',
'config-unknown-collation' => "'''Внимание:''' База данных иÑпользует нераÑпознанные правила Ñортировки.",
'config-db-web-account' => 'Ð£Ñ‡Ñ‘Ñ‚Ð½Ð°Ñ Ð·Ð°Ð¿Ð¸ÑÑŒ Ð´Ð»Ñ Ð´Ð¾Ñтупа к базе данных из веб-Ñервера',
@@ -17194,6 +17765,12 @@ chmod a+w $3</pre>',
ЕÑли ваша уÑтановка MySQL поддерживает InnoDB, наÑтоÑтельно рекомендуетÑÑ Ð²Ñ‹Ð±Ñ€Ð°Ñ‚ÑŒ Ñтот механизм.
ЕÑли ваша уÑтановка MySQL не поддерживает InnoDB, возможно, наÑтало Ð²Ñ€ÐµÐ¼Ñ Ð¾Ð±Ð½Ð¾Ð²Ð¸Ñ‚ÑŒÑÑ.",
+ 'config-mysql-only-myisam-dep' => "'''Предупреждение:''' MyISAM ÑвлÑетÑÑ ÐµÐ´Ð¸Ð½Ñтвенной доÑтупной ÑиÑтемой Ñ…Ñ€Ð°Ð½ÐµÐ½Ð¸Ñ Ð´Ð°Ð½Ð½Ñ‹Ñ… Ð´Ð»Ñ MySQL, котораÑ, однако, не рекомендуетÑÑ Ð´Ð»Ñ Ð¸ÑÐ¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ð½Ð¸Ñ Ñ MediaWiki, потому что:
+ * он Ñлабо поддерживает параллелизм из-за блокировки таблиц
+ * она больше других ÑиÑтем подвержена повреждению
+ * ÐºÐ¾Ð´Ð¾Ð²Ð°Ñ Ð±Ð°Ð·Ð° MediaWiki не вÑегда обрабатывает MyISAM так, как Ñледует
+
+Ваша MySQL не поддерживает InnoDB, так что, возможно, наÑтало Ð²Ñ€ÐµÐ¼Ñ Ð´Ð»Ñ Ð¾Ð±Ð½Ð¾Ð²Ð»ÐµÐ½Ð¸Ñ.",
'config-mysql-engine-help' => "'''InnoDB''' почти вÑегда предпочтительнее, так как он лучше ÑправлÑетÑÑ Ñ Ð¿Ð°Ñ€Ð°Ð»Ð»ÐµÐ»ÑŒÐ½Ñ‹Ð¼ доÑтупом.
'''MyISAM''' может оказатьÑÑ Ð±Ñ‹Ñтрее Ð´Ð»Ñ Ð²Ð¸ÐºÐ¸ Ñ Ð¾Ð´Ð½Ð¸Ð¼ пользователем или Ñ Ð¼Ð¸Ð½Ð¸Ð¼Ð°Ð»ÑŒÐ½Ñ‹Ð¼ количеÑтвом поÑтупающих правок, однако базы данных на нём портÑÑ‚ÑÑ Ñ‡Ð°Ñ‰Ðµ, чем на InnoDB.",
@@ -17204,7 +17781,6 @@ chmod a+w $3</pre>',
Это более Ñффективно, чем ''UTF-8 режим'' MySQL, и позволÑет иÑпользовать полный набор Ñимволов Unicode.
Ð’ '''режиме UTF-8''' MySQL будет знать в какой кодировке находÑÑ‚ÑÑ Ð’Ð°ÑˆÐ¸ данные и может отображать и преобразовывать их ÑоответÑтвующим образом, но Ñто не позволит вам хранить Ñимволы выше [//en.wikipedia.org/wiki/Mapping_of_Unicode_character_planes Базовой МногоÑзыковой ПлоÑкоÑти].",
- 'config-ibm_db2-low-db-pagesize' => "Ð’ вашей базе данных DB2 по умолчанию задано табличное проÑтранÑтво Ñ Ð½ÐµÐ´Ð¾Ñтаточным размером Ñтраницы. Размер Ñтраницы должен быть не менее '''32K'''.",
'config-site-name' => 'Ðазвание вики:',
'config-site-name-help' => 'Ðазвание будет отображатьÑÑ Ð² заголовке окна браузера и в некоторых других меÑтах вики.',
'config-site-name-blank' => 'Введите название Ñайта.',
@@ -17311,6 +17887,8 @@ GFDL может быть иÑпользована, но она Ñложна дл
'config-logo-help' => 'Ð¡Ñ‚Ð°Ð½Ð´Ð°Ñ€Ñ‚Ð½Ð°Ñ Ñ‚ÐµÐ¼Ð° Ð¾Ñ„Ð¾Ñ€Ð¼Ð»ÐµÐ½Ð¸Ñ MediaWiki Ñодержит над боковой панелью проÑтранÑтво Ð´Ð»Ñ Ð»Ð¾Ð³Ð¾Ñ‚Ð¸Ð¿Ð° размером 135x160 пикÑелей.
Загрузите изображение ÑоответÑтвующего размера, и введите его URL здеÑÑŒ.
+Ð’Ñ‹ можете иÑпользовать <code>$wgStylePath</code> или <code>$wgScriptPath</code>, еÑли ваш логотип находитÑÑ Ð¾Ñ‚Ð½Ð¾Ñительно к Ñтим путÑм.
+
ЕÑли вам не нужен логотип, оÑтавьте Ñто поле пуÑтым.',
'config-instantcommons' => 'Включить Instant Commons',
'config-instantcommons-help' => '[//www.mediawiki.org/wiki/InstantCommons Instant Commons] — Ñто функциÑ, позволÑÑŽÑ‰Ð°Ñ Ð¸Ñпользовать изображениÑ, звуки и другие медиафайлы Ñ Ð’Ð¸ÐºÐ¸Ñклада ([//commons.wikimedia.org/ Wikimedia Commons]).
@@ -17404,6 +17982,9 @@ $3
'config-download-localsettings' => 'Загрузить <code>LocalSettings.php</code>',
'config-help' => 'Ñправка',
'config-nofile' => 'Файл "$1" не удаетÑÑ Ð½Ð°Ð¹Ñ‚Ð¸. Он был удален?',
+ 'config-extension-link' => 'Знаете ли вы, что ваш вики-проект поддерживает [//www.mediawiki.org/wiki/Manual:Extensions раÑширениÑ]?
+
+Ð’Ñ‹ можете проÑмотреть [//www.mediawiki.org/wiki/Category:Extensions_by_category раÑÑˆÐ¸Ñ€ÐµÐ½Ð¸Ñ Ð¿Ð¾ категориÑм] или [//www.mediawiki.org/wiki/Extension_Matrix матрицу раÑширений], чтобы увидеть их полный ÑпиÑок.',
'mainpagetext' => "'''Вики-движок «MediaWiki» уÑпешно уÑтановлен.'''",
'mainpagedocfooter' => 'Информацию по работе Ñ Ñтой вики можно найти в [//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 Ñправочном руководÑтве].
@@ -17425,7 +18006,7 @@ $messages['rue'] = array(
* [//www.mediawiki.org/wiki/Manual:Configuration_settings ÐаÑÑ‚Ð°Ð²Ð»Ñ—Ð½Ñ ÐºÐ¾Ð½Ñ„Ñ–Ò‘ÑƒÑ€Ð°Ñ†Ñ–Ñ—]
* [//www.mediawiki.org/wiki/Manual:FAQ ЧаÑÑ‚Ñ‹ вопроÑÑ‹ о MediaWiki]
-* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce РозоÑÑ‹Ð»Ð°Ð½Ñ Ð¿Ð¾Ð²Ñ–Ð´Ð¾Ð¼Ð»Ñ—Ð½ÑŒ про новы верзії MediaWiki]',
+* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce РозоÑÑ‹Ð»Ð°Ð½Ñ Ð¿Ð¾Ð²Ñ–Ð´Ð¾Ð¼Ð»Ñ—Ð½ÑŒ про новы верзії MediaWiki]', # Fuzzy
);
/** Sanskrit (संसà¥à¤•à¥ƒà¤¤à¤®à¥)
@@ -17445,7 +18026,7 @@ $messages['sah'] = array(
* [//www.mediawiki.org/wiki/Manual:Configuration_settings ÐšÐ¾Ð½Ñ„Ð¸Ð³ÑƒÑ€Ð°Ñ†Ð¸Ñ ÑƒÐ»Ð°Ñ€Ñ‹Ñ‚Ñ‹Ñ‹Ñ‚Ñ‹Ð½ параметрдара]
* [//www.mediawiki.org/wiki/Manual:FAQ MediaWiki FAQ]
-* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce MediaWiki релизтарын почтовай иÑпииһÑгÑ]',
+* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce MediaWiki релизтарын почтовай иÑпииһÑгÑ]', # Fuzzy
);
/** Sardinian (sardu)
@@ -17464,7 +18045,7 @@ $messages['scn'] = array(
== P'accuminzari ==
* [//www.mediawiki.org/wiki/Manual:Configuration_settings Alencu di mpustazzioni di cunfigurazzioni]
* [//www.mediawiki.org/wiki/Manual:FAQ MediaWiki FAQ]
-* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce Mailing list dî rilassi di MediaWiki]",
+* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce Mailing list dî rilassi di MediaWiki]", # Fuzzy
);
/** Scots (Scots)
@@ -17477,7 +18058,7 @@ $messages['sco'] = array(
* [//www.mediawiki.org/wiki/Manual:Configuration_settings Configuration settins leet]
* [//www.mediawiki.org/wiki/Manual:FAQ MediaWiki FAQ]
-* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce MediaWiki releese mailin leet]",
+* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce MediaWiki releese mailin leet]", # Fuzzy
);
/** Sassaresu (Sassaresu)
@@ -17491,7 +18072,7 @@ Li sighenti cullegamenti so in linga ingrese:
* [//www.mediawiki.org/wiki/Manual:Configuration_settings Impusthazioni di cunfigurazioni]
* [//www.mediawiki.org/wiki/Manual:FAQ Prigonti friquenti i MediaWiki]
-* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce Mailing list annùnzii MediaWiki]",
+* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce Mailing list annùnzii MediaWiki]", # Fuzzy
);
/** Cmique Itom (Cmique Itom)
@@ -17510,7 +18091,7 @@ $messages['sh'] = array(
== PoÄetak ==
* [//www.mediawiki.org/wiki/Manual:Configuration_settings Lista postavki]
* [//www.mediawiki.org/wiki/Manual:FAQ MediaWiki najÄešće postavljana pitanja]
-* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce Lista E-Mail adresa MediaWiki]',
+* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce Lista E-Mail adresa MediaWiki]', # Fuzzy
);
/** Tachelhit (TaÅ¡lḥiyt/ⵜⴰⵛâµâµƒâµ‰âµœ)
@@ -17523,7 +18104,7 @@ $messages['shi'] = array(
== Izwir d MediaWiki ==
* [//www.mediawiki.org/wiki/Manual:Configuration_settings Umuɣ n iɣwwarn n usgadda ]
* [//www.mediawiki.org/wiki/Manual:FAQ/fr Isqqsitn f MidyWiki]
-* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce UmuÉ£ n imsgdaln f imbá¸itn n MidyaWiki]',
+* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce UmuÉ£ n imsgdaln f imbá¸itn n MidyaWiki]', # Fuzzy
);
/** Sinhala (සිංහල)
@@ -17577,17 +18158,15 @@ $messages['si'] = array(
'config-sqlite-dir' => 'SQLite දත්ත නà·à¶¸à·€à¶½à·’ය:',
'config-oracle-def-ts' => 'à·ƒà·à¶¸à·à¶±à·Šâ€à¶º වගු අවකà·à·à¶º:',
'config-oracle-temp-ts' => 'තà·à·€à¶šà·à¶½à·’ක වගු අවකà·à·à¶º:',
- 'config-type-ibm_db2' => 'IBM DB2',
'config-header-mysql' => 'MySQL à·ƒà·à¶šà·ƒà·”ම්',
'config-header-postgres' => 'PostgreSQL à·ƒà·à¶šà·ƒà·”ම්',
'config-header-sqlite' => 'SQLite à·ƒà·à¶šà·ƒà·”ම්',
'config-header-oracle' => 'ඔරකල් à·ƒà·à¶šà·ƒà·”ම්',
- 'config-header-ibm_db2' => 'IBM DB2 à·ƒà·à¶šà·ƒà·”ම්',
'config-invalid-db-type' => 'වලංගු නොවන දත්ත සංචිත වර්ගය',
'config-missing-db-name' => '"දත්ත සංචිත නà·à¶¸à¶º" සඳහ෠ඔබ විසින් අගයක් දිය යුතු වේ',
'config-missing-db-host' => '"දත්ත සංචිත ධà·à¶»à¶šà¶º" සඳහ෠ඔබ විසින් අගයක් දිය යුතු වේ',
'config-missing-db-server-oracle' => '"දත්ත සංචිත TNS" සඳහ෠ඔබ විසින් අගයක් දිය යුතු වේ',
- 'config-regenerate' => 'නà·à·€à¶­ ජනිත කරන්න <code>LocalSettings.php</code> →',
+ 'config-regenerate' => 'නà·à·€à¶­ ජනිත කරන්න LocalSettings.php →',
'config-db-web-account' => 'ජà·à¶½ ප්â€à¶»à·€à·šà·à¶±à¶º සඳහ෠දත්ත සංචිත ගිණුම',
'config-mysql-engine' => 'ආචයන එන්ජිම:',
'config-mysql-innodb' => 'InnoDB',
@@ -17741,8 +18320,8 @@ Preverite vaÅ¡ php.ini in se prepriÄajte, da je <code>session.save_path</code>
'config-help-restart' => 'Želite poÄistiti vse shranjene podatke, ki ste jih vnesti, in ponovno zaÄeti s postopkom namestitve?',
'config-restart' => 'Da, ponovno zaženi',
'config-welcome' => '=== Pregledi okolja ===
-Izvedeni so osnovni pregledi, da vidimo, Äe je okolje primerno za namestitev MediaWiki.
-ÄŒe med namestitvijo potrebujete pomoÄ, posredujte tudi rezultate teh pregledov.',
+Izvedli bomo osnovne preglede, da vidimo, Äe je okolje primerno za namestitev MediaWiki.
+Posredujte rezultate teh pregledov, Äe med namestitvijo potrebujete pomoÄ.',
'config-sidebar' => '* [//www.mediawiki.org DomaÄa stran MediaWiki]
* [//www.mediawiki.org/wiki/Help:Contents Vodnik za uporabnike]
* [//www.mediawiki.org/wiki/Manual:Contents Vodnik za administratorje]
@@ -17785,7 +18364,6 @@ Vendar pa MediaWiki zahteva PHP $2 ali višji.',
'config-db-schema-help' => 'Ta shema je po navadi v redu.
Spremenite jo samo, Äe veste, da jo morate.',
'config-sqlite-dir' => 'Mapa podatkov SQLite:',
- 'config-type-ibm_db2' => 'IBM DB2',
'config-support-info' => 'MediaWiki podpira naslednje sisteme zbirk podatkov:
$1
@@ -17795,13 +18373,12 @@ $1
'config-header-postgres' => 'Nastavitve PostgreSQL',
'config-header-sqlite' => 'Nastavitve SQLite',
'config-header-oracle' => 'Nastavitve Oracle',
- 'config-header-ibm_db2' => 'Nastavitve IBM DB2',
'config-invalid-db-type' => 'Neveljavna vrsta zbirke podatkov',
'config-missing-db-name' => 'Vnesti morate vrednost za »Ime zbirke podatkov«',
'config-missing-db-host' => 'Vnesti morate vrednost za »Gostitelj zbirke podatkov«',
'config-missing-db-server-oracle' => 'Vnesti morate vrednost za »TNS zbirke podatkov«',
'config-invalid-db-server-oracle' => 'Neveljaven TNS zbirke podatkov »$1«.
-Uporabljajte samo Ärke ASCII (a-z, A-Z), Å¡tevilke (0-9), podÄrtaje (_) in pike (.).',
+Uporabite ali "ime TNS" ali niz "Easy Connect" ([http://docs.oracle.com/cd/E11882_01/network.112/e10836/naming.htm NaÄini poimenovanja Oracle])',
'config-invalid-db-name' => 'Neveljavno ime zbirke podatkov »$1«.
Uporabljajte samo Ärke ASCII (a-z, A-Z), Å¡tevilke (0-9), podÄrtaje (_) in vezaje (-).',
'config-invalid-db-prefix' => 'Neveljavna predpona zbirke podatkov »$1«.
@@ -17818,7 +18395,7 @@ Preverite mapo podatkov in ime zbirke podatkov spodaj ter poskusite znova.',
'config-upgrade-done-no-regenerate' => 'Nadgradnja je konÄana.
Sedaj lahko [$1 zaÄnete uporabljati vaÅ¡ wiki].',
- 'config-regenerate' => 'Ponovno ustvari <code>LocalSettings.php</code> →',
+ 'config-regenerate' => 'Ponovno ustvari LocalSettings.php →',
'config-show-table-status' => 'Poizvedba <code>SHOW TABLE STATUS</code> ni uspela!',
'config-unknown-collation' => "'''Opozorilo:''' Zbirke podatkov uporablja neprepoznano razvrÅ¡Äanje znakov.",
'config-db-web-account' => 'RaÄun zbirke podatkov za spletni dostop',
@@ -17860,7 +18437,7 @@ DoloÄite drugo uporabniÅ¡ko ime.',
'config-admin-error-bademail' => 'Vnesli ste neveljaven e-poštni naslov.',
'config-subscribe' => 'NaroÄite se na [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce poÅ¡tni seznam obvestil o izdajah].',
'config-almost-done' => 'Skoraj ste že konÄali!
-Sedaj lahko preskoÄite preostalo konfiguriranje in zdaj namestite wiki.',
+Preostalo konfiguriranje lahko zdaj preskoÄite in wiki takoj namestite.',
'config-optional-continue' => 'Zastavi mi veÄ vpraÅ¡anj.',
'config-optional-skip' => 'Se že dolgoÄasim; samo namesti wiki.',
'config-profile' => 'Profil uporabniških pravic:',
@@ -17906,8 +18483,13 @@ Vnesite ime dovoljenja roÄno.',
'config-download-localsettings' => 'Prenesi <code>LocalSettings.php</code>',
'config-help' => 'pomoÄ',
'mainpagetext' => "'''Programje MediaWiki je bilo uspeÅ¡no nameÅ¡Äeno.'''",
- 'mainpagedocfooter' => 'Za uporabo in pomoÄ pri nastavitvi, prosimo, preglejte [//meta.wikimedia.org/wiki/MediaWiki_localisation dokumentacijo za prilagajanje vmesnika]
-in [//meta.wikimedia.org/wiki/MediaWiki_User%27s_Guide UporabniÅ¡ki priroÄnik].', # Fuzzy
+ 'mainpagedocfooter' => 'Oglejte si [//meta.wikimedia.org/wiki/Help:Contents UporabniÅ¡ki priroÄnik] za informacije o uporabi programja wiki.
+
+== Kako zaÄeti ==
+* [//www.mediawiki.org/wiki/Manual:Configuration_settings Seznam konfiguracijskih nastavitev]
+* [//www.mediawiki.org/wiki/Manual:FAQ Poogsto zastavljena vprašanja MediaWiki]
+* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce Poštni seznam izdaj MediaWiki]
+* [//www.mediawiki.org/wiki/Localisation#Translation_resources Prevedite MediaWiki v svoj jezik]',
);
/** Lower Silesian (Schläsch)
@@ -17921,7 +18503,7 @@ $messages['sli'] = array(
* [//www.mediawiki.org/wiki/Manual:Configuration_settings Liste der Konfigurationsvariablen]
* [//www.mediawiki.org/wiki/Manual:FAQ MediaWiki-FAQ]
-* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce Mailingliste neuer MediaWiki-Versionen]',
+* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce Mailingliste neuer MediaWiki-Versionen]', # Fuzzy
);
/** Somali (Soomaaliga)
@@ -17933,7 +18515,7 @@ $messages['so'] = array(
== Bilaaw ==
* [//www.mediawiki.org/wiki/Manual:Configuration_settings Configuration settings list]
* [//www.mediawiki.org/wiki/Manual:FAQ MediaWiki FAQ]
-* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce MediaWiki release mailing list]",
+* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce MediaWiki release mailing list]", # Fuzzy
);
/** Albanian (shqip)
@@ -17945,7 +18527,7 @@ $messages['sq'] = array(
== Sa për fillim==
* [//www.mediawiki.org/wiki/Help:Configuration_settings Parazgjedhjet e MediaWiki-t]
* [//www.mediawiki.org/wiki/Help:FAQ Pyetjet e shpeshta rreth MediaWiki-t]
-* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce Njoftime rreth MediaWiki-t]',
+* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce Njoftime rreth MediaWiki-t]', # Fuzzy
);
/** Serbian (Cyrillic script) (ÑрпÑки (ћирилица)‎)
@@ -17991,7 +18573,7 @@ $messages['sr-ec'] = array(
== Увод ==
* [//www.mediawiki.org/wiki/Manual:Configuration_settings Помоћ у вези Ñа подешавањима]
* [//www.mediawiki.org/wiki/Manual:FAQ ЧеÑто поÑтављена питања]
-* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce ДопиÑна лиÑта о издањима Медијавикија]',
+* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce ДопиÑна лиÑта о издањима Медијавикија]', # Fuzzy
);
/** Serbian (Latin script) (srpski (latinica)‎)
@@ -18035,7 +18617,7 @@ Proverite Vaš php.ini i obezbedite da je <code>session.save_path</code> postavl
== Za poÄetak ==
* [//www.mediawiki.org/wiki/Manual:Configuration_settings Pomoć u vezi sa podešavanjima]
* [//www.mediawiki.org/wiki/Manual:FAQ NajÄešće postavljena pitanja]
-* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce Mejling lista o izdanjima MedijaVikija]',
+* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce Mejling lista o izdanjima MedijaVikija]', # Fuzzy
);
/** Sranan Tongo (Sranantongo)
@@ -18048,7 +18630,7 @@ $messages['srn'] = array(
* [//www.mediawiki.org/wiki/Manual:Configuration_settings Den seti]
* [//www.mediawiki.org/wiki/Manual:FAQ Sani di ben aksi furu (FAQ)]
-* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce Boskopu grupu gi nyun meki]',
+* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce Boskopu grupu gi nyun meki]', # Fuzzy
);
/** Swati (SiSwati)
@@ -18062,17 +18644,18 @@ $messages['ss'] = array(
*/
$messages['stq'] = array(
'mainpagetext' => "'''Ju MediaWiki Software wuude mäd Ärfoulch installierd.'''",
- 'mainpagedocfooter' => 'Sjuch ju [//meta.wikimedia.org/wiki/MediaWiki_localization Dokumentation tou de Anpaasenge fon dän Benutseruurfläche] un dät [//meta.wikimedia.org/wiki/Help:Contents Benutserhondbouk] foar Hälpe tou ju Benutsenge un Konfiguration.',
+ 'mainpagedocfooter' => 'Sjuch ju [//meta.wikimedia.org/wiki/MediaWiki_localization Dokumentation tou de Anpaasenge fon dän Benutseruurfläche] un dät [//meta.wikimedia.org/wiki/Help:Contents Benutserhondbouk] foar Hälpe tou ju Benutsenge un Konfiguration.', # Fuzzy
);
/** Sundanese (Basa Sunda)
*/
$messages['su'] = array(
'mainpagetext' => "'''''Software'' MediaWiki geus diinstal.'''",
- 'mainpagedocfooter' => "Mangga tingal ''[//meta.wikimedia.org/wiki/MediaWiki_localisation documentation on customizing the interface]'' jeung [//meta.wikimedia.org/wiki/MediaWiki_User%27s_Guide Tungtunan Pamaké] pikeun pitulung maké jeung konfigurasi.",
+ 'mainpagedocfooter' => "Mangga tingal ''[//meta.wikimedia.org/wiki/MediaWiki_localisation documentation on customizing the interface]'' jeung [//meta.wikimedia.org/wiki/MediaWiki_User%27s_Guide Tungtunan Pamaké] pikeun pitulung maké jeung konfigurasi.", # Fuzzy
);
/** Swedish (svenska)
+ * @author Jopparn
* @author Skalman
* @author WikiPhoenix
*/
@@ -18080,8 +18663,20 @@ $messages['sv'] = array(
'config-desc' => 'Installationsprogram för MediaWiki',
'config-title' => 'Installation av MediaWiki $1',
'config-information' => 'Information',
+ 'config-localsettings-upgrade' => 'A <code>LocalSettings.php</code>-fil har upptäckts.
+För att uppgradera den här installationen, vänligen ange värdet för <code>$wgUpgradeKey</code> i rutan nedan.
+Du hittar den i <code>LocalSettings.php</code>.',
+ 'config-localsettings-cli-upgrade' => 'En <code>LocalSettings.php</code>-fil har upptäckts.
+För att uppgradera denna installation, kör <code>update.php</code> istället',
'config-localsettings-key' => 'Uppgraderingsnyckel:',
'config-localsettings-badkey' => 'Nyckeln du angav är inkorrekt.',
+ 'config-upgrade-key-missing' => 'En nuvarande installerade av MediaWiki har upptäckts.
+För att uppgradera installationen, lägg till följande rad i slutet av din <code>LocalSettings.php</code>:
+
+$1',
+ 'config-localsettings-incomplete' => 'De befintliga <code>LocalSettings.php</code> verkar vara ofullständig.
+Variabeln $1 är inte inställd.
+Ändra <code>LocalSettings.php</code> så att denna variabel är inställd och klicka på "{{int:Config-continue}}".',
'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.',
@@ -18122,21 +18717,50 @@ 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-outdated-sqlite' => "'''Varning:''' du har SQLite $1, vilket är lägre än minimikravet version $2. SQLite kommer inte att vara tillgänglig.",
+ 'config-register-globals' => "'''Varning: PHP:s <code>[http://php.net/register_globals register_globals]</code> tillval är aktiverat.'''
+'''Inaktivera den om du kan.'''
+MediaWiki kommer att fungera, men din server exponeras för potentiella säkerhetsluckor.",
+ 'config-safe-mode' => "''' Varning:''' PHP:s [http://www.php.net/features.safe-mode felsäkert läge] är aktivt.
+Det kan orsaka problem, särskilt om du använder filöverföringar och <code>math</code>-stöd.",
+ 'config-xml-bad' => 'PHP:s XML-modul saknas.
+MediaWiki kräver funktioner i denna modul och kommer inte att fungera i den här konfigurationen.
+Om du kör Mandrake, installera php-xml-paketet.',
+ 'config-memory-raised' => 'PHPs <code>memory_limit</code> är $1, ökar till $2.',
+ 'config-memory-bad' => "''' Varning:''' PHP:s <code>memory_limit</code> är $1.
+Detta är förmodligen för lågt.
+Installationen kan misslyckas!",
'config-xcache' => '[http://xcache.lighttpd.net/ XCache] är installerad',
'config-apc' => '[http://www.php.net/apc APC] är installerad',
'config-wincache' => '[http://www.iis.net/download/WinCacheForPhp WinCache] är installerad',
'config-diff3-bad' => 'GNU diff3 hittades inte.',
+ 'config-git-bad' => 'Git-versionen av kontrollmjukvaran hittades inte.',
+ 'config-no-uri' => "'''Fel:''' Kunde inte fastställa det nuvarande URI:et.
+Installationen avbröts.",
+ 'config-no-cli-uri' => "'''Varning:''' inget --scriptpath är anget, med standarden: <code>$1</code> .",
'config-using-server' => 'Använder servernamn "<nowiki>$1</nowiki>".',
'config-using-uri' => 'Använder server-URL "<nowiki>$1$2</nowiki>".',
+ 'config-no-cli-uploads-check' => "'''Varning:''' Din standardkatalog för uppladdningar (<code>$1</code>) inte är kontrollerad för sårbarhet från godtyckliga skriptkörning under CLI-installationen.",
'config-db-type' => 'Databastyp:',
+ 'config-db-host' => 'Databasvärd:',
'config-db-wiki-settings' => 'Identifiera denna wiki',
'config-db-name' => 'Databasnamn:',
'config-db-name-oracle' => 'Databasschema:',
'config-db-install-account' => 'Användarkonto för installation',
'config-db-username' => 'Databas-användarnamn:',
'config-db-password' => 'Databas-lösenord:',
+ 'config-db-password-empty' => 'Ange ett lösenord för den nya databasanvändaren: $1.
+Även om det kan vara möjligt att skapa användare utan lösenord är det inte säkert.',
+ 'config-db-account-lock' => 'Använda samma användarnamn och lösenord under normal drift',
+ 'config-db-wiki-account' => 'Användarkonto för normal drift',
+ 'config-db-prefix' => 'Prefix för tabellerna i databasen:',
+ '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 bakåtkompatibel UTF-8',
'config-db-port' => 'Databasport:',
'config-db-schema' => 'Schema för MediaWiki',
+ 'config-pg-test-error' => "Kan inte ansluta till databas '''$1''': $2",
+ 'config-sqlite-dir' => 'SQLite data-katalog:',
'config-header-mysql' => 'MySQL-inställningar',
'config-header-postgres' => 'PostgreSQL-inställningar',
'config-header-sqlite' => 'SQLite-inställningar',
@@ -18144,6 +18768,7 @@ MediaWiki kräver PHP $2 eller högre.',
'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-missing-db-server-oracle' => 'Du måste ange ett värde för "Databas TNS"',
'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.
@@ -18153,8 +18778,17 @@ Använd bara ASCII-bokstäver (a-z, A-Z), siffror (0-9), understreck (_) och bin
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 (-).',
+ 'config-db-sys-create-oracle' => 'Installationsprogrammet stöder endast med ett SYSDBA-konto för att skapa ett nytt konto.',
'config-db-sys-user-exists-oracle' => 'Användarkontot "$1" finns redan. SYSDBA kan endast användas för att skapa ett nytt konto!',
'config-postgres-old' => 'PostgreSQL $1 eller senare krävs, du har $2.',
+ 'config-sqlite-name-help' => 'Välja ett namn som identifierar din wiki.
+Använd inte mellanslag eller bindestreck.
+Detta kommer att användas för SQLite-data filnamnet.',
+ 'config-sqlite-readonly' => 'Filen <code>$1</code> är inte skrivbar.',
+ 'config-sqlite-cant-create-db' => 'Kunde inte skapa databasfilen <code>$1</code>.',
+ 'config-sqlite-fts3-downgrade' => 'PHP saknar stöd för FTS3, nedgraderar tabeller',
+ 'config-can-upgrade' => "Det finns MediaWiki-tabeller i den här databasen.
+För att uppgradera dem till MediaWiki $1, klicka på '''Fortsätt'''.",
'config-upgrade-done' => "Uppgraderingen slutfördes.
Du kan nu [$1 börja använda din wiki].
@@ -18164,6 +18798,8 @@ Detta '''rekommenderas inte''' om du har problem med din wiki.",
'config-upgrade-done-no-regenerate' => 'Uppgraderingen slutfördes.
Du kan nu [$1 börja använda din wiki].',
+ 'config-regenerate' => 'Återskapa LocalSettings.php →',
+ 'config-db-web-account' => 'Databaskonto för webbaccess',
'config-db-web-account-same' => 'Använd samma konto som för installation',
'config-db-web-create' => 'Skapa kontot om det inte redan finns',
'config-mysql-engine' => 'Lagringsmotor:',
@@ -18172,6 +18808,8 @@ Du kan nu [$1 börja använda din wiki].',
'config-site-name' => 'Namnet på wikin:',
'config-site-name-blank' => 'Ange ett sidnamn.',
'config-ns-generic' => 'Projekt',
+ 'config-ns-site-name' => 'Samma som wikinamnet: $1',
+ 'config-ns-other' => 'Annan (specificera)',
'config-ns-invalid' => 'Den angivna namnrymden "<nowiki>$1</nowiki>" är ogiltig.
Ange ett annat namnrymd för projektet.',
'config-ns-conflict' => 'Den angivna namnrymden "<nowiki>$1</nowiki>" står i konflikt med en standardnamnrymd för MediaWiki.
@@ -18189,12 +18827,16 @@ Ange ett annat användarnamn.',
'config-admin-password-same' => 'Lösenordet får inte vara samma som användarnamnet.',
'config-admin-password-mismatch' => 'De två lösenord du uppgett överensstämmer inte med varandra.',
'config-admin-email' => 'E-postadress:',
+ 'config-admin-error-user' => 'Internt fel när du skapar en administratör med namnet "<nowiki>$1</nowiki>".',
+ 'config-admin-error-password' => 'Internt fel när du väljer ett lösenord för administratören "<nowiki>$1</nowiki>": <pre>$2</pre>',
'config-admin-error-bademail' => 'Du har angivit en felaktigt e-postadress.',
+ 'config-subscribe' => 'Prenumerera på [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce e-postlistan för tillkännagivanden].',
'config-almost-done' => 'Du är nästan färdig!
Du kan nu hoppa över återstående konfigurationer och installera wikin nu.',
'config-optional-continue' => 'Ställ fler frågor till mig.',
'config-optional-skip' => 'Jag är redan uttråkad, bara installera wiki.',
'config-profile-wiki' => 'Öppen wiki',
+ 'config-profile-no-anon' => 'Kontoskapande krävs',
'config-profile-fishbowl' => 'Endast auktoriserade redigerare',
'config-profile-private' => 'Privat wiki',
'config-license' => 'Upphovsrätt och licens:',
@@ -18207,31 +18849,54 @@ Du kan nu hoppa över återstående konfigurationer och installera wikin nu.',
'config-license-pd' => 'Allmän egendom',
'config-license-cc-choose' => 'Välj en anpassad Creative Commons-licens',
'config-email-settings' => 'E-postinställningar',
+ 'config-enable-email' => 'Aktivera utgående e-post',
+ 'config-email-user' => 'Aktivera e-post mellan användare',
+ 'config-email-user-help' => 'Tillåta alla användare att skicka mail till varandra om de har aktiverat det i deras preferenser.',
+ 'config-email-usertalk' => 'Aktivera underrättelse för användardiskussionssidan',
'config-email-watchlist' => 'Aktivera meddelanden för bevakningslistan',
+ 'config-email-auth' => 'Aktivera autentisering via e-post',
'config-upload-settings' => 'Bild- och filuppladdningar',
'config-upload-enable' => 'Aktivera filöverföringar',
'config-upload-deleted' => 'Mapp för raderade filer:',
'config-logo' => 'Logotyp-URL:',
+ 'config-instantcommons' => 'Aktivera Instant Commons',
+ 'config-cc-error' => 'Creative Commons-licens-väljaren gav inget resultat.
+Ange licensnamnet manuellt.',
'config-cc-again' => 'Välj igen...',
+ 'config-cc-not-chosen' => 'Välj vilken Creative Commons-licens du vill ha och klicka på "gå vidare".',
'config-advanced-settings' => 'Avancerad konfiguration',
'config-extensions' => 'Tillägg',
+ 'config-install-alreadydone' => "''' Varning:''' Du verkar redan ha installerat MediaWiki och försöker installera det igen.
+Vänligen fortsätt till nästa sida.",
+ 'config-install-begin' => 'Genom att trycka på "{{int:config-continue}}", påbörjar du installationen av MediaWiki.
+Om du fortfarande vill göra ändringar trycker du på "{{int:config-back}}".',
'config-install-step-done' => 'klar',
'config-install-step-failed' => 'misslyckades',
'config-install-database' => 'Konfigurerar databas',
'config-install-schema' => 'Skapar schema',
+ 'config-pg-no-plpgsql' => 'Du måste installera språket PL/pgSQL i databasen $1',
'config-install-user' => 'Skapar databasanvändare',
'config-install-user-alreadyexists' => 'Användaren "$1" finns redan',
'config-install-user-create-failed' => 'Misslyckades att skapa användare "$1": $2',
+ 'config-install-user-grant-failed' => 'Beviljandet av behörighet till användaren "$1" misslyckades: $2',
'config-install-user-missing' => 'Den angivna användaren "$1" existerar inte.',
+ 'config-install-user-missing-create' => 'Den angivna användaren "$1" existerar inte.
+Vänligen klicka på kryssrutan "skapa konto" nedan om du vill skapa den.',
'config-install-tables' => 'Skapar tabeller',
+ 'config-install-tables-exist' => "''' Varning:''' MediaWiki-tabeller verkar redan finnas.
+Hoppar över skapandet.",
+ 'config-install-tables-failed' => "''' Fel:''' Skapandet av tabell misslyckades med följande fel: $1",
'config-install-interwiki' => 'Lägger till standardtabell för interwiki',
'config-install-interwiki-list' => 'Kunde inte läsa filen <code>interwiki.list</code>.',
'config-install-stats' => 'Initierar statistik',
'config-install-keys' => 'Genererar hemliga nycklar',
'config-insecure-keys' => "'''Varning:''' {{PLURAL:$2|En säkerhetsnyckel|Säkerhetsnycklar}} ($1) som generades under installationen är inte helt {{PLURAL:$2|säker|säkra}} . Överväg att ändra {{PLURAL:$2|den|dem}} manuellt.",
'config-install-sysop' => 'Skapar administratörskonto',
+ 'config-install-subscribe-fail' => 'Det gick inte att prenumerera på mediawiki-announce: $1',
+ 'config-install-subscribe-notpossible' => 'cURL är inte installerad och allow_url_fopen är inte tillgänglig.',
'config-install-mainpage' => 'Skapa huvudsida med standardinnehåll',
'config-install-extension-tables' => 'Skapar tabeller för aktiverade tillägg',
+ 'config-install-mainpage-failed' => 'Kunde inte infoga huvudsidan: $1',
'config-install-done' => "'''Grattis!'''
Du har installerat MediaWiki.
@@ -18270,7 +18935,7 @@ $messages['sw'] = array(
== Msaada wa kianzio ==
* [//www.mediawiki.org/wiki/Manual:Configuration_settings Orodha ya mipangilio ya msingi]
* [//www.mediawiki.org/wiki/Manual:FAQ FAQ ya MediaWiki]
-* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce Orodha ya utoaji wa habari za MediaWiki]',
+* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce Orodha ya utoaji wa habari za MediaWiki]', # Fuzzy
);
/** Silesian (ślůnski)
@@ -18283,7 +18948,7 @@ $messages['szl'] = array(
== Na sztart ==
* [//www.mediawiki.org/wiki/Manual:Configuration_settings Lista sztalowań konfiguracyje]
* [//www.mediawiki.org/wiki/Manual:FAQ MediaWiki FAQ]
-* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce Komuńikaty uo nowych wersyjach MediaWiki]',
+* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce Komuńikaty uo nowych wersyjach MediaWiki]', # Fuzzy
);
/** Tamil (தமிழà¯)
@@ -18400,7 +19065,7 @@ $messages['tcy'] = array(
* [//www.mediawiki.org/wiki/Manual:Configuration_settings Configuration settings list]
* [//www.mediawiki.org/wiki/Manual:FAQ ಮೀಡಿಯವಿಕಿ FAQ]
-* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce MediaWiki release mailing list]',
+* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce MediaWiki release mailing list]', # Fuzzy
);
/** Telugu (తెలà±à°—à±)
@@ -18446,7 +19111,7 @@ $messages['te'] = array(
'config-admin-password-confirm' => 'సంకేతపదం మళà±à°³à±€:',
'config-admin-email' => 'à°ˆ-మెయిలౠచిరà±à°¨à°¾à°®à°¾:',
'config-optional-continue' => 'ననà±à°¨à± మరినà±à°¨à°¿ à°ªà±à°°à°¶à±à°¨à°²à± à°…à°¡à±à°—à±.',
- 'config-profile-wiki' => 'సంపà±à°°à°¦à°¾à°¯ వికీ',
+ 'config-profile-wiki' => 'సంపà±à°°à°¦à°¾à°¯ వికీ', # Fuzzy
'config-profile-no-anon' => 'ఖాతా సృషà±à°Ÿà°¿à°‚పౠతపà±à°ªà°¨à°¿à°¸à°°à°¿',
'config-profile-private' => 'అంతరంగిక వికీ',
'config-license' => 'కాపీహకà±à°•à±à°²à± మరియౠలైసెనà±à°¸à±:',
@@ -18464,7 +19129,7 @@ $messages['te'] = array(
* [//www.mediawiki.org/wiki/Manual:Configuration_settings మీడియావికీ పనితీరà±, అమరిక మారà±à°šà±à°•à±à°¨à±‡à°‚à°¦à±à°•à± వీలà±à°•à°²à±à°ªà°¿à°‚చే à°šà°¿à°¹à±à°¨à°¾à°² జాబితా]
* [//www.mediawiki.org/wiki/Manual:FAQ మీడియావికీపై తరà±à°šà±à°—à°¾ అడిగే à°ªà±à°°à°¶à±à°¨à°²à±]
-* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce మీడియావికీ సాఫà±à°Ÿà±à°µà±‡à°°à± కొతà±à°¤ వెరà±à°·à°¨à± విడà±à°¦à°²à°² à°—à±à°°à°¿à°‚à°šà°¿ తెలిపే మెయిలింగౠలిసà±à°Ÿà±]',
+* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce మీడియావికీ సాఫà±à°Ÿà±à°µà±‡à°°à± కొతà±à°¤ వెరà±à°·à°¨à± విడà±à°¦à°²à°² à°—à±à°°à°¿à°‚à°šà°¿ తెలిపే మెయిలింగౠలిసà±à°Ÿà±]', # Fuzzy
);
/** Tetum (tetun)
@@ -18485,7 +19150,7 @@ $messages['tg-cyrl'] = array(
* [//www.mediawiki.org/wiki/Manual:Configuration_settings ФеҳриÑти танзимоти пайгирбандӣ]
* [//www.mediawiki.org/wiki/Manual:FAQ ПурÑишҳои МедиаВики]
-* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce ФеҳриÑти ройномаҳои нуÑхаҳои МедиаВики]',
+* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce ФеҳриÑти ройномаҳои нуÑхаҳои МедиаВики]', # Fuzzy
);
/** Tajik (Latin script) (tojikī)
@@ -18499,7 +19164,7 @@ $messages['tg-latn'] = array(
* [//www.mediawiki.org/wiki/Manual:Configuration_settings Fehristi tanzimoti pajgirbandī]
* [//www.mediawiki.org/wiki/Manual:FAQ PursiÅŸhoi MediaViki]
-* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce Fehristi rojnomahoi nusxahoi MediaViki]',
+* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce Fehristi rojnomahoi nusxahoi MediaViki]', # Fuzzy
);
/** Thai (ไทย)
@@ -18513,7 +19178,7 @@ $messages['th'] = array(
* [//www.mediawiki.org/wiki/Manual:Configuration_settings รายà¸à¸²à¸£à¸à¸²à¸£à¸›à¸£à¸±à¸šà¹à¸•à¹ˆà¸‡à¸£à¸°à¸šà¸š] (ภาษาอังà¸à¸¤à¸©)
* [//www.mediawiki.org/wiki/Manual:FAQ คำถามที่ถามบ่อยในมีเดียวิà¸à¸´] (ภาษาอังà¸à¸¤à¸©)
-* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce เมลลิงลิสต์ของมีเดียวิà¸à¸´]',
+* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce เมลลิงลิสต์ของมีเดียวิà¸à¸´]', # Fuzzy
);
/** Turkmen (Türkmençe)
@@ -18526,7 +19191,7 @@ $messages['tk'] = array(
== Öwrenjeler ==
* [//www.mediawiki.org/wiki/Manual:Configuration_settings Konfigurasiýa sazlamalary]
* [//www.mediawiki.org/wiki/Manual:FAQ MediaWiki SSS]
-* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce MediaWiki e-poçta sanawy]',
+* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce MediaWiki e-poçta sanawy]', # Fuzzy
);
/** Tagalog (Tagalog)
@@ -18757,7 +19422,6 @@ Isaalang-alang ang paglalagay na magkakasama ang kalipunan ng dato sa ibang luga
'config-type-postgres' => 'PostgreSQL',
'config-type-sqlite' => 'SQLite',
'config-type-oracle' => 'Oracle',
- 'config-type-ibm_db2' => 'DB2 ng IBM',
'config-support-info' => 'Sinusuportahan ng MediaWiki ang sumusunod na mga sistema ng kalipunan ng dato:
$1
@@ -18767,12 +19431,10 @@ Kung hindi mo makita ang sistema ng kalipunan ng dato na sinusubukan mong gamiti
'config-support-postgres' => '* Ang $1 ay isang bantog na sistema ng kalipunan ng dato na bukas ang pinagmulan na panghalili sa MySQL ([http://www.php.net/manual/en/pgsql.installation.php paano magtipon ng PHP na mayroong suporta ng PostgreSQL]). Maaaring mayroong ilang hindi pangunahing mga surot na natitira pa, at hindi iminumungkahi para gamitin sa loob ng isang kapaligiran ng produksiyon.',
'config-support-sqlite' => 'Ang $1 ay isang magaan ang timbang na sistema ng kalipunan ng dato na sinusuportahan nang napaka mainam. ([http://www.php.net/manual/en/pdo.installation.php Paano magtipon ng PHP na mayroong suporta ng SQLite], gumagamit ng PDO)',
'config-support-oracle' => '* Ang $1 ay isang kalipunan ng dato ng kasigasigang pangkalakal. ([http://www.php.net/manual/en/oci8.installation.php Paano magtipunan ng PHP na mayroong suporta ng OCI8])',
- 'config-support-ibm_db2' => '* Ang $1 ay isang kalipunan ng dato ng kasigasigang pangkalakal.', # Fuzzy
'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-header-ibm_db2' => 'Mga katakdaan ng DB2 ng IBM',
'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 dato"',
'config-missing-db-host' => 'Dapat kang magpasok ng isang halaga para sa "Tagapagpasinaya ng kalipunan ng dato"',
@@ -18834,7 +19496,7 @@ Kung nais mong muling likhain ang iyong talaksang <code>LocalSettings.php</code>
'config-upgrade-done-no-regenerate' => 'Buo na ang pagsasapanahon.
Maaari ka na ngayong [$1 magsimula sa paggamit ng wiki mo].',
- 'config-regenerate' => 'Muling likhain ang <code>LocalSettings.php</code> →',
+ 'config-regenerate' => 'Muling likhain ang LocalSettings.php →',
'config-show-table-status' => 'Nabigo ang pagtatanong na IPAKITA ANG KALAGAYAN NG TALAHANAYAN!', # Fuzzy
'config-unknown-collation' => "'''Babala:''' Ang kalipunan ng dato ay gumagagamit ng hindi nakikilalang pag-iipon.",
'config-db-web-account' => 'Akawnt ng kalipunan ng dato para sa pagpunta sa web',
@@ -18864,7 +19526,6 @@ May gawi ang mga kalipunan ng dato ng MyISAM na masira nang mas madalas kaysa sa
Mas kapaki-pakinabang ito kaysa sa gawi na UTF-8 ng MySQL, at nagpapahintulot sa iyo upang magamit ang buong kasaklawan ng mga panitik ng Unikodigo.
Sa ''gawi na UTF-8''', malalaman ng MySQL kung sa anong pangkat ng panitik nakapaloob ang iyong dato, at angkop na makakapagharap at makapapagpalit nito, subalit hindi ka nito papayagan na mag-imbak ng mga panitik na nasa itaas ng [//en.wikipedia.org/wiki/Mapping_of_Unicode_character_planes Basic Multilingual Plane] o Saligang Tapyas na Pangmaramihang Wika.",
- 'config-ibm_db2-low-db-pagesize' => "Ang kalipunan mo ng dato na DB2 ay mayroong isang likas na nakatakdang puwang ng talahanayan na mayroong hindi sapat na sukat ng pahina. Ang sukat ng pahina ay dapat na maging '''32K''' o mas mataas.",
'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.',
@@ -18972,7 +19633,7 @@ Ideyal na dapat itong hindi mapupuntahan mula sa web.',
'config-logo-help' => 'Ang likas na nakatakdang pabalat ng MediaWiki ay nagsasama ng puwang para sa isang logong 135x160 ang piksel na nasa itaas ng menu ng panggilid na bareta.
Magkargang papaitaas ng isang imahe na mayroong naaangkop na sukat, at ipasok dito ang URL.
-Kung ayaw mo ng isang logo, iwanang walang laman ang kahong ito.',
+Kung ayaw mo ng isang logo, iwanang walang laman ang kahong ito.', # Fuzzy
'config-instantcommons' => 'Paganahin ang Mga Pangkaraniwang Biglaan',
'config-instantcommons-help' => 'Ang [//www.mediawiki.org/wiki/InstantCommons Instant Commons] ay isang tampok na nagpapahintulot sa mga wiki upang gumamit ng mga imahe, mga tunog at iba pang mga midyang matatagpuan sa pook ng [//commons.wikimedia.org/ Wikimedia Commons].
Upang magawa ito, nangangailangan ang MediaWiki ng pagka nakakapunta sa Internet.
@@ -19091,7 +19752,7 @@ $messages['tr'] = array(
== Yeni BaÅŸlayanlar ==
* [//www.mediawiki.org/wiki/Manual:Configuration_settings Yapılandırma ayarlarının listesi]
* [//www.mediawiki.org/wiki/Manual:FAQ MediaWiki SSS]
-* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce MediaWiki e-posta listesi]',
+* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce MediaWiki e-posta listesi]', # Fuzzy
);
/** Tatar (Cyrillic script) (татарча)
@@ -19104,7 +19765,7 @@ $messages['tt-cyrl'] = array(
== Кайбер файдалы реÑурÑлар ==
* [//www.mediawiki.org/wiki/Manual:Configuration_settings Көйләнмәләр иÑемлеге (инг.)];
* [//www.mediawiki.org/wiki/Manual:FAQ MediaWiki турында еш бирелгән Ñораулар һәм җаваплар (инг.)];
-* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce MediaWiki'ның Ñңа верÑиÑләре турында хәбәрләр Ñздырып алу].",
+* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce MediaWiki'ның Ñңа верÑиÑләре турында хәбәрләр Ñздырып алу].", # Fuzzy
);
/** Tatar (Latin script) (tatarça)
@@ -19117,7 +19778,7 @@ $messages['tt-latn'] = array(
== Qayber faydalı resurslar ==
* [//www.mediawiki.org/wiki/Manual:Configuration_settings Köylänmälär isemlege (ing.)];
* [//www.mediawiki.org/wiki/Manual:FAQ MediaWiki turında yış birelgän sorawlar häm cawaplar (ing.)];
-* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce MediaWiki'nıñ yaña versiäläre turında xäbärlär yazdırıp alu].",
+* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce MediaWiki'nıñ yaña versiäläre turında xäbärlär yazdırıp alu].", # Fuzzy
);
/** Udmurt (удмурт)
@@ -19137,13 +19798,14 @@ $messages['ug-arab'] = array(
== دەسلەپكى ساۋات ==
* [//www.mediawiki.org/wiki/Manual:Configuration_settings سەپلىمە تەڭشەك تىزىملىكى]
* [//www.mediawiki.org/wiki/Manual:FAQ MediaWiki كۆپ ئۇچرايدىغان مەسىلىلەرگە جاۋاب]
-* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce MediaWiki تارقاتقان ئÛلخەت تىزىملىكى]',
+* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce MediaWiki تارقاتقان ئÛلخەت تىزىملىكى]', # Fuzzy
);
/** Ukrainian (українÑька)
* @author AS
* @author Ahonc
* @author Alex Khimich
+ * @author Andriykopanytsia
* @author Base
* @author Diemon.ukr
* @author Ðта
@@ -19201,8 +19863,8 @@ $1',
'config-help-restart' => 'Ви бажаєте видалити вÑÑ– введені та збережені вами дані Ñ– запуÑтити Ð¿Ñ€Ð¾Ñ†ÐµÑ ÑƒÑтановки Ñпочатку?',
'config-restart' => 'Так, перезапуÑтити уÑтановку',
'config-welcome' => '=== Перевірка Ð¾Ñ‚Ð¾Ñ‡ÐµÐ½Ð½Ñ ===
-ПроводÑÑ‚ÑŒÑÑ Ð±Ð°Ð·Ð¾Ð²Ñ– перевірки, щоб виÑвити, чи можлива уÑтановка MediaWiki у даній ÑиÑтемі.
-Вкажіть результати цих перевірок при зверненні за допомогою під Ñ‡Ð°Ñ ÑƒÑтановки.',
+Будуть проведені базові перевірки, щоб виÑвити, чи можлива уÑтановка MediaWiki у даній ÑиÑтемі.
+Ðе забудьте включити цю інформацію, Ñкщо ви звернетеÑÑ Ð¿Ð¾ підтримку, Ñк завершити уÑтановку.',
'config-copyright' => "=== ÐвторÑьке право Ñ– умови ===
$1
@@ -19270,6 +19932,10 @@ MediaWiki вимагає підтримку UTF-8 Ð´Ð»Ñ ÐºÐ¾Ñ€ÐµÐºÑ‚Ð½Ð¾Ñ— ро
Імовірно, це замало.
Ð’ÑÑ‚Ð°Ð½Ð¾Ð²Ð»ÐµÐ½Ð½Ñ Ð¼Ð¾Ð¶Ðµ не вдатиÑÑŒ!",
'config-ctype' => "'''Помилка''': PHP має бути зібраним з підтримкою [http://www.php.net/manual/en/ctype.installation.php Ñ€Ð¾Ð·ÑˆÐ¸Ñ€ÐµÐ½Ð½Ñ Ctype].",
+ 'config-json' => "'''Fatal:''' PHP був Ñкомпільований без підтримки JSON.
+Вам потрібно вÑтановити або Ñ€Ð¾Ð·ÑˆÐ¸Ñ€ÐµÐ½Ð½Ñ PHP JSON або розширеннÑ[http://pecl.php.net/package/jsonc PECL jsonc] перед вÑÑ‚Ð°Ð½Ð¾Ð²Ð»ÐµÐ½Ð½Ñ ÐœÐµÐ´Ñ–Ð°Ð²Ñ–ÐºÑ–.
+* Ð Ð¾Ð·ÑˆÐ¸Ñ€ÐµÐ½Ð½Ñ PHP включено у Red Hat Enterprise Linux (CentOS) 5 та 6, хоча має бути доÑтупним у <code>/etc/php.ini</code> або <code>/etc/php.d/json.ini</code>.
+* ДеÑкі диÑтрибутиви ЛінукÑа, випущені піÑÐ»Ñ Ñ‚Ñ€Ð°Ð²Ð½Ñ 2013, пропуÑтили Ñ€Ð¾Ð·ÑˆÐ¸Ñ€ÐµÐ½Ð½Ñ PHP, натоміÑÑ‚ÑŒ упакували Ñ€Ð¾Ð·ÑˆÐ¸Ñ€ÐµÐ½Ð½Ñ PECL Ñк <code>php5-json</code> або <code>php-pecl-jsonc</code>.",
'config-xcache' => '[http://xcache.lighttpd.net/ XCache] вÑтановлено',
'config-apc' => '[http://www.php.net/apc APC] вÑтановлено',
'config-wincache' => '[http://www.iis.net/download/WinCacheForPhp WinCache] вÑтановлено',
@@ -19278,6 +19944,8 @@ MediaWiki вимагає підтримку UTF-8 Ð´Ð»Ñ ÐºÐ¾Ñ€ÐµÐºÑ‚Ð½Ð¾Ñ— ро
'config-mod-security' => "'''Увага''': на Вашому веб-Ñервері увімкнено [http://modsecurity.org/ mod_security]. У разі неправильних налаштувать, він може викликати проблеми MediaWiki або іншого ПЗ, Ñке дозволÑÑ” кориÑтувачам надÑилати довільний вміÑÑ‚.
ЗвернітьÑÑ Ð´Ð¾ [http://modsecurity.org/documentation/ документації mod_security] або підтримки Вашого хоÑтера, Ñкщо під Ñ‡Ð°Ñ Ñ€Ð¾Ð±Ð¾Ñ‚Ð¸ виникають незрозумілі помилки.",
'config-diff3-bad' => 'GNU diff3 не знайдено.',
+ 'config-git' => 'Знайшов програму ÑƒÐ¿Ñ€Ð°Ð²Ð»Ñ–Ð½Ð½Ñ Ð²ÐµÑ€ÑÑ–Ñми Git: <code>$1</code>.',
+ 'config-git-bad' => 'Програму ÑƒÐ¿Ñ€Ð°Ð²Ð»Ñ–Ð½Ð½Ñ Ð²ÐµÑ€ÑÑ–Ñми Git не знайдено.',
'config-imagemagick' => 'ВиÑвлено ImageMagick: <code>$1</code>.
Буде ввімкнуто Ð²Ñ–Ð´Ð¾Ð±Ñ€Ð°Ð¶ÐµÐ½Ð½Ñ Ð¼Ñ–Ð½Ñ–Ð°Ñ‚ÑŽÑ€, Ñкщо ви дозволите Ð·Ð°Ð²Ð°Ð½Ñ‚Ð°Ð¶ÐµÐ½Ð½Ñ Ñ„Ð°Ð¹Ð»Ñ–Ð².',
'config-gd' => 'ВиÑвлено вбудовано графічну бібліотеку GD.
@@ -19298,7 +19966,7 @@ MediaWiki вимагає підтримку UTF-8 Ð´Ð»Ñ ÐºÐ¾Ñ€ÐµÐºÑ‚Ð½Ð¾Ñ— ро
'config-using531' => 'MediaWiki не можна викориÑтовувати разом з PHP $1 через помилку з параметрами-поÑиланнÑми <code>__call()</code>.
Оновіть PHP до верÑÑ–Ñ— 5.3.2 Ñ– вище або відкотіть до PHP 5.3.0 щоб уникнути цієї проблеми.
Ð’ÑÑ‚Ð°Ð½Ð¾Ð²Ð»ÐµÐ½Ð½Ñ ÑкаÑовано.',
- 'config-suhosin-max-value-length' => 'Suhosin вÑтановлено Ñ– обмежує довжину параметра GET до $1 байтів. Компонент MediaWiki ResourceLoader буде обходити це обмеженнÑ, однак це зменшить продуктивніÑÑ‚ÑŒ. Якщо це можливо, Вам варто вÑтановити Ð·Ð½Ð°Ñ‡ÐµÐ½Ð½Ñ <code>suhosin.get.max_value_length</code> 1024 Ñ– більше у <code>php.ini</code> Ñ– вÑтановити таке ж Ð·Ð½Ð°Ñ‡ÐµÐ½Ð½Ñ <code>$wgResourceLoaderMaxQueryLength</code> у LocalSettings.php .', # Fuzzy
+ 'config-suhosin-max-value-length' => 'Suhosin вÑтановлено Ñ– обмежує параметра GET <code>length</code> до $1 байта. Компонент MediaWiki ResourceLoader буде обходити це обмеженнÑ, однак це зменшить продуктивніÑÑ‚ÑŒ. Якщо це можливо, Вам варто вÑтановити Ð·Ð½Ð°Ñ‡ÐµÐ½Ð½Ñ <code>suhosin.get.max_value_length</code> Ñк 1024 Ñ– більше у <code>php.ini</code> Ñ– вÑтановити таке ж Ð·Ð½Ð°Ñ‡ÐµÐ½Ð½Ñ <code>$wgResourceLoaderMaxQueryLength</code> у LocalSettings.php .',
'config-db-type' => 'Тип бази даних:',
'config-db-host' => 'ХоÑÑ‚ бази даних:',
'config-db-host-help' => 'Якщо Ñервер бази даних знаходитьÑÑ Ð½Ð° іншому Ñервері, введіть тут ім\'Ñ Ñ…Ð¾Ñту Ñ– IP адреÑу.
@@ -19369,7 +20037,6 @@ MediaWiki вимагає підтримку UTF-8 Ð´Ð»Ñ ÐºÐ¾Ñ€ÐµÐºÑ‚Ð½Ð¾Ñ— ро
За можливоÑÑ‚Ñ– розташуйте базу даних деÑÑŒ окремо, наприклад в <code>/var/lib/mediawiki/yourwiki</code>.",
'config-oracle-def-ts' => 'ПроÑÑ‚Ñ–Ñ€ таблиць за замовчуваннÑм:',
'config-oracle-temp-ts' => 'ТимчаÑовий проÑÑ‚Ñ–Ñ€ таблиць:',
- 'config-type-ibm_db2' => 'IBM DB2',
'config-support-info' => 'MediaWiki підтримує таки ÑиÑтеми баз даних:
$1
@@ -19379,18 +20046,16 @@ $1
'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-support-ibm_db2' => '* $1 — комерційна база даних маÑштабу підприємÑтва.', # Fuzzy
'config-header-mysql' => 'ÐÐ°Ð»Ð°ÑˆÑ‚ÑƒÐ²Ð°Ð½Ð½Ñ MySQL',
'config-header-postgres' => 'ÐÐ°Ð»Ð°ÑˆÑ‚ÑƒÐ²Ð°Ð½Ð½Ñ PostgreSQL',
'config-header-sqlite' => 'ÐÐ°Ð»Ð°ÑˆÑ‚ÑƒÐ²Ð°Ð½Ð½Ñ SQLite',
'config-header-oracle' => 'ÐÐ°Ð»Ð°ÑˆÑ‚ÑƒÐ²Ð°Ð½Ð½Ñ Oracle',
- 'config-header-ibm_db2' => 'ÐÐ°Ð»Ð°ÑˆÑ‚ÑƒÐ²Ð°Ð½Ð½Ñ IBM DB2',
'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), знаки підкреÑÐ»ÐµÐ½Ð½Ñ (_) Ñ– крапки (.).',
+ВикориÑтовуйте "TNS Name" або Ñ€Ñдок "Easy Connect" ([http://docs.oracle.com/cd/E11882_01/network.112/e10836/naming.htm Методи Ð½Ð°Ð¹Ð¼ÐµÐ½ÑƒÐ²Ð°Ð½Ð½Ñ Oracle])',
'config-invalid-db-name' => 'ÐеприпуÑтима назва бази даних "$1".
ВикориÑтовуйте тільки ASCII букви (a-z, A-Z), цифри (0-9), знаки підкреÑÐ»ÐµÐ½Ð½Ñ (_) Ñ– дефіÑи (-).',
'config-invalid-db-prefix' => 'ÐеприпуÑтимий Ð¿Ñ€ÐµÑ„Ñ–ÐºÑ Ð±Ð°Ð·Ð¸ даних "$1".
@@ -19446,7 +20111,7 @@ chmod a+w $3</pre>',
'config-upgrade-done-no-regenerate' => 'ÐžÐ½Ð¾Ð²Ð»ÐµÐ½Ð½Ñ Ð·Ð°Ð²ÐµÑ€ÑˆÐµÐ½Ð¾.
Ви можете зараз [$1 починати викориÑтовувати Ñвою вікі].',
- 'config-regenerate' => 'Повторно згенерувати <code>LocalSettings.php</code> →',
+ 'config-regenerate' => 'Повторно згенерувати LocalSettings.php →',
'config-show-table-status' => 'Запит <code>SHOW TABLE STATUS</code> не виконано!',
'config-unknown-collation' => "'''Увага:''' База даних викориÑтовує нерозпізнане ÑортуваннÑ.",
'config-db-web-account' => 'Обліковий Ð·Ð°Ð¿Ð¸Ñ Ð±Ð°Ð·Ð¸ даних Ð´Ð»Ñ Ñ–Ð½Ñ‚ÐµÑ€Ð½ÐµÑ‚-доÑтупу',
@@ -19465,6 +20130,12 @@ chmod a+w $3</pre>',
Якщо Ваша інÑталÑÑ†Ñ–Ñ MySQL підтримує InnoDB, дуже рекомендуєтьÑÑ Ð²Ð¸Ð±Ñ€Ð°Ñ‚Ð¸ цей двигун.
Якщо Ваша інÑталÑÑ†Ñ–Ñ MySQL не підтримує InnoDB, можливо наÑтав Ñ‡Ð°Ñ Ñ—Ñ— оновити.",
+ 'config-mysql-only-myisam-dep' => '"\'ЗауваженнÑ:"\' MyISAM Ñ” єдиним механізмом Ð´Ð»Ñ Ð·Ð±ÐµÑ€Ñ–Ð³Ð°Ð½Ð½Ñ MySQL, Ñкий не рекомендуєтьÑÑ Ð´Ð»Ñ Ð²Ð¸ÐºÐ¾Ñ€Ð¸ÑÑ‚Ð°Ð½Ð½Ñ Ð· MediaWiki, оÑкільки:
+* Ñлабо підтримує паралелізм через Ð±Ð»Ð¾ÐºÑƒÐ²Ð°Ð½Ð½Ñ Ñ‚Ð°Ð±Ð»Ð¸Ñ†ÑŒ
+* більш Ñхильний до пошкоджень, ніж інші двигуни
+* код MediaWiki не завжди розглÑдає MyISAM, Ñк повинен
+
+Твоє вÑÑ‚Ð°Ð½Ð¾Ð²Ð»ÐµÐ½Ð½Ñ MySQL не підтримує InnoDB, можливо, потрібно оновити.',
'config-mysql-engine-help' => "'''InnoDB''' Ñ” завжди кращим вибором, оÑкільки краще підтримує паралельний доÑтуп.
'''MyISAM''' може бути швидшим Ð´Ð»Ñ Ð¾Ð´Ð½Ð¾Ð³Ð¾ кориÑтувача або в інÑталÑціÑÑ… read-only.
@@ -19476,7 +20147,6 @@ chmod a+w $3</pre>',
Це більш ефективно, ніж UTF-8 режим MySQL, Ñ– дозволÑÑ” викориÑтовувати увеÑÑŒ набір Ñимволів Юнікоду.
У '''режимі UTF-8''' MySQL буде знати, Ñкого Ñимволу ÑтоÑуютьÑÑ Ð’Ð°ÑˆÑ– дані, Ñ– могтиме відображати та конвертувати Ñ—Ñ… належним чином, але не дозволÑтиме зберігати Ñимволи, що виходÑÑ‚ÑŒ за межі [//en.wikipedia.org/wiki/Mapping_of_Unicode_character_planes Basic Multilingual Plane].",
- 'config-ibm_db2-low-db-pagesize' => "У Вашій базі даних DB2 за замовчуваннÑм заданий табличний проÑÑ‚Ñ–Ñ€ з недоÑтатнім розміром Ñторінки. Розмір Ñторінки має бути '''32K''' Ñ– більше.",
'config-site-name' => 'Ðазва вікі:',
'config-site-name-help' => 'Це буде відображатиÑÑŒ у заголовку вікна браузера та у деÑких інших міÑцÑÑ….',
'config-site-name-blank' => 'Введіть назву Ñайту.',
@@ -19519,7 +20189,7 @@ chmod a+w $3</pre>',
'config-optional-continue' => 'Запитуйте ще.',
'config-optional-skip' => 'Це вже втомлює, проÑто вÑтановити вікі.',
'config-profile' => 'Профіль прав кориÑтувача:',
- 'config-profile-wiki' => 'Традиційна вікі', # Fuzzy
+ 'config-profile-wiki' => 'Відкрита вікі',
'config-profile-no-anon' => 'Ðеобхідно Ñтворити обліковий запиÑ',
'config-profile-fishbowl' => 'Тільки Ð´Ð»Ñ Ð°Ð²Ñ‚Ð¾Ñ€Ð¸Ð·Ð¾Ð²Ð°Ð½Ð¸Ñ… редакторів',
'config-profile-private' => 'Приватна вікі',
@@ -19529,12 +20199,12 @@ chmod a+w $3</pre>',
Одначе, MediaWiki може бути кориÑна по-різному, й інколи важко переконати у вигідноÑÑ‚Ñ– відкритої вікі-роботи.
Тож у Ð’Ð°Ñ Ñ” вибір.
-'''{{int:config-profile-wiki}}''' дозволÑÑ” редагувати будь-кому, навіть без Ð²Ñ…Ð¾Ð´Ð¶ÐµÐ½Ð½Ñ Ð² ÑиÑтему.
+Модель '''{{int:config-profile-wiki}}''' дозволÑÑ” редагувати будь-кому, навіть без Ð²Ñ…Ð¾Ð´Ð¶ÐµÐ½Ð½Ñ Ð² ÑиÑтему.
Вікі з вимогою \"'''{{int:config-profile-no-anon}}'''\" дає певний облік, але може відвернути випадкових допиÑувачів.
СпоÑіб \"'''{{int:config-profile-fishbowl}}'''\" дозволÑÑ” редагувати підтвердженим кориÑтувачам, а переглÑдати Ñторінки Ñ– Ñ–Ñторію можуть уÑÑ–.
'''{{int:config-profile-private}}''' дозволÑÑ” переглÑдати Ñторінки Ñ– редагувати лише підтвердженим кориÑтувачам.
-Детальніші конфігурації прав кориÑтувачів доÑтупні піÑÐ»Ñ Ð²ÑтановленнÑ, див. [//www.mediawiki.org/wiki/Manual:User_rights відповідний розділ поÑібника].", # Fuzzy
+Детальніші конфігурації прав кориÑтувачів доÑтупні піÑÐ»Ñ Ð²ÑтановленнÑ, див. [//www.mediawiki.org/wiki/Manual:User_rights відповідний розділ поÑібника].",
'config-license' => 'ÐвторÑькі права Ñ– ліцензіÑ:',
'config-license-none' => 'Без ліцензії у нижньому колонтитулі',
'config-license-cc-by-sa' => 'Creative Commons Attribution Share Alike',
@@ -19580,8 +20250,11 @@ GFDL — допуÑтима ліцензіÑ, але у ній важко роз
Ð’ ідеалі, вона не має бути доÑтупною через інтернет.',
'config-logo' => 'URL логотипу:',
'config-logo-help' => 'Стандартна Ñхема Ð¾Ñ„Ð¾Ñ€Ð¼Ð»ÐµÐ½Ð½Ñ MediaWiki міÑтить вільне Ð´Ð»Ñ Ð»Ð¾Ð³Ð¾Ñ‚Ð¸Ð¿Ñƒ міÑце над бічною панеллю розміром 135x160 пікÑелів.
+
Завантажте Ð·Ð¾Ð±Ñ€Ð°Ð¶ÐµÐ½Ð½Ñ Ð²Ñ–Ð´Ð¿Ð¾Ð²Ñ–Ð´Ð½Ð¾Ð³Ð¾ розміру Ñ– введіть тут його URL.
+Ви можете викориÑтати <code>$wgStylePath</code> або <code>$wgScriptPath</code>, Ñкщо ваш логотип пов\'Ñзаний з цими шлÑхами.
+
Якщо Вам не потрібен логотип, залиште це поле пуÑтим.',
'config-instantcommons' => 'Увімкнути Instant Commons',
'config-instantcommons-help' => '[//www.mediawiki.org/wiki/InstantCommons Instant Commons] це функціÑ, що дозволÑÑ” вікі викориÑтовувати зображеннÑ, звуки та інші медіа, розміщені на [//commons.wikimedia.org/ ВікіÑховищі].
@@ -19616,7 +20289,7 @@ GFDL — допуÑтима ліцензіÑ, але у ній важко роз
'config-install-alreadydone' => "'''Увага:''' ЗдаєтьÑÑ, Ви вже вÑтановлювали MediaWiki Ñ– зараз намагаєтеÑÑŒ вÑтановити Ñ—Ñ— знову.
Будь лаÑка, перейдіть на наÑтупну Ñторінку.",
'config-install-begin' => 'ÐатиÑкаючи "{{int:config-continue}}", Ви розпочинаєте вÑÑ‚Ð°Ð½Ð¾Ð²Ð»ÐµÐ½Ð½Ñ MediaWiki.
-Якщо Ви вÑе ще хочете внеÑти зміни, натиÑніть "Ðазад".', # Fuzzy
+Якщо Ви вÑе ще хочете внеÑти зміни, натиÑніть "{{int:config-back}}".',
'config-install-step-done' => 'виконано',
'config-install-step-failed' => 'не вдалоÑÑ',
'config-install-extensions' => 'У тому чиÑлі розширеннÑ',
@@ -19674,6 +20347,9 @@ $3
'config-download-localsettings' => 'Завантажити <code>LocalSettings.php</code>',
'config-help' => 'допомога',
'config-nofile' => 'Файл "$1" не знайдено. Його видалено?',
+ 'config-extension-link' => 'Чи знаєте ви, що ваше вікі підтримує [//www.mediawiki.org/wiki/Manual:Extensions розширеннÑ]?
+
+Ви можете переглÑдати [//www.mediawiki.org/wiki/Category:Extensions_by_category Ñ€Ð¾Ð·ÑˆÐ¸Ñ€ÐµÐ½Ð½Ñ Ð¿Ð¾ категорії] або в [//www.mediawiki.org/wiki/Extension_Matrix матрицю розширень] щоб побачити повний ÑпиÑок розширень.',
'mainpagetext' => 'Програмне Ð·Ð°Ð±ÐµÐ·Ð¿ÐµÑ‡ÐµÐ½Ð½Ñ Â«MediaWiki» уÑпішно вÑтановлене.',
'mainpagedocfooter' => 'Інформацію про роботу з цією вікі можна знайти в [//meta.wikimedia.org/wiki/Help:Contents поÑібнику кориÑтувача].
@@ -19685,10 +20361,19 @@ $3
);
/** Urdu (اردو)
+ * @author Noor2020
* @author පසිඳු කà·à·€à·’න්ද
*/
$messages['ur'] = array(
'config-information' => 'معلومات',
+ 'config-git' => 'Git ورژن کنٹرول مصنع لطی٠ملا: <code>$1</code> ۔',
+ 'config-git-bad' => 'GIT ورژن کنٹرول مصنع لطی٠نÛÙŠÚº ملا Û”',
+ 'config-mysql-only-myisam-dep' => "' ' تنبیÛ: ' '[[MyISAM|مائ اسام]] واحد دستیاب 'Ø°Ø®ÛŒØ±Û Ø¬Ø§ØªÛŒ انجن' ÛÛ’ جو مائی ایس کیو ایل Ú©Û’ لیے ÛÛ’ ØŒ جو Ú©Û Ù†Ø§Ù…ÙˆØ²ÙˆÚº ÛÛ’ میڈیا ÙˆÚ©ÛŒ Ú©Û’ لیے ،کیوں Ú©Û :
+* ÛŒÛ Ûموار قطاروں Ú©ÛŒ سÛولت بمشکل ÙراÛÙ… کرتا ÛÛ’
+* ÛŒÛ Ø¯ÙˆØ³Ø±Û’ انجنوں Ú©Û’ مقابلے Ø²ÛŒØ§Ø¯Û Ø¨Ú¯Ú‘ جاتا ÛÛ’
+* میڈیا ÙˆÚ©ÛŒ Ú©ÙˆÚˆ بیس ÛÙ…ÛŒØ´Û Ø³Ù†Ø¨Ú¾Ø§Ù„ Ù†ÛÙŠÚº پاتا مائی اسام Ú©Ùˆ Û”
+
+آپ کا مائی ایس کیو ایل کا نصب ÛÙ…ÛŒØ´Û Ø§Ù†Ù†Ùˆ ÚˆÛŒ بی Ú©ÛŒ سÛولت Ù†ÛÙŠÚº دے سکتا ØŒ ÛÙˆ سکتا ÛÛ’ ÛŒÛ Ù…Ø²ÛŒØ¯ ترقیاتی کام چاÛÛ’", # Fuzzy
'config-profile-fishbowl' => 'صر٠مجاز ایڈیٹرز',
'config-license-pd' => 'پبلک ڈومین',
'config-email-settings' => 'ای میل کی ترتیبات',
@@ -19714,8 +20399,10 @@ $messages['ur'] = array(
);
/** Uzbek (oʻzbekcha)
+ * @author Sociologist
*/
$messages['uz'] = array(
+ 'config-admin-password-blank' => 'Administrator hisob yozuvi uchun maxfiy soʻz kiriting.',
'mainpagetext' => "'''MediaWiki muvaffaqiyatli o'rnatildi.'''",
'mainpagedocfooter' => "Wiki dasturini ishlatish haqida ma'lumot olish uchun [//meta.wikimedia.org/wiki/Help:Contents Foydalanuvchi qo'llanmasi] sahifasiga murojaat qiling.
@@ -19723,7 +20410,7 @@ $messages['uz'] = array(
* [//www.mediawiki.org/wiki/Manual:Configuration_settings Moslamalar ro'yxati]
* [//www.mediawiki.org/wiki/Manual:FAQ MediaWiki haqida ko'p so'raladigan savollar]
-* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce MediaWiki yangi versiyasi chiqqanda xabar berish ro'yxati]",
+* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce MediaWiki yangi versiyasi chiqqanda xabar berish ro'yxati]", # Fuzzy
);
/** vèneto (vèneto)
@@ -19739,7 +20426,7 @@ I seguenti cołegamenti i xé en łengua inglese:
* [//www.mediawiki.org/wiki/Manual:Configuration_settings Inpostasion de configurasion]
* [//www.mediawiki.org/wiki/Manual:FAQ Domande frequenti so MediaWiki]
-* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce Mailing list anunsi MediaWiki]",
+* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce Mailing list anunsi MediaWiki]", # Fuzzy
);
/** Veps (vepsän kel’)
@@ -19752,7 +20439,7 @@ $messages['vep'] = array(
== Erased tarbhaižed resursad ==
* [//www.mediawiki.org/wiki/Manual:Configuration_settings Järgendusiden nimikirjutez]
* [//www.mediawiki.org/wiki/Manual:FAQ MediaWiki FAQ]
-* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce poÄtnimikirjutez]',
+* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce poÄtnimikirjutez]', # Fuzzy
);
/** Vietnamese (Tiếng Việt)
@@ -19774,7 +20461,7 @@ $messages['vi'] = array(
* [//www.mediawiki.org/wiki/Manual:Configuration_settings Danh sách các thiết lập cấu hình]
* [//www.mediawiki.org/wiki/Manual:FAQ Các câu há»i thÆ°á»ng gặp MediaWiki]
-* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce Danh sách gửi thư vỠviệc phát hành MediaWiki]',
+* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce Danh sách gửi thư vỠviệc phát hành MediaWiki]', # Fuzzy
);
/** Volapük (Volapük)
@@ -19787,7 +20474,7 @@ $messages['vo'] = array(
* [//www.mediawiki.org/wiki/Manual:Configuration_settings Parametalised]
* [//www.mediawiki.org/wiki/Manual:FAQ MediaWiki: SSP]
-* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce Potalised tefü fomams nulik ela MediaWiki]',
+* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce Potalised tefü fomams nulik ela MediaWiki]', # Fuzzy
);
/** Võro (Võro)
@@ -19798,7 +20485,7 @@ $messages['vro'] = array(
* [//meta.wikimedia.org/wiki/MediaWiki_User%27s_Guide MediaWiki pruukmisoppus (inglüse keelen)].
* [//www.mediawiki.org/wiki/Manual:Configuration_settings Säädmiisi oppus (inglüse keelen)]
* [//www.mediawiki.org/wiki/Manual:FAQ MediaWiki kõgõ küsütümbäq küsümiseq (inglüse keelen)]
-* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce E-postilist, minka andas teedäq MediaWiki vahtsist kujõst].',
+* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce E-postilist, minka andas teedäq MediaWiki vahtsist kujõst].', # Fuzzy
);
/** Walloon (walon)
@@ -19818,7 +20505,7 @@ $messages['war'] = array(
== Ha pagtikang==
* [//www.mediawiki.org/wiki/Manual:Configuration_settings Configuration settings list]
* [//www.mediawiki.org/wiki/Manual:FAQ MediaWiki FAQ]
-* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce MediaWiki release mailing list]",
+* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce MediaWiki release mailing list]", # Fuzzy
);
/** Wolof (Wolof)
@@ -19831,7 +20518,7 @@ $messages['wo'] = array(
* [//www.mediawiki.org/wiki/Manual:Configuration_settings Limu jumtukaayi kocc-koccal gi]
* [//www.mediawiki.org/wiki/Manual:FAQ FAQ MediaWiki]
-* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce Limu waxtaan ci liy-génn ci MediaWiki]',
+* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce Limu waxtaan ci liy-génn ci MediaWiki]', # Fuzzy
);
/** Wu (å´è¯­)
@@ -19844,7 +20531,7 @@ $messages['wuu'] = array(
== 入门 ==
* [//www.mediawiki.org/wiki/Manual:Configuration_settings MediaWiki é…置设置列表]
* [//www.mediawiki.org/wiki/Manual:FAQ MediaWiki 常è§é—®é¢˜è§£ç­”]
-* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce MediaWiki å‘布邮件列表]',
+* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce MediaWiki å‘布邮件列表]', # Fuzzy
);
/** Kalmyk (хальмг)
@@ -19857,7 +20544,7 @@ $messages['xal'] = array(
== ТуÑта заавр ==
* [//www.mediawiki.org/wiki/Manual:Configuration_settings Көгүдә бүрткл]
* [//www.mediawiki.org/wiki/Manual:FAQ MediaWiki туÑк ЮмБи]
-* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce MediaWiki шинҗллһнә бүрткл]',
+* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce MediaWiki шинҗллһнә бүрткл]', # Fuzzy
);
/** Yiddish (ייִדיש)
@@ -19907,7 +20594,7 @@ $messages['yo'] = array(
== Láti bẹ̀rẹ̀ ==
* [//www.mediawiki.org/wiki/Manual:Configuration_settings Configuration settings list]
* [//www.mediawiki.org/wiki/Manual:FAQ MediaWiki FAQ]
-* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce MediaWiki release mailing list]",
+* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce MediaWiki release mailing list]", # Fuzzy
);
/** Cantonese (粵語)
@@ -19919,7 +20606,7 @@ $messages['yue'] = array(
==開始使用==
* [//www.mediawiki.org/wiki/Manual:Configuration_settings é…置設定清單](英)
* [//www.mediawiki.org/wiki/Manual:FAQ MediaWiki 常見å•é¡Œ](英)
-* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce MediaWiki 發佈郵件åå–®](英)',
+* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce MediaWiki 發佈郵件åå–®](英)', # Fuzzy
);
/** Zeeuws (Zeêuws)
@@ -19932,14 +20619,16 @@ $messages['zea'] = array(
* [//www.mediawiki.org/wiki/Manual:Configuration_settings Lieste mie instelliengen]
* [//www.mediawiki.org/wiki/Manual:FAQ Veehestelde vraehen (FAQ)]
-* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce Mailienglieste voe ankondigiengen van nieuwe versies]",
+* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce Mailienglieste voe ankondigiengen van nieuwe versies]", # Fuzzy
);
/** Simplified Chinese (中文(简体)‎)
* @author Anthony Fok
+ * @author Cwek
* @author Hydra
* @author Hzy980512
* @author Liangent
+ * @author Makecat
* @author PhiLiP
* @author Xiaomingyan
* @author Yfdyh000
@@ -20045,6 +20734,8 @@ $1',
Object caching is not enabled.",
'config-mod-security' => "'''警告''':您的æœåŠ¡å™¨å·²å¯åŠ¨[http://modsecurity.org/ mod_security]。若其é…置错误, 会导致MediaWiki和其他软件的错误并å…许用户任æ„å‘布内容。如果您é‡åˆ°ä»»ä½•é”™è¯¯ï¼Œè¯·æŸ¥é˜…[http://modsecurity.org/documentation/ mod_security文档]或è”系您的客æœã€‚",
'config-diff3-bad' => '找ä¸åˆ°GNU diff3。',
+ 'config-git' => 'å‘现Git版本控制软件:<code>$1</code>',
+ 'config-git-bad' => 'Git版本控制软件未找到。',
'config-imagemagick' => '已找到ImageMagick:<code>$1</code>。如果你å¯ç”¨äº†ä¸Šä¼ åŠŸèƒ½ï¼Œç¼©ç•¥å›¾åŠŸèƒ½ä¹Ÿå°†è¢«å¯ç”¨ã€‚',
'config-gd' => '已找到内建的GD图形库。如果你å¯ç”¨äº†ä¸Šä¼ åŠŸèƒ½ï¼Œç¼©ç•¥å›¾åŠŸèƒ½ä¹Ÿå°†è¢«å¯ç”¨ã€‚',
'config-no-scaling' => '找ä¸åˆ°GD库或ImageMagick。缩略图功能将ä¸å¯ç”¨ã€‚',
@@ -20056,7 +20747,7 @@ Object caching is not enabled.",
'config-no-cli-uploads-check' => "'''警告''':在CLI安装过程中,没有对您的默认上传目录(<code>$1</code>)进行执行任æ„脚本的æ¼æ´žæ£€æŸ¥ã€‚",
'config-brokenlibxml' => '您的系统安装的PHPå’Œlibxml2版本组åˆå­˜åœ¨æ•…障,并å¯èƒ½åœ¨MediaWiki和其他web应用程åºä¸­é€ æˆéšè—çš„æ•°æ®æŸå。请将PHPå‡çº§åˆ°5.2.9或以上,libxml2å‡çº§åˆ°2.7.3或以上([//bugs.php.net/bug.php?id=45996 PHP的故障报告])。安装已中断。',
'config-using531' => '由于函数<code>__call()</code>的引用å‚数存在故障,PHP $1å’ŒMediaWiki无法兼容。请å‡çº§åˆ°PHP 5.3.2或更高版本,或é™çº§åˆ°PHP 5.3.0以修å¤è¯¥é—®é¢˜ã€‚安装已中断。',
- 'config-suhosin-max-value-length' => 'Suhosinå·²ç»å®‰è£…并将GET请求的å‚数长度é™åˆ¶åœ¨$1字节。MediaWikiçš„ResourceLoader部件å¯ä»¥åœ¨æ­¤é™åˆ¶ä¸‹æ­£å¸¸å·¥ä½œï¼Œä½†å…¶æ€§èƒ½ä¼šè¢«é™ä½Žã€‚如果å¯èƒ½ï¼Œè¯·åœ¨<code>php.ini</code>中将<code>suhosin.get.max_value_length</code>设为1024或更高值,并在LocalSettings.php中将<code>$wgResourceLoaderMaxQueryLength</code>设为åŒä¸€å€¼ã€‚', # Fuzzy
+ 'config-suhosin-max-value-length' => 'Suhosinå·²ç»å®‰è£…并将GET请求的å‚数长度é™åˆ¶åœ¨$1字节。MediaWikiçš„ResourceLoader部件å¯ä»¥åœ¨æ­¤é™åˆ¶ä¸‹æ­£å¸¸å·¥ä½œï¼Œä½†å…¶æ€§èƒ½ä¼šè¢«é™ä½Žã€‚如果å¯èƒ½ï¼Œè¯·åœ¨<code>php.ini</code>中将<code>suhosin.get.max_value_length</code>设为1024或更高值,并在LocalSettings.php中将<code>$wgResourceLoaderMaxQueryLength</code>设为åŒä¸€å€¼ã€‚',
'config-db-type' => 'æ•°æ®åº“类型:',
'config-db-host' => 'æ•°æ®åº“主机:',
'config-db-host-help' => '如果您的数æ®åº“在别的æœåŠ¡å™¨ä¸Šï¼Œè¯·åœ¨è¿™é‡Œè¾“入它的域å或IP地å€ã€‚
@@ -20179,7 +20870,7 @@ chmod a+w $3</pre>',
'config-upgrade-done-no-regenerate' => 'å‡çº§å®Œæˆã€‚
现在您å¯ä»¥[$1 开始使用您的wiki]了。',
- 'config-regenerate' => 'é‡æ–°ç”Ÿæˆ<code>LocalSettings.php</code> →',
+ 'config-regenerate' => 'é‡æ–°ç”ŸæˆLocalSettings.php →',
'config-show-table-status' => '<code>SHOW TABLE STATUS</code>语å¥æ‰§è¡Œå¤±è´¥ï¼',
'config-unknown-collation' => "'''警告:'''æ•°æ®åº“使用了无法识别的整ç†ã€‚",
'config-db-web-account' => '供网页访问使用的数æ®åº“å¸å·',
@@ -20197,6 +20888,12 @@ chmod a+w $3</pre>',
如果您的MySQL程åºæ”¯æŒInnoDB,我们高度推è您使用该引擎替代MyISAM。
如果您的MySQL程åºä¸æ”¯æŒInnoDB,请考虑å‡çº§ã€‚",
+ 'config-mysql-only-myisam-dep' => "''''警告:'''MyISAM是MySQL唯一å¯ç”¨çš„存储引擎,但ä¸é€‚åˆç”¨äºŽMediaWiki,是由于:
+*由于åªæ”¯æŒè¡¨çº§é”定,几乎ä¸æ”¯æŒå¹¶å‘。
+*它比其他引擎更容易æŸå。
+*MediaWiki代ç ä¸èƒ½æ€»æ˜¯æŒ‰ç…§é¢„设地æ“作MyISAM。
+
+ä½ çš„MySQLä¸æ”¯æŒInnoDB,是时候å‡çº§äº†ã€‚",
'config-mysql-engine-help' => "'''InnoDB'''通常是最佳选项,因为它对并å‘æ“作有ç€è‰¯å¥½çš„支æŒã€‚
'''MyISAM'''在å•ç”¨æˆ·æˆ–åªè¯»çŽ¯å¢ƒä¸‹å¯èƒ½ä¼šæœ‰æ›´å¿«çš„性能表现。但MyISAMæ•°æ®åº“出错的概率一般è¦å¤§äºŽInnoDBæ•°æ®åº“。",
@@ -20289,6 +20986,8 @@ GNU自由文档许å¯è¯æ˜¯ç»´åŸºç™¾ç§‘曾ç»ä½¿ç”¨è¿‡çš„许å¯è¯ï¼Œå¹¶è¿„今æœ
'config-logo' => '标志URL:',
'config-logo-help' => '在MediaWiki的默认外观中,左侧æ èœå•ä¹‹ä¸Šæœ‰ä¸€å—135x160åƒç´ çš„标志区。请上传一幅相应大å°çš„图åƒï¼Œå¹¶åœ¨æ­¤è¾“å…¥URL。
+ä½ å¯ä»¥ç”¨<code>$wgStylePath</code>或<code>$wgScriptPath</code>æ¥è¡¨ç¤ºç›¸å¯¹äºŽè¿™äº›ä½ç½®çš„路径。
+
如果您ä¸å¸Œæœ›ä½¿ç”¨æ ‡å¿—,请将本处留空。',
'config-instantcommons' => 'å¯ç”¨å³æ—¶å…±äº«èµ„æº',
'config-instantcommons-help' => '[//www.mediawiki.org/wiki/InstantCommons å³æ—¶å…±äº«èµ„æº]å¯ä»¥è®©wiki使用æ¥è‡ª[//commons.wikimedia.org/ 维基共享资æº]网站的图åƒã€éŸ³é¢‘和其他媒体文件。è¦å¯ç”¨è¯¥åŠŸèƒ½ï¼ŒMediaWiki必须能够访问互è”网。
@@ -20383,6 +21082,7 @@ $3
/** Traditional Chinese (中文(ç¹é«”)‎)
* @author Anthony Fok
* @author Hzy980512
+ * @author Justincheng12345
* @author Liangent
* @author Mark85296341
* @author Simon Shek
@@ -20485,6 +21185,8 @@ $1',
Object caching is not enabled.",
'config-mod-security' => "'''警告''':您的æœå‹™å™¨å·²å•Ÿå‹•[http://modsecurity.org/ mod_security]。若其é…置錯誤, 會導致MediaWiki和其他軟件的錯誤並å…許用戶任æ„發布內容。如果您é‡åˆ°ä»»ä½•éŒ¯èª¤ï¼Œè«‹æŸ¥é–±[http://modsecurity.org/documentation/ mod_security文檔]或è¯ç¹«æ‚¨çš„客æœã€‚",
'config-diff3-bad' => '找ä¸åˆ°GNU diff3。',
+ 'config-git' => '發ç¾Git版本控制軟件:<code>$1</code>。',
+ 'config-git-bad' => '無法找到Git版本控制軟件。',
'config-imagemagick' => '已找到ImageMagick:<code>$1</code>。如果你啟用了上傳功能,縮略圖功能也將被啟用。',
'config-gd' => '已找到內建的GD圖形庫。如果你啟用了上傳功能,縮略圖功能也將被啟用。',
'config-no-scaling' => '找ä¸åˆ°GD庫或ImageMagick。縮略圖功能將ä¸å¯ç”¨ã€‚',
@@ -20576,7 +21278,8 @@ $1
'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-server-oracle' => '無效的數據庫TNS「$1ã€ã€‚
+è«‹åªä½¿ç”¨ã€ŒTNS Nameã€æˆ–「Easy Connect〠字串([http://docs.oracle.com/cd/E11882_01/network.112/e10836/naming.htm Oracle命å法])',
'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。
@@ -20619,7 +21322,7 @@ chmod a+w $3</pre>',
'config-upgrade-done-no-regenerate' => 'å‡ç´šå®Œæˆã€‚
ç¾åœ¨æ‚¨å¯ä»¥[$1 開始使用您的wiki]了。',
- 'config-regenerate' => 'é‡æ–°ç”Ÿæˆ<code>LocalSettings.php</code> →',
+ 'config-regenerate' => 'é‡æ–°ç”ŸæˆLocalSettings.php →',
'config-show-table-status' => '查詢<code>SHOW TABLE STATUS</code>失敗ï¼',
'config-unknown-collation' => "'''警告:'''數據庫使用了無法識別的整ç†ã€‚",
'config-db-web-account' => '供網é è¨ªå•ä½¿ç”¨çš„數據庫帳號',
@@ -20679,7 +21382,7 @@ chmod a+w $3</pre>',
'config-optional-continue' => '多å•æˆ‘一些å•é¡Œå§ã€‚',
'config-optional-skip' => '我已經ä¸è€ç…©äº†ï¼Œè¶•ç·Šå®‰è£æˆ‘çš„wiki。',
'config-profile' => '用戶權é™é…置:',
- 'config-profile-wiki' => '傳統wiki', # Fuzzy
+ 'config-profile-wiki' => '開放的wiki',
'config-profile-no-anon' => '需è¦è¨»å†Šå¸³è™Ÿ',
'config-profile-fishbowl' => '編輯å—é™',
'config-profile-private' => 'éžå…¬é–‹wiki',
@@ -20729,7 +21432,7 @@ GNU自由文檔許å¯è­‰æ˜¯ç¶­åŸºç™¾ç§‘曾經使用éŽçš„許å¯è­‰ï¼Œä¸¦è¿„今æœ
'config-logo' => '標誌URL:',
'config-logo-help' => '在MediaWiki的默èªå¤–觀中,左å´æ¬„èœå–®ä¹‹ä¸Šæœ‰ä¸€å¡Š135x160åƒç´ çš„標誌å€ã€‚請上傳一幅相應大å°çš„圖åƒï¼Œä¸¦åœ¨æ­¤è¼¸å…¥URL。
-如果您ä¸å¸Œæœ›ä½¿ç”¨æ¨™èªŒï¼Œè«‹å°‡æœ¬è™•ç•™ç©ºã€‚',
+如果您ä¸å¸Œæœ›ä½¿ç”¨æ¨™èªŒï¼Œè«‹å°‡æœ¬è™•ç•™ç©ºã€‚', # Fuzzy
'config-instantcommons' => '啟用å³æ™‚共享資æº',
'config-instantcommons-help' => '[//www.mediawiki.org/wiki/InstantCommons å³æ™‚共享資æº]å¯ä»¥è®“wiki使用來自[//commons.wikimedia.org/ 維基共享資æº]網站的圖åƒã€éŸ³é »å’Œå…¶ä»–媒體文件。è¦å•Ÿç”¨è©²åŠŸèƒ½ï¼ŒMediaWiki必須能夠訪å•äº’è¯ç¶²ã€‚
diff --git a/includes/installer/Installer.php b/includes/installer/Installer.php
index 9fd67c93..36c41910 100644
--- a/includes/installer/Installer.php
+++ b/includes/installer/Installer.php
@@ -46,7 +46,6 @@ abstract class Installer {
*/
protected $settings;
-
/**
* List of detected DBs, access using getCompiledDBs().
*
@@ -122,6 +121,7 @@ abstract class Installer {
'envCheckModSecurity',
'envCheckDiff3',
'envCheckGraphics',
+ 'envCheckGit',
'envCheckServer',
'envCheckPath',
'envCheckExtension',
@@ -130,6 +130,7 @@ abstract class Installer {
'envCheckLibicu',
'envCheckSuhosinMaxValueLength',
'envCheckCtype',
+ 'envCheckJSON',
);
/**
@@ -155,8 +156,8 @@ abstract class Installer {
'wgDBtype',
'wgDiff3',
'wgImageMagickConvertCommand',
+ 'wgGitBin',
'IP',
- 'wgServer',
'wgScriptPath',
'wgScriptExtension',
'wgMetaNamespace',
@@ -301,7 +302,8 @@ abstract class Installer {
/**
* URL to mediawiki-announce subscription
*/
- protected $mediaWikiAnnounceUrl = 'https://lists.wikimedia.org/mailman/subscribe/mediawiki-announce';
+ protected $mediaWikiAnnounceUrl =
+ 'https://lists.wikimedia.org/mailman/subscribe/mediawiki-announce';
/**
* Supported language codes for Mailman
@@ -406,7 +408,7 @@ abstract class Installer {
*/
public function doEnvironmentChecks() {
$phpVersion = phpversion();
- if( version_compare( $phpVersion, self::MINIMUM_PHP_VERSION, '>=' ) ) {
+ if ( version_compare( $phpVersion, self::MINIMUM_PHP_VERSION, '>=' ) ) {
$this->showMessage( 'config-env-php', $phpVersion );
$good = true;
} else {
@@ -414,7 +416,7 @@ abstract class Installer {
$good = false;
}
- if( $good ) {
+ if ( $good ) {
foreach ( $this->envChecks as $check ) {
$status = $this->$check();
if ( $status === false ) {
@@ -480,7 +482,7 @@ abstract class Installer {
$type = strtolower( $type );
if ( !isset( $this->dbInstallers[$type] ) ) {
- $class = ucfirst( $type ). 'Installer';
+ $class = ucfirst( $type ) . 'Installer';
$this->dbInstallers[$type] = new $class( $this );
}
@@ -500,16 +502,17 @@ abstract class Installer {
$_lsExists = file_exists( "$IP/LocalSettings.php" );
wfRestoreWarnings();
- if( !$_lsExists ) {
+ if ( !$_lsExists ) {
return false;
}
unset( $_lsExists );
- require( "$IP/includes/DefaultSettings.php" );
- require( "$IP/LocalSettings.php" );
+ require "$IP/includes/DefaultSettings.php";
+ require "$IP/LocalSettings.php";
if ( file_exists( "$IP/AdminSettings.php" ) ) {
- require( "$IP/AdminSettings.php" );
+ require "$IP/AdminSettings.php";
}
+
return get_defined_vars();
}
@@ -636,6 +639,7 @@ abstract class Installer {
'ss_users' => 0,
'ss_images' => 0 ),
__METHOD__, 'IGNORE' );
+
return Status::newGood();
}
@@ -659,13 +663,15 @@ abstract class Installer {
$allNames = array();
+ // Messages: config-type-mysql, config-type-postgres, config-type-oracle,
+ // config-type-sqlite
foreach ( self::getDBTypes() as $name ) {
$allNames[] = wfMessage( "config-type-$name" )->text();
}
$databases = $this->getCompiledDBs();
- $databases = array_flip ( $databases );
+ $databases = array_flip( $databases );
foreach ( array_keys( $databases ) as $db ) {
$installer = $this->getDBInstaller( $db );
$status = $installer->checkPrerequisites();
@@ -679,9 +685,11 @@ abstract class Installer {
$databases = array_flip( $databases );
if ( !$databases ) {
$this->showError( 'config-no-db', $wgLang->commaList( $allNames ) );
+
// @todo FIXME: This only works for the web installer!
return false;
}
+
return true;
}
@@ -689,7 +697,7 @@ abstract class Installer {
* Environment check for register_globals.
*/
protected function envCheckRegisterGlobals() {
- if( wfIniGetBool( 'register_globals' ) ) {
+ if ( wfIniGetBool( 'register_globals' ) ) {
$this->showMessage( 'config-register-globals' );
}
}
@@ -702,8 +710,10 @@ abstract class Installer {
$test = new PhpXmlBugTester();
if ( !$test->ok ) {
$this->showError( 'config-brokenlibxml' );
+
return false;
}
+
return true;
}
@@ -717,8 +727,10 @@ abstract class Installer {
$test->execute();
if ( !$test->ok ) {
$this->showError( 'config-using531', phpversion() );
+
return false;
}
+
return true;
}
@@ -727,10 +739,12 @@ abstract class Installer {
* @return bool
*/
protected function envCheckMagicQuotes() {
- if( wfIniGetBool( "magic_quotes_runtime" ) ) {
+ if ( wfIniGetBool( "magic_quotes_runtime" ) ) {
$this->showError( 'config-magic-quotes-runtime' );
+
return false;
}
+
return true;
}
@@ -741,8 +755,10 @@ abstract class Installer {
protected function envCheckMagicSybase() {
if ( wfIniGetBool( 'magic_quotes_sybase' ) ) {
$this->showError( 'config-magic-quotes-sybase' );
+
return false;
}
+
return true;
}
@@ -753,8 +769,10 @@ abstract class Installer {
protected function envCheckMbstring() {
if ( wfIniGetBool( 'mbstring.func_overload' ) ) {
$this->showError( 'config-mbstring' );
+
return false;
}
+
return true;
}
@@ -765,8 +783,10 @@ abstract class Installer {
protected function envCheckZE1() {
if ( wfIniGetBool( 'zend.ze1_compatibility_mode' ) ) {
$this->showError( 'config-ze1' );
+
return false;
}
+
return true;
}
@@ -779,6 +799,7 @@ abstract class Installer {
$this->setVar( '_SafeMode', true );
$this->showMessage( 'config-safe-mode' );
}
+
return true;
}
@@ -789,8 +810,10 @@ abstract class Installer {
protected function envCheckXML() {
if ( !function_exists( "utf8_encode" ) ) {
$this->showError( 'config-xml-bad' );
+
return false;
}
+
return true;
}
@@ -805,6 +828,7 @@ abstract class Installer {
protected function envCheckPCRE() {
if ( !function_exists( 'preg_match' ) ) {
$this->showError( 'config-pcre' );
+
return false;
}
wfSuppressWarnings();
@@ -817,8 +841,10 @@ abstract class Installer {
wfRestoreWarnings();
if ( $regexd != '--' || $regexprop != '--' ) {
$this->showError( 'config-pcre-no-utf8' );
+
return false;
}
+
return true;
}
@@ -835,16 +861,17 @@ abstract class Installer {
$n = wfShorthandToInteger( $limit );
- if( $n < $this->minMemorySize * 1024 * 1024 ) {
+ if ( $n < $this->minMemorySize * 1024 * 1024 ) {
$newLimit = "{$this->minMemorySize}M";
- if( ini_set( "memory_limit", $newLimit ) === false ) {
+ 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 );
}
}
+
return true;
}
@@ -877,6 +904,7 @@ abstract class Installer {
if ( self::apacheModulePresent( 'mod_security' ) ) {
$this->showMessage( 'config-mod-security' );
}
+
return true;
}
@@ -896,6 +924,7 @@ abstract class Installer {
$this->setVar( 'wgDiff3', false );
$this->showMessage( 'config-diff3-bad' );
}
+
return true;
}
@@ -905,19 +934,44 @@ abstract class Installer {
*/
protected function envCheckGraphics() {
$names = array( wfIsWindows() ? 'convert.exe' : 'convert' );
- $convert = self::locateExecutableInDefaultPaths( $names, array( '$1 -version', 'ImageMagick' ) );
+ $versionInfo = array( '$1 -version', 'ImageMagick' );
+ $convert = self::locateExecutableInDefaultPaths( $names, $versionInfo );
$this->setVar( 'wgImageMagickConvertCommand', '' );
if ( $convert ) {
$this->setVar( 'wgImageMagickConvertCommand', $convert );
$this->showMessage( 'config-imagemagick', $convert );
+
return true;
} elseif ( function_exists( 'imagejpeg' ) ) {
$this->showMessage( 'config-gd' );
-
} else {
$this->showMessage( 'config-no-scaling' );
}
+
+ return true;
+ }
+
+ /**
+ * Search for git.
+ *
+ * @since 1.22
+ * @return bool
+ */
+ protected function envCheckGit() {
+ $names = array( wfIsWindows() ? 'git.exe' : 'git' );
+ $versionInfo = array( '$1 --version', 'git version' );
+
+ $git = self::locateExecutableInDefaultPaths( $names, $versionInfo );
+
+ if ( $git ) {
+ $this->setVar( 'wgGitBin', $git );
+ $this->showMessage( 'config-git', $git );
+ } else {
+ $this->setVar( 'wgGitBin', false );
+ $this->showMessage( 'config-git-bad' );
+ }
+
return true;
}
@@ -926,8 +980,11 @@ abstract class Installer {
*/
protected function envCheckServer() {
$server = $this->envGetDefaultServer();
- $this->showMessage( 'config-using-server', $server );
- $this->setVar( 'wgServer', $server );
+ if ( $server !== null ) {
+ $this->showMessage( 'config-using-server', $server );
+ $this->setVar( 'wgServer', $server );
+ }
+
return true;
}
@@ -946,12 +1003,18 @@ abstract class Installer {
$IP = dirname( dirname( __DIR__ ) );
$this->setVar( 'IP', $IP );
- $this->showMessage( 'config-using-uri', $this->getVar( 'wgServer' ), $this->getVar( 'wgScriptPath' ) );
+ $this->showMessage(
+ 'config-using-uri',
+ $this->getVar( 'wgServer' ),
+ $this->getVar( 'wgScriptPath' )
+ );
+
return true;
}
/**
* Environment check for setting the preferred PHP file extension.
+ * @return bool
*/
protected function envCheckExtension() {
// @todo FIXME: Detect this properly
@@ -961,11 +1024,12 @@ abstract class Installer {
$ext = 'php';
}
$this->setVar( 'wgScriptExtension', ".$ext" );
+
return true;
}
/**
- * TODO: document
+ * Environment check for preferred locale in shell
* @return bool
*/
protected function envCheckShellLocale() {
@@ -984,7 +1048,7 @@ abstract class Installer {
return true;
}
- $lines = wfArrayMap( 'trim', explode( "\n", $lines ) );
+ $lines = array_map( 'trim', explode( "\n", $lines ) );
$candidatesByLocale = array();
$candidatesByLang = array();
@@ -1004,8 +1068,9 @@ abstract class Installer {
}
# Try the current value of LANG.
- if ( isset( $candidatesByLocale[ getenv( 'LANG' ) ] ) ) {
+ if ( isset( $candidatesByLocale[getenv( 'LANG' )] ) ) {
$this->setVar( 'wgShellLocale', getenv( 'LANG' ) );
+
return true;
}
@@ -1014,6 +1079,7 @@ abstract class Installer {
foreach ( $commonLocales as $commonLocale ) {
if ( isset( $candidatesByLocale[$commonLocale] ) ) {
$this->setVar( 'wgShellLocale', $commonLocale );
+
return true;
}
}
@@ -1024,6 +1090,7 @@ abstract class Installer {
if ( isset( $candidatesByLang[$wikiLang] ) ) {
$m = reset( $candidatesByLang[$wikiLang] );
$this->setVar( 'wgShellLocale', $m[0] );
+
return true;
}
@@ -1031,6 +1098,7 @@ abstract class Installer {
if ( count( $candidatesByLocale ) ) {
$m = reset( $candidatesByLocale );
$this->setVar( 'wgShellLocale', $m[0] );
+
return true;
}
@@ -1039,7 +1107,7 @@ abstract class Installer {
}
/**
- * TODO: document
+ * Environment check for the permissions of the uploads directory
* @return bool
*/
protected function envCheckUploadsDirectory() {
@@ -1052,26 +1120,22 @@ abstract class Installer {
if ( !$safe ) {
$this->showMessage( 'config-uploads-not-safe', $dir );
}
+
return true;
}
/**
- * Checks if suhosin.get.max_value_length is set, and if so, sets
- * $wgResourceLoaderMaxQueryLength to that value in the generated
- * LocalSettings file
+ * Checks if suhosin.get.max_value_length is set, and if so generate
+ * a warning because it decreases ResourceLoader performance.
* @return bool
*/
protected function envCheckSuhosinMaxValueLength() {
$maxValueLength = ini_get( 'suhosin.get.max_value_length' );
- if ( $maxValueLength > 0 ) {
- if( $maxValueLength < 1024 ) {
- # Only warn if the value is below the sane 1024
- $this->showMessage( 'config-suhosin-max-value-length', $maxValueLength );
- }
- } else {
- $maxValueLength = -1;
+ if ( $maxValueLength > 0 && $maxValueLength < 1024 ) {
+ // Only warn if the value is below the sane 1024
+ $this->showMessage( 'config-suhosin-max-value-length', $maxValueLength );
}
- $this->setVar( 'wgResourceLoaderMaxQueryLength', $maxValueLength );
+
return true;
}
@@ -1122,14 +1186,14 @@ abstract class Installer {
* We're going to prefer the pecl extension here unless
* utf8_normalize is more up to date.
*/
- if( $utf8 ) {
+ if ( $utf8 ) {
$useNormalizer = 'utf8';
$utf8 = utf8_normalize( $not_normal_c, UtfNormal::UNORM_NFC );
if ( $utf8 !== $normal_c ) {
$needsUpdate = true;
}
}
- if( $intl ) {
+ if ( $intl ) {
$useNormalizer = 'intl';
$intl = normalizer_normalize( $not_normal_c, Normalizer::FORM_C );
if ( $intl !== $normal_c ) {
@@ -1137,12 +1201,13 @@ abstract class Installer {
}
}
- // Uses messages 'config-unicode-using-php', 'config-unicode-using-utf8', 'config-unicode-using-intl'
- if( $useNormalizer === 'php' ) {
+ // 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 ) {
+ if ( $needsUpdate ) {
$this->showMessage( 'config-unicode-update-warning' );
}
}
@@ -1154,8 +1219,23 @@ abstract class Installer {
protected function envCheckCtype() {
if ( !function_exists( 'ctype_digit' ) ) {
$this->showError( 'config-ctype' );
+
+ return false;
+ }
+
+ return true;
+ }
+
+ /**
+ * @return bool
+ */
+ protected function envCheckJSON() {
+ if ( !function_exists( 'json_decode' ) ) {
+ $this->showError( 'config-json' );
+
return false;
}
+
return true;
}
@@ -1184,8 +1264,8 @@ abstract class Installer {
* @param string $path path to search
* @param array $names 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
+ * 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.
@@ -1214,6 +1294,7 @@ abstract class Installer {
}
}
}
+
return false;
}
@@ -1225,12 +1306,13 @@ abstract class Installer {
* @return bool|string
*/
public static function locateExecutableInDefaultPaths( $names, $versionInfo = false ) {
- foreach( self::getPossibleBinPaths() as $path ) {
+ foreach ( self::getPossibleBinPaths() as $path ) {
$exe = self::locateExecutable( $path, $names, $versionInfo );
- if( $exe !== false ) {
+ if ( $exe !== false ) {
return $exe;
}
}
+
return false;
}
@@ -1264,8 +1346,7 @@ abstract class Installer {
try {
$text = Http::get( $url . $file, array( 'timeout' => 3 ) );
- }
- catch( MWException $e ) {
+ } catch ( MWException $e ) {
// Http::get throws with allow_url_fopen = false and no curl extension.
$text = null;
}
@@ -1273,6 +1354,7 @@ abstract class Installer {
if ( $text == 'exec' ) {
wfRestoreWarnings();
+
return $ext;
}
}
@@ -1297,6 +1379,7 @@ abstract class Installer {
ob_start();
phpinfo( INFO_MODULES );
$info = ob_get_clean();
+
return strpos( $info, $moduleName ) !== false;
}
@@ -1320,30 +1403,61 @@ abstract class Installer {
}
/**
+ * Load the extension credits for i18n strings. Very hacky for
+ * now, but I expect it only be used for 1.22.0 at the most.
+ */
+ public function getExtensionInfo( $file ) {
+ global $wgExtensionCredits, $wgVersion, $wgResourceModules;
+
+ $wgVersion = "1.22";
+ $wgResourceModules = array();
+ require_once( $file );
+ $e = array_values( $wgExtensionCredits );
+ if( $e ) {
+ $ext = array_values( $e[0] );
+ $wgExtensionCredits = array();
+ return $ext[0];
+ }
+ }
+
+ /**
* 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;
+ if ( $this->getVar( 'IP' ) === null ) {
+ return array();
}
- $exts = array();
$extDir = $this->getVar( 'IP' ) . '/extensions';
- $dh = opendir( $extDir );
+ if ( !is_readable( $extDir ) || !is_dir( $extDir ) ) {
+ return array();
+ }
+ $dh = opendir( $extDir );
+ $exts = array();
while ( ( $file = readdir( $dh ) ) !== false ) {
- if( !is_dir( "$extDir/$file" ) ) {
+ if ( !is_dir( "$extDir/$file" ) ) {
continue;
}
- if( file_exists( "$extDir/$file/$file.php" ) ) {
- $exts[] = $file;
+
+ $extFile = "$extDir/$file/$file.php";
+ $extI18NFile = "$extDir/$file/$file.i18n.php";
+ if ( file_exists( $extFile ) ) {
+ if ( $info = $this->getExtensionInfo( $extFile ) ) {
+ $exts[$info['name']] = $info;
+
+ if ( file_exists( $extI18NFile ) ) {
+ global $wgExtensionMessagesFiles;
+ $wgExtensionMessagesFiles[$file] = $extI18NFile;
+ }
+ }
}
}
- natcasesort( $exts );
-
+ closedir( $dh );
+ uksort( $exts, 'strnatcasecmp' );
return $exts;
}
@@ -1368,10 +1482,11 @@ abstract class Installer {
global $wgAutoloadClasses;
$wgAutoloadClasses = array();
- require( "$IP/includes/DefaultSettings.php" );
+ require "$IP/includes/DefaultSettings.php";
- foreach( $exts as $e ) {
- require_once( "$IP/extensions/$e/$e.php" );
+ $extensions = $this->findExtensions();
+ foreach ( $exts as $e ) {
+ require_once $extensions[$e]['path'];
}
$hooksWeWant = isset( $wgHooks['LoadExtensionSchemaUpdates'] ) ?
@@ -1398,29 +1513,29 @@ abstract class Installer {
*/
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' ) ),
+ 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 ) {
+ foreach ( $coreInstallSteps as $step ) {
$this->installSteps[] = $step;
- if( isset( $this->extraInstallSteps[ $step['name'] ] ) ) {
+ if ( isset( $this->extraInstallSteps[$step['name']] ) ) {
$this->installSteps = array_merge(
$this->installSteps,
- $this->extraInstallSteps[ $step['name'] ]
+ $this->extraInstallSteps[$step['name']]
);
}
}
// Prepend any steps that want to be at the beginning
- if( isset( $this->extraInstallSteps['BEGINNING'] ) ) {
+ if ( isset( $this->extraInstallSteps['BEGINNING'] ) ) {
$this->installSteps = array_merge(
$this->extraInstallSteps['BEGINNING'],
$this->installSteps
@@ -1428,7 +1543,7 @@ abstract class Installer {
}
// Extensions should always go first, chance to tie into hooks and such
- if( count( $this->getVar( '_Extensions' ) ) ) {
+ if ( count( $this->getVar( '_Extensions' ) ) ) {
array_unshift( $this->installSteps,
array( 'name' => 'extensions', 'callback' => array( $this, 'includeExtensions' ) )
);
@@ -1437,6 +1552,7 @@ abstract class Installer {
'callback' => array( $installer, 'createExtensionTables' )
);
}
+
return $this->installSteps;
}
@@ -1453,7 +1569,7 @@ abstract class Installer {
$installer = $this->getDBInstaller();
$installer->preInstall();
$steps = $this->getInstallSteps( $installer );
- foreach( $steps as $stepObj ) {
+ foreach ( $steps as $stepObj ) {
$name = $stepObj['name'];
call_user_func_array( $startCB, array( $name ) );
@@ -1466,13 +1582,14 @@ abstract class Installer {
// If we've hit some sort of fatal, we need to bail.
// Callback already had a chance to do output above.
- if( !$status->isOk() ) {
+ if ( !$status->isOk() ) {
break;
}
}
- if( $status->isOk() ) {
+ if ( $status->isOk() ) {
$this->setVar( '_InstallDone', true );
}
+
return $installResults;
}
@@ -1486,6 +1603,7 @@ abstract class Installer {
if ( strval( $this->getVar( 'wgUpgradeKey' ) ) === '' ) {
$keys['wgUpgradeKey'] = 16;
}
+
return $this->doGenerateKeys( $keys );
}
@@ -1538,13 +1656,13 @@ abstract class Installer {
try {
$user->setPassword( $this->getVar( '_AdminPassword' ) );
- } catch( PasswordError $pwe ) {
+ } catch ( PasswordError $pwe ) {
return Status::newFatal( 'config-admin-error-password', $name, $pwe->getMessage() );
}
$user->addGroup( 'sysop' );
$user->addGroup( 'bureaucrat' );
- if( $this->getVar( '_AdminEmail' ) ) {
+ if ( $this->getVar( '_AdminEmail' ) ) {
$user->setEmail( $this->getVar( '_AdminEmail' ) );
}
$user->saveSettings();
@@ -1555,7 +1673,7 @@ abstract class Installer {
}
$status = Status::newGood();
- if( $this->getVar( '_Subscribe' ) && $this->getVar( '_AdminEmail' ) ) {
+ if ( $this->getVar( '_Subscribe' ) && $this->getVar( '_AdminEmail' ) ) {
$this->subscribeToMediaWikiAnnounce( $status );
}
@@ -1567,23 +1685,23 @@ abstract class Installer {
*/
private function subscribeToMediaWikiAnnounce( Status $s ) {
$params = array(
- 'email' => $this->getVar( '_AdminEmail' ),
+ 'email' => $this->getVar( '_AdminEmail' ),
'language' => 'en',
- 'digest' => 0
+ '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 ) ) {
+ if ( in_array( $myLang, $this->mediaWikiAnnounceLanguages ) ) {
$myLang = $myLang == 'pt-br' ? 'pt_BR' : $myLang; // rewrite to Mailman's pt_BR
$params['language'] = $myLang;
}
- if( MWHttpRequest::canMakeRequests() ) {
+ if ( MWHttpRequest::canMakeRequests() ) {
$res = MWHttpRequest::factory( $this->mediaWikiAnnounceUrl,
array( 'method' => 'POST', 'postData' => $params ) )->execute();
- if( !$res->isOK() ) {
+ if ( !$res->isOK() ) {
$s->warning( 'config-install-subscribe-fail', $res->getMessage() );
}
} else {
@@ -1601,17 +1719,18 @@ abstract class Installer {
$status = Status::newGood();
try {
$page = WikiPage::factory( Title::newMainPage() );
- $content = new WikitextContent (
+ $content = new WikitextContent(
wfMessage( 'mainpagetext' )->inContentLanguage()->text() . "\n\n" .
wfMessage( 'mainpagedocfooter' )->inContentLanguage()->text()
);
$page->doEditContent( $content,
- '',
- EDIT_NEW,
- false,
- User::newFromName( 'MediaWiki default' ) );
- } catch (MWException $e) {
+ '',
+ 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() );
}
@@ -1646,6 +1765,11 @@ abstract class Installer {
// Some of the environment checks make shell requests, remove limits
$GLOBALS['wgMaxShellMemory'] = 0;
+
+ // Don't bother embedding images into generated CSS, which is not cached
+ $GLOBALS['wgResourceLoaderLESSFunctions']['embeddable'] = function( $frame, $less ) {
+ return $less->toBool( false );
+ };
}
/**
diff --git a/includes/installer/LocalSettingsGenerator.php b/includes/installer/LocalSettingsGenerator.php
index 72ea3db7..5c803d3e 100644
--- a/includes/installer/LocalSettingsGenerator.php
+++ b/includes/installer/LocalSettingsGenerator.php
@@ -73,14 +73,14 @@ class LocalSettingsGenerator {
'wgEnotifWatchlist', 'wgEmailAuthentication', 'wgEnableUploads', 'wgUseInstantCommons'
);
- foreach( $confItems as $c ) {
+ foreach ( $confItems as $c ) {
$val = $installer->getVar( $c );
- if( in_array( $c, $boolItems ) ) {
+ if ( in_array( $c, $boolItems ) ) {
$val = wfBoolToStr( $val );
}
- if ( !in_array( $c, $unescaped ) ) {
+ if ( !in_array( $c, $unescaped ) && $val !== null ) {
$val = self::escapePhpString( $val );
}
@@ -136,15 +136,17 @@ class LocalSettingsGenerator {
public function getText() {
$localSettings = $this->getDefaultText();
- if( count( $this->extensions ) ) {
+ if ( count( $this->extensions ) ) {
+ $extensions = $this->installer->findExtensions();
$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_once( \"\$IP/extensions/$encExtName/$encExtName.php\" );\n";
+ $ip = $this->installer->getVar( 'IP' );
+ foreach ( $this->extensions as $ext) {
+ $path = str_replace( $ip, '$IP', $extensions[$ext]['path'] );
+ $localSettings .= "require_once \"$path\";\n";
}
}
@@ -169,13 +171,13 @@ class LocalSettingsGenerator {
protected function buildMemcachedServerList() {
$servers = $this->values['_MemCachedServers'];
- if( !$servers ) {
+ if ( !$servers ) {
return 'array()';
} else {
$ret = 'array( ';
$servers = explode( ',', $servers );
- foreach( $servers as $srv ) {
+ foreach ( $servers as $srv ) {
$srv = trim( $srv );
$ret .= "'$srv', ";
}
@@ -188,33 +190,33 @@ class LocalSettingsGenerator {
* @return String
*/
protected function getDefaultText() {
- if( !$this->values['wgImageMagickConvertCommand'] ) {
+ if ( !$this->values['wgImageMagickConvertCommand'] ) {
$this->values['wgImageMagickConvertCommand'] = '/usr/bin/convert';
$magic = '#';
} else {
$magic = '';
}
- if( !$this->values['wgShellLocale'] ) {
+ if ( !$this->values['wgShellLocale'] ) {
$this->values['wgShellLocale'] = 'en_US.UTF-8';
$locale = '#';
} else {
$locale = '';
}
- //$rightsUrl = $this->values['wgRightsUrl'] ? '' : '#'; // TODO: Fixme, I'm unused!
+ //$rightsUrl = $this->values['wgRightsUrl'] ? '' : '#'; // @todo FIXME: I'm unused!
$hashedUploads = $this->safeMode ? '' : '#';
$metaNamespace = '';
- if( $this->values['wgMetaNamespace'] !== $this->values['wgSitename'] ) {
+ if ( $this->values['wgMetaNamespace'] !== $this->values['wgSitename'] ) {
$metaNamespace = "\$wgMetaNamespace = \"{$this->values['wgMetaNamespace']}\";\n";
}
$groupRights = '';
- if( $this->groupPermissions ) {
+ if ( $this->groupPermissions ) {
$groupRights .= "# The following permissions were set based on your choice in the installer\n";
- foreach( $this->groupPermissions as $group => $rightArr ) {
+ foreach ( $this->groupPermissions as $group => $rightArr ) {
$group = self::escapePhpString( $group );
- foreach( $rightArr as $right => $perm ) {
+ foreach ( $rightArr as $right => $perm ) {
$right = self::escapePhpString( $right );
$groupRights .= "\$wgGroupPermissions['$group']['$right'] = " .
wfBoolToStr( $perm ) . ";\n";
@@ -222,12 +224,18 @@ class LocalSettingsGenerator {
}
}
- switch( $this->values['wgMainCacheType'] ) {
+ $wgServerSetting = "";
+ if ( array_key_exists( 'wgServer', $this->values ) && $this->values['wgServer'] !== null ) {
+ $wgServerSetting = "\n## The protocol and server name to use in fully-qualified URLs\n";
+ $wgServerSetting .= "\$wgServer = \"{$this->values['wgServer']}\";\n";
+ }
+
+ switch ( $this->values['wgMainCacheType'] ) {
case 'anything':
case 'db':
case 'memcached':
case 'accel':
- $cacheType = 'CACHE_' . strtoupper( $this->values['wgMainCacheType']);
+ $cacheType = 'CACHE_' . strtoupper( $this->values['wgMainCacheType'] );
break;
case 'none':
default:
@@ -235,6 +243,7 @@ class LocalSettingsGenerator {
}
$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
@@ -264,10 +273,7 @@ if ( !defined( 'MEDIAWIKI' ) ) {
## http://www.mediawiki.org/wiki/Manual:Short_URL
\$wgScriptPath = \"{$this->values['wgScriptPath']}\";
\$wgScriptExtension = \"{$this->values['wgScriptExtension']}\";
-
-## The protocol and server name to use in fully-qualified URLs
-\$wgServer = \"{$this->values['wgServer']}\";
-
+${wgServerSetting}
## The relative URL path to the skins directory
\$wgStylePath = \"\$wgScriptPath/skins\";
@@ -335,7 +341,7 @@ if ( !defined( 'MEDIAWIKI' ) ) {
\$wgUpgradeKey = \"{$this->values['wgUpgradeKey']}\";
## Default skin: you can change the default skin. Use the internal symbolic
-## names, ie 'standard', 'nostalgia', 'cologneblue', 'monobook', 'vector':
+## names, ie 'cologneblue', 'monobook', 'vector':
\$wgDefaultSkin = \"{$this->values['wgDefaultSkin']}\";
## For attaching licensing metadata to pages, and displaying an
@@ -349,13 +355,6 @@ if ( !defined( 'MEDIAWIKI' ) ) {
# Path to the GNU diff3 utility. Used for conflict resolution.
\$wgDiff3 = \"{$this->values['wgDiff3']}\";
-# 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']};
-
{$groupRights}";
}
-
}
diff --git a/includes/installer/MysqlInstaller.php b/includes/installer/MysqlInstaller.php
index f9a8ce75..5f76972c 100644
--- a/includes/installer/MysqlInstaller.php
+++ b/includes/installer/MysqlInstaller.php
@@ -64,15 +64,11 @@ class MysqlInstaller extends DatabaseInstaller {
return 'mysql';
}
- public function __construct( $parent ) {
- parent::__construct( $parent );
- }
-
/**
* @return Bool
*/
public function isCompiled() {
- return self::checkExtension( 'mysql' );
+ return self::checkExtension( 'mysql' ) || self::checkExtension( 'mysqli' );
}
/**
@@ -86,12 +82,18 @@ class MysqlInstaller extends DatabaseInstaller {
* @return string
*/
public function getConnectForm() {
- return
- $this->getTextBox( 'wgDBserver', 'config-db-host', array(), $this->parent->getHelpBox( 'config-db-host-help' ) ) .
+ return $this->getTextBox(
+ 'wgDBserver',
+ 'config-db-host',
+ array(),
+ $this->parent->getHelpBox( 'config-db-host-help' )
+ ) .
Html::openElement( 'fieldset' ) .
Html::element( 'legend', array(), wfMessage( 'config-db-wiki-settings' )->text() ) .
- $this->getTextBox( 'wgDBname', 'config-db-name', array( 'dir' => 'ltr' ), $this->parent->getHelpBox( 'config-db-name-help' ) ) .
- $this->getTextBox( 'wgDBprefix', 'config-db-prefix', array( 'dir' => 'ltr' ), $this->parent->getHelpBox( 'config-db-prefix-help' ) ) .
+ $this->getTextBox( 'wgDBname', 'config-db-name', array( 'dir' => 'ltr' ),
+ $this->parent->getHelpBox( 'config-db-name-help' ) ) .
+ $this->getTextBox( 'wgDBprefix', 'config-db-prefix', array( 'dir' => 'ltr' ),
+ $this->parent->getHelpBox( 'config-db-prefix-help' ) ) .
Html::closeElement( 'fieldset' ) .
$this->getInstallUserBox();
}
@@ -148,19 +150,18 @@ class MysqlInstaller extends DatabaseInstaller {
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' )
- );
+ $db = DatabaseBase::factory( 'mysql', array(
+ 'host' => $this->getVar( 'wgDBserver' ),
+ 'user' => $this->getVar( '_InstallUser' ),
+ 'password' => $this->getVar( '_InstallPassword' ),
+ 'dbname' => false,
+ 'flags' => 0,
+ 'tablePrefix' => $this->getVar( 'wgDBprefix' ) ) );
$status->value = $db;
} catch ( DBConnectionError $e ) {
$status->fatal( 'config-connection-error', $e->getMessage() );
}
+
return $status;
}
@@ -170,6 +171,7 @@ class MysqlInstaller extends DatabaseInstaller {
$status = $this->getConnection();
if ( !$status->isOK() ) {
$this->parent->showStatusError( $status );
+
return;
}
/**
@@ -243,6 +245,7 @@ class MysqlInstaller extends DatabaseInstaller {
}
}
$engines = array_intersect( $this->supportedEngines, $engines );
+
return $engines;
}
@@ -327,6 +330,7 @@ class MysqlInstaller extends DatabaseInstaller {
// Can't grant everything
return false;
}
+
return true;
}
@@ -350,17 +354,24 @@ class MysqlInstaller extends DatabaseInstaller {
$s .= Xml::openElement( 'div', array(
'id' => 'dbMyisamWarning'
- ));
- $s .= $this->parent->getWarningBox( wfMessage( 'config-mysql-myisam-dep' )->text() );
+ ) );
+ $myisamWarning = 'config-mysql-myisam-dep';
+ if ( count( $engines ) === 1 ) {
+ $myisamWarning = 'config-mysql-only-myisam-dep';
+ }
+ $s .= $this->parent->getWarningBox( wfMessage( $myisamWarning )->text() );
$s .= Xml::closeElement( 'div' );
- if( $this->getVar( '_MysqlEngine' ) != 'MyISAM' ) {
+ if ( $this->getVar( '_MysqlEngine' ) != 'MyISAM' ) {
$s .= Xml::openElement( 'script', array( 'type' => 'text/javascript' ) );
$s .= '$(\'#dbMyisamWarning\').hide();';
$s .= Xml::closeElement( 'script' );
}
if ( count( $engines ) >= 2 ) {
+ // getRadioSet() builds a set of labeled radio buttons.
+ // For grep: The following messages are used as the item labels:
+ // config-mysql-innodb, config-mysql-myisam
$s .= $this->getRadioSet( array(
'var' => '_MysqlEngine',
'label' => 'config-mysql-engine',
@@ -369,11 +380,14 @@ class MysqlInstaller extends DatabaseInstaller {
'itemAttribs' => array(
'MyISAM' => array(
'class' => 'showHideRadio',
- 'rel' => 'dbMyisamWarning'),
+ 'rel' => 'dbMyisamWarning'
+ ),
'InnoDB' => array(
'class' => 'hideShowRadio',
- 'rel' => 'dbMyisamWarning')
- )));
+ 'rel' => 'dbMyisamWarning'
+ )
+ )
+ ) );
$s .= $this->parent->getHelpBox( 'config-mysql-engine-help' );
}
@@ -385,12 +399,15 @@ class MysqlInstaller extends DatabaseInstaller {
// Do charset selector
if ( count( $charsets ) >= 2 ) {
+ // getRadioSet() builds a set of labeled radio buttons.
+ // For grep: The following messages are used as the item labels:
+ // config-mysql-binary, config-mysql-utf8
$s .= $this->getRadioSet( array(
'var' => '_MysqlCharset',
'label' => 'config-mysql-charset',
'itemLabelPrefix' => 'config-mysql-',
'values' => $charsets
- ));
+ ) );
$s .= $this->parent->getHelpBox( 'config-mysql-charset-help' );
}
@@ -419,15 +436,13 @@ class MysqlInstaller extends DatabaseInstaller {
if ( !$create ) {
// Test the web account
try {
- new DatabaseMysql(
- $this->getVar( 'wgDBserver' ),
- $this->getVar( 'wgDBuser' ),
- $this->getVar( 'wgDBpassword' ),
- false,
- false,
- 0,
- $this->getVar( 'wgDBprefix' )
- );
+ $db = DatabaseBase::factory( 'mysql', array(
+ 'host' => $this->getVar( 'wgDBserver' ),
+ 'user' => $this->getVar( 'wgDBuser' ),
+ 'password' => $this->getVar( 'wgDBpassword' ),
+ 'dbname' => false,
+ 'flags' => 0,
+ 'tablePrefix' => $this->getVar( 'wgDBprefix' ) ) );
} catch ( DBConnectionError $e ) {
return Status::newFatal( 'config-connection-error', $e->getMessage() );
}
@@ -443,6 +458,7 @@ class MysqlInstaller extends DatabaseInstaller {
if ( !in_array( $this->getVar( '_MysqlCharset' ), $charsets ) ) {
$this->setVar( '_MysqlCharset', reset( $charsets ) );
}
+
return Status::newGood();
}
@@ -465,11 +481,15 @@ class MysqlInstaller extends DatabaseInstaller {
}
$conn = $status->value;
$dbName = $this->getVar( 'wgDBname' );
- if( !$conn->selectDB( $dbName ) ) {
- $conn->query( "CREATE DATABASE " . $conn->addIdentifierQuotes( $dbName ), __METHOD__ );
+ if ( !$conn->selectDB( $dbName ) ) {
+ $conn->query(
+ "CREATE DATABASE " . $conn->addIdentifierQuotes( $dbName ) . "CHARACTER SET utf8",
+ __METHOD__
+ );
$conn->selectDB( $dbName );
}
$this->setupSchemaVars();
+
return $status;
}
@@ -478,7 +498,7 @@ class MysqlInstaller extends DatabaseInstaller {
*/
public function setupUser() {
$dbUser = $this->getVar( 'wgDBuser' );
- if( $dbUser == $this->getVar( '_InstallUser' ) ) {
+ if ( $dbUser == $this->getVar( '_InstallUser' ) ) {
return Status::newGood();
}
$status = $this->getConnection();
@@ -496,15 +516,13 @@ class MysqlInstaller extends DatabaseInstaller {
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' )
- );
+ $db = DatabaseBase::factory( 'mysql', array(
+ 'host' => $server,
+ 'user' => $dbUser,
+ 'password' => $password,
+ 'dbname' => false,
+ 'flags' => 0,
+ 'tablePrefix' => $this->getVar( 'wgDBprefix' ) ) );
$grantableNames[] = $this->buildFullUserName( $dbUser, $server );
$tryToCreate = false;
} catch ( DBConnectionError $e ) {
@@ -515,7 +533,7 @@ class MysqlInstaller extends DatabaseInstaller {
$tryToCreate = false;
}
- if( $tryToCreate ) {
+ if ( $tryToCreate ) {
$createHostList = array(
$server,
'localhost',
@@ -526,16 +544,16 @@ class MysqlInstaller extends DatabaseInstaller {
$createHostList = array_unique( $createHostList );
$escPass = $this->db->addQuotes( $password );
- foreach( $createHostList as $host ) {
+ foreach ( $createHostList as $host ) {
$fullName = $this->buildFullUserName( $dbUser, $host );
- if( !$this->userDefinitelyExists( $dbUser, $host ) ) {
- try{
+ if ( !$this->userDefinitelyExists( $dbUser, $host ) ) {
+ try {
$this->db->begin( __METHOD__ );
$this->db->query( "CREATE USER $fullName IDENTIFIED BY $escPass", __METHOD__ );
$this->db->commit( __METHOD__ );
$grantableNames[] = $fullName;
- } catch( DBQueryError $dqe ) {
- if( $this->db->lastErrno() == 1396 /* ER_CANNOT_USER */ ) {
+ } catch ( DBQueryError $dqe ) {
+ if ( $this->db->lastErrno() == 1396 /* ER_CANNOT_USER */ ) {
// User (probably) already exists
$this->db->rollback( __METHOD__ );
$status->warning( 'config-install-user-alreadyexists', $dbUser );
@@ -558,12 +576,12 @@ class MysqlInstaller extends DatabaseInstaller {
// Try to grant to all the users we know exist or we were able to create
$dbAllTables = $this->db->addIdentifierQuotes( $dbName ) . '.*';
- foreach( $grantableNames as $name ) {
+ foreach ( $grantableNames as $name ) {
try {
$this->db->begin( __METHOD__ );
$this->db->query( "GRANT ALL PRIVILEGES ON $dbAllTables TO $name", __METHOD__ );
$this->db->commit( __METHOD__ );
- } catch( DBQueryError $dqe ) {
+ } catch ( DBQueryError $dqe ) {
$this->db->rollback( __METHOD__ );
$status->fatal( 'config-install-user-grant-failed', $dbUser, $dqe->getText() );
}
@@ -593,11 +611,11 @@ class MysqlInstaller extends DatabaseInstaller {
try {
$res = $this->db->selectRow( 'mysql.user', array( 'Host', 'User' ),
array( 'Host' => $host, 'User' => $user ), __METHOD__ );
+
return (bool)$res;
- } catch( DBQueryError $dqe ) {
+ } catch ( DBQueryError $dqe ) {
return false;
}
-
}
/**
@@ -614,6 +632,7 @@ class MysqlInstaller extends DatabaseInstaller {
if ( $this->getVar( '_MysqlCharset' ) !== null ) {
$options[] = 'DEFAULT CHARSET=' . $this->getVar( '_MysqlCharset' );
}
+
return implode( ', ', $options );
}
@@ -635,8 +654,8 @@ class MysqlInstaller extends DatabaseInstaller {
$dbmysql5 = wfBoolToStr( $this->getVar( 'wgDBmysql5', true ) );
$prefix = LocalSettingsGenerator::escapePhpString( $this->getVar( 'wgDBprefix' ) );
$tblOpts = LocalSettingsGenerator::escapePhpString( $this->getTableOptions() );
- return
-"# MySQL specific settings
+
+ return "# MySQL specific settings
\$wgDBprefix = \"{$prefix}\";
# MySQL table options to use during installation or update
diff --git a/includes/installer/MysqlUpdater.php b/includes/installer/MysqlUpdater.php
index 030c57fc..f348ecd4 100644
--- a/includes/installer/MysqlUpdater.php
+++ b/includes/installer/MysqlUpdater.php
@@ -31,209 +31,214 @@ class MysqlUpdater extends DatabaseUpdater {
protected function getCoreUpdateList() {
return array(
- array( 'disableContentHandlerUseDB' ),
-
// 1.2
- array( 'addField', 'ipblocks', 'ipb_id', 'patch-ipblocks.sql' ),
- array( 'addField', 'ipblocks', 'ipb_expiry', 'patch-ipb_expiry.sql' ),
+ 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' ),
+ 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( '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' ),
+ 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( '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' ),
+ 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( '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( 'addField', 'image', 'img_media_type', 'patch-img_media_type.sql' ),
array( 'doPagelinksUpdate' ),
- array( 'dropField', 'image', 'img_type', 'patch-drop_img_type.sql' ),
+ 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( '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' ),
// 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( '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( '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' ),
+ 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( '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' ),
+ 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' ),
+ 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( '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' ),
+ 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' ),
+ 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( '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( '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( '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( '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( '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' ), */
+ array( 'addTable', 'change_tag', 'patch-change_tag.sql' ),
+ array( 'addTable', 'tag_summary', 'patch-tag_summary.sql' ),
+ array( 'addTable', 'valid_tag', 'patch-valid_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( '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' ),
+ # listed separately from the previous update because 1.16 was released without this update
+ array( 'doLogUsertextPopulation' ),
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( 'addTable', 'l10n_cache', 'patch-l10n_cache.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' ),
// 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( '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( '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( '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.18
array( 'doUserNewTalkTimestampNotNull' ),
- array( 'addIndex', 'user', 'user_email', 'patch-user_email_index.sql' ),
+ array( 'addIndex', 'user', 'user_email', 'patch-user_email_index.sql' ),
array( 'modifyField', 'user_properties', 'up_property', 'patch-up_property.sql' ),
- array( 'addTable', 'uploadstash', 'patch-uploadstash.sql' ),
- array( 'addTable', 'user_former_groups', 'patch-user_former_groups.sql'),
+ array( 'addTable', 'uploadstash', 'patch-uploadstash.sql' ),
+ array( 'addTable', 'user_former_groups', 'patch-user_former_groups.sql' ),
// 1.19
- array( 'addIndex', 'logging', 'type_action', 'patch-logging-type-action-index.sql'),
- array( 'addField', 'revision', 'rev_sha1', 'patch-rev_sha1.sql' ),
+ array( 'addIndex', 'logging', 'type_action', 'patch-logging-type-action-index.sql' ),
+ array( 'addField', 'revision', 'rev_sha1', 'patch-rev_sha1.sql' ),
array( 'doMigrateUserOptions' ),
- array( 'dropField', 'user', 'user_options', 'patch-drop-user_options.sql' ),
- array( 'addField', 'archive', 'ar_sha1', 'patch-ar_sha1.sql' ),
- array( 'addIndex', 'page', 'page_redirect_namespace_len', 'patch-page_redirect_namespace_len.sql' ),
- array( 'addField', 'uploadstash', 'us_chunk_inx', 'patch-uploadstash_chunk.sql' ),
- array( 'addfield', 'job', 'job_timestamp', 'patch-jobs-add-timestamp.sql' ),
+ array( 'dropField', 'user', 'user_options', 'patch-drop-user_options.sql' ),
+ array( 'addField', 'archive', 'ar_sha1', 'patch-ar_sha1.sql' ),
+ array( 'addIndex', 'page', 'page_redirect_namespace_len',
+ 'patch-page_redirect_namespace_len.sql' ),
+ array( 'addField', 'uploadstash', 'us_chunk_inx', 'patch-uploadstash_chunk.sql' ),
+ array( 'addfield', 'job', 'job_timestamp', 'patch-jobs-add-timestamp.sql' ),
// 1.20
array( 'addIndex', 'revision', 'page_user_timestamp', 'patch-revision-user-page-index.sql' ),
- array( 'addField', 'ipblocks', 'ipb_parent_block_id', 'patch-ipb-parent-block-id.sql' ),
- array( 'addIndex', 'ipblocks', 'ipb_parent_block_id', 'patch-ipb-parent-block-id-index.sql' ),
- array( 'dropField', 'category', 'cat_hidden', 'patch-cat_hidden.sql' ),
+ array( 'addField', 'ipblocks', 'ipb_parent_block_id', 'patch-ipb-parent-block-id.sql' ),
+ array( 'addIndex', 'ipblocks', 'ipb_parent_block_id', 'patch-ipb-parent-block-id-index.sql' ),
+ array( 'dropField', 'category', 'cat_hidden', 'patch-cat_hidden.sql' ),
// 1.21
- array( 'addField', 'revision', 'rev_content_format', 'patch-revision-rev_content_format.sql' ),
- array( 'addField', 'revision', 'rev_content_model', 'patch-revision-rev_content_model.sql' ),
- array( 'addField', 'archive', 'ar_content_format', 'patch-archive-ar_content_format.sql' ),
- array( 'addField', 'archive', 'ar_content_model', 'patch-archive-ar_content_model.sql' ),
- array( 'addField', 'page', 'page_content_model', 'patch-page-page_content_model.sql' ),
- array( 'enableContentHandlerUseDB' ),
-
- array( 'dropField', 'site_stats', 'ss_admins', 'patch-drop-ss_admins.sql' ),
- array( 'dropField', 'recentchanges', 'rc_moved_to_title', 'patch-rc_moved.sql' ),
- array( 'addTable', 'sites', 'patch-sites.sql' ),
- array( 'addField', 'filearchive', 'fa_sha1', 'patch-fa_sha1.sql' ),
- array( 'addField', 'job', 'job_token', 'patch-job_token.sql' ),
- array( 'addField', 'job', 'job_attempts', 'patch-job_attempts.sql' ),
+ array( 'addField', 'revision', 'rev_content_format', 'patch-revision-rev_content_format.sql' ),
+ array( 'addField', 'revision', 'rev_content_model', 'patch-revision-rev_content_model.sql' ),
+ array( 'addField', 'archive', 'ar_content_format', 'patch-archive-ar_content_format.sql' ),
+ array( 'addField', 'archive', 'ar_content_model', 'patch-archive-ar_content_model.sql' ),
+ array( 'addField', 'page', 'page_content_model', 'patch-page-page_content_model.sql' ),
+ array( 'dropField', 'site_stats', 'ss_admins', 'patch-drop-ss_admins.sql' ),
+ array( 'dropField', 'recentchanges', 'rc_moved_to_title', 'patch-rc_moved.sql' ),
+ array( 'addTable', 'sites', 'patch-sites.sql' ),
+ array( 'addField', 'filearchive', 'fa_sha1', 'patch-fa_sha1.sql' ),
+ array( 'addField', 'job', 'job_token', 'patch-job_token.sql' ),
+ array( 'addField', 'job', 'job_attempts', 'patch-job_attempts.sql' ),
array( 'doEnableProfiling' ),
- array( 'addField', 'uploadstash', 'us_props', 'patch-uploadstash-us_props.sql' ),
+ array( 'addField', 'uploadstash', 'us_props', 'patch-uploadstash-us_props.sql' ),
array( 'modifyField', 'user_groups', 'ug_group', 'patch-ug_group-length-increase-255.sql' ),
- array( 'modifyField', 'user_former_groups', 'ufg_group', 'patch-ufg_group-length-increase-255.sql' ),
- array( 'addIndex', 'page_props', 'pp_propname_page', 'patch-page_props-propname-page-index.sql' ),
+ array( 'modifyField', 'user_former_groups', 'ufg_group',
+ 'patch-ufg_group-length-increase-255.sql' ),
+ array( 'addIndex', 'page_props', 'pp_propname_page',
+ 'patch-page_props-propname-page-index.sql' ),
array( 'addIndex', 'image', 'img_media_mime', 'patch-img_media_mime-index.sql' ),
+
+ // 1.22
+ array( 'doIwlinksIndexNonUnique' ),
+ array( 'addIndex', 'iwlinks', 'iwl_prefix_from_title',
+ 'patch-iwlinks-from-title-index.sql' ),
+ array( 'addField', 'archive', 'ar_id', 'patch-archive-ar_id.sql' ),
+ array( 'addField', 'externallinks', 'el_id', 'patch-externallinks-el_id.sql' ),
);
}
@@ -250,11 +255,8 @@ class MysqlUpdater extends DatabaseUpdater {
return true;
}
- $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 ) ) {
+ $fieldInfo = $this->db->fieldInfo( $table, $field );
+ if ( $fieldInfo->isBinary() ) {
$this->output( "...$table table has correct $field encoding.\n" );
} else {
$this->applyPatch( $patchFile, false, "Fixing $field encoding on $table table" );
@@ -279,11 +281,13 @@ class MysqlUpdater extends DatabaseUpdater {
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; added.\n" );
+
return false;
}
@@ -299,11 +303,16 @@ class MysqlUpdater extends DatabaseUpdater {
if ( $this->db->tableExists( "interwiki", __METHOD__ ) ) {
$this->output( "...already have interwiki table\n" );
+
return;
}
$this->applyPatch( 'patch-interwiki.sql', false, 'Creating interwiki table' );
- $this->applyPatch( "$IP/maintenance/interwiki.sql", true, 'Adding default interwiki definitions' );
+ $this->applyPatch(
+ "$IP/maintenance/interwiki.sql",
+ true,
+ 'Adding default interwiki definitions'
+ );
}
/**
@@ -316,6 +325,7 @@ class MysqlUpdater extends DatabaseUpdater {
}
if ( $meta->isMultipleKey() ) {
$this->output( "...indexes seem up to 20031107 standards.\n" );
+
return;
}
@@ -331,10 +341,17 @@ class MysqlUpdater extends DatabaseUpdater {
$info = $this->db->fieldInfo( 'imagelinks', 'il_from' );
if ( !$info || $info->type() !== 'string' ) {
$this->output( "...il_from OK\n" );
+
return;
}
- if( $this->applyPatch( 'patch-fix-il_from.sql', false, "Fixing ancient broken imagelinks table." ) ) {
+ $applied = $this->applyPatch(
+ 'patch-fix-il_from.sql',
+ false,
+ 'Fixing ancient broken imagelinks table.'
+ );
+
+ if ( $applied ) {
$this->output( "NOTE: you will have to run maintenance/refreshLinks.php after this." );
}
}
@@ -344,9 +361,15 @@ class MysqlUpdater extends DatabaseUpdater {
*/
function doWatchlistUpdate() {
$talk = $this->db->selectField( 'watchlist', 'count(*)', 'wl_namespace & 1', __METHOD__ );
- $nontalk = $this->db->selectField( 'watchlist', 'count(*)', 'NOT (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;
}
@@ -364,6 +387,7 @@ class MysqlUpdater extends DatabaseUpdater {
function doSchemaRestructuring() {
if ( $this->db->tableExists( 'page', __METHOD__ ) ) {
$this->output( "...page table already exists.\n" );
+
return;
}
@@ -371,10 +395,21 @@ class MysqlUpdater extends DatabaseUpdater {
$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' );
+ 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__ );
+ $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 ) );
@@ -382,11 +417,16 @@ class MysqlUpdater extends DatabaseUpdater {
$this->output( sprintf( "<b> %-60s %3s %5s</b>\n", 'Title', 'NS', 'Count' ) );
$duplicate = array();
foreach ( $rows as $row ) {
- if ( ! isset( $duplicate[$row->cur_namespace] ) ) {
+ 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 ) );
+ $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;
@@ -471,7 +511,10 @@ class MysqlUpdater extends DatabaseUpdater {
$this->output( wfTimestamp( TS_DB ) );
$this->output( "......Locking tables.\n" );
- $this->db->query( "LOCK TABLES $page WRITE, $revision WRITE, $old WRITE, $cur WRITE", __METHOD__ );
+ $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 ) );
@@ -492,27 +535,38 @@ class MysqlUpdater extends DatabaseUpdater {
$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->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)
+ $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__ );
+ 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)
+ $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__ );
+ 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" );
@@ -528,12 +582,12 @@ class MysqlUpdater extends DatabaseUpdater {
protected function doNamespaceSize() {
$tables = array(
- 'page' => 'page',
- 'archive' => 'ar',
+ 'page' => 'page',
+ 'archive' => 'ar',
'recentchanges' => 'rc',
- 'watchlist' => 'wl',
- 'querycache' => 'qc',
- 'logging' => 'log',
+ 'watchlist' => 'wl',
+ 'querycache' => 'qc',
+ 'logging' => 'log',
);
foreach ( $tables as $table => $prefix ) {
$field = $prefix . '_namespace';
@@ -555,10 +609,15 @@ class MysqlUpdater extends DatabaseUpdater {
protected function doPagelinksUpdate() {
if ( $this->db->tableExists( 'pagelinks', __METHOD__ ) ) {
$this->output( "...already have pagelinks table.\n" );
+
return;
}
- $this->applyPatch( 'patch-pagelinks.sql', false, "Converting links and brokenlinks tables to pagelinks" );
+ $this->applyPatch(
+ 'patch-pagelinks.sql',
+ false,
+ 'Converting links and brokenlinks tables to pagelinks'
+ );
global $wgContLang;
foreach ( MWNamespace::getCanonicalNamespaces() as $ns => $name ) {
@@ -592,6 +651,7 @@ class MysqlUpdater extends DatabaseUpdater {
$duper = new UserDupes( $this->db, array( $this, 'output' ) );
if ( $duper->hasUniqueIndex() ) {
$this->output( "...already have unique user_name index.\n" );
+
return;
}
@@ -611,19 +671,22 @@ class MysqlUpdater extends DatabaseUpdater {
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->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( "done.\n" );
$this->applyPatch( 'patch-user_groups.sql', false, "Re-adding fresh user_groups table" );
$this->output( "***\n" );
- $this->output( "*** WARNING: You will need to manually fix up user permissions in the user_groups\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;
}
@@ -631,11 +694,16 @@ class MysqlUpdater extends DatabaseUpdater {
if ( !$this->db->tableExists( 'user_rights', __METHOD__ ) ) {
if ( $this->db->fieldExists( 'user', 'user_rights', __METHOD__ ) ) {
- $this->db->applyPatch( 'patch-user_rights.sql', false, "Upgrading from a 1.3 or older database? Breaking out user_rights for conversion" );
+ $this->applyPatch(
+ 'patch-user_rights.sql',
+ false,
+ 'Upgrading from a 1.3 or older database? Breaking out user_rights for conversion'
+ );
} 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;
}
}
@@ -654,7 +722,7 @@ class MysqlUpdater extends DatabaseUpdater {
foreach ( $groups as $group ) {
$this->db->insert( 'user_groups',
array(
- 'ug_user' => $row->ur_user,
+ 'ug_user' => $row->ur_user,
'ug_group' => $group ),
__METHOD__ );
}
@@ -673,10 +741,15 @@ class MysqlUpdater extends DatabaseUpdater {
}
if ( $info->isNullable() ) {
$this->output( "...wl_notificationtimestamp is already nullable.\n" );
+
return;
}
- $this->applyPatch( 'patch-watchlist-null.sql', false, "Making wl_notificationtimestamp nullable" );
+ $this->applyPatch(
+ 'patch-watchlist-null.sql',
+ false,
+ 'Making wl_notificationtimestamp nullable'
+ );
}
/**
@@ -689,7 +762,7 @@ class MysqlUpdater extends DatabaseUpdater {
$this->db->query( "UPDATE $page SET page_random = RAND() WHERE page_random = 0", __METHOD__ );
$rows = $this->db->affectedRows();
- if( $rows ) {
+ 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" );
@@ -699,6 +772,7 @@ class MysqlUpdater extends DatabaseUpdater {
protected function doTemplatelinksUpdate() {
if ( $this->db->tableExists( 'templatelinks', __METHOD__ ) ) {
$this->output( "...templatelinks table already exists\n" );
+
return;
}
@@ -722,7 +796,6 @@ class MysqlUpdater extends DatabaseUpdater {
'tl_title' => $row->pl_title,
), __METHOD__
);
-
}
} else {
// Fast update
@@ -736,14 +809,15 @@ class MysqlUpdater extends DatabaseUpdater {
), __METHOD__
);
}
- $this->output( "Done. Please run maintenance/refreshLinks.php for a more thorough templatelinks update.\n" );
+ $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->indexHasField( 'imagelinks', 'il_to', 'il_from' )
+ ) {
$this->applyPatch( 'patch-backlinkindexes.sql', false, "Updating backlinking indices" );
}
}
@@ -756,11 +830,20 @@ class MysqlUpdater extends DatabaseUpdater {
protected function doRestrictionsUpdate() {
if ( $this->db->tableExists( 'page_restrictions', __METHOD__ ) ) {
$this->output( "...page_restrictions table already exists.\n" );
+
return;
}
- $this->applyPatch( 'patch-page_restrictions.sql', false, "Creating page_restrictions table (1/2)" );
- $this->applyPatch( 'patch-page_restrictions_sortkey.sql', false, "Creating page_restrictions table (2/2)" );
+ $this->applyPatch(
+ 'patch-page_restrictions.sql',
+ false,
+ 'Creating page_restrictions table (1/2)'
+ );
+ $this->applyPatch(
+ 'patch-page_restrictions_sortkey.sql',
+ false,
+ 'Creating page_restrictions table (2/2)'
+ );
$this->output( "done.\n" );
$this->output( "Migrating old restrictions to new table...\n" );
@@ -777,6 +860,7 @@ class MysqlUpdater extends DatabaseUpdater {
protected function doCategoryPopulation() {
if ( $this->updateRowExists( 'populate category' ) ) {
$this->output( "...category table already populated.\n" );
+
return;
}
@@ -810,7 +894,7 @@ class MysqlUpdater extends DatabaseUpdater {
return true;
}
- if ( $wgProfileToDatabase === true && ! $this->db->tableExists( 'profiling', __METHOD__ ) ) {
+ if ( $wgProfileToDatabase === true && !$this->db->tableExists( 'profiling', __METHOD__ ) ) {
$this->applyPatch( 'patch-profiling.sql', false, 'Add profiling table' );
}
}
@@ -824,9 +908,15 @@ class MysqlUpdater extends DatabaseUpdater {
return true;
} elseif ( $this->db->fieldExists( 'profiling', 'pf_memory', __METHOD__ ) ) {
$this->output( "...profiling table has pf_memory field.\n" );
+
return true;
}
- return $this->applyPatch( 'patch-profiling-memory.sql', false, "Adding pf_memory field to table profiling" );
+
+ return $this->applyPatch(
+ 'patch-profiling-memory.sql',
+ false,
+ 'Adding pf_memory field to table profiling'
+ );
}
protected function doFilearchiveIndicesUpdate() {
@@ -834,6 +924,7 @@ class MysqlUpdater extends DatabaseUpdater {
if ( !$info ) {
$this->applyPatch( 'patch-filearchive-user-index.sql', false, "Updating filearchive indices" );
}
+
return true;
}
@@ -841,41 +932,49 @@ class MysqlUpdater extends DatabaseUpdater {
$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 true;
}
if ( $this->skipSchema ) {
- $this->output( "...skipping schema change (making pl_namespace, tl_namespace and il_to indices UNIQUE).\n" );
- return false;
- }
-
- return $this->applyPatch( 'patch-pl-tl-il-unique.sql', false, "Making pl_namespace, tl_namespace and il_to indices UNIQUE" );
- }
+ $this->output( "...skipping schema change (making pl_namespace, tl_namespace " .
+ "and il_to indices UNIQUE).\n" );
- protected function renameEuWikiId() {
- if ( $this->db->fieldExists( 'external_user', 'eu_local_id', __METHOD__ ) ) {
- $this->output( "...eu_wiki_id already renamed to eu_local_id.\n" );
- return;
+ return false;
}
- $this->applyPatch( 'patch-eu_local_id.sql', false, "Renaming eu_wiki_id -> eu_local_id" );
+ return $this->applyPatch(
+ 'patch-pl-tl-il-unique.sql',
+ false,
+ 'Making pl_namespace, tl_namespace and il_to indices UNIQUE'
+ );
}
protected function doUpdateMimeMinorField() {
if ( $this->updateRowExists( 'mime_minor_length' ) ) {
$this->output( "...*_mime_minor fields are already long enough.\n" );
+
return;
}
- $this->applyPatch( 'patch-mime_minor_length.sql', false, "Altering all *_mime_minor fields to 100 bytes in size" );
+ $this->applyPatch(
+ 'patch-mime_minor_length.sql',
+ false,
+ 'Altering all *_mime_minor fields to 100 bytes in size'
+ );
}
protected function doClFieldsUpdate() {
if ( $this->updateRowExists( 'cl_fields_update' ) ) {
$this->output( "...categorylinks up-to-date.\n" );
+
return;
}
- $this->applyPatch( 'patch-categorylinks-better-collation2.sql', false, 'Updating categorylinks (again)' );
+ $this->applyPatch(
+ 'patch-categorylinks-better-collation2.sql',
+ false,
+ 'Updating categorylinks (again)'
+ );
}
protected function doLangLinksLengthUpdate() {
@@ -884,7 +983,11 @@ class MysqlUpdater extends DatabaseUpdater {
$row = $this->db->fetchObject( $res );
if ( $row && $row->Type == "varbinary(10)" ) {
- $this->applyPatch( 'patch-langlinks-ll_lang-20.sql', false, 'Updating length of ll_lang in langlinks' );
+ $this->applyPatch(
+ 'patch-langlinks-ll_lang-20.sql',
+ false,
+ 'Updating length of ll_lang in langlinks'
+ );
} else {
$this->output( "...ll_lang is up-to-date.\n" );
}
@@ -901,9 +1004,34 @@ class MysqlUpdater extends DatabaseUpdater {
}
if ( $info->isNullable() ) {
$this->output( "...user_last_timestamp is already nullable.\n" );
+
return;
}
- $this->applyPatch( 'patch-user-newtalk-timestamp-null.sql', false, "Making user_last_timestamp nullable" );
+ $this->applyPatch(
+ 'patch-user-newtalk-timestamp-null.sql',
+ false,
+ 'Making user_last_timestamp nullable'
+ );
+ }
+
+ protected function doIwlinksIndexNonUnique() {
+ $info = $this->db->indexInfo( 'iwlinks', 'iwl_prefix_title_from' );
+ if ( is_array( $info ) && $info[0]->Non_unique ) {
+ $this->output( "...iwl_prefix_title_from index is already non-UNIQUE.\n" );
+
+ return true;
+ }
+ if ( $this->skipSchema ) {
+ $this->output( "...skipping schema change (making iwl_prefix_title_from index non-UNIQUE).\n" );
+
+ return false;
+ }
+
+ return $this->applyPatch(
+ 'patch-iwl_prefix_title_from-non-unique.sql',
+ false,
+ 'Making iwl_prefix_title_from index non-UNIQUE'
+ );
}
}
diff --git a/includes/installer/OracleInstaller.php b/includes/installer/OracleInstaller.php
index e8538890..77575100 100644
--- a/includes/installer/OracleInstaller.php
+++ b/includes/installer/OracleInstaller.php
@@ -59,35 +59,51 @@ class OracleInstaller extends DatabaseInstaller {
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' ) ) .
+
+ return $this->getTextBox(
+ 'wgDBserver',
+ 'config-db-host-oracle',
+ array(),
+ $this->parent->getHelpBox( 'config-db-host-oracle-help' )
+ ) .
Html::openElement( 'fieldset' ) .
Html::element( 'legend', array(), wfMessage( 'config-db-wiki-settings' )->text() ) .
$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' ) ) .
+ $this->getTextBox(
+ '_OracleTempTS',
+ 'config-oracle-temp-ts',
+ array(),
+ $this->parent->getHelpBox( 'config-db-oracle-help' )
+ ) .
Html::closeElement( 'fieldset' ) .
- $this->parent->getWarningBox( wfMessage( 'config-db-account-oracle-warn' )->text() ).
- $this->getInstallUserBox().
+ $this->parent->getWarningBox( wfMessage( 'config-db-account-oracle-warn' )->text() ) .
+ $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' ) );
+ $newValues = $this->setVarsFromRequest(
+ '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'] ) ) {
+ } elseif ( !self::checkConnectStringFormat( $newValues['wgDBserver'] ) ) {
$status->fatal( 'config-invalid-db-server-oracle', $newValues['wgDBserver'] );
}
if ( !preg_match( '/^[a-zA-Z0-9_]*$/', $newValues['wgDBprefix'] ) ) {
@@ -163,6 +179,7 @@ class OracleInstaller extends DatabaseInstaller {
$this->connError = $e->db->lastErrno();
$status->fatal( 'config-connection-error', $e->getMessage() );
}
+
return $status;
}
@@ -182,6 +199,7 @@ class OracleInstaller extends DatabaseInstaller {
$this->connError = $e->db->lastErrno();
$status->fatal( 'config-connection-error', $e->getMessage() );
}
+
return $status;
}
@@ -190,6 +208,7 @@ class OracleInstaller extends DatabaseInstaller {
$this->parent->setVar( 'wgDBname', $this->getVar( 'wgDBuser' ) );
$retVal = parent::needsUpgrade();
$this->parent->setVar( 'wgDBname', $tempDBname );
+
return $retVal;
}
@@ -204,6 +223,7 @@ class OracleInstaller extends DatabaseInstaller {
public function setupDatabase() {
$status = Status::newGood();
+
return $status;
}
@@ -286,15 +306,38 @@ class OracleInstaller extends DatabaseInstaller {
foreach ( $varNames as $name ) {
$vars[$name] = $this->getVar( $name );
}
+
return $vars;
}
public function getLocalSettings() {
$prefix = $this->getVar( 'wgDBprefix' );
- return
-"# Oracle specific settings
+
+ return "# Oracle specific settings
\$wgDBprefix = \"{$prefix}\";
";
}
+ /**
+ * Function checks the format of Oracle connect string
+ * The actual validity of the string is checked by attempting to connect
+ *
+ * Regex should be able to validate all connect string formats
+ * [//](host|tns_name)[:port][/service_name][:POOLED]
+ * http://www.orafaq.com/wiki/EZCONNECT
+ *
+ * @since 1.22
+ *
+ * @param string $connect_string
+ *
+ * @return bool Whether the connection string is valid.
+ */
+ public static function checkConnectStringFormat( $connect_string ) {
+ // @@codingStandardsIgnoreStart Long lines with regular expressions.
+ // @todo Very long regular expression. Make more readable?
+ $isValid = preg_match( '/^[[:alpha:]][\w\-]*(?:\.[[:alpha:]][\w\-]*){0,2}$/', $connect_string ); // TNS name
+ $isValid |= preg_match( '/^(?:\/\/)?[\w\-\.]+(?::[\d]+)?(?:\/(?:[\w\-\.]+(?::(pooled|dedicated|shared))?)?(?:\/[\w\-\.]+)?)?$/', $connect_string ); // EZConnect
+ // @@codingStandardsIgnoreEnd
+ return (bool)$isValid;
+ }
}
diff --git a/includes/installer/OracleUpdater.php b/includes/installer/OracleUpdater.php
index 90b4c877..ec91e57b 100644
--- a/includes/installer/OracleUpdater.php
+++ b/includes/installer/OracleUpdater.php
@@ -38,8 +38,6 @@ class OracleUpdater extends DatabaseUpdater {
protected function getCoreUpdateList() {
return array(
- array( 'disableContentHandlerUseDB' ),
-
// 1.17
array( 'doNamespaceDefaults' ),
array( 'doFKRenameDeferr' ),
@@ -50,13 +48,13 @@ class OracleUpdater extends DatabaseUpdater {
array( 'addTable', 'user_former_groups', 'patch-user_former_groups.sql' ),
//1.18
- array( 'addIndex', 'user', 'i02', 'patch-user_email_index.sql' ),
+ array( 'addIndex', 'user', 'i02', 'patch-user_email_index.sql' ),
array( 'modifyField', 'user_properties', 'up_property', 'patch-up_property.sql' ),
array( 'addTable', 'uploadstash', 'patch-uploadstash.sql' ),
array( 'doRecentchangesFK2Cascade' ),
//1.19
- array( 'addIndex', 'logging', 'i05', 'patch-logging_type_action_index.sql'),
+ array( 'addIndex', 'logging', 'i05', 'patch-logging_type_action_index.sql' ),
array( 'addField', 'revision', 'rev_sha1', 'patch-rev_sha1_field.sql' ),
array( 'addField', 'archive', 'ar_sha1', 'patch-ar_sha1_field.sql' ),
array( 'doRemoveNotNullEmptyDefaults2' ),
@@ -72,22 +70,25 @@ class OracleUpdater extends DatabaseUpdater {
array( 'dropField', 'category', 'cat_hidden', 'patch-cat_hidden.sql' ),
//1.21
- array( 'addField', 'revision', 'rev_content_format', 'patch-revision-rev_content_format.sql' ),
- array( 'addField', 'revision', 'rev_content_model', 'patch-revision-rev_content_model.sql' ),
- array( 'addField', 'archive', 'ar_content_format', 'patch-archive-ar_content_format.sql' ),
- array( 'addField', 'archive', 'ar_content_model', 'patch-archive-ar_content_model.sql' ),
- array( 'addField', 'page', 'page_content_model', 'patch-page-page_content_model.sql' ),
- array( 'enableContentHandlerUseDB' ),
-
- array( 'dropField', 'site_stats', 'ss_admins', 'patch-ss_admins.sql' ),
+ array( 'addField', 'revision', 'rev_content_format',
+ 'patch-revision-rev_content_format.sql' ),
+ array( 'addField', 'revision', 'rev_content_model',
+ 'patch-revision-rev_content_model.sql' ),
+ array( 'addField', 'archive', 'ar_content_format', 'patch-archive-ar_content_format.sql' ),
+ array( 'addField', 'archive', 'ar_content_model', 'patch-archive-ar_content_model.sql' ),
+ array( 'addField', 'archive', 'ar_id', 'patch-archive-ar_id.sql' ),
+ array( 'addField', 'externallinks', 'el_id', 'patch-externallinks-el_id.sql' ),
+ array( 'addField', 'page', 'page_content_model', 'patch-page-page_content_model.sql' ),
+ array( 'dropField', 'site_stats', 'ss_admins', 'patch-ss_admins.sql' ),
array( 'dropField', 'recentchanges', 'rc_moved_to_title', 'patch-rc_moved.sql' ),
- array( 'addTable', 'sites', 'patch-sites.sql' ),
- array( 'addField', 'filearchive', 'fa_sha1', 'patch-fa_sha1.sql' ),
- array( 'addField', 'job', 'job_token', 'patch-job_token.sql' ),
- array( 'addField', 'job', 'job_attempts', 'patch-job_attempts.sql' ),
- array( 'addField', 'uploadstash', 'us_props', 'patch-uploadstash-us_props.sql' ),
+ array( 'addTable', 'sites', 'patch-sites.sql' ),
+ array( 'addField', 'filearchive', 'fa_sha1', 'patch-fa_sha1.sql' ),
+ array( 'addField', 'job', 'job_token', 'patch-job_token.sql' ),
+ array( 'addField', 'job', 'job_attempts', 'patch-job_attempts.sql' ),
+ array( 'addField', 'uploadstash', 'us_props', 'patch-uploadstash-us_props.sql' ),
array( 'modifyField', 'user_groups', 'ug_group', 'patch-ug_group-length-increase-255.sql' ),
- array( 'modifyField', 'user_former_groups', 'ufg_group', 'patch-ufg_group-length-increase-255.sql' ),
+ array( 'modifyField', 'user_former_groups', 'ufg_group',
+ 'patch-ufg_group-length-increase-255.sql' ),
// KEEP THIS AT THE BOTTOM!!
array( 'doRebuildDuplicateFunction' ),
@@ -106,14 +107,22 @@ class OracleUpdater extends DatabaseUpdater {
return;
}
- $this->applyPatch( 'patch_namespace_defaults.sql', false, "Altering namespace fields with default value" );
+ $this->applyPatch(
+ 'patch_namespace_defaults.sql',
+ false,
+ 'Altering namespace fields with default value'
+ );
}
/**
* Uniform FK names + deferrable state
*/
protected function doFKRenameDeferr() {
- $meta = $this->db->query( 'SELECT COUNT(*) cnt FROM user_constraints WHERE constraint_type = \'R\' AND deferrable = \'DEFERRABLE\'' );
+ $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 ) {
return;
@@ -171,7 +180,11 @@ class OracleUpdater extends DatabaseUpdater {
if ( $meta->isNullable() ) {
return;
}
- $this->applyPatch( 'patch_remove_not_null_empty_defs.sql', false, "Removing not null empty constraints" );
+ $this->applyPatch(
+ 'patch_remove_not_null_empty_defs.sql',
+ false,
+ 'Removing not null empty constraints'
+ );
}
protected function doRemoveNotNullEmptyDefaults2() {
@@ -179,7 +192,11 @@ class OracleUpdater extends DatabaseUpdater {
if ( $meta->isNullable() ) {
return;
}
- $this->applyPatch( 'patch_remove_not_null_empty_defs2.sql', false, "Removing not null empty constraints" );
+ $this->applyPatch(
+ 'patch_remove_not_null_empty_defs2.sql',
+ false,
+ 'Removing not null empty constraints'
+ );
}
/**
@@ -187,7 +204,12 @@ class OracleUpdater extends DatabaseUpdater {
* cascading taken in account in the deleting function
*/
protected function doRecentchangesFK2Cascade() {
- $meta = $this->db->query( 'SELECT 1 FROM all_constraints WHERE owner = \''.strtoupper($this->db->getDBname()).'\' AND constraint_name = \''.$this->db->tablePrefix().'RECENTCHANGES_FK2\' AND delete_rule = \'CASCADE\'' );
+ $meta = $this->db->query( 'SELECT 1 FROM all_constraints WHERE owner = \'' .
+ strtoupper( $this->db->getDBname() ) .
+ '\' AND constraint_name = \'' .
+ $this->db->tablePrefix() .
+ 'RECENTCHANGES_FK2\' AND delete_rule = \'CASCADE\''
+ );
$row = $meta->fetchRow();
if ( $row ) {
return;
@@ -211,6 +233,7 @@ class OracleUpdater extends DatabaseUpdater {
$row = $meta->fetchRow();
if ( $row['column_name'] == 'PR_ID' ) {
$this->output( "seems to be up to date.\n" );
+
return;
}
@@ -243,8 +266,7 @@ class OracleUpdater extends DatabaseUpdater {
# 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( '/*Q*/'.$this->db->tableName( 'objectcache' ), '*', __METHOD__ );
+ $this->db->delete( '/*Q*/' . $this->db->tableName( 'objectcache' ), '*', __METHOD__ );
$this->output( "done.\n" );
}
-
}
diff --git a/includes/installer/PhpBugTests.php b/includes/installer/PhpBugTests.php
index 773debe0..54712644 100644
--- a/includes/installer/PhpBugTests.php
+++ b/includes/installer/PhpBugTests.php
@@ -30,6 +30,7 @@
class PhpXmlBugTester {
private $parsedData = '';
public $ok = false;
+
public function __construct() {
$charData = '<b>c</b>';
$xml = '<a>' . htmlspecialchars( $charData ) . '</a>';
@@ -39,6 +40,7 @@ class PhpXmlBugTester {
$parsedOk = xml_parse( $parser, $xml, true );
$this->ok = $parsedOk && ( $this->parsedData == $charData );
}
+
public function chardata( $parser, $data ) {
$this->parsedData .= $data;
}
diff --git a/includes/installer/PostgresInstaller.php b/includes/installer/PostgresInstaller.php
index 4e5ae8cf..2cf41564 100644
--- a/includes/installer/PostgresInstaller.php
+++ b/includes/installer/PostgresInstaller.php
@@ -42,8 +42,8 @@ class PostgresInstaller extends DatabaseInstaller {
'_InstallUser' => 'postgres',
);
- var $minimumVersion = '8.3';
- var $maxRoleSearchDepth = 5;
+ public $minimumVersion = '8.3';
+ public $maxRoleSearchDepth = 5;
protected $pgConns = array();
@@ -56,13 +56,27 @@ class PostgresInstaller extends DatabaseInstaller {
}
function getConnectForm() {
- return
- $this->getTextBox( 'wgDBserver', 'config-db-host', array(), $this->parent->getHelpBox( 'config-db-host-help' ) ) .
+ 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(), wfMessage( 'config-db-wiki-settings' )->text() ) .
- $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' ) ) .
+ $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();
}
@@ -108,6 +122,7 @@ class PostgresInstaller extends DatabaseInstaller {
$this->setVar( 'wgDBuser', $this->getVar( '_InstallUser' ) );
$this->setVar( 'wgDBpassword', $this->getVar( '_InstallPassword' ) );
+
return Status::newGood();
}
@@ -116,6 +131,7 @@ class PostgresInstaller extends DatabaseInstaller {
if ( $status->isOK() ) {
$this->db = $status->value;
}
+
return $status;
}
@@ -137,11 +153,13 @@ class PostgresInstaller extends DatabaseInstaller {
$this->getVar( 'wgDBserver' ),
$user,
$password,
- $dbName);
+ $dbName
+ );
$status->value = $db;
} catch ( DBConnectionError $e ) {
$status->fatal( 'config-connection-error', $e->getMessage() );
}
+
return $status;
}
@@ -165,6 +183,7 @@ class PostgresInstaller extends DatabaseInstaller {
$conn->commit( __METHOD__ );
$this->pgConns[$type] = $conn;
}
+
return $status;
}
@@ -215,6 +234,7 @@ class PostgresInstaller extends DatabaseInstaller {
$safeRole = $conn->addIdentifierQuotes( $this->getVar( 'wgDBuser' ) );
$conn->query( "SET ROLE $safeRole" );
}
+
return $status;
default:
throw new MWException( "Invalid special connection type: \"$type\"" );
@@ -267,6 +287,7 @@ class PostgresInstaller extends DatabaseInstaller {
$row = $conn->selectRow( '"pg_catalog"."pg_roles"', '*',
array( 'rolname' => $superuser ), __METHOD__ );
+
return $row;
}
@@ -275,6 +296,7 @@ class PostgresInstaller extends DatabaseInstaller {
if ( !$perms ) {
return false;
}
+
return $perms->rolsuper === 't' || $perms->rolcreaterole === 't';
}
@@ -283,6 +305,7 @@ class PostgresInstaller extends DatabaseInstaller {
if ( !$perms ) {
return false;
}
+
return $perms->rolsuper === 't';
}
@@ -331,6 +354,7 @@ class PostgresInstaller extends DatabaseInstaller {
} else {
$msg = 'config-install-user-missing';
}
+
return Status::newFatal( $msg, $this->getVar( 'wgDBuser' ) );
}
@@ -410,6 +434,7 @@ class PostgresInstaller extends DatabaseInstaller {
}
}
}
+
return false;
}
@@ -431,7 +456,7 @@ class PostgresInstaller extends DatabaseInstaller {
'callback' => array( $this, 'setupSchema' )
);
- if( $this->getVar( '_CreateDBAccount' ) ) {
+ if ( $this->getVar( '_CreateDBAccount' ) ) {
$this->parent->addInstallStep( $createDbAccount, 'database' );
}
$this->parent->addInstallStep( $commitCB, 'interwiki' );
@@ -454,6 +479,7 @@ class PostgresInstaller extends DatabaseInstaller {
$safedb = $conn->addIdentifierQuotes( $dbName );
$conn->query( "CREATE DATABASE $safedb", __METHOD__ );
}
+
return Status::newGood();
}
@@ -469,7 +495,7 @@ class PostgresInstaller extends DatabaseInstaller {
$schema = $this->getVar( 'wgDBmwschema' );
$safeschema = $conn->addIdentifierQuotes( $schema );
$safeuser = $conn->addIdentifierQuotes( $this->getVar( 'wgDBuser' ) );
- if( !$conn->schemaExists( $schema ) ) {
+ if ( !$conn->schemaExists( $schema ) ) {
try {
$conn->query( "CREATE SCHEMA $safeschema AUTHORIZATION $safeuser" );
} catch ( DBQueryError $e ) {
@@ -480,11 +506,13 @@ class PostgresInstaller extends DatabaseInstaller {
// Select the new schema in the current connection
$conn->determineCoreSchema( $schema );
+
return Status::newGood();
}
function commitChanges() {
$this->db->commit( __METHOD__ );
+
return Status::newGood();
}
@@ -529,8 +557,8 @@ class PostgresInstaller extends DatabaseInstaller {
function getLocalSettings() {
$port = $this->getVar( 'wgDBport' );
$schema = $this->getVar( 'wgDBmwschema' );
- return
-"# Postgres specific settings
+
+ return "# Postgres specific settings
\$wgDBport = \"{$port}\";
\$wgDBmwschema = \"{$schema}\";";
}
@@ -557,20 +585,22 @@ class PostgresInstaller extends DatabaseInstaller {
*/
$conn = $status->value;
- if( $conn->tableExists( 'archive' ) ) {
+ if ( $conn->tableExists( 'archive' ) ) {
$status->warning( 'config-install-tables-exist' );
$this->enableLB();
+
return $status;
}
$conn->begin( __METHOD__ );
- if( !$conn->schemaExists( $schema ) ) {
+ if ( !$conn->schemaExists( $schema ) ) {
$status->fatal( 'config-install-pg-schema-not-exist' );
+
return $status;
}
$error = $conn->sourceFile( $conn->getSchemaPath() );
- if( $error !== true ) {
+ if ( $error !== true ) {
$conn->reportQueryError( $error, 0, '', __METHOD__ );
$conn->rollback( __METHOD__ );
$status->fatal( 'config-install-tables-failed', $error );
@@ -578,9 +608,10 @@ class PostgresInstaller extends DatabaseInstaller {
$conn->commit( __METHOD__ );
}
// Resume normal operations
- if( $status->isOk() ) {
+ if ( $status->isOk() ) {
$this->enableLB();
}
+
return $status;
}
@@ -623,6 +654,7 @@ class PostgresInstaller extends DatabaseInstaller {
} 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
index 0a4b5e65..599b523b 100644
--- a/includes/installer/PostgresUpdater.php
+++ b/includes/installer/PostgresUpdater.php
@@ -46,211 +46,240 @@ class PostgresUpdater extends DatabaseUpdater {
# r15791 Change reserved word table names "user" and "text"
array( 'renameTable', 'user', 'mwuser' ),
array( 'renameTable', 'text', 'pagecontent' ),
- array( 'renameIndex', 'mwuser', 'user_pkey', 'mwuser_pkey'),
+ array( 'renameIndex', 'mwuser', 'user_pkey', 'mwuser_pkey' ),
array( 'renameIndex', 'mwuser', 'user_user_name_key', 'mwuser_user_name_key' ),
- array( 'renameIndex', 'pagecontent','text_pkey', 'pagecontent_pkey' ),
+ array( 'renameIndex', 'pagecontent', 'text_pkey', 'pagecontent_pkey' ),
# 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', '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' ),
- array( 'renameSequence', 'us_id_seq', 'uploadstash_us_id_seq' ),
+ 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', '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' ),
+ array( 'renameSequence', 'us_id_seq', 'uploadstash_us_id_seq' ),
# since r58263
- array( 'renameSequence', 'category_id_seq', 'category_cat_id_seq'),
+ array( 'renameSequence', 'category_id_seq', 'category_cat_id_seq' ),
# new sequences if not renamed above
array( 'addSequence', 'logging', false, 'logging_log_id_seq' ),
array( 'addSequence', 'page_restrictions', false, 'page_restrictions_pr_id_seq' ),
array( 'addSequence', 'filearchive', 'fa_id', 'filearchive_fa_id_seq' ),
+ array( 'addSequence', 'archive', false, 'archive_ar_id_seq' ),
+ array( 'addSequence', 'externallinks', false, 'externallinks_el_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', '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' ),
- array( 'addTable', 'uploadstash', 'patch-uploadstash.sql' ),
- array( 'addTable', 'user_former_groups','patch-user_former_groups.sql' ),
- array( 'addTable', 'external_user', 'patch-external_user.sql' ),
- array( 'addTable', 'sites', 'patch-sites.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' ),
+ array( 'addTable', 'uploadstash', 'patch-uploadstash.sql' ),
+ array( 'addTable', 'user_former_groups', 'patch-user_former_groups.sql' ),
+ array( 'addTable', 'sites', 'patch-sites.sql' ),
# Needed before new field
array( 'convertArchive2' ),
# new fields
- array( 'addPgField', 'updatelog', 'ul_value', 'TEXT' ),
- 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', 'archive', 'ar_content_model', 'TEXT' ),
- array( 'addPgField', 'archive', 'ar_content_format', 'TEXT' ),
- 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', 'ipblocks', 'ipb_parent_block_id', 'INTEGER DEFAULT NULL REFERENCES ipblocks(ipb_id) ON DELETE SET NULL DEFERRABLE INITIALLY DEFERRED' ),
- array( 'addPgField', 'filearchive', 'fa_deleted', 'SMALLINT NOT NULL DEFAULT 0' ),
- array( 'addPgField', 'filearchive', 'fa_sha1', "TEXT NOT NULL DEFAULT ''" ),
- 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', 'page_content_model', 'TEXT' ),
- 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', 'revision', 'rev_content_model', 'TEXT' ),
- array( 'addPgField', 'revision', 'rev_content_format', 'TEXT' ),
- 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 ''"),
- array( 'addPgField', 'revision', 'rev_sha1', "TEXT NOT NULL DEFAULT ''" ),
- array( 'addPgField', 'archive', 'ar_sha1', "TEXT NOT NULL DEFAULT ''" ),
- array( 'addPgField', 'uploadstash', 'us_chunk_inx', "INTEGER NULL" ),
- array( 'addPgField', 'job', 'job_timestamp', "TIMESTAMPTZ" ),
- array( 'addPgField', 'job', 'job_random', "INTEGER NOT NULL DEFAULT 0" ),
- array( 'addPgField', 'job', 'job_attempts', "INTEGER NOT NULL DEFAULT 0" ),
- array( 'addPgField', 'job', 'job_token', "TEXT NOT NULL DEFAULT ''" ),
- array( 'addPgField', 'job', 'job_token_timestamp', "TIMESTAMPTZ" ),
- array( 'addPgField', 'job', 'job_sha1', "TEXT NOT NULL DEFAULT ''" ),
+ array( 'addPgField', 'updatelog', 'ul_value', 'TEXT' ),
+ 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', 'archive', 'ar_content_model', 'TEXT' ),
+ array( 'addPgField', 'archive', 'ar_content_format', 'TEXT' ),
+ 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', 'ipblocks', 'ipb_parent_block_id',
+ 'INTEGER DEFAULT NULL REFERENCES ipblocks(ipb_id) ' .
+ 'ON DELETE SET NULL DEFERRABLE INITIALLY DEFERRED' ),
+ array( 'addPgField', 'filearchive', 'fa_deleted', 'SMALLINT NOT NULL DEFAULT 0' ),
+ array( 'addPgField', 'filearchive', 'fa_sha1', "TEXT NOT NULL DEFAULT ''" ),
+ 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', 'page_content_model', 'TEXT' ),
+ 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', 'revision', 'rev_content_model', 'TEXT' ),
+ array( 'addPgField', 'revision', 'rev_content_format', 'TEXT' ),
+ 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 ''" ),
+ array( 'addPgField', 'revision', 'rev_sha1', "TEXT NOT NULL DEFAULT ''" ),
+ array( 'addPgField', 'archive', 'ar_sha1', "TEXT NOT NULL DEFAULT ''" ),
+ array( 'addPgField', 'uploadstash', 'us_chunk_inx', "INTEGER NULL" ),
+ array( 'addPgField', 'job', 'job_timestamp', "TIMESTAMPTZ" ),
+ array( 'addPgField', 'job', 'job_random', "INTEGER NOT NULL DEFAULT 0" ),
+ array( 'addPgField', 'job', 'job_attempts', "INTEGER NOT NULL DEFAULT 0" ),
+ array( 'addPgField', 'job', 'job_token', "TEXT NOT NULL DEFAULT ''" ),
+ array( 'addPgField', 'job', 'job_token_timestamp', "TIMESTAMPTZ" ),
+ array( 'addPgField', 'job', 'job_sha1', "TEXT NOT NULL DEFAULT ''" ),
+ array( 'addPgField', 'archive', 'ar_id',
+ "INTEGER NOT NULL PRIMARY KEY DEFAULT nextval('archive_ar_id_seq')" ),
+ array( 'addPgField', 'externallinks', 'el_id',
+ "INTEGER NOT NULL PRIMARY KEY DEFAULT nextval('externallinks_el_id_seq')" ),
# 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' ),
- 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', '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)' ),
- array( 'changeField', 'uploadstash', 'us_image_bits', 'smallint', '' ),
+ 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' ),
+ 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', '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)' ),
+ array( 'changeField', 'uploadstash', 'us_image_bits', 'smallint', '' ),
+ array( 'changeField', 'profiling', 'pf_time', 'float', '' ),
+ array( 'changeField', 'profiling', 'pf_memory', 'float', '' ),
# null changes
- array( 'changeNullableField', 'oldimage', 'oi_bits', 'NULL' ),
- array( 'changeNullableField', 'oldimage', 'oi_timestamp', 'NULL' ),
+ 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( 'changeNullableField', 'image', 'img_metadata', 'NOT NULL'),
- array( 'changeNullableField', 'filearchive', 'fa_metadata', 'NOT NULL'),
+ array( 'changeNullableField', 'image', 'img_metadata', 'NOT NULL' ),
+ array( 'changeNullableField', 'filearchive', 'fa_metadata', 'NOT NULL' ),
array( 'changeNullableField', 'recentchanges', 'rc_cur_id', 'NULL' ),
array( 'checkOiDeleted' ),
# New indexes
- array( 'addPgIndex', 'archive', 'archive_user_text', '(ar_user_text)' ),
- array( 'addPgIndex', 'image', 'img_sha1', '(img_sha1)' ),
- array( 'addPgIndex', 'ipblocks', 'ipb_parent_block_id', '(ipb_parent_block_id)' ),
- array( 'addPgIndex', 'oldimage', 'oi_sha1', '(oi_sha1)' ),
- array( 'addPgIndex', 'page', 'page_mediawiki_title', '(page_title) WHERE page_namespace = 8' ),
- array( 'addPgIndex', 'pagelinks', 'pagelinks_title', '(pl_title)' ),
- array( 'addPgIndex', 'page_props', 'pp_propname_page', '(pp_propname, pp_page)' ),
- 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( 'addPgIndex', 'job', 'job_timestamp_idx', '(job_timestamp)' ),
- array( 'addPgIndex', 'job', 'job_sha1', '(job_sha1)' ),
- array( 'addPgIndex', 'job', 'job_cmd_token', '(job_cmd, job_token, job_random)' ),
- array( 'addPgIndex', 'job', 'job_cmd_token_id', '(job_cmd, job_token, job_id)' ),
- array( 'addPgIndex', 'filearchive', 'fa_sha1', '(fa_sha1)' ),
+ array( 'addPgIndex', 'archive', 'archive_user_text', '(ar_user_text)' ),
+ array( 'addPgIndex', 'image', 'img_sha1', '(img_sha1)' ),
+ array( 'addPgIndex', 'ipblocks', 'ipb_parent_block_id', '(ipb_parent_block_id)' ),
+ array( 'addPgIndex', 'oldimage', 'oi_sha1', '(oi_sha1)' ),
+ array( 'addPgIndex', 'page', 'page_mediawiki_title', '(page_title) WHERE page_namespace = 8' ),
+ array( 'addPgIndex', 'pagelinks', 'pagelinks_title', '(pl_title)' ),
+ array( 'addPgIndex', 'page_props', 'pp_propname_page', '(pp_propname, pp_page)' ),
+ 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_from_title', '(iwl_prefix, iwl_from, iwl_title)' ),
+ array( 'addPgIndex', 'iwlinks', 'iwl_prefix_title_from', '(iwl_prefix, iwl_title, iwl_from)' ),
+ array( 'addPgIndex', 'job', 'job_timestamp_idx', '(job_timestamp)' ),
+ array( 'addPgIndex', 'job', 'job_sha1', '(job_sha1)' ),
+ array( 'addPgIndex', 'job', 'job_cmd_token', '(job_cmd, job_token, job_random)' ),
+ array( 'addPgIndex', 'job', 'job_cmd_token_id', '(job_cmd, job_token, job_id)' ),
+ array( 'addPgIndex', 'filearchive', 'fa_sha1', '(fa_sha1)' ),
array( 'checkIndex', 'pagelink_unique', array(
array( 'pl_from', 'int4_ops', 'btree', 0 ),
array( 'pl_namespace', 'int2_ops', 'btree', 0 ),
array( 'pl_title', 'text_ops', 'btree', 0 ),
),
- 'CREATE UNIQUE INDEX pagelink_unique ON pagelinks (pl_from,pl_namespace,pl_title)' ),
+ 'CREATE UNIQUE INDEX pagelink_unique ON pagelinks (pl_from,pl_namespace,pl_title)' ),
array( 'checkIndex', 'cl_sortkey', array(
array( 'cl_to', 'text_ops', 'btree', 0 ),
array( 'cl_sortkey', 'text_ops', 'btree', 0 ),
array( 'cl_from', 'int4_ops', 'btree', 0 ),
),
- 'CREATE INDEX cl_sortkey ON "categorylinks" USING "btree" ("cl_to", "cl_sortkey", "cl_from")' ),
+ 'CREATE INDEX cl_sortkey ON "categorylinks" ' .
+ 'USING "btree" ("cl_to", "cl_sortkey", "cl_from")' ),
+ array( 'checkIndex', 'iwl_prefix_title_from', array(
+ array( 'iwl_prefix', 'text_ops', 'btree', 0 ),
+ array( 'iwl_title', 'text_ops', 'btree', 0 ),
+ array( 'iwl_from', 'int4_ops', 'btree', 0 ),
+ ),
+ 'CREATE INDEX iwl_prefix_title_from ON "iwlinks" ' .
+ 'USING "btree" ("iwl_prefix", "iwl_title", "iwl_from")' ),
array( 'checkIndex', 'logging_times', array(
array( 'log_timestamp', 'timestamptz_ops', 'btree', 0 ),
),
@@ -260,36 +289,48 @@ class PostgresUpdater extends DatabaseUpdater {
array( 'oi_name', 'text_ops', 'btree', 0 ),
array( 'oi_archive_name', 'text_ops', 'btree', 0 ),
),
- 'CREATE INDEX "oi_name_archive_name" ON "oldimage" USING "btree" ("oi_name", "oi_archive_name")' ),
+ 'CREATE INDEX "oi_name_archive_name" ON "oldimage" ' .
+ 'USING "btree" ("oi_name", "oi_archive_name")' ),
array( 'checkIndex', 'oi_name_timestamp', array(
array( 'oi_name', 'text_ops', 'btree', 0 ),
array( 'oi_timestamp', 'timestamptz_ops', 'btree', 0 ),
),
- 'CREATE INDEX "oi_name_timestamp" ON "oldimage" USING "btree" ("oi_name", "oi_timestamp")' ),
+ 'CREATE INDEX "oi_name_timestamp" ON "oldimage" ' .
+ 'USING "btree" ("oi_name", "oi_timestamp")' ),
array( 'checkIndex', 'page_main_title', array(
array( 'page_title', 'text_pattern_ops', 'btree', 0 ),
),
- 'CREATE INDEX "page_main_title" ON "page" USING "btree" ("page_title" "text_pattern_ops") WHERE ("page_namespace" = 0)' ),
+ 'CREATE INDEX "page_main_title" ON "page" ' .
+ 'USING "btree" ("page_title" "text_pattern_ops") WHERE ("page_namespace" = 0)' ),
array( 'checkIndex', 'page_mediawiki_title', array(
array( 'page_title', 'text_pattern_ops', 'btree', 0 ),
),
- 'CREATE INDEX "page_mediawiki_title" ON "page" USING "btree" ("page_title" "text_pattern_ops") WHERE ("page_namespace" = 8)' ),
+ 'CREATE INDEX "page_mediawiki_title" ON "page" ' .
+ 'USING "btree" ("page_title" "text_pattern_ops") WHERE ("page_namespace" = 8)' ),
array( 'checkIndex', 'page_project_title', array(
array( 'page_title', 'text_pattern_ops', 'btree', 0 ),
),
- 'CREATE INDEX "page_project_title" ON "page" USING "btree" ("page_title" "text_pattern_ops") WHERE ("page_namespace" = 4)' ),
+ 'CREATE INDEX "page_project_title" ON "page" ' .
+ 'USING "btree" ("page_title" "text_pattern_ops") ' .
+ 'WHERE ("page_namespace" = 4)' ),
array( 'checkIndex', 'page_talk_title', array(
array( 'page_title', 'text_pattern_ops', 'btree', 0 ),
),
- 'CREATE INDEX "page_talk_title" ON "page" USING "btree" ("page_title" "text_pattern_ops") WHERE ("page_namespace" = 1)' ),
+ 'CREATE INDEX "page_talk_title" ON "page" ' .
+ 'USING "btree" ("page_title" "text_pattern_ops") ' .
+ 'WHERE ("page_namespace" = 1)' ),
array( 'checkIndex', 'page_user_title', array(
array( 'page_title', 'text_pattern_ops', 'btree', 0 ),
),
- 'CREATE INDEX "page_user_title" ON "page" USING "btree" ("page_title" "text_pattern_ops") WHERE ("page_namespace" = 2)' ),
+ 'CREATE INDEX "page_user_title" ON "page" ' .
+ 'USING "btree" ("page_title" "text_pattern_ops") WHERE ' .
+ '("page_namespace" = 2)' ),
array( 'checkIndex', 'page_utalk_title', array(
array( 'page_title', 'text_pattern_ops', 'btree', 0 ),
),
- 'CREATE INDEX "page_utalk_title" ON "page" USING "btree" ("page_title" "text_pattern_ops") WHERE ("page_namespace" = 3)' ),
+ 'CREATE INDEX "page_utalk_title" ON "page" ' .
+ 'USING "btree" ("page_title" "text_pattern_ops") ' .
+ 'WHERE ("page_namespace" = 3)' ),
array( 'checkIndex', 'ts2_page_text', array(
array( 'textvector', 'tsvector_ops', 'gist', 0 ),
),
@@ -302,46 +343,55 @@ class PostgresUpdater extends DatabaseUpdater {
array( 'checkOiNameConstraint' ),
array( 'checkPageDeletedTrigger' ),
array( 'checkRevUserFkey' ),
- array( 'dropIndex', 'ipblocks', 'ipb_address'),
+ array( 'dropIndex', 'ipblocks', 'ipb_address' ),
array( 'checkIndex', 'ipb_address_unique', array(
array( 'ipb_address', 'text_ops', 'btree', 0 ),
- array( 'ipb_user', 'int4_ops', 'btree', 0 ),
- array( 'ipb_auto', 'int2_ops', 'btree', 0 ),
+ array( 'ipb_user', 'int4_ops', 'btree', 0 ),
+ array( 'ipb_auto', 'int2_ops', 'btree', 0 ),
array( 'ipb_anon_only', 'int2_ops', 'btree', 0 ),
),
- 'CREATE UNIQUE INDEX ipb_address_unique ON ipblocks (ipb_address,ipb_user,ipb_auto,ipb_anon_only)' ),
+ 'CREATE UNIQUE INDEX ipb_address_unique ' .
+ 'ON ipblocks (ipb_address,ipb_user,ipb_auto,ipb_anon_only)' ),
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', 'ipblocks', 'ipb_parent_block_id', 'ipblocks(ipb_id) ON DELETE SET NULL' ),
- array( 'changeFkeyDeferrable', 'langlinks', 'll_from', 'page(page_id) ON DELETE CASCADE' ),
- array( 'changeFkeyDeferrable', 'logging', 'log_user', 'mwuser(user_id) ON DELETE SET NULL' ),
- array( 'changeFkeyDeferrable', 'oldimage', 'oi_name', 'image(img_name) ON DELETE CASCADE ON UPDATE CASCADE' ),
- 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', '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' ),
+ 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', 'ipblocks', 'ipb_parent_block_id',
+ 'ipblocks(ipb_id) ON DELETE SET NULL' ),
+ array( 'changeFkeyDeferrable', 'langlinks', 'll_from', 'page(page_id) ON DELETE CASCADE' ),
+ array( 'changeFkeyDeferrable', 'logging', 'log_user', 'mwuser(user_id) ON DELETE SET NULL' ),
+ array( 'changeFkeyDeferrable', 'oldimage', 'oi_name',
+ 'image(img_name) ON DELETE CASCADE ON UPDATE CASCADE' ),
+ 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', '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' ),
# r81574
array( 'addInterwikiType' ),
@@ -365,25 +415,25 @@ class PostgresUpdater extends DatabaseUpdater {
# Add missing extension fields
foreach ( $wgExtPGNewFields as $fieldRecord ) {
$updates[] = array(
- 'addPgField', $fieldRecord[0], $fieldRecord[1],
- $fieldRecord[2]
- );
+ 'addPgField', $fieldRecord[0], $fieldRecord[1],
+ $fieldRecord[2]
+ );
}
# Change altered columns
foreach ( $wgExtPGAlteredFields as $fieldRecord ) {
$updates[] = array(
- 'changeField', $fieldRecord[0], $fieldRecord[1],
- $fieldRecord[2]
- );
+ 'changeField', $fieldRecord[0], $fieldRecord[1],
+ $fieldRecord[2]
+ );
}
# Add missing extension indexes
foreach ( $wgExtNewIndexes as $fieldRecord ) {
$updates[] = array(
- 'addPgExtIndex', $fieldRecord[0], $fieldRecord[1],
- $fieldRecord[2]
- );
+ 'addPgExtIndex', $fieldRecord[0], $fieldRecord[1],
+ $fieldRecord[2]
+ );
}
return $updates;
@@ -397,8 +447,8 @@ SELECT attname, attnum FROM pg_namespace, pg_class, pg_attribute
AND relname=%s AND nspname=%s
END;
$res = $this->db->query( sprintf( $q,
- $this->db->addQuotes( $table ),
- $this->db->addQuotes( $this->db->getCoreSchema() ) ) );
+ $this->db->addQuotes( $table ),
+ $this->db->addQuotes( $this->db->getCoreSchema() ) ) );
if ( !$res ) {
return null;
}
@@ -406,10 +456,11 @@ END;
$cols = array();
foreach ( $res as $r ) {
$cols[] = array(
- "name" => $r[0],
- "ord" => $r[1],
- );
+ "name" => $r[0],
+ "ord" => $r[1],
+ );
}
+
return $cols;
}
@@ -479,11 +530,12 @@ END;
if ( !( $row = $this->db->fetchRow( $r ) ) ) {
return null;
}
+
return $row[0];
}
function ruleDef( $table, $rule ) {
- $q = <<<END
+ $q = <<<END
SELECT definition FROM pg_rules
WHERE schemaname = %s
AND tablename = %s
@@ -502,6 +554,7 @@ END;
return null;
}
$d = $row[0];
+
return $d;
}
@@ -509,7 +562,7 @@ END;
if ( !$this->db->sequenceExists( $ns ) ) {
$this->output( "Creating sequence $ns\n" );
$this->db->query( "CREATE SEQUENCE $ns" );
- if( $pkey !== false ) {
+ if ( $pkey !== false ) {
$this->setDefault( $table, $pkey, '"nextval"(\'"' . $ns . '"\'::"regclass")' );
}
}
@@ -518,6 +571,7 @@ END;
protected function renameSequence( $old, $new ) {
if ( $this->db->sequenceExists( $new ) ) {
$this->output( "...sequence $new already exists.\n" );
+
return;
}
if ( $this->db->sequenceExists( $old ) ) {
@@ -532,7 +586,7 @@ END;
$old = $this->db->realTableName( $old, "quoted" );
$new = $this->db->realTableName( $new, "quoted" );
$this->db->query( "ALTER TABLE $old RENAME TO $new" );
- if( $patch !== false ) {
+ if ( $patch !== false ) {
$this->applyPatch( $patch );
}
}
@@ -544,6 +598,7 @@ END;
// First requirement: the table must exist
if ( !$this->db->tableExists( $table, __METHOD__ ) ) {
$this->output( "...skipping: '$table' table doesn't exist yet.\n" );
+
return;
}
@@ -551,17 +606,20 @@ END;
if ( $this->db->indexExists( $table, $new, __METHOD__ ) ) {
$this->output( "...index $new already set on $table table.\n" );
if ( !$skipBothIndexExistWarning
- && $this->db->indexExists( $table, $old, __METHOD__ ) )
- {
- $this->output( "...WARNING: $old still exists, despite it has been renamed into $new (which also exists).\n" .
+ && $this->db->indexExists( $table, $old, __METHOD__ )
+ ) {
+ $this->output( "...WARNING: $old still exists, despite it has been " .
+ "renamed into $new (which also exists).\n" .
" $old should be manually removed if not needed anymore.\n" );
}
+
return;
}
// Third requirement: the old index must exist
if ( !$this->db->indexExists( $table, $old, __METHOD__ ) ) {
$this->output( "...skipping: index $old doesn't exist.\n" );
+
return;
}
@@ -572,6 +630,7 @@ END;
$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" );
@@ -586,9 +645,9 @@ END;
exit( 1 );
}
- if ( $fi->type() === $newtype )
+ if ( $fi->type() === $newtype ) {
$this->output( "...column '$table.$field' is already of type '$newtype'\n" );
- else {
+ } 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 ) ) {
@@ -613,7 +672,7 @@ END;
}
}
- protected function changeNullableField( $table, $field, $null) {
+ 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" );
@@ -632,8 +691,7 @@ END;
if ( 'NULL' === $null ) {
$this->output( "Changing '$table.$field' to allow NULLs\n" );
$this->db->query( "ALTER TABLE $table ALTER $field DROP NOT NULL" );
- }
- else {
+ } else {
$this->output( "...column '$table.$field' is already set as NOT NULL\n" );
}
}
@@ -664,7 +722,9 @@ END;
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" );
+ $this->output( "WARNING! Column '$table.$field' does not exist but it should! " .
+ "Please report this.\n" );
+
return;
}
if ( $fi->is_deferred() && $fi->is_deferrable() ) {
@@ -677,10 +737,13 @@ END;
$command = "ALTER TABLE $table DROP CONSTRAINT $conname";
$this->db->query( $command );
} else {
- $this->output( "Column '$table.$field' does not have a foreign key constraint, will be added\n" );
+ $this->output( "Column '$table.$field' does not have a foreign key " .
+ "constraint, will be added\n" );
$conclause = "";
}
- $command = "ALTER TABLE $table ADD $conclause FOREIGN KEY ($field) REFERENCES $clause DEFERRABLE INITIALLY DEFERRED";
+ $command =
+ "ALTER TABLE $table ADD $conclause " .
+ "FOREIGN KEY ($field) REFERENCES $clause DEFERRABLE INITIALLY DEFERRED";
$this->db->query( $command );
}
@@ -694,7 +757,11 @@ END;
$this->output( "Dropping rule 'archive_delete'\n" );
$this->db->query( 'DROP RULE archive_delete ON archive' );
}
- $this->applyPatch( 'patch-remove-archive2.sql', false, "Converting 'archive2' back to normal archive table" );
+ $this->applyPatch(
+ 'patch-remove-archive2.sql',
+ false,
+ "Converting 'archive2' back to normal archive table"
+ );
} else {
$this->output( "...obsolete table 'archive2' does not exist\n" );
}
@@ -704,7 +771,8 @@ END;
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 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" );
@@ -713,23 +781,32 @@ END;
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" );
+ $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" );
+ $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->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" );
+ $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->applyPatch( 'patch-page_deleted.sql', false, "Adding function and trigger 'page_deleted' to table 'page'" );
+ $this->applyPatch(
+ 'patch-page_deleted.sql',
+ false,
+ "Adding function and trigger 'page_deleted' to table 'page'"
+ );
} else {
$this->output( "...table 'page' has 'page_deleted' trigger\n" );
}
@@ -738,7 +815,7 @@ END;
protected function dropIndex( $table, $index, $patch = '', $fullpath = false ) {
if ( $this->db->indexExists( $table, $index ) ) {
$this->output( "Dropping obsolete index '$index'\n" );
- $this->db->query( "DROP INDEX \"". $index ."\"" );
+ $this->db->query( "DROP INDEX \"" . $index . "\"" );
}
}
@@ -746,7 +823,7 @@ END;
$pu = $this->db->indexAttributes( $index );
if ( !empty( $pu ) && $pu != $should_be ) {
$this->output( "Dropping obsolete version of index '$index'\n" );
- $this->db->query( "DROP INDEX \"". $index ."\"" );
+ $this->db->query( "DROP INDEX \"" . $index . "\"" );
$pu = array();
} else {
$this->output( "...no need to drop index '$index'\n" );
@@ -764,13 +841,21 @@ END;
if ( $this->fkeyDeltype( 'revision_rev_user_fkey' ) == 'r' ) {
$this->output( "...constraint 'revision_rev_user_fkey' is ON DELETE RESTRICT\n" );
} else {
- $this->applyPatch( 'patch-revision_rev_user_fkey.sql', false, "Changing constraint 'revision_rev_user_fkey' to ON DELETE RESTRICT" );
+ $this->applyPatch(
+ 'patch-revision_rev_user_fkey.sql',
+ false,
+ "Changing constraint 'revision_rev_user_fkey' to ON DELETE RESTRICT"
+ );
}
}
protected function checkIwlPrefix() {
if ( $this->db->indexExists( 'iwlinks', 'iwl_prefix' ) ) {
- $this->applyPatch( 'patch-rename-iwl_prefix.sql', false, "Replacing index 'iwl_prefix' with 'iwl_prefix_from_title'" );
+ $this->applyPatch(
+ 'patch-rename-iwl_prefix.sql',
+ false,
+ "Replacing index 'iwl_prefix' with 'iwl_prefix_title_from'"
+ );
}
}
diff --git a/includes/installer/SqliteInstaller.php b/includes/installer/SqliteInstaller.php
index 68df6ab2..19218c60 100644
--- a/includes/installer/SqliteInstaller.php
+++ b/includes/installer/SqliteInstaller.php
@@ -60,9 +60,10 @@ class SqliteInstaller extends DatabaseInstaller {
$result->fatal( 'config-outdated-sqlite', $db->getServerVersion(), self::MINIMUM_VERSION );
}
// Check for FTS3 full-text search module
- if( DatabaseSqlite::getFulltextSearchModule() != 'FTS3' ) {
+ if ( DatabaseSqlite::getFulltextSearchModule() != 'FTS3' ) {
$result->warning( 'config-no-fts3' );
}
+
return $result;
}
@@ -73,6 +74,7 @@ class SqliteInstaller extends DatabaseInstaller {
DIRECTORY_SEPARATOR,
dirname( $_SERVER['DOCUMENT_ROOT'] ) . '/data'
);
+
return array( 'wgSQLiteDataDir' => $path );
} else {
return array();
@@ -80,8 +82,17 @@ class SqliteInstaller extends DatabaseInstaller {
}
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' ) );
+ 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' )
+ );
}
/**
@@ -96,6 +107,7 @@ class SqliteInstaller extends DatabaseInstaller {
if ( !$result ) {
return $path;
}
+
return $result;
}
@@ -115,6 +127,7 @@ class SqliteInstaller extends DatabaseInstaller {
}
# Table prefix is not used on SQLite, keep it empty
$this->setVar( 'wgDBprefix', '' );
+
return $result;
}
@@ -128,9 +141,16 @@ class SqliteInstaller extends DatabaseInstaller {
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 );
+ 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 ) );
+ return Status::newFatal(
+ 'config-sqlite-parent-unwritable-nogroup',
+ $dir, dirname( $dir ), basename( $dir )
+ );
}
}
@@ -173,6 +193,7 @@ class SqliteInstaller extends DatabaseInstaller {
} catch ( DBConnectionError $e ) {
$status->fatal( 'config-sqlite-connection-error', $e->getMessage() );
}
+
return $status;
}
@@ -220,6 +241,7 @@ class SqliteInstaller extends DatabaseInstaller {
$this->setVar( 'wgDBuser', '' );
$this->setVar( 'wgDBpassword', '' );
$this->setupSchemaVars();
+
return $this->getConnection();
}
@@ -228,6 +250,7 @@ class SqliteInstaller extends DatabaseInstaller {
*/
public function createTables() {
$status = parent::createTables();
+
return $this->setupSearchIndex( $status );
}
@@ -246,6 +269,7 @@ class SqliteInstaller extends DatabaseInstaller {
} elseif ( !$fts3tTable && $module == 'FTS3' ) {
$this->db->sourceFile( "$IP/maintenance/sqlite/archives/searchindex-fts3.sql" );
}
+
return $status;
}
@@ -254,8 +278,8 @@ class SqliteInstaller extends DatabaseInstaller {
*/
public function getLocalSettings() {
$dir = LocalSettingsGenerator::escapePhpString( $this->getVar( 'wgSQLiteDataDir' ) );
- return
-"# SQLite-specific settings
+
+ return "# SQLite-specific settings
\$wgSQLiteDataDir = \"{$dir}\";";
}
}
diff --git a/includes/installer/SqliteUpdater.php b/includes/installer/SqliteUpdater.php
index 2064842a..78ca5110 100644
--- a/includes/installer/SqliteUpdater.php
+++ b/includes/installer/SqliteUpdater.php
@@ -31,95 +31,100 @@ class SqliteUpdater extends DatabaseUpdater {
protected function getCoreUpdateList() {
return array(
- array( 'disableContentHandlerUseDB' ),
-
// 1.14
- array( 'addField', 'site_stats', 'ss_active_users', 'patch-ss_active_users.sql' ),
+ 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( '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' ),
+ array( 'addTable', 'change_tag', 'patch-change_tag.sql' ),
+ array( 'addTable', 'tag_summary', 'patch-tag_summary.sql' ),
+ array( 'addTable', 'valid_tag', 'patch-valid_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( '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' ),
+ # listed separately from the previous update because 1.16 was released without this update
+ array( 'doLogUsertextPopulation' ),
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( 'addTable', 'l10n_cache', 'patch-l10n_cache.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( '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( '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' ),
- array( 'dropIndex', 'archive', 'ar_page_revid', 'patch-archive_kill_ar_page_revid.sql' ),
- array( 'addIndex', 'archive', 'ar_revid', 'patch-archive_ar_revid.sql' ),
+ 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' ),
// 1.18
- array( 'addIndex', 'user', 'user_email', 'patch-user_email_index.sql' ),
- array( 'addTable', 'uploadstash', 'patch-uploadstash.sql' ),
- array( 'addTable', 'user_former_groups', 'patch-user_former_groups.sql'),
+ array( 'addIndex', 'user', 'user_email', 'patch-user_email_index.sql' ),
+ array( 'addTable', 'uploadstash', 'patch-uploadstash.sql' ),
+ array( 'addTable', 'user_former_groups', 'patch-user_former_groups.sql' ),
// 1.19
- array( 'addIndex', 'logging', 'type_action', 'patch-logging-type-action-index.sql'),
+ array( 'addIndex', 'logging', 'type_action', 'patch-logging-type-action-index.sql' ),
array( 'doMigrateUserOptions' ),
- array( 'dropField', 'user', 'user_options', 'patch-drop-user_options.sql' ),
- array( 'addField', 'revision', 'rev_sha1', 'patch-rev_sha1.sql' ),
- array( 'addField', 'archive', 'ar_sha1', 'patch-ar_sha1.sql' ),
- array( 'addIndex', 'page', 'page_redirect_namespace_len', 'patch-page_redirect_namespace_len.sql' ),
- array( 'addField', 'uploadstash', 'us_chunk_inx', 'patch-uploadstash_chunk.sql' ),
- array( 'addfield', 'job', 'job_timestamp', 'patch-jobs-add-timestamp.sql' ),
+ array( 'dropField', 'user', 'user_options', 'patch-drop-user_options.sql' ),
+ array( 'addField', 'revision', 'rev_sha1', 'patch-rev_sha1.sql' ),
+ array( 'addField', 'archive', 'ar_sha1', 'patch-ar_sha1.sql' ),
+ array( 'addIndex', 'page', 'page_redirect_namespace_len',
+ 'patch-page_redirect_namespace_len.sql' ),
+ array( 'addField', 'uploadstash', 'us_chunk_inx', 'patch-uploadstash_chunk.sql' ),
+ array( 'addfield', 'job', 'job_timestamp', 'patch-jobs-add-timestamp.sql' ),
// 1.20
array( 'addIndex', 'revision', 'page_user_timestamp', 'patch-revision-user-page-index.sql' ),
array( 'addField', 'ipblocks', 'ipb_parent_block_id', 'patch-ipb-parent-block-id.sql' ),
array( 'addIndex', 'ipblocks', 'ipb_parent_block_id', 'patch-ipb-parent-block-id-index.sql' ),
- array( 'dropField', 'category', 'cat_hidden', 'patch-cat_hidden.sql' ),
+ array( 'dropField', 'category', 'cat_hidden', 'patch-cat_hidden.sql' ),
// 1.21
array( 'addField', 'revision', 'rev_content_format', 'patch-revision-rev_content_format.sql' ),
- array( 'addField', 'revision', 'rev_content_model', 'patch-revision-rev_content_model.sql' ),
- array( 'addField', 'archive', 'ar_content_format', 'patch-archive-ar_content_format.sql' ),
- array( 'addField', 'archive', 'ar_content_model', 'patch-archive-ar_content_model.sql' ),
- array( 'addField', 'page', 'page_content_model', 'patch-page-page_content_model.sql' ),
- array( 'enableContentHandlerUseDB' ),
-
- array( 'dropField', 'site_stats', 'ss_admins', 'patch-drop-ss_admins.sql' ),
+ array( 'addField', 'revision', 'rev_content_model', 'patch-revision-rev_content_model.sql' ),
+ array( 'addField', 'archive', 'ar_content_format', 'patch-archive-ar_content_format.sql' ),
+ array( 'addField', 'archive', 'ar_content_model', 'patch-archive-ar_content_model.sql' ),
+ array( 'addField', 'page', 'page_content_model', 'patch-page-page_content_model.sql' ),
+ array( 'dropField', 'site_stats', 'ss_admins', 'patch-drop-ss_admins.sql' ),
array( 'dropField', 'recentchanges', 'rc_moved_to_title', 'patch-rc_moved.sql' ),
- array( 'addTable', 'sites', 'patch-sites.sql' ),
- array( 'addField', 'filearchive', 'fa_sha1', 'patch-fa_sha1.sql' ),
- array( 'addField', 'job', 'job_token', 'patch-job_token.sql' ),
- array( 'addField', 'job', 'job_attempts', 'patch-job_attempts.sql' ),
+ array( 'addTable', 'sites', 'patch-sites.sql' ),
+ array( 'addField', 'filearchive', 'fa_sha1', 'patch-fa_sha1.sql' ),
+ array( 'addField', 'job', 'job_token', 'patch-job_token.sql' ),
+ array( 'addField', 'job', 'job_attempts', 'patch-job_attempts.sql' ),
array( 'doEnableProfiling' ),
- array( 'addField', 'uploadstash', 'us_props', 'patch-uploadstash-us_props.sql' ),
+ array( 'addField', 'uploadstash', 'us_props', 'patch-uploadstash-us_props.sql' ),
array( 'modifyField', 'user_groups', 'ug_group', 'patch-ug_group-length-increase-255.sql' ),
- array( 'modifyField', 'user_former_groups', 'ufg_group', 'patch-ufg_group-length-increase-255.sql' ),
- array( 'addIndex', 'page_props', 'pp_propname_page', 'patch-page_props-propname-page-index.sql' ),
+ array( 'modifyField', 'user_former_groups', 'ufg_group',
+ 'patch-ufg_group-length-increase-255.sql' ),
+ array( 'addIndex', 'page_props', 'pp_propname_page',
+ 'patch-page_props-propname-page-index.sql' ),
array( 'addIndex', 'image', 'img_media_mime', 'patch-img_media_mime-index.sql' ),
+ array( 'addIndex', 'iwlinks', 'iwl_prefix_from_title', 'patch-iwlinks-from-title-index.sql' ),
+ array( 'addField', 'archive', 'ar_id', 'patch-archive-ar_id.sql' ),
+ array( 'addField', 'externallinks', 'el_id', 'patch-externallinks-el_id.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', __METHOD__ ) ) {
+ // 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', __METHOD__ )
+ ) {
$this->output( "...have initial indexes\n" );
+
return;
}
$this->applyPatch( 'initial-indexes.sql', false, "Adding initial indexes" );
@@ -129,7 +134,11 @@ class SqliteUpdater extends DatabaseUpdater {
$module = DatabaseSqlite::getFulltextSearchModule();
$fts3tTable = $this->updateRowExists( 'fts3' );
if ( $fts3tTable && !$module ) {
- $this->applyPatch( 'searchindex-no-fts.sql', false, 'PHP is missing FTS3 support, downgrading tables' );
+ $this->applyPatch(
+ 'searchindex-no-fts.sql',
+ false,
+ 'PHP is missing FTS3 support, downgrading tables'
+ );
} elseif ( !$fts3tTable && $module == 'FTS3' ) {
$this->applyPatch( 'searchindex-fts3.sql', false, "Adding FTS3 search capabilities" );
} else {
@@ -139,7 +148,7 @@ class SqliteUpdater extends DatabaseUpdater {
protected function doEnableProfiling() {
global $wgProfileToDatabase;
- if ( $wgProfileToDatabase === true && ! $this->db->tableExists( 'profiling', __METHOD__ ) ) {
+ if ( $wgProfileToDatabase === true && !$this->db->tableExists( 'profiling', __METHOD__ ) ) {
$this->applyPatch( 'patch-profiling.sql', false, 'Add profiling table' );
}
}
diff --git a/includes/installer/WebInstaller.php b/includes/installer/WebInstaller.php
index 35d649b2..95765259 100644
--- a/includes/installer/WebInstaller.php
+++ b/includes/installer/WebInstaller.php
@@ -154,9 +154,9 @@ class WebInstaller extends Installer {
$this->exportVars();
$this->setupLanguage();
- if( ( $this->getVar( '_InstallDone' ) || $this->getVar( '_UpgradeDone' ) )
- && $this->request->getVal( 'localsettings' ) )
- {
+ 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"'
@@ -164,18 +164,20 @@ class WebInstaller extends Installer {
$ls = InstallerOverrides::getLocalSettingsGenerator( $this );
$rightsProfile = $this->rightsProfiles[$this->getVar( '_RightsProfile' )];
- foreach( $rightsProfile as $group => $rightsArr ) {
+ foreach ( $rightsProfile as $group => $rightsArr ) {
$ls->setGroupRights( $group, $rightsArr );
}
echo $ls->getText();
+
return $this->session;
}
$cssDir = $this->request->getVal( 'css' );
- if( $cssDir ) {
+ if ( $cssDir ) {
$cssDir = ( $cssDir == 'rtl' ? 'rtl' : 'ltr' );
$this->request->response()->header( 'Content-type: text/css' );
echo $this->output->getCSS( $cssDir );
+
return $this->session;
}
@@ -199,6 +201,7 @@ class WebInstaller extends Installer {
$this->output->useShortHeader();
$this->output->allowFrames();
$page->submitCC();
+
return $this->finish();
}
@@ -207,6 +210,7 @@ class WebInstaller extends Installer {
$this->output->useShortHeader();
$this->output->allowFrames();
$this->output->addHTML( $page->getCCDoneBox() );
+
return $this->finish();
}
@@ -250,12 +254,13 @@ class WebInstaller extends Installer {
do {
$nextPageId--;
$nextPage = $this->pageSequence[$nextPageId];
- } while( isset( $this->skippedPages[$nextPage] ) );
+ } while ( isset( $this->skippedPages[$nextPage] ) );
} else {
$nextPage = $this->pageSequence[$lowestUnhappy];
}
$this->output->redirect( $this->getUrl( array( 'page' => $nextPage ) ) );
+
return $this->finish();
}
@@ -263,7 +268,7 @@ class WebInstaller extends Installer {
$this->currentPageName = $page->getName();
$this->startPageWrapper( $pageName );
- if( $page->isSlow() ) {
+ if ( $page->isSlow() ) {
$this->disableTimeLimit();
}
@@ -324,7 +329,7 @@ class WebInstaller extends Installer {
* @return bool
*/
public function startSession() {
- if( wfIniGetBool( 'session.auto_start' ) || session_id() ) {
+ if ( wfIniGetBool( 'session.auto_start' ) || session_id() ) {
// Done already
return true;
}
@@ -336,6 +341,7 @@ class WebInstaller extends Installer {
if ( $this->phpErrors ) {
$this->showError( 'config-session-error', $this->phpErrors[0] );
+
return false;
}
@@ -353,7 +359,7 @@ class WebInstaller extends Installer {
public function getFingerprint() {
// Get the base URL of the installation
$url = $this->request->getFullRequestURL();
- if ( preg_match( '!^(.*\?)!', $url, $m) ) {
+ if ( preg_match( '!^(.*\?)!', $url, $m ) ) {
// Trim query string
$url = $m[1];
}
@@ -362,6 +368,7 @@ class WebInstaller extends Installer {
// the /mw-config/index.php. Kinda scary though?
$url = $m[1];
}
+
return md5( serialize( array(
'local path' => dirname( __DIR__ ),
'url' => $url,
@@ -516,7 +523,7 @@ class WebInstaller extends Installer {
/**
* Called by execute() before page output starts, to show a page list.
*
- * @param $currentPageName String
+ * @param $currentPageName string
*/
private function startPageWrapper( $currentPageName ) {
$s = "<div class=\"config-page-wrapper\">\n";
@@ -539,7 +546,14 @@ class WebInstaller extends Installer {
$s .= "</ul><br/><ul>\n";
$s .= $this->getPageListItem( 'Restart', true, $currentPageName );
- $s .= "</ul></div>\n"; // end list pane
+ // End list pane
+ $s .= "</ul></div>\n";
+
+ // Messages:
+ // 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
$s .= Html::element( 'h2', array(),
wfMessage( 'config-page-' . strtolower( $currentPageName ) )->text() );
@@ -549,14 +563,20 @@ class WebInstaller extends Installer {
/**
* Get a list item for the page list.
*
- * @param $pageName String
- * @param $enabled Boolean
- * @param $currentPageName String
+ * @param $pageName string
+ * @param $enabled boolean
+ * @param $currentPageName string
*
* @return string
*/
private function getPageListItem( $pageName, $enabled, $currentPageName ) {
$s = "<li class=\"config-page-list-item\">";
+
+ // Messages:
+ // 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
$name = wfMessage( 'config-page-' . strtolower( $pageName ) )->text();
if ( $enabled ) {
@@ -601,9 +621,9 @@ class WebInstaller extends Installer {
*/
private function endPageWrapper() {
$this->output->addHTMLNoFlush(
- "<div class=\"visualClear\"></div>\n" .
- "</div>\n" .
- "<div class=\"visualClear\"></div>\n" .
+ "<div class=\"visualClear\"></div>\n" .
+ "</div>\n" .
+ "<div class=\"visualClear\"></div>\n" .
"</div>" );
}
@@ -640,8 +660,11 @@ class WebInstaller extends Installer {
*/
public function getInfoBox( $text, $icon = false, $class = false ) {
$text = $this->parse( $text, true );
- $icon = ( $icon == false ) ? '../skins/common/images/info-32.png' : '../skins/common/images/'.$icon;
+ $icon = ( $icon == false ) ?
+ '../skins/common/images/info-32.png' :
+ '../skins/common/images/' . $icon;
$alt = wfMessage( 'config-information' )->text();
+
return Html::infoBox( $text, $icon, $alt, $class, false );
}
@@ -686,7 +709,7 @@ class WebInstaller extends Installer {
$args = func_get_args();
array_shift( $args );
$html = '<div class="config-message">' .
- $this->parse( wfMessage( $msg, $args )->useDatabase( false )->plain() ) .
+ $this->parse( wfMessage( $msg, $args )->useDatabase( false )->plain() ) .
"</div>\n";
$this->output->addHTML( $html );
}
@@ -724,16 +747,16 @@ class WebInstaller extends Installer {
$attributes['for'] = $forId;
}
- return
- "<div class=\"config-block\">\n" .
+ return "<div class=\"config-block\">\n" .
" <div class=\"config-block-label\">\n" .
Xml::tags( 'label',
$attributes,
- $labelText ) . "\n" .
- $helpData .
+ $labelText
+ ) . "\n" .
+ $helpData .
" </div>\n" .
" <div class=\"config-block-elements\">\n" .
- $contents .
+ $contents .
" </div>\n" .
"</div>\n";
}
@@ -743,12 +766,12 @@ class WebInstaller extends Installer {
*
* @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)
+ * 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)
+ * value: The current value of the variable (optional)
+ * help: The html for the help text (optional)
*
* @return string
*/
@@ -767,22 +790,22 @@ class WebInstaller extends Installer {
if ( !isset( $params['help'] ) ) {
$params['help'] = "";
}
- return
- $this->label(
- $params['label'],
+
+ return $this->label(
+ $params['label'],
+ $params['controlName'],
+ Xml::input(
$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']
- );
+ 30, // intended to be overridden by CSS
+ $params['value'],
+ $params['attribs'] + array(
+ 'id' => $params['controlName'],
+ 'class' => 'config-input-text',
+ 'tabindex' => $this->nextTabIndex()
+ )
+ ),
+ $params['help']
+ );
}
/**
@@ -790,12 +813,12 @@ class WebInstaller extends Installer {
*
* @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)
+ * 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)
+ * value: The current value of the variable (optional)
+ * help: The html for the help text (optional)
*
* @return string
*/
@@ -814,23 +837,23 @@ class WebInstaller extends Installer {
if ( !isset( $params['help'] ) ) {
$params['help'] = "";
}
- return
- $this->label(
- $params['label'],
+
+ return $this->label(
+ $params['label'],
+ $params['controlName'],
+ Xml::textarea(
$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']
- );
+ $params['value'],
+ 30,
+ 5,
+ $params['attribs'] + array(
+ 'id' => $params['controlName'],
+ 'class' => 'config-input-text',
+ 'tabindex' => $this->nextTabIndex()
+ )
+ ),
+ $params['help']
+ );
}
/**
@@ -839,12 +862,12 @@ class WebInstaller extends Installer {
* 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)
+ * 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)
+ * value: The current value of the variable (optional)
+ * help: The html for the help text (optional)
*
* @return string
*/
@@ -868,12 +891,12 @@ class WebInstaller extends Installer {
*
* @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)
+ * 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)
+ * value: The current value of the variable (optional)
+ * help: The html for the help text (optional)
*
* @return string
*/
@@ -892,14 +915,15 @@ class WebInstaller extends Installer {
if ( !isset( $params['help'] ) ) {
$params['help'] = "";
}
- if( isset( $params['rawtext'] ) ) {
+ if ( isset( $params['rawtext'] ) ) {
$labelText = $params['rawtext'];
- } else {
+ } else if ( isset( $params['label'] ) ) {
$labelText = $this->parse( wfMessage( $params['label'] )->text() );
+ } else {
+ $labelText = "";
}
- return
- "<div class=\"config-input-check\">\n" .
+ return "<div class=\"config-input-check\">\n" .
$params['help'] .
"<label>\n" .
Xml::check(
@@ -920,15 +944,15 @@ class WebInstaller extends Installer {
*
* @param $params Array
* Parameters are:
- * var: The variable to be configured (required)
- * label: The message name for the label (required)
+ * 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)
+ * 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)
*
* @return string
*/
@@ -987,10 +1011,10 @@ class WebInstaller extends Installer {
* @param $status Status
*/
public function showStatusBox( $status ) {
- if( !$status->isGood() ) {
+ if ( !$status->isGood() ) {
$text = $status->getWikiText();
- if( $status->isOk() ) {
+ if ( $status->isOk() ) {
$box = $this->getWarningBox( $text );
} else {
$box = $this->getErrorBox( $text );
@@ -1058,6 +1082,7 @@ class WebInstaller extends Installer {
*/
public function docLink( $linkText, $attribs, $parser ) {
$url = $this->getDocUrl( $attribs['href'] );
+
return '<a href="' . htmlspecialchars( $url ) . '">' .
htmlspecialchars( $linkText ) .
'</a>';
@@ -1071,7 +1096,7 @@ class WebInstaller extends Installer {
* @param $parser
* @return String Html for download link
*/
- public function downloadLinkHook( $text, $attribs, $parser ) {
+ public function downloadLinkHook( $text, $attribs, $parser ) {
$img = Html::element( 'img', array(
'src' => '../skins/common/images/download-32.png',
'width' => '32',
@@ -1080,6 +1105,7 @@ class WebInstaller extends Installer {
$anchor = Html::rawElement( 'a',
array( 'href' => $this->getURL( array( 'localsettings' => 1 ) ) ),
$img . ' ' . wfMessage( 'config-download-localsettings' )->parse() );
+
return Html::rawElement( 'div', array( 'class' => 'config-download-link' ), $anchor );
}
@@ -1101,8 +1127,10 @@ class WebInstaller extends Installer {
$this->setVar( 'wgScriptPath', $uri );
} else {
$this->showError( 'config-no-uri' );
+
return false;
}
+
return parent::envCheckPath();
}
diff --git a/includes/installer/WebInstallerOutput.php b/includes/installer/WebInstallerOutput.php
index d61d843f..f2dc37fe 100644
--- a/includes/installer/WebInstallerOutput.php
+++ b/includes/installer/WebInstallerOutput.php
@@ -104,49 +104,85 @@ class WebInstallerOutput {
/**
* Get the raw vector CSS, flipping if needed
+ *
+ * @todo Possibly get rid of this function and use ResourceLoader in the manner it was
+ * designed to be used in, rather than just grabbing a list of filenames from it,
+ * and not properly handling such details as media types in module definitions.
+ *
* @param string $dir 'ltr' or 'rtl'
* @return String
*/
public function getCSS( $dir ) {
- $skinDir = dirname( dirname( __DIR__ ) ) . '/skins';
-
- // All these files will be concatenated in sequence and loaded
- // as one file.
- // The string 'images/' in the files' contents will be replaced
- // by '../skins/$skinName/images/', where $skinName is what appears
- // before the last '/' in each of the strings.
- $cssFileNames = array(
-
- // Basically the "skins.vector" ResourceLoader module styles
- 'common/shared.css',
- 'common/commonElements.css',
- 'common/commonContent.css',
- 'common/commonInterface.css',
- 'vector/screen.css',
-
- // mw-config specific
- 'common/config.css',
+ // All CSS files these modules reference will be concatenated in sequence
+ // and loaded as one file.
+ $moduleNames = array(
+ 'mediawiki.legacy.shared',
+ 'skins.vector',
+ 'mediawiki.legacy.config',
);
+ $prepend = '';
$css = '';
- wfSuppressWarnings();
- foreach ( $cssFileNames as $cssFileName ) {
- $fullCssFileName = "$skinDir/$cssFileName";
- $cssFileContents = file_get_contents( $fullCssFileName );
- if ( $cssFileContents ) {
- preg_match( "/^(\w+)\//", $cssFileName, $match );
- $skinName = $match[1];
- $css .= str_replace( 'images/', "../skins/$skinName/images/", $cssFileContents );
- } else {
- $css .= "/** Your webserver cannot read $fullCssFileName. Please check file permissions. */";
+ $cssFileNames = array();
+ $resourceLoader = new ResourceLoader();
+ foreach ( $moduleNames as $moduleName ) {
+ $module = $resourceLoader->getModule( $moduleName );
+ $cssFileNames = $module->getAllStyleFiles();
+
+ wfSuppressWarnings();
+ foreach ( $cssFileNames as $cssFileName ) {
+ if ( !file_exists( $cssFileName ) ) {
+ $prepend .= ResourceLoader::makeComment( "Unable to find $cssFileName." );
+ continue;
+ }
+
+ if ( !is_readable( $cssFileName ) ) {
+ $prepend .= ResourceLoader::makeComment( "Unable to read $cssFileName. Please check file permissions." );
+ continue;
+ }
+
+ try {
+
+ if ( preg_match( '/\.less$/', $cssFileName ) ) {
+ // Run the LESS compiler for *.less files (bug 55589)
+ $compiler = ResourceLoader::getLessCompiler();
+ $cssFileContents = $compiler->compileFile( $cssFileName );
+ } else {
+ // Regular CSS file
+ $cssFileContents = file_get_contents( $cssFileName );
+ }
+
+ if ( $cssFileContents ) {
+ // Rewrite URLs, though don't bother embedding images. While static image
+ // files may be cached, CSS returned by this function is definitely not.
+ $cssDirName = dirname( $cssFileName );
+ $css .= CSSMin::remap(
+ /* source */ $cssFileContents,
+ /* local */ $cssDirName,
+ /* remote */ '..' . str_replace(
+ array( $GLOBALS['IP'], DIRECTORY_SEPARATOR ),
+ array( '', '/' ),
+ $cssDirName
+ ),
+ /* embedData */ false
+ );
+ } else {
+ $prepend .= ResourceLoader::makeComment( "Unable to read $cssFileName." );
+ }
+
+ } catch ( Exception $e ) {
+ $prepend .= ResourceLoader::formatException( $e );
+ }
+
+ $css .= "\n";
}
-
- $css .= "\n";
+ wfRestoreWarnings();
}
- wfRestoreWarnings();
- if( $dir == 'rtl' ) {
+ $css = $prepend . $css;
+
+ if ( $dir == 'rtl' ) {
$css = CSSJanus::transform( $css, true );
}
@@ -185,6 +221,7 @@ class WebInstallerOutput {
*/
public function getDir() {
global $wgLang;
+
return is_object( $wgLang ) ? $wgLang->getDir() : 'ltr';
}
@@ -193,6 +230,7 @@ class WebInstallerOutput {
*/
public function getLanguageCode() {
global $wgLang;
+
return is_object( $wgLang ) ? $wgLang->getCode() : 'en';
}
@@ -216,22 +254,23 @@ class WebInstallerOutput {
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 );
+ $this->parent->request->response()->header( 'Location: ' . $this->redirectTarget );
+
return;
}
if ( $this->useShortHeader ) {
$this->outputShortHeader();
+
return;
}
-
?>
<?php echo Html::htmlHeader( $this->getHeadAttribs() ); ?>
<head>
@@ -239,7 +278,6 @@ class WebInstallerOutput {
<meta http-equiv="Content-type" content="text/html; charset=utf-8" />
<title><?php $this->outputTitle(); ?></title>
<?php echo $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>
diff --git a/includes/installer/WebInstallerPage.php b/includes/installer/WebInstallerPage.php
index 06d16a5a..7e8a3631 100644
--- a/includes/installer/WebInstallerPage.php
+++ b/includes/installer/WebInstallerPage.php
@@ -74,6 +74,10 @@ abstract class WebInstallerPage {
);
}
+ /**
+ * @param string|bool $continue
+ * @param string|bool $back
+ */
public function endForm( $continue = 'continue', $back = 'back' ) {
$s = "<div class=\"config-submit\">\n";
$id = $this->getId();
@@ -84,25 +88,36 @@ abstract class WebInstallerPage {
if ( $continue ) {
// Fake submit button for enter keypress (bug 26267)
- $s .= Xml::submitButton( wfMessage( "config-$continue" )->text(),
- array( 'name' => "enter-$continue", 'style' =>
- 'visibility:hidden;overflow:hidden;width:1px;margin:0' ) ) . "\n";
+ // Messages: config-continue, config-restart, config-regenerate
+ $s .= Xml::submitButton(
+ wfMessage( "config-$continue" )->text(),
+ array(
+ 'name' => "enter-$continue",
+ 'style' => 'visibility:hidden;overflow:hidden;width:1px;margin:0'
+ )
+ ) . "\n";
}
if ( $back ) {
- $s .= Xml::submitButton( wfMessage( "config-$back" )->text(),
+ // Message: config-back
+ $s .= Xml::submitButton(
+ wfMessage( "config-$back" )->text(),
array(
'name' => "submit-$back",
'tabindex' => $this->parent->nextTabIndex()
- ) ) . "\n";
+ )
+ ) . "\n";
}
if ( $continue ) {
- $s .= Xml::submitButton( wfMessage( "config-$continue" )->text(),
+ // Messages: config-continue, config-restart, config-regenerate
+ $s .= Xml::submitButton(
+ wfMessage( "config-$continue" )->text(),
array(
'name' => "submit-$continue",
'tabindex' => $this->parent->nextTabIndex(),
- ) ) . "\n";
+ )
+ ) . "\n";
}
$s .= "</div></form></div>\n";
@@ -204,6 +219,7 @@ class WebInstaller_Language extends WebInstallerPage {
if ( isset( $languages[$contLang] ) ) {
$this->setVar( 'wgLanguageCode', $contLang );
}
+
return 'continue';
}
} elseif ( $this->parent->showSessionWarning ) {
@@ -251,13 +267,15 @@ class WebInstaller_Language extends WebInstallerPage {
$languages = Language::fetchLanguageNames();
ksort( $languages );
foreach ( $languages as $code => $lang ) {
- if ( isset( $wgDummyLanguageCodes[$code] ) ) continue;
+ if ( isset( $wgDummyLanguageCodes[$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 {
@@ -271,8 +289,8 @@ class WebInstaller_ExistingWiki extends WebInstallerPage {
// 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'] )
- {
+ && $this->getVar( 'wgUpgradeKey' ) === $vars['wgUpgradeKey']
+ ) {
// It's there, so the user is authorized
$status = $this->handleExistingUpgrade( $vars );
if ( $status->isOK() ) {
@@ -281,6 +299,7 @@ class WebInstaller_ExistingWiki extends WebInstallerPage {
$this->startForm();
$this->parent->showStatusBox( $status );
$this->endForm( 'continue' );
+
return 'output';
}
}
@@ -299,6 +318,7 @@ class WebInstaller_ExistingWiki extends WebInstallerPage {
$this->getVar( 'wgUpgradeKey' ) . "';</pre>" )->plain()
) );
$this->endForm( 'continue' );
+
return 'output';
}
@@ -307,9 +327,10 @@ class WebInstaller_ExistingWiki extends WebInstallerPage {
$r = $this->parent->request;
if ( $r->wasPosted() ) {
$key = $r->getText( 'config_wgUpgradeKey' );
- if( !$key || $key !== $vars['wgUpgradeKey'] ) {
+ if ( !$key || $key !== $vars['wgUpgradeKey'] ) {
$this->parent->showError( 'config-localsettings-badkey' );
$this->showKeyForm();
+
return 'output';
}
// Key was OK
@@ -319,10 +340,12 @@ class WebInstaller_ExistingWiki extends WebInstallerPage {
} else {
$this->parent->showStatusBox( $status );
$this->showKeyForm();
+
return 'output';
}
} else {
$this->showKeyForm();
+
return 'output';
}
}
@@ -333,7 +356,7 @@ class WebInstaller_ExistingWiki extends WebInstallerPage {
protected function showKeyForm() {
$this->startForm();
$this->addHTML(
- $this->parent->getInfoBox( wfMessage( 'config-localsettings-upgrade' )->plain() ).
+ $this->parent->getInfoBox( wfMessage( 'config-localsettings-upgrade' )->plain() ) .
'<br />' .
$this->parent->getTextBox( array(
'var' => 'wgUpgradeKey',
@@ -352,6 +375,7 @@ class WebInstaller_ExistingWiki extends WebInstallerPage {
}
$this->setVar( $name, $vars[$name] );
}
+
return $status;
}
@@ -363,7 +387,8 @@ class WebInstaller_ExistingWiki extends WebInstallerPage {
protected function handleExistingUpgrade( $vars ) {
// Check $wgDBtype
if ( !isset( $vars['wgDBtype'] ) ||
- !in_array( $vars['wgDBtype'], Installer::getDBTypes() ) ) {
+ !in_array( $vars['wgDBtype'], Installer::getDBTypes() )
+ ) {
return Status::newFatal( 'config-localsettings-connection-error', '' );
}
@@ -393,11 +418,13 @@ class WebInstaller_ExistingWiki extends WebInstallerPage {
// 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;
}
}
@@ -422,9 +449,9 @@ class WebInstaller_Welcome extends WebInstallerPage {
} else {
$this->parent->showStatusMessage( $status );
}
+
return '';
}
-
}
class WebInstaller_DBConnect extends WebInstallerPage {
@@ -440,6 +467,7 @@ class WebInstaller_DBConnect extends WebInstallerPage {
if ( $status->isGood() ) {
$this->setVar( '_UpgradeDone', false );
+
return 'continue';
} else {
$this->parent->showStatusBox( $status );
@@ -452,8 +480,10 @@ class WebInstaller_DBConnect extends WebInstallerPage {
$settings = '';
$defaultType = $this->getVar( 'wgDBtype' );
+ // Messages: config-support-mysql, config-support-postgres, config-support-oracle,
+ // config-support-sqlite
$dbSupport = '';
- foreach( $this->parent->getDBTypes() as $type ) {
+ foreach ( $this->parent->getDBTypes() as $type ) {
$link = DatabaseBase::factory( $type )->getSoftwareLink();
$dbSupport .= wfMessage( "config-support-$type", $link )->plain() . "\n";
}
@@ -481,20 +511,23 @@ class WebInstaller_DBConnect extends WebInstallerPage {
) .
"</li>\n";
- $settings .=
- Html::openElement( 'div', array( 'id' => 'DB_wrapper_' . $type,
- 'class' => 'dbWrapper' ) ) .
+ // Messages: config-header-mysql, config-header-postgres, config-header-oracle,
+ // config-header-sqlite
+ $settings .= Html::openElement(
+ 'div',
+ array(
+ 'id' => 'DB_wrapper_' . $type,
+ 'class' => 'dbWrapper'
+ )
+ ) .
Html::element( 'h3', array(), wfMessage( 'config-header-' . $type )->text() ) .
$installer->getConnectForm() .
"</div>\n";
}
- $types .= "</ul><br style=\"clear: left\"/>\n";
- $this->addHTML(
- $this->parent->label( 'config-db-type', false, $types ) .
- $settings
- );
+ $types .= "</ul><br style=\"clear: left\"/>\n";
+ $this->addHTML( $this->parent->label( 'config-db-type', false, $types ) . $settings );
$this->endForm();
}
@@ -509,9 +542,9 @@ class WebInstaller_DBConnect extends WebInstallerPage {
if ( !$installer ) {
return Status::newFatal( 'config-invalid-db-type' );
}
+
return $installer->submitConnectForm();
}
-
}
class WebInstaller_Upgrade extends WebInstallerPage {
@@ -532,6 +565,7 @@ class WebInstaller_Upgrade extends WebInstallerPage {
// Show the done message again
// Make them click back again if they want to do the upgrade again
$this->showDoneMessage();
+
return 'output';
}
}
@@ -555,11 +589,12 @@ class WebInstaller_Upgrade extends WebInstallerPage {
if ( $result ) {
// If they're going to possibly regenerate LocalSettings, we
// need to create the upgrade/secret keys. Bug 26481
- if( !$this->getVar( '_ExistingDBSettings' ) ) {
+ if ( !$this->getVar( '_ExistingDBSettings' ) ) {
$this->parent->generateKeys();
}
$this->setVar( '_UpgradeDone', true );
$this->showDoneMessage();
+
return 'output';
}
}
@@ -583,15 +618,14 @@ class WebInstaller_Upgrade extends WebInstallerPage {
$this->parent->getInfoBox(
wfMessage( $msg,
$this->getVar( 'wgServer' ) .
- $this->getVar( 'wgScriptPath' ) . '/index' .
- $this->getVar( 'wgScriptExtension' )
+ $this->getVar( 'wgScriptPath' ) . '/index' .
+ $this->getVar( 'wgScriptExtension' )
)->plain(), 'tick-32.png'
)
);
$this->parent->restoreLinkPopups();
$this->endForm( $regenerate ? 'regenerate' : false, false );
}
-
}
class WebInstaller_DBSettings extends WebInstallerPage {
@@ -620,7 +654,6 @@ class WebInstaller_DBSettings extends WebInstallerPage {
$this->addHTML( $form );
$this->endForm();
}
-
}
class WebInstaller_Name extends WebInstallerPage {
@@ -657,6 +690,9 @@ class WebInstaller_Name extends WebInstallerPage {
'label' => 'config-site-name',
'help' => $this->parent->getHelpBox( 'config-site-name-help' )
) ) .
+ // getRadioSet() builds a set of labeled radio buttons.
+ // For grep: The following messages are used as the item labels:
+ // config-ns-site-name, config-ns-generic, config-ns-other
$this->parent->getRadioSet( array(
'var' => '_NamespaceType',
'label' => 'config-project-namespace',
@@ -668,9 +704,8 @@ class WebInstaller_Name extends WebInstallerPage {
) ) .
$this->parent->getTextBox( array(
'var' => 'wgMetaNamespace',
- 'label' => '', //TODO: Needs a label?
- 'attribs' => array( 'readonly' => 'readonly', 'class' => 'enabledByOther' ),
-
+ 'label' => '', // @todo Needs a label?
+ 'attribs' => array( 'readonly' => 'readonly', 'class' => 'enabledByOther' )
) ) .
$this->getFieldSetStart( 'config-admin-box' ) .
$this->parent->getTextBox( array(
@@ -698,6 +733,9 @@ class WebInstaller_Name extends WebInstallerPage {
) ) .
$this->getFieldSetEnd() .
$this->parent->getInfoBox( wfMessage( 'config-almost-done' )->text() ) .
+ // getRadioSet() builds a set of labeled radio buttons.
+ // For grep: The following messages are used as the item labels:
+ // config-optional-continue, config-optional-skip
$this->parent->getRadioSet( array(
'var' => '_SkipOptional',
'itemLabelPrefix' => 'config-optional-',
@@ -709,6 +747,7 @@ class WebInstaller_Name extends WebInstallerPage {
$this->setVar( 'wgMetaNamespace', $metaNS );
$this->endForm();
+
return 'output';
}
@@ -761,7 +800,7 @@ class WebInstaller_Name extends WebInstallerPage {
// Make sure it won't conflict with any existing namespaces
global $wgContLang;
$nsIndex = $wgContLang->getNsIndex( $name );
- if( $nsIndex !== false && $nsIndex !== NS_PROJECT ) {
+ if ( $nsIndex !== false && $nsIndex !== NS_PROJECT ) {
$this->parent->showError( 'config-ns-conflict', $name );
$retVal = false;
}
@@ -809,24 +848,22 @@ class WebInstaller_Name extends WebInstallerPage {
// Validate e-mail if provided
$email = $this->getVar( '_AdminEmail' );
- if( $email && !Sanitizer::validateEmail( $email ) ) {
+ if ( $email && !Sanitizer::validateEmail( $email ) ) {
$this->parent->showError( 'config-admin-error-bademail' );
$retVal = false;
}
// If they asked to subscribe to mediawiki-announce but didn't give
// an e-mail, show an error. Bug 29332
- if( !$email && $this->getVar( '_Subscribe' ) ) {
+ if ( !$email && $this->getVar( '_Subscribe' ) ) {
$this->parent->showError( 'config-subscribe-noemail' );
$retVal = false;
}
return $retVal;
}
-
}
class WebInstaller_Options extends WebInstallerPage {
-
public function execute() {
if ( $this->getVar( '_SkipOptional' ) == 'skip' ) {
return 'skip';
@@ -841,6 +878,9 @@ class WebInstaller_Options extends WebInstallerPage {
$this->startForm();
$this->addHTML(
# User Rights
+ // getRadioSet() builds a set of labeled radio buttons.
+ // For grep: The following messages are used as the item labels:
+ // config-profile-wiki, config-profile-no-anon, config-profile-fishbowl, config-profile-private
$this->parent->getRadioSet( array(
'var' => '_RightsProfile',
'label' => 'config-profile',
@@ -850,6 +890,11 @@ class WebInstaller_Options extends WebInstallerPage {
$this->parent->getInfoBox( wfMessage( 'config-profile-help' )->plain() ) .
# Licensing
+ // getRadioSet() builds a set of labeled radio buttons.
+ // For grep: The following messages are used as the item labels:
+ // config-license-cc-by, config-license-cc-by-sa, config-license-cc-by-nc-sa,
+ // config-license-cc-0, config-license-pd, config-license-gfdl,
+ // config-license-none, config-license-cc-choose
$this->parent->getRadioSet( array(
'var' => '_LicenseCode',
'label' => 'config-license',
@@ -900,18 +945,27 @@ class WebInstaller_Options extends WebInstallerPage {
$extensions = $this->parent->findExtensions();
- if( $extensions ) {
+ if ( $extensions ) {
$extHtml = $this->getFieldSetStart( 'config-extensions' );
- foreach( $extensions as $ext ) {
+ /* Force a recache, so we load extensions descriptions */
+ global $wgLang;
+ $lc = Language::getLocalisationCache();
+ $lc->initialisedLangs = array();
+ $lc->getItem( $wgLang->mCode, '' );
+ LinkCache::singleton()->useDatabase( false );
+
+ foreach ( $extensions as $ext ) {
$extHtml .= $this->parent->getCheckBox( array(
- 'var' => "ext-$ext",
- 'rawtext' => $ext,
- ) );
+ 'var' => "ext-{$ext['name']}",
+ 'rawtext' => "<b>{$ext['name']}</b>: " .
+ wfMessage( $ext['descriptionmsg'] )->useDatabase( false )->parse(),
+ ) );
+
}
$extHtml .= $this->parent->getHelpBox( 'config-extensions-help' ) .
- $this->getFieldSetEnd();
+ $this->getFieldSetEnd();
$this->addHTML( $extHtml );
}
@@ -963,7 +1017,7 @@ class WebInstaller_Options extends WebInstallerPage {
);
$caches = array( 'none' );
- if( count( $this->getVar( '_Caches' ) ) ) {
+ if ( count( $this->getVar( '_Caches' ) ) ) {
$caches[] = 'accel';
}
$caches[] = 'memcached';
@@ -976,11 +1030,14 @@ class WebInstaller_Options extends WebInstallerPage {
// or going back!
$cacheval = 'none';
}
- $hidden = ($cacheval == 'memcached') ? '' : 'display: none';
+ $hidden = ( $cacheval == 'memcached' ) ? '' : 'display: none';
$this->addHTML(
# Advanced settings
$this->getFieldSetStart( 'config-advanced-settings' ) .
# Object cache settings
+ // getRadioSet() builds a set of labeled radio buttons.
+ // For grep: The following messages are used as the item labels:
+ // config-cache-none, config-cache-accel, config-cache-memcached
$this->parent->getRadioSet( array(
'var' => 'wgMainCacheType',
'label' => 'config-cache-options',
@@ -1023,6 +1080,7 @@ class WebInstaller_Options extends WebInstallerPage {
'lang' => $this->getVar( '_UserLang' ),
'stylesheet' => $styleUrl,
) );
+
return $iframeUrl;
}
@@ -1040,10 +1098,9 @@ class WebInstaller_Options extends WebInstallerPage {
} else {
$iframeAttribs['src'] = $this->getCCPartnerUrl();
}
- $wrapperStyle = ($this->getVar( '_LicenseCode' ) == 'cc-choose') ? '' : 'display: none';
+ $wrapperStyle = ( $this->getVar( '_LicenseCode' ) == 'cc-choose' ) ? '' : 'display: none';
- return
- "<div class=\"config-cc-wrapper\" id=\"config-cc-wrapper\" style=\"$wrapperStyle\">\n" .
+ return "<div class=\"config-cc-wrapper\" id=\"config-cc-wrapper\" style=\"$wrapperStyle\">\n" .
Html::element( 'iframe', $iframeAttribs, '', false /* not short */ ) .
"</div>\n";
}
@@ -1053,13 +1110,13 @@ class WebInstaller_Options extends WebInstallerPage {
// 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>'.
+
+ return '<p>' .
Html::element( 'img', array( 'src' => $this->getVar( 'wgRightsIcon' ) ) ) .
'&#160;&#160;' .
htmlspecialchars( $this->getVar( 'wgRightsText' ) ) .
"</p>\n" .
- "<p style=\"text-align: center\">" .
+ "<p style=\"text-align: center;\">" .
Html::element( 'a',
array(
'href' => $this->getCCPartnerUrl(),
@@ -1068,7 +1125,7 @@ class WebInstaller_Options extends WebInstallerPage {
wfMessage( 'config-cc-again' )->text()
) .
"</p>\n" .
- "<script type=\"text/javascript\">\n" .
+ "<script>\n" .
# Reduce the wrapper div height
htmlspecialchars( $reduceJs ) .
"\n" .
@@ -1080,6 +1137,7 @@ class WebInstaller_Options extends WebInstallerPage {
array( 'wgRightsUrl', 'wgRightsText', 'wgRightsIcon' ) );
if ( count( $newValues ) != 3 ) {
$this->parent->showError( 'config-cc-error' );
+
return;
}
$this->setVar( '_CCDone', true );
@@ -1094,8 +1152,8 @@ class WebInstaller_Options extends WebInstallerPage {
'wgUseInstantCommons' ) );
if ( !in_array( $this->getVar( '_RightsProfile' ),
- array_keys( $this->parent->rightsProfiles ) ) )
- {
+ array_keys( $this->parent->rightsProfiles ) )
+ ) {
reset( $this->parent->rightsProfiles );
$this->setVar( '_RightsProfile', key( $this->parent->rightsProfiles ) );
}
@@ -1104,9 +1162,14 @@ class WebInstaller_Options extends WebInstallerPage {
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 ) ) ) {
+ // Messages:
+ // config-license-cc-by, config-license-cc-by-sa, config-license-cc-by-nc-sa,
+ // config-license-cc-0, config-license-pd, config-license-gfdl, config-license-none,
+ // config-license-cc-choose
$entry = $this->parent->licenses[$code];
if ( isset( $entry['text'] ) ) {
$this->setVar( 'wgRightsText', $entry['text'] );
@@ -1121,41 +1184,47 @@ class WebInstaller_Options extends WebInstallerPage {
$this->setVar( 'wgRightsIcon', '' );
}
- $extsAvailable = $this->parent->findExtensions();
+ $extsAvailable = array_map( function($e) { if( isset($e['name']) ) return $e['name']; }, $this->parent->findExtensions() );
$extsToInstall = array();
- foreach( $extsAvailable as $ext ) {
- if( $this->parent->request->getCheck( 'config_ext-' . $ext ) ) {
- $extsToInstall[] = $ext;
+ foreach ( $extsAvailable as $key => $ext ) {
+ var_dump("config_ext-$ext");
+ if ( $this->parent->request->getCheck( 'config_ext-' . $ext ) ) {
+ $extsToInstall[] = $extsAvailable[ $key ];
}
}
$this->parent->setVar( '_Extensions', $extsToInstall );
- if( $this->getVar( 'wgMainCacheType' ) == 'memcached' ) {
+ if ( $this->getVar( 'wgMainCacheType' ) == 'memcached' ) {
$memcServers = explode( "\n", $this->getVar( '_MemCachedServers' ) );
- if( !$memcServers ) {
+ if ( !$memcServers ) {
$this->parent->showError( 'config-memcache-needservers' );
+
return false;
}
- foreach( $memcServers as $server ) {
+ foreach ( $memcServers as $server ) {
$memcParts = explode( ":", $server, 2 );
if ( !isset( $memcParts[0] )
- || ( !IP::isValid( $memcParts[0] )
- && ( gethostbyname( $memcParts[0] ) == $memcParts[0] ) ) ) {
+ || ( !IP::isValid( $memcParts[0] )
+ && ( gethostbyname( $memcParts[0] ) == $memcParts[0] ) )
+ ) {
$this->parent->showError( 'config-memcache-badip', $memcParts[0] );
+
return false;
- } elseif( !isset( $memcParts[1] ) ) {
+ } elseif ( !isset( $memcParts[1] ) ) {
$this->parent->showError( 'config-memcache-noport', $memcParts[0] );
+
return false;
- } elseif( $memcParts[1] < 1 || $memcParts[1] > 65535 ) {
+ } elseif ( $memcParts[1] < 1 || $memcParts[1] > 65535 ) {
$this->parent->showError( 'config-memcache-badport', 1, 65535 );
+
return false;
}
}
}
+
return true;
}
-
}
class WebInstaller_Install extends WebInstallerPage {
@@ -1164,11 +1233,11 @@ class WebInstaller_Install extends WebInstallerPage {
}
public function execute() {
- if( $this->getVar( '_UpgradeDone' ) ) {
+ if ( $this->getVar( '_UpgradeDone' ) ) {
return 'skip';
- } elseif( $this->getVar( '_InstallDone' ) ) {
+ } elseif ( $this->getVar( '_InstallDone' ) ) {
return 'continue';
- } elseif( $this->parent->request->wasPosted() ) {
+ } elseif ( $this->parent->request->wasPosted() ) {
$this->startForm();
$this->addHTML( "<ul>" );
$results = $this->parent->performInstallation(
@@ -1187,11 +1256,16 @@ class WebInstaller_Install extends WebInstallerPage {
$this->addHTML( $this->parent->getInfoBox( wfMessage( 'config-install-begin' )->plain() ) );
$this->endForm();
}
+
return true;
}
public function startStage( $step ) {
- $this->addHTML( "<li>" . wfMessage( "config-install-$step" )->escaped() . wfMessage( 'ellipsis' )->escaped() );
+ // Messages: config-install-database, config-install-tables, config-install-interwiki,
+ // config-install-stats, config-install-keys, config-install-sysop, config-install-mainpage
+ $this->addHTML( "<li>" . wfMessage( "config-install-$step" )->escaped() .
+ wfMessage( 'ellipsis' )->escaped() );
+
if ( $step == 'extension-tables' ) {
$this->startLiveBox();
}
@@ -1211,25 +1285,23 @@ class WebInstaller_Install extends WebInstallerPage {
$html = "<span class=\"error\">$html</span>";
}
$this->addHTML( $html . "</li>\n" );
- if( !$status->isGood() ) {
+ 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 = $this->getVar( '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" );
+ strpos( $_SERVER['HTTP_USER_AGENT'], 'MSIE' ) !== false
+ ) {
+ // JS appears to be the only method that works consistently with IE7+
+ $this->addHtml( "\n<script>jQuery( function () { document.location = " .
+ Xml::encodeJsVar( $lsUrl ) . "; } );</script>\n" );
} else {
$this->parent->request->response()->header( "Refresh: 0;url=$lsUrl" );
}
@@ -1241,12 +1313,15 @@ class WebInstaller_Complete extends WebInstallerPage {
wfMessage( 'config-install-done',
$lsUrl,
$this->getVar( 'wgServer' ) .
- $this->getVar( 'wgScriptPath' ) . '/index' .
- $this->getVar( 'wgScriptExtension' ),
+ $this->getVar( 'wgScriptPath' ) . '/index' .
+ $this->getVar( 'wgScriptExtension' ),
'<downloadlink/>'
)->plain(), 'tick-32.png'
)
);
+ $this->addHTML( $this->parent->getInfoBox(
+ wfMessage( 'config-extension-link' )->text() ) );
+
$this->parent->restoreLinkPopups();
$this->endForm( false, false );
}
@@ -1261,6 +1336,7 @@ class WebInstaller_Restart extends WebInstallerPage {
if ( $really ) {
$this->parent->reset();
}
+
return 'continue';
}
@@ -1269,14 +1345,13 @@ class WebInstaller_Restart extends WebInstallerPage {
$this->addHTML( $s );
$this->endForm( 'restart' );
}
-
}
abstract class WebInstaller_Document extends WebInstallerPage {
abstract protected function getFileName();
- public function execute() {
+ public function execute() {
$text = $this->getFileContents();
$text = InstallDocFormatter::format( $text );
$this->parent->output->addWikiText( $text );
@@ -1286,23 +1361,25 @@ abstract class WebInstaller_Document extends WebInstallerPage {
public function getFileContents() {
$file = __DIR__ . '/../../' . $this->getFileName();
- if( ! file_exists( $file ) ) {
+ if ( !file_exists( $file ) ) {
return wfMessage( 'config-nofile', $file )->plain();
}
+
return file_get_contents( $file );
}
-
}
class WebInstaller_Readme extends WebInstaller_Document {
- protected function getFileName() { return 'README'; }
+ protected function getFileName() {
+ return 'README';
+ }
}
class WebInstaller_ReleaseNotes extends WebInstaller_Document {
protected function getFileName() {
global $wgVersion;
- if( !preg_match( '/^(\d+)\.(\d+).*/i', $wgVersion, $result ) ) {
+ if ( !preg_match( '/^(\d+)\.(\d+).*/i', $wgVersion, $result ) ) {
throw new MWException( 'Variable $wgVersion has an invalid value.' );
}
@@ -1311,9 +1388,13 @@ class WebInstaller_ReleaseNotes extends WebInstaller_Document {
}
class WebInstaller_UpgradeDoc extends WebInstaller_Document {
- protected function getFileName() { return 'UPGRADE'; }
+ protected function getFileName() {
+ return 'UPGRADE';
+ }
}
class WebInstaller_Copying extends WebInstaller_Document {
- protected function getFileName() { return 'COPYING'; }
+ protected function getFileName() {
+ return 'COPYING';
+ }
}
diff --git a/includes/job/Job.php b/includes/job/Job.php
index bcf582e7..ab7df5d2 100644
--- a/includes/job/Job.php
+++ b/includes/job/Job.php
@@ -68,7 +68,7 @@ abstract class Job {
*/
public static function factory( $command, Title $title, $params = false, $id = 0 ) {
global $wgJobClasses;
- if( isset( $wgJobClasses[$command] ) ) {
+ if ( isset( $wgJobClasses[$command] ) ) {
$class = $wgJobClasses[$command];
return new $class( $title, $params, $id );
}
@@ -84,7 +84,7 @@ abstract class Job {
*
* @param array $jobs of Job objects
* @return bool
- * @deprecated 1.21
+ * @deprecated since 1.21
*/
public static function batchInsert( $jobs ) {
return JobQueueGroup::singleton()->push( $jobs );
@@ -99,10 +99,10 @@ abstract class Job {
*
* @param array $jobs of Job objects
* @return bool
- * @deprecated 1.21
+ * @deprecated since 1.21
*/
public static function safeBatchInsert( $jobs ) {
- return JobQueueGroup::singleton()->push( $jobs, JobQueue::QoS_Atomic );
+ return JobQueueGroup::singleton()->push( $jobs, JobQueue::QOS_ATOMIC );
}
/**
@@ -112,7 +112,7 @@ abstract class Job {
*
* @param $type string
* @return Job|bool Returns false if there are no jobs
- * @deprecated 1.21
+ * @deprecated since 1.21
*/
public static function pop_type( $type ) {
return JobQueueGroup::singleton()->get( $type )->pop();
@@ -123,7 +123,7 @@ abstract class Job {
* This is subject to $wgJobTypesExcludedFromDefaultQueue.
*
* @return Job or false if there's no jobs
- * @deprecated 1.21
+ * @deprecated since 1.21
*/
public static function pop() {
return JobQueueGroup::singleton()->pop();
@@ -150,6 +150,7 @@ abstract class Job {
/**
* @return integer May be 0 for jobs stored outside the DB
+ * @deprecated since 1.22
*/
public function getId() {
return $this->id;
@@ -177,6 +178,16 @@ abstract class Job {
}
/**
+ * @return integer|null UNIX timestamp to delay running this job until, otherwise null
+ * @since 1.22
+ */
+ public function getReleaseTimestamp() {
+ return isset( $this->params['jobReleaseTimestamp'] )
+ ? wfTimestampOrNull( TS_UNIX, $this->params['jobReleaseTimestamp'] )
+ : null;
+ }
+
+ /**
* @return bool Whether only one of each identical set of jobs should be run
*/
public function ignoreDuplicates() {
@@ -185,34 +196,43 @@ abstract class Job {
/**
* @return bool Whether this job can be retried on failure by job runners
+ * @since 1.21
*/
public function allowRetries() {
return true;
}
/**
- * Subclasses may need to override this to make duplication detection work
+ * Subclasses may need to override this to make duplication detection work.
+ * The resulting map conveys everything that makes the job unique. This is
+ * only checked if ignoreDuplicates() returns true, meaning that duplicate
+ * jobs are supposed to be ignored.
*
* @return Array Map of key/values
+ * @since 1.21
*/
public function getDeduplicationInfo() {
$info = array(
- 'type' => $this->getType(),
+ 'type' => $this->getType(),
'namespace' => $this->getTitle()->getNamespace(),
- 'title' => $this->getTitle()->getDBkey(),
- 'params' => $this->getParams()
+ 'title' => $this->getTitle()->getDBkey(),
+ 'params' => $this->getParams()
);
- // Identical jobs with different "root" jobs should count as duplicates
if ( is_array( $info['params'] ) ) {
+ // Identical jobs with different "root" jobs should count as duplicates
unset( $info['params']['rootJobSignature'] );
unset( $info['params']['rootJobTimestamp'] );
+ // Likewise for jobs with different delay times
+ unset( $info['params']['jobReleaseTimestamp'] );
}
return $info;
}
/**
+ * @see JobQueue::deduplicateRootJob()
* @param string $key A key that identifies the task
* @return Array
+ * @since 1.21
*/
public static function newRootJobParams( $key ) {
return array(
@@ -222,7 +242,9 @@ abstract class Job {
}
/**
+ * @see JobQueue::deduplicateRootJob()
* @return Array
+ * @since 1.21
*/
public function getRootJobParams() {
return array(
@@ -236,9 +258,19 @@ abstract class Job {
}
/**
+ * @see JobQueue::deduplicateRootJob()
+ * @return bool
+ * @since 1.22
+ */
+ public function hasRootJobParams() {
+ return isset( $this->params['rootJobSignature'] )
+ && isset( $this->params['rootJobTimestamp'] );
+ }
+
+ /**
* Insert a single job into the queue.
* @return bool true on success
- * @deprecated 1.21
+ * @deprecated since 1.21
*/
public function insert() {
return JobQueueGroup::singleton()->push( $this );
diff --git a/includes/job/JobQueue.php b/includes/job/JobQueue.php
index b0dd9258..6556ee85 100644
--- a/includes/job/JobQueue.php
+++ b/includes/job/JobQueue.php
@@ -34,8 +34,14 @@ abstract class JobQueue {
protected $order; // string; job priority for pop()
protected $claimTTL; // integer; seconds
protected $maxTries; // integer; maximum number of times to try a job
+ protected $checkDelay; // boolean; allow delayed jobs
- const QoS_Atomic = 1; // integer; "all-or-nothing" job insertions
+ /** @var BagOStuff */
+ protected $dupCache;
+
+ const QOS_ATOMIC = 1; // integer; "all-or-nothing" job insertions
+
+ const ROOTJOB_TTL = 2419200; // integer; seconds to remember root jobs (28 days)
/**
* @param $params array
@@ -53,28 +59,37 @@ abstract class JobQueue {
if ( !in_array( $this->order, $this->supportedOrders() ) ) {
throw new MWException( __CLASS__ . " does not support '{$this->order}' order." );
}
+ $this->checkDelay = !empty( $params['checkDelay'] );
+ if ( $this->checkDelay && !$this->supportsDelayedJobs() ) {
+ throw new MWException( __CLASS__ . " does not support delayed jobs." );
+ }
+ $this->dupCache = wfGetCache( CACHE_ANYTHING );
}
/**
* Get a job queue object of the specified type.
* $params includes:
- * - class : What job class to use (determines job type)
- * - wiki : wiki ID of the wiki the jobs are for (defaults to current wiki)
- * - type : The name of the job types this queue handles
- * - order : Order that pop() selects jobs, one of "fifo", "timestamp" or "random".
- * If "fifo" is used, the queue will effectively be FIFO. Note that
- * job completion will not appear to be exactly FIFO if there are multiple
- * job runners since jobs can take different times to finish once popped.
- * If "timestamp" is used, the queue will at least be loosely ordered
- * by timestamp, allowing for some jobs to be popped off out of order.
- * If "random" is used, pop() will pick jobs in random order.
- * Note that it may only be weakly random (e.g. a lottery of the oldest X).
- * If "any" is choosen, the queue will use whatever order is the fastest.
- * This might be useful for improving concurrency for job acquisition.
- * - claimTTL : If supported, the queue will recycle jobs that have been popped
- * but not acknowledged as completed after this many seconds. Recycling
- * of jobs simple means re-inserting them into the queue. Jobs can be
- * attempted up to three times before being discarded.
+ * - class : What job class to use (determines job type)
+ * - wiki : wiki ID of the wiki the jobs are for (defaults to current wiki)
+ * - type : The name of the job types this queue handles
+ * - order : Order that pop() selects jobs, one of "fifo", "timestamp" or "random".
+ * If "fifo" is used, the queue will effectively be FIFO. Note that job
+ * completion will not appear to be exactly FIFO if there are multiple
+ * job runners since jobs can take different times to finish once popped.
+ * If "timestamp" is used, the queue will at least be loosely ordered
+ * by timestamp, allowing for some jobs to be popped off out of order.
+ * If "random" is used, pop() will pick jobs in random order.
+ * Note that it may only be weakly random (e.g. a lottery of the oldest X).
+ * If "any" is choosen, the queue will use whatever order is the fastest.
+ * This might be useful for improving concurrency for job acquisition.
+ * - claimTTL : If supported, the queue will recycle jobs that have been popped
+ * but not acknowledged as completed after this many seconds. Recycling
+ * of jobs simple means re-inserting them into the queue. Jobs can be
+ * attempted up to three times before being discarded.
+ * - checkDelay : If supported, respect Job::getReleaseTimestamp() in the push functions.
+ * This lets delayed jobs wait in a staging area until a given timestamp is
+ * reached, at which point they will enter the queue. If this is not enabled
+ * or not supported, an exception will be thrown on delayed job insertion.
*
* Queue classes should throw an exception if they do not support the options given.
*
@@ -84,7 +99,7 @@ abstract class JobQueue {
*/
final public static function factory( array $params ) {
$class = $params['class'];
- if ( !MWInit::classExists( $class ) ) {
+ if ( !class_exists( $class ) ) {
throw new MWException( "Invalid job queue class '$class'." );
}
$obj = new $class( $params );
@@ -109,24 +124,45 @@ abstract class JobQueue {
}
/**
- * @return string One of (random, timestamp, fifo)
+ * @return string One of (random, timestamp, fifo, undefined)
*/
final public function getOrder() {
return $this->order;
}
/**
- * @return Array Subset of (random, timestamp, fifo)
+ * @return bool Whether delayed jobs are enabled
+ * @since 1.22
+ */
+ final public function delayedJobsEnabled() {
+ return $this->checkDelay;
+ }
+
+ /**
+ * Get the allowed queue orders for configuration validation
+ *
+ * @return Array Subset of (random, timestamp, fifo, undefined)
*/
abstract protected function supportedOrders();
/**
- * @return string One of (random, timestamp, fifo)
+ * Get the default queue order to use if configuration does not specify one
+ *
+ * @return string One of (random, timestamp, fifo, undefined)
*/
abstract protected function optimalOrder();
/**
- * Quickly check if the queue is empty (has no available jobs).
+ * Find out if delayed jobs are supported for configuration validation
+ *
+ * @return boolean Whether delayed jobs are supported
+ */
+ protected function supportsDelayedJobs() {
+ return false; // not implemented
+ }
+
+ /**
+ * Quickly check if the queue has no available (unacquired, non-delayed) jobs.
* Queue classes should use caching if they are any slower without memcached.
*
* If caching is used, this might return false when there are actually no jobs.
@@ -135,7 +171,7 @@ abstract class JobQueue {
* not distinguishable from the race condition between isEmpty() and pop().
*
* @return bool
- * @throws MWException
+ * @throws JobQueueError
*/
final public function isEmpty() {
wfProfileIn( __METHOD__ );
@@ -151,13 +187,13 @@ abstract class JobQueue {
abstract protected function doIsEmpty();
/**
- * Get the number of available (unacquired) jobs in the queue.
+ * Get the number of available (unacquired, non-delayed) jobs in the queue.
* Queue classes should use caching if they are any slower without memcached.
*
* If caching is used, this number might be out of date for a minute.
*
* @return integer
- * @throws MWException
+ * @throws JobQueueError
*/
final public function getSize() {
wfProfileIn( __METHOD__ );
@@ -179,7 +215,7 @@ abstract class JobQueue {
* If caching is used, this number might be out of date for a minute.
*
* @return integer
- * @throws MWException
+ * @throws JobQueueError
*/
final public function getAcquiredCount() {
wfProfileIn( __METHOD__ );
@@ -195,14 +231,63 @@ abstract class JobQueue {
abstract protected function doGetAcquiredCount();
/**
+ * Get the number of delayed jobs (these are temporarily out of the queue).
+ * Queue classes should use caching if they are any slower without memcached.
+ *
+ * If caching is used, this number might be out of date for a minute.
+ *
+ * @return integer
+ * @throws JobQueueError
+ * @since 1.22
+ */
+ final public function getDelayedCount() {
+ wfProfileIn( __METHOD__ );
+ $res = $this->doGetDelayedCount();
+ wfProfileOut( __METHOD__ );
+ return $res;
+ }
+
+ /**
+ * @see JobQueue::getDelayedCount()
+ * @return integer
+ */
+ protected function doGetDelayedCount() {
+ return 0; // not implemented
+ }
+
+ /**
+ * Get the number of acquired jobs that can no longer be attempted.
+ * Queue classes should use caching if they are any slower without memcached.
+ *
+ * If caching is used, this number might be out of date for a minute.
+ *
+ * @return integer
+ * @throws JobQueueError
+ */
+ final public function getAbandonedCount() {
+ wfProfileIn( __METHOD__ );
+ $res = $this->doGetAbandonedCount();
+ wfProfileOut( __METHOD__ );
+ return $res;
+ }
+
+ /**
+ * @see JobQueue::getAbandonedCount()
+ * @return integer
+ */
+ protected function doGetAbandonedCount() {
+ return 0; // not implemented
+ }
+
+ /**
* Push a single jobs into the queue.
* This does not require $wgJobClasses to be set for the given job type.
* Outside callers should use JobQueueGroup::push() instead of this function.
*
* @param $jobs Job|Array
- * @param $flags integer Bitfield (supports JobQueue::QoS_Atomic)
+ * @param $flags integer Bitfield (supports JobQueue::QOS_ATOMIC)
* @return bool Returns false on failure
- * @throws MWException
+ * @throws JobQueueError
*/
final public function push( $jobs, $flags = 0 ) {
return $this->batchPush( is_array( $jobs ) ? $jobs : array( $jobs ), $flags );
@@ -214,9 +299,9 @@ abstract class JobQueue {
* Outside callers should use JobQueueGroup::push() instead of this function.
*
* @param array $jobs List of Jobs
- * @param $flags integer Bitfield (supports JobQueue::QoS_Atomic)
+ * @param $flags integer Bitfield (supports JobQueue::QOS_ATOMIC)
* @return bool Returns false on failure
- * @throws MWException
+ * @throws JobQueueError
*/
final public function batchPush( array $jobs, $flags = 0 ) {
if ( !count( $jobs ) ) {
@@ -225,7 +310,11 @@ abstract class JobQueue {
foreach ( $jobs as $job ) {
if ( $job->getType() !== $this->type ) {
- throw new MWException( "Got '{$job->getType()}' job; expected '{$this->type}'." );
+ throw new MWException(
+ "Got '{$job->getType()}' job; expected a '{$this->type}' job." );
+ } elseif ( $job->getReleaseTimestamp() && !$this->checkDelay ) {
+ throw new MWException(
+ "Got delayed '{$job->getType()}' job; delays are not supported." );
}
}
@@ -247,7 +336,7 @@ abstract class JobQueue {
* Outside callers should use JobQueueGroup::pop() instead of this function.
*
* @return Job|bool Returns false if there are no jobs
- * @throws MWException
+ * @throws JobQueueError
*/
final public function pop() {
global $wgJobClasses;
@@ -262,6 +351,15 @@ abstract class JobQueue {
wfProfileIn( __METHOD__ );
$job = $this->doPop();
wfProfileOut( __METHOD__ );
+
+ // Flag this job as an old duplicate based on its "root" job...
+ try {
+ if ( $job && $this->isRootJobOldDuplicate( $job ) ) {
+ JobQueue::incrStats( 'job-pop-duplicate', $this->type );
+ $job = DuplicateJob::newFromJob( $job ); // convert to a no-op
+ }
+ } catch ( MWException $e ) {} // don't lose jobs over this
+
return $job;
}
@@ -279,7 +377,7 @@ abstract class JobQueue {
*
* @param $job Job
* @return bool
- * @throws MWException
+ * @throws JobQueueError
*/
final public function ack( Job $job ) {
if ( $job->getType() !== $this->type ) {
@@ -326,7 +424,7 @@ abstract class JobQueue {
*
* @param $job Job
* @return bool
- * @throws MWException
+ * @throws JobQueueError
*/
final public function deduplicateRootJob( Job $job ) {
if ( $job->getType() !== $this->type ) {
@@ -344,7 +442,91 @@ abstract class JobQueue {
* @return bool
*/
protected function doDeduplicateRootJob( Job $job ) {
- return true;
+ if ( !$job->hasRootJobParams() ) {
+ throw new MWException( "Cannot register root job; missing parameters." );
+ }
+ $params = $job->getRootJobParams();
+
+ $key = $this->getRootJobCacheKey( $params['rootJobSignature'] );
+ // Callers should call batchInsert() and then this function so that if the insert
+ // fails, the de-duplication registration will be aborted. Since the insert is
+ // deferred till "transaction idle", do the same here, so that the ordering is
+ // maintained. Having only the de-duplication registration succeed would cause
+ // jobs to become no-ops without any actual jobs that made them redundant.
+ $timestamp = $this->dupCache->get( $key ); // current last timestamp of this job
+ if ( $timestamp && $timestamp >= $params['rootJobTimestamp'] ) {
+ return true; // a newer version of this root job was enqueued
+ }
+
+ // Update the timestamp of the last root job started at the location...
+ return $this->dupCache->set( $key, $params['rootJobTimestamp'], JobQueueDB::ROOTJOB_TTL );
+ }
+
+ /**
+ * Check if the "root" job of a given job has been superseded by a newer one
+ *
+ * @param $job Job
+ * @return bool
+ * @throws JobQueueError
+ */
+ final protected function isRootJobOldDuplicate( Job $job ) {
+ if ( $job->getType() !== $this->type ) {
+ throw new MWException( "Got '{$job->getType()}' job; expected '{$this->type}'." );
+ }
+ wfProfileIn( __METHOD__ );
+ $isDuplicate = $this->doIsRootJobOldDuplicate( $job );
+ wfProfileOut( __METHOD__ );
+ return $isDuplicate;
+ }
+
+ /**
+ * @see JobQueue::isRootJobOldDuplicate()
+ * @param Job $job
+ * @return bool
+ */
+ protected function doIsRootJobOldDuplicate( Job $job ) {
+ if ( !$job->hasRootJobParams() ) {
+ return false; // job has no de-deplication info
+ }
+ $params = $job->getRootJobParams();
+
+ $key = $this->getRootJobCacheKey( $params['rootJobSignature'] );
+ // Get the last time this root job was enqueued
+ $timestamp = $this->dupCache->get( $key );
+
+ // Check if a new root job was started at the location after this one's...
+ return ( $timestamp && $timestamp > $params['rootJobTimestamp'] );
+ }
+
+ /**
+ * @param string $signature Hash identifier of the root job
+ * @return string
+ */
+ protected function getRootJobCacheKey( $signature ) {
+ list( $db, $prefix ) = wfSplitWikiID( $this->wiki );
+ return wfForeignMemcKey( $db, $prefix, 'jobqueue', $this->type, 'rootjob', $signature );
+ }
+
+ /**
+ * Deleted all unclaimed and delayed jobs from the queue
+ *
+ * @return bool Success
+ * @throws JobQueueError
+ * @since 1.22
+ */
+ final public function delete() {
+ wfProfileIn( __METHOD__ );
+ $res = $this->doDelete();
+ wfProfileOut( __METHOD__ );
+ return $res;
+ }
+
+ /**
+ * @see JobQueue::delete()
+ * @return bool Success
+ */
+ protected function doDelete() {
+ throw new MWException( "This method is not implemented." );
}
/**
@@ -353,7 +535,7 @@ abstract class JobQueue {
* This does nothing for certain queue classes.
*
* @return void
- * @throws MWException
+ * @throws JobQueueError
*/
final public function waitForBackups() {
wfProfileIn( __METHOD__ );
@@ -413,16 +595,98 @@ abstract class JobQueue {
protected function doFlushCaches() {}
/**
- * Get an iterator to traverse over all of the jobs in this queue.
- * This does not include jobs that are current acquired. In general,
- * this should only be called on a queue that is no longer being popped.
+ * Get an iterator to traverse over all available jobs in this queue.
+ * This does not include jobs that are currently acquired or delayed.
+ * Note: results may be stale if the queue is concurrently modified.
*
- * @return Iterator|Traversable|Array
- * @throws MWException
+ * @return Iterator
+ * @throws JobQueueError
*/
abstract public function getAllQueuedJobs();
/**
+ * Get an iterator to traverse over all delayed jobs in this queue.
+ * Note: results may be stale if the queue is concurrently modified.
+ *
+ * @return Iterator
+ * @throws JobQueueError
+ * @since 1.22
+ */
+ public function getAllDelayedJobs() {
+ return new ArrayIterator( array() ); // not implemented
+ }
+
+ /**
+ * Do not use this function outside of JobQueue/JobQueueGroup
+ *
+ * @return string
+ * @since 1.22
+ */
+ public function getCoalesceLocationInternal() {
+ return null;
+ }
+
+ /**
+ * Check whether each of the given queues are empty.
+ * This is used for batching checks for queues stored at the same place.
+ *
+ * @param array $types List of queues types
+ * @return array|null (list of non-empty queue types) or null if unsupported
+ * @throws MWException
+ * @since 1.22
+ */
+ final public function getSiblingQueuesWithJobs( array $types ) {
+ $section = new ProfileSection( __METHOD__ );
+ return $this->doGetSiblingQueuesWithJobs( $types );
+ }
+
+ /**
+ * @see JobQueue::getSiblingQueuesWithJobs()
+ * @param array $types List of queues types
+ * @return array|null (list of queue types) or null if unsupported
+ */
+ protected function doGetSiblingQueuesWithJobs( array $types ) {
+ return null; // not supported
+ }
+
+ /**
+ * Check the size of each of the given queues.
+ * For queues not served by the same store as this one, 0 is returned.
+ * This is used for batching checks for queues stored at the same place.
+ *
+ * @param array $types List of queues types
+ * @return array|null (job type => whether queue is empty) or null if unsupported
+ * @throws MWException
+ * @since 1.22
+ */
+ final public function getSiblingQueueSizes( array $types ) {
+ $section = new ProfileSection( __METHOD__ );
+ return $this->doGetSiblingQueueSizes( $types );
+ }
+
+ /**
+ * @see JobQueue::getSiblingQueuesSize()
+ * @param array $types List of queues types
+ * @return array|null (list of queue types) or null if unsupported
+ */
+ protected function doGetSiblingQueueSizes( array $types ) {
+ return null; // not supported
+ }
+
+ /**
+ * Call wfIncrStats() for the queue overall and for the queue type
+ *
+ * @param string $key Event type
+ * @param string $type Job type
+ * @param integer $delta
+ * @since 1.22
+ */
+ public static function incrStats( $key, $type, $delta = 1 ) {
+ wfIncrStats( $key, $delta );
+ wfIncrStats( "{$key}-{$type}", $delta );
+ }
+
+ /**
* Namespace the queue with a key to isolate it for testing
*
* @param $key string
@@ -433,3 +697,10 @@ abstract class JobQueue {
throw new MWException( "Queue namespacing not supported for this queue type." );
}
}
+
+/**
+ * @ingroup JobQueue
+ * @since 1.22
+ */
+class JobQueueError extends MWException {}
+class JobQueueConnectionError extends JobQueueError {}
diff --git a/includes/job/JobQueueDB.php b/includes/job/JobQueueDB.php
index ff7f7abc..c39083df 100644
--- a/includes/job/JobQueueDB.php
+++ b/includes/job/JobQueueDB.php
@@ -28,13 +28,15 @@
* @since 1.21
*/
class JobQueueDB extends JobQueue {
- const ROOTJOB_TTL = 1209600; // integer; seconds to remember root jobs (14 days)
const CACHE_TTL_SHORT = 30; // integer; seconds to cache info without re-validating
const CACHE_TTL_LONG = 300; // integer; seconds to cache info that is kept up to date
const MAX_AGE_PRUNE = 604800; // integer; seconds a job can live once claimed
const MAX_JOB_RANDOM = 2147483647; // integer; 2^31 - 1, used for job_random
const MAX_OFFSET = 255; // integer; maximum number of rows to skip
+ /** @var BagOStuff */
+ protected $cache;
+
protected $cluster = false; // string; name of an external DB cluster
/**
@@ -46,8 +48,13 @@ class JobQueueDB extends JobQueue {
* @param $params array
*/
protected function __construct( array $params ) {
+ global $wgMemc;
+
parent::__construct( $params );
+
$this->cluster = isset( $params['cluster'] ) ? $params['cluster'] : false;
+ // Make sure that we don't use the SQL cache, which would be harmful
+ $this->cache = ( $wgMemc instanceof SqlBagOStuff ) ? new EmptyBagOStuff() : $wgMemc;
}
protected function supportedOrders() {
@@ -63,22 +70,24 @@ class JobQueueDB extends JobQueue {
* @return bool
*/
protected function doIsEmpty() {
- global $wgMemc;
-
$key = $this->getCacheKey( 'empty' );
- $isEmpty = $wgMemc->get( $key );
+ $isEmpty = $this->cache->get( $key );
if ( $isEmpty === 'true' ) {
return true;
} elseif ( $isEmpty === 'false' ) {
return false;
}
- list( $dbr, $scope ) = $this->getSlaveDB();
- $found = $dbr->selectField( // unclaimed job
- 'job', '1', array( 'job_cmd' => $this->type, 'job_token' => '' ), __METHOD__
- );
- $wgMemc->add( $key, $found ? 'false' : 'true', self::CACHE_TTL_LONG );
+ $dbr = $this->getSlaveDB();
+ try {
+ $found = $dbr->selectField( // unclaimed job
+ 'job', '1', array( 'job_cmd' => $this->type, 'job_token' => '' ), __METHOD__
+ );
+ } catch ( DBError $e ) {
+ $this->throwDBException( $e );
+ }
+ $this->cache->add( $key, $found ? 'false' : 'true', self::CACHE_TTL_LONG );
return !$found;
}
@@ -88,21 +97,23 @@ class JobQueueDB extends JobQueue {
* @return integer
*/
protected function doGetSize() {
- global $wgMemc;
-
$key = $this->getCacheKey( 'size' );
- $size = $wgMemc->get( $key );
+ $size = $this->cache->get( $key );
if ( is_int( $size ) ) {
return $size;
}
- list( $dbr, $scope ) = $this->getSlaveDB();
- $size = (int)$dbr->selectField( 'job', 'COUNT(*)',
- array( 'job_cmd' => $this->type, 'job_token' => '' ),
- __METHOD__
- );
- $wgMemc->set( $key, $size, self::CACHE_TTL_SHORT );
+ try {
+ $dbr = $this->getSlaveDB();
+ $size = (int)$dbr->selectField( 'job', 'COUNT(*)',
+ array( 'job_cmd' => $this->type, 'job_token' => '' ),
+ __METHOD__
+ );
+ } catch ( DBError $e ) {
+ $this->throwDBException( $e );
+ }
+ $this->cache->set( $key, $size, self::CACHE_TTL_SHORT );
return $size;
}
@@ -112,24 +123,63 @@ class JobQueueDB extends JobQueue {
* @return integer
*/
protected function doGetAcquiredCount() {
+ if ( $this->claimTTL <= 0 ) {
+ return 0; // no acknowledgements
+ }
+
+ $key = $this->getCacheKey( 'acquiredcount' );
+
+ $count = $this->cache->get( $key );
+ if ( is_int( $count ) ) {
+ return $count;
+ }
+
+ $dbr = $this->getSlaveDB();
+ try {
+ $count = (int)$dbr->selectField( 'job', 'COUNT(*)',
+ array( 'job_cmd' => $this->type, "job_token != {$dbr->addQuotes( '' )}" ),
+ __METHOD__
+ );
+ } catch ( DBError $e ) {
+ $this->throwDBException( $e );
+ }
+ $this->cache->set( $key, $count, self::CACHE_TTL_SHORT );
+
+ return $count;
+ }
+
+ /**
+ * @see JobQueue::doGetAbandonedCount()
+ * @return integer
+ * @throws MWException
+ */
+ protected function doGetAbandonedCount() {
global $wgMemc;
if ( $this->claimTTL <= 0 ) {
return 0; // no acknowledgements
}
- $key = $this->getCacheKey( 'acquiredcount' );
+ $key = $this->getCacheKey( 'abandonedcount' );
$count = $wgMemc->get( $key );
if ( is_int( $count ) ) {
return $count;
}
- list( $dbr, $scope ) = $this->getSlaveDB();
- $count = (int)$dbr->selectField( 'job', 'COUNT(*)',
- array( 'job_cmd' => $this->type, "job_token != {$dbr->addQuotes( '' )}" ),
- __METHOD__
- );
+ $dbr = $this->getSlaveDB();
+ try {
+ $count = (int)$dbr->selectField( 'job', 'COUNT(*)',
+ array(
+ 'job_cmd' => $this->type,
+ "job_token != {$dbr->addQuotes( '' )}",
+ "job_attempts >= " . $dbr->addQuotes( $this->maxTries )
+ ),
+ __METHOD__
+ );
+ } catch ( DBError $e ) {
+ $this->throwDBException( $e );
+ }
$wgMemc->set( $key, $count, self::CACHE_TTL_SHORT );
return $count;
@@ -143,70 +193,84 @@ class JobQueueDB extends JobQueue {
* @return bool
*/
protected function doBatchPush( array $jobs, $flags ) {
- if ( count( $jobs ) ) {
- list( $dbw, $scope ) = $this->getMasterDB();
-
- $rowSet = array(); // (sha1 => job) map for jobs that are de-duplicated
- $rowList = array(); // list of jobs for jobs that are are not de-duplicated
-
- foreach ( $jobs as $job ) {
- $row = $this->insertFields( $job );
- if ( $job->ignoreDuplicates() ) {
- $rowSet[$row['job_sha1']] = $row;
- } else {
- $rowList[] = $row;
- }
+ $dbw = $this->getMasterDB();
+
+ $that = $this;
+ $method = __METHOD__;
+ $dbw->onTransactionIdle(
+ function() use ( $dbw, $that, $jobs, $flags, $method ) {
+ $that->doBatchPushInternal( $dbw, $jobs, $flags, $method );
}
+ );
- $key = $this->getCacheKey( 'empty' );
- $atomic = ( $flags & self::QoS_Atomic );
+ return true;
+ }
- $dbw->onTransactionIdle(
- function() use ( $dbw, $rowSet, $rowList, $atomic, $key, $scope
- ) {
- global $wgMemc;
+ /**
+ * This function should *not* be called outside of JobQueueDB
+ *
+ * @param DatabaseBase $dbw
+ * @param array $jobs
+ * @param int $flags
+ * @param string $method
+ * @return boolean
+ * @throws type
+ */
+ public function doBatchPushInternal( IDatabase $dbw, array $jobs, $flags, $method ) {
+ if ( !count( $jobs ) ) {
+ return true;
+ }
- if ( $atomic ) {
- $dbw->begin( __METHOD__ ); // wrap all the job additions in one transaction
- }
- try {
- // Strip out any duplicate jobs that are already in the queue...
- if ( count( $rowSet ) ) {
- $res = $dbw->select( 'job', 'job_sha1',
- array(
- // No job_type condition since it's part of the job_sha1 hash
- 'job_sha1' => array_keys( $rowSet ),
- 'job_token' => '' // unclaimed
- ),
- __METHOD__
- );
- foreach ( $res as $row ) {
- wfDebug( "Job with hash '{$row->job_sha1}' is a duplicate." );
- unset( $rowSet[$row->job_sha1] ); // already enqueued
- }
- }
- // Build the full list of job rows to insert
- $rows = array_merge( $rowList, array_values( $rowSet ) );
- // Insert the job rows in chunks to avoid slave lag...
- foreach ( array_chunk( $rows, 50 ) as $rowBatch ) {
- $dbw->insert( 'job', $rowBatch, __METHOD__ );
- }
- wfIncrStats( 'job-insert', count( $rows ) );
- wfIncrStats( 'job-insert-duplicate',
- count( $rowSet ) + count( $rowList ) - count( $rows ) );
- } catch ( DBError $e ) {
- if ( $atomic ) {
- $dbw->rollback( __METHOD__ );
- }
- throw $e;
- }
- if ( $atomic ) {
- $dbw->commit( __METHOD__ );
- }
+ $rowSet = array(); // (sha1 => job) map for jobs that are de-duplicated
+ $rowList = array(); // list of jobs for jobs that are are not de-duplicated
+ foreach ( $jobs as $job ) {
+ $row = $this->insertFields( $job );
+ if ( $job->ignoreDuplicates() ) {
+ $rowSet[$row['job_sha1']] = $row;
+ } else {
+ $rowList[] = $row;
+ }
+ }
- $wgMemc->set( $key, 'false', JobQueueDB::CACHE_TTL_LONG );
- } );
+ if ( $flags & self::QOS_ATOMIC ) {
+ $dbw->begin( $method ); // wrap all the job additions in one transaction
+ }
+ try {
+ // Strip out any duplicate jobs that are already in the queue...
+ if ( count( $rowSet ) ) {
+ $res = $dbw->select( 'job', 'job_sha1',
+ array(
+ // No job_type condition since it's part of the job_sha1 hash
+ 'job_sha1' => array_keys( $rowSet ),
+ 'job_token' => '' // unclaimed
+ ),
+ $method
+ );
+ foreach ( $res as $row ) {
+ wfDebug( "Job with hash '{$row->job_sha1}' is a duplicate.\n" );
+ unset( $rowSet[$row->job_sha1] ); // already enqueued
+ }
+ }
+ // Build the full list of job rows to insert
+ $rows = array_merge( $rowList, array_values( $rowSet ) );
+ // Insert the job rows in chunks to avoid slave lag...
+ foreach ( array_chunk( $rows, 50 ) as $rowBatch ) {
+ $dbw->insert( 'job', $rowBatch, $method );
+ }
+ JobQueue::incrStats( 'job-insert', $this->type, count( $rows ) );
+ JobQueue::incrStats( 'job-insert-duplicate', $this->type,
+ count( $rowSet ) + count( $rowList ) - count( $rows ) );
+ } catch ( DBError $e ) {
+ if ( $flags & self::QOS_ATOMIC ) {
+ $dbw->rollback( $method );
+ }
+ throw $e;
}
+ if ( $flags & self::QOS_ATOMIC ) {
+ $dbw->commit( $method );
+ }
+
+ $this->cache->set( $this->getCacheKey( 'empty' ), 'false', JobQueueDB::CACHE_TTL_LONG );
return true;
}
@@ -216,54 +280,52 @@ class JobQueueDB extends JobQueue {
* @return Job|bool
*/
protected function doPop() {
- global $wgMemc;
-
- if ( $wgMemc->get( $this->getCacheKey( 'empty' ) ) === 'true' ) {
+ if ( $this->cache->get( $this->getCacheKey( 'empty' ) ) === 'true' ) {
return false; // queue is empty
}
- list( $dbw, $scope ) = $this->getMasterDB();
- $dbw->commit( __METHOD__, 'flush' ); // flush existing transaction
- $autoTrx = $dbw->getFlag( DBO_TRX ); // get current setting
- $dbw->clearFlag( DBO_TRX ); // make each query its own transaction
- $scopedReset = new ScopedCallback( function() use ( $dbw, $autoTrx ) {
- $dbw->setFlag( $autoTrx ? DBO_TRX : 0 ); // restore old setting
- } );
+ $dbw = $this->getMasterDB();
+ try {
+ $dbw->commit( __METHOD__, 'flush' ); // flush existing transaction
+ $autoTrx = $dbw->getFlag( DBO_TRX ); // get current setting
+ $dbw->clearFlag( DBO_TRX ); // make each query its own transaction
+ $scopedReset = new ScopedCallback( function() use ( $dbw, $autoTrx ) {
+ $dbw->setFlag( $autoTrx ? DBO_TRX : 0 ); // restore old setting
+ } );
- $uuid = wfRandomString( 32 ); // pop attempt
- $job = false; // job popped off
- do { // retry when our row is invalid or deleted as a duplicate
- // Try to reserve a row in the DB...
- if ( in_array( $this->order, array( 'fifo', 'timestamp' ) ) ) {
- $row = $this->claimOldest( $uuid );
- } else { // random first
- $rand = mt_rand( 0, self::MAX_JOB_RANDOM ); // encourage concurrent UPDATEs
- $gte = (bool)mt_rand( 0, 1 ); // find rows with rand before/after $rand
- $row = $this->claimRandom( $uuid, $rand, $gte );
- }
- // Check if we found a row to reserve...
- if ( !$row ) {
- $wgMemc->set( $this->getCacheKey( 'empty' ), 'true', self::CACHE_TTL_LONG );
- break; // nothing to do
- }
- wfIncrStats( 'job-pop' );
- // Get the job object from the row...
- $title = Title::makeTitleSafe( $row->job_namespace, $row->job_title );
- if ( !$title ) {
- $dbw->delete( 'job', array( 'job_id' => $row->job_id ), __METHOD__ );
- wfDebugLog( 'JobQueueDB', "Row has invalid title '{$row->job_title}'." );
- continue; // try again
- }
- $job = Job::factory( $row->job_cmd, $title,
- self::extractBlob( $row->job_params ), $row->job_id );
- $job->id = $row->job_id; // XXX: work around broken subclasses
- // Flag this job as an old duplicate based on its "root" job...
- if ( $this->isRootJobOldDuplicate( $job ) ) {
- wfIncrStats( 'job-pop-duplicate' );
- $job = DuplicateJob::newFromJob( $job ); // convert to a no-op
- }
- break; // done
- } while( true );
+ $uuid = wfRandomString( 32 ); // pop attempt
+ $job = false; // job popped off
+ do { // retry when our row is invalid or deleted as a duplicate
+ // Try to reserve a row in the DB...
+ if ( in_array( $this->order, array( 'fifo', 'timestamp' ) ) ) {
+ $row = $this->claimOldest( $uuid );
+ } else { // random first
+ $rand = mt_rand( 0, self::MAX_JOB_RANDOM ); // encourage concurrent UPDATEs
+ $gte = (bool)mt_rand( 0, 1 ); // find rows with rand before/after $rand
+ $row = $this->claimRandom( $uuid, $rand, $gte );
+ }
+ // Check if we found a row to reserve...
+ if ( !$row ) {
+ $this->cache->set( $this->getCacheKey( 'empty' ), 'true', self::CACHE_TTL_LONG );
+ break; // nothing to do
+ }
+ JobQueue::incrStats( 'job-pop', $this->type );
+ // Get the job object from the row...
+ $title = Title::makeTitleSafe( $row->job_namespace, $row->job_title );
+ if ( !$title ) {
+ $dbw->delete( 'job', array( 'job_id' => $row->job_id ), __METHOD__ );
+ wfDebug( "Row has invalid title '{$row->job_title}'." );
+ continue; // try again
+ }
+ $job = Job::factory( $row->job_cmd, $title,
+ self::extractBlob( $row->job_params ), $row->job_id );
+ $job->metadata['id'] = $row->job_id;
+ $job->id = $row->job_id; // XXX: work around broken subclasses
+ break; // done
+ } while ( true );
+ } catch ( DBError $e ) {
+ $this->throwDBException( $e );
+ }
return $job;
}
@@ -277,11 +339,9 @@ class JobQueueDB extends JobQueue {
* @return Row|false
*/
protected function claimRandom( $uuid, $rand, $gte ) {
- global $wgMemc;
-
- list( $dbw, $scope ) = $this->getMasterDB();
+ $dbw = $this->getMasterDB();
// Check cache to see if the queue has <= OFFSET items
- $tinyQueue = $wgMemc->get( $this->getCacheKey( 'small' ) );
+ $tinyQueue = $this->cache->get( $this->getCacheKey( 'small' ) );
$row = false; // the row acquired
$invertedDirection = false; // whether one job_random direction was already scanned
@@ -297,7 +357,7 @@ class JobQueueDB extends JobQueue {
$dir = $gte ? 'ASC' : 'DESC';
$row = $dbw->selectRow( 'job', '*', // find a random job
array(
- 'job_cmd' => $this->type,
+ 'job_cmd' => $this->type,
'job_token' => '', // unclaimed
"job_random {$ineq} {$dbw->addQuotes( $rand )}" ),
__METHOD__,
@@ -314,7 +374,7 @@ class JobQueueDB extends JobQueue {
// instead of job_random for reducing excess claim retries.
$row = $dbw->selectRow( 'job', '*', // find a random job
array(
- 'job_cmd' => $this->type,
+ 'job_cmd' => $this->type,
'job_token' => '', // unclaimed
),
__METHOD__,
@@ -322,14 +382,14 @@ class JobQueueDB extends JobQueue {
);
if ( !$row ) {
$tinyQueue = true; // we know the queue must have <= MAX_OFFSET rows
- $wgMemc->set( $this->getCacheKey( 'small' ), 1, 30 );
+ $this->cache->set( $this->getCacheKey( 'small' ), 1, 30 );
continue; // use job_random
}
}
if ( $row ) { // claim the job
$dbw->update( 'job', // update by PK
array(
- 'job_token' => $uuid,
+ 'job_token' => $uuid,
'job_token_timestamp' => $dbw->timestamp(),
'job_attempts = job_attempts+1' ),
array( 'job_cmd' => $this->type, 'job_id' => $row->job_id, 'job_token' => '' ),
@@ -355,7 +415,7 @@ class JobQueueDB extends JobQueue {
* @return Row|false
*/
protected function claimOldest( $uuid ) {
- list( $dbw, $scope ) = $this->getMasterDB();
+ $dbw = $this->getMasterDB();
$row = false; // the row acquired
do {
@@ -380,7 +440,7 @@ class JobQueueDB extends JobQueue {
// This uses as much of the DB wrapper functions as possible.
$dbw->update( 'job',
array(
- 'job_token' => $uuid,
+ 'job_token' => $uuid,
'job_token_timestamp' => $dbw->timestamp(),
'job_attempts = job_attempts+1' ),
array( 'job_id = (' .
@@ -399,7 +459,7 @@ class JobQueueDB extends JobQueue {
array( 'job_cmd' => $this->type, 'job_token' => $uuid ), __METHOD__
);
if ( !$row ) { // raced out by duplicate job removal
- wfDebugLog( 'JobQueueDB', "Row deleted as duplicate by another process." );
+ wfDebug( "Row deleted as duplicate by another process." );
}
} else {
break; // nothing to do
@@ -410,100 +470,31 @@ class JobQueueDB extends JobQueue {
}
/**
- * Recycle or destroy any jobs that have been claimed for too long
- *
- * @return integer Number of jobs recycled/deleted
- */
- public function recycleAndDeleteStaleJobs() {
- global $wgMemc;
-
- $now = time();
- list( $dbw, $scope ) = $this->getMasterDB();
- $count = 0; // affected rows
-
- if ( !$dbw->lock( "jobqueue-recycle-{$this->type}", __METHOD__, 1 ) ) {
- return $count; // already in progress
- }
-
- // Remove claims on jobs acquired for too long if enabled...
- if ( $this->claimTTL > 0 ) {
- $claimCutoff = $dbw->timestamp( $now - $this->claimTTL );
- // Get the IDs of jobs that have be claimed but not finished after too long.
- // These jobs can be recycled into the queue by expiring the claim. Selecting
- // the IDs first means that the UPDATE can be done by primary key (less deadlocks).
- $res = $dbw->select( 'job', 'job_id',
- array(
- 'job_cmd' => $this->type,
- "job_token != {$dbw->addQuotes( '' )}", // was acquired
- "job_token_timestamp < {$dbw->addQuotes( $claimCutoff )}", // stale
- "job_attempts < {$dbw->addQuotes( $this->maxTries )}" ), // retries left
- __METHOD__
- );
- $ids = array_map( function( $o ) { return $o->job_id; }, iterator_to_array( $res ) );
- if ( count( $ids ) ) {
- // Reset job_token for these jobs so that other runners will pick them up.
- // Set the timestamp to the current time, as it is useful to now that the job
- // was already tried before (the timestamp becomes the "released" time).
- $dbw->update( 'job',
- array(
- 'job_token' => '',
- 'job_token_timestamp' => $dbw->timestamp( $now ) ), // time of release
- array(
- 'job_id' => $ids ),
- __METHOD__
- );
- $count += $dbw->affectedRows();
- wfIncrStats( 'job-recycle', $dbw->affectedRows() );
- $wgMemc->set( $this->getCacheKey( 'empty' ), 'false', self::CACHE_TTL_LONG );
- }
- }
-
- // Just destroy any stale jobs...
- $pruneCutoff = $dbw->timestamp( $now - self::MAX_AGE_PRUNE );
- $conds = array(
- 'job_cmd' => $this->type,
- "job_token != {$dbw->addQuotes( '' )}", // was acquired
- "job_token_timestamp < {$dbw->addQuotes( $pruneCutoff )}" // stale
- );
- if ( $this->claimTTL > 0 ) { // only prune jobs attempted too many times...
- $conds[] = "job_attempts >= {$dbw->addQuotes( $this->maxTries )}";
- }
- // Get the IDs of jobs that are considered stale and should be removed. Selecting
- // the IDs first means that the UPDATE can be done by primary key (less deadlocks).
- $res = $dbw->select( 'job', 'job_id', $conds, __METHOD__ );
- $ids = array_map( function( $o ) { return $o->job_id; }, iterator_to_array( $res ) );
- if ( count( $ids ) ) {
- $dbw->delete( 'job', array( 'job_id' => $ids ), __METHOD__ );
- $count += $dbw->affectedRows();
- }
-
- $dbw->unlock( "jobqueue-recycle-{$this->type}", __METHOD__ );
-
- return $count;
- }
-
- /**
* @see JobQueue::doAck()
* @param Job $job
* @throws MWException
* @return Job|bool
*/
protected function doAck( Job $job ) {
- if ( !$job->getId() ) {
+ if ( !isset( $job->metadata['id'] ) ) {
throw new MWException( "Job of type '{$job->getType()}' has no ID." );
}
- list( $dbw, $scope ) = $this->getMasterDB();
- $dbw->commit( __METHOD__, 'flush' ); // flush existing transaction
- $autoTrx = $dbw->getFlag( DBO_TRX ); // get current setting
- $dbw->clearFlag( DBO_TRX ); // make each query its own transaction
- $scopedReset = new ScopedCallback( function() use ( $dbw, $autoTrx ) {
- $dbw->setFlag( $autoTrx ? DBO_TRX : 0 ); // restore old setting
- } );
+ $dbw = $this->getMasterDB();
+ try {
+ $dbw->commit( __METHOD__, 'flush' ); // flush existing transaction
+ $autoTrx = $dbw->getFlag( DBO_TRX ); // get current setting
+ $dbw->clearFlag( DBO_TRX ); // make each query its own transaction
+ $scopedReset = new ScopedCallback( function() use ( $dbw, $autoTrx ) {
+ $dbw->setFlag( $autoTrx ? DBO_TRX : 0 ); // restore old setting
+ } );
- // Delete a row with a single DELETE without holding row locks over RTTs...
- $dbw->delete( 'job',
- array( 'job_cmd' => $this->type, 'job_id' => $job->getId() ), __METHOD__ );
+ // Delete a row with a single DELETE without holding row locks over RTTs...
+ $dbw->delete( 'job',
+ array( 'job_cmd' => $this->type, 'job_id' => $job->metadata['id'] ), __METHOD__ );
+ } catch ( DBError $e ) {
+ $this->throwDBException( $e );
+ }
return true;
}
@@ -527,44 +518,33 @@ class JobQueueDB extends JobQueue {
// deferred till "transaction idle", do the same here, so that the ordering is
// maintained. Having only the de-duplication registration succeed would cause
// jobs to become no-ops without any actual jobs that made them redundant.
- list( $dbw, $scope ) = $this->getMasterDB();
- $dbw->onTransactionIdle( function() use ( $params, $key, $scope ) {
- global $wgMemc;
-
- $timestamp = $wgMemc->get( $key ); // current last timestamp of this job
+ $dbw = $this->getMasterDB();
+ $cache = $this->dupCache;
+ $dbw->onTransactionIdle( function() use ( $cache, $params, $key, $dbw ) {
+ $timestamp = $cache->get( $key ); // current last timestamp of this job
if ( $timestamp && $timestamp >= $params['rootJobTimestamp'] ) {
return true; // a newer version of this root job was enqueued
}
// Update the timestamp of the last root job started at the location...
- return $wgMemc->set( $key, $params['rootJobTimestamp'], JobQueueDB::ROOTJOB_TTL );
+ return $cache->set( $key, $params['rootJobTimestamp'], JobQueueDB::ROOTJOB_TTL );
} );
return true;
}
/**
- * Check if the "root" job of a given job has been superseded by a newer one
- *
- * @param $job Job
+ * @see JobQueue::doDelete()
* @return bool
*/
- protected function isRootJobOldDuplicate( Job $job ) {
- global $wgMemc;
-
- $params = $job->getParams();
- if ( !isset( $params['rootJobSignature'] ) ) {
- return false; // job has no de-deplication info
- } elseif ( !isset( $params['rootJobTimestamp'] ) ) {
- trigger_error( "Cannot check root job; missing 'rootJobTimestamp'." );
- return false;
+ protected function doDelete() {
+ $dbw = $this->getMasterDB();
+ try {
+ $dbw->delete( 'job', array( 'job_cmd' => $this->type ) );
+ } catch ( DBError $e ) {
+ $this->throwDBException( $e );
}
-
- // Get the last time this root job was enqueued
- $timestamp = $wgMemc->get( $this->getRootJobCacheKey( $params['rootJobSignature'] ) );
-
- // Check if a new root job was started at the location after this one's...
- return ( $timestamp && $timestamp > $params['rootJobTimestamp'] );
+ return true;
}
/**
@@ -582,7 +562,7 @@ class JobQueueDB extends JobQueue {
return array(
'recycleAndDeleteStaleJobs' => array(
'callback' => array( $this, 'recycleAndDeleteStaleJobs' ),
- 'period' => ceil( $this->claimTTL / 2 )
+ 'period' => ceil( $this->claimTTL / 2 )
)
);
}
@@ -591,10 +571,8 @@ class JobQueueDB extends JobQueue {
* @return void
*/
protected function doFlushCaches() {
- global $wgMemc;
-
foreach ( array( 'empty', 'size', 'acquiredcount' ) as $type ) {
- $wgMemc->delete( $this->getCacheKey( $type ) );
+ $this->cache->delete( $this->getCacheKey( $type ) );
}
}
@@ -603,51 +581,140 @@ class JobQueueDB extends JobQueue {
* @return Iterator
*/
public function getAllQueuedJobs() {
- list( $dbr, $scope ) = $this->getSlaveDB();
- return new MappedIterator(
- $dbr->select( 'job', '*', array( 'job_cmd' => $this->getType(), 'job_token' => '' ) ),
- function( $row ) use ( $scope ) {
- $job = Job::factory(
- $row->job_cmd,
- Title::makeTitle( $row->job_namespace, $row->job_title ),
- strlen( $row->job_params ) ? unserialize( $row->job_params ) : false,
- $row->job_id
- );
- $job->id = $row->job_id; // XXX: work around broken subclasses
- return $job;
- }
- );
+ $dbr = $this->getSlaveDB();
+ try {
+ return new MappedIterator(
+ $dbr->select( 'job', '*',
+ array( 'job_cmd' => $this->getType(), 'job_token' => '' ) ),
+ function( $row ) use ( $dbr ) {
+ $job = Job::factory(
+ $row->job_cmd,
+ Title::makeTitle( $row->job_namespace, $row->job_title ),
+ strlen( $row->job_params ) ? unserialize( $row->job_params ) : false,
+ $row->job_id
+ );
+ $job->metadata['id'] = $row->job_id;
+ $job->id = $row->job_id; // XXX: work around broken subclasses
+ return $job;
+ }
+ );
+ } catch ( DBError $e ) {
+ $this->throwDBException( $e );
+ }
}
- /**
- * @return Array (DatabaseBase, ScopedCallback)
- */
- protected function getSlaveDB() {
- return $this->getDB( DB_SLAVE );
+ public function getCoalesceLocationInternal() {
+ return $this->cluster
+ ? "DBCluster:{$this->cluster}:{$this->wiki}"
+ : "LBFactory:{$this->wiki}";
}
- /**
- * @return Array (DatabaseBase, ScopedCallback)
- */
- protected function getMasterDB() {
- return $this->getDB( DB_MASTER );
+ protected function doGetSiblingQueuesWithJobs( array $types ) {
+ $dbr = $this->getSlaveDB();
+ $res = $dbr->select( 'job', 'DISTINCT job_cmd',
+ array( 'job_cmd' => $types ), __METHOD__ );
+
+ $types = array();
+ foreach ( $res as $row ) {
+ $types[] = $row->job_cmd;
+ }
+ return $types;
+ }
+
+ protected function doGetSiblingQueueSizes( array $types ) {
+ $dbr = $this->getSlaveDB();
+ $res = $dbr->select( 'job', array( 'job_cmd', 'COUNT(*) AS count' ),
+ array( 'job_cmd' => $types ), __METHOD__, array( 'GROUP BY' => 'job_cmd' ) );
+
+ $sizes = array();
+ foreach ( $res as $row ) {
+ $sizes[$row->job_cmd] = (int)$row->count;
+ }
+ return $sizes;
}
/**
- * @param $index integer (DB_SLAVE/DB_MASTER)
- * @return Array (DatabaseBase, ScopedCallback)
+ * Recycle or destroy any jobs that have been claimed for too long
+ *
+ * @return integer Number of jobs recycled/deleted
*/
- protected function getDB( $index ) {
- $lb = ( $this->cluster !== false )
- ? wfGetLBFactory()->getExternalLB( $this->cluster, $this->wiki )
- : wfGetLB( $this->wiki );
- $conn = $lb->getConnection( $index, array(), $this->wiki );
- return array(
- $conn,
- new ScopedCallback( function() use ( $lb, $conn ) {
- $lb->reuseConnection( $conn );
- } )
- );
+ public function recycleAndDeleteStaleJobs() {
+ $now = time();
+ $count = 0; // affected rows
+ $dbw = $this->getMasterDB();
+
+ try {
+ if ( !$dbw->lock( "jobqueue-recycle-{$this->type}", __METHOD__, 1 ) ) {
+ return $count; // already in progress
+ }
+
+ // Remove claims on jobs acquired for too long if enabled...
+ if ( $this->claimTTL > 0 ) {
+ $claimCutoff = $dbw->timestamp( $now - $this->claimTTL );
+ // Get the IDs of jobs that have be claimed but not finished after too long.
+ // These jobs can be recycled into the queue by expiring the claim. Selecting
+ // the IDs first means that the UPDATE can be done by primary key (less deadlocks).
+ $res = $dbw->select( 'job', 'job_id',
+ array(
+ 'job_cmd' => $this->type,
+ "job_token != {$dbw->addQuotes( '' )}", // was acquired
+ "job_token_timestamp < {$dbw->addQuotes( $claimCutoff )}", // stale
+ "job_attempts < {$dbw->addQuotes( $this->maxTries )}" ), // retries left
+ __METHOD__
+ );
+ $ids = array_map(
+ function( $o ) {
+ return $o->job_id;
+ }, iterator_to_array( $res )
+ );
+ if ( count( $ids ) ) {
+ // Reset job_token for these jobs so that other runners will pick them up.
+ // Set the timestamp to the current time, as it is useful to now that the job
+ // was already tried before (the timestamp becomes the "released" time).
+ $dbw->update( 'job',
+ array(
+ 'job_token' => '',
+ 'job_token_timestamp' => $dbw->timestamp( $now ) ), // time of release
+ array(
+ 'job_id' => $ids ),
+ __METHOD__
+ );
+ $count += $dbw->affectedRows();
+ JobQueue::incrStats( 'job-recycle', $this->type, $dbw->affectedRows() );
+ $this->cache->set( $this->getCacheKey( 'empty' ), 'false', self::CACHE_TTL_LONG );
+ }
+ }
+
+ // Just destroy any stale jobs...
+ $pruneCutoff = $dbw->timestamp( $now - self::MAX_AGE_PRUNE );
+ $conds = array(
+ 'job_cmd' => $this->type,
+ "job_token != {$dbw->addQuotes( '' )}", // was acquired
+ "job_token_timestamp < {$dbw->addQuotes( $pruneCutoff )}" // stale
+ );
+ if ( $this->claimTTL > 0 ) { // only prune jobs attempted too many times...
+ $conds[] = "job_attempts >= {$dbw->addQuotes( $this->maxTries )}";
+ }
+ // Get the IDs of jobs that are considered stale and should be removed. Selecting
+ // the IDs first means that the UPDATE can be done by primary key (less deadlocks).
+ $res = $dbw->select( 'job', 'job_id', $conds, __METHOD__ );
+ $ids = array_map(
+ function( $o ) {
+ return $o->job_id;
+ }, iterator_to_array( $res )
+ );
+ if ( count( $ids ) ) {
+ $dbw->delete( 'job', array( 'job_id' => $ids ), __METHOD__ );
+ $count += $dbw->affectedRows();
+ JobQueue::incrStats( 'job-abandon', $this->type, $dbw->affectedRows() );
+ }
+
+ $dbw->unlock( "jobqueue-recycle-{$this->type}", __METHOD__ );
+ } catch ( DBError $e ) {
+ $this->throwDBException( $e );
+ }
+
+ return $count;
}
/**
@@ -655,7 +722,7 @@ class JobQueueDB extends JobQueue {
* @return array
*/
protected function insertFields( Job $job ) {
- list( $dbw, $scope ) = $this->getMasterDB();
+ $dbw = $this->getMasterDB();
return array(
// Fields that describe the nature of the job
'job_cmd' => $job->getType(),
@@ -674,20 +741,45 @@ class JobQueueDB extends JobQueue {
}
/**
- * @return string
+ * @return DBConnRef
*/
- private function getCacheKey( $property ) {
- list( $db, $prefix ) = wfSplitWikiID( $this->wiki );
- return wfForeignMemcKey( $db, $prefix, 'jobqueue', $this->type, $property );
+ protected function getSlaveDB() {
+ try {
+ return $this->getDB( DB_SLAVE );
+ } catch ( DBConnectionError $e ) {
+ throw new JobQueueConnectionError( "DBConnectionError:" . $e->getMessage() );
+ }
+ }
+
+ /**
+ * @return DBConnRef
+ */
+ protected function getMasterDB() {
+ try {
+ return $this->getDB( DB_MASTER );
+ } catch ( DBConnectionError $e ) {
+ throw new JobQueueConnectionError( "DBConnectionError:" . $e->getMessage() );
+ }
+ }
+
+ /**
+ * @param $index integer (DB_SLAVE/DB_MASTER)
+ * @return DBConnRef
+ */
+ protected function getDB( $index ) {
+ $lb = ( $this->cluster !== false )
+ ? wfGetLBFactory()->getExternalLB( $this->cluster, $this->wiki )
+ : wfGetLB( $this->wiki );
+ return $lb->getConnectionRef( $index, array(), $this->wiki );
}
/**
- * @param string $signature Hash identifier of the root job
* @return string
*/
- private function getRootJobCacheKey( $signature ) {
+ private function getCacheKey( $property ) {
list( $db, $prefix ) = wfSplitWikiID( $this->wiki );
- return wfForeignMemcKey( $db, $prefix, 'jobqueue', $this->type, 'rootjob', $signature );
+ $cluster = is_string( $this->cluster ) ? $this->cluster : 'main';
+ return wfForeignMemcKey( $db, $prefix, 'jobqueue', $cluster, $this->type, $property );
}
/**
@@ -713,4 +805,12 @@ class JobQueueDB extends JobQueue {
return false;
}
}
+
+ /**
+ * @param DBError $e
+ * @throws JobQueueError
+ */
+ protected function throwDBException( DBError $e ) {
+ throw new JobQueueError( get_class( $e ) . ": " . $e->getMessage() );
+ }
}
diff --git a/includes/job/JobQueueFederated.php b/includes/job/JobQueueFederated.php
new file mode 100644
index 00000000..d3ce164a
--- /dev/null
+++ b/includes/job/JobQueueFederated.php
@@ -0,0 +1,473 @@
+<?php
+/**
+ * Job queue code for federated queues.
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with this program; if not, write 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 Aaron Schulz
+ */
+
+/**
+ * Class to handle enqueueing and running of background jobs for federated queues
+ *
+ * This class allows for queues to be partitioned into smaller queues.
+ * A partition is defined by the configuration for a JobQueue instance.
+ * For example, one can set $wgJobTypeConf['refreshLinks'] to point to a
+ * JobQueueFederated instance, which itself would consist of three JobQueueRedis
+ * instances, each using their own redis server. This would allow for the jobs
+ * to be split (evenly or based on weights) accross multiple servers if a single
+ * server becomes impractical or expensive. Different JobQueue classes can be mixed.
+ *
+ * The basic queue configuration (e.g. "order", "claimTTL") of a federated queue
+ * is inherited by the partition queues. Additional configuration defines what
+ * section each wiki is in, what partition queues each section uses (and their weight),
+ * and the JobQueue configuration for each partition. Some sections might only need a
+ * single queue partition, like the sections for groups of small wikis.
+ *
+ * If used for performance, then $wgMainCacheType should be set to memcached/redis.
+ * Note that "fifo" cannot be used for the ordering, since the data is distributed.
+ * One can still use "timestamp" instead, as in "roughly timestamp ordered". Also,
+ * queue classes used by this should ignore down servers (with TTL) to avoid slowness.
+ *
+ * @ingroup JobQueue
+ * @since 1.22
+ */
+class JobQueueFederated extends JobQueue {
+ /** @var Array (partition name => weight) reverse sorted by weight */
+ protected $partitionMap = array();
+ /** @var Array (partition name => JobQueue) reverse sorted by weight */
+ protected $partitionQueues = array();
+ /** @var HashRing */
+ protected $partitionPushRing;
+ /** @var BagOStuff */
+ protected $cache;
+
+ const CACHE_TTL_SHORT = 30; // integer; seconds to cache info without re-validating
+ const CACHE_TTL_LONG = 300; // integer; seconds to cache info that is kept up to date
+
+ /**
+ * @params include:
+ * - sectionsByWiki : A map of wiki IDs to section names.
+ * Wikis will default to using the section "default".
+ * - partitionsBySection : Map of section names to maps of (partition name => weight).
+ * A section called 'default' must be defined if not all wikis
+ * have explicitly defined sections.
+ * - configByPartition : Map of queue partition names to configuration arrays.
+ * These configuration arrays are passed to JobQueue::factory().
+ * The options set here are overriden by those passed to this
+ * the federated queue itself (e.g. 'order' and 'claimTTL').
+ * - partitionsNoPush : List of partition names that can handle pop() but not push().
+ * This can be used to migrate away from a certain partition.
+ * @param array $params
+ */
+ protected function __construct( array $params ) {
+ parent::__construct( $params );
+ $section = isset( $params['sectionsByWiki'][$this->wiki] )
+ ? $params['sectionsByWiki'][$this->wiki]
+ : 'default';
+ if ( !isset( $params['partitionsBySection'][$section] ) ) {
+ throw new MWException( "No configuration for section '$section'." );
+ }
+ // Get the full partition map
+ $this->partitionMap = $params['partitionsBySection'][$section];
+ arsort( $this->partitionMap, SORT_NUMERIC );
+ // Get the partitions jobs can actually be pushed to
+ $partitionPushMap = $this->partitionMap;
+ if ( isset( $params['partitionsNoPush'] ) ) {
+ foreach ( $params['partitionsNoPush'] as $partition ) {
+ unset( $partitionPushMap[$partition] );
+ }
+ }
+ // Get the config to pass to merge into each partition queue config
+ $baseConfig = $params;
+ foreach ( array( 'class', 'sectionsByWiki',
+ 'partitionsBySection', 'configByPartition', 'partitionsNoPush' ) as $o )
+ {
+ unset( $baseConfig[$o] );
+ }
+ // Get the partition queue objects
+ foreach ( $this->partitionMap as $partition => $w ) {
+ if ( !isset( $params['configByPartition'][$partition] ) ) {
+ throw new MWException( "No configuration for partition '$partition'." );
+ }
+ $this->partitionQueues[$partition] = JobQueue::factory(
+ $baseConfig + $params['configByPartition'][$partition] );
+ }
+ // Get the ring of partitions to push jobs into
+ $this->partitionPushRing = new HashRing( $partitionPushMap );
+ // Aggregate cache some per-queue values if there are multiple partition queues
+ $this->cache = count( $this->partitionMap ) > 1 ? wfGetMainCache() : new EmptyBagOStuff();
+ }
+
+ protected function supportedOrders() {
+ // No FIFO due to partitioning, though "rough timestamp order" is supported
+ return array( 'undefined', 'random', 'timestamp' );
+ }
+
+ protected function optimalOrder() {
+ return 'undefined'; // defer to the partitions
+ }
+
+ protected function supportsDelayedJobs() {
+ return true; // defer checks to the partitions
+ }
+
+ protected function doIsEmpty() {
+ $key = $this->getCacheKey( 'empty' );
+
+ $isEmpty = $this->cache->get( $key );
+ if ( $isEmpty === 'true' ) {
+ return true;
+ } elseif ( $isEmpty === 'false' ) {
+ return false;
+ }
+
+ foreach ( $this->partitionQueues as $queue ) {
+ try {
+ if ( !$queue->doIsEmpty() ) {
+ $this->cache->add( $key, 'false', self::CACHE_TTL_LONG );
+ return false;
+ }
+ } catch ( JobQueueError $e ) {
+ MWExceptionHandler::logException( $e );
+ }
+ }
+
+ $this->cache->add( $key, 'true', self::CACHE_TTL_LONG );
+ return true;
+ }
+
+ protected function doGetSize() {
+ return $this->getCrossPartitionSum( 'size', 'doGetSize' );
+ }
+
+ protected function doGetAcquiredCount() {
+ return $this->getCrossPartitionSum( 'acquiredcount', 'doGetAcquiredCount' );
+ }
+
+ protected function doGetDelayedCount() {
+ return $this->getCrossPartitionSum( 'delayedcount', 'doGetDelayedCount' );
+ }
+
+ protected function doGetAbandonedCount() {
+ return $this->getCrossPartitionSum( 'abandonedcount', 'doGetAbandonedCount' );
+ }
+
+ /**
+ * @param string $type
+ * @param string $method
+ * @return integer
+ */
+ protected function getCrossPartitionSum( $type, $method ) {
+ $key = $this->getCacheKey( $type );
+
+ $count = $this->cache->get( $key );
+ if ( is_int( $count ) ) {
+ return $count;
+ }
+
+ $count = 0;
+ foreach ( $this->partitionQueues as $queue ) {
+ try {
+ $count += $queue->$method();
+ } catch ( JobQueueError $e ) {
+ MWExceptionHandler::logException( $e );
+ }
+ }
+
+ $this->cache->set( $key, $count, self::CACHE_TTL_SHORT );
+ return $count;
+ }
+
+ protected function doBatchPush( array $jobs, $flags ) {
+ if ( !count( $jobs ) ) {
+ return true; // nothing to do
+ }
+ // Local ring variable that may be changed to point to a new ring on failure
+ $partitionRing = $this->partitionPushRing;
+ // Try to insert the jobs and update $partitionsTry on any failures
+ $jobsLeft = $this->tryJobInsertions( $jobs, $partitionRing, $flags );
+ if ( count( $jobsLeft ) ) { // some jobs failed to insert?
+ // Try to insert the remaning jobs once more, ignoring the bad partitions
+ return !count( $this->tryJobInsertions( $jobsLeft, $partitionRing, $flags ) );
+ }
+ return true;
+ }
+
+ /**
+ * @param array $jobs
+ * @param HashRing $partitionRing
+ * @param integer $flags
+ * @return array List of Job object that could not be inserted
+ */
+ protected function tryJobInsertions( array $jobs, HashRing &$partitionRing, $flags ) {
+ $jobsLeft = array();
+
+ // Because jobs are spread across partitions, per-job de-duplication needs
+ // to use a consistent hash to avoid allowing duplicate jobs per partition.
+ // When inserting a batch of de-duplicated jobs, QOS_ATOMIC is disregarded.
+ $uJobsByPartition = array(); // (partition name => job list)
+ foreach ( $jobs as $key => $job ) {
+ if ( $job->ignoreDuplicates() ) {
+ $sha1 = sha1( serialize( $job->getDeduplicationInfo() ) );
+ $uJobsByPartition[$partitionRing->getLocation( $sha1 )][] = $job;
+ unset( $jobs[$key] );
+ }
+ }
+ // Get the batches of jobs that are not de-duplicated
+ if ( $flags & self::QOS_ATOMIC ) {
+ $nuJobBatches = array( $jobs ); // all or nothing
+ } else {
+ // Split the jobs into batches and spread them out over servers if there
+ // are many jobs. This helps keep the partitions even. Otherwise, send all
+ // the jobs to a single partition queue to avoids the extra connections.
+ $nuJobBatches = array_chunk( $jobs, 300 );
+ }
+
+ // Insert the de-duplicated jobs into the queues...
+ foreach ( $uJobsByPartition as $partition => $jobBatch ) {
+ $queue = $this->partitionQueues[$partition];
+ try {
+ $ok = $queue->doBatchPush( $jobBatch, $flags | self::QOS_ATOMIC );
+ } catch ( JobQueueError $e ) {
+ $ok = false;
+ MWExceptionHandler::logException( $e );
+ }
+ if ( $ok ) {
+ $key = $this->getCacheKey( 'empty' );
+ $this->cache->set( $key, 'false', JobQueueDB::CACHE_TTL_LONG );
+ } else {
+ $partitionRing = $partitionRing->newWithoutLocation( $partition ); // blacklist
+ if ( !$partitionRing ) {
+ throw new JobQueueError( "Could not insert job(s), all partitions are down." );
+ }
+ $jobsLeft = array_merge( $jobsLeft, $jobBatch ); // not inserted
+ }
+ }
+
+ // Insert the jobs that are not de-duplicated into the queues...
+ foreach ( $nuJobBatches as $jobBatch ) {
+ $partition = ArrayUtils::pickRandom( $partitionRing->getLocationWeights() );
+ $queue = $this->partitionQueues[$partition];
+ try {
+ $ok = $queue->doBatchPush( $jobBatch, $flags | self::QOS_ATOMIC );
+ } catch ( JobQueueError $e ) {
+ $ok = false;
+ MWExceptionHandler::logException( $e );
+ }
+ if ( $ok ) {
+ $key = $this->getCacheKey( 'empty' );
+ $this->cache->set( $key, 'false', JobQueueDB::CACHE_TTL_LONG );
+ } else {
+ $partitionRing = $partitionRing->newWithoutLocation( $partition ); // blacklist
+ if ( !$partitionRing ) {
+ throw new JobQueueError( "Could not insert job(s), all partitions are down." );
+ }
+ $jobsLeft = array_merge( $jobsLeft, $jobBatch ); // not inserted
+ }
+ }
+
+ return $jobsLeft;
+ }
+
+ protected function doPop() {
+ $key = $this->getCacheKey( 'empty' );
+
+ $isEmpty = $this->cache->get( $key );
+ if ( $isEmpty === 'true' ) {
+ return false;
+ }
+
+ $partitionsTry = $this->partitionMap; // (partition => weight)
+
+ while ( count( $partitionsTry ) ) {
+ $partition = ArrayUtils::pickRandom( $partitionsTry );
+ if ( $partition === false ) {
+ break; // all partitions at 0 weight
+ }
+ $queue = $this->partitionQueues[$partition];
+ try {
+ $job = $queue->pop();
+ } catch ( JobQueueError $e ) {
+ $job = false;
+ MWExceptionHandler::logException( $e );
+ }
+ if ( $job ) {
+ $job->metadata['QueuePartition'] = $partition;
+ return $job;
+ } else {
+ unset( $partitionsTry[$partition] ); // blacklist partition
+ }
+ }
+
+ $this->cache->set( $key, 'true', JobQueueDB::CACHE_TTL_LONG );
+ return false;
+ }
+
+ protected function doAck( Job $job ) {
+ if ( !isset( $job->metadata['QueuePartition'] ) ) {
+ throw new MWException( "The given job has no defined partition name." );
+ }
+ return $this->partitionQueues[$job->metadata['QueuePartition']]->ack( $job );
+ }
+
+ protected function doIsRootJobOldDuplicate( Job $job ) {
+ $params = $job->getRootJobParams();
+ $partitions = $this->partitionPushRing->getLocations( $params['rootJobSignature'], 2 );
+ try {
+ return $this->partitionQueues[$partitions[0]]->doIsRootJobOldDuplicate( $job );
+ } catch ( JobQueueError $e ) {
+ if ( isset( $partitions[1] ) ) { // check fallback partition
+ return $this->partitionQueues[$partitions[1]]->doIsRootJobOldDuplicate( $job );
+ }
+ }
+ return false;
+ }
+
+ protected function doDeduplicateRootJob( Job $job ) {
+ $params = $job->getRootJobParams();
+ $partitions = $this->partitionPushRing->getLocations( $params['rootJobSignature'], 2 );
+ try {
+ return $this->partitionQueues[$partitions[0]]->doDeduplicateRootJob( $job );
+ } catch ( JobQueueError $e ) {
+ if ( isset( $partitions[1] ) ) { // check fallback partition
+ return $this->partitionQueues[$partitions[1]]->doDeduplicateRootJob( $job );
+ }
+ }
+ return false;
+ }
+
+ protected function doDelete() {
+ foreach ( $this->partitionQueues as $queue ) {
+ try {
+ $queue->doDelete();
+ } catch ( JobQueueError $e ) {
+ MWExceptionHandler::logException( $e );
+ }
+ }
+ }
+
+ protected function doWaitForBackups() {
+ foreach ( $this->partitionQueues as $queue ) {
+ try {
+ $queue->waitForBackups();
+ } catch ( JobQueueError $e ) {
+ MWExceptionHandler::logException( $e );
+ }
+ }
+ }
+
+ protected function doGetPeriodicTasks() {
+ $tasks = array();
+ foreach ( $this->partitionQueues as $partition => $queue ) {
+ foreach ( $queue->getPeriodicTasks() as $task => $def ) {
+ $tasks["{$partition}:{$task}"] = $def;
+ }
+ }
+ return $tasks;
+ }
+
+ protected function doFlushCaches() {
+ static $types = array(
+ 'empty',
+ 'size',
+ 'acquiredcount',
+ 'delayedcount',
+ 'abandonedcount'
+ );
+ foreach ( $types as $type ) {
+ $this->cache->delete( $this->getCacheKey( $type ) );
+ }
+ foreach ( $this->partitionQueues as $queue ) {
+ $queue->doFlushCaches();
+ }
+ }
+
+ public function getAllQueuedJobs() {
+ $iterator = new AppendIterator();
+ foreach ( $this->partitionQueues as $queue ) {
+ $iterator->append( $queue->getAllQueuedJobs() );
+ }
+ return $iterator;
+ }
+
+ public function getAllDelayedJobs() {
+ $iterator = new AppendIterator();
+ foreach ( $this->partitionQueues as $queue ) {
+ $iterator->append( $queue->getAllDelayedJobs() );
+ }
+ return $iterator;
+ }
+
+ public function getCoalesceLocationInternal() {
+ return "JobQueueFederated:wiki:{$this->wiki}" .
+ sha1( serialize( array_keys( $this->partitionMap ) ) );
+ }
+
+ protected function doGetSiblingQueuesWithJobs( array $types ) {
+ $result = array();
+ foreach ( $this->partitionQueues as $queue ) {
+ try {
+ $nonEmpty = $queue->doGetSiblingQueuesWithJobs( $types );
+ if ( is_array( $nonEmpty ) ) {
+ $result = array_unique( array_merge( $result, $nonEmpty ) );
+ } else {
+ return null; // not supported on all partitions; bail
+ }
+ if ( count( $result ) == count( $types ) ) {
+ break; // short-circuit
+ }
+ } catch ( JobQueueError $e ) {
+ MWExceptionHandler::logException( $e );
+ }
+ }
+ return array_values( $result );
+ }
+
+ protected function doGetSiblingQueueSizes( array $types ) {
+ $result = array();
+ foreach ( $this->partitionQueues as $queue ) {
+ try {
+ $sizes = $queue->doGetSiblingQueueSizes( $types );
+ if ( is_array( $sizes ) ) {
+ foreach ( $sizes as $type => $size ) {
+ $result[$type] = isset( $result[$type] ) ? $result[$type] + $size : $size;
+ }
+ } else {
+ return null; // not supported on all partitions; bail
+ }
+ } catch ( JobQueueError $e ) {
+ MWExceptionHandler::logException( $e );
+ }
+ }
+ return $result;
+ }
+
+ public function setTestingPrefix( $key ) {
+ foreach ( $this->partitionQueues as $queue ) {
+ $queue->setTestingPrefix( $key );
+ }
+ }
+
+ /**
+ * @return string
+ */
+ private function getCacheKey( $property ) {
+ list( $db, $prefix ) = wfSplitWikiID( $this->wiki );
+ return wfForeignMemcKey( $db, $prefix, 'jobqueue', $this->type, $property );
+ }
+}
diff --git a/includes/job/JobQueueGroup.php b/includes/job/JobQueueGroup.php
index 351c71a3..fa7fee5f 100644
--- a/includes/job/JobQueueGroup.php
+++ b/includes/job/JobQueueGroup.php
@@ -36,10 +36,14 @@ class JobQueueGroup {
protected $wiki; // string; wiki ID
+ /** @var array Map of (bucket => (queue => JobQueue, types => list of types) */
+ protected $coalescedQueues;
+
const TYPE_DEFAULT = 1; // integer; jobs popped by default
const TYPE_ANY = 2; // integer; any job
const USE_CACHE = 1; // integer; use process or persistent cache
+ const USE_PRIORITY = 2; // integer; respect deprioritization
const PROC_CACHE_TTL = 15; // integer; seconds
@@ -146,6 +150,9 @@ class JobQueueGroup {
*/
public function pop( $qtype = self::TYPE_DEFAULT, $flags = 0 ) {
if ( is_string( $qtype ) ) { // specific job type
+ if ( ( $flags & self::USE_PRIORITY ) && $this->isQueueDeprioritized( $qtype ) ) {
+ return false; // back off
+ }
$job = $this->get( $qtype )->pop();
if ( !$job ) {
JobQueueAggregator::singleton()->notifyQueueEmpty( $this->wiki, $qtype );
@@ -167,6 +174,9 @@ class JobQueueGroup {
shuffle( $types ); // avoid starvation
foreach ( $types as $type ) { // for each queue...
+ if ( ( $flags & self::USE_PRIORITY ) && $this->isQueueDeprioritized( $type ) ) {
+ continue; // back off
+ }
$job = $this->get( $type )->pop();
if ( $job ) { // found
return $job;
@@ -247,15 +257,72 @@ class JobQueueGroup {
*/
public function getQueuesWithJobs() {
$types = array();
- foreach ( $this->getQueueTypes() as $type ) {
- if ( !$this->get( $type )->isEmpty() ) {
- $types[] = $type;
+ foreach ( $this->getCoalescedQueues() as $info ) {
+ $nonEmpty = $info['queue']->getSiblingQueuesWithJobs( $this->getQueueTypes() );
+ if ( is_array( $nonEmpty ) ) { // batching features supported
+ $types = array_merge( $types, $nonEmpty );
+ } else { // we have to go through the queues in the bucket one-by-one
+ foreach ( $info['types'] as $type ) {
+ if ( !$this->get( $type )->isEmpty() ) {
+ $types[] = $type;
+ }
+ }
}
}
return $types;
}
/**
+ * Get the size of the queus for a list of job types
+ *
+ * @return Array Map of (job type => size)
+ */
+ public function getQueueSizes() {
+ $sizeMap = array();
+ foreach ( $this->getCoalescedQueues() as $info ) {
+ $sizes = $info['queue']->getSiblingQueueSizes( $this->getQueueTypes() );
+ if ( is_array( $sizes ) ) { // batching features supported
+ $sizeMap = $sizeMap + $sizes;
+ } else { // we have to go through the queues in the bucket one-by-one
+ foreach ( $info['types'] as $type ) {
+ $sizeMap[$type] = $this->get( $type )->getSize();
+ }
+ }
+ }
+ return $sizeMap;
+ }
+
+ /**
+ * @return array
+ */
+ protected function getCoalescedQueues() {
+ global $wgJobTypeConf;
+
+ if ( $this->coalescedQueues === null ) {
+ $this->coalescedQueues = array();
+ foreach ( $wgJobTypeConf as $type => $conf ) {
+ $queue = JobQueue::factory(
+ array( 'wiki' => $this->wiki, 'type' => 'null' ) + $conf );
+ $loc = $queue->getCoalesceLocationInternal();
+ if ( !isset( $this->coalescedQueues[$loc] ) ) {
+ $this->coalescedQueues[$loc]['queue'] = $queue;
+ $this->coalescedQueues[$loc]['types'] = array();
+ }
+ if ( $type === 'default' ) {
+ $this->coalescedQueues[$loc]['types'] = array_merge(
+ $this->coalescedQueues[$loc]['types'],
+ array_diff( $this->getQueueTypes(), array_keys( $wgJobTypeConf ) )
+ );
+ } else {
+ $this->coalescedQueues[$loc]['types'][] = $type;
+ }
+ }
+ }
+
+ return $this->coalescedQueues;
+ }
+
+ /**
* Check if jobs should not be popped of a queue right now.
* This is only used for performance, such as to avoid spamming
* the queue with many sub-jobs before they actually get run.
@@ -264,10 +331,15 @@ class JobQueueGroup {
* @return bool
*/
public function isQueueDeprioritized( $type ) {
+ if ( $this->cache->has( 'isDeprioritized', $type, 5 ) ) {
+ return $this->cache->get( 'isDeprioritized', $type );
+ }
if ( $type === 'refreshLinks2' ) {
// Don't keep converting refreshLinks2 => refreshLinks jobs if the
// later jobs have not been done yet. This helps throttle queue spam.
- return !$this->get( 'refreshLinks' )->isEmpty();
+ $deprioritized = !$this->get( 'refreshLinks' )->isEmpty();
+ $this->cache->set( 'isDeprioritized', $type, $deprioritized );
+ return $deprioritized;
}
return false;
}
@@ -298,9 +370,13 @@ class JobQueueGroup {
} elseif ( !isset( $lastRuns[$type][$task] )
|| $lastRuns[$type][$task] < ( time() - $definition['period'] ) )
{
- if ( call_user_func( $definition['callback'] ) !== null ) {
- $tasksRun[$type][$task] = time();
- ++$count;
+ try {
+ if ( call_user_func( $definition['callback'] ) !== null ) {
+ $tasksRun[$type][$task] = time();
+ ++$count;
+ }
+ } catch ( JobQueueError $e ) {
+ MWExceptionHandler::logException( $e );
}
}
}
diff --git a/includes/job/JobQueueRedis.php b/includes/job/JobQueueRedis.php
new file mode 100644
index 00000000..378e1755
--- /dev/null
+++ b/includes/job/JobQueueRedis.php
@@ -0,0 +1,856 @@
+<?php
+/**
+ * Redis-backed job queue code.
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with this program; if not, write to the Free Software Foundation, Inc.,
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ * http://www.gnu.org/copyleft/gpl.html
+ *
+ * @file
+ * @author Aaron Schulz
+ */
+
+/**
+ * Class to handle job queues stored in Redis
+ *
+ * This is faster, less resource intensive, queue that JobQueueDB.
+ * All data for a queue using this class is placed into one redis server.
+ *
+ * There are eight main redis keys used to track jobs:
+ * - l-unclaimed : A list of job IDs used for ready unclaimed jobs
+ * - z-claimed : A sorted set of (job ID, UNIX timestamp as score) used for job retries
+ * - z-abandoned : A sorted set of (job ID, UNIX timestamp as score) used for broken jobs
+ * - z-delayed : A sorted set of (job ID, UNIX timestamp as score) used for delayed jobs
+ * - h-idBySha1 : A hash of (SHA1 => job ID) for unclaimed jobs used for de-duplication
+ * - h-sha1ById : A hash of (job ID => SHA1) for unclaimed jobs used for de-duplication
+ * - h-attempts : A hash of (job ID => attempt count) used for job claiming/retries
+ * - h-data : A hash of (job ID => serialized blobs) for job storage
+ * A job ID can be in only one of z-delayed, l-unclaimed, z-claimed, and z-abandoned.
+ * If an ID appears in any of those lists, it should have a h-data entry for its ID.
+ * If a job has a SHA1 de-duplication value and its ID is in l-unclaimed or z-delayed, then
+ * there should be no other such jobs with that SHA1. Every h-idBySha1 entry has an h-sha1ById
+ * entry and every h-sha1ById must refer to an ID that is l-unclaimed. If a job has its
+ * ID in z-claimed or z-abandoned, then it must also have an h-attempts entry for its ID.
+ *
+ * Additionally, "rootjob:* keys track "root jobs" used for additional de-duplication.
+ * Aside from root job keys, all keys have no expiry, and are only removed when jobs are run.
+ * All the keys are prefixed with the relevant wiki ID information.
+ *
+ * This class requires Redis 2.6 as it makes use Lua scripts for fast atomic operations.
+ * Additionally, it should be noted that redis has different persistence modes, such
+ * as rdb snapshots, journaling, and no persistent. Appropriate configuration should be
+ * made on the servers based on what queues are using it and what tolerance they have.
+ *
+ * @ingroup JobQueue
+ * @ingroup Redis
+ * @since 1.22
+ */
+class JobQueueRedis extends JobQueue {
+ /** @var RedisConnectionPool */
+ protected $redisPool;
+
+ protected $server; // string; server address
+ protected $compression; // string; compression method to use
+
+ const MAX_AGE_PRUNE = 604800; // integer; seconds a job can live once claimed (7 days)
+
+ protected $key; // string; key to prefix the queue keys with (used for testing)
+
+ /**
+ * @params include:
+ * - redisConfig : An array of parameters to RedisConnectionPool::__construct().
+ * Note that the serializer option is ignored "none" is always used.
+ * - redisServer : A hostname/port combination or the absolute path of a UNIX socket.
+ * If a hostname is specified but no port, the standard port number
+ * 6379 will be used. Required.
+ * - compression : The type of compression to use; one of (none,gzip).
+ * @param array $params
+ */
+ public function __construct( array $params ) {
+ parent::__construct( $params );
+ $params['redisConfig']['serializer'] = 'none'; // make it easy to use Lua
+ $this->server = $params['redisServer'];
+ $this->compression = isset( $params['compression'] ) ? $params['compression'] : 'none';
+ $this->redisPool = RedisConnectionPool::singleton( $params['redisConfig'] );
+ }
+
+ protected function supportedOrders() {
+ return array( 'timestamp', 'fifo' );
+ }
+
+ protected function optimalOrder() {
+ return 'fifo';
+ }
+
+ protected function supportsDelayedJobs() {
+ return true;
+ }
+
+ /**
+ * @see JobQueue::doIsEmpty()
+ * @return bool
+ * @throws MWException
+ */
+ protected function doIsEmpty() {
+ return $this->doGetSize() == 0;
+ }
+
+ /**
+ * @see JobQueue::doGetSize()
+ * @return integer
+ * @throws MWException
+ */
+ protected function doGetSize() {
+ $conn = $this->getConnection();
+ try {
+ return $conn->lSize( $this->getQueueKey( 'l-unclaimed' ) );
+ } catch ( RedisException $e ) {
+ $this->throwRedisException( $this->server, $conn, $e );
+ }
+ }
+
+ /**
+ * @see JobQueue::doGetAcquiredCount()
+ * @return integer
+ * @throws MWException
+ */
+ protected function doGetAcquiredCount() {
+ if ( $this->claimTTL <= 0 ) {
+ return 0; // no acknowledgements
+ }
+ $conn = $this->getConnection();
+ try {
+ $conn->multi( Redis::PIPELINE );
+ $conn->zSize( $this->getQueueKey( 'z-claimed' ) );
+ $conn->zSize( $this->getQueueKey( 'z-abandoned' ) );
+ return array_sum( $conn->exec() );
+ } catch ( RedisException $e ) {
+ $this->throwRedisException( $this->server, $conn, $e );
+ }
+ }
+
+ /**
+ * @see JobQueue::doGetDelayedCount()
+ * @return integer
+ * @throws MWException
+ */
+ protected function doGetDelayedCount() {
+ if ( !$this->checkDelay ) {
+ return 0; // no delayed jobs
+ }
+ $conn = $this->getConnection();
+ try {
+ return $conn->zSize( $this->getQueueKey( 'z-delayed' ) );
+ } catch ( RedisException $e ) {
+ $this->throwRedisException( $this->server, $conn, $e );
+ }
+ }
+
+ /**
+ * @see JobQueue::doGetAbandonedCount()
+ * @return integer
+ * @throws MWException
+ */
+ protected function doGetAbandonedCount() {
+ if ( $this->claimTTL <= 0 ) {
+ return 0; // no acknowledgements
+ }
+ $conn = $this->getConnection();
+ try {
+ return $conn->zSize( $this->getQueueKey( 'z-abandoned' ) );
+ } catch ( RedisException $e ) {
+ $this->throwRedisException( $this->server, $conn, $e );
+ }
+ }
+
+ /**
+ * @see JobQueue::doBatchPush()
+ * @param array $jobs
+ * @param $flags
+ * @return bool
+ * @throws MWException
+ */
+ protected function doBatchPush( array $jobs, $flags ) {
+ // Convert the jobs into field maps (de-duplicated against each other)
+ $items = array(); // (job ID => job fields map)
+ foreach ( $jobs as $job ) {
+ $item = $this->getNewJobFields( $job );
+ if ( strlen( $item['sha1'] ) ) { // hash identifier => de-duplicate
+ $items[$item['sha1']] = $item;
+ } else {
+ $items[$item['uuid']] = $item;
+ }
+ }
+
+ if ( !count( $items ) ) {
+ return true; // nothing to do
+ }
+
+ $conn = $this->getConnection();
+ try {
+ // Actually push the non-duplicate jobs into the queue...
+ if ( $flags & self::QOS_ATOMIC ) {
+ $batches = array( $items ); // all or nothing
+ } else {
+ $batches = array_chunk( $items, 500 ); // avoid tying up the server
+ }
+ $failed = 0;
+ $pushed = 0;
+ foreach ( $batches as $itemBatch ) {
+ $added = $this->pushBlobs( $conn, $itemBatch );
+ if ( is_int( $added ) ) {
+ $pushed += $added;
+ } else {
+ $failed += count( $itemBatch );
+ }
+ }
+ if ( $failed > 0 ) {
+ wfDebugLog( 'JobQueueRedis', "Could not insert {$failed} {$this->type} job(s)." );
+ return false;
+ }
+ JobQueue::incrStats( 'job-insert', $this->type, count( $items ) );
+ JobQueue::incrStats( 'job-insert-duplicate', $this->type,
+ count( $items ) - $failed - $pushed );
+ } catch ( RedisException $e ) {
+ $this->throwRedisException( $this->server, $conn, $e );
+ }
+
+ return true;
+ }
+
+ /**
+ * @param RedisConnRef $conn
+ * @param array $items List of results from JobQueueRedis::getNewJobFields()
+ * @return integer Number of jobs inserted (duplicates are ignored)
+ * @throws RedisException
+ */
+ protected function pushBlobs( RedisConnRef $conn, array $items ) {
+ $args = array(); // ([id, sha1, rtime, blob [, id, sha1, rtime, blob ... ] ] )
+ foreach ( $items as $item ) {
+ $args[] = (string)$item['uuid'];
+ $args[] = (string)$item['sha1'];
+ $args[] = (string)$item['rtimestamp'];
+ $args[] = (string)$this->serialize( $item );
+ }
+ static $script =
+<<<LUA
+ if #ARGV % 4 ~= 0 then return redis.error_reply('Unmatched arguments') end
+ local pushed = 0
+ for i = 1,#ARGV,4 do
+ local id,sha1,rtimestamp,blob = ARGV[i],ARGV[i+1],ARGV[i+2],ARGV[i+3]
+ if sha1 == '' or redis.call('hExists',KEYS[3],sha1) == 0 then
+ if 1*rtimestamp > 0 then
+ -- Insert into delayed queue (release time as score)
+ redis.call('zAdd',KEYS[4],rtimestamp,id)
+ else
+ -- Insert into unclaimed queue
+ redis.call('lPush',KEYS[1],id)
+ end
+ if sha1 ~= '' then
+ redis.call('hSet',KEYS[2],id,sha1)
+ redis.call('hSet',KEYS[3],sha1,id)
+ end
+ redis.call('hSet',KEYS[5],id,blob)
+ pushed = pushed + 1
+ end
+ end
+ return pushed
+LUA;
+ return $conn->luaEval( $script,
+ array_merge(
+ array(
+ $this->getQueueKey( 'l-unclaimed' ), # KEYS[1]
+ $this->getQueueKey( 'h-sha1ById' ), # KEYS[2]
+ $this->getQueueKey( 'h-idBySha1' ), # KEYS[3]
+ $this->getQueueKey( 'z-delayed' ), # KEYS[4]
+ $this->getQueueKey( 'h-data' ), # KEYS[5]
+ ),
+ $args
+ ),
+ 5 # number of first argument(s) that are keys
+ );
+ }
+
+ /**
+ * @see JobQueue::doPop()
+ * @return Job|bool
+ * @throws MWException
+ */
+ protected function doPop() {
+ $job = false;
+
+ // Push ready delayed jobs into the queue every 10 jobs to spread the load.
+ // This is also done as a periodic task, but we don't want too much done at once.
+ if ( $this->checkDelay && mt_rand( 0, 9 ) == 0 ) {
+ $this->releaseReadyDelayedJobs();
+ }
+
+ $conn = $this->getConnection();
+ try {
+ do {
+ if ( $this->claimTTL > 0 ) {
+ // Keep the claimed job list down for high-traffic queues
+ if ( mt_rand( 0, 99 ) == 0 ) {
+ $this->recycleAndDeleteStaleJobs();
+ }
+ $blob = $this->popAndAcquireBlob( $conn );
+ } else {
+ $blob = $this->popAndDeleteBlob( $conn );
+ }
+ if ( $blob === false ) {
+ break; // no jobs; nothing to do
+ }
+
+ JobQueue::incrStats( 'job-pop', $this->type );
+ $item = $this->unserialize( $blob );
+ if ( $item === false ) {
+ wfDebugLog( 'JobQueueRedis', "Could not unserialize {$this->type} job." );
+ continue;
+ }
+
+ // If $item is invalid, recycleAndDeleteStaleJobs() will cleanup as needed
+ $job = $this->getJobFromFields( $item ); // may be false
+ } while ( !$job ); // job may be false if invalid
+ } catch ( RedisException $e ) {
+ $this->throwRedisException( $this->server, $conn, $e );
+ }
+
+ return $job;
+ }
+
+ /**
+ * @param RedisConnRef $conn
+ * @return array serialized string or false
+ * @throws RedisException
+ */
+ protected function popAndDeleteBlob( RedisConnRef $conn ) {
+ static $script =
+<<<LUA
+ -- Pop an item off the queue
+ local id = redis.call('rpop',KEYS[1])
+ if not id then return false end
+ -- Get the job data and remove it
+ local item = redis.call('hGet',KEYS[4],id)
+ redis.call('hDel',KEYS[4],id)
+ -- Allow new duplicates of this job
+ local sha1 = redis.call('hGet',KEYS[2],id)
+ if sha1 then redis.call('hDel',KEYS[3],sha1) end
+ redis.call('hDel',KEYS[2],id)
+ -- Return the job data
+ return item
+LUA;
+ return $conn->luaEval( $script,
+ array(
+ $this->getQueueKey( 'l-unclaimed' ), # KEYS[1]
+ $this->getQueueKey( 'h-sha1ById' ), # KEYS[2]
+ $this->getQueueKey( 'h-idBySha1' ), # KEYS[3]
+ $this->getQueueKey( 'h-data' ), # KEYS[4]
+ ),
+ 4 # number of first argument(s) that are keys
+ );
+ }
+
+ /**
+ * @param RedisConnRef $conn
+ * @return array serialized string or false
+ * @throws RedisException
+ */
+ protected function popAndAcquireBlob( RedisConnRef $conn ) {
+ static $script =
+<<<LUA
+ -- Pop an item off the queue
+ local id = redis.call('rPop',KEYS[1])
+ if not id then return false end
+ -- Allow new duplicates of this job
+ local sha1 = redis.call('hGet',KEYS[2],id)
+ if sha1 then redis.call('hDel',KEYS[3],sha1) end
+ redis.call('hDel',KEYS[2],id)
+ -- Mark the jobs as claimed and return it
+ redis.call('zAdd',KEYS[4],ARGV[1],id)
+ redis.call('hIncrBy',KEYS[5],id,1)
+ return redis.call('hGet',KEYS[6],id)
+LUA;
+ return $conn->luaEval( $script,
+ array(
+ $this->getQueueKey( 'l-unclaimed' ), # KEYS[1]
+ $this->getQueueKey( 'h-sha1ById' ), # KEYS[2]
+ $this->getQueueKey( 'h-idBySha1' ), # KEYS[3]
+ $this->getQueueKey( 'z-claimed' ), # KEYS[4]
+ $this->getQueueKey( 'h-attempts' ), # KEYS[5]
+ $this->getQueueKey( 'h-data' ), # KEYS[6]
+ time(), # ARGV[1] (injected to be replication-safe)
+ ),
+ 6 # number of first argument(s) that are keys
+ );
+ }
+
+ /**
+ * @see JobQueue::doAck()
+ * @param Job $job
+ * @return Job|bool
+ * @throws MWException
+ */
+ protected function doAck( Job $job ) {
+ if ( !isset( $job->metadata['uuid'] ) ) {
+ throw new MWException( "Job of type '{$job->getType()}' has no UUID." );
+ }
+ if ( $this->claimTTL > 0 ) {
+ $conn = $this->getConnection();
+ try {
+ static $script =
+<<<LUA
+ -- Unmark the job as claimed
+ redis.call('zRem',KEYS[1],ARGV[1])
+ redis.call('hDel',KEYS[2],ARGV[1])
+ -- Delete the job data itself
+ return redis.call('hDel',KEYS[3],ARGV[1])
+LUA;
+ $res = $conn->luaEval( $script,
+ array(
+ $this->getQueueKey( 'z-claimed' ), # KEYS[1]
+ $this->getQueueKey( 'h-attempts' ), # KEYS[2]
+ $this->getQueueKey( 'h-data' ), # KEYS[3]
+ $job->metadata['uuid'] # ARGV[1]
+ ),
+ 3 # number of first argument(s) that are keys
+ );
+
+ if ( !$res ) {
+ wfDebugLog( 'JobQueueRedis', "Could not acknowledge {$this->type} job." );
+ return false;
+ }
+ } catch ( RedisException $e ) {
+ $this->throwRedisException( $this->server, $conn, $e );
+ }
+ }
+ return true;
+ }
+
+ /**
+ * @see JobQueue::doDeduplicateRootJob()
+ * @param Job $job
+ * @return bool
+ * @throws MWException
+ */
+ protected function doDeduplicateRootJob( Job $job ) {
+ if ( !$job->hasRootJobParams() ) {
+ throw new MWException( "Cannot register root job; missing parameters." );
+ }
+ $params = $job->getRootJobParams();
+
+ $key = $this->getRootJobCacheKey( $params['rootJobSignature'] );
+
+ $conn = $this->getConnection();
+ try {
+ $timestamp = $conn->get( $key ); // current last timestamp of this job
+ if ( $timestamp && $timestamp >= $params['rootJobTimestamp'] ) {
+ return true; // a newer version of this root job was enqueued
+ }
+ // Update the timestamp of the last root job started at the location...
+ return $conn->set( $key, $params['rootJobTimestamp'], self::ROOTJOB_TTL ); // 2 weeks
+ } catch ( RedisException $e ) {
+ $this->throwRedisException( $this->server, $conn, $e );
+ }
+ }
+
+ /**
+ * @see JobQueue::doIsRootJobOldDuplicate()
+ * @param Job $job
+ * @return bool
+ */
+ protected function doIsRootJobOldDuplicate( Job $job ) {
+ if ( !$job->hasRootJobParams() ) {
+ return false; // job has no de-deplication info
+ }
+ $params = $job->getRootJobParams();
+
+ $conn = $this->getConnection();
+ try {
+ // Get the last time this root job was enqueued
+ $timestamp = $conn->get( $this->getRootJobCacheKey( $params['rootJobSignature'] ) );
+ } catch ( RedisException $e ) {
+ $this->throwRedisException( $this->server, $conn, $e );
+ }
+
+ // Check if a new root job was started at the location after this one's...
+ return ( $timestamp && $timestamp > $params['rootJobTimestamp'] );
+ }
+
+ /**
+ * @see JobQueue::doDelete()
+ * @return bool
+ */
+ protected function doDelete() {
+ static $props = array( 'l-unclaimed', 'z-claimed', 'z-abandoned',
+ 'z-delayed', 'h-idBySha1', 'h-sha1ById', 'h-attempts', 'h-data' );
+
+ $conn = $this->getConnection();
+ try {
+ $keys = array();
+ foreach ( $props as $prop ) {
+ $keys[] = $this->getQueueKey( $prop );
+ }
+ return ( $conn->delete( $keys ) !== false );
+ } catch ( RedisException $e ) {
+ $this->throwRedisException( $this->server, $conn, $e );
+ }
+ }
+
+ /**
+ * @see JobQueue::getAllQueuedJobs()
+ * @return Iterator
+ */
+ public function getAllQueuedJobs() {
+ $conn = $this->getConnection();
+ try {
+ $that = $this;
+ return new MappedIterator(
+ $conn->lRange( $this->getQueueKey( 'l-unclaimed' ), 0, -1 ),
+ function( $uid ) use ( $that, $conn ) {
+ return $that->getJobFromUidInternal( $uid, $conn );
+ },
+ array( 'accept' => function ( $job ) { return is_object( $job ); } )
+ );
+ } catch ( RedisException $e ) {
+ $this->throwRedisException( $this->server, $conn, $e );
+ }
+ }
+
+ /**
+ * @see JobQueue::getAllQueuedJobs()
+ * @return Iterator
+ */
+ public function getAllDelayedJobs() {
+ $conn = $this->getConnection();
+ try {
+ $that = $this;
+ return new MappedIterator( // delayed jobs
+ $conn->zRange( $this->getQueueKey( 'z-delayed' ), 0, -1 ),
+ function( $uid ) use ( $that, $conn ) {
+ return $that->getJobFromUidInternal( $uid, $conn );
+ },
+ array( 'accept' => function ( $job ) { return is_object( $job ); } )
+ );
+ } catch ( RedisException $e ) {
+ $this->throwRedisException( $this->server, $conn, $e );
+ }
+ }
+
+ public function getCoalesceLocationInternal() {
+ return "RedisServer:" . $this->server;
+ }
+
+ protected function doGetSiblingQueuesWithJobs( array $types ) {
+ return array_keys( array_filter( $this->doGetSiblingQueueSizes( $types ) ) );
+ }
+
+ protected function doGetSiblingQueueSizes( array $types ) {
+ $sizes = array(); // (type => size)
+ $types = array_values( $types ); // reindex
+ try {
+ $conn = $this->getConnection();
+ $conn->multi( Redis::PIPELINE );
+ foreach ( $types as $type ) {
+ $conn->lSize( $this->getQueueKey( 'l-unclaimed', $type ) );
+ }
+ $res = $conn->exec();
+ if ( is_array( $res ) ) {
+ foreach ( $res as $i => $size ) {
+ $sizes[$types[$i]] = $size;
+ }
+ }
+ } catch ( RedisException $e ) {
+ $this->throwRedisException( $this->server, $conn, $e );
+ }
+ return $sizes;
+ }
+
+ /**
+ * This function should not be called outside JobQueueRedis
+ *
+ * @param $uid string
+ * @param $conn RedisConnRef
+ * @return Job|bool Returns false if the job does not exist
+ * @throws MWException
+ */
+ public function getJobFromUidInternal( $uid, RedisConnRef $conn ) {
+ try {
+ $data = $conn->hGet( $this->getQueueKey( 'h-data' ), $uid );
+ if ( $data === false ) {
+ return false; // not found
+ }
+ $item = $this->unserialize( $conn->hGet( $this->getQueueKey( 'h-data' ), $uid ) );
+ if ( !is_array( $item ) ) { // this shouldn't happen
+ throw new MWException( "Could not find job with ID '$uid'." );
+ }
+ $title = Title::makeTitle( $item['namespace'], $item['title'] );
+ $job = Job::factory( $item['type'], $title, $item['params'] );
+ $job->metadata['uuid'] = $item['uuid'];
+ return $job;
+ } catch ( RedisException $e ) {
+ $this->throwRedisException( $this->server, $conn, $e );
+ }
+ }
+
+ /**
+ * Release any ready delayed jobs into the queue
+ *
+ * @return integer Number of jobs released
+ * @throws MWException
+ */
+ public function releaseReadyDelayedJobs() {
+ $count = 0;
+
+ $conn = $this->getConnection();
+ try {
+ static $script =
+<<<LUA
+ -- Get the list of ready delayed jobs, sorted by readiness
+ local ids = redis.call('zRangeByScore',KEYS[1],0,ARGV[1])
+ -- Migrate the jobs from the "delayed" set to the "unclaimed" list
+ for k,id in ipairs(ids) do
+ redis.call('lPush',KEYS[2],id)
+ redis.call('zRem',KEYS[1],id)
+ end
+ return #ids
+LUA;
+ $count += (int)$conn->luaEval( $script,
+ array(
+ $this->getQueueKey( 'z-delayed' ), // KEYS[1]
+ $this->getQueueKey( 'l-unclaimed' ), // KEYS[2]
+ time() // ARGV[1]; max "delay until" UNIX timestamp
+ ),
+ 2 # first two arguments are keys
+ );
+ } catch ( RedisException $e ) {
+ $this->throwRedisException( $this->server, $conn, $e );
+ }
+
+ return $count;
+ }
+
+ /**
+ * Recycle or destroy any jobs that have been claimed for too long
+ *
+ * @return integer Number of jobs recycled/deleted
+ * @throws MWException
+ */
+ public function recycleAndDeleteStaleJobs() {
+ if ( $this->claimTTL <= 0 ) { // sanity
+ throw new MWException( "Cannot recycle jobs since acknowledgements are disabled." );
+ }
+ $count = 0;
+ // For each job item that can be retried, we need to add it back to the
+ // main queue and remove it from the list of currenty claimed job items.
+ // For those that cannot, they are marked as dead and kept around for
+ // investigation and manual job restoration but are eventually deleted.
+ $conn = $this->getConnection();
+ try {
+ $now = time();
+ static $script =
+<<<LUA
+ local released,abandoned,pruned = 0,0,0
+ -- Get all non-dead jobs that have an expired claim on them.
+ -- The score for each item is the last claim timestamp (UNIX).
+ local staleClaims = redis.call('zRangeByScore',KEYS[1],0,ARGV[1])
+ for k,id in ipairs(staleClaims) do
+ local timestamp = redis.call('zScore',KEYS[1],id)
+ local attempts = redis.call('hGet',KEYS[2],id)
+ if attempts < ARGV[3] then
+ -- Claim expired and retries left: re-enqueue the job
+ redis.call('lPush',KEYS[3],id)
+ redis.call('hIncrBy',KEYS[2],id,1)
+ released = released + 1
+ else
+ -- Claim expired and no retries left: mark the job as dead
+ redis.call('zAdd',KEYS[5],timestamp,id)
+ abandoned = abandoned + 1
+ end
+ redis.call('zRem',KEYS[1],id)
+ end
+ -- Get all of the dead jobs that have been marked as dead for too long.
+ -- The score for each item is the last claim timestamp (UNIX).
+ local deadClaims = redis.call('zRangeByScore',KEYS[5],0,ARGV[2])
+ for k,id in ipairs(deadClaims) do
+ -- Stale and out of retries: remove any traces of the job
+ redis.call('zRem',KEYS[5],id)
+ redis.call('hDel',KEYS[2],id)
+ redis.call('hDel',KEYS[4],id)
+ pruned = pruned + 1
+ end
+ return {released,abandoned,pruned}
+LUA;
+ $res = $conn->luaEval( $script,
+ array(
+ $this->getQueueKey( 'z-claimed' ), # KEYS[1]
+ $this->getQueueKey( 'h-attempts' ), # KEYS[2]
+ $this->getQueueKey( 'l-unclaimed' ), # KEYS[3]
+ $this->getQueueKey( 'h-data' ), # KEYS[4]
+ $this->getQueueKey( 'z-abandoned' ), # KEYS[5]
+ $now - $this->claimTTL, # ARGV[1]
+ $now - self::MAX_AGE_PRUNE, # ARGV[2]
+ $this->maxTries # ARGV[3]
+ ),
+ 5 # number of first argument(s) that are keys
+ );
+ if ( $res ) {
+ list( $released, $abandoned, $pruned ) = $res;
+ $count += $released + $pruned;
+ JobQueue::incrStats( 'job-recycle', $this->type, $released );
+ JobQueue::incrStats( 'job-abandon', $this->type, $abandoned );
+ }
+ } catch ( RedisException $e ) {
+ $this->throwRedisException( $this->server, $conn, $e );
+ }
+
+ return $count;
+ }
+
+ /**
+ * @return Array
+ */
+ protected function doGetPeriodicTasks() {
+ $tasks = array();
+ if ( $this->claimTTL > 0 ) {
+ $tasks['recycleAndDeleteStaleJobs'] = array(
+ 'callback' => array( $this, 'recycleAndDeleteStaleJobs' ),
+ 'period' => ceil( $this->claimTTL / 2 )
+ );
+ }
+ if ( $this->checkDelay ) {
+ $tasks['releaseReadyDelayedJobs'] = array(
+ 'callback' => array( $this, 'releaseReadyDelayedJobs' ),
+ 'period' => 300 // 5 minutes
+ );
+ }
+ return $tasks;
+ }
+
+ /**
+ * @param $job Job
+ * @return array
+ */
+ protected function getNewJobFields( Job $job ) {
+ return array(
+ // Fields that describe the nature of the job
+ 'type' => $job->getType(),
+ 'namespace' => $job->getTitle()->getNamespace(),
+ 'title' => $job->getTitle()->getDBkey(),
+ 'params' => $job->getParams(),
+ // Some jobs cannot run until a "release timestamp"
+ 'rtimestamp' => $job->getReleaseTimestamp() ?: 0,
+ // Additional job metadata
+ 'uuid' => UIDGenerator::newRawUUIDv4( UIDGenerator::QUICK_RAND ),
+ 'sha1' => $job->ignoreDuplicates()
+ ? wfBaseConvert( sha1( serialize( $job->getDeduplicationInfo() ) ), 16, 36, 31 )
+ : '',
+ 'timestamp' => time() // UNIX timestamp
+ );
+ }
+
+ /**
+ * @param $fields array
+ * @return Job|bool
+ */
+ protected function getJobFromFields( array $fields ) {
+ $title = Title::makeTitleSafe( $fields['namespace'], $fields['title'] );
+ if ( $title ) {
+ $job = Job::factory( $fields['type'], $title, $fields['params'] );
+ $job->metadata['uuid'] = $fields['uuid'];
+ return $job;
+ }
+ return false;
+ }
+
+ /**
+ * @param array $fields
+ * @return string Serialized and possibly compressed version of $fields
+ */
+ protected function serialize( array $fields ) {
+ $blob = serialize( $fields );
+ if ( $this->compression === 'gzip'
+ && strlen( $blob ) >= 1024 && function_exists( 'gzdeflate' ) )
+ {
+ $object = (object)array( 'blob' => gzdeflate( $blob ), 'enc' => 'gzip' );
+ $blobz = serialize( $object );
+ return ( strlen( $blobz ) < strlen( $blob ) ) ? $blobz : $blob;
+ } else {
+ return $blob;
+ }
+ }
+
+ /**
+ * @param string $blob
+ * @return array|bool Unserialized version of $blob or false
+ */
+ protected function unserialize( $blob ) {
+ $fields = unserialize( $blob );
+ if ( is_object( $fields ) ) {
+ if ( $fields->enc === 'gzip' && function_exists( 'gzinflate' ) ) {
+ $fields = unserialize( gzinflate( $fields->blob ) );
+ } else {
+ $fields = false;
+ }
+ }
+ return is_array( $fields ) ? $fields : false;
+ }
+
+ /**
+ * Get a connection to the server that handles all sub-queues for this queue
+ *
+ * @return Array (server name, Redis instance)
+ * @throws MWException
+ */
+ protected function getConnection() {
+ $conn = $this->redisPool->getConnection( $this->server );
+ if ( !$conn ) {
+ throw new JobQueueConnectionError( "Unable to connect to redis server." );
+ }
+ return $conn;
+ }
+
+ /**
+ * @param $server string
+ * @param $conn RedisConnRef
+ * @param $e RedisException
+ * @throws MWException
+ */
+ protected function throwRedisException( $server, RedisConnRef $conn, $e ) {
+ $this->redisPool->handleException( $server, $conn, $e );
+ throw new JobQueueError( "Redis server error: {$e->getMessage()}\n" );
+ }
+
+ /**
+ * @param $prop string
+ * @param $type string|null
+ * @return string
+ */
+ private function getQueueKey( $prop, $type = null ) {
+ $type = is_string( $type ) ? $type : $this->type;
+ list( $db, $prefix ) = wfSplitWikiID( $this->wiki );
+ if ( strlen( $this->key ) ) { // namespaced queue (for testing)
+ return wfForeignMemcKey( $db, $prefix, 'jobqueue', $type, $this->key, $prop );
+ } else {
+ return wfForeignMemcKey( $db, $prefix, 'jobqueue', $type, $prop );
+ }
+ }
+
+ /**
+ * @param $key string
+ * @return void
+ */
+ public function setTestingPrefix( $key ) {
+ $this->key = $key;
+ }
+}
diff --git a/includes/job/JobQueueAggregator.php b/includes/job/aggregator/JobQueueAggregator.php
index 3dba3c53..a8186abd 100644
--- a/includes/job/JobQueueAggregator.php
+++ b/includes/job/aggregator/JobQueueAggregator.php
@@ -119,6 +119,23 @@ abstract class JobQueueAggregator {
abstract protected function doGetAllReadyWikiQueues();
/**
+ * Purge all of the aggregator information
+ *
+ * @return bool Success
+ */
+ final public function purge() {
+ wfProfileIn( __METHOD__ );
+ $res = $this->doPurge();
+ wfProfileOut( __METHOD__ );
+ return $res;
+ }
+
+ /**
+ * @see JobQueueAggregator::purge()
+ */
+ abstract protected function doPurge();
+
+ /**
* Get all databases that have a pending job.
* This poll all the queues and is this expensive.
*
diff --git a/includes/job/JobQueueAggregatorMemc.php b/includes/job/aggregator/JobQueueAggregatorMemc.php
index 4b82cf92..9434da04 100644
--- a/includes/job/JobQueueAggregatorMemc.php
+++ b/includes/job/aggregator/JobQueueAggregatorMemc.php
@@ -91,9 +91,9 @@ class JobQueueAggregatorMemc extends JobQueueAggregator {
if ( $this->cache->add( "$key:rebuild", 1, 1800 ) ) { // lock
$pendingDbInfo = array(
'pendingDBs' => $this->findPendingWikiQueues(),
- 'timestamp' => time()
+ 'timestamp' => time()
);
- for ( $attempts=1; $attempts <= 25; ++$attempts ) {
+ for ( $attempts = 1; $attempts <= 25; ++$attempts ) {
if ( $this->cache->add( "$key:lock", 1, 60 ) ) { // lock
$this->cache->set( $key, $pendingDbInfo );
$this->cache->delete( "$key:lock" ); // unlock
@@ -109,6 +109,13 @@ class JobQueueAggregatorMemc extends JobQueueAggregator {
}
/**
+ * @see JobQueueAggregator::doPurge()
+ */
+ protected function doPurge() {
+ return $this->cache->delete( $this->getReadyQueueCacheKey() );
+ }
+
+ /**
* @return string
*/
private function getReadyQueueCacheKey() {
diff --git a/includes/job/JobQueueAggregatorRedis.php b/includes/job/aggregator/JobQueueAggregatorRedis.php
index 74e9171c..c6a799df 100644
--- a/includes/job/JobQueueAggregatorRedis.php
+++ b/includes/job/aggregator/JobQueueAggregatorRedis.php
@@ -25,6 +25,7 @@
* Class to handle tracking information about all queues using PhpRedis
*
* @ingroup JobQueue
+ * @ingroup Redis
* @since 1.21
*/
class JobQueueAggregatorRedis extends JobQueueAggregator {
@@ -100,8 +101,18 @@ class JobQueueAggregatorRedis extends JobQueueAggregator {
$pendingDBs[$type][] = $wiki;
}
} else { // cache miss
+ // Avoid duplicated effort
+ $conn->multi( Redis::MULTI );
+ $conn->setnx( $this->getReadyQueueKey() . ":lock", 1 );
+ $conn->expire( $this->getReadyQueueKey() . ":lock", 3600 );
+ if ( $conn->exec() !== array( true, true ) ) { // lock
+ return array(); // already in progress
+ }
+
$pendingDBs = $this->findPendingWikiQueues(); // (type => list of wikis)
+ $conn->delete( $this->getReadyQueueKey() . ":lock" ); // unlock
+
$now = time();
$map = array();
foreach ( $pendingDBs as $type => $wikis ) {
@@ -120,6 +131,23 @@ class JobQueueAggregatorRedis extends JobQueueAggregator {
}
/**
+ * @see JobQueueAggregator::doPurge()
+ */
+ protected function doPurge() {
+ $conn = $this->getConnection();
+ if ( !$conn ) {
+ return false;
+ }
+ try {
+ $conn->delete( $this->getReadyQueueKey() );
+ } catch ( RedisException $e ) {
+ $this->handleException( $conn, $e );
+ return false;
+ }
+ return true;
+ }
+
+ /**
* Get a connection to the server that handles all sub-queues for this queue
*
* @return Array (server name, Redis instance)
diff --git a/includes/job/jobs/AssembleUploadChunksJob.php b/includes/job/jobs/AssembleUploadChunksJob.php
index c5dd9eaa..6237e568 100644
--- a/includes/job/jobs/AssembleUploadChunksJob.php
+++ b/includes/job/jobs/AssembleUploadChunksJob.php
@@ -42,6 +42,15 @@ class AssembleUploadChunksJob extends Job {
return false;
}
+ if ( count( $_SESSION ) === 0 ) {
+ // Empty session probably indicates that we didn't associate
+ // with the session correctly. Note that being able to load
+ // the user does not necessarily mean the session was loaded.
+ // Most likely cause by suhosin.session.encrypt = On.
+ $this->setLastError( "Error associating with user session. Try setting suhosin.session.encrypt = Off" );
+ return false;
+ }
+
UploadBase::setSessionStatus(
$this->params['filekey'],
array( 'result' => 'Poll', 'stage' => 'assembling', 'status' => Status::newGood() )
@@ -82,11 +91,11 @@ class AssembleUploadChunksJob extends Job {
UploadBase::setSessionStatus(
$this->params['filekey'],
array(
- 'result' => 'Success',
- 'stage' => 'assembling',
- 'filekey' => $newFileKey,
+ 'result' => 'Success',
+ 'stage' => 'assembling',
+ 'filekey' => $newFileKey,
'imageinfo' => $imageInfo,
- 'status' => Status::newGood()
+ 'status' => Status::newGood()
)
);
} catch ( MWException $e ) {
@@ -94,7 +103,7 @@ class AssembleUploadChunksJob extends Job {
$this->params['filekey'],
array(
'result' => 'Failure',
- 'stage' => 'assembling',
+ 'stage' => 'assembling',
'status' => Status::newFatal( 'api-error-stashfailed' )
)
);
diff --git a/includes/job/jobs/DoubleRedirectJob.php b/includes/job/jobs/DoubleRedirectJob.php
index 05abeeef..33e749b8 100644
--- a/includes/job/jobs/DoubleRedirectJob.php
+++ b/includes/job/jobs/DoubleRedirectJob.php
@@ -90,40 +90,40 @@ class DoubleRedirectJob extends Job {
$targetRev = Revision::newFromTitle( $this->title, false, Revision::READ_LATEST );
if ( !$targetRev ) {
- wfDebug( __METHOD__.": target redirect already deleted, ignoring\n" );
+ wfDebug( __METHOD__ . ": target redirect already deleted, ignoring\n" );
return true;
}
$content = $targetRev->getContent();
$currentDest = $content ? $content->getRedirectTarget() : null;
if ( !$currentDest || !$currentDest->equals( $this->redirTitle ) ) {
- wfDebug( __METHOD__.": Redirect has changed since the job was queued\n" );
+ wfDebug( __METHOD__ . ": Redirect has changed since the job was queued\n" );
return true;
}
- # Check for a suppression tag (used e.g. in periodically archived discussions)
+ // Check for a suppression tag (used e.g. in periodically archived discussions)
$mw = MagicWord::get( 'staticredirect' );
if ( $content->matchMagicWord( $mw ) ) {
- wfDebug( __METHOD__.": skipping: suppressed with __STATICREDIRECT__\n" );
+ wfDebug( __METHOD__ . ": skipping: suppressed with __STATICREDIRECT__\n" );
return true;
}
- # Find the current final destination
+ // Find the current final destination
$newTitle = self::getFinalDestination( $this->redirTitle );
if ( !$newTitle ) {
- wfDebug( __METHOD__.": skipping: single redirect, circular redirect or invalid redirect destination\n" );
+ wfDebug( __METHOD__ . ": skipping: single redirect, circular redirect or invalid redirect destination\n" );
return true;
}
if ( $newTitle->equals( $this->redirTitle ) ) {
- # The redirect is already right, no need to change it
- # This can happen if the page was moved back (say after vandalism)
- wfDebug( __METHOD__.": skipping, already good\n" );
+ // The redirect is already right, no need to change it
+ // This can happen if the page was moved back (say after vandalism)
+ wfDebug( __METHOD__ . " : skipping, already good\n" );
}
- # Preserve fragment (bug 14904)
+ // Preserve fragment (bug 14904)
$newTitle = Title::makeTitle( $newTitle->getNamespace(), $newTitle->getDBkey(),
$currentDest->getFragment(), $newTitle->getInterwiki() );
- # Fix the text
+ // Fix the text
$newContent = $content->updateRedirect( $newTitle );
if ( $newContent->equals( $content ) ) {
@@ -137,11 +137,13 @@ class DoubleRedirectJob extends Job {
return false;
}
- # Save it
+ // Save it
global $wgUser;
$oldUser = $wgUser;
$wgUser = $user;
$article = WikiPage::factory( $this->title );
+
+ // Messages: double-redirect-fixed-move, double-redirect-fixed-maintenance
$reason = wfMessage( 'double-redirect-fixed-' . $this->reason,
$this->redirTitle->getPrefixedText(), $newTitle->getPrefixedText()
)->inContentLanguage()->text();
@@ -161,7 +163,8 @@ class DoubleRedirectJob extends Job {
public static function getFinalDestination( $title ) {
$dbw = wfGetDB( DB_MASTER );
- $seenTitles = array(); # Circular redirect check
+ // Circular redirect check
+ $seenTitles = array();
$dest = false;
while ( true ) {
diff --git a/includes/job/jobs/DuplicateJob.php b/includes/job/jobs/DuplicateJob.php
index 524983b8..be1bfe5c 100644
--- a/includes/job/jobs/DuplicateJob.php
+++ b/includes/job/jobs/DuplicateJob.php
@@ -45,7 +45,7 @@ final class DuplicateJob extends Job {
* @return Job
*/
public static function newFromJob( Job $job ) {
- $djob = new self( $job->getTitle(), $job->getParams(), $job->getId() );
+ $djob = new self( $job->getTitle(), $job->getParams(), $job->id );
$djob->command = $job->getType();
$djob->params = is_array( $djob->params ) ? $djob->params : array();
$djob->params = array( 'isDuplicate' => true ) + $djob->params;
diff --git a/includes/job/jobs/EnotifNotifyJob.php b/includes/job/jobs/EnotifNotifyJob.php
index 2be05b63..bbe988d0 100644
--- a/includes/job/jobs/EnotifNotifyJob.php
+++ b/includes/job/jobs/EnotifNotifyJob.php
@@ -35,7 +35,7 @@ class EnotifNotifyJob extends Job {
function run() {
$enotif = new EmailNotification();
// Get the user from ID (rename safe). Anons are 0, so defer to name.
- if( isset( $this->params['editorID'] ) && $this->params['editorID'] ) {
+ if ( isset( $this->params['editorID'] ) && $this->params['editorID'] ) {
$editor = User::newFromId( $this->params['editorID'] );
// B/C, only the name might be given.
} else {
diff --git a/includes/job/jobs/HTMLCacheUpdateJob.php b/includes/job/jobs/HTMLCacheUpdateJob.php
index 818c6abf..44c240bb 100644
--- a/includes/job/jobs/HTMLCacheUpdateJob.php
+++ b/includes/job/jobs/HTMLCacheUpdateJob.php
@@ -79,8 +79,16 @@ class HTMLCacheUpdateJob extends Job {
* Update all of the backlinks
*/
protected function doFullUpdate() {
+ global $wgMaxBacklinksInvalidate;
+
# Get an estimate of the number of rows from the BacklinkCache
- $numRows = $this->blCache->getNumLinks( $this->params['table'] );
+ $max = max( $this->rowsPerJob * 2, $wgMaxBacklinksInvalidate ) + 1;
+ $numRows = $this->blCache->getNumLinks( $this->params['table'], $max );
+ if ( $wgMaxBacklinksInvalidate !== false && $numRows > $wgMaxBacklinksInvalidate ) {
+ wfDebug( "Skipped HTML cache invalidation of {$this->title->getPrefixedText()}." );
+ return true;
+ }
+
if ( $numRows > $this->rowsPerJob * 2 ) {
# Do fast cached partition
$this->insertPartitionJobs();
@@ -90,12 +98,13 @@ class HTMLCacheUpdateJob extends Job {
# Check if the row count estimate was correct
if ( $titleArray->count() > $this->rowsPerJob * 2 ) {
# Not correct, do accurate partition
- wfDebug( __METHOD__.": row count estimate was incorrect, repartitioning\n" );
+ wfDebug( __METHOD__ . ": row count estimate was incorrect, repartitioning\n" );
$this->insertJobsFromTitles( $titleArray );
} else {
$this->invalidateTitles( $titleArray ); // just do the query
}
}
+
return true;
}
@@ -145,7 +154,7 @@ class HTMLCacheUpdateJob extends Job {
array(
'table' => $this->params['table'],
'start' => $start,
- 'end' => $id - 1
+ 'end' => $id - 1
) + $rootJobParams // carry over information for de-duplication
);
$start = $id;
@@ -158,16 +167,16 @@ class HTMLCacheUpdateJob extends Job {
array(
'table' => $this->params['table'],
'start' => $start,
- 'end' => $this->params['end']
+ 'end' => $this->params['end']
) + $rootJobParams // carry over information for de-duplication
);
- wfDebug( __METHOD__.": repartitioning into " . count( $jobs ) . " jobs\n" );
+ wfDebug( __METHOD__ . ": repartitioning into " . count( $jobs ) . " jobs\n" );
if ( count( $jobs ) < 2 ) {
# I don't think this is possible at present, but handling this case
# makes the code a bit more robust against future code updates and
# avoids a potential infinite loop of repartitioning
- wfDebug( __METHOD__.": repartitioning failed!\n" );
+ wfDebug( __METHOD__ . ": repartitioning failed!\n" );
$this->invalidateTitles( $titleArray );
} else {
JobQueueGroup::singleton()->push( $jobs );
@@ -194,7 +203,7 @@ class HTMLCacheUpdateJob extends Job {
array(
'table' => $this->params['table'],
'start' => $start,
- 'end' => $end,
+ 'end' => $end,
) + $rootJobParams // carry over information for de-duplication
);
}
@@ -245,7 +254,7 @@ class HTMLCacheUpdateJob extends Job {
}
# Update file cache
- if ( $wgUseFileCache ) {
+ if ( $wgUseFileCache ) {
foreach ( $titleArray as $title ) {
HTMLFileCache::clearFileCache( $title );
}
diff --git a/includes/job/jobs/NullJob.php b/includes/job/jobs/NullJob.php
index d282a8e6..b6164a5d 100644
--- a/includes/job/jobs/NullJob.php
+++ b/includes/job/jobs/NullJob.php
@@ -26,6 +26,22 @@
* in the queue and/or sleep for a brief time period. These can be used
* to represent "no-op" jobs or test lock contention and performance.
*
+ * @par Example:
+ * Inserting a null job in the configured job queue:
+ * @code
+ * $ php maintenance/eval.php
+ * > $queue = JobQueueGroup::singleton();
+ * > $job = new NullJob( Title::newMainPage(), array( 'lives' => 10 ) );
+ * > $queue->push( $job );
+ * @endcode
+ * You can then confirm the job has been enqueued by using the showJobs.php
+ * maintenance utility:
+ * @code
+ * $ php maintenance/showJobs.php --group
+ * null: 1 queue; 0 claimed (0 active, 0 abandoned)
+ * $
+ * @endcode
+ *
* @ingroup JobQueue
*/
class NullJob extends Job {
diff --git a/includes/job/jobs/PublishStashedFileJob.php b/includes/job/jobs/PublishStashedFileJob.php
index d3feda28..5a24f93c 100644
--- a/includes/job/jobs/PublishStashedFileJob.php
+++ b/includes/job/jobs/PublishStashedFileJob.php
@@ -42,13 +42,23 @@ class PublishStashedFileJob extends Job {
return false;
}
+ if ( count( $_SESSION ) === 0 ) {
+ // Empty session probably indicates that we didn't associate
+ // with the session correctly. Note that being able to load
+ // the user does not necessarily mean the session was loaded.
+ // Most likely cause by suhosin.session.encrypt = On.
+ $this->setLastError( "Error associating with user session. Try setting suhosin.session.encrypt = Off" );
+ return false;
+ }
+
+
UploadBase::setSessionStatus(
$this->params['filekey'],
array( 'result' => 'Poll', 'stage' => 'publish', 'status' => Status::newGood() )
);
$upload = new UploadFromStash( $user );
- // @TODO: initialize() causes a GET, ideally we could frontload the antivirus
+ // @todo initialize() causes a GET, ideally we could frontload the antivirus
// checks and anything else to the stash stage (which includes concatenation and
// the local file is thus already there). That way, instead of GET+PUT, there could
// just be a COPY operation from the stash to the public zone.
@@ -94,11 +104,11 @@ class PublishStashedFileJob extends Job {
UploadBase::setSessionStatus(
$this->params['filekey'],
array(
- 'result' => 'Success',
- 'stage' => 'publish',
- 'filename' => $upload->getLocalFile()->getName(),
+ 'result' => 'Success',
+ 'stage' => 'publish',
+ 'filename' => $upload->getLocalFile()->getName(),
'imageinfo' => $imageInfo,
- 'status' => Status::newGood()
+ 'status' => Status::newGood()
)
);
} catch ( MWException $e ) {
@@ -106,7 +116,7 @@ class PublishStashedFileJob extends Job {
$this->params['filekey'],
array(
'result' => 'Failure',
- 'stage' => 'publish',
+ 'stage' => 'publish',
'status' => Status::newFatal( 'api-error-publishfailed' )
)
);
diff --git a/includes/job/jobs/RefreshLinksJob.php b/includes/job/jobs/RefreshLinksJob.php
index 9dbe8278..4fc8bac6 100644
--- a/includes/job/jobs/RefreshLinksJob.php
+++ b/includes/job/jobs/RefreshLinksJob.php
@@ -37,21 +37,18 @@ class RefreshLinksJob extends Job {
* @return boolean success
*/
function run() {
- wfProfileIn( __METHOD__ );
-
$linkCache = LinkCache::singleton();
$linkCache->clear();
if ( is_null( $this->title ) ) {
$this->error = "refreshLinks: Invalid title";
- wfProfileOut( __METHOD__ );
return false;
}
# Wait for the DB of the current/next slave DB handle to catch up to the master.
# This way, we get the correct page_latest for templates or files that just changed
# milliseconds ago, having triggered this job to begin with.
- if ( isset( $this->params['masterPos'] ) ) {
+ if ( isset( $this->params['masterPos'] ) && $this->params['masterPos'] !== false ) {
wfGetLB()->waitFor( $this->params['masterPos'] );
}
@@ -59,13 +56,11 @@ class RefreshLinksJob extends Job {
if ( !$revision ) {
$this->error = 'refreshLinks: Article not found "' .
$this->title->getPrefixedDBkey() . '"';
- wfProfileOut( __METHOD__ );
return false; // XXX: what if it was just deleted?
}
self::runForTitleInternal( $this->title, $revision, __METHOD__ );
- wfProfileOut( __METHOD__ );
return true;
}
@@ -101,6 +96,9 @@ class RefreshLinksJob extends Job {
$updates = $content->getSecondaryDataUpdates( $title, null, false, $parserOutput );
DataUpdate::runUpdates( $updates );
+
+ InfoAction::invalidateCache( $title );
+
wfProfileOut( $fname );
}
}
@@ -114,6 +112,8 @@ class RefreshLinksJob extends Job {
class RefreshLinksJob2 extends Job {
function __construct( $title, $params, $id = 0 ) {
parent::__construct( 'refreshLinks2', $title, $params, $id );
+ // Base jobs for large templates can easily be de-duplicated
+ $this->removeDuplicates = !isset( $params['start'] ) && !isset( $params['end'] );
}
/**
@@ -123,14 +123,11 @@ class RefreshLinksJob2 extends Job {
function run() {
global $wgUpdateRowsPerJob;
- wfProfileIn( __METHOD__ );
-
$linkCache = LinkCache::singleton();
$linkCache->clear();
if ( is_null( $this->title ) ) {
$this->error = "refreshLinks2: Invalid title";
- wfProfileOut( __METHOD__ );
return false;
}
@@ -144,7 +141,7 @@ class RefreshLinksJob2 extends Job {
// Hopefully, when leaf jobs are popped, the slaves will have reached that position.
if ( isset( $this->params['masterPos'] ) ) {
$masterPos = $this->params['masterPos'];
- } elseif ( wfGetLB()->getServerCount() > 1 ) {
+ } elseif ( wfGetLB()->getServerCount() > 1 ) {
$masterPos = wfGetLB()->getMasterPos();
} else {
$masterPos = false;
@@ -158,7 +155,7 @@ class RefreshLinksJob2 extends Job {
$jobs = array_merge( $jobs, $this->getSingleTitleJobs( $table, $masterPos ) );
} else {
# This is a base job to trigger the insertion of partitioned jobs...
- if ( $tbc->getNumLinks( $table ) <= $wgUpdateRowsPerJob ) {
+ if ( $tbc->getNumLinks( $table, $wgUpdateRowsPerJob + 1 ) <= $wgUpdateRowsPerJob ) {
# Just directly insert the single per-title jobs
$jobs = array_merge( $jobs, $this->getSingleTitleJobs( $table, $masterPos ) );
} else {
@@ -167,10 +164,10 @@ class RefreshLinksJob2 extends Job {
list( $start, $end ) = $batch;
$jobs[] = new RefreshLinksJob2( $this->title,
array(
- 'table' => $table,
- 'start' => $start,
- 'end' => $end,
- 'masterPos' => $masterPos,
+ 'table' => $table,
+ 'start' => $start,
+ 'end' => $end,
+ 'masterPos' => $masterPos,
) + $this->getRootJobParams() // carry over information for de-duplication
);
}
@@ -181,7 +178,6 @@ class RefreshLinksJob2 extends Job {
JobQueueGroup::singleton()->push( $jobs );
}
- wfProfileOut( __METHOD__ );
return true;
}
diff --git a/includes/job/jobs/UploadFromUrlJob.php b/includes/job/jobs/UploadFromUrlJob.php
index 87549140..c993cfb4 100644
--- a/includes/job/jobs/UploadFromUrlJob.php
+++ b/includes/job/jobs/UploadFromUrlJob.php
@@ -48,6 +48,7 @@ class UploadFromUrlJob extends Job {
}
public function run() {
+ global $wgCopyUploadAsyncTimeout;
# Initialize this object and the upload object
$this->upload = new UploadFromUrl();
$this->upload->initialize(
@@ -58,7 +59,11 @@ class UploadFromUrlJob extends Job {
$this->user = User::newFromName( $this->params['userName'] );
# Fetch the file
- $status = $this->upload->fetchFile();
+ $opts = array();
+ if ( $wgCopyUploadAsyncTimeout ) {
+ $opts['timeout'] = $wgCopyUploadAsyncTimeout;
+ }
+ $status = $this->upload->fetchFile( $opts );
if ( !$status->isOk() ) {
$this->leaveMessage( $status );
return true;
diff --git a/includes/json/FormatJson.php b/includes/json/FormatJson.php
index eececcba..d6116512 100644
--- a/includes/json/FormatJson.php
+++ b/includes/json/FormatJson.php
@@ -1,6 +1,6 @@
<?php
/**
- * Simple wrapper for json_encode and json_decode that falls back on Services_JSON class.
+ * Wrapper for json_encode and json_decode.
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
@@ -20,50 +20,217 @@
* @file
*/
-require_once __DIR__ . '/Services_JSON.php';
-
/**
* JSON formatter wrapper class
*/
class FormatJson {
/**
+ * Skip escaping most characters above U+007F for readability and compactness.
+ * This encoding option saves 3 to 8 bytes (uncompressed) for each such character;
+ * however, it could break compatibility with systems that incorrectly handle UTF-8.
+ *
+ * @since 1.22
+ */
+ const UTF8_OK = 1;
+
+ /**
+ * Skip escaping the characters '<', '>', and '&', which have special meanings in
+ * HTML and XML.
+ *
+ * @warning Do not use this option for JSON that could end up in inline scripts.
+ * - HTML5, §4.3.1.2 Restrictions for contents of script elements
+ * - XML 1.0 (5th Ed.), §2.4 Character Data and Markup
+ *
+ * @since 1.22
+ */
+ const XMLMETA_OK = 2;
+
+ /**
+ * Skip escaping as many characters as reasonably possible.
+ *
+ * @warning When generating inline script blocks, use FormatJson::UTF8_OK instead.
+ *
+ * @since 1.22
+ */
+ const ALL_OK = 3;
+
+ /**
+ * Regex that matches whitespace inside empty arrays and objects.
+ *
+ * This doesn't affect regular strings inside the JSON because those can't
+ * have a real line break (\n) in them, at this point they are already escaped
+ * as the string "\n" which this doesn't match.
+ *
+ * @private
+ */
+ const WS_CLEANUP_REGEX = '/(?<=[\[{])\n\s*+(?=[\]}])/';
+
+ /**
+ * Characters problematic in JavaScript.
+ *
+ * @note These are listed in ECMA-262 (5.1 Ed.), §7.3 Line Terminators along with U+000A (LF)
+ * and U+000D (CR). However, PHP already escapes LF and CR according to RFC 4627.
+ */
+ private static $badChars = array(
+ "\xe2\x80\xa8", // U+2028 LINE SEPARATOR
+ "\xe2\x80\xa9", // U+2029 PARAGRAPH SEPARATOR
+ );
+
+ /**
+ * Escape sequences for characters listed in FormatJson::$badChars.
+ */
+ private static $badCharsEscaped = array(
+ '\u2028', // U+2028 LINE SEPARATOR
+ '\u2029', // U+2029 PARAGRAPH SEPARATOR
+ );
+
+ /**
* Returns the JSON representation of a value.
*
- * @param $value Mixed: the value being encoded. Can be any type except a resource.
- * @param $pretty Boolean: If true, adds non-significant whitespace to improve readability.
+ * @note Empty arrays are encoded as numeric arrays, not as objects, so cast any associative
+ * array that might be empty to an object before encoding it.
*
- * @return string
+ * @note In pre-1.22 versions of MediaWiki, using this function for generating inline script
+ * blocks may result in an XSS vulnerability, and quite likely will in XML documents
+ * (cf. FormatJson::XMLMETA_OK). Use Xml::encodeJsVar() instead in such cases.
+ *
+ * @param mixed $value The value to encode. Can be any type except a resource.
+ * @param bool $pretty If true, add non-significant whitespace to improve readability.
+ * @param int $escaping Bitfield consisting of _OK class constants
+ * @return string|bool: String if successful; false upon failure
*/
- public static function encode( $value, $pretty = false ) {
- if ( !function_exists( 'json_encode' ) || ( $pretty && version_compare( PHP_VERSION, '5.4.0', '<' ) ) ) {
- $json = new Services_JSON();
- return $json->encode( $value, $pretty );
- } else {
- return json_encode( $value, $pretty ? JSON_PRETTY_PRINT : 0 );
+ public static function encode( $value, $pretty = false, $escaping = 0 ) {
+ if ( defined( 'JSON_UNESCAPED_UNICODE' ) ) {
+ return self::encode54( $value, $pretty, $escaping );
}
+ return self::encode53( $value, $pretty, $escaping );
}
/**
* Decodes a JSON string.
*
- * @param string $value the json string being decoded.
- * @param $assoc Boolean: when true, returned objects will be converted into associative arrays.
+ * @param string $value The JSON string being decoded
+ * @param bool $assoc 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.
+ * @return mixed: the value encoded in JSON in appropriate PHP type.
+ * `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' ) ) {
- $json = $assoc ? new Services_JSON( SERVICES_JSON_LOOSE_TYPE ) :
- new Services_JSON();
- $jsonDec = $json->decode( $value );
- return $jsonDec;
- } else {
- return json_decode( $value, $assoc );
+ return json_decode( $value, $assoc );
+ }
+
+ /**
+ * JSON encoder wrapper for PHP >= 5.4, which supports useful encoding options.
+ *
+ * @param mixed $value
+ * @param bool $pretty
+ * @param int $escaping
+ * @return string|bool
+ */
+ private static function encode54( $value, $pretty, $escaping ) {
+ // PHP escapes '/' to prevent breaking out of inline script blocks using '</script>',
+ // which is hardly useful when '<' and '>' are escaped (and inadequate), and such
+ // escaping negatively impacts the human readability of URLs and similar strings.
+ $options = JSON_UNESCAPED_SLASHES;
+ $options |= $pretty ? JSON_PRETTY_PRINT : 0;
+ $options |= ( $escaping & self::UTF8_OK ) ? JSON_UNESCAPED_UNICODE : 0;
+ $options |= ( $escaping & self::XMLMETA_OK ) ? 0 : ( JSON_HEX_TAG | JSON_HEX_AMP );
+ $json = json_encode( $value, $options );
+ if ( $json === false ) {
+ return false;
}
+
+ if ( $pretty ) {
+ // Remove whitespace inside empty arrays/objects; different JSON encoders
+ // vary on this, and we want our output to be consistent across implementations.
+ $json = preg_replace( self::WS_CLEANUP_REGEX, '', $json );
+ }
+ if ( $escaping & self::UTF8_OK ) {
+ $json = str_replace( self::$badChars, self::$badCharsEscaped, $json );
+ }
+ return $json;
}
+ /**
+ * JSON encoder wrapper for PHP 5.3, which lacks native support for some encoding options.
+ * Therefore, the missing options are implemented here purely in PHP code.
+ *
+ * @param mixed $value
+ * @param bool $pretty
+ * @param int $escaping
+ * @return string|bool
+ */
+ private static function encode53( $value, $pretty, $escaping ) {
+ $options = ( $escaping & self::XMLMETA_OK ) ? 0 : ( JSON_HEX_TAG | JSON_HEX_AMP );
+ $json = json_encode( $value, $options );
+ if ( $json === false ) {
+ return false;
+ }
+
+ // Emulate JSON_UNESCAPED_SLASHES. Because the JSON contains no unescaped slashes
+ // (only escaped slashes), a simple string replacement works fine.
+ $json = str_replace( '\/', '/', $json );
+
+ if ( $escaping & self::UTF8_OK ) {
+ // JSON hex escape sequences follow the format \uDDDD, where DDDD is four hex digits
+ // indicating the equivalent UTF-16 code unit's value. To most efficiently unescape
+ // them, we exploit the JSON extension's built-in decoder.
+ // * We escape the input a second time, so any such sequence becomes \\uDDDD.
+ // * To avoid interpreting escape sequences that were in the original input,
+ // each double-escaped backslash (\\\\) is replaced with \\\u005c.
+ // * We strip one of the backslashes from each of the escape sequences to unescape.
+ // * Then the JSON decoder can perform the actual unescaping.
+ $json = str_replace( "\\\\\\\\", "\\\\\\u005c", addcslashes( $json, '\"' ) );
+ $json = json_decode( preg_replace( "/\\\\\\\\u(?!00[0-7])/", "\\\\u", "\"$json\"" ) );
+ $json = str_replace( self::$badChars, self::$badCharsEscaped, $json );
+ }
+
+ if ( $pretty ) {
+ return self::prettyPrint( $json );
+ }
+ return $json;
+ }
+
+ /**
+ * Adds non-significant whitespace to an existing JSON representation of an object.
+ * Only needed for PHP < 5.4, which lacks the JSON_PRETTY_PRINT option.
+ *
+ * @param string $json
+ * @return string
+ */
+ private static function prettyPrint( $json ) {
+ $buf = '';
+ $indent = 0;
+ $json = strtr( $json, array( '\\\\' => '\\\\', '\"' => "\x01" ) );
+ for ( $i = 0, $n = strlen( $json ); $i < $n; $i += $skip ) {
+ $skip = 1;
+ switch ( $json[$i] ) {
+ case ':':
+ $buf .= ': ';
+ break;
+ case '[':
+ case '{':
+ ++$indent;
+ // falls through
+ case ',':
+ $buf .= $json[$i] . "\n" . str_repeat( ' ', $indent );
+ break;
+ case ']':
+ case '}':
+ $buf .= "\n" . str_repeat( ' ', --$indent ) . $json[$i];
+ break;
+ case '"':
+ $skip = strcspn( $json, '"', $i + 1 ) + 2;
+ $buf .= substr( $json, $i, $skip );
+ break;
+ default:
+ $skip = strcspn( $json, ',]}"', $i + 1 ) + 1;
+ $buf .= substr( $json, $i, $skip );
+ }
+ }
+ $buf = preg_replace( self::WS_CLEANUP_REGEX, '', $buf );
+ return str_replace( "\x01", '\"', $buf );
+ }
}
diff --git a/includes/json/Services_JSON.php b/includes/json/Services_JSON.php
deleted file mode 100644
index b7c101a1..00000000
--- a/includes/json/Services_JSON.php
+++ /dev/null
@@ -1,882 +0,0 @@
-<?php
-/* vim: set expandtab tabstop=4 shiftwidth=4 softtabstop=4: */
-
-/**
-* Converts to and from JSON format.
-*
-* JSON (JavaScript Object Notation) is a lightweight data-interchange
-* format. It is easy for humans to read and write. It is easy for machines
-* to parse and generate. It is based on a subset of the JavaScript
-* Programming Language, Standard ECMA-262 3rd Edition - December 1999.
-* This feature can also be found in Python. JSON is a text format that is
-* completely language independent but uses conventions that are familiar
-* to programmers of the C-family of languages, including C, C++, C#, Java,
-* JavaScript, Perl, TCL, and many others. These properties make JSON an
-* ideal data-interchange language.
-*
-* This package provides a simple encoder and decoder for JSON notation. It
-* is intended for use with client-side Javascript applications that make
-* use of HTTPRequest to perform server communication functions - data can
-* be encoded into JSON notation for use in a client-side javascript, or
-* decoded from incoming Javascript requests. JSON format is native to
-* Javascript, and can be directly eval()'ed with no further parsing
-* overhead
-*
-* All strings should be in ASCII or UTF-8 format!
-*
-* LICENSE: 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.
-*
-* THIS SOFTWARE IS PROVIDED ``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 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.
-*
-* @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$
-* @license http://www.opensource.org/licenses/bsd-license.php
-* @see http://pear.php.net/pepr/pepr-proposal-show.php?id=198
-*/
-
-/**
-* Marker constant for Services_JSON::decode(), used to flag stack state
-*/
-define('SERVICES_JSON_SLICE', 1);
-
-/**
-* Marker constant for Services_JSON::decode(), used to flag stack state
-*/
-define('SERVICES_JSON_IN_STR', 2);
-
-/**
-* Marker constant for Services_JSON::decode(), used to flag stack state
-*/
-define('SERVICES_JSON_IN_ARR', 3);
-
-/**
-* Marker constant for Services_JSON::decode(), used to flag stack state
-*/
-define('SERVICES_JSON_IN_OBJ', 4);
-
-/**
-* Marker constant for Services_JSON::decode(), used to flag stack state
-*/
-define('SERVICES_JSON_IN_CMT', 5);
-
-/**
-* Behavior switch for Services_JSON::decode()
-*/
-define('SERVICES_JSON_LOOSE_TYPE', 16);
-
-/**
-* Behavior switch for Services_JSON::decode()
-*/
-define('SERVICES_JSON_SUPPRESS_ERRORS', 32);
-
-/**
- * Converts to and from JSON format.
- *
- * Brief example of use:
- *
- * <code>
- * // create a new instance of Services_JSON
- * $json = new Services_JSON();
- *
- * // convert a complex value to JSON notation, and send it to the browser
- * $value = array('foo', 'bar', array(1, 2, 'baz'), array(3, array(4)));
- * $output = $json->encode($value);
- *
- * print($output);
- * // prints: ["foo","bar",[1,2,"baz"],[3,[4]]]
- *
- * // accept incoming POST data, assumed to be in JSON notation
- * $input = file_get_contents('php://input', 1000000);
- * $value = $json->decode($input);
- * </code>
- *
- * @ingroup API
- */
-class Services_JSON
-{
- /**
- * constructs a new JSON instance
- *
- * @param $use Integer: object behavior flags; combine with boolean-OR
- *
- * possible values:
- * - SERVICES_JSON_LOOSE_TYPE: loose typing.
- * "{...}" syntax creates associative arrays
- * instead of objects in decode().
- * - SERVICES_JSON_SUPPRESS_ERRORS: error suppression.
- * Values which can't be encoded (e.g. resources)
- * appear as NULL instead of throwing errors.
- * By default, a deeply-nested resource will
- * bubble up with an error, so all return values
- * from encode() should be checked with isError()
- */
- function __construct($use = 0)
- {
- $this->use = $use;
- }
-
- private static $mHavePear = null;
- /**
- * Returns cached result of class_exists('pear'), to avoid calling AutoLoader numerous times
- * in cases when PEAR is not present.
- * @return boolean
- */
- private static function pearInstalled() {
- if ( self::$mHavePear === null ) {
- self::$mHavePear = class_exists( 'pear' );
- }
- return self::$mHavePear;
- }
-
- /**
- * convert a string from one UTF-16 char to one UTF-8 char
- *
- * Normally should be handled by mb_convert_encoding, but
- * provides a slower PHP-only method for installations
- * that lack the multibyte string extension.
- *
- * @param string $utf16 UTF-16 character
- * @return String: UTF-8 character
- * @access private
- */
- function utf162utf8($utf16)
- {
- // oh please oh please oh please oh please oh please
- if(function_exists('mb_convert_encoding')) {
- return mb_convert_encoding($utf16, 'UTF-8', 'UTF-16');
- }
-
- $bytes = (ord($utf16[0]) << 8) | ord($utf16[1]);
-
- switch(true) {
- case ((0x7F & $bytes) == $bytes):
- // this case should never be reached, because we are in ASCII range
- // see: http://www.cl.cam.ac.uk/~mgk25/unicode.html#utf-8
- return chr(0x7F & $bytes);
-
- case (0x07FF & $bytes) == $bytes:
- // return a 2-byte UTF-8 character
- // see: http://www.cl.cam.ac.uk/~mgk25/unicode.html#utf-8
- return chr(0xC0 | (($bytes >> 6) & 0x1F))
- . chr(0x80 | ($bytes & 0x3F));
-
- case (0xFC00 & $bytes) == 0xD800 && strlen($utf16) >= 4 && (0xFC & ord($utf16[2])) == 0xDC:
- // return a 4-byte UTF-8 character
- $char = ((($bytes & 0x03FF) << 10)
- | ((ord($utf16[2]) & 0x03) << 8)
- | ord($utf16[3]));
- $char += 0x10000;
- return chr(0xF0 | (($char >> 18) & 0x07))
- . chr(0x80 | (($char >> 12) & 0x3F))
- . chr(0x80 | (($char >> 6) & 0x3F))
- . chr(0x80 | ($char & 0x3F));
-
- case (0xFFFF & $bytes) == $bytes:
- // return a 3-byte UTF-8 character
- // see: http://www.cl.cam.ac.uk/~mgk25/unicode.html#utf-8
- return chr(0xE0 | (($bytes >> 12) & 0x0F))
- . chr(0x80 | (($bytes >> 6) & 0x3F))
- . chr(0x80 | ($bytes & 0x3F));
- }
-
- // ignoring UTF-32 for now, sorry
- return '';
- }
-
- /**
- * convert a string from one UTF-8 char to one UTF-16 char
- *
- * Normally should be handled by mb_convert_encoding, but
- * provides a slower PHP-only method for installations
- * that lack the multibyte string extension.
- *
- * @param string $utf8 UTF-8 character
- * @return String: UTF-16 character
- * @access private
- */
- function utf82utf16($utf8)
- {
- // oh please oh please oh please oh please oh please
- if(function_exists('mb_convert_encoding')) {
- return mb_convert_encoding($utf8, 'UTF-16', 'UTF-8');
- }
-
- switch(strlen($utf8)) {
- case 1:
- // this case should never be reached, because we are in ASCII range
- // see: http://www.cl.cam.ac.uk/~mgk25/unicode.html#utf-8
- return $utf8;
-
- case 2:
- // return a UTF-16 character from a 2-byte UTF-8 char
- // see: http://www.cl.cam.ac.uk/~mgk25/unicode.html#utf-8
- return chr(0x07 & (ord($utf8[0]) >> 2))
- . chr((0xC0 & (ord($utf8[0]) << 6))
- | (0x3F & ord($utf8[1])));
-
- case 3:
- // return a UTF-16 character from a 3-byte UTF-8 char
- // see: http://www.cl.cam.ac.uk/~mgk25/unicode.html#utf-8
- return chr((0xF0 & (ord($utf8[0]) << 4))
- | (0x0F & (ord($utf8[1]) >> 2)))
- . chr((0xC0 & (ord($utf8[1]) << 6))
- | (0x7F & ord($utf8[2])));
-
- case 4:
- // return a UTF-16 surrogate pair from a 4-byte UTF-8 char
- if(ord($utf8[0]) > 0xF4) return ''; # invalid
- $char = ((0x1C0000 & (ord($utf8[0]) << 18))
- | (0x03F000 & (ord($utf8[1]) << 12))
- | (0x000FC0 & (ord($utf8[2]) << 6))
- | (0x00003F & ord($utf8[3])));
- if($char > 0x10FFFF) return ''; # invalid
- $char -= 0x10000;
- return chr(0xD8 | (($char >> 18) & 0x03))
- . chr(($char >> 10) & 0xFF)
- . chr(0xDC | (($char >> 8) & 0x03))
- . chr($char & 0xFF);
- }
-
- // ignoring UTF-32 for now, sorry
- return '';
- }
-
- /**
- * encodes an arbitrary variable into JSON format
- *
- * @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 string, note that encode() always expects it
- * to be in ASCII or UTF-8 format!
- * @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
- */
- function encode($var, $pretty=false)
- {
- $this->indent = 0;
- $this->pretty = $pretty;
- $this->nameValSeparator = $pretty ? ': ' : ':';
- return $this->encode2($var);
- }
-
- /**
- * encodes an arbitrary variable into JSON format
- *
- * @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 string, note that encode() always expects it
- * to be in ASCII or UTF-8 format!
- *
- * @return mixed JSON string representation of input var or an error if a problem occurs
- * @access private
- */
- function encode2($var)
- {
- if ($this->pretty) {
- $close = "\n" . str_repeat("\t", $this->indent);
- $open = $close . "\t";
- $mid = ',' . $open;
- }
- else {
- $open = $close = '';
- $mid = ',';
- }
-
- switch (gettype($var)) {
- case 'boolean':
- return $var ? 'true' : 'false';
-
- case 'NULL':
- return 'null';
-
- case 'integer':
- return (int) $var;
-
- case 'double':
- case 'float':
- return (float) $var;
-
- case 'string':
- // STRINGS ARE EXPECTED TO BE IN ASCII OR UTF-8 FORMAT
- $ascii = '';
- $strlen_var = strlen($var);
-
- /*
- * Iterate over every character in the string,
- * escaping with a slash or encoding to UTF-8 where necessary
- */
- for ($c = 0; $c < $strlen_var; ++$c) {
-
- $ord_var_c = ord($var[$c]);
-
- switch (true) {
- case $ord_var_c == 0x08:
- $ascii .= '\b';
- break;
- case $ord_var_c == 0x09:
- $ascii .= '\t';
- break;
- case $ord_var_c == 0x0A:
- $ascii .= '\n';
- break;
- case $ord_var_c == 0x0C:
- $ascii .= '\f';
- break;
- case $ord_var_c == 0x0D:
- $ascii .= '\r';
- break;
-
- case $ord_var_c == 0x22:
- case $ord_var_c == 0x2F:
- case $ord_var_c == 0x5C:
- // double quote, slash, slosh
- $ascii .= '\\'.$var[$c];
- break;
-
- case (($ord_var_c >= 0x20) && ($ord_var_c <= 0x7F)):
- // characters U-00000000 - U-0000007F (same as ASCII)
- $ascii .= $var[$c];
- break;
-
- case (($ord_var_c & 0xE0) == 0xC0):
- // characters U-00000080 - U-000007FF, mask 110XXXXX
- // see http://www.cl.cam.ac.uk/~mgk25/unicode.html#utf-8
- $char = pack('C*', $ord_var_c, ord($var[$c + 1]));
- $c += 1;
- $utf16 = $this->utf82utf16($char);
- $ascii .= sprintf('\u%04s', bin2hex($utf16));
- break;
-
- case (($ord_var_c & 0xF0) == 0xE0):
- // characters U-00000800 - U-0000FFFF, mask 1110XXXX
- // see http://www.cl.cam.ac.uk/~mgk25/unicode.html#utf-8
- $char = pack('C*', $ord_var_c,
- ord($var[$c + 1]),
- ord($var[$c + 2]));
- $c += 2;
- $utf16 = $this->utf82utf16($char);
- $ascii .= sprintf('\u%04s', bin2hex($utf16));
- break;
-
- case (($ord_var_c & 0xF8) == 0xF0):
- // characters U-00010000 - U-001FFFFF, mask 11110XXX
- // see http://www.cl.cam.ac.uk/~mgk25/unicode.html#utf-8
- // These will always return a surrogate pair
- $char = pack('C*', $ord_var_c,
- ord($var[$c + 1]),
- ord($var[$c + 2]),
- ord($var[$c + 3]));
- $c += 3;
- $utf16 = $this->utf82utf16($char);
- if($utf16 == '') {
- $ascii .= '\ufffd';
- } else {
- $utf16 = str_split($utf16, 2);
- $ascii .= sprintf('\u%04s\u%04s', bin2hex($utf16[0]), bin2hex($utf16[1]));
- }
- break;
- }
- }
-
- return '"'.$ascii.'"';
-
- case 'array':
- /*
- * As per JSON spec if any array key is not an integer
- * we must treat the the whole array as an object. We
- * also try to catch a sparsely populated associative
- * array with numeric keys here because some JS engines
- * will create an array with empty indexes up to
- * max_index which can cause memory issues and because
- * the keys, which may be relevant, will be remapped
- * otherwise.
- *
- * As per the ECMA and JSON specification an object may
- * have any string as a property. Unfortunately due to
- * a hole in the ECMA specification if the key is a
- * ECMA reserved word or starts with a digit the
- * parameter is only accessible using ECMAScript's
- * bracket notation.
- */
-
- // treat as a JSON object
- if (is_array($var) && count($var) && (array_keys($var) !== range(0, count($var) - 1))) {
- $this->indent++;
- $properties = array_map(array($this, 'name_value'),
- array_keys($var),
- array_values($var));
- $this->indent--;
-
- foreach($properties as $property) {
- if($this->isError($property)) {
- return $property;
- }
- }
-
- return '{' . $open . join($mid, $properties) . $close . '}';
- }
-
- // treat it like a regular array
- $this->indent++;
- $elements = array_map(array($this, 'encode2'), $var);
- $this->indent--;
-
- foreach($elements as $element) {
- if($this->isError($element)) {
- return $element;
- }
- }
-
- return '[' . $open . join($mid, $elements) . $close . ']';
-
- case 'object':
- $vars = get_object_vars($var);
-
- $this->indent++;
- $properties = array_map(array($this, 'name_value'),
- array_keys($vars),
- array_values($vars));
- $this->indent--;
-
- foreach($properties as $property) {
- if($this->isError($property)) {
- return $property;
- }
- }
-
- return '{' . $open . join($mid, $properties) . $close . '}';
-
- default:
- return ($this->use & SERVICES_JSON_SUPPRESS_ERRORS)
- ? 'null'
- : new Services_JSON_Error(gettype($var)." can not be encoded as JSON string");
- }
- }
-
- /**
- * array-walking function for use in generating JSON-formatted name-value pairs
- *
- * @param string $name 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'
- * @access private
- */
- function name_value($name, $value)
- {
- $encoded_value = $this->encode2($value);
-
- if($this->isError($encoded_value)) {
- return $encoded_value;
- }
-
- return $this->encode2(strval($name)) . $this->nameValSeparator . $encoded_value;
- }
-
- /**
- * reduce a string by removing leading and trailing comments and whitespace
- *
- * @param string $str string value to strip of comments and whitespace
- *
- * @return String: string value stripped of comments and whitespace
- * @access private
- */
- function reduce_string($str)
- {
- $str = preg_replace(array(
-
- // eliminate single line comments in '// ...' form
- '#^\s*//(.+)$#m',
-
- // eliminate multi-line comments in '/* ... */' form, at start of string
- '#^\s*/\*(.+)\*/#Us',
-
- // eliminate multi-line comments in '/* ... */' form, at end of string
- '#/\*(.+)\*/\s*$#Us'
-
- ), '', $str);
-
- // eliminate extraneous space
- return trim($str);
- }
-
- /**
- * decodes a JSON string into appropriate variable
- *
- * @param string $str JSON-formatted string
- *
- * @return mixed number, boolean, string, array, or object
- * corresponding to given JSON input string.
- * See argument 1 to Services_JSON() above for object-output behavior.
- * Note that decode() always returns strings
- * in ASCII or UTF-8 format!
- * @access public
- */
- function decode($str)
- {
- $str = $this->reduce_string($str);
-
- switch (strtolower($str)) {
- case 'true':
- return true;
-
- case 'false':
- return false;
-
- case 'null':
- return null;
-
- default:
- $m = array();
-
- if (is_numeric($str)) {
- // Lookie-loo, it's a number
-
- // This would work on its own, but I'm trying to be
- // good about returning integers where appropriate:
- // return (float)$str;
-
- // Return float or int, as appropriate
- return ((float)$str == (integer)$str)
- ? (integer)$str
- : (float)$str;
-
- } elseif (preg_match('/^("|\').*(\1)$/s', $str, $m) && $m[1] == $m[2]) {
- // STRINGS RETURNED IN UTF-8 FORMAT
- $delim = substr($str, 0, 1);
- $chrs = substr($str, 1, -1);
- $utf8 = '';
- $strlen_chrs = strlen($chrs);
-
- for ($c = 0; $c < $strlen_chrs; ++$c) {
-
- $substr_chrs_c_2 = substr($chrs, $c, 2);
- $ord_chrs_c = ord($chrs[$c]);
-
- switch (true) {
- case $substr_chrs_c_2 == '\b':
- $utf8 .= chr(0x08);
- ++$c;
- break;
- case $substr_chrs_c_2 == '\t':
- $utf8 .= chr(0x09);
- ++$c;
- break;
- case $substr_chrs_c_2 == '\n':
- $utf8 .= chr(0x0A);
- ++$c;
- break;
- case $substr_chrs_c_2 == '\f':
- $utf8 .= chr(0x0C);
- ++$c;
- break;
- case $substr_chrs_c_2 == '\r':
- $utf8 .= chr(0x0D);
- ++$c;
- break;
-
- case $substr_chrs_c_2 == '\\"':
- case $substr_chrs_c_2 == '\\\'':
- case $substr_chrs_c_2 == '\\\\':
- case $substr_chrs_c_2 == '\\/':
- if (($delim == '"' && $substr_chrs_c_2 != '\\\'') ||
- ($delim == "'" && $substr_chrs_c_2 != '\\"')) {
- $utf8 .= $chrs[++$c];
- }
- break;
-
- case preg_match('/\\\uD[89AB][0-9A-F]{2}\\\uD[C-F][0-9A-F]{2}/i', substr($chrs, $c, 12)):
- // escaped unicode surrogate pair
- $utf16 = chr(hexdec(substr($chrs, ($c + 2), 2)))
- . chr(hexdec(substr($chrs, ($c + 4), 2)))
- . chr(hexdec(substr($chrs, ($c + 8), 2)))
- . chr(hexdec(substr($chrs, ($c + 10), 2)));
- $utf8 .= $this->utf162utf8($utf16);
- $c += 11;
- break;
-
- case preg_match('/\\\u[0-9A-F]{4}/i', substr($chrs, $c, 6)):
- // single, escaped unicode character
- $utf16 = chr(hexdec(substr($chrs, ($c + 2), 2)))
- . chr(hexdec(substr($chrs, ($c + 4), 2)));
- $utf8 .= $this->utf162utf8($utf16);
- $c += 5;
- break;
-
- case ($ord_chrs_c >= 0x20) && ($ord_chrs_c <= 0x7F):
- $utf8 .= $chrs[$c];
- break;
-
- case ($ord_chrs_c & 0xE0) == 0xC0:
- // characters U-00000080 - U-000007FF, mask 110XXXXX
- //see http://www.cl.cam.ac.uk/~mgk25/unicode.html#utf-8
- $utf8 .= substr($chrs, $c, 2);
- ++$c;
- break;
-
- case ($ord_chrs_c & 0xF0) == 0xE0:
- // characters U-00000800 - U-0000FFFF, mask 1110XXXX
- // see http://www.cl.cam.ac.uk/~mgk25/unicode.html#utf-8
- $utf8 .= substr($chrs, $c, 3);
- $c += 2;
- break;
-
- case ($ord_chrs_c & 0xF8) == 0xF0:
- // characters U-00010000 - U-001FFFFF, mask 11110XXX
- // see http://www.cl.cam.ac.uk/~mgk25/unicode.html#utf-8
- $utf8 .= substr($chrs, $c, 4);
- $c += 3;
- break;
-
- case ($ord_chrs_c & 0xFC) == 0xF8:
- // characters U-00200000 - U-03FFFFFF, mask 111110XX
- // see http://www.cl.cam.ac.uk/~mgk25/unicode.html#utf-8
- $utf8 .= substr($chrs, $c, 5);
- $c += 4;
- break;
-
- case ($ord_chrs_c & 0xFE) == 0xFC:
- // characters U-04000000 - U-7FFFFFFF, mask 1111110X
- // see http://www.cl.cam.ac.uk/~mgk25/unicode.html#utf-8
- $utf8 .= substr($chrs, $c, 6);
- $c += 5;
- break;
-
- }
-
- }
-
- return $utf8;
-
- } elseif (preg_match('/^\[.*\]$/s', $str) || preg_match('/^\{.*\}$/s', $str)) {
- // array, or object notation
-
- if ($str[0] == '[') {
- $stk = array(SERVICES_JSON_IN_ARR);
- $arr = array();
- } else {
- if ($this->use & SERVICES_JSON_LOOSE_TYPE) {
- $stk = array(SERVICES_JSON_IN_OBJ);
- $obj = array();
- } else {
- $stk = array(SERVICES_JSON_IN_OBJ);
- $obj = new stdClass();
- }
- }
-
- array_push($stk, array( 'what' => SERVICES_JSON_SLICE,
- 'where' => 0,
- 'delim' => false));
-
- $chrs = substr($str, 1, -1);
- $chrs = $this->reduce_string($chrs);
-
- if ($chrs == '') {
- if (reset($stk) == SERVICES_JSON_IN_ARR) {
- return $arr;
-
- } else {
- return $obj;
-
- }
- }
-
- //print("\nparsing {$chrs}\n");
-
- $strlen_chrs = strlen($chrs);
-
- for ($c = 0; $c <= $strlen_chrs; ++$c) {
-
- $top = end($stk);
- $substr_chrs_c_2 = substr($chrs, $c, 2);
-
- if (($c == $strlen_chrs) || (($chrs[$c] == ',') && ($top['what'] == SERVICES_JSON_SLICE))) {
- // found a comma that is not inside a string, array, etc.,
- // OR we've reached the end of the character list
- $slice = substr($chrs, $top['where'], ($c - $top['where']));
- array_push($stk, array('what' => SERVICES_JSON_SLICE, 'where' => ($c + 1), 'delim' => false));
- //print("Found split at {$c}: ".substr($chrs, $top['where'], (1 + $c - $top['where']))."\n");
-
- if (reset($stk) == SERVICES_JSON_IN_ARR) {
- // we are in an array, so just push an element onto the stack
- array_push($arr, $this->decode($slice));
-
- } elseif (reset($stk) == SERVICES_JSON_IN_OBJ) {
- // we are in an object, so figure
- // out the property name and set an
- // element in an associative array,
- // for now
- $parts = array();
-
- if (preg_match('/^\s*(["\'].*[^\\\]["\'])\s*:\s*(\S.*),?$/Uis', $slice, $parts)) {
- // "name":value pair
- $key = $this->decode($parts[1]);
- $val = $this->decode($parts[2]);
-
- if ($this->use & SERVICES_JSON_LOOSE_TYPE) {
- $obj[$key] = $val;
- } else {
- $obj->$key = $val;
- }
- } elseif (preg_match('/^\s*(\w+)\s*:\s*(\S.*),?$/Uis', $slice, $parts)) {
- // name:value pair, where name is unquoted
- $key = $parts[1];
- $val = $this->decode($parts[2]);
-
- if ($this->use & SERVICES_JSON_LOOSE_TYPE) {
- $obj[$key] = $val;
- } else {
- $obj->$key = $val;
- }
- }
-
- }
-
- } elseif ((($chrs[$c] == '"') || ($chrs[$c] == "'")) && ($top['what'] != SERVICES_JSON_IN_STR)) {
- // found a quote, and we are not inside a string
- array_push($stk, array('what' => SERVICES_JSON_IN_STR, 'where' => $c, 'delim' => $chrs[$c]));
- //print("Found start of string at {$c}\n");
-
- } elseif (($chrs[$c] == $top['delim']) &&
- ($top['what'] == SERVICES_JSON_IN_STR) &&
- (($chrs[$c - 1] != '\\') ||
- ($chrs[$c - 1] == '\\' && $chrs[$c - 2] == '\\'))) {
- // found a quote, we're in a string, and it's not escaped
- array_pop($stk);
- //print("Found end of string at {$c}: ".substr($chrs, $top['where'], (1 + 1 + $c - $top['where']))."\n");
-
- } elseif (($chrs[$c] == '[') &&
- in_array($top['what'], array(SERVICES_JSON_SLICE, SERVICES_JSON_IN_ARR, SERVICES_JSON_IN_OBJ))) {
- // found a left-bracket, and we are in an array, object, or slice
- array_push($stk, array('what' => SERVICES_JSON_IN_ARR, 'where' => $c, 'delim' => false));
- //print("Found start of array at {$c}\n");
-
- } elseif (($chrs[$c] == ']') && ($top['what'] == SERVICES_JSON_IN_ARR)) {
- // found a right-bracket, and we're in an array
- array_pop($stk);
- //print("Found end of array at {$c}: ".substr($chrs, $top['where'], (1 + $c - $top['where']))."\n");
-
- } elseif (($chrs[$c] == '{') &&
- in_array($top['what'], array(SERVICES_JSON_SLICE, SERVICES_JSON_IN_ARR, SERVICES_JSON_IN_OBJ))) {
- // found a left-brace, and we are in an array, object, or slice
- array_push($stk, array('what' => SERVICES_JSON_IN_OBJ, 'where' => $c, 'delim' => false));
- //print("Found start of object at {$c}\n");
-
- } elseif (($chrs[$c] == '}') && ($top['what'] == SERVICES_JSON_IN_OBJ)) {
- // found a right-brace, and we're in an object
- array_pop($stk);
- //print("Found end of object at {$c}: ".substr($chrs, $top['where'], (1 + $c - $top['where']))."\n");
-
- } elseif (($substr_chrs_c_2 == '/*') &&
- in_array($top['what'], array(SERVICES_JSON_SLICE, SERVICES_JSON_IN_ARR, SERVICES_JSON_IN_OBJ))) {
- // found a comment start, and we are in an array, object, or slice
- array_push($stk, array('what' => SERVICES_JSON_IN_CMT, 'where' => $c, 'delim' => false));
- $c++;
- //print("Found start of comment at {$c}\n");
-
- } elseif (($substr_chrs_c_2 == '*/') && ($top['what'] == SERVICES_JSON_IN_CMT)) {
- // found a comment end, and we're in one now
- array_pop($stk);
- $c++;
-
- for ($i = $top['where']; $i <= $c; ++$i)
- $chrs = substr_replace($chrs, ' ', $i, 1);
-
- //print("Found end of comment at {$c}: ".substr($chrs, $top['where'], (1 + $c - $top['where']))."\n");
-
- }
-
- }
-
- if (reset($stk) == SERVICES_JSON_IN_ARR) {
- return $arr;
-
- } elseif (reset($stk) == SERVICES_JSON_IN_OBJ) {
- return $obj;
-
- }
-
- }
- }
- }
-
- /**
- * @todo Ultimately, this should just call PEAR::isError()
- * @return bool
- */
- function isError($data, $code = null)
- {
- if ( self::pearInstalled() ) {
- //avoid some strict warnings on PEAR isError check (looks like http://pear.php.net/bugs/bug.php?id=9950 has been around for some time)
- return @PEAR::isError($data, $code);
- } elseif (is_object($data) && (get_class($data) == 'services_json_error' ||
- is_subclass_of($data, 'services_json_error'))) {
- return true;
- }
-
- return false;
- }
-}
-
-
-// Hide the PEAR_Error variant from Doxygen
-/// @cond
-if (class_exists('PEAR_Error')) {
-
- /**
- * @ingroup API
- */
- class Services_JSON_Error extends PEAR_Error
- {
- function Services_JSON_Error($message = 'unknown error', $code = null,
- $mode = null, $options = null, $userinfo = null)
- {
- parent::PEAR_Error($message, $code, $mode, $options, $userinfo);
- }
- }
-
-} else {
-/// @endcond
-
- /**
- * @todo Ultimately, this class shall be descended from PEAR_Error
- * @ingroup API
- */
- class Services_JSON_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
index fb1e9a4c..5a52fc7c 100644
--- a/includes/libs/CSSJanus.php
+++ b/includes/libs/CSSJanus.php
@@ -76,6 +76,10 @@ class CSSJanus {
'cursor_west' => null,
'four_notation_quantity' => null,
'four_notation_color' => null,
+ 'border_radius' => null,
+ 'box_shadow' => null,
+ 'text_shadow1' => null,
+ 'text_shadow2' => null,
'bg_horizontal_percentage' => null,
'bg_horizontal_percentage_x' => null,
);
@@ -96,9 +100,9 @@ class CSSJanus {
$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['color'] = "(#?{$patterns['nmchar']}+|(?:rgba?|hsla?)\([ \d.,%-]+\))";
$patterns['url_chars'] = "(?:{$patterns['url_special_chars']}|{$patterns['nonAscii']}|{$patterns['escape']})*";
- $patterns['lookahead_not_open_brace'] = "(?!({$patterns['nmchar']}|\r?\n|\s|#|\:|\.|\,|\+|>)*?{)";
+ $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";
@@ -113,8 +117,12 @@ class CSSJanus {
$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";
+ $patterns['four_notation_quantity'] = "/(:\s*){$patterns['possibly_negative_quantity']}(\s+){$patterns['possibly_negative_quantity']}(\s+){$patterns['possibly_negative_quantity']}(\s+){$patterns['possibly_negative_quantity']}(\s*[;}])/i";
+ $patterns['four_notation_color'] = "/(-color\s*:\s*){$patterns['color']}(\s+){$patterns['color']}(\s+){$patterns['color']}(\s+){$patterns['color']}(\s*[;}])/i";
+ $patterns['border_radius'] = "/(border-radius\s*:\s*){$patterns['possibly_negative_quantity']}(\s+){$patterns['possibly_negative_quantity']}(\s+){$patterns['possibly_negative_quantity']}(\s+){$patterns['possibly_negative_quantity']}(\s*[;}])/i";
+ $patterns['box_shadow'] = "/(box-shadow\s*:\s*(?:inset\s*)?){$patterns['possibly_negative_quantity']}/i";
+ $patterns['text_shadow1'] = "/(text-shadow\s*:\s*){$patterns['color']}(\s*){$patterns['possibly_negative_quantity']}/i";
+ $patterns['text_shadow2'] = "/(text-shadow\s*:\s*){$patterns['possibly_negative_quantity']}/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']}))/";
@@ -160,7 +168,9 @@ class CSSJanus {
$css = self::fixLeftAndRight( $css );
$css = self::fixCursorProperties( $css );
$css = self::fixFourPartNotation( $css );
+ $css = self::fixBorderRadius( $css );
$css = self::fixBackgroundPosition( $css );
+ $css = self::fixShadows( $css );
// Detokenize stuff we tokenized before
$css = $comments->detokenize( $css );
@@ -257,8 +267,58 @@ class CSSJanus {
* @return string
*/
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 );
+ $css = preg_replace( self::$patterns['four_notation_quantity'], '$1$2$3$8$5$6$7$4$9', $css );
+ $css = preg_replace( self::$patterns['four_notation_color'], '$1$2$3$8$5$6$7$4$9', $css );
+ return $css;
+ }
+
+ /**
+ * Swaps appropriate corners in four-part border-radius rules.
+ * Needs to undo the effect of fixFourPartNotation() on those rules, too.
+ *
+ * @param $css string
+ * @return string
+ */
+ private static function fixBorderRadius( $css ) {
+ // Undo four_notation_quantity
+ $css = preg_replace( self::$patterns['border_radius'], '$1$2$3$8$5$6$7$4$9', $css );
+ // Do the real thing
+ $css = preg_replace( self::$patterns['border_radius'], '$1$4$3$2$5$8$7$6$9', $css );
+
+ return $css;
+ }
+
+ /**
+ * Negates horizontal offset in box-shadow and text-shadow rules.
+ *
+ * @param $css string
+ * @return string
+ */
+ private static function fixShadows( $css ) {
+ // Flips the sign of a CSS value, possibly with a unit.
+ // (We can't just negate the value with unary minus due to the units.)
+ $flipSign = function ( $cssValue ) {
+ // Don't mangle zeroes
+ if ( intval( $cssValue ) === 0 ) {
+ return $cssValue;
+ } elseif ( $cssValue[0] === '-' ) {
+ return substr( $cssValue, 1 );
+ } else {
+ return "-" . $cssValue;
+ }
+ };
+
+ $css = preg_replace_callback( self::$patterns['box_shadow'], function ( $matches ) use ( $flipSign ) {
+ return $matches[1] . $flipSign( $matches[2] );
+ }, $css );
+
+ $css = preg_replace_callback( self::$patterns['text_shadow1'], function ( $matches ) use ( $flipSign ) {
+ return $matches[1] . $matches[2] . $matches[3] . $flipSign( $matches[4] );
+ }, $css );
+
+ $css = preg_replace_callback( self::$patterns['text_shadow2'], function ( $matches ) use ( $flipSign ) {
+ return $matches[1] . $flipSign( $matches[2] );
+ }, $css );
return $css;
}
diff --git a/includes/libs/CSSMin.php b/includes/libs/CSSMin.php
index 8b0e2873..4f142fc7 100644
--- a/includes/libs/CSSMin.php
+++ b/includes/libs/CSSMin.php
@@ -82,10 +82,38 @@ class CSSMin {
}
/**
+ * Encode an image file as a base64 data URI.
+ * If the image file has a suitable MIME type and size, encode it as a
+ * base64 data URI. Return false if the image type is unfamiliar or exceeds
+ * the size limit.
+ *
+ * @param string $file Image file to encode.
+ * @param string|null $type File's MIME type or null. If null, CSSMin will
+ * try to autodetect the type.
+ * @param int|bool $sizeLimit If the size of the target file is greater than
+ * this value, decline to encode the image file and return false
+ * instead. If $sizeLimit is false, no limit is enforced.
+ * @return string|bool: Image contents encoded as a data URI or false.
+ */
+ public static function encodeImageAsDataURI( $file, $type = null, $sizeLimit = self::EMBED_SIZE_LIMIT ) {
+ if ( $sizeLimit !== false && filesize( $file ) >= $sizeLimit ) {
+ return false;
+ }
+ if ( $type === null ) {
+ $type = self::getMimeType( $file );
+ }
+ if ( !$type ) {
+ return false;
+ }
+ $data = base64_encode( file_get_contents( $file ) );
+ return 'data:' . $type . ';base64,' . $data;
+ }
+
+ /**
* @param $file string
* @return bool|string
*/
- protected static function getMimeType( $file ) {
+ public 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
@@ -174,23 +202,14 @@ class CSSMin {
// 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 ( $embedData && $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 ) );
+ if ( $embedData && $embed && $match['embed'][1] > 0 ) {
+ $data = self::encodeImageAsDataURI( $file );
+ if ( $data !== false ) {
// 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;";
+ $replacement = "{$pre}url({$data}){$post};{$pre}url({$url}){$post}!ie;";
}
}
if ( $replacement === false ) {
diff --git a/includes/libs/HttpStatus.php b/includes/libs/HttpStatus.php
index 78d81803..4f626b23 100644
--- a/includes/libs/HttpStatus.php
+++ b/includes/libs/HttpStatus.php
@@ -26,7 +26,7 @@
class HttpStatus {
/**
- * Get the message associed with the HTTP response code $code
+ * Get the message associated with HTTP response code $code
*
* Replace OutputPage::getStatusMessage( $code )
*
diff --git a/includes/libs/lessc.inc.php b/includes/libs/lessc.inc.php
new file mode 100644
index 00000000..3dce961e
--- /dev/null
+++ b/includes/libs/lessc.inc.php
@@ -0,0 +1,3742 @@
+<?php
+
+/**
+ * lessphp v0.4.0@261f1bd28f
+ * http://leafo.net/lessphp
+ *
+ * LESS CSS compiler, adapted from http://lesscss.org
+ *
+ * For ease of distribution, lessphp 0.4.0 is under a dual license.
+ * You are free to pick which one suits your needs.
+ *
+ * MIT LICENSE
+ *
+ * Copyright 2013, Leaf Corcoran <leafot@gmail.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 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.
+ *
+ * GPL VERSION 3
+ *
+ * Please refer to http://www.gnu.org/licenses/gpl-3.0.html for the full
+ * text of the GPL version 3
+ */
+
+
+/**
+ * The LESS compiler and parser.
+ *
+ * Converting LESS to CSS is a three stage process. The incoming file is parsed
+ * by `lessc_parser` into a syntax tree, then it is compiled into another tree
+ * representing the CSS structure by `lessc`. The CSS tree is fed into a
+ * formatter, like `lessc_formatter` which then outputs CSS as a string.
+ *
+ * During the first compile, all values are *reduced*, which means that their
+ * types are brought to the lowest form before being dump as strings. This
+ * handles math equations, variable dereferences, and the like.
+ *
+ * The `parse` function of `lessc` is the entry point.
+ *
+ * In summary:
+ *
+ * The `lessc` class creates an instance of the parser, feeds it LESS code,
+ * then transforms the resulting tree to a CSS tree. This class also holds the
+ * evaluation context, such as all available mixins and variables at any given
+ * time.
+ *
+ * The `lessc_parser` class is only concerned with parsing its input.
+ *
+ * The `lessc_formatter` takes a CSS tree, and dumps it to a formatted string,
+ * handling things like indentation.
+ */
+class lessc {
+ static public $VERSION = "v0.4.0";
+
+ static public $TRUE = array("keyword", "true");
+ static public $FALSE = array("keyword", "false");
+
+ protected $libFunctions = array();
+ protected $registeredVars = array();
+ protected $preserveComments = false;
+
+ public $vPrefix = '@'; // prefix of abstract properties
+ public $mPrefix = '$'; // prefix of abstract blocks
+ public $parentSelector = '&';
+
+ public $importDisabled = false;
+ public $importDir = '';
+
+ protected $numberPrecision = null;
+
+ protected $allParsedFiles = array();
+
+ // set to the parser that generated the current line when compiling
+ // so we know how to create error messages
+ protected $sourceParser = null;
+ protected $sourceLoc = null;
+
+ static protected $nextImportId = 0; // uniquely identify imports
+
+ // attempts to find the path of an import url, returns null for css files
+ protected function findImport($url) {
+ foreach ((array)$this->importDir as $dir) {
+ $full = $dir.(substr($dir, -1) != '/' ? '/' : '').$url;
+ if ($this->fileExists($file = $full.'.less') || $this->fileExists($file = $full)) {
+ return $file;
+ }
+ }
+
+ return null;
+ }
+
+ protected function fileExists($name) {
+ return is_file($name);
+ }
+
+ static public function compressList($items, $delim) {
+ if (!isset($items[1]) && isset($items[0])) return $items[0];
+ else return array('list', $delim, $items);
+ }
+
+ static public function preg_quote($what) {
+ return preg_quote($what, '/');
+ }
+
+ protected function tryImport($importPath, $parentBlock, $out) {
+ if ($importPath[0] == "function" && $importPath[1] == "url") {
+ $importPath = $this->flattenList($importPath[2]);
+ }
+
+ $str = $this->coerceString($importPath);
+ if ($str === null) return false;
+
+ $url = $this->compileValue($this->lib_e($str));
+
+ // don't import if it ends in css
+ if (substr_compare($url, '.css', -4, 4) === 0) return false;
+
+ $realPath = $this->findImport($url);
+
+ if ($realPath === null) return false;
+
+ if ($this->importDisabled) {
+ return array(false, "/* import disabled */");
+ }
+
+ if (isset($this->allParsedFiles[realpath($realPath)])) {
+ return array(false, null);
+ }
+
+ $this->addParsedFile($realPath);
+ $parser = $this->makeParser($realPath);
+ $root = $parser->parse(file_get_contents($realPath));
+
+ // set the parents of all the block props
+ foreach ($root->props as $prop) {
+ if ($prop[0] == "block") {
+ $prop[1]->parent = $parentBlock;
+ }
+ }
+
+ // copy mixins into scope, set their parents
+ // bring blocks from import into current block
+ // TODO: need to mark the source parser these came from this file
+ foreach ($root->children as $childName => $child) {
+ if (isset($parentBlock->children[$childName])) {
+ $parentBlock->children[$childName] = array_merge(
+ $parentBlock->children[$childName],
+ $child);
+ } else {
+ $parentBlock->children[$childName] = $child;
+ }
+ }
+
+ $pi = pathinfo($realPath);
+ $dir = $pi["dirname"];
+
+ list($top, $bottom) = $this->sortProps($root->props, true);
+ $this->compileImportedProps($top, $parentBlock, $out, $parser, $dir);
+
+ return array(true, $bottom, $parser, $dir);
+ }
+
+ protected function compileImportedProps($props, $block, $out, $sourceParser, $importDir) {
+ $oldSourceParser = $this->sourceParser;
+
+ $oldImport = $this->importDir;
+
+ // TODO: this is because the importDir api is stupid
+ $this->importDir = (array)$this->importDir;
+ array_unshift($this->importDir, $importDir);
+
+ foreach ($props as $prop) {
+ $this->compileProp($prop, $block, $out);
+ }
+
+ $this->importDir = $oldImport;
+ $this->sourceParser = $oldSourceParser;
+ }
+
+ /**
+ * Recursively compiles a block.
+ *
+ * A block is analogous to a CSS block in most cases. A single LESS document
+ * is encapsulated in a block when parsed, but it does not have parent tags
+ * so all of it's children appear on the root level when compiled.
+ *
+ * Blocks are made up of props and children.
+ *
+ * Props are property instructions, array tuples which describe an action
+ * to be taken, eg. write a property, set a variable, mixin a block.
+ *
+ * The children of a block are just all the blocks that are defined within.
+ * This is used to look up mixins when performing a mixin.
+ *
+ * Compiling the block involves pushing a fresh environment on the stack,
+ * and iterating through the props, compiling each one.
+ *
+ * See lessc::compileProp()
+ *
+ */
+ protected function compileBlock($block) {
+ switch ($block->type) {
+ case "root":
+ $this->compileRoot($block);
+ break;
+ case null:
+ $this->compileCSSBlock($block);
+ break;
+ case "media":
+ $this->compileMedia($block);
+ break;
+ case "directive":
+ $name = "@" . $block->name;
+ if (!empty($block->value)) {
+ $name .= " " . $this->compileValue($this->reduce($block->value));
+ }
+
+ $this->compileNestedBlock($block, array($name));
+ break;
+ default:
+ $this->throwError("unknown block type: $block->type\n");
+ }
+ }
+
+ protected function compileCSSBlock($block) {
+ $env = $this->pushEnv();
+
+ $selectors = $this->compileSelectors($block->tags);
+ $env->selectors = $this->multiplySelectors($selectors);
+ $out = $this->makeOutputBlock(null, $env->selectors);
+
+ $this->scope->children[] = $out;
+ $this->compileProps($block, $out);
+
+ $block->scope = $env; // mixins carry scope with them!
+ $this->popEnv();
+ }
+
+ protected function compileMedia($media) {
+ $env = $this->pushEnv($media);
+ $parentScope = $this->mediaParent($this->scope);
+
+ $query = $this->compileMediaQuery($this->multiplyMedia($env));
+
+ $this->scope = $this->makeOutputBlock($media->type, array($query));
+ $parentScope->children[] = $this->scope;
+
+ $this->compileProps($media, $this->scope);
+
+ if (count($this->scope->lines) > 0) {
+ $orphanSelelectors = $this->findClosestSelectors();
+ if (!is_null($orphanSelelectors)) {
+ $orphan = $this->makeOutputBlock(null, $orphanSelelectors);
+ $orphan->lines = $this->scope->lines;
+ array_unshift($this->scope->children, $orphan);
+ $this->scope->lines = array();
+ }
+ }
+
+ $this->scope = $this->scope->parent;
+ $this->popEnv();
+ }
+
+ protected function mediaParent($scope) {
+ while (!empty($scope->parent)) {
+ if (!empty($scope->type) && $scope->type != "media") {
+ break;
+ }
+ $scope = $scope->parent;
+ }
+
+ return $scope;
+ }
+
+ protected function compileNestedBlock($block, $selectors) {
+ $this->pushEnv($block);
+ $this->scope = $this->makeOutputBlock($block->type, $selectors);
+ $this->scope->parent->children[] = $this->scope;
+
+ $this->compileProps($block, $this->scope);
+
+ $this->scope = $this->scope->parent;
+ $this->popEnv();
+ }
+
+ protected function compileRoot($root) {
+ $this->pushEnv();
+ $this->scope = $this->makeOutputBlock($root->type);
+ $this->compileProps($root, $this->scope);
+ $this->popEnv();
+ }
+
+ protected function compileProps($block, $out) {
+ foreach ($this->sortProps($block->props) as $prop) {
+ $this->compileProp($prop, $block, $out);
+ }
+ $out->lines = $this->deduplicate($out->lines);
+ }
+
+ /**
+ * Deduplicate lines in a block. Comments are not deduplicated. If a
+ * duplicate rule is detected, the comments immediately preceding each
+ * occurence are consolidated.
+ */
+ protected function deduplicate($lines) {
+ $unique = array();
+ $comments = array();
+
+ foreach($lines as $line) {
+ if (strpos($line, '/*') === 0) {
+ $comments[] = $line;
+ continue;
+ }
+ if (!in_array($line, $unique)) {
+ $unique[] = $line;
+ }
+ array_splice($unique, array_search($line, $unique), 0, $comments);
+ $comments = array();
+ }
+ return array_merge($unique, $comments);
+ }
+
+ protected function sortProps($props, $split = false) {
+ $vars = array();
+ $imports = array();
+ $other = array();
+ $stack = array();
+
+ foreach ($props as $prop) {
+ switch ($prop[0]) {
+ case "comment":
+ $stack[] = $prop;
+ break;
+ case "assign":
+ $stack[] = $prop;
+ if (isset($prop[1][0]) && $prop[1][0] == $this->vPrefix) {
+ $vars = array_merge($vars, $stack);
+ } else {
+ $other = array_merge($other, $stack);
+ }
+ $stack = array();
+ break;
+ case "import":
+ $id = self::$nextImportId++;
+ $prop[] = $id;
+ $stack[] = $prop;
+ $imports = array_merge($imports, $stack);
+ $other[] = array("import_mixin", $id);
+ $stack = array();
+ break;
+ default:
+ $stack[] = $prop;
+ $other = array_merge($other, $stack);
+ $stack = array();
+ break;
+ }
+ }
+ $other = array_merge($other, $stack);
+
+ if ($split) {
+ return array(array_merge($vars, $imports), $other);
+ } else {
+ return array_merge($vars, $imports, $other);
+ }
+ }
+
+ protected function compileMediaQuery($queries) {
+ $compiledQueries = array();
+ foreach ($queries as $query) {
+ $parts = array();
+ foreach ($query as $q) {
+ switch ($q[0]) {
+ case "mediaType":
+ $parts[] = implode(" ", array_slice($q, 1));
+ break;
+ case "mediaExp":
+ if (isset($q[2])) {
+ $parts[] = "($q[1]: " .
+ $this->compileValue($this->reduce($q[2])) . ")";
+ } else {
+ $parts[] = "($q[1])";
+ }
+ break;
+ case "variable":
+ $parts[] = $this->compileValue($this->reduce($q));
+ break;
+ }
+ }
+
+ if (count($parts) > 0) {
+ $compiledQueries[] = implode(" and ", $parts);
+ }
+ }
+
+ $out = "@media";
+ if (!empty($parts)) {
+ $out .= " " .
+ implode($this->formatter->selectorSeparator, $compiledQueries);
+ }
+ return $out;
+ }
+
+ protected function multiplyMedia($env, $childQueries = null) {
+ if (is_null($env) ||
+ !empty($env->block->type) && $env->block->type != "media")
+ {
+ return $childQueries;
+ }
+
+ // plain old block, skip
+ if (empty($env->block->type)) {
+ return $this->multiplyMedia($env->parent, $childQueries);
+ }
+
+ $out = array();
+ $queries = $env->block->queries;
+ if (is_null($childQueries)) {
+ $out = $queries;
+ } else {
+ foreach ($queries as $parent) {
+ foreach ($childQueries as $child) {
+ $out[] = array_merge($parent, $child);
+ }
+ }
+ }
+
+ return $this->multiplyMedia($env->parent, $out);
+ }
+
+ protected function expandParentSelectors(&$tag, $replace) {
+ $parts = explode("$&$", $tag);
+ $count = 0;
+ foreach ($parts as &$part) {
+ $part = str_replace($this->parentSelector, $replace, $part, $c);
+ $count += $c;
+ }
+ $tag = implode($this->parentSelector, $parts);
+ return $count;
+ }
+
+ protected function findClosestSelectors() {
+ $env = $this->env;
+ $selectors = null;
+ while ($env !== null) {
+ if (isset($env->selectors)) {
+ $selectors = $env->selectors;
+ break;
+ }
+ $env = $env->parent;
+ }
+
+ return $selectors;
+ }
+
+
+ // multiply $selectors against the nearest selectors in env
+ protected function multiplySelectors($selectors) {
+ // find parent selectors
+
+ $parentSelectors = $this->findClosestSelectors();
+ if (is_null($parentSelectors)) {
+ // kill parent reference in top level selector
+ foreach ($selectors as &$s) {
+ $this->expandParentSelectors($s, "");
+ }
+
+ return $selectors;
+ }
+
+ $out = array();
+ foreach ($parentSelectors as $parent) {
+ foreach ($selectors as $child) {
+ $count = $this->expandParentSelectors($child, $parent);
+
+ // don't prepend the parent tag if & was used
+ if ($count > 0) {
+ $out[] = trim($child);
+ } else {
+ $out[] = trim($parent . ' ' . $child);
+ }
+ }
+ }
+
+ return $out;
+ }
+
+ // reduces selector expressions
+ protected function compileSelectors($selectors) {
+ $out = array();
+
+ foreach ($selectors as $s) {
+ if (is_array($s)) {
+ list(, $value) = $s;
+ $out[] = trim($this->compileValue($this->reduce($value)));
+ } else {
+ $out[] = $s;
+ }
+ }
+
+ return $out;
+ }
+
+ protected function eq($left, $right) {
+ return $left == $right;
+ }
+
+ protected function patternMatch($block, $orderedArgs, $keywordArgs) {
+ // match the guards if it has them
+ // any one of the groups must have all its guards pass for a match
+ if (!empty($block->guards)) {
+ $groupPassed = false;
+ foreach ($block->guards as $guardGroup) {
+ foreach ($guardGroup as $guard) {
+ $this->pushEnv();
+ $this->zipSetArgs($block->args, $orderedArgs, $keywordArgs);
+
+ $negate = false;
+ if ($guard[0] == "negate") {
+ $guard = $guard[1];
+ $negate = true;
+ }
+
+ $passed = $this->reduce($guard) == self::$TRUE;
+ if ($negate) $passed = !$passed;
+
+ $this->popEnv();
+
+ if ($passed) {
+ $groupPassed = true;
+ } else {
+ $groupPassed = false;
+ break;
+ }
+ }
+
+ if ($groupPassed) break;
+ }
+
+ if (!$groupPassed) {
+ return false;
+ }
+ }
+
+ if (empty($block->args)) {
+ return $block->isVararg || empty($orderedArgs) && empty($keywordArgs);
+ }
+
+ $remainingArgs = $block->args;
+ if ($keywordArgs) {
+ $remainingArgs = array();
+ foreach ($block->args as $arg) {
+ if ($arg[0] == "arg" && isset($keywordArgs[$arg[1]])) {
+ continue;
+ }
+
+ $remainingArgs[] = $arg;
+ }
+ }
+
+ $i = -1; // no args
+ // try to match by arity or by argument literal
+ foreach ($remainingArgs as $i => $arg) {
+ switch ($arg[0]) {
+ case "lit":
+ if (empty($orderedArgs[$i]) || !$this->eq($arg[1], $orderedArgs[$i])) {
+ return false;
+ }
+ break;
+ case "arg":
+ // no arg and no default value
+ if (!isset($orderedArgs[$i]) && !isset($arg[2])) {
+ return false;
+ }
+ break;
+ case "rest":
+ $i--; // rest can be empty
+ break 2;
+ }
+ }
+
+ if ($block->isVararg) {
+ return true; // not having enough is handled above
+ } else {
+ $numMatched = $i + 1;
+ // greater than becuase default values always match
+ return $numMatched >= count($orderedArgs);
+ }
+ }
+
+ protected function patternMatchAll($blocks, $orderedArgs, $keywordArgs, $skip=array()) {
+ $matches = null;
+ foreach ($blocks as $block) {
+ // skip seen blocks that don't have arguments
+ if (isset($skip[$block->id]) && !isset($block->args)) {
+ continue;
+ }
+
+ if ($this->patternMatch($block, $orderedArgs, $keywordArgs)) {
+ $matches[] = $block;
+ }
+ }
+
+ return $matches;
+ }
+
+ // attempt to find blocks matched by path and args
+ protected function findBlocks($searchIn, $path, $orderedArgs, $keywordArgs, $seen=array()) {
+ if ($searchIn == null) return null;
+ if (isset($seen[$searchIn->id])) return null;
+ $seen[$searchIn->id] = true;
+
+ $name = $path[0];
+
+ if (isset($searchIn->children[$name])) {
+ $blocks = $searchIn->children[$name];
+ if (count($path) == 1) {
+ $matches = $this->patternMatchAll($blocks, $orderedArgs, $keywordArgs, $seen);
+ if (!empty($matches)) {
+ // This will return all blocks that match in the closest
+ // scope that has any matching block, like lessjs
+ return $matches;
+ }
+ } else {
+ $matches = array();
+ foreach ($blocks as $subBlock) {
+ $subMatches = $this->findBlocks($subBlock,
+ array_slice($path, 1), $orderedArgs, $keywordArgs, $seen);
+
+ if (!is_null($subMatches)) {
+ foreach ($subMatches as $sm) {
+ $matches[] = $sm;
+ }
+ }
+ }
+
+ return count($matches) > 0 ? $matches : null;
+ }
+ }
+ if ($searchIn->parent === $searchIn) return null;
+ return $this->findBlocks($searchIn->parent, $path, $orderedArgs, $keywordArgs, $seen);
+ }
+
+ // sets all argument names in $args to either the default value
+ // or the one passed in through $values
+ protected function zipSetArgs($args, $orderedValues, $keywordValues) {
+ $assignedValues = array();
+
+ $i = 0;
+ foreach ($args as $a) {
+ if ($a[0] == "arg") {
+ if (isset($keywordValues[$a[1]])) {
+ // has keyword arg
+ $value = $keywordValues[$a[1]];
+ } elseif (isset($orderedValues[$i])) {
+ // has ordered arg
+ $value = $orderedValues[$i];
+ $i++;
+ } elseif (isset($a[2])) {
+ // has default value
+ $value = $a[2];
+ } else {
+ $this->throwError("Failed to assign arg " . $a[1]);
+ $value = null; // :(
+ }
+
+ $value = $this->reduce($value);
+ $this->set($a[1], $value);
+ $assignedValues[] = $value;
+ } else {
+ // a lit
+ $i++;
+ }
+ }
+
+ // check for a rest
+ $last = end($args);
+ if ($last[0] == "rest") {
+ $rest = array_slice($orderedValues, count($args) - 1);
+ $this->set($last[1], $this->reduce(array("list", " ", $rest)));
+ }
+
+ // wow is this the only true use of PHP's + operator for arrays?
+ $this->env->arguments = $assignedValues + $orderedValues;
+ }
+
+ // compile a prop and update $lines or $blocks appropriately
+ protected function compileProp($prop, $block, $out) {
+ // set error position context
+ $this->sourceLoc = isset($prop[-1]) ? $prop[-1] : -1;
+
+ switch ($prop[0]) {
+ case 'assign':
+ list(, $name, $value) = $prop;
+ if ($name[0] == $this->vPrefix) {
+ $this->set($name, $value);
+ } else {
+ $out->lines[] = $this->formatter->property($name,
+ $this->compileValue($this->reduce($value)));
+ }
+ break;
+ case 'block':
+ list(, $child) = $prop;
+ $this->compileBlock($child);
+ break;
+ case 'mixin':
+ list(, $path, $args, $suffix) = $prop;
+
+ $orderedArgs = array();
+ $keywordArgs = array();
+ foreach ((array)$args as $arg) {
+ $argval = null;
+ switch ($arg[0]) {
+ case "arg":
+ if (!isset($arg[2])) {
+ $orderedArgs[] = $this->reduce(array("variable", $arg[1]));
+ } else {
+ $keywordArgs[$arg[1]] = $this->reduce($arg[2]);
+ }
+ break;
+
+ case "lit":
+ $orderedArgs[] = $this->reduce($arg[1]);
+ break;
+ default:
+ $this->throwError("Unknown arg type: " . $arg[0]);
+ }
+ }
+
+ $mixins = $this->findBlocks($block, $path, $orderedArgs, $keywordArgs);
+
+ if ($mixins === null) {
+ $this->throwError("{$prop[1][0]} is undefined");
+ }
+
+ foreach ($mixins as $mixin) {
+ if ($mixin === $block && !$orderedArgs) {
+ continue;
+ }
+
+ $haveScope = false;
+ if (isset($mixin->parent->scope)) {
+ $haveScope = true;
+ $mixinParentEnv = $this->pushEnv();
+ $mixinParentEnv->storeParent = $mixin->parent->scope;
+ }
+
+ $haveArgs = false;
+ if (isset($mixin->args)) {
+ $haveArgs = true;
+ $this->pushEnv();
+ $this->zipSetArgs($mixin->args, $orderedArgs, $keywordArgs);
+ }
+
+ $oldParent = $mixin->parent;
+ if ($mixin != $block) $mixin->parent = $block;
+
+ foreach ($this->sortProps($mixin->props) as $subProp) {
+ if ($suffix !== null &&
+ $subProp[0] == "assign" &&
+ is_string($subProp[1]) &&
+ $subProp[1]{0} != $this->vPrefix)
+ {
+ $subProp[2] = array(
+ 'list', ' ',
+ array($subProp[2], array('keyword', $suffix))
+ );
+ }
+
+ $this->compileProp($subProp, $mixin, $out);
+ }
+
+ $mixin->parent = $oldParent;
+
+ if ($haveArgs) $this->popEnv();
+ if ($haveScope) $this->popEnv();
+ }
+
+ break;
+ case 'raw':
+ $out->lines[] = $prop[1];
+ break;
+ case "directive":
+ list(, $name, $value) = $prop;
+ $out->lines[] = "@$name " . $this->compileValue($this->reduce($value)).';';
+ break;
+ case "comment":
+ $out->lines[] = $prop[1];
+ break;
+ case "import";
+ list(, $importPath, $importId) = $prop;
+ $importPath = $this->reduce($importPath);
+
+ if (!isset($this->env->imports)) {
+ $this->env->imports = array();
+ }
+
+ $result = $this->tryImport($importPath, $block, $out);
+
+ $this->env->imports[$importId] = $result === false ?
+ array(false, "@import " . $this->compileValue($importPath).";") :
+ $result;
+
+ break;
+ case "import_mixin":
+ list(,$importId) = $prop;
+ $import = $this->env->imports[$importId];
+ if ($import[0] === false) {
+ if (isset($import[1])) {
+ $out->lines[] = $import[1];
+ }
+ } else {
+ list(, $bottom, $parser, $importDir) = $import;
+ $this->compileImportedProps($bottom, $block, $out, $parser, $importDir);
+ }
+
+ break;
+ default:
+ $this->throwError("unknown op: {$prop[0]}\n");
+ }
+ }
+
+
+ /**
+ * Compiles a primitive value into a CSS property value.
+ *
+ * Values in lessphp are typed by being wrapped in arrays, their format is
+ * typically:
+ *
+ * array(type, contents [, additional_contents]*)
+ *
+ * The input is expected to be reduced. This function will not work on
+ * things like expressions and variables.
+ */
+ protected function compileValue($value) {
+ switch ($value[0]) {
+ case 'list':
+ // [1] - delimiter
+ // [2] - array of values
+ return implode($value[1], array_map(array($this, 'compileValue'), $value[2]));
+ case 'raw_color':
+ if (!empty($this->formatter->compressColors)) {
+ return $this->compileValue($this->coerceColor($value));
+ }
+ return $value[1];
+ case 'keyword':
+ // [1] - the keyword
+ return $value[1];
+ case 'number':
+ list(, $num, $unit) = $value;
+ // [1] - the number
+ // [2] - the unit
+ if ($this->numberPrecision !== null) {
+ $num = round($num, $this->numberPrecision);
+ }
+ return $num . $unit;
+ case 'string':
+ // [1] - contents of string (includes quotes)
+ list(, $delim, $content) = $value;
+ foreach ($content as &$part) {
+ if (is_array($part)) {
+ $part = $this->compileValue($part);
+ }
+ }
+ return $delim . implode($content) . $delim;
+ case 'color':
+ // [1] - red component (either number or a %)
+ // [2] - green component
+ // [3] - blue component
+ // [4] - optional alpha component
+ list(, $r, $g, $b) = $value;
+ $r = round($r);
+ $g = round($g);
+ $b = round($b);
+
+ if (count($value) == 5 && $value[4] != 1) { // rgba
+ return 'rgba('.$r.','.$g.','.$b.','.$value[4].')';
+ }
+
+ $h = sprintf("#%02x%02x%02x", $r, $g, $b);
+
+ if (!empty($this->formatter->compressColors)) {
+ // Converting hex color to short notation (e.g. #003399 to #039)
+ if ($h[1] === $h[2] && $h[3] === $h[4] && $h[5] === $h[6]) {
+ $h = '#' . $h[1] . $h[3] . $h[5];
+ }
+ }
+
+ return $h;
+
+ case 'function':
+ list(, $name, $args) = $value;
+ return $name.'('.$this->compileValue($args).')';
+ default: // assumed to be unit
+ $this->throwError("unknown value type: $value[0]");
+ }
+ }
+
+ protected function lib_pow($args) {
+ list($base, $exp) = $this->assertArgs($args, 2, "pow");
+ return pow($this->assertNumber($base), $this->assertNumber($exp));
+ }
+
+ protected function lib_pi() {
+ return pi();
+ }
+
+ protected function lib_mod($args) {
+ list($a, $b) = $this->assertArgs($args, 2, "mod");
+ return $this->assertNumber($a) % $this->assertNumber($b);
+ }
+
+ protected function lib_tan($num) {
+ return tan($this->assertNumber($num));
+ }
+
+ protected function lib_sin($num) {
+ return sin($this->assertNumber($num));
+ }
+
+ protected function lib_cos($num) {
+ return cos($this->assertNumber($num));
+ }
+
+ protected function lib_atan($num) {
+ $num = atan($this->assertNumber($num));
+ return array("number", $num, "rad");
+ }
+
+ protected function lib_asin($num) {
+ $num = asin($this->assertNumber($num));
+ return array("number", $num, "rad");
+ }
+
+ protected function lib_acos($num) {
+ $num = acos($this->assertNumber($num));
+ return array("number", $num, "rad");
+ }
+
+ protected function lib_sqrt($num) {
+ return sqrt($this->assertNumber($num));
+ }
+
+ protected function lib_extract($value) {
+ list($list, $idx) = $this->assertArgs($value, 2, "extract");
+ $idx = $this->assertNumber($idx);
+ // 1 indexed
+ if ($list[0] == "list" && isset($list[2][$idx - 1])) {
+ return $list[2][$idx - 1];
+ }
+ }
+
+ protected function lib_isnumber($value) {
+ return $this->toBool($value[0] == "number");
+ }
+
+ protected function lib_isstring($value) {
+ return $this->toBool($value[0] == "string");
+ }
+
+ protected function lib_iscolor($value) {
+ return $this->toBool($this->coerceColor($value));
+ }
+
+ protected function lib_iskeyword($value) {
+ return $this->toBool($value[0] == "keyword");
+ }
+
+ protected function lib_ispixel($value) {
+ return $this->toBool($value[0] == "number" && $value[2] == "px");
+ }
+
+ protected function lib_ispercentage($value) {
+ return $this->toBool($value[0] == "number" && $value[2] == "%");
+ }
+
+ protected function lib_isem($value) {
+ return $this->toBool($value[0] == "number" && $value[2] == "em");
+ }
+
+ protected function lib_isrem($value) {
+ return $this->toBool($value[0] == "number" && $value[2] == "rem");
+ }
+
+ protected function lib_rgbahex($color) {
+ $color = $this->coerceColor($color);
+ if (is_null($color))
+ $this->throwError("color expected for rgbahex");
+
+ return sprintf("#%02x%02x%02x%02x",
+ isset($color[4]) ? $color[4]*255 : 255,
+ $color[1],$color[2], $color[3]);
+ }
+
+ protected function lib_argb($color){
+ return $this->lib_rgbahex($color);
+ }
+
+ // utility func to unquote a string
+ protected function lib_e($arg) {
+ switch ($arg[0]) {
+ case "list":
+ $items = $arg[2];
+ if (isset($items[0])) {
+ return $this->lib_e($items[0]);
+ }
+ $this->throwError("unrecognised input");
+ case "string":
+ $arg[1] = "";
+ return $arg;
+ case "keyword":
+ return $arg;
+ default:
+ return array("keyword", $this->compileValue($arg));
+ }
+ }
+
+ protected function lib__sprintf($args) {
+ if ($args[0] != "list") return $args;
+ $values = $args[2];
+ $string = array_shift($values);
+ $template = $this->compileValue($this->lib_e($string));
+
+ $i = 0;
+ if (preg_match_all('/%[dsa]/', $template, $m)) {
+ foreach ($m[0] as $match) {
+ $val = isset($values[$i]) ?
+ $this->reduce($values[$i]) : array('keyword', '');
+
+ // lessjs compat, renders fully expanded color, not raw color
+ if ($color = $this->coerceColor($val)) {
+ $val = $color;
+ }
+
+ $i++;
+ $rep = $this->compileValue($this->lib_e($val));
+ $template = preg_replace('/'.self::preg_quote($match).'/',
+ $rep, $template, 1);
+ }
+ }
+
+ $d = $string[0] == "string" ? $string[1] : '"';
+ return array("string", $d, array($template));
+ }
+
+ protected function lib_floor($arg) {
+ $value = $this->assertNumber($arg);
+ return array("number", floor($value), $arg[2]);
+ }
+
+ protected function lib_ceil($arg) {
+ $value = $this->assertNumber($arg);
+ return array("number", ceil($value), $arg[2]);
+ }
+
+ protected function lib_round($arg) {
+ if($arg[0] != "list") {
+ $value = $this->assertNumber($arg);
+ return array("number", round($value), $arg[2]);
+ } else {
+ $value = $this->assertNumber($arg[2][0]);
+ $precision = $this->assertNumber($arg[2][1]);
+ return array("number", round($value, $precision), $arg[2][0][2]);
+ }
+ }
+
+ protected function lib_unit($arg) {
+ if ($arg[0] == "list") {
+ list($number, $newUnit) = $arg[2];
+ return array("number", $this->assertNumber($number),
+ $this->compileValue($this->lib_e($newUnit)));
+ } else {
+ return array("number", $this->assertNumber($arg), "");
+ }
+ }
+
+ /**
+ * Helper function to get arguments for color manipulation functions.
+ * takes a list that contains a color like thing and a percentage
+ */
+ public function colorArgs($args) {
+ if ($args[0] != 'list' || count($args[2]) < 2) {
+ return array(array('color', 0, 0, 0), 0);
+ }
+ list($color, $delta) = $args[2];
+ $color = $this->assertColor($color);
+ $delta = floatval($delta[1]);
+
+ return array($color, $delta);
+ }
+
+ protected function lib_darken($args) {
+ list($color, $delta) = $this->colorArgs($args);
+
+ $hsl = $this->toHSL($color);
+ $hsl[3] = $this->clamp($hsl[3] - $delta, 100);
+ return $this->toRGB($hsl);
+ }
+
+ protected function lib_lighten($args) {
+ list($color, $delta) = $this->colorArgs($args);
+
+ $hsl = $this->toHSL($color);
+ $hsl[3] = $this->clamp($hsl[3] + $delta, 100);
+ return $this->toRGB($hsl);
+ }
+
+ protected function lib_saturate($args) {
+ list($color, $delta) = $this->colorArgs($args);
+
+ $hsl = $this->toHSL($color);
+ $hsl[2] = $this->clamp($hsl[2] + $delta, 100);
+ return $this->toRGB($hsl);
+ }
+
+ protected function lib_desaturate($args) {
+ list($color, $delta) = $this->colorArgs($args);
+
+ $hsl = $this->toHSL($color);
+ $hsl[2] = $this->clamp($hsl[2] - $delta, 100);
+ return $this->toRGB($hsl);
+ }
+
+ protected function lib_spin($args) {
+ list($color, $delta) = $this->colorArgs($args);
+
+ $hsl = $this->toHSL($color);
+
+ $hsl[1] = $hsl[1] + $delta % 360;
+ if ($hsl[1] < 0) $hsl[1] += 360;
+
+ return $this->toRGB($hsl);
+ }
+
+ protected function lib_fadeout($args) {
+ list($color, $delta) = $this->colorArgs($args);
+ $color[4] = $this->clamp((isset($color[4]) ? $color[4] : 1) - $delta/100);
+ return $color;
+ }
+
+ protected function lib_fadein($args) {
+ list($color, $delta) = $this->colorArgs($args);
+ $color[4] = $this->clamp((isset($color[4]) ? $color[4] : 1) + $delta/100);
+ return $color;
+ }
+
+ protected function lib_hue($color) {
+ $hsl = $this->toHSL($this->assertColor($color));
+ return round($hsl[1]);
+ }
+
+ protected function lib_saturation($color) {
+ $hsl = $this->toHSL($this->assertColor($color));
+ return round($hsl[2]);
+ }
+
+ protected function lib_lightness($color) {
+ $hsl = $this->toHSL($this->assertColor($color));
+ return round($hsl[3]);
+ }
+
+ // get the alpha of a color
+ // defaults to 1 for non-colors or colors without an alpha
+ protected function lib_alpha($value) {
+ if (!is_null($color = $this->coerceColor($value))) {
+ return isset($color[4]) ? $color[4] : 1;
+ }
+ }
+
+ // set the alpha of the color
+ protected function lib_fade($args) {
+ list($color, $alpha) = $this->colorArgs($args);
+ $color[4] = $this->clamp($alpha / 100.0);
+ return $color;
+ }
+
+ protected function lib_percentage($arg) {
+ $num = $this->assertNumber($arg);
+ return array("number", $num*100, "%");
+ }
+
+ // mixes two colors by weight
+ // mix(@color1, @color2, [@weight: 50%]);
+ // http://sass-lang.com/docs/yardoc/Sass/Script/Functions.html#mix-instance_method
+ protected function lib_mix($args) {
+ if ($args[0] != "list" || count($args[2]) < 2)
+ $this->throwError("mix expects (color1, color2, weight)");
+
+ list($first, $second) = $args[2];
+ $first = $this->assertColor($first);
+ $second = $this->assertColor($second);
+
+ $first_a = $this->lib_alpha($first);
+ $second_a = $this->lib_alpha($second);
+
+ if (isset($args[2][2])) {
+ $weight = $args[2][2][1] / 100.0;
+ } else {
+ $weight = 0.5;
+ }
+
+ $w = $weight * 2 - 1;
+ $a = $first_a - $second_a;
+
+ $w1 = (($w * $a == -1 ? $w : ($w + $a)/(1 + $w * $a)) + 1) / 2.0;
+ $w2 = 1.0 - $w1;
+
+ $new = array('color',
+ $w1 * $first[1] + $w2 * $second[1],
+ $w1 * $first[2] + $w2 * $second[2],
+ $w1 * $first[3] + $w2 * $second[3],
+ );
+
+ if ($first_a != 1.0 || $second_a != 1.0) {
+ $new[] = $first_a * $weight + $second_a * ($weight - 1);
+ }
+
+ return $this->fixColor($new);
+ }
+
+ protected function lib_contrast($args) {
+ if ($args[0] != 'list' || count($args[2]) < 3) {
+ return array(array('color', 0, 0, 0), 0);
+ }
+
+ list($inputColor, $darkColor, $lightColor) = $args[2];
+
+ $inputColor = $this->assertColor($inputColor);
+ $darkColor = $this->assertColor($darkColor);
+ $lightColor = $this->assertColor($lightColor);
+ $hsl = $this->toHSL($inputColor);
+
+ if ($hsl[3] > 50) {
+ return $darkColor;
+ }
+
+ return $lightColor;
+ }
+
+ public function assertColor($value, $error = "expected color value") {
+ $color = $this->coerceColor($value);
+ if (is_null($color)) $this->throwError($error);
+ return $color;
+ }
+
+ public function assertNumber($value, $error = "expecting number") {
+ if ($value[0] == "number") return $value[1];
+ $this->throwError($error);
+ }
+
+ public function assertArgs($value, $expectedArgs, $name="") {
+ if ($expectedArgs == 1) {
+ return $value;
+ } else {
+ if ($value[0] !== "list" || $value[1] != ",") $this->throwError("expecting list");
+ $values = $value[2];
+ $numValues = count($values);
+ if ($expectedArgs != $numValues) {
+ if ($name) {
+ $name = $name . ": ";
+ }
+
+ $this->throwError("${name}expecting $expectedArgs arguments, got $numValues");
+ }
+
+ return $values;
+ }
+ }
+
+ protected function toHSL($color) {
+ if ($color[0] == 'hsl') return $color;
+
+ $r = $color[1] / 255;
+ $g = $color[2] / 255;
+ $b = $color[3] / 255;
+
+ $min = min($r, $g, $b);
+ $max = max($r, $g, $b);
+
+ $L = ($min + $max) / 2;
+ if ($min == $max) {
+ $S = $H = 0;
+ } else {
+ if ($L < 0.5)
+ $S = ($max - $min)/($max + $min);
+ else
+ $S = ($max - $min)/(2.0 - $max - $min);
+
+ if ($r == $max) $H = ($g - $b)/($max - $min);
+ elseif ($g == $max) $H = 2.0 + ($b - $r)/($max - $min);
+ elseif ($b == $max) $H = 4.0 + ($r - $g)/($max - $min);
+
+ }
+
+ $out = array('hsl',
+ ($H < 0 ? $H + 6 : $H)*60,
+ $S*100,
+ $L*100,
+ );
+
+ if (count($color) > 4) $out[] = $color[4]; // copy alpha
+ return $out;
+ }
+
+ protected function toRGB_helper($comp, $temp1, $temp2) {
+ if ($comp < 0) $comp += 1.0;
+ elseif ($comp > 1) $comp -= 1.0;
+
+ if (6 * $comp < 1) return $temp1 + ($temp2 - $temp1) * 6 * $comp;
+ if (2 * $comp < 1) return $temp2;
+ if (3 * $comp < 2) return $temp1 + ($temp2 - $temp1)*((2/3) - $comp) * 6;
+
+ return $temp1;
+ }
+
+ /**
+ * Converts a hsl array into a color value in rgb.
+ * Expects H to be in range of 0 to 360, S and L in 0 to 100
+ */
+ protected function toRGB($color) {
+ if ($color[0] == 'color') return $color;
+
+ $H = $color[1] / 360;
+ $S = $color[2] / 100;
+ $L = $color[3] / 100;
+
+ if ($S == 0) {
+ $r = $g = $b = $L;
+ } else {
+ $temp2 = $L < 0.5 ?
+ $L*(1.0 + $S) :
+ $L + $S - $L * $S;
+
+ $temp1 = 2.0 * $L - $temp2;
+
+ $r = $this->toRGB_helper($H + 1/3, $temp1, $temp2);
+ $g = $this->toRGB_helper($H, $temp1, $temp2);
+ $b = $this->toRGB_helper($H - 1/3, $temp1, $temp2);
+ }
+
+ // $out = array('color', round($r*255), round($g*255), round($b*255));
+ $out = array('color', $r*255, $g*255, $b*255);
+ if (count($color) > 4) $out[] = $color[4]; // copy alpha
+ return $out;
+ }
+
+ protected function clamp($v, $max = 1, $min = 0) {
+ return min($max, max($min, $v));
+ }
+
+ /**
+ * Convert the rgb, rgba, hsl color literals of function type
+ * as returned by the parser into values of color type.
+ */
+ protected function funcToColor($func) {
+ $fname = $func[1];
+ if ($func[2][0] != 'list') return false; // need a list of arguments
+ $rawComponents = $func[2][2];
+
+ if ($fname == 'hsl' || $fname == 'hsla') {
+ $hsl = array('hsl');
+ $i = 0;
+ foreach ($rawComponents as $c) {
+ $val = $this->reduce($c);
+ $val = isset($val[1]) ? floatval($val[1]) : 0;
+
+ if ($i == 0) $clamp = 360;
+ elseif ($i < 3) $clamp = 100;
+ else $clamp = 1;
+
+ $hsl[] = $this->clamp($val, $clamp);
+ $i++;
+ }
+
+ while (count($hsl) < 4) $hsl[] = 0;
+ return $this->toRGB($hsl);
+
+ } elseif ($fname == 'rgb' || $fname == 'rgba') {
+ $components = array();
+ $i = 1;
+ foreach ($rawComponents as $c) {
+ $c = $this->reduce($c);
+ if ($i < 4) {
+ if ($c[0] == "number" && $c[2] == "%") {
+ $components[] = 255 * ($c[1] / 100);
+ } else {
+ $components[] = floatval($c[1]);
+ }
+ } elseif ($i == 4) {
+ if ($c[0] == "number" && $c[2] == "%") {
+ $components[] = 1.0 * ($c[1] / 100);
+ } else {
+ $components[] = floatval($c[1]);
+ }
+ } else break;
+
+ $i++;
+ }
+ while (count($components) < 3) $components[] = 0;
+ array_unshift($components, 'color');
+ return $this->fixColor($components);
+ }
+
+ return false;
+ }
+
+ protected function reduce($value, $forExpression = false) {
+ switch ($value[0]) {
+ case "interpolate":
+ $reduced = $this->reduce($value[1]);
+ $var = $this->compileValue($reduced);
+ $res = $this->reduce(array("variable", $this->vPrefix . $var));
+
+ if ($res[0] == "raw_color") {
+ $res = $this->coerceColor($res);
+ }
+
+ if (empty($value[2])) $res = $this->lib_e($res);
+
+ return $res;
+ case "variable":
+ $key = $value[1];
+ if (is_array($key)) {
+ $key = $this->reduce($key);
+ $key = $this->vPrefix . $this->compileValue($this->lib_e($key));
+ }
+
+ $seen =& $this->env->seenNames;
+
+ if (!empty($seen[$key])) {
+ $this->throwError("infinite loop detected: $key");
+ }
+
+ $seen[$key] = true;
+ $out = $this->reduce($this->get($key));
+ $seen[$key] = false;
+ return $out;
+ case "list":
+ foreach ($value[2] as &$item) {
+ $item = $this->reduce($item, $forExpression);
+ }
+ return $value;
+ case "expression":
+ return $this->evaluate($value);
+ case "string":
+ foreach ($value[2] as &$part) {
+ if (is_array($part)) {
+ $strip = $part[0] == "variable";
+ $part = $this->reduce($part);
+ if ($strip) $part = $this->lib_e($part);
+ }
+ }
+ return $value;
+ case "escape":
+ list(,$inner) = $value;
+ return $this->lib_e($this->reduce($inner));
+ case "function":
+ $color = $this->funcToColor($value);
+ if ($color) return $color;
+
+ list(, $name, $args) = $value;
+ if ($name == "%") $name = "_sprintf";
+ $f = isset($this->libFunctions[$name]) ?
+ $this->libFunctions[$name] : array($this, 'lib_'.$name);
+
+ if (is_callable($f)) {
+ if ($args[0] == 'list')
+ $args = self::compressList($args[2], $args[1]);
+
+ $ret = call_user_func($f, $this->reduce($args, true), $this);
+
+ if (is_null($ret)) {
+ return array("string", "", array(
+ $name, "(", $args, ")"
+ ));
+ }
+
+ // convert to a typed value if the result is a php primitive
+ if (is_numeric($ret)) $ret = array('number', $ret, "");
+ elseif (!is_array($ret)) $ret = array('keyword', $ret);
+
+ return $ret;
+ }
+
+ // plain function, reduce args
+ $value[2] = $this->reduce($value[2]);
+ return $value;
+ case "unary":
+ list(, $op, $exp) = $value;
+ $exp = $this->reduce($exp);
+
+ if ($exp[0] == "number") {
+ switch ($op) {
+ case "+":
+ return $exp;
+ case "-":
+ $exp[1] *= -1;
+ return $exp;
+ }
+ }
+ return array("string", "", array($op, $exp));
+ }
+
+ if ($forExpression) {
+ switch ($value[0]) {
+ case "keyword":
+ if ($color = $this->coerceColor($value)) {
+ return $color;
+ }
+ break;
+ case "raw_color":
+ return $this->coerceColor($value);
+ }
+ }
+
+ return $value;
+ }
+
+
+ // coerce a value for use in color operation
+ protected function coerceColor($value) {
+ switch($value[0]) {
+ case 'color': return $value;
+ case 'raw_color':
+ $c = array("color", 0, 0, 0);
+ $colorStr = substr($value[1], 1);
+ $num = hexdec($colorStr);
+ $width = strlen($colorStr) == 3 ? 16 : 256;
+
+ for ($i = 3; $i > 0; $i--) { // 3 2 1
+ $t = $num % $width;
+ $num /= $width;
+
+ $c[$i] = $t * (256/$width) + $t * floor(16/$width);
+ }
+
+ return $c;
+ case 'keyword':
+ $name = $value[1];
+ if (isset(self::$cssColors[$name])) {
+ $rgba = explode(',', self::$cssColors[$name]);
+
+ if(isset($rgba[3]))
+ return array('color', $rgba[0], $rgba[1], $rgba[2], $rgba[3]);
+
+ return array('color', $rgba[0], $rgba[1], $rgba[2]);
+ }
+ return null;
+ }
+ }
+
+ // make something string like into a string
+ protected function coerceString($value) {
+ switch ($value[0]) {
+ case "string":
+ return $value;
+ case "keyword":
+ return array("string", "", array($value[1]));
+ }
+ return null;
+ }
+
+ // turn list of length 1 into value type
+ protected function flattenList($value) {
+ if ($value[0] == "list" && count($value[2]) == 1) {
+ return $this->flattenList($value[2][0]);
+ }
+ return $value;
+ }
+
+ public function toBool($a) {
+ if ($a) return self::$TRUE;
+ else return self::$FALSE;
+ }
+
+ // evaluate an expression
+ protected function evaluate($exp) {
+ list(, $op, $left, $right, $whiteBefore, $whiteAfter) = $exp;
+
+ $left = $this->reduce($left, true);
+ $right = $this->reduce($right, true);
+
+ if ($leftColor = $this->coerceColor($left)) {
+ $left = $leftColor;
+ }
+
+ if ($rightColor = $this->coerceColor($right)) {
+ $right = $rightColor;
+ }
+
+ $ltype = $left[0];
+ $rtype = $right[0];
+
+ // operators that work on all types
+ if ($op == "and") {
+ return $this->toBool($left == self::$TRUE && $right == self::$TRUE);
+ }
+
+ if ($op == "=") {
+ return $this->toBool($this->eq($left, $right) );
+ }
+
+ if ($op == "+" && !is_null($str = $this->stringConcatenate($left, $right))) {
+ return $str;
+ }
+
+ // type based operators
+ $fname = "op_${ltype}_${rtype}";
+ if (is_callable(array($this, $fname))) {
+ $out = $this->$fname($op, $left, $right);
+ if (!is_null($out)) return $out;
+ }
+
+ // make the expression look it did before being parsed
+ $paddedOp = $op;
+ if ($whiteBefore) $paddedOp = " " . $paddedOp;
+ if ($whiteAfter) $paddedOp .= " ";
+
+ return array("string", "", array($left, $paddedOp, $right));
+ }
+
+ protected function stringConcatenate($left, $right) {
+ if ($strLeft = $this->coerceString($left)) {
+ if ($right[0] == "string") {
+ $right[1] = "";
+ }
+ $strLeft[2][] = $right;
+ return $strLeft;
+ }
+
+ if ($strRight = $this->coerceString($right)) {
+ array_unshift($strRight[2], $left);
+ return $strRight;
+ }
+ }
+
+
+ // make sure a color's components don't go out of bounds
+ protected function fixColor($c) {
+ foreach (range(1, 3) as $i) {
+ if ($c[$i] < 0) $c[$i] = 0;
+ if ($c[$i] > 255) $c[$i] = 255;
+ }
+
+ return $c;
+ }
+
+ protected function op_number_color($op, $lft, $rgt) {
+ if ($op == '+' || $op == '*') {
+ return $this->op_color_number($op, $rgt, $lft);
+ }
+ }
+
+ protected function op_color_number($op, $lft, $rgt) {
+ if ($rgt[0] == '%') $rgt[1] /= 100;
+
+ return $this->op_color_color($op, $lft,
+ array_fill(1, count($lft) - 1, $rgt[1]));
+ }
+
+ protected function op_color_color($op, $left, $right) {
+ $out = array('color');
+ $max = count($left) > count($right) ? count($left) : count($right);
+ foreach (range(1, $max - 1) as $i) {
+ $lval = isset($left[$i]) ? $left[$i] : 0;
+ $rval = isset($right[$i]) ? $right[$i] : 0;
+ switch ($op) {
+ case '+':
+ $out[] = $lval + $rval;
+ break;
+ case '-':
+ $out[] = $lval - $rval;
+ break;
+ case '*':
+ $out[] = $lval * $rval;
+ break;
+ case '%':
+ $out[] = $lval % $rval;
+ break;
+ case '/':
+ if ($rval == 0) $this->throwError("evaluate error: can't divide by zero");
+ $out[] = $lval / $rval;
+ break;
+ default:
+ $this->throwError('evaluate error: color op number failed on op '.$op);
+ }
+ }
+ return $this->fixColor($out);
+ }
+
+ function lib_red($color){
+ $color = $this->coerceColor($color);
+ if (is_null($color)) {
+ $this->throwError('color expected for red()');
+ }
+
+ return $color[1];
+ }
+
+ function lib_green($color){
+ $color = $this->coerceColor($color);
+ if (is_null($color)) {
+ $this->throwError('color expected for green()');
+ }
+
+ return $color[2];
+ }
+
+ function lib_blue($color){
+ $color = $this->coerceColor($color);
+ if (is_null($color)) {
+ $this->throwError('color expected for blue()');
+ }
+
+ return $color[3];
+ }
+
+
+ // operator on two numbers
+ protected function op_number_number($op, $left, $right) {
+ $unit = empty($left[2]) ? $right[2] : $left[2];
+
+ $value = 0;
+ switch ($op) {
+ case '+':
+ $value = $left[1] + $right[1];
+ break;
+ case '*':
+ $value = $left[1] * $right[1];
+ break;
+ case '-':
+ $value = $left[1] - $right[1];
+ break;
+ case '%':
+ $value = $left[1] % $right[1];
+ break;
+ case '/':
+ if ($right[1] == 0) $this->throwError('parse error: divide by zero');
+ $value = $left[1] / $right[1];
+ break;
+ case '<':
+ return $this->toBool($left[1] < $right[1]);
+ case '>':
+ return $this->toBool($left[1] > $right[1]);
+ case '>=':
+ return $this->toBool($left[1] >= $right[1]);
+ case '=<':
+ return $this->toBool($left[1] <= $right[1]);
+ default:
+ $this->throwError('parse error: unknown number operator: '.$op);
+ }
+
+ return array("number", $value, $unit);
+ }
+
+
+ /* environment functions */
+
+ protected function makeOutputBlock($type, $selectors = null) {
+ $b = new stdclass;
+ $b->lines = array();
+ $b->children = array();
+ $b->selectors = $selectors;
+ $b->type = $type;
+ $b->parent = $this->scope;
+ return $b;
+ }
+
+ // the state of execution
+ protected function pushEnv($block = null) {
+ $e = new stdclass;
+ $e->parent = $this->env;
+ $e->store = array();
+ $e->block = $block;
+
+ $this->env = $e;
+ return $e;
+ }
+
+ // pop something off the stack
+ protected function popEnv() {
+ $old = $this->env;
+ $this->env = $this->env->parent;
+ return $old;
+ }
+
+ // set something in the current env
+ protected function set($name, $value) {
+ $this->env->store[$name] = $value;
+ }
+
+
+ // get the highest occurrence entry for a name
+ protected function get($name) {
+ $current = $this->env;
+
+ $isArguments = $name == $this->vPrefix . 'arguments';
+ while ($current) {
+ if ($isArguments && isset($current->arguments)) {
+ return array('list', ' ', $current->arguments);
+ }
+
+ if (isset($current->store[$name]))
+ return $current->store[$name];
+ else {
+ $current = isset($current->storeParent) ?
+ $current->storeParent : $current->parent;
+ }
+ }
+
+ $this->throwError("variable $name is undefined");
+ }
+
+ // inject array of unparsed strings into environment as variables
+ protected function injectVariables($args) {
+ $this->pushEnv();
+ $parser = new lessc_parser($this, __METHOD__);
+ foreach ($args as $name => $strValue) {
+ if ($name{0} != '@') $name = '@'.$name;
+ $parser->count = 0;
+ $parser->buffer = (string)$strValue;
+ if (!$parser->propertyValue($value)) {
+ throw new Exception("failed to parse passed in variable $name: $strValue");
+ }
+
+ $this->set($name, $value);
+ }
+ }
+
+ /**
+ * Initialize any static state, can initialize parser for a file
+ * $opts isn't used yet
+ */
+ public function __construct($fname = null) {
+ if ($fname !== null) {
+ // used for deprecated parse method
+ $this->_parseFile = $fname;
+ }
+ }
+
+ public function compile($string, $name = null) {
+ $locale = setlocale(LC_NUMERIC, 0);
+ setlocale(LC_NUMERIC, "C");
+
+ $this->parser = $this->makeParser($name);
+ $root = $this->parser->parse($string);
+
+ $this->env = null;
+ $this->scope = null;
+
+ $this->formatter = $this->newFormatter();
+
+ if (!empty($this->registeredVars)) {
+ $this->injectVariables($this->registeredVars);
+ }
+
+ $this->sourceParser = $this->parser; // used for error messages
+ $this->compileBlock($root);
+
+ ob_start();
+ $this->formatter->block($this->scope);
+ $out = ob_get_clean();
+ setlocale(LC_NUMERIC, $locale);
+ return $out;
+ }
+
+ public function compileFile($fname, $outFname = null) {
+ if (!is_readable($fname)) {
+ throw new Exception('load error: failed to find '.$fname);
+ }
+
+ $pi = pathinfo($fname);
+
+ $oldImport = $this->importDir;
+
+ $this->importDir = (array)$this->importDir;
+ $this->importDir[] = $pi['dirname'].'/';
+
+ $this->addParsedFile($fname);
+
+ $out = $this->compile(file_get_contents($fname), $fname);
+
+ $this->importDir = $oldImport;
+
+ if ($outFname !== null) {
+ return file_put_contents($outFname, $out);
+ }
+
+ return $out;
+ }
+
+ // compile only if changed input has changed or output doesn't exist
+ public function checkedCompile($in, $out) {
+ if (!is_file($out) || filemtime($in) > filemtime($out)) {
+ $this->compileFile($in, $out);
+ return true;
+ }
+ return false;
+ }
+
+ /**
+ * Execute lessphp on a .less file or a lessphp cache structure
+ *
+ * The lessphp cache structure contains information about a specific
+ * less file having been parsed. It can be used as a hint for future
+ * calls to determine whether or not a rebuild is required.
+ *
+ * The cache structure contains two important keys that may be used
+ * externally:
+ *
+ * compiled: The final compiled CSS
+ * updated: The time (in seconds) the CSS was last compiled
+ *
+ * The cache structure is a plain-ol' PHP associative array and can
+ * be serialized and unserialized without a hitch.
+ *
+ * @param mixed $in Input
+ * @param bool $force Force rebuild?
+ * @return array lessphp cache structure
+ */
+ public function cachedCompile($in, $force = false) {
+ // assume no root
+ $root = null;
+
+ if (is_string($in)) {
+ $root = $in;
+ } elseif (is_array($in) and isset($in['root'])) {
+ if ($force or ! isset($in['files'])) {
+ // If we are forcing a recompile or if for some reason the
+ // structure does not contain any file information we should
+ // specify the root to trigger a rebuild.
+ $root = $in['root'];
+ } elseif (isset($in['files']) and is_array($in['files'])) {
+ foreach ($in['files'] as $fname => $ftime ) {
+ if (!file_exists($fname) or filemtime($fname) > $ftime) {
+ // One of the files we knew about previously has changed
+ // so we should look at our incoming root again.
+ $root = $in['root'];
+ break;
+ }
+ }
+ }
+ } else {
+ // TODO: Throw an exception? We got neither a string nor something
+ // that looks like a compatible lessphp cache structure.
+ return null;
+ }
+
+ if ($root !== null) {
+ // If we have a root value which means we should rebuild.
+ $out = array();
+ $out['root'] = $root;
+ $out['compiled'] = $this->compileFile($root);
+ $out['files'] = $this->allParsedFiles();
+ $out['updated'] = time();
+ return $out;
+ } else {
+ // No changes, pass back the structure
+ // we were given initially.
+ return $in;
+ }
+
+ }
+
+ // parse and compile buffer
+ // This is deprecated
+ public function parse($str = null, $initialVariables = null) {
+ if (is_array($str)) {
+ $initialVariables = $str;
+ $str = null;
+ }
+
+ $oldVars = $this->registeredVars;
+ if ($initialVariables !== null) {
+ $this->setVariables($initialVariables);
+ }
+
+ if ($str == null) {
+ if (empty($this->_parseFile)) {
+ throw new exception("nothing to parse");
+ }
+
+ $out = $this->compileFile($this->_parseFile);
+ } else {
+ $out = $this->compile($str);
+ }
+
+ $this->registeredVars = $oldVars;
+ return $out;
+ }
+
+ protected function makeParser($name) {
+ $parser = new lessc_parser($this, $name);
+ $parser->writeComments = $this->preserveComments;
+
+ return $parser;
+ }
+
+ public function setFormatter($name) {
+ $this->formatterName = $name;
+ }
+
+ protected function newFormatter() {
+ $className = "lessc_formatter_lessjs";
+ if (!empty($this->formatterName)) {
+ if (!is_string($this->formatterName))
+ return $this->formatterName;
+ $className = "lessc_formatter_$this->formatterName";
+ }
+
+ return new $className;
+ }
+
+ public function setPreserveComments($preserve) {
+ $this->preserveComments = $preserve;
+ }
+
+ public function registerFunction($name, $func) {
+ $this->libFunctions[$name] = $func;
+ }
+
+ public function unregisterFunction($name) {
+ unset($this->libFunctions[$name]);
+ }
+
+ public function setVariables($variables) {
+ $this->registeredVars = array_merge($this->registeredVars, $variables);
+ }
+
+ public function unsetVariable($name) {
+ unset($this->registeredVars[$name]);
+ }
+
+ public function setImportDir($dirs) {
+ $this->importDir = (array)$dirs;
+ }
+
+ public function addImportDir($dir) {
+ $this->importDir = (array)$this->importDir;
+ $this->importDir[] = $dir;
+ }
+
+ public function allParsedFiles() {
+ return $this->allParsedFiles;
+ }
+
+ public function addParsedFile($file) {
+ $this->allParsedFiles[realpath($file)] = filemtime($file);
+ }
+
+ /**
+ * Uses the current value of $this->count to show line and line number
+ */
+ public function throwError($msg = null) {
+ if ($this->sourceLoc >= 0) {
+ $this->sourceParser->throwError($msg, $this->sourceLoc);
+ }
+ throw new exception($msg);
+ }
+
+ // compile file $in to file $out if $in is newer than $out
+ // returns true when it compiles, false otherwise
+ public static function ccompile($in, $out, $less = null) {
+ if ($less === null) {
+ $less = new self;
+ }
+ return $less->checkedCompile($in, $out);
+ }
+
+ public static function cexecute($in, $force = false, $less = null) {
+ if ($less === null) {
+ $less = new self;
+ }
+ return $less->cachedCompile($in, $force);
+ }
+
+ static protected $cssColors = array(
+ 'aliceblue' => '240,248,255',
+ 'antiquewhite' => '250,235,215',
+ 'aqua' => '0,255,255',
+ 'aquamarine' => '127,255,212',
+ 'azure' => '240,255,255',
+ 'beige' => '245,245,220',
+ 'bisque' => '255,228,196',
+ 'black' => '0,0,0',
+ 'blanchedalmond' => '255,235,205',
+ 'blue' => '0,0,255',
+ 'blueviolet' => '138,43,226',
+ 'brown' => '165,42,42',
+ 'burlywood' => '222,184,135',
+ 'cadetblue' => '95,158,160',
+ 'chartreuse' => '127,255,0',
+ 'chocolate' => '210,105,30',
+ 'coral' => '255,127,80',
+ 'cornflowerblue' => '100,149,237',
+ 'cornsilk' => '255,248,220',
+ 'crimson' => '220,20,60',
+ 'cyan' => '0,255,255',
+ 'darkblue' => '0,0,139',
+ 'darkcyan' => '0,139,139',
+ 'darkgoldenrod' => '184,134,11',
+ 'darkgray' => '169,169,169',
+ 'darkgreen' => '0,100,0',
+ 'darkgrey' => '169,169,169',
+ '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',
+ 'darkseagreen' => '143,188,143',
+ 'darkslateblue' => '72,61,139',
+ 'darkslategray' => '47,79,79',
+ 'darkslategrey' => '47,79,79',
+ 'darkturquoise' => '0,206,209',
+ 'darkviolet' => '148,0,211',
+ 'deeppink' => '255,20,147',
+ 'deepskyblue' => '0,191,255',
+ 'dimgray' => '105,105,105',
+ 'dimgrey' => '105,105,105',
+ 'dodgerblue' => '30,144,255',
+ 'firebrick' => '178,34,34',
+ 'floralwhite' => '255,250,240',
+ 'forestgreen' => '34,139,34',
+ 'fuchsia' => '255,0,255',
+ 'gainsboro' => '220,220,220',
+ 'ghostwhite' => '248,248,255',
+ 'gold' => '255,215,0',
+ 'goldenrod' => '218,165,32',
+ 'gray' => '128,128,128',
+ 'green' => '0,128,0',
+ 'greenyellow' => '173,255,47',
+ 'grey' => '128,128,128',
+ 'honeydew' => '240,255,240',
+ 'hotpink' => '255,105,180',
+ 'indianred' => '205,92,92',
+ 'indigo' => '75,0,130',
+ 'ivory' => '255,255,240',
+ 'khaki' => '240,230,140',
+ 'lavender' => '230,230,250',
+ 'lavenderblush' => '255,240,245',
+ 'lawngreen' => '124,252,0',
+ 'lemonchiffon' => '255,250,205',
+ 'lightblue' => '173,216,230',
+ 'lightcoral' => '240,128,128',
+ 'lightcyan' => '224,255,255',
+ 'lightgoldenrodyellow' => '250,250,210',
+ 'lightgray' => '211,211,211',
+ 'lightgreen' => '144,238,144',
+ 'lightgrey' => '211,211,211',
+ 'lightpink' => '255,182,193',
+ 'lightsalmon' => '255,160,122',
+ 'lightseagreen' => '32,178,170',
+ 'lightskyblue' => '135,206,250',
+ 'lightslategray' => '119,136,153',
+ 'lightslategrey' => '119,136,153',
+ 'lightsteelblue' => '176,196,222',
+ 'lightyellow' => '255,255,224',
+ 'lime' => '0,255,0',
+ 'limegreen' => '50,205,50',
+ 'linen' => '250,240,230',
+ 'magenta' => '255,0,255',
+ 'maroon' => '128,0,0',
+ 'mediumaquamarine' => '102,205,170',
+ 'mediumblue' => '0,0,205',
+ 'mediumorchid' => '186,85,211',
+ 'mediumpurple' => '147,112,219',
+ 'mediumseagreen' => '60,179,113',
+ 'mediumslateblue' => '123,104,238',
+ 'mediumspringgreen' => '0,250,154',
+ 'mediumturquoise' => '72,209,204',
+ 'mediumvioletred' => '199,21,133',
+ 'midnightblue' => '25,25,112',
+ 'mintcream' => '245,255,250',
+ 'mistyrose' => '255,228,225',
+ 'moccasin' => '255,228,181',
+ 'navajowhite' => '255,222,173',
+ 'navy' => '0,0,128',
+ 'oldlace' => '253,245,230',
+ 'olive' => '128,128,0',
+ 'olivedrab' => '107,142,35',
+ 'orange' => '255,165,0',
+ 'orangered' => '255,69,0',
+ 'orchid' => '218,112,214',
+ 'palegoldenrod' => '238,232,170',
+ 'palegreen' => '152,251,152',
+ 'paleturquoise' => '175,238,238',
+ 'palevioletred' => '219,112,147',
+ 'papayawhip' => '255,239,213',
+ 'peachpuff' => '255,218,185',
+ 'peru' => '205,133,63',
+ 'pink' => '255,192,203',
+ 'plum' => '221,160,221',
+ 'powderblue' => '176,224,230',
+ 'purple' => '128,0,128',
+ 'red' => '255,0,0',
+ 'rosybrown' => '188,143,143',
+ 'royalblue' => '65,105,225',
+ 'saddlebrown' => '139,69,19',
+ 'salmon' => '250,128,114',
+ 'sandybrown' => '244,164,96',
+ 'seagreen' => '46,139,87',
+ 'seashell' => '255,245,238',
+ 'sienna' => '160,82,45',
+ 'silver' => '192,192,192',
+ 'skyblue' => '135,206,235',
+ 'slateblue' => '106,90,205',
+ 'slategray' => '112,128,144',
+ 'slategrey' => '112,128,144',
+ 'snow' => '255,250,250',
+ 'springgreen' => '0,255,127',
+ 'steelblue' => '70,130,180',
+ 'tan' => '210,180,140',
+ 'teal' => '0,128,128',
+ 'thistle' => '216,191,216',
+ 'tomato' => '255,99,71',
+ 'transparent' => '0,0,0,0',
+ 'turquoise' => '64,224,208',
+ 'violet' => '238,130,238',
+ 'wheat' => '245,222,179',
+ 'white' => '255,255,255',
+ 'whitesmoke' => '245,245,245',
+ 'yellow' => '255,255,0',
+ 'yellowgreen' => '154,205,50'
+ );
+}
+
+// responsible for taking a string of LESS code and converting it into a
+// syntax tree
+class lessc_parser {
+ static protected $nextBlockId = 0; // used to uniquely identify blocks
+
+ static protected $precedence = array(
+ '=<' => 0,
+ '>=' => 0,
+ '=' => 0,
+ '<' => 0,
+ '>' => 0,
+
+ '+' => 1,
+ '-' => 1,
+ '*' => 2,
+ '/' => 2,
+ '%' => 2,
+ );
+
+ static protected $whitePattern;
+ static protected $commentMulti;
+
+ static protected $commentSingle = "//";
+ static protected $commentMultiLeft = "/*";
+ static protected $commentMultiRight = "*/";
+
+ // regex string to match any of the operators
+ static protected $operatorString;
+
+ // these properties will supress division unless it's inside parenthases
+ static protected $supressDivisionProps =
+ array('/border-radius$/i', '/^font$/i');
+
+ protected $blockDirectives = array("font-face", "keyframes", "page", "-moz-document", "viewport", "-moz-viewport", "-o-viewport", "-ms-viewport");
+ protected $lineDirectives = array("charset");
+
+ /**
+ * if we are in parens we can be more liberal with whitespace around
+ * operators because it must evaluate to a single value and thus is less
+ * ambiguous.
+ *
+ * Consider:
+ * property1: 10 -5; // is two numbers, 10 and -5
+ * property2: (10 -5); // should evaluate to 5
+ */
+ protected $inParens = false;
+
+ // caches preg escaped literals
+ static protected $literalCache = array();
+
+ public function __construct($lessc, $sourceName = null) {
+ $this->eatWhiteDefault = true;
+ // reference to less needed for vPrefix, mPrefix, and parentSelector
+ $this->lessc = $lessc;
+
+ $this->sourceName = $sourceName; // name used for error messages
+
+ $this->writeComments = false;
+
+ if (!self::$operatorString) {
+ self::$operatorString =
+ '('.implode('|', array_map(array('lessc', 'preg_quote'),
+ array_keys(self::$precedence))).')';
+
+ $commentSingle = lessc::preg_quote(self::$commentSingle);
+ $commentMultiLeft = lessc::preg_quote(self::$commentMultiLeft);
+ $commentMultiRight = lessc::preg_quote(self::$commentMultiRight);
+
+ self::$commentMulti = $commentMultiLeft.'.*?'.$commentMultiRight;
+ self::$whitePattern = '/'.$commentSingle.'[^\n]*\s*|('.self::$commentMulti.')\s*|\s+/Ais';
+ }
+ }
+
+ public function parse($buffer) {
+ $this->count = 0;
+ $this->line = 1;
+
+ $this->env = null; // block stack
+ $this->buffer = $this->writeComments ? $buffer : $this->removeComments($buffer);
+ $this->pushSpecialBlock("root");
+ $this->eatWhiteDefault = true;
+ $this->seenComments = array();
+
+ // trim whitespace on head
+ // if (preg_match('/^\s+/', $this->buffer, $m)) {
+ // $this->line += substr_count($m[0], "\n");
+ // $this->buffer = ltrim($this->buffer);
+ // }
+ $this->whitespace();
+
+ // parse the entire file
+ while (false !== $this->parseChunk());
+
+ if ($this->count != strlen($this->buffer))
+ $this->throwError();
+
+ // TODO report where the block was opened
+ if (!is_null($this->env->parent))
+ throw new exception('parse error: unclosed block');
+
+ return $this->env;
+ }
+
+ /**
+ * Parse a single chunk off the head of the buffer and append it to the
+ * current parse environment.
+ * Returns false when the buffer is empty, or when there is an error.
+ *
+ * This function is called repeatedly until the entire document is
+ * parsed.
+ *
+ * This parser is most similar to a recursive descent parser. Single
+ * functions represent discrete grammatical rules for the language, and
+ * they are able to capture the text that represents those rules.
+ *
+ * Consider the function lessc::keyword(). (all parse functions are
+ * structured the same)
+ *
+ * The function takes a single reference argument. When calling the
+ * function it will attempt to match a keyword on the head of the buffer.
+ * If it is successful, it will place the keyword in the referenced
+ * argument, advance the position in the buffer, and return true. If it
+ * fails then it won't advance the buffer and it will return false.
+ *
+ * All of these parse functions are powered by lessc::match(), which behaves
+ * the same way, but takes a literal regular expression. Sometimes it is
+ * more convenient to use match instead of creating a new function.
+ *
+ * Because of the format of the functions, to parse an entire string of
+ * grammatical rules, you can chain them together using &&.
+ *
+ * But, if some of the rules in the chain succeed before one fails, then
+ * the buffer position will be left at an invalid state. In order to
+ * avoid this, lessc::seek() is used to remember and set buffer positions.
+ *
+ * Before parsing a chain, use $s = $this->seek() to remember the current
+ * position into $s. Then if a chain fails, use $this->seek($s) to
+ * go back where we started.
+ */
+ protected function parseChunk() {
+ if (empty($this->buffer)) return false;
+ $s = $this->seek();
+
+ if ($this->whitespace()) {
+ return true;
+ }
+
+ // setting a property
+ if ($this->keyword($key) && $this->assign() &&
+ $this->propertyValue($value, $key) && $this->end())
+ {
+ $this->append(array('assign', $key, $value), $s);
+ return true;
+ } else {
+ $this->seek($s);
+ }
+
+
+ // look for special css blocks
+ if ($this->literal('@', false)) {
+ $this->count--;
+
+ // media
+ if ($this->literal('@media')) {
+ if (($this->mediaQueryList($mediaQueries) || true)
+ && $this->literal('{'))
+ {
+ $media = $this->pushSpecialBlock("media");
+ $media->queries = is_null($mediaQueries) ? array() : $mediaQueries;
+ return true;
+ } else {
+ $this->seek($s);
+ return false;
+ }
+ }
+
+ if ($this->literal("@", false) && $this->keyword($dirName)) {
+ if ($this->isDirective($dirName, $this->blockDirectives)) {
+ if (($this->openString("{", $dirValue, null, array(";")) || true) &&
+ $this->literal("{"))
+ {
+ $dir = $this->pushSpecialBlock("directive");
+ $dir->name = $dirName;
+ if (isset($dirValue)) $dir->value = $dirValue;
+ return true;
+ }
+ } elseif ($this->isDirective($dirName, $this->lineDirectives)) {
+ if ($this->propertyValue($dirValue) && $this->end()) {
+ $this->append(array("directive", $dirName, $dirValue));
+ return true;
+ }
+ }
+ }
+
+ $this->seek($s);
+ }
+
+ // setting a variable
+ if ($this->variable($var) && $this->assign() &&
+ $this->propertyValue($value) && $this->end())
+ {
+ $this->append(array('assign', $var, $value), $s);
+ return true;
+ } else {
+ $this->seek($s);
+ }
+
+ if ($this->import($importValue)) {
+ $this->append($importValue, $s);
+ return true;
+ }
+
+ // opening parametric mixin
+ if ($this->tag($tag, true) && $this->argumentDef($args, $isVararg) &&
+ ($this->guards($guards) || true) &&
+ $this->literal('{'))
+ {
+ $block = $this->pushBlock($this->fixTags(array($tag)));
+ $block->args = $args;
+ $block->isVararg = $isVararg;
+ if (!empty($guards)) $block->guards = $guards;
+ return true;
+ } else {
+ $this->seek($s);
+ }
+
+ // opening a simple block
+ if ($this->tags($tags) && $this->literal('{', false)) {
+ $tags = $this->fixTags($tags);
+ $this->pushBlock($tags);
+ return true;
+ } else {
+ $this->seek($s);
+ }
+
+ // closing a block
+ if ($this->literal('}', false)) {
+ try {
+ $block = $this->pop();
+ } catch (exception $e) {
+ $this->seek($s);
+ $this->throwError($e->getMessage());
+ }
+
+ $hidden = false;
+ if (is_null($block->type)) {
+ $hidden = true;
+ if (!isset($block->args)) {
+ foreach ($block->tags as $tag) {
+ if (!is_string($tag) || $tag{0} != $this->lessc->mPrefix) {
+ $hidden = false;
+ break;
+ }
+ }
+ }
+
+ foreach ($block->tags as $tag) {
+ if (is_string($tag)) {
+ $this->env->children[$tag][] = $block;
+ }
+ }
+ }
+
+ if (!$hidden) {
+ $this->append(array('block', $block), $s);
+ }
+
+ // this is done here so comments aren't bundled into he block that
+ // was just closed
+ $this->whitespace();
+ return true;
+ }
+
+ // mixin
+ if ($this->mixinTags($tags) &&
+ ($this->argumentDef($argv, $isVararg) || true) &&
+ ($this->keyword($suffix) || true) && $this->end())
+ {
+ $tags = $this->fixTags($tags);
+ $this->append(array('mixin', $tags, $argv, $suffix), $s);
+ return true;
+ } else {
+ $this->seek($s);
+ }
+
+ // spare ;
+ if ($this->literal(';')) return true;
+
+ return false; // got nothing, throw error
+ }
+
+ protected function isDirective($dirname, $directives) {
+ // TODO: cache pattern in parser
+ $pattern = implode("|",
+ array_map(array("lessc", "preg_quote"), $directives));
+ $pattern = '/^(-[a-z-]+-)?(' . $pattern . ')$/i';
+
+ return preg_match($pattern, $dirname);
+ }
+
+ protected function fixTags($tags) {
+ // move @ tags out of variable namespace
+ foreach ($tags as &$tag) {
+ if ($tag{0} == $this->lessc->vPrefix)
+ $tag[0] = $this->lessc->mPrefix;
+ }
+ return $tags;
+ }
+
+ // a list of expressions
+ protected function expressionList(&$exps) {
+ $values = array();
+
+ while ($this->expression($exp)) {
+ $values[] = $exp;
+ }
+
+ if (count($values) == 0) return false;
+
+ $exps = lessc::compressList($values, ' ');
+ return true;
+ }
+
+ /**
+ * Attempt to consume an expression.
+ * @link http://en.wikipedia.org/wiki/Operator-precedence_parser#Pseudo-code
+ */
+ protected function expression(&$out) {
+ if ($this->value($lhs)) {
+ $out = $this->expHelper($lhs, 0);
+
+ // look for / shorthand
+ if (!empty($this->env->supressedDivision)) {
+ unset($this->env->supressedDivision);
+ $s = $this->seek();
+ if ($this->literal("/") && $this->value($rhs)) {
+ $out = array("list", "",
+ array($out, array("keyword", "/"), $rhs));
+ } else {
+ $this->seek($s);
+ }
+ }
+
+ return true;
+ }
+ return false;
+ }
+
+ /**
+ * recursively parse infix equation with $lhs at precedence $minP
+ */
+ protected function expHelper($lhs, $minP) {
+ $this->inExp = true;
+ $ss = $this->seek();
+
+ while (true) {
+ $whiteBefore = isset($this->buffer[$this->count - 1]) &&
+ ctype_space($this->buffer[$this->count - 1]);
+
+ // If there is whitespace before the operator, then we require
+ // whitespace after the operator for it to be an expression
+ $needWhite = $whiteBefore && !$this->inParens;
+
+ if ($this->match(self::$operatorString.($needWhite ? '\s' : ''), $m) && self::$precedence[$m[1]] >= $minP) {
+ if (!$this->inParens && isset($this->env->currentProperty) && $m[1] == "/" && empty($this->env->supressedDivision)) {
+ foreach (self::$supressDivisionProps as $pattern) {
+ if (preg_match($pattern, $this->env->currentProperty)) {
+ $this->env->supressedDivision = true;
+ break 2;
+ }
+ }
+ }
+
+
+ $whiteAfter = isset($this->buffer[$this->count - 1]) &&
+ ctype_space($this->buffer[$this->count - 1]);
+
+ if (!$this->value($rhs)) break;
+
+ // peek for next operator to see what to do with rhs
+ if ($this->peek(self::$operatorString, $next) && self::$precedence[$next[1]] > self::$precedence[$m[1]]) {
+ $rhs = $this->expHelper($rhs, self::$precedence[$next[1]]);
+ }
+
+ $lhs = array('expression', $m[1], $lhs, $rhs, $whiteBefore, $whiteAfter);
+ $ss = $this->seek();
+
+ continue;
+ }
+
+ break;
+ }
+
+ $this->seek($ss);
+
+ return $lhs;
+ }
+
+ // consume a list of values for a property
+ public function propertyValue(&$value, $keyName = null) {
+ $values = array();
+
+ if ($keyName !== null) $this->env->currentProperty = $keyName;
+
+ $s = null;
+ while ($this->expressionList($v)) {
+ $values[] = $v;
+ $s = $this->seek();
+ if (!$this->literal(',')) break;
+ }
+
+ if ($s) $this->seek($s);
+
+ if ($keyName !== null) unset($this->env->currentProperty);
+
+ if (count($values) == 0) return false;
+
+ $value = lessc::compressList($values, ', ');
+ return true;
+ }
+
+ protected function parenValue(&$out) {
+ $s = $this->seek();
+
+ // speed shortcut
+ if (isset($this->buffer[$this->count]) && $this->buffer[$this->count] != "(") {
+ return false;
+ }
+
+ $inParens = $this->inParens;
+ if ($this->literal("(") &&
+ ($this->inParens = true) && $this->expression($exp) &&
+ $this->literal(")"))
+ {
+ $out = $exp;
+ $this->inParens = $inParens;
+ return true;
+ } else {
+ $this->inParens = $inParens;
+ $this->seek($s);
+ }
+
+ return false;
+ }
+
+ // a single value
+ protected function value(&$value) {
+ $s = $this->seek();
+
+ // speed shortcut
+ if (isset($this->buffer[$this->count]) && $this->buffer[$this->count] == "-") {
+ // negation
+ if ($this->literal("-", false) &&
+ (($this->variable($inner) && $inner = array("variable", $inner)) ||
+ $this->unit($inner) ||
+ $this->parenValue($inner)))
+ {
+ $value = array("unary", "-", $inner);
+ return true;
+ } else {
+ $this->seek($s);
+ }
+ }
+
+ if ($this->parenValue($value)) return true;
+ if ($this->unit($value)) return true;
+ if ($this->color($value)) return true;
+ if ($this->func($value)) return true;
+ if ($this->string($value)) return true;
+
+ if ($this->keyword($word)) {
+ $value = array('keyword', $word);
+ return true;
+ }
+
+ // try a variable
+ if ($this->variable($var)) {
+ $value = array('variable', $var);
+ return true;
+ }
+
+ // unquote string (should this work on any type?
+ if ($this->literal("~") && $this->string($str)) {
+ $value = array("escape", $str);
+ return true;
+ } else {
+ $this->seek($s);
+ }
+
+ // css hack: \0
+ if ($this->literal('\\') && $this->match('([0-9]+)', $m)) {
+ $value = array('keyword', '\\'.$m[1]);
+ return true;
+ } else {
+ $this->seek($s);
+ }
+
+ return false;
+ }
+
+ // an import statement
+ protected function import(&$out) {
+ if (!$this->literal('@import')) return false;
+
+ // @import "something.css" media;
+ // @import url("something.css") media;
+ // @import url(something.css) media;
+
+ if ($this->propertyValue($value)) {
+ $out = array("import", $value);
+ return true;
+ }
+ }
+
+ protected function mediaQueryList(&$out) {
+ if ($this->genericList($list, "mediaQuery", ",", false)) {
+ $out = $list[2];
+ return true;
+ }
+ return false;
+ }
+
+ protected function mediaQuery(&$out) {
+ $s = $this->seek();
+
+ $expressions = null;
+ $parts = array();
+
+ if (($this->literal("only") && ($only = true) || $this->literal("not") && ($not = true) || true) && $this->keyword($mediaType)) {
+ $prop = array("mediaType");
+ if (isset($only)) $prop[] = "only";
+ if (isset($not)) $prop[] = "not";
+ $prop[] = $mediaType;
+ $parts[] = $prop;
+ } else {
+ $this->seek($s);
+ }
+
+
+ if (!empty($mediaType) && !$this->literal("and")) {
+ // ~
+ } else {
+ $this->genericList($expressions, "mediaExpression", "and", false);
+ if (is_array($expressions)) $parts = array_merge($parts, $expressions[2]);
+ }
+
+ if (count($parts) == 0) {
+ $this->seek($s);
+ return false;
+ }
+
+ $out = $parts;
+ return true;
+ }
+
+ protected function mediaExpression(&$out) {
+ $s = $this->seek();
+ $value = null;
+ if ($this->literal("(") &&
+ $this->keyword($feature) &&
+ ($this->literal(":") && $this->expression($value) || true) &&
+ $this->literal(")"))
+ {
+ $out = array("mediaExp", $feature);
+ if ($value) $out[] = $value;
+ return true;
+ } elseif ($this->variable($variable)) {
+ $out = array('variable', $variable);
+ return true;
+ }
+
+ $this->seek($s);
+ return false;
+ }
+
+ // an unbounded string stopped by $end
+ protected function openString($end, &$out, $nestingOpen=null, $rejectStrs = null) {
+ $oldWhite = $this->eatWhiteDefault;
+ $this->eatWhiteDefault = false;
+
+ $stop = array("'", '"', "@{", $end);
+ $stop = array_map(array("lessc", "preg_quote"), $stop);
+ // $stop[] = self::$commentMulti;
+
+ if (!is_null($rejectStrs)) {
+ $stop = array_merge($stop, $rejectStrs);
+ }
+
+ $patt = '(.*?)('.implode("|", $stop).')';
+
+ $nestingLevel = 0;
+
+ $content = array();
+ while ($this->match($patt, $m, false)) {
+ if (!empty($m[1])) {
+ $content[] = $m[1];
+ if ($nestingOpen) {
+ $nestingLevel += substr_count($m[1], $nestingOpen);
+ }
+ }
+
+ $tok = $m[2];
+
+ $this->count-= strlen($tok);
+ if ($tok == $end) {
+ if ($nestingLevel == 0) {
+ break;
+ } else {
+ $nestingLevel--;
+ }
+ }
+
+ if (($tok == "'" || $tok == '"') && $this->string($str)) {
+ $content[] = $str;
+ continue;
+ }
+
+ if ($tok == "@{" && $this->interpolation($inter)) {
+ $content[] = $inter;
+ continue;
+ }
+
+ if (!empty($rejectStrs) && in_array($tok, $rejectStrs)) {
+ break;
+ }
+
+ $content[] = $tok;
+ $this->count+= strlen($tok);
+ }
+
+ $this->eatWhiteDefault = $oldWhite;
+
+ if (count($content) == 0) return false;
+
+ // trim the end
+ if (is_string(end($content))) {
+ $content[count($content) - 1] = rtrim(end($content));
+ }
+
+ $out = array("string", "", $content);
+ return true;
+ }
+
+ protected function string(&$out) {
+ $s = $this->seek();
+ if ($this->literal('"', false)) {
+ $delim = '"';
+ } elseif ($this->literal("'", false)) {
+ $delim = "'";
+ } else {
+ return false;
+ }
+
+ $content = array();
+
+ // look for either ending delim , escape, or string interpolation
+ $patt = '([^\n]*?)(@\{|\\\\|' .
+ lessc::preg_quote($delim).')';
+
+ $oldWhite = $this->eatWhiteDefault;
+ $this->eatWhiteDefault = false;
+
+ while ($this->match($patt, $m, false)) {
+ $content[] = $m[1];
+ if ($m[2] == "@{") {
+ $this->count -= strlen($m[2]);
+ if ($this->interpolation($inter, false)) {
+ $content[] = $inter;
+ } else {
+ $this->count += strlen($m[2]);
+ $content[] = "@{"; // ignore it
+ }
+ } elseif ($m[2] == '\\') {
+ $content[] = $m[2];
+ if ($this->literal($delim, false)) {
+ $content[] = $delim;
+ }
+ } else {
+ $this->count -= strlen($delim);
+ break; // delim
+ }
+ }
+
+ $this->eatWhiteDefault = $oldWhite;
+
+ if ($this->literal($delim)) {
+ $out = array("string", $delim, $content);
+ return true;
+ }
+
+ $this->seek($s);
+ return false;
+ }
+
+ protected function interpolation(&$out) {
+ $oldWhite = $this->eatWhiteDefault;
+ $this->eatWhiteDefault = true;
+
+ $s = $this->seek();
+ if ($this->literal("@{") &&
+ $this->openString("}", $interp, null, array("'", '"', ";")) &&
+ $this->literal("}", false))
+ {
+ $out = array("interpolate", $interp);
+ $this->eatWhiteDefault = $oldWhite;
+ if ($this->eatWhiteDefault) $this->whitespace();
+ return true;
+ }
+
+ $this->eatWhiteDefault = $oldWhite;
+ $this->seek($s);
+ return false;
+ }
+
+ protected function unit(&$unit) {
+ // speed shortcut
+ if (isset($this->buffer[$this->count])) {
+ $char = $this->buffer[$this->count];
+ if (!ctype_digit($char) && $char != ".") return false;
+ }
+
+ if ($this->match('([0-9]+(?:\.[0-9]*)?|\.[0-9]+)([%a-zA-Z]+)?', $m)) {
+ $unit = array("number", $m[1], empty($m[2]) ? "" : $m[2]);
+ return true;
+ }
+ return false;
+ }
+
+ // a # color
+ protected function color(&$out) {
+ if ($this->match('(#(?:[0-9a-f]{8}|[0-9a-f]{6}|[0-9a-f]{3}))', $m)) {
+ if (strlen($m[1]) > 7) {
+ $out = array("string", "", array($m[1]));
+ } else {
+ $out = array("raw_color", $m[1]);
+ }
+ return true;
+ }
+
+ return false;
+ }
+
+ // consume an argument definition list surrounded by ()
+ // each argument is a variable name with optional value
+ // or at the end a ... or a variable named followed by ...
+ // arguments are separated by , unless a ; is in the list, then ; is the
+ // delimiter.
+ protected function argumentDef(&$args, &$isVararg) {
+ $s = $this->seek();
+ if (!$this->literal('(')) return false;
+
+ $values = array();
+ $delim = ",";
+ $method = "expressionList";
+
+ $isVararg = false;
+ while (true) {
+ if ($this->literal("...")) {
+ $isVararg = true;
+ break;
+ }
+
+ if ($this->$method($value)) {
+ if ($value[0] == "variable") {
+ $arg = array("arg", $value[1]);
+ $ss = $this->seek();
+
+ if ($this->assign() && $this->$method($rhs)) {
+ $arg[] = $rhs;
+ } else {
+ $this->seek($ss);
+ if ($this->literal("...")) {
+ $arg[0] = "rest";
+ $isVararg = true;
+ }
+ }
+
+ $values[] = $arg;
+ if ($isVararg) break;
+ continue;
+ } else {
+ $values[] = array("lit", $value);
+ }
+ }
+
+
+ if (!$this->literal($delim)) {
+ if ($delim == "," && $this->literal(";")) {
+ // found new delim, convert existing args
+ $delim = ";";
+ $method = "propertyValue";
+
+ // transform arg list
+ if (isset($values[1])) { // 2 items
+ $newList = array();
+ foreach ($values as $i => $arg) {
+ switch($arg[0]) {
+ case "arg":
+ if ($i) {
+ $this->throwError("Cannot mix ; and , as delimiter types");
+ }
+ $newList[] = $arg[2];
+ break;
+ case "lit":
+ $newList[] = $arg[1];
+ break;
+ case "rest":
+ $this->throwError("Unexpected rest before semicolon");
+ }
+ }
+
+ $newList = array("list", ", ", $newList);
+
+ switch ($values[0][0]) {
+ case "arg":
+ $newArg = array("arg", $values[0][1], $newList);
+ break;
+ case "lit":
+ $newArg = array("lit", $newList);
+ break;
+ }
+
+ } elseif ($values) { // 1 item
+ $newArg = $values[0];
+ }
+
+ if ($newArg) {
+ $values = array($newArg);
+ }
+ } else {
+ break;
+ }
+ }
+ }
+
+ if (!$this->literal(')')) {
+ $this->seek($s);
+ return false;
+ }
+
+ $args = $values;
+
+ return true;
+ }
+
+ // consume a list of tags
+ // this accepts a hanging delimiter
+ protected function tags(&$tags, $simple = false, $delim = ',') {
+ $tags = array();
+ while ($this->tag($tt, $simple)) {
+ $tags[] = $tt;
+ if (!$this->literal($delim)) break;
+ }
+ if (count($tags) == 0) return false;
+
+ return true;
+ }
+
+ // list of tags of specifying mixin path
+ // optionally separated by > (lazy, accepts extra >)
+ protected function mixinTags(&$tags) {
+ $tags = array();
+ while ($this->tag($tt, true)) {
+ $tags[] = $tt;
+ $this->literal(">");
+ }
+
+ if (count($tags) == 0) return false;
+
+ return true;
+ }
+
+ // a bracketed value (contained within in a tag definition)
+ protected function tagBracket(&$parts, &$hasExpression) {
+ // speed shortcut
+ if (isset($this->buffer[$this->count]) && $this->buffer[$this->count] != "[") {
+ return false;
+ }
+
+ $s = $this->seek();
+
+ $hasInterpolation = false;
+
+ if ($this->literal("[", false)) {
+ $attrParts = array("[");
+ // keyword, string, operator
+ while (true) {
+ if ($this->literal("]", false)) {
+ $this->count--;
+ break; // get out early
+ }
+
+ if ($this->match('\s+', $m)) {
+ $attrParts[] = " ";
+ continue;
+ }
+ if ($this->string($str)) {
+ // escape parent selector, (yuck)
+ foreach ($str[2] as &$chunk) {
+ $chunk = str_replace($this->lessc->parentSelector, "$&$", $chunk);
+ }
+
+ $attrParts[] = $str;
+ $hasInterpolation = true;
+ continue;
+ }
+
+ if ($this->keyword($word)) {
+ $attrParts[] = $word;
+ continue;
+ }
+
+ if ($this->interpolation($inter, false)) {
+ $attrParts[] = $inter;
+ $hasInterpolation = true;
+ continue;
+ }
+
+ // operator, handles attr namespace too
+ if ($this->match('[|-~\$\*\^=]+', $m)) {
+ $attrParts[] = $m[0];
+ continue;
+ }
+
+ break;
+ }
+
+ if ($this->literal("]", false)) {
+ $attrParts[] = "]";
+ foreach ($attrParts as $part) {
+ $parts[] = $part;
+ }
+ $hasExpression = $hasExpression || $hasInterpolation;
+ return true;
+ }
+ $this->seek($s);
+ }
+
+ $this->seek($s);
+ return false;
+ }
+
+ // a space separated list of selectors
+ protected function tag(&$tag, $simple = false) {
+ if ($simple)
+ $chars = '^@,:;{}\][>\(\) "\'';
+ else
+ $chars = '^@,;{}["\'';
+
+ $s = $this->seek();
+
+ $hasExpression = false;
+ $parts = array();
+ while ($this->tagBracket($parts, $hasExpression));
+
+ $oldWhite = $this->eatWhiteDefault;
+ $this->eatWhiteDefault = false;
+
+ while (true) {
+ if ($this->match('(['.$chars.'0-9]['.$chars.']*)', $m)) {
+ $parts[] = $m[1];
+ if ($simple) break;
+
+ while ($this->tagBracket($parts, $hasExpression));
+ continue;
+ }
+
+ if (isset($this->buffer[$this->count]) && $this->buffer[$this->count] == "@") {
+ if ($this->interpolation($interp)) {
+ $hasExpression = true;
+ $interp[2] = true; // don't unescape
+ $parts[] = $interp;
+ continue;
+ }
+
+ if ($this->literal("@")) {
+ $parts[] = "@";
+ continue;
+ }
+ }
+
+ if ($this->unit($unit)) { // for keyframes
+ $parts[] = $unit[1];
+ $parts[] = $unit[2];
+ continue;
+ }
+
+ break;
+ }
+
+ $this->eatWhiteDefault = $oldWhite;
+ if (!$parts) {
+ $this->seek($s);
+ return false;
+ }
+
+ if ($hasExpression) {
+ $tag = array("exp", array("string", "", $parts));
+ } else {
+ $tag = trim(implode($parts));
+ }
+
+ $this->whitespace();
+ return true;
+ }
+
+ // a css function
+ protected function func(&$func) {
+ $s = $this->seek();
+
+ if ($this->match('(%|[\w\-_][\w\-_:\.]+|[\w_])', $m) && $this->literal('(')) {
+ $fname = $m[1];
+
+ $sPreArgs = $this->seek();
+
+ $args = array();
+ while (true) {
+ $ss = $this->seek();
+ // this ugly nonsense is for ie filter properties
+ if ($this->keyword($name) && $this->literal('=') && $this->expressionList($value)) {
+ $args[] = array("string", "", array($name, "=", $value));
+ } else {
+ $this->seek($ss);
+ if ($this->expressionList($value)) {
+ $args[] = $value;
+ }
+ }
+
+ if (!$this->literal(',')) break;
+ }
+ $args = array('list', ',', $args);
+
+ if ($this->literal(')')) {
+ $func = array('function', $fname, $args);
+ return true;
+ } elseif ($fname == 'url') {
+ // couldn't parse and in url? treat as string
+ $this->seek($sPreArgs);
+ if ($this->openString(")", $string) && $this->literal(")")) {
+ $func = array('function', $fname, $string);
+ return true;
+ }
+ }
+ }
+
+ $this->seek($s);
+ return false;
+ }
+
+ // consume a less variable
+ protected function variable(&$name) {
+ $s = $this->seek();
+ if ($this->literal($this->lessc->vPrefix, false) &&
+ ($this->variable($sub) || $this->keyword($name)))
+ {
+ if (!empty($sub)) {
+ $name = array('variable', $sub);
+ } else {
+ $name = $this->lessc->vPrefix.$name;
+ }
+ return true;
+ }
+
+ $name = null;
+ $this->seek($s);
+ return false;
+ }
+
+ /**
+ * Consume an assignment operator
+ * Can optionally take a name that will be set to the current property name
+ */
+ protected function assign($name = null) {
+ if ($name) $this->currentProperty = $name;
+ return $this->literal(':') || $this->literal('=');
+ }
+
+ // consume a keyword
+ protected function keyword(&$word) {
+ if ($this->match('([\w_\-\*!"][\w\-_"]*)', $m)) {
+ $word = $m[1];
+ return true;
+ }
+ return false;
+ }
+
+ // consume an end of statement delimiter
+ protected function end() {
+ if ($this->literal(';', false)) {
+ return true;
+ } elseif ($this->count == strlen($this->buffer) || $this->buffer[$this->count] == '}') {
+ // if there is end of file or a closing block next then we don't need a ;
+ return true;
+ }
+ return false;
+ }
+
+ protected function guards(&$guards) {
+ $s = $this->seek();
+
+ if (!$this->literal("when")) {
+ $this->seek($s);
+ return false;
+ }
+
+ $guards = array();
+
+ while ($this->guardGroup($g)) {
+ $guards[] = $g;
+ if (!$this->literal(",")) break;
+ }
+
+ if (count($guards) == 0) {
+ $guards = null;
+ $this->seek($s);
+ return false;
+ }
+
+ return true;
+ }
+
+ // a bunch of guards that are and'd together
+ // TODO rename to guardGroup
+ protected function guardGroup(&$guardGroup) {
+ $s = $this->seek();
+ $guardGroup = array();
+ while ($this->guard($guard)) {
+ $guardGroup[] = $guard;
+ if (!$this->literal("and")) break;
+ }
+
+ if (count($guardGroup) == 0) {
+ $guardGroup = null;
+ $this->seek($s);
+ return false;
+ }
+
+ return true;
+ }
+
+ protected function guard(&$guard) {
+ $s = $this->seek();
+ $negate = $this->literal("not");
+
+ if ($this->literal("(") && $this->expression($exp) && $this->literal(")")) {
+ $guard = $exp;
+ if ($negate) $guard = array("negate", $guard);
+ return true;
+ }
+
+ $this->seek($s);
+ return false;
+ }
+
+ /* raw parsing functions */
+
+ protected function literal($what, $eatWhitespace = null) {
+ if ($eatWhitespace === null) $eatWhitespace = $this->eatWhiteDefault;
+
+ // shortcut on single letter
+ if (!isset($what[1]) && isset($this->buffer[$this->count])) {
+ if ($this->buffer[$this->count] == $what) {
+ if (!$eatWhitespace) {
+ $this->count++;
+ return true;
+ }
+ // goes below...
+ } else {
+ return false;
+ }
+ }
+
+ if (!isset(self::$literalCache[$what])) {
+ self::$literalCache[$what] = lessc::preg_quote($what);
+ }
+
+ return $this->match(self::$literalCache[$what], $m, $eatWhitespace);
+ }
+
+ protected function genericList(&$out, $parseItem, $delim="", $flatten=true) {
+ $s = $this->seek();
+ $items = array();
+ while ($this->$parseItem($value)) {
+ $items[] = $value;
+ if ($delim) {
+ if (!$this->literal($delim)) break;
+ }
+ }
+
+ if (count($items) == 0) {
+ $this->seek($s);
+ return false;
+ }
+
+ if ($flatten && count($items) == 1) {
+ $out = $items[0];
+ } else {
+ $out = array("list", $delim, $items);
+ }
+
+ return true;
+ }
+
+
+ // advance counter to next occurrence of $what
+ // $until - don't include $what in advance
+ // $allowNewline, if string, will be used as valid char set
+ protected function to($what, &$out, $until = false, $allowNewline = false) {
+ if (is_string($allowNewline)) {
+ $validChars = $allowNewline;
+ } else {
+ $validChars = $allowNewline ? "." : "[^\n]";
+ }
+ if (!$this->match('('.$validChars.'*?)'.lessc::preg_quote($what), $m, !$until)) return false;
+ if ($until) $this->count -= strlen($what); // give back $what
+ $out = $m[1];
+ return true;
+ }
+
+ // try to match something on head of buffer
+ protected function match($regex, &$out, $eatWhitespace = null) {
+ if ($eatWhitespace === null) $eatWhitespace = $this->eatWhiteDefault;
+
+ $r = '/'.$regex.($eatWhitespace && !$this->writeComments ? '\s*' : '').'/Ais';
+ if (preg_match($r, $this->buffer, $out, null, $this->count)) {
+ $this->count += strlen($out[0]);
+ if ($eatWhitespace && $this->writeComments) $this->whitespace();
+ return true;
+ }
+ return false;
+ }
+
+ // match some whitespace
+ protected function whitespace() {
+ if ($this->writeComments) {
+ $gotWhite = false;
+ while (preg_match(self::$whitePattern, $this->buffer, $m, null, $this->count)) {
+ if (isset($m[1]) && empty($this->seenComments[$this->count])) {
+ $this->append(array("comment", $m[1]));
+ $this->seenComments[$this->count] = true;
+ }
+ $this->count += strlen($m[0]);
+ $gotWhite = true;
+ }
+ return $gotWhite;
+ } else {
+ $this->match("", $m);
+ return strlen($m[0]) > 0;
+ }
+ }
+
+ // match something without consuming it
+ protected function peek($regex, &$out = null, $from=null) {
+ if (is_null($from)) $from = $this->count;
+ $r = '/'.$regex.'/Ais';
+ $result = preg_match($r, $this->buffer, $out, null, $from);
+
+ return $result;
+ }
+
+ // seek to a spot in the buffer or return where we are on no argument
+ protected function seek($where = null) {
+ if ($where === null) return $this->count;
+ else $this->count = $where;
+ return true;
+ }
+
+ /* misc functions */
+
+ public function throwError($msg = "parse error", $count = null) {
+ $count = is_null($count) ? $this->count : $count;
+
+ $line = $this->line +
+ substr_count(substr($this->buffer, 0, $count), "\n");
+
+ if (!empty($this->sourceName)) {
+ $loc = "$this->sourceName on line $line";
+ } else {
+ $loc = "line: $line";
+ }
+
+ // TODO this depends on $this->count
+ if ($this->peek("(.*?)(\n|$)", $m, $count)) {
+ throw new exception("$msg: failed at `$m[1]` $loc");
+ } else {
+ throw new exception("$msg: $loc");
+ }
+ }
+
+ protected function pushBlock($selectors=null, $type=null) {
+ $b = new stdclass;
+ $b->parent = $this->env;
+
+ $b->type = $type;
+ $b->id = self::$nextBlockId++;
+
+ $b->isVararg = false; // TODO: kill me from here
+ $b->tags = $selectors;
+
+ $b->props = array();
+ $b->children = array();
+
+ $this->env = $b;
+ return $b;
+ }
+
+ // push a block that doesn't multiply tags
+ protected function pushSpecialBlock($type) {
+ return $this->pushBlock(null, $type);
+ }
+
+ // append a property to the current block
+ protected function append($prop, $pos = null) {
+ if ($pos !== null) $prop[-1] = $pos;
+ $this->env->props[] = $prop;
+ }
+
+ // pop something off the stack
+ protected function pop() {
+ $old = $this->env;
+ $this->env = $this->env->parent;
+ return $old;
+ }
+
+ // remove comments from $text
+ // todo: make it work for all functions, not just url
+ protected function removeComments($text) {
+ $look = array(
+ 'url(', '//', '/*', '"', "'"
+ );
+
+ $out = '';
+ $min = null;
+ while (true) {
+ // find the next item
+ foreach ($look as $token) {
+ $pos = strpos($text, $token);
+ if ($pos !== false) {
+ if (!isset($min) || $pos < $min[1]) $min = array($token, $pos);
+ }
+ }
+
+ if (is_null($min)) break;
+
+ $count = $min[1];
+ $skip = 0;
+ $newlines = 0;
+ switch ($min[0]) {
+ case 'url(':
+ if (preg_match('/url\(.*?\)/', $text, $m, 0, $count))
+ $count += strlen($m[0]) - strlen($min[0]);
+ break;
+ case '"':
+ case "'":
+ if (preg_match('/'.$min[0].'.*?(?<!\\\\)'.$min[0].'/', $text, $m, 0, $count))
+ $count += strlen($m[0]) - 1;
+ break;
+ case '//':
+ $skip = strpos($text, "\n", $count);
+ if ($skip === false) $skip = strlen($text) - $count;
+ else $skip -= $count;
+ break;
+ case '/*':
+ if (preg_match('/\/\*.*?\*\//s', $text, $m, 0, $count)) {
+ $skip = strlen($m[0]);
+ $newlines = substr_count($m[0], "\n");
+ }
+ break;
+ }
+
+ if ($skip == 0) $count += strlen($min[0]);
+
+ $out .= substr($text, 0, $count).str_repeat("\n", $newlines);
+ $text = substr($text, $count + $skip);
+
+ $min = null;
+ }
+
+ return $out.$text;
+ }
+
+}
+
+class lessc_formatter_classic {
+ public $indentChar = " ";
+
+ public $break = "\n";
+ public $open = " {";
+ public $close = "}";
+ public $selectorSeparator = ", ";
+ public $assignSeparator = ":";
+
+ public $openSingle = " { ";
+ public $closeSingle = " }";
+
+ public $disableSingle = false;
+ public $breakSelectors = false;
+
+ public $compressColors = false;
+
+ public function __construct() {
+ $this->indentLevel = 0;
+ }
+
+ public function indentStr($n = 0) {
+ return str_repeat($this->indentChar, max($this->indentLevel + $n, 0));
+ }
+
+ public function property($name, $value) {
+ return $name . $this->assignSeparator . $value . ";";
+ }
+
+ protected function isEmpty($block) {
+ if (empty($block->lines)) {
+ foreach ($block->children as $child) {
+ if (!$this->isEmpty($child)) return false;
+ }
+
+ return true;
+ }
+ return false;
+ }
+
+ public function block($block) {
+ if ($this->isEmpty($block)) return;
+
+ $inner = $pre = $this->indentStr();
+
+ $isSingle = !$this->disableSingle &&
+ is_null($block->type) && count($block->lines) == 1;
+
+ if (!empty($block->selectors)) {
+ $this->indentLevel++;
+
+ if ($this->breakSelectors) {
+ $selectorSeparator = $this->selectorSeparator . $this->break . $pre;
+ } else {
+ $selectorSeparator = $this->selectorSeparator;
+ }
+
+ echo $pre .
+ implode($selectorSeparator, $block->selectors);
+ if ($isSingle) {
+ echo $this->openSingle;
+ $inner = "";
+ } else {
+ echo $this->open . $this->break;
+ $inner = $this->indentStr();
+ }
+
+ }
+
+ if (!empty($block->lines)) {
+ $glue = $this->break.$inner;
+ echo $inner . implode($glue, $block->lines);
+ if (!$isSingle && !empty($block->children)) {
+ echo $this->break;
+ }
+ }
+
+ foreach ($block->children as $child) {
+ $this->block($child);
+ }
+
+ if (!empty($block->selectors)) {
+ if (!$isSingle && empty($block->children)) echo $this->break;
+
+ if ($isSingle) {
+ echo $this->closeSingle . $this->break;
+ } else {
+ echo $pre . $this->close . $this->break;
+ }
+
+ $this->indentLevel--;
+ }
+ }
+}
+
+class lessc_formatter_compressed extends lessc_formatter_classic {
+ public $disableSingle = true;
+ public $open = "{";
+ public $selectorSeparator = ",";
+ public $assignSeparator = ":";
+ public $break = "";
+ public $compressColors = true;
+
+ public function indentStr($n = 0) {
+ return "";
+ }
+}
+
+class lessc_formatter_lessjs extends lessc_formatter_classic {
+ public $disableSingle = true;
+ public $breakSelectors = true;
+ public $assignSeparator = ": ";
+ public $selectorSeparator = ",";
+}
+
+
diff --git a/includes/limit.sh b/includes/limit.sh
index bc1988de..2a1545b6 100644
--- a/includes/limit.sh
+++ b/includes/limit.sh
@@ -6,6 +6,7 @@
# and is available on most Linux systems. If Perl was distributed with
# BSD::Resource included, we would happily use that instead, but it isn't.
+MW_INCLUDE_STDERR=
MW_CPU_LIMIT=0
MW_CGROUP=
MW_MEM_LIMIT=0
@@ -15,6 +16,10 @@ MW_WALL_CLOCK_LIMIT=0
# Override settings
eval "$2"
+if [ -n "$MW_INCLUDE_STDERR" ]; then
+ exec 2>&1
+fi
+
if [ "$MW_CPU_LIMIT" -gt 0 ]; then
ulimit -t "$MW_CPU_LIMIT"
fi
@@ -55,7 +60,7 @@ fi
# Clean up cgroup
cleanup() {
- # First we have to move the current task into a "garbage" group, otherwise
+ # First we have to move the current task into a "garbage" group, otherwise
# the cgroup will not be empty, and attempting to remove it will fail with
# "Device or resource busy"
if [ -w "$MW_CGROUP"/tasks ]; then
@@ -84,7 +89,7 @@ if [ -n "$MW_CGROUP" ]; then
updateTaskCount
if [ $NUM_TASKS -gt 1 ]; then
- # Spawn a monitor process which will continue to poll for completion
+ # Spawn a monitor process which will continue to poll for completion
# of all processes in the cgroup after termination of the parent shell
(
while [ $NUM_TASKS -gt 1 ]; do
diff --git a/includes/logging/DeleteLogFormatter.php b/includes/logging/DeleteLogFormatter.php
new file mode 100644
index 00000000..01528b7e
--- /dev/null
+++ b/includes/logging/DeleteLogFormatter.php
@@ -0,0 +1,196 @@
+<?php
+/**
+ * Formatter for delete log entries.
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with this program; if not, write to the Free Software Foundation, Inc.,
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ * http://www.gnu.org/copyleft/gpl.html
+ *
+ * @file
+ * @author Niklas Laxström
+ * @license http://www.gnu.org/copyleft/gpl.html GNU General Public License 2.0 or later
+ * @since 1.22
+ */
+
+/**
+ * This class formats delete log entries.
+ *
+ * @since 1.19
+ */
+class DeleteLogFormatter extends LogFormatter {
+ protected function getMessageKey() {
+ $key = parent::getMessageKey();
+ if ( in_array( $this->entry->getSubtype(), array( 'event', 'revision' ) ) ) {
+ if ( count( $this->getMessageParameters() ) < 5 ) {
+ return "$key-legacy";
+ }
+ }
+ return $key;
+ }
+
+ protected function getMessageParameters() {
+ if ( isset( $this->parsedParametersDeleteLog ) ) {
+ return $this->parsedParametersDeleteLog;
+ }
+
+ $params = parent::getMessageParameters();
+ $subtype = $this->entry->getSubtype();
+ if ( in_array( $subtype, array( 'event', 'revision' ) ) ) {
+ // $params[3] here is 'revision' for page revisions, 'oldimage' for file versions, or a comma-separated list of log_ids for log entries.
+ // $subtype here is 'revision' for page revisions and file versions, or 'event' for log entries.
+ if (
+ ( $subtype === 'event' && count( $params ) === 6 ) ||
+ ( $subtype === 'revision' && isset( $params[3] ) && ( $params[3] === 'revision' || $params[3] === 'oldimage' ) )
+ ) {
+ $paramStart = $subtype === 'revision' ? 4 : 3;
+
+ $old = $this->parseBitField( $params[$paramStart + 1] );
+ $new = $this->parseBitField( $params[$paramStart + 2] );
+ list( $hid, $unhid, $extra ) = RevisionDeleter::getChanges( $new, $old );
+ $changes = array();
+ foreach ( $hid as $v ) {
+ $changes[] = $this->msg( "$v-hid" )->plain();
+ }
+ foreach ( $unhid as $v ) {
+ $changes[] = $this->msg( "$v-unhid" )->plain();
+ }
+ foreach ( $extra as $v ) {
+ $changes[] = $this->msg( $v )->plain();
+ }
+ $changeText = $this->context->getLanguage()->listToText( $changes );
+
+ $newParams = array_slice( $params, 0, 3 );
+ $newParams[3] = $changeText;
+ $count = count( explode( ',', $params[$paramStart] ) );
+ $newParams[4] = $this->context->getLanguage()->formatNum( $count );
+ return $this->parsedParametersDeleteLog = $newParams;
+ } else {
+ return $this->parsedParametersDeleteLog = array_slice( $params, 0, 3 );
+ }
+ }
+
+ return $this->parsedParametersDeleteLog = $params;
+ }
+
+ protected function parseBitField( $string ) {
+ // Input is like ofield=2134 or just the number
+ if ( strpos( $string, 'field=' ) === 1 ) {
+ list( , $field ) = explode( '=', $string );
+ return (int)$field;
+ } else {
+ return (int)$string;
+ }
+ }
+
+ public function getActionLinks() {
+ $user = $this->context->getUser();
+ if ( !$user->isAllowed( 'deletedhistory' ) || $this->entry->isDeleted( LogPage::DELETED_ACTION ) ) {
+ return '';
+ }
+
+ switch ( $this->entry->getSubtype() ) {
+ case 'delete': // Show undelete link
+ if ( $user->isAllowed( 'undelete' ) ) {
+ $message = 'undeletelink';
+ } else {
+ $message = 'undeleteviewlink';
+ }
+ $revert = Linker::linkKnown(
+ SpecialPage::getTitleFor( 'Undelete' ),
+ $this->msg( $message )->escaped(),
+ array(),
+ array( 'target' => $this->entry->getTarget()->getPrefixedDBkey() )
+ );
+ return $this->msg( 'parentheses' )->rawParams( $revert )->escaped();
+
+ case 'revision': // If an edit was hidden from a page give a review link to the history
+ $params = $this->extractParameters();
+ if ( !isset( $params[3] ) || !isset( $params[4] ) ) {
+ return '';
+ }
+
+ // Different revision types use different URL params...
+ $key = $params[3];
+ // This is a CSV of the IDs
+ $ids = explode( ',', $params[4] );
+
+ $links = array();
+
+ // If there's only one item, we can show a diff link
+ if ( count( $ids ) == 1 ) {
+ // Live revision diffs...
+ if ( $key == 'oldid' || $key == 'revision' ) {
+ $links[] = Linker::linkKnown(
+ $this->entry->getTarget(),
+ $this->msg( 'diff' )->escaped(),
+ array(),
+ array(
+ 'diff' => intval( $ids[0] ),
+ 'unhide' => 1
+ )
+ );
+ // Deleted revision diffs...
+ } elseif ( $key == 'artimestamp' || $key == 'archive' ) {
+ $links[] = Linker::linkKnown(
+ SpecialPage::getTitleFor( 'Undelete' ),
+ $this->msg( 'diff' )->escaped(),
+ array(),
+ array(
+ 'target' => $this->entry->getTarget()->getPrefixedDBkey(),
+ 'diff' => 'prev',
+ 'timestamp' => $ids[0]
+ )
+ );
+ }
+ }
+
+ // View/modify link...
+ $links[] = Linker::linkKnown(
+ SpecialPage::getTitleFor( 'Revisiondelete' ),
+ $this->msg( 'revdel-restore' )->escaped(),
+ array(),
+ array(
+ 'target' => $this->entry->getTarget()->getPrefixedText(),
+ 'type' => $key,
+ 'ids' => implode( ',', $ids ),
+ )
+ );
+
+ return $this->msg( 'parentheses' )->rawParams(
+ $this->context->getLanguage()->pipeList( $links ) )->escaped();
+
+ case 'event': // Hidden log items, give review link
+ $params = $this->extractParameters();
+ if ( !isset( $params[3] ) ) {
+ return '';
+ }
+ // This is a CSV of the IDs
+ $query = $params[3];
+ // Link to each hidden object ID, $params[1] is the url param
+ $revert = Linker::linkKnown(
+ SpecialPage::getTitleFor( 'Revisiondelete' ),
+ $this->msg( 'revdel-restore' )->escaped(),
+ array(),
+ array(
+ 'target' => $this->entry->getTarget()->getPrefixedText(),
+ 'type' => 'logging',
+ 'ids' => $query
+ )
+ );
+ return $this->msg( 'parentheses' )->rawParams( $revert )->escaped();
+ default:
+ return '';
+ }
+ }
+}
diff --git a/includes/logging/LogEntry.php b/includes/logging/LogEntry.php
index 0f20ed16..b2a8e50d 100644
--- a/includes/logging/LogEntry.php
+++ b/includes/logging/LogEntry.php
@@ -151,7 +151,7 @@ class DatabaseLogEntry extends LogEntryBase {
return array(
'tables' => $tables,
'fields' => $fields,
- 'conds' => array(),
+ 'conds' => array(),
'options' => array(),
'join_conds' => $joins,
);
@@ -165,7 +165,7 @@ class DatabaseLogEntry extends LogEntryBase {
*/
public static function newFromRow( $row ) {
if ( is_array( $row ) && isset( $row['rc_logid'] ) ) {
- return new RCDatabaseLogEntry( (object) $row );
+ return new RCDatabaseLogEntry( (object)$row );
} else {
return new self( $row );
}
@@ -233,8 +233,8 @@ class DatabaseLogEntry extends LogEntryBase {
}
public function getPerformer() {
- if( !$this->performer ) {
- $userId = (int) $this->row->log_user;
+ if ( !$this->performer ) {
+ $userId = (int)$this->row->log_user;
if ( $userId !== 0 ) { // logged-in users
if ( isset( $this->row->user_name ) ) {
$this->performer = User::newFromRow( $this->row );
@@ -291,8 +291,8 @@ class RCDatabaseLogEntry extends DatabaseLogEntry {
}
public function getPerformer() {
- if( !$this->performer ) {
- $userId = (int) $this->row->rc_user;
+ if ( !$this->performer ) {
+ $userId = (int)$this->row->rc_user;
if ( $userId !== 0 ) {
$this->performer = User::newFromId( $userId );
} else {
@@ -334,6 +334,7 @@ class ManualLogEntry extends LogEntryBase {
protected $type; ///!< @var string
protected $subtype; ///!< @var string
protected $parameters = array(); ///!< @var array
+ protected $relations = array(); ///!< @var array
protected $performer; ///!< @var User
protected $target; ///!< @var Title
protected $timestamp; ///!< @var string
@@ -374,6 +375,17 @@ class ManualLogEntry extends LogEntryBase {
}
/**
+ * Declare arbitrary tag/value relations to this log entry.
+ * These can be used to filter log entries later on.
+ *
+ * @param array Map of (tag => (list of values))
+ * @since 1.22
+ */
+ public function setRelations( array $relations ) {
+ $this->relations = $relations;
+ }
+
+ /**
* Set the user that performed the action being logged.
*
* @since 1.19
@@ -430,12 +442,13 @@ class ManualLogEntry extends LogEntryBase {
/**
* Inserts the entry into the logging table.
+ * @param IDatabase $dbw
* @return int If of the log entry
*/
- public function insert() {
+ public function insert( IDatabase $dbw = null ) {
global $wgContLang;
- $dbw = wfGetDB( DB_MASTER );
+ $dbw = $dbw ?: wfGetDB( DB_MASTER );
$id = $dbw->nextSequenceValue( 'logging_log_id_seq' );
if ( $this->timestamp === null ) {
@@ -459,10 +472,28 @@ class ManualLogEntry extends LogEntryBase {
'log_title' => $this->getTarget()->getDBkey(),
'log_page' => $this->getTarget()->getArticleID(),
'log_comment' => $comment,
- 'log_params' => serialize( (array) $this->getParameters() ),
+ 'log_params' => serialize( (array)$this->getParameters() ),
);
$dbw->insert( 'logging', $data, __METHOD__ );
$this->id = !is_null( $id ) ? $id : $dbw->insertId();
+
+ $rows = array();
+ foreach ( $this->relations as $tag => $values ) {
+ if ( !strlen( $tag ) ) {
+ throw new MWException( "Got empty log search tag." );
+ }
+ foreach ( $values as $value ) {
+ $rows[] = array(
+ 'ls_field' => $tag,
+ 'ls_value' => $value,
+ 'ls_log_id' => $this->id
+ );
+ }
+ }
+ if ( count( $rows ) ) {
+ $dbw->insert( 'log_search', $rows, __METHOD__, 'IGNORE' );
+ }
+
return $this->id;
}
@@ -503,7 +534,7 @@ class ManualLogEntry extends LogEntryBase {
$this->getSubtype(),
$this->getTarget(),
$this->getComment(),
- serialize( (array) $this->getParameters() ),
+ serialize( (array)$this->getParameters() ),
$newId,
$formatter->getIRCActionComment() // Used for IRC feeds
);
@@ -513,7 +544,7 @@ class ManualLogEntry extends LogEntryBase {
}
if ( $to === 'udp' || $to === 'rcandudp' ) {
- $rc->notifyRC2UDP();
+ $rc->notifyRCFeeds();
}
}
@@ -555,7 +586,7 @@ class ManualLogEntry extends LogEntryBase {
}
public function getDeleted() {
- return (int) $this->deleted;
+ return (int)$this->deleted;
}
}
diff --git a/includes/logging/LogEventsList.php b/includes/logging/LogEventsList.php
index 501af7d6..c27b57af 100644
--- a/includes/logging/LogEventsList.php
+++ b/includes/logging/LogEventsList.php
@@ -74,9 +74,9 @@ class LogEventsList extends ContextSource {
public function showHeader( $type ) {
wfDeprecated( __METHOD__, '1.19' );
// If only one log type is used, then show a special message...
- $headerType = (count( $type ) == 1) ? $type[0] : '';
+ $headerType = count( $type ) == 1 ? $type[0] : '';
$out = $this->getOutput();
- if( LogPage::isLogType( $headerType ) ) {
+ if ( LogPage::isLogType( $headerType ) ) {
$page = new LogPage( $headerType );
$out->setPageTitle( $page->getName()->text() );
$out->addHTML( $page->getDescription()->parseAsBlock() );
@@ -97,14 +97,14 @@ class LogEventsList extends ContextSource {
* @param $filter: array
* @param $tagFilter: array?
*/
- public function showOptions( $types=array(), $user = '', $page = '', $pattern = '', $year = '',
+ public function showOptions( $types = array(), $user = '', $page = '', $pattern = '', $year = '',
$month = '', $filter = null, $tagFilter = '' ) {
global $wgScript, $wgMiserMode;
$title = SpecialPage::getTitleFor( 'Log' );
// For B/C, we take strings, but make sure they are converted...
- $types = ($types === '') ? array() : (array)$types;
+ $types = ( $types === '' ) ? array() : (array)$types;
$tagSelector = ChangeTags::buildTagFilterSelector( $tagFilter );
@@ -156,7 +156,7 @@ class LogEventsList extends ContextSource {
// Option value -> message mapping
$links = array();
$hiddens = ''; // keep track for "go" button
- foreach( $filter as $type => $val ) {
+ foreach ( $filter as $type => $val ) {
// Should the below assignment be outside the foreach?
// Then it would have to be copied. Not certain what is more expensive.
$query = $this->getDefaultQuery();
@@ -172,6 +172,7 @@ class LogEventsList extends ContextSource {
$query
);
+ // Message: log-show-hide-patrol
$links[$type] = $this->msg( "log-show-hide-{$type}" )->rawParams( $link )->escaped();
$hiddens .= Html::hidden( "hide_{$type}_log", $val ) . "\n";
}
@@ -212,7 +213,7 @@ class LogEventsList extends ContextSource {
public function getTypeSelector() {
$typesByName = array(); // Temporary array
// First pass to load the log names
- foreach( LogPage::validTypes() as $type ) {
+ foreach ( LogPage::validTypes() as $type ) {
$page = new LogPage( $type );
$restriction = $page->getRestriction();
if ( $this->getUser()->isAllowed( $restriction ) ) {
@@ -229,7 +230,7 @@ class LogEventsList extends ContextSource {
$typesByName = array( '' => $public ) + $typesByName;
$select = new XmlSelect( 'type' );
- foreach( $typesByName as $type => $name ) {
+ foreach ( $typesByName as $type => $name ) {
$select->addOption( $name, $type );
}
@@ -273,10 +274,10 @@ class LogEventsList extends ContextSource {
private function getExtraInputs( $types ) {
$offender = $this->getRequest()->getVal( 'offender' );
$user = User::newFromName( $offender, false );
- if( !$user || ( $user->getId() == 0 && !IP::isIPAddress( $offender ) ) ) {
+ if ( !$user || ( $user->getId() == 0 && !IP::isIPAddress( $offender ) ) ) {
$offender = ''; // Blank field if invalid
}
- if( count( $types ) == 1 && $types[0] == 'suppress' ) {
+ if ( count( $types ) == 1 && $types[0] == 'suppress' ) {
return Xml::inputLabel( $this->msg( 'revdelete-offender' )->text(), 'offender',
'mw-log-offender', 20, $offender );
}
@@ -342,16 +343,16 @@ class LogEventsList extends ContextSource {
* @return string
*/
private function getShowHideLinks( $row ) {
- if( ( $this->flags == self::NO_ACTION_LINK ) // we don't want to see the links
+ 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 '';
}
$del = '';
$user = $this->getUser();
// Don't show useless checkbox to people who cannot hide log entries
- if( $user->isAllowed( 'deletedhistory' ) ) {
+ if ( $user->isAllowed( 'deletedhistory' ) ) {
$canHide = $user->isAllowed( 'deletelogentry' );
- if( $row->log_deleted || $canHide ) {
+ if ( $row->log_deleted || $canHide ) {
if ( $canHide && $this->flags & self::USE_REVDEL_CHECKBOXES ) { // Show checkboxes instead of links.
if ( !self::userCan( $row, LogPage::DELETED_RESTRICTED, $user ) ) { // If event was hidden from sysops
$del = Xml::check( 'deleterevisions', false, array( 'disabled' => 'disabled' ) );
@@ -364,8 +365,8 @@ class LogEventsList extends ContextSource {
} else {
$query = array(
'target' => SpecialPage::getTitleFor( 'Log', $row->log_type )->getPrefixedDBkey(),
- 'type' => 'logging',
- 'ids' => $row->log_id,
+ 'type' => 'logging',
+ 'ids' => $row->log_id,
);
$del = Linker::revDeleteLink( $query, self::isDeleted( $row, LogPage::DELETED_RESTRICTED ), $canHide );
}
@@ -385,10 +386,10 @@ class LogEventsList extends ContextSource {
public static function typeAction( $row, $type, $action, $right = '' ) {
$match = is_array( $type ) ?
in_array( $row->log_type, $type ) : $row->log_type == $type;
- if( $match ) {
+ if ( $match ) {
$match = is_array( $action ) ?
in_array( $row->log_action, $action ) : $row->log_action == $action;
- if( $match && $right ) {
+ if ( $match && $right ) {
global $wgUser;
$match = $wgUser->isAllowed( $right );
}
@@ -419,7 +420,7 @@ class LogEventsList extends ContextSource {
* @return Boolean
*/
public static function userCanBitfield( $bitfield, $field, User $user = null ) {
- if( $bitfield & $field ) {
+ if ( $bitfield & $field ) {
if ( $bitfield & LogPage::DELETED_RESTRICTED ) {
$permission = 'suppressrevision';
} else {
@@ -464,10 +465,11 @@ class LogEventsList extends ContextSource {
* set to '' to unset offset
* - wrap String Wrap the message in html (usually something like "<div ...>$1</div>").
* - flags Integer display flags (NO_ACTION_LINK,NO_EXTRA_USER_LINKS)
+ * - useRequestParams boolean Set true to use Pager-related parameters in the WebRequest
* @return Integer Number of total log items (not limited by $lim)
*/
public static function showLogExtract(
- &$out, $types=array(), $page = '', $user = '', $param = array()
+ &$out, $types = array(), $page = '', $user = '', $param = array()
) {
$defaultParameters = array(
'lim' => 25,
@@ -475,7 +477,8 @@ class LogEventsList extends ContextSource {
'showIfEmpty' => true,
'msgKey' => array( '' ),
'wrap' => "$1",
- 'flags' => 0
+ 'flags' => 0,
+ 'useRequestParams' => false,
);
# The + operator appends elements of remaining keys from the right
# handed array to the left handed, whereas duplicated keys are NOT overwritten.
@@ -487,6 +490,7 @@ class LogEventsList extends ContextSource {
$msgKey = $param['msgKey'];
$wrap = $param['wrap'];
$flags = $param['flags'];
+ $useRequestParams = $param['useRequestParams'];
if ( !is_array( $msgKey ) ) {
$msgKey = array( $msgKey );
}
@@ -500,13 +504,22 @@ class LogEventsList extends ContextSource {
# Insert list of top 50 (or top $lim) items
$loglist = new LogEventsList( $context, null, $flags );
$pager = new LogPager( $loglist, $types, $user, $page, '', $conds );
+ if ( !$useRequestParams ) {
+ # Reset vars that may have been taken from the request
+ $pager->mLimit = 50;
+ $pager->mDefaultLimit = 50;
+ $pager->mOffset = "";
+ $pager->mIsBackwards = false;
+ }
if ( isset( $param['offset'] ) ) { # Tell pager to ignore WebRequest offset
$pager->setOffset( $param['offset'] );
}
- if( $lim > 0 ) $pager->mLimit = $lim;
+ if ( $lim > 0 ) {
+ $pager->mLimit = $lim;
+ }
$logBody = $pager->getBody();
$s = '';
- if( $logBody ) {
+ if ( $logBody ) {
if ( $msgKey[0] ) {
$s = '<div class="mw-warning-with-logexcerpt">';
@@ -521,26 +534,27 @@ class LogEventsList extends ContextSource {
$s .= $loglist->beginLogEventsList() .
$logBody .
$loglist->endLogEventsList();
- } else {
- if ( $showIfEmpty ) {
- $s = Html::rawElement( 'div', array( 'class' => 'mw-warning-logempty' ),
- $context->msg( 'logempty' )->parse() );
- }
+ } elseif ( $showIfEmpty ) {
+ $s = Html::rawElement( 'div', array( 'class' => 'mw-warning-logempty' ),
+ $context->msg( 'logempty' )->parse() );
}
- if( $pager->getNumRows() > $pager->mLimit ) { # Show "Full log" link
+ if ( $pager->getNumRows() > $pager->mLimit ) { # Show "Full log" link
$urlParam = array();
if ( $page instanceof Title ) {
$urlParam['page'] = $page->getPrefixedDBkey();
} elseif ( $page != '' ) {
$urlParam['page'] = $page;
}
- if ( $user != '' )
+ if ( $user != '' ) {
$urlParam['user'] = $user;
- if ( !is_array( $types ) ) # Make it an array, if it isn't
+ }
+ if ( !is_array( $types ) ) { # Make it an array, if it isn't
$types = array( $types );
+ }
# If there is exactly one log type, we can link to Special:Log?type=foo
- if ( count( $types ) == 1 )
+ if ( count( $types ) == 1 ) {
$urlParam['type'] = $types[0];
+ }
$s .= Linker::link(
SpecialPage::getTitleFor( 'Log' ),
$context->msg( 'log-fulllog' )->escaped(),
@@ -589,14 +603,14 @@ class LogEventsList extends ContextSource {
$hiddenLogs = array();
// Don't show private logs to unprivileged users
- foreach( $wgLogRestrictions as $logType => $right ) {
- if( $audience == 'public' || !$user->isAllowed( $right ) ) {
+ foreach ( $wgLogRestrictions as $logType => $right ) {
+ if ( $audience == 'public' || !$user->isAllowed( $right ) ) {
$hiddenLogs[] = $logType;
}
}
- if( count( $hiddenLogs ) == 1 ) {
+ if ( count( $hiddenLogs ) == 1 ) {
return 'log_type != ' . $db->addQuotes( $hiddenLogs[0] );
- } elseif( $hiddenLogs ) {
+ } elseif ( $hiddenLogs ) {
return 'log_type NOT IN (' . $db->makeList( $hiddenLogs ) . ')';
}
return false;
diff --git a/includes/logging/LogFormatter.php b/includes/logging/LogFormatter.php
index ace26bbe..8f60aee1 100644
--- a/includes/logging/LogFormatter.php
+++ b/includes/logging/LogFormatter.php
@@ -194,9 +194,9 @@ class LogFormatter {
// Text of title the action is aimed at.
$target = $entry->getTarget()->getPrefixedText();
$text = null;
- switch( $entry->getType() ) {
+ switch ( $entry->getType() ) {
case 'move':
- switch( $entry->getSubtype() ) {
+ switch ( $entry->getSubtype() ) {
case 'move':
$movesource = $parameters['4::target'];
$text = wfMessage( '1movedto2' )
@@ -215,7 +215,7 @@ class LogFormatter {
break;
case 'delete':
- switch( $entry->getSubtype() ) {
+ switch ( $entry->getSubtype() ) {
case 'delete':
$text = wfMessage( 'deletedarticle' )
->rawParams( $target )->inContentLanguage()->escaped();
@@ -246,7 +246,7 @@ class LogFormatter {
break;
case 'protect':
- switch( $entry->getSubtype() ) {
+ switch ( $entry->getSubtype() ) {
case 'protect':
$text = wfMessage( 'protectedarticle' )
->rawParams( $target . ' ' . $parameters[0] )->inContentLanguage()->escaped();
@@ -263,7 +263,7 @@ class LogFormatter {
break;
case 'newusers':
- switch( $entry->getSubtype() ) {
+ switch ( $entry->getSubtype() ) {
case 'newusers':
case 'create':
$text = wfMessage( 'newuserlog-create-entry' )
@@ -282,7 +282,7 @@ class LogFormatter {
break;
case 'upload':
- switch( $entry->getSubtype() ) {
+ switch ( $entry->getSubtype() ) {
case 'upload':
$text = wfMessage( 'uploadedimage' )
->rawParams( $target )->inContentLanguage()->escaped();
@@ -305,7 +305,7 @@ class LogFormatter {
} else {
$newgroups = wfMessage( 'rightsnone' )->inContentLanguage()->escaped();
}
- switch( $entry->getSubtype() ) {
+ switch ( $entry->getSubtype() ) {
case 'rights':
$text = wfMessage( 'rightslogentry' )
->rawParams( $target, $oldgroups, $newgroups )->inContentLanguage()->escaped();
@@ -320,7 +320,7 @@ class LogFormatter {
// case 'suppress' --private log -- aaron (sign your messages so we know who to blame in a few years :-D)
// default:
}
- if( is_null( $text ) ) {
+ if ( is_null( $text ) ) {
$text = $this->getPlainActionText();
}
@@ -479,7 +479,7 @@ class LogFormatter {
protected function formatParameterValue( $type, $value ) {
$saveLinkFlood = $this->linkFlood;
- switch( strtolower( trim( $type ) ) ) {
+ switch ( strtolower( trim( $type ) ) ) {
case 'raw':
$value = Message::rawParam( $value );
break;
@@ -775,7 +775,7 @@ class LegacyLogFormatter extends LogFormatter {
return $this->msg( 'parentheses' )->rawParams(
$this->context->getLanguage()->pipeList( $links ) )->escaped();
// Show unmerge link
- } elseif( $type == 'merge' && $subtype == 'merge' ) {
+ } elseif ( $type == 'merge' && $subtype == 'merge' ) {
if ( !$this->context->getUser()->isAllowed( 'mergehistory' ) ) {
return '';
}
@@ -814,395 +814,3 @@ class LegacyLogFormatter extends LogFormatter {
}
}
-/**
- * This class formats move log entries.
- * @since 1.19
- */
-class MoveLogFormatter extends LogFormatter {
- public function getPreloadTitles() {
- $params = $this->extractParameters();
- return array( Title::newFromText( $params[3] ) );
- }
-
- protected function getMessageKey() {
- $key = parent::getMessageKey();
- $params = $this->getMessageParameters();
- if ( isset( $params[4] ) && $params[4] === '1' ) {
- $key .= '-noredirect';
- }
- return $key;
- }
-
- protected function getMessageParameters() {
- $params = parent::getMessageParameters();
- $oldname = $this->makePageLink( $this->entry->getTarget(), array( 'redirect' => 'no' ) );
- $newname = $this->makePageLink( Title::newFromText( $params[3] ) );
- $params[2] = Message::rawParam( $oldname );
- $params[3] = Message::rawParam( $newname );
- return $params;
- }
-
- public function getActionLinks() {
- if ( $this->entry->isDeleted( LogPage::DELETED_ACTION ) // Action is hidden
- || $this->entry->getSubtype() !== 'move'
- || !$this->context->getUser()->isAllowed( 'move' ) )
- {
- return '';
- }
-
- $params = $this->extractParameters();
- $destTitle = Title::newFromText( $params[3] );
- if ( !$destTitle ) {
- return '';
- }
-
- $revert = Linker::linkKnown(
- SpecialPage::getTitleFor( 'Movepage' ),
- $this->msg( 'revertmove' )->escaped(),
- array(),
- array(
- 'wpOldTitle' => $destTitle->getPrefixedDBkey(),
- 'wpNewTitle' => $this->entry->getTarget()->getPrefixedDBkey(),
- 'wpReason' => $this->msg( 'revertmove' )->inContentLanguage()->text(),
- 'wpMovetalk' => 0
- )
- );
- return $this->msg( 'parentheses' )->rawParams( $revert )->escaped();
- }
-}
-
-/**
- * This class formats delete log entries.
- * @since 1.19
- */
-class DeleteLogFormatter extends LogFormatter {
- protected function getMessageKey() {
- $key = parent::getMessageKey();
- if ( in_array( $this->entry->getSubtype(), array( 'event', 'revision' ) ) ) {
- if ( count( $this->getMessageParameters() ) < 5 ) {
- return "$key-legacy";
- }
- }
- return $key;
- }
-
- protected function getMessageParameters() {
- if ( isset( $this->parsedParametersDeleteLog ) ) {
- return $this->parsedParametersDeleteLog;
- }
-
- $params = parent::getMessageParameters();
- $subtype = $this->entry->getSubtype();
- if ( in_array( $subtype, array( 'event', 'revision' ) ) ) {
- // $params[3] here is 'revision' for page revisions, 'oldimage' for file versions, or a comma-separated list of log_ids for log entries.
- // $subtype here is 'revision' for page revisions and file versions, or 'event' for log entries.
- if (
- ( $subtype === 'event' && count( $params ) === 6 ) ||
- ( $subtype === 'revision' && isset( $params[3] ) && ( $params[3] === 'revision' || $params[3] === 'oldimage' ) )
- ) {
- $paramStart = $subtype === 'revision' ? 4 : 3;
-
- $old = $this->parseBitField( $params[$paramStart+1] );
- $new = $this->parseBitField( $params[$paramStart+2] );
- list( $hid, $unhid, $extra ) = RevisionDeleter::getChanges( $new, $old );
- $changes = array();
- foreach ( $hid as $v ) {
- $changes[] = $this->msg( "$v-hid" )->plain();
- }
- foreach ( $unhid as $v ) {
- $changes[] = $this->msg( "$v-unhid" )->plain();
- }
- foreach ( $extra as $v ) {
- $changes[] = $this->msg( $v )->plain();
- }
- $changeText = $this->context->getLanguage()->listToText( $changes );
-
- $newParams = array_slice( $params, 0, 3 );
- $newParams[3] = $changeText;
- $count = count( explode( ',', $params[$paramStart] ) );
- $newParams[4] = $this->context->getLanguage()->formatNum( $count );
- return $this->parsedParametersDeleteLog = $newParams;
- } else {
- return $this->parsedParametersDeleteLog = array_slice( $params, 0, 3 );
- }
- }
-
- return $this->parsedParametersDeleteLog = $params;
- }
-
- protected function parseBitField( $string ) {
- // Input is like ofield=2134 or just the number
- if ( strpos( $string, 'field=' ) === 1 ) {
- list( , $field ) = explode( '=', $string );
- return (int) $field;
- } else {
- return (int) $string;
- }
- }
-
- public function getActionLinks() {
- $user = $this->context->getUser();
- if ( !$user->isAllowed( 'deletedhistory' ) || $this->entry->isDeleted( LogPage::DELETED_ACTION ) ) {
- return '';
- }
-
- switch ( $this->entry->getSubtype() ) {
- case 'delete': // Show undelete link
- if( $user->isAllowed( 'undelete' ) ) {
- $message = 'undeletelink';
- } else {
- $message = 'undeleteviewlink';
- }
- $revert = Linker::linkKnown(
- SpecialPage::getTitleFor( 'Undelete' ),
- $this->msg( $message )->escaped(),
- array(),
- array( 'target' => $this->entry->getTarget()->getPrefixedDBkey() )
- );
- return $this->msg( 'parentheses' )->rawParams( $revert )->escaped();
-
- case 'revision': // If an edit was hidden from a page give a review link to the history
- $params = $this->extractParameters();
- if ( !isset( $params[3] ) || !isset( $params[4] ) ) {
- return '';
- }
-
- // Different revision types use different URL params...
- $key = $params[3];
- // This is a CSV of the IDs
- $ids = explode( ',', $params[4] );
-
- $links = array();
-
- // If there's only one item, we can show a diff link
- if ( count( $ids ) == 1 ) {
- // Live revision diffs...
- if ( $key == 'oldid' || $key == 'revision' ) {
- $links[] = Linker::linkKnown(
- $this->entry->getTarget(),
- $this->msg( 'diff' )->escaped(),
- array(),
- array(
- 'diff' => intval( $ids[0] ),
- 'unhide' => 1
- )
- );
- // Deleted revision diffs...
- } elseif ( $key == 'artimestamp' || $key == 'archive' ) {
- $links[] = Linker::linkKnown(
- SpecialPage::getTitleFor( 'Undelete' ),
- $this->msg( 'diff' )->escaped(),
- array(),
- array(
- 'target' => $this->entry->getTarget()->getPrefixedDBkey(),
- 'diff' => 'prev',
- 'timestamp' => $ids[0]
- )
- );
- }
- }
-
- // View/modify link...
- $links[] = Linker::linkKnown(
- SpecialPage::getTitleFor( 'Revisiondelete' ),
- $this->msg( 'revdel-restore' )->escaped(),
- array(),
- array(
- 'target' => $this->entry->getTarget()->getPrefixedText(),
- 'type' => $key,
- 'ids' => implode( ',', $ids ),
- )
- );
-
- return $this->msg( 'parentheses' )->rawParams(
- $this->context->getLanguage()->pipeList( $links ) )->escaped();
-
- case 'event': // Hidden log items, give review link
- $params = $this->extractParameters();
- if ( !isset( $params[3] ) ) {
- return '';
- }
- // This is a CSV of the IDs
- $query = $params[3];
- // Link to each hidden object ID, $params[1] is the url param
- $revert = Linker::linkKnown(
- SpecialPage::getTitleFor( 'Revisiondelete' ),
- $this->msg( 'revdel-restore' )->escaped(),
- array(),
- array(
- 'target' => $this->entry->getTarget()->getPrefixedText(),
- 'type' => 'logging',
- 'ids' => $query
- )
- );
- return $this->msg( 'parentheses' )->rawParams( $revert )->escaped();
- default:
- return '';
- }
- }
-}
-
-/**
- * This class formats patrol log entries.
- * @since 1.19
- */
-class PatrolLogFormatter extends LogFormatter {
- protected function getMessageKey() {
- $key = parent::getMessageKey();
- $params = $this->getMessageParameters();
- if ( isset( $params[5] ) && $params[5] ) {
- $key .= '-auto';
- }
- return $key;
- }
-
- protected function getMessageParameters() {
- $params = parent::getMessageParameters();
-
- $target = $this->entry->getTarget();
- $oldid = $params[3];
- $revision = $this->context->getLanguage()->formatNum( $oldid, true );
-
- if ( $this->plaintext ) {
- $revlink = $revision;
- } elseif ( $target->exists() ) {
- $query = array(
- 'oldid' => $oldid,
- 'diff' => 'prev'
- );
- $revlink = Linker::link( $target, htmlspecialchars( $revision ), array(), $query );
- } else {
- $revlink = htmlspecialchars( $revision );
- }
-
- $params[3] = Message::rawParam( $revlink );
- return $params;
- }
-}
-
-/**
- * This class formats new user log entries.
- * @since 1.19
- */
-class NewUsersLogFormatter extends LogFormatter {
- protected function getMessageParameters() {
- $params = parent::getMessageParameters();
- $subtype = $this->entry->getSubtype();
- if ( $subtype === 'create2' || $subtype === 'byemail' ) {
- if ( isset( $params[3] ) ) {
- $target = User::newFromId( $params[3] );
- } else {
- $target = User::newFromName( $this->entry->getTarget()->getText(), false );
- }
- $params[2] = Message::rawParam( $this->makeUserLink( $target ) );
- $params[3] = $target->getName();
- }
- return $params;
- }
-
- public function getComment() {
- $timestamp = wfTimestamp( TS_MW, $this->entry->getTimestamp() );
- if ( $timestamp < '20080129000000' ) {
- # Suppress $comment from old entries (before 2008-01-29),
- # not needed and can contain incorrect links
- return '';
- }
- return parent::getComment();
- }
-
- public function getPreloadTitles() {
- $subtype = $this->entry->getSubtype();
- if ( $subtype === 'create2' || $subtype === 'byemail' ) {
- //add the user talk to LinkBatch for the userLink
- return array( Title::makeTitle( NS_USER_TALK, $this->entry->getTarget()->getText() ) );
- }
- return array();
- }
-}
-
-/**
- * This class formats rights log entries.
- * @since 1.21
- */
-class RightsLogFormatter extends LogFormatter {
- protected function makePageLink( Title $title = null, $parameters = array() ) {
- global $wgContLang, $wgUserrightsInterwikiDelimiter;
-
- if ( !$this->plaintext ) {
- $text = $wgContLang->ucfirst( $title->getText() );
- $parts = explode( $wgUserrightsInterwikiDelimiter, $text, 2 );
-
- if ( count( $parts ) === 2 ) {
- $titleLink = WikiMap::foreignUserLink( $parts[1], $parts[0],
- htmlspecialchars( $title->getPrefixedText() ) );
-
- if ( $titleLink !== false ) {
- return $titleLink;
- }
- }
- }
-
- return parent::makePageLink( $title, $parameters );
- }
-
- protected function getMessageKey() {
- $key = parent::getMessageKey();
- $params = $this->getMessageParameters();
- if ( !isset( $params[3] ) && !isset( $params[4] ) ) {
- $key .= '-legacy';
- }
- return $key;
- }
-
- protected function getMessageParameters() {
- $params = parent::getMessageParameters();
-
- // Really old entries
- if ( !isset( $params[3] ) && !isset( $params[4] ) ) {
- return $params;
- }
-
- $oldGroups = $params[3];
- $newGroups = $params[4];
-
- // Less old entries
- if ( $oldGroups === '' ) {
- $oldGroups = array();
- } elseif ( is_string( $oldGroups ) ) {
- $oldGroups = array_map( 'trim', explode( ',', $oldGroups ) );
- }
- if ( $newGroups === '' ) {
- $newGroups = array();
- } elseif ( is_string( $newGroups ) ) {
- $newGroups = array_map( 'trim', explode( ',', $newGroups ) );
- }
-
- $userName = $this->entry->getTarget()->getText();
- if ( !$this->plaintext && count( $oldGroups ) ) {
- foreach ( $oldGroups as &$group ) {
- $group = User::getGroupMember( $group, $userName );
- }
- }
- if ( !$this->plaintext && count( $newGroups ) ) {
- foreach ( $newGroups as &$group ) {
- $group = User::getGroupMember( $group, $userName );
- }
- }
-
- $lang = $this->context->getLanguage();
- if ( count( $oldGroups ) ) {
- $params[3] = $lang->listToText( $oldGroups );
- } else {
- $params[3] = $this->msg( 'rightsnone' )->text();
- }
- if ( count( $newGroups ) ) {
- // Array_values is used here because of bug 42211
- // see use of array_unique in UserrightsPage::doSaveUserGroups on $newGroups.
- $params[4] = $lang->listToText( array_values( $newGroups ) );
- } else {
- $params[4] = $this->msg( 'rightsnone' )->text();
- }
-
- return $params;
- }
-}
diff --git a/includes/logging/LogPage.php b/includes/logging/LogPage.php
index 4191c577..cc473c18 100644
--- a/includes/logging/LogPage.php
+++ b/includes/logging/LogPage.php
@@ -94,7 +94,7 @@ class LogPage {
$newId = !is_null( $log_id ) ? $log_id : $dbw->insertId();
# And update recentchanges
- if( $this->updateRecentChanges ) {
+ if ( $this->updateRecentChanges ) {
$titleObj = SpecialPage::getTitleFor( 'Log', $this->type );
RecentChange::notifyLog(
@@ -102,9 +102,9 @@ class LogPage {
$this->type, $this->action, $this->target, $this->comment,
$this->params, $newId, $this->getRcCommentIRC()
);
- } elseif( $this->sendToUDP ) {
+ } 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 $newId;
}
@@ -129,7 +129,7 @@ class LogPage {
public function getRcComment() {
$rcComment = $this->actionText;
- if( $this->comment != '' ) {
+ if ( $this->comment != '' ) {
if ( $rcComment == '' ) {
$rcComment = $this->comment;
} else {
@@ -149,7 +149,7 @@ class LogPage {
public function getRcCommentIRC() {
$rcComment = $this->ircActionText;
- if( $this->comment != '' ) {
+ if ( $this->comment != '' ) {
if ( $rcComment == '' ) {
$rcComment = $this->comment;
} else {
@@ -198,7 +198,7 @@ class LogPage {
public static function logName( $type ) {
global $wgLogNames;
- if( isset( $wgLogNames[$type] ) ) {
+ if ( isset( $wgLogNames[$type] ) ) {
return str_replace( '_', ' ', wfMessage( $wgLogNames[$type] )->text() );
} else {
// Bogus log types? Perhaps an extension was removed.
@@ -247,13 +247,13 @@ class LogPage {
$key = "$type/$action";
- if( isset( $wgLogActions[$key] ) ) {
- if( is_null( $title ) ) {
+ if ( isset( $wgLogActions[$key] ) ) {
+ if ( is_null( $title ) ) {
$rv = wfMessage( $wgLogActions[$key] )->inLanguage( $langObj )->escaped();
} else {
$titleLink = self::getTitleLink( $type, $langObjOrNull, $title, $params );
- if( count( $params ) == 0 ) {
+ if ( count( $params ) == 0 ) {
$rv = wfMessage( $wgLogActions[$key] )->rawParams( $titleLink )->inLanguage( $langObj )->escaped();
} else {
$details = '';
@@ -262,7 +262,7 @@ class LogPage {
// User suppression
if ( preg_match( '/^(block|suppress)\/(block|reblock)$/', $key ) ) {
if ( $skin ) {
- $params[1] = '<span class="blockExpiry" dir="ltr" title="' . htmlspecialchars( $params[1] ). '">' .
+ $params[1] = '<span class="blockExpiry" title="&lrm;' . htmlspecialchars( $params[1] ) . '">' .
$wgLang->translateBlockExpiry( $params[1] ) . '</span>';
} else {
$params[1] = $wgContLang->translateBlockExpiry( $params[1] );
@@ -273,14 +273,14 @@ class LogPage {
// Page protections
} elseif ( $type == 'protect' && count( $params ) == 3 ) {
// Restrictions and expiries
- if( $skin ) {
+ if ( $skin ) {
$details .= $wgLang->getDirMark() . htmlspecialchars( " {$params[1]}" );
} else {
$details .= " {$params[1]}";
}
// Cascading flag...
- if( $params[2] ) {
+ if ( $params[2] ) {
$details .= ' [' . wfMessage( 'protect-summary-cascade' )->inLanguage( $langObj )->text() . ']';
}
}
@@ -291,7 +291,7 @@ class LogPage {
} else {
global $wgLogActionsHandlers;
- if( isset( $wgLogActionsHandlers[$key] ) ) {
+ if ( isset( $wgLogActionsHandlers[$key] ) ) {
$args = func_get_args();
$rv = call_user_func_array( $wgLogActionsHandlers[$key], $args );
} else {
@@ -310,7 +310,7 @@ class LogPage {
// 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 ) {
+ if ( $filterWikilinks ) {
$rv = str_replace( '[[', '', $rv );
$rv = str_replace( ']]', '', $rv );
}
@@ -327,11 +327,11 @@ class LogPage {
* @return String
*/
protected static function getTitleLink( $type, $lang, $title, &$params ) {
- if( !$lang ) {
+ if ( !$lang ) {
return $title->getPrefixedText();
}
- switch( $type ) {
+ switch ( $type ) {
case 'move':
$titleLink = Linker::link(
$title,
@@ -353,7 +353,7 @@ class LogPage {
}
break;
case 'block':
- if( substr( $title->getText(), 0, 1 ) == '#' ) {
+ if ( substr( $title->getText(), 0, 1 ) == '#' ) {
$titleLink = $title->getText();
} else {
// @todo Store the user identifier in the parameters
@@ -377,11 +377,11 @@ class LogPage {
$params[1] = $lang->timeanddate( $params[1] );
break;
default:
- if( $title->isSpecialPage() ) {
+ if ( $title->isSpecialPage() ) {
list( $name, $par ) = SpecialPageFactory::resolveAlias( $title->getDBkey() );
# Use the language name for log titles, rather than Log/X
- if( $name == 'Log' ) {
+ if ( $name == 'Log' ) {
$logPage = new LogPage( $par );
$titleLink = Linker::link( $title, $logPage->getName()->escaped() );
$titleLink = wfMessage( 'parentheses' )
@@ -465,13 +465,13 @@ class LogPage {
* @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 ) {
+ foreach ( $values as $value ) {
$data[] = array(
'ls_field' => $field,
'ls_value' => $value,
@@ -518,17 +518,17 @@ class LogPage {
* @return String
*/
public static function formatBlockFlags( $flags, $lang ) {
- $flags = explode( ',', trim( $flags ) );
+ $flags = trim( $flags );
+ if ( $flags === '' ) {
+ return ''; //nothing to do
+ }
+ $flags = explode( ',', $flags );
- if( count( $flags ) > 0 ) {
- for( $i = 0; $i < count( $flags ); $i++ ) {
- $flags[$i] = self::formatBlockFlag( $flags[$i], $lang );
- }
- return wfMessage( 'parentheses' )->inLanguage( $lang )
- ->rawParams( $lang->commaList( $flags ) )->escaped();
- } else {
- return '';
+ for ( $i = 0; $i < count( $flags ); $i++ ) {
+ $flags[$i] = self::formatBlockFlag( $flags[$i], $lang );
}
+ return wfMessage( 'parentheses' )->inLanguage( $lang )
+ ->rawParams( $lang->commaList( $flags ) )->escaped();
}
/**
@@ -541,7 +541,7 @@ class LogPage {
public static function formatBlockFlag( $flag, $lang ) {
static $messages = array();
- if( !isset( $messages[$flag] ) ) {
+ if ( !isset( $messages[$flag] ) ) {
$messages[$flag] = htmlspecialchars( $flag ); // Fallback
// For grepping. The following core messages can be used here:
diff --git a/includes/logging/LogPager.php b/includes/logging/LogPager.php
index 908755ed..09ae3b8c 100644
--- a/includes/logging/LogPager.php
+++ b/includes/logging/LogPager.php
@@ -34,14 +34,14 @@ class LogPager extends ReverseChronologicalPager {
/**
* Constructor
*
- * @param $list LogEventsList
+ * @param LogEventsList $list
* @param string $types or Array: log types to show
* @param string $performer the user who made the log entries
* @param string|Title $title the page title the log entries are for
* @param string $pattern do a prefix search rather than an exact title match
* @param array $conds extra conditions for the query
- * @param $year Integer: the year to start from
- * @param $month Integer: the month to start from
+ * @param int $year The year to start from
+ * @param int $month The month to start from
* @param string $tagFilter tag
*/
public function __construct( $list, $types = array(), $performer = '', $title = '', $pattern = '',
@@ -71,16 +71,17 @@ class LogPager extends ReverseChronologicalPager {
public function getFilterParams() {
global $wgFilterLogTypes;
$filters = array();
- if( count( $this->types ) ) {
+ if ( count( $this->types ) ) {
return $filters;
}
- foreach( $wgFilterLogTypes as $type => $default ) {
+ foreach ( $wgFilterLogTypes as $type => $default ) {
// Avoid silly filtering
- if( $type !== 'patrol' || $this->getUser()->useNPPatrol() ) {
+ if ( $type !== 'patrol' || $this->getUser()->useNPPatrol() ) {
$hide = $this->getRequest()->getInt( "hide_{$type}_log", $default );
$filters[$type] = $hide;
- if( $hide )
+ if ( $hide ) {
$this->mConds[] = 'log_type != ' . $this->mDb->addQuotes( $type );
+ }
}
}
return $filters;
@@ -98,11 +99,11 @@ class LogPager extends ReverseChronologicalPager {
$user = $this->getUser();
// If $types is not an array, make it an array
- $types = ($types === '') ? array() : (array)$types;
+ $types = ( $types === '' ) ? array() : (array)$types;
// Don't even show header for private logs; don't recognize it...
$needReindex = false;
foreach ( $types as $type ) {
- if( isset( $wgLogRestrictions[$type] )
+ if ( isset( $wgLogRestrictions[$type] )
&& !$user->isAllowed( $wgLogRestrictions[$type] )
) {
$needReindex = true;
@@ -119,13 +120,15 @@ class LogPager extends ReverseChronologicalPager {
// Also, only show them upon specific request to avoid suprises.
$audience = $types ? 'user' : 'public';
$hideLogs = LogEventsList::getExcludeClause( $this->mDb, $audience, $user );
- if( $hideLogs !== false ) {
+ if ( $hideLogs !== false ) {
$this->mConds[] = $hideLogs;
}
- if( count( $types ) ) {
+ if ( count( $types ) ) {
$this->mConds['log_type'] = $types;
// Set typeCGI; used in url param for paging
- if( count( $types ) == 1 ) $this->typeCGI = $types[0];
+ if ( count( $types ) == 1 ) {
+ $this->typeCGI = $types[0];
+ }
}
}
@@ -136,16 +139,16 @@ class LogPager extends ReverseChronologicalPager {
* @return bool
*/
private function limitPerformer( $name ) {
- if( $name == '' ) {
+ if ( $name == '' ) {
return false;
}
$usertitle = Title::makeTitleSafe( NS_USER, $name );
- if( is_null( $usertitle ) ) {
+ if ( is_null( $usertitle ) ) {
return false;
}
/* Fetch userid at first, if known, provides awesome query plan afterwards */
$userid = User::idFromName( $name );
- if( !$userid ) {
+ if ( !$userid ) {
/* It should be nicer to abort query at all,
but for now it won't pass anywhere behind the optimizer */
$this->mConds[] = "NULL";
@@ -153,9 +156,9 @@ class LogPager extends ReverseChronologicalPager {
$this->mConds['log_user'] = $userid;
// Paranoia: avoid brute force searches (bug 17342)
$user = $this->getUser();
- if( !$user->isAllowed( 'deletedhistory' ) ) {
+ if ( !$user->isAllowed( 'deletedhistory' ) ) {
$this->mConds[] = $this->mDb->bitAnd( 'log_deleted', LogPage::DELETED_USER ) . ' = 0';
- } elseif( !$user->isAllowed( 'suppressrevision' ) ) {
+ } elseif ( !$user->isAllowed( 'suppressrevision' ) ) {
$this->mConds[] = $this->mDb->bitAnd( 'log_deleted', LogPage::SUPPRESSED_USER ) .
' != ' . LogPage::SUPPRESSED_USER;
}
@@ -178,7 +181,7 @@ class LogPager extends ReverseChronologicalPager {
$title = $page;
} else {
$title = Title::newFromText( $page );
- if( strlen( $page ) == 0 || !$title instanceof Title ) {
+ if ( strlen( $page ) == 0 || !$title instanceof Title ) {
return false;
}
}
@@ -198,7 +201,7 @@ class LogPager extends ReverseChronologicalPager {
# use the page_time index. That should have no more than a few hundred
# log entries for even the busiest pages, so it can be safely scanned
# in full to satisfy an impossible condition on user or similar.
- if( $pattern && !$wgMiserMode ) {
+ if ( $pattern && !$wgMiserMode ) {
$this->mConds['log_namespace'] = $ns;
$this->mConds[] = 'log_title ' . $db->buildLike( $title->getDBkey(), $db->anyString() );
$this->pattern = $pattern;
@@ -208,10 +211,10 @@ class LogPager extends ReverseChronologicalPager {
}
// Paranoia: avoid brute force searches (bug 17342)
$user = $this->getUser();
- if( !$user->isAllowed( 'deletedhistory' ) ) {
- $this->mConds[] = $db->bitAnd( 'log_deleted', LogPage::DELETED_ACTION) . ' = 0';
- } elseif( !$user->isAllowed( 'suppressrevision' ) ) {
- $this->mConds[] = $db->bitAnd( 'log_deleted', LogPage::SUPPRESSED_ACTION) .
+ if ( !$user->isAllowed( 'deletedhistory' ) ) {
+ $this->mConds[] = $db->bitAnd( 'log_deleted', LogPage::DELETED_ACTION ) . ' = 0';
+ } elseif ( !$user->isAllowed( 'suppressrevision' ) ) {
+ $this->mConds[] = $db->bitAnd( 'log_deleted', LogPage::SUPPRESSED_ACTION ) .
' != ' . LogPage::SUPPRESSED_ACTION;
}
}
@@ -234,7 +237,7 @@ class LogPager extends ReverseChronologicalPager {
# Add log_search table if there are conditions on it.
# This filters the results to only include log rows that have
# log_search records with the specified ls_field and ls_value values.
- if( array_key_exists( 'ls_field', $this->mConds ) ) {
+ if ( array_key_exists( 'ls_field', $this->mConds ) ) {
$tables[] = 'log_search';
$index['log_search'] = 'ls_field_val';
$index['logging'] = 'PRIMARY';
@@ -246,28 +249,18 @@ class LogPager extends ReverseChronologicalPager {
# no duplicate log rows. Otherwise, we need to remove the duplicates.
$options[] = 'DISTINCT';
}
- # Avoid usage of the wrong index by limiting
- # the choices of available indexes. This mainly
- # avoids site-breaking filesorts.
- } elseif( $this->title || $this->pattern || $this->performer ) {
- $index['logging'] = array( 'page_time', 'user_time' );
- if( count( $this->types ) == 1 ) {
- $index['logging'][] = 'log_user_type_time';
- }
- } elseif( count( $this->types ) == 1 ) {
- $index['logging'] = 'type_time';
- } else {
- $index['logging'] = 'times';
}
- $options['USE INDEX'] = $index;
+ if ( count( $index ) ) {
+ $options['USE INDEX'] = $index;
+ }
# Don't show duplicate rows when using log_search
$joins['log_search'] = array( 'INNER JOIN', 'ls_log_id=log_id' );
$info = array(
- 'tables' => $tables,
- 'fields' => $fields,
- 'conds' => array_merge( $conds, $this->mConds ),
- 'options' => $options,
+ 'tables' => $tables,
+ 'fields' => $fields,
+ 'conds' => array_merge( $conds, $this->mConds ),
+ 'options' => $options,
'join_conds' => $joins,
);
# Add ChangeTags filter query
@@ -295,7 +288,7 @@ class LogPager extends ReverseChronologicalPager {
public function getStartBody() {
wfProfileIn( __METHOD__ );
# Do a link batch query
- if( $this->getNumRows() > 0 ) {
+ if ( $this->getNumRows() > 0 ) {
$lb = new LinkBatch;
foreach ( $this->mResult as $row ) {
$lb->add( $row->log_namespace, $row->log_title );
diff --git a/includes/logging/MoveLogFormatter.php b/includes/logging/MoveLogFormatter.php
new file mode 100644
index 00000000..0978f976
--- /dev/null
+++ b/includes/logging/MoveLogFormatter.php
@@ -0,0 +1,82 @@
+<?php
+/**
+ * Formatter for move log entries.
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with this program; if not, write to the Free Software Foundation, Inc.,
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ * http://www.gnu.org/copyleft/gpl.html
+ *
+ * @file
+ * @author Niklas Laxström
+ * @license http://www.gnu.org/copyleft/gpl.html GNU General Public License 2.0 or later
+ * @since 1.22
+ */
+
+/**
+ * This class formats move log entries.
+ *
+ * @since 1.19
+ */
+class MoveLogFormatter extends LogFormatter {
+ public function getPreloadTitles() {
+ $params = $this->extractParameters();
+ return array( Title::newFromText( $params[3] ) );
+ }
+
+ protected function getMessageKey() {
+ $key = parent::getMessageKey();
+ $params = $this->getMessageParameters();
+ if ( isset( $params[4] ) && $params[4] === '1' ) {
+ $key .= '-noredirect';
+ }
+ return $key;
+ }
+
+ protected function getMessageParameters() {
+ $params = parent::getMessageParameters();
+ $oldname = $this->makePageLink( $this->entry->getTarget(), array( 'redirect' => 'no' ) );
+ $newname = $this->makePageLink( Title::newFromText( $params[3] ) );
+ $params[2] = Message::rawParam( $oldname );
+ $params[3] = Message::rawParam( $newname );
+ return $params;
+ }
+
+ public function getActionLinks() {
+ if ( $this->entry->isDeleted( LogPage::DELETED_ACTION ) // Action is hidden
+ || $this->entry->getSubtype() !== 'move'
+ || !$this->context->getUser()->isAllowed( 'move' ) )
+ {
+ return '';
+ }
+
+ $params = $this->extractParameters();
+ $destTitle = Title::newFromText( $params[3] );
+ if ( !$destTitle ) {
+ return '';
+ }
+
+ $revert = Linker::linkKnown(
+ SpecialPage::getTitleFor( 'Movepage' ),
+ $this->msg( 'revertmove' )->escaped(),
+ array(),
+ array(
+ 'wpOldTitle' => $destTitle->getPrefixedDBkey(),
+ 'wpNewTitle' => $this->entry->getTarget()->getPrefixedDBkey(),
+ 'wpReason' => $this->msg( 'revertmove' )->inContentLanguage()->text(),
+ 'wpMovetalk' => 0
+ )
+ );
+ return $this->msg( 'parentheses' )->rawParams( $revert )->escaped();
+ }
+}
diff --git a/includes/logging/NewUsersLogFormatter.php b/includes/logging/NewUsersLogFormatter.php
new file mode 100644
index 00000000..602728b4
--- /dev/null
+++ b/includes/logging/NewUsersLogFormatter.php
@@ -0,0 +1,65 @@
+<?php
+/**
+ * Formatter for new user log entries.
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with this program; if not, write to the Free Software Foundation, Inc.,
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ * http://www.gnu.org/copyleft/gpl.html
+ *
+ * @file
+ * @author Niklas Laxström
+ * @license http://www.gnu.org/copyleft/gpl.html GNU General Public License 2.0 or later
+ * @since 1.22
+ */
+
+/**
+ * This class formats new user log entries.
+ *
+ * @since 1.19
+ */
+class NewUsersLogFormatter extends LogFormatter {
+ protected function getMessageParameters() {
+ $params = parent::getMessageParameters();
+ $subtype = $this->entry->getSubtype();
+ if ( $subtype === 'create2' || $subtype === 'byemail' ) {
+ if ( isset( $params[3] ) ) {
+ $target = User::newFromId( $params[3] );
+ } else {
+ $target = User::newFromName( $this->entry->getTarget()->getText(), false );
+ }
+ $params[2] = Message::rawParam( $this->makeUserLink( $target ) );
+ $params[3] = $target->getName();
+ }
+ return $params;
+ }
+
+ public function getComment() {
+ $timestamp = wfTimestamp( TS_MW, $this->entry->getTimestamp() );
+ if ( $timestamp < '20080129000000' ) {
+ # Suppress $comment from old entries (before 2008-01-29),
+ # not needed and can contain incorrect links
+ return '';
+ }
+ return parent::getComment();
+ }
+
+ public function getPreloadTitles() {
+ $subtype = $this->entry->getSubtype();
+ if ( $subtype === 'create2' || $subtype === 'byemail' ) {
+ //add the user talk to LinkBatch for the userLink
+ return array( Title::makeTitle( NS_USER_TALK, $this->entry->getTarget()->getText() ) );
+ }
+ return array();
+ }
+}
diff --git a/includes/logging/PatrolLog.php b/includes/logging/PatrolLog.php
index 911fffc0..bb76d5a9 100644
--- a/includes/logging/PatrolLog.php
+++ b/includes/logging/PatrolLog.php
@@ -38,6 +38,13 @@ class PatrolLog {
* @return bool
*/
public static function record( $rc, $auto = false, User $user = null ) {
+ global $wgLogAutopatrol;
+
+ // do not log autopatrolled edits if setting disables it
+ if ( $auto && !$wgLogAutopatrol ) {
+ return false;
+ }
+
if ( !$rc instanceof RecentChange ) {
$rc = RecentChange::newFromId( $rc );
if ( !is_object( $rc ) ) {
diff --git a/includes/logging/PatrolLogFormatter.php b/includes/logging/PatrolLogFormatter.php
new file mode 100644
index 00000000..507039ba
--- /dev/null
+++ b/includes/logging/PatrolLogFormatter.php
@@ -0,0 +1,63 @@
+<?php
+/**
+ * Formatter for new user log entries.
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with this program; if not, write to the Free Software Foundation, Inc.,
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ * http://www.gnu.org/copyleft/gpl.html
+ *
+ * @file
+ * @author Niklas Laxström
+ * @license http://www.gnu.org/copyleft/gpl.html GNU General Public License 2.0 or later
+ * @since 1.22
+ */
+
+/**
+ * This class formats patrol log entries.
+ *
+ * @since 1.19
+ */
+class PatrolLogFormatter extends LogFormatter {
+ protected function getMessageKey() {
+ $key = parent::getMessageKey();
+ $params = $this->getMessageParameters();
+ if ( isset( $params[5] ) && $params[5] ) {
+ $key .= '-auto';
+ }
+ return $key;
+ }
+
+ protected function getMessageParameters() {
+ $params = parent::getMessageParameters();
+
+ $target = $this->entry->getTarget();
+ $oldid = $params[3];
+ $revision = $this->context->getLanguage()->formatNum( $oldid, true );
+
+ if ( $this->plaintext ) {
+ $revlink = $revision;
+ } elseif ( $target->exists() ) {
+ $query = array(
+ 'oldid' => $oldid,
+ 'diff' => 'prev'
+ );
+ $revlink = Linker::link( $target, htmlspecialchars( $revision ), array(), $query );
+ } else {
+ $revlink = htmlspecialchars( $revision );
+ }
+
+ $params[3] = Message::rawParam( $revlink );
+ return $params;
+ }
+}
diff --git a/includes/logging/RightsLogFormatter.php b/includes/logging/RightsLogFormatter.php
new file mode 100644
index 00000000..d3daf6ee
--- /dev/null
+++ b/includes/logging/RightsLogFormatter.php
@@ -0,0 +1,112 @@
+<?php
+/**
+ * Formatter for user rights log entries.
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with this program; if not, write to the Free Software Foundation, Inc.,
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ * http://www.gnu.org/copyleft/gpl.html
+ *
+ * @file
+ * @author Alexandre Emsenhuber
+ * @license http://www.gnu.org/copyleft/gpl.html GNU General Public License 2.0 or later
+ * @since 1.22
+ */
+
+/**
+ * This class formats rights log entries.
+ *
+ * @since 1.21
+ */
+class RightsLogFormatter extends LogFormatter {
+ protected function makePageLink( Title $title = null, $parameters = array() ) {
+ global $wgContLang, $wgUserrightsInterwikiDelimiter;
+
+ if ( !$this->plaintext ) {
+ $text = $wgContLang->ucfirst( $title->getText() );
+ $parts = explode( $wgUserrightsInterwikiDelimiter, $text, 2 );
+
+ if ( count( $parts ) === 2 ) {
+ $titleLink = WikiMap::foreignUserLink( $parts[1], $parts[0],
+ htmlspecialchars( $title->getPrefixedText() ) );
+
+ if ( $titleLink !== false ) {
+ return $titleLink;
+ }
+ }
+ }
+
+ return parent::makePageLink( $title, $parameters );
+ }
+
+ protected function getMessageKey() {
+ $key = parent::getMessageKey();
+ $params = $this->getMessageParameters();
+ if ( !isset( $params[3] ) && !isset( $params[4] ) ) {
+ $key .= '-legacy';
+ }
+ return $key;
+ }
+
+ protected function getMessageParameters() {
+ $params = parent::getMessageParameters();
+
+ // Really old entries
+ if ( !isset( $params[3] ) && !isset( $params[4] ) ) {
+ return $params;
+ }
+
+ $oldGroups = $params[3];
+ $newGroups = $params[4];
+
+ // Less old entries
+ if ( $oldGroups === '' ) {
+ $oldGroups = array();
+ } elseif ( is_string( $oldGroups ) ) {
+ $oldGroups = array_map( 'trim', explode( ',', $oldGroups ) );
+ }
+ if ( $newGroups === '' ) {
+ $newGroups = array();
+ } elseif ( is_string( $newGroups ) ) {
+ $newGroups = array_map( 'trim', explode( ',', $newGroups ) );
+ }
+
+ $userName = $this->entry->getTarget()->getText();
+ if ( !$this->plaintext && count( $oldGroups ) ) {
+ foreach ( $oldGroups as &$group ) {
+ $group = User::getGroupMember( $group, $userName );
+ }
+ }
+ if ( !$this->plaintext && count( $newGroups ) ) {
+ foreach ( $newGroups as &$group ) {
+ $group = User::getGroupMember( $group, $userName );
+ }
+ }
+
+ $lang = $this->context->getLanguage();
+ if ( count( $oldGroups ) ) {
+ $params[3] = $lang->listToText( $oldGroups );
+ } else {
+ $params[3] = $this->msg( 'rightsnone' )->text();
+ }
+ if ( count( $newGroups ) ) {
+ // Array_values is used here because of bug 42211
+ // see use of array_unique in UserrightsPage::doSaveUserGroups on $newGroups.
+ $params[4] = $lang->listToText( array_values( $newGroups ) );
+ } else {
+ $params[4] = $this->msg( 'rightsnone' )->text();
+ }
+
+ return $params;
+ }
+}
diff --git a/includes/media/BMP.php b/includes/media/BMP.php
index 46d1b95b..99b7741a 100644
--- a/includes/media/BMP.php
+++ b/includes/media/BMP.php
@@ -58,15 +58,15 @@ class BmpHandler extends BitmapHandler {
*/
function getImageSize( $image, $filename ) {
$f = fopen( $filename, 'rb' );
- if( !$f ) {
+ if ( !$f ) {
return false;
}
$header = fread( $f, 54 );
fclose( $f );
// Extract binary form of width and height from the header
- $w = substr( $header, 18, 4);
- $h = substr( $header, 22, 4);
+ $w = substr( $header, 18, 4 );
+ $h = substr( $header, 22, 4 );
// Convert the unsigned long 32 bits (little endian):
try {
diff --git a/includes/media/Bitmap.php b/includes/media/Bitmap.php
index e2dc68b2..e2444a11 100644
--- a/includes/media/Bitmap.php
+++ b/includes/media/Bitmap.php
@@ -100,17 +100,6 @@ class BitmapHandler extends ImageHandler {
}
/**
- * Function that returns the number of pixels to be thumbnailed.
- * Intended for animated GIFs to multiply by the number of frames.
- *
- * @param File $image
- * @return int
- */
- function getImageArea( $image ) {
- return $image->getWidth() * $image->getHeight();
- }
-
- /**
* @param $image File
* @param $dstPath
* @param $dstUrl
@@ -131,7 +120,7 @@ class BitmapHandler extends ImageHandler {
# 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 as will be added to the Exif of the thumbnail
'comment' => isset( $params['descriptionUrl'] ) ?
"File source: {$params['descriptionUrl']}" : '',
# Properties of the original image
@@ -357,12 +346,12 @@ class BitmapHandler extends ImageHandler {
" -depth 8 $sharpen " .
" -rotate -$rotation " .
" {$animation_post} " .
- wfEscapeShellArg( $this->escapeMagickOutput( $params['dstPath'] ) ) . " 2>&1";
+ wfEscapeShellArg( $this->escapeMagickOutput( $params['dstPath'] ) );
wfDebug( __METHOD__ . ": running ImageMagick: $cmd\n" );
wfProfileIn( 'convert' );
$retval = 0;
- $err = wfShellExec( $cmd, $retval, $env );
+ $err = wfShellExecWithStderr( $cmd, $retval, $env );
wfProfileOut( 'convert' );
if ( $retval !== 0 ) {
@@ -398,7 +387,7 @@ class BitmapHandler extends ImageHandler {
$im->sharpenImage( $radius, $sigma );
}
$im->setCompressionQuality( 80 );
- } elseif( $params['mimeType'] == 'image/png' ) {
+ } elseif ( $params['mimeType'] == 'image/png' ) {
$im->setCompressionQuality( 95 );
} elseif ( $params['mimeType'] == 'image/gif' ) {
if ( $this->getImageArea( $image ) > $wgMaxAnimatedGifArea ) {
@@ -472,7 +461,7 @@ class BitmapHandler extends ImageHandler {
wfDebug( __METHOD__ . ": Running custom convert command $cmd\n" );
wfProfileIn( 'convert' );
$retval = 0;
- $err = wfShellExec( $cmd, $retval );
+ $err = wfShellExecWithStderr( $cmd, $retval );
wfProfileOut( 'convert' );
if ( $retval !== 0 ) {
@@ -712,24 +701,6 @@ class BitmapHandler extends ImageHandler {
imagejpeg( $dst_image, $thumbPath, 95 );
}
- /**
- * On supporting image formats, try to read out the low-level orientation
- * of the file and return the angle that the file needs to be rotated to
- * be viewed.
- *
- * This information is only useful when manipulating the original file;
- * the width and height we normally work with is logical, and will match
- * any produced output views.
- *
- * The base BitmapHandler doesn't understand any metadata formats, so this
- * is left up to child classes to implement.
- *
- * @param $file File
- * @return int 0, 90, 180 or 270
- */
- public function getRotation( $file ) {
- return 0;
- }
/**
* Returns whether the current scaler supports rotation (im and gd do)
@@ -765,20 +736,20 @@ class BitmapHandler extends ImageHandler {
public function rotate( $file, $params ) {
global $wgImageMagickConvertCommand;
- $rotation = ( $params[ 'rotation' ] + $this->getRotation( $file ) ) % 360;
+ $rotation = ( $params['rotation'] + $this->getRotation( $file ) ) % 360;
$scene = false;
$scaler = self::getScalerType( null, false );
switch ( $scaler ) {
case 'im':
$cmd = wfEscapeShellArg( $wgImageMagickConvertCommand ) . " " .
- wfEscapeShellArg( $this->escapeMagickInput( $params[ 'srcPath' ], $scene ) ) .
+ wfEscapeShellArg( $this->escapeMagickInput( $params['srcPath'], $scene ) ) .
" -rotate -$rotation " .
- wfEscapeShellArg( $this->escapeMagickOutput( $params[ 'dstPath' ] ) ) . " 2>&1";
+ wfEscapeShellArg( $this->escapeMagickOutput( $params['dstPath'] ) );
wfDebug( __METHOD__ . ": running ImageMagick: $cmd\n" );
wfProfileIn( 'convert' );
$retval = 0;
- $err = wfShellExec( $cmd, $retval, $env );
+ $err = wfShellExecWithStderr( $cmd, $retval, $env );
wfProfileOut( 'convert' );
if ( $retval !== 0 ) {
$this->logErrorForExternalProcess( $retval, $err, $cmd );
diff --git a/includes/media/BitmapMetadataHandler.php b/includes/media/BitmapMetadataHandler.php
index 345e7869..7c39c814 100644
--- a/includes/media/BitmapMetadataHandler.php
+++ b/includes/media/BitmapMetadataHandler.php
@@ -54,7 +54,7 @@ class BitmapMetadataHandler {
*
* @param string $app13 String containing app13 block from jpeg file
*/
- private function doApp13 ( $app13 ) {
+ private function doApp13( $app13 ) {
try {
$this->iptcType = JpegMetadataExtractor::doPSIR( $app13 );
} catch ( MWException $e ) {
@@ -79,7 +79,7 @@ class BitmapMetadataHandler {
* @param $filename string
* @param $byteOrder string
*/
- function getExif ( $filename, $byteOrder ) {
+ function getExif( $filename, $byteOrder ) {
global $wgShowEXIF;
if ( file_exists( $filename ) && $wgShowEXIF ) {
$exif = new Exif( $filename, $byteOrder );
@@ -95,7 +95,7 @@ class BitmapMetadataHandler {
* @param array $metaArray array of metadata values
* @param string $type type. defaults to other. if two things have the same type they're merged
*/
- function addMetadata ( $metaArray, $type = 'other' ) {
+ function addMetadata( $metaArray, $type = 'other' ) {
if ( isset( $this->metadata[$type] ) ) {
/* merge with old data */
$metaArray = $metaArray + $this->metadata[$type];
@@ -113,7 +113,7 @@ class BitmapMetadataHandler {
*
* @return Array metadata array
*/
- function getMetadataArray () {
+ function getMetadataArray() {
// this seems a bit ugly... This is all so its merged in right order
// based on the MWG recomendation.
$temp = Array();
@@ -147,7 +147,7 @@ class BitmapMetadataHandler {
* @return array metadata result array.
* @throws MWException on invalid file.
*/
- static function Jpeg ( $filename ) {
+ static function Jpeg( $filename ) {
$showXMP = function_exists( 'xml_parser_create_ns' );
$meta = new self();
@@ -156,7 +156,7 @@ class BitmapMetadataHandler {
$meta->addMetadata( Array( 'JPEGFileComment' => $seg['COM'] ), 'native' );
}
if ( isset( $seg['PSIR'] ) && count( $seg['PSIR'] ) > 0 ) {
- foreach( $seg['PSIR'] as $curPSIRValue ) {
+ foreach ( $seg['PSIR'] as $curPSIRValue ) {
$meta->doApp13( $curPSIRValue );
}
}
@@ -189,7 +189,7 @@ class BitmapMetadataHandler {
* @param string $filename full path to file
* @return Array Array for storage in img_metadata.
*/
- public static function PNG ( $filename ) {
+ public static function PNG( $filename ) {
$showXMP = function_exists( 'xml_parser_create_ns' );
$meta = new self();
@@ -218,7 +218,7 @@ class BitmapMetadataHandler {
* @param string $filename full path to file
* @return Array metadata array
*/
- public static function GIF ( $filename ) {
+ public static function GIF( $filename ) {
$meta = new self();
$baseArray = GIFMetadataExtractor::getMetadata( $filename );
@@ -259,7 +259,7 @@ class BitmapMetadataHandler {
* @throws MWException
* @return Array The metadata.
*/
- public static function Tiff ( $filename ) {
+ public static function Tiff( $filename ) {
if ( file_exists( $filename ) ) {
$byteOrder = self::getTiffByteOrder( $filename );
if ( !$byteOrder ) {
@@ -286,11 +286,13 @@ class BitmapMetadataHandler {
*/
static function getTiffByteOrder( $filename ) {
$fh = fopen( $filename, 'rb' );
- if ( !$fh ) return false;
+ if ( !$fh ) {
+ return false;
+ }
$head = fread( $fh, 2 );
fclose( $fh );
- switch( $head ) {
+ switch ( $head ) {
case 'II':
return 'LE'; // II for intel.
case 'MM':
diff --git a/includes/media/DjVu.php b/includes/media/DjVu.php
index 0a39a2cf..b9e89d9d 100644
--- a/includes/media/DjVu.php
+++ b/includes/media/DjVu.php
@@ -185,7 +185,7 @@ class DjVuHandler extends ImageHandler {
}
$cmd .= ' > ' . wfEscapeShellArg( $dstPath ) . ') 2>&1';
wfProfileIn( 'ddjvu' );
- wfDebug( __METHOD__.": $cmd\n" );
+ wfDebug( __METHOD__ . ": $cmd\n" );
$retval = '';
$err = wfShellExec( $cmd, $retval );
wfProfileOut( 'ddjvu' );
@@ -246,24 +246,23 @@ class DjVuHandler extends ImageHandler {
$image->dejaMetaTree = false;
$image->djvuTextTree = false;
$tree = new SimpleXMLElement( $metadata );
- if( $tree->getName() == 'mw-djvu' ) {
- foreach( $tree->children() as $b ) {
- if( $b->getName() == 'DjVuTxt' ) {
+ if ( $tree->getName() == 'mw-djvu' ) {
+ foreach ( $tree->children() as $b ) {
+ if ( $b->getName() == 'DjVuTxt' ) {
$image->djvuTextTree = $b;
- }
- elseif ( $b->getName() == 'DjVuXML' ) {
+ } elseif ( $b->getName() == 'DjVuXML' ) {
$image->dejaMetaTree = $b;
}
}
} else {
$image->dejaMetaTree = $tree;
}
- } catch( Exception $e ) {
+ } catch ( Exception $e ) {
wfDebug( "Bogus multipage XML metadata on '{$image->getName()}'\n" );
}
wfRestoreWarnings();
wfProfileOut( __METHOD__ );
- if( $gettext ) {
+ if ( $gettext ) {
return $image->djvuTextTree;
} else {
return $image->dejaMetaTree;
@@ -294,7 +293,7 @@ class DjVuHandler extends ImageHandler {
}
function isMetadataValid( $image, $metadata ) {
- return !empty( $metadata ) && $metadata != serialize(array());
+ return !empty( $metadata ) && $metadata != serialize( array() );
}
function pageCount( $image ) {
@@ -311,7 +310,7 @@ class DjVuHandler extends ImageHandler {
return false;
}
- $o = $tree->BODY[0]->OBJECT[$page-1];
+ $o = $tree->BODY[0]->OBJECT[$page - 1];
if ( $o ) {
return array(
'width' => intval( $o['width'] ),
@@ -328,7 +327,7 @@ class DjVuHandler extends ImageHandler {
return false;
}
- $o = $tree->BODY[0]->PAGE[$page-1];
+ $o = $tree->BODY[0]->PAGE[$page - 1];
if ( $o ) {
$txt = $o['value'];
return $txt;
diff --git a/includes/media/DjVuImage.php b/includes/media/DjVuImage.php
index 46989668..54efe7a8 100644
--- a/includes/media/DjVuImage.php
+++ b/includes/media/DjVuImage.php
@@ -64,7 +64,7 @@ class DjVuImage {
public function getImageSize() {
$data = $this->getInfo();
- if( $data !== false ) {
+ if ( $data !== false ) {
$width = $data['width'];
$height = $data['height'];
@@ -93,20 +93,20 @@ class DjVuImage {
$start = ftell( $file );
$secondary = fread( $file, 4 );
echo str_repeat( ' ', $indent * 4 ) . "($secondary)\n";
- while( ftell( $file ) - $start < $length ) {
+ while ( ftell( $file ) - $start < $length ) {
$chunkHeader = fread( $file, 8 );
- if( $chunkHeader == '' ) {
+ if ( $chunkHeader == '' ) {
break;
}
// @todo FIXME: Would be good to replace this extract() call with something that explicitly initializes local variables.
extract( unpack( 'a4chunk/NchunkLength', $chunkHeader ) );
echo str_repeat( ' ', $indent * 4 ) . "$chunk $chunkLength\n";
- if( $chunk == 'FORM' ) {
+ if ( $chunk == 'FORM' ) {
$this->dumpForm( $file, $chunkLength, $indent + 1 );
} else {
fseek( $file, $chunkLength, SEEK_CUR );
- if( $chunkLength & 1 == 1 ) {
+ if ( $chunkLength & 1 == 1 ) {
// Padding byte between chunks
fseek( $file, 1, SEEK_CUR );
}
@@ -118,7 +118,7 @@ class DjVuImage {
wfSuppressWarnings();
$file = fopen( $this->mFilename, 'rb' );
wfRestoreWarnings();
- if( $file === false ) {
+ if ( $file === false ) {
wfDebug( __METHOD__ . ": missing or failed file read\n" );
return false;
}
@@ -126,21 +126,21 @@ class DjVuImage {
$header = fread( $file, 16 );
$info = false;
- if( strlen( $header ) < 16 ) {
+ if ( strlen( $header ) < 16 ) {
wfDebug( __METHOD__ . ": too short file header\n" );
} else {
// @todo FIXME: Would be good to replace this extract() call with something that explicitly initializes local variables.
extract( unpack( 'a4magic/a4form/NformLength/a4subtype', $header ) );
- if( $magic != 'AT&T' ) {
+ if ( $magic != 'AT&T' ) {
wfDebug( __METHOD__ . ": not a DjVu file\n" );
- } elseif( $subtype == 'DJVU' ) {
+ } elseif ( $subtype == 'DJVU' ) {
// Single-page document
$info = $this->getPageInfo( $file, $formLength );
- } elseif( $subtype == 'DJVM' ) {
+ } elseif ( $subtype == 'DJVM' ) {
// Multi-page document
$info = $this->getMultiPageInfo( $file, $formLength );
- } else {
+ } else {
wfDebug( __METHOD__ . ": unrecognized DJVU file type '$formType'\n" );
}
}
@@ -150,7 +150,7 @@ class DjVuImage {
private function readChunk( $file ) {
$header = fread( $file, 8 );
- if( strlen( $header ) < 8 ) {
+ if ( strlen( $header ) < 8 ) {
return array( false, 0 );
} else {
// @todo FIXME: Would be good to replace this extract() call with something that explicitly initializes local variables.
@@ -162,7 +162,7 @@ class DjVuImage {
private function skipChunk( $file, $chunkLength ) {
fseek( $file, $chunkLength, SEEK_CUR );
- if( $chunkLength & 0x01 == 1 && !feof( $file ) ) {
+ if ( $chunkLength & 0x01 == 1 && !feof( $file ) ) {
// padding byte
fseek( $file, 1, SEEK_CUR );
}
@@ -174,13 +174,13 @@ class DjVuImage {
$start = ftell( $file );
do {
list( $chunk, $length ) = $this->readChunk( $file );
- if( !$chunk ) {
+ if ( !$chunk ) {
break;
}
- if( $chunk == 'FORM' ) {
+ if ( $chunk == 'FORM' ) {
$subtype = fread( $file, 4 );
- if( $subtype == 'DJVU' ) {
+ if ( $subtype == 'DJVU' ) {
wfDebug( __METHOD__ . ": found first subpage\n" );
return $this->getPageInfo( $file, $length );
}
@@ -189,7 +189,7 @@ class DjVuImage {
wfDebug( __METHOD__ . ": skipping '$chunk' chunk\n" );
$this->skipChunk( $file, $length );
}
- } while( $length != 0 && !feof( $file ) && ftell( $file ) - $start < $formLength );
+ } while ( $length != 0 && !feof( $file ) && ftell( $file ) - $start < $formLength );
wfDebug( __METHOD__ . ": multi-page DJVU file contained no pages\n" );
return false;
@@ -197,17 +197,17 @@ class DjVuImage {
private function getPageInfo( $file, $formLength ) {
list( $chunk, $length ) = $this->readChunk( $file );
- if( $chunk != 'INFO' ) {
+ if ( $chunk != 'INFO' ) {
wfDebug( __METHOD__ . ": expected INFO chunk, got '$chunk'\n" );
return false;
}
- if( $length < 9 ) {
+ if ( $length < 9 ) {
wfDebug( __METHOD__ . ": INFO should be 9 or 10 bytes, found $length\n" );
return false;
}
$data = fread( $file, $length );
- if( strlen( $data ) < $length ) {
+ if ( strlen( $data ) < $length ) {
wfDebug( __METHOD__ . ": INFO chunk cut off\n" );
return false;
}
@@ -263,7 +263,7 @@ class DjVuImage {
$retval = '';
$txt = wfShellExec( $cmd, $retval, array(), array( 'memory' => self::DJVUTXT_MEMORY_LIMIT ) );
wfProfileOut( 'djvutxt' );
- if( $retval == 0) {
+ if ( $retval == 0 ) {
# Strip some control characters
$txt = preg_replace( "/[\013\035\037]/", "", $txt );
$reg = <<<EOR
@@ -280,7 +280,7 @@ 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, 1 );
- $xml = $xml . $txt. '</mw-djvu>';
+ $xml = $xml . $txt . '</mw-djvu>';
}
}
wfProfileOut( __METHOD__ );
diff --git a/includes/media/Exif.php b/includes/media/Exif.php
index 17671808..9a2794a5 100644
--- a/includes/media/Exif.php
+++ b/includes/media/Exif.php
@@ -36,6 +36,7 @@ class Exif {
const SHORT = 3; //!< A 16-bit (2-byte) unsigned integer.
const LONG = 4; //!< A 32-bit (4-byte) unsigned integer.
const RATIONAL = 5; //!< Two LONGs. The first LONG is the numerator and the second LONG expresses the denominator
+ const SHORT_OR_LONG = 6; //!< A 16-bit (2-byte) or 32-bit (4-byte) unsigned integer.
const UNDEFINED = 7; //!< An 8-bit byte that can take any value depending on the field definition
const SLONG = 9; //!< A 32-bit (4-byte) signed integer (2's complement notation),
const SRATIONAL = 10; //!< Two SLONGs. The first SLONG is the numerator and the second SLONG is the denominator.
@@ -113,7 +114,7 @@ class Exif {
*/
function __construct( $file, $byteOrder = '' ) {
/**
- * Page numbers here refer to pages in the EXIF 2.2 standard
+ * Page numbers here refer to pages in the Exif 2.2 standard
*
* Note, Exif::UNDEFINED is treated as a string, not as an array of bytes
* so don't put a count parameter for any UNDEFINED values.
@@ -124,8 +125,8 @@ class Exif {
# TIFF Rev. 6.0 Attribute Information (p22)
'IFD0' => array(
# Tags relating to image structure
- 'ImageWidth' => Exif::SHORT.','.Exif::LONG, # Image width
- 'ImageLength' => Exif::SHORT.','.Exif::LONG, # Image height
+ 'ImageWidth' => Exif::SHORT_OR_LONG, # Image width
+ 'ImageLength' => Exif::SHORT_OR_LONG, # Image height
'BitsPerSample' => array( Exif::SHORT, 3 ), # Number of bits per component
# "When a primary image is JPEG compressed, this designation is not"
# "necessary and is omitted." (p23)
@@ -134,25 +135,25 @@ class Exif {
'Orientation' => Exif::SHORT, # Orientation of image #p24
'SamplesPerPixel' => Exif::SHORT, # Number of components
'PlanarConfiguration' => Exif::SHORT, # Image data arrangement #p24
- 'YCbCrSubSampling' => array( Exif::SHORT, 2), # Subsampling ratio of Y to C #p24
+ 'YCbCrSubSampling' => array( Exif::SHORT, 2 ), # Subsampling ratio of Y to C #p24
'YCbCrPositioning' => Exif::SHORT, # Y and C positioning #p24-25
'XResolution' => Exif::RATIONAL, # Image resolution in width direction
'YResolution' => Exif::RATIONAL, # Image resolution in height direction
'ResolutionUnit' => Exif::SHORT, # Unit of X and Y resolution #(p26)
# Tags relating to recording offset
- 'StripOffsets' => Exif::SHORT.','.Exif::LONG, # Image data location
- 'RowsPerStrip' => Exif::SHORT.','.Exif::LONG, # Number of rows per strip
- 'StripByteCounts' => Exif::SHORT.','.Exif::LONG, # Bytes per compressed strip
- 'JPEGInterchangeFormat' => Exif::SHORT.','.Exif::LONG, # Offset to JPEG SOI
- 'JPEGInterchangeFormatLength' => Exif::SHORT.','.Exif::LONG, # Bytes of JPEG data
+ 'StripOffsets' => Exif::SHORT_OR_LONG, # Image data location
+ 'RowsPerStrip' => Exif::SHORT_OR_LONG, # Number of rows per strip
+ 'StripByteCounts' => Exif::SHORT_OR_LONG, # Bytes per compressed strip
+ 'JPEGInterchangeFormat' => Exif::SHORT_OR_LONG, # Offset to JPEG SOI
+ 'JPEGInterchangeFormatLength' => Exif::SHORT_OR_LONG, # Bytes of JPEG data
# Tags relating to image data characteristics
'TransferFunction' => Exif::IGNORE, # Transfer function
- 'WhitePoint' => array( Exif::RATIONAL, 2), # White point chromaticity
- 'PrimaryChromaticities' => array( Exif::RATIONAL, 6), # Chromaticities of primarities
- 'YCbCrCoefficients' => array( Exif::RATIONAL, 3), # Color space transformation matrix coefficients #p27
- 'ReferenceBlackWhite' => array( Exif::RATIONAL, 6), # Pair of black and white reference values
+ 'WhitePoint' => array( Exif::RATIONAL, 2 ), # White point chromaticity
+ 'PrimaryChromaticities' => array( Exif::RATIONAL, 6 ), # Chromaticities of primarities
+ 'YCbCrCoefficients' => array( Exif::RATIONAL, 3 ), # Color space transformation matrix coefficients #p27
+ 'ReferenceBlackWhite' => array( Exif::RATIONAL, 6 ), # Pair of black and white reference values
# Other tags
'DateTime' => Exif::ASCII, # File change date and time
@@ -167,8 +168,8 @@ class Exif {
# Exif IFD Attribute Information (p30-31)
'EXIF' => array(
# TODO: NOTE: Nonexistence of this field is taken to mean nonconformance
- # to the EXIF 2.1 AND 2.2 standards
- 'ExifVersion' => Exif::UNDEFINED, # Exif version
+ # to the Exif 2.1 AND 2.2 standards
+ 'ExifVersion' => Exif::UNDEFINED, # Exif version
'FlashPixVersion' => Exif::UNDEFINED, # Supported Flashpix version #p32
# Tags relating to Image Data Characteristics
@@ -177,8 +178,8 @@ class Exif {
# Tags relating to image configuration
'ComponentsConfiguration' => Exif::UNDEFINED, # Meaning of each component #p33
'CompressedBitsPerPixel' => Exif::RATIONAL, # Image compression mode
- 'PixelYDimension' => Exif::SHORT.','.Exif::LONG, # Valid image width
- 'PixelXDimension' => Exif::SHORT.','.Exif::LONG, # Valid image height
+ 'PixelYDimension' => Exif::SHORT_OR_LONG, # Valid image width
+ 'PixelXDimension' => Exif::SHORT_OR_LONG, # Valid image height
# Tags relating to related user information
'MakerNote' => Exif::IGNORE, # Manufacturer notes
@@ -218,7 +219,7 @@ class Exif {
'FocalPlaneXResolution' => Exif::RATIONAL, # Focal plane X resolution
'FocalPlaneYResolution' => Exif::RATIONAL, # Focal plane Y resolution
'FocalPlaneResolutionUnit' => Exif::SHORT, # Focal plane resolution unit #p46
- 'SubjectLocation' => array( Exif::SHORT, 2), # Subject location
+ 'SubjectLocation' => array( Exif::SHORT, 2 ), # Subject location
'ExposureIndex' => Exif::RATIONAL, # Exposure index
'SensingMethod' => Exif::SHORT, # Sensing method #p46
'FileSource' => Exif::UNDEFINED, # File source #p47
@@ -250,12 +251,12 @@ class Exif {
'GPSLatitudeRef' => Exif::ASCII, # North or South Latitude #p52-53
'GPSLatitude' => array( Exif::RATIONAL, 3 ), # Latitude
'GPSLongitudeRef' => Exif::ASCII, # East or West Longitude #p53
- 'GPSLongitude' => array( Exif::RATIONAL, 3), # Longitude
+ 'GPSLongitude' => array( Exif::RATIONAL, 3 ), # Longitude
'GPSAltitudeRef' => Exif::UNDEFINED,
# Altitude reference. Note, the exif standard says this should be an EXIF::Byte,
# but php seems to disagree.
'GPSAltitude' => Exif::RATIONAL, # Altitude
- 'GPSTimeStamp' => array( Exif::RATIONAL, 3), # GPS time (atomic clock)
+ 'GPSTimeStamp' => array( Exif::RATIONAL, 3 ), # GPS time (atomic clock)
'GPSSatellites' => Exif::ASCII, # Satellites used for measurement
'GPSStatus' => Exif::ASCII, # Receiver status #p54
'GPSMeasureMode' => Exif::ASCII, # Measurement mode #p54-55
@@ -296,7 +297,7 @@ class Exif {
}
$this->debugFile( $this->basename, __FUNCTION__, true );
- if( function_exists( 'exif_read_data' ) ) {
+ if ( function_exists( 'exif_read_data' ) ) {
wfSuppressWarnings();
$data = exif_read_data( $this->file, 0, true );
wfRestoreWarnings();
@@ -393,7 +394,7 @@ class Exif {
//ComponentsConfiguration should really be an array instead of a string...
//This turns a string of binary numbers into an array of numbers.
- if ( isset ( $this->mFilteredExifData['ComponentsConfiguration'] ) ) {
+ if ( isset( $this->mFilteredExifData['ComponentsConfiguration'] ) ) {
$val = $this->mFilteredExifData['ComponentsConfiguration'];
$ccVals = array();
for ( $i = 0; $i < strlen( $val ); $i++ ) {
@@ -410,7 +411,7 @@ class Exif {
//Also change exif tag name from GPSVersion (what php exif thinks it is)
//to GPSVersionID (what the exif standard thinks it is).
- if ( isset ( $this->mFilteredExifData['GPSVersion'] ) ) {
+ if ( isset( $this->mFilteredExifData['GPSVersion'] ) ) {
$val = $this->mFilteredExifData['GPSVersion'];
$newVal = '';
for ( $i = 0; $i < strlen( $val ); $i++ ) {
@@ -439,7 +440,7 @@ class Exif {
* This has not been tested on any shift-JIS strings.
* @param string $prop prop name.
*/
- private function charCodeString ( $prop ) {
+ private function charCodeString( $prop ) {
if ( isset( $this->mFilteredExifData[$prop] ) ) {
if ( strlen( $this->mFilteredExifData[$prop] ) <= 8 ) {
@@ -500,7 +501,7 @@ class Exif {
* the type of UNDEFINED field
* @param string $prop name of property
*/
- private function exifPropToOrd ( $prop ) {
+ private function exifPropToOrd( $prop ) {
if ( isset( $this->mFilteredExifData[$prop] ) ) {
$this->mFilteredExifData[$prop] = ord( $this->mFilteredExifData[$prop] );
}
@@ -510,7 +511,7 @@ class Exif {
* for example 10 degress 20`40`` S -> -10.34444
* @param string $prop a gps coordinate exif tag name (like GPSLongitude)
*/
- private function exifGPStoNumber ( $prop ) {
+ private function exifGPStoNumber( $prop ) {
$loc =& $this->mFilteredExifData[$prop];
$dir =& $this->mFilteredExifData[$prop . 'Ref'];
$res = false;
@@ -737,26 +738,27 @@ class Exif {
$debug = "tag is '$tag'";
$etype = $this->mExifTags[$section][$tag];
$ecount = 1;
- if( is_array( $etype ) ) {
+ if ( is_array( $etype ) ) {
list( $etype, $ecount ) = $etype;
- if ( $recursive )
+ if ( $recursive ) {
$ecount = 1; // checking individual elements
+ }
}
$count = count( $val );
- if( $ecount != $count ) {
+ if ( $ecount != $count ) {
$this->debug( $val, __FUNCTION__, "Expected $ecount elements for $tag but got $count" );
return false;
}
- if( $count > 1 ) {
- foreach( $val as $v ) {
- if( !$this->validate( $section, $tag, $v, true ) ) {
+ if ( $count > 1 ) {
+ foreach ( $val as $v ) {
+ if ( !$this->validate( $section, $tag, $v, true ) ) {
return false;
}
}
return true;
}
// Does not work if not typecast
- switch( (string)$etype ) {
+ switch ( (string)$etype ) {
case (string)Exif::BYTE:
$this->debug( $val, __FUNCTION__, $debug );
return $this->isByte( $val );
@@ -772,6 +774,9 @@ class Exif {
case (string)Exif::RATIONAL:
$this->debug( $val, __FUNCTION__, $debug );
return $this->isRational( $val );
+ case (string)Exif::SHORT_OR_LONG:
+ $this->debug( $val, __FUNCTION__, $debug );
+ return $this->isShort( $val ) || $this->isLong( $val );
case (string)Exif::UNDEFINED:
$this->debug( $val, __FUNCTION__, $debug );
return $this->isUndefined( $val );
@@ -781,9 +786,6 @@ class Exif {
case (string)Exif::SRATIONAL:
$this->debug( $val, __FUNCTION__, $debug );
return $this->isSrational( $val );
- case (string)Exif::SHORT.','.Exif::LONG:
- $this->debug( $val, __FUNCTION__, $debug );
- return $this->isShort( $val ) || $this->isLong( $val );
case (string)Exif::IGNORE:
$this->debug( $val, __FUNCTION__, $debug );
return false;
@@ -808,7 +810,7 @@ class Exif {
}
$type = gettype( $in );
$class = ucfirst( __CLASS__ );
- if ( $type === 'array' ) {
+ if ( is_array( $in ) ) {
$in = print_r( $in, true );
}
diff --git a/includes/media/ExifBitmap.php b/includes/media/ExifBitmap.php
index 1671ab25..d8d0bede 100644
--- a/includes/media/ExifBitmap.php
+++ b/includes/media/ExifBitmap.php
@@ -51,11 +51,11 @@ class ExifBitmapHandler extends BitmapHandler {
// Treat Software as a special case because in can contain
// an array of (SoftwareName, Version).
- if (isset( $metadata['Software'] )
+ if ( isset( $metadata['Software'] )
&& is_array( $metadata['Software'] )
- && is_array( $metadata['Software'][0])
+ && is_array( $metadata['Software'][0] )
&& isset( $metadata['Software'][0][0] )
- && isset( $metadata['Software'][0][1])
+ && isset( $metadata['Software'][0][1] )
) {
$metadata['Software'] = $metadata['Software'][0][0] . ' (Version '
. $metadata['Software'][0][1] . ')';
@@ -84,7 +84,7 @@ class ExifBitmapHandler extends BitmapHandler {
return self::METADATA_GOOD;
}
if ( $metadata === self::OLD_BROKEN_FILE ) {
- # Old special value indicating that there is no EXIF data in the file.
+ # Old special value indicating that there is no Exif data in the file.
# or that there was an error well extracting the metadata.
wfDebug( __METHOD__ . ": back-compat version\n" );
return self::METADATA_COMPATIBLE;
diff --git a/includes/media/FormatMetadata.php b/includes/media/FormatMetadata.php
index 1a7d7723..1c5136f5 100644
--- a/includes/media/FormatMetadata.php
+++ b/includes/media/FormatMetadata.php
@@ -79,7 +79,7 @@ class FormatMetadata {
}
//This is done differently as the tag is an array.
- if ( $tag == 'GPSTimeStamp' && count( $vals ) === 3) {
+ if ( $tag == 'GPSTimeStamp' && count( $vals ) === 3 ) {
//hour min sec array
$h = explode( '/', $vals[0] );
@@ -127,9 +127,9 @@ class FormatMetadata {
foreach ( $vals as &$val ) {
- switch( $tag ) {
+ switch ( $tag ) {
case 'Compression':
- switch( $val ) {
+ switch ( $val ) {
case 1: case 2: case 3: case 4:
case 5: case 6: case 7: case 8:
case 32773: case 32946: case 34712:
@@ -142,7 +142,7 @@ class FormatMetadata {
break;
case 'PhotometricInterpretation':
- switch( $val ) {
+ switch ( $val ) {
case 2: case 6:
$val = self::msg( $tag, $val );
break;
@@ -153,7 +153,7 @@ class FormatMetadata {
break;
case 'Orientation':
- switch( $val ) {
+ switch ( $val ) {
case 1: case 2: case 3: case 4: case 5: case 6: case 7: case 8:
$val = self::msg( $tag, $val );
break;
@@ -164,7 +164,7 @@ class FormatMetadata {
break;
case 'PlanarConfiguration':
- switch( $val ) {
+ switch ( $val ) {
case 1: case 2:
$val = self::msg( $tag, $val );
break;
@@ -189,7 +189,7 @@ class FormatMetadata {
case 'XResolution':
case 'YResolution':
- switch( $resolutionunit ) {
+ switch ( $resolutionunit ) {
case 2:
$val = self::msg( 'XYResolution', 'i', self::formatNum( $val ) );
break;
@@ -208,7 +208,7 @@ class FormatMetadata {
break;
case 'ColorSpace':
- switch( $val ) {
+ switch ( $val ) {
case 1: case 65535:
$val = self::msg( $tag, $val );
break;
@@ -219,7 +219,7 @@ class FormatMetadata {
break;
case 'ComponentsConfiguration':
- switch( $val ) {
+ switch ( $val ) {
case 0: case 1: case 2: case 3: case 4: case 5: case 6:
$val = self::msg( $tag, $val );
break;
@@ -267,7 +267,7 @@ class FormatMetadata {
break;
case 'ExposureProgram':
- switch( $val ) {
+ switch ( $val ) {
case 0: case 1: case 2: case 3: case 4: case 5: case 6: case 7: case 8:
$val = self::msg( $tag, $val );
break;
@@ -282,7 +282,7 @@ class FormatMetadata {
break;
case 'MeteringMode':
- switch( $val ) {
+ switch ( $val ) {
case 0: case 1: case 2: case 3: case 4: case 5: case 6: case 7: case 255:
$val = self::msg( $tag, $val );
break;
@@ -293,7 +293,7 @@ class FormatMetadata {
break;
case 'LightSource':
- switch( $val ) {
+ switch ( $val ) {
case 0: case 1: case 2: case 3: case 4: case 9: case 10: case 11:
case 12: case 13: case 14: case 15: case 17: case 18: case 19: case 20:
case 21: case 22: case 23: case 24: case 255:
@@ -307,11 +307,11 @@ class FormatMetadata {
case 'Flash':
$flashDecode = array(
- 'fired' => $val & bindec( '00000001' ),
- 'return' => ( $val & bindec( '00000110' ) ) >> 1,
- 'mode' => ( $val & bindec( '00011000' ) ) >> 3,
+ 'fired' => $val & bindec( '00000001' ),
+ 'return' => ( $val & bindec( '00000110' ) ) >> 1,
+ 'mode' => ( $val & bindec( '00011000' ) ) >> 3,
'function' => ( $val & bindec( '00100000' ) ) >> 5,
- 'redeye' => ( $val & bindec( '01000000' ) ) >> 6,
+ 'redeye' => ( $val & bindec( '01000000' ) ) >> 6,
// 'reserved' => ($val & bindec( '10000000' )) >> 7,
);
$flashMsgs = array();
@@ -328,7 +328,7 @@ class FormatMetadata {
break;
case 'FocalPlaneResolutionUnit':
- switch( $val ) {
+ switch ( $val ) {
case 2:
$val = self::msg( $tag, $val );
break;
@@ -339,7 +339,7 @@ class FormatMetadata {
break;
case 'SensingMethod':
- switch( $val ) {
+ switch ( $val ) {
case 1: case 2: case 3: case 4: case 5: case 7: case 8:
$val = self::msg( $tag, $val );
break;
@@ -350,7 +350,7 @@ class FormatMetadata {
break;
case 'FileSource':
- switch( $val ) {
+ switch ( $val ) {
case 3:
$val = self::msg( $tag, $val );
break;
@@ -361,7 +361,7 @@ class FormatMetadata {
break;
case 'SceneType':
- switch( $val ) {
+ switch ( $val ) {
case 1:
$val = self::msg( $tag, $val );
break;
@@ -372,7 +372,7 @@ class FormatMetadata {
break;
case 'CustomRendered':
- switch( $val ) {
+ switch ( $val ) {
case 0: case 1:
$val = self::msg( $tag, $val );
break;
@@ -383,7 +383,7 @@ class FormatMetadata {
break;
case 'ExposureMode':
- switch( $val ) {
+ switch ( $val ) {
case 0: case 1: case 2:
$val = self::msg( $tag, $val );
break;
@@ -394,7 +394,7 @@ class FormatMetadata {
break;
case 'WhiteBalance':
- switch( $val ) {
+ switch ( $val ) {
case 0: case 1:
$val = self::msg( $tag, $val );
break;
@@ -405,7 +405,7 @@ class FormatMetadata {
break;
case 'SceneCaptureType':
- switch( $val ) {
+ switch ( $val ) {
case 0: case 1: case 2: case 3:
$val = self::msg( $tag, $val );
break;
@@ -416,7 +416,7 @@ class FormatMetadata {
break;
case 'GainControl':
- switch( $val ) {
+ switch ( $val ) {
case 0: case 1: case 2: case 3: case 4:
$val = self::msg( $tag, $val );
break;
@@ -427,7 +427,7 @@ class FormatMetadata {
break;
case 'Contrast':
- switch( $val ) {
+ switch ( $val ) {
case 0: case 1: case 2:
$val = self::msg( $tag, $val );
break;
@@ -438,7 +438,7 @@ class FormatMetadata {
break;
case 'Saturation':
- switch( $val ) {
+ switch ( $val ) {
case 0: case 1: case 2:
$val = self::msg( $tag, $val );
break;
@@ -449,7 +449,7 @@ class FormatMetadata {
break;
case 'Sharpness':
- switch( $val ) {
+ switch ( $val ) {
case 0: case 1: case 2:
$val = self::msg( $tag, $val );
break;
@@ -460,7 +460,7 @@ class FormatMetadata {
break;
case 'SubjectDistanceRange':
- switch( $val ) {
+ switch ( $val ) {
case 0: case 1: case 2: case 3:
$val = self::msg( $tag, $val );
break;
@@ -473,7 +473,7 @@ class FormatMetadata {
//The GPS...Ref values are kept for compatibility, probably won't be reached.
case 'GPSLatitudeRef':
case 'GPSDestLatitudeRef':
- switch( $val ) {
+ switch ( $val ) {
case 'N': case 'S':
$val = self::msg( 'GPSLatitude', $val );
break;
@@ -485,7 +485,7 @@ class FormatMetadata {
case 'GPSLongitudeRef':
case 'GPSDestLongitudeRef':
- switch( $val ) {
+ switch ( $val ) {
case 'E': case 'W':
$val = self::msg( 'GPSLongitude', $val );
break;
@@ -504,7 +504,7 @@ class FormatMetadata {
break;
case 'GPSStatus':
- switch( $val ) {
+ switch ( $val ) {
case 'A': case 'V':
$val = self::msg( $tag, $val );
break;
@@ -515,7 +515,7 @@ class FormatMetadata {
break;
case 'GPSMeasureMode':
- switch( $val ) {
+ switch ( $val ) {
case 2: case 3:
$val = self::msg( $tag, $val );
break;
@@ -528,7 +528,7 @@ class FormatMetadata {
case 'GPSTrackRef':
case 'GPSImgDirectionRef':
case 'GPSDestBearingRef':
- switch( $val ) {
+ switch ( $val ) {
case 'T': case 'M':
$val = self::msg( 'GPSDirection', $val );
break;
@@ -548,7 +548,7 @@ class FormatMetadata {
break;
case 'GPSSpeedRef':
- switch( $val ) {
+ switch ( $val ) {
case 'K': case 'M': case 'N':
$val = self::msg( 'GPSSpeed', $val );
break;
@@ -559,7 +559,7 @@ class FormatMetadata {
break;
case 'GPSDestDistanceRef':
- switch( $val ) {
+ switch ( $val ) {
case 'K': case 'M': case 'N':
$val = self::msg( 'GPSDestDistance', $val );
break;
@@ -646,7 +646,7 @@ class FormatMetadata {
break;
case 'iimCategory':
- switch( strtolower( $val ) ) {
+ switch ( strtolower( $val ) ) {
// See pg 29 of IPTC photo
// metadata standard.
case 'ace': case 'clj':
@@ -682,7 +682,7 @@ class FormatMetadata {
$urgency = 'high';
} elseif ( $val == 5 ) {
$urgency = 'normal';
- } elseif ( $val <= 8 && $val > 5) {
+ } elseif ( $val <= 8 && $val > 5 ) {
$urgency = 'low';
}
@@ -791,7 +791,7 @@ class FormatMetadata {
}
break;
case 'Copyrighted':
- switch( $val ) {
+ switch ( $val ) {
case 'True': case 'False':
$val = self::msg( $tag, $val );
break;
@@ -854,7 +854,7 @@ class FormatMetadata {
return $vals[0];
}
elseif ( count( $vals ) === 0 ) {
- wfDebug( __METHOD__ . ' metadata array with 0 elements!' );
+ wfDebug( __METHOD__ . " metadata array with 0 elements!\n" );
return ""; // paranoia. This should never happen
}
/* @todo FIXME: This should hide some of the list entries if there are
@@ -863,7 +863,7 @@ class FormatMetadata {
*/
else {
global $wgContLang;
- switch( $type ) {
+ switch ( $type ) {
case 'lang':
// Display default, followed by ContLang,
// followed by the rest in no particular
@@ -948,7 +948,7 @@ class FormatMetadata {
* this is treated as wikitext not html).
*/
private static function langItem( $value, $lang, $default = false, $noHtml = false ) {
- if ( $lang === false && $default === false) {
+ if ( $lang === false && $default === false ) {
throw new MWException( '$lang and $default cannot both '
. 'be false.' );
}
@@ -1015,8 +1015,9 @@ class FormatMetadata {
static function msg( $tag, $val, $arg = null, $arg2 = null ) {
global $wgContLang;
- if ( $val === '' )
+ if ( $val === '' ) {
$val = 'value';
+ }
return wfMessage( $wgContLang->lc( "exif-$tag-$val" ), $arg, $arg2 )->text();
}
@@ -1031,9 +1032,9 @@ class FormatMetadata {
static function formatNum( $num, $round = false ) {
global $wgLang;
$m = array();
- if( is_array( $num ) ) {
+ if ( is_array( $num ) ) {
$out = array();
- foreach( $num as $number ) {
+ foreach ( $num as $number ) {
$out[] = self::formatNum( $number );
}
return $wgLang->commaList( $out );
@@ -1071,7 +1072,7 @@ class FormatMetadata {
$numerator = intval( $m[1] );
$denominator = intval( $m[2] );
$gcd = self::gcd( abs( $numerator ), $denominator );
- if( $gcd != 0 ) {
+ if ( $gcd != 0 ) {
// 0 shouldn't happen! ;)
return self::formatNum( $numerator / $gcd ) . '/' . self::formatNum( $denominator / $gcd );
}
@@ -1096,7 +1097,7 @@ class FormatMetadata {
else
return gcd( $b, $a % $b );
*/
- while( $b != 0 ) {
+ while ( $b != 0 ) {
$remainder = $a % $b;
// tail recursion...
@@ -1124,7 +1125,7 @@ class FormatMetadata {
return $val;
}
$cat = '';
- switch( substr( $val, 0, 2 ) ) {
+ switch ( substr( $val, 0, 2 ) ) {
case '01':
$cat = 'ace';
break;
@@ -1236,7 +1237,7 @@ class FormatMetadata {
* @return String of html-ish looking wikitext
*/
public static function collapseContactInfo( $vals ) {
- if( !( isset( $vals['CiAdrExtadr'] )
+ if ( !( isset( $vals['CiAdrExtadr'] )
|| isset( $vals['CiAdrCity'] )
|| isset( $vals['CiAdrCtry'] )
|| isset( $vals['CiEmailWork'] )
@@ -1254,7 +1255,7 @@ class FormatMetadata {
// because people often insert >, etc into
// the metadata which should not be interpreted
// but we still want to auto-link urls.
- foreach( $vals as &$val ) {
+ foreach ( $vals as &$val ) {
$val = htmlspecialchars( $val );
}
return self::flattenArray( $vals );
diff --git a/includes/media/GIF.php b/includes/media/GIF.php
index 2e532feb..608fb257 100644
--- a/includes/media/GIF.php
+++ b/includes/media/GIF.php
@@ -33,7 +33,7 @@ class GIFHandler extends BitmapHandler {
function getMetadata( $image, $filename ) {
try {
$parsedGIFMetadata = BitmapMetadataHandler::GIF( $filename );
- } catch( Exception $e ) {
+ } catch ( Exception $e ) {
// Broken file?
wfDebug( __METHOD__ . ': ' . $e->getMessage() . "\n" );
return self::BROKEN_FILE;
@@ -86,7 +86,7 @@ class GIFHandler extends BitmapHandler {
$ser = $image->getMetadata();
if ( $ser ) {
$metadata = unserialize( $ser );
- if( $metadata['frameCount'] > 1 ) {
+ if ( $metadata['frameCount'] > 1 ) {
return true;
}
}
@@ -119,13 +119,13 @@ class GIFHandler extends BitmapHandler {
wfRestoreWarnings();
if ( !$data || !is_array( $data ) ) {
- wfDebug( __METHOD__ . ' invalid GIF metadata' );
+ wfDebug( __METHOD__ . " invalid GIF metadata\n" );
return self::METADATA_BAD;
}
if ( !isset( $data['metadata']['_MW_GIF_VERSION'] )
|| $data['metadata']['_MW_GIF_VERSION'] != GIFMetadataExtractor::VERSION ) {
- wfDebug( __METHOD__ . ' old but compatible GIF metadata' );
+ wfDebug( __METHOD__ . " old but compatible GIF metadata\n" );
return self::METADATA_COMPATIBLE;
}
return self::METADATA_GOOD;
diff --git a/includes/media/GIFMetadataExtractor.php b/includes/media/GIFMetadataExtractor.php
index 6a4e753d..887afa3f 100644
--- a/includes/media/GIFMetadataExtractor.php
+++ b/includes/media/GIFMetadataExtractor.php
@@ -90,7 +90,7 @@ class GIFMetadataExtractor {
// Skip over the GCT
self::readGCT( $fh, $bpp );
- while( !feof( $fh ) ) {
+ while ( !feof( $fh ) ) {
$buf = fread( $fh, 1 );
if ( $buf == self::$gif_frame_sep ) {
@@ -110,7 +110,9 @@ class GIFMetadataExtractor {
self::skipBlock( $fh );
} elseif ( $buf == self::$gif_extension_sep ) {
$buf = fread( $fh, 1 );
- if ( strlen( $buf ) < 1 ) throw new Exception( "Ran out of input" );
+ if ( strlen( $buf ) < 1 ) {
+ throw new Exception( "Ran out of input" );
+ }
$extension_code = unpack( 'C', $buf );
$extension_code = $extension_code[1];
@@ -121,7 +123,9 @@ class GIFMetadataExtractor {
fread( $fh, 1 ); // Transparency, disposal method, user input
$buf = fread( $fh, 2 ); // Delay, in hundredths of seconds.
- if ( strlen( $buf ) < 2 ) throw new Exception( "Ran out of input" );
+ if ( strlen( $buf ) < 2 ) {
+ throw new Exception( "Ran out of input" );
+ }
$delay = unpack( 'v', $buf );
$delay = $delay[1];
$duration += $delay * 0.01;
@@ -129,7 +133,9 @@ class GIFMetadataExtractor {
fread( $fh, 1 ); // Transparent colour index
$term = fread( $fh, 1 ); // Should be a terminator
- if ( strlen( $term ) < 1 ) throw new Exception( "Ran out of input" );
+ if ( strlen( $term ) < 1 ) {
+ throw new Exception( "Ran out of input" );
+ }
$term = unpack( 'C', $term );
$term = $term[1];
if ( $term != 0 ) {
@@ -157,7 +163,7 @@ class GIFMetadataExtractor {
$commentCount = count( $comment );
if ( $commentCount === 0
- || $comment[$commentCount-1] !== $data )
+ || $comment[$commentCount - 1] !== $data )
{
// Some applications repeat the same comment on each
// frame of an animated GIF image, so if this comment
@@ -168,14 +174,16 @@ class GIFMetadataExtractor {
// Application extension (Netscape info about the animated gif)
// or XMP (or theoretically any other type of extension block)
$blockLength = fread( $fh, 1 );
- if ( strlen( $blockLength ) < 1 ) throw new Exception( "Ran out of input" );
+ if ( strlen( $blockLength ) < 1 ) {
+ throw new Exception( "Ran out of input" );
+ }
$blockLength = unpack( 'C', $blockLength );
$blockLength = $blockLength[1];
$data = fread( $fh, $blockLength );
if ( $blockLength != 11 ) {
- wfDebug( __METHOD__ . ' GIF application block with wrong length' );
- fseek( $fh, -($blockLength + 1), SEEK_CUR );
+ wfDebug( __METHOD__ . " GIF application block with wrong length\n" );
+ fseek( $fh, -( $blockLength + 1 ), SEEK_CUR );
self::skipBlock( $fh );
continue;
}
@@ -190,7 +198,9 @@ class GIFMetadataExtractor {
// Unsigned little-endian integer, loop count or zero for "forever"
$loopData = fread( $fh, 2 );
- if ( strlen( $loopData ) < 2 ) throw new Exception( "Ran out of input" );
+ if ( strlen( $loopData ) < 2 ) {
+ throw new Exception( "Ran out of input" );
+ }
$loopData = unpack( 'v', $loopData );
$loopCount = $loopData[1];
@@ -218,7 +228,7 @@ class GIFMetadataExtractor {
} else {
// unrecognized extension block
- fseek( $fh, -($blockLength + 1), SEEK_CUR );
+ fseek( $fh, -( $blockLength + 1 ), SEEK_CUR );
self::skipBlock( $fh );
continue;
}
@@ -228,7 +238,9 @@ class GIFMetadataExtractor {
} elseif ( $buf == self::$gif_term ) {
break;
} else {
- if ( strlen( $buf ) < 1 ) throw new Exception( "Ran out of input" );
+ if ( strlen( $buf ) < 1 ) {
+ throw new Exception( "Ran out of input" );
+ }
$byte = unpack( 'C', $buf );
$byte = $byte[1];
throw new Exception( "At position: " . ftell( $fh ) . ", Unknown byte " . $byte );
@@ -251,7 +263,7 @@ class GIFMetadataExtractor {
*/
static function readGCT( $fh, $bpp ) {
if ( $bpp > 0 ) {
- for( $i = 1; $i <= pow( 2, $bpp ); ++$i ) {
+ for ( $i = 1; $i <= pow( 2, $bpp ); ++$i ) {
fread( $fh, 3 );
}
}
@@ -263,7 +275,9 @@ class GIFMetadataExtractor {
* @return int
*/
static function decodeBPP( $data ) {
- if ( strlen( $data ) < 1 ) throw new Exception( "Ran out of input" );
+ if ( strlen( $data ) < 1 ) {
+ throw new Exception( "Ran out of input" );
+ }
$buf = unpack( 'C', $data );
$buf = $buf[1];
$bpp = ( $buf & 7 ) + 1;
@@ -281,7 +295,9 @@ class GIFMetadataExtractor {
static function skipBlock( $fh ) {
while ( !feof( $fh ) ) {
$buf = fread( $fh, 1 );
- if ( strlen( $buf ) < 1 ) throw new Exception( "Ran out of input" );
+ if ( strlen( $buf ) < 1 ) {
+ throw new Exception( "Ran out of input" );
+ }
$block_len = unpack( 'C', $buf );
$block_len = $block_len[1];
if ( $block_len == 0 ) {
@@ -310,7 +326,7 @@ class GIFMetadataExtractor {
$subLength = fread( $fh, 1 );
$blocks = 0;
- while( $subLength !== "\0" ) {
+ while ( $subLength !== "\0" ) {
$blocks++;
if ( $blocks > self::MAX_SUBBLOCKS ) {
throw new Exception( "MAX_SUBBLOCKS exceeded (over $blocks sub-blocks)" );
diff --git a/includes/media/IPTC.php b/includes/media/IPTC.php
index 4191cde0..544dd211 100644
--- a/includes/media/IPTC.php
+++ b/includes/media/IPTC.php
@@ -63,7 +63,7 @@ class IPTC {
wfDebugLog( 'iptc', "IPTC tag $tag had only whitespace as its value." );
continue;
}
- switch( $tag ) {
+ switch ( $tag ) {
case '2#120': /*IPTC caption. mapped with exif ImageDescription*/
$data['ImageDescription'] = self::convIPTC( $val, $c );
break;
@@ -396,7 +396,7 @@ class IPTC {
return null;
}
- $tz = ( intval( substr( $time, 7, 2 ) ) *60*60 )
+ $tz = ( intval( substr( $time, 7, 2 ) ) * 60 * 60 )
+ ( intval( substr( $time, 9, 2 ) ) * 60 );
if ( substr( $time, 6, 1 ) === '-' ) {
@@ -423,7 +423,7 @@ class IPTC {
*
* @return string|array
*/
- private static function convIPTC ( $data, $charset ) {
+ private static function convIPTC( $data, $charset ) {
if ( is_array( $data ) ) {
foreach ( $data as &$val ) {
$val = self::convIPTCHelper( $val, $charset );
@@ -441,7 +441,7 @@ class IPTC {
*
* @return string
*/
- private static function convIPTCHelper ( $data, $charset ) {
+ private static function convIPTCHelper( $data, $charset ) {
if ( $charset ) {
wfSuppressWarnings();
$data = iconv( $charset, "UTF-8//IGNORE", $data );
diff --git a/includes/media/ImageHandler.php b/includes/media/ImageHandler.php
index 419afeef..e079003b 100644
--- a/includes/media/ImageHandler.php
+++ b/includes/media/ImageHandler.php
@@ -58,7 +58,7 @@ abstract class ImageHandler extends MediaHandler {
} elseif ( isset( $params['width'] ) ) {
$width = $params['width'];
} else {
- throw new MWException( 'No width specified to '.__METHOD__ );
+ throw new MWException( 'No width specified to ' . __METHOD__ );
}
# Removed for ProofreadPage
#$width = intval( $width );
@@ -92,7 +92,7 @@ abstract class ImageHandler extends MediaHandler {
if ( !isset( $params['page'] ) ) {
$params['page'] = 1;
- } else {
+ } else {
if ( $params['page'] > $image->pageCount() ) {
$params['page'] = $image->pageCount();
}
@@ -160,7 +160,7 @@ abstract class ImageHandler extends MediaHandler {
$width = intval( $width );
# Sanity check $width
- if( $width <= 0) {
+ if ( $width <= 0 ) {
wfDebug( __METHOD__ . ": Invalid destination width: $width\n" );
return false;
}
@@ -187,9 +187,9 @@ abstract class ImageHandler extends MediaHandler {
if ( !$this->normaliseParams( $image, $params ) ) {
return false;
}
- $url = $script . '&' . wfArrayToCgi( $this->getScriptParams( $params ) );
+ $url = wfAppendQuery( $script, $this->getScriptParams( $params ) );
- if( $image->mustRender() || $params['width'] < $image->getWidth() ) {
+ if ( $image->mustRender() || $params['width'] < $image->getWidth() ) {
return new ThumbnailImage( $image, $url, false, $params );
}
}
@@ -200,6 +200,19 @@ abstract class ImageHandler extends MediaHandler {
wfRestoreWarnings();
return $gis;
}
+ /**
+ * Function that returns the number of pixels to be thumbnailed.
+ * Intended for animated GIFs to multiply by the number of frames.
+ *
+ * If the file doesn't support a notion of "area" return 0.
+ *
+ * @param File $image
+ * @return int
+ */
+ function getImageArea( $image ) {
+ return $image->getWidth() * $image->getHeight();
+ }
+
/**
* @param $file File
diff --git a/includes/media/Jpeg.php b/includes/media/Jpeg.php
index 8b5d6513..fa763668 100644
--- a/includes/media/Jpeg.php
+++ b/includes/media/Jpeg.php
@@ -32,7 +32,7 @@
*/
class JpegHandler extends ExifBitmapHandler {
- function getMetadata ( $image, $filename ) {
+ function getMetadata( $image, $filename ) {
try {
$meta = BitmapMetadataHandler::Jpeg( $filename );
if ( !is_array( $meta ) ) {
@@ -69,18 +69,18 @@ class JpegHandler extends ExifBitmapHandler {
public function rotate( $file, $params ) {
global $wgJpegTran;
- $rotation = ( $params[ 'rotation' ] + $this->getRotation( $file ) ) % 360;
+ $rotation = ( $params['rotation'] + $this->getRotation( $file ) ) % 360;
- if( $wgJpegTran && is_file( $wgJpegTran ) ){
+ if ( $wgJpegTran && is_file( $wgJpegTran ) ) {
$cmd = wfEscapeShellArg( $wgJpegTran ) .
" -rotate " . wfEscapeShellArg( $rotation ) .
- " -outfile " . wfEscapeShellArg( $params[ 'dstPath' ] ) .
- " " . wfEscapeShellArg( $params[ 'srcPath' ] ) . " 2>&1";
- wfDebug( __METHOD__ . ": running jpgtran: $cmd\n" );
- wfProfileIn( 'jpegtran' );
- $retval = 0;
- $err = wfShellExec( $cmd, $retval, $env );
- wfProfileOut( 'jpegtran' );
+ " -outfile " . wfEscapeShellArg( $params['dstPath'] ) .
+ " " . wfEscapeShellArg( $params['srcPath'] );
+ wfDebug( __METHOD__ . ": running jpgtran: $cmd\n" );
+ wfProfileIn( 'jpegtran' );
+ $retval = 0;
+ $err = wfShellExecWithStderr( $cmd, $retval, $env );
+ wfProfileOut( 'jpegtran' );
if ( $retval !== 0 ) {
$this->logErrorForExternalProcess( $retval, $err, $cmd );
return new MediaTransformError( 'thumbnail_error', 0, 0, $err );
diff --git a/includes/media/JpegMetadataExtractor.php b/includes/media/JpegMetadataExtractor.php
index 6ff07ed2..c7030eba 100644
--- a/includes/media/JpegMetadataExtractor.php
+++ b/includes/media/JpegMetadataExtractor.php
@@ -47,7 +47,7 @@ class JpegMetadataExtractor {
* @return Array of interesting segments.
* @throws MWException if given invalid file.
*/
- static function segmentSplitter ( $filename ) {
+ static function segmentSplitter( $filename ) {
$showXMP = function_exists( 'xml_parser_create_ns' );
$segmentCount = 0;
@@ -87,7 +87,7 @@ class JpegMetadataExtractor {
}
$buffer = fread( $fh, 1 );
- while( $buffer === "\xFF" && !feof( $fh ) ) {
+ while ( $buffer === "\xFF" && !feof( $fh ) ) {
// Skip through any 0xFF padding bytes.
$buffer = fread( $fh, 1 );
}
@@ -111,7 +111,7 @@ class JpegMetadataExtractor {
if ( $com === $oldCom ) {
$segments["COM"][] = $oldCom;
} else {
- wfDebug( __METHOD__ . ' Ignoring JPEG comment as is garbage.' );
+ wfDebug( __METHOD__ . " Ignoring JPEG comment as is garbage.\n" );
}
} elseif ( $buffer === "\xE1" ) {
@@ -140,7 +140,7 @@ class JpegMetadataExtractor {
} elseif ( $byteOrderMarker === 'II' ) {
$segments['byteOrder'] = 'LE';
} else {
- wfDebug( __METHOD__ . ' Invalid byte ordering?!' );
+ wfDebug( __METHOD__ . " Invalid byte ordering?!\n" );
}
}
} elseif ( $buffer === "\xED" ) {
@@ -155,7 +155,9 @@ class JpegMetadataExtractor {
} else {
// segment we don't care about, so skip
$size = wfUnpack( "nint", fread( $fh, 2 ), 2 );
- if ( $size['int'] <= 2 ) throw new MWException( "invalid marker size in jpeg" );
+ if ( $size['int'] <= 2 ) {
+ throw new MWException( "invalid marker size in jpeg" );
+ }
fseek( $fh, $size['int'] - 2, SEEK_CUR );
}
@@ -195,7 +197,7 @@ class JpegMetadataExtractor {
* @throws MWException (It gets caught next level up though)
* @return String if the iptc hash is good or not.
*/
- public static function doPSIR ( $app13 ) {
+ public static function doPSIR( $app13 ) {
if ( !$app13 ) {
throw new MWException( "No App13 segment given" );
}
@@ -243,7 +245,9 @@ class JpegMetadataExtractor {
// PHP can take issue with very large unsigned ints and make them negative.
// Which should never ever happen, as this has to be inside a segment
// which is limited to a 16 bit number.
- if ( $lenData['len'] < 0 ) throw new MWException( "Too big PSIR (" . $lenData['len'] . ')' );
+ if ( $lenData['len'] < 0 ) {
+ throw new MWException( "Too big PSIR (" . $lenData['len'] . ')' );
+ }
$offset += 4; // 4bytes length field;
@@ -267,7 +271,9 @@ class JpegMetadataExtractor {
// if odd, add 1 to length to account for
// null pad byte.
- if ( $lenData['len'] % 2 == 1 ) $lenData['len']++;
+ if ( $lenData['len'] % 2 == 1 ) {
+ $lenData['len']++;
+ }
$offset += $lenData['len'];
}
diff --git a/includes/media/MediaHandler.php b/includes/media/MediaHandler.php
index 9a3f645b..779e23c9 100644
--- a/includes/media/MediaHandler.php
+++ b/includes/media/MediaHandler.php
@@ -78,14 +78,16 @@ abstract class MediaHandler {
/**
* Merge a parameter array into a string appropriate for inclusion in filenames
*
- * @param $params array
+ * @param $params array Array of parameters that have been through normaliseParams.
+ * @return String
*/
abstract function makeParamString( $params );
/**
* Parse a param string made with makeParamString back into an array
*
- * @param $str string
+ * @param $str string The parameter string without file name (e.g. 122px)
+ * @return Array|Boolean Array of parameters or false on failure.
*/
abstract function parseParamString( $str );
@@ -116,7 +118,9 @@ abstract class MediaHandler {
* @param string $path the filename
* @return String
*/
- function getMetadata( $image, $path ) { return ''; }
+ function getMetadata( $image, $path ) {
+ return '';
+ }
/**
* Get metadata version.
@@ -133,10 +137,10 @@ abstract class MediaHandler {
*
* @return string version string
*/
- static function getMetadataVersion () {
+ static function getMetadataVersion() {
$version = Array( '2' ); // core metadata version
wfRunHooks( 'GetMetadataVersion', Array( &$version ) );
- return implode( ';', $version);
+ return implode( ';', $version );
}
/**
@@ -166,7 +170,9 @@ abstract class MediaHandler {
*
* @return string
*/
- function getMetadataType( $image ) { return false; }
+ function getMetadataType( $image ) {
+ return false;
+ }
/**
* Check if the metadata string is valid for this handler.
@@ -216,6 +222,7 @@ abstract class MediaHandler {
* @param string $dstPath filesystem destination path
* @param string $dstUrl destination URL to use in output HTML
* @param array $params arbitrary set of parameters validated by $this->validateParam()
+ * Note: These parameters have *not* gone through $this->normaliseParams()
* @param $flags Integer: a bitfield, may contain self::TRANSFORM_LATER
*
* @return MediaTransformOutput
@@ -224,6 +231,10 @@ abstract class MediaHandler {
/**
* Get the thumbnail extension and MIME type for a given source MIME type
+ *
+ * @param String $ext Extension of original file
+ * @param String $mime Mime type of original file
+ * @param Array $params Handler specific rendering parameters
* @return array thumbnail extension and MIME type
*/
function getThumbType( $ext, $mime, $params = null ) {
@@ -255,63 +266,96 @@ abstract class MediaHandler {
* True if the handled types can be transformed
* @return bool
*/
- function canRender( $file ) { return true; }
+ function canRender( $file ) {
+ return true;
+ }
+
/**
* True if handled types cannot be displayed directly in a browser
* but can be rendered
* @return bool
*/
- function mustRender( $file ) { return false; }
+ function mustRender( $file ) {
+ return false;
+ }
+
/**
* True if the type has multi-page capabilities
* @return bool
*/
- function isMultiPage( $file ) { return false; }
+ function isMultiPage( $file ) {
+ return false;
+ }
+
/**
* Page count for a multi-page document, false if unsupported or unknown
* @return bool
*/
- function pageCount( $file ) { return false; }
+ function pageCount( $file ) {
+ return false;
+ }
+
/**
* The material is vectorized and thus scaling is lossless
* @return bool
*/
- function isVectorized( $file ) { return false; }
+ function isVectorized( $file ) {
+ return false;
+ }
+
/**
* The material is an image, and is animated.
* In particular, video material need not return true.
* @note Before 1.20, this was a method of ImageHandler only
* @return bool
*/
- function isAnimatedImage( $file ) { return false; }
+ function isAnimatedImage( $file ) {
+ return false;
+ }
+
/**
* If the material is animated, we can animate the thumbnail
* @since 1.20
* @return bool If material is not animated, handler may return any value.
*/
- function canAnimateThumbnail( $file ) { return true; }
+ function canAnimateThumbnail( $file ) {
+ return true;
+ }
+
/**
* False if the handler is disabled for all files
* @return bool
*/
- function isEnabled() { return true; }
+ function isEnabled() {
+ return true;
+ }
/**
* Get an associative array of page dimensions
* Currently "width" and "height" are understood, but this might be
* expanded in the future.
- * Returns false if unknown or if the document is not multi-page.
+ * Returns false if unknown.
+ *
+ * It is expected that handlers for paged media (e.g. DjVuHandler)
+ * will override this method so that it gives the correct results
+ * for each specific page of the file, using the $page argument.
+ *
+ * @note For non-paged media, use getImageSize.
*
* @param $image File
- * @param $page Unused, left for backcompatibility?
- * @return array
+ * @param $page What page to get dimensions of
+ * @return array|bool
*/
function getPageDimensions( $image, $page ) {
$gis = $this->getImageSize( $image, $image->getLocalRefPath() );
- return array(
- 'width' => $gis[0],
- 'height' => $gis[1]
- );
+ if ( $gis ) {
+ return array(
+ 'width' => $gis[0],
+ 'height' => $gis[1]
+ );
+ } else {
+ return false;
+ }
}
/**
@@ -394,9 +438,9 @@ abstract class MediaHandler {
function visibleMetadataFields() {
$fields = array();
$lines = explode( "\n", wfMessage( 'metadata-fields' )->inContentLanguage()->text() );
- 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];
}
}
@@ -448,6 +492,8 @@ abstract class MediaHandler {
}
/**
+ * Used instead of getLongDesc if there is no handler registered for file.
+ *
* @param $file File
* @return string
*/
@@ -457,6 +503,8 @@ abstract class MediaHandler {
}
/**
+ * Short description. Shown on Special:Search results.
+ *
* @param $file File
* @return string
*/
@@ -467,6 +515,8 @@ abstract class MediaHandler {
}
/**
+ * Long description. Shown under image on image description page surounded by ().
+ *
* @param $file File
* @return string
*/
@@ -476,6 +526,8 @@ abstract class MediaHandler {
}
/**
+ * Used instead of getShortDesc if there is no handler registered for file.
+ *
* @param $file File
* @return string
*/
@@ -496,19 +548,32 @@ abstract class MediaHandler {
public static function fitBoxWidth( $boxWidth, $boxHeight, $maxHeight ) {
$idealWidth = $boxWidth * $maxHeight / $boxHeight;
$roundedUp = ceil( $idealWidth );
- if( round( $roundedUp * $boxHeight / $boxWidth ) > $maxHeight ) {
+ if ( round( $roundedUp * $boxHeight / $boxWidth ) > $maxHeight ) {
return floor( $idealWidth );
} else {
return $roundedUp;
}
}
+ /**
+ * Shown in file history box on image description page.
+ *
+ * @param File $file
+ * @return String Dimensions
+ */
function getDimensionsString( $file ) {
return '';
}
/**
- * Modify the parser object post-transform
+ * Modify the parser object post-transform.
+ *
+ * This is often used to do $parser->addOutputHook(),
+ * in order to add some javascript to render a viewer.
+ * See TimedMediaHandler or OggHandler for an example.
+ *
+ * @param Parser $parser
+ * @param File $file
*/
function parserTransformHook( $parser, $file ) {}
@@ -535,9 +600,9 @@ abstract class MediaHandler {
* @return bool True if removed, false otherwise
*/
function removeBadFile( $dstPath, $retval = 0 ) {
- if( file_exists( $dstPath ) ) {
+ if ( file_exists( $dstPath ) ) {
$thumbstat = stat( $dstPath );
- if( $thumbstat['size'] == 0 || $retval != 0 ) {
+ if ( $thumbstat['size'] == 0 || $retval != 0 ) {
$result = unlink( $dstPath );
if ( $result ) {
@@ -556,10 +621,17 @@ abstract class MediaHandler {
}
/**
- * Remove files from the purge list
+ * Remove files from the purge list.
+ *
+ * This is used by some video handlers to prevent ?action=purge
+ * from removing a transcoded video, which is expensive to
+ * regenerate.
+ *
+ * @see LocalFile::purgeThumbnails
*
* @param array $files
- * @param array $options
+ * @param array $options Purge options. Currently will always be
+ * an array with a single key 'forThumbRefresh' set to true.
*/
public function filterThumbnailPurgeList( &$files, $options ) {
// Do nothing
@@ -573,4 +645,23 @@ abstract class MediaHandler {
public static function canRotate() {
return false;
}
+
+ /**
+ * On supporting image formats, try to read out the low-level orientation
+ * of the file and return the angle that the file needs to be rotated to
+ * be viewed.
+ *
+ * This information is only useful when manipulating the original file;
+ * the width and height we normally work with is logical, and will match
+ * any produced output views.
+ *
+ * For files we don't know, we return 0.
+ *
+ * @param $file File
+ * @return int 0, 90, 180 or 270
+ */
+ public function getRotation( $file ) {
+ return 0;
+ }
+
}
diff --git a/includes/media/MediaTransformOutput.php b/includes/media/MediaTransformOutput.php
index 1f95bc3b..c49d3f20 100644
--- a/includes/media/MediaTransformOutput.php
+++ b/includes/media/MediaTransformOutput.php
@@ -32,7 +32,7 @@ abstract class MediaTransformOutput {
*/
var $file;
- var $width, $height, $url, $page, $path;
+ var $width, $height, $url, $page, $path, $lang;
/**
* @var array Associative array mapping optional supplementary image files
@@ -151,7 +151,12 @@ abstract class MediaTransformOutput {
if ( $this->isError() ) {
return false;
} elseif ( $this->path === null ) {
- return $this->file->getLocalRefPath();
+ return $this->file->getLocalRefPath(); // assume thumb was not scaled
+ } elseif ( FileBackend::isStoragePath( $this->path ) ) {
+ $be = $this->file->getRepo()->getBackend();
+ // The temp file will be process cached by FileBackend
+ $fsFile = $be->getLocalReference( array( 'src' => $this->path ) );
+ return $fsFile ? $fsFile->getPath() : false;
} else {
return $this->path; // may return false
}
@@ -192,17 +197,26 @@ abstract class MediaTransformOutput {
/**
* @param $title string
- * @param $params array
+ * @param $params string|array Query parameters to add
* @return array
*/
- public function getDescLinkAttribs( $title = null, $params = '' ) {
- $query = '';
+ public function getDescLinkAttribs( $title = null, $params = array() ) {
+ if ( is_array( $params ) ) {
+ $query = $params;
+ } else {
+ $query = array();
+ }
if ( $this->page && $this->page !== 1 ) {
- $query = 'page=' . urlencode( $this->page );
+ $query['page'] = $this->page;
}
- if( $params ) {
- $query .= $query ? '&' . $params : $params;
+ if ( $this->lang ) {
+ $query['lang'] = $this->lang;
}
+
+ if ( is_string( $params ) && $params !== '' ) {
+ $query = $params . '&' . wfArrayToCgi( $query );
+ }
+
$attribs = array(
'href' => $this->file->getTitle()->getLocalURL( $query ),
'class' => 'image',
@@ -237,10 +251,12 @@ class ThumbnailImage extends MediaTransformOutput {
# Previous parameters:
# $file, $url, $width, $height, $path = false, $page = false
- if( is_array( $parameters ) ) {
- $defaults = array(
- 'page' => false
- );
+ $defaults = array(
+ 'page' => false,
+ 'lang' => false
+ );
+
+ if ( is_array( $parameters ) ) {
$actualParams = $parameters + $defaults;
} else {
# Using old format, should convert. Later a warning could be added here.
@@ -249,7 +265,7 @@ class ThumbnailImage extends MediaTransformOutput {
'width' => $path,
'height' => $parameters,
'page' => ( $numArgs > 5 ) ? func_get_arg( 5 ) : false
- );
+ ) + $defaults;
$path = ( $numArgs > 4 ) ? func_get_arg( 4 ) : false;
}
@@ -264,6 +280,7 @@ class ThumbnailImage extends MediaTransformOutput {
$this->height = round( $actualParams['height'] );
$this->page = $actualParams['page'];
+ $this->lang = $actualParams['lang'];
}
/**
@@ -281,6 +298,8 @@ class ThumbnailImage extends MediaTransformOutput {
* 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
* desc-query String, description link query params
+ * override-width Override width attribute. Should generally not set
+ * override-height Override height attribute. Should generally not set
* 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
@@ -296,7 +315,7 @@ class ThumbnailImage extends MediaTransformOutput {
*/
function toHtml( $options = array() ) {
if ( count( func_get_args() ) == 2 ) {
- throw new MWException( __METHOD__ .' called in the old style' );
+ throw new MWException( __METHOD__ . ' called in the old style' );
}
$alt = empty( $options['alt'] ) ? '' : $options['alt'];
@@ -342,6 +361,12 @@ class ThumbnailImage extends MediaTransformOutput {
if ( !empty( $options['img-class'] ) ) {
$attribs['class'] = $options['img-class'];
}
+ if ( isset( $options['override-height'] ) ) {
+ $attribs['height'] = $options['override-height'];
+ }
+ if ( isset( $options['override-width'] ) ) {
+ $attribs['width'] = $options['override-width'];
+ }
// Additional densities for responsive images, if specified.
if ( !empty( $this->responsiveUrls ) ) {
diff --git a/includes/media/PNG.php b/includes/media/PNG.php
index b8a5b40b..98f13861 100644
--- a/includes/media/PNG.php
+++ b/includes/media/PNG.php
@@ -38,7 +38,7 @@ class PNGHandler extends BitmapHandler {
function getMetadata( $image, $filename ) {
try {
$metadata = BitmapMetadataHandler::PNG( $filename );
- } catch( Exception $e ) {
+ } catch ( Exception $e ) {
// Broken file?
wfDebug( __METHOD__ . ': ' . $e->getMessage() . "\n" );
return self::BROKEN_FILE;
@@ -76,7 +76,9 @@ class PNGHandler extends BitmapHandler {
$ser = $image->getMetadata();
if ( $ser ) {
$metadata = unserialize( $ser );
- if( $metadata['frameCount'] > 1 ) return true;
+ if ( $metadata['frameCount'] > 1 ) {
+ return true;
+ }
}
return false;
}
@@ -105,13 +107,13 @@ class PNGHandler extends BitmapHandler {
wfRestoreWarnings();
if ( !$data || !is_array( $data ) ) {
- wfDebug( __METHOD__ . ' invalid png metadata' );
+ wfDebug( __METHOD__ . " invalid png metadata\n" );
return self::METADATA_BAD;
}
if ( !isset( $data['metadata']['_MW_PNG_VERSION'] )
|| $data['metadata']['_MW_PNG_VERSION'] != PNGMetadataExtractor::VERSION ) {
- wfDebug( __METHOD__ . ' old but compatible png metadata' );
+ wfDebug( __METHOD__ . " old but compatible png metadata\n" );
return self::METADATA_COMPATIBLE;
}
return self::METADATA_GOOD;
@@ -129,8 +131,9 @@ class PNGHandler extends BitmapHandler {
$metadata = unserialize( $image->getMetadata() );
wfRestoreWarnings();
- if( !$metadata || $metadata['frameCount'] <= 0 )
+ if ( !$metadata || $metadata['frameCount'] <= 0 ) {
return $original;
+ }
$info = array();
$info[] = $original;
diff --git a/includes/media/PNGMetadataExtractor.php b/includes/media/PNGMetadataExtractor.php
index 87f705ca..845d212a 100644
--- a/includes/media/PNGMetadataExtractor.php
+++ b/includes/media/PNGMetadataExtractor.php
@@ -142,7 +142,7 @@ class PNGMetadataExtractor {
}
} elseif ( $chunk_type == "acTL" ) {
$buf = fread( $fh, $chunk_size );
- if( !$buf || strlen( $buf ) < $chunk_size || $chunk_size < 4 ) {
+ if ( !$buf || strlen( $buf ) < $chunk_size || $chunk_size < 4 ) {
throw new Exception( __METHOD__ . ": Read error" );
}
@@ -202,21 +202,21 @@ class PNGMetadataExtractor {
if ( $items[5] === false ) {
// decompression failed
- wfDebug( __METHOD__ . ' Error decompressing iTxt chunk - ' . $items[1] );
+ wfDebug( __METHOD__ . ' Error decompressing iTxt chunk - ' . $items[1] . "\n" );
fseek( $fh, self::$CRC_size, SEEK_CUR );
continue;
}
} else {
wfDebug( __METHOD__ . ' Skipping compressed png iTXt chunk due to lack of zlib,'
- . ' or potentially invalid compression method' );
+ . " or potentially invalid compression method\n" );
fseek( $fh, self::$CRC_size, SEEK_CUR );
continue;
}
}
- $finalKeyword = self::$text_chunks[ $items[1] ];
- $text[ $finalKeyword ][ $items[3] ] = $items[5];
- $text[ $finalKeyword ]['_type'] = 'lang';
+ $finalKeyword = self::$text_chunks[$items[1]];
+ $text[$finalKeyword][$items[3]] = $items[5];
+ $text[$finalKeyword]['_type'] = 'lang';
} else {
// Error reading iTXt chunk
@@ -251,9 +251,9 @@ class PNGMetadataExtractor {
throw new Exception( __METHOD__ . ": Read error (error with iconv)" );
}
- $finalKeyword = self::$text_chunks[ $keyword ];
- $text[ $finalKeyword ][ 'x-default' ] = $content;
- $text[ $finalKeyword ]['_type'] = 'lang';
+ $finalKeyword = self::$text_chunks[$keyword];
+ $text[$finalKeyword]['x-default'] = $content;
+ $text[$finalKeyword]['_type'] = 'lang';
} elseif ( $chunk_type == 'zTXt' ) {
if ( function_exists( 'gzuncompress' ) ) {
@@ -279,7 +279,7 @@ class PNGMetadataExtractor {
$compression = substr( $postKeyword, 0, 1 );
$content = substr( $postKeyword, 1 );
if ( $compression !== "\x00" ) {
- wfDebug( __METHOD__ . " Unrecognized compression method in zTXt ($keyword). Skipping." );
+ wfDebug( __METHOD__ . " Unrecognized compression method in zTXt ($keyword). Skipping.\n" );
fseek( $fh, self::$CRC_size, SEEK_CUR );
continue;
}
@@ -290,7 +290,7 @@ class PNGMetadataExtractor {
if ( $content === false ) {
// decompression failed
- wfDebug( __METHOD__ . ' Error decompressing zTXt chunk - ' . $keyword );
+ wfDebug( __METHOD__ . ' Error decompressing zTXt chunk - ' . $keyword . "\n" );
fseek( $fh, self::$CRC_size, SEEK_CUR );
continue;
}
@@ -303,12 +303,12 @@ class PNGMetadataExtractor {
throw new Exception( __METHOD__ . ": Read error (error with iconv)" );
}
- $finalKeyword = self::$text_chunks[ $keyword ];
- $text[ $finalKeyword ][ 'x-default' ] = $content;
- $text[ $finalKeyword ]['_type'] = 'lang';
+ $finalKeyword = self::$text_chunks[$keyword];
+ $text[$finalKeyword]['x-default'] = $content;
+ $text[$finalKeyword]['_type'] = 'lang';
} else {
- wfDebug( __METHOD__ . " Cannot decompress zTXt chunk due to lack of zlib. Skipping." );
+ wfDebug( __METHOD__ . " Cannot decompress zTXt chunk due to lack of zlib. Skipping.\n" );
fseek( $fh, $chunk_size, SEEK_CUR );
}
} elseif ( $chunk_type == 'tIME' ) {
diff --git a/includes/media/SVG.php b/includes/media/SVG.php
index cddab51d..72a9696c 100644
--- a/includes/media/SVG.php
+++ b/includes/media/SVG.php
@@ -56,7 +56,7 @@ class SvgHandler extends ImageHandler {
$metadata = $file->getMetadata();
if ( $metadata ) {
$metadata = $this->unpackMetadata( $metadata );
- if( isset( $metadata['animated'] ) ) {
+ if ( isset( $metadata['animated'] ) ) {
return $metadata['animated'];
}
}
@@ -115,6 +115,7 @@ class SvgHandler extends ImageHandler {
$clientHeight = $params['height'];
$physicalWidth = $params['physicalWidth'];
$physicalHeight = $params['physicalHeight'];
+ $lang = isset( $params['lang'] ) ? $params['lang'] : 'en';
if ( $flags & self::TRANSFORM_LATER ) {
return new ThumbnailImage( $image, $dstUrl, $dstPath, $params );
@@ -132,7 +133,7 @@ class SvgHandler extends ImageHandler {
}
$srcPath = $image->getLocalRefPath();
- $status = $this->rasterize( $srcPath, $dstPath, $physicalWidth, $physicalHeight );
+ $status = $this->rasterize( $srcPath, $dstPath, $physicalWidth, $physicalHeight, $lang );
if ( $status === true ) {
return new ThumbnailImage( $image, $dstUrl, $dstPath, $params );
} else {
@@ -147,10 +148,11 @@ class SvgHandler extends ImageHandler {
* @param string $dstPath
* @param string $width
* @param string $height
+ * @param string $lang Language code of the language to render the SVG in
* @throws MWException
* @return bool|MediaTransformError
*/
- public function rasterize( $srcPath, $dstPath, $width, $height ) {
+ public function rasterize( $srcPath, $dstPath, $width, $height, $lang = false ) {
global $wgSVGConverters, $wgSVGConverter, $wgSVGConverterPath;
$err = false;
$retval = '';
@@ -158,7 +160,7 @@ class SvgHandler extends ImageHandler {
if ( is_array( $wgSVGConverters[$wgSVGConverter] ) ) {
// This is a PHP callable
$func = $wgSVGConverters[$wgSVGConverter][0];
- $args = array_merge( array( $srcPath, $dstPath, $width, $height ),
+ $args = array_merge( array( $srcPath, $dstPath, $width, $height, $lang ),
array_slice( $wgSVGConverters[$wgSVGConverter], 1 ) );
if ( !is_callable( $func ) ) {
throw new MWException( "$func is not callable" );
@@ -175,10 +177,16 @@ class SvgHandler extends ImageHandler {
wfEscapeShellArg( $srcPath ),
wfEscapeShellArg( $dstPath ) ),
$wgSVGConverters[$wgSVGConverter]
- ) . " 2>&1";
+ );
+
+ $env = array();
+ if ( $lang !== false ) {
+ $env['LANG'] = $lang;
+ }
+
wfProfileIn( 'rsvg' );
wfDebug( __METHOD__ . ": $cmd\n" );
- $err = wfShellExec( $cmd, $retval );
+ $err = wfShellExecWithStderr( $cmd, $retval, $env );
wfProfileOut( 'rsvg' );
}
}
@@ -263,11 +271,11 @@ class SvgHandler extends ImageHandler {
$metadata = array( 'version' => self::SVG_METADATA_VERSION );
try {
$metadata += SVGMetadataExtractor::getMetadata( $filename );
- } catch( MWException $e ) { // @TODO: SVG specific exceptions
+ } catch ( MWException $e ) { // @todo SVG specific exceptions
// File not found, broken, etc.
$metadata['error'] = array(
'message' => $e->getMessage(),
- 'code' => $e->getCode()
+ 'code' => $e->getCode()
);
wfDebug( __METHOD__ . ': ' . $e->getMessage() . "\n" );
}
@@ -340,6 +348,7 @@ class SvgHandler extends ImageHandler {
'description' => 'imagedescription',
'title' => 'objectname',
);
+ $showMeta = false;
foreach ( $metadata as $name => $value ) {
$tag = strtolower( $name );
if ( isset( $conversion[$tag] ) ) {
@@ -348,6 +357,7 @@ class SvgHandler extends ImageHandler {
// Do not output other metadata not in list
continue;
}
+ $showMeta = true;
self::addMeta( $result,
in_array( $tag, $visibleFields ) ? 'visible' : 'collapsed',
'exif',
@@ -355,6 +365,70 @@ class SvgHandler extends ImageHandler {
$value
);
}
- return $result;
+ return $showMeta ? $result : false;
+ }
+
+
+ /**
+ * @param string $name Parameter name
+ * @param $string $value Parameter value
+ * @return bool Validity
+ */
+ function validateParam( $name, $value ) {
+ if ( in_array( $name, array( 'width', 'height' ) ) ) {
+ // Reject negative heights, widths
+ return ( $value > 0 );
+ } elseif ( $name == 'lang' ) {
+ // Validate $code
+ if ( !Language::isValidBuiltinCode( $value ) ) {
+ wfDebug( "Invalid user language code\n" );
+ return false;
+ }
+ return true;
+ }
+ // Only lang, width and height are acceptable keys
+ return false;
+ }
+
+ /**
+ * @param array $params name=>value pairs of parameters
+ * @return string Filename to use
+ */
+ function makeParamString( $params ) {
+ $lang = '';
+ if ( isset( $params['lang'] ) && $params['lang'] !== 'en' ) {
+ $params['lang'] = mb_strtolower( $params['lang'] );
+ $lang = "lang{$params['lang']}-";
+ }
+ if ( !isset( $params['width'] ) ) {
+ return false;
+ }
+ return "$lang{$params['width']}px";
+ }
+
+ function parseParamString( $str ) {
+ $m = false;
+ if ( preg_match( '/^lang([a-z]+(?:-[a-z]+)*)-(\d+)px$/', $str, $m ) ) {
+ return array( 'width' => array_pop( $m ), 'lang' => $m[1] );
+ } elseif ( preg_match( '/^(\d+)px$/', $str, $m ) ) {
+ return array( 'width' => $m[1], 'lang' => 'en' );
+ } else {
+ return false;
+ }
+ }
+
+ function getParamMap() {
+ return array( 'img_lang' => 'lang', 'img_width' => 'width' );
+ }
+
+ /**
+ * @param $params
+ * @return array
+ */
+ function getScriptParams( $params ) {
+ return array(
+ 'width' => $params['width'],
+ 'lang' => $params['lang'],
+ );
}
}
diff --git a/includes/media/SVGMetadataExtractor.php b/includes/media/SVGMetadataExtractor.php
index 0de212b9..2e33bb98 100644
--- a/includes/media/SVGMetadataExtractor.php
+++ b/includes/media/SVGMetadataExtractor.php
@@ -101,7 +101,7 @@ class SVGReader {
wfSuppressWarnings();
try {
$this->read();
- } catch( Exception $e ) {
+ } catch ( Exception $e ) {
// Note, if this happens, the width/height will be taken to be 0x0.
// Should we consider it the default 512x512 instead?
wfRestoreWarnings();
@@ -128,12 +128,12 @@ class SVGReader {
$keepReading = $this->reader->read();
/* Skip until first element */
- while( $keepReading && $this->reader->nodeType != XmlReader::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 ".
+ throw new MWException( "Expected <svg> tag, got " .
$this->reader->localName . " in NS " . $this->reader->namespaceURI );
}
$this->debug( "<svg> tag is correct." );
@@ -144,7 +144,7 @@ class SVGReader {
while ( $keepReading ) {
$tag = $this->reader->localName;
$type = $this->reader->nodeType;
- $isSVG = ($this->reader->namespaceURI == self::NS_SVG);
+ $isSVG = ( $this->reader->namespaceURI == self::NS_SVG );
$this->debug( "$tag" );
@@ -185,16 +185,16 @@ class SVGReader {
* @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 ) {
+ 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->reader->namespaceURI == self::NS_SVG && $this->reader->nodeType == XmlReader::END_ELEMENT ) {
+ while ( $keepReading ) {
+ if ( $this->reader->localName == $name && $this->reader->namespaceURI == self::NS_SVG && $this->reader->nodeType == XmlReader::END_ELEMENT ) {
break;
- } elseif( $this->reader->nodeType == XmlReader::TEXT ) {
+ } elseif ( $this->reader->nodeType == XmlReader::TEXT ) {
$this->metadata[$metafield] = trim( $this->reader->value );
}
$keepReading = $this->reader->read();
@@ -207,13 +207,13 @@ class SVGReader {
* @param string $metafield that we will fill with the result
* @throws MWException
*/
- private function readXml( $metafield=null ) {
- $this->debug ( "Read top level metadata" );
- if( !$metafield || $this->reader->nodeType != XmlReader::ELEMENT ) {
+ 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"
- if( method_exists( $this->reader, 'readInnerXML' ) ) {
+ if ( method_exists( $this->reader, 'readInnerXML' ) ) {
$this->metadata[$metafield] = trim( $this->reader->readInnerXML() );
} else {
throw new MWException( "The PHP XMLReader extension does not come with readInnerXML() method. Your libxml is probably out of date (need 2.6.20 or later)." );
@@ -227,8 +227,8 @@ class SVGReader {
* @param string $name of the element that we are reading from
*/
private function animateFilter( $name ) {
- $this->debug ( "animate filter for tag $name" );
- if( $this->reader->nodeType != XmlReader::ELEMENT ) {
+ $this->debug( "animate filter for tag $name" );
+ if ( $this->reader->nodeType != XmlReader::ELEMENT ) {
return;
}
if ( $this->reader->isEmptyElement ) {
@@ -236,12 +236,12 @@ class SVGReader {
}
$exitDepth = $this->reader->depth;
$keepReading = $this->reader->read();
- while( $keepReading ) {
- if( $this->reader->localName == $name && $this->reader->depth <= $exitDepth
+ 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 ) {
+ switch ( $this->reader->localName ) {
case 'script':
// Normally we disallow files with
// <script>, but its possible
@@ -267,7 +267,7 @@ class SVGReader {
}
private function debug( $data ) {
- if( $this->mDebug ) {
+ if ( $this->mDebug ) {
wfDebug( "SVGReader: $data\n" );
}
}
@@ -292,37 +292,37 @@ class SVGReader {
$width = null;
$height = null;
- if( $this->reader->getAttribute( 'viewBox' ) ) {
+ if ( $this->reader->getAttribute( 'viewBox' ) ) {
// min-x min-y width height
$viewBox = preg_split( '/\s+/', trim( $this->reader->getAttribute( 'viewBox' ) ) );
- if( count( $viewBox ) == 4 ) {
+ if ( count( $viewBox ) == 4 ) {
$viewWidth = $this->scaleSVGUnit( $viewBox[2] );
$viewHeight = $this->scaleSVGUnit( $viewBox[3] );
- if( $viewWidth > 0 && $viewHeight > 0 ) {
+ if ( $viewWidth > 0 && $viewHeight > 0 ) {
$aspect = $viewWidth / $viewHeight;
$defaultHeight = $defaultWidth / $aspect;
}
}
}
- if( $this->reader->getAttribute( 'width' ) ) {
+ if ( $this->reader->getAttribute( 'width' ) ) {
$width = $this->scaleSVGUnit( $this->reader->getAttribute( 'width' ), $defaultWidth );
$this->metadata['originalWidth'] = $this->reader->getAttribute( 'width' );
}
- if( $this->reader->getAttribute( 'height' ) ) {
+ if ( $this->reader->getAttribute( 'height' ) ) {
$height = $this->scaleSVGUnit( $this->reader->getAttribute( 'height' ), $defaultHeight );
$this->metadata['originalHeight'] = $this->reader->getAttribute( 'height' );
}
- if( !isset( $width ) && !isset( $height ) ) {
+ if ( !isset( $width ) && !isset( $height ) ) {
$width = $defaultWidth;
$height = $width / $aspect;
- } elseif( isset( $width ) && !isset( $height ) ) {
+ } elseif ( isset( $width ) && !isset( $height ) ) {
$height = $width / $aspect;
- } elseif( isset( $height ) && !isset( $width ) ) {
+ } elseif ( isset( $height ) && !isset( $width ) ) {
$width = $height * $aspect;
}
- if( $width > 0 && $height > 0 ) {
+ if ( $width > 0 && $height > 0 ) {
$this->metadata['width'] = intval( round( $width ) );
$this->metadata['height'] = intval( round( $height ) );
}
@@ -346,13 +346,13 @@ class SVGReader {
'in' => 90.0,
'em' => 16.0, // fake it?
'ex' => 12.0, // fake it?
- '' => 1.0, // "User units" pixels by default
+ '' => 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 ) ) {
+ 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 == '%' ) {
+ if ( $unit == '%' ) {
return $length * 0.01 * $viewportSize;
} else {
return $length * $unitLength[$unit];
diff --git a/includes/media/Tiff.php b/includes/media/Tiff.php
index 0042208b..55acb120 100644
--- a/includes/media/Tiff.php
+++ b/includes/media/Tiff.php
@@ -43,7 +43,7 @@ class TiffHandler extends ExifBitmapHandler {
function canRender( $file ) {
global $wgTiffThumbnailType;
return (bool)$wgTiffThumbnailType
- || ($file->getRepo() instanceof ForeignAPIRepo);
+ || $file->getRepo() instanceof ForeignAPIRepo;
}
/**
diff --git a/includes/media/XCF.php b/includes/media/XCF.php
index ba38d158..e77d3842 100644
--- a/includes/media/XCF.php
+++ b/includes/media/XCF.php
@@ -78,7 +78,7 @@ class XCFHandler extends BitmapHandler {
static function getXCFMetaData( $filename ) {
# Decode master structure
$f = fopen( $filename, 'rb' );
- if( !$f ) {
+ if ( !$f ) {
return false;
}
# The image structure always starts at offset 0 in the XCF file.
@@ -110,12 +110,12 @@ class XCFHandler extends BitmapHandler {
. "/Nbase_type" # /
, $binaryHeader
);
- } catch( MWException $mwe ) {
+ } catch ( MWException $mwe ) {
return false;
}
# Check values
- if( $header['magic'] !== 'gimp xcf' ) {
+ if ( $header['magic'] !== 'gimp xcf' ) {
wfDebug( __METHOD__ . " '$filename' has invalid magic signature.\n" );
return false;
}
diff --git a/includes/media/XMP.php b/includes/media/XMP.php
index 62738a00..7eb3d19e 100644
--- a/includes/media/XMP.php
+++ b/includes/media/XMP.php
@@ -180,12 +180,12 @@ class XMPReader {
) {
// the is_array is just paranoia. It should always
// be an array.
- foreach( $data['xmp-special']['LocationShown'] as $loc ) {
+ foreach ( $data['xmp-special']['LocationShown'] as $loc ) {
if ( !is_array( $loc ) ) {
// To avoid copying over the _type meta-fields.
continue;
}
- foreach( $loc as $field => $val ) {
+ foreach ( $loc as $field => $val ) {
$data['xmp-general'][$field . 'Dest'][] = $val;
}
}
@@ -195,12 +195,12 @@ class XMPReader {
) {
// the is_array is just paranoia. It should always
// be an array.
- foreach( $data['xmp-special']['LocationCreated'] as $loc ) {
+ foreach ( $data['xmp-special']['LocationCreated'] as $loc ) {
if ( !is_array( $loc ) ) {
// To avoid copying over the _type meta-fields.
continue;
}
- foreach( $loc as $field => $val ) {
+ foreach ( $loc as $field => $val ) {
$data['xmp-general'][$field . 'Created'][] = $val;
}
}
@@ -391,7 +391,9 @@ class XMPReader {
throw new MWException( 'Unexpected character data before first rdf:Description element' );
}
- if ( $this->mode[0] === self::MODE_IGNORE ) return;
+ if ( $this->mode[0] === self::MODE_IGNORE ) {
+ return;
+ }
if ( $this->mode[0] !== self::MODE_SIMPLE
&& $this->mode[0] !== self::MODE_QDESC
@@ -414,7 +416,7 @@ class XMPReader {
*
* @param string $elm Namespace of element followed by a space and then tag name of element.
*/
- private function endElementModeIgnore ( $elm ) {
+ private function endElementModeIgnore( $elm ) {
if ( $this->curItem[0] === $elm ) {
array_shift( $this->curItem );
array_shift( $this->mode );
@@ -436,7 +438,7 @@ class XMPReader {
*
* @param string $elm namespace, space, and tag name.
*/
- private function endElementModeSimple ( $elm ) {
+ private function endElementModeSimple( $elm ) {
if ( $this->charContent !== false ) {
if ( $this->processingArray ) {
// if we're processing an array, use the original element
@@ -639,7 +641,7 @@ class XMPReader {
throw new MWException( "Hit end element </$elm> but no curItem" );
}
- switch( $this->mode[0] ) {
+ switch ( $this->mode[0] ) {
case self::MODE_IGNORE:
$this->endElementModeIgnore( $elm );
break;
@@ -993,15 +995,15 @@ class XMPReader {
if ( $elm !== self::NS_RDF . ' li' ) {
throw new MWException( __METHOD__ . " <rdf:li> expected but got $elm." );
}
- if ( !isset( $attribs[ self::NS_XML . ' lang'] )
- || !preg_match( '/^[-A-Za-z0-9]{2,}$/D', $attribs[ self::NS_XML . ' lang' ] ) )
+ if ( !isset( $attribs[self::NS_XML . ' lang'] )
+ || !preg_match( '/^[-A-Za-z0-9]{2,}$/D', $attribs[self::NS_XML . ' lang'] ) )
{
throw new MWException( __METHOD__
. " <rdf:li> did not contain, or has invalid xml:lang attribute in lang alternative" );
}
// Lang is case-insensitive.
- $this->itemLang = strtolower( $attribs[ self::NS_XML . ' lang' ] );
+ $this->itemLang = strtolower( $attribs[self::NS_XML . ' lang'] );
// need to add curItem[0] on again since one is for the specific item
// and one is for the entire group.
@@ -1058,7 +1060,7 @@ class XMPReader {
. "encountered <$elm> with no mode" );
}
- switch( $this->mode[0] ) {
+ switch ( $this->mode[0] ) {
case self::MODE_IGNORE:
$this->startElementModeIgnore( $elm );
break;
diff --git a/includes/media/XMPInfo.php b/includes/media/XMPInfo.php
index 102547ff..f0b2cb5e 100644
--- a/includes/media/XMPInfo.php
+++ b/includes/media/XMPInfo.php
@@ -31,8 +31,8 @@ class XMPInfo {
/** get the items array
* @return Array XMP item configuration array.
*/
- public static function getItems () {
- if( !self::$ranHooks ) {
+ public static function getItems() {
+ if ( !self::$ranHooks ) {
// This is for if someone makes a custom metadata extension.
// For example, a medical wiki might want to decode DICOM xmp properties.
wfRunHooks( 'XMPGetInfo', Array( &self::$items ) );
@@ -428,7 +428,7 @@ class XMPInfo {
'mode' => XMPReader::MODE_SIMPLE,
'validate' => 'validateClosed',
/* can't use a range, as it skips... */
- 'choices' => array( '0' => true, '1' => true,
+ 'choices' => array( '0' => true, '1' => true,
'2' => true, '3' => true, '4' => true,
'9' => true, '10' => true, '11' => true,
'12' => true, '13' => true,
diff --git a/includes/media/XMPValidate.php b/includes/media/XMPValidate.php
index f98f0b57..87f8abfe 100644
--- a/includes/media/XMPValidate.php
+++ b/includes/media/XMPValidate.php
@@ -101,7 +101,7 @@ class XMPValidate {
$val = null;
return;
} else {
- $nVal = (float) $val;
+ $nVal = (float)$val;
if ( $nVal < 0 ) {
// We do < 0 here instead of < -1 here, since
// the values between 0 and -1 are also illegal
@@ -214,7 +214,7 @@ class XMPValidate {
// this only validates standalone properties, not arrays, etc
return;
}
- if ( !preg_match( '/^[-A-Za-z0-9]{2,}$/D', $val) ) {
+ if ( !preg_match( '/^[-A-Za-z0-9]{2,}$/D', $val ) ) {
//this is a rather naive check.
wfDebugLog( 'XMP', __METHOD__ . " Expected Lang code but got $val" );
$val = null;
@@ -335,7 +335,7 @@ class XMPValidate {
* or DDD,MM.mmk form
* @param $standalone Boolean if its a simple prop (should always be true)
*/
- public static function validateGPS ( $info, &$val, $standalone ) {
+ public static function validateGPS( $info, &$val, $standalone ) {
if ( !$standalone ) {
return;
}
@@ -346,8 +346,8 @@ class XMPValidate {
$val, $m )
) {
$coord = intval( $m[1] );
- $coord += intval( $m[2] ) * (1/60);
- $coord += intval( $m[3] ) * (1/3600);
+ $coord += intval( $m[2] ) * ( 1 / 60 );
+ $coord += intval( $m[3] ) * ( 1 / 3600 );
if ( $m[4] === 'S' || $m[4] === 'W' ) {
$coord = -$coord;
}
@@ -358,7 +358,7 @@ class XMPValidate {
$val, $m )
) {
$coord = intval( $m[1] );
- $coord += floatval( $m[2] ) * (1/60);
+ $coord += floatval( $m[2] ) * ( 1 / 60 );
if ( $m[3] === 'S' || $m[3] === 'W' ) {
$coord = -$coord;
}
diff --git a/includes/mime.info b/includes/mime.info
index f7576e41..c7981871 100644
--- a/includes/mime.info
+++ b/includes/mime.info
@@ -30,6 +30,7 @@ application/x-dia-diagram [DRAWING]
audio/mpeg audio/mp3 audio/mpeg3 [AUDIO]
+audio/mp4 [AUDIO]
audio/wav audio/x-wav audio/wave [AUDIO]
audio/midi audio/mid [AUDIO]
audio/basic [AUDIO]
@@ -39,6 +40,8 @@ audio/x-pn-realaudio [AUDIO]
audio/x-realaudio [AUDIO]
audio/webm [AUDIO]
audio/x-matroska [AUDIO]
+audio/x-flac [AUDIO]
+audio/flac [AUDIO]
video/mpeg application/mpeg [VIDEO]
video/ogg [VIDEO]
@@ -46,6 +49,7 @@ video/x-sgi-video [VIDEO]
video/x-flv [VIDEO]
video/webm [VIDEO]
video/x-matroska [VIDEO]
+video/mp4 [VIDEO]
application/ogg application/x-ogg audio/ogg audio/x-ogg video/ogg video/x-ogg [MULTIMEDIA]
diff --git a/includes/mime.types b/includes/mime.types
index a89d229a..61f7ff58 100644
--- a/includes/mime.types
+++ b/includes/mime.types
@@ -75,6 +75,9 @@ audio/x-pn-realaudio ram rm
audio/x-pn-realaudio-plugin rpm
audio/x-realaudio ra
audio/x-wav wav
+audio/wav wav
+audio/x-flac flac
+audio/flac flac
chemical/x-pdb pdb
chemical/x-xyz xyz
image/bmp bmp
@@ -118,6 +121,8 @@ text/xml xml xsl xslt rss rdf
text/x-setext etx
text/x-sawfish jl
video/mpeg mpeg mpg mpe
+video/mp4 mp4 m4a m4p m4b m4r m4v
+audio/mp4 m4a
video/ogg ogv ogm ogg
video/quicktime qt mov
video/vnd.mpegurl mxu
diff --git a/includes/normal/README b/includes/normal/README
index a17aa7da..0f718d2c 100644
--- a/includes/normal/README
+++ b/includes/normal/README
@@ -48,12 +48,12 @@ grains of salt.
There's an experimental PHP extension module which wraps the ICU library's
normalization functions. This is *MUCH* faster than doing this work in pure
-PHP code. This is in the 'normal' directory in MediaWiki's CVS extensions
-module. It is known to work with PHP 4.3.8 and 5.0.2 on Linux/x86 but hasn't
-been thoroughly tested on other configurations.
+PHP code. This is at https://git.wikimedia.org/summary/mediawiki%2Fextensions%2Fnormal.git.
+It is used by the WMF, which currently runs PHP 5.3.10 on Linux. It hasn't been
+thoroughly tested on other configurations, but may work.
If the php_normal.so module is loaded in php.ini, the normalization functions
will automatically use it. If you can't (or don't want to) load it in php.ini,
-you may be able to load it using the dl() function before include()ing or
-require()ing UtfNormal.php, and it will be picked up.
+you may be able to load it using the dl() function before the inclusion of
+UtfNormal.php, and it will be picked up.
diff --git a/includes/normal/RandomTest.php b/includes/normal/RandomTest.php
index 9dc1c861..06029868 100644
--- a/includes/normal/RandomTest.php
+++ b/includes/normal/RandomTest.php
@@ -31,10 +31,10 @@ if( PHP_SAPI != 'cli' ) {
}
/** */
-require_once( 'UtfNormal.php' );
-require_once( '../diff/DifferenceEngine.php' );
+require_once 'UtfNormal.php';
+require_once '../diff/DifferenceEngine.php';
-dl('php_utfnormal.so' );
+dl( 'php_utfnormal.so' );
# mt_srand( 99999 );
diff --git a/includes/normal/UtfNormal.php b/includes/normal/UtfNormal.php
index 77ddb79b..5a091afc 100644
--- a/includes/normal/UtfNormal.php
+++ b/includes/normal/UtfNormal.php
@@ -190,7 +190,7 @@ class UtfNormal {
*/
static function loadData() {
if( !isset( self::$utfCombiningClass ) ) {
- require_once( __DIR__ . '/UtfNormalData.inc' );
+ require_once __DIR__ . '/UtfNormalData.inc';
}
}
@@ -491,7 +491,7 @@ class UtfNormal {
*/
static function NFKD( $string ) {
if( !isset( self::$utfCompatibilityDecomp ) ) {
- require_once( 'UtfNormalDataK.inc' );
+ require_once 'UtfNormalDataK.inc';
}
return self::fastCombiningSort(
self::fastDecompose( $string, self::$utfCompatibilityDecomp ) );
diff --git a/includes/normal/UtfNormalTest.php b/includes/normal/UtfNormalTest.php
index 661e53fd..51183666 100644
--- a/includes/normal/UtfNormalTest.php
+++ b/includes/normal/UtfNormalTest.php
@@ -34,9 +34,7 @@ $verbose = true;
if( defined( 'PRETTY_UTF8' ) ) {
function pretty( $string ) {
- return preg_replace( '/([\x00-\xff])/e',
- 'sprintf("%02X", ord("$1"))',
- $string );
+ return strtoupper( bin2hex( $string ) );
}
} else {
/**
@@ -44,9 +42,7 @@ if( defined( 'PRETTY_UTF8' ) ) {
* @return string
*/
function pretty( $string ) {
- return trim( preg_replace( '/(.)/use',
- 'sprintf("%04X ", utf8ToCodepoint("$1"))',
- $string ) );
+ return strtoupper( utf8ToHexSequence( $string ) );
}
}
diff --git a/includes/normal/UtfNormalTest2.php b/includes/normal/UtfNormalTest2.php
index 2266696e..750c0099 100644
--- a/includes/normal/UtfNormalTest2.php
+++ b/includes/normal/UtfNormalTest2.php
@@ -65,7 +65,7 @@ $f = fopen($file, "r");
later and slow down the runtime.
*/
-require_once("./UtfNormal.php");
+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); }
diff --git a/includes/normal/UtfNormalUtil.php b/includes/normal/UtfNormalUtil.php
index 9b96a073..e8fec936 100644
--- a/includes/normal/UtfNormalUtil.php
+++ b/includes/normal/UtfNormalUtil.php
@@ -76,9 +76,11 @@ function hexSequenceToUtf8( $sequence ) {
* @private
*/
function utf8ToHexSequence( $str ) {
- return rtrim( preg_replace( '/(.)/uSe',
- 'sprintf("%04x ", utf8ToCodepoint("$1"))',
- $str ) );
+ $buf = '';
+ foreach ( preg_split( '//u', $str, -1, PREG_SPLIT_NO_EMPTY ) as $cp ) {
+ $buf .= sprintf( '%04x ', utf8ToCodepoint( $cp ) );
+ }
+ return rtrim( $buf );
}
/**
diff --git a/includes/objectcache/BagOStuff.php b/includes/objectcache/BagOStuff.php
index dd744672..857943ee 100644
--- a/includes/objectcache/BagOStuff.php
+++ b/includes/objectcache/BagOStuff.php
@@ -170,12 +170,12 @@ abstract class BagOStuff {
*/
public function lock( $key, $timeout = 60 ) {
$timestamp = microtime( true ); // starting UNIX timestamp
- if ( $this->add( "{$key}:lock", $timeout ) ) {
+ if ( $this->add( "{$key}:lock", 1, $timeout ) ) {
return true;
}
$uRTT = ceil( 1e6 * ( microtime( true ) - $timestamp ) ); // estimate RTT (us)
- $sleep = 2*$uRTT; // rough time to do get()+set()
+ $sleep = 2 * $uRTT; // rough time to do get()+set()
$locked = false; // lock acquired
$attempts = 0; // failed attempts
@@ -186,8 +186,8 @@ abstract class BagOStuff {
$sleep *= 2;
}
usleep( $sleep ); // back off
- $locked = $this->add( "{$key}:lock", $timeout );
- } while( !$locked );
+ $locked = $this->add( "{$key}:lock", 1, $timeout );
+ } while ( !$locked );
return $locked;
}
diff --git a/includes/objectcache/MemcachedBagOStuff.php b/includes/objectcache/MemcachedBagOStuff.php
index 3f1fa3a0..f1644edb 100644
--- a/includes/objectcache/MemcachedBagOStuff.php
+++ b/includes/objectcache/MemcachedBagOStuff.php
@@ -43,7 +43,7 @@ class MemcachedBagOStuff extends BagOStuff {
if ( !isset( $params['persistent'] ) ) {
$params['persistent'] = $GLOBALS['wgMemCachedPersistent'];
}
- if ( !isset( $params['compress_threshold'] ) ) {
+ if ( !isset( $params['compress_threshold'] ) ) {
$params['compress_threshold'] = 1500;
}
if ( !isset( $params['timeout'] ) ) {
diff --git a/includes/objectcache/MemcachedClient.php b/includes/objectcache/MemcachedClient.php
index 0d96ed6c..e5f60b55 100644
--- a/includes/objectcache/MemcachedClient.php
+++ b/includes/objectcache/MemcachedClient.php
@@ -55,9 +55,9 @@
* 'compress_threshold' => 10240,
* 'persistent' => true));
*
- * $mc->add('key', array('some', 'array'));
- * $mc->replace('key', 'some random string');
- * $val = $mc->get('key');
+ * $mc->add( 'key', array( 'some', 'array' ) );
+ * $mc->replace( 'key', 'some random string' );
+ * $val = $mc->get( 'key' );
*
* @author Ryan T. Dean <rtdean@cytherianage.net>
* @version 0.1.2
@@ -329,7 +329,7 @@ class MWMemcached {
$this->stats['delete'] = 1;
}
$cmd = "delete $key $time\r\n";
- if( !$this->_fwrite( $sock, $cmd ) ) {
+ if ( !$this->_fwrite( $sock, $cmd ) ) {
return false;
}
$res = $this->_fgets( $sock );
@@ -489,17 +489,17 @@ class MWMemcached {
}
$key = is_array( $key ) ? $key[1] : $key;
if ( !isset( $sock_keys[$sock] ) ) {
- $sock_keys[ intval( $sock ) ] = array();
+ $sock_keys[intval( $sock )] = array();
$socks[] = $sock;
}
- $sock_keys[ intval( $sock ) ][] = $key;
+ $sock_keys[intval( $sock )][] = $key;
}
$gather = array();
// Send out the requests
foreach ( $socks as $sock ) {
$cmd = 'gets';
- foreach ( $sock_keys[ intval( $sock ) ] as $key ) {
+ foreach ( $sock_keys[intval( $sock )] as $key ) {
$cmd .= ' ' . $key;
}
$cmd .= "\r\n";
@@ -733,7 +733,7 @@ class MWMemcached {
$sock = false;
$timeout = $this->_connect_timeout;
$errno = $errstr = null;
- for( $i = 0; !$sock && $i < $this->_connect_attempts; $i++ ) {
+ for ( $i = 0; !$sock && $i < $this->_connect_attempts; $i++ ) {
wfSuppressWarnings();
if ( $this->_persistent == 1 ) {
$sock = pfsockopen( $ip, $port, $errno, $errstr, $timeout );
@@ -810,7 +810,7 @@ class MWMemcached {
$bu = array();
foreach ( $this->_servers as $v ) {
if ( is_array( $v ) ) {
- for( $i = 0; $i < $v[1]; $i++ ) {
+ for ( $i = 0; $i < $v[1]; $i++ ) {
$bu[] = $v[0];
}
} else {
@@ -822,7 +822,7 @@ class MWMemcached {
}
$realkey = is_array( $key ) ? $key[1] : $key;
- for( $tries = 0; $tries < 20; $tries++ ) {
+ for ( $tries = 0; $tries < 20; $tries++ ) {
$host = $this->_buckets[$hv % $this->_bucketcount];
$sock = $this->sock_to_host( $host );
if ( is_resource( $sock ) ) {
@@ -912,7 +912,7 @@ class MWMemcached {
while ( 1 ) {
$decl = $this->_fgets( $sock );
- if( $decl === false ) {
+ if ( $decl === false ) {
/*
* If nothing can be read, something is wrong because we know exactly when
* to stop reading (right after "END") and we return right after that.
@@ -1123,7 +1123,7 @@ class MWMemcached {
function _fwrite( $sock, $buf ) {
$bytesWritten = 0;
$bufSize = strlen( $buf );
- while ( $bytesWritten < $bufSize ) {
+ while ( $bytesWritten < $bufSize ) {
$result = fwrite( $sock, $buf );
$data = stream_get_meta_data( $sock );
if ( $data['timed_out'] ) {
diff --git a/includes/objectcache/MemcachedPeclBagOStuff.php b/includes/objectcache/MemcachedPeclBagOStuff.php
index 31924293..0c3b228f 100644
--- a/includes/objectcache/MemcachedPeclBagOStuff.php
+++ b/includes/objectcache/MemcachedPeclBagOStuff.php
@@ -37,6 +37,8 @@ class MemcachedPeclBagOStuff extends MemcachedBagOStuff {
* - compress_threshold: The minimum size an object must be before it is compressed
* - timeout: The read timeout in microseconds
* - connect_timeout: The connect timeout in seconds
+ * - retry_timeout: Time in seconds to wait before retrying a failed connect attempt
+ * - server_failure_limit: Limit for server connect failures before it is removed
* - serializer: May be either "php" or "igbinary". Igbinary produces more compact
* values, but serialization is much slower unless the php.ini option
* igbinary.compact_strings is off.
@@ -61,6 +63,14 @@ class MemcachedPeclBagOStuff extends MemcachedBagOStuff {
$params['serializer'] = 'php';
}
+ if ( isset( $params['retry_timeout'] ) ) {
+ $this->client->setOption( Memcached::OPT_RETRY_TIMEOUT, $params['retry_timeout'] );
+ }
+
+ if ( isset( $params['server_failure_limit'] ) ) {
+ $this->client->setOption( Memcached::OPT_SERVER_FAILURE_LIMIT, $params['server_failure_limit'] );
+ }
+
// The compression threshold is an undocumented php.ini option for some
// reason. There's probably not much harm in setting it globally, for
// compatibility with the settings for the PHP client.
@@ -87,13 +97,13 @@ class MemcachedPeclBagOStuff extends MemcachedBagOStuff {
break;
case 'igbinary':
if ( !Memcached::HAVE_IGBINARY ) {
- throw new MWException( __CLASS__.': the igbinary extension is not available ' .
+ throw new MWException( __CLASS__ . ': the igbinary extension is not available ' .
'but igbinary serialization was requested.' );
}
$this->client->setOption( Memcached::OPT_SERIALIZER, Memcached::SERIALIZER_IGBINARY );
break;
default:
- throw new MWException( __CLASS__.': invalid value for serializer parameter' );
+ throw new MWException( __CLASS__ . ': invalid value for serializer parameter' );
}
$servers = array();
foreach ( $params['servers'] as $host ) {
diff --git a/includes/objectcache/MultiWriteBagOStuff.php b/includes/objectcache/MultiWriteBagOStuff.php
index 92afaacd..e550c0d0 100644
--- a/includes/objectcache/MultiWriteBagOStuff.php
+++ b/includes/objectcache/MultiWriteBagOStuff.php
@@ -43,7 +43,7 @@ class MultiWriteBagOStuff extends BagOStuff {
*/
public function __construct( $params ) {
if ( !isset( $params['caches'] ) ) {
- throw new MWException( __METHOD__.': the caches parameter is required' );
+ throw new MWException( __METHOD__ . ': the caches parameter is required' );
}
$this->caches = array();
diff --git a/includes/objectcache/ObjectCache.php b/includes/objectcache/ObjectCache.php
index eafa836a..6c1433a9 100644
--- a/includes/objectcache/ObjectCache.php
+++ b/includes/objectcache/ObjectCache.php
@@ -34,7 +34,7 @@ class ObjectCache {
*
* @param $id string
*
- * @return ObjectCache
+ * @return BagOStuff
*/
static function getInstance( $id ) {
if ( isset( self::$instances[$id] ) ) {
@@ -59,7 +59,7 @@ class ObjectCache {
* @param $id string
*
* @throws MWException
- * @return ObjectCache
+ * @return BagOStuff
*/
static function newFromId( $id ) {
global $wgObjectCaches;
@@ -78,7 +78,7 @@ class ObjectCache {
* @param $params array
*
* @throws MWException
- * @return ObjectCache
+ * @return BagOStuff
*/
static function newFromParams( $params ) {
if ( isset( $params['factory'] ) ) {
@@ -102,7 +102,7 @@ class ObjectCache {
* If no cache choice is configured (by default $wgMainCacheType is CACHE_NONE),
* then CACHE_ANYTHING will forward to CACHE_DB.
* @param $params array
- * @return ObjectCache
+ * @return BagOStuff
*/
static function newAnything( $params ) {
global $wgMainCacheType, $wgMessageCacheType, $wgParserCacheType;
@@ -120,14 +120,14 @@ class ObjectCache {
*
* @param $params array
* @throws MWException
- * @return ObjectCache
+ * @return BagOStuff
*/
static function newAccelerator( $params ) {
if ( function_exists( 'apc_fetch' ) ) {
$id = 'apc';
- } elseif( function_exists( 'xcache_get' ) && wfIniGetBool( 'xcache.var_size' ) ) {
+ } elseif ( function_exists( 'xcache_get' ) && wfIniGetBool( 'xcache.var_size' ) ) {
$id = 'xcache';
- } elseif( function_exists( 'wincache_ucache_get' ) ) {
+ } elseif ( function_exists( 'wincache_ucache_get' ) ) {
$id = 'wincache';
} else {
throw new MWException( "CACHE_ACCEL requested but no suitable object " .
diff --git a/includes/objectcache/ObjectCacheSessionHandler.php b/includes/objectcache/ObjectCacheSessionHandler.php
index bc76294a..7cf960e7 100644
--- a/includes/objectcache/ObjectCacheSessionHandler.php
+++ b/includes/objectcache/ObjectCacheSessionHandler.php
@@ -94,7 +94,7 @@ class ObjectCacheSessionHandler {
*/
static function read( $id ) {
$data = self::getCache()->get( self::getKey( $id ) );
- if( $data === false ) {
+ if ( $data === false ) {
return '';
}
return $data;
diff --git a/includes/objectcache/RedisBagOStuff.php b/includes/objectcache/RedisBagOStuff.php
index f9feaf9d..135e0e83 100644
--- a/includes/objectcache/RedisBagOStuff.php
+++ b/includes/objectcache/RedisBagOStuff.php
@@ -140,7 +140,13 @@ class RedisBagOStuff extends BagOStuff {
$conn->setex( $key, $expiry, $value );
}
- $result = $conn->exec();
+ /*
+ * multi()/exec() (transactional mode) allows multiple values to
+ * be set/get at once and will return an array of results, in
+ * the order they were set/get. In this case, we only set 1
+ * value, which should (in case of success) result in true.
+ */
+ $result = ( $conn->exec() == array( true ) );
} catch ( RedisException $e ) {
$result = false;
$this->handleException( $server, $conn, $e );
@@ -268,38 +274,6 @@ class RedisBagOStuff extends BagOStuff {
}
/**
- * Non-atomic implementation of incr().
- *
- * Probably all callers actually want incr() to atomically initialise
- * values to zero if they don't exist, as provided by the Redis INCR
- * command. But we are constrained by the memcached-like interface to
- * return null in that case. Once the key exists, further increments are
- * atomic.
- */
- public function incr( $key, $value = 1 ) {
- wfProfileIn( __METHOD__ );
- list( $server, $conn ) = $this->getConnection( $key );
- if ( !$conn ) {
- wfProfileOut( __METHOD__ );
- return false;
- }
- if ( !$conn->exists( $key ) ) {
- wfProfileOut( __METHOD__ );
- return null;
- }
- try {
- $result = $conn->incrBy( $key, $value );
- } catch ( RedisException $e ) {
- $result = false;
- $this->handleException( $server, $conn, $e );
- }
-
- $this->logRequest( 'incr', $key, $server, $result );
- wfProfileOut( __METHOD__ );
- return $result;
- }
-
- /**
* Get a Redis object with a connection suitable for fetching the specified key
* @return Array (server, RedisConnRef) or (false, false)
*/
diff --git a/includes/objectcache/SqlBagOStuff.php b/includes/objectcache/SqlBagOStuff.php
index 87f787d8..acf27036 100644
--- a/includes/objectcache/SqlBagOStuff.php
+++ b/includes/objectcache/SqlBagOStuff.php
@@ -222,8 +222,8 @@ class SqlBagOStuff extends BagOStuff {
$dataRows = array();
foreach ( $keysByTable as $serverIndex => $serverKeys ) {
- $db = $this->getDB( $serverIndex );
try {
+ $db = $this->getDB( $serverIndex );
foreach ( $serverKeys as $tableName => $tableKeys ) {
$res = $db->select( $tableName,
array( 'keyname', 'value', 'exptime' ),
@@ -244,10 +244,10 @@ class SqlBagOStuff extends BagOStuff {
if ( isset( $dataRows[$key] ) ) { // HIT?
$row = $dataRows[$key];
$this->debug( "get: retrieved data; expiry time is " . $row->exptime );
- $db = $this->getDB( $row->serverIndex );
- if ( $this->isExpired( $db, $row->exptime ) ) { // MISS
- $this->debug( "get: key has expired, deleting" );
- try {
+ try {
+ $db = $this->getDB( $row->serverIndex );
+ if ( $this->isExpired( $db, $row->exptime ) ) { // MISS
+ $this->debug( "get: key has expired, deleting" );
$db->begin( __METHOD__ );
# Put the expiry time in the WHERE condition to avoid deleting a
# newly-inserted value
@@ -255,12 +255,12 @@ class SqlBagOStuff extends BagOStuff {
array( 'keyname' => $key, 'exptime' => $row->exptime ),
__METHOD__ );
$db->commit( __METHOD__ );
- } catch ( DBQueryError $e ) {
- $this->handleWriteError( $e, $row->serverIndex );
+ $values[$key] = false;
+ } else { // HIT
+ $values[$key] = $this->unserialize( $db->decodeBlob( $row->value ) );
}
- $values[$key] = false;
- } else { // HIT
- $values[$key] = $this->unserialize( $db->decodeBlob( $row->value ) );
+ } catch ( DBQueryError $e ) {
+ $this->handleWriteError( $e, $row->serverIndex );
}
} else { // MISS
$values[$key] = false;
@@ -364,7 +364,7 @@ class SqlBagOStuff extends BagOStuff {
return false;
}
- return (bool) $db->affectedRows();
+ return (bool)$db->affectedRows();
}
/**
diff --git a/includes/parser/CacheTime.php b/includes/parser/CacheTime.php
index 6b70e1da..8190a8a0 100644
--- a/includes/parser/CacheTime.php
+++ b/includes/parser/CacheTime.php
@@ -93,7 +93,7 @@ class CacheTime {
$expire = min( $expire, $wgParserCacheExpireTime );
}
- if( $this->containsOldMagic() ) { //compatibility hack
+ if ( $this->containsOldMagic() ) { //compatibility hack
$expire = min( $expire, 3600 ); # 1 hour
}
diff --git a/includes/parser/CoreLinkFunctions.php b/includes/parser/CoreLinkFunctions.php
deleted file mode 100644
index 1cabf766..00000000
--- a/includes/parser/CoreLinkFunctions.php
+++ /dev/null
@@ -1,92 +0,0 @@
-<?php
-/**
- * Link functions provided by MediaWiki core; experimental
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License along
- * with this program; if not, write to the Free Software Foundation, Inc.,
- * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
- * http://www.gnu.org/copyleft/gpl.html
- *
- * @file
- * @ingroup Parser
- */
-
-/**
- * Various core link functions, registered in Parser::firstCallInit()
- * @ingroup Parser
- */
-class CoreLinkFunctions {
- /**
- * @param $parser Parser_LinkHooks
- * @return bool
- */
- static function register( $parser ) {
- $parser->setLinkHook( NS_CATEGORY, array( __CLASS__, 'categoryLinkHook' ) );
- return true;
- }
-
- /**
- * @param $parser Parser
- * @param $holders LinkHolderArray
- * @param $markers LinkMarkerReplacer
- * @param Title $title
- * @param $titleText
- * @param null $displayText
- * @param bool $leadingColon
- * @return bool
- */
- static function defaultLinkHook( $parser, $holders, $markers,
- Title $title, $titleText, &$displayText = null, &$leadingColon = false ) {
- if( isset( $displayText ) && $markers->findMarker( $displayText ) ) {
- # There are links inside of the displayText
- # For backwards compatibility the deepest links are dominant so this
- # link should not be handled
- $displayText = $markers->expand( $displayText );
- # Return false so that this link is reverted back to WikiText
- return false;
- }
- return $holders->makeHolder( $title, isset( $displayText ) ? $displayText : $titleText, array(), '', '' );
- }
-
- /**
- * @param $parser Parser
- * @param $holders LinkHolderArray
- * @param $markers LinkMarkerReplacer
- * @param Title $title
- * @param $titleText
- * @param null $sortText
- * @param bool $leadingColon
- * @return bool|string
- */
- static function categoryLinkHook( $parser, $holders, $markers,
- Title $title, $titleText, &$sortText = null, &$leadingColon = false ) {
- global $wgContLang;
- # When a category link starts with a : treat it as a normal link
- if( $leadingColon ) return true;
- if( isset( $sortText ) && $markers->findMarker( $sortText ) ) {
- # There are links inside of the sortText
- # For backwards compatibility the deepest links are dominant so this
- # link should not be handled
- $sortText = $markers->expand( $sortText );
- # Return false so that this link is reverted back to WikiText
- return false;
- }
- if( !isset( $sortText ) ) $sortText = $parser->getDefaultSort();
- $sortText = Sanitizer::decodeCharReferences( $sortText );
- $sortText = str_replace( "\n", '', $sortText );
- $sortText = $wgContLang->convertCategoryKey( $sortText );
- $parser->mOutput->addCategory( $title->getDBkey(), $sortText );
- return '';
- }
-
-}
diff --git a/includes/parser/CoreParserFunctions.php b/includes/parser/CoreParserFunctions.php
index cdd03aa4..4b6eeca2 100644
--- a/includes/parser/CoreParserFunctions.php
+++ b/includes/parser/CoreParserFunctions.php
@@ -88,6 +88,8 @@ class CoreParserFunctions {
$parser->setFunctionHook( 'pagenamee', array( __CLASS__, 'pagenamee' ), SFH_NO_HASH );
$parser->setFunctionHook( 'fullpagename', array( __CLASS__, 'fullpagename' ), SFH_NO_HASH );
$parser->setFunctionHook( 'fullpagenamee', array( __CLASS__, 'fullpagenamee' ), SFH_NO_HASH );
+ $parser->setFunctionHook( 'rootpagename', array( __CLASS__, 'rootpagename' ), SFH_NO_HASH );
+ $parser->setFunctionHook( 'rootpagenamee', array( __CLASS__, 'rootpagenamee' ), SFH_NO_HASH );
$parser->setFunctionHook( 'basepagename', array( __CLASS__, 'basepagename' ), SFH_NO_HASH );
$parser->setFunctionHook( 'basepagenamee', array( __CLASS__, 'basepagenamee' ), SFH_NO_HASH );
$parser->setFunctionHook( 'subpagename', array( __CLASS__, 'subpagename' ), SFH_NO_HASH );
@@ -137,9 +139,10 @@ class CoreParserFunctions {
$pref = $parser->getOptions()->getDateFormat();
// Specify a different default date format other than the the normal default
- // iff the user has 'default' for their setting
- if ( $pref == 'default' && $defaultPref )
+ // if the user has 'default' for their setting
+ if ( $pref == 'default' && $defaultPref ) {
$pref = $defaultPref;
+ }
$date = $df->reformat( $pref, $date, array( 'match-whole' ) );
return $date;
@@ -184,7 +187,7 @@ class CoreParserFunctions {
if ( is_null( $magicWords ) ) {
$magicWords = new MagicWordArray( array( 'url_path', 'url_query', 'url_wiki' ) );
}
- switch( $magicWords->matchStartToEnd( $arg ) ) {
+ switch ( $magicWords->matchStartToEnd( $arg ) ) {
// Encode as though it's a wiki page, '_' for ' '.
case 'url_wiki':
@@ -248,14 +251,15 @@ class CoreParserFunctions {
# before arriving here; if that's true, then the title can't be created
# and the variable will fail. If we can't get a decent title from the first
# attempt, url-decode and try for a second.
- if( is_null( $title ) )
+ if ( is_null( $title ) ) {
$title = Title::newFromURL( urldecode( $s ) );
- if( !is_null( $title ) ) {
+ }
+ if ( !is_null( $title ) ) {
# Convert NS_MEDIA -> NS_FILE
- if( $title->getNamespace() == NS_MEDIA ) {
+ if ( $title->getNamespace() == NS_MEDIA ) {
$title = Title::makeTitle( NS_FILE, $title->getDBkey() );
}
- if( !is_null( $arg ) ) {
+ if ( !is_null( $arg ) ) {
$text = $title->$func( $arg );
} else {
$text = $title->$func();
@@ -359,30 +363,49 @@ class CoreParserFunctions {
static function displaytitle( $parser, $text = '' ) {
global $wgRestrictDisplayTitle;
- #parse a limited subset of wiki markup (just the single quote items)
+ // parse a limited subset of wiki markup (just the single quote items)
$text = $parser->doQuotes( $text );
- #remove stripped text (e.g. the UNIQ-QINU stuff) that was generated by tag extensions/whatever
+ // remove stripped text (e.g. the UNIQ-QINU stuff) that was generated by tag extensions/whatever
$text = preg_replace( '/' . preg_quote( $parser->uniqPrefix(), '/' ) . '.*?'
. preg_quote( Parser::MARKER_SUFFIX, '/' ) . '/', '', $text );
- #list of disallowed tags for DISPLAYTITLE
- #these will be escaped even though they are allowed in normal wiki text
+ // list of disallowed tags for DISPLAYTITLE
+ // these will be escaped even though they are allowed in normal wiki text
$bad = array( 'h1', 'h2', 'h3', 'h4', 'h5', 'h6', 'div', 'blockquote', 'ol', 'ul', 'li', 'hr',
'table', 'tr', 'th', 'td', 'dl', 'dd', 'caption', 'p', 'ruby', 'rb', 'rt', 'rp', 'br' );
- #only requested titles that normalize to the actual title are allowed through
- #if $wgRestrictDisplayTitle is true (it is by default)
- #mimic the escaping process that occurs in OutputPage::setPageTitle
- $text = Sanitizer::normalizeCharReferences( Sanitizer::removeHTMLtags( $text, null, array(), array(), $bad ) );
+ // disallow some styles that could be used to bypass $wgRestrictDisplayTitle
+ if ( $wgRestrictDisplayTitle ) {
+ $htmlTagsCallback = function ( &$params ) {
+ $decoded = Sanitizer::decodeTagAttributes( $params );
+
+ if ( isset( $decoded['style'] ) ) {
+ // this is called later anyway, but we need it right now for the regexes below to be safe
+ // calling it twice doesn't hurt
+ $decoded['style'] = Sanitizer::checkCss( $decoded['style'] );
+
+ if ( preg_match( '/(display|user-select|visibility)\s*:/i', $decoded['style'] ) ) {
+ $decoded['style'] = '/* attempt to bypass $wgRestrictDisplayTitle */';
+ }
+ }
+
+ $params = Sanitizer::safeEncodeTagAttributes( $decoded );
+ };
+ } else {
+ $htmlTagsCallback = null;
+ }
+
+ // only requested titles that normalize to the actual title are allowed through
+ // if $wgRestrictDisplayTitle is true (it is by default)
+ // mimic the escaping process that occurs in OutputPage::setPageTitle
+ $text = Sanitizer::normalizeCharReferences( Sanitizer::removeHTMLtags( $text, $htmlTagsCallback, array(), array(), $bad ) );
$title = Title::newFromText( Sanitizer::stripAllTags( $text ) );
- if( !$wgRestrictDisplayTitle ) {
+ if ( !$wgRestrictDisplayTitle ) {
+ $parser->mOutput->setDisplayTitle( $text );
+ } elseif ( $title instanceof Title && $title->getFragment() == '' && $title->equals( $parser->mTitle ) ) {
$parser->mOutput->setDisplayTitle( $text );
- } else {
- if ( $title instanceof Title && $title->getFragment() == '' && $title->equals( $parser->mTitle ) ) {
- $parser->mOutput->setDisplayTitle( $text );
- }
}
return '';
@@ -404,7 +427,7 @@ class CoreParserFunctions {
}
static function formatRaw( $num, $raw ) {
- if( self::matchAgainstMagicword( 'rawsuffix', $raw ) ) {
+ if ( self::matchAgainstMagicword( 'rawsuffix', $raw ) ) {
return $num;
} else {
global $wgContLang;
@@ -433,12 +456,13 @@ class CoreParserFunctions {
return self::formatRaw( SiteStats::edits(), $raw );
}
static function numberofviews( $parser, $raw = null ) {
- return self::formatRaw( SiteStats::views(), $raw );
+ global $wgDisableCounters;
+ return !$wgDisableCounters ? self::formatRaw( SiteStats::views(), $raw ) : '';
}
static function pagesinnamespace( $parser, $namespace = 0, $raw = null ) {
return self::formatRaw( SiteStats::pagesInNs( intval( $namespace ) ), $raw );
}
- static function numberingroup( $parser, $name = '', $raw = null) {
+ static function numberingroup( $parser, $name = '', $raw = null ) {
return self::formatRaw( SiteStats::numberingroup( strtolower( $name ) ), $raw );
}
@@ -451,44 +475,51 @@ class CoreParserFunctions {
*/
static function mwnamespace( $parser, $title = null ) {
$t = Title::newFromText( $title );
- if ( is_null( $t ) )
+ if ( is_null( $t ) ) {
return '';
+ }
return str_replace( '_', ' ', $t->getNsText() );
}
static function namespacee( $parser, $title = null ) {
$t = Title::newFromText( $title );
- if ( is_null( $t ) )
+ if ( is_null( $t ) ) {
return '';
+ }
return wfUrlencode( $t->getNsText() );
}
static function namespacenumber( $parser, $title = null ) {
$t = Title::newFromText( $title );
- if ( is_null( $t ) )
+ if ( is_null( $t ) ) {
return '';
+ }
return $t->getNamespace();
}
static function talkspace( $parser, $title = null ) {
$t = Title::newFromText( $title );
- if ( is_null( $t ) || !$t->canTalk() )
+ if ( is_null( $t ) || !$t->canTalk() ) {
return '';
+ }
return str_replace( '_', ' ', $t->getTalkNsText() );
}
static function talkspacee( $parser, $title = null ) {
$t = Title::newFromText( $title );
- if ( is_null( $t ) || !$t->canTalk() )
+ if ( is_null( $t ) || !$t->canTalk() ) {
return '';
+ }
return wfUrlencode( $t->getTalkNsText() );
}
static function subjectspace( $parser, $title = null ) {
$t = Title::newFromText( $title );
- if ( is_null( $t ) )
+ if ( is_null( $t ) ) {
return '';
+ }
return str_replace( '_', ' ', $t->getSubjectNsText() );
}
static function subjectspacee( $parser, $title = null ) {
$t = Title::newFromText( $title );
- if ( is_null( $t ) )
+ if ( is_null( $t ) ) {
return '';
+ }
return wfUrlencode( $t->getSubjectNsText() );
}
@@ -499,75 +530,101 @@ class CoreParserFunctions {
*/
static function pagename( $parser, $title = null ) {
$t = Title::newFromText( $title );
- if ( is_null( $t ) )
+ if ( is_null( $t ) ) {
return '';
+ }
return wfEscapeWikiText( $t->getText() );
}
static function pagenamee( $parser, $title = null ) {
$t = Title::newFromText( $title );
- if ( is_null( $t ) )
+ if ( is_null( $t ) ) {
return '';
+ }
return wfEscapeWikiText( $t->getPartialURL() );
}
static function fullpagename( $parser, $title = null ) {
$t = Title::newFromText( $title );
- if ( is_null( $t ) || !$t->canTalk() )
+ if ( is_null( $t ) || !$t->canTalk() ) {
return '';
+ }
return wfEscapeWikiText( $t->getPrefixedText() );
}
static function fullpagenamee( $parser, $title = null ) {
$t = Title::newFromText( $title );
- if ( is_null( $t ) || !$t->canTalk() )
+ if ( is_null( $t ) || !$t->canTalk() ) {
return '';
+ }
return wfEscapeWikiText( $t->getPrefixedURL() );
}
static function subpagename( $parser, $title = null ) {
$t = Title::newFromText( $title );
- if ( is_null( $t ) )
+ if ( is_null( $t ) ) {
return '';
+ }
return wfEscapeWikiText( $t->getSubpageText() );
}
static function subpagenamee( $parser, $title = null ) {
$t = Title::newFromText( $title );
- if ( is_null( $t ) )
+ if ( is_null( $t ) ) {
return '';
+ }
return wfEscapeWikiText( $t->getSubpageUrlForm() );
}
+ static function rootpagename( $parser, $title = null ) {
+ $t = Title::newFromText( $title );
+ if ( is_null( $t ) ) {
+ return '';
+ }
+ return wfEscapeWikiText( $t->getRootText() );
+ }
+ static function rootpagenamee( $parser, $title = null ) {
+ $t = Title::newFromText( $title );
+ if ( is_null( $t ) ) {
+ return '';
+ }
+ return wfEscapeWikiText( wfUrlEncode( str_replace( ' ', '_', $t->getRootText() ) ) );
+ }
static function basepagename( $parser, $title = null ) {
$t = Title::newFromText( $title );
- if ( is_null( $t ) )
+ if ( is_null( $t ) ) {
return '';
+ }
return wfEscapeWikiText( $t->getBaseText() );
}
static function basepagenamee( $parser, $title = null ) {
$t = Title::newFromText( $title );
- if ( is_null( $t ) )
+ if ( is_null( $t ) ) {
return '';
+ }
return wfEscapeWikiText( wfUrlEncode( str_replace( ' ', '_', $t->getBaseText() ) ) );
}
static function talkpagename( $parser, $title = null ) {
$t = Title::newFromText( $title );
- if ( is_null( $t ) || !$t->canTalk() )
+ if ( is_null( $t ) || !$t->canTalk() ) {
return '';
+ }
return wfEscapeWikiText( $t->getTalkPage()->getPrefixedText() );
}
static function talkpagenamee( $parser, $title = null ) {
$t = Title::newFromText( $title );
- if ( is_null( $t ) || !$t->canTalk() )
+ if ( is_null( $t ) || !$t->canTalk() ) {
return '';
- return wfEscapeWikiText( $t->getTalkPage()->getPrefixedUrl() );
+ }
+ return wfEscapeWikiText( $t->getTalkPage()->getPrefixedURL() );
}
static function subjectpagename( $parser, $title = null ) {
$t = Title::newFromText( $title );
- if ( is_null( $t ) )
+ if ( is_null( $t ) ) {
return '';
+ }
return wfEscapeWikiText( $t->getSubjectPage()->getPrefixedText() );
}
static function subjectpagenamee( $parser, $title = null ) {
$t = Title::newFromText( $title );
- if ( is_null( $t ) )
+ if ( is_null( $t ) ) {
return '';
- return wfEscapeWikiText( $t->getSubjectPage()->getPrefixedUrl() );
+ }
+ return wfEscapeWikiText( $t->getSubjectPage()->getPrefixedURL() );
}
/**
@@ -577,6 +634,7 @@ class CoreParserFunctions {
* @return string
*/
static function pagesincategory( $parser, $name = '', $arg1 = null, $arg2 = null ) {
+ global $wgContLang;
static $magicWords = null;
if ( is_null( $magicWords ) ) {
$magicWords = new MagicWordArray( array(
@@ -589,7 +647,7 @@ class CoreParserFunctions {
static $cache = array();
// split the given option to its variable
- if( self::matchAgainstMagicword( 'rawsuffix', $arg1 ) ) {
+ if ( self::matchAgainstMagicword( 'rawsuffix', $arg1 ) ) {
//{{pagesincategory:|raw[|type]}}
$raw = $arg1;
$type = $magicWords->matchStartToEnd( $arg2 );
@@ -598,23 +656,24 @@ class CoreParserFunctions {
$type = $magicWords->matchStartToEnd( $arg1 );
$raw = $arg2;
}
- if( !$type ) { //backward compatibility
+ if ( !$type ) { //backward compatibility
$type = 'pagesincategory_all';
}
$title = Title::makeTitleSafe( NS_CATEGORY, $name );
- if( !$title ) { # invalid title
+ if ( !$title ) { # invalid title
return self::formatRaw( 0, $raw );
}
+ $wgContLang->findVariantLink( $name, $title, true );
// Normalize name for cache
$name = $title->getDBkey();
- if( !isset( $cache[$name] ) ) {
+ if ( !isset( $cache[$name] ) ) {
$category = Category::newFromTitle( $title );
$allCount = $subcatCount = $fileCount = $pagesCount = 0;
- if( $parser->incrementExpensiveFunctionCount() ) {
+ if ( $parser->incrementExpensiveFunctionCount() ) {
// $allCount is the total number of cat members,
// not the count of how many members are normal pages.
$allCount = (int)$category->getPageCount();
@@ -636,8 +695,6 @@ class CoreParserFunctions {
* Return the size of the given page, or 0 if it's nonexistent. This is an
* expensive parser function and can't be called too many times per page.
*
- * @todo FIXME: This doesn't work correctly on preview for getting the size
- * of the current page.
* @todo FIXME: Title::getLength() documentation claims that it adds things
* to the link cache, so the local cache here should be unnecessary, but
* in fact calling getLength() repeatedly for the same $page does seem to
@@ -645,15 +702,15 @@ class CoreParserFunctions {
* @todo Document parameters
*
* @param $parser Parser
- * @param string $page TODO DOCUMENT (Default: empty string)
- * @param $raw TODO DOCUMENT (Default: null)
+ * @param $page String Name of page to check (Default: empty string)
+ * @param $raw String Should number be human readable with commas or just number
* @return string
*/
static function pagesize( $parser, $page = '', $raw = null ) {
static $cache = array();
$title = Title::newFromText( $page );
- if( !is_object( $title ) ) {
+ if ( !is_object( $title ) ) {
$cache[$page] = 0;
return self::formatRaw( 0, $raw );
}
@@ -662,9 +719,9 @@ class CoreParserFunctions {
$page = $title->getPrefixedText();
$length = 0;
- if( isset( $cache[$page] ) ) {
+ if ( isset( $cache[$page] ) ) {
$length = $cache[$page];
- } elseif( $parser->incrementExpensiveFunctionCount() ) {
+ } elseif ( $parser->incrementExpensiveFunctionCount() ) {
$rev = Revision::newFromTitle( $title, false, Revision::READ_NORMAL );
$pageID = $rev ? $rev->getPage() : 0;
$revID = $rev ? $rev->getId() : 0;
@@ -717,7 +774,9 @@ class CoreParserFunctions {
static function pad( $parser, $string, $length, $padding = '0', $direction = STR_PAD_RIGHT ) {
$padding = $parser->killMarkers( $padding );
$lengthOfPadding = mb_strlen( $padding );
- if ( $lengthOfPadding == 0 ) return $string;
+ if ( $lengthOfPadding == 0 ) {
+ return $string;
+ }
# The remaining length to add counts down to 0 as padding is added
$length = min( $length, 500 ) - mb_strlen( $string );
@@ -762,7 +821,9 @@ class CoreParserFunctions {
$title = SpecialPage::getTitleFor( $page, $subpage );
return $title->getPrefixedText();
} else {
- return wfMessage( 'nosuchspecialpage' )->inContentLanguage()->text();
+ // unknown special page, just use the given text as its title, if at all possible
+ $title = Title::makeTitleSafe( NS_SPECIAL, $text );
+ return $title ? $title->getPrefixedText() : self::special( $parser, 'Badtitle' );
}
}
@@ -786,19 +847,25 @@ class CoreParserFunctions {
$arg = $magicWords->matchStartToEnd( $uarg );
$text = trim( $text );
- if( strlen( $text ) == 0 )
+ if ( strlen( $text ) == 0 ) {
return '';
+ }
$old = $parser->getCustomDefaultSort();
if ( $old === false || $arg !== 'defaultsort_noreplace' ) {
$parser->setDefaultSort( $text );
}
- if( $old === false || $old == $text || $arg ) {
+ if ( $old === false || $old == $text || $arg ) {
return '';
} else {
- return( '<span class="error">' .
- wfMessage( 'duplicate-defaultsort', $old, $text )->inContentLanguage()->escaped() .
- '</span>' );
+ $converter = $parser->getConverterLanguage()->getConverter();
+ return '<span class="error">' .
+ wfMessage( 'duplicate-defaultsort',
+ // Message should be parsed, but these params should only be escaped.
+ $converter->markNoConversion( wfEscapeWikiText( $old ) ),
+ $converter->markNoConversion( wfEscapeWikiText( $text ) )
+ )->inContentLanguage()->text() .
+ '</span>';
}
}
@@ -807,14 +874,14 @@ class CoreParserFunctions {
public static function filepath( $parser, $name = '', $argA = '', $argB = '' ) {
$file = wfFindFile( $name );
- if( $argA == 'nowiki' ) {
+ if ( $argA == 'nowiki' ) {
// {{filepath: | option [| size] }}
$isNowiki = true;
$parsedWidthParam = $parser->parseWidthParam( $argB );
} else {
// {{filepath: [| size [|option]] }}
$parsedWidthParam = $parser->parseWidthParam( $argA );
- $isNowiki = ($argB == 'nowiki');
+ $isNowiki = ( $argB == 'nowiki' );
}
if ( $file ) {
diff --git a/includes/parser/CoreTagHooks.php b/includes/parser/CoreTagHooks.php
index 65051839..a2eb6987 100644
--- a/includes/parser/CoreTagHooks.php
+++ b/includes/parser/CoreTagHooks.php
@@ -77,7 +77,7 @@ class CoreTagHooks {
*/
static function html( $content, $attributes, $parser ) {
global $wgRawHtml;
- if( $wgRawHtml ) {
+ if ( $wgRawHtml ) {
return array( $content, 'markerType' => 'nowiki' );
} else {
throw new MWException( '<html> extension tag encountered unexpectedly' );
diff --git a/includes/parser/DateFormatter.php b/includes/parser/DateFormatter.php
index a2da3074..0a69b045 100644
--- a/includes/parser/DateFormatter.php
+++ b/includes/parser/DateFormatter.php
@@ -156,10 +156,10 @@ class DateFormatter {
}
for ( $i = 1; $i <= self::LAST; $i++ ) {
$this->mSource = $i;
- if ( isset ( $this->rules[$preference][$i] ) ) {
+ if ( isset( $this->rules[$preference][$i] ) ) {
# Specific rules
$this->mTarget = $this->rules[$preference][$i];
- } elseif ( isset ( $this->rules[self::ALL][$i] ) ) {
+ } elseif ( isset( $this->rules[self::ALL][$i] ) ) {
# General rules
$this->mTarget = $this->rules[self::ALL][$i];
} elseif ( $preference ) {
@@ -198,14 +198,15 @@ class DateFormatter {
function replace( $matches ) {
# Extract information from $matches
$linked = true;
- if ( isset( $this->mLinked ) )
+ if ( isset( $this->mLinked ) ) {
$linked = $this->mLinked;
+ }
$bits = array();
$key = $this->keys[$this->mSource];
for ( $p = 0; $p < strlen( $key ); $p++ ) {
if ( $key[$p] != ' ' ) {
- $bits[$key[$p]] = $matches[$p+1];
+ $bits[$key[$p]] = $matches[$p + 1];
}
}
@@ -232,10 +233,12 @@ class DateFormatter {
$fail = false;
// Pre-generate y/Y stuff because we need the year for the <span> title.
- if ( !isset( $bits['y'] ) && isset( $bits['Y'] ) )
+ if ( !isset( $bits['y'] ) && isset( $bits['Y'] ) ) {
$bits['y'] = $this->makeIsoYear( $bits['Y'] );
- if ( !isset( $bits['Y'] ) && isset( $bits['y'] ) )
+ }
+ if ( !isset( $bits['Y'] ) && isset( $bits['y'] ) ) {
$bits['Y'] = $this->makeNormalYear( $bits['y'] );
+ }
if ( !isset( $bits['m'] ) ) {
$m = $this->makeIsoMonth( $bits['F'] );
@@ -293,8 +296,9 @@ class DateFormatter {
}
$isoBits = array();
- if ( isset( $bits['y'] ) )
+ if ( isset( $bits['y'] ) ) {
$isoBits[] = $bits['y'];
+ }
$isoBits[] = $bits['m'];
$isoBits[] = $bits['d'];
$isoDate = implode( '-', $isoBits );
@@ -312,7 +316,7 @@ class DateFormatter {
*/
function getMonthRegex() {
$names = array();
- for( $i = 1; $i <= 12; $i++ ) {
+ for ( $i = 1; $i <= 12; $i++ ) {
$names[] = $this->lang->getMonthName( $i );
$names[] = $this->lang->getMonthAbbreviation( $i );
}
@@ -337,7 +341,7 @@ class DateFormatter {
function makeIsoYear( $year ) {
# Assumes the year is in a nice format, as enforced by the regex
if ( substr( $year, -2 ) == 'BC' ) {
- $num = intval(substr( $year, 0, -3 )) - 1;
+ $num = intval( substr( $year, 0, -3 ) ) - 1;
# PHP bug note: sprintf( "%04d", -1 ) fails poorly
$text = sprintf( '-%04d', $num );
@@ -353,7 +357,7 @@ class DateFormatter {
*/
function makeNormalYear( $iso ) {
if ( $iso[0] == '-' ) {
- $text = (intval( substr( $iso, 1 ) ) + 1) . ' BC';
+ $text = ( intval( substr( $iso, 1 ) ) + 1 ) . ' BC';
} else {
$text = intval( $iso );
}
diff --git a/includes/parser/LinkHolderArray.php b/includes/parser/LinkHolderArray.php
index 49b2d333..27ff9e7d 100644
--- a/includes/parser/LinkHolderArray.php
+++ b/includes/parser/LinkHolderArray.php
@@ -281,88 +281,90 @@ class LinkHolderArray {
$linkCache = LinkCache::singleton();
$output = $this->parent->getOutput();
- wfProfileIn( __METHOD__ . '-check' );
- $dbr = wfGetDB( DB_SLAVE );
- $threshold = $this->parent->getOptions()->getStubThreshold();
+ if( $linkCache->useDatabase() ) {
+ wfProfileIn( __METHOD__ . '-check' );
+ $dbr = wfGetDB( DB_SLAVE );
+ $threshold = $this->parent->getOptions()->getStubThreshold();
- # Sort by namespace
- ksort( $this->internals );
+ # Sort by namespace
+ ksort( $this->internals );
- $linkcolour_ids = array();
+ $linkcolour_ids = array();
- # Generate query
- $queries = array();
- foreach ( $this->internals as $ns => $entries ) {
- foreach ( $entries as $entry ) {
- $title = $entry['title'];
- $pdbk = $entry['pdbk'];
+ # Generate query
+ $queries = array();
+ foreach ( $this->internals as $ns => $entries ) {
+ foreach ( $entries as $entry ) {
+ $title = $entry['title'];
+ $pdbk = $entry['pdbk'];
- # Skip invalid entries.
- # Result will be ugly, but prevents crash.
- if ( is_null( $title ) ) {
- continue;
- }
+ # Skip invalid entries.
+ # Result will be ugly, but prevents crash.
+ if ( is_null( $title ) ) {
+ continue;
+ }
- # 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] = Linker::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
- $queries[$ns][] = $title->getDBkey();
+ # 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] = Linker::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
+ $queries[$ns][] = $title->getDBkey();
+ }
}
}
- }
- if ( $queries ) {
- $where = array();
- foreach( $queries as $ns => $pages ) {
- $where[] = $dbr->makeList(
- array(
- 'page_namespace' => $ns,
- 'page_title' => $pages,
- ),
- LIST_AND
- );
- }
+ if ( $queries ) {
+ $where = array();
+ foreach ( $queries as $ns => $pages ) {
+ $where[] = $dbr->makeList(
+ array(
+ 'page_namespace' => $ns,
+ 'page_title' => $pages,
+ ),
+ LIST_AND
+ );
+ }
- $res = $dbr->select(
- 'page',
- array( 'page_id', 'page_namespace', 'page_title', 'page_is_redirect', 'page_len', 'page_latest' ),
- $dbr->makeList( $where, LIST_OR ),
- __METHOD__
- );
+ $res = $dbr->select(
+ 'page',
+ array( 'page_id', 'page_namespace', 'page_title', 'page_is_redirect', 'page_len', 'page_latest' ),
+ $dbr->makeList( $where, LIST_OR ),
+ __METHOD__
+ );
- # Fetch data and form into an associative array
- # non-existent = broken
- foreach ( $res as $s ) {
- $title = Title::makeTitle( $s->page_namespace, $s->page_title );
- $pdbk = $title->getPrefixedDBkey();
- $linkCache->addGoodLinkObjFromRow( $title, $s );
- $output->addLink( $title, $s->page_id );
- # @todo FIXME: Convoluted data flow
- # The redirect status and length is passed to getLinkColour via the LinkCache
- # Use formal parameters instead
- $colours[$pdbk] = Linker::getLinkColour( $title, $threshold );
- //add id to the extension todolist
- $linkcolour_ids[$s->page_id] = $pdbk;
+ # Fetch data and form into an associative array
+ # non-existent = broken
+ foreach ( $res as $s ) {
+ $title = Title::makeTitle( $s->page_namespace, $s->page_title );
+ $pdbk = $title->getPrefixedDBkey();
+ $linkCache->addGoodLinkObjFromRow( $title, $s );
+ $output->addLink( $title, $s->page_id );
+ # @todo FIXME: Convoluted data flow
+ # The redirect status and length is passed to getLinkColour via the LinkCache
+ # Use formal parameters instead
+ $colours[$pdbk] = Linker::getLinkColour( $title, $threshold );
+ //add id to the extension todolist
+ $linkcolour_ids[$s->page_id] = $pdbk;
+ }
+ unset( $res );
}
- unset( $res );
- }
- if ( count( $linkcolour_ids ) ) {
- //pass an array of page_ids to an extension
- wfRunHooks( 'GetLinkColours', array( $linkcolour_ids, &$colours ) );
+ if ( count( $linkcolour_ids ) ) {
+ //pass an array of page_ids to an extension
+ wfRunHooks( 'GetLinkColours', array( $linkcolour_ids, &$colours ) );
+ }
+ wfProfileOut( __METHOD__ . '-check' );
}
- wfProfileOut( __METHOD__ . '-check' );
# Do a second query for different language variants of links and categories
- if( $wgContLang->hasVariants() ) {
+ if ( $wgContLang->hasVariants() ) {
$this->doVariants( $colours );
}
@@ -377,6 +379,10 @@ class LinkHolderArray {
$key = "$ns:$index";
$searchkey = "<!--LINK $key-->";
$displayText = $entry['text'];
+ if ( isset( $entry['selflink'] ) ) {
+ $replacePairs[$searchkey] = Linker::makeSelfLinkObj( $title, $displayText, $query );
+ continue;
+ }
if ( $displayText === '' ) {
$displayText = null;
}
@@ -406,7 +412,8 @@ class LinkHolderArray {
$text = preg_replace_callback(
'/(<!--LINK .*?-->)/',
$replacer->cb(),
- $text);
+ $text
+ );
wfProfileOut( __METHOD__ . '-replace' );
wfProfileOut( __METHOD__ );
@@ -424,7 +431,7 @@ class LinkHolderArray {
# Make interwiki link HTML
$output = $this->parent->getOutput();
$replacePairs = array();
- foreach( $this->interwikis as $key => $link ) {
+ foreach ( $this->interwikis as $key => $link ) {
$replacePairs[$key] = Linker::link( $link['title'], $link['text'] );
$output->addInterwikiLink( $link['title'] );
}
@@ -454,20 +461,17 @@ class LinkHolderArray {
// single string to all variants. This would improve parser's performance
// significantly.
foreach ( $this->internals as $ns => $entries ) {
+ if ( $ns == NS_SPECIAL ) {
+ continue;
+ }
foreach ( $entries as $index => $entry ) {
$pdbk = $entry['pdbk'];
// we only deal with new links (in its first query)
if ( !isset( $colours[$pdbk] ) || $colours[$pdbk] === 'new' ) {
- $title = $entry['title'];
- $titleText = $title->getText();
- $titlesAttrs[] = array(
- 'ns' => $ns,
- 'key' => "$ns:$index",
- 'titleText' => $titleText,
- );
+ $titlesAttrs[] = array( $index, $entry['title'] );
// separate titles with \0 because it would never appears
// in a valid title
- $titlesToBeConverted .= $titleText . "\0";
+ $titlesToBeConverted .= $entry['title']->getText() . "\0";
}
}
}
@@ -478,19 +482,35 @@ class LinkHolderArray {
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 ++ ) {
+ $parentTitle = $this->parent->getTitle();
+ foreach ( $titlesAttrs as $i => $attrs ) {
+ list( $index, $title ) = $attrs;
+ $ns = $title->getNamespace();
+ $text = $title->getText();
+
foreach ( $allVariantsName as $variantName ) {
$textVariant = $titlesAllVariants[$variantName][$i];
- if ( $textVariant != $titlesAttrs[$i]['titleText'] ) {
- $variantTitle = Title::makeTitle( $titlesAttrs[$i]['ns'], $textVariant );
- if( is_null( $variantTitle ) ) {
- continue;
- }
- $linkBatch->addObj( $variantTitle );
- $variantMap[$variantTitle->getPrefixedDBkey()][] = $titlesAttrs[$i]['key'];
+ if ( $textVariant === $text ) {
+ continue;
}
+
+ $variantTitle = Title::makeTitle( $ns, $textVariant );
+ if ( is_null( $variantTitle ) ) {
+ continue;
+ }
+
+ // Self-link checking for mixed/different variant titles. At this point, we
+ // already know the exact title does not exist, so the link cannot be to a
+ // variant of the current title that exists as a separate page.
+ if ( $variantTitle->equals( $parentTitle ) && $title->getFragment() === '' ) {
+ $this->internals[$ns][$index]['selflink'] = true;
+ continue 2;
+ }
+
+ $linkBatch->addObj( $variantTitle );
+ $variantMap[$variantTitle->getPrefixedDBkey()][] = "$ns:$index";
}
}
@@ -513,7 +533,7 @@ class LinkHolderArray {
}
}
- if( !$linkBatch->isEmpty() ) {
+ if ( !$linkBatch->isEmpty() ) {
// construct query
$dbr = wfGetDB( DB_SLAVE );
$varRes = $dbr->select( 'page',
@@ -532,14 +552,14 @@ class LinkHolderArray {
$vardbk = $variantTitle->getDBkey();
$holderKeys = array();
- if( isset( $variantMap[$varPdbk] ) ) {
+ if ( isset( $variantMap[$varPdbk] ) ) {
$holderKeys = $variantMap[$varPdbk];
$linkCache->addGoodLinkObjFromRow( $variantTitle, $s );
$output->addLink( $variantTitle, $s->page_id );
}
// loop over link holders
- foreach( $holderKeys as $key ) {
+ foreach ( $holderKeys as $key ) {
list( $ns, $index ) = explode( ':', $key, 2 );
$entry =& $this->internals[$ns][$index];
$pdbk = $entry['pdbk'];
@@ -569,12 +589,12 @@ class LinkHolderArray {
wfRunHooks( 'GetLinkColours', array( $linkcolour_ids, &$colours ) );
// rebuild the categories in original order (if there are replacements)
- if( count( $varCategories ) > 0 ) {
+ if ( count( $varCategories ) > 0 ) {
$newCats = array();
$originalCats = $output->getCategories();
- foreach( $originalCats as $cat => $sortkey ) {
+ foreach ( $originalCats as $cat => $sortkey ) {
// make the replacement
- if( array_key_exists( $cat, $varCategories ) ) {
+ if ( array_key_exists( $cat, $varCategories ) ) {
$newCats[$varCategories[$cat]] = $sortkey;
} else {
$newCats[$cat] = $sortkey;
@@ -614,13 +634,13 @@ class LinkHolderArray {
function replaceTextCallback( $matches ) {
$type = $matches[1];
$key = $matches[2];
- if( $type == 'LINK' ) {
+ if ( $type == 'LINK' ) {
list( $ns, $index ) = explode( ':', $key, 2 );
- if( isset( $this->internals[$ns][$index]['text'] ) ) {
+ if ( isset( $this->internals[$ns][$index]['text'] ) ) {
return $this->internals[$ns][$index]['text'];
}
- } elseif( $type == 'IWLINK' ) {
- if( isset( $this->interwikis[$key]['text'] ) ) {
+ } elseif ( $type == 'IWLINK' ) {
+ if ( isset( $this->interwikis[$key]['text'] ) ) {
return $this->interwikis[$key]['text'];
}
}
diff --git a/includes/parser/Parser.php b/includes/parser/Parser.php
index 5ef0bc71..1f14223d 100644
--- a/includes/parser/Parser.php
+++ b/includes/parser/Parser.php
@@ -28,7 +28,7 @@
/**
* PHP Parser - Processes wiki markup (which uses a more user-friendly
* syntax, such as "[[link]]" for making links), and provides a one-way
- * transformation of that wiki markup it into XHTML output / markup
+ * transformation of that wiki markup it into (X)HTML output / markup
* (which in turn the browser understands, and can display).
*
* There are seven main entry points into the Parser class:
@@ -54,7 +54,6 @@
* @warning $wgUser or $wgTitle or $wgRequest or $wgLang. Keep them away!
*
* @par Settings:
- * $wgLocaltimezone
* $wgNamespacesWithSubpages
*
* @par Settings only within ParserOptions:
@@ -116,6 +115,10 @@ class Parser {
# Marker Suffix needs to be accessible staticly.
const MARKER_SUFFIX = "-QINU\x7f";
+ # Markers used for wrapping the table of contents
+ const TOC_START = '<mw:toc>';
+ const TOC_END = '</mw:toc>';
+
# Persistent:
var $mTagHooks = array();
var $mTransparentTagHooks = array();
@@ -192,7 +195,9 @@ class Parser {
var $mRevisionId; # ID to display in {{REVISIONID}} tags
var $mRevisionTimestamp; # The timestamp of the specified revision ID
var $mRevisionUser; # User to display in {{REVISIONUSER}} tag
+ var $mRevisionSize; # Size to display in {{REVISIONSIZE}} variable
var $mRevIdForTs; # The revision ID which was used to fetch the timestamp
+ var $mInputSize = false; # For {{PAGESIZE}} on current page.
/**
* @var string
@@ -218,8 +223,8 @@ class Parser {
self::EXT_LINK_URL_CLASS . '+)\p{Zs}*([^\]\\x00-\\x08\\x0a-\\x1F]*?)\]/Su';
if ( isset( $conf['preprocessorClass'] ) ) {
$this->mPreprocessorClass = $conf['preprocessorClass'];
- } elseif ( defined( 'MW_COMPILED' ) ) {
- # Preprocessor_Hash is much faster than Preprocessor_DOM in compiled mode
+ } elseif ( defined( 'HPHP_VERSION' ) ) {
+ # Preprocessor_Hash is much faster than Preprocessor_DOM under HipHop
$this->mPreprocessorClass = 'Preprocessor_Hash';
} elseif ( extension_loaded( 'domxml' ) ) {
# PECL extension that conflicts with the core DOM extension (bug 13770)
@@ -292,7 +297,7 @@ class Parser {
$this->mLinkHolders = new LinkHolderArray( $this );
$this->mLinkID = 0;
$this->mRevisionObject = $this->mRevisionTimestamp =
- $this->mRevisionId = $this->mRevisionUser = null;
+ $this->mRevisionId = $this->mRevisionUser = $this->mRevisionSize = null;
$this->mVarCache = array();
$this->mUser = null;
$this->mLangLinkLanguages = array();
@@ -354,13 +359,18 @@ class Parser {
* to internalParse() which does all the real work.
*/
- global $wgUseTidy, $wgAlwaysUseTidy;
+ global $wgUseTidy, $wgAlwaysUseTidy, $wgShowHostnames;
$fname = __METHOD__ . '-' . wfGetCaller();
wfProfileIn( __METHOD__ );
wfProfileIn( $fname );
$this->startParse( $title, $options, self::OT_HTML, $clearState );
+ $this->mInputSize = strlen( $text );
+ if ( $this->mOptions->getEnableLimitReport() ) {
+ $this->mOutput->resetParseStartTime();
+ }
+
# Remove the strip marker tag prefix from the input, if present.
if ( $clearState ) {
$text = str_replace( $this->mUniqPrefix, '', $text );
@@ -370,11 +380,13 @@ class Parser {
$oldRevisionObject = $this->mRevisionObject;
$oldRevisionTimestamp = $this->mRevisionTimestamp;
$oldRevisionUser = $this->mRevisionUser;
+ $oldRevisionSize = $this->mRevisionSize;
if ( $revid !== null ) {
$this->mRevisionId = $revid;
$this->mRevisionObject = null;
$this->mRevisionTimestamp = null;
$this->mRevisionUser = null;
+ $this->mRevisionSize = null;
}
wfRunHooks( 'ParserBeforeStrip', array( &$this, &$text, &$this->mStripState ) );
@@ -490,22 +502,67 @@ class Parser {
# Information on include size limits, for the benefit of users who try to skirt them
if ( $this->mOptions->getEnableLimitReport() ) {
$max = $this->mOptions->getMaxIncludeSize();
- $PFreport = "Expensive parser function count: {$this->mExpensiveFunctionCount}/{$this->mOptions->getExpensiveParserFunctionLimit()}\n";
- $limitReport =
- "NewPP limit report\n" .
- "Preprocessor visited node count: {$this->mPPNodeCount}/{$this->mOptions->getMaxPPNodeCount()}\n" .
- "Preprocessor generated node count: " .
- "{$this->mGeneratedPPNodeCount}/{$this->mOptions->getMaxGeneratedPPNodeCount()}\n" .
- "Post-expand include size: {$this->mIncludeSizes['post-expand']}/$max bytes\n" .
- "Template argument size: {$this->mIncludeSizes['arg']}/$max bytes\n" .
- "Highest expansion depth: {$this->mHighestExpansionDepth}/{$this->mOptions->getMaxPPExpandDepth()}\n" .
- $PFreport;
+
+ $cpuTime = $this->mOutput->getTimeSinceStart( 'cpu' );
+ if ( $cpuTime !== null ) {
+ $this->mOutput->setLimitReportData( 'limitreport-cputime',
+ sprintf( "%.3f", $cpuTime )
+ );
+ }
+
+ $wallTime = $this->mOutput->getTimeSinceStart( 'wall' );
+ $this->mOutput->setLimitReportData( 'limitreport-walltime',
+ sprintf( "%.3f", $wallTime )
+ );
+
+ $this->mOutput->setLimitReportData( 'limitreport-ppvisitednodes',
+ array( $this->mPPNodeCount, $this->mOptions->getMaxPPNodeCount() )
+ );
+ $this->mOutput->setLimitReportData( 'limitreport-ppgeneratednodes',
+ array( $this->mGeneratedPPNodeCount, $this->mOptions->getMaxGeneratedPPNodeCount() )
+ );
+ $this->mOutput->setLimitReportData( 'limitreport-postexpandincludesize',
+ array( $this->mIncludeSizes['post-expand'], $max )
+ );
+ $this->mOutput->setLimitReportData( 'limitreport-templateargumentsize',
+ array( $this->mIncludeSizes['arg'], $max )
+ );
+ $this->mOutput->setLimitReportData( 'limitreport-expansiondepth',
+ array( $this->mHighestExpansionDepth, $this->mOptions->getMaxPPExpandDepth() )
+ );
+ $this->mOutput->setLimitReportData( 'limitreport-expensivefunctioncount',
+ array( $this->mExpensiveFunctionCount, $this->mOptions->getExpensiveParserFunctionLimit() )
+ );
+ wfRunHooks( 'ParserLimitReportPrepare', array( $this, $this->mOutput ) );
+
+ $limitReport = "NewPP limit report\n";
+ if ( $wgShowHostnames ) {
+ $limitReport .= 'Parsed by ' . wfHostname() . "\n";
+ }
+ foreach ( $this->mOutput->getLimitReportData() as $key => $value ) {
+ if ( wfRunHooks( 'ParserLimitReportFormat',
+ array( $key, $value, &$limitReport, false, false )
+ ) ) {
+ $keyMsg = wfMessage( $key )->inLanguage( 'en' )->useDatabase( false );
+ $valueMsg = wfMessage( array( "$key-value-text", "$key-value" ) )
+ ->inLanguage( 'en' )->useDatabase( false );
+ if ( !$valueMsg->exists() ) {
+ $valueMsg = new RawMessage( '$1' );
+ }
+ if ( !$keyMsg->isDisabled() && !$valueMsg->isDisabled() ) {
+ $valueMsg->params( $value );
+ $limitReport .= "{$keyMsg->text()}: {$valueMsg->text()}\n";
+ }
+ }
+ }
+ // Since we're not really outputting HTML, decode the entities and
+ // then re-encode the things that need hiding inside HTML comments.
+ $limitReport = htmlspecialchars_decode( $limitReport );
wfRunHooks( 'ParserLimitReport', array( $this, &$limitReport ) );
// Sanitize for comment. Note 'â€' in the replacement is U+2010,
// which looks much like the problematic '-'.
$limitReport = str_replace( array( '-', '&' ), array( 'â€', '&amp;' ), $limitReport );
-
$text .= "\n<!-- \n$limitReport-->\n";
if ( $this->mGeneratedPPNodeCount > $this->mOptions->getMaxGeneratedPPNodeCount() / 10 ) {
@@ -519,6 +576,8 @@ class Parser {
$this->mRevisionObject = $oldRevisionObject;
$this->mRevisionTimestamp = $oldRevisionTimestamp;
$this->mRevisionUser = $oldRevisionUser;
+ $this->mRevisionSize = $oldRevisionSize;
+ $this->mInputSize = false;
wfProfileOut( $fname );
wfProfileOut( __METHOD__ );
@@ -536,7 +595,7 @@ class Parser {
*
* @return string
*/
- function recursiveTagParse( $text, $frame=false ) {
+ function recursiveTagParse( $text, $frame = false ) {
wfProfileIn( __METHOD__ );
wfRunHooks( 'ParserBeforeStrip', array( &$this, &$text, &$this->mStripState ) );
wfRunHooks( 'ParserAfterStrip', array( &$this, &$text, &$this->mStripState ) );
@@ -769,9 +828,9 @@ class Parser {
if ( $target !== null ) {
return $target;
- } elseif( $this->mOptions->getInterfaceMessage() ) {
+ } elseif ( $this->mOptions->getInterfaceMessage() ) {
return $this->mOptions->getUserLangObj();
- } elseif( is_null( $this->mTitle ) ) {
+ } elseif ( is_null( $this->mTitle ) ) {
throw new MWException( __METHOD__ . ': $this->mTitle is null' );
}
@@ -1256,8 +1315,8 @@ class Parser {
'x' => 'X',
));
$titleObj = SpecialPage::getTitleFor( 'Booksources', $num );
- return'<a href="' .
- htmlspecialchars( $titleObj->getLocalUrl() ) .
+ return '<a href="' .
+ htmlspecialchars( $titleObj->getLocalURL() ) .
"\" class=\"internal mw-magiclink-isbn\">ISBN $isbn</a>";
} else {
return $m[0];
@@ -1366,165 +1425,186 @@ class Parser {
*/
public function doQuotes( $text ) {
$arr = preg_split( "/(''+)/", $text, -1, PREG_SPLIT_DELIM_CAPTURE );
- if ( count( $arr ) == 1 ) {
+ $countarr = count( $arr );
+ if ( $countarr == 1 ) {
return $text;
- } 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.
- $numbold = 0;
- $numitalics = 0;
- 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 ) {
- $arr[$i-1] .= "'";
- $arr[$i] = "'''";
- } 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++;
- } elseif ( strlen( $arr[$i] ) == 3 ) {
- $numbold++;
- } elseif ( strlen( $arr[$i] ) == 5 ) {
- $numitalics++;
- $numbold++;
- }
- }
+ }
+
+ // 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.
+ $numbold = 0;
+ $numitalics = 0;
+ for ( $i = 1; $i < $countarr; $i += 2 ) {
+ $thislen = strlen( $arr[$i] );
+ // If there are ever four apostrophes, assume the first is supposed to
+ // be text, and the remaining three constitute mark-up for bold text.
+ // (bug 13227: ''''foo'''' turns into ' ''' foo ' ''')
+ if ( $thislen == 4 ) {
+ $arr[$i - 1] .= "'";
+ $arr[$i] = "'''";
+ $thislen = 3;
+ } elseif ( $thislen > 5 ) {
+ // If there are more than 5 apostrophes in a row, assume they're all
+ // text except for the last 5.
+ // (bug 13227: ''''''foo'''''' turns into ' ''''' foo ' ''''')
+ $arr[$i - 1] .= str_repeat( "'", $thislen - 5 );
+ $arr[$i] = "'''''";
+ $thislen = 5;
}
+ // Count the number of occurrences of bold and italics mark-ups.
+ if ( $thislen == 2 ) {
+ $numitalics++;
+ } elseif ( $thislen == 3 ) {
+ $numbold++;
+ } elseif ( $thislen == 5 ) {
+ $numitalics++;
+ $numbold++;
+ }
+ }
- # 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 ) ) {
- $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;
- }
- } elseif ( $x2 === ' ' ) {
- if ( $firstsingleletterword == -1 ) {
- $firstsingleletterword = $i;
- }
- } else {
- if ( $firstmultiletterword == -1 ) {
- $firstmultiletterword = $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 ) ) {
+ $firstsingleletterword = -1;
+ $firstmultiletterword = -1;
+ $firstspace = -1;
+ for ( $i = 1; $i < $countarr; $i += 2 ) {
+ if ( strlen( $arr[$i] ) == 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;
+ // if $firstsingleletterword is set, we don't
+ // look at the other options, so we can bail early.
+ break;
+ }
+ } else {
+ if ( $firstmultiletterword == -1 ) {
+ $firstmultiletterword = $i;
}
}
- $i++;
}
+ }
- # If there is a single-letter word, use it!
- 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] .= "'";
- }
+ // If there is a single-letter word, use it!
+ 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] .= "'";
}
+ }
- # Now let's actually convert our apostrophic mush to HTML!
- $output = '';
- $buffer = '';
- $state = '';
- $i = 0;
- foreach ( $arr as $r ) {
- if ( ( $i % 2 ) == 0 ) {
- if ( $state === 'both' ) {
- $buffer .= $r;
- } else {
- $output .= $r;
- }
+ // Now let's actually convert our apostrophic mush to HTML!
+ $output = '';
+ $buffer = '';
+ $state = '';
+ $i = 0;
+ foreach ( $arr as $r ) {
+ if ( ( $i % 2 ) == 0 ) {
+ if ( $state === 'both' ) {
+ $buffer .= $r;
} 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';
- }
+ $output .= $r;
+ }
+ } else {
+ $thislen = strlen( $r );
+ if ( $thislen == 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 ( $thislen == 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 ( $thislen == 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' ) {
- $output .= '</b>';
}
- if ( $state === 'i' || $state === 'bi' || $state === 'ib' ) {
- $output .= '</i>';
- }
- if ( $state === 'bi' ) {
- $output .= '</b>';
- }
- # There might be lonely ''''', so make sure we have a buffer
- if ( $state === 'both' && $buffer ) {
- $output .= '<b><i>' . $buffer . '</i></b>';
- }
- return $output;
+ $i++;
+ }
+ // Now close all remaining tags. Notice that the order is important.
+ if ( $state === 'b' || $state === 'ib' ) {
+ $output .= '</b>';
+ }
+ if ( $state === 'i' || $state === 'bi' || $state === 'ib' ) {
+ $output .= '</i>';
+ }
+ if ( $state === 'bi' ) {
+ $output .= '</b>';
+ }
+ // There might be lonely ''''', so make sure we have a buffer
+ if ( $state === 'both' && $buffer ) {
+ $output .= '<b><i>' . $buffer . '</i></b>';
}
+ return $output;
}
/**
* Replace external links (REL)
*
* Note: this is all very hackish and the order of execution matters a lot.
- * Make sure to run maintenance/parserTests.php if you change this code.
+ * Make sure to run tests/parserTests.php if you change this code.
*
* @private
*
@@ -1538,12 +1618,13 @@ class Parser {
$bits = preg_split( $this->mExtLinkBracketedRegex, $text, -1, PREG_SPLIT_DELIM_CAPTURE );
if ( $bits === false ) {
+ wfProfileOut( __METHOD__ );
throw new MWException( "PCRE needs to be compiled with --enable-unicode-properties in order for MediaWiki to function" );
}
$s = array_shift( $bits );
$i = 0;
- while ( $i<count( $bits ) ) {
+ while ( $i < count( $bits ) ) {
$url = $bits[$i++];
$i++; // protocol
$text = $bits[$i++];
@@ -2036,16 +2117,12 @@ class Parser {
}
}
- # Self-link checking
- if ( $nt->getFragment() === '' && $ns != NS_SPECIAL ) {
- if ( $nt->equals( $this->mTitle ) || ( !$nt->isKnown() && in_array(
- $this->mTitle->getPrefixedText(),
- $this->getConverterLanguage()->autoConvertToAllVariants( $nt->getPrefixedText() ),
- true
- ) ) ) {
- $s .= $prefix . Linker::makeSelfLinkObj( $nt, $text, '', $trail );
- continue;
- }
+ # Self-link checking. For some languages, variants of the title are checked in
+ # LinkHolderArray::doVariants() to allow batching the existence checks necessary
+ # for linking to a different variant.
+ if ( $ns != NS_SPECIAL && $nt->equals( $this->mTitle ) && $nt->getFragment() === '' ) {
+ $s .= $prefix . Linker::makeSelfLinkObj( $nt, $text, '', $trail );
+ continue;
}
# NS_MEDIA is a pseudo-namespace for linking directly to a file
@@ -2159,7 +2236,7 @@ class Parser {
function closeParagraph() {
$result = '';
if ( $this->mLastSection != '' ) {
- $result = '</' . $this->mLastSection . ">\n";
+ $result = '</' . $this->mLastSection . ">\n";
}
$this->mInPre = false;
$this->mLastSection = '';
@@ -2204,13 +2281,13 @@ class Parser {
$result = $this->closeParagraph();
if ( '*' === $char ) {
- $result .= '<ul><li>';
+ $result .= "<ul>\n<li>";
} elseif ( '#' === $char ) {
- $result .= '<ol><li>';
+ $result .= "<ol>\n<li>";
} elseif ( ':' === $char ) {
- $result .= '<dl><dd>';
+ $result .= "<dl>\n<dd>";
} elseif ( ';' === $char ) {
- $result .= '<dl><dt>';
+ $result .= "<dl>\n<dt>";
$this->mDTopen = true;
} else {
$result = '<!-- ERR 1 -->';
@@ -2228,11 +2305,11 @@ class Parser {
*/
function nextItem( $char ) {
if ( '*' === $char || '#' === $char ) {
- return '</li><li>';
+ return "</li>\n<li>";
} elseif ( ':' === $char || ';' === $char ) {
- $close = '</dd>';
+ $close = "</dd>\n";
if ( $this->mDTopen ) {
- $close = '</dt>';
+ $close = "</dt>\n";
}
if ( ';' === $char ) {
$this->mDTopen = true;
@@ -2254,15 +2331,15 @@ class Parser {
*/
function closeList( $char ) {
if ( '*' === $char ) {
- $text = '</li></ul>';
+ $text = "</li>\n</ul>";
} elseif ( '#' === $char ) {
- $text = '</li></ol>';
+ $text = "</li>\n</ol>";
} elseif ( ':' === $char ) {
if ( $this->mDTopen ) {
$this->mDTopen = false;
- $text = '</dt></dl>';
+ $text = "</dt>\n</dl>";
} else {
- $text = '</dd></dl>';
+ $text = "</dd>\n</dl>";
}
} else {
return '<!-- ERR 3 -->';
@@ -2292,6 +2369,7 @@ class Parser {
$this->mDTopen = $inBlockElem = false;
$prefixLength = 0;
$paragraphStack = false;
+ $inBlockquote = false;
foreach ( $textLines as $oLine ) {
# Fix up $linestart
@@ -2354,13 +2432,13 @@ class Parser {
# Close all the prefixes which aren't shared.
while ( $commonPrefixLength < $lastPrefixLength ) {
- $output .= $this->closeList( $lastPrefix[$lastPrefixLength-1] );
+ $output .= $this->closeList( $lastPrefix[$lastPrefixLength - 1] );
--$lastPrefixLength;
}
# Continue the current prefix if appropriate.
if ( $prefixLength <= $commonPrefixLength && $commonPrefixLength > 0 ) {
- $output .= $this->nextItem( $prefix[$commonPrefixLength-1] );
+ $output .= $this->nextItem( $prefix[$commonPrefixLength - 1] );
}
# Open prefixes where appropriate.
@@ -2385,10 +2463,10 @@ class Parser {
wfProfileIn( __METHOD__ . "-paragraph" );
# No prefix (not in list)--go to paragraph mode
# 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|<dl|<li|<\\/tr|<\\/td|<\\/th)/iS', $t );
+ $openmatch = preg_match( '/(?:<table|<h1|<h2|<h3|<h4|<h5|<h6|<pre|<tr|<p|<ul|<ol|<dl|<li|<\\/tr|<\\/td|<\\/th)/iS', $t );
$closematch = preg_match(
- '/(?:<\\/table|<\\/blockquote|<\\/h1|<\\/h2|<\\/h3|<\\/h4|<\\/h5|<\\/h6|'.
- '<td|<th|<\\/?div|<hr|<\\/pre|<\\/p|'.$this->mUniqPrefix . '-pre|<\\/li|<\\/ul|<\\/ol|<\\/dl|<\\/?center)/iS', $t );
+ '/(?:<\\/table|<\\/h1|<\\/h2|<\\/h3|<\\/h4|<\\/h5|<\\/h6|' .
+ '<td|<th|<\\/?blockquote|<\\/?div|<hr|<\\/pre|<\\/p|<\\/mw:|' . $this->mUniqPrefix . '-pre|<\\/li|<\\/ul|<\\/ol|<\\/dl|<\\/?center)/iS', $t );
if ( $openmatch or $closematch ) {
$paragraphStack = false;
# TODO bug 5718: paragraph closed
@@ -2396,9 +2474,14 @@ class Parser {
if ( $preOpenMatch and !$preCloseMatch ) {
$this->mInPre = true;
}
+ $bqOffset = 0;
+ while ( preg_match( '/<(\\/?)blockquote[\s>]/i', $t, $bqMatch, PREG_OFFSET_CAPTURE, $bqOffset ) ) {
+ $inBlockquote = !$bqMatch[1][0]; // is this a close tag?
+ $bqOffset = $bqMatch[0][1] + strlen( $bqMatch[0][0] );
+ }
$inBlockElem = !$closematch;
} elseif ( !$inBlockElem && !$this->mInPre ) {
- if ( ' ' == substr( $t, 0, 1 ) and ( $this->mLastSection === 'pre' || trim( $t ) != '' ) ) {
+ if ( ' ' == substr( $t, 0, 1 ) and ( $this->mLastSection === 'pre' || trim( $t ) != '' ) and !$inBlockquote ) {
# pre
if ( $this->mLastSection !== 'pre' ) {
$paragraphStack = false;
@@ -2445,7 +2528,7 @@ class Parser {
}
}
while ( $prefixLength ) {
- $output .= $this->closeList( $prefix2[$prefixLength-1] );
+ $output .= $this->closeList( $prefix2[$prefixLength - 1] );
--$prefixLength;
}
if ( $this->mLastSection != '' ) {
@@ -2481,7 +2564,7 @@ class Parser {
if ( $lt === false || $lt > $pos ) {
# Easy; no tag nesting to worry about
$before = substr( $str, 0, $pos );
- $after = substr( $str, $pos+1 );
+ $after = substr( $str, $pos + 1 );
wfProfileOut( __METHOD__ );
return $pos;
}
@@ -2490,13 +2573,13 @@ class Parser {
$state = self::COLON_STATE_TEXT;
$stack = 0;
$len = strlen( $str );
- for( $i = 0; $i < $len; $i++ ) {
+ for ( $i = 0; $i < $len; $i++ ) {
$c = $str[$i];
- switch( $state ) {
+ switch ( $state ) {
# (Using the number is a performance hack for common cases)
case 0: # self::COLON_STATE_TEXT:
- switch( $c ) {
+ switch ( $c ) {
case "<":
# Could be either a <start> tag or an </end> tag
$state = self::COLON_STATE_TAGSTART;
@@ -2541,7 +2624,7 @@ class Parser {
break;
case 1: # self::COLON_STATE_TAG:
# In a <tag>
- switch( $c ) {
+ switch ( $c ) {
case ">":
$stack++;
$state = self::COLON_STATE_TEXT;
@@ -2555,7 +2638,7 @@ class Parser {
}
break;
case 2: # self::COLON_STATE_TAGSTART:
- switch( $c ) {
+ switch ( $c ) {
case "/":
$state = self::COLON_STATE_CLOSETAG;
break;
@@ -2611,6 +2694,7 @@ class Parser {
}
break;
default:
+ wfProfileOut( __METHOD__ );
throw new MWException( "State machine error in " . __METHOD__ );
}
}
@@ -2660,71 +2744,50 @@ class Parser {
$ts = wfTimestamp( TS_UNIX, $this->mOptions->getTimestamp() );
wfRunHooks( 'ParserGetVariableValueTs', array( &$this, &$ts ) );
- # Use the time zone
- global $wgLocaltimezone;
- if ( isset( $wgLocaltimezone ) ) {
- $oldtz = date_default_timezone_get();
- date_default_timezone_set( $wgLocaltimezone );
- }
-
- $localTimestamp = date( 'YmdHis', $ts );
- $localMonth = date( 'm', $ts );
- $localMonth1 = date( 'n', $ts );
- $localMonthName = date( 'n', $ts );
- $localDay = date( 'j', $ts );
- $localDay2 = date( 'd', $ts );
- $localDayOfWeek = date( 'w', $ts );
- $localWeek = date( 'W', $ts );
- $localYear = date( 'Y', $ts );
- $localHour = date( 'H', $ts );
- if ( isset( $wgLocaltimezone ) ) {
- date_default_timezone_set( $oldtz );
- }
-
$pageLang = $this->getFunctionLang();
switch ( $index ) {
case 'currentmonth':
- $value = $pageLang->formatNum( gmdate( 'm', $ts ) );
+ $value = $pageLang->formatNum( MWTimestamp::getInstance( $ts )->format( 'm' ) );
break;
case 'currentmonth1':
- $value = $pageLang->formatNum( gmdate( 'n', $ts ) );
+ $value = $pageLang->formatNum( MWTimestamp::getInstance( $ts )->format( 'n' ) );
break;
case 'currentmonthname':
- $value = $pageLang->getMonthName( gmdate( 'n', $ts ) );
+ $value = $pageLang->getMonthName( MWTimestamp::getInstance( $ts )->format( 'n' ) );
break;
case 'currentmonthnamegen':
- $value = $pageLang->getMonthNameGen( gmdate( 'n', $ts ) );
+ $value = $pageLang->getMonthNameGen( MWTimestamp::getInstance( $ts )->format( 'n' ) );
break;
case 'currentmonthabbrev':
- $value = $pageLang->getMonthAbbreviation( gmdate( 'n', $ts ) );
+ $value = $pageLang->getMonthAbbreviation( MWTimestamp::getInstance( $ts )->format( 'n' ) );
break;
case 'currentday':
- $value = $pageLang->formatNum( gmdate( 'j', $ts ) );
+ $value = $pageLang->formatNum( MWTimestamp::getInstance( $ts )->format( 'j' ) );
break;
case 'currentday2':
- $value = $pageLang->formatNum( gmdate( 'd', $ts ) );
+ $value = $pageLang->formatNum( MWTimestamp::getInstance( $ts )->format( 'd' ) );
break;
case 'localmonth':
- $value = $pageLang->formatNum( $localMonth );
+ $value = $pageLang->formatNum( MWTimestamp::getLocalInstance( $ts )->format( 'm' ) );
break;
case 'localmonth1':
- $value = $pageLang->formatNum( $localMonth1 );
+ $value = $pageLang->formatNum( MWTimestamp::getLocalInstance( $ts )->format( 'n' ) );
break;
case 'localmonthname':
- $value = $pageLang->getMonthName( $localMonthName );
+ $value = $pageLang->getMonthName( MWTimestamp::getLocalInstance( $ts )->format( 'n' ) );
break;
case 'localmonthnamegen':
- $value = $pageLang->getMonthNameGen( $localMonthName );
+ $value = $pageLang->getMonthNameGen( MWTimestamp::getLocalInstance( $ts )->format( 'n' ) );
break;
case 'localmonthabbrev':
- $value = $pageLang->getMonthAbbreviation( $localMonthName );
+ $value = $pageLang->getMonthAbbreviation( MWTimestamp::getLocalInstance( $ts )->format( 'n' ) );
break;
case 'localday':
- $value = $pageLang->formatNum( $localDay );
+ $value = $pageLang->formatNum( MWTimestamp::getLocalInstance( $ts )->format( 'j' ) );
break;
case 'localday2':
- $value = $pageLang->formatNum( $localDay2 );
+ $value = $pageLang->formatNum( MWTimestamp::getLocalInstance( $ts )->format( 'd' ) );
break;
case 'pagename':
$value = wfEscapeWikiText( $this->mTitle->getText() );
@@ -2744,6 +2807,12 @@ class Parser {
case 'subpagenamee':
$value = wfEscapeWikiText( $this->mTitle->getSubpageUrlForm() );
break;
+ case 'rootpagename':
+ $value = wfEscapeWikiText( $this->mTitle->getRootText() );
+ break;
+ case 'rootpagenamee':
+ $value = wfEscapeWikiText( wfUrlEncode( str_replace( ' ', '_', $this->mTitle->getRootText() ) ) );
+ break;
case 'basepagename':
$value = wfEscapeWikiText( $this->mTitle->getBaseText() );
break;
@@ -2761,7 +2830,7 @@ class Parser {
case 'talkpagenamee':
if ( $this->mTitle->canTalk() ) {
$talkPage = $this->mTitle->getTalkPage();
- $value = wfEscapeWikiText( $talkPage->getPrefixedUrl() );
+ $value = wfEscapeWikiText( $talkPage->getPrefixedURL() );
} else {
$value = '';
}
@@ -2772,11 +2841,11 @@ class Parser {
break;
case 'subjectpagenamee':
$subjPage = $this->mTitle->getSubjectPage();
- $value = wfEscapeWikiText( $subjPage->getPrefixedUrl() );
+ $value = wfEscapeWikiText( $subjPage->getPrefixedURL() );
break;
case 'pageid': // requested in bug 23427
- $pageid = $this->getTitle()->getArticleId();
- if( $pageid == 0 ) {
+ $pageid = $this->getTitle()->getArticleID();
+ if ( $pageid == 0 ) {
# 0 means the page doesn't exist in the database,
# which means the user is previewing a new page.
# The vary-revision flag must be set, because the magic word
@@ -2842,6 +2911,13 @@ class Parser {
wfDebug( __METHOD__ . ": {{REVISIONUSER}} used, setting vary-revision...\n" );
$value = $this->getRevisionUser();
break;
+ case 'revisionsize':
+ # 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__ . ": {{REVISIONSIZE}} used, setting vary-revision...\n" );
+ $value = $this->getRevisionSize();
+ break;
case 'namespace':
$value = str_replace( '_', ' ', $wgContLang->getNsText( $this->mTitle->getNamespace() ) );
break;
@@ -2858,50 +2934,50 @@ class Parser {
$value = $this->mTitle->canTalk() ? wfUrlencode( $this->mTitle->getTalkNsText() ) : '';
break;
case 'subjectspace':
- $value = $this->mTitle->getSubjectNsText();
+ $value = str_replace( '_', ' ', $this->mTitle->getSubjectNsText() );
break;
case 'subjectspacee':
$value = ( wfUrlencode( $this->mTitle->getSubjectNsText() ) );
break;
case 'currentdayname':
- $value = $pageLang->getWeekdayName( gmdate( 'w', $ts ) + 1 );
+ $value = $pageLang->getWeekdayName( MWTimestamp::getInstance( $ts )->format( 'w' ) + 1 );
break;
case 'currentyear':
- $value = $pageLang->formatNum( gmdate( 'Y', $ts ), true );
+ $value = $pageLang->formatNum( MWTimestamp::getInstance( $ts )->format( 'Y' ), true );
break;
case 'currenttime':
$value = $pageLang->time( wfTimestamp( TS_MW, $ts ), false, false );
break;
case 'currenthour':
- $value = $pageLang->formatNum( gmdate( 'H', $ts ), true );
+ $value = $pageLang->formatNum( MWTimestamp::getInstance( $ts )->format( 'H' ), true );
break;
case 'currentweek':
# @bug 4594 PHP5 has it zero padded, PHP4 does not, cast to
# int to remove the padding
- $value = $pageLang->formatNum( (int)gmdate( 'W', $ts ) );
+ $value = $pageLang->formatNum( (int)MWTimestamp::getInstance( $ts )->format( 'W' ) );
break;
case 'currentdow':
- $value = $pageLang->formatNum( gmdate( 'w', $ts ) );
+ $value = $pageLang->formatNum( MWTimestamp::getInstance( $ts )->format( 'w' ) );
break;
case 'localdayname':
- $value = $pageLang->getWeekdayName( $localDayOfWeek + 1 );
+ $value = $pageLang->getWeekdayName( MWTimestamp::getLocalInstance( $ts )->format( 'w' ) + 1 );
break;
case 'localyear':
- $value = $pageLang->formatNum( $localYear, true );
+ $value = $pageLang->formatNum( MWTimestamp::getLocalInstance( $ts )->format( 'Y' ), true );
break;
case 'localtime':
- $value = $pageLang->time( $localTimestamp, false, false );
+ $value = $pageLang->time( MWTimestamp::getLocalInstance( $ts )->format( 'YmdHis' ), false, false );
break;
case 'localhour':
- $value = $pageLang->formatNum( $localHour, true );
+ $value = $pageLang->formatNum( MWTimestamp::getLocalInstance( $ts )->format( 'H' ), true );
break;
case 'localweek':
# @bug 4594 PHP5 has it zero padded, PHP4 does not, cast to
# int to remove the padding
- $value = $pageLang->formatNum( (int)$localWeek );
+ $value = $pageLang->formatNum( (int)MWTimestamp::getLocalInstance( $ts )->format( 'W' ) );
break;
case 'localdow':
- $value = $pageLang->formatNum( $localDayOfWeek );
+ $value = $pageLang->formatNum( MWTimestamp::getLocalInstance( $ts )->format( 'w' ) );
break;
case 'numberofarticles':
$value = $pageLang->formatNum( SiteStats::articles() );
@@ -2932,7 +3008,7 @@ class Parser {
$value = wfTimestamp( TS_MW, $ts );
break;
case 'localtimestamp':
- $value = $localTimestamp;
+ $value = MWTimestamp::getLocalInstance( $ts )->format( 'YmdHis' );
break;
case 'currentversion':
$value = SpecialVersion::getVersion();
@@ -3092,7 +3168,7 @@ class Parser {
$assocArgs[$index++] = $arg;
} else {
$name = trim( substr( $arg, 0, $eqpos ) );
- $value = trim( substr( $arg, $eqpos+1 ) );
+ $value = trim( substr( $arg, $eqpos + 1 ) );
if ( $value === false ) {
$value = '';
}
@@ -3119,6 +3195,12 @@ class Parser {
* 'post-expand-template-inclusion' (corresponding messages:
* 'post-expand-template-inclusion-warning',
* 'post-expand-template-inclusion-category')
+ * 'node-count-exceeded' (corresponding messages:
+ * 'node-count-exceeded-warning',
+ * 'node-count-exceeded-category')
+ * 'expansion-depth-exceeded' (corresponding messages:
+ * 'expansion-depth-exceeded-warning',
+ * 'expansion-depth-exceeded-category')
* @param int|null $current Current value
* @param int|null $max Maximum allowed, when an explicit limit has been
* exceeded, provide the values (optional)
@@ -3126,7 +3208,7 @@ class Parser {
function limitationWarn( $limitationType, $current = '', $max = '' ) {
# does no harm if $current and $max are present but are unnecessary for the message
$warning = wfMessage( "$limitationType-warning" )->numParams( $current, $max )
- ->inContentLanguage()->escaped();
+ ->inLanguage( $this->mOptions->getUserLangObj() )->text();
$this->mOutput->addWarning( $warning );
$this->addTrackingCategory( "$limitationType-category" );
}
@@ -3145,7 +3227,6 @@ class Parser {
* @private
*/
function braceSubstitution( $piece, $frame ) {
- global $wgContLang;
wfProfileIn( __METHOD__ );
wfProfileIn( __METHOD__ . '-setup' );
@@ -3251,6 +3332,7 @@ class Parser {
$result = $this->callParserFunction( $frame, $func, $funcArgs );
} catch ( Exception $ex ) {
wfProfileOut( __METHOD__ . '-pfunc' );
+ wfProfileOut( __METHOD__ );
throw $ex;
}
@@ -3268,8 +3350,9 @@ class Parser {
$ns = NS_TEMPLATE;
# Split the title into page and subpage
$subpage = '';
- $part1 = $this->maybeDoSubpageLink( $part1, $subpage );
- if ( $subpage !== '' ) {
+ $relative = $this->maybeDoSubpageLink( $part1, $subpage );
+ if ( $part1 !== $relative ) {
+ $part1 = $relative;
$ns = $this->mTitle->getNamespace();
}
$title = Title::newFromText( $part1, $ns );
@@ -3295,7 +3378,7 @@ class Parser {
if ( !$found && $title ) {
if ( !Profiler::instance()->isPersistent() ) {
# Too many unique items can kill profiling DBs/collectors
- $titleProfileIn = __METHOD__ . "-title-" . $title->getDBKey();
+ $titleProfileIn = __METHOD__ . "-title-" . $title->getPrefixedDBkey();
wfProfileIn( $titleProfileIn ); // template in
}
wfProfileIn( __METHOD__ . '-loadtpl' );
@@ -3598,7 +3681,7 @@ class Parser {
}
$dom = $this->preprocessToDom( $text, self::PTD_FOR_INCLUSION );
- $this->mTplDomCache[ $titleText ] = $dom;
+ $this->mTplDomCache[$titleText] = $dom;
if ( !$title->equals( $cacheTitle ) ) {
$this->mTplRedirCache[$cacheTitle->getPrefixedDBkey()] =
@@ -3621,6 +3704,11 @@ class Parser {
if ( isset( $stuff['deps'] ) ) {
foreach ( $stuff['deps'] as $dep ) {
$this->mOutput->addTemplate( $dep['title'], $dep['page_id'], $dep['rev_id'] );
+ if ( $dep['title']->equals( $this->getTitle() ) ) {
+ // If we transclude ourselves, the final result
+ // will change based on the new version of the page
+ $this->mOutput->setFlag( 'vary-revision' );
+ }
}
}
return array( $text, $finalTitle );
@@ -3660,9 +3748,9 @@ class Parser {
if ( $skip ) {
$text = false;
$deps[] = array(
- 'title' => $title,
- 'page_id' => $title->getArticleID(),
- 'rev_id' => null
+ 'title' => $title,
+ 'page_id' => $title->getArticleID(),
+ 'rev_id' => null
);
break;
}
@@ -3678,15 +3766,15 @@ class Parser {
}
$deps[] = array(
- 'title' => $title,
- 'page_id' => $title->getArticleID(),
- 'rev_id' => $rev_id );
+ 'title' => $title,
+ 'page_id' => $title->getArticleID(),
+ 'rev_id' => $rev_id );
if ( $rev && !$title->equals( $rev->getTitle() ) ) {
# We fetched a rev from a different title; register it too...
$deps[] = array(
- 'title' => $rev->getTitle(),
- 'page_id' => $rev->getPage(),
- 'rev_id' => $rev_id );
+ 'title' => $rev->getTitle(),
+ 'page_id' => $rev->getPage(),
+ 'rev_id' => $rev_id );
}
if ( $rev ) {
@@ -3742,13 +3830,8 @@ class Parser {
* @return Array ( File or false, Title of file )
*/
function fetchFileAndTitle( $title, $options = array() ) {
- if ( isset( $options['broken'] ) ) {
- $file = false; // broken thumbnail forced by hook
- } elseif ( isset( $options['sha1'] ) ) { // get by (sha1,timestamp)
- $file = RepoGroup::singleton()->findFileFromKey( $options['sha1'], $options );
- } else { // get by (name,timestamp)
- $file = wfFindFile( $title, $options );
- }
+ $file = $this->fetchFileNoRegister( $title, $options );
+
$time = $file ? $file->getTimestamp() : false;
$sha1 = $file ? $file->getSha1() : false;
# Register the file as a dependency...
@@ -3767,6 +3850,27 @@ class Parser {
}
/**
+ * Helper function for fetchFileAndTitle.
+ *
+ * Also useful if you need to fetch a file but not use it yet,
+ * for example to get the file's handler.
+ *
+ * @param Title $title
+ * @param array $options Array of options to RepoGroup::findFile
+ * @return File or false
+ */
+ protected function fetchFileNoRegister( $title, $options = array() ) {
+ if ( isset( $options['broken'] ) ) {
+ $file = false; // broken thumbnail forced by hook
+ } elseif ( isset( $options['sha1'] ) ) { // get by (sha1,timestamp)
+ $file = RepoGroup::singleton()->findFileFromKey( $options['sha1'], $options );
+ } else { // get by (name,timestamp)
+ $file = wfFindFile( $title, $options );
+ }
+ return $file;
+ }
+
+ /**
* Transclude an interwiki link.
*
* @param $title Title
@@ -3781,7 +3885,7 @@ class Parser {
return wfMessage( 'scarytranscludedisabled' )->inContentLanguage()->text();
}
- $url = $title->getFullUrl( "action=$action" );
+ $url = $title->getFullURL( array( 'action' => $action ) );
if ( strlen( $url ) > 255 ) {
return wfMessage( 'scarytranscludetoolong' )->inContentLanguage()->text();
@@ -3817,8 +3921,8 @@ class Parser {
$dbw->replace( 'transcache', array( 'tc_url' ), array(
'tc_url' => $url,
'tc_time' => $dbw->timestamp( time() ),
- 'tc_contents' => $text)
- );
+ 'tc_contents' => $text
+ ) );
return $text;
}
@@ -4097,8 +4201,8 @@ class Parser {
* @return mixed|string
* @private
*/
- function formatHeadings( $text, $origText, $isMain=true ) {
- global $wgMaxTocLevel, $wgHtml5, $wgExperimentalHtmlIds;
+ function formatHeadings( $text, $origText, $isMain = true ) {
+ global $wgMaxTocLevel, $wgExperimentalHtmlIds;
# Inhibit editsection links if requested in the page
if ( isset( $this->mDoubleUnderscores['noeditsection'] ) ) {
@@ -4114,7 +4218,7 @@ class Parser {
# Get all headlines for numbering them and adding funky stuff like [edit]
# links - this is for later, but we need the number of headlines right now
$matches = array();
- $numMatches = preg_match_all( '/<H(?P<level>[1-6])(?P<attrib>.*?'.'>)(?P<header>.*?)<\/H[1-6] *>/i', $text, $matches );
+ $numMatches = preg_match_all( '/<H(?P<level>[1-6])(?P<attrib>.*?' . '>)\s*(?P<header>[\s\S]*?)\s*<\/H[1-6] *>/i', $text, $matches );
# if there are fewer than 4 headlines in the article, do not show TOC
# unless it's been explicitly enabled.
@@ -4176,7 +4280,7 @@ class Parser {
$serial = $markerMatches[1];
list( $titleText, $sectionIndex ) = $this->mHeadings[$serial];
$isTemplate = ( $titleText != $baseTitleText );
- $headline = preg_replace( "/^$markerRegex/", "", $headline );
+ $headline = preg_replace( "/^$markerRegex\\s*/", "", $headline );
}
if ( $toclevel ) {
@@ -4231,7 +4335,7 @@ class Parser {
# count number of headlines for each level
$sublevelCount[$toclevel]++;
$dot = 0;
- for( $i = 1; $i <= $toclevel; $i++ ) {
+ for ( $i = 1; $i <= $toclevel; $i++ ) {
if ( !empty( $sublevelCount[$i] ) ) {
if ( $dot ) {
$numbering .= '.';
@@ -4263,20 +4367,20 @@ class Parser {
# We strip any parameter from accepted tags (second regex), except dir="rtl|ltr" from <span>,
# to allow setting directionality in toc items.
$tocline = preg_replace(
- array( '#<(?!/?(span|sup|sub|i|b)(?: [^>]*)?>).*?'.'>#', '#<(/?(?:span(?: dir="(?:rtl|ltr)")?|sup|sub|i|b))(?: .*?)?'.'>#' ),
+ array( '#<(?!/?(span|sup|sub|i|b)(?: [^>]*)?>).*?' . '>#', '#<(/?(?:span(?: dir="(?:rtl|ltr)")?|sup|sub|i|b))(?: .*?)?' . '>#' ),
array( '', '<$1>' ),
$safeHeadline
);
$tocline = trim( $tocline );
# For the anchor, strip out HTML-y stuff period
- $safeHeadline = preg_replace( '/<.*?'.'>/', '', $safeHeadline );
+ $safeHeadline = preg_replace( '/<.*?' . '>/', '', $safeHeadline );
$safeHeadline = Sanitizer::normalizeSectionNameWhitespace( $safeHeadline );
# Save headline for section edit hint before it's escaped
$headlineHint = $safeHeadline;
- if ( $wgHtml5 && $wgExperimentalHtmlIds ) {
+ if ( $wgExperimentalHtmlIds ) {
# For reverse compatibility, provide an id that's
# HTML4-compatible, like we used to.
#
@@ -4346,7 +4450,8 @@ class Parser {
# Add the section to the section tree
# Find the DOM node for this header
- while ( $node && !$isTemplate ) {
+ $noOffset = ( $isTemplate || $sectionIndex === false );
+ while ( $node && !$noOffset ) {
if ( $node->getName() === 'h' ) {
$bits = $node->splitHeading();
if ( $bits['i'] == $sectionIndex ) {
@@ -4364,7 +4469,7 @@ class Parser {
'number' => $numbering,
'index' => ( $isTemplate ? 'T-' : '' ) . $sectionIndex,
'fromtitle' => $titleText,
- 'byteoffset' => ( $isTemplate ? null : $byteOffset ),
+ 'byteoffset' => ( $noOffset ? null : $byteOffset ),
'anchor' => $anchor,
);
@@ -4415,6 +4520,7 @@ class Parser {
}
$toc = Linker::tocList( $toc, $this->mOptions->getUserLangObj() );
$this->mOutput->setTOCHTML( $toc );
+ $toc = self::TOC_START . $toc . self::TOC_END;
}
if ( $isMain ) {
@@ -4422,7 +4528,7 @@ class Parser {
}
# split up and insert constructed headlines
- $blocks = preg_split( '/<H[1-6].*?' . '>.*?<\/H[1-6]>/i', $text );
+ $blocks = preg_split( '/<H[1-6].*?' . '>[\s\S]*?<\/H[1-6]>/i', $text );
$i = 0;
// build an array of document sections
@@ -4484,7 +4590,7 @@ class Parser {
"\r\n" => "\n",
);
$text = str_replace( array_keys( $pairs ), array_values( $pairs ), $text );
- if( $options->getPreSaveTransform() ) {
+ if ( $options->getPreSaveTransform() ) {
$text = $this->pstPass2( $text, $user );
}
$text = $this->mStripState->unstripBoth( $text );
@@ -4504,7 +4610,7 @@ class Parser {
* @return string
*/
function pstPass2( $text, $user ) {
- global $wgContLang, $wgLocaltimezone;
+ global $wgContLang;
# Note: This is the timestamp saved as hardcoded wikitext to
# the database, we use $wgContLang here in order to give
@@ -4512,19 +4618,11 @@ class Parser {
# than the one selected in each user's preferences.
# (see also bug 12815)
$ts = $this->mOptions->getTimestamp();
- if ( isset( $wgLocaltimezone ) ) {
- $tz = $wgLocaltimezone;
- } else {
- $tz = date_default_timezone_get();
- }
+ $timestamp = MWTimestamp::getLocalInstance( $ts );
+ $ts = $timestamp->format( 'YmdHis' );
+ $tzMsg = $timestamp->format( 'T' ); # might vary on DST changeover!
- $unixts = wfTimestamp( TS_UNIX, $ts );
- $oldtz = date_default_timezone_get();
- date_default_timezone_set( $tz );
- $ts = date( 'YmdHis', $unixts );
- $tzMsg = date( 'T', $unixts ); # might vary on DST changeover!
-
- # Allow translation of timezones through wiki. date() can return
+ # Allow translation of timezones through wiki. format() can return
# whatever crap the system uses, localised or not, so we cannot
# ship premade translations.
$key = 'timezone-' . strtolower( trim( $tzMsg ) );
@@ -4533,8 +4631,6 @@ class Parser {
$tzMsg = $msg->text();
}
- date_default_timezone_set( $oldtz );
-
$d = $wgContLang->timeanddate( $ts, false, false ) . " ($tzMsg)";
# Variable replacement
@@ -4603,8 +4699,9 @@ class Parser {
$username = $user->getName();
# If not given, retrieve from the user object.
- if ( $nickname === false )
+ if ( $nickname === false ) {
$nickname = $user->getOption( 'nickname' );
+ }
if ( is_null( $fancySig ) ) {
$fancySig = $user->getBoolOption( 'fancysig' );
@@ -4645,7 +4742,7 @@ class Parser {
* @return mixed An expanded string, or false if invalid.
*/
function validateSig( $text ) {
- return( Xml::isWellFormedXmlFragment( $text ) ? $text : false );
+ return Xml::isWellFormedXmlFragment( $text ) ? $text : false;
}
/**
@@ -4883,8 +4980,9 @@ 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();
$sensitive = intval( $mw->isCaseSensitive() );
@@ -4928,7 +5026,9 @@ class Parser {
*/
function setFunctionTagHook( $tag, $callback, $flags ) {
$tag = strtolower( $tag );
- if ( preg_match( '/[<>\r\n]/', $tag, $m ) ) throw new MWException( "Invalid character {$m[0]} in setFunctionTagHook('$tag', ...) call" );
+ if ( preg_match( '/[<>\r\n]/', $tag, $m ) ) {
+ throw new MWException( "Invalid character {$m[0]} in setFunctionTagHook('$tag', ...) call" );
+ }
$old = isset( $this->mFunctionTagHooks[$tag] ) ?
$this->mFunctionTagHooks[$tag] : null;
$this->mFunctionTagHooks[$tag] = array( $callback, $flags );
@@ -4979,7 +5079,20 @@ class Parser {
* @return string HTML
*/
function renderImageGallery( $text, $params ) {
- $ig = new ImageGallery();
+ wfProfileIn( __METHOD__ );
+
+ $mode = false;
+ if ( isset( $params['mode'] ) ) {
+ $mode = $params['mode'];
+ }
+
+ try {
+ $ig = ImageGalleryBase::factory( $mode );
+ } catch ( MWException $e ) {
+ // If invalid type set, fallback to default.
+ $ig = ImageGalleryBase::factory( false );
+ }
+
$ig->setContextTitle( $this->mTitle );
$ig->setShowBytes( false );
$ig->setShowFilename( false );
@@ -5007,6 +5120,7 @@ class Parser {
if ( isset( $params['heights'] ) ) {
$ig->setHeights( $params['heights'] );
}
+ $ig->setAdditionalOptions( $params );
wfRunHooks( 'BeforeParserrenderImageGallery', array( &$this, &$ig ) );
@@ -5030,38 +5144,81 @@ class Parser {
continue;
}
+ # We need to get what handler the file uses, to figure out parameters.
+ # Note, a hook can overide the file name, and chose an entirely different
+ # file (which potentially could be of a different type and have different handler).
+ $options = array();
+ $descQuery = false;
+ wfRunHooks( 'BeforeParserFetchFileAndTitle',
+ array( $this, $title, &$options, &$descQuery ) );
+ # Don't register it now, as ImageGallery does that later.
+ $file = $this->fetchFileNoRegister( $title, $options );
+ $handler = $file ? $file->getHandler() : false;
+
+ wfProfileIn( __METHOD__ . '-getMagicWord' );
+ $paramMap = array(
+ 'img_alt' => 'gallery-internal-alt',
+ 'img_link' => 'gallery-internal-link',
+ );
+ if ( $handler ) {
+ $paramMap = $paramMap + $handler->getParamMap();
+ // We don't want people to specify per-image widths.
+ // Additionally the width parameter would need special casing anyhow.
+ unset( $paramMap['img_width'] );
+ }
+
+ $mwArray = new MagicWordArray( array_keys( $paramMap ) );
+ wfProfileOut( __METHOD__ . '-getMagicWord' );
+
$label = '';
$alt = '';
$link = '';
+ $handlerOptions = array();
if ( isset( $matches[3] ) ) {
// look for an |alt= definition while trying not to break existing
// captions with multiple pipes (|) in it, until a more sensible grammar
// is defined for images in galleries
+ // FIXME: Doing recursiveTagParse at this stage, and the trim before
+ // splitting on '|' is a bit odd, and different from makeImage.
$matches[3] = $this->recursiveTagParse( trim( $matches[3] ) );
$parameterMatches = StringUtils::explode( '|', $matches[3] );
- $magicWordAlt = MagicWord::get( 'img_alt' );
- $magicWordLink = MagicWord::get( 'img_link' );
foreach ( $parameterMatches as $parameterMatch ) {
- if ( $match = $magicWordAlt->matchVariableStartToEnd( $parameterMatch ) ) {
- $alt = $this->stripAltText( $match, false );
- }
- elseif( $match = $magicWordLink->matchVariableStartToEnd( $parameterMatch ) ) {
- $linkValue = strip_tags( $this->replaceLinkHoldersText( $match ) );
- $chars = self::EXT_LINK_URL_CLASS;
- $prots = $this->mUrlProtocols;
- //check to see if link matches an absolute url, if not then it must be a wiki link.
- if ( preg_match( "/^($prots)$chars+$/u", $linkValue ) ) {
- $link = $linkValue;
- } else {
- $localLinkTitle = Title::newFromText( $linkValue );
- if ( $localLinkTitle !== null ) {
- $link = $localLinkTitle->getLocalURL();
+ list( $magicName, $match ) = $mwArray->matchVariableStartToEnd( $parameterMatch );
+ if ( $magicName ) {
+ $paramName = $paramMap[$magicName];
+
+ switch ( $paramName ) {
+ case 'gallery-internal-alt':
+ $alt = $this->stripAltText( $match, false );
+ break;
+ case 'gallery-internal-link':
+ $linkValue = strip_tags( $this->replaceLinkHoldersText( $match ) );
+ $chars = self::EXT_LINK_URL_CLASS;
+ $prots = $this->mUrlProtocols;
+ //check to see if link matches an absolute url, if not then it must be a wiki link.
+ if ( preg_match( "/^($prots)$chars+$/u", $linkValue ) ) {
+ $link = $linkValue;
+ } else {
+ $localLinkTitle = Title::newFromText( $linkValue );
+ if ( $localLinkTitle !== null ) {
+ $link = $localLinkTitle->getLocalURL();
+ }
+ }
+ break;
+ default:
+ // Must be a handler specific parameter.
+ if ( $handler->validateParam( $paramName, $match ) ) {
+ $handlerOptions[$paramName] = $match;
+ } else {
+ // Guess not. Append it to the caption.
+ wfDebug( "$parameterMatch failed parameter validation" );
+ $label .= '|' . $parameterMatch;
}
}
- }
- else {
+
+ } else {
// concatenate all other pipes
$label .= '|' . $parameterMatch;
}
@@ -5070,9 +5227,11 @@ class Parser {
$label = substr( $label, 1 );
}
- $ig->add( $title, $label, $alt, $link );
+ $ig->add( $title, $label, $alt, $link, $handlerOptions );
}
- return $ig->toHTML();
+ $html = $ig->toHTML();
+ wfProfileOut( __METHOD__ );
+ return $html;
}
/**
@@ -5187,14 +5346,14 @@ class Parser {
# Special case; width and height come in one variable together
if ( $type === 'handler' && $paramName === 'width' ) {
$parsedWidthParam = $this->parseWidthParam( $value );
- if( isset( $parsedWidthParam['width'] ) ) {
+ if ( isset( $parsedWidthParam['width'] ) ) {
$width = $parsedWidthParam['width'];
if ( $handler->validateParam( 'width', $width ) ) {
$params[$type]['width'] = $width;
$validated = true;
}
}
- if( isset( $parsedWidthParam['height'] ) ) {
+ if ( isset( $parsedWidthParam['height'] ) ) {
$height = $parsedWidthParam['height'];
if ( $handler->validateParam( 'height', $height ) ) {
$params[$type]['height'] = $height;
@@ -5208,7 +5367,7 @@ class Parser {
$validated = $handler->validateParam( $paramName, $value );
} else {
# Validate internal parameters
- switch( $paramName ) {
+ switch ( $paramName ) {
case 'manualthumb':
case 'alt':
case 'class':
@@ -5646,14 +5805,14 @@ class Parser {
* @return String: user name
*/
function getRevisionUser() {
- if( is_null( $this->mRevisionUser ) ) {
+ if ( is_null( $this->mRevisionUser ) ) {
$revObject = $this->getRevisionObject();
# if this template is subst: the revision id will be blank,
# so just use the current user's name
- if( $revObject ) {
+ if ( $revObject ) {
$this->mRevisionUser = $revObject->getUserText();
- } elseif( $this->ot['wiki'] || $this->mOptions->getIsPreview() ) {
+ } elseif ( $this->ot['wiki'] || $this->mOptions->getIsPreview() ) {
$this->mRevisionUser = $this->getUser()->getName();
}
}
@@ -5661,6 +5820,27 @@ class Parser {
}
/**
+ * Get the size of the revision
+ *
+ * @return int|null revision size
+ */
+ function getRevisionSize() {
+ if ( is_null( $this->mRevisionSize ) ) {
+ $revObject = $this->getRevisionObject();
+
+ # if this variable is subst: the revision id will be blank,
+ # so just use the parser input size, because the own substituation
+ # will change the size.
+ if ( $revObject ) {
+ $this->mRevisionSize = $revObject->getSize();
+ } elseif ( $this->ot['wiki'] || $this->mOptions->getIsPreview() ) {
+ $this->mRevisionSize = $this->mInputSize;
+ }
+ }
+ return $this->mRevisionSize;
+ }
+
+ /**
* Mutator for $mDefaultSort
*
* @param string $sort New value
@@ -5933,7 +6113,7 @@ class Parser {
*/
public function parseWidthParam( $value ) {
$parsedWidthParam = array();
- if( $value === '' ) {
+ if ( $value === '' ) {
return $parsedWidthParam;
}
$m = array();
diff --git a/includes/parser/ParserCache.php b/includes/parser/ParserCache.php
index 0faa40a8..7053f134 100644
--- a/includes/parser/ParserCache.php
+++ b/includes/parser/ParserCache.php
@@ -67,7 +67,7 @@ class ParserCache {
// idhash seem to mean 'page id' + 'rendering hash' (r3710)
$pageid = $article->getID();
- $renderkey = (int)($wgRequest->getVal( 'action' ) == 'render');
+ $renderkey = (int)( $wgRequest->getVal( 'action' ) == 'render' );
$key = wfMemcKey( 'pcache', 'idhash', "{$pageid}-{$renderkey}!{$hash}" );
return $key;
@@ -128,7 +128,7 @@ class ParserCache {
public function getKey( $article, $popts, $useOutdated = true ) {
global $wgCacheEpoch;
- if( $popts instanceof User ) {
+ if ( $popts instanceof User ) {
wfWarn( "Use of outdated prototype ParserCache::getKey( &\$article, &\$user )\n" );
$popts = ParserOptions::newFromUser( $popts );
}
@@ -223,19 +223,19 @@ class ParserCache {
* @param $parserOutput ParserOutput
* @param $article Article
* @param $popts ParserOptions
+ * @param $cacheTime Time when the cache was generated
*/
- public function save( $parserOutput, $article, $popts ) {
+ public function save( $parserOutput, $article, $popts, $cacheTime = null ) {
$expire = $parserOutput->getCacheExpiry();
-
- if( $expire > 0 ) {
- $now = wfTimestampNow();
+ if ( $expire > 0 ) {
+ $cacheTime = $cacheTime ?: wfTimestampNow();
$optionsKey = new CacheTime;
$optionsKey->mUsedOptions = $parserOutput->getUsedOptions();
$optionsKey->updateCacheExpiry( $expire );
- $optionsKey->setCacheTime( $now );
- $parserOutput->setCacheTime( $now );
+ $optionsKey->setCacheTime( $cacheTime );
+ $parserOutput->setCacheTime( $cacheTime );
$optionsKey->setContainsOldMagic( $parserOutput->containsOldMagic() );
@@ -245,8 +245,8 @@ class ParserCache {
// Save the timestamp so that we don't have to load the revision row on view
$parserOutput->setTimestamp( $article->getTimestamp() );
- $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" );
+ $parserOutput->mText .= "\n<!-- Saved in parser cache with key $parserOutputKey and timestamp $cacheTime\n -->\n";
+ wfDebug( "Saved in parser cache with key $parserOutputKey and timestamp $cacheTime\n" );
// Save the parser output
$this->mMemc->set( $parserOutputKey, $parserOutput, $expire );
diff --git a/includes/parser/ParserOptions.php b/includes/parser/ParserOptions.php
index 3eb83e36..e12f32d8 100644
--- a/includes/parser/ParserOptions.php
+++ b/includes/parser/ParserOptions.php
@@ -240,6 +240,7 @@ class ParserOptions {
function getExternalLinkTarget() { return $this->mExternalLinkTarget; }
function getDisableContentConversion() { return $this->mDisableContentConversion; }
function getDisableTitleConversion() { return $this->mDisableTitleConversion; }
+ /** @deprecated since 1.22 use User::getOption('math') instead */
function getMath() { $this->optionUsed( 'math' );
return $this->mMath; }
function getThumbSize() { $this->optionUsed( 'thumbsize' );
@@ -280,9 +281,17 @@ class ParserOptions {
}
/**
+ * Get the user language used by the parser for this page.
+ *
* 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).
+ *
+ * To avoid side-effects where the page will be rendered based on the language
+ * of the user who last saved, this function will triger a cache fragmentation.
+ * Usage of this method is discouraged for that reason.
+ *
+ * When saving, this will return the default language instead of the user's.
+ *
+ * {{int: }} uses this which used to produce inconsistent link tables (bug 14404).
*
* @return Language object
* @since 1.19
@@ -312,7 +321,7 @@ class ParserOptions {
function setAllowSpecialInclusion( $x ) { return wfSetVar( $this->mAllowSpecialInclusion, $x ); }
function setTidy( $x ) { return wfSetVar( $this->mTidy, $x ); }
- /** @deprecated in 1.19; will be removed in 1.20 */
+ /** @deprecated in 1.19 */
function setSkin( $x ) { wfDeprecated( __METHOD__, '1.19' ); }
function setInterfaceMessage( $x ) { return wfSetVar( $this->mInterfaceMessage, $x ); }
function setTargetLanguage( $x ) { return wfSetVar( $this->mTargetLanguage, $x, true ); }
@@ -330,6 +339,7 @@ class ParserOptions {
function setExternalLinkTarget( $x ) { return wfSetVar( $this->mExternalLinkTarget, $x ); }
function disableContentConversion( $x = true ) { return wfSetVar( $this->mDisableContentConversion, $x ); }
function disableTitleConversion( $x = true ) { return wfSetVar( $this->mDisableTitleConversion, $x ); }
+ /** @deprecated since 1.22 */
function setMath( $x ) { return wfSetVar( $this->mMath, $x ); }
function setUserLang( $x ) {
if ( is_string( $x ) ) {
@@ -538,7 +548,7 @@ class ParserOptions {
// add in language specific options, if any
// @todo FIXME: This is just a way of retrieving the url/user preferred variant
- if( !is_null( $title ) ) {
+ if ( !is_null( $title ) ) {
$confstr .= $title->getPageLanguage()->getExtraHashOptions();
} else {
global $wgContLang;
@@ -557,8 +567,9 @@ class ParserOptions {
$confstr .= '!printable=1';
}
- if ( $this->mExtraKey != '' )
+ 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.
diff --git a/includes/parser/ParserOutput.php b/includes/parser/ParserOutput.php
index db649f11..502f0fd1 100644
--- a/includes/parser/ParserOutput.php
+++ b/includes/parser/ParserOutput.php
@@ -47,11 +47,14 @@ class ParserOutput extends CacheTime {
$mEditSectionTokens = false, # prefix/suffix markers if edit sections were output as tokens
$mProperties = array(), # Name/value pairs to be cached in the DB
$mTOCHTML = '', # HTML of the TOC
- $mTimestamp; # Timestamp of the revision
+ $mTimestamp, # Timestamp of the revision
+ $mTOCEnabled = true; # Whether TOC should be shown, can't override __NOTOC__
private $mIndexPolicy = ''; # 'index' or 'noindex'? Any other value will result in no change.
private $mAccessedOptions = array(); # List of ParserOptions (stored in the keys)
private $mSecondaryDataUpdates = array(); # List of DataUpdate, used to save info from the page somewhere else.
private $mExtensionData = array(); # extra data used by extensions
+ private $mLimitReportData = array(); # Parser limit report data
+ private $mParseStartTime = array(); # Timestamps for getTimeSinceStart()
const EDITSECTION_REGEX = '#<(?:mw:)?editsection page="(.*?)" section="(.*?)"(?:/>|>(.*?)(</(?:mw:)?editsection>))#';
@@ -66,11 +69,27 @@ class ParserOutput extends CacheTime {
}
function getText() {
+ wfProfileIn( __METHOD__ );
+ $text = $this->mText;
if ( $this->mEditSectionTokens ) {
- return preg_replace_callback( ParserOutput::EDITSECTION_REGEX,
- array( &$this, 'replaceEditSectionLinksCallback' ), $this->mText );
+ $text = preg_replace_callback( ParserOutput::EDITSECTION_REGEX,
+ array( &$this, 'replaceEditSectionLinksCallback' ), $text );
+ } else {
+ $text = preg_replace( ParserOutput::EDITSECTION_REGEX, '', $text );
+ }
+
+ // If you have an old cached version of this class - sorry, you can't disable the TOC
+ if ( isset( $this->mTOCEnabled ) && $this->mTOCEnabled ) {
+ $text = str_replace( array( Parser::TOC_START, Parser::TOC_END ), '', $text );
+ } else {
+ $text = preg_replace(
+ '#'. preg_quote( Parser::TOC_START ) . '.*?' . preg_quote( Parser::TOC_END ) . '#s',
+ '',
+ $text
+ );
}
- return preg_replace( ParserOutput::EDITSECTION_REGEX, '', $this->mText );
+ wfProfileOut( __METHOD__ );
+ return $text;
}
/**
@@ -120,6 +139,8 @@ class ParserOutput extends CacheTime {
function getIndexPolicy() { return $this->mIndexPolicy; }
function getTOCHTML() { return $this->mTOCHTML; }
function getTimestamp() { return $this->mTimestamp; }
+ function getLimitReportData() { return $this->mLimitReportData; }
+ function getTOCEnabled() { return $this->mTOCEnabled; }
function setText( $text ) { return wfSetVar( $this->mText, $text ); }
function setLanguageLinks( $ll ) { return wfSetVar( $this->mLanguageLinks, $ll ); }
@@ -131,6 +152,7 @@ class ParserOutput extends CacheTime {
function setIndexPolicy( $policy ) { return wfSetVar( $this->mIndexPolicy, $policy ); }
function setTOCHTML( $tochtml ) { return wfSetVar( $this->mTOCHTML, $tochtml ); }
function setTimestamp( $timestamp ) { return wfSetVar( $this->mTimestamp, $timestamp ); }
+ function setTOCEnabled( $flag ) { return wfSetVar( $this->mTOCEnabled, $flag ); }
function addCategory( $c, $sort ) { $this->mCategories[$c] = $sort; }
function addLanguageLink( $t ) { $this->mLanguageLinks[] = $t; }
@@ -143,10 +165,10 @@ class ParserOutput extends CacheTime {
function setNewSection( $value ) {
$this->mNewSection = (bool)$value;
}
- function hideNewSection ( $value ) {
+ function hideNewSection( $value ) {
$this->mHideNewSection = (bool)$value;
}
- function getHideNewSection () {
+ function getHideNewSection() {
return (bool)$this->mHideNewSection;
}
function getNewSection() {
@@ -176,10 +198,10 @@ class ParserOutput extends CacheTime {
global $wgServer, $wgRegisterInternalExternals;
$registerExternalLink = true;
- if( !$wgRegisterInternalExternals ) {
+ if ( !$wgRegisterInternalExternals ) {
$registerExternalLink = !self::isLinkInternal( $wgServer, $url );
}
- if( $registerExternalLink ) {
+ if ( $registerExternalLink ) {
$this->mExternalLinks[$url] = 1;
}
}
@@ -201,11 +223,11 @@ class ParserOutput extends CacheTime {
if ( $ns == NS_MEDIA ) {
// Normalize this pseudo-alias if it makes it down here...
$ns = NS_FILE;
- } elseif( $ns == NS_SPECIAL ) {
+ } elseif ( $ns == NS_SPECIAL ) {
// We don't record Special: links currently
// It might actually be wise to, but we'd need to do some normalization.
return;
- } elseif( $dbk === '' ) {
+ } elseif ( $dbk === '' ) {
// Don't record self links - [[#Foo]]
return;
}
@@ -258,7 +280,7 @@ class ParserOutput extends CacheTime {
*/
function addInterwikiLink( $title ) {
$prefix = $title->getInterwiki();
- if( $prefix == '' ) {
+ if ( $prefix == '' ) {
throw new MWException( 'Non-interwiki link passed, internal parser error.' );
}
if ( !isset( $this->mInterwikiLinks[$prefix] ) ) {
@@ -281,7 +303,7 @@ class ParserOutput extends CacheTime {
}
public function addModules( $modules ) {
- $this->mModules = array_merge( $this->mModules, (array) $modules );
+ $this->mModules = array_merge( $this->mModules, (array)$modules );
}
public function addModuleScripts( $modules ) {
@@ -329,7 +351,7 @@ class ParserOutput extends CacheTime {
*/
public function getDisplayTitle() {
$t = $this->getTitleText();
- if( $t === '' ) {
+ if ( $t === '' ) {
return false;
}
return $t;
@@ -544,4 +566,67 @@ class ParserOutput extends CacheTime {
return null;
}
+ private static function getTimes( $clock = null ) {
+ $ret = array();
+ if ( !$clock || $clock === 'wall' ) {
+ $ret['wall'] = microtime( true );
+ }
+ if ( ( !$clock || $clock === 'cpu' ) && function_exists( 'getrusage' ) ) {
+ $ru = getrusage();
+ $ret['cpu'] = $ru['ru_utime.tv_sec'] + $ru['ru_utime.tv_usec'] / 1e6;
+ $ret['cpu'] += $ru['ru_stime.tv_sec'] + $ru['ru_stime.tv_usec'] / 1e6;
+ }
+ return $ret;
+ }
+
+ /**
+ * Resets the parse start timestamps for future calls to getTimeSinceStart()
+ * @since 1.22
+ */
+ function resetParseStartTime() {
+ $this->mParseStartTime = self::getTimes();
+ }
+
+ /**
+ * Returns the time since resetParseStartTime() was last called
+ *
+ * Clocks available are:
+ * - wall: Wall clock time
+ * - cpu: CPU time (requires getrusage)
+ *
+ * @since 1.22
+ * @param string $clock
+ * @return float|null
+ */
+ function getTimeSinceStart( $clock ) {
+ if ( !isset( $this->mParseStartTime[$clock] ) ) {
+ return null;
+ }
+
+ $end = self::getTimes( $clock );
+ return $end[$clock] - $this->mParseStartTime[$clock];
+ }
+
+ /**
+ * Sets parser limit report data for a key
+ *
+ * The key is used as the prefix for various messages used for formatting:
+ * - $key: The label for the field in the limit report
+ * - $key-value-text: Message used to format the value in the "NewPP limit
+ * report" HTML comment. If missing, uses $key-format.
+ * - $key-value-html: Message used to format the value in the preview
+ * limit report table. If missing, uses $key-format.
+ * - $key-value: Message used to format the value. If missing, uses "$1".
+ *
+ * Note that all values are interpreted as wikitext, and so should be
+ * encoded with htmlspecialchars() as necessary, but should avoid complex
+ * HTML for sanity of display in the "NewPP limit report" comment.
+ *
+ * @since 1.22
+ * @param string $key Message key
+ * @param mixed $value Appropriate for Message::params()
+ */
+ function setLimitReportData( $key, $value ) {
+ $this->mLimitReportData[$key] = $value;
+ }
}
diff --git a/includes/parser/Parser_DiffTest.php b/includes/parser/Parser_DiffTest.php
index f25340fa..aeae234a 100644
--- a/includes/parser/Parser_DiffTest.php
+++ b/includes/parser/Parser_DiffTest.php
@@ -122,7 +122,7 @@ class Parser_DiffTest
function setFunctionHook( $id, $callback, $flags = 0 ) {
$this->init();
- foreach ( $this->parsers as $parser ) {
+ foreach ( $this->parsers as $parser ) {
$parser->setFunctionHook( $id, $callback, $flags );
}
}
diff --git a/includes/parser/Parser_LinkHooks.php b/includes/parser/Parser_LinkHooks.php
deleted file mode 100644
index b2cdc41a..00000000
--- a/includes/parser/Parser_LinkHooks.php
+++ /dev/null
@@ -1,326 +0,0 @@
-<?php
-/**
- * Modified version of the PHP parser with hooks for wiki links; experimental
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License along
- * with this program; if not, write to the Free Software Foundation, Inc.,
- * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
- * http://www.gnu.org/copyleft/gpl.html
- *
- * @file
- * @ingroup Parser
- */
-
-/**
- * Parser with LinkHooks experiment
- * @ingroup Parser
- */
-class Parser_LinkHooks extends Parser {
- /**
- * Update this version number when the ParserOutput format
- * changes in an incompatible way, so the parser cache
- * can automatically discard old data.
- */
- const VERSION = '1.6.4';
-
- # Flags for Parser::setLinkHook
- # Also available as global constants from Defines.php
- const SLH_PATTERN = 1;
-
- # Constants needed for external link processing
- # Everything except bracket, space, or control characters
- const EXT_LINK_URL_CLASS = '[^][<>"\\x00-\\x20\\x7F]';
- const EXT_IMAGE_REGEX = '/^(http:\/\/|https:\/\/)([^][<>"\\x00-\\x20\\x7F]+)
- \\/([A-Za-z0-9_.,~%\\-+&;#*?!=()@\\x80-\\xFF]+)\\.((?i)gif|png|jpg|jpeg)$/Sx';
-
- /**#@+
- * @private
- */
- # Persistent:
- var $mLinkHooks;
-
- /**#@-*/
-
- /**
- * Constructor
- */
- public function __construct( $conf = array() ) {
- parent::__construct( $conf );
- $this->mLinkHooks = array();
- }
-
- /**
- * Do various kinds of initialisation on the first call of the parser
- */
- function firstCallInit() {
- parent::__construct();
- if ( !$this->mFirstCall ) {
- return;
- }
- $this->mFirstCall = false;
-
- wfProfileIn( __METHOD__ );
-
- $this->setHook( 'pre', array( $this, 'renderPreTag' ) );
- CoreParserFunctions::register( $this );
- CoreLinkFunctions::register( $this );
- $this->initialiseVariables();
-
- wfRunHooks( 'ParserFirstCallInit', array( &$this ) );
- wfProfileOut( __METHOD__ );
- }
-
- /**
- * Create a link hook, e.g. [[Namepsace:...|display}}
- * The callback function should have the form:
- * function myLinkCallback( $parser, $holders, $markers,
- * Title $title, $titleText, &$sortText = null, &$leadingColon = false ) { ... }
- *
- * Or with SLH_PATTERN:
- * function myLinkCallback( $parser, $holders, $markers, )
- * &$titleText, &$sortText = null, &$leadingColon = false ) { ... }
- *
- * The callback may either return a number of different possible values:
- * String) Text result of the link
- * True) (Treat as link) Parse the link according to normal link rules
- * False) (Bad link) Just output the raw wikitext (You may modify the text first)
- *
- * @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
- *
- * @throws MWException
- * @return callback|null The old callback function for this name, if any
- */
- public function setLinkHook( $ns, $callback, $flags = 0 ) {
- if( $flags & SLH_PATTERN && !is_string($ns) )
- throw new MWException( __METHOD__ . '() expecting a regex string pattern.' );
- elseif( $flags | ~SLH_PATTERN && !is_int( $ns ) )
- throw new MWException( __METHOD__ . '() expecting a namespace index.' );
- $oldVal = isset( $this->mLinkHooks[$ns] ) ? $this->mLinkHooks[$ns][0] : null;
- $this->mLinkHooks[$ns] = array( $callback, $flags );
- return $oldVal;
- }
-
- /**
- * Get all registered link hook identifiers
- *
- * @return array
- */
- function getLinkHooks() {
- return array_keys( $this->mLinkHooks );
- }
-
- /**
- * Process [[ ]] wikilinks
- * @param $s
- * @throws MWException
- * @return LinkHolderArray
- *
- * @private
- */
- function replaceInternalLinks2( &$s ) {
- wfProfileIn( __METHOD__ );
-
- wfProfileIn( __METHOD__ . '-setup' );
- static $tc = false, $titleRegex; //$e1, $e1_img;
- if( !$tc ) {
- # the % is needed to support urlencoded titles as well
- $tc = Title::legalChars() . '#%';
- # Match a link having the form [[namespace:link|alternate]]trail
- //$e1 = "/^([{$tc}]+)(?:\\|(.+?))?]](.*)\$/sD";
- # Match cases where there is no "]]", which might still be images
- //$e1_img = "/^([{$tc}]+)\\|(.*)\$/sD";
- # Match a valid plain title
- $titleRegex = "/^([{$tc}]+)$/sD";
- }
-
- $holders = new LinkHolderArray( $this );
-
- if( is_null( $this->mTitle ) ) {
- wfProfileOut( __METHOD__ . '-setup' );
- wfProfileOut( __METHOD__ );
- throw new MWException( __METHOD__ . ": \$this->mTitle is null\n" );
- }
-
- wfProfileOut( __METHOD__ . '-setup' );
-
- $offset = 0;
- $offsetStack = array();
- $markers = new LinkMarkerReplacer( $this, $holders, array( &$this, 'replaceInternalLinksCallback' ) );
- while( true ) {
- $startBracketOffset = strpos( $s, '[[', $offset );
- $endBracketOffset = strpos( $s, ']]', $offset );
- # Finish when there are no more brackets
- if( $startBracketOffset === false && $endBracketOffset === false ) break;
- # Determine if the bracket is a starting or ending bracket
- # When we find both, use the first one
- elseif( $startBracketOffset !== false && $endBracketOffset !== false )
- $isStart = $startBracketOffset <= $endBracketOffset;
- # When we only found one, check which it is
- else $isStart = $startBracketOffset !== false;
- $bracketOffset = $isStart ? $startBracketOffset : $endBracketOffset;
- if( $isStart ) {
- /** Opening bracket **/
- # Just push our current offset in the string onto the stack
- $offsetStack[] = $startBracketOffset;
- } else {
- /** Closing bracket **/
- # Pop the start pos for our current link zone off the stack
- $startBracketOffset = array_pop( $offsetStack );
- # Just to clean up the code, lets place offsets on the outer ends
- $endBracketOffset += 2;
-
- # Only do logic if we actually have a opening bracket for this
- if( isset( $startBracketOffset ) ) {
- # Extract text inside the link
- @list( $titleText, $paramText ) = explode( '|',
- substr( $s, $startBracketOffset + 2, $endBracketOffset - $startBracketOffset - 4 ), 2 );
- # Create markers only for valid links
- if( preg_match( $titleRegex, $titleText ) ) {
- # Store the text for the marker
- $marker = $markers->addMarker( $titleText, $paramText );
- # Replace the current link with the marker
- $s = substr( $s, 0, $startBracketOffset ) .
- $marker .
- substr( $s, $endBracketOffset );
- # We have modified $s, because of this we need to set the
- # offset manually since the end position is different now
- $offset = $startBracketOffset+strlen( $marker );
- continue;
- }
- # ToDo: Some LinkHooks may allow recursive links inside of
- # the link text, create a regex that also matches our
- # <!-- LINKMARKER ### --> sequence in titles
- # ToDO: Some LinkHooks use patterns rather than namespaces
- # these need to be tested at this point here
- }
- }
- # Bump our offset to after our current bracket
- $offset = $bracketOffset+2;
- }
-
- # Now expand our tree
- wfProfileIn( __METHOD__ . '-expand' );
- $s = $markers->expand( $s );
- wfProfileOut( __METHOD__ . '-expand' );
-
- wfProfileOut( __METHOD__ );
- return $holders;
- }
-
- function replaceInternalLinksCallback( $parser, $holders, $markers, $titleText, $paramText ) {
- wfProfileIn( __METHOD__ );
- $wt = isset( $paramText ) ? "[[$titleText|$paramText]]" : "[[$titleText]]";
- wfProfileIn( __METHOD__ . "-misc" );
-
- # Don't allow internal links to pages containing
- # PROTO: where PROTO is a valid URL protocol; these
- # should be external links.
- if( preg_match( '/^\b(?i:' . wfUrlProtocols() . ')/', $titleText ) ) {
- wfProfileOut( __METHOD__ . "-misc" );
- wfProfileOut( __METHOD__ );
- return $wt;
- }
-
- # Make subpage if necessary
- if( $this->areSubpagesAllowed() ) {
- $titleText = $this->maybeDoSubpageLink( $titleText, $paramText );
- }
-
- # Check for a leading colon and strip it if it is there
- $leadingColon = $titleText[0] == ':';
- if( $leadingColon ) $titleText = substr( $titleText, 1 );
-
- wfProfileOut( __METHOD__ . "-misc" );
- # Make title object
- wfProfileIn( __METHOD__ . "-title" );
- $title = Title::newFromText( $this->mStripState->unstripNoWiki( $titleText ) );
- if( !$title ) {
- wfProfileOut( __METHOD__ . "-title" );
- wfProfileOut( __METHOD__ );
- return $wt;
- }
- $ns = $title->getNamespace();
- wfProfileOut( __METHOD__ . "-title" );
-
- # Default for Namespaces is a default link
- # ToDo: Default for patterns is plain wikitext
- $return = true;
- if( isset( $this->mLinkHooks[$ns] ) ) {
- list( $callback, $flags ) = $this->mLinkHooks[$ns];
- if( $flags & SLH_PATTERN ) {
- $args = array( $parser, $holders, $markers, $titleText, &$paramText, &$leadingColon );
- } else {
- $args = array( $parser, $holders, $markers, $title, $titleText, &$paramText, &$leadingColon );
- }
- # Workaround for PHP bug 35229 and similar
- if ( !is_callable( $callback ) ) {
- throw new MWException( "Tag hook for namespace $ns is not callable\n" );
- }
- $return = call_user_func_array( $callback, $args );
- }
- if( $return === true ) {
- # True (treat as plain link) was returned, call the defaultLinkHook
- $return = CoreLinkFunctions::defaultLinkHook( $parser, $holders, $markers, $title,
- $titleText, $paramText, $leadingColon );
- }
- 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]]";
- }
- # Content was returned, return it
- wfProfileOut( __METHOD__ );
- return $return;
- }
-
-}
-
-class LinkMarkerReplacer {
-
- protected $markers, $nextId, $parser, $holders, $callback;
-
- function __construct( $parser, $holders, $callback ) {
- $this->nextId = 0;
- $this->markers = array();
- $this->parser = $parser;
- $this->holders = $holders;
- $this->callback = $callback;
- }
-
- function addMarker( $titleText, $paramText ) {
- $id = $this->nextId++;
- $this->markers[$id] = array( $titleText, $paramText );
- return "<!-- LINKMARKER $id -->";
- }
-
- function findMarker( $string ) {
- return (bool) preg_match( '/<!-- LINKMARKER [0-9]+ -->/', $string );
- }
-
- function expand( $string ) {
- return StringUtils::delimiterReplaceCallback( "<!-- LINKMARKER ", " -->", array( &$this, 'callback' ), $string );
- }
-
- function callback( $m ) {
- $id = intval( $m[1] );
- if( !array_key_exists( $id, $this->markers ) ) return $m[0];
- $args = $this->markers[$id];
- array_unshift( $args, $this );
- array_unshift( $args, $this->holders );
- array_unshift( $args, $this->parser );
- return call_user_func_array( $this->callback, $args );
- }
-}
diff --git a/includes/parser/Preprocessor_DOM.php b/includes/parser/Preprocessor_DOM.php
index d0c57ab5..3138f483 100644
--- a/includes/parser/Preprocessor_DOM.php
+++ b/includes/parser/Preprocessor_DOM.php
@@ -72,9 +72,8 @@ class Preprocessor_DOM implements Preprocessor {
$xml = "<list>";
foreach ( $values as $k => $val ) {
-
if ( is_int( $k ) ) {
- $xml .= "<part><name index=\"$k\"/><value>" . htmlspecialchars( $val ) ."</value></part>";
+ $xml .= "<part><name index=\"$k\"/><value>" . htmlspecialchars( $val ) . "</value></part>";
} else {
$xml .= "<part><name>" . htmlspecialchars( $k ) . "</name>=<value>" . htmlspecialchars( $val ) . "</value></part>";
}
@@ -149,26 +148,28 @@ class Preprocessor_DOM implements Preprocessor {
wfDebugLog( "Preprocessor", "Loaded preprocessor XML from memcached (key $cacheKey)" );
}
}
- }
- if ( $xml === false ) {
- if ( $cacheable ) {
+ if ( $xml === false ) {
wfProfileIn( __METHOD__ . '-cache-miss' );
$xml = $this->preprocessToXml( $text, $flags );
$cacheValue = sprintf( "%08d", self::CACHE_VERSION ) . $xml;
$wgMemc->set( $cacheKey, $cacheValue, 86400 );
wfProfileOut( __METHOD__ . '-cache-miss' );
wfDebugLog( "Preprocessor", "Saved preprocessor XML to memcached (key $cacheKey)" );
- } else {
- $xml = $this->preprocessToXml( $text, $flags );
}
-
+ } else {
+ $xml = $this->preprocessToXml( $text, $flags );
}
+
// Fail if the number of elements exceeds acceptable limits
// Do not attempt to generate the DOM
$this->parser->mGeneratedPPNodeCount += substr_count( $xml, '<' );
$max = $this->parser->mOptions->getMaxGeneratedPPNodeCount();
if ( $this->parser->mGeneratedPPNodeCount > $max ) {
+ if ( $cacheable ) {
+ wfProfileOut( __METHOD__ . '-cacheable' );
+ }
+ wfProfileOut( __METHOD__ );
throw new MWException( __METHOD__ . ': generated node count limit exceeded' );
}
@@ -182,16 +183,21 @@ class Preprocessor_DOM implements Preprocessor {
$xml = UtfNormal::cleanUp( $xml );
// 1 << 19 == XML_PARSE_HUGE, needed so newer versions of libxml2 don't barf when the XML is >256 levels deep
$result = $dom->loadXML( $xml, 1 << 19 );
- if ( !$result ) {
- throw new MWException( __METHOD__ . ' generated invalid XML' );
- }
}
- $obj = new PPNode_DOM( $dom->documentElement );
+ if ( $result ) {
+ $obj = new PPNode_DOM( $dom->documentElement );
+ }
wfProfileOut( __METHOD__ . '-loadXML' );
+
if ( $cacheable ) {
wfProfileOut( __METHOD__ . '-cacheable' );
}
+
wfProfileOut( __METHOD__ );
+
+ if ( !$result ) {
+ throw new MWException( __METHOD__ . ' generated invalid XML' );
+ }
return $obj;
}
@@ -355,9 +361,11 @@ class Preprocessor_DOM implements Preprocessor {
}
// Handle comments
if ( isset( $matches[2] ) && $matches[2] == '!--' ) {
- // To avoid leaving blank lines, when a comment is both preceded
- // and followed by a newline (ignoring spaces), trim leading and
- // trailing spaces and one of the newlines.
+
+ // To avoid leaving blank lines, when a sequence of
+ // space-separated comments is both preceded and followed by
+ // a newline (ignoring spaces), then
+ // trim leading and trailing spaces and the trailing newline.
// Find the end
$endPos = strpos( $text, '-->', $i + 4 );
@@ -368,10 +376,25 @@ class Preprocessor_DOM implements Preprocessor {
$i = $lengthText;
} else {
// Search backwards for leading whitespace
- $wsStart = $i ? ( $i - strspn( $revText, ' ', $lengthText - $i ) ) : 0;
+ $wsStart = $i ? ( $i - strspn( $revText, " \t", $lengthText - $i ) ) : 0;
+
// Search forwards for trailing whitespace
// $wsEnd will be the position of the last space (or the '>' if there's none)
- $wsEnd = $endPos + 2 + strspn( $text, ' ', $endPos + 3 );
+ $wsEnd = $endPos + 2 + strspn( $text, " \t", $endPos + 3 );
+
+ // Keep looking forward as long as we're finding more
+ // comments.
+ $comments = array( array( $wsStart, $wsEnd ) );
+ while ( substr( $text, $wsEnd + 1, 4 ) == '<!--' ) {
+ $c = strpos( $text, '-->', $wsEnd + 4 );
+ if ( $c === false ) {
+ break;
+ }
+ $c = $c + 2 + strspn( $text, " \t", $c + 3 );
+ $comments[] = array( $wsEnd + 1, $c );
+ $wsEnd = $c;
+ }
+
// Eat the line if possible
// TODO: This could theoretically be done if $wsStart == 0, i.e. for comments at
// the overall start. That's not how Sanitizer::removeHTMLcomments() did it, but
@@ -379,14 +402,26 @@ class Preprocessor_DOM implements Preprocessor {
if ( $wsStart > 0 && substr( $text, $wsStart - 1, 1 ) == "\n"
&& substr( $text, $wsEnd + 1, 1 ) == "\n" )
{
- $startPos = $wsStart;
- $endPos = $wsEnd + 1;
// Remove leading whitespace from the end of the accumulator
// Sanity check first though
$wsLength = $i - $wsStart;
- if ( $wsLength > 0 && substr( $accum, -$wsLength ) === str_repeat( ' ', $wsLength ) ) {
+ if ( $wsLength > 0
+ && strspn( $accum, " \t", -$wsLength ) === $wsLength )
+ {
$accum = substr( $accum, 0, -$wsLength );
}
+
+ // Dump all but the last comment to the accumulator
+ foreach ( $comments as $j => $com ) {
+ $startPos = $com[0];
+ $endPos = $com[1] + 1;
+ if ( $j == ( count( $comments ) - 1 ) ) {
+ break;
+ }
+ $inner = substr( $text, $startPos, $endPos - $startPos );
+ $accum .= '<comment>' . htmlspecialchars( $inner ) . '</comment>';
+ }
+
// Do a line-start run next time to look for headings after the comment
$fakeLineStart = true;
} else {
@@ -397,7 +432,7 @@ class Preprocessor_DOM implements Preprocessor {
if ( $stack->top ) {
$part = $stack->top->getCurrentPart();
- if ( !(isset( $part->commentEnd ) && $part->commentEnd == $wsStart - 1 )) {
+ if ( !( isset( $part->commentEnd ) && $part->commentEnd == $wsStart - 1 ) ) {
$part->visualEnd = $wsStart;
}
// Else comments abutting, no change in visual end
@@ -432,7 +467,7 @@ class Preprocessor_DOM implements Preprocessor {
}
$tagStartPos = $i;
- if ( $text[$tagEndPos-1] == '/' ) {
+ if ( $text[$tagEndPos - 1] == '/' ) {
$attrEnd = $tagEndPos - 1;
$inner = null;
$i = $tagEndPos + 1;
@@ -569,7 +604,7 @@ class Preprocessor_DOM implements Preprocessor {
'open' => $curChar,
'close' => $rule['end'],
'count' => $count,
- 'lineStart' => ($i > 0 && $text[$i-1] == "\n"),
+ 'lineStart' => ( $i > 0 && $text[$i - 1] == "\n" ),
);
$stack->push( $piece );
@@ -746,7 +781,7 @@ class PPDStack {
$class = $this->elementClass;
$this->stack[] = new $class( $data );
}
- $this->top = $this->stack[ count( $this->stack ) - 1 ];
+ $this->top = $this->stack[count( $this->stack ) - 1];
$this->accum =& $this->top->getAccum();
}
@@ -757,7 +792,7 @@ class PPDStack {
$temp = array_pop( $this->stack );
if ( count( $this->stack ) ) {
- $this->top = $this->stack[ count( $this->stack ) - 1 ];
+ $this->top = $this->stack[count( $this->stack ) - 1];
$this->accum =& $this->top->getAccum();
} else {
$this->top = self::$false;
@@ -1014,11 +1049,13 @@ class PPFrame_DOM implements PPFrame {
while ( count( $iteratorStack ) > 1 ) {
$level = count( $outStack ) - 1;
- $iteratorNode =& $iteratorStack[ $level ];
+ $iteratorNode =& $iteratorStack[$level];
$out =& $outStack[$level];
$index =& $indexStack[$level];
- if ( $iteratorNode instanceof PPNode_DOM ) $iteratorNode = $iteratorNode->node;
+ if ( $iteratorNode instanceof PPNode_DOM ) {
+ $iteratorNode = $iteratorNode->node;
+ }
if ( is_array( $iteratorNode ) ) {
if ( $index >= count( $iteratorNode ) ) {
@@ -1148,9 +1185,7 @@ class PPFrame_DOM implements PPFrame {
# Insert a heading marker only for <h> children of <root>
# This is to stop extractSections from going over multiple tree levels
- if ( $contextNode->parentNode->nodeName == 'root'
- && $this->parser->ot['html'] )
- {
+ if ( $contextNode->parentNode->nodeName == 'root' && $this->parser->ot['html'] ) {
# Insert heading index marker
$headingIndex = $contextNode->getAttribute( 'i' );
$titleText = $this->title->getPrefixedDBkey();
@@ -1206,7 +1241,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 );
}
diff --git a/includes/parser/Preprocessor_Hash.php b/includes/parser/Preprocessor_Hash.php
index fad1adbb..2fc5e118 100644
--- a/includes/parser/Preprocessor_Hash.php
+++ b/includes/parser/Preprocessor_Hash.php
@@ -287,9 +287,11 @@ class Preprocessor_Hash implements Preprocessor {
}
// Handle comments
if ( isset( $matches[2] ) && $matches[2] == '!--' ) {
- // To avoid leaving blank lines, when a comment is both preceded
- // and followed by a newline (ignoring spaces), trim leading and
- // trailing spaces and one of the newlines.
+
+ // To avoid leaving blank lines, when a sequence of
+ // space-separated comments is both preceded and followed by
+ // a newline (ignoring spaces), then
+ // trim leading and trailing spaces and the trailing newline.
// Find the end
$endPos = strpos( $text, '-->', $i + 4 );
@@ -300,10 +302,25 @@ class Preprocessor_Hash implements Preprocessor {
$i = $lengthText;
} else {
// Search backwards for leading whitespace
- $wsStart = $i ? ( $i - strspn( $revText, ' ', $lengthText - $i ) ) : 0;
+ $wsStart = $i ? ( $i - strspn( $revText, " \t", $lengthText - $i ) ) : 0;
+
// Search forwards for trailing whitespace
// $wsEnd will be the position of the last space (or the '>' if there's none)
- $wsEnd = $endPos + 2 + strspn( $text, ' ', $endPos + 3 );
+ $wsEnd = $endPos + 2 + strspn( $text, " \t", $endPos + 3 );
+
+ // Keep looking forward as long as we're finding more
+ // comments.
+ $comments = array( array( $wsStart, $wsEnd ) );
+ while ( substr( $text, $wsEnd + 1, 4 ) == '<!--' ) {
+ $c = strpos( $text, '-->', $wsEnd + 4 );
+ if ( $c === false ) {
+ break;
+ }
+ $c = $c + 2 + strspn( $text, " \t", $c + 3 );
+ $comments[] = array( $wsEnd + 1, $c );
+ $wsEnd = $c;
+ }
+
// Eat the line if possible
// TODO: This could theoretically be done if $wsStart == 0, i.e. for comments at
// the overall start. That's not how Sanitizer::removeHTMLcomments() did it, but
@@ -311,17 +328,27 @@ class Preprocessor_Hash implements Preprocessor {
if ( $wsStart > 0 && substr( $text, $wsStart - 1, 1 ) == "\n"
&& substr( $text, $wsEnd + 1, 1 ) == "\n" )
{
- $startPos = $wsStart;
- $endPos = $wsEnd + 1;
// Remove leading whitespace from the end of the accumulator
// Sanity check first though
$wsLength = $i - $wsStart;
if ( $wsLength > 0
&& $accum->lastNode instanceof PPNode_Hash_Text
- && substr( $accum->lastNode->value, -$wsLength ) === str_repeat( ' ', $wsLength ) )
+ && strspn( $accum->lastNode->value, " \t", -$wsLength ) === $wsLength )
{
$accum->lastNode->value = substr( $accum->lastNode->value, 0, -$wsLength );
}
+
+ // Dump all but the last comment to the accumulator
+ foreach ( $comments as $j => $com ) {
+ $startPos = $com[0];
+ $endPos = $com[1] + 1;
+ if ( $j == ( count( $comments ) - 1 ) ) {
+ break;
+ }
+ $inner = substr( $text, $startPos, $endPos - $startPos );
+ $accum->addNodeWithText( 'comment', $inner );
+ }
+
// Do a line-start run next time to look for headings after the comment
$fakeLineStart = true;
} else {
@@ -332,7 +359,7 @@ class Preprocessor_Hash implements Preprocessor {
if ( $stack->top ) {
$part = $stack->top->getCurrentPart();
- if ( !(isset( $part->commentEnd ) && $part->commentEnd == $wsStart - 1 )) {
+ if ( !( isset( $part->commentEnd ) && $part->commentEnd == $wsStart - 1 ) ) {
$part->visualEnd = $wsStart;
}
// Else comments abutting, no change in visual end
@@ -367,7 +394,7 @@ class Preprocessor_Hash implements Preprocessor {
}
$tagStartPos = $i;
- if ( $text[$tagEndPos-1] == '/' ) {
+ if ( $text[$tagEndPos - 1] == '/' ) {
// Short end tag
$attrEnd = $tagEndPos - 1;
$inner = null;
@@ -515,7 +542,7 @@ class Preprocessor_Hash implements Preprocessor {
'open' => $curChar,
'close' => $rule['end'],
'count' => $count,
- 'lineStart' => ($i > 0 && $text[$i-1] == "\n"),
+ 'lineStart' => ( $i > 0 && $text[$i - 1] == "\n" ),
);
$stack->push( $piece );
@@ -591,9 +618,19 @@ class Preprocessor_Hash implements Preprocessor {
$lastNode = $node;
}
if ( !$node ) {
+ if ( $cacheable ) {
+ wfProfileOut( __METHOD__ . '-cache-miss' );
+ wfProfileOut( __METHOD__ . '-cacheable' );
+ }
+ wfProfileOut( __METHOD__ );
throw new MWException( __METHOD__ . ': eqpos not found' );
}
if ( $node->name !== 'equals' ) {
+ if ( $cacheable ) {
+ wfProfileOut( __METHOD__ . '-cache-miss' );
+ wfProfileOut( __METHOD__ . '-cacheable' );
+ }
+ wfProfileOut( __METHOD__ );
throw new MWException( __METHOD__ . ': eqpos is not equals' );
}
$equalsNode = $node;
@@ -952,7 +989,7 @@ class PPFrame_Hash implements PPFrame {
while ( count( $iteratorStack ) > 1 ) {
$level = count( $outStack ) - 1;
- $iteratorNode =& $iteratorStack[ $level ];
+ $iteratorNode =& $iteratorStack[$level];
$out =& $outStack[$level];
$index =& $indexStack[$level];
diff --git a/includes/parser/Tidy.php b/includes/parser/Tidy.php
index 0f7e0d31..32b16aaf 100644
--- a/includes/parser/Tidy.php
+++ b/includes/parser/Tidy.php
@@ -61,7 +61,10 @@ class MWTidyWrapper {
// Replace <mw:editsection> elements with placeholders
$wrappedtext = preg_replace_callback( ParserOutput::EDITSECTION_REGEX,
- array( &$this, 'replaceEditSectionLinksCallback' ), $text );
+ array( &$this, 'replaceCallback' ), $text );
+ // ...and <mw:toc> markers
+ $wrappedtext = preg_replace_callback( '/\<\\/?mw:toc\>/',
+ array( &$this, 'replaceCallback' ), $wrappedtext );
// Modify inline Microdata <link> and <meta> elements so they say <html-link> and <html-meta> so
// we can trick Tidy into not stripping them out by including them in tidy's new-empty-tags config
@@ -80,7 +83,7 @@ class MWTidyWrapper {
*
* @return string
*/
- function replaceEditSectionLinksCallback( $m ) {
+ function replaceCallback( $m ) {
$marker = "{$this->mUniqPrefix}-item-{$this->mMarkerIndex}" . Parser::MARKER_SUFFIX;
$this->mMarkerIndex++;
$this->mTokens->setPair( $marker, $m[0] );
@@ -158,7 +161,7 @@ class MWTidy {
global $wgTidyInternal;
$retval = 0;
- if( $wgTidyInternal ) {
+ if ( $wgTidyInternal ) {
$errorStr = self::execInternalTidy( $text, true, $retval );
} else {
$errorStr = self::execExternalTidy( $text, true, $retval );
@@ -244,7 +247,7 @@ class MWTidy {
global $wgTidyConf, $wgDebugTidy;
wfProfileIn( __METHOD__ );
- if ( !MWInit::classExists( 'tidy' ) ) {
+ if ( !class_exists( 'tidy' ) ) {
wfWarn( "Unable to load internal tidy class." );
$retval = -1;
diff --git a/includes/profiler/Profiler.php b/includes/profiler/Profiler.php
index 5ecdc4f0..2282a3af 100644
--- a/includes/profiler/Profiler.php
+++ b/includes/profiler/Profiler.php
@@ -31,9 +31,11 @@
* @param string $functionname name of the function we will profile
*/
function wfProfileIn( $functionname ) {
- global $wgProfiler;
- if ( $wgProfiler instanceof Profiler || isset( $wgProfiler['class'] ) ) {
- Profiler::instance()->profileIn( $functionname );
+ if ( Profiler::$__instance === null ) { // use this directly to reduce overhead
+ Profiler::instance();
+ }
+ if ( !( Profiler::$__instance instanceof ProfilerStub ) ) {
+ Profiler::$__instance->profileIn( $functionname );
}
}
@@ -42,9 +44,49 @@ function wfProfileIn( $functionname ) {
* @param string $functionname name of the function we have profiled
*/
function wfProfileOut( $functionname = 'missing' ) {
- global $wgProfiler;
- if ( $wgProfiler instanceof Profiler || isset( $wgProfiler['class'] ) ) {
- Profiler::instance()->profileOut( $functionname );
+ if ( Profiler::$__instance === null ) { // use this directly to reduce overhead
+ Profiler::instance();
+ }
+ if ( !( Profiler::$__instance instanceof ProfilerStub ) ) {
+ Profiler::$__instance->profileOut( $functionname );
+ }
+}
+
+/**
+ * Class for handling function-scope profiling
+ *
+ * @since 1.22
+ */
+class ProfileSection {
+ protected $name; // string; method name
+ protected $enabled = false; // boolean; whether profiling is enabled
+
+ /**
+ * Begin profiling of a function and return an object that ends profiling of
+ * the function when that object leaves scope. As long as the object is not
+ * specifically linked to other objects, it will fall out of scope at the same
+ * moment that the function to be profiled terminates.
+ *
+ * This is typically called like:
+ * <code>$section = new ProfileSection( __METHOD__ );</code>
+ *
+ * @param string $name Name of the function to profile
+ */
+ public function __construct( $name ) {
+ $this->name = $name;
+ if ( Profiler::$__instance === null ) { // use this directly to reduce overhead
+ Profiler::instance();
+ }
+ if ( !( Profiler::$__instance instanceof ProfilerStub ) ) {
+ $this->enabled = true;
+ Profiler::$__instance->profileIn( $this->name );
+ }
+ }
+
+ function __destruct() {
+ if ( $this->enabled ) {
+ Profiler::$__instance->profileOut( $this->name );
+ }
}
}
@@ -53,11 +95,19 @@ function wfProfileOut( $functionname = 'missing' ) {
* @todo document
*/
class Profiler {
- protected $mStack = array(), $mWorkStack = array (), $mCollated = array (),
- $mCalls = array (), $mTotals = array ();
+ protected $mStack = array(), $mWorkStack = array(), $mCollated = array(),
+ $mCalls = array(), $mTotals = array();
protected $mTimeMetric = 'wall';
protected $mProfileID = false, $mCollateDone = false, $mTemplated = false;
- private static $__instance = null;
+
+ protected $mDBLockThreshold = 5.0; // float; seconds
+ /** @var Array DB/server name => (active trx count,timestamp) */
+ protected $mDBTrxHoldingLocks = array();
+ /** @var Array DB/server name => list of (method, elapsed time) */
+ protected $mDBTrxMethodTimes = array();
+
+ /** @var Profiler */
+ public static $__instance = null; // do not call this outside Profiler and ProfileSection
function __construct( $params ) {
if ( isset( $params['timeMetric'] ) ) {
@@ -75,22 +125,18 @@ class Profiler {
* @return Profiler
*/
public static function instance() {
- if( is_null( self::$__instance ) ) {
+ if ( self::$__instance === null ) {
global $wgProfiler;
- if( is_array( $wgProfiler ) ) {
- if( !isset( $wgProfiler['class'] ) ) {
- wfDebug( __METHOD__ . " called without \$wgProfiler['class']"
- . " set, falling back to ProfilerStub for safety\n" );
+ if ( is_array( $wgProfiler ) ) {
+ if ( !isset( $wgProfiler['class'] ) ) {
$class = 'ProfilerStub';
} else {
$class = $wgProfiler['class'];
}
self::$__instance = new $class( $wgProfiler );
- } elseif( $wgProfiler instanceof Profiler ) {
+ } elseif ( $wgProfiler instanceof Profiler ) {
self::$__instance = $wgProfiler; // back-compat
} else {
- wfDebug( __METHOD__ . ' called with bogus $wgProfiler setting,'
- . " falling back to ProfilerStub for safety\n" );
self::$__instance = new ProfilerStub( $wgProfiler );
}
}
@@ -157,7 +203,7 @@ class Profiler {
*/
public function profileIn( $functionname ) {
global $wgDebugFunctionEntry;
- if( $wgDebugFunctionEntry ) {
+ if ( $wgDebugFunctionEntry ) {
$this->debug( str_repeat( ' ', count( $this->mWorkStack ) ) . 'Entering ' . $functionname . "\n" );
}
@@ -174,7 +220,7 @@ class Profiler {
$memory = memory_get_usage();
$time = $this->getTime();
- if( $wgDebugFunctionEntry ) {
+ if ( $wgDebugFunctionEntry ) {
$this->debug( str_repeat( ' ', count( $this->mWorkStack ) - 1 ) . 'Exiting ' . $functionname . "\n" );
}
@@ -183,21 +229,19 @@ class Profiler {
if ( !$bit ) {
$this->debug( "Profiling error, !\$bit: $functionname\n" );
} else {
- //if( $wgDebugProfiling ) {
- if( $functionname == 'close' ) {
- $message = "Profile section ended by close(): {$bit[0]}";
- $this->debug( "$message\n" );
- $this->mStack[] = array( $message, 0, 0.0, 0, 0.0, 0 );
- }
- elseif( $bit[0] != $functionname ) {
- $message = "Profiling error: in({$bit[0]}), out($functionname)";
- $this->debug( "$message\n" );
- $this->mStack[] = array( $message, 0, 0.0, 0, 0.0, 0 );
- }
- //}
+ if ( $functionname == 'close' ) {
+ $message = "Profile section ended by close(): {$bit[0]}";
+ $this->debug( "$message\n" );
+ $this->mStack[] = array( $message, 0, 0.0, 0, 0.0, 0 );
+ } elseif ( $bit[0] != $functionname ) {
+ $message = "Profiling error: in({$bit[0]}), out($functionname)";
+ $this->debug( "$message\n" );
+ $this->mStack[] = array( $message, 0, 0.0, 0, 0.0, 0 );
+ }
$bit[] = $time;
$bit[] = $memory;
$this->mStack[] = $bit;
+ $this->updateTrxProfiling( $functionname, $time );
}
}
@@ -205,12 +249,89 @@ class Profiler {
* Close opened profiling sections
*/
public function close() {
- while( count( $this->mWorkStack ) ) {
+ while ( count( $this->mWorkStack ) ) {
$this->profileOut( 'close' );
}
}
/**
+ * Mark a DB as in a transaction with one or more writes pending
+ *
+ * Note that there can be multiple connections to a single DB.
+ *
+ * @param string $server DB server
+ * @param string $db DB name
+ */
+ public function transactionWritingIn( $server, $db ) {
+ $name = "{$server} ({$db})";
+ if ( isset( $this->mDBTrxHoldingLocks[$name] ) ) {
+ ++$this->mDBTrxHoldingLocks[$name]['refs'];
+ } else {
+ $this->mDBTrxHoldingLocks[$name] = array( 'refs' => 1, 'start' => microtime( true ) );
+ $this->mDBTrxMethodTimes[$name] = array();
+ }
+ }
+
+ /**
+ * Register the name and time of a method for slow DB trx detection
+ *
+ * @param string $method Function name
+ * @param float $realtime Wal time ellapsed
+ */
+ protected function updateTrxProfiling( $method, $realtime ) {
+ if ( !$this->mDBTrxHoldingLocks ) {
+ return; // short-circuit
+ // @TODO: hardcoded check is a tad janky (what about FOR UPDATE?)
+ } elseif ( !preg_match( '/^query-m: (?!SELECT)/', $method )
+ && $realtime < $this->mDBLockThreshold )
+ {
+ return; // not a DB master query nor slow enough
+ }
+ $now = microtime( true );
+ foreach ( $this->mDBTrxHoldingLocks as $name => $info ) {
+ // Hacky check to exclude entries from before the first TRX write
+ if ( ( $now - $realtime ) >= $info['start'] ) {
+ $this->mDBTrxMethodTimes[$name][] = array( $method, $realtime );
+ }
+ }
+ }
+
+ /**
+ * Mark a DB as no longer in a transaction
+ *
+ * This will check if locks are possibly held for longer than
+ * needed and log any affected transactions to a special DB log.
+ * Note that there can be multiple connections to a single DB.
+ *
+ * @param string $server DB server
+ * @param string $db DB name
+ */
+ public function transactionWritingOut( $server, $db ) {
+ $name = "{$server} ({$db})";
+ if ( --$this->mDBTrxHoldingLocks[$name]['refs'] <= 0 ) {
+ $slow = false;
+ foreach ( $this->mDBTrxMethodTimes[$name] as $info ) {
+ list( $method, $realtime ) = $info;
+ if ( $realtime >= $this->mDBLockThreshold ) {
+ $slow = true;
+ break;
+ }
+ }
+ if ( $slow ) {
+ $dbs = implode( ', ', array_keys( $this->mDBTrxHoldingLocks ) );
+ $msg = "Sub-optimal transaction on DB(s) {$dbs}:\n";
+ foreach ( $this->mDBTrxMethodTimes[$name] as $i => $info ) {
+ list( $method, $realtime ) = $info;
+ $msg .= sprintf( "%d\t%.6f\t%s\n", $i, $realtime, $method );
+ }
+ wfDebugLog( 'DBPerformance', $msg );
+ }
+ unset( $this->mDBTrxHoldingLocks[$name] );
+ unset( $this->mDBTrxMethodTimes[$name] );
+ }
+ }
+
+ /**
* Mark this call as templated or not
*
* @param $t Boolean
@@ -228,11 +349,11 @@ class Profiler {
global $wgDebugFunctionEntry, $wgProfileCallTree;
$wgDebugFunctionEntry = false;
- if( !count( $this->mStack ) && !count( $this->mCollated ) ) {
+ if ( !count( $this->mStack ) && !count( $this->mCollated ) ) {
return "No profiling output\n";
}
- if( $wgProfileCallTree ) {
+ if ( $wgProfileCallTree ) {
return $this->getCallTree();
} else {
return $this->getFunctionReport();
@@ -254,16 +375,16 @@ class Profiler {
* @return array
*/
function remapCallTree( $stack ) {
- if( count( $stack ) < 2 ) {
+ if ( count( $stack ) < 2 ) {
return $stack;
}
- $outputs = array ();
- for( $max = count( $stack ) - 1; $max > 0; ) {
+ $outputs = array();
+ for ( $max = count( $stack ) - 1; $max > 0; ) {
/* Find all items under this entry */
$level = $stack[$max][1];
- $working = array ();
- for( $i = $max -1; $i >= 0; $i-- ) {
- if( $stack[$i][1] > $level ) {
+ $working = array();
+ for ( $i = $max -1; $i >= 0; $i-- ) {
+ if ( $stack[$i][1] > $level ) {
$working[] = $stack[$i];
} else {
break;
@@ -271,7 +392,7 @@ class Profiler {
}
$working = $this->remapCallTree( array_reverse( $working ) );
$output = array();
- foreach( $working as $item ) {
+ foreach ( $working as $item ) {
array_push( $output, $item );
}
array_unshift( $output, $stack[$max] );
@@ -280,8 +401,8 @@ class Profiler {
array_unshift( $outputs, $output );
}
$final = array();
- foreach( $outputs as $output ) {
- foreach( $output as $item ) {
+ foreach ( $outputs as $output ) {
+ foreach ( $output as $item ) {
$final[] = $item;
}
}
@@ -391,18 +512,17 @@ class Profiler {
# First, subtract the overhead!
$overheadTotal = $overheadMemory = $overheadInternal = array();
- foreach( $this->mStack as $entry ) {
+ foreach ( $this->mStack as $entry ) {
$fname = $entry[0];
$start = $entry[2];
$end = $entry[4];
$elapsed = $end - $start;
$memory = $entry[5] - $entry[3];
- if( $fname == '-overhead-total' ) {
+ if ( $fname == '-overhead-total' ) {
$overheadTotal[] = $elapsed;
$overheadMemory[] = $memory;
- }
- elseif( $fname == '-overhead-internal' ) {
+ } elseif ( $fname == '-overhead-internal' ) {
$overheadInternal[] = $elapsed;
}
}
@@ -411,7 +531,7 @@ class Profiler {
$overheadInternal = $overheadInternal ? array_sum( $overheadInternal ) / count( $overheadInternal ) : 0;
# Collate
- foreach( $this->mStack as $index => $entry ) {
+ foreach ( $this->mStack as $index => $entry ) {
$fname = $entry[0];
$start = $entry[2];
$end = $entry[4];
@@ -420,16 +540,16 @@ class Profiler {
$memory = $entry[5] - $entry[3];
$subcalls = $this->calltreeCount( $this->mStack, $index );
- if( !preg_match( '/^-overhead/', $fname ) ) {
+ if ( !preg_match( '/^-overhead/', $fname ) ) {
# Adjust for profiling overhead (except special values with elapsed=0
- if( $elapsed ) {
+ if ( $elapsed ) {
$elapsed -= $overheadInternal;
- $elapsed -= ($subcalls * $overheadTotal);
- $memory -= ($subcalls * $overheadMemory);
+ $elapsed -= ( $subcalls * $overheadTotal );
+ $memory -= ( $subcalls * $overheadMemory );
}
}
- if( !array_key_exists( $fname, $this->mCollated ) ) {
+ if ( !array_key_exists( $fname, $this->mCollated ) ) {
$this->mCollated[$fname] = 0;
$this->mCalls[$fname] = 0;
$this->mMemory[$fname] = 0;
@@ -467,11 +587,21 @@ class Profiler {
$total = isset( $this->mCollated['-total'] ) ? $this->mCollated['-total'] : 0;
- foreach( $this->mCollated as $fname => $elapsed ) {
+ foreach ( $this->mCollated as $fname => $elapsed ) {
$calls = $this->mCalls[$fname];
$percent = $total ? 100. * $elapsed / $total : 0;
$memory = $this->mMemory[$fname];
- $prof .= sprintf( $format, substr( $fname, 0, $nameWidth ), $calls, (float) ($elapsed * 1000), (float) ($elapsed * 1000) / $calls, $percent, $memory, ( $this->mMin[$fname] * 1000.0 ), ( $this->mMax[$fname] * 1000.0 ), $this->mOverhead[$fname] );
+ $prof .= sprintf( $format,
+ substr( $fname, 0, $nameWidth ),
+ $calls,
+ (float)( $elapsed * 1000 ),
+ (float)( $elapsed * 1000 ) / $calls,
+ $percent,
+ $memory,
+ ( $this->mMin[$fname] * 1000.0 ),
+ ( $this->mMax[$fname] * 1000.0 ),
+ $this->mOverhead[$fname]
+ );
}
$prof .= "\nTotal: $total\n\n";
@@ -483,7 +613,7 @@ class Profiler {
*/
protected static function calculateOverhead( $profileCount ) {
wfProfileIn( '-overhead-total' );
- for( $i = 0; $i < $profileCount; $i++ ) {
+ for ( $i = 0; $i < $profileCount; $i++ ) {
wfProfileIn( '-overhead-internal' );
wfProfileOut( '-overhead-internal' );
}
@@ -515,16 +645,16 @@ class Profiler {
global $wgProfilePerHost, $wgProfileToDatabase;
# Do not log anything if database is readonly (bug 5375)
- if( wfReadOnly() || !$wgProfileToDatabase ) {
+ if ( wfReadOnly() || !$wgProfileToDatabase ) {
return;
}
$dbw = wfGetDB( DB_MASTER );
- if( !is_object( $dbw ) ) {
+ if ( !is_object( $dbw ) ) {
return;
}
- if( $wgProfilePerHost ) {
+ if ( $wgProfilePerHost ) {
$pfhost = wfHostname();
} else {
$pfhost = '';
@@ -533,15 +663,15 @@ class Profiler {
try {
$this->collateData();
- foreach( $this->mCollated as $name => $elapsed ) {
+ foreach ( $this->mCollated as $name => $elapsed ) {
$eventCount = $this->mCalls[$name];
- $timeSum = (float) ($elapsed * 1000);
+ $timeSum = (float)( $elapsed * 1000 );
$memorySum = (float)$this->mMemory[$name];
- $name = substr($name, 0, 255);
+ $name = substr( $name, 0, 255 );
// Kludge
- $timeSum = ($timeSum >= 0) ? $timeSum : 0;
- $memorySum = ($memorySum >= 0) ? $memorySum : 0;
+ $timeSum = $timeSum >= 0 ? $timeSum : 0;
+ $memorySum = $memorySum >= 0 ? $memorySum : 0;
$dbw->update( 'profiling',
array(
@@ -557,9 +687,9 @@ class Profiler {
$rc = $dbw->affectedRows();
if ( $rc == 0 ) {
- $dbw->insert( 'profiling', array ( 'pf_name' => $name, 'pf_count' => $eventCount,
+ $dbw->insert( 'profiling', array( 'pf_name' => $name, 'pf_count' => $eventCount,
'pf_time' => $timeSum, 'pf_memory' => $memorySum, 'pf_server' => $pfhost ),
- __METHOD__, array ( 'IGNORE' ) );
+ __METHOD__, array( 'IGNORE' ) );
}
// When we upgrade to mysql 4.1, the insert+update
// can be merged into just a insert with this construct added:
@@ -585,7 +715,7 @@ class Profiler {
* @param string $s to output
*/
function debug( $s ) {
- if( defined( 'MW_COMPILED' ) || function_exists( 'wfDebug' ) ) {
+ if ( function_exists( 'wfDebug' ) ) {
wfDebug( $s );
}
}
diff --git a/includes/profiler/ProfilerSimple.php b/includes/profiler/ProfilerSimple.php
index 1d4873c6..805c60f4 100644
--- a/includes/profiler/ProfilerSimple.php
+++ b/includes/profiler/ProfilerSimple.php
@@ -96,11 +96,12 @@ class ProfilerSimple extends Profiler {
$this->mCollated[$functionname] =& $entry;
}
$entry['cpu'] += $elapsedcpu;
- $entry['cpu_sq'] += $elapsedcpu*$elapsedcpu;
+ $entry['cpu_sq'] += $elapsedcpu * $elapsedcpu;
$entry['real'] += $elapsedreal;
- $entry['real_sq'] += $elapsedreal*$elapsedreal;
+ $entry['real_sq'] += $elapsedreal * $elapsedreal;
$entry['count']++;
+ $this->updateTrxProfiling( $functionname, $elapsedreal );
}
}
diff --git a/includes/profiler/ProfilerSimpleText.php b/includes/profiler/ProfilerSimpleText.php
index 37350bf3..1d57ea8d 100644
--- a/includes/profiler/ProfilerSimpleText.php
+++ b/includes/profiler/ProfilerSimpleText.php
@@ -51,17 +51,17 @@ class ProfilerSimpleText extends ProfilerSimple {
uasort( $this->mCollated, array( 'self', 'sort' ) );
array_walk( $this->mCollated, array( 'self', 'format' ), $totalReal );
if ( PHP_SAPI === 'cli' ) {
- print "<!--\n".self::$out."\n-->\n";
+ print "<!--\n" . self::$out . "\n-->\n";
} elseif ( $this->getContentType() === 'text/html' ) {
if ( $this->visible ) {
- print '<pre>'.self::$out.'</pre>';
+ print '<pre>' . self::$out . '</pre>';
} else {
- print "<!--\n".self::$out."\n-->\n";
+ print "<!--\n" . self::$out . "\n-->\n";
}
} elseif ( $this->getContentType() === 'text/javascript' ) {
- print "\n/*\n".self::$out."*/\n";
+ print "\n/*\n" . self::$out . "*/\n";
} elseif ( $this->getContentType() === 'text/css' ) {
- print "\n/*\n".self::$out."*/\n";
+ print "\n/*\n" . self::$out . "*/\n";
}
}
}
@@ -71,7 +71,7 @@ class ProfilerSimpleText extends ProfilerSimple {
}
static function format( $item, $key, $totalReal ) {
- $perc = $totalReal ? $item['real']/$totalReal*100 : 0;
+ $perc = $totalReal ? $item['real'] / $totalReal * 100 : 0;
self::$out .= sprintf( "%6.2f%% %3.6f %6d - %s\n",
$perc, $item['real'], $item['count'], $key );
}
diff --git a/includes/profiler/ProfilerSimpleTrace.php b/includes/profiler/ProfilerSimpleTrace.php
index d44dfe1b..5588d1e2 100644
--- a/includes/profiler/ProfilerSimpleTrace.php
+++ b/includes/profiler/ProfilerSimpleTrace.php
@@ -59,6 +59,8 @@ class ProfilerSimpleTrace extends ProfilerSimple {
$elapsedreal = $this->getTime() - $ortime;
$this->trace .= sprintf( "%03.6f %6.1f", $elapsedreal, $this->memoryDiff() ) .
str_repeat( " ", count( $this->mWorkStack ) + 1 ) . " < " . $functionname . "\n";
+
+ $this->updateTrxProfiling( $functionname, $elapsedreal );
}
}
diff --git a/includes/profiler/ProfilerSimpleUDP.php b/includes/profiler/ProfilerSimpleUDP.php
index abefa811..0a1f3b10 100644
--- a/includes/profiler/ProfilerSimpleUDP.php
+++ b/includes/profiler/ProfilerSimpleUDP.php
@@ -32,7 +32,7 @@ class ProfilerSimpleUDP extends ProfilerSimple {
}
public function logData() {
- global $wgUDPProfilerHost, $wgUDPProfilerPort;
+ global $wgUDPProfilerHost, $wgUDPProfilerPort, $wgUDPProfilerFormatString;
$this->close();
@@ -41,24 +41,24 @@ class ProfilerSimpleUDP extends ProfilerSimple {
return;
}
- if ( !MWInit::functionExists( 'socket_create' ) ) {
+ if ( !function_exists( 'socket_create' ) ) {
# Sockets are not enabled
return;
}
- $sock = socket_create(AF_INET, SOCK_DGRAM, SOL_UDP);
+ $sock = socket_create( AF_INET, SOCK_DGRAM, SOL_UDP );
$plength = 0;
$packet = "";
foreach ( $this->mCollated as $entry => $pfdata ) {
- if( !isset( $pfdata['count'] )
+ if ( !isset( $pfdata['count'] )
|| !isset( $pfdata['cpu'] )
|| !isset( $pfdata['cpu_sq'] )
|| !isset( $pfdata['real'] )
|| !isset( $pfdata['real_sq'] ) ) {
continue;
}
- $pfline = sprintf( "%s %s %d %f %f %f %f %s\n", $this->getProfileID(), "-", $pfdata['count'],
- $pfdata['cpu'], $pfdata['cpu_sq'], $pfdata['real'], $pfdata['real_sq'], $entry);
+ $pfline = sprintf( $wgUDPProfilerFormatString, $this->getProfileID(), $pfdata['count'],
+ $pfdata['cpu'], $pfdata['cpu_sq'], $pfdata['real'], $pfdata['real_sq'], $entry );
$length = strlen( $pfline );
/* printf("<!-- $pfline -->"); */
if ( $length + $plength > 1400 ) {
diff --git a/includes/profiler/ProfilerStub.php b/includes/profiler/ProfilerStub.php
index c0eb0fb4..3697f352 100644
--- a/includes/profiler/ProfilerStub.php
+++ b/includes/profiler/ProfilerStub.php
@@ -39,4 +39,6 @@ class ProfilerStub extends Profiler {
public function close() {}
public function logData() {}
public function getCurrentSection() { return ''; }
+ public function transactionWritingIn( $server, $db ) {}
+ public function transactionWritingOut( $server, $db ) {}
}
diff --git a/includes/rcfeed/IRCColourfulRCFeedFormatter.php b/includes/rcfeed/IRCColourfulRCFeedFormatter.php
new file mode 100644
index 00000000..507369f3
--- /dev/null
+++ b/includes/rcfeed/IRCColourfulRCFeedFormatter.php
@@ -0,0 +1,99 @@
+<?php
+class IRCColourfulRCFeedFormatter implements RCFeedFormatter {
+ /**
+ * Generates a colourful notification intended for humans on IRC.
+ * @see RCFeedFormatter::getLine
+ */
+ public function getLine( array $feed, RecentChange $rc, $actionComment ) {
+ global $wgUseRCPatrol, $wgUseNPPatrol, $wgLocalInterwiki,
+ $wgCanonicalServer, $wgScript;
+ $attribs = $rc->getAttributes();
+ if ( $attribs['rc_type'] == RC_LOG ) {
+ // Don't use SpecialPage::getTitleFor, backwards compatibility with
+ // IRC API which expects "Log".
+ $titleObj = Title::newFromText( 'Log/' . $attribs['rc_log_type'], NS_SPECIAL );
+ } else {
+ $titleObj =& $rc->getTitle();
+ }
+ $title = $titleObj->getPrefixedText();
+ $title = self::cleanupForIRC( $title );
+
+ if ( $attribs['rc_type'] == RC_LOG ) {
+ $url = '';
+ } else {
+ $url = $wgCanonicalServer . $wgScript;
+ if ( $attribs['rc_type'] == RC_NEW ) {
+ $query = '?oldid=' . $attribs['rc_this_oldid'];
+ } else {
+ $query = '?diff=' . $attribs['rc_this_oldid'] . '&oldid=' . $attribs['rc_last_oldid'];
+ }
+ if ( $wgUseRCPatrol || ( $attribs['rc_type'] == RC_NEW && $wgUseNPPatrol ) ) {
+ $query .= '&rcid=' . $attribs['rc_id'];
+ }
+ // HACK: We need this hook for WMF's secure server setup
+ wfRunHooks( 'IRCLineURL', array( &$url, &$query ) );
+ $url .= $query;
+ }
+
+ if ( $attribs['rc_old_len'] !== null && $attribs['rc_new_len'] !== null ) {
+ $szdiff = $attribs['rc_new_len'] - $attribs['rc_old_len'];
+ if ( $szdiff < -500 ) {
+ $szdiff = "\002$szdiff\002";
+ } elseif ( $szdiff >= 0 ) {
+ $szdiff = '+' . $szdiff;
+ }
+ // @todo i18n with parentheses in content language?
+ $szdiff = '(' . $szdiff . ')';
+ } else {
+ $szdiff = '';
+ }
+
+ $user = self::cleanupForIRC( $attribs['rc_user_text'] );
+
+ if ( $attribs['rc_type'] == RC_LOG ) {
+ $targetText = $rc->getTitle()->getPrefixedText();
+ $comment = self::cleanupForIRC( str_replace( "[[$targetText]]", "[[\00302$targetText\00310]]", $actionComment ) );
+ $flag = $attribs['rc_log_action'];
+ } else {
+ $comment = self::cleanupForIRC( $attribs['rc_comment'] );
+ $flag = '';
+ if ( !$attribs['rc_patrolled'] && ( $wgUseRCPatrol || $attribs['rc_type'] == RC_NEW && $wgUseNPPatrol ) ) {
+ $flag .= '!';
+ }
+ $flag .= ( $attribs['rc_type'] == RC_NEW ? "N" : "" ) . ( $attribs['rc_minor'] ? "M" : "" ) . ( $attribs['rc_bot'] ? "B" : "" );
+ }
+
+ if ( $feed['add_interwiki_prefix'] === true && $wgLocalInterwiki !== false ) {
+ $prefix = $wgLocalInterwiki;
+ } elseif ( $feed['add_interwiki_prefix'] ) {
+ $prefix = $feed['add_interwiki_prefix'];
+ } else {
+ $prefix = false;
+ }
+ if ( $prefix !== false ) {
+ $titleString = "\00314[[\00303$prefix:\00307$title\00314]]";
+ } else {
+ $titleString = "\00314[[\00307$title\00314]]";
+ }
+
+ # see http://www.irssi.org/documentation/formats for some colour codes. prefix is \003,
+ # no colour (\003) switches back to the term default
+ $fullString = "$titleString\0034 $flag\00310 " .
+ "\00302$url\003 \0035*\003 \00303$user\003 \0035*\003 $szdiff \00310$comment\003\n";
+
+ return $fullString;
+ }
+
+ /**
+ * Remove newlines, carriage returns and decode html entites
+ * @param string $text
+ * @return string
+ */
+ public static function cleanupForIRC( $text ) {
+ return Sanitizer::decodeCharReferences( str_replace(
+ array( "\n", "\r" ),
+ array( " ", "" ),
+ $text
+ ) );
+ }
+}
diff --git a/includes/rcfeed/JSONRCFeedFormatter.php b/includes/rcfeed/JSONRCFeedFormatter.php
new file mode 100644
index 00000000..f4cb9921
--- /dev/null
+++ b/includes/rcfeed/JSONRCFeedFormatter.php
@@ -0,0 +1,90 @@
+<?php
+
+class JSONRCFeedFormatter implements RCFeedFormatter {
+ /**
+ * Generates a notification that can be easily interpreted by a machine.
+ * @see RCFeedFormatter::getLine
+ */
+ public function getLine( array $feed, RecentChange $rc, $actionComment ) {
+ global $wgCanonicalServer, $wgScriptPath, $wgDBname;
+ $attrib = $rc->getAttributes();
+
+ $packet = array(
+ // Usually, RC ID is exposed only for patrolling purposes,
+ // but there is no real reason not to expose it in other cases,
+ // and I can see how this may be potentially useful for clients.
+ 'id' => $attrib['rc_id'],
+ 'type' => $attrib['rc_type'],
+ 'namespace' => $rc->getTitle()->getNamespace(),
+ 'title' => $rc->getTitle()->getPrefixedText(),
+ 'comment' => $attrib['rc_comment'],
+ 'timestamp' => (int)wfTimestamp( TS_UNIX, $attrib['rc_timestamp'] ),
+ 'user' => $attrib['rc_user_text'],
+ 'bot' => (bool)$attrib['rc_bot'],
+ );
+
+ if ( isset( $feed['channel'] ) ) {
+ $packet['channel'] = $feed['channel'];
+ }
+
+ $type = $attrib['rc_type'];
+ if ( $type == RC_EDIT || $type == RC_NEW ) {
+ global $wgUseRCPatrol, $wgUseNPPatrol;
+
+ $packet['minor'] = $attrib['rc_minor'];
+ if ( $wgUseRCPatrol || ( $type == RC_NEW && $wgUseNPPatrol ) ) {
+ $packet['patrolled'] = $attrib['rc_patrolled'];
+ }
+ }
+
+ switch ( $type ) {
+ case RC_EDIT:
+ $packet['length'] = array( 'old' => $attrib['rc_old_len'], 'new' => $attrib['rc_new_len'] );
+ $packet['revision'] = array( 'old' => $attrib['rc_last_oldid'], 'new' => $attrib['rc_this_oldid'] );
+ break;
+
+ case RC_NEW:
+ $packet['length'] = array( 'old' => NULL, 'new' => $attrib['rc_new_len'] );
+ $packet['revision'] = array( 'old' => NULL, 'new' => $attrib['rc_this_oldid'] );
+ break;
+
+ case RC_LOG:
+ $packet['log_type'] = $attrib['rc_log_type'];
+ $packet['log_action'] = $attrib['rc_log_action'];
+ if ( $attrib['rc_params'] ) {
+ wfSuppressWarnings();
+ $params = unserialize( $attrib['rc_params'] );
+ wfRestoreWarnings();
+ if (
+ // If it's an actual serialised false...
+ $attrib['rc_params'] == serialize( false ) ||
+ // Or if we did not get false back when trying to unserialise
+ $params !== false
+ ) {
+ // From ApiQueryLogEvents::addLogParams
+ $logParams = array();
+ // Keys like "4::paramname" can't be used for output so we change them to "paramname"
+ foreach ( $params as $key => $value ) {
+ if ( strpos( $key, ':' ) === false ) {
+ $logParams[$key] = $value;
+ continue;
+ }
+ $logParam = explode( ':', $key, 3 );
+ $logParams[$logParam[2]] = $value;
+ }
+ $packet['log_params'] = $logParams;
+ } else {
+ $packet['log_params'] = explode( "\n", $attrib['rc_params'] );
+ }
+ }
+ $packet['log_action_comment'] = $actionComment;
+ break;
+ }
+
+ $packet['server_url'] = $wgCanonicalServer;
+ $packet['server_script_path'] = $wgScriptPath ?: '/';
+ $packet['wiki'] = $wgDBname;
+
+ return FormatJson::encode( $packet );
+ }
+}
diff --git a/includes/rcfeed/RCFeedEngine.php b/includes/rcfeed/RCFeedEngine.php
new file mode 100644
index 00000000..f733bcb7
--- /dev/null
+++ b/includes/rcfeed/RCFeedEngine.php
@@ -0,0 +1,12 @@
+<?php
+interface RCFeedEngine {
+ /**
+ * Sends some text to the specified live feed.
+ *
+ * @see RecentChange::cleanupForIRC
+ * @param array $feed The feed, as configured in an associative array.
+ * @param string $line The text to send.
+ * @return boolean success
+ */
+ public function send( array $feed, $line );
+}
diff --git a/includes/rcfeed/RCFeedFormatter.php b/includes/rcfeed/RCFeedFormatter.php
new file mode 100644
index 00000000..6c9f8042
--- /dev/null
+++ b/includes/rcfeed/RCFeedFormatter.php
@@ -0,0 +1,13 @@
+<?php
+interface RCFeedFormatter {
+ /**
+ * Formats the line for the live feed.
+ *
+ * @param array $feed The feed, as configured in an associative array.
+ * @param RecentChange $rc The RecentChange object showing what sort
+ * of event has taken place.
+ * @param string|null $actionComment
+ * @return string The text to send.
+ */
+ public function getLine( array $feed, RecentChange $rc, $actionComment );
+}
diff --git a/includes/rcfeed/RedisPubSubFeedEngine.php b/includes/rcfeed/RedisPubSubFeedEngine.php
new file mode 100644
index 00000000..4bcc1337
--- /dev/null
+++ b/includes/rcfeed/RedisPubSubFeedEngine.php
@@ -0,0 +1,41 @@
+<?php
+class RedisPubSubFeedEngine implements RCFeedEngine {
+ /**
+ * Emit a recent change notification via Redis Pub/Sub
+ *
+ * If the feed URI contains a path component, it will be used to generate a
+ * channel name by stripping the leading slash and replacing any remaining
+ * slashes with '.'. If no path component is present, the channel is set to
+ * 'rc'. If the URI contains a query string, its parameters will be parsed
+ * as RedisConnectionPool options.
+ *
+ * @example $wgRCFeeds['redis'] = array(
+ * 'formatter' => 'JSONRCFeedFormatter',
+ * 'uri' => "redis://127.0.0.1:6379/rc.$wgDBname",
+ * );
+ *
+ * @since 1.22
+ */
+ public function send( array $feed, $line ) {
+ $parsed = parse_url( $feed['uri'] );
+ $server = $parsed['host'];
+ $options = array( 'serializer' => 'none' );
+ $channel = 'rc';
+
+ if ( isset( $parsed['port'] ) ) {
+ $server .= ":{$parsed['port']}";
+ }
+ if ( isset( $parsed['query'] ) ) {
+ parse_str( $parsed['query'], $options );
+ }
+ if ( isset( $parsed['pass'] ) ) {
+ $options['password'] = $parsed['pass'];
+ }
+ if ( isset( $parsed['path'] ) ) {
+ $channel = str_replace( '/', '.', ltrim( $parsed['path'], '/' ) );
+ }
+ $pool = RedisConnectionPool::singleton( $options );
+ $conn = $pool->getConnection( $server );
+ $conn->publish( $channel, $line );
+ }
+}
diff --git a/includes/rcfeed/UDPRCFeedEngine.php b/includes/rcfeed/UDPRCFeedEngine.php
new file mode 100644
index 00000000..beeb73bd
--- /dev/null
+++ b/includes/rcfeed/UDPRCFeedEngine.php
@@ -0,0 +1,10 @@
+<?php
+class UDPRCFeedEngine implements RCFeedEngine {
+ /**
+ * Sends the notification to the specified host in a UDP packet.
+ * @see RCFeedEngine::send
+ */
+ public function send( array $feed, $line ) {
+ wfErrorLog( $line, $feed['uri'] );
+ }
+}
diff --git a/includes/resourceloader/ResourceLoader.php b/includes/resourceloader/ResourceLoader.php
index 4e047be4..6380efcf 100644
--- a/includes/resourceloader/ResourceLoader.php
+++ b/includes/resourceloader/ResourceLoader.php
@@ -47,6 +47,9 @@ class ResourceLoader {
/** array( 'source-id' => array( 'loadScript' => 'http://.../load.php' ) ) **/
protected $sources = array();
+ /** @var bool */
+ protected $hasErrors = false;
+
/* Protected Methods */
/**
@@ -150,6 +153,7 @@ class ResourceLoader {
$cache = wfGetCache( CACHE_ANYTHING );
$cacheEntry = $cache->get( $key );
if ( is_string( $cacheEntry ) ) {
+ wfIncrStats( "rl-$filter-cache-hits" );
wfProfileOut( __METHOD__ );
return $cacheEntry;
}
@@ -157,6 +161,7 @@ class ResourceLoader {
$result = '';
// Run the filter - we've already verified one of these will work
try {
+ wfIncrStats( "rl-$filter-cache-misses" );
switch ( $filter ) {
case 'minify-js':
$result = JavaScriptMinifier::minify( $data,
@@ -173,10 +178,12 @@ class ResourceLoader {
// Save filtered text to Memcached
$cache->set( $key, $result );
- } catch ( Exception $exception ) {
- // Return exception as a comment
- $result = $this->formatException( $exception );
+ } catch ( Exception $e ) {
+ MWExceptionHandler::logException( $e );
+ wfDebugLog( 'resourceloader', __METHOD__ . ": minification failed: $e" );
$this->hasErrors = true;
+ // Return exception as a comment
+ $result = self::formatException( $e );
}
wfProfileOut( __METHOD__ );
@@ -201,7 +208,7 @@ class ResourceLoader {
$this->addSource( $wgResourceLoaderSources );
// Register core modules
- $this->register( include( "$IP/resources/Resources.php" ) );
+ $this->register( include "$IP/resources/Resources.php" );
// Register extension modules
wfRunHooks( 'ResourceLoaderRegisterModules', array( &$this ) );
$this->register( $wgResourceModules );
@@ -234,6 +241,7 @@ class ResourceLoader {
foreach ( $registrations as $name => $info ) {
// Disallow duplicate registrations
if ( isset( $this->moduleInfos[$name] ) ) {
+ wfProfileOut( __METHOD__ );
// A module has already been registered by this name
throw new MWException(
'ResourceLoader duplicate registration error. ' .
@@ -243,6 +251,7 @@ class ResourceLoader {
// Check $name for validity
if ( !self::isValidModuleName( $name ) ) {
+ wfProfileOut( __METHOD__ );
throw new MWException( "ResourceLoader module name '$name' is invalid, see ResourceLoader::isValidModuleName()" );
}
@@ -251,6 +260,7 @@ class ResourceLoader {
// Old calling convention
// Validate the input
if ( !( $info instanceof ResourceLoaderModule ) ) {
+ wfProfileOut( __METHOD__ );
throw new MWException( 'ResourceLoader invalid module error. ' .
'Instances of ResourceLoaderModule expected.' );
}
@@ -273,24 +283,28 @@ class ResourceLoader {
global $IP, $wgEnableJavaScriptTest;
if ( $wgEnableJavaScriptTest !== true ) {
- throw new MWException( 'Attempt to register JavaScript test modules but <tt>$wgEnableJavaScriptTest</tt> is false. Edit your <tt>LocalSettings.php</tt> to enable it.' );
+ throw new MWException( 'Attempt to register JavaScript test modules but <code>$wgEnableJavaScriptTest</code> is false. Edit your <code>LocalSettings.php</code> to enable it.' );
}
wfProfileIn( __METHOD__ );
// Get core test suites
$testModules = array();
- $testModules['qunit'] = include( "$IP/tests/qunit/QUnitTestResources.php" );
+ $testModules['qunit'] = include "$IP/tests/qunit/QUnitTestResources.php";
// Get other test suites (e.g. from extensions)
wfRunHooks( 'ResourceLoaderTestModules', array( &$testModules, &$this ) );
// Add the testrunner (which configures QUnit) to the dependencies.
// Since it must be ready before any of the test suites are executed.
- foreach( $testModules['qunit'] as $moduleName => $moduleProps ) {
- $testModules['qunit'][$moduleName]['dependencies'][] = 'mediawiki.tests.qunit.testrunner';
+ foreach ( $testModules['qunit'] as &$module ) {
+ // Make sure all test modules are top-loading so that when QUnit starts
+ // on document-ready, it will run once and finish. If some tests arrive
+ // later (possibly after QUnit has already finished) they will be ignored.
+ $module['position'] = 'top';
+ $module['dependencies'][] = 'mediawiki.tests.qunit.testrunner';
}
- foreach( $testModules as $id => $names ) {
+ foreach ( $testModules as $id => $names ) {
// Register test modules
$this->register( $testModules[$id] );
@@ -311,7 +325,7 @@ class ResourceLoader {
* @param array $properties source properties
* @throws MWException
*/
- public function addSource( $id, $properties = null) {
+ public function addSource( $id, $properties = null ) {
// Allow multiple sources to be registered in one call
if ( is_array( $id ) ) {
foreach ( $id as $key => $value ) {
@@ -357,7 +371,7 @@ class ResourceLoader {
* @return Array
*/
public function getTestModuleNames( $framework = 'all' ) {
- /// @TODO: api siteinfo prop testmodulenames modulenames
+ /// @todo api siteinfo prop testmodulenames modulenames
if ( $framework == 'all' ) {
return $this->testModuleNames;
} elseif ( isset( $this->testModuleNames[$framework] ) && is_array( $this->testModuleNames[$framework] ) ) {
@@ -381,6 +395,7 @@ class ResourceLoader {
}
// Construct the requested object
$info = $this->moduleInfos[$name];
+ /** @var ResourceLoaderModule $object */
if ( isset( $info['object'] ) ) {
// Object given in info array
$object = $info['object'];
@@ -435,7 +450,6 @@ class ResourceLoader {
wfProfileIn( __METHOD__ );
$errors = '';
- $this->hasErrors = false;
// Split requested modules into two groups, modules and missing
$modules = array();
@@ -446,8 +460,11 @@ class ResourceLoader {
// Do not allow private modules to be loaded from the web.
// This is a security issue, see bug 34907.
if ( $module->getGroup() === 'private' ) {
- $errors .= $this->makeComment( "Cannot show private module \"$name\"" );
+ wfDebugLog( 'resourceloader', __METHOD__ . ": request for private module '$name' denied" );
$this->hasErrors = true;
+ // Add exception to the output as a comment
+ $errors .= self::makeComment( "Cannot show private module \"$name\"" );
+
continue;
}
$modules[$name] = $module;
@@ -459,13 +476,15 @@ class ResourceLoader {
// 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
- $errors .= $this->formatException( $e );
+ } catch ( Exception $e ) {
+ MWExceptionHandler::logException( $e );
+ wfDebugLog( 'resourceloader', __METHOD__ . ": preloading module info failed: $e" );
$this->hasErrors = true;
+ // Add exception to the output as a comment
+ $errors .= self::formatException( $e );
}
- wfProfileIn( __METHOD__.'-getModifiedTime' );
+ wfProfileIn( __METHOD__ . '-getModifiedTime' );
// To send Last-Modified and support If-Modified-Since, we need to detect
// the last modified time
@@ -478,13 +497,15 @@ class ResourceLoader {
// Calculate maximum modified time
$mtime = max( $mtime, $module->getModifiedTime( $context ) );
} catch ( Exception $e ) {
- // Add exception to the output as a comment
- $errors .= $this->formatException( $e );
+ MWExceptionHandler::logException( $e );
+ wfDebugLog( 'resourceloader', __METHOD__ . ": calculating maximum modified time failed: $e" );
$this->hasErrors = true;
+ // Add exception to the output as a comment
+ $errors .= self::formatException( $e );
}
}
- wfProfileOut( __METHOD__.'-getModifiedTime' );
+ wfProfileOut( __METHOD__ . '-getModifiedTime' );
// If there's an If-Modified-Since header, respond with a 304 appropriately
if ( $this->tryRespondLastModified( $context, $mtime ) ) {
@@ -501,7 +522,7 @@ class ResourceLoader {
// 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 = $this->makeComment( $warnings ) . $response;
+ $response = self::makeComment( $warnings ) . $response;
$this->hasErrors = true;
}
@@ -531,7 +552,7 @@ class ResourceLoader {
* Send content type and last modified headers to the client.
* @param $context ResourceLoaderContext
* @param string $mtime TS_MW timestamp to use for last-modified
- * @param bool $error Whether there are commented-out errors in the response
+ * @param bool $errors Whether there are commented-out errors in the response
* @return void
*/
protected function sendResponseHeaders( ResourceLoaderContext $context, $mtime, $errors ) {
@@ -550,6 +571,7 @@ class ResourceLoader {
}
if ( $context->getOnly() === 'styles' ) {
header( 'Content-Type: text/css; charset=utf-8' );
+ header( 'Access-Control-Allow-Origin: *' );
} else {
header( 'Content-Type: text/javascript; charset=utf-8' );
}
@@ -570,7 +592,7 @@ class ResourceLoader {
* and clear out the output buffer. If the client cache is too old then do nothing.
* @param $context ResourceLoaderContext
* @param string $mtime The TS_MW timestamp to check the header against
- * @return bool True iff 304 header sent and output handled
+ * @return bool True if 304 header sent and output handled
*/
protected function tryRespondLastModified( ResourceLoaderContext $context, $mtime ) {
// If there's an If-Modified-Since header, respond with a 304 appropriately
@@ -590,13 +612,7 @@ class ResourceLoader {
// 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();
- }
+ wfResetOutputBuffers( /* $resetGzipEncoding = */ true );
header( 'HTTP/1.0 304 Not Modified' );
header( 'Status: 304 Not Modified' );
@@ -628,7 +644,7 @@ class ResourceLoader {
if ( !$good ) {
try { // RL always hits the DB on file cache miss...
wfGetDB( DB_SLAVE );
- } catch( DBConnectionError $e ) { // ...check if we need to fallback to cache
+ } catch ( DBConnectionError $e ) { // ...check if we need to fallback to cache
$good = $fileCache->isCacheGood(); // cache existence check
}
}
@@ -657,7 +673,14 @@ class ResourceLoader {
return false; // cache miss
}
- protected function makeComment( $text ) {
+ /**
+ * Generate a CSS or JS comment block. Only use this for public data,
+ * not error message details.
+ *
+ * @param $text string
+ * @return string
+ */
+ public static function makeComment( $text ) {
$encText = str_replace( '*/', '* /', $text );
return "/*\n$encText\n*/\n";
}
@@ -668,13 +691,13 @@ class ResourceLoader {
* @param Exception $e to be shown to the user
* @return string sanitized text that can be returned to the user
*/
- protected function formatException( $e ) {
+ public static function formatException( $e ) {
global $wgShowExceptionDetails;
if ( $wgShowExceptionDetails ) {
- return $this->makeComment( $e->__toString() );
+ return self::makeComment( $e->__toString() );
} else {
- return $this->makeComment( wfMessage( 'internalerror' )->text() );
+ return self::makeComment( wfMessage( 'internalerror' )->text() );
}
}
@@ -687,8 +710,8 @@ class ResourceLoader {
* @return String: Response data
*/
public function makeModuleResponse( ResourceLoaderContext $context,
- array $modules, $missing = array() )
- {
+ array $modules, $missing = array()
+ ) {
$out = '';
$exceptions = '';
if ( $modules === array() && $missing === array() ) {
@@ -701,9 +724,11 @@ class ResourceLoader {
try {
$blobs = MessageBlobStore::get( $this, $modules, $context->getLanguage() );
} catch ( Exception $e ) {
- // Add exception to the output as a comment
- $exceptions .= $this->formatException( $e );
+ MWExceptionHandler::logException( $e );
+ wfDebugLog( 'resourceloader', __METHOD__ . ": pre-fetching blobs from MessageBlobStore failed: $e" );
$this->hasErrors = true;
+ // Add exception to the output as a comment
+ $exceptions .= self::formatException( $e );
}
} else {
$blobs = array();
@@ -807,9 +832,11 @@ class ResourceLoader {
break;
}
} catch ( Exception $e ) {
- // Add exception to the output as a comment
- $exceptions .= $this->formatException( $e );
+ MWExceptionHandler::logException( $e );
+ wfDebugLog( 'resourceloader', __METHOD__ . ": generating module package failed: $e" );
$this->hasErrors = true;
+ // Add exception to the output as a comment
+ $exceptions .= self::formatException( $e );
// Register module as missing
$missing[] = $name;
@@ -879,7 +906,9 @@ class ResourceLoader {
// output javascript "[]" instead of "{}". This fixes that.
(object)$styles,
(object)$messages
- ) );
+ ),
+ ResourceLoader::inDebugMode()
+ );
}
/**
@@ -908,7 +937,7 @@ class ResourceLoader {
// ResourceLoaderFileModule::getStyle can return the styles
// as a string or an array of strings. This is to allow separation in
// the front-end.
- $styles = (array) $styles;
+ $styles = (array)$styles;
foreach ( $styles as $style ) {
$style = trim( $style );
// Don't output an empty "@media print { }" block (bug 40498)
@@ -919,7 +948,7 @@ class ResourceLoader {
if ( $media === '' || $media == 'all' ) {
$out[] = $style;
- } else if ( is_string( $media ) ) {
+ } elseif ( is_string( $media ) ) {
$out[] = "@media $media {\n" . str_replace( "\n", "\n\t", "\t" . $style ) . "}";
}
// else: skip
@@ -1000,12 +1029,12 @@ class ResourceLoader {
* @return string
*/
public static function makeLoaderRegisterScript( $name, $version = null,
- $dependencies = null, $group = null, $source = null )
- {
+ $dependencies = null, $group = null, $source = null
+ ) {
if ( is_array( $name ) ) {
return Xml::encodeJsCall( 'mw.loader.register', array( $name ) );
} else {
- $version = (int) $version > 1 ? (int) $version : 1;
+ $version = (int)$version > 1 ? (int)$version : 1;
return Xml::encodeJsCall( 'mw.loader.register',
array( $name, $version, $dependencies, $group, $source ) );
}
@@ -1055,7 +1084,7 @@ class ResourceLoader {
* @return string
*/
public static function makeConfigSetScript( array $configuration ) {
- return Xml::encodeJsCall( 'mw.config.set', array( $configuration ) );
+ return Xml::encodeJsCall( 'mw.config.set', array( $configuration ), ResourceLoader::inDebugMode() );
}
/**
@@ -1128,6 +1157,18 @@ class ResourceLoader {
/**
* Build a query array (array representation of query string) for load.php. Helper
* function for makeLoaderURL().
+ *
+ * @param array $modules
+ * @param string $lang
+ * @param string $skin
+ * @param string $user
+ * @param string $version
+ * @param bool $debug
+ * @param string $only
+ * @param bool $printable
+ * @param bool $handheld
+ * @param array $extraQuery
+ *
* @return array
*/
public static function makeLoaderQuery( $modules, $lang, $skin, $user = null, $version = null, $debug = false, $only = null,
@@ -1172,4 +1213,48 @@ class ResourceLoader {
public static function isValidModuleName( $moduleName ) {
return !preg_match( '/[|,!]/', $moduleName ) && strlen( $moduleName ) <= 255;
}
+
+ /**
+ * Returns LESS compiler set up for use with MediaWiki
+ *
+ * @since 1.22
+ * @return lessc
+ */
+ public static function getLessCompiler() {
+ global $wgResourceLoaderLESSFunctions, $wgResourceLoaderLESSImportPaths;
+
+ // When called from the installer, it is possible that a required PHP extension
+ // is missing (at least for now; see bug 47564). If this is the case, throw an
+ // exception (caught by the installer) to prevent a fatal error later on.
+ if ( !function_exists( 'ctype_digit' ) ) {
+ throw new MWException( 'lessc requires the Ctype extension' );
+ }
+
+ $less = new lessc();
+ $less->setPreserveComments( true );
+ $less->setVariables( self::getLESSVars() );
+ $less->setImportDir( $wgResourceLoaderLESSImportPaths );
+ foreach ( $wgResourceLoaderLESSFunctions as $name => $func ) {
+ $less->registerFunction( $name, $func );
+ }
+ return $less;
+ }
+
+ /**
+ * Get global LESS variables.
+ *
+ * $since 1.22
+ * @return array: Map of variable names to string CSS values.
+ */
+ public static function getLESSVars() {
+ global $wgResourceLoaderLESSVars;
+
+ static $lessVars = null;
+ if ( $lessVars === null ) {
+ $lessVars = $wgResourceLoaderLESSVars;
+ // Sort by key to ensure consistent hashing for cache lookups.
+ ksort( $lessVars );
+ }
+ return $lessVars;
+ }
}
diff --git a/includes/resourceloader/ResourceLoaderContext.php b/includes/resourceloader/ResourceLoaderContext.php
index 4588015f..22ff6a7e 100644
--- a/includes/resourceloader/ResourceLoaderContext.php
+++ b/includes/resourceloader/ResourceLoaderContext.php
@@ -96,7 +96,7 @@ class ResourceLoaderContext {
$pos = strrpos( $group, '.' );
if ( $pos === false ) {
// Prefixless modules, i.e. without dots
- $retval = explode( ',', $group );
+ $retval = array_merge( $retval, explode( ',', $group ) );
} else {
// We have a prefix and a bunch of suffixes
$prefix = substr( $group, 0, $pos ); // 'foo'
diff --git a/includes/resourceloader/ResourceLoaderFileModule.php b/includes/resourceloader/ResourceLoaderFileModule.php
index cedb5dcc..9ed181ed 100644
--- a/includes/resourceloader/ResourceLoaderFileModule.php
+++ b/includes/resourceloader/ResourceLoaderFileModule.php
@@ -116,6 +116,12 @@ class ResourceLoaderFileModule extends ResourceLoaderModule {
protected $targets = array( 'desktop' );
/**
+ * Boolean: Whether getStyleURLsForDebug should return raw file paths,
+ * or return load.php urls
+ */
+ protected $hasGeneratedStyles = false;
+
+ /**
* Array: Cache for mtime
* @par Usage:
* @code
@@ -187,8 +193,8 @@ class ResourceLoaderFileModule extends ResourceLoaderModule {
* @endcode
*/
public function __construct( $options = array(), $localBasePath = null,
- $remoteBasePath = null )
- {
+ $remoteBasePath = null
+ ) {
global $IP, $wgScriptPath, $wgResourceBasePath;
$this->localBasePath = $localBasePath === null ? $IP : $localBasePath;
if ( $remoteBasePath !== null ) {
@@ -209,7 +215,7 @@ class ResourceLoaderFileModule extends ResourceLoaderModule {
case 'debugScripts':
case 'loaderScripts':
case 'styles':
- $this->{$member} = (array) $option;
+ $this->{$member} = (array)$option;
break;
// Collated lists of file paths
case 'languageScripts':
@@ -228,26 +234,26 @@ class ResourceLoaderFileModule extends ResourceLoaderModule {
"'$key' given, string expected."
);
}
- $this->{$member}[$key] = (array) $value;
+ $this->{$member}[$key] = (array)$value;
}
break;
// Lists of strings
case 'dependencies':
case 'messages':
case 'targets':
- $this->{$member} = (array) $option;
+ $this->{$member} = (array)$option;
break;
// Single strings
case 'group':
case 'position':
case 'localBasePath':
case 'remoteBasePath':
- $this->{$member} = (string) $option;
+ $this->{$member} = (string)$option;
break;
// Single booleans
case 'debugRaw':
case 'raw':
- $this->{$member} = (bool) $option;
+ $this->{$member} = (bool)$option;
break;
}
}
@@ -259,8 +265,8 @@ class ResourceLoaderFileModule extends ResourceLoaderModule {
/**
* Gets all scripts for a given context concatenated together.
*
- * @param $context ResourceLoaderContext: Context in which to generate script
- * @return String: JavaScript code for $context
+ * @param ResourceLoaderContext $context Context in which to generate script
+ * @return string: JavaScript code for $context
*/
public function getScript( ResourceLoaderContext $context ) {
$files = $this->getScriptFiles( $context );
@@ -268,7 +274,7 @@ class ResourceLoaderFileModule extends ResourceLoaderModule {
}
/**
- * @param $context ResourceLoaderContext
+ * @param ResourceLoaderContext $context
* @return array
*/
public function getScriptURLsForDebug( ResourceLoaderContext $context ) {
@@ -289,7 +295,7 @@ class ResourceLoaderFileModule extends ResourceLoaderModule {
/**
* Gets loader script.
*
- * @return String: JavaScript code to be added to startup module
+ * @return string: JavaScript code to be added to startup module
*/
public function getLoaderScript() {
if ( count( $this->loaderScripts ) == 0 ) {
@@ -301,8 +307,8 @@ class ResourceLoaderFileModule extends ResourceLoaderModule {
/**
* Gets all styles for a given context concatenated together.
*
- * @param $context ResourceLoaderContext: Context in which to generate styles
- * @return String: CSS code for $context
+ * @param ResourceLoaderContext $context Context in which to generate styles
+ * @return string: CSS code for $context
*/
public function getStyles( ResourceLoaderContext $context ) {
$styles = $this->readStyleFiles(
@@ -324,16 +330,23 @@ class ResourceLoaderFileModule extends ResourceLoaderModule {
);
}
} catch ( Exception $e ) {
- wfDebug( __METHOD__ . " failed to update DB: $e\n" );
+ wfDebugLog( 'resourceloader', __METHOD__ . ": failed to update DB: $e" );
}
return $styles;
}
/**
- * @param $context ResourceLoaderContext
+ * @param ResourceLoaderContext $context
* @return array
*/
public function getStyleURLsForDebug( ResourceLoaderContext $context ) {
+ if ( $this->hasGeneratedStyles ) {
+ // Do the default behaviour of returning a url back to load.php
+ // but with only=styles.
+ return parent::getStyleURLsForDebug( $context );
+ }
+ // Our module consists entirely of real css files,
+ // in debug mode we can load those directly.
$urls = array();
foreach ( $this->getStyleFiles( $context ) as $mediaType => $list ) {
$urls[$mediaType] = array();
@@ -347,7 +360,7 @@ class ResourceLoaderFileModule extends ResourceLoaderModule {
/**
* Gets list of message keys used by this module.
*
- * @return Array: List of message keys
+ * @return array: List of message keys
*/
public function getMessages() {
return $this->messages;
@@ -356,7 +369,7 @@ class ResourceLoaderFileModule extends ResourceLoaderModule {
/**
* Gets the name of the group this module should be loaded in.
*
- * @return String: Group name
+ * @return string: Group name
*/
public function getGroup() {
return $this->group;
@@ -372,7 +385,7 @@ class ResourceLoaderFileModule extends ResourceLoaderModule {
/**
* Gets list of names of modules this module depends on.
*
- * @return Array: List of module names
+ * @return array: List of module names
*/
public function getDependencies() {
return $this->dependencies;
@@ -394,9 +407,9 @@ class ResourceLoaderFileModule extends ResourceLoaderModule {
* calculations on files relevant to the given language, skin and debug
* mode.
*
- * @param $context ResourceLoaderContext: Context in which to calculate
+ * @param ResourceLoaderContext $context Context in which to calculate
* the modified time
- * @return Integer: UNIX timestamp
+ * @return int: UNIX timestamp
* @see ResourceLoaderModule::getFileDependencies
*/
public function getModifiedTime( ResourceLoaderContext $context ) {
@@ -455,7 +468,7 @@ class ResourceLoaderFileModule extends ResourceLoaderModule {
/* Protected Methods */
/**
- * @param $path string
+ * @param string $path
* @return string
*/
protected function getLocalPath( $path ) {
@@ -463,7 +476,7 @@ class ResourceLoaderFileModule extends ResourceLoaderModule {
}
/**
- * @param $path string
+ * @param string $path
* @return string
*/
protected function getRemotePath( $path ) {
@@ -471,17 +484,28 @@ class ResourceLoaderFileModule extends ResourceLoaderModule {
}
/**
+ * Infer the stylesheet language from a stylesheet file path.
+ *
+ * @since 1.22
+ * @param string $path
+ * @return string: the stylesheet language name
+ */
+ public function getStyleSheetLang( $path ) {
+ return preg_match( '/\.less$/i', $path ) ? 'less' : 'css';
+ }
+
+ /**
* Collates file paths by option (where provided).
*
* @param array $list List of file paths in any combination of index/path
* or path/options pairs
* @param string $option option name
- * @param $default Mixed: default value if the option isn't set
- * @return Array: List of file paths, collated by $option
+ * @param mixed $default 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 ) {
+ foreach ( (array)$list as $key => $value ) {
if ( is_int( $key ) ) {
// File name as the value
if ( !isset( $collatedFiles[$default] ) ) {
@@ -506,7 +530,7 @@ class ResourceLoaderFileModule extends ResourceLoaderModule {
* @param array $list List of lists to select from
* @param string $key Key to look for in $map
* @param string $fallback Key to look for in $list if $key doesn't exist
- * @return Array: List of elements from $map which matched $key or $fallback,
+ * @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 ) {
@@ -524,8 +548,8 @@ class ResourceLoaderFileModule extends ResourceLoaderModule {
/**
* Gets a list of file paths for all scripts in this module, in order of propper execution.
*
- * @param $context ResourceLoaderContext: Context
- * @return Array: List of file paths
+ * @param ResourceLoaderContext $context
+ * @return array: List of file paths
*/
protected function getScriptFiles( ResourceLoaderContext $context ) {
$files = array_merge(
@@ -543,8 +567,8 @@ class ResourceLoaderFileModule extends ResourceLoaderModule {
/**
* Gets a list of file paths for all styles in this module, in order of propper inclusion.
*
- * @param $context ResourceLoaderContext: Context
- * @return Array: List of file paths
+ * @param ResourceLoaderContext $context
+ * @return array: List of file paths
*/
protected function getStyleFiles( ResourceLoaderContext $context ) {
return array_merge_recursive(
@@ -556,11 +580,28 @@ class ResourceLoaderFileModule extends ResourceLoaderModule {
}
/**
+ * Returns all style files used by this module
+ * @return array
+ */
+ public function getAllStyleFiles() {
+ $files = array();
+ foreach( (array)$this->styles as $key => $value ) {
+ if ( is_array( $value ) ) {
+ $path = $key;
+ } else {
+ $path = $value;
+ }
+ $files[] = $this->getLocalPath( $path );
+ }
+ return $files;
+ }
+
+ /**
* Gets the contents of a list of JavaScript files.
*
* @param array $scripts List of file paths to scripts to read, remap and concetenate
* @throws MWException
- * @return String: Concatenated and remapped JavaScript data from $scripts
+ * @return string: Concatenated and remapped JavaScript data from $scripts
*/
protected function readScriptFiles( array $scripts ) {
global $wgResourceLoaderValidateStaticJS;
@@ -591,9 +632,9 @@ class ResourceLoaderFileModule extends ResourceLoaderModule {
* @param array $styles List of media type/list of file paths pairs, to read, remap and
* concetenate
*
- * @param $flip bool
+ * @param bool $flip
*
- * @return Array: List of concatenated and remapped CSS data from $styles,
+ * @return array: List of concatenated and remapped CSS data from $styles,
* keyed by media type
*/
protected function readStyleFiles( array $styles, $flip ) {
@@ -620,9 +661,9 @@ class ResourceLoaderFileModule extends ResourceLoaderModule {
* This method can be used as a callback for array_map()
*
* @param string $path File path of style file to read
- * @param $flip bool
+ * @param bool $flip
*
- * @return String: CSS data in script file
+ * @return string: CSS data in script file
* @throws MWException if the file doesn't exist
*/
protected function readStyleFile( $path, $flip ) {
@@ -632,7 +673,14 @@ class ResourceLoaderFileModule extends ResourceLoaderModule {
wfDebugLog( 'resourceloader', $msg );
throw new MWException( $msg );
}
- $style = file_get_contents( $localPath );
+
+ if ( $this->getStyleSheetLang( $path ) === 'less' ) {
+ $style = $this->compileLESSFile( $localPath );
+ $this->hasGeneratedStyles = true;
+ } else {
+ $style = file_get_contents( $localPath );
+ }
+
if ( $flip ) {
$style = CSSJanus::transform( $style, true, false );
}
@@ -655,7 +703,7 @@ class ResourceLoaderFileModule extends ResourceLoaderModule {
/**
* Get whether CSS for this module should be flipped
- * @param $context ResourceLoaderContext
+ * @param ResourceLoaderContext $context
* @return bool
*/
public function getFlip( $context ) {
@@ -671,4 +719,58 @@ class ResourceLoaderFileModule extends ResourceLoaderModule {
return $this->targets;
}
+ /**
+ * Generate a cache key for a LESS file.
+ *
+ * The cache key varies on the file name and the names and values of global
+ * LESS variables.
+ *
+ * @since 1.22
+ * @param string $fileName File name of root LESS file.
+ * @return string: Cache key
+ */
+ protected static function getLESSCacheKey( $fileName ) {
+ $vars = json_encode( ResourceLoader::getLESSVars() );
+ $hash = md5( $fileName . $vars );
+ return wfMemcKey( 'resourceloader', 'less', $hash );
+ }
+
+ /**
+ * Compile a LESS file into CSS.
+ *
+ * If invalid, returns replacement CSS source consisting of the compilation
+ * error message encoded as a comment. To save work, we cache a result object
+ * which comprises the compiled CSS and the names & mtimes of the files
+ * that were processed. lessphp compares the cached & current mtimes and
+ * recompiles as necessary.
+ *
+ * @since 1.22
+ * @param string $fileName File path of LESS source
+ * @return string: CSS source
+ */
+ protected function compileLESSFile( $fileName ) {
+ $key = self::getLESSCacheKey( $fileName );
+ $cache = wfGetCache( CACHE_ANYTHING );
+
+ // The input to lessc. Either an associative array representing the
+ // cached results of a previous compilation, or the string file name if
+ // no cache result exists.
+ $source = $cache->get( $key );
+ if ( !is_array( $source ) || !isset( $source['root'] ) ) {
+ $source = $fileName;
+ }
+
+ $compiler = ResourceLoader::getLessCompiler();
+ $result = null;
+
+ $result = $compiler->cachedCompile( $source );
+
+ if ( !is_array( $result ) ) {
+ throw new MWException( 'LESS compiler result has type ' . gettype( $result ) . '; array expected.' );
+ }
+
+ $this->localFileRefs += array_keys( $result['files'] );
+ $cache->set( $key, $result );
+ return $result['compiled'];
+ }
}
diff --git a/includes/resourceloader/ResourceLoaderLESSFunctions.php b/includes/resourceloader/ResourceLoaderLESSFunctions.php
new file mode 100644
index 00000000..c7570f64
--- /dev/null
+++ b/includes/resourceloader/ResourceLoaderLESSFunctions.php
@@ -0,0 +1,67 @@
+<?php
+/**
+ * PHP-provided functions for LESS; see docs for $wgResourceLoaderLESSFunctions
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with this program; if not, write 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 ResourceLoaderLESSFunctions {
+ /**
+ * Check if an image file reference is suitable for embedding.
+ * An image is embeddable if it (a) exists, (b) has a suitable MIME-type,
+ * (c) does not exceed IE<9 size limit of 32kb. This is a LESS predicate
+ * function; it returns a LESS boolean value and can thus be used as a
+ * mixin guard.
+ *
+ * @par Example:
+ * @code
+ * .background-image(@url) when(embeddable(@url)) {
+ * background-image: url(@url) !ie;
+ * }
+ * @endcode
+ */
+ public static function embeddable( $frame, $less ) {
+ $base = pathinfo( $less->parser->sourceName, PATHINFO_DIRNAME );
+ $url = $frame[2][0];
+ $file = realpath( $base . '/' . $url );
+ return $less->toBool( $file
+ && strpos( $url, '//' ) === false
+ && filesize( $file ) < CSSMin::EMBED_SIZE_LIMIT
+ && CSSMin::getMimeType( $file ) !== false );
+ }
+
+ /**
+ * Convert an image URI to a base64-encoded data URI.
+ *
+ * @par Example:
+ * @code
+ * .fancy-button {
+ * background-image: embed('../images/button-bg.png');
+ * }
+ * @endcode
+ */
+ public static function embed( $frame, $less ) {
+ $base = pathinfo( $less->parser->sourceName, PATHINFO_DIRNAME );
+ $url = $frame[2][0];
+ $file = realpath( $base . '/' . $url );
+
+ $data = CSSMin::encodeImageAsDataURI( $file );
+ $less->addParsedFile( $file );
+ return 'url(' . $data . ')';
+ }
+}
diff --git a/includes/resourceloader/ResourceLoaderLanguageDataModule.php b/includes/resourceloader/ResourceLoaderLanguageDataModule.php
index 0f8e54ce..fa0fbf85 100644
--- a/includes/resourceloader/ResourceLoaderLanguageDataModule.php
+++ b/includes/resourceloader/ResourceLoaderLanguageDataModule.php
@@ -75,9 +75,10 @@ class ResourceLoaderLanguageDataModule extends ResourceLoaderModule {
return $this->language->separatorTransformTable();
}
-
/**
- * Get all the dynamic data for the content language to an array
+ * Get all the dynamic data for the content language to an array.
+ *
+ * NOTE: Before calling this you HAVE to make sure $this->language is set.
*
* @return array
*/
@@ -105,26 +106,20 @@ class ResourceLoaderLanguageDataModule extends ResourceLoaderModule {
/**
* @param $context ResourceLoaderContext
- * @return array|int|Mixed
+ * @return int: UNIX timestamp
*/
public function getModifiedTime( ResourceLoaderContext $context ) {
- $this->language = Language::factory( $context ->getLanguage() );
- $cache = wfGetCache( CACHE_ANYTHING );
- $key = wfMemcKey( 'resourceloader', 'langdatamodule', 'changeinfo' );
+ return max( 1, $this->getHashMtime( $context ) );
+ }
- $data = $this->getData();
- $hash = md5( serialize( $data ) );
+ /**
+ * @param $context ResourceLoaderContext
+ * @return string: Hash
+ */
+ public function getModifiedHash( ResourceLoaderContext $context ) {
+ $this->language = Language::factory( $context->getLanguage() );
- $result = $cache->get( $key );
- if ( is_array( $result ) && $result['hash'] === $hash ) {
- return $result['timestamp'];
- }
- $timestamp = wfTimestamp();
- $cache->set( $key, array(
- 'hash' => $hash,
- 'timestamp' => $timestamp,
- ) );
- return $timestamp;
+ return md5( serialize( $this->getData() ) );
}
/**
diff --git a/includes/resourceloader/ResourceLoaderModule.php b/includes/resourceloader/ResourceLoaderModule.php
index 03f3cc37..11264fc8 100644
--- a/includes/resourceloader/ResourceLoaderModule.php
+++ b/includes/resourceloader/ResourceLoaderModule.php
@@ -71,7 +71,7 @@ abstract class ResourceLoaderModule {
* 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
+ * @return mixed: Name (string) or null if no name was set
*/
public function getName() {
return $this->name;
@@ -91,7 +91,7 @@ abstract class ResourceLoaderModule {
* Get this module's origin. This is set when the module is registered
* with ResourceLoader::register()
*
- * @return Int ResourceLoaderModule class constant, the subclass default
+ * @return int: ResourceLoaderModule class constant, the subclass default
* if not set manually
*/
public function getOrigin() {
@@ -109,7 +109,7 @@ abstract class ResourceLoaderModule {
}
/**
- * @param $context ResourceLoaderContext
+ * @param ResourceLoaderContext $context
* @return bool
*/
public function getFlip( $context ) {
@@ -122,8 +122,8 @@ abstract class ResourceLoaderModule {
* 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
+ * @param ResourceLoaderContext $context
+ * @return string: JavaScript code
*/
public function getScript( ResourceLoaderContext $context ) {
// Stub, override expected
@@ -141,8 +141,8 @@ abstract class ResourceLoaderModule {
* #2 is important to prevent an infinite loop, therefore this function
* MUST return either an only= URL or a non-load.php URL.
*
- * @param $context ResourceLoaderContext: Context object
- * @return Array of URLs
+ * @param ResourceLoaderContext $context
+ * @return array: Array of URLs
*/
public function getScriptURLsForDebug( ResourceLoaderContext $context ) {
$url = ResourceLoader::makeLoaderURL(
@@ -172,8 +172,8 @@ abstract class ResourceLoaderModule {
/**
* Get all CSS for this module for a given skin.
*
- * @param $context ResourceLoaderContext: Context object
- * @return Array: List of CSS strings or array of CSS strings keyed by media type.
+ * @param ResourceLoaderContext $context
+ * @return array: List of CSS strings or array of CSS strings keyed by media type.
* like array( 'screen' => '.foo { width: 0 }' );
* or array( 'screen' => array( '.foo { width: 0 }' ) );
*/
@@ -188,8 +188,8 @@ abstract class ResourceLoaderModule {
* the module, but file-based modules will want to override this to
* load the files directly. See also getScriptURLsForDebug()
*
- * @param $context ResourceLoaderContext: Context object
- * @return Array: array( mediaType => array( URL1, URL2, ... ), ... )
+ * @param ResourceLoaderContext $context
+ * @return array: array( mediaType => array( URL1, URL2, ... ), ... )
*/
public function getStyleURLsForDebug( ResourceLoaderContext $context ) {
$url = ResourceLoader::makeLoaderURL(
@@ -211,7 +211,7 @@ abstract class ResourceLoaderModule {
*
* To get a JSON blob with messages, use MessageBlobStore::get()
*
- * @return Array: List of message keys. Keys may occur more than once
+ * @return array: List of message keys. Keys may occur more than once
*/
public function getMessages() {
// Stub, override expected
@@ -221,7 +221,7 @@ abstract class ResourceLoaderModule {
/**
* Get the group this module is in.
*
- * @return String: Group name
+ * @return string: Group name
*/
public function getGroup() {
// Stub, override expected
@@ -231,7 +231,7 @@ abstract class ResourceLoaderModule {
/**
* Get the origin of this module. Should only be overridden for foreign modules.
*
- * @return String: Origin name, 'local' for local modules
+ * @return string: Origin name, 'local' for local modules
*/
public function getSource() {
// Stub, override expected
@@ -263,7 +263,7 @@ abstract class ResourceLoaderModule {
/**
* 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
+ * @return mixed: JavaScript loader code as a string or boolean false if no custom loader set
*/
public function getLoaderScript() {
// Stub, override expected
@@ -274,16 +274,11 @@ abstract class ResourceLoaderModule {
* 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.
+ * on the client side.
*
* To add dependencies dynamically on the client side, use a custom
* loader script, see getLoaderScript()
- * @return Array: List of module names as strings
+ * @return array: List of module names as strings
*/
public function getDependencies() {
// Stub, override expected
@@ -293,7 +288,7 @@ abstract class ResourceLoaderModule {
/**
* Get target(s) for the module, eg ['desktop'] or ['desktop', 'mobile']
*
- * @return array of strings
+ * @return array: Array of strings
*/
public function getTargets() {
return $this->targets;
@@ -304,7 +299,7 @@ abstract class ResourceLoaderModule {
* Currently these are only image files referenced by the module's CSS.
*
* @param string $skin Skin name
- * @return Array: List of files
+ * @return array: List of files
*/
public function getFileDependencies( $skin ) {
// Try in-object cache first
@@ -319,7 +314,7 @@ abstract class ResourceLoaderModule {
), __METHOD__
);
if ( !is_null( $deps ) ) {
- $this->fileDeps[$skin] = (array) FormatJson::decode( $deps, true );
+ $this->fileDeps[$skin] = (array)FormatJson::decode( $deps, true );
} else {
$this->fileDeps[$skin] = array();
}
@@ -340,7 +335,7 @@ abstract class ResourceLoaderModule {
* Get the last modification timestamp of the message blob for this
* module in a given language.
* @param string $lang Language code
- * @return Integer: UNIX timestamp, or 0 if the module doesn't have messages
+ * @return int: UNIX timestamp, or 0 if the module doesn't have messages
*/
public function getMsgBlobMtime( $lang ) {
if ( !isset( $this->msgBlobMtime[$lang] ) ) {
@@ -387,8 +382,12 @@ abstract class ResourceLoaderModule {
* If you want this to happen, you'll need to call getMsgBlobMtime()
* yourself and take its result into consideration.
*
- * @param $context ResourceLoaderContext: Context object
- * @return Integer: UNIX timestamp
+ * NOTE: The mtime of the module's hash is NOT automatically included.
+ * If your module provides a getModifiedHash() method, you'll need to call getHashMtime()
+ * yourself and take its result into consideration.
+ *
+ * @param ResourceLoaderContext $context Context object
+ * @return integer UNIX timestamp
*/
public function getModifiedTime( ResourceLoaderContext $context ) {
// 0 would mean now
@@ -396,13 +395,54 @@ abstract class ResourceLoaderModule {
}
/**
+ * Helper method for calculating when the module's hash (if it has one) changed.
+ *
+ * @param ResourceLoaderContext $context
+ * @return integer: UNIX timestamp or 0 if there is no hash provided
+ */
+ public function getHashMtime( ResourceLoaderContext $context ) {
+ $hash = $this->getModifiedHash( $context );
+ if ( !is_string( $hash ) ) {
+ return 0;
+ }
+
+ $cache = wfGetCache( CACHE_ANYTHING );
+ $key = wfMemcKey( 'resourceloader', 'modulemodifiedhash', $this->getName() );
+
+ $data = $cache->get( $key );
+ if ( is_array( $data ) && $data['hash'] === $hash ) {
+ // Hash is still the same, re-use the timestamp of when we first saw this hash.
+ return $data['timestamp'];
+ }
+
+ $timestamp = wfTimestamp();
+ $cache->set( $key, array(
+ 'hash' => $hash,
+ 'timestamp' => $timestamp,
+ ) );
+
+ return $timestamp;
+ }
+
+ /**
+ * Get the last modification timestamp of the message blob for this
+ * module in a given language.
+ *
+ * @param ResourceLoaderContext $context
+ * @return string|null: Hash
+ */
+ public function getModifiedHash( ResourceLoaderContext $context ) {
+ return null;
+ }
+
+ /**
* 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
+ * @param ResourceLoaderContext $context
+ * @return bool
*/
public function isKnownEmpty( ResourceLoaderContext $context ) {
return false;
@@ -418,7 +458,7 @@ abstract class ResourceLoaderModule {
*
* @param string $fileName
* @param string $contents
- * @return string JS with the original, or a replacement error
+ * @return string: JS with the original, or a replacement error
*/
protected function validateScriptFile( $fileName, $contents ) {
global $wgResourceLoaderValidateJS;
diff --git a/includes/resourceloader/ResourceLoaderSiteModule.php b/includes/resourceloader/ResourceLoaderSiteModule.php
index 1cc5c1a9..05754d37 100644
--- a/includes/resourceloader/ResourceLoaderSiteModule.php
+++ b/includes/resourceloader/ResourceLoaderSiteModule.php
@@ -37,20 +37,19 @@ class ResourceLoaderSiteModule extends ResourceLoaderWikiModule {
* @return Array: List of pages
*/
protected function getPages( ResourceLoaderContext $context ) {
- global $wgHandheldStyle;
+ global $wgUseSiteJs, $wgUseSiteCss;
- $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' );
+ $pages = array();
+ if ( $wgUseSiteJs ) {
+ $pages['MediaWiki:Common.js'] = array( 'type' => 'script' );
+ $pages['MediaWiki:' . ucfirst( $context->getSkin() ) . '.js'] = array( 'type' => 'script' );
}
+ if ( $wgUseSiteCss ) {
+ $pages['MediaWiki:Common.css'] = array( 'type' => 'style' );
+ $pages['MediaWiki:' . ucfirst( $context->getSkin() ) . '.css'] = array( 'type' => 'style' );
+
+ }
+ $pages['MediaWiki:Print.css'] = array( 'type' => 'style', 'media' => 'print' );
return $pages;
}
diff --git a/includes/resourceloader/ResourceLoaderStartUpModule.php b/includes/resourceloader/ResourceLoaderStartUpModule.php
index 32cf6b26..20f6e0ba 100644
--- a/includes/resourceloader/ResourceLoaderStartUpModule.php
+++ b/includes/resourceloader/ResourceLoaderStartUpModule.php
@@ -27,6 +27,7 @@ class ResourceLoaderStartUpModule extends ResourceLoaderModule {
/* Protected Members */
protected $modifiedTime = array();
+ protected $targets = array( 'desktop', 'mobile' );
/* Protected Methods */
@@ -51,7 +52,7 @@ class ResourceLoaderStartUpModule extends ResourceLoaderModule {
*/
$namespaceIds = $wgContLang->getNamespaceIds();
$caseSensitiveNamespaces = array();
- foreach( MWNamespace::getCanonicalNamespaces() as $index => $name ) {
+ foreach ( MWNamespace::getCanonicalNamespaces() as $index => $name ) {
$namespaceIds[$wgContLang->lc( $name )] = $index;
if ( !MWNamespace::isCapitalized( $index ) ) {
$caseSensitiveNamespaces[] = $index;
@@ -83,7 +84,7 @@ class ResourceLoaderStartUpModule extends ResourceLoaderModule {
'wgFormattedNamespaces' => $wgContLang->getFormattedNamespaces(),
'wgNamespaceIds' => $namespaceIds,
'wgSiteName' => $wgSitename,
- 'wgFileExtensions' => array_values( $wgFileExtensions ),
+ 'wgFileExtensions' => array_values( array_unique( $wgFileExtensions ) ),
'wgDBname' => $wgDBname,
// This sucks, it is only needed on Special:Upload, but I could
// not find a way to add vars only for a certain module
@@ -94,6 +95,7 @@ class ResourceLoaderStartUpModule extends ResourceLoaderModule {
'wgCookiePrefix' => $wgCookiePrefix,
'wgResourceLoaderMaxQueryLength' => $wgResourceLoaderMaxQueryLength,
'wgCaseSensitiveNamespaces' => $caseSensitiveNamespaces,
+ 'wgLegalTitleChars' => Title::convertByteClassToUnicodeClass( Title::legalChars() ),
);
wfRunHooks( 'ResourceLoaderGetConfigVars', array( &$vars ) );
@@ -184,7 +186,7 @@ class ResourceLoaderStartUpModule extends ResourceLoaderModule {
* @return string
*/
public function getScript( ResourceLoaderContext $context ) {
- global $IP, $wgLoadScript, $wgLegacyJavaScriptGlobals;
+ global $IP, $wgLegacyJavaScriptGlobals;
$out = file_get_contents( "$IP/resources/startup.js" );
if ( $context->getOnly() === 'scripts' ) {
@@ -224,7 +226,7 @@ class ResourceLoaderStartUpModule extends ResourceLoaderModule {
"};\n";
// Conditional script injection
- $scriptTag = Html::linkedScript( $wgLoadScript . '?' . wfArrayToCgi( $query ) );
+ $scriptTag = Html::linkedScript( wfAppendQuery( wfScript( 'load' ), $query ) );
$out .= "if ( isCompatible() ) {\n" .
"\t" . Xml::encodeJsCall( 'document.write', array( $scriptTag ) ) .
"}\n" .
diff --git a/includes/resourceloader/ResourceLoaderUserCSSPrefsModule.php b/includes/resourceloader/ResourceLoaderUserCSSPrefsModule.php
index bdb240e0..bda86539 100644
--- a/includes/resourceloader/ResourceLoaderUserCSSPrefsModule.php
+++ b/includes/resourceloader/ResourceLoaderUserCSSPrefsModule.php
@@ -56,43 +56,44 @@ class ResourceLoaderUserCSSPrefsModule extends ResourceLoaderModule {
public function getStyles( ResourceLoaderContext $context ) {
global $wgAllowUserCssPrefs, $wgUser;
- if ( $wgAllowUserCssPrefs ) {
- $options = $wgUser->getOptions();
+ if ( !$wgAllowUserCssPrefs ) {
+ return array();
+ }
- // Build CSS rules
- $rules = array();
+ $options = $wgUser->getOptions();
- // Underline: 2 = browser default, 1 = always, 0 = never
- if ( $options['underline'] < 2 ) {
- $rules[] = "a { text-decoration: " .
- ( $options['underline'] ? 'underline' : 'none' ) . "; }";
- } else {
- # The scripts of these languages are very hard to read with underlines
- $rules[] = 'a:lang(ar), a:lang(ckb), a:lang(fa),a:lang(kk-arab), ' .
- 'a:lang(mzn), a:lang(ps), a:lang(ur) { text-decoration: none; }';
- }
- 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' ) {
- // Double-check that $options['editfont'] consists of safe characters only
- if ( preg_match( '/^[a-zA-Z0-9_, -]+$/', $options['editfont'] ) ) {
- $rules[] = "textarea { font-family: {$options['editfont']}; }\n";
- }
- }
- $style = implode( "\n", $rules );
- if ( $this->getFlip( $context ) ) {
- $style = CSSJanus::transform( $style, true, false );
+ // Build CSS rules
+ $rules = array();
+
+ // Underline: 2 = browser default, 1 = always, 0 = never
+ if ( $options['underline'] < 2 ) {
+ $rules[] = "a { text-decoration: " .
+ ( $options['underline'] ? 'underline' : 'none' ) . "; }";
+ } else {
+ # The scripts of these languages are very hard to read with underlines
+ $rules[] = 'a:lang(ar), a:lang(ckb), a:lang(kk-arab), ' .
+ 'a:lang(mzn), a:lang(ps), a:lang(ur) { text-decoration: none; }';
+ }
+ if ( $options['justify'] ) {
+ $rules[] = "#article, #bodyContent, #mw_content { text-align: justify; }\n";
+ }
+ if ( !$options['showtoc'] ) {
+ $rules[] = "#toc { display: none; }\n";
+ }
+ if ( !$options['editsection'] ) {
+ $rules[] = ".mw-editsection { display: none; }\n";
+ }
+ if ( $options['editfont'] !== 'default' ) {
+ // Double-check that $options['editfont'] consists of safe characters only
+ if ( preg_match( '/^[a-zA-Z0-9_, -]+$/', $options['editfont'] ) ) {
+ $rules[] = "textarea { font-family: {$options['editfont']}; }\n";
}
- return array( 'all' => $style );
}
- return array();
+ $style = implode( "\n", $rules );
+ if ( $this->getFlip( $context ) ) {
+ $style = CSSJanus::transform( $style, true, false );
+ }
+ return array( 'all' => $style );
}
/**
diff --git a/includes/resourceloader/ResourceLoaderUserGroupsModule.php b/includes/resourceloader/ResourceLoaderUserGroupsModule.php
index 1316f423..9064263f 100644
--- a/includes/resourceloader/ResourceLoaderUserGroupsModule.php
+++ b/includes/resourceloader/ResourceLoaderUserGroupsModule.php
@@ -33,12 +33,15 @@ class ResourceLoaderUserGroupsModule extends ResourceLoaderWikiModule {
* @return array
*/
protected function getPages( ResourceLoaderContext $context ) {
- global $wgUser;
+ global $wgUser, $wgUseSiteJs, $wgUseSiteCss;
$userName = $context->getUser();
if ( $userName === null ) {
return array();
}
+ if ( !$wgUseSiteJs && !$wgUseSiteCss ) {
+ return array();
+ }
// Use $wgUser is possible; allows to skip a lot of code
if ( is_object( $wgUser ) && $wgUser->getName() == $userName ) {
@@ -51,12 +54,16 @@ class ResourceLoaderUserGroupsModule extends ResourceLoaderWikiModule {
}
$pages = array();
- foreach( $user->getEffectiveGroups() as $group ) {
+ foreach ( $user->getEffectiveGroups() as $group ) {
if ( in_array( $group, array( '*', 'user' ) ) ) {
continue;
}
- $pages["MediaWiki:Group-$group.js"] = array( 'type' => 'script' );
- $pages["MediaWiki:Group-$group.css"] = array( 'type' => 'style' );
+ if ( $wgUseSiteJs ) {
+ $pages["MediaWiki:Group-$group.js"] = array( 'type' => 'script' );
+ }
+ if ( $wgUseSiteCss ) {
+ $pages["MediaWiki:Group-$group.css"] = array( 'type' => 'style' );
+ }
}
return $pages;
}
diff --git a/includes/resourceloader/ResourceLoaderUserModule.php b/includes/resourceloader/ResourceLoaderUserModule.php
index 177302c5..7a04e473 100644
--- a/includes/resourceloader/ResourceLoaderUserModule.php
+++ b/includes/resourceloader/ResourceLoaderUserModule.php
@@ -35,11 +35,15 @@ class ResourceLoaderUserModule extends ResourceLoaderWikiModule {
* @return array
*/
protected function getPages( ResourceLoaderContext $context ) {
+ global $wgAllowUserJs, $wgAllowUserCss;
$username = $context->getUser();
if ( $username === null ) {
return array();
}
+ if ( !$wgAllowUserJs && !$wgAllowUserCss ) {
+ return array();
+ }
// Get the normalized title of the user's user page
$userpageTitle = Title::makeTitleSafe( NS_USER, $username );
@@ -50,14 +54,15 @@ class ResourceLoaderUserModule extends ResourceLoaderWikiModule {
$userpage = $userpageTitle->getPrefixedDBkey(); // Needed so $excludepages works
- $pages = array(
- "$userpage/common.js" => array( 'type' => 'script' ),
- "$userpage/" . $context->getSkin() . '.js' =>
- array( 'type' => 'script' ),
- "$userpage/common.css" => array( 'type' => 'style' ),
- "$userpage/" . $context->getSkin() . '.css' =>
- array( 'type' => 'style' ),
- );
+ $pages = array();
+ if ( $wgAllowUserJs ) {
+ $pages["$userpage/common.js"] = array( 'type' => 'script' );
+ $pages["$userpage/" . $context->getSkin() . '.js'] = array( 'type' => 'script' );
+ }
+ if ( $wgAllowUserCss ) {
+ $pages["$userpage/common.css"] = array( 'type' => 'style' );
+ $pages["$userpage/" . $context->getSkin() . '.css'] = array( 'type' => 'style' );
+ }
// Hack for bug 26283: if we're on a preview page for a CSS/JS page,
// we need to exclude that page from this module. In that case, the excludepage
diff --git a/includes/resourceloader/ResourceLoaderUserOptionsModule.php b/includes/resourceloader/ResourceLoaderUserOptionsModule.php
index 4624cbce..0b7e1964 100644
--- a/includes/resourceloader/ResourceLoaderUserOptionsModule.php
+++ b/includes/resourceloader/ResourceLoaderUserOptionsModule.php
@@ -56,7 +56,9 @@ class ResourceLoaderUserOptionsModule extends ResourceLoaderModule {
public function getScript( ResourceLoaderContext $context ) {
global $wgUser;
return Xml::encodeJsCall( 'mw.user.options.set',
- array( $wgUser->getOptions() ) );
+ array( $wgUser->getOptions() ),
+ ResourceLoader::inDebugMode()
+ );
}
/**
diff --git a/includes/resourceloader/ResourceLoaderUserTokensModule.php b/includes/resourceloader/ResourceLoaderUserTokensModule.php
index 6d787c50..92ebbe93 100644
--- a/includes/resourceloader/ResourceLoaderUserTokensModule.php
+++ b/includes/resourceloader/ResourceLoaderUserTokensModule.php
@@ -35,10 +35,9 @@ class ResourceLoaderUserTokensModule extends ResourceLoaderModule {
/**
* Fetch the tokens for the current user.
*
- * @param $context ResourceLoaderContext: Context object
- * @return Array: List of tokens keyed by token type
+ * @return array: List of tokens keyed by token type
*/
- protected function contextUserTokens( ResourceLoaderContext $context ) {
+ protected function contextUserTokens() {
global $wgUser;
return array(
@@ -54,7 +53,9 @@ class ResourceLoaderUserTokensModule extends ResourceLoaderModule {
*/
public function getScript( ResourceLoaderContext $context ) {
return Xml::encodeJsCall( 'mw.user.tokens.set',
- array( $this->contextUserTokens( $context ) ) );
+ array( $this->contextUserTokens() ),
+ ResourceLoader::inDebugMode()
+ );
}
/**
diff --git a/includes/resourceloader/ResourceLoaderWikiModule.php b/includes/resourceloader/ResourceLoaderWikiModule.php
index 6c60d474..3f10ae53 100644
--- a/includes/resourceloader/ResourceLoaderWikiModule.php
+++ b/includes/resourceloader/ResourceLoaderWikiModule.php
@@ -92,14 +92,14 @@ abstract class ResourceLoaderWikiModule extends ResourceLoaderModule {
$content = $revision->getContent( Revision::RAW );
if ( !$content ) {
- wfDebug( __METHOD__ . "failed to load content of JS/CSS page!\n" );
+ wfDebugLog( 'resourceloader', __METHOD__ . ': failed to load content of JS/CSS page!' );
return null;
}
$model = $content->getModel();
if ( $model !== CONTENT_MODEL_CSS && $model !== CONTENT_MODEL_JAVASCRIPT ) {
- wfDebug( __METHOD__ . "bad content model $model for JS/CSS page!\n" );
+ wfDebugLog( 'resourceloader', __METHOD__ . ': bad content model $model for JS/CSS page!' );
return null;
}
diff --git a/includes/revisiondelete/RevisionDelete.php b/includes/revisiondelete/RevisionDelete.php
index f4c07968..71850877 100644
--- a/includes/revisiondelete/RevisionDelete.php
+++ b/includes/revisiondelete/RevisionDelete.php
@@ -41,6 +41,19 @@ class RevDel_RevisionList extends RevDel_List {
return 'rev_id';
}
+ public static function getRestriction() {
+ return 'deleterevision';
+ }
+
+ public static function getRevdelConstant() {
+ return Revision::DELETED_TEXT;
+ }
+
+ public static function suggestTarget( $target, array $ids ) {
+ $rev = Revision::newFromId( $ids[0] );
+ return $rev ? $rev->getTitle() : $target;
+ }
+
/**
* @param $db DatabaseBase
* @return mixed
@@ -52,7 +65,7 @@ class RevDel_RevisionList extends RevDel_List {
array_merge( Revision::selectFields(), Revision::selectUserFields() ),
array(
'rev_page' => $this->title->getArticleID(),
- 'rev_id' => $ids,
+ 'rev_id' => $ids,
),
__METHOD__,
array( 'ORDER BY' => 'rev_id DESC' ),
@@ -242,8 +255,7 @@ class RevDel_RevisionItem extends RevDel_Item {
if ( $this->isDeleted() && !$this->canViewContent() ) {
return $this->list->msg( 'diff' )->escaped();
} else {
- return
- Linker::linkKnown(
+ return Linker::linkKnown(
$this->list->title,
$this->list->msg( 'diff' )->escaped(),
array(),
@@ -293,7 +305,7 @@ class RevDel_ArchiveList extends RevDel_RevisionList {
return $db->select( 'archive', '*',
array(
'ar_namespace' => $this->title->getNamespace(),
- 'ar_title' => $this->title->getDBkey(),
+ 'ar_title' => $this->title->getDBkey(),
'ar_timestamp' => $timestamps
),
__METHOD__,
@@ -350,12 +362,12 @@ class RevDel_ArchiveItem extends RevDel_RevisionItem {
$dbw->update( 'archive',
array( 'ar_deleted' => $bits ),
array(
- 'ar_namespace' => $this->list->title->getNamespace(),
- 'ar_title' => $this->list->title->getDBkey(),
+ '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()
+ 'ar_timestamp' => $this->row->ar_timestamp,
+ 'ar_rev_id' => $this->row->ar_rev_id,
+ 'ar_deleted' => $this->getBits()
),
__METHOD__ );
return (bool)$dbw->affectedRows();
@@ -442,6 +454,14 @@ class RevDel_FileList extends RevDel_List {
return 'oi_archive_name';
}
+ public static function getRestriction() {
+ return 'deleterevision';
+ }
+
+ public static function getRevdelConstant() {
+ return File::DELETED_FILE;
+ }
+
var $storeBatch, $deleteBatch, $cleanupBatch;
/**
@@ -450,14 +470,14 @@ class RevDel_FileList extends RevDel_List {
*/
public function doQuery( $db ) {
$archiveNames = array();
- foreach( $this->ids as $timestamp ) {
+ foreach ( $this->ids as $timestamp ) {
$archiveNames[] = $timestamp . '!' . $this->title->getDBkey();
}
return $db->select(
'oldimage',
OldLocalFile::selectFields(),
array(
- 'oi_name' => $this->title->getDBkey(),
+ 'oi_name' => $this->title->getDBkey(),
'oi_archive_name' => $archiveNames
),
__METHOD__,
@@ -635,8 +655,8 @@ class RevDel_FileItem extends RevDel_Item {
array(),
array(
'target' => $this->list->title->getPrefixedText(),
- 'file' => $this->file->getArchiveName(),
- 'token' => $this->list->getUser()->getEditToken(
+ 'file' => $this->file->getArchiveName(),
+ 'token' => $this->list->getUser()->getEditToken(
$this->file->getArchiveName() )
)
);
@@ -648,13 +668,13 @@ class RevDel_FileItem extends RevDel_Item {
* @return string HTML
*/
protected function getUserTools() {
- if( $this->file->userCan( Revision::DELETED_USER, $this->list->getUser() ) ) {
+ if ( $this->file->userCan( Revision::DELETED_USER, $this->list->getUser() ) ) {
$link = Linker::userLink( $this->file->user, $this->file->user_text ) .
Linker::userToolLinks( $this->file->user, $this->file->user_text );
} else {
$link = $this->list->msg( 'rev-deleted-user' )->escaped();
}
- if( $this->file->isDeleted( Revision::DELETED_USER ) ) {
+ if ( $this->file->isDeleted( Revision::DELETED_USER ) ) {
return '<span class="history-deleted">' . $link . '</span>';
}
return $link;
@@ -667,12 +687,12 @@ class RevDel_FileItem extends RevDel_Item {
* @return string HTML
*/
protected function getComment() {
- if( $this->file->userCan( File::DELETED_COMMENT, $this->list->getUser() ) ) {
+ if ( $this->file->userCan( File::DELETED_COMMENT, $this->list->getUser() ) ) {
$block = Linker::commentBlock( $this->file->description );
} else {
$block = ' ' . $this->list->msg( 'rev-deleted-comment' )->escaped();
}
- if( $this->file->isDeleted( File::DELETED_COMMENT ) ) {
+ if ( $this->file->isDeleted( File::DELETED_COMMENT ) ) {
return "<span class=\"history-deleted\">$block</span>";
}
return $block;
@@ -685,7 +705,7 @@ class RevDel_FileItem extends RevDel_Item {
' (' . $this->list->msg( 'nbytes' )->numParams( $this->file->getSize() )->text() . ')';
return '<li>' . $this->getLink() . ' ' . $this->getUserTools() . ' ' .
- $data . ' ' . $this->getComment(). '</li>';
+ $data . ' ' . $this->getComment() . '</li>';
}
}
@@ -712,7 +732,7 @@ class RevDel_ArchivedFileList extends RevDel_FileList {
ArchivedFile::selectFields(),
array(
'fa_name' => $this->title->getDBkey(),
- 'fa_id' => $ids
+ 'fa_id' => $ids
),
__METHOD__,
array( 'ORDER BY' => 'fa_id DESC' )
@@ -771,7 +791,7 @@ class RevDel_ArchivedFileItem extends RevDel_FileItem {
$this->file->getTimestamp(), $this->list->getUser() ) );
# Hidden files...
- if( !$this->canViewContent() ) {
+ if ( !$this->canViewContent() ) {
$link = $date;
} else {
$undelete = SpecialPage::getTitleFor( 'Undelete' );
@@ -784,7 +804,7 @@ class RevDel_ArchivedFileItem extends RevDel_FileItem {
)
);
}
- if( $this->isDeleted() ) {
+ if ( $this->isDeleted() ) {
$link = '<span class="history-deleted">' . $link . '</span>';
}
return $link;
@@ -803,6 +823,28 @@ class RevDel_LogList extends RevDel_List {
return 'log_id';
}
+ public static function getRestriction() {
+ return 'deletelogentry';
+ }
+
+ public static function getRevdelConstant() {
+ return LogPage::DELETED_ACTION;
+ }
+
+ public static function suggestTarget( $target, array $ids ) {
+ $result = wfGetDB( DB_SLAVE )->select( 'logging',
+ 'log_type',
+ array( 'log_id' => $ids ),
+ __METHOD__,
+ array( 'DISTINCT' )
+ );
+ if ( $result->numRows() == 1 ) {
+ // If there's only one type, the target can be set to include it.
+ return SpecialPage::getTitleFor( 'Log', $result->current()->log_type );
+ }
+ return SpecialPage::getTitleFor( 'Log' );
+ }
+
/**
* @param $db DatabaseBase
* @return mixed
@@ -913,7 +955,7 @@ class RevDel_LogItem extends RevDel_Item {
$action = $formatter->getActionText();
// Comment
$comment = $this->list->getLanguage()->getDirMark() . Linker::commentBlock( $this->row->log_comment );
- if( LogEventsList::isDeleted( $this->row, LogPage::DELETED_COMMENT ) ) {
+ if ( LogEventsList::isDeleted( $this->row, LogPage::DELETED_COMMENT ) ) {
$comment = '<span class="history-deleted">' . $comment . '</span>';
}
diff --git a/includes/revisiondelete/RevisionDeleteAbstracts.php b/includes/revisiondelete/RevisionDeleteAbstracts.php
index b2108de6..803467e6 100644
--- a/includes/revisiondelete/RevisionDeleteAbstracts.php
+++ b/includes/revisiondelete/RevisionDeleteAbstracts.php
@@ -37,13 +37,45 @@ abstract class RevDel_List extends RevisionListBase {
* Get the DB field name associated with the ID list.
* This used to populate the log_search table for finding log entries.
* Override this function.
- * @return null
+ * @return string|null
*/
public static function getRelationType() {
return null;
}
/**
+ * Get the user right required for this list type
+ * Override this function.
+ * @since 1.22
+ * @return string|null
+ */
+ public static function getRestriction() {
+ return null;
+ }
+
+ /**
+ * Get the revision deletion constant for this list type
+ * Override this function.
+ * @since 1.22
+ * @return int|null
+ */
+ public static function getRevdelConstant() {
+ return null;
+ }
+
+ /**
+ * Suggest a target for the revision deletion
+ * Optionally override this function.
+ * @since 1.22
+ * @param Title|null $target User-supplied target
+ * @param array $ids
+ * @return Title|null
+ */
+ public static function suggestTarget( $target, array $ids ) {
+ return $target;
+ }
+
+ /**
* Set the visibility for the revisions in this list. Logging and
* transactions are done here.
*
@@ -68,11 +100,11 @@ abstract class RevDel_List extends RevisionListBase {
for ( $this->reset(); $this->current(); $this->next() ) {
$item = $this->current();
- unset( $missing[ $item->getId() ] );
+ unset( $missing[$item->getId()] );
$oldBits = $item->getBits();
// Build the actual new rev_deleted bitfield
- $newBits = SpecialRevisionDelete::extractBitfield( $bitPars, $oldBits );
+ $newBits = RevisionDeleter::extractBitfield( $bitPars, $oldBits );
if ( $oldBits == $newBits ) {
$status->warning( 'revdelete-no-change', $item->formatDate(), $item->formatTime() );
@@ -94,14 +126,14 @@ abstract class RevDel_List extends RevisionListBase {
}
if ( !$item->canView() ) {
// Cannot access this revision
- $msg = ($opType == 'show') ?
+ $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 ) {
+ if ( $newBits == Revision::DELETED_RESTRICTED ) {
$status->warning( 'revdelete-only-restricted', $item->formatDate(), $item->formatTime() );
$status->failCount++;
continue;
@@ -113,9 +145,9 @@ abstract class RevDel_List extends RevisionListBase {
if ( $ok ) {
$idsForLog[] = $item->getId();
$status->successCount++;
- if( $item->getAuthorId() > 0 ) {
+ if ( $item->getAuthorId() > 0 ) {
$authorIds[] = $item->getAuthorId();
- } elseif( IP::isIPAddress( $item->getAuthorName() ) ) {
+ } elseif ( IP::isIPAddress( $item->getAuthorName() ) ) {
$authorIPs[] = $item->getAuthorName();
}
} else {
@@ -189,7 +221,7 @@ abstract class RevDel_List extends RevisionListBase {
protected function updateLog( $params ) {
// Get the URL param's corresponding DB field
$field = RevisionDeleter::getRelationType( $this->getType() );
- if( !$field ) {
+ if ( !$field ) {
throw new MWException( "Bad log URL param type!" );
}
// Put things hidden from sysops in the oversight log
@@ -203,7 +235,7 @@ abstract class RevDel_List extends RevisionListBase {
// Actually add the deletion log entry
$log = new LogPage( $logType );
$logid = $log->addEntry( $this->getLogAction(), $params['title'],
- $params['comment'], $logParams );
+ $params['comment'], $logParams, $this->getUser() );
// 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 );
diff --git a/includes/revisiondelete/RevisionDeleteUser.php b/includes/revisiondelete/RevisionDeleteUser.php
index c02e9c76..4505ee10 100644
--- a/includes/revisiondelete/RevisionDeleteUser.php
+++ b/includes/revisiondelete/RevisionDeleteUser.php
@@ -54,7 +54,7 @@ class RevisionDeleteUser {
# The same goes for the sysop-restricted *_deleted bit.
$delUser = Revision::DELETED_USER | Revision::DELETED_RESTRICTED;
$delAction = LogPage::DELETED_ACTION | Revision::DELETED_RESTRICTED;
- if( $op == '&' ) {
+ if ( $op == '&' ) {
$delUser = "~{$delUser}";
$delAction = "~{$delAction}";
}
diff --git a/includes/revisiondelete/RevisionDeleter.php b/includes/revisiondelete/RevisionDeleter.php
index fe351c51..dbcb3d7d 100644
--- a/includes/revisiondelete/RevisionDeleter.php
+++ b/includes/revisiondelete/RevisionDeleter.php
@@ -22,11 +22,71 @@
*/
/**
- * Temporary b/c interface, collection of static functions.
- * @ingroup SpecialPage
+ * General controller for RevDel, used by both SpecialRevisiondelete and
+ * ApiRevisionDelete.
* @ingroup RevisionDelete
*/
class RevisionDeleter {
+ /** List of known revdel types, with their corresponding list classes */
+ private static $allowedTypes = array(
+ 'revision' => 'RevDel_RevisionList',
+ 'archive' => 'RevDel_ArchiveList',
+ 'oldimage' => 'RevDel_FileList',
+ 'filearchive' => 'RevDel_ArchivedFileList',
+ 'logging' => 'RevDel_LogList',
+ );
+
+ /** Type map to support old log entries */
+ private static $deprecatedTypeMap = array(
+ 'oldid' => 'revision',
+ 'artimestamp' => 'archive',
+ 'oldimage' => 'oldimage',
+ 'fileid' => 'filearchive',
+ 'logid' => 'logging',
+ );
+
+ /**
+ * Lists the valid possible types for revision deletion.
+ *
+ * @since 1.22
+ * @return array
+ */
+ public static function getTypes() {
+ return array_keys( self::$allowedTypes );
+ }
+
+ /**
+ * Gets the canonical type name, if any.
+ *
+ * @since 1.22
+ * @param string $typeName
+ * @return string|null
+ */
+ public static function getCanonicalTypeName( $typeName ) {
+ if ( isset( self::$deprecatedTypeMap[$typeName] ) ) {
+ $typeName = self::$deprecatedTypeMap[$typeName];
+ }
+ return isset( self::$allowedTypes[$typeName] ) ? $typeName : null;
+ }
+
+ /**
+ * Instantiate the appropriate list class for a given list of IDs.
+ *
+ * @since 1.22
+ * @param string $typeName RevDel type, see RevisionDeleter::getTypes()
+ * @param IContextSource $context
+ * @param Title $title
+ * @param array $ids
+ * @return RevDel_List
+ */
+ public static function createList( $typeName, IContextSource $context, Title $title, array $ids ) {
+ $typeName = self::getCanonicalTypeName( $typeName );
+ if ( !$typeName ) {
+ throw new MWException( __METHOD__ . ": Unknown RevDel type '$typeName'" );
+ }
+ return new self::$allowedTypes[$typeName]( $context, $title, $ids );
+ }
+
/**
* Checks for a change in the bitfield for a certain option and updates the
* provided array accordingly.
@@ -39,8 +99,8 @@ class RevisionDeleter {
* @param array $arr the array to update.
*/
protected static function checkItem( $desc, $field, $diff, $new, &$arr ) {
- if( $diff & $field ) {
- $arr[ ( $new & $field ) ? 0 : 1 ][] = $desc;
+ if ( $diff & $field ) {
+ $arr[( $new & $field ) ? 0 : 1][] = $desc;
}
}
@@ -73,11 +133,12 @@ class RevisionDeleter {
self::checkItem( 'revdelete-uname',
Revision::DELETED_USER, $diff, $n, $ret );
// Restriction application to sysops
- if( $diff & Revision::DELETED_RESTRICTED ) {
- if( $n & Revision::DELETED_RESTRICTED )
+ if ( $diff & Revision::DELETED_RESTRICTED ) {
+ if ( $n & Revision::DELETED_RESTRICTED ) {
$ret[2][] = 'revdelete-restricted';
- else
+ } else {
$ret[2][] = 'revdelete-unrestricted';
+ }
}
return $ret;
}
@@ -85,20 +146,62 @@ class RevisionDeleter {
/** Get DB field name for URL param...
* Future code for other things may also track
* other types of revision-specific changes.
+ * @param string $typeName
* @return 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];
+ $typeName = self::getCanonicalTypeName( $typeName );
+ if ( !$typeName ) {
+ return null;
}
- if ( isset( SpecialRevisionDelete::$allowedTypes[$typeName] ) ) {
- $class = SpecialRevisionDelete::$allowedTypes[$typeName]['list-class'];
- return call_user_func( array( $class, 'getRelationType' ) );
- } else {
+ return call_user_func( array( self::$allowedTypes[$typeName], 'getRelationType' ) );
+ }
+
+ /**
+ * Get the user right required for the RevDel type
+ * @since 1.22
+ * @param string $typeName
+ * @return string User right
+ */
+ public static function getRestriction( $typeName ) {
+ $typeName = self::getCanonicalTypeName( $typeName );
+ if ( !$typeName ) {
+ return null;
+ }
+ return call_user_func( array( self::$allowedTypes[$typeName], 'getRestriction' ) );
+ }
+
+ /**
+ * Get the revision deletion constant for the RevDel type
+ * @since 1.22
+ * @param string $typeName
+ * @return int RevDel constant
+ */
+ public static function getRevdelConstant( $typeName ) {
+ $typeName = self::getCanonicalTypeName( $typeName );
+ if ( !$typeName ) {
return null;
}
+ return call_user_func( array( self::$allowedTypes[$typeName], 'getRevdelConstant' ) );
+ }
+
+ /**
+ * Suggest a target for the revision deletion
+ * @since 1.22
+ * @param string $typeName
+ * @param Title|null $title User-supplied target
+ * @param array $ids
+ * @return Title|null
+ */
+ public static function suggestTarget( $typeName, $target, array $ids ) {
+ $typeName = self::getCanonicalTypeName( $typeName );
+ if ( !$typeName ) {
+ return $target;
+ }
+ return call_user_func( array( self::$allowedTypes[$typeName], 'suggestTarget' ), $target, $ids );
}
+
/**
* Checks if a revision still exists in the revision table.
* If it doesn't, returns the corresponding ar_timestamp field
@@ -124,4 +227,24 @@ class RevisionDeleter {
return $timestamp;
}
+
+ /**
+ * Put together a rev_deleted bitfield
+ * @since 1.22
+ * @param array $bitPars extractBitParams() params
+ * @param int $oldfield current bitfield
+ * @return array
+ */
+ public static function extractBitfield( $bitPars, $oldfield ) {
+ // Build the actual new rev_deleted bitfield
+ $newBits = 0;
+ foreach ( $bitPars as $const => $val ) {
+ if ( $val == 1 ) {
+ $newBits |= $const; // $const is the *_deleted const
+ } elseif ( $val == -1 ) {
+ $newBits |= ( $oldfield & $const ); // use existing
+ }
+ }
+ return $newBits;
+ }
}
diff --git a/includes/search/SearchEngine.php b/includes/search/SearchEngine.php
index 6b3e62b1..71c05d8b 100644
--- a/includes/search/SearchEngine.php
+++ b/includes/search/SearchEngine.php
@@ -59,7 +59,7 @@ class SearchEngine {
* STUB
*
* @param string $term raw search term
- * @return SearchResultSet
+ * @return SearchResultSet|Status|null
*/
function searchText( $term ) {
return null;
@@ -71,7 +71,7 @@ class SearchEngine {
* STUB
*
* @param string $term raw search term
- * @return SearchResultSet
+ * @return SearchResultSet|null
*/
function searchTitle( $term ) {
return null;
@@ -93,8 +93,9 @@ class SearchEngine {
* @return Boolean
*/
public function supports( $feature ) {
- switch( $feature ) {
+ switch ( $feature ) {
case 'list-redirects':
+ case 'search-update':
return true;
case 'title-suffix-filter':
default:
@@ -331,8 +332,9 @@ class SearchEngine {
$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 ) );
@@ -420,8 +422,9 @@ class SearchEngine {
$formatted = array_map( array( $wgContLang, 'getFormattedNsText' ), $namespaces );
foreach ( $formatted as $key => $ns ) {
- if ( empty( $ns ) )
+ if ( empty( $ns ) ) {
$formatted[$key] = wfMessage( 'blanknamespace' )->text();
+ }
}
return $formatted;
}
@@ -451,23 +454,46 @@ class SearchEngine {
* Load up the appropriate search engine class for the currently
* active database backend, and return a configured instance.
*
+ * @param String $type Type of search backend, if not the default
* @return SearchEngine
*/
- public static function create() {
+ public static function create( $type = null ) {
global $wgSearchType;
$dbr = null;
- if ( $wgSearchType ) {
+
+ $alternatives = self::getSearchTypes();
+
+ if ( $type && in_array( $type, $alternatives ) ) {
+ $class = $type;
+ } elseif ( $wgSearchType !== null ) {
$class = $wgSearchType;
} else {
$dbr = wfGetDB( DB_SLAVE );
$class = $dbr->getSearchEngine();
}
+
$search = new $class( $dbr );
$search->setLimitOffset( 0, 0 );
return $search;
}
/**
+ * Return the search engines we support. If only $wgSearchType
+ * is set, it'll be an array of just that one item.
+ *
+ * @return array
+ */
+ public static function getSearchTypes() {
+ global $wgSearchType, $wgSearchTypeAlternatives;
+ static $alternatives = null;
+ if ( $alternatives === null ) {
+ $alternatives = $wgSearchTypeAlternatives ?: array();
+ array_unshift( $alternatives, $wgSearchType );
+ }
+ return $alternatives;
+ }
+
+ /**
* Create or update the search index record for the given page.
* Title and text should be pre-processed.
* STUB
@@ -493,6 +519,18 @@ class SearchEngine {
}
/**
+ * Delete an indexed page
+ * Title should be pre-processed.
+ * STUB
+ *
+ * @param Integer $id Page id that was deleted
+ * @param String $title Title of page that was deleted
+ */
+ function delete( $id, $title ) {
+ // no-op
+ }
+
+ /**
* Get OpenSearch suggestion template
*
* @return String
@@ -509,6 +547,31 @@ class SearchEngine {
return $wgCanonicalServer . wfScript( 'api' ) . '?action=opensearch&search={searchTerms}&namespace=' . $ns;
}
}
+
+ /**
+ * Get the raw text for updating the index from a content object
+ * Nicer search backends could possibly do something cooler than
+ * just returning raw text
+ *
+ * @todo This isn't ideal, we'd really like to have content-specific handling here
+ * @param Title $t Title we're indexing
+ * @param Content $c Content of the page to index
+ * @return string
+ */
+ public function getTextFromContent( Title $t, Content $c = null ) {
+ return $c ? $c->getTextForSearchIndex() : '';
+ }
+
+ /**
+ * If an implementation of SearchEngine handles all of its own text processing
+ * in getTextFromContent() and doesn't require SearchUpdate::updateText()'s
+ * rather silly handling, it should return true here instead.
+ *
+ * @return bool
+ */
+ public function textAlreadyUpdatedForIndex() {
+ return false;
+ }
}
/**
@@ -641,26 +704,30 @@ class SqlSearchResultSet extends SearchResultSet {
}
function numRows() {
- if ( $this->mResultSet === false )
+ 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 SearchResult::newFromRow( $row );
}
function free() {
- if ( $this->mResultSet === false )
+ if ( $this->mResultSet === false ) {
return false;
+ }
$this->mResultSet->free();
}
@@ -750,8 +817,9 @@ class SearchResult {
wfRunHooks( 'SearchResultInitFromTitle', array( $title, &$id ) );
$this->mRevision = Revision::newFromTitle(
$this->mTitle, $id, Revision::READ_NORMAL );
- if ( $this->mTitle->getNamespace() === NS_FILE )
+ if ( $this->mTitle->getNamespace() === NS_FILE ) {
$this->mImage = wfFindFile( $this->mTitle );
+ }
}
}
@@ -761,8 +829,9 @@ class SearchResult {
* @return Boolean
*/
function isBrokenTitle() {
- if ( is_null( $this->mTitle ) )
+ if ( is_null( $this->mTitle ) ) {
return true;
+ }
return false;
}
@@ -795,10 +864,8 @@ class SearchResult {
protected function initText() {
if ( !isset( $this->mText ) ) {
if ( $this->mRevision != null ) {
- //TODO: if we could plug in some code that knows about special content models *and* about
- // special features of the search engine, the search could benefit.
- $content = $this->mRevision->getContent();
- $this->mText = $content ? $content->getTextForSearchIndex() : '';
+ $this->mText = SearchEngine::create()
+ ->getTextFromContent( $this->mTitle, $this->mRevision->getContent() );
} else { // TODO: can we fetch raw wikitext for commons images?
$this->mText = '';
}
@@ -810,16 +877,17 @@ class SearchResult {
* @return String: highlighted text snippet, null (and not '') if not supported
*/
function getTextSnippet( $terms ) {
- global $wgUser, $wgAdvancedSearchHighlighting;
+ global $wgAdvancedSearchHighlighting;
$this->initText();
// TODO: make highliter take a content object. Make ContentHandler a factory for SearchHighliter.
- list( $contextlines, $contextchars ) = SearchEngine::userHighlightPrefs( $wgUser );
+ list( $contextlines, $contextchars ) = SearchEngine::userHighlightPrefs();
$h = new SearchHighlighter();
- if ( $wgAdvancedSearchHighlighting )
+ if ( $wgAdvancedSearchHighlighting ) {
return $h->highlightText( $this->mText, $terms, $contextlines, $contextchars );
- else
+ } else {
return $h->highlightSimple( $this->mText, $terms, $contextlines, $contextchars );
+ }
}
/**
@@ -863,10 +931,11 @@ class SearchResult {
* @return String: timestamp
*/
function getTimestamp() {
- if ( $this->mRevision )
+ if ( $this->mRevision ) {
return $this->mRevision->getTimestamp();
- elseif ( $this->mImage )
+ } elseif ( $this->mImage ) {
return $this->mImage->getTimestamp();
+ }
return '';
}
@@ -952,8 +1021,9 @@ class SearchHighlighter {
global $wgSearchHighlightBoundaries;
$fname = __METHOD__;
- if ( $text == '' )
+ if ( $text == '' ) {
return '';
+ }
// spli text into text + templates/links/tables
$spat = "/(\\{\\{)|(\\[\\[[^\\]:]+:)|(\n\\{\\|)";
@@ -984,8 +1054,9 @@ class SearchHighlighter {
if ( $key == 2 ) {
// see if this is an image link
$ns = substr( $val[0], 2, - 1 );
- if ( $wgContLang->getNsIndex( $ns ) != NS_FILE )
+ if ( $wgContLang->getNsIndex( $ns ) != NS_FILE ) {
break;
+ }
}
$epat = $endPatterns[$key];
@@ -1006,7 +1077,7 @@ class SearchHighlighter {
$len = strlen( $endMatches[2][0] );
$off = $endMatches[2][1];
$this->splitAndAdd( $otherExt, $count,
- substr( $text, $start, $off + $len - $start ) );
+ substr( $text, $start, $off + $len - $start ) );
$start = $off + $len;
$found = true;
break;
@@ -1119,7 +1190,7 @@ class SearchHighlighter {
// 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] );
+ $snippets = array( $first => $snippets[$first] );
}
// calc by how much to extend existing snippets
@@ -1155,17 +1226,19 @@ class SearchHighlighter {
$last = - 1;
$extract = '';
foreach ( $snippets as $index => $line ) {
- if ( $last == - 1 )
+ if ( $last == - 1 ) {
$extract .= $line; // first line
- elseif ( $last + 1 == $index && $offsets[$last] + strlen( $snippets[$last] ) >= strlen( $all[$last] ) )
+ } elseif ( $last + 1 == $index && $offsets[$last] + strlen( $snippets[$last] ) >= strlen( $all[$last] ) ) {
$extract .= " " . $line; // continous lines
- else
+ } else {
$extract .= '<b> ... </b>' . $line;
+ }
$last = $index;
}
- if ( $extract )
+ if ( $extract ) {
$extract .= '<b> ... </b>';
+ }
$processed = array();
foreach ( $terms as $term ) {
@@ -1193,8 +1266,9 @@ class SearchHighlighter {
$split = explode( "\n", $this->mCleanWikitext ? $this->removeWiki( $text ) : $text );
foreach ( $split as $line ) {
$tt = trim( $line );
- if ( $tt )
+ if ( $tt ) {
$extracts[$count++] = $tt;
+ }
}
}
@@ -1268,8 +1342,9 @@ class SearchHighlighter {
while ( $char >= 0x80 && $char < 0xc0 ) {
// skip trailing bytes
$point++;
- if ( $point >= strlen( $text ) )
+ if ( $point >= strlen( $text ) ) {
return strlen( $text );
+ }
$char = ord( $text[$point] );
}
return $point;
@@ -1289,24 +1364,28 @@ class SearchHighlighter {
* @protected
*/
function process( $pattern, $extracts, &$linesleft, &$contextchars, &$out, &$offsets ) {
- if ( $linesleft == 0 )
+ if ( $linesleft == 0 ) {
return; // nothing to do
+ }
foreach ( $extracts as $index => $line ) {
- if ( array_key_exists( $index, $out ) )
+ if ( array_key_exists( $index, $out ) ) {
continue; // this line already highlighted
+ }
$m = array();
- if ( !preg_match( $pattern, $line, $m, PREG_OFFSET_CAPTURE ) )
+ if ( !preg_match( $pattern, $line, $m, PREG_OFFSET_CAPTURE ) ) {
continue;
+ }
$offset = $m[0][1];
$len = strlen( $m[0][0] );
- if ( $offset + $len < $contextchars )
+ if ( $offset + $len < $contextchars ) {
$begin = 0;
- elseif ( $len > $contextchars )
+ } elseif ( $len > $contextchars ) {
$begin = $offset;
- else
+ } else {
$begin = $offset + intval( ( $len - $contextchars ) / 2 );
+ }
$end = $begin + $contextchars;
@@ -1315,8 +1394,9 @@ class SearchHighlighter {
$out[$index] = $this->extract( $line, $begin, $end, $posBegin );
$offsets[$index] = $posBegin;
$linesleft--;
- if ( $linesleft == 0 )
+ if ( $linesleft == 0 ) {
return;
+ }
}
}
@@ -1357,16 +1437,17 @@ class SearchHighlighter {
*/
function linkReplace( $matches ) {
$colon = strpos( $matches[1], ':' );
- if ( $colon === false )
+ 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 ) )
+ if ( $index !== false && ( $index == NS_FILE || $index == NS_CATEGORY ) ) {
return $matches[0]; // return the whole thing
- else
+ } else {
return $matches[2];
-
+ }
}
/**
diff --git a/includes/search/SearchMssql.php b/includes/search/SearchMssql.php
index 163d9dc3..cbc1a7a7 100644
--- a/includes/search/SearchMssql.php
+++ b/includes/search/SearchMssql.php
@@ -170,8 +170,9 @@ class SearchMssql extends SearchEngine {
if ( !empty( $terms[3] ) ) {
$regexp = preg_quote( $terms[3], '/' );
- if ( $terms[4] )
+ if ( $terms[4] ) {
$regexp .= "[0-9A-Za-z_]+";
+ }
} else {
$regexp = preg_quote( str_replace( '"', '', $terms[2] ), '/' );
}
@@ -247,8 +248,9 @@ class MssqlSearchResultSet extends SearchResultSet {
function next() {
$row = $this->mResultSet->fetchObject();
- if ( $row === false )
+ if ( $row === false ) {
return false;
+ }
return new SearchResult( $row );
}
}
diff --git a/includes/search/SearchMySQL.php b/includes/search/SearchMySQL.php
index 4a501fd0..b2bc1c26 100644
--- a/includes/search/SearchMySQL.php
+++ b/includes/search/SearchMySQL.php
@@ -57,12 +57,12 @@ class SearchMySQL extends SearchEngine {
# @todo FIXME: This doesn't handle parenthetical expressions.
$m = array();
- if( preg_match_all( '/([-+<>~]?)(([' . $lc . ']+)(\*?)|"[^"]*")/',
+ if ( preg_match_all( '/([-+<>~]?)(([' . $lc . ']+)(\*?)|"[^"]*")/',
$filteredText, $m, PREG_SET_ORDER ) ) {
- foreach( $m as $bits ) {
+ foreach ( $m as $bits ) {
@list( /* all */, $modifier, $term, $nonQuoted, $wildcard ) = $bits;
- if( $nonQuoted != '' ) {
+ if ( $nonQuoted != '' ) {
$term = $nonQuoted;
$quote = '';
} else {
@@ -70,8 +70,10 @@ class SearchMySQL extends SearchEngine {
$quote = '"';
}
- if( $searchon !== '' ) $searchon .= ' ';
- if( $this->strictMatching && ($modifier == '') ) {
+ if ( $searchon !== '' ) {
+ $searchon .= ' ';
+ }
+ if ( $this->strictMatching && ( $modifier == '' ) ) {
// If we leave this out, boolean op defaults to OR which is rarely helpful.
$modifier = '+';
}
@@ -79,7 +81,7 @@ class SearchMySQL extends SearchEngine {
// Some languages such as Serbian store the input form in the search index,
// so we may need to search for matches in multiple writing system variants.
$convertedVariants = $wgContLang->autoConvertToAllVariants( $term );
- if( is_array( $convertedVariants ) ) {
+ if ( is_array( $convertedVariants ) ) {
$variants = array_unique( array_values( $convertedVariants ) );
} else {
$variants = array( $term );
@@ -99,11 +101,12 @@ class SearchMySQL extends SearchEngine {
$strippedVariants = array_unique( $strippedVariants );
$searchon .= $modifier;
- if( count( $strippedVariants) > 1 )
+ if ( count( $strippedVariants ) > 1 ) {
$searchon .= '(';
- foreach( $strippedVariants as $stripped ) {
+ }
+ foreach ( $strippedVariants as $stripped ) {
$stripped = $this->normalizeText( $stripped );
- if( $nonQuoted && strpos( $stripped, ' ' ) !== false ) {
+ if ( $nonQuoted && strpos( $stripped, ' ' ) !== false ) {
// Hack for Chinese: we need to toss in quotes for
// multiple-character phrases since normalizeForSearch()
// added spaces between them to make word breaks.
@@ -111,8 +114,9 @@ class SearchMySQL extends SearchEngine {
}
$searchon .= "$quote$stripped$quote$wildcard ";
}
- if( count( $strippedVariants) > 1 )
+ 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!
@@ -134,8 +138,8 @@ class SearchMySQL extends SearchEngine {
global $wgContLang;
$regex = preg_quote( $string, '/' );
- if( $wgContLang->hasWordBreaks() ) {
- if( $wildcard ) {
+ if ( $wgContLang->hasWordBreaks() ) {
+ if ( $wildcard ) {
// Don't cut off the final bit!
$regex = "\b$regex";
} else {
@@ -177,7 +181,9 @@ class SearchMySQL extends SearchEngine {
global $wgCountTotalSearchHits;
// This seems out of place, why is this called with empty term?
- if ( trim( $term ) === '' ) return null;
+ if ( trim( $term ) === '' ) {
+ return null;
+ }
$filteredTerm = $this->filter( $term );
$query = $this->getQuery( $filteredTerm, $fulltext );
@@ -187,7 +193,7 @@ class SearchMySQL extends SearchEngine {
);
$total = null;
- if( $wgCountTotalSearchHits ) {
+ if ( $wgCountTotalSearchHits ) {
$query = $this->getCountQuery( $filteredTerm, $fulltext );
$totalResult = $this->db->select(
$query['tables'], $query['fields'], $query['conds'],
@@ -195,7 +201,7 @@ class SearchMySQL extends SearchEngine {
);
$row = $totalResult->fetchObject();
- if( $row ) {
+ if ( $row ) {
$total = intval( $row->c );
}
$totalResult->free();
@@ -205,12 +211,11 @@ class SearchMySQL extends SearchEngine {
}
public function supports( $feature ) {
- switch( $feature ) {
- case 'list-redirects':
+ switch ( $feature ) {
case 'title-suffix-filter':
return true;
default:
- return false;
+ return parent::supports( $feature );
}
}
@@ -223,7 +228,7 @@ class SearchMySQL extends SearchEngine {
foreach ( $this->features as $feature => $value ) {
if ( $feature === 'list-redirects' && !$value ) {
$query['conds']['page_is_redirect'] = 0;
- } elseif( $feature === 'title-suffix-filter' && $value ) {
+ } elseif ( $feature === 'title-suffix-filter' && $value ) {
$query['conds'][] = 'page_title' . $this->db->buildLike( $this->db->anyString(), $value );
}
}
@@ -358,12 +363,25 @@ class SearchMySQL extends SearchEngine {
$dbw->update( 'searchindex',
array( 'si_title' => $this->normalizeText( $title ) ),
- array( 'si_page' => $id ),
+ array( 'si_page' => $id ),
__METHOD__,
array( $dbw->lowPriorityOption() ) );
}
/**
+ * Delete an indexed page
+ * Title should be pre-processed.
+ *
+ * @param Integer $id Page id that was deleted
+ * @param String $title Title of page that was deleted
+ */
+ function delete( $id, $title ) {
+ $dbw = wfGetDB( DB_MASTER );
+
+ $dbw->delete( 'searchindex', array( 'si_page' => $id ), __METHOD__ );
+ }
+
+ /**
* Converts some characters for MySQL's indexing to grok it correctly,
* and pads short words to overcome limitations.
* @return mixed|string
@@ -386,7 +404,7 @@ class SearchMySQL extends SearchEngine {
// ignores short words... Pad them so we can pass them
// through without reconfiguring the server...
$minLength = $this->minSearchLength();
- if( $minLength > 1 ) {
+ if ( $minLength > 1 ) {
$n = $minLength - 1;
$out = preg_replace(
"/\b(\w{1,$n})\b/",
@@ -427,7 +445,7 @@ class SearchMySQL extends SearchEngine {
* @return int
*/
protected function minSearchLength() {
- if( is_null( self::$mMinSearchLength ) ) {
+ if ( is_null( self::$mMinSearchLength ) ) {
$sql = "SHOW GLOBAL VARIABLES LIKE 'ft\\_min\\_word\\_len'";
$dbr = wfGetDB( DB_SLAVE );
@@ -435,7 +453,7 @@ class SearchMySQL extends SearchEngine {
$row = $result->fetchObject();
$result->free();
- if( $row && $row->Variable_name == 'ft_min_word_len' ) {
+ if ( $row && $row->Variable_name == 'ft_min_word_len' ) {
self::$mMinSearchLength = intval( $row->Value );
} else {
self::$mMinSearchLength = 0;
@@ -449,7 +467,7 @@ class SearchMySQL extends SearchEngine {
* @ingroup Search
*/
class MySQLSearchResultSet extends SqlSearchResultSet {
- function __construct( $resultSet, $terms, $totalHits=null ) {
+ function __construct( $resultSet, $terms, $totalHits = null ) {
parent::__construct( $resultSet, $terms );
$this->mTotalHits = $totalHits;
}
diff --git a/includes/search/SearchOracle.php b/includes/search/SearchOracle.php
index b0ea97fe..a8479654 100644
--- a/includes/search/SearchOracle.php
+++ b/includes/search/SearchOracle.php
@@ -30,32 +30,34 @@
*/
class SearchOracle extends SearchEngine {
- private $reservedWords = array ('ABOUT' => 1,
- 'ACCUM' => 1,
- 'AND' => 1,
- 'BT' => 1,
- 'BTG' => 1,
- 'BTI' => 1,
- 'BTP' => 1,
- 'FUZZY' => 1,
- 'HASPATH' => 1,
- 'INPATH' => 1,
- 'MINUS' => 1,
- 'NEAR' => 1,
- 'NOT' => 1,
- 'NT' => 1,
- 'NTG' => 1,
- 'NTI' => 1,
- 'NTP' => 1,
- 'OR' => 1,
- 'PT' => 1,
- 'RT' => 1,
- 'SQE' => 1,
- 'SYN' => 1,
- 'TR' => 1,
- 'TRSYN' => 1,
- 'TT' => 1,
- 'WITHIN' => 1);
+ private $reservedWords = array(
+ 'ABOUT' => 1,
+ 'ACCUM' => 1,
+ 'AND' => 1,
+ 'BT' => 1,
+ 'BTG' => 1,
+ 'BTI' => 1,
+ 'BTP' => 1,
+ 'FUZZY' => 1,
+ 'HASPATH' => 1,
+ 'INPATH' => 1,
+ 'MINUS' => 1,
+ 'NEAR' => 1,
+ 'NOT' => 1,
+ 'NT' => 1,
+ 'NTG' => 1,
+ 'NTI' => 1,
+ 'NTP' => 1,
+ 'OR' => 1,
+ 'PT' => 1,
+ 'RT' => 1,
+ 'SQE' => 1,
+ 'SYN' => 1,
+ 'TR' => 1,
+ 'TRSYN' => 1,
+ 'TT' => 1,
+ 'WITHIN' => 1,
+ );
/**
* Creates an instance of this class
@@ -72,8 +74,9 @@ class SearchOracle extends SearchEngine {
* @return SqlSearchResultSet
*/
function searchText( $term ) {
- if ( $term == '' )
+ if ( $term == '' ) {
return new SqlSearchResultSet( false, '' );
+ }
$resultSet = $this->db->resultObject( $this->db->query( $this->getQuery( $this->filter( $term ), true ) ) );
return new SqlSearchResultSet( $resultSet, $this->searchTerms );
@@ -86,8 +89,9 @@ class SearchOracle extends SearchEngine {
* @return SqlSearchResultSet
*/
function searchTitle( $term ) {
- if ( $term == '' )
+ if ( $term == '' ) {
return new SqlSearchResultSet( false, '' );
+ }
$resultSet = $this->db->resultObject( $this->db->query( $this->getQuery( $this->filter( $term ), false ) ) );
return new MySQLSearchResultSet( $resultSet, $this->searchTerms );
@@ -110,8 +114,9 @@ class SearchOracle extends SearchEngine {
* @return String
*/
function queryNamespaces() {
- if( is_null( $this->namespaces ) )
+ if ( is_null( $this->namespaces ) ) {
return '';
+ }
if ( !count( $this->namespaces ) ) {
$namespaces = '0';
} else {
@@ -195,23 +200,24 @@ class SearchOracle extends SearchEngine {
$searchon = '';
if ( preg_match_all( '/([-+<>~]?)(([' . $lc . ']+)(\*?)|"[^"]*")/',
$filteredText, $m, PREG_SET_ORDER ) ) {
- foreach( $m as $terms ) {
+ foreach ( $m as $terms ) {
// Search terms in all variant forms, only
// apply on wiki with LanguageConverter
$temp_terms = $wgContLang->autoConvertToAllVariants( $terms[2] );
- if( is_array( $temp_terms )) {
- $temp_terms = array_unique( array_values( $temp_terms ));
- foreach( $temp_terms as $t ) {
- $searchon .= ($terms[1] == '-' ? ' ~' : ' & ') . $this->escapeTerm( $t );
+ if ( is_array( $temp_terms ) ) {
+ $temp_terms = array_unique( array_values( $temp_terms ) );
+ foreach ( $temp_terms as $t ) {
+ $searchon .= ( $terms[1] == '-' ? ' ~' : ' & ' ) . $this->escapeTerm( $t );
}
}
else {
- $searchon .= ($terms[1] == '-' ? ' ~' : ' & ') . $this->escapeTerm( $terms[2] );
+ $searchon .= ( $terms[1] == '-' ? ' ~' : ' & ' ) . $this->escapeTerm( $terms[2] );
}
if ( !empty( $terms[3] ) ) {
$regexp = preg_quote( $terms[3], '/' );
- if ( $terms[4] )
+ if ( $terms[4] ) {
$regexp .= "[0-9A-Za-z_]+";
+ }
} else {
$regexp = preg_quote( str_replace( '"', '', $terms[2] ), '/' );
}
@@ -227,9 +233,9 @@ class SearchOracle extends SearchEngine {
private function escapeTerm( $t ) {
global $wgContLang;
$t = $wgContLang->normalizeForSearch( $t );
- $t = isset( $this->reservedWords[strtoupper( $t )] ) ? '{'.$t.'}' : $t;
- $t = preg_replace('/^"(.*)"$/', '($1)', $t);
- $t = preg_replace('/([-&|])/', '\\\\$1', $t);
+ $t = isset( $this->reservedWords[strtoupper( $t )] ) ? '{' . $t . '}' : $t;
+ $t = preg_replace( '/^"(.*)"$/', '($1)', $t );
+ $t = preg_replace( '/([-&|])/', '\\\\$1', $t );
return $t;
}
/**
@@ -273,7 +279,7 @@ class SearchOracle extends SearchEngine {
$dbw->update( 'searchindex',
array( 'si_title' => $title ),
- array( 'si_page' => $id ),
+ array( 'si_page' => $id ),
'SearchOracle::updateTitle',
array() );
}
diff --git a/includes/search/SearchPostgres.php b/includes/search/SearchPostgres.php
index 56464e98..7f19ed13 100644
--- a/includes/search/SearchPostgres.php
+++ b/includes/search/SearchPostgres.php
@@ -64,7 +64,7 @@ class SearchPostgres extends SearchEngine {
function searchText( $term ) {
$q = $this->searchQuery( $term, 'textvector', 'old_text' );
- $olderror = error_reporting(E_ERROR);
+ $olderror = error_reporting( E_ERROR );
$resultSet = $this->db->resultObject( $this->db->query( $q, 'SearchPostgres', true ) );
error_reporting( $olderror );
if ( !$resultSet ) {
@@ -86,19 +86,19 @@ class SearchPostgres extends SearchEngine {
wfDebug( "parseQuery received: $term \n" );
## No backslashes allowed
- $term = preg_replace('/\\\/', '', $term);
+ $term = preg_replace( '/\\\/', '', $term );
## Collapse parens into nearby words:
- $term = preg_replace('/\s*\(\s*/', ' (', $term);
- $term = preg_replace('/\s*\)\s*/', ') ', $term);
+ $term = preg_replace( '/\s*\(\s*/', ' (', $term );
+ $term = preg_replace( '/\s*\)\s*/', ') ', $term );
## Treat colons as word separators:
- $term = preg_replace('/:/', ' ', $term);
+ $term = preg_replace( '/:/', ' ', $term );
$searchstring = '';
$m = array();
- if( preg_match_all('/([-!]?)(\S+)\s*/', $term, $m, PREG_SET_ORDER ) ) {
- foreach( $m as $terms ) {
+ if ( preg_match_all( '/([-!]?)(\S+)\s*/', $term, $m, PREG_SET_ORDER ) ) {
+ foreach ( $m as $terms ) {
if ( strlen( $terms[1] ) ) {
$searchstring .= ' & !';
}
@@ -118,19 +118,19 @@ class SearchPostgres extends SearchEngine {
}
## Strip out leading junk
- $searchstring = preg_replace('/^[\s\&\|]+/', '', $searchstring);
+ $searchstring = preg_replace( '/^[\s\&\|]+/', '', $searchstring );
## Remove any doubled-up operators
- $searchstring = preg_replace('/([\!\&\|]) +(?:[\&\|] +)+/', "$1 ", $searchstring);
+ $searchstring = preg_replace( '/([\!\&\|]) +(?:[\&\|] +)+/', "$1 ", $searchstring );
## Remove any non-spaced operators (e.g. "Zounds!")
- $searchstring = preg_replace('/([^ ])[\!\&\|]/', "$1", $searchstring);
+ $searchstring = preg_replace( '/([^ ])[\!\&\|]/', "$1", $searchstring );
## Remove any trailing whitespace or operators
- $searchstring = preg_replace('/[\s\!\&\|]+$/', '', $searchstring);
+ $searchstring = preg_replace( '/[\s\!\&\|]+$/', '', $searchstring );
## Remove unnecessary quotes around everything
- $searchstring = preg_replace('/^[\'"](.*)[\'"]$/', "$1", $searchstring);
+ $searchstring = preg_replace( '/^[\'"](.*)[\'"]$/', "$1", $searchstring );
## Quote the whole thing
$searchstring = $this->db->addQuotes( $searchstring );
@@ -163,30 +163,31 @@ class SearchPostgres extends SearchEngine {
$top = $top[0];
if ( $top === "" ) { ## e.g. if only stopwords are used XXX return something better
- $query = "SELECT page_id, page_namespace, page_title, 0 AS score ".
+ $query = "SELECT page_id, page_namespace, page_title, 0 AS score " .
"FROM page p, revision r, pagecontent c WHERE p.page_latest = r.rev_id " .
"AND r.rev_text_id = c.old_id AND 1=0";
}
else {
$m = array();
- if( preg_match_all("/'([^']+)'/", $top, $m, PREG_SET_ORDER ) ) {
- foreach( $m as $terms ) {
+ if ( preg_match_all( "/'([^']+)'/", $top, $m, PREG_SET_ORDER ) ) {
+ foreach ( $m as $terms ) {
$this->searchTerms[$terms[1]] = $terms[1];
}
}
- $query = "SELECT page_id, page_namespace, page_title, ".
- "ts_rank($fulltext, to_tsquery($searchstring), 5) AS score ".
+ $query = "SELECT page_id, page_namespace, page_title, " .
+ "ts_rank($fulltext, to_tsquery($searchstring), 5) AS score " .
"FROM page p, revision r, pagecontent c WHERE p.page_latest = r.rev_id " .
"AND r.rev_text_id = c.old_id AND $fulltext @@ to_tsquery($searchstring)";
}
## Redirects
- if ( !$this->showRedirects )
+ if ( !$this->showRedirects ) {
$query .= ' AND page_is_redirect = 0';
+ }
## Namespaces - defaults to 0
- if( !is_null( $this->namespaces ) ) { // null -> search all
+ if ( !is_null( $this->namespaces ) ) { // null -> search all
if ( count( $this->namespaces ) < 1 ) {
$query .= ' AND page_namespace = 0';
} else {
@@ -208,7 +209,7 @@ class SearchPostgres extends SearchEngine {
function update( $pageid, $title, $text ) {
## We don't want to index older revisions
- $SQL = "UPDATE pagecontent SET textvector = NULL WHERE old_id IN ".
+ $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->query( $SQL );
@@ -244,7 +245,7 @@ class PostgresSearchResultSet extends SqlSearchResultSet {
function next() {
$row = $this->mResultSet->fetchObject();
- if( $row === false ) {
+ if ( $row === false ) {
return false;
} else {
return new PostgresSearchResult( $row );
diff --git a/includes/search/SearchSqlite.php b/includes/search/SearchSqlite.php
index f3f4788c..554181f6 100644
--- a/includes/search/SearchSqlite.php
+++ b/includes/search/SearchSqlite.php
@@ -61,12 +61,12 @@ class SearchSqlite extends SearchEngine {
$this->searchTerms = array();
$m = array();
- if( preg_match_all( '/([-+<>~]?)(([' . $lc . ']+)(\*?)|"[^"]*")/',
+ if ( preg_match_all( '/([-+<>~]?)(([' . $lc . ']+)(\*?)|"[^"]*")/',
$filteredText, $m, PREG_SET_ORDER ) ) {
- foreach( $m as $bits ) {
+ foreach ( $m as $bits ) {
@list( /* all */, $modifier, $term, $nonQuoted, $wildcard ) = $bits;
- if( $nonQuoted != '' ) {
+ if ( $nonQuoted != '' ) {
$term = $nonQuoted;
$quote = '';
} else {
@@ -74,14 +74,14 @@ class SearchSqlite extends SearchEngine {
$quote = '"';
}
- if( $searchon !== '' ) {
+ if ( $searchon !== '' ) {
$searchon .= ' ';
}
// Some languages such as Serbian store the input form in the search index,
// so we may need to search for matches in multiple writing system variants.
$convertedVariants = $wgContLang->autoConvertToAllVariants( $term );
- if( is_array( $convertedVariants ) ) {
+ if ( is_array( $convertedVariants ) ) {
$variants = array_unique( array_values( $convertedVariants ) );
} else {
$variants = array( $term );
@@ -101,10 +101,11 @@ class SearchSqlite extends SearchEngine {
$strippedVariants = array_unique( $strippedVariants );
$searchon .= $modifier;
- if( count( $strippedVariants) > 1 )
+ if ( count( $strippedVariants ) > 1 ) {
$searchon .= '(';
- foreach( $strippedVariants as $stripped ) {
- if( $nonQuoted && strpos( $stripped, ' ' ) !== false ) {
+ }
+ foreach ( $strippedVariants as $stripped ) {
+ if ( $nonQuoted && strpos( $stripped, ' ' ) !== false ) {
// Hack for Chinese: we need to toss in quotes for
// multiple-character phrases since normalizeForSearch()
// added spaces between them to make word breaks.
@@ -112,8 +113,9 @@ class SearchSqlite extends SearchEngine {
}
$searchon .= "$quote$stripped$quote$wildcard ";
}
- if( count( $strippedVariants) > 1 )
+ 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!
@@ -134,8 +136,8 @@ class SearchSqlite extends SearchEngine {
global $wgContLang;
$regex = preg_quote( $string, '/' );
- if( $wgContLang->hasWordBreaks() ) {
- if( $wildcard ) {
+ if ( $wgContLang->hasWordBreaks() ) {
+ if ( $wildcard ) {
// Don't cut off the final bit!
$regex = "\b$regex";
} else {
@@ -184,10 +186,10 @@ class SearchSqlite extends SearchEngine {
$resultSet = $this->db->query( $this->getQuery( $filteredTerm, $fulltext ) );
$total = null;
- if( $wgCountTotalSearchHits ) {
+ if ( $wgCountTotalSearchHits ) {
$totalResult = $this->db->query( $this->getCountQuery( $filteredTerm, $fulltext ) );
$row = $totalResult->fetchObject();
- if( $row ) {
+ if ( $row ) {
$total = intval( $row->c );
}
$totalResult->free();
@@ -201,7 +203,7 @@ class SearchSqlite extends SearchEngine {
* @return String
*/
function queryRedirect() {
- if( $this->showRedirects ) {
+ if ( $this->showRedirects ) {
return '';
} else {
return 'AND page_is_redirect=0';
@@ -213,8 +215,9 @@ class SearchSqlite extends SearchEngine {
* @return String
*/
function queryNamespaces() {
- if( is_null( $this->namespaces ) )
+ if ( is_null( $this->namespaces ) ) {
return ''; # search all
+ }
if ( !count( $this->namespaces ) ) {
$namespaces = '0';
} else {
@@ -295,7 +298,7 @@ class SearchSqlite extends SearchEngine {
if ( !$this->fulltextSearchSupported() ) {
return;
}
- // @todo: find a method to do it in a single request,
+ // @todo find a method to do it in a single request,
// couldn't do it so far due to typelessness of FTS3 tables.
$dbw = wfGetDB( DB_MASTER );
@@ -324,7 +327,7 @@ class SearchSqlite extends SearchEngine {
$dbw->update( 'searchindex',
array( 'si_title' => $title ),
- array( 'rowid' => $id ),
+ array( 'rowid' => $id ),
__METHOD__ );
}
}
@@ -333,7 +336,7 @@ class SearchSqlite extends SearchEngine {
* @ingroup Search
*/
class SqliteSearchResultSet extends SqlSearchResultSet {
- function __construct( $resultSet, $terms, $totalHits=null ) {
+ function __construct( $resultSet, $terms, $totalHits = null ) {
parent::__construct( $resultSet, $terms );
$this->mTotalHits = $totalHits;
}
diff --git a/includes/search/SearchUpdate.php b/includes/search/SearchUpdate.php
index eabcda3e..82a413e9 100644
--- a/includes/search/SearchUpdate.php
+++ b/includes/search/SearchUpdate.php
@@ -29,51 +29,108 @@
* @ingroup Search
*/
class SearchUpdate implements DeferrableUpdate {
-
- private $mId = 0, $mNamespace, $mTitle, $mText;
- private $mTitleWords;
-
- function __construct( $id, $title, $text = false ) {
+ /**
+ * Page id being updated
+ * @var int
+ */
+ private $id = 0;
+
+ /**
+ * Title we're updating
+ * @var Title
+ */
+ private $title;
+
+ /**
+ * Content of the page (not text)
+ * @var Content|false
+ */
+ private $content;
+
+ /**
+ * Constructor
+ *
+ * @param int $id Page id to update
+ * @param Title|string $title Title of page to update
+ * @param Content|string|false $c Content of the page to update.
+ * If a Content object, text will be gotten from it. String is for back-compat.
+ * Passing false tells the backend to just update the title, not the content
+ */
+ public function __construct( $id, $title, $c = false ) {
if ( is_string( $title ) ) {
$nt = Title::newFromText( $title );
} else {
$nt = $title;
}
- if( $nt ) {
- $this->mId = $id;
- $this->mText = $text;
-
- $this->mNamespace = $nt->getNamespace();
- $this->mTitle = $nt->getText(); # Discard namespace
-
- $this->mTitleWords = $this->mTextWords = array();
+ if ( $nt ) {
+ $this->id = $id;
+ // is_string() check is back-compat for ApprovedRevs
+ if ( is_string( $c ) ) {
+ $this->content = new TextContent( $c );
+ } else {
+ $this->content = $c ?: false;
+ }
+ $this->title = $nt;
} else {
wfDebug( "SearchUpdate object created with invalid title '$title'\n" );
}
}
- function doUpdate() {
- global $wgContLang, $wgDisableSearchUpdate;
+ /**
+ * Perform actual update for the entry
+ */
+ public function doUpdate() {
+ global $wgDisableSearchUpdate;
- if( $wgDisableSearchUpdate || !$this->mId ) {
+ if ( $wgDisableSearchUpdate || !$this->id ) {
return;
}
wfProfileIn( __METHOD__ );
- $search = SearchEngine::create();
- $lc = SearchEngine::legalSearchChars() . '&#;';
+ $page = WikiPage::newFromId( $this->id, WikiPage::READ_LATEST );
+ $indexTitle = Title::indexTitle( $this->title->getNamespace(), $this->title->getText() );
- if( $this->mText === false ) {
- $search->updateTitle($this->mId,
- $search->normalizeText( Title::indexTitle( $this->mNamespace, $this->mTitle ) ) );
- wfProfileOut( __METHOD__ );
- return;
+ foreach ( SearchEngine::getSearchTypes() as $type ) {
+ $search = SearchEngine::create( $type );
+ if ( !$search->supports( 'search-update' ) ) {
+ continue;
+ }
+
+ $normalTitle = $search->normalizeText( $indexTitle );
+
+ if ( $page === null ) {
+ $search->delete( $this->id, $normalTitle );
+ continue;
+ } elseif ( $this->content === false ) {
+ $search->updateTitle( $this->id, $normalTitle );
+ continue;
+ }
+
+ $text = $search->getTextFromContent( $this->title, $this->content );
+ if ( !$search->textAlreadyUpdatedForIndex() ) {
+ $text = self::updateText( $text );
+ }
+
+ # Perform the actual update
+ $search->update( $this->id, $normalTitle, $search->normalizeText( $text ) );
}
+ wfProfileOut( __METHOD__ );
+ }
+
+ /**
+ * Clean text for indexing. Only really suitable for indexing in databases.
+ * If you're using a real search engine, you'll probably want to override
+ * this behavior and do something nicer with the original wikitext.
+ */
+ public static function updateText( $text ) {
+ global $wgContLang;
+
# Language-specific strip/conversion
- $text = $wgContLang->normalizeForSearch( $this->mText );
+ $text = $wgContLang->normalizeForSearch( $text );
+ $lc = SearchEngine::legalSearchChars() . '&#;';
wfProfileIn( __METHOD__ . '-regexps' );
$text = preg_replace( "/<\\/?\\s*[A-Za-z][^>]*?>/",
@@ -123,22 +180,6 @@ class SearchUpdate implements DeferrableUpdate {
# Strip wiki '' and '''
$text = preg_replace( "/''[']*/", " ", $text );
wfProfileOut( __METHOD__ . '-regexps' );
-
- wfRunHooks( 'SearchUpdate', array( $this->mId, $this->mNamespace, $this->mTitle, &$text ) );
-
- # Perform the actual update
- $search->update( $this->mId, $search->normalizeText( Title::indexTitle( $this->mNamespace, $this->mTitle ) ),
- $search->normalizeText( $text ) );
-
- wfProfileOut( __METHOD__ );
+ return $text;
}
}
-
-/**
- * Placeholder class
- *
- * @ingroup Search
- */
-class SearchUpdateMyISAM extends SearchUpdate {
- # Inherits everything
-}
diff --git a/includes/site/MediaWikiSite.php b/includes/site/MediaWikiSite.php
index 05092723..f3b8a0c7 100644
--- a/includes/site/MediaWikiSite.php
+++ b/includes/site/MediaWikiSite.php
@@ -123,17 +123,17 @@ class MediaWikiSite extends Site {
'converttitles' => true,
'format' => 'json',
'titles' => $pageName,
- //@todo: options for maxlag and maxage
+ // @todo options for maxlag and maxage
// Note that maxlag will lead to a long delay before a reply is made,
// but that maxage can avoid the extreme delay. On the other hand
// maxage could be nice to use anyhow as it stops unnecessary requests.
// Also consider smaxage if maxage is used.
);
- $url = $this->getFileUrl( 'api.php' ) . '?' . wfArrayToCgi( $args );
+ $url = wfAppendQuery( $this->getFileUrl( 'api.php' ), $args );
// Go on call the external site
- //@todo: we need a good way to specify a timeout here.
+ // @todo we need a good way to specify a timeout here.
$ret = Http::get( $url );
}
@@ -185,7 +185,7 @@ class MediaWikiSite extends Site {
// the single page in the "pages" substructure.
if ( isset( $externalData['query']['pages'] ) ) {
$pages = array_values( $externalData['query']['pages'] );
- if ( count( $pages) === 1 ) {
+ if ( count( $pages ) === 1 ) {
return $pages[0];
}
}
diff --git a/includes/site/SiteSQLStore.php b/includes/site/SiteSQLStore.php
index 41238055..11141e07 100644
--- a/includes/site/SiteSQLStore.php
+++ b/includes/site/SiteSQLStore.php
@@ -189,6 +189,39 @@ class SiteSQLStore implements SiteStore {
}
/**
+ * Get a new ORMRow from a Site object
+ *
+ * @since 1.22
+ *
+ * @param Site
+ *
+ * @return ORMRow
+ */
+ protected function getRowFromSite( Site $site ) {
+ $fields = array(
+ // Site data
+ 'global_key' => $site->getGlobalId(), // TODO: check not null
+ 'type' => $site->getType(),
+ 'group' => $site->getGroup(),
+ 'source' => $site->getSource(),
+ 'language' => $site->getLanguageCode() === null ? '' : $site->getLanguageCode(),
+ 'protocol' => $site->getProtocol(),
+ 'domain' => strrev( $site->getDomain() ) . '.',
+ 'data' => $site->getExtraData(),
+
+ // Site config
+ 'forward' => $site->shouldForward(),
+ 'config' => $site->getExtraConfig(),
+ );
+
+ if ( $site->getInternalId() !== null ) {
+ $fields['id'] = $site->getInternalId();
+ }
+
+ return new ORMRow( $this->sitesTable, $fields );
+ }
+
+ /**
* Fetches the site from the database and loads them into the sites field.
*
* @since 1.21
@@ -291,28 +324,11 @@ class SiteSQLStore implements SiteStore {
$localIds = array();
foreach ( $sites as $site ) {
- $fields = array(
- // Site data
- 'global_key' => $site->getGlobalId(), // TODO: check not null
- 'type' => $site->getType(),
- 'group' => $site->getGroup(),
- 'source' => $site->getSource(),
- 'language' => $site->getLanguageCode() === null ? '' : $site->getLanguageCode(),
- 'protocol' => $site->getProtocol(),
- 'domain' => strrev( $site->getDomain() ) . '.',
- 'data' => $site->getExtraData(),
-
- // Site config
- 'forward' => $site->shouldForward(),
- 'config' => $site->getExtraConfig(),
- );
-
if ( $site->getInternalId() !== null ) {
- $fields['id'] = $site->getInternalId();
$internalIds[] = $site->getInternalId();
}
- $siteRow = new ORMRow( $this->sitesTable, $fields );
+ $siteRow = $this->getRowFromSite( $site );
$success = $siteRow->save( __METHOD__ ) && $success;
foreach ( $site->getLocalIds() as $idType => $ids ) {
diff --git a/includes/specials/SpecialActiveusers.php b/includes/specials/SpecialActiveusers.php
index c9c82ada..705dab55 100644
--- a/includes/specials/SpecialActiveusers.php
+++ b/includes/specials/SpecialActiveusers.php
@@ -62,7 +62,7 @@ class ActiveUsersPager extends UsersPager {
$this->requestedUser = '';
if ( $un != '' ) {
$username = Title::makeTitleSafe( NS_USER, $un );
- if( !is_null( $username ) ) {
+ if ( !is_null( $username ) ) {
$this->requestedUser = $username->getText();
}
}
@@ -91,42 +91,62 @@ class ActiveUsersPager extends UsersPager {
}
function getQueryInfo() {
- $dbr = wfGetDB( DB_SLAVE );
+ $dbr = $this->getDatabase();
+
$conds = array( 'rc_user > 0' ); // Users - no anons
- if( !$this->getUser()->isAllowed( 'hideuser' ) ) {
- $conds[] = 'ipb_deleted IS NULL OR ipb_deleted = 0'; // don't show hidden names
- }
$conds[] = 'rc_log_type IS NULL OR rc_log_type != ' . $dbr->addQuotes( 'newusers' );
$conds[] = 'rc_timestamp >= ' . $dbr->addQuotes(
- $dbr->timestamp( wfTimestamp( TS_UNIX ) - $this->RCMaxAge*24*3600 ) );
+ $dbr->timestamp( wfTimestamp( TS_UNIX ) - $this->RCMaxAge * 24 * 3600 ) );
- if( $this->requestedUser != '' ) {
+ if ( $this->requestedUser != '' ) {
$conds[] = 'rc_user_text >= ' . $dbr->addQuotes( $this->requestedUser );
}
+ if ( !$this->getUser()->isAllowed( 'hideuser' ) ) {
+ $conds[] = 'NOT EXISTS (' . $dbr->selectSQLText(
+ 'ipblocks', '1', array( 'rc_user=ipb_user', 'ipb_deleted' => 1 )
+ ) . ')';
+ }
+
return array(
- 'tables' => array( 'recentchanges', 'ipblocks' ),
+ 'tables' => array( 'recentchanges' ),
'fields' => array(
'user_name' => 'rc_user_text', // for Pager inheritance
'rc_user_text', // for Pager
- 'user_id' => 'rc_user',
- 'recentedits' => 'COUNT(*)',
- 'ipb_deleted' => 'MAX(ipb_deleted)'
+ 'user_id' => 'MAX(rc_user)', // Postgres
+ 'recentedits' => 'COUNT(*)'
),
'options' => array(
- 'GROUP BY' => array( 'rc_user_text', 'user_id' ),
+ 'GROUP BY' => array( 'rc_user_text' ),
'USE INDEX' => array( 'recentchanges' => 'rc_user_text' )
),
- 'join_conds' => array( // check for suppression blocks
- 'ipblocks' => array( 'LEFT JOIN', array(
- 'rc_user=ipb_user',
- 'ipb_auto' => 0 # avoid duplicate blocks
- )),
- ),
'conds' => $conds
);
}
+ function doBatchLookups() {
+ $uids = array();
+ foreach ( $this->mResult as $row ) {
+ $uids[] = $row->user_id;
+ }
+ // Fetch the block status of the user for showing "(blocked)" text and for
+ // striking out names of suppressed users when privileged user views the list.
+ // Although the first query already hits the block table for un-privileged, this
+ // is done in two queries to avoid huge quicksorts and to make COUNT(*) correct.
+ $dbr = $this->getDatabase();
+ $res = $dbr->select( 'ipblocks',
+ array( 'ipb_user', 'MAX(ipb_deleted) AS block_status' ),
+ array( 'ipb_user' => $uids ),
+ __METHOD__,
+ array( 'GROUP BY' => array( 'ipb_user' ) )
+ );
+ $this->blockStatusByUid = array();
+ foreach ( $res as $row ) {
+ $this->blockStatusByUid[$row->ipb_user] = $row->block_status; // 0 or 1
+ }
+ $this->mResult->seek( 0 );
+ }
+
function formatRow( $row ) {
$userName = $row->user_name;
@@ -139,7 +159,7 @@ class ActiveUsersPager extends UsersPager {
$user = User::newFromId( $row->user_id );
// User right filter
- foreach( $this->hideRights as $right ) {
+ foreach ( $this->hideRights as $right ) {
// Calling User::getRights() within the loop so that
// if the hideRights() filter is empty, we don't have to
// trigger the lazy-init of the big userrights array in the
@@ -153,7 +173,7 @@ class ActiveUsersPager extends UsersPager {
// Note: This is a different loop than for user rights,
// because we're reusing it to build the group links
// at the same time
- foreach( $user->getGroups() as $group ) {
+ foreach ( $user->getGroups() as $group ) {
if ( in_array( $group, $this->hideGroups ) ) {
return '';
}
@@ -163,12 +183,14 @@ class ActiveUsersPager extends UsersPager {
$groups = $lang->commaList( $list );
$item = $lang->specialList( $ulinks, $groups );
- if( $row->ipb_deleted ) {
+
+ $isBlocked = isset( $this->blockStatusByUid[$row->user_id] );
+ if ( $isBlocked && $this->blockStatusByUid[$row->user_id] == 1 ) {
$item = "<span class=\"deleted\">$item</span>";
}
$count = $this->msg( 'activeusers-count' )->numParams( $row->recentedits )
->params( $userName )->numParams( $this->RCMaxAge )->escaped();
- $blocked = !is_null( $row->ipb_deleted ) ? ' ' . $this->msg( 'listusers-blocked', $userName )->escaped() : '';
+ $blocked = $isBlocked ? ' ' . $this->msg( 'listusers-blocked', $userName )->escaped() : '';
return Html::rawElement( 'li', array(), "{$item} [{$count}]{$blocked}" );
}
@@ -184,15 +206,15 @@ class ActiveUsersPager extends UsersPager {
$out .= Html::hidden( 'title', $self->getPrefixedDBkey() ) . $limit . "\n";
$out .= Xml::inputLabel( $this->msg( 'activeusers-from' )->text(),
- 'username', 'offset', 20, $this->requestedUser ) . '<br />';# Username field
+ 'username', 'offset', 20, $this->requestedUser, array( 'tabindex' => 1 ) ) . '<br />';# Username field
$out .= Xml::checkLabel( $this->msg( 'activeusers-hidebots' )->text(),
- 'hidebots', 'hidebots', $this->opts->getValue( 'hidebots' ) );
+ 'hidebots', 'hidebots', $this->opts->getValue( 'hidebots' ), array( 'tabindex' => 2 ) );
$out .= Xml::checkLabel( $this->msg( 'activeusers-hidesysops' )->text(),
- 'hidesysops', 'hidesysops', $this->opts->getValue( 'hidesysops' ) ) . '<br />';
+ 'hidesysops', 'hidesysops', $this->opts->getValue( 'hidesysops' ), array( 'tabindex' => 3 ) ) . '<br />';
- $out .= Xml::submitButton( $this->msg( 'allpagessubmit' )->text() ) . "\n";# Submit button and form bottom
+ $out .= Xml::submitButton( $this->msg( 'allpagessubmit' )->text(), array( 'tabindex' => 4 ) ) . "\n";# Submit button and form bottom
$out .= Xml::closeElement( 'fieldset' );
$out .= Xml::closeElement( 'form' );
diff --git a/includes/specials/SpecialAllmessages.php b/includes/specials/SpecialAllmessages.php
index a60c8efe..35d6a0c0 100644
--- a/includes/specials/SpecialAllmessages.php
+++ b/includes/specials/SpecialAllmessages.php
@@ -28,7 +28,6 @@
* @ingroup SpecialPage
*/
class SpecialAllmessages extends SpecialPage {
-
/**
* @var AllmessagesTablePager
*/
@@ -53,8 +52,9 @@ class SpecialAllmessages extends SpecialPage {
$this->setHeaders();
global $wgUseDatabaseMessages;
- if( !$wgUseDatabaseMessages ) {
+ if ( !$wgUseDatabaseMessages ) {
$out->addWikiMsg( 'allmessagesnotsupportedDB' );
+
return;
} else {
$this->outputHeader( 'allmessagestext' );
@@ -74,7 +74,6 @@ class SpecialAllmessages extends SpecialPage {
$this->table->getNavigationBar() .
$this->table->getBody() .
$this->table->getNavigationBar() );
-
}
protected function getGroupName() {
@@ -87,7 +86,6 @@ class SpecialAllmessages extends SpecialPage {
* getting data from a table when in fact not all of it comes from the database.
*/
class AllmessagesTablePager extends TablePager {
-
protected $filter, $prefix, $langcode, $displayPrefix;
public $mLimitsShown;
@@ -121,15 +119,15 @@ class AllmessagesTablePager extends TablePager {
$request = $this->getRequest();
$this->filter = $request->getVal( 'filter', 'all' );
- if( $this->filter === 'all' ) {
+ if ( $this->filter === 'all' ) {
$this->custom = null; // So won't match in either case
} else {
- $this->custom = ($this->filter == 'unmodified');
+ $this->custom = ( $this->filter == 'unmodified' );
}
$prefix = $this->getLanguage()->ucfirst( $request->getVal( 'prefix', '' ) );
$prefix = $prefix != '' ? Title::makeTitleSafe( NS_MEDIAWIKI, $request->getVal( 'prefix', null ) ) : null;
- if( $prefix !== null ) {
+ if ( $prefix !== null ) {
$this->displayPrefix = $prefix->getDBkey();
$this->prefix = '/^' . preg_quote( $this->displayPrefix ) . '/i';
} else {
@@ -139,7 +137,7 @@ class AllmessagesTablePager extends TablePager {
// The suffix that may be needed for message names if we're in a
// different language (eg [[MediaWiki:Foo/fr]]: $suffix = '/fr'
- if( $this->foreign ) {
+ if ( $this->foreign ) {
$this->suffix = '/' . $this->langcode;
} else {
$this->suffix = '';
@@ -159,36 +157,36 @@ class AllmessagesTablePager extends TablePager {
Xml::openElement( 'table', array( 'class' => 'mw-allmessages-table' ) ) . "\n" .
'<tr>
<td class="mw-label">' .
- Xml::label( $this->msg( 'allmessages-prefix' )->text(), 'mw-allmessages-form-prefix' ) .
- "</td>\n
- <td class=\"mw-input\">" .
- Xml::input( 'prefix', 20, str_replace( '_', ' ', $this->displayPrefix ), array( 'id' => 'mw-allmessages-form-prefix' ) ) .
- "</td>\n
+ Xml::label( $this->msg( 'allmessages-prefix' )->text(), 'mw-allmessages-form-prefix' ) .
+ "</td>\n
+ <td class=\"mw-input\">" .
+ Xml::input( 'prefix', 20, str_replace( '_', ' ', $this->displayPrefix ), array( 'id' => 'mw-allmessages-form-prefix' ) ) .
+ "</td>\n
</tr>
<tr>\n
- <td class='mw-label'>" .
- $this->msg( 'allmessages-filter' )->escaped() .
- "</td>\n
+ <td class='mw-label'>" .
+ $this->msg( 'allmessages-filter' )->escaped() .
+ "</td>\n
<td class='mw-input'>" .
- Xml::radioLabel( $this->msg( 'allmessages-filter-unmodified' )->text(),
- 'filter',
- 'unmodified',
- 'mw-allmessages-form-filter-unmodified',
- ( $this->filter == 'unmodified' )
- ) .
- Xml::radioLabel( $this->msg( 'allmessages-filter-all' )->text(),
- 'filter',
- 'all',
- 'mw-allmessages-form-filter-all',
- ( $this->filter == 'all' )
- ) .
- Xml::radioLabel( $this->msg( 'allmessages-filter-modified' )->text(),
- 'filter',
- 'modified',
- 'mw-allmessages-form-filter-modified',
- ( $this->filter == 'modified' )
- ) .
- "</td>\n
+ Xml::radioLabel( $this->msg( 'allmessages-filter-unmodified' )->text(),
+ 'filter',
+ 'unmodified',
+ 'mw-allmessages-form-filter-unmodified',
+ ( $this->filter == 'unmodified' )
+ ) .
+ Xml::radioLabel( $this->msg( 'allmessages-filter-all' )->text(),
+ 'filter',
+ 'all',
+ 'mw-allmessages-form-filter-all',
+ ( $this->filter == 'all' )
+ ) .
+ Xml::radioLabel( $this->msg( 'allmessages-filter-modified' )->text(),
+ 'filter',
+ 'modified',
+ 'mw-allmessages-form-filter-modified',
+ ( $this->filter == 'modified' )
+ ) .
+ "</td>\n
</tr>
<tr>\n
<td class=\"mw-label\">" . $langSelect[0] . "</td>\n
@@ -197,29 +195,30 @@ class AllmessagesTablePager extends TablePager {
'<tr>
<td class="mw-label">' .
- Xml::label( $this->msg( 'table_pager_limit_label' )->text(), 'mw-table_pager_limit_label' ) .
- '</td>
- <td class="mw-input">' .
- $this->getLimitSelect() .
- '</td>
+ Xml::label( $this->msg( 'table_pager_limit_label' )->text(), 'mw-table_pager_limit_label' ) .
+ '</td>
+ <td class="mw-input">' .
+ $this->getLimitSelect() .
+ '</td>
<tr>
<td></td>
<td>' .
- Xml::submitButton( $this->msg( 'allmessages-filter-submit' )->text() ) .
- "</td>\n
+ Xml::submitButton( $this->msg( 'allmessages-filter-submit' )->text() ) .
+ "</td>\n
</tr>" .
Xml::closeElement( 'table' ) .
$this->getHiddenFields( array( 'title', 'prefix', 'filter', 'lang', 'limit' ) ) .
Xml::closeElement( 'fieldset' ) .
Xml::closeElement( 'form' );
+
return $out;
}
function getAllMessages( $descending ) {
wfProfileIn( __METHOD__ );
$messageNames = Language::getLocalisationCache()->getSubitemList( 'en', 'messages' );
- if( $descending ) {
+ if ( $descending ) {
rsort( $messageNames );
} else {
asort( $messageNames );
@@ -229,6 +228,7 @@ class AllmessagesTablePager extends TablePager {
$messageNames = array_map( array( $this->lang, 'ucfirst' ), $messageNames );
wfProfileOut( __METHOD__ );
+
return $messageNames;
}
@@ -260,18 +260,19 @@ class AllmessagesTablePager extends TablePager {
foreach ( $res as $s ) {
$exists = false;
- if( $foreign ) {
+ if ( $foreign ) {
$title = explode( '/', $s->page_title );
- if( count( $title ) === 2 && $langcode == $title[1]
- && isset( $xNames[$title[0]] ) ) {
+ if ( count( $title ) === 2 && $langcode == $title[1]
+ && isset( $xNames[$title[0]] )
+ ) {
$exists = $title[0];
}
- } elseif( isset( $xNames[$s->page_title] ) ) {
+ } elseif ( isset( $xNames[$s->page_title] ) ) {
$exists = $s->page_title;
}
- if( $exists && $s->page_namespace == NS_MEDIAWIKI ) {
+ if ( $exists && $s->page_namespace == NS_MEDIAWIKI ) {
$pageFlags[$exists] = true;
- } elseif( $exists && $s->page_namespace == NS_MEDIAWIKI_TALK ) {
+ } elseif ( $exists && $s->page_namespace == NS_MEDIAWIKI_TALK ) {
$talkFlags[$exists] = true;
}
}
@@ -284,6 +285,9 @@ class AllmessagesTablePager extends TablePager {
/**
* This function normally does a database query to get the results; we need
* to make a pretend result using a FakeResultWrapper.
+ * @param string $offset
+ * @param int $limit
+ * @param bool $descending
* @return FakeResultWrapper
*/
function reallyDoQuery( $offset, $limit, $descending ) {
@@ -293,27 +297,29 @@ class AllmessagesTablePager extends TablePager {
$statuses = self::getCustomisedStatuses( $messageNames, $this->langcode, $this->foreign );
$count = 0;
- foreach( $messageNames as $key ) {
+ foreach ( $messageNames as $key ) {
$customised = isset( $statuses['pages'][$key] );
- if( $customised !== $this->custom &&
+ if ( $customised !== $this->custom &&
( $descending && ( $key < $offset || !$offset ) || !$descending && $key > $offset ) &&
( ( $this->prefix && preg_match( $this->prefix, $key ) ) || $this->prefix === false )
) {
$actual = wfMessage( $key )->inLanguage( $this->langcode )->plain();
$default = wfMessage( $key )->inLanguage( $this->langcode )->useDatabase( false )->plain();
$result->result[] = array(
- 'am_title' => $key,
- 'am_actual' => $actual,
- 'am_default' => $default,
+ 'am_title' => $key,
+ 'am_actual' => $actual,
+ 'am_default' => $default,
'am_customised' => $customised,
'am_talk_exists' => isset( $statuses['talks'][$key] )
);
$count++;
}
- if( $count == $limit ) {
+
+ if ( $count == $limit ) {
break;
}
}
+
return $result;
}
@@ -321,26 +327,26 @@ class AllmessagesTablePager extends TablePager {
return Xml::openElement( 'table', array( 'class' => 'mw-datatable TablePager', 'id' => 'mw-allmessagestable' ) ) . "\n" .
"<thead><tr>
<th rowspan=\"2\">" .
- $this->msg( 'allmessagesname' )->escaped() . "
+ $this->msg( 'allmessagesname' )->escaped() . "
</th>
<th>" .
- $this->msg( 'allmessagesdefault' )->escaped() .
- "</th>
+ $this->msg( 'allmessagesdefault' )->escaped() .
+ "</th>
</tr>\n
<tr>
<th>" .
- $this->msg( 'allmessagescurrent' )->escaped() .
- "</th>
+ $this->msg( 'allmessagescurrent' )->escaped() .
+ "</th>
</tr></thead><tbody>\n";
}
function formatValue( $field, $value ) {
- switch( $field ) {
+ switch ( $field ) {
case 'am_title' :
$title = Title::makeTitle( NS_MEDIAWIKI, $value . $this->suffix );
$talk = Title::makeTitle( NS_MEDIAWIKI_TALK, $value . $this->suffix );
- if( $this->mCurrentRow->am_customised ) {
+ if ( $this->mCurrentRow->am_customised ) {
$title = Linker::linkKnown( $title, $this->getLanguage()->lcfirst( $value ) );
} else {
$title = Linker::link(
@@ -362,6 +368,7 @@ class AllmessagesTablePager extends TablePager {
array( 'broken' )
);
}
+
return $title . ' ' . $this->msg( 'parentheses' )->rawParams( $talk )->escaped();
case 'am_default' :
@@ -376,7 +383,7 @@ class AllmessagesTablePager extends TablePager {
$s = parent::formatRow( $row );
// But if there's a customised message, add that too.
- if( $row->am_customised ) {
+ if ( $row->am_customised ) {
$s .= Xml::openElement( 'tr', $this->getRowAttrs( $row, true ) );
$formatted = strval( $this->formatValue( 'am_actual', $row->am_actual ) );
if ( $formatted == '' ) {
@@ -385,24 +392,26 @@ class AllmessagesTablePager extends TablePager {
$s .= Xml::tags( 'td', $this->getCellAttrs( 'am_actual', $row->am_actual ), $formatted )
. "</tr>\n";
}
+
return $s;
}
function getRowAttrs( $row, $isSecond = false ) {
$arr = array();
- if( $row->am_customised ) {
+ if ( $row->am_customised ) {
$arr['class'] = 'allmessages-customised';
}
- if( !$isSecond ) {
+ if ( !$isSecond ) {
$arr['id'] = Sanitizer::escapeId( 'msg_' . $this->getLanguage()->lcfirst( $row->am_title ) );
}
+
return $arr;
}
function getCellAttrs( $field, $value ) {
- if( $this->mCurrentRow->am_customised && $field == 'am_title' ) {
+ if ( $this->mCurrentRow->am_customised && $field == 'am_title' ) {
return array( 'rowspan' => '2', 'class' => $field );
- } elseif( $field == 'am_title' ) {
+ } elseif ( $field == 'am_title' ) {
return array( 'class' => $field );
} else {
return array( 'lang' => $this->langcode, 'dir' => $this->lang->getDir(), 'class' => $field );
diff --git a/includes/specials/SpecialAllpages.php b/includes/specials/SpecialAllpages.php
index f9cb5cd8..a0820493 100644
--- a/includes/specials/SpecialAllpages.php
+++ b/includes/specials/SpecialAllpages.php
@@ -71,7 +71,6 @@ class SpecialAllpages extends IncludableSpecialPage {
* @param string $par becomes "FOO" when called like Special:Allpages/FOO (default NULL)
*/
function execute( $par ) {
- global $wgContLang;
$request = $this->getRequest();
$out = $this->getOutput();
@@ -85,18 +84,18 @@ class SpecialAllpages extends IncludableSpecialPage {
$namespace = $request->getInt( 'namespace' );
$hideredirects = $request->getBool( 'hideredirects', false );
- $namespaces = $wgContLang->getNamespaces();
+ $namespaces = $this->getContext()->getLanguage()->getNamespaces();
$out->setPageTitle(
- ( $namespace > 0 && in_array( $namespace, array_keys( $namespaces) ) ) ?
- $this->msg( 'allinnamespace', str_replace( '_', ' ', $namespaces[$namespace] ) ) :
- $this->msg( 'allarticles' )
+ ( $namespace > 0 && in_array( $namespace, array_keys( $namespaces ) ) ) ?
+ $this->msg( 'allinnamespace', str_replace( '_', ' ', $namespaces[$namespace] ) ) :
+ $this->msg( 'allarticles' )
);
$out->addModuleStyles( 'mediawiki.special' );
- if( $par !== null ) {
+ if ( $par !== null ) {
$this->showChunk( $namespace, $par, $to, $hideredirects );
- } elseif( $from !== null && $to === null ) {
+ } elseif ( $from !== null && $to === null ) {
$this->showChunk( $namespace, $from, $to, $hideredirects );
} else {
$this->showToplevel( $namespace, $from, $to, $hideredirects );
@@ -160,6 +159,7 @@ class SpecialAllpages extends IncludableSpecialPage {
$out .= Xml::closeElement( 'fieldset' );
$out .= Xml::closeElement( 'form' );
$out .= Xml::closeElement( 'div' );
+
return $out;
}
@@ -188,10 +188,13 @@ class SpecialAllpages extends IncludableSpecialPage {
$from = ( $from && $from->isLocal() ) ? $from->getDBkey() : null;
$to = ( $to && $to->isLocal() ) ? $to->getDBkey() : null;
- if( isset( $from ) )
+ if ( isset( $from ) ) {
$where[] = 'page_title >= ' . $dbr->addQuotes( $from );
- if( isset( $to ) )
+ }
+
+ if ( isset( $to ) ) {
$where[] = 'page_title <= ' . $dbr->addQuotes( $to );
+ }
global $wgMemc;
$key = wfMemcKey( 'allpages', 'ns', $namespace, sha1( $from ), sha1( $to ) );
@@ -201,7 +204,7 @@ class SpecialAllpages extends IncludableSpecialPage {
$maxPerSubpage = intval( $count / $this->maxLineCount );
$maxPerSubpage = max( $maxPerSubpage, $this->maxPerPage );
- if( !is_array( $lines ) ) {
+ if ( !is_array( $lines ) ) {
$options = array( 'LIMIT' => 1 );
$options['ORDER BY'] = 'page_title ASC';
$firstTitle = $dbr->selectField( 'page', 'page_title', $where, __METHOD__, $options );
@@ -210,7 +213,7 @@ class SpecialAllpages extends IncludableSpecialPage {
$lines = array( $firstTitle );
# If we are going to show n rows, we need n+1 queries to find the relevant titles.
$done = false;
- while( !$done ) {
+ while ( !$done ) {
// Fetch the last title of this chunk and the first of the next
$chunk = ( $lastTitle === false )
? array()
@@ -223,7 +226,7 @@ class SpecialAllpages extends IncludableSpecialPage {
);
$s = $dbr->fetchObject( $res );
- if( $s ) {
+ if ( $s ) {
array_push( $lines, $s->page_title );
} else {
// Final chunk, but ended prematurely. Go back and find the end.
@@ -233,8 +236,9 @@ class SpecialAllpages extends IncludableSpecialPage {
array_push( $lines, $endTitle );
$done = true;
}
+
$s = $res->fetchObject();
- if( $s ) {
+ if ( $s ) {
array_push( $lines, $s->page_title );
$lastTitle = $s->page_title;
} else {
@@ -249,18 +253,19 @@ class SpecialAllpages extends IncludableSpecialPage {
// If there are only two or less sections, don't even display them.
// Instead, display the first section directly.
- if( count( $lines ) <= 2 ) {
- if( !empty( $lines ) ) {
+ if ( count( $lines ) <= 2 ) {
+ if ( !empty( $lines ) ) {
$this->showChunk( $namespace, $from, $to, $hideredirects );
} else {
$output->addHTML( $this->namespaceForm( $namespace, $from, $to, $hideredirects ) );
}
+
return;
}
# At this point, $lines should contain an even number of elements.
$out .= Xml::openElement( 'table', array( 'class' => 'allpageslist' ) );
- while( count ( $lines ) > 0 ) {
+ while ( count( $lines ) > 0 ) {
$inpoint = array_shift( $lines );
$outpoint = array_shift( $lines );
$out .= $this->showline( $inpoint, $outpoint, $namespace, $hideredirects );
@@ -269,19 +274,19 @@ class SpecialAllpages extends IncludableSpecialPage {
$nsForm = $this->namespaceForm( $namespace, $from, $to, $hideredirects );
# Is there more?
- if( $this->including() ) {
+ if ( $this->including() ) {
$out2 = '';
} else {
- if( isset( $from ) || isset( $to ) ) {
- $out2 = Xml::openElement( 'table', array( 'class' => 'mw-allpages-table-form' ) ).
- '<tr>
+ if ( isset( $from ) || isset( $to ) ) {
+ $out2 = Xml::openElement( 'table', array( 'class' => 'mw-allpages-table-form' ) ) .
+ '<tr>
<td>' .
- $nsForm .
- '</td>
+ $nsForm .
+ '</td>
<td class="mw-allpages-nav">' .
- Linker::link( $this->getTitle(), $this->msg( 'allpages' )->escaped(),
- array(), array(), 'known' ) .
- "</td>
+ Linker::link( $this->getTitle(), $this->msg( 'allpages' )->escaped(),
+ array(), array(), 'known' ) .
+ "</td>
</tr>" .
Xml::closeElement( 'table' );
} else {
@@ -297,47 +302,56 @@ class SpecialAllpages extends IncludableSpecialPage {
* @param string $inpoint lower limit of pagenames
* @param string $outpoint upper limit of pagenames
* @param $namespace Integer (Default NS_MAIN)
- * @param bool $hideredirects dont show redirects (default FALSE)
+ * @param bool $hideRedirects don't show redirects. Default: false
* @return string
*/
- function showline( $inpoint, $outpoint, $namespace = NS_MAIN, $hideredirects ) {
+ function showline( $inpoint, $outpoint, $namespace = NS_MAIN, $hideRedirects = false ) {
+ // Use content language since page titles are considered to use content language
global $wgContLang;
- $inpointf = htmlspecialchars( str_replace( '_', ' ', $inpoint ) );
- $outpointf = htmlspecialchars( str_replace( '_', ' ', $outpoint ) );
+
+ $inpointf = str_replace( '_', ' ', $inpoint );
+ $outpointf = str_replace( '_', ' ', $outpoint );
+
// Don't let the length runaway
$inpointf = $wgContLang->truncate( $inpointf, $this->maxPageLength );
$outpointf = $wgContLang->truncate( $outpointf, $this->maxPageLength );
- $queryparams = $namespace ? "namespace=$namespace&" : '';
+ $queryParams = array(
+ 'from' => $inpoint,
+ 'to' => $outpoint,
+ );
- $queryhideredirects = array();
- if ( $hideredirects ) {
- $queryhideredirects['hideredirects'] = 1;
+ if ( $namespace ) {
+ $queryParams['namespace'] = $namespace;
+ }
+ if ( $hideRedirects ) {
+ $queryParams['hideredirects'] = 1;
}
- $special = $this->getTitle();
- $link = htmlspecialchars( $special->getLocalUrl( $queryparams . 'from=' . urlencode( $inpoint ) . '&to=' . urlencode( $outpoint ), $queryhideredirects ) );
+ $url = $this->getTitle()->getLocalURL( $queryParams );
+ $inlink = Html::element( 'a', array( 'href' => $url ), $inpointf );
+ $outlink = Html::element( 'a', array( 'href' => $url ), $outpointf );
$out = $this->msg( 'alphaindexline' )->rawParams(
- "<a href=\"$link\">$inpointf</a></td><td>",
- "</td><td><a href=\"$link\">$outpointf</a>"
+ "$inlink</td><td>",
+ "</td><td>$outlink"
)->escaped();
+
return '<tr><td class="mw-allpages-alphaindexline">' . $out . '</td></tr>';
}
/**
- * @param $namespace Integer (Default NS_MAIN)
+ * @param int $namespace 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 bool $hideredirects dont show redirects (default FALSE)
*/
function showChunk( $namespace = NS_MAIN, $from = false, $to = false, $hideredirects = false ) {
- global $wgContLang;
$output = $this->getOutput();
$fromList = $this->getNamespaceKeyAndText( $namespace, $from );
$toList = $this->getNamespaceKeyAndText( $namespace, $to );
- $namespaces = $wgContLang->getNamespaces();
+ $namespaces = $this->getContext()->getLanguage()->getNamespaces();
$n = 0;
if ( !$fromList || !$toList ) {
@@ -360,7 +374,7 @@ class SpecialAllpages extends IncludableSpecialPage {
$conds['page_is_redirect'] = 0;
}
- if( $toKey !== "" ) {
+ if ( $toKey !== "" ) {
$conds[] = 'page_title <= ' . $dbr->addQuotes( $toKey );
}
@@ -369,33 +383,36 @@ class SpecialAllpages extends IncludableSpecialPage {
$conds,
__METHOD__,
array(
- 'ORDER BY' => 'page_title',
- 'LIMIT' => $this->maxPerPage + 1,
+ 'ORDER BY' => 'page_title',
+ 'LIMIT' => $this->maxPerPage + 1,
'USE INDEX' => 'name_title',
)
);
- if( $res->numRows() > 0 ) {
+ if ( $res->numRows() > 0 ) {
$out = Xml::openElement( 'table', array( 'class' => 'mw-allpages-table-chunk' ) );
- while( ( $n < $this->maxPerPage ) && ( $s = $res->fetchObject() ) ) {
+ while ( ( $n < $this->maxPerPage ) && ( $s = $res->fetchObject() ) ) {
$t = Title::newFromRow( $s );
- if( $t ) {
+ if ( $t ) {
$link = ( $s->page_is_redirect ? '<div class="allpagesredirect">' : '' ) .
Linker::link( $t ) .
- ($s->page_is_redirect ? '</div>' : '' );
+ ( $s->page_is_redirect ? '</div>' : '' );
} else {
$link = '[[' . htmlspecialchars( $s->page_title ) . ']]';
}
- if( $n % 3 == 0 ) {
+
+ if ( $n % 3 == 0 ) {
$out .= '<tr>';
}
+
$out .= "<td style=\"width:33%\">$link</td>";
$n++;
- if( $n % 3 == 0 ) {
+ if ( $n % 3 == 0 ) {
$out .= "</tr>\n";
}
}
- if( ($n % 3) != 0 ) {
+
+ if ( ( $n % 3 ) != 0 ) {
$out .= "</tr>\n";
}
$out .= Xml::closeElement( 'table' );
@@ -407,7 +424,7 @@ class SpecialAllpages extends IncludableSpecialPage {
if ( $this->including() ) {
$out2 = '';
} else {
- if( $from == '' ) {
+ if ( $from == '' ) {
// First chunk; no previous link.
$prevTitle = null;
} else {
@@ -424,20 +441,20 @@ class SpecialAllpages extends IncludableSpecialPage {
);
# Get first title of previous complete chunk
- if( $dbr->numrows( $res_prev ) >= $this->maxPerPage ) {
+ if ( $dbr->numrows( $res_prev ) >= $this->maxPerPage ) {
$pt = $dbr->fetchObject( $res_prev );
$prevTitle = Title::makeTitle( $namespace, $pt->page_title );
} else {
# The previous chunk is not complete, need to link to the very first title
# available in the database
$options = array( 'LIMIT' => 1 );
- if ( ! $dbr->implicitOrderby() ) {
+ if ( !$dbr->implicitOrderby() ) {
$options['ORDER BY'] = 'page_title';
}
$reallyFirstPage_title = $dbr->selectField( 'page', 'page_title',
array( 'page_namespace' => $namespace ), __METHOD__, $options );
# Show the previous link if it s not the current requested chunk
- if( $from != $reallyFirstPage_title ) {
+ if ( $from != $reallyFirstPage_title ) {
$prevTitle = Title::makeTitle( $namespace, $reallyFirstPage_title );
} else {
$prevTitle = null;
@@ -448,23 +465,25 @@ class SpecialAllpages extends IncludableSpecialPage {
$self = $this->getTitle();
$nsForm = $this->namespaceForm( $namespace, $from, $to, $hideredirects );
- $out2 = Xml::openElement( 'table', array( 'class' => 'mw-allpages-table-form' ) ).
- '<tr>
+ $out2 = Xml::openElement( 'table', array( 'class' => 'mw-allpages-table-form' ) ) .
+ '<tr>
<td>' .
- $nsForm .
- '</td>
+ $nsForm .
+ '</td>
<td class="mw-allpages-nav">' .
- Linker::link( $self, $this->msg( 'allpages' )->escaped() );
+ Linker::link( $self, $this->msg( 'allpages' )->escaped() );
# Do we put a previous link ?
- if( isset( $prevTitle ) && $pt = $prevTitle->getText() ) {
+ if ( isset( $prevTitle ) && $pt = $prevTitle->getText() ) {
$query = array( 'from' => $prevTitle->getText() );
- if( $namespace )
+ if ( $namespace ) {
$query['namespace'] = $namespace;
+ }
- if( $hideredirects )
+ if ( $hideredirects ) {
$query['hideredirects'] = $hideredirects;
+ }
$prevLink = Linker::linkKnown(
$self,
@@ -475,16 +494,18 @@ class SpecialAllpages extends IncludableSpecialPage {
$out2 = $this->getLanguage()->pipeList( array( $out2, $prevLink ) );
}
- if( $n == $this->maxPerPage && $s = $res->fetchObject() ) {
+ if ( $n == $this->maxPerPage && $s = $res->fetchObject() ) {
# $s is the first link of the next chunk
$t = Title::makeTitle( $namespace, $s->page_title );
$query = array( 'from' => $t->getText() );
- if( $namespace )
+ if ( $namespace ) {
$query['namespace'] = $namespace;
+ }
- if( $hideredirects )
+ if ( $hideredirects ) {
$query['hideredirects'] = $hideredirects;
+ }
$nextLink = Linker::linkKnown(
$self,
@@ -500,17 +521,22 @@ class SpecialAllpages extends IncludableSpecialPage {
$output->addHTML( $out2 . $out );
$links = array();
- if ( isset( $prevLink ) ) $links[] = $prevLink;
- if ( isset( $nextLink ) ) $links[] = $nextLink;
+ if ( isset( $prevLink ) ) {
+ $links[] = $prevLink;
+ }
+
+ if ( isset( $nextLink ) ) {
+ $links[] = $nextLink;
+ }
if ( count( $links ) ) {
$output->addHTML(
Html::element( 'hr' ) .
- Html::rawElement( 'div', array( 'class' => 'mw-allpages-nav' ),
- $this->getLanguage()->pipeList( $links )
- ) );
+ Html::rawElement( 'div', array( 'class' => 'mw-allpages-nav' ),
+ $this->getLanguage()->pipeList( $links )
+ )
+ );
}
-
}
/**
@@ -519,8 +545,10 @@ class SpecialAllpages extends IncludableSpecialPage {
* @return array( int namespace, string dbkey, string pagename ) or NULL on error
*/
protected function getNamespaceKeyAndText( $ns, $text ) {
- if ( $text == '' )
- return array( $ns, '', '' ); # shortcut for common case
+ if ( $text == '' ) {
+ # shortcut for common case
+ return array( $ns, '', '' );
+ }
$t = Title::makeTitleSafe( $ns, $text );
if ( $t && $t->isLocal() ) {
diff --git a/includes/specials/SpecialAncientpages.php b/includes/specials/SpecialAncientpages.php
index b0f333c4..b0830327 100644
--- a/includes/specials/SpecialAncientpages.php
+++ b/includes/specials/SpecialAncientpages.php
@@ -43,12 +43,16 @@ class AncientPagesPage extends QueryPage {
function getQueryInfo() {
return array(
'tables' => array( 'page', 'revision' ),
- 'fields' => array( 'namespace' => 'page_namespace',
- 'title' => 'page_title',
- 'value' => 'rev_timestamp' ),
- 'conds' => array( 'page_namespace' => MWNamespace::getContentNamespaces(),
- 'page_is_redirect' => 0,
- 'page_latest=rev_id' )
+ 'fields' => array(
+ 'namespace' => 'page_namespace',
+ 'title' => 'page_title',
+ 'value' => 'rev_timestamp'
+ ),
+ 'conds' => array(
+ 'page_namespace' => MWNamespace::getContentNamespaces(),
+ 'page_is_redirect' => 0,
+ 'page_latest=rev_id'
+ )
);
}
@@ -60,6 +64,11 @@ class AncientPagesPage extends QueryPage {
return false;
}
+ /**
+ * @param Skin $skin
+ * @param object $result Result row
+ * @return string
+ */
function formatResult( $skin, $result ) {
global $wgContLang;
@@ -69,6 +78,7 @@ class AncientPagesPage extends QueryPage {
$title,
htmlspecialchars( $wgContLang->convert( $title->getPrefixedText() ) )
);
+
return $this->getLanguage()->specialList( $link, htmlspecialchars( $d ) );
}
diff --git a/includes/specials/SpecialBlankpage.php b/includes/specials/SpecialBlankpage.php
index bfa2f951..e61f12b9 100644
--- a/includes/specials/SpecialBlankpage.php
+++ b/includes/specials/SpecialBlankpage.php
@@ -31,6 +31,7 @@ class SpecialBlankpage extends UnlistedSpecialPage {
public function __construct() {
parent::__construct( 'Blankpage' );
}
+
public function execute( $par ) {
$this->setHeaders();
$this->getOutput()->addWikiMsg( 'intentionallyblankpage' );
diff --git a/includes/specials/SpecialBlock.php b/includes/specials/SpecialBlock.php
index 50fdbc26..3b73a374 100644
--- a/includes/specials/SpecialBlock.php
+++ b/includes/specials/SpecialBlock.php
@@ -110,10 +110,10 @@ class SpecialBlock extends FormSpecialPage {
$s = HTMLForm::formatErrors( $this->preErrors );
if ( $s ) {
$form->addHeaderText( Html::rawElement(
- 'div',
- array( 'class' => 'error' ),
- $s
- ) );
+ 'div',
+ array( 'class' => 'error' ),
+ $s
+ ) );
}
}
}
@@ -127,6 +127,8 @@ class SpecialBlock extends FormSpecialPage {
$user = $this->getUser();
+ $suggestedDurations = self::getSuggestedDurations();
+
$a = array(
'Target' => array(
'type' => 'text',
@@ -139,11 +141,11 @@ class SpecialBlock extends FormSpecialPage {
'validation-callback' => array( __CLASS__, 'validateTargetField' ),
),
'Expiry' => array(
- 'type' => !count( self::getSuggestedDurations() ) ? 'text' : 'selectorother',
+ 'type' => !count( $suggestedDurations ) ? 'text' : 'selectorother',
'label-message' => 'ipbexpiry',
'required' => true,
'tabindex' => '2',
- 'options' => self::getSuggestedDurations(),
+ 'options' => $suggestedDurations,
'other' => $this->msg( 'ipbother' )->text(),
'default' => $this->msg( 'ipb-default-expiry' )->inContentLanguage()->text(),
),
@@ -241,8 +243,7 @@ class SpecialBlock extends FormSpecialPage {
if ( $block instanceof Block && !$block->mAuto # The block exists and isn't an autoblock
&& ( $this->type != Block::TYPE_RANGE # The block isn't a rangeblock
|| $block->getTarget() == $this->target ) # or if it is, the range is what we're about to block
- )
- {
+ ) {
$fields['HardBlock']['default'] = $block->isHardblock();
$fields['CreateAccount']['default'] = $block->prevents( 'createaccount' );
$fields['AutoBlock']['default'] = $block->isAutoblocking();
@@ -445,6 +446,7 @@ class SpecialBlock extends FormSpecialPage {
} elseif ( IP::isIPAddress( $target ) ) {
return Title::makeTitleSafe( NS_USER, $target );
}
+
return null;
}
@@ -460,8 +462,8 @@ class SpecialBlock extends FormSpecialPage {
$i = 0;
$target = null;
- while( true ) {
- switch( $i++ ) {
+ while ( true ) {
+ switch ( $i++ ) {
case 0:
# The HTMLForm will check wpTarget first and only if it doesn't get
# a value use the default, which will be generated from the options
@@ -511,6 +513,7 @@ class SpecialBlock extends FormSpecialPage {
$status = self::validateTarget( $value, $form->getUser() );
if ( !$status->isOK() ) {
$errors = $status->getErrorsArray();
+
return call_user_func_array( array( $form, 'msg' ), $errors[0] );
} else {
return true;
@@ -528,6 +531,7 @@ class SpecialBlock extends FormSpecialPage {
public static function validateTarget( $value, User $user ) {
global $wgBlockCIDRLimit;
+ /** @var User $target */
list( $target, $type ) = self::getTargetAndType( $value );
$status = Status::newGood( $target );
@@ -606,6 +610,7 @@ class SpecialBlock extends FormSpecialPage {
# can come from it
$data['Confirm'] = !in_array( $data['Confirm'], array( '', '0', null, false ), true );
+ /** @var User $target */
list( $target, $type ) = self::getTargetAndType( $data['Target'] );
if ( $type == Block::TYPE_USER ) {
$user = $target;
@@ -620,8 +625,8 @@ class SpecialBlock extends FormSpecialPage {
# but $data['target'] gets overriden by (non-normalized) request variable
# from previous request.
if ( $target === $performer->getName() &&
- ( $data['PreviousTarget'] !== $target || !$data['Confirm'] ) )
- {
+ ( $data['PreviousTarget'] !== $target || !$data['Confirm'] )
+ ) {
return array( 'ipb-blockingself' );
}
} elseif ( $type == Block::TYPE_RANGE ) {
@@ -634,9 +639,9 @@ class SpecialBlock extends FormSpecialPage {
return array( 'badipaddress' );
}
- if ( ( strlen( $data['Expiry'] ) == 0) || ( strlen( $data['Expiry'] ) > 50 )
- || !self::parseExpiryInput( $data['Expiry'] ) )
- {
+ if ( ( strlen( $data['Expiry'] ) == 0 ) || ( strlen( $data['Expiry'] ) > 50 )
+ || !self::parseExpiryInput( $data['Expiry'] )
+ ) {
return array( 'ipb_expiry_invalid' );
}
@@ -703,9 +708,9 @@ class SpecialBlock extends FormSpecialPage {
$reblockNotAllowed = ( array_key_exists( 'Reblock', $data ) && !$data['Reblock'] );
# Show form unless the user is already aware of this...
- if( $blockNotConfirmed || $reblockNotAllowed ) {
+ if ( $blockNotConfirmed || $reblockNotAllowed ) {
return array( array( 'ipb_already_blocked', $block->getTarget() ) );
- # Otherwise, try to update the block...
+ # Otherwise, try to update the block...
} else {
# This returns direct blocks before autoblocks/rangeblocks, since we should
# be sure the user is blocked by now it should work for our purposes
@@ -748,7 +753,7 @@ class SpecialBlock extends FormSpecialPage {
# Can't watch a rangeblock
if ( $type != Block::TYPE_RANGE && $data['Watch'] ) {
- $performer->addWatch( Title::makeTitle( NS_USER, $target ) );
+ WatchAction::doWatch( Title::makeTitle( NS_USER, $target ), $performer, WatchedItem::IGNORE_USER_RIGHTS );
}
# Block constructor sanitizes certain block options on insert
@@ -767,7 +772,8 @@ class SpecialBlock extends FormSpecialPage {
$logaction,
Title::makeTitle( NS_USER, $target ),
$data['Reason'][0],
- $logParams
+ $logParams,
+ $performer
);
# Relate log ID to block IDs (bug 25763)
$blockIds = array_merge( array( $status['id'] ), $status['autoIds'] );
@@ -865,7 +871,7 @@ class SpecialBlock extends FormSpecialPage {
# User is trying to unblock themselves
if ( $performer->isAllowed( 'unblockself' ) ) {
return true;
- # User blocked themselves and is now trying to reverse it
+ # User blocked themselves and is now trying to reverse it
} elseif ( $performer->blockedBy() === $performer->getName() ) {
return true;
} else {
@@ -953,4 +959,5 @@ class SpecialBlock extends FormSpecialPage {
}
# BC @since 1.18
-class IPBlockForm extends SpecialBlock {}
+class IPBlockForm extends SpecialBlock {
+}
diff --git a/includes/specials/SpecialBlockList.php b/includes/specials/SpecialBlockList.php
index e10df4fe..f1992c0f 100644
--- a/includes/specials/SpecialBlockList.php
+++ b/includes/specials/SpecialBlockList.php
@@ -55,10 +55,11 @@ class SpecialBlockList extends SpecialPage {
$action = $request->getText( 'action' );
- if( $action == 'unblock' || $action == 'submit' && $request->wasPosted() ) {
+ if ( $action == 'unblock' || $action == 'submit' && $request->wasPosted() ) {
# B/C @since 1.18: Unblock interface is now at Special:Unblock
$title = SpecialPage::getTitleFor( 'Unblock', $this->target );
- $out->redirect( $title->getFullUrl() );
+ $out->redirect( $title->getFullURL() );
+
return;
}
@@ -95,7 +96,9 @@ class SpecialBlockList extends SpecialPage {
'default' => 50,
),
);
- $form = new HTMLForm( $fields, $this->getContext() );
+ $context = new DerivativeContext( $this->getContext() );
+ $context->setTitle( $this->getTitle() ); // Remove subpage
+ $form = new HTMLForm( $fields, $context );
$form->setMethod( 'get' );
$form->setWrapperLegendMsg( 'ipblocklist-legend' );
$form->setSubmitTextMsg( 'ipblocklist-submit' );
@@ -120,7 +123,7 @@ class SpecialBlockList extends SpecialPage {
if ( $this->target !== '' ) {
list( $target, $type ) = Block::parseTarget( $this->target );
- switch( $type ) {
+ switch ( $type ) {
case Block::TYPE_ID:
case Block::TYPE_AUTO:
$conds['ipb_id'] = $target;
@@ -141,23 +144,23 @@ class SpecialBlockList extends SpecialPage {
break;
case Block::TYPE_USER:
- $conds['ipb_address'] = (string)$this->target;
+ $conds['ipb_address'] = $target->getName();
$conds['ipb_auto'] = 0;
break;
}
}
# Apply filters
- if( in_array( 'userblocks', $this->options ) ) {
+ if ( in_array( 'userblocks', $this->options ) ) {
$conds['ipb_user'] = 0;
}
- if( in_array( 'tempblocks', $this->options ) ) {
+ if ( in_array( 'tempblocks', $this->options ) ) {
$conds['ipb_expiry'] = 'infinity';
}
- if( in_array( 'addressblocks', $this->options ) ) {
+ if ( in_array( 'addressblocks', $this->options ) ) {
$conds[] = "ipb_user != 0 OR ipb_range_end > ipb_range_start";
}
- if( in_array( 'rangeblocks', $this->options ) ) {
+ if ( in_array( 'rangeblocks', $this->options ) ) {
$conds[] = "ipb_range_end = ipb_range_start";
}
@@ -169,7 +172,7 @@ class SpecialBlockList extends SpecialPage {
# Show additional header for the local block only when other blocks exists.
# Not necessary in a standard installation without such extensions enabled
- if( count( $otherBlockLink ) ) {
+ if ( count( $otherBlockLink ) ) {
$out->addHTML(
Html::element( 'h2', array(), $this->msg( 'ipblocklist-localblock' )->text() ) . "\n"
);
@@ -179,18 +182,16 @@ class SpecialBlockList extends SpecialPage {
if ( $pager->getNumRows() ) {
$out->addHTML(
$pager->getNavigationBar() .
- $pager->getBody().
- $pager->getNavigationBar()
+ $pager->getBody() .
+ $pager->getNavigationBar()
);
-
} elseif ( $this->target ) {
$out->addWikiMsg( 'ipblocklist-no-results' );
-
} else {
$out->addWikiMsg( 'ipblocklist-empty' );
}
- if( count( $otherBlockLink ) ) {
+ if ( count( $otherBlockLink ) ) {
$out->addHTML(
Html::rawElement(
'h2',
@@ -199,7 +200,7 @@ class SpecialBlockList extends SpecialPage {
) . "\n"
);
$list = '';
- foreach( $otherBlockLink as $link ) {
+ foreach ( $otherBlockLink as $link ) {
$list .= Html::rawElement( 'li', array(), $link ) . "\n";
}
$out->addHTML( Html::rawElement( 'ul', array( 'class' => 'mw-ipblocklist-otherblocks' ), $list ) . "\n" );
@@ -238,7 +239,7 @@ class BlockListPager extends TablePager {
'ipb_params' => 'blocklist-params',
'ipb_reason' => 'blocklist-reason',
);
- foreach( $headers as $key => $val ) {
+ foreach ( $headers as $key => $val ) {
$headers[$key] = $this->msg( $val )->text();
}
}
@@ -267,17 +268,17 @@ class BlockListPager extends TablePager {
$formatted = '';
- switch( $name ) {
+ switch ( $name ) {
case 'ipb_timestamp':
$formatted = $this->getLanguage()->userTimeAndDate( $value, $this->getUser() );
break;
case 'ipb_target':
- if( $row->ipb_auto ) {
+ if ( $row->ipb_auto ) {
$formatted = $this->msg( 'autoblockid', $row->ipb_id )->parse();
} else {
list( $target, $type ) = Block::parseTarget( $row->ipb_address );
- switch( $type ) {
+ switch ( $type ) {
case Block::TYPE_USER:
case Block::TYPE_IP:
$formatted = Linker::userLink( $target->getId(), $target );
@@ -295,9 +296,9 @@ class BlockListPager extends TablePager {
break;
case 'ipb_expiry':
- $formatted = $this->getLanguage()->formatExpiry( $value, /* User preference timezone */ true );
- if( $this->getUser()->isAllowed( 'block' ) ) {
- if( $row->ipb_auto ) {
+ $formatted = $this->getLanguage()->formatExpiry( $value, /* User preference timezone */true );
+ if ( $this->getUser()->isAllowed( 'block' ) ) {
+ if ( $row->ipb_auto ) {
$links[] = Linker::linkKnown(
SpecialPage::getTitleFor( 'Unblock' ),
$msg['unblocklink'],
@@ -420,7 +421,7 @@ class BlockListPager extends TablePager {
/**
* Do a LinkBatch query to minimise database load when generating all these links
- * @param $result
+ * @param ResultWrapper $result
*/
function preprocessResults( $result ) {
wfProfileIn( __METHOD__ );
@@ -441,7 +442,7 @@ class BlockListPager extends TablePager {
}
$ua = UserArray::newFromIDs( $userids );
- foreach( $ua as $user ) {
+ foreach ( $ua as $user ) {
$name = str_replace( ' ', '_', $user->getName() );
$lb->add( NS_USER, $name );
$lb->add( NS_USER_TALK, $name );
@@ -482,5 +483,4 @@ class HTMLBlockedUsersItemSelect extends HTMLSelectField {
return true;
}
-
}
diff --git a/includes/specials/SpecialBlockme.php b/includes/specials/SpecialBlockme.php
deleted file mode 100644
index 85a3019e..00000000
--- a/includes/specials/SpecialBlockme.php
+++ /dev/null
@@ -1,66 +0,0 @@
-<?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 proxyCheck.php to block open proxies
- *
- * @ingroup SpecialPage
- */
-class SpecialBlockme extends UnlistedSpecialPage {
-
- function __construct() {
- parent::__construct( 'Blockme' );
- }
-
- function execute( $par ) {
- global $wgBlockOpenProxies, $wgProxyKey;
-
- $this->setHeaders();
- $this->outputHeader();
-
- $ip = $this->getRequest()->getIP();
- if( !$wgBlockOpenProxies || $this->getRequest()->getText( 'ip' ) != md5( $ip . $wgProxyKey ) ) {
- $this->getOutput()->addWikiMsg( 'proxyblocker-disabled' );
- return;
- }
-
- $user = User::newFromName( $this->msg( 'proxyblocker' )->inContentLanguage()->text() );
- # FIXME: newFromName could return false on a badly configured wiki.
- if ( !$user->isLoggedIn() ) {
- $user->addToDatabase();
- }
-
- $block = new Block();
- $block->setTarget( $ip );
- $block->setBlocker( $user );
- $block->mReason = $this->msg( 'proxyblockreason' )->inContentLanguage()->text();
-
- $block->insert();
-
- $this->getOutput()->addWikiMsg( 'proxyblocksuccess' );
- }
-
- protected function getGroupName() {
- return 'other';
- }
-}
diff --git a/includes/specials/SpecialBooksources.php b/includes/specials/SpecialBooksources.php
index bdbd77b8..5ad961c3 100644
--- a/includes/specials/SpecialBooksources.php
+++ b/includes/specials/SpecialBooksources.php
@@ -53,8 +53,8 @@ class SpecialBookSources extends SpecialPage {
$this->outputHeader();
$this->isbn = self::cleanIsbn( $isbn ? $isbn : $this->getRequest()->getText( 'isbn' ) );
$this->getOutput()->addHTML( $this->makeForm() );
- if( strlen( $this->isbn ) > 0 ) {
- if( !self::isValidISBN( $this->isbn ) ) {
+ if ( strlen( $this->isbn ) > 0 ) {
+ if ( !self::isValidISBN( $this->isbn ) ) {
$this->getOutput()->wrapWikiMsg( "<div class=\"error\">\n$1\n</div>", 'booksources-invalid-isbn' );
}
$this->showList();
@@ -69,32 +69,33 @@ class SpecialBookSources extends SpecialPage {
public static function isValidISBN( $isbn ) {
$isbn = self::cleanIsbn( $isbn );
$sum = 0;
- if( strlen( $isbn ) == 13 ) {
- for( $i = 0; $i < 12; $i++ ) {
- if( $i % 2 == 0 ) {
+ if ( strlen( $isbn ) == 13 ) {
+ for ( $i = 0; $i < 12; $i++ ) {
+ if ( $i % 2 == 0 ) {
$sum += $isbn[$i];
} else {
$sum += 3 * $isbn[$i];
}
}
- $check = (10 - ($sum % 10)) % 10;
+ $check = ( 10 - ( $sum % 10 ) ) % 10;
if ( $check == $isbn[12] ) {
return true;
}
- } elseif( strlen( $isbn ) == 10 ) {
- for( $i = 0; $i < 9; $i++ ) {
- $sum += $isbn[$i] * ($i + 1);
+ } elseif ( strlen( $isbn ) == 10 ) {
+ for ( $i = 0; $i < 9; $i++ ) {
+ $sum += $isbn[$i] * ( $i + 1 );
}
$check = $sum % 11;
- if( $check == 10 ) {
+ if ( $check == 10 ) {
$check = "X";
}
- if( $check == $isbn[9] ) {
+ if ( $check == $isbn[9] ) {
return true;
}
}
+
return false;
}
@@ -116,13 +117,14 @@ class SpecialBookSources extends SpecialPage {
private function makeForm() {
global $wgScript;
- $form = '<fieldset><legend>' . $this->msg( 'booksources-search-legend' )->escaped() . '</legend>';
- $form .= Xml::openElement( 'form', array( 'method' => 'get', 'action' => $wgScript ) );
- $form .= Html::hidden( 'title', $this->getTitle()->getPrefixedText() );
- $form .= '<p>' . Xml::inputLabel( $this->msg( 'booksources-isbn' )->text(), 'isbn', 'isbn', 20, $this->isbn );
- $form .= '&#160;' . Xml::submitButton( $this->msg( 'booksources-go' )->text() ) . '</p>';
- $form .= Xml::closeElement( 'form' );
- $form .= '</fieldset>';
+ $form = Html::openElement( 'fieldset' ) . "\n";
+ $form .= Html::element( 'legend', array(), $this->msg( 'booksources-search-legend' )->text() ) . "\n";
+ $form .= Html::openElement( 'form', array( 'method' => 'get', 'action' => $wgScript ) ) . "\n";
+ $form .= Html::hidden( 'title', $this->getTitle()->getPrefixedText() ) . "\n";
+ $form .= '<p>' . Xml::inputLabel( $this->msg( 'booksources-isbn' )->text(), 'isbn', 'isbn', 20, $this->isbn, array( 'autofocus' => true ) );
+ $form .= '&#160;' . Xml::submitButton( $this->msg( 'booksources-go' )->text() ) . "</p>\n";
+ $form .= Html::closeElement( 'form' ) . "\n";
+ $form .= Html::closeElement( 'fieldset' ) . "\n";
return $form;
}
@@ -143,7 +145,7 @@ class SpecialBookSources extends SpecialPage {
# Check for a local page such as Project:Book_sources and use that if available
$page = $this->msg( 'booksources' )->inContentLanguage()->text();
$title = Title::makeTitleSafe( NS_PROJECT, $page ); # Show list in content language
- if( is_object( $title ) && $title->exists() ) {
+ if ( is_object( $title ) && $title->exists() ) {
$rev = Revision::newFromTitle( $title, false, Revision::READ_NORMAL );
$content = $rev->getContent();
@@ -152,6 +154,7 @@ class SpecialBookSources extends SpecialPage {
$text = $content->getNativeData();
$this->getOutput()->addWikiText( str_replace( 'MAGICNUMBER', $this->isbn, $text ) );
+
return true;
} else {
throw new MWException( "Unexpected content type for book sources: " . $content->getModel() );
@@ -162,9 +165,11 @@ class SpecialBookSources extends SpecialPage {
$this->getOutput()->addWikiMsg( 'booksources-text' );
$this->getOutput()->addHTML( '<ul>' );
$items = $wgContLang->getBookstoreList();
- foreach( $items as $label => $url )
+ foreach ( $items as $label => $url ) {
$this->getOutput()->addHTML( $this->makeListItem( $label, $url ) );
+ }
$this->getOutput()->addHTML( '</ul>' );
+
return true;
}
@@ -177,7 +182,9 @@ class SpecialBookSources extends SpecialPage {
*/
private function makeListItem( $label, $url ) {
$url = str_replace( '$1', $this->isbn, $url );
- return '<li><a href="' . htmlspecialchars( $url ) . '" class="external">' . htmlspecialchars( $label ) . '</a></li>';
+
+ return Html::rawElement( 'li', array(),
+ Html::element( 'a', array( 'href' => $url, 'class' => 'external' ), $label ) );
}
protected function getGroupName() {
diff --git a/includes/specials/SpecialBrokenRedirects.php b/includes/specials/SpecialBrokenRedirects.php
index fac41236..b2ddc220 100644
--- a/includes/specials/SpecialBrokenRedirects.php
+++ b/includes/specials/SpecialBrokenRedirects.php
@@ -51,6 +51,7 @@ class BrokenRedirectsPage extends QueryPage {
function getQueryInfo() {
$dbr = wfGetDB( DB_SLAVE );
+
return array(
'tables' => array(
'redirect',
@@ -88,13 +89,13 @@ class BrokenRedirectsPage extends QueryPage {
* @return array
*/
function getOrderFields() {
- return array ( 'rd_namespace', 'rd_title', 'rd_from' );
+ return array( 'rd_namespace', 'rd_title', 'rd_from' );
}
/**
- * @param $skin Skin
- * @param $result
- * @return String
+ * @param Skin $skin
+ * @param object $result Result row
+ * @return string
*/
function formatResult( $skin, $result ) {
$fromObj = Title::makeTitle( $result->namespace, $result->title );
@@ -138,7 +139,7 @@ class BrokenRedirectsPage extends QueryPage {
$out = $from . $this->msg( 'word-separator' )->escaped();
- if( $this->getUser()->isAllowed( 'delete' ) ) {
+ if ( $this->getUser()->isAllowed( 'delete' ) ) {
$links[] = Linker::linkKnown(
$fromObj,
$this->msg( 'brokenredirects-delete' )->escaped(),
@@ -149,6 +150,7 @@ class BrokenRedirectsPage extends QueryPage {
$out .= $this->msg( 'parentheses' )->rawParams( $this->getLanguage()->pipeList( $links ) )->escaped();
$out .= " {$arr} {$to}";
+
return $out;
}
diff --git a/includes/specials/SpecialCachedPage.php b/includes/specials/SpecialCachedPage.php
index ddd11ad0..39305f01 100644
--- a/includes/specials/SpecialCachedPage.php
+++ b/includes/specials/SpecialCachedPage.php
@@ -194,5 +194,4 @@ abstract class SpecialCachedPage extends SpecialPage implements ICacheHelper {
$this->getOutput()->setSubtitle( $this->cacheHelper->getCachedNotice( $this->getContext() ) );
}
}
-
}
diff --git a/includes/specials/SpecialCategories.php b/includes/specials/SpecialCategories.php
index 9040c640..d01bfd7d 100644
--- a/includes/specials/SpecialCategories.php
+++ b/includes/specials/SpecialCategories.php
@@ -42,12 +42,12 @@ class SpecialCategories extends SpecialPage {
$this->getOutput()->addHTML(
Html::openElement( 'div', array( 'class' => 'mw-spcontent' ) ) .
- $this->msg( 'categoriespagetext', $cap->getNumRows() )->parseAsBlock() .
- $cap->getStartForm( $from ) .
- $cap->getNavigationBar() .
- '<ul>' . $cap->getBody() . '</ul>' .
- $cap->getNavigationBar() .
- Html::closeElement( 'div' )
+ $this->msg( 'categoriespagetext', $cap->getNumRows() )->parseAsBlock() .
+ $cap->getStartForm( $from ) .
+ $cap->getNavigationBar() .
+ '<ul>' . $cap->getBody() . '</ul>' .
+ $cap->getNavigationBar() .
+ Html::closeElement( 'div' )
);
}
@@ -66,7 +66,7 @@ class CategoryPager extends AlphabeticPager {
function __construct( IContextSource $context, $from ) {
parent::__construct( $context );
$from = str_replace( ' ', '_', $from );
- if( $from !== '' ) {
+ if ( $from !== '' ) {
$from = Title::capitalize( $from, NS_CATEGORY );
$this->setOffset( $from );
$this->setIncludeOffset( true );
@@ -90,8 +90,10 @@ class CategoryPager extends AlphabeticPager {
function getDefaultQuery() {
parent::getDefaultQuery();
unset( $this->mDefaultQuery['from'] );
+
return $this->mDefaultQuery;
}
+
# protected function getOrderTypeMessages() {
# return array( 'abc' => 'special-categories-sort-abc',
# 'count' => 'special-categories-sort-count' );
@@ -113,6 +115,7 @@ class CategoryPager extends AlphabeticPager {
}
$batch->execute();
$this->mResult->rewind();
+
return parent::getBody();
}
@@ -120,19 +123,26 @@ class CategoryPager extends AlphabeticPager {
$title = Title::makeTitle( NS_CATEGORY, $result->cat_title );
$titleText = Linker::link( $title, htmlspecialchars( $title->getText() ) );
$count = $this->msg( 'nmembers' )->numParams( $result->cat_pages )->escaped();
+
return Xml::tags( 'li', null, $this->getLanguage()->specialList( $titleText, $count ) ) . "\n";
}
public function getStartForm( $from ) {
global $wgScript;
- return
- Xml::tags( 'form', array( 'method' => 'get', 'action' => $wgScript ),
- Html::hidden( 'title', $this->getTitle()->getPrefixedText() ) .
- Xml::fieldset( $this->msg( 'categories' )->text(),
- Xml::inputLabel( $this->msg( 'categoriesfrom' )->text(),
+ return Xml::tags(
+ 'form',
+ array( 'method' => 'get', 'action' => $wgScript ),
+ Html::hidden( 'title', $this->getTitle()->getPrefixedText() ) .
+ Xml::fieldset(
+ $this->msg( 'categories' )->text(),
+ Xml::inputLabel(
+ $this->msg( 'categoriesfrom' )->text(),
'from', 'from', 20, $from ) .
- ' ' .
- Xml::submitButton( $this->msg( 'allpagessubmit' )->text() ) ) );
+ ' ' .
+ Xml::submitButton( $this->msg( 'allpagessubmit' )->text()
+ )
+ )
+ );
}
}
diff --git a/includes/specials/SpecialChangeEmail.php b/includes/specials/SpecialChangeEmail.php
index 59a02578..aab839fd 100644
--- a/includes/specials/SpecialChangeEmail.php
+++ b/includes/specials/SpecialChangeEmail.php
@@ -41,7 +41,7 @@ class SpecialChangeEmail extends UnlistedSpecialPage {
protected $mNewEmail;
public function __construct() {
- parent::__construct( 'ChangeEmail' );
+ parent::__construct( 'ChangeEmail', 'editmyprivateinfo' );
}
/**
@@ -49,6 +49,7 @@ class SpecialChangeEmail extends UnlistedSpecialPage {
*/
function isListed() {
global $wgAuth;
+
return $wgAuth->allowPropChange( 'emailaddress' );
}
@@ -67,6 +68,7 @@ class SpecialChangeEmail extends UnlistedSpecialPage {
if ( !$wgAuth->allowPropChange( 'emailaddress' ) ) {
$this->error( 'cannotchangeemail' );
+
return;
}
@@ -75,22 +77,31 @@ class SpecialChangeEmail extends UnlistedSpecialPage {
if ( !$request->wasPosted() && !$user->isLoggedIn() ) {
$this->error( 'changeemail-no-info' );
+
return;
}
if ( $request->wasPosted() && $request->getBool( 'wpCancel' ) ) {
$this->doReturnTo();
+
return;
}
$this->checkReadOnly();
+ $this->checkPermissions();
+
+ // This could also let someone check the current email address, so
+ // require both permissions.
+ if ( !$this->getUser()->isAllowed( 'viewmyprivateinfo' ) ) {
+ throw new PermissionsError( 'viewmyprivateinfo' );
+ }
$this->mPassword = $request->getVal( 'wpPassword' );
$this->mNewEmail = $request->getVal( 'wpNewEmail' );
if ( $request->wasPosted()
- && $user->matchEditToken( $request->getVal( 'token' ) ) )
- {
+ && $user->matchEditToken( $request->getVal( 'token' ) )
+ ) {
$info = $this->attemptChange( $user, $this->mPassword, $this->mNewEmail );
if ( $info === true ) {
$this->doReturnTo();
@@ -138,15 +149,15 @@ class SpecialChangeEmail extends UnlistedSpecialPage {
$this->getOutput()->addHTML(
Xml::fieldset( $this->msg( 'changeemail-header' )->text() ) .
- Xml::openElement( 'form',
- array(
- 'method' => 'post',
- 'action' => $this->getTitle()->getLocalUrl(),
- 'id' => 'mw-changeemail-form' ) ) . "\n" .
- Html::hidden( 'token', $user->getEditToken() ) . "\n" .
- Html::hidden( 'returnto', $this->getRequest()->getVal( 'returnto' ) ) . "\n" .
- $this->msg( 'changeemail-text' )->parseAsBlock() . "\n" .
- Xml::openElement( 'table', array( 'id' => 'mw-changeemail-table' ) ) . "\n"
+ Xml::openElement( 'form',
+ array(
+ 'method' => 'post',
+ 'action' => $this->getTitle()->getLocalURL(),
+ 'id' => 'mw-changeemail-form' ) ) . "\n" .
+ Html::hidden( 'token', $user->getEditToken() ) . "\n" .
+ Html::hidden( 'returnto', $this->getRequest()->getVal( 'returnto' ) ) . "\n" .
+ $this->msg( 'changeemail-text' )->parseAsBlock() . "\n" .
+ Xml::openElement( 'table', array( 'id' => 'mw-changeemail-table' ) ) . "\n"
);
$items = array(
array( 'wpName', 'username', 'text', $user->getName() ),
@@ -159,17 +170,17 @@ class SpecialChangeEmail extends UnlistedSpecialPage {
$this->getOutput()->addHTML(
$this->pretty( $items ) .
- "\n" .
- "<tr>\n" .
+ "\n" .
+ "<tr>\n" .
"<td></td>\n" .
'<td class="mw-input">' .
- Xml::submitButton( $this->msg( 'changeemail-submit' )->text() ) .
- Xml::submitButton( $this->msg( 'changeemail-cancel' )->text(), array( 'name' => 'wpCancel' ) ) .
+ Xml::submitButton( $this->msg( 'changeemail-submit' )->text() ) .
+ Xml::submitButton( $this->msg( 'changeemail-cancel' )->text(), array( 'name' => 'wpCancel' ) ) .
"</td>\n" .
- "</tr>\n" .
- Xml::closeElement( 'table' ) .
- Xml::closeElement( 'form' ) .
- Xml::closeElement( 'fieldset' ) . "\n"
+ "</tr>\n" .
+ Xml::closeElement( 'table' ) .
+ Xml::closeElement( 'form' ) .
+ Xml::closeElement( 'fieldset' ) . "\n"
);
}
@@ -181,7 +192,7 @@ class SpecialChangeEmail extends UnlistedSpecialPage {
$out = '';
foreach ( $fields as $list ) {
list( $name, $label, $type, $value ) = $list;
- if( $type == 'text' ) {
+ if ( $type == 'text' ) {
$field = htmlspecialchars( $value );
} else {
$attribs = array( 'id' => $name );
@@ -203,6 +214,7 @@ class SpecialChangeEmail extends UnlistedSpecialPage {
$out .= "</td>\n";
$out .= "</tr>";
}
+
return $out;
}
@@ -213,22 +225,26 @@ class SpecialChangeEmail extends UnlistedSpecialPage {
* @return bool|string true or string on success, false on failure
*/
protected function attemptChange( User $user, $pass, $newaddr ) {
- global $wgAuth;
+ global $wgAuth, $wgPasswordAttemptThrottle;
if ( $newaddr != '' && !Sanitizer::validateEmail( $newaddr ) ) {
$this->error( 'invalidemailaddress' );
+
return false;
}
$throttleCount = LoginForm::incLoginThrottle( $user->getName() );
if ( $throttleCount === true ) {
- $this->error( 'login-throttled' );
+ $lang = $this->getLanguage();
+ $this->error( array( 'login-throttled', $lang->formatDuration( $wgPasswordAttemptThrottle['seconds'] ) ) );
+
return false;
}
global $wgRequirePasswordforEmailChange;
if ( $wgRequirePasswordforEmailChange && !$user->checkTemporaryPassword( $pass ) && !$user->checkPassword( $pass ) ) {
$this->error( 'wrongpassword' );
+
return false;
}
@@ -241,8 +257,9 @@ class SpecialChangeEmail extends UnlistedSpecialPage {
if ( !$status->isGood() ) {
$this->getOutput()->addHTML(
'<p class="error">' .
- $this->getOutput()->parseInline( $status->getWikiText( 'mailerror' ) ) .
- '</p>' );
+ $this->getOutput()->parseInline( $status->getWikiText( 'mailerror' ) ) .
+ '</p>' );
+
return false;
}
diff --git a/includes/specials/SpecialChangePassword.php b/includes/specials/SpecialChangePassword.php
index e538caca..c54b5575 100644
--- a/includes/specials/SpecialChangePassword.php
+++ b/includes/specials/SpecialChangePassword.php
@@ -31,7 +31,7 @@ class SpecialChangePassword extends UnlistedSpecialPage {
protected $mUserName, $mOldpass, $mNewpass, $mRetype, $mDomain;
public function __construct() {
- parent::__construct( 'ChangePassword' );
+ parent::__construct( 'ChangePassword', 'editmyprivateinfo' );
}
/**
@@ -52,62 +52,66 @@ class SpecialChangePassword extends UnlistedSpecialPage {
$this->mDomain = $request->getVal( 'wpDomain' );
$user = $this->getUser();
- if( !$request->wasPosted() && !$user->isLoggedIn() ) {
+ if ( !$request->wasPosted() && !$user->isLoggedIn() ) {
$this->error( $this->msg( 'resetpass-no-info' )->text() );
+
return;
}
- if( $request->wasPosted() && $request->getBool( 'wpCancel' ) ) {
- $this->doReturnTo();
+ if ( $request->wasPosted() && $request->getBool( 'wpCancel' ) ) {
+ $titleObj = Title::newFromText( $request->getVal( 'returnto' ) );
+ if ( !$titleObj instanceof Title ) {
+ $titleObj = Title::newMainPage();
+ }
+ $query = $request->getVal( 'returntoquery' );
+ $this->getOutput()->redirect( $titleObj->getFullURL( $query ) );
+
return;
}
$this->checkReadOnly();
+ $this->checkPermissions();
- if( $request->wasPosted() && $user->matchEditToken( $request->getVal( 'token' ) ) ) {
+ if ( $request->wasPosted() && $user->matchEditToken( $request->getVal( 'token' ) ) ) {
try {
$this->mDomain = $wgAuth->getDomain();
- if( !$wgAuth->allowPasswordChange() ) {
+ if ( !$wgAuth->allowPasswordChange() ) {
$this->error( $this->msg( 'resetpass_forbidden' )->text() );
+
return;
}
$this->attemptReset( $this->mNewpass, $this->mRetype );
- if( $user->isLoggedIn() ) {
- $this->doReturnTo();
+ if ( $user->isLoggedIn() ) {
+ $this->getOutput()->wrapWikiMsg(
+ "<div class=\"successbox\">\n$1\n</div>",
+ 'changepassword-success'
+ );
+ $this->getOutput()->returnToMain();
} else {
LoginForm::setLoginToken();
$token = LoginForm::getLoginToken();
$data = array(
- 'action' => 'submitlogin',
- 'wpName' => $this->mUserName,
- 'wpDomain' => $this->mDomain,
+ 'action' => 'submitlogin',
+ 'wpName' => $this->mUserName,
+ 'wpDomain' => $this->mDomain,
'wpLoginToken' => $token,
- 'wpPassword' => $request->getVal( 'wpNewPassword' ),
+ 'wpPassword' => $request->getVal( 'wpNewPassword' ),
) + $request->getValues( 'wpRemember', 'returnto', 'returntoquery' );
- $login = new LoginForm( new FauxRequest( $data, true ) );
+ $login = new LoginForm( new DerivativeRequest( $request, $data, true ) );
$login->setContext( $this->getContext() );
$login->execute( null );
}
+
return;
- } catch( PasswordError $e ) {
+ } catch ( PasswordError $e ) {
$this->error( $e->getMessage() );
}
}
$this->showForm();
}
- function doReturnTo() {
- $request = $this->getRequest();
- $titleObj = Title::newFromText( $request->getVal( 'returnto' ) );
- if ( !$titleObj instanceof Title ) {
- $titleObj = Title::newMainPage();
- }
- $query = $request->getVal( 'returntoquery' );
- $this->getOutput()->redirect( $titleObj->getFullURL( $query ) );
- }
-
/**
* @param $msg string
*/
@@ -127,12 +131,12 @@ class SpecialChangePassword extends UnlistedSpecialPage {
$rememberMe = '<tr>' .
'<td></td>' .
'<td class="mw-input">' .
- Xml::checkLabel(
- $this->msg( 'remembermypassword' )->numParams( ceil( $wgCookieExpiration / ( 3600 * 24 ) ) )->text(),
- 'wpRemember', 'wpRemember',
- $this->getRequest()->getCheck( 'wpRemember' ) ) .
+ Xml::checkLabel(
+ $this->msg( 'remembermypassword' )->numParams( ceil( $wgCookieExpiration / ( 3600 * 24 ) ) )->text(),
+ 'wpRemember', 'wpRemember',
+ $this->getRequest()->getCheck( 'wpRemember' ) ) .
'</td>' .
- '</tr>';
+ '</tr>';
$submitMsg = 'resetpass_submit';
$oldpassMsg = 'resetpass-temp-password';
} else {
@@ -142,11 +146,11 @@ class SpecialChangePassword extends UnlistedSpecialPage {
$extraFields = array();
wfRunHooks( 'ChangePasswordForm', array( &$extraFields ) );
$prettyFields = array(
- array( 'wpName', 'username', 'text', $this->mUserName ),
- array( 'wpPassword', $oldpassMsg, 'password', $this->mOldpass ),
- array( 'wpNewPassword', 'newpassword', 'password', null ),
- array( 'wpRetype', 'retypenew', 'password', null ),
- );
+ array( 'wpName', 'username', 'text', $this->mUserName ),
+ array( 'wpPassword', $oldpassMsg, 'password', $this->mOldpass ),
+ array( 'wpNewPassword', 'newpassword', 'password', null ),
+ array( 'wpRetype', 'retypenew', 'password', null ),
+ );
$prettyFields = array_merge( $prettyFields, $extraFields );
$hiddenFields = array(
'token' => $user->getEditToken(),
@@ -154,31 +158,31 @@ class SpecialChangePassword extends UnlistedSpecialPage {
'wpDomain' => $this->mDomain,
) + $this->getRequest()->getValues( 'returnto', 'returntoquery' );
$hiddenFieldsStr = '';
- foreach( $hiddenFields as $fieldname => $fieldvalue ) {
+ foreach ( $hiddenFields as $fieldname => $fieldvalue ) {
$hiddenFieldsStr .= Html::hidden( $fieldname, $fieldvalue ) . "\n";
}
$this->getOutput()->addHTML(
Xml::fieldset( $this->msg( 'resetpass_header' )->text() ) .
- Xml::openElement( 'form',
- array(
- 'method' => 'post',
- 'action' => $this->getTitle()->getLocalUrl(),
- 'id' => 'mw-resetpass-form' ) ) . "\n" .
- $hiddenFieldsStr .
- $this->msg( 'resetpass_text' )->parseAsBlock() . "\n" .
- Xml::openElement( 'table', array( 'id' => 'mw-resetpass-table' ) ) . "\n" .
- $this->pretty( $prettyFields ) . "\n" .
- $rememberMe .
- "<tr>\n" .
+ Xml::openElement( 'form',
+ array(
+ 'method' => 'post',
+ 'action' => $this->getTitle()->getLocalURL(),
+ 'id' => 'mw-resetpass-form' ) ) . "\n" .
+ $hiddenFieldsStr .
+ $this->msg( 'resetpass_text' )->parseAsBlock() . "\n" .
+ Xml::openElement( 'table', array( 'id' => 'mw-resetpass-table' ) ) . "\n" .
+ $this->pretty( $prettyFields ) . "\n" .
+ $rememberMe .
+ "<tr>\n" .
"<td></td>\n" .
'<td class="mw-input">' .
- Xml::submitButton( $this->msg( $submitMsg )->text() ) .
- Xml::submitButton( $this->msg( 'resetpass-submit-cancel' )->text(), array( 'name' => 'wpCancel' ) ) .
+ Xml::submitButton( $this->msg( $submitMsg )->text() ) .
+ Xml::submitButton( $this->msg( 'resetpass-submit-cancel' )->text(), array( 'name' => 'wpCancel' ) ) .
"</td>\n" .
- "</tr>\n" .
- Xml::closeElement( 'table' ) .
- Xml::closeElement( 'form' ) .
- Xml::closeElement( 'fieldset' ) . "\n"
+ "</tr>\n" .
+ Xml::closeElement( 'table' ) .
+ Xml::closeElement( 'form' ) .
+ Xml::closeElement( 'fieldset' ) . "\n"
);
}
@@ -190,7 +194,7 @@ class SpecialChangePassword extends UnlistedSpecialPage {
$out = '';
foreach ( $fields as $list ) {
list( $name, $label, $type, $value ) = $list;
- if( $type == 'text' ) {
+ if ( $type == 'text' ) {
$field = htmlspecialchars( $value );
} else {
$attribs = array( 'id' => $name );
@@ -205,16 +209,20 @@ class SpecialChangePassword extends UnlistedSpecialPage {
}
$out .= "<tr>\n";
$out .= "\t<td class='mw-label'>";
- if ( $type != 'text' )
+
+ if ( $type != 'text' ) {
$out .= Xml::label( $this->msg( $label )->text(), $name );
- else
+ } else {
$out .= $this->msg( $label )->escaped();
+ }
+
$out .= "</td>\n";
$out .= "\t<td class='mw-input'>";
$out .= $field;
$out .= "</td>\n";
$out .= "</tr>";
}
+
return $out;
}
@@ -222,6 +230,8 @@ class SpecialChangePassword extends UnlistedSpecialPage {
* @throws PasswordError when cannot set the new password because requirements not met.
*/
protected function attemptReset( $newpass, $retype ) {
+ global $wgPasswordAttemptThrottle;
+
$isSelf = ( $this->mUserName === $this->getUser()->getName() );
if ( $isSelf ) {
$user = $this->getUser();
@@ -229,18 +239,22 @@ class SpecialChangePassword extends UnlistedSpecialPage {
$user = User::newFromName( $this->mUserName );
}
- if( !$user || $user->isAnon() ) {
+ if ( !$user || $user->isAnon() ) {
throw new PasswordError( $this->msg( 'nosuchusershort', $this->mUserName )->text() );
}
- if( $newpass !== $retype ) {
+ if ( $newpass !== $retype ) {
wfRunHooks( 'PrefsPasswordAudit', array( $user, $newpass, 'badretype' ) );
throw new PasswordError( $this->msg( 'badretype' )->text() );
}
$throttleCount = LoginForm::incLoginThrottle( $this->mUserName );
if ( $throttleCount === true ) {
- throw new PasswordError( $this->msg( 'login-throttled' )->text() );
+ $lang = $this->getLanguage();
+ throw new PasswordError( $this->msg( 'login-throttled' )
+ ->params( $lang->formatDuration( $wgPasswordAttemptThrottle['seconds'] ) )
+ ->text()
+ );
}
$abortMsg = 'resetpass-abort-generic';
@@ -249,7 +263,7 @@ class SpecialChangePassword extends UnlistedSpecialPage {
throw new PasswordError( $this->msg( $abortMsg )->text() );
}
- if( !$user->checkTemporaryPassword( $this->mOldpass ) && !$user->checkPassword( $this->mOldpass ) ) {
+ if ( !$user->checkTemporaryPassword( $this->mOldpass ) && !$user->checkPassword( $this->mOldpass ) ) {
wfRunHooks( 'PrefsPasswordAudit', array( $user, $newpass, 'wrongpassword' ) );
throw new PasswordError( $this->msg( 'resetpass-wrong-oldpass' )->text() );
}
@@ -263,7 +277,7 @@ class SpecialChangePassword extends UnlistedSpecialPage {
$user->setPassword( $this->mNewpass );
wfRunHooks( 'PrefsPasswordAudit', array( $user, $newpass, 'success' ) );
$this->mNewpass = $this->mOldpass = $this->mRetype = '';
- } catch( PasswordError $e ) {
+ } catch ( PasswordError $e ) {
wfRunHooks( 'PrefsPasswordAudit', array( $user, $newpass, 'error' ) );
throw new PasswordError( $e->getMessage() );
}
diff --git a/includes/specials/SpecialComparePages.php b/includes/specials/SpecialComparePages.php
index c3bd3fec..fc6b0c58 100644
--- a/includes/specials/SpecialComparePages.php
+++ b/includes/specials/SpecialComparePages.php
@@ -110,7 +110,7 @@ class SpecialComparePages extends SpecialPage {
$rev1 = self::revOrTitle( $data['Revision1'], $data['Page1'] );
$rev2 = self::revOrTitle( $data['Revision2'], $data['Page2'] );
- if( $rev1 && $rev2 ) {
+ if ( $rev1 && $rev2 ) {
$revision = Revision::newFromId( $rev1 );
if ( $revision ) { // NOTE: $rev1 was already checked, should exist.
@@ -128,14 +128,15 @@ class SpecialComparePages extends SpecialPage {
}
public static function revOrTitle( $revision, $title ) {
- if( $revision ) {
+ if ( $revision ) {
return $revision;
- } elseif( $title ) {
+ } elseif ( $title ) {
$title = Title::newFromText( $title );
- if( $title instanceof Title ) {
+ if ( $title instanceof Title ) {
return $title->getLatestRevID();
}
}
+
return null;
}
@@ -150,6 +151,7 @@ class SpecialComparePages extends SpecialPage {
if ( !$title->exists() ) {
return $this->msg( 'compare-title-not-exists' )->parseAsBlock();
}
+
return true;
}
@@ -161,6 +163,7 @@ class SpecialComparePages extends SpecialPage {
if ( $revision === null ) {
return $this->msg( 'compare-revision-not-exists' )->parseAsBlock();
}
+
return true;
}
diff --git a/includes/specials/SpecialConfirmemail.php b/includes/specials/SpecialConfirmemail.php
index 078c3865..3828b1c6 100644
--- a/includes/specials/SpecialConfirmemail.php
+++ b/includes/specials/SpecialConfirmemail.php
@@ -30,27 +30,30 @@
* @author Rob Church <robchur@gmail.com>
*/
class EmailConfirmation extends UnlistedSpecialPage {
-
- /**
- * Constructor
- */
public function __construct() {
- parent::__construct( 'Confirmemail' );
+ parent::__construct( 'Confirmemail', 'editmyprivateinfo' );
}
/**
* Main execution point
*
- * @param $code Confirmation code passed to the page
+ * @param null|string $code Confirmation code passed to the page
*/
function execute( $code ) {
$this->setHeaders();
$this->checkReadOnly();
+ $this->checkPermissions();
- if( $code === null || $code === '' ) {
- if( $this->getUser()->isLoggedIn() ) {
- if( Sanitizer::validateEmail( $this->getUser()->getEmail() ) ) {
+ // This could also let someone check the current email address, so
+ // require both permissions.
+ if ( !$this->getUser()->isAllowed( 'viewmyprivateinfo' ) ) {
+ throw new PermissionsError( 'viewmyprivateinfo' );
+ }
+
+ if ( $code === null || $code === '' ) {
+ if ( $this->getUser()->isLoggedIn() ) {
+ if ( Sanitizer::validateEmail( $this->getUser()->getEmail() ) ) {
$this->showRequestForm();
} else {
$this->getOutput()->addWikiMsg( 'confirmemail_noemail' );
@@ -62,7 +65,9 @@ class EmailConfirmation extends UnlistedSpecialPage {
array(),
array( 'returnto' => $this->getTitle()->getPrefixedText() )
);
- $this->getOutput()->addHTML( $this->msg( 'confirmemail_needlogin' )->rawParams( $llink )->parse() );
+ $this->getOutput()->addHTML(
+ $this->msg( 'confirmemail_needlogin' )->rawParams( $llink )->parse()
+ );
}
} else {
$this->attemptConfirm( $code );
@@ -75,7 +80,10 @@ class EmailConfirmation extends UnlistedSpecialPage {
function showRequestForm() {
$user = $this->getUser();
$out = $this->getOutput();
- if( $this->getRequest()->wasPosted() && $user->matchEditToken( $this->getRequest()->getText( 'token' ) ) ) {
+
+ if ( $this->getRequest()->wasPosted() &&
+ $user->matchEditToken( $this->getRequest()->getText( 'token' ) )
+ ) {
$status = $user->sendConfirmationMail();
if ( $status->isGood() ) {
$out->addWikiMsg( 'confirmemail_sent' );
@@ -83,7 +91,7 @@ class EmailConfirmation extends UnlistedSpecialPage {
$out->addWikiText( $status->getWikiText( 'confirmemail_sendfailed' ) );
}
} else {
- if( $user->isEmailConfirmed() ) {
+ if ( $user->isEmailConfirmed() ) {
// date and time are separate parameters to facilitate localisation.
// $time is kept for backward compat reasons.
// 'emailauthenticated' is also used in SpecialPreferences.php
@@ -94,14 +102,22 @@ class EmailConfirmation extends UnlistedSpecialPage {
$t = $lang->userTime( $emailAuthenticated, $user );
$out->addWikiMsg( 'emailauthenticated', $time, $d, $t );
}
- if( $user->isEmailConfirmationPending() ) {
- $out->wrapWikiMsg( "<div class=\"error mw-confirmemail-pending\">\n$1\n</div>", 'confirmemail_pending' );
+
+ if ( $user->isEmailConfirmationPending() ) {
+ $out->wrapWikiMsg(
+ "<div class=\"error mw-confirmemail-pending\">\n$1\n</div>",
+ 'confirmemail_pending'
+ );
}
+
$out->addWikiMsg( 'confirmemail_text' );
- $form = Xml::openElement( 'form', array( 'method' => 'post', 'action' => $this->getTitle()->getLocalUrl() ) );
- $form .= Html::hidden( 'token', $user->getEditToken() );
- $form .= Xml::submitButton( $this->msg( 'confirmemail_send' )->text() );
- $form .= Xml::closeElement( 'form' );
+ $form = Html::openElement(
+ 'form',
+ array( 'method' => 'post', 'action' => $this->getTitle()->getLocalURL() )
+ ) . "\n";
+ $form .= Html::hidden( 'token', $user->getEditToken() ) . "\n";
+ $form .= Xml::submitButton( $this->msg( 'confirmemail_send' )->text() ) . "\n";
+ $form .= Html::closeElement( 'form' ) . "\n";
$out->addHTML( $form );
}
}
@@ -114,20 +130,22 @@ class EmailConfirmation extends UnlistedSpecialPage {
*/
function attemptConfirm( $code ) {
$user = User::newFromConfirmationCode( $code );
- if( is_object( $user ) ) {
- $user->confirmEmail();
- $user->saveSettings();
- $message = $this->getUser()->isLoggedIn() ? 'confirmemail_loggedin' : 'confirmemail_success';
- $this->getOutput()->addWikiMsg( $message );
- if( !$this->getUser()->isLoggedIn() ) {
- $title = SpecialPage::getTitleFor( 'Userlogin' );
- $this->getOutput()->returnToMain( true, $title );
- }
- } else {
+ if ( !is_object( $user ) ) {
$this->getOutput()->addWikiMsg( 'confirmemail_invalid' );
+
+ return;
}
- }
+ $user->confirmEmail();
+ $user->saveSettings();
+ $message = $this->getUser()->isLoggedIn() ? 'confirmemail_loggedin' : 'confirmemail_success';
+ $this->getOutput()->addWikiMsg( $message );
+
+ if ( !$this->getUser()->isLoggedIn() ) {
+ $title = SpecialPage::getTitleFor( 'Userlogin' );
+ $this->getOutput()->returnToMain( true, $title );
+ }
+ }
}
/**
@@ -137,16 +155,14 @@ class EmailConfirmation extends UnlistedSpecialPage {
* @ingroup SpecialPage
*/
class EmailInvalidation extends UnlistedSpecialPage {
-
public function __construct() {
- parent::__construct( 'Invalidateemail' );
+ parent::__construct( 'Invalidateemail', 'editmyprivateinfo' );
}
function execute( $code ) {
$this->setHeaders();
-
$this->checkReadOnly();
-
+ $this->checkPermissions();
$this->attemptInvalidate( $code );
}
@@ -158,15 +174,18 @@ class EmailInvalidation extends UnlistedSpecialPage {
*/
function attemptInvalidate( $code ) {
$user = User::newFromConfirmationCode( $code );
- if( is_object( $user ) ) {
- $user->invalidateEmail();
- $user->saveSettings();
- $this->getOutput()->addWikiMsg( 'confirmemail_invalidated' );
- if( !$this->getUser()->isLoggedIn() ) {
- $this->getOutput()->returnToMain();
- }
- } else {
+ if ( !is_object( $user ) ) {
$this->getOutput()->addWikiMsg( 'confirmemail_invalid' );
+
+ return;
+ }
+
+ $user->invalidateEmail();
+ $user->saveSettings();
+ $this->getOutput()->addWikiMsg( 'confirmemail_invalidated' );
+
+ if ( !$this->getUser()->isLoggedIn() ) {
+ $this->getOutput()->returnToMain();
}
}
}
diff --git a/includes/specials/SpecialContributions.php b/includes/specials/SpecialContributions.php
index b118059c..1fe98190 100644
--- a/includes/specials/SpecialContributions.php
+++ b/includes/specials/SpecialContributions.php
@@ -28,7 +28,6 @@
*/
class SpecialContributions extends SpecialPage {
-
protected $opts;
public function __construct() {
@@ -65,6 +64,7 @@ class SpecialContributions extends SpecialPage {
if ( !strlen( $target ) ) {
$out->addHTML( $this->getForm() );
+
return;
}
@@ -77,11 +77,13 @@ class SpecialContributions extends SpecialPage {
$nt = Title::makeTitleSafe( NS_USER, $target );
if ( !$nt ) {
$out->addHTML( $this->getForm() );
+
return;
}
$userObj = User::newFromName( $nt->getText(), false );
if ( !$userObj ) {
$out->addHTML( $this->getForm() );
+
return;
}
$id = $userObj->getID();
@@ -89,11 +91,17 @@ class SpecialContributions extends SpecialPage {
if ( $this->opts['contribs'] != 'newbie' ) {
$target = $nt->getText();
$out->addSubtitle( $this->contributionsSub( $userObj ) );
- $out->setHTMLTitle( $this->msg( 'pagetitle', $this->msg( 'contributions-title', $target )->plain() ) );
+ $out->setHTMLTitle( $this->msg(
+ 'pagetitle',
+ $this->msg( 'contributions-title', $target )->plain()
+ ) );
$this->getSkin()->setRelevantUser( $userObj );
} else {
$out->addSubtitle( $this->msg( 'sp-contributions-newbies-sub' ) );
- $out->setHTMLTitle( $this->msg( 'pagetitle', $this->msg( 'sp-contributions-newbies-title' )->plain() ) );
+ $out->setHTMLTitle( $this->msg(
+ 'pagetitle',
+ $this->msg( 'sp-contributions-newbies-title' )->plain()
+ ) );
}
if ( ( $ns = $request->getVal( 'namespace', null ) ) !== null && $ns !== '' ) {
@@ -103,10 +111,8 @@ class SpecialContributions extends SpecialPage {
}
$this->opts['associated'] = $request->getBool( 'associated' );
-
- $this->opts['nsInvert'] = (bool) $request->getVal( 'nsInvert' );
-
- $this->opts['tagfilter'] = (string) $request->getVal( 'tagfilter' );
+ $this->opts['nsInvert'] = (bool)$request->getVal( 'nsInvert' );
+ $this->opts['tagfilter'] = (string)$request->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
@@ -152,9 +158,10 @@ class SpecialContributions extends SpecialPage {
$apiParams['month'] = $this->opts['month'];
}
- $url = wfScript( 'api' ) . '?' . wfArrayToCgi( $apiParams );
+ $url = wfAppendQuery( wfScript( 'api' ), $apiParams );
$out->redirect( $url, '301' );
+
return;
}
@@ -162,13 +169,13 @@ class SpecialContributions extends SpecialPage {
$this->addFeedLinks( array( 'action' => 'feedcontributions', 'user' => $target ) );
if ( wfRunHooks( 'SpecialContributionsBeforeMainOutput', array( $id ) ) ) {
-
$out->addHTML( $this->getForm() );
$pager = new ContribsPager( $this->getContext(), array(
'target' => $target,
'contribs' => $this->opts['contribs'],
'namespace' => $this->opts['namespace'],
+ 'tagfilter' => $this->opts['tagfilter'],
'year' => $this->opts['year'],
'month' => $this->opts['month'],
'deletedOnly' => $this->opts['deletedOnly'],
@@ -176,18 +183,20 @@ class SpecialContributions extends SpecialPage {
'nsInvert' => $this->opts['nsInvert'],
'associated' => $this->opts['associated'],
) );
+
if ( !$pager->getNumRows() ) {
$out->addWikiMsg( 'nocontribs', $target );
} else {
# Show a message about slave lag, if applicable
$lag = wfGetLB()->safeGetLag( $pager->getDatabase() );
- if ( $lag > 0 )
+ if ( $lag > 0 ) {
$out->showLagWarning( $lag );
+ }
$out->addHTML(
'<p>' . $pager->getNavigationBar() . '</p>' .
- $pager->getBody() .
- '<p>' . $pager->getNavigationBar() . '</p>'
+ $pager->getBody() .
+ '<p>' . $pager->getNavigationBar() . '</p>'
);
}
$out->preventClickjacking( $pager->getPreventClickjacking() );
@@ -195,16 +204,16 @@ class SpecialContributions extends SpecialPage {
# Show the appropriate "footer" message - WHOIS tools, etc.
if ( $this->opts['contribs'] == 'newbie' ) {
$message = 'sp-contributions-footer-newbies';
- } elseif( IP::isIPAddress( $target ) ) {
+ } elseif ( IP::isIPAddress( $target ) ) {
$message = 'sp-contributions-footer-anon';
- } elseif( $userObj->isAnon() ) {
+ } elseif ( $userObj->isAnon() ) {
// No message for non-existing users
$message = '';
} else {
$message = 'sp-contributions-footer';
}
- if( $message ) {
+ if ( $message ) {
if ( !$this->msg( $message, $target )->isDisabled() ) {
$out->wrapWikiMsg(
"<div class='mw-contributions-footer'>\n$1\n</div>",
@@ -218,7 +227,8 @@ class SpecialContributions extends SpecialPage {
* Generates the subheading with links
* @param $userObj User object 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.
+ * @todo FIXME: Almost the same as getSubTitle in SpecialDeletedContributions.php.
+ * Could be combined.
*/
protected function contributionsSub( $userObj ) {
if ( $userObj->isAnon() ) {
@@ -258,18 +268,7 @@ class SpecialContributions extends SpecialPage {
}
}
- // Old message 'contribsub' had one parameter, but that doesn't work for
- // languages that want to put the "for" bit right after $user but before
- // $links. If 'contribsub' is around, use it for reverse compatibility,
- // otherwise use 'contribsub2'.
- // @todo Should this be removed at some point?
- $oldMsg = $this->msg( 'contribsub' );
- if ( $oldMsg->exists() ) {
- $linksWithParentheses = $this->msg( 'parentheses' )->rawParams( $links )->escaped();
- return $oldMsg->rawParams( "$user $linksWithParentheses" );
- } else {
- return $this->msg( 'contribsub2' )->rawParams( $user, $links );
- }
+ return $this->msg( 'contribsub2' )->rawParams( $user, $links )->params( $userObj->getName() );
}
/**
@@ -288,7 +287,7 @@ class SpecialContributions extends SpecialPage {
if ( ( $id !== null ) || ( $id === null && IP::isIPAddress( $username ) ) ) {
if ( $this->getUser()->isAllowed( 'block' ) ) { # Block / Change block / Unblock links
- if ( $target->isBlocked() ) {
+ if ( $target->isBlocked() && $target->getBlock()->getType() != Block::TYPE_AUTO ) {
$tools[] = Linker::linkKnown( # Change block link
SpecialPage::getTitleFor( 'Block', $username ),
$this->msg( 'change-blocklink' )->escaped()
@@ -304,14 +303,13 @@ class SpecialContributions extends SpecialPage {
);
}
}
+
# Block log link
$tools[] = Linker::linkKnown(
SpecialPage::getTitleFor( 'Log', 'block' ),
$this->msg( 'sp-contributions-blocklog' )->escaped(),
array(),
- array(
- 'page' => $userpage->getPrefixedText()
- )
+ array( 'page' => $userpage->getPrefixedText() )
);
}
# Uploads
@@ -345,6 +343,7 @@ class SpecialContributions extends SpecialPage {
}
wfRunHooks( 'ContributionsToolLinks', array( $id, $userpage, &$tools ) );
+
return $tools;
}
@@ -398,10 +397,28 @@ class SpecialContributions extends SpecialPage {
$this->opts['topOnly'] = false;
}
- $form = Html::openElement( 'form', array( 'method' => 'get', 'action' => $wgScript, 'class' => 'mw-contributions-form' ) );
+ $form = Html::openElement(
+ 'form',
+ array(
+ 'method' => 'get',
+ 'action' => $wgScript,
+ 'class' => 'mw-contributions-form'
+ )
+ );
# Add hidden params for tracking except for parameters in $skipParameters
- $skipParameters = array( 'namespace', 'nsInvert', 'deletedOnly', 'target', 'contribs', 'year', 'month', 'topOnly', 'associated' );
+ $skipParameters = array(
+ 'namespace',
+ 'nsInvert',
+ 'deletedOnly',
+ 'target',
+ 'contribs',
+ 'year',
+ 'month',
+ 'topOnly',
+ 'associated'
+ );
+
foreach ( $this->opts as $name => $value ) {
if ( in_array( $name, $skipParameters ) ) {
continue;
@@ -412,65 +429,82 @@ class SpecialContributions extends SpecialPage {
$tagFilter = ChangeTags::buildTagFilterSelector( $this->opts['tagfilter'] );
if ( $tagFilter ) {
- $filterSelection =
- Html::rawElement( 'td', array( 'class' => 'mw-label' ), array_shift( $tagFilter ) ) .
- Html::rawElement( 'td', array( 'class' => 'mw-input' ), implode( '&#160', $tagFilter ) );
+ $filterSelection = Html::rawElement(
+ 'td',
+ array( 'class' => 'mw-label' ),
+ array_shift( $tagFilter )
+ );
+ $filterSelection .= Html::rawElement(
+ 'td',
+ array( 'class' => 'mw-input' ),
+ implode( '&#160', $tagFilter )
+ );
} else {
$filterSelection = Html::rawElement( 'td', array( 'colspan' => 2 ), '' );
}
- $targetSelection = Html::rawElement( 'td', array( 'colspan' => 2 ),
- Xml::radioLabel(
- $this->msg( 'sp-contributions-newbies' )->text(),
- 'contribs',
- 'newbie',
- 'newbie',
- $this->opts['contribs'] == 'newbie',
- array( 'class' => 'mw-input' )
- ) . '<br />' .
- Xml::radioLabel(
- $this->msg( 'sp-contributions-username' )->text(),
- 'contribs',
- 'user',
- 'user',
- $this->opts['contribs'] == 'user',
- array( 'class' => 'mw-input' )
- ) . ' ' .
- Html::input(
- 'target',
- $this->opts['target'],
- 'text',
- array( 'size' => '40', 'required' => '', 'class' => 'mw-input' ) +
- ( $this->opts['target'] ? array() : array( 'autofocus' )
+ $labelNewbies = Xml::radioLabel(
+ $this->msg( 'sp-contributions-newbies' )->text(),
+ 'contribs',
+ 'newbie',
+ 'newbie',
+ $this->opts['contribs'] == 'newbie',
+ array( 'class' => 'mw-input' )
+ );
+ $labelUsername = Xml::radioLabel(
+ $this->msg( 'sp-contributions-username' )->text(),
+ 'contribs',
+ 'user',
+ 'user',
+ $this->opts['contribs'] == 'user',
+ array( 'class' => 'mw-input' )
+ );
+ $input = Html::input(
+ 'target',
+ $this->opts['target'],
+ 'text',
+ array( 'size' => '40', 'required' => '', 'class' => 'mw-input' ) +
+ ( $this->opts['target'] ? array() : array( 'autofocus' )
)
- ) . ' '
+ );
+ $targetSelection = Html::rawElement(
+ 'td',
+ array( 'colspan' => 2 ),
+ $labelNewbies . '<br />' . $labelUsername . ' ' . $input . ' '
);
- $namespaceSelection =
- Xml::tags( 'td', array( 'class' => 'mw-label' ),
- Xml::label(
- $this->msg( 'namespace' )->text(),
- 'namespace',
- ''
- )
- ) .
- Html::rawElement( 'td', null,
- Html::namespaceSelector( array(
- 'selected' => $this->opts['namespace'],
- 'all' => '',
- ), array(
- 'name' => 'namespace',
- 'id' => 'namespace',
+ $namespaceSelection = Xml::tags(
+ 'td',
+ array( 'class' => 'mw-label' ),
+ Xml::label(
+ $this->msg( 'namespace' )->text(),
+ 'namespace',
+ ''
+ )
+ );
+ $namespaceSelection .= Html::rawElement(
+ 'td',
+ null,
+ Html::namespaceSelector(
+ array( 'selected' => $this->opts['namespace'], 'all' => '' ),
+ array(
+ 'name' => 'namespace',
+ 'id' => 'namespace',
'class' => 'namespaceselector',
- ) ) .
- '&#160;' .
- Html::rawElement( 'span', array( 'style' => 'white-space: nowrap' ),
+ )
+ ) . '&#160;' .
+ Html::rawElement(
+ 'span',
+ array( 'style' => 'white-space: nowrap' ),
Xml::checkLabel(
$this->msg( 'invert' )->text(),
'nsInvert',
'nsInvert',
$this->opts['nsInvert'],
- array( 'title' => $this->msg( 'tooltip-invert' )->text(), 'class' => 'mw-input' )
+ array(
+ 'title' => $this->msg( 'tooltip-invert' )->text(),
+ 'class' => 'mw-input'
+ )
) . '&#160;'
) .
Html::rawElement( 'span', array( 'style' => 'white-space: nowrap' ),
@@ -479,13 +513,18 @@ class SpecialContributions extends SpecialPage {
'associated',
'associated',
$this->opts['associated'],
- array( 'title' => $this->msg( 'tooltip-namespace_association' )->text(), 'class' => 'mw-input' )
+ array(
+ 'title' => $this->msg( 'tooltip-namespace_association' )->text(),
+ 'class' => 'mw-input'
+ )
) . '&#160;'
)
- );
+ );
if ( $this->getUser()->isAllowed( 'deletedhistory' ) ) {
- $deletedOnlyCheck = Html::rawElement( 'span', array( 'style' => 'white-space: nowrap' ),
+ $deletedOnlyCheck = Html::rawElement(
+ 'span',
+ array( 'style' => 'white-space: nowrap' ),
Xml::checkLabel(
$this->msg( 'history-show-deleted' )->text(),
'deletedOnly',
@@ -498,46 +537,50 @@ class SpecialContributions extends SpecialPage {
$deletedOnlyCheck = '';
}
- $extraOptions = Html::rawElement( 'td', array( 'colspan' => 2 ),
- $deletedOnlyCheck .
- Html::rawElement( 'span', array( 'style' => 'white-space: nowrap' ),
- Xml::checkLabel(
- $this->msg( 'sp-contributions-toponly' )->text(),
- 'topOnly',
- 'mw-show-top-only',
- $this->opts['topOnly'],
- array( 'class' => 'mw-input' )
- )
+ $checkLabelTopOnly = Html::rawElement(
+ 'span',
+ array( 'style' => 'white-space: nowrap' ),
+ Xml::checkLabel(
+ $this->msg( 'sp-contributions-toponly' )->text(),
+ 'topOnly',
+ 'mw-show-top-only',
+ $this->opts['topOnly'],
+ array( 'class' => 'mw-input' )
)
);
+ $extraOptions = Html::rawElement(
+ 'td',
+ array( 'colspan' => 2 ),
+ $deletedOnlyCheck . $checkLabelTopOnly
+ );
$dateSelectionAndSubmit = Xml::tags( 'td', array( 'colspan' => 2 ),
Xml::dateMenu(
- $this->opts['year'],
+ $this->opts['year'] === '' ? MWTimestamp::getInstance()->format( 'Y' ) : $this->opts['year'],
$this->opts['month']
) . ' ' .
- Xml::submitButton(
- $this->msg( 'sp-contributions-submit' )->text(),
- array( 'class' => 'mw-submit' )
- )
+ Xml::submitButton(
+ $this->msg( 'sp-contributions-submit' )->text(),
+ array( 'class' => 'mw-submit' )
+ )
);
- $form .=
- Xml::fieldset( $this->msg( 'sp-contributions-search' )->text() ) .
- Html::rawElement( 'table', array( 'class' => 'mw-contributions-table' ), "\n" .
- Html::rawElement( 'tr', array(), $targetSelection ) . "\n" .
- Html::rawElement( 'tr', array(), $namespaceSelection ) . "\n" .
- Html::rawElement( 'tr', array(), $filterSelection ) . "\n" .
- Html::rawElement( 'tr', array(), $extraOptions ) . "\n" .
- Html::rawElement( 'tr', array(), $dateSelectionAndSubmit ) . "\n"
- );
+ $form .= Xml::fieldset( $this->msg( 'sp-contributions-search' )->text() );
+ $form .= Html::rawElement( 'table', array( 'class' => 'mw-contributions-table' ), "\n" .
+ Html::rawElement( 'tr', array(), $targetSelection ) . "\n" .
+ Html::rawElement( 'tr', array(), $namespaceSelection ) . "\n" .
+ Html::rawElement( 'tr', array(), $filterSelection ) . "\n" .
+ Html::rawElement( 'tr', array(), $extraOptions ) . "\n" .
+ Html::rawElement( 'tr', array(), $dateSelectionAndSubmit ) . "\n"
+ );
$explain = $this->msg( 'sp-contributions-explain' );
if ( !$explain->isBlank() ) {
$form .= "<p id='mw-sp-contributions-explain'>{$explain->parse()}</p>";
}
- $form .= Xml::closeElement( 'fieldset' ) .
- Xml::closeElement( 'form' );
+
+ $form .= Xml::closeElement( 'fieldset' ) . Xml::closeElement( 'form' );
+
return $form;
}
@@ -552,9 +595,11 @@ class SpecialContributions extends SpecialPage {
*/
class ContribsPager extends ReverseChronologicalPager {
public $mDefaultDirection = true;
- var $messages, $target;
- var $namespace = '', $mDb;
- var $preventClickjacking = false;
+ public $messages;
+ public $target;
+ public $namespace = '';
+ public $mDb;
+ public $preventClickjacking = false;
/**
* @var array
@@ -564,7 +609,15 @@ class ContribsPager extends ReverseChronologicalPager {
function __construct( IContextSource $context, array $options ) {
parent::__construct( $context );
- $msgs = array( 'uctop', 'diff', 'newarticle', 'rollbacklink', 'diff', 'hist', 'rev-delundel', 'pipe-separator' );
+ $msgs = array(
+ 'diff',
+ 'hist',
+ 'newarticle',
+ 'pipe-separator',
+ 'rev-delundel',
+ 'rollbacklink',
+ 'uctop'
+ );
foreach ( $msgs as $msg ) {
$this->messages[$msg] = $this->msg( $msg )->escaped();
@@ -590,6 +643,7 @@ class ContribsPager extends ReverseChronologicalPager {
function getDefaultQuery() {
$query = parent::getDefaultQuery();
$query['target'] = $this->target;
+
return $query;
}
@@ -603,7 +657,11 @@ class ContribsPager extends ReverseChronologicalPager {
* @return ResultWrapper
*/
function reallyDoQuery( $offset, $limit, $descending ) {
- list( $tables, $fields, $conds, $fname, $options, $join_conds ) = $this->buildQueryInfo( $offset, $limit, $descending );
+ list( $tables, $fields, $conds, $fname, $options, $join_conds ) = $this->buildQueryInfo(
+ $offset,
+ $limit,
+ $descending
+ );
$pager = $this;
/*
@@ -624,8 +682,13 @@ class ContribsPager extends ReverseChronologicalPager {
* $limit: see phpdoc above
* $descending: see phpdoc above
*/
- $data = array( $this->mDb->select( $tables, $fields, $conds, $fname, $options, $join_conds ) );
- wfRunHooks( 'ContribsPager::reallyDoQuery', array( &$data, $pager, $offset, $limit, $descending ) );
+ $data = array( $this->mDb->select(
+ $tables, $fields, $conds, $fname, $options, $join_conds
+ ) );
+ wfRunHooks(
+ 'ContribsPager::reallyDoQuery',
+ array( &$data, $pager, $offset, $limit, $descending )
+ );
$result = array();
@@ -673,15 +736,15 @@ class ContribsPager extends ReverseChronologicalPager {
$join_cond['user'] = Revision::userJoinCond();
$queryInfo = array(
- 'tables' => $tables,
- 'fields' => array_merge(
+ 'tables' => $tables,
+ 'fields' => array_merge(
Revision::selectFields(),
Revision::selectUserFields(),
array( 'page_namespace', 'page_title', 'page_is_new',
'page_latest', 'page_is_redirect', 'page_len' )
),
- 'conds' => $conds,
- 'options' => array( 'USE INDEX' => array( 'revision' => $index ) ),
+ 'conds' => $conds,
+ 'options' => array( 'USE INDEX' => array( 'revision' => $index ) ),
'join_conds' => $join_cond
);
@@ -695,6 +758,7 @@ class ContribsPager extends ReverseChronologicalPager {
);
wfRunHooks( 'ContribsPager::getQueryInfo', array( &$this, &$queryInfo ) );
+
return $queryInfo;
}
@@ -709,7 +773,7 @@ class ContribsPager extends ReverseChronologicalPager {
# ignore local groups with the bot right
# @todo FIXME: Global groups may have 'bot' rights
$groupsWithBotPermission = User::getGroupsWithPermission( 'bot' );
- if( count( $groupsWithBotPermission ) ) {
+ if ( count( $groupsWithBotPermission ) ) {
$tables[] = 'user_groups';
$condition[] = 'ug_group IS NULL';
$join_conds['user_groups'] = array(
@@ -729,12 +793,15 @@ class ContribsPager extends ReverseChronologicalPager {
$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 );
}
@@ -746,20 +813,20 @@ class ContribsPager extends ReverseChronologicalPager {
if ( !$this->associated ) {
return array( "page_namespace $eq_op $selectedNS" );
- } else {
- $associatedNS = $this->mDb->addQuotes (
- MWNamespace::getAssociated( $this->namespace )
- );
- return array(
- "page_namespace $eq_op $selectedNS " .
- $bool_op .
- " page_namespace $eq_op $associatedNS"
- );
}
- } else {
- return array();
+ $associatedNS = $this->mDb->addQuotes(
+ MWNamespace::getAssociated( $this->namespace )
+ );
+
+ return array(
+ "page_namespace $eq_op $selectedNS " .
+ $bool_op .
+ " page_namespace $eq_op $associatedNS"
+ );
}
+
+ return array();
}
function getIndexField() {
@@ -773,7 +840,7 @@ class ContribsPager extends ReverseChronologicalPager {
$batch = new LinkBatch();
# Give some pointers to make (last) links
foreach ( $this->mResult as $row ) {
- if( isset( $row->rev_parent_id ) && $row->rev_parent_id ) {
+ if ( isset( $row->rev_parent_id ) && $row->rev_parent_id ) {
$revIds[] = $row->rev_parent_id;
}
if ( isset( $row->rev_id ) ) {
@@ -830,7 +897,7 @@ class ContribsPager extends ReverseChronologicalPager {
*/
wfSuppressWarnings();
$rev = new Revision( $row );
- $validRevision = (bool) $rev->getId();
+ $validRevision = (bool)$rev->getId();
wfRestoreWarnings();
if ( $validRevision ) {
@@ -850,8 +917,8 @@ class ContribsPager extends ReverseChronologicalPager {
$topmarktext .= '<span class="mw-uctop">' . $this->messages['uctop'] . '</span>';
# Add rollback link
if ( !$row->page_is_new && $page->quickUserCan( 'rollback', $user )
- && $page->quickUserCan( 'edit', $user ) )
- {
+ && $page->quickUserCan( 'edit', $user )
+ ) {
$this->preventClickjacking();
$topmarktext .= ' ' . Linker::generateRollback( $rev, $this->getContext() );
}
@@ -881,11 +948,22 @@ class ContribsPager extends ReverseChronologicalPager {
// For some reason rev_parent_id isn't populated for this row.
// Its rumoured this is true on wikipedia for some revisions (bug 34922).
// Next best thing is to have the total number of bytes.
- $chardiff = ' <span class="mw-changeslist-separator">. .</span> ' . Linker::formatRevisionSize( $row->rev_len ) . ' <span class="mw-changeslist-separator">. .</span> ';
+ $chardiff = ' <span class="mw-changeslist-separator">. .</span> ';
+ $chardiff .= Linker::formatRevisionSize( $row->rev_len );
+ $chardiff .= ' <span class="mw-changeslist-separator">. .</span> ';
} else {
- $parentLen = isset( $this->mParentLens[$row->rev_parent_id] ) ? $this->mParentLens[$row->rev_parent_id] : 0;
- $chardiff = ' <span class="mw-changeslist-separator">. .</span> ' . ChangesList::showCharacterDifference(
- $parentLen, $row->rev_len, $this->getContext() ) . ' <span class="mw-changeslist-separator">. .</span> ';
+ $parentLen = 0;
+ if ( isset( $this->mParentLens[$row->rev_parent_id] ) ) {
+ $parentLen = $this->mParentLens[$row->rev_parent_id];
+ }
+
+ $chardiff = ' <span class="mw-changeslist-separator">. .</span> ';
+ $chardiff .= ChangesList::showCharacterDifference(
+ $parentLen,
+ $row->rev_len,
+ $this->getContext()
+ );
+ $chardiff .= ' <span class="mw-changeslist-separator">. .</span> ';
}
$lang = $this->getLanguage();
@@ -908,7 +986,7 @@ class ContribsPager extends ReverseChronologicalPager {
# Show user names for /newbies as there may be different users.
# Note that we already excluded rows with hidden user names.
if ( $this->contribs == 'newbie' ) {
- $userlink = ' . . ' . Linker::userLink( $rev->getUser(), $rev->getUserText() );
+ $userlink = ' . . ' . $lang->getDirMark() . Linker::userLink( $rev->getUser(), $rev->getUserText() );
$userlink .= ' ' . $this->msg( 'parentheses' )->rawParams(
Linker::userTalkLink( $rev->getUser(), $rev->getUserText() ) )->escaped() . ' ';
} else {
@@ -932,16 +1010,24 @@ class ContribsPager extends ReverseChronologicalPager {
$del .= ' ';
}
- $diffHistLinks = $this->msg( 'parentheses' )->rawParams( $difftext . $this->messages['pipe-separator'] . $histlink )->escaped();
- $ret = "{$del}{$d} {$diffHistLinks}{$chardiff}{$nflag}{$mflag} {$link}{$userlink} {$comment} {$topmarktext}";
+ $diffHistLinks = $this->msg( 'parentheses' )
+ ->rawParams( $difftext . $this->messages['pipe-separator'] . $histlink )
+ ->escaped();
+ $ret = "{$del}{$d} {$diffHistLinks}{$chardiff}{$nflag}{$mflag} ";
+ $ret .= "{$link}{$userlink} {$comment} {$topmarktext}";
# Denote if username is redacted for this edit
if ( $rev->isDeleted( Revision::DELETED_USER ) ) {
- $ret .= " <strong>" . $this->msg( 'rev-deleted-user-contribs' )->escaped() . "</strong>";
+ $ret .= " <strong>" .
+ $this->msg( 'rev-deleted-user-contribs' )->escaped() .
+ "</strong>";
}
# Tags, if any.
- list( $tagSummary, $newClasses ) = ChangeTags::formatSummaryRow( $row->ts_tags, 'contributions' );
+ list( $tagSummary, $newClasses ) = ChangeTags::formatSummaryRow(
+ $row->ts_tags,
+ 'contributions'
+ );
$classes = array_merge( $classes, $newClasses );
$ret .= " $tagSummary";
}
@@ -957,6 +1043,7 @@ class ContribsPager extends ReverseChronologicalPager {
}
wfProfileOut( __METHOD__ );
+
return $ret;
}
@@ -966,7 +1053,8 @@ class ContribsPager extends ReverseChronologicalPager {
*/
function getSqlComment() {
if ( $this->namespace || $this->deletedOnly ) {
- return 'contributions page filtered for namespace or RevisionDeleted edits'; // potentially slow, see CR r58153
+ // potentially slow, see CR r58153
+ return 'contributions page filtered for namespace or RevisionDeleted edits';
} else {
return 'contributions page unfiltered';
}
diff --git a/includes/specials/SpecialDeadendpages.php b/includes/specials/SpecialDeadendpages.php
index 6978d6bb..44137c1e 100644
--- a/includes/specials/SpecialDeadendpages.php
+++ b/includes/specials/SpecialDeadendpages.php
@@ -59,24 +59,29 @@ class DeadendPagesPage extends PageQueryPage {
function getQueryInfo() {
return array(
'tables' => array( 'page', 'pagelinks' ),
- 'fields' => array( 'namespace' => 'page_namespace',
- 'title' => 'page_title',
- 'value' => 'page_title'
+ 'fields' => array(
+ 'namespace' => 'page_namespace',
+ 'title' => 'page_title',
+ 'value' => 'page_title'
),
- 'conds' => array( 'pl_from IS NULL',
- 'page_namespace' => MWNamespace::getContentNamespaces(),
- 'page_is_redirect' => 0
+ 'conds' => array(
+ 'pl_from IS NULL',
+ 'page_namespace' => MWNamespace::getContentNamespaces(),
+ 'page_is_redirect' => 0
),
- 'join_conds' => array( 'pagelinks' => array( 'LEFT JOIN', array(
- 'page_id=pl_from'
- ) ) )
+ 'join_conds' => array(
+ 'pagelinks' => array(
+ 'LEFT JOIN',
+ array( 'page_id=pl_from' )
+ )
+ )
);
}
function getOrderFields() {
// For some crazy reason ordering by a constant
// causes a filesort
- if( count( MWNamespace::getContentNamespaces() ) > 1 ) {
+ if ( count( MWNamespace::getContentNamespaces() ) > 1 ) {
return array( 'page_namespace', 'page_title' );
} else {
return array( 'page_title' );
diff --git a/includes/specials/SpecialDeletedContributions.php b/includes/specials/SpecialDeletedContributions.php
index e374979e..9b9888ad 100644
--- a/includes/specials/SpecialDeletedContributions.php
+++ b/includes/specials/SpecialDeletedContributions.php
@@ -27,13 +27,20 @@
*/
class DeletedContribsPager extends IndexPager {
public $mDefaultDirection = true;
- var $messages, $target;
- var $namespace = '', $mDb;
+ public $messages;
+ public $target;
+ public $namespace = '';
+ public $mDb;
+
+ /**
+ * @var string Navigation bar with paging links.
+ */
+ protected $mNavigationBar;
function __construct( IContextSource $context, $target, $namespace = false ) {
parent::__construct( $context );
$msgs = array( 'deletionlog', 'undeleteviewlink', 'diff' );
- foreach( $msgs as $msg ) {
+ foreach ( $msgs as $msg ) {
$this->messages[$msg] = $this->msg( $msg )->escaped();
}
$this->target = $target;
@@ -44,6 +51,7 @@ class DeletedContribsPager extends IndexPager {
function getDefaultQuery() {
$query = parent::getDefaultQuery();
$query['target'] = $this->target;
+
return $query;
}
@@ -52,17 +60,18 @@ class DeletedContribsPager extends IndexPager {
$conds = array_merge( $userCond, $this->getNamespaceCond() );
$user = $this->getUser();
// Paranoia: avoid brute force searches (bug 17792)
- if( !$user->isAllowed( 'deletedhistory' ) ) {
+ if ( !$user->isAllowed( 'deletedhistory' ) ) {
$conds[] = $this->mDb->bitAnd( 'ar_deleted', Revision::DELETED_USER ) . ' = 0';
- } elseif( !$user->isAllowed( 'suppressrevision' ) ) {
+ } elseif ( !$user->isAllowed( 'suppressrevision' ) ) {
$conds[] = $this->mDb->bitAnd( 'ar_deleted', Revision::SUPPRESSED_USER ) .
' != ' . Revision::SUPPRESSED_USER;
}
+
return array(
'tables' => array( 'archive' ),
'fields' => array(
- 'ar_rev_id', 'ar_namespace', 'ar_title', 'ar_timestamp', 'ar_comment', 'ar_minor_edit',
- 'ar_user', 'ar_user_text', 'ar_deleted'
+ 'ar_rev_id', 'ar_namespace', 'ar_title', 'ar_timestamp', 'ar_comment',
+ 'ar_minor_edit', 'ar_user', 'ar_user_text', 'ar_deleted'
),
'conds' => $conds,
'options' => array( 'USE INDEX' => $index )
@@ -107,8 +116,17 @@ class DeletedContribsPager extends IndexPager {
$lang = $this->getLanguage();
$limits = $lang->pipeList( $limitLinks );
- $this->mNavigationBar = "(" . $lang->pipeList( array( $pagingLinks['first'], $pagingLinks['last'] ) ) . ") " .
- $this->msg( 'viewprevnext' )->rawParams( $pagingLinks['prev'], $pagingLinks['next'], $limits )->escaped();
+ $firstLast = $lang->pipeList( array( $pagingLinks['first'], $pagingLinks['last'] ) );
+ $firstLast = $this->msg( 'parentheses' )->rawParams( $firstLast )->escaped();
+ $prevNext = $this->msg( 'viewprevnext' )
+ ->rawParams(
+ $pagingLinks['prev'],
+ $pagingLinks['next'],
+ $limits
+ )->escaped();
+ $separator = $this->msg( 'word-separator' )->escaped();
+ $this->mNavigationBar = $firstLast . $separator . $prevNext;
+
return $this->mNavigationBar;
}
@@ -138,15 +156,15 @@ class DeletedContribsPager extends IndexPager {
$page = Title::makeTitle( $row->ar_namespace, $row->ar_title );
$rev = new Revision( array(
- 'title' => $page,
- 'id' => $row->ar_rev_id,
- 'comment' => $row->ar_comment,
- 'user' => $row->ar_user,
- 'user_text' => $row->ar_user_text,
- 'timestamp' => $row->ar_timestamp,
- 'minor_edit' => $row->ar_minor_edit,
- 'deleted' => $row->ar_deleted,
- ) );
+ 'title' => $page,
+ 'id' => $row->ar_rev_id,
+ 'comment' => $row->ar_comment,
+ 'user' => $row->ar_user,
+ 'user_text' => $row->ar_user_text,
+ 'timestamp' => $row->ar_timestamp,
+ 'minor_edit' => $row->ar_minor_edit,
+ 'deleted' => $row->ar_deleted,
+ ) );
$undelete = SpecialPage::getTitleFor( 'Undelete' );
@@ -168,7 +186,7 @@ class DeletedContribsPager extends IndexPager {
$user = $this->getUser();
- if( $user->isAllowed( 'deletedtext' ) ) {
+ if ( $user->isAllowed( 'deletedtext' ) ) {
$last = Linker::linkKnown(
$undelete,
$this->messages['diff'],
@@ -184,9 +202,10 @@ class DeletedContribsPager extends IndexPager {
}
$comment = Linker::revComment( $rev );
- $date = htmlspecialchars( $this->getLanguage()->userTimeAndDate( $rev->getTimestamp(), $user ) );
+ $date = $this->getLanguage()->userTimeAndDate( $rev->getTimestamp(), $user );
+ $date = htmlspecialchars( $date );
- if( !$user->isAllowed( 'undelete' ) || !$rev->userCan( Revision::DELETED_TEXT, $user ) ) {
+ if ( !$user->isAllowed( 'undelete' ) || !$rev->userCan( Revision::DELETED_TEXT, $user ) ) {
$link = $date; // unusable link
} else {
$link = Linker::linkKnown(
@@ -200,7 +219,7 @@ class DeletedContribsPager extends IndexPager {
);
}
// Style deleted items
- if( $rev->isDeleted( Revision::DELETED_TEXT ) ) {
+ if ( $rev->isDeleted( Revision::DELETED_TEXT ) ) {
$link = '<span class="history-deleted">' . $link . '</span>';
}
@@ -210,7 +229,7 @@ class DeletedContribsPager extends IndexPager {
array( 'class' => 'mw-changeslist-title' )
);
- if( $rev->isMinor() ) {
+ if ( $rev->isMinor() ) {
$mflag = ChangesList::flag( 'minor' );
} else {
$mflag = '';
@@ -218,7 +237,9 @@ class DeletedContribsPager extends IndexPager {
// Revision delete link
$del = Linker::getRevDeleteLink( $user, $rev, $page );
- if ( $del ) $del .= ' ';
+ if ( $del ) {
+ $del .= ' ';
+ }
$tools = Html::rawElement(
'span',
@@ -231,13 +252,14 @@ class DeletedContribsPager extends IndexPager {
$ret = "{$del}{$link} {$tools} {$separator} {$mflag} {$pagelink} {$comment}";
# Denote if username is redacted for this edit
- if( $rev->isDeleted( Revision::DELETED_USER ) ) {
+ if ( $rev->isDeleted( Revision::DELETED_USER ) ) {
$ret .= " <strong>" . $this->msg( 'rev-deleted-user-contribs' )->escaped() . "</strong>";
}
$ret = Html::rawElement( 'li', array(), $ret ) . "\n";
wfProfileOut( __METHOD__ );
+
return $ret;
}
@@ -254,7 +276,7 @@ class DeletedContribsPager extends IndexPager {
class DeletedContributionsPage extends SpecialPage {
function __construct() {
parent::__construct( 'DeletedContributions', 'deletedhistory',
- /*listed*/ true, /*function*/ false, /*file*/ false );
+ /*listed*/true, /*function*/false, /*file*/false );
}
/**
@@ -265,6 +287,7 @@ class DeletedContributionsPage extends SpecialPage {
*/
function execute( $par ) {
global $wgQueryPageDefaultLimit;
+
$this->setHeaders();
$this->outputHeader();
@@ -272,6 +295,7 @@ class DeletedContributionsPage extends SpecialPage {
if ( !$this->userCanExecute( $user ) ) {
$this->displayRestrictionError();
+
return;
}
@@ -289,6 +313,7 @@ class DeletedContributionsPage extends SpecialPage {
if ( !strlen( $target ) ) {
$out->addHTML( $this->getForm( '' ) );
+
return;
}
@@ -298,6 +323,7 @@ class DeletedContributionsPage extends SpecialPage {
$userObj = User::newFromName( $target, false );
if ( !$userObj ) {
$out->addHTML( $this->getForm( '' ) );
+
return;
}
$this->getSkin()->setRelevantUser( $userObj );
@@ -316,28 +342,33 @@ class DeletedContributionsPage extends SpecialPage {
$pager = new DeletedContribsPager( $this->getContext(), $target, $options['namespace'] );
if ( !$pager->getNumRows() ) {
$out->addWikiMsg( 'nocontribs' );
+
return;
}
# Show a message about slave lag, if applicable
$lag = wfGetLB()->safeGetLag( $pager->getDatabase() );
- if( $lag > 0 )
+ if ( $lag > 0 ) {
$out->showLagWarning( $lag );
+ }
$out->addHTML(
'<p>' . $pager->getNavigationBar() . '</p>' .
- $pager->getBody() .
- '<p>' . $pager->getNavigationBar() . '</p>' );
+ $pager->getBody() .
+ '<p>' . $pager->getNavigationBar() . '</p>' );
# If there were contributions, and it was a valid user or IP, show
# the appropriate "footer" message - WHOIS tools, etc.
- if( $target != 'newbies' ) {
- $message = IP::isIPAddress( $target )
- ? 'sp-contributions-footer-anon'
- : 'sp-contributions-footer';
-
- if( !$this->msg( $message )->isDisabled() ) {
- $out->wrapWikiMsg( "<div class='mw-contributions-footer'>\n$1\n</div>", array( $message, $target ) );
+ if ( $target != 'newbies' ) {
+ $message = IP::isIPAddress( $target ) ?
+ 'sp-contributions-footer-anon' :
+ 'sp-contributions-footer';
+
+ if ( !$this->msg( $message )->isDisabled() ) {
+ $out->wrapWikiMsg(
+ "<div class='mw-contributions-footer'>\n$1\n</div>",
+ array( $message, $target )
+ );
}
}
}
@@ -358,11 +389,12 @@ class DeletedContributionsPage extends SpecialPage {
$nt = $userObj->getUserPage();
$id = $userObj->getID();
$talk = $nt->getTalkPage();
- if( $talk ) {
+ if ( $talk ) {
# Talk page link
$tools[] = Linker::link( $talk, $this->msg( 'sp-contributions-talk' )->escaped() );
- if( ( $id !== null ) || ( $id === null && IP::isIPAddress( $nt->getText() ) ) ) {
- if( $this->getUser()->isAllowed( 'block' ) ) { # Block / Change block / Unblock links
+ if ( ( $id !== null ) || ( $id === null && IP::isIPAddress( $nt->getText() ) ) ) {
+ # Block / Change block / Unblock links
+ if ( $this->getUser()->isAllowed( 'block' ) ) {
if ( $userObj->isBlocked() ) {
$tools[] = Linker::linkKnown( # Change block link
SpecialPage::getTitleFor( 'Block', $nt->getDBkey() ),
@@ -377,8 +409,8 @@ class DeletedContributionsPage extends SpecialPage {
'ip' => $nt->getDBkey()
)
);
- }
- else { # User is not blocked
+ } else {
+ # User is not blocked
$tools[] = Linker::linkKnown( # Block link
SpecialPage::getTitleFor( 'Block', $nt->getDBkey() ),
$this->msg( 'blocklink' )->escaped()
@@ -419,7 +451,7 @@ class DeletedContributionsPage extends SpecialPage {
# Add a link to change user rights for privileged users
$userrightsPage = new UserrightsPage();
$userrightsPage->setContext( $this->getContext() );
- if( $userrightsPage->userCanChangeRights( $userObj ) ) {
+ if ( $userrightsPage->userCanChangeRights( $userObj ) ) {
$tools[] = Linker::linkKnown(
SpecialPage::getTitleFor( 'Userrights', $nt->getDBkey() ),
$this->msg( 'sp-contributions-userrights' )->escaped()
@@ -432,7 +464,8 @@ class DeletedContributionsPage extends SpecialPage {
// Show a note if the user is blocked and display the last block log entry.
if ( $userObj->isBlocked() ) {
- $out = $this->getOutput(); // LogEventsList::showLogExtract() wants the first parameter by ref
+ // LogEventsList::showLogExtract() wants the first parameter by ref
+ $out = $this->getOutput();
LogEventsList::showLogExtract(
$out,
'block',
@@ -451,16 +484,7 @@ class DeletedContributionsPage extends SpecialPage {
}
}
- // Old message 'contribsub' had one parameter, but that doesn't work for
- // languages that want to put the "for" bit right after $user but before
- // $links. If 'contribsub' is around, use it for reverse compatibility,
- // otherwise use 'contribsub2'.
- $oldMsg = $this->msg( 'contribsub' );
- if ( $oldMsg->exists() ) {
- return $oldMsg->rawParams( "$user ($links)" );
- } else {
- return $this->msg( 'contribsub2' )->rawParams( $user, $links );
- }
+ return $this->msg( 'contribsub2' )->rawParams( $user, $links )->params( $userObj->getName() );
}
/**
@@ -499,27 +523,38 @@ class DeletedContributionsPage extends SpecialPage {
$f .= "\t" . Html::hidden( $name, $value ) . "\n";
}
- $f .= Xml::openElement( 'fieldset' ) .
- Xml::element( 'legend', array(), $this->msg( 'sp-contributions-search' )->text() ) .
- Xml::tags( 'label', array( 'for' => 'target' ), $this->msg( 'sp-contributions-username' )->parse() ) . ' ' .
- Html::input( 'target', $options['target'], 'text', array(
+ $f .= Xml::openElement( 'fieldset' );
+ $f .= Xml::element( 'legend', array(), $this->msg( 'sp-contributions-search' )->text() );
+ $f .= Xml::tags(
+ 'label',
+ array( 'for' => 'target' ),
+ $this->msg( 'sp-contributions-username' )->parse()
+ ) . ' ';
+ $f .= Html::input(
+ 'target',
+ $options['target'],
+ 'text',
+ array(
'size' => '20',
'required' => ''
- ) + ( $options['target'] ? array() : array( 'autofocus' ) ) ) . ' '.
- Html::namespaceSelector(
- array(
- 'selected' => $options['namespace'],
- 'all' => '',
- 'label' => $this->msg( 'namespace' )->text()
- ), array(
- 'name' => 'namespace',
- 'id' => 'namespace',
- 'class' => 'namespaceselector',
- )
- ) . ' ' .
- Xml::submitButton( $this->msg( 'sp-contributions-submit' )->text() ) .
- Xml::closeElement( 'fieldset' ) .
- Xml::closeElement( 'form' );
+ ) + ( $options['target'] ? array() : array( 'autofocus' ) )
+ ) . ' ';
+ $f .= Html::namespaceSelector(
+ array(
+ 'selected' => $options['namespace'],
+ 'all' => '',
+ 'label' => $this->msg( 'namespace' )->text()
+ ),
+ array(
+ 'name' => 'namespace',
+ 'id' => 'namespace',
+ 'class' => 'namespaceselector',
+ )
+ ) . ' ';
+ $f .= Xml::submitButton( $this->msg( 'sp-contributions-submit' )->text() );
+ $f .= Xml::closeElement( 'fieldset' );
+ $f .= Xml::closeElement( 'form' );
+
return $f;
}
diff --git a/includes/specials/SpecialDisambiguations.php b/includes/specials/SpecialDisambiguations.php
deleted file mode 100644
index 2126ca52..00000000
--- a/includes/specials/SpecialDisambiguations.php
+++ /dev/null
@@ -1,165 +0,0 @@
-<?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 QueryPage {
-
- function __construct( $name = 'Disambiguations' ) {
- parent::__construct( $name );
- }
-
- function isExpensive() {
- return true;
- }
-
- function isSyndicated() {
- return false;
- }
-
- function getPageHeader() {
- return $this->msg( 'disambiguations-text' )->parseAsBlock();
- }
-
- /**
- * @return string|bool False on failure
- */
- function getQueryFromLinkBatch() {
- $dbr = wfGetDB( DB_SLAVE );
- $dMsgText = $this->msg( 'disambiguationspage' )->inContentLanguage()->text();
- $linkBatch = new LinkBatch;
-
- # If the text can be treated as a title, use it verbatim.
- # Otherwise, pull the titles from the links table
- $dp = Title::newFromText( $dMsgText );
- if( $dp ) {
- if( $dp->getNamespace() != NS_TEMPLATE ) {
- # @todo FIXME: We assume the disambiguation message is a template but
- # the page can potentially be from another namespace :/
- wfDebug( "Mediawiki:disambiguationspage message does not refer to a template!\n" );
- }
- $linkBatch->addObj( $dp );
- } else {
- # Get all the templates linked from the Mediawiki:Disambiguationspage
- $disPageObj = Title::makeTitleSafe( NS_MEDIAWIKI, 'disambiguationspage' );
- $res = $dbr->select(
- array( 'pagelinks', 'page' ),
- 'pl_title',
- array( 'page_id = pl_from',
- 'pl_namespace' => NS_TEMPLATE,
- 'page_namespace' => $disPageObj->getNamespace(),
- 'page_title' => $disPageObj->getDBkey()
- ), __METHOD__ );
-
- foreach ( $res as $row ) {
- $linkBatch->addObj( Title::makeTitle( NS_TEMPLATE, $row->pl_title ));
- }
- }
- $set = $linkBatch->constructSet( 'tl', $dbr );
-
- if( $set === false ) {
- # We must always return a valid SQL query, but this way
- # the DB will always quickly return an empty result
- $set = 'FALSE';
- wfDebug( "Mediawiki:disambiguationspage message does not link to any templates!\n" );
- }
- return $set;
- }
-
- function getQueryInfo() {
- // @todo FIXME: What are pagelinks and p2 doing here?
- return array (
- 'tables' => array(
- 'templatelinks',
- 'p1' => 'page',
- 'pagelinks',
- 'p2' => 'page'
- ),
- 'fields' => array(
- 'namespace' => 'p1.page_namespace',
- 'title' => 'p1.page_title',
- 'value' => 'pl_from'
- ),
- 'conds' => array(
- $this->getQueryFromLinkBatch(),
- 'p1.page_id = tl_from',
- 'pl_namespace = p1.page_namespace',
- 'pl_title = p1.page_title',
- 'p2.page_id = pl_from',
- 'p2.page_namespace' => MWNamespace::getContentNamespaces()
- )
- );
- }
-
- function getOrderFields() {
- return array( 'tl_namespace', 'tl_title', 'value' );
- }
-
- function sortDescending() {
- return false;
- }
-
- /**
- * Fetch links and cache their existence
- *
- * @param $db DatabaseBase
- * @param $res
- */
- function preprocessResults( $db, $res ) {
- if ( !$res->numRows() ) {
- return;
- }
-
- $batch = new LinkBatch;
- foreach ( $res as $row ) {
- $batch->add( $row->namespace, $row->title );
- }
- $batch->execute();
-
- $res->seek( 0 );
- }
-
- function formatResult( $skin, $result ) {
- $title = Title::newFromID( $result->value );
- $dp = Title::makeTitle( $result->namespace, $result->title );
-
- $from = Linker::link( $title );
- $edit = Linker::link(
- $title,
- $this->msg( 'parentheses', $this->msg( 'editlink' )->text() )->escaped(),
- array(),
- array( 'redirect' => 'no', 'action' => 'edit' )
- );
- $arr = $this->getLanguage()->getArrow();
- $to = Linker::link( $dp );
-
- return "$from $edit $arr $to";
- }
-
- protected function getGroupName() {
- return 'pages';
- }
-}
diff --git a/includes/specials/SpecialDoubleRedirects.php b/includes/specials/SpecialDoubleRedirects.php
index 5a5d749c..c364f70f 100644
--- a/includes/specials/SpecialDoubleRedirects.php
+++ b/includes/specials/SpecialDoubleRedirects.php
@@ -28,7 +28,6 @@
* @ingroup SpecialPage
*/
class DoubleRedirectsPage extends QueryPage {
-
function __construct( $name = 'DoubleRedirects' ) {
parent::__construct( $name );
}
@@ -52,8 +51,8 @@ class DoubleRedirectsPage extends QueryPage {
function reallyGetQueryInfo( $namespace = null, $title = null ) {
$limitToTitle = !( $namespace === null && $title === null );
$dbr = wfGetDB( DB_SLAVE );
- $retval = array (
- 'tables' => array (
+ $retval = array(
+ 'tables' => array(
'ra' => 'redirect',
'rb' => 'redirect',
'pa' => 'page',
@@ -91,10 +90,12 @@ class DoubleRedirectsPage extends QueryPage {
'rb.rd_from = pb.page_id',
)
);
+
if ( $limitToTitle ) {
$retval['conds']['pa.page_namespace'] = $namespace;
$retval['conds']['pa.page_title'] = $title;
}
+
return $retval;
}
@@ -103,9 +104,14 @@ class DoubleRedirectsPage extends QueryPage {
}
function getOrderFields() {
- return array ( 'ra.rd_namespace', 'ra.rd_title' );
+ return array( 'ra.rd_namespace', 'ra.rd_title' );
}
+ /**
+ * @param Skin $skin
+ * @param object $result Result row
+ * @return string
+ */
function formatResult( $skin, $result ) {
$titleA = Title::makeTitle( $result->namespace, $result->title );
@@ -116,10 +122,17 @@ class DoubleRedirectsPage extends QueryPage {
// using the filter of reallyGetQueryInfo.
if ( $result && !isset( $result->nsb ) ) {
$dbr = wfGetDB( DB_SLAVE );
- $qi = $this->reallyGetQueryInfo( $result->namespace,
- $result->title );
- $res = $dbr->select( $qi['tables'], $qi['fields'],
- $qi['conds'], __METHOD__ );
+ $qi = $this->reallyGetQueryInfo(
+ $result->namespace,
+ $result->title
+ );
+ $res = $dbr->select(
+ $qi['tables'],
+ $qi['fields'],
+ $qi['conds'],
+ __METHOD__
+ );
+
if ( $res ) {
$result = $dbr->fetchObject( $res );
}
@@ -160,7 +173,7 @@ class DoubleRedirectsPage extends QueryPage {
$lang = $this->getLanguage();
$arr = $lang->getArrow() . $lang->getDirMark();
- return( "{$linkA} {$edit} {$arr} {$linkB} {$arr} {$linkC}" );
+ return ( "{$linkA} {$edit} {$arr} {$linkB} {$arr} {$linkC}" );
}
protected function getGroupName() {
diff --git a/includes/specials/SpecialEditWatchlist.php b/includes/specials/SpecialEditWatchlist.php
index d2838e01..501552e9 100644
--- a/includes/specials/SpecialEditWatchlist.php
+++ b/includes/specials/SpecialEditWatchlist.php
@@ -35,7 +35,6 @@
* @author Rob Church <robchur@gmail.com>
*/
class SpecialEditWatchlist extends UnlistedSpecialPage {
-
/**
* Editing modes
*/
@@ -50,7 +49,7 @@ class SpecialEditWatchlist extends UnlistedSpecialPage {
private $badItems = array();
public function __construct() {
- parent::__construct( 'EditWatchlist' );
+ parent::__construct( 'EditWatchlist', 'editmywatchlist' );
}
/**
@@ -64,7 +63,7 @@ class SpecialEditWatchlist extends UnlistedSpecialPage {
$out = $this->getOutput();
# Anons don't get a watchlist
- if( $this->getUser()->isAnon() ) {
+ if ( $this->getUser()->isAnon() ) {
$out->setPageTitle( $this->msg( 'watchnologin' ) );
$llink = Linker::linkKnown(
SpecialPage::getTitleFor( 'Userlogin' ),
@@ -73,6 +72,7 @@ class SpecialEditWatchlist extends UnlistedSpecialPage {
array( 'returnto' => $this->getTitle()->getPrefixedText() )
);
$out->addHTML( $this->msg( 'watchlistanontext' )->rawParams( $llink )->parse() );
+
return;
}
@@ -81,20 +81,20 @@ class SpecialEditWatchlist extends UnlistedSpecialPage {
$this->outputHeader();
- $out->addSubtitle( $this->msg( 'watchlistfor2', $this->getUser()->getName()
- )->rawParams( SpecialEditWatchlist::buildTools( null ) ) );
+ $out->addSubtitle( $this->msg( 'watchlistfor2', $this->getUser()->getName() )
+ ->rawParams( SpecialEditWatchlist::buildTools( null ) ) );
# B/C: $mode used to be waaay down the parameter list, and the first parameter
# was $wgUser
- if( $mode instanceof User ) {
+ if ( $mode instanceof User ) {
$args = func_get_args();
- if( count( $args >= 4 ) ) {
+ if ( count( $args ) >= 4 ) {
$mode = $args[3];
}
}
$mode = self::getMode( $this->getRequest(), $mode );
- switch( $mode ) {
+ switch ( $mode ) {
case self::EDIT_CLEAR:
// The "Clear" link scared people too much.
// Pass on to the raw editor, from which it's very easy to clear.
@@ -102,7 +102,7 @@ class SpecialEditWatchlist extends UnlistedSpecialPage {
case self::EDIT_RAW:
$out->setPageTitle( $this->msg( 'watchlistedit-raw-title' ) );
$form = $this->getRawForm();
- if( $form->show() ) {
+ if ( $form->show() ) {
$out->addHTML( $this->successMessage );
$out->addReturnTo( SpecialPage::getTitleFor( 'Watchlist' ) );
}
@@ -112,7 +112,7 @@ class SpecialEditWatchlist extends UnlistedSpecialPage {
default:
$out->setPageTitle( $this->msg( 'watchlistedit-normal-title' ) );
$form = $this->getNormalForm();
- if( $form->show() ) {
+ if ( $form->show() ) {
$out->addHTML( $this->successMessage );
$out->addReturnTo( SpecialPage::getTitleFor( 'Watchlist' ) );
} elseif ( $this->toc !== false ) {
@@ -131,15 +131,17 @@ class SpecialEditWatchlist extends UnlistedSpecialPage {
*/
private function extractTitles( $list ) {
$list = explode( "\n", trim( $list ) );
- if( !is_array( $list ) ) {
+ if ( !is_array( $list ) ) {
return array();
}
+
$titles = array();
- foreach( $list as $text ) {
+
+ foreach ( $list as $text ) {
$text = trim( $text );
- if( strlen( $text ) > 0 ) {
+ if ( strlen( $text ) > 0 ) {
$title = Title::newFromText( $text );
- if( $title instanceof Title && $title->isWatchable() ) {
+ if ( $title instanceof Title && $title->isWatchable() ) {
$titles[] = $title;
}
}
@@ -148,9 +150,11 @@ class SpecialEditWatchlist extends UnlistedSpecialPage {
GenderCache::singleton()->doTitlesArray( $titles );
$list = array();
- foreach( $titles as $title ) {
+ /** @var Title $title */
+ foreach ( $titles as $title ) {
$list[] = $title->getPrefixedText();
}
+
return array_unique( $list );
}
@@ -158,44 +162,45 @@ class SpecialEditWatchlist extends UnlistedSpecialPage {
$wanted = $this->extractTitles( $data['Titles'] );
$current = $this->getWatchlist();
- if( count( $wanted ) > 0 ) {
+ if ( count( $wanted ) > 0 ) {
$toWatch = array_diff( $wanted, $current );
$toUnwatch = array_diff( $current, $wanted );
$this->watchTitles( $toWatch );
$this->unwatchTitles( $toUnwatch );
$this->getUser()->invalidateCache();
- if( count( $toWatch ) > 0 || count( $toUnwatch ) > 0 ) {
+ if ( count( $toWatch ) > 0 || count( $toUnwatch ) > 0 ) {
$this->successMessage = $this->msg( 'watchlistedit-raw-done' )->parse();
} else {
return false;
}
- if( count( $toWatch ) > 0 ) {
+ if ( count( $toWatch ) > 0 ) {
$this->successMessage .= ' ' . $this->msg( 'watchlistedit-raw-added'
- )->numParams( count( $toWatch ) )->parse();
+ )->numParams( count( $toWatch ) )->parse();
$this->showTitles( $toWatch, $this->successMessage );
}
- if( count( $toUnwatch ) > 0 ) {
+ if ( count( $toUnwatch ) > 0 ) {
$this->successMessage .= ' ' . $this->msg( 'watchlistedit-raw-removed'
- )->numParams( count( $toUnwatch ) )->parse();
+ )->numParams( count( $toUnwatch ) )->parse();
$this->showTitles( $toUnwatch, $this->successMessage );
}
} else {
$this->clearWatchlist();
$this->getUser()->invalidateCache();
- if( count( $current ) > 0 ) {
+ if ( count( $current ) > 0 ) {
$this->successMessage = $this->msg( 'watchlistedit-raw-done' )->parse();
} else {
return false;
}
- $this->successMessage .= ' ' . $this->msg( 'watchlistedit-raw-removed'
- )->numParams( count( $current ) )->parse();
+ $this->successMessage .= ' ' . $this->msg( 'watchlistedit-raw-removed' )
+ ->numParams( count( $current ) )->parse();
$this->showTitles( $current, $this->successMessage );
}
+
return true;
}
@@ -212,29 +217,35 @@ class SpecialEditWatchlist extends UnlistedSpecialPage {
$talk = $this->msg( 'talkpagelinktext' )->escaped();
// Do a batch existence check
$batch = new LinkBatch();
- foreach( $titles as $title ) {
- if( !$title instanceof Title ) {
+ foreach ( $titles as $title ) {
+ if ( !$title instanceof Title ) {
$title = Title::newFromText( $title );
}
- if( $title instanceof Title ) {
+
+ if ( $title instanceof Title ) {
$batch->addObj( $title );
$batch->addObj( $title->getTalkPage() );
}
}
+
$batch->execute();
+
// Print out the list
$output .= "<ul>\n";
- foreach( $titles as $title ) {
- if( !$title instanceof Title ) {
+
+ foreach ( $titles as $title ) {
+ if ( !$title instanceof Title ) {
$title = Title::newFromText( $title );
}
- if( $title instanceof Title ) {
+
+ if ( $title instanceof Title ) {
$output .= "<li>"
. Linker::link( $title )
. ' (' . Linker::link( $title->getTalkPage(), $talk )
. ")</li>\n";
}
}
+
$output .= "</ul>\n";
}
@@ -247,6 +258,7 @@ class SpecialEditWatchlist extends UnlistedSpecialPage {
private function getWatchlist() {
$list = array();
$dbr = wfGetDB( DB_MASTER );
+
$res = $dbr->select(
'watchlist',
array(
@@ -256,10 +268,12 @@ class SpecialEditWatchlist extends UnlistedSpecialPage {
),
__METHOD__
);
- if( $res->numRows() > 0 ) {
+
+ if ( $res->numRows() > 0 ) {
$titles = array();
foreach ( $res as $row ) {
$title = Title::makeTitleSafe( $row->wl_namespace, $row->wl_title );
+
if ( $this->checkTitle( $title, $row->wl_namespace, $row->wl_title )
&& !$title->isTalkPage()
) {
@@ -270,11 +284,13 @@ class SpecialEditWatchlist extends UnlistedSpecialPage {
GenderCache::singleton()->doTitlesArray( $titles );
- foreach( $titles as $title ) {
+ foreach ( $titles as $title ) {
$list[] = $title->getPrefixedText();
}
}
+
$this->cleanupWatchlist();
+
return $list;
}
@@ -297,6 +313,7 @@ class SpecialEditWatchlist extends UnlistedSpecialPage {
);
$lb = new LinkBatch();
+
foreach ( $res as $row ) {
$lb->add( $row->wl_namespace, $row->wl_title );
if ( !MWNamespace::isTalk( $row->wl_namespace ) ) {
@@ -305,6 +322,7 @@ class SpecialEditWatchlist extends UnlistedSpecialPage {
}
$lb->execute();
+
return $titles;
}
@@ -324,12 +342,14 @@ class SpecialEditWatchlist extends UnlistedSpecialPage {
) {
$title = false; // unrecoverable
}
+
if ( !$title
|| $title->getNamespace() != $namespace
|| $title->getDBkey() != $dbKey
) {
$this->badItems[] = array( $title, $namespace, $dbKey );
}
+
return (bool)$title;
}
@@ -337,16 +357,17 @@ class SpecialEditWatchlist extends UnlistedSpecialPage {
* Attempts to clean up broken items
*/
private function cleanupWatchlist() {
- if( !count( $this->badItems ) ) {
+ if ( !count( $this->badItems ) ) {
return; //nothing to do
}
+
$dbw = wfGetDB( DB_MASTER );
$user = $this->getUser();
+
foreach ( $this->badItems as $row ) {
list( $title, $namespace, $dbKey ) = $row;
- wfDebug( "User {$user->getName()} has broken watchlist item ns($namespace):$dbKey, "
- . ( $title ? 'cleaning up' : 'deleting' ) . ".\n"
- );
+ $action = $title ? 'cleaning up' : 'deleting';
+ wfDebug( "User {$user->getName()} has broken watchlist item ns($namespace):$dbKey, $action.\n" );
$dbw->delete( 'watchlist',
array(
@@ -387,11 +408,13 @@ class SpecialEditWatchlist extends UnlistedSpecialPage {
private function watchTitles( $titles ) {
$dbw = wfGetDB( DB_MASTER );
$rows = array();
- foreach( $titles as $title ) {
- if( !$title instanceof Title ) {
+
+ foreach ( $titles as $title ) {
+ if ( !$title instanceof Title ) {
$title = Title::newFromText( $title );
}
- if( $title instanceof Title ) {
+
+ if ( $title instanceof Title ) {
$rows[] = array(
'wl_user' => $this->getUser()->getId(),
'wl_namespace' => MWNamespace::getSubject( $title->getNamespace() ),
@@ -406,6 +429,7 @@ class SpecialEditWatchlist extends UnlistedSpecialPage {
);
}
}
+
$dbw->insert( 'watchlist', $rows, __METHOD__, 'IGNORE' );
}
@@ -419,11 +443,13 @@ class SpecialEditWatchlist extends UnlistedSpecialPage {
*/
private function unwatchTitles( $titles ) {
$dbw = wfGetDB( DB_MASTER );
- foreach( $titles as $title ) {
- if( !$title instanceof Title ) {
+
+ foreach ( $titles as $title ) {
+ if ( !$title instanceof Title ) {
$title = Title::newFromText( $title );
}
- if( $title instanceof Title ) {
+
+ if ( $title instanceof Title ) {
$dbw->delete(
'watchlist',
array(
@@ -433,6 +459,7 @@ class SpecialEditWatchlist extends UnlistedSpecialPage {
),
__METHOD__
);
+
$dbw->delete(
'watchlist',
array(
@@ -442,6 +469,7 @@ class SpecialEditWatchlist extends UnlistedSpecialPage {
),
__METHOD__
);
+
$page = WikiPage::factory( $title );
wfRunHooks( 'UnwatchArticleComplete', array( $this->getUser(), &$page ) );
}
@@ -451,15 +479,16 @@ class SpecialEditWatchlist extends UnlistedSpecialPage {
public function submitNormal( $data ) {
$removed = array();
- foreach( $data as $titles ) {
+ foreach ( $data as $titles ) {
$this->unwatchTitles( $titles );
$removed = array_merge( $removed, $titles );
}
- if( count( $removed ) > 0 ) {
+ if ( count( $removed ) > 0 ) {
$this->successMessage = $this->msg( 'watchlistedit-normal-done'
- )->numParams( count( $removed ) )->parse();
+ )->numParams( count( $removed ) )->parse();
$this->showTitles( $removed, $this->successMessage );
+
return true;
} else {
return false;
@@ -477,7 +506,7 @@ class SpecialEditWatchlist extends UnlistedSpecialPage {
$fields = array();
$count = 0;
- foreach( $this->getWatchlistInfo() as $namespace => $pages ) {
+ foreach ( $this->getWatchlistInfo() as $namespace => $pages ) {
if ( $namespace >= 0 ) {
$fields['TitlesNs' . $namespace] = array(
'class' => 'EditWatchlistCheckboxSeriesField',
@@ -486,8 +515,9 @@ class SpecialEditWatchlist extends UnlistedSpecialPage {
);
}
- foreach( array_keys( $pages ) as $dbkey ) {
+ foreach ( array_keys( $pages ) as $dbkey ) {
$title = Title::makeTitleSafe( $namespace, $dbkey );
+
if ( $this->checkTitle( $title, $namespace, $dbkey ) ) {
$text = $this->buildRemoveLine( $title );
$fields['TitlesNs' . $namespace]['options'][$text] = $title->getPrefixedText();
@@ -500,30 +530,33 @@ class SpecialEditWatchlist extends UnlistedSpecialPage {
if ( count( $fields ) > 1 && $count > 30 ) {
$this->toc = Linker::tocIndent();
$tocLength = 0;
- foreach( $fields as $data ) {
+ foreach ( $fields as $data ) {
# strip out the 'ns' prefix from the section name:
$ns = substr( $data['section'], 2 );
- $nsText = ($ns == NS_MAIN)
+ $nsText = ( $ns == NS_MAIN )
? $this->msg( 'blanknamespace' )->escaped()
: htmlspecialchars( $wgContLang->getFormattedNsText( $ns ) );
$this->toc .= Linker::tocLine( "editwatchlist-{$data['section']}", $nsText,
$this->getLanguage()->formatNum( ++$tocLength ), 1 ) . Linker::tocLineEnd();
}
+
$this->toc = Linker::tocList( $this->toc );
} else {
$this->toc = false;
}
- $form = new EditWatchlistNormalHTMLForm( $fields, $this->getContext() );
- $form->setTitle( $this->getTitle() );
+ $context = new DerivativeContext( $this->getContext() );
+ $context->setTitle( $this->getTitle() ); // Remove subpage
+ $form = new EditWatchlistNormalHTMLForm( $fields, $context );
$form->setSubmitTextMsg( 'watchlistedit-normal-submit' );
# Used message keys: 'accesskey-watchlistedit-normal-submit', 'tooltip-watchlistedit-normal-submit'
$form->setSubmitTooltip( 'watchlistedit-normal-submit' );
$form->setWrapperLegendMsg( 'watchlistedit-normal-legend' );
$form->addHeaderText( $this->msg( 'watchlistedit-normal-explain' )->parse() );
$form->setSubmitCallback( array( $this, 'submitNormal' ) );
+
return $form;
}
@@ -535,12 +568,15 @@ class SpecialEditWatchlist extends UnlistedSpecialPage {
*/
private function buildRemoveLine( $title ) {
$link = Linker::link( $title );
- if( $title->isRedirect() ) {
+
+ if ( $title->isRedirect() ) {
// Linker already makes class mw-redirect, so this is redundant
$link = '<span class="watchlistredir">' . $link . '</span>';
}
+
$tools[] = Linker::link( $title->getTalkPage(), $this->msg( 'talkpagelinktext' )->escaped() );
- if( $title->exists() ) {
+
+ if ( $title->exists() ) {
$tools[] = Linker::linkKnown(
$title,
$this->msg( 'history_short' )->escaped(),
@@ -548,7 +584,8 @@ class SpecialEditWatchlist extends UnlistedSpecialPage {
array( 'action' => 'history' )
);
}
- if( $title->getNamespace() == NS_USER && !$title->isSubpage() ) {
+
+ if ( $title->getNamespace() == NS_USER && !$title->isSubpage() ) {
$tools[] = Linker::linkKnown(
SpecialPage::getTitleFor( 'Contributions', $title->getText() ),
$this->msg( 'contributions' )->escaped()
@@ -574,14 +611,16 @@ class SpecialEditWatchlist extends UnlistedSpecialPage {
'default' => $titles,
),
);
- $form = new HTMLForm( $fields, $this->getContext() );
- $form->setTitle( $this->getTitle( 'raw' ) );
+ $context = new DerivativeContext( $this->getContext() );
+ $context->setTitle( $this->getTitle( 'raw' ) ); // Reset subpage
+ $form = new HTMLForm( $fields, $context );
$form->setSubmitTextMsg( 'watchlistedit-raw-submit' );
# Used message keys: 'accesskey-watchlistedit-raw-submit', 'tooltip-watchlistedit-raw-submit'
$form->setSubmitTooltip( 'watchlistedit-raw-submit' );
$form->setWrapperLegendMsg( 'watchlistedit-raw-legend' );
$form->addHeaderText( $this->msg( 'watchlistedit-raw-explain' )->parse() );
$form->setSubmitCallback( array( $this, 'submitRaw' ) );
+
return $form;
}
@@ -595,19 +634,17 @@ class SpecialEditWatchlist extends UnlistedSpecialPage {
*/
public static function getMode( $request, $par ) {
$mode = strtolower( $request->getVal( 'action', $par ) );
- switch( $mode ) {
+
+ switch ( $mode ) {
case 'clear':
case self::EDIT_CLEAR:
return self::EDIT_CLEAR;
-
case 'raw':
case self::EDIT_RAW:
return self::EDIT_RAW;
-
case 'edit':
case self::EDIT_NORMAL:
return self::EDIT_NORMAL;
-
default:
return false;
}
@@ -629,21 +666,26 @@ class SpecialEditWatchlist extends UnlistedSpecialPage {
'edit' => array( 'EditWatchlist', false ),
'raw' => array( 'EditWatchlist', 'raw' ),
);
- foreach( $modes as $mode => $arr ) {
+
+ foreach ( $modes as $mode => $arr ) {
// can use messages 'watchlisttools-view', 'watchlisttools-edit', 'watchlisttools-raw'
$tools[] = Linker::linkKnown(
SpecialPage::getTitleFor( $arr[0], $arr[1] ),
wfMessage( "watchlisttools-{$mode}" )->escaped()
);
}
- return Html::rawElement( 'span',
- array( 'class' => 'mw-watchlist-toollinks' ),
- wfMessage( 'parentheses', $wgLang->pipeList( $tools ) )->text() );
+
+ return Html::rawElement(
+ 'span',
+ array( 'class' => 'mw-watchlist-toollinks' ),
+ wfMessage( 'parentheses', $wgLang->pipeList( $tools ) )->text()
+ );
}
}
# B/C since 1.18
-class WatchlistEditor extends SpecialEditWatchlist {}
+class WatchlistEditor extends SpecialEditWatchlist {
+}
/**
* Extend HTMLForm purely so we can have a more sane way of getting the section headers
@@ -651,10 +693,12 @@ class WatchlistEditor extends SpecialEditWatchlist {}
class EditWatchlistNormalHTMLForm extends HTMLForm {
public function getLegend( $namespace ) {
$namespace = substr( $namespace, 2 );
+
return $namespace == NS_MAIN
? $this->msg( 'blanknamespace' )->escaped()
: htmlspecialchars( $this->getContext()->getLanguage()->getFormattedNsText( $namespace ) );
}
+
public function getBody() {
return $this->displaySection( $this->mFieldTree, '', 'editwatchlist-' );
}
diff --git a/includes/specials/SpecialEmailuser.php b/includes/specials/SpecialEmailuser.php
index b5ad589e..2e90d996 100644
--- a/includes/specials/SpecialEmailuser.php
+++ b/includes/specials/SpecialEmailuser.php
@@ -29,13 +29,18 @@
class SpecialEmailUser extends UnlistedSpecialPage {
protected $mTarget;
+ /**
+ * @var User|string $mTargetObj
+ */
+ protected $mTargetObj;
+
public function __construct() {
parent::__construct( 'Emailuser' );
}
public function getDescription() {
$target = self::getTarget( $this->mTarget );
- if( !$target instanceof User ) {
+ if ( !$target instanceof User ) {
return $this->msg( 'emailuser-title-notarget' )->text();
}
@@ -106,7 +111,11 @@ class SpecialEmailUser extends UnlistedSpecialPage {
$this->outputHeader();
// error out if sending user cannot do this
- $error = self::getPermissionsError( $this->getUser(), $this->getRequest()->getVal( 'wpEditToken' ) );
+ $error = self::getPermissionsError(
+ $this->getUser(),
+ $this->getRequest()->getVal( 'wpEditToken' )
+ );
+
switch ( $error ) {
case null:
# Wahey!
@@ -119,43 +128,45 @@ class SpecialEmailUser extends UnlistedSpecialPage {
throw new ThrottledError;
case 'mailnologin':
case 'usermaildisabled':
- throw new ErrorPageError( $error, "{$error}text" );
+ throw new ErrorPageError( $error, "{$error}text" );
default:
# It's a hook error
list( $title, $msg, $params ) = $error;
- throw new ErrorPageError( $title, $msg, $params );
+ throw new ErrorPageError( $title, $msg, $params );
}
// Got a valid target user name? Else ask for one.
$ret = self::getTarget( $this->mTarget );
- if( !$ret instanceof User ) {
- if( $this->mTarget != '' ) {
+ if ( !$ret instanceof User ) {
+ if ( $this->mTarget != '' ) {
$ret = ( $ret == 'notarget' ) ? 'emailnotarget' : ( $ret . 'text' );
$out->wrapWikiMsg( "<p class='error'>$1</p>", $ret );
}
$out->addHTML( $this->userForm( $this->mTarget ) );
+
return false;
}
$this->mTargetObj = $ret;
- $form = new HTMLForm( $this->getFormFields(), $this->getContext() );
+ $context = new DerivativeContext( $this->getContext() );
+ $context->setTitle( $this->getTitle() ); // Remove subpage
+ $form = new HTMLForm( $this->getFormFields(), $context );
// By now we are supposed to be sure that $this->mTarget is a user name
$form->addPreText( $this->msg( 'emailpagetext', $this->mTarget )->parse() );
$form->setSubmitTextMsg( 'emailsend' );
- $form->setTitle( $this->getTitle() );
$form->setSubmitCallback( array( __CLASS__, 'uiSubmit' ) );
$form->setWrapperLegendMsg( 'email-legend' );
$form->loadData();
- if( !wfRunHooks( 'EmailUserForm', array( &$form ) ) ) {
+ if ( !wfRunHooks( 'EmailUserForm', array( &$form ) ) ) {
return false;
}
$result = $form->show();
- if( $result === true || ( $result instanceof Status && $result->isGood() ) ) {
+ if ( $result === true || ( $result instanceof Status && $result->isGood() ) ) {
$out->setPageTitle( $this->msg( 'emailsent' ) );
- $out->addWikiMsg( 'emailsenttext' );
+ $out->addWikiMsg( 'emailsenttext', $this->mTarget );
$out->returnToMain( false, $this->mTargetObj->getUserPage() );
}
}
@@ -169,18 +180,22 @@ class SpecialEmailUser extends UnlistedSpecialPage {
public static function getTarget( $target ) {
if ( $target == '' ) {
wfDebug( "Target is empty.\n" );
+
return 'notarget';
}
$nu = User::newFromName( $target );
- if( !$nu instanceof User || !$nu->getId() ) {
+ if ( !$nu instanceof User || !$nu->getId() ) {
wfDebug( "Target is invalid user.\n" );
+
return 'notarget';
} elseif ( !$nu->isEmailConfirmed() ) {
wfDebug( "User has no valid email.\n" );
+
return 'noemail';
} elseif ( !$nu->canReceiveEmail() ) {
wfDebug( "User does not allow user emails.\n" );
+
return 'nowikiemail';
}
@@ -196,31 +211,36 @@ class SpecialEmailUser extends UnlistedSpecialPage {
*/
public static function getPermissionsError( $user, $editToken ) {
global $wgEnableEmail, $wgEnableUserEmail;
- if( !$wgEnableEmail || !$wgEnableUserEmail ) {
+
+ if ( !$wgEnableEmail || !$wgEnableUserEmail ) {
return 'usermaildisabled';
}
- if( !$user->isAllowed( 'sendemail' ) ) {
+ if ( !$user->isAllowed( 'sendemail' ) ) {
return 'badaccess';
}
- if( !$user->isEmailConfirmed() ) {
+ if ( !$user->isEmailConfirmed() ) {
return 'mailnologin';
}
- if( $user->isBlockedFromEmailuser() ) {
+ if ( $user->isBlockedFromEmailuser() ) {
wfDebug( "User is blocked from sending e-mail.\n" );
+
return "blockedemailuser";
}
- if( $user->pingLimiter( 'emailuser' ) ) {
+ if ( $user->pingLimiter( 'emailuser' ) ) {
wfDebug( "Ping limiter triggered.\n" );
+
return 'actionthrottledtext';
}
$hookErr = false;
+
wfRunHooks( 'UserCanSendEmail', array( &$user, &$hookErr ) );
wfRunHooks( 'EmailUserPermissionsErrors', array( $user, $editToken, &$hookErr ) );
+
if ( $hookErr ) {
return $hookErr;
}
@@ -236,14 +256,25 @@ class SpecialEmailUser extends UnlistedSpecialPage {
*/
protected function userForm( $name ) {
global $wgScript;
- $string = Xml::openElement( 'form', array( 'method' => 'get', 'action' => $wgScript, 'id' => 'askusername' ) ) .
+ $string = Xml::openElement(
+ 'form',
+ array( 'method' => 'get', 'action' => $wgScript, 'id' => 'askusername' )
+ ) .
Html::hidden( 'title', $this->getTitle()->getPrefixedText() ) .
Xml::openElement( 'fieldset' ) .
Html::rawElement( 'legend', null, $this->msg( 'emailtarget' )->parse() ) .
- Xml::inputLabel( $this->msg( 'emailusername' )->text(), 'target', 'emailusertarget', 30, $name ) . ' ' .
+ Xml::inputLabel(
+ $this->msg( 'emailusername' )->text(),
+ 'target',
+ 'emailusertarget',
+ 30,
+ $name
+ ) .
+ ' ' .
Xml::submitButton( $this->msg( 'emailusernamesubmit' )->text() ) .
Xml::closeElement( 'fieldset' ) .
Xml::closeElement( 'form' ) . "\n";
+
return $string;
}
@@ -264,6 +295,8 @@ class SpecialEmailUser extends UnlistedSpecialPage {
* getPermissionsError(). It is probably also a good
* idea to check the edit token and ping limiter in advance.
*
+ * @param array $data
+ * @param IContextSource $context
* @return Mixed: Status object, or potentially a String on error
* or maybe even true on success if anything uses the EmailUser hook.
*/
@@ -271,9 +304,10 @@ class SpecialEmailUser extends UnlistedSpecialPage {
global $wgUserEmailUseReplyTo;
$target = self::getTarget( $data['Target'] );
- if( !$target instanceof User ) {
+ if ( !$target instanceof User ) {
return $context->msg( $target . 'text' )->parseAsBlock();
}
+
$to = new MailAddress( $target );
$from = new MailAddress( $context->getUser() );
$subject = $data['Subject'];
@@ -285,11 +319,11 @@ class SpecialEmailUser extends UnlistedSpecialPage {
$from->name, $to->name )->inContentLanguage()->text();
$error = '';
- if( !wfRunHooks( 'EmailUser', array( &$to, &$from, &$subject, &$text, &$error ) ) ) {
+ if ( !wfRunHooks( 'EmailUser', array( &$to, &$from, &$subject, &$text, &$error ) ) ) {
return $error;
}
- if( $wgUserEmailUseReplyTo ) {
+ if ( $wgUserEmailUseReplyTo ) {
// Put the generic wiki autogenerated address in the From:
// header and reserve the user for Reply-To.
//
@@ -297,6 +331,7 @@ class SpecialEmailUser extends UnlistedSpecialPage {
// 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 {
@@ -319,7 +354,7 @@ class SpecialEmailUser extends UnlistedSpecialPage {
$status = UserMailer::send( $to, $mailFrom, $subject, $text, $replyTo );
- if( !$status->isGood() ) {
+ if ( !$status->isGood() ) {
return $status;
} else {
// if the user requested a copy of this mail, do this now,
@@ -334,6 +369,7 @@ class SpecialEmailUser extends UnlistedSpecialPage {
}
wfRunHooks( 'EmailUserComplete', array( $to, $from, $subject, $text ) );
+
return $status;
}
}
diff --git a/includes/specials/SpecialExport.php b/includes/specials/SpecialExport.php
index 7abfefe2..61ed34d4 100644
--- a/includes/specials/SpecialExport.php
+++ b/includes/specials/SpecialExport.php
@@ -29,7 +29,6 @@
* @ingroup SpecialPage
*/
class SpecialExport extends SpecialPage {
-
private $curonly, $doExport, $pageLinkDepth, $templates;
private $images;
@@ -75,8 +74,7 @@ class SpecialExport extends SpecialPage {
}
}
}
- }
- elseif( $request->getCheck( 'addns' ) && $wgExportFromNamespaces ) {
+ } elseif ( $request->getCheck( 'addns' ) && $wgExportFromNamespaces ) {
$page = $request->getText( 'pages' );
$nsindex = $request->getText( 'nsindex', '' );
@@ -89,8 +87,7 @@ class SpecialExport extends SpecialPage {
$page .= "\n" . implode( "\n", $nspages );
}
}
- }
- elseif( $request->getCheck( 'exportall' ) && $wgExportAllowAll ) {
+ } elseif ( $request->getCheck( 'exportall' ) && $wgExportAllowAll ) {
$this->doExport = true;
$exportall = true;
@@ -100,13 +97,12 @@ class SpecialExport extends SpecialPage {
doExport(...) further down) */
$page = '';
$history = '';
- }
- elseif( $request->wasPosted() && $par == '' ) {
+ } elseif ( $request->wasPosted() && $par == '' ) {
$page = $request->getText( 'pages' );
$this->curonly = $request->getCheck( 'curonly' );
$rawOffset = $request->getVal( 'offset' );
- if( $rawOffset ) {
+ if ( $rawOffset ) {
$offset = wfTimestamp( TS_MW, $rawOffset );
} else {
$offset = null;
@@ -127,15 +123,17 @@ class SpecialExport extends SpecialPage {
if ( $limit > 0 && ( $wgExportMaxHistory == 0 || $limit < $wgExportMaxHistory ) ) {
$history['limit'] = $limit;
}
+
if ( !is_null( $offset ) ) {
$history['offset'] = $offset;
}
+
if ( strtolower( $dir ) == 'desc' ) {
$history['dir'] = 'desc';
}
}
- if( $page != '' ) {
+ if ( $page != '' ) {
$this->doExport = true;
}
} else {
@@ -143,18 +141,18 @@ class SpecialExport extends SpecialPage {
$page = $request->getText( 'pages', $par );
$historyCheck = $request->getCheck( 'history' );
- if( $historyCheck ) {
+ if ( $historyCheck ) {
$history = WikiExporter::FULL;
} else {
$history = WikiExporter::CURRENT;
}
- if( $page != '' ) {
+ if ( $page != '' ) {
$this->doExport = true;
}
}
- if( !$wgExportAllowHistory ) {
+ if ( !$wgExportAllowHistory ) {
// Override
$history = WikiExporter::CURRENT;
}
@@ -172,7 +170,7 @@ class SpecialExport extends SpecialPage {
wfResetOutputBuffers();
$request->response()->header( "Content-type: application/xml; charset=utf-8" );
- if( $request->getCheck( 'wpDownload' ) ) {
+ if ( $request->getCheck( 'wpDownload' ) ) {
// Provide a sane filename suggestion
$filename = urlencode( $wgSitename . '-' . wfTimestampNow() . '.xml' );
$request->response()->header( "Content-disposition: attachment;filename={$filename}" );
@@ -187,9 +185,17 @@ class SpecialExport extends SpecialPage {
$out->addWikiMsg( 'exporttext' );
$form = Xml::openElement( 'form', array( 'method' => 'post',
- 'action' => $this->getTitle()->getLocalUrl( 'action=submit' ) ) );
- $form .= Xml::inputLabel( $this->msg( 'export-addcattext' )->text(), 'catname', 'catname', 40 ) . '&#160;';
- $form .= Xml::submitButton( $this->msg( 'export-addcat' )->text(), array( 'name' => 'addcat' ) ) . '<br />';
+ 'action' => $this->getTitle()->getLocalURL( 'action=submit' ) ) );
+ $form .= Xml::inputLabel(
+ $this->msg( 'export-addcattext' )->text(),
+ 'catname',
+ 'catname',
+ 40
+ ) . '&#160;';
+ $form .= Xml::submitButton(
+ $this->msg( 'export-addcat' )->text(),
+ array( 'name' => 'addcat' )
+ ) . '<br />';
if ( $wgExportFromNamespaces ) {
$form .= Html::namespaceSelector(
@@ -197,12 +203,15 @@ class SpecialExport extends SpecialPage {
'selected' => $nsindex,
'label' => $this->msg( 'export-addnstext' )->text()
), array(
- 'name' => 'nsindex',
- 'id' => 'namespace',
+ 'name' => 'nsindex',
+ 'id' => 'namespace',
'class' => 'namespaceselector',
)
) . '&#160;';
- $form .= Xml::submitButton( $this->msg( 'export-addns' )->text(), array( 'name' => 'addns' ) ) . '<br />';
+ $form .= Xml::submitButton(
+ $this->msg( 'export-addns' )->text(),
+ array( 'name' => 'addns' )
+ ) . '<br />';
}
if ( $wgExportAllowAll ) {
@@ -214,10 +223,15 @@ class SpecialExport extends SpecialPage {
) . '<br />';
}
- $form .= Xml::element( 'textarea', array( 'name' => 'pages', 'cols' => 40, 'rows' => 10 ), $page, false );
+ $form .= Xml::element(
+ 'textarea',
+ array( 'name' => 'pages', 'cols' => 40, 'rows' => 10 ),
+ $page,
+ false
+ );
$form .= '<br />';
- if( $wgExportAllowHistory ) {
+ if ( $wgExportAllowHistory ) {
$form .= Xml::checkLabel(
$this->msg( 'exportcuronly' )->text(),
'curonly',
@@ -235,9 +249,16 @@ class SpecialExport extends SpecialPage {
$request->wasPosted() ? $request->getCheck( 'templates' ) : false
) . '<br />';
- if( $wgExportMaxLinkDepth || $this->userCanOverrideExportDepth() ) {
- $form .= Xml::inputLabel( $this->msg( 'export-pagelinks' )->text(), 'pagelink-depth', 'pagelink-depth', 20, 0 ) . '<br />';
+ if ( $wgExportMaxLinkDepth || $this->userCanOverrideExportDepth() ) {
+ $form .= Xml::inputLabel(
+ $this->msg( 'export-pagelinks' )->text(),
+ 'pagelink-depth',
+ 'pagelink-depth',
+ 20,
+ 0
+ ) . '<br />';
}
+
// Enable this when we can do something useful exporting/importing image information. :)
//$form .= Xml::checkLabel( $this->msg( 'export-images' )->text(), 'images', 'wpExportImages', false ) . '<br />';
$form .= Xml::checkLabel(
@@ -256,7 +277,10 @@ class SpecialExport extends SpecialPage {
) . '<br />';
}
- $form .= Xml::submitButton( $this->msg( 'export-submit' )->text(), Linker::tooltipAndAccesskeyAttribs( 'export' ) );
+ $form .= Xml::submitButton(
+ $this->msg( 'export-submit' )->text(),
+ Linker::tooltipAndAccesskeyAttribs( 'export' )
+ );
$form .= Xml::closeElement( 'form' );
$out->addHTML( $form );
@@ -288,10 +312,10 @@ class SpecialExport extends SpecialPage {
$pageSet = array(); // Inverted index of all pages to look up
// Split up and normalize input
- foreach( explode( "\n", $page ) as $pageName ) {
+ foreach ( explode( "\n", $page ) as $pageName ) {
$pageName = trim( $pageName );
$title = Title::newFromText( $pageName );
- if( $title && $title->getInterwiki() == '' && $title->getText() !== '' ) {
+ if ( $title && $title->getInterwiki() == '' && $title->getText() !== '' ) {
// Only record each page once!
$pageSet[$title->getPrefixedText()] = true;
}
@@ -301,25 +325,23 @@ class SpecialExport extends SpecialPage {
$inputPages = array_keys( $pageSet );
// Look up any linked pages if asked...
- if( $this->templates ) {
+ if ( $this->templates ) {
$pageSet = $this->getTemplates( $inputPages, $pageSet );
}
$linkDepth = $this->pageLinkDepth;
- if( $linkDepth ) {
+ 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 );
- }
- */
+ // 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 ) {
+ foreach ( $pages as $k => $v ) {
$pages[$k] = str_replace( " ", "_", $v );
}
@@ -327,7 +349,7 @@ class SpecialExport extends SpecialPage {
}
/* Ok, let's get to it... */
- if( $history == WikiExporter::CURRENT ) {
+ if ( $history == WikiExporter::CURRENT ) {
$lb = false;
$db = wfGetDB( DB_SLAVE );
$buffer = WikiExporter::BUFFER;
@@ -350,26 +372,17 @@ class SpecialExport extends SpecialPage {
if ( $exportall ) {
$exporter->allPages();
} else {
- foreach( $pages as $page ) {
- /*
- if( $wgExportMaxHistory && !$this->curonly ) {
- $title = Title::newFromText( $page );
- if( $title ) {
- $count = Revision::countByTitle( $db, $title );
- if( $count > $wgExportMaxHistory ) {
- wfDebug( __FUNCTION__ .
- ": Skipped $page, $count revisions too big\n" );
- continue;
- }
- }
- }*/
- #Bug 8824: Only export pages the user can read
+ foreach ( $pages as $page ) {
+ #Bug 8824: Only export pages the user can read
$title = Title::newFromText( $page );
- if( is_null( $title ) ) {
- continue; #TODO: perhaps output an <error> tag or something.
+ if ( is_null( $title ) ) {
+ // @todo Perhaps output an <error> tag or something.
+ continue;
}
- if( !$title->userCan( 'read', $this->getUser() ) ) {
- continue; #TODO: perhaps output an <error> tag or something.
+
+ if ( !$title->userCan( 'read', $this->getUser() ) ) {
+ // @todo Perhaps output an <error> tag or something.
+ continue;
}
$exporter->pageByTitle( $title );
@@ -378,7 +391,7 @@ class SpecialExport extends SpecialPage {
$exporter->closeStream();
- if( $lb ) {
+ if ( $lb ) {
$lb->closeAll();
}
}
@@ -412,6 +425,7 @@ class SpecialExport extends SpecialPage {
$pages[] = $n;
}
+
return $pages;
}
@@ -443,6 +457,7 @@ class SpecialExport extends SpecialPage {
$pages[] = $n;
}
+
return $pages;
}
@@ -468,12 +483,12 @@ class SpecialExport extends SpecialPage {
private function validateLinkDepth( $depth ) {
global $wgExportMaxLinkDepth;
- if( $depth < 0 ) {
+ if ( $depth < 0 ) {
return 0;
}
if ( !$this->userCanOverrideExportDepth() ) {
- if( $depth > $wgExportMaxLinkDepth ) {
+ if ( $depth > $wgExportMaxLinkDepth ) {
return $wgExportMaxLinkDepth;
}
}
@@ -483,6 +498,7 @@ class SpecialExport extends SpecialPage {
* crazy-big export from being done by someone setting the depth
* number too high. In other words, last resort safety net.
*/
+
return intval( min( $depth, 5 ) );
}
@@ -494,7 +510,7 @@ class SpecialExport extends SpecialPage {
* @return array
*/
private function getPageLinks( $inputPages, $pageSet, $depth ) {
- for( ; $depth > 0; --$depth ) {
+ for ( ; $depth > 0; --$depth ) {
$pageSet = $this->getLinks(
$inputPages, $pageSet, 'pagelinks',
array( 'namespace' => 'pl_namespace', 'title' => 'pl_title' ),
@@ -526,15 +542,20 @@ class SpecialExport extends SpecialPage {
/**
* Expand a list of pages to include items used in those pages.
+ * @param array $inputPages Array of page titles
+ * @param array $pageSet
+ * @param string $table
+ * @param array $fields Array of field names
+ * @param array $join
* @return array
*/
private function getLinks( $inputPages, $pageSet, $table, $fields, $join ) {
$dbr = wfGetDB( DB_SLAVE );
- foreach( $inputPages as $page ) {
+ foreach ( $inputPages as $page ) {
$title = Title::newFromText( $page );
- if( $title ) {
+ 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.
@@ -551,7 +572,7 @@ class SpecialExport extends SpecialPage {
__METHOD__
);
- foreach( $result as $row ) {
+ foreach ( $result as $row ) {
$template = Title::makeTitle( $row->namespace, $row->title );
$pageSet[$template->getPrefixedText()] = true;
}
diff --git a/includes/specials/SpecialFewestrevisions.php b/includes/specials/SpecialFewestrevisions.php
index 5b7f353d..47a4d75f 100644
--- a/includes/specials/SpecialFewestrevisions.php
+++ b/includes/specials/SpecialFewestrevisions.php
@@ -28,7 +28,6 @@
* @author Martin Drashkov
*/
class FewestrevisionsPage extends QueryPage {
-
function __construct( $name = 'Fewestrevisions' ) {
parent::__construct( $name );
}
@@ -42,21 +41,26 @@ class FewestrevisionsPage extends QueryPage {
}
function getQueryInfo() {
- return array (
- 'tables' => array ( 'revision', 'page' ),
- 'fields' => array ( 'namespace' => 'page_namespace',
- 'title' => 'page_title',
- 'value' => 'COUNT(*)',
- 'redirect' => 'page_is_redirect' ),
- 'conds' => array ( 'page_namespace' => MWNamespace::getContentNamespaces(),
- 'page_id = rev_page' ),
- 'options' => array ( 'HAVING' => 'COUNT(*) > 1',
- // ^^^ This was probably here to weed out redirects.
- // Since we mark them as such now, it might be
- // useful to remove this. People _do_ create pages
- // and never revise them, they aren't necessarily
- // redirects.
- 'GROUP BY' => array( 'page_namespace', 'page_title', 'page_is_redirect' ) )
+ return array(
+ 'tables' => array( 'revision', 'page' ),
+ 'fields' => array(
+ 'namespace' => 'page_namespace',
+ 'title' => 'page_title',
+ 'value' => 'COUNT(*)',
+ 'redirect' => 'page_is_redirect'
+ ),
+ 'conds' => array(
+ 'page_namespace' => MWNamespace::getContentNamespaces(),
+ 'page_id = rev_page' ),
+ 'options' => array(
+ 'HAVING' => 'COUNT(*) > 1',
+ // ^^^ This was probably here to weed out redirects.
+ // Since we mark them as such now, it might be
+ // useful to remove this. People _do_ create pages
+ // and never revise them, they aren't necessarily
+ // redirects.
+ 'GROUP BY' => array( 'page_namespace', 'page_title', 'page_is_redirect' )
+ )
);
}
@@ -65,17 +69,24 @@ class FewestrevisionsPage extends QueryPage {
}
/**
- * @param $skin Skin object
- * @param $result Object: database row
+ * @param Skin $skin
+ * @param object $result Database row
* @return String
*/
function formatResult( $skin, $result ) {
global $wgContLang;
$nt = Title::makeTitleSafe( $result->namespace, $result->title );
- if( !$nt ) {
- return Html::element( 'span', array( 'class' => 'mw-invalidtitle' ),
- Linker::getInvalidTitleDescription( $this->getContext(), $result->namespace, $result->title ) );
+ if ( !$nt ) {
+ return Html::element(
+ 'span',
+ array( 'class' => 'mw-invalidtitle' ),
+ Linker::getInvalidTitleDescription(
+ $this->getContext(),
+ $result->namespace,
+ $result->title
+ )
+ );
}
$text = htmlspecialchars( $wgContLang->convert( $nt->getPrefixedText() ) );
diff --git a/includes/specials/SpecialFileDuplicateSearch.php b/includes/specials/SpecialFileDuplicateSearch.php
index 3fe64e6f..4c6593b2 100644
--- a/includes/specials/SpecialFileDuplicateSearch.php
+++ b/includes/specials/SpecialFileDuplicateSearch.php
@@ -59,7 +59,7 @@ class FileDuplicateSearchPage extends QueryPage {
/**
* Fetch dupes from all connected file repositories.
*
- * @return Array of File objects
+ * @return array of File objects
*/
function getDupes() {
return RepoGroup::singleton()->findBySha1( $this->hash );
@@ -101,11 +101,11 @@ class FileDuplicateSearchPage extends QueryPage {
$this->setHeaders();
$this->outputHeader();
- $this->filename = isset( $par ) ? $par : $this->getRequest()->getText( 'filename' );
+ $this->filename = isset( $par ) ? $par : $this->getRequest()->getText( 'filename' );
$this->file = null;
$this->hash = '';
$title = Title::newFromText( $this->filename, NS_FILE );
- if( $title && $title->getText() != '' ) {
+ if ( $title && $title->getText() != '' ) {
$this->file = wfFindFile( $title );
}
@@ -113,37 +113,46 @@ class FileDuplicateSearchPage extends QueryPage {
# Create the input form
$out->addHTML(
- Xml::openElement( 'form', array( 'id' => 'fileduplicatesearch', 'method' => 'get', 'action' => $wgScript ) ) .
- Html::hidden( 'title', $this->getTitle()->getPrefixedDBkey() ) .
- Xml::openElement( 'fieldset' ) .
- Xml::element( 'legend', null, $this->msg( 'fileduplicatesearch-legend' )->text() ) .
- Xml::inputLabel( $this->msg( 'fileduplicatesearch-filename' )->text(), 'filename', 'filename', 50, $this->filename ) . ' ' .
- Xml::submitButton( $this->msg( 'fileduplicatesearch-submit' )->text() ) .
- Xml::closeElement( 'fieldset' ) .
- Xml::closeElement( 'form' )
+ Html::openElement(
+ 'form',
+ array( 'id' => 'fileduplicatesearch', 'method' => 'get', 'action' => $wgScript )
+ ) . "\n" .
+ Html::hidden( 'title', $this->getTitle()->getPrefixedDBkey() ) . "\n" .
+ Html::openElement( 'fieldset' ) . "\n" .
+ Html::element( 'legend', null, $this->msg( 'fileduplicatesearch-legend' )->text() ) . "\n" .
+ Xml::inputLabel(
+ $this->msg( 'fileduplicatesearch-filename' )->text(),
+ 'filename',
+ 'filename',
+ 50,
+ $this->filename
+ ) . "\n" .
+ Xml::submitButton( $this->msg( 'fileduplicatesearch-submit' )->text() ) . "\n" .
+ Html::closeElement( 'fieldset' ) . "\n" .
+ Html::closeElement( 'form' )
);
- if( $this->file ) {
+ if ( $this->file ) {
$this->hash = $this->file->getSha1();
- } elseif( $this->filename !== '' ) {
+ } elseif ( $this->filename !== '' ) {
$out->wrapWikiMsg(
"<p class='mw-fileduplicatesearch-noresults'>\n$1\n</p>",
array( 'fileduplicatesearch-noresults', wfEscapeWikiText( $this->filename ) )
);
}
- if( $this->hash != '' ) {
+ if ( $this->hash != '' ) {
# Show a thumbnail of the file
$img = $this->file;
if ( $img ) {
$thumb = $img->transform( array( 'width' => 120, 'height' => 120 ) );
- if( $thumb ) {
+ if ( $thumb ) {
$out->addHTML( '<div id="mw-fileduplicatesearch-icon">' .
$thumb->toHtml( array( 'desc-link' => false ) ) . '<br />' .
$this->msg( 'fileduplicatesearch-info' )->numParams(
$img->getWidth(), $img->getHeight() )->params(
- $this->getLanguage()->formatSize( $img->getSize() ),
- $img->getMimeType() )->parseAsBlock() .
+ $this->getLanguage()->formatSize( $img->getSize() ),
+ $img->getMimeType() )->parseAsBlock() .
'</div>' );
}
}
@@ -152,7 +161,7 @@ class FileDuplicateSearchPage extends QueryPage {
$numRows = count( $dupes );
# Show a short summary
- if( $numRows == 1 ) {
+ if ( $numRows == 1 ) {
$out->wrapWikiMsg(
"<p class='mw-fileduplicatesearch-result-1'>\n$1\n</p>",
array( 'fileduplicatesearch-result-1', wfEscapeWikiText( $this->filename ) )
@@ -172,14 +181,16 @@ class FileDuplicateSearchPage extends QueryPage {
function doBatchLookups( $list ) {
$batch = new LinkBatch();
- foreach( $list as $file ) {
+ /** @var File $file */
+ foreach ( $list as $file ) {
$batch->addObj( $file->getTitle() );
- if( $file->isLocal() ) {
+ if ( $file->isLocal() ) {
$userName = $file->getUser( 'text' );
$batch->add( NS_USER, $userName );
$batch->add( NS_USER_TALK, $userName );
}
}
+
$batch->execute();
}
diff --git a/includes/specials/SpecialFilepath.php b/includes/specials/SpecialFilepath.php
index bbcced26..e7ced52a 100644
--- a/includes/specials/SpecialFilepath.php
+++ b/includes/specials/SpecialFilepath.php
@@ -2,6 +2,7 @@
/**
* Implements Special:Filepath
*
+ * @section 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
@@ -26,65 +27,16 @@
*
* @ingroup SpecialPage
*/
-class SpecialFilepath extends SpecialPage {
-
+class SpecialFilepath extends RedirectSpecialPage {
function __construct() {
parent::__construct( 'Filepath' );
+ $this->mAllowedRedirectParams = array( 'width', 'height' );
}
- function execute( $par ) {
- $this->setHeaders();
- $this->outputHeader();
-
- $request = $this->getRequest();
- $file = !is_null( $par ) ? $par : $request->getText( 'file' );
-
- $title = Title::newFromText( $file, NS_FILE );
-
- if ( ! $title instanceof Title || $title->getNamespace() != NS_FILE ) {
- $this->showForm( $title );
- } else {
- $file = wfFindFile( $title );
-
- if ( $file && $file->exists() ) {
- // Default behavior: Use the direct link to the file.
- $url = $file->getURL();
- $width = $request->getInt( 'width', -1 );
- $height = $request->getInt( 'height', -1 );
-
- // If a width is requested...
- if ( $width != -1 ) {
- $mto = $file->transform( array( 'width' => $width, 'height' => $height ) );
- // ... and we can
- if ( $mto && !$mto->isError() ) {
- // ... change the URL to point to a thumbnail.
- $url = $mto->getURL();
- }
- }
- $this->getOutput()->redirect( $url );
- } else {
- $this->getOutput()->setStatusCode( 404 );
- $this->showForm( $title );
- }
- }
- }
-
- /**
- * @param $title Title
- */
- function showForm( $title ) {
- global $wgScript;
-
- $this->getOutput()->addHTML(
- Html::openElement( 'form', array( 'method' => 'get', 'action' => $wgScript, 'id' => 'specialfilepath' ) ) .
- Html::openElement( 'fieldset' ) .
- Html::element( 'legend', null, $this->msg( 'filepath' )->text() ) .
- Html::hidden( 'title', $this->getTitle()->getPrefixedText() ) .
- Xml::inputLabel( $this->msg( 'filepath-page' )->text(), 'file', 'file', 25, is_object( $title ) ? $title->getText() : '' ) . ' ' .
- Xml::submitButton( $this->msg( 'filepath-submit' )->text() ) . "\n" .
- Html::closeElement( 'fieldset' ) .
- Html::closeElement( 'form' )
- );
+ // implement by redirecting through Special:Redirect/file
+ function getRedirect( $par ) {
+ $file = $par ?: $this->getRequest()->getText( 'file' );
+ return SpecialPage::getSafeTitleFor( 'Redirect', 'file/' . $file );
}
protected function getGroupName() {
diff --git a/includes/specials/SpecialImport.php b/includes/specials/SpecialImport.php
index aa56041b..d7d860de 100644
--- a/includes/specials/SpecialImport.php
+++ b/includes/specials/SpecialImport.php
@@ -30,12 +30,11 @@
* @ingroup SpecialPage
*/
class SpecialImport extends SpecialPage {
-
private $interwiki = false;
private $namespace;
private $rootpage = '';
private $frompage = '';
- private $logcomment= false;
+ private $logcomment = false;
private $history = true;
private $includeTemplates = false;
private $pageLinkDepth;
@@ -108,13 +107,13 @@ class SpecialImport extends SpecialPage {
$source = Status::newFatal( 'import-token-mismatch' );
} elseif ( $sourceName == 'upload' ) {
$isUpload = true;
- if( $user->isAllowed( 'importupload' ) ) {
+ if ( $user->isAllowed( 'importupload' ) ) {
$source = ImportStreamSource::newFromUpload( "xmlimport" );
} else {
throw new PermissionsError( 'importupload' );
}
} elseif ( $sourceName == "interwiki" ) {
- if( !$user->isAllowed( 'import' ) ) {
+ if ( !$user->isAllowed( 'import' ) ) {
throw new PermissionsError( 'import' );
}
$this->interwiki = $request->getVal( 'interwiki' );
@@ -136,24 +135,40 @@ class SpecialImport extends SpecialPage {
}
$out = $this->getOutput();
- if( !$source->isGood() ) {
- $out->wrapWikiMsg( "<p class=\"error\">\n$1\n</p>", array( 'importfailed', $source->getWikiText() ) );
+ if ( !$source->isGood() ) {
+ $out->wrapWikiMsg(
+ "<p class=\"error\">\n$1\n</p>",
+ array( 'importfailed', $source->getWikiText() )
+ );
} else {
$importer = new WikiImporter( $source->value );
- if( !is_null( $this->namespace ) ) {
+ if ( !is_null( $this->namespace ) ) {
$importer->setTargetNamespace( $this->namespace );
}
- if( !is_null( $this->rootpage ) ) {
+ if ( !is_null( $this->rootpage ) ) {
$statusRootPage = $importer->setTargetRootPage( $this->rootpage );
- if( !$statusRootPage->isGood() ) {
- $out->wrapWikiMsg( "<p class=\"error\">\n$1\n</p>", array( 'import-options-wrong', $statusRootPage->getWikiText(), count( $statusRootPage->getErrorsArray() ) ) );
+ if ( !$statusRootPage->isGood() ) {
+ $out->wrapWikiMsg(
+ "<p class=\"error\">\n$1\n</p>",
+ array(
+ 'import-options-wrong',
+ $statusRootPage->getWikiText(),
+ count( $statusRootPage->getErrorsArray() )
+ )
+ );
+
return;
}
}
$out->addWikiMsg( "importstart" );
- $reporter = new ImportReporter( $importer, $isUpload, $this->interwiki, $this->logcomment );
+ $reporter = new ImportReporter(
+ $importer,
+ $isUpload,
+ $this->interwiki,
+ $this->logcomment
+ );
$reporter->setContext( $this->getContext() );
$exception = false;
@@ -167,10 +182,16 @@ class SpecialImport extends SpecialPage {
if ( $exception ) {
# No source or XML parse error
- $out->wrapWikiMsg( "<p class=\"error\">\n$1\n</p>", array( 'importfailed', $exception->getMessage() ) );
- } elseif( !$result->isGood() ) {
+ $out->wrapWikiMsg(
+ "<p class=\"error\">\n$1\n</p>",
+ array( 'importfailed', $exception->getMessage() )
+ );
+ } elseif ( !$result->isGood() ) {
# Zero revisions
- $out->wrapWikiMsg( "<p class=\"error\">\n$1\n</p>", array( 'importfailed', $result->getWikiText() ) );
+ $out->wrapWikiMsg(
+ "<p class=\"error\">\n$1\n</p>",
+ array( 'importfailed', $result->getWikiText() )
+ );
} else {
# Success!
$out->addWikiMsg( 'importsuccess' );
@@ -182,162 +203,195 @@ class SpecialImport extends SpecialPage {
private function showForm() {
global $wgImportSources, $wgExportMaxLinkDepth;
- $action = $this->getTitle()->getLocalUrl( array( 'action' => 'submit' ) );
+ $action = $this->getTitle()->getLocalURL( array( 'action' => 'submit' ) );
$user = $this->getUser();
$out = $this->getOutput();
- if( $user->isAllowed( 'importupload' ) ) {
+ if ( $user->isAllowed( 'importupload' ) ) {
$out->addHTML(
- Xml::fieldset( $this->msg( 'import-upload' )->text() ).
- Xml::openElement( 'form', array( 'enctype' => 'multipart/form-data', 'method' => 'post',
- 'action' => $action, 'id' => 'mw-import-upload-form' ) ) .
- $this->msg( 'importtext' )->parseAsBlock() .
- Html::hidden( 'action', 'submit' ) .
- Html::hidden( 'source', 'upload' ) .
- Xml::openElement( 'table', array( 'id' => 'mw-import-table-upload' ) ) .
-
- "<tr>
+ Xml::fieldset( $this->msg( 'import-upload' )->text() ) .
+ Xml::openElement(
+ 'form',
+ array(
+ 'enctype' => 'multipart/form-data',
+ 'method' => 'post',
+ 'action' => $action,
+ 'id' => 'mw-import-upload-form'
+ )
+ ) .
+ $this->msg( 'importtext' )->parseAsBlock() .
+ Html::hidden( 'action', 'submit' ) .
+ Html::hidden( 'source', 'upload' ) .
+ Xml::openElement( 'table', array( 'id' => 'mw-import-table-upload' ) ) .
+ "<tr>
<td class='mw-label'>" .
- Xml::label( $this->msg( 'import-upload-filename' )->text(), 'xmlimport' ) .
+ Xml::label( $this->msg( 'import-upload-filename' )->text(), 'xmlimport' ) .
"</td>
<td class='mw-input'>" .
- Html::input( 'xmlimport', '', 'file', array( 'id' => 'xmlimport' ) ) . ' ' .
+ Html::input( 'xmlimport', '', 'file', array( 'id' => 'xmlimport' ) ) . ' ' .
"</td>
</tr>
<tr>
<td class='mw-label'>" .
- Xml::label( $this->msg( 'import-comment' )->text(), 'mw-import-comment' ) .
+ Xml::label( $this->msg( 'import-comment' )->text(), 'mw-import-comment' ) .
"</td>
<td class='mw-input'>" .
- Xml::input( 'log-comment', 50, '',
- array( 'id' => 'mw-import-comment', 'type' => 'text' ) ) . ' ' .
+ Xml::input( 'log-comment', 50, '',
+ array( 'id' => 'mw-import-comment', 'type' => 'text' ) ) . ' ' .
"</td>
</tr>
<tr>
<td class='mw-label'>" .
- Xml::label( $this->msg( 'import-interwiki-rootpage' )->text(), 'mw-interwiki-rootpage-upload' ) .
+ Xml::label( $this->msg( 'import-interwiki-rootpage' )->text(), 'mw-interwiki-rootpage-upload' ) .
"</td>
<td class='mw-input'>" .
- Xml::input( 'rootpage', 50, $this->rootpage,
- array( 'id' => 'mw-interwiki-rootpage-upload', 'type' => 'text' ) ) . ' ' .
+ Xml::input( 'rootpage', 50, $this->rootpage,
+ array( 'id' => 'mw-interwiki-rootpage-upload', 'type' => 'text' ) ) . ' ' .
"</td>
</tr>
<tr>
<td></td>
<td class='mw-submit'>" .
- Xml::submitButton( $this->msg( 'uploadbtn' )->text() ) .
+ Xml::submitButton( $this->msg( 'uploadbtn' )->text() ) .
"</td>
</tr>" .
- Xml::closeElement( 'table' ).
- Html::hidden( 'editToken', $user->getEditToken() ) .
- Xml::closeElement( 'form' ) .
- Xml::closeElement( 'fieldset' )
+ Xml::closeElement( 'table' ) .
+ Html::hidden( 'editToken', $user->getEditToken() ) .
+ Xml::closeElement( 'form' ) .
+ Xml::closeElement( 'fieldset' )
);
} else {
- if( empty( $wgImportSources ) ) {
+ if ( empty( $wgImportSources ) ) {
$out->addWikiMsg( 'importnosources' );
}
}
- if( $user->isAllowed( 'import' ) && !empty( $wgImportSources ) ) {
+ if ( $user->isAllowed( 'import' ) && !empty( $wgImportSources ) ) {
# Show input field for import depth only if $wgExportMaxLinkDepth > 0
$importDepth = '';
- if( $wgExportMaxLinkDepth > 0 ) {
+ if ( $wgExportMaxLinkDepth > 0 ) {
$importDepth = "<tr>
<td class='mw-label'>" .
- $this->msg( 'export-pagelinks' )->parse() .
- "</td>
+ $this->msg( 'export-pagelinks' )->parse() .
+ "</td>
<td class='mw-input'>" .
- Xml::input( 'pagelink-depth', 3, 0 ) .
- "</td>
- </tr>";
+ Xml::input( 'pagelink-depth', 3, 0 ) .
+ "</td>
+ </tr>";
}
$out->addHTML(
Xml::fieldset( $this->msg( 'importinterwiki' )->text() ) .
- Xml::openElement( 'form', array( 'method' => 'post', 'action' => $action, 'id' => 'mw-import-interwiki-form' ) ) .
- $this->msg( 'import-interwiki-text' )->parseAsBlock() .
- Html::hidden( 'action', 'submit' ) .
- Html::hidden( 'source', 'interwiki' ) .
- Html::hidden( 'editToken', $user->getEditToken() ) .
- Xml::openElement( 'table', array( 'id' => 'mw-import-table-interwiki' ) ) .
- "<tr>
+ Xml::openElement(
+ 'form',
+ array(
+ 'method' => 'post',
+ 'action' => $action,
+ 'id' => 'mw-import-interwiki-form'
+ )
+ ) .
+ $this->msg( 'import-interwiki-text' )->parseAsBlock() .
+ Html::hidden( 'action', 'submit' ) .
+ Html::hidden( 'source', 'interwiki' ) .
+ Html::hidden( 'editToken', $user->getEditToken() ) .
+ Xml::openElement( 'table', array( 'id' => 'mw-import-table-interwiki' ) ) .
+ "<tr>
<td class='mw-label'>" .
- Xml::label( $this->msg( 'import-interwiki-source' )->text(), 'interwiki' ) .
+ Xml::label( $this->msg( 'import-interwiki-source' )->text(), 'interwiki' ) .
"</td>
<td class='mw-input'>" .
- Xml::openElement( 'select', array( 'name' => 'interwiki', 'id' => 'interwiki' ) )
+ Xml::openElement(
+ 'select',
+ array( 'name' => 'interwiki', 'id' => 'interwiki' )
+ )
);
- foreach( $wgImportSources as $prefix ) {
+
+ foreach ( $wgImportSources as $prefix ) {
$selected = ( $this->interwiki === $prefix ) ? ' selected="selected"' : '';
$out->addHTML( Xml::option( $prefix, $prefix, $selected ) );
}
$out->addHTML(
- Xml::closeElement( 'select' ) .
- Xml::input( 'frompage', 50, $this->frompage, array( 'id' => 'frompage' ) ) .
+ Xml::closeElement( 'select' ) .
+ Xml::input( 'frompage', 50, $this->frompage, array( 'id' => 'frompage' ) ) .
"</td>
</tr>
<tr>
<td>
</td>
<td class='mw-input'>" .
- Xml::checkLabel( $this->msg( 'import-interwiki-history' )->text(), 'interwikiHistory', 'interwikiHistory', $this->history ) .
+ Xml::checkLabel(
+ $this->msg( 'import-interwiki-history' )->text(),
+ 'interwikiHistory',
+ 'interwikiHistory',
+ $this->history
+ ) .
"</td>
</tr>
<tr>
<td>
</td>
<td class='mw-input'>" .
- Xml::checkLabel( $this->msg( 'import-interwiki-templates' )->text(), 'interwikiTemplates', 'interwikiTemplates', $this->includeTemplates ) .
+ Xml::checkLabel(
+ $this->msg( 'import-interwiki-templates' )->text(),
+ 'interwikiTemplates',
+ 'interwikiTemplates',
+ $this->includeTemplates
+ ) .
"</td>
</tr>
$importDepth
<tr>
<td class='mw-label'>" .
- Xml::label( $this->msg( 'import-interwiki-namespace' )->text(), 'namespace' ) .
+ Xml::label( $this->msg( 'import-interwiki-namespace' )->text(), 'namespace' ) .
"</td>
<td class='mw-input'>" .
- Html::namespaceSelector(
- array(
- 'selected' => $this->namespace,
- 'all' => '',
- ), array(
- 'name' => 'namespace',
- 'id' => 'namespace',
- 'class' => 'namespaceselector',
- )
- ) .
+ Html::namespaceSelector(
+ array(
+ 'selected' => $this->namespace,
+ 'all' => '',
+ ), array(
+ 'name' => 'namespace',
+ 'id' => 'namespace',
+ 'class' => 'namespaceselector',
+ )
+ ) .
"</td>
</tr>
<tr>
<td class='mw-label'>" .
- Xml::label( $this->msg( 'import-comment' )->text(), 'mw-interwiki-comment' ) .
+ Xml::label( $this->msg( 'import-comment' )->text(), 'mw-interwiki-comment' ) .
"</td>
<td class='mw-input'>" .
- Xml::input( 'log-comment', 50, '',
- array( 'id' => 'mw-interwiki-comment', 'type' => 'text' ) ) . ' ' .
+ Xml::input( 'log-comment', 50, '',
+ array( 'id' => 'mw-interwiki-comment', 'type' => 'text' ) ) . ' ' .
"</td>
</tr>
<tr>
<td class='mw-label'>" .
- Xml::label( $this->msg( 'import-interwiki-rootpage' )->text(), 'mw-interwiki-rootpage-interwiki' ) .
+ Xml::label(
+ $this->msg( 'import-interwiki-rootpage' )->text(),
+ 'mw-interwiki-rootpage-interwiki'
+ ) .
"</td>
<td class='mw-input'>" .
- Xml::input( 'rootpage', 50, $this->rootpage,
- array( 'id' => 'mw-interwiki-rootpage-interwiki', 'type' => 'text' ) ) . ' ' .
+ Xml::input( 'rootpage', 50, $this->rootpage,
+ array( 'id' => 'mw-interwiki-rootpage-interwiki', 'type' => 'text' ) ) . ' ' .
"</td>
</tr>
<tr>
<td>
</td>
<td class='mw-submit'>" .
- Xml::submitButton( $this->msg( 'import-interwiki-submit' )->text(), Linker::tooltipAndAccesskeyAttribs( 'import' ) ) .
+ Xml::submitButton(
+ $this->msg( 'import-interwiki-submit' )->text(),
+ Linker::tooltipAndAccesskeyAttribs( 'import' )
+ ) .
"</td>
</tr>" .
- Xml::closeElement( 'table' ).
- Xml::closeElement( 'form' ) .
- Xml::closeElement( 'fieldset' )
+ Xml::closeElement( 'table' ) .
+ Xml::closeElement( 'form' ) .
+ Xml::closeElement( 'fieldset' )
);
}
}
@@ -352,14 +406,21 @@ class SpecialImport extends SpecialPage {
* @ingroup SpecialPage
*/
class ImportReporter extends ContextSource {
- private $reason=false;
+ private $reason = false;
private $mOriginalLogCallback = null;
private $mOriginalPageOutCallback = null;
private $mLogItemCount = 0;
+
+ /**
+ * @param WikiImporter $importer
+ * @param $upload
+ * @param $interwiki
+ * @param string|bool $reason
+ */
function __construct( $importer, $upload, $interwiki, $reason = false ) {
$this->mOriginalPageOutCallback =
- $importer->setPageOutCallback( array( $this, 'reportPage' ) );
+ $importer->setPageOutCallback( array( $this, 'reportPage' ) );
$this->mOriginalLogCallback =
$importer->setLogItemCallback( array( $this, 'reportLogItem' ) );
$importer->setNoticeCallback( array( $this, 'reportNotice' ) );
@@ -403,20 +464,21 @@ class ImportReporter extends ContextSource {
$this->mPageCount++;
- if( $successCount > 0 ) {
- $this->getOutput()->addHTML( "<li>" . Linker::linkKnown( $title ) . " " .
- $this->msg( 'import-revision-count' )->numParams( $successCount )->escaped() .
- "</li>\n"
+ if ( $successCount > 0 ) {
+ $this->getOutput()->addHTML(
+ "<li>" . Linker::linkKnown( $title ) . " " .
+ $this->msg( 'import-revision-count' )->numParams( $successCount )->escaped() .
+ "</li>\n"
);
$log = new LogPage( 'import' );
- if( $this->mIsUpload ) {
+ if ( $this->mIsUpload ) {
$detail = $this->msg( 'import-logentry-upload-detail' )->numParams(
$successCount )->inContentLanguage()->text();
if ( $this->reason ) {
$detail .= $this->msg( 'colon-separator' )->inContentLanguage()->text() . $this->reason;
}
- $log->addEntry( 'upload', $title, $detail );
+ $log->addEntry( 'upload', $title, $detail, array(), $this->getUser() );
} else {
$interwiki = '[[:' . $this->mInterwiki . ':' .
$origTitle->getPrefixedText() . ']]';
@@ -425,7 +487,7 @@ class ImportReporter extends ContextSource {
if ( $this->reason ) {
$detail .= $this->msg( 'colon-separator' )->inContentLanguage()->text() . $this->reason;
}
- $log->addEntry( 'interwiki', $title, $detail );
+ $log->addEntry( 'interwiki', $title, $detail, array(), $this->getUser() );
}
$comment = $detail; // quick
@@ -450,8 +512,9 @@ class ImportReporter extends ContextSource {
if ( $this->mLogItemCount > 0 ) {
$msg = $this->msg( 'imported-log-entries' )->numParams( $this->mLogItemCount )->parse();
$out->addHTML( Xml::tags( 'li', null, $msg ) );
- } elseif( $this->mPageCount == 0 && $this->mLogItemCount == 0 ) {
+ } elseif ( $this->mPageCount == 0 && $this->mLogItemCount == 0 ) {
$out->addHTML( "</ul>\n" );
+
return Status::newFatal( 'importnopages' );
}
$out->addHTML( "</ul>\n" );
diff --git a/includes/specials/SpecialJavaScriptTest.php b/includes/specials/SpecialJavaScriptTest.php
index d204d50c..7069d527 100644
--- a/includes/specials/SpecialJavaScriptTest.php
+++ b/includes/specials/SpecialJavaScriptTest.php
@@ -55,24 +55,29 @@ class SpecialJavaScriptTest extends SpecialPage {
if ( $par == '' ) {
$out->setPageTitle( $this->msg( 'javascripttest' ) );
$summary = $this->wrapSummaryHtml(
- $this->msg( 'javascripttest-pagetext-noframework' )->escaped() . $this->getFrameworkListHtml(),
+ $this->msg( 'javascripttest-pagetext-noframework' )->escaped() .
+ $this->getFrameworkListHtml(),
'noframework'
);
$out->addHtml( $summary );
-
- // Matched! Display proper title and initialize the framework
} elseif ( isset( self::$frameworks[$framework] ) ) {
- $out->setPageTitle( $this->msg( 'javascripttest-title', $this->msg( "javascripttest-$framework-name" )->plain() ) );
- $out->setSubtitle( $this->msg( 'javascripttest-backlink' )->rawParams( Linker::linkKnown( $this->getTitle() ) ) );
+ // Matched! Display proper title and initialize the framework
+ $out->setPageTitle( $this->msg(
+ 'javascripttest-title',
+ // Messages: javascripttest-qunit-name
+ $this->msg( "javascripttest-$framework-name" )->plain()
+ ) );
+ $out->setSubtitle( $this->msg( 'javascripttest-backlink' )
+ ->rawParams( Linker::linkKnown( $this->getTitle() ) ) );
$this->{self::$frameworks[$framework]}();
-
- // Framework not found, display error
} else {
+ // Framework not found, display error
$out->setPageTitle( $this->msg( 'javascripttest' ) );
- $summary = $this->wrapSummaryHtml( '<p class="error">'
- . $this->msg( 'javascripttest-pagetext-unknownframework', $par )->escaped()
- . '</p>'
- . $this->getFrameworkListHtml(),
+ $summary = $this->wrapSummaryHtml(
+ '<p class="error">' .
+ $this->msg( 'javascripttest-pagetext-unknownframework', $par )->escaped() .
+ '</p>' .
+ $this->getFrameworkListHtml(),
'unknownframework'
);
$out->addHtml( $summary );
@@ -80,22 +85,28 @@ class SpecialJavaScriptTest extends SpecialPage {
}
/**
- * Get a list of frameworks (including introduction paragraph and links to the framework run pages)
- * @return String: HTML
+ * Get a list of frameworks (including introduction paragraph and links
+ * to the framework run pages)
+ *
+ * @return string HTML
*/
private function getFrameworkListHtml() {
$list = '<ul>';
- foreach( self::$frameworks as $framework => $initFn ) {
+ foreach ( self::$frameworks as $framework => $initFn ) {
$list .= Html::rawElement(
'li',
array(),
- Linker::link( $this->getTitle( $framework ), $this->msg( "javascripttest-$framework-name" )->escaped() )
+ Linker::link(
+ $this->getTitle( $framework ),
+ // Message: javascripttest-qunit-name
+ $this->msg( "javascripttest-$framework-name" )->escaped()
+ )
);
}
$list .= '</ul>';
- $msg = $this->msg( 'javascripttest-pagetext-frameworks' )->rawParams( $list )->parseAsBlock();
- return $msg;
+ return $this->msg( 'javascripttest-pagetext-frameworks' )->rawParams( $list )
+ ->parseAsBlock();
}
/**
@@ -109,12 +120,14 @@ class SpecialJavaScriptTest extends SpecialPage {
*/
private function wrapSummaryHtml( $html, $state ) {
$validStates = array( 'noframework', 'unknownframework', 'frameworkfound' );
- if( !in_array( $state, $validStates ) ) {
+
+ if ( !in_array( $state, $validStates ) ) {
throw new MWException( __METHOD__
. ' given an invalid state. Must be one of "'
- . join( '", "', $validStates) . '".'
+ . join( '", "', $validStates ) . '".'
);
}
+
return "<div id=\"mw-javascripttest-summary\" class=\"mw-javascripttest-$state\">$html</div>";
}
@@ -155,7 +168,10 @@ HTML;
// Used in ./tests/qunit/data/testrunner.js, see also documentation of
// $wgJavaScriptTestConfig in DefaultSettings.php
- $out->addJsConfigVars( 'QUnitTestSwarmInjectJSPath', $wgJavaScriptTestConfig['qunit']['testswarm-injectjs'] );
+ $out->addJsConfigVars(
+ 'QUnitTestSwarmInjectJSPath',
+ $wgJavaScriptTestConfig['qunit']['testswarm-injectjs']
+ );
}
protected function getGroupName() {
diff --git a/includes/specials/SpecialLinkSearch.php b/includes/specials/SpecialLinkSearch.php
index 030416fb..5b0c56e5 100644
--- a/includes/specials/SpecialLinkSearch.php
+++ b/includes/specials/SpecialLinkSearch.php
@@ -55,7 +55,7 @@ class LinkSearchPage extends QueryPage {
$namespace = $request->getIntorNull( 'namespace', null );
$protocols_list = array();
- foreach( $wgUrlProtocols as $prot ) {
+ foreach ( $wgUrlProtocols as $prot ) {
if ( $prot !== '//' ) {
$protocols_list[] = $prot;
}
@@ -72,7 +72,7 @@ class LinkSearchPage extends QueryPage {
} elseif ( !$pr_sl && $pr_cl ) {
// For protocols without '//' like 'mailto:'
$protocol = substr( $target2, 0, $pr_cl + 1 );
- $target2 = substr( $target2, $pr_cl+1 );
+ $target2 = substr( $target2, $pr_cl + 1 );
} elseif ( $protocol == '' && $target2 != '' ) {
// default
$protocol = 'http://';
@@ -88,11 +88,21 @@ class LinkSearchPage extends QueryPage {
'<nowiki>' . $this->getLanguage()->commaList( $protocols_list ) . '</nowiki>',
count( $protocols_list )
);
- $s = Html::openElement( 'form', array( 'id' => 'mw-linksearch-form', 'method' => 'get', 'action' => $wgScript ) ) . "\n" .
+ $s = Html::openElement(
+ 'form',
+ array( 'id' => 'mw-linksearch-form', 'method' => 'get', 'action' => $wgScript )
+ ) . "\n" .
Html::hidden( 'title', $this->getTitle()->getPrefixedDBkey() ) . "\n" .
Html::openElement( 'fieldset' ) . "\n" .
Html::element( 'legend', array(), $this->msg( 'linksearch' )->text() ) . "\n" .
- Xml::inputLabel( $this->msg( 'linksearch-pat' )->text(), 'target', 'target', 50, $target ) . "\n";
+ Xml::inputLabel(
+ $this->msg( 'linksearch-pat' )->text(),
+ 'target',
+ 'target',
+ 50,
+ $target
+ ) . "\n";
+
if ( !$wgMiserMode ) {
$s .= Html::namespaceSelector(
array(
@@ -100,25 +110,27 @@ class LinkSearchPage extends QueryPage {
'all' => '',
'label' => $this->msg( 'linksearch-ns' )->text()
), array(
- 'name' => 'namespace',
- 'id' => 'namespace',
+ 'name' => 'namespace',
+ 'id' => 'namespace',
'class' => 'namespaceselector',
)
);
}
+
$s .= Xml::submitButton( $this->msg( 'linksearch-ok' )->text() ) . "\n" .
Html::closeElement( 'fieldset' ) . "\n" .
Html::closeElement( 'form' ) . "\n";
$out->addHTML( $s );
- if( $target != '' ) {
+ if ( $target != '' ) {
$this->setParams( array(
'query' => $target2,
'namespace' => $namespace,
'protocol' => $protocol ) );
parent::execute( $par );
- if( $this->mMungedQuery === false )
+ if ( $this->mMungedQuery === false ) {
$out->addWikiMsg( 'linksearch-error' );
+ }
}
}
@@ -133,6 +145,8 @@ class LinkSearchPage extends QueryPage {
/**
* Return an appropriately formatted LIKE query and the clause
*
+ * @param string $query
+ * @param string $prot
* @return array
*/
static function mungeQuery( $query, $prot ) {
@@ -140,12 +154,14 @@ class LinkSearchPage extends QueryPage {
$rv = LinkFilter::makeLikeArray( $query, $prot );
if ( $rv === false ) {
// 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 ) ) {
+ $pattern = '/^(:?[0-9]{1,3}\.)+\*\s*$|^(:?[0-9]{1,3}\.){3}[0-9]{1,3}:[0-9]*\*\s*$/';
+ if ( preg_match( $pattern, $query ) ) {
$dbr = wfGetDB( DB_SLAVE );
$rv = array( $prot . rtrim( $query, " \t*" ), $dbr->anyString() );
$field = 'el_to';
}
}
+
return array( $rv, $field );
}
@@ -153,9 +169,10 @@ class LinkSearchPage extends QueryPage {
global $wgMiserMode;
$params = array();
$params['target'] = $this->mProt . $this->mQuery;
- if( isset( $this->mNs ) && !$wgMiserMode ) {
+ if ( isset( $this->mNs ) && !$wgMiserMode ) {
$params['namespace'] = $this->mNs;
}
+
return $params;
}
@@ -164,29 +181,41 @@ class LinkSearchPage extends QueryPage {
$dbr = wfGetDB( DB_SLAVE );
// strip everything past first wildcard, so that
// index-based-only lookup would be done
- list( $this->mMungedQuery, $clause ) = self::mungeQuery(
- $this->mQuery, $this->mProt );
- if( $this->mMungedQuery === false )
+ list( $this->mMungedQuery, $clause ) = self::mungeQuery( $this->mQuery, $this->mProt );
+ if ( $this->mMungedQuery === false ) {
// Invalid query; return no results
return array( 'tables' => 'page', 'fields' => 'page_id', 'conds' => '0=1' );
+ }
$stripped = LinkFilter::keepOneWildcard( $this->mMungedQuery );
$like = $dbr->buildLike( $stripped );
- $retval = array (
- 'tables' => array ( 'page', 'externallinks' ),
- 'fields' => array ( 'namespace' => 'page_namespace',
- 'title' => 'page_title',
- 'value' => 'el_index', 'url' => 'el_to' ),
- 'conds' => array ( 'page_id = el_from',
- "$clause $like" ),
+ $retval = array(
+ 'tables' => array( 'page', 'externallinks' ),
+ 'fields' => array(
+ 'namespace' => 'page_namespace',
+ 'title' => 'page_title',
+ 'value' => 'el_index',
+ 'url' => 'el_to'
+ ),
+ 'conds' => array(
+ 'page_id = el_from',
+ "$clause $like"
+ ),
'options' => array( 'USE INDEX' => $clause )
);
+
if ( isset( $this->mNs ) && !$wgMiserMode ) {
$retval['conds']['page_namespace'] = $this->mNs;
}
+
return $retval;
}
+ /**
+ * @param Skin $skin
+ * @param object $result Result row
+ * @return string
+ */
function formatResult( $skin, $result ) {
$title = Title::makeTitle( $result->namespace, $result->title );
$url = $result->url;
@@ -201,7 +230,7 @@ class LinkSearchPage extends QueryPage {
*/
function doQuery( $offset = false, $limit = false ) {
list( $this->mMungedQuery, ) = LinkSearchPage::mungeQuery( $this->mQuery, $this->mProt );
- if( $this->mMungedQuery === false ) {
+ if ( $this->mMungedQuery === false ) {
$this->getOutput()->addWikiMsg( 'linksearch-error' );
} else {
// For debugging
diff --git a/includes/specials/SpecialListfiles.php b/includes/specials/SpecialListfiles.php
index c864ae2a..dff1cf70 100644
--- a/includes/specials/SpecialListfiles.php
+++ b/includes/specials/SpecialListfiles.php
@@ -22,7 +22,6 @@
*/
class SpecialListFiles extends IncludableSpecialPage {
-
public function __construct() {
parent::__construct( 'Listfiles' );
}
@@ -37,9 +36,16 @@ class SpecialListFiles extends IncludableSpecialPage {
} else {
$userName = $this->getRequest()->getText( 'user', $par );
$search = $this->getRequest()->getText( 'ilsearch', '' );
+ $showAll = $this->getRequest()->getBool( 'ilshowall', false );
}
- $pager = new ImageListPager( $this->getContext(), $userName, $search, $this->including() );
+ $pager = new ImageListPager(
+ $this->getContext(),
+ $userName,
+ $search,
+ $this->including(),
+ $showAll
+ );
if ( $this->including() ) {
$html = $pager->getBody();
@@ -62,27 +68,33 @@ class SpecialListFiles extends IncludableSpecialPage {
*/
class ImageListPager extends TablePager {
var $mFieldNames = null;
+ // Subclasses should override buildQueryConds instead of using $mQueryConds variable.
var $mQueryConds = array();
var $mUserName = null;
var $mSearch = '';
var $mIncluding = false;
+ var $mShowAll = false;
+ var $mTableName = 'image';
- function __construct( IContextSource $context, $userName = null, $search = '', $including = false ) {
+ function __construct( IContextSource $context, $userName = null, $search = '',
+ $including = false, $showAll = false
+ ) {
global $wgMiserMode;
$this->mIncluding = $including;
+ $this->mShowAll = $showAll;
if ( $userName ) {
$nt = Title::newFromText( $userName, NS_USER );
if ( !is_null( $nt ) ) {
$this->mUserName = $nt->getText();
- $this->mQueryConds['img_user_text'] = $this->mUserName;
}
}
- if ( $search != '' && !$wgMiserMode ) {
+ if ( $search !== '' && !$wgMiserMode ) {
$this->mSearch = $search;
$nt = Title::newFromURL( $this->mSearch );
+
if ( $nt ) {
$dbr = wfGetDB( DB_SLAVE );
$this->mQueryConds[] = 'LOWER(img_name)' .
@@ -105,6 +117,42 @@ class ImageListPager extends TablePager {
}
/**
+ * Build the where clause of the query.
+ *
+ * Replaces the older mQueryConds member variable.
+ * @param $table String Either "image" or "oldimage"
+ * @return array The query conditions.
+ */
+ protected function buildQueryConds( $table ) {
+ $prefix = $table === 'image' ? 'img' : 'oi';
+ $conds = array();
+
+ if ( !is_null( $this->mUserName ) ) {
+ $conds[ $prefix . '_user_text' ] = $this->mUserName;
+ }
+
+ if ( $this->mSearch !== '' ) {
+ $nt = Title::newFromURL( $this->mSearch );
+ if ( $nt ) {
+ $dbr = wfGetDB( DB_SLAVE );
+ $conds[] = 'LOWER(' . $prefix . '_name)' .
+ $dbr->buildLike( $dbr->anyString(),
+ strtolower( $nt->getDBkey() ), $dbr->anyString() );
+ }
+ }
+
+ if ( $table === 'oldimage' ) {
+ // Don't want to deal with revdel.
+ // Future fixme: Show partial information as appropriate.
+ // Would have to be careful about filtering by username when username is deleted.
+ $conds['oi_deleted'] = 0;
+ }
+
+ // Add mQueryConds in case anyone was subclassing and using the old variable.
+ return $conds + $this->mQueryConds;
+ }
+
+ /**
* @return Array
*/
function getFieldNames() {
@@ -118,34 +166,94 @@ class ImageListPager extends TablePager {
'img_user_text' => $this->msg( 'listfiles_user' )->text(),
'img_description' => $this->msg( 'listfiles_description' )->text(),
);
- if( !$wgMiserMode ) {
+ if ( !$wgMiserMode && !$this->mShowAll ) {
$this->mFieldNames['count'] = $this->msg( 'listfiles_count' )->text();
}
+ if ( $this->mShowAll ) {
+ $this->mFieldNames['top'] = $this->msg( 'listfiles-latestversion' )->text();
+ }
}
+
return $this->mFieldNames;
}
function isFieldSortable( $field ) {
+ global $wgMiserMode;
if ( $this->mIncluding ) {
return false;
}
- 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'] );
+ $sortable = array( 'img_timestamp', 'img_name', 'img_size' );
+ /* For reference, the indicies we can use for sorting are:
+ * On the image table: img_usertext_timestamp, img_size, img_timestamp
+ * On oldimage: oi_usertext_timestamp, oi_name_timestamp
+ *
+ * In particular that means we cannot sort by timestamp when not filtering
+ * by user and including old images in the results. Which is sad.
+ */
+ if ( $wgMiserMode && !is_null( $this->mUserName ) ) {
+ // If we're sorting by user, the index only supports sorting by time.
+ if ( $field === 'img_timestamp' ) {
+ return true;
+ } else {
+ return false;
+ }
+ } elseif ( $wgMiserMode && $this->mShowAll /* && mUserName === null */ ) {
+ // no oi_timestamp index, so only alphabetical sorting in this case.
+ if ( $field === 'img_name' ) {
+ return true;
+ } else {
+ return false;
+ }
}
+
return in_array( $field, $sortable );
}
function getQueryInfo() {
- $tables = array( 'image' );
+ // Hacky Hacky Hacky - I want to get query info
+ // for two different tables, without reimplementing
+ // the pager class.
+ $qi = $this->getQueryInfoReal( $this->mTableName );
+ return $qi;
+ }
+
+ /**
+ * Actually get the query info.
+ *
+ * This is to allow displaying both stuff from image and oldimage table.
+ *
+ * This is a bit hacky.
+ *
+ * @param $table String Either 'image' or 'oldimage'
+ * @return array Query info
+ */
+ protected function getQueryInfoReal( $table ) {
+ $prefix = $table === 'oldimage' ? 'oi' : 'img';
+
+ $tables = array( $table );
$fields = array_keys( $this->getFieldNames() );
- $fields[] = 'img_user';
- $fields[array_search( 'thumb', $fields )] = 'img_name AS thumb';
+
+ if ( $table === 'oldimage' ) {
+ foreach ( $fields as $id => &$field ) {
+ if ( substr( $field, 0, 4 ) !== 'img_' ) {
+ continue;
+ }
+ $field = $prefix . substr( $field, 3 ) . ' AS ' . $field;
+ }
+ $fields[array_search('top', $fields)] = "'no' AS top";
+ } else {
+ if ( $this->mShowAll ) {
+ $fields[array_search( 'top', $fields )] = "'yes' AS top";
+ }
+ }
+ $fields[] = $prefix . '_user AS img_user';
+ $fields[array_search( 'thumb', $fields )] = $prefix . '_name AS thumb';
+
$options = $join_conds = array();
# Depends on $wgMiserMode
- if( isset( $this->mFieldNames['count'] ) ) {
+ # Will also not happen if mShowAll is true.
+ if ( isset( $this->mFieldNames['count'] ) ) {
$tables[] = 'oldimage';
# Need to rewrite this one
@@ -157,7 +265,7 @@ class ImageListPager extends TablePager {
unset( $field );
$dbr = wfGetDB( DB_SLAVE );
- if( $dbr->implicitGroupby() ) {
+ if ( $dbr->implicitGroupby() ) {
$options = array( 'GROUP BY' => 'img_name' );
} else {
$columnlist = preg_grep( '/^img/', array_keys( $this->getFieldNames() ) );
@@ -165,17 +273,107 @@ class ImageListPager extends TablePager {
}
$join_conds = array( 'oldimage' => array( 'LEFT JOIN', 'oi_name = img_name' ) );
}
+
return array(
- 'tables' => $tables,
- 'fields' => $fields,
- 'conds' => $this->mQueryConds,
- 'options' => $options,
+ 'tables' => $tables,
+ 'fields' => $fields,
+ 'conds' => $this->buildQueryConds( $table ),
+ 'options' => $options,
'join_conds' => $join_conds
);
}
+ /**
+ * Override reallyDoQuery to mix together two queries.
+ *
+ * @note $asc is named $descending in IndexPager base class. However
+ * it is true when the order is ascending, and false when the order
+ * is descending, so I renamed it to $asc here.
+ */
+ function reallyDoQuery( $offset, $limit, $asc ) {
+ $prevTableName = $this->mTableName;
+ $this->mTableName = 'image';
+ list( $tables, $fields, $conds, $fname, $options, $join_conds ) = $this->buildQueryInfo( $offset, $limit, $asc );
+ $imageRes = $this->mDb->select( $tables, $fields, $conds, $fname, $options, $join_conds );
+ $this->mTableName = $prevTableName;
+
+ if ( !$this->mShowAll ) {
+ return $imageRes;
+ }
+
+ $this->mTableName = 'oldimage';
+
+ # Hacky...
+ $oldIndex = $this->mIndexField;
+ if ( substr( $this->mIndexField, 0, 4 ) !== 'img_' ) {
+ throw new MWException( "Expected to be sorting on an image table field" );
+ }
+ $this->mIndexField = 'oi_' . substr( $this->mIndexField, 4 );
+
+ list( $tables, $fields, $conds, $fname, $options, $join_conds ) = $this->buildQueryInfo( $offset, $limit, $asc );
+ $oldimageRes = $this->mDb->select( $tables, $fields, $conds, $fname, $options, $join_conds );
+
+ $this->mTableName = $prevTableName;
+ $this->mIndexField = $oldIndex;
+
+ return $this->combineResult( $imageRes, $oldimageRes, $limit, $asc );
+ }
+
+ /**
+ * Combine results from 2 tables.
+ *
+ * Note: This will throw away some results
+ *
+ * @param $res1 ResultWrapper
+ * @param $res2 ResultWrapper
+ * @param $limit int
+ * @param $ascending boolean See note about $asc in $this->reallyDoQuery
+ * @return FakeResultWrapper $res1 and $res2 combined
+ */
+ protected function combineResult( $res1, $res2, $limit, $ascending ) {
+ $res1->rewind();
+ $res2->rewind();
+ $topRes1 = $res1->next();
+ $topRes2 = $res2->next();
+ $resultArray = array();
+ for ( $i = 0; $i < $limit && $topRes1 && $topRes2; $i++ ) {
+ if ( strcmp( $topRes1->{ $this->mIndexField }, $topRes2->{ $this->mIndexField } ) > 0 ) {
+ if ( !$ascending ) {
+ $resultArray[] = $topRes1;
+ $topRes1 = $res1->next();
+ } else {
+ $resultArray[] = $topRes2;
+ $topRes2 = $res2->next();
+ }
+ } else {
+ if ( !$ascending ) {
+ $resultArray[] = $topRes2;
+ $topRes2 = $res2->next();
+ } else {
+ $resultArray[] = $topRes1;
+ $topRes1 = $res1->next();
+ }
+ }
+ }
+ for ( ; $i < $limit && $topRes1; $i++ ) {
+ $resultArray[] = $topRes1;
+ $topRes1 = $res1->next();
+ }
+ for ( ; $i < $limit && $topRes2; $i++ ) {
+ $resultArray[] = $topRes2;
+ $topRes2 = $res2->next();
+ }
+ return new FakeResultWrapper( $resultArray );
+ }
+
function getDefaultSort() {
- return 'img_timestamp';
+ global $wgMiserMode;
+ if ( $this->mShowAll && $wgMiserMode && is_null( $this->mUserName ) ) {
+ // Unfortunately no index on oi_timestamp.
+ return 'img_name';
+ } else {
+ return 'img_timestamp';
+ }
}
function doBatchLookups() {
@@ -191,24 +389,37 @@ class ImageListPager extends TablePager {
function formatValue( $field, $value ) {
switch ( $field ) {
case 'thumb':
- $file = wfLocalFile( $value );
- $thumb = $file->transform( array( 'width' => 180, 'height' => 360 ) );
- return $thumb->toHtml( array( 'desc-link' => true ) );
+ $opt = array( 'time' => $this->mCurrentRow->img_timestamp );
+ $file = RepoGroup::singleton()->getLocalRepo()->findFile( $value, $opt );
+ // If statement for paranoia
+ if ( $file ) {
+ $thumb = $file->transform( array( 'width' => 180, 'height' => 360 ) );
+ return $thumb->toHtml( array( 'desc-link' => true ) );
+ } else {
+ return htmlspecialchars( $value );
+ }
case 'img_timestamp':
+ // We may want to make this a link to the "old" version when displaying old files
return htmlspecialchars( $this->getLanguage()->userTimeAndDate( $value, $this->getUser() ) );
case 'img_name':
static $imgfile = null;
- if ( $imgfile === null ) $imgfile = $this->msg( 'imgfile' )->text();
+ if ( $imgfile === null ) {
+ $imgfile = $this->msg( 'imgfile' )->text();
+ }
// Weird files can maybe exist? Bug 22227
$filePage = Title::makeTitleSafe( NS_FILE, $value );
- if( $filePage ) {
- $link = Linker::linkKnown( $filePage, htmlspecialchars( $filePage->getText() ) );
+ if ( $filePage ) {
+ $link = Linker::linkKnown(
+ $filePage,
+ htmlspecialchars( $filePage->getText() )
+ );
$download = Xml::element( 'a',
array( 'href' => wfLocalFile( $filePage )->getURL() ),
$imgfile
);
$download = $this->msg( 'parentheses' )->rawParams( $download )->escaped();
+
return "$link $download";
} else {
return htmlspecialchars( $value );
@@ -223,6 +434,7 @@ class ImageListPager extends TablePager {
} else {
$link = htmlspecialchars( $value );
}
+
return $link;
case 'img_size':
return htmlspecialchars( $this->getLanguage()->formatSize( $value ) );
@@ -230,32 +442,47 @@ class ImageListPager extends TablePager {
return Linker::formatComment( $value );
case 'count':
return intval( $value ) + 1;
+ case 'top':
+ // Messages: listfiles-latestversion-yes, listfiles-latestversion-no
+ return $this->msg( 'listfiles-latestversion-' . $value );
}
}
function getForm() {
global $wgScript, $wgMiserMode;
$inputForm = array();
- $inputForm['table_pager_limit_label'] = $this->getLimitSelect();
+ $inputForm['table_pager_limit_label'] = $this->getLimitSelect( array( 'tabindex' => 1 ) );
if ( !$wgMiserMode ) {
- $inputForm['listfiles_search_for'] = Html::input( 'ilsearch', $this->mSearch, 'text',
+ $inputForm['listfiles_search_for'] = Html::input(
+ 'ilsearch',
+ $this->mSearch,
+ 'text',
array(
- 'size' => '40',
+ 'size' => '40',
'maxlength' => '255',
- 'id' => 'mw-ilsearch',
- ) );
+ 'id' => 'mw-ilsearch',
+ 'tabindex' => 2,
+ )
+ );
}
$inputForm['username'] = Html::input( 'user', $this->mUserName, 'text', array(
- 'size' => '40',
+ 'size' => '40',
'maxlength' => '255',
- 'id' => 'mw-listfiles-user',
+ 'id' => 'mw-listfiles-user',
+ 'tabindex' => 3,
+ ) );
+
+ $inputForm['listfiles-show-all'] = Html::input( 'ilshowall', 1, 'checkbox', array(
+ 'checked' => $this->mShowAll,
+ 'tabindex' => 4,
) );
return Html::openElement( 'form',
- array( 'method' => 'get', 'action' => $wgScript, 'id' => 'mw-listfiles-form' ) ) .
+ array( 'method' => 'get', 'action' => $wgScript, 'id' => 'mw-listfiles-form' )
+ ) .
Xml::fieldset( $this->msg( 'listfiles' )->text() ) .
Html::hidden( 'title', $this->getTitle()->getPrefixedText() ) .
- Xml::buildForm( $inputForm, 'table_pager_limit_submit' ) .
- $this->getHiddenFields( array( 'limit', 'ilsearch', 'user', 'title' ) ) .
+ Xml::buildForm( $inputForm, 'table_pager_limit_submit', array( 'tabindex' => 5 ) ) .
+ $this->getHiddenFields( array( 'limit', 'ilsearch', 'user', 'title', 'ilshowall' ) ) .
Html::closeElement( 'fieldset' ) .
Html::closeElement( 'form' ) . "\n";
}
@@ -280,6 +507,7 @@ class ImageListPager extends TablePager {
$query['user'] = $this->mUserName;
}
}
+
return $queries;
}
@@ -288,6 +516,7 @@ class ImageListPager extends TablePager {
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 7cccf887..82a4f70f 100644
--- a/includes/specials/SpecialListgrouprights.php
+++ b/includes/specials/SpecialListgrouprights.php
@@ -29,7 +29,6 @@
* @author Petr Kadlec <mormegil@centrum.cz>
*/
class SpecialListGroupRights extends SpecialPage {
-
/**
* Constructor
*/
@@ -51,11 +50,13 @@ class SpecialListGroupRights extends SpecialPage {
$out = $this->getOutput();
$out->addModuleStyles( 'mediawiki.special' );
+ $out->wrapWikiMsg( "<div class=\"mw-listgrouprights-key\">\n$1\n</div>", 'listgrouprights-key' );
+
$out->addHTML(
Xml::openElement( 'table', array( 'class' => 'wikitable mw-listgrouprights-table' ) ) .
'<tr>' .
- Xml::element( 'th', null, $this->msg( 'listgrouprights-group' )->text() ) .
- Xml::element( 'th', null, $this->msg( 'listgrouprights-rights' )->text() ) .
+ Xml::element( 'th', null, $this->msg( 'listgrouprights-group' )->text() ) .
+ Xml::element( 'th', null, $this->msg( 'listgrouprights-rights' )->text() ) .
'</tr>'
);
@@ -85,7 +86,7 @@ class SpecialListGroupRights extends SpecialPage {
$msg->text() :
MWNamespace::getCanonicalName( NS_PROJECT ) . ':' . $groupname;
- if( $group == '*' ) {
+ if ( $group == '*' ) {
// Do not make a link for the generic * group
$grouppage = htmlspecialchars( $groupnameLocalized );
} else {
@@ -124,16 +125,13 @@ class SpecialListGroupRights extends SpecialPage {
"
<td>$grouppage$grouplink</td>
<td>" .
- $this->formatPermissions( $permissions, $revoke, $addgroups, $removegroups,
- $addgroupsSelf, $removegroupsSelf ) .
+ $this->formatPermissions( $permissions, $revoke, $addgroups, $removegroups,
+ $addgroupsSelf, $removegroupsSelf ) .
'</td>
'
) );
}
- $out->addHTML(
- Xml::closeElement( 'table' ) . "\n<br /><hr />\n"
- );
- $out->wrapWikiMsg( "<div class=\"mw-listgrouprights-key\">\n$1\n</div>", 'listgrouprights-key' );
+ $out->addHTML( Xml::closeElement( 'table' ) );
}
/**
@@ -149,9 +147,9 @@ class SpecialListGroupRights extends SpecialPage {
*/
private function formatPermissions( $permissions, $revoke, $add, $remove, $addSelf, $removeSelf ) {
$r = array();
- foreach( $permissions as $permission => $granted ) {
+ foreach ( $permissions as $permission => $granted ) {
//show as granted only if it isn't revoked to prevent duplicate display of permissions
- if( $granted && ( !isset( $revoke[$permission] ) || !$revoke[$permission] ) ) {
+ if ( $granted && ( !isset( $revoke[$permission] ) || !$revoke[$permission] ) ) {
$description = $this->msg( 'listgrouprights-right-display',
User::getRightDescription( $permission ),
'<span class="mw-listgrouprights-right-name">' . $permission . '</span>'
@@ -159,8 +157,8 @@ class SpecialListGroupRights extends SpecialPage {
$r[] = $description;
}
}
- foreach( $revoke as $permission => $revoked ) {
- if( $revoked ) {
+ foreach ( $revoke as $permission => $revoked ) {
+ if ( $revoked ) {
$description = $this->msg( 'listgrouprights-right-revoked',
User::getRightDescription( $permission ),
'<span class="mw-listgrouprights-right-name">' . $permission . '</span>'
@@ -168,45 +166,52 @@ class SpecialListGroupRights extends SpecialPage {
$r[] = $description;
}
}
+
sort( $r );
+
$lang = $this->getLanguage();
- if( $add === true ) {
+
+ if ( $add === true ) {
$r[] = $this->msg( 'listgrouprights-addgroup-all' )->escaped();
- } elseif( is_array( $add ) && count( $add ) ) {
+ } elseif ( is_array( $add ) && count( $add ) ) {
$add = array_values( array_unique( $add ) );
$r[] = $this->msg( 'listgrouprights-addgroup',
$lang->listToText( array_map( array( 'User', 'makeGroupLinkWiki' ), $add ) ),
count( $add )
)->parse();
}
- if( $remove === true ) {
+
+ if ( $remove === true ) {
$r[] = $this->msg( 'listgrouprights-removegroup-all' )->escaped();
- } elseif( is_array( $remove ) && count( $remove ) ) {
+ } elseif ( is_array( $remove ) && count( $remove ) ) {
$remove = array_values( array_unique( $remove ) );
$r[] = $this->msg( 'listgrouprights-removegroup',
$lang->listToText( array_map( array( 'User', 'makeGroupLinkWiki' ), $remove ) ),
count( $remove )
)->parse();
}
- if( $addSelf === true ) {
+
+ if ( $addSelf === true ) {
$r[] = $this->msg( 'listgrouprights-addgroup-self-all' )->escaped();
- } elseif( is_array( $addSelf ) && count( $addSelf ) ) {
+ } elseif ( is_array( $addSelf ) && count( $addSelf ) ) {
$addSelf = array_values( array_unique( $addSelf ) );
$r[] = $this->msg( 'listgrouprights-addgroup-self',
$lang->listToText( array_map( array( 'User', 'makeGroupLinkWiki' ), $addSelf ) ),
count( $addSelf )
)->parse();
}
- if( $removeSelf === true ) {
+
+ if ( $removeSelf === true ) {
$r[] = $this->msg( 'listgrouprights-removegroup-self-all' )->parse();
- } elseif( is_array( $removeSelf ) && count( $removeSelf ) ) {
+ } elseif ( is_array( $removeSelf ) && count( $removeSelf ) ) {
$removeSelf = array_values( array_unique( $removeSelf ) );
$r[] = $this->msg( 'listgrouprights-removegroup-self',
$lang->listToText( array_map( array( 'User', 'makeGroupLinkWiki' ), $removeSelf ) ),
count( $removeSelf )
)->parse();
}
- if( empty( $r ) ) {
+
+ if ( empty( $r ) ) {
return '';
} else {
return '<ul><li>' . implode( "</li>\n<li>", $r ) . '</li></ul>';
diff --git a/includes/specials/SpecialListredirects.php b/includes/specials/SpecialListredirects.php
index 0283767a..2c8792ff 100644
--- a/includes/specials/SpecialListredirects.php
+++ b/includes/specials/SpecialListredirects.php
@@ -29,7 +29,6 @@
* @ingroup SpecialPage
*/
class ListredirectsPage extends QueryPage {
-
function __construct( $name = 'Listredirects' ) {
parent::__construct( $name );
}
@@ -50,16 +49,16 @@ class ListredirectsPage extends QueryPage {
return array(
'tables' => array( 'p1' => 'page', 'redirect', 'p2' => 'page' ),
'fields' => array( 'namespace' => 'p1.page_namespace',
- 'title' => 'p1.page_title',
- 'value' => 'p1.page_title',
- 'rd_namespace',
- 'rd_title',
- 'rd_fragment',
- 'rd_interwiki',
- 'redirid' => 'p2.page_id' ),
+ 'title' => 'p1.page_title',
+ 'value' => 'p1.page_title',
+ 'rd_namespace',
+ 'rd_title',
+ 'rd_fragment',
+ 'rd_interwiki',
+ 'redirid' => 'p2.page_id' ),
'conds' => array( 'p1.page_is_redirect' => 1 ),
'join_conds' => array( 'redirect' => array(
- 'LEFT JOIN', 'rd_from=p1.page_id' ),
+ 'LEFT JOIN', 'rd_from=p1.page_id' ),
'p2' => array( 'LEFT JOIN', array(
'p2.page_namespace=rd_namespace',
'p2.page_title=rd_title' ) ) )
@@ -67,21 +66,23 @@ class ListredirectsPage extends QueryPage {
}
function getOrderFields() {
- return array ( 'p1.page_namespace', 'p1.page_title' );
+ return array( 'p1.page_namespace', 'p1.page_title' );
}
/**
* Cache page existence for performance
*
- * @param $db DatabaseBase
- * @param $res ResultWrapper
+ * @param DatabaseBase $db
+ * @param ResultWrapper $res
*/
function preprocessResults( $db, $res ) {
$batch = new LinkBatch;
+
foreach ( $res as $row ) {
$batch->add( $row->namespace, $row->title );
$batch->addObj( $this->getRedirectTarget( $row ) );
}
+
$batch->execute();
// Back to start for display
@@ -100,10 +101,16 @@ class ListredirectsPage extends QueryPage {
} else {
$title = Title::makeTitle( $row->namespace, $row->title );
$article = WikiPage::factory( $title );
+
return $article->getRedirectTarget();
}
}
+ /**
+ * @param Skin $skin
+ * @param object $result Result row
+ * @return string
+ */
function formatResult( $skin, $result ) {
# Make a link to the redirect itself
$rd_title = Title::makeTitle( $result->namespace, $result->title );
@@ -116,11 +123,12 @@ class ListredirectsPage extends QueryPage {
# Find out where the redirect leads
$target = $this->getRedirectTarget( $result );
- if( $target ) {
+ if ( $target ) {
# Make a link to the destination page
$lang = $this->getLanguage();
$arr = $lang->getArrow() . $lang->getDirMark();
$targetLink = Linker::link( $target );
+
return "$rd_link $arr $targetLink";
} else {
return "<del>$rd_link</del>";
diff --git a/includes/specials/SpecialListusers.php b/includes/specials/SpecialListusers.php
index d253a4d3..8cd9173c 100644
--- a/includes/specials/SpecialListusers.php
+++ b/includes/specials/SpecialListusers.php
@@ -49,7 +49,10 @@ class UsersPager extends AlphabeticPager {
$par = ( $par !== null ) ? $par : '';
$parms = explode( '/', $par );
$symsForAll = array( '*', 'user' );
- if ( $parms[0] != '' && ( in_array( $par, User::getAllGroups() ) || in_array( $par, $symsForAll ) ) ) {
+
+ if ( $parms[0] != '' &&
+ ( in_array( $par, User::getAllGroups() ) || in_array( $par, $symsForAll ) )
+ ) {
$this->requestedGroup = $par;
$un = $request->getText( 'username' );
} elseif ( count( $parms ) == 2 ) {
@@ -59,20 +62,25 @@ class UsersPager extends AlphabeticPager {
$this->requestedGroup = $request->getVal( 'group' );
$un = ( $par != '' ) ? $par : $request->getText( 'username' );
}
+
if ( in_array( $this->requestedGroup, $symsForAll ) ) {
$this->requestedGroup = '';
}
$this->editsOnly = $request->getBool( 'editsOnly' );
$this->creationSort = $request->getBool( 'creationSort' );
$this->including = $including;
+ $this->mDefaultDirection = $request->getBool( 'desc' );
$this->requestedUser = '';
+
if ( $un != '' ) {
$username = Title::makeTitleSafe( NS_USER, $un );
- if( ! is_null( $username ) ) {
+
+ if ( !is_null( $username ) ) {
$this->requestedUser = $username->getText();
}
}
+
parent::__construct();
}
@@ -89,27 +97,28 @@ class UsersPager extends AlphabeticPager {
function getQueryInfo() {
$dbr = wfGetDB( DB_SLAVE );
$conds = array();
+
// Don't show hidden names
- if( !$this->getUser()->isAllowed( 'hideuser' ) ) {
+ if ( !$this->getUser()->isAllowed( 'hideuser' ) ) {
$conds[] = 'ipb_deleted IS NULL OR ipb_deleted = 0';
}
$options = array();
- if( $this->requestedGroup != '' ) {
+ if ( $this->requestedGroup != '' ) {
$conds['ug_group'] = $this->requestedGroup;
- } else {
- //$options['USE INDEX'] = $this->creationSort ? 'PRIMARY' : 'user_name';
}
- if( $this->requestedUser != '' ) {
+
+ if ( $this->requestedUser != '' ) {
# Sorted either by account creation or name
- if( $this->creationSort ) {
+ if ( $this->creationSort ) {
$conds[] = 'user_id >= ' . intval( User::idFromName( $this->requestedUser ) );
} else {
$conds[] = 'user_name >= ' . $dbr->addQuotes( $this->requestedUser );
}
}
- if( $this->editsOnly ) {
+
+ if ( $this->editsOnly ) {
$conds[] = 'user_editcount > 0';
}
@@ -129,15 +138,18 @@ class UsersPager extends AlphabeticPager {
'options' => $options,
'join_conds' => array(
'user_groups' => array( 'LEFT JOIN', 'user_id=ug_user' ),
- 'ipblocks' => array( 'LEFT JOIN', array(
- 'user_id=ipb_user',
- 'ipb_auto' => 0
- )),
+ 'ipblocks' => array(
+ 'LEFT JOIN', array(
+ 'user_id=ipb_user',
+ 'ipb_auto' => 0
+ )
+ ),
),
'conds' => $conds
);
wfRunHooks( 'SpecialListusersQueryInfo', array( $this, &$query ) );
+
return $query;
}
@@ -153,42 +165,55 @@ class UsersPager extends AlphabeticPager {
$userName = $row->user_name;
$ulinks = Linker::userLink( $row->user_id, $userName );
- $ulinks .= Linker::userToolLinksRedContribs( $row->user_id, $userName, intval( $row->edits ) );
+ $ulinks .= Linker::userToolLinksRedContribs(
+ $row->user_id,
+ $userName,
+ (int)$row->edits
+ );
$lang = $this->getLanguage();
$groups = '';
$groups_list = self::getGroups( $row->user_id );
- if( !$this->including && count( $groups_list ) > 0 ) {
+
+ if ( !$this->including && count( $groups_list ) > 0 ) {
$list = array();
- foreach( $groups_list as $group )
+ foreach ( $groups_list as $group ) {
$list[] = self::buildGroupLink( $group, $userName );
+ }
$groups = $lang->commaList( $list );
}
$item = $lang->specialList( $ulinks, $groups );
- if( $row->ipb_deleted ) {
+
+ if ( $row->ipb_deleted ) {
$item = "<span class=\"deleted\">$item</span>";
}
$edits = '';
global $wgEdititis;
if ( !$this->including && $wgEdititis ) {
- $edits = ' [' . $this->msg( 'usereditcount' )->numParams( $row->edits )->escaped() . ']';
+ // @fixme i18n issue: Hardcoded square brackets.
+ $edits = ' [' .
+ $this->msg( 'usereditcount' )->numParams( $row->edits )->escaped() .
+ ']';
}
$created = '';
- # Some rows may be NULL
- if( !$this->including && $row->creation ) {
+ # Some rows may be null
+ if ( !$this->including && $row->creation ) {
$user = $this->getUser();
$d = $lang->userDate( $row->creation, $user );
$t = $lang->userTime( $row->creation, $user );
$created = $this->msg( 'usercreated', $d, $t, $row->user_name )->escaped();
$created = ' ' . $this->msg( 'parentheses' )->rawParams( $created )->escaped();
}
- $blocked = !is_null( $row->ipb_deleted ) ? ' ' . $this->msg( 'listusers-blocked', $userName )->escaped() : '';
+ $blocked = !is_null( $row->ipb_deleted ) ?
+ ' ' . $this->msg( 'listusers-blocked', $userName )->escaped() :
+ '';
wfRunHooks( 'SpecialListusersFormatRow', array( &$item, $row ) );
+
return Html::rawElement( 'li', array(), "{$item}{$edits}{$created}{$blocked}" );
}
@@ -212,7 +237,10 @@ class UsersPager extends AlphabeticPager {
list( $self ) = explode( '/', $this->getTitle()->getPrefixedDBkey() );
# Form tag
- $out = Xml::openElement( 'form', array( 'method' => 'get', 'action' => $wgScript, 'id' => 'mw-listusers-form' ) ) .
+ $out = Xml::openElement(
+ 'form',
+ array( 'method' => 'get', 'action' => $wgScript, 'id' => 'mw-listusers-form' )
+ ) .
Xml::fieldset( $this->msg( 'listusers' )->text() ) .
Html::hidden( 'title', $self );
@@ -233,12 +261,30 @@ class UsersPager extends AlphabeticPager {
$out .= Xml::label( $this->msg( 'group' )->text(), 'group' ) . ' ' .
Xml::openElement( 'select', array( 'name' => 'group', 'id' => 'group' ) ) .
Xml::option( $this->msg( 'group-all' )->text(), '' );
- foreach( $this->getAllGroups() as $group => $groupText )
+ foreach ( $this->getAllGroups() as $group => $groupText ) {
$out .= Xml::option( $groupText, $group, $group == $this->requestedGroup );
+ }
$out .= Xml::closeElement( 'select' ) . '<br />';
- $out .= Xml::checkLabel( $this->msg( 'listusers-editsonly' )->text(), 'editsOnly', 'editsOnly', $this->editsOnly );
+ $out .= Xml::checkLabel(
+ $this->msg( 'listusers-editsonly' )->text(),
+ 'editsOnly',
+ 'editsOnly',
+ $this->editsOnly
+ );
+ $out .= '&#160;';
+ $out .= Xml::checkLabel(
+ $this->msg( 'listusers-creationsort' )->text(),
+ 'creationSort',
+ 'creationSort',
+ $this->creationSort
+ );
$out .= '&#160;';
- $out .= Xml::checkLabel( $this->msg( 'listusers-creationsort' )->text(), 'creationSort', 'creationSort', $this->creationSort );
+ $out .= Xml::checkLabel(
+ $this->msg( 'listusers-desc' )->text(),
+ 'desc',
+ 'desc',
+ $this->mDefaultDirection
+ );
$out .= '<br />';
wfRunHooks( 'SpecialListusersHeaderForm', array( $this, &$out ) );
@@ -259,10 +305,11 @@ class UsersPager extends AlphabeticPager {
*/
function getAllGroups() {
$result = array();
- foreach( User::getAllGroups() as $group ) {
+ foreach ( User::getAllGroups() as $group ) {
$result[$group] = User::getGroupName( $group );
}
asort( $result );
+
return $result;
}
@@ -272,13 +319,14 @@ class UsersPager extends AlphabeticPager {
*/
function getDefaultQuery() {
$query = parent::getDefaultQuery();
- if( $this->requestedGroup != '' ) {
+ if ( $this->requestedGroup != '' ) {
$query['group'] = $this->requestedGroup;
}
- if( $this->requestedUser != '' ) {
+ if ( $this->requestedUser != '' ) {
$query['username'] = $this->requestedUser;
}
wfRunHooks( 'SpecialListusersDefaultQuery', array( $this, &$query ) );
+
return $query;
}
@@ -291,6 +339,7 @@ class UsersPager extends AlphabeticPager {
protected static function getGroups( $uid ) {
$user = User::newFromId( $uid );
$groups = array_diff( $user->getEffectiveGroups(), User::getImplicitGroups() );
+
return $groups;
}
@@ -302,7 +351,10 @@ class UsersPager extends AlphabeticPager {
* @return string
*/
protected static function buildGroupLink( $group, $username ) {
- return User::makeGroupLinkHtml( $group, htmlspecialchars( User::getGroupMember( $group, $username ) ) );
+ return User::makeGroupLinkHtml(
+ $group,
+ htmlspecialchars( User::getGroupMember( $group, $username ) )
+ );
}
}
@@ -310,7 +362,6 @@ class UsersPager extends AlphabeticPager {
* @ingroup SpecialPage
*/
class SpecialListUsers extends IncludableSpecialPage {
-
/**
* Constructor
*/
@@ -337,7 +388,7 @@ class SpecialListUsers extends IncludableSpecialPage {
$s = $up->getPageHeader();
}
- if( $usersbody ) {
+ if ( $usersbody ) {
$s .= $up->getNavigationBar();
$s .= Html::rawElement( 'ul', array(), $usersbody );
$s .= $up->getNavigationBar();
diff --git a/includes/specials/SpecialLog.php b/includes/specials/SpecialLog.php
index 4fc0f6e8..2ffdd89d 100644
--- a/includes/specials/SpecialLog.php
+++ b/includes/specials/SpecialLog.php
@@ -29,7 +29,6 @@
* @ingroup SpecialPage
*/
class SpecialLog extends SpecialPage {
-
/**
* List log type for which the target is a user
* Thus if the given target is in NS_MAIN we can alter it to be an NS_USER
@@ -75,14 +74,14 @@ class SpecialLog extends SpecialPage {
$opts->setValue( 'month', '' );
}
- // Reset the log type to default (nothing) if it's invalid or if the
- // user does not possess the right to view it
+ // If the user doesn't have the right permission to view the specific
+ // log type, throw a PermissionsError
+ // If the log type is invalid, just show all public logs
$type = $opts->getValue( 'type' );
- if ( !LogPage::isLogType( $type )
- || ( isset( $wgLogRestrictions[$type] )
- && !$this->getUser()->isAllowed( $wgLogRestrictions[$type] ) )
- ) {
+ if ( !LogPage::isLogType( $type ) ) {
$opts->setValue( 'type', '' );
+ } elseif ( isset( $wgLogRestrictions[$type] ) && !$this->getUser()->isAllowed( $wgLogRestrictions[$type] ) ) {
+ throw new PermissionsError( $wgLogRestrictions[$type] );
}
# Handle type-specific inputs
@@ -99,10 +98,10 @@ class SpecialLog extends SpecialPage {
# Some log types are only for a 'User:' title but we might have been given
# only the username instead of the full title 'User:username'. This part try
# to lookup for a user by that name and eventually fix user input. See bug 1697.
- if( in_array( $opts->getValue( 'type' ), $this->typeOnUser ) ) {
+ if ( in_array( $opts->getValue( 'type' ), $this->typeOnUser ) ) {
# ok we have a type of log which expect a user title.
$target = Title::newFromText( $opts->getValue( 'page' ) );
- if( $target && $target->getNamespace() === NS_MAIN ) {
+ if ( $target && $target->getNamespace() === NS_MAIN ) {
# User forgot to add 'User:', we are adding it for him
$opts->setValue( 'page',
Title::makeTitleSafe( NS_USER, $opts->getValue( 'page' ) )
@@ -117,9 +116,11 @@ class SpecialLog extends SpecialPage {
global $wgLogTypes;
# Get parameters
- $parms = explode( '/', ($par = ( $par !== null ) ? $par : '' ) );
+ $parms = explode( '/', ( $par = ( $par !== null ) ? $par : '' ) );
$symsForAll = array( '*', 'all' );
- if ( $parms[0] != '' && ( in_array( $par, $wgLogTypes ) || in_array( $par, $symsForAll ) ) ) {
+ if ( $parms[0] != '' &&
+ ( in_array( $par, $wgLogTypes ) || in_array( $par, $symsForAll ) )
+ ) {
$opts->setValue( 'type', $par );
} elseif ( count( $parms ) == 2 ) {
$opts->setValue( 'type', $parms[0] );
@@ -131,10 +132,22 @@ class SpecialLog extends SpecialPage {
private function show( FormOptions $opts, array $extraConds ) {
# Create a LogPager item to get the results and a LogEventsList item to format them...
- $loglist = new LogEventsList( $this->getContext(), null, LogEventsList::USE_REVDEL_CHECKBOXES );
- $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' ) );
+ $loglist = new LogEventsList(
+ $this->getContext(),
+ null,
+ LogEventsList::USE_REVDEL_CHECKBOXES
+ );
+ $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' )
+ );
$this->addHeader( $opts->getValue( 'type' ) );
@@ -144,16 +157,28 @@ class SpecialLog extends SpecialPage {
}
# Show form options
- $loglist->showOptions( $pager->getType(), $opts->getValue( 'user' ), $pager->getPage(), $pager->getPattern(),
- $pager->getYear(), $pager->getMonth(), $pager->getFilterParams(), $opts->getValue( 'tagfilter' ) );
+ $loglist->showOptions(
+ $pager->getType(),
+ $opts->getValue( 'user' ),
+ $pager->getPage(),
+ $pager->getPattern(),
+ $pager->getYear(),
+ $pager->getMonth(),
+ $pager->getFilterParams(),
+ $opts->getValue( 'tagfilter' )
+ );
# Insert list
$logBody = $pager->getBody();
if ( $logBody ) {
$this->getOutput()->addHTML(
$pager->getNavigationBar() .
- $this->getRevisionButton( $loglist->beginLogEventsList() . $logBody . $loglist->endLogEventsList() ) .
- $pager->getNavigationBar()
+ $this->getRevisionButton(
+ $loglist->beginLogEventsList() .
+ $logBody .
+ $loglist->endLogEventsList()
+ ) .
+ $pager->getNavigationBar()
);
} else {
$this->getOutput()->addWikiMsg( 'logempty' );
@@ -161,19 +186,27 @@ class SpecialLog extends SpecialPage {
}
private function getRevisionButton( $formcontents ) {
- # If the user doesn't have the ability to delete log entries, don't bother showing him/her the button.
+ # If the user doesn't have the ability to delete log entries,
+ # don't bother showing them the button.
if ( !$this->getUser()->isAllowedAll( 'deletedhistory', 'deletelogentry' ) ) {
return $formcontents;
}
# Show button to hide log entries
global $wgScript;
- $s = Html::openElement( 'form', array( 'action' => $wgScript, 'id' => 'mw-log-deleterevision-submit' ) ) . "\n";
+ $s = Html::openElement(
+ 'form',
+ array( 'action' => $wgScript, 'id' => 'mw-log-deleterevision-submit' )
+ ) . "\n";
$s .= Html::hidden( 'title', SpecialPage::getTitleFor( 'Revisiondelete' ) ) . "\n";
$s .= Html::hidden( 'target', SpecialPage::getTitleFor( 'Log' ) ) . "\n";
$s .= Html::hidden( 'type', 'logging' ) . "\n";
- $button = Html::element( 'button',
- array( 'type' => 'submit', 'class' => "deleterevision-log-submit mw-log-deleterevision-button" ),
+ $button = Html::element(
+ 'button',
+ array(
+ 'type' => 'submit',
+ 'class' => "deleterevision-log-submit mw-log-deleterevision-button"
+ ),
$this->msg( 'showhideselectedlogentries' )->text()
) . "\n";
$s .= $button . $formcontents . $button;
diff --git a/includes/specials/SpecialLonelypages.php b/includes/specials/SpecialLonelypages.php
index 8c6a88ac..7c7771d7 100644
--- a/includes/specials/SpecialLonelypages.php
+++ b/includes/specials/SpecialLonelypages.php
@@ -28,7 +28,6 @@
* @ingroup SpecialPage
*/
class LonelyPagesPage extends PageQueryPage {
-
function __construct( $name = 'Lonelypages' ) {
parent::__construct( $name );
}
@@ -50,32 +49,43 @@ class LonelyPagesPage extends PageQueryPage {
}
function getQueryInfo() {
- return array (
- 'tables' => array ( 'page', 'pagelinks',
- 'templatelinks' ),
- 'fields' => array ( 'namespace' => 'page_namespace',
- 'title' => 'page_title',
- 'value' => 'page_title' ),
- 'conds' => array ( 'pl_namespace IS NULL',
- 'page_namespace' => MWNamespace::getContentNamespaces(),
- 'page_is_redirect' => 0,
- 'tl_namespace IS NULL' ),
- 'join_conds' => array (
- 'pagelinks' => array (
- 'LEFT JOIN', array (
+ return array(
+ 'tables' => array(
+ 'page', 'pagelinks',
+ 'templatelinks'
+ ),
+ 'fields' => array(
+ 'namespace' => 'page_namespace',
+ 'title' => 'page_title',
+ 'value' => 'page_title'
+ ),
+ 'conds' => array(
+ 'pl_namespace IS NULL',
+ 'page_namespace' => MWNamespace::getContentNamespaces(),
+ 'page_is_redirect' => 0,
+ 'tl_namespace IS NULL'
+ ),
+ 'join_conds' => array(
+ 'pagelinks' => array(
+ 'LEFT JOIN', array(
'pl_namespace = page_namespace',
- 'pl_title = page_title' ) ),
- 'templatelinks' => array (
- 'LEFT JOIN', array (
+ 'pl_title = page_title'
+ )
+ ),
+ 'templatelinks' => array(
+ 'LEFT JOIN', array(
'tl_namespace = page_namespace',
- 'tl_title = page_title' ) ) )
+ 'tl_title = page_title'
+ )
+ )
+ )
);
}
function getOrderFields() {
// For some crazy reason ordering by a constant
// causes a filesort in MySQL 5
- if( count( MWNamespace::getContentNamespaces() ) > 1 ) {
+ if ( count( MWNamespace::getContentNamespaces() ) > 1 ) {
return array( 'page_namespace', 'page_title' );
} else {
return array( 'page_title' );
diff --git a/includes/specials/SpecialLongpages.php b/includes/specials/SpecialLongpages.php
index c045f9e9..d90d2718 100644
--- a/includes/specials/SpecialLongpages.php
+++ b/includes/specials/SpecialLongpages.php
@@ -26,7 +26,6 @@
* @ingroup SpecialPage
*/
class LongPagesPage extends ShortPagesPage {
-
function __construct( $name = 'Longpages' ) {
parent::__construct( $name );
}
diff --git a/includes/specials/SpecialMIMEsearch.php b/includes/specials/SpecialMIMEsearch.php
index c5a109d4..3eeae310 100644
--- a/includes/specials/SpecialMIMEsearch.php
+++ b/includes/specials/SpecialMIMEsearch.php
@@ -35,7 +35,7 @@ class MIMEsearchPage extends QueryPage {
}
function isExpensive() {
- return true;
+ return false;
}
function isSyndicated() {
@@ -51,19 +51,52 @@ class MIMEsearchPage extends QueryPage {
}
public function getQueryInfo() {
- return array(
+ $qi = array(
'tables' => array( 'image' ),
- 'fields' => array( 'namespace' => NS_FILE,
- 'title' => 'img_name',
- 'value' => 'img_major_mime',
- 'img_size',
- 'img_width',
- 'img_height',
- 'img_user_text',
- 'img_timestamp' ),
- 'conds' => array( 'img_major_mime' => $this->major,
- 'img_minor_mime' => $this->minor )
+ 'fields' => array(
+ 'namespace' => NS_FILE,
+ 'title' => 'img_name',
+ // Still have a value field just in case,
+ // but it isn't actually used for sorting.
+ 'value' => 'img_name',
+ 'img_size',
+ 'img_width',
+ 'img_height',
+ 'img_user_text',
+ 'img_timestamp'
+ ),
+ 'conds' => array(
+ 'img_major_mime' => $this->major,
+ 'img_minor_mime' => $this->minor,
+ // This is in order to trigger using
+ // the img_media_mime index in "range" mode.
+ 'img_media_type' => array(
+ MEDIATYPE_BITMAP,
+ MEDIATYPE_DRAWING,
+ MEDIATYPE_AUDIO,
+ MEDIATYPE_VIDEO,
+ MEDIATYPE_MULTIMEDIA,
+ MEDIATYPE_UNKNOWN,
+ MEDIATYPE_OFFICE,
+ MEDIATYPE_TEXT,
+ MEDIATYPE_EXECUTABLE,
+ MEDIATYPE_ARCHIVE,
+ ),
+ ),
);
+ return $qi;
+ }
+
+ /**
+ * The index is on (img_media_type, img_major_mime, img_minor_mime)
+ * which unfortunately doesn't have img_name at the end for sorting.
+ * So tell db to sort it however it wishes (Its not super important
+ * that this report gives results in a logical order). As an aditional
+ * note, mysql seems to by default order things by img_name ASC, which
+ * is what we ideally want, so everything works out fine anyhow.
+ */
+ function getOrderFields() {
+ return array();
}
function execute( $par ) {
@@ -74,24 +107,36 @@ class MIMEsearchPage extends QueryPage {
$this->setHeaders();
$this->outputHeader();
$this->getOutput()->addHTML(
- Xml::openElement( 'form', array( 'id' => 'specialmimesearch', 'method' => 'get', 'action' => $wgScript ) ) .
- Xml::openElement( 'fieldset' ) .
- Html::hidden( 'title', $this->getTitle()->getPrefixedText() ) .
- Xml::element( 'legend', null, $this->msg( 'mimesearch' )->text() ) .
- Xml::inputLabel( $this->msg( 'mimetype' )->text(), 'mime', 'mime', 20, $mime ) . ' ' .
- Xml::submitButton( $this->msg( 'ilsubmit' )->text() ) .
- Xml::closeElement( 'fieldset' ) .
- Xml::closeElement( 'form' )
+ Xml::openElement(
+ 'form',
+ array( 'id' => 'specialmimesearch', 'method' => 'get', 'action' => $wgScript )
+ ) .
+ Xml::openElement( 'fieldset' ) .
+ Html::hidden( 'title', $this->getTitle()->getPrefixedText() ) .
+ Xml::element( 'legend', null, $this->msg( 'mimesearch' )->text() ) .
+ Xml::inputLabel( $this->msg( 'mimetype' )->text(), 'mime', 'mime', 20, $mime ) .
+ ' ' .
+ Xml::submitButton( $this->msg( 'ilsubmit' )->text() ) .
+ Xml::closeElement( 'fieldset' ) .
+ Xml::closeElement( 'form' )
);
list( $this->major, $this->minor ) = File::splitMime( $mime );
+
if ( $this->major == '' || $this->minor == '' || $this->minor == 'unknown' ||
- !self::isValidType( $this->major ) ) {
+ !self::isValidType( $this->major )
+ ) {
return;
}
+
parent::execute( $par );
}
+ /**
+ * @param Skin $skin
+ * @param object $result Result row
+ * @return string
+ */
function formatResult( $skin, $result ) {
global $wgContLang;
@@ -108,8 +153,13 @@ class MIMEsearchPage extends QueryPage {
$bytes = htmlspecialchars( $lang->formatSize( $result->img_size ) );
$dimensions = $this->msg( 'widthheight' )->numParams( $result->img_width,
$result->img_height )->escaped();
- $user = Linker::link( Title::makeTitle( NS_USER, $result->img_user_text ), htmlspecialchars( $result->img_user_text ) );
- $time = htmlspecialchars( $lang->userTimeAndDate( $result->img_timestamp, $this->getUser() ) );
+ $user = Linker::link(
+ Title::makeTitle( NS_USER, $result->img_user_text ),
+ htmlspecialchars( $result->img_user_text )
+ );
+
+ $time = $lang->userTimeAndDate( $result->img_timestamp, $this->getUser() );
+ $time = htmlspecialchars( $time );
return "$download $plink . . $dimensions . . $bytes . . $user . . $time";
}
@@ -131,6 +181,7 @@ class MIMEsearchPage extends QueryPage {
'model',
'multipart'
);
+
return in_array( $type, $types );
}
diff --git a/includes/specials/SpecialMergeHistory.php b/includes/specials/SpecialMergeHistory.php
index 1476e156..fb5ea657 100644
--- a/includes/specials/SpecialMergeHistory.php
+++ b/includes/specials/SpecialMergeHistory.php
@@ -52,14 +52,14 @@ class SpecialMergeHistory extends SpecialPage {
$this->mTargetID = intval( $request->getVal( 'targetID' ) );
$this->mDestID = intval( $request->getVal( 'destID' ) );
$this->mTimestamp = $request->getVal( 'mergepoint' );
- if( !preg_match( '/[0-9]{14}/', $this->mTimestamp ) ) {
+ if ( !preg_match( '/[0-9]{14}/', $this->mTimestamp ) ) {
$this->mTimestamp = '';
}
$this->mComment = $request->getText( 'wpComment' );
$this->mMerge = $request->wasPosted() && $this->getUser()->matchEditToken( $request->getVal( 'wpEditToken' ) );
// target page
- if( $this->mSubmitted ) {
+ if ( $this->mSubmitted ) {
$this->mTargetObj = Title::newFromURL( $this->mTarget );
$this->mDestObj = Title::newFromURL( $this->mDest );
} else {
@@ -75,7 +75,7 @@ class SpecialMergeHistory extends SpecialPage {
*/
function preCacheMessages() {
// Precache various messages
- if( !isset( $this->message ) ) {
+ if ( !isset( $this->message ) ) {
$this->message['last'] = $this->msg( 'last' )->escaped();
}
}
@@ -89,20 +89,22 @@ class SpecialMergeHistory extends SpecialPage {
$this->setHeaders();
$this->outputHeader();
- if( $this->mTargetID && $this->mDestID && $this->mAction == 'submit' && $this->mMerge ) {
+ if ( $this->mTargetID && $this->mDestID && $this->mAction == 'submit' && $this->mMerge ) {
$this->merge();
+
return;
}
if ( !$this->mSubmitted ) {
$this->showMergeForm();
+
return;
}
$errors = array();
if ( !$this->mTargetObj instanceof Title ) {
$errors[] = $this->msg( 'mergehistory-invalid-source' )->parseAsBlock();
- } elseif( !$this->mTargetObj->exists() ) {
+ } elseif ( !$this->mTargetObj->exists() ) {
$errors[] = $this->msg( 'mergehistory-no-source', array( 'parse' ),
wfEscapeWikiText( $this->mTargetObj->getPrefixedText() )
)->parseAsBlock();
@@ -110,7 +112,7 @@ class SpecialMergeHistory extends SpecialPage {
if ( !$this->mDestObj instanceof Title ) {
$errors[] = $this->msg( 'mergehistory-invalid-destination' )->parseAsBlock();
- } elseif( !$this->mDestObj->exists() ) {
+ } elseif ( !$this->mDestObj->exists() ) {
$errors[] = $this->msg( 'mergehistory-no-destination', array( 'parse' ),
wfEscapeWikiText( $this->mDestObj->getPrefixedText() )
)->parseAsBlock();
@@ -126,7 +128,6 @@ class SpecialMergeHistory extends SpecialPage {
} else {
$this->showHistory();
}
-
}
function showMergeForm() {
@@ -138,25 +139,25 @@ class SpecialMergeHistory extends SpecialPage {
Xml::openElement( 'form', array(
'method' => 'get',
'action' => $wgScript ) ) .
- '<fieldset>' .
- Xml::element( 'legend', array(),
- $this->msg( 'mergehistory-box' )->text() ) .
- Html::hidden( 'title', $this->getTitle()->getPrefixedDBkey() ) .
- Html::hidden( 'submitted', '1' ) .
- Html::hidden( 'mergepoint', $this->mTimestamp ) .
- Xml::openElement( 'table' ) .
- '<tr>
+ '<fieldset>' .
+ Xml::element( 'legend', array(),
+ $this->msg( 'mergehistory-box' )->text() ) .
+ Html::hidden( 'title', $this->getTitle()->getPrefixedDBkey() ) .
+ Html::hidden( 'submitted', '1' ) .
+ Html::hidden( 'mergepoint', $this->mTimestamp ) .
+ Xml::openElement( 'table' ) .
+ '<tr>
<td>' . Xml::label( $this->msg( 'mergehistory-from' )->text(), 'target' ) . '</td>
<td>' . Xml::input( 'target', 30, $this->mTarget, array( 'id' => 'target' ) ) . '</td>
</tr><tr>
<td>' . Xml::label( $this->msg( 'mergehistory-into' )->text(), 'dest' ) . '</td>
<td>' . Xml::input( 'dest', 30, $this->mDest, array( 'id' => 'dest' ) ) . '</td>
</tr><tr><td>' .
- Xml::submitButton( $this->msg( 'mergehistory-go' )->text() ) .
- '</td></tr>' .
- Xml::closeElement( 'table' ) .
- '</fieldset>' .
- '</form>'
+ Xml::submitButton( $this->msg( 'mergehistory-go' )->text() ) .
+ '</td></tr>' .
+ Xml::closeElement( 'table' ) .
+ '</fieldset>' .
+ '</form>'
);
}
@@ -183,40 +184,40 @@ class SpecialMergeHistory extends SpecialPage {
);
$out->addHTML( $top );
- if( $haveRevisions ) {
+ if ( $haveRevisions ) {
# Format the user-visible controls (comment field, submission button)
# in a nice little table
$table =
Xml::openElement( 'fieldset' ) .
- $this->msg( 'mergehistory-merge', $this->mTargetObj->getPrefixedText(),
- $this->mDestObj->getPrefixedText() )->parse() .
- Xml::openElement( 'table', array( 'id' => 'mw-mergehistory-table' ) ) .
+ $this->msg( 'mergehistory-merge', $this->mTargetObj->getPrefixedText(),
+ $this->mDestObj->getPrefixedText() )->parse() .
+ Xml::openElement( 'table', array( 'id' => 'mw-mergehistory-table' ) ) .
'<tr>
<td class="mw-label">' .
- Xml::label( $this->msg( 'mergehistory-reason' )->text(), 'wpComment' ) .
- '</td>
- <td class="mw-input">' .
- Xml::input( 'wpComment', 50, $this->mComment, array( 'id' => 'wpComment' ) ) .
- '</td>
+ Xml::label( $this->msg( 'mergehistory-reason' )->text(), 'wpComment' ) .
+ '</td>
+ <td class="mw-input">' .
+ Xml::input( 'wpComment', 50, $this->mComment, array( 'id' => 'wpComment' ) ) .
+ '</td>
</tr>
<tr>
<td>&#160;</td>
<td class="mw-submit">' .
- Xml::submitButton( $this->msg( 'mergehistory-submit' )->text(), array( 'name' => 'merge', 'id' => 'mw-merge-submit' ) ) .
- '</td>
+ Xml::submitButton( $this->msg( 'mergehistory-submit' )->text(), array( 'name' => 'merge', 'id' => 'mw-merge-submit' ) ) .
+ '</td>
</tr>' .
- Xml::closeElement( 'table' ) .
- Xml::closeElement( 'fieldset' );
+ Xml::closeElement( 'table' ) .
+ Xml::closeElement( 'fieldset' );
$out->addHTML( $table );
}
$out->addHTML(
'<h2 id="mw-mergehistory">' .
- $this->msg( 'mergehistory-list' )->escaped() . "</h2>\n"
+ $this->msg( 'mergehistory-list' )->escaped() . "</h2>\n"
);
- if( $haveRevisions ) {
+ if ( $haveRevisions ) {
$out->addHTML( $revisions->getNavigationBar() );
$out->addHTML( '<ul>' );
$out->addHTML( $revisions->getBody() );
@@ -261,14 +262,14 @@ class SpecialMergeHistory extends SpecialPage {
array(),
array( 'oldid' => $rev->getId() )
);
- if( $rev->isDeleted( Revision::DELETED_TEXT ) ) {
+ if ( $rev->isDeleted( Revision::DELETED_TEXT ) ) {
$pageLink = '<span class="history-deleted">' . $pageLink . '</span>';
}
# Last link
- if( !$rev->userCan( Revision::DELETED_TEXT, $user ) ) {
+ if ( !$rev->userCan( Revision::DELETED_TEXT, $user ) ) {
$last = $this->message['last'];
- } elseif( isset( $this->prevId[$row->rev_id] ) ) {
+ } elseif ( isset( $this->prevId[$row->rev_id] ) ) {
$last = Linker::linkKnown(
$rev->getTitle(),
$this->message['last'],
@@ -283,7 +284,7 @@ class SpecialMergeHistory extends SpecialPage {
$userLink = Linker::revUserTools( $rev );
$size = $row->rev_len;
- if( !is_null( $size ) ) {
+ if ( !is_null( $size ) ) {
$stxt = Linker::formatRevisionSize( $size );
}
$comment = Linker::revComment( $rev );
@@ -298,10 +299,10 @@ class SpecialMergeHistory extends SpecialPage {
# keep it consistent...
$targetTitle = Title::newFromID( $this->mTargetID );
$destTitle = Title::newFromID( $this->mDestID );
- if( is_null( $targetTitle ) || is_null( $destTitle ) ) {
+ if ( is_null( $targetTitle ) || is_null( $destTitle ) ) {
return false; // validate these
}
- if( $targetTitle->getArticleID() == $destTitle->getArticleID() ) {
+ if ( $targetTitle->getArticleID() == $destTitle->getArticleID() ) {
return false;
}
# Verify that this timestamp is valid
@@ -317,8 +318,9 @@ class SpecialMergeHistory extends SpecialPage {
__METHOD__
);
# Destination page must exist with revisions
- if( !$maxtimestamp ) {
+ if ( !$maxtimestamp ) {
$this->getOutput()->addWikiMsg( 'mergehistory-fail' );
+
return false;
}
# Get the latest timestamp of the source
@@ -329,12 +331,13 @@ class SpecialMergeHistory extends SpecialPage {
__METHOD__
);
# $this->mTimestamp must be older than $maxtimestamp
- if( $this->mTimestamp >= $maxtimestamp ) {
+ if ( $this->mTimestamp >= $maxtimestamp ) {
$this->getOutput()->addWikiMsg( 'mergehistory-fail' );
+
return false;
}
# Update the revisions
- if( $this->mTimestamp ) {
+ if ( $this->mTimestamp ) {
$timewhere = "rev_timestamp <= {$this->mTimestamp}";
$timestampLimit = wfTimestamp( TS_MW, $this->mTimestamp );
} else {
@@ -354,12 +357,12 @@ class SpecialMergeHistory extends SpecialPage {
$haveRevisions = $dbw->selectField(
'revision',
'rev_timestamp',
- array( 'rev_page' => $this->mTargetID ),
+ array( 'rev_page' => $this->mTargetID ),
__METHOD__,
array( 'FOR UPDATE' )
);
- if( !$haveRevisions ) {
- if( $this->mComment ) {
+ if ( !$haveRevisions ) {
+ if ( $this->mComment ) {
$comment = $this->msg(
'mergehistory-comment',
$targetTitle->getPrefixedText(),
@@ -380,8 +383,8 @@ class SpecialMergeHistory extends SpecialPage {
if ( $redirectContent ) {
$redirectPage = WikiPage::factory( $targetTitle );
$redirectRevision = new Revision( array(
- 'title' => $targetTitle,
- 'page' => $this->mTargetID,
+ 'title' => $targetTitle,
+ 'page' => $this->mTargetID,
'comment' => $comment,
'content' => $redirectContent ) );
$redirectRevision->insertOn( $dbw );
@@ -392,9 +395,9 @@ class SpecialMergeHistory extends SpecialPage {
$dbw->delete( 'pagelinks', array( 'pl_from' => $this->mDestID ), __METHOD__ );
$dbw->insert( 'pagelinks',
array(
- 'pl_from' => $this->mDestID,
+ 'pl_from' => $this->mDestID,
'pl_namespace' => $destTitle->getNamespace(),
- 'pl_title' => $destTitle->getDBkey() ),
+ 'pl_title' => $destTitle->getDBkey() ),
__METHOD__
);
} else {
@@ -405,15 +408,16 @@ class SpecialMergeHistory extends SpecialPage {
}
$destTitle->invalidateCache(); // update histories
# Check if this did anything
- if( !$count ) {
+ if ( !$count ) {
$this->getOutput()->addWikiMsg( 'mergehistory-fail' );
+
return false;
}
# Update our logs
$log = new LogPage( 'merge' );
$log->addEntry(
'merge', $targetTitle, $this->mComment,
- array( $destTitle->getPrefixedText(), $timestampLimit )
+ array( $destTitle->getPrefixedText(), $timestampLimit ), $this->getUser()
);
$this->getOutput()->addWikiMsg( 'mergehistory-success',
@@ -462,9 +466,9 @@ class MergeHistoryPager extends ReverseChronologicalPager {
$batch->addObj( Title::makeTitleSafe( NS_USER_TALK, $row->user_name ) );
$rev_id = isset( $rev_id ) ? $rev_id : $row->rev_id;
- if( $rev_id > $row->rev_id ) {
+ if ( $rev_id > $row->rev_id ) {
$this->mForm->prevId[$rev_id] = $row->rev_id;
- } elseif( $rev_id < $row->rev_id ) {
+ } elseif ( $rev_id < $row->rev_id ) {
$this->mForm->prevId[$row->rev_id] = $rev_id;
}
@@ -475,6 +479,7 @@ class MergeHistoryPager extends ReverseChronologicalPager {
$this->mResult->seek( 0 );
wfProfileOut( __METHOD__ );
+
return '';
}
@@ -486,10 +491,11 @@ class MergeHistoryPager extends ReverseChronologicalPager {
$conds = $this->mConds;
$conds['rev_page'] = $this->articleID;
$conds[] = "rev_timestamp < {$this->maxTimestamp}";
+
return array(
'tables' => array( 'revision', 'page', 'user' ),
'fields' => array_merge( Revision::selectFields(), Revision::selectUserFields() ),
- 'conds' => $conds,
+ 'conds' => $conds,
'join_conds' => array(
'page' => Revision::pageJoinCond(),
'user' => Revision::userJoinCond() )
diff --git a/includes/specials/SpecialMostcategories.php b/includes/specials/SpecialMostcategories.php
index 11f26bd7..9b67f343 100644
--- a/includes/specials/SpecialMostcategories.php
+++ b/includes/specials/SpecialMostcategories.php
@@ -30,7 +30,6 @@
* @ingroup SpecialPage
*/
class MostcategoriesPage extends QueryPage {
-
function __construct( $name = 'Mostcategories' ) {
parent::__construct( $name );
}
@@ -44,22 +43,30 @@ class MostcategoriesPage extends QueryPage {
}
function getQueryInfo() {
- return array (
- 'tables' => array ( 'categorylinks', 'page' ),
- 'fields' => array ( 'namespace' => 'page_namespace',
- 'title' => 'page_title',
- 'value' => 'COUNT(*)' ),
- 'conds' => array ( 'page_namespace' => MWNamespace::getContentNamespaces() ),
- 'options' => array ( 'HAVING' => 'COUNT(*) > 1',
- 'GROUP BY' => array( 'page_namespace', 'page_title' ) ),
- 'join_conds' => array ( 'page' => array ( 'LEFT JOIN',
- 'page_id = cl_from' ) )
+ return array(
+ 'tables' => array( 'categorylinks', 'page' ),
+ 'fields' => array(
+ 'namespace' => 'page_namespace',
+ 'title' => 'page_title',
+ 'value' => 'COUNT(*)'
+ ),
+ 'conds' => array( 'page_namespace' => MWNamespace::getContentNamespaces() ),
+ 'options' => array(
+ 'HAVING' => 'COUNT(*) > 1',
+ 'GROUP BY' => array( 'page_namespace', 'page_title' )
+ ),
+ 'join_conds' => array(
+ 'page' => array(
+ 'LEFT JOIN',
+ 'page_id = cl_from'
+ )
+ )
);
}
/**
- * @param $db DatabaseBase
- * @param $res
+ * @param DatabaseBase $db
+ * @param ResultWrapper $res
*/
function preprocessResults( $db, $res ) {
# There's no point doing a batch check if we aren't caching results;
@@ -78,15 +85,22 @@ class MostcategoriesPage extends QueryPage {
}
/**
- * @param $skin Skin
- * @param $result
+ * @param Skin $skin
+ * @param object $result Result row
* @return string
*/
function formatResult( $skin, $result ) {
$title = Title::makeTitleSafe( $result->namespace, $result->title );
if ( !$title ) {
- return Html::element( 'span', array( 'class' => 'mw-invalidtitle' ),
- Linker::getInvalidTitleDescription( $this->getContext(), $result->namespace, $result->title ) );
+ return Html::element(
+ 'span',
+ array( 'class' => 'mw-invalidtitle' ),
+ Linker::getInvalidTitleDescription(
+ $this->getContext(),
+ $result->namespace,
+ $result->title
+ )
+ );
}
if ( $this->isCached() ) {
diff --git a/includes/specials/SpecialMostimages.php b/includes/specials/SpecialMostimages.php
index 78b2d911..98d8da3a 100644
--- a/includes/specials/SpecialMostimages.php
+++ b/includes/specials/SpecialMostimages.php
@@ -30,7 +30,6 @@
* @ingroup SpecialPage
*/
class MostimagesPage extends ImageQueryPage {
-
function __construct( $name = 'Mostimages' ) {
parent::__construct( $name );
}
@@ -44,13 +43,17 @@ class MostimagesPage extends ImageQueryPage {
}
function getQueryInfo() {
- return array (
- 'tables' => array ( 'imagelinks' ),
- 'fields' => array ( 'namespace' => NS_FILE,
- 'title' => 'il_to',
- 'value' => 'COUNT(*)' ),
- 'options' => array ( 'GROUP BY' => 'il_to',
- 'HAVING' => 'COUNT(*) > 1' )
+ return array(
+ 'tables' => array( 'imagelinks' ),
+ 'fields' => array(
+ 'namespace' => NS_FILE,
+ 'title' => 'il_to',
+ 'value' => 'COUNT(*)'
+ ),
+ 'options' => array(
+ 'GROUP BY' => 'il_to',
+ 'HAVING' => 'COUNT(*) > 1'
+ )
);
}
diff --git a/includes/specials/SpecialMostinterwikis.php b/includes/specials/SpecialMostinterwikis.php
index 574a9afb..98dd68e9 100644
--- a/includes/specials/SpecialMostinterwikis.php
+++ b/includes/specials/SpecialMostinterwikis.php
@@ -30,7 +30,6 @@
* @ingroup SpecialPage
*/
class MostinterwikisPage extends QueryPage {
-
function __construct( $name = 'Mostinterwikis' ) {
parent::__construct( $name );
}
@@ -44,24 +43,24 @@ class MostinterwikisPage extends QueryPage {
}
function getQueryInfo() {
- return array (
- 'tables' => array (
+ return array(
+ 'tables' => array(
'langlinks',
'page'
- ), 'fields' => array (
+ ), 'fields' => array(
'namespace' => 'page_namespace',
'title' => 'page_title',
'value' => 'COUNT(*)'
- ), 'conds' => array (
+ ), 'conds' => array(
'page_namespace' => MWNamespace::getContentNamespaces()
- ), 'options' => array (
+ ), 'options' => array(
'HAVING' => 'COUNT(*) > 1',
- 'GROUP BY' => array (
+ 'GROUP BY' => array(
'page_namespace',
'page_title'
)
- ), 'join_conds' => array (
- 'page' => array (
+ ), 'join_conds' => array(
+ 'page' => array(
'LEFT JOIN',
'page_id = ll_from'
)
@@ -72,8 +71,8 @@ class MostinterwikisPage extends QueryPage {
/**
* Pre-fill the link cache
*
- * @param $db DatabaseBase
- * @param $res
+ * @param DatabaseBase $db
+ * @param ResultWrapper $res
*/
function preprocessResults( $db, $res ) {
# There's no point doing a batch check if we aren't caching results;
@@ -100,8 +99,15 @@ class MostinterwikisPage extends QueryPage {
function formatResult( $skin, $result ) {
$title = Title::makeTitleSafe( $result->namespace, $result->title );
if ( !$title ) {
- return Html::element( 'span', array( 'class' => 'mw-invalidtitle' ),
- Linker::getInvalidTitleDescription( $this->getContext(), $result->namespace, $result->title ) );
+ return Html::element(
+ 'span',
+ array( 'class' => 'mw-invalidtitle' ),
+ Linker::getInvalidTitleDescription(
+ $this->getContext(),
+ $result->namespace,
+ $result->title
+ )
+ );
}
if ( $this->isCached() ) {
diff --git a/includes/specials/SpecialMostlinked.php b/includes/specials/SpecialMostlinked.php
index 4b6e5670..37593bf9 100644
--- a/includes/specials/SpecialMostlinked.php
+++ b/includes/specials/SpecialMostlinked.php
@@ -31,7 +31,6 @@
* @ingroup SpecialPage
*/
class MostlinkedPage extends QueryPage {
-
function __construct( $name = 'Mostlinked' ) {
parent::__construct( $name );
}
@@ -45,33 +44,47 @@ class MostlinkedPage extends QueryPage {
}
function getQueryInfo() {
- return array (
- 'tables' => array ( 'pagelinks', 'page' ),
- 'fields' => array ( 'namespace' => 'pl_namespace',
- 'title' => 'pl_title',
- 'value' => 'COUNT(*)',
- 'page_namespace' ),
- 'options' => array ( 'HAVING' => 'COUNT(*) > 1',
- 'GROUP BY' => array( 'pl_namespace', 'pl_title',
- 'page_namespace' ) ),
- 'join_conds' => array ( 'page' => array ( 'LEFT JOIN',
- array ( 'page_namespace = pl_namespace',
- 'page_title = pl_title' ) ) )
+ return array(
+ 'tables' => array( 'pagelinks', 'page' ),
+ 'fields' => array(
+ 'namespace' => 'pl_namespace',
+ 'title' => 'pl_title',
+ 'value' => 'COUNT(*)',
+ 'page_namespace'
+ ),
+ 'options' => array(
+ 'HAVING' => 'COUNT(*) > 1',
+ 'GROUP BY' => array(
+ 'pl_namespace', 'pl_title',
+ 'page_namespace'
+ )
+ ),
+ 'join_conds' => array(
+ 'page' => array(
+ 'LEFT JOIN',
+ array(
+ 'page_namespace = pl_namespace',
+ 'page_title = pl_title'
+ )
+ )
+ )
);
}
/**
* Pre-fill the link cache
*
- * @param $db DatabaseBase
- * @param $res
+ * @param DatabaseBase $db
+ * @param ResultWrapper $res
*/
function preprocessResults( $db, $res ) {
if ( $res->numRows() > 0 ) {
$linkBatch = new LinkBatch();
+
foreach ( $res as $row ) {
$linkBatch->add( $row->namespace, $row->title );
}
+
$res->seek( 0 );
$linkBatch->execute();
}
@@ -86,25 +99,37 @@ class MostlinkedPage extends QueryPage {
*/
function makeWlhLink( $title, $caption ) {
$wlh = SpecialPage::getTitleFor( 'Whatlinkshere', $title->getPrefixedDBkey() );
+
return Linker::linkKnown( $wlh, $caption );
}
/**
- * Make links to the page corresponding to the item, and the "what links here" page for it
+ * Make links to the page corresponding to the item,
+ * and the "what links here" page for it
*
- * @param $skin Skin to be used
- * @param $result Result row
+ * @param Skin $skin Skin to be used
+ * @param object $result Result row
* @return string
*/
function formatResult( $skin, $result ) {
$title = Title::makeTitleSafe( $result->namespace, $result->title );
if ( !$title ) {
- return Html::element( 'span', array( 'class' => 'mw-invalidtitle' ),
- Linker::getInvalidTitleDescription( $this->getContext(), $result->namespace, $result->title ) );
+ return Html::element(
+ 'span',
+ array( 'class' => 'mw-invalidtitle' ),
+ Linker::getInvalidTitleDescription(
+ $this->getContext(),
+ $result->namespace,
+ $result->title )
+ );
}
+
$link = Linker::link( $title );
- $wlh = $this->makeWlhLink( $title,
- $this->msg( 'nlinks' )->numParams( $result->value )->escaped() );
+ $wlh = $this->makeWlhLink(
+ $title,
+ $this->msg( 'nlinks' )->numParams( $result->value )->escaped()
+ );
+
return $this->getLanguage()->specialList( $link, $wlh );
}
diff --git a/includes/specials/SpecialMostlinkedcategories.php b/includes/specials/SpecialMostlinkedcategories.php
index a1bce45d..0d4641b1 100644
--- a/includes/specials/SpecialMostlinkedcategories.php
+++ b/includes/specials/SpecialMostlinkedcategories.php
@@ -30,7 +30,6 @@
* @ingroup SpecialPage
*/
class MostlinkedCategoriesPage extends QueryPage {
-
function __construct( $name = 'Mostlinkedcategories' ) {
parent::__construct( $name );
}
@@ -40,11 +39,11 @@ class MostlinkedCategoriesPage extends QueryPage {
}
function getQueryInfo() {
- return array (
- 'tables' => array ( 'category' ),
- 'fields' => array ( 'title' => 'cat_title',
- 'namespace' => NS_CATEGORY,
- 'value' => 'cat_pages' ),
+ return array(
+ 'tables' => array( 'category' ),
+ 'fields' => array( 'title' => 'cat_title',
+ 'namespace' => NS_CATEGORY,
+ 'value' => 'cat_pages' ),
);
}
@@ -55,8 +54,8 @@ class MostlinkedCategoriesPage extends QueryPage {
/**
* Fetch user page links and cache their existence
*
- * @param $db DatabaseBase
- * @param $res DatabaseResult
+ * @param DatabaseBase $db
+ * @param ResultWrapper $res
*/
function preprocessResults( $db, $res ) {
if ( !$res->numRows() ) {
@@ -74,8 +73,8 @@ class MostlinkedCategoriesPage extends QueryPage {
}
/**
- * @param $skin Skin
- * @param $result
+ * @param Skin $skin
+ * @param object $result Result row
* @return string
*/
function formatResult( $skin, $result ) {
@@ -83,15 +82,20 @@ class MostlinkedCategoriesPage extends QueryPage {
$nt = Title::makeTitleSafe( NS_CATEGORY, $result->title );
if ( !$nt ) {
- return Html::element( 'span', array( 'class' => 'mw-invalidtitle' ),
- Linker::getInvalidTitleDescription( $this->getContext(), NS_CATEGORY, $result->title ) );
+ return Html::element(
+ 'span',
+ array( 'class' => 'mw-invalidtitle' ),
+ Linker::getInvalidTitleDescription(
+ $this->getContext(),
+ NS_CATEGORY,
+ $result->title )
+ );
}
$text = $wgContLang->convert( $nt->getText() );
-
$plink = Linker::link( $nt, htmlspecialchars( $text ) );
-
$nlinks = $this->msg( 'nmembers' )->numParams( $result->value )->escaped();
+
return $this->getLanguage()->specialList( $plink, $nlinks );
}
diff --git a/includes/specials/SpecialMostlinkedtemplates.php b/includes/specials/SpecialMostlinkedtemplates.php
index 506e6b22..c90acb1f 100644
--- a/includes/specials/SpecialMostlinkedtemplates.php
+++ b/includes/specials/SpecialMostlinkedtemplates.php
@@ -29,7 +29,6 @@
* @ingroup SpecialPage
*/
class MostlinkedTemplatesPage extends QueryPage {
-
function __construct( $name = 'Mostlinkedtemplates' ) {
parent::__construct( $name );
}
@@ -62,12 +61,14 @@ class MostlinkedTemplatesPage extends QueryPage {
}
public function getQueryInfo() {
- return array (
- 'tables' => array ( 'templatelinks' ),
- 'fields' => array ( 'namespace' => 'tl_namespace',
- 'title' => 'tl_title',
- 'value' => 'COUNT(*)' ),
- 'conds' => array ( 'tl_namespace' => NS_TEMPLATE ),
+ return array(
+ 'tables' => array( 'templatelinks' ),
+ 'fields' => array(
+ 'namespace' => 'tl_namespace',
+ 'title' => 'tl_title',
+ 'value' => 'COUNT(*)'
+ ),
+ 'conds' => array( 'tl_namespace' => NS_TEMPLATE ),
'options' => array( 'GROUP BY' => array( 'tl_namespace', 'tl_title' ) )
);
}
@@ -76,7 +77,7 @@ class MostlinkedTemplatesPage extends QueryPage {
* Pre-cache page existence to speed up link generation
*
* @param $db DatabaseBase connection
- * @param $res ResultWrapper
+ * @param ResultWrapper $res
*/
public function preprocessResults( $db, $res ) {
if ( !$res->numRows() ) {
@@ -95,15 +96,22 @@ class MostlinkedTemplatesPage extends QueryPage {
/**
* Format a result row
*
- * @param $skin Skin to use for UI elements
- * @param $result Result row
- * @return String
+ * @param Skin $skin
+ * @param object $result Result row
+ * @return string
*/
public function formatResult( $skin, $result ) {
$title = Title::makeTitleSafe( $result->namespace, $result->title );
if ( !$title ) {
- return Html::element( 'span', array( 'class' => 'mw-invalidtitle' ),
- Linker::getInvalidTitleDescription( $this->getContext(), $result->namespace, $result->title ) );
+ return Html::element(
+ 'span',
+ array( 'class' => 'mw-invalidtitle' ),
+ Linker::getInvalidTitleDescription(
+ $this->getContext(),
+ $result->namespace,
+ $result->title
+ )
+ );
}
return $this->getLanguage()->specialList(
@@ -115,13 +123,14 @@ class MostlinkedTemplatesPage extends QueryPage {
/**
* Make a "what links here" link for a given title
*
- * @param $title Title to make the link for
- * @param $result Result row
+ * @param Title $title Title to make the link for
+ * @param object $result Result row
* @return String
*/
private function makeWlhLink( $title, $result ) {
$wlh = SpecialPage::getTitleFor( 'Whatlinkshere', $title->getPrefixedText() );
$label = $this->msg( 'ntransclusions' )->numParams( $result->value )->escaped();
+
return Linker::link( $wlh, $label );
}
diff --git a/includes/specials/SpecialMovepage.php b/includes/specials/SpecialMovepage.php
index 4adb0371..253e6cc3 100644
--- a/includes/specials/SpecialMovepage.php
+++ b/includes/specials/SpecialMovepage.php
@@ -27,13 +27,15 @@
* @ingroup SpecialPage
*/
class MovePageForm extends UnlistedSpecialPage {
-
/**
+ * Objects
* @var Title
*/
- var $oldTitle, $newTitle; # Objects
- var $reason; # Text input
- var $moveTalk, $deleteAndMove, $moveSubpages, $fixRedirects, $leaveRedirect, $moveOverShared; # Checks
+ var $oldTitle, $newTitle;
+ // Text input
+ var $reason;
+ // Checks
+ var $moveTalk, $deleteAndMove, $moveSubpages, $fixRedirects, $leaveRedirect, $moveOverShared;
private $watch = false;
@@ -55,10 +57,10 @@ class MovePageForm extends UnlistedSpecialPage {
$oldTitleText = $request->getVal( 'wpOldTitle', $target );
$this->oldTitle = Title::newFromText( $oldTitleText );
- if( is_null( $this->oldTitle ) ) {
+ if ( is_null( $this->oldTitle ) ) {
throw new ErrorPageError( 'notargettitle', 'notargettext' );
}
- if( !$this->oldTitle->exists() ) {
+ if ( !$this->oldTitle->exists() ) {
throw new ErrorPageError( 'nopagetitle', 'nopagetext' );
}
@@ -93,7 +95,8 @@ class MovePageForm extends UnlistedSpecialPage {
$this->watch = $request->getCheck( 'wpWatch' ) && $user->isLoggedIn();
if ( 'submit' == $request->getVal( 'action' ) && $request->wasPosted()
- && $user->matchEditToken( $request->getVal( 'wpEditToken' ) ) ) {
+ && $user->matchEditToken( $request->getVal( 'wpEditToken' ) )
+ ) {
$this->doSubmit();
} else {
$this->showForm( array() );
@@ -129,7 +132,7 @@ class MovePageForm extends UnlistedSpecialPage {
# link, check for validity. We can then show some diagnostic
# information and save a click.
$newerr = $this->oldTitle->isValidMoveOperation( $newTitle );
- if( is_array( $newerr ) ) {
+ if ( is_array( $newerr ) ) {
$err = $newerr;
}
}
@@ -146,16 +149,26 @@ class MovePageForm extends UnlistedSpecialPage {
<tr>
<td></td>
<td class='mw-input'>" .
- Xml::checkLabel( $this->msg( 'delete_and_move_confirm' )->text(), 'wpConfirm', 'wpConfirm' ) .
- "</td>
+ Xml::checkLabel(
+ $this->msg( 'delete_and_move_confirm' )->text(),
+ 'wpConfirm',
+ 'wpConfirm'
+ ) .
+ "</td>
</tr>";
$err = array();
} else {
if ( $this->oldTitle->getNamespace() == NS_USER && !$this->oldTitle->isSubpage() ) {
- $out->wrapWikiMsg( "<div class=\"error mw-moveuserpage-warning\">\n$1\n</div>", 'moveuserpage-warning' );
+ $out->wrapWikiMsg(
+ "<div class=\"error mw-moveuserpage-warning\">\n$1\n</div>",
+ 'moveuserpage-warning'
+ );
}
- $out->addWikiMsg( $wgFixDoubleRedirects ? 'movepagetext' :
- 'movepagetext-noredirectfixer' );
+
+ $out->addWikiMsg( $wgFixDoubleRedirects ?
+ 'movepagetext' :
+ 'movepagetext-noredirectfixer'
+ );
$movepagebtn = $this->msg( 'movepagebtn' )->text();
$submitVar = 'wpMove';
$confirm = false;
@@ -205,6 +218,7 @@ class MovePageForm extends UnlistedSpecialPage {
if ( count( $err ) == 1 ) {
$errMsg = $err[0];
$errMsgName = array_shift( $errMsg );
+
if ( $errMsgName == 'hookaborted' ) {
$out->addHTML( "<p>{$errMsg[0]}</p>\n" );
} else {
@@ -212,8 +226,9 @@ class MovePageForm extends UnlistedSpecialPage {
}
} else {
$errStr = array();
- foreach( $err as $errMsg ) {
- if( $errMsg[0] == 'hookaborted' ) {
+
+ foreach ( $err as $errMsg ) {
+ if ( $errMsg[0] == 'hookaborted' ) {
$errStr[] = $errMsg[1];
} else {
$errMsgName = array_shift( $errMsg );
@@ -238,7 +253,13 @@ class MovePageForm extends UnlistedSpecialPage {
}
$out->addHTML( "<div class='mw-warning-with-logexcerpt'>\n" );
$out->addWikiMsg( $noticeMsg );
- LogEventsList::showLogExtract( $out, 'protect', $this->oldTitle, '', array( 'lim' => 1 ) );
+ LogEventsList::showLogExtract(
+ $out,
+ 'protect',
+ $this->oldTitle,
+ '',
+ array( 'lim' => 1 )
+ );
$out->addHTML( "</div>\n" );
}
@@ -256,13 +277,20 @@ class MovePageForm extends UnlistedSpecialPage {
$handler = ContentHandler::getForTitle( $this->oldTitle );
$out->addHTML(
- Xml::openElement( 'form', array( 'method' => 'post', 'action' => $this->getTitle()->getLocalURL( 'action=submit' ), 'id' => 'movepage' ) ) .
- Xml::openElement( 'fieldset' ) .
- Xml::element( 'legend', null, $this->msg( 'move-page-legend' )->text() ) .
- Xml::openElement( 'table', array( 'id' => 'mw-movepage-table' ) ) .
- "<tr>
+ Xml::openElement(
+ 'form',
+ array(
+ 'method' => 'post',
+ 'action' => $this->getTitle()->getLocalURL( 'action=submit' ),
+ 'id' => 'movepage'
+ )
+ ) .
+ Xml::openElement( 'fieldset' ) .
+ Xml::element( 'legend', null, $this->msg( 'move-page-legend' )->text() ) .
+ Xml::openElement( 'table', array( 'id' => 'mw-movepage-table' ) ) .
+ "<tr>
<td class='mw-label'>" .
- $this->msg( 'movearticle' )->escaped() .
+ $this->msg( 'movearticle' )->escaped() .
"</td>
<td class='mw-input'>
<strong>{$oldTitleLink}</strong>
@@ -270,41 +298,54 @@ class MovePageForm extends UnlistedSpecialPage {
</tr>
<tr>
<td class='mw-label'>" .
- Xml::label( $this->msg( 'newtitle' )->text(), 'wpNewTitleMain' ) .
+ Xml::label( $this->msg( 'newtitle' )->text(), 'wpNewTitleMain' ) .
"</td>
<td class='mw-input'>" .
- Html::namespaceSelector(
- array(
- 'selected' => $newTitle->getNamespace(),
- 'exclude' => $immovableNamespaces
- ),
- array( 'name' => 'wpNewTitleNs', 'id' => 'wpNewTitleNs' )
- ) .
- Xml::input( 'wpNewTitleMain', 60, $wgContLang->recodeForEdit( $newTitle->getText() ), array(
+ Html::namespaceSelector(
+ array(
+ 'selected' => $newTitle->getNamespace(),
+ 'exclude' => $immovableNamespaces
+ ),
+ array( 'name' => 'wpNewTitleNs', 'id' => 'wpNewTitleNs' )
+ ) .
+ Xml::input(
+ 'wpNewTitleMain',
+ 60,
+ $wgContLang->recodeForEdit( $newTitle->getText() ),
+ array(
'type' => 'text',
'id' => 'wpNewTitleMain',
- 'maxlength' => 255,
- ) ) .
- Html::hidden( 'wpOldTitle', $this->oldTitle->getPrefixedText() ) .
+ 'maxlength' => 255
+ )
+ ) .
+ Html::hidden( 'wpOldTitle', $this->oldTitle->getPrefixedText() ) .
"</td>
</tr>
<tr>
<td class='mw-label'>" .
- Xml::label( $this->msg( 'movereason' )->text(), 'wpReason' ) .
+ Xml::label( $this->msg( 'movereason' )->text(), 'wpReason' ) .
"</td>
<td class='mw-input'>" .
- Html::element( 'textarea', array( 'name' => 'wpReason', 'id' => 'wpReason', 'cols' => 60, 'rows' => 2,
- 'maxlength' => 200 ), $this->reason ) .
+ Xml::input( 'wpReason', 60, $this->reason, array(
+ 'type' => 'text',
+ 'id' => 'wpReason',
+ 'maxlength' => 200,
+ ) ) .
"</td>
</tr>"
);
- if( $considerTalk ) {
+ if ( $considerTalk ) {
$out->addHTML( "
<tr>
<td></td>
<td class='mw-input'>" .
- Xml::checkLabel( $this->msg( 'movetalk' )->text(), 'wpMovetalk', 'wpMovetalk', $this->moveTalk ) .
+ Xml::checkLabel(
+ $this->msg( 'movetalk' )->text(),
+ 'wpMovetalk',
+ 'wpMovetalk',
+ $this->moveTalk
+ ) .
"</td>
</tr>"
);
@@ -315,8 +356,12 @@ class MovePageForm extends UnlistedSpecialPage {
<tr>
<td></td>
<td class='mw-input' >" .
- Xml::checkLabel( $this->msg( 'move-leave-redirect' )->text(), 'wpLeaveRedirect',
- 'wpLeaveRedirect', $this->leaveRedirect ) .
+ Xml::checkLabel(
+ $this->msg( 'move-leave-redirect' )->text(),
+ 'wpLeaveRedirect',
+ 'wpLeaveRedirect',
+ $this->leaveRedirect
+ ) .
"</td>
</tr>"
);
@@ -327,32 +372,36 @@ class MovePageForm extends UnlistedSpecialPage {
<tr>
<td></td>
<td class='mw-input' >" .
- Xml::checkLabel( $this->msg( 'fix-double-redirects' )->text(), 'wpFixRedirects',
- 'wpFixRedirects', $this->fixRedirects ) .
+ Xml::checkLabel(
+ $this->msg( 'fix-double-redirects' )->text(),
+ 'wpFixRedirects',
+ 'wpFixRedirects',
+ $this->fixRedirects
+ ) .
"</td>
</tr>"
);
}
- if( $canMoveSubpage ) {
+ if ( $canMoveSubpage ) {
$out->addHTML( "
<tr>
<td></td>
<td class=\"mw-input\">" .
- Xml::check(
- 'wpMovesubpages',
- # Don't check the box if we only have talk subpages to
- # move and we aren't moving the talk page.
- $this->moveSubpages && ( $this->oldTitle->hasSubpages() || $this->moveTalk ),
- array( 'id' => 'wpMovesubpages' )
- ) . '&#160;' .
- Xml::tags( 'label', array( 'for' => 'wpMovesubpages' ),
- $this->msg(
- ( $this->oldTitle->hasSubpages()
- ? 'move-subpages'
- : 'move-talk-subpages' )
+ Xml::check(
+ 'wpMovesubpages',
+ # Don't check the box if we only have talk subpages to
+ # move and we aren't moving the talk page.
+ $this->moveSubpages && ( $this->oldTitle->hasSubpages() || $this->moveTalk ),
+ array( 'id' => 'wpMovesubpages' )
+ ) . '&#160;' .
+ Xml::tags( 'label', array( 'for' => 'wpMovesubpages' ),
+ $this->msg(
+ ( $this->oldTitle->hasSubpages()
+ ? 'move-subpages'
+ : 'move-talk-subpages' )
)->numParams( $wgMaximumMovedPages )->params( $wgMaximumMovedPages )->parse()
- ) .
+ ) .
"</td>
</tr>"
);
@@ -361,14 +410,19 @@ class MovePageForm extends UnlistedSpecialPage {
$watchChecked = $user->isLoggedIn() && ( $this->watch || $user->getBoolOption( 'watchmoves' )
|| $user->isWatched( $this->oldTitle ) );
# Don't allow watching if user is not logged in
- if( $user->isLoggedIn() ) {
+ if ( $user->isLoggedIn() ) {
$out->addHTML( "
<tr>
<td></td>
<td class='mw-input'>" .
- Xml::checkLabel( $this->msg( 'move-watch' )->text(), 'wpWatch', 'watch', $watchChecked ) .
+ Xml::checkLabel(
+ $this->msg( 'move-watch' )->text(),
+ 'wpWatch',
+ 'watch',
+ $watchChecked
+ ) .
"</td>
- </tr>");
+ </tr>" );
}
$out->addHTML( "
@@ -376,19 +430,18 @@ class MovePageForm extends UnlistedSpecialPage {
<tr>
<td>&#160;</td>
<td class='mw-submit'>" .
- Xml::submitButton( $movepagebtn, array( 'name' => $submitVar ) ) .
+ Xml::submitButton( $movepagebtn, array( 'name' => $submitVar ) ) .
"</td>
</tr>" .
- Xml::closeElement( 'table' ) .
- Html::hidden( 'wpEditToken', $user->getEditToken() ) .
- Xml::closeElement( 'fieldset' ) .
- Xml::closeElement( 'form' ) .
- "\n"
+ Xml::closeElement( 'table' ) .
+ Html::hidden( 'wpEditToken', $user->getEditToken() ) .
+ Xml::closeElement( 'fieldset' ) .
+ Xml::closeElement( 'form' ) .
+ "\n"
);
$this->showLogFragment( $this->oldTitle );
$this->showSubpages( $this->oldTitle );
-
}
function doSubmit() {
@@ -406,6 +459,7 @@ class MovePageForm extends UnlistedSpecialPage {
# don't allow moving to pages with # in
if ( !$nt || $nt->getFragment() != '' ) {
$this->showForm( array( array( 'badtitletext' ) ) );
+
return;
}
@@ -413,11 +467,11 @@ class MovePageForm extends UnlistedSpecialPage {
if ( $nt->getNamespace() == NS_FILE
&& !( $this->moveOverShared && $user->isAllowed( 'reupload-shared' ) )
&& !RepoGroup::singleton()->getLocalRepo()->findFile( $nt )
- && wfFindFile( $nt ) )
- {
+ && wfFindFile( $nt )
+ ) {
$this->showForm( array( array( 'file-exists-sharedrepo' ) ) );
- return;
+ return;
}
# Delete to make way if requested
@@ -426,6 +480,7 @@ class MovePageForm extends UnlistedSpecialPage {
if ( count( $permErrors ) ) {
# Only show the first error
$this->showForm( $permErrors );
+
return;
}
@@ -444,6 +499,7 @@ class MovePageForm extends UnlistedSpecialPage {
$deleteStatus = $page->doDeleteArticleReal( $reason, false, 0, true, $error, $user );
if ( !$deleteStatus->isGood() ) {
$this->showForm( $deleteStatus->getErrorsArray() );
+
return;
}
}
@@ -462,6 +518,7 @@ class MovePageForm extends UnlistedSpecialPage {
$error = $ot->moveTo( $nt, true, $this->reason, $createRedirect );
if ( $error !== true ) {
$this->showForm( $error );
+
return;
}
@@ -502,7 +559,7 @@ class MovePageForm extends UnlistedSpecialPage {
# Now we move extra pages we've been asked to move: subpages and talk
# pages. First, if the old page or the new page is a talk page, we
# can't move any talk pages: cancel that.
- if( $ot->isTalkPage() || $nt->isTalkPage() ) {
+ if ( $ot->isTalkPage() || $nt->isTalkPage() ) {
$this->moveTalk = false;
}
@@ -524,24 +581,26 @@ class MovePageForm extends UnlistedSpecialPage {
// @todo FIXME: Use Title::moveSubpages() here
$dbr = wfGetDB( DB_MASTER );
- if( $this->moveSubpages && (
+ if ( $this->moveSubpages && (
MWNamespace::hasSubpages( $nt->getNamespace() ) || (
$this->moveTalk &&
- MWNamespace::hasSubpages( $nt->getTalkPage()->getNamespace() )
+ MWNamespace::hasSubpages( $nt->getTalkPage()->getNamespace() )
)
) ) {
$conds = array(
'page_title' . $dbr->buildLike( $ot->getDBkey() . '/', $dbr->anyString() )
- .' OR page_title = ' . $dbr->addQuotes( $ot->getDBkey() )
+ . ' OR page_title = ' . $dbr->addQuotes( $ot->getDBkey() )
);
$conds['page_namespace'] = array();
- if( MWNamespace::hasSubpages( $nt->getNamespace() ) ) {
+ if ( MWNamespace::hasSubpages( $nt->getNamespace() ) ) {
$conds['page_namespace'][] = $ot->getNamespace();
}
- if( $this->moveTalk && MWNamespace::hasSubpages( $nt->getTalkPage()->getNamespace() ) ) {
+ if ( $this->moveTalk &&
+ MWNamespace::hasSubpages( $nt->getTalkPage()->getNamespace() )
+ ) {
$conds['page_namespace'][] = $ot->getTalkPage()->getNamespace();
}
- } elseif( $this->moveTalk ) {
+ } elseif ( $this->moveTalk ) {
$conds = array(
'page_namespace' => $ot->getTalkPage()->getNamespace(),
'page_title' => $ot->getDBkey()
@@ -552,7 +611,7 @@ class MovePageForm extends UnlistedSpecialPage {
}
$extraPages = array();
- if( !is_null( $conds ) ) {
+ if ( !is_null( $conds ) ) {
$extraPages = TitleArray::newFromResult(
$dbr->select( 'page',
array( 'page_id', 'page_namespace', 'page_title' ),
@@ -564,29 +623,31 @@ class MovePageForm extends UnlistedSpecialPage {
$extraOutput = array();
$count = 1;
- foreach( $extraPages as $oldSubpage ) {
- if( $ot->equals( $oldSubpage ) ) {
+ foreach ( $extraPages as $oldSubpage ) {
+ if ( $ot->equals( $oldSubpage ) || $nt->equals( $oldSubpage ) ) {
# Already did this one.
continue;
}
$newPageName = preg_replace(
- '#^'.preg_quote( $ot->getDBkey(), '#' ).'#',
+ '#^' . preg_quote( $ot->getDBkey(), '#' ) . '#',
StringUtils::escapeRegexReplacement( $nt->getDBkey() ), # bug 21234
$oldSubpage->getDBkey()
);
- if( $oldSubpage->isTalkPage() ) {
+
+ if ( $oldSubpage->isTalkPage() ) {
$newNs = $nt->getTalkPage()->getNamespace();
} else {
$newNs = $nt->getSubjectPage()->getNamespace();
}
+
# Bug 14385: we need makeTitleSafe because the new page names may
# be longer than 255 characters.
$newSubpage = Title::makeTitleSafe( $newNs, $newPageName );
- if( !$newSubpage ) {
+ if ( !$newSubpage ) {
$oldLink = Linker::linkKnown( $oldSubpage );
- $extraOutput[] = $this->msg( 'movepage-page-unmoved' )->rawParams( $oldLink
- )->params( Title::makeName( $newNs, $newPageName ) )->escaped();
+ $extraOutput[] = $this->msg( 'movepage-page-unmoved' )->rawParams( $oldLink )
+ ->params( Title::makeName( $newNs, $newPageName ) )->escaped();
continue;
}
@@ -596,7 +657,8 @@ class MovePageForm extends UnlistedSpecialPage {
$extraOutput[] = $this->msg( 'movepage-page-exists' )->rawParams( $link )->escaped();
} else {
$success = $oldSubpage->moveTo( $newSubpage, true, $this->reason, $createRedirect );
- if( $success === true ) {
+
+ if ( $success === true ) {
if ( $this->fixRedirects ) {
DoubleRedirectJob::fixRedirects( 'move', $oldSubpage, $newSubpage );
}
@@ -606,10 +668,12 @@ class MovePageForm extends UnlistedSpecialPage {
array(),
array( 'redirect' => 'no' )
);
+
$newLink = Linker::linkKnown( $newSubpage );
$extraOutput[] = $this->msg( 'movepage-page-moved' )->rawParams( $oldLink, $newLink )->escaped();
++$count;
- if( $count >= $wgMaximumMovedPages ) {
+
+ if ( $count >= $wgMaximumMovedPages ) {
$extraOutput[] = $this->msg( 'movepage-max-pages' )->numParams( $wgMaximumMovedPages )->escaped();
break;
}
@@ -619,28 +683,15 @@ class MovePageForm extends UnlistedSpecialPage {
$extraOutput[] = $this->msg( 'movepage-page-unmoved' )->rawParams( $oldLink, $newLink )->escaped();
}
}
-
}
- if( $extraOutput !== array() ) {
+ if ( $extraOutput !== array() ) {
$out->addHTML( "<ul>\n<li>" . implode( "</li>\n<li>", $extraOutput ) . "</li>\n</ul>" );
}
# Deal with watches (we don't watch subpages)
- if( $this->watch && $user->isLoggedIn() ) {
- $user->addWatch( $ot );
- $user->addWatch( $nt );
- } else {
- $user->removeWatch( $ot );
- $user->removeWatch( $nt );
- }
-
- # Re-clear the file redirect cache, which may have been polluted by
- # parsing in messages above. See CR r56745.
- # @todo FIXME: Needs a more robust solution inside FileRepo.
- if( $ot->getNamespace() == NS_FILE ) {
- RepoGroup::singleton()->getLocalRepo()->invalidateImageRedirect( $ot );
- }
+ WatchAction::doWatchOrUnwatch( $this->watch, $ot, $user );
+ WatchAction::doWatchOrUnwatch( $this->watch, $nt, $user );
}
function showLogFragment( $title ) {
@@ -651,8 +702,9 @@ class MovePageForm extends UnlistedSpecialPage {
}
function showSubpages( $title ) {
- if( !MWNamespace::hasSubpages( $title->getNamespace() ) )
+ if ( !MWNamespace::hasSubpages( $title->getNamespace() ) ) {
return;
+ }
$subpages = $title->getSubpages();
$count = $subpages instanceof TitleArray ? $subpages->count() : 0;
@@ -663,13 +715,14 @@ class MovePageForm extends UnlistedSpecialPage {
# No subpages.
if ( $count == 0 ) {
$out->addWikiMsg( 'movenosubpage' );
+
return;
}
$out->addWikiMsg( 'movesubpagetext', $this->getLanguage()->formatNum( $count ) );
$out->addHTML( "<ul>\n" );
- foreach( $subpages as $subpage ) {
+ foreach ( $subpages as $subpage ) {
$link = Linker::link( $subpage );
$out->addHTML( "<li>$link</li>\n" );
}
diff --git a/includes/specials/SpecialNewimages.php b/includes/specials/SpecialNewimages.php
index 52cbc3aa..37d29734 100644
--- a/includes/specials/SpecialNewimages.php
+++ b/includes/specials/SpecialNewimages.php
@@ -21,7 +21,6 @@
* @ingroup SpecialPage
*/
class SpecialNewFiles extends IncludableSpecialPage {
-
public function __construct() {
parent::__construct( 'Newimages' );
}
@@ -37,6 +36,7 @@ class SpecialNewFiles extends IncludableSpecialPage {
$form->prepareForm();
$form->displayForm( '' );
}
+
$this->getOutput()->addHTML( $pager->getBody() );
if ( !$this->including() ) {
$this->getOutput()->addHTML( $pager->getNavigationBar() );
@@ -52,7 +52,6 @@ class SpecialNewFiles extends IncludableSpecialPage {
* @ingroup SpecialPage Pager
*/
class NewFilesPager extends ReverseChronologicalPager {
-
/**
* @var ImageGallery
*/
@@ -73,9 +72,10 @@ class NewFilesPager extends ReverseChronologicalPager {
$conds = $jconds = array();
$tables = array( 'image' );
- if( !$this->showbots ) {
+ if ( !$this->showbots ) {
$groupsWithBotPermission = User::getGroupsWithPermission( 'bot' );
- if( count( $groupsWithBotPermission ) ) {
+
+ if ( count( $groupsWithBotPermission ) ) {
$tables[] = 'user_groups';
$conds[] = 'ug_group IS NULL';
$jconds['user_groups'] = array(
@@ -88,11 +88,15 @@ class NewFilesPager extends ReverseChronologicalPager {
}
}
- if( !$wgMiserMode && $this->like !== null ) {
+ if ( !$wgMiserMode && $this->like !== null ) {
$dbr = wfGetDB( DB_SLAVE );
$likeObj = Title::newFromURL( $this->like );
- if( $likeObj instanceof Title ) {
- $like = $dbr->buildLike( $dbr->anyString(), strtolower( $likeObj->getDBkey() ), $dbr->anyString() );
+ if ( $likeObj instanceof Title ) {
+ $like = $dbr->buildLike(
+ $dbr->anyString(),
+ strtolower( $likeObj->getDBkey() ),
+ $dbr->anyString()
+ );
$conds[] = "LOWER(img_name) $like";
}
}
@@ -113,8 +117,17 @@ class NewFilesPager extends ReverseChronologicalPager {
function getStartBody() {
if ( !$this->gallery ) {
- $this->gallery = new ImageGallery();
+ // Note that null for mode is taken to mean use default.
+ $mode = $this->getRequest()->getVal( 'gallerymode', null );
+ try {
+ $this->gallery = ImageGalleryBase::factory( $mode );
+ } catch ( MWException $e ) {
+ // User specified something invalid, fallback to default.
+ $this->gallery = ImageGalleryBase::factory();
+ }
+ $this->gallery->setContext( $this->getContext() );
}
+
return '';
}
@@ -128,11 +141,12 @@ class NewFilesPager extends ReverseChronologicalPager {
$title = Title::makeTitle( NS_FILE, $name );
$ul = Linker::link( $user->getUserpage(), $user->getName() );
+ $time = $this->getLanguage()->userTimeAndDate( $row->img_timestamp, $this->getUser() );
$this->gallery->add(
$title,
"$ul<br />\n<i>"
- . htmlspecialchars( $this->getLanguage()->userTimeAndDate( $row->img_timestamp, $this->getUser() ) )
+ . htmlspecialchars( $time )
. "</i><br />\n"
);
}
@@ -150,7 +164,6 @@ class NewFilesPager extends ReverseChronologicalPager {
'type' => 'check',
'label' => $this->msg( 'showhidebots', $this->msg( 'show' )->plain() )->escaped(),
'name' => 'showbots',
- # 'default' => $this->getRequest()->getBool( 'showbots', 0 ),
),
'limit' => array(
'type' => 'hidden',
@@ -164,12 +177,13 @@ class NewFilesPager extends ReverseChronologicalPager {
),
);
- if( $wgMiserMode ) {
+ if ( $wgMiserMode ) {
unset( $fields['like'] );
}
- $form = new HTMLForm( $fields, $this->getContext() );
- $form->setTitle( $this->getTitle() );
+ $context = new DerivativeContext( $this->getContext() );
+ $context->setTitle( $this->getTitle() ); // Remove subpage
+ $form = new HTMLForm( $fields, $context );
$form->setSubmitTextMsg( 'ilsubmit' );
$form->setMethod( 'get' );
$form->setWrapperLegendMsg( 'newimages-legend' );
diff --git a/includes/specials/SpecialNewpages.php b/includes/specials/SpecialNewpages.php
index ebb3021d..43d48558 100644
--- a/includes/specials/SpecialNewpages.php
+++ b/includes/specials/SpecialNewpages.php
@@ -27,7 +27,6 @@
* @ingroup SpecialPage
*/
class SpecialNewpages extends IncludableSpecialPage {
-
// Stored objects
/**
@@ -63,17 +62,19 @@ class SpecialNewpages extends IncludableSpecialPage {
$this->customFilters = array();
wfRunHooks( 'SpecialNewPagesFilters', array( $this, &$this->customFilters ) );
- foreach( $this->customFilters as $key => $params ) {
+ foreach ( $this->customFilters as $key => $params ) {
$opts->add( $key, $params['default'] );
}
// Set values
$opts->fetchValuesFromRequest( $this->getRequest() );
- if ( $par ) $this->parseParams( $par );
+ if ( $par ) {
+ $this->parseParams( $par );
+ }
// Validate
$opts->validateIntBounds( 'limit', 0, 5000 );
- if( !$wgEnableNewpagesUserFilter ) {
+ if ( !$wgEnableNewpagesUserFilter ) {
$opts->setValue( 'username', '' );
}
}
@@ -113,7 +114,7 @@ class SpecialNewpages extends IncludableSpecialPage {
}
if ( preg_match( '/^namespace=(.*)$/', $bit, $m ) ) {
$ns = $this->getLanguage()->getNsIndex( $m[1] );
- if( $ns !== false ) {
+ if ( $ns !== false ) {
$this->opts->setValue( 'namespace', $ns );
}
}
@@ -135,13 +136,14 @@ class SpecialNewpages extends IncludableSpecialPage {
$this->showNavigation = !$this->including(); // Maybe changed in setup
$this->setup( $par );
- if( !$this->including() ) {
+ if ( !$this->including() ) {
// Settings
$this->form();
$feedType = $this->opts->getValue( 'feed' );
- if( $feedType ) {
+ if ( $feedType ) {
$this->feed( $feedType );
+
return;
}
@@ -154,7 +156,7 @@ class SpecialNewpages extends IncludableSpecialPage {
$pager->mLimit = $this->opts->getValue( 'limit' );
$pager->mOffset = $this->opts->getValue( 'offset' );
- if( $pager->getNumRows() ) {
+ if ( $pager->getNumRows() ) {
$navigation = '';
if ( $this->showNavigation ) {
$navigation = $pager->getNavigationBar();
@@ -196,7 +198,7 @@ class SpecialNewpages extends IncludableSpecialPage {
foreach ( $filters as $key => $msg ) {
$onoff = 1 - $this->opts->getValue( $key );
$link = Linker::link( $self, $showhide[$onoff], array(),
- array( $key => $onoff ) + $changed
+ array( $key => $onoff ) + $changed
);
$links[$key] = $this->msg( $msg )->rawParams( $link )->escaped();
}
@@ -236,55 +238,55 @@ class SpecialNewpages extends IncludableSpecialPage {
Xml::openElement( 'table', array( 'id' => 'mw-newpages-table' ) ) .
'<tr>
<td class="mw-label">' .
- Xml::label( $this->msg( 'namespace' )->text(), 'namespace' ) .
- '</td>
- <td class="mw-input">' .
- Html::namespaceSelector(
- array(
- 'selected' => $namespace,
- 'all' => 'all',
- ), array(
- 'name' => 'namespace',
- 'id' => 'namespace',
- 'class' => 'namespaceselector',
- )
- ) . '&#160;' .
- Xml::checkLabel(
- $this->msg( 'invert' )->text(),
- 'invert',
- 'nsinvert',
- $nsinvert,
- array( 'title' => $this->msg( 'tooltip-invert' )->text() )
- ) .
- '</td>
+ Xml::label( $this->msg( 'namespace' )->text(), 'namespace' ) .
+ '</td>
+ <td class="mw-input">' .
+ Html::namespaceSelector(
+ array(
+ 'selected' => $namespace,
+ 'all' => 'all',
+ ), array(
+ 'name' => 'namespace',
+ 'id' => 'namespace',
+ 'class' => 'namespaceselector',
+ )
+ ) . '&#160;' .
+ Xml::checkLabel(
+ $this->msg( 'invert' )->text(),
+ 'invert',
+ 'nsinvert',
+ $nsinvert,
+ array( 'title' => $this->msg( 'tooltip-invert' )->text() )
+ ) .
+ '</td>
</tr>' . ( $tagFilter ? (
'<tr>
<td class="mw-label">' .
- $tagFilterLabel .
+ $tagFilterLabel .
'</td>
<td class="mw-input">' .
- $tagFilterSelector .
+ $tagFilterSelector .
'</td>
</tr>' ) : '' ) .
( $wgEnableNewpagesUserFilter ?
- '<tr>
+ '<tr>
<td class="mw-label">' .
Xml::label( $this->msg( 'newpages-username' )->text(), 'mw-np-username' ) .
- '</td>
+ '</td>
<td class="mw-input">' .
Xml::input( 'username', 30, $userText, array( 'id' => 'mw-np-username' ) ) .
- '</td>
+ '</td>
</tr>' : '' ) .
'<tr> <td></td>
<td class="mw-submit">' .
- Xml::submitButton( $this->msg( 'allpagessubmit' )->text() ) .
- '</td>
- </tr>' .
+ Xml::submitButton( $this->msg( 'allpagessubmit' )->text() ) .
+ '</td>
+ </tr>' .
'<tr>
<td></td>
<td class="mw-input">' .
- $this->filterLinks() .
- '</td>
+ $this->filterLinks() .
+ '</td>
</tr>' .
Xml::closeElement( 'table' ) .
Xml::closeElement( 'fieldset' ) .
@@ -295,9 +297,10 @@ class SpecialNewpages extends IncludableSpecialPage {
}
/**
- * Format a row, providing the timestamp, links to the page/history, size, user links, and a comment
+ * Format a row, providing the timestamp, links to the page/history,
+ * size, user links, and a comment
*
- * @param $result Result row
+ * @param object $result Result row
* @return String
*/
public function formatRow( $result ) {
@@ -331,11 +334,8 @@ class SpecialNewpages extends IncludableSpecialPage {
$query = array( 'redirect' => 'no' );
- if( $this->patrollable( $result ) ) {
- $query['rcid'] = $result->rc_id;
- }
-
- // Linker::linkKnown() uses 'known' and 'noclasses' options. This breaks the colouration for stubs.
+ // Linker::linkKnown() uses 'known' and 'noclasses' options.
+ // This breaks the colouration for stubs.
$plink = Linker::link(
$title,
null,
@@ -352,8 +352,12 @@ class SpecialNewpages extends IncludableSpecialPage {
$hist = Html::rawElement( 'span', array( 'class' => 'mw-newpages-history' ),
$this->msg( 'parentheses' )->rawParams( $histLink )->escaped() );
- $length = Html::element( 'span', array( 'class' => 'mw-newpages-length' ),
- $this->msg( 'brackets' )->params( $this->msg( 'nbytes' )->numParams( $result->length )->text() )
+ $length = Html::element(
+ 'span',
+ array( 'class' => 'mw-newpages-length' ),
+ $this->msg( 'brackets' )->params( $this->msg( 'nbytes' )
+ ->numParams( $result->length )->text()
+ )
);
$ulink = Linker::revUserTools( $rev );
@@ -369,8 +373,11 @@ class SpecialNewpages extends IncludableSpecialPage {
}
# Tags, if any.
- if( isset( $result->ts_tags ) ) {
- list( $tagDisplay, $newClasses ) = ChangeTags::formatSummaryRow( $result->ts_tags, 'newpages' );
+ if ( isset( $result->ts_tags ) ) {
+ list( $tagDisplay, $newClasses ) = ChangeTags::formatSummaryRow(
+ $result->ts_tags,
+ 'newpages'
+ );
$classes = array_merge( $classes, $newClasses );
} else {
$tagDisplay = '';
@@ -381,8 +388,10 @@ class SpecialNewpages extends IncludableSpecialPage {
# Display the old title if the namespace/title has been changed
$oldTitleText = '';
$oldTitle = Title::makeTitle( $result->rc_namespace, $result->rc_title );
+
if ( !$title->equals( $oldTitle ) ) {
- $oldTitleText = $this->msg( 'rc-old-title' )->params( $oldTitle->getPrefixedText() )->escaped();
+ $oldTitleText = $oldTitle->getPrefixedText();
+ $oldTitleText = $this->msg( 'rc-old-title' )->params( $oldTitleText )->escaped();
}
return "<li{$css}>{$time} {$dm}{$plink} {$hist} {$dm}{$length} {$dm}{$ulink} {$comment} {$tagDisplay} {$oldTitleText}</li>\n";
@@ -391,7 +400,7 @@ class SpecialNewpages extends IncludableSpecialPage {
/**
* Should a specific result row provide "patrollable" links?
*
- * @param $result Result row
+ * @param object $result Result row
* @return Boolean
*/
protected function patrollable( $result ) {
@@ -408,18 +417,20 @@ class SpecialNewpages extends IncludableSpecialPage {
if ( !$wgFeed ) {
$this->getOutput()->addWikiMsg( 'feed-unavailable' );
+
return;
}
- if( !isset( $wgFeedClasses[$type] ) ) {
+ if ( !isset( $wgFeedClasses[$type] ) ) {
$this->getOutput()->addWikiMsg( 'feed-invalid' );
+
return;
}
$feed = new $wgFeedClasses[$type](
$this->feedTitle(),
$this->msg( 'tagline' )->text(),
- $this->getTitle()->getFullUrl()
+ $this->getTitle()->getFullURL()
);
$pager = new NewPagesPager( $this, $this->opts );
@@ -427,7 +438,7 @@ class SpecialNewpages extends IncludableSpecialPage {
$pager->mLimit = min( $limit, $wgFeedLimit );
$feed->outHeader();
- if( $pager->getNumRows() > 0 ) {
+ if ( $pager->getNumRows() > 0 ) {
foreach ( $pager->mResult as $row ) {
$feed->outItem( $this->feedItem( $row ) );
}
@@ -438,12 +449,13 @@ class SpecialNewpages extends IncludableSpecialPage {
protected function feedTitle() {
global $wgLanguageCode, $wgSitename;
$desc = $this->getDescription();
+
return "$wgSitename - $desc [$wgLanguageCode]";
}
protected function feedItem( $row ) {
$title = Title::makeTitle( intval( $row->rc_namespace ), $row->rc_title );
- if( $title ) {
+ if ( $title ) {
$date = $row->rc_timestamp;
$comments = $title->getTalkPage()->getFullURL();
@@ -466,7 +478,7 @@ class SpecialNewpages extends IncludableSpecialPage {
protected function feedItemDesc( $row ) {
$revision = Revision::newFromId( $row->rev_id );
- if( $revision ) {
+ if ( $revision ) {
//XXX: include content model/type in feed item?
return '<p>' . htmlspecialchars( $revision->getUserText() ) .
$this->msg( 'colon-separator' )->inContentLanguage()->escaped() .
@@ -474,6 +486,7 @@ class SpecialNewpages extends IncludableSpecialPage {
"</p>\n<hr />\n<div>" .
nl2br( htmlspecialchars( $revision->getContent()->serialize() ) ) . "</div>";
}
+
return '';
}
@@ -511,7 +524,7 @@ class NewPagesPager extends ReverseChronologicalPager {
$username = $this->opts->getValue( 'username' );
$user = Title::makeTitleSafe( NS_USER, $username );
- if( $namespace !== false ) {
+ if ( $namespace !== false ) {
if ( $this->opts->getValue( 'invert' ) ) {
$conds[] = 'rc_namespace != ' . $this->mDb->addQuotes( $namespace );
} else {
@@ -523,18 +536,22 @@ class NewPagesPager extends ReverseChronologicalPager {
}
# $wgEnableNewpagesUserFilter - temp WMF hack
- if( $wgEnableNewpagesUserFilter && $user ) {
+ if ( $wgEnableNewpagesUserFilter && $user ) {
$conds['rc_user_text'] = $user->getText();
$rcIndexes = 'rc_user_text';
- # If anons cannot make new pages, don't "exclude logged in users"!
- } elseif( User::groupHasPermission( '*', 'createpage' ) && $this->opts->getValue( 'hideliu' ) ) {
+ } elseif ( User::groupHasPermission( '*', 'createpage' ) &&
+ $this->opts->getValue( 'hideliu' )
+ ) {
+ # If anons cannot make new pages, don't "exclude logged in users"!
$conds['rc_user'] = 0;
}
+
# If this user cannot see patrolled edits or they are off, don't do dumb queries!
- if( $this->opts->getValue( 'hidepatrolled' ) && $this->getUser()->useNPPatrol() ) {
+ if ( $this->opts->getValue( 'hidepatrolled' ) && $this->getUser()->useNPPatrol() ) {
$conds['rc_patrolled'] = 0;
}
- if( $this->opts->getValue( 'hidebots' ) ) {
+
+ if ( $this->opts->getValue( 'hidebots' ) ) {
$conds['rc_bot'] = 0;
}
@@ -546,7 +563,7 @@ class NewPagesPager extends ReverseChronologicalPager {
$tables = array( 'recentchanges', 'page' );
$fields = array(
'rc_namespace', 'rc_title', 'rc_cur_id', 'rc_user', 'rc_user_text',
- 'rc_comment', 'rc_timestamp', 'rc_patrolled','rc_id', 'rc_deleted',
+ 'rc_comment', 'rc_timestamp', 'rc_patrolled', 'rc_id', 'rc_deleted',
'length' => 'page_len', 'rev_id' => 'page_latest', 'rc_this_oldid',
'page_namespace', 'page_title'
);
@@ -556,10 +573,10 @@ class NewPagesPager extends ReverseChronologicalPager {
array( &$this, $this->opts, &$conds, &$tables, &$fields, &$join_conds ) );
$info = array(
- 'tables' => $tables,
- 'fields' => $fields,
- 'conds' => $conds,
- 'options' => array( 'USE INDEX' => array( 'recentchanges' => $rcIndexes ) ),
+ 'tables' => $tables,
+ 'fields' => $fields,
+ 'conds' => $conds,
+ 'options' => array( 'USE INDEX' => array( 'recentchanges' => $rcIndexes ) ),
'join_conds' => $join_conds
);
@@ -593,6 +610,7 @@ class NewPagesPager extends ReverseChronologicalPager {
$linkBatch->add( $row->rc_namespace, $row->rc_title );
}
$linkBatch->execute();
+
return '<ul>';
}
diff --git a/includes/specials/SpecialPagesWithProp.php b/includes/specials/SpecialPagesWithProp.php
index 8f8c981e..e22b42a3 100644
--- a/includes/specials/SpecialPagesWithProp.php
+++ b/includes/specials/SpecialPagesWithProp.php
@@ -23,7 +23,6 @@
* @author Brad Jorsch
*/
-
/**
* Special:PagesWithProp to search the page_props table
* @ingroup SpecialPage
@@ -43,6 +42,7 @@ class SpecialPagesWithProp extends QueryPage {
function execute( $par ) {
$this->setHeaders();
$this->outputHeader();
+ $this->getOutput()->addModuleStyles( 'mediawiki.special.pagesWithProp' );
$request = $this->getRequest();
$propname = $request->getVal( 'propname', $par );
@@ -55,6 +55,7 @@ class SpecialPagesWithProp extends QueryPage {
__METHOD__,
array( 'DISTINCT', 'ORDER BY' => 'pp_propname' )
);
+ $propnames = array();
foreach ( $res as $row ) {
$propnames[$row->pp_propname] = $row->pp_propname;
}
@@ -70,9 +71,8 @@ class SpecialPagesWithProp extends QueryPage {
),
), $this->getContext() );
$form->setMethod( 'get' );
- $form->setAction( $this->getTitle()->getFullUrl() );
$form->setSubmitCallback( array( $this, 'onSubmit' ) );
- $form->setWrapperLegend( $this->msg( 'pageswithprop-legend' ) );
+ $form->setWrapperLegendMsg( 'pageswithprop-legend' );
$form->addHeaderText( $this->msg( 'pageswithprop-text' )->parseAsBlock() );
$form->setSubmitTextMsg( 'pageswithprop-submit' );
@@ -120,15 +120,33 @@ class SpecialPagesWithProp extends QueryPage {
return array( 'page_id' );
}
+ /**
+ * @param Skin $skin
+ * @param object $result Result row
+ * @return string
+ */
function formatResult( $skin, $result ) {
$title = Title::newFromRow( $result );
$ret = Linker::link( $title, null, array(), array(), array( 'known' ) );
if ( $result->pp_value !== '' ) {
- $value = $this->msg( 'parentheses' )
- ->rawParams( Xml::span( $result->pp_value, 'prop-value' ) )
- ->escaped();
- $ret .= " $value";
+ // Do not show very long or binary values on the special page
+ $valueLength = strlen( $result->pp_value );
+ $isBinary = strpos( $result->pp_value, "\0" ) !== false;
+ $isTooLong = $valueLength > 1024;
+
+ if ( $isBinary || $isTooLong ) {
+ $message = $this
+ ->msg( $isBinary ? 'pageswithprop-prophidden-binary' : 'pageswithprop-prophidden-long' )
+ ->params( $this->getLanguage()->formatSize( $valueLength ) );
+
+ $propValue = Html::element( 'span', array( 'class' => 'prop-value-hidden' ), $message->text() );
+ } else {
+ $propValue = Html::element( 'span', array( 'class' => 'prop-value' ), $result->pp_value );
+ }
+
+ $ret .= $this->msg( 'colon-separator' )->escaped() . $propValue;
}
+
return $ret;
}
diff --git a/includes/specials/SpecialPasswordReset.php b/includes/specials/SpecialPasswordReset.php
index 90b0ac80..c486ba01 100644
--- a/includes/specials/SpecialPasswordReset.php
+++ b/includes/specials/SpecialPasswordReset.php
@@ -27,19 +27,23 @@
* @ingroup SpecialPage
*/
class SpecialPasswordReset extends FormSpecialPage {
-
/**
* @var Message
*/
private $email;
/**
+ * @var User
+ */
+ private $firstUser;
+
+ /**
* @var Status
*/
private $result;
public function __construct() {
- parent::__construct( 'PasswordReset' );
+ parent::__construct( 'PasswordReset', 'editmyprivateinfo' );
}
public function userCanExecute( User $user ) {
@@ -65,7 +69,8 @@ class SpecialPasswordReset extends FormSpecialPage {
'type' => 'text',
'label-message' => 'passwordreset-username',
);
- if( $this->getUser()->isLoggedIn() ) {
+
+ if ( $this->getUser()->isLoggedIn() ) {
$a['Username']['default'] = $this->getUser()->getName();
}
}
@@ -86,7 +91,7 @@ class SpecialPasswordReset extends FormSpecialPage {
);
}
- if( $this->getUser()->isAllowed( 'passwordreset' ) ) {
+ if ( $this->getUser()->isAllowed( 'passwordreset' ) ) {
$a['Capture'] = array(
'type' => 'check',
'label-message' => 'passwordreset-capture',
@@ -98,11 +103,15 @@ class SpecialPasswordReset extends FormSpecialPage {
}
public function alterForm( HTMLForm $form ) {
- $form->setSubmitTextMsg( 'mailmypassword' );
- }
-
- protected function preText() {
global $wgPasswordResetRoutes;
+
+ $form->setDisplayFormat( 'vform' );
+ // Turn the old-school line around the form off.
+ // XXX This wouldn't be necessary here if we could set the format of
+ // the HTMLForm to 'vform' at its creation, but there's no way to do so
+ // from a FormSpecialPage class.
+ $form->setWrapperLegend( false );
+
$i = 0;
if ( isset( $wgPasswordResetRoutes['username'] ) && $wgPasswordResetRoutes['username'] ) {
$i++;
@@ -113,7 +122,11 @@ class SpecialPasswordReset extends FormSpecialPage {
if ( isset( $wgPasswordResetRoutes['domain'] ) && $wgPasswordResetRoutes['domain'] ) {
$i++;
}
- return $this->msg( 'passwordreset-pretext', $i )->parseAsBlock();
+
+ $message = ( $i > 1 ) ? 'passwordreset-text-many' : 'passwordreset-text-one';
+
+ $form->setHeaderText( $this->msg( $message, $i )->parseAsBlock() );
+ $form->setSubmitTextMsg( 'mailmypassword' );
}
/**
@@ -136,8 +149,9 @@ class SpecialPasswordReset extends FormSpecialPage {
}
}
- if( isset( $data['Capture'] ) && !$this->getUser()->isAllowed( 'passwordreset' ) ) {
- // The user knows they don't have the passwordreset permission, but they tried to spoof the form. That's naughty
+ if ( isset( $data['Capture'] ) && !$this->getUser()->isAllowed( 'passwordreset' ) ) {
+ // The user knows they don't have the passwordreset permission,
+ // but they tried to spoof the form. That's naughty
throw new PermissionsError( 'passwordreset' );
}
@@ -151,8 +165,8 @@ class SpecialPasswordReset extends FormSpecialPage {
$users = array( User::newFromName( $data['Username'] ) );
} elseif ( isset( $data['Email'] )
&& $data['Email'] !== ''
- && Sanitizer::validateEmail( $data['Email'] ) )
- {
+ && Sanitizer::validateEmail( $data['Email'] )
+ ) {
$method = 'email';
$res = wfGetDB( DB_SLAVE )->select(
'user',
@@ -160,9 +174,11 @@ class SpecialPasswordReset extends FormSpecialPage {
array( 'user_email' => $data['Email'] ),
__METHOD__
);
+
if ( $res ) {
$users = array();
- foreach( $res as $row ) {
+
+ foreach ( $res as $row ) {
$users[] = User::newFromRow( $row );
}
} else {
@@ -180,8 +196,8 @@ class SpecialPasswordReset extends FormSpecialPage {
return array( $error );
}
- if( count( $users ) == 0 ) {
- if( $method == 'email' ) {
+ if ( count( $users ) == 0 ) {
+ if ( $method == 'email' ) {
// Don't reveal whether or not an email address is in use
return true;
} else {
@@ -204,9 +220,13 @@ class SpecialPasswordReset extends FormSpecialPage {
foreach ( $users as $user ) {
if ( $user->isPasswordReminderThrottled() ) {
global $wgPasswordReminderResendTime;
+
# Round the time in hours to 3 d.p., in case someone is specifying
# minutes or seconds.
- return array( array( 'throttled-mailpassword', round( $wgPasswordReminderResendTime, 3 ) ) );
+ return array( array(
+ 'throttled-mailpassword',
+ round( $wgPasswordReminderResendTime, 3 )
+ ) );
}
}
@@ -239,8 +259,8 @@ class SpecialPasswordReset extends FormSpecialPage {
$password = $user->randomPassword();
$user->setNewpassword( $password );
$user->saveSettings();
- $passwords[] = $this->msg( 'passwordreset-emailelement', $user->getName(), $password
- )->inLanguage( $userLanguage )->text(); // We'll escape the whole thing later
+ $passwords[] = $this->msg( 'passwordreset-emailelement', $user->getName(), $password )
+ ->inLanguage( $userLanguage )->text(); // We'll escape the whole thing later
}
$passwordBlock = implode( "\n\n", $passwords );
@@ -249,7 +269,7 @@ class SpecialPasswordReset extends FormSpecialPage {
$username,
$passwordBlock,
count( $passwords ),
- '<' . Title::newMainPage()->getCanonicalUrl() . '>',
+ '<' . Title::newMainPage()->getCanonicalURL() . '>',
round( $wgNewPasswordExpiry / 86400 )
);
@@ -257,31 +277,36 @@ class SpecialPasswordReset extends FormSpecialPage {
$this->result = $firstUser->sendMail( $title->escaped(), $this->email->text() );
- // Blank the email if the user is not supposed to see it
- if( !isset( $data['Capture'] ) || !$data['Capture'] ) {
+ if ( isset( $data['Capture'] ) && $data['Capture'] ) {
+ // Save the user, will be used if an error occurs when sending the email
+ $this->firstUser = $firstUser;
+ } else {
+ // Blank the email if the user is not supposed to see it
$this->email = null;
}
if ( $this->result->isGood() ) {
return true;
- } elseif( isset( $data['Capture'] ) && $data['Capture'] ) {
+ } elseif ( isset( $data['Capture'] ) && $data['Capture'] ) {
// The email didn't send, but maybe they knew that and that's why they captured it
return true;
} else {
- // @todo FIXME: The email didn't send, but we have already set the password throttle
- // timestamp, so they won't be able to try again until it expires... :(
+ // @todo FIXME: The email wasn't sent, but we have already set
+ // the password throttle timestamp, so they won't be able to try
+ // again until it expires... :(
return array( array( 'mailerror', $this->result->getMessage() ) );
}
}
public function onSuccess() {
- if( $this->getUser()->isAllowed( 'passwordreset' ) && $this->email != null ) {
- // @todo: Logging
+ if ( $this->getUser()->isAllowed( 'passwordreset' ) && $this->email != null ) {
+ // @todo Logging
- if( $this->result->isGood() ) {
+ if ( $this->result->isGood() ) {
$this->getOutput()->addWikiMsg( 'passwordreset-emailsent-capture' );
} else {
- $this->getOutput()->addWikiMsg( 'passwordreset-emailerror-capture', $this->result->getMessage() );
+ $this->getOutput()->addWikiMsg( 'passwordreset-emailerror-capture',
+ $this->result->getMessage(), $this->firstUser->getName() );
}
$this->getOutput()->addHTML( Html::rawElement( 'pre', array(), $this->email->escaped() ) );
@@ -292,12 +317,12 @@ class SpecialPasswordReset extends FormSpecialPage {
}
protected function canChangePassword( User $user ) {
- global $wgPasswordResetRoutes, $wgAuth;
+ global $wgPasswordResetRoutes, $wgEnableEmail, $wgAuth;
// Maybe password resets are disabled, or there are no allowable routes
if ( !is_array( $wgPasswordResetRoutes ) ||
- !in_array( true, array_values( $wgPasswordResetRoutes ) ) )
- {
+ !in_array( true, array_values( $wgPasswordResetRoutes ) )
+ ) {
return 'passwordreset-disabled';
}
@@ -306,6 +331,11 @@ class SpecialPasswordReset extends FormSpecialPage {
return 'resetpass_forbidden';
}
+ // Maybe email features have been disabled
+ if ( !$wgEnableEmail ) {
+ return 'passwordreset-emaildisabled';
+ }
+
// Maybe the user is blocked (check this here rather than relying on the parent
// method as we have a more specific error message to use here
if ( $user->isBlocked() ) {
diff --git a/includes/specials/SpecialPopularpages.php b/includes/specials/SpecialPopularpages.php
index 7ce8c13f..2a80f651 100644
--- a/includes/specials/SpecialPopularpages.php
+++ b/includes/specials/SpecialPopularpages.php
@@ -27,7 +27,6 @@
* @ingroup SpecialPage
*/
class PopularPagesPage extends QueryPage {
-
function __construct( $name = 'Popularpages' ) {
parent::__construct( $name );
}
@@ -42,27 +41,37 @@ class PopularPagesPage extends QueryPage {
}
function getQueryInfo() {
- return array (
+ return array(
'tables' => array( 'page' ),
- 'fields' => array( 'namespace' => 'page_namespace',
- 'title' => 'page_title',
- 'value' => 'page_counter' ),
- 'conds' => array( 'page_is_redirect' => 0,
- 'page_namespace' => MWNamespace::getContentNamespaces() ) );
+ 'fields' => array(
+ 'namespace' => 'page_namespace',
+ 'title' => 'page_title',
+ 'value' => 'page_counter' ),
+ 'conds' => array(
+ 'page_is_redirect' => 0,
+ 'page_namespace' => MWNamespace::getContentNamespaces()
+ )
+ );
}
/**
- * @param $skin Skin
- * @param $result
+ * @param Skin $skin
+ * @param object $result Result row
* @return string
*/
function formatResult( $skin, $result ) {
global $wgContLang;
$title = Title::makeTitleSafe( $result->namespace, $result->title );
- if( !$title ) {
- return Html::element( 'span', array( 'class' => 'mw-invalidtitle' ),
- Linker::getInvalidTitleDescription( $this->getContext(), $result->namespace, $result->title ) );
+ if ( !$title ) {
+ return Html::element(
+ 'span',
+ array( 'class' => 'mw-invalidtitle' ),
+ Linker::getInvalidTitleDescription(
+ $this->getContext(),
+ $result->namespace,
+ $result->title )
+ );
}
$link = Linker::linkKnown(
@@ -70,6 +79,7 @@ class PopularPagesPage extends QueryPage {
htmlspecialchars( $wgContLang->convert( $title->getPrefixedText() ) )
);
$nv = $this->msg( 'nviews' )->numParams( $result->value )->escaped();
+
return $this->getLanguage()->specialList( $link, $nv );
}
diff --git a/includes/specials/SpecialPreferences.php b/includes/specials/SpecialPreferences.php
index a50e7c18..ecee0bb7 100644
--- a/includes/specials/SpecialPreferences.php
+++ b/includes/specials/SpecialPreferences.php
@@ -35,16 +35,21 @@ class SpecialPreferences extends SpecialPage {
$this->setHeaders();
$this->outputHeader();
$out = $this->getOutput();
- $out->disallowUserJs(); # Prevent hijacked user scripts from sniffing passwords etc.
+ $out->disallowUserJs(); # Prevent hijacked user scripts from sniffing passwords etc.
$user = $this->getUser();
if ( $user->isAnon() ) {
- throw new ErrorPageError( 'prefsnologin', 'prefsnologintext', array( $this->getTitle()->getPrefixedDBkey() ) );
+ throw new ErrorPageError(
+ 'prefsnologin',
+ 'prefsnologintext',
+ array( $this->getTitle()->getPrefixedDBkey() )
+ );
}
$this->checkReadOnly();
if ( $par == 'reset' ) {
$this->showResetForm();
+
return;
}
@@ -52,7 +57,7 @@ class SpecialPreferences extends SpecialPage {
if ( $this->getRequest()->getCheck( 'success' ) ) {
$out->wrapWikiMsg(
- "<div class=\"successbox\"><strong>\n$1\n</strong></div><div id=\"mw-pref-clear\"></div>",
+ "<div class=\"successbox\">\n$1\n</div>",
'savedprefs'
);
}
@@ -64,12 +69,17 @@ class SpecialPreferences extends SpecialPage {
}
private function showResetForm() {
+ if ( !$this->getUser()->isAllowed( 'editmyoptions' ) ) {
+ throw new PermissionsError( 'editmyoptions' );
+ }
+
$this->getOutput()->addWikiMsg( 'prefs-reset-intro' );
- $htmlForm = new HTMLForm( array(), $this->getContext(), 'prefs-restore' );
+ $context = new DerivativeContext( $this->getContext() );
+ $context->setTitle( $this->getTitle( 'reset' ) ); // Reset subpage
+ $htmlForm = new HTMLForm( array(), $context, 'prefs-restore' );
$htmlForm->setSubmitTextMsg( 'restoreprefs' );
- $htmlForm->setTitle( $this->getTitle( 'reset' ) );
$htmlForm->setSubmitCallback( array( $this, 'submitReset' ) );
$htmlForm->suppressReset();
@@ -77,8 +87,12 @@ class SpecialPreferences extends SpecialPage {
}
public function submitReset( $formData ) {
+ if ( !$this->getUser()->isAllowed( 'editmyoptions' ) ) {
+ throw new PermissionsError( 'editmyoptions' );
+ }
+
$user = $this->getUser();
- $user->resetOptions( 'all' );
+ $user->resetOptions( 'all', $this->getContext() );
$user->saveSettings();
$url = $this->getTitle()->getFullURL( 'success' );
diff --git a/includes/specials/SpecialPrefixindex.php b/includes/specials/SpecialPrefixindex.php
index 6affa735..28d07ffc 100644
--- a/includes/specials/SpecialPrefixindex.php
+++ b/includes/specials/SpecialPrefixindex.php
@@ -27,6 +27,15 @@
* @ingroup SpecialPage
*/
class SpecialPrefixindex extends SpecialAllpages {
+
+ /**
+ * Whether to remove the searched prefix from the displayed link. Useful
+ * for inclusion of a set of sub pages in a root page.
+ */
+ protected $stripPrefix = false;
+
+ protected $hideRedirects = false;
+
// Inherit $maxPerPage
function __construct() {
@@ -52,7 +61,8 @@ class SpecialPrefixindex extends SpecialAllpages {
$prefix = $request->getVal( 'prefix', '' );
$ns = $request->getIntOrNull( 'namespace' );
$namespace = (int)$ns; // if no namespace given, use 0 (NS_MAIN).
- $hideredirects = $request->getBool( 'hideredirects', false );
+ $this->hideRedirects = $request->getBool( 'hideredirects', $this->hideRedirects );
+ $this->stripPrefix = $request->getBool( 'stripprefix', $this->stripPrefix );
$namespaces = $wgContLang->getNamespaces();
$out->setPageTitle(
@@ -62,11 +72,11 @@ class SpecialPrefixindex extends SpecialAllpages {
);
$showme = '';
- if( isset( $par ) ) {
+ if ( isset( $par ) ) {
$showme = $par;
- } elseif( $prefix != '' ) {
+ } elseif ( $prefix != '' ) {
$showme = $prefix;
- } elseif( $from != '' && $ns === null ) {
+ } elseif ( $from != '' && $ns === null ) {
// For back-compat with Special:Allpages
// Don't do this if namespace is passed, so paging works when doing NS views.
$showme = $from;
@@ -74,9 +84,9 @@ class SpecialPrefixindex extends SpecialAllpages {
// Bug 27864: if transcluded, show all pages instead of the form.
if ( $this->including() || $showme != '' || $ns !== null ) {
- $this->showPrefixChunk( $namespace, $showme, $from, $hideredirects );
+ $this->showPrefixChunk( $namespace, $showme, $from );
} else {
- $out->addHTML( $this->namespacePrefixForm( $namespace, null, $hideredirects ) );
+ $out->addHTML( $this->namespacePrefixForm( $namespace, null ) );
}
}
@@ -84,10 +94,9 @@ class SpecialPrefixindex extends SpecialAllpages {
* HTML for the top form
* @param $namespace Integer: a namespace constant (default NS_MAIN).
* @param string $from dbKey we are starting listing at.
- * @param bool $hideredirects hide redirects (default FALSE)
* @return string
*/
- function namespacePrefixForm( $namespace = NS_MAIN, $from = '', $hideredirects = false ) {
+ protected function namespacePrefixForm( $namespace = NS_MAIN, $from = '' ) {
global $wgScript;
$out = Xml::openElement( 'div', array( 'class' => 'namespaceoptions' ) );
@@ -98,37 +107,44 @@ class SpecialPrefixindex extends SpecialAllpages {
$out .= Xml::openElement( 'table', array( 'id' => 'nsselect', 'class' => 'allpages' ) );
$out .= "<tr>
<td class='mw-label'>" .
- Xml::label( $this->msg( 'allpagesprefix' )->text(), 'nsfrom' ) .
- "</td>
+ Xml::label( $this->msg( 'allpagesprefix' )->text(), 'nsfrom' ) .
+ "</td>
<td class='mw-input'>" .
- Xml::input( 'prefix', 30, str_replace( '_', ' ', $from ), array( 'id' => 'nsfrom' ) ) .
- "</td>
+ Xml::input( 'prefix', 30, str_replace( '_', ' ', $from ), array( 'id' => 'nsfrom' ) ) .
+ "</td>
</tr>
<tr>
- <td class='mw-label'>" .
- Xml::label( $this->msg( 'namespace' )->text(), 'namespace' ) .
- "</td>
+ <td class='mw-label'>" .
+ Xml::label( $this->msg( 'namespace' )->text(), 'namespace' ) .
+ "</td>
<td class='mw-input'>" .
- Html::namespaceSelector( array(
- 'selected' => $namespace,
- ), array(
- 'name' => 'namespace',
- 'id' => 'namespace',
- 'class' => 'namespaceselector',
- ) ) .
- Xml::checkLabel(
- $this->msg( 'allpages-hide-redirects' )->text(),
- 'hideredirects',
- 'hideredirects',
- $hideredirects
- ) . ' ' .
- Xml::submitButton( $this->msg( 'allpagessubmit' )->text() ) .
- "</td>
+ Html::namespaceSelector( array(
+ 'selected' => $namespace,
+ ), array(
+ 'name' => 'namespace',
+ 'id' => 'namespace',
+ 'class' => 'namespaceselector',
+ ) ) .
+ Xml::checkLabel(
+ $this->msg( 'allpages-hide-redirects' )->text(),
+ 'hideredirects',
+ 'hideredirects',
+ $this->hideRedirects
+ ) . ' ' .
+ Xml::checkLabel(
+ $this->msg( 'prefixindex-strip' )->text(),
+ 'stripprefix',
+ 'stripprefix',
+ $this->stripPrefix
+ ) . ' ' .
+ Xml::submitButton( $this->msg( 'allpagessubmit' )->text() ) .
+ "</td>
</tr>";
$out .= Xml::closeElement( 'table' );
$out .= Xml::closeElement( 'fieldset' );
$out .= Xml::closeElement( 'form' );
$out .= Xml::closeElement( 'div' );
+
return $out;
}
@@ -136,9 +152,8 @@ class SpecialPrefixindex extends SpecialAllpages {
* @param $namespace Integer, default NS_MAIN
* @param $prefix String
* @param string $from list all pages from this name (default FALSE)
- * @param bool $hideredirects hide redirects (default FALSE)
*/
- function showPrefixChunk( $namespace = NS_MAIN, $prefix, $from = null, $hideredirects = false ) {
+ protected function showPrefixChunk( $namespace = NS_MAIN, $prefix, $from = null ) {
global $wgContLang;
if ( $from === null ) {
@@ -169,7 +184,7 @@ class SpecialPrefixindex extends SpecialAllpages {
'page_title >= ' . $dbr->addQuotes( $fromKey ),
);
- if ( $hideredirects ) {
+ if ( $this->hideRedirects ) {
$conds['page_is_redirect'] = 0;
}
@@ -178,8 +193,8 @@ class SpecialPrefixindex extends SpecialAllpages {
$conds,
__METHOD__,
array(
- 'ORDER BY' => 'page_title',
- 'LIMIT' => $this->maxPerPage + 1,
+ 'ORDER BY' => 'page_title',
+ 'LIMIT' => $this->maxPerPage + 1,
'USE INDEX' => 'name_title',
)
);
@@ -187,34 +202,42 @@ class SpecialPrefixindex extends SpecialAllpages {
### @todo FIXME: Side link to previous
$n = 0;
- if( $res->numRows() > 0 ) {
+ if ( $res->numRows() > 0 ) {
$out = Xml::openElement( 'table', array( 'id' => 'mw-prefixindex-list-table' ) );
- while( ( $n < $this->maxPerPage ) && ( $s = $res->fetchObject() ) ) {
+ $prefixLength = strlen( $prefix );
+ while ( ( $n < $this->maxPerPage ) && ( $s = $res->fetchObject() ) ) {
$t = Title::makeTitle( $s->page_namespace, $s->page_title );
- if( $t ) {
- $link = ($s->page_is_redirect ? '<div class="allpagesredirect">' : '' ) .
+ if ( $t ) {
+ $displayed = $t->getText();
+ // Try not to generate unclickable links
+ if ( $this->stripPrefix && $prefixLength !== strlen( $displayed ) ) {
+ $displayed = substr( $displayed, $prefixLength );
+ }
+ $link = ( $s->page_is_redirect ? '<div class="allpagesredirect">' : '' ) .
Linker::linkKnown(
$t,
- htmlspecialchars( $t->getText() ),
+ htmlspecialchars( $displayed ),
$s->page_is_redirect ? array( 'class' => 'mw-redirect' ) : array()
) .
- ($s->page_is_redirect ? '</div>' : '' );
+ ( $s->page_is_redirect ? '</div>' : '' );
} else {
$link = '[[' . htmlspecialchars( $s->page_title ) . ']]';
}
- if( $n % 3 == 0 ) {
+ if ( $n % 3 == 0 ) {
$out .= '<tr>';
}
$out .= "<td>$link</td>";
$n++;
- if( $n % 3 == 0 ) {
+ if ( $n % 3 == 0 ) {
$out .= '</tr>';
}
}
- if( ($n % 3) != 0 ) {
+
+ if ( $n % 3 != 0 ) {
$out .= '</tr>';
}
+
$out .= Xml::closeElement( 'table' );
} else {
$out = '';
@@ -225,37 +248,45 @@ class SpecialPrefixindex extends SpecialAllpages {
if ( $this->including() ) {
$out2 = '';
} else {
- $nsForm = $this->namespacePrefixForm( $namespace, $prefix, $hideredirects );
+ $nsForm = $this->namespacePrefixForm( $namespace, $prefix );
$self = $this->getTitle();
$out2 = Xml::openElement( 'table', array( 'id' => 'mw-prefixindex-nav-table' ) ) .
'<tr>
<td>' .
- $nsForm .
- '</td>
- <td id="mw-prefixindex-nav-form" class="mw-prefixindex-nav">';
+ $nsForm .
+ '</td>
+ <td id="mw-prefixindex-nav-form" class="mw-prefixindex-nav">';
- if( isset( $res ) && $res && ( $n == $this->maxPerPage ) && ( $s = $res->fetchObject() ) ) {
+ if ( isset( $res ) && $res && ( $n == $this->maxPerPage ) &&
+ ( $s = $res->fetchObject() )
+ ) {
$query = array(
'from' => $s->page_title,
'prefix' => $prefix,
- 'hideredirects' => $hideredirects,
+ 'hideredirects' => $this->hideRedirects,
);
- if( $namespace || $prefix == '' ) {
+ if ( $namespace || $prefix == '' ) {
// Keep the namespace even if it's 0 for empty prefixes.
// This tells us we're not just a holdover from old links.
$query['namespace'] = $namespace;
}
+
$nextLink = Linker::linkKnown(
- $self,
- $this->msg( 'nextpage', str_replace( '_', ' ', $s->page_title ) )->escaped(),
- array(),
- $query
- );
+ $self,
+ $this->msg( 'nextpage', str_replace( '_', ' ', $s->page_title ) )->escaped(),
+ array(),
+ $query
+ );
+
$out2 .= $nextLink;
- $footer = "\n" . Html::element( "hr" )
- . Html::rawElement( "div", array( "class" => "mw-prefixindex-nav" ), $nextLink );
+ $footer = "\n" . Html::element( 'hr' ) .
+ Html::rawElement(
+ 'div',
+ array( 'class' => 'mw-prefixindex-nav' ),
+ $nextLink
+ );
}
$out2 .= "</td></tr>" .
Xml::closeElement( 'table' );
diff --git a/includes/specials/SpecialProtectedpages.php b/includes/specials/SpecialProtectedpages.php
index cdf053ec..3de6ea24 100644
--- a/includes/specials/SpecialProtectedpages.php
+++ b/includes/specials/SpecialProtectedpages.php
@@ -40,7 +40,7 @@ class SpecialProtectedpages extends SpecialPage {
$this->outputHeader();
// Purge expired entries on one in every 10 queries
- if( !mt_rand( 0, 10 ) ) {
+ if ( !mt_rand( 0, 10 ) ) {
Title::purgeExpiredRestrictions();
}
@@ -49,19 +49,37 @@ class SpecialProtectedpages extends SpecialPage {
$level = $request->getVal( $this->IdLevel );
$sizetype = $request->getVal( 'sizetype' );
$size = $request->getIntOrNull( 'size' );
- $NS = $request->getIntOrNull( 'namespace' );
+ $ns = $request->getIntOrNull( 'namespace' );
$indefOnly = $request->getBool( 'indefonly' ) ? 1 : 0;
$cascadeOnly = $request->getBool( 'cascadeonly' ) ? 1 : 0;
- $pager = new ProtectedPagesPager( $this, array(), $type, $level, $NS, $sizetype, $size, $indefOnly, $cascadeOnly );
-
- $this->getOutput()->addHTML( $this->showOptions( $NS, $type, $level, $sizetype, $size, $indefOnly, $cascadeOnly ) );
+ $pager = new ProtectedPagesPager(
+ $this,
+ array(),
+ $type,
+ $level,
+ $ns,
+ $sizetype,
+ $size,
+ $indefOnly,
+ $cascadeOnly
+ );
- if( $pager->getNumRows() ) {
+ $this->getOutput()->addHTML( $this->showOptions(
+ $ns,
+ $type,
+ $level,
+ $sizetype,
+ $size,
+ $indefOnly,
+ $cascadeOnly
+ ) );
+
+ if ( $pager->getNumRows() ) {
$this->getOutput()->addHTML(
$pager->getNavigationBar() .
- '<ul>' . $pager->getBody() . '</ul>' .
- $pager->getNavigationBar()
+ '<ul>' . $pager->getBody() . '</ul>' .
+ $pager->getNavigationBar()
);
} else {
$this->getOutput()->addWikiMsg( 'protectedpagesempty' );
@@ -78,26 +96,39 @@ class SpecialProtectedpages extends SpecialPage {
static $infinity = null;
- if( is_null( $infinity ) ) {
+ if ( is_null( $infinity ) ) {
$infinity = wfGetDB( DB_SLAVE )->getInfinity();
}
$title = Title::makeTitleSafe( $row->page_namespace, $row->page_title );
- if( !$title ) {
- return Html::rawElement( 'li', array(),
- Html::element( 'span', array( 'class' => 'mw-invalidtitle' ),
- Linker::getInvalidTitleDescription( $this->getContext(), $row->page_namespace, $row->page_title ) ) ) . "\n";
+ if ( !$title ) {
+ wfProfileOut( __METHOD__ );
+
+ return Html::rawElement(
+ 'li',
+ array(),
+ Html::element(
+ 'span',
+ array( 'class' => 'mw-invalidtitle' ),
+ Linker::getInvalidTitleDescription(
+ $this->getContext(),
+ $row->page_namespace,
+ $row->page_title
+ )
+ )
+ ) . "\n";
}
$link = Linker::link( $title );
- $description_items = array ();
+ $description_items = array();
+ // Messages: restriction-level-sysop, restriction-level-autoconfirmed
$protType = $this->msg( 'restriction-level-' . $row->pr_level )->escaped();
$description_items[] = $protType;
- if( $row->pr_cascade ) {
+ if ( $row->pr_cascade ) {
$description_items[] = $this->msg( 'protect-summary-cascade' )->text();
}
@@ -105,7 +136,7 @@ class SpecialProtectedpages extends SpecialPage {
$lang = $this->getLanguage();
$expiry = $lang->formatExpiry( $row->pr_expiry, TS_MW );
- if( $expiry != $infinity ) {
+ if ( $expiry != $infinity ) {
$user = $this->getUser();
$description_items[] = $this->msg(
'protect-expiring-local',
@@ -115,12 +146,13 @@ class SpecialProtectedpages extends SpecialPage {
)->escaped();
}
- if( !is_null( $size = $row->page_len ) ) {
+ if ( !is_null( $size = $row->page_len ) ) {
$stxt = $lang->getDirMark() . ' ' . Linker::formatRevisionSize( $size );
}
- # Show a link to the change protection form for allowed users otherwise a link to the protection log
- if( $this->getUser()->isAllowed( 'protect' ) ) {
+ // Show a link to the change protection form for allowed users otherwise
+ // a link to the protection log
+ if ( $this->getUser()->isAllowed( 'protect' ) ) {
$changeProtection = Linker::linkKnown(
$title,
$this->msg( 'protect_change' )->escaped(),
@@ -140,14 +172,17 @@ class SpecialProtectedpages extends SpecialPage {
);
}
- $changeProtection = ' ' . $this->msg( 'parentheses' )->rawParams( $changeProtection )->escaped();
+ $changeProtection = ' ' . $this->msg( 'parentheses' )->rawParams( $changeProtection )
+ ->escaped();
wfProfileOut( __METHOD__ );
return Html::rawElement(
'li',
array(),
- $lang->specialList( $link . $stxt, $lang->commaList( $description_items ), false ) . $changeProtection ) . "\n";
+ $lang->specialList( $link . $stxt, $lang->commaList( $description_items ), false ) .
+ $changeProtection
+ ) . "\n";
}
/**
@@ -160,9 +195,13 @@ class SpecialProtectedpages extends SpecialPage {
* @param $cascadeOnly Boolean: only cascading protection
* @return String: input form
*/
- protected function showOptions( $namespace, $type = 'edit', $level, $sizetype, $size, $indefOnly, $cascadeOnly ) {
+ protected function showOptions( $namespace, $type = 'edit', $level, $sizetype,
+ $size, $indefOnly, $cascadeOnly
+ ) {
global $wgScript;
+
$title = $this->getTitle();
+
return Xml::openElement( 'form', array( 'method' => 'get', 'action' => $wgScript ) ) .
Xml::openElement( 'fieldset' ) .
Xml::element( 'legend', array(), $this->msg( 'protectedpages' )->text() ) .
@@ -196,8 +235,8 @@ class SpecialProtectedpages extends SpecialPage {
'all' => '',
'label' => $this->msg( 'namespace' )->text()
), array(
- 'name' => 'namespace',
- 'id' => 'namespace',
+ 'name' => 'namespace',
+ 'id' => 'namespace',
'class' => 'namespaceselector',
)
)
@@ -205,31 +244,54 @@ class SpecialProtectedpages extends SpecialPage {
}
/**
+ * @param bool $indefOnly
* @return string Formatted HTML
*/
protected function getExpiryCheck( $indefOnly ) {
- return
- Xml::checkLabel( $this->msg( 'protectedpages-indef' )->text(), 'indefonly', 'indefonly', $indefOnly ) . "\n";
+ return Xml::checkLabel(
+ $this->msg( 'protectedpages-indef' )->text(),
+ 'indefonly',
+ 'indefonly',
+ $indefOnly
+ ) . "\n";
}
/**
+ * @param bool $cascadeOnly
* @return string Formatted HTML
*/
protected function getCascadeCheck( $cascadeOnly ) {
- return
- Xml::checkLabel( $this->msg( 'protectedpages-cascade' )->text(), 'cascadeonly', 'cascadeonly', $cascadeOnly ) . "\n";
+ return Xml::checkLabel(
+ $this->msg( 'protectedpages-cascade' )->text(),
+ 'cascadeonly',
+ 'cascadeonly',
+ $cascadeOnly
+ ) . "\n";
}
/**
+ * @param string $sizetype "min" or "max"
+ * @param mixed $size
* @return string Formatted HTML
*/
protected function getSizeLimit( $sizetype, $size ) {
$max = $sizetype === 'max';
- return
- Xml::radioLabel( $this->msg( 'minimum-size' )->text(), 'sizetype', 'min', 'wpmin', !$max ) .
+ return Xml::radioLabel(
+ $this->msg( 'minimum-size' )->text(),
+ 'sizetype',
+ 'min',
+ 'wpmin',
+ !$max
+ ) .
'&#160;' .
- Xml::radioLabel( $this->msg( 'maximum-size' )->text(), 'sizetype', 'max', 'wpmax', $max ) .
+ Xml::radioLabel(
+ $this->msg( 'maximum-size' )->text(),
+ 'sizetype',
+ 'max',
+ 'wpmax',
+ $max
+ ) .
'&#160;' .
Xml::input( 'size', 9, $size, array( 'id' => 'wpsize' ) ) .
'&#160;' .
@@ -246,14 +308,15 @@ class SpecialProtectedpages extends SpecialPage {
$options = array();
// First pass to load the log names
- foreach( Title::getFilteredRestrictionTypes( true ) as $type ) {
+ foreach ( Title::getFilteredRestrictionTypes( true ) as $type ) {
+ // Messages: restriction-edit, restriction-move, restriction-create, restriction-upload
$text = $this->msg( "restriction-$type" )->text();
$m[$text] = $type;
}
// Third pass generates sorted XHTML content
- foreach( $m as $text => $type ) {
- $selected = ($type == $pr_type );
+ foreach ( $m as $text => $type ) {
+ $selected = ( $type == $pr_type );
$options[] = Xml::option( $text, $type, $selected ) . "\n";
}
@@ -272,21 +335,22 @@ class SpecialProtectedpages extends SpecialPage {
protected function getLevelMenu( $pr_level ) {
global $wgRestrictionLevels;
- $m = array( $this->msg( 'restriction-level-all' )->text() => 0 ); // Temporary array
+ // Temporary array
+ $m = array( $this->msg( 'restriction-level-all' )->text() => 0 );
$options = array();
// First pass to load the log names
- foreach( $wgRestrictionLevels as $type ) {
+ foreach ( $wgRestrictionLevels as $type ) {
// Messages used can be 'restriction-level-sysop' and 'restriction-level-autoconfirmed'
- if( $type != '' && $type != '*' ) {
+ if ( $type != '' && $type != '*' ) {
$text = $this->msg( "restriction-level-$type" )->text();
$m[$text] = $type;
}
}
// Third pass generates sorted XHTML content
- foreach( $m as $text => $type ) {
- $selected = ($type == $pr_level );
+ foreach ( $m as $text => $type ) {
+ $selected = ( $type == $pr_level );
$options[] = Xml::option( $text, $type, $selected );
}
@@ -310,9 +374,9 @@ class ProtectedPagesPager extends AlphabeticPager {
public $mForm, $mConds;
private $type, $level, $namespace, $sizetype, $size, $indefonly;
- function __construct( $form, $conds = array(), $type, $level, $namespace, $sizetype = '', $size = 0,
- $indefonly = false, $cascadeonly = false )
- {
+ function __construct( $form, $conds = array(), $type, $level, $namespace,
+ $sizetype = '', $size = 0, $indefonly = false, $cascadeonly = false
+ ) {
$this->mForm = $form;
$this->mConds = $conds;
$this->type = ( $type ) ? $type : 'edit';
@@ -332,6 +396,7 @@ class ProtectedPagesPager extends AlphabeticPager {
$lb->add( $row->page_namespace, $row->page_title );
}
$lb->execute();
+
return '';
}
@@ -342,27 +407,31 @@ class ProtectedPagesPager extends AlphabeticPager {
function getQueryInfo() {
$conds = $this->mConds;
$conds[] = '(pr_expiry>' . $this->mDb->addQuotes( $this->mDb->timestamp() ) .
- 'OR pr_expiry IS NULL)';
+ 'OR pr_expiry IS NULL)';
$conds[] = 'page_id=pr_page';
$conds[] = 'pr_type=' . $this->mDb->addQuotes( $this->type );
- if( $this->sizetype == 'min' ) {
+ if ( $this->sizetype == 'min' ) {
$conds[] = 'page_len>=' . $this->size;
- } elseif( $this->sizetype == 'max' ) {
+ } elseif ( $this->sizetype == 'max' ) {
$conds[] = 'page_len<=' . $this->size;
}
- if( $this->indefonly ) {
- $conds[] = "pr_expiry = {$this->mDb->addQuotes( $this->mDb->getInfinity() )} OR pr_expiry IS NULL";
+ if ( $this->indefonly ) {
+ $infinity = $this->mDb->addQuotes( $this->mDb->getInfinity() );
+ $conds[] = "pr_expiry = $infinity OR pr_expiry IS NULL";
}
- if( $this->cascadeonly ) {
+ if ( $this->cascadeonly ) {
$conds[] = 'pr_cascade = 1';
}
- if( $this->level )
+ if ( $this->level ) {
$conds[] = 'pr_level=' . $this->mDb->addQuotes( $this->level );
- if( !is_null( $this->namespace ) )
+ }
+ if ( !is_null( $this->namespace ) ) {
$conds[] = 'page_namespace=' . $this->mDb->addQuotes( $this->namespace );
+ }
+
return array(
'tables' => array( 'page_restrictions', 'page' ),
'fields' => array( 'pr_id', 'page_namespace', 'page_title', 'page_len',
diff --git a/includes/specials/SpecialProtectedtitles.php b/includes/specials/SpecialProtectedtitles.php
index 0cba5ebd..078e7b12 100644
--- a/includes/specials/SpecialProtectedtitles.php
+++ b/includes/specials/SpecialProtectedtitles.php
@@ -27,7 +27,6 @@
* @ingroup SpecialPage
*/
class SpecialProtectedtitles extends SpecialPage {
-
protected $IdLevel = 'level';
protected $IdType = 'type';
@@ -58,8 +57,8 @@ class SpecialProtectedtitles extends SpecialPage {
if ( $pager->getNumRows() ) {
$this->getOutput()->addHTML(
$pager->getNavigationBar() .
- '<ul>' . $pager->getBody() . '</ul>' .
- $pager->getNavigationBar()
+ '<ul>' . $pager->getBody() . '</ul>' .
+ $pager->getNavigationBar()
);
} else {
$this->getOutput()->addWikiMsg( 'protectedtitlesempty' );
@@ -69,6 +68,7 @@ class SpecialProtectedtitles extends SpecialPage {
/**
* Callback function to output a restriction
*
+ * @param object $row Database row
* @return string
*/
function formatRow( $row ) {
@@ -76,28 +76,40 @@ class SpecialProtectedtitles extends SpecialPage {
static $infinity = null;
- if( is_null( $infinity ) ) {
+ if ( is_null( $infinity ) ) {
$infinity = wfGetDB( DB_SLAVE )->getInfinity();
}
$title = Title::makeTitleSafe( $row->pt_namespace, $row->pt_title );
- if( !$title ) {
- return Html::rawElement( 'li', array(),
- Html::element( 'span', array( 'class' => 'mw-invalidtitle' ),
- Linker::getInvalidTitleDescription( $this->getContext(), $row->pt_namespace, $row->pt_title ) ) ) . "\n";
+ if ( !$title ) {
+ wfProfileOut( __METHOD__ );
+
+ return Html::rawElement(
+ 'li',
+ array(),
+ Html::element(
+ 'span',
+ array( 'class' => 'mw-invalidtitle' ),
+ Linker::getInvalidTitleDescription(
+ $this->getContext(),
+ $row->pt_namespace,
+ $row->pt_title
+ )
+ )
+ ) . "\n";
}
$link = Linker::link( $title );
-
- $description_items = array ();
-
+ $description_items = array();
+ // Messages: restriction-level-sysop, restriction-level-autoconfirmed
$protType = $this->msg( 'restriction-level-' . $row->pt_create_perm )->escaped();
-
$description_items[] = $protType;
-
$lang = $this->getLanguage();
- $expiry = strlen( $row->pt_expiry ) ? $lang->formatExpiry( $row->pt_expiry, TS_MW ) : $infinity;
- if( $expiry != $infinity ) {
+ $expiry = strlen( $row->pt_expiry ) ?
+ $lang->formatExpiry( $row->pt_expiry, TS_MW ) :
+ $infinity;
+
+ if ( $expiry != $infinity ) {
$user = $this->getUser();
$description_items[] = $this->msg(
'protect-expiring-local',
@@ -109,6 +121,7 @@ class SpecialProtectedtitles extends SpecialPage {
wfProfileOut( __METHOD__ );
+ // @todo i18n: This should use a comma separator instead of a hard coded comma, right?
return '<li>' . $lang->specialList( $link, implode( $description_items, ', ' ) ) . "</li>\n";
}
@@ -124,6 +137,7 @@ class SpecialProtectedtitles extends SpecialPage {
$action = htmlspecialchars( $wgScript );
$title = $this->getTitle();
$special = htmlspecialchars( $title->getPrefixedDBkey() );
+
return "<form action=\"$action\" method=\"get\">\n" .
'<fieldset>' .
Xml::element( 'legend', array(), $this->msg( 'protectedtitles' )->text() ) .
@@ -148,42 +162,45 @@ class SpecialProtectedtitles extends SpecialPage {
'all' => '',
'label' => $this->msg( 'namespace' )->text()
), array(
- 'name' => 'namespace',
- 'id' => 'namespace',
+ 'name' => 'namespace',
+ 'id' => 'namespace',
'class' => 'namespaceselector',
)
);
}
/**
+ * @param string $pr_level Determines which option is selected as default
* @return string Formatted HTML
* @private
*/
function getLevelMenu( $pr_level ) {
global $wgRestrictionLevels;
- $m = array( $this->msg( 'restriction-level-all' )->text() => 0 ); // Temporary array
+ // Temporary array
+ $m = array( $this->msg( 'restriction-level-all' )->text() => 0 );
$options = array();
// First pass to load the log names
- foreach( $wgRestrictionLevels as $type ) {
+ foreach ( $wgRestrictionLevels as $type ) {
if ( $type != '' && $type != '*' ) {
+ // Messages: restriction-level-sysop, restriction-level-autoconfirmed
$text = $this->msg( "restriction-level-$type" )->text();
$m[$text] = $type;
}
}
+
// Is there only one level (aside from "all")?
- if( count( $m ) <= 2 ) {
+ if ( count( $m ) <= 2 ) {
return '';
}
// Third pass generates sorted XHTML content
- foreach( $m as $text => $type ) {
- $selected = ($type == $pr_level );
+ foreach ( $m as $text => $type ) {
+ $selected = ( $type == $pr_level );
$options[] = Xml::option( $text, $type, $selected );
}
- return
- Xml::label( $this->msg( 'restriction-level' )->text(), $this->IdLevel ) . '&#160;' .
+ return Xml::label( $this->msg( 'restriction-level' )->text(), $this->IdLevel ) . '&#160;' .
Xml::tags( 'select',
array( 'id' => $this->IdLevel, 'name' => $this->IdLevel ),
implode( "\n", $options ) );
@@ -201,12 +218,14 @@ class SpecialProtectedtitles extends SpecialPage {
class ProtectedTitlesPager extends AlphabeticPager {
public $mForm, $mConds;
- function __construct( $form, $conds = array(), $type, $level, $namespace, $sizetype = '', $size = 0 ) {
+ function __construct( $form, $conds = array(), $type, $level, $namespace,
+ $sizetype = '', $size = 0
+ ) {
$this->mForm = $form;
$this->mConds = $conds;
$this->level = $level;
$this->namespace = $namespace;
- $this->size = intval($size);
+ $this->size = intval( $size );
parent::__construct( $form->getContext() );
}
@@ -222,6 +241,7 @@ class ProtectedTitlesPager extends AlphabeticPager {
$lb->execute();
wfProfileOut( __METHOD__ );
+
return '';
}
@@ -242,10 +262,14 @@ class ProtectedTitlesPager extends AlphabeticPager {
function getQueryInfo() {
$conds = $this->mConds;
$conds[] = 'pt_expiry>' . $this->mDb->addQuotes( $this->mDb->timestamp() );
- if( $this->level )
+ if ( $this->level ) {
$conds['pt_create_perm'] = $this->level;
- if( !is_null( $this->namespace ) )
+ }
+
+ if ( !is_null( $this->namespace ) ) {
$conds[] = 'pt_namespace=' . $this->mDb->addQuotes( $this->namespace );
+ }
+
return array(
'tables' => 'protected_titles',
'fields' => array( 'pt_namespace', 'pt_title', 'pt_create_perm',
diff --git a/includes/specials/SpecialRandomInCategory.php b/includes/specials/SpecialRandomInCategory.php
new file mode 100644
index 00000000..0e022bfa
--- /dev/null
+++ b/includes/specials/SpecialRandomInCategory.php
@@ -0,0 +1,291 @@
+<?php
+/**
+ * Implements Special:RandomInCategory
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with this program; if not, write 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 Brian Wolff
+ */
+
+/**
+ * Special page to direct the user to a random page
+ *
+ * @note The method used here is rather biased. It is assumed that
+ * the use of this page will be people wanting to get a random page
+ * out of a maintenance category, to fix it up. The method used by
+ * this page should return different pages in an unpredictable fashion
+ * which is hoped to be sufficient, even if some pages are selected
+ * more often than others.
+ *
+ * A more unbiased method could be achieved by adding a cl_random field
+ * to the categorylinks table.
+ *
+ * The method used here is as follows:
+ * * Find the smallest and largest timestamp in the category
+ * * Pick a random timestamp in between
+ * * Pick an offset between 0 and 30
+ * * Get the offset'ed page that is newer than the timestamp selected
+ * The offset is meant to counter the fact the timestamps aren't usually
+ * uniformly distributed, so if things are very non-uniform at least we
+ * won't have the same page selected 99% of the time.
+ *
+ * @ingroup SpecialPage
+ */
+class SpecialRandomInCategory extends SpecialPage {
+ protected $extra = array(); // Extra SQL statements
+ protected $category = false; // Title object of category
+ protected $maxOffset = 30; // Max amount to fudge randomness by.
+ private $maxTimestamp = null;
+ private $minTimestamp = null;
+
+ public function __construct( $name = 'RandomInCategory' ) {
+ parent::__construct( $name );
+ }
+
+ /**
+ * Set which category to use.
+ * @param Title $cat
+ */
+ public function setCategory( Title $cat ) {
+ $this->category = $cat;
+ $this->maxTimestamp = null;
+ $this->minTimestamp = null;
+ }
+
+ public function execute( $par ) {
+ global $wgScript;
+
+ $cat = false;
+
+ $categoryStr = $this->getRequest()->getText( 'category', $par );
+
+ if ( $categoryStr ) {
+ $cat = Title::newFromText( $categoryStr, NS_CATEGORY );
+ }
+
+ if ( $cat && $cat->getNamespace() !== NS_CATEGORY ) {
+ // Someone searching for something like "Wikipedia:Foo"
+ $cat = Title::makeTitleSafe( NS_CATEGORY, $categoryStr );
+ }
+
+ if ( $cat ) {
+ $this->setCategory( $cat );
+ }
+
+
+ if ( !$this->category && $categoryStr ) {
+ $this->setHeaders();
+ $this->getOutput()->addWikiMsg( 'randomincategory-invalidcategory',
+ wfEscapeWikiText( $categoryStr ) );
+
+ return;
+ } elseif ( !$this->category ) {
+ $this->setHeaders();
+ $input = Html::input( 'category' );
+ $submitText = $this->msg( 'randomincategory-selectcategory-submit' )->text();
+ $submit = Html::input( '', $submitText, 'submit' );
+
+ $msg = $this->msg( 'randomincategory-selectcategory' );
+ $form = Html::rawElement( 'form', array( 'action' => $wgScript ),
+ Html::hidden( 'title', $this->getTitle()->getPrefixedText() ) .
+ $msg->rawParams( $input, $submit )->parse()
+ );
+ $this->getOutput()->addHtml( $form );
+
+ return;
+ }
+
+ $title = $this->getRandomTitle();
+
+ if ( is_null( $title ) ) {
+ $this->setHeaders();
+ $this->getOutput()->addWikiMsg( 'randomincategory-nopages',
+ $this->category->getText() );
+
+ return;
+ }
+
+ $query = $this->getRequest()->getValues();
+ unset( $query['title'] );
+ unset( $query['category'] );
+ $this->getOutput()->redirect( $title->getFullURL( $query ) );
+ }
+
+ /**
+ * Choose a random title.
+ * @return Title object (or null if nothing to choose from)
+ */
+ public function getRandomTitle() {
+ // Convert to float, since we do math with the random number.
+ $rand = (float)wfRandom();
+ $title = null;
+
+ // Given that timestamps are rather unevenly distributed, we also
+ // use an offset between 0 and 30 to make any biases less noticeable.
+ $offset = mt_rand( 0, $this->maxOffset );
+
+ if ( mt_rand( 0, 1 ) ) {
+ $up = true;
+ } else {
+ $up = false;
+ }
+
+ $row = $this->selectRandomPageFromDB( $rand, $offset, $up );
+
+ // Try again without the timestamp offset (wrap around the end)
+ if ( !$row ) {
+ $row = $this->selectRandomPageFromDB( false, $offset, $up );
+ }
+
+ // Maybe the category is really small and offset too high
+ if ( !$row ) {
+ $row = $this->selectRandomPageFromDB( $rand, 0, $up );
+ }
+
+ // Just get the first entry.
+ if ( !$row ) {
+ $row = $this->selectRandomPageFromDB( false, 0, true );
+ }
+
+ if ( $row ) {
+ return Title::makeTitle( $row->page_namespace, $row->page_title );
+ }
+
+ return null;
+ }
+
+ /**
+ * @param float $rand Random number between 0 and 1
+ * @param int $offset Extra offset to fudge randomness
+ * @param bool $up True to get the result above the random number, false for below
+ *
+ * @note The $up parameter is supposed to counteract what would happen if there
+ * was a large gap in the distribution of cl_timestamp values. This way instead
+ * of things to the right of the gap being favoured, both sides of the gap
+ * are favoured.
+ * @return Array Query information.
+ */
+ protected function getQueryInfo( $rand, $offset, $up ) {
+ $op = $up ? '>=' : '<=';
+ $dir = $up ? 'ASC' : 'DESC';
+ if ( !$this->category instanceof Title ) {
+ throw new MWException( 'No category set' );
+ }
+ $qi = array(
+ 'tables' => array( 'categorylinks', 'page' ),
+ 'fields' => array( 'page_title', 'page_namespace' ),
+ 'conds' => array_merge( array(
+ 'cl_to' => $this->category->getDBKey(),
+ ), $this->extra ),
+ 'options' => array(
+ 'ORDER BY' => 'cl_timestamp ' . $dir,
+ 'LIMIT' => 1,
+ 'OFFSET' => $offset
+ ),
+ 'join_conds' => array(
+ 'page' => array( 'INNER JOIN', 'cl_from = page_id' )
+ )
+ );
+
+ $dbr = wfGetDB( DB_SLAVE );
+ $minClTime = $this->getTimestampOffset( $rand );
+ if ( $minClTime ) {
+ $qi['conds'][] = 'cl_timestamp ' . $op . ' ' .
+ $dbr->addQuotes( $dbr->timestamp( $minClTime ) );
+ }
+ return $qi;
+ }
+
+ /**
+ * @param float $rand Random number between 0 and 1
+ *
+ * @return int|bool A random (unix) timestamp from the range of the category or false on failure
+ */
+ protected function getTimestampOffset( $rand ) {
+ if ( $rand === false ) {
+ return false;
+ }
+ if ( !$this->minTimestamp || !$this->maxTimestamp ) {
+ try {
+ list( $this->minTimestamp, $this->maxTimestamp ) = $this->getMinAndMaxForCat( $this->category );
+ } catch ( MWException $e ) {
+ // Possibly no entries in category.
+ return false;
+ }
+ }
+
+ $ts = ( $this->maxTimestamp - $this->minTimestamp ) * $rand + $this->minTimestamp;
+ return intval( $ts );
+ }
+
+ /**
+ * Get the lowest and highest timestamp for a category.
+ *
+ * @param Title $category
+ * @return Array The lowest and highest timestamp
+ * @throws MWException if category has no entries.
+ */
+ protected function getMinAndMaxForCat( Title $category ) {
+ $dbr = wfGetDB( DB_SLAVE );
+ $res = $dbr->selectRow(
+ 'categorylinks',
+ array(
+ 'low' => 'MIN( cl_timestamp )',
+ 'high' => 'MAX( cl_timestamp )'
+ ),
+ array(
+ 'cl_to' => $this->category->getDBKey(),
+ ),
+ __METHOD__,
+ array(
+ 'LIMIT' => 1
+ )
+ );
+ if ( !$res ) {
+ throw new MWException( 'No entries in category' );
+ }
+ return array( wfTimestamp( TS_UNIX, $res->low ), wfTimestamp( TS_UNIX, $res->high ) );
+ }
+
+ /**
+ * @param float $rand A random number that is converted to a random timestamp
+ * @param int $offset A small offset to make the result seem more "random"
+ * @param bool $up Get the result above the random value
+ * @param String $fname The name of the calling method
+ * @return Array Info for the title selected.
+ */
+ private function selectRandomPageFromDB( $rand, $offset, $up, $fname = __METHOD__ ) {
+ $dbr = wfGetDB( DB_SLAVE );
+
+ $query = $this->getQueryInfo( $rand, $offset, $up );
+ $res = $dbr->select(
+ $query['tables'],
+ $query['fields'],
+ $query['conds'],
+ $fname,
+ $query['options'],
+ $query['join_conds']
+ );
+
+ return $res->fetchObject();
+ }
+
+ protected function getGroupName() {
+ return 'redirects';
+ }
+}
diff --git a/includes/specials/SpecialRandompage.php b/includes/specials/SpecialRandompage.php
index b59f8349..c94d2b35 100644
--- a/includes/specials/SpecialRandompage.php
+++ b/includes/specials/SpecialRandompage.php
@@ -41,8 +41,8 @@ class RandomPage extends SpecialPage {
return $this->namespaces;
}
- public function setNamespace ( $ns ) {
- if( !$ns || $ns < NS_MAIN ) {
+ public function setNamespace( $ns ) {
+ if ( !$ns || $ns < NS_MAIN ) {
$ns = NS_MAIN;
}
$this->namespaces = array( $ns );
@@ -62,17 +62,19 @@ class RandomPage extends SpecialPage {
$title = $this->getRandomTitle();
- if( is_null( $title ) ) {
+ if ( is_null( $title ) ) {
$this->setHeaders();
+ // Message: randompage-nopages, randomredirect-nopages
$this->getOutput()->addWikiMsg( strtolower( $this->getName() ) . '-nopages',
$this->getNsList(), count( $this->namespaces ) );
+
return;
}
$redirectParam = $this->isRedirect() ? array( 'redirect' => 'no' ) : array();
$query = array_merge( $this->getRequest()->getValues(), $redirectParam );
unset( $query['title'] );
- $this->getOutput()->redirect( $title->getFullUrl( $query ) );
+ $this->getOutput()->redirect( $title->getFullURL( $query ) );
}
/**
@@ -83,13 +85,14 @@ class RandomPage extends SpecialPage {
private function getNsList() {
global $wgContLang;
$nsNames = array();
- foreach( $this->namespaces as $n ) {
- if( $n === NS_MAIN ) {
+ foreach ( $this->namespaces as $n ) {
+ if ( $n === NS_MAIN ) {
$nsNames[] = $this->msg( 'blanknamespace' )->plain();
} else {
$nsNames[] = $wgContLang->getNsText( $n );
}
}
+
return $wgContLang->commaList( $nsNames );
}
@@ -100,10 +103,14 @@ class RandomPage extends SpecialPage {
public function getRandomTitle() {
$randstr = wfRandom();
$title = null;
- if ( !wfRunHooks( 'SpecialRandomGetRandomTitle', array( &$randstr, &$this->isRedir, &$this->namespaces,
- &$this->extra, &$title ) ) ) {
+
+ if ( !wfRunHooks(
+ 'SpecialRandomGetRandomTitle',
+ array( &$randstr, &$this->isRedir, &$this->namespaces, &$this->extra, &$title )
+ ) ) {
return $title;
}
+
$row = $this->selectRandomPageFromDB( $randstr );
/* If we picked a value that was higher than any in
@@ -113,15 +120,15 @@ class RandomPage extends SpecialPage {
* any more bias than what the page_random scheme
* causes anyway. Trust me, I'm a mathematician. :)
*/
- if( !$row ) {
+ if ( !$row ) {
$row = $this->selectRandomPageFromDB( "0" );
}
- if( $row ) {
+ if ( $row ) {
return Title::makeTitleSafe( $row->page_namespace, $row->page_title );
- } else {
- return null;
}
+
+ return null;
}
protected function getQueryInfo( $randstr ) {
diff --git a/includes/specials/SpecialRandomredirect.php b/includes/specials/SpecialRandomredirect.php
index 51783a2f..7c36a28a 100644
--- a/includes/specials/SpecialRandomredirect.php
+++ b/includes/specials/SpecialRandomredirect.php
@@ -32,5 +32,4 @@ class SpecialRandomredirect extends RandomPage {
parent::__construct( 'Randomredirect' );
$this->isRedir = true;
}
-
}
diff --git a/includes/specials/SpecialRecentchanges.php b/includes/specials/SpecialRecentchanges.php
index 008678f7..a42a2171 100644
--- a/includes/specials/SpecialRecentchanges.php
+++ b/includes/specials/SpecialRecentchanges.php
@@ -41,16 +41,17 @@ class SpecialRecentChanges extends IncludableSpecialPage {
*/
public function getDefaultOptions() {
$opts = new FormOptions();
+ $user = $this->getUser();
- $opts->add( 'days', $this->getUser()->getIntOption( 'rcdays' ) );
- $opts->add( 'limit', $this->getUser()->getIntOption( 'rclimit' ) );
+ $opts->add( 'days', $user->getIntOption( 'rcdays' ) );
+ $opts->add( 'limit', $user->getIntOption( 'rclimit' ) );
$opts->add( 'from', '' );
- $opts->add( 'hideminor', $this->getUser()->getBoolOption( 'hideminor' ) );
- $opts->add( 'hidebots', true );
+ $opts->add( 'hideminor', $user->getBoolOption( 'hideminor' ) );
+ $opts->add( 'hidebots', true );
$opts->add( 'hideanons', false );
$opts->add( 'hideliu', false );
- $opts->add( 'hidepatrolled', $this->getUser()->getBoolOption( 'hidepatrolled' ) );
+ $opts->add( 'hidepatrolled', $user->getBoolOption( 'hidepatrolled' ) );
$opts->add( 'hidemyself', false );
$opts->add( 'namespace', '', FormOptions::INTNULL );
@@ -60,44 +61,47 @@ class SpecialRecentChanges extends IncludableSpecialPage {
$opts->add( 'categories', '' );
$opts->add( 'categories_any', false );
$opts->add( 'tagfilter', '' );
+
return $opts;
}
/**
* Create a FormOptions object with options as specified by the user
*
- * @param $parameters array
+ * @param array $parameters
*
* @return FormOptions
*/
public function setup( $parameters ) {
$opts = $this->getDefaultOptions();
- foreach( $this->getCustomFilters() as $key => $params ) {
+ foreach ( $this->getCustomFilters() as $key => $params ) {
$opts->add( $key, $params['default'] );
}
$opts->fetchValuesFromRequest( $this->getRequest() );
// Give precedence to subpage syntax
- if( $parameters !== null ) {
+ if ( $parameters !== null ) {
$this->parseParameters( $parameters, $opts );
}
$opts->validateIntBounds( 'limit', 0, 5000 );
+
return $opts;
}
/**
* Get custom show/hide filters
*
- * @return Array Map of filter URL param names to properties (msg/default)
+ * @return array Map of filter URL param names to properties (msg/default)
*/
protected function getCustomFilters() {
if ( $this->customFilters === null ) {
$this->customFilters = array();
wfRunHooks( 'SpecialRecentChangesFilters', array( $this, &$this->customFilters ) );
}
+
return $this->customFilters;
}
@@ -111,6 +115,7 @@ class SpecialRecentChanges extends IncludableSpecialPage {
$opts = $this->getDefaultOptions();
$opts->fetchValuesFromRequest( $this->getRequest() );
$opts->validateIntBounds( 'limit', 0, $wgFeedLimit );
+
return $opts;
}
@@ -126,13 +131,14 @@ class SpecialRecentChanges extends IncludableSpecialPage {
}
$this->rcOptions = $isFeed ? $this->feedSetup() : $this->setup( $this->rcSubpage );
}
+
return $this->rcOptions;
}
/**
* Main execution point
*
- * @param $subpage String
+ * @param string $subpage
*/
public function execute( $subpage ) {
$this->rcSubpage = $subpage;
@@ -142,36 +148,38 @@ class SpecialRecentChanges extends IncludableSpecialPage {
$this->getOutput()->setSquidMaxage( 10 );
# Check if the client has a cached version
$lastmod = $this->checkLastModified( $feedFormat );
- if( $lastmod === false ) {
+ if ( $lastmod === false ) {
return;
}
$opts = $this->getOptions();
$this->setHeaders();
$this->outputHeader();
- $this->addRecentChangesJS();
+ $this->addModules();
// Fetch results, prepare a batch link existence check query
$conds = $this->buildMainQueryConds( $opts );
$rows = $this->doMainQuery( $conds, $opts );
- if( $rows === false ) {
- if( !$this->including() ) {
+ if ( $rows === false ) {
+ if ( !$this->including() ) {
$this->doHeader( $opts );
}
+
return;
}
- if( !$feedFormat ) {
+ if ( !$feedFormat ) {
$batch = new LinkBatch;
- foreach( $rows as $row ) {
+ foreach ( $rows as $row ) {
$batch->add( NS_USER, $row->rc_user_text );
$batch->add( NS_USER_TALK, $row->rc_user_text );
$batch->add( $row->rc_namespace, $row->rc_title );
}
$batch->execute();
}
- if( $feedFormat ) {
+ if ( $feedFormat ) {
list( $changesFeed, $formatter ) = $this->getFeedObject( $feedFormat );
+ /** @var ChangesFeed $changesFeed */
$changesFeed->execute( $formatter, $rows, $lastmod, $opts );
} else {
$this->webOutput( $rows, $opts );
@@ -183,7 +191,8 @@ class SpecialRecentChanges extends IncludableSpecialPage {
/**
* Return an array with a ChangesFeed object and ChannelFeed object
*
- * @return Array
+ * @param string $feedFormat Feed's format (either 'rss' or 'atom')
+ * @return array
*/
public function getFeedObject( $feedFormat ) {
$changesFeed = new ChangesFeed( $feedFormat, 'rcfeed' );
@@ -192,6 +201,7 @@ class SpecialRecentChanges extends IncludableSpecialPage {
$this->msg( 'recentchanges-feed-description' )->inContentLanguage()->text(),
$this->getTitle()->getFullURL()
);
+
return array( $changesFeed, $formatter );
}
@@ -199,49 +209,49 @@ class SpecialRecentChanges extends IncludableSpecialPage {
* Process $par and put options found if $opts
* Mainly used when including the page
*
- * @param $par String
- * @param $opts FormOptions
+ * @param string $par
+ * @param FormOptions $opts
*/
public function parseParameters( $par, FormOptions $opts ) {
$bits = preg_split( '/\s*,\s*/', trim( $par ) );
- foreach( $bits as $bit ) {
- if( 'hidebots' === $bit ) {
+ foreach ( $bits as $bit ) {
+ if ( 'hidebots' === $bit ) {
$opts['hidebots'] = true;
}
- if( 'bots' === $bit ) {
+ if ( 'bots' === $bit ) {
$opts['hidebots'] = false;
}
- if( 'hideminor' === $bit ) {
+ if ( 'hideminor' === $bit ) {
$opts['hideminor'] = true;
}
- if( 'minor' === $bit ) {
+ if ( 'minor' === $bit ) {
$opts['hideminor'] = false;
}
- if( 'hideliu' === $bit ) {
+ if ( 'hideliu' === $bit ) {
$opts['hideliu'] = true;
}
- if( 'hidepatrolled' === $bit ) {
+ if ( 'hidepatrolled' === $bit ) {
$opts['hidepatrolled'] = true;
}
- if( 'hideanons' === $bit ) {
+ if ( 'hideanons' === $bit ) {
$opts['hideanons'] = true;
}
- if( 'hidemyself' === $bit ) {
+ if ( 'hidemyself' === $bit ) {
$opts['hidemyself'] = true;
}
- if( is_numeric( $bit ) ) {
+ if ( is_numeric( $bit ) ) {
$opts['limit'] = $bit;
}
$m = array();
- if( preg_match( '/^limit=(\d+)$/', $bit, $m ) ) {
+ if ( preg_match( '/^limit=(\d+)$/', $bit, $m ) ) {
$opts['limit'] = $m[1];
}
- if( preg_match( '/^days=(\d+)$/', $bit, $m ) ) {
+ if ( preg_match( '/^days=(\d+)$/', $bit, $m ) ) {
$opts['days'] = $m[1];
}
- if( preg_match( '/^namespace=(\d+)$/', $bit, $m ) ) {
+ if ( preg_match( '/^namespace=(\d+)$/', $bit, $m ) ) {
$opts['namespace'] = $m[1];
}
}
@@ -252,25 +262,26 @@ class SpecialRecentChanges extends IncludableSpecialPage {
* Don't use this if we are using the patrol feature, patrol changes don't
* update the timestamp
*
- * @param $feedFormat String
- * @return String or false
+ * @param string $feedFormat
+ * @return string|bool
*/
public function checkLastModified( $feedFormat ) {
$dbr = wfGetDB( DB_SLAVE );
$lastmod = $dbr->selectField( 'recentchanges', 'MAX(rc_timestamp)', false, __METHOD__ );
- if( $feedFormat || !$this->getUser()->useRCPatrol() ) {
- if( $lastmod && $this->getOutput()->checkLastModified( $lastmod ) ) {
+ if ( $feedFormat || !$this->getUser()->useRCPatrol() ) {
+ if ( $lastmod && $this->getOutput()->checkLastModified( $lastmod ) ) {
# Client cache fresh and headers sent, nothing more to do.
return false;
}
}
+
return $lastmod;
}
/**
* Return an array of conditions depending of options set in $opts
*
- * @param $opts FormOptions
+ * @param FormOptions $opts
* @return array
*/
public function buildMainQueryConds( FormOptions $opts ) {
@@ -280,9 +291,9 @@ class SpecialRecentChanges extends IncludableSpecialPage {
# It makes no sense to hide both anons and logged-in users
# Where this occurs, force anons to be shown
$forcebot = false;
- if( $opts['hideanons'] && $opts['hideliu'] ) {
+ if ( $opts['hideanons'] && $opts['hideliu'] ) {
# Check if the user wants to show bots only
- if( $opts['hidebots'] ) {
+ if ( $opts['hidebots'] ) {
$opts['hideanons'] = false;
} else {
$forcebot = true;
@@ -292,11 +303,11 @@ class SpecialRecentChanges extends IncludableSpecialPage {
// Calculate cutoff
$cutoff_unixtime = time() - ( $opts['days'] * 86400 );
- $cutoff_unixtime = $cutoff_unixtime - ($cutoff_unixtime % 86400);
+ $cutoff_unixtime = $cutoff_unixtime - ( $cutoff_unixtime % 86400 );
$cutoff = $dbr->timestamp( $cutoff_unixtime );
$fromValid = preg_match( '/^[0-9]{14}$/', $opts['from'] );
- if( $fromValid && $opts['from'] > wfTimestamp( TS_MW, $cutoff ) ) {
+ if ( $fromValid && $opts['from'] > wfTimestamp( TS_MW, $cutoff ) ) {
$cutoff = $dbr->timestamp( $opts['from'] );
} else {
$opts->reset( 'from' );
@@ -308,27 +319,27 @@ class SpecialRecentChanges extends IncludableSpecialPage {
$hideLoggedInUsers = $opts['hideliu'] && !$forcebot;
$hideAnonymousUsers = $opts['hideanons'] && !$forcebot;
- if( $opts['hideminor'] ) {
+ if ( $opts['hideminor'] ) {
$conds['rc_minor'] = 0;
}
- if( $opts['hidebots'] ) {
+ if ( $opts['hidebots'] ) {
$conds['rc_bot'] = 0;
}
- if( $hidePatrol ) {
+ if ( $hidePatrol ) {
$conds['rc_patrolled'] = 0;
}
- if( $forcebot ) {
+ if ( $forcebot ) {
$conds['rc_bot'] = 1;
}
- if( $hideLoggedInUsers ) {
+ if ( $hideLoggedInUsers ) {
$conds[] = 'rc_user = 0';
}
- if( $hideAnonymousUsers ) {
+ if ( $hideAnonymousUsers ) {
$conds[] = 'rc_user != 0';
}
- if( $opts['hidemyself'] ) {
- if( $this->getUser()->getId() ) {
+ if ( $opts['hidemyself'] ) {
+ if ( $this->getUser()->getId() ) {
$conds[] = 'rc_user != ' . $dbr->addQuotes( $this->getUser()->getId() );
} else {
$conds[] = 'rc_user_text != ' . $dbr->addQuotes( $this->getUser()->getName() );
@@ -336,13 +347,13 @@ class SpecialRecentChanges extends IncludableSpecialPage {
}
# Namespace filtering
- if( $opts['namespace'] !== '' ) {
+ if ( $opts['namespace'] !== '' ) {
$selectedNS = $dbr->addQuotes( $opts['namespace'] );
- $operator = $opts['invert'] ? '!=' : '=';
+ $operator = $opts['invert'] ? '!=' : '=';
$boolean = $opts['invert'] ? 'AND' : 'OR';
# namespace association (bug 2429)
- if( !$opts['associated'] ) {
+ if ( !$opts['associated'] ) {
$condition = "rc_namespace $operator $selectedNS";
} else {
# Also add the associated namespace
@@ -356,15 +367,16 @@ class SpecialRecentChanges extends IncludableSpecialPage {
$conds[] = $condition;
}
+
return $conds;
}
/**
* Process the query
*
- * @param $conds Array
- * @param $opts FormOptions
- * @return bool|ResultWrapper result or false (for Recentchangeslinked only)
+ * @param array $conds
+ * @param FormOptions $opts
+ * @return bool|ResultWrapper Result or false (for Recentchangeslinked only)
*/
public function doMainQuery( $conds, $opts ) {
$tables = array( 'recentchanges' );
@@ -382,7 +394,7 @@ class SpecialRecentChanges extends IncludableSpecialPage {
$fields = RecentChange::selectFields();
// JOIN on watchlist for users
- if ( $uid ) {
+ if ( $uid && $this->getUser()->isAllowed( 'viewmywatchlist' ) ) {
$tables[] = 'watchlist';
$fields[] = 'wl_user';
$fields[] = 'wl_notificationtimestamp';
@@ -390,7 +402,7 @@ class SpecialRecentChanges extends IncludableSpecialPage {
'wl_user' => $uid,
'wl_title=rc_title',
'wl_namespace=rc_namespace'
- ));
+ ) );
}
if ( $this->getUser()->isAllowed( 'rollback' ) ) {
$tables[] = 'page';
@@ -408,91 +420,40 @@ class SpecialRecentChanges extends IncludableSpecialPage {
);
if ( !wfRunHooks( 'SpecialRecentChangesQuery',
- array( &$conds, &$tables, &$join_conds, $opts, &$query_options, &$fields ) ) )
- {
+ array( &$conds, &$tables, &$join_conds, $opts, &$query_options, &$fields ) )
+ ) {
return false;
}
- // Don't use the new_namespace_time timestamp index if:
- // (a) "All namespaces" selected
- // (b) We want pages in more than one namespace (inverted/associated)
- // (c) There is a tag to filter on (use tag index instead)
- // (d) UNION + sort/limit is not an option for the DBMS
- if( $namespace === ''
- || ( $invert || $associated )
- || $opts['tagfilter'] != ''
- || !$dbr->unionSupportsOrderAndLimit() )
- {
- $res = $dbr->select( $tables, $fields, $conds, __METHOD__,
- array( 'ORDER BY' => 'rc_timestamp DESC', 'LIMIT' => $limit ) +
- $query_options,
- $join_conds );
- // We have a new_namespace_time index! UNION over new=(0,1) and sort result set!
- } else {
- // New pages
- $sqlNew = $dbr->selectSQLText(
- $tables,
- $fields,
- array( 'rc_new' => 1 ) + $conds,
- __METHOD__,
- array(
- 'ORDER BY' => 'rc_timestamp DESC',
- 'LIMIT' => $limit,
- 'USE INDEX' => array( 'recentchanges' => 'new_name_timestamp' )
- ),
- $join_conds
- );
- // Old pages
- $sqlOld = $dbr->selectSQLText(
- $tables,
- $fields,
- array( 'rc_new' => 0 ) + $conds,
- __METHOD__,
- array(
- 'ORDER BY' => 'rc_timestamp DESC',
- 'LIMIT' => $limit,
- 'USE INDEX' => array( 'recentchanges' => 'new_name_timestamp' )
- ),
- $join_conds
- );
- # Join the two fast queries, and sort the result set
- $sql = $dbr->unionQueries( array( $sqlNew, $sqlOld ), false ) .
- ' ORDER BY rc_timestamp DESC';
- $sql = $dbr->limitResult( $sql, $limit, false );
- $res = $dbr->query( $sql, __METHOD__ );
- }
-
- return $res;
+ // rc_new is not an ENUM, but adding a redundant rc_new IN (0,1) gives mysql enough
+ // knowledge to use an index merge if it wants (it may use some other index though).
+ return $dbr->select(
+ $tables,
+ $fields,
+ $conds + array( 'rc_new' => array( 0, 1 ) ),
+ __METHOD__,
+ array( 'ORDER BY' => 'rc_timestamp DESC', 'LIMIT' => $limit ) + $query_options,
+ $join_conds
+ );
}
/**
* Send output to the OutputPage object, only called if not used feeds
*
- * @param array $rows of database rows
- * @param $opts FormOptions
+ * @param array $rows Database rows
+ * @param FormOptions $opts
*/
public function webOutput( $rows, $opts ) {
global $wgRCShowWatchingUsers, $wgShowUpdatedMarker, $wgAllowCategorizedRecentChanges;
- $limit = $opts['limit'];
-
- if( !$this->including() ) {
- // Output options box
- $this->doHeader( $opts );
- }
-
- // And now for the content
- $feedQuery = $this->getFeedQuery();
- if ( $feedQuery !== '' ) {
- $this->getOutput()->setFeedAppendQuery( $feedQuery );
- } else {
- $this->getOutput()->setFeedAppendQuery( false );
- }
+ // Build the final data
- if( $wgAllowCategorizedRecentChanges ) {
+ if ( $wgAllowCategorizedRecentChanges ) {
$this->filterByCategories( $rows, $opts );
}
+ $limit = $opts['limit'];
+
$showWatcherCount = $wgRCShowWatchingUsers && $this->getUser()->getOption( 'shownumberswatching' );
$watcherCache = array();
@@ -501,23 +462,23 @@ class SpecialRecentChanges extends IncludableSpecialPage {
$counter = 1;
$list = ChangesList::newFromContext( $this->getContext() );
- $s = $list->beginRecentChangesList();
- foreach( $rows as $obj ) {
- if( $limit == 0 ) {
+ $rclistOutput = $list->beginRecentChangesList();
+ foreach ( $rows as $obj ) {
+ if ( $limit == 0 ) {
break;
}
$rc = RecentChange::newFromRow( $obj );
$rc->counter = $counter++;
# Check if the page has been updated since the last visit
- if( $wgShowUpdatedMarker && !empty( $obj->wl_notificationtimestamp ) ) {
+ if ( $wgShowUpdatedMarker && !empty( $obj->wl_notificationtimestamp ) ) {
$rc->notificationtimestamp = ( $obj->rc_timestamp >= $obj->wl_notificationtimestamp );
} else {
$rc->notificationtimestamp = false; // Default
}
# Check the number of users watching the page
$rc->numberofWatchingusers = 0; // Default
- if( $showWatcherCount && $obj->rc_namespace >= 0 ) {
- if( !isset( $watcherCache[$obj->rc_namespace][$obj->rc_title] ) ) {
+ if ( $showWatcherCount && $obj->rc_namespace >= 0 ) {
+ if ( !isset( $watcherCache[$obj->rc_namespace][$obj->rc_title] ) ) {
$watcherCache[$obj->rc_namespace][$obj->rc_title] =
$dbr->selectField(
'watchlist',
@@ -534,12 +495,34 @@ class SpecialRecentChanges extends IncludableSpecialPage {
$changeLine = $list->recentChangesLine( $rc, !empty( $obj->wl_user ), $counter );
if ( $changeLine !== false ) {
- $s .= $changeLine;
+ $rclistOutput .= $changeLine;
--$limit;
}
}
- $s .= $list->endRecentChangesList();
- $this->getOutput()->addHTML( $s );
+ $rclistOutput .= $list->endRecentChangesList();
+
+ // Print things out
+
+ if ( !$this->including() ) {
+ // Output options box
+ $this->doHeader( $opts );
+ }
+
+ // And now for the content
+ $feedQuery = $this->getFeedQuery();
+ if ( $feedQuery !== '' ) {
+ $this->getOutput()->setFeedAppendQuery( $feedQuery );
+ } else {
+ $this->getOutput()->setFeedAppendQuery( false );
+ }
+
+ if ( $rows->numRows() === 0 ) {
+ $this->getOutput()->wrapWikiMsg(
+ "<div class='mw-changeslist-empty'>\n$1\n</div>", 'recentchanges-noresult'
+ );
+ } else {
+ $this->getOutput()->addHTML( $rclistOutput );
+ }
}
/**
@@ -567,8 +550,8 @@ class SpecialRecentChanges extends IncludableSpecialPage {
/**
* Return the text to be displayed above the changes
*
- * @param $opts FormOptions
- * @return String: XHTML
+ * @param FormOptions $opts
+ * @return string XHTML
*/
public function doHeader( $opts ) {
global $wgScript;
@@ -577,10 +560,6 @@ class SpecialRecentChanges extends IncludableSpecialPage {
$defaults = $opts->getAllValues();
$nondefaults = $opts->getChangedValues();
- $opts->consumeValues( array(
- 'namespace', 'invert', 'associated', 'tagfilter',
- 'categories', 'categories_any'
- ) );
$panel = array();
$panel[] = $this->optionsPanel( $defaults, $nondefaults );
@@ -592,24 +571,36 @@ class SpecialRecentChanges extends IncludableSpecialPage {
$submit = ' ' . Xml::submitbutton( $this->msg( 'allpagessubmit' )->text() );
$out = Xml::openElement( 'table', array( 'class' => 'mw-recentchanges-table' ) );
- foreach( $extraOpts as $name => $optionRow ) {
+ foreach ( $extraOpts as $name => $optionRow ) {
# Add submit button to the last row only
++$count;
$addSubmit = ( $count === $extraOptsCount ) ? $submit : '';
$out .= Xml::openElement( 'tr' );
- if( is_array( $optionRow ) ) {
- $out .= Xml::tags( 'td', array( 'class' => 'mw-label mw-' . $name . '-label' ), $optionRow[0] );
- $out .= Xml::tags( 'td', array( 'class' => 'mw-input' ), $optionRow[1] . $addSubmit );
+ if ( is_array( $optionRow ) ) {
+ $out .= Xml::tags(
+ 'td',
+ array( 'class' => 'mw-label mw-' . $name . '-label' ),
+ $optionRow[0]
+ );
+ $out .= Xml::tags(
+ 'td',
+ array( 'class' => 'mw-input' ),
+ $optionRow[1] . $addSubmit
+ );
} else {
- $out .= Xml::tags( 'td', array( 'class' => 'mw-input', 'colspan' => 2 ), $optionRow . $addSubmit );
+ $out .= Xml::tags(
+ 'td',
+ array( 'class' => 'mw-input', 'colspan' => 2 ),
+ $optionRow . $addSubmit
+ );
}
$out .= Xml::closeElement( 'tr' );
}
$out .= Xml::closeElement( 'table' );
$unconsumed = $opts->getUnconsumedValues();
- foreach( $unconsumed as $key => $value ) {
+ foreach ( $unconsumed as $key => $value ) {
$out .= Html::hidden( $key, $value );
}
@@ -620,7 +611,11 @@ class SpecialRecentChanges extends IncludableSpecialPage {
$panelString = implode( "\n", $panel );
$this->getOutput()->addHTML(
- Xml::fieldset( $this->msg( 'recentchanges-legend' )->text(), $panelString, array( 'class' => 'rcoptions' ) )
+ Xml::fieldset(
+ $this->msg( 'recentchanges-legend' )->text(),
+ $panelString,
+ array( 'class' => 'rcoptions' )
+ )
);
$this->setBottomText( $opts );
@@ -629,15 +624,19 @@ class SpecialRecentChanges extends IncludableSpecialPage {
/**
* Get options to be displayed in a form
*
- * @param $opts FormOptions
- * @return Array
+ * @param FormOptions $opts
+ * @return array
*/
function getExtraOptions( $opts ) {
+ $opts->consumeValues( array(
+ 'namespace', 'invert', 'associated', 'tagfilter', 'categories', 'categories_any'
+ ) );
+
$extraOpts = array();
$extraOpts['namespace'] = $this->namespaceFilterForm( $opts );
global $wgAllowCategorizedRecentChanges;
- if( $wgAllowCategorizedRecentChanges ) {
+ if ( $wgAllowCategorizedRecentChanges ) {
$extraOpts['category'] = $this->categoryFilterForm( $opts );
}
@@ -646,14 +645,18 @@ class SpecialRecentChanges extends IncludableSpecialPage {
$extraOpts['tagfilter'] = $tagFilter;
}
- wfRunHooks( 'SpecialRecentChangesPanel', array( &$extraOpts, $opts ) );
+ // Don't fire the hook for subclasses. (Or should we?)
+ if ( $this->getName() === 'Recentchanges' ) {
+ wfRunHooks( 'SpecialRecentChangesPanel', array( &$extraOpts, $opts ) );
+ }
+
return $extraOpts;
}
/**
* Send the text to be displayed above the options
*
- * @param $opts FormOptions
+ * @param FormOptions $opts Unused
*/
function setTopText( FormOptions $opts ) {
global $wgContLang;
@@ -672,19 +675,19 @@ class SpecialRecentChanges extends IncludableSpecialPage {
}
/**
- * Send the text to be displayed after the options, for use in
- * Recentchangeslinked
+ * Send the text to be displayed after the options, for use in subclasses.
*
- * @param $opts FormOptions
+ * @param FormOptions $opts
*/
- function setBottomText( FormOptions $opts ) {}
+ function setBottomText( FormOptions $opts ) {
+ }
/**
* Creates the choose namespace selection
*
* @todo Uses radio buttons (HASHAR)
- * @param $opts FormOptions
- * @return String
+ * @param FormOptions $opts
+ * @return string
*/
protected function namespaceFilterForm( FormOptions $opts ) {
$nsSelect = Html::namespaceSelector(
@@ -702,14 +705,15 @@ class SpecialRecentChanges extends IncludableSpecialPage {
$opts['associated'],
array( 'title' => $this->msg( 'tooltip-namespace_association' )->text() )
);
+
return array( $nsLabel, "$nsSelect $invert $associated" );
}
/**
* Create a input to filter changes by categories
*
- * @param $opts FormOptions
- * @return Array
+ * @param FormOptions $opts
+ * @return array
*/
protected function categoryFilterForm( FormOptions $opts ) {
list( $label, $input ) = Xml::inputLabelSep( $this->msg( 'rc_categories' )->text(),
@@ -724,21 +728,21 @@ class SpecialRecentChanges extends IncludableSpecialPage {
/**
* Filter $rows by categories set in $opts
*
- * @param array $rows of database rows
- * @param $opts FormOptions
+ * @param array $rows Database rows
+ * @param FormOptions $opts
*/
function filterByCategories( &$rows, FormOptions $opts ) {
$categories = array_map( 'trim', explode( '|', $opts['categories'] ) );
- if( !count( $categories ) ) {
+ if ( !count( $categories ) ) {
return;
}
# Filter categories
$cats = array();
- foreach( $categories as $cat ) {
+ foreach ( $categories as $cat ) {
$cat = trim( $cat );
- if( $cat == '' ) {
+ if ( $cat == '' ) {
continue;
}
$cats[] = $cat;
@@ -748,16 +752,16 @@ class SpecialRecentChanges extends IncludableSpecialPage {
$articles = array();
$a2r = array();
$rowsarr = array();
- foreach( $rows as $k => $r ) {
+ foreach ( $rows as $k => $r ) {
$nt = Title::makeTitle( $r->rc_namespace, $r->rc_title );
$id = $nt->getArticleID();
- if( $id == 0 ) {
+ 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;
@@ -765,7 +769,7 @@ class SpecialRecentChanges extends IncludableSpecialPage {
}
# Shortcut?
- if( !count( $articles ) || !count( $cats ) ) {
+ if ( !count( $articles ) || !count( $cats ) ) {
return;
}
@@ -776,8 +780,8 @@ class SpecialRecentChanges extends IncludableSpecialPage {
# Filter
$newrows = array();
- foreach( $match as $id ) {
- foreach( $a2r[$id] as $rev ) {
+ foreach ( $match as $id ) {
+ foreach ( $a2r[$id] as $rev ) {
$k = $rev;
$newrows[$k] = $rowsarr[$k];
}
@@ -788,10 +792,10 @@ class SpecialRecentChanges extends IncludableSpecialPage {
/**
* Makes change an option link which carries all the other options
*
- * @param $title Title
- * @param array $override options to override
- * @param array $options current options
- * @param $active Boolean: whether to show the link in bold
+ * @param string $title Title
+ * @param array $override Options to override
+ * @param array $options Current options
+ * @param bool $active Whether to show the link in bold
* @return string
*/
function makeOptionsLink( $title, $override, $options, $active = false ) {
@@ -810,14 +814,15 @@ class SpecialRecentChanges extends IncludableSpecialPage {
if ( $active ) {
$text = '<strong>' . $text . '</strong>';
}
+
return Linker::linkKnown( $this->getTitle(), $text, array(), $params );
}
/**
* Creates the options panel.
*
- * @param $defaults Array
- * @param $nondefaults Array
+ * @param array $defaults
+ * @param array $nondefaults
* @return string
*/
function optionsPanel( $defaults, $nondefaults ) {
@@ -827,13 +832,13 @@ class SpecialRecentChanges extends IncludableSpecialPage {
$note = '';
$msg = $this->msg( 'rclegend' );
- if( !$msg->isDisabled() ) {
+ if ( !$msg->isDisabled() ) {
$note .= '<div class="mw-rclegend">' . $msg->parse() . "</div>\n";
}
$lang = $this->getLanguage();
$user = $this->getUser();
- if( $options['from'] ) {
+ if ( $options['from'] ) {
$note .= $this->msg( 'rcnotefrom' )->numParams( $options['limit'] )->params(
$lang->userTimeAndDate( $options['from'], $user ),
$lang->userDate( $options['from'], $user ),
@@ -841,22 +846,27 @@ class SpecialRecentChanges extends IncludableSpecialPage {
}
# Sort data for display and make sure it's unique after we've added user data.
- $wgRCLinkLimits[] = $options['limit'];
- $wgRCLinkDays[] = $options['days'];
- sort( $wgRCLinkLimits );
- sort( $wgRCLinkDays );
- $wgRCLinkLimits = array_unique( $wgRCLinkLimits );
- $wgRCLinkDays = array_unique( $wgRCLinkDays );
+ $linkLimits = $wgRCLinkLimits;
+ $linkLimits[] = $options['limit'];
+ sort( $linkLimits );
+ $linkLimits = array_unique( $linkLimits );
+
+ $linkDays = $wgRCLinkDays;
+ $linkDays[] = $options['days'];
+ sort( $linkDays );
+ $linkDays = array_unique( $linkDays );
// limit links
- foreach( $wgRCLinkLimits as $value ) {
+ $cl = array();
+ foreach ( $linkLimits as $value ) {
$cl[] = $this->makeOptionsLink( $lang->formatNum( $value ),
array( 'limit' => $value ), $nondefaults, $value == $options['limit'] );
}
$cl = $lang->pipeList( $cl );
// day links, reset 'from' to none
- foreach( $wgRCLinkDays as $value ) {
+ $dl = array();
+ foreach ( $linkDays as $value ) {
$dl[] = $this->makeOptionsLink( $lang->formatNum( $value ),
array( 'days' => $value, 'from' => '' ), $nondefaults, $value == $options['days'] );
}
@@ -865,12 +875,12 @@ class SpecialRecentChanges extends IncludableSpecialPage {
// show/hide links
$showhide = array( $this->msg( 'show' )->text(), $this->msg( 'hide' )->text() );
$filters = array(
- 'hideminor' => 'rcshowhideminor',
- 'hidebots' => 'rcshowhidebots',
- 'hideanons' => 'rcshowhideanons',
- 'hideliu' => 'rcshowhideliu',
+ 'hideminor' => 'rcshowhideminor',
+ 'hidebots' => 'rcshowhidebots',
+ 'hideanons' => 'rcshowhideanons',
+ 'hideliu' => 'rcshowhideliu',
'hidepatrolled' => 'rcshowhidepatr',
- 'hidemyself' => 'rcshowhidemine'
+ 'hidemyself' => 'rcshowhidemine'
);
foreach ( $this->getCustomFilters() as $key => $params ) {
$filters[$key] = $params['msg'];
@@ -883,7 +893,7 @@ class SpecialRecentChanges extends IncludableSpecialPage {
$links = array();
foreach ( $filters as $key => $msg ) {
$link = $this->makeOptionsLink( $showhide[1 - $options[$key]],
- array( $key => 1-$options[$key] ), $nondefaults );
+ array( $key => 1 - $options[$key] ), $nondefaults );
$links[] = $this->msg( $msg )->rawParams( $link )->escaped();
}
@@ -894,15 +904,17 @@ class SpecialRecentChanges extends IncludableSpecialPage {
$now, array( 'from' => $timestamp ), $nondefaults
);
- $rclinks = $this->msg( 'rclinks' )->rawParams( $cl, $dl, $lang->pipeList( $links ) )->parse();
+ $rclinks = $this->msg( 'rclinks' )->rawParams( $cl, $dl, $lang->pipeList( $links ) )
+ ->parse();
$rclistfrom = $this->msg( 'rclistfrom' )->rawParams( $tl )->parse();
+
return "{$note}$rclinks<br />$rclistfrom";
}
/**
- * add javascript specific to the [[Special:RecentChanges]] page
+ * Add page-specific modules.
*/
- function addRecentChangesJS() {
+ protected function addModules() {
$this->getOutput()->addModules( array(
'mediawiki.special.recentchanges',
) );
diff --git a/includes/specials/SpecialRecentchangeslinked.php b/includes/specials/SpecialRecentchangeslinked.php
index 391c4a7f..a8447046 100644
--- a/includes/specials/SpecialRecentchangeslinked.php
+++ b/includes/specials/SpecialRecentchangeslinked.php
@@ -56,7 +56,7 @@ class SpecialRecentchangeslinked extends SpecialRecentChanges {
$this->msg( 'recentchangeslinked-title', $this->getTargetTitle()->getPrefixedText() )
->inContentLanguage()->text(),
$this->msg( 'recentchangeslinked-feed' )->inContentLanguage()->text(),
- $this->getTitle()->getFullUrl()
+ $this->getTitle()->getFullURL()
);
return array( $feed, $feedObj );
}
@@ -71,8 +71,8 @@ class SpecialRecentchangeslinked extends SpecialRecentChanges {
}
$outputPage = $this->getOutput();
$title = Title::newFromURL( $target );
- if( !$title || $title->getInterwiki() != '' ) {
- $outputPage->wrapWikiMsg( "<div class=\"errorbox\">\n$1\n</div><br style=\"clear: both\" />", 'allpagesbadtitle' );
+ if ( !$title || $title->getInterwiki() != '' ) {
+ $outputPage->wrapWikiMsg( "<div class=\"errorbox\">\n$1\n</div>", 'allpagesbadtitle' );
return false;
}
@@ -99,7 +99,7 @@ class SpecialRecentchangeslinked extends SpecialRecentChanges {
// left join with watchlist table to highlight watched rows
$uid = $this->getUser()->getId();
- if( $uid ) {
+ if ( $uid && $this->getUser()->isAllowed( 'viewmywatchlist' ) ) {
$tables[] = 'watchlist';
$select[] = 'wl_user';
$join_conds['watchlist'] = array( 'LEFT JOIN', array(
@@ -126,7 +126,7 @@ class SpecialRecentchangeslinked extends SpecialRecentChanges {
return false;
}
- if( $ns == NS_CATEGORY && !$showlinkedto ) {
+ if ( $ns == NS_CATEGORY && !$showlinkedto ) {
// special handling for categories
// XXX: should try to make this less kludgy
$link_tables = array( 'categorylinks' );
@@ -135,12 +135,12 @@ class SpecialRecentchangeslinked extends SpecialRecentChanges {
// for now, always join on these tables; really should be configurable as in whatlinkshere
$link_tables = array( 'pagelinks', 'templatelinks' );
// imagelinks only contains links to pages in NS_FILE
- if( $ns == NS_FILE || !$showlinkedto ) {
+ if ( $ns == NS_FILE || !$showlinkedto ) {
$link_tables[] = 'imagelinks';
}
}
- if( $id == 0 && !$showlinkedto ) {
+ if ( $id == 0 && !$showlinkedto ) {
return false; // nonexistent pages can't link to any pages
}
@@ -149,22 +149,22 @@ class SpecialRecentchangeslinked extends SpecialRecentChanges {
$subsql = array(); // SELECT statements to combine with UNION
- foreach( $link_tables as $link_table ) {
+ foreach ( $link_tables as $link_table ) {
$pfx = $prefix[$link_table];
// imagelinks and categorylinks tables have no xx_namespace field, and have xx_to instead of xx_title
- if( $link_table == 'imagelinks' ) {
+ if ( $link_table == 'imagelinks' ) {
$link_ns = NS_FILE;
- } elseif( $link_table == 'categorylinks' ) {
+ } elseif ( $link_table == 'categorylinks' ) {
$link_ns = NS_CATEGORY;
} else {
$link_ns = 0;
}
- if( $showlinkedto ) {
+ if ( $showlinkedto ) {
// find changes to pages linking to this page
- if( $link_ns ) {
- if( $ns != $link_ns ) {
+ if ( $link_ns ) {
+ if ( $ns != $link_ns ) {
continue;
} // should never happen, but check anyway
$subconds = array( "{$pfx}_to" => $dbkey );
@@ -175,7 +175,7 @@ class SpecialRecentchangeslinked extends SpecialRecentChanges {
} else {
// find changes to pages linked from this page
$subconds = array( "{$pfx}_from" => $id );
- if( $link_table == 'imagelinks' || $link_table == 'categorylinks' ) {
+ if ( $link_table == 'imagelinks' || $link_table == 'categorylinks' ) {
$subconds["rc_namespace"] = $link_ns;
$subjoin = "rc_title = {$pfx}_to";
} else {
@@ -183,7 +183,7 @@ class SpecialRecentchangeslinked extends SpecialRecentChanges {
}
}
- if( $dbr->unionSupportsOrderAndLimit()) {
+ if ( $dbr->unionSupportsOrderAndLimit() ) {
$order = array( 'ORDER BY' => 'rc_timestamp DESC' );
} else {
$order = array();
@@ -198,16 +198,17 @@ class SpecialRecentchangeslinked extends SpecialRecentChanges {
$join_conds + array( $link_table => array( 'INNER JOIN', $subjoin ) )
);
- if( $dbr->unionSupportsOrderAndLimit())
+ if ( $dbr->unionSupportsOrderAndLimit() ) {
$query = $dbr->limitResult( $query, $limit );
+ }
$subsql[] = $query;
}
- if( count( $subsql ) == 0 ) {
+ if ( count( $subsql ) == 0 ) {
return false; // should never happen
}
- if( count( $subsql ) == 1 && $dbr->unionSupportsOrderAndLimit() ) {
+ if ( count( $subsql ) == 1 && $dbr->unionSupportsOrderAndLimit() ) {
$sql = $subsql[0];
} else {
// need to resort and relimit after union
@@ -217,7 +218,7 @@ class SpecialRecentchangeslinked extends SpecialRecentChanges {
$res = $dbr->query( $sql, __METHOD__ );
- if( $res->numRows() == 0 ) {
+ if ( $res->numRows() == 0 ) {
$this->mResultEmpty = true;
}
@@ -225,21 +226,21 @@ class SpecialRecentchangeslinked extends SpecialRecentChanges {
}
/**
- * @param $opts FormOptions
+ * Get options to be displayed in a form
+ *
+ * @param FormOptions $opts
* @return array
*/
function getExtraOptions( $opts ) {
- $opts->consumeValues( array( 'showlinkedto', 'target', 'tagfilter' ) );
- $extraOpts = array();
- $extraOpts['namespace'] = $this->namespaceFilterForm( $opts );
+ $extraOpts = parent::getExtraOptions( $opts );
+
+ $opts->consumeValues( array( 'showlinkedto', 'target' ) );
+
$extraOpts['target'] = array( $this->msg( 'recentchangeslinked-page' )->escaped(),
Xml::input( 'target', 40, str_replace( '_', ' ', $opts['target'] ) ) .
Xml::check( 'showlinkedto', $opts['showlinkedto'], array( 'id' => 'showlinkedto' ) ) . ' ' .
Xml::label( $this->msg( 'recentchangeslinked-to' )->text(), 'showlinkedto' ) );
- $tagFilter = ChangeTags::buildTagFilterSelector( $opts['tagfilter'] );
- if ( $tagFilter ) {
- $extraOpts['tagfilter'] = $tagFilter;
- }
+
return $extraOpts;
}
@@ -260,14 +261,8 @@ class SpecialRecentchangeslinked extends SpecialRecentChanges {
function setTopText( FormOptions $opts ) {
$target = $this->getTargetTitle();
- if( $target ) {
+ if ( $target ) {
$this->getOutput()->addBacklinkSubtitle( $target );
}
}
-
- function setBottomText( FormOptions $opts ) {
- if( isset( $this->mResultEmpty ) && $this->mResultEmpty ) {
- $this->getOutput()->addWikiMsg( 'recentchangeslinked-noresult' );
- }
- }
}
diff --git a/includes/specials/SpecialRedirect.php b/includes/specials/SpecialRedirect.php
new file mode 100644
index 00000000..f05dacbc
--- /dev/null
+++ b/includes/specials/SpecialRedirect.php
@@ -0,0 +1,235 @@
+<?php
+/**
+ * Implements Special:Redirect
+ *
+ * @section 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 SpecialPage
+ */
+
+/**
+ * A special page that redirects to: the user for a numeric user id,
+ * the file for a given filename, or the page for a given revision id.
+ *
+ * @ingroup SpecialPage
+ * @since 1.22
+ */
+class SpecialRedirect extends FormSpecialPage {
+
+ /**
+ * The type of the redirect (user/file/revision)
+ *
+ * @var string $mType
+ * @example 'user'
+ */
+ protected $mType;
+
+ /**
+ * The identifier/value for the redirect (which id, which file)
+ *
+ * @var string $mValue
+ * @example '42'
+ */
+ protected $mValue;
+
+ function __construct() {
+ parent::__construct( 'Redirect' );
+ $this->mType = null;
+ $this->mValue = null;
+ }
+
+ /**
+ * Set $mType and $mValue based on parsed value of $subpage.
+ */
+ function setParameter( $subpage ) {
+ // parse $subpage to pull out the parts
+ $parts = explode( '/', $subpage, 2 );
+ $this->mType = count( $parts ) > 0 ? $parts[0] : null;
+ $this->mValue = count( $parts ) > 1 ? $parts[1] : null;
+ }
+
+ /**
+ * Handle Special:Redirect/user/xxxx (by redirecting to User:YYYY)
+ *
+ * @return string|null url to redirect to, or null if $mValue is invalid.
+ */
+ function dispatchUser() {
+ if ( !ctype_digit( $this->mValue ) ) {
+ return null;
+ }
+ $user = User::newFromId( (int)$this->mValue );
+ $username = $user->getName(); // load User as side-effect
+ if ( $user->isAnon() ) {
+ return null;
+ }
+ $userpage = Title::makeTitle( NS_USER, $username );
+ return $userpage->getFullURL( '', false, PROTO_CURRENT );
+ }
+
+ /**
+ * Handle Special:Redirect/file/xxxx
+ *
+ * @return string|null url to redirect to, or null if $mValue is not found.
+ */
+ function dispatchFile() {
+ $title = Title::makeTitleSafe( NS_FILE, $this->mValue );
+
+ if ( ! $title instanceof Title ) {
+ return null;
+ }
+ $file = wfFindFile( $title );
+
+ if ( !$file || !$file->exists() ) {
+ return null;
+ }
+ // Default behavior: Use the direct link to the file.
+ $url = $file->getURL();
+ $request = $this->getRequest();
+ $width = $request->getInt( 'width', -1 );
+ $height = $request->getInt( 'height', -1 );
+
+ // If a width is requested...
+ if ( $width != -1 ) {
+ $mto = $file->transform( array( 'width' => $width, 'height' => $height ) );
+ // ... and we can
+ if ( $mto && !$mto->isError() ) {
+ // ... change the URL to point to a thumbnail.
+ $url = $mto->getURL();
+ }
+ }
+ return $url;
+ }
+
+ /**
+ * Handle Special:Redirect/revision/xxx
+ * (by redirecting to index.php?oldid=xxx)
+ *
+ * @return string|null url to redirect to, or null if $mValue is invalid.
+ */
+ function dispatchRevision() {
+ $oldid = $this->mValue;
+ if ( !ctype_digit( $oldid ) ) {
+ return null;
+ }
+ $oldid = (int)$oldid;
+ if ( $oldid === 0 ) {
+ return null;
+ }
+ return wfAppendQuery( wfScript( 'index' ), array(
+ 'oldid' => $oldid
+ ) );
+ }
+
+ /**
+ * Use appropriate dispatch* method to obtain a redirection URL,
+ * and either: redirect, set a 404 error code and error message,
+ * or do nothing (if $mValue wasn't set) allowing the form to be
+ * displayed.
+ *
+ * @return bool true if a redirect was successfully handled.
+ */
+ function dispatch() {
+ // the various namespaces supported by Special:Redirect
+ switch ( $this->mType ) {
+ case 'user':
+ $url = $this->dispatchUser();
+ break;
+ case 'file':
+ $url = $this->dispatchFile();
+ break;
+ case 'revision':
+ $url = $this->dispatchRevision();
+ break;
+ default:
+ $this->getOutput()->setStatusCode( 404 );
+ $url = null;
+ break;
+ }
+ if ( $url ) {
+ $this->getOutput()->redirect( $url );
+ return true;
+ }
+ if ( !is_null( $this->mValue ) ) {
+ $this->getOutput()->setStatusCode( 404 );
+ // Message: redirect-not-exists
+ $msg = $this->getMessagePrefix() . '-not-exists';
+ return Status::newFatal( $msg );
+ }
+ return false;
+ }
+
+ protected function getFormFields() {
+ $mp = $this->getMessagePrefix();
+ $ns = array(
+ // subpage => message
+ // Messages: redirect-user, redirect-revision, redirect-file
+ 'user' => $mp . '-user',
+ 'revision' => $mp . '-revision',
+ 'file' => $mp . '-file',
+ );
+ $a = array();
+ $a['type'] = array(
+ 'type' => 'select',
+ 'label-message' => $mp . '-lookup', // Message: redirect-lookup
+ 'options' => array(),
+ 'default' => current( array_keys( $ns ) ),
+ );
+ foreach ( $ns as $n => $m ) {
+ $m = $this->msg( $m )->text();
+ $a['type']['options'][$m] = $n;
+ }
+ $a['value'] = array(
+ 'type' => 'text',
+ 'label-message' => $mp . '-value' // Message: redirect-value
+ );
+ // set the defaults according to the parsed subpage path
+ if ( !empty( $this->mType ) ) {
+ $a['type']['default'] = $this->mType;
+ }
+ if ( !empty( $this->mValue ) ) {
+ $a['value']['default'] = $this->mValue;
+ }
+ return $a;
+ }
+
+ public function onSubmit( array $data ) {
+ if ( !empty( $data['type'] ) && !empty( $data['value'] ) ) {
+ $this->setParameter( $data['type'] . '/' . $data['value'] );
+ }
+ /* if this returns false, will show the form */
+ return $this->dispatch();
+ }
+
+ public function onSuccess() {
+ /* do nothing, we redirect in $this->dispatch if successful. */
+ }
+
+ protected function alterForm( HTMLForm $form ) {
+ /* display summary at top of page */
+ $this->outputHeader();
+ // tweak label on submit button
+ // Message: redirect-submit
+ $form->setSubmitTextMsg( $this->getMessagePrefix() . '-submit' );
+ /* submit form every time */
+ $form->setMethod( 'get' );
+ }
+
+ protected function getGroupName() {
+ return 'redirects';
+ }
+}
diff --git a/includes/specials/SpecialResetTokens.php b/includes/specials/SpecialResetTokens.php
new file mode 100644
index 00000000..ef2a45da
--- /dev/null
+++ b/includes/specials/SpecialResetTokens.php
@@ -0,0 +1,145 @@
+<?php
+/**
+ * Implements Special:ResetTokens
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with this program; if not, write 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 reset tokens like the watchlist token.
+ *
+ * @ingroup SpecialPage
+ */
+class SpecialResetTokens extends FormSpecialPage {
+ private $tokensList;
+
+ public function __construct() {
+ parent::__construct( 'ResetTokens' );
+ }
+
+ /**
+ * Returns the token information list for this page after running
+ * the hook and filtering out disabled preferences.
+ *
+ * @return array
+ */
+ protected function getTokensList() {
+ global $wgHiddenPrefs;
+
+ if ( !isset( $this->tokensList ) ) {
+ $tokens = array(
+ array( 'preference' => 'watchlisttoken', 'label-message' => 'resettokens-watchlist-token' ),
+ );
+ wfRunHooks( 'SpecialResetTokensTokens', array( &$tokens ) );
+
+ $tokens = array_filter( $tokens, function ( $tok ) use ( $wgHiddenPrefs ) {
+ return !in_array( $tok['preference'], $wgHiddenPrefs );
+ } );
+
+ $this->tokensList = $tokens;
+ }
+
+ return $this->tokensList;
+ }
+
+ public function execute( $par ) {
+ // This is a preferences page, so no user JS for y'all.
+ $this->getOutput()->disallowUserJs();
+
+ parent::execute( $par );
+
+ $this->getOutput()->addReturnTo( SpecialPage::getTitleFor( 'Preferences' ) );
+ }
+
+ public function onSuccess() {
+ $this->getOutput()->wrapWikiMsg(
+ "<div class='successbox'>\n$1\n</div>",
+ 'resettokens-done'
+ );
+ }
+
+ /**
+ * Display appropriate message if there's nothing to do.
+ * The submit button is also suppressed in this case (see alterForm()).
+ */
+ protected function getFormFields() {
+ $user = $this->getUser();
+ $tokens = $this->getTokensList();
+
+ if ( $tokens ) {
+ $tokensForForm = array();
+ foreach ( $tokens as $tok ) {
+ $label = $this->msg( 'resettokens-token-label' )
+ ->rawParams( $this->msg( $tok['label-message'] )->parse() )
+ ->params( $user->getTokenFromOption( $tok['preference'] ) )
+ ->escaped();
+ $tokensForForm[ $label ] = $tok['preference'];
+ }
+
+ $desc = array(
+ 'label-message' => 'resettokens-tokens',
+ 'type' => 'multiselect',
+ 'options' => $tokensForForm,
+ );
+ } else {
+ $desc = array(
+ 'label-message' => 'resettokens-no-tokens',
+ 'type' => 'info',
+ );
+ }
+
+ return array(
+ 'tokens' => $desc,
+ );
+ }
+
+ /**
+ * Suppress the submit button if there's nothing to do;
+ * provide additional message on it otherwise.
+ */
+ protected function alterForm( HTMLForm $form ) {
+ if ( $this->getTokensList() ) {
+ $form->setSubmitTextMsg( 'resettokens-resetbutton' );
+ } else {
+ $form->suppressDefaultSubmit();
+ }
+ }
+
+ public function onSubmit( array $formData ) {
+ if ( $formData['tokens'] ) {
+ $user = $this->getUser();
+ foreach ( $formData['tokens'] as $tokenPref ) {
+ $user->resetTokenFromOption( $tokenPref );
+ }
+ $user->saveSettings();
+
+ return true;
+ }
+
+ return false;
+ }
+
+ protected function getGroupName() {
+ return 'users';
+ }
+
+ public function isListed() {
+ return (bool)$this->getTokensList();
+ }
+}
diff --git a/includes/specials/SpecialRevisiondelete.php b/includes/specials/SpecialRevisiondelete.php
index 5a5f8ffb..825be6c4 100644
--- a/includes/specials/SpecialRevisiondelete.php
+++ b/includes/specials/SpecialRevisiondelete.php
@@ -49,68 +49,43 @@ class SpecialRevisionDelete extends UnlistedSpecialPage {
/** Array of checkbox specs (message, name, deletion bits) */
var $checks;
- /** Information about the current type */
- var $typeInfo;
+ /** UI Labels about the current type */
+ var $typeLabels;
/** The RevDel_List object, storing the list of items to be deleted/undeleted */
var $list;
/**
- * Assorted information about each type, needed by the special page.
- * TODO Move some of this to the list class
+ * UI labels for each type.
*/
- static $allowedTypes = array(
+ static $UILabels = array(
'revision' => array(
'check-label' => 'revdelete-hide-text',
- 'deletion-bits' => Revision::DELETED_TEXT,
'success' => 'revdelete-success',
'failure' => 'revdelete-failure',
- 'list-class' => 'RevDel_RevisionList',
- 'permission' => 'deleterevision',
),
'archive' => array(
'check-label' => 'revdelete-hide-text',
- 'deletion-bits' => Revision::DELETED_TEXT,
'success' => 'revdelete-success',
'failure' => 'revdelete-failure',
- 'list-class' => 'RevDel_ArchiveList',
- 'permission' => 'deleterevision',
),
- 'oldimage'=> array(
+ 'oldimage' => array(
'check-label' => 'revdelete-hide-image',
- 'deletion-bits' => File::DELETED_FILE,
'success' => 'revdelete-success',
'failure' => 'revdelete-failure',
- 'list-class' => 'RevDel_FileList',
- 'permission' => 'deleterevision',
),
'filearchive' => array(
'check-label' => 'revdelete-hide-image',
- 'deletion-bits' => File::DELETED_FILE,
'success' => 'revdelete-success',
'failure' => 'revdelete-failure',
- 'list-class' => 'RevDel_ArchivedFileList',
- 'permission' => 'deleterevision',
),
'logging' => array(
'check-label' => 'revdelete-hide-name',
- 'deletion-bits' => LogPage::DELETED_ACTION,
'success' => 'logdelete-success',
'failure' => 'logdelete-failure',
- 'list-class' => 'RevDel_LogList',
- 'permission' => 'deletelogentry',
),
);
- /** Type map to support old log entries */
- static $deprecatedTypeMap = array(
- 'oldid' => 'revision',
- 'artimestamp' => 'archive',
- 'oldimage' => 'oldimage',
- 'fileid' => 'filearchive',
- 'logid' => 'logging',
- );
-
public function __construct() {
parent::__construct( 'Revisiondelete', 'deletedhistory' );
}
@@ -147,19 +122,6 @@ class SpecialRevisionDelete extends UnlistedSpecialPage {
} else {
$this->typeName = $request->getVal( 'type' );
$this->targetObj = Title::newFromText( $request->getText( 'target' ) );
- if ( $this->targetObj && $this->targetObj->isSpecial( 'Log' ) && count( $this->ids ) !== 0 ) {
- $result = wfGetDB( DB_SLAVE )->select( 'logging',
- 'log_type',
- array( 'log_id' => $this->ids ),
- __METHOD__,
- array( 'DISTINCT' )
- );
-
- if ( $result->numRows() == 1 ) {
- // If there's only one type, the target can be set to include it.
- $this->targetObj = SpecialPage::getTitleFor( 'Log', $result->current()->log_type );
- }
- }
}
# For reviewing deleted files...
@@ -170,28 +132,21 @@ class SpecialRevisionDelete extends UnlistedSpecialPage {
return;
}
- if ( isset( self::$deprecatedTypeMap[$this->typeName] ) ) {
- $this->typeName = self::$deprecatedTypeMap[$this->typeName];
- }
+ $this->typeName = RevisionDeleter::getCanonicalTypeName( $this->typeName );
# No targets?
- if( !isset( self::$allowedTypes[$this->typeName] ) || count( $this->ids ) == 0 ) {
+ if ( !$this->typeName || count( $this->ids ) == 0 ) {
throw new ErrorPageError( 'revdelete-nooldid-title', 'revdelete-nooldid-text' );
}
- $this->typeInfo = self::$allowedTypes[$this->typeName];
- $this->mIsAllowed = $user->isAllowed( $this->typeInfo['permission'] );
-
- # If we have revisions, get the title from the first one
- # since they should all be from the same page. This allows
- # for more flexibility with page moves...
- if( $this->typeName == 'revision' ) {
- $rev = Revision::newFromId( $this->ids[0] );
- $this->targetObj = $rev ? $rev->getTitle() : $this->targetObj;
- }
+ $this->typeLabels = self::$UILabels[$this->typeName];
+ $this->mIsAllowed = $user->isAllowed( RevisionDeleter::getRestriction( $this->typeName ) );
+
+ # Allow the list type to adjust the passed target
+ $this->targetObj = RevisionDeleter::suggestTarget( $this->typeName, $this->targetObj, $this->ids );
$this->otherReason = $request->getVal( 'wpReason' );
# We need a target page!
- if( is_null( $this->targetObj ) ) {
+ if ( is_null( $this->targetObj ) ) {
$output->addWikiMsg( 'undelete-header' );
return;
}
@@ -200,17 +155,19 @@ class SpecialRevisionDelete extends UnlistedSpecialPage {
# Initialise checkboxes
$this->checks = array(
- array( $this->typeInfo['check-label'], 'wpHidePrimary', $this->typeInfo['deletion-bits'] ),
+ array( $this->typeLabels['check-label'], 'wpHidePrimary',
+ RevisionDeleter::getRevdelConstant( $this->typeName )
+ ),
array( 'revdelete-hide-comment', 'wpHideComment', Revision::DELETED_COMMENT ),
array( 'revdelete-hide-user', 'wpHideUser', Revision::DELETED_USER )
);
- if( $user->isAllowed( 'suppressrevision' ) ) {
+ if ( $user->isAllowed( 'suppressrevision' ) ) {
$this->checks[] = array( 'revdelete-hide-restricted',
'wpHideRestricted', Revision::DELETED_RESTRICTED );
}
# Either submit or create our form
- if( $this->mIsAllowed && $this->submitClicked ) {
+ if ( $this->mIsAllowed && $this->submitClicked ) {
$this->submit( $request );
} else {
$this->showForm();
@@ -223,7 +180,7 @@ class SpecialRevisionDelete extends UnlistedSpecialPage {
LogEventsList::showLogExtract( $output, 'delete',
$this->targetObj, '', array( 'lim' => 25, 'conds' => $qc ) );
# Show relevant lines from the suppression log
- if( $user->isAllowed( 'suppressionlog' ) ) {
+ if ( $user->isAllowed( 'suppressionlog' ) ) {
$suppressLogPage = new LogPage( 'suppress' );
$output->addHTML( "<h2>" . $suppressLogPage->getName()->escaped() . "</h2>\n" );
LogEventsList::showLogExtract( $output, 'suppress',
@@ -236,7 +193,7 @@ class SpecialRevisionDelete extends UnlistedSpecialPage {
*/
protected function showConvenienceLinks() {
# Give a link to the logs/hist for this page
- if( $this->targetObj ) {
+ if ( $this->targetObj ) {
$links = array();
$links[] = Linker::linkKnown(
SpecialPage::getTitleFor( 'Log' ),
@@ -253,7 +210,7 @@ class SpecialRevisionDelete extends UnlistedSpecialPage {
array( 'action' => 'history' )
);
# Link to deleted edits
- if( $this->getUser()->isAllowed( 'undelete' ) ) {
+ if ( $this->getUser()->isAllowed( 'undelete' ) ) {
$undelete = SpecialPage::getTitleFor( 'Undelete' );
$links[] = Linker::linkKnown(
$undelete,
@@ -296,8 +253,8 @@ class SpecialRevisionDelete extends UnlistedSpecialPage {
return;
}
$user = $this->getUser();
- if( !$oimage->userCan( File::DELETED_FILE, $user ) ) {
- if( $oimage->isDeleted( File::DELETED_RESTRICTED ) ) {
+ if ( !$oimage->userCan( File::DELETED_FILE, $user ) ) {
+ if ( $oimage->isDeleted( File::DELETED_RESTRICTED ) ) {
throw new PermissionsError( 'suppressrevision' );
} else {
throw new PermissionsError( 'deletedtext' );
@@ -312,10 +269,11 @@ class SpecialRevisionDelete extends UnlistedSpecialPage {
$this->getOutput()->addHTML(
Xml::openElement( 'form', array(
'method' => 'POST',
- 'action' => $this->getTitle()->getLocalUrl(
- 'target=' . urlencode( $this->targetObj->getPrefixedDBkey() ) .
- '&file=' . urlencode( $archiveName ) .
- '&token=' . urlencode( $user->getEditToken( $archiveName ) ) )
+ 'action' => $this->getTitle()->getLocalURL( array(
+ 'target' => $this->targetObj->getPrefixedDBkey(),
+ 'file' => $archiveName,
+ 'token' => $user->getEditToken( $archiveName ),
+ ) )
)
) .
Xml::submitButton( $this->msg( 'revdelete-show-file-submit' )->text() ) .
@@ -342,8 +300,9 @@ class SpecialRevisionDelete extends UnlistedSpecialPage {
*/
protected function getList() {
if ( is_null( $this->list ) ) {
- $class = $this->typeInfo['list-class'];
- $this->list = new $class( $this->getContext(), $this->targetObj, $this->ids );
+ $this->list = RevisionDeleter::createList(
+ $this->typeName, $this->getContext(), $this->targetObj, $this->ids
+ );
}
return $this->list;
}
@@ -370,7 +329,7 @@ class SpecialRevisionDelete extends UnlistedSpecialPage {
for ( $list->reset(); $list->current(); $list->next() ) {
$item = $list->current();
if ( !$item->canView() ) {
- if( !$this->submitClicked ) {
+ if ( !$this->submitClicked ) {
throw new PermissionsError( 'suppressrevision' );
}
$UserAllowed = false;
@@ -379,7 +338,7 @@ class SpecialRevisionDelete extends UnlistedSpecialPage {
$this->getOutput()->addHTML( $item->getHTML() );
}
- if( !$numRevisions ) {
+ if ( !$numRevisions ) {
throw new ErrorPageError( 'revdelete-nooldid-title', 'revdelete-nooldid-text' );
}
@@ -388,12 +347,14 @@ class SpecialRevisionDelete extends UnlistedSpecialPage {
$this->addUsageText();
// Normal sysops can always see what they did, but can't always change it
- if( !$UserAllowed ) return;
+ if ( !$UserAllowed ) {
+ return;
+ }
// Show form if the user can submit
- if( $this->mIsAllowed ) {
+ if ( $this->mIsAllowed ) {
$out = Xml::openElement( 'form', array( 'method' => 'post',
- 'action' => $this->getTitle()->getLocalUrl( array( 'action' => 'submit' ) ),
+ 'action' => $this->getTitle()->getLocalURL( array( 'action' => 'submit' ) ),
'id' => 'mw-revdel-form-revisions' ) ) .
Xml::fieldset( $this->msg( 'revdelete-legend' )->text() ) .
$this->buildCheckBoxes() .
@@ -406,7 +367,7 @@ class SpecialRevisionDelete extends UnlistedSpecialPage {
Xml::listDropDown( 'wpRevDeleteReasonList',
$this->msg( 'revdelete-reason-dropdown' )->inContentLanguage()->text(),
$this->msg( 'revdelete-reasonotherlist' )->inContentLanguage()->text(),
- '', 'wpReasonDropDown', 1
+ $this->getRequest()->getText( 'wpRevDeleteReasonList', 'other' ), 'wpReasonDropDown', 1
) .
'</td>' .
"</tr><tr>\n" .
@@ -432,10 +393,10 @@ class SpecialRevisionDelete extends UnlistedSpecialPage {
} else {
$out = '';
}
- if( $this->mIsAllowed ) {
+ if ( $this->mIsAllowed ) {
$out .= Xml::closeElement( 'form' ) . "\n";
// Show link to edit the dropdown reasons
- if( $this->getUser()->isAllowed( 'editinterface' ) ) {
+ if ( $this->getUser()->isAllowed( 'editinterface' ) ) {
$title = Title::makeTitle( NS_MEDIAWIKI, 'Revdelete-reason-dropdown' );
$link = Linker::link(
$title,
@@ -455,10 +416,10 @@ class SpecialRevisionDelete extends UnlistedSpecialPage {
*/
protected function addUsageText() {
$this->getOutput()->addWikiMsg( 'revdelete-text' );
- if( $this->getUser()->isAllowed( 'suppressrevision' ) ) {
+ if ( $this->getUser()->isAllowed( 'suppressrevision' ) ) {
$this->getOutput()->addWikiMsg( 'revdelete-suppress-text' );
}
- if( $this->mIsAllowed ) {
+ if ( $this->mIsAllowed ) {
$this->getOutput()->addWikiMsg( 'revdelete-confirm' );
}
}
@@ -470,17 +431,18 @@ class SpecialRevisionDelete extends UnlistedSpecialPage {
$html = '<table>';
// If there is just one item, use checkboxes
$list = $this->getList();
- if( $list->length() == 1 ) {
+ if ( $list->length() == 1 ) {
$list->reset();
$bitfield = $list->current()->getBits(); // existing field
- if( $this->submitClicked ) {
+ if ( $this->submitClicked ) {
$bitfield = $this->extractBitfield( $this->extractBitParams(), $bitfield );
}
- foreach( $this->checks as $item ) {
+ foreach ( $this->checks as $item ) {
list( $message, $name, $field ) = $item;
$innerHTML = Xml::checkLabel( $this->msg( $message )->text(), $name, $name, $bitfield & $field );
- if( $field == Revision::DELETED_RESTRICTED )
+ if ( $field == Revision::DELETED_RESTRICTED ) {
$innerHTML = "<b>$innerHTML</b>";
+ }
$line = Xml::tags( 'td', array( 'class' => 'mw-input' ), $innerHTML );
$html .= "<tr>$line</tr>\n";
}
@@ -491,10 +453,10 @@ class SpecialRevisionDelete extends UnlistedSpecialPage {
$html .= '<th class="mw-revdel-checkbox">' . $this->msg( 'revdelete-radio-unset' )->escaped() . '</th>';
$html .= '<th class="mw-revdel-checkbox">' . $this->msg( 'revdelete-radio-set' )->escaped() . '</th>';
$html .= "<th></th></tr>\n";
- foreach( $this->checks as $item ) {
+ foreach ( $this->checks as $item ) {
list( $message, $name, $field ) = $item;
// If there are several items, use third state by default...
- if( $this->submitClicked ) {
+ if ( $this->submitClicked ) {
$selected = $this->getRequest()->getInt( $name, 0 /* unchecked */ );
} else {
$selected = -1; // use existing field
@@ -503,7 +465,7 @@ class SpecialRevisionDelete extends UnlistedSpecialPage {
$line .= '<td class="mw-revdel-checkbox">' . Xml::radio( $name, 0, $selected == 0 ) . '</td>';
$line .= '<td class="mw-revdel-checkbox">' . Xml::radio( $name, 1, $selected == 1 ) . '</td>';
$label = $this->msg( $message )->escaped();
- if( $field == Revision::DELETED_RESTRICTED ) {
+ if ( $field == Revision::DELETED_RESTRICTED ) {
$label = "<b>$label</b>";
}
$line .= "<td>$label</td>";
@@ -523,21 +485,21 @@ class SpecialRevisionDelete extends UnlistedSpecialPage {
protected function submit() {
# Check edit token on submission
$token = $this->getRequest()->getVal( 'wpEditToken' );
- if( $this->submitClicked && !$this->getUser()->matchEditToken( $token ) ) {
+ if ( $this->submitClicked && !$this->getUser()->matchEditToken( $token ) ) {
$this->getOutput()->addWikiMsg( 'sessionfailure' );
return false;
}
$bitParams = $this->extractBitParams();
$listReason = $this->getRequest()->getText( 'wpRevDeleteReasonList', 'other' ); // from dropdown
$comment = $listReason;
- if( $comment != 'other' && $this->otherReason != '' ) {
+ if ( $comment != 'other' && $this->otherReason != '' ) {
// Entry from drop down menu + additional comment
$comment .= $this->msg( 'colon-separator' )->inContentLanguage()->text() . $this->otherReason;
- } elseif( $comment == 'other' ) {
+ } elseif ( $comment == 'other' ) {
$comment = $this->otherReason;
}
# Can the user set this field?
- if( $bitParams[Revision::DELETED_RESTRICTED] == 1 && !$this->getUser()->isAllowed( 'suppressrevision' ) ) {
+ if ( $bitParams[Revision::DELETED_RESTRICTED] == 1 && !$this->getUser()->isAllowed( 'suppressrevision' ) ) {
throw new PermissionsError( 'suppressrevision' );
}
# If the save went through, go to success message...
@@ -557,7 +519,7 @@ class SpecialRevisionDelete extends UnlistedSpecialPage {
*/
protected function success() {
$this->getOutput()->setPageTitle( $this->msg( 'actioncomplete' ) );
- $this->getOutput()->wrapWikiMsg( "<span class=\"success\">\n$1\n</span>", $this->typeInfo['success'] );
+ $this->getOutput()->wrapWikiMsg( "<span class=\"success\">\n$1\n</span>", $this->typeLabels['success'] );
$this->list->reloadFromMaster();
$this->showForm();
}
@@ -567,7 +529,7 @@ class SpecialRevisionDelete extends UnlistedSpecialPage {
*/
protected function failure( $status ) {
$this->getOutput()->setPageTitle( $this->msg( 'actionfailed' ) );
- $this->getOutput()->addWikiText( $status->getWikiText( $this->typeInfo['failure'] ) );
+ $this->getOutput()->addWikiText( $status->getWikiText( $this->typeLabels['failure'] ) );
$this->showForm();
}
@@ -578,15 +540,15 @@ class SpecialRevisionDelete extends UnlistedSpecialPage {
*/
protected function extractBitParams() {
$bitfield = array();
- foreach( $this->checks as $item ) {
+ foreach ( $this->checks as $item ) {
list( /* message */, $name, $field ) = $item;
$val = $this->getRequest()->getInt( $name, 0 /* unchecked */ );
- if( $val < -1 || $val > 1) {
+ if ( $val < -1 || $val > 1 ) {
$val = -1; // -1 for existing value
}
$bitfield[$field] = $val;
}
- if( !isset( $bitfield[Revision::DELETED_RESTRICTED] ) ) {
+ if ( !isset( $bitfield[Revision::DELETED_RESTRICTED] ) ) {
$bitfield[Revision::DELETED_RESTRICTED] = 0;
}
return $bitfield;
@@ -594,21 +556,13 @@ class SpecialRevisionDelete extends UnlistedSpecialPage {
/**
* Put together a rev_deleted bitfield
+ * @deprecated since 1.22, use RevisionDeleter::extractBitfield instead
* @param array $bitPars extractBitParams() params
* @param int $oldfield current bitfield
* @return array
*/
public static function extractBitfield( $bitPars, $oldfield ) {
- // Build the actual new rev_deleted bitfield
- $newBits = 0;
- foreach( $bitPars as $const => $val ) {
- if( $val == 1 ) {
- $newBits |= $const; // $const is the *_deleted const
- } elseif( $val == -1 ) {
- $newBits |= ($oldfield & $const); // use existing
- }
- }
- return $newBits;
+ return RevisionDeleter::extractBitfield( $bitPars, $oldfield );
}
/**
diff --git a/includes/specials/SpecialSearch.php b/includes/specials/SpecialSearch.php
index 6c401486..8609c740 100644
--- a/includes/specials/SpecialSearch.php
+++ b/includes/specials/SpecialSearch.php
@@ -42,6 +42,9 @@ class SpecialSearch extends SpecialPage {
/// Search engine
protected $searchEngine;
+ /// Search engine type, if not default
+ protected $searchEngineType;
+
/// For links
protected $extraParams = array();
@@ -98,6 +101,8 @@ class SpecialSearch extends SpecialPage {
$this->load();
+ $this->searchEngineType = $request->getVal( 'srbackend' );
+
if ( $request->getVal( 'fulltext' )
|| !is_null( $request->getVal( 'offset' ) )
|| !is_null( $request->getVal( 'searchx' ) ) )
@@ -137,7 +142,7 @@ class SpecialSearch extends SpecialPage {
if ( $profile === null ) {
// BC with old request format
$profile = 'advanced';
- foreach( $profiles as $key => $data ) {
+ foreach ( $profiles as $key => $data ) {
if ( $nslist === $data['namespaces'] && $key !== 'advanced' ) {
$profile = $key;
}
@@ -173,7 +178,7 @@ class SpecialSearch extends SpecialPage {
# Try to go to page as entered.
$t = Title::newFromText( $term );
# If the string cannot be used to create a title
- if( is_null( $t ) ) {
+ if ( is_null( $t ) ) {
$this->showResults( $term );
return;
}
@@ -185,19 +190,19 @@ class SpecialSearch extends SpecialPage {
return;
}
- if( !is_null( $t ) ) {
+ if ( !is_null( $t ) ) {
$this->getOutput()->redirect( $t->getFullURL() );
return;
}
# No match, generate an edit URL
$t = Title::newFromText( $term );
- if( !is_null( $t ) ) {
+ 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 ) {
+ if ( $wgGoToEdit ) {
$this->getOutput()->redirect( $t->getFullURL( array( 'action' => 'edit' ) ) );
return;
}
@@ -253,18 +258,24 @@ class SpecialSearch extends SpecialPage {
$rewritten = $search->replacePrefixes( $term );
$titleMatches = $search->searchTitle( $rewritten );
- if( !( $titleMatches instanceof SearchResultTooMany ) ) {
+ if ( !( $titleMatches instanceof SearchResultTooMany ) ) {
$textMatches = $search->searchText( $rewritten );
}
+ $textStatus = null;
+ if ( $textMatches instanceof Status ) {
+ $textStatus = $textMatches;
+ $textMatches = null;
+ }
+
// did you mean... suggestions
- if( $textMatches && $textMatches->hasSuggestion() ) {
+ if ( $textMatches && !$textStatus && $textMatches->hasSuggestion() ) {
$st = SpecialPage::getTitleFor( 'Search' );
# mirror Go/Search behavior of original request ..
$didYouMeanParams = array( 'search' => $textMatches->getSuggestionQuery() );
- if( $this->fulltext != null ) {
+ if ( $this->fulltext != null ) {
$didYouMeanParams['fulltext'] = $this->fulltext;
}
@@ -275,7 +286,7 @@ class SpecialSearch extends SpecialPage {
$suggestionSnippet = $textMatches->getSuggestionSnippet();
- if( $suggestionSnippet == '' ) {
+ if ( $suggestionSnippet == '' ) {
$suggestionSnippet = null;
}
@@ -317,14 +328,14 @@ class SpecialSearch extends SpecialPage {
);
// Sometimes the search engine knows there are too many hits
- if( $titleMatches instanceof SearchResultTooMany ) {
+ if ( $titleMatches instanceof SearchResultTooMany ) {
$out->wrapWikiMsg( "==$1==\n", 'toomanymatches' );
wfProfileOut( __METHOD__ );
return;
}
$filePrefix = $wgContLang->getFormattedNsText( NS_FILE ) . ':';
- if( trim( $term ) === '' || $filePrefix === trim( $term ) ) {
+ if ( trim( $term ) === '' || $filePrefix === trim( $term ) ) {
$out->addHTML( $this->formHeader( $term, 0, 0 ) );
$out->addHtml( $this->getProfileForm( $this->profile, $term ) );
$out->addHTML( '</form>' );
@@ -347,10 +358,12 @@ class SpecialSearch extends SpecialPage {
// get total number of results if backend can calculate it
$totalRes = 0;
- if( $titleMatches && !is_null( $titleMatches->getTotalHits() ) )
+ if ( $titleMatches && !is_null( $titleMatches->getTotalHits() ) ) {
$totalRes += $titleMatches->getTotalHits();
- if( $textMatches && !is_null( $textMatches->getTotalHits() ) )
+ }
+ if ( $textMatches && !is_null( $textMatches->getTotalHits() ) ) {
$totalRes += $textMatches->getTotalHits();
+ }
// show number of results and current offset
$out->addHTML( $this->formHeader( $term, $num, $totalRes ) );
@@ -360,7 +373,7 @@ class SpecialSearch extends SpecialPage {
$out->addHtml( "<div class='searchresults'>" );
// prev/next links
- if( $num || $this->offset ) {
+ if ( $num || $this->offset ) {
// Show the create link ahead
$this->showCreateLink( $t );
$prevnext = $this->getLanguage()->viewPrevNext( $this->getTitle(), $this->offset, $this->limit,
@@ -374,40 +387,46 @@ class SpecialSearch extends SpecialPage {
}
$out->parserOptions()->setEditSection( false );
- if( $titleMatches ) {
- if( $numTitleMatches > 0 ) {
+ if ( $titleMatches ) {
+ if ( $numTitleMatches > 0 ) {
$out->wrapWikiMsg( "==$1==\n", 'titlematches' );
$out->addHTML( $this->showMatches( $titleMatches ) );
}
$titleMatches->free();
}
- if( $textMatches ) {
+ if ( $textMatches && !$textStatus ) {
// output appropriate heading
- if( $numTextMatches > 0 && $numTitleMatches > 0 ) {
+ if ( $numTextMatches > 0 && $numTitleMatches > 0 ) {
// if no title matches the heading is redundant
$out->wrapWikiMsg( "==$1==\n", 'textmatches' );
- } elseif( $totalRes == 0 ) {
+ } elseif ( $totalRes == 0 ) {
# Don't show the 'no text matches' if we received title matches
# $out->wrapWikiMsg( "==$1==\n", 'notextmatches' );
}
// show interwiki results if any
- if( $textMatches->hasInterwikiResults() ) {
+ if ( $textMatches->hasInterwikiResults() ) {
$out->addHTML( $this->showInterwiki( $textMatches->getInterwikiResults(), $term ) );
}
// show results
- if( $numTextMatches > 0 ) {
+ if ( $numTextMatches > 0 ) {
$out->addHTML( $this->showMatches( $textMatches ) );
}
$textMatches->free();
}
- if( $num === 0 ) {
- $out->wrapWikiMsg( "<p class=\"mw-search-nonefound\">\n$1</p>", array( 'search-nonefound', wfEscapeWikiText( $term ) ) );
- $this->showCreateLink( $t );
+ if ( $num === 0 ) {
+ if ( $textStatus ) {
+ $out->addHTML( '<div class="error">' .
+ htmlspecialchars( $textStatus->getWikiText( 'search-error' ) ) . '</div>' );
+ } else {
+ $out->wrapWikiMsg( "<p class=\"mw-search-nonefound\">\n$1</p>",
+ array( 'search-nonefound', wfEscapeWikiText( $term ) ) );
+ $this->showCreateLink( $t );
+ }
}
$out->addHtml( "</div>" );
- if( $num || $this->offset ) {
+ if ( $num || $this->offset ) {
$out->addHTML( "<p class='mw-search-pager-bottom'>{$prevnext}</p>\n" );
}
wfRunHooks( 'SpecialSearchResultsAppend', array( $this, $out, $term ) );
@@ -421,16 +440,16 @@ class SpecialSearch extends SpecialPage {
// show direct page/create link if applicable
// Check DBkey !== '' in case of fragment link only.
- if( is_null( $t ) || $t->getDBkey() === '' ) {
+ if ( is_null( $t ) || $t->getDBkey() === '' ) {
// invalid title
// preserve the paragraph for margins etc...
$this->getOutput()->addHtml( '<p></p>' );
return;
}
- if( $t->isKnown() ) {
+ if ( $t->isKnown() ) {
$messageName = 'searchmenu-exists';
- } elseif( $t->userCan( 'create', $this->getUser() ) ) {
+ } elseif ( $t->userCan( 'create', $this->getUser() ) ) {
$messageName = 'searchmenu-new';
} else {
$messageName = 'searchmenu-new-nocreate';
@@ -439,7 +458,7 @@ class SpecialSearch extends SpecialPage {
wfRunHooks( 'SpecialSearchCreateLink', array( $t, &$params ) );
// Extensions using the hook might still return an empty $messageName
- if( $messageName ) {
+ if ( $messageName ) {
$this->getOutput()->wrapWikiMsg( "<p class=\"mw-search-createlink\">\n$1</p>", $params );
} else {
// preserve the paragraph for margins etc...
@@ -452,9 +471,9 @@ class SpecialSearch extends SpecialPage {
*/
protected function setupPage( $term ) {
# Should advanced UI be used?
- $this->searchAdvanced = ($this->profile === 'advanced');
+ $this->searchAdvanced = ( $this->profile === 'advanced' );
$out = $this->getOutput();
- if( strval( $term ) !== '' ) {
+ if ( strval( $term ) !== '' ) {
$out->setPageTitle( $this->msg( 'searchresults' ) );
$out->setHTMLTitle( $this->msg( 'pagetitle' )->rawParams(
$this->msg( 'searchresults-title' )->rawParams( $term )->text()
@@ -473,8 +492,8 @@ class SpecialSearch extends SpecialPage {
*/
protected function powerSearch( &$request ) {
$arr = array();
- foreach( SearchEngine::searchableNamespaces() as $ns => $name ) {
- if( $request->getCheck( 'ns' . $ns ) ) {
+ foreach ( SearchEngine::searchableNamespaces() as $ns => $name ) {
+ if ( $request->getCheck( 'ns' . $ns ) ) {
$arr[] = $ns;
}
}
@@ -490,10 +509,10 @@ class SpecialSearch extends SpecialPage {
protected function powerSearchOptions() {
$opt = array();
$opt['redirs'] = $this->searchRedirects ? 1 : 0;
- if( $this->profile !== 'advanced' ) {
+ if ( $this->profile !== 'advanced' ) {
$opt['profile'] = $this->profile;
} else {
- foreach( $this->namespaces as $n ) {
+ foreach ( $this->namespaces as $n ) {
$opt['ns' . $n] = 1;
}
}
@@ -515,12 +534,12 @@ class SpecialSearch extends SpecialPage {
$out = "";
$infoLine = $matches->getInfo();
- if( !is_null( $infoLine ) ) {
+ if ( !is_null( $infoLine ) ) {
$out .= "\n<!-- {$infoLine} -->\n";
}
$out .= "<ul class='mw-search-results'>\n";
$result = $matches->next();
- while( $result ) {
+ while ( $result ) {
$out .= $this->showHit( $result, $terms );
$result = $matches->next();
}
@@ -543,7 +562,7 @@ class SpecialSearch extends SpecialPage {
protected function showHit( $result, $terms ) {
wfProfileIn( __METHOD__ );
- if( $result->isBrokenTitle() ) {
+ if ( $result->isBrokenTitle() ) {
wfProfileOut( __METHOD__ );
return "<!-- Broken link in search result -->\n";
}
@@ -552,8 +571,9 @@ class SpecialSearch extends SpecialPage {
$titleSnippet = $result->getTitleSnippet( $terms );
- if( $titleSnippet == '' )
+ if ( $titleSnippet == '' ) {
$titleSnippet = null;
+ }
$link_t = clone $t;
@@ -568,7 +588,7 @@ class SpecialSearch extends SpecialPage {
//If page content is not readable, just return the title.
//This is not quite safe, but better than showing excerpts from non-readable pages
//Note that hiding the entry entirely would screw up paging.
- if( !$t->userCan( 'read', $this->getUser() ) ) {
+ if ( !$t->userCan( 'read', $this->getUser() ) ) {
wfProfileOut( __METHOD__ );
return "<li>{$link}</li>\n";
}
@@ -576,7 +596,7 @@ class SpecialSearch extends SpecialPage {
// If the page doesn't *exist*... our search index is out of date.
// The least confusing at this point is to drop the result.
// You may get less results, but... oh well. :P
- if( $result->isMissingRevision() ) {
+ if ( $result->isMissingRevision() ) {
wfProfileOut( __METHOD__ );
return "<!-- missing page " . htmlspecialchars( $t->getPrefixedText() ) . "-->\n";
}
@@ -588,9 +608,10 @@ class SpecialSearch extends SpecialPage {
$sectionText = $result->getSectionSnippet( $terms );
$redirect = '';
- if( !is_null( $redirectTitle ) ) {
- if( $redirectText == '' )
+ if ( !is_null( $redirectTitle ) ) {
+ if ( $redirectText == '' ) {
$redirectText = null;
+ }
$redirect = "<span class='searchalttitle'>" .
$this->msg( 'search-redirect' )->rawParams(
@@ -600,9 +621,10 @@ class SpecialSearch extends SpecialPage {
$section = '';
- if( !is_null( $sectionTitle ) ) {
- if( $sectionText == '' )
+ if ( !is_null( $sectionTitle ) ) {
+ if ( $sectionText == '' ) {
$sectionText = null;
+ }
$section = "<span class='searchalttitle'>" .
$this->msg( 'search-section' )->rawParams(
@@ -616,7 +638,7 @@ class SpecialSearch extends SpecialPage {
$lang = $this->getLanguage();
// format score
- if( is_null( $result->getScore() ) ) {
+ if ( is_null( $result->getScore() ) ) {
// Search engine doesn't report scoring info
$score = '';
} else {
@@ -632,7 +654,7 @@ class SpecialSearch extends SpecialPage {
$size = $this->msg( 'search-result-size', $lang->formatSize( $byteSize ) )
->numParams( $wordCount )->escaped();
- if( $t->getNamespace() == NS_CATEGORY ) {
+ if ( $t->getNamespace() == NS_CATEGORY ) {
$cat = Category::newFromTitle( $t );
$size = $this->msg( 'search-result-category-size' )
->numParams( $cat->getPageCount(), $cat->getSubcatCount(), $cat->getFileCount() )
@@ -643,7 +665,7 @@ class SpecialSearch extends SpecialPage {
// link to related articles if supported
$related = '';
- if( $result->hasRelated() ) {
+ if ( $result->hasRelated() ) {
$st = SpecialPage::getTitleFor( 'Search' );
$stParams = array_merge(
$this->powerSearchOptions(),
@@ -663,11 +685,11 @@ class SpecialSearch extends SpecialPage {
}
// Include a thumbnail for media files...
- if( $t->getNamespace() == NS_FILE ) {
+ if ( $t->getNamespace() == NS_FILE ) {
$img = wfFindFile( $t );
- if( $img ) {
+ if ( $img ) {
$thumb = $img->transform( array( 'width' => 120, 'height' => 120 ) );
- if( $thumb ) {
+ if ( $thumb ) {
$desc = $this->msg( 'parentheses' )->rawParams( $img->getShortDesc() )->escaped();
wfProfileOut( __METHOD__ );
// Float doesn't seem to interact well with the bullets.
@@ -693,7 +715,7 @@ class SpecialSearch extends SpecialPage {
$html = null;
- if ( wfRunHooks( 'ShowSearchHit', array (
+ if ( wfRunHooks( 'ShowSearchHit', array(
$this, $result, $terms,
&$link, &$redirect, &$section, &$extract,
&$score, &$size, &$date, &$related,
@@ -721,23 +743,23 @@ class SpecialSearch extends SpecialPage {
wfProfileIn( __METHOD__ );
$terms = $wgContLang->convertForSearchResult( $matches->termMatches() );
- $out = "<div id='mw-search-interwiki'><div id='mw-search-interwiki-caption'>".
+ $out = "<div id='mw-search-interwiki'><div id='mw-search-interwiki-caption'>" .
$this->msg( 'search-interwiki-caption' )->text() . "</div>\n";
$out .= "<ul class='mw-search-iwresults'>\n";
// work out custom project captions
$customCaptions = array();
$customLines = explode( "\n", $this->msg( 'search-interwiki-custom' )->text() ); // format per line <iwprefix>:<caption>
- foreach( $customLines as $line ) {
+ foreach ( $customLines as $line ) {
$parts = explode( ":", $line, 2 );
- if( count( $parts ) == 2 ) { // validate line
+ if ( count( $parts ) == 2 ) { // validate line
$customCaptions[$parts[0]] = $parts[1];
}
}
$prev = null;
$result = $matches->next();
- while( $result ) {
+ while ( $result ) {
$out .= $this->showInterwikiHit( $result, $prev, $terms, $query, $customCaptions );
$prev = $result->getInterwikiPrefix();
$result = $matches->next();
@@ -762,10 +784,10 @@ class SpecialSearch extends SpecialPage {
*
* @return string
*/
- protected function showInterwikiHit( $result, $lastInterwiki, $terms, $query, $customCaptions) {
+ protected function showInterwikiHit( $result, $lastInterwiki, $terms, $query, $customCaptions ) {
wfProfileIn( __METHOD__ );
- if( $result->isBrokenTitle() ) {
+ if ( $result->isBrokenTitle() ) {
wfProfileOut( __METHOD__ );
return "<!-- Broken link in search result -->\n";
}
@@ -774,8 +796,9 @@ class SpecialSearch extends SpecialPage {
$titleSnippet = $result->getTitleSnippet( $terms );
- if( $titleSnippet == '' )
+ if ( $titleSnippet == '' ) {
$titleSnippet = null;
+ }
$link = Linker::linkKnown(
$t,
@@ -786,9 +809,10 @@ class SpecialSearch extends SpecialPage {
$redirectTitle = $result->getRedirectTitle();
$redirectText = $result->getRedirectSnippet( $terms );
$redirect = '';
- if( !is_null( $redirectTitle ) ) {
- if( $redirectText == '' )
+ if ( !is_null( $redirectTitle ) ) {
+ if ( $redirectText == '' ) {
$redirectText = null;
+ }
$redirect = "<span class='searchalttitle'>" .
$this->msg( 'search-redirect' )->rawParams(
@@ -798,8 +822,8 @@ class SpecialSearch extends SpecialPage {
$out = "";
// display project name
- if( is_null( $lastInterwiki ) || $lastInterwiki != $t->getInterwiki() ) {
- if( array_key_exists( $t->getInterwiki(), $customCaptions ) ) {
+ if ( is_null( $lastInterwiki ) || $lastInterwiki != $t->getInterwiki() ) {
+ if ( array_key_exists( $t->getInterwiki(), $customCaptions ) ) {
// captions from 'search-interwiki-custom'
$caption = $customCaptions[$t->getInterwiki()];
} else {
@@ -856,17 +880,21 @@ class SpecialSearch extends SpecialPage {
* @return String: HTML form
*/
protected function powerSearchBox( $term, $opts ) {
+ global $wgContLang;
+
// Groups namespaces into rows according to subject
$rows = array();
- foreach( SearchEngine::searchableNamespaces() as $namespace => $name ) {
+ foreach ( SearchEngine::searchableNamespaces() as $namespace => $name ) {
$subject = MWNamespace::getSubject( $namespace );
- if( !array_key_exists( $subject, $rows ) ) {
+ if ( !array_key_exists( $subject, $rows ) ) {
$rows[$subject] = "";
}
- $name = str_replace( '_', ' ', $name );
- if( $name == '' ) {
+
+ $name = $wgContLang->getConverter()->convertNamespace( $namespace );
+ if ( $name == '' ) {
$name = $this->msg( 'blanknamespace' )->text();
}
+
$rows[$subject] .=
Xml::openElement(
'td', array( 'style' => 'white-space: nowrap' )
@@ -879,27 +907,30 @@ class SpecialSearch extends SpecialPage {
) .
Xml::closeElement( 'td' );
}
+
$rows = array_values( $rows );
$numRows = count( $rows );
// Lays out namespaces in multiple floating two-column tables so they'll
// be arranged nicely while still accommodating different screen widths
$namespaceTables = '';
- for( $i = 0; $i < $numRows; $i += 4 ) {
+ for ( $i = 0; $i < $numRows; $i += 4 ) {
$namespaceTables .= Xml::openElement(
'table',
array( 'cellpadding' => 0, 'cellspacing' => 0 )
);
- for( $j = $i; $j < $i + 4 && $j < $numRows; $j++ ) {
+
+ for ( $j = $i; $j < $i + 4 && $j < $numRows; $j++ ) {
$namespaceTables .= Xml::tags( 'tr', null, $rows[$j] );
}
+
$namespaceTables .= Xml::closeElement( 'table' );
}
$showSections = array( 'namespaceTables' => $namespaceTables );
// Show redirects check only if backend supports it
- if( $this->getSearchEngine()->supports( 'list-redirects' ) ) {
+ if ( $this->getSearchEngine()->supports( 'list-redirects' ) ) {
$showSections['redirects'] =
Xml::checkLabel( $this->msg( 'powersearch-redir' )->text(), 'redirs', 'redirs', $this->searchRedirects );
}
@@ -908,12 +939,11 @@ class SpecialSearch extends SpecialPage {
$hidden = '';
unset( $opts['redirs'] );
- foreach( $opts as $key => $value ) {
+ foreach ( $opts as $key => $value ) {
$hidden .= Html::hidden( $key, $value );
}
// Return final output
- return
- Xml::openElement(
+ return Xml::openElement(
'fieldset',
array( 'id' => 'mw-searchoptions', 'style' => 'margin:0em;' )
) .
@@ -969,8 +999,10 @@ class SpecialSearch extends SpecialPage {
wfRunHooks( 'SpecialSearchProfiles', array( &$profiles ) );
- foreach( $profiles as &$data ) {
- if ( !is_array( $data['namespaces'] ) ) continue;
+ foreach ( $profiles as &$data ) {
+ if ( !is_array( $data['namespaces'] ) ) {
+ continue;
+ }
sort( $data['namespaces'] );
}
@@ -987,7 +1019,7 @@ class SpecialSearch extends SpecialPage {
$out = Xml::openElement( 'div', array( 'class' => 'mw-search-formheader' ) );
$bareterm = $term;
- if( $this->startsWithImage( $term ) ) {
+ if ( $this->startsWithImage( $term ) ) {
// Deletes prefixes
$bareterm = substr( $term, strpos( $term, ':' ) + 1 );
}
@@ -1081,7 +1113,7 @@ class SpecialSearch extends SpecialPage {
*/
protected function makeSearchLink( $term, $namespaces, $label, $tooltip, $params = array() ) {
$opt = $params;
- foreach( $namespaces as $n ) {
+ foreach ( $namespaces as $n ) {
$opt['ns' . $n] = 1;
}
$opt['redirs'] = $this->searchRedirects;
@@ -1098,7 +1130,8 @@ class SpecialSearch extends SpecialPage {
'a',
array(
'href' => $this->getTitle()->getLocalURL( $stParams ),
- 'title' => $tooltip),
+ 'title' => $tooltip
+ ),
$label
);
}
@@ -1113,7 +1146,7 @@ class SpecialSearch extends SpecialPage {
global $wgContLang;
$p = explode( ':', $term );
- if( count( $p ) > 1 ) {
+ if ( count( $p ) > 1 ) {
return $wgContLang->getNsIndex( $p[0] ) == NS_FILE;
}
return false;
@@ -1130,7 +1163,7 @@ class SpecialSearch extends SpecialPage {
$allkeyword = $this->msg( 'searchall' )->inContentLanguage()->text();
$p = explode( ':', $term );
- if( count( $p ) > 1 ) {
+ if ( count( $p ) > 1 ) {
return $p[0] == $allkeyword;
}
return false;
@@ -1143,7 +1176,8 @@ class SpecialSearch extends SpecialPage {
*/
public function getSearchEngine() {
if ( $this->searchEngine === null ) {
- $this->searchEngine = SearchEngine::create();
+ $this->searchEngine = $this->searchEngineType ?
+ SearchEngine::create( $this->searchEngineType ) : SearchEngine::create();
}
return $this->searchEngine;
}
@@ -1162,6 +1196,6 @@ class SpecialSearch extends SpecialPage {
}
protected function getGroupName() {
- return 'redirects';
+ return 'pages';
}
}
diff --git a/includes/specials/SpecialShortpages.php b/includes/specials/SpecialShortpages.php
index 1be7fbed..9b50875a 100644
--- a/includes/specials/SpecialShortpages.php
+++ b/includes/specials/SpecialShortpages.php
@@ -38,15 +38,15 @@ class ShortPagesPage extends QueryPage {
}
function getQueryInfo() {
- return array (
- 'tables' => array ( 'page' ),
- 'fields' => array ( 'namespace' => 'page_namespace',
+ return array(
+ 'tables' => array( 'page' ),
+ 'fields' => array( 'namespace' => 'page_namespace',
'title' => 'page_title',
'value' => 'page_len' ),
- 'conds' => array ( 'page_namespace' =>
+ 'conds' => array( 'page_namespace' =>
MWNamespace::getContentNamespaces(),
'page_is_redirect' => 0 ),
- 'options' => array ( 'USE INDEX' => 'page_redirect_namespace_len' )
+ 'options' => array( 'USE INDEX' => 'page_redirect_namespace_len' )
);
}
@@ -56,8 +56,7 @@ class ShortPagesPage extends QueryPage {
/**
* @param $db DatabaseBase
- * @param $res
- * @return void
+ * @param ResultWrapper $res
*/
function preprocessResults( $db, $res ) {
# There's no point doing a batch check if we aren't caching results;
@@ -79,6 +78,11 @@ class ShortPagesPage extends QueryPage {
return false;
}
+ /**
+ * @param Skin $skin
+ * @param object $result Result row
+ * @return string
+ */
function formatResult( $skin, $result ) {
$dm = $this->getLanguage()->getDirMark();
diff --git a/includes/specials/SpecialSpecialpages.php b/includes/specials/SpecialSpecialpages.php
index 57fffb84..47c89d0d 100644
--- a/includes/specials/SpecialSpecialpages.php
+++ b/includes/specials/SpecialSpecialpages.php
@@ -53,17 +53,18 @@ class SpecialSpecialpages extends UnlistedSpecialPage {
$pages = SpecialPageFactory::getUsablePages( $this->getUser() );
- if( !count( $pages ) ) {
+ if ( !count( $pages ) ) {
# Yeah, that was pointless. Thanks for coming.
return false;
}
/** Put them into a sortable array */
$groups = array();
+ /** @var SpecialPage $page */
foreach ( $pages as $page ) {
if ( $page->isListed() ) {
$group = $page->getFinalGroupName();
- if( !isset( $groups[$group] ) ) {
+ if ( !isset( $groups[$group] ) ) {
$groups[$group] = array();
}
$groups[$group][$page->getDescription()] = array(
@@ -76,13 +77,13 @@ class SpecialSpecialpages extends UnlistedSpecialPage {
/** Sort */
if ( $wgSortSpecialPages ) {
- foreach( $groups as $group => $sortedPages ) {
+ foreach ( $groups as $group => $sortedPages ) {
ksort( $groups[$group] );
}
}
/** Always move "other" to end */
- if( array_key_exists( 'other', $groups ) ) {
+ if ( array_key_exists( 'other', $groups ) ) {
$other = $groups['other'];
unset( $groups['other'] );
$groups['other'] = $other;
@@ -104,12 +105,12 @@ class SpecialSpecialpages extends UnlistedSpecialPage {
$out->wrapWikiMsg( "<h2 class=\"mw-specialpagesgroup\" id=\"mw-specialpagesgroup-$group\">$1</h2>\n", "specialpages-group-$group" );
$out->addHTML(
- Html::openElement( 'table', array( 'style' => 'width:100%;', 'class' => 'mw-specialpages-table' ) ) ."\n" .
+ 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 ) {
+ foreach ( $sortedPages as $desc => $specialpage ) {
list( $title, $restricted, $cached ) = $specialpage;
$pageClasses = array();
@@ -117,7 +118,7 @@ class SpecialSpecialpages extends UnlistedSpecialPage {
$includesCachedPages = true;
$pageClasses[] = 'mw-specialpagecached';
}
- if( $restricted ) {
+ if ( $restricted ) {
$includesRestrictedPages = true;
$pageClasses[] = 'mw-specialpagerestricted';
}
@@ -127,7 +128,7 @@ class SpecialSpecialpages extends UnlistedSpecialPage {
# Split up the larger groups
$count++;
- if( $total > 3 && $count == $middle ) {
+ if ( $total > 3 && $count == $middle ) {
$out->addHTML(
Html::closeElement( 'ul' ) . Html::closeElement( 'td' ) .
Html::element( 'td', array( 'style' => 'width:10%' ), '' ) .
diff --git a/includes/specials/SpecialStatistics.php b/includes/specials/SpecialStatistics.php
index ee768263..f26d1a60 100644
--- a/includes/specials/SpecialStatistics.php
+++ b/includes/specials/SpecialStatistics.php
@@ -53,18 +53,18 @@ class SpecialStatistics extends SpecialPage {
# Staticic - views
$viewsStats = '';
- if( !$wgDisableCounters ) {
+ if ( !$wgDisableCounters ) {
$viewsStats = $this->getViewsStats();
}
# Set active user count
- if( !$wgMiserMode ) {
+ if ( !$wgMiserMode ) {
$key = wfMemcKey( 'sitestats', 'activeusers-updated' );
// Re-calculate the count if the last tally is old...
- if( !$wgMemc->get( $key ) ) {
+ if ( !$wgMemc->get( $key ) ) {
$dbw = wfGetDB( DB_MASTER );
SiteStatsUpdate::cacheUpdate( $dbw );
- $wgMemc->set( $key, '1', 24*3600 ); // don't update for 1 day
+ $wgMemc->set( $key, '1', 24 * 3600 ); // don't update for 1 day
}
}
@@ -84,13 +84,13 @@ class SpecialStatistics extends SpecialPage {
$text .= $viewsStats;
# Statistic - popular pages
- if( !$wgDisableCounters && !$wgMiserMode ) {
+ if ( !$wgDisableCounters && !$wgMiserMode ) {
$text .= $this->getMostViewedPages();
}
# Statistic - other
$extraStats = array();
- if( wfRunHooks( 'SpecialStatsAddExtra', array( &$extraStats ) ) ) {
+ if ( wfRunHooks( 'SpecialStatsAddExtra', array( &$extraStats ) ) ) {
$text .= $this->getOtherStats( $extraStats );
}
@@ -111,15 +111,15 @@ class SpecialStatistics extends SpecialPage {
* @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
+ * @param array|string $descMsgParam Message parameters
* @return string table row in HTML format
*/
private function formatRow( $text, $number, $trExtraParams = array(), $descMsg = '', $descMsgParam = '' ) {
- if( $descMsg ) {
+ if ( $descMsg ) {
$msg = $this->msg( $descMsg, $descMsgParam );
if ( $msg->exists() ) {
$descriptionText = $this->msg( 'parentheses' )->rawParams( $msg->parse() )->escaped();
- $text .= "<br />" . Xml::element( 'small', array( 'class' => 'mw-statistic-desc'),
+ $text .= "<br />" . Xml::element( 'small', array( 'class' => 'mw-statistic-desc' ),
" $descriptionText" );
}
}
@@ -185,7 +185,7 @@ class SpecialStatistics extends SpecialPage {
private function getGroupStats() {
global $wgGroupPermissions, $wgImplicitGroups;
$text = '';
- foreach( $wgGroupPermissions as $group => $permissions ) {
+ foreach ( $wgGroupPermissions as $group => $permissions ) {
# Skip generic * and implicit groups
if ( in_array( $group, $wgImplicitGroups ) || $group == '*' ) {
continue;
@@ -217,7 +217,7 @@ class SpecialStatistics extends SpecialPage {
# Add a class when a usergroup contains no members to allow hiding these rows
$classZero = '';
$countUsers = SiteStats::numberingroup( $groupname );
- if( $countUsers == 0 ) {
+ if ( $countUsers == 0 ) {
$classZero = ' statistics-group-zero';
}
$text .= $this->formatRow( $grouppage . ' ' . $grouplink,
@@ -233,11 +233,11 @@ class SpecialStatistics extends SpecialPage {
Xml::closeElement( 'tr' ) .
$this->formatRow( $this->msg( 'statistics-views-total' )->parse(),
$this->getLanguage()->formatNum( $this->views ),
- array ( 'class' => 'mw-statistics-views-total' ), 'statistics-views-total-desc' ) .
+ array( 'class' => 'mw-statistics-views-total' ), 'statistics-views-total-desc' ) .
$this->formatRow( $this->msg( 'statistics-views-peredit' )->parse(),
$this->getLanguage()->formatNum( sprintf( '%.2f', $this->edits ?
$this->views / $this->edits : 0 ) ),
- array ( 'class' => 'mw-statistics-views-peredit' ) );
+ array( 'class' => 'mw-statistics-views-peredit' ) );
}
private function getMostViewedPages() {
@@ -260,13 +260,13 @@ class SpecialStatistics extends SpecialPage {
'LIMIT' => 10,
)
);
- if( $res->numRows() > 0 ) {
+ if ( $res->numRows() > 0 ) {
$text .= Xml::openElement( 'tr' );
$text .= Xml::tags( 'th', array( 'colspan' => '2' ), $this->msg( 'statistics-mostpopular' )->parse() );
$text .= Xml::closeElement( 'tr' );
foreach ( $res as $row ) {
$title = Title::makeTitleSafe( $row->page_namespace, $row->page_title );
- if( $title instanceof Title ) {
+ if ( $title instanceof Title ) {
$text .= $this->formatRow( Linker::link( $title ),
$this->getLanguage()->formatNum( $row->page_counter ) );
@@ -287,8 +287,7 @@ class SpecialStatistics extends SpecialPage {
private function getOtherStats( array $stats ) {
$return = '';
- foreach( $stats as $header => $items ) {
-
+ foreach ( $stats as $header => $items ) {
// Identify the structure used
if ( is_array( $items ) ) {
@@ -298,11 +297,11 @@ class SpecialStatistics extends SpecialPage {
}
// Collect all items that belong to the same header
- foreach( $items as $key => $value ) {
+ foreach ( $items as $key => $value ) {
$name = $this->msg( $key )->parse();
$number = htmlspecialchars( $value );
- $return .= $this->formatRow( $name, $this->getLanguage()->formatNum( $number ), array( 'class' => 'mw-statistics-hook' ) );
+ $return .= $this->formatRow( $name, $this->getLanguage()->formatNum( $number ), array( 'class' => 'mw-statistics-hook', 'id' => 'mw-' . $key ) );
}
} else {
// Create the legacy header only once
diff --git a/includes/specials/SpecialTags.php b/includes/specials/SpecialTags.php
index 6d161031..077e7cbc 100644
--- a/includes/specials/SpecialTags.php
+++ b/includes/specials/SpecialTags.php
@@ -27,6 +27,10 @@
* @ingroup SpecialPage
*/
class SpecialTags extends SpecialPage {
+ /**
+ * @var array List of defined tags
+ */
+ public $definedTags;
function __construct() {
parent::__construct( 'Tags' );
@@ -44,51 +48,66 @@ class SpecialTags extends SpecialPage {
$html = Xml::tags( 'tr', null, Xml::tags( 'th', null, $this->msg( 'tags-tag' )->parse() ) .
Xml::tags( 'th', null, $this->msg( 'tags-display-header' )->parse() ) .
Xml::tags( 'th', null, $this->msg( 'tags-description-header' )->parse() ) .
+ Xml::tags( 'th', null, $this->msg( 'tags-active-header' )->parse() ) .
Xml::tags( 'th', null, $this->msg( 'tags-hitcount-header' )->parse() )
);
- $dbr = wfGetDB( DB_SLAVE );
- $res = $dbr->select( 'change_tag', array( 'ct_tag', 'hitcount' => 'count(*)' ),
- array(), __METHOD__, array( 'GROUP BY' => 'ct_tag', 'ORDER BY' => 'hitcount DESC' ) );
- foreach ( $res as $row ) {
- $html .= $this->doTagRow( $row->ct_tag, $row->hitcount );
- }
+ // Used in #doTagRow()
+ $this->definedTags = array_fill_keys( ChangeTags::listDefinedTags(), true );
- foreach( ChangeTags::listDefinedTags() as $tag ) {
- $html .= $this->doTagRow( $tag, 0 );
+ foreach ( ChangeTags::tagUsageStatistics() as $tag => $hitcount ) {
+ $html .= $this->doTagRow( $tag, $hitcount );
}
- $out->addHTML( Xml::tags( 'table', array( 'class' => 'wikitable mw-tags-table' ), $html ) );
+ $out->addHTML( Xml::tags(
+ 'table',
+ array( 'class' => 'wikitable sortable mw-tags-table' ),
+ $html
+ ) );
}
function doTagRow( $tag, $hitcount ) {
- static $doneTags = array();
-
- if ( in_array( $tag, $doneTags ) ) {
- return '';
- }
-
+ $user = $this->getUser();
$newRow = '';
$newRow .= Xml::tags( 'td', null, Xml::element( 'code', null, $tag ) );
$disp = ChangeTags::tagDescription( $tag );
- $disp .= ' ';
- $editLink = Linker::link( Title::makeTitle( NS_MEDIAWIKI, "Tag-$tag" ), $this->msg( 'tags-edit' )->escaped() );
- $disp .= $this->msg( 'parentheses' )->rawParams( $editLink )->escaped();
+ if ( $user->isAllowed( 'editinterface' ) ) {
+ $disp .= ' ';
+ $editLink = Linker::link(
+ Title::makeTitle( NS_MEDIAWIKI, "Tag-$tag" ),
+ $this->msg( 'tags-edit' )->escaped()
+ );
+ $disp .= $this->msg( 'parentheses' )->rawParams( $editLink )->escaped();
+ }
$newRow .= Xml::tags( 'td', null, $disp );
$msg = $this->msg( "tag-$tag-description" );
$desc = !$msg->exists() ? '' : $msg->parse();
- $desc .= ' ';
- $editDescLink = Linker::link( Title::makeTitle( NS_MEDIAWIKI, "Tag-$tag-description" ), $this->msg( 'tags-edit' )->escaped() );
- $desc .= $this->msg( 'parentheses' )->rawParams( $editDescLink )->escaped();
+ if ( $user->isAllowed( 'editinterface' ) ) {
+ $desc .= ' ';
+ $editDescLink = Linker::link(
+ Title::makeTitle( NS_MEDIAWIKI, "Tag-$tag-description" ),
+ $this->msg( 'tags-edit' )->escaped()
+ );
+ $desc .= $this->msg( 'parentheses' )->rawParams( $editDescLink )->escaped();
+ }
$newRow .= Xml::tags( 'td', null, $desc );
- $hitcount = $this->msg( 'tags-hitcount' )->numParams( $hitcount )->escaped();
- $hitcount = Linker::link( SpecialPage::getTitleFor( 'Recentchanges' ), $hitcount, array(), array( 'tagfilter' => $tag ) );
- $newRow .= Xml::tags( 'td', null, $hitcount );
+ $active = isset( $this->definedTags[$tag] ) ? 'tags-active-yes' : 'tags-active-no';
+ $active = $this->msg( $active )->escaped();
+ $newRow .= Xml::tags( 'td', null, $active );
+
+ $hitcountLabel = $this->msg( 'tags-hitcount' )->numParams( $hitcount )->escaped();
+ $hitcountLink = Linker::link(
+ SpecialPage::getTitleFor( 'Recentchanges' ),
+ $hitcountLabel,
+ array(),
+ array( 'tagfilter' => $tag )
+ );
- $doneTags[] = $tag;
+ // add raw $hitcount for sorting, because tags-hitcount contains numbers and letters
+ $newRow .= Xml::tags( 'td', array( 'data-sort-value' => $hitcount ), $hitcountLink );
return Xml::tags( 'tr', null, $newRow ) . "\n";
}
diff --git a/includes/specials/SpecialUnblock.php b/includes/specials/SpecialUnblock.php
index c4a53cf0..ca93b6d1 100644
--- a/includes/specials/SpecialUnblock.php
+++ b/includes/specials/SpecialUnblock.php
@@ -56,8 +56,8 @@ class SpecialUnblock extends SpecialPage {
$form->setSubmitTextMsg( 'ipusubmit' );
$form->addPreText( $this->msg( 'unblockiptext' )->parseAsBlock() );
- if( $form->show() ) {
- switch( $this->type ) {
+ if ( $form->show() ) {
+ switch ( $this->type ) {
case Block::TYPE_USER:
case Block::TYPE_IP:
$out->addWikiMsg( 'unblocked', wfEscapeWikiText( $this->target ) );
@@ -92,21 +92,21 @@ class SpecialUnblock extends SpecialPage {
)
);
- if( $this->block instanceof Block ) {
+ if ( $this->block instanceof Block ) {
list( $target, $type ) = $this->block->getTargetAndType();
# Autoblocks are logged as "autoblock #123 because the IP was recently used by
# User:Foo, and we've just got any block, auto or not, that applies to a target
# the user has specified. Someone could be fishing to connect IPs to autoblocks,
# so don't show any distinction between unblocked IPs and autoblocked IPs
- if( $type == Block::TYPE_AUTO && $this->type == Block::TYPE_IP ) {
+ if ( $type == Block::TYPE_AUTO && $this->type == Block::TYPE_IP ) {
$fields['Target']['default'] = $this->target;
unset( $fields['Name'] );
} else {
$fields['Target']['default'] = $target;
$fields['Target']['type'] = 'hidden';
- switch( $type ) {
+ switch ( $type ) {
case Block::TYPE_USER:
case Block::TYPE_IP:
$fields['Name']['default'] = Linker::link(
@@ -138,6 +138,8 @@ class SpecialUnblock extends SpecialPage {
/**
* Submit callback for an HTMLForm object
+ * @param array $data
+ * @param HTMLForm $form
* @return Array( Array(message key, parameters)
*/
public static function processUIUnblock( array $data, HTMLForm $form ) {
@@ -157,7 +159,7 @@ class SpecialUnblock extends SpecialPage {
$target = $data['Target'];
$block = Block::newFromTarget( $data['Target'] );
- if( !$block instanceof Block ) {
+ if ( !$block instanceof Block ) {
return array( array( 'ipb_cant_unblock', $target ) );
}
@@ -172,14 +174,14 @@ class SpecialUnblock extends SpecialPage {
# If the specified IP is a single address, and the block is a range block, don't
# unblock the whole range.
list( $target, $type ) = SpecialBlock::getTargetAndType( $target );
- if( $block->getType() == Block::TYPE_RANGE && $type == Block::TYPE_IP ) {
+ if ( $block->getType() == Block::TYPE_RANGE && $type == Block::TYPE_IP ) {
$range = $block->getTarget();
return array( array( 'ipb_blocked_as_range', $target, $range ) );
}
# If the name was hidden and the blocking user cannot hide
# names, then don't allow any block removals...
- if( !$performer->isAllowed( 'hideuser' ) && $block->mHideName ) {
+ if ( !$performer->isAllowed( 'hideuser' ) && $block->mHideName ) {
return array( 'unblock-hideuser' );
}
@@ -189,7 +191,7 @@ class SpecialUnblock extends SpecialPage {
}
# Unset _deleted fields as needed
- if( $block->mHideName ) {
+ if ( $block->mHideName ) {
# Something is deeply FUBAR if this is not a User object, but who knows?
$id = $block->getTarget() instanceof User
? $block->getTarget()->getID()
@@ -209,7 +211,7 @@ class SpecialUnblock extends SpecialPage {
# Make log entry
$log = new LogPage( 'block' );
- $log->addEntry( 'unblock', $page, $data['Reason'] );
+ $log->addEntry( 'unblock', $page, $data['Reason'], array(), $performer );
return true;
}
diff --git a/includes/specials/SpecialUncategorizedcategories.php b/includes/specials/SpecialUncategorizedcategories.php
index 54b20dde..1cc40a9e 100644
--- a/includes/specials/SpecialUncategorizedcategories.php
+++ b/includes/specials/SpecialUncategorizedcategories.php
@@ -34,11 +34,11 @@ class UncategorizedCategoriesPage extends UncategorizedPagesPage {
/**
* Formats the result
- * @param $skin The current skin
- * @param $result The query result
+ * @param Skin $skin The current skin
+ * @param object $result The query result
* @return string The category link
*/
- function formatResult ( $skin, $result ) {
+ function formatResult( $skin, $result ) {
$title = Title::makeTitle( NS_CATEGORY, $result->title );
$text = $title->getText();
diff --git a/includes/specials/SpecialUncategorizedimages.php b/includes/specials/SpecialUncategorizedimages.php
index 53aa3f34..3bfcedec 100644
--- a/includes/specials/SpecialUncategorizedimages.php
+++ b/includes/specials/SpecialUncategorizedimages.php
@@ -47,7 +47,7 @@ class UncategorizedImagesPage extends ImageQueryPage {
}
function getQueryInfo() {
- return array (
+ return array(
'tables' => array( 'page', 'categorylinks' ),
'fields' => array( 'namespace' => 'page_namespace',
'title' => 'page_title',
diff --git a/includes/specials/SpecialUncategorizedpages.php b/includes/specials/SpecialUncategorizedpages.php
index b518e6fb..8bc9e489 100644
--- a/includes/specials/SpecialUncategorizedpages.php
+++ b/includes/specials/SpecialUncategorizedpages.php
@@ -47,17 +47,17 @@ class UncategorizedPagesPage extends PageQueryPage {
}
function getQueryInfo() {
- return array (
- 'tables' => array ( 'page', 'categorylinks' ),
- 'fields' => array ( 'namespace' => 'page_namespace',
+ return array(
+ 'tables' => array( 'page', 'categorylinks' ),
+ 'fields' => array( 'namespace' => 'page_namespace',
'title' => 'page_title',
'value' => 'page_title' ),
// default for page_namespace is all content namespaces (if requestedNamespace is false)
// otherwise, page_namespace is requestedNamespace
- 'conds' => array ( 'cl_from IS NULL',
+ 'conds' => array( 'cl_from IS NULL',
'page_namespace' => ( $this->requestedNamespace !== false ? $this->requestedNamespace : MWNamespace::getContentNamespaces() ),
'page_is_redirect' => 0 ),
- 'join_conds' => array ( 'categorylinks' => array (
+ 'join_conds' => array( 'categorylinks' => array(
'LEFT JOIN', 'cl_from = page_id' ) )
);
}
@@ -65,8 +65,9 @@ class UncategorizedPagesPage extends PageQueryPage {
function getOrderFields() {
// For some crazy reason ordering by a constant
// causes a filesort
- if( $this->requestedNamespace === false && count( MWNamespace::getContentNamespaces() ) > 1 )
+ if ( $this->requestedNamespace === false && count( MWNamespace::getContentNamespaces() ) > 1 ) {
return array( 'page_namespace', 'page_title' );
+ }
return array( 'page_title' );
}
diff --git a/includes/specials/SpecialUndelete.php b/includes/specials/SpecialUndelete.php
index e0363481..d4aed113 100644
--- a/includes/specials/SpecialUndelete.php
+++ b/includes/specials/SpecialUndelete.php
@@ -27,7 +27,6 @@
* @ingroup SpecialPage
*/
class PageArchive {
-
/**
* @var Title
*/
@@ -44,7 +43,7 @@ class PageArchive {
protected $revisionStatus;
function __construct( $title ) {
- if( is_null( $title ) ) {
+ if ( is_null( $title ) ) {
throw new MWException( __METHOD__ . ' given a null title.' );
}
$this->title = $title;
@@ -67,14 +66,14 @@ class PageArchive {
* given title prefix.
* Returns result wrapper with (ar_namespace, ar_title, count) fields.
*
- * @param string $prefix title prefix
+ * @param string $prefix Title prefix
* @return ResultWrapper
*/
public static function listPagesByPrefix( $prefix ) {
$dbr = wfGetDB( DB_SLAVE );
$title = Title::newFromText( $prefix );
- if( $title ) {
+ if ( $title ) {
$ns = $title->getNamespace();
$prefix = $title->getDBkey();
} else {
@@ -82,36 +81,36 @@ class PageArchive {
// @todo handle bare namespace names cleanly?
$ns = 0;
}
+
$conds = array(
'ar_namespace' => $ns,
'ar_title' . $dbr->buildLike( $prefix, $dbr->anyString() ),
);
+
return self::listPages( $dbr, $conds );
}
/**
- * @param $dbr DatabaseBase
- * @param $condition
+ * @param DatabaseBase $dbr
+ * @param string|array $condition
* @return bool|ResultWrapper
*/
protected static function listPages( $dbr, $condition ) {
- return $dbr->resultObject(
- $dbr->select(
- array( 'archive' ),
- array(
- 'ar_namespace',
- 'ar_title',
- 'count' => 'COUNT(*)'
- ),
- $condition,
- __METHOD__,
- array(
- 'GROUP BY' => array( 'ar_namespace', 'ar_title' ),
- 'ORDER BY' => array( 'ar_namespace', 'ar_title' ),
- 'LIMIT' => 100,
- )
+ return $dbr->resultObject( $dbr->select(
+ array( 'archive' ),
+ array(
+ 'ar_namespace',
+ 'ar_title',
+ 'count' => 'COUNT(*)'
+ ),
+ $condition,
+ __METHOD__,
+ array(
+ 'GROUP BY' => array( 'ar_namespace', 'ar_title' ),
+ 'ORDER BY' => array( 'ar_namespace', 'ar_title' ),
+ 'LIMIT' => 100,
)
- );
+ ) );
}
/**
@@ -141,8 +140,8 @@ class PageArchive {
'ar_title' => $this->title->getDBkey() ),
__METHOD__,
array( 'ORDER BY' => 'ar_timestamp DESC' ) );
- $ret = $dbr->resultObject( $res );
- return $ret;
+
+ return $dbr->resultObject( $res );
}
/**
@@ -154,26 +153,28 @@ class PageArchive {
* @todo Does this belong in Image for fuller encapsulation?
*/
function listFiles() {
- if( $this->title->getNamespace() == NS_FILE ) {
- $dbr = wfGetDB( DB_SLAVE );
- $res = $dbr->select(
- 'filearchive',
- ArchivedFile::selectFields(),
- array( 'fa_name' => $this->title->getDBkey() ),
- __METHOD__,
- array( 'ORDER BY' => 'fa_timestamp DESC' ) );
- $ret = $dbr->resultObject( $res );
- return $ret;
+ if ( $this->title->getNamespace() != NS_FILE ) {
+ return null;
}
- return null;
+
+ $dbr = wfGetDB( DB_SLAVE );
+ $res = $dbr->select(
+ 'filearchive',
+ ArchivedFile::selectFields(),
+ array( 'fa_name' => $this->title->getDBkey() ),
+ __METHOD__,
+ array( 'ORDER BY' => 'fa_timestamp DESC' )
+ );
+
+ return $dbr->resultObject( $res );
}
/**
* Return a Revision object containing data for the deleted revision.
* Note that the result *may* or *may not* have a null page ID.
*
- * @param $timestamp String
- * @return Revision
+ * @param string $timestamp
+ * @return Revision|null
*/
function getRevision( $timestamp ) {
global $wgContentHandlerUseDB;
@@ -203,14 +204,15 @@ class PageArchive {
$row = $dbr->selectRow( 'archive',
$fields,
array( 'ar_namespace' => $this->title->getNamespace(),
- 'ar_title' => $this->title->getDBkey(),
- 'ar_timestamp' => $dbr->timestamp( $timestamp ) ),
+ 'ar_title' => $this->title->getDBkey(),
+ 'ar_timestamp' => $dbr->timestamp( $timestamp ) ),
__METHOD__ );
- if( $row ) {
+
+ if ( $row ) {
return Revision::newFromArchiveRow( $row, array( 'title' => $this->title ) );
- } else {
- return null;
}
+
+ return null;
}
/**
@@ -220,8 +222,8 @@ class PageArchive {
* May produce unexpected results in case of history merges or other
* unusual time issues.
*
- * @param $timestamp String
- * @return Revision or null
+ * @param string $timestamp
+ * @return Revision|null Null when there is no previous revision
*/
function getPreviousRevision( $timestamp ) {
$dbr = wfGetDB( DB_SLAVE );
@@ -246,7 +248,7 @@ class PageArchive {
'page_title' => $this->title->getDBkey(),
'page_id = rev_page',
'rev_timestamp < ' .
- $dbr->addQuotes( $dbr->timestamp( $timestamp ) ) ),
+ $dbr->addQuotes( $dbr->timestamp( $timestamp ) ) ),
__METHOD__,
array(
'ORDER BY' => 'rev_timestamp DESC',
@@ -254,38 +256,39 @@ class PageArchive {
$prevLive = $row ? wfTimestamp( TS_MW, $row->rev_timestamp ) : false;
$prevLiveId = $row ? intval( $row->rev_id ) : null;
- if( $prevLive && $prevLive > $prevDeleted ) {
+ if ( $prevLive && $prevLive > $prevDeleted ) {
// Most prior revision was live
return Revision::newFromId( $prevLiveId );
- } elseif( $prevDeleted ) {
+ } elseif ( $prevDeleted ) {
// Most prior revision was deleted
return $this->getRevision( $prevDeleted );
- } else {
- // No prior revision on this page.
- return null;
}
+
+ // No prior revision on this page.
+ return null;
}
/**
* Get the text from an archive row containing ar_text, ar_flags and ar_text_id
*
- * @param $row Object: database row
- * @return Revision
+ * @param object $row Database row
+ * @return string
*/
function getTextFromRow( $row ) {
- if( is_null( $row->ar_text_id ) ) {
+ if ( is_null( $row->ar_text_id ) ) {
// An old row from MediaWiki 1.4 or previous.
// Text is embedded in this row in classic compression format.
return Revision::getRevisionText( $row, 'ar_' );
- } else {
- // New-style: keyed to the text storage backend.
- $dbr = wfGetDB( DB_SLAVE );
- $text = $dbr->selectRow( 'text',
- array( 'old_text', 'old_flags' ),
- array( 'old_id' => $row->ar_text_id ),
- __METHOD__ );
- return Revision::getRevisionText( $text );
}
+
+ // New-style: keyed to the text storage backend.
+ $dbr = wfGetDB( DB_SLAVE );
+ $text = $dbr->selectRow( 'text',
+ array( 'old_text', 'old_flags' ),
+ array( 'old_id' => $row->ar_text_id ),
+ __METHOD__ );
+
+ return Revision::getRevisionText( $text );
}
/**
@@ -294,7 +297,7 @@ class PageArchive {
*
* If there are no archived revisions for the page, returns NULL.
*
- * @return String
+ * @return string|null
*/
function getLastRevisionText() {
$dbr = wfGetDB( DB_SLAVE );
@@ -304,17 +307,18 @@ class PageArchive {
'ar_title' => $this->title->getDBkey() ),
__METHOD__,
array( 'ORDER BY' => 'ar_timestamp DESC' ) );
- if( $row ) {
+
+ if ( $row ) {
return $this->getTextFromRow( $row );
- } else {
- return null;
}
+
+ return null;
}
/**
* Quick check if any archived revisions are present for the page.
*
- * @return Boolean
+ * @return boolean
*/
function isDeleted() {
$dbr = wfGetDB( DB_SLAVE );
@@ -323,6 +327,7 @@ class PageArchive {
'ar_title' => $this->title->getDBkey() ),
__METHOD__
);
+
return ( $n > 0 );
}
@@ -331,11 +336,11 @@ 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 $comment String
- * @param $fileVersions Array
- * @param $unsuppress Boolean
- * @param $user User doing the action, or null to use $wgUser
+ * @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 User $user User performing the action, or null to use $wgUser
*
* @return array(number of file revisions restored, number of image revisions restored, log message)
* on success, false on failure
@@ -348,7 +353,7 @@ class PageArchive {
$restoreText = $restoreAll || !empty( $timestamps );
$restoreFiles = $restoreAll || !empty( $fileVersions );
- if( $restoreFiles && $this->title->getNamespace() == NS_FILE ) {
+ if ( $restoreFiles && $this->title->getNamespace() == NS_FILE ) {
$img = wfLocalFile( $this->title );
$this->fileStatus = $img->restore( $fileVersions, $unsuppress );
if ( !$this->fileStatus->isOK() ) {
@@ -359,9 +364,9 @@ class PageArchive {
$filesRestored = 0;
}
- if( $restoreText ) {
+ if ( $restoreText ) {
$this->revisionStatus = $this->undeleteRevisions( $timestamps, $unsuppress, $comment );
- if( !$this->revisionStatus->isOK() ) {
+ if ( !$this->revisionStatus->isOK() ) {
return false;
}
@@ -372,13 +377,13 @@ class PageArchive {
// Touch the log!
- if( $textRestored && $filesRestored ) {
+ if ( $textRestored && $filesRestored ) {
$reason = wfMessage( 'undeletedrevisions-files' )
->numParams( $textRestored, $filesRestored )->inContentLanguage()->text();
- } elseif( $textRestored ) {
+ } elseif ( $textRestored ) {
$reason = wfMessage( 'undeletedrevisions' )->numParams( $textRestored )
->inContentLanguage()->text();
- } elseif( $filesRestored ) {
+ } elseif ( $filesRestored ) {
$reason = wfMessage( 'undeletedfiles' )->numParams( $filesRestored )
->inContentLanguage()->text();
} else {
@@ -386,7 +391,7 @@ class PageArchive {
return false;
}
- if( trim( $comment ) != '' ) {
+ if ( trim( $comment ) != '' ) {
$reason .= wfMessage( 'colon-separator' )->inContentLanguage()->text() . $comment;
}
@@ -413,12 +418,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 $unsuppress Boolean: remove all ar_deleted/fa_deleted restrictions of seletected revs
- *
- * @param $comment String
+ * @param array $timestamps Pass an empty array to restore all revisions, otherwise list the ones to undelete.
+ * @param bool $unsuppress Remove all ar_deleted/fa_deleted restrictions of seletected revs
+ * @param string $comment
* @throws ReadOnlyError
- * @return Status, containing the number of revisions restored on success
+ * @return Status Object containing the number of revisions restored on success
*/
private function undeleteRevisions( $timestamps, $unsuppress = false, $comment = '' ) {
global $wgContentHandlerUseDB;
@@ -426,8 +430,8 @@ class PageArchive {
if ( wfReadOnly() ) {
throw new ReadOnlyError();
}
- $restoreAll = empty( $timestamps );
+ $restoreAll = empty( $timestamps );
$dbw = wfGetDB( DB_MASTER );
# Does this page already exist? We'll have to update it...
@@ -443,7 +447,8 @@ class PageArchive {
__METHOD__,
array( 'FOR UPDATE' ) // lock page
);
- if( $page ) {
+
+ if ( $page ) {
$makepage = false;
# Page already exists. Import the history, and if necessary
# we'll update the latest revision field in the record.
@@ -455,7 +460,7 @@ class PageArchive {
array( 'rev_id' => $previousRevId ),
__METHOD__ );
- if( $previousTimestamp === false ) {
+ if ( $previousTimestamp === false ) {
wfDebug( __METHOD__ . ": existing page refers to a page_latest that does not exist\n" );
$status = Status::newGood( 0 );
@@ -470,7 +475,7 @@ class PageArchive {
$previousTimestamp = 0;
}
- if( $restoreAll ) {
+ if ( $restoreAll ) {
$oldones = '1 = 1'; # All revisions...
} else {
$oldts = implode( ',',
@@ -509,14 +514,15 @@ class PageArchive {
$fields,
/* WHERE */ array(
'ar_namespace' => $this->title->getNamespace(),
- 'ar_title' => $this->title->getDBkey(),
+ 'ar_title' => $this->title->getDBkey(),
$oldones ),
__METHOD__,
/* options */ array( 'ORDER BY' => 'ar_timestamp' )
);
$ret = $dbw->resultObject( $result );
$rev_count = $dbw->numRows( $result );
- if( !$rev_count ) {
+
+ if ( !$rev_count ) {
wfDebug( __METHOD__ . ": no revisions to restore\n" );
$status = Status::newGood( 0 );
@@ -544,9 +550,9 @@ class PageArchive {
return $status;
}
- if( $makepage ) {
+ if ( $makepage ) {
// Check the state of the newest to-be version...
- if( !$unsuppress && ( $row->ar_deleted & Revision::DELETED_TEXT ) ) {
+ if ( !$unsuppress && ( $row->ar_deleted & Revision::DELETED_TEXT ) ) {
return Status::newFatal( "undeleterevdel" );
}
// Safe to insert now...
@@ -554,9 +560,9 @@ class PageArchive {
$pageId = $newid;
} else {
// Check if a deleted revision will become the current revision...
- if( $row->ar_timestamp > $previousTimestamp ) {
+ if ( $row->ar_timestamp > $previousTimestamp ) {
// Check the state of the newest to-be version...
- if( !$unsuppress && ( $row->ar_deleted & Revision::DELETED_TEXT ) ) {
+ if ( !$unsuppress && ( $row->ar_deleted & Revision::DELETED_TEXT ) ) {
return Status::newFatal( "undeleterevdel" );
}
}
@@ -570,10 +576,10 @@ class PageArchive {
foreach ( $ret as $row ) {
// Check for key dupes due to shitty archive integrity.
- if( $row->ar_rev_id ) {
+ if ( $row->ar_rev_id ) {
$exists = $dbw->selectField( 'revision', '1',
array( 'rev_id' => $row->ar_rev_id ), __METHOD__ );
- if( $exists ) {
+ if ( $exists ) {
continue; // don't throw DB errors
}
}
@@ -616,7 +622,7 @@ class PageArchive {
wfRunHooks( 'ArticleUndelete', array( &$this->title, $created, $comment ) );
- if( $this->title->getNamespace() == NS_FILE ) {
+ if ( $this->title->getNamespace() == NS_FILE ) {
$update = new HTMLCacheUpdate( $this->title, 'imagelinks' );
$update->doUpdate();
}
@@ -627,12 +633,16 @@ class PageArchive {
/**
* @return Status
*/
- function getFileStatus() { return $this->fileStatus; }
+ function getFileStatus() {
+ return $this->fileStatus;
+ }
/**
* @return Status
*/
- function getRevisionStatus() { return $this->revisionStatus; }
+ function getRevisionStatus() {
+ return $this->revisionStatus;
+ }
}
/**
@@ -664,10 +674,13 @@ class SpecialUndelete extends SpecialPage {
} else {
$this->mTarget = $request->getVal( 'target' );
}
+
$this->mTargetObj = null;
+
if ( $this->mTarget !== null && $this->mTarget !== '' ) {
$this->mTargetObj = Title::newFromURL( $this->mTarget );
}
+
$this->mSearchPrefix = $request->getText( 'prefix' );
$time = $request->getVal( 'timestamp' );
$this->mTimestamp = $time ? wfTimestamp( TS_MW, $time ) : '';
@@ -698,16 +711,16 @@ class SpecialUndelete extends SpecialPage {
$this->mRestore = false;
}
- if( $this->mRestore || $this->mInvert ) {
+ if ( $this->mRestore || $this->mInvert ) {
$timestamps = array();
$this->mFileVersions = array();
- foreach( $request->getValues() as $key => $val ) {
+ foreach ( $request->getValues() as $key => $val ) {
$matches = array();
- if( preg_match( '/^ts(\d{14})$/', $key, $matches ) ) {
+ if ( preg_match( '/^ts(\d{14})$/', $key, $matches ) ) {
array_push( $timestamps, $matches[1] );
}
- if( preg_match( '/^fileid(\d+)$/', $key, $matches ) ) {
+ if ( preg_match( '/^fileid(\d+)$/', $key, $matches ) ) {
$this->mFileVersions[] = intval( $matches[1] );
}
}
@@ -747,13 +760,13 @@ class SpecialUndelete extends SpecialPage {
if ( $this->mTimestamp !== '' ) {
$this->showRevision( $this->mTimestamp );
- } elseif ( $this->mFilename !== null ) {
+ } elseif ( $this->mFilename !== null && $this->mTargetObj->inNamespace( NS_FILE ) ) {
$file = new ArchivedFile( $this->mTargetObj, '', $this->mFilename );
// Check if user is allowed to see this file
if ( !$file->exists() ) {
$out->addWikiMsg( 'filedelete-nofile', $this->mFilename );
} elseif ( !$file->userCan( File::DELETED_FILE, $user ) ) {
- if( $file->isDeleted( File::DELETED_RESTRICTED ) ) {
+ if ( $file->isDeleted( File::DELETED_RESTRICTED ) ) {
throw new PermissionsError( 'suppressrevision' );
} else {
throw new PermissionsError( 'deletedtext' );
@@ -776,22 +789,27 @@ class SpecialUndelete extends SpecialPage {
$out = $this->getOutput();
$out->setPageTitle( $this->msg( 'undelete-search-title' ) );
$out->addHTML(
- Xml::openElement( 'form', array(
- 'method' => 'get',
- 'action' => $wgScript ) ) .
- Xml::fieldset( $this->msg( 'undelete-search-box' )->text() ) .
- Html::hidden( 'title',
- $this->getTitle()->getPrefixedDBkey() ) .
- Xml::inputLabel( $this->msg( 'undelete-search-prefix' )->text(),
- 'prefix', 'prefix', 20,
- $this->mSearchPrefix ) . ' ' .
- Xml::submitButton( $this->msg( 'undelete-search-submit' )->text() ) .
- Xml::closeElement( 'fieldset' ) .
- Xml::closeElement( 'form' )
+ Xml::openElement( 'form', array( 'method' => 'get', 'action' => $wgScript ) ) .
+ Xml::fieldset( $this->msg( 'undelete-search-box' )->text() ) .
+ Html::hidden( 'title', $this->getTitle()->getPrefixedDBkey() ) .
+ Html::rawElement(
+ 'label',
+ array( 'for' => 'prefix' ),
+ $this->msg( 'undelete-search-prefix' )->parse()
+ ) .
+ Xml::input(
+ 'prefix',
+ 20,
+ $this->mSearchPrefix,
+ array( 'id' => 'prefix', 'autofocus' => true )
+ ) . ' ' .
+ Xml::submitButton( $this->msg( 'undelete-search-submit' )->text() ) .
+ Xml::closeElement( 'fieldset' ) .
+ Xml::closeElement( 'form' )
);
# List undeletable articles
- if( $this->mSearchPrefix ) {
+ if ( $this->mSearchPrefix ) {
$result = PageArchive::listPagesByPrefix( $this->mSearchPrefix );
$this->showList( $result );
}
@@ -800,13 +818,13 @@ class SpecialUndelete extends SpecialPage {
/**
* Generic list of deleted pages
*
- * @param $result ResultWrapper
+ * @param ResultWrapper $result
* @return bool
*/
private function showList( $result ) {
$out = $this->getOutput();
- if( $result->numRows() == 0 ) {
+ if ( $result->numRows() == 0 ) {
$out->addWikiMsg( 'undelete-no-results' );
return false;
}
@@ -826,8 +844,15 @@ class SpecialUndelete extends SpecialPage {
);
} else {
// The title is no longer valid, show as text
- $item = Html::element( 'span', array( 'class' => 'mw-invalidtitle' ),
- Linker::getInvalidTitleDescription( $this->getContext(), $row->ar_namespace, $row->ar_title ) );
+ $item = Html::element(
+ 'span',
+ array( 'class' => 'mw-invalidtitle' ),
+ Linker::getInvalidTitleDescription(
+ $this->getContext(),
+ $row->ar_namespace,
+ $row->ar_title
+ )
+ );
}
$revs = $this->msg( 'undeleterevisions' )->numParams( $row->count )->parse();
$out->addHTML( "<li>{$item} ({$revs})</li>\n" );
@@ -839,7 +864,7 @@ class SpecialUndelete extends SpecialPage {
}
private function showRevision( $timestamp ) {
- if( !preg_match( '/[0-9]{14}/', $timestamp ) ) {
+ if ( !preg_match( '/[0-9]{14}/', $timestamp ) ) {
return;
}
@@ -852,31 +877,37 @@ class SpecialUndelete extends SpecialPage {
$out = $this->getOutput();
$user = $this->getUser();
- if( !$rev ) {
+ if ( !$rev ) {
$out->addWikiMsg( 'undeleterevision-missing' );
return;
}
- if( $rev->isDeleted( Revision::DELETED_TEXT ) ) {
- if( !$rev->userCan( Revision::DELETED_TEXT, $user ) ) {
- $out->wrapWikiMsg( "<div class='mw-warning plainlinks'>\n$1\n</div>\n", 'rev-deleted-text-permission' );
+ if ( $rev->isDeleted( Revision::DELETED_TEXT ) ) {
+ if ( !$rev->userCan( Revision::DELETED_TEXT, $user ) ) {
+ $out->wrapWikiMsg(
+ "<div class='mw-warning plainlinks'>\n$1\n</div>\n",
+ 'rev-deleted-text-permission'
+ );
return;
- } else {
- $out->wrapWikiMsg( "<div class='mw-warning plainlinks'>\n$1\n</div>\n", 'rev-deleted-text-view' );
- $out->addHTML( '<br />' );
- // and we are allowed to see...
}
+
+ $out->wrapWikiMsg(
+ "<div class='mw-warning plainlinks'>\n$1\n</div>\n",
+ 'rev-deleted-text-view'
+ );
+ $out->addHTML( '<br />' );
+ // and we are allowed to see...
}
- if( $this->mDiff ) {
+ if ( $this->mDiff ) {
$previousRev = $archive->getPreviousRevision( $timestamp );
- if( $previousRev ) {
+ if ( $previousRev ) {
$this->showDiff( $previousRev, $rev );
- if( $this->mDiffOnly ) {
+ if ( $this->mDiffOnly ) {
return;
- } else {
- $out->addHTML( '<hr />' );
}
+
+ $out->addHTML( '<hr />' );
} else {
$out->addWikiMsg( 'undelete-nodiff' );
}
@@ -900,7 +931,7 @@ class SpecialUndelete extends SpecialPage {
$isText = ( $content instanceof TextContent );
- if( $this->mPreview || $isText ) {
+ if ( $this->mPreview || $isText ) {
$openDiv = '<div id="mw-undelete-revision" class="mw-warning">';
} else {
$openDiv = '<div id="mw-undelete-revision">';
@@ -922,7 +953,7 @@ class SpecialUndelete extends SpecialPage {
return;
}
- if( $this->mPreview || !$isText ) {
+ if ( $this->mPreview || !$isText ) {
// NOTE: non-text content has no source view, so always use rendered preview
// Hide [edit]s
@@ -935,16 +966,21 @@ class SpecialUndelete extends SpecialPage {
if ( $isText ) {
// source view for textual content
- $sourceView = Xml::element( 'textarea', array(
- 'readonly' => 'readonly',
- 'cols' => $user->getIntOption( 'cols' ),
- 'rows' => $user->getIntOption( 'rows' ) ),
- $content->getNativeData() . "\n" );
+ $sourceView = Xml::element(
+ 'textarea',
+ array(
+ 'readonly' => 'readonly',
+ 'cols' => $user->getIntOption( 'cols' ),
+ 'rows' => $user->getIntOption( 'rows' )
+ ),
+ $content->getNativeData() . "\n"
+ );
$previewButton = Xml::element( 'input', array(
'type' => 'submit',
'name' => 'preview',
- 'value' => $this->msg( 'showpreview' )->text() ) );
+ 'value' => $this->msg( 'showpreview' )->text()
+ ) );
} else {
$sourceView = '';
$previewButton = '';
@@ -957,36 +993,37 @@ class SpecialUndelete extends SpecialPage {
$out->addHTML(
$sourceView .
- Xml::openElement( 'div', array(
- 'style' => 'clear: both' ) ) .
- Xml::openElement( 'form', array(
- 'method' => 'post',
- 'action' => $this->getTitle()->getLocalURL( array( 'action' => 'submit' ) ) ) ) .
- Xml::element( 'input', array(
- 'type' => 'hidden',
- 'name' => 'target',
- 'value' => $this->mTargetObj->getPrefixedDBkey() ) ) .
- Xml::element( 'input', array(
- 'type' => 'hidden',
- 'name' => 'timestamp',
- 'value' => $timestamp ) ) .
- Xml::element( 'input', array(
- 'type' => 'hidden',
- 'name' => 'wpEditToken',
- 'value' => $user->getEditToken() ) ) .
- $previewButton .
- $diffButton .
- Xml::closeElement( 'form' ) .
- Xml::closeElement( 'div' ) );
+ Xml::openElement( 'div', array(
+ 'style' => 'clear: both' ) ) .
+ Xml::openElement( 'form', array(
+ 'method' => 'post',
+ 'action' => $this->getTitle()->getLocalURL( array( 'action' => 'submit' ) ) ) ) .
+ Xml::element( 'input', array(
+ 'type' => 'hidden',
+ 'name' => 'target',
+ 'value' => $this->mTargetObj->getPrefixedDBkey() ) ) .
+ Xml::element( 'input', array(
+ 'type' => 'hidden',
+ 'name' => 'timestamp',
+ 'value' => $timestamp ) ) .
+ Xml::element( 'input', array(
+ 'type' => 'hidden',
+ 'name' => 'wpEditToken',
+ 'value' => $user->getEditToken() ) ) .
+ $previewButton .
+ $diffButton .
+ Xml::closeElement( 'form' ) .
+ Xml::closeElement( 'div' )
+ );
}
/**
* Build a diff display between this and the previous either deleted
* or non-deleted edit.
*
- * @param $previousRev Revision
- * @param $currentRev Revision
- * @return String: HTML
+ * @param Revision $previousRev
+ * @param Revision $currentRev
+ * @return string HTML
*/
function showDiff( $previousRev, $currentRev ) {
$diffContext = clone $this->getContext();
@@ -995,20 +1032,19 @@ class SpecialUndelete extends SpecialPage {
$diffEngine = $currentRev->getContentHandler()->createDifferenceEngine( $diffContext );
$diffEngine->showDiffStyle();
- $this->getOutput()->addHTML(
- "<div>" .
+ $this->getOutput()->addHTML( "<div>" .
"<table style='width: 98%;' cellpadding='0' cellspacing='4' class='diff'>" .
"<col class='diff-marker' />" .
"<col class='diff-content' />" .
"<col class='diff-marker' />" .
"<col class='diff-content' />" .
"<tr>" .
- "<td colspan='2' style='width: 50%; text-align: center' class='diff-otitle'>" .
- $this->diffHeader( $previousRev, 'o' ) .
- "</td>\n" .
- "<td colspan='2' style='width: 50%; text-align: center' class='diff-ntitle'>" .
- $this->diffHeader( $currentRev, 'n' ) .
- "</td>\n" .
+ "<td colspan='2' style='width: 50%; text-align: center' class='diff-otitle'>" .
+ $this->diffHeader( $previousRev, 'o' ) .
+ "</td>\n" .
+ "<td colspan='2' style='width: 50%; text-align: center' class='diff-ntitle'>" .
+ $this->diffHeader( $currentRev, 'n' ) .
+ "</td>\n" .
"</tr>" .
$diffEngine->generateContentDiffBody(
$previousRev->getContent( Revision::FOR_THIS_USER, $this->getUser() ),
@@ -1019,13 +1055,13 @@ class SpecialUndelete extends SpecialPage {
}
/**
- * @param $rev Revision
- * @param $prefix
+ * @param Revision $rev
+ * @param string $prefix
* @return string
*/
private function diffHeader( $rev, $prefix ) {
$isDeleted = !( $rev->getId() && $rev->getTitle() );
- if( $isDeleted ) {
+ if ( $isDeleted ) {
/// @todo FIXME: $rev->getTitle() is null for deleted revs...?
$targetPage = $this->getTitle();
$targetQuery = array(
@@ -1037,30 +1073,34 @@ class SpecialUndelete extends SpecialPage {
$targetPage = $rev->getTitle();
$targetQuery = array( 'oldid' => $rev->getId() );
}
+
// Add show/hide deletion links if available
$user = $this->getUser();
$lang = $this->getLanguage();
$rdel = Linker::getRevDeleteLink( $user, $rev, $this->mTargetObj );
- if ( $rdel ) $rdel = " $rdel";
- return
- '<div id="mw-diff-' . $prefix . 'title1"><strong>' .
- Linker::link(
- $targetPage,
- $this->msg(
- 'revisionasof',
- $lang->userTimeAndDate( $rev->getTimestamp(), $user ),
- $lang->userDate( $rev->getTimestamp(), $user ),
- $lang->userTime( $rev->getTimestamp(), $user )
- )->escaped(),
- array(),
- $targetQuery
- ) .
+
+ if ( $rdel ) {
+ $rdel = " $rdel";
+ }
+
+ return '<div id="mw-diff-' . $prefix . 'title1"><strong>' .
+ Linker::link(
+ $targetPage,
+ $this->msg(
+ 'revisionasof',
+ $lang->userTimeAndDate( $rev->getTimestamp(), $user ),
+ $lang->userDate( $rev->getTimestamp(), $user ),
+ $lang->userTime( $rev->getTimestamp(), $user )
+ )->escaped(),
+ array(),
+ $targetQuery
+ ) .
'</strong></div>' .
'<div id="mw-diff-' . $prefix . 'title2">' .
- Linker::revUserTools( $rev ) . '<br />' .
+ Linker::revUserTools( $rev ) . '<br />' .
'</div>' .
'<div id="mw-diff-' . $prefix . 'title3">' .
- Linker::revComment( $rev ) . $rdel . '<br />' .
+ Linker::revComment( $rev ) . $rdel . '<br />' .
'</div>';
}
@@ -1078,15 +1118,16 @@ class SpecialUndelete extends SpecialPage {
$lang->userTime( $file->getTimestamp(), $user ) );
$out->addHTML(
Xml::openElement( 'form', array(
- 'method' => 'POST',
- 'action' => $this->getTitle()->getLocalURL(
- 'target=' . urlencode( $this->mTarget ) .
- '&file=' . urlencode( $key ) .
- '&token=' . urlencode( $user->getEditToken( $key ) ) )
+ 'method' => 'POST',
+ 'action' => $this->getTitle()->getLocalURL( array(
+ 'target' => $this->mTarget,
+ 'file' => $key,
+ 'token' => $user->getEditToken( $key ),
+ ) ),
)
) .
- Xml::submitButton( $this->msg( 'undelete-show-file-submit' )->text() ) .
- '</form>'
+ Xml::submitButton( $this->msg( 'undelete-show-file-submit' )->text() ) .
+ '</form>'
);
}
@@ -1112,7 +1153,7 @@ class SpecialUndelete extends SpecialPage {
private function showHistory() {
$out = $this->getOutput();
- if( $this->mAllowed ) {
+ if ( $this->mAllowed ) {
$out->addModules( 'mediawiki.special.undelete' );
}
$out->wrapWikiMsg(
@@ -1146,7 +1187,7 @@ class SpecialUndelete extends SpecialPage {
$haveFiles = $files && $files->numRows() > 0;
# Batch existence check on user and talk pages
- if( $haveRevisions ) {
+ if ( $haveRevisions ) {
$batch = new LinkBatch();
foreach ( $revisions as $row ) {
$batch->addObj( Title::makeTitleSafe( NS_USER, $row->ar_user_text ) );
@@ -1155,7 +1196,7 @@ class SpecialUndelete extends SpecialPage {
$batch->execute();
$revisions->seek( 0 );
}
- if( $haveFiles ) {
+ if ( $haveFiles ) {
$batch = new LinkBatch();
foreach ( $files as $row ) {
$batch->addObj( Title::makeTitleSafe( NS_USER, $row->fa_user_text ) );
@@ -1168,7 +1209,10 @@ class SpecialUndelete extends SpecialPage {
if ( $this->mAllowed ) {
$action = $this->getTitle()->getLocalURL( array( 'action' => 'submit' ) );
# Start the form here
- $top = Xml::openElement( 'form', array( 'method' => 'post', 'action' => $action, 'id' => 'undelete' ) );
+ $top = Xml::openElement(
+ 'form',
+ array( 'method' => 'post', 'action' => $action, 'id' => 'undelete' )
+ );
$out->addHTML( $top );
}
@@ -1178,59 +1222,60 @@ class SpecialUndelete extends SpecialPage {
LogEventsList::showLogExtract( $out, 'delete', $this->mTargetObj );
# Show relevant lines from the suppression log:
$suppressLogPage = new LogPage( 'suppress' );
- if( $this->getUser()->isAllowed( 'suppressionlog' ) ) {
+ if ( $this->getUser()->isAllowed( 'suppressionlog' ) ) {
$out->addHTML( Xml::element( 'h2', null, $suppressLogPage->getName()->text() ) . "\n" );
LogEventsList::showLogExtract( $out, 'suppress', $this->mTargetObj );
}
- if( $this->mAllowed && ( $haveRevisions || $haveFiles ) ) {
+ if ( $this->mAllowed && ( $haveRevisions || $haveFiles ) ) {
# Format the user-visible controls (comment field, submission button)
# in a nice little table
- if( $this->getUser()->isAllowed( 'suppressrevision' ) ) {
+ if ( $this->getUser()->isAllowed( 'suppressrevision' ) ) {
$unsuppressBox =
"<tr>
<td>&#160;</td>
<td class='mw-input'>" .
- Xml::checkLabel( $this->msg( 'revdelete-unsuppress' )->text(),
- 'wpUnsuppress', 'mw-undelete-unsuppress', $this->mUnsuppress ).
+ Xml::checkLabel( $this->msg( 'revdelete-unsuppress' )->text(),
+ 'wpUnsuppress', 'mw-undelete-unsuppress', $this->mUnsuppress ) .
"</td>
</tr>";
} else {
$unsuppressBox = '';
}
+
$table =
Xml::fieldset( $this->msg( 'undelete-fieldset-title' )->text() ) .
- Xml::openElement( 'table', array( 'id' => 'mw-undelete-table' ) ) .
+ Xml::openElement( 'table', array( 'id' => 'mw-undelete-table' ) ) .
"<tr>
<td colspan='2' class='mw-undelete-extrahelp'>" .
- $this->msg( 'undeleteextrahelp' )->parseAsBlock() .
- "</td>
- </tr>
- <tr>
- <td class='mw-label'>" .
- Xml::label( $this->msg( 'undeletecomment' )->text(), 'wpComment' ) .
- "</td>
- <td class='mw-input'>" .
- Xml::input( 'wpComment', 50, $this->mComment, array( 'id' => 'wpComment' ) ) .
- "</td>
- </tr>
- <tr>
- <td>&#160;</td>
- <td class='mw-submit'>" .
- Xml::submitButton( $this->msg( 'undeletebtn' )->text(), array( 'name' => 'restore', 'id' => 'mw-undelete-submit' ) ) . ' ' .
- Xml::submitButton( $this->msg( 'undeleteinvert' )->text(), array( 'name' => 'invert', 'id' => 'mw-undelete-invert' ) ) .
- "</td>
- </tr>" .
+ $this->msg( 'undeleteextrahelp' )->parseAsBlock() .
+ "</td>
+ </tr>
+ <tr>
+ <td class='mw-label'>" .
+ Xml::label( $this->msg( 'undeletecomment' )->text(), 'wpComment' ) .
+ "</td>
+ <td class='mw-input'>" .
+ Xml::input( 'wpComment', 50, $this->mComment, array( 'id' => 'wpComment', 'autofocus' => true ) ) .
+ "</td>
+ </tr>
+ <tr>
+ <td>&#160;</td>
+ <td class='mw-submit'>" .
+ Xml::submitButton( $this->msg( 'undeletebtn' )->text(), array( 'name' => 'restore', 'id' => 'mw-undelete-submit' ) ) . ' ' .
+ Xml::submitButton( $this->msg( 'undeleteinvert' )->text(), array( 'name' => 'invert', 'id' => 'mw-undelete-invert' ) ) .
+ "</td>
+ </tr>" .
$unsuppressBox .
- Xml::closeElement( 'table' ) .
- Xml::closeElement( 'fieldset' );
+ Xml::closeElement( 'table' ) .
+ Xml::closeElement( 'fieldset' );
$out->addHTML( $table );
}
$out->addHTML( Xml::element( 'h2', null, $this->msg( 'history' )->text() ) . "\n" );
- if( $haveRevisions ) {
+ if ( $haveRevisions ) {
# The page's stored (deleted) history:
$out->addHTML( '<ul>' );
$remaining = $revisions->numRows();
@@ -1246,7 +1291,7 @@ class SpecialUndelete extends SpecialPage {
$out->addWikiMsg( 'nohistory' );
}
- if( $haveFiles ) {
+ if ( $haveFiles ) {
$out->addHTML( Xml::element( 'h2', null, $this->msg( 'filehist' )->text() ) . "\n" );
$out->addHTML( '<ul>' );
foreach ( $files as $row ) {
@@ -1276,9 +1321,9 @@ class SpecialUndelete extends SpecialPage {
$revTextSize = '';
$ts = wfTimestamp( TS_MW, $row->ar_timestamp );
// Build checkboxen...
- if( $this->mAllowed ) {
- if( $this->mInvert ) {
- if( in_array( $ts, $this->mTargetTimestamp ) ) {
+ if ( $this->mAllowed ) {
+ if ( $this->mInvert ) {
+ if ( in_array( $ts, $this->mTargetTimestamp ) ) {
$checkBox = Xml::check( "ts$ts" );
} else {
$checkBox = Xml::check( "ts$ts", true );
@@ -1289,15 +1334,16 @@ class SpecialUndelete extends SpecialPage {
} else {
$checkBox = '';
}
- $user = $this->getUser();
+
// Build page & diff links...
- if( $this->mCanView ) {
+ $user = $this->getUser();
+ if ( $this->mCanView ) {
$titleObj = $this->getTitle();
# Last link
- if( !$rev->userCan( Revision::DELETED_TEXT, $this->getUser() ) ) {
+ if ( !$rev->userCan( Revision::DELETED_TEXT, $this->getUser() ) ) {
$pageLink = htmlspecialchars( $this->getLanguage()->userTimeAndDate( $ts, $user ) );
$last = $this->msg( 'diff' )->escaped();
- } elseif( $remaining > 0 || ( $earliestLiveTime && $ts > $earliestLiveTime ) ) {
+ } elseif ( $remaining > 0 || ( $earliestLiveTime && $ts > $earliestLiveTime ) ) {
$pageLink = $this->getPageLink( $rev, $titleObj, $ts );
$last = Linker::linkKnown(
$titleObj,
@@ -1317,28 +1363,35 @@ class SpecialUndelete extends SpecialPage {
$pageLink = htmlspecialchars( $this->getLanguage()->userTimeAndDate( $ts, $user ) );
$last = $this->msg( 'diff' )->escaped();
}
+
// User links
$userLink = Linker::revUserTools( $rev );
+
// Revision text size
$size = $row->ar_len;
- if( !is_null( $size ) ) {
+ if ( !is_null( $size ) ) {
$revTextSize = Linker::formatRevisionSize( $size );
}
+
// Edit summary
$comment = Linker::revComment( $rev );
+
// Revision delete links
$revdlink = Linker::getRevDeleteLink( $user, $rev, $this->mTargetObj );
- $revisionRow = $this->msg( 'undelete-revisionrow' )->rawParams( $checkBox, $revdlink, $last, $pageLink, $userLink, $revTextSize, $comment )->escaped();
+ $revisionRow = $this->msg( 'undelete-revisionrow' )
+ ->rawParams( $checkBox, $revdlink, $last, $pageLink, $userLink, $revTextSize, $comment )
+ ->escaped();
+
return "<li>$revisionRow</li>";
}
private function formatFileRow( $row ) {
$file = ArchivedFile::newFromRow( $row );
-
$ts = wfTimestamp( TS_MW, $row->fa_timestamp );
$user = $this->getUser();
- if( $this->mAllowed && $row->fa_storage_key ) {
+
+ if ( $this->mAllowed && $row->fa_storage_key ) {
$checkBox = Xml::check( 'fileid' . $row->fa_id );
$key = urlencode( $row->fa_storage_key );
$pageLink = $this->getFileLink( $file, $this->getTitle(), $ts, $key );
@@ -1348,15 +1401,18 @@ class SpecialUndelete extends SpecialPage {
}
$userLink = $this->getFileUser( $file );
$data = $this->msg( 'widthheight' )->numParams( $row->fa_width, $row->fa_height )->text();
- $bytes = $this->msg( 'parentheses' )->rawParams( $this->msg( 'nbytes' )->numParams( $row->fa_size )->text() )->plain();
+ $bytes = $this->msg( 'parentheses' )
+ ->rawParams( $this->msg( 'nbytes' )->numParams( $row->fa_size )->text() )
+ ->plain();
$data = htmlspecialchars( $data . ' ' . $bytes );
$comment = $this->getFileComment( $file );
// Add show/hide deletion links if available
$canHide = $user->isAllowed( 'deleterevision' );
- if( $canHide || ( $file->getVisibility() && $user->isAllowed( 'deletedhistory' ) ) ) {
- if( !$file->userCan( File::DELETED_RESTRICTED, $user ) ) {
- $revdlink = Linker::revDeleteLinkDisabled( $canHide ); // revision was hidden from sysops
+ if ( $canHide || ( $file->getVisibility() && $user->isAllowed( 'deletedhistory' ) ) ) {
+ if ( !$file->userCan( File::DELETED_RESTRICTED, $user ) ) {
+ // Revision was hidden from sysops
+ $revdlink = Linker::revDeleteLinkDisabled( $canHide );
} else {
$query = array(
'type' => 'filearchive',
@@ -1376,8 +1432,8 @@ class SpecialUndelete extends SpecialPage {
/**
* Fetch revision text link if it's available to all users
*
- * @param $rev Revision
- * @param $titleObj Title
+ * @param Revision $rev
+ * @param Title $titleObj
* @param string $ts Timestamp
* @return string
*/
@@ -1385,95 +1441,105 @@ class SpecialUndelete extends SpecialPage {
$user = $this->getUser();
$time = $this->getLanguage()->userTimeAndDate( $ts, $user );
- if( !$rev->userCan( Revision::DELETED_TEXT, $user ) ) {
+ if ( !$rev->userCan( Revision::DELETED_TEXT, $user ) ) {
return '<span class="history-deleted">' . $time . '</span>';
- } else {
- $link = Linker::linkKnown(
- $titleObj,
- htmlspecialchars( $time ),
- array(),
- array(
- 'target' => $this->mTargetObj->getPrefixedText(),
- 'timestamp' => $ts
- )
- );
- if( $rev->isDeleted( Revision::DELETED_TEXT ) ) {
- $link = '<span class="history-deleted">' . $link . '</span>';
- }
- return $link;
}
+
+ $link = Linker::linkKnown(
+ $titleObj,
+ htmlspecialchars( $time ),
+ array(),
+ array(
+ 'target' => $this->mTargetObj->getPrefixedText(),
+ 'timestamp' => $ts
+ )
+ );
+
+ if ( $rev->isDeleted( Revision::DELETED_TEXT ) ) {
+ $link = '<span class="history-deleted">' . $link . '</span>';
+ }
+
+ return $link;
}
/**
* Fetch image view link if it's available to all users
*
- * @param $file File
- * @param $titleObj Title
+ * @param File|ArchivedFile $file
+ * @param Title $titleObj
* @param string $ts A timestamp
* @param string $key a storage key
*
- * @return String: HTML fragment
+ * @return string HTML fragment
*/
function getFileLink( $file, $titleObj, $ts, $key ) {
$user = $this->getUser();
$time = $this->getLanguage()->userTimeAndDate( $ts, $user );
- if( !$file->userCan( File::DELETED_FILE, $user ) ) {
+ if ( !$file->userCan( File::DELETED_FILE, $user ) ) {
return '<span class="history-deleted">' . $time . '</span>';
- } else {
- $link = Linker::linkKnown(
- $titleObj,
- htmlspecialchars( $time ),
- array(),
- array(
- 'target' => $this->mTargetObj->getPrefixedText(),
- 'file' => $key,
- 'token' => $user->getEditToken( $key )
- )
- );
- if( $file->isDeleted( File::DELETED_FILE ) ) {
- $link = '<span class="history-deleted">' . $link . '</span>';
- }
- return $link;
}
+
+ $link = Linker::linkKnown(
+ $titleObj,
+ htmlspecialchars( $time ),
+ array(),
+ array(
+ 'target' => $this->mTargetObj->getPrefixedText(),
+ 'file' => $key,
+ 'token' => $user->getEditToken( $key )
+ )
+ );
+
+ if ( $file->isDeleted( File::DELETED_FILE ) ) {
+ $link = '<span class="history-deleted">' . $link . '</span>';
+ }
+
+ return $link;
}
/**
* Fetch file's user id if it's available to this user
*
- * @param $file File
- * @return String: HTML fragment
+ * @param File|ArchivedFile $file
+ * @return string HTML fragment
*/
function getFileUser( $file ) {
- if( !$file->userCan( File::DELETED_USER, $this->getUser() ) ) {
- return '<span class="history-deleted">' . $this->msg( 'rev-deleted-user' )->escaped() . '</span>';
- } else {
- $link = Linker::userLink( $file->getRawUser(), $file->getRawUserText() ) .
- Linker::userToolLinks( $file->getRawUser(), $file->getRawUserText() );
- if( $file->isDeleted( File::DELETED_USER ) ) {
- $link = '<span class="history-deleted">' . $link . '</span>';
- }
- return $link;
+ if ( !$file->userCan( File::DELETED_USER, $this->getUser() ) ) {
+ return '<span class="history-deleted">' .
+ $this->msg( 'rev-deleted-user' )->escaped() .
+ '</span>';
}
+
+ $link = Linker::userLink( $file->getRawUser(), $file->getRawUserText() ) .
+ Linker::userToolLinks( $file->getRawUser(), $file->getRawUserText() );
+
+ if ( $file->isDeleted( File::DELETED_USER ) ) {
+ $link = '<span class="history-deleted">' . $link . '</span>';
+ }
+
+ return $link;
}
/**
* Fetch file upload comment if it's available to this user
*
- * @param $file File
- * @return String: HTML fragment
+ * @param File|ArchivedFile $file
+ * @return string HTML fragment
*/
function getFileComment( $file ) {
- if( !$file->userCan( File::DELETED_COMMENT, $this->getUser() ) ) {
+ if ( !$file->userCan( File::DELETED_COMMENT, $this->getUser() ) ) {
return '<span class="history-deleted"><span class="comment">' .
$this->msg( 'rev-deleted-comment' )->escaped() . '</span></span>';
- } else {
- $link = Linker::commentBlock( $file->getRawDescription() );
- if( $file->isDeleted( File::DELETED_COMMENT ) ) {
- $link = '<span class="history-deleted">' . $link . '</span>';
- }
- return $link;
}
+
+ $link = Linker::commentBlock( $file->getRawDescription() );
+
+ if ( $file->isDeleted( File::DELETED_COMMENT ) ) {
+ $link = '<span class="history-deleted">' . $link . '</span>';
+ }
+
+ return $link;
}
function undelete() {
@@ -1498,7 +1564,7 @@ class SpecialUndelete extends SpecialPage {
$this->getUser()
);
- if( is_array( $ok ) ) {
+ if ( is_array( $ok ) ) {
if ( $ok[1] ) { // Undeleted file count
wfRunHooks( 'FileUndeleteComplete', array(
$this->mTargetObj, $this->mFileVersions,
@@ -1513,13 +1579,13 @@ class SpecialUndelete extends SpecialPage {
// Show revision undeletion warnings and errors
$status = $archive->getRevisionStatus();
- if( $status && !$status->isGood() ) {
+ if ( $status && !$status->isGood() ) {
$out->addWikiText( '<div class="error">' . $status->getWikiText( 'cannotundelete', 'cannotundelete' ) . '</div>' );
}
// Show file undeletion warnings and errors
$status = $archive->getFileStatus();
- if( $status && !$status->isGood() ) {
+ if ( $status && !$status->isGood() ) {
$out->addWikiText( '<div class="error">' . $status->getWikiText( 'undelete-error-short', 'undelete-error-long' ) . '</div>' );
}
}
diff --git a/includes/specials/SpecialUnusedcategories.php b/includes/specials/SpecialUnusedcategories.php
index 6b91dd39..b686a5b5 100644
--- a/includes/specials/SpecialUnusedcategories.php
+++ b/includes/specials/SpecialUnusedcategories.php
@@ -39,15 +39,15 @@ class UnusedCategoriesPage extends QueryPage {
}
function getQueryInfo() {
- return array (
- 'tables' => array ( 'page', 'categorylinks' ),
- 'fields' => array ( 'namespace' => 'page_namespace',
+ return array(
+ 'tables' => array( 'page', 'categorylinks' ),
+ 'fields' => array( 'namespace' => 'page_namespace',
'title' => 'page_title',
'value' => 'page_title' ),
- 'conds' => array ( 'cl_from IS NULL',
+ 'conds' => array( 'cl_from IS NULL',
'page_namespace' => NS_CATEGORY,
'page_is_redirect' => 0 ),
- 'join_conds' => array ( 'categorylinks' => array (
+ 'join_conds' => array( 'categorylinks' => array(
'LEFT JOIN', 'cl_to = page_title' ) )
);
}
@@ -60,6 +60,11 @@ class UnusedCategoriesPage extends QueryPage {
return false;
}
+ /**
+ * @param Skin $skin
+ * @param object $result Result row
+ * @return string
+ */
function formatResult( $skin, $result ) {
$title = Title::makeTitle( NS_CATEGORY, $result->title );
return Linker::link( $title, htmlspecialchars( $title->getText() ) );
diff --git a/includes/specials/SpecialUnusedimages.php b/includes/specials/SpecialUnusedimages.php
index 69553282..d332db75 100644
--- a/includes/specials/SpecialUnusedimages.php
+++ b/includes/specials/SpecialUnusedimages.php
@@ -45,28 +45,28 @@ class UnusedimagesPage extends ImageQueryPage {
function getQueryInfo() {
global $wgCountCategorizedImagesAsUsed;
- $retval = array (
- 'tables' => array ( 'image', 'imagelinks' ),
- 'fields' => array ( 'namespace' => NS_FILE,
+ $retval = array(
+ 'tables' => array( 'image', 'imagelinks' ),
+ 'fields' => array( 'namespace' => NS_FILE,
'title' => 'img_name',
'value' => 'img_timestamp',
'img_user', 'img_user_text',
'img_description' ),
- 'conds' => array ( 'il_to IS NULL' ),
- 'join_conds' => array ( 'imagelinks' => array (
+ 'conds' => array( 'il_to IS NULL' ),
+ 'join_conds' => array( 'imagelinks' => array(
'LEFT JOIN', 'il_to = img_name' ) )
);
if ( $wgCountCategorizedImagesAsUsed ) {
// Order is significant
- $retval['tables'] = array ( 'image', 'page', 'categorylinks',
+ $retval['tables'] = array( 'image', 'page', 'categorylinks',
'imagelinks' );
$retval['conds']['page_namespace'] = NS_FILE;
$retval['conds'][] = 'cl_from IS NULL';
$retval['conds'][] = 'img_name = page_title';
- $retval['join_conds']['categorylinks'] = array (
+ $retval['join_conds']['categorylinks'] = array(
'LEFT JOIN', 'cl_from = page_id' );
- $retval['join_conds']['imagelinks'] = array (
+ $retval['join_conds']['imagelinks'] = array(
'LEFT JOIN', 'il_to = page_title' );
}
return $retval;
diff --git a/includes/specials/SpecialUnusedtemplates.php b/includes/specials/SpecialUnusedtemplates.php
index 493e936a..1dc9f420 100644
--- a/includes/specials/SpecialUnusedtemplates.php
+++ b/includes/specials/SpecialUnusedtemplates.php
@@ -48,23 +48,23 @@ class UnusedtemplatesPage extends QueryPage {
}
function getQueryInfo() {
- return array (
- 'tables' => array ( 'page', 'templatelinks' ),
- 'fields' => array ( 'namespace' => 'page_namespace',
+ return array(
+ 'tables' => array( 'page', 'templatelinks' ),
+ 'fields' => array( 'namespace' => 'page_namespace',
'title' => 'page_title',
'value' => 'page_title' ),
- 'conds' => array ( 'page_namespace' => NS_TEMPLATE,
+ 'conds' => array( 'page_namespace' => NS_TEMPLATE,
'tl_from IS NULL',
'page_is_redirect' => 0 ),
- 'join_conds' => array ( 'templatelinks' => array (
- 'LEFT JOIN', array ( 'tl_title = page_title',
+ 'join_conds' => array( 'templatelinks' => array(
+ 'LEFT JOIN', array( 'tl_title = page_title',
'tl_namespace = page_namespace' ) ) )
);
}
/**
- * @param $skin Skin
- * @param $result
+ * @param Skin $skin
+ * @param object $result Result row
* @return string
*/
function formatResult( $skin, $result ) {
diff --git a/includes/specials/SpecialUnwatchedpages.php b/includes/specials/SpecialUnwatchedpages.php
index 05ec6b02..954e3ffe 100644
--- a/includes/specials/SpecialUnwatchedpages.php
+++ b/includes/specials/SpecialUnwatchedpages.php
@@ -44,17 +44,17 @@ class UnwatchedpagesPage extends QueryPage {
}
function getQueryInfo() {
- return array (
- 'tables' => array ( 'page', 'watchlist' ),
- 'fields' => array ( 'namespace' => 'page_namespace',
+ return array(
+ 'tables' => array( 'page', 'watchlist' ),
+ 'fields' => array( 'namespace' => 'page_namespace',
'title' => 'page_title',
'value' => 'page_namespace' ),
- 'conds' => array ( 'wl_title IS NULL',
+ 'conds' => array( 'wl_title IS NULL',
'page_is_redirect' => 0,
"page_namespace != '" . NS_MEDIAWIKI .
"'" ),
- 'join_conds' => array ( 'watchlist' => array (
- 'LEFT JOIN', array ( 'wl_title = page_title',
+ 'join_conds' => array( 'watchlist' => array(
+ 'LEFT JOIN', array( 'wl_title = page_title',
'wl_namespace = page_namespace' ) ) )
);
}
@@ -68,8 +68,8 @@ class UnwatchedpagesPage extends QueryPage {
}
/**
- * @param $skin Skin
- * @param $result
+ * @param Skin $skin
+ * @param object $result Result row
* @return string
*/
function formatResult( $skin, $result ) {
diff --git a/includes/specials/SpecialUpload.php b/includes/specials/SpecialUpload.php
index 89c06b2a..09facf4f 100644
--- a/includes/specials/SpecialUpload.php
+++ b/includes/specials/SpecialUpload.php
@@ -90,10 +90,9 @@ class SpecialUpload extends SpecialPage {
// 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' );
$this->mDestWarningAck = $request->getText( 'wpDestFileWarningAck' );
@@ -104,6 +103,14 @@ class SpecialUpload extends SpecialPage {
$this->mCopyrightSource = $request->getText( 'wpUploadSource' );
$this->mForReUpload = $request->getBool( 'wpForReUpload' ); // updating a file
+
+ $commentDefault = '';
+ $commentMsg = wfMessage( 'upload-default-description' )->inContentLanguage();
+ if ( !$this->mForReUpload && !$commentMsg->isDisabled() ) {
+ $commentDefault = $commentMsg->plain();
+ }
+ $this->mComment = $request->getText( 'wpUploadDescription', $commentDefault );
+
$this->mCancelUpload = $request->getCheck( 'wpCancelUpload' )
|| $request->getCheck( 'wpReUpload' ); // b/w compat
@@ -135,19 +142,19 @@ class SpecialUpload extends SpecialPage {
$this->outputHeader();
# Check uploading enabled
- if( !UploadBase::isEnabled() ) {
+ if ( !UploadBase::isEnabled() ) {
throw new ErrorPageError( 'uploaddisabled', 'uploaddisabledtext' );
}
# Check permissions
$user = $this->getUser();
$permissionRequired = UploadBase::isAllowed( $user );
- if( $permissionRequired !== true ) {
+ if ( $permissionRequired !== true ) {
throw new PermissionsError( $permissionRequired );
}
# Check blocks
- if( $user->isBlocked() ) {
+ if ( $user->isBlocked() ) {
throw new UserBlockedError( $user->getBlock() );
}
@@ -172,7 +179,7 @@ class SpecialUpload extends SpecialPage {
$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;
}
@@ -214,6 +221,8 @@ class SpecialUpload extends SpecialPage {
*/
protected function getUploadForm( $message = '', $sessionKey = '', $hideIgnoreWarning = false ) {
# Initialize form
+ $context = new DerivativeContext( $this->getContext() );
+ $context->setTitle( $this->getTitle() ); // Remove subpage
$form = new UploadForm( array(
'watch' => $this->getWatchCheck(),
'forreupload' => $this->mForReUpload,
@@ -225,11 +234,10 @@ class SpecialUpload extends SpecialPage {
'texttop' => $this->uploadFormTextTop,
'textaftersummary' => $this->uploadFormTextAfterSummary,
'destfile' => $this->mDesiredDestName,
- ), $this->getContext() );
- $form->setTitle( $this->getTitle() );
+ ), $context );
# Check the token, but only if necessary
- if(
+ if (
!$this->mTokenOk && !$this->mCancelUpload &&
( $this->mUpload && $this->mUploadClicked )
) {
@@ -275,7 +283,7 @@ class SpecialUpload extends SpecialPage {
$title = Title::makeTitleSafe( NS_FILE, $this->mDesiredDestName );
$user = $this->getUser();
// Show a subtitle link to deleted revisions (to sysops et al only)
- if( $title instanceof Title ) {
+ if ( $title instanceof Title ) {
$count = $title->isDeleted();
if ( $count > 0 && $user->isAllowed( 'deletedhistory' ) ) {
$restorelink = Linker::linkKnown(
@@ -333,15 +341,15 @@ class SpecialUpload extends SpecialPage {
$warningHtml = '<h2>' . $this->msg( 'uploadwarning' )->escaped() . "</h2>\n"
. '<ul class="warning">';
- foreach( $warnings as $warning => $args ) {
- if( $warning == 'badfilename' ) {
+ foreach ( $warnings as $warning => $args ) {
+ if ( $warning == 'badfilename' ) {
$this->mDesiredDestName = Title::makeTitle( NS_FILE, $args )->getText();
}
- if( $warning == 'exists' ) {
+ if ( $warning == 'exists' ) {
$msg = "\t<li>" . self::getExistsWarning( $args ) . "</li>\n";
- } elseif( $warning == 'duplicate' ) {
- $msg = self::getDupeWarning( $args );
- } elseif( $warning == 'duplicate-archive' ) {
+ } elseif ( $warning == 'duplicate' ) {
+ $msg = $this->getDupeWarning( $args );
+ } elseif ( $warning == 'duplicate-archive' ) {
$msg = "\t<li>" . $this->msg( 'file-deleted-duplicate',
Title::makeTitle( NS_FILE, $args )->getPrefixedText() )->parse()
. "</li>\n";
@@ -387,12 +395,12 @@ class SpecialUpload extends SpecialPage {
protected function processUpload() {
// Fetch the file if required
$status = $this->mUpload->fetchFile();
- if( !$status->isOK() ) {
+ if ( !$status->isOK() ) {
$this->showUploadError( $this->getOutput()->parse( $status->getWikiText() ) );
return;
}
- if( !wfRunHooks( 'UploadForm:BeforeProcessing', array( &$this ) ) ) {
+ if ( !wfRunHooks( 'UploadForm:BeforeProcessing', array( &$this ) ) ) {
wfDebug( "Hook 'UploadForm:BeforeProcessing' broke processing the file.\n" );
// This code path is deprecated. If you want to break upload processing
// do so by hooking into the appropriate hooks in UploadBase::verifyUpload
@@ -411,7 +419,7 @@ class SpecialUpload extends SpecialPage {
// Verify permissions for this title
$permErrors = $this->mUpload->verifyTitlePermissions( $this->getUser() );
- if( $permErrors !== true ) {
+ if ( $permErrors !== true ) {
$code = array_shift( $permErrors[0] );
$this->showRecoverableUploadError( $this->msg( $code, $permErrors[0] )->parse() );
return;
@@ -420,15 +428,15 @@ class SpecialUpload extends SpecialPage {
$this->mLocalFile = $this->mUpload->getLocalFile();
// Check warnings if necessary
- if( !$this->mIgnoreWarning ) {
+ if ( !$this->mIgnoreWarning ) {
$warnings = $this->mUpload->checkWarnings();
- if( $this->showUploadWarning( $warnings ) ) {
+ if ( $this->showUploadWarning( $warnings ) ) {
return;
}
}
// Get the page text if this is not a reupload
- if( !$this->mForReUpload ) {
+ if ( !$this->mForReUpload ) {
$pageText = self::getInitialPageText( $this->mComment, $this->mLicense,
$this->mCopyrightStatus, $this->mCopyrightSource );
} else {
@@ -456,15 +464,14 @@ class SpecialUpload extends SpecialPage {
*/
public static function getInitialPageText( $comment = '', $license = '', $copyStatus = '', $source = '' ) {
global $wgUseCopyrightUpload, $wgForceUIMsgAsContentMsg;
- $wgForceUIMsgAsContentMsg = (array) $wgForceUIMsgAsContentMsg;
$msg = array();
/* 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 ) ) {
+ foreach ( array( 'license-header', 'filedesc', 'filestatus', 'filesource' ) as $msgName ) {
+ if ( in_array( $msgName, (array)$wgForceUIMsgAsContentMsg ) ) {
$msg[$msgName] = "{{int:$msgName}}";
} else {
$msg[$msgName] = wfMessage( $msgName )->inContentLanguage()->text();
@@ -505,13 +512,13 @@ class SpecialUpload extends SpecialPage {
* @return Bool|String
*/
protected function getWatchCheck() {
- if( $this->getUser()->getOption( 'watchdefault' ) ) {
+ if ( $this->getUser()->getOption( 'watchdefault' ) ) {
// Watch all edits!
return true;
}
$local = wfLocalFile( $this->mDesiredDestName );
- if( $local && $local->exists() ) {
+ if ( $local && $local->exists() ) {
// We're uploading a new version of an existing file.
// No creation, so don't watch it if we're not already.
return $this->getUser()->isWatched( $local->getTitle() );
@@ -530,7 +537,7 @@ class SpecialUpload extends SpecialPage {
protected function processVerificationError( $details ) {
global $wgFileExtensions;
- switch( $details['status'] ) {
+ switch ( $details['status'] ) {
/** Statuses that only require name changing **/
case UploadBase::MIN_LENGTH_PARTNAME:
@@ -564,8 +571,9 @@ class SpecialUpload extends SpecialPage {
} else {
$msg->params( $details['finalExt'] );
}
- $msg->params( $this->getLanguage()->commaList( $wgFileExtensions ),
- count( $wgFileExtensions ) );
+ $extensions = array_unique( $wgFileExtensions );
+ $msg->params( $this->getLanguage()->commaList( $extensions ),
+ count( $extensions ) );
// Add PLURAL support for the first parameter. This results
// in a bit unlogical parameter sequence, but does not break
@@ -635,10 +643,10 @@ class SpecialUpload extends SpecialPage {
$filename = $file->getTitle()->getPrefixedText();
$warning = '';
- if( $exists['warning'] == 'exists' ) {
+ if ( $exists['warning'] == 'exists' ) {
// Exact match
$warning = wfMessage( 'fileexists', $filename )->parse();
- } elseif( $exists['warning'] == 'page-exists' ) {
+ } elseif ( $exists['warning'] == 'page-exists' ) {
// Page exists but file does not
$warning = wfMessage( 'filepageexists', $filename )->parse();
} elseif ( $exists['warning'] == 'exists-normalized' ) {
@@ -674,42 +682,19 @@ class SpecialUpload extends SpecialPage {
}
/**
- * Get a list of warnings
- *
- * @param string $filename local filename, e.g. 'file exists', 'non-descriptive filename'
- * @return Array: list of warning messages
- */
- public static function ajaxGetExistsWarning( $filename ) {
- $file = wfFindFile( $filename );
- if( !$file ) {
- // Force local file so we have an object to do further checks against
- // if there isn't an exact match...
- $file = wfLocalFile( $filename );
- }
- $s = '&#160;';
- if ( $file ) {
- $exists = UploadBase::getExistsWarning( $file );
- $warning = self::getExistsWarning( $exists );
- if ( $warning !== '' ) {
- $s = "<div>$warning</div>";
- }
- }
- return $s;
- }
-
- /**
* Construct a warning and a gallery from an array of duplicate files.
* @param $dupes array
* @return string
*/
- public static function getDupeWarning( $dupes ) {
+ public function getDupeWarning( $dupes ) {
if ( !$dupes ) {
return '';
}
- $gallery = new ImageGallery;
+ $gallery = ImageGalleryBase::factory();
+ $gallery->setContext( $this->getContext() );
$gallery->setShowBytes( false );
- foreach( $dupes as $file ) {
+ foreach ( $dupes as $file ) {
$gallery->add( $file->getTitle() );
}
return '<li>' .
@@ -843,10 +828,13 @@ class UploadForm extends HTMLForm {
'upload-type' => 'File',
'radio' => &$radio,
'help' => $this->msg( 'upload-maxfilesize',
- $this->getContext()->getLanguage()->formatSize( $this->mMaxUploadSize['file'] )
- )->parse() . ' ' . $this->msg( 'upload_source_file' )->escaped(),
+ $this->getContext()->getLanguage()->formatSize( $this->mMaxUploadSize['file'] ) )
+ ->parse() .
+ $this->msg( 'word-separator' )->escaped() .
+ $this->msg( 'upload_source_file' )->escaped(),
'checked' => $selectedSourceType == 'file',
);
+
if ( $canUploadByUrl ) {
$this->mMaxUploadSize['url'] = UploadBase::getMaxUploadSize( 'url' );
$descriptor['UploadFileURL'] = array(
@@ -857,8 +845,10 @@ class UploadForm extends HTMLForm {
'upload-type' => 'url',
'radio' => &$radio,
'help' => $this->msg( 'upload-maxfilesize',
- $this->getContext()->getLanguage()->formatSize( $this->mMaxUploadSize['url'] )
- )->parse() . ' ' . $this->msg( 'upload_source_url' )->escaped(),
+ $this->getContext()->getLanguage()->formatSize( $this->mMaxUploadSize['url'] ) )
+ ->parse() .
+ $this->msg( 'word-separator' )->escaped() .
+ $this->msg( 'upload_source_url' )->escaped(),
'checked' => $selectedSourceType == 'url',
);
}
@@ -884,21 +874,21 @@ class UploadForm extends HTMLForm {
global $wgCheckFileExtensions, $wgStrictFileExtensions,
$wgFileExtensions, $wgFileBlacklist;
- if( $wgCheckFileExtensions ) {
- if( $wgStrictFileExtensions ) {
+ if ( $wgCheckFileExtensions ) {
+ if ( $wgStrictFileExtensions ) {
# Everything not permitted is banned
$extensionsList =
'<div id="mw-upload-permitted">' .
- $this->msg( 'upload-permitted', $this->getContext()->getLanguage()->commaList( $wgFileExtensions ) )->parseAsBlock() .
+ $this->msg( 'upload-permitted', $this->getContext()->getLanguage()->commaList( array_unique( $wgFileExtensions ) ) )->parseAsBlock() .
"</div>\n";
} else {
# We have to list both preferred and prohibited
$extensionsList =
'<div id="mw-upload-preferred">' .
- $this->msg( 'upload-preferred', $this->getContext()->getLanguage()->commaList( $wgFileExtensions ) )->parseAsBlock() .
+ $this->msg( 'upload-preferred', $this->getContext()->getLanguage()->commaList( array_unique( $wgFileExtensions ) ) )->parseAsBlock() .
"</div>\n" .
'<div id="mw-upload-prohibited">' .
- $this->msg( 'upload-prohibited', $this->getContext()->getLanguage()->commaList( $wgFileBlacklist ) )->parseAsBlock() .
+ $this->msg( 'upload-prohibited', $this->getContext()->getLanguage()->commaList( array_unique( $wgFileBlacklist ) ) )->parseAsBlock() .
"</div>\n";
}
} else {
diff --git a/includes/specials/SpecialUploadStash.php b/includes/specials/SpecialUploadStash.php
index 066dcfc9..87b64428 100644
--- a/includes/specials/SpecialUploadStash.php
+++ b/includes/specials/SpecialUploadStash.php
@@ -88,19 +88,19 @@ class SpecialUploadStash extends UnlistedSpecialPage {
} else {
return $this->outputLocalFile( $params['file'] );
}
- } catch( UploadStashFileNotFoundException $e ) {
+ } catch ( UploadStashFileNotFoundException $e ) {
$code = 404;
$message = $e->getMessage();
- } catch( UploadStashZeroLengthFileException $e ) {
+ } catch ( UploadStashZeroLengthFileException $e ) {
$code = 500;
$message = $e->getMessage();
- } catch( UploadStashBadPathException $e ) {
+ } catch ( UploadStashBadPathException $e ) {
$code = 500;
$message = $e->getMessage();
- } catch( SpecialUploadStashTooLargeException $e ) {
+ } catch ( SpecialUploadStashTooLargeException $e ) {
$code = 500;
$message = 'Cannot serve a file larger than ' . self::MAX_SERVE_BYTES . ' bytes. ' . $e->getMessage();
- } catch( Exception $e ) {
+ } catch ( Exception $e ) {
$code = 500;
$message = $e->getMessage();
}
@@ -134,8 +134,13 @@ class SpecialUploadStash extends UnlistedSpecialPage {
$paramString = substr( $thumbPart, 0, $srcNamePos - 1 );
$handler = $file->getHandler();
- $params = $handler->parseParamString( $paramString );
- return array( 'file' => $file, 'type' => $type, 'params' => $params );
+ if ( $handler ) {
+ $params = $handler->parseParamString( $paramString );
+ return array( 'file' => $file, 'type' => $type, 'params' => $params );
+ } else {
+ throw new UploadStashBadPathException( 'No handler found for ' .
+ "mime {$file->getMimeType()} of file {$file->getPath()}" );
+ }
}
return array( 'file' => $file, 'type' => $type );
@@ -222,7 +227,7 @@ class SpecialUploadStash extends UnlistedSpecialPage {
global $wgUploadStashScalerBaseUrl;
$scalerBaseUrl = $wgUploadStashScalerBaseUrl;
- if( preg_match( '/^\/\//', $scalerBaseUrl ) ) {
+ if ( preg_match( '/^\/\//', $scalerBaseUrl ) ) {
// this is apparently a protocol-relative URL, which makes no sense in this context,
// since this is used for communication that's internal to the application.
// default to http.
@@ -303,8 +308,6 @@ class SpecialUploadStash extends UnlistedSpecialPage {
header( "Content-Type: $contentType", true );
header( 'Content-Transfer-Encoding: binary', true );
header( 'Expires: Sun, 17-Jan-2038 19:14:07 GMT', true );
- // Bug 53032 - It shouldn't be a problem here, but let's be safe and not cache
- header( 'Cache-Control: private' );
header( "Content-Length: $size", true );
}
@@ -313,6 +316,7 @@ class SpecialUploadStash extends UnlistedSpecialPage {
* 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.
*
+ * @param array $formData
* @return Status
*/
public static function tryClearStashedUploads( $formData ) {
@@ -339,15 +343,16 @@ class SpecialUploadStash extends UnlistedSpecialPage {
// 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?
+ $context = new DerivativeContext( $this->getContext() );
+ $context->setTitle( $this->getTitle() ); // Remove subpage
$form = new HTMLForm( array(
'Clear' => array(
'type' => 'hidden',
'default' => true,
'name' => 'clear',
)
- ), $this->getContext(), 'clearStashedUploads' );
+ ), $context, 'clearStashedUploads' );
$form->setSubmitCallback( array( __CLASS__, 'tryClearStashedUploads' ) );
- $form->setTitle( $this->getTitle() );
$form->setSubmitTextMsg( 'uploadstash-clear' );
$form->prepareForm();
diff --git a/includes/specials/SpecialUserlogin.php b/includes/specials/SpecialUserlogin.php
index eef66914..5ac3e654 100644
--- a/includes/specials/SpecialUserlogin.php
+++ b/includes/specials/SpecialUserlogin.php
@@ -48,18 +48,21 @@ class LoginForm extends SpecialPage {
var $mLoginattempt, $mRemember, $mEmail, $mDomain, $mLanguage;
var $mSkipCookieCheck, $mReturnToQuery, $mToken, $mStickHTTPS;
var $mType, $mReason, $mRealName;
- var $mAbortLoginErrorMsg = 'login-abort-generic';
+ var $mAbortLoginErrorMsg = null;
private $mLoaded = false;
+ private $mSecureLoginUrl;
/**
- * @var ExternalUser
+ * @ var WebRequest
*/
- private $mExtUser = null;
+ private $mOverrideRequest = null;
/**
- * @ var WebRequest
+ * Effective request; set at the beginning of load
+ *
+ * @var WebRequest $mRequest
*/
- private $mOverrideRequest = null;
+ private $mRequest = null;
/**
* @param WebRequest $request
@@ -86,6 +89,7 @@ class LoginForm extends SpecialPage {
} else {
$request = $this->mOverrideRequest;
}
+ $this->mRequest = $request;
$this->mType = $request->getText( 'type' );
$this->mUsername = $request->getText( 'wpName' );
@@ -101,25 +105,26 @@ class LoginForm extends SpecialPage {
$this->mLoginattempt = $request->getCheck( 'wpLoginattempt' );
$this->mAction = $request->getVal( 'action' );
$this->mRemember = $request->getCheck( 'wpRemember' );
- $this->mStickHTTPS = $request->getCheck( 'wpStickHTTPS' );
+ $this->mFromHTTP = $request->getBool( 'fromhttp', false );
+ $this->mStickHTTPS = ( !$this->mFromHTTP && $request->detectProtocol() === 'https' ) || $request->getBool( 'wpForceHttps', false );
$this->mLanguage = $request->getText( 'uselang' );
$this->mSkipCookieCheck = $request->getCheck( 'wpSkipCookieCheck' );
$this->mToken = ( $this->mType == 'signup' ) ? $request->getVal( 'wpCreateaccountToken' ) : $request->getVal( 'wpLoginToken' );
$this->mReturnTo = $request->getVal( 'returnto', '' );
$this->mReturnToQuery = $request->getVal( 'returntoquery', '' );
- if( $wgEnableEmail ) {
+ if ( $wgEnableEmail ) {
$this->mEmail = $request->getText( 'wpEmail' );
} else {
$this->mEmail = '';
}
- if( !in_array( 'realname', $wgHiddenPrefs ) ) {
+ if ( !in_array( 'realname', $wgHiddenPrefs ) ) {
$this->mRealName = $request->getText( 'wpRealName' );
} else {
$this->mRealName = '';
}
- if( !$wgAuth->validDomain( $this->mDomain ) ) {
+ if ( !$wgAuth->validDomain( $this->mDomain ) ) {
$this->mDomain = $wgAuth->getDomain();
}
$wgAuth->setDomain( $this->mDomain );
@@ -128,7 +133,7 @@ class LoginForm extends SpecialPage {
# 2. Do not return to PasswordReset after a successful password change
# but goto Wiki start page (Main_Page) instead ( bug 33997 )
$returnToTitle = Title::newFromText( $this->mReturnTo );
- if( is_object( $returnToTitle ) && (
+ if ( is_object( $returnToTitle ) && (
$returnToTitle->isSpecial( 'Userlogout' )
|| $returnToTitle->isSpecial( 'PasswordReset' ) ) ) {
$this->mReturnTo = '';
@@ -137,44 +142,61 @@ class LoginForm extends SpecialPage {
}
function getDescription() {
- return $this->msg( $this->getUser()->isAllowed( 'createaccount' ) ?
- 'userlogin' : 'userloginnocreate' )->text();
+ if ( $this->mType === 'signup' ) {
+ return $this->msg( 'createaccount' )->text();
+ } else {
+ return $this->msg( 'login' )->text();
+ }
}
- public function execute( $par ) {
+ /*
+ * @param $subPage string|null
+ */
+ public function execute( $subPage ) {
if ( session_id() == '' ) {
wfSetupSession();
}
$this->load();
+
+ // Check for [[Special:Userlogin/signup]]. This affects form display and
+ // page title.
+ if ( $subPage == 'signup' ) {
+ $this->mType = 'signup';
+ }
$this->setHeaders();
+ // If logging in and not on HTTPS, either redirect to it or offer a link.
global $wgSecureLogin;
- if (
- $this->mType !== 'signup' &&
- $wgSecureLogin &&
- WebRequest::detectProtocol() !== 'https'
- ) {
+ if ( WebRequest::detectProtocol() !== 'https' ) {
$title = $this->getFullTitle();
$query = array(
'returnto' => $this->mReturnTo,
'returntoquery' => $this->mReturnToQuery,
- 'wpStickHTTPS' => $this->mStickHTTPS
- );
+ 'title' => null,
+ ) + $this->mRequest->getQueryValues();
$url = $title->getFullURL( $query, false, PROTO_HTTPS );
- $this->getOutput()->redirect( $url );
- return;
- }
-
- if ( $par == 'signup' ) { # Check for [[Special:Userlogin/signup]]
- $this->mType = 'signup';
+ if ( $wgSecureLogin && wfCanIPUseHTTPS( $this->getRequest()->getIP() ) ) {
+ $url = wfAppendQuery( $url, 'fromhttp=1' );
+ $this->getOutput()->redirect( $url );
+ // Since we only do this redir to change proto, always vary
+ $this->getOutput()->addVaryHeader( 'X-Forwarded-Proto' );
+ return;
+ } else {
+ // A wiki without HTTPS login support should set $wgServer to
+ // http://somehost, in which case the secure URL generated
+ // above won't actually start with https://
+ if ( substr( $url, 0, 8 ) === 'https://' ) {
+ $this->mSecureLoginUrl = $url;
+ }
+ }
}
if ( !is_null( $this->mCookieCheck ) ) {
$this->onCookieRedirectCheck( $this->mCookieCheck );
return;
- } elseif( $this->mPosted ) {
- if( $this->mCreateaccount ) {
+ } elseif ( $this->mPosted ) {
+ if ( $this->mCreateaccount ) {
$this->addNewAccount();
return;
} elseif ( $this->mCreateaccountMail ) {
@@ -198,9 +220,9 @@ class LoginForm extends SpecialPage {
}
$status = $this->addNewaccountInternal();
- if( !$status->isGood() ) {
- $error = $this->getOutput()->parse( $status->getWikiText() );
- $this->mainLoginForm( $error );
+ if ( !$status->isGood() ) {
+ $error = $status->getMessage();
+ $this->mainLoginForm( $error->toString() );
return;
}
@@ -217,7 +239,7 @@ class LoginForm extends SpecialPage {
$out = $this->getOutput();
$out->setPageTitle( $this->msg( 'accmailtitle' ) );
- if( !$result->isGood() ) {
+ if ( !$result->isGood() ) {
$this->mainLoginForm( $this->msg( 'mailerror', $result->getWikiText() )->text() );
} else {
$out->addWikiMsg( 'accmailtext', $u->getName(), $u->getEmail() );
@@ -234,9 +256,9 @@ class LoginForm extends SpecialPage {
# Create the account and abort if there's a problem doing so
$status = $this->addNewAccountInternal();
- if( !$status->isGood() ) {
- $error = $this->getOutput()->parse( $status->getWikiText() );
- $this->mainLoginForm( $error );
+ if ( !$status->isGood() ) {
+ $error = $status->getMessage();
+ $this->mainLoginForm( $error->toString() );
return false;
}
@@ -246,7 +268,7 @@ class LoginForm extends SpecialPage {
if ( $this->getUser()->isAnon() ) {
# 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
- if( $wgLoginLanguageSelector && $this->mLanguage ) {
+ if ( $wgLoginLanguageSelector && $this->mLanguage ) {
$u->setOption( 'language', $this->mLanguage );
} else {
@@ -263,9 +285,9 @@ class LoginForm extends SpecialPage {
$out = $this->getOutput();
# Send out an email authentication message if needed
- if( $wgEmailAuthentication && Sanitizer::validateEmail( $u->getEmail() ) ) {
+ if ( $wgEmailAuthentication && Sanitizer::validateEmail( $u->getEmail() ) ) {
$status = $u->sendConfirmationMail();
- if( $status->isGood() ) {
+ if ( $status->isGood() ) {
$out->addWikiMsg( 'confirmemail_oncreate' );
} else {
$out->addWikiText( $status->getWikiText( 'confirmemail_sendfailed' ) );
@@ -278,7 +300,7 @@ class LoginForm extends SpecialPage {
# If not logged in, assume the new account as the current one and set
# session cookies then show a "welcome" message or a "need cookies"
# message as needed
- if( $this->getUser()->isAnon() ) {
+ if ( $this->getUser()->isAnon() ) {
$u->setCookies();
$wgUser = $u;
// This should set it for OutputPage and the Skin
@@ -287,7 +309,7 @@ class LoginForm extends SpecialPage {
$this->getContext()->setUser( $u );
wfRunHooks( 'AddNewAccount', array( $u, false ) );
$u->addNewUserLogEntry( 'create' );
- if( $this->hasSessionCookie() ) {
+ if ( $this->hasSessionCookie() ) {
$this->successfulCreation();
} else {
$this->cookieRedirectCheck( 'new' );
@@ -314,7 +336,7 @@ class LoginForm extends SpecialPage {
$wgMinimalPasswordLength, $wgEmailConfirmToEdit;
// If the user passes an invalid domain, something is fishy
- if( !$wgAuth->validDomain( $this->mDomain ) ) {
+ if ( !$wgAuth->validDomain( $this->mDomain ) ) {
return Status::newFatal( 'wrongpassword' );
}
@@ -323,8 +345,8 @@ class LoginForm extends SpecialPage {
// cation server before they create an account (otherwise, they can
// create a local account and login as any domain user). We only need
// to check this for domains that aren't local.
- if( 'local' != $this->mDomain && $this->mDomain != '' ) {
- if(
+ if ( 'local' != $this->mDomain && $this->mDomain != '' ) {
+ if (
!$wgAuth->canCreateAccounts() &&
(
!$wgAuth->userExists( $this->mUsername ) ||
@@ -422,10 +444,12 @@ class LoginForm extends SpecialPage {
$u->setRealName( $this->mRealName );
$abortError = '';
- if( !wfRunHooks( 'AbortNewAccount', array( $u, &$abortError ) ) ) {
+ if ( !wfRunHooks( 'AbortNewAccount', array( $u, &$abortError ) ) ) {
// Hook point to add extra creation throttles and blocks
wfDebug( "LoginForm::addNewAccountInternal: a hook blocked creation\n" );
- return Status::newFatal( new RawMessage( $abortError ) );
+ $abortError = new RawMessage( $abortError );
+ $abortError->text();
+ return Status::newFatal( $abortError );
}
// Hook point to check for exempt from account creation throttle
@@ -445,7 +469,7 @@ class LoginForm extends SpecialPage {
}
}
- if( !$wgAuth->addUser( $u, $this->mPassword, $this->mEmail, $this->mRealName ) ) {
+ if ( !$wgAuth->addUser( $u, $this->mPassword, $this->mEmail, $this->mRealName ) ) {
return Status::newFatal( 'externaldberror' );
}
@@ -480,14 +504,6 @@ class LoginForm extends SpecialPage {
$wgAuth->initUser( $u, $autocreate );
- if ( $this->mExtUser ) {
- $this->mExtUser->linkToLocal( $u->getId() );
- $email = $this->mExtUser->getPref( 'emailaddress' );
- if ( $email && !$this->mEmail ) {
- $u->setEmail( $email );
- }
- }
-
$u->setOption( 'rememberpassword', $this->mRemember ? 1 : 0 );
$u->saveSettings();
@@ -550,12 +566,8 @@ class LoginForm extends SpecialPage {
return self::SUCCESS;
}
- $this->mExtUser = ExternalUser::newFromName( $this->mUsername );
-
- # TODO: Allow some magic here for invalid external names, e.g., let the
- # user choose a different wiki name.
$u = User::newFromName( $this->mUsername );
- if( !( $u instanceof User ) || !User::isUsableName( $u->getName() ) ) {
+ if ( !( $u instanceof User ) || !User::isUsableName( $u->getName() ) ) {
return self::ILLEGAL;
}
@@ -568,28 +580,20 @@ class LoginForm extends SpecialPage {
$isAutoCreated = true;
}
} else {
- global $wgExternalAuthType, $wgAutocreatePolicy;
- if ( $wgExternalAuthType && $wgAutocreatePolicy != 'never'
- && is_object( $this->mExtUser )
- && $this->mExtUser->authenticate( $this->mPassword )
- ) {
- # The external user and local user have the same name and
- # password, so we assume they're the same.
- $this->mExtUser->linkToLocal( $u->getID() );
- }
-
$u->load();
}
// Give general extensions, such as a captcha, a chance to abort logins
$abort = self::ABORTED;
- if( !wfRunHooks( 'AbortLogin', array( $u, $this->mPassword, &$abort, &$this->mAbortLoginErrorMsg ) ) ) {
+ $msg = null;
+ if ( !wfRunHooks( 'AbortLogin', array( $u, $this->mPassword, &$abort, &$msg ) ) ) {
+ $this->mAbortLoginErrorMsg = $msg;
return $abort;
}
global $wgBlockDisablesLogin;
if ( !$u->checkPassword( $this->mPassword ) ) {
- if( $u->checkTemporaryPassword( $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
// attacker has a few seconds to click "search" on someone's o-
@@ -606,7 +610,7 @@ class LoginForm extends SpecialPage {
// As a side-effect, we can authenticate the user's e-mail ad-
// dress if it's not already done, since the temporary password
// was sent via e-mail.
- if( !$u->isEmailConfirmed() ) {
+ if ( !$u->isEmailConfirmed() ) {
$u->confirmEmail();
$u->saveSettings();
}
@@ -696,44 +700,26 @@ class LoginForm extends SpecialPage {
* @return integer Status code
*/
function attemptAutoCreate( $user ) {
- global $wgAuth, $wgAutocreatePolicy;
+ global $wgAuth;
if ( $this->getUser()->isBlockedFromCreateAccount() ) {
wfDebug( __METHOD__ . ": user is blocked from account creation\n" );
return self::CREATE_BLOCKED;
}
-
- /**
- * If the external authentication plugin allows it, automatically cre-
- * ate a new account for users that are externally defined but have not
- * yet logged in.
- */
- if ( $this->mExtUser ) {
- # mExtUser is neither null nor false, so use the new ExternalAuth
- # system.
- if ( $wgAutocreatePolicy == 'never' ) {
- return self::NOT_EXISTS;
- }
- if ( !$this->mExtUser->authenticate( $this->mPassword ) ) {
- return self::WRONG_PLUGIN_PASS;
- }
- } else {
- # Old AuthPlugin.
- if ( !$wgAuth->autoCreate() ) {
- return self::NOT_EXISTS;
- }
- if ( !$wgAuth->userExists( $user->getName() ) ) {
- 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" );
- return self::WRONG_PLUGIN_PASS;
- }
+ if ( !$wgAuth->autoCreate() ) {
+ return self::NOT_EXISTS;
+ }
+ if ( !$wgAuth->userExists( $user->getName() ) ) {
+ 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" );
+ return self::WRONG_PLUGIN_PASS;
}
$abortError = '';
- if( !wfRunHooks( 'AbortAutoAccount', array( $user, &$abortError ) ) ) {
+ if ( !wfRunHooks( 'AbortAutoAccount', array( $user, &$abortError ) ) ) {
// Hook point to add extra creation throttles and blocks
wfDebug( "LoginForm::attemptAutoCreate: a hook blocked creation: $abortError\n" );
$this->mAbortLoginErrorMsg = $abortError;
@@ -753,20 +739,24 @@ class LoginForm extends SpecialPage {
}
function processLogin() {
- global $wgMemc, $wgLang, $wgSecureLogin;
+ global $wgMemc, $wgLang, $wgSecureLogin, $wgPasswordAttemptThrottle;
switch ( $this->authenticateUserData() ) {
case self::SUCCESS:
# We've verified now, update the real record
$user = $this->getUser();
- if( (bool)$this->mRemember != $user->getBoolOption( 'rememberpassword' ) ) {
+ if ( (bool)$this->mRemember != $user->getBoolOption( 'rememberpassword' ) ) {
$user->setOption( 'rememberpassword', $this->mRemember ? 1 : 0 );
$user->saveSettings();
} else {
$user->invalidateCache();
}
- if( $wgSecureLogin && !$this->mStickHTTPS ) {
+ if ( $user->requiresHTTPS() ) {
+ $this->mStickHTTPS = true;
+ }
+
+ if ( $wgSecureLogin && !$this->mStickHTTPS ) {
$user->setCookies( null, false );
} else {
$user->setCookies();
@@ -778,7 +768,7 @@ class LoginForm extends SpecialPage {
$key = wfMemcKey( 'password-throttle', $request->getIP(), md5( $this->mUsername ) );
$wgMemc->delete( $key );
- if( $this->hasSessionCookie() || $this->mSkipCookieCheck ) {
+ if ( $this->hasSessionCookie() || $this->mSkipCookieCheck ) {
/* Replace the language object to provide user interface in
* correct language immediately on this first page load.
*/
@@ -795,48 +785,62 @@ class LoginForm extends SpecialPage {
break;
case self::NEED_TOKEN:
- $this->mainLoginForm( $this->msg( 'nocookiesforlogin' )->parse() );
+ $error = $this->mAbortLoginErrorMsg ?: 'nocookiesforlogin';
+ $this->mainLoginForm( $this->msg( $error )->parse() );
break;
case self::WRONG_TOKEN:
- $this->mainLoginForm( $this->msg( 'sessionfailure' )->text() );
+ $error = $this->mAbortLoginErrorMsg ?: 'sessionfailure';
+ $this->mainLoginForm( $this->msg( $error )->text() );
break;
case self::NO_NAME:
case self::ILLEGAL:
- $this->mainLoginForm( $this->msg( 'noname' )->text() );
+ $error = $this->mAbortLoginErrorMsg ?: 'noname';
+ $this->mainLoginForm( $this->msg( $error )->text() );
break;
case self::WRONG_PLUGIN_PASS:
- $this->mainLoginForm( $this->msg( 'wrongpassword' )->text() );
+ $error = $this->mAbortLoginErrorMsg ?: 'wrongpassword';
+ $this->mainLoginForm( $this->msg( $error )->text() );
break;
case self::NOT_EXISTS:
- if( $this->getUser()->isAllowed( 'createaccount' ) ) {
- $this->mainLoginForm( $this->msg( 'nosuchuser',
+ if ( $this->getUser()->isAllowed( 'createaccount' ) ) {
+ $error = $this->mAbortLoginErrorMsg ?: 'nosuchuser';
+ $this->mainLoginForm( $this->msg( $error,
wfEscapeWikiText( $this->mUsername ) )->parse() );
} else {
- $this->mainLoginForm( $this->msg( 'nosuchusershort',
+ $error = $this->mAbortLoginErrorMsg ?: 'nosuchusershort';
+ $this->mainLoginForm( $this->msg( $error,
wfEscapeWikiText( $this->mUsername ) )->text() );
}
break;
case self::WRONG_PASS:
- $this->mainLoginForm( $this->msg( 'wrongpassword' )->text() );
+ $error = $this->mAbortLoginErrorMsg ?: 'wrongpassword';
+ $this->mainLoginForm( $this->msg( $error )->text() );
break;
case self::EMPTY_PASS:
- $this->mainLoginForm( $this->msg( 'wrongpasswordempty' )->text() );
+ $error = $this->mAbortLoginErrorMsg ?: 'wrongpasswordempty';
+ $this->mainLoginForm( $this->msg( $error )->text() );
break;
case self::RESET_PASS:
- $this->resetLoginForm( $this->msg( 'resetpass_announce' )->text() );
+ $error = $this->mAbortLoginErrorMsg ?: 'resetpass_announce';
+ $this->resetLoginForm( $this->msg( $error )->text() );
break;
case self::CREATE_BLOCKED:
- $this->userBlockedMessage( $this->getUser()->mBlock );
+ $this->userBlockedMessage( $this->getUser()->isBlockedFromCreateAccount() );
break;
case self::THROTTLED:
- $this->mainLoginForm( $this->msg( 'login-throttled' )->text() );
+ $error = $this->mAbortLoginErrorMsg ?: 'login-throttled';
+ $this->mainLoginForm( $this->msg( $error )
+ ->params ( $this->getLanguage()->formatDuration( $wgPasswordAttemptThrottle['seconds'] ) )
+ ->text()
+ );
break;
case self::USER_BLOCKED:
- $this->mainLoginForm( $this->msg( 'login-userblocked',
- $this->mUsername )->escaped() );
+ $error = $this->mAbortLoginErrorMsg ?: 'login-userblocked';
+ $this->mainLoginForm( $this->msg( $error, $this->mUsername )->escaped() );
break;
case self::ABORTED:
- $this->mainLoginForm( $this->msg( $this->mAbortLoginErrorMsg )->text() );
+ $error = $this->mAbortLoginErrorMsg ?: 'login-abort-generic';
+ $this->mainLoginForm( $this->msg( $error )->text() );
break;
default:
throw new MWException( 'Unhandled case value' );
@@ -867,7 +871,7 @@ class LoginForm extends SpecialPage {
return Status::newFatal( 'noemail', $u->getName() );
}
$ip = $this->getRequest()->getIP();
- if( !$ip ) {
+ if ( !$ip ) {
return Status::newFatal( 'badipaddress' );
}
@@ -901,7 +905,7 @@ class LoginForm extends SpecialPage {
$injected_html = '';
wfRunHooks( 'UserLoginComplete', array( &$currentUser, &$injected_html ) );
- if( $injected_html !== '' ) {
+ if ( $injected_html !== '' ) {
$this->displaySuccessfulAction( $this->msg( 'loginsuccesstitle' ),
'loginsuccess', $injected_html );
} else {
@@ -982,6 +986,29 @@ class LoginForm extends SpecialPage {
/**
* Add a "return to" link or redirect to it.
+ * Extensions can use this to reuse the "return to" logic after
+ * inject steps (such as redirection) into the login process.
+ *
+ * @param $type string, one of the following:
+ * - error: display a return to link ignoring $wgRedirectOnLogin
+ * - success: display a return to link using $wgRedirectOnLogin if needed
+ * - successredirect: send an HTTP redirect using $wgRedirectOnLogin if needed
+ * @param string $returnTo
+ * @param array|string $returnToQuery
+ * @param bool $stickHTTPs Keep redirect link on HTTPs
+ * @since 1.22
+ */
+ public function showReturnToPage(
+ $type, $returnTo = '', $returnToQuery = '', $stickHTTPs = false
+ ) {
+ $this->mReturnTo = $returnTo;
+ $this->mReturnToQuery = $returnToQuery;
+ $this->mStickHTTPS = $stickHTTPs;
+ $this->executeReturnTo( $type );
+ }
+
+ /**
+ * Add a "return to" link or redirect to it.
*
* @param $type string, one of the following:
* - error: display a return to link ignoring $wgRedirectOnLogin
@@ -1007,7 +1034,7 @@ class LoginForm extends SpecialPage {
if ( $wgSecureLogin && !$this->mStickHTTPS ) {
$options = array( 'http' );
$proto = PROTO_HTTP;
- } elseif( $wgSecureLogin ) {
+ } elseif ( $wgSecureLogin ) {
$options = array( 'https' );
$proto = PROTO_HTTPS;
} else {
@@ -1030,10 +1057,11 @@ class LoginForm extends SpecialPage {
global $wgEnableEmail, $wgEnableUserEmail;
global $wgHiddenPrefs, $wgLoginLanguageSelector;
global $wgAuth, $wgEmailConfirmToEdit, $wgCookieExpiration;
- global $wgSecureLogin, $wgSecureLoginDefaultHTTPS, $wgPasswordResetRoutes;
+ global $wgSecureLogin, $wgPasswordResetRoutes;
$titleObj = $this->getTitle();
$user = $this->getUser();
+ $out = $this->getOutput();
if ( $this->mType == 'signup' ) {
// Block signup here if in readonly. Keeps user from
@@ -1061,15 +1089,33 @@ class LoginForm extends SpecialPage {
if ( $this->mType == 'signup' ) {
$template = new UsercreateTemplate();
+
+ $out->addModuleStyles( array(
+ 'mediawiki.ui',
+ 'mediawiki.special.createaccount'
+ ) );
+ // XXX hack pending RL or JS parse() support for complex content messages
+ // https://bugzilla.wikimedia.org/show_bug.cgi?id=25349
+ $out->addJsConfigVars( 'wgCreateacctImgcaptchaHelp',
+ $this->msg( 'createacct-imgcaptcha-help' )->parse() );
+ $out->addModules( array(
+ 'mediawiki.special.createaccount.js'
+ ) );
+ // Must match number of benefits defined in messages
+ $template->set( 'benefitCount', 3 );
+
$q = 'action=submitlogin&type=signup';
$linkq = 'type=login';
- $linkmsg = 'gotaccount';
- $this->getOutput()->addModules( 'mediawiki.special.userlogin.signup' );
} else {
$template = new UserloginTemplate();
+
+ $out->addModuleStyles( array(
+ 'mediawiki.ui',
+ 'mediawiki.special.userlogin'
+ ) );
+
$q = 'action=submitlogin&type=login';
$linkq = 'type=signup';
- $linkmsg = 'nologin';
}
if ( $this->mReturnTo !== '' ) {
@@ -1082,30 +1128,24 @@ class LoginForm extends SpecialPage {
$linkq .= $returnto;
}
- # Don't show a "create account" link if the user can't
- if( $this->showCreateOrLoginLink( $user ) ) {
+ # Don't show a "create account" link if the user can't.
+ if ( $this->showCreateOrLoginLink( $user ) ) {
# Pass any language selection on to the mode switch link
- if( $wgLoginLanguageSelector && $this->mLanguage ) {
+ if ( $wgLoginLanguageSelector && $this->mLanguage ) {
$linkq .= '&uselang=' . $this->mLanguage;
}
- $link = Html::element( 'a', array( 'href' => $titleObj->getLocalURL( $linkq ) ),
- $this->msg( $linkmsg . 'link' )->text() ); # Calling either 'gotaccountlink' or 'nologinlink'
-
- $template->set( 'link', $this->msg( $linkmsg )->rawParams( $link )->parse() );
+ // Supply URL, login template creates the button.
+ $template->set( 'createOrLoginHref', $titleObj->getLocalURL( $linkq ) );
} else {
$template->set( 'link', '' );
}
- // Decide if we default stickHTTPS on
- if ( $wgSecureLoginDefaultHTTPS && $this->mAction != 'submitlogin' && !$this->mLoginattempt ) {
- $this->mStickHTTPS = true;
- }
-
$resetLink = $this->mType == 'signup'
? null
: is_array( $wgPasswordResetRoutes ) && in_array( true, array_values( $wgPasswordResetRoutes ) );
$template->set( 'header', '' );
+ $template->set( 'skin', $this->getSkin() );
$template->set( 'name', $this->mUsername );
$template->set( 'password', $this->mPassword );
$template->set( 'retype', $this->mRetype );
@@ -1129,7 +1169,9 @@ class LoginForm extends SpecialPage {
$template->set( 'usereason', $user->isLoggedIn() );
$template->set( 'remember', $user->getOption( 'rememberpassword' ) || $this->mRemember );
$template->set( 'cansecurelogin', ( $wgSecureLogin === true ) );
- $template->set( 'stickHTTPS', $this->mStickHTTPS );
+ $template->set( 'stickhttps', (int)$this->mStickHTTPS );
+ $template->set( 'loggedin', $user->isLoggedIn() );
+ $template->set( 'loggedinuser', $user->getName() );
if ( $this->mType == 'signup' ) {
if ( !self::getCreateaccountToken() ) {
@@ -1144,15 +1186,16 @@ class LoginForm extends SpecialPage {
}
# Prepare language selection links as needed
- if( $wgLoginLanguageSelector ) {
+ if ( $wgLoginLanguageSelector ) {
$template->set( 'languages', $this->makeLanguageSelector() );
- if( $this->mLanguage ) {
+ if ( $this->mLanguage ) {
$template->set( 'uselang', $this->mLanguage );
}
}
+ $template->set( 'secureLoginUrl', $this->mSecureLoginUrl );
// Use loginend-https for HTTPS requests if it's not blank, loginend otherwise
- // Ditto for signupend
+ // Ditto for signupend. New forms use neither.
$usingHTTPS = WebRequest::detectProtocol() == 'https';
$loginendHTTPS = $this->msg( 'loginend-https' );
$signupendHTTPS = $this->msg( 'signupend-https' );
@@ -1175,22 +1218,21 @@ class LoginForm extends SpecialPage {
wfRunHooks( 'UserLoginForm', array( &$template ) );
}
- $out = $this->getOutput();
$out->disallowUserJs(); // just in case...
$out->addTemplate( $template );
}
/**
- * @private
+ * Whether the login/create account form should display a link to the
+ * other form (in addition to whatever the skin provides).
*
* @param $user User
- *
- * @return Boolean
+ * @return bool
*/
- function showCreateOrLoginLink( &$user ) {
- if( $this->mType == 'signup' ) {
+ private function showCreateOrLoginLink( &$user ) {
+ if ( $this->mType == 'signup' ) {
return true;
- } elseif( $user->isAllowed( 'createaccount' ) ) {
+ } elseif ( $user->isAllowed( 'createaccount' ) ) {
return true;
} else {
return false;
@@ -1269,22 +1311,11 @@ class LoginForm extends SpecialPage {
*/
private function renewSessionId() {
global $wgSecureLogin, $wgCookieSecure;
- if( $wgSecureLogin && !$this->mStickHTTPS ) {
+ if ( $wgSecureLogin && !$this->mStickHTTPS ) {
$wgCookieSecure = false;
}
- // If either we don't trust PHP's entropy, or if we need
- // to change cookie settings when logging in because of
- // wpStickHTTPS, then change the session ID manually.
- $cookieParams = session_get_cookie_params();
- if ( wfCheckEntropy() && $wgCookieSecure == $cookieParams['secure'] ) {
- session_regenerate_id( false );
- } else {
- $tmp = $_SESSION;
- session_destroy();
- wfSetupSession( MWCryptRand::generateHex( 32 ) );
- $_SESSION = $tmp;
- }
+ wfResetSessionID();
}
/**
@@ -1328,10 +1359,10 @@ class LoginForm extends SpecialPage {
*/
function makeLanguageSelector() {
$msg = $this->msg( 'loginlanguagelinks' )->inContentLanguage();
- if( !$msg->isBlank() ) {
+ if ( !$msg->isBlank() ) {
$langs = explode( "\n", $msg->text() );
$links = array();
- foreach( $langs as $lang ) {
+ foreach ( $langs as $lang ) {
$lang = trim( $lang, '* ' );
$parts = explode( '|', $lang );
if ( count( $parts ) >= 2 ) {
@@ -1354,15 +1385,15 @@ class LoginForm extends SpecialPage {
* @return string
*/
function makeLanguageSelectorLink( $text, $lang ) {
- if( $this->getLanguage()->getCode() == $lang ) {
+ if ( $this->getLanguage()->getCode() == $lang ) {
// no link for currently used language
return htmlspecialchars( $text );
}
$query = array( 'uselang' => $lang );
- if( $this->mType == 'signup' ) {
+ if ( $this->mType == 'signup' ) {
$query['type'] = 'signup';
}
- if( $this->mReturnTo !== '' ) {
+ if ( $this->mReturnTo !== '' ) {
$query['returnto'] = $this->mReturnTo;
$query['returntoquery'] = $this->mReturnToQuery;
}
diff --git a/includes/specials/SpecialUserrights.php b/includes/specials/SpecialUserrights.php
index d4baae28..4501736f 100644
--- a/includes/specials/SpecialUserrights.php
+++ b/includes/specials/SpecialUserrights.php
@@ -45,6 +45,11 @@ class UserrightsPage extends SpecialPage {
return $this->userCanChangeRights( $user, false );
}
+ /**
+ * @param User $user
+ * @param bool $checkIfSelf
+ * @return bool
+ */
public function userCanChangeRights( $user, $checkIfSelf = true ) {
$available = $this->changeableGroups();
if ( $user->getId() == 0 ) {
@@ -75,13 +80,13 @@ class UserrightsPage extends SpecialPage {
* (e.g. they don't have the userrights permission), then don't
* allow them to use Special:UserRights.
*/
- if( $user->isBlocked() && !$user->isAllowed( 'userrights' ) ) {
+ if ( $user->isBlocked() && !$user->isAllowed( 'userrights' ) ) {
throw new UserBlockedError( $user->getBlock() );
}
$request = $this->getRequest();
- if( $par !== null ) {
+ if ( $par !== null ) {
$this->mTarget = $par;
} else {
$this->mTarget = $request->getVal( 'user' );
@@ -95,15 +100,27 @@ class UserrightsPage extends SpecialPage {
* edit their own groups, automatically set them as the
* target.
*/
- if ( !count( $available['add'] ) && !count( $available['remove'] ) )
+ if ( !count( $available['add'] ) && !count( $available['remove'] ) ) {
$this->mTarget = $user->getName();
+ }
}
if ( User::getCanonicalName( $this->mTarget ) == $user->getName() ) {
$this->isself = true;
}
- if( !$this->userCanChangeRights( $user, true ) ) {
+ if ( !$this->userCanChangeRights( $user, true ) ) {
+ if ( $this->isself && $request->getCheck( 'success' ) ) {
+ // bug 48609: if the user just removed its own rights, this would
+ // leads it in a "permissions error" page. In that case, show a
+ // message that it can't anymore use this page instead of an error
+ $this->setHeaders();
+ $out = $this->getOutput();
+ $out->wrapWikiMsg( "<div class=\"successbox\">\n$1\n</div>", 'userrights-removed-self' );
+ $out->returnToMain();
+ return;
+ }
+
// @todo FIXME: There may be intermediate groups we can mention.
$msg = $user->isAnon() ? 'userrights-nologin' : 'userrights-notallowed';
throw new PermissionsError( null, array( array( $msg ) ) );
@@ -122,31 +139,42 @@ class UserrightsPage extends SpecialPage {
$this->switchForm();
}
- if( $request->wasPosted() ) {
+ if (
+ $request->wasPosted() &&
+ $request->getCheck( 'saveusergroups' ) &&
+ $user->matchEditToken( $request->getVal( 'wpEditToken' ), $this->mTarget )
+ ) {
// save settings
- if( $request->getCheck( 'saveusergroups' ) ) {
- $reason = $request->getVal( 'user-reason' );
- $tok = $request->getVal( 'wpEditToken' );
- if( $user->matchEditToken( $tok, $this->mTarget ) ) {
- $this->saveUserGroups(
- $this->mTarget,
- $reason
- );
-
- $out->redirect( $this->getSuccessURL() );
- return;
- }
+ $status = $this->fetchUser( $this->mTarget );
+ if ( !$status->isOK() ) {
+ $this->getOutput()->addWikiText( $status->getWikiText() );
+ return;
+ }
+
+ $targetUser = $status->value;
+
+ if ( $request->getVal( 'conflictcheck-originalgroups' ) !== implode( ',', $targetUser->getGroups() ) ) {
+ $out->addWikiMsg( 'userrights-conflict' );
+ } else {
+ $this->saveUserGroups(
+ $this->mTarget,
+ $request->getVal( 'user-reason' ),
+ $targetUser
+ );
+
+ $out->redirect( $this->getSuccessURL() );
+ return;
}
}
// show some more forms
- if( $this->mTarget !== null ) {
+ if ( $this->mTarget !== null ) {
$this->editUserGroupsForm( $this->mTarget );
}
}
function getSuccessURL() {
- return $this->getTitle( $this->mTarget )->getFullURL();
+ return $this->getTitle( $this->mTarget )->getFullURL( array( 'success' => 1 ) );
}
/**
@@ -155,17 +183,10 @@ class UserrightsPage extends SpecialPage {
*
* @param string $username username to apply changes to.
* @param string $reason reason for group change
+ * @param User|UserRightsProxy $user Target user object.
* @return null
*/
- function saveUserGroups( $username, $reason = '' ) {
- $status = $this->fetchUser( $username );
- if( !$status->isOK() ) {
- $this->getOutput()->addWikiText( $status->getWikiText() );
- return;
- } else {
- $user = $status->value;
- }
-
+ function saveUserGroups( $username, $reason, $user ) {
$allgroups = $this->getAllGroups();
$addgroup = array();
$removegroup = array();
@@ -195,6 +216,8 @@ class UserrightsPage extends SpecialPage {
* @return Array: Tuple of added, then removed groups
*/
function doSaveUserGroups( $user, $add, $remove, $reason = '' ) {
+ global $wgAuth;
+
// Validate input set...
$isself = ( $user->getName() == $this->getUser()->getName() );
$groups = $user->getGroups();
@@ -213,15 +236,15 @@ class UserrightsPage extends SpecialPage {
$newGroups = $oldGroups;
// remove then add groups
- if( $remove ) {
+ if ( $remove ) {
$newGroups = array_diff( $newGroups, $remove );
- foreach( $remove as $group ) {
+ foreach ( $remove as $group ) {
$user->removeGroup( $group );
}
}
- if( $add ) {
+ if ( $add ) {
$newGroups = array_merge( $newGroups, $add );
- foreach( $add as $group ) {
+ foreach ( $add as $group ) {
$user->addGroup( $group );
}
}
@@ -230,11 +253,14 @@ class UserrightsPage extends SpecialPage {
// Ensure that caches are cleared
$user->invalidateCache();
+ // update groups in external authentication database
+ $wgAuth->updateExternalDBGroups( $user, $add, $remove );
+
wfDebug( 'oldGroups: ' . print_r( $oldGroups, true ) );
wfDebug( 'newGroups: ' . print_r( $newGroups, true ) );
wfRunHooks( 'UserRights', array( &$user, $add, $remove ) );
- if( $newGroups != $oldGroups ) {
+ if ( $newGroups != $oldGroups ) {
$this->addLogEntry( $user, $oldGroups, $newGroups, $reason );
}
return array( $add, $remove );
@@ -262,7 +288,7 @@ class UserrightsPage extends SpecialPage {
*/
function editUserGroupsForm( $username ) {
$status = $this->fetchUser( $username );
- if( !$status->isOK() ) {
+ if ( !$status->isOK() ) {
$this->getOutput()->addWikiText( $status->getWikiText() );
return;
} else {
@@ -283,63 +309,64 @@ class UserrightsPage extends SpecialPage {
* return a user (or proxy) object for manipulating it.
*
* Side effects: error output for invalid access
+ * @param string $username
* @return Status object
*/
public function fetchUser( $username ) {
global $wgUserrightsInterwikiDelimiter;
$parts = explode( $wgUserrightsInterwikiDelimiter, $username );
- if( count( $parts ) < 2 ) {
+ if ( count( $parts ) < 2 ) {
$name = trim( $username );
$database = '';
} else {
list( $name, $database ) = array_map( 'trim', $parts );
- if( $database == wfWikiID() ) {
+ if ( $database == wfWikiID() ) {
$database = '';
} else {
- if( !$this->getUser()->isAllowed( 'userrights-interwiki' ) ) {
+ if ( !$this->getUser()->isAllowed( 'userrights-interwiki' ) ) {
return Status::newFatal( 'userrights-no-interwiki' );
}
- if( !UserRightsProxy::validDatabase( $database ) ) {
+ if ( !UserRightsProxy::validDatabase( $database ) ) {
return Status::newFatal( 'userrights-nodatabase', $database );
}
}
}
- if( $name === '' ) {
+ if ( $name === '' ) {
return Status::newFatal( 'nouserspecified' );
}
- if( $name[0] == '#' ) {
+ if ( $name[0] == '#' ) {
// Numeric ID can be specified...
// We'll do a lookup for the name internally.
$id = intval( substr( $name, 1 ) );
- if( $database == '' ) {
+ if ( $database == '' ) {
$name = User::whoIs( $id );
} else {
$name = UserRightsProxy::whoIs( $database, $id );
}
- if( !$name ) {
+ if ( !$name ) {
return Status::newFatal( 'noname' );
}
} else {
$name = User::getCanonicalName( $name );
- if( $name === false ) {
+ if ( $name === false ) {
// invalid name
return Status::newFatal( 'nosuchusershort', $username );
}
}
- if( $database == '' ) {
+ if ( $database == '' ) {
$user = User::newFromName( $name );
} else {
$user = UserRightsProxy::newFromName( $database, $name );
}
- if( !$user || $user->isAnon() ) {
+ if ( !$user || $user->isAnon() ) {
return Status::newFatal( 'nosuchusershort', $username );
}
@@ -347,7 +374,7 @@ class UserrightsPage extends SpecialPage {
}
function makeGroupNameList( $ids ) {
- if( empty( $ids ) ) {
+ if ( empty( $ids ) ) {
return $this->msg( 'rightsnone' )->inContentLanguage()->text();
} else {
return implode( ', ', $ids );
@@ -364,7 +391,7 @@ class UserrightsPage extends SpecialPage {
function makeGroupNameListForLog( $ids ) {
wfDeprecated( __METHOD__, '1.21' );
- if( empty( $ids ) ) {
+ if ( empty( $ids ) ) {
return '';
} else {
return $this->makeGroupNameList( $ids );
@@ -380,7 +407,7 @@ class UserrightsPage extends SpecialPage {
Html::openElement( 'form', array( 'method' => 'get', 'action' => $wgScript, 'name' => 'uluser', 'id' => 'mw-userrights-form1' ) ) .
Html::hidden( 'title', $this->getTitle()->getPrefixedText() ) .
Xml::fieldset( $this->msg( 'userrights-lookup-user' )->text() ) .
- Xml::inputLabel( $this->msg( 'userrights-user-editname' )->text(), 'user', 'username', 30, str_replace( '_', ' ', $this->mTarget ) ) . ' ' .
+ Xml::inputLabel( $this->msg( 'userrights-user-editname' )->text(), 'user', 'username', 30, str_replace( '_', ' ', $this->mTarget ), array( 'autofocus' => true ) ) . ' ' .
Xml::submitButton( $this->msg( 'editusergroup' )->text() ) .
Html::closeElement( 'fieldset' ) .
Html::closeElement( 'form' ) . "\n"
@@ -419,7 +446,7 @@ class UserrightsPage extends SpecialPage {
protected function showEditUserGroupsForm( $user, $groups ) {
$list = array();
$membersList = array();
- foreach( $groups as $group ) {
+ foreach ( $groups as $group ) {
$list[] = self::buildGroupLink( $group );
$membersList[] = self::buildGroupMemberLink( $group );
}
@@ -427,7 +454,7 @@ class UserrightsPage extends SpecialPage {
$autoList = array();
$autoMembersList = array();
if ( $user instanceof User ) {
- foreach( Autopromote::getAutopromoteGroups( $user ) as $group ) {
+ foreach ( Autopromote::getAutopromoteGroups( $user ) as $group ) {
$autoList[] = self::buildGroupLink( $group );
$autoMembersList[] = self::buildGroupMemberLink( $group );
}
@@ -447,12 +474,12 @@ class UserrightsPage extends SpecialPage {
$count = count( $list );
if ( $count > 0 ) {
$grouplist = $this->msg( 'userrights-groupsmember', $count, $user->getName() )->parse();
- $grouplist = '<p>' . $grouplist . ' ' . $displayedList . "</p>\n";
+ $grouplist = '<p>' . $grouplist . ' ' . $displayedList . "</p>\n";
}
$count = count( $autoList );
if ( $count > 0 ) {
$autogrouplistintro = $this->msg( 'userrights-groupsmember-auto', $count, $user->getName() )->parse();
- $grouplist .= '<p>' . $autogrouplistintro . ' ' . $displayedAutolist . "</p>\n";
+ $grouplist .= '<p>' . $autogrouplistintro . ' ' . $displayedAutolist . "</p>\n";
}
$userToolLinks = Linker::userToolLinks(
@@ -466,6 +493,7 @@ class UserrightsPage extends SpecialPage {
Xml::openElement( 'form', array( 'method' => 'post', 'action' => $this->getTitle()->getLocalURL(), 'name' => 'editGroup', 'id' => 'mw-userrights-form2' ) ) .
Html::hidden( 'user', $this->mTarget ) .
Html::hidden( 'wpEditToken', $this->getUser()->getEditToken( $this->mTarget ) ) .
+ Html::hidden( 'conflictcheck-originalgroups', implode( ',', $user->getGroups() ) ) . // Conflict detection
Xml::openElement( 'fieldset' ) .
Xml::element( 'legend', array(), $this->msg( 'userrights-editusergroup', $user->getName() )->text() ) .
$this->msg( 'editinguser' )->params( wfEscapeWikiText( $user->getName() ) )->rawParams( $userToolLinks )->parse() .
@@ -535,17 +563,17 @@ class UserrightsPage extends SpecialPage {
$allgroups = $this->getAllGroups();
$ret = '';
- # Put all column info into an associative array so that extensions can
- # more easily manage it.
+ // Put all column info into an associative array so that extensions can
+ // more easily manage it.
$columns = array( 'unchangeable' => array(), 'changeable' => array() );
- foreach( $allgroups as $group ) {
+ foreach ( $allgroups as $group ) {
$set = in_array( $group, $usergroups );
- # Should the checkbox be disabled?
+ // Should the checkbox be disabled?
$disabled = !(
( $set && $this->canRemove( $group ) ) ||
( !$set && $this->canAdd( $group ) ) );
- # Do we need to point out that this action is irreversible?
+ // Do we need to point out that this action is irreversible?
$irreversible = !$disabled && (
( $set && !$this->canAdd( $group ) ) ||
( !$set && !$this->canRemove( $group ) ) );
@@ -556,27 +584,30 @@ class UserrightsPage extends SpecialPage {
'irreversible' => $irreversible
);
- if( $disabled ) {
+ if ( $disabled ) {
$columns['unchangeable'][$group] = $checkbox;
} else {
$columns['changeable'][$group] = $checkbox;
}
}
- # Build the HTML table
+ // Build the HTML table
$ret .= Xml::openElement( 'table', array( 'class' => 'mw-userrights-groups' ) ) .
"<tr>\n";
- foreach( $columns as $name => $column ) {
- if( $column === array() )
+ foreach ( $columns as $name => $column ) {
+ if ( $column === array() ) {
continue;
+ }
+ // Messages: userrights-changeable-col, userrights-unchangeable-col
$ret .= Xml::element( 'th', null, $this->msg( 'userrights-' . $name . '-col', count( $column ) )->text() );
}
$ret .= "</tr>\n<tr>\n";
- foreach( $columns as $column ) {
- if( $column === array() )
+ foreach ( $columns as $column ) {
+ if ( $column === array() ) {
continue;
+ }
$ret .= "\t<td style='vertical-align:top;'>\n";
- foreach( $column as $group => $checkbox ) {
+ foreach ( $column as $group => $checkbox ) {
$attr = $checkbox['disabled'] ? array( 'disabled' => 'disabled' ) : array();
$member = User::getGroupMember( $group, $user->getName() );
@@ -604,8 +635,7 @@ class UserrightsPage extends SpecialPage {
* @return bool Can we remove the group?
*/
private function canRemove( $group ) {
- // $this->changeableGroups()['remove'] doesn't work, of course. Thanks,
- // PHP.
+ // $this->changeableGroups()['remove'] doesn't work, of course. Thanks, PHP.
$groups = $this->changeableGroups();
return in_array( $group, $groups['remove'] ) || ( $this->isself && in_array( $group, $groups['remove-self'] ) );
}
diff --git a/includes/specials/SpecialVersion.php b/includes/specials/SpecialVersion.php
index 81d17817..5ba785f5 100644
--- a/includes/specials/SpecialVersion.php
+++ b/includes/specials/SpecialVersion.php
@@ -55,7 +55,7 @@ class SpecialVersion extends SpecialPage {
$out = $this->getOutput();
$out->allowClickjacking();
- if( $par !== 'Credits' ) {
+ if ( $par !== 'Credits' ) {
$text =
$this->getMediaWikiCredits() .
$this->softwareInformation() .
@@ -69,9 +69,7 @@ class SpecialVersion extends SpecialPage {
$out->addHTML( $this->IPInfo() );
if ( $this->getRequest()->getVal( 'easteregg' ) ) {
- if ( $this->showEasterEgg() ) {
- // TODO: put something interesting here
- }
+ // TODO: put something interesting here
}
} else {
// Credits sub page
@@ -115,11 +113,13 @@ class SpecialVersion extends SpecialPage {
global $wgLang;
if ( defined( 'MEDIAWIKI_INSTALL' ) ) {
- $othersLink = '[http://www.mediawiki.org/wiki/Special:Version/Credits ' . wfMessage( 'version-poweredby-others' )->text() . ']';
+ $othersLink = '[//www.mediawiki.org/wiki/Special:Version/Credits ' . wfMessage( 'version-poweredby-others' )->text() . ']';
} else {
$othersLink = '[[Special:Version/Credits|' . wfMessage( 'version-poweredby-others' )->text() . ']]';
}
+ $translatorsLink = '[//translatewiki.net/wiki/Translating:MediaWiki/Credits ' . wfMessage( 'version-poweredby-translators' )->text() . ']';
+
$authorList = array(
'Magnus Manske', 'Brion Vibber', 'Lee Daniel Crocker',
'Tim Starling', 'Erik Möller', 'Gabriel Wicke', 'Ævar Arnfjörð Bjarmason',
@@ -128,10 +128,11 @@ class SpecialVersion extends SpecialPage {
'Alexandre Emsenhuber', 'Siebrand Mazeland', 'Chad Horohoe',
'Roan Kattouw', 'Trevor Parscal', 'Bryan Tong Minh', 'Sam Reed',
'Victor Vasiliev', 'Rotem Liss', 'Platonides', 'Antoine Musso',
- 'Timo Tijhof', 'Daniel Kinzler', 'Jeroen De Dauw', $othersLink
+ 'Timo Tijhof', 'Daniel Kinzler', 'Jeroen De Dauw', $othersLink,
+ $translatorsLink
);
- return wfMessage( 'version-poweredby-credits', date( 'Y' ),
+ return wfMessage( 'version-poweredby-credits', MWTimestamp::getLocalInstance()->format( 'Y' ),
$wgLang->listToText( $authorList ) )->text();
}
@@ -161,7 +162,7 @@ class SpecialVersion extends SpecialPage {
<th>" . wfMessage( 'version-software-version' )->text() . "</th>
</tr>\n";
- foreach( $software as $name => $version ) {
+ foreach ( $software as $name => $version ) {
$out .= "<tr>
<td>" . $name . "</td>
<td dir=\"ltr\">" . $version . "</td>
@@ -220,11 +221,11 @@ class SpecialVersion extends SpecialPage {
wfProfileIn( __METHOD__ );
$gitVersion = self::getVersionLinkedGit();
- if( $gitVersion ) {
+ if ( $gitVersion ) {
$v = $gitVersion;
} else {
$svnVersion = self::getVersionLinkedSvn();
- if( $svnVersion ) {
+ if ( $svnVersion ) {
$v = $svnVersion;
} else {
$v = $wgVersion; // fallback
@@ -242,7 +243,7 @@ class SpecialVersion extends SpecialPage {
global $IP;
$info = self::getSvnInfo( $IP );
- if( !isset( $info['checkout-rev'] ) ) {
+ if ( !isset( $info['checkout-rev'] ) ) {
return false;
}
@@ -267,7 +268,7 @@ class SpecialVersion extends SpecialPage {
private static function getwgVersionLinked() {
global $wgVersion;
$versionUrl = "";
- if( wfRunHooks( 'SpecialVersionVersionUrl', array( $wgVersion, &$versionUrl ) ) ) {
+ if ( wfRunHooks( 'SpecialVersionVersionUrl', array( $wgVersion, &$versionUrl ) ) ) {
$versionParts = array();
preg_match( "/^(\d+\.\d+)/", $wgVersion, $versionParts );
$versionUrl = "https://www.mediawiki.org/wiki/MediaWiki_{$versionParts[1]}";
@@ -276,22 +277,30 @@ class SpecialVersion extends SpecialPage {
}
/**
- * @return bool|string wgVersion + HEAD sha1 stripped to the first 7 chars. False on failure
+ * @since 1.22 Returns the HEAD date in addition to the sha1 and link
+ * @return bool|string wgVersion + HEAD sha1 stripped to the first 7 chars with link and date, or false on failure
*/
private static function getVersionLinkedGit() {
- global $IP;
+ global $IP, $wgLang;
$gitInfo = new GitInfo( $IP );
$headSHA1 = $gitInfo->getHeadSHA1();
- if( !$headSHA1 ) {
+ if ( !$headSHA1 ) {
return false;
}
$shortSHA1 = '(' . substr( $headSHA1, 0, 7 ) . ')';
- $viewerUrl = $gitInfo->getHeadViewUrl();
- if ( $viewerUrl !== false ) {
- $shortSHA1 = "[$viewerUrl $shortSHA1]";
+
+ $gitHeadUrl = $gitInfo->getHeadViewUrl();
+ if ( $gitHeadUrl !== false ) {
+ $shortSHA1 = "[$gitHeadUrl $shortSHA1]";
}
+
+ $gitHeadCommitDate = $gitInfo->getHeadCommitDate();
+ if ( $gitHeadCommitDate ) {
+ $shortSHA1 .= "<br/>" . $wgLang->timeanddate( $gitHeadCommitDate, true );
+ }
+
return self::getwgVersionLinked() . " $shortSHA1";
}
@@ -384,11 +393,6 @@ class SpecialVersion extends SpecialPage {
// We want the 'other' type to be last in the list.
$out .= $this->getExtensionCategory( 'other', $extensionTypes['other'] );
- if ( count( $wgExtensionFunctions ) ) {
- $out .= $this->openExtType( $this->msg( 'version-extension-functions' )->text(), 'extension-functions' );
- $out .= '<tr><td colspan="4">' . $this->listToText( $wgExtensionFunctions ) . "</td></tr>\n";
- }
-
$tags = $wgParser->getTags();
$cnt = count( $tags );
@@ -397,11 +401,11 @@ class SpecialVersion extends SpecialPage {
$tags[$i] = "&lt;{$tags[$i]}&gt;";
}
$out .= $this->openExtType( $this->msg( 'version-parser-extensiontags' )->text(), 'parser-tags' );
- $out .= '<tr><td colspan="4">' . $this->listToText( $tags ). "</td></tr>\n";
+ $out .= '<tr><td colspan="4">' . $this->listToText( $tags ) . "</td></tr>\n";
}
$fhooks = $wgParser->getFunctionHooks();
- if( count( $fhooks ) ) {
+ if ( count( $fhooks ) ) {
$out .= $this->openExtType( $this->msg( 'version-parser-function-hooks' )->text(), 'parser-function-hooks' );
$out .= '<tr><td colspan="4">' . $this->listToText( $fhooks ) . "</td></tr>\n";
}
@@ -446,7 +450,7 @@ class SpecialVersion extends SpecialPage {
* @return int
*/
function compare( $a, $b ) {
- if( $a['name'] === $b['name'] ) {
+ if ( $a['name'] === $b['name'] ) {
return 0;
} else {
return $this->getLanguage()->lc( $a['name'] ) > $this->getLanguage()->lc( $b['name'] )
@@ -463,6 +467,8 @@ class SpecialVersion extends SpecialPage {
* @return string
*/
function getCreditsForExtension( array $extension ) {
+ global $wgLang;
+
$name = isset( $extension['name'] ) ? $extension['name'] : '[no name]';
$vcsText = false;
@@ -476,6 +482,10 @@ class SpecialVersion extends SpecialPage {
if ( $gitViewerUrl !== false ) {
$vcsText = "[$gitViewerUrl $vcsText]";
}
+ $gitHeadCommitDate = $gitInfo->getHeadCommitDate();
+ if ( $gitHeadCommitDate ) {
+ $vcsText .= "<br/>" . $wgLang->timeanddate( $gitHeadCommitDate, true );
+ }
} else {
$svnInfo = self::getSvnInfo( dirname( $extension['path'] ) );
# Make subversion text/link.
@@ -503,13 +513,13 @@ class SpecialVersion extends SpecialPage {
}
# Make description text.
- $description = isset ( $extension['description'] ) ? $extension['description'] : '';
+ $description = isset( $extension['description'] ) ? $extension['description'] : '';
- if( isset ( $extension['descriptionmsg'] ) ) {
+ if ( isset( $extension['descriptionmsg'] ) ) {
# Look for a localized description.
$descriptionMsg = $extension['descriptionmsg'];
- if( is_array( $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
array_map( "htmlspecialchars", $descriptionMsg ); // For sanity
@@ -528,7 +538,7 @@ class SpecialVersion extends SpecialPage {
<td colspan=\"2\"><em>$mainLink $versionText</em></td>";
}
- $author = isset ( $extension['author'] ) ? $extension['author'] : array();
+ $author = isset( $extension['author'] ) ? $extension['author'] : array();
$extDescAuthor = "<td>$description</td>
<td>" . $this->listAuthors( $author, false ) . "</td>
</tr>\n";
@@ -564,21 +574,22 @@ class SpecialVersion extends SpecialPage {
$ret .= Xml::closeElement( 'table' );
return $ret;
- } else
+ } else {
return '';
+ }
}
private function openExtType( $text, $name = null ) {
$opt = array( 'colspan' => 4 );
$out = '';
- if( $this->firstExtOpened ) {
+ if ( $this->firstExtOpened ) {
// Insert a spacing line
$out .= '<tr class="sv-space">' . Html::element( 'td', $opt ) . "</tr>\n";
}
$this->firstExtOpened = true;
- if( $name ) {
+ if ( $name ) {
$opt['id'] = "sv-$name";
}
@@ -605,7 +616,7 @@ class SpecialVersion extends SpecialPage {
*/
function listAuthors( $authors ) {
$list = array();
- foreach( (array)$authors as $item ) {
+ foreach ( (array)$authors as $item ) {
if ( $item == '...' ) {
$list[] = $this->msg( 'version-poweredby-others' )->text();
} elseif ( substr( $item, -5 ) == ' ...]' ) {
@@ -650,16 +661,16 @@ class SpecialVersion extends SpecialPage {
* @return Mixed
*/
public static function arrayToString( $list ) {
- if( is_array( $list ) && count( $list ) == 1 ) {
+ if ( is_array( $list ) && count( $list ) == 1 ) {
$list = $list[0];
}
- if( is_object( $list ) ) {
+ if ( is_object( $list ) ) {
$class = wfMessage( 'parentheses' )->params( get_class( $list ) )->escaped();
return $class;
} elseif ( !is_array( $list ) ) {
return $list;
} else {
- if( is_object( $list[0] ) ) {
+ if ( is_object( $list[0] ) ) {
$class = get_class( $list[0] );
} else {
$class = $list[0];
@@ -688,7 +699,7 @@ class SpecialVersion extends SpecialPage {
// 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;
}
@@ -698,9 +709,9 @@ class SpecialVersion extends SpecialPage {
}
// check if file is xml (subversion release <= 1.3) or not (subversion release = 1.4)
- if( preg_match( '/^<\?xml/', $lines[0] ) ) {
+ if ( preg_match( '/^<\?xml/', $lines[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;
}
@@ -710,11 +721,11 @@ class SpecialVersion extends SpecialPage {
$xml = simplexml_load_file( $entries );
wfRestoreWarnings();
- 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 array( 'checkout-rev' => intval( $entry['revision'] ) );
}
}
@@ -831,108 +842,4 @@ class SpecialVersion extends SpecialPage {
return 'wiki';
}
- function showEasterEgg() {
- $rx = $rp = $xe = '';
- $alpha = array( "", "kbQW", "\$\n()" );
- $beta = implode( "', '", $alpha);
- $juliet = 'echo $delta + strrev( $foxtrot ) - $alfa + $wgVersion . base64_decode( $bravo ) * $charlie';
- for ( $i = 1; $i <= 4; $i++ ) {
- $rx .= '([^j]*)J';
- $rp .= "+(\\$i)";
- }
-
- $rx = "/$rx/Sei";
- $O = substr( "$alpha')", 1 );
- for ( $i = 1; $i <= strlen( $rx ) / 3; $i++ ) {
- $rx[$i-1] = strtolower( $rx[$i-1] );
- }
- $ry = ".*?(.((.)(.))).{1,3}(.)(.{1,$i})(\\4.\\3)(.).*";
- $ry = "/$ry/Sei";
- $O = substr( "$beta')", 1 );
- preg_match_all( '/(?<=\$)[[:alnum:]]*/', substr( $juliet, 0, $i<<1 ), $charlie );
- foreach( $charlie[0] as $bravo ) {
- $$bravo =& $xe;
- }
- $xe = 'xe=<<<mo/./hfromowoxv=<<<m
-ìµæ½…旅𞗎왎캎ðº†ß¨è¶¥ä²€ì«¥ð’¯¡ðš¦„𚬀êŒèžƒä¤Žê¤¯æºƒð”±¢æ«…褡䞠⽬✡栠迤â¾ðµ¥ì¾ƒðœœ§ì¤è¢æµ£à¥¤ê¶‡ä¬ƒê¼ê¿¤ð˜§
-ðž›ìœ¥æ¡¯ä¦ŽäµŽêž„ðš £æ¶ì­€è®€æ’ è è®„伣𞫡枮ⵇ𚥣ð¡ƒð­æ²¢ðžœ„ðž´ðž»§â ¤ì³¯è’£ä®Žð’µ¬ì»¡è±£Û…ð¯¥â¦‡ð«æ¼…è›ê¼¤ä»Žæ¥†
-⥀䡦𚭅沢⠬è¼ä²¯ì¢¡æ¢‡äŸ‡ä¼„육较촅䥃è¦ðž„迯쟠꺃ⶥ栆궀撠満ê£ðž¦‡ì¢§ð …ðž« ð §ðš®£è®‡è¼¤äº€âžæ¬£ì²¡ì®§â½¬
-氀쮧跧ð«¥äª€â¬¬â¾…ðž¼€âµê´¬à¦¤æ«¤ä­€æ¥¦ðš«ƒð£‚괥챣ð¥‡æ¥€ê·§ì ì£¯ì’¡Û…ð¾¤ä³„䤄𞽀괬èºè­‡ä®„æ¥ðš¬ä¯„津䶮⾅ð«…
-ð´‚௧쮯궣輥ߡ亀𞪀氀诤ð¯¢â¿…諃⫤ðž¦ä®£â¦¬ì£„椎貧𞛄ඇ쿇äºè·¤â¦Œæœ¯à¦¥Û仆䛇枡䪄ðµ‡ê³è¬ ðž¿¯â¶â¶ƒäž£
-궥èžèꤣ⟬æžæ¶‡ðž´§ä¼¢ðž¼¯à¬…𚣡즡⡌浣䯇쿃ⳇê¶à½¦â¢ƒæ›¦â¦¥è›§ê° ì»¡æ¥§ð˜¬§è¢â¦â¢ ä³ ì±¤â½§ðš §â¬£â¼€æ½§â­…椤
-𞟯è»ì¢…쵃䬆𞮀𞮅꤇𞣅溎楯곡⢡꾥첥쫧Ⱨ균æªè¾€ä­®â¡„ðž¯ì¿ä±¤ð  æŸ…è¿ ì›ðšŸ¯â¾…è± ð¡€ð¡…䱀轡⾯쥃â¥æº†
-䢣䞮柄ꠌⶡ𞒯ð³£ðž³…蛤æ¤ðž¯€âœ ê·¬àº„ð·¡ðžœ ä¶ƒðž­€æ¯¥ðž¡¯æ¡¥ê¥â£ì³€ðž¾§â¡§ð–¥¢ê½§ì£„ത𖴧ޥ歠à»ìœ„䯎撯ì¬ä®£æµ…
-쾇泮ð¢ì¼„𞧧ðž¦ä¦¯ê¾¯è¿¡ðž¯æ›Žä¢¦ì¿£æ¦ê¶¯â¡€ä¤¦ä·¢ð­¢ìŸì¯¯â§¤èŸ¯ä¡æ°‡ð’­¯ð”œ§ðž¢£ðž±è¤ð’¬§ê¶§ß¢ð­†ä›ƒì°ƒì­£æ² ðš¬€ðž¿
-ä´ƒð££ä£Žðºƒê¥…轃⣄蟧⦡𒛧蟃毣洇䞎Ҡ潄仆ð²ƒðž§¥ì² ä¢¤ä¿Žè­¯æ³ ì®„â¥æ ì¾¯â³ì§¡ðž¾¯â¥¡ðš ¬ß‚𚥯ކ澥䲀ⵀ𞻃
-ⵡ𚦣𒯣✬ðŸ¯ðž¥¥è¼„䱀굡æ¦â¡ì²„⦄ꡥⶣ𞡤âºðžž¡Ý£ð¢…𒷤⤡꿄è¡ðž±â´„è´ð’›¬æ°ƒðžž‡ðž¶¡Þ…짣ß𞱃ð«„ۥ𞰣ð±…欤
-梢è¡æŸ§ä¥ä»æ’£ð³£ðž …좇ðž£è’£ä°¤à¾…ðšªà¿‚ಇ濤䞦쮅ðš¬ðš­§ðš¬¬ð’´¯ðµ£ðš¥Œæ²®æ½ì¢¤æ¾…ð»¯æ£æ£¦ê¤¤æ´¯ð³ƒðš­€ì½…궧쭠𔥢
-ðž± æ¡Žä†ê²¡ì­„ðžµê²¯ä¥‚ⶀð¥‚𚧬⽬䠇쳄â¬â°Œðžµ€ä¦â¿Œì›ƒð’¿ ì²ð›¡æµ£æ¶†ð’¯Œâ¢¤à¦…䭎𚜧갣ðž¾ä´®â¡ƒê¤¯ì£ ä°€ì¬¯à¼„ä«
-ð±‚ꢅ䬦賧ð¯¡ìœ è¾‡âž¥ä½ƒä»®ê·£ì ð’´¯â­…ꢡê°ì»„⒤⻠è®æ¶…䠃跥è¢ä½„ðž„ð³‡æ³„껧𚮡ðž±æ£‡æ»¡à½ƒð»¯è¼¤ê´…ðš ¬â¥ê² 
-ð’§ä£‚ê¤è¥ƒðž¼§ðœ°§ä¼Žè¥¡ì›…𞳧걯䳣𚟡ì¼ì­„洠컥â…â¿äº‚𚯧𚯯쯅𞮅â¢ð ¦ð’® ðš¯£ðžž¥è¯¤ê£è¾€ð–¥¢æ¤¯ê²‡æ¯£æ¿¢ðž£ðš¢€âž 
-䮮浥ê²æ²£ì¡£äœ¦æ³‡æ­ð¾„æ¯æ›¯æŸ†Û‡Û‡äž€æ³†ð¾§æ­¦ðš­ æ³ê½Œð§¢ê…軀⬠쾣𞡀榧ðž£ðš¦¤â± ä ¦â²¤ðž°¯ðž»¥ì¿‡ä¬„貃柅涢
-ê°â¼ð¿§Ýà± ð¿£è¤€æ¶¡ð˜¼§ðž®à¼…𞵡ð¥†ä®„ð®¥âž‡ê£Ý¥ä¡ä¯Žæ¢¢ðšŸ‡è¼‡ê¤ ä«£äµ€à¤£æ¼‚𞬯⢡軀𚭅ð¯†à¯¦ðš ¤è¥ì«‡â¾¡æ¿§æ²¤
-䜇伢ۇ汧ì²ä¤Žìž¤ä›¯â°ä¿‡ðžµƒê¢§æ®‚ê¶æ¦®Þ£ðž¼§æ¶‚æ°ðž¬‡æ»¦ì¦¤èœ€â ¥ðºì£â¾ê»¬ì½‡æ¼¯ê æŸ¦æ«‡ì梠仇장滦⟠꿯
-ì®æ¥æ«¢ð«£ê ð’®¬æ¤¥ð›¤èª…栮朥迣⺄ඇ𞣣â¿ä¬‚ì¾â« â’§âœê¶‡è¥¤â¡ðž¯‡æ¿ƒðš£ â° ðš«¤æ­¯ä› ð’›¥ðž«‡ì® ðžŸ¤ì»ƒðž¢¯â¬£æ¿¡ä¦£
-è¡è²£æŸ‚ðž³æ£®ì±à²‡ê³ ðš« èŸ„ä¤ì ¯ð’®¡â«¯æ¥€äž„䳣쮅궤轧껯𞥤ðªƒðž¶¡æ½‡Þ„𚥣ðµ‡æµ£ð¬€è¤â½§ì£ì¾‡âž£ðž€ð¡¦ä® ä¤£ð „
-ê ð¾è ¤ðž›¡ðžµ€ä¬¦è¦¯æ¦â¥¯ì¥æ¢‚걯ð¾§âµà³¦ì±ðš£Œèº„轡ð¯£ðž»¥ä¢¦ð‚財䲧ð¦ä¬Žì²æ£â£à±¦ìž§æ£†ì ¥è¥ì ƒä¤â¢æ¦€âµ
-螅赡𒿯ⶣ赧꾤𚬅æ¿ð’›æ¶†ð´‚ॡ䳦ߢèµä¯‡ä¢ƒê Œæ³„柠泡찇ð›¢ðž°äª‚ð¢æ«‡ðš°§æ¼¥ð£„𞜤ð¥âŸ¤æ·£à´¡ä³®à®¤è°€à½¡ðž¾§
-âžè¡€ê½§èŸ§è¾§ê²Œâ»£ðš££ì³à´¡ä „æ®ðž£ ì£ƒæ±¦è«¤à°¯æ¯ è…ð¦„謄殯𞱄䳀â³ðž¶ìŸ‡à¶†ð»¢ìžð¿¡ä³ƒÛ‚ðž­¥ä‡ä¦‡â¥Œì¼ì¥¯ì¶
-ð–½¢ð³ƒð’·¡ðš«¥ðšŸ‡ð¿§ðš¦§ð¢ä¥¦ðš¯€æ£‡æ½¡â¥„æ­¡ì°æœ†â» ä¤†ð–¤§æ¼¢ðœ§ê¡…⽄쾠ð¥£è¡ðš¥ ð¥†ä¤£à¦…𞛇䤣ð¡¡ð¢äž¦ð–§ß£è£ðš«ðµ¤
-ཅۄì¶ä²ƒæ¬†ê·¬ðº€è¯€æ»ðž«‡ð¯‡äƒðž§¡ì±ƒì²¥ðž­¤êºì«…𞫡䱮𞼤અ𒭤견Фð«ð¾§ä½£ð–±¢æ¾¢ì¿ðž›§â½…侮榅ð¾„यì¥èœä££
-𚥌ð«ìµ¥ðš¥¡âž¤è·¡æ®ƒä°£ä¯¤ðž³¥ì¤â´êµ„𚬧⥇줡걬০켃𜼧𚧯첣䜂𞵇𚟀찃궀谀Ɽ伎䢮𒛄𚦀ꤥ⾣ð­æ²…䬇䧠ð±‡
-沀濡ठ𞰄쟠ðº…ê£ð´‚躄佇⦇毄计賀䢎澡𒮌䲄𒠧캀䟣ð·§è¤€ðž»…蠤൯æ£èœƒðž®¤æ¾„â§â¾¥æ’¦â½¬â¶¥ðª„ய𔼧ބ躄
-䬎챯𚫇⽯ð¾ ðž› ðš›§ä¬Žêž„êµ¥ð¢‚𚠣⠥ä§æœ„𞧥à¿ì›¥ê½¬à½ƒæµ…â¦â¬ðº†ä¾¢æ ¦â§ ðž›¯ê¶ à¶¦ðš­§è¶¤è°¥æ­¤ð²‚ð¬ƒè» ðšª…ðž¦ðž·¤
-蛄俧袥补æ¦ì â¤â €è±‡ä¿¢ì®¯ê¤‡âžð´â¶¤æ¶®ì°£ð’®‡ì榠跣𜤧⦅ໃಆ𞛯䵣谠𞰅ꢯ⡧淯柤궡✠䮎괯𒮣â…朎
-⥅웣䯮첀𚫣꒤ð£ ì­æ´€è›¡æ¥†ðš®£àµ¡ä®®Ò¯æ° ðœæ¿†äœ¢ä·¯æ½£æ­ƒä·¯ðž£¡ì›ì­„椥䟂➅𒯣𒯤ૡༀ䭧ܣ죅ð¯ à¤è»¯ä§£
-â°¤ä¢â¬¥æª‚䠮⫤䛠꜡䛆讠𚭄✠ê¿æ¬£è ¡ðµ†ì¼è±£è­„𞣇춣𒭯ð»¢ä ƒä° æ’¦æœ…䮄榦溃貀𒯅䶇â¾ðž¬§æ¾¡ð»¦ä²®æ¦€ðž¯§
-ðª„䢆侄ðž¾æœ¦êœ‡ð®¢à½ð¯£ì·§êºðž±ƒæž æ«§æ¡ ê´¬æž‡êœ¯ê³‡ð°‚𘜧ð¦„컡濦汥줠𞲡輀𞫃ð £ì¥‡â£ƒðž´ä³‚⟤漇쯣껃ð¾€è¡ƒ
-𚮄쯇𒼧ð„浥洄楠৯춥蒧⾯ð«†à¼‚ꤌ毮䤆⺄༠०袀䢂죃ⴣð¿¯æ¢‡æº„毦𞼄螄櫤쳃栅満걌毠ðžžâ±Œðš®¡ê’§ä¢†
-ê¥æ³Žðž­…仧궀辯諯웅𞳇津趃অê¿ä¼ðµ¤ìºâ ƒð¦‚ð¶€ê£ä›‚贤济æ§ð撠䱤殥歡躇楄꒧꽧𞽧䡣쵧𒯃ð±†êœ¯ìœ„
-ཀ谠諃ð¬ƒè»…â¥ðž°‡è´ æ’£ß…꽤⠥ಡð€ê¶¥ìœðž³â°„ܯ즡歎𞷥ⵅà´è𞟇구ê§Ü…䱦껡䛦߅蒯俧콣𚭅梧䛠ꡇ
-ݧðš®ì›¥Ð¢â¬ ä¬¦æ¦€ð¢‚貤𞰅𚭠謣䱦⒡췧ð¥€æ¿‡â§£â¤€ì¢¯æ®§ðž¬£ì¤¤â£€æ¥æ¥ŽêµÝ¤æ»Û‡ð˜§ðš¯¯ä’¯â°€ðž¼¤Ò¡ä°¦ðš£ æ¤¯â
-趯ð£¯è±€ìµ…춀⳥䷠ì¡Û¯âº„Û…ä¶ì¶¤æž‚櫅ۅ𞥅䱃䭣𒳯汮澃𞢃谥ⵤ구𚣄콡曤ðž£à¦‡ß‚ì…蠠𜰧䞦ꞇâ²ðš®Œè«§
-趯ì²ä¬Žð¡æŽê² â¥‡ðž»¥æ›¢æ±¥ðž³¡æµ†æ¬ èº…ð¦ðž²¯è°¡ðž¦è¢§è¥ƒæ£§ðš¦ðž¡¡èŸ€ä¾ ð’›ì°‡ì± ìª‡æ´ Ü€ì¯¤ä‡èžðž¿£èœä¿„𞦡⼀ལ
-谥촯䲦â¥à¶¤ðž›¡ð§â¤ƒê¶…༡褡ä­æ¯†æ¿†â§¡è›£Ð¤ðžµ‡è Ý¤è³¯êœæº…⡡ߡ𞥧䮄榆䵄求謥ð§êž€ì¯â§¡è²‡ä›‡ä¢æ’¦è¢¥
-쮇䫀𞜄দ굯ðž¦â»¤è¥‡ì¤…⬅Ûఠ⻀𔠧쒠䫆ð¡…梄梯輤䥣ì⤄ⶡ诃䮢譡𞻠ߤ枤櫥ð¢¥ä¼¦è¢ ê¢ƒì³€è££ðž¼…䰄𞻡
-𒯇槥淠䯃à¶â’¯ðš«£ðš ¯ðž £ðš›„椦泮汣赃潥𚫇ദ𞛤𞿣ä°ì®¡ð–­¢èæ¯ä¶‚䦧档䪂𞾃쟀𚪄𞞃𞳥𞼀ð¿¯ì¡‡ì›„䳎汀ð«£
-æ¼ ðš«„ê¡à¬¥è®¤ê½¡ð±ð­ðš¼§â¦„梎આ枀䠦楇쒤ꞃꤡⴅꞅðž¯à¶…ҡ𞞤氣즤裀𞜅ðµ¥æ«ðµ€à¼¦ð³ƒì³£ð¡¯æ¡§ðž¿ æƒêµì£
-짤𖤧蟃澀ð’­ðž²¯ß⣣â¬â°¤ì¡¥ðš¦Œæ½†ê¡â½¤ì›æµ¥ðžžƒð«„棆갤濧⼣겅쬄൧젣此潆⻯䜃꤯궠쮥𘬧曀⿅譅槣䞂
-äŽê¡ðšŸ£ä°€æ¢¥â¾¬Ü¡ðž¿‡ðž ¥ð® ðžºƒä¢®àª†ä§®ì®ƒèª…櫆𚪃죯诠䵀䯀跥ð¾£â»¥ä¤†â°€êœ„棧枃⻇థ誃ðš›à¿‡è´„𞡣欎⽡ðž±
-𞲄â¬æ‡ð …ð±ƒðž¢¤âžðµ¤ð¢„ê’¥ì¦äº€ì­ðš­¡æ¼†ðž®‡ì²ð¢¦æ®Žì®æ» ð ¥æ¦¯ð®§ð’µ¬â¡€ä®†ä£ ì¤€è®¥ðž¼ƒä¶‡âª…껃泃𖱢楀갠複撮
-✡ð­¢à»ðž®§ðž›¥ì«ƒâ½¤è¦ä¥‡æ²è½ð¡…ಢ䧮æ¤â¬‡ð¤ðž¡¯æ…武楥歎䟄溇䯢𒵬ð¢£è¿ƒäªŽä³¤æ»¡à¬…ⱇ쭀ಥ𞥄䥆⧥𚞧좃
-유栤༡ð°ƒä¿‡â°…殇蠄â½â¾ Ü‡ð’®„澄𚦅⡤䪎榮Я견濂賣쮠仠ä®ä¶¢ðž¦ð«†Ý襅褥찯𞤤ݥ象侯쵇궥𞠃윀웧
-𖰧殀蛡⫥亃觯潥蠀补ⴄ觧ð¡‡ð¾†ê¯ä¡£ì·¡æ½â»¯â¾è«à°¯ê¿§ä± ðš­¯ì°¥êž…⪃콄즯쳣覧𞰄Ⲅ𞿣𚬧𞵤ì¯â¬ƒà¶¤ê²¤
-ⵃ蟥𞟧谣轇䛂ð®„ä½€ß氣𒯧榡𒷬桇䷯觠椄챥ꠌ蒯꜌䭤➡侦䣤𚦬䲀ì¥â’¤ð¦„ê¬ä¢®ð£…ꡌ歡ä¯ä¢£ê´¯ðš®£â¥€
-줣०𚭀殣𚬥𒮇⟄趥좠洦ꢬ装䠆ð’ æ›§âžð’¿§æ¤ƒä €ðž¡…𖼧䳇ງ줄ধðž³â°¬è¦ êƒæ®£ðš¯¤æ¶¡ä³ ê·¥ð¯â«¤è¦¯ðž²¡ðž¼„༦
-䢦쥥줤ꡤড젃ಧꢥ諤𔭢ඥ𒛌枅𖜧줄躀à°ä¦Žðž¯„졯譄➇仄ä°è›ì´¡äž£ì¶…涧⡄滀ଢ䮇æ¯ð˜ §ðš¯§ä¾‡æ¾€ê¡æ£
-𒷧槧߅䶠윥귡귧⤯𚪃ð·¢à½†è£æ¯§ð¥£ð¯¥â¬¤è§ì²€â­ðž»¡æ½¤ðžŸƒäŽæ± ðž¦€æ®¤Ò ðžµä¯à½ìŸ§ð’°§æ°¢ê·¡ðš›§ð’¿¯ê¥„⭌䜇ۥ
-ê¡ðž¯¯æ£„â£ê¤¥à§¦ð¯ ð’·¤ðž¦£ì®ðž° ðš§¡æ¡§ð§â´¤ê ¡è»…𞟃衄䠦ߤ܅ⲃଢ蛄溎椀𞠀䛃𞡣𞟣澅𚭬䧤⡇贤⫌쪄Þ朣
-â»ì¼…ð½¢â¼¡ð²€ìž à¯§ðž¬¥ðž¥€à±§ä¦¤à½¦èª‡æ¼Žè­ è¿„䦂䳇𞣡正ðµ¤ê³„楧ޅ✬𞿯棅𞳧𞛤𞜀쭯𞮀诠ð¥€æž¢ä¥®ä­†æ¥†ì»§à¬†
-𞶇➬అ䤦誃ð …ð¿¤äŸ€æ´€â¡¤ðšŸ£æ»¤ðž¥‡ðž¾£ì¦€ð â¼ƒä°Žæº„꽅웇✡ð¾¥ä²€â¡Ü£è®£ðž¿¥â¼¤è¦„𚯇䡇అè€â¥Œä¾§ê»„ê¬æµè´€
-æ¼ì’¤ì²§ì£ê³¡â£ƒè¶ƒè³„撠।ì â¶Œðš£…⾥춧𞞠쒡쿀𞦠䵯æ¯æ¶ ðž«€â£¡ê¡„䢀満棃䡯ð›£à­¯ä³¯âµ¡à­¡ä¥ƒâ‡â …䣆æ§ð³ƒ
-귧覀𞼠漎ðž´ðž¤¡à½‡ä°¦ðž²£âƒæ­†ì½£ê¿‡æœðž¢„ðžµ êŒðž¡…賡𞧠æ›ê¼ƒðž»¯ê¼¬à²‡ðž´¯èµ„榎쮯輤ॡ䜎⦌𞶅ð ðš§§â¡ƒì³ðµ…à¿€
-ðž’§ðž¤ì¯£ê»§ìªƒðž£ æ¤ƒì¡âŸ¤ß‡ì›…䱧䛣𞷧ð³¤ðš¬ ì®€ä ðž­‡ê½£ðž¿‡â £ìŸ£ðž¢…ദ洅촥컇ðš¦ìµ¡êž…ä †ð¥‡â’¥æ¶¯ä¢â´…𒭡쮤꺅
-𞥇컠â³æ¼ƒð²ƒìœ‡è¯¤ê²£ðž¥„伣䜠⻇𞡀修꜡𞻣䳎â„켇꽡𘼧쭄洂ðžŸêœ ð®¦â°ƒìµ…ð¬‚梀櫯䜯꜡䛣à¼æ‡âª€ìº„𞰠⼌
-æ¡ð³„没ⳅâžð’®€ì²¡â¬ä¾¯ìº…检𞡧棡𞬄𞥧𞒠𞶄䥧ð³ƒðž»§ðཧè¬ð«‡ðš¯…讄枥𚞬첡쾀欎육웠ð­¤à­¯æ¿§è­ì±¤ä¶¢ê»¤
-𞯤쒤ð¾‚辧𞮡ðš­è¤¡â¼£ðž¼ƒä³ƒâ ðžè±ß¡æ«¦ð’®¬æžðž±¥â¶ àª‡ê ð­¤ðž‡æ²£æ£æŸ„ð³‚䠯楅곅⼣⥃ༀ螡ߥ柤褣曠沧꒬
-ð´ƒäµ‚䲇蠀ð¿§ä²‡à¶¦ð’¯‡âºì»¤è¬ðš££ðš«ƒì»æ¼¢ä €è°ƒâ²ƒä¢¢Þ„辅毡갯ðš®ä¤£æ¤¦ðž²¯à¥§ðžž è¼¯ð˜œ§ð¯£ð³…⽄𞽤𚧤𚬡䴆𞷠ଦ
-䱠䒮諃à°ð ¡æ¡¦ðžŸ‡ðš­§è°ðž»¤ð¡ì¥¡æµ£ðž¼‡è­€â«Œì®¥ê¢…ì»æ›…ꥅ𞟅à¬ì°€æ±…ð·¦à³¡è° ðž¦¥ä¬€ðž´¡ä¢ ì³€â¡ðµƒß ß à¶…겧淤
-쥣æ¯è­„꼠𒮣ì«ì­¥è®¥à¥¡ì¿‡ð¾¡à®†ä¼ƒâ« æ±‡äœ¢è¡¯æ¥¥æµŽä¿æžðš££æ’®ì¬…èœâ§¤è›¥ì®â¥ƒðš¯£ê²ƒà®ƒì¤ ä£‡è¿…泆𞟯𞰥⤯ð§£
-𚥯è æ³Žà¬¡è „涣తâ¾â»Œä§à¼€æ¦®Ò¯ð³ƒæ­‚浅𞬄ꡥ첤⬇유ð¶ƒè®æ¬¤ä¿¤ìž§â¡Œðž­¥â±ì¶¥æ°¤ð §ä¿®æµì«¤äµ†ðž ƒÜ€ì›£ðž¶
-곧è¡ê €ê±ðžŸ è®¤ì®€ð½¢è°¥ìž¡ðž¼£ä½®ðžºè»¡â¾ì®¯ß¡â§¯ìŸ¡ä°†â½€êµ‡ì´¤è®¤äµ„輥𞦤𞲇䡮侢朆쬣æ¢â½ƒæ¿ƒðž¾„⣧𞶥æŸà¼¢
-⼅𞦀ॠ軀浯ܡ𒯡컡谤ඤ曢⧠짠컠𚠯꿡ðº€ð’¬§ê³Œæ¿‚ণ웧⾡栅䞠괬ܤ䦄ä¼æ›€äº†à½¡æ¦§ä­¦ð’­¯â›ƒè¡§æ¿ ðš§ì¥
-ìµð›£âª…蜤ðž¤è£…고𒯬쳅â»Ý£ä³†à§ ä¦ð®¡à¤„â«ð¶ì¿§äœŽð¿£ì ¡ê·§æ£¥æ«ì¿£æ³¯ä¿£ä½¦â¾¥æœ¦æ½ê¢¤ðž«£ê™§ðž‚Žðº†Ú¦Õˆì·¥
-췧䙭ä¶æ¾¥ðžœ…쨯쵥Ⱕ쵥䗌ìµæ½…旅暬Ոⵤ旆𞗎줭젠ৡ쮠┢𚴧ðµ£æ½§ðž¾¥ðœ”§ðž‘¢è´®ðž½…跣쓄䔭𞷥⽇𞾅𞴥ꔥ䓭
-â‚Žì±æ¾¥ì—‡ðž—Žê³­è´‡Ô†ì¬¡ì©¯ä˜ ä¯ƒð¯¤æ¹ðšš­Õˆê½¤ì—‡ðž—Žê”­â‚Žè°¥ð—‡ä—Œì³­ä™­äŸâ—Žì³­ä™ä¾­ì¾‡ìµ¤è“„ä•ì·¥ì·§ä“­â—Žì³­
-ä’­ðž—Žß䓭亭è청𞻥䙭侭䷤æ“ä•ì·¤â½‡ää•âµ¤æ‘†ä½à½§ðž—…暬èì¶ì°¤â²¥ä™­ä”­ðšš­Ã¨è°¥ð—‡ä—Œì²ä™­äŸâ—Žä•ð—„
-ì—Žßâ—Žì²â’¬ä“­äº­Ã¨æ•ˆð±…궤◄虬䶭侄䗌꾄쓅ä•ì·¥ì·§â•‚æ—„â—Œì²ðž—‚旌藂꾄쓅ä•âµ¤æª¦ì²ðž—‚旌暬è𞂆效
-꽤엇虬ä•ð±…궤⚤èì±æ¾¥ì—‡ðž—Žì¶ì°¤â²¥â‚Žðž‚†ì°­ðž½‡ä™­ä¾­ì¾‡àµ§è“‡ä•ê½¤ì—‡æš¬à³¨è—…䗌ⳇ查䗌찭𞽇䓭䙭𞙮䔭
-枅දðž…➥èµð’¶¯âµ¯à¶ì¶¥ìŸ…ⵅ쟥ðµ¥èž¥â´…춯äŸì·¯æ·¯ä´ê—旌₆效ê¡ðš¦€æ¡âª£ê¼­ðš ¥ðž½‡ðš©­ðž˜Œâ±…ðž·¥ð£‡ì¡£ì“€æš¬Ã¨
-줭젠ৡ쮠┢𚴧꽠𜔧𞑢跮쵅䭀𞡀䗌è斈쳮𞴤侭ට𞩎ðµæ½…暅汤津ðž¥à¿„𞴥ⶎ澥𞜅ì‘ð—肌惨澈漥𞾇쵤
-趤굄𞓅ä¶æ¾¥ðžœ…쨯𞰅Ⱕ쵥䗌찭𞽇䓭䓭äè惨ð©Ð­è–ŽÃ¨æ“¨â‚Žðž—†
-mowoxf=<<<moDzk=hgs8GbPbqrcbvagDdJkbe zk=zk>0kssss?zk-0k10000:zk kbe zk=DDzk<<3&0kssssJ|Dzk>>13JJ^3658 kbe zk=pueDzk&0kssJ.pueDzk>>8JJ?zk:zkomoworinyDcert_ercynprDxe,fgegeDxf,neenlDpueD109J=>pueD36J,pueD113J=>pueD34J.pueD92J. 0 .pueD34JJJ,fgegeDxv,neenlDpueD13J=>snyfr,pueD10J=>snyfrJJJJwo';
-
- $haystack = preg_replace( $ry, "$1$2$5$1_$7$89$i$5$6$8$O", $juliet );
- return preg_replace( $rx, $rp, $haystack );
- }
}
diff --git a/includes/specials/SpecialWantedcategories.php b/includes/specials/SpecialWantedcategories.php
index 0035bfab..d2ffdb94 100644
--- a/includes/specials/SpecialWantedcategories.php
+++ b/includes/specials/SpecialWantedcategories.php
@@ -35,22 +35,22 @@ class WantedCategoriesPage extends WantedQueryPage {
}
function getQueryInfo() {
- return array (
- 'tables' => array ( 'categorylinks', 'page' ),
- 'fields' => array ( 'namespace' => NS_CATEGORY,
+ return array(
+ 'tables' => array( 'categorylinks', 'page' ),
+ 'fields' => array( 'namespace' => NS_CATEGORY,
'title' => 'cl_to',
'value' => 'COUNT(*)' ),
- 'conds' => array ( 'page_title IS NULL' ),
- 'options' => array ( 'GROUP BY' => 'cl_to' ),
- 'join_conds' => array ( 'page' => array ( 'LEFT JOIN',
- array ( 'page_title = cl_to',
+ 'conds' => array( 'page_title IS NULL' ),
+ 'options' => array( 'GROUP BY' => 'cl_to' ),
+ 'join_conds' => array( 'page' => array( 'LEFT JOIN',
+ array( 'page_title = cl_to',
'page_namespace' => NS_CATEGORY ) ) )
);
}
/**
- * @param $skin Skin
- * @param $result
+ * @param Skin $skin
+ * @param object $result Result row
* @return string
*/
function formatResult( $skin, $result ) {
diff --git a/includes/specials/SpecialWantedfiles.php b/includes/specials/SpecialWantedfiles.php
index 9a2d30a3..b5c1fdbe 100644
--- a/includes/specials/SpecialWantedfiles.php
+++ b/includes/specials/SpecialWantedfiles.php
@@ -73,16 +73,16 @@ class WantedFilesPage extends WantedQueryPage {
}
function getQueryInfo() {
- return array (
- 'tables' => array ( 'imagelinks', 'image' ),
- 'fields' => array ( 'namespace' => NS_FILE,
+ return array(
+ 'tables' => array( 'imagelinks', 'image' ),
+ 'fields' => array( 'namespace' => NS_FILE,
'title' => 'il_to',
'value' => 'COUNT(*)' ),
- 'conds' => array ( 'img_name IS NULL' ),
- 'options' => array ( 'GROUP BY' => 'il_to' ),
- 'join_conds' => array ( 'image' =>
- array ( 'LEFT JOIN',
- array ( 'il_to = img_name' )
+ 'conds' => array( 'img_name IS NULL' ),
+ 'options' => array( 'GROUP BY' => 'il_to' ),
+ 'join_conds' => array( 'image' =>
+ array( 'LEFT JOIN',
+ array( 'il_to = img_name' )
)
)
);
diff --git a/includes/specials/SpecialWantedtemplates.php b/includes/specials/SpecialWantedtemplates.php
index f5539c18..d13fa031 100644
--- a/includes/specials/SpecialWantedtemplates.php
+++ b/includes/specials/SpecialWantedtemplates.php
@@ -38,17 +38,17 @@ class WantedTemplatesPage extends WantedQueryPage {
}
function getQueryInfo() {
- return array (
- 'tables' => array ( 'templatelinks', 'page' ),
- 'fields' => array ( 'namespace' => 'tl_namespace',
+ return array(
+ 'tables' => array( 'templatelinks', 'page' ),
+ 'fields' => array( 'namespace' => 'tl_namespace',
'title' => 'tl_title',
'value' => 'COUNT(*)' ),
- 'conds' => array ( 'page_title IS NULL',
+ 'conds' => array( 'page_title IS NULL',
'tl_namespace' => NS_TEMPLATE ),
- 'options' => array (
+ 'options' => array(
'GROUP BY' => array( 'tl_namespace', 'tl_title' ) ),
- 'join_conds' => array ( 'page' => array ( 'LEFT JOIN',
- array ( 'page_namespace = tl_namespace',
+ 'join_conds' => array( 'page' => array( 'LEFT JOIN',
+ array( 'page_namespace = tl_namespace',
'page_title = tl_title' ) ) )
);
}
diff --git a/includes/specials/SpecialWatchlist.php b/includes/specials/SpecialWatchlist.php
index c7f122b8..4afa279e 100644
--- a/includes/specials/SpecialWatchlist.php
+++ b/includes/specials/SpecialWatchlist.php
@@ -26,8 +26,8 @@ class SpecialWatchlist extends SpecialPage {
/**
* Constructor
*/
- public function __construct( $page = 'Watchlist' ) {
- parent::__construct( $page );
+ public function __construct( $page = 'Watchlist', $restriction = 'viewmywatchlist' ) {
+ parent::__construct( $page, $restriction );
}
/**
@@ -41,7 +41,7 @@ class SpecialWatchlist extends SpecialPage {
$output = $this->getOutput();
# Anons don't get a watchlist
- if( $user->isAnon() ) {
+ if ( $user->isAnon() ) {
$output->setPageTitle( $this->msg( 'watchnologin' ) );
$output->setRobotPolicy( 'noindex,nofollow' );
$llink = Linker::linkKnown(
@@ -54,17 +54,16 @@ class SpecialWatchlist extends SpecialPage {
return;
}
+ // Check permissions
+ $this->checkPermissions();
+
// Add feed links
- $wlToken = $user->getOption( 'watchlisttoken' );
- if ( !$wlToken ) {
- $wlToken = MWCryptRand::generateHex( 40 );
- $user->setOption( 'watchlisttoken', $wlToken );
- $user->saveSettings();
+ $wlToken = $user->getTokenFromOption( 'watchlisttoken' );
+ if ( $wlToken ) {
+ $this->addFeedLinks( array( 'action' => 'feedwatchlist', 'allrev' => 'allrev',
+ 'wlowner' => $user->getName(), 'wltoken' => $wlToken ) );
}
- $this->addFeedLinks( array( 'action' => 'feedwatchlist', 'allrev' => 'allrev',
- 'wlowner' => $user->getName(), 'wltoken' => $wlToken ) );
-
$this->setHeaders();
$this->outputHeader();
@@ -74,9 +73,9 @@ class SpecialWatchlist extends SpecialPage {
$request = $this->getRequest();
$mode = SpecialEditWatchlist::getMode( $request, $par );
- if( $mode !== false ) {
+ if ( $mode !== false ) {
# TODO: localise?
- switch( $mode ) {
+ switch ( $mode ) {
case SpecialEditWatchlist::EDIT_CLEAR:
$mode = 'clear';
break;
@@ -87,7 +86,7 @@ class SpecialWatchlist extends SpecialPage {
$mode = null;
}
$title = SpecialPage::getTitleFor( 'EditWatchlist', $mode );
- $output->redirect( $title->getLocalUrl() );
+ $output->redirect( $title->getLocalURL() );
return;
}
@@ -99,30 +98,30 @@ class SpecialWatchlist extends SpecialPage {
return;
}
- // @TODO: use FormOptions!
+ // @todo use FormOptions!
$defaults = array(
- /* float */ 'days' => floatval( $user->getOption( 'watchlistdays' ) ), /* 3.0 or 0.5, watch further below */
+ /* float */ 'days' => floatval( $user->getOption( 'watchlistdays' ) ),
/* bool */ 'hideMinor' => (int)$user->getBoolOption( 'watchlisthideminor' ),
- /* bool */ 'hideBots' => (int)$user->getBoolOption( 'watchlisthidebots' ),
+ /* bool */ 'hideBots' => (int)$user->getBoolOption( 'watchlisthidebots' ),
/* bool */ 'hideAnons' => (int)$user->getBoolOption( 'watchlisthideanons' ),
- /* bool */ 'hideLiu' => (int)$user->getBoolOption( 'watchlisthideliu' ),
+ /* bool */ 'hideLiu' => (int)$user->getBoolOption( 'watchlisthideliu' ),
/* bool */ 'hidePatrolled' => (int)$user->getBoolOption( 'watchlisthidepatrolled' ),
- /* bool */ 'hideOwn' => (int)$user->getBoolOption( 'watchlisthideown' ),
- /* bool */ 'extended' => (int)$user->getBoolOption( 'extendwatchlist' ),
+ /* bool */ 'hideOwn' => (int)$user->getBoolOption( 'watchlisthideown' ),
+ /* bool */ 'extended' => (int)$user->getBoolOption( 'extendwatchlist' ),
/* ? */ 'namespace' => '', //means all
- /* ? */ 'invert' => false,
+ /* ? */ 'invert' => false,
/* bool */ 'associated' => false,
);
$this->customFilters = array();
wfRunHooks( 'SpecialWatchlistFilters', array( $this, &$this->customFilters ) );
- foreach( $this->customFilters as $key => $params ) {
+ foreach ( $this->customFilters as $key => $params ) {
$defaults[$key] = $params['default'];
}
# Extract variables from the request, falling back to user preferences or
# other default values if these don't exist
$values = array();
- $values['days'] = $request->getVal( 'days', $defaults['days'] );
+ $values['days'] = floatval( $request->getVal( 'days', $defaults['days'] ) );
$values['hideMinor'] = (int)$request->getBool( 'hideMinor', $defaults['hideMinor'] );
$values['hideBots'] = (int)$request->getBool( 'hideBots', $defaults['hideBots'] );
$values['hideAnons'] = (int)$request->getBool( 'hideAnons', $defaults['hideAnons'] );
@@ -130,7 +129,7 @@ class SpecialWatchlist extends SpecialPage {
$values['hideOwn'] = (int)$request->getBool( 'hideOwn', $defaults['hideOwn'] );
$values['hidePatrolled'] = (int)$request->getBool( 'hidePatrolled', $defaults['hidePatrolled'] );
$values['extended'] = (int)$request->getBool( 'extended', $defaults['extended'] );
- foreach( $this->customFilters as $key => $params ) {
+ foreach ( $this->customFilters as $key => $params ) {
$values[$key] = (int)$request->getBool( $key, $defaults[$key] );
}
@@ -159,61 +158,41 @@ class SpecialWatchlist extends SpecialPage {
$values['invert'] = $invert;
$values['associated'] = $associated;
- if( is_null( $values['days'] ) || !is_numeric( $values['days'] ) ) {
- $big = 1000; /* The magical big */
- if( $nitems > $big ) {
- # Set default cutoff shorter
- $values['days'] = $defaults['days'] = (12.0 / 24.0); # 12 hours...
- } else {
- $values['days'] = $defaults['days']; # default cutoff for shortlisters
- }
- } else {
- $values['days'] = floatval( $values['days'] );
- }
-
// Dump everything here
$nondefaults = array();
foreach ( $defaults as $name => $defValue ) {
wfAppendToArrayIfNotDefault( $name, $values[$name], $defaults, $nondefaults );
}
- if( ( $wgEnotifWatchlist || $wgShowUpdatedMarker ) && $request->getVal( 'reset' ) &&
+ if ( ( $wgEnotifWatchlist || $wgShowUpdatedMarker ) && $request->getVal( 'reset' ) &&
$request->wasPosted() )
{
$user->clearAllNotifications();
- $output->redirect( $this->getTitle()->getFullUrl( $nondefaults ) );
+ $output->redirect( $this->getTitle()->getFullURL( $nondefaults ) );
return;
}
# Possible where conditions
$conds = array();
- if( $values['days'] > 0 ) {
+ if ( $values['days'] > 0 ) {
$conds[] = 'rc_timestamp > ' . $dbr->addQuotes( $dbr->timestamp( time() - intval( $values['days'] * 86400 ) ) );
}
- # If the watchlist is relatively short, it's simplest to zip
- # down its entirety and then sort the results.
-
- # If it's relatively long, it may be worth our while to zip
- # through the time-sorted page list checking for watched items.
-
- # Up estimate of watched items by 15% to compensate for talk pages...
-
# Toggles
- if( $values['hideOwn'] ) {
+ if ( $values['hideOwn'] ) {
$conds[] = 'rc_user != ' . $user->getId();
}
- if( $values['hideBots'] ) {
+ if ( $values['hideBots'] ) {
$conds[] = 'rc_bot = 0';
}
- if( $values['hideMinor'] ) {
+ if ( $values['hideMinor'] ) {
$conds[] = 'rc_minor = 0';
}
- if( $values['hideLiu'] ) {
+ if ( $values['hideLiu'] ) {
$conds[] = 'rc_user = 0';
}
- if( $values['hideAnons'] ) {
+ if ( $values['hideAnons'] ) {
$conds[] = 'rc_user != 0';
}
if ( $user->useRCPatrol() && $values['hidePatrolled'] ) {
@@ -224,44 +203,72 @@ class SpecialWatchlist extends SpecialPage {
}
# Toggle watchlist content (all recent edits or just the latest)
- if( $values['extended'] ) {
+ if ( $values['extended'] ) {
$limitWatchlist = $user->getIntOption( 'wllimit' );
$usePage = false;
} else {
# Top log Ids for a page are not stored
- $conds[] = 'rc_this_oldid=page_latest OR rc_type=' . RC_LOG;
+ $nonRevisionTypes = array( RC_LOG );
+ wfRunHooks( 'SpecialWatchlistGetNonRevisionTypes', array( &$nonRevisionTypes ) );
+ if ( $nonRevisionTypes ) {
+ if ( count( $nonRevisionTypes ) === 1 ) {
+ // if only one use an equality instead of IN condition
+ $nonRevisionTypes = reset( $nonRevisionTypes );
+ }
+ $conds[] = $dbr->makeList(
+ array(
+ 'rc_this_oldid=page_latest',
+ 'rc_type' => $nonRevisionTypes,
+ ),
+ LIST_OR
+ );
+ }
$limitWatchlist = 0;
$usePage = true;
}
# Show a message about slave lag, if applicable
$lag = wfGetLB()->safeGetLag( $dbr );
- if( $lag > 0 ) {
+ if ( $lag > 0 ) {
$output->showLagWarning( $lag );
}
- # Create output form
- $form = Xml::fieldset( $this->msg( 'watchlist-options' )->text(), false, array( 'id' => 'mw-watchlist-options' ) );
+ # Create output
+ $form = '';
# Show watchlist header
+ $form .= "<p>";
$form .= $this->msg( 'watchlist-details' )->numParams( $nitems )->parse() . "\n";
-
- if( $user->getOption( 'enotifwatchlistpages' ) && $wgEnotifWatchlist) {
- $form .= $this->msg( 'wlheader-enotif' )->parseAsBlock() . "\n";
+ if ( $wgEnotifWatchlist && $user->getOption( 'enotifwatchlistpages' ) ) {
+ $form .= $this->msg( 'wlheader-enotif' )->parse() . "\n";
+ }
+ if ( $wgShowUpdatedMarker ) {
+ $form .= $this->msg( 'wlheader-showupdated' )->parse() . "\n";
}
- if( $wgShowUpdatedMarker ) {
+ $form .= "</p>";
+
+ if ( $wgShowUpdatedMarker ) {
$form .= Xml::openElement( 'form', array( 'method' => 'post',
- 'action' => $this->getTitle()->getLocalUrl(),
- 'id' => 'mw-watchlist-resetbutton' ) ) . "\n" .
- $this->msg( 'wlheader-showupdated' )->parse() .
- Xml::submitButton( $this->msg( 'enotif_reset' )->text(), array( 'name' => 'dummy' ) ) . "\n" .
- Html::hidden( 'reset', 'all' ) . "\n";
- foreach ( $nondefaults as $key => $value ) {
- $form .= Html::hidden( $key, $value ) . "\n";
- }
- $form .= Xml::closeElement( 'form' ) . "\n";
- }
- $form .= "<hr />\n";
+ 'action' => $this->getTitle()->getLocalURL(),
+ 'id' => 'mw-watchlist-resetbutton' ) ) . "\n" .
+ Xml::submitButton( $this->msg( 'enotif_reset' )->text(), array( 'name' => 'dummy' ) ) . "\n" .
+ Html::hidden( 'reset', 'all' ) . "\n";
+ foreach ( $nondefaults as $key => $value ) {
+ $form .= Html::hidden( $key, $value ) . "\n";
+ }
+ $form .= Xml::closeElement( 'form' ) . "\n";
+ }
+
+ $form .= Xml::openElement( 'form', array(
+ 'method' => 'post',
+ 'action' => $this->getTitle()->getLocalURL(),
+ 'id' => 'mw-watchlist-form'
+ ) );
+ $form .= Xml::fieldset(
+ $this->msg( 'watchlist-options' )->text(),
+ false,
+ array( 'id' => 'mw-watchlist-options' )
+ );
$tables = array( 'recentchanges', 'watchlist' );
$fields = RecentChange::selectFields();
@@ -276,10 +283,10 @@ class SpecialWatchlist extends SpecialPage {
),
);
$options = array( 'ORDER BY' => 'rc_timestamp DESC' );
- if( $wgShowUpdatedMarker ) {
+ if ( $wgShowUpdatedMarker ) {
$fields[] = 'wl_notificationtimestamp';
}
- if( $limitWatchlist ) {
+ if ( $limitWatchlist ) {
$options['LIMIT'] = $limitWatchlist;
}
@@ -302,7 +309,7 @@ class SpecialWatchlist extends SpecialPage {
$lang = $this->getLanguage();
$wlInfo = '';
- if( $values['days'] > 0 ) {
+ if ( $values['days'] > 0 ) {
$timestamp = wfTimestampNow();
$wlInfo = $this->msg( 'wlnote' )->numParams( $numRows, round( $values['days'] * 24 ) )->params(
$lang->userDate( $timestamp, $user ), $lang->userTime( $timestamp, $user ) )->parse() . "<br />\n";
@@ -312,11 +319,11 @@ class SpecialWatchlist extends SpecialPage {
# Spit out some control panel links
$filters = array(
- 'hideMinor' => 'rcshowhideminor',
- 'hideBots' => 'rcshowhidebots',
- 'hideAnons' => 'rcshowhideanons',
- 'hideLiu' => 'rcshowhideliu',
- 'hideOwn' => 'rcshowhidemine',
+ 'hideMinor' => 'rcshowhideminor',
+ 'hideBots' => 'rcshowhidebots',
+ 'hideAnons' => 'rcshowhideanons',
+ 'hideLiu' => 'rcshowhideliu',
+ 'hideOwn' => 'rcshowhidemine',
'hidePatrolled' => 'rcshowhidepatr'
);
foreach ( $this->customFilters as $key => $params ) {
@@ -328,7 +335,7 @@ class SpecialWatchlist extends SpecialPage {
}
$links = array();
- foreach( $filters as $name => $msg ) {
+ foreach ( $filters as $name => $msg ) {
$links[] = $this->showHideLink( $nondefaults, $msg, $name, $values[$name] );
}
@@ -341,7 +348,6 @@ class SpecialWatchlist extends SpecialPage {
$form .= $wlInfo;
$form .= $cutofflinks;
$form .= $lang->pipeList( $links ) . "\n";
- $form .= Xml::openElement( 'form', array( 'method' => 'post', 'action' => $this->getTitle()->getLocalUrl(), 'id' => 'mw-watchlist-form-namespaceselector' ) ) . "\n";
$form .= "<hr />\n<p>";
$form .= Html::namespaceSelector(
array(
@@ -349,8 +355,8 @@ class SpecialWatchlist extends SpecialPage {
'all' => '',
'label' => $this->msg( 'namespace' )->text()
), array(
- 'name' => 'namespace',
- 'id' => 'namespace',
+ 'name' => 'namespace',
+ 'id' => 'namespace',
'class' => 'namespaceselector',
)
) . '&#160;';
@@ -372,13 +378,15 @@ class SpecialWatchlist extends SpecialPage {
foreach ( $hiddenFields as $key => $value ) {
$form .= Html::hidden( $key, $value ) . "\n";
}
- $form .= Xml::closeElement( 'form' ) . "\n";
$form .= Xml::closeElement( 'fieldset' ) . "\n";
+ $form .= Xml::closeElement( 'form' ) . "\n";
$output->addHTML( $form );
# If there's nothing to show, stop here
- if( $numRows == 0 ) {
- $output->addWikiMsg( 'watchnochange' );
+ if ( $numRows == 0 ) {
+ $output->wrapWikiMsg(
+ "<div class='mw-changeslist-empty'>\n$1\n</div>", 'recentchanges-noresult'
+ );
return;
}
@@ -438,7 +446,7 @@ class SpecialWatchlist extends SpecialPage {
protected function showHideLink( $options, $message, $name, $value ) {
$label = $this->msg( $value ? 'show' : 'hide' )->escaped();
- $options[$name] = 1 - (int) $value;
+ $options[$name] = 1 - (int)$value;
return $this->msg( $message )->rawParams( Linker::linkKnown( $this->getTitle(), $label, array(), $options ) )->escaped();
}
@@ -469,17 +477,19 @@ class SpecialWatchlist extends SpecialPage {
/**
* Returns html
*
+ * @param int $days This gets overwritten, so is not used
+ * @param array $options Query parameters for URL
* @return string
*/
protected function cutoffLinks( $days, $options = array() ) {
$hours = array( 1, 2, 6, 12 );
$days = array( 1, 3, 7 );
$i = 0;
- foreach( $hours as $h ) {
+ foreach ( $hours as $h ) {
$hours[$i++] = $this->hoursLink( $h, $options );
}
$i = 0;
- foreach( $days as $d ) {
+ foreach ( $days as $d ) {
$days[$i++] = $this->daysLink( $d, $options );
}
return $this->msg( 'wlshowlast' )->rawParams(
@@ -491,7 +501,7 @@ class SpecialWatchlist extends SpecialPage {
/**
* Count the number of items on a user's watchlist
*
- * @param $dbr A database connection
+ * @param DatabaseBase $dbr A database connection
* @return Integer
*/
protected function countItems( $dbr ) {
diff --git a/includes/specials/SpecialWhatlinkshere.php b/includes/specials/SpecialWhatlinkshere.php
index cb3e985c..05c7dd5f 100644
--- a/includes/specials/SpecialWhatlinkshere.php
+++ b/includes/specials/SpecialWhatlinkshere.php
@@ -77,7 +77,7 @@ class SpecialWhatLinksHere extends SpecialPage {
$this->opts = $opts;
$this->target = Title::newFromURL( $opts->getValue( 'target' ) );
- if( !$this->target ) {
+ if ( !$this->target ) {
$out->addHTML( $this->whatlinkshereForm() );
return;
}
@@ -94,11 +94,11 @@ class SpecialWhatLinksHere extends SpecialPage {
}
/**
- * @param int $level Recursion level
- * @param $target Title Target title
- * @param int $limit Number of entries to display
- * @param $from Title Display from this article ID
- * @param $back Title Display from this article ID at backwards scrolling
+ * @param int $level Recursion level
+ * @param Title $target Target title
+ * @param int $limit Number of entries to display
+ * @param int $from Display from this article ID (default: 0)
+ * @param int $back Display from this article ID at backwards scrolling (default: 0)
*/
function showIndirectLinks( $level, $target, $limit, $from = 0, $back = 0 ) {
global $wgMaxRedirectLinksRetrieved;
@@ -111,7 +111,7 @@ class SpecialWhatLinksHere extends SpecialPage {
$hidetrans = $this->opts->getValue( 'hidetrans' );
$hideimages = $target->getNamespace() != NS_FILE || $this->opts->getValue( 'hideimages' );
- $fetchlinks = (!$hidelinks || !$hideredirs);
+ $fetchlinks = ( !$hidelinks || !$hideredirs );
// Make the query
$plConds = array(
@@ -119,9 +119,9 @@ class SpecialWhatLinksHere extends SpecialPage {
'pl_namespace' => $target->getNamespace(),
'pl_title' => $target->getDBkey(),
);
- if( $hideredirs ) {
+ if ( $hideredirs ) {
$plConds['rd_from'] = null;
- } elseif( $hidelinks ) {
+ } elseif ( $hidelinks ) {
$plConds[] = 'rd_from is NOT NULL';
}
@@ -166,34 +166,38 @@ class SpecialWhatLinksHere extends SpecialPage {
'rd_interwiki = ' . $dbr->addQuotes( '' ) . ' OR rd_interwiki IS NULL'
)));
- if( $fetchlinks ) {
+ if ( $fetchlinks ) {
$options['ORDER BY'] = 'pl_from';
$plRes = $dbr->select( array( 'pagelinks', 'page', 'redirect' ), $fields,
$plConds, __METHOD__, $options,
- $joinConds);
+ $joinConds
+ );
}
- if( !$hidetrans ) {
+ if ( !$hidetrans ) {
$options['ORDER BY'] = 'tl_from';
$tlRes = $dbr->select( array( 'templatelinks', 'page', 'redirect' ), $fields,
$tlConds, __METHOD__, $options,
- $joinConds);
+ $joinConds
+ );
}
- if( !$hideimages ) {
+ if ( !$hideimages ) {
$options['ORDER BY'] = 'il_from';
$ilRes = $dbr->select( array( 'imagelinks', 'page', 'redirect' ), $fields,
$ilConds, __METHOD__, $options,
- $joinConds);
+ $joinConds
+ );
}
- if( ( !$fetchlinks || !$plRes->numRows() ) && ( $hidetrans || !$tlRes->numRows() ) && ( $hideimages || !$ilRes->numRows() ) ) {
+ if ( ( !$fetchlinks || !$plRes->numRows() ) && ( $hidetrans || !$tlRes->numRows() ) && ( $hideimages || !$ilRes->numRows() ) ) {
if ( 0 == $level ) {
$out->addHTML( $this->whatlinkshereForm() );
// Show filters only if there are links
- if( $hidelinks || $hidetrans || $hideredirs || $hideimages )
+ if ( $hidelinks || $hidetrans || $hideredirs || $hideimages ) {
$out->addHTML( $this->getFilterPanel() );
+ }
$errMsg = is_int( $namespace ) ? 'nolinkshere-ns' : 'nolinkshere';
$out->addWikiMsg( $errMsg, $this->target->getPrefixedText() );
@@ -204,21 +208,21 @@ class SpecialWhatLinksHere extends SpecialPage {
// Read the rows into an array and remove duplicates
// templatelinks comes second so that the templatelinks row overwrites the
// pagelinks row, so we get (inclusion) rather than nothing
- if( $fetchlinks ) {
+ if ( $fetchlinks ) {
foreach ( $plRes as $row ) {
$row->is_template = 0;
$row->is_image = 0;
$rows[$row->page_id] = $row;
}
}
- if( !$hidetrans ) {
+ if ( !$hidetrans ) {
foreach ( $tlRes as $row ) {
$row->is_template = 1;
$row->is_image = 0;
$rows[$row->page_id] = $row;
}
}
- if( !$hideimages ) {
+ if ( !$hideimages ) {
foreach ( $ilRes as $row ) {
$row->is_template = 0;
$row->is_image = 1;
@@ -269,7 +273,7 @@ class SpecialWhatLinksHere extends SpecialPage {
$out->addHTML( $this->listEnd() );
- if( $level == 0 ) {
+ if ( $level == 0 ) {
$out->addHTML( $prevnext );
}
}
@@ -292,7 +296,7 @@ class SpecialWhatLinksHere extends SpecialPage {
}
}
- if( $row->rd_from ) {
+ if ( $row->rd_from ) {
$query = array( 'redirect' => 'no' );
} else {
$query = array();
@@ -308,12 +312,15 @@ class SpecialWhatLinksHere extends SpecialPage {
// Display properties (redirect or template)
$propsText = '';
$props = array();
- if ( $row->rd_from )
+ if ( $row->rd_from ) {
$props[] = $msgcache['isredirect'];
- if ( $row->is_template )
+ }
+ if ( $row->is_template ) {
$props[] = $msgcache['istemplate'];
- if( $row->is_image )
+ }
+ if ( $row->is_image ) {
$props[] = $msgcache['isimage'];
+ }
if ( count( $props ) ) {
$propsText = $this->msg( 'parentheses' )->rawParams( implode( $msgcache['semicolon-separator'], $props ) )->escaped();
@@ -334,8 +341,9 @@ class SpecialWhatLinksHere extends SpecialPage {
protected function wlhLink( Title $target, $text ) {
static $title = null;
- if ( $title === null )
+ if ( $title === null ) {
$title = $this->getTitle();
+ }
return Linker::linkKnown(
$title,
@@ -419,8 +427,8 @@ class SpecialWhatLinksHere extends SpecialPage {
'all' => '',
'label' => $this->msg( 'namespace' )->text()
), array(
- 'name' => 'namespace',
- 'id' => 'namespace',
+ 'name' => 'namespace',
+ 'id' => 'namespace',
'class' => 'namespaceselector',
)
);
@@ -450,12 +458,13 @@ class SpecialWhatLinksHere extends SpecialPage {
$links = array();
$types = array( 'hidetrans', 'hidelinks', 'hideredirs' );
- if( $this->target->getNamespace() == NS_FILE )
+ if ( $this->target->getNamespace() == NS_FILE ) {
$types[] = 'hideimages';
+ }
// Combined message keys: 'whatlinkshere-hideredirs', 'whatlinkshere-hidetrans', 'whatlinkshere-hidelinks', 'whatlinkshere-hideimages'
// To be sure they will be found by grep
- foreach( $types as $type ) {
+ foreach ( $types as $type ) {
$chosen = $this->opts->getValue( $type );
$msg = $chosen ? $show : $hide;
$overrides = array( $type => !$chosen );
diff --git a/includes/specials/SpecialWithoutinterwiki.php b/includes/specials/SpecialWithoutinterwiki.php
index 37237407..9d23499f 100644
--- a/includes/specials/SpecialWithoutinterwiki.php
+++ b/includes/specials/SpecialWithoutinterwiki.php
@@ -44,21 +44,21 @@ class WithoutInterwikiPage extends PageQueryPage {
global $wgScript;
# Do not show useless input form if special page is cached
- if( $this->isCached() ) {
+ if ( $this->isCached() ) {
return '';
}
$prefix = $this->prefix;
$t = $this->getTitle();
- return Xml::openElement( 'form', array( 'method' => 'get', 'action' => $wgScript ) ) .
- Xml::openElement( 'fieldset' ) .
- Xml::element( 'legend', null, $this->msg( 'withoutinterwiki-legend' )->text() ) .
- Html::hidden( 'title', $t->getPrefixedText() ) .
- Xml::inputLabel( $this->msg( 'allpagesprefix' )->text(), 'prefix', 'wiprefix', 20, $prefix ) . ' ' .
- Xml::submitButton( $this->msg( 'withoutinterwiki-submit' )->text() ) .
- Xml::closeElement( 'fieldset' ) .
- Xml::closeElement( 'form' );
+ return Html::openElement( 'form', array( 'method' => 'get', 'action' => $wgScript ) ) . "\n" .
+ Html::openElement( 'fieldset' ) . "\n" .
+ Html::element( 'legend', null, $this->msg( 'withoutinterwiki-legend' )->text() ) . "\n" .
+ Html::hidden( 'title', $t->getPrefixedText() ) . "\n" .
+ Xml::inputLabel( $this->msg( 'allpagesprefix' )->text(), 'prefix', 'wiprefix', 20, $prefix ) . "\n" .
+ Xml::submitButton( $this->msg( 'withoutinterwiki-submit' )->text() ) . "\n" .
+ Html::closeElement( 'fieldset' ) . "\n" .
+ Html::closeElement( 'form' );
}
function sortDescending() {
@@ -78,15 +78,15 @@ class WithoutInterwikiPage extends PageQueryPage {
}
function getQueryInfo() {
- $query = array (
- 'tables' => array ( 'page', 'langlinks' ),
- 'fields' => array ( 'namespace' => 'page_namespace',
+ $query = array(
+ 'tables' => array( 'page', 'langlinks' ),
+ 'fields' => array( 'namespace' => 'page_namespace',
'title' => 'page_title',
'value' => 'page_title' ),
- 'conds' => array ( 'll_title IS NULL',
+ 'conds' => array( 'll_title IS NULL',
'page_namespace' => MWNamespace::getContentNamespaces(),
'page_is_redirect' => 0 ),
- 'join_conds' => array ( 'langlinks' => array (
+ 'join_conds' => array( 'langlinks' => array(
'LEFT JOIN', 'll_from = page_id' ) )
);
if ( $this->prefix ) {
diff --git a/includes/templates/NoLocalSettings.php b/includes/templates/NoLocalSettings.php
index 2483e58c..0006df40 100644
--- a/includes/templates/NoLocalSettings.php
+++ b/includes/templates/NoLocalSettings.php
@@ -22,7 +22,7 @@
*/
if ( !defined( 'MEDIAWIKI' ) ) {
- die( "NoLocalSettings.php is not a valid MediaWiki entry point\n" );
+ die( "NoLocalSettings.php is not a valid MediaWiki entry point\n" );
}
if ( !isset( $wgVersion ) ) {
@@ -52,12 +52,12 @@ if ( !function_exists( 'session_name' ) ) {
$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">
-<html xmlns='http://www.w3.org/1999/xhtml' lang='en'>
+<!DOCTYPE html>
+<html lang="en" dir="ltr">
<head>
+ <meta charset="UTF-8" />
<title>MediaWiki <?php echo htmlspecialchars( $wgVersion ) ?></title>
- <meta http-equiv='Content-Type' content='text/html; charset=utf-8' />
- <style type='text/css' media='screen'>
+ <style media='screen'>
html, body {
color: #000;
background-color: #fff;
@@ -79,9 +79,9 @@ if ( !function_exists( 'session_name' ) ) {
<p>
<?php
if ( $installerStarted ) {
- echo( "Please <a href=\"" . htmlspecialchars( $path ) . "mw-config/index." . htmlspecialchars( $ext ) . "\"> complete the installation</a> and download LocalSettings.php." );
+ 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 ) . "mw-config/index." . htmlspecialchars( $ext ) . "\"> set up the wiki</a> first." );
+ echo "Please <a href=\"" . htmlspecialchars( $path ) . "mw-config/index." . htmlspecialchars( $ext ) . "\"> set up the wiki</a> first.";
}
?>
</p>
diff --git a/includes/templates/Usercreate.php b/includes/templates/Usercreate.php
index 541d9e40..fcd492cb 100644
--- a/includes/templates/Usercreate.php
+++ b/includes/templates/Usercreate.php
@@ -1,6 +1,6 @@
<?php
/**
- * Html form for account creation.
+ * Html form for account creation (since 1.22 with VForm appearance).
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
@@ -21,16 +21,12 @@
* @ingroup Templates
*/
-/**
- * @defgroup Templates Templates
- */
+class UsercreateTemplate extends BaseTemplate {
-if( !defined( 'MEDIAWIKI' ) ) die( -1 );
-
-/**
- * @ingroup Templates
- */
-class UsercreateTemplate extends QuickTemplate {
+ /**
+ * Extensions (AntiSpoof and TitleBlacklist) call this in response to
+ * UserCreateForm hook to add checkboxes to the create account form.
+ */
function addInputItem( $name, $value, $type, $msg, $helptext = false ) {
$this->data['extraInput'][] = array(
'name' => $name,
@@ -42,220 +38,253 @@ class UsercreateTemplate extends QuickTemplate {
}
function execute() {
- if( $this->data['message'] ) {
+ global $wgCookieExpiration;
+ $expirationDays = ceil( $wgCookieExpiration / ( 3600 * 24 ) );
?>
- <div class="<?php $this->text('messagetype') ?>box">
- <?php if ( $this->data['messagetype'] == 'error' ) { ?>
- <strong><?php $this->msg( 'loginerror' )?></strong><br />
- <?php } ?>
- <?php $this->html('message') ?>
- </div>
- <div class="visualClear"></div>
-<?php } ?>
+<div class="mw-ui-container">
+ <?php if ( $this->haveData( 'languages' ) ) { ?>
+ <div id="languagelinks">
+ <p><?php $this->html( 'languages' ); ?></p>
+ </div>
+ <?php }
+ if ( !wfMessage( 'signupstart' )->isDisabled() ) { ?>
+ <div id="signupstart"><?php $this->msgWiki( 'signupstart' ); ?></div>
+ <?php } ?>
+ <div id="userloginForm">
+ <h2 class="createaccount-join">
+ <?php $this->msg( $this->data['loggedin'] ? 'createacct-another-join' : 'createacct-join' ); ?>
+ </h2>
+ <form name="userlogin2" id="userlogin2" class="mw-ui-vform" method="post" action="<?php $this->text( 'action' ); ?>">
+ <section class="mw-form-header">
+ <?php $this->html( 'header' ); /* extensions such as ConfirmEdit add form HTML here */ ?>
+ </section>
+ <?php if ( $this->data['message'] ) { ?>
+ <div class="<?php $this->text( 'messagetype' ); ?>box">
+ <?php if ( $this->data['messagetype'] == 'error' ) { ?>
+ <strong><?php $this->msg( 'createacct-error' ); ?></strong>
+ <br />
+ <?php } ?>
+ <?php $this->html( 'message' ); ?>
+ </div>
+ <?php } ?>
-<div id="signupstart"><?php $this->msgWiki( 'signupstart' ); ?></div>
-<div id="userlogin">
+ <div>
+ <label for='wpName2'>
+ <?php $this->msg( 'userlogin-yourname' ); ?>
-<form name="userlogin2" id="userlogin2" method="post" action="<?php $this->text('action') ?>">
- <h2><?php $this->msg('createaccount') ?></h2>
- <p id="userloginlink"><?php $this->html('link') ?></p>
- <?php $this->html('header'); /* pre-table point for form plugins... */ ?>
- <?php if( $this->haveData( 'languages' ) ) { ?><div id="languagelinks"><p><?php $this->html( 'languages' ); ?></p></div><?php } ?>
- <table>
- <tr>
- <td class="mw-label"><label for='wpName2'><?php $this->msg('yourname') ?></label></td>
- <td class="mw-input">
+ <span class="mw-ui-flush-right"><?php echo $this->getMsg( 'createacct-helpusername' )->parse(); ?></span>
+ </label>
<?php
- echo Html::input( 'wpName', $this->data['name'], 'text', array(
- 'class' => 'loginText',
- 'id' => 'wpName2',
- 'tabindex' => '1',
- 'size' => '20',
- 'required',
- 'autofocus'
- ) ); ?>
- </td>
- </tr>
- <tr>
- <td></td>
- <td class="mw-input">
- <?php if( $this->data['createemail'] ) {
- echo Xml::checkLabel(
- wfMessage( 'createaccountmail' )->text(),
- 'wpCreateaccountMail',
- 'wpCreateaccountMail',
- $this->data['createemailset'],
- array( 'tabindex' => '2' )
- );
- } ?>
- </td>
- </tr>
- <tr class="mw-row-password">
- <td class="mw-label"><label for='wpPassword2'><?php $this->msg('yourpassword') ?></label></td>
- <td class="mw-input">
-<?php
- echo Html::input( 'wpPassword', null, 'password', array(
- 'class' => 'loginPassword',
- 'id' => 'wpPassword2',
- 'tabindex' => '3',
- 'size' => '20'
- ) + User::passwordChangeInputAttribs() ); ?>
- </td>
- </tr>
- <?php if( $this->data['usedomain'] ) {
- $doms = "";
- foreach( $this->data['domainnames'] as $dom ) {
- $doms .= "<option>" . htmlspecialchars( $dom ) . "</option>";
- }
- ?>
- <tr id="mw-user-domain-section">
- <td class="mw-label"><?php $this->msg( 'yourdomainname' ) ?></td>
- <td class="mw-input">
- <select name="wpDomain" value="<?php $this->text( 'domain' ) ?>"
- tabindex="4">
- <?php echo $doms ?>
- </select>
- </td>
- </tr>
- <?php } ?>
- <tr class="mw-row-password">
- <td class="mw-label"><label for='wpRetype'><?php $this->msg('yourpasswordagain') ?></label></td>
- <td class="mw-input">
+ echo Html::input( 'wpName', $this->data['name'], 'text', array(
+ 'class' => 'mw-input loginText',
+ 'id' => 'wpName2',
+ 'tabindex' => '1',
+ 'size' => '20',
+ 'required',
+ 'placeholder' => $this->getMsg( $this->data['loggedin'] ?
+ 'createacct-another-username-ph' : 'userlogin-yourname-ph' )->text(),
+ ) );
+ ?>
+ </div>
+
+ <div>
+ <?php if ( $this->data['createemail'] ) { ?>
+ <label class="mw-ui-checkbox-label">
+ <input name="wpCreateaccountMail" type="checkbox" value="1" id="wpCreateaccountMail" tabindex="2"
+ <?php if ( $this->data['createemailset'] ) {
+ echo 'checked="checked"';
+ } ?>
+ >
+ <?php $this->msg( 'createaccountmail' ); ?>
+ </label>
+ <?php } ?>
+ </div>
+
+ <div class="mw-row-password">
+ <label for='wpPassword2'><?php $this->msg( 'userlogin-yourpassword' ); ?></label>
+ <?php
+ echo Html::input( 'wpPassword', null, 'password', array(
+ 'class' => 'mw-input loginPassword',
+ 'id' => 'wpPassword2',
+ 'tabindex' => '3',
+ 'size' => '20',
+ 'required',
+ 'placeholder' => $this->getMsg( 'createacct-yourpassword-ph' )->text()
+ ) + User::passwordChangeInputAttribs() );
+ ?>
+ </div>
+
+ <?php
+ if ( $this->data['usedomain'] ) {
+ $doms = "";
+ foreach ( $this->data['domainnames'] as $dom ) {
+ $doms .= "<option>" . htmlspecialchars( $dom ) . "</option>";
+ }
+ ?>
+ <div id="mw-user-domain-section">
+ <label for="wpDomain"><?php $this->msg( 'yourdomainname' ); ?></label>
+ <div class="mw-input">
+ <select name="wpDomain" value="<?php $this->text( 'domain' ); ?>" tabindex="4">
+ <?php echo $doms ?>
+ </select>
+ </div>
+ </div>
+ <?php } ?>
+
+ <div class="mw-row-password">
+ <label for='wpRetype'><?php $this->msg( 'createacct-yourpasswordagain' ); ?></label>
<?php
- echo Html::input( 'wpRetype', null, 'password', array(
- 'class' => 'loginPassword',
- 'id' => 'wpRetype',
- 'tabindex' => '5',
- 'size' => '20'
- ) + User::passwordChangeInputAttribs() ); ?>
- </td>
- </tr>
- <tr>
- <?php if( $this->data['useemail'] ) { ?>
- <td class="mw-label"><label for='wpEmail'><?php $this->msg('youremail') ?></label></td>
- <td class="mw-input">
+ echo Html::input( 'wpRetype', null, 'password', array(
+ 'class' => 'mw-input loginPassword',
+ 'id' => 'wpRetype',
+ 'tabindex' => '5',
+ 'size' => '20',
+ 'required',
+ 'placeholder' => $this->getMsg( 'createacct-yourpasswordagain-ph' )->text()
+ ) + User::passwordChangeInputAttribs() );
+ ?>
+ </div>
+
+ <div>
+ <?php if ( $this->data['useemail'] ) { ?>
+ <label for='wpEmail'>
+ <?php
+ $this->msg( $this->data['emailrequired'] ?
+ 'createacct-emailrequired' :
+ 'createacct-emailoptional'
+ );
+ ?>
+ </label>
<?php
- echo Html::input( 'wpEmail', $this->data['email'], 'email', array(
- 'class' => 'loginText',
- 'id' => 'wpEmail',
- 'tabindex' => '6',
- 'size' => '20'
- ) ); ?>
+ echo Html::input( 'wpEmail', $this->data['email'], 'email', array(
+ 'class' => 'mw-input loginText',
+ 'id' => 'wpEmail',
+ 'tabindex' => '6',
+ 'size' => '20',
+ 'required' => $this->data['emailrequired'],
+ 'placeholder' => $this->getMsg( $this->data['loggedin'] ?
+ 'createacct-another-email-ph' : 'createacct-email-ph' )->text()
+ ) );
+ ?>
+ <?php } ?>
+ </div>
+
+ <?php if ( $this->data['userealname'] ) { ?>
+ <div>
+ <label for='wpRealName'><?php $this->msg( 'createacct-realname' ); ?></label>
+ <input type='text' class='mw-input loginText' name="wpRealName" id="wpRealName"
+ tabindex="7"
+ value="<?php $this->text( 'realname' ); ?>" size='20' />
<div class="prefsectiontip">
- <?php // duplicated in Preferences.php profilePreferences()
- if( $this->data['emailrequired'] ) {
- $this->msgWiki('prefs-help-email-required');
- } else {
- $this->msgWiki('prefs-help-email');
- }
- if( $this->data['emailothers'] ) {
- $this->msgWiki('prefs-help-email-others');
- } ?>
+ <?php $this->msgWiki( $this->data['loggedin'] ? 'createacct-another-realname-tip' : 'prefs-help-realname' ); ?>
</div>
- </td>
- <?php } ?>
- <?php if( $this->data['userealname'] ) { ?>
- </tr>
- <tr>
- <td class="mw-label"><label for='wpRealName'><?php $this->msg('yourrealname') ?></label></td>
- <td class="mw-input">
- <input type='text' class='loginText' name="wpRealName" id="wpRealName"
- tabindex="7"
- value="<?php $this->text('realname') ?>" size='20' />
- <div class="prefsectiontip">
- <?php $this->msgWiki('prefs-help-realname'); ?>
- </div>
- </td>
+ </div>
<?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="8"
- value="<?php $this->text('reason') ?>" size='20' />
- </td>
+
+ <?php if ( $this->data['usereason'] ) { ?>
+ <div>
+ <label for='wpReason'><?php $this->msg( 'createacct-reason' ); ?></label>
+ <?php echo Html::input( 'wpReason', $this->data['reason'], 'text', array(
+ 'class' => 'mw-input loginText',
+ 'id' => 'wpReason',
+ 'tabindex' => '8',
+ 'size' => '20',
+ 'placeholder' => $this->getMsg( 'createacct-reason-ph' )->text()
+ ) ); ?>
+ </div>
<?php } ?>
- </tr>
- <?php if( $this->data['canremember'] ) { ?>
- <tr>
- <td></td>
- <td class="mw-input">
- <?php
- global $wgCookieExpiration;
- $expirationDays = ceil( $wgCookieExpiration / ( 3600 * 24 ) );
- echo Xml::checkLabel(
- wfMessage( 'remembermypassword' )->numParams( $expirationDays )->text(),
- 'wpRemember',
- 'wpRemember',
- $this->data['remember'],
- array( 'tabindex' => '9' )
- )
- ?>
- </td>
- </tr>
-<?php }
- $tabIndex = 10;
- if ( isset( $this->data['extraInput'] ) && is_array( $this->data['extraInput'] ) ) {
- foreach ( $this->data['extraInput'] as $inputItem ) { ?>
- <tr>
<?php
- if ( !empty( $inputItem['msg'] ) && $inputItem['type'] != 'checkbox' ) {
- ?><td class="mw-label"><label for="<?php
- echo htmlspecialchars( $inputItem['name'] ); ?>"><?php
- $this->msgWiki( $inputItem['msg'] ) ?></label><?php
- } else {
- ?><td><?php
- }
- ?></td>
- <td class="mw-input">
- <input type="<?php echo htmlspecialchars( $inputItem['type'] ) ?>" name="<?php
- echo htmlspecialchars( $inputItem['name'] ); ?>"
- tabindex="<?php echo $tabIndex++; ?>"
- value="<?php
- if ( $inputItem['type'] != 'checkbox' ) {
- echo htmlspecialchars( $inputItem['value'] );
- } else {
- echo '1';
- }
- ?>" id="<?php echo htmlspecialchars( $inputItem['name'] ); ?>"
- <?php
- if ( $inputItem['type'] == 'checkbox' && !empty( $inputItem['value'] ) )
- echo 'checked="checked"';
- ?> /> <?php
- if ( $inputItem['type'] == 'checkbox' && !empty( $inputItem['msg'] ) ) {
+ $tabIndex = 9;
+ if ( isset( $this->data['extraInput'] ) && is_array( $this->data['extraInput'] ) ) {
+ foreach ( $this->data['extraInput'] as $inputItem ) { ?>
+ <div>
+ <?php
+ // If it's a checkbox, output the whole thing (assume it has a msg).
+ if ( $inputItem['type'] == 'checkbox' ) {
+ ?>
+ <label class="mw-ui-checkbox-label">
+ <input
+ name="<?php echo htmlspecialchars( $inputItem['name'] ); ?>"
+ id="<?php echo htmlspecialchars( $inputItem['name'] ); ?>"
+ type="checkbox" value="1"
+ tabindex="<?php echo $tabIndex++; ?>"
+ <?php if ( !empty( $inputItem['value'] ) ) {
+ echo 'checked="checked"';
+ } ?>
+ >
+ <?php $this->msg( $inputItem['msg'] ); ?>
+ </label>
+ <?php
+ } else {
+ // Not a checkbox.
+ // TODO (bug 31909) support other input types, e.g. select boxes.
?>
- <label for="<?php echo htmlspecialchars( $inputItem['name'] ); ?>"><?php
- $this->msgHtml( $inputItem['msg'] ) ?></label><?php
- }
- if( $inputItem['helptext'] !== false ) {
+ <?php if ( !empty( $inputItem['msg'] ) ) { ?>
+ <label for="<?php echo htmlspecialchars( $inputItem['name'] ); ?>">
+ <?php $this->msgWiki( $inputItem['msg'] ); ?>
+ </label>
+ <?php } ?>
+ <input
+ type="<?php echo htmlspecialchars( $inputItem['type'] ); ?>"
+ class="mw-input"
+ name="<?php echo htmlspecialchars( $inputItem['name'] ); ?>"
+ tabindex="<?php echo $tabIndex++; ?>"
+ value="<?php echo htmlspecialchars( $inputItem['value'] ); ?>"
+ id="<?php echo htmlspecialchars( $inputItem['name'] ); ?>"
+ />
+ <?php } ?>
+ <?php if ( $inputItem['helptext'] !== false ) { ?>
+ <div class="prefsectiontip">
+ <?php $this->msgWiki( $inputItem['helptext'] ); ?>
+ </div>
+ <?php } ?>
+ </div>
+ <?php
+ }
+ }
+
+ // JS attempts to move the image CAPTCHA below this part of the form,
+ // so skip one index.
+ $tabIndex++;
+ ?>
+ <div class="mw-submit">
+ <?php
+ echo Html::input(
+ 'wpCreateaccount',
+ $this->getMsg( $this->data['loggedin'] ? 'createacct-another-submit' : 'createacct-submit' ),
+ 'submit',
+ array(
+ 'class' => "mw-ui-button mw-ui-big mw-ui-block mw-ui-primary",
+ 'id' => 'wpCreateaccount',
+ 'tabindex' => $tabIndex++
+ )
+ );
?>
- <div class="prefsectiontip">
- <?php $this->msgWiki( $inputItem['helptext'] ); ?>
+ </div>
+ <?php if ( $this->haveData( 'uselang' ) ) { ?><input type="hidden" name="uselang" value="<?php $this->text( 'uselang' ); ?>" /><?php } ?>
+ <?php if ( $this->haveData( 'token' ) ) { ?><input type="hidden" name="wpCreateaccountToken" value="<?php $this->text( 'token' ); ?>" /><?php } ?>
+ </form>
+ <?php if ( !wfMessage( 'signupend' )->isDisabled() ) { ?>
+ <div id="signupend"><?php $this->html( 'signupend' ); ?></div>
+ <?php } ?>
+ </div>
+ <div class="mw-createacct-benefits-container">
+ <h2><?php $this->msg( 'createacct-benefit-heading' ); ?></h2>
+ <div class="mw-createacct-benefits-list">
+ <?php
+ for ( $benefitIdx = 1; $benefitIdx <= $this->data['benefitCount']; $benefitIdx++ ) {
+ // Pass each benefit's head text (by default a number) as a parameter to the body's message for PLURAL handling.
+ $headUnescaped = $this->getMsg( "createacct-benefit-head$benefitIdx" )->text();
+ ?>
+ <div class="mw-number-text <?php $this->msg( "createacct-benefit-icon$benefitIdx" ); ?>">
+ <h3><?php $this->msg( "createacct-benefit-head$benefitIdx" ); ?></h3>
+ <p><?php echo $this->getMsg( "createacct-benefit-body$benefitIdx" )->params( $headUnescaped )->escaped(); ?></p>
</div>
- <?php } ?>
- </td>
- </tr>
-<?php
- }
- }
-?>
- <tr>
- <td></td>
- <td class="mw-submit">
- <input type='submit' name="wpCreateaccount" id="wpCreateaccount"
- tabindex="<?php echo $tabIndex++; ?>"
- value="<?php $this->msg('createaccount') ?>" />
- </td>
- </tr>
- </table>
-<?php if( $this->haveData( 'uselang' ) ) { ?><input type="hidden" name="uselang" value="<?php $this->text( 'uselang' ); ?>" /><?php } ?>
-<?php if( $this->haveData( 'token' ) ) { ?><input type="hidden" name="wpCreateaccountToken" value="<?php $this->text( 'token' ); ?>" /><?php } ?>
-</form>
+ <?php } ?>
+ </div>
+ </div>
</div>
-<div id="signupend"><?php $this->html( 'signupend' ); ?></div>
<?php
}
diff --git a/includes/templates/Userlogin.php b/includes/templates/Userlogin.php
index 7bc0241a..5eb60948 100644
--- a/includes/templates/Userlogin.php
+++ b/includes/templates/Userlogin.php
@@ -1,6 +1,6 @@
<?php
/**
- * Html form for user login.
+ * Html form for user login (since 1.22 with VForm appearance).
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
@@ -21,156 +21,160 @@
* @ingroup Templates
*/
-/**
- * @defgroup Templates Templates
- */
+class UserloginTemplate extends BaseTemplate {
-/**
- * HTML template for Special:Userlogin form
- * @ingroup Templates
- */
-class UserloginTemplate extends QuickTemplate {
function execute() {
- if( $this->data['message'] ) {
+ global $wgCookieExpiration;
+ $expirationDays = ceil( $wgCookieExpiration / ( 3600 * 24 ) );
?>
- <div class="<?php $this->text('messagetype') ?>box">
- <?php if ( $this->data['messagetype'] == 'error' ) { ?>
- <strong><?php $this->msg( 'loginerror' )?></strong><br />
- <?php } ?>
- <?php $this->html('message') ?>
- </div>
- <div class="visualClear"></div>
-<?php } ?>
+<div class="mw-ui-container">
+ <?php if ( $this->haveData( 'languages' ) ) { ?>
+ <div id="languagelinks">
+ <p><?php $this->html( 'languages' ); ?></p>
+ </div>
+ <?php } ?>
+ <div id="userloginForm">
+ <form name="userlogin" class="mw-ui-vform" method="post" action="<?php $this->text( 'action' ); ?>">
+ <?php if ( $this->data['loggedin'] ) { ?>
+ <div class="warningbox">
+ <?php echo $this->getMsg( 'userlogin-loggedin' )->params( $this->data['loggedinuser'] )->parse(); ?>
+ </div>
+ <?php } ?>
+ <section class="mw-form-header">
+ <?php $this->html( 'header' ); /* extensions such as ConfirmEdit add form HTML here */ ?>
+ </section>
-<div id="loginstart"><?php $this->msgWiki( 'loginstart' ); ?></div>
-<div id="userloginForm">
-<form name="userlogin" method="post" action="<?php $this->text('action') ?>">
- <h2><?php $this->msg('login') ?></h2>
- <p id="userloginlink"><?php $this->html('link') ?></p>
- <?php $this->html('header'); /* pre-table point for form plugins... */ ?>
- <div id="userloginprompt"><?php $this->msgWiki('loginprompt') ?></div>
- <?php if( $this->haveData( 'languages' ) ) { ?><div id="languagelinks"><p><?php $this->html( 'languages' ); ?></p></div><?php } ?>
- <table>
- <tr>
- <td class="mw-label"><label for='wpName1'><?php $this->msg('yourname') ?></label></td>
- <td class="mw-input">
- <?php
- echo Html::input( 'wpName', $this->data['name'], 'text', array(
- 'class' => 'loginText',
- 'id' => 'wpName1',
- 'tabindex' => '1',
- 'size' => '20',
- 'required'
- # Can't do + array( 'autofocus' ) because + for arrays in PHP
- # only works right for associative arrays! Thanks, PHP.
- ) + ( $this->data['name'] ? array() : array( 'autofocus' => '' ) ) ); ?>
+ <?php if ( $this->data['message'] ) { ?>
+ <div class="<?php $this->text( 'messagetype' ); ?>box">
+ <?php if ( $this->data['messagetype'] == 'error' ) { ?>
+ <strong><?php $this->msg( 'loginerror' ); ?></strong>
+ <br />
+ <?php } ?>
+ <?php $this->html( 'message' ); ?>
+ </div>
+ <?php } ?>
- </td>
- </tr>
- <tr>
- <td class="mw-label"><label for='wpPassword1'><?php $this->msg('yourpassword') ?></label></td>
- <td class="mw-input">
- <?php
- echo Html::input( 'wpPassword', null, 'password', array(
- 'class' => 'loginPassword',
- 'id' => 'wpPassword1',
- 'tabindex' => '2',
- 'size' => '20'
- ) + ( $this->data['name'] ? array( 'autofocus' ) : array() ) ); ?>
+ <div>
+ <label for='wpName1'>
+ <?php
+ $this->msg( 'userlogin-yourname' );
- </td>
- </tr>
- <?php if( isset( $this->data['usedomain'] ) && $this->data['usedomain'] ) {
- $doms = "";
- foreach( $this->data['domainnames'] as $dom ) {
- $doms .= "<option>" . htmlspecialchars( $dom ) . "</option>";
- }
- ?>
- <tr id="mw-user-domain-section">
- <td class="mw-label"><?php $this->msg( 'yourdomainname' ) ?></td>
- <td class="mw-input">
- <select name="wpDomain" value="<?php $this->text( 'domain' ) ?>"
- tabindex="3">
- <?php echo $doms ?>
- </select>
- </td>
- </tr>
- <?php }
+ if ( $this->data['secureLoginUrl'] ) {
+ echo Html::element( 'a', array(
+ 'href' => $this->data['secureLoginUrl'],
+ 'class' => 'mw-ui-flush-right mw-secure',
+ ), $this->getMsg( 'userlogin-signwithsecure' )->text() );
+ }
+ ?>
+ </label>
+ <?php
+ $extraAttrs = array();
+ echo Html::input( 'wpName', $this->data['name'], 'text', array(
+ 'class' => 'loginText',
+ 'id' => 'wpName1',
+ 'tabindex' => '1',
+ 'size' => '20',
+ // 'required' is blacklisted for now in Html.php due to browser issues.
+ // Keeping here in case that changes.
+ 'required' => true,
+ // Set focus to this field if it's blank.
+ 'autofocus' => !$this->data['name'],
+ 'placeholder' => $this->getMsg( 'userlogin-yourname-ph' )->text()
+ ) );
+ ?>
+ </div>
- if( $this->haveData( 'extrafields' ) ) {
- echo $this->data['extrafields'];
- }
+ <div>
+ <label for='wpPassword1'>
+ <?php
+ $this->msg( 'userlogin-yourpassword' );
- if( $this->data['canremember'] ) { ?>
- <tr>
- <td></td>
- <td class="mw-input">
+ if ( $this->data['useemail'] && $this->data['canreset'] && $this->data['resetlink'] === true ) {
+ echo ' ' . Linker::link(
+ SpecialPage::getTitleFor( 'PasswordReset' ),
+ $this->getMsg( 'userlogin-resetpassword-link' )->parse(),
+ array( 'class' => 'mw-ui-flush-right' )
+ );
+ }
+ ?>
+ </label>
<?php
- global $wgCookieExpiration;
- $expirationDays = ceil( $wgCookieExpiration / ( 3600 * 24 ) );
- echo Xml::checkLabel(
- wfMessage( 'remembermypassword' )->numParams( $expirationDays )->text(),
- 'wpRemember',
- 'wpRemember',
- $this->data['remember'],
- array( 'tabindex' => '8' )
- )
+ echo Html::input( 'wpPassword', null, 'password', array(
+ 'class' => 'loginPassword',
+ 'id' => 'wpPassword1',
+ 'tabindex' => '2',
+ 'size' => '20',
+ // Set focus to this field if username is filled in.
+ 'autofocus' => (bool)$this->data['name'],
+ 'placeholder' => $this->getMsg( 'userlogin-yourpassword-ph' )->text()
+ ) );
?>
- </td>
- </tr>
-<?php } ?>
-<?php if( $this->data['cansecurelogin'] ) { ?>
- <tr>
- <td></td>
- <td class="mw-input">
+ </div>
+
<?php
- echo Xml::checkLabel(
- wfMessage( 'securelogin-stick-https' )->text(),
- 'wpStickHTTPS',
- 'wpStickHTTPS',
- $this->data['stickHTTPS'],
- array( 'tabindex' => '9' )
- );
- ?>
- </td>
- </tr>
-<?php } ?>
- <tr>
- <td></td>
- <td class="mw-submit">
- <?php
- echo Html::input( 'wpLoginAttempt', wfMessage( 'login' )->text(), 'submit', array(
- 'id' => 'wpLoginAttempt',
- 'tabindex' => '9'
- ) );
- if ( $this->data['useemail'] && $this->data['canreset'] ) {
- if( $this->data['resetlink'] === true ) {
- echo '&#160;';
- echo Linker::link(
- SpecialPage::getTitleFor( 'PasswordReset' ),
- wfMessage( 'userlogin-resetlink' )
- );
- } elseif( $this->data['resetlink'] === null ) {
- echo '&#160;';
- echo Html::input(
- 'wpMailmypassword',
- wfMessage( 'mailmypassword' )->text(),
- 'submit', array(
- 'id' => 'wpMailmypassword',
- 'tabindex' => '10'
- )
- );
+ if ( isset( $this->data['usedomain'] ) && $this->data['usedomain'] ) {
+ $doms = "";
+ foreach ( $this->data['domainnames'] as $dom ) {
+ $doms .= "<option>" . htmlspecialchars( $dom ) . "</option>";
+ }
+ ?>
+ <div id="mw-user-domain-section">
+ <label for='wpDomain'><?php $this->msg( 'yourdomainname' ); ?></label>
+ <select name="wpDomain" value="<?php $this->text( 'domain' ); ?>" tabindex="3">
+ <?php echo $doms; ?>
+ </select>
+ </div>
+ <?php } ?>
+
+ <?php
+ if ( $this->haveData( 'extrafields' ) ) {
+ echo $this->data['extrafields'];
}
- } ?>
+ ?>
- </td>
- </tr>
- </table>
-<?php if( $this->haveData( 'uselang' ) ) { ?><input type="hidden" name="uselang" value="<?php $this->text( 'uselang' ); ?>" /><?php } ?>
-<?php if( $this->haveData( 'token' ) ) { ?><input type="hidden" name="wpLoginToken" value="<?php $this->text( 'token' ); ?>" /><?php } ?>
-</form>
+ <div>
+ <?php if ( $this->data['canremember'] ) { ?>
+ <label class="mw-ui-checkbox-label">
+ <input name="wpRemember" type="checkbox" value="1" id="wpRemember" tabindex="4"
+ <?php if ( $this->data['remember'] ) {
+ echo 'checked="checked"';
+ } ?>
+ >
+ <?php echo $this->getMsg( 'userlogin-remembermypassword' )->numParams( $expirationDays )->escaped(); ?>
+ </label>
+ <?php } ?>
+ </div>
+
+ <div>
+ <?php
+ echo Html::input( 'wpLoginAttempt', $this->getMsg( 'login' )->text(), 'submit', array(
+ 'id' => 'wpLoginAttempt',
+ 'tabindex' => '6',
+ 'class' => 'mw-ui-button mw-ui-big mw-ui-block mw-ui-primary'
+ ) );
+ ?>
+ </div>
+
+ <div id="mw-userlogin-help">
+ <?php echo $this->getMsg( 'userlogin-helplink' )->parse(); ?>
+ </div>
+ <?php if ( $this->haveData( 'createOrLoginHref' ) ) { ?>
+ <?php if ( $this->data['loggedin'] ) { ?>
+ <div id="mw-createaccount-another">
+ <h3 id="mw-userloginlink"><a href="<?php $this->text( 'createOrLoginHref' ); ?>" id="mw-createaccount-join" tabindex="7" class="mw-ui-button"><?php $this->msg( 'userlogin-createanother' ); ?></a></h3>
+ </div>
+ <?php } else { ?>
+ <div id="mw-createaccount-cta">
+ <h3 id="mw-userloginlink"><?php $this->msg( 'userlogin-noaccount' ); ?><a href="<?php $this->text( 'createOrLoginHref' ); ?>" id="mw-createaccount-join" tabindex="7" class="mw-ui-button mw-ui-constructive"><?php $this->msg( 'userlogin-joinproject' ); ?></a></h3>
+ </div>
+ <?php } ?>
+ <?php } ?>
+ <?php if ( $this->haveData( 'uselang' ) ) { ?><input type="hidden" name="uselang" value="<?php $this->text( 'uselang' ); ?>" /><?php } ?>
+ <?php if ( $this->haveData( 'token' ) ) { ?><input type="hidden" name="wpLoginToken" value="<?php $this->text( 'token' ); ?>" /><?php } ?>
+ <?php if ( $this->data['cansecurelogin'] ) {?><input type="hidden" name="wpForceHttps" value="<?php $this->text( 'stickhttps' ); ?>" /><?php } ?>
+ </form>
+ </div>
</div>
-<div id="loginend"><?php $this->html( 'loginend' ); ?></div>
<?php
}
diff --git a/includes/tidy.conf b/includes/tidy.conf
index 6c947295..4c4daed5 100644
--- a/includes/tidy.conf
+++ b/includes/tidy.conf
@@ -18,5 +18,5 @@ fix-backslash: no
fix-uri: no
# Don't strip html5 elements we support
# html-{meta,link} is a hack we use to prevent Tidy from stripping <meta> and <link> used in the body for Microdata
-new-empty-tags: html-meta, html-link
+new-empty-tags: html-meta, html-link, wbr
new-inline-tags: video, audio, source, track, bdi, data, time, mark
diff --git a/includes/upload/UploadBase.php b/includes/upload/UploadBase.php
index e72669d4..2260241d 100644
--- a/includes/upload/UploadBase.php
+++ b/includes/upload/UploadBase.php
@@ -72,19 +72,20 @@ abstract class UploadBase {
* @return string
*/
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',
- self::WINDOWS_NONASCII_FILENAME => 'windows-nonascii-filename',
- self::FILENAME_TOO_LONG => 'filename-toolong',
+ $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',
+ self::WINDOWS_NONASCII_FILENAME => 'windows-nonascii-filename',
+ self::FILENAME_TOO_LONG => 'filename-toolong',
);
- if( isset( $code_to_status[$error] ) ) {
+ if ( isset( $code_to_status[$error] ) ) {
return $code_to_status[$error];
}
@@ -137,7 +138,7 @@ abstract class UploadBase {
public static function createFromRequest( &$request, $type = null ) {
$type = $type ? $type : $request->getVal( 'wpSourceType', 'File' );
- if( !$type ) {
+ if ( !$type ) {
return null;
}
@@ -150,18 +151,18 @@ abstract class UploadBase {
if ( is_null( $className ) ) {
$className = 'UploadFrom' . $type;
wfDebug( __METHOD__ . ": class name: $className\n" );
- if( !in_array( $type, self::$uploadHandlers ) ) {
+ if ( !in_array( $type, self::$uploadHandlers ) ) {
return null;
}
}
// Check whether this upload class is enabled
- if( !call_user_func( array( $className, 'isEnabled' ) ) ) {
+ if ( !call_user_func( array( $className, 'isEnabled' ) ) ) {
return null;
}
// Check whether the request is valid
- if( !call_user_func( array( $className, 'isValidRequest' ), $request ) ) {
+ if ( !call_user_func( array( $className, 'isValidRequest' ), $request ) ) {
return null;
}
@@ -188,7 +189,9 @@ abstract class UploadBase {
* @since 1.18
* @return string
*/
- public function getSourceType() { return null; }
+ public function getSourceType() {
+ return null;
+ }
/**
* Initialize the path information
@@ -253,7 +256,7 @@ abstract class UploadBase {
wfProfileIn( __METHOD__ );
$repo = RepoGroup::singleton()->getLocalRepo();
if ( $repo->isVirtualUrl( $srcPath ) ) {
- // @TODO: just make uploads work with storage paths
+ // @todo just make uploads work with storage paths
// UploadFromStash loads files via virtual URLs
$tmpFile = $repo->getLocalCopy( $srcPath );
$tmpFile->bind( $this ); // keep alive with $this
@@ -274,7 +277,7 @@ abstract class UploadBase {
/**
* If there was no filename or a zero size given, give up quick.
*/
- if( $this->isEmptyFile() ) {
+ if ( $this->isEmptyFile() ) {
wfProfileOut( __METHOD__ );
return array( 'status' => self::EMPTY_FILE );
}
@@ -283,7 +286,7 @@ abstract class UploadBase {
* Honor $wgMaxUploadSize
*/
$maxSize = self::getMaxUploadSize( $this->getSourceType() );
- if( $this->mFileSize > $maxSize ) {
+ if ( $this->mFileSize > $maxSize ) {
wfProfileOut( __METHOD__ );
return array(
'status' => self::FILE_TOO_LARGE,
@@ -297,7 +300,7 @@ abstract class UploadBase {
* probably not accept it.
*/
$verification = $this->verifyFile();
- if( $verification !== true ) {
+ if ( $verification !== true ) {
wfProfileOut( __METHOD__ );
return array(
'status' => self::VERIFICATION_ERROR,
@@ -309,13 +312,13 @@ abstract class UploadBase {
* Make sure this file can be created
*/
$result = $this->validateName();
- if( $result !== true ) {
+ if ( $result !== true ) {
wfProfileOut( __METHOD__ );
return $result;
}
$error = '';
- if( !wfRunHooks( 'UploadVerification',
+ if ( !wfRunHooks( 'UploadVerification',
array( $this->mDestName, $this->mTempPath, &$error ) ) )
{
wfProfileOut( __METHOD__ );
@@ -332,11 +335,11 @@ abstract class UploadBase {
* @return mixed true if valid, otherwise and array with 'status'
* and other keys
**/
- protected function validateName() {
+ public function validateName() {
$nt = $this->getTitle();
- if( is_null( $nt ) ) {
+ if ( is_null( $nt ) ) {
$result = array( 'status' => $this->mTitleError );
- if( $this->mTitleError == self::ILLEGAL_FILENAME ) {
+ if ( $this->mTitleError == self::ILLEGAL_FILENAME ) {
$result['filtered'] = $this->mFilteredName;
}
if ( $this->mTitleError == self::FILETYPE_BADTYPE ) {
@@ -353,7 +356,7 @@ abstract class UploadBase {
}
/**
- * Verify the mime type
+ * Verify the mime type.
*
* @note Only checks that it is not an evil mime. The does it have
* correct extension given its mime type check is in verifyFile.
@@ -364,7 +367,7 @@ abstract class UploadBase {
global $wgVerifyMimeType;
wfProfileIn( __METHOD__ );
if ( $wgVerifyMimeType ) {
- wfDebug ( "\n\nmime: <$mime> extension: <{$this->mFinalExtension}>\n\n" );
+ wfDebug( "\n\nmime: <$mime> extension: <{$this->mFinalExtension}>\n\n" );
global $wgMimeTypeBlacklist;
if ( $this->checkFileExtension( $mime, $wgMimeTypeBlacklist ) ) {
wfProfileOut( __METHOD__ );
@@ -391,6 +394,7 @@ abstract class UploadBase {
return true;
}
+
/**
* Verifies that it's ok to include the uploaded file
*
@@ -417,6 +421,7 @@ abstract class UploadBase {
}
}
+
$handler = MediaHandler::getHandler( $mime );
if ( $handler ) {
$handlerStatus = $handler->verifyUpload( $this->mTempPath );
@@ -450,8 +455,7 @@ abstract class UploadBase {
global $wgAllowJavaUploads, $wgDisableUploadScriptChecks;
wfProfileIn( __METHOD__ );
- # get the title, even though we are doing nothing with it, because
- # we need to populate mFinalExtension
+ # getTitle() sets some internal parameters like $this->mFinalExtension
$this->getTitle();
$this->mFileProps = FSFile::getPropsFromPath( $this->mTempPath, $this->mFinalExtension );
@@ -466,12 +470,12 @@ abstract class UploadBase {
# check for htmlish code and javascript
if ( !$wgDisableUploadScriptChecks ) {
- if( self::detectScript( $this->mTempPath, $mime, $this->mFinalExtension ) ) {
+ if ( self::detectScript( $this->mTempPath, $mime, $this->mFinalExtension ) ) {
wfProfileOut( __METHOD__ );
return array( 'uploadscripted' );
}
- if( $this->mFinalExtension == 'svg' || $mime == 'image/svg+xml' ) {
- if( $this->detectScriptInSvg( $this->mTempPath ) ) {
+ if ( $this->mFinalExtension == 'svg' || $mime == 'image/svg+xml' ) {
+ if ( $this->detectScriptInSvg( $this->mTempPath ) ) {
wfProfileOut( __METHOD__ );
return array( 'uploadscripted' );
}
@@ -560,7 +564,7 @@ abstract class UploadBase {
* to modify it by uploading a new revision.
*/
$nt = $this->getTitle();
- if( is_null( $nt ) ) {
+ if ( is_null( $nt ) ) {
return true;
}
$permErrors = $nt->getUserPermissionsErrors( 'edit', $user );
@@ -570,7 +574,7 @@ abstract class UploadBase {
} else {
$permErrorsCreate = array();
}
- if( $permErrors || $permErrorsUpload || $permErrorsCreate ) {
+ if ( $permErrors || $permErrorsUpload || $permErrorsCreate ) {
$permErrors = array_merge( $permErrors, wfArrayDiff2( $permErrorsUpload, $permErrors ) );
$permErrors = array_merge( $permErrors, wfArrayDiff2( $permErrorsCreate, $permErrors ) );
return $permErrors;
@@ -607,16 +611,17 @@ abstract class UploadBase {
$comparableName = str_replace( ' ', '_', $this->mDesiredDestName );
$comparableName = Title::capitalize( $comparableName, NS_FILE );
- if( $this->mDesiredDestName != $filename && $comparableName != $filename ) {
+ if ( $this->mDesiredDestName != $filename && $comparableName != $filename ) {
$warnings['badfilename'] = $filename;
}
// Check whether the file extension is on the unwanted list
global $wgCheckFileExtensions, $wgFileExtensions;
if ( $wgCheckFileExtensions ) {
- if ( !$this->checkFileExtension( $this->mFinalExtension, $wgFileExtensions ) ) {
+ $extensions = array_unique( $wgFileExtensions );
+ if ( !$this->checkFileExtension( $this->mFinalExtension, $extensions ) ) {
$warnings['filetype-unwanted-type'] = array( $this->mFinalExtension,
- $wgLang->commaList( $wgFileExtensions ), count( $wgFileExtensions ) );
+ $wgLang->commaList( $extensions ), count( $extensions ) );
}
}
@@ -630,7 +635,7 @@ abstract class UploadBase {
}
$exists = self::getExistsWarning( $localFile );
- if( $exists !== false ) {
+ if ( $exists !== false ) {
$warnings['exists'] = $exists;
}
@@ -640,11 +645,11 @@ abstract class UploadBase {
$title = $this->getTitle();
// Remove all matches against self
foreach ( $dupes as $key => $dupe ) {
- if( $title->equals( $dupe->getTitle() ) ) {
+ if ( $title->equals( $dupe->getTitle() ) ) {
unset( $dupes[$key] );
}
}
- if( $dupes ) {
+ if ( $dupes ) {
$warnings['duplicate'] = $dupes;
}
@@ -682,9 +687,9 @@ abstract class UploadBase {
$user
);
- if( $status->isGood() ) {
+ if ( $status->isGood() ) {
if ( $watch ) {
- $user->addWatch( $this->getLocalFile()->getTitle() );
+ WatchAction::doWatch( $this->getLocalFile()->getTitle(), $user, WatchedItem::IGNORE_USER_RIGHTS );
}
wfRunHooks( 'UploadComplete', array( &$this ) );
}
@@ -703,7 +708,6 @@ abstract class UploadBase {
if ( $this->mTitle !== false ) {
return $this->mTitle;
}
-
/* Assume that if a user specified File:Something.jpg, this is an error
* and that the namespace prefix needs to be stripped of.
*/
@@ -729,7 +733,7 @@ abstract class UploadBase {
$this->mFilteredName = wfStripIllegalFilenameChars( $this->mFilteredName );
/* Normalize to title form before we do any further processing */
$nt = Title::makeTitleSafe( NS_FILE, $this->mFilteredName );
- if( is_null( $nt ) ) {
+ if ( is_null( $nt ) ) {
$this->mTitleError = self::ILLEGAL_FILENAME;
return $this->mTitle = null;
}
@@ -741,7 +745,7 @@ abstract class UploadBase {
*/
list( $partname, $ext ) = $this->splitExtensions( $this->mFilteredName );
- if( count( $ext ) ) {
+ if ( count( $ext ) ) {
$this->mFinalExtension = trim( $ext[count( $ext ) - 1] );
} else {
$this->mFinalExtension = '';
@@ -789,13 +793,13 @@ abstract class UploadBase {
# If there was more than one "extension", reassemble the base
# filename to prevent bogus complaints about length
- if( count( $ext ) > 1 ) {
- for( $i = 0; $i < count( $ext ) - 1; $i++ ) {
+ if ( count( $ext ) > 1 ) {
+ for ( $i = 0; $i < count( $ext ) - 1; $i++ ) {
$partname .= '.' . $ext[$i];
}
}
- if( strlen( $partname ) < 1 ) {
+ if ( strlen( $partname ) < 1 ) {
$this->mTitleError = self::MIN_LENGTH_PARTNAME;
return $this->mTitle = null;
}
@@ -809,7 +813,7 @@ abstract class UploadBase {
* @return LocalFile|null
*/
public function getLocalFile() {
- if( is_null( $this->mLocalFile ) ) {
+ if ( is_null( $this->mLocalFile ) ) {
$nt = $this->getTitle();
$this->mLocalFile = is_null( $nt ) ? null : wfLocalFile( $nt );
}
@@ -922,23 +926,29 @@ abstract class UploadBase {
public static function verifyExtension( $mime, $extension ) {
$magic = MimeMagic::singleton();
- if ( !$mime || $mime == 'unknown' || $mime == 'unknown/unknown' )
+ if ( !$mime || $mime == 'unknown' || $mime == 'unknown/unknown' ) {
if ( !$magic->isRecognizableExtension( $extension ) ) {
wfDebug( __METHOD__ . ": passing file with unknown detected mime type; " .
"unrecognized extension '$extension', can't verify\n" );
return true;
} else {
- wfDebug( __METHOD__ . ": rejecting file with unknown detected mime type; ".
+ wfDebug( __METHOD__ . ": rejecting file with unknown detected mime type; " .
"recognized extension '$extension', so probably invalid file\n" );
return false;
}
+ }
$match = $magic->isMatchingExtension( $extension, $mime );
if ( $match === null ) {
- wfDebug( __METHOD__ . ": no file extension known for mime type $mime, passing file\n" );
- return true;
- } elseif( $match === true ) {
+ if ( $magic->getTypesForExtension( $extension ) !== null ) {
+ wfDebug( __METHOD__ . ": No extension known for $mime, but we know a mime for $extension\n" );
+ return false;
+ } else {
+ wfDebug( __METHOD__ . ": no file extension known for mime type $mime, passing file\n" );
+ return true;
+ }
+ } elseif ( $match === true ) {
wfDebug( __METHOD__ . ": mime type $mime matches extension $extension, passing file\n" );
#TODO: if it's a bitmap, make sure PHP or ImageMagic resp. can handle it!
@@ -968,7 +978,7 @@ abstract class UploadBase {
# ugly hack: for text files, always look at the entire file.
# For binary field, just check the first K.
- if( strpos( $mime, 'text/' ) === 0 ) {
+ if ( strpos( $mime, 'text/' ) === 0 ) {
$chunk = file_get_contents( $file );
} else {
$fp = fopen( $file, 'rb' );
@@ -978,21 +988,21 @@ abstract class UploadBase {
$chunk = strtolower( $chunk );
- if( !$chunk ) {
+ if ( !$chunk ) {
wfProfileOut( __METHOD__ );
return false;
}
# decode from UTF-16 if needed (could be used for obfuscation).
- if( substr( $chunk, 0, 2 ) == "\xfe\xff" ) {
+ if ( substr( $chunk, 0, 2 ) == "\xfe\xff" ) {
$enc = 'UTF-16BE';
- } elseif( substr( $chunk, 0, 2 ) == "\xff\xfe" ) {
+ } elseif ( substr( $chunk, 0, 2 ) == "\xff\xfe" ) {
$enc = 'UTF-16LE';
} else {
$enc = null;
}
- if( $enc ) {
+ if ( $enc ) {
$chunk = iconv( $enc, "ASCII//IGNORE", $chunk );
}
@@ -1042,12 +1052,12 @@ abstract class UploadBase {
'<table'
);
- if( !$wgAllowTitlesInSVG && $extension !== 'svg' && $mime !== 'image/svg' ) {
+ if ( !$wgAllowTitlesInSVG && $extension !== 'svg' && $mime !== 'image/svg' ) {
$tags[] = '<title';
}
- foreach( $tags as $tag ) {
- if( false !== strpos( $chunk, $tag ) ) {
+ foreach ( $tags as $tag ) {
+ if ( false !== strpos( $chunk, $tag ) ) {
wfDebug( __METHOD__ . ": found something that may make it be mistaken for html: $tag\n" );
wfProfileOut( __METHOD__ );
return true;
@@ -1062,21 +1072,21 @@ abstract class UploadBase {
$chunk = Sanitizer::decodeCharReferences( $chunk );
# look for script-types
- if( preg_match( '!type\s*=\s*[\'"]?\s*(?:\w*/)?(?:ecma|java)!sim', $chunk ) ) {
+ if ( preg_match( '!type\s*=\s*[\'"]?\s*(?:\w*/)?(?:ecma|java)!sim', $chunk ) ) {
wfDebug( __METHOD__ . ": found script types\n" );
wfProfileOut( __METHOD__ );
return true;
}
# look for html-style script-urls
- if( preg_match( '!(?:href|src|data)\s*=\s*[\'"]?\s*(?:ecma|java)script:!sim', $chunk ) ) {
+ if ( preg_match( '!(?:href|src|data)\s*=\s*[\'"]?\s*(?:ecma|java)script:!sim', $chunk ) ) {
wfDebug( __METHOD__ . ": found html-style script urls\n" );
wfProfileOut( __METHOD__ );
return true;
}
# look for css-style script-urls
- if( preg_match( '!url\s*\(\s*[\'"]?\s*(?:ecma|java)script:!sim', $chunk ) ) {
+ if ( preg_match( '!url\s*\(\s*[\'"]?\s*(?:ecma|java)script:!sim', $chunk ) ) {
wfDebug( __METHOD__ . ": found css-style script urls\n" );
wfProfileOut( __METHOD__ );
return true;
@@ -1112,7 +1122,7 @@ abstract class UploadBase {
// bytes. There shouldn't be a legitimate reason for this to happen.
wfDebug( __METHOD__ . ": Unmatched XML declaration start\n" );
return true;
- } elseif ( substr( $contents, 0, 4) == "\x4C\x6F\xA7\x94" ) {
+ } elseif ( substr( $contents, 0, 4 ) == "\x4C\x6F\xA7\x94" ) {
// EBCDIC encoded XML
wfDebug( __METHOD__ . ": EBCDIC Encoded XML\n" );
return true;
@@ -1164,77 +1174,77 @@ abstract class UploadBase {
/*
* check for elements that can contain javascript
*/
- if( $strippedElement == 'script' ) {
+ if ( $strippedElement == 'script' ) {
wfDebug( __METHOD__ . ": Found script element '$element' in uploaded file.\n" );
return true;
}
# e.g., <svg xmlns="http://www.w3.org/2000/svg"> <handler xmlns:ev="http://www.w3.org/2001/xml-events" ev:event="load">alert(1)</handler> </svg>
- if( $strippedElement == 'handler' ) {
+ if ( $strippedElement == 'handler' ) {
wfDebug( __METHOD__ . ": Found scriptable element '$element' in uploaded file.\n" );
return true;
}
# SVG reported in Feb '12 that used xml:stylesheet to generate javascript block
- if( $strippedElement == 'stylesheet' ) {
+ if ( $strippedElement == 'stylesheet' ) {
wfDebug( __METHOD__ . ": Found scriptable element '$element' in uploaded file.\n" );
return true;
}
- foreach( $attribs as $attrib => $value ) {
+ foreach ( $attribs as $attrib => $value ) {
$stripped = $this->stripXmlNamespace( $attrib );
$value = strtolower( $value );
- if( substr( $stripped, 0, 2 ) == 'on' ) {
+ if ( substr( $stripped, 0, 2 ) == 'on' ) {
wfDebug( __METHOD__ . ": Found event-handler attribute '$attrib'='$value' in uploaded file.\n" );
return true;
}
# href with javascript target
- if( $stripped == 'href' && strpos( strtolower( $value ), 'javascript:' ) !== false ) {
+ if ( $stripped == 'href' && strpos( strtolower( $value ), 'javascript:' ) !== false ) {
wfDebug( __METHOD__ . ": Found script in href attribute '$attrib'='$value' in uploaded file.\n" );
return true;
}
# href with embedded svg as target
- if( $stripped == 'href' && preg_match( '!data:[^,]*image/svg[^,]*,!sim', $value ) ) {
+ if ( $stripped == 'href' && preg_match( '!data:[^,]*image/svg[^,]*,!sim', $value ) ) {
wfDebug( __METHOD__ . ": Found href to embedded svg \"<$strippedElement '$attrib'='$value'...\" in uploaded file.\n" );
return true;
}
# href with embedded (text/xml) svg as target
- if( $stripped == 'href' && preg_match( '!data:[^,]*text/xml[^,]*,!sim', $value ) ) {
+ if ( $stripped == 'href' && preg_match( '!data:[^,]*text/xml[^,]*,!sim', $value ) ) {
wfDebug( __METHOD__ . ": Found href to embedded svg \"<$strippedElement '$attrib'='$value'...\" in uploaded file.\n" );
return true;
}
# use set/animate to add event-handler attribute to parent
- if( ( $strippedElement == 'set' || $strippedElement == 'animate' ) && $stripped == 'attributename' && substr( $value, 0, 2 ) == 'on' ) {
+ if ( ( $strippedElement == 'set' || $strippedElement == 'animate' ) && $stripped == 'attributename' && substr( $value, 0, 2 ) == 'on' ) {
wfDebug( __METHOD__ . ": Found svg setting event-handler attribute with \"<$strippedElement $stripped='$value'...\" in uploaded file.\n" );
return true;
}
# use set to add href attribute to parent element
- if( $strippedElement == 'set' && $stripped == 'attributename' && strpos( $value, 'href' ) !== false ) {
+ if ( $strippedElement == 'set' && $stripped == 'attributename' && strpos( $value, 'href' ) !== false ) {
wfDebug( __METHOD__ . ": Found svg setting href attribute '$value' in uploaded file.\n" );
return true;
}
# use set to add a remote / data / script target to an element
- if( $strippedElement == 'set' && $stripped == 'to' && preg_match( '!(http|https|data|script):!sim', $value ) ) {
+ if ( $strippedElement == 'set' && $stripped == 'to' && preg_match( '!(http|https|data|script):!sim', $value ) ) {
wfDebug( __METHOD__ . ": Found svg setting attribute to '$value' in uploaded file.\n" );
return true;
}
# use handler attribute with remote / data / script
- if( $stripped == 'handler' && preg_match( '!(http|https|data|script):!sim', $value ) ) {
+ if ( $stripped == 'handler' && preg_match( '!(http|https|data|script):!sim', $value ) ) {
wfDebug( __METHOD__ . ": Found svg setting handler with remote/data/script '$attrib'='$value' in uploaded file.\n" );
return true;
}
# use CSS styles to bring in remote code
# catch url("http:..., url('http:..., url(http:..., but not url("#..., url('#..., url(#....
- if( $stripped == 'style' && preg_match_all( '!((?:font|clip-path|fill|filter|marker|marker-end|marker-mid|marker-start|mask|stroke)\s*:\s*url\s*\(\s*["\']?\s*[^#]+.*?\))!sim', $value, $matches ) ) {
+ if ( $stripped == 'style' && preg_match_all( '!((?:font|clip-path|fill|filter|marker|marker-end|marker-mid|marker-start|mask|stroke)\s*:\s*url\s*\(\s*["\']?\s*[^#]+.*?\))!sim', $value, $matches ) ) {
foreach ( $matches[1] as $match ) {
if ( !preg_match( '!(?:font|clip-path|fill|filter|marker|marker-end|marker-mid|marker-start|mask|stroke)\s*:\s*url\s*\(\s*(#|\'#|"#)!sim', $match ) ) {
wfDebug( __METHOD__ . ": Found svg setting a style with remote url '$attrib'='$value' in uploaded file.\n" );
@@ -1244,7 +1254,7 @@ abstract class UploadBase {
}
# image filters can pull in url, which could be svg that executes scripts
- if( $strippedElement == 'image' && $stripped == 'filter' && preg_match( '!url\s*\(!sim', $value ) ) {
+ if ( $strippedElement == 'image' && $stripped == 'filter' && preg_match( '!url\s*\(!sim', $value ) ) {
wfDebug( __METHOD__ . ": Found image filter with url: \"<$strippedElement $stripped='$value'...\" in uploaded file.\n" );
return true;
}
@@ -1314,7 +1324,7 @@ abstract class UploadBase {
# NOTE: there's a 50 line workaround to make stderr redirection work on windows, too.
# that does not seem to be worth the pain.
# Ask me (Duesentrieb) about it if it's ever needed.
- $output = wfShellExec( "$command 2>&1", $exitCode );
+ $output = wfShellExecWithStderr( $command, $exitCode );
# map exit code to AV_xxx constants.
$mappedCode = $exitCode;
@@ -1374,8 +1384,8 @@ abstract class UploadBase {
private function checkOverwrite( $user ) {
// First check whether the local file can be overwritten
$file = $this->getLocalFile();
- if( $file->exists() ) {
- if( !self::userCanReUpload( $user, $file ) ) {
+ if ( $file->exists() ) {
+ if ( !self::userCanReUpload( $user, $file ) ) {
return array( 'fileexists-forbidden', $file->getName() );
} else {
return true;
@@ -1401,13 +1411,13 @@ abstract class UploadBase {
* @return Boolean
*/
public static function userCanReUpload( User $user, $img ) {
- if( $user->isAllowed( 'reupload' ) ) {
+ if ( $user->isAllowed( 'reupload' ) ) {
return true; // non-conditional
}
- if( !$user->isAllowed( 'reupload-own' ) ) {
+ if ( !$user->isAllowed( 'reupload-own' ) ) {
return false;
}
- if( is_string( $img ) ) {
+ if ( is_string( $img ) ) {
$img = wfLocalFile( $img );
}
if ( !( $img instanceof LocalFile ) ) {
@@ -1429,11 +1439,11 @@ abstract class UploadBase {
* @return mixed False if the file does not exists, else an array
*/
public static function getExistsWarning( $file ) {
- if( $file->exists() ) {
+ if ( $file->exists() ) {
return array( 'warning' => 'exists', 'file' => $file );
}
- if( $file->getTitle()->getArticleID() ) {
+ if ( $file->getTitle()->getArticleID() ) {
return array( 'warning' => 'page-exists', 'file' => $file );
}
@@ -1441,7 +1451,7 @@ abstract class UploadBase {
return array( 'warning' => 'was-deleted', 'file' => $file );
}
- if( strpos( $file->getName(), '.' ) == false ) {
+ if ( strpos( $file->getName(), '.' ) == false ) {
$partname = $file->getName();
$extension = '';
} else {
@@ -1460,7 +1470,7 @@ abstract class UploadBase {
$nt_lc = Title::makeTitle( NS_FILE, "{$partname}.{$normalizedExtension}" );
$file_lc = wfLocalFile( $nt_lc );
- if( $file_lc->exists() ) {
+ if ( $file_lc->exists() ) {
return array(
'warning' => 'exists-normalized',
'file' => $file,
@@ -1484,7 +1494,7 @@ abstract class UploadBase {
# Check for filenames like 50px- or 180px-, these are mostly thumbnails
$nt_thb = Title::newFromText( substr( $partname, strpos( $partname, '-' ) + 1 ) . '.' . $extension, NS_FILE );
$file_thb = wfLocalFile( $nt_thb );
- if( $file_thb->exists() ) {
+ if ( $file_thb->exists() ) {
return array(
'warning' => 'thumb',
'file' => $file,
@@ -1500,7 +1510,7 @@ abstract class UploadBase {
}
}
- foreach( self::getFilenamePrefixBlacklist() as $prefix ) {
+ foreach ( self::getFilenamePrefixBlacklist() as $prefix ) {
if ( substr( $partname, 0, strlen( $prefix ) ) == $prefix ) {
return array(
'warning' => 'bad-prefix',
@@ -1536,9 +1546,9 @@ abstract class UploadBase {
public static function getFilenamePrefixBlacklist() {
$blacklist = array();
$message = wfMessage( 'filename-prefix-blacklist' )->inContentLanguage();
- if( !$message->isDisabled() ) {
+ if ( !$message->isDisabled() ) {
$lines = explode( "\n", $message->plain() );
- foreach( $lines as $line ) {
+ foreach ( $lines as $line ) {
// Remove comment lines
$comment = substr( trim( $line ), 0, 1 );
if ( $comment == '#' || $comment == '' ) {
@@ -1547,7 +1557,7 @@ abstract class UploadBase {
// Remove additional comments after a prefix
$comment = strpos( $line, '#' );
if ( $comment > 0 ) {
- $line = substr( $line, 0, $comment-1 );
+ $line = substr( $line, 0, $comment - 1 );
}
$blacklist[] = trim( $line );
}
diff --git a/includes/upload/UploadFromChunks.php b/includes/upload/UploadFromChunks.php
index 4b331e98..2e0b9444 100644
--- a/includes/upload/UploadFromChunks.php
+++ b/includes/upload/UploadFromChunks.php
@@ -31,7 +31,7 @@ class UploadFromChunks extends UploadFromFile {
protected $mOffset, $mChunkIndex, $mFileKey, $mVirtualTempPath;
/**
- * Setup local pointers to stash, repo and user ( similar to UploadFromStash )
+ * Setup local pointers to stash, repo and user (similar to UploadFromStash)
*
* @param $user User
* @param $stash UploadStash
@@ -41,16 +41,16 @@ class UploadFromChunks extends UploadFromFile {
// user object. sometimes this won't exist, as when running from cron.
$this->user = $user;
- if( $repo ) {
+ if ( $repo ) {
$this->repo = $repo;
} else {
$this->repo = RepoGroup::singleton()->getLocalRepo();
}
- if( $stash ) {
+ if ( $stash ) {
$this->stash = $stash;
} else {
- if( $user ) {
+ if ( $user ) {
wfDebug( __METHOD__ . " creating new UploadFromChunks instance for " . $user->getId() . "\n" );
} else {
wfDebug( __METHOD__ . " creating new UploadFromChunks instance with no user\n" );
@@ -74,7 +74,7 @@ class UploadFromChunks extends UploadFromFile {
$this->verifyChunk();
// Create a local stash target
$this->mLocalFile = parent::stashFile();
- // Update the initial file offset ( based on file size )
+ // Update the initial file offset (based on file size)
$this->mOffset = $this->mLocalFile->getSize();
$this->mFileKey = $this->mLocalFile->getFileKey();
@@ -114,7 +114,7 @@ class UploadFromChunks extends UploadFromFile {
// Concatenate all the chunks to mVirtualTempPath
$fileList = Array();
// The first chunk is stored at the mVirtualTempPath path so we start on "chunk 1"
- for( $i = 0; $i <= $this->getChunkIndex(); $i++ ) {
+ for ( $i = 0; $i <= $this->getChunkIndex(); $i++ ) {
$fileList[] = $this->getVirtualChunkLocation( $i );
}
@@ -129,7 +129,7 @@ class UploadFromChunks extends UploadFromFile {
$tStart = microtime( true );
$status = $this->repo->concatenate( $fileList, $tmpPath, FileRepo::DELETE_SOURCE );
$tAmount = microtime( true ) - $tStart;
- if( !$status->isOk() ) {
+ if ( !$status->isOk() ) {
return $status;
}
wfDebugLog( 'fileconcatenate', "Combined $i chunks in $tAmount seconds.\n" );
@@ -144,7 +144,7 @@ class UploadFromChunks extends UploadFromFile {
}
// Update the mTempPath and mLocalFile
- // ( for FileUpload or normal Stash to take over )
+ // (for FileUpload or normal Stash to take over)
$tStart = microtime( true );
$this->mLocalFile = parent::stashFile( $this->user );
$tAmount = microtime( true ) - $tStart;
@@ -193,7 +193,7 @@ class UploadFromChunks extends UploadFromFile {
// Get the offset before we add the chunk to the file system
$preAppendOffset = $this->getOffset();
- if ( $preAppendOffset + $chunkSize > $this->getMaxUploadSize()) {
+ if ( $preAppendOffset + $chunkSize > $this->getMaxUploadSize() ) {
$status = Status::newFatal( 'file-too-large' );
} else {
// Make sure the client is uploading the correct chunk with a matching offset.
@@ -210,7 +210,7 @@ class UploadFromChunks extends UploadFromFile {
return Status::newFatal( $e->getMessage() );
}
$status = $this->outputChunk( $chunkPath );
- if( $status->isGood() ) {
+ if ( $status->isGood() ) {
// Update local offset:
$this->mOffset = $preAppendOffset + $chunkSize;
// Update chunk table status db
@@ -277,7 +277,7 @@ class UploadFromChunks extends UploadFromFile {
* @return Integer index of the current chunk
*/
private function getChunkIndex() {
- if( $this->mChunkIndex !== null ) {
+ if ( $this->mChunkIndex !== null ) {
return $this->mChunkIndex;
}
return 0;
@@ -327,7 +327,7 @@ class UploadFromChunks extends UploadFromFile {
}
private function getChunkFileKey( $index = null ) {
- if( $index === null ) {
+ if ( $index === null ) {
$index = $this->getChunkIndex();
}
return $this->mFileKey . '.' . $index;
@@ -346,7 +346,7 @@ class UploadFromChunks extends UploadFromFile {
$res = $this->verifyPartialFile();
$this->mDesiredDestName = $oldDesiredDestName;
$this->mTitle = false;
- if( is_array( $res ) ) {
+ if ( is_array( $res ) ) {
throw new UploadChunkVerificationException( $res[0] );
}
}
diff --git a/includes/upload/UploadFromFile.php b/includes/upload/UploadFromFile.php
index ab2a7a39..a00ed327 100644
--- a/includes/upload/UploadFromFile.php
+++ b/includes/upload/UploadFromFile.php
@@ -40,7 +40,7 @@ class UploadFromFile extends UploadBase {
function initializeFromRequest( &$request ) {
$upload = $request->getUpload( 'wpUploadFile' );
$desiredDestName = $request->getText( 'wpDestFile' );
- if( !$desiredDestName ) {
+ if ( !$desiredDestName ) {
$desiredDestName = $upload->getName();
}
diff --git a/includes/upload/UploadFromStash.php b/includes/upload/UploadFromStash.php
index c82103cb..cb85fc63 100644
--- a/includes/upload/UploadFromStash.php
+++ b/includes/upload/UploadFromStash.php
@@ -45,16 +45,16 @@ class UploadFromStash extends UploadBase {
// user object. sometimes this won't exist, as when running from cron.
$this->user = $user;
- if( $repo ) {
+ if ( $repo ) {
$this->repo = $repo;
} else {
$this->repo = RepoGroup::singleton()->getLocalRepo();
}
- if( $stash ) {
+ if ( $stash ) {
$this->stash = $stash;
} else {
- if( $user ) {
+ if ( $user ) {
wfDebug( __METHOD__ . " creating new UploadStash instance for " . $user->getId() . "\n" );
} else {
wfDebug( __METHOD__ . " creating new UploadStash instance with no user\n" );
diff --git a/includes/upload/UploadFromUrl.php b/includes/upload/UploadFromUrl.php
index 70b69034..0201d5f4 100644
--- a/includes/upload/UploadFromUrl.php
+++ b/includes/upload/UploadFromUrl.php
@@ -34,6 +34,8 @@ class UploadFromUrl extends UploadBase {
protected $mTempPath, $mTmpHandle;
+ protected static $allowedUrls = array();
+
/**
* Checks if the user is allowed to use the upload-by-URL feature. If the
* user is not allowed, return the name of the user right as a string. If
@@ -77,7 +79,7 @@ class UploadFromUrl extends UploadBase {
return false;
}
$valid = false;
- foreach( $wgCopyUploadsDomains as $domain ) {
+ foreach ( $wgCopyUploadsDomains as $domain ) {
// See if the domain for the upload matches this whitelisted domain
$whitelistedDomainPieces = explode( '.', $domain );
$uploadDomainPieces = explode( '.', $parsedUrl['host'] );
@@ -105,6 +107,21 @@ class UploadFromUrl extends UploadBase {
}
/**
+ * Checks whether the URL is not allowed.
+ *
+ * @param $url string
+ * @return bool
+ */
+ public static function isAllowedUrl( $url ) {
+ if ( !isset( self::$allowedUrls[$url] ) ) {
+ $allowed = true;
+ wfRunHooks( 'IsUploadAllowedFromUrl', array( $url, &$allowed ) );
+ self::$allowedUrls[$url] = $allowed;
+ }
+ return self::$allowedUrls[$url];
+ }
+
+ /**
* Entry point for API upload
*
* @param $name string
@@ -160,21 +177,30 @@ class UploadFromUrl extends UploadBase {
/**
* @return string
*/
- public function getSourceType() { return 'url'; }
+ public function getSourceType() {
+ return 'url';
+ }
/**
+ * Download the file (if not async)
+ *
+ * @param Array $httpOptions Array of options for MWHttpRequest. Ignored if async.
+ * This could be used to override the timeout on the http request.
* @return Status
*/
- public function fetchFile() {
+ public function fetchFile( $httpOptions = array() ) {
if ( !Http::isValidURI( $this->mUrl ) ) {
return Status::newFatal( 'http-invalid-url' );
}
- if( !self::isAllowedHost( $this->mUrl ) ) {
+ if ( !self::isAllowedHost( $this->mUrl ) ) {
return Status::newFatal( 'upload-copy-upload-invalid-domain' );
}
+ if ( !self::isAllowedUrl( $this->mUrl ) ) {
+ return Status::newFatal( 'upload-copy-upload-invalid-url' );
+ }
if ( !$this->mAsync ) {
- return $this->reallyFetchFile();
+ return $this->reallyFetchFile( $httpOptions );
}
return Status::newGood();
}
@@ -211,9 +237,12 @@ class UploadFromUrl extends UploadBase {
/**
* Download the file, save it to the temporary file and update the file
* size and set $mRemoveTempFile to true.
+ *
+ * @param Array $httpOptions Array of options for MWHttpRequest
* @return Status
*/
- protected function reallyFetchFile() {
+ protected function reallyFetchFile( $httpOptions = array() ) {
+ global $wgCopyUploadProxy, $wgCopyUploadTimeout;
if ( $this->mTempPath === false ) {
return Status::newFatal( 'tmp-create-error' );
}
@@ -227,13 +256,15 @@ class UploadFromUrl extends UploadBase {
$this->mRemoveTempFile = true;
$this->mFileSize = 0;
- $options = array(
- 'followRedirects' => true
+ $options = $httpOptions + array(
+ 'followRedirects' => true,
);
- global $wgCopyUploadProxy;
if ( $wgCopyUploadProxy !== false ) {
$options['proxy'] = $wgCopyUploadProxy;
}
+ if ( $wgCopyUploadTimeout && !isset( $options['timeout'] ) ) {
+ $options['timeout'] = $wgCopyUploadTimeout;
+ }
$req = MWHttpRequest::factory( $this->mUrl, $options );
$req->setCallback( array( $this, 'saveTempFileChunk' ) );
$status = $req->execute();
diff --git a/includes/upload/UploadStash.php b/includes/upload/UploadStash.php
index 089bd8b7..7db6c64b 100644
--- a/includes/upload/UploadStash.php
+++ b/includes/upload/UploadStash.php
@@ -158,7 +158,7 @@ class UploadStash {
* @param string $key key under which file information is stored
* @return Array
*/
- public function getMetadata ( $key ) {
+ public function getMetadata( $key ) {
$this->getFile( $key );
return $this->fileMetadata[$key];
}
@@ -169,7 +169,7 @@ class UploadStash {
* @param string $key key under which file information is stored
* @return Array
*/
- public function getFileProps ( $key ) {
+ public function getFileProps( $key ) {
$this->getFile( $key );
return $this->fileProps[$key];
}
@@ -209,7 +209,7 @@ class UploadStash {
list( $usec, $sec ) = explode( ' ', microtime() );
$usec = substr( $usec, 2 );
$key = wfBaseConvert( $sec . $usec, 10, 36 ) . '.' .
- wfBaseConvert( mt_rand(), 10, 36 ) . '.'.
+ wfBaseConvert( mt_rand(), 10, 36 ) . '.' .
$this->userId . '.' .
$extension;
@@ -338,7 +338,7 @@ class UploadStash {
__METHOD__
);
- if( !$row ) {
+ if ( !$row ) {
throw new UploadStashNoSuchKeyException( "No such key ($key), cannot remove" );
}
@@ -358,7 +358,7 @@ class UploadStash {
wfDebug( __METHOD__ . " clearing row $key\n" );
// Ensure we have the UploadStashFile loaded for this key
- $this->getFile( $key );
+ $this->getFile( $key, true );
$dbw = $this->repo->getMasterDb();
@@ -463,7 +463,7 @@ class UploadStash {
protected function fetchFileMetadata( $key, $readFromDB = DB_SLAVE ) {
// populate $fileMetadata[$key]
$dbr = null;
- if( $readFromDB === DB_MASTER ) {
+ if ( $readFromDB === DB_MASTER ) {
// sometimes reading from the master is necessary, if there's replication lag.
$dbr = $this->repo->getMasterDb();
} else {
@@ -675,11 +675,12 @@ class UploadStashFile extends UnregisteredLocalFile {
}
-class UploadStashNotAvailableException extends MWException {};
-class UploadStashFileNotFoundException extends MWException {};
-class UploadStashBadPathException extends MWException {};
-class UploadStashFileException extends MWException {};
-class UploadStashZeroLengthFileException extends MWException {};
-class UploadStashNotLoggedInException extends MWException {};
-class UploadStashWrongOwnerException extends MWException {};
-class UploadStashNoSuchKeyException extends MWException {};
+class UploadStashException extends MWException {};
+class UploadStashNotAvailableException extends UploadStashException {};
+class UploadStashFileNotFoundException extends UploadStashException {};
+class UploadStashBadPathException extends UploadStashException {};
+class UploadStashFileException extends UploadStashException {};
+class UploadStashZeroLengthFileException extends UploadStashException {};
+class UploadStashNotLoggedInException extends UploadStashException {};
+class UploadStashWrongOwnerException extends UploadStashException {};
+class UploadStashNoSuchKeyException extends UploadStashException {};
diff --git a/index.php b/index.php
index 0e9676da..b18fb806 100644
--- a/index.php
+++ b/index.php
@@ -8,16 +8,10 @@
* See the README, INSTALL, and UPGRADE files for basic setup instructions
* and pointers to the online documentation.
*
- * http://www.mediawiki.org/
+ * https://www.mediawiki.org/
*
* ----------
*
- * Copyright (C) 2001-2011 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 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
* the Free Software Foundation; either version 2 of the License, or
@@ -42,18 +36,14 @@
# 5.1, respectively.
if ( !function_exists( 'version_compare' ) || version_compare( phpversion(), '5.3.2' ) < 0 ) {
// We need to use dirname( __FILE__ ) here cause __DIR__ is PHP5.3+
- require( dirname( __FILE__ ) . '/includes/PHPVersionError.php' );
+ require dirname( __FILE__ ) . '/includes/PHPVersionError.php';
wfPHPVersionError( 'index.php' );
}
# Initialise common code. This gives us access to GlobalFunctions, the
# AutoLoader, and the globals $wgRequest, $wgOut, $wgUser, $wgLang and
# $wgContLang, amongst others; it does *not* load $wgTitle
-if ( isset( $_SERVER['MW_COMPILED'] ) ) {
- require ( 'phase3/includes/WebStart.php' );
-} else {
- require ( __DIR__ . '/includes/WebStart.php' );
-}
+require __DIR__ . '/includes/WebStart.php';
$mediaWiki = new MediaWiki();
$mediaWiki->run();
diff --git a/languages/Language.php b/languages/Language.php
index 1d2e7164..c24dc180 100644
--- a/languages/Language.php
+++ b/languages/Language.php
@@ -30,10 +30,6 @@ if ( !defined( 'MEDIAWIKI' ) ) {
exit( 1 );
}
-# Read language names
-global $wgLanguageNames;
-require_once( __DIR__ . '/Names.php' );
-
if ( function_exists( 'mb_strtoupper' ) ) {
mb_internal_encoding( 'UTF-8' );
}
@@ -44,18 +40,19 @@ if ( function_exists( 'mb_strtoupper' ) ) {
* @ingroup Language
*/
class FakeConverter {
-
/**
* @var Language
*/
public $mLang;
function __construct( $langobj ) { $this->mLang = $langobj; }
+ function autoConvert( $text, $variant = false ) { return $text; }
function autoConvertToAllVariants( $text ) { return array( $this->mLang->getCode() => $text ); }
function convert( $t ) { return $t; }
function convertTo( $text, $variant ) { return $text; }
function convertTitle( $t ) { return $t->getPrefixedText(); }
function convertNamespace( $ns ) { return $this->mLang->getFormattedNsText( $ns ); }
function getVariants() { return array( $this->mLang->getCode() ); }
+ function getVariantFallbacks( $variant ) { return $this->mLang->getCode(); }
function getPreferredVariant() { return $this->mLang->getCode(); }
function getDefaultVariant() { return $this->mLang->getCode(); }
function getURLVariant() { return ''; }
@@ -66,7 +63,10 @@ class FakeConverter {
function markNoConversion( $text, $noParse = false ) { return $text; }
function convertCategoryKey( $key ) { return $key; }
function convertLinkToAllVariants( $text ) { return $this->autoConvertToAllVariants( $text ); }
+ /** @deprecated since 1.22 is no longer used */
function armourMath( $text ) { return $text; }
+ function validateVariant( $variant = null ) { return $variant === $this->mLang->getCode() ? $variant : null; }
+ function translate( $text, $variant ) { return $text; }
}
/**
@@ -82,7 +82,7 @@ class Language {
public $mVariants, $mCode, $mLoaded = false;
public $mMagicExtensions = array(), $mMagicHookDone = false;
- private $mHtmlCode = null;
+ private $mHtmlCode = null, $mParentLanguage = false;
public $dateFormatStrings = array();
public $mExtendedSpecialPageAliases;
@@ -172,6 +172,14 @@ class Language {
);
/**
+ * Cache for language fallbacks.
+ * @see Language::getFallbacksIncludingSiteLanguage
+ * @since 1.21
+ * @var array
+ */
+ static private $fallbackLanguageCache = array();
+
+ /**
* Get a cached or new language object for a given language code
* @param $code String
* @return Language
@@ -221,7 +229,7 @@ class Language {
// Check if there is a language class for the code
$class = self::classFromCode( $code );
self::preloadLanguageClass( $class );
- if ( MWInit::classExists( $class ) ) {
+ if ( class_exists( $class ) ) {
$lang = new $class;
return $lang;
}
@@ -235,7 +243,7 @@ class Language {
$class = self::classFromCode( $fallbackCode );
self::preloadLanguageClass( $class );
- if ( MWInit::classExists( $class ) ) {
+ if ( class_exists( $class ) ) {
$lang = Language::newFromCode( $fallbackCode );
$lang->setCode( $code );
return $lang;
@@ -276,7 +284,7 @@ class Language {
$alpha = '[a-z]';
$digit = '[0-9]';
$alphanum = '[a-z0-9]';
- $x = 'x' ; # private use singleton
+ $x = 'x'; # private use singleton
$singleton = '[a-wy-z]'; # other singleton
$s = $lenient ? '[-_]' : '-';
@@ -327,13 +335,19 @@ class Language {
* @return bool
*/
public static function isValidCode( $code ) {
- return
- // People think language codes are html safe, so enforce it.
- // Ideally we should only allow a-zA-Z0-9-
- // but, .+ and other chars are often used for {{int:}} hacks
- // see bugs 37564, 37587, 36938
+ static $cache = array();
+ if ( isset( $cache[$code] ) ) {
+ return $cache[$code];
+ }
+ // People think language codes are html safe, so enforce it.
+ // Ideally we should only allow a-zA-Z0-9-
+ // but, .+ and other chars are often used for {{int:}} hacks
+ // see bugs 37564, 37587, 36938
+ $cache[$code] =
strcspn( $code, ":/\\\000&<>'\"" ) === strlen( $code )
&& !preg_match( Title::getTitleInvalidRegex(), $code );
+
+ return $cache[$code];
}
/**
@@ -349,16 +363,16 @@ class Language {
public static function isValidBuiltInCode( $code ) {
if ( !is_string( $code ) ) {
- $type = gettype( $code );
- if ( $type === 'object' ) {
+ if ( is_object( $code ) ) {
$addmsg = " of class " . get_class( $code );
} else {
$addmsg = '';
}
+ $type = gettype( $code );
throw new MWException( __METHOD__ . " must be passed a string, $type given$addmsg" );
}
- return (bool)preg_match( '/^[a-z0-9-]+$/i', $code );
+ return (bool)preg_match( '/^[a-z0-9-]{2,}$/i', $code );
}
/**
@@ -372,8 +386,15 @@ class Language {
public static function isKnownLanguageTag( $tag ) {
static $coreLanguageNames;
+ // Quick escape for invalid input to avoid exceptions down the line
+ // when code tries to process tags which are not valid at all.
+ if ( !self::isValidBuiltInCode( $tag ) ) {
+ return false;
+ }
+
if ( $coreLanguageNames === null ) {
- include( MWInit::compiledPath( 'languages/Names.php' ) );
+ global $IP;
+ include "$IP/languages/Names.php";
}
if ( isset( $coreLanguageNames[$tag] )
@@ -409,10 +430,8 @@ class Language {
return;
}
- if ( !defined( 'MW_COMPILED' ) ) {
- if ( file_exists( "$IP/languages/classes/$class.php" ) ) {
- include_once( "$IP/languages/classes/$class.php" );
- }
+ if ( file_exists( "$IP/languages/classes/$class.php" ) ) {
+ include_once "$IP/languages/classes/$class.php";
}
}
@@ -483,6 +502,9 @@ class Language {
}
/**
+ * Returns an array of localised namespaces indexed by their numbers. If the namespace is not
+ * available in localised form, it will be included in English.
+ *
* @return array
*/
public function getNamespaces() {
@@ -662,7 +684,18 @@ class Language {
}
}
- $this->namespaceAliases = $aliases;
+ # Also add converted namespace names as aliases, to avoid confusion.
+ $convertedNames = array();
+ foreach ( $this->getVariants() as $variant ) {
+ if ( $variant === $this->mCode ) {
+ continue;
+ }
+ foreach ( $this->getNamespaces() as $ns => $_ ) {
+ $convertedNames[$this->getConverter()->convertNamespace( $ns, $variant )] = $ns;
+ }
+ }
+
+ $this->namespaceAliases = $aliases + $convertedNames;
}
return $this->namespaceAliases;
}
@@ -746,20 +779,6 @@ class Language {
/**
* @return array
*/
- function getQuickbarSettings() {
- return array(
- $this->getMessage( 'qbsettings-none' ),
- $this->getMessage( 'qbsettings-fixedleft' ),
- $this->getMessage( 'qbsettings-fixedright' ),
- $this->getMessage( 'qbsettings-floatingleft' ),
- $this->getMessage( 'qbsettings-floatingright' ),
- $this->getMessage( 'qbsettings-directionality' )
- );
- }
-
- /**
- * @return array
- */
function getDatePreferences() {
return self::$dataCache->getItem( $this->mCode, 'datePreferences' );
}
@@ -857,7 +876,8 @@ class Language {
static $coreLanguageNames;
if ( $coreLanguageNames === null ) {
- include( MWInit::compiledPath( 'languages/Names.php' ) );
+ global $IP;
+ include "$IP/languages/Names.php";
}
$names = array();
@@ -1033,8 +1053,8 @@ class Language {
* internationalisation, a reduced set of format characters, and a better
* escaping format.
*
- * Supported format characters are dDjlNwzWFmMntLoYyaAgGhHiscrU. See the
- * PHP manual for definitions. There are a number of extensions, which
+ * Supported format characters are dDjlNwzWFmMntLoYyaAgGhHiscrUeIOPTZ. See
+ * the 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
@@ -1080,22 +1100,25 @@ class Language {
* Backslash escaping is also supported.
*
* Input timestamp is assumed to be pre-normalized to the desired local
- * time zone, if any.
+ * time zone, if any. Note that the format characters crUeIOPTZ will assume
+ * $ts is UTC if $zone is not given.
*
* @param $format String
* @param $ts String: 14-character timestamp
* YYYYMMDDHHMMSS
* 01234567890123
+ * @param $zone DateTimeZone: Timezone of $ts
* @todo handling of "o" format character for Iranian, Hebrew, Hijri & Thai?
*
+ * @throws MWException
* @return string
*/
- function sprintfDate( $format, $ts ) {
+ function sprintfDate( $format, $ts, DateTimeZone $zone = null ) {
$s = '';
$raw = false;
$roman = false;
$hebrewNum = false;
- $unix = false;
+ $dateTimeObj = false;
$rawToggle = false;
$iranian = false;
$hebrew = false;
@@ -1103,6 +1126,15 @@ class Language {
$thai = false;
$minguo = false;
$tenno = false;
+
+ if ( strlen( $ts ) !== 14 ) {
+ throw new MWException( __METHOD__ . ": The timestamp $ts should have 14 characters" );
+ }
+
+ if ( !ctype_digit( $ts ) ) {
+ throw new MWException( __METHOD__ . ": The timestamp $ts should be a number" );
+ }
+
for ( $p = 0; $p < strlen( $format ); $p++ ) {
$num = false;
$code = $format[$p];
@@ -1134,15 +1166,21 @@ class Language {
$s .= $this->getMonthNameGen( substr( $ts, 4, 2 ) );
break;
case 'xjx':
- if ( !$hebrew ) $hebrew = self::tsToHebrew( $ts );
+ if ( !$hebrew ) {
+ $hebrew = self::tsToHebrew( $ts );
+ }
$s .= $this->getHebrewCalendarMonthNameGen( $hebrew[1] );
break;
case 'd':
$num = substr( $ts, 6, 2 );
break;
case 'D':
- if ( !$unix ) $unix = wfTimestamp( TS_UNIX, $ts );
- $s .= $this->getWeekdayAbbreviation( gmdate( 'w', $unix ) + 1 );
+ if ( !$dateTimeObj ) {
+ $dateTimeObj = DateTime::createFromFormat(
+ 'YmdHis', $ts, $zone ?: new DateTimeZone( 'UTC' )
+ );
+ }
+ $s .= $this->getWeekdayAbbreviation( $dateTimeObj->format( 'w' ) + 1 );
break;
case 'j':
$num = intval( substr( $ts, 6, 2 ) );
@@ -1166,35 +1204,12 @@ class Language {
$num = $hebrew[2];
break;
case 'l':
- 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 ( !$dateTimeObj ) {
+ $dateTimeObj = DateTime::createFromFormat(
+ 'YmdHis', $ts, $zone ?: new DateTimeZone( 'UTC' )
+ );
}
- $w = gmdate( 'w', $unix );
- $num = $w ? $w : 7;
- break;
- case 'w':
- if ( !$unix ) {
- $unix = wfTimestamp( TS_UNIX, $ts );
- }
- $num = gmdate( 'w', $unix );
- break;
- case 'z':
- if ( !$unix ) {
- $unix = wfTimestamp( TS_UNIX, $ts );
- }
- $num = gmdate( 'z', $unix );
- break;
- case 'W':
- if ( !$unix ) {
- $unix = wfTimestamp( TS_UNIX, $ts );
- }
- $num = gmdate( 'W', $unix );
+ $s .= $this->getWeekdayName( $dateTimeObj->format( 'w' ) + 1 );
break;
case 'F':
$s .= $this->getMonthName( substr( $ts, 4, 2 ) );
@@ -1244,30 +1259,12 @@ class Language {
}
$num = $hebrew[1];
break;
- case 't':
- if ( !$unix ) {
- $unix = wfTimestamp( TS_UNIX, $ts );
- }
- $num = gmdate( 't', $unix );
- break;
case 'xjt':
if ( !$hebrew ) {
$hebrew = self::tsToHebrew( $ts );
}
$num = $hebrew[3];
break;
- case 'L':
- if ( !$unix ) {
- $unix = wfTimestamp( TS_UNIX, $ts );
- }
- $num = gmdate( 'L', $unix );
- break;
- case 'o':
- if ( !$unix ) {
- $unix = wfTimestamp( TS_UNIX, $ts );
- }
- $num = gmdate( 'o', $unix );
- break;
case 'Y':
$num = substr( $ts, 0, 4 );
break;
@@ -1343,22 +1340,36 @@ class Language {
$num = substr( $ts, 12, 2 );
break;
case 'c':
- if ( !$unix ) {
- $unix = wfTimestamp( TS_UNIX, $ts );
- }
- $s .= gmdate( 'c', $unix );
- break;
case 'r':
- if ( !$unix ) {
- $unix = wfTimestamp( TS_UNIX, $ts );
+ case 'e':
+ case 'O':
+ case 'P':
+ case 'T':
+ // Pass through string from $dateTimeObj->format()
+ if ( !$dateTimeObj ) {
+ $dateTimeObj = DateTime::createFromFormat(
+ 'YmdHis', $ts, $zone ?: new DateTimeZone( 'UTC' )
+ );
}
- $s .= gmdate( 'r', $unix );
+ $s .= $dateTimeObj->format( $code );
break;
+ case 'w':
+ case 'N':
+ case 'z':
+ case 'W':
+ case 't':
+ case 'L':
+ case 'o':
case 'U':
- if ( !$unix ) {
- $unix = wfTimestamp( TS_UNIX, $ts );
+ case 'I':
+ case 'Z':
+ // Pass through number from $dateTimeObj->format()
+ if ( !$dateTimeObj ) {
+ $dateTimeObj = DateTime::createFromFormat(
+ 'YmdHis', $ts, $zone ?: new DateTimeZone( 'UTC' )
+ );
}
- $num = $unix;
+ $num = $dateTimeObj->format( $code );
break;
case '\\':
# Backslash escaping
@@ -1673,7 +1684,7 @@ class Language {
private static function hebrewYearStart( $year ) {
$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 );
+ $m = 32.044093161144 + 1.5542417966212 * $a + $b / 4.0 - 0.0031777940220923 * ( $year - 1 );
if ( $m < 0 ) {
$m--;
}
@@ -1847,13 +1858,13 @@ class Language {
}
if ( strlen( $s ) == 2 ) {
$str = $s . "'";
- } else {
+ } else {
$str = substr( $s, 0, strlen( $s ) - 2 ) . '"';
$str .= substr( $s, strlen( $s ) - 2, 2 );
}
$start = substr( $str, 0, strlen( $str ) - 2 );
$end = substr( $str, strlen( $str ) - 2 );
- switch( $end ) {
+ switch ( $end ) {
case '×›':
$str = $start . 'ך';
break;
@@ -1936,12 +1947,12 @@ class Language {
# 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, 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, 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
$date = date( 'YmdHis', $t );
wfRestoreWarnings();
@@ -1992,6 +2003,8 @@ class Language {
* @param $type string May be date, time or both
* @param $pref string The format name as it appears in Messages*.php
*
+ * @since 1.22 New type 'pretty' that provides a more readable timestamp format
+ *
* @return string
*/
function getDateFormatString( $type, $pref ) {
@@ -2001,7 +2014,12 @@ class Language {
$df = self::$dataCache->getSubitem( $this->mCode, 'dateFormats', "$pref $type" );
} else {
$df = self::$dataCache->getSubitem( $this->mCode, 'dateFormats', "$pref $type" );
- if ( is_null( $df ) ) {
+
+ if ( $type === 'pretty' && $df === null ) {
+ $df = $this->getDateFormatString( 'date', $pref );
+ }
+
+ if ( $df === null ) {
$pref = $this->getDefaultDateFormat();
$df = self::$dataCache->getSubitem( $this->mCode, 'dateFormats', "$pref $type" );
}
@@ -2085,6 +2103,8 @@ class Language {
$segments = array();
foreach ( $intervals as $intervalName => $intervalValue ) {
+ // Messages: duration-seconds, duration-minutes, duration-hours, duration-days, duration-weeks,
+ // duration-years, duration-decades, duration-centuries, duration-millennia
$message = wfMessage( 'duration-' . $intervalName )->numParams( $intervalValue );
$segments[] = $message->inLanguage( $this )->escaped();
}
@@ -2235,6 +2255,81 @@ class Language {
}
/**
+ * Convert an MWTimestamp into a pretty human-readable timestamp using
+ * the given user preferences and relative base time.
+ *
+ * DO NOT USE THIS FUNCTION DIRECTLY. Instead, call MWTimestamp::getHumanTimestamp
+ * on your timestamp object, which will then call this function. Calling
+ * this function directly will cause hooks to be skipped over.
+ *
+ * @see MWTimestamp::getHumanTimestamp
+ * @param MWTimestamp $ts Timestamp to prettify
+ * @param MWTimestamp $relativeTo Base timestamp
+ * @param User $user User preferences to use
+ * @return string Human timestamp
+ * @since 1.22
+ */
+ public function getHumanTimestamp( MWTimestamp $ts, MWTimestamp $relativeTo, User $user ) {
+ $diff = $ts->diff( $relativeTo );
+ $diffDay = (bool)( (int)$ts->timestamp->format( 'w' ) - (int)$relativeTo->timestamp->format( 'w' ) );
+ $days = $diff->days ?: (int)$diffDay;
+ if ( $diff->invert || $days > 5 && $ts->timestamp->format( 'Y' ) !== $relativeTo->timestamp->format( 'Y' ) ) {
+ // Timestamps are in different years: use full timestamp
+ // Also do full timestamp for future dates
+ /**
+ * @FIXME Add better handling of future timestamps.
+ */
+ $format = $this->getDateFormatString( 'both', $user->getDatePreference() ?: 'default' );
+ $ts = $this->sprintfDate( $format, $ts->getTimestamp( TS_MW ) );
+ } elseif ( $days > 5 ) {
+ // Timestamps are in same year, but more than 5 days ago: show day and month only.
+ $format = $this->getDateFormatString( 'pretty', $user->getDatePreference() ?: 'default' );
+ $ts = $this->sprintfDate( $format, $ts->getTimestamp( TS_MW ) );
+ } elseif ( $days > 1 ) {
+ // Timestamp within the past week: show the day of the week and time
+ $format = $this->getDateFormatString( 'time', $user->getDatePreference() ?: 'default' );
+ $weekday = self::$mWeekdayMsgs[$ts->timestamp->format( 'w' )];
+ // Messages:
+ // sunday-at, monday-at, tuesday-at, wednesday-at, thursday-at, friday-at, saturday-at
+ $ts = wfMessage( "$weekday-at" )
+ ->inLanguage( $this )
+ ->params( $this->sprintfDate( $format, $ts->getTimestamp( TS_MW ) ) )
+ ->text();
+ } elseif ( $days == 1 ) {
+ // Timestamp was yesterday: say 'yesterday' and the time.
+ $format = $this->getDateFormatString( 'time', $user->getDatePreference() ?: 'default' );
+ $ts = wfMessage( 'yesterday-at' )
+ ->inLanguage( $this )
+ ->params( $this->sprintfDate( $format, $ts->getTimestamp( TS_MW ) ) )
+ ->text();
+ } elseif ( $diff->h > 1 || $diff->h == 1 && $diff->i > 30 ) {
+ // Timestamp was today, but more than 90 minutes ago: say 'today' and the time.
+ $format = $this->getDateFormatString( 'time', $user->getDatePreference() ?: 'default' );
+ $ts = wfMessage( 'today-at' )
+ ->inLanguage( $this )
+ ->params( $this->sprintfDate( $format, $ts->getTimestamp( TS_MW ) ) )
+ ->text();
+
+ // From here on in, the timestamp was soon enough ago so that we can simply say
+ // XX units ago, e.g., "2 hours ago" or "5 minutes ago"
+ } elseif ( $diff->h == 1 ) {
+ // Less than 90 minutes, but more than an hour ago.
+ $ts = wfMessage( 'hours-ago' )->inLanguage( $this )->numParams( 1 )->text();
+ } elseif ( $diff->i >= 1 ) {
+ // A few minutes ago.
+ $ts = wfMessage( 'minutes-ago' )->inLanguage( $this )->numParams( $diff->i )->text();
+ } elseif ( $diff->s >= 30 ) {
+ // Less than a minute, but more than 30 sec ago.
+ $ts = wfMessage( 'seconds-ago' )->inLanguage( $this )->numParams( $diff->s )->text();
+ } else {
+ // Less than 30 seconds ago.
+ $ts = wfMessage( 'just-now' )->text();
+ }
+
+ return $ts;
+ }
+
+ /**
* @param $key string
* @return array|null
*/
@@ -2523,7 +2618,7 @@ class Language {
*/
function checkTitleEncoding( $s ) {
if ( is_array( $s ) ) {
- wfDebugDieBacktrace( 'Given array to checkTitleEncoding.' );
+ throw new MWException( 'Given array to checkTitleEncoding.' );
}
if ( StringUtils::isUtf8( $s ) ) {
return $s;
@@ -2817,7 +2912,9 @@ class Language {
* @since 1.20
*/
function getDirMarkEntity( $opposite = false ) {
- if ( $opposite ) { return $this->isRTL() ? '&lrm;' : '&rlm;'; }
+ if ( $opposite ) {
+ return $this->isRTL() ? '&lrm;' : '&rlm;';
+ }
return $this->isRTL() ? '&rlm;' : '&lrm;';
}
@@ -2834,7 +2931,9 @@ class Language {
function getDirMark( $opposite = false ) {
$lrm = "\xE2\x80\x8E"; # LEFT-TO-RIGHT MARK, commonly abbreviated LRM
$rlm = "\xE2\x80\x8F"; # RIGHT-TO-LEFT MARK, commonly abbreviated RLM
- if ( $opposite ) { return $this->isRTL() ? $lrm : $rlm; }
+ if ( $opposite ) {
+ return $this->isRTL() ? $lrm : $rlm;
+ }
return $this->isRTL() ? $rlm : $lrm;
}
@@ -2878,12 +2977,16 @@ class Language {
}
/**
+ * Get all magic words from cache.
* @return array
*/
function getMagicWords() {
return self::$dataCache->getItem( $this->mCode, 'magicWords' );
}
+ /**
+ * Run the LanguageGetMagic hook once.
+ */
protected function doMagicHook() {
if ( $this->mMagicHookDone ) {
return;
@@ -2900,17 +3003,16 @@ class Language {
* @param $mw
*/
function getMagic( $mw ) {
- $this->doMagicHook();
+ // Saves a function call
+ if ( ! $this->mMagicHookDone ) {
+ $this->doMagicHook();
+ }
if ( isset( $this->mMagicExtensions[$mw->mId] ) ) {
$rawEntry = $this->mMagicExtensions[$mw->mId];
} else {
- $magicWords = $this->getMagicWords();
- if ( isset( $magicWords[$mw->mId] ) ) {
- $rawEntry = $magicWords[$mw->mId];
- } else {
- $rawEntry = false;
- }
+ $rawEntry = self::$dataCache->getSubitem(
+ $this->mCode, 'magicWords', $mw->mId );
}
if ( !is_array( $rawEntry ) ) {
@@ -2967,7 +3069,7 @@ class Language {
* Normally we output all numbers in plain en_US style, that is
* 293,291.235 for twohundredninetythreethousand-twohundredninetyone
* point twohundredthirtyfive. However this is not suitable for all
- * languages, some such as Pakaran want ੨੯੩,੨੯੫.੨੩੫ and others such as
+ * languages, some such as Punjabi want ੨੯੩,੨੯੫.੨੩੫ and others such as
* Icelandic just want to use commas instead of dots, and dots instead
* of commas like "293.291,235".
*
@@ -3058,7 +3160,7 @@ class Language {
$sign = "";
if ( intval( $number ) < 0 ) {
// For negative numbers apply the algorithm like positive number and add sign.
- $sign = "-";
+ $sign = "-";
$number = substr( $number, 1 );
}
$integerPart = array();
@@ -3066,20 +3168,20 @@ class Language {
$numMatches = preg_match_all( "/(#+)/", $digitGroupingPattern, $matches );
preg_match( "/\d+/", $number, $integerPart );
preg_match( "/\.\d*/", $number, $decimalPart );
- $groupedNumber = ( count( $decimalPart ) > 0 ) ? $decimalPart[0]:"";
- if ( $groupedNumber === $number ) {
+ $groupedNumber = ( count( $decimalPart ) > 0 ) ? $decimalPart[0] : "";
+ if ( $groupedNumber === $number ) {
// the string does not have any number part. Eg: .12345
return $sign . $groupedNumber;
}
$start = $end = strlen( $integerPart[0] );
while ( $start > 0 ) {
- $match = $matches[0][$numMatches -1] ;
+ $match = $matches[0][$numMatches - 1];
$matchLen = strlen( $match );
$start = $end - $matchLen;
if ( $start < 0 ) {
$start = 0;
}
- $groupedNumber = substr( $number, $start, $end -$start ) . $groupedNumber ;
+ $groupedNumber = substr( $number, $start, $end -$start ) . $groupedNumber;
$end = $start;
if ( $numMatches > 1 ) {
// use the last pattern for the rest of the number
@@ -3256,9 +3358,9 @@ class Language {
# 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 ) )
- {
+ 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];
}
@@ -3342,7 +3444,9 @@ class Language {
break;
}
}
- if ( $pos >= $textLen ) break; // extra iteration just for above checks
+ if ( $pos >= $textLen ) {
+ break; // extra iteration just for above checks
+ }
# Read the next char...
$ch = $text[$pos];
@@ -3475,7 +3579,7 @@ class Language {
function getGrammarForms() {
global $wgGrammarForms;
if ( isset( $wgGrammarForms[$this->getCode()] ) && is_array( $wgGrammarForms[$this->getCode()] ) ) {
- return $wgGrammarForms[$this->getCode()];
+ return $wgGrammarForms[$this->getCode()];
}
return array();
}
@@ -3528,23 +3632,23 @@ class Language {
* @return string Correct form of plural for $count in this language
*/
function convertPlural( $count, $forms ) {
- if ( !count( $forms ) ) {
- return '';
- }
-
// Handle explicit n=pluralform cases
foreach ( $forms as $index => $form ) {
- if ( preg_match( '/\d+=/i', $form ) ) {
+ if ( preg_match( '/^\d+=/i', $form ) ) {
$pos = strpos( $form, '=' );
- if ( substr( $form, 0, $pos ) === (string) $count ) {
+ if ( substr( $form, 0, $pos ) === (string)$count ) {
return substr( $form, $pos + 1 );
}
unset( $forms[$index] );
}
}
+
$forms = array_values( $forms );
+ if ( !count( $forms ) ) {
+ return '';
+ }
- $pluralForm = $this->getPluralForm( $count );
+ $pluralForm = $this->getPluralRuleIndexNumber( $count );
$pluralForm = min( $pluralForm, count( $forms ) - 1 );
return $forms[$pluralForm];
}
@@ -3708,6 +3812,7 @@ class Language {
*
* @param $text string
* @return string
+ * @deprecated since 1.22 is no longer used
*/
public function armourMath( $text ) {
return $this->mConverter->armourMath( $text );
@@ -3854,6 +3959,34 @@ class Language {
}
/**
+ * Get the "parent" language which has a converter to convert a "compatible" language
+ * (in another variant) to this language (eg. zh for zh-cn, but not en for en-gb).
+ *
+ * @return Language|null
+ * @since 1.22
+ */
+ public function getParentLanguage() {
+ if ( $this->mParentLanguage !== false ) {
+ return $this->mParentLanguage;
+ }
+
+ $pieces = explode( '-', $this->getCode() );
+ $code = $pieces[0];
+ if ( !in_array( $code, LanguageConverter::$languagesWithVariants ) ) {
+ $this->mParentLanguage = null;
+ return null;
+ }
+ $lang = Language::factory( $code );
+ if ( !$lang->hasVariant( $this->getCode() ) ) {
+ $this->mParentLanguage = null;
+ return null;
+ }
+
+ $this->mParentLanguage = $lang;
+ return $lang;
+ }
+
+ /**
* Get the RFC 3066 code for this language object
*
* NOTE: The return value of this function is NOT HTML-safe and must be escaped with
@@ -3887,8 +4020,9 @@ class Language {
*/
public function setCode( $code ) {
$this->mCode = $code;
- // Ensure we don't leave an incorrect html code lying around
+ // Ensure we don't leave incorrect cached data lying around
$this->mHtmlCode = null;
+ $this->mParentLanguage = false;
}
/**
@@ -3985,6 +4119,36 @@ class Language {
}
/**
+ * Get the ordered list of fallback languages, ending with the fallback
+ * language chain for the site language.
+ *
+ * @since 1.22
+ * @param string $code Language code
+ * @return array array( fallbacks, site fallbacks )
+ */
+ public static function getFallbacksIncludingSiteLanguage( $code ) {
+ global $wgLanguageCode;
+
+ // Usually, we will only store a tiny number of fallback chains, so we
+ // keep them in static memory.
+ $cacheKey = "{$code}-{$wgLanguageCode}";
+
+ if ( !array_key_exists( $cacheKey, self::$fallbackLanguageCache ) ) {
+ $fallbacks = self::getFallbacksFor( $code );
+
+ // Append the site's fallback chain, including the site language itself
+ $siteFallbacks = self::getFallbacksFor( $wgLanguageCode );
+ array_unshift( $siteFallbacks, $wgLanguageCode );
+
+ // Eliminate any languages already included in the chain
+ $siteFallbacks = array_diff( $siteFallbacks, $fallbacks );
+
+ self::$fallbackLanguageCache[$cacheKey] = array( $fallbacks, $siteFallbacks );
+ }
+ return self::$fallbackLanguageCache[$cacheKey];
+ }
+
+ /**
* Get all messages for a given language
* WARNING: this may take a long time. If you just need all message *keys*
* but need the *contents* of only a few messages, consider using getMessageKeysFor().
@@ -4084,15 +4248,14 @@ class Language {
* @since 1.18
*/
public function formatExpiry( $expiry, $format = true ) {
- static $infinity, $infinityMsg;
+ static $infinity;
if ( $infinity === null ) {
- $infinityMsg = wfMessage( 'infiniteblock' );
$infinity = wfGetDB( DB_SLAVE )->getInfinity();
}
if ( $expiry == '' || $expiry == $infinity ) {
return $format === true
- ? $infinityMsg
+ ? $this->getMessageFromDB( 'infiniteblock' )
: $infinity;
} else {
return $format === true
@@ -4307,7 +4470,7 @@ class Language {
$nlink = htmlspecialchars( $next );
} else {
$nlink = $this->numLink( $title, $offset + $limit, $limit,
- $query, $next, 'prevn-title', 'mw-nextlink' );
+ $query, $next, 'nextn-title', 'mw-nextlink' );
}
# Make links to set number of items per page
@@ -4371,7 +4534,7 @@ class Language {
/**
* Get the plural rules for the language
* @since 1.20
- * @return array Associative array with plural form, and plural rule as key-value pairs
+ * @return array Associative array with plural form number and plural rule as key-value pairs
*/
public function getPluralRules() {
$pluralRules = self::$dataCache->getItem( strtolower( $this->mCode ), 'pluralRules' );
@@ -4388,13 +4551,48 @@ class Language {
}
/**
- * Find the plural form matching to the given number
- * It return the form index.
- * @return int The index of the plural form
+ * Get the plural rule types for the language
+ * @since 1.22
+ * @return array Associative array with plural form number and plural rule type as key-value pairs
*/
- private function getPluralForm( $number ) {
+ public function getPluralRuleTypes() {
+ $pluralRuleTypes = self::$dataCache->getItem( strtolower( $this->mCode ), 'pluralRuleTypes' );
+ $fallbacks = Language::getFallbacksFor( $this->mCode );
+ if ( !$pluralRuleTypes ) {
+ foreach ( $fallbacks as $fallbackCode ) {
+ $pluralRuleTypes = self::$dataCache->getItem( strtolower( $fallbackCode ), 'pluralRuleTypes' );
+ if ( $pluralRuleTypes ) {
+ break;
+ }
+ }
+ }
+ return $pluralRuleTypes;
+ }
+
+ /**
+ * Find the index number of the plural rule appropriate for the given number
+ * @return int The index number of the plural rule
+ */
+ public function getPluralRuleIndexNumber( $number ) {
$pluralRules = $this->getCompiledPluralRules();
$form = CLDRPluralRuleEvaluator::evaluateCompiled( $number, $pluralRules );
return $form;
}
+
+ /**
+ * Find the plural rule type appropriate for the given number
+ * For example, if the language is set to Arabic, getPluralType(5) should
+ * return 'few'.
+ * @since 1.22
+ * @return string The name of the plural rule type, e.g. one, two, few, many
+ */
+ public function getPluralRuleType( $number ) {
+ $index = $this->getPluralRuleIndexNumber( $number );
+ $pluralRuleTypes = $this->getPluralRuleTypes();
+ if ( isset( $pluralRuleTypes[$index] ) ) {
+ return $pluralRuleTypes[$index];
+ } else {
+ return 'other';
+ }
+ }
}
diff --git a/languages/LanguageConverter.php b/languages/LanguageConverter.php
index 43afe653..96a71a09 100644
--- a/languages/LanguageConverter.php
+++ b/languages/LanguageConverter.php
@@ -246,7 +246,7 @@ class LanguageConverter {
* @return Mixed: variant if one found, false otherwise.
*/
protected function getUserVariant() {
- global $wgUser;
+ global $wgUser, $wgContLang;
// memoizing this function wreaks havoc on parserTest.php
/*
@@ -258,8 +258,12 @@ class LanguageConverter {
// Get language variant preference from logged in users
// Don't call this on stub objects because that causes infinite
// recursion during initialisation
- if ( $wgUser->isLoggedIn() ) {
- $ret = $wgUser->getOption( 'variant' );
+ if ( $wgUser->isLoggedIn() ) {
+ if ( $this->mMainLanguageCode == $wgContLang->getCode() ) {
+ $ret = $wgUser->getOption( 'variant' );
+ } else {
+ $ret = $wgUser->getOption( 'variant-' . $this->mMainLanguageCode );
+ }
} else {
// figure out user lang without constructing wgLang to avoid
// infinite recursion
@@ -344,7 +348,7 @@ class LanguageConverter {
}
}
- if( $this->guessVariant( $text, $toVariant ) ) {
+ if ( $this->guessVariant( $text, $toVariant ) ) {
wfProfileOut( __METHOD__ );
return $text;
}
@@ -364,11 +368,11 @@ class LanguageConverter {
// this one is needed when the text is inside an HTML markup
$htmlfix = '|<[^>]+$|^[^<>]*>';
- // disable convert to variants between <code></code> tags
+ // disable convert to variants between <code> tags
$codefix = '<code>.+?<\/code>|';
- // disable convertsion of <script type="text/javascript"> ... </script>
+ // disable conversion of <script> tags
$scriptfix = '<script.*?>.*?<\/script>|';
- // disable conversion of <pre xxxx> ... </pre>
+ // disable conversion of <pre> tags
$prefix = '<pre.*?>.*?<\/pre>|';
$reg = '/' . $codefix . $scriptfix . $prefix .
@@ -551,7 +555,7 @@ class LanguageConverter {
$variant = $this->getPreferredVariant();
$index = $title->getNamespace();
if ( $index !== NS_MAIN ) {
- $text = $this->convertNamespace( $index ) . ':';
+ $text = $this->convertNamespace( $index, $variant ) . ':';
} else {
$text = '';
}
@@ -563,10 +567,13 @@ class LanguageConverter {
* Get the namespace display name in the preferred variant.
*
* @param $index int namespace id
+ * @param $variant string|null variant code or null for preferred variant
* @return String: namespace name for display
*/
- public function convertNamespace( $index ) {
- $variant = $this->getPreferredVariant();
+ public function convertNamespace( $index, $variant = null ) {
+ if ( $variant === null ) {
+ $variant = $this->getPreferredVariant();
+ }
if ( $index === NS_MAIN ) {
return '';
} else {
@@ -644,14 +651,14 @@ class LanguageConverter {
if ( $pos === false ) {
// No more markup, append final segment
$fragment = substr( $text, $startPos );
- $out .= $shouldConvert? $this->autoConvert( $fragment, $variant ): $fragment;
+ $out .= $shouldConvert ? $this->autoConvert( $fragment, $variant ) : $fragment;
return $out;
}
// Markup found
// Append initial segment
$fragment = substr( $text, $startPos, $pos - $startPos );
- $out .= $shouldConvert? $this->autoConvert( $fragment, $variant ): $fragment;
+ $out .= $shouldConvert ? $this->autoConvert( $fragment, $variant ) : $fragment;
// Advance position
$startPos = $pos;
@@ -687,7 +694,7 @@ class LanguageConverter {
while ( $startPos < $length ) {
$m = false;
- preg_match( '/-\{|\}-/', $text, $m, PREG_OFFSET_CAPTURE, $startPos );
+ preg_match( '/-\{|\}-/', $text, $m, PREG_OFFSET_CAPTURE, $startPos );
if ( !$m ) {
// Unclosed rule
break;
@@ -833,7 +840,7 @@ class LanguageConverter {
* @author Nikola Smolenski <smolensk@eunet.rs>
* @since 1.19
*/
- public function guessVariant($text, $variant) {
+ public function guessVariant( $text, $variant ) {
return false;
}
@@ -941,7 +948,7 @@ class LanguageConverter {
$parsed[$key] = true;
if ( $subpage === '' ) {
- $txt = MessageCache::singleton()->get( 'conversiontable', true, $code );
+ $txt = MessageCache::singleton()->getMsgFromNamespace( $key, $code );
} else {
$txt = false;
$title = Title::makeTitleSafe( NS_MEDIAWIKI, $key );
@@ -952,7 +959,7 @@ class LanguageConverter {
$txt = $revision->getContent( Revision::RAW )->getNativeData();
}
- //@todo: in the future, use a specialized content model, perhaps based on json!
+ // @todo in the future, use a specialized content model, perhaps based on json!
}
}
}
@@ -1096,6 +1103,7 @@ class LanguageConverter {
* @param $text String: text to armour against conversion
* @return String: armoured text where { and } have been converted to
* &#123; and &#125;
+ * @deprecated since 1.22 is no longer used
*/
public function armourMath( $text ) {
// convert '-{' and '}-' to '-&#123;' and '&#125;-' to prevent
@@ -1256,17 +1264,20 @@ class ConverterRule {
$variants = $this->mConverter->mVariants;
$varsep_pattern = $this->mConverter->getVarSeparatorPattern();
+ // Split according to $varsep_pattern, but ignore semicolons from HTML entities
+ $rules = preg_replace( '/(&[#a-zA-Z0-9]+);/', "$1\x01", $rules );
$choice = preg_split( $varsep_pattern, $rules );
+ $choice = str_replace( "\x01", ';', $choice );
foreach ( $choice as $c ) {
- $v = explode( ':', $c, 2 );
+ $v = explode( ':', $c, 2 );
if ( count( $v ) != 2 ) {
// syntax error, skip
continue;
}
$to = trim( $v[1] );
- $v = trim( $v[0] );
- $u = explode( '=>', $v, 2 );
+ $v = trim( $v[0] );
+ $u = explode( '=>', $v, 2 );
// if $to is empty, strtr() could return a wrong result
if ( count( $u ) == 1 && $to && in_array( $v, $variants ) ) {
$bidtable[$v] = $to;
@@ -1358,6 +1369,37 @@ class ConverterRule {
}
/**
+ * Similar to getRuleConvertedStr(), but this prefers to use original
+ * page title if $variant === $this->mConverter->mMainLanguageCode
+ * and may return false in this case (so this title conversion rule
+ * will be ignored and the original title is shown).
+ *
+ * @since 1.22
+ * @param $variant The variant code to display page title in
+ * @return String|false The converted title or false if just page name
+ */
+ function getRuleConvertedTitle( $variant ) {
+ if ( $variant === $this->mConverter->mMainLanguageCode ) {
+ // If a string targeting exactly this variant is set,
+ // use it. Otherwise, just return false, so the real
+ // page name can be shown (and because variant === main,
+ // there'll be no further automatic conversion).
+ $disp = $this->getTextInBidtable( $variant );
+ if ( $disp ) {
+ return $disp;
+ }
+ if ( array_key_exists( $variant, $this->mUnidtable ) ) {
+ $disp = array_values( $this->mUnidtable[$variant] );
+ $disp = $disp[0];
+ }
+ // Assigned above or still false.
+ return $disp;
+ } else {
+ return $this->getRuleConvertedStr( $variant );
+ }
+ }
+
+ /**
* Generate conversion table for all text.
* @private
*/
@@ -1439,7 +1481,7 @@ class ConverterRule {
// then we check its fallback variants.
$variantFallbacks =
$this->mConverter->getVariantFallbacks( $variant );
- if( is_array( $variantFallbacks ) ) {
+ if ( is_array( $variantFallbacks ) ) {
foreach ( $variantFallbacks as $variantFallback ) {
// if current variant's fallback exist in flags
if ( isset( $this->mVariantFlags[$variantFallback] ) ) {
@@ -1509,7 +1551,7 @@ class ConverterRule {
$this->mRuleDisplay = $this->getRuleConvertedStr( $variant );
break;
case 'T':
- $this->mRuleTitle = $this->getRuleConvertedStr( $variant );
+ $this->mRuleTitle = $this->getRuleConvertedTitle( $variant );
$this->mRuleDisplay = '';
break;
default:
diff --git a/languages/Names.php b/languages/Names.php
index bce1663e..929c513d 100644
--- a/languages/Names.php
+++ b/languages/Names.php
@@ -22,21 +22,21 @@
*/
/**
- * These determine things like interwikis, language selectors, and so on.
- * Safe to change without running scripts on the respective sites.
- *
- * \xE2\x80\x8E is the left-to-right marker and
- * \xE2\x80\x8F is the right-to-left marker.
- * They are required for ensuring the correct display of brackets in
- * mixed rtl/ltr environment.
- *
- * Some writing systems require some line-height fixes. This includes
- * most Indic scripts, like Devanagari.
- * If you are adding support for such a language, add it also to
- * the relevant section in skins/common/shared.css.
- *
- * @ingroup Language
- */
+ * These determine things like interwikis, language selectors, and so on.
+ * Safe to change without running scripts on the respective sites.
+ *
+ * \xE2\x80\x8E is the left-to-right marker and
+ * \xE2\x80\x8F is the right-to-left marker.
+ * They are required for ensuring the correct display of brackets in
+ * mixed rtl/ltr environment.
+ *
+ * Some writing systems require some line-height fixes. This includes
+ * most Indic scripts, like Devanagari.
+ * If you are adding support for such a language, add it also to
+ * the relevant section in skins/common/shared.css.
+ *
+ * @ingroup Language
+ */
/* private */ $coreLanguageNames = array(
'aa' => 'Qafár af', # Afar
'ab' => 'ÐÒ§Ñшәа', # Abkhaz
@@ -54,7 +54,7 @@
'arn' => 'mapudungun', # Mapuche, Mapudungu, Araucanian (Araucano)
'ary' => 'Maġribi', # Moroccan Spoken Arabic
'arz' => 'مصرى', # Egyptian Spoken Arabic
- 'as' => 'অসমীয়া', # Assamese
+ 'as' => 'অসমীয়া', # Assamese
'ast' => 'asturianu', # Asturian
'av' => 'авар', # Avar
'avk' => 'Kotava', # Kotava
@@ -64,6 +64,8 @@
'ba' => 'башҡортÑа', # Bashkir
'bar' => 'Boarisch', # Bavarian (Austro-Bavarian and South Tyrolean)
'bat-smg' => 'žemaitėška', # Samogitian (deprecated code, 'sgs' in ISO 693-3 since 2010-06-30 )
+ 'bbc' => 'Batak Toba', # Batak Toba (falls back to bbc-latn)
+ 'bbc-latn' => 'Batak Toba', # Batak Toba
'bcc' => 'بلوچی مکرانی', # Southern Balochi
'bcl' => 'Bikol Central', # Bikol: Central Bicolano language
'be' => 'беларуÑкаÑ', # Belarusian normative
@@ -155,7 +157,7 @@
'gu' => 'ગà«àªœàª°àª¾àª¤à«€', # Gujarati
'gv' => 'Gaelg', # Manx
'ha' => 'Hausa', # Hausa
- 'hak' => 'Hak-kâ-fa', # Hakka
+ 'hak' => '客家語/Hak-kâ-ngî', # Hakka
'haw' => 'Hawai`i', # Hawaiian
'he' => 'עברית', # Hebrew
'hi' => 'हिनà¥à¤¦à¥€', # Hindi
@@ -165,7 +167,7 @@
'ho' => 'Hiri Motu', # Hiri Motu
'hr' => 'hrvatski', # Croatian
'hsb' => 'hornjoserbsce', # Upper Sorbian
- 'ht' => 'Kreyòl ayisyen', # Haitian Creole French
+ 'ht' => 'Kreyòl ayisyen', # Haitian Creole French
'hu' => 'magyar', # Hungarian
'hy' => 'Õ€Õ¡ÕµÕ¥Ö€Õ¥Õ¶', # Armenian
'hz' => 'Otsiherero', # Herero
@@ -219,7 +221,7 @@
'ks-arab' => 'کٲشÙر', # Kashmiri (Perso-Arabic script)
'ks-deva' => 'कॉशà¥à¤°', # Kashmiri (Devanagari script)
'ksh' => 'Ripoarisch', # Ripuarian
- 'ku' => 'Kurdî', # Kurdish (multiple scripts - defaults to Latin)
+ 'ku' => 'Kurdî', # Kurdish (multiple scripts - defaults to Latin)
'ku-latn' => "Kurdî (latînî)\xE2\x80\x8E", # Northern Kurdish (Latin script)
'ku-arab' => "كوردي (عەرەبی)\xE2\x80\x8F", # Northern Kurdish (Arabic script) (falls back to ckb)
'kv' => 'коми', # Komi-Zyrian (Cyrillic is common script but also written in Latin script)
@@ -237,7 +239,7 @@
'liv' => 'Līvõ kēļ', # Livonian
'lmo' => 'lumbaart', # Lombard
'ln' => 'lingála', # Lingala
- 'lo' => 'ລາວ',# Laotian
+ 'lo' => 'ລາວ', # Laotian
'loz' => 'Silozi', # Lozi
'lt' => 'lietuvių', # Lithuanian
'ltg' => 'latgaļu', # Latgalian
@@ -269,7 +271,7 @@
'na' => 'Dorerin Naoero', # Nauruan
'nah' => 'NÄhuatl', # Nahuatl, en:Wikipedia writes Nahuatlahtolli, while another form is Náhuatl
'nan' => 'Bân-lâm-gú', # Min-nan -- (bug 8217) nan instead of zh-min-nan, http://www.sil.org/iso639-3/codes.asp?order=639_3&letter=n
- 'nap' => 'Nnapulitano', # Neapolitan
+ 'nap' => 'Napulitano', # Neapolitan, bug 43793
'nb' => "norsk bokmål", # Norwegian (Bokmal)
'nds' => 'Plattdüütsch', # Low German ''or'' Low Saxon
'nds-nl' => 'Nedersaksies', # aka Nedersaksisch: Dutch Low Saxon
@@ -288,7 +290,7 @@
'ny' => 'Chi-Chewa', # Chichewa
'oc' => 'occitan', # Occitan
'om' => 'Oromoo', # Oromo
- 'or' => 'ଓଡ଼ିଆ', # Oriya
+ 'or' => 'ଓଡ଼ିଆ', # Oriya
'os' => 'Ирон', # Ossetic -- fixed per bug 29091
'pa' => 'ਪੰਜਾਬੀ', # Eastern Punjabi (Gurmukhi script) (pan)
'pag' => 'Pangasinan', # Pangasinan
diff --git a/languages/classes/LanguageAz.php b/languages/classes/LanguageAz.php
index 0956dc42..48f70e85 100644
--- a/languages/classes/LanguageAz.php
+++ b/languages/classes/LanguageAz.php
@@ -32,7 +32,7 @@ class LanguageAz extends Language {
* @param $string string
* @return mixed|string
*/
- function ucfirst ( $string ) {
+ function ucfirst( $string ) {
if ( $string[0] == 'i' ) {
return 'Ä°' . substr( $string, 1 );
} else {
diff --git a/languages/classes/LanguageBe_tarask.php b/languages/classes/LanguageBe_tarask.php
index b781d7a6..6497b50c 100644
--- a/languages/classes/LanguageBe_tarask.php
+++ b/languages/classes/LanguageBe_tarask.php
@@ -46,13 +46,17 @@ class LanguageBe_tarask extends Language {
* @return string
*/
function convertPlural( $count, $forms ) {
- if ( !count( $forms ) ) { return ''; }
+ if ( !count( $forms ) ) {
+ return '';
+ }
// If the actual number is not mentioned in the expression, then just two forms are enough:
// singular for $count == 1
// plural for $count != 1
// For example, "This user belongs to {{PLURAL:$1|one group|several groups}}."
- if ( count( $forms ) === 2 ) return $count == 1 ? $forms[0] : $forms[1];
+ if ( count( $forms ) === 2 ) {
+ return $count == 1 ? $forms[0] : $forms[1];
+ }
// @todo FIXME: CLDR defines 4 plural forms instead of 3
// http://unicode.org/repos/cldr-tmp/trunk/diff/supplemental/language_plural_rules.html
@@ -62,10 +66,10 @@ class LanguageBe_tarask extends Language {
return $forms[2];
} else {
switch ( $count % 10 ) {
- case 1: return $forms[0];
+ case 1: return $forms[0];
case 2:
case 3:
- case 4: return $forms[1];
+ case 4: return $forms[1];
default: return $forms[2];
}
}
diff --git a/languages/classes/LanguageCu.php b/languages/classes/LanguageCu.php
index 2016a43c..60cf2b1a 100644
--- a/languages/classes/LanguageCu.php
+++ b/languages/classes/LanguageCu.php
@@ -48,36 +48,19 @@ class LanguageCu extends Language {
# 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 ) ) == 'ї' )
+ 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
break;
}
- return $word;
- }
-
- /**
- * @param $count int
- * @param $forms array
- * @return string
- */
- function convertPlural( $count, $forms ) {
- if ( !count( $forms ) ) { return ''; }
- $forms = $this->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];
}
+ return $word;
}
}
diff --git a/languages/classes/LanguageEo.php b/languages/classes/LanguageEo.php
index 8f843224..0e2d8b4a 100644
--- a/languages/classes/LanguageEo.php
+++ b/languages/classes/LanguageEo.php
@@ -78,14 +78,14 @@ class LanguageEo extends Language {
* @return 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"
+ 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 );
}
@@ -95,49 +95,25 @@ class LanguageEo extends Language {
* @return string
*/
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"
+ 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 );
}
- /**
- * @param $s string
- * @return string
- */
- function checkTitleEncoding( $s ) {
- # Check for X-system backwards-compatibility URLs
- $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 ) {
- # Assume Latin1
- $s = utf8_encode( $s );
- } else {
- 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 ) )
- // return $this->iconv( 'x', 'utf-8', $s );
- return $s;
- }
-
function initEncoding() {
global $wgEditEncoding;
$wgEditEncoding = 'x';
diff --git a/languages/classes/LanguageTl.php b/languages/classes/LanguageEs.php
index 15bce760..f55c2e43 100644
--- a/languages/classes/LanguageTl.php
+++ b/languages/classes/LanguageEs.php
@@ -1,6 +1,6 @@
<?php
/**
- * Tagalog (Tagalog) specific code.
+ * Spanish (español) specific code.
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
@@ -22,23 +22,21 @@
*/
/**
- * Tagalog (Tagalog)
+ * Spanish (español)
*
* @ingroup Language
*/
-class LanguageTl extends Language {
+class LanguageEs extends Language {
+
/**
- * Use singular form for zero
- *
- * @param $count int
- * @param $forms array
- *
+ * @param $_ string
* @return string
*/
- function convertPlural( $count, $forms ) {
- if ( !count( $forms ) ) { return ''; }
- $forms = $this->preConvertPlural( $forms, 2 );
-
- return ( $count <= 1 ) ? $forms[0] : $forms[1];
+ 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/LanguageFi.php b/languages/classes/LanguageFi.php
index 6a2820d1..ee1d1b52 100644
--- a/languages/classes/LanguageFi.php
+++ b/languages/classes/LanguageFi.php
@@ -53,12 +53,14 @@ class LanguageFi extends Language {
# The general case cannot be handled without a dictionary, but there's at least one notable
# special case we should check for:
- if ( preg_match( '/wiki$/i', $word ) )
+ if ( preg_match( '/wiki$/i', $word ) ) {
$aou = false;
+ }
# append i after final consonant
- if ( preg_match( '/[bcdfghjklmnpqrstvwxz]$/i', $word ) )
+ if ( preg_match( '/[bcdfghjklmnpqrstvwxz]$/i', $word ) ) {
$word .= 'i';
+ }
switch ( $case ) {
case 'genitive':
diff --git a/languages/classes/LanguageGa.php b/languages/classes/LanguageGa.php
index 2f58384a..339ad4de 100644
--- a/languages/classes/LanguageGa.php
+++ b/languages/classes/LanguageGa.php
@@ -46,19 +46,26 @@ class LanguageGa extends Language {
case 'ainmlae':
switch ( $word ) {
case 'an Domhnach':
- $word = 'Dé Domhnaigh'; break;
+ $word = 'Dé Domhnaigh';
+ break;
case 'an Luan':
- $word = 'Dé Luain'; break;
+ $word = 'Dé Luain';
+ break;
case 'an Mháirt':
- $word = 'Dé Mháirt'; break;
+ $word = 'Dé Mháirt';
+ break;
case 'an Chéadaoin':
- $word = 'Dé Chéadaoin'; break;
+ $word = 'Dé Chéadaoin';
+ break;
case 'an Déardaoin':
- $word = 'Déardaoin'; break;
+ $word = 'Déardaoin';
+ break;
case 'an Aoine':
- $word = 'Dé hAoine'; break;
+ $word = 'Dé hAoine';
+ break;
case 'an Satharn':
- $word = 'Dé Sathairn'; break;
+ $word = 'Dé Sathairn';
+ break;
}
}
return $word;
diff --git a/languages/classes/LanguageGan.php b/languages/classes/LanguageGan.php
index 0d652d43..d81574d1 100644
--- a/languages/classes/LanguageGan.php
+++ b/languages/classes/LanguageGan.php
@@ -21,8 +21,8 @@
* @ingroup Language
*/
-require_once( __DIR__ . '/../LanguageConverter.php' );
-require_once( __DIR__ . '/LanguageZh.php' );
+require_once __DIR__ . '/../LanguageConverter.php';
+require_once __DIR__ . '/LanguageZh.php';
/**
* @ingroup Language
@@ -50,7 +50,7 @@ class GanConverter extends LanguageConverter {
$flags,
$manualLevel );
$names = array(
- 'gan' => '原文',
+ 'gan' => '原文',
'gan-hans' => '简体',
'gan-hant' => 'ç¹é«”',
);
@@ -58,11 +58,11 @@ class GanConverter extends LanguageConverter {
}
function loadDefaultTables() {
- require( __DIR__ . "/../../includes/ZhConversion.php" );
+ require __DIR__ . '/../../includes/ZhConversion.php';
$this->mTables = array(
'gan-hans' => new ReplacementArray( $zh2Hans ),
'gan-hant' => new ReplacementArray( $zh2Hant ),
- 'gan' => new ReplacementArray
+ 'gan' => new ReplacementArray
);
}
@@ -89,12 +89,12 @@ class LanguageGan extends LanguageZh {
$variants = array( 'gan', 'gan-hans', 'gan-hant' );
$variantfallbacks = array(
- 'gan' => array( 'gan-hans', 'gan-hant' ),
+ 'gan' => array( 'gan-hans', 'gan-hant' ),
'gan-hans' => array( 'gan' ),
'gan-hant' => array( 'gan' ),
);
$ml = array(
- 'gan' => 'disable',
+ 'gan' => 'disable',
);
$this->mConverter = new GanConverter( $this, 'gan',
@@ -106,28 +106,6 @@ class LanguageGan extends LanguageZh {
}
/**
- * this should give much better diff info
- *
- * @param $text string
- * @return string
- */
- function segmentForDiff( $text ) {
- return preg_replace(
- "/([\\xc0-\\xff][\\x80-\\xbf]*)/e",
- "' ' .\"$1\"", $text );
- }
-
- /**
- * @param $text string
- * @return string
- */
- function unsegmentForDiff( $text ) {
- return preg_replace(
- "/ ([\\xc0-\\xff][\\x80-\\xbf]*)/e",
- "\"$1\"", $text );
- }
-
- /**
* word segmentation
*
* @param $string string
@@ -139,15 +117,4 @@ class LanguageGan extends LanguageZh {
return parent::normalizeForSearch( $string, $autoVariant );
}
- /**
- * @param $termsArray array
- * @return array
- */
- function convertForSearchResult( $termsArray ) {
- $terms = implode( '|', $termsArray );
- $terms = self::convertDoubleWidth( $terms );
- $terms = implode( '|', $this->mConverter->autoConvertToAllVariants( $terms ) );
- $ret = array_unique( explode( '|', $terms ) );
- return $ret;
- }
}
diff --git a/languages/classes/LanguageGv.php b/languages/classes/LanguageGv.php
index 70b80ad6..ba8a53ce 100644
--- a/languages/classes/LanguageGv.php
+++ b/languages/classes/LanguageGv.php
@@ -35,7 +35,9 @@ class LanguageGv extends Language {
* @return string
*/
function convertPlural( $count, $forms ) {
- if ( !count( $forms ) ) { return ''; }
+ if ( !count( $forms ) ) {
+ return '';
+ }
$forms = $this->preConvertPlural( $forms, 4 );
diff --git a/languages/classes/LanguageHi.php b/languages/classes/LanguageHi.php
deleted file mode 100644
index 6a2302c0..00000000
--- a/languages/classes/LanguageHi.php
+++ /dev/null
@@ -1,44 +0,0 @@
-<?php
-/**
- * Hindi (हिनà¥à¤¦à¥€) specific code.
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License along
- * with this program; if not, write to the Free Software Foundation, Inc.,
- * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
- * http://www.gnu.org/copyleft/gpl.html
- *
- * @file
- * @ingroup Language
- */
-
-/**
- * Hindi (हिनà¥à¤¦à¥€)
- *
- * @ingroup Language
- */
-class LanguageHi extends Language {
- /**
- * Use singular form for zero
- *
- * @param $count int
- * @param $forms array
- *
- * @return string
- */
- 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/LanguageHr.php b/languages/classes/LanguageHr.php
index a0e9a87a..910bc100 100644
--- a/languages/classes/LanguageHr.php
+++ b/languages/classes/LanguageHr.php
@@ -34,7 +34,9 @@ class LanguageHr extends Language {
* @return string
*/
function convertPlural( $count, $forms ) {
- if ( !count( $forms ) ) { return ''; }
+ if ( !count( $forms ) ) {
+ return '';
+ }
// @todo 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 );
@@ -43,10 +45,10 @@ class LanguageHr extends Language {
return $forms[2];
} else {
switch ( $count % 10 ) {
- case 1: return $forms[0];
+ case 1: return $forms[0];
case 2:
case 3:
- case 4: return $forms[1];
+ case 4: return $forms[1];
default: return $forms[2];
}
}
diff --git a/languages/classes/LanguageHy.php b/languages/classes/LanguageHy.php
index 50798131..24068296 100644
--- a/languages/classes/LanguageHy.php
+++ b/languages/classes/LanguageHy.php
@@ -49,17 +49,18 @@ class LanguageHy extends Language {
# 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 ) ) == 'Õ¡' )
+ if ( join( '', array_slice( $ar[0], -1 ) ) == 'Õ¡' ) {
$word = join( '', array_slice( $ar[0], 0, -1 ) ) . 'Õ¡ÕµÕ«';
- elseif ( join( '', array_slice( $ar[0], -1 ) ) == 'Õ¸' )
+ } elseif ( join( '', array_slice( $ar[0], -1 ) ) == 'Õ¸' ) {
$word = join( '', array_slice( $ar[0], 0, -1 ) ) . 'Õ¸ÕµÕ«';
- elseif ( join( '', array_slice( $ar[0], -4 ) ) == 'Õ£Õ«Ö€Ö„' )
+ } elseif ( join( '', array_slice( $ar[0], -4 ) ) == 'Õ£Õ«Ö€Ö„' ) {
$word = join( '', array_slice( $ar[0], 0, -4 ) ) . 'Õ£Ö€Ö„Õ«';
- else
+ } else {
$word .= 'Õ«';
+ }
break;
case 'dative': # ÕÖ€Õ¡Õ¯Õ¡Õ¶ Õ°Õ¸Õ¬Õ¸Õ¾
# stub
@@ -74,6 +75,7 @@ class LanguageHy extends Language {
# stub
break;
}
+ }
return $word;
}
diff --git a/languages/classes/LanguageIu.php b/languages/classes/LanguageIu.php
index fe5cdf8d..abd2e7c8 100644
--- a/languages/classes/LanguageIu.php
+++ b/languages/classes/LanguageIu.php
@@ -21,7 +21,7 @@
* @ingroup Language
*/
-require_once( __DIR__ . '/../LanguageConverter.php' );
+require_once __DIR__ . '/../LanguageConverter.php';
/**
* Conversion script between Latin and Syllabics for Inuktitut.
@@ -92,7 +92,7 @@ class IuConverter extends LanguageConverter {
'lowercase' => new ReplacementArray( $this->mUpperToLowerCaseLatin ),
'ike-cans' => new ReplacementArray( $this->mToSyllabics ),
'ike-latn' => new ReplacementArray( $this->mToLatin ),
- 'iu' => new ReplacementArray()
+ 'iu' => new ReplacementArray()
);
}
@@ -144,17 +144,19 @@ class IuConverter extends LanguageConverter {
* @param $ignoreOtherCond bool
*/
function findVariantLink( &$link, &$nt, $ignoreOtherCond = false ) {
- // check for user namespace
+ // check for user namespace
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;
parent::findVariantLink( $link, $nt, $ignoreOtherCond );
- if ( $this->getPreferredVariant() == $this->mMainLanguageCode )
+ if ( $this->getPreferredVariant() == $this->mMainLanguageCode ) {
$link = $oldlink;
+ }
}
/**
@@ -168,9 +170,11 @@ class IuConverter extends LanguageConverter {
*/
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 );
}
@@ -189,7 +193,7 @@ class IuConverter extends LanguageConverter {
if ( trim( $text ) ) {
$this->loadTables();
// To syllabics, first translate uppercase to lowercase Latin
- if($toVariant == 'ike-cans') {
+ if ( $toVariant == 'ike-cans' ) {
$text = $this->mTables['lowercase']->replace( $text );
}
$text = $this->mTables[$toVariant]->replace( $text );
diff --git a/languages/classes/LanguageKaa.php b/languages/classes/LanguageKaa.php
index a397bc0f..6203b4ba 100644
--- a/languages/classes/LanguageKaa.php
+++ b/languages/classes/LanguageKaa.php
@@ -41,7 +41,7 @@ class LanguageKaa extends Language {
function convertGrammar( $word, $case ) {
global $wgGrammarForms;
if ( isset( $wgGrammarForms['kaa'][$case][$word] ) ) {
- return $wgGrammarForms['kaa'][$case][$word];
+ return $wgGrammarForms['kaa'][$case][$word];
}
/* Full code of function convertGrammar() is in development. Updates coming soon. */
return $word;
@@ -54,7 +54,7 @@ class LanguageKaa extends Language {
*
* @return string
*/
- function ucfirst ( $string ) {
+ function ucfirst( $string ) {
if ( substr( $string, 0, 1 ) === 'i' ) {
return 'Ä°' . substr( $string, 1 );
} else {
@@ -69,7 +69,7 @@ class LanguageKaa extends Language {
*
* @return mixed|string
*/
- function lcfirst ( $string ) {
+ function lcfirst( $string ) {
if ( substr( $string, 0, 1 ) === 'I' ) {
return 'ı' . substr( $string, 1 );
} else {
diff --git a/languages/classes/LanguageKk.php b/languages/classes/LanguageKk.php
index 6dd6959f..f96b0d92 100644
--- a/languages/classes/LanguageKk.php
+++ b/languages/classes/LanguageKk.php
@@ -21,8 +21,8 @@
* @ingroup Language
*/
-require_once( __DIR__ . '/../LanguageConverter.php' );
-require_once( __DIR__ . '/LanguageKk_cyrl.php' );
+require_once __DIR__ . '/../LanguageConverter.php';
+require_once __DIR__ . '/LanguageKk_cyrl.php';
define( 'KK_C_UC', 'ÐӘБВГҒДЕÐЖЗИЙКҚЛМÐҢОӨПРСТУҰҮФХҺЦЧШЩЪЫІЬЭЮЯ' ); # Kazakh Cyrillic uppercase
define( 'KK_C_LC', 'аәбвгғдеёжзийкқлмнңоөпрÑтуұүфхһцчшщъыіьÑÑŽÑ' ); # Kazakh Cyrillic lowercase
@@ -62,24 +62,24 @@ class KkConverter extends LanguageConverter {
}
function loadDefaultTables() {
- // require( __DIR__."/../../includes/KkConversion.php" );
+ // require __DIR__."/../../includes/KkConversion.php";
// Placeholder for future implementing. Remove variables declarations
// after generating KkConversion.php
$kk2Cyrl = array();
$kk2Latn = array();
$kk2Arab = array();
- $kk2KZ = array();
- $kk2TR = array();
- $kk2CN = array();
+ $kk2KZ = array();
+ $kk2TR = array();
+ $kk2CN = array();
$this->mTables = array(
'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' => new ReplacementArray()
+ '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()
);
}
@@ -173,9 +173,9 @@ class KkConverter extends LanguageConverter {
# # Punctuation -> Arabic
'/#|â„–|No\./u' => 'Ø€', # &#x0600;
'/\,/' => '،', # &#x060C;
- '/;/' => 'Ø›', # &#x061B;
+ '/;/' => 'Ø›', # &#x061B;
'/\?/' => 'ØŸ', # &#x061F;
- '/%/' => 'Ùª', # &#x066A;
+ '/%/' => 'Ùª', # &#x066A;
'/\*/' => 'Ù­', # &#x066D;
# # Digits -> Arabic
'/0/' => 'Û°', # &#x06F0;
@@ -259,14 +259,16 @@ class KkConverter extends LanguageConverter {
// check for user namespace
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;
parent::findVariantLink( $link, $nt, $ignoreOtherCond );
- if ( $this->getPreferredVariant() == $this->mMainLanguageCode )
+ if ( $this->getPreferredVariant() == $this->mMainLanguageCode ) {
$link = $oldlink;
+ }
}
/**
@@ -280,9 +282,11 @@ class KkConverter extends LanguageConverter {
*/
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 );
}
@@ -299,7 +303,7 @@ class KkConverter extends LanguageConverter {
global $wgLanguageCode;
$text = parent::translate( $text, $toVariant );
- switch( $toVariant ) {
+ switch ( $toVariant ) {
case 'kk-cyrl':
case 'kk-kz':
$letters = KK_L_UC . KK_L_LC . 'ʺʹ#0123456789';
@@ -343,7 +347,7 @@ class KkConverter extends LanguageConverter {
return $text;
}
- switch( $toVariant ) {
+ switch ( $toVariant ) {
case 'kk-arab':
case 'kk-cn':
$letters = KK_C_LC . KK_C_UC/*.KK_L_LC.KK_L_UC*/;
@@ -414,13 +418,13 @@ class LanguageKk extends LanguageKk_cyrl {
$variants = array( 'kk', 'kk-cyrl', 'kk-latn', 'kk-arab', 'kk-kz', 'kk-tr', 'kk-cn' );
$variantfallbacks = array(
- 'kk' => 'kk-cyrl',
+ 'kk' => 'kk-cyrl',
'kk-cyrl' => 'kk',
'kk-latn' => 'kk',
'kk-arab' => 'kk',
- 'kk-kz' => 'kk-cyrl',
- 'kk-tr' => 'kk-latn',
- 'kk-cn' => 'kk-arab'
+ 'kk-kz' => 'kk-cyrl',
+ 'kk-tr' => 'kk-latn',
+ 'kk-cn' => 'kk-arab'
);
$this->mConverter = new KkConverter( $this, 'kk', $variants, $variantfallbacks );
@@ -435,7 +439,7 @@ class LanguageKk extends LanguageKk_cyrl {
*
* @return string
*/
- function ucfirst ( $string ) {
+ function ucfirst( $string ) {
$variant = $this->getPreferredVariant();
if ( ( $variant == 'kk-latn' || $variant == 'kk-tr' ) && $string[0] == 'i' ) {
$string = 'Ä°' . substr( $string, 1 );
@@ -452,7 +456,7 @@ class LanguageKk extends LanguageKk_cyrl {
*
* @return string
*/
- function lcfirst ( $string ) {
+ function lcfirst( $string ) {
$variant = $this->getPreferredVariant();
if ( ( $variant == 'kk-latn' || $variant == 'kk-tr' ) && $string[0] == 'I' ) {
$string = 'ı' . substr( $string, 1 );
diff --git a/languages/classes/LanguageKk_cyrl.php b/languages/classes/LanguageKk_cyrl.php
index 081a20f8..5a7bbf36 100644
--- a/languages/classes/LanguageKk_cyrl.php
+++ b/languages/classes/LanguageKk_cyrl.php
@@ -115,14 +115,14 @@ class LanguageKk_cyrl extends Language {
} 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 ) ) {
$word = $word . "ға";
}
- } elseif ( in_array( $wordEnding, $thirdPerson ) ) {
- if ( in_array( $wordLastVowel, $frontVowels ) ) {
+ } elseif ( in_array( $wordEnding, $thirdPerson ) ) {
+ if ( in_array( $wordLastVowel, $frontVowels ) ) {
$word = $word . "не";
} elseif ( in_array( $wordLastVowel, $backVowels ) ) {
$word = $word . "на";
@@ -153,13 +153,13 @@ class LanguageKk_cyrl extends Language {
break;
case "dc31":
case "possessive accusative": # täweldık + tabıs
- if ( in_array( $wordEnding, $firstPerson ) || in_array( $wordEnding, $secondPerson ) ) {
+ if ( in_array( $wordEnding, $firstPerson ) || in_array( $wordEnding, $secondPerson ) ) {
if ( in_array( $wordLastVowel, $frontVowels ) ) {
$word = $word . "ді";
} elseif ( in_array( $wordLastVowel, $backVowels ) ) {
$word = $word . "ды";
}
- } elseif ( in_array( $wordEnding, $thirdPerson ) ) {
+ } elseif ( in_array( $wordEnding, $thirdPerson ) ) {
$word = $word . "н";
}
break;
@@ -181,13 +181,13 @@ class LanguageKk_cyrl extends Language {
break;
case "dc41":
case "possessive locative": # täweldık + jatıs
- if ( in_array( $wordEnding, $firstPerson ) || in_array( $wordEnding, $secondPerson ) ) {
+ if ( in_array( $wordEnding, $firstPerson ) || in_array( $wordEnding, $secondPerson ) ) {
if ( in_array( $wordLastVowel, $frontVowels ) ) {
$word = $word . "де";
} elseif ( in_array( $wordLastVowel, $backVowels ) ) {
$word = $word . "да";
}
- } elseif ( in_array( $wordEnding, $thirdPerson ) ) {
+ } elseif ( in_array( $wordEnding, $thirdPerson ) ) {
if ( in_array( $wordLastVowel, $frontVowels ) ) {
$word = $word . "нде";
} elseif ( in_array( $wordLastVowel, $backVowels ) ) {
@@ -209,7 +209,7 @@ class LanguageKk_cyrl extends Language {
} 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 ) ) {
@@ -219,13 +219,13 @@ class LanguageKk_cyrl extends Language {
break;
case "dc51":
case "possessive ablative": # täweldık + şığıs
- if ( in_array( $wordEnding, $firstPerson ) || in_array( $wordEnding, $thirdPerson ) ) {
+ 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 ) ) {
@@ -340,14 +340,14 @@ class LanguageKk_cyrl extends Language {
} elseif ( in_array( $wordLastVowel, $backVowels ) ) {
$word = $word . "a";
}
- } elseif ( in_array( $wordEnding, $secondPerson ) ) {
+ } elseif ( in_array( $wordEnding, $secondPerson ) ) {
if ( in_array( $wordLastVowel, $frontVowels ) ) {
$word = $word . "ge";
} elseif ( in_array( $wordLastVowel, $backVowels ) ) {
$word = $word . "ÄŸa";
}
- } elseif ( in_array( $wordEnding, $thirdPerson ) ) {
- if ( in_array( $wordLastVowel, $frontVowels ) ) {
+ } elseif ( in_array( $wordEnding, $thirdPerson ) ) {
+ if ( in_array( $wordLastVowel, $frontVowels ) ) {
$word = $word . "ne";
} elseif ( in_array( $wordLastVowel, $backVowels ) ) {
$word = $word . "na";
@@ -378,13 +378,13 @@ class LanguageKk_cyrl extends Language {
break;
case "dc31":
case "possessive accusative": # täweldık + tabıs
- if ( in_array( $wordEnding, $firstPerson ) || in_array( $wordEnding, $secondPerson ) ) {
+ if ( in_array( $wordEnding, $firstPerson ) || in_array( $wordEnding, $secondPerson ) ) {
if ( in_array( $wordLastVowel, $frontVowels ) ) {
$word = $word . "di";
} elseif ( in_array( $wordLastVowel, $backVowels ) ) {
$word = $word . "dı";
}
- } elseif ( in_array( $wordEnding, $thirdPerson ) ) {
+ } elseif ( in_array( $wordEnding, $thirdPerson ) ) {
$word = $word . "n";
}
break;
@@ -406,13 +406,13 @@ class LanguageKk_cyrl extends Language {
break;
case "dc41":
case "possessive locative": # täweldık + jatıs
- if ( in_array( $wordEnding, $firstPerson ) || in_array( $wordEnding, $secondPerson ) ) {
+ if ( in_array( $wordEnding, $firstPerson ) || in_array( $wordEnding, $secondPerson ) ) {
if ( in_array( $wordLastVowel, $frontVowels ) ) {
$word = $word . "de";
} elseif ( in_array( $wordLastVowel, $backVowels ) ) {
$word = $word . "da";
}
- } elseif ( in_array( $wordEnding, $thirdPerson ) ) {
+ } elseif ( in_array( $wordEnding, $thirdPerson ) ) {
if ( in_array( $wordLastVowel, $frontVowels ) ) {
$word = $word . "nde";
} elseif ( in_array( $wordLastVowel, $backVowels ) ) {
@@ -434,7 +434,7 @@ class LanguageKk_cyrl extends Language {
} 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 ) ) {
@@ -444,13 +444,13 @@ class LanguageKk_cyrl extends Language {
break;
case "dc51":
case "possessive ablative": # täweldık + şığıs
- if ( in_array( $wordEnding, $firstPerson ) || in_array( $wordEnding, $thirdPerson ) ) {
+ 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 ) ) {
@@ -499,7 +499,7 @@ class LanguageKk_cyrl extends Language {
// Set up some constants...
// Vowels in last syllable
$frontVowels = array( "Û•", "Ù¶", "Ù·", "Ù¸", "Ùµ", "Û•" );
- $backVowels = array( "ا", "و", "ۇ", "ى" );
+ $backVowels = array( "ا", "و", "ۇ", "ى" );
$allVowels = array( "ە", "ٶ", "ٷ", "ٸ", "ٵ", "ە", "ا", "و", "ۇ", "ى" );
// Preceding letters
$Nasals = array( "Ù…", "Ù†", "Ú­" );
@@ -565,14 +565,14 @@ class LanguageKk_cyrl extends Language {
} 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 ) ) {
$word = $word . "عا";
}
- } elseif ( in_array( $wordEnding, $thirdPerson ) ) {
- if ( in_array( $wordLastVowel, $frontVowels ) ) {
+ } elseif ( in_array( $wordEnding, $thirdPerson ) ) {
+ if ( in_array( $wordLastVowel, $frontVowels ) ) {
$word = $word . "Ù†Û•";
} elseif ( in_array( $wordLastVowel, $backVowels ) ) {
$word = $word . "نا";
@@ -603,13 +603,13 @@ class LanguageKk_cyrl extends Language {
break;
case "dc31":
case "possessive accusative": # täweldık + tabıs
- if ( in_array( $wordEnding, $firstPerson ) || in_array( $wordEnding, $secondPerson ) ) {
+ if ( in_array( $wordEnding, $firstPerson ) || in_array( $wordEnding, $secondPerson ) ) {
if ( in_array( $wordLastVowel, $frontVowels ) ) {
$word = $word . "دٸ";
} elseif ( in_array( $wordLastVowel, $backVowels ) ) {
$word = $word . "دى";
}
- } elseif ( in_array( $wordEnding, $thirdPerson ) ) {
+ } elseif ( in_array( $wordEnding, $thirdPerson ) ) {
$word = $word . "Ù†";
}
break;
@@ -631,13 +631,13 @@ class LanguageKk_cyrl extends Language {
break;
case "dc41":
case "possessive locative": # täweldık + jatıs
- if ( in_array( $wordEnding, $firstPerson ) || in_array( $wordEnding, $secondPerson ) ) {
+ if ( in_array( $wordEnding, $firstPerson ) || in_array( $wordEnding, $secondPerson ) ) {
if ( in_array( $wordLastVowel, $frontVowels ) ) {
$word = $word . "دە";
} elseif ( in_array( $wordLastVowel, $backVowels ) ) {
$word = $word . "دا";
}
- } elseif ( in_array( $wordEnding, $thirdPerson ) ) {
+ } elseif ( in_array( $wordEnding, $thirdPerson ) ) {
if ( in_array( $wordLastVowel, $frontVowels ) ) {
$word = $word . "ندە";
} elseif ( in_array( $wordLastVowel, $backVowels ) ) {
@@ -659,7 +659,7 @@ class LanguageKk_cyrl extends Language {
} 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 ) ) {
@@ -669,13 +669,13 @@ class LanguageKk_cyrl extends Language {
break;
case "dc51":
case "possessive ablative": # täweldık + şığıs
- if ( in_array( $wordEnding, $firstPerson ) || in_array( $wordEnding, $thirdPerson ) ) {
+ 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 ) ) {
diff --git a/languages/classes/LanguageKsh.php b/languages/classes/LanguageKsh.php
index 074ad139..09c57279 100644
--- a/languages/classes/LanguageKsh.php
+++ b/languages/classes/LanguageKsh.php
@@ -104,17 +104,17 @@ class LanguageKsh extends Language {
# 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' )
+ ? ( $gender == 'f' ? 'dä' : 'däm' )
+ : ( $gender == 'f' ? 'de' : 'dem' )
) . ' ' . $word . ' ' .
- ( $gender=='f' ? 'ier' : 'sing' ) .
+ ( $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;
+ $word = 'en ' . ( $gender == 'f' ? 'dä' : 'däm' ) . ' ' . $word;
} else {
$word = ( $gender == 'f' ? 'en de' : 'em' ) . ' ' . $word;
}
@@ -124,13 +124,13 @@ class LanguageKsh extends Language {
if ( preg_match( '/ b/', $case ) ) {
$word = 'vun ' . ( $gender == 'f' ? 'dä' : 'däm' ) . ' ' . $word;
} else {
- $word = ( $gender== 'f' ? 'vun de' : 'vum' ) . ' ' . $word;
+ $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;
+ $word = ( $gender == 'f' ? 'dää' : 'dämm' ) . ' ' . $word;
} else {
$word = ( $gender == 'f' ? 'de' : 'dem' ) . ' ' . $word;
}
@@ -141,7 +141,7 @@ class LanguageKsh extends Language {
switch ( $gender ) {
case 'm':
$lord = 'dä';
- break ;
+ break;
case 'f':
$lord = 'di';
break;
@@ -160,7 +160,7 @@ class LanguageKsh extends Language {
$lord = 'et';
}
}
- $word = $lord.' '.$word;
+ $word = $lord . ' ' . $word;
}
return $word;
}
@@ -189,7 +189,9 @@ class LanguageKsh extends Language {
* @return string
*/
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.php b/languages/classes/LanguageKu.php
index 56a52ccb..75ac1c77 100644
--- a/languages/classes/LanguageKu.php
+++ b/languages/classes/LanguageKu.php
@@ -21,8 +21,8 @@
* @ingroup Language
*/
-require_once( __DIR__ . '/../LanguageConverter.php' );
-require_once( __DIR__ . '/LanguageKu_ku.php' );
+require_once __DIR__ . '/../LanguageConverter.php';
+require_once __DIR__ . '/LanguageKu_ku.php';
/**
* Kurdish converter routines
@@ -41,23 +41,23 @@ class KuConverter extends LanguageConverter {
/* Doppel- und Halbvokale */
'Úµ' => 'll', # ll
- 'Ú•' => 'rr', # rr
- 'ا' => 'a',
+ 'Ú•' => 'rr', # rr
+ 'ا' => 'a',
# 'ئێ' => 'ê', # initial e
- 'Û•' => 'e',
- 'ه‌' => 'e', # with one non-joiner
- 'ه‌‌' => 'e', # with two non-joiner
- 'Ø©' => 'e',
+ 'Û•' => 'e',
+ 'ه‌' => 'e', # with one non-joiner
+ 'ه‌‌' => 'e', # with two non-joiner
+ 'Ø©' => 'e',
'ێ' => 'ê',
- 'ي' => 'î',
- 'ی' => 'î', # U+06CC db 8c ARABIC LETTER FARSI YEH
- 'ى' => 'î', # U+0649 d9 89 ARABIC LETTER ALEF MAKSURA
- 'Û†' => 'o',
- 'Ùˆ' => 'w',
- 'ئ' => '', # initial hemze should not be shown
- '،' => ',',
- 'ع' => '\'', # ayn
- 'ØŸ' => '?',
+ 'ي' => 'î',
+ 'ی' => 'î', # U+06CC db 8c ARABIC LETTER FARSI YEH
+ 'ى' => 'î', # U+0649 d9 89 ARABIC LETTER ALEF MAKSURA
+ 'Û†' => 'o',
+ 'Ùˆ' => 'w',
+ 'ئ' => '', # initial hemze should not be shown
+ '،' => ',',
+ 'ع' => '\'', # ayn
+ 'ØŸ' => '?',
# digits
'Ù ' => '0', # &#x0660;
@@ -113,13 +113,13 @@ class KuConverter extends LanguageConverter {
' o' => 'ئۆ ',
' u' => 'ئو ',
' û' => 'ئوو ',
- 'A' => 'ئا',
- 'E' => 'ئە',
- 'Ê' => 'ئێ',
- 'Î' => 'ئی',
- 'O' => 'ئۆ',
- 'U' => 'ئو',
- 'Û' => 'ئوو',
+ 'A' => 'ئا',
+ 'E' => 'ئە',
+ 'Ê' => 'ئێ',
+ 'Î' => 'ئی',
+ 'O' => 'ئۆ',
+ 'U' => 'ئو',
+ 'Û' => 'ئوو',
' A' => 'ئا ',
' E' => 'ئە ',
' Ê' => 'ئێ ',
@@ -149,7 +149,7 @@ class KuConverter extends LanguageConverter {
$this->mTables = array(
'ku-latn' => new ReplacementArray( $this->mArabicToLatin ),
'ku-arab' => new ReplacementArray( $this->mLatinToArabic ),
- 'ku' => new ReplacementArray()
+ 'ku' => new ReplacementArray()
);
}
@@ -167,14 +167,16 @@ class KuConverter extends LanguageConverter {
// check for user namespace
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;
parent::findVariantLink( $link, $nt, $ignoreOtherCond );
- if ( $this->getPreferredVariant() == $this->mMainLanguageCode )
+ if ( $this->getPreferredVariant() == $this->mMainLanguageCode ) {
$link = $oldlink;
+ }
}
/**
@@ -188,9 +190,11 @@ class KuConverter extends LanguageConverter {
*/
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 );
}
@@ -253,7 +257,7 @@ class LanguageKu extends LanguageKu_ku {
$variants = array( 'ku', 'ku-arab', 'ku-latn' );
$variantfallbacks = array(
- 'ku' => 'ku-latn',
+ 'ku' => 'ku-latn',
'ku-arab' => 'ku-latn',
'ku-latn' => 'ku-arab',
);
diff --git a/languages/classes/LanguageLa.php b/languages/classes/LanguageLa.php
index ba0f1404..9c778782 100644
--- a/languages/classes/LanguageLa.php
+++ b/languages/classes/LanguageLa.php
@@ -49,54 +49,60 @@ class LanguageLa extends Language {
switch ( $case ) {
case 'genitive':
// only a few declensions, and even for those mostly the singular only
- $in = array( '/u[ms]$/', # 2nd declension singular
- '/ommunia$/', # 3rd declension neuter plural (partly)
- '/a$/', # 1st declension singular
- '/libri$/', '/nuntii$/', # 2nd declension plural (partly)
- '/tio$/', '/ns$/', '/as$/', # 3rd declension singular (partly)
- '/es$/' # 5th declension singular
- );
- $out = array( 'i',
- 'ommunium',
- 'ae',
- 'librorum', 'nuntiorum',
- 'tionis', 'ntis', 'atis',
- 'ei'
- );
+ $in = array(
+ '/u[ms]$/', # 2nd declension singular
+ '/ommunia$/', # 3rd declension neuter plural (partly)
+ '/a$/', # 1st declension singular
+ '/libri$/', '/nuntii$/', # 2nd declension plural (partly)
+ '/tio$/', '/ns$/', '/as$/', # 3rd declension singular (partly)
+ '/es$/' # 5th declension singular
+ );
+ $out = array(
+ 'i',
+ 'ommunium',
+ 'ae',
+ 'librorum', 'nuntiorum',
+ 'tionis', 'ntis', 'atis',
+ 'ei'
+ );
return preg_replace( $in, $out, $word );
case 'accusative':
// only a few declensions, and even for those mostly the singular only
- $in = array( '/u[ms]$/', # 2nd declension singular
- '/a$/', # 1st declension singular
- '/ommuniam$/', # 3rd declension neuter plural (partly)
- '/libri$/', '/nuntii$/', # 2nd declension plural (partly)
- '/tio$/', '/ns$/', '/as$/', # 3rd declension singular (partly)
- '/es$/' # 5th declension singular
- );
- $out = array( 'um',
- 'am',
- 'ommunia',
- 'libros', 'nuntios',
- 'tionem', 'ntem', 'atem',
- 'em'
- );
+ $in = array(
+ '/u[ms]$/', # 2nd declension singular
+ '/a$/', # 1st declension singular
+ '/ommuniam$/', # 3rd declension neuter plural (partly)
+ '/libri$/', '/nuntii$/', # 2nd declension plural (partly)
+ '/tio$/', '/ns$/', '/as$/', # 3rd declension singular (partly)
+ '/es$/' # 5th declension singular
+ );
+ $out = array(
+ 'um',
+ 'am',
+ 'ommunia',
+ 'libros', 'nuntios',
+ 'tionem', 'ntem', 'atem',
+ 'em'
+ );
return preg_replace( $in, $out, $word );
case 'ablative':
// only a few declensions, and even for those mostly the singular only
- $in = array( '/u[ms]$/', # 2nd declension singular
- '/ommunia$/', # 3rd declension neuter plural (partly)
- '/a$/', # 1st declension singular
- '/libri$/', '/nuntii$/', # 2nd declension plural (partly)
- '/tio$/', '/ns$/', '/as$/', # 3rd declension singular (partly)
- '/es$/' # 5th declension singular
- );
- $out = array( 'o',
- 'ommunibus',
- 'a',
- 'libris', 'nuntiis',
- 'tione', 'nte', 'ate',
- 'e'
- );
+ $in = array(
+ '/u[ms]$/', # 2nd declension singular
+ '/ommunia$/', # 3rd declension neuter plural (partly)
+ '/a$/', # 1st declension singular
+ '/libri$/', '/nuntii$/', # 2nd declension plural (partly)
+ '/tio$/', '/ns$/', '/as$/', # 3rd declension singular (partly)
+ '/es$/' # 5th declension singular
+ );
+ $out = array(
+ 'o',
+ 'ommunibus',
+ 'a',
+ 'libris', 'nuntiis',
+ 'tione', 'nte', 'ate',
+ 'e'
+ );
return preg_replace( $in, $out, $word );
default:
return $word;
diff --git a/languages/classes/LanguageMg.php b/languages/classes/LanguageMg.php
deleted file mode 100644
index ace0a4c3..00000000
--- a/languages/classes/LanguageMg.php
+++ /dev/null
@@ -1,44 +0,0 @@
-<?php
-/**
- * Malagasy (Malagasy) specific code.
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License along
- * with this program; if not, write to the Free Software Foundation, Inc.,
- * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
- * http://www.gnu.org/copyleft/gpl.html
- *
- * @file
- * @ingroup Language
- */
-
-/**
- * Malagasy (Malagasy)
- *
- * @ingroup Language
- */
-class LanguageMg extends Language {
- /**
- * Use singular form for zero
- *
- * @param $count int
- * @param $forms array
- *
- * @return string
- */
- 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/LanguageMk.php b/languages/classes/LanguageMk.php
deleted file mode 100644
index 968fe265..00000000
--- a/languages/classes/LanguageMk.php
+++ /dev/null
@@ -1,49 +0,0 @@
-<?php
-/**
- * Macedonian (МакедонÑки) specific code.
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License along
- * with this program; if not, write to the Free Software Foundation, Inc.,
- * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
- * http://www.gnu.org/copyleft/gpl.html
- *
- * @file
- * @ingroup Language
- */
-
-/**
- * Macedonian (МакедонÑки)
- *
- * @ingroup Language
- */
-class LanguageMk extends Language {
- /**
- * Plural forms per
- * http://unicode.org/repos/cldr-tmp/trunk/diff/supplemental/language_plural_rules.html#mk
- *
- * @param $count int
- * @param $forms array
- *
- * @return string
- */
- function convertPlural( $count, $forms ) {
- if ( !count( $forms ) ) { return ''; }
- $forms = $this->preConvertPlural( $forms, 2 );
- // TODO CLDR defines forms[0] for n != 11 and not for n%100 !== 11
- if ( $count % 10 === 1 && $count % 100 !== 11 ) {
- return $forms[0];
- } else {
- return $forms[1];
- }
- }
-}
diff --git a/languages/classes/LanguageMt.php b/languages/classes/LanguageMt.php
deleted file mode 100644
index 68bd7ca9..00000000
--- a/languages/classes/LanguageMt.php
+++ /dev/null
@@ -1,48 +0,0 @@
-<?php
-/**
- * Maltese (Malti) specific code.
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License along
- * with this program; if not, write to the Free Software Foundation, Inc.,
- * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
- * http://www.gnu.org/copyleft/gpl.html
- *
- * @file
- * @author Niklas Laxström
- * @ingroup Language
- */
-
-/**
- * Maltese (Malti)
- *
- * @ingroup Language
- */
-class LanguageMt extends Language {
-
- /**
- * @param $count int
- * @param $forms array
- * @return string
- */
- function convertPlural( $count, $forms ) {
- 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;
- else $index = 3;
- return $forms[$index];
- }
-}
diff --git a/languages/classes/LanguageNso.php b/languages/classes/LanguageNso.php
deleted file mode 100644
index 0c086750..00000000
--- a/languages/classes/LanguageNso.php
+++ /dev/null
@@ -1,44 +0,0 @@
-<?php
-/**
- * Northern Sotho (Sesotho sa Leboa) specific code.
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License along
- * with this program; if not, write to the Free Software Foundation, Inc.,
- * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
- * http://www.gnu.org/copyleft/gpl.html
- *
- * @file
- * @ingroup Language
- */
-
-/**
- * Northern Sotho (Sesotho sa Leboa)
- *
- * @ingroup Language
- */
-class LanguageNso extends Language {
- /**
- * Use singular form for zero
- *
- * @param $count int
- * @param $forms array
- *
- * @return string
- */
- 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/LanguageOs.php b/languages/classes/LanguageOs.php
index a808840f..f37e2d54 100644
--- a/languages/classes/LanguageOs.php
+++ b/languages/classes/LanguageOs.php
@@ -81,27 +81,41 @@ class LanguageOs extends Language {
# Checking if $word ends on 'у'. 'У' can be either consonant 'W' or vowel 'U' in cyrillic Ossetic.
# Examples: {{grammar:genitive|аунеу}} = аунеуы, {{grammar:genitive|лæппу}} = лæппуйы.
elseif ( preg_match( "/у$/u", $word ) ) {
- if ( !preg_match( "/[аæеёиоыÑÑŽÑ]$/u", mb_substr( $word, -2, 1 ) ) )
+ if ( !preg_match( "/[аæеёиоыÑÑŽÑ]$/u", mb_substr( $word, -2, 1 ) ) ) {
$jot = 'й';
+ }
} elseif ( !preg_match( "/[бвгджзйклмнопрÑтфхцчшщьъ]$/u", $word ) ) {
$hyphen = '-';
}
switch ( $case ) {
- case 'genitive': $ending = $hyphen . $jot . 'Ñ‹'; break;
- case 'dative': $ending = $hyphen . $jot . 'æн'; break;
- case 'allative': $ending = $hyphen . $end_allative; break;
+ case 'genitive':
+ $ending = $hyphen . $jot . 'Ñ‹';
+ break;
+ case 'dative':
+ $ending = $hyphen . $jot . 'æн';
+ break;
+ case 'allative':
+ $ending = $hyphen . $end_allative;
+ break;
case 'ablative':
if ( $jot == 'й' ) {
- $ending = $hyphen . $jot . 'æ'; break;
+ $ending = $hyphen . $jot . 'æ';
+ } else {
+ $ending = $hyphen . $jot . 'æй';
}
- else {
- $ending = $hyphen . $jot . 'æй'; break;
- }
- case 'inessive': break;
- case 'superessive': $ending = $hyphen . $jot . 'ыл'; break;
- case 'equative': $ending = $hyphen . $jot . 'ау'; break;
- case 'comitative': $ending = $hyphen . 'имæ'; break;
+ break;
+ case 'inessive':
+ break;
+ case 'superessive':
+ $ending = $hyphen . $jot . 'ыл';
+ break;
+ case 'equative':
+ $ending = $hyphen . $jot . 'ау';
+ break;
+ case 'comitative':
+ $ending = $hyphen . 'имæ';
+ break;
}
return $word . $ending;
}
diff --git a/languages/classes/LanguagePl.php b/languages/classes/LanguagePl.php
index 68bf0208..8e286c94 100644
--- a/languages/classes/LanguagePl.php
+++ b/languages/classes/LanguagePl.php
@@ -27,31 +27,6 @@
* @ingroup Language
*/
class LanguagePl extends Language {
-
- /**
- * @param $count string
- * @param $forms array
- * @return string
- */
- function convertPlural( $count, $forms ) {
- if ( !count( $forms ) ) { return ''; }
- $forms = $this->preConvertPlural( $forms, 3 );
- $count = abs( $count );
- if ( $count == 1 ) {
- return $forms[0]; // singular
- }
- switch ( $count % 10 ) {
- case 2:
- case 3:
- case 4:
- if ( $count / 10 % 10 != 1 ) {
- return $forms[1]; // plural
- }
- default:
- return $forms[2]; // plural genitive
- }
- }
-
/**
* @param $_ string
* @return string
diff --git a/languages/classes/LanguageSh.php b/languages/classes/LanguageSh.php
deleted file mode 100644
index 1fcddfc1..00000000
--- a/languages/classes/LanguageSh.php
+++ /dev/null
@@ -1,58 +0,0 @@
-<?php
-/**
- * Serbo-Croatian (Srpskohrvatski / СрпÑкохрватÑки) specific code.
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License along
- * with this program; if not, write to the Free Software Foundation, Inc.,
- * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
- * http://www.gnu.org/copyleft/gpl.html
- *
- * @file
- * @ingroup Language
- */
-
-/**
- * Serbo-Croatian (Srpskohrvatski / СрпÑкохрватÑки)
- *
- * @ingroup Language
- */
-class LanguageSh extends Language {
-
- /**
- * @param $count string
- * @param $forms array
- * @return string
- */
- function convertPlural( $count, $forms ) {
- 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];
-
- // @todo 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 ) {
- return $forms[2];
- } else {
- switch ( $count % 10 ) {
- case 1: return $forms[0];
- case 2:
- case 3:
- case 4: return $forms[1];
- default: return $forms[2];
- }
- }
- }
-}
diff --git a/languages/classes/LanguageShi.php b/languages/classes/LanguageShi.php
index 5ddcfdef..f4180cb8 100644
--- a/languages/classes/LanguageShi.php
+++ b/languages/classes/LanguageShi.php
@@ -21,7 +21,7 @@
* @ingroup Language
*/
-require_once( __DIR__ . '/../LanguageConverter.php' );
+require_once __DIR__ . '/../LanguageConverter.php';
/**
* Conversion script between Latin and Tifinagh for Tachelhit.
@@ -42,25 +42,25 @@ class ShiConverter extends LanguageConverter {
public $mToLatin = array(
'â´°' => 'a', 'â´±' => 'b', 'â´³' => 'g', 'â´·' => 'd', 'â´¹' => 'á¸', 'â´»' => 'e',
'ⴼ' => 'f', 'ⴽ' => 'k', 'ⵀ' => 'h', 'ⵃ' => 'ḥ', 'ⵄ' => 'ε', 'ⵅ' => 'x',
- 'ⵇ' => 'q', 'ⵉ' => 'i', 'ⵊ' => 'j', 'âµ' => 'l', 'ⵎ' => 'm', 'âµ' => 'n',
+ 'ⵇ' => 'q', 'ⵉ' => 'i', 'ⵊ' => 'j', 'âµ' => 'l', 'ⵎ' => 'm', 'âµ' => 'n',
'ⵓ' => 'u', 'ⵔ' => 'r', 'ⵕ' => 'ṛ', 'ⵖ' => 'γ', 'ⵙ' => 's', 'ⵚ' => 'ṣ',
'ⵛ' => 'š', 'ⵜ' => 't', 'ⵟ' => 'ṭ', 'ⵡ' => 'w', 'ⵢ' => 'y', 'ⵣ' => 'z',
'ⵥ' => 'ẓ', 'ⵯ' => 'ʷ', 'ⵖ' => 'ɣ', 'ⵠ' => 'v', 'ⵒ' => 'p',
);
public $mUpperToLowerCaseLatin = array(
- 'A' => 'a', 'B' => 'b', 'C' => 'c', 'D' => 'd', 'E' => 'e',
- 'F' => 'f', 'G' => 'g', 'H' => 'h', 'I' => 'i', 'J' => 'j',
- 'K' => 'k', 'L' => 'l', 'M' => 'm', 'N' => 'n', 'O' => 'o',
- 'P' => 'p', 'Q' => 'q', 'R' => 'r', 'S' => 's', 'T' => 't',
- 'U' => 'u', 'V' => 'v', 'W' => 'w', 'X' => 'x', 'Y' => 'y',
+ 'A' => 'a', 'B' => 'b', 'C' => 'c', 'D' => 'd', 'E' => 'e',
+ 'F' => 'f', 'G' => 'g', 'H' => 'h', 'I' => 'i', 'J' => 'j',
+ 'K' => 'k', 'L' => 'l', 'M' => 'm', 'N' => 'n', 'O' => 'o',
+ 'P' => 'p', 'Q' => 'q', 'R' => 'r', 'S' => 's', 'T' => 't',
+ 'U' => 'u', 'V' => 'v', 'W' => 'w', 'X' => 'x', 'Y' => 'y',
'Z' => 'z', 'Æ”' => 'É£',
);
public $mToTifinagh = array(
'a' => 'â´°', 'b' => 'â´±', 'g' => 'â´³', 'd' => 'â´·', 'á¸' => 'â´¹', 'e' => 'â´»',
'f' => 'ⴼ', 'k' => 'ⴽ', 'h' => 'ⵀ', 'ḥ' => 'ⵃ', 'ε' => 'ⵄ', 'x' => 'ⵅ',
- 'q' => 'ⵇ', 'i' => 'ⵉ', 'j' => 'ⵊ', 'l' => 'âµ', 'm' => 'ⵎ', 'n' => 'âµ',
+ 'q' => 'ⵇ', 'i' => 'ⵉ', 'j' => 'ⵊ', 'l' => 'âµ', 'm' => 'ⵎ', 'n' => 'âµ',
'u' => 'ⵓ', 'r' => 'ⵔ', 'ṛ' => 'ⵕ', 'γ' => 'ⵖ', 's' => 'ⵙ', 'ṣ' => 'ⵚ',
'š' => 'ⵛ', 't' => 'ⵜ', 'ṭ' => 'ⵟ', 'w' => 'ⵡ', 'y' => 'ⵢ', 'z' => 'ⵣ',
'ẓ' => 'ⵥ', 'ʷ' => 'ⵯ', 'ɣ' => 'ⵖ', 'v' => 'ⵠ', 'p' => 'ⵒ',
@@ -71,7 +71,7 @@ class ShiConverter extends LanguageConverter {
'lowercase' => new ReplacementArray( $this->mUpperToLowerCaseLatin ),
'shi-tfng' => new ReplacementArray( $this->mToTifinagh ),
'shi-latn' => new ReplacementArray( $this->mToLatin ),
- 'shi' => new ReplacementArray()
+ 'shi' => new ReplacementArray()
);
}
@@ -123,17 +123,19 @@ class ShiConverter extends LanguageConverter {
* @param $ignoreOtherCond bool
*/
function findVariantLink( &$link, &$nt, $ignoreOtherCond = false ) {
- // check for user namespace
+ // check for user namespace
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;
parent::findVariantLink( $link, $nt, $ignoreOtherCond );
- if ( $this->getPreferredVariant() == $this->mMainLanguageCode )
+ if ( $this->getPreferredVariant() == $this->mMainLanguageCode ) {
$link = $oldlink;
+ }
}
/**
@@ -147,9 +149,11 @@ class ShiConverter extends LanguageConverter {
*/
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 );
}
@@ -168,7 +172,7 @@ class ShiConverter extends LanguageConverter {
if ( trim( $text ) ) {
$this->loadTables();
// To Tifinagh, first translate uppercase to lowercase Latin
- if( $toVariant == 'shi-tfng' ) {
+ if ( $toVariant == 'shi-tfng' ) {
$text = $this->mTables['lowercase']->replace( $text );
}
$text = $this->mTables[$toVariant]->replace( $text );
@@ -190,7 +194,7 @@ class LanguageShi extends Language {
$variants = array( 'shi', 'shi-tfng', 'shi-latn' );
$variantfallbacks = array(
- 'shi' => 'shi-tfng',
+ 'shi' => 'shi-tfng',
'shi-tfng' => 'shi',
'shi-latn' => 'shi',
);
diff --git a/languages/classes/LanguageSk.php b/languages/classes/LanguageSk.php
deleted file mode 100644
index b1da70e6..00000000
--- a/languages/classes/LanguageSk.php
+++ /dev/null
@@ -1,49 +0,0 @@
-<?php
-/**
- * Slovak (SlovenÄina) specific code.
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License along
- * with this program; if not, write to the Free Software Foundation, Inc.,
- * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
- * http://www.gnu.org/copyleft/gpl.html
- *
- * @file
- * @ingroup Language
- */
-
-/**
- * Slovak (SlovenÄina)
- *
- * @ingroup Language
- */
-class LanguageSk extends Language {
-
- /**
- * @param $count int
- * @param $forms array
- * @return string
- */
- function convertPlural( $count, $forms ) {
- if ( !count( $forms ) ) { return ''; }
- $forms = $this->preConvertPlural( $forms, 3 );
-
- if ( $count == 1 ) {
- $index = 0;
- } elseif ( $count == 2 || $count == 3 || $count == 4 ) {
- $index = 1;
- } else {
- $index = 2;
- }
- return $forms[$index];
- }
-}
diff --git a/languages/classes/LanguageSl.php b/languages/classes/LanguageSl.php
index c075e515..06c75c95 100644
--- a/languages/classes/LanguageSl.php
+++ b/languages/classes/LanguageSl.php
@@ -45,35 +45,14 @@ class LanguageSl extends Language {
switch ( $case ) {
case 'mestnik': # locative
- $word = 'o ' . $word; break;
+ $word = 'o ' . $word;
+ break;
case 'orodnik': # instrumental
$word = 'z ' . $word;
+ break;
}
return $word; # this will return the original value for 'imenovalnik' (nominativ) and all undefined case values
}
- /**
- * @param $count int
- * @param $forms array
- *
- * @return string
- */
- function convertPlural( $count, $forms ) {
- if ( !count( $forms ) ) { return ''; }
- $forms = $this->preConvertPlural( $forms, 5 );
-
- if ( $count % 100 == 1 ) {
- $index = 0;
- } elseif ( $count % 100 == 2 ) {
- $index = 1;
- } elseif ( $count % 100 == 3 || $count % 100 == 4 ) {
- $index = 2;
- } elseif ( $count != 0 ) {
- $index = 3;
- } else {
- $index = 4;
- }
- return $forms[$index];
- }
}
diff --git a/languages/classes/LanguageSr.php b/languages/classes/LanguageSr.php
index 55aec32e..6f0ff4b5 100644
--- a/languages/classes/LanguageSr.php
+++ b/languages/classes/LanguageSr.php
@@ -21,9 +21,9 @@
* @ingroup Language
*/
-require_once( __DIR__ . '/../LanguageConverter.php' );
-require_once( __DIR__ . '/LanguageSr_ec.php' );
-require_once( __DIR__ . '/LanguageSr_el.php' );
+require_once __DIR__ . '/../LanguageConverter.php';
+require_once __DIR__ . '/LanguageSr_ec.php';
+require_once __DIR__ . '/LanguageSr_el.php';
/**
* There are two levels of conversion for Serbian: the script level
@@ -75,7 +75,7 @@ class SrConverter extends LanguageConverter {
$this->mTables = array(
'sr-ec' => new ReplacementArray( $this->mToCyrillics ),
'sr-el' => new ReplacementArray( $this->mToLatin ),
- 'sr' => new ReplacementArray()
+ 'sr' => new ReplacementArray()
);
}
@@ -118,14 +118,16 @@ class SrConverter extends LanguageConverter {
// check for user namespace
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;
parent::findVariantLink( $link, $nt, $ignoreOtherCond );
- if ( $this->getPreferredVariant() == $this->mMainLanguageCode )
+ if ( $this->getPreferredVariant() == $this->mMainLanguageCode ) {
$link = $oldlink;
+ }
}
/**
@@ -139,9 +141,11 @@ class SrConverter extends LanguageConverter {
*/
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 );
}
@@ -194,13 +198,13 @@ class SrConverter extends LanguageConverter {
* @since 1.19
*/
public function guessVariant( $text, $variant ) {
- $numCyrillic = preg_match_all("/[шђчћжШЂЧЋЖ]/u", $text, $dummy);
- $numLatin = preg_match_all("/[Å¡Ä‘Ä枊ÄČĆŽ]/u", $text, $dummy);
+ $numCyrillic = preg_match_all( "/[шђчћжШЂЧЋЖ]/u", $text, $dummy );
+ $numLatin = preg_match_all( "/[Å¡Ä‘Ä枊ÄČĆŽ]/u", $text, $dummy );
- if( $variant == 'sr-ec' ) {
- return (boolean) ($numCyrillic > $numLatin);
- } elseif( $variant == 'sr-el' ) {
- return (boolean) ($numLatin > $numCyrillic);
+ if ( $variant == 'sr-ec' ) {
+ return $numCyrillic > $numLatin;
+ } elseif ( $variant == 'sr-el' ) {
+ return $numLatin > $numCyrillic;
} else {
return false;
}
@@ -222,14 +226,14 @@ class LanguageSr extends LanguageSr_ec {
$variants = array( 'sr', 'sr-ec', 'sr-el' );
$variantfallbacks = array(
- 'sr' => 'sr-ec',
+ 'sr' => 'sr-ec',
'sr-ec' => 'sr',
'sr-el' => 'sr',
);
$flags = array(
'S' => 'S', 'пиÑмо' => 'S', 'pismo' => 'S',
- 'W' => 'W', 'реч' => 'W', 'reÄ' => 'W', 'ријеч' => 'W', 'rijeÄ' => 'W'
+ 'W' => 'W', 'реч' => 'W', 'reÄ' => 'W', 'ријеч' => 'W', 'rijeÄ' => 'W'
);
$this->mConverter = new SrConverter( $this, 'sr', $variants, $variantfallbacks, $flags );
$wgHooks['PageContentSaveComplete'][] = $this->mConverter;
@@ -262,10 +266,10 @@ class LanguageSr extends LanguageSr_ec {
return $forms[2];
} else {
switch ( $count % 10 ) {
- case 1: return $forms[0];
+ case 1: return $forms[0];
case 2:
case 3:
- case 4: return $forms[1];
+ case 4: return $forms[1];
default: return $forms[2];
}
}
diff --git a/languages/classes/LanguageSr_ec.php b/languages/classes/LanguageSr_ec.php
index 352e2930..cb9e8191 100644
--- a/languages/classes/LanguageSr_ec.php
+++ b/languages/classes/LanguageSr_ec.php
@@ -34,17 +34,19 @@ class LanguageSr_ec extends Language {
* @return string
*/
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 ) {
return $forms[2];
} else {
switch ( $count % 10 ) {
- case 1: return $forms[0];
+ case 1: return $forms[0];
case 2:
case 3:
- case 4: return $forms[1];
+ case 4: return $forms[1];
default: return $forms[2];
}
}
diff --git a/languages/classes/LanguageSr_el.php b/languages/classes/LanguageSr_el.php
index 0e36d6c3..99d12935 100644
--- a/languages/classes/LanguageSr_el.php
+++ b/languages/classes/LanguageSr_el.php
@@ -34,17 +34,19 @@ class LanguageSr_el extends Language {
* @return string
*/
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 ) {
return $forms[2];
} else {
switch ( $count % 10 ) {
- case 1: return $forms[0];
+ case 1: return $forms[0];
case 2:
case 3:
- case 4: return $forms[1];
+ case 4: return $forms[1];
default: return $forms[2];
}
}
diff --git a/languages/classes/LanguageTg.php b/languages/classes/LanguageTg.php
index 3ec14763..10755b48 100644
--- a/languages/classes/LanguageTg.php
+++ b/languages/classes/LanguageTg.php
@@ -21,7 +21,7 @@
* @ingroup Language
*/
-require_once( __DIR__ . '/../LanguageConverter.php' );
+require_once __DIR__ . '/../LanguageConverter.php';
/**
* Converts Tajiki to latin orthography
@@ -108,7 +108,7 @@ class TgConverter extends LanguageConverter {
function loadDefaultTables() {
$this->mTables = array(
'tg-latn' => new ReplacementArray( $this->table ),
- 'tg' => new ReplacementArray()
+ 'tg' => new ReplacementArray()
);
}
diff --git a/languages/classes/LanguageTi.php b/languages/classes/LanguageTi.php
deleted file mode 100644
index 27331cc9..00000000
--- a/languages/classes/LanguageTi.php
+++ /dev/null
@@ -1,44 +0,0 @@
-<?php
-/**
- * Tigrinya (ትáŒáˆ­áŠ›) specific code.
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License along
- * with this program; if not, write to the Free Software Foundation, Inc.,
- * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
- * http://www.gnu.org/copyleft/gpl.html
- *
- * @file
- * @ingroup Language
- */
-
-/**
- * Tigrinya (ትáŒáˆ­áŠ›)
- *
- * @ingroup Language
- */
-class LanguageTi extends Language {
- /**
- * Use singular form for zero
- *
- * @param $count int
- * @param $forms array
- *
- * @return string
- */
- 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/LanguageTr.php b/languages/classes/LanguageTr.php
index 6a015667..887f05c8 100644
--- a/languages/classes/LanguageTr.php
+++ b/languages/classes/LanguageTr.php
@@ -38,7 +38,7 @@ class LanguageTr extends Language {
* @param $string string
* @return string
*/
- function ucfirst ( $string ) {
+ function ucfirst( $string ) {
if ( strlen( $string ) && $string[0] == 'i' ) {
return 'Ä°' . substr( $string, 1 );
} else {
@@ -50,7 +50,7 @@ class LanguageTr extends Language {
* @param $string string
* @return mixed|string
*/
- function lcfirst ( $string ) {
+ function lcfirst( $string ) {
if ( strlen( $string ) && $string[0] == 'I' ) {
return 'ı' . substr( $string, 1 );
} else {
diff --git a/languages/classes/LanguageTyv.php b/languages/classes/LanguageTyv.php
index 6d147c87..fc1e8a81 100644
--- a/languages/classes/LanguageTyv.php
+++ b/languages/classes/LanguageTyv.php
@@ -150,7 +150,7 @@ class LanguageTyv extends Language {
$word = implode( "", $ar[0] ) . "Ñ‚Ñ‹";
} else {
}
- } elseif ( $wordEnding === "л" || $wordEnding === "l" ) {
+ } elseif ( $wordEnding === "л" || $wordEnding === "l" ) {
if ( in_array( $wordLastVowel, $roundFrontVowels ) ) {
$word = implode( "", $ar[0] ) . "дү";
} elseif ( in_array( $wordLastVowel, $unroundFrontVowels ) ) {
diff --git a/languages/classes/LanguageUk.php b/languages/classes/LanguageUk.php
index ce9ed33c..4ad272ba 100644
--- a/languages/classes/LanguageUk.php
+++ b/languages/classes/LanguageUk.php
@@ -48,32 +48,32 @@ class LanguageUk extends Language {
# 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 ) ) == 'ь' )
+ 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 ) ) == 'Ñ–Ñ' )
+ } elseif ( join( '', array_slice( $ar[0], -2 ) ) == 'Ñ–Ñ' ) {
$word = join( '', array_slice( $ar[0], 0, -2 ) ) . 'Ñ–Ñ—';
- elseif ( join( '', array_slice( $ar[0], -2 ) ) == 'ка' )
+ } elseif ( join( '', array_slice( $ar[0], -2 ) ) == 'ка' ) {
$word = join( '', array_slice( $ar[0], 0, -2 ) ) . 'ки';
- elseif ( join( '', array_slice( $ar[0], -2 ) ) == 'ти' )
+ } elseif ( join( '', array_slice( $ar[0], -2 ) ) == 'ти' ) {
$word = join( '', array_slice( $ar[0], 0, -2 ) ) . 'тей';
- elseif ( join( '', array_slice( $ar[0], -2 ) ) == 'ди' )
+ } elseif ( join( '', array_slice( $ar[0], -2 ) ) == 'ди' ) {
$word = join( '', array_slice( $ar[0], 0, -2 ) ) . 'дів';
- elseif ( join( '', array_slice( $ar[0], -3 ) ) == 'ник' )
+ } elseif ( join( '', array_slice( $ar[0], -3 ) ) == 'ник' ) {
$word = join( '', array_slice( $ar[0], 0, -3 ) ) . 'ника';
+ }
break;
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 ) ) == 'Ñ–Ñ' )
+ 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
@@ -82,6 +82,7 @@ class LanguageUk extends Language {
# stub
break;
}
+ }
return $word;
}
@@ -91,13 +92,17 @@ class LanguageUk extends Language {
* @return string
*/
function convertPlural( $count, $forms ) {
- if ( !count( $forms ) ) { return ''; }
+ if ( !count( $forms ) ) {
+ return '';
+ }
// If the actual number is not mentioned in the expression, then just two forms are enough:
// singular for $count == 1
// plural for $count != 1
// For example, "This user belongs to {{PLURAL:$1|one group|several groups}}."
- if ( count( $forms ) === 2 ) return $count == 1 ? $forms[0] : $forms[1];
+ if ( count( $forms ) === 2 ) {
+ return $count == 1 ? $forms[0] : $forms[1];
+ }
// @todo 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
@@ -107,10 +112,10 @@ class LanguageUk extends Language {
return $forms[2];
} else {
switch ( $count % 10 ) {
- case 1: return $forms[0];
+ case 1: return $forms[0];
case 2:
case 3:
- case 4: return $forms[1];
+ case 4: return $forms[1];
default: return $forms[2];
}
}
diff --git a/languages/classes/LanguageUz.php b/languages/classes/LanguageUz.php
index a2c917cd..aa3e4f24 100644
--- a/languages/classes/LanguageUz.php
+++ b/languages/classes/LanguageUz.php
@@ -21,7 +21,7 @@
* @ingroup Language
*/
-require_once( __DIR__ . '/../LanguageConverter.php' );
+require_once __DIR__ . '/../LanguageConverter.php';
/**
* @ingroup Language
@@ -75,9 +75,9 @@ class UzConverter extends LanguageConverter {
'f' => 'ф', 'F' => 'Ф',
'g' => 'г', 'G' => 'Г',
'g‘' => 'ғ', 'G‘' => 'Ғ', 'gʻ' => 'ғ', 'Gʻ' => 'Ғ',
- 'h' => 'Ò³', 'H' => 'Ò²',
+ 'h' => 'Ò³', 'H' => 'Ò²',
'i' => 'и', 'I' => 'И',
- 'k' => 'к', 'K' => 'К',
+ 'k' => 'к', 'K' => 'К',
'l' => 'л', 'L' => 'Л',
'm' => 'м', 'M' => 'М',
'n' => 'н', 'N' => 'Ð',
@@ -108,7 +108,7 @@ class UzConverter extends LanguageConverter {
$this->mTables = array(
'uz-cyrl' => new ReplacementArray( $this->toCyrillic ),
'uz-latn' => new ReplacementArray( $this->toLatin ),
- 'uz' => new ReplacementArray()
+ 'uz' => new ReplacementArray()
);
}
@@ -126,7 +126,7 @@ class LanguageUz extends Language {
$variants = array( 'uz', 'uz-latn', 'uz-cyrl' );
$variantfallbacks = array(
- 'uz' => 'uz-latn',
+ 'uz' => 'uz-latn',
'uz-cyrl' => 'uz',
'uz-latn' => 'uz',
);
diff --git a/languages/classes/LanguageWa.php b/languages/classes/LanguageWa.php
index 9e90c7f4..e5f7438f 100644
--- a/languages/classes/LanguageWa.php
+++ b/languages/classes/LanguageWa.php
@@ -30,20 +30,6 @@
* @ingroup Language
*/
class LanguageWa extends Language {
- /**
- * Use singular form for zero
- *
- * @param $count int
- * @param $forms array
- *
- * @return string
- */
- function convertPlural( $count, $forms ) {
- if ( !count( $forms ) ) { return ''; }
- $forms = $this->preConvertPlural( $forms, 2 );
-
- return ( $count <= 1 ) ? $forms[0] : $forms[1];
- }
/**
* Dates in Walloon are "1î d' <monthname>" for 1st of the month,
@@ -67,14 +53,14 @@ 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 );
- return $d;
+ $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 );
- return $d;
+ $d = substr( $ts, 6, 2 ) . '/' . substr( $ts, 4, 2 ) . '/' . substr( $ts, 0, 4 );
+ return $d;
}
# Walloon format
@@ -83,17 +69,17 @@ class LanguageWa extends Language {
$m = substr( $ts, 4, 2 );
$n = substr( $ts, 6, 2 );
if ( $n == 1 ) {
- $d = "1î d' " . $this->getMonthName( $m ) .
- " " . substr( $ts, 0, 4 );
+ $d = "1î d' " . $this->getMonthName( $m ) .
+ " " . substr( $ts, 0, 4 );
} elseif ( $n == 2 || $n == 3 || $n == 20 || $n == 22 || $n == 23 ) {
- $d = ( 0 + $n ) . " d' " . $this->getMonthName( $m ) .
- " " . substr( $ts, 0, 4 );
+ $d = ( 0 + $n ) . " d' " . $this->getMonthName( $m ) .
+ " " . substr( $ts, 0, 4 );
} elseif ( $m == 4 || $m == 8 || $m == 10 ) {
- $d = ( 0 + $n ) . " d' " . $this->getMonthName( $m ) .
- " " . substr( $ts, 0, 4 );
+ $d = ( 0 + $n ) . " d' " . $this->getMonthName( $m ) .
+ " " . substr( $ts, 0, 4 );
} else {
- $d = ( 0 + $n ) . " di " . $this->getMonthName( $m ) .
- " " . substr( $ts, 0, 4 );
+ $d = ( 0 + $n ) . " di " . $this->getMonthName( $m ) .
+ " " . substr( $ts, 0, 4 );
}
return $d;
}
@@ -106,7 +92,9 @@ class LanguageWa extends Language {
* @return string
*/
function timeanddate( $ts, $adj = false, $format = true, $tc = false ) {
- if ( $adj ) { $ts = $this->userAdjust( $ts, $tc ); }
+ if ( $adj ) {
+ $ts = $this->userAdjust( $ts, $tc );
+ }
$datePreference = $this->dateFormat( $format );
if ( $datePreference == 'ISO 8601' ) {
return parent::timeanddate( $ts, $adj, $format, $tc );
diff --git a/languages/classes/LanguageZh.php b/languages/classes/LanguageZh.php
index 04767f2d..d4130183 100644
--- a/languages/classes/LanguageZh.php
+++ b/languages/classes/LanguageZh.php
@@ -21,8 +21,8 @@
* @ingroup Language
*/
-require_once( __DIR__ . '/../LanguageConverter.php' );
-require_once( __DIR__ . '/LanguageZh_hans.php' );
+require_once __DIR__ . '/../LanguageConverter.php';
+require_once __DIR__ . '/LanguageZh_hans.php';
/**
* @ingroup Language
@@ -50,31 +50,31 @@ class ZhConverter extends LanguageConverter {
$flags,
$manualLevel );
$names = array(
- 'zh' => '原文',
+ 'zh' => '原文',
'zh-hans' => '简体',
'zh-hant' => 'ç¹é«”',
- 'zh-cn' => '大陆',
- 'zh-tw' => 'å°ç£',
- 'zh-hk' => '香港',
- 'zh-mo' => '澳門',
- 'zh-sg' => '新加å¡',
- 'zh-my' => '大马',
+ 'zh-cn' => '大陆',
+ 'zh-tw' => 'å°ç£',
+ 'zh-hk' => '香港',
+ 'zh-mo' => '澳門',
+ 'zh-sg' => '新加å¡',
+ 'zh-my' => '大马',
);
$this->mVariantNames = array_merge( $this->mVariantNames, $names );
}
function loadDefaultTables() {
- require( __DIR__ . "/../../includes/ZhConversion.php" );
+ require __DIR__ . "/../../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' => new ReplacementArray
+ '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
);
}
@@ -111,18 +111,18 @@ class LanguageZh extends LanguageZh_hans {
$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' => 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-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(
- 'zh' => 'disable',
+ 'zh' => 'disable',
'zh-hans' => 'unidirectional',
'zh-hant' => 'unidirectional',
);
@@ -142,9 +142,7 @@ class LanguageZh extends LanguageZh_hans {
* @return string
*/
function segmentForDiff( $text ) {
- return preg_replace(
- "/([\\xc0-\\xff][\\x80-\\xbf]*)/e",
- "' ' .\"$1\"", $text );
+ return preg_replace( '/[\xc0-\xff][\x80-\xbf]*/', ' $0', $text );
}
/**
@@ -152,9 +150,7 @@ class LanguageZh extends LanguageZh_hans {
* @return string
*/
function unsegmentForDiff( $text ) {
- return preg_replace(
- "/ ([\\xc0-\\xff][\\x80-\\xbf]*)/e",
- "\"$1\"", $text );
+ return preg_replace( '/ ([\xc0-\xff][\x80-\xbf]*)/', '$1', $text );
}
/**
diff --git a/languages/classes/LanguageZh_hans.php b/languages/classes/LanguageZh_hans.php
index 04b2e16a..3851c8fe 100644
--- a/languages/classes/LanguageZh_hans.php
+++ b/languages/classes/LanguageZh_hans.php
@@ -86,6 +86,8 @@ class LanguageZh_hans extends Language {
$segments = array();
foreach ( $intervals as $intervalName => $intervalValue ) {
+ // Messages: duration-seconds, duration-minutes, duration-hours, duration-days, duration-weeks,
+ // duration-years, duration-decades, duration-centuries, duration-millennia
$message = wfMessage( 'duration-' . $intervalName )->numParams( $intervalValue );
$segments[] = $message->inLanguage( $this )->escaped();
}
diff --git a/languages/data/plurals-mediawiki.xml b/languages/data/plurals-mediawiki.xml
index 07e157a3..70d45a3c 100644
--- a/languages/data/plurals-mediawiki.xml
+++ b/languages/data/plurals-mediawiki.xml
@@ -2,9 +2,16 @@
<!DOCTYPE supplementalData SYSTEM "../../common/dtd/ldmlSupplemental.dtd">
<supplementalData>
<plurals>
+ <!--
+ The "one" and "two" rules are copied directly from CLDR.
+ The "many" rule overrides CLDR, because CLDR seems to have a mistake:
+ it's sometimes needed for multiples of 10, but not for 10 itself.
+ When the CLDR is fixed, this should be removed.
+ -->
<pluralRules locales="he">
<pluralRule count="one">n is 1</pluralRule>
<pluralRule count="two">n is 2</pluralRule>
+ <pluralRule count="many">n is not 0 AND n is not 10 AND n mod 10 is 0</pluralRule>
</pluralRules>
<pluralRules locales="dsb hsb">
<pluralRule count="one">n mod 100 is 1</pluralRule>
diff --git a/languages/data/plurals.xml b/languages/data/plurals.xml
index d1a403dc..d5a1cfe2 100644
--- a/languages/data/plurals.xml
+++ b/languages/data/plurals.xml
@@ -5,7 +5,7 @@
<generation date="$Date: 2013-01-03 07:17:41 +0530 (Thu, 03 Jan 2013) $"/>
<plurals>
<!-- if locale is known to have no plurals, there are no rules -->
- <pluralRules locales="az bm bo dz fa id ig ii hu ja jv ka kde kea km kn ko lo ms my sah ses sg th to tr vi wo yo zh"/>
+ <pluralRules locales="az bm bo dz fa id ig ii hu ja jv ka kde kea km kn ko lo ms my sah ses sg th to tr vi wo yo zh"/>
<pluralRules locales="ar">
<pluralRule count="zero">n is 0</pluralRule>
<pluralRule count="one">n is 1</pluralRule>
diff --git a/languages/messages/MessagesAce.php b/languages/messages/MessagesAce.php
index 9d5a33af..c0878910 100644
--- a/languages/messages/MessagesAce.php
+++ b/languages/messages/MessagesAce.php
@@ -187,12 +187,6 @@ $messages = array(
'tog-shownumberswatching' => 'Peuleumah jumeulah ureueng kalon',
'tog-oldsig' => 'Tanda jaroe jinoe:',
'tog-fancysig' => 'Peujeuet tanda jaroe sibagoe naseukah wiki (hana hubong keudroe)',
-'tog-externaleditor' => 'Nguy editor eksternal nyang ka na (keu nyang utoih khong, peureulee neuato kusuih bak kompute droeneuh.
-
-[//www.mediawiki.org/wiki/Manual:External_editors Haba leubeh leungkap.])',
-'tog-externaldiff' => 'Nguy diff eksternal nyang ka na (keu nyang utoih mantong, peureulee neuato kusuih bak kompute droeneuh
-[//www.mediawiki.org/wiki/Manual:External_editors More information.])',
-'tog-showjumplinks' => 'Peuudep hubong keu ngon bantu "langsong u"',
'tog-uselivepreview' => 'Nguy peuleumah hase langsong (baci)',
'tog-forceeditsummary' => 'Peuingat lon meunyo plok neuringkaih neuandam mantong soh',
'tog-watchlisthideown' => 'Peusöm nyang lôn andam nibak dapeuta keunalön',
@@ -205,6 +199,8 @@ $messages = array(
'tog-diffonly' => 'Bek peuleumah asoe halaman di yup beunida neuandam',
'tog-showhiddencats' => 'Peuleumah kawan teusom',
'tog-norollbackdiff' => "Bek peudeuh beunida 'oh lheueh geupeuriwang",
+'tog-useeditwarning' => 'Neupeuingat lôn meunyoë meukubah ôn andam ngon hana teukeubah',
+'tog-prefershttps' => 'Sabè neunguy seunambông teulindông meunyoë neutamöng log',
'underline-always' => 'Sabe',
'underline-never' => "H'an tom",
@@ -268,6 +264,18 @@ $messages = array(
'oct' => 'Siplôh',
'nov' => 'Siblaih',
'dec' => 'Duwa Blaih',
+'january-date' => '$1 Buleuën Sa',
+'february-date' => '$1 Buleuën Duwa',
+'march-date' => '$1 Buleuën Lhèë',
+'april-date' => '$1 Buleuën Peuët',
+'may-date' => '$1 Buleuën Limong',
+'june-date' => '$1 Buleuën Nam',
+'july-date' => '$1 Buleuën Tujôh',
+'august-date' => '$1 Buleuën Lapan',
+'september-date' => '$1 Buleuën Sikureuëng',
+'october-date' => '$1 Buleuën Siplôh',
+'november-date' => '$1 Buleuën Siblaih',
+'december-date' => '$1 Buleuën Duwa Blaih',
# Categories related messages
'pagecategories' => '{{PLURAL:$1|Kawan|Kawan}}',
@@ -349,6 +357,7 @@ $messages = array(
'create-this-page' => 'Peugèt ôn nyoe',
'delete' => 'Sampôh',
'deletethispage' => 'Sampôh ôn nyoe',
+'undeletethispage' => 'Bèk neusampôh ôn nyoë',
'undelete_short' => 'Bateuë sampôh {{PLURAL:$1|one edit|$1 edits}}',
'viewdeleted_short' => 'Eu {{PLURAL:$1|saboh neuandam|$1 neuandam}} nyang geusampoh',
'protect' => 'Peulindông',
@@ -392,7 +401,7 @@ $1",
'pool-queuefull' => 'Seunapat neupreh peunoh',
'pool-errorunknown' => 'Salah hana meukon',
-# 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).
+# 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).
'aboutsite' => 'Bhaih {{SITENAME}}',
'aboutpage' => 'Project:Bhaih',
'copyright' => "Asoë na meunurot $1 keucuali meunyo na hay la'en nyang geupeugah",
@@ -402,7 +411,6 @@ $1",
'disclaimers' => 'Beunantah',
'disclaimerpage' => 'Project:Beunantah umom',
'edithelp' => 'Bantu andam',
-'edithelppage' => 'Help:Andam',
'helppage' => 'Help:Asoë',
'mainpage' => 'Ôn Keuë',
'mainpage-description' => 'Ôn Keuë',
@@ -476,17 +484,11 @@ Dapeuta on kusuih nyang sah jeuet neu'eu bak [[Special:SpecialPages|{{int:specia
# General errors
'error' => 'Seunalah',
'databaseerror' => 'Kesalahan basis data',
-'dberrortext' => 'Na salah bak syntax neulakee basis data.
-Nyoe kadang tanda na saboh bug lam alat leumiek.
-Neulakee basis data keuneulheueh nakeuh:
-<blockquote><code>$1</code></blockquote>
-nibak function "<code>$2</code>".
-Basis data na salah "<samp>$3: $4</samp>".',
-'dberrortextcl' => 'Na salah sintaks bak neulakee basis data.
-Neulakee basis data nyang keuneulheueh nakeuh:
-"$1"
-nibak fungsi "$2"
-Basis data geupeuhase salah "$3: $4".',
+'databaseerror-text' => 'Saboh salah bak nè data ka teujadi. Nyoë meuhat na nyang han paih bak peukakaih droëneuh',
+'databaseerror-textcl' => 'Teunanyong basis data teungoh kacho',
+'databaseerror-query' => 'Teunanyong: $1',
+'databaseerror-function' => 'Guna: $1',
+'databaseerror-error' => 'Salah: $1',
'laggedslavemode' => 'Peuneugah: On nyoe kadang hana neuubah baro',
'readonly' => 'Basis data geurok',
'enterlockreason' => 'Pasoe daleh neurok ngon pajan jeuet geupeuhah',
@@ -519,6 +521,7 @@ Kadang ka na soe sampoh.',
'cannotdelete-title' => 'H\'an jeuet sampoh on "$1"',
'delete-hook-aborted' => "Seunampoh geupeubateue le kaw'et parser.
Hana jeuneulaih.",
+'no-null-revision' => 'H\'an jeuet peugot revisi null baro keu halaman "$1"',
'badtitle' => 'Nan hana sah',
'badtitletext' => 'Nan ôn nyang neulakèë hana sah, soh, atawa nan antarabahsa atawa antarawiki nyang salah sambông.',
'perfcached' => 'Data di yup nyoe geupeusom ngon kadang kon data baro. {{PLURAL:$1|saboh hase|$1 hase}} maksimum na lam beujana.',
@@ -543,6 +546,7 @@ Keu neuk tamah atawa ubah teujeumah keu ban dum wiki, neungui [//translatewiki.n
# Login and logout pages
'yourname' => 'Ureuëng nguy:',
+'userlogin-yourname-ph' => 'Peutamöng nan ureuëng nguy droëneuh',
'yourpassword' => 'Lageuëm:',
'yourpasswordagain' => 'Pasoë lom lageuëm:',
'remembermypassword' => 'Ingat lôn tamong bak peuramban nyoë (keu paleng trep $1 {{PLURAL:$1|uroë|uroë}})',
@@ -716,7 +720,6 @@ Alasan-alasan nyan hana geupeureumeuen.",
'viewprevnext' => 'Eu ($1 {{int:pipe-separator}} $2)($3)',
'searchmenu-exists' => "'''Na on ngon nan \"[[:\$1]]\" bak wiki nyoe.'''",
'searchmenu-new' => "'''Peugöt ôn \"[[:\$1]]\" bak wiki nyoë!'''",
-'searchhelp-url' => 'Help:Asoë',
'searchprofile-articles' => 'Ôn asoë',
'searchprofile-project' => 'Ôn Beunantu ngön Buët',
'searchprofile-images' => 'Multimedia',
@@ -811,7 +814,6 @@ Ceunatat: (bida) = neuubah, (riwayat) = riwayat teumuléh, '''B''' = ôn barô,
'recentchangeslinked-feed' => 'Neuubah meuhubông',
'recentchangeslinked-toolbox' => 'Neuubah meuhubông',
'recentchangeslinked-title' => 'Neuubah nyang meuhubông ngön $1',
-'recentchangeslinked-noresult' => 'Hana neu’ubah bak ôn-ôn meuhubông silawét masa nyang ka geupeuteuntèë.',
'recentchangeslinked-summary' => "Nyoë nakeuh dapeuta neuubah nyang geupeugèt ban-ban nyoë keu on-on nyang meuhubông nibak ôn ka kusuih (atawa keu anggèëta kawan kusuih).
Ôn-ôn bak [[Special:Watchlist|keunalon droeneuh]] geucitak '''teubay'''.",
'recentchangeslinked-page' => 'Nan ôn:',
@@ -869,9 +871,6 @@ Teuneurang bak [$2 on teuneurangjih] geupeuleumah di yup nyoe.",
# Statistics
'statistics' => 'Keunira',
-'disambiguations' => 'Ôn disambiguasi',
-'disambiguationspage' => 'Template:disambig',
-
'doubleredirects' => 'Peuninah ganda',
'brokenredirects' => 'Peuninah reulöh',
@@ -1022,7 +1021,7 @@ Droëneuh jeuët neugantoë tingkat lindông keu ôn nyoë, tapi nyan hana peung
'contributions' => 'Beuneuri {{GENDER:$1|ureuëng nguy}}',
'contributions-title' => 'Beuneuri ureuëng nguy keu $1',
'mycontris' => 'Beuneuri',
-'contribsub2' => 'Keu $1 ($2)',
+'contribsub2' => 'Keu {{GENDER:$3|$1}} ($2)',
'uctop' => '(jinoë)',
'month' => 'Yôh buleuën (ngön yôh goh lom nyan)',
'year' => 'Yôh thôn (ngön yôh goh lom nyan)',
diff --git a/languages/messages/MessagesAeb.php b/languages/messages/MessagesAeb.php
index dd485ef4..b777cdba 100644
--- a/languages/messages/MessagesAeb.php
+++ b/languages/messages/MessagesAeb.php
@@ -46,9 +46,6 @@ $messages = array(
'tog-shownumberswatching' => 'اعرض عدد المستخدمين المراقبين',
'tog-oldsig' => 'التوقيع الحالي:',
'tog-fancysig' => 'عامل التوقيع كنص ويكي (بدون وصلة أوتوماتيكية)',
-'tog-externaleditor' => 'استخدم محررا خارجيا بشكل اÙتراضي (للخبراء Ùقط، يحتاج إعدادات خاصة على حاسوبك) ([//www.mediawiki.org/wiki/Manual:External_editors مزيد من المعلومات.])',
-'tog-externaldiff' => 'استخدم Ùرقا خارجيا بشكل اÙتراضي (للخبراء Ùقط، يحتاج إعدادات خاصة على حاسوبك) ([//www.mediawiki.org/wiki/Manual:External_editors للمزيد من المعلومات.])',
-'tog-showjumplinks' => 'مكن وصلات "اذهب إلى" المساعدة',
'tog-uselivepreview' => 'استخدم الاستعراض السريع (جاÙاسكريبت) (تجريبي)',
'tog-forceeditsummary' => 'نبهني عند إدخال ملخص تعديل Ùارغ',
'tog-watchlisthideown' => 'أخ٠تعديلاتي من قائمة المراقبة',
@@ -246,7 +243,7 @@ $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).
+# 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).
'aboutsite' => 'عن {{SITENAME}}',
'aboutpage' => 'Project:عن',
'copyright' => 'المحتوى متوÙر تحت $1.',
@@ -256,7 +253,6 @@ $1',
'disclaimers' => 'عدم مسؤولية',
'disclaimerpage' => 'Project:عدم مسؤولية عام',
'edithelp' => 'مساعدة التحرير',
-'edithelppage' => 'Help:تحرير',
'helppage' => 'Help:محتويات',
'mainpage' => 'الصÙحة الرئيسية',
'mainpage-description' => 'الصÙحة الرئيسية',
@@ -329,17 +325,6 @@ $1',
# General errors
'error' => 'ghalath',
'databaseerror' => 'خطأ ÙÙŠ قاعدة البيانات',
-'dberrortext' => 'حدث خطأ ÙÙŠ صيغة استعلام قاعدة البيانات.
-ربما يكون هذا عيب بالبرنامج.
-آخر استعلام طلب من قاعدة البيانات كان:
-<blockquote><tt>$1</tt></blockquote>
-من داخل الدالة "<tt>$2</tt>".
-أرجعت قاعدة البيانات الخطأ "<tt>$3: $4</tt>".',
-'dberrortextcl' => 'حدث خطأ ÙÙŠ صيغة استعلام قاعدة البيانات.
-آخر استعلام طلب من قاعدة البيانات كان:
-"$1"
-من داخل الدالة "$2".
-أرجعت قاعدة البيانات الخطأ "$3: $4"',
'laggedslavemode' => "'''تحذير:''' الصÙحة قد لا تحتوي على أحدث التحديثات.",
'readonly' => 'قاعدة البيانات مغلقة',
'enterlockreason' => 'أدخل سببا للغلق، متضمنا تقديرا لوقت رÙع الغلق',
@@ -395,7 +380,6 @@ mahouwech mobarrar',
'editinginterface' => "'''تحذير:''' أنت تقوم بتحرير صÙحة تستخدم ÙÙŠ الواجهة النصية للبرنامج.
سو٠تؤثر التغييرات على هذه الصÙحة على مظهر واجهة المستخدم للمستخدمين الآخرين.
للترجمات، من Ùضلك استخدم مشروع ترجمة ميدياويكي [//translatewiki.net/wiki/Main_Page?setlang=ar translatewiki.net].",
-'sqlhidden' => '(استعلام SQL مخÙÙŠ)',
'cascadeprotected' => 'تمت حماية هذه الصÙحة من التعديل لأنها مدمجة ÙÙŠ {{PLURAL:$1||الصÙحة التالية، والتي|الصÙحتين التاليتين، واللتين|الصÙحات التالية، والتي}} تم استعمال خاصية "حماية الصÙحات المدمجة" {{PLURAL:$1||بها|بهما|بها}}:
$2',
'namespaceprotected' => "لا تمتلك الصلاحية لتعديل الصÙحات ÙÙŠ نطاق '''$1'''.",
@@ -426,7 +410,6 @@ $2',
'yourpassword' => 'كلمة السر:',
'yourpasswordagain' => 'أعد كتابة كلمة السر:',
'remembermypassword' => 'تذكر دخولي على هذا الحاسوب (إلى {{PLURAL:$1||يوم واحد|يومين|$1 أيام|$1 يومًا|$1 يوم}} كحد أقصى)',
-'securelogin-stick-https' => 'ابقَ ÙÙŠ اتصال HTTPS بعد الدخول.',
'yourdomainname' => 'نطاقك:',
'externaldberror' => 'هناك إما خطأ ÙÙŠ دخول قاعدة البيانات الخارجية أو أنه غير مسموح لك بتحديث حسابك الخارجي.',
'login' => 'ادخل',
@@ -532,7 +515,7 @@ $2',
'newpassword' => 'كلمة السر الجديدة:',
'retypenew' => 'أعد كتابة كلمة السر الجديدة:',
'resetpass_submit' => 'ضبط كلمة السر والدخول',
-'resetpass_success' => 'تم تغيير كلمة السر الخاصة بك بنجاح! يتم تسجيل دخولك الآن...',
+'changepassword-success' => 'تم تغيير كلمة السر الخاصة بك بنجاح! يتم تسجيل دخولك الآن...',
'resetpass_forbidden' => 'كلمات السر لا يمكن تغييرها',
'resetpass-no-info' => 'يجب أن تكون مسجل الدخول للوصول إلى هذه الصÙحة مباشرة.',
'resetpass-submit-loggedin' => 'تغيير كلمة السر',
@@ -543,10 +526,8 @@ $2',
# Special:PasswordReset
'passwordreset' => 'إعادة ضبط كلمة السر',
-'passwordreset-text' => 'أكمل هذا النموذج لتتلقى بريدا إلكترونيا يذكر بتÙاصيل حسابك.',
'passwordreset-legend' => 'إعادة تعيين كلمة السر',
'passwordreset-disabled' => 'عÙطّلت إعادة تعيين كلمة السر على هذه الويكي.',
-'passwordreset-pretext' => '{{PLURAL:$1||أدخل أحد أجزاء البيانات أدناه}}',
'passwordreset-username' => 'اسم المستخدم:',
'passwordreset-domain' => 'النطاق:',
'passwordreset-capture' => 'أأعرض البريد الإلكتروني الناتج؟',
@@ -1079,7 +1060,6 @@ $1",
'recentchangeslinked' => 'تغييرات ذات علاقة',
'recentchangeslinked-toolbox' => 'تغييرات ذات علاقة',
'recentchangeslinked-title' => 'التغييرات المرتبطة ب "$1"',
-'recentchangeslinked-noresult' => 'لم تحدث تعديلات ÙÙŠ الصÙحات التي لها وصلات هنا خلال الÙترة المحددة.',
'recentchangeslinked-summary' => "هذه قائمة بالتغييرات التي تمت حديثا للصÙحات الموصولة من صÙحة معينة (أو إلى الأعضاء ضمن تصني٠معين).
الصÙحات ÙÙŠ [[Special:Watchlist|قائمة مراقبتك]] '''عريضة'''",
'recentchangeslinked-page' => 'اسم الصÙحة:',
@@ -1118,8 +1098,6 @@ $1",
# Statistics
'statistics' => 'إحصاءات',
-'disambiguationspage' => 'Template:توضيح',
-
# Miscellaneous special pages
'nbytes' => '$1 {{PLURAL:$1|بايت|بايت}}',
'nmembers' => '{{PLURAL:$1|لا أعضاء|عضو واحد|عضوان|$1 أعضاء|$1 عضوا|$1 عضو}}',
diff --git a/languages/messages/MessagesAf.php b/languages/messages/MessagesAf.php
index c6dad08f..14433092 100644
--- a/languages/messages/MessagesAf.php
+++ b/languages/messages/MessagesAf.php
@@ -15,6 +15,7 @@
* @author Kaganer
* @author Manie
* @author Naudefj
+ * @author Nemo bis
* @author Purodha
* @author Reedy
* @author SPQRobin
@@ -218,8 +219,8 @@ $messages = array(
'tog-extendwatchlist' => 'Brei dophoulys uit om alle wysigings te wys, nie slegs die nuutste nie',
'tog-usenewrc' => 'Groepeer wysigings per bladsy in onlangse wysigings en dophoulys (benodig JavaScript)',
'tog-numberheadings' => 'Nommer opskrifte outomaties',
-'tog-showtoolbar' => 'Wys redigeergereedskap (benodig JavaScript)',
-'tog-editondblclick' => 'Dubbelkliek om blaaie te wysig (benodig JavaScript)',
+'tog-showtoolbar' => 'Wys redigeergereedskap',
+'tog-editondblclick' => 'Dubbelkliek om te wysig',
'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)',
@@ -239,9 +240,6 @@ $messages = array(
'tog-shownumberswatching' => 'Wys die aantal gebruikers wat dophou',
'tog-oldsig' => 'Bestaande handtekening:',
'tog-fancysig' => 'Doodgewone handtekening (sonder outomatiese skakel)',
-'tog-externaleditor' => "Gebruik outomaties 'n eksterne redigeringsprogram (vir kundiges; [//www.mediawiki.org/wiki/Manual:External_editors benodig verdere verstellings])",
-'tog-externaldiff' => "Gebruik outomaties 'n eksterne vergelykingsprogram (net vir kundiges - benodig spesiale verstellings op u rekenaar)",
-'tog-showjumplinks' => 'Wys "spring na"-skakels vir toeganklikheid',
'tog-uselivepreview' => 'Gebruik lewendige voorskou (JavaScript) (eksperimenteel)',
'tog-forceeditsummary' => "Let my daarop as ek nie 'n opsomming van my wysiging gee nie",
'tog-watchlisthideown' => 'Versteek my wysigings in dophoulys',
@@ -254,6 +252,8 @@ $messages = array(
'tog-diffonly' => "Moenie 'n bladsy se inhoud onder die wysigingsverskil wys nie",
'tog-showhiddencats' => 'Wys versteekte kategorië',
'tog-norollbackdiff' => 'Laat verskille weg na terugrol',
+'tog-useeditwarning' => "Waarsku my as ek 'n gewysigde bladsy verlaat voordat dit gestoor is",
+'tog-prefershttps' => "Gebruik altyd 'n beveiligde verbinding wanneer aangemeld is",
'underline-always' => 'Altyd',
'underline-never' => 'Nooit',
@@ -317,6 +317,18 @@ $messages = array(
'oct' => 'Okt',
'nov' => 'Nov',
'dec' => 'Des',
+'january-date' => '$1 Januarie',
+'february-date' => '$1 Februarie',
+'march-date' => '$1 Maart',
+'april-date' => '$1 April',
+'may-date' => '$1 Mei',
+'june-date' => '$1 Junie',
+'july-date' => '$1 Julie',
+'august-date' => '$1 Augustus',
+'september-date' => '$1 September',
+'october-date' => '$1 Oktober',
+'november-date' => '$1 November',
+'december-date' => '$1 Desember',
# Categories related messages
'pagecategories' => '{{PLURAL:$1|Kategorie|Kategorieë}}',
@@ -398,6 +410,7 @@ $messages = array(
'create-this-page' => 'Skep hierdie bladsy',
'delete' => 'Skrap',
'deletethispage' => 'Skrap die bladsy',
+'undeletethispage' => 'Ontskrap die bladsy',
'undelete_short' => 'Herstel {{PLURAL:$1|een wysiging|$1 wysigings}}',
'viewdeleted_short' => 'Wys {{PLURAL:$1|een geskrapte wysiging|$1 geskrapte wysigings}}',
'protect' => 'Beskerm',
@@ -441,7 +454,7 @@ $1",
'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).
+# 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).
'aboutsite' => 'Inligting oor {{SITENAME}}',
'aboutpage' => 'Project:Omtrent',
'copyright' => 'Inhoud is onderhewig aan $1, tensy anders vermeld',
@@ -451,7 +464,6 @@ $1",
'disclaimers' => 'Voorbehoud',
'disclaimerpage' => 'Project:Voorwaardes',
'edithelp' => 'Wysigingshulp',
-'edithelppage' => 'Help:Wysig',
'helppage' => 'Help:Inhoud',
'mainpage' => 'Tuisblad',
'mainpage-description' => 'Tuisblad',
@@ -528,17 +540,10 @@ Dit kan ook dui op 'n fout in die sagteware van {{SITENAME}}.",
# General errors
'error' => 'Fout',
'databaseerror' => 'Databasisfout',
-'dberrortext' => 'Daar was \'n sintaksisfout in die databasisnavraag.
-Dit kan moontlik dui op \'n fout in die sagteware.
-Die laaste navraag was:
-<blockquote><code>$1</code></blockquote>
-vanuit funksie "<code>$2</code>".
-Databasis gee foutboodskap "<samp>$3: $4</samp>".',
-'dberrortextcl' => 'Sintaksisfout in databasisnavraag.
-Die laaste navraag was:
-"$1"
-vanuit funksie "$2".
-Databasis gee foutboodskap: "$3: $4".',
+'databaseerror-textcl' => "'n Databasis-versoek het gefaal.",
+'databaseerror-query' => 'SQL: $1',
+'databaseerror-function' => 'Funksie: $1',
+'databaseerror-error' => 'Fout: $1',
'laggedslavemode' => 'Waarskuwing: Onlangse wysigings dalk nie in bladsy vervat nie.',
'readonly' => 'Databasis gesluit',
'enterlockreason' => 'Rede vir die sluiting,
@@ -593,11 +598,14 @@ Probeer asseblief weer oor 'n paar minute.",
'protectedinterface' => 'Hierdie bladsy verskaf teks vir die koppelvlak van die sagteware, en is beskerm om misbruik te voorkom.
Gebruik asseblief [//translatewiki.net/ translatewiki.net] om vertalings by te voeg of te wysig.',
'editinginterface' => "'''Waarskuwing:''' U is besig om 'n bladsy te redigeer wat koppelvlakinligting aan die programmatuur voorsien. Wysigings aan hierdie bladsy sal die voorkoms van die gebruikerskoppelvlak vir ander gebruikers beïnvloed. Vir vertalings, oorweeg om eerder [//translatewiki.net/wiki/Main_Page?setlang=af translatewiki.net] (die vertalingsprojek vir MediaWiki) te gebruik.",
-'sqlhidden' => '(SQL navraag versteek)',
'cascadeprotected' => 'Hierdie bladsy is beskerm teen redigering omdat dit ingesluit is in die volgende {{PLURAL:$1|bladsy|bladsye}} wat beskerm is met die "kaskade" opsie aangeskakel: $2',
'namespaceprotected' => "U het nie toestemming om bladsye in die '''$1'''-naamruimte te wysig nie.",
'customcssprotected' => "U het nie toestemming om hierdie CSS-bladsy te redigeer nie, want dit bevat 'n ander gebruiker se persoonlike verstellings.",
'customjsprotected' => "U het nie toestemming om hierdie JavaScript-bladsy te redigeer nie, want dit bevat 'n ander gebruiker se persoonlike verstellings.",
+'mycustomcssprotected' => 'U het nie regte om die CSS-bladsy te wysig nie.',
+'mycustomjsprotected' => 'U het nie regte om die JavaScript-bladsy te wysig nie.',
+'myprivateinfoprotected' => 'U het nie regte om u persoonlike inligting te wysig nie.',
+'mypreferencesprotected' => 'U het nie regte om u voorkeure te wysig nie.',
'ns-specialprotected' => 'Spesiale bladsye kan nie geredigeer word nie.',
'titleprotected' => "Hierdie titel is beskerm teen skepping deur [[User:$1|$1]].
Die rede gegee is ''$2''.",
@@ -623,10 +631,19 @@ Dit is moontlik dat sommige bladsye nog sal aandui dat u steeds aangemeld is tot
'welcomecreation-msg' => 'U gebruiker is geskep.
Moenie vergeet om u [[Special:Preferences|voorkeure vir {{SITENAME}}]] te stel nie.',
'yourname' => 'Gebruikersnaam:',
+'userlogin-yourname' => 'Gebruikersnaam',
+'userlogin-yourname-ph' => 'Sleutel u gebruikersnaam in',
+'createacct-another-username-ph' => 'Verskaf gebruikersnaam',
'yourpassword' => 'Wagwoord:',
+'userlogin-yourpassword' => 'Wagwoord',
+'userlogin-yourpassword-ph' => 'Sleutel u wagwoord in',
+'createacct-yourpassword-ph' => "Sleutel 'n wagwoord in",
'yourpasswordagain' => 'Herhaal wagwoord',
+'createacct-yourpasswordagain' => 'Bevestig wagwoord',
+'createacct-yourpasswordagain-ph' => 'Sleutel weer u wagwoord in',
'remembermypassword' => "Onthou dat ek op hierdie rekenaar ingeteken het (vir 'n maksimum van $1 {{PLURAL:$1|dag|dae}})",
-'securelogin-stick-https' => 'Bly verbind met HTTPS na aanmelding',
+'userlogin-remembermypassword' => 'Hou my aangemeld',
+'userlogin-signwithsecure' => 'Gebruik veilige verbinding',
'yourdomainname' => 'U domein:',
'password-change-forbidden' => 'U kan nie wagwoorde op hierdie wiki verander nie.',
'externaldberror' => "'n Databasisfout het tydens aanmelding voorgekom of u het nie toestemming om u eksterne rekening op te dateer nie.",
@@ -638,18 +655,42 @@ Moenie vergeet om u [[Special:Preferences|voorkeure vir {{SITENAME}}]] te stel n
'logout' => 'Teken uit',
'userlogout' => 'Teken uit',
'notloggedin' => 'Nie ingeteken nie',
+'userlogin-noaccount' => 'Nog nie geregistreer nie?',
+'userlogin-joinproject' => 'Word lid van {{SITENAME}}',
'nologin' => 'Nog nie geregistreer nie? $1.',
'nologinlink' => "Skep gerus 'n gebruiker",
'createaccount' => 'Skep nuwe rekening',
'gotaccount' => "Het u reeds 'n rekening? $1.",
'gotaccountlink' => 'Meld aan',
'userlogin-resetlink' => 'U besonderhede vergeet?',
+'userlogin-resetpassword-link' => 'Herstel u wagwoord',
+'helplogin-url' => 'Help:Aanmelding',
+'userlogin-helplink' => '[[{{MediaWiki:helplogin-url}}|Hulp met aanmelding]]',
+'userlogin-createanother' => "Skep nog 'n rekening",
+'createacct-join' => 'Verskaf u gegewens hieronder.',
+'createacct-another-join' => 'Sleutel die nuwe rekening se inligting hier onder in:',
+'createacct-emailrequired' => 'E-posadres',
+'createacct-emailoptional' => 'E-posadres (opsioneel)',
+'createacct-email-ph' => 'Sleutel u e-posadres in',
+'createacct-another-email-ph' => 'Verskaf e-posadres',
'createaccountmail' => "Gebruik 'n tydelike lukrake wagwoord en stuur dit na die e-posadres hier onder",
+'createacct-realname' => 'Regte naam (opsioneel)',
'createaccountreason' => 'Rede:',
+'createacct-reason' => 'Rede',
+'createacct-reason-ph' => "Hoekom u nog 'n rekening skep",
+'createacct-captcha' => 'Veiligheidskontrole',
+'createacct-imgcaptcha-ph' => 'Sleutel die teks hierbo in',
+'createacct-submit' => 'Skep u rekening',
+'createacct-another-submit' => "Skep nog 'n rekening",
+'createacct-benefit-heading' => '{{SITENAME}} word deur mense soos u geskep.',
+'createacct-benefit-body1' => '{{PLURAL:$1|wysiging|wysigings}}',
+'createacct-benefit-body2' => '{{PLURAL:$1|bladsy|bladsye}}',
+'createacct-benefit-body3' => 'onlangse {{PLURAL:$1|bydraer|bydraers}}',
'badretype' => 'Die ingetikte wagwoorde is nie dieselfde nie.',
'userexists' => "Die gebruikersnaam wat u gekies het is beset.
Kies asseblief 'n ander naam.",
'loginerror' => 'Intekenfout',
+'createacct-error' => 'Fout tydens skep van gebruiker',
'createaccounterror' => "Kon nie 'n rekening skep nie: $1",
'nocookiesnew' => 'Die gebruiker is geregistreer, maar is nie aangemeld nie.
{{SITENAME}} gebruik koekies vir die aanmeld van gebruikers.
@@ -709,7 +750,7 @@ U word aangeraai om so gou as moontlik aan te meld en u wagwoord te verander.
Ignoreer die boodskap as die gebruiker sonder u medewete geskep is.',
'usernamehasherror' => "'n Gebruikersnaam mag nie 'n hekkie-karakter (#) in hê nie",
-'login-throttled' => "U het al te veel kere met 'n ongeldige wagwoord probeer aanteken.
+'login-throttled' => "U het al te veel kere met 'n ongeldige wagwoord probeer aanmeld.
Wag asseblief alvorens u weer probeer.",
'login-abort-generic' => 'U is nie aangemeld nie. Die prosedure is gestaak.',
'loginlanguagelabel' => 'Taal: $1',
@@ -730,7 +771,8 @@ Om voort te gaan moet u 'n nuwe wagwoord hier kies:",
'newpassword' => 'Nuwe wagwoord',
'retypenew' => 'Tik nuwe wagwoord weer in',
'resetpass_submit' => 'Stel wagwoord en meld aan',
-'resetpass_success' => 'U wagwoord is suksesvol gewysig! Besig om u in te teken ...',
+'changepassword-success' => 'U wagwoord is suksesvol gewysig!
+Besig om u aan te meld...',
'resetpass_forbidden' => 'Wagwoorde kannie gewysig word nie.',
'resetpass-no-info' => 'U moet ingeteken wees om hierdie bladsy direk te kan gebruik.',
'resetpass-submit-loggedin' => 'Verander wagwoord',
@@ -742,10 +784,11 @@ U het moontlik reeds u wagwoord gewysig of 'n nuwe tydelike wagwoord aangevra.",
# Special:PasswordReset
'passwordreset' => 'Wagwoord herstel',
-'passwordreset-text' => 'Voltooi hierdie vorm om u wagwoord te herstel.',
+'passwordreset-text-one' => 'Voltooi hierdie vorm om u wagwoord te herstel.',
+'passwordreset-text-many' => '{{PLURAL:$1|Vul een van die velde in om u wagwoord te herstel.}}',
'passwordreset-legend' => 'Kry nuwe wagwoord',
'passwordreset-disabled' => 'Die herskik van U wagwoord is gedeaktiveer op hierdie wiki.',
-'passwordreset-pretext' => '{{PLURAL:$1| | Voer een van die onderstaande velde in}}',
+'passwordreset-emaildisabled' => 'E-posfunksies is afgeskakel op hierdie wiki.',
'passwordreset-username' => 'Gebruiker:',
'passwordreset-domain' => 'Domein:',
'passwordreset-capture' => 'Wys resulterende e-pos?',
@@ -770,7 +813,7 @@ Meld asseblief aan en verander u wagwoord nou. As u dit nie versoek het nie, of
Tydelike wagwoord: $2',
'passwordreset-emailsent' => "'n E-pos is gestuur om u wagwoord te herstel.",
'passwordreset-emailsent-capture' => "'n E-pos vir die herstel van 'n wagwoord is gestuur. Dit word hieronder vertoon.",
-'passwordreset-emailerror-capture' => "'n E-pos ter herinnering is geskep en word hieronder vertoon. Die uitstuur daarvan het egter gefaal: $1",
+'passwordreset-emailerror-capture' => "'n E-pos vir die herstel van 'n wagwoord is saamgestel. Dit word hieronder vertoon. Die uitstuur daarvan na die {{GENDER:$2|gebruiker}} het egter gefaal: $1",
# Special:ChangeEmail
'changeemail' => 'Wysig E-posadres',
@@ -784,6 +827,9 @@ Tydelike wagwoord: $2',
'changeemail-submit' => 'Wysig E-posadres',
'changeemail-cancel' => 'Kanselleer',
+# Special:ResetTokens
+'resettokens-token-label' => '$1 (huidige waarde: $2)',
+
# Edit page toolbar
'bold_sample' => 'Vetgedrukte teks',
'bold_tip' => 'Vetdruk',
@@ -983,12 +1029,15 @@ Geen verduideliking is verskaf nie.",
Dit lyk of dit verwyder is.',
'edit-conflict' => 'Wysigingskonflik',
'edit-no-change' => 'U wysiging was geignoreer omdat die teks nie verander is nie.',
+'postedit-confirmation' => 'U wysigings is gestoor.',
'edit-already-exists' => 'Die bladsy is nie geskep nie.
Dit bestaan alreeds.',
'defaultmessagetext' => 'Verstekteks',
'content-failed-to-parse' => 'Dit was nie moontlik om die inhoud van die MIME-tipe $2 vir die model $1 te verwerk nie: $3.',
'invalid-content-data' => 'Ongeldige inhoud',
'content-not-allowed-here' => '"$1" word nie op bladsy [[$2]] toegelaat nie.',
+'editwarning-warning' => 'As u hierdie bladsy verlaat, verloor u moontlik al die wysigings wat u aangebring het.
+Indien u aangemeld is, kan u hierdie waarskuwing in die "Wysigings"-afdeling van u voorkeure afskakel.',
# Content models
'content-model-wikitext' => 'Wikiteks',
@@ -1024,6 +1073,7 @@ Kontroleer die vergelyking hieronder om seker te maak dis wat u wil doen, en sto
'undo-failure' => 'Die wysiging kan nie ongedaan gemaak word nie omdat dit met intermediêre wysigings bots.',
'undo-norev' => 'Die wysiging kon nie ongedaan gemaak word nie omdat dit nie bestaan nie of reeds verwyder is.',
'undo-summary' => 'Rol weergawe $1 deur [[Special:Contributions/$2|$2]] ([[User talk:$2|bespreek]]) terug.',
+'undo-summary-username-hidden' => "Rol weergawe $1 deur 'n versteekte gebruiker terug",
# Account creation failure
'cantcreateaccounttitle' => 'Kan nie rekening skep nie',
@@ -1203,6 +1253,7 @@ Let op dat die gebruik van navigasieskakels hierdie kolom se waardes sal herstel
'compareselectedversions' => 'Vergelyk gekose weergawes',
'showhideselectedversions' => 'Wys/versteek gekose weergawes',
'editundo' => 'maak ongedaan',
+'diff-empty' => '(Geen verskil)',
'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)',
'difference-missing-revision' => "{{PLURAL:$2|'n Weergawe|$2 weergawes}} van die verskil ($1) {{PLURAL:$2|is|is}} nie gevind nie.
@@ -1230,7 +1281,6 @@ Details kan in die [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} s
'searchmenu-legend' => 'Soekopsies',
'searchmenu-exists' => "'''Daar is reeds 'n bladsy genaamd \"[[:\$1]]\" op die wiki'''",
'searchmenu-new' => "'''Skep die bladsy \"[[:\$1]]\" op hierdie wiki'''",
-'searchhelp-url' => 'Help:Inhoud',
'searchmenu-prefix' => '[[Special:PrefixIndex/$1|Wys bladsye wat met die voorvoegsel begin]]',
'searchprofile-articles' => 'Inhoudelike bladsye',
'searchprofile-project' => 'Hulp- en projekbladsye',
@@ -1273,15 +1323,7 @@ U kan ook 'n naamruimte as voorvoegsel gebruik.",
'powersearch-togglenone' => 'Geen',
'search-external' => 'Eksterne soektog',
'searchdisabled' => '{{SITENAME}} se soekfunksie is tans afgeskakel ter wille van werkverrigting. Gebruik gerus intussen Google of Yahoo! Let daarop dat hulle indekse van die {{SITENAME}}-inhoud verouderd mag wees.',
-
-# Quickbar
-'qbsettings' => 'Snelbalkvoorkeure',
-'qbsettings-none' => 'Geen',
-'qbsettings-fixedleft' => 'Links vas.',
-'qbsettings-fixedright' => 'Regs vas.',
-'qbsettings-floatingleft' => 'Dryf links.',
-'qbsettings-floatingright' => 'Dryf regs.',
-'qbsettings-directionality' => 'Vas, afhanklik van die skryfrigting van u taal',
+'search-error' => "'n Fout het tydens die soektog voorgekom: $1",
# Preferences page
'preferences' => 'Voorkeure',
@@ -1315,7 +1357,6 @@ U kan ook 'n naamruimte as voorvoegsel gebruik.",
'resetprefs' => 'Herstel voorkeure',
'restoreprefs' => 'Herstel voorkeure',
'prefs-editing' => 'Wysigings',
-'prefs-edit-boxsize' => 'Afmetings van die wysigingsvenster.',
'rows' => 'Rye',
'columns' => 'Kolomme',
'searchresultshead' => 'Soekresultate',
@@ -1326,9 +1367,6 @@ U kan ook 'n naamruimte as voorvoegsel gebruik.",
'recentchangesdays-max' => 'Maksimum $1 {{PLURAL:$1|dag|dae}}',
'recentchangescount' => 'Aantal wysigings om by verstek te vertoon:',
'prefs-help-recentchangescount' => 'Dit geld vir onlangse wysigings, bladsygeskiedenis en logboekbladsye.',
-'prefs-help-watchlist-token' => "Deur 'n geheime sleutel hier in te sleutel word 'n RSS-voer vir u dophoulys geskep.
-Enige een wat die sleutel ken sal u dophoulys kan lees. Kies dus 'n veilige sleutel.
-Hier volg 'n lukraak gegenereerde waarde wat u kan gebruik: $1",
'savedprefs' => 'U voorkeure is gestoor.',
'timezonelegend' => 'Tydsone:',
'localtime' => 'Plaaslike tyd:',
@@ -1359,7 +1397,6 @@ Hier volg 'n lukraak gegenereerde waarde wat u kan gebruik: $1",
'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:',
-'prefs-textboxsize' => 'Afmetings van die wysigingsvenster',
'youremail' => 'E-posadres:',
'username' => '{{GENDER:$1|Gebruikersnaam}}:',
'uid' => '{{GENDER:$1|Gebruiker-ID}}:',
@@ -1393,6 +1430,8 @@ As u dit verskaf, sal dit gebruik word om erkenning vir u werk te gee.',
'prefs-dateformat' => 'Datumformaat',
'prefs-timeoffset' => 'Tydsverskil',
'prefs-advancedediting' => 'Algemeen',
+'prefs-editor' => 'Redigeerder',
+'prefs-preview' => 'Voorskou',
'prefs-advancedrc' => 'Gevorderde instellings',
'prefs-advancedrendering' => 'Gevorderde instellings',
'prefs-advancedsearchoptions' => 'Gevorderde instellings',
@@ -1427,6 +1466,8 @@ As u dit verskaf, sal dit gebruik word om erkenning vir u werk te gee.',
'userrights-notallowed' => 'U het nie magtiging om gebruikersregte by te sit of weg te neem nie.',
'userrights-changeable-col' => 'Groepe wat u kan verander',
'userrights-unchangeable-col' => 'Groepe wat u nie kan verander nie',
+'userrights-conflict' => 'Konflik met gebruikersregte! Pas asseblief weer u wysigings toe.',
+'userrights-removed-self' => 'U het u eie regte suksesvol verwyder. Gevolglik het u nie meer toegang tot hierdie bladsy nie.',
# Groups
'group' => 'Groep:',
@@ -1492,11 +1533,19 @@ As u dit verskaf, sal dit gebruik word om erkenning vir u werk te gee.',
'right-proxyunbannable' => "Blokkades vir instaanbedieners (proxy's) geld nie",
'right-unblockself' => 'Eie gebruiker deblokkeer',
'right-protect' => 'Verander beveiligingsvlakke en wysig kaskade-beskermde bladsye',
-'right-editprotected' => 'Wysig beskermde bladsye (sonder kaskade-beskerming)',
+'right-editprotected' => 'Wysig bladsye beskermd as "{{int:protect-level-sysop}}"',
+'right-editsemiprotected' => 'Wysig bladsye wat as "{{int:protect-level-autoconfirmed}}" beskerm is',
'right-editinterface' => 'Wysig die gebruikerskoppelvlak',
'right-editusercssjs' => 'Wysig ander gebruikers se CSS- en JS-lêers',
'right-editusercss' => 'Wysig ander gebruikers se CSS-lêers',
'right-edituserjs' => 'Wysig ander gebruikers se JS-lêers',
+'right-editmyusercss' => 'Wysig u persoonlike CSS-bladsy',
+'right-editmyuserjs' => 'Wysig u persoonlike JavaScript-bladsy',
+'right-viewmywatchlist' => 'Wys u persoonlike dophoulys',
+'right-editmywatchlist' => 'Wysig u persoonlike dophoulys. Sommige aksies sal steeds bladsye byvoeg, selfs sonder die bevoegdheid.',
+'right-viewmyprivateinfo' => 'Wys u eie privaat data (bv. e-posadres, regte naam)',
+'right-editmyprivateinfo' => 'Wysig u eie privaat data (bv. e-posadres, regte naam)',
+'right-editmyoptions' => 'Wysig u eie voorkeure',
'right-rollback' => "Rol wysigings van die laaste gebruiker wat 'n bladsy gewysig het vinnig terug",
'right-markbotedits' => 'Merk teruggerolde wysigings as botbywerkings',
'right-noratelimit' => 'Negeer tydsafhanklike beperkings',
@@ -1558,12 +1607,19 @@ As u dit verskaf, sal dit gebruik word om erkenning vir u werk te gee.',
'action-userrights-interwiki' => 'wysig gebruikersregte van gebruikers op ander wikis',
'action-siteadmin' => 'sluit of ontsluit die databasis',
'action-sendemail' => 'stuur e-posse',
+'action-editmywatchlist' => 'wysig u dophoulys',
+'action-viewmywatchlist' => 'wys u dophoulys',
+'action-viewmyprivateinfo' => 'wys u privaat inligting',
+'action-editmyprivateinfo' => 'wysig u privaat inligting',
# Recent changes
'nchanges' => '$1 {{PLURAL:$1|wysiging|wysigings}}',
+'enhancedrc-since-last-visit' => '$1 {{PLURAL:$1|sedert u laaste besoek}}',
+'enhancedrc-history' => 'geskiedenis',
'recentchanges' => 'Onlangse wysigings',
'recentchanges-legend' => 'Opsies vir onlangse wysigings',
'recentchanges-summary' => 'Volg die mees onlangse wysigings aan die wiki op die bladsy.',
+'recentchanges-noresult' => 'Geen wysigings gedurende die tydperk pas die kriteria nie.',
'recentchanges-feed-description' => 'Hierdie voer laat u toe om die mees onlangse wysigings aan die wiki te volg.',
'recentchanges-label-newpage' => "Met die wysiging is 'n nuwe bladsy geskep",
'recentchanges-label-minor' => "Hierdie is 'n klein wysiging",
@@ -1600,7 +1656,6 @@ As u dit verskaf, sal dit gebruik word om erkenning vir u werk te gee.',
'recentchangeslinked-feed' => 'Verwante veranderings',
'recentchangeslinked-toolbox' => 'Verwante veranderings',
'recentchangeslinked-title' => 'Wysigings verwant aan "$1"',
-'recentchangeslinked-noresult' => 'Geen veranderinge op geskakelde bladsye gedurende die periode nie.',
'recentchangeslinked-summary' => "Hier volg 'n lys van wysigings wat onlangs gemaak is aan bladsye wat van die gespesifiseerde bladsy geskakel word (of van bladsye van die gespesifiseerde kategorie).
Bladsye op [[Special:Watchlist|u dophoulys]] word in '''vetdruk''' uitgewys.",
'recentchangeslinked-page' => 'Bladsynaam:',
@@ -1612,8 +1667,7 @@ Bladsye op [[Special:Watchlist|u dophoulys]] word in '''vetdruk''' uitgewys.",
'reuploaddesc' => 'Keer terug na die laaivorm.',
'upload-tryagain' => 'Stuur gewysigde lêerbeskrywing',
'uploadnologin' => 'Nie ingeteken nie',
-'uploadnologintext' => 'Teken eers in [[Special:UserLogin|logged in]]
-om lêers te laai.',
+'uploadnologintext' => 'U moet $1 alvorens u lêers kan 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',
@@ -1843,7 +1897,6 @@ Vir veiligheidsredes is img_auth.php gedeaktiveer.",
'http-read-error' => 'Fout met die lees van HTTP.',
'http-timed-out' => 'HTTP-versoek se tyd is verstreke.',
'http-curl-error' => 'Fout met die ophaal van URL: $1',
-'http-host-unreachable' => 'Die URL is nie bereikbaar nie.',
'http-bad-status' => "Daar was 'n probleem tydens die HTTP-versoek: $1 $2",
# Some likely curl errors. More could be added from <http://curl.haxx.se/libcurl/c/libcurl-errors.html>
@@ -1876,6 +1929,9 @@ Kliek op die opskrifte om die tabel te hersorteer.',
'listfiles_size' => 'Grootte',
'listfiles_description' => 'Beskrywing',
'listfiles_count' => 'Weergawes',
+'listfiles-latestversion' => 'Huidige weergawe',
+'listfiles-latestversion-yes' => 'Ja',
+'listfiles-latestversion-no' => 'Nee',
# File description page
'file-anchor-link' => 'Lêer',
@@ -1970,6 +2026,11 @@ Miskien wil u eerder die beskrywing daar op die [$2 lêerbeskrywing] bywerk.',
'randompage' => 'Lukrake bladsy',
'randompage-nopages' => 'Daar is geen bladsye in die volgende {{PLURAL:$2|naamruimte|naamruimtes}} nie: $1.',
+# Random page in category
+'randomincategory-invalidcategory' => '"$1" is nie \'n geldige kategorienaam nie.',
+'randomincategory-nopages' => 'Daar is geen bladsye in kategorie [[:Category:$1|$1]].',
+'randomincategory-selectcategory-submit' => 'Gaan',
+
# Random redirect
'randomredirect' => 'Lukrake aanstuur',
'randomredirect-nopages' => 'Daar is geen aansture in naamruimte "$1" nie.',
@@ -1995,12 +2056,6 @@ Miskien wil u eerder die beskrywing daar op die [$2 lêerbeskrywing] bywerk.',
'statistics-users-active-desc' => "Gebruikers wat in die afgelope {{PLURAL:$1|dag|$1 dae}} 'n handeling uitgevoer het",
'statistics-mostpopular' => 'Mees bekykte bladsye',
-'disambiguations' => 'Bladsye wat na dubbelsinnigheidsbladsye skakel',
-'disambiguationspage' => 'Template:Dubbelsinnig',
-'disambiguations-text' => "Die volgende bladsye het ten minste een skakel na 'n '''dubbelsinnigheidsbladsy'''.
-Hulle moet gewysig word om eerder direk na die regte onderwerpe te skakel.<br />
-'n Bladsy word beskou as 'n dubbelsinnigheidsbladsy as dit 'n sjabloon bevat wat geskakel is vanaf [[MediaWiki:Disambiguationspage]]",
-
'pageswithprop' => "Blaaie met 'n bladsy-eienskap",
'pageswithprop-legend' => "Blaaie met 'n bladsy-eienskap",
'pageswithprop-text' => "Hierdie bladsy lys blaaie met 'n bepaalde blady-eienskap.",
@@ -2255,10 +2310,9 @@ Toekomstige wysigings aan hierdie bladsy en sy bybehorende besprekingsblad sal h
'unwatchthispage' => 'Moenie meer dophou',
'notanarticle' => "Nie 'n artikel",
'notvisiblerev' => 'Weergawe is verwyder',
-'watchnochange' => 'Geen item op die dophoulys is geredigeer in die gekose periode nie.',
'watchlist-details' => '{{PLURAL:$1|$1 bladsy|$1 bladsye}} in u dophoulys, besprekingsbladsye uitgesluit.',
-'wlheader-enotif' => '* E-pos notifikasie is aangeskakel.',
-'wlheader-showupdated' => "* Bladsye wat verander is sedert u hulle laas besoek het word in '''vetdruk''' uitgewys",
+'wlheader-enotif' => 'E-pos kennisgewings is aangeskakel.',
+'wlheader-showupdated' => "Bladsye wat verander is sedert u hulle laas besoek het word in '''vetdruk''' uitgewys.",
'watchmethod-recent' => 'Kontroleer onlangse wysigings aan bladsye op dophoulys',
'watchmethod-list' => 'kontroleer bladsye op dophoulys vir wysigings',
'watchlistcontains' => 'Jou dophoulys bevat $1 {{PLURAL:$1|bladsy|bladsye}}.',
@@ -2510,7 +2564,7 @@ $1',
'contributions' => '{{GENDER:$1|Gebruikersbydraes}}',
'contributions-title' => '$1 se bydraes',
'mycontris' => 'Bydraes',
-'contribsub2' => 'Vir $1 ($2)',
+'contribsub2' => 'Vir {{GENDER:$3|$1}} ($2)',
'nocontribs' => 'Geen veranderinge wat by hierdie kriteria pas, is gevind nie.',
'uctop' => '(laaste wysiging)',
'month' => 'Vanaf maand (en vroeër):',
@@ -2669,15 +2723,13 @@ Die blokkade is moontlik reeds opgehef.',
Die blokkade is 'n onderdeel van die reeks $2, waarvan die blokkade wel opgehef kan word.",
'ip_range_invalid' => 'Ongeldige IP waardegebied.',
'ip_range_toolarge' => 'Reeks-blokkades groter as /$1 word nie toegelaat nie.',
-'blockme' => 'Versper my',
'proxyblocker' => 'Proxyblokker',
-'proxyblocker-disabled' => 'Die funksie is gedeaktiveer.',
'proxyblockreason' => "U IP-adres is geblokkeer omdat dit van 'n oop instaanbediener (proxy) gebruik maak.
Kontak asseblief u internet-diensverskaffer of tegniese ondersteuning en lig hulle van hierdie ernstige sekuriteitsprobleem in.",
-'proxyblocksuccess' => 'Voltooi.',
'sorbsreason' => "U IP-adres is gelys as 'n oop instaanbediener (proxy) in die DNS-swartlys wat op {{SITENAME}} gebruik word.",
'sorbs_create_account_reason' => "U IP-adres is gelys as 'n oop instaanbediener (proxy) in die DNS-swartlys wat op {{SITENAME}} gebruik word.
U kan nie 'n rekening skep nie.",
+'xffblockreason' => "'n IP-adres wat u gebruik is geblokkeer. Dit kom in die opskrif 'X-Forwarded-For' voor. Die oorspronklike rede vir die blokkade is: $1",
'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.",
@@ -2839,6 +2891,8 @@ Gaan na [//www.mediawiki.org/wiki/Localisation MediaWiki-lokalisasie] en [//tran
'thumbnail-more' => 'Vergroot',
'filemissing' => 'Lêer is weg',
'thumbnail_error' => 'Fout met die skep van duimnaelsketse: $1',
+'thumbnail_error_remote' => 'Fout vanaf $1:
+$2',
'djvu_page_error' => 'DjVu-bladsy buite bereik',
'djvu_no_xml' => 'Die XML vir die DjVu-lêer kon nie bekom word nie',
'thumbnail-temp-create' => "Kon nie 'n tydelike duimnaellêer skep nie.",
@@ -2991,10 +3045,6 @@ U kan daar \'n wysigingsopsomming byvoeg.',
# Stylesheets
'common.css' => '/** Gemeenskaplike CSS vir alle omslae */',
-'nostalgia.css' => '/* CSS wat hier geplaas word sal slegs die Nostalgie-omslag beïnvloed */',
-
-# Scripts
-'nostalgia.js' => '/* JavaScript wat hier geplaas word sal slegs gebruikers van die Nostalgie-omslag beïnvloed */',
# Metadata
'notacceptable' => "Die wikibediener kan nie data in 'n formaat wat jou kliënt kan lees verskaf nie.",
@@ -3068,8 +3118,6 @@ Hierdie situasie was waarskynlik deur 'n skakel na 'n eksterne webtuiste op ons
'pageinfo-category-files' => 'Aantal lêers',
# Skin names
-'skinname-standard' => 'Standaard',
-'skinname-nostalgia' => 'Nostalgie',
'skinname-cologneblue' => 'Keulen blou',
# Patrolling
@@ -3146,11 +3194,25 @@ $1',
'minutes' => '{{PLURAL:$1|$1 minuut|$1 minute}}',
'hours' => '{{PLURAL:$1|$1 uur|$1 ure}}',
'days' => '{{PLURAL:$1|$1 dag|$1 dae}}',
+'weeks' => '{{PLURAL: $1|één week|$1 weke}}',
'months' => '{{PLURAL:$1|een maand|$1 maande}}',
'years' => '{{PLURAL:$1|een jaar|$1 jaar}}',
'ago' => '$1 gelede',
'just-now' => 'Nou net',
+# Human-readable timestamps
+'hours-ago' => '$1 {{PLURAL:$1|uur}} gelede',
+'minutes-ago' => '$1 {{PLURAL:$1|minuut|minute}} gelede',
+'seconds-ago' => '$1 {{PLURAL:$1|sekonde|sekondes}} gelede',
+'monday-at' => 'Maandag om $1',
+'tuesday-at' => 'Dinsdag om $1',
+'wednesday-at' => 'Woensdag om $1',
+'thursday-at' => 'Donderdag om $1',
+'friday-at' => 'Vrydag om $1',
+'saturday-at' => 'Saterdag om $1',
+'sunday-at' => 'Sondag om $1',
+'yesterday-at' => 'Gister om $1',
+
# Bad image list
'bad_image_list' => "Die formaat is as volg:
@@ -3180,7 +3242,7 @@ Ander velde sal versteek wees.
* gpslongitude
* gpsaltitude",
-# EXIF tags
+# Exif tags
'exif-imagewidth' => 'Breedte',
'exif-imagelength' => 'Hoogte',
'exif-bitspersample' => 'Grepe per komponent',
@@ -3358,7 +3420,7 @@ Ander velde sal versteek wees.
'exif-originalimageheight' => 'Hoogte van beeld voor dit besny is',
'exif-originalimagewidth' => 'Wydte van beeld voor dit besny is',
-# EXIF attributes
+# Exif attributes
'exif-compression-1' => 'Ongekompakteerd',
'exif-compression-2' => 'CCITT Groep 3 1-dimensionale aangepaste "Huffman run length"-kodering',
'exif-compression-3' => 'CCITT Groep 3 fakskodering',
@@ -3752,7 +3814,6 @@ U kan ook die [[Special:EditWatchlist|standaard opdaterigskerm gebruik]].',
'version-other' => 'Ander',
'version-mediahandlers' => 'Mediaverwerkers',
'version-hooks' => 'Hoeke',
-'version-extension-functions' => 'Uitbreidingsfunksies',
'version-parser-extensiontags' => 'Ontleder-uitbreidingsetikette',
'version-parser-function-hooks' => 'Ontleder-funksiehoeke',
'version-hook-name' => 'Hoek naam',
@@ -3761,6 +3822,7 @@ U kan ook die [[Special:EditWatchlist|standaard opdaterigskerm gebruik]].',
'version-license' => 'Lisensie',
'version-poweredby-credits' => "Hierdie wiki word aangedryf deur '''[//www.mediawiki.org/ MediaWiki]''', kopiereg © 2001-$1 $2.",
'version-poweredby-others' => 'andere',
+'version-poweredby-translators' => 'translatewiki.net-vertalers',
'version-credits-summary' => 'Ons erken graag die volgende persone vir hul bydrae aan [[Special:Version|MediaWiki]].',
'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.
@@ -3774,12 +3836,17 @@ Saam met die program moes u \'n [{{SERVER}}{{SCRIPTPATH}}/COPYING kopie van van
'version-entrypoints-header-entrypoint' => 'Ingang',
'version-entrypoints-header-url' => 'URL',
-# Special:FilePath
-'filepath' => 'Lêerpad',
-'filepath-page' => 'Lêer:',
-'filepath-submit' => 'OK',
-'filepath-summary' => "Die spesiale bladsy wys die volledige pad vir 'n lêer.
-Beelde word in hulle volle resolusie gewys. Ander lêertipes word direk met hulle MIME-geskakelde programme geopen.",
+# Special:Redirect
+'redirect' => 'Aanstuur volgens lêer, gebruiker of weergawenommer',
+'redirect-legend' => "Aanstuur na 'n lêer of bladsy",
+'redirect-summary' => "Hierdie spesiale bladsy stuur aan na 'n lêer (as 'n lêernaam verskaf word), 'n bladsy (as 'n weergawe-nommer verskaf word) of 'n gebruikersblad (as 'n gebruiker-ID verskaf word).",
+'redirect-submit' => 'OK',
+'redirect-lookup' => 'Soek volgens:',
+'redirect-value' => 'Waarde:',
+'redirect-user' => 'Gebruiker-ID',
+'redirect-revision' => 'Bladsy-weergawe',
+'redirect-file' => 'Lêernaam',
+'redirect-not-exists' => 'Waarde nie gevind nie',
# Special:FileDuplicateSearch
'fileduplicatesearch' => 'Soek duplikaat lêers',
@@ -3829,12 +3896,16 @@ Beelde word in hulle volle resolusie gewys. Ander lêertipes word direk met hull
'tags' => 'Geldige wysigings-etikette',
'tag-filter' => '[[Special:Tags|Etiketfilter]]:',
'tag-filter-submit' => 'Filter',
+'tag-list-wrapper' => '([[Special:Tags|{{PLURAL:$1|Etiket|Etikette}}]]: $2)',
'tags-title' => 'Etikette',
'tags-intro' => 'Hierdie bladsy bevat die etikette waarmee die sagteware wysigings mee kan merk, en hul betekenis.',
'tags-tag' => 'Etiketnaam',
'tags-display-header' => 'Weergawe in wysigingslyste',
'tags-description-header' => 'Volledige beskrywing van betekenis',
+'tags-active-header' => 'Aktief?',
'tags-hitcount-header' => 'Geëtiketteerde veranderings',
+'tags-active-yes' => 'Ja',
+'tags-active-no' => 'Nee',
'tags-edit' => 'wysig',
'tags-hitcount' => '$1 {{PLURAL:$1|wysiging|wysigings}}',
@@ -3855,6 +3926,7 @@ Beelde word in hulle volle resolusie gewys. Ander lêertipes word direk met hull
'dberr-problems' => 'Jammer! Die webwerf ondervind op die oomblik tegniese probleme.',
'dberr-again' => "Wag 'n paar minute en probeer dan weer.",
'dberr-info' => '(Kan nie die databasisbediener kontak nie: $1)',
+'dberr-info-hidden' => '(Kan nie die databasisbediener kontak nie)',
'dberr-usegoogle' => 'Tot tyd en wyl kan u inligting op Google soek.',
'dberr-outofdate' => 'Let daarop dat hulle indekse van ons inhoud moontlik verouderd mag wees.',
'dberr-cachederror' => "Hierdie is 'n gekaste kopie van die aangevraagde blad, en dit mag moontlik nie op datum wees nie.",
@@ -3870,6 +3942,9 @@ Beelde word in hulle volle resolusie gewys. Ander lêertipes word direk met hull
'htmlform-submit' => 'Dien in',
'htmlform-reset' => 'Maak wysigings ongedaan',
'htmlform-selectorother-other' => 'Ander',
+'htmlform-no' => 'Nee',
+'htmlform-yes' => 'Ja',
+'htmlform-chosen-placeholder' => "Kies 'n opsie",
# SQLite database support
'sqlite-has-fts' => 'Weergawe $1 met ondersteuning vir vol-teks soektogte ("full-text search")',
@@ -3987,4 +4062,17 @@ Anders kan u die eenvoudige vorm hieronder gebruik. U kommentaar sal by die blad
# Image rotation
'rotate-comment' => 'Beeld $1 {{PLURAL:$1|graad|grade}} kloksgewys gedraai',
+# Limit report
+'limitreport-title' => 'Ontleder se prestasie:',
+'limitreport-cputime' => 'Tydsgebruik van SVE',
+'limitreport-cputime-value' => '$1 {{PLURAL:$1|sekonde|sekondes}}',
+'limitreport-walltime' => 'Reëel tydsgebruik',
+'limitreport-walltime-value' => '$1 {{PLURAL:$1|sekonde|sekondes}}',
+'limitreport-ppvisitednodes' => 'Aantal nodes besoek tydens voorverwerking:',
+'limitreport-ppgeneratednodes' => 'Aantal nodes geskep tydens voorverwerking:',
+'limitreport-postexpandincludesize' => 'Inklusiegrootte na uitbreiding',
+'limitreport-postexpandincludesize-value' => '$1/$2 {{PLURAL:$2|greep|grepe}}',
+'limitreport-templateargumentsize-value' => '$1/$2 {{PLURAL:$2|greep|grepe}}',
+'limitreport-expansiondepth' => 'Hoogste uitbreidingsdiepte',
+
);
diff --git a/languages/messages/MessagesAln.php b/languages/messages/MessagesAln.php
index d34721f4..c5c19e2d 100644
--- a/languages/messages/MessagesAln.php
+++ b/languages/messages/MessagesAln.php
@@ -97,9 +97,6 @@ $messages = array(
'tog-shownumberswatching' => 'Shfaqe numrin e përdoruesve mbikëqyrës',
'tog-oldsig' => 'Parapamja e nënshkrimit ekzistues:',
'tog-fancysig' => 'Trajto nënshkrimin si tekst (pa vegëz automatike)',
-'tog-externaleditor' => 'Përdor program të jashtëm për redaktim (vetëm për eksperta, lyp përcaktime speciale në kompjuterin tuej)',
-'tog-externaldiff' => 'Përdor program të jashtëm për dallime (vetëm për eksperta, lyp përcaktime speciale në kompjuterin tuej)',
-'tog-showjumplinks' => 'Lejo lidhjet é afrueshmerisë "kapërce tek"',
'tog-uselivepreview' => 'Trego parapamjén meniheré (JavaScript) (Eksperimentale)',
'tog-forceeditsummary' => 'Pyetem kur e le përmbledhjen e redaktimit zbrazt',
'tog-watchlisthideown' => "M'sheh redaktimet e mia nga lista mbikqyrëse",
@@ -113,6 +110,7 @@ $messages = array(
'tog-showhiddencats' => 'Trego kategoritë e mshefta',
'tog-noconvertlink' => 'Mos lejo konvertimin e titullit vegëz',
'tog-norollbackdiff' => 'Trego ndryshimin mbas procedurës së kthimit mbrapa',
+'tog-useeditwarning' => 'Paralajmëron mua kur unë të lë një redakto faqe me ndryshimet e para shpëtimit',
'underline-always' => 'gjithmonë',
'underline-never' => 'kurrë',
@@ -292,7 +290,7 @@ Ju lutem pritni pak para se me tentue me iu qasë faqes prap.
$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).
+# 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).
'aboutsite' => 'Rreth {{SITENAME}}',
'aboutpage' => 'Project:Rreth',
'copyright' => 'Përmbajtja mundësohet simbas $1.',
@@ -302,7 +300,6 @@ $1',
'disclaimers' => 'Shfajsime',
'disclaimerpage' => 'Project:Shfajsimet e përgjithshme',
'edithelp' => 'Ndihmë për redaktim',
-'edithelppage' => 'Help:Redaktimi',
'helppage' => 'Help:Përmbajtja',
'mainpage' => 'Faqja kryesore',
'mainpage-description' => 'Faqja Kryesore',
@@ -374,17 +371,6 @@ Lista e faqeve speciale valide gjindet te [[Special:SpecialPages|{{int:specialpa
# General errors
'error' => 'Gabim',
'databaseerror' => 'Gabim në databazë',
-'dberrortext' => 'Ka ndodh nji gabim sintaksor në kërkesën në databazë.
-Kjo mundet me tregue gabim në software.
-Kërkesa e fundit në databazë ishte:
-<blockquote><tt>$1</tt></blockquote>
-mbrenda funksionit "<tt>$2</tt>".
-Databaza ktheu gabimin "<tt>$3: $4</tt>".',
-'dberrortextcl' => 'Ka ndodh nji gabim sintaksor në kërkesën në databazë.
-Kërkesa e fundit në databazë ishte:
-"$1"
-mbrenda funksionit "$2".
-Databaza ktheu gabimin "$3: $4".',
'laggedslavemode' => "'''Kujdes:''' Kjo faqe mundet mos me përmbajtë ndryshime të reja.",
'readonly' => 'Databaza âsht e bllokueme',
'enterlockreason' => 'Futni një arsye për bllokimin, gjithashtu futni edhe kohën se kur pritet të çbllokohet',
@@ -434,7 +420,6 @@ Ju lutemi provoni prap mbas disa minutave.',
'editinginterface' => "'''Kujdes:''' Po redaktoni nji faqe që përdoret për me ofrue tekst të interfaceit të softwareit.
Ndryshimet në këtë faqe do të prekin pamjen e interfaceit për të gjithë përdoruesit tjerë.
Për përkthim, konsideroni ju lutem përdorimin e [//translatewiki.net/wiki/Main_Page?setlang=en translatewiki.net], projektin e MediaWiki për përshtatje gjuhësore.",
-'sqlhidden' => '(Kërkesa SQL e msheftë)',
'cascadeprotected' => 'Kjo faqe âsht e mbrojtun prej redaktimit, për shkak se âsht e përfshime në {{PLURAL:$1|faqen, e cila âsht e mbrojtun|faqet, të cilat janë të mbrojtuna}} me opcionin "zinxhir" të zgjedhun:
$2',
'namespaceprotected' => "Nuk keni tagër me redaktue faqe në hapësinën '''$1'''.",
@@ -554,7 +539,7 @@ Për me krye kyçjen, specifikoni fjalëkalimin e ri këtu:',
'newpassword' => 'Fajlëkalimi i ri:',
'retypenew' => 'Fjalëkalimi i ri përsëdyti',
'resetpass_submit' => 'Vendos fjalëkalimin dhe kyçu',
-'resetpass_success' => 'Fjalëkalimi juej u ndryshue me sukses! Tash po kyçeni...',
+'changepassword-success' => 'Fjalëkalimi juej u ndryshue me sukses! Tash po kyçeni...',
'resetpass_forbidden' => 'Fjalëkalimet nuk mujnë me u ndryshue',
'resetpass-no-info' => 'Duheni me qenë të kyçun për me iu qasë kësaj faqeje direkt.',
'resetpass-submit-loggedin' => 'Ndrysho fjalëkalimin',
@@ -750,6 +735,7 @@ Duket se është grisur.',
'edit-no-change' => 'Redaktimi juaj është anashkaluar pasi që asnjë ndryshim nuk u bë në tekst.',
'edit-already-exists' => 'Faqja nuk mundej të hapet.
Ajo tanimë ekziston.',
+'editwarning-warning' => 'Duke e lënë këtë faqe mund të bëjë që ju të humbni ndonjë ndryshim që keni bërë. Nëse ju jeni regjistruar, ju mund ta çaktivizoni këtë paralajmërim në "Tue redaktue" seksionin e preferencave tuaja.',
# Parser/template warnings
'expensive-parserfunction-warning' => 'Kujdes: Kjo faqe ka shumë kërkesa që kërkojnë analizë gramatikore të kushtueshme për sistemin.
@@ -903,7 +889,6 @@ Kini kujdes se përdorimi i lidhjeve të shfletimit do të ndryshojë përzgjedh
'searchmenu-legend' => 'Opcionet e kërkimit',
'searchmenu-exists' => "'''Në këtë wiki âsht nji faqe me titullin \"[[:\$1]]\"'''",
'searchmenu-new' => "'''Krijo faqen \"[[:\$1]]\" në këtë wiki!'''",
-'searchhelp-url' => 'Help:Përmbajtja',
'searchmenu-prefix' => '[[Special:PrefixIndex/$1|Shfleto faqet me këtë prefiks]]',
'searchprofile-articles' => 'Faqet me përmbajtje',
'searchprofile-project' => 'Faqet e ndihmës dhe projekteve',
@@ -947,14 +932,6 @@ Provoni me ia parashtue kërkesës tuej ''tâna:'' që me lypë tânë përmbajt
Ndërkohë mundeni me lypë me Google.
Vini re se indeksat e tyne të përmbajtjes së {{SITENAME}} munden me qenë të vjetëruem.',
-# Quickbar
-'qbsettings' => 'Vegla të shpejta',
-'qbsettings-none' => 'Asnji',
-'qbsettings-fixedleft' => 'Lidhun majtas',
-'qbsettings-fixedright' => 'Lidhun djathtas',
-'qbsettings-floatingleft' => 'Pezull majtas',
-'qbsettings-floatingright' => 'Pezull djathtas',
-
# Preferences page
'preferences' => 'Parapëlqimet',
'mypreferences' => 'Parapëlqimet e mija',
@@ -983,7 +960,6 @@ Vini re se indeksat e tyne të përmbajtjes së {{SITENAME}} munden me qenë të
'resetprefs' => 'Fshij ndryshimet e paruejtuna',
'restoreprefs' => 'Kthe tâna përcaktimet si në fillim',
'prefs-editing' => 'Tue redaktue',
-'prefs-edit-boxsize' => 'Madhësia e dritares redaktuese.',
'rows' => 'Rreshta:',
'columns' => 'Kolona:',
'searchresultshead' => 'Kërkimi',
@@ -1503,27 +1479,16 @@ Lejon dhânien e arsyes në përmbledhje.',
# Stylesheets
'common.css' => '/* CSSi i vendosun këtu ka me u zbatue në tâna dukjet */',
-'standard.css' => '/* CSSi i vendosun këtu ka me i prekë përdoruesit e dukjes standarde */',
-'nostalgia.css' => '/* CSS i vendosun këtu ka me i prekë shfrytëzuesit e dukjes Nostalgia */',
'cologneblue.css' => '/* CSS i vendosun këtu ka me i prekë shfrytëzuesit e dukjes Cologne Blue */',
'monobook.css' => '/* CSS i vednosun këtu ka me i prekë shfrytëzuesit e dukjes Monobook */',
-'myskin.css' => '/* CSSi i vednosun këtu ka me i prekë shfrytëzuesit e dukjes MySkin */',
-'chick.css' => '/* CSSi i vednosun këtu ka me i prekë shfrytëzuesit e dukjes Chick */',
-'simple.css' => '/* CSSi i vednosun këtu ka me i prekë shfrytëzuesit e dukjes Simple */',
'modern.css' => '/* CSSi i vednosun këtu ka me i prekë shfrytëzuesit e dukjes Modern */',
'vector.css' => '/* CSSi i vednosun këtu ka me i prekë shfrytëzuesit e dukjes Vector */',
'print.css' => '/* CSSi i vednosun këtu ka me e prekë pamjen e shtypjes */',
-'handheld.css' => '/* CSSi i vednosun këtu ka me i prekë shfletuesit mobil (të dorës) në dukje e konfigurueme në $wgHandheldStyle */',
# Scripts
'common.js' => '/* Çdo JavaScript këtu ka me u ngarkue për të gjithë përdoruesit në secilën thirrje të faqes. */',
-'standard.js' => '/* Çdo JavaScript këtu ka me u ngarkue për shfrytëzuesit që përdorin dukjen Standard */',
-'nostalgia.js' => '/* Çdo JavaScript këtu ka me u ngarkue për shfrytëzuesit që përdorin dukjen Nostalgia */',
'cologneblue.js' => '/* Çdo JavaScript këtu ka me u ngarkue për shfrytëzuesit që përdorin dukjen Cologne Blue */',
'monobook.js' => '/* Çdo JavaScript këtu ka me u ngarkue për shfrytëzuesit që përdorin dukjen MonoBook */',
-'myskin.js' => '/* Çdo JavaScript këtu ka me u ngarkue për shfrytëzuesit që përdorin dukjen MySkin */',
-'chick.js' => '/* Çdo JavaScript këtu ka me u ngarkue për shfrytëzuesit që përdorin dukjen Chick */',
-'simple.js' => '/* Çdo JavaScript këtu ka me u ngarkue për shfrytëzuesit që përdorin dukjen Simple */',
'modern.js' => '/* Çdo JavaScript këtu ka me u ngarkue për shfrytëzuesit që përdorin dukjen Modern */',
'vector.js' => '/* Çdo JavaScript këtu ka me u ngarkue për shfrytëzuesit që përdorin dukjen Vector */',
diff --git a/languages/messages/MessagesAm.php b/languages/messages/MessagesAm.php
index b4336586..da80c4f1 100644
--- a/languages/messages/MessagesAm.php
+++ b/languages/messages/MessagesAm.php
@@ -77,9 +77,6 @@ $messages = array(
'tog-shownumberswatching' => 'የሚከታተሉ ተጠቃሚዎችን á‰áŒ¥áˆ­ አሳይ',
'tog-oldsig' => 'የቀድሞዠáŠáˆ­áˆ› ቅደመ እይታ',
'tog-fancysig' => 'ጥሬ áŠáˆ­áˆ› (ያለራስገዠማያያዣ)',
-'tog-externaleditor' => 'በቀዳሚáŠá‰µ á‹áŒªá‹«á‹Š አራሚን ተጠቀáˆ',
-'tog-externaldiff' => 'በቀዳሚáŠá‰µ የá‹áŒ­ áˆá‹©áŠá‰µ-ማሳያን ተጠቀáˆ',
-'tog-showjumplinks' => 'የ«á‹áˆˆáˆÂ» አቅላይ መያያዣዎችን አስችáˆ',
'tog-uselivepreview' => 'ቀጥታ ቅድመ-ዕይታን ይጠቀሙ (JavaScript ያስáˆáˆáŒ‹áˆ) (የሙከራ)',
'tog-forceeditsummary' => 'ማጠቃለያዠባዶ ከሆአማስታወሻ ይስጠáŠ',
'tog-watchlisthideown' => 'የራስዎ ለá‹áŒ¦á‰½ ከሚከታተሉት ገጾች ይደበá‰',
@@ -91,6 +88,7 @@ $messages = array(
'tog-diffonly' => 'ከለá‹áŒ¦á‰¹ ስር የገጽ ይዞታ አታሳይ',
'tog-showhiddencats' => 'የተደበበመደቦች ይታዩ',
'tog-norollbackdiff' => 'ROLLBACK ከማድረጠበኋላ áˆá‹©áŠá‰± ማሳየት ይቅር',
+'tog-useeditwarning' => 'እርማቶችን ሳáˆá‰†áŒ¥á‰¥ የእርማት ገጽ áˆá‹˜áŒ‹ ስሠአስጠንቅቀáŠ',
'underline-always' => 'áˆáˆŒáˆ ይህን',
'underline-never' => 'áˆáˆŒáˆ አይáˆáŠ•',
@@ -267,7 +265,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).
+# 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).
'aboutsite' => 'ስለ {{SITENAME}}',
'aboutpage' => 'Project:ስለ',
'copyright' => 'ይዘቱ በ$1 ሥር ይገኛáˆá¢',
@@ -277,7 +275,6 @@ $1',
'disclaimers' => 'የኃላáŠáŠá‰µ ማስታወቂያ',
'disclaimerpage' => 'Project:አጠቃላይ የሕጠáŠáŒ¥á‰¦á‰½',
'edithelp' => 'የማረሠመመሪያ',
-'edithelppage' => 'Help:የማዘጋጀት እርዳታ',
'helppage' => 'Help:ይዞታ',
'mainpage' => 'ዋናዠገጽ',
'mainpage-description' => 'ዋና ገጽ',
@@ -350,8 +347,6 @@ $1',
# General errors
'error' => 'ስኅተት',
'databaseerror' => 'የመረጃ-ቤት ስህተት',
-'dberrortext' => 'የመረጃ-ቤት ጥያቄ ስዋሰዠስህተት ሆኗáˆá¢ ይህ áˆáŠ“áˆá‰£á‰µ በሶáትዌሩ ወስጥ ያለ ተá‹áˆ³áŠ­ ሊጠቆሠይችላáˆá¢ መጨረሻ የተሞከረዠመረጃ-ቤት ጥያቄ <blockquote><tt>$1</tt></blockquote> ከተáŒá‰£áˆ© «<tt>$2</tt>» á‹áˆµáŒ¥ áŠá‰ áˆ¨á¢ MySQL ስህተት «<tt>$3: $4</tt>» መለሰá¢',
-'dberrortextcl' => 'የመረጃ-ቤት ጥያቄ ስዋሰዠስህተት ሆኗáˆá¢ መጨረሻ የተሞከረዠመረጃ-ቤት ጥያቄ <blockquote><tt>$1</tt></blockquote> ከተáŒá‰£áˆ© «<tt>$2</tt>» á‹áˆµáŒ¥ áŠá‰ áˆ¨á¢ MySQL ስህተት «<tt>$3: $4</tt>» መለሰá¢',
'laggedslavemode' => 'ማስጠንቀቂያᦠáˆáŠ“áˆá‰£á‰µ የቅርብ ለá‹áŒ¦á‰½ በገጹ ላይ አይታዩáˆá¢',
'readonly' => 'መረጃ-ቤት ተቆáˆááˆ',
'enterlockreason' => 'የመቆለá‰áŠ• áˆáŠ­áŠ•á‹«á‰µáŠ“ የሚያáˆá‰…በትን ሰዓት (በáŒáˆá‰µ) ይጻá‰á¢',
@@ -393,7 +388,6 @@ $1',
'viewsourcetext' => 'የዚህን ገጽ áˆáŠ•áŒ­ ማየትና መቅዳት ይችላሉá¢',
'protectedinterface' => 'ይህ ገጽ ለስáˆá‰± ገጽታ ጽሑáን ያቀርባáˆá£á¡ ስለዚህ እንዳይበላሽ ተጠብቋáˆá¢',
'editinginterface' => "'''ማስጠንቀቂያá¦''' ይህ ገጽ ለድረገጹ መáˆáŠ­ ጽሕáˆá‰µ ይሰጣáˆá¢ በዊኪ áˆáˆ‰ ላይ መላá‹áŠ• የድረገጽ መáˆáŠ­ በቀላሠለማስተርጎሠ[//translatewiki.net/wiki/Main_Page?setlang=am translatewiki.net] ይጎብኙá¢",
-'sqlhidden' => '(የመደበኛ-የመጠይቅ-ቋንቋ (SQL) ጥያቄ ተደበቀ)',
'cascadeprotected' => "'''ማስጠንቀቂያá¦''' ይህ አርእስት ሊáˆáŒ áˆ­ ወይሠሊቀየር አይቻáˆáˆá¢ áˆáŠ­áŠ•á‹«á‰±áˆ ወደ {{PLURAL:$1|ተከታተለዠአርዕስት|ተከታተሉት አርእስቶች}} ተጨáˆáˆ¯áˆá¢
$2",
'namespaceprotected' => "በ'''$1''' ክáለ-ዊኪ ያሉትን ገጾች ለማዘጋጀት áˆá‰ƒá‹µ የለዎáˆá¢",
@@ -412,8 +406,14 @@ $2",
በጥቂት ሴኮንድ á‹áˆµáŒ¥ ወደሚከተለዠገጽ በቀጥታ ይመለሳáˆá¦",
'welcomeuser' => 'ሰላáˆá‰³ $1! እንኳን ደህናመጡá¢',
'yourname' => 'Username / የብዕር ስáˆ:',
+'userlogin-yourname' => 'የብዕር ስáˆ',
+'userlogin-yourname-ph' => 'የብዕር ስሠያስገቡ',
+'createacct-another-username-ph' => 'የብዕር ስሠያስገቡ',
'yourpassword' => 'Password / መáŒá‰¢á‹« ቃáˆ',
+'userlogin-yourpassword-ph' => 'የመáŒá‰¢á‹« ቃሠያስገቡ',
'yourpasswordagain' => 'መáŒá‰¢á‹« ቃáˆá‹ŽáŠ• ዳáŒáˆ˜áŠ› ይስጡ',
+'createacct-yourpasswordagain' => 'የመáŒá‰¢á‹« ቃሉን ይድገሙ',
+'createacct-yourpasswordagain-ph' => 'የመáŒá‰¢á‹« ቃሉን ይድገሙ',
'remembermypassword' => 'ለሚቀጥለዠጊዜ በዚ ኮáˆá’á‹á‰°áˆ­ ላይ በአባáˆáŠá‰µ ስሜ መáŒá‰£á‰´áŠ• ( ቢባዛ ለ $1 {{PLURAL:$1|ቀን|ቀናት}}) አስታá‹áˆµá¢',
'yourdomainname' => 'የእርስዎ ከባቢ (domain)á¦',
'password-change-forbidden' => 'በዚሠዊኪ መáŒá‰¢á‹« ቃáˆáŠ• መቀይር አáˆá‰°áˆá‰€á‹°áˆá¢',
@@ -432,11 +432,23 @@ $2",
'gotaccount' => "(አባáˆáŠá‰µ አáˆáŠ• ካለዎᥠ'''$1''' á‹­áŒá‰¡)",
'gotaccountlink' => 'በዚህ',
'userlogin-resetlink' => 'የመáŒá‰¢á‹« á‹áˆ­á‹áˆ­á‹ŽáŠ• ረተዋáˆáŠ•?',
+'createacct-join' => 'ከዚህ በታች ይመá‹áŒˆá‰¡á¢',
+'createacct-emailrequired' => 'ኢ-ሜይሠአድራሻ',
+'createacct-email-ph' => 'ኢ-ሜይሠአድራሻዎን ያስገቡ',
'createaccountmail' => 'በኢ-ሜáˆ',
'createaccountreason' => 'áˆáŠ­áŠ•á‹«á‰µ:',
+'createacct-reason' => 'áˆáŠ­áŠ•á‹«á‰µ',
+'createacct-reason-ph' => 'ለáˆáŠ• ሌላ የብዕር ስሠሊያወጡ እንደሆáŠ',
+'createacct-imgcaptcha-ph' => 'ከላይ የሚታየá‹áŠ• ጽáˆá ያስገቡ',
+'createacct-submit' => 'የብዕር ስሠለማá‹áŒ£á‰µ',
+'createacct-another-submit' => 'ሌላ የብዕር ስሠለማá‹áŒ£á‰µ',
+'createacct-benefit-heading' => '{{SITENAME}} እንደ እርስዎ ባሉ ሰዎች áŠá‹ የሚጻáˆá‹á¢',
+'createacct-benefit-body1' => '{{PLURAL:$1|እርማት|እርማቶችS}}',
+'createacct-benefit-body2' => '{{PLURAL:$1|ገጽ|ገጾችS}}',
'badretype' => 'የጻá‰á‰µ መáŒá‰¢á‹« ቃሎች አይስማሙáˆá¢',
'userexists' => 'ይህ ብዕር ስሠተይዟáˆá¢ እባክዎᣠሌላ ብዕር ስሠይáˆáˆ¨áŒ¡á¢',
'loginerror' => 'የመáŒá‰£á‰µ ስኅተት',
+'createacct-error' => 'የብዕር ስሠመáጠር ስህተት',
'createaccounterror' => 'ይህን አባáˆáŠá‰µ ለመáጠር አáˆá‰°á‰»áˆˆáˆá¦ $1',
'nocookiesnew' => 'ብዕር ስሠተáˆáŒ áˆ¨á£ እርስዎ áŒáŠ• ገና አáˆáŒˆá‰¡áˆá¢ በ{{SITENAME}} ተጠቃሚዎች ለመáŒá‰£á‰µ የቃኚ-ማስታወሻ (cookie) ይጠቀማáˆá¢ በርስዎ ኮáˆá’á‹á‰°áˆ­ áŒáŠ• የቃኚ-ማስታወሻ እንዳይሠራ ተደርጓáˆá¢ እባክዎ እንዲሠራ ያድርጉና በአዲስ ብዕር ስáˆáŠ“ መáŒá‰¢á‹« ቃáˆá‹Ž á‹­áŒá‰¡á¢á¢',
'nocookieslogin' => 'በ{{SITENAME}} ተጠቃሚዎች ለመáŒá‰£á‰µ የቃኚ-ማስታወሻ (cookie) ይጠቀማáˆá¢ በርስዎ ኮáˆá’á‹á‰°áˆ­ áŒáŠ• የቃኚ-ማስታወሻ እንዳይሠራ ተደርጓáˆá¢ እባክዎ እንዲሠራ ያድርጉና እንደገና ይሞክሩá¢',
@@ -495,7 +507,7 @@ $2",
'newpassword' => 'አዲስ መáŒá‰¢á‹« ቃáˆ',
'retypenew' => 'አዲስ መáŒá‰¢á‹« ቃሠዳáŒáˆ˜áŠ›',
'resetpass_submit' => 'መáŒá‰¢á‹« ቃሠለመቀየርና ለመáŒá‰£á‰µ',
-'resetpass_success' => 'የመáŒá‰¢á‹« ቃáˆá‹Ž መቀየሩ ተከናወáŠ! አáˆáŠ• መáŒá‰£á‰µ ይደረáŒáˆá‹Žá‰³áˆ......',
+'changepassword-success' => 'የመáŒá‰¢á‹« ቃáˆá‹Ž መቀየሩ ተከናወáŠ! አáˆáŠ• መáŒá‰£á‰µ ይደረáŒáˆá‹Žá‰³áˆ......',
'resetpass_forbidden' => 'በ{{SITENAME}} የመáŒá‰¢á‹« ቃሠመቀየር አይቻáˆáˆá¢',
'resetpass-no-info' => 'ይህንን ገጽ በቀጥታ ለማáŒáŠ˜á‰µ አስቀድሞ መáŒá‰£á‰µ ያስáˆáˆáŒ‹áˆá¢',
'resetpass-submit-loggedin' => 'ቃáˆá‹Ž ይቀየር',
@@ -810,7 +822,6 @@ $1ን ወይሠማንሠሌላ [[{{MediaWiki:Grouppage-sysop}}|መጋቢ]] ስ
'searchmenu-legend' => 'የáለጋ áˆáˆ­áŒ«á‹Žá‰½',
'searchmenu-exists' => "'''\"[[:\$1]]\" የሚባሠመጣጥá በዚሠዊኪ ላይ አለá¢'''",
'searchmenu-new' => "'''\"[[:\$1]]\" የሚባሠመጣጥá á‹­áˆáŒ áˆ­?'''",
-'searchhelp-url' => 'Help:ይዞታ',
'searchprofile-articles' => 'ይዞታ ያላቸዠመጣጥáŽá‰½',
'searchprofile-project' => 'የዕርዳታ እና የመርሃáŒá‰¥áˆ© ገጾች',
'searchprofile-images' => 'á‹á‹­áˆŽá‰½',
@@ -849,13 +860,6 @@ $1ን ወይሠማንሠሌላ [[{{MediaWiki:Grouppage-sysop}}|መጋቢ]] ስ
'search-external' => 'አáአዊ áለጋ',
'searchdisabled' => '{{SITENAME}} áለጋ አáˆáŠ• እንዳይሠራ ተደርጓáˆá¢ ለጊዜዠáŒáŠ• በGoogle ላይ መáˆáˆáŒ ይችላሉᢠየ{{SITENAME}} ይዞታ ማá‹áŒ« በዚያ እንዳáˆá‰³á‹°áˆ° ማቻሉ ያስታá‹áˆ±á¢',
-# Quickbar
-'qbsettings-none' => ' áˆáŠ•áˆ',
-'qbsettings-fixedleft' => 'በáŒáˆ« የተለጠáˆ',
-'qbsettings-fixedright' => 'በቀአየተለጠáˆ',
-'qbsettings-floatingleft' => 'በáŒáˆ« ተንሳá‹áŠ',
-'qbsettings-floatingright' => 'በቀአተንሳá‹áŠ',
-
# Preferences page
'preferences' => 'áˆáˆ­áŒ«á‹Žá‰½á¤',
'mypreferences' => 'áˆáˆ­áŒ«á‹Žá‰½á¤',
@@ -883,7 +887,6 @@ $1ን ወይሠማንሠሌላ [[{{MediaWiki:Grouppage-sysop}}|መጋቢ]] ስ
'saveprefs' => 'ይቆጠብ',
'resetprefs' => 'እንደ በáŠá‰± ይታደስ',
'prefs-editing' => 'የማዘጋጀት áˆáˆ­áŒ«á‹Žá‰½',
-'prefs-edit-boxsize' => 'ይህ የማዘጋጀት ሳጥን ስá‹á‰µ ለመወሰን áŠá‹á¢',
'rows' => 'በማዘጋጀቱ ሰንጠረዥ ስንት ተርታዎች?',
'columns' => 'ስንት á‹“áˆá‹¶á‰½áˆµ?',
'searchresultshead' => 'áለጋ',
@@ -917,7 +920,6 @@ $1ን ወይሠማንሠሌላ [[{{MediaWiki:Grouppage-sysop}}|መጋቢ]] ስ
'prefs-custom-css' => 'áˆá‹© CSS',
'prefs-custom-js' => 'áˆá‹© ጃቫ ስክሪá•á‰µ',
'prefs-emailconfirm-label' => 'የኢ-ሜሠማረጋገጫ',
-'prefs-textboxsize' => 'የማዘጋጀት መስኮት መጠን',
'youremail' => 'ኢ-ሜሠ*',
'username' => 'የብዕር ስáˆ:',
'uid' => 'የገባበት á‰.: #',
@@ -1099,7 +1101,6 @@ $1ን ወይሠማንሠሌላ [[{{MediaWiki:Grouppage-sysop}}|መጋቢ]] ስ
'recentchangeslinked-feed' => 'የተዛመዱ ለá‹áŒ¦á‰½',
'recentchangeslinked-toolbox' => 'የተዛመዱ ለá‹áŒ¦á‰½',
'recentchangeslinked-title' => 'በ«$1» በተዛመዱ ገጾች ቅርብ ለá‹áŒ¦á‰½',
-'recentchangeslinked-noresult' => 'በተመለከተዠጊዜ á‹áˆµáŒ¥ ከዚህ በተያየዙት ገጾች ላይ áˆáŠ•áˆ ለá‹áŒ¥ አáˆáŠá‰ áˆ¨áˆá¢',
'recentchangeslinked-summary' => "ከዚሠገጽ የተያየዙት ሌሎች ጽሑáŽá‰½ ቅርብ ለá‹áŒ¦á‰½ ከታች ይዘረá‹áˆ«áˆ‰á¢
በሚከታተሉት ገጾች መካከሠያሉት áˆáˆ‰ በ'''ጉáˆáˆ… áŠá‹°áˆ‹á‰µ''' ይታያሉá¢",
@@ -1336,11 +1337,6 @@ $1',
'statistics-users-active-desc' => 'ባለáˆá‹ {{PLURAL:$1|ቀን|$1 ቀን}} ማንኛá‹áŠ•áˆ ድርጊት የሠሩት ተጠቃሚዎች',
'statistics-mostpopular' => 'ከáˆáˆ‰ የታዩት ገጾች',
-'disambiguations' => 'ወደ መንታ መንገድ የሚያያይá‹',
-'disambiguationspage' => 'Template:መንታ',
-'disambiguations-text' => "የሚከተሉት ጽሑáŽá‰½ ወደ '''መንታ መንገድ''' እየተያያዙ áŠá‹áŠ“ ብዙ ጊዜ እንዲህ ሳይሆን ወደሚገባዠርዕስ ቢወስዱ ይሻላáˆá¢ <br />
-መንታ መንገድ ማለት የመንታ መለጠáŠá‹« ([[MediaWiki:Disambiguationspage]]) ሲኖርበት áŠá‹á¢",
-
'doubleredirects' => 'ድርብ መáˆáˆªá‹« መንገዶች',
'doubleredirectstext' => 'ይህ ድርብ መáˆáˆªá‹« መንገዶች ይዘርዘራáˆá¢
@@ -1542,10 +1538,9 @@ Also see [[Special:WantedCategories|wanted categories]].',
'unwatchthispage' => 'መከታተሠይቅር',
'notanarticle' => 'መጣጥá አይደለáˆ',
'notvisiblerev' => 'ዕትሙ ጠáቷáˆ',
-'watchnochange' => 'ከተካከሉት ገጾች አንዳችሠበተወሰáŠá‹ ጊዜ á‹áˆµáŒ¥ አáˆá‰°áˆˆá‹ˆáŒ áˆá¢',
'watchlist-details' => 'አáˆáŠ• {{PLURAL:$1|$1 ገá…|$1 ገá†á‰½}} በáˆá‰µáŠ¨á‰³á‰°áˆ‹á‰¸á‹ ገá†á‰½ ላይ አሉ (የá‹á‹­á‹­á‰µ áŒˆá… áˆ³á‹­áŒ¨áˆ˜áˆ­)á¢',
-'wlheader-enotif' => '* የ-ኢሜሠማስታወቂያ እንዲሠራ ተደርጓáˆá¢',
-'wlheader-showupdated' => "* መጨረሻ ከጎበኟቸዠጀáˆáˆ® የተቀየሩት ገጾች በ'''ጉáˆáˆ… áŠá‹°áˆ‹á‰µ''' ይታያሉ",
+'wlheader-enotif' => 'የ-ኢሜሠማስታወቂያ እንዲሠራ ተደርጓáˆá¢',
+'wlheader-showupdated' => "መጨረሻ ከጎበኟቸዠጀáˆáˆ® የተቀየሩት ገጾች በ'''ጉáˆáˆ… áŠá‹°áˆ‹á‰µ''' ይታያሉ",
'watchmethod-recent' => 'የቅርብ ለá‹áŒ¦á‰½áŠ• ለሚከታተሉት ገጾች በመáˆáˆˆáŒ',
'watchmethod-list' => 'የሚከታተሉትን ገጾች ለቅርብ ለá‹áŒ¦á‰½ በመáˆáˆˆáŒ',
'watchlistcontains' => 'አáˆáŠ• በሙሉ $1 ገጾች እየተከታተሉ áŠá‹á¢',
@@ -1853,9 +1848,6 @@ $1',
'ipb_expiry_invalid' => 'የሚያáˆá‰…በት áŒá‹œ አይሆንáˆá¢',
'ipb_already_blocked' => '«$1» ገና ከዚህ በáŠá‰µ ታáŒá‹¶ áŠá‹á¢',
'ipb-needreblock' => '$1 አáˆáŠ• ገና ታáŒá‹·áˆá¢ á‹áˆ­á‹áˆ©áŠ• ማስተካከሠáˆáˆˆáŒ‰?',
-'blockme' => 'áˆá‰³áŒˆá‹µ',
-'proxyblocker-disabled' => 'ይህ ተáŒá‰£áˆ­ እንደማይሠራ ተደርጓáˆá¢',
-'proxyblocksuccess' => 'ተደርጓáˆá¢',
'cant-block-while-blocked' => 'እርስዎ እየታገዱ ሌላ ተጠቃሚ ለማገድ አይችሉáˆá¢',
# Developer tools
@@ -2160,7 +2152,7 @@ $1',
* gpslongitude
* gpsaltitude",
-# EXIF tags
+# Exif tags
'exif-imagewidth' => 'ስá‹á‰µ',
'exif-imagelength' => 'á‰áˆ˜á‰µ',
'exif-compression' => 'የመጨመቅ ዘዴ',
@@ -2267,7 +2259,7 @@ $1',
'exif-cameraownername' => 'ባለ ካሜራ',
'exif-personinimage' => 'የታየዠሰá‹',
-# EXIF attributes
+# Exif attributes
'exif-compression-1' => 'á‹«áˆá‰°áŒ¨áˆ˜á‰€',
'exif-unknowndate' => 'á‹«áˆá‰³á‹ˆá‰€ ቀን',
@@ -2524,7 +2516,6 @@ $3
'version-variables' => 'ተለዋጮች',
'version-other' => 'ሌላ',
'version-hooks' => 'ሜንጦዎች',
-'version-extension-functions' => 'የቅጥያ ሥራዎች',
'version-parser-extensiontags' => 'የá‹áˆ­á‹›áˆª ቅጥያ áˆáˆáŠ­á‰¶á‰½',
'version-parser-function-hooks' => 'የዘርዛሪ ተáŒá‰£áˆ­ ሜጦዎች',
'version-hook-name' => 'የሜንጦ ስáˆ',
@@ -2535,13 +2526,6 @@ $3
'version-software-product' => 'ሶáትዌር',
'version-software-version' => 'á‹áˆ­á‹«',
-# Special:FilePath
-'filepath' => 'የá‹á‹­áˆ መንገድ',
-'filepath-page' => 'á‹á‹­áˆ‰á¦',
-'filepath-submit' => 'መንገድ',
-'filepath-summary' => 'ይህ áˆá‹© ገጽ ለ1 á‹á‹­áˆ ሙሉ መንገድ ይሰጣáˆá¢<br />
-ስዕሠበሙሉ ማጉላት ይታያáˆá¤ ሌላ አይáŠá‰µ á‹á‹­áˆ በሚገባዠá•áˆ®áŒáˆ«áˆ በቀጥታ ይጀመራáˆá¢',
-
# Special:FileDuplicateSearch
'fileduplicatesearch' => 'ለቅጂ á‹á‹­áˆŽá‰½ መáˆáˆáŒ',
'fileduplicatesearch-legend' => 'ለቅጂ ለመáˆáˆáŒ',
diff --git a/languages/messages/MessagesAn.php b/languages/messages/MessagesAn.php
index f0ed12aa..c180c9fa 100644
--- a/languages/messages/MessagesAn.php
+++ b/languages/messages/MessagesAn.php
@@ -161,9 +161,6 @@ $messages = array(
'tog-shownumberswatching' => "Amostrar o numero d'usuarios que cosiran un articlo",
'tog-oldsig' => 'Sinyadura actual',
'tog-fancysig' => 'Tratar as sinyaduras como wikitexto (sin de vinclo automatico)',
-'tog-externaleditor' => "Fer servir l'editor externo por defecto (nomás ta espiertos, cal que faiga achustes especials en o suyo ordenador. [//www.mediawiki.org/wiki/Manual:External_editors Mas información.])",
-'tog-externaldiff' => 'Fer servir o visualizador de diferencias externo por defecto (nomás ta expertos, cal que faiga achustes especials en o suyo ordenador. [//www.mediawiki.org/wiki/Manual:External_editors Mas información.])',
-'tog-showjumplinks' => 'Activar vinclos d\'accesibilidat "blincar enta"',
'tog-uselivepreview' => 'Activar previsualización automatica (cal JavaScript) (Esperimental)',
'tog-forceeditsummary' => 'Avisar-me quan o campo de resumen siga buedo.',
'tog-watchlisthideown' => 'Amagar as mías edicions en a lista de seguimiento',
@@ -177,6 +174,7 @@ $messages = array(
'tog-showhiddencats' => 'Amostrar categorías amagatas',
'tog-noconvertlink' => 'Desactivar a conversión de titol de vinclo',
'tog-norollbackdiff' => 'No amostrar as diferencias dimpués de revertir',
+'tog-useeditwarning' => "Alvertir-me quan salga d'una pachina d'edición sin alzar os cambios",
'underline-always' => 'Siempre',
'underline-never' => 'Nunca',
@@ -362,7 +360,7 @@ $1",
'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).
+# 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).
'aboutsite' => 'Información sobre {{SITENAME}}',
'aboutpage' => 'Project:Sobre',
'copyright' => 'O conteniu ye disponible baixo a licencia $1.',
@@ -372,7 +370,6 @@ $1",
'disclaimers' => 'Alvertencias chenerals',
'disclaimerpage' => 'Project:Alvertencias chenerals',
'edithelp' => 'Aduya ta editar pachinas',
-'edithelppage' => "Help:Cómo s'edita una pachina",
'helppage' => 'Help:Aduya',
'mainpage' => 'Portalada',
'mainpage-description' => 'Portalada',
@@ -446,17 +443,6 @@ Puede trobar una lista de pachinas especials en [[Special:SpecialPages|{{int:spe
# General errors
'error' => 'Error',
'databaseerror' => "Error d'a base de datos",
-'dberrortext' => 'Ha sucedito una error de sintaxi en una consulta a la base de datos.
-Isto podría marcar una error en o programa.
-A zaguera consulta estió:
-<blockquote><tt>$1</tt></blockquote>
-dende adintro d\'a función "<tt>$2</tt>".
-A error retornata por a base de datos estió "<tt>$3: $4</tt>".',
-'dberrortextcl' => 'S\'ha producito una error de sintaxi en una consulta a la base de datos.
-A zaguera consulta estió:
-"$1"
-dende adintro d\'a función "$2".
-A base de datos retornó a error "$3: $4"',
'laggedslavemode' => "Pare cuenta: podrían faltar as zagueras edicions d'ista pachina.",
'readonly' => 'Base de datos bloqueyata',
'enterlockreason' => "Esplique a causa d'o bloqueyo, incluyendo una estimación de quán se producirá o desbloqueyo",
@@ -504,7 +490,6 @@ Consulta: $2',
'viewyourtext' => "Puet veyer y copiar o codigo d''''as suyas edicions''' en ista pachina:",
'protectedinterface' => "Ista pachina furne o texto d'a interfaz ta o software. Ye protechita ta privar o vandalismo. Si creye que bi ha bella error, contacte con un administrador.",
'editinginterface' => "'''Pare cuenta:''' Ye editando una pachina emplegata ta furnir o texto d'a interfaz de {{SITENAME}}. Os cambeos en ista pachina tendrán efecto en l'aparencia d'a interfaz ta os atros usuarios. Ta fer traduccions d'a interfaz, puede considerar fer servir [//translatewiki.net/wiki/Main_Page?setlang=an translatewiki.net], o prochecto de localización de MediaWiki.",
-'sqlhidden' => '(Consulta SQL amagata)',
'cascadeprotected' => 'Ista pachina ye protechita y no se puede editar porque ye incluyita en {{PLURAL:$1|a siguient pachina|as siguients pachinas}}, que son protechitas con a opción de "cascada": $2',
'namespaceprotected' => "No tiene premiso ta editar as pachinas d'o espacio de nombres '''$1'''.",
'customcssprotected' => 'No tiene permisos ta editar a pachina CSS porque contién parametros personal de belatro usuario.',
@@ -526,7 +511,6 @@ Puede continar navegando por {{SITENAME}} anonimament, u puede <span class='plai
'yourpassword' => "Clau d'acceso:",
'yourpasswordagain' => 'Torne a escribir a clau:',
'remembermypassword' => "Remerar o mío nombre d'usuario y a clau entre sesions en iste navegador (como muito por $1 {{PLURAL:$1|día|días}})",
-'securelogin-stick-https' => "Continar connectau con HTTPS dimpués d'encetar sesión",
'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',
@@ -615,7 +599,7 @@ Si a cuenta s\'ha creyato por error, simplament ignore iste mensache.',
'newpassword' => 'Nueva clau:',
'retypenew' => 'Torne a escribir a nueva clau:',
'resetpass_submit' => 'Cambiar a clau y identificar-se',
-'resetpass_success' => 'A suya clau ya ye cambiata. Agora ya puede dentrar-ie...',
+'changepassword-success' => 'A suya clau ya ye cambiata. Agora ya puede dentrar-ie...',
'resetpass_forbidden' => "No se puede cambiar as claus d'acceso",
'resetpass-no-info' => 'Debe identificar-se como usuario ta poder acceder dreitament ta ista pachina.',
'resetpass-submit-loggedin' => 'Cambiar a clau',
@@ -626,10 +610,8 @@ Talment ya ha cambiato a suya clau u ha demandato una nueva clau temporal.',
# Special:PasswordReset
'passwordreset' => "Restablir a clau d'acceso",
-'passwordreset-text' => "Completar ista forma ta recibir un recordatorio por correu con os detalles d'a suya cuenta.",
'passwordreset-legend' => "Restablir a clau d'acceso",
'passwordreset-disabled' => "S'ha desactivau o restablimiento de claus en ista wiki.",
-'passwordreset-pretext' => "{{PLURAL:$1||Introduzca uno d'os siguients datos}}",
'passwordreset-username' => "Nombre d'usuario:",
'passwordreset-domain' => 'Dominio:',
'passwordreset-capture' => 'Veyer o mensache resultant?',
@@ -840,6 +822,7 @@ Pareix que la hesen borrau.",
'edit-no-change' => "S'ha ignorato a suya edición, pos no s'ha feito garra cambeo ta o texto.",
'edit-already-exists' => "No s'ha puesto creyar una pachina nueva.
Ya existe.",
+'editwarning-warning' => "Si sale d'ista pachina perderá totz os cambios que haiga feito. Si tiene una cuenta d'usuario, puet eliminar ista alvertencia en a sección «Caixa d'edición» d'as suyas preferencies.",
# Parser/template warnings
'expensive-parserfunction-warning' => 'Pare cuenta: Ista pachina tiene masiadas cridas ta funcions de preproceso (parser functions) costosas.
@@ -1059,7 +1042,6 @@ Asegure-se que iste cambio no trencará a continidat de l'historial d'a pachina.
'searchmenu-legend' => 'Opcions de busca',
'searchmenu-exists' => "'''Bi ha una pachina clamada \"[[\$1]]\" en ista wiki'''",
'searchmenu-new' => "'''Creyar a pachina \"[[:\$1]]\" en ista wiki!'''",
-'searchhelp-url' => 'Help:Aduya',
'searchmenu-prefix' => '[[Special:PrefixIndex/$1|Veyer pachinas con iste prefixo]]',
'searchprofile-articles' => 'Pachinas de conteniu',
'searchprofile-project' => "Pachinas d'aduya y d'o prochecto",
@@ -1101,15 +1083,6 @@ Asegure-se que iste cambio no trencará a continidat de l'historial d'a pachina.
'search-external' => 'Busca externa',
'searchdisabled' => 'A busca en {{SITENAME}} ye temporalment desactivata. Entremistanto, puede mirar en {{SITENAME}} fendo servir buscadors externos, pero pare cuenta que os suyos endices de {{SITENAME}} puede no estar esviellatos.',
-# Quickbar
-'qbsettings' => 'Preferencias de "Quickbar"',
-'qbsettings-none' => 'Garra',
-'qbsettings-fixedleft' => 'Fixa a la zurda',
-'qbsettings-fixedright' => 'Fixa a la dreita',
-'qbsettings-floatingleft' => 'Flotant a la zurda',
-'qbsettings-floatingright' => 'Flotant a la dreita',
-'qbsettings-directionality' => "Fixato, pendendo en a direccionalidat d'o suyo script y o suyo luengache",
-
# Preferences page
'preferences' => 'Preferencias',
'mypreferences' => 'Preferencias',
@@ -1141,7 +1114,6 @@ Asegure-se que iste cambio no trencará a continidat de l'historial d'a pachina.
'resetprefs' => "Tornar t'as preferencias por defecto",
'restoreprefs' => 'Restaure todas as confeguracions por defecto',
'prefs-editing' => 'Edición',
-'prefs-edit-boxsize' => "Grandaria d'a finestra d'edición.",
'rows' => 'Ringleras:',
'columns' => 'Columnas:',
'searchresultshead' => 'Mirar',
@@ -1152,9 +1124,6 @@ Asegure-se que iste cambio no trencará a continidat de l'historial d'a pachina.
'recentchangesdays-max' => '(masimo $1 {{PLURAL:$1|día|días}})',
'recentchangescount' => "Numero d'edicions a amostrar, por defecto:",
'prefs-help-recentchangescount' => 'Inclui os zaguers cambeos, historials de pachina y rechistros.',
-'prefs-help-watchlist-token' => "Si plena iste campo con una clau secreta se chenerará n filo RSS t'a suya lista de seguimeinto.
-Qui conoixca ista clau podrá leyer a suya lista de seguimiento, asinas que esliya una clau segura.
-Contino se i amuestra una calu chenerata de traza aleatoria que puede fer servir si quiere: $1",
'savedprefs' => "S'han alzato as suyas preferencias.",
'timezonelegend' => 'Fuso horario:',
'localtime' => 'Hora local:',
@@ -1185,7 +1154,6 @@ Contino se i amuestra una calu chenerata de traza aleatoria que puede fer servir
'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:',
-'prefs-textboxsize' => "Mida d'a pachina d'edición",
'youremail' => 'Adreza de correu electronico:',
'username' => "Nombre d'usuario:",
'uid' => "ID d'usuario:",
@@ -1423,7 +1391,6 @@ Habría de tener menos de $1 {{PLURAL:$1|carácter|carácters}}.',
'recentchangeslinked-feed' => 'Cambeos relacionatos',
'recentchangeslinked-toolbox' => 'Cambios relacionatos',
'recentchangeslinked-title' => 'Cambeos relacionatos con "$1"',
-'recentchangeslinked-noresult' => 'No bi habió cambeos en as pachinas vinculatas en o intervalo de tiempo indicato.',
'recentchangeslinked-summary' => "Ista ye una lista d'os zaguers cambios feitos en pachinas con vinclos dende una pachina especifica (u ta miembros d'una categoría especificata). S'amuestran en '''negreta''' as pachinas d'a suya [[Special:Watchlist|lista de seguimiento]].",
'recentchangeslinked-page' => "Nombre d'a pachina:",
'recentchangeslinked-to' => "En cuentas d'ixo, amostrar os cambios en pachinas con vinclos enta a pachina data",
@@ -1646,7 +1613,6 @@ Por seguridat, s'ha desactivau img_auth.php.",
'http-read-error' => 'Error de lectura HTTP.',
'http-timed-out' => 'A requesta HTTP ha circumducito.',
'http-curl-error' => 'Error en recuperar a URL: $1',
-'http-host-unreachable' => "No s'ha puesto acceder t'a URL.",
'http-bad-status' => 'Ha habiu un problema en a requesta HTTP: $1 $2',
# Some likely curl errors. More could be added from <http://curl.haxx.se/libcurl/c/libcurl-errors.html>
@@ -1790,12 +1756,6 @@ Debaixo s'amuestra a descripción d'a suya [$2 pachina de descripción].",
'statistics-users-active-desc' => 'Usuarios que han feito qualsiquier acción en {{PLURAL:$1|o zaguer día|os zaguers $1 días}}',
'statistics-mostpopular' => 'Pachinas más vistas',
-'disambiguations' => 'Pachinas con vinclos enta pachinas de desambigación',
-'disambiguationspage' => 'Template:Desambigación',
-'disambiguations-text' => "As siguients pachinas tienen vinclos ta una '''pachina de desambigación'''.
-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.
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.",
@@ -2028,10 +1988,9 @@ L\'adreza de correu-e que endicó en as suyas [[Special:Preferences|preferencias
'unwatchthispage' => 'Deixar de cosirar',
'notanarticle' => 'No ye una pachina de conteniu',
'notvisiblerev' => "S'ha borrato a revisión",
-'watchnochange' => "Dengún d'os articlos d'a suya lista de seguimiento no s'ha editato en o periodo de tiempo amostrato.",
'watchlist-details' => '{{PLURAL:$1|$1 pachina|$1 pachinas}} en a suya lista de seguimiento, sin contar-ie as pachinas de descusión.',
-'wlheader-enotif' => '* A notificación por correu electronico ye activata',
-'wlheader-showupdated' => "* Las pachinas cambiadas dende a suya zaguer vesita s'amuestran en '''negreta'''",
+'wlheader-enotif' => 'A notificación por correu electronico ye activata',
+'wlheader-showupdated' => "Las pachinas cambiadas dende a suya zaguer vesita s'amuestran en '''negreta'''",
'watchmethod-recent' => 'Mirando pachinas cosiratas en os zaguers cambeos',
'watchmethod-list' => 'mirando edicions recients en as pachinas cosiratas',
'watchlistcontains' => 'A suya lista de seguimiento tiene $1 {{PLURAL:$1|pachina|pachinas}}.',
@@ -2256,7 +2215,7 @@ $1",
'contributions' => "Contribucions de {{GENDER:$1|l'usuario|la usuaria}}",
'contributions-title' => "Contribucions de l'usuario $1",
'mycontris' => 'Contribucions',
-'contribsub2' => 'De $1 ($2)',
+'contribsub2' => 'Ta {{GENDER:$3|$1}} ($2)',
'nocontribs' => "No s'han trobato cambeos que concordasen con ixos criterios",
'uctop' => '(zaguer cambeo)',
'month' => 'Dende o mes (y anteriors):',
@@ -2412,11 +2371,8 @@ Ta más detalles, debaixo s'amuestra o rechistro de supresions:",
'ipb_blocked_as_range' => "Error: L'adreza IP $1 no s'ha bloqueyato dreitament y por ixo no se puede desbloqueyar. Manimenos, ye bloqueyata por estar parte d'o rango $2, que sí puede desbloqueyar-se de conchunta.",
'ip_range_invalid' => "O rango d'adrezas IP no ye conforme.",
'ip_range_toolarge' => 'No se permiten os bloqueyos de rangos más grans que /$1.',
-'blockme' => 'bloqueyar-me',
'proxyblocker' => 'bloqueyador de proxies',
-'proxyblocker-disabled' => 'Ista función ye desactivata.',
'proxyblockreason' => "S'ha bloqueyato a suya adreza IP porque ye un proxy ubierto. Por favor, contaute on o suyo furnidor de servicios d'Internet u con o suyo servicio d'asistencia tecnica e informe-les d'iste grau problema de seguridat.",
-'proxyblocksuccess' => 'Feito.',
'sorbsreason' => 'A suya adreza IP ye en a lista de proxies ubiertos en a DNSBL de {{SITENAME}}.',
'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.',
@@ -2718,17 +2674,11 @@ Puede veyer-ne, manimenos, o codigo fuent.',
# Stylesheets
'common.css' => '/* Os estilos CSS definius aquí aplicarán a todas as apariencias (skins) */',
-'standard.css' => "/* Os estilos CSS colocaus aquí s'aplicarán ta totz os usuarios que faigan servir l'apariencia Standard */",
-'nostalgia.css' => "/* Os estilos CSS colocaus aquí s'aplicarán ta totz os usuarios que faigan servir l'apariencia Nostalgia */",
'cologneblue.css' => "/* Os estilos CSS colocaus aquí s'aplicarán ta totz os usuarios que faigan servir l'apariencia Cologne Blue */",
'monobook.css' => "/* Os estilos CSS colocaus aquí s'aplicarán ta totz os usuarios que faigan servir l'apariencia Monobook */",
-'myskin.css' => "/* Os estilos CSS colocaus aquí s'aplicarán ta totz os usuarios que que faigan servir l'apariencia MySkin */",
-'chick.css' => "/* Os estilos CSS colocaus aquí s'aplicarán ta totz os usuarios que faigan servir l'apariencia Chick */",
-'simple.css' => "/* Os estilos CSS colocaus aquí s'aplicarán ta totz os usuarios que faigan servir l'apariencia Simpla */",
'modern.css' => "/* Os estilos CSS colocaus aquí s'aplicarán ta totz os usuarios que faigan servir l'apariencia Modern */",
'vector.css' => "/* Os estilos CSS colocaus aquí s'aplicarán ta totz os usuarios que faigan servir l'apariencia Vector */",
'print.css' => '/* Os estilos CSS colocaus aquí afectarán a la impresión */',
-'handheld.css' => '/* Os estilos CSS colocaus aquí afectarán a os dispositivos mobils basaus en as apariencias configuradas en $wgHandheldStyle */',
'noscript.css' => "/* Os estilos CSS colocaus aquí s'aplicarán ta totz os usuarios que tiengan desactivato JavaScript */",
'group-autoconfirmed.css' => "/* Os estilos CSS colocaus aquí s'aplicarán nomás a os usuarios autoconfirmatos*/",
'group-bot.css' => "/* Os estilos CSS colocaus aquí s'aplicarán nomás a os bots*/",
@@ -2737,13 +2687,8 @@ Puede veyer-ne, manimenos, o codigo fuent.',
# Scripts
'common.js' => '/* Qualsiquier codigo Javascript escrito aquí se cargará ta totz os usuarios en cada carga de pachina */',
-'standard.js' => "/* Qualsiquier codigo Javascript escrito aquí se cargará ta totz os usuarios que faigan servir l'apariencia Estandar */",
-'nostalgia.js' => "/* Qualsiquier codigo Javascript escrito aquí se cargará ta totz os usuarios que faigan servir l'apariencia Nostalgia. */",
'cologneblue.js' => "/* Qualsiquier codigo Javascript escrito aquí se cargará ta totz os usuarios que faigan servir l'apariencia Colonia azul */",
'monobook.js' => "/* O codigo Javascript que se meta aquí será cargau por os usuarios faigan servir l'apariencia MonoBook */",
-'myskin.js' => "/* Qualsiquier codigo Javascript escrito aquí se cargará ta totz os usuarios que faigan servir l'apariencia MySkin */",
-'chick.js' => "/* Qualsiquier codigo Javascript escrito aquí se cargará ta totz os usuarios que faigan servir l'apariencia Chick */",
-'simple.js' => "/* Qualsiquier codigo Javascript escrito aquí se cargará ta totz os usuarios que faigan servir l'apariencia Simple */",
'modern.js' => "/* O codigo Javascript que se meta aquí será cargau por os usuarios faigan servir l'apariencia Modern */",
'vector.js' => '/* Qualsiquier codigo Javascript escrito aquí se cargará ta totz os usuarios que usen a piel Vector */',
'group-autoconfirmed.js' => '/* Qualsiquier codigo Javascript escrito aquí se cargará nomás ta os usuarios autoconfirmatos */',
@@ -2783,13 +2728,8 @@ Puede veyer-ne, manimenos, o codigo fuent.',
'pageinfo-authors' => "Numero d'autors diferents",
# Skin names
-'skinname-standard' => 'Clasica (Classic)',
-'skinname-nostalgia' => 'Recosiros (Nostalgia)',
'skinname-cologneblue' => 'Colonia Azul (Cologne Blue)',
'skinname-monobook' => 'MonoBook',
-'skinname-myskin' => 'A mía aparencia (MySkin)',
-'skinname-chick' => 'Chick',
-'skinname-simple' => 'Simpla (Simple)',
'skinname-modern' => 'Moderna',
'skinname-vector' => 'Vector',
@@ -2890,7 +2830,7 @@ Os campos de metadatos d'a imachen que amaneixen en iste mensache s'amostrarán
* gpslongitude
* gpsaltitude",
-# EXIF tags
+# Exif tags
'exif-imagewidth' => 'Amplaria',
'exif-imagelength' => 'Altaria',
'exif-bitspersample' => 'Bits por component',
@@ -3068,7 +3008,7 @@ Os campos de metadatos d'a imachen que amaneixen en iste mensache s'amostrarán
'exif-originalimageheight' => "Altaria d'a imachen antes d'estar retallada",
'exif-originalimagewidth' => "Amplaria d'a imachen antes d'estar retallada",
-# EXIF attributes
+# Exif attributes
'exif-compression-1' => 'Sin de compresión',
'exif-compression-2' => 'CCITT Group 3 1-Dimensional Modified Huffman run length encoding',
'exif-compression-3' => 'Codificación de fax CCITT grupo 3',
@@ -3452,7 +3392,6 @@ Tamién puede fer servir o [[Special:EditWatchlist|editor estándar]].",
'version-other' => 'Atros',
'version-mediahandlers' => 'Maneyador de fichers multimedia',
'version-hooks' => 'Grifios (Hooks)',
-'version-extension-functions' => "Funcions d'a estensión",
'version-parser-extensiontags' => "Etiquetas d'estensión d'o parseyador",
'version-parser-function-hooks' => "Grifios d'as funcions d'o parseyador",
'version-hook-name' => "Nombre d'o grifio",
@@ -3470,13 +3409,6 @@ Con iste programa ha d'haber recibiu [{{SERVER}}{{SCRIPTPATH}}/COPYING una copia
'version-software-product' => 'Producto',
'version-software-version' => 'Versión',
-# Special:FilePath
-'filepath' => "Camín d'o fichero",
-'filepath-page' => 'Fichero:',
-'filepath-submit' => 'Ir-ie',
-'filepath-summary' => "Ista pachina especial le retorna o camín completo d'un fichero.
-As imachens s'amuestran en resolución completa, a resta de fichers fan encetar dreitament os suyos programas asociatos.",
-
# Special:FileDuplicateSearch
'fileduplicatesearch' => 'Mirar fichers duplicatos',
'fileduplicatesearch-summary' => 'Mirar archivos duplicatos basatos en a suya valura hash.',
diff --git a/languages/messages/MessagesAng.php b/languages/messages/MessagesAng.php
index 429a5fab..c2bc3743 100644
--- a/languages/messages/MessagesAng.php
+++ b/languages/messages/MessagesAng.php
@@ -7,6 +7,7 @@
* @ingroup Language
* @file
*
+ * @author Altai uul
* @author Espreon
* @author Gott wisst
* @author JJohnson
@@ -60,9 +61,6 @@ $messages = array(
'tog-shownumberswatching' => 'Īwan þæt rīm behealdendra brūcenda',
'tog-oldsig' => 'Genge selfmearc:',
'tog-fancysig' => 'DÅn selfmearce tÅ wikitexte (lÄ“as Ç£r gedÅnes hlencan)',
-'tog-externaleditor' => 'Nota Å«tÆ¿eardne ÄdihttÅl tÅ ÈeÆ¿unelicre Èesetednesse (synderlÄ«ce tÅ sƿīðe cræftiÈum mannum - þearf Änlica Èesetednessa on þīnum spearctelle)',
-'tog-externaldiff' => 'Nota Å«tÆ¿earde scÄdunÈe tÅ ÈeÆ¿unelicre Èesetednesse (synderlÄ«ce tÅ sƿīðe cræftiÈum mannum - þearf Änlica Èesetednesse on þīnum spearctelle)',
-'tog-showjumplinks' => 'Þafian "gÄn tÅ" gefÄ“rra hlencena',
'tog-uselivepreview' => 'Notian rihte Ä«wde fÅrebysene (on costnunge)',
'tog-forceeditsummary' => 'Cȳðan mē þǣr ic ne wrīte adihtunge sceortnesse',
'tog-watchlisthideown' => 'Hȳdan mīna adihtunga wiþ þæt behealdungtæl',
@@ -76,6 +74,8 @@ $messages = array(
'tog-showhiddencats' => 'Īwan gehȳdede floccas',
'tog-noconvertlink' => 'Ne lÇ£t hlencena titula Äwendunge',
'tog-norollbackdiff' => 'ForlÇ£tan scÄdunge siþþan edweorc sÄ«e gedÅn',
+'tog-useeditwarning' => 'Cȳðan mē þǣr ic afare fram adihtunge tramete þe gīet hæbbe unhordoda andwendunga.',
+'tog-prefershttps' => 'BrÅ«c Ä sicore þēodednesse Ã¾Ä Ã¾Å« sÄ« inmeldod',
'underline-always' => 'Ç¢fre',
'underline-never' => 'NÇ£fre',
@@ -139,6 +139,18 @@ $messages = array(
'oct' => 'Winterf',
'nov' => 'BlÅ',
'dec' => 'Æf Gē',
+'january-date' => '$1. Æfterran Gēolan',
+'february-date' => '$1. SolmÅnaðes',
+'march-date' => '$1. HrēðmÅnaðes',
+'april-date' => '$1. Ä’astermÅnaðes',
+'may-date' => '$1. Þrimilces',
+'june-date' => '$1. Ǣrran Līðan',
+'july-date' => '$1. Æfterran Līðan',
+'august-date' => '$1. WÄ“odmÅnaðes',
+'september-date' => '$1. HÄligmÅnaðes',
+'october-date' => '$1. Winterfylleðes',
+'november-date' => '$1. BlÅtmÅnaðes',
+'december-date' => '$1. Ǣrran Gēolan',
# Categories related messages
'pagecategories' => '{{PLURAL:$1|Flocc|Floccas}}',
@@ -260,7 +272,7 @@ Wē biddaþ þæt þū abīde scortne tīman ǣr þū gesēce to sēonne þisne
$1',
'pool-errorunknown' => 'Uncūþ wÅh',
-# 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).
+# 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).
'aboutsite' => 'Gecȳþness ymbe {{SITENAME}}',
'aboutpage' => 'Project:Gecȳþness',
'copyright' => 'Man mæg innunge under $1 findan.',
@@ -270,7 +282,6 @@ $1',
'disclaimers' => 'Ætsacunga',
'disclaimerpage' => 'Project:Gemǣne ætsacung',
'edithelp' => 'Help on adihtunge',
-'edithelppage' => 'Help:Ä€dihtung',
'helppage' => 'Help:Innung',
'mainpage' => 'HÄ“afodtramet',
'mainpage-description' => 'HÄ“afodtramet',
@@ -343,12 +354,6 @@ Getæl gengra syndrigra trameta cann man findan be [[Special:SpecialPages|þǣm
# General errors
'error' => 'WÅh',
'databaseerror' => 'Cȳþþuhordes wÅh',
-'dberrortext' => 'Cȳþþuhordes bÄ“ne endebyrdnesse wÅh gelamp.
-Þis mæg mÇ£nan wÅh on þǣre weorcwrithyrste.
-SÄ“o nÄ«woste gesÅhte cȳþþuhordes bÄ“n wæs:
-<blockquote><code>$1</code></blockquote>
-fram innan wyrcunge "<code>$2</code>".
-Cȳþþuhord ageaf wÅh "<code>$3: $4</code>"',
'laggedslavemode' => "'''Warnung:''' Wēnunga næbbe se tramet nīwlīca nīwunga.",
'enterlockreason' => 'Wrīt race þǣre forwiernunge and apinsunge þæs tīman on þǣm bēo sēo forwiernung forlǣten',
'missingarticle-rev' => '(nīwung#: $1)',
@@ -375,9 +380,17 @@ Cȳþþuhord ageaf wÅh "<code>$3: $4</code>"',
CnÄw þæt sume trametas mihten gÄ«et wesan geÄ«wde swÄ Ã¾Å« wÇ£re gÄ«et inmeldod, oþ þæt þū clÇ£nsie þīnes sÄ“cendtÅles hord.",
'welcomeuser' => 'Wilcume, $1!',
'yourname' => 'Þīn brūcendnama:',
+'userlogin-yourname' => 'Brūcendnama:',
+'userlogin-yourname-ph' => 'Inwrīt þīnne brūcendnaman',
'yourpassword' => 'Þafungword:',
+'userlogin-yourpassword' => 'Þafungword',
+'userlogin-yourpassword-ph' => 'Inwrīt þīn þafungword',
+'createacct-yourpassword-ph' => 'Inwrīt þafungword',
'yourpasswordagain' => 'Wrītan þafungword eft:',
+'createacct-yourpasswordagain' => 'Asēð þafungword',
+'createacct-yourpasswordagain-ph' => 'Wrīt þafungword eft',
'remembermypassword' => 'Gemynan mīne inmeldunge on þissum webbsēcende (oþ $1 {{PLURAL:$1|dæg|daga}} lengest)',
+'userlogin-remembermypassword' => 'Ætfeolan mīnre inmeldunge',
'yourdomainname' => 'Þīn geweald:',
'password-change-forbidden' => 'Þū ne canst awendan þafungword on þissum wiki.',
'login' => 'Inmeldian',
@@ -388,6 +401,8 @@ CnÄw þæt sume trametas mihten gÄ«et wesan geÄ«wde swÄ Ã¾Å« wÇ£re gÄ«et inmel
'logout' => 'Ūtmeldian',
'userlogout' => 'Ūtmeldian',
'notloggedin' => 'NÄ ingemeldod',
+'userlogin-noaccount' => '',
+'userlogin-joinproject' => '',
'nologin' => 'Næfst þū reccinge? $1',
'nologinlink' => 'Scieppan reccinge',
'createaccount' => 'Scieppan reccinge',
@@ -565,7 +580,6 @@ folclicum Ägnunge oþþe gelÄ«cum frÄ“om horde (sÄ“o $1 for Äscungum).
'nextn' => 'nīehst {{PLURAL:$1|$1}}',
'viewprevnext' => 'SÄ“on ($1 {{int:pipe-separator}} $2) ($3)',
'searchmenu-new' => "'''Scieppan þone tramet \"[[:\$1]]\" on þissum wiki!'''",
-'searchhelp-url' => 'Help:Innung',
'searchprofile-articles' => 'Innunge trametas',
'searchprofile-project' => 'Helpes and Weorca trametas',
'searchprofile-images' => 'Missenendebyrdness',
@@ -591,9 +605,6 @@ folclicum Ägnunge oþþe gelÄ«cum frÄ“om horde (sÄ“o $1 for Äscungum).
'powersearch-field' => 'SÄ“can',
'search-external' => 'Ūtanweard sÅcn',
-# Quickbar
-'qbsettings-none' => 'NÄn',
-
# Preferences page
'preferences' => 'FÅreberunga',
'mypreferences' => 'MÄ«na fÅreberunga',
@@ -1013,7 +1024,6 @@ Gif se brūcend asifte hine. synderlīce sind ymelan geīwda þǣre þe se brūc
'contribslink' => 'forðunga',
'unblocklogentry' => 'unfortȳnde $1',
'block-log-flags-nocreate' => 'Forbēad tŠscieppenne reccinge',
-'proxyblocksuccess' => 'GedÅn.',
# Move page
'movearticle' => 'Wegan tramet:',
@@ -1142,7 +1152,7 @@ CÄ“os Åðerne naman lÄ.',
'metadata-expand' => 'Īwan ēacnode stafas',
'metadata-collapse' => 'Hȳdan ēacnode stafas',
-# EXIF tags
+# Exif tags
'exif-imagewidth' => 'WÄ«dnes',
'exif-imagelength' => 'Hīehþ',
'exif-compression' => 'ÈœeþryccungmÅd',
@@ -1162,7 +1172,7 @@ CÄ“os Åðerne naman lÄ.',
'exif-gpsmeasuremode' => 'MÄ“tungmÅd',
'exif-gpsimgdirection' => 'Rihtung þæs biliðes',
-# EXIF attributes
+# Exif attributes
'exif-compression-1' => 'UnÈeþrycced',
'exif-meteringmode-0' => 'Uncūþ',
@@ -1268,11 +1278,6 @@ $5
'version-hook-name' => 'Angelnama',
'version-version' => '($1. fadung)',
-# Special:FilePath
-'filepath' => 'Ymelan pæþ',
-'filepath-page' => 'Ymele:',
-'filepath-submit' => 'GÄn',
-
# Special:FileDuplicateSearch
'fileduplicatesearch-filename' => 'Ymelan nama:',
'fileduplicatesearch-submit' => 'SÄ“can',
diff --git a/languages/messages/MessagesAr.php b/languages/messages/MessagesAr.php
index 1bbaffc7..1e82ec51 100644
--- a/languages/messages/MessagesAr.php
+++ b/languages/messages/MessagesAr.php
@@ -9,6 +9,7 @@
*
* @author ;Hiba;1
* @author Abanima
+ * @author Achraf94
* @author AhmadSherif
* @author Aiman titi
* @author Alexknight12
@@ -41,6 +42,7 @@
* @author Mido
* @author Mimouni
* @author Mo7amedsalim
+ * @author Nemo bis
* @author Obayd
* @author OsamaK
* @author Ouda
@@ -503,9 +505,6 @@ $messages = array(
'tog-shownumberswatching' => 'اعرض عدد المستخدمين المراقبين',
'tog-oldsig' => 'التوقيع الحالي:',
'tog-fancysig' => 'وضع الوصلة يدويا واستعمال نص الويكي',
-'tog-externaleditor' => 'استخدم محررًا خارجيًا مبدئيا (للخبراء Ùقط، يتطلب إعدادات خاصة على حاسوبك) ([//www.mediawiki.org/wiki/Manual:External_editors لمزيد من المعلومات].)',
-'tog-externaldiff' => 'استخدم مستعرض Ùروقات خارجيًا مبدئيا (للخبراء Ùقط، يتطلّب إعدادات خاصة على حاسوبك) ([//www.mediawiki.org/wiki/Manual:External_editors للمزيد من المعلومات].)',
-'tog-showjumplinks' => 'Ùعّل روابط "اذهب إلى" المعاونة',
'tog-uselivepreview' => 'استعمال المعاينة المباشرة (تجريبي)',
'tog-forceeditsummary' => 'نبهني عند عدم إدخال ملخص تعديل',
'tog-watchlisthideown' => 'أخ٠تعديلاتي من قائمة المراقبة',
@@ -519,6 +518,8 @@ $messages = array(
'tog-showhiddencats' => 'أظهر التصنيÙات المخÙية',
'tog-noconvertlink' => 'عطل تحويل عناوين الروابط',
'tog-norollbackdiff' => 'أزل الÙرق بعد إحداث استرجاع',
+'tog-useeditwarning' => 'حذّرني عندما أغادر تحرير صÙحة Ùيها تغييرات لم أحÙظها',
+'tog-prefershttps' => 'دائما استخدم اتصالا آمنا بعد الدخول',
'underline-always' => 'دائما',
'underline-never' => 'أبدا',
@@ -582,6 +583,18 @@ $messages = array(
'oct' => 'تشرين الأول',
'nov' => 'تشرين الثاني',
'dec' => 'كانون الأول',
+'january-date' => 'كانون الثاني/يناير $1',
+'february-date' => 'شباط/Ùبراير $1',
+'march-date' => 'آذار/مارس $1',
+'april-date' => 'نيسان/أبريل $1',
+'may-date' => 'أيار/مايو $1',
+'june-date' => 'حزيران/يونيو $1',
+'july-date' => 'تموز/يوليو $1',
+'august-date' => 'آب/أغسطس $1',
+'september-date' => 'أيلول/سبتمبر $1',
+'october-date' => 'تشرين الأول/أكتوبر $1',
+'november-date' => 'تشرين الثاني/نوÙمبر $1',
+'december-date' => 'كانون الأول/ديسمبر $1',
# Categories related messages
'pagecategories' => '{{PLURAL:$1|بلا تصنيÙ|تصنيÙ|تصنيÙان|تصنيÙات}}',
@@ -663,6 +676,7 @@ $messages = array(
'create-this-page' => 'أنشئ صÙحة بهذا العنوان',
'delete' => 'حذÙ',
'deletethispage' => 'احذ٠هذه الصÙحة',
+'undeletethispage' => 'استرجع هذه الصÙحة',
'undelete_short' => 'استرجاع {{PLURAL:$1||تعديل واحد|تعديلين|$1 تعديلات|$1 تعديلاً|$1 تعديل}}',
'viewdeleted_short' => 'استعرض {{PLURAL:$1||تعديل واحد|تعديلين|$1 تعديلات|$1 تعديلاً|$1 تعديل}}',
'protect' => 'حماية',
@@ -679,7 +693,7 @@ $messages = array(
'articlepage' => 'اعرض صÙحة المحتوى',
'talk' => 'نقاش',
'views' => 'معاينة',
-'toolbox' => 'صندوق الأدوات',
+'toolbox' => 'الأدوات',
'userpage' => 'طالع صÙحة المستخدم',
'projectpage' => 'طالع صÙحة المشروع',
'imagepage' => 'طالع صÙحة الملÙ',
@@ -706,7 +720,7 @@ $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).
+# 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).
'aboutsite' => 'عن {{SITENAME}}',
'aboutpage' => 'Project:عن',
'copyright' => 'المحتوى منشور ÙˆÙÙ‚ $1 إن لم يرد خلا٠ذلك.',
@@ -716,7 +730,6 @@ $1',
'disclaimers' => 'إخلاء مسؤولية',
'disclaimerpage' => 'Project:إخلاء مسؤولية عام',
'edithelp' => 'مساعدة التحرير',
-'edithelppage' => 'Help:تحرير',
'helppage' => 'Help:محتويات',
'mainpage' => 'الصÙحة الرئيسية',
'mainpage-description' => 'الصÙحة الرئيسية',
@@ -795,17 +808,11 @@ $1',
# General errors
'error' => 'عطل',
'databaseerror' => 'عطل ÙÙŠ قاعدة البيانات',
-'dberrortext' => 'حدث عطل ÙÙŠ نحو استعلام قاعدة البيانات.
-قد يكون مرجع هذا علّة ÙÙŠ البرمجية.
-آخر استعلام أجري ÙÙŠ قاعدة البيانات كان:
-<blockquote><tt>$1</tt></blockquote>
-من الدالة "<tt>$2</tt>".
-أرجعت قاعدة البيانات العطل "<tt>$3: $4</tt>".',
-'dberrortextcl' => 'حدث خطأ ÙÙŠ صيغة استعلام قاعدة البيانات.
-آخر استعلام طلب من قاعدة البيانات كان:
-"$1"
-من داخل الدالة "$2".
-أرجعت قاعدة البيانات الخطأ "$3: $4"',
+'databaseerror-text' => 'حدث خطأ ÙÙŠ إستعلام قاعدة البيانات. قد يشير هذا إلى خطأ ÙÙŠ البرنامج.',
+'databaseerror-textcl' => 'حدث خطأ ÙÙŠ إستعلام قاعدة البيانات.',
+'databaseerror-query' => 'إستعلام: $1',
+'databaseerror-function' => 'دالة: $1',
+'databaseerror-error' => 'خطأ: $1',
'laggedslavemode' => "'''تحذير:''' الصÙحة قد لا تحتوي على أحدث التحديثات.",
'readonly' => 'قاعدة البيانات مقÙلة',
'enterlockreason' => 'أدخل سببا للقÙÙ„ ذاكرا تقديرا لوقت إزالة الغلق',
@@ -839,6 +846,7 @@ $1',
'cannotdelete-title' => 'تعذّر حذ٠الصÙحة "$1"',
'delete-hook-aborted' => 'أجهض خطّا٠الحذÙ.
لم يقدم أي توضيح.',
+'no-null-revision' => 'تعذر إنشاء مراجعة جديدة Ùارغة لصÙحة "$1"',
'badtitle' => 'عنوان سيء',
'badtitletext' => 'عنوان الصÙحة المطلوب إما غير صحيح أو Ùارغ، وربما الرابط بين اللغات أو بين المشاريع خاطئ.
ربما يحوي محار٠لا تصلح للاستخدام ÙÙŠ العناوين.',
@@ -862,12 +870,15 @@ $1',
'editinginterface' => "'''تحذير:''' أنت تقوم بتحرير صÙحة تستخدم ÙÙŠ الواجهة النصية للبرنامج.
سو٠تؤثر التغييرات ÙÙŠ هذه الصÙحة على مظهر واجهة المستخدم للمستخدمين الآخرين على هذا الويكي.
لإضاÙØ© أو تغيير الترجمات ÙÙŠ جميع مشاريع الويكي، رجاءً استخدم [//translatewiki.net/ translatewiki.net]ØŒ مشروع الترجمة الخاص بميدياويكي.",
-'sqlhidden' => '(استعلام SQL مخÙÙŠ)',
'cascadeprotected' => 'تمت حماية هذه الصÙحة من التعديل لأنها مدمجة ÙÙŠ {{PLURAL:$1||الصÙحة التالية، والتي|الصÙحتين التاليتين، واللتين|الصÙحات التالية، والتي}} تم استعمال خاصية "حماية الصÙحات المدمجة" {{PLURAL:$1||بها|بهما|بها}}:
$2',
'namespaceprotected' => "لا تمتلك الصلاحية لتعديل الصÙحات ÙÙŠ نطاق '''$1'''.",
'customcssprotected' => 'أنت لا تمتلك السماح لتعديل صÙحة الCSS هذه، لأنها تحتوي على الإعدادات الشخصية لمستخدم آخر.',
'customjsprotected' => 'أنت لا تمتلك السماح لتعديل صÙحة الجاÙاسكريبت هذه، لأنها تحتوي على الإعدادات الشخصية لمستخدم آخر.',
+'mycustomcssprotected' => 'ليس لديك صلاحية تعديل هذه الصÙحة للطرز المتراصة.',
+'mycustomjsprotected' => 'ليس لديك صلاحية تعديل صÙحة جاÙاسكربت هذه.',
+'myprivateinfoprotected' => 'ليس لديك صلاحية تعديل معلوماتك الخاصة.',
+'mypreferencesprotected' => 'ليس لديك صلاحية تعديل تÙضيلاتك.',
'ns-specialprotected' => 'الصÙحات الخاصة لا يمكن تعديلها.',
'titleprotected' => "{{GENDER:$1|حمى|حمت}} [[User:$1|$1]] هذا العنوان من الإنشاء.
السبب المعطى هو ''$2''.",
@@ -892,10 +903,19 @@ $2',
'welcomecreation-msg' => 'تم إنشاء حسابك.
لا تنس تعديل [[Special:Preferences|تÙضيلاتك ÙÙŠ {{SITENAME}}]].',
'yourname' => 'اسم المستخدم:',
+'userlogin-yourname' => 'اسم المستخدم',
+'userlogin-yourname-ph' => 'أدخل اسم المستخدم الخاص بك',
+'createacct-another-username-ph' => 'أدخل اسم المستخدم',
'yourpassword' => 'كلمة السر:',
+'userlogin-yourpassword' => 'كلمة السر',
+'userlogin-yourpassword-ph' => 'أدخل كلمة السر الخاصة بك',
+'createacct-yourpassword-ph' => 'أدخل كلمة السر',
'yourpasswordagain' => 'أعد كتابة كلمة السر:',
+'createacct-yourpasswordagain' => 'أكد كلمة السر',
+'createacct-yourpasswordagain-ph' => 'أدخل كلمة المرور مرة أخرى',
'remembermypassword' => 'تذكر دخولي بهذا المتصÙØ­ (لمدة أقصاها {{PLURAL:$1||يوم واحد|يومان|$1 أيام|$1 يوما|$1 يوم}})',
-'securelogin-stick-https' => 'ابقَ ÙÙŠ اتصال HTTPS بعد الدخول.',
+'userlogin-remembermypassword' => 'أبقني مسجلا للدخول',
+'userlogin-signwithsecure' => 'الولوج باتصّال مؤمّن',
'yourdomainname' => 'نطاقك:',
'password-change-forbidden' => 'أنت لا يمكنك تغيير كلمات السر على هذا الويكي.',
'externaldberror' => 'هناك إما خطأ ÙÙŠ دخول قاعدة البيانات الخارجية أو أنه غير مسموح لك بتحديث حسابك الخارجي.',
@@ -907,18 +927,43 @@ $2',
'logout' => 'تسجيل الخروج',
'userlogout' => 'اخرج',
'notloggedin' => 'غير مسجل الدخول',
+'userlogin-noaccount' => 'ليس لديك حساب؟',
+'userlogin-joinproject' => 'انضم إلى {{SITENAME}}',
'nologin' => "ليس لديك حساب؟ '''$1'''.",
'nologinlink' => 'أنشئ حسابا',
'createaccount' => 'أنشئ حسابا',
'gotaccount' => "لديك حساب؟ '''$1'''.",
'gotaccountlink' => 'تسجيل الدخول',
'userlogin-resetlink' => 'نسيت تÙاصيل الدخول؟',
+'userlogin-resetpassword-link' => 'صÙّر كلمة سرّك',
+'helplogin-url' => 'Help:تسجيل الدخول',
+'userlogin-helplink' => '[[{{MediaWiki:helplogin-url}}|المساعدة ÙÙŠ تسجيل الدخول]]',
+'userlogin-loggedin' => 'أنت {{GENDER:$1|مسجل|مسجلة}} الدخول مسبقًا باسم $1. {{GENDER:$1|استخدم|استخدمي}} النموذج بالأسÙÙ„ لتسجيل الدخول بحساب آخر.',
+'userlogin-createanother' => 'إنشاء حساب آخر',
+'createacct-join' => 'قم بإدخال المعلومات الخاصة بك أدناه.',
+'createacct-another-join' => 'أدخل معلومات الحساب الجديد أدناه.',
+'createacct-emailrequired' => 'عنوان البريد الإلكتروني',
+'createacct-emailoptional' => 'البريد الإلكتروني (اختياري)',
+'createacct-email-ph' => 'أدخل عنوان بريدك الإلكتروني',
+'createacct-another-email-ph' => 'أدخل عنوان البريد الإلكتروني',
'createaccountmail' => 'استخدم كلمة سر عشوائية مؤقتة وارسلها إلى عنوان البريد الإلكتروني المحدد أدناه',
+'createacct-realname' => 'الاسم الحقيقي (اختياري)',
'createaccountreason' => 'السبب:',
+'createacct-reason' => 'السبب',
+'createacct-reason-ph' => 'لماذا تقوم بإنشاء حساب آخر',
+'createacct-captcha' => 'تحقق أمني',
+'createacct-imgcaptcha-ph' => 'أدخل النص الذي تراه ÙÙŠ الأعلى',
+'createacct-submit' => 'اÙتح الحساب',
+'createacct-another-submit' => 'أنشئ حسابا آخرا',
+'createacct-benefit-heading' => 'موقع {{SITENAME}} أنشأه أشخاص مثلك.',
+'createacct-benefit-body1' => '{{PLURAL:$1|تحريرا|تحريرات}}',
+'createacct-benefit-body2' => '{{PLURAL:$1|صÙحة}}',
+'createacct-benefit-body3' => 'آخر {{PLURAL:$1|مساهم|مساهمين}}',
'badretype' => 'كلمات السر التي أدخلتها لا تتطابق.',
'userexists' => 'اسم المستخدم الذي تم إدخاله مستعمل بالÙعل.
الرجاء اختيار اسم مختلÙ.',
'loginerror' => 'خطأ ÙÙŠ الدخول',
+'createacct-error' => 'خطأ ÙÙŠ إنشاء حساب',
'createaccounterror' => 'تعذر إنشاء حساب المستخدم: $1',
'nocookiesnew' => 'تم إنشاء حساب المستخدم، ولكنك لست مسجل الدخول بعد.
يستخدم {{SITENAME}} كوكيز لتسجيل الدخول.
@@ -984,10 +1029,12 @@ $2',
يمكنك تجاهل هذه الرسالة، لو تم إنشاء هذا الحساب بالخطأ.',
'usernamehasherror' => 'لا يمكن أن يحتوي اسم المستخدم على محار٠هاش',
'login-throttled' => 'لقد قمت بمحاولات دخول كثيرة جدا مؤخرا.
-من Ùضلك انتظر قبل المحاولة مرة أخرى.',
+من Ùضلك انتظر $1 قبل المحاولة مرة أخرى.',
'login-abort-generic' => 'لم ينجح ولوجك - تم إجهاضه',
'loginlanguagelabel' => 'اللغة: $1',
'suspicious-userlogout' => 'رÙض طلب خروجك لأنه يبدو كأنه أرسل عن طريق متصÙØ­ معطوب أو وسيط تخزين.',
+'createacct-another-realname-tip' => 'الاسم الحقيقي اختياري.
+إذا اخترت توÙيره Ùسيستخدم لنسبة عمل المستخدم إليه.',
# Email sending
'php-mail-error-unknown' => "خطأ غير معرو٠ÙÙŠ وظيÙØ© البريد PHP's mail()",
@@ -1004,8 +1051,7 @@ $2',
'newpassword' => 'كلمة السر الجديدة:',
'retypenew' => 'أعد كتابة كلمة السر الجديدة:',
'resetpass_submit' => 'ضبط كلمة السر والدخول',
-'resetpass_success' => 'تم تغيير كلمة المرور الخاصة بك بنجاح!
-يجري تسجيل دخولك...',
+'changepassword-success' => 'تم تغيير كلمة السر بنجاح!',
'resetpass_forbidden' => 'كلمات السر لا يمكن تغييرها',
'resetpass-no-info' => 'يجب أن تكون مسجل الدخول للوصول إلى هذه الصÙحة مباشرة.',
'resetpass-submit-loggedin' => 'تغيير كلمة السر',
@@ -1017,10 +1063,11 @@ $2',
# Special:PasswordReset
'passwordreset' => 'إعادة ضبط كلمة السر',
-'passwordreset-text' => 'أكمل هذا النموذج لإعادة ضبط كلمة السر الخاصة بك.',
+'passwordreset-text-one' => 'أكمل هذا النموذج لإعادة ضبط كلمة السر الخاصة بك.',
+'passwordreset-text-many' => '{{PLURAL:$1||املأ الحقل لتستعيد كلمة السر|املأ أحد الحقلين لتستعيد كلمة السر|املأ أحد الحقول لتستعيد كلمة السر}}.',
'passwordreset-legend' => 'إعادة تعيين كلمة السر',
'passwordreset-disabled' => 'عÙطّلت إعادة تعيين كلمة السر على هذه الويكي.',
-'passwordreset-pretext' => '{{PLURAL:$1||أدخل أحد أجزاء البيانات أدناه}}',
+'passwordreset-emaildisabled' => 'تم تعطيل ميزات البريد الإلكتروني على هذه الويكي.',
'passwordreset-username' => 'اسم المستخدم:',
'passwordreset-domain' => 'النطاق:',
'passwordreset-capture' => 'أأعرض البريد الإلكتروني الناتج؟',
@@ -1043,7 +1090,7 @@ $2
كلمة السر المؤقتة: $2',
'passwordreset-emailsent' => 'Ø£Ùرسل بريد إلكتروني لإعادة ضبط كلمة السر.',
'passwordreset-emailsent-capture' => 'Ø£Ùرسل بريد إلكتروني لإعادة ضبط كلمة السر، وهو معروض بالأسÙÙ„.',
-'passwordreset-emailerror-capture' => 'ولّد بريد إلكتروني تذكيري وهو معروض بالأسÙÙ„ لكن Ùشل إرساله للمستخدم: $1',
+'passwordreset-emailerror-capture' => 'تم توليد رسالة بريد إلكتروني لتصÙير كلمة السر نصّه التالي، إلا أنه تعذّر إرسال الرّسالة إلى {{GENDER:$2|المستخدم|المستخدمة}}: $1',
# Special:ChangeEmail
'changeemail' => 'تغيير عنوان البريد الإلكتروني',
@@ -1057,6 +1104,17 @@ $2
'changeemail-submit' => 'غيّر البريد الإلكتروني',
'changeemail-cancel' => 'إلغاء',
+# Special:ResetTokens
+'resettokens' => 'غير المÙاتيح',
+'resettokens-text' => ' يمكن تغيير المÙاتيح من الاطلاع على البيانات الخصوصية المتعلقة بحسابك.
+غير المÙاتيح إذا أطلعت عليها أحدهم عن طري٠الخطأ أو إذا كان حسابك قد اخترق.',
+'resettokens-no-tokens' => 'ما من Ù…Ùاتيح للتغيير.',
+'resettokens-legend' => 'غير المÙاتيح',
+'resettokens-tokens' => 'Ù…Ùاتيح:',
+'resettokens-token-label' => '$1 (القيمة الحالية: $2)',
+'resettokens-done' => 'تغيير المÙاتيح',
+'resettokens-resetbutton' => 'غير المÙاتيح المختارة',
+
# Edit page toolbar
'bold_sample' => 'نص غليظ',
'bold_tip' => 'نص غليظ',
@@ -1261,12 +1319,15 @@ $2
يبدو أنه تم حذÙها.',
'edit-conflict' => 'تضارب تحريري.',
'edit-no-change' => 'تعديلك تم تجاهله، لأنه لم يحدث أي تعديل للنص.',
+'postedit-confirmation' => 'تعديلك Ø­Ùظ.',
'edit-already-exists' => 'لم يمكن إنشاء صÙحة جديدة.
هي موجودة بالÙعل.',
'defaultmessagetext' => 'نص الرسالة الاÙتراضي',
'content-failed-to-parse' => 'Ùشل ÙÙŠ تحليل $2 محتوى لـ $1 نموذج: $3',
'invalid-content-data' => 'بيانات المحتوى غير صالحة',
'content-not-allowed-here' => '"$1" المحتوى غير مسموح على صÙحة [[$2]]',
+'editwarning-warning' => 'قد تتسبب مغادرة هذه الصÙحة بخسارتك لأي تغييرات أجريتها.
+يمكنك تعطيل هذا التحذير إذا كنت والجًا ÙÙŠ قسم "التحرير" ÙÙŠ تÙضيلاتك.',
# Content models
'content-model-wikitext' => 'نص ويكي',
@@ -1302,6 +1363,7 @@ $2
'undo-failure' => 'لم يمكن استرجاع التعديل بسبب تعديلات متعارضة تمت على الصÙحة.',
'undo-norev' => 'Ùشل ÙÙŠ الرجوع عن التعديل حيث أنه غير موجود أو تم حذÙÙ‡.',
'undo-summary' => 'الرجوع عن التعديل $1 بواسطة [[Special:Contributions/$2|$2]] ([[User talk:$2|نقاش]])',
+'undo-summary-username-hidden' => 'الرجوع عن المراجعة $1 التي أجراها مستخدمي مخÙÙŠ',
# Account creation failure
'cantcreateaccounttitle' => 'لا يمكن إنشاء حساب',
@@ -1484,6 +1546,7 @@ $1",
'compareselectedversions' => 'قارن بين النسختين المختارتين',
'showhideselectedversions' => 'أظهر/أخ٠المراجعات المختارة',
'editundo' => 'رجوع',
+'diff-empty' => '(لا Ùرق)',
'diff-multi' => '({{PLURAL:$1||مراجعة واحدة متوسطة غير معروضة أجراها|مراجعتان متوسطتان غير معروضتين أجراهما|$1 مراجعات متوسطة غير معروضة أجراها|$1 مراجعة متوسطة غير معروضة أجراها}} {{PLURAL:$2||مستخدم واحد|مستخدمان|$2 مستخدمين|$2 مستخدمًا|$2 مستخدم}}.)',
'diff-multi-manyusers' => '({{PLURAL:$1||مراجعة واحدة متوسطة غير معروضة أجراها|مراجعتان متوسطتان غير معروضتان أجراهما|$1 مراجعات متوسطة غير معروضة أجراها|$1 مراجعة متوسطة غير معروضة أجراها}} أكثر من {{PLURAL:$2||مستخدم واحد|مستخدمين|$2 مستخدمين|$2 مستخدمًا|$2 مستخدم}}.)',
'difference-missing-revision' => '{{PLURAL:$2|مراجعة واحدة|$2 مراجعات}} لهذا الÙرق ($1) {{PLURAL:$2|لم|لم}} يتم إيجادها.
@@ -1511,7 +1574,6 @@ $1",
'searchmenu-legend' => 'خيارات البحث',
'searchmenu-exists' => "*الصÙحة '''[[$1]]'''",
'searchmenu-new' => "'''أنشئ الصÙحة \"[[:\$1]]\" ÙÙŠ هذا الويكي!'''",
-'searchhelp-url' => 'Help:محتويات',
'searchmenu-prefix' => '[[Special:PrefixIndex/$1|تصÙØ­ الصÙحات بهذه البادئة]]',
'searchprofile-articles' => 'صÙحات المحتوى',
'searchprofile-project' => 'صÙحات المساعدة والمشروع',
@@ -1555,15 +1617,7 @@ $1",
'searchdisabled' => 'البحث ÙÙŠ {{SITENAME}} معطل.
يمكنك البحث من خلال جوجل ÙÙŠ الوقت الحالي.
لاحظ أن Ùهارسه لمحتوى {{SITENAME}} ربما تكون غير محدثة.',
-
-# Quickbar
-'qbsettings' => 'لوح سريع',
-'qbsettings-none' => 'بلا تحديد',
-'qbsettings-fixedleft' => 'مثبت لليسار',
-'qbsettings-fixedright' => 'مثبت لليمين',
-'qbsettings-floatingleft' => 'حر لليسار',
-'qbsettings-floatingright' => 'حر لليمين',
-'qbsettings-directionality' => 'ثابت، بناءً على اتجاه كتابة لغتك',
+'search-error' => 'حدث خطأ ما أثناء البحث: $1',
# Preferences page
'preferences' => 'تÙضيلات',
@@ -1597,7 +1651,6 @@ $1",
'resetprefs' => 'أزل التغييرات غير المحÙوظة',
'restoreprefs' => 'إسترجع كل الإعدادات الاÙتراضية',
'prefs-editing' => 'التحرير',
-'prefs-edit-boxsize' => 'حجم ناÙذة التحرير.',
'rows' => 'صÙÙˆÙ:',
'columns' => 'أعمدة:',
'searchresultshead' => 'بحث',
@@ -1608,9 +1661,8 @@ $1",
'recentchangesdays-max' => 'الحد الأقصى {{PLURAL:$1|أقل من يوم|يوم واحد|يومان|$1 أيام|$1 يوما|$1 يوم}}',
'recentchangescount' => 'عدد التعديلات الظاهرة مبدئيا:',
'prefs-help-recentchangescount' => 'بما ÙÙŠ ذلك أحدث التغييرات وتاريخ الصÙحات والسجلات.',
-'prefs-help-watchlist-token' => 'سو٠يولد ملء هذا الحقل بمÙتاح سري تغذية RSS لقائمة مراقبتك.
-سو٠يتمكن أي شخص يعر٠مÙتاح هذا الحقل من قراءة قائمة مراقبتك، لذا Ùاختر قيمة منيعة.
-هنا قيمة مولدة تلقائيا تستطيع استخدامها: $1',
+'prefs-help-watchlist-token2' => 'هذا هو المÙتاح السري لتغذية الوÙب لقائمة مراقبتك.
+يمكن لأي شخص يعرÙÙ‡ أن يقرأ قائمة مراقبتك، ولذا لا تتشاركه مع أحد. [[Special:ResetTokens|انقر هنا إذا أردت إعادة ضبطه]].',
'savedprefs' => 'تم Ø­Ùظ تÙضيلاتك.',
'timezonelegend' => 'المنطقة الزمنية:',
'localtime' => 'الوقت المحلي:',
@@ -1641,7 +1693,6 @@ $1",
'prefs-reset-intro' => 'يمكنك استخدام هذه الصÙحة لإعادة تÙضيلاتك للحالة الاÙتراضية للموقع.
لن تستطيع استرجاع الحالة السابقة.',
'prefs-emailconfirm-label' => 'تأكيد البريد الإلكتروني:',
-'prefs-textboxsize' => 'حجم ناÙذة التحرير',
'youremail' => 'البريد:',
'username' => '{{GENDER:$1|اسم المستخدم|اسم المستخدمة}}:',
'uid' => 'رقم {{GENDER:$1|المستخدم|المستخدمة}}:',
@@ -1675,6 +1726,8 @@ $1",
'prefs-dateformat' => 'صيغة الوقت',
'prefs-timeoffset' => 'المنطقة الزمنية',
'prefs-advancedediting' => 'خيارات عامة',
+'prefs-editor' => 'محرر',
+'prefs-preview' => 'عرض مسبق',
'prefs-advancedrc' => 'خيارات متقدمة',
'prefs-advancedrendering' => 'خيارات متقدمة',
'prefs-advancedsearchoptions' => 'خيارات متقدمة',
@@ -1682,7 +1735,9 @@ $1",
'prefs-displayrc' => 'خيارات العرض',
'prefs-displaysearchoptions' => 'خصائص العرض',
'prefs-displaywatchlist' => 'خصائص العرض',
+'prefs-tokenwatchlist' => 'Ù…Ùتاح',
'prefs-diffs' => 'Ùروقات',
+'prefs-help-prefershttps' => 'سيتم تÙعيل هذا التÙضيل عند ولوجوك ÙÙŠ المرة القادمة.',
# User preference: email validation using jQuery
'email-address-validity-valid' => 'يبدو أن عنوان البريد الإلكتروني صالح',
@@ -1709,6 +1764,8 @@ $1",
'userrights-notallowed' => 'ليس لديك إذن لإضاÙØ© أو إزالة صلاحيات المستخدمين.',
'userrights-changeable-col' => 'المجموعات التي يمكنك تغييرها',
'userrights-unchangeable-col' => 'المجموعات التي لا يمكنك تغييرها',
+'userrights-conflict' => 'تضارب ÙÙŠ تغيير صلاحيات المستخدم! الرجاء مراجعة تغييراتك مجدّدا وتأكيدها.',
+'userrights-removed-self' => 'أزلت بنجاح صلاحياتك، ولن تتمكن من الوصول لهذه الصÙحة مجددا.',
# Groups
'group' => 'المجموعة:',
@@ -1774,11 +1831,18 @@ $1",
'right-proxyunbannable' => 'تÙادي عمليات المنع الأوتوماتيكية للبروكسيهات',
'right-unblockself' => 'رÙع المنع عن أنÙسهم',
'right-protect' => 'تغيير مستويات الحماية وتعديل الصÙحات المحمية',
-'right-editprotected' => 'تعديل الصÙحات المحمية (بدون الحماية المضمنة)',
+'right-editprotected' => 'تعديل الصÙحات التي حمايتها "{{int:protect-level-sysop}}"',
+'right-editsemiprotected' => 'تعديل الصÙحات التي حمايتها "{{int:protect-level-autoconfirmed}}"',
'right-editinterface' => 'تعديل واجهة المستخدم',
'right-editusercssjs' => 'تعديل ملÙات CSS Ùˆ JS للمستخدمين الآخرين',
'right-editusercss' => 'تعديل ملÙات CSS للمستخدمين الآخرين',
'right-edituserjs' => 'تعديل ملÙات JS للمستخدمين الآخرين',
+'right-editmyusercss' => 'تعديل ملÙات CSS للمستخدم Ù†Ùسه',
+'right-editmyuserjs' => 'تعديل ملÙات جاÙاسكربت للمستخدم Ù†Ùسه',
+'right-viewmywatchlist' => 'عرض قائمة مراقبتك',
+'right-viewmyprivateinfo' => 'إستعرض بياناتك الشخصية (مثل البريد الإلكتروني والإسم الحقيقي)',
+'right-editmyprivateinfo' => 'حرر بياناتك الشخصية (مثل البريد الإلكتروني والإسم الحقيقي)',
+'right-editmyoptions' => 'تعديل تÙضيلاتك',
'right-rollback' => 'استرجاع تعديلات آخر مستخدم عدل صÙحة معينة سريعا',
'right-markbotedits' => 'التعليم على تعديلات الاسترجاع كتعديلات بوت',
'right-noratelimit' => 'غير متأثر بحدود المعدل',
@@ -1830,8 +1894,8 @@ $1",
'action-block' => 'منع هذا المستخدم من التعديل',
'action-protect' => 'تغيير مستويات الحماية لهذه الصÙحة',
'action-rollback' => 'استرجاع تعديلات آخر مستخدم عدل صÙحة معينة سريعا',
-'action-import' => 'استيراد هذه الصÙحة من ويكي آخر',
-'action-importupload' => 'استيراد هذه الصÙحة من مل٠مرÙوع',
+'action-import' => 'استيراد صÙحات من ويكي آخر',
+'action-importupload' => 'استيراد صÙحات من مل٠مرÙوع',
'action-patrol' => 'تعليم تعديلات الآخرين بعلامة المراجعة',
'action-autopatrol' => 'جعل تعديلك معلم عليه كمراجع',
'action-unwatchedpages' => 'رؤية قائمة الصÙحات غير المراقبة',
@@ -1840,12 +1904,19 @@ $1",
'action-userrights-interwiki' => 'تعديل صلاحيات المستخدم للمستخدمين ÙÙŠ الويكيات الأخرى',
'action-siteadmin' => 'غلق أو رÙع غلق قاعدة البيانات',
'action-sendemail' => 'إرسال رسائل بريد إلكتروني',
+'action-editmywatchlist' => 'تعديل قائمة مراقبتك',
+'action-viewmywatchlist' => 'مشاهدة قائمة مراقبتك',
+'action-viewmyprivateinfo' => 'مشاهدة معلوماتك الخاصة',
+'action-editmyprivateinfo' => 'تعديل معلوماتك الخاصة',
# Recent changes
'nchanges' => '{{PLURAL:$1|لا تغييرات|تغيير واحد|تغييران|$1 تغييرات|$1 تغييرا|$1 تغيير}}',
+'enhancedrc-since-last-visit' => '$1 {{PLURAL:$1|منذ الزيارة الأخيرة}}',
+'enhancedrc-history' => 'تاريخ',
'recentchanges' => 'أحدث التغييرات',
'recentchanges-legend' => 'خيارات أحدث التغييرات',
'recentchanges-summary' => 'تابع آخر التغييرات ÙÙŠ الويكي من هذه الصÙحة.',
+'recentchanges-noresult' => 'لا توجد تغييرات خلال الÙترة المحددة تطابق هذه المعايير.',
'recentchanges-feed-description' => 'تابع أحدث التغييرات للويكي عبر هذه التلقيمة.',
'recentchanges-label-newpage' => 'أنشأ هذا التعديل صÙحة جديدة',
'recentchanges-label-minor' => 'هذا تعديل Ø·ÙÙŠÙ',
@@ -1882,7 +1953,6 @@ $1",
'recentchangeslinked-feed' => 'تغييرات ذات علاقة',
'recentchangeslinked-toolbox' => 'تغييرات ذات علاقة',
'recentchangeslinked-title' => 'التغييرات المرتبطة ب "$1"',
-'recentchangeslinked-noresult' => 'لم تحدث تعديلات ÙÙŠ الصÙحات التي لها وصلات هنا خلال الÙترة المحددة.',
'recentchangeslinked-summary' => "هذه قائمة بالتغييرات التي تمت حديثا للصÙحات الموصولة من صÙحة معينة (أو إلى الأعضاء ضمن تصني٠معين).
الصÙحات ÙÙŠ [[Special:Watchlist|قائمة مراقبتك]] '''مغلظة'''",
'recentchangeslinked-page' => 'اسم الصÙحة:',
@@ -1894,7 +1964,7 @@ $1",
'reuploaddesc' => 'إلغاء الرÙع والرجوع إلى استمارة الرÙع',
'upload-tryagain' => 'أرسل وص٠مل٠معدل',
'uploadnologin' => 'غير مسجل الدخول',
-'uploadnologintext' => 'يتوجب عليك [[Special:UserLogin|تسجيل الدخول]] لرÙع الملÙات.',
+'uploadnologintext' => 'يجب عليك $1 لترÙع الملÙات.',
'upload_directory_missing' => 'مجلد الرÙع ($1) Ù…Ùقود ولم يمكن إنشاؤه بواسطة خادوم الوب.',
'upload_directory_read_only' => 'مجلد الرÙع ($1) لا يمكن الكتابة عليه بواسطة خادوم الوب.',
'uploaderror' => 'خطأ ÙÙŠ الرÙع',
@@ -2127,7 +2197,6 @@ $1',
'http-read-error' => 'خطأ قراءة HTTP.',
'http-timed-out' => 'انتهت مهلة طلب HTTP.',
'http-curl-error' => 'Ùشل جلب المسار: $1',
-'http-host-unreachable' => 'تعذر الوصول إلى المسار.',
'http-bad-status' => 'ثمة مشكلة أثناء طلب HTTP: $1 $2',
# Some likely curl errors. More could be added from <http://curl.haxx.se/libcurl/c/libcurl-errors.html>
@@ -2158,6 +2227,10 @@ $1',
'listfiles_size' => 'الحجم',
'listfiles_description' => 'الوصÙ',
'listfiles_count' => 'نسخ',
+'listfiles-show-all' => 'أدرج النسخ القديمة من الصور',
+'listfiles-latestversion' => 'النسخة الحالية',
+'listfiles-latestversion-yes' => 'نعم',
+'listfiles-latestversion-no' => 'لا',
# File description page
'file-anchor-link' => 'ملÙ',
@@ -2257,6 +2330,13 @@ $1',
'randompage' => 'صÙحة عشوائية',
'randompage-nopages' => 'لا توجد صÙحات ÙÙŠ {{PLURAL:$2||النطاق التالي|النطاقين التاليين|النطاقات التالية}}: $1.',
+# Random page in category
+'randomincategory' => 'صÙحة عشوائية ÙÙŠ التصنيÙ',
+'randomincategory-invalidcategory' => '"$1" ليس اسم تصني٠صالح.',
+'randomincategory-nopages' => 'لا توجد صÙحات ÙÙŠ التصني٠[[:Category:$1|$1]].',
+'randomincategory-selectcategory' => 'عرض صÙحة عشوائية من التصنيÙ: $1 $2',
+'randomincategory-selectcategory-submit' => 'اذهب',
+
# Random redirect
'randomredirect' => 'تحويلة عشوائية',
'randomredirect-nopages' => 'لا توجد تحويلات ÙÙŠ النطاق "$1".',
@@ -2282,12 +2362,6 @@ $1',
'statistics-users-active-desc' => 'المستخدمون الذين قاموا بÙعل ÙÙŠ آخر {{PLURAL:$1||يوم|يومين|$1 أيام|$1 يوماً|$1 يوم}}',
'statistics-mostpopular' => 'أكثر الصÙحات مشاهدة',
-'disambiguations' => 'الصÙحات التي ترتبط بصÙحات توضيح',
-'disambiguationspage' => 'Template:توضيح',
-'disambiguations-text' => "الصÙحات التالية تحتوي على وصلة واحدة على الأقل إلى '''صÙحة توضيح'''.
-ربما ينبغي أن تصل إلى صÙحة أكثر ملائمة. <br />
-تعامل الصÙحة كصÙحة توضيح إذا كان بها قالب موجود ÙÙŠ [[MediaWiki:Disambiguationspage]]",
-
'pageswithprop' => 'صÙحات مع خاصية الصÙحة',
'pageswithprop-legend' => 'صÙحات مع خاصية الصÙحة',
'pageswithprop-text' => 'تسرد هذه الصÙحة الصÙحات التي تستخدم خاصية صÙحة معينة.',
@@ -2350,6 +2424,7 @@ $1',
'mostrevisions' => 'أكثر الصÙحات تعديلا',
'prefixindex' => 'كل الصÙحات بالبادئة',
'prefixindex-namespace' => 'كل الصÙحات مع بادئة ($1 مساحة الأسم)',
+'prefixindex-strip' => 'أخ٠البادئة من القائمة',
'shortpages' => 'صÙحات قصيرة',
'longpages' => 'صÙحات طويلة',
'deadendpages' => 'صÙحات نهاية مسدودة',
@@ -2365,6 +2440,7 @@ $1',
'listusers' => 'قائمة الأعضاء',
'listusers-editsonly' => 'اعرض المستخدمين الذين أجروا تعديلات Ùقط',
'listusers-creationsort' => 'رتب حسب تاريخ الإنشاء',
+'listusers-desc' => 'رتب تنازليا',
'usereditcount' => '{{PLURAL:$1|لا تعديلات|تعديل واحد|تعديلان|$1 تعديلات|$1 تعديلًا|$1 تعديل}}',
'usercreated' => '{{GENDER:$3|أنشأه|أنشأته}} ÙÙŠ $1 الساعة $2',
'newpages' => 'صÙحات جديدة',
@@ -2542,10 +2618,9 @@ $1',
'unwatchthispage' => 'أوق٠المراقبة',
'notanarticle' => 'ليست صÙحة محتوى',
'notvisiblerev' => 'المراجعة تم حذÙها',
-'watchnochange' => 'لم تÙعدّل أي صÙحة ÙÙŠ قائمة مراقبتك خلال الÙترة الزمنية المحددة.',
'watchlist-details' => '{{PLURAL:$1||صÙحة واحدة|صÙحتان|$1 صÙحات|$1 صÙحة}} ÙÙŠ قائمة مراقبتك، بدون عد صÙحات النقاش.',
-'wlheader-enotif' => '* الإخطار بالبريد الإلكتروني Ù…Ùعل.',
-'wlheader-showupdated' => "* الصÙحات التي تم تحريرها بعد زيارتك لها لآخر مرة معروضة بالخط '''الغليظ'''",
+'wlheader-enotif' => 'الإخطار بالبريد الإلكتروني Ù…ÙÙعّل.',
+'wlheader-showupdated' => "الصÙحات التي تم تحريرها بعد مطالعتك إياها آخر مرة عناوينها بالخط '''الغليظ'''",
'watchmethod-recent' => 'Ùحص التعديلات الأخيرة للصÙحات المراقبة',
'watchmethod-list' => 'Ùحص الصÙحات المراقبة للتعديلات الحديثة',
'watchlistcontains' => 'تحتوي قائمة مراقبتك على {{PLURAL:$1|لا صÙحات|صÙحة واحدة|صÙحتان|$1 صÙحات|$1 صÙحة}}.',
@@ -2958,16 +3033,14 @@ $1',
لكنه ممنوع كجزء من النطاق $2ØŒ والذي يمكن رÙع المنع عنه.',
'ip_range_invalid' => 'نطاق عناوين الأيبي المدخل غير صحيح.',
'ip_range_toolarge' => 'لا يسمح بنطاقات المنع الأكبر من /$1',
-'blockme' => 'امنعني',
'proxyblocker' => 'مانع البروكسي',
-'proxyblocker-disabled' => 'هذه الخاصية معطلة.',
'proxyblockreason' => 'تم منع عنوان الأيبي الخاص بك لكونه بروكسي Ù…Ùتوح.
من Ùضلك اتصل بمزود خدمة الإنترنت الخاص بك أو الدعم الÙني وأعلمهم بهذه المشكلة الأمنية الخطيرة.',
-'proxyblocksuccess' => 'تم.',
'sorbs' => 'دي إن إس بي إل',
'sorbsreason' => 'عنوان الأيبي الخاص بك موجود كبروكسي Ù…Ùتوح ÙÙŠ DNSBL المستخدم بواسطة {{SITENAME}}.',
'sorbs_create_account_reason' => 'عنوان الأيبي الخاص بك موجود كبروكسي Ù…Ùتوح ÙÙŠ DNSBL المستخدم بواسطة {{SITENAME}}.
لا يمكنك إنشاء حساب.',
+'xffblockreason' => 'عنوان آي‌بي مذكور ÙÙŠ ترويسة X-Forwarded-ForØŒ الذي ربما يخصّك أو يخصّ خادوما وسيطا تستخدمه، قد Ø­ÙظÙر. السبب الأصلي للحظر كان: $1',
'cant-block-while-blocked' => 'أنت لا يمكنك منع المستخدمين الآخرين بينما أنت ممنوع.',
'cant-see-hidden-user' => 'المستخدم الذي تحاول منعه تم منعه سابقاً وإخÙاؤه. بما أنك لا تمتلك صلاحية إخÙاء المستخدم، لا يمكنك مشاهدة المنع أو تعديله.',
'ipbblocked' => 'لا يمكنك منع أو رÙع منع مستخدمين آخرين لأنك ممنوع',
@@ -3134,6 +3207,8 @@ $1',
'thumbnail-more' => 'كبّر',
'filemissing' => 'المل٠مÙقود',
'thumbnail_error' => 'خطأ ÙÙŠ إنشاء صورة مصغرة: $1',
+'thumbnail_error_remote' => 'رسالة عطل من $1:
+$2',
'djvu_page_error' => 'صÙحة DjVu خارج النطاق',
'djvu_no_xml' => 'لا يمكن جلب XML لمل٠DjVu',
'thumbnail-temp-create' => 'تعذر إنشاء مل٠الصورة المصغرة المؤقت',
@@ -3286,17 +3361,11 @@ $1',
# Stylesheets
'common.css' => '/* ستؤثر الأنماط المتراصة (CSS) المعروضة هنا على كل الواجهات */',
-'standard.css' => '/* الأنماط المتراصة CSS المعروضة هنا ستؤثر على مستخدمي واجهة ستاندرد */',
-'nostalgia.css' => '/* الأنماط المتراصة CSS المعروضة هنا ستؤثر على مستخدمي واجهة نوستالشيا */',
'cologneblue.css' => '/* الأنماط المتراصة CSS المعروضة هنا ستؤثر على مستخدمي واجهة كولون بلو */',
'monobook.css' => '/* الأنماط المتراصة CSS المعروضة هنا ستؤثر على مستخدمي واجهة مونوبوك */',
-'myskin.css' => '/* الأنماط المتراصة CSS المعروضة هنا ستؤثر على مستخدمي واجهة ماي سكين */',
-'chick.css' => '/* الأنماط المتراصة CSS المعروضة هنا ستؤثر على مستخدمي واجهة تشيك */',
-'simple.css' => '/* الأنماط المتراصة CSS المعروضة هنا ستؤثر على مستخدمي واجهة سيمبل */',
'modern.css' => '/* الأنماط المتراصة CSS المعروضة هنا ستؤثر على مستخدمي واجهة مودرن */',
'vector.css' => '/* الأنماط المتراصة CSS المعروضة هنا ستؤثر على مستخدمي واجهة Ùكتور */',
'print.css' => '/* الأنماط المتراصة CSS المعروضة هنا ستؤثر على ناتج الطباعة */',
-'handheld.css' => '/* الأنماط المتراصة CSS المعروضة هنا ستؤثر على الأجهزة المحمولة بالاعتماد على الواجهة المضبوطة ÙÙŠ $wgHandheldStyle */',
'noscript.css' => '/* الأنماط المتراصة CSS المعروضة هنا ستؤثر على المستخدمين الذين الجاÙاسكريبت لديهم معطلة */',
'group-autoconfirmed.css' => '/* الأنماط المتراصة CSS المعروضة هنا ستؤثر على المستخدمين المؤكدين تلقائيا Ùقط */',
'group-bot.css' => '/* الأنماط المتراصة CSS المعروضة هنا ستؤثر على البوتات Ùقط */',
@@ -3305,13 +3374,8 @@ $1',
# Scripts
'common.js' => '/* الجاÙاسكريبت الموضوع هنا سيتم تحميله لكل المستخدمين مع كل تحميل للصÙحة. */',
-'standard.js' => '/* أي جاÙاسكريبت هنا سيتم تحميلها للمستخدمين الذين يستعملون واجهة ستاندرد */',
-'nostalgia.js' => '/* أي جاÙاسكريبت هنا سيتم تحميلها للمستخدمين الذين يستعملون واجهة نوستالشيا */',
'cologneblue.js' => '/* أي جاÙاسكريبت هنا سيتم تحميلها للمستخدمين الذين يستعملون واجهة كولون بلو */',
'monobook.js' => '/* أي جاÙاسكريبت هنا سيتم تحميلها للمستخدمين الذين يستعملون واجهة مونوبوك */',
-'myskin.js' => '/* أي جاÙاسكريبت هنا سيتم تحميلها للمستخدمين الذين يستعملون واجهة ماي سكين */',
-'chick.js' => '/* أي جاÙاسكريبت هنا سيتم تحميلها للمستخدمين الذين يستعملون واجهة تشيك */',
-'simple.js' => '/* أي جاÙاسكريبت هنا سيتم تحميلها للمستخدمين الذين يستعملون واجهة سيمبل */',
'modern.js' => '/* أي جاÙاسكريبت هنا سيتم تحميلها للمستخدمين الذين يستعملون واجهة مودرن */',
'vector.js' => '/* أي جاÙاسكريبت هنا سيتم تحميلها للمستخدمين الذين يستعملون واجهة Ùكتور */',
'group-autoconfirmed.js' => '/* أي جاÙاسكريبت هنا سيتم تحميلها للمستخدمين المؤكدين تلقائيا Ùقط */',
@@ -3391,13 +3455,8 @@ $1',
'pageinfo-category-files' => 'عدد الملÙات',
# Skin names
-'skinname-standard' => 'كلاسيك',
-'skinname-nostalgia' => 'نوستالجيا',
'skinname-cologneblue' => 'كولون بلو',
'skinname-monobook' => 'مونوبوك',
-'skinname-myskin' => 'ماي سكين',
-'skinname-chick' => 'تشيك',
-'skinname-simple' => 'سيمبل',
'skinname-modern' => 'مودرن',
'skinname-vector' => 'Ùكتور',
@@ -3480,11 +3539,25 @@ $1',
'minutes' => '{{PLURAL:$1||دقيقة واحدة|دقيقتين|$1 دقائق|$1 دقيقة}}',
'hours' => '{{PLURAL:$1||ساعة واحدة|ساعتين|$1 ساعات|$1 ساعة}}',
'days' => '{{PLURAL:$1||يوم واحد|يومين|$1 أيام|$1 يومًا|$1 يوم}}',
+'weeks' => '{{PLURAL:$1|أسبوع|$1 أسابيع}}',
'months' => '{{PLURAL:$1||شهر واحد|شهرين|$1 شهور|$1 شهرا|$1 شهر}}',
'years' => '{{PLURAL:$1||سنة واحدة|سنتين|$1 سنين|$1 سنة}}',
'ago' => 'قبل $1',
'just-now' => 'الآن Ùقط',
+# Human-readable timestamps
+'hours-ago' => 'منذ {{PLURAL:$1|ساعة|$1 ساعات}}',
+'minutes-ago' => 'منذ {{PLURAL:$1|دقيقة|$1 دقائق}}',
+'seconds-ago' => 'منذ {{PLURAL:$1|ثانية|$1 ثوان}}',
+'monday-at' => 'يوم الاثنين الساعة $1',
+'tuesday-at' => 'يوم الثلاثاء الساعة $1',
+'wednesday-at' => 'يوم الأربعاء الساعة $1',
+'thursday-at' => 'يوم الخميس الساعة $1',
+'friday-at' => 'يوم الجمعة الساعة $1',
+'saturday-at' => 'يوم السبت الساعة $1',
+'sunday-at' => 'يوم الأحد الساعة $1',
+'yesterday-at' => 'يوم أمس الساعة $1',
+
# Bad image list
'bad_image_list' => 'الصيغة كالتالي:
@@ -3514,7 +3587,7 @@ $1',
* gpslongitude
* gpsaltitude',
-# EXIF tags
+# Exif tags
'exif-imagewidth' => 'العرض',
'exif-imagelength' => 'الارتÙاع',
'exif-bitspersample' => 'بت لكل مكونة',
@@ -3697,7 +3770,7 @@ $1',
# Make & model, can be wikified in order to link to the camera and model name
'exif-subjectnewscode-value' => '$2 ($1)',
-# EXIF attributes
+# Exif attributes
'exif-compression-1' => 'غير مضغوط',
'exif-compression-2' => 'CCITT المجموعة 3 -1 تعديل طول تشغيل ترميز هوÙمان البعدي',
'exif-compression-3' => 'ترميز Ùاكس المجموعة 3 CCITT',
@@ -4206,7 +4279,6 @@ $5
'version-other' => 'أخرى',
'version-mediahandlers' => 'متحكمات الميديا',
'version-hooks' => 'الخطاطيÙ',
-'version-extension-functions' => 'وظائ٠الامتداد',
'version-parser-extensiontags' => 'وسوم امتداد المحلل',
'version-parser-function-hooks' => 'خطاطي٠دالة المحلل',
'version-hook-name' => 'اسم الخطاÙ',
@@ -4216,6 +4288,7 @@ $5
'version-license' => 'الرخصة',
'version-poweredby-credits' => "تدار هذه الويكي بواسطة '''[//www.mediawiki.org/ ميدياويكي]'''، حقوق النشر © 2001-$1 $2.",
'version-poweredby-others' => 'آخرون',
+'version-poweredby-translators' => 'مترجمو translatewiki.net',
'version-credits-summary' => 'نود أن نعر٠بالأشخاص التالية أسماؤهم لمساهمتهم ÙÙŠ [[Special:Version|ميدياويكي]].',
'version-license-info' => "ميدياويكي برنامج حر، يحق لك توزيعه Ùˆ/أو تعديله ÙˆÙقاً لبنود رخصة غنو العمومية كما نشرتها مؤسسة البرمجيات الحرة، الإصدار الثاني أو (ÙˆÙقا لاختيارك أنت) أي إصدار لاحق.
@@ -4231,12 +4304,17 @@ $5
'version-entrypoints-articlepath' => '[https://www.mediawiki.org/wiki/Manual:$wgArticlePath مسار المقالات]',
'version-entrypoints-scriptpath' => '[https://www.mediawiki.org/wiki/Manual:$wgScriptPath مسار السكريبت]',
-# Special:FilePath
-'filepath' => 'مسار ملÙ',
-'filepath-page' => 'الملÙ:',
-'filepath-submit' => 'اذهب',
-'filepath-summary' => 'هذه الصÙحة الخاصة تعرض المسار الكامل لملÙ.
-ستعرض الصور بأقصى دقة، ستعمل أنواع الملÙات الأخرى بالبرنامج المخصص لهم مباشرة.',
+# Special:Redirect
+'redirect' => 'تحويل باسم مل٠أو اسم مستخدم أو رقم مراجعة',
+'redirect-legend' => 'تحويل إلى مل٠أو صÙحة',
+'redirect-summary' => 'هذه الصÙحة الخاصة تحوّل إلى مل٠(باسمه) أو صÙحة (برقم إحدى مراجعاتها) أو إلى صÙحة مستخدم (برقمه التعريÙÙŠ).',
+'redirect-submit' => 'حوّل',
+'redirect-lookup' => 'ابحث ÙÙŠ:',
+'redirect-value' => 'الوجهة',
+'redirect-user' => 'رقم مستخدم',
+'redirect-revision' => 'مراجعة صÙحة',
+'redirect-file' => 'اسم ملÙ',
+'redirect-not-exists' => 'المطلوب غير موجود',
# Special:FileDuplicateSearch
'fileduplicatesearch' => 'بحث عن ملÙات مكررة',
@@ -4286,12 +4364,16 @@ $5
'tags' => 'وسوم التغيير الصحيحة',
'tag-filter' => 'مرشح [[Special:Tags|الوسوم]]:',
'tag-filter-submit' => 'مرشح',
+'tag-list-wrapper' => '([[Special:Tags|{{PLURAL:$1||وسم|وسمان|وسوم}}]]: $2)',
'tags-title' => 'وسوم',
'tags-intro' => 'هذه الصÙحة تعرض الوسوم التي ربما يعلم البرنامج تعديلا بها، ومعانيها.',
'tags-tag' => 'اسم الوسم',
'tags-display-header' => 'الظهور ÙÙŠ قوائم التغييرات',
'tags-description-header' => 'وص٠كامل للمعنى',
+'tags-active-header' => 'نشط؟',
'tags-hitcount-header' => 'تغييرات موسومة',
+'tags-active-yes' => 'نعم',
+'tags-active-no' => 'لا',
'tags-edit' => 'عدل',
'tags-hitcount' => '{{PLURAL:$1|لا تغييرات|تغيير واحد|تغييران|$1 تغييرات|$1 تغييرا|$1 تغيير}}',
@@ -4312,6 +4394,7 @@ $5
'dberr-problems' => 'عذرا! هذا الموقع يعاني من صعوبات تقنية.',
'dberr-again' => 'جرب الانتظار بضع دقائق وإعادة التحميل.',
'dberr-info' => '(غير قادر على الاتصال بخادوم قاعدة البيانات: $1)',
+'dberr-info-hidden' => '(لا يمكن الإتصال بخادم قاعدة البيانات)',
'dberr-usegoogle' => 'يمكنك محاولة البحث من خلال جوجل ÙÙŠ الوقت الحاضر.',
'dberr-outofdate' => 'لاحظ أن Ùهارسهم لمحتوانا ربما تكون غير محدثة.',
'dberr-cachederror' => 'التالي نسخة مخزنة من الصÙحة المطلوبة، وربما لا تكون محدثة.',
@@ -4327,6 +4410,9 @@ $5
'htmlform-submit' => 'إرسال',
'htmlform-reset' => 'الرجوع عن التغييرات',
'htmlform-selectorother-other' => 'أخرى',
+'htmlform-no' => 'لا',
+'htmlform-yes' => 'نعم',
+'htmlform-chosen-placeholder' => 'اختر',
# SQLite database support
'sqlite-has-fts' => '$1 بدعم البحث ÙÙŠ كامل النص',
@@ -4444,4 +4530,12 @@ $5
# Image rotation
'rotate-comment' => 'تدوير الصورة {{PLURAL:$1||درجة واحدة|درجتان|$1 درجات|$1 درجة}} باتجاه عقارب الساعة',
+# Limit report
+'limitreport-cputime' => 'زمن المعالجة المستغرق',
+'limitreport-cputime-value' => '{{PLURAL:$1|أقل من ثانية|ثانية واحدة|ثانيتان|$1 ثوان|$1 ثانية}}',
+'limitreport-walltime' => 'الزمن الحقيقي المستغرق',
+'limitreport-walltime-value' => '{{PLURAL:$1|أقل من ثانية|ثانية واحدة|ثانيتان|$1 ثوان|$1 ثانية}}',
+'limitreport-postexpandincludesize-value' => '$1/$2 بايت',
+'limitreport-templateargumentsize-value' => '$1/$2 بايت',
+
);
diff --git a/languages/messages/MessagesArc.php b/languages/messages/MessagesArc.php
index be03e5fa..33b463c6 100644
--- a/languages/messages/MessagesArc.php
+++ b/languages/messages/MessagesArc.php
@@ -159,6 +159,7 @@ $messages = array(
'tog-watchlisthideanons' => 'Ü›Ü«Ü Ü«Ü˜ÜšÜ Ü¦ÌˆÜ Ü•Ü¡Ü¦Ü ÜšÜ¢ÌˆÜ Ü Ü Üܕ̈ÜÜ¥Ü Ü¡Ü¢ ܪ̈ܗÜܬÜ',
'tog-ccmeonemails' => 'ܫܕܪ Ü Ü Ü¨ÜšÜšÌˆÜ Ü•Ü’ÜÜ Ü•ÜªÌˆÜ Üܠܩܛܪ̈ܘܢÜÜ Ü•Ü«Ü•Üª ÜÜ¢Ü Ü Ü¡Ü¦Ü ÜšÜ¢ÌˆÜ Üܚܪ̈ܢÜ',
'tog-showhiddencats' => 'ÜšÜ˜Ü Ü£Ü•ÜªÌˆÜ Ü›Ü˜Ü«Ü̈Ü',
+'tog-useeditwarning' => 'ܙܗܪ Ü Ü ÜÜ¡Ü¬Ü Ü«Ü’Ü© ÜÜ¢Ü Ü¦ÜÜ¬Ü Ü•Ü«Ü˜ÜšÜ Ü¦Ü Ü•ÜÜܬ Ü’Ü— Ü«Ü˜ÜšÜ Ü¦ÌˆÜ Ü Ü Ü Ü’Üܟ̈Ü',
'underline-always' => 'ÜÜ¡ÜÜ¢',
'underline-never' => 'Ü Ü Ü¡Ü¡Ü¬Ü˜Ü¡',
@@ -333,7 +334,7 @@ $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).
+# 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).
'aboutsite' => 'ܡܢܘ {{SITENAME}}',
'aboutpage' => 'Project:ܡܢܘ',
'copyright' => 'ܚܒÜÜ«Ü¬ÌˆÜ ÜÜܬ ܬܚÜܬ $1 ÜÜ¢ Ü Üܬ ܠܩܘܒܠÜ.',
@@ -343,7 +344,6 @@ $1',
'disclaimers' => 'Ü Ü Ü¡Ü«Ü¬ÜܠܢܘܬÜ',
'disclaimerpage' => 'Project:Ü Ü Ü¡Ü«Ü¬ÜÜ Ü¢Ü˜Ü¬Ü Ü“Ü˜Ü¢ÜܬÜ',
'edithelp' => 'Ü¥Ü˜Ü•ÜªÜ¢Ü Ü Ü«ÜšÜ Ü¦Ü¬Ü',
-'edithelppage' => 'Help:ܫܚܠܦܬÜ',
'helppage' => 'Help:ܚܒÜܫܬ̈Ü',
'mainpage' => 'ܦÜÜ¬Ü ÜªÜÜ«ÜܬÜ',
'mainpage-description' => 'ܦÜÜ¬Ü ÜªÜÜ«ÜܬÜ',
@@ -422,7 +422,6 @@ $1',
'editinginterface' => "'''ܙܘܗܪÜ:''' Üܢܬ ܬܫܚܠܦ ܦÜÜ¬Ü Ü•Ü¡Ü¬Ü¦Ü ÜšÜ¬ ܒܚܙÜÜ ÜŸÜ¬ÜÜ’ÜÜ Ü•Ü¬ÜšÜªÜ™Ü¬Ü.
ÜŸÜ  Ü«Ü˜ÜšÜ Ü¦Ü Ü’Ü¦ÜÜ¬Ü Ü—Ü•Ü Ü¢Ü—Ü˜Ü Ü Ü— Ü¡Ü¥Ü’Ü•Ü¢Ü˜Ü¬Ü Ü¥Ü  Üܣܟܡ ܦÜÜ¬Ü Ü•Ü¡Ü¦Ü ÜšÜ¢Ü Ü•Ü¡Ü¦Ü ÜšÜ¢ÌˆÜ ÜÜšÜªÌˆÜ¢Ü Ü’Ü˜ÜÜ©Ü Ü—Ü¢Ü.
ܠܡܘܣܦ Üܘ ܫܘܚܠܦ Ü¬Ü˜ÜªÌˆÜ“Ü¡Ü Ü•ÜŸÜ Ü—Ü˜Ü¢ ܘÜÜ©ÜØŒ Üܦܠܚ [//translatewiki.net/ translatewiki.net]ØŒ ܬܪܡÜÜ¬Ü Ü•Ü¬Ü˜ÜªÜ“Ü¡Ü Ü•Ü¡ÜÜ•ÜÜܘÜÜ©Ü.",
-'sqlhidden' => '(Ü’Ü˜Ü¬Ü¬Ü SQL ܛܫÜÜ)',
'namespaceprotected' => "Ü Üܬ Ü ÜŸ Ü¦Ü£Ü£Ü Ü Ü«ÜšÜ Ü¦Ü¬Ü Ü•Ü¦ÜÜ¬Ü¬ÌˆÜ Ü’ÜšÜ©Ü Ü Ü•'''$1'''.",
'exception-nologin' => 'Ü ÜܬÜÜŸ ܥܠÜÜ Ü',
@@ -434,9 +433,18 @@ $1',
ܚܕ ÜŸÜ¡Ü Ü¡Ü¢ ܦÜÜ¬Ü¬ÌˆÜ Ü¡Ü¬ÜšÜ™ÜÜ¢ ÜÜÜŸ ܕܗܘ Üܢܬ ܥܠÜÜ Ü ÜÜܬÜÜŸ Ü¥Ü•Ü¡Ü Ü•Üܣܦܩܬ ܠܦÜÜ¬Ü¬ÌˆÜ Ü Ü’ÜÜŸÜ¬ÌˆÜ Ü•Ü¡Ü¦ÜÜ¬Ü¢Ü Ü•ÜÜ ÜŸ.",
'welcomeuser' => 'Ü’Ü«ÜÜ¢Ü $1!',
'yourname' => 'Ü«Ü¡Ü Ü•Ü¡Ü¦Ü ÜšÜ¢Ü:',
+'userlogin-yourname' => 'Ü«Ü¡Ü Ü•Ü¡Ü¦Ü ÜšÜ¢Ü',
+'userlogin-yourname-ph' => 'Üܥܠ Ü«Ü¡Ü Ü•Ü¡Ü¦Ü ÜšÜ¢Ü Ü•ÜÜ ÜŸ',
'yourpassword' => 'Ü¡Ü Ü¬Ü Ü•Ü¥Ü Ü Ü:',
+'userlogin-yourpassword' => 'Ü¡Ü Ü¬Ü Ü•Ü¥Ü Ü Ü',
+'userlogin-yourpassword-ph' => 'Üܥܠ Ü¡Ü Ü¬Ü Ü•Ü¥Ü Ü Ü Ü•ÜÜ ÜŸ',
+'createacct-yourpassword-ph' => 'Üܥܠ Ü¡Ü Ü¬Ü Ü•Ü¥Ü Ü Ü',
'yourpasswordagain' => 'ܟܬܘܒ Ü¡Ü Ü¬Ü Ü•Ü¥Ü Ü Ü Ü™Ü’Ü¢Ü¬Ü ÜܚܪܬÜ:',
+'createacct-yourpasswordagain' => 'ܫܪܪ Ü¡Ü Ü¬Ü Ü•Ü¥Ü Ü Ü',
+'createacct-yourpasswordagain-ph' => 'Üܥܠ Ü¡Ü Ü¬Ü Ü•Ü¥Ü Ü Ü Ü™Ü’Ü¢ ÜܚܪÜÜ¢',
'remembermypassword' => 'ܕܟܘܪ Ü¥Ü Ü Ü¬Ü Ü¥Ü  ܡܦÜÜ¬Ü¢Ü Ü—Ü¢Ü (Ü Ü¡Ü¬ÜšÜ Ü¥Ü ÜÜ Ü• $1 {{PLURAL:$1|ÜܘܡÜ|Üܘܡܬ̈Ü}})',
+'userlogin-remembermypassword' => 'ܫܒܘܩ Ü Ü Ü¥Ü ÜÜ Ü Ü’ÜšÜ˜Ü«Ü’Ü¢Ü',
+'userlogin-signwithsecure' => 'Üܚܫܚ Ü•Ü’ÜÜ©Ü˜Ü¬Ü Ü¡Ü«ÜܢܢܬÜ',
'login' => 'ܥܘܠ',
'nav-login-createaccount' => 'ܥܘܠ / Ü’ÜªÜ ÜšÜ˜Ü«Ü’Ü¢Ü',
'loginprompt' => 'ÜÜ Ü¨Ü Ü Ü¡Ü¦ÜÜ¬Ü¢Ü Ü•ÜÜ ÜŸ ܕܣܡܟ ܠܩܘܩÜÜ™ (cookies) Ü Ü¥Ü Ü Ü¬Ü Ü’ {{SITENAME}}.',
@@ -445,14 +453,25 @@ $1',
'logout' => 'ܦܠܘܛ',
'userlogout' => 'ܦܠܘܛ',
'notloggedin' => 'Ü ÜܬÜÜŸ ܥܠÜÜ Ü',
+'userlogin-noaccount' => 'Ü Üܬ Ü ÜŸ ܚܘܫܒܢÜØŸ',
+'userlogin-joinproject' => 'ܢܩܦ ܥܡ {{SITENAME}}',
'nologin' => "Ü Üܬ Ü ÜŸ ܚܘܫܒܢÜØŸ '''$1'''.",
'nologinlink' => 'Ü’ÜªÜ ÜšÜ˜Ü«Ü’Ü¢Ü',
'createaccount' => 'Ü’ÜªÜ ÜšÜ˜Ü«Ü’Ü¢Ü',
'gotaccount' => "ÜÜܬ Ü ÜŸ ܚܘܫܒܢÜØŸ '''$1'''.",
'gotaccountlink' => 'ܥܘܠ',
'userlogin-resetlink' => 'ÜܬܢܫÜܬ ÜÜ•ÌˆÜ¥Ü¬Ü Ü•Ü¥Ü Ü ÜØŸ',
+'userlogin-resetpassword-link' => 'ܫܚܠܦ Ü¡Ü Ü¬Ü Ü•Ü¥Ü Ü Ü',
+'userlogin-helplink' => '[[{{MediaWiki:helplogin-url}}|Ü¥Ü˜Ü•ÜªÜ¢Ü Ü’Ü¥Ü Ü Ü Ü ÜšÜ˜Ü«Ü’Ü¢Ü]]',
+'createacct-join' => 'Üܥܠ ÜÜ•ÌˆÜ¥Ü¬Ü Ü•ÜÜ ÜŸ ܠܬܚܬ',
+'createacct-emailrequired' => 'Ü’ÜÜ Ü•ÜªÜ ÜܠܩܛܪܘܢÜÜ',
'createaccountmail' => 'Üܦܠܚ Ü¡Ü Ü¬Ü Ü•Ü¥Ü Ü Ü Ü™Ü’Ü¢Ü¢ÜÜ¬Ü Ü˜Ü«Ü•Üª Ü Ü— ܥܠ Ü’ÜÜ Ü•ÜªÜ ÜܠܩܛܪܘܢÜÜ Ü¬Ü˜ÜšÜ¡Ü Ü Ü¬ÜšÜ¬',
'createaccountreason' => 'ܥܠܬÜ',
+'createacct-submit' => 'Ü’ÜªÜ ÜšÜ˜Ü«Ü’Ü¢Ü Ü•ÜÜ ÜŸ',
+'createacct-benefit-heading' => 'ÜÜ¬Ü’Ü Ü•{{SITENAME}} ÜܣܬÜÜ¡ Ü’ÜÜ• ÜÜ¢Ü«ÌˆÜ Üܟܘܬܟ.',
+'createacct-benefit-body1' => '{{PLURAL:$1|ܫܘܚܠܦÜ|ܫܘܚܠܦ̈Ü}}',
+'createacct-benefit-body2' => '{{PLURAL:$1|ܦÜܬÜ|ܦÜܬܬ̈Ü}}',
+'createacct-benefit-body3' => '{{PLURAL:$1|Ü«Ü˜Ü¬Ü¦Ü¢Ü ÜšÜ•Ü¬Ü|Ü«Ü˜Ü¬Ü¦Ü¢ÌˆÜ ÜšÜ•ÌˆÜ¬Ü}}',
'badretype' => 'Ü¡Ü Ü¬Ü Ü•Ü¥Ü Ü Ü ÜŸÜ¬Ü’Ü¬ Üܢܬ Ü Ü ÜܘÜܢܬÜ.',
'userexists' => 'Ü«Ü¡Ü Ü•Ü¡Ü¦Ü ÜšÜ¢Ü Ü•Üܥܠܬ Ü«Ü©ÜÜ Ü ÜÜܬܘܗÜ.
ܫܦÜܪÜÜܬ Ü“Ü’Ü Ü«Ü¡Ü ÜܚܪܢÜ.',
@@ -491,7 +510,6 @@ $1',
# Special:PasswordReset
'passwordreset' => 'ܣܘܡ Ü¡Ü Ü¬Ü Ü•Ü¥Ü Ü Ü Ü™Ü’Ü¢ ÜܚܪÜÜ¢',
'passwordreset-legend' => 'ܣܘܡ Ü¡Ü Ü¬Ü Ü•Ü¥Ü Ü Ü Ü™Ü’Ü¢ ÜܚܪÜÜ¢',
-'passwordreset-pretext' => '{{PLURAL:$1||Üܥܠ ܚܕ Ü¡Ü¢ Ü¡Ü¢Ü˜Ü¬ÌˆÜ Ü•ÜÜ•ÌˆÜ¥Ü¬Ü Ü Ü¬Ü¬ÜšÜ¬}}',
'passwordreset-username' => 'Ü«Ü¡Ü Ü•Ü¡Ü¦Ü ÜšÜ¢Ü:',
'passwordreset-domain' => 'ܪܘܚܬÜ:',
'passwordreset-email' => 'Ü¡Ü˜Ü¢Ü¥Ü Ü•Ü’ÜÜ Ü•ÜªÜ ÜܠܩܛܪܘܢÜÜ:',
@@ -558,8 +576,11 @@ $1',
'permissionserrors' => 'Ü¦Ü˜Ü•Ü Ü•Ü¦Ü£Ü£Ü',
'permissionserrorstext-withaction' => 'Ü Üܬ Ü ÜŸ Ü¦Ü£Ü£Ü Ü $2, Ü’{{PLURAL:$1|ܥܠܬÜ|ܥܠܬ̈Ü}} Ü•:',
'log-fulllog' => 'ÜšÜ™Ü Ü£Ü“Ü Ü Ü“Ü¡ÜܪÜ',
+'postedit-confirmation' => 'ܫܘܚܠܦܟ Üܬܠܒܟ.',
'edit-already-exists' => 'ܒܪÜÜ Ü•Ü¦ÜÜ¬Ü ÜšÜ•Ü¬Ü Ü Ü Ü¡Ü¬Ü¡Ü¨ÜÜ¢Ü.
Ü—Ü•Ü Ü¦ÜÜ¬Ü ÜÜܬ Ü¡Ü¢ ܟܕܘ.',
+'editwarning-warning' => 'ÜÜ¢ ܫܒܩܬ ܦÜÜ¬Ü Ü—Ü•Ü Ü¡Ü¬Ü¡Ü¨ÜÜ¢Ü¬Ü ÜÜܬÜÜ— ܕܚܣܪܬ ÜŸÜ  Ü«Ü˜ÜšÜ Ü¦ÌˆÜ Ü•Ü¥Ü’Üܕܬ ܗܪܟÜ.
+ܡܨܬ ܕܬܒܛܠ Ü™Ü˜Ü—ÜªÜ Ü—Ü¢Ü ÜÜ¢ ܥܠÜÜ Ü ÜÜܬÜÜŸ Ü’Ü¡Ü¢Ü¬Ü Ü•"ܫܚܠܦܬÜ" ܒܨܒÜÜ¢Üܘܬ̈Ü.',
# "Undo" feature
'undo-summary' => 'Ü Ü Ü¬Ü¥Ü’Ü• $1 Ü’ÜÜ• [[Special:Contributions/$2|$2]] ([[User talk:$2|Ü¡Ü¡Ü Ü Ü]])',
@@ -668,7 +689,6 @@ $1',
'searchmenu-legend' => 'Ü“Ü’ÜÜ¬ÌˆÜ Ü•Ü’Ü¨ÜÜ',
'searchmenu-exists' => "'''ÜÜܬ ܦÜÜ¬Ü Ü’Ü«Ü¡ \"[[:\$1]]\" ܥܠ Ü—Ü¢Ü Ü˜ÜÜ©Ü'''",
'searchmenu-new' => "'''Ü’ÜªÜ Ü¦ÜÜ¬Ü \"[[:\$1]]\" ܥܠ Ü—Ü¢Ü Ü˜ÜÜ©Ü!'''",
-'searchhelp-url' => 'Help:ܚܒÜܫܬ̈Ü',
'searchprofile-articles' => 'ܦÜÜ¬Ü¬ÌˆÜ Ü•ÜšÜ’Üܫܬ̈Ü',
'searchprofile-project' => 'ܦÜÜ¬Ü¬ÌˆÜ Ü•Ü¬ÜªÌˆÜ¡ÜÜ¬Ü Ü˜Ü•Ü¥Ü˜Ü•ÜªÜ¢Ü',
'searchprofile-images' => 'Ü¡Üܕ̈ÜÜ Ü£Ü“ÜÜÌˆÜ (Multimedia)',
@@ -703,9 +723,6 @@ $1',
'powersearch-togglenone' => 'Ü Ü Ü¡Ü•Ü¡',
'search-external' => 'ܒܨÜÜ Ü’ÜªÜÜ',
-# Quickbar
-'qbsettings-none' => 'Ü Ü Ü¡Ü•Ü¡',
-
# Preferences page
'preferences' => 'ܨܒÜÜ¢Üܘܬ̈Ü',
'mypreferences' => 'ܨܒÜÜ¢Üܘܬ̈Ü',
@@ -1043,9 +1060,6 @@ $1',
'statistics-users-active' => 'Ü¡Ü¦Ü ÜšÜ¢ÌˆÜ Ü™ÜªÌ„ÜÜ™Ü',
'statistics-mostpopular' => 'ܦÜÜ¬Ü¬ÌˆÜ ÜšÜ™ÜÌˆÜ ÜܬÜܪ Ü¡Ü¢ ÜŸÜ ',
-'disambiguations' => 'ܦÜÜ¬Ü¬ÌˆÜ ÜÜ£ÜÜªÌˆÜ¬Ü Ü’Ü¦ÜÜ¬Ü¬ÌˆÜ Ü•Ü¬Ü˜ÜšÜ¡Ü ÜܚܪܢÜ',
-'disambiguationspage' => 'Template:Ü¬Ü˜ÜšÜ¡Ü ÜܚܪܢÜ',
-
'pageswithprop' => 'ܦÜÜ¬Ü¬ÌˆÜ Ü¥Ü¡ Ü•ÜÜ ÜÜ¬Ü Ü•Ü¦ÜܬÜ',
'pageswithprop-legend' => 'ܦÜÜ¬Ü¬ÌˆÜ Ü¥Ü¡ Ü•ÜÜ ÜÜ¬Ü Ü•Ü¦ÜܬÜ',
'pageswithprop-prop' => 'Ü«Ü¡Ü Ü•Ü•ÜÜ ÜܬÜ',
@@ -1240,9 +1254,8 @@ $1',
'watchthispage' => 'ÜªÜ—Ü Ü—Ü•Ü Ü¦ÜܬÜ',
'unwatch' => 'Ü Ü ÜªÜ—Ü',
'unwatchthispage' => 'ÜŸÜ Ü ÜªÜ—ÜÜ',
-'watchnochange' => 'ÜÜ¦Ü Ü ÜšÜ• Ü¡Ü¢ ܦÜÜ¬Ü¬ÌˆÜ Ü’ÜªÌˆÜ—Üܬܟ Üܫܬܚܠܦܬ Ü’Ü¡Ü¬ÜšÜ Ü•Ü™Ü’Ü¢Ü Ü“Ü ÜÜšÜ.',
'watchlist-details' => '{{PLURAL:$1|$1 ܦÜܬÜ|$1 ܦÜܬܬ̈Ü}} ܒܪ̈ܗÜܬܟ, ܫܒܘܩ Ü¡Ü¢ ܦÜÜ¬Ü¬ÌˆÜ Ü•Ü¡Ü¡Ü Ü Ü.',
-'wlheader-showupdated' => "* ܦÜÜ¬Ü¬ÌˆÜ Ü•Üܫܬܚܠܦܢ Ü¡Ü¢ ܒܬܪ ܣܘܥܪܢܟ ÜܚܪÜÜ Ü¡Ü¬Ü“Ü ÜšÜ¢ Ü’Ü£ÜªÜ›Ü '''ܚܠÜÜ¡Ü'''",
+'wlheader-showupdated' => "ܦÜÜ¬Ü¬ÌˆÜ Ü•Üܫܬܚܠܦܢ Ü¡Ü¢ ܒܬܪ Ü£Ü˜Ü¥ÜªÜ¢Ü ÜܚܪÜÜ Ü Ü—ÜÜ¢ ܡܬܓܠܚܢ Ü’Ü£ÜªÜ›Ü '''ܚܠÜÜ¡Ü'''",
'wlnote' => "ܠܬܚܬ {{PLURAL:$1|Ü«Ü˜ÜšÜ Ü¦Ü ÜܚܪÜÜ| '''$1''' Ü«Ü˜ÜšÜ Ü¦ÌˆÜ Üܚܪ̈ÜÜ}} {{PLURAL:$2|Ü’Ü«Ü¥Ü¬Ü ÜܚܪÜܬÜ|'''$2''' Ü’Ü«Ü¥Ü¬ÌˆÜ Üܚܪ̈ÜܬÜ}}, ܠܦܘܬ $3, $4.",
'wlshowlast' => 'ÜšÜ˜Ü $1 Ü«Ü¥Ü¬ÌˆÜ $2 ÜÜ˜Ü¡Ü¬ÌˆÜ Üܚܪ̈ÜÜ $3',
'watchlist-options' => 'ܨܒÜÜ¢ÜÜ˜Ü¬ÌˆÜ Ü•ÜªÌˆÜ—ÜܬÜ',
@@ -1448,8 +1461,6 @@ $1',
'ipb_already_blocked' => '"$1" Ü¡ÜšÜªÜ¡Ü Ü—Ü˜ Ü¡Ü¢ ܟܕܘ',
'ipb-needreblock' => '"$1" Ü¡ÜšÜªÜ¡Ü Ü—Ü˜ Ü¡Ü¢ ܟܕܘ
Do you want to change the settings?',
-'blockme' => 'ܚܪܘܡ Ü Ü',
-'proxyblocksuccess' => 'ܒܪÜ',
# Move page
'move-page' => 'Ü«Ü¢Ü $1',
@@ -1644,7 +1655,7 @@ $1',
'metadata-expand' => 'ÜšÜ˜Ü Üܪ̈ÜÜŸÜ¬Ü ÜªÌˆÜ˜ÜܚܬÜ',
'metadata-collapse' => 'Ü›Ü«Ü Üܪ̈ÜÜŸÜ¬Ü ÜªÌˆÜ˜ÜܚܬÜ',
-# EXIF tags
+# Exif tags
'exif-imagewidth' => 'ܦܬܘÜ',
'exif-imagelength' => 'ÜܘܪܟÜ',
'exif-xresolution' => 'Ü¢Ü©Ü•Ü˜Ü¬Ü ÜܘܦܩÜܬÜ',
@@ -1774,11 +1785,6 @@ $1',
'version-poweredby-others' => 'Üܚܪ̈ܢÜ',
'version-software-version' => 'ܨܚܚÜ',
-# Special:FilePath
-'filepath' => 'Ü«Ü’ÜÜ Ü Ü•Ü Ü¦Ü¦Ü',
-'filepath-page' => 'ܠܦܦÜ',
-'filepath-submit' => 'ܙܠ',
-
# Special:FileDuplicateSearch
'fileduplicatesearch' => 'Ü’Ü¨Ü Ü¥Ü  Ü Ü¦Ü¦ÌˆÜ Ü¥Ü¦Üܦ̈Ü',
'fileduplicatesearch-legend' => 'ܒܨÜÜ Ü¥Ü  ܥܘܦܦÜ',
diff --git a/languages/messages/MessagesArn.php b/languages/messages/MessagesArn.php
index 25fa236b..fe0312a6 100644
--- a/languages/messages/MessagesArn.php
+++ b/languages/messages/MessagesArn.php
@@ -183,7 +183,7 @@ $messages = array(
'jumptosearch' => 'kintun',
'pool-errorunknown' => 'Kimnoelchi welulkan',
-# 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).
+# 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).
'aboutsite' => '{{SITENAME}} ñi dungu',
'aboutpage' => 'Project:Dungu',
'copyrightpage' => '{{ns:project}}:Norkülelu ñi ngenngelu ñi deumakelu',
@@ -192,7 +192,6 @@ $messages = array(
'disclaimers' => 'Tukuldungun ñi pin ley',
'disclaimerpage' => 'Project:Katrütuwün ñi llowdüngun',
'edithelp' => 'Kellü wirin',
-'edithelppage' => 'Help:Chum wiringekey pakina',
'helppage' => 'Help:Trokiñdungu',
'mainpage' => 'Ñidol Wülngiñ',
'mainpage-description' => 'Ñidol Wülngiñ',
@@ -407,7 +406,6 @@ Rulpakünuy feychi kangelkülelu dungu.",
'viewprevnext' => 'Pen ($1 {{int:pipe-separator}} $2) ($3).',
'searchmenu-exists' => "'''Müley kiñe wülngiñ «[[:$1]]» pingelu feychi wiki mew'''",
'searchmenu-new' => "'''¡Llitun pakina «[[:$1]]» tüfachi wiki mew!'''",
-'searchhelp-url' => 'Help:Trokiñdungu',
'searchprofile-articles' => 'Trokiñdungu wülngiñ',
'searchprofile-project' => 'Kellu wülngiñ ka Deumandungu wülngiñ',
'searchprofile-images' => 'Fill dungu (adentun, dungun, fidew)',
@@ -522,7 +520,6 @@ Rulpakünuy feychi kangelkülelu dungu.",
'recentchangeslinked' => 'Koneltuyelelu kalekünulu wirin',
'recentchangeslinked-toolbox' => 'Koneltuyelelu kalekünulu wirin',
'recentchangeslinked-title' => 'Koneltuyelelu kalekünun tuwküleyelu "$1"',
-'recentchangeslinked-noresult' => 'Nülkükawlelu wülngiñ kalekünulay.',
'recentchangeslinked-summary' => "Tüfachi wif niey pu wülngiñ kalekünulu ka nülkükawlelu kiñe feypingechi wülngiñ (kam nülkükawlelu feypingechi trokiñ).
[[Special:Watchlist|Tami llaytun wif]] ñi pu wülngiñ '''kurükünuley'''.",
'recentchangeslinked-page' => 'Wülngiñ ñi üy:',
@@ -585,8 +582,6 @@ Fey ñi chumngen mülelu ($2 fey ñi chumngen wülngiñ) pengeli tüfa mew.',
'statistics' => 'Chuntelen',
'statistics-pages' => 'Pakina',
-'disambiguationspage' => 'Template:Kiñeduamngelu dungu',
-
'brokenredirects-edit' => 'pepikan',
'brokenredirects-delete' => 'ñamümün',
@@ -757,7 +752,6 @@ Fey ñi chumngen mülelu ($2 fey ñi chumngen wülngiñ) pengeli tüfa mew.',
'blocklogentry' => 'Katrüntukufi [[$1]] $2 antü/ora mew, $3',
'block-log-flags-nocreate' => 'Pepi dewmangelay konün',
'block-log-flags-hiddenname' => 'Ãœy kellufe ellkan',
-'proxyblocksuccess' => 'Dewmangey.',
# Move page
'move-page' => 'Nengümün $1',
@@ -888,7 +882,7 @@ Ka dungu ellkangeay wünedullin reke.
* gpslongitude
* gpsaltitude',
-# EXIF tags
+# Exif tags
'exif-artist' => 'Che llitun mew',
'exif-exposuretime-format' => '$1 sek ($2)',
diff --git a/languages/messages/MessagesAry.php b/languages/messages/MessagesAry.php
index 4bf86e03..ceadcf3f 100644
--- a/languages/messages/MessagesAry.php
+++ b/languages/messages/MessagesAry.php
@@ -46,9 +46,6 @@ $messages = array(
'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',
@@ -145,7 +142,7 @@ $messages = array(
'noindex-category' => 'shat mamfhtsach',
'broken-file-category' => 'ṣfaḫi fiha wṣlat milffaṫ mhrrsa',
-'linkprefix' => '/^(.*?)([a-zA-Z\\x80-\\xff]+)$/sD',
+'linkprefix' => '/^((?>.*(?<![a-zA-Z\\x80-\\xff])))(.+)$/sD',
'about' => 'ala',
'article' => 'sfht mohtawa',
@@ -249,7 +246,7 @@ $1',
'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).
+# 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).
'aboutsite' => 'KolÄ‹i Äla {{SITENAME}}',
'aboutpage' => 'Project:MeÄlomaṫ',
'copyright' => 'L-moḫṫawa mojod fe $1',
@@ -259,7 +256,6 @@ $1',
'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',
@@ -286,7 +282,6 @@ chof [[Special:Version|sfht lversion]]',
'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',
@@ -337,21 +332,6 @@ 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',
@@ -399,7 +379,6 @@ Query: $2',
'viewsourcetext' => 'imkn lik tchof otcopie lmasdar dyak had sfha',
'protectedinterface' => 'had á¹£fḫa ka-ṫÄti n-naṣṣ dl-interface dial l-logiciel, o-raḫa mḫmiyya baÄ‹ maymknÄ‹ ṫṫĥrab.',
'editinginterface' => "'''ṫḫdir:''' rak ka-Äddal waḫd á¹£-á¹£fḫa lli msṫÄmla baÄ‹ ṫÄti n-naṣṣ dl-interface dial l-logiciel. ṫĥyiraṫ fiha Ä¡adi ṫ'aṫṫar Äla l-má¸hr dial l-interface dl-mosṫaÄ¥dim Änd l-mosṫaÄ¥dimin l-aÄ¥rin. l-ttarjamaṫ, Ä‹oflik mÄa [//translatewiki.net/wiki/Main_Page?setlang=en translatewiki.net], the MediaWiki localisation project.",
-'sqlhidden' => '(talab SQL mĥfi)',
'cascadeprotected' => 'had á¹£fḫa mḫmiyya mn ṫÄdil, ḫqaÄ‹ fiha {{PLURAL:$1|á¹£fḫa|á¹£faḫi}} mḫmiyya mÄa l-option "cascading" Ä¥á¸á¸ama:
$2',
'namespaceprotected' => "ma msmoh-likÄ‹ baÄ‹ ṫÄddl á¹£fahi mn n-nitaq '''$1'''.",
@@ -424,7 +403,6 @@ tqdr tchof baad sfahi bhal ila msjl hta tfrgh lcache dyalk",
'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}})',
-'securelogin-stick-https' => 'bqa mṫṫasl bl-HTTPS moṛa d-doĥol',
'yourdomainname' => 'domain dyalk',
'externaldberror' => "kayn imma Ä‹i Ä¥ata' f-doÄ¥ol qaÄidaṫ l-bayanaṫ wlla rah ma msmoḫ-likÄ‹ baÄ‹ ṫḫddṫ l-ḫisab l-Ä¥ariji taÄk.",
'login' => 'DÄ¥el',
@@ -531,7 +509,7 @@ baċ ṫsali d-doĥol, ĥask ddir ċi klmṫ s-srr jdida hna:",
'newpassword' => 'lmot de passe jdida :',
'retypenew' => 'aaawd ktb lmot de passe jdida :',
'resetpass_submit' => 'rigler lmot de pass odkhl',
-'resetpass_success' => 'klmṫ s-srr taÄk rah ṫbddlaṫ!
+'changepassword-success' => 'klmṫ s-srr taÄk rah ṫbddlaṫ!
daba hanta ka-tdĥol...',
'resetpass_forbidden' => 'ma ymkn-ċ ṫbddal klmaṫ s-srr',
'resetpass-no-info' => 'ĥaṣṣ tkon daĥol baĥ tqdr twṣl l-had ṣfḫa niċan.',
@@ -543,10 +521,8 @@ ymkn ṫkon bddalṫiha bÄda wlla ṫlbti klmṫ srr mo'qaṫa jdida.",
# Special:PasswordReset
'passwordreset' => 'Äawd klmṫ s-srr',
-'passwordreset-text' => 'Ämmer had l-istimara baÄ‹ iwá¹£lek email ṫaÄ á¹«dkir b-ṫṫafaá¹£il dl-ḫisab ṫaÄk.',
'passwordreset-legend' => 'Äawd klmṫ s-srr',
'passwordreset-disabled' => 'maymkn-Ä‹ ṫÄawd klmṫ s-srr f-had l-wiki.',
-'passwordreset-pretext' => '{{PLURAL:$1||kṫb wḫda mn l-bayanaṫ l-ṫḫṫ}}',
'passwordreset-username' => 'smiṫ l-mosṫĥdim:',
'passwordreset-email' => 'Äonwan l-email:',
'passwordreset-emailtitle' => 'ṫafaṣil l-ḫisab f-{{SITENAME}}',
@@ -931,7 +907,6 @@ $1",
'searchmenu-legend' => 'khiyarat lbaht',
'searchmenu-exists' => "'''ḫṫṫa ṣfḫa f-had l-wiki ma smiṫha \"[[:\$1]]\".'''",
'searchmenu-new' => "'''ṣayb f-had l-wiki ṣfḫṫ \"[[:\$1]]\"!'''",
-'searchhelp-url' => 'Help:Meá¸mon',
'searchmenu-prefix' => '[[Special:PrefixIndex/$1|ṫṣffeh ṣfaḫi b-had ṣ-ṣabiqa]]',
'searchprofile-articles' => 'sfht mohtawa',
'searchprofile-project' => 'sfhai dyal lmossada ol mchroa',
@@ -976,15 +951,6 @@ Jerreb be l-préfiks \"all:\" baÄ‹ ṫqelleb Äla l-meá¸mon kollo (o ḫṫa á¹
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",
-'qbsettings-directionality' => 'ṫabṫ, Äla ḫasab ṫṫijah l-kṫaba b-loġṫk',
-
# Preferences page
'preferences' => 'ṫfá¸ilaṫ',
'mypreferences' => 'Ḫajaṫ li kanfeá¸á¸el',
@@ -1014,7 +980,6 @@ Laḫed ana imken ikono l-indexaṫ dial {{SITENAME}} qdam o ma bqaoċ ṣalḫi
'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',
@@ -1053,7 +1018,6 @@ Laḫed ana imken ikono l-indexaṫ dial {{SITENAME}} qdam o ma bqaoċ ṣalḫi
'prefs-custom-js' => 'personalisé JavaScript',
'prefs-common-css-js' => 'CSS/JavaScript l-moċṫarak bin jmiÄ s-skinaṫ:',
'prefs-emailconfirm-label' => "konfirmi l'email:",
-'prefs-textboxsize' => 'hajm nafidat tahrir',
'youremail' => 'I-Méyl',
'username' => 'smiṫ l-mosṫĥdim:',
'uid' => 'raqm lmostakhdim :',
@@ -1269,7 +1233,6 @@ Laḫed ana imken ikono l-indexaṫ dial {{SITENAME}} qdam o ma bqaoċ ṣalḫi
'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-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',
@@ -1374,7 +1337,6 @@ $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.',
@@ -1480,9 +1442,6 @@ $1',
'statistics-users-active' => 'mostakhdimon nachtin',
'statistics-mostpopular' => 'aktar sfahi mochahada',
-'disambiguations' => 'sfahi dyal tawdih',
-'disambiguationspage' => 'Template:tawdih',
-
'doubleredirects' => 'ṫḫwila má¸oḅla',
'double-redirect-fixed-move' => '[[$1]] ṫnqlaṫ.
daba ka ṫḫwwal l-[[$2]].',
@@ -1676,8 +1635,8 @@ L-Kṫaba dyal had á¹£-á¹£efḫa Ä¡aṫban '''Ä¡liá¸a''' fe [[Special:RecentCha
'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ċ.',
-'wlheader-enotif' => '* l-iÄlam bl-email mtloq.',
-'wlheader-showupdated' => "* á¹£-á¹£faḫi lli ṫġyyeraṫ mn aÄ¥ir ẓiyaá¹›a ṫaÄk mkṫoba b-Ä¥att '''Ä¡liá¸'''",
+'wlheader-enotif' => 'l-iÄlam bl-email mtloq.',
+'wlheader-showupdated' => "á¹£-á¹£faḫi lli ṫġyyeraṫ mn aÄ¥ir ẓiyaá¹›a ṫaÄk mkṫoba b-Ä¥att '''Ä¡liá¸'''",
'iteminvalidname' => "moÄ‹kil mÄa l-madda '$1', smia ma ṣḫiḫa-Ä‹...",
'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',
@@ -1914,10 +1873,7 @@ Imken lek ṫbeddel l-mosṫawa de l-ḫimaya dyal had ṣ-ṣefḫa bla ma i\'e
'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}}',
-'blockme' => 'blokini',
'proxyblocker' => 'blokør dl-proksi',
-'proxyblocker-disabled' => 'had l-ĥaṣṣiyya ma mtloqa-ċ',
-'proxyblocksuccess' => 'á¹£afi.',
'sorbs' => 'DNSBL',
# Developer tools
@@ -2220,7 +2176,7 @@ Ila ṫbeddel l-fiċyé men ḫalṫo l-'aṣliya, kaynin ċi ṫafaṣil ma mna
* gpslongitude
* gpsaltitude",
-# EXIF tags
+# Exif tags
'exif-imagewidth' => 'laard',
'exif-imagelength' => 'lirtifaa',
'exif-bitspersample' => 'bit lkol mokawwin',
@@ -2612,7 +2568,6 @@ jrreb l-ÄṛḠl-Äadi.',
'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-hook-name' => 'smiyt lkhttaf',
@@ -2624,11 +2579,6 @@ jrreb l-ÄṛḠl-Äadi.',
'version-software-product' => 'lmntoj',
'version-software-version' => 'noskha',
-# Special:FilePath
-'filepath' => 'massar lfichier',
-'filepath-page' => 'mileff:',
-'filepath-submit' => 'Sir',
-
# Special:FileDuplicateSearch
'fileduplicatesearch' => 'qlleb Äla milffaṫ má¸oḅla',
'fileduplicatesearch-summary' => 'qlleb Äla milffaṫ má¸oḅla Äla asas l-qyam dl-haÄ‹.',
diff --git a/languages/messages/MessagesArz.php b/languages/messages/MessagesArz.php
index 8352e270..13b3f373 100644
--- a/languages/messages/MessagesArz.php
+++ b/languages/messages/MessagesArz.php
@@ -334,9 +334,6 @@ $messages = array(
'tog-shownumberswatching' => 'بين عدد اليوزرز المراقبين',
'tog-oldsig' => 'الامضا دلوقتى:',
'tog-fancysig' => 'امضا خام (من غير لينك أوتوماتيك)',
-'tog-externaleditor' => 'استخدم محرر خارجى بشكل اÙتراضى (للخبرا بس، يحتاج إعدادات خاصة على كومبيوترك) ([//www.mediawiki.org/wiki/Manual:External_editors لمزيد من المعلومات].)',
-'tog-externaldiff' => 'استخدم Ùرق خارجى بشكل اÙتراضى (للخبرا بس، يحتاج إعدادات خاصة على كومبيوترك) ([//www.mediawiki.org/wiki/Manual:External_editors لمعلومات اكتر].)',
-'tog-showjumplinks' => 'خلى وصلات "روح لـ" تكون شغالة.',
'tog-uselivepreview' => 'استخدم البروÙØ© السريعة (جاÙاسكريبت) (تجريبي)',
'tog-forceeditsummary' => 'نبهنى عند تدخيل ملخص للتعديل Ùاضي',
'tog-watchlisthideown' => 'خبى التعديلات بتاعتى من لستة المراقبة',
@@ -350,6 +347,7 @@ $messages = array(
'tog-showhiddencats' => 'بين التّصنيÙات المستخبية',
'tog-noconvertlink' => 'عطل تحويل عناوين الوصلات',
'tog-norollbackdiff' => 'الغى الاختلاÙات بعد ما تعمل الرول باك',
+'tog-useeditwarning' => 'حذّرنى لما اسيب صÙحة تعديل Ùيها تغييرات مش متسييڤه',
'underline-always' => 'دايما',
'underline-never' => 'ابدا',
@@ -531,7 +529,7 @@ $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).
+# 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).
'aboutsite' => 'عن {{SITENAME}}',
'aboutpage' => 'Project:معلومات عن',
'copyright' => 'المحتوى موجود تحت $1.',
@@ -541,7 +539,6 @@ $1',
'disclaimers' => 'تنازل عن مسئوليه',
'disclaimerpage' => 'Project:تنازل عن مسئوليه عمومى',
'edithelp' => 'مساعده ÙÙ‰ التعديل',
-'edithelppage' => 'Help:تعديل',
'helppage' => 'Help:محتويات',
'mainpage' => 'الصÙحه الرئيسيه',
'mainpage-description' => 'الصÙحه الرئيسيه',
@@ -611,17 +608,6 @@ $1',
# General errors
'error' => 'غلطه',
'databaseerror' => 'غلط ÙÙ‰ قاعدة البيانات (database)',
-'dberrortext' => 'حصل غلط ÙÙ‰ صيغة الاستعلام ÙÙ‰ قاعدة البيانات (database).
-ممكن يكون بسبب عيب ÙÙ‰ البرنامج.
-آخر محاوله استعلام اتطلبت من قاعدة البيانات كانت:
-<blockquote><tt>$1</tt></blockquote>
-من جوه الخاصيه "<tt>$2</tt>".
-قاعدة البيانات رجعت الغلط "<tt>$3: $4</tt>".',
-'dberrortextcl' => 'حصل غلط ÙÙ‰ صيغة الاستعلام ÙÙ‰ قاعدة البيانات (database).
-آخر محاوله استعلام اتطلبت من قاعدة البيانات كانت:
-"$1"
-من جوه الخاصيه "$2".
-قاعدة البيانات رجعت الغلط "$3: $4"',
'laggedslavemode' => "'''تحذير:''' الصÙحه يمكن ما يكونش Ùيها تحديثات جديده.",
'readonly' => 'قاعدة البيانات (الـ database) مقÙوله',
'enterlockreason' => 'اكتب سبب القÙÙ„, Ùˆ قول امتى تقريبا Ø­ يتلغى القÙÙ„',
@@ -669,7 +655,6 @@ $1',
'viewsourcetext' => 'ممكن تشو٠وتنسخ مصدر الصÙحه دى:',
'protectedinterface' => 'الصÙحة دى هى اللى بتوÙر نص الواجهة بتاعة البرنامج،وهى مقÙولة لمنع التخريب.',
'editinginterface' => "'''تحذير''': أنت بتعدل صÙحة بتستخدم ÙÙ‰ الواجهة النصية بتاعة البرنامج. التغييرات ÙÙ‰ الصÙحة دى ها تأثر على مظهر واجهة اليوزر لليوزرز التانيين. للترجمات، لو سمحت استخدم [//translatewiki.net/wiki/Main_Page?setlang=ar بيتاويكى]ØŒ مشروع ترجمة الميدياويكى.",
-'sqlhidden' => '(استعلام إس‌كيو‌إل متخبي)',
'cascadeprotected' => 'الصÙحة دى محمية من التعديل، بسبب انها مدمجة ÙÙ‰ {{PLURAL:$1|الصÙحة|الصÙحات}} دي، اللى مستعمل Ùيها خاصية "حماية الصÙحات المدمجة" :
$2',
'namespaceprotected' => "ما عندكش صلاحية تعديل الصÙحات اللى ÙÙ‰ نطاق '''$1'''.",
@@ -783,7 +768,7 @@ $2',
'newpassword' => 'الباسورد جديدة:',
'retypenew' => 'اكتب الباسورد الجديده تانى:',
'resetpass_submit' => 'اظبط الباسورد و ادخل',
-'resetpass_success' => 'الباسورد بتاعتك اتغيرت بنجاح! دلوقتى بنسجل دخولك...',
+'changepassword-success' => 'الباسورد بتاعتك اتغيرت بنجاح! دلوقتى بنسجل دخولك...',
'resetpass_forbidden' => 'مش ممكن تغيير الباسورد',
'resetpass-no-info' => 'لازم تسجل دخولك علشان تقدر توصل للصÙحة دى على طول.',
'resetpass-submit-loggedin' => 'غير الباسورد',
@@ -981,6 +966,8 @@ $2',
'edit-no-change' => 'تعديلك تم تجاهله، لأن ما حصلش أى تعديل للنص.',
'edit-already-exists' => 'لم يمكن إنشاء صÙحة جديدة.
هى موجودة بالÙعل.',
+'editwarning-warning' => 'لو سيبت الصÙحه دى ممكن يخلّيك تضيّع اى تغييرات عملتها.
+لو انت مسجّل دخولك, ممكن تعطّل التحذير ده من الجزء بتاع "تعديل" ÙÙ‰ تÙضيلاتك.',
# Parser/template warnings
'expensive-parserfunction-warning' => 'تحذير: الصÙحه دى Ùيهااستدعاءات دالة محلل كثيرة مكلÙØ©.
@@ -1201,7 +1188,6 @@ $1",
'searchmenu-legend' => 'اختيارات التدوير',
'searchmenu-exists' => "*الصÙحة '''[[$1]]'''",
'searchmenu-new' => "'''ابتدى الصÙحه \"[[:\$1]]\" ع الويكى دا!'''",
-'searchhelp-url' => 'Help:محتويات',
'searchmenu-prefix' => '[[Special:PrefixIndex/$1|استعرض الصÙحات اللى بتبتدى بالبريÙيكس دا]]',
'searchprofile-articles' => 'صÙحات محتوى',
'searchprofile-project' => 'صÙحات المساعده Ùˆ المشروع',
@@ -1246,14 +1232,6 @@ $1",
ممكن تدور ÙÙ‰ جوجل دلوقتي.
لاحظ أن Ùهارسه لمحتوى {{SITENAME}} يمكن تكون مش متحدثة.',
-# Quickbar
-'qbsettings' => 'البار السريع',
-'qbsettings-none' => 'ما ÙÙ‰ Ø´',
-'qbsettings-fixedleft' => 'متثبت ÙÙ‰ الشمال',
-'qbsettings-fixedright' => 'متثبت ÙÙ‰ اليمين',
-'qbsettings-floatingleft' => 'عايم على الشمال',
-'qbsettings-floatingright' => 'عايم على اليمين',
-
# Preferences page
'preferences' => 'تÙضيلات',
'mypreferences' => 'تÙضيلاتى',
@@ -1283,7 +1261,6 @@ $1",
'resetprefs' => 'امسح التغييرات اللى مش المحÙوظة',
'restoreprefs' => 'استرجع التظبيطات الاصليه',
'prefs-editing' => 'تعديل',
-'prefs-edit-boxsize' => 'ÙƒÙبر الويندو بتاعة التحرير',
'rows' => 'صÙÙˆÙ:',
'columns' => 'عمدان:',
'searchresultshead' => 'تدوير',
@@ -1294,9 +1271,6 @@ $1",
'recentchangesdays-max' => '(الحد الاقصى $1 {{PLURAL:$1|يوم|ايام}})',
'recentchangescount' => 'عدد التعديلات اللى بتظهر اوتوماتيكى ÙÙ‰ اخر التغييرات, تواريخ الصÙحه, Ùˆ ÙÙ‰ السجلات, :',
'prefs-help-recentchangescount' => 'بيحتوى على احدث التغييرات ØŒ تواريخ الصÙحات Ùˆ السجلات.',
-'prefs-help-watchlist-token' => 'ملى الحقل ده بمÙتاح سرى حيعمل تلقيم RSS لقايمه مراقبتك.
-اى واحد بعر٠المÙتاح ÙÙ‰ الحقل ده ممكن يقرأ قايمه مراقبتك، علشان كده اختار قيمه متأمنه.
-دى قيمه متولده عشوائى وممكن تستخدمها: $1',
'savedprefs' => 'التÙضيلات بتاعتك اتحÙظت.',
'timezonelegend' => 'منطقة التوقيت',
'localtime' => 'التوقيت المحلى',
@@ -1326,7 +1300,6 @@ $1",
'prefs-reset-intro' => 'ممكن تستعمل الصÙحه دى عشان تعيد ظبط التÙضيلات بتاعتك Ùˆ تخليها زى الحاله الاÙتراضيه للموقع.
ماينÙعش الرجوع ÙÙ‰ التعديل دا.',
'prefs-emailconfirm-label' => 'التأكد من الايميل:',
-'prefs-textboxsize' => 'حجم شباك التعديل',
'youremail' => 'الايميل:',
'username' => 'اسم اليوزر:',
'uid' => 'رقم اليوزر:',
@@ -1560,7 +1533,6 @@ $1",
'recentchangeslinked-feed' => 'تعديلات ليها علاقه',
'recentchangeslinked-toolbox' => 'تعديلات ليها علاقه',
'recentchangeslinked-title' => 'التعديلات المرتبطه ب "$1"',
-'recentchangeslinked-noresult' => 'ماÙيش تعديلات حصلت ÙÙ‰ الصÙحات اللى ليها وصلات هنا خلال الÙترة المحدده.',
'recentchangeslinked-summary' => "دى ليستة تغييرات اتعملت قريب ÙÙ‰ صÙØ­ معمول ليها لينك من صÙØ­ مخصوصه (او لاعضاء ÙÙ‰ تصني٠معين).
الصÙØ­ اللى ÙÙ‰ [[Special:Watchlist|لستة الصÙØ­ اللى بتراقبها]] معروضه '''بالـbold'''",
'recentchangeslinked-page' => 'اسم الصÙحه :',
@@ -1572,7 +1544,7 @@ $1",
'reuploaddesc' => 'إلغى التحميل وارجع لاستمارة التحميل',
'upload-tryagain' => 'Ù†ÙØ° وص٠المل٠المتعدل',
'uploadnologin' => 'ما سجلتش الدخول',
-'uploadnologintext' => 'لازم تكون [[Special:UserLogin|مسجل الدخول]] علشان تقدر تحمل الملÙات.',
+'uploadnologintext' => 'لازم تكون $1 علشان تقدر تحمل الملÙات.',
'upload_directory_missing' => 'مجلد التحميل($1) ضايع السيرÙير وماقدرش يعمل واحد تاني.',
'upload_directory_read_only' => 'مجلد التحميل ($1) مش ممكن الكتابة عليه بواسطة سيرڨر الويب.',
'uploaderror' => 'غلطه ÙÙ‰ التحميل',
@@ -1717,7 +1689,6 @@ PICT # misc.
'http-read-error' => 'ÙÙ‰ غلط ÙÙ‰ قراية ال HTTP',
'http-timed-out' => 'طلب ال HTTP خلص وقته',
'http-curl-error' => 'حصل غلط و احنا بنجيب الURL : $1',
-'http-host-unreachable' => 'ما قدرناش نوصل لل URL.',
'http-bad-status' => 'HTTP : حصلت مشكله وقت طلب ال $1 $2',
# Some likely curl errors. More could be added from <http://curl.haxx.se/libcurl/c/libcurl-errors.html>
@@ -1865,12 +1836,6 @@ PICT # misc.
'statistics-users-active-desc' => 'اليوزرز اللى Ù†Ùذو عمليه ÙÙ‰ الـ {{PLURAL:$1|يوم|$1 ايام}} اللى Ùاتو',
'statistics-mostpopular' => 'اكتر صÙحات اتشاÙت',
-'disambiguations' => 'صÙحات التوضيح',
-'disambiguationspage' => 'Template:توضيح',
-'disambiguations-text' => "الصÙحات دى بتوصل لـ '''صÙحة توضيح'''.
-المÙروض على العكس انهم يوصلو Ù„ للصÙحات المناسبة. <br />
-أى صÙحة بتتعامل على انها صÙحة توضيح إذا كانت بتستعمل قالب موجود ÙÙ‰ [[MediaWiki:Disambiguationspage]]",
-
'doubleredirects' => 'تحويلات مزدوجه',
'doubleredirectstext' => 'الصÙحة دى Ùيها لستة الصÙحات اللى Ùيها تحويلة لصÙحة تانية Ùيها تحويلة.
كل سطر ÙÙ‰ اللستة دى Ùيه لينك للتحويلة الأولانية والتانية Ùˆ كمان للصÙحة بتاعة التحويلة التانية Ùˆ اللى غالبا هى الصÙحة الاصلية اللى المÙروض التحويلة الاولانية توصل ليها.
@@ -2087,10 +2052,9 @@ PICT # misc.
'unwatchthispage' => 'اتوق٠عن المراقبة',
'notanarticle' => 'دى مش صÙحة بتاعة محتوى',
'notvisiblerev' => 'النسحة اتمسحت',
-'watchnochange' => 'ماÙيش ولا صÙحة اتعدلت ÙÙ‰ لستة مراقبتك ÙÙ‰ الÙترة الزمنية اللى حددتها.',
'watchlist-details' => '{{PLURAL:$1|$1 صÙحه|$1 صÙحه}} ÙÙ‰ قايمه مراقبتك، بدون عد صÙحات المناقشه.',
'wlheader-enotif' => '*خاصية الاعلام بالايميل متÙعلة',
-'wlheader-showupdated' => "* الصÙحات اللى اتغيرت بعد زيارتك ليها اخر مرة معروضة بالخط '''العريض'''",
+'wlheader-showupdated' => "الصÙحات اللى اتغيرت بعد زيارتك ليها اخر مرة معروضة بالخط '''العريض'''",
'watchmethod-recent' => 'التشييك على التعديلات الاخيرة للصÙحات المتراقبة',
'watchmethod-list' => 'التشييك ÙÙ‰ الصÙحات المتراقبة على التعديلات الاخيرة',
'watchlistcontains' => 'لستة المراقبة بتاعتك Ùيها $1 {{PLURAL:$1|صÙحة|صÙحات}}.',
@@ -2459,12 +2423,9 @@ $1',
بس هو، على الرغم من كدا،ممنوع لانه جزء من النطاق $2ØŒ Ùˆ اللى ممكن رÙع المنع عنه.',
'ip_range_invalid' => 'نطاق عناوين الأيبى مش صحيح.',
'ip_range_toolarge' => 'حدود المنع اللى اكبر من /$1 مش مسموح بيها.',
-'blockme' => 'امنعنى',
'proxyblocker' => 'مانع البروكسي',
-'proxyblocker-disabled' => 'الخاصية دى متعطلة.',
'proxyblockreason' => 'عنوان الأيبى بتاعك اتمنع لانه بروكسى Ù…Ùتوح.
لو سمحت تتصل بمزود خدمة الإنترنت بتاعك أو الدعم الÙنى Ùˆ قولهم على المشكلة الامنية الخطيرة دي.',
-'proxyblocksuccess' => 'خلاص.',
'sorbs' => 'دى إن إس بى إل',
'sorbsreason' => 'عنوان الأيبى بتاعك موجود كبروكسى Ù…Ùتوح ÙÙ‰ DNSBL اللى بيستعمله{{SITENAME}}.',
'sorbs_create_account_reason' => 'عنوان الأيبى بتاعك موجود كبروكسى Ù…Ùتوح ÙÙ‰ ال DNSBL اللى بيستعمله {{SITENAME}}.
@@ -2739,27 +2700,16 @@ $1',
# Stylesheets
'common.css' => '/* الأنماط المتراصة CSS المعروضة هنا ستؤثر على كل الواجهات */',
-'standard.css' => '/* الأنماط المتراصة CSS المعروضة هنا ستؤثر على مستخدمى واجهة ستاندرد */',
-'nostalgia.css' => '/* الأنماط المتراصة CSS المعروضة هنا ستؤثر على مستخدمى واجهة نوستالشيا */',
'cologneblue.css' => '/* الأنماط المتراصة CSS المعروضة هنا ستؤثر على مستخدمى واجهة كولون بلو */',
'monobook.css' => '/* الأنماط المتراصة CSS المعروضة هنا ستؤثر على مستخدمى واجهة مونوبوك */',
-'myskin.css' => '/* الأنماط المتراصة CSS المعروضة هنا ستؤثر على مستخدمى واجهة ماى سكين */',
-'chick.css' => '/* الأنماط المتراصة CSS المعروضة هنا ستؤثر على مستخدمى واجهة تشيك */',
-'simple.css' => '/* الأنماط المتراصة CSS المعروضة هنا ستؤثر على مستخدمى واجهة سيمبل */',
'modern.css' => '/* الأنماط المتراصة CSS المعروضة هنا ستؤثر على مستخدمى واجهة مودرن */',
'vector.css' => '/* CSS اللى هنا حتأثر على اليوزرز اللى بيستخدموا واجهة Ùكتور */',
'print.css' => '/* الأنماط المتراصة CSS المعروضة هنا ستؤثر على ناتج الطباعة */',
-'handheld.css' => '/* الأنماط المتراصة CSS المعروضة هنا ستؤثر على الأجهزة المحمولة بالاعتماد على الواجهة المضبوطة ÙÙ‰ $wgHandheldStyle */',
# Scripts
'common.js' => '/* أى جاÙاسكريبت هناح يتحمل لكل اليوزرز مع كل تحميل للصÙحة. */',
-'standard.js' => '/* أى جاÙاسكريبت هنا Ø­ تتحمل لليوزرز اللى بيستعملو واجهة ستاندرد */',
-'nostalgia.js' => '/* أى جاÙاسكريبت هنا Ø­ تتحمل لليوزرز اللى بيستعملو واجهة نوستالجيا */',
'cologneblue.js' => '/* أى جاÙاسكريبت هنا Ø­ تتحمل لليوزرز اللى بيستعملو واجهة كولون بلو */',
'monobook.js' => '/* أى جاÙاسكريبت هنا Ø­ تتحمل لليوزرز اللى بيستعملو واجهة مونوبوك */',
-'myskin.js' => '/* أى جاÙاسكريبت هنا Ø­ تتحمل لليوزرز اللى بيستعملو واجهة ماى سكين */',
-'chick.js' => '/* أى جاÙاسكريبت هنا Ø­ تتحمل لليوزرز اللى بيستعملو واجهة تشيك */',
-'simple.js' => '/* أى جاÙاسكريبت هنا Ø­ تتحمل لليوزرز اللى بيستعملو واجهة سيمبل */',
'modern.js' => '/* أى جاÙاسكريبت هنا Ø­ تتحمل لليوزرز اللى بيستعملو واجهة مودرن */',
'vector.js' => '/* اى جاÙاسكريبت هنا حتتحمل لكل يوزر بيستخدم واجهة Ùكتور */',
@@ -2788,13 +2738,8 @@ $1',
'spam_blanking' => 'كل النسخ Ùيها لينكات Ù„ $1ØŒ Ùضيها',
# Skin names
-'skinname-standard' => 'كلاسيك',
-'skinname-nostalgia' => 'نوستالجيا',
'skinname-cologneblue' => 'كولون بلو',
'skinname-monobook' => 'مونوبوك',
-'skinname-myskin' => 'ماى سكين',
-'skinname-chick' => 'تشيك',
-'skinname-simple' => 'سيمبل',
'skinname-modern' => 'مودرن',
# Patrolling
@@ -2889,7 +2834,7 @@ $1',
* gpslongitude
* gpsaltitude',
-# EXIF tags
+# Exif tags
'exif-imagewidth' => 'العرض',
'exif-imagelength' => 'الطول',
'exif-bitspersample' => 'بتس لكل مكون',
@@ -3005,7 +2950,7 @@ $1',
'exif-gpsdatestamp' => 'تاريخ GPS',
'exif-gpsdifferential' => 'تصحيح GPS التÙاضلي',
-# EXIF attributes
+# Exif attributes
'exif-compression-1' => 'مش مضغوط',
'exif-compression-6' => 'جيه بى إى جي',
@@ -3375,7 +3320,6 @@ $5
'version-other' => 'تانية',
'version-mediahandlers' => 'متحكمات الميديا',
'version-hooks' => 'الخطاطيÙ',
-'version-extension-functions' => 'وظاي٠الامتداد',
'version-parser-extensiontags' => 'التاجز بتوع امتداد البريزر',
'version-parser-function-hooks' => 'خطاطي٠دالة المحلل',
'version-hook-name' => 'اسم الخطاÙ',
@@ -3386,13 +3330,6 @@ $5
'version-software-product' => 'المنتج',
'version-software-version' => 'النسخه',
-# Special:FilePath
-'filepath' => 'مسار ملÙ',
-'filepath-page' => 'الملÙ:',
-'filepath-submit' => 'المسار',
-'filepath-summary' => 'الصÙحة المخصوصة دى بتعرض المسار الكامل بتاع ملÙ.
-الصور بتتعرض بدقة كاملة، أنواع الملÙات التانية Ø­ تشتغل ÙÙ‰ البرنامج بتاعهم مباشرة.',
-
# Special:FileDuplicateSearch
'fileduplicatesearch' => 'دور على الملÙات المتكررة',
'fileduplicatesearch-summary' => 'دور على الملÙات المتكررة على اساس قيمة الهاش بتاعتها.',
diff --git a/languages/messages/MessagesAs.php b/languages/messages/MessagesAs.php
index cf7ab619..ada0998e 100644
--- a/languages/messages/MessagesAs.php
+++ b/languages/messages/MessagesAs.php
@@ -213,9 +213,6 @@ $messages = array(
'tog-shownumberswatching' => 'লকà§à¦·à§à¦¯ কৰি থকা সদসà§à¦¯ সমূহৰ সংখà§à¦¯à¦¾ দেখà§à§±à¦¾à¦“ক',
'tog-oldsig' => 'বৰà§à¦¤à¦®à¦¾à¦¨à§° সà§à¦¬à¦¾à¦•à§à¦·à§°:',
'tog-fancysig' => 'সà§à¦¬à¦¾à¦•à§à¦·à§° ৱিকিটেকà§à¦¸à¦Ÿ হিচাপে বà§à¦¯à§±à¦¹à¦¾à§° কৰক (সà§à¦¬à¦¯à¦¼à¦‚কà§à§°à¦¿à¦¯à¦¼ সংযোগ অবিহনে)',
-'tog-externaleditor' => 'ডিফ’লà§à¦Ÿ ভাবে বাহà§à¦¯à¦¿à¦• সমà§à¦ªà¦¾à¦¦à¦¨-সà¦à¦œà§à¦²à¦¿ বà§à¦¯à§±à¦¹à¦¾à§° কৰক (দকà§à¦· জনৰ বাবেহে, আপোনাৰ কমà§à¦ªà¦¿à¦‰à¦Ÿà¦¾à§°à¦¤ বিশেষ বà§à¦¯à§±à¦¸à§à¦¥à¦¾ থাকিব লাগিব । [//www.mediawiki.org/wiki/Manual:External_editors সবিশেষ ।])',
-'tog-externaldiff' => 'ডিফ’লà§à¦Ÿ ভাবে বাহà§à¦¯à¦¿à¦• তফাৎ (diff) বà§à¦¯à§±à¦¹à¦¾à§° কৰক (দকà§à¦· জনৰ বাবেহে, আপোনাৰ কমà§à¦ªà¦¿à¦‰à¦Ÿà¦¾à§°à¦¤ বিশেষ বà§à¦¯à§±à¦¸à§à¦¥à¦¾ থাকিব লাগিব । [//www.mediawiki.org/wiki/Manual:External_editors সবিশেষ ।])',
-'tog-showjumplinks' => '"জà¦à¦ªà¦¿à¦¯à¦¼à¦¾à¦‡ যাওক" সংযোগ সকà§à§°à¦¿à¦¯à¦¼ কৰক',
'tog-uselivepreview' => 'সমà§à¦ªà¦¾à¦¦à¦¨à¦¾à§° লগে লগে খচৰা দেখà§à§±à¦¾à¦“ক (পৰীকà§à¦·à¦¾à¦®à§‚লক)',
'tog-forceeditsummary' => 'সমà§à¦ªà¦¾à¦¦à¦¨à¦¾à§° সাৰাংশ নিদিলে মোক জনাব',
'tog-watchlisthideown' => 'মোৰ লকà§à¦·à§à¦¯-তালিকাত মোৰ সমà§à¦ªà¦¾à¦¦à¦¨à¦¾ নেদেখà§à§±à¦¾à¦¬',
@@ -228,6 +225,8 @@ $messages = array(
'tog-diffonly' => 'পারà§à¦¥à¦•à§à¦¯à§° তলত পৃষà§à¦ à¦¾à§° বিষয়বসà§à¦¤à§ নেদেখà§à§±à¦¾à¦¬',
'tog-showhiddencats' => 'নিহিত শà§à§°à§‡à¦£à§€ সমূহ দেখà§à§±à¦¾à¦“ক',
'tog-norollbackdiff' => 'পূৰà§à¦¬à§±à¦¤ কৰা পাছত পাৰà§à¦¥à¦•à§à¦¯ নেদেখà§à§±à¦¾à¦¬',
+'tog-useeditwarning' => 'সালসলনি সংৰকà§à¦·à¦£ নকৰাকৈ সমà§à¦ªà¦¾à¦¦à¦¨à¦¾ পৃষà§à¦ à¦¾ তà§à¦¯à¦¾à¦—ৰ সময়ত মোক সাৱধান কৰক',
+'tog-prefershttps' => 'পà§à§°à§±à§‡à¦¶ কৰোà¦à¦¤à§‡ সদায় সà§à§°à¦•à§à¦·à¦¿à¦¤ সংযোগ বà§à¦¯à§±à¦¹à¦¾à§° কৰক',
'underline-always' => 'সদায়',
'underline-never' => 'কেতিয়াও নহয়',
@@ -291,6 +290,18 @@ $messages = array(
'oct' => 'অকà§à¦Ÿà§‹à¦¬à§°:',
'nov' => 'নৱেমà§à¦¬à§°:',
'dec' => 'ডিচেমà§à¦¬à§°:',
+'january-date' => 'জানà§à§±à¦¾à§°à§€ $1',
+'february-date' => 'ফেবà§à§°à§à§±à¦¾à§°à§€ $1',
+'march-date' => 'মাৰà§à¦š $1',
+'april-date' => 'à¦à¦ªà§à§°à¦¿à¦² $1',
+'may-date' => "মে' $1",
+'june-date' => 'জà§à¦¨ $1',
+'july-date' => 'জà§à¦²à¦¾à¦‡ $1',
+'august-date' => 'আগষà§à¦Ÿ $1',
+'september-date' => 'ছেপà§à¦Ÿà§‡à¦®à§à¦¬à§° $1',
+'october-date' => 'অকà§à¦Ÿà§‹à¦¬à§° $1',
+'november-date' => 'নৱেমà§à¦¬à§° $1',
+'december-date' => 'ডিচেমà§à¦¬à§° $1',
# Categories related messages
'pagecategories' => '{{PLURAL:$1|শà§à§°à§‡à¦£à§€|শà§à§°à§‡à¦£à§€à¦¸à¦®à§‚হ}}',
@@ -372,6 +383,7 @@ $messages = array(
'create-this-page' => 'নতà§à¦¨ পৃষà§à¦ à¦¾ সৃষà§à¦Ÿà¦¿ কৰক',
'delete' => 'বিলোপ',
'deletethispage' => 'à¦à¦‡ পৃষà§à¦ à¦¾à¦–ন বিলোপ কৰক',
+'undeletethispage' => 'à¦à¦‡ পৃষà§à¦ à¦¾ পà§à¦¨à§°à§à¦¦à§à¦§à¦¾à§° কৰক',
'undelete_short' => '{{PLURAL:$1|বিলোপিত পৃষà§à¦ à¦¾à§°|$1 সংখà§à¦¯à¦• বিলোপিত পৃষà§à¦ à¦¾à§°}} পূৰà§à¦¬à¦¬à§Žà¦•à§°à¦£',
'viewdeleted_short' => '{{PLURAL:$1| à¦à¦Ÿà¦¾ বিলà§à¦ªà§à¦¤ সমà§à¦ªà¦¾à¦¦à¦¨à¦¾|$1 টা বিলà§à¦ªà§à¦¤ সমà§à¦ªà¦¾à¦¦à¦¨à¦¾}} দেখà§à§±à¦¾à¦“ক',
'protect' => 'সà§à§°à¦•à§à¦·à¦¿à¦¤ কৰক',
@@ -415,7 +427,7 @@ $1',
'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).
+# 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).
'aboutsite' => '{{SITENAME}}ৰ বিষয়ে',
'aboutpage' => 'Project:ইতিবৃতà§à¦¤',
'copyright' => 'à¦à¦‡ বিষয়বসà§à¦¤à§ $1 ৰ আওতাত উপলবà§à¦§à¥¤',
@@ -425,7 +437,6 @@ $1',
'disclaimers' => 'দায়লà§à¦ªà§à¦¤à¦¿',
'disclaimerpage' => 'Project:সাধাৰণ দায়লà§à¦ªà§à¦¤à¦¿',
'edithelp' => 'সমà§à¦ªà¦¾à¦¦à¦¨à¦¾à§° বাবে সহায়',
-'edithelppage' => 'Help:সমà§à¦ªà¦¾à¦¦à¦¨à¦¾',
'helppage' => 'Help:সমল',
'mainpage' => 'বেটà§à¦ªà¦¾à¦¤',
'mainpage-description' => 'বেটà§à¦ªà¦¾à¦¤',
@@ -502,17 +513,11 @@ $1',
# General errors
'error' => 'ভà§à¦²',
'databaseerror' => 'তথà§à¦¯à¦•à§‹à¦·à§° ভà§à¦²',
-'dberrortext' => 'Database query syntaxত তà§à§°à§à¦Ÿà¦¿ হৈছে।
-ছফà§à¦Ÿà§±à§‡à§°à¦¤ থকা কোনো বাগৰ বাবে à¦à¦¨à§‡ হব পাৰে।
-অনà§à¦¤à¦¿à¦®à¦¬à¦¾à§° চেষà§à¦Ÿà¦¾ কৰা ডাটাবেচ কà§à§±à§‡à§°à§€à¦Ÿà§‹ আছিল à¦à¦¨à§‡à¦§à§°à¦£à§°:
-<blockquote><code>$1</code></blockquote>
-"<code>$2</code>" ফাংচনৰ পৰা।
-ডাটাবেচে পà§à§°à§‡à§°à¦£ কৰা তà§à§°à§à¦Ÿà¦¿: "<samp>$3: $4</samp>"।',
-'dberrortextcl' => 'à¦à¦• ডাটাবেচ চিণà§à¦Ÿà§‡à¦•à§à¦¸ তà§à§°à§à¦Ÿà¦¿ ঘটিছে।
-অনà§à¦¤à¦¿à¦®à¦¬à¦¾à§° চেষà§à¦Ÿà¦¾ কৰা ডাটাবেচ কà§à§±à§‡à§°à§€à¦Ÿà§‹ আছিল à¦à¦¨à§‡à¦§à§°à¦£à§°:
-"$1"
-"$2" ফাংচনৰ পৰা
-ডাটাবেচে পà§à§°à§‡à§°à¦£ কৰা তà§à§°à§à¦Ÿà¦¿ "$3: $4"',
+'databaseerror-text' => "à¦à¦Ÿà¦¾ ডেটাবে'ছ কà§à§±à§‡à§°à§€ তà§à§°à§à¦Ÿà¦¿ হৈছে।
+ইয়ে ছফà§à¦Ÿà§±à§‡à§°à¦Ÿà§‹à¦¤ কিবা বাগà§â€Œ থকাটো সূচাব পাৰে।",
+'databaseerror-textcl' => "à¦à¦Ÿà¦¾ ডেটাবে'ছ কà§à§±à§‡à§°à§€ তà§à§°à§à¦Ÿà¦¿ হৈছে।",
+'databaseerror-function' => 'ফাংচন: $1',
+'databaseerror-error' => 'তà§à§°à§à¦Ÿà¦¿: $1',
'laggedslavemode' => 'সাৱধানবাণী: ইয়াত সামà§à¦ªà§à§°à¦¤à¦¿à¦• সাল-সলনি নাথাকিব পাৰে',
'readonly' => 'তথà§à¦¯à¦•à§‹à¦· বনà§à¦§ কৰা আছে',
'enterlockreason' => 'বনà§à¦§ কৰাৰ কাৰণ দিয়ক, লগতে কেতিয়ামানে খোলা হব তাকো জনাব।',
@@ -546,6 +551,7 @@ $1',
'cannotdelete-title' => '"$1" পৃষà§à¦ à¦¾ বিলোপ কৰিব নোৱাৰি',
'delete-hook-aborted' => 'হà§à¦•à§° দà§à¦¬à¦¾à§°à¦¾ সমà§à¦ªà¦¾à¦¦à¦¨à¦¾ পà§à§°à¦¤à§à¦¯à¦¾à¦–à§à¦¯à¦¾à¦¨ কৰা হৈছে ।
ইয়াৰ কোনো বà§à¦¯à¦¾à¦–à§à¦¯à¦¾ নাই ।',
+'no-null-revision' => '"$1" পৃষà§à¦ à¦¾à§° বাবে নতà§à¦¨ শূনà§à¦¯ সংশোধন সৃষà§à¦Ÿà¦¿ কৰিব পৰা নগ\'ল',
'badtitle' => 'অগà§à§°à¦¹à¦£à§€à¦¯à¦¼ শিৰোনামা',
'badtitletext' => 'আপà§à¦¨à¦¿ বিচৰা পৃষà§à¦ à¦¾à¦Ÿà§‹à§° শিৰোনামা অযোগà§à¦¯, খালী বা ভà§à¦²à¦•à§ˆ জড়িত আনà§à¦¤à§°à§à¦­à¦¾à¦·à¦¿à¦• বা আনà§à¦¤à§°à§à§±à¦¿à¦•à¦¿ শিৰোনামা। ইয়াত à¦à¦• বা ততোধিক বৰà§à¦£ আছে যাক শিৰোনামাত বà§à¦¯à§±à¦¹à¦¾à§° কৰিব নোৱাৰি।',
'perfcached' => "তলত দিয়া তথà§à¦¯à¦–িনি আগতে জমা কৰি থোৱা (cached) আৰৠসামà§à¦ªà§à§°à¦¤à¦¿à¦• নহ'ব পাৰে। à¦à¦‡ তথà§à¦¯à¦–িনিত সৰà§à¦¬à§‹à¦šà§à¦š {{PLURAL:$1|à¦à¦Ÿà¦¾ ফলাফল|$1টা ফলাফল}} উপলবà§à¦§à¥¤",
@@ -566,12 +572,15 @@ $1',
'editinginterface' => "'''সাৱধানবাণী:''' আপà§à¦¨à¦¿ যিখন পৃষà§à¦ à¦¾ সমà§à¦ªà¦¾à¦¦à¦¨à¦¾ কৰিছে সেইখন à¦à¦‡ ছফà§à¦Ÿà§±à§‡à§°à§° ইণà§à¦Ÿà¦¾à§°à¦«à§‡â€™à¦š বাৰà§à¦¤à¦¾ দিবলৈ বà§à¦¯à§±à¦¹à¦¾à§° হয়।
à¦à¦‡ পৃষà§à¦ à¦¾à§° সাল-সলনিয়ে আন বà§à¦¯à§±à¦¹à¦¾à§°à¦•à¦¾à§°à§€à§° বাবে ইণà§à¦Ÿà¦¾à§°à¦«à§‡â€™à¦šà¦¤ পà§à§°à¦­à¦¾à§± পেলাব।
সকলো ৱিকিৰ বাবে অনà§à¦¬à¦¾à¦¦à§° বাবে অনà§à¦—à§à§°à¦¹ কৰি মিডিয়াৱিকি সà§à¦¥à¦¾à¦¨à§€à¦¯à¦¼à¦•à§°à¦£ পà§à§°à¦•à¦²à§à¦ª [//translatewiki.net/ translatewiki.net] বà§à¦¯à§±à¦¹à¦¾à§° কৰক ।",
-'sqlhidden' => '(নিহিত SQL query)',
'cascadeprotected' => 'à¦à¦‡ পৃষà§à¦ à¦¾à¦–ন সমà§à¦ªà¦¾à¦¦à¦¨à¦¾à§° পৰা সà§à§°à¦•à§à¦·à¦¿à¦¤ কাৰণ à¦à¦‡ {{PLURAL:$1|পৃষà§à¦ à¦¾, যিখন|পৃষà§à¦ à¦¾, যিবোৰ}} "পà§à§°à¦ªà¦¾à¦¤à¦¾à¦•à¦¾à§°" (cascading) বিকলà§à¦ªà§° সহযোগত সà§à§°à¦•à§à¦·à¦¿à¦¤ কৰা হৈছে:
$2',
'namespaceprotected' => "আপোনাৰ '''$1''' নামসà§à¦¥à¦¾à¦¨à§° পৃষà§à¦ à¦¾à¦¸à¦®à§‚হ সমà§à¦ªà¦¾à¦¦à¦¨à¦¾ কৰাৰ অধিকাৰ নাই।",
'customcssprotected' => 'à¦à¦‡ CSS পৃষà§à¦ à¦¾ সমà§à¦ªà¦¾à¦¦à¦¨à¦¾ কৰাৰ অধিকাৰ আপোনাৰ নাই, কাৰণ ইয়াত আন সদসà§à¦¯à§° বà§à¦¯à¦•à§à¦¤à¦¿à¦—ত পছনà§à¦¦à¦¸à¦®à§‚হত আছে ।',
'customjsprotected' => 'à¦à¦‡ জাভালিপিৰ পৃষà§à¦ à¦¾ সমà§à¦ªà¦¾à¦¦à¦¨à¦¾ কৰাৰ অধিকাৰ আপোনাৰ নাই, কাৰণ ইয়াত আন সদসà§à¦¯à§° বà§à¦¯à¦•à§à¦¤à¦¿à¦—ত পছনà§à¦¦à¦¸à¦®à§‚হত আছে ।',
+'mycustomcssprotected' => 'à¦à¦‡ CSS পৃষà§à¦ à¦¾ সমà§à¦ªà¦¾à¦¦à¦¨à¦¾ কৰিবলৈ আপোনাৰ অনà§à¦®à¦¤à¦¿ নাই।',
+'mycustomjsprotected' => 'à¦à¦‡ JavaScript পৃষà§à¦ à¦¾ সমà§à¦ªà¦¾à¦¦à¦¨à¦¾ কৰিবলৈ আপোনাৰ অনà§à¦®à¦¤à¦¿ নাই।',
+'myprivateinfoprotected' => 'বà§à¦¯à¦•à§à¦¤à¦¿à¦—ত তথà§à¦¯ সমà§à¦ªà¦¾à¦¦à¦¨à¦¾ কৰিবলৈ আপোনাৰ অনà§à¦®à¦¤à¦¿ নাই।',
+'mypreferencesprotected' => 'পছনà§à¦¦à¦¸à¦®à§‚হ সমà§à¦ªà¦¾à¦¦à¦¨à¦¾ কৰিবলৈ আপোনাৰ অনà§à¦®à¦¤à¦¿ নাই।',
'ns-specialprotected' => 'বিশেষ পৃষà§à¦ à¦¾ সমà§à¦ªà¦¾à¦¦à¦¿à¦¤ কৰিব নোৱাৰি।',
'titleprotected' => "[[User:$1|$1]] সদসà§à¦¯à¦œà¦¨à§‡ à¦à¦‡ শিৰোনাণমাৰ লিখনী লিখা ৰোধ কৰিছে ।
ইয়াৰ কাৰণ হৈছে ''$2'' ।",
@@ -596,10 +605,19 @@ $2',
আপোনাৰ সদসà§à¦¯à¦­à§à¦•à§à¦¤à¦¿ হৈ গ’ল ।
[[Special:Preferences|{{SITENAME}}ৰ পছনà§à¦¦à¦¸à¦®à§‚হ]]ত আপোনাৰ পছনà§à¦¦à¦®à¦¤à§‡ বà§à¦¯à¦•à§à¦¤à¦¿à¦—তকৰণ কৰি ল’বলৈ নাপাহৰে যেন ।',
'yourname' => 'সদসà§à¦¯à¦¨à¦¾à¦®:',
+'userlogin-yourname' => 'সদসà§à¦¯à¦¨à¦¾à¦®',
+'userlogin-yourname-ph' => 'আপোনাৰ সদসà§à¦¯à¦¨à¦¾à¦® লিখক',
+'createacct-another-username-ph' => 'সদসà§à¦¯à¦¨à¦¾à¦® লিখক',
'yourpassword' => 'আপোনাৰ গà§à¦ªà§à¦¤à¦¶à¦¬à§à¦¦',
+'userlogin-yourpassword' => 'গà§à¦ªà§à¦¤à¦¶à¦¬à§à¦¦',
+'userlogin-yourpassword-ph' => 'আপোনাৰ গà§à¦ªà§à¦¤à¦¶à¦¬à§à¦¦ লিখক',
+'createacct-yourpassword-ph' => 'à¦à¦Ÿà¦¾ গà§à¦ªà§à¦¤à¦¶à¦¬à§à¦¦ লিখক',
'yourpasswordagain' => 'গà§à¦ªà§à¦¤à¦¶à¦¬à§à¦¦ আকৌ à¦à¦¬à¦¾à§° লিখক',
+'createacct-yourpasswordagain' => 'গà§à¦ªà§à¦¤à¦¶à¦¬à§à¦¦ নিশà§à¦šà¦¿à¦¤ কৰক',
+'createacct-yourpasswordagain-ph' => 'গà§à¦ªà§à¦¤à¦¶à¦¬à§à¦¦ আকৌ লিখক',
'remembermypassword' => 'মোৰ পà§à§°à§±à§‡à¦¶ à¦à¦‡ কমà§à¦ªà¦¿à¦‰à¦Ÿà¦¾à§°à¦¤ মনত ৰাখিব (সৰà§à¦¬à¦¾à¦§à¦¿à¦• $1 {{PLURAL:$1|দিনলৈ|দিনলৈ}})',
-'securelogin-stick-https' => 'পà§à§°à§±à§‡à¦¶ কৰা পাছত HTTPS-ৰ দà§à¦¬à¦¾à§°à¦¾ সংযোগ ৰাখক',
+'userlogin-remembermypassword' => 'মোক লগà§â€Œ-ইন কৰাই ৰাখক',
+'userlogin-signwithsecure' => 'নিৰাপদ সংযোগ বà§à¦¯à§±à¦¹à¦¾à§° কৰক',
'yourdomainname' => 'আপোনাৰ ডমেইন:',
'password-change-forbidden' => 'আপà§à¦¨à¦¿ à¦à¦‡ ৱিকিত গà§à¦ªà§à¦¤à¦¶à¦¬à§à¦¦ সলাব নোৱাৰে।',
'externaldberror' => 'কোনো পà§à§°à¦¾à¦®à¦¾à¦£à§à¦¯à¦•à§°à¦£ তথà§à¦¯à¦•à§‹à¦·à§° তà§à§°à§à¦Ÿà¦¿ ঘটিছে নতà§à¦¬à¦¾ আপোনাৰ বৰà§à¦¹à¦¿-à¦à¦•à¦¾à¦‰à¦£à§à¦Ÿ নৱীকৰণ কৰাৰ অনà§à¦®à¦¤à¦¿ নাই ।',
@@ -611,18 +629,41 @@ $2',
'logout' => 'পà§à§°à¦¸à§à¦¥à¦¾à¦¨',
'userlogout' => 'পà§à§°à¦¸à§à¦¥à¦¾à¦¨',
'notloggedin' => 'পà§à§°à§±à§‡à¦¶ কৰা নাই',
+'userlogin-noaccount' => 'কোনো à¦à¦•à¦¾à¦‰à¦£à§à¦Ÿ নাই?',
+'userlogin-joinproject' => '{{SITENAME}}ত যোগদান কৰক',
'nologin' => "ৱিকিপিডিয়াত আপোনাৰ à¦à¦•à¦¾à¦‰à¦£à§à¦Ÿ নাই নেকি? তেনে '''$1'''।",
'nologinlink' => 'নতà§à¦¨ à¦à¦•à¦¾à¦‰à¦£à§à¦Ÿ খোলক',
'createaccount' => 'সভà§à¦¯à¦­à§à¦•à§à¦¤ হবলৈ',
'gotaccount' => "আপà§à¦¨à¦¿ সদসà§à¦¯ হয়নে? '''$1'''",
'gotaccountlink' => 'পà§à§°à§±à§‡à¦¶',
'userlogin-resetlink' => 'আপোনাৰ পà§à§°à§±à§‡à¦¶ তথà§à¦¯ পাহৰিছে?',
+'userlogin-resetpassword-link' => 'আপোনাৰ গà§à¦ªà§à¦¤à¦¶à¦¬à§à¦¦ ন-কৈ বহà§à§±à¦¾à¦“ক',
+'helplogin-url' => 'Help:পà§à§°à§±à§‡à¦¶/লগà§â€Œ-ইন',
+'userlogin-helplink' => '[[{{MediaWiki:helplogin-url}}|পà§à§°à§±à§‡à¦¶ সমà§à¦ªà§°à§à¦•à§€à¦¯à¦¼ সাহাযà§à¦¯]]',
+'createacct-join' => 'আপোনাৰ তথà§à¦¯à¦¸à¦®à§‚হ তলত লিখক।',
+'createacct-another-join' => 'নতà§à¦¨ à¦à¦•à¦¾à¦‰à¦£à§à¦Ÿà§° তথà§à¦¯à¦¸à¦®à§‚হ তলত লিখক।',
+'createacct-emailrequired' => 'ই-মেইল ঠিকনা',
+'createacct-emailoptional' => 'ই-মেইল ঠিকনা (বৈকলà§à¦ªà¦¿à¦•)',
+'createacct-email-ph' => 'আপোনাৰ ই-মেইল ঠিকনা লিখক',
+'createacct-another-email-ph' => 'ইমেইল ঠিকনা লিখক',
'createaccountmail' => 'à¦à¦Ÿà¦¾ যাদৃচà§à¦›à¦¿à¦• অসà§à¦¥à¦¾à¦¯à¦¼à§€ গà§à¦ªà§à¦¤à¦¶à¦¬à§à¦¦ বà§à¦¯à§±à¦¹à¦¾à§° কৰক আৰৠইয়াক তলত দিয়া ইমেইল ঠিকনাটোলৈ পঠিয়াই দিয়ক',
+'createacct-realname' => 'পà§à§°à¦•à§ƒà¦¤ নাম (বৈকলà§à¦ªà¦¿à¦•)',
'createaccountreason' => 'কাৰণ:',
+'createacct-reason' => 'কাৰণ',
+'createacct-reason-ph' => 'আপà§à¦¨à¦¿ কিয় আন à¦à¦Ÿà¦¾ à¦à¦•à¦¾à¦‰à¦£à§à¦Ÿ সৃষà§à¦Ÿà¦¿ কৰিছে',
+'createacct-captcha' => 'সà§à§°à¦•à§à¦·à¦¾ পৰীকà§à¦·à¦¾',
+'createacct-imgcaptcha-ph' => 'ওপৰত দেখা পোৱা পাঠà§à¦¯ লিখক',
+'createacct-submit' => 'আপোনাৰ à¦à¦•à¦¾à¦‰à¦£à§à¦Ÿ সৃষà§à¦Ÿà¦¿ কৰক',
+'createacct-another-submit' => 'আন à¦à¦Ÿà¦¾ à¦à¦•à¦¾à¦‰à¦£à§à¦Ÿ সৃষà§à¦Ÿà¦¿ কৰক',
+'createacct-benefit-heading' => 'আপোনাৰ দৰে মানà§à¦¹à§‡à¦‡ {{SITENAME}} তৈয়াৰ কৰিছে',
+'createacct-benefit-body1' => '{{PLURAL:$1|সমà§à¦ªà¦¾à¦¦à¦¨à¦¾}}',
+'createacct-benefit-body2' => '{{PLURAL:$1|পৃষà§à¦ à¦¾|পৃষà§à¦ à¦¾à¦¸à¦®à§‚হ}}',
+'createacct-benefit-body3' => 'শেহতীয়া {{PLURAL:$1|অৱদানকাৰী|অৱদানকাৰীসকল}}',
'badretype' => 'আপà§à¦¨à¦¿ দিয়া গà§à¦ªà§à¦¤ শবà§à¦¦ দà§à¦Ÿà¦¾ মিলা নাই।',
'userexists' => 'আপà§à¦¨à¦¿ দিয়া সদসà§à¦¯à¦¨à¦¾à¦® আগৰে পৰাই বà§à¦¯à§±à¦¹à¦¾à§° হৈ আছে।
অনà§à¦—à§à§°à¦¹ কৰি বেলেগ সদসà§à¦¯à¦¨à¦¾à¦® à¦à¦Ÿà¦¾ নিৰà§à¦¬à¦¾à¦šà¦¨ কৰক।',
'loginerror' => 'পà§à§°à§±à§‡à¦¶ সমসà§à¦¯à¦¾',
+'createacct-error' => 'à¦à¦•à¦¾à¦‰à¦£à§à¦Ÿ সৃষà§à¦Ÿà¦¿à¦¤ তà§à§°à§à¦Ÿà¦¿',
'createaccounterror' => "à¦à¦•à¦¾à¦‰à¦¨à§à¦Ÿ সৃষà§à¦Ÿà¦¿ কৰা নহ'ল: $1",
'nocookiesnew' => 'আপোনাৰ সদসà§à¦¯à¦­à§à¦•à§à¦¤à¦¿ হৈ গৈছে, কিনà§à¦¤à§ আপà§à¦¨à¦¿ পà§à§°à§±à§‡à¦¶ কৰা নাই।
{{SITENAME}}ত পà§à§°à§±à§‡à¦¶ কৰিবলৈ কà§à¦•à¦¿ সকà§à§°à¦¿à¦¯à¦¼ থাকিব লাগিব।
@@ -685,10 +726,12 @@ $2',
যদি à¦à¦‡à¦¯à¦¼à¦¾ ভà§à¦²à¦¤à§‡ হৈছে, তেনেহলে আপà§à¦¨à¦¿ à¦à¦‡ বাৰà§à¦¤à¦¾à¦Ÿà§‹ অবজà§à¦žà¦¾ কৰিব পাৰে ।',
'usernamehasherror' => 'সদসà§à¦¯à¦¨à¦¾à¦®à¦¤ হেচà§â€Œ চিহà§à¦¨ থাকিব নোৱাৰে',
'login-throttled' => 'আপà§à¦¨à¦¿ সâ€à¦®à§à¦ªà§à§°à¦¤à¦¿ অজসà§à§°à¦¬à¦¾à§° লগà§â€Œ-ইনৰ পà§à§°à¦¯à¦¼à¦¾à¦¸ কৰিছে ।
-অনà§à¦—à§à§°à¦¹ কৰি কিছৠসময় অপেকà§à¦·à¦¾ কৰি আকৌ পà§à§°à¦¯à¦¼à¦¾à¦¸ কৰক ।',
+অনà§à¦—à§à§°à¦¹ কৰি $1 সময়ৰ পিছত আকৌ চেষà§à¦Ÿà¦¾ কৰক ।',
'login-abort-generic' => 'আপোনাৰ পà§à§°à§±à§‡à¦¶ অসফল হৈছে- বাতিল কৰা হ’ল',
'loginlanguagelabel' => 'ভাষা: $1',
'suspicious-userlogout' => 'আপোনাৰ পà§à§°à¦¸à§à¦¥à¦¾à¦¨à§° অনà§à§°à§‹à¦§ বাতিল কৰা হৈছে কাৰণ হয়তো আপোনাৰ বà§à§°à¦¾à¦‰à¦œà¦¾à§° অসমà§à¦ªà§‚ৰà§à¦£ নতà§à¦¬à¦¾ পূৰà§à¦¬à§±à¦¤à§€ তথà§à¦¯ পঠাইছে ।',
+'createacct-another-realname-tip' => "পà§à§°à¦•à§ƒà¦¤ নাম দিয়াটো বৈকলà§à¦ªà¦¿à¦•à¥¤
+আপà§à¦¨à¦¿ নামটো দিলে সেইটো আপোনাৰ বৰঙণিসমূহৰ বাবে সà§à¦¬à§€à¦•à§ƒà¦¤à¦¿ পà§à§°à¦¦à¦¾à¦¨à¦¤ বà§à¦¯à§±à¦¹à¦¾à§° কৰা হ'ব।",
# Email sending
'php-mail-error-unknown' => 'পি.à¦à¦‡à¦›.পি মেইল () কাৰà§à¦¯à¦¤ অজà§à¦žà¦¾à¦¤ তà§à§°à§à¦Ÿà¦¿ ।',
@@ -704,7 +747,7 @@ $2',
'newpassword' => 'নতà§à¦¨ গà§à¦ªà§à¦¤à¦¶à¦¬à§à¦¦:',
'retypenew' => 'নতà§à¦¨ গà§à¦ªà§à¦¤à¦¶à¦¬à§à¦¦ আকৌ লিখক',
'resetpass_submit' => 'গà§à¦ªà§à¦¤à¦¶à¦¬à§à¦¦ বহà§à§±à¦¾à¦“ক আৰৠপà§à§°à§±à§‡à¦¶ কৰক',
-'resetpass_success' => 'আপোনাৰ গà§à¦ªà§à¦¤à¦¶à¦¬à§à¦¦ সফলতাৰে সলনি কৰা হৈছে, à¦à¦¤à¦¿à¦¯à¦¼à¦¾ আপà§à¦¨à¦¿ পà§à§°à§±à§‡à¦¶ কৰি আছে...',
+'changepassword-success' => 'আপোনাৰ গà§à¦ªà§à¦¤à¦¶à¦¬à§à¦¦ সফলতাৰে সলনি কৰা হৈছে!',
'resetpass_forbidden' => 'গà§à¦ªà§à¦¤à¦¶à¦¬à§à¦¦ সলনি কৰিব নোৱাৰি',
'resetpass-no-info' => 'à¦à¦‡ পৃষà§à¦ à¦¾ পà§à§°à¦¤à§à¦¯à¦•à§à¦· ভাৱে ঢà§à¦•à¦¿ পাবলৈ আপà§à¦¨à¦¿ পà§à§°à§±à§‡à¦¶ কৰিব লাগিব ।',
'resetpass-submit-loggedin' => 'গà§à¦ªà§à¦¤à¦¶à¦¬à§à¦¦ সলনি কৰক',
@@ -716,10 +759,10 @@ $2',
# Special:PasswordReset
'passwordreset' => 'গà§à¦ªà§à¦¤à¦¶à¦¬à§à¦¦ ন-কৈ বহà§à§±à¦¾à¦“ক',
-'passwordreset-text' => ' আপোনাৰ গà§à¦ªà§à¦¤à¦¶à¦¬à§à¦¦ ন-কৈ বহà§à§±à¦¾à¦¬à¦²à§ˆ তলৰ পà§à§°à¦ªà¦¤à§à§° সমà§à¦ªà§‚ৰà§à¦£ কৰক।',
+'passwordreset-text-one' => 'আপোনাৰ গà§à¦ªà§à¦¤à¦¶à¦¬à§à¦¦ ন-কৈ বহà§à§±à¦¾à¦¬à¦²à§ˆ à¦à¦‡ পà§à§°à¦ªà¦¤à§à§° পূৰণ কৰক।',
'passwordreset-legend' => 'গà§à¦ªà§à¦¤à¦¶à¦¬à§à¦¦ ন-কৈ বহাওক',
'passwordreset-disabled' => 'à¦à¦‡ ৱিকিত গà§à¦ªà§à¦¤à¦¶à¦¬à§à¦¦ নবীকৰণ নিষà§à¦•à§à§°à¦¿à¦¯à¦¼ কৰা হৈছে ।',
-'passwordreset-pretext' => '{{PLURAL:$1||তলত উলà§à¦²à§‡à¦– কৰা তথà§à¦¯à§° কোনো অংশ ভৰাওক}}',
+'passwordreset-emaildisabled' => 'à¦à¦‡ ৱিকিত ই-মেইল বৈশিষà§à¦Ÿà¦¸à¦®à§‚হ নিষà§à¦•à§à§°à¦¿à¦¯à¦¼ কৰা হৈছে।',
'passwordreset-username' => 'সদসà§à¦¯à¦¨à¦¾à¦®',
'passwordreset-domain' => 'ডমেইন :',
'passwordreset-capture' => 'ফলাফল ই-মেইলখন চাবলৈ বিচাৰিছে ?',
@@ -740,7 +783,7 @@ $2
অসà§à¦¥à¦¾à¦¯à¦¼à§€ গà§à¦ªà§à¦¤à¦¶à¦¬à§à¦¦: $2',
'passwordreset-emailsent' => 'à¦à¦–ন গà§à¦ªà§à¦¤à¦¶à¦¬à§à¦¦ উদà§à¦§à¦¾à§° ই-মেইল পঠিওৱা হৈছে।',
'passwordreset-emailsent-capture' => 'à¦à¦–ন গà§à¦ªà§à¦¤à¦¶à¦¬à§à¦¦ উদà§à¦§à¦¾à§° ইমেইল পঠিওৱা হৈছে, à¦à¦‡à¦–ন তলত দেখা পাব।',
-'passwordreset-emailerror-capture' => "à¦à¦–ন গà§à¦ªà§à¦¤à¦¶à¦¬à§à¦¦ উদà§à¦§à¦¾à§° ইমেইল সৃষà§à¦Ÿà¦¿ কৰা হ'ল কিনà§à¦¤à§ সদসà§à¦¯à¦œà¦¨à¦²à§ˆ পঠিয়াব পৰা নগ'ল, à¦à¦‡à¦–ন তলত দেখà§à¦“ৱা হৈছে: $1",
+'passwordreset-emailerror-capture' => "à¦à¦–ন গà§à¦ªà§à¦¤à¦¶à¦¬à§à¦¦ উদà§à¦§à¦¾à§° ইমেইল সৃষà§à¦Ÿà¦¿ কৰা হ'ল, কিনà§à¦¤à§ {{GENDER:$2|সদসà§à¦¯à¦œà¦¨à¦²à§ˆ}} পঠিয়াব পৰা নগ'ল। সেইখন তলত দেখà§à¦“ৱা হৈছে: $1",
# Special:ChangeEmail
'changeemail' => 'ই-মেইল ঠিকনা সলনি কৰক',
@@ -754,6 +797,9 @@ $2
'changeemail-submit' => 'ই-মেইল ঠিকনা সলনি কৰক',
'changeemail-cancel' => 'বাতিল কৰক',
+# Special:ResetTokens
+'resettokens' => "ট'কেন ৰিছে'ট কৰক",
+
# Edit page toolbar
'bold_sample' => 'গাঢ় পাঠà§à¦¯',
'bold_tip' => 'গাঢ় পাঠà§à¦¯',
@@ -961,12 +1007,14 @@ $1ৰ দà§à¦¬à¦¾à§°à¦¾ à¦à¦‡ অৱৰোধ কৰা হৈছে ।
সমà§à¦­à§±à¦¤à¦ƒ পৃষà§à¦ à¦¾à¦–ন বিলোপ কৰা হৈছে ।',
'edit-conflict' => 'সমà§à¦ªà¦¾à¦¦à¦¨à¦¾ দà§à¦¬à¦¨à§à¦¦à§à¦¬ ।',
'edit-no-change' => 'আপোনাৰ সমà§à¦ªà¦¾à¦¦à¦¨à¦¾ আওকাণ কৰা হৈছে, কাৰণ লেখাত কোনো তফাৎ নাই',
+'postedit-confirmation' => "আপোনাৰ সমà§à¦ªà¦¾à¦¦à¦¨à¦¾ সংৰকà§à¦·à¦¿à¦¤ কৰা হ'ল ।",
'edit-already-exists' => "নতà§à¦¨ পৃষà§à¦ à¦¾ সৃষà§à¦Ÿà¦¿ কৰা নহ'ল ।
পৃষà§à¦ à¦¾à¦–ন ইতিমধà§à¦¯à§‡ আছেই ।",
'defaultmessagetext' => 'সাধাৰণ বাৰà§à¦¤à¦¾ পাঠà§à¦¯',
'content-failed-to-parse' => '$1 মডেলৰ বাবে $2ৰ তথà§à¦¯ নিকা কৰিব পৰা নগ’ল: $3',
'invalid-content-data' => 'অবৈধ সমল তথà§à¦¯',
'content-not-allowed-here' => '[[$2]] পৃষà§à¦ à¦¾à¦¤ "$1" সমল অনà§à¦®à§‹à¦¦à¦¿à¦¤ নহয়',
+'editwarning-warning' => 'à¦à¦‡ পৃষà§à¦ à¦¾à¦Ÿà§‹ à¦à§°à¦¿à¦²à§‡ আপà§à¦¨à¦¿ কৰা পৰিবৰà§à¦¤à¦¨à¦¸à¦®à§‚হ হেৰাব পাৰে। যদি আপà§à¦¨à¦¿ পà§à§°à§±à§‡à¦¶ কৰা অৱসà§à¦¥à¦¾à¦¤ আছে, আপà§à¦¨à¦¿ à¦à¦‡ সতৰà§à¦•à¦¬à¦¾à§°à§à¦¤à¦¾à¦• আপোনাৰ পছনà§à¦¦à¦¸à¦®à§‚হৰ "সমà§à¦ªà¦¾à¦¦à¦¨à¦¾" অংশত অসামৰà§à¦¥à¦¬à¦¾à¦¨ কৰিব পাৰিব।',
# Content models
'content-model-wikitext' => 'ৱিকিপাঠà§à¦¯',
@@ -1212,7 +1260,6 @@ $1",
'searchmenu-legend' => 'সনà§à¦§à¦¾à¦¨ বিকলà§à¦ªà¦¸à¦®à§‚হ',
'searchmenu-exists' => 'à¦à¦‡ ৱিকিত "[[:$1]]" নামৰ পৃষà§à¦ à¦¾ à¦à¦–ন আছে ।',
'searchmenu-new' => "'''à¦à¦‡ ৱিকিত \"[[:\$1]]\" পৃষà§à¦ à¦¾à¦–ন সৃষà§à¦Ÿà¦¿ কৰক!'''",
-'searchhelp-url' => 'Help:সমল',
'searchmenu-prefix' => '[[Special:PrefixIndex/$1|à¦à¦‡ উপসৰà§à¦— থকা পৃষà§à¦ à¦¾à¦¸à¦®à§‚হ বà§à§°à¦¾à¦‰à¦œ কৰক]]',
'searchprofile-articles' => 'বিষয়বসà§à¦¤à§à§° পৃষà§à¦ à¦¾',
'searchprofile-project' => 'সহায় আৰৠপà§à§°à¦•à¦²à§à¦ª পৃষà§à¦ à¦¾à¦¸à¦®à§‚হ',
@@ -1256,15 +1303,7 @@ $1",
'searchdisabled' => '{{SITENAME}} ত অনà§à¦¸à¦¨à§à¦§à¦¾à¦¨ কৰা সাময়িক ভাবে নিষà§à¦•à§à§°à¦¿à¦¯à¦¼ কৰা হৈছে।
তেতিয়ালৈকে গà§à¦—লত অনà§à¦¸à¦¨à§à¦§à¦¾à¦¨ কৰক।
মনত ৰাখিব যে তেà¦à¦“লোকৰ {{SITENAME}}ৰ ইণà§à¦¡à§‡à¦•à§à¦¸ পà§à§°à¦£à¦¿ হব পাৰে।',
-
-# Quickbar
-'qbsettings' => 'শীঘà§à§°à¦¦à¦£à§à¦¡à¦¿à¦•à¦¾',
-'qbsettings-none' => 'à¦à¦•à§‡à¦¬à¦¾à§°à§‡ নহয়',
-'qbsettings-fixedleft' => 'বাà¦à¦“ফাল সà§à¦¥à¦¿à§°',
-'qbsettings-fixedright' => 'সোà¦à¦«à¦¾à¦² সà§à¦¥à¦¿à§°',
-'qbsettings-floatingleft' => 'বাà¦à¦“ফাল অসà§à¦¥à¦¿à§°',
-'qbsettings-floatingright' => 'সোà¦à¦«à¦¾à¦² অসà§à¦¥à¦¿à§°',
-'qbsettings-directionality' => 'আপোনাৰ ভাষাৰ আৰৠলিপিৰ দিশৰ ওপৰত নিৰà§à¦­à§° কৰি ঠিক কৰা হ’ল',
+'search-error' => 'অনà§à¦¸à¦¨à§à¦§à¦¾à¦¨à§° সময়ত à¦à¦Ÿà¦¾ তà§à§°à§à¦Ÿà¦¿ হৈছে: $1',
# Preferences page
'preferences' => 'পছনà§à¦¦à¦¸à¦®à§‚হ',
@@ -1298,7 +1337,6 @@ $1",
'resetprefs' => 'অসঞà§à¦šà¦¿à¦¤ সাল-সলনি বাতিল কৰক',
'restoreprefs' => 'সকলো পূৰà§à¦¬à¦¨à¦¿à§°à§à¦§à¦¾à§°à¦¿à¦¤ ছেটিং ঘূৰাই আনক',
'prefs-editing' => 'সমà§à¦ªà¦¾à¦¦à¦¨',
-'prefs-edit-boxsize' => "সমà§à¦ªà¦¾à¦¦à¦¨à¦¾ ৱিণà§à¦¡'ৰ আকাৰ",
'rows' => 'পথালী শাৰী:',
'columns' => 'ঠিয় শাৰী:',
'searchresultshead' => 'অনà§à¦¸à¦¨à§à¦§à¦¾à¦¨',
@@ -1309,8 +1347,6 @@ $1",
'recentchangesdays-max' => 'সৰà§à¦¬à§‹à¦šà§à¦š $1 {{PLURAL:$1|দিন|দিন}}',
'recentchangescount' => 'শেহতীয়া সাল-সলনি, ইতিহাস আৰৠলগ পৃষà§à¦ à¦¾à¦¤ দেখà§à§±à¦¾à¦¬ লগা সমà§à¦ªà¦¾à¦¦à¦¨à¦¾à§° সংখà§à¦¯à¦¾:',
'prefs-help-recentchangescount' => 'ইয়াত শেহতীয়া সাল-সলনি, পৃষà§à¦ à¦¾à§° ইতিহাস আৰৠলগ অনà§à¦¤à§°à§à¦­à§à¦•à§à¦¤ ।',
-'prefs-help-watchlist-token' => 'à¦à¦‡ ঘৰটো à¦à¦Ÿà¦¾ গোপন শবà§à¦¦ চাবিৰে পূৰণ কৰিলে আপোনাৰ লকà§à¦·à§à¦¯-তালিকাৰ বাবে à¦à¦Ÿà¦¾ আৰ.à¦à¦š.à¦à¦š. ফিড তৈয়াৰ হ’ব । à¦à¦‡ শবà§à¦¦à¦šà¦¾à¦¬à¦¿ জনা সদসà§à¦¯à¦‡ আপোনাৰ লকà§à¦·à§à¦¯-তালিকা চাব পাৰিব, সেয়ে à¦à¦Ÿà¦¾ সà§à§°à¦•à§à¦·à¦¿à¦¤ মান বà§à¦¯à§±à¦¹à¦¾à§° কৰক ।
-আপà§à¦¨à¦¿ বà§à¦¯à§±à¦¹à¦¾à§° কৰিব পৰাকৈ à¦à¦Ÿà¦¾ যাদৃচà§à¦›à¦¿à¦• মান দিয়া হ’ল: $1',
'savedprefs' => 'আপোনাৰ পছনà§à¦¦à¦¸à¦®à§‚হ সাà¦à¦šà¦¿ ৰখা হ’ল।',
'timezonelegend' => 'সময় সà§à¦¥à¦¾à¦¨:',
'localtime' => 'সà§à¦¥à¦¾à¦¨à§€à¦¯à¦¼ সময়:',
@@ -1341,7 +1377,6 @@ $1",
'prefs-reset-intro' => 'আপà§à¦¨à¦¿ à¦à¦‡ পৃষà§à¦ à¦¾ বà§à¦¯à§±à¦¹à¦¾à§° কৰি আপোনাৰ পছনà§à¦¦à¦¸à¦®à§‚হক চাইটৰ পূৰà§à¦¬à¦¨à¦¿à§°à§à¦§à¦¾à§°à¦¿à¦¤ ছেটঙলৈ ঘূৰাই নিব পাৰে ।
à¦à¦‡ পৰিৱৰà§à¦¤à¦¨ পিছত সলাব পৰা নাযাব ।',
'prefs-emailconfirm-label' => 'ইমেইল নিশà§à¦šà¦¿à¦¤à¦•à§°à¦£:',
-'prefs-textboxsize' => 'সমà§à¦ªà¦¾à¦¦à¦¨à¦¾ ৱিণà§à¦¡â€™à§° আকাৰ',
'youremail' => 'আপোনাৰ ই-মেইল *',
'username' => '{{GENDER:$1|সদসà§à¦¯à¦¨à¦¾à¦®}}:',
'uid' => '{{GENDER:$1|User}} চিহà§à¦¨:',
@@ -1408,6 +1443,8 @@ $1",
'userrights-notallowed' => 'সদসà§à¦¯à§° অধিকাৰ যোগ কৰিবলৈ বা আà¦à¦¤à§° কৰিবলৈ আপোনাৰ à¦à¦•à¦¾à¦‰à¦£à§à¦Ÿà§° অনà§à¦®à¦¤à¦¿ নাই ।',
'userrights-changeable-col' => 'আপà§à¦¨à¦¿ সলনি কৰিব পৰা গোটসমূহ',
'userrights-unchangeable-col' => 'আপà§à¦¨à¦¿ সলনি কৰিব নোৱাৰা গোটসমূহ',
+'userrights-conflict' => 'সদসà§à¦¯ অধিকাৰ দà§à¦¬à¦¨à§à¦¦à§à¦¬! অনà§à¦—à§à§°à¦¹ কৰি আপোনাৰ সালসলনি আকৌ à¦à¦¬à¦¾à§° পà§à§°à¦¯à¦¼à§‹à¦— কৰক।',
+'userrights-removed-self' => 'আপà§à¦¨à¦¿ সফলতাৰে নিজৰ অধিকাৰসমূহ আà¦à¦¤à§° কৰিলে। গতিকে আপà§à¦¨à¦¿ à¦à¦¤à¦¿à¦¯à¦¼à¦¾ à¦à¦‡ পৃষà§à¦ à¦¾ চাব নোৱাৰে।',
# Groups
'group' => 'গোট:',
@@ -1478,6 +1515,9 @@ $1",
'right-editusercssjs' => 'আন সদসà§à¦¯à§° CSS আৰৠJavaScript সমà§à¦ªà¦¾à¦¦à¦¨à¦¾ কৰক',
'right-editusercss' => 'আন সদসà§à¦¯à§° CSS ফাইল সমà§à¦ªà¦¾à¦¦à¦¨à¦¾ কৰক',
'right-edituserjs' => 'আন সদসà§à¦¯à§° JavaScript ফাইল সমà§à¦ªà¦¾à¦¦à¦¨à¦¾ কৰক',
+'right-editmyusercss' => 'আপোনাৰ নিজৰ সদসà§à¦¯ CSS ফাইলসমূহ সমà§à¦ªà¦¾à¦¦à¦¨à¦¾ কৰক।',
+'right-editmyuserjs' => 'আপোনাৰ নিজৰ সদসà§à¦¯ JavaScript ফাইলসমূহ সমà§à¦ªà¦¾à¦¦à¦¨à¦¾ কৰক',
+'right-viewmywatchlist' => 'আপোনাৰ নিজৰ লকà§à¦·à§à¦¯-তালিকা চাওক',
'right-rollback' => 'শেষৰজন সদসà§à¦¯à¦‡ à¦à¦–ন নিৰà§à¦¦à¦¿à¦·à§à¦Ÿ পৃষà§à¦Ÿà¦¾à¦¤ কৰা সমà§à¦ªà¦¾à¦¦à¦¨à¦¾ পূৰà§à¦¬à§° অৱসà§à¦¥à¦¾à¦²à§ˆ ঘূৰাই আনক',
'right-markbotedits' => 'ৰ’লà§à¦¡-বেক সমà§à¦ªà¦¾à¦¦à¦¨à¦¾à¦¸à¦®à§‚হ বট সমà§à¦ªà¦¾à¦¦à¦¨à¦¾ বà§à¦²à¦¿ চিহà§à¦¨à¦¿à¦¤ কৰক',
'right-noratelimit' => 'গতি সীমাৰ দà§à¦¬à¦¾à§°à¦¾ পà§à§°à¦­à¦¾à§±à¦¿à¦¤ নহ’ব',
@@ -1581,7 +1621,6 @@ $1",
'recentchangeslinked-feed' => 'পà§à§°à¦¾à¦¸à¦‚গিক সালসলনিসমূহ',
'recentchangeslinked-toolbox' => 'পà§à§°à¦¾à¦¸à¦‚গিক সালসলনিসমূহ',
'recentchangeslinked-title' => '"$1"ৰ লগত জড়িত সাল-সলনি',
-'recentchangeslinked-noresult' => 'দিয়া সময়ৰ ভিতৰত সংযোজিত পৃষà§à¦ à¦¾ সমূহত সাল-সলনি হোৱা নাই ।',
'recentchangeslinked-summary' => "à¦à¦–ন নিৰà§à¦¦à¦¿à¦·à§à¦Ÿ পৃষà§à¦ à¦¾à§° লগত সংযà§à¦•à§à¦¤ পৃষà§à¦ à¦¾à¦¸à¦®à§‚হৰ( বা à¦à¦Ÿà¦¾ নিৰà§à¦¦à¦¿à¦·à§à¦Ÿ শà§à§°à§‡à¦£à§€à§° সদসà§à¦¯à¦¸à¦®à§‚হৰ) শেহতীয়া সালসলনিৰ তালিকা তলত দিয়া হৈছে ।
[[Special:Watchlist|আপà§à¦¨à¦¿ চকৠৰখা পৃষà§à¦ à¦¾à¦¸à¦®à§‚হৰ তালিকা]] ত থকা পৃষà§à¦ à¦¾à¦¸à¦®à§‚হ '''গাঢ়''' দেখা পাব ।",
'recentchangeslinked-page' => 'পৃষà§à¦ à¦¾à§° নাম:',
@@ -1817,7 +1856,6 @@ https://www.mediawiki.org/wiki/Manual:Image_Authorization চাওক।",
'http-read-error' => 'HTTP পঠন তà§à§°à§à¦Ÿà¦¿ ।',
'http-timed-out' => 'HTTP অনà§à§°à§‹à¦§à§° সময় পাৰ হৈছে ।',
'http-curl-error' => 'URL অনাত তà§à§°à§à¦Ÿà¦¿ হৈছে: $1',
-'http-host-unreachable' => 'URL পাব পৰা নগ’ল ।',
'http-bad-status' => 'HTTP অনà§à§°à§‹à¦§à§° সময়ত কোনো সমসà§à¦¯à¦¾ হৈছে: $1, $2',
# Some likely curl errors. More could be added from <http://curl.haxx.se/libcurl/c/libcurl-errors.html>
@@ -1971,12 +2009,6 @@ https://www.mediawiki.org/wiki/Manual:Image_Authorization চাওক।",
'statistics-users-active-desc' => 'শেষ {{PLURAL:$1|দিনত|$1 দিনত}} কোনো কাম কৰা সদসà§à¦¯à¦¸à¦®à§‚হ',
'statistics-mostpopular' => 'সৰà§à¦¬à§‹à¦šà§à¦š দৰà§à¦¶à¦¨ কৰা পৃষà§à¦ à¦¾à¦¸à¦®à§‚হ',
-'disambiguations' => 'দà§à¦¬à§à¦¯à§°à§à¦¥à¦¤à¦¾-দূৰীকৰণ পৃষà§à¦ à¦¾à¦¸à¦®à§‚হলৈ সংযোগ থকা পৃষà§à¦ à¦¾à¦¸à¦®à§‚হ',
-'disambiguationspage' => 'সাà¦à¦š:দà§à¦¬à§à¦¯à§°à§à¦¥à¦¤à¦¾-দূৰীকৰণ',
-'disambiguations-text' => "তলৰ পৃষà§à¦ à¦¾à¦–নসমূহত অনà§à¦¤à¦¤à¦ƒ à¦à¦Ÿà¦¾ হ'লেই '''দà§à¦¬à§à¦¯à§°à§à¦¥à¦¤à¦¾ দূৰীকৰণ পৃষà§à¦ à¦¾'''ৰ সংযোগ আছে।
-তাৰ সলনি সেইবোৰত উপযà§à¦•à§à¦¤ পৃষà§à¦ à¦¾à§° লগত সংযোগ থাকিব পাৰে।
-[[MediaWiki:Disambiguationspage]]ৰ পৰা সংযোগ থকা কোনো সাà¦à¦š বà§à¦¯à§±à¦¹à¦¾à§° কৰিলে à¦à¦–ন পৃষà§à¦ à¦¾à¦• দà§à¦¬à§à¦¯à§°à§à¦¥à¦¤à¦¾ দূৰীকৰণ পৃষà§à¦ à¦¾ হিছাপে গণà§à¦¯ কৰা হয়।",
-
'pageswithprop' => 'পৃষà§à¦ à¦¾ উপাদান সমà§à¦¬à¦²à¦¿à¦¤ পৃষà§à¦ à¦¾à¦¸à¦®à§‚হ',
'pageswithprop-legend' => 'পৃষà§à¦ à¦¾ উপাদান সমà§à¦¬à¦²à¦¿à¦¤ পৃষà§à¦ à¦¾à¦¸à¦®à§‚হ',
'pageswithprop-text' => 'বিশেষ পৃষà§à¦ à¦¾ উপাদান বà§à¦¯à§±à¦¹à¦¾à§° কৰা পৃষà§à¦ à¦¾à¦¸à¦®à§‚হ ইয়াত তালিকাভà§à¦•à§à¦¤ কৰা হৈছে।',
@@ -2230,10 +2262,9 @@ https://www.mediawiki.org/wiki/Manual:Image_Authorization চাওক।",
'unwatchthispage' => 'চকৠদিয়া বনà§à¦§ কৰক',
'notanarticle' => 'বিষয়বসà§à¦¤à§ পৃষà§à¦ à¦¾ নহয়',
'notvisiblerev' => 'অনà§à¦¯ কোনো সদসà§à¦¯à¦‡ কৰা সংশোধনী বিলোপ কৰা হৈছে',
-'watchnochange' => 'আপà§à¦¨à¦¿ চকৠৰখা আইটেমসমূহ পà§à§°à¦¦à§°à§à¦¶à¦¿à¦¤ সময়সীমাৰ ভিতৰত সমà§à¦ªà¦¾à¦¦à¦¨à¦¾ কৰা হোৱা নাই ।',
'watchlist-details' => 'আলোচনা পৃষà§à¦ à¦¾ সমূহ লেখত নধৰি {{PLURAL:$1|$1 খন পৃষà§à¦ à¦¾|$1 খন পৃষà§à¦ à¦¾}} আপোনাৰ লকà§à¦·à§à¦¯-তালিকাত আছে ।',
-'wlheader-enotif' => '* ই-পতà§à§° জাননী সকà§à§°à¦¿à¦¯à¦¼ কৰা হৈছে ।',
-'wlheader-showupdated' => "* আপোনাৰ শেষ পৰিদৰà§à¦¶à¦¨à§° পিছত হোৱা পৰিৱৰà§à¦¤à¦¨à¦¸à¦®à§‚হ '''গাঢ়''' আখৰত দেখà§à¦“ৱা হৈছে",
+'wlheader-enotif' => 'ইমেইল জাননী সকà§à§°à¦¿à¦¯à¦¼ কৰা হৈছে।',
+'wlheader-showupdated' => "আপোনাৰ শেষ পৰিদৰà§à¦¶à¦¨à§° পিছত সলনি হোৱা পৃষà§à¦ à¦¾à¦¸à¦®à§‚হ '''গাঢ়''' আখৰত দেখà§à¦“ৱা হৈছে।",
'watchmethod-recent' => 'লকà§à¦·à§à¦¯ কৰা পৃষà§à¦ à¦¾à¦¸à¦®à§‚হ শেহতীয়া সমà§à¦ªà¦¾à¦¦à¦¨à¦¾à§° বাবে পৰীকà§à¦·à¦¾ কৰা হৈছে',
'watchmethod-list' => 'লকà§à¦·à§à¦¯ কৰা পৃষà§à¦ à¦¾à¦¸à¦®à§‚হ শেহতীয়া সমà§à¦ªà¦¾à¦¦à¦¨à¦¾à§° বাবে পৰীকà§à¦·à¦¾ কৰা হৈছে',
'watchlistcontains' => 'আপোনাৰ লকà§à¦·à§à¦¯-তালিকাত $1 খন {{PLURAL:$1|পৃষà§à¦ à¦¾|পৃষà§à¦ à¦¾}} আছে ।',
@@ -2645,12 +2676,9 @@ $1ৰ অৱৰোধৰ কাৰণ: "$2"',
কিনà§à¦¤à§ à¦à¦‡à¦Ÿà§‹ $2 পৰিসীমাৰ অনà§à¦¤à§°à§à¦—ত যাৰ বাধা আà¦à¦¤à§°à¦¾à¦¬ পাৰি ।',
'ip_range_invalid' => 'অবৈধ আই.পি. পৰিসৰ ।',
'ip_range_toolarge' => '/$1তকৈ ডাঙৰ পà§à§°à¦¤à¦¿à¦¬à¦¨à§à¦§à¦• পৰিসৰ অনà§à¦®à§‹à¦¦à¦¿à¦¤ নহয় ।',
-'blockme' => 'মোক বাৰণ কৰক',
'proxyblocker' => 'পà§à§°à¦•à§à¦¸à§€ অৱৰোধকাৰী',
-'proxyblocker-disabled' => 'à¦à¦‡ ফাংচনটো নিষà§à¦•à§à§°à¦¿à¦¯à¦¼',
'proxyblockreason' => 'আপোনাৰ আই.পি. ঠিকনা অৱৰোধ কৰা হৈছে কাৰণ à¦à¦‡à¦Ÿà§‹ à¦à¦Ÿà¦¾ মà§à¦•à§à¦¤ পà§à§°à¦•à§à¦¸à§€ ।
অনà§à¦—à§à§°à¦¹ কৰি আপোনাৰ ইণà§à¦Ÿà¦¾à§°à¦¨à§‡à¦Ÿ সেৱা পà§à§°à¦¦à¦¾à¦¨à¦•à¦¾à§°à§€ বা কাৰিকৰী সহায়কৰà§à¦¤à¦¾à§° লগত যোগাযোগ কৰক আৰৠà¦à¦‡ গà§à§°à§à¦¤à§° সà§à§°à¦•à§à¦·à¦¾ সমসà§à¦¯à¦¾à§° বিষয়ে জনাওক ।',
-'proxyblocksuccess' => 'সমà§à¦ªà¦¨à§à¦¨ কৰা হ’ল ।',
'sorbsreason' => '{{SITENAME}}ত বà§à¦¯à§±à¦¹à¦¾à§° কৰা DNSBLত আপোনাৰ আই.পি. ঠিকনা মà§à¦•à§à¦¤ পà§à§°à¦•à§à¦¸à§€ হিছাপে তালিকাভà§à¦•à§à¦¤ হৈ আছে ।',
'sorbs_create_account_reason' => '{{SITENAME}}ত বà§à¦¯à§±à¦¹à¦¾à§° কৰা DNSBLত আপোনাৰ আই.পি. ঠিকনা মà§à¦•à§à¦¤ পà§à§°à¦•à§à¦¸à§€ হিছাপে তালিকাভà§à¦•à§à¦¤ হৈ আছে ।
আপà§à¦¨à¦¿ à¦à¦•à¦¾à¦‰à¦£à§à¦Ÿ সৃষà§à¦Ÿà¦¿ কৰিব নোৱাৰে',
@@ -2821,6 +2849,8 @@ $1ৰ অৱৰোধৰ কাৰণ: "$2"',
'thumbnail-more' => 'ডাঙৰকৈ চাওক',
'filemissing' => 'ফাইল বিচাৰি পোৱা নগ’ল',
'thumbnail_error' => 'কà§à¦·à§à¦¦à§à§° পà§à§°à¦¤à¦¿à¦•à§ƒà¦¤à¦¿ সৃষà§à¦Ÿà¦¿ কৰাত অসà§à¦¬à¦¿à¦§à¦¾ হৈছে: $1',
+'thumbnail_error_remote' => '$1ৰপৰা তà§à§°à§à¦Ÿà¦¿ বাৰà§à¦¤à¦¾:
+$2',
'djvu_page_error' => 'DjVu পৃষà§à¦ à¦¾ পৰিসীমাৰ বাহিৰত',
'djvu_no_xml' => "DjVu ফাইলৰ বাবে XML আনিব পৰা নগ'ল",
'thumbnail-temp-create' => 'অসà§à¦¥à¦¾à¦¯à¦¼à§€ থামà§à¦¬à¦¨à§‡à¦‡à¦² নথিপতà§à§° সৃষà§à¦Ÿà¦¿ কৰিবলে অকà§à¦·à¦®',
@@ -3117,11 +3147,25 @@ $1',
'minutes' => '{{PLURAL:$1|$1 মিনিট|$1 মিনিট}}',
'hours' => '{{PLURAL:$1|$1 ঘনà§à¦Ÿà¦¾|$1 ঘনà§à¦Ÿà¦¾}}',
'days' => '{{PLURAL:$1|$1 দিন|$1 দিন}}',
+'weeks' => '{{PLURAL:$1|$1 সপà§à¦¤à¦¾à¦¹}}',
'months' => '{{PLURAL:$1|$1 মাহ}}',
'years' => '{{PLURAL:$1|$1বছৰ|$1 বছৰ}}',
'ago' => '$1 আগেয়ে',
'just-now' => 'à¦à¦‡à¦®à¦¾à¦¤à§à§°',
+# Human-readable timestamps
+'hours-ago' => '$1 {{PLURAL:$1|ঘনà§à¦Ÿà¦¾}} আগেয়ে',
+'minutes-ago' => '$1 {{PLURAL:$1|মাহ}} আগেয়ে',
+'seconds-ago' => '$1 {{PLURAL:$1|ছেকেনà§à¦¡}} আগতে',
+'monday-at' => 'সোমবাৰে $1ত',
+'tuesday-at' => 'মঙà§à¦—লবাৰে $1’ত',
+'wednesday-at' => 'বà§à¦§à¦¬à¦¾à§°à§‡ $1’ত',
+'thursday-at' => 'বৃহসà§à¦ªà¦¤à¦¿à¦¬à¦¾à§°à§‡ $1’ত',
+'friday-at' => 'শà§à¦•à§à§°à¦¬à¦¾à§°à§‡ $1’ত',
+'saturday-at' => 'শনিবাৰে $1’ত',
+'sunday-at' => 'দেওবাৰে $1’ত',
+'yesterday-at' => 'কালি $1’ত',
+
# Bad image list
'bad_image_list' => 'The format is as follows:
@@ -3151,7 +3195,7 @@ Any subsequent links on the same line are considered to be exceptions, i.e. page
* gpslongitude
* gpsaltitude',
-# EXIF tags
+# Exif tags
'exif-imagewidth' => 'পà§à§°à¦¸à§à¦¥',
'exif-imagelength' => 'উচà§à¦šà¦¤à¦¾',
'exif-bitspersample' => 'পà§à§°à¦¤à¦¿ অংশৰ বিট',
@@ -3329,7 +3373,7 @@ Any subsequent links on the same line are considered to be exceptions, i.e. page
'exif-originalimageheight' => "কà§à§°'প কৰাৰ আগত ছবিৰ উচà§à¦šà¦¤à¦¾",
'exif-originalimagewidth' => "কà§à§°'প কৰাৰ আগত ছবিৰ পà§à§°à¦¸à§à¦¥à¦¤à¦¾",
-# EXIF attributes
+# Exif attributes
'exif-compression-1' => 'অসংকà§à¦šà¦¿à¦¤',
'exif-compression-2' => "CCITT দল ৩ ১-পৰিসৰ পৰিৱৰà§à¦¤à§€à¦¤ Huffman চলন দৈৰà§à¦˜à§à¦¯ à¦à¦¨à¦•'ডিং",
'exif-compression-3' => "CCITT দল ৩ ফেকà§à¦¸ à¦à¦¨à¦•'ডিং",
@@ -3725,7 +3769,6 @@ $5
'version-other' => 'অনà§à¦¯',
'version-mediahandlers' => 'মাধà§à¦¯à¦® বà§à¦¯à§±à¦¸à§à¦¥à¦¾à¦ªà¦•à¦¸à¦®à§‚হ',
'version-hooks' => 'হà§à¦•à¦¸à¦®à§‚হ',
-'version-extension-functions' => 'সমà§à¦ªà§à§°à¦¸à¦¾à§°à¦¨ ফলনসমূহ',
'version-parser-extensiontags' => 'পাৰà§à¦šà¦¾à§° à¦à¦•à§à¦¸à¦Ÿà§‡à¦¨à¦šà¦¨ টেগসমূহ',
'version-parser-function-hooks' => 'পাৰà§à¦šà¦¾à§° ফাংচন হà§à¦•à¦¸à¦®à§‚হ',
'version-hook-name' => 'হà§à¦• নাম',
@@ -3749,12 +3792,17 @@ $5
'version-entrypoints-header-entrypoint' => 'পà§à§°à§±à§‡à¦¶ পইণà§à¦Ÿ',
'version-entrypoints-header-url' => 'ইউআৰà¦à¦²',
-# Special:FilePath
-'filepath' => 'নথিৰ পথ',
-'filepath-page' => 'নথি:',
-'filepath-submit' => 'যাওক',
-'filepath-summary' => 'à¦à¦‡ বিশেষ পৃষà§à¦ à¦¾à¦¯à¦¼ à¦à¦Ÿà¦¾ নথিপতà§à§°à§° বাবে সমà§à¦ªà§‚ৰà§à¦£ পথ ঘà§à§°à¦¾à¦‡ পঠায়।
-ছবিসমূহক সমà§à¦ªà§‚ৰà§à¦£ বিভেদনত দেখà§à§±à¦¾ হয়, অনà§à¦¯ নথিপতà§à§° ধৰণসমূহ সিহতৰ সংলঘà§à¦¨ পà§à§°à¦—à§à§°à¦¾à¦®à§° সৈতে পà§à§°à¦¤à§à¦¯à¦•à§à¦·à¦­à¦¾à§±à§‡ আৰমà§à¦­ হয়।',
+# Special:Redirect
+'redirect' => 'ফাইল, সদসà§à¦¯, বা সংশোধন আই ডিৰে পà§à¦¨à¦ƒà¦¨à¦¿à§°à§à¦¦à§‡à¦¶',
+'redirect-legend' => 'à¦à¦Ÿà¦¾ ফাইল বা à¦à¦–ন à¦à¦–ন পৃষà§à¦ à¦¾à¦²à§ˆ পà§à¦¨à¦ƒà¦¨à¦¿à§°à§à¦¦à§‡à¦¶',
+'redirect-summary' => 'à¦à¦‡ বিশেষ পৃষà§à¦ à¦¾à¦Ÿà§‹à§±à§‡ আপোনাক পà§à¦¨à¦ƒà¦¨à¦¿à¦°à§à¦¦à§‡à¦¶à¦¿à¦¤ কৰিছে অনà§à¦¯ à¦à¦Ÿà¦¾ নথিপতà§à¦°à¦²à§ˆ (নথিপতà§à¦°à§° নাম), à¦à¦Ÿà¦¾ পৃষà§à¦ à¦¾à¦²à§ˆ (পৃষà§à¦ à¦¾à§° নাম), অথবা অনà§à¦¯ সদসà§à¦¯à§° পৃষà§à¦ à¦¾à¦²à§ˆ(সংখà§à¦¯à¦¾à§°à§‡ লিখা সদসà§à¦¯à§° আইডি) ।',
+'redirect-submit' => 'যাওক',
+'redirect-lookup' => 'চাওক:',
+'redirect-value' => 'মূলà§à¦¯:',
+'redirect-user' => 'সদসà§à¦¯ আই ডি',
+'redirect-revision' => 'পৃষà§à¦ à¦¾ সংশোধন',
+'redirect-file' => 'ফাইলৰ নাম',
+'redirect-not-exists' => "মূলà§à¦¯ পোৱা নগ'ল",
# Special:FileDuplicateSearch
'fileduplicatesearch' => 'পà§à§°à¦¤à¦¿à¦²à¦¿à¦ªà¦¿ পৃষà§à¦ à¦¾à¦¸à¦®à§‚হ অনà§à¦¸à¦¨à§à¦§à¦¾à¦¨ কৰক',
@@ -3845,6 +3893,9 @@ $5
'htmlform-submit' => 'দাখিল কৰক',
'htmlform-reset' => 'সাল-সলনি বাতিল কৰক',
'htmlform-selectorother-other' => 'অনà§à¦¯',
+'htmlform-no' => 'নহয়',
+'htmlform-yes' => 'হয়',
+'htmlform-chosen-placeholder' => 'à¦à¦Ÿà¦¾ বিকলà§à¦ª বাছনি কৰক',
# SQLite database support
'sqlite-has-fts' => '$1 সমà§à¦ªà§‚ৰà§à¦£-পাঠ অনà§à¦¸à¦¨à§à¦§à¦¾à¦¨ সমৰà§à¦¥à¦¨ সহ',
diff --git a/languages/messages/MessagesAst.php b/languages/messages/MessagesAst.php
index f954f71b..89236424 100644
--- a/languages/messages/MessagesAst.php
+++ b/languages/messages/MessagesAst.php
@@ -18,43 +18,47 @@
*/
$namespaceNames = array(
- NS_MEDIA => 'Media',
+ NS_MEDIA => 'Medios',
NS_SPECIAL => 'Especial',
NS_TALK => 'Alderique',
NS_USER => 'Usuariu',
NS_USER_TALK => 'Usuariu_alderique',
NS_PROJECT_TALK => '$1_alderique',
- NS_FILE => 'Archivu',
- NS_FILE_TALK => 'Archivu_alderique',
+ NS_FILE => 'Ficheru',
+ NS_FILE_TALK => 'Ficheru_alderique',
NS_MEDIAWIKI => 'MediaWiki',
NS_MEDIAWIKI_TALK => 'MediaWiki_alderique',
NS_TEMPLATE => 'Plantía',
NS_TEMPLATE_TALK => 'Plantía_alderique',
- NS_HELP => 'Aida',
- NS_HELP_TALK => 'Aida_alderique',
+ NS_HELP => 'Ayuda',
+ NS_HELP_TALK => 'Ayuda_alderique',
NS_CATEGORY => 'Categoría',
NS_CATEGORY_TALK => 'Categoría_alderique',
);
$namespaceAliases = array(
- 'Imaxe' => NS_FILE,
- 'Imaxe alderique' => NS_FILE_TALK,
+ 'Imaxe' => NS_FILE,
+ 'Imaxe alderique' => NS_FILE_TALK,
'Discusión' => NS_TALK,
'Usuariu_discusión' => NS_USER_TALK,
'$1_discusión' => NS_PROJECT_TALK,
'Imaxen' => NS_FILE,
'Imaxen_discusión' => NS_FILE_TALK,
+ 'Archivu' => NS_FILE,
+ 'Archivu_alderique' => 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,
+ 'Aida' => NS_HELP,
+ 'Aida_alderique' => NS_HELP_TALK,
'Categoría_discusión' => NS_CATEGORY_TALK,
);
$specialPageAliases = array(
'Block' => array( 'Bloquiar', 'BloquiarIP', 'BloquiarUsuariu' ),
- 'Log' => array( 'Rexistru' ),
+ 'Log' => array( 'Rexistru', 'Rexistros' ),
+ 'Search' => array( 'Gueta' ),
'Statistics' => array( 'Estadístiques' ),
);
@@ -89,9 +93,6 @@ $messages = array(
'tog-shownumberswatching' => "Amosar el númberu d'usuarios que tán vixilando la páxina",
'tog-oldsig' => 'Firma esistente:',
'tog-fancysig' => 'Tratar la firma como testu wiki (ensin enllaz automáticu)',
-'tog-externaleditor' => 'Usar un editor esternu por defeutu (namái pa espertos, necesita configuraciones especiales nel to ordenador. [//www.mediawiki.org/wiki/Manual:External_editors Más información.])',
-'tog-externaldiff' => 'Usar un diff esternu por defutu (namái pa espertos, necesita configuraciones especiales nel to ordenador. [//www.mediawiki.org/wiki/Manual:External_editors Más información.])',
-'tog-showjumplinks' => 'Activar los enllaces d\'accesibilidá "saltar a"',
'tog-uselivepreview' => 'Usar vista previa en tiempu real (experimental)',
'tog-forceeditsummary' => "Avisame cuando grabe col resume d'edición en blanco",
'tog-watchlisthideown' => 'Anubrir les mios ediciones na llista de vixilancia',
@@ -105,6 +106,8 @@ $messages = array(
'tog-showhiddencats' => 'Amosar categoríes anubríes',
'tog-noconvertlink' => 'Desactivar la conversión del títulu del enllaz',
'tog-norollbackdiff' => 'Desaniciar les diferencies depués de facer una restauración',
+'tog-useeditwarning' => "Avisame cuando salga d'una páxina d'edición con cambios ensin guardar",
+'tog-prefershttps' => 'Usar siempre una conexón segura en aniciando sesión',
'underline-always' => 'Siempre',
'underline-never' => 'Nunca',
@@ -168,6 +171,18 @@ $messages = array(
'oct' => 'och',
'nov' => 'pay',
'dec' => 'avi',
+'january-date' => '$1 de xineru',
+'february-date' => '$1 de febreru',
+'march-date' => '$1 de marzu',
+'april-date' => "$1 d'abril",
+'may-date' => '$1 de mayu',
+'june-date' => '$1 de xunu',
+'july-date' => '$1 de xunetu',
+'august-date' => "$1 d'agostu",
+'september-date' => '$1 de setiembre',
+'october-date' => "$1 d'ochobre",
+'november-date' => '$1 de payares',
+'december-date' => "$1 d'avientu",
# Categories related messages
'pagecategories' => '{{PLURAL:$1|Categoría|Categoríes}}',
@@ -249,6 +264,7 @@ $messages = array(
'create-this-page' => 'Crear esta páxina',
'delete' => 'Desaniciar',
'deletethispage' => 'Desaniciar esta páxina',
+'undeletethispage' => 'Restaurar esta páxina',
'undelete_short' => 'Restaurar {{PLURAL:$1|una edición|$1 ediciones}}',
'viewdeleted_short' => 'Ver {{PLURAL:$1|una edición desaniciada|$1 ediciones desaniciaes}}',
'protect' => 'Protexer',
@@ -292,7 +308,7 @@ $1",
'pool-queuefull' => 'La cola de trabayu ta enllena',
'pool-errorunknown' => 'Fallu desconocíu',
-# All link text and link target definitions of links into project namespace that get used by other message strings, with the exception of user group pages (see grouppage) and the disambiguation template definition (see disambiguations).
+# 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).
'aboutsite' => 'Tocante a {{SITENAME}}',
'aboutpage' => 'Project:Tocante a',
'copyright' => "El conteníu ta disponible baxo los términos de la $1 si nun s'indica otra cosa.",
@@ -302,7 +318,6 @@ $1",
'disclaimers' => 'Avisu llegal',
'disclaimerpage' => 'Project:Avisu xeneral',
'edithelp' => "Ayuda d'edición",
-'edithelppage' => 'Help:Cómo editar una páxina',
'helppage' => 'Help:Conteníu',
'mainpage' => 'Portada',
'mainpage-description' => 'Portada',
@@ -379,17 +394,12 @@ Pues atopar una llista de les páxines especiales válides en [[Special:SpecialP
# General errors
'error' => 'Error',
'databaseerror' => 'Fallu na base de datos',
-'dberrortext' => "Hebo un fallu de sintaxis nuna consulta a la base de datos.
-Esti fallu pue ser por un problema del software.
-La postrer consulta a la base de datos que s'intentó foi:
-<blockquote><code>$1</code></blockquote>
-dende la función «<code>$2</code>».
-La base datos dio'l fallu «<samp>$3: $4</samp>».",
-'dberrortextcl' => "Hebo un error de sintaxis nuna consulta a la base de datos.
-La última consulta a la base de datos que s'intentó foi:
-«$1»
-dende la función «$2».
-La base de datos devolvió l'error «$3: $4».",
+'databaseerror-text' => 'Hebo un error na consulta a la base de datos.
+Esto pue indicar un fallu nel software.',
+'databaseerror-textcl' => 'Hebo un error na consulta a la base de datos.',
+'databaseerror-query' => 'Consulta: $1',
+'databaseerror-function' => 'Función: $1',
+'databaseerror-error' => 'Error: $1',
'laggedslavemode' => "'''Avisu:''' Esta páxina pue que nun tenga actualizaciones recientes.",
'readonly' => 'Base de datos candada',
'enterlockreason' => 'Introduz un motivu pal candáu, amestando una estimación de cuándo va tener llugar el descandáu',
@@ -423,6 +433,7 @@ Seique daquién yá lo desaniciara.",
'cannotdelete-title' => 'Nun se pue desaniciar la páxina «$1»',
'delete-hook-aborted' => 'Desaniciu albortáu pol hook.
Nun conseñó esplicación.',
+'no-null-revision' => 'Nun pudo crease una nueva revisión nula pa la páxina «$1»',
'badtitle' => 'Títulu incorreutu',
'badtitletext' => 'El títulu de páxina solicitáu nun ye válidu, ta baleru o tien enllaces interllingua o interwiki incorreutos.
Pue contener un caráuter o más que nun puen usase nos títulos.',
@@ -446,12 +457,15 @@ P'amestar o cambiar les traducciones de toles wikis, por favor usa [//translatew
'editinginterface' => "'''Avisu:''' Tas editando una páxina que s'usa pa proporcionar el testu d'interfaz del programa.
Los cambeos nesta páxina van afeutar l'apariencia de la interfaz pa otros usuarios d'esta wiki.
P'amestar o camudar traducciones pa toles wikis, por favor, usa [//translatewiki.net/ translatewiki.net], el proyeutu de traducción de MediaWiki.",
-'sqlhidden' => '(consulta SQL anubrida)',
'cascadeprotected' => "Esta páxina ta protexida d'ediciones porque ta inxerta {{PLURAL:$1|na siguiente páxina, protexida|nes siguientes páxines, protexíes}} cola opción «en cascada» activada:
$2",
'namespaceprotected' => "Nun tienes permisu pa editar páxines nel espaciu de nomes '''$1'''.",
'customcssprotected' => "Nun tienes permisu pa editar esta páxina CSS porque contién preferencies personales d'otru usuariu.",
'customjsprotected' => "Nun tienes permisu pa editar esta páxina de JavaScript porque contién preferencies personales d'otru usuariu.",
+'mycustomcssprotected' => 'Nun tien permisu pa editar esta páxina CSS.',
+'mycustomjsprotected' => 'Nun tien permisu pa editar esta páxina JavaScript.',
+'myprivateinfoprotected' => 'Nun tien permisu pa editar la so información privada.',
+'mypreferencesprotected' => 'Nun tien permisu pa editar les sos preferencies.',
'ns-specialprotected' => 'Les páxines especiales nun se puen editar.',
'titleprotected' => "Esti títulu ta protexíu escontra creación por [[User:$1|$1]].
El motivu conseñáu ye «''$2''».",
@@ -476,10 +490,19 @@ Tenga en cuenta que dalgunes páxines puen siguir apaeciendo como si inda tuvier
'welcomecreation-msg' => "Creóse la to cuenta.
Nun t'escaezas de camudar les tos [[Special:Preferences|preferencies de {{SITENAME}}]].",
'yourname' => "Nome d'usuariu:",
+'userlogin-yourname' => "Nome d'usuariu",
+'userlogin-yourname-ph' => "Escriba'l so nome d'usuariu",
+'createacct-another-username-ph' => "Escriba'l nome d'usuariu",
'yourpassword' => 'Contraseña:',
+'userlogin-yourpassword' => 'Contraseña',
+'userlogin-yourpassword-ph' => 'Escriba la so contraseña',
+'createacct-yourpassword-ph' => 'Escriba una contraseña',
'yourpasswordagain' => 'Escribi otra vuelta la contraseña:',
+'createacct-yourpasswordagain' => 'Confirmar la contraseña',
+'createacct-yourpasswordagain-ph' => 'Escriba nuevamente la contraseña',
'remembermypassword' => "Recordar la mio identificación nesti restolador (un máximu {{PLURAL:$1|d'un día|de $1 díes}})",
-'securelogin-stick-https' => "Siguir coneutáu con HTTPS dempués d'aniciar sesión",
+'userlogin-remembermypassword' => 'Caltener abierta la sesión',
+'userlogin-signwithsecure' => 'Usar una conexón segura',
'yourdomainname' => 'El to dominiu:',
'password-change-forbidden' => 'Nun se pueden camudar les contraseñes nesta wiki.',
'externaldberror' => "O hebo un fallu d'autenticación de la base de datos o nun tienes permisu p'anovar la to cuenta esterna.",
@@ -491,18 +514,44 @@ Nun t'escaezas de camudar les tos [[Special:Preferences|preferencies de {{SITENA
'logout' => 'Salir',
'userlogout' => 'Salir',
'notloggedin' => 'Nun anició sesión',
+'userlogin-noaccount' => '¿Nun tien una cuenta?',
+'userlogin-joinproject' => 'Xunise a {{SITENAME}}',
'nologin' => '¿Nun tienes una cuenta? $1.',
'nologinlink' => 'Crear una cuenta',
'createaccount' => 'Crear una cuenta',
'gotaccount' => '¿Yá tienes una cuenta? $1.',
'gotaccountlink' => 'Entrar',
'userlogin-resetlink' => "¿Escaeció los datos d'accesu?",
+'userlogin-resetpassword-link' => 'Reaniciar la contraseña',
+'helplogin-url' => 'Help:Aniciar sesión',
+'userlogin-helplink' => "[[{{MediaWiki:helplogin-url}}|Ayuda p'aniciar sesión]]",
+'userlogin-loggedin' => "Yá anició sesión como {{GENDER:$1|$1}}.
+Utilice'l formulariu de más abaxo p'aniciar sesión como otru usuariu.",
+'userlogin-createanother' => 'Crear otra cuenta',
+'createacct-join' => 'Escriba abaxo la so información.',
+'createacct-another-join' => 'Escriba abaxo la información de la cuenta nueva.',
+'createacct-emailrequired' => 'Direición de corréu electrónicu',
+'createacct-emailoptional' => 'Direición de corréu electrónicu (opcional)',
+'createacct-email-ph' => 'Escriba la so direición de corréu electrónicu',
+'createacct-another-email-ph' => 'Escriba la direición de corréu electrónicu',
'createaccountmail' => 'Usar una contraseña al debalu temporal y unviala a la direición de corréu electrónicu conseñada',
+'createacct-realname' => 'Nome real (opcional)',
'createaccountreason' => 'Motivu:',
+'createacct-reason' => 'Motivu',
+'createacct-reason-ph' => 'Por qué quier crear otra cuenta',
+'createacct-captcha' => 'Comprobación de seguridá',
+'createacct-imgcaptcha-ph' => "Escriba'l testu qu'apaez arriba",
+'createacct-submit' => 'Crear la cuenta',
+'createacct-another-submit' => 'Crear otra cuenta',
+'createacct-benefit-heading' => '{{SITENAME}} failu xente como vusté.',
+'createacct-benefit-body1' => '{{PLURAL:$1|edición|ediciones}}',
+'createacct-benefit-body2' => '{{PLURAL:$1|páxina|páxines}}',
+'createacct-benefit-body3' => '{{PLURAL:$1|collaborador|collaboradores}} de recién',
'badretype' => "Les contraseñes qu'escribisti nun concuayen.",
'userexists' => "El nome d'usuariu conseñáu yá ta usándose.
Por favor escueyi un nome diferente.",
'loginerror' => "Error d'aniciu de sesión",
+'createacct-error' => 'Error de creación de cuenta',
'createaccounterror' => 'Nun se pudo crear la cuenta: $1',
'nocookiesnew' => "La cuenta d'usuariu ta creada, pero nun anició sesión.
{{SITENAME}} usa «cookies» pa identificar a los usuarios.
@@ -571,10 +620,12 @@ Agora tendríes d'aniciar sesión y camudar la contraseña.
Pues escaecer esti mensaxe si esta cuenta creóse por error.",
'usernamehasherror' => "El nome d'usuariu nun pue contener caráuteres «hash»",
'login-throttled' => "Ficisti demasiaos intentos d'aniciu de sesión recientes.
-Por favor, espera enantes d'intentalo otra vuelta.",
+Por favor espera $1 enantes d'intentalo otra vuelta.",
'login-abort-generic' => 'Falló la identificación - Encaboxao',
'loginlanguagelabel' => 'Llingua: $1',
'suspicious-userlogout' => "La to solicitú de zarrar sesión refugose porque paez qu'unvióla un restolador frañíu o un proxy de caché.",
+'createacct-another-realname-tip' => "El nome real ye opcional.
+Si decide conseñalu, va usase p'atribuir el trabayu al usuariu.",
# Email sending
'php-mail-error-unknown' => 'Fallu desconocíu na función mail() de PHP.',
@@ -591,8 +642,7 @@ P'acabar d'aniciar sesión, tienes de configurar equí una contraseña nueva:",
'newpassword' => 'Contraseña nueva:',
'retypenew' => 'Vuelvi a escribir la contraseña nueva:',
'resetpass_submit' => 'Configurar la contraseña y aniciar sesión',
-'resetpass_success' => '¡La contraseña camudó correutamente!
-Aniciando sesión agora...',
+'changepassword-success' => '¡Camudóse la contraseña correutamente!',
'resetpass_forbidden' => 'Nun puen camudase les contraseñes',
'resetpass-no-info' => "Tienes d'aniciar sesión pa entrar direutamente a esta páxina.",
'resetpass-submit-loggedin' => 'Camudar la contraseña',
@@ -604,10 +654,11 @@ Seique yá camudaras correutamente la contraseña o que pidieras una nueva contr
# Special:PasswordReset
'passwordreset' => 'Reaniciar contraseña',
-'passwordreset-text' => 'Complete esti formulariu pa reaniciar la contraseña.',
+'passwordreset-text-one' => 'Complete esti formulariu pa reaniciar la contraseña.',
+'passwordreset-text-many' => '{{PLURAL:$1|Rellene unu de los campos pa reaniciar la contraseña.}}',
'passwordreset-legend' => 'Reaniciar contraseña',
'passwordreset-disabled' => 'Los reanicios de contraseña tán desactivaos nesta wiki.',
-'passwordreset-pretext' => "{{PLURAL:$1||Escribi unu de los elementos de los datos d'abaxo}}",
+'passwordreset-emaildisabled' => 'Les funciones de corréu electrónicu tan desactivaes nesta wiki.',
'passwordreset-username' => "Nome d'usuariu:",
'passwordreset-domain' => 'Dominiu:',
'passwordreset-capture' => '¿Ver el corréu electrónicu resultante?',
@@ -634,7 +685,7 @@ Tendría d'aniciar sesión y escoyer una contraseña nueva agora. Si esta solici
Contraseña temporal: $2",
'passwordreset-emailsent' => 'Unvióse un corréu electrónicu pa reaniciar la contraseña.',
'passwordreset-emailsent-capture' => "Unvióse un corréu electrónicu pa reaniciar la contraseña, que s'amuesa abaxo.",
-'passwordreset-emailerror-capture' => "Xeneróse un corréu electrónicu pa reaniciar la contraseña, que s'amuesa abaxo, pero falló l'unviu al usuariu: $1",
+'passwordreset-emailerror-capture' => "Unvióse un corréu electrónicu pa reaniciar la contraseña, que s'amuesa abaxo, pero falló l'unviu {{GENDER:$2|al usuariu|a la usuaria}}: $1",
# Special:ChangeEmail
'changeemail' => 'Camudar la direición de corréu electrónicu',
@@ -648,6 +699,19 @@ Contraseña temporal: $2",
'changeemail-submit' => 'Camudar el corréu electrónicu',
'changeemail-cancel' => 'Encaboxar',
+# Special:ResetTokens
+'resettokens' => 'Reaniciar los pases',
+'resettokens-text' => "Equí pue reaniciar los pases que permiten l'accesu a ciertos datos privaos asociaos cola so cuenta.
+
+Tendría de facelo si los compartió con alguién de mou accidental o si la so cuenta quedó comprometida.",
+'resettokens-no-tokens' => 'Nun hai dengún pase que reaniciar.',
+'resettokens-legend' => 'Reaniciar los pases',
+'resettokens-tokens' => 'Pases:',
+'resettokens-token-label' => '$1 (valor actual: $2)',
+'resettokens-watchlist-token' => 'Pase pa la canal de noticies web (Atom/RSS) de los [[Special:Watchlist|cambios en páxines de la llista de vixilancia]]',
+'resettokens-done' => 'Reaniciaronse los pases.',
+'resettokens-resetbutton' => 'Reaniciar los pases seleicionaos',
+
# Edit page toolbar
'bold_sample' => 'Testu en negrina',
'bold_tip' => 'Testu en negrina',
@@ -851,12 +915,15 @@ Nun dio esplicación.',
Paez que se desanició.',
'edit-conflict' => "Conflictu d'edición.",
'edit-no-change' => "S'inoró la to edición, porque nun se fizo nengún cambéu nel testu.",
+'postedit-confirmation' => 'Guardose la edición.',
'edit-already-exists' => 'Nun pudo crease una páxina nueva.
Esta yá esiste.',
'defaultmessagetext' => 'Testu predetermináu',
'content-failed-to-parse' => 'Fallu al analizar el conteníu $2 pal modelu $1: $3',
'invalid-content-data' => 'Datos del conteníu inválidos',
'content-not-allowed-here' => 'El conteníu «$1» nun se permite na páxina [[$2]]',
+'editwarning-warning' => 'Salir d\'esta páxina pue causar la perda de cualesquier cambiu fechu.
+Si aniciasti sesión, pue desactivase esti avisu na seición "Edición" de les tos preferencies.',
# Content models
'content-model-wikitext' => 'testu wiki',
@@ -892,6 +959,7 @@ Por favor comprueba la comparanza d'abaxo pa confirmar que ye eso lo que quies f
'undo-failure' => "Nun pudo esfacese la edición por aciu d'ediciones intermedies conflictives.",
'undo-norev' => 'Nun se pudo esfacer la edición porque nun esiste o se desanició.',
'undo-summary' => 'Esfacer la revisión $1 de [[Special:Contributions/$2|$2]] ([[User talk:$2|alderique]])',
+'undo-summary-username-hidden' => "Desfacer la revisión $1 d'un usuariu tapecíu",
# Account creation failure
'cantcreateaccounttitle' => 'Nun pue crease la cuenta',
@@ -1071,6 +1139,7 @@ Asegúrate de qu'esti cambéu caltenga la continuidá del históricu de la páxi
'compareselectedversions' => 'Comparar les revisiones seleicionaes',
'showhideselectedversions' => 'Amosar/anubrir les versiones seleicionaes',
'editundo' => 'desfacer',
+'diff-empty' => '(Nun hai diferencies)',
'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}})",
'difference-missing-revision' => "{{PLURAL:$2|Nun s'alcontró|Nun s'alcontraron}} {{PLURAL:$2|una revisión|$2 revisiones}} d'esta diferencia ($1).
@@ -1098,7 +1167,6 @@ Se puen alcontrar más detalles nel [{{fullurl:{{#Special:Log}}/delete|page={{FU
'searchmenu-legend' => 'Opciones de busca',
'searchmenu-exists' => "'''Hai una páxina nomada \"[[\$1]]\" nesta wiki'''",
'searchmenu-new' => "'''¡Crear la páxina \"[[:\$1]]\" nesta wiki!'''",
-'searchhelp-url' => 'Help:Conteníos',
'searchmenu-prefix' => '[[Special:PrefixIndex/$1|Restolar páxines con esti prefixu]]',
'searchprofile-articles' => 'Páxines de conteníu',
'searchprofile-project' => 'Páxines de proyeutu y ayuda',
@@ -1139,15 +1207,7 @@ Se puen alcontrar más detalles nel [{{fullurl:{{#Special:Log}}/delete|page={{FU
'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.",
-
-# Quickbar
-'qbsettings' => 'Barra rápida',
-'qbsettings-none' => 'Nenguna',
-'qbsettings-fixedleft' => 'Fixa a manzorga',
-'qbsettings-fixedright' => 'Fixa a mandrecha',
-'qbsettings-floatingleft' => 'Flotante a manzorga',
-'qbsettings-floatingright' => 'Flotante a mandrecha',
-'qbsettings-directionality' => "Fixa, según la direición d'escritura de la to llingua",
+'search-error' => 'Hebo un error al buscar: $1',
# Preferences page
'preferences' => 'Preferencies',
@@ -1181,7 +1241,6 @@ Se puen alcontrar más detalles nel [{{fullurl:{{#Special:Log}}/delete|page={{FU
'resetprefs' => 'Llimpiar los cambios ensin guardar',
'restoreprefs' => 'Restaurar tolos axustes predeterminaos (en toles seiciones)',
'prefs-editing' => 'Edición',
-'prefs-edit-boxsize' => "Tamañu de la ventana d'edición.",
'rows' => 'Fileres:',
'columns' => 'Columnes:',
'searchresultshead' => 'Buscar',
@@ -1192,9 +1251,9 @@ Se puen alcontrar más detalles nel [{{fullurl:{{#Special:Log}}/delete|page={{FU
'recentchangesdays-max' => '(máximo $1 {{PLURAL:$1|día|díes}})',
'recentchangescount' => "Númberu d'ediciones p'amosar de mou predetermináu:",
'prefs-help-recentchangescount' => 'Incluye los cambios recientes, los historiales de páxines y los rexistros.',
-'prefs-help-watchlist-token' => "Rellenando esti campu con una clave secreta se xenerará una canal RSS pa la to llista de vixilancia.
-Quien sepa la clave d'esti campu podrá lleer la to llista de vixilancia, poro, escueyi un valor seguru.
-Equí tienes un valor al debalu que pues usar: $1",
+'prefs-help-watchlist-token2' => 'Esta ye la clave secreta pa la canal de noticies web de la so llista de vixilancia.
+Cualquiera que la sepa podrá lleer la so llista de vixilancia; nun la comparta.
+[[Special:ResetTokens|Calque equí si necesita reaniciala]].',
'savedprefs' => 'Les tos preferencies quedaron grabaes.',
'timezonelegend' => 'Estaya horaria:',
'localtime' => 'Hora llocal:',
@@ -1225,7 +1284,6 @@ Equí tienes un valor al debalu que pues usar: $1",
'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:',
-'prefs-textboxsize' => "Tamañu de la ventana d'edición",
'youremail' => 'Corréu electrónicu:',
'username' => "Nome d'{{GENDER:$1|usuariu|usuaria}}:",
'uid' => 'ID {{GENDER:$1|del usuariu|de la usuaria}}:',
@@ -1257,6 +1315,8 @@ Esta información sedrá pública.',
'prefs-dateformat' => 'Formatu de data',
'prefs-timeoffset' => 'Diferencia horaria',
'prefs-advancedediting' => 'Opciones xenerales',
+'prefs-editor' => 'Editor',
+'prefs-preview' => 'Vista previa',
'prefs-advancedrc' => 'Opciones avanzaes',
'prefs-advancedrendering' => 'Opciones avanzaes',
'prefs-advancedsearchoptions' => 'Opciones avanzaes',
@@ -1264,7 +1324,9 @@ Esta información sedrá pública.',
'prefs-displayrc' => 'Opciones de vista',
'prefs-displaysearchoptions' => 'Opciones de vista',
'prefs-displaywatchlist' => 'Opciones de vista',
+'prefs-tokenwatchlist' => 'Pase',
'prefs-diffs' => 'Diferencies',
+'prefs-help-prefershttps' => 'Esta preferencia aplicaráse nel siguiente aniciu de sesión.',
# User preference: email validation using jQuery
'email-address-validity-valid' => 'La direición de corréu paez válida',
@@ -1291,6 +1353,8 @@ Esta información sedrá pública.',
'userrights-notallowed' => "Nun tien autorización p'amestar o desaniciar permisos d'usuariu.",
'userrights-changeable-col' => 'Grupos que pues camudar',
'userrights-unchangeable-col' => 'Grupos que nun pues camudar',
+'userrights-conflict' => "¡Conflictu de cambiu de permisos d'usuariu! Por favor, revise y confirme los cambios.",
+'userrights-removed-self' => 'Retiró correutamente los sos propios drechos. Poro, yá nun tendrá accesu a esta páxina.',
# Groups
'group' => 'Grupu:',
@@ -1356,11 +1420,19 @@ Esta información sedrá pública.',
'right-proxyunbannable' => 'Saltar los bloqueos automáticos de los proxys',
'right-unblockself' => 'Desbloquiase ún mesmu',
'right-protect' => 'Camudar los niveles de proteición y editar páxines protexíes en cascada',
-'right-editprotected' => 'Editar páxines protexíes (ensin proteición en cascada)',
+'right-editprotected' => 'Editar les páxines protexíes como "{{int:protect-level-sysop}}"',
+'right-editsemiprotected' => 'Editar les páxines protexíes como "{{int:protect-level-autoconfirmed}}"',
'right-editinterface' => "Editar la interfaz d'usuariu",
'right-editusercssjs' => "Editar los archivos CSS y JS d'otros usuarios",
'right-editusercss' => "Editar los archivos CSS d'otros usuarios",
'right-edituserjs' => "Editar los archivos JS d'otros usuarios",
+'right-editmyusercss' => "Editar los propios ficheros CSS d'usuariu",
+'right-editmyuserjs' => "Editar los propios ficheros JavaScript d'usuariu",
+'right-viewmywatchlist' => 'Ver la llista de vixilancia propia',
+'right-editmywatchlist' => 'Editar la llista de vixilancia propia. Tenga en cuenta que dalgunes aiciones amestarán páxines igual, inda ensin esti permisu.',
+'right-viewmyprivateinfo' => 'Ver los datos privaos propios (p. ex. direición de corréu, nome real)',
+'right-editmyprivateinfo' => 'Editar los datos privaos propios (p. ex. direición de corréu, nome real)',
+'right-editmyoptions' => 'Editar les preferencies propies',
'right-rollback' => "Revertir rápido a un usuariu qu'editó una páxina determinada",
'right-markbotedits' => 'Marcar les ediciones revertíes como ediciones de bot',
'right-noratelimit' => 'Nun tar afeutáu polos llímites de tasa',
@@ -1422,12 +1494,19 @@ Esta información sedrá pública.',
'action-userrights-interwiki' => "editar los drechos d'usuariu d'usuarios d'otres wikis",
'action-siteadmin' => 'candar o descandar la base de datos',
'action-sendemail' => 'unviar correos',
+'action-editmywatchlist' => 'editar la llista de vixilancia',
+'action-viewmywatchlist' => 'ver la llista de vixilancia propia',
+'action-viewmyprivateinfo' => 'ver la so información privada',
+'action-editmyprivateinfo' => 'editar la so información privada',
# Recent changes
'nchanges' => '{{PLURAL:$1|un cambiu|$1 cambios}}',
+'enhancedrc-since-last-visit' => '$1 {{PLURAL:$1|dende la última visita}}',
+'enhancedrc-history' => 'historial',
'recentchanges' => 'Cambios recientes',
'recentchanges-legend' => 'Opciones de cambios recientes',
'recentchanges-summary' => 'Sigui los cambios más recientes na wiki nesta páxina.',
+'recentchanges-noresult' => 'Nengún cambiu nel periodu conseñáu coincide con esos criterios.',
'recentchanges-feed-description' => 'Sigui nesta canal los últimos cambios de la wiki.',
'recentchanges-label-newpage' => 'Esta edición creó una páxina nueva',
'recentchanges-label-minor' => 'Esta ye una edición menor',
@@ -1464,7 +1543,6 @@ Esta información sedrá pública.',
'recentchangeslinked-feed' => 'Cambios rellacionaos',
'recentchangeslinked-toolbox' => 'Cambios rellacionaos',
'recentchangeslinked-title' => 'Cambios rellacionaos con "$1"',
-'recentchangeslinked-noresult' => 'Nun hebo cambios nes páxines enllaciaes nel periodu conseñáu.',
'recentchangeslinked-summary' => "Esta ye una llista de los caberos cambios fechos nes páxines enllaciaes dende una páxina determinada (o nos miembros d'una categoría determinada). Les páxines de [[Special:Watchlist|la to llista de vixilancia]] tán en '''negrina'''.",
'recentchangeslinked-page' => 'Nome de la páxina:',
'recentchangeslinked-to' => "Amosar los cambios de les páxines qu'enllacen en cuenta de los de la páxina dada",
@@ -1475,7 +1553,7 @@ Esta información sedrá pública.',
'reuploaddesc' => 'Cancelar la xubida y tornar al formulariu de xubíes',
'upload-tryagain' => 'Unviar descripción camudada del ficheru',
'uploadnologin' => 'Nun anició sesión',
-'uploadnologintext' => "Tien d'[[Special:UserLogin|aniciar sesión]] pa xubir ficheros.",
+'uploadnologintext' => "Tien d'$1 pa xubir ficheros.",
'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',
@@ -1713,7 +1791,6 @@ Pa una meyor seguridá, img_auth.php ta desactiváu.",
'http-read-error' => 'Error de llectura HTTP.',
'http-timed-out' => "La llamada HTTP escosó'l tiempu.",
'http-curl-error' => 'Error al baxar la URL: $1',
-'http-host-unreachable' => 'Nun se pudo acceder a la URL.',
'http-bad-status' => 'Hebo un problema demientres la llamada HTTP: $1 $2',
# Some likely curl errors. More could be added from <http://curl.haxx.se/libcurl/c/libcurl-errors.html>
@@ -1741,6 +1818,10 @@ Pa una meyor seguridá, img_auth.php ta desactiváu.",
'listfiles_size' => 'Tamañu',
'listfiles_description' => 'Descripción',
'listfiles_count' => 'Versiones',
+'listfiles-show-all' => 'Incluir les versiones antigües de les imaxes',
+'listfiles-latestversion' => 'Versión actual',
+'listfiles-latestversion-yes' => 'Sí',
+'listfiles-latestversion-no' => 'Non',
# File description page
'file-anchor-link' => 'Ficheru',
@@ -1837,6 +1918,13 @@ Alcuérdate de comprobar otros enllaces a les plantíes enantes d'esborrales.",
'randompage' => 'Páxina al debalu',
'randompage-nopages' => 'Nun hai páxines {{PLURAL:$2|nel espaciu|nos espacios}} de nomes darréu: "$1".',
+# Random page in category
+'randomincategory' => 'Páxina al debalu de la categoría',
+'randomincategory-invalidcategory' => '"$1" nun ye un nome de categoría válidu.',
+'randomincategory-nopages' => 'Nun hai páxines en [[:Category:$1]].',
+'randomincategory-selectcategory' => 'Ver una páxina al debalu de la categoría: $1. $2',
+'randomincategory-selectcategory-submit' => 'Dir',
+
# Random redirect
'randomredirect' => 'Redireición al debalu',
'randomredirect-nopages' => 'Nun hai redireiciones nel espaciu de nomes "$1".',
@@ -1862,16 +1950,13 @@ Alcuérdate de comprobar otros enllaces a les plantíes enantes d'esborrales.",
'statistics-users-active-desc' => 'Usuarios que realizaron una aición {{PLURAL:$1|nel caberu día|nos caberos $1 díes}}',
'statistics-mostpopular' => 'Páxines más vistes',
-'disambiguations' => "Páxines qu'enllacen con páxines de dixebra",
-'disambiguationspage' => 'Template:dixebra',
-'disambiguations-text' => "Les siguientes páxines contienen polo menos un enllaz a una '''páxina de dixebra'''. En cuenta d'ello habríen enllaciar a una páxina más apropiada.<br />
-Una páxina tratase como una páxina de dixebra si usa una plantía que tea enllaciada dende [[MediaWiki:Disambiguationspage]]",
-
'pageswithprop' => 'Páxines con una propiedá de páxina',
'pageswithprop-legend' => 'Páxines con una propiedá de páxina',
'pageswithprop-text' => "Esta páxina llista les páxines qu'usen una propiedá de páxina determinada.",
'pageswithprop-prop' => 'Nome de la propiedá:',
'pageswithprop-submit' => 'Dir',
+'pageswithprop-prophidden-long' => 'valor de propiedá de testu llargu tapecíu ($1)',
+'pageswithprop-prophidden-binary' => 'valor de propiedá binaria tapecíu ($1)',
'doubleredirects' => 'Redireiciones dobles',
'doubleredirectstext' => 'Esta páxina llista páxines que redireicionen a otres páxines de redireición.
@@ -1929,6 +2014,7 @@ Les entraes <del>tachaes</del> tan resueltes.',
'mostrevisions' => 'Páxines con más revisiones',
'prefixindex' => 'Toles páxines col prefixu',
'prefixindex-namespace' => 'Toles páxines col prefixu (espaciu de nomes $1)',
+'prefixindex-strip' => 'Cortar el prefixu na llista',
'shortpages' => 'Páxines curties',
'longpages' => 'Páxines llargues',
'deadendpages' => 'Páxines ensin salida',
@@ -1944,6 +2030,7 @@ Les entraes <del>tachaes</del> tan resueltes.',
'listusers' => "Llista d'usuarios",
'listusers-editsonly' => 'Amosar namái usuarios con ediciones',
'listusers-creationsort' => 'Ordenar por data de creación',
+'listusers-desc' => "Ordenar n'orde descendente",
'usereditcount' => '$1 {{PLURAL:$1|edición|ediciones}}',
'usercreated' => "{{GENDER:$3|Creáu el|Creada'l}} $1 a les $2",
'newpages' => 'Páxines nueves',
@@ -2120,10 +2207,9 @@ Los futuro cambeos nesta páxina y na so páxina d\'alderique asociada apaecerá
'unwatchthispage' => 'Dexar de vixilar',
'notanarticle' => 'Nun ye un artículu',
'notvisiblerev' => 'Esborróse la revisión',
-'watchnochange' => 'Nenguna de les tos páxines vixilaes foi editada nel periodu escoyíu.',
'watchlist-details' => "{{PLURAL:$1|$1 páxina|$1 páxines}} na to llista de vixilancia ensin cuntar les páxines d'alderique.",
-'wlheader-enotif' => '* La notificación per corréu electrónicu ta activada.',
-'wlheader-showupdated' => "* Les páxines camudaes dende la to última visita amuésense en '''negrina'''",
+'wlheader-enotif' => 'La notificación per corréu electrónicu ta activada.',
+'wlheader-showupdated' => "Les páxines que camudaron dende que les visitasti anteriormente amuesense en '''negrina'''",
'watchmethod-recent' => 'comprobando páxines vixilaes nos cambios recientes',
'watchmethod-list' => 'comprobando ediciones recientes nes páxines vixilaes',
'watchlistcontains' => 'La to llista de vixilancia tien $1 {{PLURAL:$1|páxina|páxines}}.',
@@ -2374,7 +2460,7 @@ $1",
'contributions' => 'Collaboraciones {{GENDER:$1|del usuariu|de la usuaria}}',
'contributions-title' => "Contribuciones d'usuariu pa $1",
'mycontris' => 'Collaboraciones',
-'contribsub2' => 'Pa $1 ($2)',
+'contribsub2' => 'Pa {{GENDER:$3|$1}} ($2)',
'nocontribs' => "Nun s'atoparon cambeos que coincidan con esi criteriu.",
'uctop' => '(actual)',
'month' => "Dende'l mes (y anteriores):",
@@ -2530,13 +2616,11 @@ Pa ver los bloqueos qu'hai agora mesmo, mira na [[Special:BlockList|llista de bl
'ipb_blocked_as_range' => 'Error: La IP $1 nun ta bloquiada direutamente, polo que nun pue ser desloquiada. Sicasí, foi bloquiada como parte del intervalu $2, que pue ser desbloquiáu.',
'ip_range_invalid' => 'Rangu IP non válidu.',
'ip_range_toolarge' => 'Nun se permiten bloqueos mayores de /$1.',
-'blockme' => 'Blóquiame',
'proxyblocker' => 'Bloquiador de proxys',
-'proxyblocker-disabled' => 'Esta función ta desactivada.',
'proxyblockreason' => "La to direición IP foi bloquiada porque ye un proxy abiertu. Por favor contauta col to proveedor de serviciones d'Internet o col to servicio d'asistencia téunica y infórmalos d'esti seriu problema de seguridá.",
-'proxyblocksuccess' => 'Fecho.',
'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',
+'xffblockreason' => "Una direición IP presente na testera X-Forwarded-For, o suya o d'un sirvidor proxy que ta usando, ta bloquiada. El motivu orixinal del bloquéu foi: $1",
'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.",
@@ -2700,6 +2784,8 @@ Por favor visita [//www.mediawiki.org/wiki/Localisation Llocalización de MediaW
'thumbnail-more' => 'Agrandar',
'filemissing' => 'Falta archivu',
'thumbnail_error' => 'Error al crear la miniatura: $1',
+'thumbnail_error_remote' => "Mensaxe d'error de $1:
+$2",
'djvu_page_error' => 'Páxina DjVu fuera de llímites',
'djvu_no_xml' => 'Nun se pudo obtener el XML pal archivu DjVu',
'thumbnail-temp-create' => 'Nun se pudo crear el ficheru temporal de miniatura',
@@ -2849,17 +2935,11 @@ Pues ver el so códigu fonte.',
# 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 */',
'noscript.css' => '/* Los CSS allugaos equí afeutarán a los usuarios col JavaScript desactiváu */',
'group-autoconfirmed.css' => '/* Los CSS allugaos equí afeutarán a los usuarios autoconfirmaos namái */',
'group-bot.css' => '/* Los CSS allugaos equí afeutarán a los bots namái */',
@@ -2868,13 +2948,8 @@ Pues ver el so códigu fonte.',
# 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 */',
'group-autoconfirmed.js' => '/* Cualesquier JavaScript que tea equí se cargará pa los usuarios autoconfirmaos namái */',
@@ -2954,10 +3029,7 @@ Probablemente tea causao por un enllaz a un sitiu esternu de la llista prieta.',
'pageinfo-category-files' => 'Númberu de ficheros',
# Skin names
-'skinname-standard' => 'Clásicu',
-'skinname-nostalgia' => 'Señardá',
'skinname-cologneblue' => 'Azul Colonia',
-'skinname-myskin' => 'MySkin',
'skinname-modern' => 'Modernu',
# Patrolling
@@ -3035,11 +3107,25 @@ Al executalu pues comprometer el to sistema.",
'minutes' => '{{PLURAL:$1|$1 minutu|$1 minutos}}',
'hours' => '{{PLURAL:$1|$1 hora|$1 hores}}',
'days' => '{{PLURAL:$1|$1 día|$1 díes}}',
+'weeks' => '{{PLURAL: $1|$1 selmana|$1 selmanes}}',
'months' => '{{PLURAL:$1|$1 mes|$1 meses}}',
'years' => '{{PLURAL:$1|$1 añu|$1 años}}',
'ago' => 'hai $1',
'just-now' => 'agora mesmo',
+# Human-readable timestamps
+'hours-ago' => 'hai $1 {{PLURAL:$1|hora|hores}}',
+'minutes-ago' => 'hai $1 {{PLURAL:$1|minutu|minutos}}',
+'seconds-ago' => 'hai $1 {{PLURAL:$1|segundu|segundos}}',
+'monday-at' => 'El llunes a les $1',
+'tuesday-at' => 'El martes a les $1',
+'wednesday-at' => 'El miércoles a les $1',
+'thursday-at' => 'El xueves a les $1',
+'friday-at' => 'El vienres a les $1',
+'saturday-at' => 'El sábadu a les $1',
+'sunday-at' => 'El domingu a les $1',
+'yesterday-at' => 'Ayeri a les $1',
+
# Bad image list
'bad_image_list' => "El formatu ye'l que sigue:
@@ -3069,7 +3155,7 @@ Los demás tarán anubríos de mou predetermináu.
* gpslongitude
* gpsaltitude',
-# EXIF tags
+# Exif tags
'exif-imagewidth' => 'Anchor',
'exif-imagelength' => 'Altor',
'exif-bitspersample' => 'Bits por componente',
@@ -3247,7 +3333,7 @@ Los demás tarán anubríos de mou predetermináu.
'exif-originalimageheight' => 'Altor de la imaxe enantes de cortase',
'exif-originalimagewidth' => 'Anchor de la imaxe enantes de cortase',
-# EXIF attributes
+# Exif attributes
'exif-compression-1' => 'Non comprimida',
'exif-compression-2' => 'CCITT Grupu 3 codificación Huffman RLE con Modificación 1-Dimensional',
'exif-compression-3' => 'Codificación de fax CCITT Grupu 3',
@@ -3645,7 +3731,6 @@ Tamién pues [[Special:EditWatchlist|usar l'editor estándar]].",
'version-other' => 'Otros',
'version-mediahandlers' => "Remanadores d'archivos multimedia",
'version-hooks' => 'Hooks',
-'version-extension-functions' => "Funciones d'estensiones",
'version-parser-extensiontags' => "Etiquetes d'estensiones d'análisis",
'version-parser-function-hooks' => "Hooks de les funciones d'análisis sintáuticu",
'version-hook-name' => 'Nome del hook',
@@ -3654,6 +3739,7 @@ Tamién pues [[Special:EditWatchlist|usar l'editor estándar]].",
'version-license' => 'Llicencia',
'version-poweredby-credits' => "Esta wiki funciona con '''[//www.mediawiki.org/ MediaWiki]''', copyright © 2001-$1 $2.",
'version-poweredby-others' => 'otros',
+'version-poweredby-translators' => 'los traductores de translatewiki.net',
'version-credits-summary' => 'Nos prestaría dar reconocimientu a les siguientes persones pola so contribución a [[Special:Version|MediaWiki]].',
'version-license-info' => "MediaWiki ye software llibre; pue 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.
@@ -3667,12 +3753,17 @@ Tendría d'haber recibío [{{SERVER}}{{SCRIPTPATH}}/COPYING una copia de la Llic
'version-entrypoints-header-entrypoint' => "Puntu d'entrada",
'version-entrypoints-header-url' => 'URL',
-# Special:FilePath
-'filepath' => "Ruta d'archivu",
-'filepath-page' => 'Ficheru:',
-'filepath-submit' => 'Dir',
-'filepath-summary' => "Esta páxina especial devuelve la ruta completa d'un archivu.
-Les imáxenes amuésense a resolución completa; les demás tribes d'archivu execútense direutamente col so programa asociáu.",
+# Special:Redirect
+'redirect' => "Redireición por nome de ficheru, o ID d'usuariu o de revisión",
+'redirect-legend' => 'Redirixir a un ficheru o una páxina',
+'redirect-summary' => "Esta páxina especial redirixe a un ficheru (dando'l nome), una páxina (dando una ID de revisión) o una páxina d'usuariu (dando una ID d'usuariu).",
+'redirect-submit' => 'Dir',
+'redirect-lookup' => 'Buscar:',
+'redirect-value' => 'Valor:',
+'redirect-user' => "ID d'usuariu:",
+'redirect-revision' => 'Revisión de páxina',
+'redirect-file' => 'Nome del ficheru',
+'redirect-not-exists' => "Nun s'alcontró'l valor",
# Special:FileDuplicateSearch
'fileduplicatesearch' => 'Buscar archivos duplicaos',
@@ -3722,12 +3813,16 @@ Les imáxenes amuésense a resolución completa; les demás tribes d'archivu exe
'tags' => 'Etiquetes de cambiu válides',
'tag-filter' => "Filtru d'[[Special:Tags|etiquetes]]:",
'tag-filter-submit' => 'Peñera',
+'tag-list-wrapper' => '([[Special:Tags|{{PLURAL:$1|Etiqueta|Etiquetes}}]]: $2)',
'tags-title' => 'Etiquetes',
'tags-intro' => "Esta páxina llista les etiquetes coles que'l software pue marcar una edición, y el so significáu.",
'tags-tag' => "Nome d'etiqueta",
'tags-display-header' => 'Aspeutu nes llistes de cambios',
'tags-description-header' => 'Descripción completa del significáu',
+'tags-active-header' => '¿Activu?',
'tags-hitcount-header' => 'Cambios etiquetaos',
+'tags-active-yes' => 'Sí',
+'tags-active-no' => 'Non',
'tags-edit' => 'editar',
'tags-hitcount' => '$1 {{PLURAL:$1|cambiu|cambios}}',
@@ -3748,6 +3843,7 @@ Les imáxenes amuésense a resolución completa; les demás tribes d'archivu exe
'dberr-problems' => '¡Sentímoslo! Esti sitiu ta esperimentando dificultaes téuniques.',
'dberr-again' => 'Tenta esperar dellos minutos y recargar.',
'dberr-info' => '(Nun se pue contautar cola base de datos del sirvidor: $1)',
+'dberr-info-hidden' => '(Nun se pue comunicar col sirvidor de base de datos)',
'dberr-usegoogle' => 'Pue probar a buscar con Google mentanto.',
'dberr-outofdate' => 'Atalanta que los sos índices del nuesu conteníu seique nun tean actualizaos.',
'dberr-cachederror' => 'Esta ye una copia na caché de la páxina que se pidiera, y pue que nun tea actualizada.',
@@ -3763,6 +3859,9 @@ Les imáxenes amuésense a resolución completa; les demás tribes d'archivu exe
'htmlform-submit' => 'Unviar',
'htmlform-reset' => 'Desfacer los cambios',
'htmlform-selectorother-other' => 'Otros',
+'htmlform-no' => 'Non',
+'htmlform-yes' => 'Sí',
+'htmlform-chosen-placeholder' => 'Seleicione una opción',
# SQLite database support
'sqlite-has-fts' => '$1 con sofitu pa busca de testu completu',
@@ -3880,4 +3979,19 @@ D\'otra miente, pues usar el formulariu cenciellu d\'abaxo. El to comentariu apa
# Image rotation
'rotate-comment' => 'Imaxe xirada $1 {{PLURAL:$1|grau|graos}} en sentíu horariu',
+# Limit report
+'limitreport-title' => 'Datos de perfiláu del analizador:',
+'limitreport-cputime' => 'Usu de tiempu de CPU',
+'limitreport-cputime-value' => '$1 {{PLURAL: $1|segundu|segundos}}',
+'limitreport-walltime' => 'Usu de tiempu real',
+'limitreport-walltime-value' => '$1 {{PLURAL: $1|segundu|segundos}}',
+'limitreport-ppvisitednodes' => 'Cuenta de noyos visitaos pol preprocesador',
+'limitreport-ppgeneratednodes' => 'Cuenta de noyos xeneraos pol preprocesador',
+'limitreport-postexpandincludesize' => "Tamañu d'inclusión de post-espansión",
+'limitreport-postexpandincludesize-value' => '$1/$2 {{PLURAL:$2|byte|bytes}}',
+'limitreport-templateargumentsize' => 'Tamañu del argumentu de plantía',
+'limitreport-templateargumentsize-value' => '$1/$2 {{PLURAL:$2|byte|bytes}}',
+'limitreport-expansiondepth' => "Máxima fondura d'espansión",
+'limitreport-expensivefunctioncount' => "Cuenta de funciones d'analís costoses",
+
);
diff --git a/languages/messages/MessagesAvk.php b/languages/messages/MessagesAvk.php
index 8a0d281f..32591155 100644
--- a/languages/messages/MessagesAvk.php
+++ b/languages/messages/MessagesAvk.php
@@ -129,9 +129,6 @@ $messages = array(
'tog-shownumberswatching' => 'Va ota va rupes favesik nedir !',
'tog-oldsig' => 'Tisa sugdara',
'tog-fancysig' => 'Krafiara va sugdaks wetce wikitext (a mivaskafi gluyasiki)',
-'tog-externaleditor' => 'Favera va divefi betasiki (anton gan aptacik, moe vusiko va yona aptafa vertara olegar)',
-'tog-externaldiff' => 'Omavafa favera va divefa "diff" xeka (anton gan aptacik, moe vusiko va yona aptafa vertara olegar)',
-'tog-showjumplinks' => 'Tutegirara va "grablera" vansarafi gluyasiki',
'tog-uselivepreview' => 'Favera va abdiwira (JavaScript) (bagalon)',
'tog-forceeditsummary' => 'Zo walzé viele betaravildeks tir vlardaf !',
'tog-watchlisthideown' => 'Palsera va jinaf suzdasikif betakseem',
@@ -303,7 +300,7 @@ $messages = array(
'jumptonavigation' => 'exulera',
'jumptosearch' => 'aneyara',
-# 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).
+# 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).
'aboutsite' => 'Icde {{SITENAME}}',
'aboutpage' => 'Project:Icdeuca',
'copyright' => 'Deraykan cek kare $1.',
@@ -313,7 +310,6 @@ $messages = array(
'disclaimers' => 'Walzera',
'disclaimerpage' => 'Project:Jadif walzereem',
'edithelp' => 'Pomara',
-'edithelppage' => 'Help:Tokinde bubetat',
'helppage' => 'Help:Pomara',
'mainpage' => 'Emudexo',
'mainpage-description' => 'Emudexo',
@@ -381,14 +377,6 @@ Vexala dem enafu aptafu bu tir rotrasina dene [[Special:SpecialPages|{{int:speci
# General errors
'error' => 'Rokla',
'databaseerror' => 'Origakrokla',
-'dberrortext' => 'Vurarokla pu origak. Ironokafa kucilara suleyena gan origak tiyir :
-<blockquote><tt>$1</tt></blockquote>
-mal fliok « <tt>$2</tt> ».
-MySQL va « <tt>$3: $4</tt> » rokla al katacer.',
-'dberrortextcl' => 'Bibera va origak tir roklakirafa. Ironokafa stakseyena bibera tiyir:
-« $1 »
-skuyuna gan « $2 » fliok
-MySQL va « $3 : $4 » rokla al dimstakser.',
'laggedslavemode' => 'Obral : bu va ironakaf tuenakseem rotir meruldar',
'readonly' => 'Beta elekana nuskera va origak',
'enterlockreason' => 'Va elekaradanda is uldinera va elekaracek bazel',
@@ -430,7 +418,6 @@ Erura : $2',
'viewyourtext' => "Rowil va klita ke '''rinafa betara''' ise ko batu bu roksudal :",
'protectedinterface' => 'Batu bu va walasikikrent ke talpeyot dafur nume ta djira va favejera zo ixatcar.',
'editinginterface' => "'''Obral !''' Rin va bu favenu koe talpeyotwalasiki betal. Betara va batu bu va laviuca ke favesikafi walasiki dolge ar favesik vanolatar. Kalavason, va [//translatewiki.net/wiki/Main_Page?setlang=avk translatewiki.net], va MediaWiki abdumimaks va tulizukara, vay favel.",
-'sqlhidden' => '(SQL kucilara palsena)',
'cascadeprotected' => 'Batu bu icde betara zo nendar, kire va vlevefu {{PLURAL:$1|bu|bu}} pasur, danu kan tegisa "stoyakorafa" rotisaca zo nendad : $2',
'namespaceprotected' => "Va bu koe '''$1''' yoltxo me robetal !",
'ns-specialprotected' => 'Aptafu bu tir merobetanu.',
@@ -523,7 +510,7 @@ Ta da wan zo pilkomodal, va warzaf remravlem batlize gobazel :",
'newpassword' => 'Warzaf remravlem',
'retypenew' => 'Va warzaf remravlem gruyel',
'resetpass_submit' => 'Va beksa bazel nume zo dogluyatal !',
-'resetpass_success' => 'Rinaf remravlem kiewatcon su zo betar ! Nume rinafa dogluyara tir...',
+'changepassword-success' => 'Rinaf remravlem kiewatcon su zo betar ! Nume rinafa dogluyara tir...',
'resetpass_forbidden' => 'Kona beksa tir merobetana',
'resetpass-submit-loggedin' => 'Betara va remravlem',
'resetpass-submit-cancel' => 'Kuidera',
@@ -823,7 +810,6 @@ Ta ropasusu warzafu bu yo va [[Special:Search|aneyara ko wiki]] yawal.',
'viewprevnext' => 'Va ($1 {{int:pipe-separator}} $2) ik ($3) disukel.',
'searchmenu-exists' => "'''Ixam bu yoltkirafu gu \"[[:\$1]]\" dene bati wiki.'''",
'searchmenu-new' => "'''Redura va bu \"[[:\$1]]\" den bati wiki!'''",
-'searchhelp-url' => 'Help:Pomara',
'searchprofile-articles' => 'Teliz',
'searchprofile-project' => 'Pomarabu ik abdumimaksbu',
'searchprofile-images' => 'Jonkanaca',
@@ -864,14 +850,6 @@ Kan ''all:'' laganeyal ta varafa exulera (gon keyaksexo is teza ikz-), oke wetce
'search-external' => 'Divafa aneyara',
'searchdisabled' => "<p>La fonction de recherche sur l'intégralité du texte a été temporairement désactivée à cause de la grande charge que cela impose au serveur. Nous espérons la rétablir prochainement lorsque nous disposerons d'un serveur plus puissant. En attendant, vous pouvez faire la recherche avec Google:</p>",
-# Quickbar
-'qbsettings' => 'Tuweltara va xekobla',
-'qbsettings-none' => 'Mek',
-'qbsettings-fixedleft' => 'Roneon titickanaf',
-'qbsettings-fixedright' => 'Talteon titickanaf',
-'qbsettings-floatingleft' => 'Roneon ezas',
-'qbsettings-floatingright' => 'Talteon ezas',
-
# Preferences page
'preferences' => 'Lodamaceem',
'mypreferences' => 'Jinaf lodamaceem',
@@ -896,7 +874,6 @@ Kan ''all:'' laganeyal ta varafa exulera (gon keyaksexo is teza ikz-), oke wetce
'saveprefs' => 'Va lodamaceem tuená',
'resetprefs' => 'Va lodamceem dimplekú',
'prefs-editing' => 'Sutelaxo',
-'prefs-edit-boxsize' => 'Lum ke betaradilk.',
'rows' => 'Emacekeem',
'columns' => 'Brizeem',
'searchresultshead' => 'Nedira va aneyaratrasikseem',
@@ -1097,7 +1074,6 @@ Rinafe e-mail mane me zo razdar viele ar webesik uzerar.',
'recentchangeslinked-feed' => 'Gluyasikisuzdara',
'recentchangeslinked-toolbox' => 'Gluyasikisuzdara',
'recentchangeslinked-title' => 'Betakseem skedas va "$1"',
-'recentchangeslinked-noresult' => 'Meka betara va gluyasikikirafu bu remi bata rekola.',
'recentchangeslinked-summary' => "Batu aptafu bu va ironokaf betakseem va gluyasikikirafu bu vexalar.
Bu koe [[Special:Watchlist|rinafi suzdasiki]] tid '''vastaakorafu'''.",
'recentchangeslinked-page' => 'Buyolt :',
@@ -1288,9 +1264,6 @@ Abdi sulara, setikel da va ari skedasiki va teza stujel.',
'statistics-users-active' => 'Tegiraf pakesikeem',
'statistics-mostpopular' => 'Tel lorupen bueem',
-'disambiguations' => 'Bu dem milyoltaca yo',
-'disambiguationspage' => '{{ns:template}}:Milyoltaca',
-
'doubleredirects' => 'Jontolafa graskara',
'doubleredirectstext' => "<b>Attention:</b> cette liste peut contenir des « faux positifs ». Dans ce cas, c'est probablement la page du premier #REDIRECT contient aussi du texte.<br />Chaque ligne contient les liens à la 1re et 2e page de redirection, ainsi que la première ligne de cette dernière, qui donne normalement la « vraie » destination. Le premier #REDIRECT devrait lier vers cette destination.",
'double-redirect-fixed-move' => 'arrundayan [[$1]], dure graskan kal [[$2]]',
@@ -1470,10 +1443,9 @@ Ta sulara va batu bu div rinafi suzdasiki, koe grablexo va « Mea suzdá » vule
'unwatchthispage' => 'Va batu bu mea suzdá',
'notanarticle' => 'Nedoy teliz',
'notvisiblerev' => 'Betaks sulayan',
-'watchnochange' => 'Nedoyu rinafu suzdanu bu al zo betar bak bazena rekola',
'watchlist-details' => '{{PLURAL:$1|$1 bu|$1 bu}} koe rinafi suzdasiki rade prilarabueem.',
-'wlheader-enotif' => '* Email walzera tir tegisa.',
-'wlheader-showupdated' => "* Bu betayanu vielu rin ironokon worayal tir '''sulatcalakorafu'''.",
+'wlheader-enotif' => 'Email walzera tir tegisa.',
+'wlheader-showupdated' => "Bu betayanu vielu rin ironokon worayal tir '''sulatcalakorafu'''.",
'watchmethod-recent' => 'ageltara va noeltaf betakseem va suzdan bueem',
'watchmethod-list' => 'ageltara va suzdan bueem icde noeltafa betara',
'watchlistcontains' => 'Rinafi suzdasiki va $1 bu ruldar',
@@ -1744,11 +1716,8 @@ male abdion elekayane IP mane.',
'ipb_expiry_invalid' => "temps d'expiration invalide.",
'ipb_already_blocked' => '"$1" ixam tir elekan',
'ip_range_invalid' => 'IP elega mewadafa.',
-'blockme' => 'Zo eleká !',
'proxyblocker' => 'Elekasiki va proxy',
-'proxyblocker-disabled' => 'Bati fli tir metegirafi.',
'proxyblockreason' => "Votre ip a été bloquée car c'est un proxy ouvert. Merci de contacter votre fournisseur d'accès internet ou votre support technique et de l'informer de ce problème de sécurité.",
-'proxyblocksuccess' => 'Tenuweyes.',
'sorbsreason' => "Rinafe IP mane wetce fenkunafi 'proxy' koe DNSBL faveni gan {{SITENAME}} zo vexalar.",
# Developer tools
@@ -2046,7 +2015,7 @@ Kotari milconyafi gluyasiki roklon zo krafiar.',
* gpslongitude
* gpsaltitude',
-# EXIF tags
+# Exif tags
'exif-imagewidth' => 'Mantuca',
'exif-imagelength' => 'Ontinuca',
'exif-compression' => 'Raxivaracave',
@@ -2121,7 +2090,7 @@ Kotari milconyafi gluyasiki roklon zo krafiar.',
'exif-gpsdestdistance' => 'Kofa soluma',
'exif-gpsdatestamp' => 'GPS evla',
-# EXIF attributes
+# Exif attributes
'exif-compression-1' => 'Raxivariskafa',
'exif-unknowndate' => 'Megrupena evla',
@@ -2340,7 +2309,6 @@ This confirmation code will expire at $4.',
'version-variables' => 'Remvodeem',
'version-other' => 'Ar',
'version-hooks' => 'Demi se',
-'version-extension-functions' => 'Divatces fliok se',
'version-parser-extensiontags' => 'Exulerafa divatcenafa tcala',
'version-parser-function-hooks' => 'Exuleraflidemi',
'version-hook-name' => 'Demiyolt',
@@ -2351,11 +2319,6 @@ This confirmation code will expire at $4.',
'version-software-product' => 'Warzeks',
'version-software-version' => 'Siatos',
-# Special:FilePath
-'filepath' => 'Iyeltakkelda',
-'filepath-page' => 'Iyeltak :',
-'filepath-submit' => 'Kelda',
-
# Special:FileDuplicateSearch
'fileduplicatesearch' => 'Aneyara va jontolaf iyeltak',
'fileduplicatesearch-legend' => 'Aneyara va jontolaca',
diff --git a/languages/messages/MessagesAy.php b/languages/messages/MessagesAy.php
index b5581498..119c65b4 100644
--- a/languages/messages/MessagesAy.php
+++ b/languages/messages/MessagesAy.php
@@ -127,6 +127,7 @@ $messages = array(
'qbbrowse' => 'Wampuña',
'qbedit' => 'Turkaña',
'qbpageoptions' => 'Uñstawitaki ajllita',
+'qbpageinfo' => "Uñstawxat uñt'ayawi",
'qbmyoptions' => 'Ajllitanakaja',
'errorpagetitle' => 'Pantja',
diff --git a/languages/messages/MessagesAz.php b/languages/messages/MessagesAz.php
index b6bc6070..33ef132b 100644
--- a/languages/messages/MessagesAz.php
+++ b/languages/messages/MessagesAz.php
@@ -111,9 +111,6 @@ $messages = array(
'tog-shownumberswatching' => 'İzləyən istifadəçilərin sayını göstər',
'tog-oldsig' => 'Hazırkı imza:',
'tog-fancysig' => 'Vikimətn şəklində imza (avtomatik keçid yaratmadan)',
-'tog-externaleditor' => 'Susmaya görə xarici müqayisə proqramlarından istifadə et',
-'tog-externaldiff' => 'Susmaya görə xarici müqayisə proqramlarından istifadə et',
-'tog-showjumplinks' => '"Keçid et:" linklərini aktivləşdir',
'tog-uselivepreview' => 'Canlı sınaq baxışı xüsusiyyətindən istifadə et (JavaScript tələb edir, sınaq mərhələsindədir)',
'tog-forceeditsummary' => 'Qısa məzmunu boş saxladıqda mənə bildir',
'tog-watchlisthideown' => 'Mənim redaktələrimi izləmə siyahısında gizlət',
@@ -209,7 +206,7 @@ $messages = array(
'noindex-category' => 'İndeksləşdirilməyən səhifələr',
'broken-file-category' => 'İşləməyən fayl keçidləri olan səhifələr',
-'linkprefix' => '/^(.*?)([a-zA-Z\\x80-\\xff]+)$/sD',
+'linkprefix' => '/^((?>.*(?<![a-zA-Z\\x80-\\xff])))(.+)$/sD',
'about' => 'Haqqında',
'article' => 'Mündəricat',
@@ -314,7 +311,7 @@ $1',
'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).
+# 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).
'aboutsite' => '{{SITENAME}} haqqında',
'aboutpage' => 'Project:Ä°zah',
'copyright' => 'Bu məzmun $1 əhatəsindədir.',
@@ -324,7 +321,6 @@ $1',
'disclaimers' => 'Məsuliyyətdən imtina',
'disclaimerpage' => 'Project:Məsuliyyətdən imtina',
'edithelp' => 'Redaktə kömək',
-'edithelppage' => 'Help:RedaktÉ™',
'helppage' => 'Help:Mündəricat',
'mainpage' => 'Ana Səhifə',
'mainpage-description' => 'Ana Səhifə',
@@ -351,7 +347,6 @@ Bax: [[Special:Version|Versiyalar]].',
'newmessagesdifflink' => 'Sonuncu və əvvəlki versiya arasındakı fərq',
'youhavenewmessagesmulti' => '"$1"da 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É™',
@@ -403,16 +398,6 @@ Mövcud xüsusi səhifələrin siyahısı: [[Special:SpecialPages|Xüsusi səhif
# General errors
'error' => 'Xəta',
'databaseerror' => 'Verilənlər bazası xətası',
-'dberrortext' => 'Verilənlər bazası sorğusunda sintaksis xətası yarandı.
-Bu proqram təminatındakı xəta ilə əlaqədar ola bilər.
-Verilənlər bazasına sonuncu sorğu "<tt>$2</tt>" funksiyasından
-yaranan <blockquote><tt>$1</tt></blockquote>.
-Verilənlər bazasının göstərdiyi xəta "<tt>$3: $4</tt>".',
-'dberrortextcl' => 'Verilənlər bazası sorğusunda sintaksis xətası yarandı.
-Verilənlər bazasına sonuncu sorğu:
-"$1"
-"$2" funksiyasından yaranmışdır.
-Verilənlər bazasının göstərdiyi xəta "$3: $4"',
'laggedslavemode' => "'''Xəbərdarlıq:''' Səhifə son əlavələri əks etdirməyə bilər.",
'readonly' => 'Verilənlər bazası bloklanıb',
'enterlockreason' => 'Bloklamanın səbəbini və nəzərdə tutulan müddətini qeyd edin',
@@ -462,7 +447,6 @@ SorÄŸu: $2',
'editinginterface' => "'''Diqqət!''' Siz proqram təminatı interfeysinin mətn olan səhifəsini 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 [//translatewiki.net/wiki/Main_Page?setlang=az 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.',
@@ -486,7 +470,6 @@ Siz {{SITENAME}} saytını anonim olaraq istifadÉ™ etmÉ™yÉ™ davam edÉ™ bilÉ™r vÉ
'yourpassword' => 'Parol:',
'yourpasswordagain' => 'Parolu təkrar yazın:',
'remembermypassword' => 'Məni bu kompyuterdə xatırla (maksimum $1 {{PLURAL:$1|gün|gün}})',
-'securelogin-stick-https' => 'Daxil olduqdan sonra HTTPS-lə əlaqədə qal',
'yourdomainname' => 'Sizin domain',
'password-change-forbidden' => 'Bu vikidə parolunuzu dəyişdirə bilməzsiniz.',
'externaldberror' => 'Verilənlər bazasının doğruluğunu yoxlamada xəta baş verib və yaxud sizin xarici istifadəçi qeydiyyatını yeniləmək hüququnuz yoxdur.',
@@ -574,7 +557,7 @@ Sistemə daxil olmanı yekunlaşdırmaq üçün yeni parolu bura yazmalısınız
'newpassword' => 'Yeni parol:',
'retypenew' => 'Yeni parolu təkrar yazın:',
'resetpass_submit' => 'Parol yaradın və sistemə daxil olun',
-'resetpass_success' => 'Parolunuz dəyişdirldi! Hazırda sistemə daxil olursunuz...',
+'changepassword-success' => 'Parolunuz dəyişdirldi! Hazırda sistemə daxil olursunuz...',
'resetpass_forbidden' => 'Parolu dəyişmək mümkün deyil',
'resetpass-no-info' => 'Bu səhifəni birbaşa açmaq üçün sistemə daxil olmalısınız.',
'resetpass-submit-loggedin' => 'Parolu dəyiş',
@@ -585,10 +568,8 @@ Ola bilər siz parolu müvəffəqiyyətlə dəyişmisiniz yaxud müvəqqəti par
# Special:PasswordReset
'passwordreset' => 'Parolu yenilÉ™',
-'passwordreset-text' => 'Akkauntunuz haqqında xatırlatmanı elektron poçt vasitəsilə ala bilməniz üçün bu formanı doldurun.',
'passwordreset-legend' => 'Parolu yenilÉ™',
'passwordreset-disabled' => 'Yenidən qurulma parolu bu vikidə işləmir',
-'passwordreset-pretext' => '{{PLURAL:$1||Enter one of the pieces of data below}}',
'passwordreset-username' => 'İstifadəçi adı:',
'passwordreset-domain' => 'Domen:',
'passwordreset-email' => 'E-mail ünvanı:',
@@ -733,6 +714,7 @@ Məlumat üçün aşağıda bu səhifənin tarixçəsindən müvafiq silmə qeyd
Çox güman ki, səhifə silinmişdir.',
'edit-conflict' => 'Düzəlişlər münaqişəsi',
'edit-no-change' => 'Sizin redaktələr qeydə alınmamışdır. Belə ki, mətndə heç bir düzəliş edilməmişdir.',
+'postedit-confirmation' => 'Redaktəniz qeyd edildi.',
'edit-already-exists' => 'Yeni səhifəni yaratmaq mümkün deyil.
Belə ki, bu adda səhifə artıq mövcuddur.',
@@ -911,7 +893,6 @@ $1",
'searchmenu-legend' => 'Axtarış kriteriyaları',
'searchmenu-exists' => "'''Bu vikidə \"[[:\$1]]\" adında səhifə mövcuddur'''",
'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',
@@ -952,14 +933,6 @@ $1",
'powersearch-togglenone' => 'Heç biri',
'search-external' => 'Xarici axtarış',
-# Quickbar
-'qbsettings' => 'Naviqasiya paneli',
-'qbsettings-none' => 'Heç biri',
-'qbsettings-fixedleft' => 'Sola sabitləndi',
-'qbsettings-fixedright' => 'Sağa sabitləndi',
-'qbsettings-floatingleft' => 'Sola əyilir',
-'qbsettings-floatingright' => 'Sağa əyilir',
-
# Preferences page
'preferences' => 'Nizamlamalar',
'mypreferences' => 'Nizamlamalar',
@@ -991,7 +964,6 @@ $1",
'resetprefs' => 'Yarat',
'restoreprefs' => 'Bütün nizamlamaları bərpa et (bütün bölmələrdə)',
'prefs-editing' => 'RedaktÉ™',
-'prefs-edit-boxsize' => 'Redaktə pəncərəsinin həcmi',
'rows' => 'Sıralar:',
'columns' => 'Sütunlar:',
'searchresultshead' => 'Axtar',
@@ -1002,9 +974,6 @@ $1",
'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:',
@@ -1033,7 +1002,6 @@ Təsadüfi yolla seçilmiş bu paroldan istifadə edə bilərsiniz: $1',
'prefs-custom-js' => 'Xüsusi JavaScript',
'prefs-common-css-js' => 'Bütün skinlər üçün ümumi CSS/JavaScript:',
'prefs-emailconfirm-label' => 'E-poçtun 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:',
@@ -1261,7 +1229,6 @@ HÉ™mçinin kimliyinizi gostÉ™rmÉ™dÉ™n belÉ™, baÅŸqalarının sizinlÉ™ istifadÉ™Ã
'recentchangeslinked-feed' => 'ÆlaqÉ™li redaktÉ™lÉ™r',
'recentchangeslinked-toolbox' => 'ÆlaqÉ™li redaktÉ™lÉ™r',
'recentchangeslinked-title' => "''$1'' ilə əlaqəli dəyişikliklər",
-'recentchangeslinked-noresult' => 'Qeyd olunan dövrdə əlaqədar səhifələrdə heç bir dəyişiklik yoxdur.',
'recentchangeslinked-summary' => "Aşağıdakı siyahı, qeyd olunan səhifəyə (və ya qeyd olunan kateqoriyadakı səhifələrə) daxili keçid verən səhifələrdə edilmiş son dəyişikliklərin siyahısıdır.
[[Special:Watchlist|İzləmə siyahınızdakı]] səhifələr '''qalın''' şriftlə göstərilmişdir.",
'recentchangeslinked-page' => 'Səhifə adı:',
@@ -1393,7 +1360,6 @@ $1',
'http-read-error' => 'HTTP oxuma xətası',
'http-timed-out' => 'HTTP istəyinin vaxtı bitdi.',
'http-curl-error' => 'URL-ə yanlış müraciət: $1',
-'http-host-unreachable' => 'URL-ə çatmaq olmadı.',
'http-bad-status' => 'HTTP müraciətin yoxlanması zamanı problem aşkarlanmışdır: $1 $2',
# Some likely curl errors. More could be added from <http://curl.haxx.se/libcurl/c/libcurl-errors.html>
@@ -1515,11 +1481,6 @@ $1',
'statistics-users-active-desc' => 'Son {{PLURAL:$1|gün|$1 gündə}} iş görən istifadəçilər',
'statistics-mostpopular' => 'Æn çox baxılan sÉ™hifÉ™lÉ™r',
-'disambiguations' => 'Dəqiqləşdirmə səhifələrinə keçid verən səhifələr',
-'disambiguationspage' => 'Template:dəqiqləşdirmə',
-'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-fixed-move' => '[[$1]] dəyişdirilib.
Hazırda [[$2]]-yə istiqamətlənib.',
@@ -1726,10 +1687,9 @@ Fərdi hüquqlar haqqında əlavə məlumatı [[{{MediaWiki:Listgrouprights-help
'unwatchthispage' => 'İzləmə',
'notanarticle' => 'Səhifə boşdur',
'notvisiblerev' => 'Başqa istifadıçinin son dəyişikliyi silinib',
-'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.',
-'wlheader-showupdated' => "* Son ziyarətinizdən sonra edilən dəyişikliklər '''qalın şriftlərlə''' göstərilmişdir.",
+'wlheader-enotif' => ' E-məktubla bildiriş aktivdir.',
+'wlheader-showupdated' => "Son ziyarətinizdən sonra edilən dəyişikliklər '''qalın şriftlərlə''' göstərilmişdir.",
'watchmethod-recent' => 'yeni dəyişikliklər izlənilən səhifələr üçün yoxlanılır',
'watchmethod-list' => 'izlənilən səhifələr yeni dəyişikliklər üçün yoxlanılır',
'watchlistcontains' => 'İzləmə siyahınızda $1 {{PLURAL:$1|səhifə|səhifə}} var.',
@@ -2068,10 +2028,7 @@ Bloklama şərtlərini dəyişmək istəyirsiniz?',
'unblock-hideuser' => 'İstifadəçi adı gizli olduğu üçün, bi bloku götürə bilməzsiniz.',
'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
@@ -2281,13 +2238,8 @@ Zəhmət olmasa başqa ad seçin.',
# 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 */',
'group-autoconfirmed.css' => '/* Burada yerləşən CSS yalnız avtotəsdiqlənmiş istifadəçilərə şamil olunur */',
@@ -2297,13 +2249,8 @@ Zəhmət olmasa başqa ad seçin.',
# 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 */',
'group-autoconfirmed.js' => '/* Burada istənilən JavaScript yalnız avtotəsdiqlənmiş istifadəçilər üçün yüklənəcək */',
@@ -2344,13 +2291,8 @@ Zəhmət olmasa başqa ad seçin.',
'pageinfo-authors' => 'Fərqli müəlliflərin sayı',
# Skin names
-'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',
@@ -2473,7 +2415,7 @@ Variants for Chinese language
* gpslongitude
* gpsaltitude',
-# EXIF tags
+# Exif tags
'exif-imagewidth' => 'GeniÅŸlik',
'exif-imagelength' => 'Hündürlük',
'exif-compression' => 'Sıxılmamış',
@@ -2599,7 +2541,7 @@ Variants for Chinese language
'exif-organisationinimage' => 'Təsvir edilmiş təşkilat',
'exif-personinimage' => 'Təsvir edilmiş şəxs',
-# EXIF attributes
+# Exif attributes
'exif-compression-1' => 'Sıxılmış',
'exif-copyrighted-true' => 'Müəlliflik hüququ ilə qorunur',
@@ -2892,7 +2834,6 @@ Variants for Chinese language
'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-hook-subscribedby' => 'AbunÉ™ olan',
'version-version' => '(Versiya $1)',
@@ -2903,11 +2844,6 @@ Variants for Chinese language
'version-software-version' => 'Versiya',
'version-entrypoints-header-url' => 'URL',
-# Special:FilePath
-'filepath' => 'Fayl yolu',
-'filepath-page' => 'Fayl:',
-'filepath-submit' => 'Get',
-
# Special:FileDuplicateSearch
'fileduplicatesearch' => 'Dublikat fayl axtarışı',
'fileduplicatesearch-legend' => 'Dublikatı axtar',
@@ -2941,7 +2877,10 @@ Variants for Chinese language
'tags-title' => 'Etiketlər',
'tags-tag' => 'Etiket adı',
'tags-description-header' => 'Anlamının tam açıqlaması',
+'tags-active-header' => 'Aktiv?',
'tags-hitcount-header' => 'Etiketli dəyişikliklər',
+'tags-active-yes' => 'Bəli',
+'tags-active-no' => 'Xeyr',
'tags-edit' => 'redaktÉ™',
'tags-hitcount' => '$1 {{PLURAL:$1|dəyişiklik|dəyişiklik}}',
diff --git a/languages/messages/MessagesAzb.php b/languages/messages/MessagesAzb.php
index 09f72ae7..e9423fb2 100644
--- a/languages/messages/MessagesAzb.php
+++ b/languages/messages/MessagesAzb.php
@@ -116,9 +116,6 @@ $messages = array(
'tog-shownumberswatching' => 'ایزله‌ين ایستیÙاده‌چیلرین سایینی گؤستر',
'tog-oldsig' => 'ایندی‌کی ایمضا:',
'tog-fancysig' => 'ویکی متن کیمی ایمضا (اوتوماتیک باغلانتی‌سیز)',
-'tog-externaleditor' => 'دَییشدیرمک اوچون ائشیک یازیلیم ایشلد (یالنیز چوخ باشارانلار اوچون، بیلگی‌سایارینیزدا مخصوص تنظیملر لازیم‌دیر. [//www.mediawiki.org/wiki/Manual:External_editors آرتیق بیلگیلر])',
-'tog-externaldiff' => 'موقاییسه ائتمک اوچون ائشیک یازیلیم ایشلد (یالنیز چوخ باشارانلار اوچون، بیلگی‌سایارینیزدا مخصوص تنظیملر لازیم‌دیر. [//www.mediawiki.org/wiki/Manual:External_editors آرتیق بیلگیلر])',
-'tog-showjumplinks' => '«آتلان:» یاردیم باغلانتیلارینی آچ',
'tog-uselivepreview' => 'دیری اؤن‌گؤستریش ایشلد (جاوااسکریپت لازیم‌دیر)(تست مرحله‌سینده)',
'tog-forceeditsummary' => 'دَییشیکلیک قیساسی بوش قالاندا منی بیلدیر',
'tog-watchlisthideown' => 'منیم دَییشیکلیکلریمی ایزله‌دیکلردن گیزلت',
@@ -131,6 +128,7 @@ $messages = array(
'tog-diffonly' => 'موقاییسه‌لر آلیتندا صحیÙه‌لرین ایچینده‌کیلرینی گؤسترمه',
'tog-showhiddencats' => 'گیزلی بؤلمه‌لری گؤستر',
'tog-norollbackdiff' => 'قایتاراندان سونرا موقاییسه گؤسترمه',
+'tog-useeditwarning' => 'دَییشدیرمه صحیÙه‌سینده چیخیش زامانی، آچیق Ùˆ قئید اولمایان دَییشدیرمه صحیÙÙ‡ وارسا منه هشدار وئریلسین',
'underline-always' => 'همیشه',
'underline-never' => 'هئچ واخت',
@@ -194,6 +192,14 @@ $messages = array(
'oct' => 'اوکتوبر',
'nov' => 'نووامبر',
'dec' => 'دئسامبر',
+'february-date' => '$1 Ùئوریه',
+'may-date' => '$1 مئی',
+'july-date' => '$1 ژولای',
+'august-date' => '$1 آقوست',
+'september-date' => '$1 سئپتامبر',
+'october-date' => '$1 اوکتوبر',
+'november-date' => '$1 نووامبر',
+'december-date' => '$1 دئسامبر',
# Categories related messages
'pagecategories' => '{{PLURAL:$1|بؤلمه|بؤلمه‌لر}}',
@@ -275,6 +281,7 @@ $messages = array(
'create-this-page' => 'بو صحیÙه‌‌نی يارات',
'delete' => 'سیل',
'deletethispage' => 'بو صحیÙه‌‌نی سیل',
+'undeletethispage' => 'بو صحیÙه‌نی دیریلت',
'undelete_short' => '{{PLURAL:$1|بیر دَییشیکلیگی|$1 دَییشیکلیگی}} برپا ائت',
'viewdeleted_short' => '{{PLURAL:$1|بیر|$1}} سیلینمیش دَییشیکلیگی گؤستر',
'protect' => 'قوروماق',
@@ -318,7 +325,7 @@ $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).
+# 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).
'aboutsite' => '{{SITENAME}}-ا گؤره',
'aboutpage' => 'Project:حاقیندا',
'copyright' => 'ایچینده‌کیلر $1 لیسانسی احاطه‌سینده‌دیلر.',
@@ -328,7 +335,6 @@ $1',
'disclaimers' => 'رد ائتمک',
'disclaimerpage' => 'Project:عمومی رد ائتمک',
'edithelp' => 'ديَیشیکلیک‌لر اوچون یاردیم',
-'edithelppage' => 'Help:دَییشدیرمه',
'helppage' => 'Help:ایچینده‌کیلر',
'mainpage' => 'آنا صحیÙÙ‡',
'mainpage-description' => 'آنا صحیÙÙ‡',
@@ -405,17 +411,6 @@ $1',
# General errors
'error' => 'خطا',
'databaseerror' => 'دیتابیس خطاسی',
-'dberrortext' => 'بیر دیتابیس سورغو سینتکس خطاسی قاباغا گلدی.
-بو، یازیلیم‌دا بیر خطانی گؤستره بیلر.
-سون قصد ائدیلن دیتابیس سورغوسو بو ایدی:
-<blockquote><code>$1</code></blockquote>
-"<code>$2</code>" Ùونکسیاسی ایچیندن.
-دیتابیس بو خطانی قایتاردی: "<samp>$3: $4</samp>".',
-'dberrortextcl' => 'بیر دیتابیس سورغو سینتکس خطاسی قاباغا گلدی.
-سون قصد ائدیلن دیتابیس سورغوسو بو ایدی:
-"$1"
-"$2" Ùونکسیاسی ایچیندن.
-دیتابیس بو خطانی قایتاردی: "$3: $4"',
'laggedslavemode' => "'''دیقت:''' یارپاق‌دا، سون دَییشیکلیکلرین اولماماسی ایمکانی وار.",
'readonly' => 'دیتابیس باغلانیب',
'enterlockreason' => 'باغلاما نَدَن‌لیگی و آچیلماغین تخمینی واختینی یازین',
@@ -470,12 +465,15 @@ $1',
'editinginterface' => "'''دیقت:''' سیز بیر یازیلیم آرا-اوزونه یازی تعمین ائدن صحیÙه‌نی دَییشدیرمک‌ده‌سینیز.
بو صحیÙه‌نی دَییشدیرمک، بو ویکی‌نی ایستیÙاده ائدن باشقا ایستیÙاده‌چیلرین گؤرونوشونو دَییشه‌جک‌دیر.
چئویرمه‌لری بوتون ویکی‌لره آرتیریب یوخسا دَییشدیرمک اوچون لوطÙاً [//translatewiki.net/ translatewiki.net]ØŒ مئدیاویکی‌نین یئرلیلشدیرمه پروژه‌سیندن ایستیÙاده ائدین.",
-'sqlhidden' => '(اس‌کیوال سورغوسو گیزلی)',
'cascadeprotected' => 'بو صحیÙÙ‡ دَییشیکلیکلر قاباغیندا قورونوب‌دور، چونکو بو آشاغیداکی، آبشاری {{PLURAL:$1|سئچمه‌سی|سئچمه‌لری}} سئچیلن، قورونان {{PLURAL:$1|صحیÙÙ‡|صحیÙه‌لر}} ایچینده‌دیر:
$2',
'namespaceprotected' => "سیز '''$1''' آدÙضاسینداکی صحیÙه‌لرین دَییشمه‌سینه ایجازه‌نیز یوخدور.",
'customcssprotected' => 'سیز بو CSS صÙحه‌سینین دَییشمه‌سینه ایجازه‌نیز یوخدور نییه Ú©ÛŒ اون‌دا باشقا ایشلدنین شخصی تنظیملری واردیر.',
'customjsprotected' => 'سیز بو جاوااسکریپت صÙحه‌سینین دَییشمه‌سینه ایجازه‌نیز یوخدور، نییه Ú©ÛŒ اون‌دا باشقا ایشلدنین شخصی تنظیملری واردیر.',
+'mycustomcssprotected' => 'بو CSS صحیÙه‌سینی دَییشدیرمگه ایجازه‌نیز یوخدور.',
+'mycustomjsprotected' => 'بو جاوااسکریپت صحیÙه‌سینی دَییشدیرمگه ایجازه‌نیز یوخدور.',
+'myprivateinfoprotected' => 'اؤز گیزلی بیلگیلرینیزی دَییشدیرمگه ایجازه‌نیز یوخدور.',
+'mypreferencesprotected' => 'اؤز ترجیحلرینیزی دَییشدیرمگه ایجازه‌نیز یوخدور.',
'ns-specialprotected' => 'اؤزل یارپاقلاری دَییشمک اولماز.',
'titleprotected' => 'بو آددا یارپاغین یارادیلماسی [[User:$1|$1]] ایشلدن طرÙیندن باغلانیب‌دیر.
اونون نَدَن‌لیگی بودور: "\'\'$2\'\'"',
@@ -501,10 +499,18 @@ $2',
'welcomecreation-msg' => 'حسابینیز آچیلدی.
[[Special:Preferences|{{SITENAME}}ترجیحلر]] دییشدیرمیی اونوتمایین.',
'yourname' => 'ایستیÙاده‌چی آدی:',
+'userlogin-yourname' => 'ایستیÙاده‌چی آدی',
+'userlogin-yourname-ph' => 'ایستیÙاده‌چی آدینیزی دَییشدیرین',
'yourpassword' => 'رمز:',
+'userlogin-yourpassword' => 'رمز',
+'userlogin-yourpassword-ph' => 'رمزینیزی داخیل ائدین',
+'createacct-yourpassword-ph' => 'بیر رمز داخیل ائدین',
'yourpasswordagain' => 'رمزی یئنی‌دن یازین:',
+'createacct-yourpasswordagain' => 'رمزی دوغرولایین',
+'createacct-yourpasswordagain-ph' => 'رمزی یئنی‌دن داخیل ائدین',
'remembermypassword' => 'بو بیلگی‌سایاردا منیم گیریشیمی (چوخو $1 {{PLURAL:$1|گون}}ه قدر) یاددا ساخلا',
-'securelogin-stick-https' => 'گیرندن سونرا، HTTPS-ه باغلی قال',
+'userlogin-remembermypassword' => 'منی ایچری‌ده ساخلا',
+'userlogin-signwithsecure' => 'آرخایین باغلانتی ایشلدین',
'yourdomainname' => 'سیزین دامنه:',
'password-change-forbidden' => 'بو ویکی‌ده رمزلری دَییشه بیلنمه‌سینیز.',
'externaldberror' => 'بیر دیتابیس دوغرولاما خطاسی اولدو، یوخسا سیزین ائشیک حسابینیزی گونجل‌لدمگه ایجازه‌نیز یوخدور.',
@@ -516,18 +522,38 @@ $2',
'logout' => 'چیخیش',
'userlogout' => 'چیخیش',
'notloggedin' => 'گیرمه‌میسینیز',
+'userlogin-noaccount' => 'حسابینیز یوخدورمو؟',
+'userlogin-joinproject' => '{{SITENAME}}-ه قوشولون',
'nologin' => 'حسابینیز یوخدومو؟ $1.',
'nologinlink' => 'حساب یارات',
'createaccount' => 'حساب یارات',
'gotaccount' => 'اؤنجه‌دن حسابینیز وارمی؟ $1.',
'gotaccountlink' => 'گیریش',
'userlogin-resetlink' => 'گیریش بیلگیلرینیزی اونوتموسونوز؟',
+'userlogin-resetpassword-link' => 'رمزینیزی صیÙیرلایین',
+'helplogin-url' => 'Help:ایچری گیرمک',
+'userlogin-helplink' => '[[{{MediaWiki:helplogin-url}}|ایچری گیرمگه یاردیم]]',
+'createacct-join' => 'آشاغیدا بیلگیلرینیزی داخیل ائدین.',
+'createacct-emailrequired' => 'ایمیل آدرسی',
+'createacct-emailoptional' => 'ایمیل آدرسی (ایستگه باغلی)',
+'createacct-email-ph' => 'ایمیل آدرسینیزی داخیل ائدین',
'createaccountmail' => 'بیر گئچیجی راست‌گله رمز ایشلت و اونو آشاغیدا بللندیرن ایمیل آدرسینه گؤندر',
+'createacct-realname' => 'دوغرو آد (ایستگه باغلی)',
'createaccountreason' => 'نَدَن‌لیک:',
+'createacct-reason' => 'سبب',
+'createacct-reason-ph' => 'ندن سیز باشقا حساب یارادیرسینیز',
+'createacct-captcha' => 'امنیت یوخلاماسی',
+'createacct-imgcaptcha-ph' => 'اوست‌ده‌کی گؤردوگونوز یازی‌نی داخیل ائدین',
+'createacct-submit' => 'حسابینیزی یارادین',
+'createacct-benefit-heading' => '{{SITENAME}} سیزین کیمی آدام‌لارین الی ایله یارانیب‌دیر.',
+'createacct-benefit-body1' => '{{PLURAL:$1|دَییشیکلیک}}',
+'createacct-benefit-body2' => '{{PLURAL:$1|صحیÙÙ‡}}',
+'createacct-benefit-body3' => 'سون {{PLURAL:$1|قاتیلان|قاتیلانلار}}',
'badretype' => 'یازدیغینیز رمزلر بیر دئییل‌لر.',
'userexists' => 'یازدیغینیز آد، اؤنجه‌دن ایشده‌دیر.
لوطÙاً باشقا بیر آد سئچین.',
'loginerror' => 'گیریش خطاسی',
+'createacct-error' => 'حساب یاراتما خطاسی',
'createaccounterror' => 'بو حساب یارادیلانمادیر: $1',
'nocookiesnew' => 'ایستیÙاده‌چی حسابی یارادیلدی، اما سیز گیرمه‌میسینیز.
{{SITENAME}} ایستیÙاده‌چیلری گیردیرمک اوچون، کوکی‌لری ایشلدیر.
@@ -609,7 +635,7 @@ $2',
'newpassword' => 'یئنی رمز',
'retypenew' => 'یئنی رمزی یئنی‌دن یازین:',
'resetpass_submit' => 'رمز یارادین و گیریش ائدین',
-'resetpass_success' => 'رمزینیز باشاری‌لا دَییشدیرلدی! ایندی گیریرسینیز...',
+'changepassword-success' => 'رمزینیز باشاری‌لا دَییشدیرلدی! ایندی گیریرسینیز...',
'resetpass_forbidden' => 'رمزلر دَییشیلمز',
'resetpass-no-info' => 'بو صحیÙه‌نی دوغرو گؤردوگونوز اوچون سیستمه گیرمه‌لیسینیز.',
'resetpass-submit-loggedin' => 'رمزی دَییشدیر',
@@ -621,10 +647,11 @@ $2',
# Special:PasswordReset
'passwordreset' => 'رمزی یئنی‌له',
-'passwordreset-text' => 'رمزینیزی یئنیله‌مک اوچون بو Ùورمو دولدورون.',
+'passwordreset-text-one' => 'رمزینیزی صیÙیرلاماق اوچون بو Ùورمو باشا چاتدیرین.',
+'passwordreset-text-many' => '{{PLURAL:$1|رمزینیزی صیÙیرلاماق اوچون، بیرینی دولدورون.}}',
'passwordreset-legend' => 'رمزی یئنی‌له',
'passwordreset-disabled' => 'بو ویکی‌ده رمزی یئنی‌له‌مک باغلانیب‌دیر.',
-'passwordreset-pretext' => '{{PLURAL:$1|آشاغیداکی وئری پارچالارینین بیرینی وئرین}}',
+'passwordreset-emaildisabled' => 'ایمیل اؤزل‌لیکلری بو ویکی‌ده باغلانیب‌دیر.',
'passwordreset-username' => 'ایستیÙاده‌چی آدی:',
'passwordreset-domain' => 'دامنه:',
'passwordreset-capture' => 'سون نتیجه ایمیل گؤستریلسین؟',
@@ -647,7 +674,7 @@ $2
گئچیجی رمز: $2',
'passwordreset-emailsent' => 'بیر رمز یئنیله‌مه ایمیلی گؤندریلیب‌دیر.',
'passwordreset-emailsent-capture' => 'آشاغیدا گؤستریلن کیمی بیر رمز یئنیله‌مه ایمیلی گؤندریلیب‌دیر.',
-'passwordreset-emailerror-capture' => 'آشاغیدا گؤستریلن کیمی بیر یادا سالما ایمیل یارادیلیب‌دیر، اما ایستیÙاده‌چی‌یه گؤندرمگی باشاریلی اولمادی: $1',
+'passwordreset-emailerror-capture' => 'آشاغیدا گؤستریلن کیمی بیر رمز یئنیله‌مه ایمیلی یارادیلیب‌دیر، اما {{GENDER:$2ایستیÙاده‌چی}}‌یه گؤندرمگی باشاریلی اولمادی: $1',
# Special:ChangeEmail
'changeemail' => 'ایمیل آدرسینی دَییشدیر',
@@ -854,12 +881,14 @@ $2
چوخ گومان کی، صحیÙÙ‡ سیلینمیش‌دیر.',
'edit-conflict' => 'سیزله برابر دییشدیرمه',
'edit-no-change' => 'سیزین دییشدیر قئیده آلینمامیش‌دیر. بئله کی، متنده هئچ بیر دییشدیر ائدیلممیش‌دیر.',
+'postedit-confirmation' => 'سیزین دَییشدیرمه‌نیز قئید اولونوب‌دور.',
'edit-already-exists' => 'یئنی صحیÙÙ†ÛŒ یاراتماق مومکون دئییل.
بئله کی، بو آددا صحیÙÙ‡ آرتیق مؤوجوددور.',
'defaultmessagetext' => 'دÙالت دانیشیق متنی',
'content-failed-to-parse' => 'تجزیه محتوای $2 مدل اوچون $1: $3 موÙقیت اله گلمه دی',
'invalid-content-data' => 'اعتبارسیز مضمون معلوماتی',
'content-not-allowed-here' => '"$1" مقاله‌سینه، [[$2]] صحیÙه‌سینده ایجازه وئریلممیش دیر.',
+'editwarning-warning' => 'بو صحیÙه‌نی ترک ائتمک، دَییشدیرمه‌لرینیزی الدن وئرمگه سبب اولا بیلر. اگر گیریش ائتمیسینیز بو ایخطاری، ترجیحلرینیزین «دَییشدیرمک» بؤلوموندن، ایشدن سالا بیلرسینیز.',
# Content models
'content-model-wikitext' => 'ویکی‌یازی',
@@ -894,6 +923,7 @@ $2
'undo-failure' => 'دییشیک‌لیک‌لرین توققوشماسی نتیجه‌سینده گئرییه قایتارما ایشی اوغورسوز اولدو.',
'undo-norev' => 'دوزلیش‌لر گئری قایتاریلا بیلینمیر، چونکی اونلار یا مؤوجود دئییل، یا دا سیلینیب.',
'undo-summary' => '$1 دییشیک‌لیک [[Special:Contributions/$2|$2]] ([[User talk:$2|دانیشیق]]) طرÙین‌دن گئری آلیندی​​.',
+'undo-summary-username-hidden' => 'گیزلی ایستیÙاده‌چی ایله ائدیلمیش $1 نوسخه‌سینی قایتارماق',
# Account creation failure
'cantcreateaccounttitle' => 'حساب یارادماق اولمور',
@@ -1096,7 +1126,6 @@ $1",
'searchmenu-legend' => 'آختارماق تنظیملری',
'searchmenu-exists' => "'''بو ویکی‌ده «[[:$1]]» آدلی صحیÙÙ‡ واردیر.'''",
'searchmenu-new' => "'''بو ویکی‌ده «[[:$1]]» صحیÙه‌‌سینی يارات!'''",
-'searchhelp-url' => 'Help:ایچینده‌کیلر',
'searchmenu-prefix' => '[[Special:PrefixIndex/$1| بو اؤن‌اک ایله اولان صحیÙه‌لری آختار]]',
'searchprofile-articles' => 'مقاله‌لر',
'searchprofile-project' => 'یاردیم Ùˆ پروژه صحیÙه‌لری',
@@ -1139,15 +1168,7 @@ $1",
'searchdisabled' => '{{SITENAME}} آختاریشی باغلانیب‌دیر.
ایندی گوگل ایله آختارا بیلرسینیز.
دیقت ائدین کی اونون {{SITENAME}} ایندئکسی، کؤهنه اولا بیلر.',
-
-# Quickbar
-'qbsettings' => 'سورعت پانئلی',
-'qbsettings-none' => 'هئچ بیری',
-'qbsettings-fixedleft' => 'سولا ثابیت',
-'qbsettings-fixedright' => 'ساغا ثابیت',
-'qbsettings-floatingleft' => 'سولا اوزن',
-'qbsettings-floatingright' => 'ساغا اوزن',
-'qbsettings-directionality' => 'ثابیت، سیزین دیل یازینیزین یولویلا',
+'search-error' => 'آختاراندا بیر خطا قاباغا گلدی: $1',
# Preferences page
'preferences' => 'ترجیحلر',
@@ -1181,7 +1202,6 @@ $1",
'resetprefs' => 'قئید ائدیلمه‌میش ترجیحلری صیÙیرله',
'restoreprefs' => 'بوتون ایلک ترجیحلری قایتار',
'prefs-editing' => 'دَییشدیرمک‌ده',
-'prefs-edit-boxsize' => 'دَییشدیرمه پنجره‌سینین اؤلچو',
'rows' => 'سطرلر:',
'columns' => 'سوتونلار',
'searchresultshead' => 'آختار',
@@ -1192,9 +1212,6 @@ $1",
'recentchangesdays-max' => 'ماکسیموم $1 {{PLURAL:$1|گون |گون}}',
'recentchangescount' => 'سون ديَیشیکلیکلرده باشلیق سايی:',
'prefs-help-recentchangescount' => 'بورایا یئنی دییشیک‌لیک‌لر، صحیÙه‌لرین Ùˆ ژورنال‌لارین تاریخچه‌سی داخیل‌دیر.',
-'prefs-help-watchlist-token' => 'بو ساحنی گیزلی پاروللا دولدورماغینیز سیزین ایزلمه سیاهینیز اوچون آراس‌اس یاییم کانا‌لی یارادا‌جاق‌دیر.
-بو پارولو بیلن هر کس ایزلمه سیاهینیزی اوخویا بیلر، بو سبب‌دن اعتبارلی پارول سئچین.
-تصادÙÛŒ یوللا سئچیلمیش بو پارول‌دان ایستیÙاده ائده بیلرسینیز: $1',
'savedprefs' => 'سئچیمینیز قئيد ائدیلدی.',
'timezonelegend' => 'چاغ بؤلگه‌سی:',
'localtime' => 'یئرلی چاغ:',
@@ -1225,7 +1242,6 @@ $1",
'prefs-reset-intro' => 'ترجیحلرینیزی سایتین ایلک Ùرض ائدیلنلرینه دؤندرمک اوچون، بو صحیÙه‌دن ایستیÙاده ائده بیلرسینیز.
بو ایش قایتاریلا بیلمز.',
'prefs-emailconfirm-label' => 'ایمیل دوغرولاماسی:',
-'prefs-textboxsize' => 'دَییشدیرمه قوتوسونون اؤلچو',
'youremail' => 'ایمیل:',
'username' => '{{GENDER:$1|ایستیÙاده‌چی آدی}}:',
'uid' => '{{GENDER:$1|ایستیÙاده‌چی}} ID:',
@@ -1260,6 +1276,8 @@ $1",
'prefs-dateformat' => 'تاریخ Ùورمتی',
'prefs-timeoffset' => 'ساعات قورشاغینین Ùرقی',
'prefs-advancedediting' => 'عمومی',
+'prefs-editor' => 'دَییشدیرن',
+'prefs-preview' => 'اؤن‌گؤستریش',
'prefs-advancedrc' => 'گلیشمیش سئچَنکلر',
'prefs-advancedrendering' => 'گلیشمیش سئچَنکلر',
'prefs-advancedsearchoptions' => 'گلیشمیش سئچَنکلر',
@@ -1294,6 +1312,8 @@ $1",
'userrights-notallowed' => 'سیزین ایستیÙاده‌چی حسابینیزا دیگر ایستیÙاده‌چی‌لره حقوق‌لار وئرمک Ùˆ یا آلماغا ایجازه وئریلمه‌ییب.',
'userrights-changeable-col' => 'ديَیشدیره بیلدیگینیز قروپلار',
'userrights-unchangeable-col' => 'ديَیشدیره بیلمه‌دیگینیز قروپلار',
+'userrights-conflict' => 'ایستیÙاده‌چی حاقلاری توققوشماسی! لوطÙاً دَییشدیرمه‌لرینیزی یئنی‌دن ائدین.',
+'userrights-removed-self' => 'سیز باشاریلیق‌لا اؤز حاق‌لارینیزی قالدیردینیز. اونا گؤره داها بو صحیÙه‌یه یول تاپماغا قادیر دئییل‌سینیز.',
# Groups
'group' => 'قروپ:',
@@ -1359,11 +1379,19 @@ $1",
'right-proxyunbannable' => 'پروکسیلرین اوتوماتیک باغلاماقلاریندان گئچ',
'right-unblockself' => 'اؤزلرینی آچسینلار',
'right-protect' => 'قوروماق سطحینی Ùˆ شلاله‌لی قورونموش صحیÙه‌لری دَییشدیر',
-'right-editprotected' => 'قورونموش صحیÙه‌لری (قورونماقلاری مونتشیر اولمایان) دَییشدیر',
+'right-editprotected' => '«{{int:protect-level-sysop}}» جوره قورونموش صحیÙه‌لری دَییشدیر',
+'right-editsemiprotected' => '«{{int:protect-level-autoconfirmed}}» جوره قورونموش صحیÙه‌لری دَییشدیر',
'right-editinterface' => 'ایستیÙاده‌چی آرا-اوزونو دَییشدیر',
'right-editusercssjs' => 'باشقا ایستیÙاده‌چیلرین سی‌اس‌اس Ùˆ جاوااسکریپت Ùایل‌لارینی دَییشدیر',
'right-editusercss' => 'باشقا ایستÙاده‌چیلرین سی‌اس‌اس Ùایل‌لارینی دَییشدیر',
'right-edituserjs' => 'باشقا ایستیÙاده‌چیلرین جاوااسکریپت Ùایل‌لارینی دَییشدیر',
+'right-editmyusercss' => 'اؤز ایستیÙاده‌چی CSS Ùایل‌لارینی دَییشدیر',
+'right-editmyuserjs' => 'اؤز ایستیÙاده‌چی جاوااسکریپت Ùایل‌لارینی دَییشدیر',
+'right-viewmywatchlist' => 'اؤز ایزله‌دیکلرینی گؤر',
+'right-editmywatchlist' => 'اؤز ایزله‌دیکلرینی دَییشدیر. دیقت ائدین بعضی ایشلر حتی بو حاقسیزلیق ایله ده صحیÙÙ‡ آرتیراجاقلار.',
+'right-viewmyprivateinfo' => 'اؤز گیزلی بیلگیلرینی گؤر (میثال اوچون ایمیل آدرسی، دوغرو آد)',
+'right-editmyprivateinfo' => 'اؤز گیزلی بیلگیلرینی دَییشدیر (میثال اوچون ایمیل آدرسی، دوغرو آد)',
+'right-editmyoptions' => 'اؤز ترجیحلرینی دَییشدیر',
'right-rollback' => 'بیر خاص صحیÙه‌نی سون دÙعه دَییشدیرن ایستیÙاده‌چینین دَییشیکلیکلرینی تئزلیکله قایتار',
'right-markbotedits' => 'قایتاریلان دَییشیکلیکلری، بوت دَییشیکلیگی اولاراق نیشانلا',
'right-noratelimit' => 'سورعت محدودیتلریندن گئچ',
@@ -1425,12 +1453,17 @@ $1",
'action-userrights-interwiki' => 'باشقا ویکیلرده‌کی ایستیÙاده‌چیلرین ایستیÙاده‌چی حاقلارینی دَییشدیر',
'action-siteadmin' => 'دیتابیسی Ù‚ÛŒÙیل‌لا یا Ù‚ÛŒÙیلینی Ø¢Ú†',
'action-sendemail' => 'ایمیل گؤندر',
+'action-editmywatchlist' => 'ایزله‌دیکلرینی دَییشدیر',
+'action-viewmywatchlist' => 'ایزله‌دیکلرینی گؤر',
+'action-viewmyprivateinfo' => 'گیزلی بیلگیلرینی گؤر',
+'action-editmyprivateinfo' => 'گیزلی بیلگیلرینی دَییشدیر',
# Recent changes
'nchanges' => '$1 {{PLURAL:$1|دَییشیکلیک}}',
'recentchanges' => 'سون دَییشیکلیکلر',
'recentchanges-legend' => 'سون دَییشیکلیکلر سئچمه‌لری',
'recentchanges-summary' => 'بو صحیÙه‌ده، بو ویکی‌ده وئریلن ان سون دَییشیکلیکلری ایزله‌یین.',
+'recentchanges-noresult' => 'وئریلمیش دؤنم‌ده، بو معیارلارا تطبیق اولان دَییشدیرمه یوخدور.',
'recentchanges-feed-description' => 'ویکی‌ده‌کی ان سون ديَیشیکلیک‌لری بو يايیم کانالیندان ایزله‌يین.',
'recentchanges-label-newpage' => 'بو دییشیک یئنی بیر صحیÙÙ‡ یاراتدی',
'recentchanges-label-minor' => 'بو بیر کیچیک دَییشدیرمه‌دیر',
@@ -1467,7 +1500,6 @@ $1",
'recentchangeslinked-feed' => 'ایلگیلی دَییشیکلیکلر',
'recentchangeslinked-toolbox' => 'ایلگیلی دَییشیکلیکلر',
'recentchangeslinked-title' => "''$1'' ایله ایلگی‌لی دییشیکلر",
-'recentchangeslinked-noresult' => 'قئيد اوْلونان دؤورده ایلگیلی صحیÙه‌‌لرده هئچ بیر ديَیشیکلیک يوْخدور.',
'recentchangeslinked-summary' => "آشاغیداکی سیياهی، قئيد اوْلونان صحیÙه‌‌يه (Ùˆ يا قئيد اوْلونان کاتئقوْرياداکی صحیÙه‌‌لره) داخیلی کئچید وئرن صحیÙه‌‌لرده ائدیلمیش سوْن ديَیشیکلیکلرین سیياهیسیدیر.
[[Special:Watchlist|ایزله‌مه سیياهینیزداکی]] صحیÙه‌‌لر '''قالین''' شریÙتله گؤستریلمیشدیر.",
'recentchangeslinked-page' => 'صحیÙÙ‡ آدی:',
@@ -1479,7 +1511,7 @@ $1",
'reuploaddesc' => 'يوکلئمئ Ùورمونا گئری دؤن.',
'upload-tryagain' => 'ديَشدیریلمیش Ùايل ایضاهینی گؤندر',
'uploadnologin' => 'گیریش ائتمه‌میسینیز',
-'uploadnologintext' => 'Ùايل يوکله‌مک اوچون [[Special:UserLogin|گیریش ائتمه‌میسینیز]].',
+'uploadnologintext' => 'Ùايل يوکله‌مک اوچون گرک $1.',
'upload_directory_missing' => '($1) یوکلمه قایداسی آختاریلیر و وئبسئروئرده یارادیلماسی قئیری-مومکون‌دور.',
'upload_directory_read_only' => '"$1" کاتالوقونون آرشیوی وئب-سئروئر یازی‌لاری اوچون باغلی‌دیر.',
'uploaderror' => 'یوکلمه خطاسی',
@@ -1699,7 +1731,6 @@ https://www.mediawiki.org/wiki/Manual:Image_Authorization صحیÙه‌‌سین
'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>
@@ -1857,12 +1888,6 @@ https://www.mediawiki.org/wiki/Manual:Image_Authorization صحیÙه‌‌سین
'statistics-users-active-desc' => 'سون {{PLURAL:$1|بیر|$1}} گون‌ده بیر ایش گؤرن ایستیÙاده‌چیلر',
'statistics-mostpopular' => 'ان چوخ گؤرونموش صحیÙه‌لر',
-'disambiguations' => 'آیدین‌لاشدیرما صحیÙه‌لرینه باغلانتیلاری اولان صحیÙه‌لر',
-'disambiguationspage' => 'Template:دقیقلشدیرمه',
-'disambiguations-text' => "آشاغیداکی صحیÙه‌لرده آزی بیر باغلانتی، '''بلیرلیندیمه صحیÙه‌لری'''نه واردیر.
-اولا بیلر اونلاری داها اویغون صحیÙه‌یه باغلاماق لازیم اولا.<br />
-بیر صحیÙه، بلیرلندیرمه صحیÙه‌سی کیمی اولار، اگر [[MediaWiki:Disambiguationspage]] صحیÙه‌سینه باغلانمیش بیر شابلون‌دان ایستیÙاده ائتسه.",
-
'pageswithprop' => 'صحیÙÙ‡ اؤزل‌لیگی اولان صحیÙه‌لر',
'pageswithprop-legend' => 'صحیÙÙ‡ اؤزل‌لیگی اولان صحیÙه‌لر',
'pageswithprop-text' => 'بو صحیÙه‌ده، بیر خاص صحیÙÙ‡ اؤزل‌لیگی ایشلدن صحیÙه‌لرین لیستی واردیر.',
@@ -2115,10 +2140,9 @@ https://www.mediawiki.org/wiki/Manual:Image_Authorization صحیÙه‌‌سین
'unwatchthispage' => 'صحیÙÙ‡ ایزلمیی دایان‌دیر',
'notanarticle' => 'مضمون صحیÙه‌سی دئییل',
'notvisiblerev' => 'باشقا ایستیÙادی‌چی‌نین سون دییشیک‌لیگی سیلینیب',
-'watchnochange' => 'گؤستریلن واخت‌دا هئچ بیر ایزله‌دیگینیز صحیÙÙ‡ دَییشدیریلمه‌ییبدیر.',
'watchlist-details' => 'دانیشیق صÙحه‌لرینی سایمایاراق، {{PLURAL:$1|$1 صÙحه‌نی}} ایزله‌ییرسینیز.',
-'wlheader-enotif' => '* ایمیل مکتوبلا بیلدیریش اولا بیلر.',
-'wlheader-showupdated' => "* سون گؤروشونوزدن سونرا ائدیلن دییشیکلیکلر '''قالین''' گؤستریلیبدیلر.",
+'wlheader-enotif' => 'ایمیل ایله بیلدیریش آچیلیب‌دیر.',
+'wlheader-showupdated' => "سون گؤروشونوزدن سونرا ائدیلن دییشیکلیکلر '''قالین''' گؤستریلیبدیلر.",
'watchmethod-recent' => 'یئنی دییشیک‌لیک‌لر ایزلنیلن صحیÙه‌لر اوچون یوخلانیلیر',
'watchmethod-list' => 'ایزلنیلن صحیÙه‌لر یئنی دییشیک‌لیک‌لر اوچون یوخلانیلیر',
'watchlistcontains' => 'ایزلمه سیاهینیزدا $1 {{PLURAL:$1|صحیÙÙ‡}} وار.',
@@ -2518,15 +2542,13 @@ $1 آدلی ایستیÙاده‌چی‌نین باغلانما سببی: "$2"',
آنجاق، بو عنوان $2 آرا‌لیغینین پارچاسی اولا‌راق مانعه تؤردیلمیش، دئکابر مانعه تؤرتمه‌سینی قال‌دیرا.',
'ip_range_invalid' => 'یانلیش ای پی',
'ip_range_toolarge' => '/ $1 بلوک‌دان داها بؤیوک بازه باغلانمالارینا ایجازه وئریلمیر.',
-'blockme' => 'منی باغلا',
'proxyblocker' => 'پروکسی باغلییان',
-'proxyblocker-disabled' => 'بو ایش باغلانیب دیر.',
'proxyblockreason' => 'ای پی آدرئسینیز آچیق بیر پروکسی اولدوغو اوچون مانعه تؤردیلدی.
خاهیش ائدیریک اینتئرنئت سئویش تعمین ایله یا دا تئکنیکی دستک ایله علاقه قورون و بو جدی تهلوکه‌سیزلیک پروبلئمین‌دن خبردار ائدین.',
-'proxyblocksuccess' => 'اولدو.',
'sorbsreason' => 'ای Ù¾ÛŒ عنوانینیز، {{SITENAME}} سایتی طرÙین‌دن ایستیÙاده ائدیلن DNSBL آچیق پروکسی اولا‌راق اولونموش.',
'sorbs_create_account_reason' => 'ایپ اونوانینیز {{SITENAME}} سایتی طرÙین‌دن ایستیÙاده ائدیلن DNSBL آچیق پروکسی اولا‌راق اولونموش.
حساب میدانا گتیره بیلمز',
+'xffblockreason' => 'X-Forwarded-For باشلیغیندا، سیزین یا بیر ایشلتدیگینیز پروکسی خیدمتچی‌نین بلوکلانمیش آی‌پی آدرسی وار. ایلکین بلوکلاما سببی: $1',
'cant-block-while-blocked' => 'سیز ائنگئللیيکئن باشقا ایستیÙاده‌چیلری مانعه تؤره‌ده بیلمزسینیز.',
'cant-see-hidden-user' => 'قارشیسینی آلماق ایسته‌دیگینیز ایستیÙاده‌چی اونسوز دا مانعه تؤره‌دیلمیش Ùˆ گیزلنمیش. کوللانیجیگیزلئ ایجازه‌نیز اولمادیغی اوچون، ایستیÙاده‌چی‌نین قارشیسی‌نین آلینماسینی گؤره بیلمز يا دا ديَیشدیره.',
'ipbblocked' => 'دیگر ایستیÙاده‌چیلری مانعه تؤره‌ده بیلمز يا دا مانعه تؤرتمه‌سینی قالدیرا بیلمز، چونکی اؤزونوز ائنگئللئنمیشسیز',
@@ -2685,6 +2707,8 @@ $1 آدلی ایستیÙاده‌چی‌نین باغلانما سببی: "$2"',
'thumbnail-more' => 'بؤیوت',
'filemissing' => 'Ùایل تاپیلمادی',
'thumbnail_error' => 'کیچیک شکیل یاراتما خطاسی: $1',
+'thumbnail_error_remote' => '$1 طرÙین‌دن خطا مئساژی:
+$2',
'djvu_page_error' => 'DjVu صحیÙه‌سی الچاتمازدیر',
'djvu_no_xml' => 'DjVu اوچون XML Ùایلی آلماق مومکون دئییل.',
'thumbnail-temp-create' => 'ائلمک اولماز بارماق اولچوسوجه موقت Ùایل دوزتمک اولا',
@@ -2906,9 +2930,6 @@ $1 آدلی ایستیÙاده‌چی‌نین باغلانما سببی: "$2"',
'pageinfo-category-subcats' => 'آلت‌بؤلمه‌لرین سایی',
'pageinfo-category-files' => 'Ùایل‌لارین سایی',
-# Skin names
-'skinname-myskin' => 'منیم قابیغیم',
-
# Patrolling
'markaspatrolleddiff' => 'ایداره ائدیلمیش اولا‌راق ایشاره‌له',
'markaspatrolledtext' => 'صحیÙÙ†ÛŒ پاتروللانمیش کیمی ایشاره‌له',
@@ -2984,11 +3005,25 @@ $1',
'minutes' => '{{PLURAL:$1|$1 دقیقه}}',
'hours' => '{{PLURAL:$1|$1 ساعت |$1 ساعت}}',
'days' => '{{PLURAL:$1|$1 گون |$1 گون}}',
+'weeks' => '{{PLURAL:$1|$1 Ù‡Ùته}}',
'months' => '{{PLURAL:$1|$1}} آی',
'years' => '{{PLURAL:$1|$1}} ایل',
'ago' => '$1 اؤنجه',
'just-now' => 'ایندی',
+# Human-readable timestamps
+'hours-ago' => '$1 {{PLURAL:$1|ساعات|اؤنجه}}',
+'minutes-ago' => '$1 {{PLURAL:$1|دقیقه}} اؤنجه',
+'seconds-ago' => '$1 {{PLURAL:$1|ثانیه}} اؤنجه',
+'monday-at' => 'دوشنبه، $1',
+'tuesday-at' => 'سه‌شنبه، $1',
+'wednesday-at' => 'چهارشنبه، $1',
+'thursday-at' => 'پنجشنبه، $1',
+'friday-at' => 'جومعه، $1',
+'saturday-at' => 'شنبه، $1',
+'sunday-at' => 'یکشنبه، $1',
+'yesterday-at' => 'دونن $1',
+
# Bad image list
'bad_image_list' => 'Ùورمت بئله اولمالیدیر:
@@ -3016,7 +3051,7 @@ $1',
* gpslongitude
* gpsaltitude',
-# EXIF tags
+# Exif tags
'exif-imagewidth' => 'گئنیش‌لیک',
'exif-imagelength' => 'اوزوناسی',
'exif-bitspersample' => 'هر جز دا نقطه',
@@ -3194,7 +3229,7 @@ $1',
'exif-originalimageheight' => 'شکیلین کسیلمه دن اوولکی اوجالیقی',
'exif-originalimagewidth' => 'شکیلین کسیلمه دن اوولکی گئنیش‌لیگی',
-# EXIF attributes
+# Exif attributes
'exif-compression-1' => 'سیخیلمامیش',
'exif-compression-2' => 'پسوورد قویماق سی‌سی‌آی‌تی‌تی Û³ گروه دا بیر بعدی هاÙمن روشی ایله اوزوناسی اوستونده دییشیلیب',
'exif-compression-3' => 'رمز قرار وئرمک سی‌سی‌آی‌تی‌تی قروپ ۳',
@@ -3584,7 +3619,6 @@ $5
'version-other' => 'آیری',
'version-mediahandlers' => 'مئدیا ایشلدنلری',
'version-hooks' => 'چنگل‌لر',
-'version-extension-functions' => 'علاوه‌‌ Ùوبکسیيالار',
'version-parser-extensiontags' => 'آیریشدیران گنیشلندیرمه اÙتیکÙتلری',
'version-parser-function-hooks' => 'آیریشدیران Ùونکسیا چنگل‌لری',
'version-hook-name' => 'چنگه‌لین آدی',
@@ -3606,12 +3640,17 @@ $5
'version-entrypoints-header-entrypoint' => 'گیریش نقطه‌‌سی',
'version-entrypoints-header-url' => 'اینترنت آدرسی',
-# Special:FilePath
-'filepath' => 'Ùايل يولو',
-'filepath-page' => 'Ùایل:',
-'filepath-submit' => 'گئت',
-'filepath-summary' => 'بو اؤزل صحیÙه‌‌ بیر Ùايل اوچون تام يولو گتیرر.
-شکیللر تام تصویرین گؤستریلیر، دیگر Ùايل نؤولری ایله باغلی پروقراملاری بیرباشا ایشه باشلايیر.',
+# Special:Redirect
+'redirect' => 'Ùایل، ایستیÙاده‌چی یا نوسخه ID-سی ایله یول‌لاندیرما',
+'redirect-legend' => 'بیر Ùایل یا صحیÙه‌یه یول‌لاندیرما',
+'redirect-summary' => 'بو اؤزل صحیÙه، بیر Ùایلا (Ùایل آدی ایله)ØŒ صحیÙه‌یه (نوسخه ID-سی ایله) یا ایستیÙاده‌چی صحیÙه‌سینه (ایستیÙاده‌چی نومره ID-سی ایله) یول‌لاندیریر.',
+'redirect-submit' => 'گئت',
+'redirect-lookup' => 'آختار:',
+'redirect-value' => 'دَگَر:',
+'redirect-user' => 'ایستیÙاده‌چی ID',
+'redirect-revision' => 'صحیÙÙ‡ نوسخه‌سی',
+'redirect-file' => 'Ùایل آدی',
+'redirect-not-exists' => 'دَگَر تاپیلمادی',
# Special:FileDuplicateSearch
'fileduplicatesearch' => 'دوبلیکات Ùايل آختاریشی',
@@ -3660,6 +3699,7 @@ $5
'tags' => 'مومکون دییشیک‌لیک ائتیکئت‌لری',
'tag-filter' => '[[Special:Tags|اÙتیکÙت]] سۆزگÙجی:',
'tag-filter-submit' => 'سۆزگَج',
+'tag-list-wrapper' => '([[Special:Tags|{{PLURAL:$1|اÙتیکÙت|اÙتیکÙتلر}}]]: $2)',
'tags-title' => 'یاپیشقان',
'tags-intro' => 'بو صحیÙه، یازیلیم دَییشدیرمه‌لری نیشانلایان اÙتیکÙتلری Ùˆ اونلارین آنلاملارینی گؤستریر.',
'tags-tag' => 'یاپیشقان آدی',
@@ -3701,6 +3741,9 @@ $5
'htmlform-submit' => 'گؤندر',
'htmlform-reset' => 'دَییشیکلیکلری قایتار',
'htmlform-selectorother-other' => 'باشقا',
+'htmlform-no' => 'یوخ',
+'htmlform-yes' => 'بلی',
+'htmlform-chosen-placeholder' => 'بیر سئچمه سئچین',
# SQLite database support
'sqlite-has-fts' => '$1 بوتون یازی آختارما دستگی‌له',
diff --git a/languages/messages/MessagesBa.php b/languages/messages/MessagesBa.php
index 075fca46..848a9b3f 100644
--- a/languages/messages/MessagesBa.php
+++ b/languages/messages/MessagesBa.php
@@ -7,6 +7,7 @@
* @ingroup Language
* @file
*
+ * @author AiseluRB
* @author Alfiya55
* @author Assele
* @author Comp1089
@@ -156,7 +157,7 @@ $messages = array(
'tog-newpageshidepatrolled' => 'Яңы биттәр иÑемлегендә тикшерелгән үҙгәртеүҙәрҙе йәшер',
'tog-extendwatchlist' => 'Барлыҡ үҙгәртеүҙәрҙе Ò¯Ò™ ÑÑенә алған, киңәйтелгән күҙәтеү иÑемлеге',
'tog-usenewrc' => 'Һуңғы төҙәтеүҙәр һәм күҙәтеү иÑемлегендәге үҙгәрештәрҙе төркөмдәргә бүлергә',
-'tog-numberheadings' => 'БашиÑемдәрҙе автоматик рәүештә номерландыр',
+'tog-numberheadings' => 'БашиÑемдәрҙе автоматик рәүештә номерлаe',
'tog-showtoolbar' => 'Мөхәррирләгән ваҡытта өҫкө ҡоралдар панелен күрһәтергә (JavaScript кәрәк)',
'tog-editondblclick' => 'Биттәрҙе ике Ñиртеү менән мөхәррирләргә',
'tog-editsection' => 'Һәр бүлек Ó©Ñөн «үҙгәртеү» һылтанмаһын күрһәтергә',
@@ -178,9 +179,6 @@ $messages = array(
'tog-shownumberswatching' => 'Битте күҙәтеү иÑемлегенә өҫтәгән ҡулланыуÑылар һанын күрһәтергә',
'tog-oldsig' => 'Хәҙерге имза:',
'tog-fancysig' => 'Имзаның үҙ вики-тамғаһы (автоматик һылтанмаһыҙ)',
-'tog-externaleditor' => 'МахÑÑƒÑ Ð±Ð¸Ð»Ð´Ó™Ð»Ó™Ð½Ð¼Ó™Ò»Ó™, тышҡы мөхәррирләүÑе ҡулланырға (белгеÑтәр Ó©Ñөн генә, компьютер махÑÑƒÑ ÐºÓ©Ð¹Ð»Ó™Ð½Ð³Ó™Ð½ булырға тейеш)',
-'tog-externaldiff' => 'МахÑÑƒÑ Ð±Ð¸Ð»Ð´Ó™Ð»Ó™Ð½Ð¼Ó™Ò»Ó™, верÑиÑларҙы Ñағыштырыу Ó©Ñөн тышҡы программа ҡулланырға (белгеÑтәр Ó©Ñөн генә, компьютер махÑÑƒÑ ÐºÓ©Ð¹Ð»Ó™Ð½Ð³Ó™Ð½ булырға тейеш)',
-'tog-showjumplinks' => '«КүÑ» ÑрҙамÑÑ‹ һылтанмалары аÑылһын',
'tog-uselivepreview' => 'Тиҙ ҡарап алыуҙы ҡулланырға (JavaScript, ÑкÑперименталь)',
'tog-forceeditsummary' => 'Төҙәтеүҙе таÑуирлау юлы тултырылмаһа, мине киҫәт',
'tog-watchlisthideown' => 'Үҙгәртеүҙеремде күҙәтеү иÑемлегенән йәшерергә',
@@ -193,6 +191,8 @@ $messages = array(
'tog-diffonly' => 'ВерÑÐ¸Ñ Ñағыштырыу аҫтында бит ÑÑтәлеге күрһәтелмәһен',
'tog-showhiddencats' => 'Йәшерен категориÑларҙы күрһәтергә',
'tog-norollbackdiff' => 'Кире ҡайтарыуҙан һуң верÑÐ¸Ñ Ð°Ð¹Ñ‹Ñ€Ð¼Ð°Ð»Ð°Ñ€Ñ‹ күрһәтелмәһен',
+'tog-useeditwarning' => 'Мөхәррирләү битенән үҙгәртеүҙәрҙе һаҡламайынÑа Ñыҡҡан ваҡытта мине киҫәтергә',
+'tog-prefershttps' => 'СиÑтемаға танытылғандан һуң һәр ваҡыт һаҡланыулы тоташыу ҡулланырға',
'underline-always' => 'Һәр ваҡыт',
'underline-never' => 'Бер ҡаÑан да',
@@ -256,6 +256,18 @@ $messages = array(
'oct' => 'окт',
'nov' => 'ноÑ',
'dec' => 'дек',
+'january-date' => 'Ғинуар $1',
+'february-date' => 'Февраль $1',
+'march-date' => 'Март $1',
+'april-date' => 'Ðпрель $1',
+'may-date' => 'Май $1',
+'june-date' => 'Июнь $1',
+'july-date' => 'Июль $1',
+'august-date' => 'ÐвгуÑÑ‚ $1',
+'september-date' => 'СентÑбрь $1',
+'october-date' => 'ОктÑбрь $1',
+'november-date' => 'ÐоÑбрь $1',
+'december-date' => 'СентÑбрь $1',
# Categories related messages
'pagecategories' => '{{PLURAL:$1|КатегориÑ|КатегориÑ}}',
@@ -337,6 +349,7 @@ $messages = array(
'create-this-page' => 'Был битте Ñһарға',
'delete' => 'Юҡ итергә',
'deletethispage' => 'Был битте юйырға',
+'undeletethispage' => 'Юйылған был битте ҡабат тергеҙеү',
'undelete_short' => '$1 {{PLURAL:$1|үҙгәртеүҙе}} тергеҙергә',
'viewdeleted_short' => '{{PLURAL:$1|1 юйылған үҙгәртеүҙе|$1 юйылған үҙгәртеүҙе}} ҡарау',
'protect' => 'Һаҡларға',
@@ -380,7 +393,7 @@ $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).
+# 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).
'aboutsite' => '{{SITENAME}} тураһында',
'aboutpage' => 'Project:ТаÑуирлама',
'copyright' => '$1 лицензиÑһына Ñрашлы, ÑÑтәлеге менән һәр кем файҙалана ала (башҡаһы күрһәтелмәһә)',
@@ -390,7 +403,6 @@ $1',
'disclaimers' => 'Яуаплылыҡтан баш тартыу',
'disclaimerpage' => 'Project:Яуаплылыҡтан баш тартыу',
'edithelp' => 'Төҙәтеү белешмәһе',
-'edithelppage' => 'Help:Төҙәтеү белешмәһе',
'helppage' => 'Help:Белешмә',
'mainpage' => 'Баш бит',
'mainpage-description' => 'Баш бит',
@@ -468,17 +480,12 @@ $1',
# General errors
'error' => 'Хата',
'databaseerror' => 'Мәғлүмәттәр базаһы хатаһы',
-'dberrortext' => 'Мәғлүмәттәр базаһына ебәрелгән һорауҙа ÑинтакÑÐ¸Ñ Ñ…Ð°Ñ‚Ð°Ò»Ñ‹ табылды.
-Был программала хата булыу мөмкинлеген күрһәтә.
-Мәғлүмәттәр базаһына ебәрелгән һуңғы һорау:
-<blockquote><tt>$1</tt></blockquote>
-<tt>«$2»</tt> функциÑһынан.
-База <tt>«$3: $4»</tt> хатаһын кире ҡайтарҙы.',
-'dberrortextcl' => 'Мәғлүмәттәр базаһына ебәрелгән һорауҙа ÑинтакÑÐ¸Ñ Ñ…Ð°Ñ‚Ð°Ò»Ñ‹ табылды.
-Мәғлүмәттәр базаһына ебәрелгән һуңғы һорау:
-$1
-«$2» функциÑһынан килә.
-База «$3: $4» хатаһын кире ҡайтарҙы.',
+'databaseerror-text' => 'Бирелмәләр базаһында хата киткән.
+Был программа тәьминәтендә хата барлығы күрһәткеÑе булырға мөмкин.',
+'databaseerror-textcl' => 'Бирелмәләр базаһында хата бар.',
+'databaseerror-query' => 'Һоратыу: $1',
+'databaseerror-function' => 'ФункциÑ:$1',
+'databaseerror-error' => 'Хата: $1',
'laggedslavemode' => "'''Иғтибар:''' биттә һуңғы үҙгәртеүҙәр күрһәтелмәгән булырға мөмкин.",
'readonly' => 'Мәғлүмәттәр базаһы бикләнгән',
'enterlockreason' => 'Ябылыу Ñәбәбен һәм ваҡытын белдерегеҙ.',
@@ -513,6 +520,7 @@ $1',
'cannotdelete-title' => '"$1" битен юйып булмай',
'delete-hook-aborted' => 'Үҙгәртеүҙе махÑуÑ-процедура кире ҡаҡты.
Өҫтәмә аңлатма килтерелмәй.',
+'no-null-revision' => '«$1» бите Ó©Ñөн Ñңы нулле төҙәтеү Ñһап булманы',
'badtitle' => 'Ярамаған иÑем',
'badtitletext' => 'Биттең һоратылған иÑеме дөрөҫ түгел, буш йәки телдәр араһы йәки интервики иÑеме Ñңылыш күрһәтелгән. ИÑемдә тыйылған Ñимволдар булыуы ла мөмкин.',
'perfcached' => 'Был мәғлүмәттәр кÑштан алынған, уларҙа һуңғы үҙгәртеүҙәр булмаҫҡа мөмкин. КÑшта иң күбе {{PLURAL:$1|Ñзма}} һаҡлана.',
@@ -534,12 +542,15 @@ $1',
'editinginterface' => "'''Иғтибар.''' Һеҙ программаның арайөҙ текÑÑ‚Ñ‹ булған битте мөхәррирләйһегеҙ.
Уны үҙгәртеү, башҡа ҡулланыуÑыларҙын арайөҙ күренешен үҙгәртәÑәктер.
Тәржемә Ó©Ñөн [//translatewiki.net/wiki/Main_Page?setlang=ba translatewiki.net] адреÑын, MediaWiki-ны локалләштереү проектын ҡулланыу Ñҡшыраҡ булаÑаҡтыр.",
-'sqlhidden' => '(SQL-һорау йәшерелгән)',
'cascadeprotected' => 'Был бит үҙгәртеүҙәрҙән һаҡланған, Ñөнки ул Ñҙмә-Ñҙлекле һаҡлау ҡуйылған {{PLURAL:$1|биткә|биттәргә}} керә:
$2',
'namespaceprotected' => '«$1» иÑем арауығындағы биттәрҙе мөхәррирләү Ó©Ñөн хоҡуҡтарығыҙ ÑŽÒ¡.',
'customcssprotected' => 'Был CSS-битте үҙгәртеү хоҡуғығыҙ ÑŽÒ¡, Ñөнки унда башҡа ҡулланыуÑының шәхÑи көйләүҙәре бар.',
'customjsprotected' => 'Был JavaScript-битте үҙгәртеү хоҡуғығыҙ ÑŽÒ¡, Ñөнки унда башҡа ҡулланыуÑының шәхÑи көйләүҙәре бар.',
+'mycustomcssprotected' => 'Биттең был CSS-ын мөхәррирләргә хоҡуғығыҙ юҡ.',
+'mycustomjsprotected' => 'Был биттәге JavaScript-ты мөхәррирләргә хоҡуғығыҙ юҡ.',
+'myprivateinfoprotected' => 'Һеҙгә шәхÑи мәғлүмәттәрегеҙҙе үҙгәртергә Ñ€Ó©Ñ…Ñәт ÑŽÒ¡',
+'mypreferencesprotected' => 'Һеҙҙең көйләүҙәрегеҙҙе мөхәррирләргә хоҡуғығыҙ юҡ.',
'ns-specialprotected' => '«{{ns:special}}» иÑем арауығындағы биттәрҙе үҙгәртеп булмай.',
'titleprotected' => "Был иÑем менән бит Ñһау [[User:$1|$1]] тарафынан тыйылған.
Белдерелгән Ñәбәп: ''$2''.",
@@ -564,10 +575,19 @@ $2',
'welcomecreation-msg' => 'Иҫәп Ñҙыуығыҙ Ñһалды.
ШәхÑи [[Special:Preferences|{{SITENAME}} көйләүҙәрен]] үҙегеҙгә уңайлы итеп үҙгәртергә онотмағыҙ.',
'yourname' => 'ҠатнашыуÑÑ‹ иÑеме',
+'userlogin-yourname' => 'ҠулланыуÑÑ‹ иÑеме',
+'userlogin-yourname-ph' => 'Иҫәп Ñҙмағыҙҙың иÑемен Ñҙығыҙ',
+'createacct-another-username-ph' => 'Иҫәп Ñҙмағыҙҙың иÑемен Ñҙығыҙ',
'yourpassword' => 'Серһүҙ',
+'userlogin-yourpassword' => 'Серһүҙ',
+'userlogin-yourpassword-ph' => 'Яңы Ñерһүҙҙе Ñҙығыҙ',
+'createacct-yourpassword-ph' => 'Серһүҙҙе Ñҙығыҙ',
'yourpasswordagain' => 'Серһүҙҙе ҡабаттан Ñҙыу',
+'createacct-yourpasswordagain' => 'Серһүҙҙе раҫлағыҙ',
+'createacct-yourpasswordagain-ph' => 'Серһүҙҙе тағы бер тапҡыр Ñҙығыҙ',
'remembermypassword' => 'Был браузерҙа (иң күбендә $1 {{PLURAL:$1|көнгә}}) иҫәп Ñҙыуым хәтерләнһен',
-'securelogin-stick-https' => 'Танылғандан һуң HTTPS менән бәйләнеште ҡалдырырға',
+'userlogin-remembermypassword' => 'СиÑтемала ҡалырға',
+'userlogin-signwithsecure' => 'Һаҡланыулы тоташыу',
'yourdomainname' => 'Һеҙҙең домен',
'password-change-forbidden' => 'Был викила Ñерһүҙегеҙҙе үҙгәртә алмайһығыҙ.',
'externaldberror' => 'Тышҡы мәғлүмәт базаһы менән танылғанда хата барлыҡҡа килде йәки тышҡы Ò¯Ò™ көйләүҙәрегеҙҙе үҙгәртер Ó©Ñөн хоҡуҡтарығыҙ етәрле түгел.',
@@ -579,18 +599,43 @@ $2',
'logout' => 'Тамамлау',
'userlogout' => 'Тамамлау',
'notloggedin' => 'Танылмағанһығыҙ',
+'userlogin-noaccount' => 'Иҫәп Ñҙмағыҙ юҡмы?',
+'userlogin-joinproject' => 'Проектҡа ҡушылырға',
'nologin' => "Һеҙ теркәлмәгәнһегеҙме әле? '''$1'''.",
'nologinlink' => 'Иҫәп Ñҙыуын булдырырға',
'createaccount' => 'Яңы ҡатнашыуÑыны теркәү',
'gotaccount' => "Әгәр Һеҙ теркәлеү үткән булһағыҙ? '''$1'''.",
'gotaccountlink' => 'Үҙегеҙ менән таныштырығыҙ',
'userlogin-resetlink' => 'Танылыу мәғлүмәттәрен оноттоғоҙмо?',
+'userlogin-resetpassword-link' => 'Серһүҙҙе ҡабул итмәү',
+'helplogin-url' => 'Help:СиÑтемаға танылыу',
+'userlogin-helplink' => '[[{{MediaWiki:helplogin-url}}|Help with logging in]]СиÑтемаға инеүҙә Ñрҙам',
+'userlogin-loggedin' => ' Һеҙ {{GENDER:$1|$1}} булараҡ индегеҙ инде. Башҡа файҙаланыуÑÑ‹ булып инер Ó©Ñөн аҫтағы ҡалыпты ҡулланығыҙ.',
+'userlogin-createanother' => 'Башҡа иҫәп Ñҙмаһын булдырырға',
+'createacct-join' => 'Ðҫта мәғлүмәттәрегеҙҙе Ñҙығыҙ.',
+'createacct-another-join' => 'Ðҫта Ñңы иҫәп Ñҙмағыҙҙың мәғлүмәттәрен Ñҙығыҙ.',
+'createacct-emailrequired' => 'Электрон почта адреÑÑ‹',
+'createacct-emailoptional' => 'Электрон почта адреÑÑ‹ (мотлаҡ түгел)',
+'createacct-email-ph' => 'Электрон почта адреÑығыҙҙы Ñҙығыҙ',
+'createacct-another-email-ph' => 'Электрон почта адреÑығыҙҙы Ñҙығыҙ',
'createaccountmail' => 'ОÑраҡлы рәүештә хаÑил ителгән ваҡытлыÑа Ñерһүҙҙе файҙаланырға һәм уны миңә ошо Ñлектрон почтаһы адреÑына ебәрергә',
+'createacct-realname' => 'ЫÑын иÑемегеҙ (мотлаҡ түгел)',
'createaccountreason' => 'Сәбәп:',
+'createacct-reason' => 'Сәбәп',
+'createacct-reason-ph' => 'ИкенÑе иҫәп Ñҙмаһы һеҙгә ни Ó©Ñөн кәрәк?',
+'createacct-captcha' => 'Һаҡлылыҡты тикшереү',
+'createacct-imgcaptcha-ph' => 'Өҫтәге текÑÑ‚Ñ‹ индерегеҙ',
+'createacct-submit' => 'Иҫәп Ñҙмаһын булдырырға',
+'createacct-another-submit' => 'Тағы бер иҫәп Ñҙмаһын булдырырға',
+'createacct-benefit-heading' => '{{SITENAME}} һеҙҙең кеүек үк кешеләр тарафынан булдырылған',
+'createacct-benefit-body1' => '{{PLURAL:$1|үҙгәртеү}}',
+'createacct-benefit-body2' => '{{PLURAL:$1|мәҡәлә|мәҡәлә|мәҡәләнең}}',
+'createacct-benefit-body3' => 'һуңғы ваҡытта {{PLURAL:$1|ҡатнашыуÑÑ‹|}}',
'badretype' => 'Һеҙ кереткән Ñерһүҙҙәр тап килмәй.',
'userexists' => 'Керетелгән иÑем ҡулланыла инде.
Зинһар, башҡа иÑем һайлағыҙ.',
'loginerror' => 'Танылыу хатаһы',
+'createacct-error' => 'Иҫәп Ñҙмаһын булдырғандағы хата',
'createaccounterror' => 'Иҫәп Ñҙыуын Ñһап булмай: $1',
'nocookiesnew' => 'Иҫәп Ñҙыуы Ñһалды, ләкин һеҙ танылмағанһығыҙ. {{SITENAME}} ҡатнашыуÑыны таныу Ó©Ñөн «cookies» ҡуллана. Һеҙҙә «cookies» тыйылған. Зинһар, уларға Ñ€Ó©Ñ…Ñәт бирегеҙ, шунан Ñңынан ҡатнашыуÑÑ‹ иÑеме һәм Ñерһүҙ менән танылығыҙ.',
'nocookieslogin' => '{{SITENAME}} ҡатнашыуÑыны таныу Ó©Ñөн «cookies» ҡуллана. Һеҙҙә «cookies» тыйылған. Зинһар, уға Ñ€Ó©Ñ…Ñәт бирегеҙ һәм Ñңынан керегеҙ.',
@@ -641,11 +686,13 @@ $2',
Иҫәп Ñҙыуы Ñңылыш Ñһалһа, был хатҡа иғтибар итмәгеҙ.',
'usernamehasherror' => 'ҠулланыуÑÑ‹ иÑемендә "#" Ñимволы була алмай',
-'login-throttled' => 'Һеҙ ÑиÑтемала артыҡ күп танылырға тырыштығыҙ.
-Зинһар, ҡабатламаҫтан алда бераҙ көтөгөҙ.',
+'login-throttled' => 'Һеҙ ÑиÑтемаға ҡат-ҡат танылырға тырыштығыҙ.
+Тағы бер танылырҙан алда, зинһар, $1 көтөгөҙ.',
'login-abort-generic' => 'Танылыу уңышһыҙ тамамланды',
'loginlanguagelabel' => 'Тел: $1',
'suspicious-userlogout' => 'Һеҙҙең ÑеанÑÑ‚Ñ‹ тамамлау тураһында һорауығыҙ кире ҡағылды, Ñөнки ул төҙөк булмаған браузер йәки кÑшлауÑÑ‹ прокÑи тарафынан ебәрелгән һорауға оҡшаған.',
+'createacct-another-realname-tip' => 'ЫÑын иÑемегеҙ (мотлаҡ түгел).
+Уны Ñҙып ҡуйһағыҙ, ул биткә кем төҙәтеү индергәнен күрһәтеү Ó©Ñөн ҡулланылаÑаҡ.',
# Email sending
'php-mail-error-unknown' => 'PHP-ның mail() функциÑһында билдәһеҙ хата',
@@ -660,8 +707,7 @@ $2',
'newpassword' => 'Яңы Ñерһүҙ:',
'retypenew' => 'Серһүҙҙе Ñңынан керетегеҙ:',
'resetpass_submit' => 'Серһүҙ ҡуйырға һәм танышырға',
-'resetpass_success' => 'Серһүҙегеҙ уңышлы үҙгәртелде!
-СиÑтемаға инеү башҡарыла...',
+'changepassword-success' => 'Серһүҙегеҙ уңышлы үҙгәртелде!',
'resetpass_forbidden' => 'Серһүҙҙе үҙгәртеп булмай',
'resetpass-no-info' => 'Был битте туранан ҡарау Ó©Ñөн һеҙгә ÑиÑтемала танылырға кәрәк.',
'resetpass-submit-loggedin' => 'Серһүҙҙе үҙгәртергә',
@@ -673,10 +719,11 @@ $2',
# Special:PasswordReset
'passwordreset' => 'Серһүҙҙе ташлатыу',
-'passwordreset-text' => 'Серһүҙегеҙҙе ташлау Ó©Ñөн, ошо ҡалыпты тултырығыҙ.',
+'passwordreset-text-one' => 'Серһүҙегеҙҙе ташлар Ó©Ñөн ош ҡалыпты тултырығыҙ.',
+'passwordreset-text-many' => '{{PLURAL:$1|Серһүҙҙе ташлар Ó©Ñөн Ñландарҙың береһен тултырығыҙ.}}',
'passwordreset-legend' => 'Серһүҙҙе ташлатыу',
'passwordreset-disabled' => 'Был викила Ñерһүҙҙе ташлатыу ғәмәлдә түгел',
-'passwordreset-pretext' => '{{PLURAL:$1||аҫта күрһәтелгән мәғлүмәттәрҙең бер киҫәген керетегеҙ}}',
+'passwordreset-emaildisabled' => 'Был викиҙа Ñлектрон почта функциÑһы һүндерелгән.',
'passwordreset-username' => 'ҠулланыуÑÑ‹ иÑеме:',
'passwordreset-domain' => 'Домен:',
'passwordreset-capture' => 'Хәбәрҙең һуңғы хәлен ҡарарғамы?',
@@ -702,7 +749,7 @@ $2
ВаҡытлыÑа Ñерһүҙ: $2',
'passwordreset-emailsent' => 'Серһүҙҙе ташлау тураһындағы мәғлүмәт менән Ñлектрон почта аша хат ебәрелде.',
'passwordreset-emailsent-capture' => 'Серһүҙҙе ташлау тураһындағы мәғлүмәт менән Ñлектрон хат ебәрелде, уның текÑÑ‹ түбәндә бирелә:',
-'passwordreset-emailerror-capture' => 'Килеп Ñыҡҡан хәтерләтеү хәбәре түбәндә күрһәтелгән, тик уны ебәреү уңышһыҙ тамамланды. Сәбәбе:$1',
+'passwordreset-emailerror-capture' => 'Серһүҙҙе ташлау тураһында хәбәр итеүÑе Ñлектрон хат булдырылғайны, ләкин уны {{GENDER:$2|kullanıcıya}} түбәндәге Ñәбәп арҡаһында ебәреп булманы: $1',
# Special:ChangeEmail
'changeemail' => 'Электрон почта адреÑын үҙгәртергә',
@@ -716,6 +763,19 @@ $2
'changeemail-submit' => 'ÐдреÑÑ‚Ñ‹ үҙгәртергә',
'changeemail-cancel' => 'Кире алырға',
+# Special:ResetTokens
+'resettokens' => 'Токендарҙы ташларға',
+'resettokens-text' => 'Иҫәп Ñҙмағыҙ менән бәйләнгән ҡайһы бер шәхÑи мәғлүмәттәрегеҙгә инеүгә юл аÑыуÑÑ‹ токендарҙы ташлай алаһығыҙ.
+
+Яңылыштан уларҙы берәйһе менән уртаҡлашҡан йәки аккаунтығыҙ ваттырылған оÑраҡта быны Ñшләү мотлаҡ.',
+'resettokens-no-tokens' => 'Ташлар Ó©Ñөн токендар ÑŽÒ¡.',
+'resettokens-legend' => 'Токендарҙы ташларға',
+'resettokens-tokens' => 'Токендар:',
+'resettokens-token-label' => '$1 (ағымдағы мәғәнә: $2)',
+'resettokens-watchlist-token' => ' [[Special:Watchlist|күҙәтеүҙәрегеҙ иÑемлегендә биттәрҙең үҙгәрештәре]] веб-каналы Ó©Ñөн токен(Atom/RSS)',
+'resettokens-done' => 'Токендар ташланды.',
+'resettokens-resetbutton' => 'Һайланған токендарҙы ташларға',
+
# Edit page toolbar
'bold_sample' => 'Ҡалын Ñҙылыш',
'bold_tip' => 'Ҡалын Ñҙылыш',
@@ -910,12 +970,15 @@ $2
Бәлки ул юйылғандыр.',
'edit-conflict' => 'Төҙәтеүҙәр конфликты',
'edit-no-change' => 'ТекÑта үҙгәртеүҙер булмау Ñәбәпле үҙгәртеүегеҙгә иғтибар ителмәне.',
+'postedit-confirmation' => 'Үҙгәртеүегеҙ һаҡланды.',
'edit-already-exists' => 'Яңы бит Ñһап булмай.
Ул былай ҙа бар.',
'defaultmessagetext' => 'Ðлдан билдәләнгән Ñҙма',
'content-failed-to-parse' => '$2 ÑÑтәлеге $1 төрөнә тура килмәй: $3.',
'invalid-content-data' => 'Ярамаған мәғлүмәт',
'content-not-allowed-here' => '"$1" ÑÑтәлеге [[$2]] бит Ó©Ñөн Ñрамай',
+'editwarning-warning' => 'ИкенÑе биткә күÑеү һеҙ индергән үҙгәрештәрҙең юғалыуына килтереүе мөмкин.
+Әгәр ÑиÑтемала танылыу үтһәгеҙ, көйләүҙәрегеҙ битенең "Мөхәррирләү" бүлегендә был киҫәтеүҙе һүндерә алаһығыҙ.',
# Content models
'content-model-wikitext' => 'викиÑҙма',
@@ -950,6 +1013,7 @@ $2
'undo-failure' => 'Ðра үҙгәртеүҙәр тура килмәү Ñәбәпле төҙәтеүҙе кире алып булмай.',
'undo-norev' => 'Үҙгәртеүҙе кире алып булмай, Ñөнки ÑŽÒ¡ йәки юйылған.',
'undo-summary' => '[[Special:Contributions/$2|$2]] ҡулланыуÑыһының ([[User talk:$2|фекер алышыу]]) $1 үҙгәртеүенән баш тартыу',
+'undo-summary-username-hidden' => 'ИÑеме йәшерелгән ҡатнашыуÑының төҙәтеүен $1 кире ҡағыу',
# Account creation failure
'cantcreateaccounttitle' => 'Иҫәп Ñҙыуын Ñһап булмай',
@@ -1129,6 +1193,7 @@ $1",
'compareselectedversions' => 'Һайланған верÑиÑларҙы Ñағыштырыу',
'showhideselectedversions' => 'Һайланған верÑиÑларҙы күрһәтергә/йәшерергә',
'editundo' => 'кире алыу',
+'diff-empty' => '(айырмалар юҡ)',
'diff-multi' => '({{PLURAL:$2|$2 ҡатнашыуÑының}} {{PLURAL:$1|ваҡытлы верÑиÑһы}} күрһәтелмәгән)',
'diff-multi-manyusers' => '(Кәмендә {{PLURAL:$2|$2 ҡатнашыуÑының}} {{PLURAL:$1|ваҡытлы верÑиÑһы}} күрһәтелмәгән)',
'difference-missing-revision' => '$1 айырмаһының {{PLURAL:$2|бер өлгөһө|$2 өлгөһө}} табылманы.
@@ -1156,7 +1221,6 @@ $1",
'searchmenu-legend' => 'Эҙләү көйләүҙәре',
'searchmenu-exists' => "'''Был вики-проектта «[[:$1]]» бите бар'''",
'searchmenu-new' => "'''Был википроектта \"[[:\$1]]\" бите булдырырға.'''",
-'searchhelp-url' => 'Help:ЭÑтәлек',
'searchmenu-prefix' => '[[Special:PrefixIndex/$1|Был префикÑлы биттәрҙе күрһәтергә]]',
'searchprofile-articles' => 'ЭÑтәлек биттәре',
'searchprofile-project' => 'ЯрҙамÑÑ‹ һәм проект биттәре',
@@ -1199,15 +1263,7 @@ $1",
'searchdisabled' => '{{SITENAME}} Ñҙләүе Ñбыҡ.
Хәҙергә Ñҙләүҙе Google менән үтәй алаһығыҙ.
Тик унда {{SITENAME}} Ó©Ñөн индекÑлауҙың иҫке булыуы мөмкинлеген онотмағыҙ.',
-
-# Quickbar
-'qbsettings' => 'Тиҙ күÑеү',
-'qbsettings-none' => 'ÒºÐ¸Ñ Ð±ÐµÑ€Ðµ',
-'qbsettings-fixedleft' => 'Һулда нығытылған',
-'qbsettings-fixedright' => 'Уңда нығытылған',
-'qbsettings-floatingleft' => 'Һулда күÑеүÑе',
-'qbsettings-floatingright' => 'Уңда күÑеүÑе',
-'qbsettings-directionality' => 'Беркетелгән, телегеҙҙең Ñҙыу йүнәлешенә бәйле',
+'search-error' => 'Эҙләүҙә хата китте: $1',
# Preferences page
'preferences' => 'Көйләүҙәр',
@@ -1241,7 +1297,6 @@ $1",
'resetprefs' => 'Һаҡланмаған үҙгәрештерҙе таҙартырға',
'restoreprefs' => 'Ðлдан ҡуйылған көйләүҙәрҙе тергеҙергә',
'prefs-editing' => 'Мөхәррирләү',
-'prefs-edit-boxsize' => 'Мөхәррирләү бите дәүмәле',
'rows' => 'Юлдар:',
'columns' => 'Бағаналар:',
'searchresultshead' => 'Эҙләү',
@@ -1252,9 +1307,8 @@ $1",
'recentchangesdays-max' => 'Иң күбендә $1 {{PLURAL:$1|көн}}',
'recentchangescount' => 'Ғәҙәттә күрһәтелгән үҙгәртеүҙәр һаны:',
'prefs-help-recentchangescount' => 'Һуңғы үҙгәртеүҙәрҙе, биттәр тарихын, журналдарҙы Ò¯Ò™ ÑÑенә ала.',
-'prefs-help-watchlist-token' => 'Был юлды Ñерле аÑÒ¡Ñ‹Ñ Ð¼ÐµÐ½Ó™Ð½ тултырыу, күҙәтеү иÑемлегегеҙ Ó©Ñөн RSS-таҫма ÑһаÑÑаҡ.
-Был юлдағы аÑÒ¡Ñ‹ÑÑ‚Ñ‹ белгән һәр кем, күҙәтеү иÑемлегегеҙҙе уҡый алаÑаҡ, шуның Ó©Ñөн ышаныÑлы ҡиммәт һайлағыҙ.
-ОÑраҡлы рәүештә һайланған ҡиммәтте лә ҡуллана алаһығыҙ: $1',
+'prefs-help-watchlist-token2' => 'Был - күҙәтеүҙәрегеҙ иÑемлегенең веб-каналы Ó©Ñөн йәшерен аÑÒ¡Ñ‹Ñ.
+Уны белеүÑеләр күҙәтеүҙәрегеҙ иÑемлеген уҡый алаÑаҡ, шуға уны бер кемгә лә әйтмәгеҙ. [[Special:ResetTokens|Уны ташларға теләһәгеҙ, ошонда баҫығыҙ]].',
'savedprefs' => 'Һеҙҙең көйләүҙәрегеҙ һаҡланды.',
'timezonelegend' => 'Ваҡыт бүлкәте:',
'localtime' => 'Урындағы ваҡыт:',
@@ -1285,7 +1339,6 @@ $1",
'prefs-reset-intro' => 'Был битте, көйләүҙәрегеҙҙе ғәҙәттәге көйләүҙәргә ташлатыу Ó©Ñөн ҡулланып була.
Раҫлағандан һуң ғәмәлде кире ҡайтарып булмаÑÑаҡ.',
'prefs-emailconfirm-label' => 'Электрон почтаны раҫлау:',
-'prefs-textboxsize' => 'Мөхәррирләү тәҙрәһе дәүмәле',
'youremail' => 'Электрон почта *',
'username' => '{{GENDER:$1|ҠулланыуÑÑ‹ иÑеме}}:',
'uid' => '{{GENDER:$1|ҠатнашыуÑÑ‹}} номеры:',
@@ -1320,6 +1373,8 @@ $1",
'prefs-dateformat' => 'Ваҡыт форматы',
'prefs-timeoffset' => 'Ваҡыт күÑереү:',
'prefs-advancedediting' => 'Дөйөм көйләүҙәр',
+'prefs-editor' => 'мөхәррир',
+'prefs-preview' => 'алдан байҡау',
'prefs-advancedrc' => 'Киңәйтелгән көйләүҙәр',
'prefs-advancedrendering' => 'Киңәйтелгән көйләүҙәр',
'prefs-advancedsearchoptions' => 'Киңәйтелгән көйләүҙәр',
@@ -1328,6 +1383,7 @@ $1",
'prefs-displaysearchoptions' => 'Күренеш көйләүҙәре',
'prefs-displaywatchlist' => 'Күренеш көйләүҙәре',
'prefs-diffs' => 'Ðйырмалар',
+'prefs-help-prefershttps' => 'Был көйләү ÑиÑтемаға киләһе танылыуҙан һуң ҡулланылаÑаҡ.',
# User preference: email validation using jQuery
'email-address-validity-valid' => 'E-mail Ð°Ð´Ñ€ÐµÑ Ð´Ó©Ñ€Ó©Ò« булғанға оҡшаған',
@@ -1354,6 +1410,8 @@ $1",
'userrights-notallowed' => 'Һеҙгә ҡатнашыуÑыларҙың хоҡуҡтарын өҫтәргә йәки ÑŽÒ¡ итергә Ñ€Ó©Ñ…Ñәт ителмәгән.',
'userrights-changeable-col' => 'Һеҙ үҙгәртә алған төркөмдәр',
'userrights-unchangeable-col' => 'Һеҙ үҙгәртә алмаған төркөмдәр',
+'userrights-conflict' => 'ҠатнашыуÑының хоҡуҡтарын үҙгәртеү Ñраманы! Зинһар, үҙгәрештәрҙе тикшерегеҙ һәм Ñңынан индерегеҙ.',
+'userrights-removed-self' => 'Һеҙ Ò¯Ò™ хоҡуҡтарығыҙҙы уңышлы ÑŽÒ¡ иттегеҙ. Шулай итеп, был биткә башҡаÑа инә алмаÑÑаҡһығыҙ.',
# Groups
'group' => 'Төркөм:',
@@ -1419,11 +1477,20 @@ $1",
'right-proxyunbannable' => 'ПрокÑи Ñерверҙарҙы авто-бикләүҙе урап үтеү',
'right-unblockself' => 'Ò®Ò™ бигеңде аÑырға',
'right-protect' => 'Биттәрҙең һаҡланыу кимәлен үҙгәртеү һәм баҫҡыÑлап һаҡланған биттәрҙе төҙәтеү',
-'right-editprotected' => 'Һаҡланған биттәрҙе мөхәррирләү(Ñҙмә-Ñҙлекле һаҡлауһыҙ)',
+'right-editprotected' => '"{{int:protect-level-sysop}}" булараҡ һаҡланған биттәрҙе төҙәтеү',
+'right-editsemiprotected' => '"{{int:protect-level-autoconfirmed}}" булараҡ һаҡланған биттәрҙе төҙәтеү',
'right-editinterface' => 'ҠулланыуÑÑ‹ интерфейÑын үҙгәртеү',
'right-editusercssjs' => 'Башҡа ҡатнашыуÑыларҙың CSS һәм JS файлдарын мөхәррирләү',
'right-editusercss' => 'Башҡа ҡатнашыуÑыларҙың CSS файлдарын мөхәррирләү',
'right-edituserjs' => 'Башҡа ҡатнашыуÑыларҙың JS файлдарын мөхәррирләү',
+'right-editmyusercss' => 'ФайҙаланыуÑының CSS файлдарын мөхәррирләү',
+'right-editmyuserjs' => 'Үҙеңдең файҙаланыуҙағы JavaScript-файлдарын мөхәррирләргә',
+'right-viewmywatchlist' => 'Үҙеңдең күҙәтеү иÑемлеген ҡарарға',
+'right-editmywatchlist' => 'Үҙеңдең күҙәтеү иÑемлеген мөхәррирләргә.
+Ҡайһы бер ғәмәлдәрҙең, быға хоҡуғы булмаһа ла, биттәр өҫтәүенә иғтибар итегеҙ.',
+'right-viewmyprivateinfo' => 'Үҙеңдең шәхÑи мәғлүмәттәреңде (мәҫәлән, Ñлектрон почта адреÑын, Ñ‹Ñын иÑемеңде) байҡау',
+'right-editmyprivateinfo' => 'Ò®Ò™ шәхÑи мәғлүмәттәреңде (мәҫәлән, Ñлектрон почта адреÑын, Ñ‹Ñын иÑемеңде) төҙәтеү',
+'right-editmyoptions' => 'Үҙ өҫтөнлөктәреңде мөхәррирләргә',
'right-rollback' => 'Ðиндәйҙер битте мөхәррирләгән һуңғы ҡатнашыуÑының үҙгәртеүҙәрен тиҙ кире алыу',
'right-markbotedits' => 'Кире алынған үҙгәртеүҙәрҙе бот үҙгәртеүе тип билдәләү',
'right-noratelimit' => 'Тиҙлек Ñикләнмәгән',
@@ -1485,12 +1552,19 @@ $1",
'action-userrights-interwiki' => 'ҠатнашыуÑыларҙың башҡа Викиларҙағы хоҡуҡтарын үҙгәртеү',
'action-siteadmin' => 'Мәғлүмәттәр базаһын аÑыу һәм Ñбыу',
'action-sendemail' => 'Ñлектрон хат ебәреү',
+'action-editmywatchlist' => 'һеҙҙең күҙәтеүҙәр иÑемелеген мөхәррирләү',
+'action-viewmywatchlist' => 'һеҙҙең күҙәтеүҙәр иÑемлеген байҡау',
+'action-viewmyprivateinfo' => 'һеҙҙең шәхÑи мәғлүмәтте байҡау',
+'action-editmyprivateinfo' => 'һеҙҙең шәхÑи мәғлүмәтте мөхәррирләү',
# Recent changes
'nchanges' => '$1 {{PLURAL:$1|үҙгәртеү|үҙгәртеү}}',
+'enhancedrc-since-last-visit' => '$1 {{PLURAL:$1|һеҙҙең һуңғы визит}}',
+'enhancedrc-history' => 'тарих',
'recentchanges' => 'Һуңғы үҙгәртеүҙәр',
'recentchanges-legend' => 'Һуңғы үҙгәртеүҙәр көйләүҙәре',
'recentchanges-summary' => 'Төрлө биттәрҙә Ñшләнгән һуңғы үҙгәртеүҙәр иÑемлеге',
+'recentchanges-noresult' => 'Был оÑорҙа тейешле шарттарға тап килгән үҙгәрештәр ÑŽÒ¡.',
'recentchanges-feed-description' => 'Был таҫмалағы һуңғы үҙгәртеүҙәрҙе күҙәтеп барырға',
'recentchanges-label-newpage' => 'Был үҙгәртеү Ñңы бит Ñһаны',
'recentchanges-label-minor' => 'Был әҙ үҙгәреш',
@@ -1527,7 +1601,6 @@ $1",
'recentchangeslinked-feed' => 'Бәйле үҙгәртеүҙәр',
'recentchangeslinked-toolbox' => 'Бәйле үҙгәртеүҙәр',
'recentchangeslinked-title' => '"$1" битенә бәйле үҙгәртеүҙәр',
-'recentchangeslinked-noresult' => 'Күрһәтелгән арауыҡта бәйле биттәрҙә үҙгәртеүҙәр булмаған.',
'recentchangeslinked-summary' => "Был күрһәтелгән бит һылтанма Ñһаған (йәки күрһәтелгән категориÑға кергән) һуңғы үҙгәртеүҙәр иÑемлеге.
[[Special:Watchlist|Күҙәтеү иÑемлегегеҙгә]] керә торған биттәр '''ҡалын''' итеп күрһәтелгән.",
'recentchangeslinked-page' => 'Бит иÑеме:',
@@ -1539,7 +1612,7 @@ $1",
'reuploaddesc' => 'Тейәү формаһына кире ҡайтырға',
'upload-tryagain' => 'Файлдың үҙгәртелгән таÑуирламаһын ебәрергә',
'uploadnologin' => 'Танылмағанһығыҙ',
-'uploadnologintext' => 'Файлдар тейәү Ó©Ñөн, һеҙгә [[Special:UserLogin|танылырға]] кәрәк.',
+'uploadnologintext' => 'Серверға файлдар тейәү Ó©Ñөн һеҙ тейешһегеҙ $1',
'upload_directory_missing' => 'Тейәү Ó©Ñөн Ð´Ð¸Ñ€ÐµÐºÑ‚Ð¾Ñ€Ð¸Ñ ($1) ÑŽÒ¡ йәки веб-Ñервер уны булдыра алмай.',
'upload_directory_read_only' => 'Тейәү Ó©Ñөн директориÑға ($1) веб-Ñервер Ñҙҙыра алмай.',
'uploaderror' => 'Тейәү хатаһы',
@@ -1758,7 +1831,6 @@ $1',
'http-read-error' => 'HTTP уҡыу хатаһы.',
'http-timed-out' => 'HTTP-һорауҙы көтөү ваҡыты үтте.',
'http-curl-error' => 'URL Ð°Ð´Ñ€ÐµÑ Ð±ÑƒÐ¹Ñ‹Ð½Ñа мөрәжәғәт итеү хатаһы: $1',
-'http-host-unreachable' => 'URL Ð°Ð´Ñ€ÐµÑ Ð±ÑƒÐ¹Ñ‹Ð½Ñа мөрәжәғәт итеү мөмкин түгел.',
'http-bad-status' => 'HTTP-һорауҙы Ñшкәрткән ваҡытта ҡыйынлыҡтар тыуҙы: $1 $2',
# Some likely curl errors. More could be added from <http://curl.haxx.se/libcurl/c/libcurl-errors.html>
@@ -1790,6 +1862,10 @@ $1',
'listfiles_size' => 'Күләм',
'listfiles_description' => 'ТаÑуирлау',
'listfiles_count' => 'ВерÑиÑлар',
+'listfiles-show-all' => 'РәÑемдәрҙең иҫке верÑиÑларын индерергә',
+'listfiles-latestversion' => 'Ðғымдағы верÑиÑ',
+'listfiles-latestversion-yes' => 'Эйе',
+'listfiles-latestversion-no' => 'Юҡ',
# File description page
'file-anchor-link' => 'Файл',
@@ -1886,6 +1962,13 @@ $1',
'randompage' => 'ОÑраҡлы мәҡәлә',
'randompage-nopages' => 'Түбәндәге {{PLURAL:$2|иÑемдәр арауығында|иÑемдәр арауыҡтарында}} биттәр ÑŽÒ¡: $1.',
+# Random page in category
+'randomincategory' => 'КатегориÑлағы оÑраҡлы бит',
+'randomincategory-invalidcategory' => '$1 тигән ÐºÐ°Ñ‚ÐµÐ³Ð¾Ñ€Ð¸Ñ ÑŽÒ¡.',
+'randomincategory-nopages' => '[[:Category:$1|$1]] категориÑһында биттәр ÑŽÒ¡.',
+'randomincategory-selectcategory' => '$1 $2 категориÑһынан оÑраҡлы биткә күÑергә.',
+'randomincategory-selectcategory-submit' => 'КүÑергә',
+
# Random redirect
'randomredirect' => 'ОÑраҡлы биткә күÑеү',
'randomredirect-nopages' => '"$1" иÑемдәр арауығында йүнәлтеүҙәр ÑŽÒ¡.',
@@ -1911,17 +1994,13 @@ $1',
'statistics-users-active-desc' => 'Һуңғы {{PLURAL:$1|көндә|$1 көндә}} ниндәйҙер Ñшмәкәрлек башҡарған ҡатнашыуÑылар',
'statistics-mostpopular' => 'Иң күп ҡаралған биттәр',
-'disambiguations' => 'Күп мәғәнәле төшөнÑәләр биттәренә һылтанған биттәр',
-'disambiguationspage' => 'Template:Күп_мәғәнәлелек',
-'disambiguations-text' => "Киләһе биттәрҙә кәмендә бер '''күп мәғәнәле биттәргә''' һылтанма бар.
-Бының урынына улар фәҡәт үҙенә кәрәкле мәҡәләгә һылтанырға тейеш.<br />
-Әгәр биттә иÑеме [[MediaWiki:Disambiguationspage]] битендә күрһәтелгән ҡалып ҡулланылһа, ул күп мәғәнәле тип иҫәпләнә.",
-
'pageswithprop' => 'ҮҙенÑәлектәре ҡайтанан билдәләнгән биттәр',
'pageswithprop-legend' => 'ҮҙенÑәлектәре ҡайтанан билдәләнгән биттәр',
'pageswithprop-text' => 'Бында айырым үҙенÑәлектәре ҡулдан Ñңыртып билдәләнгән биттәр һанала.',
'pageswithprop-prop' => 'ҮҙенÑәлектең атамаһы:',
'pageswithprop-submit' => 'Табырға',
+'pageswithprop-prophidden-long' => 'ТекÑÑ‚ үҙенÑәлегенең оҙон мәғәнәһе йәшерелгән ($1)',
+'pageswithprop-prophidden-binary' => 'ике тармаҡлы үҙенÑәлектең мәғәнәһе йәшерелгән ($1)',
'doubleredirects' => 'Икеле йүнәлтеүҙәр',
'doubleredirectstext' => 'Был биттә икенÑе йүнәлтеү биттәренә йүнәлткән биттәр иÑемлеге килтерелгән.
@@ -1980,6 +2059,7 @@ $1',
'mostrevisions' => 'Иң күп үҙгәртеү Ñһалған биттәр',
'prefixindex' => 'ИÑемдәре башында ҡушымта торған биттәр',
'prefixindex-namespace' => 'ПрефикÑлы бар биттәр ( $1 иÑемдәр арауығы)',
+'prefixindex-strip' => 'Һөҙөмтәләр иÑемлегендә префикÑÑ‚Ñ‹ йәшерергә',
'shortpages' => 'Ҡыҫҡа биттәр',
'longpages' => 'Оҙон биттәр',
'deadendpages' => 'КөрÑөк биттәр',
@@ -1995,6 +2075,7 @@ $1',
'listusers' => 'ҠатнашыуÑылар иÑемлеге',
'listusers-editsonly' => 'Кәмендә бер үҙгәртеү индергән ҡатнашыуÑыларҙы ғына күрһәтергә',
'listusers-creationsort' => 'Булдырыу көнө буйынÑа тәртипкә килтерергә',
+'listusers-desc' => 'Кәмеү буйынÑа айырырға',
'usereditcount' => '$1 {{PLURAL:$1|үҙгәртеү}}',
'usercreated' => '$3 ҡулланыуÑыһының теркәлеү ваҡыты: $1 $2',
'newpages' => 'Яңы биттәр',
@@ -2171,10 +2252,9 @@ $1',
'unwatchthispage' => 'Күҙәтеүҙе туҡтатырға',
'notanarticle' => 'Мәҡәлә түгел',
'notvisiblerev' => 'Башҡа ҡатнашыуÑÑ‹ тарафынан керетелгән һуңғы өлгө юйылған',
-'watchnochange' => 'Күрһәтелгән арауыҡта күҙәтеүҙәр иÑемлегенән бер ни Ò™Ó™ үҙгәрмәгән.',
'watchlist-details' => 'Һеҙҙең күҙәтеү иÑемлегегеҙҙә, фекерләшеү биттәрен һанамағанда, {{PLURAL:$1|$1 бит}} бар.',
-'wlheader-enotif' => '* Электрон почта аша белдереү һайланған',
-'wlheader-showupdated' => "* Һеҙҙең аҙаҡҡы кереүегеҙҙән һуң үҙгәргән биттәр '''ҡалын''' шрифт менән күрһәтелгән.",
+'wlheader-enotif' => 'Электрон почта аша белдереү индерелгән.',
+'wlheader-showupdated' => "Һеҙҙең аҙаҡҡы кереүегеҙҙән һуң үҙгәргән биттәр '''ҡалын''' шрифт менән күрһәтелгән.",
'watchmethod-recent' => 'күҙәтелгән биттәр Ó©Ñөн аҙаҡҡы үҙгәртеүҙәрҙе ҡарау',
'watchmethod-list' => 'аҙаҡҡы үҙгәртеүҙәр Ó©Ñөн күҙәтелгән биттәрҙе ҡарау',
'watchlistcontains' => 'Һеҙҙең күҙәтеү иÑемлегендә $1 {{PLURAL:$1|бит|бит}}бар.',
@@ -2426,7 +2506,7 @@ $1',
'contributions' => '{{GENDER:$1|ҠатнашыуÑÑ‹}} өлөшө',
'contributions-title' => '$1 иÑемле ҡулланыуÑының кереткән өлөшө',
'mycontris' => 'Өлөш',
-'contribsub2' => '$1 ($2) Ó©Ñөн',
+'contribsub2' => '{{GENDER:$3|$1}} өлөшө ($2)',
'nocontribs' => 'Күрһәтелгән шарттарға Ñуап биргән үҙгәртеүҙәр табылманы.',
'uctop' => '(ағымдағы)',
'month' => 'Ðйҙан башлап (һәм Ñлегерәк):',
@@ -2587,15 +2667,13 @@ $1 ҡатнашыуÑыһын бикләү Ñәбәбе: "$2"',
Әммә ул $2 бикләү арауығына керә һәм был арауыҡтың биге алына ала.',
'ip_range_invalid' => 'IP адреÑтар арауығы дөрөҫ түгел.',
'ip_range_toolarge' => '/$1 арауығынан ҙурыраҡ адреÑтар арауығын бикләү Ñ€Ó©Ñ…Ñәт ителмәй.',
-'blockme' => 'Мине биклә',
'proxyblocker' => 'ПрокÑины бикләү',
-'proxyblocker-disabled' => 'Был мөмкинлек һүндерелгән.',
'proxyblockreason' => 'Һеҙҙең IP адреÑÑ‹Ò“Ñ‹Ò™ бикләнгән, Ñөнки ул — аÑÑ‹Ò¡ прокÑи.
Зинһар, Интернет менән тәъмин итеүÑегеҙгә йәки Ñрҙам хеҙмәтенә мөрәжәғәт итегеҙ һәм уларға был едти хәүефһеҙлек хатаһы тураһында хәбәр итегеҙ.',
-'proxyblocksuccess' => 'Үтәлде',
'sorbsreason' => 'Һеҙҙең IP адреÑÑ‹Ò“Ñ‹Ò™ {{SITENAME}} проекты ҡулланған DNSBL иÑемлегендә аÑÑ‹Ò¡ прокÑи тип иҫәпләнә.',
'sorbs_create_account_reason' => 'Һеҙҙең IP адреÑÑ‹Ò“Ñ‹Ò™ {{SITENAME}} проекты ҡулланған DNSBL иÑемлегендә аÑÑ‹Ò¡ прокÑи тип иҫәпләнә.
Һеҙ иҫәп Ñҙмаһы булдыра алмайһығыҙ.',
+'xffblockreason' => 'X-Forwarded-For атамаһы ÑÑенә ингән һәм һеҙҙекеме, һеҙ ҡулланған прокÑи-Ñерверҙыҡымы булған IP-Ð°Ð´Ñ€ÐµÑ Ð±Ð¸ÐºÐ»Ó™Ð½Ð´Ðµ. Бикләүҙең Ñ‚Ó™Ò¯Ñәбәбе ошо ине: $1',
'cant-block-while-blocked' => 'Үҙегеҙ бикләнгән ваҡытта һеҙ башҡа ҡатнашыуÑыларҙы бикләй алмайһығыҙ.',
'cant-see-hidden-user' => 'Һеҙ бикләргә тырышҡан ҡатнашыуÑÑ‹ әлеге ваҡытта бикләнгән һәм йәшерелгән.
ҠатнашыуÑыларҙы йәшереү хоҡуғығыҙ булмағанға күрә, һеҙ был бикләүҙе ҡарай йәки үҙгәртә алмайһығыҙ.',
@@ -2757,6 +2835,8 @@ $1 ҡатнашыуÑыһын бикләү Ñәбәбе: "$2"',
'thumbnail-more' => 'Ҙурайтырға',
'filemissing' => 'Файл юҡ',
'thumbnail_error' => 'Шартлы Ñ€Ó™Ñем булдырыу хатаһы: $1',
+'thumbnail_error_remote' => '$1 хата тураһында хәбәр итә:
+$2',
'djvu_page_error' => 'DjVu битенең һаны биттәр һанынан ашҡан',
'djvu_no_xml' => 'DjVu файлы Ó©Ñөн XML Ñығарып булмай',
'thumbnail-temp-create' => 'ЭÑкиздың ваҡытлыÑа файлын Ñһап булмай',
@@ -2981,11 +3061,7 @@ The wiki server cannot provide data in a format your client can read.',
'pageinfo-category-files' => 'Файлдар һаны',
# Skin names
-'skinname-standard' => 'КлаÑÑик',
'skinname-cologneblue' => 'Кёльн һағышы',
-'skinname-myskin' => 'ШәхÑи',
-'skinname-chick' => 'Себеш',
-'skinname-simple' => 'Ябай',
'skinname-modern' => 'ЗаманÑа',
'skinname-vector' => 'Векторлы',
@@ -3065,11 +3141,25 @@ $1',
'minutes' => '{{PLURAL:$1|$1 минут|$1 минут}}',
'hours' => '{{PLURAL:$1|$1 Ñәғәт|$1 Ñәғәт}}',
'days' => '{{PLURAL:$1|$1 көн|$1 көн}}',
+'weeks' => '{{PLURAL:$1|$1 аҙна|$1 аҙна|}}',
'months' => '{{PLURAL:$1|$1 ай}}',
'years' => '{{PLURAL:$1|$1 йыл}}',
'ago' => '$1 Ñлек',
'just-now' => 'Ñңы ғына',
+# Human-readable timestamps
+'hours-ago' => '$1 {{PLURAL:$1|Ñәғәт}} Ñлек',
+'minutes-ago' => '$1 {{PLURAL:$1|минут}} Ñлек',
+'seconds-ago' => '$1 {{PLURAL:$1|Ñекунд}} Ñлек',
+'monday-at' => 'дүшәмбе $1',
+'tuesday-at' => 'шишәмбе $1',
+'wednesday-at' => 'шаршамбы $1',
+'thursday-at' => 'кеÑе йома $1',
+'friday-at' => 'йома $1',
+'saturday-at' => 'шәмбе $1',
+'sunday-at' => 'йәкшәмбе $1',
+'yesterday-at' => 'КиÑÓ™ $1',
+
# Bad image list
'bad_image_list' => 'Формат киләһе рәүештә булырға тейеш:
@@ -3097,7 +3187,7 @@ $1',
* gpslongitude
* gpsaltitude',
-# EXIF tags
+# Exif tags
'exif-imagewidth' => 'Киңлек',
'exif-imagelength' => 'Бейеклек',
'exif-bitspersample' => 'Төҫтәрҙең тәрәнлеге',
@@ -3275,7 +3365,7 @@ $1',
'exif-originalimageheight' => 'Кадрлауға тиклемге Ñ€Ó™Ñем бейеклеге',
'exif-originalimagewidth' => 'Кадрлауға тиклемге Ñ€Ó™Ñем киңлеге',
-# EXIF attributes
+# Exif attributes
'exif-compression-1' => 'Ҡыҫылмаған',
'exif-compression-2' => 'CCITT Group 3, Хаффман ÑериÑлары оҙонлоҡтарын кодлауҙың 1 үлÑәмле модификациÑһы',
'exif-compression-3' => 'CCITT Group 3, факÑлы кодлау',
@@ -3667,7 +3757,6 @@ $5
'version-other' => 'Башҡалар',
'version-mediahandlers' => 'Медиа ÑшкәртеүÑе ҡоралдар',
'version-hooks' => 'Эләктереп алыуÑылар',
-'version-extension-functions' => 'Киңәйтеү функциÑлары',
'version-parser-extensiontags' => 'Уҡыу ҡоралдары киңәйтеүҙәре тегтары',
'version-parser-function-hooks' => 'Уҡыу ҡоралдары функциÑларын Ñләктереп алыуÑылар',
'version-hook-name' => 'Эләктереп алыуÑÑ‹ иÑеме',
@@ -3676,6 +3765,7 @@ $5
'version-license' => 'РөхÑәтнамә',
'version-poweredby-credits' => "Был вики проект '''[//www.mediawiki.org/ MediaWiki]''' нигеҙендә Ñшләй, copyright © 2001-$1 $2.",
'version-poweredby-others' => 'башҡалар',
+'version-poweredby-translators' => 'translatewiki.net тәржемәÑеләре',
'version-credits-summary' => '[[Special:Version|MediaWiki]] үҫешенә өлөш индергәндәре Ó©Ñөн киләһе ҡатнашыуÑыларға рәхмәт әйтәбеҙ.',
'version-license-info' => 'MediaWiki — ирекле программа, һеҙ уны Ирекле программалар фонды тарафынан баҫтырылған GNU General Public License Ñ€Ó©Ñ…Ñәтнамәһенә Ñрашлы тарата һәм/йәки үҙгәртә алаһығыҙ (Ñ€Ó©Ñ…Ñәтнамәнең йә иÑенÑе өлгөһө, йә унан һуңғы өлгөләре).
@@ -3689,12 +3779,17 @@ MediaWiki файҙалы булыр, тигән өмөттә, ләкин БЕР
'version-entrypoints-header-entrypoint' => 'Инеш урыны',
'version-entrypoints-header-url' => 'URL',
-# Special:FilePath
-'filepath' => 'Файлға юл',
-'filepath-page' => 'Файл:',
-'filepath-submit' => 'КүÑеү',
-'filepath-summary' => 'Был махÑÑƒÑ Ð±Ð¸Ñ‚ файлдың тулы юлын ҡайтара.
-РәÑемдәр тулы аÑыҡлыҡта күрһәтелә, башҡа файлдар билдәләнгән программалары аша турана-тура аÑыла.',
+# Special:Redirect
+'redirect' => 'Файлдан, файҙаланыуÑынан йә верÑиÑның тиңләштереүÑеһенән артабан йүнәлтеү',
+'redirect-legend' => 'Файлға йәки биткә йүнәлтеү',
+'redirect-summary' => 'Был махÑÑƒÑ Ð±Ð¸Ñ‚ файлға (файлдың иÑеменән), биткә (верÑиÑның тиңләштереүÑеһенән) йәки ҡатнашыуÑының битенә (ҡатнашыуÑының һанлы тиңләштереүÑеһенән) йүнәлтә.',
+'redirect-submit' => 'КүÑергә',
+'redirect-lookup' => 'Эҙләү',
+'redirect-value' => 'Мәғәнәһе:',
+'redirect-user' => 'ҠатнашыуÑының тиңләштереүÑеһе',
+'redirect-revision' => 'Биттең верÑиÑһы',
+'redirect-file' => 'Файлдың иÑеме',
+'redirect-not-exists' => 'Мәғәнәһе табылманы',
# Special:FileDuplicateSearch
'fileduplicatesearch' => 'Бер иш файлдарҙы Ñҙләү',
@@ -3744,12 +3839,16 @@ MediaWiki файҙалы булыр, тигән өмөттә, ләкин БЕР
'tags' => 'Ҡулланылған үҙгәртеү билдәләре',
'tag-filter' => '[[Special:Tags|Билдәләрҙе]] һайлау:',
'tag-filter-submit' => 'Һайлау',
+'tag-list-wrapper' => '([[Special:Tags|{{PLURAL:$1|Тамғалар}}]]: $2)',
'tags-title' => 'Билдәләр',
'tags-intro' => 'Был биттә программа үҙгәртеүҙәрҙе билдәләү Ó©Ñөн ҡулланған билдәләр һәм уларҙың мәғәнәләре иÑемлеге килтерелгән.',
'tags-tag' => 'Билдә иÑеме',
'tags-display-header' => 'Үҙгәртеүҙәр иÑемлегендә күрһәтеү',
'tags-description-header' => 'Мәғәнәһенең тулы таÑуирламаһы',
+'tags-active-header' => 'Әүҙемме?',
'tags-hitcount-header' => 'Билдәләнгән үҙгәртеүҙәр',
+'tags-active-yes' => 'Эйе',
+'tags-active-no' => 'Юҡ',
'tags-edit' => 'үҙгәртергә',
'tags-hitcount' => '$1 {{PLURAL:$1|үҙгәртеү|үҙгәртеү}}',
@@ -3770,6 +3869,7 @@ MediaWiki файҙалы булыр, тигән өмөттә, ләкин БЕР
'dberr-problems' => 'Ғәфү итегеҙ! Был Ñайтта техник ҡыйынлыҡтар тыуҙы.',
'dberr-again' => 'Битте бер ниÑÓ™ минуттан Ñңыртып ҡарағыҙ.',
'dberr-info' => '(Мәғлүмәттәр базаһы Ñерверы менән тоташтырылып булмай: $1)',
+'dberr-info-hidden' => '(Мәғлүмәт базаларының Ñерверына тоташып булмай)',
'dberr-usegoogle' => 'Әлегә һеҙ Google Ñрҙамында Ñҙләп ҡарай алһығыҙ.',
'dberr-outofdate' => 'Әммә уның индекÑтары иҫекргән булыуы мөмкинлеген күҙ уңында тотоғоҙ.',
'dberr-cachederror' => 'Түбәндә һоралған биттең кÑшта һаҡланған өлгөһө күрһәтелгән, унда аҙаҡҡы үҙгәртеүҙәр булмауы мөмкин.',
@@ -3785,6 +3885,9 @@ MediaWiki файҙалы булыр, тигән өмөттә, ләкин БЕР
'htmlform-submit' => 'Ебәрергә',
'htmlform-reset' => 'Үҙгәртеүҙәрҙе кире алырға',
'htmlform-selectorother-other' => 'Башҡа',
+'htmlform-no' => 'Юҡ',
+'htmlform-yes' => 'Эйе',
+'htmlform-chosen-placeholder' => 'Вариант һайлағыҙ',
# SQLite database support
'sqlite-has-fts' => '$1, тулы текÑÑ‚ буйынÑа Ñҙләү мөмкинлеге менән',
@@ -3902,4 +4005,19 @@ MediaWiki файҙалы булыр, тигән өмөттә, ләкин БЕР
# Image rotation
'rotate-comment' => 'РәÑем Ñәғәт йөрөшө буйынÑа $1{{PLURAL:$1|}} градуÑҡа боролдо',
+# Limit report
+'limitreport-title' => 'Ðнализатор мәғлүмәттәре:',
+'limitreport-cputime' => 'ПроцеÑÑорҙың ваҡытын ҡулланыу',
+'limitreport-cputime-value' => '$1 {{PLURAL:$1|Ñекунд}}',
+'limitreport-walltime' => 'Ғәмәлдәге ваҡыт режимында ҡулланыу',
+'limitreport-walltime-value' => '$1 {{PLURAL:$1|Ñекунд}}',
+'limitreport-ppvisitednodes' => 'ПроцеÑÑор инеп ҡараған төйөндәр һаны',
+'limitreport-ppgeneratednodes' => 'ПроцеÑÑор Ñшләп Ñығарған төйөндәр һаны',
+'limitreport-postexpandincludesize' => 'ÐÑылған өлөштәр һаны',
+'limitreport-postexpandincludesize-value' => '$1/$2 {{PLURAL:$2|байт}}',
+'limitreport-templateargumentsize' => 'Ҡалып аргументының үлÑәмдәре',
+'limitreport-templateargumentsize-value' => '$1/$2 {{PLURAL:$2|байт}}',
+'limitreport-expansiondepth' => 'Киңәйеүҙең иң ҙур тәрәнлеге',
+'limitreport-expensivefunctioncount' => 'Ðнализаторҙың "ҡиммәтле" функциÑларының һаны',
+
);
diff --git a/languages/messages/MessagesBar.php b/languages/messages/MessagesBar.php
index b14dedf2..1277b9a4 100644
--- a/languages/messages/MessagesBar.php
+++ b/languages/messages/MessagesBar.php
@@ -89,9 +89,6 @@ $messages = array(
'tog-shownumberswatching' => "D' Åzoi voh dé beówochterden Benutzer åzoang",
'tog-oldsig' => 'Existente Unterschrift',
'tog-fancysig' => 'Unterschrift ois Wikitext bhåndln (óne autómaatische Valinkung)',
-'tog-externaleditor' => "An externen Editor ois Standard bnutzen (netter fyr Experten, braucht spezielle Eihstellungen auf'm eigernen Computer)",
-'tog-externaldiff' => "A externs Programm fyr Versionsunterschiad ois Standard bnutzen (netter fyr Experten, dafordert spezielle Eihstellungen auf'm eiganen Computer)",
-'tog-showjumplinks' => '„Wexeln zu“-Links aktivirn',
'tog-uselivepreview' => 'Live-Vurschau nutzen (dodafyr braucht ma JavaScript) (experimentoy)',
'tog-forceeditsummary' => 'Warnen, wånn ban Speichern dé Zåmmerfossung fööd',
'tog-watchlisthideown' => 'Eigerne Beorweitungen in da Beówochtungslisten ausblenden',
@@ -104,6 +101,7 @@ $messages = array(
'tog-diffonly' => "Zoag beim Versiónsvagleich netter dé Unterschiad und néd d' voiständige Seiten",
'tog-showhiddencats' => 'Vasteckte Kategorien åzoang',
'tog-norollbackdiff' => "Unterschiad noch'm Zrucksetzen unterdrucker",
+'tog-useeditwarning' => ' A Warung geem, sofern a zur da Beorweitung geffnate Seiten valossen werd, de ned gspeicherde Änderrungen enthoit.',
'underline-always' => 'oiwei',
'underline-never' => 'nia',
@@ -289,7 +287,7 @@ $1",
'pool-queuefull' => 'Poolworteschlång is vói',
'pool-errorunknown' => 'Unbekånnter 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).
+# 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).
'aboutsite' => 'Iba {{SITENAME}}',
'aboutpage' => 'Project:Iba',
'copyright' => 'Da Inhoid is unter da $1 vafiagbor.',
@@ -299,7 +297,6 @@ $1",
'disclaimers' => 'Impressum',
'disclaimerpage' => 'Project:Impressum',
'edithelp' => 'Huif fias Werkln',
-'edithelppage' => 'Help:Werkln',
'helppage' => 'Help:Inhoidsvazeichnis',
'mainpage' => 'Hoamseitn',
'mainpage-description' => 'Hoamseitn',
@@ -373,15 +370,6 @@ Olle vafiagborn Speziaalseiten san in da [[Special:SpecialPages|Listen voh dé S
# General errors
'error' => 'Feeler',
'databaseerror' => 'Feeler in da Daatenbånk',
-'dberrortext' => "Es is a Daatenbånkfeeler auftreeden!
-Da Grund kå a Prógrammierfeeler seih.
-D' létzde Daatenbånkobfrog wor:
-<blockquote><tt>$1</tt></blockquote>
-aus da Funkzión „<tt>$2</tt>“.
-Dé Daatenbånk hod an Feeler „<tt>$3: $4</tt>“ gmödt.",
-'dberrortextcl' => "Tschuidigung! Es hod an Syntaxfeeler in da Daatenbånkobfrog geem.
-D' letzte Daatenbånkobfrog hod „$1“ aus da Funkzion „<tt>$2</tt>“ glautt.
-De Daatenbånk möidt 'n Feeler: „<tt>$3: $4</tt>“.",
'laggedslavemode' => "'''Ochtung:''' De åzoagte Seiten kunnterd unter Umständ ned d' letzden Beorweitungen enthoiden.",
'readonly' => 'Daatenbånk gsperrd',
'enterlockreason' => 'Bittscheh gib an Grund å, warum de Daatenbånk gsperrd wern soi und a Obschätzung ywer de Dauer voh da Sperrung',
@@ -432,7 +420,6 @@ Bittscheh vasuachs in a por Minunten nuamoi.',
'editinginterface' => "'''Ówocht:''' Dé Seiten do enthoit voh da MediaWiki-Software gnutzden Text.
Änderrungen auf derer Seiten wirken sé auf d' Benutzerówerflächen aus.
Ziag bittscheh im Foi voh Ywersétzungen in Betrocht, dé bei [//translatewiki.net/wiki/Main_Page?setlang=de translatewiki.net], da Lókaalisiarungsblottform fyr MediaWiki, durchzfyrn.",
-'sqlhidden' => '(SQL-Obfrog vastéckt)',
'cascadeprotected' => "Dé Seiten is zua da Beorweitung gsperrd worn. Sie is in d' {{PLURAL:$1|fóigande Seiten|fóiganden Seiten}} eihbunden, dé mid da Kaskaadensperrópzión gschytzd {{PLURAL:$1|is|san}}:
$2",
'namespaceprotected' => "Du host néd d' daforderliche Berechtigung, Seiten im Náumensraum '''$1''' b'orweiden z' kenner.",
@@ -455,7 +442,6 @@ Beochtt ower, daas oanige Seiten noh åzoang kennern, daas du ågmödt bist, só
'yourpassword' => 'Passwort:',
'yourpasswordagain' => 'Es Passwort no amoi eigebm',
'remembermypassword' => 'Mitm Brausa dauahoft ogmejd bleibm (maximoi $1 {{PLURAL:$1|Dog|Dog}})',
-'securelogin-stick-https' => "Noch'm Auhmöden mid HTTPS vabunden bleim",
'yourdomainname' => 'Eanerne Domain:',
'externaldberror' => 'Entweder es ligt a Feeler bai da externen Authentifiziarung vur oder du derfst dai externs Benytzerkonto ned aktualisirn.',
'login' => 'Eilogga',
@@ -615,6 +601,8 @@ Bittschee ibaleg da genau, obs sinnvoi is de Seitn ozlegn.
Des Lesch- und Vaschiab-Logbuach dazua findsd do:",
'moveddeleted-notice' => 'De Seitn do is glescht worn. Es foigt a Auszug ausm Lesch- und Vaschiabungs-Logbuch vo dea Seitn.',
'edit-conflict' => 'Konflikt ban Beorwaten.',
+'editwarning-warning' => "'s Valossen vo derer Seiten kå dodazua fyrn, daas d' Änderrungen valurn geengan.
+Ois ågmödter Benutzer kå's Åzoang vo derer Warnung im \"Beorweiten\"-Bereich vo de Eistellungen obgschoiden wern.",
# Parser/template warnings
'post-expand-template-inclusion-warning' => 'Obocht: De Gress vo eibundne Vorlong is z gross.
@@ -739,7 +727,6 @@ Details stehen im [{{fullurl:{{#Special:Log}}/suppress|page={{FULLPAGENAMEE}}}}
'mypreferences' => 'Mei Preferenz',
'changepassword' => 'Posswort ändern',
'prefs-editing' => 'Beorweiten',
-'prefs-edit-boxsize' => 'Gress vom Beorweitungsfenster',
'rows' => 'Zeiln:',
'columns' => 'Spoiten',
'searchresultshead' => 'Suachen',
@@ -843,7 +830,6 @@ Stand: $4, $5 Uhr.",
'recentchangeslinked-feed' => 'Valinkts priaffm',
'recentchangeslinked-toolbox' => 'Endarunga af valinktn Seitn',
'recentchangeslinked-title' => 'Endarunga wo vo „$1“ valinkt san',
-'recentchangeslinked-noresult' => 'Im ausgwejtn Zeidraum san an dena valinkdn Seitn koane Endarunga vorgnumma worn.',
'recentchangeslinked-summary' => "Des is a Listn vo de letztn Endarunga af Seitn, de wo vo ana bstimmtn Seitn valinkt san (bzw. za ana bstimmtn Kategorie ghean).
Seitn af [[Special:Watchlist|deina Beobochtungslistn]] san '''fett'''.",
'recentchangeslinked-page' => 'Seitn:',
@@ -973,12 +959,6 @@ A [[Special:WhatLinksHere/$2|voiständige Listn]] gibt's aa.",
'statistics-views-total' => 'Seitenaufruaff gsåmmt',
'statistics-mostpopular' => 'Dé am moastbsuachten Seiten',
-'disambiguationspage' => 'Template:Begriffsklearung',
-'disambiguations-text' => "D' fóigernden Seiten valinken af a Seiten za ner Begiefsklärung. Du sóiderst stott dém af d' oagerntlich gmoahde Seiten valinken.
-
-A Seiten gijt ois Begriefsklärungsseiten, waunns oane vah dé af [[MediaWiki:Disambiguationspage]] afgfyrde Vurloog(ng) eihbindt.</br>
-Links as Naumensraim wern do néd afglistt.",
-
'doubleredirects' => 'Doppede Weiderloatungen',
'brokenredirects-edit' => 'werkeln',
@@ -1143,10 +1123,9 @@ Waunnst dé Seiten wieder voh deiner Beówochtungslisten weggerddoah mechst, dru
'unwatchthispage' => 'Nimmer beówochten',
'notanarticle' => 'Koah Seiten',
'notvisiblerev' => 'Versión is gléschd worn',
-'watchnochange' => 'Koahne dé voh dir beówochterden Seiten san wärnd dém auhzoagten Zeidraum beorwatt worn.',
'watchlist-details' => 'Du beoochst {{PLURAL:$1|$1 Seitn}}, Dischkriaseitn ned mitgrechnad',
-'wlheader-enotif' => '* Da E-Mail-Benoochrichtigungsdeanst is aktivierd.',
-'wlheader-showupdated' => "* Seiten mid noh néd gseengne Änderrungen wern '''fett''' dorgstöd.",
+'wlheader-enotif' => 'Da E-Mail-Benoochrichtigungsdeanst is aktivierd.',
+'wlheader-showupdated' => "Seiten mid noh néd gseengne Änderrungen wern '''fett''' dorgstöd.",
'watchmethod-recent' => "Ywerpriaff d' létzden Beorwatungen fyr d' Beówochtungslisten",
'watchmethod-list' => 'Ywerpriaffm voh da Beówochtungslisten auf létzde Beorwatungen',
'watchlistcontains' => 'Deih Beówochtungslisten enthoitt $1 {{PLURAL:$1|Seiten|Seiten}}.',
@@ -1581,7 +1560,7 @@ Weidane wean standardmassi ned ozoagt.
* gpslongitude
* gpsaltitude',
-# EXIF tags
+# Exif tags
'exif-gpsspeed' => 'Gschwindigkeid vom GPS-Empfänger',
'exif-componentsconfiguration-0' => 'Gibts néd',
@@ -1668,7 +1647,6 @@ Bittscheh d' noraale Vurschau bnutzen.",
'version-other' => 'Ã…nders',
'version-mediahandlers' => 'Meediennutzung',
'version-hooks' => "Schnidstön ''(Hooks)''",
-'version-extension-functions' => 'Funkziónsaufruaffe',
'version-parser-extensiontags' => "Parserdaweiterrungen ''(tags)''",
'version-parser-function-hooks' => 'Parserfunkziónen',
'version-hook-name' => 'Schnidstönnaum',
diff --git a/languages/messages/MessagesBbc.php b/languages/messages/MessagesBbc.php
new file mode 100644
index 00000000..e5072e9c
--- /dev/null
+++ b/languages/messages/MessagesBbc.php
@@ -0,0 +1,12 @@
+<?php
+/** Batak Toba (Batak Toba)
+ *
+ * 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 Batak Toba (Latin)
+ */
+
+$fallback = 'bbc-latn';
diff --git a/languages/messages/MessagesBbc_latn.php b/languages/messages/MessagesBbc_latn.php
new file mode 100644
index 00000000..f70e65e0
--- /dev/null
+++ b/languages/messages/MessagesBbc_latn.php
@@ -0,0 +1,734 @@
+<?php
+/** Batak Toba (Batak Toba)
+ *
+ * See MessagesQqq.php for message documentation incl. usage of parameters
+ * To improve a translation please visit http://translatewiki.net
+ *
+ * @ingroup Language
+ * @file
+ *
+ * @author Daniel Harahap
+ * @author Marvel manalu
+ * @author Naval Scene
+ * @author Stephensuleeman
+ * @author WBT001Erin
+ * @author WBT003Bugari
+ * @author WBT004Togu
+ * @author WBT006Hendra
+ * @author WBT009Anju
+ */
+
+$fallback = 'id';
+
+$messages = array(
+# User preference toggles
+'tog-underline' => 'Ondolhon panait',
+'tog-justify' => 'Padasip paragrap',
+'tog-hideminor' => 'Tabunihon editing na metmet di parubaan na imbaru',
+'tog-hidepatrolled' => 'Bunihon panotaan na metmet di parubaan na imbaru',
+'tog-numberheadings' => 'Bahen nomor judul otomatis',
+'tog-showtoolbar' => 'Pataridahon molo ula-ula haubaon',
+'tog-editondblclick' => 'Klik dua hali laho patotahon alaman (ringkot do JavaScript)',
+'tog-minordefault' => 'Tandai sude panotaan na metmet songon naung dipamasa',
+'tog-previewontop' => 'Patuduon preview andorang so kotak edit',
+'tog-previewonfirst' => 'Patudu pratayang di panotaan na parjolo',
+'tog-enotifwatchlistpages' => 'Tongoshon tu ahu surat elektronik molo muba sada alaman na humanat-manati',
+'tog-enotifusertalkpages' => 'Tongoshon tu ahu surat elektronik molo muba alaman panghataionku',
+'tog-enotifminoredits' => 'Tong ma tongoshon surat elektronik tu ahu diparubaan na metmet',
+'tog-enotifrevealaddr' => 'Papatar alamat surat elektronikku tikki notifikasi surat elektronik',
+'tog-shownumberswatching' => 'Patuduhon godang ni pamareso',
+'tog-oldsig' => 'Tandatangani saonari:',
+'tog-forceeditsummary' => 'Paingot ahu molo bongot tu poti panotaan na rumar',
+'tog-watchlisthideown' => 'Bunihon na hupatota sian pamareso',
+'tog-showhiddencats' => 'Papatar angka kategori na buni',
+
+'underline-always' => 'Tongtong',
+'underline-never' => 'Ndang hea masa',
+
+# Dates
+'sunday' => 'Ari Minggu',
+'monday' => 'Ari Senen',
+'tuesday' => 'Ari Selasa',
+'wednesday' => 'Ari Rabu',
+'thursday' => 'Ari Kamis',
+'friday' => 'Ari Jumat',
+'saturday' => 'Ari Sabtu',
+'sun' => 'Mgg',
+'mon' => 'Snn',
+'tue' => 'Sls',
+'wed' => 'Rb',
+'thu' => 'Kms',
+'fri' => 'Jmt',
+'sat' => 'Sbt',
+'january' => 'Sipaha Sampulu',
+'february' => 'Li',
+'march' => 'Hurung',
+'april' => 'Sipaha Sada',
+'may_long' => 'Sipaha Dua',
+'june' => 'Sipaha Tolu',
+'july' => 'Sipaha Opat',
+'august' => 'Sipaha Lima',
+'september' => 'Sipaha Onom',
+'october' => 'Sipaha Pitu',
+'november' => 'Sipaha Uwalu',
+'december' => 'Sipaha Sia',
+'january-gen' => 'Sipaha Sampulu',
+'february-gen' => 'Li',
+'march-gen' => 'Hurung',
+'april-gen' => 'Sipaha Sada',
+'may-gen' => 'Sipaha Dua',
+'june-gen' => 'Sipaha Tolu',
+'july-gen' => 'Sipaha Opat',
+'august-gen' => 'Sipaha Lima',
+'september-gen' => 'Sipaha Onom',
+'october-gen' => 'Sipaha Pitu',
+'november-gen' => 'Sipaha Uwalu',
+'december-gen' => 'Sipaha Sia',
+'jan' => 'Sipaha Sampulu',
+'feb' => 'Li',
+'mar' => 'Hurung',
+'apr' => 'Sipaha Sada',
+'may' => 'Sipaha Dua',
+'jun' => 'Sipaha Tolu',
+'jul' => 'Sipaha Opat',
+'aug' => 'Sipaha Lima',
+'sep' => 'Sipaha Onom',
+'oct' => 'Sipaha Pitu',
+'nov' => 'Sipaha Uwalu',
+'dec' => 'Sipaha Sia',
+
+# Categories related messages
+'pagecategories' => '{{PLURAL:$1|Horong|Angka horong}}',
+'category_header' => 'Angka alaman di horong "$1"',
+'subcategories' => 'Horong na metmet',
+'category-media-header' => 'Media dibagasan horong "$1"',
+'category-empty' => '"Ndang adong alaman manang media di horong on nuaeng."',
+'hidden-categories' => '{{PLURAL:$1|Horong na buni|Angka horong na buni}}',
+'hidden-category-category' => 'Kategori na buni',
+'category-subcat-count' => '{{PLURAL:$2|Horong on marisi {{PLURAL:$1|$1 horong na metmet}} sian sude $2.}}',
+'category-article-count' => '{{PLURAL:$2|Horong on marisi {{PLURAL:$1|$1 alaman}}, sian sude $2.}}',
+'category-file-count' => '{{PLURAL:$2|Horong on holan marisi berkas{{PLURAL:$1|$1 alaman}}, sian sude $2.}}',
+'listingcontinuesabbrev' => 'udut.',
+'broken-file-category' => 'Alaman dohot gombaran na sega',
+
+'about' => 'Taringot',
+'article' => 'alaman isi',
+'newwindow' => '(ungkap ni pandiloi na imbaru)',
+'cancel' => 'Sundati',
+'moredotdotdot' => 'Tambai',
+'mypage' => 'Alaman',
+'mytalk' => 'Pangkataion',
+'navigation' => 'Angka ula-ula laho patuduhon dalan dohot luat',
+'and' => '&#32;dohot',
+
+# Cologne Blue skin
+'qbfind' => 'Jumpangi',
+'qbedit' => 'Patota',
+'qbpageoptions' => 'Alaman on',
+'qbmyoptions' => 'Alaman niiba',
+'faq' => 'FAQ',
+'faqpage' => 'Project:FAQ',
+
+# Vector skin
+'vector-action-addsection' => 'Bagian na imbaru',
+'vector-action-delete' => 'Sesa',
+'vector-action-move' => 'Pahusor',
+'vector-action-protect' => 'Ramoti',
+'vector-action-undelete' => 'unang sesa',
+'vector-action-unprotect' => 'Uba parlindungan',
+'vector-view-create' => 'Tompa',
+'vector-view-edit' => 'Paubah',
+'vector-view-history' => 'Patudu andorang na',
+'vector-view-view' => 'Jaha',
+'vector-view-viewsource' => 'Ida haroanna',
+'actions' => 'Pangulahonon',
+'namespaces' => 'Inganan ni goar',
+'variants' => 'Angka ragam',
+
+'errorpagetitle' => 'Sega',
+'returnto' => 'Mulak tu $1.',
+'tagline' => 'Sian {{SITENAME}}',
+'help' => 'Urupi',
+'search' => 'Diori',
+'searchbutton' => 'Diori',
+'go' => 'Laho tu',
+'searcharticle' => 'Laho tu',
+'history' => 'Alaman turiturian',
+'history_short' => 'Angka siingoton',
+'printableversion' => 'versi na boi dicetak',
+'permalink' => 'Pangait na togu',
+'view' => 'Ida',
+'edit' => 'Patota',
+'create' => 'Tompa',
+'editthispage' => 'Patota alaman on',
+'create-this-page' => 'Bahen alaman on',
+'delete' => 'Sesa',
+'deletethispage' => 'Sesa alaman on',
+'undelete_short' => 'Sundat sesa $1 {{PLURAL:$1|panotaan|panotaan}}',
+'protect' => 'Ramoti',
+'protect_change' => 'Pauba',
+'newpage' => 'Alaman na imbaru',
+'talkpage' => 'Hatahon alaman on',
+'talkpagelinktext' => 'Pangkataion',
+'personaltools' => 'Ula-ula ni sasahalak',
+'postcomment' => 'Bagian imbaru',
+'talk' => 'Panghataion',
+'views' => 'Hataridaan',
+'toolbox' => 'Poti ulaula',
+'userpage' => 'Ida alaman ni pamangke',
+'viewhelppage' => 'Ida alaman pangurupion',
+'viewtalkpage' => 'Ida alaman panghataion',
+'otherlanguages' => 'Di bagasan parhataan na asing',
+'redirectedfrom' => '(Ulanghon sian $1)',
+'lastmodifiedat' => 'Alaman on parpudi di uba ari $2, topet $1.',
+'viewcount' => 'Alaman on nungga dibongoti {{PLURAL:$1|sahali|$1 hali}}',
+'protectedpage' => 'Alaman na di jaga',
+'jumpto' => 'Manimbung tu:',
+'jumptonavigation' => 'angka ula-ula laho patuduhon dalan dohot luat',
+'jumptosearch' => 'Diori',
+'pool-timeout' => 'Suda tingki paimahon hincu',
+'pool-errorunknown' => 'Hasalaan na so binoto',
+
+# 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).
+'aboutsite' => 'Taringot {{SITENAME}}',
+'aboutpage' => 'Project:Taringot tu',
+'copyright' => 'Sude siguriton rade saguru tu $1.',
+'copyrightpage' => '{{ns:project}}:Hak manopa',
+'currentevents' => 'Na tongon masa',
+'currentevents-url' => 'Project:Na masa nuaeng',
+'disclaimers' => 'Panyakalon',
+'disclaimerpage' => 'Project:Pamorsoon umum',
+'edithelp' => 'Pangurupion laho patotahon',
+'helppage' => 'Help:Isi',
+'mainpage' => 'Pogu ni Alaman',
+'mainpage-description' => 'Pogu ni alaman',
+'portal' => 'Harbangan ni punguan',
+'portal-url' => 'Project:Harbangan ni punguan',
+
+'badaccess-group0' => 'Dang diloas hamu laho mangulahon na pinangidomu',
+
+'ok' => 'OK',
+'retrievedfrom' => 'Dijalo sian "$1"',
+'youhavenewmessages' => 'Adong di ho $1 ($2).',
+'newmessageslink' => 'Tona na imbaru',
+'newmessagesdifflink' => 'Parubaan na parpudi',
+'youhavenewmessagesmulti' => 'Adong tu ho tona na imbaru di $1',
+'editsection' => 'Patota',
+'editold' => 'patota',
+'viewsourceold' => 'Bereng harorona',
+'editlink' => 'Patota',
+'viewsourcelink' => 'Ida ma mual',
+'editsectionhint' => 'Patota ponggol: $1',
+'toc' => 'Isi',
+'showtoc' => 'Papatar',
+'hidetoc' => 'Bunihon',
+'collapsible-collapse' => 'Pagelleng',
+'collapsible-expand' => 'Paherbang',
+'thisisdeleted' => 'Ida manang Paulak $1?',
+'viewdeleted' => 'Ida $1?',
+'page-atom-feed' => 'Pele atom "$1"',
+'red-link-title' => '$1 (alaman naso adong dope)',
+'sort-descending' => 'Pajojor lam toru',
+'sort-ascending' => 'Pajojor lam timbo',
+
+# Short words for each namespace, by default used in the namespace tab in monobook
+'nstab-main' => 'Alaman',
+'nstab-user' => 'Pamangke',
+'nstab-special' => 'Alaman na marhasurungan',
+'nstab-project' => 'Alaman ulaon',
+'nstab-image' => 'Berkas',
+'nstab-mediawiki' => 'Tona',
+'nstab-template' => 'Templat',
+'nstab-help' => 'Alaman pangurupion',
+'nstab-category' => 'Hategori',
+
+# General errors
+'error' => 'Hasesega',
+'fileappenderror' => 'Ndang boi pamasuhon "$1" tu "$2".',
+'badarticleerror' => 'Ulaon on dang boi i ulahon di alaman on',
+'cannotdelete-title' => 'Ndang boi manesa alaman "$1"',
+'badtitle' => 'Ulu ni surat na rumar',
+'viewsource' => 'Ida haroanna',
+'namespaceprotected' => "Ndang diloas hamu laho patotahon alaman di '''$1''' inganan ni goar",
+
+# Virus scanner
+'virus-unknownscanner' => 'Antivirus ndang ditanda:',
+
+# Login and logout pages
+'welcomeuser' => 'Horas, $1 !',
+'yourname' => 'Goar pamangke',
+'userlogin-yourname' => 'Siparhaseang',
+'userlogin-yourname-ph' => 'Pamasuk goarmu',
+'yourpassword' => 'Hata hincu:',
+'userlogin-yourpassword' => 'HAta hinsu',
+'userlogin-yourpassword-ph' => 'Pamasuk hata hinsu',
+'yourpasswordagain' => 'Ulanghon surat hata hincu:',
+'userlogin-remembermypassword' => 'Paingot ahu',
+'password-change-forbidden' => 'Ndang boi ubaonmu hata hincu di wiki on',
+'login' => 'Bongot tu log',
+'nav-login-createaccount' => 'Bongot tu log/ bahen akun',
+'loginprompt' => 'Ikkon dipangolu do "cookies" laho bongot log tu {{SINTENAME}}.',
+'userlogin' => 'Bongot tu log/ bahen akun',
+'userlogout' => 'Haruar log',
+'userlogin-noaccount' => 'Ndang adong akun',
+'userlogin-joinproject' => 'Parsidohot',
+'nologin' => 'Ndang adong akun? $1.',
+'nologinlink' => 'Bahen sada akun',
+'createaccount' => 'Bahen akun na imbaru',
+'gotaccount' => 'Nungga adong akunmu? $1',
+'gotaccountlink' => 'Bongot tu log',
+'helplogin-url' => 'Pangurupion: Masuk tu bagasan',
+'userlogin-helplink' => 'MediaWiki:pangurupion bongot tu bagas',
+'createaccountreason' => 'Alanan',
+'createaccounterror' => 'Ndang boi manopa akun: $1',
+'nouserspecified' => 'Ingkon pamasukonmuna goar ni pamangke',
+'mailmypassword' => 'Tongoshon hata hincu na imbaru',
+'emailnotauthenticated' => 'Alamat ni surat elektronikmuna ndang dope dipareso. Andorang so dipareso ndang boi pangkeonmuna rumang surat elektronik.',
+'emailconfirmlink' => 'Tolopi alamat surat elektronikmuna',
+'emaildisabled' => 'Ndang boi situs on manongos surat elekronik',
+'accountcreated' => 'Akun nunga ditopa',
+'login-abort-generic' => 'Ndang marhasil bongot - Dipaso ma',
+'loginlanguagelabel' => 'Hata: $1',
+
+# Change password dialog
+'resetpass' => 'Pauba hata hinsu',
+'oldpassword' => 'Hata hinsu na leleng',
+'newpassword' => 'Password naimbaru',
+'resetpass-submit-loggedin' => 'Pauba hata hinsu',
+'resetpass-submit-cancel' => 'Sundati',
+'resetpass-temp-password' => 'Hata hinsu parsatongkinan',
+
+# Special:PasswordReset
+'passwordreset-username' => 'Goar pamangke',
+'passwordreset-domain' => 'Domain:',
+
+# Special:ChangeEmail
+'changeemail-none' => '(Ndada)',
+'changeemail-cancel' => 'Sundati',
+
+# Edit page toolbar
+'bold_sample' => 'Surat tobal',
+'bold_tip' => 'Surat na hapal',
+'italic_sample' => 'Guratan Italic',
+'italic_tip' => 'surat teleng',
+'link_sample' => 'Goar ni pangait',
+'link_tip' => 'Pangait di bagasan',
+'extlink_sample' => 'http://www.example.com goar ni pangait',
+'extlink_tip' => 'Pangait parduru (ingot mulai dohot http:// )',
+'headline_sample' => 'Ulu ni surat',
+'nowiki_sample' => 'Pamasuk siguraton na so boi ubaon',
+'media_tip' => 'Pangait ni berkas',
+'sig_tip' => 'Tanda tangan pake pananda tingki',
+'hr_tip' => 'Garis na adar',
+
+# Edit pages
+'minoredit' => 'Panotaan na metmet',
+'watchthis' => 'Parrohahon alaman on',
+'savearticle' => 'Simpan alaman',
+'preview' => 'Andorang pataridahon',
+'showpreview' => 'Patudu pratayang',
+'showdiff' => 'Ida parubahan',
+'anoneditwarning' => "'''Paminsangon:''' Ndang bongot tu log dope hamu.
+Di surathon do alamat IP mu di turiturian ni alaman on.",
+'blockednoreason' => 'ndang adong alana na dilehon',
+'loginreqpagetext' => 'Ingkon $1 do hamu laho mamereng alaman na asing.',
+'accmailtitle' => 'Hata hincu nunga ditongos.',
+'newarticle' => '(Imbaru)',
+'noarticletext' => 'Ndang adong siguriton di alaman on saonari. Parhaseang ma[[Special:Search/{{PAGENAME}}|laho mandiori judul ni alaman on]] di alaman na asing, <span class="plainlinks">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} mandiori log na mardomu], manang [{{fullurl:{{FULLPAGENAME}}|action=edit}} laho manota alaman on]</span>.',
+'noarticletext-nopermission' => 'Ndang adong siguriton di alaman on saonari. Parhaseang ma[[Special:Search/{{PAGENAME}}|laho mandiori goar ni alaman on]] di alaman na asing, manang <span class="plainlinks">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} mandiori angka log na mardomu]</span>, alai dang diloas hamu lahon mamungka alaman on.',
+'previewnote' => "'''Ingot ma holan sada andoramg pataridahon do on.'''
+Parubaan na binahenmu dang di simpan dope!",
+'editing' => 'Manota $1',
+'creating' => 'mambahen',
+'editingsection' => 'Manota $1 (ponggol)',
+'templatesused' => '{{PLURAL:$1|Templat|Angka templat}} na diparhaseang di alaman on:',
+'template-protected' => '(dijaga)',
+'template-semiprotected' => '(ndang apala sude diramoti)',
+'hiddencategories' => 'Alaman on ima sada sian {{PLURAL:$1|1 horong na buni|$1 horong na buni}}:',
+'moveddeleted-notice' => 'Alaman on nungnga disesa.',
+
+# Parser/template warnings
+'post-expand-template-inclusion-warning' => 'Pinsangpinsang: Lobi do balga ni templat on. Pigapiga templat gabe dipasiding.',
+'post-expand-template-inclusion-category' => 'Angka alaman na balgana lobi',
+
+# History pages
+'viewpagelogs' => 'Pataridahon angka log ni alaman on',
+'currentrev-asof' => 'Panotaan parpudi ni $1',
+'revisionasof' => 'Panotaan songon $1',
+'revision-info' => 'Parubaan ni $1; $2',
+'previousrevision' => 'â†Revisi andorang na',
+'nextrevision' => 'Panotaan na mangihut→',
+'currentrevisionlink' => 'Panotaan na parpudi',
+'cur' => 'nuaeng',
+'next' => 'udutna',
+'last' => 'andorang',
+'page_first' => 'parjolo',
+'page_last' => 'parpudi',
+'history-show-deleted' => 'Holan na disesa',
+'histfirst' => 'Parjolo sahali',
+'histlast' => 'parpudi sahali',
+
+# Revision feed
+'history-feed-item-nocomment' => '$1 di $2',
+
+# Revision deletion
+'rev-delundel' => 'patarida/tabunihon',
+'rev-showdeleted' => 'Paida',
+'revdelete-log' => 'Alana',
+'revdel-restore' => 'Pauba pardompahan',
+'revdel-restore-deleted' => 'Patota naung di sesa',
+'revdel-restore-visible' => 'revisi na tarbereng',
+
+# Merge log
+'revertmerge' => 'Sundati Pardomuan',
+
+# Diffs
+'lineno' => 'Baris $1:',
+'editundo' => 'Paulak',
+
+# Search results
+'searchresults' => 'Hasil na niluluan',
+'searchresults-title' => 'Hasil mandiori tu "$1"',
+'prevn' => 'andorang so {{PLURAL:$1|$1}}',
+'nextn' => 'Ulaon na naen sitoruson {{PLURAL:$1|$1}}',
+'prevn-title' => 'Andorang so $1 {{PLURAL:$1|hasil|angka hasil}}',
+'nextn-title' => 'Ulaon na naen sitoruson tu $1 {{PLURAL:$1|result|results}}',
+'shown-title' => 'Patuduhon $1 {{PLURAL:$1|hasil|angka hasil}} ganup alaman',
+'viewprevnext' => 'Bereng ($1{{int:pipe-separator}}$2)($3)',
+'searchmenu-exists' => "'''Adong sada alaman na digoari \"[[:\$1]]\" di wiki on.'''",
+'searchmenu-new' => "'''Bahen alaman \"[[:\$1]]\" di wiki on!'''",
+'searchprofile-articles' => 'Alaman isi',
+'searchprofile-project' => 'Alaman pangurupion dohot proyek',
+'searchprofile-images' => 'Akat na godang gunana',
+'searchprofile-everything' => 'Sasude',
+'searchprofile-advanced' => 'Timbul',
+'searchprofile-articles-tooltip' => 'Mandiori di $1',
+'searchprofile-project-tooltip' => 'Mandiori di $1',
+'searchprofile-images-tooltip' => 'Mandiori berkas',
+'searchprofile-everything-tooltip' => 'Mandiori di sude inganan (dohot di alaman panghataion)',
+'searchprofile-advanced-tooltip' => 'Mandiori pake inganan ni goar',
+'search-result-size' => '$1 ({{PLURAL:$2|1 hata|$2 hata}})',
+'search-redirect' => '(ualanghon $1)',
+'search-section' => '(ponggol $1)',
+'search-suggest' => 'On do ra maksudmu: $1',
+'searchrelated' => 'marpandomuan',
+'searchall' => 'sude',
+'showingresultsheader' => "{{PLURAL:$5|Hasil '''$1''' sian '''$3'''|Hasil '''$1 - $2''' sian '''$3'''}} tu '''$4'''",
+'search-nonefound' => 'Ndang adong hasil na suman tu pangidoan',
+'powersearch-toggleall' => 'Sude',
+'powersearch-togglenone' => 'Ndang adong',
+
+# Preferences page
+'mypreferences' => 'Preferensi',
+'searchresultshead' => 'diori',
+'youremail' => 'Tongos surel:',
+'yourrealname' => 'Goar na toho',
+'gender-male' => 'Baoa',
+'gender-female' => 'borua',
+
+# Rights
+'right-read' => 'Manjaha alaman',
+
+# Special:Log/newusers
+'newuserlogpage' => 'Log pamarhaseang na imbaru',
+
+# Associated actions - in the sentence "You do not have permission to X"
+'action-edit' => 'Patota alaman on',
+
+# Recent changes
+'nchanges' => '$1 {{PLURAL:$1|parubaan}}',
+'recentchanges' => 'Parubahan naimbaru',
+'recentchanges-legend' => 'sipilliton sian parubaan na imbaru',
+'recentchanges-label-newpage' => 'Panotaan on mamungka alaman na imbaru',
+'recentchanges-label-minor' => 'Sada panotaan na metmet',
+'recentchanges-label-bot' => 'Panotaan on diulahon bot',
+'recentchanges-label-unpatrolled' => 'Panotaan on ndang dipamanat dope',
+'rcnote' => "Na di toru on ima {{PLURAL:$1|'''1'''|'''$1'''}} perubaan di bagasan {{PLURAL:$2|'''1''' ari|'''$2''' ari}} na parpudi, olat ni $4 pukul $5.",
+'rclistfrom' => 'Patuduhon parubaan na imbaru mamungka sian $1',
+'rcshowhideminor' => '$1 panotaan na metmet',
+'rcshowhidebots' => '$1 bot',
+'rcshowhideliu' => '$1 pamarhaseang bongot tu log',
+'rcshowhideanons' => '$1 pamarhaseang ndang margoar',
+'rcshowhidepatr' => '$1 panotaan na dipamanat',
+'rcshowhidemine' => '$1 na hupatota',
+'rclinks' => 'Patuduhon $1 parubaan na imbaru dibagasan na $2 ari on<br />$3',
+'diff' => 'duru',
+'hist' => 'turi',
+'hide' => 'Bunihon',
+'show' => 'Patuduhon',
+'minoreditletter' => 'm',
+'newpageletter' => 'I',
+'boteditletter' => 'b',
+'rc-enhanced-expand' => 'Pataridahon panjamotan (ringkot do JavaScript)',
+'rc-enhanced-hide' => 'Bunihon panjamotan',
+
+# Recent changes linked
+'recentchangeslinked' => 'Angka parubaan na mardomu tu',
+'recentchangeslinked-toolbox' => 'Angka parubaan na mardomu tu',
+'recentchangeslinked-title' => 'Parubaan na mardomu tu "$1"',
+'recentchangeslinked-page' => 'Goar ni alaman:',
+'recentchangeslinked-to' => 'Pataridahon parubaan ni angka alaman na marpandomuan dohot alaman on',
+
+# Upload
+'upload' => 'Tambahon berkas',
+'filedesc' => 'Panimpulan',
+
+'license' => 'Ragam ni lisensi:',
+'license-header' => 'Ragam ni lisensi',
+'nolicense' => 'Ndang adong na i pillit',
+
+# File description page
+'file-anchor-link' => 'Berkas',
+'filehist' => 'Turiturian ni berkas',
+'filehist-help' => 'Piltik di sada tanggal/tingki laho mamereng berkas on di tingki i.',
+'filehist-revert' => 'Sundati',
+'filehist-current' => 'masa nuaeng',
+'filehist-datetime' => 'Pukkul',
+'filehist-thumb' => 'Thumbnail',
+'filehist-thumbtext' => 'Ganaganaan tu versi songon $1',
+'filehist-user' => 'Pamangke',
+'filehist-dimensions' => 'Dimensi',
+'filehist-comment' => 'Hata panambai',
+'imagelinks' => 'Parhaseangon ni berkas',
+'linkstoimage' => '{{PLURAL:$1|alaman pangait|$1 angka alaman na marpangait}} tu berkas on:',
+'nolinkstoimage' => 'Ndang adong alaman na marpangait tu berkas on.',
+'sharedupload-desc-here' => 'Berkas on sian $1 jala olo do diparhaseang angka proyek na asing. Hatorangan na ima [$2 alaman hatoranganna] dipatorang di toru on.',
+
+# Random page
+'randompage' => 'Alaman sursar',
+
+# Statistics
+'statistics' => 'Statistik',
+
+'pageswithprop-submit' => 'Laho tu',
+
+# Miscellaneous special pages
+'nbytes' => '$1 {{PLURAL:$1|byte|bites}}',
+'nmembers' => '$1 {{PLURAL:$1|isi|angka isi}}',
+'usercreated' => '{{GENDER:$3|Dipungka}} ari $1 topet $2',
+'newpages' => 'Angka alaman na imbaru',
+'move' => 'Paorot',
+'pager-newer-n' => '{{PLURAL:$1|na imbaru|na imbaru $1}}',
+'pager-older-n' => '{{PLURAL:$1|na leleng|$1 na lumeleng}}',
+
+# Book sources
+'booksources-go' => 'Torushon',
+
+# Special:Log
+'log' => 'Angka log',
+
+# Special:AllPages
+'allpages' => 'Sude alaman',
+'alphaindexline' => '$1 tu $2',
+'allarticles' => 'Sude alaman',
+'allpagessubmit' => 'Torushon',
+
+# Special:Categories
+'categories' => 'Angka horong',
+
+# Special:LinkSearch
+'linksearch-line' => '$1 marpangait sian $2',
+
+# Special:ListGroupRights
+'listgrouprights-members' => '(daftar ni parsidohot)',
+
+# Email user
+'emailuser' => 'Surel pamarhaseang on',
+'emailfrom' => 'Sian',
+'emailto' => 'Tu',
+
+# Watchlist
+'watchlist' => 'Daftar na pinarrohahon',
+'mywatchlist' => 'Daftar na pinarrohahon',
+'watchlistfor2' => 'Laho tu $1 $2',
+'watch' => 'Parrohahon',
+'unwatch' => 'Sundat mamarrohahon',
+'wlshowlast' => 'Pataridahon $1 jom $2 ari $3 na parpudi',
+
+# Delete
+'actioncomplete' => 'Sae ulaon',
+'actionfailed' => 'Ulaon sundat',
+'dellogpage' => 'Log pasesaan',
+
+# Rollback
+'rollbacklink' => 'Paundur',
+
+# Protect
+'protectlogpage' => 'Log panghokhop',
+'protectedarticle' => 'manjaga "[[$1]]"',
+
+# Undelete
+'undeletelink' => 'Ida/paulak',
+'undeleteviewlink' => 'Ida',
+'undelete-show-file-submit' => 'Olo',
+
+# Namespace form on various pages
+'namespace' => 'Inganan ni goar:',
+'invert' => 'Paulak napinillit',
+'blanknamespace' => '(Rumingkot)',
+
+# Contributions
+'contributions' => 'Na niula {{GENDER:$1|pamarhaseang}}',
+'mycontris' => 'Angka silua',
+'contribsub2' => 'Laho tu $1 ($2)',
+'uctop' => 'di ginjang',
+'month' => 'Sian bulan (dohot andorang na)',
+'year' => 'Sian taon (dohot andorang na):',
+
+'sp-contributions-blocklog' => 'olati log',
+'sp-contributions-logs' => 'log',
+'sp-contributions-talk' => 'Pangkataion',
+'sp-contributions-username' => 'Alamat IP manang goar:',
+'sp-contributions-toponly' => 'Pataridahon holan panotaan parginjang',
+'sp-contributions-submit' => 'Diori',
+
+# What links here
+'whatlinkshere-title' => 'Angka alaman na marpangait tu "$1"',
+'whatlinkshere-page' => 'Alaman:',
+'linkshere' => "Angka alaman on marpangait tu '''[[:$1]]''':",
+'nolinkshere' => "Ndang adong alaman na marpangait tu '''[[:$1]]'''.",
+'isimage' => 'pangait berkas',
+'whatlinkshere-prev' => '{{PLURAL:$1|andorang so $1}}',
+'whatlinkshere-next' => '{{PLURAL:$1|udut na|udut na $1}}',
+'whatlinkshere-links' => '↠angka pangait',
+'whatlinkshere-hideredirs' => '$1 manguba dalan',
+'whatlinkshere-hidelinks' => '$1 pangait',
+'whatlinkshere-hideimages' => '$1 pangait berkas',
+'whatlinkshere-filters' => 'Saringan',
+
+# Block/unblock
+'ipboptions' => '2 jom:2 hours,1 ari:1 day,3 ari:3 days,1 minggu:1 week,2 minggu:2 weeks,1 bulan:1 month,3 bulan:3 months,6 bulan:6 months,1 taon:1 year,salelengna:infinite',
+'ipblocklist' => 'Angka pamarhaseang na diolati',
+'blocklink' => 'ambati',
+'unblocklink' => 'Pamago Blokir',
+'change-blocklink' => 'Paubah blokir',
+'contribslink' => 'silehon-lehon',
+'blocklogpage' => 'Olati log',
+'block-log-flags-nocreate' => 'Ndang boi mamungka akun',
+
+# Move page
+'move-page-legend' => 'Papinda alaman',
+'movelogpage' => 'Log paorothon',
+'revertmove' => 'Sundati',
+
+# Export
+'export' => 'Ekspor alaman',
+
+# Namespace 8 related
+'allmessagesname' => 'Goar',
+'allmessages-filter-submit' => 'Laho tu',
+
+# Thumbnails
+'thumbnail-more' => 'Paheba',
+
+# Tooltip help for the actions
+'tooltip-pt-userpage' => 'Alaman ni na marparhaseang',
+'tooltip-pt-mytalk' => 'Alaman Pangkataionmuna',
+'tooltip-pt-preferences' => 'Pinillit ni hamu',
+'tooltip-pt-watchlist' => 'punguan angka goar ni alaman',
+'tooltip-pt-mycontris' => 'Daftar ni silua mu',
+'tooltip-pt-login' => 'Disosoi do hamu asa bongot tu log, alai dang pola di gogohon.',
+'tooltip-pt-logout' => 'Haruar Log',
+'tooltip-ca-talk' => 'Panghataion taringot tu alaman isi',
+'tooltip-ca-edit' => 'Boi do patotaonmu alaman on. Parhaseang tombol pratayang andorang so manimpan.',
+'tooltip-ca-addsection' => 'Mamungka bogas na imbaru',
+'tooltip-ca-viewsource' => 'Alaman on dijaga. Holan haroanna do boi berengon mu',
+'tooltip-ca-history' => 'Parubaan na parpudi di alaman on',
+'tooltip-ca-protect' => 'Hophop alamana on',
+'tooltip-ca-delete' => 'Sesa alaman on',
+'tooltip-ca-move' => 'Pindahon alaman on',
+'tooltip-ca-watch' => 'Tambahon alaman on tu daftar pamberengan hamu',
+'tooltip-ca-unwatch' => 'Sesa alaman on sian daftar na diparrohahon',
+'tooltip-search' => 'lului di bagasan wiki on',
+'tooltip-search-go' => 'Diori alaman na marnampunahon goar na tangkas molo adong',
+'tooltip-search-fulltext' => 'diori alaman na margurithon songonon',
+'tooltip-p-logo' => 'Duloi pogu ni alaman',
+'tooltip-n-mainpage' => 'Duloi pogu ni alaman',
+'tooltip-n-mainpage-description' => 'Duloi pogu ni alaman',
+'tooltip-n-portal' => 'Taringot tu ulaon, aha na boi ulaonmu,ima namandiori na adong',
+'tooltip-n-currentevents' => 'Dapoti informasi taringot tu na masa nuaeng',
+'tooltip-n-recentchanges' => 'Angka parubaan na imbaru di wiki',
+'tooltip-n-randompage' => 'Patudu Alaman na Asing',
+'tooltip-n-help' => 'Inganan mandiori alus',
+'tooltip-t-whatlinkshere' => 'Daftar ni sude alaman wiki na marnampunahon pangait tu alaman on',
+'tooltip-t-recentchangeslinked' => 'Angka parubaan ni alaman na imbaru na marpangait tu alaman on',
+'tooltip-feed-atom' => 'Pele Atom hu alaman on',
+'tooltip-t-contributions' => 'Daftar ni tumpak ni pamarhaseang on',
+'tooltip-t-emailuser' => 'Tongoshon sada surel tu pamarhaseang on',
+'tooltip-t-upload' => 'Tambahaon angka berkas',
+'tooltip-t-specialpages' => 'Sude Alaman na Istimewa',
+'tooltip-t-permalink' => 'Pangait na togu tu parubaan ni alaman on',
+'tooltip-ca-nstab-main' => 'Dulo alaman isi',
+'tooltip-ca-nstab-user' => 'Bereng alaman ni pamarhaseang',
+'tooltip-ca-nstab-special' => 'On alaman na marhasurungan, ndang boi dipatota',
+'tooltip-ca-nstab-project' => 'Bereng alaman proyek',
+'tooltip-ca-nstab-image' => 'Bereng alaman berkas',
+'tooltip-ca-nstab-template' => 'Ida templat',
+'tooltip-ca-nstab-category' => 'Bereng alaman horong',
+'tooltip-minoredit' => 'Tandai on songon sada panotaan na metmet',
+'tooltip-save' => 'Simpan parubaan mu',
+'tooltip-preview' => 'Parrohahon parubaan mu, parhaseang on andorang so manimpan',
+'tooltip-diff' => 'Bereng parubaan na binahenmu tu siguraton',
+'tooltip-compareselectedversions' => 'Bereng aha ubana sian na dua ragam ni alaman na dipillit.',
+'tooltip-watch' => 'Tambahon alaman on tu daftar na diparrohahonmu',
+'tooltip-summary' => 'Pamasuk ringkasan pendek',
+
+# Browsing diffs
+'previousdiff' => '↠Panotaan na salpu',
+'nextdiff' => 'Parubaan na imbaru →',
+
+# Media information
+'file-info-size' => '$1 × $2 piksel, balga ni berkas: $3, rumang na MIME: $4',
+'file-nohires' => 'Ndang adong resolusi natumimbo.',
+'svg-long-desc' => 'Berkas SVG, nominal $1 × $2 piksel, balga ni berkas: $3',
+'show-big-image' => 'Resolusi na umbalga',
+
+# Special:NewFiles
+'noimages' => 'Ndang adong na ni ida',
+'ilsubmit' => 'Diori',
+
+# Bad image list
+'bad_image_list' => 'Songon on ma rumangna:
+
+Holan daftar (baris na dimulai dohot tanda *) na masuk etongan. Pangait na parjolo di sada-sada baris ikkon do gabe pangait tu berkas na buruk. Pangait na manghihut di nasabaris i dietong do i pulik,ima alaman na patuduhon berkas i.',
+
+# Metadata
+'metadata' => 'Metadata',
+'metadata-help' => 'Berkas on marnampunahon informasi na asing, olo do sian kamera digital manang sian ula-ula na asing. Molo nungga dipauneune berkas on, hatoranganna olo do ndang apala toho songon informasi siang gombaran naung dipauneune on.',
+'metadata-fields' => 'Angka bidang metadata gombar na dipajojor di bagasan tona on naeng dipamasuk di hataridaan ni alaman gombar tingki tabel metadata dipametmet. Data na asing gabe dibunihon songon naung ditontuhon.
+ * make
+* model
+* datetimeoriginal
+* exposuretime
+* fnumber
+* isospeedratings
+* focallength
+* artist
+* copyright
+* imagedescription
+* gpslatitude
+* gpslongitude
+* gpsaltitude',
+
+# Exif tags
+'exif-imagewidth' => 'Bolak',
+'exif-imagelength' => 'Timbo',
+
+# External editor support
+'edit-externally' => 'Patota berkas on mamarhaseanghon ulaula parduru',
+
+# 'all' in various places, this might be different for inflected languages
+'watchlistall2' => 'Sasude',
+'namespacesall' => 'sude',
+'monthsall' => 'Sasude',
+
+# Watchlist editing tools
+'watchlisttools-edit' => 'Pataridahon jala patota daftar siparrohahonon',
+
+# Special:SpecialPages
+'specialpages' => 'Alaman na marhasurungan',
+
+# Special:Tags
+'tag-filter' => 'Saringan [[Special:Tags|tag]]:',
+
+);
diff --git a/languages/messages/MessagesBcc.php b/languages/messages/MessagesBcc.php
index d79ee65c..62d92e97 100644
--- a/languages/messages/MessagesBcc.php
+++ b/languages/messages/MessagesBcc.php
@@ -172,9 +172,6 @@ $messages = array(
'tog-enotifrevealaddr' => 'منی ایمیل پیش دار ته ایمیل أن هوژاری',
'tog-shownumberswatching' => 'پیش دار تعداد کاربرانی که چارگتن',
'tog-fancysig' => 'امضاءَ په داب ویکی متنی بزان(بی اتوماتیکی لینک)',
-'tog-externaleditor' => 'به طور پیش Ùرض اصلاح کنوک حارجی استÙاده Ú©Ù†',
-'tog-externaldiff' => 'به طور پیش Ùرض Ú†Ù‡ حارجی تمایز استÙاده Ú©Ù†',
-'tog-showjumplinks' => 'Ùعال Ú©Ù† "jump to" لینکان دست رسی Ø¢',
'tog-uselivepreview' => 'Ú†Ù‡ زنده این بازبین استÙاده Ú©Ù†(جاوا)(تجربی)',
'tog-forceeditsummary' => 'من آ هال دی وهدی وارد کتن یک هالیکین خلاصه ی اصلاح',
'tog-watchlisthideown' => 'منی اصلاحات آ چه لیست چارگ پناه کن',
@@ -356,7 +353,7 @@ $messages = array(
$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).
+# 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).
'aboutsite' => 'باره {{SITENAME}}',
'aboutpage' => 'Project:باره',
'copyright' => 'محتوا موجودانت تحت $1.',
@@ -366,7 +363,6 @@ $1',
'disclaimers' => 'بی میاری گیان',
'disclaimerpage' => 'Project:عمومی بی میاریگان',
'edithelp' => 'کمک اصلاح',
-'edithelppage' => 'Help:اصلاح',
'helppage' => 'Help:محتوا',
'mainpage' => 'صÙحه اصلی',
'mainpage-description' => 'صÙحه اصلی',
@@ -437,17 +433,6 @@ $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' => 'یک دلیلی په کبل وارد کنیت، شامل یک برآوردی چه وهد کبل ویل بیت',
@@ -494,7 +479,6 @@ Query: $2',
'editinginterface' => "'''هوژاری:''' شما یک صÙحه ای اصلاح کنیت Ú©Ù‡ به عنوان مداخله گر متنی برنامه استÙاده بیت.
تغییرات ای صÙحه کاربرد مداخله گر په دگه کابران تاثیر هلیت.
[//translatewiki.net/wiki/Main_Page?setlang=en translatewiki.net], په ترجمه یان لطÙا توجه کنیت په استÙاده پروژه ملکی کتن مدیا ÙˆÛŒ Ú©ÛŒ",
-'sqlhidden' => '(SQL درخواست پناهین)',
'cascadeprotected' => 'ای صÙحه محاÙظت بیت Ú†Ù‡ اصلاح چرا Ú©Ù‡ آیی شامل جهلیگین {{PLURAL:$1|صÙحه, Ú©Ù‡|صÙحات, Ú©Ù‡}} محاÙظتی گون the "cascading" option turned on:
$2',
'namespaceprotected' => "شما اجازت په اصلاح صÙحات ته '''$1'' نام Ùضا نیست",
@@ -602,7 +586,7 @@ $2',
'newpassword' => 'نوکین کلمه رمز:',
'retypenew' => 'کلمه رمز دگه بنویس',
'resetpass_submit' => 'تنظیم کلمه رمز و ورود',
-'resetpass_success' => 'شمی کلمه رمز گون موÙقیت عوض بون! هنو شما وارد بیگیت...',
+'changepassword-success' => 'شمی کلمه رمز گون موÙقیت عوض بون! هنو شما وارد بیگیت...',
'resetpass_forbidden' => 'کلمات رمز نه توننت عوض بنت.',
'resetpass-no-info' => 'په مستقیمین دسترسی په ای صÙحه شما بایدن وارد سایت بیت',
'resetpass-submit-loggedin' => 'عوض کتن کلمه رمز',
@@ -959,7 +943,6 @@ $1",
'searchmenu-legend' => 'گزینه یان گردگ',
'searchmenu-exists' => "'''صÙحه گون نام \"[[\$1]]\" ته ای ویکی نیستن'''",
'searchmenu-new' => "'''شر Ú©Ù† صÙحه ای \"[[:\$1]]\" ته ای ویکی!'''",
-'searchhelp-url' => 'Help:محتوا',
'searchmenu-prefix' => '[[Special:PrefixIndex/$1|بروز صÙحات گون پیش وند]]',
'searchprofile-articles' => 'صÙحات محتوا',
'searchprofile-project' => 'Ú©Ù…Ú© Ùˆ صÙحات پروژه ای',
@@ -1002,14 +985,6 @@ $1",
شما نونیت بگردیت چه طرق گوگل هم زمان.
توجه که اندیکس آن {{SITENAME}} محتوا شاید تاریح گوستگین بنت.',
-# Quickbar
-'qbsettings' => 'میله سریع',
-'qbsettings-none' => 'هچ یک',
-'qbsettings-fixedleft' => 'چپ ثابت',
-'qbsettings-fixedright' => 'راست ثابت',
-'qbsettings-floatingleft' => 'چپ شناور',
-'qbsettings-floatingright' => 'راست شناور',
-
# Preferences page
'preferences' => 'ترجیحات',
'mypreferences' => 'منی ترجیحات',
@@ -1036,7 +1011,6 @@ $1",
'resetprefs' => 'پاکن تغییرات ذخیره نه بوتگین',
'restoreprefs' => 'Ú©Ù„ پیش Ùرضین تنظیمات برگردین',
'prefs-editing' => 'اصلاح',
-'prefs-edit-boxsize' => 'حد پنجره اصلاح.',
'rows' => 'ردیÙآن«',
'columns' => 'ستون‌ان:',
'searchresultshead' => 'گردگ',
@@ -1074,7 +1048,6 @@ $1",
'prefs-custom-js' => 'رسمی جی‌اس',
'prefs-reset-intro' => 'شما توانت Ú†Ù‡ ای صÙحه په واترینگ تنظیمات وت په پیش‌Ùرض استÙاده کنیت. ای کار بازگشت‌ناپذیر انت.',
'prefs-emailconfirm-label' => 'تایید کتن پست الکترونیک:',
-'prefs-textboxsize' => 'اندازه پنجره اصلاح',
'youremail' => 'ایمیل:',
'username' => 'نام کاربری:',
'uid' => 'کاربر شناسگ:',
@@ -1290,7 +1263,6 @@ $1",
'recentchangeslinked-feed' => 'مربوطین تغییرات',
'recentchangeslinked-toolbox' => 'مربوطین تغییرات',
'recentchangeslinked-title' => 'تغییراتی مربوط په "$1"',
-'recentchangeslinked-noresult' => 'Ù‡Ú† تغییری ته صÙحات لینک بوتگین ته داتگین دوره نیست',
'recentchangeslinked-summary' => "Ø´ÛŒ یک لیستی Ú†Ù‡ تغییراتی هستنت Ú©Ù‡ نوکی اعمال بوتگنت په صÙحاتی Ú©Ù‡ Ú†Ù‡ یک صÙحه خاصی لینک بوته( یا په اعضای یک خاصین دسته).
صÙحات ته [[Special:Watchlist| شمی لیست چارگ]] '''' پررنگنت''''",
'recentchangeslinked-page' => 'صÙحه نام:',
@@ -1550,12 +1522,6 @@ PICT # misc.
'statistics-users-active-desc' => 'کاربرانی که ته پیشگین {{PLURAL:$1|روچ|$1 روچان}} کاری اش کتت',
'statistics-mostpopular' => 'باز چار تگین صÙحات',
-'disambiguations' => 'صÙحات رÙع ابهام',
-'disambiguationspage' => 'Template:رÙع ابهام',
-'disambiguations-text' => "جهلیگین صÙحه لینک انت په یک '''صÙحه رÙع ابهام'''.
-شما بایدن په جاه آیی په یک مناسبین موضوعی لینک دهیت.<br />
-یک صÙحه ای Ú©Ù‡ په داب صÙحه رÙع ابهام چارگ بیت اگر آیء Ú†Ù‡ یک تمپلتی Ú©Ù‡ لینک بیت Ú†Ù‡ [[MediaWiki:Disambiguationspage|صÙحه رÙع ابهام]] استÙاده کنت.",
-
'doubleredirects' => 'دوبل غیر مستقیم',
'doubleredirectstext' => 'ای صÙحه لیست کنت صÙحاتی Ú©Ù‡ غیر مستقیم رونت په دگه صÙحات. هر ردی٠شامل لینکانی انت به اولی Ùˆ دومی غیر مستقیم، Ùˆ هد٠دومی غیر مستقیم، Ú©Ù‡ معمولا استÙاده بیت "real" صÙحه هدÙØŒ Ú©Ù‡ بایدن اولی غیر مستقیم پیش داریت.',
'double-redirect-fixed-move' => '[[$1]] انتقال دهگ بوتت، و الان تغییر مسیری په [[$2]] انت',
@@ -1766,10 +1732,9 @@ PICT # misc.
'unwatchthispage' => 'چارگ بند کن',
'notanarticle' => 'یک صÙحه محتوا نهت',
'notvisiblerev' => 'بازبینی حذ٠بوتت',
-'watchnochange' => 'هچ یک چه شمی چارتگین آیتم اصلاح نه بوتت ته ای دوره زمانی که پیش دارگ بیت.',
'watchlist-details' => '{{PLURAL:$1|$1 صÙحه|$1 صÙحات}} چارتگ بیت صÙحات Ú¯Ù¾ حساب نه بیگن',
-'wlheader-enotif' => '* اخطار ایمیل Ùعالنت.',
-'wlheader-showupdated' => "* صÙحات Ú©Ù‡ عوض بوتگنت Ú†Ù‡ شمی آهری چارتن '''پررنگ''' پیش دراگ بنت.",
+'wlheader-enotif' => 'اخطار ایمیل Ùعالنت.',
+'wlheader-showupdated' => "صÙحات Ú©Ù‡ عوض بوتگنت Ú†Ù‡ شمی آهری چارتن '''پررنگ''' پیش دراگ بنت.",
'watchmethod-recent' => 'کنترل نوکین اصلاحات په صÙحاتی Ú©Ù‡ چارگ بنت',
'watchmethod-list' => 'کنترل صÙحاتی Ú©Ù‡ چارگ بنت په نوکین اصلاحات',
'watchlistcontains' => 'شمی لیست چارگ شامل $1 {{PLURAL:$1|صÙحه|صÙحات}}.',
@@ -2115,12 +2080,9 @@ $1',
'ipb_blocked_as_range' => 'حطا: ای Ù¾ÛŒ $1 مستقیما محدود نهنت Ùˆ نه تونیت رÙع محدودیت بیت.
بله Ø¢ÛŒ جزی Ú†Ù‡ محدوده $2 محدود بوتت Ú©Ù‡ تونیت رÙع محدودیت بیت.',
'ip_range_invalid' => 'نامعتبر محدوده آی پی',
-'blockme' => 'مناء محدود کن',
'proxyblocker' => 'محدود کننده ی پروکسی',
-'proxyblocker-disabled' => 'ای عمگر غیرÙعالنت.',
'proxyblockreason' => 'شمی آدرس آی پی محدود بوتت په چی که ایء یک پچین پروکسی ات.
لطÙا گون وتی اینترنتی شرکت تماس گریت یا حمایت تکنیکی Ùˆ آیانا Ú†ÛŒ ای مشکل امنیتی شدید سهی کنیت.',
-'proxyblocksuccess' => 'انجام بوت.',
'sorbs' => 'دی ان اس بی ال',
'sorbsreason' => 'شمی آدرس Ø¢ÛŒ Ù¾ÛŒ لیست بوتت په داب پچین پروکسی ته DNSBL Ú©Ù‡ استÙاده بیت گون {{SITENAME}}.',
'sorbs_create_account_reason' => 'شمی آدرس Ø¢ÛŒ Ù¾ÛŒ لیست بوتت په داب پچین پروکسی ته دی ان ای بی ال Ú©Ù‡ استÙاده بیت گون {{SITENAME}}.
@@ -2410,13 +2372,8 @@ $1',
'spam_blanking' => 'کل بازبینی آن شامل لینکان په $1, بوتت هالیکی',
# Skin names
-'skinname-standard' => 'کلاسیک',
-'skinname-nostalgia' => 'نوستالجیک',
'skinname-cologneblue' => 'نیلی کولاجن',
'skinname-monobook' => 'منوبوک',
-'skinname-myskin' => 'منی جلد',
-'skinname-chick' => 'شیک',
-'skinname-simple' => 'ساده',
'skinname-modern' => 'مدرن',
# Patrolling
@@ -2543,7 +2500,7 @@ Variants for Chinese language
* gpslongitude
* gpsaltitude',
-# EXIF tags
+# Exif tags
'exif-imagewidth' => 'پهنات',
'exif-imagelength' => 'بلندی',
'exif-bitspersample' => 'بیت ته جز',
@@ -2659,7 +2616,7 @@ Variants for Chinese language
'exif-gpsdatestamp' => 'تاریح جی پی اس',
'exif-gpsdifferential' => 'اصلاح متÙاوت جی Ù¾ÛŒ اس',
-# EXIF attributes
+# Exif attributes
'exif-compression-1' => 'کمپرس نه بوتت',
'exif-compression-6' => 'جیی پی ای جی',
@@ -2901,7 +2858,6 @@ $5
# Separators for various lists, etc.
'semicolon-separator' => ';',
'colon-separator' => ':&#32;',
-'autocomment-prefix' => '-',
# Multipage image navigation
'imgmultipageprev' => '↠پیشگین صÙحه',
@@ -3026,7 +2982,6 @@ $5
'version-other' => 'دگر',
'version-mediahandlers' => 'دست گروک مدیا',
'version-hooks' => 'گیر کنت',
-'version-extension-functions' => 'عملگران الحاقی',
'version-parser-extensiontags' => 'برچسپان الحاقی تجزیه گر',
'version-parser-function-hooks' => 'عمل گر تجزیه کنوک گیر کت',
'version-hook-name' => 'نام گیر',
@@ -3037,13 +2992,6 @@ $5
'version-software-product' => 'محصول',
'version-software-version' => 'نسخه',
-# Special:FilePath
-'filepath' => 'مسیر Ùایل',
-'filepath-page' => 'Ùایل:',
-'filepath-submit' => 'مسیر',
-'filepath-summary' => 'ای حاصین صÙحه مسیر کامل په یک Ùایل پیش داریت.
-تصاویر گون وضوح کامل پیش دارگ بنت Ùˆ دگه نوع Ùایلان گون وتی برنامه یانش مستقیما Ù¾Ú† بنت.',
-
# Special:FileDuplicateSearch
'fileduplicatesearch' => 'گردگ په Ú©Ù¾ÛŒ Ùایلان',
'fileduplicatesearch-summary' => 'گردگ په Ú©Ù¾ÛŒ Ùایلان په اساس درهمین ارزش.',
diff --git a/languages/messages/MessagesBcl.php b/languages/messages/MessagesBcl.php
index 27eb70f4..fee44413 100644
--- a/languages/messages/MessagesBcl.php
+++ b/languages/messages/MessagesBcl.php
@@ -127,11 +127,6 @@ $messages = array(
'tog-shownumberswatching' => 'Ihayag an numero kan nagbabantay na mga parágamit',
'tog-oldsig' => 'Tugmadong pirma',
'tog-fancysig' => 'Trataron an pirma na wiki-teksto (mayo nin awtomatikong kilyaw)',
-'tog-externaleditor' => 'Gamiton an pirmihan na panluwas na editor (para sa mga eksperto sana, minakaipo nin espesyal na mga panuytoy sa saimong kompyuter.
-[//www.mediawiki.org/wiki/Manual:External_editors Mga dagdag na impormasyon.])',
-'tog-externaldiff' => 'Gamíta an panluwas na diff nguna (para sa mga eksperto sana, minakaipo nin espesyal na mga panuytoy (settings) sa saimong kompyuter.
-[//www.mediawiki.org/wiki/Manual:External_editors Kadagdagang impormasyon.])',
-'tog-showjumplinks' => 'Paganaha an "luksó sa" kilyaw nin kalangkayan',
'tog-uselivepreview' => 'Gamíta an buhay na patànaw (eksperimental)',
'tog-forceeditsummary' => 'Ibunyaw sako kun maglalaog sa blangkong kalanyang nin paghirá',
'tog-watchlisthideown' => 'Tagóa an sakong mga pagliwat gikan sa bantay-listahan',
@@ -144,6 +139,8 @@ $messages = array(
'tog-diffonly' => 'Dai tabi ihayag an laog kan pahina sa ibaba nin mga diffs',
'tog-showhiddencats' => 'Ihayag an nakatagong mga kategorya',
'tog-norollbackdiff' => 'Omidohon an diff matapos himoon an pagbalikot',
+'tog-useeditwarning' => 'Patanidan ako kunsoarin na ako nagbaya sa pahinang pigliliwat na dae naitatagama an mga kaliwatan',
+'tog-prefershttps' => 'Pirmeng gumamit nin sarong seguradong koneksyon kunsoarin na ika nakalaog na',
'underline-always' => 'Pirmi',
'underline-never' => 'Nungka',
@@ -207,6 +204,18 @@ $messages = array(
'oct' => 'Okt',
'nov' => 'Nob',
'dec' => 'Des',
+'january-date' => 'Enero $1',
+'february-date' => 'Pebrero $1',
+'march-date' => 'Marso $1',
+'april-date' => 'Abril $1',
+'may-date' => 'Mayo $1',
+'june-date' => 'Hunyo $1',
+'july-date' => 'Hulyo $1',
+'august-date' => 'Agosto $1',
+'september-date' => 'Septiyembre $1',
+'october-date' => 'Oktubre $1',
+'november-date' => 'Nobyembre $1',
+'december-date' => 'Disyembre $1',
# Categories related messages
'pagecategories' => '{{PLURAL:$1|Kategorya|Mga kategorya}}',
@@ -288,6 +297,7 @@ $messages = array(
'create-this-page' => 'Muknaon ining pahina',
'delete' => 'Puraon',
'deletethispage' => 'Puraon ining pahina',
+'undeletethispage' => 'Balikon sa pagkapura ining pahina',
'undelete_short' => 'Bawia an pagpurà kan {{PLURAL:$1|sarong pagliwat|$1 mga pagliwat}}',
'viewdeleted_short' => 'Hilngon {{PLURAL:$1|sarong pinara na pagliwat|$1 mga pinara na pagliwat}}',
'protect' => 'Protektari',
@@ -331,7 +341,7 @@ $1',
'pool-queuefull' => 'An grupong panproseso panoon',
'pool-errorunknown' => 'Bakong bistadong 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).
+# 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).
'aboutsite' => 'Dapít sa {{SITENAME}}',
'aboutpage' => 'Project:Mapanonongód',
'copyright' => 'An kalamnan manunumpungan sa laog kan $1.',
@@ -341,7 +351,6 @@ $1',
'disclaimers' => 'Mga Pangindahan',
'disclaimerpage' => 'Project:Pangkagabsán na pangindahan',
'edithelp' => 'Pantabang sa pagliliwat',
-'edithelppage' => 'Help:Pagliwát',
'helppage' => 'Help:Mga Kalamnan',
'mainpage' => 'Panginot na Pahina',
'mainpage-description' => 'Panginot na Pahina',
@@ -419,17 +428,12 @@ Pwede mong mahiling an lista nin mga marhay na pahina sa [[Special:SpecialPages|
# General errors
'error' => 'Salâ',
'databaseerror' => 'Salâ sa base nin datos',
-'dberrortext' => 'May kahaputan sa datos-sarayan sa napasalang sintaks an nangyari.
-Ini puwedeng minapanungod nin sarong kubol na yaon sa kasungatan .
-An pinakahuring pagprubar sa datos-sarayan naghahapot nin:
-<blockquote><tt>$1</tt></blockquote>
-gikan sa laog kan punksyon na "<tt>$2</tt>".
-An pinagbalik na kasalaan sa datos-sarayan "<tt>$3: $4</tt>".',
-'dberrortextcl' => 'Sarong datos-sarayan na may napasalang sintaks an nangyari.
-An pinakahuring pagprubar sa datos-sarayan naghahapot nin:
-"$1"
-na hale sa laog kan punksyon na "$2".
-An datos-sarayan nagbalik nin sala na "<tt>$3: $4</tt>".',
+'databaseerror-text' => 'Sarong hapot sa datos-sarayan na kasalaan an nangyari.
+Ini puwedeng minapasabot nin sarong kudol sa panuklob.',
+'databaseerror-textcl' => 'Sarong hapot sa datos-sarayan na kasalaan an nangyari.',
+'databaseerror-query' => 'Hapot: $1',
+'databaseerror-function' => 'Punksyon: $1',
+'databaseerror-error' => 'Kasalaan: $1',
'laggedslavemode' => 'Patanid: An pahina pwedeng dai nin pagbabâgo sa ngonyan.',
'readonly' => 'Nakakandado na datos-sarayan',
'enterlockreason' => 'Magkaag tabì nin rason sa pagkandado, asin ikalkulo kun nuarin bubukasón an kandado',
@@ -463,6 +467,7 @@ Ini puwede nang napura kan iba.',
'cannotdelete-title' => 'Dae mapura an pahina na "$1"',
'delete-hook-aborted' => 'An pagpura pinundo kan pangawit.
Ini dae nagtao nin kapaliwanagan.',
+'no-null-revision' => 'Dae makakamukna nin baguhong bunyaw na rebisyon para sa pahina "$1"',
'badtitle' => 'Raot na titulo',
'badtitletext' => 'An pinaghagad na titulo kan pahina imbalido, daeng laog, o sarong salaon na sinugpunan na titulo kan inter-lengguwahe o inter-wiki.
Ini gayod may laog nin o dakol na mga karakter na dae pinaggagamit sa mga titulo.',
@@ -485,12 +490,15 @@ Sa pagdagdag or pagliwat nin mga dakit-taramon para sa bilog na wiki, gamita tab
'editinginterface' => "'''Patanid:''' Ika nagliliwat kan pahina na ginagamit sa pagtao nin pantahaw-olay na teksto para sa software.
An mga pagbabago kaining pahina makaka-apekto sa hitsura kan pantahaw-olay nin paragamit para sa iba man na paragamit.
Para sa mga pagdadakit-taramon, pakikonsidera man tabi an paggagamit kan [//translatewiki.net/wiki/Main_Page?setlang=en translatewiki.net], an MediaWiking lokalisasyon kan proyekto.",
-'sqlhidden' => '(nakatagô an hapót nin SQL)',
'cascadeprotected' => 'Pinoprotehirán ining páhina sa mga paghirá, ta sarô ini sa mga minasunod na {{PLURAL:$1|páhina|mga páhina}} na pinoprotehiran kan opsyón na "katarata" na nakabuká:
$2',
'namespaceprotected' => "Mayô kang permisong maghirá kan mga páhina sa '''$1''' ngaran-espacio.",
'customcssprotected' => 'Ika mayong permiso sa pagliwat kaining pahinang CSS, nin huli ta ini naglalaman kan personal na panuytoy (settings) kan ibang paragamit.',
'customjsprotected' => 'Ika mayong permiso sa pagliwat kaining pahinang JavaScript, nin huli ta ini naglalaman kan personal na panuytoy (settings) kan ibang paragamit.',
+'mycustomcssprotected' => 'Ika mayo nin permiso sa pagliwat kaining CSS na pahina.',
+'mycustomjsprotected' => 'Ika mayo nin permiso sa pagliwat kaining JavaScript na pahina.',
+'myprivateinfoprotected' => 'Ika daeng permiso na magliliwat kan pribado mong impormasyon.',
+'mypreferencesprotected' => 'Ika daeng permiso na magliliwat kan saimong mga kamuyahan.',
'ns-specialprotected' => 'An mga pahinang nasa {{ns:special}} na liang-liang dai pwedeng hirahón.',
'titleprotected' => 'Ining titulo pinagprotektaran poon pagkamukna ni [[User:$1|$1]].
An rason na pinagtao iyo na "\'\'$2\'\'".',
@@ -515,10 +523,19 @@ Tandai tabi na an nagkapirang mga pahina puwedeng maipagpapadagos na ipagpapahil
'welcomecreation-msg' => 'An saimong panindog pinagmukna na.
Dae malingaw na liwaton an saimong [[Special:Preferences|{{SITENAME}} mga kamuyahan]].',
'yourname' => 'Pangaran kan paragamit:',
+'userlogin-yourname' => 'Paragamit-na-Ngaran',
+'userlogin-yourname-ph' => 'Ikaag an saimong paragamit-na-ngaran',
+'createacct-another-username-ph' => 'Ikaag an paragamit-na-ngaran',
'yourpassword' => 'Pasa-taramon:',
+'userlogin-yourpassword' => 'Sikretong panlaog',
+'userlogin-yourpassword-ph' => 'Ikaag an saimong sekretong panlaog',
+'createacct-yourpassword-ph' => 'Ikaag an sekretong panlaog',
'yourpasswordagain' => 'Pakilaog giraray kan sekretong panlaog:',
+'createacct-yourpasswordagain' => 'Kumpirmaron an sekretong panlaog',
+'createacct-yourpasswordagain-ph' => 'Pakikaag otro an sekretong panlaog',
'remembermypassword' => 'Giromdoma an sakong paglaog sa kilyaw (browser) na ini (para sa maksimum na $1 {{PLURAL:$1|aldaw|mga aldaw}})',
-'securelogin-stick-https' => 'Magpirmeng konektado sa HTTPS matapos kang maglaog',
+'userlogin-remembermypassword' => 'Dagos mo akong giromdomon na nakalaog',
+'userlogin-signwithsecure' => 'Gamiton an seguradong koneksyon',
'yourdomainname' => 'An saimong kasakupan:',
'password-change-forbidden' => 'Ika dae makapagliwat nin sekretong panlaog sa wiking ini.',
'externaldberror' => 'Igwa gayod sala sa arinman kan patunay sa datos-sarayan o ika dae pinagtugutan na bâgohon an saimong panluwas na panindog.',
@@ -530,18 +547,41 @@ Dae malingaw na liwaton an saimong [[Special:Preferences|{{SITENAME}} mga kamuya
'logout' => 'Magluwas',
'userlogout' => 'Magluwás',
'notloggedin' => 'Dae ka nakalaog',
+'userlogin-noaccount' => 'Mayo ka nin panindog?',
+'userlogin-joinproject' => 'Mag-ayon{{SITENAME}}',
'nologin' => 'Mayò ka pa nin panindog (account)? $1.',
'nologinlink' => 'Magmukna nin panindog',
'createaccount' => 'Magmukna nin panindog',
'gotaccount' => 'Igwa ka na tabi nin panindog? $1.',
'gotaccountlink' => 'Maglaog',
'userlogin-resetlink' => 'Nakalingaw ka sa panlaog mong detalye?',
+'userlogin-resetpassword-link' => 'Pakibaguha an saimong sekretong panlaog',
+'helplogin-url' => 'Help:Paglalaog',
+'userlogin-helplink' => '[[{{MediaWiki:helplogin-url}}|Tabang sa paglalaog]]',
+'createacct-join' => 'Pakikaag an saimong impormasyon sa ibaba.',
+'createacct-another-join' => 'Ikaag an impormasyon kan baguhong panindog sa ibaba.',
+'createacct-emailrequired' => 'Estada kan e-surat',
+'createacct-emailoptional' => 'E-surat na estada (opsyonal)',
+'createacct-email-ph' => 'Pakikaag an saimong e-surat na estada',
+'createacct-another-email-ph' => 'Ikaag an estada kan e-surat',
'createaccountmail' => 'Gumamit nin sarong temporaryong pampurak na pasa-taramon asin ipadara ini sa pinagsambit na estada kan e-surat',
+'createacct-realname' => 'Totoong pangaran (opsyonal)',
'createaccountreason' => 'Rason:',
+'createacct-reason' => 'Rason',
+'createacct-reason-ph' => 'Tadaw ta ika magmumukna nin ibang panindog',
+'createacct-captcha' => 'Rikisang panseguridad',
+'createacct-imgcaptcha-ph' => 'Pakikaag an tekstong nahihiling mo sa ibabaw',
+'createacct-submit' => 'Muknaon an saimong panindog',
+'createacct-another-submit' => 'Magmukna nin ibang panindog',
+'createacct-benefit-heading' => '{{SITENAME}} pinaghimo kan mga tawong siring mo.',
+'createacct-benefit-body1' => '{{PLURAL:$1|niliwat|mga niliwat}}',
+'createacct-benefit-body2' => '{{PLURAL:$1|pahina|mga pahina}}',
+'createacct-benefit-body3' => 'pinakahuring {{PLURAL:$1|paraambag|mga paraambag}}',
'badretype' => 'An mga sekretong panlaog mong pinagtatak bakong pareho.',
'userexists' => 'Paragamit na ngarang piglaog may naggagamit na.
Pakipili nin ibang ngaran tabi.',
'loginerror' => 'An paglaog napasalâ',
+'createacct-error' => 'Kasalaan sa pagmumukna nin panindog',
'createaccounterror' => 'Dae tabi maimukna an panindog: $1.',
'nocookiesnew' => 'An panindog kan paragamit namukna na, pero ika dae pa tabi nakalaog.
{{SITENAME}} naggagamit nin cookies tanganing makalaog an mga paragamit.
@@ -601,10 +641,12 @@ Pakilaog sana tabi nin sarong tugmadong koreo o pabayae na mayong laman an surat
'createaccount-title' => 'Panindog na pagmukna para sa {{SITENAME}}',
'createaccount-text' => 'May tawong nagmukna nin sarong panindog na gamit an saimong address na e-surat sa {{SITENAME}} ($4) na may ngaran na "$2, na may sikretong panlaog na "$3".',
'usernamehasherror' => 'Paragamit na ngaran dae puwede na igwang simbolikong mga kabtang',
-'login-throttled' => 'Nakapaghimo ka na nin kadakulon na pagprubar sa paglaog dae pa sana nahaloy. Mapuwede lang po na maghalat bago magprubar giraray.',
+'login-throttled' => 'Nakapaghimo ka na nin grabe kadakol na pagprubar na maglaog sa dae pa sana nahahaloy. Tabi man pakihalat nin $1 bago ka magprubar giraray.',
'login-abort-generic' => 'An saimong paglaog dae nakadagos - Pinundo',
'loginlanguagelabel' => 'Lengguwahe: $1',
'suspicious-userlogout' => 'An hinahagad mong magluwas pinagpundo nin huli ta ini gayod pinagpadara sa paagi nin sarong pasang kilyaw o proksing hilom.',
+'createacct-another-realname-tip' => 'An totoong pangaran opsyonal.
+Kun gustuhon mong itao ini, ini paggagamiton sa pagtatao nin pagkakabistohan kan paragamit para sa saindang mga kaggibohan.',
# Email sending
'php-mail-error-unknown' => 'Bakong bantog na kasalaan sa PHP mail() function.',
@@ -621,8 +663,7 @@ Tanganing tapuson an paglalaog, ika kaipong magkaag nin sarong baguhon na sekret
'newpassword' => 'Bàguhon na sekretong panlaog:',
'retypenew' => 'Itaták giraray an bàgong panlaog:',
'resetpass_submit' => 'Ipwesto an sekretong panlaog dangan maglaog',
-'resetpass_success' => 'An saimong pasa-taramon matrayumpong pinagliwat na!
-Ngunyan pinagpapalaog ka na...',
+'changepassword-success' => 'An saimong pasa-taramon matrayumpong pinagliwat na!',
'resetpass_forbidden' => 'An mga sekretong panlaog dae puwedeng maribayan',
'resetpass-no-info' => 'Ika dapat nakalaog na tanganing direktang makagamit kaining pahina.',
'resetpass-submit-loggedin' => 'Ribayan an sekretong panlaog',
@@ -634,10 +675,11 @@ Matriumpo mo nang nailaog an sekretong panlaog o nakua an bàgong temporaryong s
# Special:PasswordReset
'passwordreset' => 'Pakibago kan sekretong panlaog',
-'passwordreset-text' => 'Kumpletoha ining porma tangarig liwatong an saimong sekretong panlaog.',
+'passwordreset-text-one' => 'Kumpletuhon ining porma sa pagliwat otro kan saimong pasa-taramon.',
+'passwordreset-text-many' => '{{PLURAL:$1|Palamanan an saro sa mga kaaganan tanganing mailuwat-otro an saimong pasa-taramon.}}',
'passwordreset-legend' => 'Pakibago kan sekretong panlaog',
'passwordreset-disabled' => 'An pagbago kan sekretong panlaog pinagpundo sa wiking ini.',
-'passwordreset-pretext' => '{{PLURAL:$1||Pakilaog kan saro sa mga pedaso nin datos sa ibaba}}',
+'passwordreset-emaildisabled' => 'E-surat na mga estima pinag-uruntok sa wiking ini.',
'passwordreset-username' => 'Paragamit-ngaran:',
'passwordreset-domain' => 'Kasakupan:',
'passwordreset-capture' => 'Hilngon an kinaluwasang e-koreo?',
@@ -662,7 +704,7 @@ Ika dapat na maglaog asin magpili nin sarong bagong sekretong panlaog ngunyan. K
Temporaryong sekretong panlaog: $2',
'passwordreset-emailsent' => 'Sarong e-surat sa pagliliwat kan sekretong panlaog an ipinadara na.',
'passwordreset-emailsent-capture' => 'Sarong e-surat sa pagliliwat kan sekretong panlaog an ipinadara na, yaon ipinapahiling sa ibaba.',
-'passwordreset-emailerror-capture' => 'Sarong pampagiromdom na e-koreo pinaghimo na, ipinapahiling sa may ibaba, alagad an pagpapadara kaini sa paragamit nagpalya: $1',
+'passwordreset-emailerror-capture' => 'Sarong e-surat sa pagliliwat kan sekretong panlaog an pinagpuyos na, yaon ipinapahiling sa ibaba, alagad sa pagpapadara kaini sa {{GENDER:$2|paragamit}} nagpalya: $1',
# Special:ChangeEmail
'changeemail' => 'Ribayan an e-koreong address',
@@ -676,6 +718,19 @@ Temporaryong sekretong panlaog: $2',
'changeemail-submit' => 'Ribayan an e-koreo',
'changeemail-cancel' => 'Kanselaha',
+# Special:ResetTokens
+'resettokens' => 'Pakibaguha an mga paduos',
+'resettokens-text' => 'Ika makakapagbago kan ma paduos na magtutugot nin kalangkayan pasiring sa siyertong datos na pribado na asosyado sa saimong panindog digde.
+
+Gibohon mo ini kun aksidente mong naipagheras sinda sa kiisay man o kun an saimong panindog kompromitido na.',
+'resettokens-no-tokens' => 'Mayo nin mga paduos na babaguhon.',
+'resettokens-legend' => 'Pakibaguha an mga paduos',
+'resettokens-tokens' => 'Mga Paduos:',
+'resettokens-token-label' => '$1 (na ngunyan na halaga: $2)',
+'resettokens-watchlist-token' => 'Paduos para sa hungitan nin web (Atom/RSS) kan [[Special:Watchlist|mga kaliwatan sa mga pahina nin saimong bantay-listahan]]',
+'resettokens-done' => 'Mga paduos pinagbago na.',
+'resettokens-resetbutton' => 'Pakibaguha an pinagpiling mga paduos',
+
# Edit page toolbar
'bold_sample' => 'Mahìbog na teksto',
'bold_tip' => 'Mahìbog na teksto',
@@ -872,12 +927,14 @@ Ini dae tabi nagtao nin kapaliwanagan.',
Ini minapahiwatig tabi na pinagpura na.',
'edit-conflict' => 'Igwang iregularidad sa pagliwat.',
'edit-no-change' => 'An saimong pagliwat pinagbalewala, nin huli ta mayong pagbabago an pinaghimo sa teksto.',
+'postedit-confirmation' => 'An saimong niliwat ipinagtagama na.',
'edit-already-exists' => 'Dai maggibo an bàgong pahina.
Igwa na kaini.',
'defaultmessagetext' => 'Tugmadong mensahe sa teksto',
'content-failed-to-parse' => 'Nagpalya sa paglunhay an $2 na laman para sa $1 na modelo: $3',
'invalid-content-data' => 'Imbalidong datos nin laman',
'content-not-allowed-here' => '"$1" na laman dae pinagtutugutan sa pahina [[$2]]',
+'editwarning-warning' => 'Sa pagbaya kaining pahina magkakausa saimo na mawara an anuman na mga kaliwatan na saimong ginibo. Kun ika maglaog, mapuwede mong untukon ining patanid sa "Pagliliwat" na seksyon kan saimong mga kamuyahan.',
# Content models
'content-model-wikitext' => 'wiki-teksto',
@@ -912,6 +969,7 @@ Ining mga argumento tabi pinagharali na.",
'undo-failure' => 'Dai napogol an paghirá ta igwa pang ibang paghirá sa tahaw na nagkokomplikto.',
'undo-norev' => 'An pagliwat dae tabi magigibo nin huli ta ini bakong eksistido o pinagpura na.',
'undo-summary' => 'Dae idagos an rebisyon $1 sa [[Special:Contributions/$2|$2]] ([[User talk:$2|olay]])',
+'undo-summary-username-hidden' => 'Dae idagos an rebisyon sa $1 nin sarong nakatago na paragamit',
# Account creation failure
'cantcreateaccounttitle' => 'Dai makagibo nin account',
@@ -1094,6 +1152,7 @@ Tandaan na an paggagamit kan nabigasyong nin mga kasurugponan makakapagliwat kai
'compareselectedversions' => 'Kompararon an pinagpiling mga rebisyon',
'showhideselectedversions' => 'Ihayag/itago mga piniling pagbabago',
'editundo' => 'sulíton',
+'diff-empty' => '(Mayong kalaenan)',
'diff-multi' => '({{PLURAL:$1|Saro intermediate na pagbabago|$1 mga intermediate na mga pagbabago}} by {{PLURAL:$2|sarong paragamit|$2 mga paragamit}} dae pinaghahayag)',
'diff-multi-manyusers' => '({{PLURAL:$1|Sarong intermediate na pagbabago|$1 mga intermediate na mga pagbabago}} na sobra sa $2 {{PLURAL:$2|paragamit|mga paragamit}} dae pinaghahayag)',
'difference-missing-revision' => '{{PLURAL:$2|sarong rebisyon|$2 mga rebisyon}} kaining diperensiya ($1) {{PLURAL:$2|na iyo an|kaidto na iyo an}} dae nanagboan.
@@ -1121,7 +1180,6 @@ An mga detalye mapuwedeng matatagboan sa [{{fullurl:{{#Special:Log}}/delete|page
'searchmenu-legend' => 'Opsyon sa paghahanap',
'searchmenu-exists' => "'''Igwa nin sarong pahina na pinagngaranan na \"[[:\$1]]\" sa wiking ini.'''",
'searchmenu-new' => "'''Muknaon an pahina \"[[:\$1]]\" sa wiking ini!'''",
-'searchhelp-url' => 'Help:Mga laog',
'searchmenu-prefix' => '[[Special:PrefixIndex/$1|Kilyawon an mga pahina sa paagi kainin enotang panigmit]]',
'searchprofile-articles' => 'Mga pahina nin laog',
'searchprofile-project' => 'Mga pahina nin Tabang asin Proyekto',
@@ -1163,15 +1221,7 @@ Prubaran na panigmitan an saimong kahaputan nin ''all:'' sa paghanap kan gabos n
'powersearch-togglenone' => 'Wara',
'search-external' => 'Panluwas na paghahanap',
'searchdisabled' => 'Pigpopogolan mûna an paghanap sa {{SITENAME}}. Mientras tanto, pwede ka man maghanap sa Google. Giromdomon tabî na an mga indise kan laog ninda sa {{SITENAME}} pwede ser na lumâ na.',
-
-# Quickbar
-'qbsettings' => 'Quickbar',
-'qbsettings-none' => 'Mayô',
-'qbsettings-fixedleft' => 'Nakatakód sa walá',
-'qbsettings-fixedright' => 'Nakatakód sa tûo',
-'qbsettings-floatingleft' => 'Naglálatáw sa walá',
-'qbsettings-floatingright' => 'Naglálatáw sa tûo',
-'qbsettings-directionality' => 'Nakadukot, minadepende sa skrip panukdoan kan saimong lengguwahe',
+'search-error' => 'May salang nangyari habang naghahanap:$1',
# Preferences page
'preferences' => 'Mga kabòtan',
@@ -1205,7 +1255,6 @@ Prubaran na panigmitan an saimong kahaputan nin ''all:'' sa paghanap kan gabos n
'resetprefs' => 'Linigan an dae naitagamang mga kaliwatan',
'restoreprefs' => 'Balikon an gabos na panugmad na mga panuytoy (sa gabos na mga seksyon)',
'prefs-editing' => 'Pighihira',
-'prefs-edit-boxsize' => 'Sukol kan bintana sa pagliwat.',
'rows' => 'Mga hilera:',
'columns' => 'Mga taytay:',
'searchresultshead' => 'Hanápon',
@@ -1216,9 +1265,9 @@ Prubaran na panigmitan an saimong kahaputan nin ''all:'' sa paghanap kan gabos n
'recentchangesdays-max' => 'Maksimum $1 {{PLURAL:$1|aldaw|mga aldaw}}',
'recentchangescount' => 'Numero kan mga pagliliwat na ipapahiling na pirmihan:',
'prefs-help-recentchangescount' => 'Kabali kaini an dae pa nahaloy na mga kaliwatan, mga historiyang pahina, asin mga talaan.',
-'prefs-help-watchlist-token' => 'An pagpapano sa parteng ini nin sarong sekretong susi magbubuswang nin RSS feed para sa saimong bantay-listahan.
-Siisay man na nakakaaram kan suri sa parteng ini makakabasa kan saimong bantay-listahan, kaya magpili nin sarong seguradong halaga.
-Uya an halaga sa random na pagbuswang na puwede mong magamit: $1',
+'prefs-help-watchlist-token2' => 'Ini an sikretong susi sa bahugan kan web sa saimong bantay-listahan.
+An siisay man na makaaram kaini makakapagbasa kan saimong bantay-listahan, kaya dae mo ipagheras ini.
+[[Special:ResetTokens|I-klik digde kun kaipo mong baguhon it]].',
'savedprefs' => 'Itinagama na an mga kabôtan mo.',
'timezonelegend' => 'Pan-oras na sona:',
'localtime' => 'Panlokal na oras:',
@@ -1249,7 +1298,6 @@ Uya an halaga sa random na pagbuswang na puwede mong magamit: $1',
'prefs-reset-intro' => 'Ika makakagamit kaining pahina tanganing ilapat giraray an saimong mga kabotan sa panugmad kan sayt.
Ini dae tabi matitingkog.',
'prefs-emailconfirm-label' => 'Kumpirmasyon sa E-koreo',
-'prefs-textboxsize' => 'Sukol kan bintana sa pagliliwat',
'youremail' => 'E-surat:',
'username' => '{{GENDER:$1|Pangaran nin paragamit}}:',
'uid' => '{{GENDER:$1|Paragamit}} ID:',
@@ -1283,6 +1331,8 @@ An saimong e-surat na adres dae ipagbuyagyag kunsoarin na an ibang paragamit mak
'prefs-dateformat' => 'Pampetsang pormat',
'prefs-timeoffset' => 'Pan-oras na tapal',
'prefs-advancedediting' => 'Pankagabsan na mga Pagpipilian',
+'prefs-editor' => 'Paraliwat',
+'prefs-preview' => 'Patânaw',
'prefs-advancedrc' => 'Pangenot na mga pagpipilian',
'prefs-advancedrendering' => 'Abantidong mga pagpipilian',
'prefs-advancedsearchoptions' => 'Abantidong mga pagpipilian',
@@ -1290,7 +1340,9 @@ An saimong e-surat na adres dae ipagbuyagyag kunsoarin na an ibang paragamit mak
'prefs-displayrc' => 'Ihayag an mga pagpipilian',
'prefs-displaysearchoptions' => 'Ipahiling ang mga pagpipilian',
'prefs-displaywatchlist' => 'Ipahiling ang mga pagpipilian',
+'prefs-tokenwatchlist' => 'Paduos',
'prefs-diffs' => 'Diffs',
+'prefs-help-prefershttps' => 'Ining kamuyahan magkaka-epekto sa masunod mong paglaog.',
# User preference: email validation using jQuery
'email-address-validity-valid' => 'An e-koreo nagpapahiling na balido',
@@ -1317,6 +1369,8 @@ An saimong e-surat na adres dae ipagbuyagyag kunsoarin na an ibang paragamit mak
'userrights-notallowed' => 'Ika mayo tabing permiso na magdugang o magtangkas nin mga katanosan kan paragamit.',
'userrights-changeable-col' => 'Mga grupo na mapuwede mong baguhon',
'userrights-unchangeable-col' => 'Mga grupo na dae mo mapuwedeng baguhon',
+'userrights-conflict' => 'Kumplikto sa mga kaliwatan nin mga katanosan kan paragamit! Tabi man pakirikisa asin kumpirmaron an saimong mga kaliwatan.',
+'userrights-removed-self' => 'Saimong matrayumpong pinagtangkas an sadire mong mga katanosan. Sa siring, ika dae na tabi makakalaog sa pahinang ini.',
# Groups
'group' => 'Grupo:',
@@ -1382,11 +1436,19 @@ An saimong e-surat na adres dae ipagbuyagyag kunsoarin na an ibang paragamit mak
'right-proxyunbannable' => 'Sampawan an awtomatikong mga kubkob kan mga proksi',
'right-unblockself' => 'Dae pagkubkubon an sadire',
'right-protect' => 'Baguhon an mga kad-at nin proteksyon asin liwaton an mga pahina nin protektadong surunsunan',
-'right-editprotected' => 'Liwaton an protektadong mga pahina (na bakong pinagsasalansan an proteksyon)',
+'right-editprotected' => 'Liwaton an mga pahina na protektado bilang "{{int:protect-level-sysop}}"',
+'right-editsemiprotected' => 'Liwaton an mga pahina na protektado bilang "{{int:protect-level-autoconfirmed}}"',
'right-editinterface' => 'Liwaton an paragamit na olay-panlaog',
'right-editusercssjs' => 'Liwaton an CSS asin JavaScript na mga sagunson kan ibang mga paragamit',
'right-editusercss' => 'Liwaton an CSS na mga sagunson kan ibang mga paragamit',
'right-edituserjs' => 'Liwaton an JavaScript na mga sagunson kan ibang mga paragamit',
+'right-editmyusercss' => 'Liwaton an saimong sadireng paragamit na sagunson sa CSS',
+'right-editmyuserjs' => 'Liwaton an saimong sadireng paragamit na sagunson sa JavaScript',
+'right-viewmywatchlist' => 'Tanawon an saimong sadireng bantay-listahan',
+'right-editmywatchlist' => 'Liwaton an saimong sadireng bantay-listahan. Tandai baya na an nagkapirang mga aksyon magdudugang pa man nin mga pahina dawa mayo kaining katanosan.',
+'right-viewmyprivateinfo' => 'Tanawon an sadire mong datos pribado (e.g. estada kan e-surat, tunay na pangaran)',
+'right-editmyprivateinfo' => 'Liwaton an sadire mong datos pribado (e.g. estada kan e-surat, tunay na pangaran)',
+'right-editmyoptions' => 'Liwaton an sadire mong mga kamuyahan',
'right-rollback' => 'Hidaling ibalik an mga niliwat kan huring paragamit na nagliwat nin sarong partikular na pahina',
'right-markbotedits' => 'Markahan an pinagbalik na mga niliwat bilang bot na panliwat',
'right-noratelimit' => 'Dae magin apektado sa paagi kan rata nin mga sagkodan',
@@ -1448,12 +1510,19 @@ An saimong e-surat na adres dae ipagbuyagyag kunsoarin na an ibang paragamit mak
'action-userrights-interwiki' => 'liwaton an paragamit na mga karapatan kan mga paragamit nin ibang wikis',
'action-siteadmin' => 'ikandado o dae ikandado an datos-sarayan',
'action-sendemail' => 'magpadara nin mga e-koreo',
+'action-editmywatchlist' => 'liwaton an saimong bantay-listahan',
+'action-viewmywatchlist' => 'tanawon an saimong bantay-listahan',
+'action-viewmyprivateinfo' => 'tanawon an saimong pribadong impormasyon',
+'action-editmyprivateinfo' => 'liwaton an saimong pribadong impormasyon',
# Recent changes
'nchanges' => '$1 {{PLURAL:$1|kaliwatan|mga kaliwatan}}',
+'enhancedrc-since-last-visit' => '$1 {{PLURAL:$1|poon kaidtong huring bisita}}',
+'enhancedrc-history' => 'historiya',
'recentchanges' => 'Dae pa sana nahahaloy na mga kaliwatan',
'recentchanges-legend' => 'Pinakahuring mga option kan mga pagbabago',
'recentchanges-summary' => 'Hanapon an mga pinahuring pagbabâgo sa wiki digdi sa páhinang ini.',
+'recentchanges-noresult' => 'Mayong mga kaliwatan sa laog kan itinaong peryodo na nagtutugmad kaining krayterya.',
'recentchanges-feed-description' => 'Antabayon an pinakahuring dae pa sana nahaloy na mga kaliwatan sa wiki na yaon sa panhungit na ini.',
'recentchanges-label-newpage' => 'Ining pagliwat nakapagmukna nin sarong baguhon na pahina',
'recentchanges-label-minor' => 'Ini saro sanang menor na pagliwat',
@@ -1490,7 +1559,6 @@ An saimong e-surat na adres dae ipagbuyagyag kunsoarin na an ibang paragamit mak
'recentchangeslinked-feed' => 'Mga angay na pagbabàgo',
'recentchangeslinked-toolbox' => 'Kasurugpon na mga kaliwatan',
'recentchangeslinked-title' => 'Mga kaliwatan na katakod sa "$1"',
-'recentchangeslinked-noresult' => 'Warang mga pagbabago sa mga pahinang nakatakod sa itinaong pagkalawig.',
'recentchangeslinked-summary' => "Ini an listahan kan mga pagbabagong ginibo kan dae pa sana nahaloy sa mga pahina na nakatakod gikan sa sarong pinagsambit na pahina (o sa mga miyembro kan sarong pinagsambit na kategorya).
An mga pahina na yaon sa [[Special:Watchlist|saimong Bantay-listahan]] na '''tekstong mahibog'''.",
'recentchangeslinked-page' => 'Pahinang ngaran:',
@@ -1502,8 +1570,7 @@ An mga pahina na yaon sa [[Special:Watchlist|saimong Bantay-listahan]] na '''tek
'reuploaddesc' => 'Ikansela an pagkarga asin magbalik sa porma kan pagkakarga',
'upload-tryagain' => 'Isumite an modipikadong deskripsyon kan sagunson',
'uploadnologin' => 'Dai nakalaog',
-'uploadnologintext' => "Kaipuhan ika si [[Special:UserLogin|nakadagos]]
-para makakarga nin mga ''file''.",
+'uploadnologintext' => 'Kaipo kang $1 tanganing makapagkarga nin mga sagunson.',
'upload_directory_missing' => 'An direktoriyo nin pagkarga ($1) nawawara tabi asin dae maikapagmukna sa paagi kan webserver.',
'upload_directory_read_only' => 'An directoriong pagkarga na ($1) dai puedeng suratan kan serbidor nin web.',
'uploaderror' => 'Salâ an pagkarga',
@@ -1719,7 +1786,6 @@ Para sa pinakamakusog na seguridad, img_auth.php nganay pinagpundo.',
'http-read-error' => 'HTTP na pagbabasa nasasala.',
'http-timed-out' => 'HTTP na kahagadan naubos na an oras.',
'http-curl-error' => 'An kasalaan nagsusungko sa kilyawan: $1',
-'http-host-unreachable' => 'Dae nakakaabot sa kilyawan.',
'http-bad-status' => 'Igwa nin sarong problema habang yaon sa HTTP na kahagadan: $1 $2',
# Some likely curl errors. More could be added from <http://curl.haxx.se/libcurl/c/libcurl-errors.html>
@@ -1747,6 +1813,10 @@ Para sa pinakamakusog na seguridad, img_auth.php nganay pinagpundo.',
'listfiles_size' => 'Sukol',
'listfiles_description' => 'Deskripsión',
'listfiles_count' => 'Mga Bersyon',
+'listfiles-show-all' => 'Minabali kan lumang mga bersyon nin mga imahe',
+'listfiles-latestversion' => 'Sa ngunyan na bersyon',
+'listfiles-latestversion-yes' => 'Iyo',
+'listfiles-latestversion-no' => 'Dae',
# File description page
'file-anchor-link' => 'Sagunson',
@@ -1842,6 +1912,13 @@ Giromdoma baya na mag-tsek para sa iba pang kasugpon sa mga templato bago mo pag
'randompage' => 'Purakan na pahina',
'randompage-nopages' => 'Dae tabi nin mga pahina sa minasunod na {{PLURAL:$2|espasyong-ngaran|mga espasyong-ngaran}}: $1.',
+# Random page in category
+'randomincategory' => 'Purakan na pahina sa kategoriya',
+'randomincategory-invalidcategory' => '"$1" bako sarong balidong pangaran nin kategoriya.',
+'randomincategory-nopages' => 'Mayo nin mga pahina sa [[:Category:$1]].',
+'randomincategory-selectcategory' => 'Magkua nin purakan na pahina gikan sa kategoriya: $1 $2.',
+'randomincategory-selectcategory-submit' => 'Magduman',
+
# Random redirect
'randomredirect' => 'Random na pagredirekta',
'randomredirect-nopages' => 'Mayo nin panukdo-liwat sa espasyong-ngaran na "$1".',
@@ -1867,17 +1944,13 @@ Giromdoma baya na mag-tsek para sa iba pang kasugpon sa mga templato bago mo pag
'statistics-users-active-desc' => 'Mga paragamit na may ginibong aksyon sa nakaaging {{PLURAL:$1|aldaw|$1 mga aldaw}}',
'statistics-mostpopular' => 'mga pinaka pighiling na pahina',
-'disambiguations' => 'Mga pahinang minatulay pasiring sa pampalinaw na mga pahina',
-'disambiguationspage' => 'Template:kapaliwanagan',
-'disambiguations-text' => "An mga minasunod na mga pahina igwang laog nin kisera sarong tulay pasiring sa '''pampalinaw na pahina'''.
-Sinda mapuwedeng makipagsugpon pasiring sa sarong mas manigong pahina nanggad.<br />
-An sarong pahina tratado bilang pampalinaw na pahina kun ini minagamit nin sarong templato na nakasugpon gikan sa [[MediaWiki:Disambiguationspage]].",
-
'pageswithprop' => 'Mga pahina na igwang pahina nin kagrugaring',
'pageswithprop-legend' => 'Mga pahina na igwang pahina nin kagrugaring',
'pageswithprop-text' => 'Ining mahina naglilista kan mga pahina na minagamit nin partikular na pahina nin kagrugaring.',
'pageswithprop-prop' => 'Kagrugaring na pangaran:',
'pageswithprop-submit' => 'Larga',
+'pageswithprop-prophidden-long' => 'halawigon na pampropriyedad na tekstong halaga na ipinagtago ($1)',
+'pageswithprop-prophidden-binary' => 'binaryong propriyedad na an halaga ipinagtago ($1)',
'doubleredirects' => 'Dobleng mga redirekta',
'doubleredirectstext' => 'Ining pahina minalista nin mga pahina na minatukdo liwat pasiring sa pinagtukdong-liwat na mga pahina.
@@ -1936,6 +2009,7 @@ Ini ngunyan minatukdo-liwat pasiring sa [[$2]].',
'mostrevisions' => 'Mga artikulong may pinakadakol na pagpakarháy',
'prefixindex' => 'Gabos na mga pahina na igwa nin enotang panigmit',
'prefixindex-namespace' => 'Gabos na mga pahina na igwa nin enotang panigmit ($1 espasyong ngaran)',
+'prefixindex-strip' => 'Waknison an pangenot na panigmit na yaon sa listahan',
'shortpages' => 'Haralìpot na pahina',
'longpages' => 'Mga halabang pahina',
'deadendpages' => 'Mga pahinang mayong luwasan',
@@ -2129,10 +2203,9 @@ An maabot na mga pagbabâgo sa páhinang ini asin sa asosyadong páhina nin olay
'unwatchthispage' => 'Pondohon an pagbantay',
'notanarticle' => 'Bakong páhina nin laog',
'notvisiblerev' => 'An huring rebisyon kan ibang paragamit pinagpura na',
-'watchnochange' => 'Mayo sa saimong mga pigbabantayan an nahira sa laog nin pinahiling na pagkalawig.',
'watchlist-details' => '{{PLURAL:$1|$1 pahina|$1 mga pahina}} sa saimong bantay-listahan, dae binibilang an mga pahina nin orolayan.',
-'wlheader-enotif' => "* Nakaandar an paising ''e''-surat.",
-'wlheader-showupdated' => "* An mga páhinang pigbâgo poon kan huri mong bisita nakasurat nin '''mahîbog'''",
+'wlheader-enotif' => 'E-surat na paisi pinagpaandar na.',
+'wlheader-showupdated' => "Mga pahina na pinagriliwat poon kaidtong huri kang nagbisita sainda ipinapatanaw na '''mahîbog'''",
'watchmethod-recent' => 'Pigsososog an mga kaaagi pa sanang hirá sa mga pigbabantayan na páhina',
'watchmethod-list' => 'Pigsososog an mga pigbabantayan na páhina para mahiling an mga kaaagi pa sanan paghirá',
'watchlistcontains' => 'An saimong lista nin pigbabantayan igwang $1 na {{PLURAL:$1|páhina|mga páhina}}.',
@@ -2380,7 +2453,7 @@ $1",
'contributions' => '{{GENDER:$1|Paragamit}} na mga kaambagan',
'contributions-title' => 'Mga kontribusyon kan paragamit para sa $1',
'mycontris' => 'Mga Kaarambagan',
-'contribsub2' => 'Para sa $1 ($2)',
+'contribsub2' => 'Para ki $1($2)',
'nocontribs' => 'Mayong mga pagbabago na nahanap na kapadis sa ining mga criteria.',
'uctop' => '(sa ngunyan)',
'month' => 'Poon bulan (asin mas amay):',
@@ -2538,14 +2611,12 @@ Hilngon sa [[Special:BlockList|listahan nin kubkob]] para sa listahan kan presen
Ini, baya, pinagkubkob bilang parte kan hidwas $2, na mapuwedeng daemakukubkob.',
'ip_range_invalid' => 'Dai pwede ining serye nin IP.',
'ip_range_toolarge' => 'An hidwas kan mga kubkob dakulaon kesa /$1 dae pinagtutugutan.',
-'blockme' => 'Kubkuba ako',
'proxyblocker' => 'Parabagát na karibay',
-'proxyblocker-disabled' => 'Ining punksyon pinag-untok.',
'proxyblockreason' => 'Binagat an saimong direccion nin IP ta ini sarong bukas na proxy. Apodon tabi an saimong Internet service provider o tech support asin ipaaram sainda ining seriosong problema nin seguridad.',
-'proxyblocksuccess' => 'Tapos.',
'sorbsreason' => 'An saimong IP na estada pinaglista bilang sarong bukas na proksi sa lang kan DNSBL na ginagamit kan {{SITENAME}}.',
'sorbs_create_account_reason' => 'An saimong IP na estada pinaglista bilang sarong bukas na proksi sa laog kan DNSBL na ginagamit kan {{SITENAME}}.
Ika dae makakamukna nin sarong panindog.',
+'xffblockreason' => 'An yaong IP adres sa laog nin X-Pinagtulod-Para sa kapamayuhan, dawa saimo o idtong proksing serbidor na saimong ginagamit, pinagkubkob. An orihinal na rason sa pagkubkob iyo na:$1',
'cant-block-while-blocked' => 'Ika dae makakakubkob kan ibang mga paragamit mantang ika nakukubkob pa.',
'cant-see-hidden-user' => 'An paragamit na pinagpubaran mong kubkubon pinagkubkob asin pinagtago na. Mala ta ika mayo nin karapatan na magtago nin paragamit, ika dae makakahiling or makakaliwat kan kinubkob na paragamit.',
'ipbblocked' => 'Ika da makakakubkob or maghale nin kubkob sa ibang mga paragamit, nin huli ta ika mismo sa sadiri mo pinagkubkob na',
@@ -2704,6 +2775,8 @@ Pakibisita an [//www.mediawiki.org/wiki/Localisation Mediawiki Lokalisasyon] asi
'thumbnail-more' => 'Padakuláon',
'filemissing' => "Nawawarâ an ''file''",
'thumbnail_error' => 'Kasalaan sa pagmumukna kan sadit na litrato: $1',
+'thumbnail_error_remote' => 'Mensahe nin kasalaan gikan sa $1:
+$2',
'djvu_page_error' => 'luwas sa serye an páhina kan DjVu',
'djvu_no_xml' => 'Dai makua an XML para sa DjVu file',
'thumbnail-temp-create' => 'Dae nakamukna nin temporaryong sagunson kan retrato',
@@ -2935,8 +3008,6 @@ Ini hurot na pinagkausa nin sarong sugpunan pasiring sa sarong pinagbawal na pan
'pageinfo-category-files' => 'Bilang nin mga sagunson',
# Skin names
-'skinname-standard' => 'Klasiko',
-'skinname-simple' => 'Simple',
'skinname-modern' => 'Bago',
# Patrolling
@@ -3014,11 +3085,25 @@ Sa pagpapa-andar kaini, an saimong sistema mapupuwedeng makompromiso.",
'minutes' => '{{PLURAL:$1|$1 minuto|$1 minutos}}',
'hours' => '{{PLURAL:$1|$1 oras}}',
'days' => '{{PLURAL:$1|$1 aldaw|$1 mga aldaw}}',
+'weeks' => '{{PLURAL:$1|$1 semana|$1 mga semana}}',
'months' => '{{PLURAL:$1|$1 bulan|$1 mga bulan}}',
'years' => '{{PLURAL:$1|$1 taon|$1 mga taon}}',
'ago' => '$1 nakaagi',
'just-now' => 'ngunyan sana',
+# Human-readable timestamps
+'hours-ago' => '$1 {{PLURAL:$1|oras|mga oras}} na nakaagi pa sana',
+'minutes-ago' => '$1 {{PLURAL:$1|minuto|minutos}} na nakaagi pa sana',
+'seconds-ago' => '$1 {{PLURAL:$1|segundo|mga segundo}} na nakaagi pa sana',
+'monday-at' => 'Lunes mga $1',
+'tuesday-at' => 'Martes mga $1',
+'wednesday-at' => 'Miyerkules mga $1',
+'thursday-at' => 'Huwebes mga $1',
+'friday-at' => 'Biyernes mga $1',
+'saturday-at' => 'Sabado mga $1',
+'sunday-at' => 'Domingo mga $1',
+'yesterday-at' => 'Kasuodma mga $1',
+
# Bad image list
'bad_image_list' => 'An pormat iyo ining minasunod:
@@ -3048,7 +3133,7 @@ An mga iba pagtatagoon sa paagi nin pirmehan.
* gpspalaba
* gpspalangkaw',
-# EXIF tags
+# Exif tags
'exif-imagewidth' => 'Lakbáng',
'exif-imagelength' => 'Langkáw',
'exif-bitspersample' => 'Panaradit kada komponente',
@@ -3227,7 +3312,7 @@ Sublokas kan siyudad na ipinahiling',
'exif-originalimageheight' => 'Langkaw kan imahe bago ini pinagkrap',
'exif-originalimagewidth' => 'Lakbang kan imahe bago ini pinagkrap',
-# EXIF attributes
+# Exif attributes
'exif-compression-1' => 'Pinaghalugaan',
'exif-compression-2' => 'CCITT Grupong 3 1-Dimensyonal na pagbabago ni Huffman nagdadalagan nin halawig na pag-enkod',
'exif-compression-3' => 'CCITT Grupong 3 pinag-enkod sa fax',
@@ -3618,7 +3703,6 @@ Pwede mo man [[Special:EditWatchlist|gamiton an standard editor]].',
'version-other' => 'An iba pa',
'version-mediahandlers' => 'Mga Midyang Tagakapot',
'version-hooks' => 'Mga pangawil',
-'version-extension-functions' => 'Mga punksyon kan ekstensyon',
'version-parser-extensiontags' => 'Mga ekstensyong panmarka kan Parser',
'version-parser-function-hooks' => 'Mga panpunksyong pangawil kan Parser',
'version-hook-name' => 'Ngaran kan pangawil',
@@ -3627,6 +3711,7 @@ Pwede mo man [[Special:EditWatchlist|gamiton an standard editor]].',
'version-license' => 'Lisensiya',
'version-poweredby-credits' => "An wiking ini pinagpagana kan '''[//www.mediawiki.org/ MediaWiki]''', copyright © 2001-$1 $2.",
'version-poweredby-others' => 'mga iba pa',
+'version-poweredby-translators' => 'translatewiki.net na mga paradakit-taramon',
'version-credits-summary' => 'Gusto niyamong rekonosiron an minasunod na mga persona nin huli kan saindang ambag sa [[Special:Version|Mediawiki]].',
'version-license-info' => 'An MediaWiki sarong libreng kasungatan; puwede mong ipanao ini asin/o baguhon ini sa irarom kan termino nin HNU (Heneral na Pampublikong Lisensiya) bilang publisado kan Free Software Foundation; maski sa arin na bersyon 2 kan lisensiya, o (saimong pansadireng pagpipilian) arinman na huring bersyon.
@@ -3640,12 +3725,17 @@ Ika dapat na nakapagresibe na kan [{{SERVER}}{{SCRIPTPATH}}/COPYING sarong kopya
'version-entrypoints-header-entrypoint' => 'Puntong pan-entrada',
'version-entrypoints-header-url' => 'Kilyawan',
-# Special:FilePath
-'filepath' => 'Pansagunsong agihan',
-'filepath-page' => 'Sagunson:',
-'filepath-submit' => 'Magduman',
-'filepath-summary' => 'Ining espesyal na pahina minapabalik kan kumpletong agihan para sa sarong sagunson.
-Mga imahe ipinapahiling sa bilog na resolusyon, an iba pang tipo nin mga sagunson pinagpapoon nin direkta kan saindang asosyadong programa.',
+# Special:Redirect
+'redirect' => 'Palikwatong sa paagi nin sagunson, paragamit, or rebisyon kan ID',
+'redirect-legend' => 'Palikwatong pasiring sa sarong sagunson o pahina',
+'redirect-summary' => 'Ining espesyal na pahina minalikwat pasiring sa sarong sagunson (ipinagtao an ngaran kan sagunson), sarong pahina (ipinagtao an sarong rebisyon kan ID), o sarong pahina nin paragamit (ipinagtao an numerikong ID nin paragamit).',
+'redirect-submit' => 'Dumani',
+'redirect-lookup' => 'Hanapon mo',
+'redirect-value' => 'Halaga:',
+'redirect-user' => 'ID nin Paragamit',
+'redirect-revision' => 'Rebisyon kan Pahina',
+'redirect-file' => 'Ngaran nin Sagunson',
+'redirect-not-exists' => 'Halaga dae nanagboan',
# Special:FileDuplicateSearch
'fileduplicatesearch' => 'Maghanap kan duplikadong mga sagunson',
@@ -3694,6 +3784,7 @@ Mga imahe ipinapahiling sa bilog na resolusyon, an iba pang tipo nin mga sagunso
'tags' => 'Balidong mga marka nin kaliwatan',
'tag-filter' => '[[Special:Tags|Tag]] saraon:',
'tag-filter-submit' => 'Saraan',
+'tag-list-wrapper' => '([[Special:Tags|{{PLURAL:$1|Tatak|Mga Tatak}}]]: $2)',
'tags-title' => 'Mga marka',
'tags-intro' => 'Ining pahina minalista kan mga marka na an kasungatan mapuwedeng maimarka an pagliwat kaini, asin an saindang mga kahulugan.',
'tags-tag' => 'Ngarang panmarka',
@@ -3720,6 +3811,7 @@ Mga imahe ipinapahiling sa bilog na resolusyon, an iba pang tipo nin mga sagunso
'dberr-problems' => 'Sori! Ining sityo igwang naeksperiyensiyahan na mga kakundian sa teknikal.',
'dberr-again' => 'Prubaring maghalat tabi nin nagkapirang minutos asin otrohon ikarga.',
'dberr-info' => '(Dae makakontak sa serbidor kan datos-sarayan: $1)',
+'dberr-info-hidden' => '(Dae makakontak sa serbidor kan datos-sarayan)',
'dberr-usegoogle' => 'Ika puwedeng magprubar na maghanap sa Google nguna.',
'dberr-outofdate' => 'Pasinon mo tabi na an saindang mga indekso kan satuyang laog puwedeng luwas na sa petsa.',
'dberr-cachederror' => 'Ini sarong nakasaray na kopya kan pinaghahagad na pahina, asin puwedeng bakong angat sa petsa.',
@@ -3735,6 +3827,9 @@ Mga imahe ipinapahiling sa bilog na resolusyon, an iba pang tipo nin mga sagunso
'htmlform-submit' => 'Sumitiron',
'htmlform-reset' => 'Dae idagos an mga kaliwatan',
'htmlform-selectorother-other' => 'An iba',
+'htmlform-no' => 'Habó',
+'htmlform-yes' => 'Iyo',
+'htmlform-chosen-placeholder' => 'Magpili nin sarong opsyon',
# SQLite database support
'sqlite-has-fts' => '$1 na igwang suporta sa kabilogang-teksto nin paghahanap',
@@ -3852,4 +3947,19 @@ Kun bako man, ika makakagamit nin sayon na porma sa ibaba. An saimong komento id
# Image rotation
'rotate-comment' => 'An imahe pinagbirik ni $1 {{PLURAL:$1|grado|mga grado}} hitsado',
+# Limit report
+'limitreport-title' => 'Datos panungdanan kan parabangay:',
+'limitreport-cputime' => 'Oras na ginagamit kan CPU',
+'limitreport-cputime-value' => '$1 {{PLURAL:$1|segundo|segundos}}',
+'limitreport-walltime' => 'Tunay na oras na ginagamit',
+'limitreport-walltime-value' => '$1 {{PLURAL:$1|segundo|segundos}}',
+'limitreport-ppvisitednodes' => 'Bilang kan tagapagsumpay sa pangenot na tagapagprosesong pinagbisita',
+'limitreport-ppgeneratednodes' => 'Bilang kan tagapagsumpay sa pangenot na tagapagprosesong pinagpuyos',
+'limitreport-postexpandincludesize' => 'Bigak kan paskil kabali an sukol',
+'limitreport-postexpandincludesize-value' => '$1/$2 mga bayta',
+'limitreport-templateargumentsize' => 'Sukol kan argumentong panguyog',
+'limitreport-templateargumentsize-value' => '$1/$2 mga bayta',
+'limitreport-expansiondepth' => 'Kinatugmadan kan pinakahalangkaw na kahiwasan',
+'limitreport-expensivefunctioncount' => 'Bilang kan hiro nin mamahalon na parabangay',
+
);
diff --git a/languages/messages/MessagesBe.php b/languages/messages/MessagesBe.php
index aed573ad..85dab072 100644
--- a/languages/messages/MessagesBe.php
+++ b/languages/messages/MessagesBe.php
@@ -120,9 +120,6 @@ $messages = array(
'tog-shownumberswatching' => 'Паказваць колькаÑць назіральнікаў',
'tog-oldsig' => 'ІÑнуючы подпіÑ:',
'tog-fancysig' => 'Ðпрацоўваць Ð¿Ð¾Ð´Ð¿Ñ–Ñ Ñк вікі-Ñ‚ÑкÑÑ‚ (без аўтаматычнай ÑпаÑылкі)',
-'tog-externaleditor' => "КарыÑтацца вонкавай праграмай Ð´Ð»Ñ Ð¿Ñ€Ð°ÑžÐºÑ– (edit); Ñ€Ñкамендуецца толькі Ð´Ð»Ñ ÑпецыÑліÑтаў, бо патрабуе адмыÑловых наÑтаўленнÑÑž на камп'ютары; [//www.mediawiki.org/wiki/Manual:External_editors гл. падрабÑзна.]",
-'tog-externaldiff' => "КарыÑтацца вонкавай праграмай Ð´Ð»Ñ Ð¿Ð°Ñ€Ð°ÑžÐ½Ð°Ð½Ð½Ñ (diff); Ñ€Ñкамендуецца толькі Ð´Ð»Ñ ÑпецыÑліÑтаў, бо патрабуе адмыÑловых наÑтаўленнÑÑž на камп'ютары; [//www.mediawiki.org/wiki/Manual:External_editors гл. падрабÑзна.]",
-'tog-showjumplinks' => 'Дазволіць Ð´Ð°Ð¿Ð°Ð¼Ð¾Ð¶Ð½Ñ‹Ñ ÑпаÑылкі "jump to"',
'tog-uselivepreview' => 'Жывы перадпаказ (ЯваÑкрыпт, ÑкÑперыментальн.)',
'tog-forceeditsummary' => 'ПапÑÑ€Ñджваць пра пуÑтое поле тлумачÑÐ½Ð½Ñ Ð¿Ñ€Ð°ÑžÐºÑ–',
'tog-watchlisthideown' => 'Ðе паказваць у назіраным Ñваіх правак',
@@ -135,6 +132,7 @@ $messages = array(
'tog-diffonly' => 'Ðе паказваць Ñ€Ñшты Ñтаронкі пад розніцай',
'tog-showhiddencats' => 'Паказаць ÑÑ…Ð°Ð²Ð°Ð½Ñ‹Ñ ÐºÐ°Ñ‚Ñгорыі',
'tog-norollbackdiff' => 'Ðе паказваць розніцу Ñž выніку адкату',
+'tog-useeditwarning' => 'ПапÑÑ€Ñдзіць мÑне, калі Ñ Ð¿Ð°ÐºÑ–Ð´Ð°ÑŽ Ñтаронку з незахаванымі праўкамі',
'underline-always' => 'ЗаўÑёды',
'underline-never' => 'Ðіколі',
@@ -198,6 +196,18 @@ $messages = array(
'oct' => 'КаÑ',
'nov' => 'ЛіÑ',
'dec' => 'Сне',
+'january-date' => '$1 ÑтудзенÑ',
+'february-date' => '$1 лютага',
+'march-date' => '$1 Ñакавіка',
+'april-date' => '$1 краÑавіка',
+'may-date' => '$1 маÑ',
+'june-date' => '$1 чÑрвенÑ',
+'july-date' => '$1 ліпенÑ',
+'august-date' => '$1 жніўнÑ',
+'september-date' => '$1 вераÑнÑ',
+'october-date' => '$1 каÑтрычніка',
+'november-date' => '$1 ліÑтапада',
+'december-date' => '$1 ÑнежнÑ',
# Categories related messages
'pagecategories' => '{{PLURAL:$1|КатÑгорыÑ|КатÑгорыі}}',
@@ -279,6 +289,7 @@ $messages = array(
'create-this-page' => 'Стварыць Ñтаронку',
'delete' => 'Ñцерці',
'deletethispage' => 'Сцерці гÑту Ñтаронку',
+'undeletethispage' => 'Ðднавіць гÑту Ñтаронку',
'undelete_short' => 'Ðднавіць {{PLURAL:$1|адну праўку|$1 правак}}',
'viewdeleted_short' => 'Паказаць {{PLURAL:$1|адну Ñцёртую праўку|$1 ÑÑ†Ñ‘Ñ€Ñ‚Ñ‹Ñ Ð¿Ñ€Ð°ÑžÐºÑ–}}',
'protect' => 'Ðхова',
@@ -322,7 +333,7 @@ $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).
+# 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).
'aboutsite' => 'Пра {{GRAMMAR:вінавальны|{{SITENAME}}}}',
'aboutpage' => 'Project:Пра {{GRAMMAR:вінавальны|{{SITENAME}}}}',
'copyright' => 'МатÑрыÑл даÑтупны на ўмовах $1.',
@@ -332,7 +343,6 @@ $1',
'disclaimers' => 'Ðдмова ад адказнаÑці',
'disclaimerpage' => 'Project:ÐÐ³ÑƒÐ»ÑŒÐ½Ð°Ñ Ð°Ð´Ð¼Ð¾Ð²Ð° ад адказнаÑці',
'edithelp' => 'Даведка Ñ€ÑдактарÑкага акна',
-'edithelppage' => 'Help:Праўка',
'helppage' => 'Help:ЗмеÑÑ‚',
'mainpage' => 'Ð“Ð°Ð»Ð¾ÑžÐ½Ð°Ñ Ñтаронка',
'mainpage-description' => 'ÐŸÐµÑ€ÑˆÐ°Ñ Ñтаронка',
@@ -407,18 +417,6 @@ $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' => 'Упішыце прычыну зачыненнÑ, а такÑама меркаваны Ñ‡Ð°Ñ Ð°Ð´Ñ‡Ñ‹Ð½ÐµÐ½Ð½Ñ',
@@ -469,7 +467,6 @@ $1',
'editinginterface' => "'''Увага:''' Ð’Ñ‹ правіце Ñтаронку, ÑÐºÐ°Ñ ÑžÑ‚Ñ€Ñ‹Ð¼Ð»Ñ–Ð²Ð°Ðµ Ñ‚ÑкÑÑ‚ карыÑтальніцкага інтÑрфейÑу.
Яе змÑненне паўплывае на вонкавы выглÑд праграмы Ð´Ð»Ñ ÑžÑÑ–Ñ… удзельнікаў.
Праект лакалізацыі MediaWiki: [//translatewiki.net/wiki/Main_Page?setlang=be translatewiki.net].",
-'sqlhidden' => '(зварот SQL не паказаны)',
'cascadeprotected' => 'Старонка знаходзіцца пад аховай ад правак, таму што Ñна ўлучана Ñž наÑтупн{{PLURAL:$1|ую Ñтаронку|Ñ‹Ñ Ñтаронкі}}, ÑÐºÑ–Ñ Ð°Ñ…Ð¾ÑžÐ²Ð°ÑŽÑ†Ñ†Ð° з магчымаÑцю "каÑкаднага раÑпаўÑюджваннÑ" аховы:
$2',
'namespaceprotected' => "Вам не дазволена правіць Ñтаронкі Ñž праÑторы назваў '''$1'''.",
@@ -492,10 +489,18 @@ $2',
'welcomecreation-msg' => 'Ваш рахунак быў Ñтвораны.
Ðе забудзьцеÑÑ Ð´Ð°Ð¿Ð°Ñаваць [[Special:Preferences|перÑÐ°Ð½Ð°Ð»ÑŒÐ½Ñ‹Ñ Ð½Ð°Ñтаўленні]] Ð´Ð»Ñ {{SITENAME}}.',
'yourname' => 'Ð†Ð¼Ñ ÑžÐ´Ð·ÐµÐ»ÑŒÐ½Ñ–ÐºÐ°',
+'userlogin-yourname' => 'Ð†Ð¼Ñ ÑžÐ»Ñ–ÐºÐ¾Ð²Ð°Ð³Ð° запіÑу',
+'userlogin-yourname-ph' => 'УвÑдзіце Ñ–Ð¼Ñ Ð²Ð°ÑˆÐ°Ð³Ð° ўліковага запіÑу',
'yourpassword' => 'Пароль',
+'userlogin-yourpassword' => 'Пароль',
+'userlogin-yourpassword-ph' => 'УвÑдзіце ваш пароль',
+'createacct-yourpassword-ph' => 'УвÑдзіце пароль',
'yourpasswordagain' => 'Паўтарыце пароль',
+'createacct-yourpasswordagain' => 'Пацвердзіце пароль',
+'createacct-yourpasswordagain-ph' => 'УвÑдзіце пароль ÑÑˆÑ‡Ñ Ñ€Ð°Ð·',
'remembermypassword' => "ПамÑтаць мÑне на гÑтым камп'ютары (не даўжÑй за $1 {{PLURAL:$1|дзень|дзён}})",
-'securelogin-stick-https' => 'ПрацÑгваць злучÑнне па HTTPS паÑÐ»Ñ ÑžÐ²Ð°Ñ…Ð¾Ð´Ð°',
+'userlogin-remembermypassword' => 'ЗаÑтавацца Ñž ÑÑ–ÑÑ‚Ñме',
+'userlogin-signwithsecure' => 'ВыкарыÑтоўваць абароненае злучÑнне',
'yourdomainname' => 'Ваш дамен',
'externaldberror' => 'Ðбо памылка вонкавай аўтÑнтыкацыі Ñž базе дадзеных, або вам не дазволена абнаўлÑць Ñвой вонкавы рахунак.',
'login' => 'УвайÑці Ñž ÑÑ–ÑÑ‚Ñму',
@@ -582,7 +587,7 @@ $2',
'newpassword' => 'Ðовы пароль:',
'retypenew' => 'Ðовы пароль паўторна:',
'resetpass_submit' => 'ÐаÑтавіць пароль Ñ– ўвайÑці',
-'resetpass_success' => 'Ваш пароль паÑпÑхова зменены! ЦÑпер уваходзім...',
+'changepassword-success' => 'Ваш пароль паÑпÑхова зменены! ЦÑпер уваходзім...',
'resetpass_forbidden' => 'Ðе дазволена мÑнÑць паролі',
'resetpass-no-info' => 'ТрÑба ўвайÑці Ñž ÑÑ–ÑÑ‚Ñму, каб звÑртацца да гÑтай Ñтаронкі наўпроÑÑ‚.',
'resetpass-submit-loggedin' => 'ЗмÑніць пароль',
@@ -593,10 +598,8 @@ $2',
# Special:PasswordReset
'passwordreset' => 'Ð’Ñ‹Ñлаць мне новы пароль',
-'passwordreset-text' => 'Запоўніце гÑтую форму, каб атрымаць па Ñлектроннай пошце напамін вашага акаўнта.',
'passwordreset-legend' => 'ПераўÑтанавіць пароль',
'passwordreset-disabled' => 'Ð¤ÑƒÐ½ÐºÑ†Ñ‹Ñ Ð¿ÐµÑ€Ð°ÑžÑталёўкі Ð¿Ð°Ñ€Ð¾Ð»Ñ Ð°Ð´ÐºÐ»ÑŽÑ‡Ð°Ð½Ð°Ñ Ð½Ð° гÑтай вікі.',
-'passwordreset-pretext' => '{{PLURAL:$1||Калі лаÑка, увÑдзіце адзін з фрагментаў дадзеных ніжÑй}}',
'passwordreset-username' => 'Ð†Ð¼Ñ ÑžÐ´Ð·ÐµÐ»ÑŒÐ½Ñ–ÐºÐ°',
'passwordreset-domain' => 'Дамен:',
'passwordreset-capture' => 'ПраглÑдзець напіÑаны ліÑÑ‚?',
@@ -819,8 +822,11 @@ $2
Здаецца, што Ñна была ÑцёртаÑ.',
'edit-conflict' => 'Канфлікт правак.',
'edit-no-change' => 'Ð’Ð°ÑˆÐ°Ñ Ð¿Ñ€Ð°ÑžÐºÐ° была праігнараванаÑ, таму што не мÑнÑÑžÑÑ Ñ‚ÑкÑÑ‚.',
+'postedit-confirmation' => 'Ð’Ð°ÑˆÐ°Ñ Ð¿Ñ€Ð°ÑžÐºÐ° была захаванаÑ.',
'edit-already-exists' => 'Ðе ўдалоÑÑ Ñтварыць новую Ñтаронку.
Ð¢Ð°ÐºÐ°Ñ ÑžÐ¶Ð¾ Ñ–Ñнуе.',
+'editwarning-warning' => 'Выхад з гÑтай Ñтаронкі прывÑдзе да Ñтраты правак, ÑÐºÑ–Ñ Ð²Ñ‹ зрабілі.
+Калі Ð’Ñ‹ зарÑгіÑÑ‚Ñ€Ð°Ð²Ð°Ð½Ñ‹Ñ Ñž ÑÑ–ÑÑ‚Ñме, Ð’Ñ‹ можаце адключыць гÑта папÑÑ€Ñджанне Ñž закладцы "Праца" Вашых наÑтаўленнÑÑž.',
# Content models
'content-model-wikitext' => 'вікі-Ñ‚ÑкÑÑ‚',
@@ -1045,7 +1051,6 @@ $1",
'searchmenu-legend' => 'ÐаÑтаўленні пошуку',
'searchmenu-exists' => "'''Ðа вікі Ñ‘Ñць Ñтаронка \"[[:\$1]]\"'''",
'searchmenu-new' => "'''Стварыць на гÑтай вікі Ñтаронку \"[[:\$1]]\"'''",
-'searchhelp-url' => 'Help:ЗмеÑÑ‚',
'searchmenu-prefix' => '[[Special:PrefixIndex/$1|Паказаць Ñтаронкі з гÑтым прÑфікÑам]]',
'searchprofile-articles' => 'Ðртыкулы',
'searchprofile-project' => 'Старонкі даведкі і праекта',
@@ -1087,15 +1092,6 @@ $1",
'search-external' => 'Вонкавы пошук',
'searchdisabled' => 'Ð¤ÑƒÐ½ÐºÑ†Ñ‹Ñ Ð¿Ð¾ÑˆÑƒÐºÑƒ {{SITENAME}} не працуе. ТымчаÑова можна шукаць з дапамогай Google. Заўважце, што тамтÑÐ¹ÑˆÑ‹Ñ Ñ–Ð½Ð´ÑкÑÑ‹ змеÑту {{SITENAME}} могуць не быць актуальнымі.',
-# Quickbar
-'qbsettings' => 'Ð¥ÑƒÑ‚ÐºÐ°Ñ Ñтужка',
-'qbsettings-none' => 'ÐÑма',
-'qbsettings-fixedleft' => 'Прымацавана злева',
-'qbsettings-fixedright' => 'Прымацавана Ñправа',
-'qbsettings-floatingleft' => 'Плавае злева',
-'qbsettings-floatingright' => 'Плавае Ñправа',
-'qbsettings-directionality' => 'ФікÑаванаÑ, у залежнаÑці ад Ð½Ð°ÐºÑ–Ñ€Ð°Ð²Ð°Ð½Ð½Ñ Ð²Ð°ÑˆÐ°Ð¹ мовы',
-
# Preferences page
'preferences' => 'ÐаÑтаўленні',
'mypreferences' => 'ÐаÑтáўленні',
@@ -1127,7 +1123,6 @@ $1",
'resetprefs' => 'Да пачатковых',
'restoreprefs' => 'Ðднавіць уÑе прадвызначÑнні',
'prefs-editing' => 'Праца',
-'prefs-edit-boxsize' => 'Памер Ñ€ÑдактарÑкага акна.',
'rows' => 'Радкі:',
'columns' => 'Калонкі:',
'searchresultshead' => 'Пошук',
@@ -1138,9 +1133,6 @@ $1",
'recentchangesdays-max' => '(найбольш $1 {{PLURAL:$1|дзень|дзён}})',
'recentchangescount' => 'ÐŸÑ€Ð°Ð´Ð²Ñ‹Ð·Ð½Ð°Ñ‡Ð°Ð½Ð°Ñ ÐºÐ¾Ð»ÑŒÐºÐ°Ñць правак Ð´Ð·ÐµÐ»Ñ Ð¿Ð°ÐºÐ°Ð·Ñƒ:',
'prefs-help-recentchangescount' => 'ГÑта ўключае Ñž ÑÑбе Ð°Ð¿Ð¾ÑˆÐ½Ñ–Ñ Ð·Ð¼ÐµÐ½Ñ‹, гіÑторыі Ñтаронак, журналы.',
-'prefs-help-watchlist-token' => 'УпіÑанне ÑакрÑтнага ключа Ñž гÑтае поле Ñтворыць RSS-Ñтрумень з вашага ÑпіÑу назіранага.
-Кожны, каму вÑдомы гÑÑ‚Ñ‹ ключ, зможа чытаць ваш ÑÐ¿Ñ–Ñ Ð½Ð°Ð·Ñ–Ñ€Ð°Ð½Ð°Ð³Ð°, таму выбірайце бÑÑÐ¿ÐµÑ‡Ð½Ñ‹Ñ ÐºÐ»ÑŽÑ‡Ñ‹.
-ВоÑÑŒ аўта-згенераваны ключ, Ñкі можна выкарыÑтаць: $1',
'savedprefs' => 'ÐаÑтáўленні замацаваныÑ.',
'timezonelegend' => 'ЧаÑавы поÑÑ:',
'localtime' => 'ÐœÑÑцовы чаÑ:',
@@ -1171,7 +1163,6 @@ $1",
'prefs-reset-intro' => 'Тут можна вÑрнуць Ñвае наÑтаўленні да прадвызначÑннÑÑž, прынÑÑ‚Ñ‹Ñ… на гÑтай плÑцоўцы.
Ðдкаціць гÑтае дзеÑнне нельга.',
'prefs-emailconfirm-label' => 'Пацверджанне адраÑу Ñл.пошты:',
-'prefs-textboxsize' => 'Памер акна Ñ€ÑдагаваннÑ',
'youremail' => 'Эл.пошта *',
'username' => 'Ð†Ð¼Ñ ÑžÐ´Ð·ÐµÐ»ÑŒÐ½Ñ–ÐºÐ°:',
'uid' => 'ID удзельніка:',
@@ -1406,7 +1397,6 @@ $1",
'recentchangeslinked-feed' => 'ЗвÑÐ·Ð°Ð½Ñ‹Ñ Ð¿Ñ€Ð°ÑžÐºÑ–',
'recentchangeslinked-toolbox' => 'ЗвÑÐ·Ð°Ð½Ñ‹Ñ Ð¿Ñ€Ð°ÑžÐºÑ–',
'recentchangeslinked-title' => 'ЗмÑненні, ÑÐºÑ–Ñ Ð´Ð°Ñ‚Ñ‹Ñ‡Ð°Ñ†ÑŒ "$1"',
-'recentchangeslinked-noresult' => 'Без змÑненнÑÑž на далучаных Ñтаронках за азначаны перыÑд.',
'recentchangeslinked-summary' => "ГÑта пералік нÑдаўніх змÑненнÑÑž Ñтаронак, на ÑÐºÑ–Ñ ÑпаÑылаецца Ð°Ð·Ð½Ð°Ñ‡Ð°Ð½Ð°Ñ Ñтаронка, або змÑненнÑÑž Ñкладнікаў азначанай катÑгорыі.
Старонкі, ÑÐºÑ–Ñ ÑžÐ²Ð°Ñ…Ð¾Ð´Ð·Ñць у [[Special:Watchlist|лік назіраных вамі]], выдзелены '''Ñтылем'''.",
'recentchangeslinked-page' => 'Ðазва Ñтаронкі:',
@@ -1612,7 +1602,6 @@ $1',
'http-read-error' => 'Памылка Ñ‡Ñ‹Ñ‚Ð°Ð½Ð½Ñ HTTP',
'http-timed-out' => 'Мінуў Ñ‡Ð°Ñ Ñ‡Ð°ÐºÐ°Ð½Ð½Ñ HTTP-запыту.',
'http-curl-error' => 'Памылка звароту да URL: $1',
-'http-host-unreachable' => 'Ðе ўдалоÑÑ Ð°Ð´ÐºÑ€Ñ‹Ñ†ÑŒ URL',
'http-bad-status' => 'Пад Ñ‡Ð°Ñ Ð°Ð¿Ñ€Ð°Ñ†Ð¾ÑžÐºÑ– HTTP-запыту выÑўлена праблема: $1 $2',
# Some likely curl errors. More could be added from <http://curl.haxx.se/libcurl/c/libcurl-errors.html>
@@ -1754,12 +1743,6 @@ $1',
'statistics-users-active-desc' => 'Удзельнікі, ÑÐºÑ–Ñ Ñ…Ð¾Ñ†ÑŒ нешта зрабілі за апошн{{PLURAL:$1|Ñ– дзень|Ñ–Ñ $1 дзён}}',
'statistics-mostpopular' => 'Ð¡Ð°Ð¼Ñ‹Ñ Ð¿Ð°Ð¿ÑƒÐ»ÑÑ€Ð½Ñ‹Ñ Ñтаронкі',
-'disambiguations' => 'Старонкі, ÑÐºÑ–Ñ ÑпаÑылаюцца на Ñтаронкі вырашÑÐ½Ð½Ñ Ð½ÐµÐ°Ð´Ð½Ð°Ð·Ð½Ð°Ñ‡Ð½Ð°ÑцÑÑž',
-'disambiguationspage' => 'Template:ÐеадназначнаÑць',
-'disambiguations-text' => "ГÑÑ‚Ñ‹Ñ Ñтаронкі ÑпаÑылаюцца на '''Ñтаронкі развÑзкі неадназначнаÑцÑÑž'''.
-Лепей, каб Ñны ÑпаÑылаліÑÑ Ð½Ð° канкрÑÑ‚Ð½Ñ‹Ñ Ñ‚ÑÐ¼Ð°Ñ‚Ñ‹Ñ‡Ð½Ñ‹Ñ Ñтаронкі.<br />
-Старонка лічыцца Ñтаронкай развÑзкі, калі Ñž Ñе ўлучаецца такі шаблон, на Ñкі ÑпаÑылаецца [[MediaWiki:Disambiguationspage]]",
-
'doubleredirects' => 'ÐŸÐ°Ð´Ð²Ð¾Ð¹Ð½Ñ‹Ñ Ð¿ÐµÑ€Ð°Ñылкі',
'doubleredirectstext' => 'Тут Ð¿ÐµÑ€Ð°Ð»Ñ–Ñ‡Ð°Ð½Ñ‹Ñ Ñтаронкі-пераÑылкі, ÑÐºÑ–Ñ Ð¿Ð°ÐºÐ°Ð·Ð²Ð°ÑŽÑ†ÑŒ на Ñ–Ð½ÑˆÑ‹Ñ Ð¿ÐµÑ€Ð°Ñылкі.
Кожны радок утрымлівае ÑпаÑылкі на першую Ñ– другую пераÑылкі, а такÑама мÑту другой пераÑылкі, ÑÐºÐ°Ñ Ð·Ð²Ñ‹Ñ‡Ð°Ð¹Ð½Ð° Ñ– Ñ‘Ñць "ÑапраўднаÑ" мÑÑ‚Ð°Ð²Ð°Ñ Ñтаронка, на Ñкую павінна была паказваць Ð¿ÐµÑ€ÑˆÐ°Ñ Ð¿ÐµÑ€Ð°Ñылка.
@@ -1998,10 +1981,9 @@ $1',
'unwatchthispage' => 'Спыніць назіранне',
'notanarticle' => 'ГÑта не змÑÑÑ‚Ð¾ÑžÐ½Ð°Ñ Ñтаронка',
'notvisiblerev' => 'ВерÑÑ–Ñ ÑцёртаÑ',
-'watchnochange' => 'Ðіводзін з назіраных Ñкладнікаў не быў зменены за паказаны перыÑд.',
'watchlist-details' => 'Ðазіраю {{PLURAL:$1|$1 Ñтаронку|$1 Ñтаронак}} без уліку размоўных.',
-'wlheader-enotif' => '* Працуе апавÑшчанне праз Ñл.пошту.',
-'wlheader-showupdated' => "* Старонкі, ÑÐºÑ–Ñ Ð±Ñ‹Ð»Ñ– зменены паÑÐ»Ñ Ð²Ð°ÑˆÐ°Ð³Ð° апошнÑга Ñ–Ñ… наведваннÑ, паказаны '''абрыÑам шрыфту'''.",
+'wlheader-enotif' => 'Працуе апавÑшчанне праз Ñл.пошту.',
+'wlheader-showupdated' => "Старонкі, ÑÐºÑ–Ñ Ð±Ñ‹Ð»Ñ– зменены паÑÐ»Ñ Ð²Ð°ÑˆÐ°Ð³Ð° апошнÑга Ñ–Ñ… наведваннÑ, паказаны '''абрыÑам шрыфту'''.",
'watchmethod-recent' => 'правÑраем нÑÐ´Ð°ÑžÐ½Ñ–Ñ Ð¿Ñ€Ð°ÑžÐºÑ– Ñž назіраных Ñтаронках',
'watchmethod-list' => 'правÑраем наÑўнаÑць нÑдаўніх правак Ñž назіраных Ñтаронках',
'watchlistcontains' => 'У вашым ÑпіÑе назіранага $1 {{PLURAL:$1|Ñтаронка|Ñтаронак}}.',
@@ -2381,12 +2363,9 @@ $1',
'ipb_blocked_as_range' => 'Ðельга знÑць блок з IP-адраÑу $1, таму што ён заблакаваны не наўпроÑÑ‚, але Ñк чаÑтка абÑÑгу $2; той абÑÑг, у Ñваю чаргу, можна разблакоўваць.',
'ip_range_invalid' => 'ÐÑправільны абÑÑг IP.',
'ip_range_toolarge' => 'Блакіроўкі дыÑпазонаў звыш /$1 забаронены.',
-'blockme' => 'Заблакаваць ÑÑбе',
'proxyblocker' => 'Блакіратар прокÑÑ–',
-'proxyblocker-disabled' => 'ГÑта Ñ„ÑƒÐ½ÐºÑ†Ñ‹Ñ Ð²Ñ‹ÐºÐ»ÑŽÑ‡Ð°Ð½Ð°Ñ.',
'proxyblockreason' => "Ваш Ð°Ð´Ñ€Ð°Ñ IP заблакаваны, таму што ён належыць да ліку адкрытых прокÑÑ–.
ГÑта Ñур'Ñ‘Ð·Ð½Ð°Ñ Ð¿Ñ€Ð°Ð±Ð»ÐµÐ¼Ð° бÑÑпекі; паведамце пра гÑта Ñвайму ІнтÑрнет-правайдÑру або Ñž Ñлужбу Ñ‚Ñхнічнай падтрымкі.",
-'proxyblocksuccess' => 'Зроблена.',
'sorbsreason' => 'Ваш Ð°Ð´Ñ€Ð°Ñ IP знаходзіцца Ñž ÑпіÑе забароненых адкрытых прокÑÑ–, Ñкім карыÑтаецца {{SITENAME}}.',
'sorbs_create_account_reason' => 'Ваш Ð°Ð´Ñ€Ð°Ñ IP знаходзіцца Ñž ÑпіÑе забароненых адкрытых прокÑÑ–, Ñкім карыÑтаецца {{SITENAME}}.
Ð’Ñ‹ не можаце Ñ€ÑгіÑтравацца',
@@ -2735,13 +2714,8 @@ $1',
'pageinfo-authors' => 'ÐÐ³ÑƒÐ»ÑŒÐ½Ð°Ñ ÐºÐ¾Ð»ÑŒÐºÐ°Ñць розных аўтараў',
# Skin names
-'skinname-standard' => 'КлаÑіка',
-'skinname-nostalgia' => 'ÐаÑтальгіÑ',
'skinname-cologneblue' => 'Сіні Кёльн',
'skinname-monobook' => 'Манабук',
-'skinname-myskin' => 'МайÑкін',
-'skinname-chick' => 'Чык',
-'skinname-simple' => 'ПроÑта',
'skinname-modern' => 'СучаÑнаÑць',
# Patrolling
@@ -2841,7 +2815,7 @@ $1',
* gpslongitude
* gpsaltitude',
-# EXIF tags
+# Exif tags
'exif-imagewidth' => 'ШырынÑ',
'exif-imagelength' => 'ВышынÑ',
'exif-bitspersample' => 'Бітаў на кампанент',
@@ -3020,7 +2994,7 @@ $1',
'exif-originalimageheight' => 'Ð’Ñ‹ÑˆÑ‹Ð½Ñ Ð¼Ð°Ð»ÑŽÐ½ÐºÐ° да кадраваннÑ',
'exif-originalimagewidth' => 'Ð¨Ñ‹Ñ€Ñ‹Ð½Ñ Ð¼Ð°Ð»ÑŽÐ½ÐºÐ° да кадраваннÑ',
-# EXIF attributes
+# Exif attributes
'exif-compression-1' => 'ÐÑÑціÑнута',
'exif-compression-2' => 'CCITT Group 3, 1-Ð¼ÐµÑ€Ð½Ð°Ñ Ð¼Ð°Ð´Ñ‹Ñ„Ñ–ÐºÐ°Ñ†Ñ‹Ñ ÐºÐ°Ð´Ð·Ñ–Ñ€Ð°Ð²Ð°Ð½Ð½Ñ Ð´Ð°ÑžÐ¶Ñ‹Ð½ÑŒ Ñерый Хафмана',
'exif-compression-3' => 'CCITT Group 3, факÑавае кадзіраванне',
@@ -3396,7 +3370,6 @@ $5
'version-other' => 'Рознае',
'version-mediahandlers' => 'Ðпрацоўнікі мультымедый',
'version-hooks' => 'Хукі',
-'version-extension-functions' => 'Функцыі прыÑтаўкі',
'version-parser-extensiontags' => 'Тагі прыÑтаўкі да парÑера',
'version-parser-function-hooks' => 'Хукі функцый парÑера',
'version-hook-name' => 'Ðазва хука',
@@ -3416,13 +3389,6 @@ MediaWiki раÑпаўÑюджваецца, ÑпадзеючыÑÑ Ð½Ð° прыд
'version-entrypoints-header-entrypoint' => 'Кропка ўваходу',
'version-entrypoints-header-url' => 'URL',
-# Special:FilePath
-'filepath' => 'ШлÑÑ… да файла',
-'filepath-page' => 'Файл:',
-'filepath-submit' => 'ПуÑк',
-'filepath-summary' => 'ГÑÑ‚Ð°Ñ Ð°Ð´Ð¼Ñ‹ÑÐ»Ð¾Ð²Ð°Ñ Ñтаронка вÑртае поўны шлÑÑ… да файла.
-Ð’Ñ‹Ñвы паказваюцца Ñž поўным памеры, Ñ–Ð½ÑˆÑ‹Ñ Ñ‚Ñ‹Ð¿Ñ‹ файлаў адкрываюцца Ñž прыпіÑаных да Ñ–Ñ… праграмах.',
-
# Special:FileDuplicateSearch
'fileduplicatesearch' => 'Пошук дублікатных файлаў',
'fileduplicatesearch-summary' => 'Пошук дублікатных файлах на падÑтаве Ñ–Ñ… Ñ…Ñшаў.',
diff --git a/languages/messages/MessagesBe_tarask.php b/languages/messages/MessagesBe_tarask.php
index a3e4e74c..f3e431f7 100644
--- a/languages/messages/MessagesBe_tarask.php
+++ b/languages/messages/MessagesBe_tarask.php
@@ -13,6 +13,7 @@
* @author Geitost
* @author Jim-by
* @author Kaganer
+ * @author Nemo bis
* @author Red Winged Duck
* @author Renessaince
* @author Wizardist
@@ -100,6 +101,7 @@ $specialPageAliases = array(
'Uncategorizedpages' => array( 'ÐекатÑгарызаваныÑ_Ñтаронкі' ),
'Uncategorizedtemplates' => array( 'ÐекатÑгарызаваныÑ_шаблёны' ),
'Upload' => array( 'Загрузка' ),
+ 'Userlogin' => array( 'Уваход_у_ÑÑ‹ÑÑ‚Ñму' ),
'Version' => array( 'Ð’ÑÑ€ÑÑ–Ñ' ),
'Wantedcategories' => array( 'ЗапатрабаваныÑ_катÑгорыі' ),
'Wantedfiles' => array( 'ЗапатрабаваныÑ_файлы' ),
@@ -290,9 +292,6 @@ $messages = array(
'tog-shownumberswatching' => 'Паказваць колькаÑьць назіральнікаў',
'tog-oldsig' => 'ЦÑперашні подпіÑ:',
'tog-fancysig' => 'Ðпрацоўваць Ð¿Ð¾Ð´Ð¿Ñ–Ñ Ñк вікі-Ñ‚ÑкÑÑ‚ (без аўтаматычнай ÑпаÑылкі)',
-'tog-externaleditor' => 'ВыкарыÑтоўваць вонкавы Ñ€Ñдактар па змоўчваньні (толькі Ð´Ð»Ñ Ð°Ð´Ð¼Ñ‹Ñлоўцаў, патрабуе ÑпÑцыÑльных наладак на вашым кампутары. [//www.mediawiki.org/wiki/Manual:External_editors ПадрабÑзнаÑьці.])',
-'tog-externaldiff' => 'ВыкарыÑтоўваць вонкавую праграму Ð¿Ð°Ñ€Ð°ÑžÐ½Ð°Ð½ÑŒÐ½Ñ Ð²ÑÑ€ÑÑ–ÑÑž па змоўчваньні (толькі Ð´Ð»Ñ Ð°Ð´Ð¼Ñ‹Ñлоўцаў, патрабуе ÑпÑцыÑльных наладак на вашым кампутары. [//www.mediawiki.org/wiki/Manual:External_editors ПадрабÑзнаÑьці.])',
-'tog-showjumplinks' => 'Ðктываваць Ð´Ð°Ð¿Ð°Ð¼Ð¾Ð¶Ð½Ñ‹Ñ ÑпаÑылкі «перайÑьці да»',
'tog-uselivepreview' => 'ВыкарыÑтоўваць хуткі папÑÑ€Ñдні праглÑд (ÑкÑпÑрымÑнтальна)',
'tog-forceeditsummary' => 'ПапÑÑ€Ñджваць пра адÑутнаÑьць кароткага апіÑÐ°Ð½ÑŒÐ½Ñ Ð·ÑŒÐ¼ÐµÐ½Ð°Ñž',
'tog-watchlisthideown' => 'Хаваць мае праўкі Ñž ÑьпіÑе назіраньнÑ',
@@ -306,6 +305,8 @@ $messages = array(
'tog-showhiddencats' => 'Паказваць ÑÑ…Ð°Ð²Ð°Ð½Ñ‹Ñ ÐºÐ°Ñ‚Ñгорыі',
'tog-noconvertlink' => 'Забараніць канвÑртацыю назваў ÑпаÑылак',
'tog-norollbackdiff' => 'Ðе паказваць зьмены паÑÑŒÐ»Ñ Ð²Ñ‹ÐºÐ°Ñ€Ñ‹ÑÑ‚Ð°Ð½ÑŒÐ½Ñ Ñ„ÑƒÐ½ÐºÑ†Ñ‹Ñ– адкату',
+'tog-useeditwarning' => 'ПапÑÑ€Ñджваць мÑне, калі Ñ Ð±ÑƒÐ´Ñƒ пакідаць Ñтаронку Ñ€ÑÐ´Ð°Ð³Ð°Ð²Ð°Ð½ÑŒÐ½Ñ Ð·ÑŒ незахаванымі зьменамі',
+'tog-prefershttps' => 'ЗаўÑёды карыÑтацца бÑÑьпечным злучÑньнем па ўваходзе Ñž ÑÑ‹ÑÑ‚Ñму',
'underline-always' => 'ЗаўÑёды',
'underline-never' => 'Ðіколі',
@@ -369,6 +370,18 @@ $messages = array(
'oct' => 'каÑ',
'nov' => 'ліÑ',
'dec' => 'Ñьн',
+'january-date' => '$1 ÑтудзенÑ',
+'february-date' => '$1 лютага',
+'march-date' => '$1 Ñакавіка',
+'april-date' => '$1 краÑавіка',
+'may-date' => '$1 траўнÑ',
+'june-date' => '$1 чÑрвенÑ',
+'july-date' => '$1 ліпенÑ',
+'august-date' => '$1 жніўнÑ',
+'september-date' => '$1 вераÑьнÑ',
+'october-date' => '$1 каÑтрычніка',
+'november-date' => '$1 ліÑтапада',
+'december-date' => '$1 ÑьнежнÑ',
# Categories related messages
'pagecategories' => '{{PLURAL:$1|КатÑгорыÑ|КатÑгорыі|КатÑгорыі}}',
@@ -450,6 +463,7 @@ $messages = array(
'create-this-page' => 'Стварыць гÑтую Ñтаронку',
'delete' => 'Выдаліць',
'deletethispage' => 'Выдаліць гÑтую Ñтаронку',
+'undeletethispage' => 'Ðднавіць гÑту Ñтаронку',
'undelete_short' => 'Ðднавіць $1 {{PLURAL:$1|Ñ€Ñдагаваньне|Ñ€Ñдагаваньні|Ñ€ÑдагаваньнÑÑž}}',
'viewdeleted_short' => 'Паказаць $1 {{PLURAL:$1|выдаленае Ñ€Ñдагаваньне|Ð²Ñ‹Ð´Ð°Ð»ÐµÐ½Ñ‹Ñ Ñ€Ñдагаваньні|выдаленых Ñ€ÑдагаваньнÑÑž}}',
'protect' => 'Ðбараніць',
@@ -493,7 +507,7 @@ $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).
+# 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).
'aboutsite' => 'Пра {{GRAMMAR:вінавальны|{{SITENAME}}}}',
'aboutpage' => 'Project:Пра {{GRAMMAR:вінавальны|{{SITENAME}}}}',
'copyright' => 'ЗьмеÑÑ‚ даÑтупны на ўмовах $1, калі не пазначана іншае.',
@@ -503,7 +517,6 @@ $1',
'disclaimers' => 'Ðдмова ад адказнаÑьці',
'disclaimerpage' => 'Project:Ðдмова ад адказнаÑьці',
'edithelp' => 'Дапамога Ñž Ñ€Ñдагаваньні',
-'edithelppage' => 'Help:РÑдагаваньне',
'helppage' => 'Help:ЗьмеÑÑ‚',
'mainpage' => 'Ð“Ð°Ð»Ð¾ÑžÐ½Ð°Ñ Ñтаронка',
'mainpage-description' => 'Ð“Ð°Ð»Ð¾ÑžÐ½Ð°Ñ Ñтаронка',
@@ -582,17 +595,12 @@ $1',
# General errors
'error' => 'Памылка',
'databaseerror' => 'Памылка базы зьвеÑтак',
-'dberrortext' => 'Ð’Ñ‹ÑÑžÐ»ÐµÐ½Ð°Ñ Ð¿Ð°Ð¼Ñ‹Ð»ÐºÐ° ÑынтакÑÑ–Ñу Ñž звароце да базы зьвеÑтак.
-Магчыма, гÑта памылка праграмнага забеÑьпÑчÑньнÑ.
-Ðпошні запыт да базы:
-<blockquote><code>$1</code></blockquote>
-адбыўÑÑ Ð· функцыі «<code>$2</code>».
-База зьвеÑтак вÑрнула памылку «<samp>$3: $4</samp>».',
-'dberrortextcl' => 'Ð’Ñ‹Ñўлена памылка ÑынтакÑÑ–Ñу Ñž звароце да базы зьвеÑтак.
-Ðпошні запыт да базы:
-«$1»
-адбыўÑÑ Ð· функцыі «$2».
-База зьвеÑтак вÑрнула памылку «$3: $4»',
+'databaseerror-text' => 'Пры запыце базы зьвеÑтак узьнікла памылка.
+ГÑта можа Ñьведчыць пра нÑÑпраўнаÑьць апраграмаваньнÑ.',
+'databaseerror-textcl' => 'Узьнікла памылка запыту базы зьвеÑтак.',
+'databaseerror-query' => 'Запыт: $1',
+'databaseerror-function' => 'ФункцыÑ: $1',
+'databaseerror-error' => 'Памылка: $1',
'laggedslavemode' => "'''Увага:''' Ñтаронка можа Ð½Ñ ÑžÑ‚Ñ€Ñ‹Ð¼Ð»Ñ–Ð²Ð°Ñ†ÑŒ апошніх зьменаў.",
'readonly' => 'База зьвеÑтак заблÑкаванаÑ',
'enterlockreason' => 'Пазначце прычыну блÑÐºÐ°Ð²Ð°Ð½ÑŒÐ½Ñ Ñ– заплÑнаваны Ñ‡Ð°Ñ Ñ€Ð°Ð·Ð±Ð»ÑкаваньнÑ',
@@ -625,6 +633,7 @@ $1',
'cannotdelete-title' => 'Ðемагчыма выдаліць Ñтаронку «$1»',
'delete-hook-aborted' => 'Выдаленьне ÑкаÑаванае працÑдурай-перахопнікам.
ТлумачÑньнÑÑž не было.',
+'no-null-revision' => 'Ðемагчыма Ñтварыць нулÑвую вÑÑ€ÑÑ–ÑŽ Ð´Ð»Ñ Ñтаронкі «$1»',
'badtitle' => 'ÐÑÑÐ»ÑƒÑˆÐ½Ð°Ñ Ð½Ð°Ð·Ð²Ð°',
'badtitletext' => 'Ð—Ð°Ð¿Ñ‹Ñ‚Ð°Ð½Ð°Ñ Ð½Ð°Ð·Ð²Ð° Ñтаронкі нÑÑÐ»ÑƒÑˆÐ½Ð°Ñ Ñ†Ñ– пуÑтаÑ, альбо нÑÑлушна ÑžÐºÐ°Ð·Ð°Ð½Ð°Ñ Ð¼Ñ–Ð¶Ð¼Ð¾ÑžÐ½Ð°Ñ Ñ†Ñ– інтÑрвікі-назва. Яна можа ўтрымліваць Ñымбалі, ÑÐºÑ–Ñ Ð½ÐµÐ»ÑŒÐ³Ð° ўжываць у назвах.',
'perfcached' => 'ÐаÑÑ‚ÑƒÐ¿Ð½Ñ‹Ñ Ð·ÑŒÐ²ÐµÑткі кÑÑˆÐ°Ð²Ð°Ð½Ñ‹Ñ Ñ– могуць быць ÑаÑтарÑлымі. У кÑшы {{PLURAL:$1|даÑтупны|даÑтупныÑ}} Ð½Ñ Ð±Ð¾Ð»ÑŒÑˆ за $1 {{PLURAL:$1|вынік|вынікі|вынікаў}}.',
@@ -644,12 +653,15 @@ $1',
'editinginterface' => "'''Увага:''' Ð’Ñ‹ Ñ€Ñдагуеце Ñтаронку, ÑÐºÐ°Ñ ÑžÑ‚Ñ€Ñ‹Ð¼Ð»Ñ–Ð²Ð°Ðµ ÑÑ‹ÑÑ‚Ñмнае паведамленьне MediaWiki.
Яе зьмена паўплывае на вонкавы выглÑд інтÑрфÑйÑу іншых удзельнікаў у гÑтай вікі.
Каб дадаць ці зьмÑніць пераклад ва ÑžÑÑ–Ñ… праектах, зьвÑрніцеÑÑ Ð½Ð° [//translatewiki.net/wiki/Main_Page?setlang=be-tarask translatewiki.net] — праект Ð´Ð»Ñ Ð»Ñкалізацыі MediaWiki.",
-'sqlhidden' => '(SQL-запыт Ñхаваны)',
'cascadeprotected' => 'ГÑÑ‚Ð°Ñ Ñтаронка Ð°Ð±Ð°Ñ€Ð¾Ð½ÐµÐ½Ð°Ñ Ð°Ð´ Ñ€ÑдагаваньнÑ, таму што Ñна ÑžÐºÐ»ÑŽÑ‡Ð°Ð½Ð°Ñ Ñž {{PLURAL:$1|наÑтупную Ñтаронку, ÑÐºÐ°Ñ Ð±Ñ‹Ð»Ð° абароненаÑ|наÑÑ‚ÑƒÐ¿Ð½Ñ‹Ñ Ñтаронкі, ÑÐºÑ–Ñ Ð±Ñ‹Ð»Ñ– абароненыÑ}} з актывізаванай опцыÑй «каÑкаднай абароны»:
$2',
'namespaceprotected' => "Ð’Ñ‹ Ð½Ñ Ð¼Ð°ÐµÑ†Ðµ правоў на Ñ€Ñдагаваньне Ñтаронак у праÑторы назваў '''$1'''.",
'customcssprotected' => 'Ð’Ñ‹ Ð½Ñ Ð¼Ð°ÐµÑ†Ðµ правоў на Ñ€Ñдагаваньне гÑтай CSS-Ñтаронкі, таму што Ñна ўтрымлівае пÑÑ€ÑÐ°Ð½Ð°Ð»ÑŒÐ½Ñ‹Ñ Ð½Ð°Ð»Ð°Ð´Ñ‹ іншага ўдзельніка.',
'customjsprotected' => 'Ð’Ñ‹ Ð½Ñ Ð¼Ð°ÐµÑ†Ðµ правоў на Ñ€Ñдагаваньне гÑтай Ñтаронкі JavaScript, таму што Ñна ўтрымлівае пÑÑ€ÑÐ°Ð½Ð°Ð»ÑŒÐ½Ñ‹Ñ Ð½Ð°Ð»Ð°Ð´Ñ‹ іншага ўдзельніка.',
+'mycustomcssprotected' => 'Ð’Ñ‹ Ð½Ñ Ð¼Ð°ÐµÑ†Ðµ дазволу Ñ€Ñдагаваць гÑтую CSS-Ñтаронку.',
+'mycustomjsprotected' => 'Ð’Ñ‹ Ð½Ñ Ð¼Ð°ÐµÑ†Ðµ дазволу Ñ€Ñдагаваць гÑтую JavaScript-Ñтаронку.',
+'myprivateinfoprotected' => 'Ð’Ñ‹ Ð½Ñ Ð¼Ð°ÐµÑ†Ðµ дазволу на зьмÑненьне ўлаÑных прыватных зьвеÑтак.',
+'mypreferencesprotected' => 'Ð’Ñ‹ Ð½Ñ Ð¼Ð°ÐµÑ†Ðµ дазволу на зьмÑненьне Ñваіх наладаў.',
'ns-specialprotected' => 'Ðемагчыма Ñ€Ñдагаваць ÑпÑцыÑÐ»ÑŒÐ½Ñ‹Ñ Ñтаронкі.',
'titleprotected' => "СтварÑньне Ñтаронкі з такой назвай было забароненае ўдзельнікам [[User:$1|$1]].
Прычына забароны: ''$2''.",
@@ -674,10 +686,19 @@ $2',
'welcomecreation-msg' => 'Ваш рахунак быў Ñтвораны.
Ðе забудзьцеÑÑ Ð·ÑŒÐ¼Ñніць Ð’Ð°ÑˆÑ‹Ñ [[Special:Preferences|налады Ñž {{GRAMMAR:меÑны|{{SITENAME}}}}]].',
'yourname' => 'Ð†Ð¼Ñ ÑžÐ´Ð·ÐµÐ»ÑŒÐ½Ñ–ÐºÐ°:',
+'userlogin-yourname' => 'Ð†Ð¼Ñ ÑžÐ´Ð·ÐµÐ»ÑŒÐ½Ñ–ÐºÐ°',
+'userlogin-yourname-ph' => 'УвÑдзіце вашае Ñ–Ð¼Ñ ÑžÐ´Ð·ÐµÐ»ÑŒÐ½Ñ–ÐºÐ°',
+'createacct-another-username-ph' => 'УвÑдзіце Ñ–Ð¼Ñ ÑžÐ´Ð·ÐµÐ»ÑŒÐ½Ñ–ÐºÐ°',
'yourpassword' => 'Пароль:',
+'userlogin-yourpassword' => 'Пароль',
+'userlogin-yourpassword-ph' => 'УвÑдзіце ваш пароль',
+'createacct-yourpassword-ph' => 'УвÑдзіце пароль',
'yourpasswordagain' => 'Паўтарыце пароль:',
+'createacct-yourpasswordagain' => 'Пацьвердзіце пароль',
+'createacct-yourpasswordagain-ph' => 'УвÑдзіце пароль зноў',
'remembermypassword' => 'Запомніць мÑне на гÑтым кампутары (Ð½Ñ Ð±Ð¾Ð»ÑŒÑˆ за $1 {{PLURAL:$1|дзень|дні|дзён}})',
-'securelogin-stick-https' => 'Утрымліваць злучÑньне праз HTTPS паÑÑŒÐ»Ñ ÑžÐ²Ð°Ñ…Ð¾Ð´Ñƒ Ñž ÑÑ‹ÑÑ‚Ñму',
+'userlogin-remembermypassword' => 'Запомніць мÑне',
+'userlogin-signwithsecure' => 'СкарыÑтацца бÑÑьпечным злучÑньнем',
'yourdomainname' => 'Ваш дамÑн:',
'password-change-forbidden' => 'Ð’Ñ‹ Ð½Ñ Ð¼Ð¾Ð¶Ð°Ñ†Ðµ зьмÑнÑць паролі Ñž гÑтай вікі.',
'externaldberror' => 'ÐдбылаÑÑ Ð¿Ð°Ð¼Ñ‹Ð»ÐºÐ° аўтÑнтыфікацыі з дапамогай вонкавай базы зьвеÑтак, ці Вам не дазволена абнаўлÑць Ñвой рахунак.',
@@ -689,18 +710,44 @@ $2',
'logout' => 'ВыйÑьці',
'userlogout' => 'ВыйÑьці',
'notloggedin' => 'Ð’Ñ‹ не ўвайшлі Ñž ÑÑ‹ÑÑ‚Ñму',
+'userlogin-noaccount' => 'ÐÑ Ð¼Ð°ÐµÑ†Ðµ рахунку?',
+'userlogin-joinproject' => 'ДалучайцеÑÑ Ð´Ð° {{GRAMMAR:родны|{{SITENAME}}}}',
'nologin' => 'ÐÑ Ð¼Ð°ÐµÑ†Ðµ рахунку? $1.',
'nologinlink' => 'Стварыце рахунак',
'createaccount' => 'СтварÑньне рахунку',
'gotaccount' => 'Ужо маеце рахунак? $1.',
'gotaccountlink' => 'Увайдзіце',
'userlogin-resetlink' => 'ЗабыліÑÑ Ð½Ð° зьвеÑткі Ð´Ð»Ñ ÑžÐ²Ð°Ñ…Ð¾Ð´Ñƒ?',
+'userlogin-resetpassword-link' => 'Забылі пароль?',
+'helplogin-url' => 'Help:Уваход у ÑÑ‹ÑÑ‚Ñму',
+'userlogin-helplink' => '[[{{MediaWiki:helplogin-url}}|Дапамога па ўваходзе Ñž ÑÑ‹ÑÑ‚Ñму]]',
+'userlogin-loggedin' => 'Ð’Ñ‹ ўжо ўвайшлі Ñк {{GENDER:$1|$1}}.
+Ð”Ð»Ñ ÑžÐ²Ð°Ñ…Ð¾Ð´Ñƒ пад іншым удзельнікам ÑкарыÑтайцеÑÑ Ñ„Ð¾Ñ€Ð¼Ð°Ð¹ унізе.',
+'userlogin-createanother' => 'Стварыць іншы рахунак',
+'createacct-join' => 'УвÑдзіце Ñвае зьвеÑткі ніжÑй.',
+'createacct-another-join' => 'УвÑдзіце зьвеÑткі Ð´Ð»Ñ Ð½Ð¾Ð²Ð°Ð³Ð° рахунку ніжÑй.',
+'createacct-emailrequired' => 'E-mail адраÑ',
+'createacct-emailoptional' => 'E-mail Ð°Ð´Ñ€Ð°Ñ (неабавÑзкова)',
+'createacct-email-ph' => 'УвÑдзіце ваш e-mail адраÑ',
+'createacct-another-email-ph' => 'УвÑдзіце Ð°Ð´Ñ€Ð°Ñ e-mail',
'createaccountmail' => 'Стварыць чаÑовы адвольны пароль Ñ– даÑлаць Ñго на e-mail адраÑ, пазначаны ніжÑй',
+'createacct-realname' => 'Сапраўднае Ñ–Ð¼Ñ (неабавÑзкова)',
'createaccountreason' => 'Прычына:',
+'createacct-reason' => 'Прычына',
+'createacct-reason-ph' => 'Зь Ñкой мÑтай вы Ñтвараеце іншы рахунак',
+'createacct-captcha' => 'Праверка бÑÑьпекі',
+'createacct-imgcaptcha-ph' => 'УвÑдзіце Ñ‚ÑкÑÑ‚, што бачыце вышÑй',
+'createacct-submit' => 'Стварыць рахунак',
+'createacct-another-submit' => 'Стварыць іншы рахунак',
+'createacct-benefit-heading' => '{{SITENAME}} ÑÑ‚Ð²Ð¾Ñ€Ð°Ð½Ð°Ñ Ð»ÑŽÐ´Ð·ÑŒÐ¼Ñ–, такімі Ñк вы.',
+'createacct-benefit-body1' => '{{PLURAL:$1|праўка|праўкі|правак}}',
+'createacct-benefit-body2' => '{{PLURAL:$1|Ñтаронка|Ñтаронкі|Ñтаронак}}',
+'createacct-benefit-body3' => '{{PLURAL:$1|удзельнік|удзельніка|удзельнікаў}} за апошні чаÑ',
'badretype' => 'Ð£Ð²ÐµÐ´Ð·ÐµÐ½Ñ‹Ñ Ð’Ð°Ð¼Ñ– паролі не Ñупадаюць.',
'userexists' => 'Уведзенае Вамі Ñ–Ð¼Ñ ÑžÐ´Ð·ÐµÐ»ÑŒÐ½Ñ–ÐºÐ° ўжо выкарыÑтоўваецца кімÑьці іншым.
Калі лаÑка, выберыце іншае імÑ.',
'loginerror' => 'Памылка ўваходу',
+'createacct-error' => 'Памылка ÑтварÑÐ½ÑŒÐ½Ñ Ñ€Ð°Ñ…ÑƒÐ½ÐºÑƒ',
'createaccounterror' => 'Ðемагчыма Ñтварыць рахунак: $1',
'nocookiesnew' => 'Рахунак быў Ñтвораны, але Ñž ÑÑ‹ÑÑ‚Ñму Ð’Ñ‹ не ўвайшлі.
{{SITENAME}} выкарыÑтоўвае cookie Ð´Ð»Ñ ÑžÐ²Ð°Ñ…Ð¾Ð´Ñƒ Ñž ÑÑ‹ÑÑ‚Ñму.
@@ -758,11 +805,13 @@ $2',
Ð’Ñ‹ можаце праігнараваць гÑÑ‚Ñ‹ ліÑÑ‚, калі гÑÑ‚Ñ‹ рахунак быў Ñтвораны памылкова.',
'usernamehasherror' => 'Ð†Ð¼Ñ ÑžÐ´Ð·ÐµÐ»ÑŒÐ½Ñ–ÐºÐ° Ð½Ñ Ð¼Ð¾Ð¶Ð° ўтрымліваць Ñымбаль #',
-'login-throttled' => 'Ð’Ñ‹ зрабілі занадта шмат Ñпробаў уваходу Ñž ÑÑ‹ÑÑ‚Ñму.
-Калі лаÑка, пачакайце, перад тым, Ñк паÑпрабаваць ізноў.',
+'login-throttled' => 'Ð’Ñ‹ зрабілі надта шмат Ñпробаў уваходу Ñž ÑÑ‹ÑÑ‚Ñму.
+Калі лаÑка, пачакайце $1 перад тым Ñк паÑпрабаваць ізноў.',
'login-abort-generic' => 'Ðе атрымалаÑÑ ÑžÐ²Ð°Ð¹Ñьці Ñž ÑÑ‹ÑÑ‚Ñму, ÑкаÑавана',
'loginlanguagelabel' => 'Мова: $1',
'suspicious-userlogout' => 'Ваш запыт на выхад з ÑÑ‹ÑÑ‚Ñмы быў адхілены, таму што выглÑдае, што ён быў даÑланы пашкоджаным браўзÑрам альбо кÑшаваным прокÑÑ–-ÑÑрвÑрам.',
+'createacct-another-realname-tip' => 'Сапраўднае Ñ–Ð¼Ñ Ð¿Ð°Ð²ÐµÐ´Ð°Ð¼Ð»Ñць неабавÑзкова.
+Калі Ð’Ñ‹ Ñго пазначыце, Ñно будзе выкарыÑтоўвацца Ð´Ð»Ñ Ð¿Ð°Ð·Ð½Ð°Ñ‡ÑÐ½ÑŒÐ½Ñ Ð’Ð°ÑˆÐ°Ð¹ працы.',
# Email sending
'php-mail-error-unknown' => 'Узьнікла невÑÐ´Ð¾Ð¼Ð°Ñ Ð¿Ð°Ð¼Ñ‹Ð»ÐºÐ° Ñž функцыі PHP mail()',
@@ -778,8 +827,7 @@ $2',
'newpassword' => 'Ðовы пароль:',
'retypenew' => 'Паўтарыце новы пароль:',
'resetpass_submit' => 'ÐаÑтавіць пароль Ñ– увайÑьці',
-'resetpass_success' => 'Ваш пароль быў паÑьпÑхова зьменены!
-ЦÑпер уваходзім...',
+'changepassword-success' => 'Ваш пароль быў паÑьпÑхова зьменены!',
'resetpass_forbidden' => 'Пароль Ð½Ñ Ð¼Ð¾Ð¶Ð° быць зьменены',
'resetpass-no-info' => 'Ð”Ð»Ñ Ð½ÐµÐ¿Ð°ÑÑ€Ñднага доÑтупу да гÑтай Ñтаронкі Вам неабходна ўвайÑьці Ñž ÑÑ‹ÑÑ‚Ñму.',
'resetpass-submit-loggedin' => 'ЗьмÑніць пароль',
@@ -791,10 +839,11 @@ $2',
# Special:PasswordReset
'passwordreset' => 'ÐчыÑтка паролю',
-'passwordreset-text' => 'Запоўніце гÑтую форму, каб Ñкінуць пароль.',
+'passwordreset-text-one' => 'Запоўніце гÑтую форму, каб Ñкінуць пароль.',
+'passwordreset-text-many' => '{{PLURAL:$1|Запоўніце адно з гÑÑ‚Ñ‹Ñ… палёў, каб Ñкінуць пароль.}}',
'passwordreset-legend' => 'ÐчыÑьціць пароль',
'passwordreset-disabled' => 'МагчымаÑьць ачыÑткі паролю была Ð·Ð°Ð±Ð°Ñ€Ð¾Ð½ÐµÐ½Ð°Ñ Ñž {{GRAMMAR:меÑны|{{SITENAME}}}}.',
-'passwordreset-pretext' => '{{PLURAL:$1||УвÑдзіце ніжÑй чаÑтку зьвеÑтак}}',
+'passwordreset-emaildisabled' => 'Функцыі e-mail у гÑтай вікі былі адключаныÑ.',
'passwordreset-username' => 'Ð†Ð¼Ñ ÑžÐ´Ð·ÐµÐ»ÑŒÐ½Ñ–ÐºÐ°:',
'passwordreset-domain' => 'ДамÑн:',
'passwordreset-capture' => 'Паказаць канчатковы Ñлектронны ліÑÑ‚?',
@@ -821,7 +870,7 @@ $2
ЧаÑовы пароль: $2',
'passwordreset-emailsent' => 'ЛіÑÑ‚ пра Ñкіданьне паролю быў даÑланы.',
'passwordreset-emailsent-capture' => 'ЛіÑÑ‚ пра Ñкіданьне паролю быў даÑланы, што паказана ніжÑй.',
-'passwordreset-emailerror-capture' => 'ЛіÑÑ‚ пра Ñкіданьне паролю быў Ñтвораны Ñ– паказаны ніжÑй, але не ўдалоÑÑ Ð°Ð´Ð¿Ñ€Ð°Ð²Ñ–Ñ†ÑŒ Ñго карыÑтальніку: $1',
+'passwordreset-emailerror-capture' => 'ЛіÑÑ‚ пра Ñкіданьне паролю быў Ñтвораны Ñ– паказаны ніжÑй, але не ўдалоÑÑ Ð°Ð´Ð¿Ñ€Ð°Ð²Ñ–Ñ†ÑŒ Ñго {{GENDER:$2|ўдзельніку|ўдзельніцы}}: $1',
# Special:ChangeEmail
'changeemail' => 'ЗьмÑніць Ð°Ð´Ñ€Ð°Ñ Ñлектроннай пошты',
@@ -835,6 +884,19 @@ $2
'changeemail-submit' => 'ЗьмÑніць Ð°Ð´Ñ€Ð°Ñ Ñлектроннай пошты',
'changeemail-cancel' => 'СкаÑаваць',
+# Special:ResetTokens
+'resettokens' => 'Скідваньне токенаў',
+'resettokens-text' => 'Тут вы можаце Ñкінуць токены, ÑÐºÑ–Ñ Ð´Ð°ÑŽÑ†ÑŒ вамд доÑтуп да пÑўных прыватных зьвеÑтак, аÑацыÑваных з вашым рахункам.
+
+Калі вы выпадкова падзÑліліÑÑ Ñ‚Ð¾ÐºÐµÐ½Ð°Ð¼Ñ– зь іншымі, або калі ваш рахунак быў ÑкампрамÑтаваны, ÑкарыÑтайцеÑÑ Ð³Ñтай магчымаÑьцю Ñ– Ñкіньце токены.',
+'resettokens-no-tokens' => 'ÐÑма што Ñкідаць.',
+'resettokens-legend' => 'Скінуць токены',
+'resettokens-tokens' => 'Токены:',
+'resettokens-token-label' => '$1 (бÑгучае значÑньне: $2)',
+'resettokens-watchlist-token' => 'Токен Ñтужкі (Atom/RSS) [[Special:Watchlist|зьменаў у вашым ÑьпіÑе назіраньнÑ]]',
+'resettokens-done' => 'Токены ÑкінутыÑ.',
+'resettokens-resetbutton' => 'Скінуць Ð²Ñ‹Ð»ÑƒÑ‡Ð°Ð½Ñ‹Ñ Ñ‚Ð¾ÐºÐµÐ½Ñ‹',
+
# Edit page toolbar
'bold_sample' => 'ТоўÑÑ‚Ñ‹ Ñ‚ÑкÑÑ‚',
'bold_tip' => 'ТоўÑÑ‚Ñ‹ Ñ‚ÑкÑÑ‚',
@@ -1027,12 +1089,15 @@ $2
Падобна, што Ñна была выдаленаÑ.',
'edit-conflict' => 'Канфлікт Ñ€ÑдагаваньнÑÑž.',
'edit-no-change' => 'Вашае Ñ€Ñдагаваньне было праігнараванае, таму што Ñž Ñ‚ÑкÑÑ‚ не былі ўнеÑÐµÐ½Ñ‹Ñ Ð·ÑŒÐ¼ÐµÐ½Ñ‹.',
+'postedit-confirmation' => 'Ð’Ð°ÑˆÐ°Ñ Ð¿Ñ€Ð°ÑžÐºÐ° была захаванаÑ.',
'edit-already-exists' => 'Ðемагчыма Ñтварыць новую Ñтаронку.
Яна ўжо Ñ–Ñнуе.',
'defaultmessagetext' => 'Перадвызначаны Ñ‚ÑкÑÑ‚ паведамленьнÑ',
'content-failed-to-parse' => 'ЗьмеÑÑ‚ «$2» не адпавÑдае тыпу $1: $3.',
'invalid-content-data' => 'ÐÑÑÐ»ÑƒÑˆÐ½Ñ‹Ñ Ð·ÑŒÐ²ÐµÑткі',
'content-not-allowed-here' => 'ЗьмеÑÑ‚ тыпу «$1» на Ñтаронцы [[$2]] не дазволены',
+'editwarning-warning' => 'Пакінуўшы гÑтую Ñтаронку, вы можаце Ñтраціць уÑе ўнеÑÐµÐ½Ñ‹Ñ Ð·ÑŒÐ¼ÐµÐ½Ñ‹.
+Калі вы ўвайшлі Ñž ÑÑ‹ÑÑ‚Ñму, Ð’Ñ‹ можаце адключыць гÑтае папÑÑ€Ñджаньне Ñž ÑÑкцыі «РÑдагаваньне» вашых наладаў.',
# Content models
'content-model-wikitext' => 'вікі-Ñ‚ÑкÑÑ‚',
@@ -1067,6 +1132,7 @@ $2
'undo-failure' => 'РÑдагаваньне Ð½Ñ Ð¼Ð¾Ð¶Ð° быць ÑкаÑаванае праз канфлікт паміж папÑÑ€Ñднімі Ñ€ÑдагаваньнÑмі.',
'undo-norev' => 'РÑдагаваньне Ð½Ñ Ð¼Ð¾Ð¶Ð° быць адмененае, таму што Ñно не Ñ–Ñнуе альбо было выдаленае.',
'undo-summary' => 'СкаÑаваньне праўкі $1 {{GENDER:$2|удзельніка|удзельніцы}} [[Special:Contributions/$2|$2]] ([[User talk:$2|гутаркі]])',
+'undo-summary-username-hidden' => 'Ð’ÑÑ€ÑÑ–Ñ $1 ÑкаÑÐ°Ð²Ð°Ð½Ð°Ñ Ñхаваным удзельнікам',
# Account creation failure
'cantcreateaccounttitle' => 'Ðемагчыма Ñтварыць рахунак',
@@ -1247,6 +1313,7 @@ $1",
'compareselectedversions' => 'Параўнаць Ð²Ñ‹Ð±Ñ€Ð°Ð½Ñ‹Ñ Ð²ÑÑ€ÑÑ–Ñ–',
'showhideselectedversions' => 'Паказаць/Ñхаваць Ð²Ñ‹Ð·Ð½Ð°Ñ‡Ð°Ð½Ñ‹Ñ Ð²ÑÑ€ÑÑ–Ñ–',
'editundo' => 'ÑкаÑаваць',
+'diff-empty' => '(Розьніцы нÑма)',
'diff-multi' => '($1 {{PLURAL:$1|Ð¿Ñ€Ð°Ð¼ÐµÐ¶Ð½Ð°Ñ Ð²ÑÑ€ÑÑ–Ñ|Ð¿Ñ€Ð°Ð¼ÐµÐ¶Ð½Ñ‹Ñ Ð²ÑÑ€ÑÑ–Ñ–|прамежных вÑÑ€ÑÑ–ÑÑž}} $2 {{PLURAL:$2|удзельніка|удзельнікаў|удзельнікаў}} {{PLURAL:$1|не паказанаÑ|не паказаныÑ|не паказаныÑ}})',
'diff-multi-manyusers' => '($1 {{PLURAL:$1|Ð¿Ñ€Ð°Ð¼ÐµÐ¶Ð½Ð°Ñ Ð²ÑÑ€ÑÑ–Ñ|Ð¿Ñ€Ð°Ð¼ÐµÐ¶Ð½Ñ‹Ñ Ð²ÑÑ€ÑÑ–Ñ–|прамежных вÑÑ€ÑÑ–ÑÑž}} $2 {{PLURAL:$2|удзельніка|удзельнікаў|удзельнікаў}} {{PLURAL:$1|не паказанаÑ|не паказаныÑ|не паказаныÑ}})',
'difference-missing-revision' => '{{PLURAL:$2|Ðдна вÑÑ€ÑÑ–Ñ|$2 вÑÑ€ÑÑ–Ñ–}} з гÑтымі адрозьненьнÑмі ($1) {{PLURAL:$2|не была|не былі}} знойдзеныÑ.
@@ -1274,7 +1341,6 @@ $1",
'searchmenu-legend' => 'Ðалады пошуку',
'searchmenu-exists' => "* Старонка '''[[$1]]'''",
'searchmenu-new' => "'''Стварыць Ñтаронку «[[:$1|$1]]» у {{GRAMMAR:меÑны|{{SITENAME}}}}!'''",
-'searchhelp-url' => 'Help:ЗьмеÑÑ‚',
'searchmenu-prefix' => '[[Special:PrefixIndex/$1|ПраглÑдзець Ñтаронкі з гÑтым прÑфікÑам]]',
'searchprofile-articles' => 'Старонкі Ñа зьмеÑтам',
'searchprofile-project' => 'Старонкі дапамогі і праекту',
@@ -1316,15 +1382,7 @@ $1",
'search-external' => 'Вонкавы пошук',
'searchdisabled' => 'Ð¤ÑƒÐ½ÐºÑ†Ñ‹Ñ Ð¿Ð¾ÑˆÑƒÐºÑƒ Ñž {{GRAMMAR:меÑны|{{SITENAME}}}} адключанаÑ.
Ð’Ñ‹ можаце пашукаць з дапамогай Google, але заўважце, што там Ñ–Ð½Ñ„Ð°Ñ€Ð¼Ð°Ñ†Ñ‹Ñ Ð¿Ñ€Ð° Ñтаронкі {{GRAMMAR:родны|{{SITENAME}}}} можа быць ÑаÑтарÑлай.',
-
-# Quickbar
-'qbsettings' => 'ПанÑль хуткага доÑтупу',
-'qbsettings-none' => 'Ðе паказваць',
-'qbsettings-fixedleft' => 'Ð—Ð°Ð¼Ð°Ñ†Ð°Ð²Ð°Ð½Ð°Ñ Ð·ÑŒÐ»ÐµÐ²Ð°',
-'qbsettings-fixedright' => 'Ð—Ð°Ð¼Ð°Ñ†Ð°Ð²Ð°Ð½Ð°Ñ Ñправа',
-'qbsettings-floatingleft' => 'Плавае зьлева',
-'qbsettings-floatingright' => 'Плавае Ñправа',
-'qbsettings-directionality' => 'ЗамацаванаÑ, у залежнаÑьці ад накірунку напіÑÐ°Ð½ÑŒÐ½Ñ Ñž Вашай мове',
+'search-error' => 'Узьнікла памылка пры пошуку: $1',
# Preferences page
'preferences' => 'Ðалады',
@@ -1358,7 +1416,6 @@ $1",
'resetprefs' => 'Скінуць',
'restoreprefs' => 'Ðднавіць уÑе ÑÑ‚Ð°Ð½Ð´Ð°Ñ€Ñ‚Ð½Ñ‹Ñ Ð½Ð°Ð»Ð°Ð´Ñ‹ (ва ÑžÑÑ–Ñ… разьдзелах)',
'prefs-editing' => 'РÑдагаваньне',
-'prefs-edit-boxsize' => 'Памер акна Ñ€ÑдагаваньнÑ.',
'rows' => 'Радкоў:',
'columns' => 'Слупкоў:',
'searchresultshead' => 'Пошук',
@@ -1369,9 +1426,9 @@ $1",
'recentchangesdays-max' => '(макÑымальна $1 {{PLURAL:$1|дзень|дні|дзён}})',
'recentchangescount' => 'КолькаÑьць Ñ€ÑдагаваньнÑÑž Ð´Ð»Ñ Ð¿Ð°ÐºÐ°Ð·Ñƒ па змоўчваньні:',
'prefs-help-recentchangescount' => 'ГÑта датычыцца апошніх зьменах, гіÑторый Ñтаронак Ñ– журналаў.',
-'prefs-help-watchlist-token' => 'Запаўненьне гÑтага Ð¿Ð¾Ð»Ñ ÑакрÑтным ключом Ñтворыць RSS-Ñтужку Ð´Ð»Ñ Ð’Ð°ÑˆÐ°Ð³Ð° ÑьпіÑу назіраньнÑ.
-Кожны, хто ведае ключ у гÑтым полі, зможа чытаць Ваш ÑÑŒÐ¿Ñ–Ñ Ð½Ð°Ð·Ñ–Ñ€Ð°Ð½ÑŒÐ½Ñ, таму выбірайце ÑакрÑтнае значÑньне.
-Тут Ð’Ñ‹ зможаце выкарыÑтоўваць выпадковае значÑньне: $1',
+'prefs-help-watchlist-token2' => 'ГÑта ÑакрÑтны ключ да Ñтужкі вашага ÑьпіÑу назіраньнÑ.
+Кожны, хто ведае Ñго, можа набыць доÑтуп да вашага ÑьпіÑу назіраньнÑ, таму не дзÑліцеÑÑ Ñ–Ð¼.
+[[Special:ResetTokens|ПÑтрыкніце тут, калі вам Ñ‚Ñ€Ñба Ñкінуць Ñго]].',
'savedprefs' => 'Ð’Ð°ÑˆÑ‹Ñ Ð½Ð°Ð»Ð°Ð´Ñ‹ былі захаваныÑ.',
'timezonelegend' => 'ЧаÑавы поÑÑ:',
'localtime' => 'ÐœÑÑцовы чаÑ:',
@@ -1402,7 +1459,6 @@ $1",
'prefs-reset-intro' => 'Ð’Ñ‹ можаце выкарыÑтоўваць гÑтую Ñтаронку Ð´Ð»Ñ Ð·Ð°Ð¼ÐµÐ½Ñ‹ Вашых наладаў на налады Ñайта па змоўчваньні.
ГÑтае дзеÑньне не можа быць адмененае.',
'prefs-emailconfirm-label' => 'Пацьверджаньне адраÑу Ñлектроннай пошты:',
-'prefs-textboxsize' => 'Памеры акна Ñ€ÑдагаваньнÑ',
'youremail' => 'ÐÐ´Ñ€Ð°Ñ Ñлектроннай пошты:',
'username' => 'Ð†Ð¼Ñ {{GENDER:$1|ўдзельніка|ўдзельніцы}}:',
'uid' => 'ID {{GENDER:$1|удзельніка|удзельніцы}}:',
@@ -1436,6 +1492,8 @@ $1",
'prefs-dateformat' => 'Фармат даты',
'prefs-timeoffset' => 'Розьніца Ñž чаÑе',
'prefs-advancedediting' => 'ÐÐ³ÑƒÐ»ÑŒÐ½Ñ‹Ñ Ð½Ð°Ð»Ð°Ð´Ñ‹',
+'prefs-editor' => 'РÑдактар',
+'prefs-preview' => 'ПапÑÑ€Ñдні праглÑд',
'prefs-advancedrc' => 'Ð”Ð°Ð´Ð°Ñ‚ÐºÐ¾Ð²Ñ‹Ñ Ð½Ð°Ð»Ð°Ð´Ñ‹',
'prefs-advancedrendering' => 'Ð”Ð°Ð´Ð°Ñ‚ÐºÐ¾Ð²Ñ‹Ñ Ð½Ð°Ð»Ð°Ð´Ñ‹',
'prefs-advancedsearchoptions' => 'Ð”Ð°Ð´Ð°Ñ‚ÐºÐ¾Ð²Ñ‹Ñ Ð½Ð°Ð»Ð°Ð´Ñ‹',
@@ -1443,7 +1501,9 @@ $1",
'prefs-displayrc' => 'Ðалады паказу',
'prefs-displaysearchoptions' => 'Ðалады паказу',
'prefs-displaywatchlist' => 'Ðалады паказу',
+'prefs-tokenwatchlist' => 'Токен',
'prefs-diffs' => 'Розьніцы вÑÑ€ÑÑ–ÑÑž',
+'prefs-help-prefershttps' => 'ГÑÑ‚Ð°Ñ Ð½Ð°Ð»Ð°Ð´Ð° набудзе моц пры наÑтупным уваходзе Ñž ÑÑ‹ÑÑ‚Ñму.',
# User preference: email validation using jQuery
'email-address-validity-valid' => 'ВыглÑдае Ñлушна',
@@ -1470,6 +1530,8 @@ $1",
'userrights-notallowed' => 'Ð’Ñ‹ Ð½Ñ Ð¼Ð°ÐµÑ†Ðµ права прызначаць ці выдалÑць правы ўдзельнікам.',
'userrights-changeable-col' => 'Групы, ÑÐºÑ–Ñ Ð’Ñ‹ можаце мÑнÑць',
'userrights-unchangeable-col' => 'Групы, ÑÐºÑ–Ñ Ð’Ñ‹ Ð½Ñ Ð¼Ð¾Ð¶Ð°Ñ†Ðµ мÑнÑць',
+'userrights-conflict' => 'Канфлікт пры зьмене правоў удзельнікаў! Калі лаÑка, праверце Ñ– захавайце Ð²Ð°ÑˆÑ‹Ñ Ð·ÑŒÐ¼ÐµÐ½Ñ‹.',
+'userrights-removed-self' => 'Ð’Ñ‹ паÑьпÑхова пазбавілі ÑÑбе ўлаÑных правоў. З гÑтай прычыны вы больш Ð½Ñ Ð¼Ð°ÐµÑ†Ðµ доÑтупу да гÑтай Ñтаронкі.',
# Groups
'group' => 'Група:',
@@ -1535,11 +1597,19 @@ $1",
'right-proxyunbannable' => 'абход аўтаматычных блÑкаваньнÑÑž прокÑÑ–',
'right-unblockself' => 'разблÑкаваньне Ñамога ÑÑбе',
'right-protect' => 'зьмена ўзроўню абароны Ñтаронак Ñ– Ñ€Ñдагаваньне каÑкадна абароненых Ñтаронак',
-'right-editprotected' => 'Ñ€Ñдагаваньне абароненых Ñтаронак (без каÑкаднай абароны)',
+'right-editprotected' => 'Ñ€Ñдагаваньне Ñтаронак, абароненых у Ñ€Ñжыме «{{int:protect-level-sysop}}»',
+'right-editsemiprotected' => 'Ñ€Ñдагаваньне Ñтаронак, абароненых у Ñ€Ñжыме «{{int:protect-level-autoconfirmed}}»',
'right-editinterface' => 'Ñ€Ñдагаваньне інтÑрфÑйÑа карыÑтальніка',
'right-editusercssjs' => 'Ñ€Ñдагаваньне CSS Ñ– JS файлаў іншых удзельнікаў',
'right-editusercss' => 'Ñ€Ñдагаваньне CSS файлаў іншых удзельнікаў',
'right-edituserjs' => 'Ñ€Ñдагаваньне JS файлаў іншых удзельнікаў',
+'right-editmyusercss' => 'Ñ€Ñдагаваць улаÑÐ½Ñ‹Ñ ÐºÐ°Ñ€Ñ‹ÑÑ‚Ð°Ð»ÑŒÐ½Ñ–Ñ†ÐºÑ–Ñ CSS-файлы',
+'right-editmyuserjs' => 'Ñ€Ñдагаваць улаÑÐ½Ñ‹Ñ ÐºÐ°Ñ€Ñ‹ÑÑ‚Ð°Ð»ÑŒÐ½Ñ–Ñ†ÐºÑ–Ñ JavaScript-файлы',
+'right-viewmywatchlist' => 'праглÑдаць улаÑны ÑÑŒÐ¿Ñ–Ñ Ð½Ð°Ð·Ñ–Ñ€Ð°Ð½ÑŒÐ½Ñ',
+'right-editmywatchlist' => 'Ñ€Ñдагаваць улаÑны ÑÑŒÐ¿Ñ–Ñ Ð½Ð°Ð·Ñ–Ñ€Ð°Ð½ÑŒÐ½Ñ (Ð½ÐµÐºÐ°Ñ‚Ð¾Ñ€Ñ‹Ñ Ð´Ð·ÐµÑньні будуць дадаваць туды Ñтаронкі нават бÑз гÑтага права)',
+'right-viewmyprivateinfo' => 'праглÑдаць улаÑÐ½Ñ‹Ñ Ð¿Ñ€Ñ‹Ð²Ð°Ñ‚Ð½Ñ‹Ñ Ð·ÑŒÐ²ÐµÑткі (напр., Ð°Ð´Ñ€Ð°Ñ e-mail, Ñапраўднае імÑ)',
+'right-editmyprivateinfo' => 'Ñ€Ñдагаваць улаÑÐ½Ñ‹Ñ Ð¿Ñ€Ñ‹Ð²Ð°Ñ‚Ð½Ñ‹Ñ Ð·ÑŒÐ²ÐµÑткі (напр., Ð°Ð´Ñ€Ð°Ñ e-mail, Ñапраўднае імÑ)',
+'right-editmyoptions' => 'Ñ€Ñдагаваць улаÑÐ½Ñ‹Ñ Ð½Ð°Ð»Ð°Ð´Ñ‹',
'right-rollback' => 'хуткі адкат правак апошнÑга ўдзельніка, Ñкі Ñ€Ñдагаваў Ñтаронку',
'right-markbotedits' => 'пазначÑньне адкатаў Ñк Ñ€Ñдагаваньне робатам',
'right-noratelimit' => 'нÑма абмежаваньнÑÑž па хуткаÑьці',
@@ -1601,12 +1671,19 @@ $1",
'action-userrights-interwiki' => 'Ñ€Ñдагаваньне правоў удзельнікаў у іншых вікі',
'action-siteadmin' => 'блÑкаваньне Ñ– разблÑкаваньне базы зьвеÑтак',
'action-sendemail' => 'адпраўлÑць ліÑÑ‚Ñ‹ іншым удзельнікам',
+'action-editmywatchlist' => 'Ñ€Ñдагаваць ваш ÑÑŒÐ¿Ñ–Ñ Ð½Ð°Ð·Ñ–Ñ€Ð°Ð½ÑŒÐ½Ñ',
+'action-viewmywatchlist' => 'праглÑдаць ваш ÑÑŒÐ¿Ñ–Ñ Ð½Ð°Ð·Ñ–Ñ€Ð°Ð½ÑŒÐ½Ñ',
+'action-viewmyprivateinfo' => 'праглÑд вашых прыватных зьвеÑтак',
+'action-editmyprivateinfo' => 'Ñ€Ñдагаваньне вашых прыватных зьвеÑтак',
# Recent changes
'nchanges' => '$1 {{PLURAL:$1|зьмена|зьмены|зьменаў}}',
+'enhancedrc-since-last-visit' => '$1 {{PLURAL:$1|з апошнÑга візыту}}',
+'enhancedrc-history' => 'гіÑторыÑ',
'recentchanges' => 'ÐÐ¿Ð¾ÑˆÐ½Ñ–Ñ Ð·ÑŒÐ¼ÐµÐ½Ñ‹',
'recentchanges-legend' => 'Ðалады апошніх зьменаў',
'recentchanges-summary' => 'Сачыце за апошнімі зьменамі Ñž {{GRAMMAR:меÑны|{{SITENAME}}}} на гÑтай Ñтаронцы.',
+'recentchanges-noresult' => 'Зьмены, што паÑуюць дадзенаму пÑрыÑду Ñ– крытÑрам, Ð½Ñ Ð·Ð½Ð¾Ð¹Ð´Ð·ÐµÐ½Ñ‹Ñ.',
'recentchanges-feed-description' => 'Сачыце за апошнімі зьменамі Ñž {{GRAMMAR:меÑны|{{SITENAME}}}} праз гÑтую Ñтужку.',
'recentchanges-label-newpage' => 'ГÑтым Ñ€Ñдагаваньнем была ÑÑ‚Ð²Ð¾Ñ€Ð°Ð½Ð°Ñ Ð½Ð¾Ð²Ð°Ñ Ñтаронка',
'recentchanges-label-minor' => 'ГÑтае Ñ€Ñдагаваньне — дробнае',
@@ -1643,7 +1720,6 @@ $1",
'recentchangeslinked-feed' => 'ЗьвÑÐ·Ð°Ð½Ñ‹Ñ Ð¿Ñ€Ð°ÑžÐºÑ–',
'recentchangeslinked-toolbox' => 'ЗьвÑÐ·Ð°Ð½Ñ‹Ñ Ð¿Ñ€Ð°ÑžÐºÑ–',
'recentchangeslinked-title' => 'ЗьвÑÐ·Ð°Ð½Ñ‹Ñ Ð¿Ñ€Ð°ÑžÐºÑ– Ð´Ð»Ñ Â«$1»',
-'recentchangeslinked-noresult' => 'Ðе было ніÑкіх зьменаў на зьвÑзаных Ñтаронках за вызначаны пÑрыÑд.',
'recentchangeslinked-summary' => "ГÑта ÑÑŒÐ¿Ñ–Ñ Ð°Ð¿Ð¾ÑˆÐ½Ñ–Ñ… зьменаў Ñтаронак, на ÑÐºÑ–Ñ ÑпаÑылаецца Ð°Ð·Ð½Ð°Ñ‡Ð°Ð½Ð°Ñ Ñтаронка (ці ÑžÑÑ–Ñ… Ñтаронак, ÑÐºÑ–Ñ Ð½Ð°Ð»ÐµÐ¶Ð°Ñ†ÑŒ азначанай катÑгорыі).
Старонкі з [[Special:Watchlist|Вашага ÑьпіÑу назіраньнÑ]] Ð¿Ð°Ð·Ð½Ð°Ñ‡Ð°Ð½Ñ‹Ñ '''тлуÑтым шрыфтам'''.",
'recentchangeslinked-page' => 'Ðазва Ñтаронкі:',
@@ -1655,7 +1731,7 @@ $1",
'reuploaddesc' => 'СкаÑаваць загрузку Ñ– вÑрнуцца да формы загрузкі',
'upload-tryagain' => 'ДаÑлаць зьмененае апіÑаньне файла',
'uploadnologin' => 'Ð’Ñ‹ не ўвайшлі Ñž ÑÑ‹ÑÑ‚Ñму',
-'uploadnologintext' => 'Вам Ñ‚Ñ€Ñба [[Special:UserLogin|ўвайÑьці Ñž ÑÑ‹ÑÑ‚Ñму]] Ð´Ð»Ñ Ð·Ð°Ð³Ñ€ÑƒÐ·ÐºÑ– файлаў.',
+'uploadnologintext' => 'Вам Ñ‚Ñ€Ñба $1, каб загружаць файлы.',
'upload_directory_missing' => 'Ð—Ð°Ð³Ñ€ÑƒÐ·Ð°Ñ‡Ð½Ð°Ñ Ð´Ñ‹Ñ€ÑÐºÑ‚Ð¾Ñ€Ñ‹Ñ ($1) адÑутнічае Ñ– Ð½Ñ Ð¼Ð¾Ð¶Ð° быць ÑÑ‚Ð²Ð¾Ñ€Ð°Ð½Ð°Ñ ÑÑрвÑрам.',
'upload_directory_read_only' => 'СÑрвÑÑ€ Ð½Ñ Ð¼Ð°Ðµ правоў на Ð·Ð°Ð¿Ñ–Ñ Ñƒ дырÑкторыю загружаных файлаў ($1).',
'uploaderror' => 'Памылка загрузкі',
@@ -1869,7 +1945,6 @@ $1',
'http-read-error' => 'Памылка Ñ‡Ñ‹Ñ‚Ð°Ð½ÑŒÐ½Ñ HTTP.',
'http-timed-out' => 'СкончыўÑÑ Ñ‡Ð°Ñ Ñ‡Ð°ÐºÐ°Ð½ÑŒÐ½Ñ HTTP-запыту.',
'http-curl-error' => 'Памылка выбаркі URL-адраÑу: $1',
-'http-host-unreachable' => 'Ðемагчыма даÑÑгнуць URL-адраÑ',
'http-bad-status' => 'ÐдбылаÑÑ Ð¿Ð°Ð¼Ñ‹Ð»ÐºÐ° пад Ñ‡Ð°Ñ Ð²Ñ‹ÐºÐ°Ð½Ð°Ð½ÑŒÐ½Ñ HTTP-запыту: $1 $2',
# Some likely curl errors. More could be added from <http://curl.haxx.se/libcurl/c/libcurl-errors.html>
@@ -1900,6 +1975,10 @@ $1',
'listfiles_size' => 'Памер',
'listfiles_description' => 'ÐпіÑаньне',
'listfiles_count' => 'Ð’ÑÑ€ÑÑ–Ñ–',
+'listfiles-show-all' => 'Уключаць ÑÑ‚Ð°Ñ€Ñ‹Ñ Ð²ÑÑ€ÑÑ–Ñ– выÑÑž',
+'listfiles-latestversion' => 'БÑÐ³ÑƒÑ‡Ð°Ñ Ð²ÑÑ€ÑÑ–Ñ',
+'listfiles-latestversion-yes' => 'Так',
+'listfiles-latestversion-no' => 'Ðе',
# File description page
'file-anchor-link' => 'Файл',
@@ -1997,6 +2076,13 @@ $1',
'randompage' => 'Ð’Ñ‹Ð¿Ð°Ð´ÐºÐ¾Ð²Ð°Ñ Ñтаронка',
'randompage-nopages' => 'ÐÑма Ñтаронак у {{PLURAL:$2|наÑтупнай праÑторы|наÑтупных праÑторах}} назваў: $1.',
+# Random page in category
+'randomincategory' => 'Ð’Ñ‹Ð¿Ð°Ð´ÐºÐ¾Ð²Ð°Ñ Ñтаронка Ñž катÑгорыі',
+'randomincategory-invalidcategory' => '«$1» — Ð½Ñ ÑÐ»ÑƒÑˆÐ½Ð°Ñ Ð½Ð°Ð·Ð²Ð° катÑгорыі.',
+'randomincategory-nopages' => 'У катÑгорыі «[[:Category:$1|$1]]» Ñтаронак нÑма.',
+'randomincategory-selectcategory' => 'УзÑць адвольную Ñтаронку з катÑгорыі: $1 $2.',
+'randomincategory-selectcategory-submit' => 'Паказаць',
+
# Random redirect
'randomredirect' => 'Выпадковае перанакіраваньне',
'randomredirect-nopages' => 'У праÑторы назваў «$1» нÑма перанакіраваньнÑÑž.',
@@ -2022,17 +2108,13 @@ $1',
'statistics-users-active-desc' => 'Удзельнікі, ÑÐºÑ–Ñ Ð²Ñ‹ÐºÐ°Ð½Ð°Ð»Ñ– нейкае дзеÑньне цÑгам {{PLURAL:$1|апошнÑга $1 днÑ|апошніх $1 дзён|апошніх $1 дзён}}',
'statistics-mostpopular' => 'ÐайпапулÑÑ€Ð½ÐµÐ¹ÑˆÑ‹Ñ Ñтаронкі',
-'disambiguations' => 'Старонкі, ÑÐºÑ–Ñ ÑпаÑылаюцца на Ñтаронкі-неадназначнаÑьці',
-'disambiguationspage' => 'Template:ÐеадназначнаÑьць',
-'disambiguations-text' => "ÐаÑÑ‚ÑƒÐ¿Ð½Ñ‹Ñ Ñтаронкі ÑпаÑылаюцца на '''Ñтаронкі-неадназначнаÑьці'''.
-ЗамеÑÑ‚ гÑтага, Ñны павінны ÑпаÑылацца на пÑÑžÐ½Ñ‹Ñ Ñтаронкі.<br />
-Старонка лічыцца шматзначнай, калі Ñна ўтрымлівае шаблён назва Ñкога знаходзіцца на Ñтаронцы [[MediaWiki:Disambiguationspage]]",
-
'pageswithprop' => 'Старонкі з улаÑьціваÑьцÑмі Ñтаронак',
'pageswithprop-legend' => 'Старонкі з улаÑьціваÑьцÑмі Ñтаронак',
'pageswithprop-text' => 'Ðа гÑтай Ñтаронцы адлюÑтроўваюцца Ñтаронкі, ÑÐºÑ–Ñ ÑžÐ¶Ñ‹Ð²Ð°ÑŽÑ†ÑŒ пÑÑžÐ½Ñ‹Ñ ÑžÐ»Ð°ÑьціваÑьці Ñтаронак',
'pageswithprop-prop' => 'Ð†Ð¼Ñ ÑžÐ»Ð°ÑьціваÑьці:',
'pageswithprop-submit' => 'Паказаць',
+'pageswithprop-prophidden-long' => 'доўгае Ñ‚ÑкÑтавае значÑньне ўлаÑьціваÑьці Ñхавана ($1)',
+'pageswithprop-prophidden-binary' => 'двайковае значÑньне ўлаÑьціваÑьці Ñхавана ($1)',
'doubleredirects' => 'Ð”Ð²Ð°Ð¹Ð½Ñ‹Ñ Ð¿ÐµÑ€Ð°Ð½Ð°ÐºÑ–Ñ€Ð°Ð²Ð°Ð½ÑŒÐ½Ñ–',
'doubleredirectstext' => 'Ðа гÑтай Ñтаронцы пададзены ÑÑŒÐ¿Ñ–Ñ Ð¿ÐµÑ€Ð°Ð½Ð°ÐºÑ–Ñ€Ð°Ð²Ð°Ð½ÑŒÐ½ÑÑž на Ñ–Ð½ÑˆÑ‹Ñ Ð¿ÐµÑ€Ð°Ð½Ð°ÐºÑ–Ñ€Ð°Ð²Ð°Ð½ÑŒÐ½Ñ–. Кожны радок утрымлівае ÑпаÑылкі на першае Ñ– другое перанакіраваньне, а такÑама мÑтавую Ñтаронку другога перанакіраваньнÑ, ÑÐºÐ°Ñ Ð·Ð²Ñ‹Ñ‡Ð°Ð¹Ð½Ð° зьÑўлÑецца «Ñапраўднай» мÑтавай Ñтаронкай, куды павіннае ÑпаÑылацца першае перанакіраваньне.
@@ -2089,6 +2171,7 @@ $1',
'mostrevisions' => 'Старонкі з найбольшай колькаÑьцю Ñ€ÑдагаваньнÑÑž',
'prefixindex' => 'УÑе Ñтаронкі з пачаткам назваў',
'prefixindex-namespace' => 'УÑе Ñтаронкі з прÑфікÑам (праÑтора назваў $1)',
+'prefixindex-strip' => 'Прыбраць прÑÑ„Ñ–ÐºÑ Ñƒ ÑьпіÑе',
'shortpages' => 'ÐšÐ°Ñ€Ð¾Ñ‚ÐºÑ–Ñ Ñтаронкі',
'longpages' => 'Ð”Ð¾ÑžÐ³Ñ–Ñ Ñтаронкі',
'deadendpages' => 'Ð¢ÑƒÐ¿Ñ–ÐºÐ¾Ð²Ñ‹Ñ Ñтаронкі',
@@ -2104,6 +2187,7 @@ $1',
'listusers' => 'Ð¡ÑŒÐ¿Ñ–Ñ ÑƒÐ´Ð·ÐµÐ»ÑŒÐ½Ñ–ÐºÐ°Ñž Ñ– ўдзельніц',
'listusers-editsonly' => 'Паказаць толькі ўдзельнікаў, ÑÐºÑ–Ñ Ð¼Ð°ÑŽÑ†ÑŒ Ñ€Ñдагаваньні',
'listusers-creationsort' => 'ÐдÑартаваць па даце ÑтварÑньнÑ',
+'listusers-desc' => 'Сартаваць па зьмÑншÑньні',
'usereditcount' => '$1 {{PLURAL:$1|Ñ€Ñдагаваньне|Ñ€Ñдагаваньні|Ñ€ÑдагаваньнÑÑž}}',
'usercreated' => '{{GENDER:$3|Створаны|СтворанаÑ}} $1 у $2',
'newpages' => 'ÐÐ¾Ð²Ñ‹Ñ Ñтаронкі',
@@ -2281,10 +2365,9 @@ $1',
'unwatchthispage' => 'ПераÑтаць назіраць',
'notanarticle' => 'Ðе Ñтаронка зьмеÑту',
'notvisiblerev' => 'Ð’ÑÑ€ÑÑ–Ñ Ð±Ñ‹Ð»Ð° выдаленаÑ',
-'watchnochange' => 'Ðічога з Вашага ÑьпіÑу Ð½Ð°Ð·Ñ–Ñ€Ð°Ð½ÑŒÐ½Ñ Ð½Ðµ зьмÑнілаÑÑ Ð·Ð° паказаны пÑрыÑд.',
'watchlist-details' => 'У Вашым ÑьпіÑе Ð½Ð°Ð·Ñ–Ñ€Ð°Ð½ÑŒÐ½Ñ $1 {{PLURAL:$1|Ñтаронка|Ñтаронкі|Ñтаронак}} за выключÑньнем Ñтаронак абмеркаваньнÑ.',
-'wlheader-enotif' => '* ДаÑылка паведамленьнÑÑž па Ñлектроннай пошце ўключанаÑ.',
-'wlheader-showupdated' => "* Старонкі, ÑÐºÑ–Ñ Ð±Ñ‹Ð»Ñ– Ð·ÑŒÐ¼ÐµÐ½ÐµÐ½Ñ‹Ñ Ð¿Ð°ÑÑŒÐ»Ñ Ð’Ð°ÑˆÐ°Ð³Ð° апошнÑга візыту, Ð²Ñ‹Ð»ÑƒÑ‡Ð°Ð½Ñ‹Ñ '''тоўÑтым''' шрыфтам",
+'wlheader-enotif' => 'ÐпавÑшчÑньне па e-mail уключанае.',
+'wlheader-showupdated' => "Старонкі, Ð·ÑŒÐ¼ÐµÐ½ÐµÐ½Ñ‹Ñ Ð· чаÑу вашага апошнÑга візыту, Ð²Ñ‹Ð»ÑƒÑ‡Ð°Ð½Ñ‹Ñ '''тоўÑтым''' шрыфтам.",
'watchmethod-recent' => 'праглÑд апошніх зьменаў у Ñтаронках Ñа ÑьпіÑу назіраньнÑ',
'watchmethod-list' => 'праглÑд Ñтаронак Ñа ÑьпіÑу Ð½Ð°Ð·Ñ–Ñ€Ð°Ð½ÑŒÐ½Ñ Ð´Ð·ÐµÐ»Ñ Ð°Ð¿Ð¾ÑˆÐ½Ñ–Ñ… зьменах',
'watchlistcontains' => 'Ваш ÑÑŒÐ¿Ñ–Ñ Ð½Ð°Ð·Ñ–Ñ€Ð°Ð½ÑŒÐ½Ñ Ð·ÑŒÐ¼Ñшчае $1 {{PLURAL:$1|Ñтаронка|Ñтаронкі|Ñтаронак}}.',
@@ -2537,7 +2620,7 @@ $1',
'contributions' => 'УнёÑак {{GENDER:$1|удзельніка|удзельніцы}}',
'contributions-title' => 'УнёÑак {{GENDER:$1|удзельніка|удзельніцы}} $1',
'mycontris' => 'УнёÑак',
-'contribsub2' => 'Ð”Ð»Ñ $1 ($2)',
+'contribsub2' => 'Ð”Ð»Ñ {{GENDER:$3|$1}} ($2)',
'nocontribs' => 'ÐÑ Ð·Ð½Ð¾Ð¹Ð´Ð·ÐµÐ½Ð° зьменаў, ÑÐºÑ–Ñ Ð°Ð´Ð¿Ð°Ð²Ñдаюць гÑтым крытÑрыÑм.',
'uctop' => '(апошнÑÑ)',
'month' => 'Ðд меÑÑца (Ñ– раней):',
@@ -2690,15 +2773,13 @@ $1',
Тым Ð½Ñ Ð¼ÐµÐ½Ñˆ, ён належыць да дыÑпазону $2, Ñкі можа быць разблÑкаваны.',
'ip_range_invalid' => 'ÐекарÑктны дыÑпазон IP-адраÑоў.',
'ip_range_toolarge' => 'БлÑкаваньні дыÑпазонаў, большых за /$1, не дазволеныÑ.',
-'blockme' => 'ЗаблÑкуйце мÑне',
'proxyblocker' => 'БлÑкаваньне прокÑÑ–',
-'proxyblocker-disabled' => 'ГÑта Ñ„ÑƒÐ½ÐºÑ†Ñ‹Ñ Ð²Ñ‹ÐºÐ»ÑŽÑ‡Ð°Ð½Ð°Ñ.',
'proxyblockreason' => "Ваш IP-Ð°Ð´Ñ€Ð°Ñ Ð±Ñ‹Ñž заблÑкаваны таму што ён належыць адкрытаму прокÑÑ–.
Калі лаÑка, зьвÑжыцеÑÑ Ð· Вашым ІнтÑрнÑÑ‚-правайдарам альбо Ñа Ñлужбай Ñ‚Ñхнічнай падтрымкі Ñ– паведаміце ім пра гÑтую Ñур'ёзную праблему бÑÑьпекі.",
-'proxyblocksuccess' => 'Зроблена.',
'sorbsreason' => 'Ваш IP-Ð°Ð´Ñ€Ð°Ñ Ð·Ð½Ð°Ñ…Ð¾Ð´Ð·Ñ–Ñ†Ñ†Ð° Ñž ÑьпіÑе адкрытых прокÑÑ– Ñž DNSBL, Ñкім карыÑтаецца {{SITENAME}}.',
'sorbs_create_account_reason' => 'Ваш IP-Ð°Ð´Ñ€Ð°Ñ Ð·Ð½Ð°Ñ…Ð¾Ð´Ð·Ñ–Ñ†Ñ†Ð° Ñž ÑьпіÑе адкрытых прокÑÑ– Ñž DNSBL, Ñкім карыÑтаецца {{SITENAME}}.
Ð’Ñ‹ Ð½Ñ Ð·Ð¼Ð¾Ð¶Ð°Ñ†Ðµ Ñтварыць рахунак',
+'xffblockreason' => 'IP-адраÑ, прыведзены Ñž загалоўку X-Forwarded-For, Ñкі належыць або вам, або прокÑÑ–-ÑÑрвÑру, быў заблÑкаваны. Прычынай блÑÐºÐ°Ð²Ð°Ð½ÑŒÐ½Ñ Ð±Ñ‹Ð»Ð¾: $1',
'cant-block-while-blocked' => 'Ð’Ñ‹ Ð½Ñ Ð¼Ð¾Ð¶Ð°Ñ†Ðµ блÑкаваць іншых удзельнікаў, пакуль Ð’Ñ‹ Ñамі заблÑкаваныÑ.',
'cant-see-hidden-user' => 'Удзельнік, Ñкога Ð’Ñ‹ Ñпрабуеце заблÑкаваць, ужо заблÑкаваны Ñ– Ñхаваны. З-за таго, што Ð’Ñ‹ Ð½Ñ Ð¼Ð°ÐµÑ†Ðµ правоў Ñ…Ð°Ð²Ð°Ð½ÑŒÐ½Ñ ÑžÐ´Ð·ÐµÐ»ÑŒÐ½Ñ–ÐºÐ°Ñž, Ð’Ñ‹ Ð½Ñ Ð¼Ð¾Ð¶Ð°Ñ†Ðµ бачыць альбо зьмÑнÑць блÑкаваньне удзельніка.',
'ipbblocked' => 'Ð’Ñ‹ Ð½Ñ Ð¼Ð¾Ð¶Ð°Ñ†Ðµ блÑкаваць ці раблÑкоўваць іншых удзельнікаў, таму што заблÑÐºÐ°Ð²Ð°Ð½Ñ‹Ñ Ñамі',
@@ -2862,6 +2943,8 @@ $1',
'thumbnail-more' => 'ПавÑлічыць',
'filemissing' => 'Файл адÑутны',
'thumbnail_error' => 'Памылка ÑтварÑÐ½ÑŒÐ½Ñ Ð¼Ñ–Ð½Ñ–Ñтуры: $1',
+'thumbnail_error_remote' => 'Паведамленьне пра памылку з {{GRAMMAR:родны|$1}}:
+$2',
'djvu_page_error' => 'Старонка DjVu па-за прамежкам',
'djvu_no_xml' => 'Ðемагчыма атрымаць XML Ð´Ð»Ñ DjVu-файла',
'thumbnail-temp-create' => 'Ðемагчыма Ñтварыць чаÑовы файл мініÑтуры',
@@ -3013,12 +3096,6 @@ $1',
'tooltip-preferences-save' => 'Захаваць налады',
'tooltip-summary' => 'УвÑдзіце кароткае апіÑаньне',
-# Stylesheets
-'nostalgia.css' => '/* Зьмешчаны тут CSS будзе ўжыты Ñž Ñ‚Ñме Ð°Ñ„Ð°Ñ€Ð¼Ð»ÐµÐ½ÑŒÐ½Ñ Nostalgia */',
-
-# Scripts
-'nostalgia.js' => '/* Зьмешчаны тут JavaScript будзе ўжыты Ñž Ñ‚Ñме Ð°Ñ„Ð°Ñ€Ð¼Ð»ÐµÐ½ÑŒÐ½Ñ Nostalgia */',
-
# Metadata
'notacceptable' => 'Вікі-ÑÑрвÑÑ€ Ð½Ñ Ð¼Ð¾Ð¶Ð° адлюÑтраваць зьвеÑткі Ñž выглÑдзе, Ñкі здольны прачытаць Ваш браўзÑÑ€.',
@@ -3091,13 +3168,8 @@ $1',
'pageinfo-category-files' => 'КолькаÑьць файлаў',
# Skin names
-'skinname-standard' => 'КлÑÑычнае',
-'skinname-nostalgia' => 'ÐаÑтальгіÑ',
'skinname-cologneblue' => 'КёльнÑкі Ñмутак',
'skinname-monobook' => 'Монакніга',
-'skinname-myskin' => 'MySkin',
-'skinname-chick' => 'Цыпа',
-'skinname-simple' => 'ПроÑтае',
'skinname-modern' => 'СучаÑнае',
'skinname-vector' => 'Ð’Ñктар',
@@ -3179,11 +3251,25 @@ $1',
'minutes' => '$1 {{PLURAL:$1|хвіліна|хвіліны|хвілінаў}}',
'hours' => '$1 {{PLURAL:$1|гадзіна|гадзіны|гадзінаў}}',
'days' => '$1 {{PLURAL:$1|дзень|дні|дзён}}',
+'weeks' => '{{PLURAL:$1|$1 тыдзень|$1 тыдні|$1 тыднÑÑž}}',
'months' => '{{PLURAL:$1|$1 меÑÑц|$1 меÑÑцы|$1 меÑÑцаў}}',
'years' => '{{PLURAL:$1|$1 год|$1 гады|$1 гадоў}}',
'ago' => '$1 таму',
'just-now' => 'толькі што',
+# Human-readable timestamps
+'hours-ago' => '$1 {{PLURAL:$1|гадзіну|гадзіны|гадзінаў}} таму',
+'minutes-ago' => '$1 {{PLURAL:$1|хвіліну|хвіліны|хвілінаў}} таму',
+'seconds-ago' => '$1 {{PLURAL:$1|ÑÑкунду|ÑÑкунды|ÑÑкундаў}} таму',
+'monday-at' => 'ПанÑдзелак, $1',
+'tuesday-at' => 'Ðўторак, $1',
+'wednesday-at' => 'Серада, $1',
+'thursday-at' => 'Чацьвер, $1',
+'friday-at' => 'ПÑтніца, $1',
+'saturday-at' => 'Субота, $1',
+'sunday-at' => 'ÐÑдзелÑ, $1',
+'yesterday-at' => 'Учора, $1',
+
# Bad image list
'bad_image_list' => 'Фармат наÑтупны:
@@ -3212,7 +3298,7 @@ $1',
* gpslongitude
* gpsaltitude',
-# EXIF tags
+# Exif tags
'exif-imagewidth' => 'ШырынÑ',
'exif-imagelength' => 'ВышынÑ',
'exif-bitspersample' => 'Ð“Ð»Ñ‹Ð±Ñ–Ð½Ñ ÐºÐ¾Ð»ÐµÑ€Ñƒ',
@@ -3391,7 +3477,7 @@ $1',
'exif-originalimageheight' => 'Ð’Ñ‹ÑˆÑ‹Ð½Ñ Ð²Ñ‹Ñвы да кадраваньнÑ',
'exif-originalimagewidth' => 'Ð¨Ñ‹Ñ€Ñ‹Ð½Ñ Ð²Ñ‹Ñвы да кадраваньнÑ',
-# EXIF attributes
+# Exif attributes
'exif-compression-1' => 'ÐÑÑьціÑнуты',
'exif-compression-2' => 'CCITT Група 3 аднамернае абноўленае кадаваньне адлеглаÑьці Хафмана',
'exif-compression-3' => 'CCITT Група 3 факÑымільнае кадаваньне',
@@ -3791,7 +3877,6 @@ $5
'version-other' => 'ІншыÑ',
'version-mediahandlers' => 'Ðпрацоўшчыкі мÑдыÑ',
'version-hooks' => 'ПрацÑдуры-перахопнікі',
-'version-extension-functions' => 'Функцыі пашырÑньнÑÑž',
'version-parser-extensiontags' => 'ТÑгі пашырÑньнÑÑž парÑÑра',
'version-parser-function-hooks' => 'Перахопнікі функцыÑÑž парÑÑра',
'version-hook-name' => 'Ðазва працÑдуры-перахопніка',
@@ -3801,6 +3886,7 @@ $5
'version-license' => 'ЛіцÑнзіÑ',
'version-poweredby-credits' => "{{SITENAME}} працуе на праграмным забеÑьпÑчÑньні '''[//www.mediawiki.org/ MediaWiki]''', copyright © 2001-$1 $2.",
'version-poweredby-others' => 'іншыÑ',
+'version-poweredby-translators' => 'перакладчыкі з translatewiki.net',
'version-credits-summary' => 'Ðам вельмі хацелаÑÑ Ð± адзначыць наÑтупных аÑобаў, што зрабілі ўнёÑак у [[Special:Version|MediaWiki]].',
'version-license-info' => 'MediaWiki зьÑўлÑецца вольным праграмным забеÑьпÑчÑньнем, Ñкое Ð’Ñ‹ можаце раÑпаўÑюджваць Ñ–/ці зьмÑнÑць на ўмовах ліцÑнзіі GNU General Public License вÑÑ€ÑÑ–Ñ– 2 ці болей позьнÑй, апублікаванай ФундацыÑй вольнага праграмнага забеÑьпÑчÑÐ½ÑŒÐ½Ñ (Free Software Foundation).
@@ -3816,12 +3902,17 @@ MediaWiki раÑпаўÑюджваецца з надзеÑй, што будзе
'version-entrypoints-articlepath' => '[https://www.mediawiki.org/wiki/Manual:$wgArticlePath ШлÑÑ… да артыкула]',
'version-entrypoints-scriptpath' => '[https://www.mediawiki.org/wiki/Manual:$wgScriptPath Пуць да Ñкрыпту]',
-# Special:FilePath
-'filepath' => 'ШлÑÑ… да файла',
-'filepath-page' => 'Файл:',
-'filepath-submit' => 'ПерайÑьці',
-'filepath-summary' => 'ГÑÑ‚Ð°Ñ ÑпÑцыÑÐ»ÑŒÐ½Ð°Ñ Ñтаронка вÑртае поўны шлÑÑ… да файла.
-Ð’Ñ‹Ñвы Ð¿Ð°ÐºÐ°Ð·Ð°Ð½Ñ‹Ñ Ñž поўным выглÑдзе, аÑÑ‚Ð°Ñ‚Ð½Ñ–Ñ Ñ‚Ñ‹Ð¿Ñ‹ файлаў адкрываюцца прыпіÑанымі да Ñ–Ñ… праграмамі.',
+# Special:Redirect
+'redirect' => 'Перанакіраваньне да файла, удзельніка або вÑÑ€ÑÑ–Ñ– Ñтаронкі',
+'redirect-legend' => 'Перанакіраваньне да файла або Ñтаронкі',
+'redirect-summary' => 'ГÑÑ‚Ð°Ñ ÑпÑцыÑÐ»ÑŒÐ½Ð°Ñ Ñтаронка перанакіруе да файла (паводле Ñ–Ð¼Ñ Ñ„Ð°Ð¹Ð»Ð°), Ñтаронкі (паводле нумара вÑÑ€ÑÑ–Ñ–) або Ñтаронкі ўдзельніка (паводле нумара ўдзельніка).',
+'redirect-submit' => 'ПерайÑьці',
+'redirect-lookup' => 'Шукаць паводле:',
+'redirect-value' => 'ЗначÑньне:',
+'redirect-user' => 'ІдÑнтыфікатара ўдзельніка',
+'redirect-revision' => 'Ð’ÑÑ€ÑÑ–Ñ– Ñтаронкі',
+'redirect-file' => 'Ð†Ð¼Ñ Ñ„Ð°Ð¹Ð»Ð°',
+'redirect-not-exists' => 'ЗначÑньне Ð½Ñ Ð·Ð½Ð¾Ð¹Ð´Ð·ÐµÐ½Ð°',
# Special:FileDuplicateSearch
'fileduplicatesearch' => 'Пошук дублікатаў файлаў',
@@ -3871,12 +3962,16 @@ MediaWiki раÑпаўÑюджваецца з надзеÑй, што будзе
'tags' => 'Ð¡Ð»ÑƒÑˆÐ½Ñ‹Ñ Ñ‚Ñгі зьменаў',
'tag-filter' => 'Фільтар [[Special:Tags|Ñ‚Ñгаў]]:',
'tag-filter-submit' => 'Фільтар',
+'tag-list-wrapper' => '([[Special:Tags|{{PLURAL:$1|ТÑг|ТÑгі}}]]: $2)',
'tags-title' => 'ТÑгі',
'tags-intro' => 'Ðа гÑтай Ñтаронцы знаходзіцца ÑÑŒÐ¿Ñ–Ñ Ñ‚Ñгаў, Ñкімі праграмнае забеÑьпÑчÑньне можа пазначыць Ñ€Ñдагаваньне, Ñ– Ñ–Ñ… значÑньне.',
'tags-tag' => 'Ðазва Ñ‚Ñга',
'tags-display-header' => 'ÐÐ¾Ð²Ñ‹Ñ Ð·Ð°Ð¿Ñ–ÑÑ‹ Ñž ÑьпіÑе зьменаў',
'tags-description-header' => 'Поўнае апіÑаньне значÑньнÑ',
+'tags-active-header' => 'Ðктыўны?',
'tags-hitcount-header' => 'ÐŸÐ°Ð·Ð½Ð°Ñ‡Ð°Ð½Ñ‹Ñ Ð·ÑŒÐ¼ÐµÐ½Ñ‹',
+'tags-active-yes' => 'Так',
+'tags-active-no' => 'Ðе',
'tags-edit' => 'Ñ€Ñдагаваць',
'tags-hitcount' => '$1 {{PLURAL:$1|зьмена|зьмены|зьменаў}}',
@@ -3897,6 +3992,7 @@ MediaWiki раÑпаўÑюджваецца з надзеÑй, што будзе
'dberr-problems' => 'Прабачце! Ðа гÑтым Ñайце ўзьніклі Ñ‚ÑÑ…Ð½Ñ–Ñ‡Ð½Ñ‹Ñ Ñ†ÑжкаÑьці.',
'dberr-again' => 'ПаÑпрабуйце пачакаць некалькі хвілінаў Ñ– абнавіць.',
'dberr-info' => '(Ðемагчыма злучыцца з ÑÑрвÑрам базы зьвеÑтак: $1)',
+'dberr-info-hidden' => '(немагчыма злучыцца з ÑÑрвÑрам базы зьвеÑтак)',
'dberr-usegoogle' => 'Ð’Ñ‹ можаце пакуль паÑпрабаваць пашукаць праз Google.',
'dberr-outofdate' => 'Увага, індÑкÑÑ‹ нашага зьмеÑту могуць быць ÑаÑтарÑлымі.',
'dberr-cachederror' => 'ÐаÑÑ‚ÑƒÐ¿Ð½Ð°Ñ Ñтаронка была загружана з кÑшу Ñ– можа быць ÑаÑтарÑлай.',
@@ -3912,6 +4008,9 @@ MediaWiki раÑпаўÑюджваецца з надзеÑй, што будзе
'htmlform-submit' => 'Захаваць',
'htmlform-reset' => 'ÐдмÑніць зьмены',
'htmlform-selectorother-other' => 'Іншае',
+'htmlform-no' => 'Ðе',
+'htmlform-yes' => 'Так',
+'htmlform-chosen-placeholder' => 'Выберыце варыÑнт',
# SQLite database support
'sqlite-has-fts' => '$1 з падтрымкай поўнатÑкÑтнага пошуку',
@@ -4029,4 +4128,19 @@ MediaWiki раÑпаўÑюджваецца з надзеÑй, што будзе
# Image rotation
'rotate-comment' => 'Ð’Ñ‹Ñва Ð¿Ð°Ð²ÐµÑ€Ð½ÑƒÑ‚Ð°Ñ Ð½Ð° $1{{PLURAL:$1|°}} па гадзіньнікавай ÑÑ‚Ñ€Ñлцы',
+# Limit report
+'limitreport-title' => 'ЗьвеÑткі прафілÑÐ²Ð°Ð½ÑŒÐ½Ñ Ð¿Ð°Ñ€ÑÑра:',
+'limitreport-cputime' => 'ПрацÑÑарны чаÑ',
+'limitreport-cputime-value' => '$1 {{PLURAL:$1|ÑÑкунда|ÑÑкунды|ÑÑкундаў}}',
+'limitreport-walltime' => 'Сапраўдны чаÑ',
+'limitreport-walltime-value' => '$1 {{PLURAL:$1|ÑÑкунда|ÑÑкунды|ÑÑкундаў}}',
+'limitreport-ppvisitednodes' => 'КолькаÑьць наведаных прÑпрацÑÑарам вузлоў',
+'limitreport-ppgeneratednodes' => 'КолькаÑьць Ñтвораных прÑпрацÑÑарам вузлоў',
+'limitreport-postexpandincludesize' => 'Памер уключÑньнÑÑž па разгортваньні',
+'limitreport-postexpandincludesize-value' => '$1/$2 {{PLURAL:$2|байт}}',
+'limitreport-templateargumentsize' => 'Памер аргумÑнтаў шаблёнаў',
+'limitreport-templateargumentsize-value' => '$1/$2 {{PLURAL:$2|байт}}',
+'limitreport-expansiondepth' => 'ÐÐ°Ð¹Ð±Ð¾Ð»ÑŒÑˆÐ°Ñ Ð³Ð»Ñ‹Ð±Ñ–Ð½Ñ Ñ€Ð°Ð·Ð³Ð¾Ñ€Ñ‚Ð²Ð°Ð½ÑŒÐ½Ñ',
+'limitreport-expensivefunctioncount' => 'КолькаÑьць дарагіх функцыÑÑž парÑÑра',
+
);
diff --git a/languages/messages/MessagesBg.php b/languages/messages/MessagesBg.php
index 581b70c3..f3db6e5f 100644
--- a/languages/messages/MessagesBg.php
+++ b/languages/messages/MessagesBg.php
@@ -14,8 +14,10 @@
* @author Dimi z
* @author Geitost
* @author Kaganer
+ * @author Simona
* @author Spiritia
* @author Stanqo
+ * @author Termininja
* @author Turin
* @author Urhixidur
* @author Vladimir Penov
@@ -267,11 +269,6 @@ $messages = array(
'tog-shownumberswatching' => 'Показване на Ð±Ñ€Ð¾Ñ Ð½Ð° потребителите, наблюдаващи дадена Ñтраница',
'tog-oldsig' => 'Текущ подпиÑ:',
'tog-fancysig' => 'Без превръщане на подпиÑа в препратка към потребителÑката Ñтраница',
-'tog-externaleditor' => 'Използване на външен редактор по подразбиране (Ñамо за екÑперти, необходими Ñа Ñпециални наÑтройки на компютъра.
-[//www.mediawiki.org/wiki/Manual:External_editors Повече информациÑ.])',
-'tog-externaldiff' => 'Използване на външна програма за разлики по подразбиране (Ñамо за екÑперти, необходими Ñа Ñпециални наÑтройки на компютъра.
-[//www.mediawiki.org/wiki/Manual:External_editors Повече информациÑ.])',
-'tog-showjumplinks' => 'Показване на препратки за доÑтъпноÑÑ‚ от типа „Към…“',
'tog-uselivepreview' => 'Използване на бърз предварителен преглед (екÑпериментално)',
'tog-forceeditsummary' => 'Предупреждаване при празно поле за резюме на редакциÑта',
'tog-watchlisthideown' => 'Скриване на моите редакции в ÑпиÑъка ми за наблюдение',
@@ -284,6 +281,8 @@ $messages = array(
'tog-diffonly' => 'Без показване на Ñъдържанието на Ñтраницата при преглед на разлики',
'tog-showhiddencats' => 'Показване на Ñкритите категории',
'tog-norollbackdiff' => 'ПропуÑкане на разликовата връзка Ñлед извършване на отмÑна на редакции',
+'tog-useeditwarning' => 'Предупреждаване при опит за напуÑкане на Ñтраница, отворена в режим на редактиране, без да Ñа запазени промените',
+'tog-prefershttps' => 'Да Ñе използва винаги защитена връзка Ñлед влизане',
'underline-always' => 'Винаги',
'underline-never' => 'Ðикога',
@@ -347,6 +346,18 @@ $messages = array(
'oct' => 'окт',
'nov' => 'ное',
'dec' => 'дек',
+'january-date' => '$1 Ñнуари',
+'february-date' => '$1 февруари',
+'march-date' => '$1 март',
+'april-date' => '$1 април',
+'may-date' => '$1 май',
+'june-date' => '$1 юни',
+'july-date' => '$1 юли',
+'august-date' => '$1 авгуÑÑ‚',
+'september-date' => '$1 Ñептември',
+'october-date' => '$1 октомври',
+'november-date' => '$1 ноември',
+'december-date' => '$1 декември',
# Categories related messages
'pagecategories' => '{{PLURAL:$1|КатегориÑ|Категории}}',
@@ -428,6 +439,7 @@ $messages = array(
'create-this-page' => 'Създаване на Ñтраницата',
'delete' => 'Изтриване',
'deletethispage' => 'Изтриване',
+'undeletethispage' => 'ВъзÑтановÑване на Ñтраницата',
'undelete_short' => 'ВъзÑтановÑване на {{PLURAL:$1|една редакциÑ|$1 редакции}}',
'viewdeleted_short' => 'Преглед на {{PLURAL:$1|една изтрита редакциÑ|$1 изтрити редакции}}',
'protect' => 'Защита',
@@ -471,7 +483,7 @@ $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).
+# 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).
'aboutsite' => 'За {{SITENAME}}',
'aboutpage' => 'Project:За {{SITENAME}}',
'copyright' => 'ОÑвен ако не е поÑочено друго, Ñъдържанието е доÑтъпно при уÑловиÑта на $1.',
@@ -481,7 +493,6 @@ $1',
'disclaimers' => 'УÑÐ»Ð¾Ð²Ð¸Ñ Ð·Ð° ползване',
'disclaimerpage' => 'Project:УÑÐ»Ð¾Ð²Ð¸Ñ Ð·Ð° ползване',
'edithelp' => 'Помощ при редактиране',
-'edithelppage' => 'Help:Редактиране',
'helppage' => 'Help:Съдържание',
'mainpage' => 'Ðачална Ñтраница',
'mainpage-description' => 'Ðачална Ñтраница',
@@ -559,17 +570,12 @@ $1',
# General errors
'error' => 'Грешка',
'databaseerror' => 'Грешка при работа Ñ Ð±Ð°Ð·Ð°Ñ‚Ð° от данни',
-'dberrortext' => 'Възникна Ñинтактична грешка при заÑвка към базата данни.
-Това може да означава грешка в Ñофтуера.
-ПоÑледната заÑвка към базата данни беше:
-<blockquote><code>$1</code></blockquote>
-при функциÑта „<code>$2</code>“.
-Базата от данни върна грешка „<samp>$3: $4</samp>“.',
-'dberrortextcl' => 'Възникна Ñинтактична грешка при заÑвка към базата данни.
-ПоÑледната заÑвка към базата данни беше:
-„$1“
-при функциÑта „$2“.
-MySQL върна грешка „$3: $4“',
+'databaseerror-text' => 'Възникна грешка при заÑвката за базата данни.
+Това може да означава бъг в Ñофтуера.',
+'databaseerror-textcl' => 'Възникна грешка при заÑвка за базата данни.',
+'databaseerror-query' => 'ЗаÑвка: $1',
+'databaseerror-function' => 'ФункциÑ: $1',
+'databaseerror-error' => 'Грешка: $1',
'laggedslavemode' => 'Внимание: Страницата може да не Ñъдържа поÑледните обновÑваниÑ.',
'readonly' => 'Базата от данни е затворена за промени',
'enterlockreason' => 'ПоÑочете причина за затварÑнето, като дадете и приблизителна оценка кога базата от данни ще бъде отново отворена',
@@ -600,6 +606,7 @@ $1',
'badarticleerror' => 'ДейÑтвието не може да Ñе изпълни върху Ñтраницата.',
'cannotdelete' => 'Указаната Ñтраница или файл "$1" не можа да бъде изтрит(а). Възможно е вече да е бил(а) изтрит(а) от нÑкой друг.',
'cannotdelete-title' => 'Страницата „$1“ не може да бъде изтрита',
+'no-null-revision' => 'Ðе може да бъде Ñъздадена празна верÑÐ¸Ñ Ð½Ð° Ñтраницата „$1“',
'badtitle' => 'Ðевалидно заглавие',
'badtitletext' => 'Желаното заглавие на Ñтраница е невалидно, празно или неправилна препратка към друго уики. Възможно е да Ñъдържа знаци, които не Ñа позволени в заглавиÑ.',
'perfcached' => 'Следните данни Ñа извлечени от Ñклада и затова може да не отговарÑÑ‚ на текущото ÑÑŠÑтоÑние. Ð’ Ñкладираното копие {{PLURAL:$1|е допуÑтим най-много един резултат|Ñа допуÑтими най-много $1 резултата}}.',
@@ -619,12 +626,15 @@ $1',
За извършване на промÑна за вÑички уикита, поÑетете [//translatewiki.net/ translatewiki.net], проектът за Ð»Ð¾ÐºÐ°Ð»Ð¸Ð·Ð°Ñ†Ð¸Ñ Ð½Ð° MediaWiki.',
'editinginterface' => "'''Внимание:''' Редактирате Ñтраница, коÑто Ñе използва за интерфейÑа на Ñофтуера. ПромÑната й ще повлиÑе на Ð²ÑŠÐ½ÑˆÐ½Ð¸Ñ Ð²Ð¸Ð´ на уикито.
За превеждане, обмиÑлете използването на [//translatewiki.net/ translatewiki.net], проектът за локализиране на MediaWiki.",
-'sqlhidden' => '(ЗаÑвка на SQL — Ñкрита)',
'cascadeprotected' => 'Тази Ñтраница е защитена против редактиране, защото е включена в {{PLURAL:$1|Ñледната Ñтраница, коÑто от ÑÐ²Ð¾Ñ Ñтрана има|Ñледните Ñтраници, които от ÑÐ²Ð¾Ñ Ñтрана имат}} каÑкадна защита:
$2',
'namespaceprotected' => "ÐÑмате права за редактиране на Ñтраници в именно проÑтранÑтво '''$1'''.",
'customcssprotected' => 'ÐÑмате права за редактиране на тази CSS Ñтраница, защото Ñ‚Ñ Ñъдържа чужди потребителÑки наÑтройки.',
'customjsprotected' => 'ÐÑмате права за редактиране на тази ДжаваÑкрипт Ñтраница, защото Ñ‚Ñ Ñъдържа чужди потребителÑки наÑтройки.',
+'mycustomcssprotected' => 'ÐÑмате права за редактиране на тази CSS Ñтраница.',
+'mycustomjsprotected' => 'ÐÑмате права за редактиране на тази JavaScript Ñтраница.',
+'myprivateinfoprotected' => 'ÐÑмате права да редактирате личната Ñи информациÑ.',
+'mypreferencesprotected' => 'ÐÑмате права да редактирате наÑтройките Ñи.',
'ns-specialprotected' => 'Специалните Ñтраници не могат да бъдат редактирани.',
'titleprotected' => "Тази Ñтраница е била защитена Ñрещу Ñъздаване от [[User:$1|$1]].
ПоÑочената причина е ''$2''.",
@@ -647,10 +657,18 @@ $2',
'welcomecreation-msg' => 'Вашата Ñметка беше Ñъздадена.
Можете да промените [[Special:Preferences|наÑтройките на {{SITENAME}}]] Ñпоред предпочитаниÑта Ñи.',
'yourname' => 'ПотребителÑко име:',
+'userlogin-yourname' => 'ПотребителÑко име',
+'userlogin-yourname-ph' => 'Въведете вашето потребителÑко име',
+'createacct-another-username-ph' => 'Въвежда Ñе потребителÑкото име',
'yourpassword' => 'Парола:',
+'userlogin-yourpassword' => 'Парола',
+'userlogin-yourpassword-ph' => 'Въведете вашата парола',
+'createacct-yourpassword-ph' => 'Въведете парола',
'yourpasswordagain' => 'Парола (повторно):',
+'createacct-yourpasswordagain' => 'Потвърждаване на паролата',
+'createacct-yourpasswordagain-ph' => 'Въвежда Ñе паролата (повторно)',
'remembermypassword' => 'ЗапомнÑне на паролата на този компютър (най-много за $1 {{PLURAL:$1|ден|дни}})',
-'securelogin-stick-https' => 'Запазване на връзката през HTTPS Ñлед влизане',
+'userlogin-signwithsecure' => 'Използване на защитена връзка',
'yourdomainname' => 'Домейн:',
'password-change-forbidden' => 'Ðе можете да променÑте пароли в това уики.',
'externaldberror' => 'Или е Ñтанала грешка в базата от данни при външното удоÑтоверÑване, или не ви е позволено да обновÑвате външната Ñи Ñметка.',
@@ -664,18 +682,42 @@ $2',
'logout' => 'Излизане',
'userlogout' => 'Излизане',
'notloggedin' => 'Ðе Ñте влезли',
+'userlogin-noaccount' => 'ÐÑмате Ñметка?',
+'userlogin-joinproject' => 'ПриÑъединÑване към {{SITENAME}}',
'nologin' => 'ÐÑмате потребителÑко име? $1.',
'nologinlink' => 'Създаване на Ñметка',
'createaccount' => 'РегиÑтриране',
'gotaccount' => "Имате ли вече Ñметка? '''$1'''.",
'gotaccountlink' => 'Влизане',
'userlogin-resetlink' => 'Забравени данни за влизане в ÑиÑтемата?',
+'userlogin-resetpassword-link' => 'ВъзÑтановÑване на паролата',
+'helplogin-url' => 'Help:Влизане',
+'userlogin-helplink' => '[[{{MediaWiki:helplogin-url}}|Помощ за влизане]] в ÑиÑтемата',
+'userlogin-loggedin' => 'Вече Ñте влезли в ÑиÑтемата като {{GENDER:$1|$1}}.
+Чрез формулÑра по-долу можете да влезете като друг потребител.',
+'userlogin-createanother' => 'Създаване на друга Ñметка',
+'createacct-join' => 'Въведете Ñвоите данни по-долу.',
+'createacct-another-join' => 'Попълване на информациÑта за новата Ñметка',
+'createacct-emailrequired' => 'ÐÐ´Ñ€ÐµÑ Ð·Ð° електронна поща',
+'createacct-emailoptional' => 'ÐÐ´Ñ€ÐµÑ Ð·Ð° електронна поща (незадължително)',
+'createacct-another-email-ph' => 'Въвежда Ñе електронна поща',
'createaccountmail' => 'Използване на Ñлучайна временна парола, коÑто Ñе изпраща на електронната поща, поÑочена по-долу',
+'createacct-realname' => 'ИÑтинÑко име (незадължително)',
'createaccountreason' => 'Причина:',
+'createacct-reason' => 'Причина',
+'createacct-reason-ph' => 'Защо Ñъздавате друга Ñметка',
+'createacct-captcha' => 'Проверка за ÑигурноÑÑ‚',
+'createacct-imgcaptcha-ph' => 'Въведете текÑта, който виждате по-горе',
+'createacct-submit' => 'Създаване на Ñметката',
+'createacct-another-submit' => 'Създаване на друга Ñметка',
+'createacct-benefit-heading' => '{{SITENAME}} Ñе Ñъздава от хора като ваÑ.',
+'createacct-benefit-body1' => '{{PLURAL:$1|редакциÑ|редакции}}',
+'createacct-benefit-body2' => '{{PLURAL:$1|Ñтраница|Ñтраници}}',
'badretype' => 'Въведените пароли не Ñъвпадат.',
'userexists' => 'Въведеното потребителÑко име вече Ñе използва.
Изберете друго име.',
'loginerror' => 'Грешка при влизане',
+'createacct-error' => 'Грешка при Ñъздаване на Ñметка',
'createaccounterror' => 'Ðе може да бъде Ñъздадена Ñметка: $1',
'nocookiesnew' => 'ПотребителÑката Ñметка беше Ñъздадена, но вÑе още не Ñте влезли. {{SITENAME}} използва биÑквитки при влизането на потребителите. Разрешете биÑквитките в браузъра Ñи, тъй като те Ñа забранени, а Ñлед това влезте Ñ Ð¿Ð¾Ñ‚Ñ€ÐµÐ±Ð¸Ñ‚ÐµÐ»Ñкото Ñи име и парола.',
'nocookieslogin' => '{{SITENAME}} използва биÑквитки (cookies) за Ð·Ð°Ð¿Ð¸Ñ Ð½Ð° влизаниÑта. Разрешете биÑквитките в браузъра Ñи, тъй като те Ñа забранени, и опитайте отново.',
@@ -747,7 +789,7 @@ $2',
'newpassword' => 'Ðова парола:',
'retypenew' => 'Ðова парола повторно:',
'resetpass_submit' => 'Избиране на парола и влизане',
-'resetpass_success' => 'Паролата ви беше Ñменена! Сега влизате…',
+'changepassword-success' => 'Паролата ви беше променена уÑпешно!',
'resetpass_forbidden' => 'Ðе е разрешена ÑмÑна на паролата',
'resetpass-no-info' => 'За да доÑтъпвате тази Ñтраница директно, необходимо е да влезете в ÑиÑтемата.',
'resetpass-submit-loggedin' => 'ПромÑна на паролата',
@@ -759,10 +801,11 @@ $2',
# Special:PasswordReset
'passwordreset' => 'ВъзÑтановÑване на парола',
-'passwordreset-text' => 'Попълването на формулÑра ще доведе до възÑтановÑване на паролата.',
+'passwordreset-text-one' => 'Попълването на формулÑра ще доведе до възÑтановÑване на паролата.',
+'passwordreset-text-many' => '{{PLURAL:$1|За възÑтановÑване на паролата е необходимо да Ñе попълни едно от полетата.}}',
'passwordreset-legend' => 'ВъзÑтановÑване на парола',
'passwordreset-disabled' => 'ВъзÑтановÑването на паролата е изключено в това уики.',
-'passwordreset-pretext' => '{{PLURAL:$1||Въведете нÑÐºÐ¾Ñ Ð¾Ñ‚ информациите по-долу}}',
+'passwordreset-emaildisabled' => 'ФункционалноÑтта за електронна поща е изключена в това уики.',
'passwordreset-username' => 'ПотребителÑко име:',
'passwordreset-domain' => 'Домейн:',
'passwordreset-capture' => 'Преглеждане на електронното пиÑмо?',
@@ -789,7 +832,7 @@ $2
Временна парола: $2',
'passwordreset-emailsent' => 'Ðа електронната поща беше иÑпратено пиÑмо за възÑтановÑване на паролата.',
'passwordreset-emailsent-capture' => 'По-долу е показано електронното пиÑмо за възÑтановÑване на паролата, което беше изпратено.',
-'passwordreset-emailerror-capture' => 'По-долу е показано Ñъздадено електронно пиÑмо за напомнÑне, което не беше изпратено на потребителÑ: $1',
+'passwordreset-emailerror-capture' => 'По-долу е показано Ñъздадено електронно пиÑмо за възÑтановÑване на паролата, което не беше изпратено на {{GENDER:$2|потребителÑ}}: $1',
# Special:ChangeEmail
'changeemail' => 'ПромÑна на адреÑа за е-поща',
@@ -803,6 +846,9 @@ $2
'changeemail-submit' => 'ПромÑна на е-пощата',
'changeemail-cancel' => 'Отказване',
+# Special:ResetTokens
+'resettokens-token-label' => '$1 (текуща ÑтойноÑÑ‚: $2)',
+
# Edit page toolbar
'bold_sample' => 'Получер текÑÑ‚',
'bold_tip' => 'Получер (удебелен) текÑÑ‚',
@@ -879,9 +925,7 @@ $2
'loginreqlink' => 'влизане',
'loginreqpagetext' => 'Ðеобходимо е $1, за да можете да разглеждате други Ñтраници.',
'accmailtitle' => 'Паролата беше изпратена.',
-'accmailtext' => "Случайно генерирана парола за [[User talk:$1|$1]] беше изпратена на $2.
-
-Паролата за тази нова потребителÑка Ñметка може да бъде променена от Ñпециалната Ñтраница ''[[Special:ChangePassword|„ПромÑна на парола“]]'' Ñлед влизане в ÑиÑтемата.",
+'accmailtext' => "Случайно генерирана парола за [[User talk:$1|$1]] беше изпратена на $2. Паролата може да бъде променена от Ñтраницата ''[[Special:ChangePassword|„ПромÑна на паролата“]]'' Ñлед влизане в ÑиÑтемата.",
'newarticle' => '(нова)',
'newarticletext' => 'ПоÑледвахте препратка към Ñтраница, коÑто вÑе още не ÑъщеÑтвува.
За да Ñ Ñъздадете, проÑто започнете да пишете в долната текÑтова кутиÑ
@@ -979,7 +1023,7 @@ $2
'nocreate-loggedin' => 'ÐÑмате необходимите права да Ñъздавате нови Ñтраници.',
'sectioneditnotsupported-title' => 'Ðе Ñе поддържа редактиране на раздели',
'sectioneditnotsupported-text' => 'Ðе Ñе поддържа редактиране на раздели на тази Ñтраница.',
-'permissionserrors' => 'Грешки при правата на доÑтъп',
+'permissionserrors' => 'Грешка при правата на доÑтъп',
'permissionserrorstext' => 'ÐÑмате правата да извършите това дейÑтвие по {{PLURAL:$1|Ñледната причина|Ñледните причини}}:',
'permissionserrorstext-withaction' => 'ÐÑмате разрешение за $2 поради {{PLURAL:$1|Ñледната причина|Ñледните причини}}:',
'recreate-moveddeleted-warn' => "'''Внимание: Създавате Ñтраница, коÑто по-рано вече е била изтрита.'''
@@ -994,6 +1038,7 @@ $2
ВероÑтно междувременно е била изтрита.',
'edit-conflict' => 'Редакционен конфликт.',
'edit-no-change' => 'Вашата Ñ€ÐµÐ´Ð°ÐºÑ†Ð¸Ñ Ð±ÐµÑˆÐµ игнорирана, тъй като не Ñъдържа промени по текÑта.',
+'postedit-confirmation' => 'Вашата Ñ€ÐµÐ´Ð°ÐºÑ†Ð¸Ñ Ð±ÐµÑˆÐµ Ñъхранена',
'edit-already-exists' => 'Ðе можа да Ñе Ñъздаде нова Ñтраница.
Такава вече ÑъщеÑтвува.',
'defaultmessagetext' => 'ТекÑÑ‚ на Ñъобщението по подразбиране',
@@ -1001,6 +1046,8 @@ $2
'invalid-content-data' => 'Ðевалидни данни за Ñъдържание',
'content-not-allowed-here' => '
Ðа Ñтраницата [[$2]] не е позволено използването на $1',
+'editwarning-warning' => 'Ðко излезете от тази Ñтраница, може да загубите вÑички незапазени промени, които Ñте направили.
+Ðко Ñте влезли в ÑиÑтемата, можете да изключите това предупреждение през меню "Редактиране" във вашите лични наÑтройки.',
# Content models
'content-model-wikitext' => 'уикитекÑÑ‚',
@@ -1206,6 +1253,7 @@ $1",
'compareselectedversions' => 'Сравнение на избраните верÑии',
'showhideselectedversions' => 'Показване/Ñкриване на избрани верÑии',
'editundo' => 'връщане',
+'diff-empty' => '(ÐÑма разлика)',
'diff-multi' => '({{PLURAL:$1|Ðе е показана една междинна верÑиÑ|Ðе Ñа показани $1 междинни верÑии}} от {{PLURAL:$2|един потребител|$2 потребителÑ}}.)',
'diff-multi-manyusers' => '({{PLURAL:$1|Ðе е показана една междинна верÑиÑ|Ðе Ñа показани $1 междинни верÑии}} от повече от $2 {{PLURAL:$2|потребител|потребителÑ}})',
'difference-missing-revision' => '{{PLURAL:$2|Ðе беше открита|Ðе бÑха открити}} {{PLURAL:$2|една верÑиÑ|$2 верÑии}} от тази разликова препратка ($1).
@@ -1233,7 +1281,6 @@ $1",
'searchmenu-legend' => 'ÐаÑтройки на Ñ‚ÑŠÑ€Ñенето',
'searchmenu-exists' => "'''СъщеÑтвува Ñтраница Ñ Ð¸Ð¼ÐµÑ‚Ð¾ „[[:$1]]“ в това уики.'''",
'searchmenu-new' => "'''Създаване на Ñтраницата „[[:$1]]“ в това уики!'''",
-'searchhelp-url' => 'Help:Съдържание',
'searchmenu-prefix' => '[[Special:PrefixIndex/$1|Преглеждане на Ñтраниците Ñ Ñ‚Ð°Ð·Ð¸ предÑтавка]]',
'searchprofile-articles' => 'Съдържателни Ñтраници',
'searchprofile-project' => 'Помощни и проектни Ñтраници',
@@ -1276,15 +1323,6 @@ $1",
'search-external' => 'Външно Ñ‚ÑŠÑ€Ñене',
'searchdisabled' => 'ТърÑенето в {{SITENAME}} е временно изключено. Междувременно можете да Ñ‚ÑŠÑ€Ñите чрез Google. Обърнете внимание, че Ñъхранените при Ñ‚ÑÑ… Ñтраници най-вероÑтно Ñа оÑтарели.',
-# Quickbar
-'qbsettings' => 'Лента за бърз избор',
-'qbsettings-none' => 'Без меню',
-'qbsettings-fixedleft' => 'Ðеподвижно влÑво',
-'qbsettings-fixedright' => 'Ðеподвижно вдÑÑно',
-'qbsettings-floatingleft' => 'Плаващо влÑво',
-'qbsettings-floatingright' => 'Плаващо вдÑÑно',
-'qbsettings-directionality' => 'ФикÑирана, в завиÑимоÑÑ‚ от поÑоката на пиÑане на Ð²Ð°ÑˆÐ¸Ñ ÐµÐ·Ð¸Ðº',
-
# Preferences page
'preferences' => 'ÐаÑтройки',
'mypreferences' => 'ÐаÑтройки',
@@ -1315,9 +1353,8 @@ $1",
'prefs-rendering' => 'Облик',
'saveprefs' => 'СъхранÑване',
'resetprefs' => 'ОтмÑна на текущите промени',
-'restoreprefs' => 'ВъзÑтановÑване на вÑички наÑтройки по подразбиране',
+'restoreprefs' => 'ВъзÑтановÑване на вÑички наÑтройки по подразбиране (за вÑички раздели)',
'prefs-editing' => 'Редактиране',
-'prefs-edit-boxsize' => 'Размер на прозореца за редактиране.',
'rows' => 'Редове:',
'columns' => 'Колони:',
'searchresultshead' => 'ТърÑене',
@@ -1328,9 +1365,6 @@ $1",
'recentchangesdays-max' => '(най-много $1 {{PLURAL:$1|ден|дни}})',
'recentchangescount' => 'Брой показвани редакции по подразбиране:',
'prefs-help-recentchangescount' => 'Това включва поÑледните промени, иÑториите на Ñтраниците и дневниците.',
-'prefs-help-watchlist-token' => 'ВпиÑването на таен ключ в това поле ще генерира RSS емиÑÐ¸Ñ Ð·Ð° Ð²Ð°ÑˆÐ¸Ñ ÑпиÑък за наблюдение.
-Ð’Ñеки, който знае тази парола, ще може да чете ÑпиÑъка ви за наблюдение, затова изберете нÑкаква Ñигурна комбинациÑ.
-Можете да използвате Ñледната Ñлучайно генерирана комбинациÑ: $1',
'savedprefs' => 'ÐаÑтройките ви бÑха Ñъхранени.',
'timezonelegend' => 'ЧаÑова зона:',
'localtime' => 'МеÑтно време:',
@@ -1361,7 +1395,6 @@ $1",
'prefs-reset-intro' => 'Тази Ñтраница може да Ñе използва за възÑтановÑване на потребителÑките наÑтройки към Ñтандартните за Ñайта.
Това дейÑтвие е необратимо.',
'prefs-emailconfirm-label' => 'Потвърждаване на Ð°Ð´Ñ€ÐµÑ Ð·Ð° е-поща:',
-'prefs-textboxsize' => 'Размер на кутиÑта за редактиране',
'youremail' => 'Е-поща:',
'username' => '{{GENDER:$1|ПотребителÑко име}}:',
'uid' => '{{GENDER:$1|ПотребителÑки}} номер:',
@@ -1392,6 +1425,7 @@ $1",
'prefs-dateformat' => 'Формат на датата',
'prefs-timeoffset' => 'ЧаÑово отмеÑтване',
'prefs-advancedediting' => 'Общи наÑтройки',
+'prefs-preview' => 'Преглед',
'prefs-advancedrc' => 'Разширени наÑтройки',
'prefs-advancedrendering' => 'Разширени наÑтройки',
'prefs-advancedsearchoptions' => 'Разширени наÑтройки',
@@ -1400,6 +1434,7 @@ $1",
'prefs-displaysearchoptions' => 'ÐаÑтройки на изгледа',
'prefs-displaywatchlist' => 'Видими наÑтройки',
'prefs-diffs' => 'Разлики',
+'prefs-help-prefershttps' => 'Това предпочитание ще бъде активирано при Ñледващото влизане.',
# User preference: email validation using jQuery
'email-address-validity-valid' => 'ÐдреÑÑŠÑ‚ за е-поща изглежда валиден',
@@ -1558,6 +1593,8 @@ $1",
# Recent changes
'nchanges' => '$1 {{PLURAL:$1|промÑна|промени}}',
+'enhancedrc-since-last-visit' => '$1 {{PLURAL:$1|от поÑледното поÑещение}}',
+'enhancedrc-history' => 'иÑториÑ',
'recentchanges' => 'ПоÑледни промени',
'recentchanges-legend' => 'Опции на ÑпиÑъка Ñ Ð¿Ð¾Ñледни промени',
'recentchanges-summary' => "ПроÑледÑване на поÑледните промени в {{SITENAME}}.
@@ -1600,7 +1637,6 @@ $1",
'recentchangeslinked-feed' => 'Свързани промени',
'recentchangeslinked-toolbox' => 'Свързани промени',
'recentchangeslinked-title' => 'Промени, Ñвързани Ñ â€ž$1“',
-'recentchangeslinked-noresult' => 'ÐÑма промени в Ñвързаните Ñтраници за Ð´Ð°Ð´ÐµÐ½Ð¸Ñ Ð¿ÐµÑ€Ð¸Ð¾Ð´.',
'recentchangeslinked-summary' => "Тук Ñе показват поÑледните промени на Ñтраниците, към които Ñе препраща от дадена Ñтраница. При избиране на категориÑ, Ñе показват промените по Ñтраниците, влизащи в неÑ. ''Пример:'' Ðко изберете Ñтраницата '''Ð''', коÑто Ñъдържа препратки към '''Б''' и '''Ð’''', тогава ще можете да прегледате промените по '''Б''' и '''Ð’'''.
Ðко пък Ñложите отметка пред '''Обръщане на релациÑта''', ще можете да прегледате промените в обратна поÑока: ще Ñе включат тези Ñтраници, които Ñъдържат препратки към поÑочената Ñтраница.
@@ -1615,7 +1651,7 @@ $1",
'reuploaddesc' => 'Връщане към формулÑра за качване.',
'upload-tryagain' => 'СъхранÑване на промененото опиÑание на файла',
'uploadnologin' => 'Ðе Ñте влезли',
-'uploadnologintext' => 'Ðеобходимо е да [[Special:UserLogin|влезете]], за да може да качвате файлове.',
+'uploadnologintext' => 'За да могат да бъдат качвани файлове е необходимо $1 в ÑиÑтемата.',
'upload_directory_missing' => 'ДиректориÑта за качване ($1) липÑва и не може да бъде Ñъздадена на Ñървъра.',
'upload_directory_read_only' => 'Сървърът нÑма доÑтъп за пиÑане в директориÑта за качване „$1“.',
'uploaderror' => 'Грешка при качване',
@@ -1784,7 +1820,6 @@ $1',
'http-read-error' => 'HTTP грешка при четене.',
'http-timed-out' => 'ПреÑрочено време за HTTP заÑвка.',
'http-curl-error' => 'Грешка при извличането на URL: $1',
-'http-host-unreachable' => 'ÐедоÑтъпен URL.',
'http-bad-status' => 'ÐаÑтъпи проблем по време на HTTP заÑвката: $1 $2',
# Some likely curl errors. More could be added from <http://curl.haxx.se/libcurl/c/libcurl-errors.html>
@@ -1813,6 +1848,10 @@ $1',
'listfiles_size' => 'Размер',
'listfiles_description' => 'ОпиÑание',
'listfiles_count' => 'ВерÑии',
+'listfiles-show-all' => 'Включване на Ñтарите верÑии на изображениÑта',
+'listfiles-latestversion' => 'Текущата верÑиÑ',
+'listfiles-latestversion-yes' => 'Да',
+'listfiles-latestversion-no' => 'Ðе',
# File description page
'file-anchor-link' => 'Файл',
@@ -1929,10 +1968,6 @@ $1',
'statistics-users-active-desc' => 'Потребители, направили Ñ€ÐµÐ´Ð°ÐºÑ†Ð¸Ñ Ð¿Ñ€ÐµÐ· {{PLURAL:$1|поÑÐ»ÐµÐ´Ð½Ð¸Ñ Ð´ÐµÐ½|поÑледните $1 дни}}',
'statistics-mostpopular' => 'Ðай-преглеждани Ñтраници',
-'disambiguations' => 'Страници, Ñочещи към поÑÑнителни Ñтраници',
-'disambiguationspage' => 'Template:ПоÑÑнение',
-'disambiguations-text' => "Следните Ñтраници Ñочат към '''поÑÑнителна Ñтраница''', вмеÑто към иÑтинÑката тематична Ñтраница.<br />Една Ñтраница Ñе ÑмÑта за поÑÑнителна, ако ползва шаблон, към който Ñе препраща от [[MediaWiki:Disambiguationspage]].",
-
'doubleredirects' => 'Двойни пренаÑочваниÑ',
'doubleredirectstext' => 'Тази Ñтраница Ñъдържа ÑпиÑък ÑÑŠÑ Ñтраници, които пренаÑочват към друга пренаÑочваща Ñтраница.
Ð’Ñеки ред Ñъдържа препратки към първото и второто пренаÑочване, както и целта на второто пренаÑочване, коÑто обикновено е „иÑтинÑката“ целева Ñтраница, към коÑто първото пренаÑочване би Ñ‚Ñ€Ñбвало да Ñочи.
@@ -2169,10 +2204,9 @@ $1',
'unwatchthispage' => 'Спиране на наблюдение',
'notanarticle' => 'Ðе е Ñтраница',
'notvisiblerev' => 'ВерÑиÑта беше изтрита',
-'watchnochange' => 'ÐÐ¸ÐºÐ¾Ñ Ð¾Ñ‚ наблюдаваните Ñтраници не е била редактирана в показаното време.',
'watchlist-details' => '{{PLURAL:$1|Една наблюдавана Ñтраница|$1 наблюдавани Ñтраници}} от ÑпиÑъка ви за наблюдение (без беÑеди).',
-'wlheader-enotif' => '* ИзвеÑÑ‚Ñването по електронна поща е включено.',
-'wlheader-showupdated' => "* Страниците, които Ñа били променени Ñлед поÑÐ»ÐµÐ´Ð½Ð¸Ñ Ð¿ÑŠÑ‚, когато Ñте ги поÑетили, Ñа показани Ñ '''получер''' шрифт.",
+'wlheader-enotif' => 'ИзвеÑÑ‚Ñването по е-поща е включено.',
+'wlheader-showupdated' => "Страниците, които Ñа били променени Ñлед поÑÐ»ÐµÐ´Ð½Ð¸Ñ Ð¿ÑŠÑ‚, когато Ñте ги поÑетили, Ñа показани в '''получер'''.",
'watchmethod-recent' => 'проверка на поÑледните редакции за наблюдавани Ñтраници',
'watchmethod-list' => 'проверка на наблюдаваните Ñтраници за Ñкорошни редакции',
'watchlistcontains' => 'СпиÑъкът ви за наблюдение Ñъдържа {{PLURAL:$1|една Ñтраница|$1 Ñтраници}}.',
@@ -2407,7 +2441,7 @@ $1',
'contributions' => '{{GENDER:$1|ПотребителÑки}} приноÑи',
'contributions-title' => 'ПотребителÑки приноÑи за $1',
'mycontris' => 'ПриноÑи',
-'contribsub2' => 'За $1 ($2)',
+'contribsub2' => 'За {{GENDER:$3|$1}} ($2)',
'nocontribs' => 'Ðе Ñа намерени промени, отговарÑщи на критериÑ.',
'uctop' => '(текуща)',
'month' => 'МеÑец:',
@@ -2564,11 +2598,8 @@ $1',
'ipb_blocked_as_range' => 'Грешка: IP-адреÑÑŠÑ‚ $1 не може да бъде разблокиран, тъй като е чаÑÑ‚ от Ð±Ð»Ð¾ÐºÐ¸Ñ€Ð°Ð½Ð¸Ñ Ñ€ÐµÐ³Ð¸ÑÑ‚ÑŠÑ€ $2. Можете да разблокирате адреÑа, като разблокирате Ñ†ÐµÐ»Ð¸Ñ Ñ€ÐµÐ³Ð¸ÑÑ‚ÑŠÑ€.',
'ip_range_invalid' => 'Ðевалиден интервал за IP-адреÑи.',
'ip_range_toolarge' => 'Забранено е блокиране на диапазони от IP адреÑи по-големи от /$1.',
-'blockme' => 'Самоблокиране',
'proxyblocker' => 'Блокировач на прокÑита',
-'proxyblocker-disabled' => 'Тази Ñ„ÑƒÐ½ÐºÑ†Ð¸Ñ Ðµ деактивирана.',
'proxyblockreason' => 'IP-адреÑÑŠÑ‚ ви беше блокиран, тъй като е анонимно доÑтъпен междинен Ñървър. Свържете Ñе Ñ Ð´Ð¾Ñтавчика ви на интернет и го информирайте за този Ñериозен проблем в ÑигурноÑтта.',
-'proxyblocksuccess' => 'Готово.',
'sorbsreason' => 'IP-адреÑÑŠÑ‚ ви е запиÑан като анонимно доÑтъпен междинен Ñървър в DNSBL на {{SITENAME}}.',
'sorbs_create_account_reason' => 'IP-адреÑÑŠÑ‚ ви е запиÑан като анонимно доÑтъпен междинен Ñървър в DNSBL на {{SITENAME}}. Ðе може да Ñъздадете Ñметка.',
'cant-block-while-blocked' => 'Ðе можете да блокирате други потребители, докато Ñам(а) Ñте блокиран(а).',
@@ -2938,13 +2969,8 @@ $1',
'pageinfo-category-files' => 'Брой файлове',
# Skin names
-'skinname-standard' => 'КлаÑика',
-'skinname-nostalgia' => 'ÐоÑталгиÑ',
'skinname-cologneblue' => 'КьолнÑко Ñиньо',
'skinname-monobook' => 'Монобук',
-'skinname-myskin' => 'МоÑÑ‚ облик',
-'skinname-chick' => 'Пиленце',
-'skinname-simple' => 'Семпъл',
'skinname-modern' => 'Модерен',
# Patrolling
@@ -3020,11 +3046,17 @@ $1',
'minutes' => '{{PLURAL:$1|$1 минута|$1 минути}}',
'hours' => '{{PLURAL:$1|$1 чаÑ|$1 чаÑа}}',
'days' => '{{PLURAL:$1|$1 ден|$1 дни}}',
+'weeks' => '{{PLURAL:$1|$1 Ñедмица|$1 Ñедмици}}',
'months' => '{{PLURAL:$1|един меÑец|$1 меÑеца}}',
'years' => '{{PLURAL:$1|една година|$1 години}}',
'ago' => 'преди $1',
'just-now' => 'току що',
+# Human-readable timestamps
+'hours-ago' => 'преди $1 {{PLURAL:$1|чаÑ|чаÑа}}',
+'minutes-ago' => 'преди $1 {{PLURAL:$1|минута|минути}}',
+'seconds-ago' => 'преди $1 {{PLURAL:$1|Ñекунда|Ñекунди}}',
+
# Bad image list
'bad_image_list' => 'Спазва Ñе ÑледниÑÑ‚ формат:
@@ -3050,7 +3082,7 @@ $1',
* gpslongitude
* gpsaltitude',
-# EXIF tags
+# Exif tags
'exif-imagewidth' => 'Ширина',
'exif-imagelength' => 'ВиÑочина',
'exif-bitspersample' => 'Дълбочина на цвета (битове)',
@@ -3207,7 +3239,7 @@ $1',
'exif-originalimageheight' => 'ВиÑочина на изображението преди намалÑването',
'exif-originalimagewidth' => 'Ширина на изображението преди намалÑването',
-# EXIF attributes
+# Exif attributes
'exif-compression-1' => 'ÐекомпреÑиран',
'exif-copyrighted-true' => 'С авторÑки права',
@@ -3570,7 +3602,6 @@ $5
'version-other' => 'Други',
'version-mediahandlers' => 'Обработчици на медиÑ',
'version-hooks' => 'Куки',
-'version-extension-functions' => 'Допълнителни функции',
'version-parser-extensiontags' => 'Етикети от парÑерни разширениÑ',
'version-parser-function-hooks' => 'Куки в парÑерни функции',
'version-hook-name' => 'Име на куката',
@@ -3579,6 +3610,7 @@ $5
'version-license' => 'Лиценз',
'version-poweredby-credits' => "Това уики Ñе задвиждва от '''[//www.mediawiki.org/ MediaWiki]''', copyright © 2001-$1 $2.",
'version-poweredby-others' => 'други',
+'version-poweredby-translators' => 'преводачи в translatewiki.net',
'version-credits-summary' => 'Бихме иÑкали да изкажем признателноÑÑ‚ на Ñледните хора за техните приноÑи към [[Special:Version|MediaWiki]].',
'version-license-info' => 'MediaWiki е Ñвободен Ñофтуер, можете да го разпроÑтранÑвате и/или променÑте ÑъглаÑно уÑловиÑта на GNU General Public License, както е публикуван от Free Software Foundation, верÑÐ¸Ñ 2 на лиценза или (по ваше уÑмотрение) коÑто и да е Ñледваща верÑиÑ.
@@ -3592,12 +3624,9 @@ MediaWiki Ñе разпроÑтранÑва Ñ Ð½Ð°Ð´ÐµÐ¶Ð´Ð°Ñ‚Ð°, че ще бÑ
'version-entrypoints-header-entrypoint' => 'Входна точка',
'version-entrypoints-header-url' => 'ÐдреÑ',
-# Special:FilePath
-'filepath' => 'Път към файл',
-'filepath-page' => 'Файл:',
-'filepath-submit' => 'ОтварÑне',
-'filepath-summary' => 'Тази Ñпециална Ñтраница връща Ð¿ÑŠÐ»Ð½Ð¸Ñ Ð¿ÑŠÑ‚ до даден файл.
-ИзображениÑта Ñе показват в пълната им разделителна ÑпоÑобноÑÑ‚, а други типове файлове Ñе отварÑÑ‚ направо Ñ Ð¿Ñ€Ð¸Ð»Ð¾Ð¶ÐµÐ½Ð¸Ñта, Ñ ÐºÐ¾Ð¸Ñ‚Ð¾ Ñа аÑоциирани.',
+# Special:Redirect
+'redirect-user' => 'ПотребителÑки номер',
+'redirect-file' => 'Име на файл',
# Special:FileDuplicateSearch
'fileduplicatesearch' => 'ТърÑене на повтарÑщи Ñе файлове',
@@ -3653,6 +3682,8 @@ MediaWiki Ñе разпроÑтранÑва Ñ Ð½Ð°Ð´ÐµÐ¶Ð´Ð°Ñ‚Ð°, че ще бÑ
'tags-display-header' => 'Изглед в ÑпиÑъците Ñ Ð¿Ñ€Ð¾Ð¼ÐµÐ½Ð¸',
'tags-description-header' => 'Пълно опиÑание на значението',
'tags-hitcount-header' => 'ОтбелÑзани промени',
+'tags-active-yes' => 'Да',
+'tags-active-no' => 'Ðе',
'tags-edit' => 'редактиране',
'tags-hitcount' => '$1 {{PLURAL:$1|промÑна|промени}}',
@@ -3688,6 +3719,9 @@ MediaWiki Ñе разпроÑтранÑва Ñ Ð½Ð°Ð´ÐµÐ¶Ð´Ð°Ñ‚Ð°, че ще бÑ
'htmlform-submit' => 'Изпращане',
'htmlform-reset' => 'Отказване на промените',
'htmlform-selectorother-other' => 'Друга',
+'htmlform-no' => 'Ðе',
+'htmlform-yes' => 'Да',
+'htmlform-chosen-placeholder' => 'Избиране',
# SQLite database support
'sqlite-has-fts' => '$1 Ñ Ð¿Ð¾Ð´Ð´Ñ€ÑŠÐ¶ÐºÐ° на пълнотекÑтово Ñ‚ÑŠÑ€Ñене',
@@ -3795,4 +3829,10 @@ $1 е автоматично повишен от $4 до $5',
# Image rotation
'rotate-comment' => 'Изображението е завъртÑно на $1 {{PLURAL:$1|градуÑ|градуÑа}} по чаÑовниковата Ñтрелка',
+# Limit report
+'limitreport-cputime-value' => '$1 {{PLURAL:$1|Ñекунда|Ñекунди}}',
+'limitreport-walltime-value' => '$1 {{PLURAL:$1|Ñекунда|Ñекунди}}',
+'limitreport-postexpandincludesize-value' => '$1/$2 {{PLURAL:$2|байт|байта}}',
+'limitreport-templateargumentsize-value' => '$1/$2 {{PLURAL:$2|байт|байта}}',
+
);
diff --git a/languages/messages/MessagesBho.php b/languages/messages/MessagesBho.php
index 598824f8..3cc32d82 100644
--- a/languages/messages/MessagesBho.php
+++ b/languages/messages/MessagesBho.php
@@ -88,6 +88,8 @@ $messages = array(
'tog-diffonly' => 'अवतरणं में अनà¥à¤¤à¤° दरà¥à¤¶à¤¾à¤¤à¥‡ समय पà¥à¤°à¤¾à¤¨ अवतरण न दिखाईं',
'tog-showhiddencats' => 'छà¥à¤ªà¤² शà¥à¤°à¥‡à¤£à¥€à¤¯à¤¨ के दिखाईं',
'tog-norollbackdiff' => 'समà¥à¤ªà¤¾à¤¦à¤¨ वापस लेला के बाद अनà¥à¤¤à¤° न दिखाईं',
+'tog-useeditwarning' => 'यदि कउनो पनà¥à¤¨à¤¾ पर समà¥à¤ªà¤¾à¤¦à¤¨ करते समय परिवरà¥à¤¤à¤¨ के बिना सà¥à¤°à¤•à¥à¤·à¤¿à¤¤ कइले छोड़ दिं त हमके खबर करब।',
+'tog-prefershttps' => 'जब खाता में पà¥à¤°à¤µà¥‡à¤¶ करीं त हमेशा सà¥à¤°à¤•à¥à¤·à¤¿à¤¤ कनेकà¥à¤¶à¤¨ के पà¥à¤°à¤¯à¥‹à¤— करीं',
'underline-always' => 'हमेशा',
'underline-never' => 'कभी ना',
@@ -151,6 +153,18 @@ $messages = array(
'oct' => 'अकà¥à¤Ÿà¥‚',
'nov' => 'नव',
'dec' => 'दिस',
+'january-date' => 'जनवरी $1',
+'february-date' => 'फ़रवरी $1',
+'march-date' => 'मारà¥à¤š $1',
+'april-date' => 'अपà¥à¤°à¥ˆà¤² $1',
+'may-date' => 'मई $1',
+'june-date' => 'जून $1',
+'july-date' => 'जà¥à¤²à¤¾à¤ˆ $1',
+'august-date' => 'अगसà¥à¤¤ $1',
+'september-date' => 'सितमà¥à¤¬à¤° $1',
+'october-date' => 'अकà¥à¤Ÿà¥‚बर $1',
+'november-date' => 'नवमà¥à¤¬à¤° $1',
+'december-date' => 'दिसमà¥à¤¬à¤° $1',
# Categories related messages
'pagecategories' => '{{PLURAL:$1|शà¥à¤°à¥‡à¤£à¥€|शà¥à¤°à¥‡à¤£à¥€}}',
@@ -232,6 +246,7 @@ $messages = array(
'create-this-page' => 'ई पनà¥à¤¨à¤¾ के निरà¥à¤®à¤¾à¤£ करीं',
'delete' => 'मिटाईं',
'deletethispage' => 'ई पनà¥à¤¨à¤¾ के मिटाईं',
+'undeletethispage' => 'ई पनà¥à¤¨à¤¾ के फिर से सà¥à¤¥à¤¾à¤ªà¤¿à¤¤ करीं',
'undelete_short' => '{{PLURAL:$1|à¤à¤—ो हटावल गईल|$1 हटावल गईलं}} बदलाव वापस लाईं',
'viewdeleted_short' => 'देखें {{PLURAL:$1|à¤à¤—ो हटावल गईल समà¥à¤ªà¤¾à¤¦à¤¨|$1 हटावल गईल कà¥à¤² समà¥à¤ªà¤¾à¤¦à¤¨}}',
'protect' => 'संरकà¥à¤·à¤£ करीं',
@@ -275,7 +290,7 @@ $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).
+# 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).
'aboutsite' => '{{SITENAME}} के बारे में',
'aboutpage' => 'Project:बारे में',
'copyright' => 'सामगà¥à¤°à¥€ $1 के तहत उपलबà¥à¤§ बा।',
@@ -285,7 +300,6 @@ $1',
'disclaimers' => 'असà¥à¤µà¤¿à¤•à¤°à¤£',
'disclaimerpage' => 'Project:सामानà¥à¤¯ असà¥à¤µà¤¿à¤•à¤°à¤£',
'edithelp' => 'मदद समà¥à¤ªà¤¾à¤¦à¤¨',
-'edithelppage' => 'Help:समà¥à¤ªà¤¾à¤¦à¤¨',
'helppage' => 'Help:सामगà¥à¤°à¥€',
'mainpage' => 'मà¥à¤–à¥à¤¯ पनà¥à¤¨à¤¾',
'mainpage-description' => 'मà¥à¤–à¥à¤¯ पनà¥à¤¨à¤¾',
@@ -363,17 +377,6 @@ $1',
# General errors
'error' => 'तà¥à¤°à¥à¤Ÿà¥€',
'databaseerror' => 'डेटाबेस तà¥à¤°à¥à¤Ÿà¥€',
-'dberrortext' => 'डाटाबेस पà¥à¤°à¤¶à¥à¤¨ वाकà¥à¤¯à¤°à¤šà¤¨à¤¾ में तà¥à¤°à¥à¤Ÿà¤¿ मिलल बा।
-संभव बा कि इ सॉफ़à¥à¤Ÿà¤µà¥‡à¤¯à¤° में तà¥à¤°à¥à¤Ÿà¤¿ के कारण से भइल होखे।
-पिछलका डाटाबेस पà¥à¤°à¤¶à¥à¤¨ रहल:
-<blockquote><code>$1</code></blockquote>
- "<code>$2</code>" कारà¥à¤¯ समूह से।
-डाटाबेस के तà¥à¤°à¥à¤Ÿà¤¿ रहल "<samp>$3: $4</samp>"।',
-'dberrortextcl' => 'डाटाबेस पà¥à¤°à¤¶à¥à¤¨ के वाकà¥à¤¯à¤°à¤šà¤¨à¤¾ में तà¥à¤°à¥à¤Ÿà¤¿ मिलल।
-डाटाबेस में पिछलका पà¥à¤°à¤¶à¥à¤¨ रहल:
-"$1"
-कारà¥à¤¯à¤¸à¤®à¥‚ह "$2" से।
-डाटाबेस से तà¥à¤°à¥à¤Ÿà¤¿ आईल "$3: $4"',
'laggedslavemode' => "'''चेतावनी:''' इ पनà¥à¤¨à¤¾ पर हाल के बदलाव ना होखे के आशंका बा।",
'readonly' => 'डेटाबेस लॉक बा',
'enterlockreason' => 'लॉक करे के कारण दिहीं, साथे लॉक खà¥à¤²à¥‡ के समय के लगभग आकलन दिहीं।',
@@ -406,6 +409,7 @@ $1',
'cannotdelete-title' => '"$1" पनà¥à¤¨à¤¾ के हटावल नइखे जा सकत',
'delete-hook-aborted' => 'हà¥à¤• दà¥à¤µà¤¾à¤°à¤¾ हटायेके कà¥à¤°à¤¿à¤¯à¤¾ बीचे में छोड़ल गईल।
इ कउनो कारण नईखे बतवले।',
+'no-null-revision' => 'पनà¥à¤¨à¤¾ "$1" खातिर नया अशकà¥à¤¤ संशोधन ना बन सकल',
'badtitle' => 'खराब शीरà¥à¤·à¤•',
'badtitletext' => 'रउआ दà¥à¤µà¤¾à¤°à¤¾ अनà¥à¤°à¥‹à¤§à¤¿à¤¤ शीरà¥à¤·à¤• अयोगà¥à¤¯, ख़ाली या गलत जà¥à¤¡à¤¼à¤² अंतर-भाषीय या अंतर-विकि शीरà¥à¤·à¤• बा।
इ में à¤à¤• या à¤à¤• से अधिक अइसन कॅरेकà¥à¤Ÿà¤° हो सकत बा जउन शीरà¥à¤·à¤• में पà¥à¤°à¤¯à¥‹à¤— नइखे करल जा सकत।',
@@ -428,12 +432,15 @@ $1',
'editinginterface' => "'''चेतावनी:''' रउआ à¤à¤—ो अइसन पनà¥à¤¨à¤¾ के बदल रहल बानी जउन सॉफ़à¥à¤Ÿà¤µà¥‡à¤¯à¤° के इंटरफ़ेस पाठà¥à¤¯ पà¥à¤°à¤¦à¤¾à¤¨ करेला।
इ पनà¥à¤¨à¤¾ के बदलला से अनà¥à¤¯ सदसà¥à¤¯à¤¨ के पà¥à¤°à¤¦à¤°à¥à¤¶à¤¿à¤¤ इंटरफ़ेस के शकà¥à¤²-सूरत में बदलाव आइ।
सभे विकियन के खातिर अनà¥à¤µà¤¾à¤¦ बदले या जोड़े खातिर कृपया मीडियाविकि के कà¥à¤·à¥‡à¤¤à¥à¤°à¥€à¤¯à¤•à¤°à¤£ परियोजना [//translatewiki.net/wiki/Main_Page?setlang=hi translatewiki.net] के पà¥à¤°à¤¯à¥‹à¤— करीं।",
-'sqlhidden' => '(छà¥à¤ªà¤¾à¤µà¤² गइल SQL कà¥à¤µà¥‡à¤°à¥€)',
'cascadeprotected' => 'इ पनà¥à¤¨à¤¾ पर समà¥à¤ªà¤¾à¤¦à¤¨ करे के अधिकार खतà¥à¤® कर दिहल गइल बा काहे कि इ निमà¥à¤¨ में शामिल बा {{PLURAL:$1|पनà¥à¤¨à¤¾, जउन|पनà¥à¤¨à¤¾à¤‚, जउन}} "वà¥à¤¯à¤¾à¤ªà¤•" विकलà¥à¤ª के चालू कइला के साथ सà¥à¤°à¤•à¥à¤·à¤¿à¤¤ कर दिहल गइल बा:
$2',
'namespaceprotected' => "रउआ के '''$1''' नामसà¥à¤¥à¤¾à¤¨ के पनà¥à¤¨à¤‚ में समà¥à¤ªà¤¾à¤¦à¤¨ करे के अधिकार नइखे दिहल गइल।",
'customcssprotected' => 'रउआ के इ CSS पनà¥à¤¨à¤¾ के संपादित करे के अनà¥à¤®à¤¤à¤¿ नइखे, काहे कि इ में अनà¥à¤¯ सदसà¥à¤¯à¤‚ के वà¥à¤¯à¤•à¥à¤¤à¤¿à¤—त सेटिंगà¥à¤¸ समाविषà¥à¤Ÿ बा।',
'customjsprotected' => 'रउआ इ जावासà¥à¤•à¥à¤°à¤¿à¤ªà¥à¤Ÿ पनà¥à¤¨à¤¾ के संपादित करे के अनà¥à¤®à¤¤à¤¿ नइखे, काहे कि इ में अनà¥à¤¯ सदसà¥à¤¯à¤‚ के वà¥à¤¯à¤•à¥à¤¤à¤¿à¤—त सेटिंगà¥à¤¸ समाविषà¥à¤Ÿ बा।',
+'mycustomcssprotected' => 'रउआ इ CSS के पनà¥à¤¨à¤¾ के समà¥à¤ªà¤¾à¤¦à¤¿à¤¤ करे के अधिकार नइखे।',
+'mycustomjsprotected' => 'रउआ इ जावासà¥à¤•à¥à¤°à¤¿à¤ªà¥à¤Ÿ पनà¥à¤¨à¤¾ के समà¥à¤ªà¤¾à¤¦à¤¿à¤¤ करे के अधिकार नइखे।',
+'myprivateinfoprotected' => 'रउआ लगे आपन वà¥à¤¯à¤•à¥à¤¤à¤¿à¤—त जानकारी बदले के अनà¥à¤®à¤¤à¤¿ नइखे।',
+'mypreferencesprotected' => 'रउआ लगे आपन वरियतां â€â€â€â€(पसंद) बदले के अधिकार नइखे।',
'ns-specialprotected' => 'विशेष पनà¥à¤¨à¤¾ के समà¥à¤ªà¤¾à¤¦à¤¨ समà¥à¤­à¤µ नइखे',
'titleprotected' => 'सदसà¥à¤¯ [[User:$1|$1]] दà¥à¤µà¤¾à¤°à¤¾ इ शीरà¥à¤·à¤• के पनà¥à¤¨à¤¾ बनावे से बचाव खातिर इ के सà¥à¤°à¤•à¥à¤·à¤¿à¤¤ कर दिहल गइल बा।
इ खातिर निमà¥à¤¨ कारण दिहल गइल बा: "\'\'$2\'\'"',
@@ -458,9 +465,19 @@ $2',
'welcomecreation-msg' => 'राउर खाता बना दिहल गईल बा।
आपन [[Special:Preferences|{{SITENAME}} वरीयतां]] के बदले के ना भूलब।',
'yourname' => 'सदसà¥à¤¯à¤¨à¤¾à¤®:',
+'userlogin-yourname' => 'सदसà¥à¤¯à¤¨à¤¾à¤®',
+'userlogin-yourname-ph' => 'आपन सदसà¥à¤¯à¤¨à¤¾à¤® लिखीं',
+'createacct-another-username-ph' => 'सदसà¥à¤¯à¤¨à¤¾à¤® लिखीं',
'yourpassword' => 'गà¥à¤ªà¥à¤¤ शबà¥à¤¦',
+'userlogin-yourpassword' => 'गà¥à¤ªà¥à¤¤à¤¶à¤¬à¥à¤¦ (पासवरà¥à¤¡)',
+'userlogin-yourpassword-ph' => 'आपन गà¥à¤ªà¥à¤¤à¤¶à¤¬à¥à¤¦ लिखीं',
+'createacct-yourpassword-ph' => 'à¤à¤—ो गà¥à¤ªà¥à¤¤à¤¶à¤¬à¥à¤¦ पà¥à¤°à¤µà¥‡à¤¶ करीं',
'yourpasswordagain' => 'गà¥à¤ªà¥à¤¤-शबà¥à¤¦ पà¥à¤¨:डालीं:',
+'createacct-yourpasswordagain' => 'गà¥à¤ªà¥à¤¤à¤¶à¤¬à¥à¤¦ के पà¥à¤·à¥à¤Ÿà¤¿ करीं',
+'createacct-yourpasswordagain-ph' => 'गà¥à¤ªà¥à¤¤à¤¶à¤¬à¥à¤¦ फेर से पà¥à¤°à¤µà¥‡à¤¶ करीं',
'remembermypassword' => 'इ बà¥à¤°à¤¾à¤‰à¤œà¤° पर हमार पà¥à¤°à¤µà¥‡à¤¶ याद रखीं (अधिकतम $1 {{PLURAL:$1|दिन|दिनं}} तक)',
+'userlogin-remembermypassword' => 'हमके पà¥à¤°à¤µà¥‡à¤¶à¤¿à¤¤ रहे दिं',
+'userlogin-signwithsecure' => 'सà¥à¤°à¤•à¥à¤·à¤¿à¤¤ कनेकà¥à¤¶à¤¨ के पà¥à¤°à¤¯à¥‹à¤— करीं',
'yourdomainname' => 'राउर डोमेनः',
'password-change-forbidden' => 'रउआ इ विकी पर गà¥à¤ªà¥à¤¤à¤¶à¤¬à¥à¤¦ नइखीं बदल सकत।',
'externaldberror' => 'या त पà¥à¤°à¤®à¤¾à¤£à¤¿à¤•à¤°à¤£ डाटाबेस में भइल बा या फिर रउआ के आपन बाहà¥à¤¯ खाता अपडेट करे के अनà¥à¤®à¤¤à¤¿ नइखे।',
@@ -472,17 +489,40 @@ $2',
'logout' => 'खाता से बाहर',
'userlogout' => 'खाता से बाहर',
'notloggedin' => 'खाता में पà¥à¤°à¤µà¥‡à¤¶ नईखीं भईल',
+'userlogin-noaccount' => 'का à¤à¤—ो खाता नईखे?',
+'userlogin-joinproject' => '{{SITENAME}} से जà¥à¤¡à¤¼à¥€à¤‚',
'nologin' => 'का à¤à¤—ो खाता नईखे? $1.',
'nologinlink' => 'à¤à¤—ो खाता बनाईं',
'createaccount' => 'खाता बनाईं',
'gotaccount' => 'का पहिले से à¤à¤—ो खाता बा? $1.',
'gotaccountlink' => 'खाता में पà¥à¤°à¤µà¥‡à¤¶',
'userlogin-resetlink' => 'का रउआ आपन पà¥à¤°à¤µà¥‡à¤¶ जानकारी भूला गइल बानी?',
+'userlogin-resetpassword-link' => 'आपन गà¥à¤ªà¥à¤¤à¤¶à¤¬à¥à¤¦ के फिर से बहाल करीं',
+'helplogin-url' => 'Help:खाता पà¥à¤°à¤µà¥‡à¤¶',
+'userlogin-helplink' => '[[{{MediaWiki:helplogin-url}}|खाता पà¥à¤°à¤µà¥‡à¤¶ में सहायता]]',
+'createacct-join' => 'अपना बारे में जानकारी नीचे लिखीं',
+'createacct-another-join' => 'नयका खाता के जानकारी नीचे लिखीं',
+'createacct-emailrequired' => 'ई-मेल पता',
+'createacct-emailoptional' => 'ई-मेल पता (वैकलà¥à¤ªà¤¿à¤•)',
+'createacct-email-ph' => 'आपन ई-मेल पता लिखीं',
+'createacct-another-email-ph' => 'ई-मेल पता लिखीं',
'createaccountmail' => 'à¤à¤—ो असà¥à¤¥à¤¾à¤¯à¥€ यादृचà¥à¤›à¤¿à¤• (रैनà¥à¤¡à¤®) गà¥à¤ªà¥à¤¤à¤¶à¤¬à¥à¤¦ के पà¥à¤°à¤¯à¥‹à¤— करीं आ निरà¥à¤¦à¤¿à¤·à¥à¤Ÿ ई-मेल पता पर भेजीं',
+'createacct-realname' => 'असली नाम (वैकलà¥à¤ªà¤¿à¤•)',
'createaccountreason' => 'कारण:',
+'createacct-reason' => 'कारण',
+'createacct-reason-ph' => 'रउआ à¤à¤—ो अनà¥à¤¯ खाता काहे बना रहल बानी',
+'createacct-captcha' => 'सà¥à¤°à¤•à¥à¤·à¤¾ जाà¤à¤š',
+'createacct-imgcaptcha-ph' => 'उपर लिखल पाठà¥à¤¯ लिखीं',
+'createacct-submit' => 'आपन खाता बनाईं',
+'createacct-another-submit' => 'à¤à¤—ो दोसर खाता बनाईं',
+'createacct-benefit-heading' => '{{SITENAME}} रउआ जइसन लोगन दà¥à¤µà¤¾à¤°à¤¾ बनावल गईल बा।',
+'createacct-benefit-body1' => '{{PLURAL:$1|समà¥à¤ªà¤¾à¤¦à¤¨}}',
+'createacct-benefit-body2' => '{{PLURAL:$1|पनà¥à¤¨à¤¾}}',
+'createacct-benefit-body3' => 'हाल के {{PLURAL:$1|योगदानकरà¥à¤¤à¤¾}}',
'badretype' => 'रउआ जौन गà¥à¤ªà¥à¤¤ शबà¥à¤¦ डालत बानी उ नईखे मेल खात।',
'userexists' => 'लिखल गईल सदसà¥à¤¯ नाम पहिले से पà¥à¤°à¤¯à¥‹à¤— में बा। कृपया कौनो दोसर नाम चà¥à¤¨à¥€à¤‚।',
'loginerror' => 'खाता पà¥à¤°à¤µà¥‡à¤¶ में तà¥à¤°à¥à¤Ÿà¤¿',
+'createacct-error' => 'खाता निरà¥à¤®à¤¾à¤£ तà¥à¤°à¥à¤Ÿà¤¿',
'createaccounterror' => 'ई खाता ना बन पाईल: $1',
'nocookiesnew' => 'पà¥à¤°à¤¯à¥‹à¤—करà¥à¤¤à¤¾ खाता त बन गईल, बाà¤à¤•à¥€ रउआ पà¥à¤°à¤µà¥‡à¤¶ नईखीं भईल।
{{SITENAME}} पà¥à¤°à¤¯à¥‹à¤—करà¥à¤¤à¤¾ लोग के खाता में पà¥à¤°à¤µà¥‡à¤¶ करावे खातिर कà¥à¤•à¤¿à¤œ के पà¥à¤°à¤¯à¥‹à¤— करेला।
@@ -543,9 +583,13 @@ $2',
यदि इ खाता गलती से खोलल गईल बा, त रउआ इ संदेश के अनदेखा कर सकत बानी।',
'usernamehasherror' => 'सदसà¥à¤¯à¤¨à¤¾à¤® में हैश कैरेकà¥à¤Ÿà¤° वरà¥à¤œà¤¿à¤¤ बा',
+'login-throttled' => 'रउआ हाले में कईयन बार खाता में पà¥à¤°à¤µà¥‡à¤¶ करे के कोशिश कर चà¥à¤•à¤² बानी।
+कृपया $1 पà¥à¤°à¤¤à¤¿à¤•à¥à¤·à¤¾ करला के बाद फिर से पà¥à¤°à¤¯à¤¾à¤¸ करब।',
'login-abort-generic' => 'राउर खाता में पà¥à¤°à¤µà¥‡à¤¶ असफल रहल - निषà¥à¤«à¤²à¤¿à¤¤',
'loginlanguagelabel' => 'भाषा: $1',
'suspicious-userlogout' => 'राउर खाता से बाहर जाये के अनà¥à¤°à¥‹à¤§ असà¥à¤µà¥€à¤•à¥ƒà¤¤ कर दिहल गइल बा काहे कि अइसन लग रहल बा कि इ कउनो खराब बà¥à¤°à¤¾à¤‰à¤œà¤¼à¤° या कैश करे वाली पà¥à¤°à¥‰à¤•à¥à¤¸à¥€ दà¥à¤µà¤¾à¤°à¤¾ भेजल गईल रहल।',
+'createacct-another-realname-tip' => 'असली नाम वैकलà¥à¤ªà¤¿à¤• बा।
+यदि रउआ इ के उपलबà¥à¤§ करावे के चà¥à¤¨à¤¤ बानी त, à¤à¤•à¤° पà¥à¤°à¤¯à¥‹à¤— सदसà¥à¤¯ के ओकरा काम के अधिकार देवे खातिर होखी।',
# Email sending
'php-mail-error-unknown' => 'PHP के mail() फ़ंकà¥à¤¶à¤¨ में अजà¥à¤žà¤¾à¤¤ तà¥à¤°à¥à¤Ÿà¤¿ बा।',
@@ -561,6 +605,7 @@ $2',
'newpassword' => 'नया गà¥à¤ªà¥à¤¤-शबà¥à¤¦:',
'retypenew' => 'नया गà¥à¤ªà¥à¤¤-शबà¥à¤¦ पà¥à¤¨: डालीं:',
'resetpass_submit' => 'गà¥à¤ªà¥à¤¤à¤¶à¤¬à¥à¤¦ बनाईं आ खाता में पà¥à¤°à¤µà¥‡à¤¶ करीं',
+'changepassword-success' => 'राउर गà¥à¤ªà¥à¤¤à¤¶à¤¬à¥à¤¦ सफलतापà¥à¤°à¥à¤µà¤• बदल दिहल गईल बा!',
'resetpass_forbidden' => 'गà¥à¤ªà¥à¤¤à¤¶à¤¬à¥à¤¦ बदलल नइखे जा सकत',
'resetpass-no-info' => 'इ पनà¥à¤¨à¤¾ के सिधे पà¥à¤°à¤¯à¥‹à¤— करे खातिर रउआ पहिले खाता में पà¥à¤°à¤µà¥‡à¤¶ करे के पड़ी।',
'resetpass-submit-loggedin' => 'गà¥à¤ªà¥à¤¤ शबà¥à¤¦ बदलीं',
@@ -572,8 +617,11 @@ $2',
# Special:PasswordReset
'passwordreset' => 'गà¥à¤ªà¥à¤¤à¤¶à¤¬à¥à¤¦ रिसेट करीं',
+'passwordreset-text-one' => 'आपन गà¥à¤ªà¥à¤¤à¤¶à¤¬à¥à¤¦ के पà¥à¤¨à¤°à¥à¤¸à¥à¤¥à¤¾à¤ªà¤¿à¤¤ करे खातिर इ फॉरà¥à¤® भरीं।',
+'passwordreset-text-many' => '{{PLURAL:$1|आपन गà¥à¤ªà¥à¤¤à¤¶à¤¬à¥à¤¦ पà¥à¤¨à¤°à¥à¤¸à¥à¤¥à¤¾à¤ªà¤¿à¤¤ करे खातिर निमà¥à¤¨ में से कउनो à¤à¤—ो सà¥à¤¥à¤¾à¤¨ भरीं।}}',
'passwordreset-legend' => 'गà¥à¤ªà¥à¤¤à¤¶à¤¬à¥à¤¦ रिसेट करीं',
'passwordreset-disabled' => 'इ विकी पर पासवरà¥à¤¡ पà¥à¤¨à¤°à¥à¤¸à¥à¤¥à¤¾à¤ªà¤¨ अकà¥à¤·à¤® बा।',
+'passwordreset-emaildisabled' => 'इ विकि पर ई-मेल सà¥à¤µà¤¿à¤§à¤¾ अकà¥à¤·à¤® कर दिहल गईल बा।',
'passwordreset-username' => 'पà¥à¤°à¤¯à¥‹à¤—करà¥à¤¤à¤¾ नाम',
'passwordreset-domain' => 'डोमेन:',
'passwordreset-capture' => 'परिणामसà¥à¤µà¤°à¥‚प बनल ई-मेल देखब?',
@@ -595,6 +643,8 @@ $2
असà¥à¤¥à¤¾à¤¯à¥€ गà¥à¤ªà¥à¤¤à¤¶à¤¬à¥à¤¦: $2',
'passwordreset-emailsent' => 'à¤à¤—ो गà¥à¤ªà¥à¤¤à¤¶à¤¬à¥à¤¦ रिसेट ई-मेल भेजल जा चà¥à¤•à¤² बा।',
'passwordreset-emailsent-capture' => 'नीचे दिखावल गईल गà¥à¤ªà¥à¤¤à¤¶à¤¬à¥à¤¦ पà¥à¤¨à¤°à¥à¤¸à¥à¤¥à¤¾à¤ªà¤¨à¤¾ ई-मेल भेज दिहल गईल बा।',
+'passwordreset-emailerror-capture' => 'नीचे दिखावल गईल गà¥à¤ªà¥à¤¤à¤¶à¤¬à¥à¤¦ पà¥à¤¨à¤°à¥à¤¸à¥à¤¥à¤¾à¤ªà¤¨à¤¾ ई-मेल उतà¥à¤ªà¤¨à¥à¤¨ करल गईल रहल, परंतॠउ के {{GENDER:$2|सदसà¥à¤¯}} के भेजे के कà¥à¤°à¤¿à¤¯à¤¾ असफल रहल।
+तà¥à¤°à¥à¤Ÿà¤¿: $1',
# Special:ChangeEmail
'changeemail' => 'ई-मेल पता बदलीं',
@@ -711,6 +761,7 @@ $2
'permissionserrors' => 'अनà¥à¤®à¤¤à¤¿ तà¥à¤°à¥à¤Ÿà¥€',
'log-fulllog' => 'पूरा लॉग देखीं',
'edit-conflict' => 'संपादन अंतरà¥à¤µà¤¿à¤°à¥‹à¤§',
+'postedit-confirmation' => 'राउर समà¥à¤ªà¤¾à¤¦à¤¨ सà¥à¤°à¤•à¥à¤·à¤¿à¤¤ कर दिहल गईल।',
'invalid-content-data' => 'अवैध डाटा सामगà¥à¤°à¥€',
# Content models
@@ -815,7 +866,6 @@ Legend: '''({{int:cur}})''' = हाल के संशोधन के साà
'searchmenu-legend' => 'खोज विकलà¥à¤ª',
'searchmenu-exists' => "'''इ विकि पर ''[[:$1]]'' नाम से à¤à¤—ो पनà¥à¤¨à¤¾ उपलबà¥à¤§ बा'''",
'searchmenu-new' => "'''इ विकि पर ''[[:$1]]'' नाम से पनà¥à¤¨à¤¾ बनाईं'''",
-'searchhelp-url' => 'Help:सामगà¥à¤°à¥€',
'searchmenu-prefix' => '[[विशेष:उपसरà¥à¤— सूची/$1|इ उपसरà¥à¤— साथे पनà¥à¤¨à¤¾ बà¥à¤°à¤¾à¤‰à¤œ करीं]]',
'searchprofile-articles' => 'सामगà¥à¤°à¥€ पनà¥à¤¨à¤¾',
'searchprofile-project' => 'मदद आ परियोजना पनà¥à¤¨à¤¾',
@@ -853,9 +903,6 @@ Legend: '''({{int:cur}})''' = हाल के संशोधन के साà
'powersearch-togglenone' => 'कउनो ना',
'search-external' => 'बाहरी खोज',
-# Quickbar
-'qbsettings-none' => 'कउनो ना',
-
# Preferences page
'preferences' => 'वरीयता',
'mypreferences' => 'राउर पसनà¥à¤¦',
@@ -882,6 +929,7 @@ Legend: '''({{int:cur}})''' = हाल के संशोधन के साà
'prefs-namespaces' => 'नामसà¥à¤¥à¤¾à¤¨',
'yourrealname' => 'असली नाम',
'yourlanguage' => 'भाषा:',
+'prefs-preview' => 'पूरà¥à¤µà¤¾à¤µà¤²à¥‹à¤•à¤¨',
# Recent changes
'recentchanges' => 'तà¥à¤°à¤‚त भईल परिवरà¥à¤¤à¤¨',
@@ -1114,7 +1162,7 @@ Legend: '''({{int:cur}})''' = हाल के संशोधन के साà
'metadata-expand' => 'विसà¥à¤¤à¥ƒà¤¤ विवरण देखाईं',
'metadata-collapse' => 'विसà¥à¤¤à¥ƒà¤¤ विवरण छà¥à¤ªà¤¾à¤à¤ˆà¤‚',
-# EXIF tags
+# Exif tags
'exif-imagewidth' => 'चौड़ाई',
'exif-imagelength' => 'ऊà¤à¤šà¤¾à¤ˆ',
'exif-bitspersample' => 'अवयव पà¥à¤°à¤¤à¤¿ बीट',
diff --git a/languages/messages/MessagesBi.php b/languages/messages/MessagesBi.php
index fcb5014a..4b28f496 100644
--- a/languages/messages/MessagesBi.php
+++ b/languages/messages/MessagesBi.php
@@ -8,7 +8,6 @@
* @file
*
* @author Iketsi
- * @author Sotiale
* @author Ushanka
*/
@@ -72,14 +71,6 @@ $messages = array(
'qbmyoptions' => 'Ol pej blong mi',
'qbspecialpages' => 'Ol spesel pej',
-# Vector skin
-'vector-action-move' => 'Muv',
-'vector-view-history' => 'Lukluk histri',
-'vector-view-view' => 'Rid',
-
-'search' => 'Faenem samting',
-'history' => 'Pej histri',
-'history_short' => 'Histri',
'edit' => 'Jenisim hem',
'newpage' => 'Mekem niu pej',
'talkpagelinktext' => 'Toktok',
@@ -89,18 +80,14 @@ $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).
'mainpage' => 'Nambawan Pej',
'mainpage-description' => 'Nambawan Pej',
-'portal' => 'Haus blong toktok‎',
-'portal-url' => 'Project:Haus blong toktok‎',
'retrievedfrom' => 'Kam long "$1"',
'editsection' => 'jenisim hem',
'editold' => 'jenisim hem',
-'red-link-title' => '$1 (pej i no stap)',
# Short words for each namespace, by default used in the namespace tab in monobook
'nstab-main' => 'Atikel',
-'nstab-special' => 'Spesel pej',
-'nstab-project' => 'Projek pej',
+'nstab-special' => 'Spesel',
# Edit pages
'minoredit' => 'Mi bin mekem wan smol jenis',
@@ -108,9 +95,6 @@ $messages = array(
# Preferences page
'servertime' => 'Taem blong server',
-# Recent changes
-'recentchanges' => 'Niu jenis',
-
# Special:ListFiles
'listfiles_name' => 'Nem',
@@ -122,7 +106,7 @@ $messages = array(
# Special:AllPages
'allarticles' => 'Olgeta atikel',
-# Email user
+# E-mail user
'emailfrom' => 'Kam long',
'emailto' => 'Go long:',
@@ -165,7 +149,4 @@ $messages = array(
# Auto-summaries
'autosumm-new' => 'Niu pej: $1',
-# Special:SpecialPages
-'specialpages' => 'Spesel pej',
-
);
diff --git a/languages/messages/MessagesBjn.php b/languages/messages/MessagesBjn.php
index a5841939..fe44b3a7 100644
--- a/languages/messages/MessagesBjn.php
+++ b/languages/messages/MessagesBjn.php
@@ -173,9 +173,6 @@ $messages = array(
'tog-shownumberswatching' => 'Tampaiakan barapa pamakai nang maitihi',
'tog-oldsig' => 'Tandateken nang sudah ada:',
'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.[//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. [//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 sabuting kasimpulan babakan puang',
'tog-watchlisthideown' => 'Sungkupakan babakan ulun di daptar itihan',
@@ -188,6 +185,7 @@ $messages = array(
'tog-diffonly' => 'Kada usah manampaiakan isi tungkaran di bawah balain',
'tog-showhiddencats' => 'Tampaiakan tutumbung tasungkup',
'tog-norollbackdiff' => 'Kada usah manampaiakan lainan imbah mambulikakan',
+'tog-useeditwarning' => 'Ingatakan ulun pabila maninggalakan tungkaran pambabakan sabalum manyimpan parubahan',
'underline-always' => 'Tarus',
'underline-never' => 'Kada suah',
@@ -375,7 +373,7 @@ $1",
'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).
+# 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).
'aboutsite' => 'Pasal {{SITENAME}}',
'aboutpage' => 'Project:Pasal',
'copyright' => 'Isi tasadia sasuai lawan $1.',
@@ -385,7 +383,6 @@ $1",
'disclaimers' => 'Panyangkalan',
'disclaimerpage' => 'Project:Panyangkalan umum',
'edithelp' => 'Patulung mambabak',
-'edithelppage' => 'Help:Pambabakan',
'helppage' => 'Help:Isi',
'mainpage' => 'Tungkaran Tatambaian',
'mainpage-description' => 'Tungkaran Tatambaian',
@@ -462,17 +459,6 @@ Daptar tungkaran istimiwa sah kawa diugai pada [[Special:SpecialPages|{{int:spec
# General errors
'error' => 'Kasalahan',
'databaseerror' => 'Kasalahan Basisdata',
-'dberrortext' => 'Ada kasalahan sintaks pada parmintaan basisdata.
-Kasalahan ngini pina manandai adanya sabuting 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 ngini tagasnya kada baisi paubahan pahanyarnya.",
'readonly' => 'Basisdata tasunduk',
'enterlockreason' => 'Buati sabuting alasan manyunduk, tamasuk jua wayah kapan handak dibuka pulang sundukannya.',
@@ -526,7 +512,6 @@ Muhun cubai pulang dalam babarapa minit.',
'editinginterface' => "'''Paringatan:''' Pian mambabak sabuting tungkaran nang dipuruk hagan manyadiakan naskah antarmuha gasan parangkat lunak.
Paubahan ka tungkaran ngini akan bapangaruh matan tampaian antarmuha gasan pamakai lain.
Gasan tarjamahan, muhun pakai [//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'''.",
'customcssprotected' => 'Pian kada baisi ijin mambabak tungkaran CSS ngini, karana ngini baisi setelan paribadi pamakai lain.',
@@ -560,7 +545,6 @@ Jangan kada ingat hagan maubah [[Special:Preferences|kakatujuan {{SITENAME}}]] P
'yourpassword' => 'Katasunduk:',
'yourpasswordagain' => 'Katik pulang katasunduk:',
'remembermypassword' => 'Ingatakan log babuat ulun dalam komputer naya (salawas $1 {{PLURAL:$1|hari|hari}})',
-'securelogin-stick-https' => 'Tatap tasambung awan HTTPS imbah babuat-log',
'yourdomainname' => 'Domain Pian:',
'password-change-forbidden' => 'Pian kada kawa ma-ubah kata sunduk pada wiki ngini.',
'externaldberror' => 'Ada kasalahan apakah kacucukan basis data atawa Pian kada bulih mamutakhirakan akun luar.',
@@ -663,7 +647,7 @@ Hagan manuntungakan babuat log, Pian musti manyetel sabuting katasunduk hanyar d
'newpassword' => 'Katasunduk hanyar:',
'retypenew' => 'Katik pulang katasunduk hanyar:',
'resetpass_submit' => 'Setel katasunduk wan babuat log',
-'resetpass_success' => 'Katasunduk Pian bahasil diubah!
+'changepassword-success' => 'Katasunduk Pian bahasil diubah!
Wayah ni Pian sudah babuat log...',
'resetpass_forbidden' => 'Katasunduk kada kawa diubah',
'resetpass-no-info' => 'Pian musti babuat log hagan babuat ka tungkaran ini langsung.',
@@ -675,10 +659,8 @@ Pian pinanya sudah barhasil maubah katasunduk Pian atawa maminta sabuting katasu
# Special:PasswordReset
'passwordreset' => 'Bulikakan setelan katasunduk',
-'passwordreset-text' => 'Tuntungakan purmulir ngini gasan manarima sabuting suril pangingat rarincian akun Pian.',
'passwordreset-legend' => 'Bulikakan setelan katasunduk',
'passwordreset-disabled' => 'Mambulikakan setelan katasunduk dipajahakan hagan wiki ngini.',
-'passwordreset-pretext' => '{{PLURAL:$1||Buati asa data di bawah ngini}}',
'passwordreset-username' => 'Ngaran pamakai:',
'passwordreset-domain' => 'Dumain:',
'passwordreset-capture' => 'Tiringikah kulihan suril?',
@@ -1149,7 +1131,6 @@ Catatan bahwasa mamuruk tautan napigasi akan mambulikakan setelan kolum ngini.',
'searchmenu-legend' => 'Papilihan manggagai',
'searchmenu-exists' => "'''Ada tungkaran bangaran \"[[:\$1]]\" dalam wiki ini.'''",
'searchmenu-new' => "'''Maulah tungkaran \"[[:\$1]]\" dalam wiki ngini!'''",
-'searchhelp-url' => 'Help:Isi',
'searchmenu-prefix' => '[[Special:PrefixIndex/$1|Janaki daptar tungkaran lawan awalan ngini]]',
'searchprofile-articles' => 'Tungkaran isi',
'searchprofile-project' => 'Tutungkaran Patulung wan Rangka gawian',
@@ -1194,15 +1175,6 @@ Tarai pamintaan Pian lawan ''all:'' gasan manggagai samunyaan isi (tamasuk tungk
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',
-'qbsettings-directionality' => 'Tatap, tagantung pada ampah skrip matan bahasa Pian',
-
# Preferences page
'preferences' => 'Kakatujuan',
'mypreferences' => 'Nang ulun katuju',
@@ -1234,7 +1206,6 @@ Catatan nang dihaharnya matan isi {{SITENAME}} kawa-ai sudah kadaluarsa.',
'resetprefs' => 'Walangakan paubahan',
'restoreprefs' => 'Bulikakan samunyaan sesetélan default',
'prefs-editing' => 'Pambabakan',
-'prefs-edit-boxsize' => 'Ukuran lalungkang babakan',
'rows' => 'Baris:',
'columns' => 'Kolom:',
'searchresultshead' => 'Gagai',
@@ -1245,8 +1216,6 @@ Catatan nang dihaharnya matan isi {{SITENAME}} kawa-ai sudah kadaluarsa.',
'recentchangesdays-max' => 'Paling lawas $1 {{PLURAL:$1|hari|hahari}}',
'recentchangescount' => 'Rikinan babakan nang ditampaiakan default:',
'prefs-help-recentchangescount' => 'Ngini tamasuk paubahan pahanyarnya, sajarah 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:',
@@ -1277,7 +1246,6 @@ Barikut ngini adalah nilai acak nang kawa Pian puruk: $1',
'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:',
@@ -1516,7 +1484,6 @@ Amun Pian mamilih manyadiakan ini, ini akan dipuruk gasan paminanduan kulihan ga
'recentchangeslinked-feed' => 'Paubahan tarait',
'recentchangeslinked-toolbox' => 'Paubahan tarait',
'recentchangeslinked-title' => 'Paubahan nang tarait lawan "$1"',
-'recentchangeslinked-noresult' => 'Kadada paubahan pada tautan tutungkaran salawas wayah ditantuakan',
'recentchangeslinked-summary' => "Ngini sabuting daptar paubahan nang diulah hahanyar ngini pada tungkaran batautan matan sabuting tungkaran tartantu (atawa ka angguta matan sabuah tumbung tartantu).
Tutungkaran dalam [[Special:Watchlist|daptar itihan Pian]] ditandai '''kandal'''.",
'recentchangeslinked-page' => 'Ngaran tungkaran:',
@@ -1739,7 +1706,6 @@ Gasan kaamanan baik, img_auth.php dipajahakan.',
'http-read-error' => 'Kasalahan baca HTTP.',
'http-timed-out' => 'Maminta HTTP habis waktunya.',
'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>
@@ -1887,12 +1853,6 @@ Pariksa 'hulu tautan lain ka citakan itu sabalum mahapusnya.",
'statistics-users-active-desc' => 'Pamuruk nang sudah malakukan suatu aksi dalam {{PLURAL:$1|sahari|$1 hari}} tauncit.',
'statistics-mostpopular' => 'Tungkaran nang paling banyak ditampaiakan',
-'disambiguations' => 'Tungkaran nang tahubung ka tungkaran disambiguasi',
-'disambiguationspage' => 'Template:Disambigu',
-'disambiguations-text' => "Tutungkaran barikut bataut ka sabuah '''tungkaran disambigu'''.
-Tutungkaran ngitu harusnya ka tupik nang sasuai.<br />
-Sabuah tungkaran dianggap sawagai tungkaran disambigu amun ngini mamuruk sabuah citakan nang tataut matan [[MediaWiki:Disambiguationspage]]",
-
'doubleredirects' => 'Paugahan ganda',
'doubleredirectstext' => 'Tungkaran ngini mandaptar tutungkaran nang maugah ka tutungkaran ugahan lain.
Tiap baris mangandung tautan ka ugahan panambaian wan kadua, sasarannya adalah ugahn kadua, nang biasanya tungkaran sasaran "sabujurnya", nang ugahan partama tuju.
@@ -2137,10 +2097,9 @@ Paubahan-paubahan salanjutnya pada tungkaran ngini dan tungkaran pamandiran tara
'unwatchthispage' => 'Mandak maitihi',
'notanarticle' => 'Lainan sabuting tungkaran isi',
'notvisiblerev' => 'Ralatan tauncit ulih saurang pamuruk babida sudah dihapus',
-'watchnochange' => 'Kadada nang Pian itihi dibabak parhatan jangka wayah ngitu.',
'watchlist-details' => '{{PLURAL:$1|$1 tungkaran|$1 tungkaran}} dalam daptar itihan Pian, kada mahitung tungkaran pamandiran.',
'wlheader-enotif' => 'Suril pamadahan dipajahi.',
-'wlheader-showupdated' => "* Tutungkaran nang ba-ubah tumatan ilangan tauncit Pian ditampaiakan dalam '''hurup kandal'''",
+'wlheader-showupdated' => "Tutungkaran nang ba-ubah tumatan ilangan tauncit Pian ditampaiakan dalam '''hurup kandal'''",
'watchmethod-recent' => 'pariksa bababakan pahanyarnya gasan tungkaran nang diitihi.',
'watchmethod-list' => 'pariksa tutungkaran nang diitihi gasan bababakan pahanyarnya',
'watchlistcontains' => 'Paitihan Pian mangandung $1 {{PLURAL:$1|tungkaran|tutungkaran}}.',
@@ -2550,12 +2509,9 @@ Janaki [[Special:BlockList|daptar diblukir]] gasan daptar uprasi dibabat wan pam
Ngini, kayapa pun, diblukir sawagai palihan wilayah $2, nang kawa-ai dilapas-blukirnya.',
'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.',
'proxyblockreason' => 'Alamat IP Pian diblukir karana ngini sabuah pruksi tabuka.
Muhun hubungi Panyadia Layan Internet Pian atawa sukungan tiknik wan padahi sidin pasal masalah ka-amanan sarius ngini.',
-'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',
@@ -3022,7 +2978,7 @@ Tautan-tautan abis tu pada baris sama dipartimbangkan sabagai pangacualian, nang
* gpslongitude
* gpsaltitude',
-# EXIF tags
+# Exif tags
'exif-imagewidth' => 'Libar',
'exif-imagelength' => 'Pancau',
'exif-bitspersample' => 'Bit par kumpunin',
@@ -3200,7 +3156,7 @@ Tautan-tautan abis tu pada baris sama dipartimbangkan sabagai pangacualian, nang
'exif-originalimageheight' => 'Pancau gambar sabalum dihandapi',
'exif-originalimagewidth' => 'Lingai gambar sabalum dihandapi',
-# EXIF attributes
+# Exif attributes
'exif-compression-1' => 'Kada dikumpris',
'exif-compression-2' => 'Galambang CCITT 3 1-Dimensional Modified Huffman manjalankan panjang encoding',
'exif-compression-3' => 'Galambang CCITT 3 paks encoding',
@@ -3596,7 +3552,6 @@ Pian kawa jua [[Special:EditWatchlist|mamuruk si pambabak standar]].',
'version-other' => 'Lain-lain',
'version-mediahandlers' => 'Pananganan madia',
'version-hooks' => 'Kait',
-'version-extension-functions' => 'Pungsi ekstensi',
'version-parser-extensiontags' => 'Tag ekstensi parser',
'version-parser-function-hooks' => 'Kait pungsi parser',
'version-hook-name' => 'Ngaran kait',
@@ -3616,13 +3571,6 @@ Pian saharusnya [{{SERVER}}{{SCRIPTPATH}}/COPYING sabuting salinan Lisansi Publi
'version-software-version' => 'Virsi',
'version-entrypoints-header-url' => 'URL',
-# Special:FilePath
-'filepath' => 'Wadah barakas',
-'filepath-page' => 'Barakas:',
-'filepath-submit' => 'Gagai',
-'filepath-summary' => 'Tungkaran istimiwa ngini mambulikakan jalur panuntungan sabuah barakas.
-Gambar ditampaiakan dalam risulusi hibak, janis barakas lain dimula lawan prugram taraitnya langsung.',
-
# Special:FileDuplicateSearch
'fileduplicatesearch' => 'Gagai gasan babarakas baganda',
'fileduplicatesearch-summary' => 'Gagai gasan babarakas baganda bapandal nilai hash.',
diff --git a/languages/messages/MessagesBn.php b/languages/messages/MessagesBn.php
index f97bb94c..e9a6f9ee 100644
--- a/languages/messages/MessagesBn.php
+++ b/languages/messages/MessagesBn.php
@@ -101,9 +101,6 @@ $messages = array(
'tog-shownumberswatching' => 'নজরদারী করছে, à¦à¦®à¦¨ বà§à¦¯à¦¬à¦¹à¦¾à¦°à¦•à¦¾à¦°à§€à¦° সংখà§à¦¯à¦¾ দেখানো হোক',
'tog-oldsig' => 'বরà§à¦¤à¦®à¦¾à¦¨ সà§à¦¬à¦¾à¦•à§à¦·à¦°:',
'tog-fancysig' => 'সà§à¦¬à¦¾à¦•à§à¦·à¦°à¦•à§‡ উইকিটেকà§à¦¸à¦Ÿ হিসেবে মনে করà§à¦¨ (কোন সয়ংকà§à¦°à¦¿à¦¯à¦¼ লিঙà§à¦• ছাড়া)',
-'tog-externaleditor' => 'শà§à¦°à§à¦¤à§‡à¦‡ বহিঃসà§à¦¥ সমà§à¦ªà¦¾à¦¦à¦• বà§à¦¯à¦¬à¦¹à¦¾à¦° করা হোক (শà§à¦§à§à¦®à¦¾à¦¤à§à¦° দকà§à¦· বà§à¦¯à¦¬à¦¹à¦¾à¦°à¦•à¦¾à¦°à§€à¦¦à§‡à¦° জনà§à¦¯, কমà§à¦ªà¦¿à¦‰à¦Ÿà¦¾à¦°à§‡ বিশেষ সেটিংস à¦à¦° পà§à¦°à¦¯à¦¼à¦œà§‹à¦¨à¥¤ [//www.mediawiki.org/wiki/Manual:External_editors বিসà§à¦¤à¦¾à¦°à¦¿à¦¤ তথà§à¦¯à¥¤])',
-'tog-externaldiff' => 'শà§à¦°à§à¦¤à§‡à¦‡ বহিঃসà§à¦¥ পারà§à¦¥à¦•à§à¦¯ বà§à¦¯à¦¬à¦¹à¦¾à¦° করা হোক (শà§à¦§à§à¦®à¦¾à¦¤à§à¦° দকà§à¦· বà§à¦¯à¦¬à¦¹à¦¾à¦°à¦•à¦¾à¦°à§€à¦¦à§‡à¦° জনà§à¦¯, কমà§à¦ªà¦¿à¦‰à¦Ÿà¦¾à¦°à§‡ বিশেষ সেটিংস à¦à¦° পà§à¦°à¦¯à¦¼à¦œà§‹à¦¨à¥¤ [//www.mediawiki.org/wiki/Manual:External_editors বিসà§à¦¤à¦¾à¦°à¦¿à¦¤ তথà§à¦¯à¥¤])',
-'tog-showjumplinks' => '"à¦à¦¾à¦à¦ª দিন" বৈশিষà§à¦Ÿà§à¦¯à§‡à¦° সংযোগ চালৠকরা হোক',
'tog-uselivepreview' => 'তাৎকà§à¦·à¦£à¦¿à¦• পà§à¦°à¦¾à¦•à¦¦à¦°à§à¦¶à¦¨à§‡à¦° কà§à¦·à¦®à¦¤à¦¾ চালৠকরা হোক (পরীকà§à¦·à¦¾à¦®à§‚লক)',
'tog-forceeditsummary' => 'খালি সমà§à¦ªà¦¾à¦¦à¦¨à¦¾ সারাংশ পà§à¦°à¦¬à§‡à¦¶ করানোর সময় আমাকে জানানো হোক',
'tog-watchlisthideown' => 'আমার সমà§à¦ªà¦¾à¦¦à¦¨à¦¾à¦—à§à¦²à¦¿ আমার নজরতালিকায় না দেখানো হোক',
@@ -116,6 +113,8 @@ $messages = array(
'tog-diffonly' => 'পারà§à¦¥à¦•à§à¦¯à§‡à¦° নিচে পাতার বিষয়বসà§à¦¤à§ না দেখানো হোক',
'tog-showhiddencats' => 'লà§à¦•à¦¾à¦¯à¦¼à¦¿à¦¤ বিষয়শà§à¦°à§‡à¦£à§€à¦¸à¦®à§‚হ দেখাও',
'tog-norollbackdiff' => 'রোলবà§à¦¯à¦¾à¦•à§‡à¦° পরে পারà§à¦¥à¦•à§à¦¯ দেখিও না',
+'tog-useeditwarning' => 'অসংরকà§à¦·à¦¿à¦¤ পরিবরà§à¦¤à¦¨à¦¸à¦¹ কোনো পাতা তà§à¦¯à¦¾à¦—ের সময় সাবধান করো',
+'tog-prefershttps' => 'যখনই পà§à¦°à¦¬à§‡à¦¶ করবেন সবসময় নিরাপদ সংযোগ বà§à¦¯à¦¬à¦¹à¦¾à¦° করà§à¦¨',
'underline-always' => 'সব সময়',
'underline-never' => 'কখনো নয়',
@@ -179,6 +178,18 @@ $messages = array(
'oct' => 'অকà§à¦Ÿà§‹',
'nov' => 'নভে',
'dec' => 'ডিসে',
+'january-date' => 'জানà§à¦¯à¦¼à¦¾à¦°à¦¿ $1',
+'february-date' => 'ফেবà§à¦°à§à¦¯à¦¼à¦¾à¦°à¦¿ $1',
+'march-date' => 'মারà§à¦š $1',
+'april-date' => 'à¦à¦ªà§à¦°à¦¿à¦² $1',
+'may-date' => 'মে $1',
+'june-date' => 'জà§à¦¨ $1',
+'july-date' => 'জà§à¦²à¦¾à¦‡ $1',
+'august-date' => 'আগসà§à¦Ÿ $1',
+'september-date' => 'সেপà§à¦Ÿà§‡à¦®à§à¦¬à¦° $1',
+'october-date' => 'অকà§à¦Ÿà§‹à¦¬à¦° $1',
+'november-date' => 'নভেমà§à¦¬à¦° $1',
+'december-date' => 'ডিসেমà§à¦¬à¦° $1',
# Categories related messages
'pagecategories' => '{{PLURAL:$1|বিষয়শà§à¦°à§‡à¦£à§€|বিষয়শà§à¦°à§‡à¦£à§€à¦¸à¦®à§‚হ}}',
@@ -260,6 +271,7 @@ $messages = array(
'create-this-page' => 'পাতাটি তৈরি করো',
'delete' => 'অপসারণ',
'deletethispage' => 'à¦à¦‡ পাতাটি মà§à¦›à§‡ ফেলà§à¦¨',
+'undeletethispage' => 'পাতাটি পà§à¦¨à¦°à§à¦¦à§à¦§à¦¾à¦° করো',
'undelete_short' => 'পà§à¦¨à¦ƒà¦¸à§à¦¥à¦¾à¦ªà¦¨ {{PLURAL:$1|১টি সমà§à¦ªà¦¾à¦¦à¦¨à¦¾|$1টি সমà§à¦ªà¦¾à¦¦à¦¨à¦¾à¦¸à¦®à§‚হ}}',
'viewdeleted_short' => '{{PLURAL:$1| টি অপসারিত সমà§à¦ªà¦¾à¦¦à¦¨à¦¾|$1 টি অপসারিত সমà§à¦ªà¦¾à¦¦à¦¨à¦¾}} দেখাও',
'protect' => 'সà§à¦°à¦•à§à¦·à¦¾',
@@ -303,7 +315,7 @@ $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).
+# 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).
'aboutsite' => '{{SITENAME}} বৃতà§à¦¤à¦¾à¦¨à§à¦¤',
'aboutpage' => 'Project:বৃতà§à¦¤à¦¾à¦¨à§à¦¤',
'copyright' => '$1 à¦à¦° আওতায় পà§à¦°à¦•à¦¾à¦¶à¦¿à¦¤ যদি অনà§à¦¯ কিছৠনিরà§à¦§à¦¾à¦°à¦¿à¦¤ না থাকে।',
@@ -313,7 +325,6 @@ $1',
'disclaimers' => 'দাবিতà§à¦¯à¦¾à¦—',
'disclaimerpage' => 'Project:সাধারণ দাবিতà§à¦¯à¦¾à¦—',
'edithelp' => 'সমà§à¦ªà¦¾à¦¦à¦¨à¦¾ সহায়িকা',
-'edithelppage' => 'Help:কিভাবে à¦à¦•à¦Ÿà¦¿ পাতা সমà§à¦ªà¦¾à¦¦à¦¨à¦¾ করবেন',
'helppage' => 'Help:সূচী',
'mainpage' => 'পà§à¦°à¦§à¦¾à¦¨ পাতা',
'mainpage-description' => 'পà§à¦°à¦§à¦¾à¦¨ পাতা',
@@ -391,17 +402,12 @@ $1',
# General errors
'error' => 'তà§à¦°à§à¦Ÿà¦¿',
'databaseerror' => 'ডাটাবেস তà§à¦°à§à¦Ÿà¦¿',
-'dberrortext' => 'ডাটাবেজ কোয়েরি সিনà§à¦Ÿà§à¦¯à¦¾à¦•à§à¦¸à§‡ তà§à¦°à§à¦Ÿà¦¿ ঘটেছে।
-সফটওয়à§à¦¯à¦¾à¦°à§‡ কোন বাগের কারণে à¦à¦®à¦¨ হতে পারে।
-সরà§à¦¬à¦¶à§‡à¦· ডাটাবেজ কোয়েরিটি ছিল à¦à¦°à¦•à¦®:
-<blockquote><tt>$1</tt></blockquote>
-"<code>$2</code>" ফাংশনের ভিতর থেকে।
-ডাটাবেজ যে তà§à¦°à§à¦Ÿà¦¿ পাঠিয়েছে: "<samp>$3: $4</samp>"।',
-'dberrortextcl' => 'ডাটাবেজ কোয়েরি সিনটà§à¦¯à¦¾à¦•à§à¦¸ তà§à¦°à§à¦Ÿà¦¿ ঘটেছে।
-সরà§à¦¬à¦¶à§‡à¦· ডাটাবেজ কোয়েরিটি ছিল:
-"$1"
-"$2" ফাংশনের ভিতর থেকে।
-ডাটাবেজ যে তà§à¦°à§à¦Ÿà¦¿ পাঠিয়েছে: "$3: $4"',
+'databaseerror-text' => 'ডাটাবেজ অনà§à¦¸à¦¨à§à¦§à¦¾à¦¨ তà§à¦°à§à¦Ÿà¦¿à¥¤
+à¦à¦Ÿà¦¿ সফটওয়à§à¦¯à¦¾à¦°à§‡à¦° à¦à¦•à¦Ÿà¦¿ তà§à¦°à§à¦Ÿà¦¿ হতে পারে।',
+'databaseerror-textcl' => 'ডাটাবেজ অনà§à¦¸à¦¨à§à¦§à¦¾à¦¨ তà§à¦°à§à¦Ÿà¦¿à¥¤',
+'databaseerror-query' => 'অনà§à¦¸à¦¨à§à¦§à¦¾à¦¨: $1',
+'databaseerror-function' => 'ফাংশন: $1',
+'databaseerror-error' => 'তà§à¦°à§à¦Ÿà¦¿: $1',
'laggedslavemode' => 'সতরà§à¦•à§€à¦•à¦°à¦£: পাতাটি সমà§à¦­à¦¬à¦¤ সমà§à¦ªà§à¦°à¦¤à¦¿ হালনাগাদকৃত নয়।',
'readonly' => 'ডেটাবেজের বà§à¦¯à¦¬à¦¹à¦¾à¦° সীমাবদà§à¦§',
'enterlockreason' => 'তালাবদà§à¦§ করার কারণ কি তা বলà§à¦¨, সাথে কখন তালা খà§à¦²à¦¬à§‡à¦¨ তার আনà§à¦®à¦¾à¦¨à¦¿à¦• সময় উলà§à¦²à¦–à§à¦¯ করà§à¦¨',
@@ -435,6 +441,7 @@ $1',
'cannotdelete-title' => '"$1" পৃষà§à¦ à¦¾ মà§à¦›à§‡ ফেলা যাচà§à¦›à§‡ না।',
'delete-hook-aborted' => 'হূক দà§à¦¬à¦¾à¦°à¦¾ সমà§à¦ªà¦¾à¦¦à¦¨à¦¾ পরিতà§à¦¯à¦•à§à¦¤ হয়েছে।
à¦à¦° কোন বà§à¦¯à¦¾à¦–à§à¦¯à¦¾ নাই।',
+'no-null-revision' => '"$1" à¦à¦° জনà§à¦¯ নাল রিভিশন তৈরী করা যায়নি',
'badtitle' => 'শিরোনামটি গà§à¦°à¦¹à¦¨à¦¯à§‹à¦—à§à¦¯ নয়।',
'badtitletext' => 'অনà§à¦°à§‹à¦§à¦•à§ƒà¦¤ পাতার শিরোনামটি অবৈধ, খালি কিংবা কোন ভà§à¦² আনà§à¦¤à¦ƒà¦­à¦¾à¦·à¦¾ বা আনà§à¦¤à¦ƒà¦‰à¦‡à¦•à¦¿ শিরোনাম সংযোগ ছিল। à¦à¦Ÿà¦¿à¦¤à§‡ সমà§à¦­à¦¬à¦¤ à¦à¦®à¦¨ à¦à¦• (à¦à¦•à¦¾à¦§à¦¿à¦•) কà§à¦¯à¦¾à¦°à§‡à¦•à§à¦Ÿà¦¾à¦° আছে, যা (যেগà§à¦²à¦¿) শিরোনামে বà§à¦¯à¦¬à¦¹à¦¾à¦°à¦¯à§‹à¦—à§à¦¯ নয়।',
'perfcached' => 'নিচের উপাতà§à¦¤à¦—à§à¦²à§‹ কà§à¦¯à¦¾à¦¶ থেকে নেয়া à¦à¦¬à¦‚ সমà§à¦ªà§‚রà§à¦£ হালনাগাদকৃত না-ও হতে পারে। সরà§à¦¬à§‹à¦šà§à¦š {{PLURAL:$1|à¦à¦•à¦Ÿà¦¿ ফলাফল|$1 টি ফলাফল}} কà§à¦¯à¦¾à¦¶à§‡ থাকতে পারে।',
@@ -455,12 +462,15 @@ $1',
'editinginterface' => "'''সতরà§à¦•à§€à¦•à¦°à¦£:''' আপনি à¦à¦®à¦¨ à¦à¦•à¦Ÿà¦¿ পাতা সমà§à¦ªà¦¾à¦¦à¦¨à¦¾ করছেন যা সফটওয়à§à¦¯à¦¾à¦°à§‡à¦° জনà§à¦¯ ইনà§à¦Ÿà¦¾à¦°à¦«à§‡à¦¸ টেকà§à¦¸à¦Ÿ পà§à¦°à¦¦à¦¾à¦¨ করে।
à¦à¦‡ পাতাতে সংঘটিত পরিবরà§à¦¤à¦¨ à¦à¦‡ উইকির বà§à¦¯à¦¬à¦¹à¦¾à¦°à¦•à¦¾à¦°à§€à¦¦à§‡à¦° ইনà§à¦Ÿà¦¾à¦°à¦«à§‡à¦¸à§‡ পà§à¦°à¦­à¦¾à¦¬ ফেলবে, যা অনà§à¦¯ বà§à¦¯à¦¬à¦¹à¦¾à¦°à¦•à¦¾à¦°à§€à¦°à¦¾ দেখতে পাবেন।
সকল উইকির অনà§à¦¬à¦¾à¦¦à§‡ কোনো ধরনের সংযোজন বা পরিবরà§à¦¤à¦¨ করতে, অনà§à¦—à§à¦°à¦¹ করে মিডিয়াউইকি সà§à¦¥à¦¾à¦¨à§€à¦¯à¦¼à¦•à¦°à¦¨ পà§à¦°à¦•à¦²à§à¦ª [//translatewiki.net/ translatewiki.net] বà§à¦¯à¦¬à¦¹à¦¾à¦° করà§à¦¨à¥¤",
-'sqlhidden' => '(à¦à¦¸ কিউ à¦à¦² কোয়েরি লà§à¦•à¦¾à¦¨à§‹ আছে)',
'cascadeprotected' => 'à¦à¦‡ পাতাটি সমà§à¦ªà¦¾à¦¦à¦¨à¦¾ থেকে সà§à¦°à¦•à§à¦·à¦¿à¦¤, কারণ পাতাটি নিচের {{PLURAL:$1|টি পাতার|টি পাতার}} অনà§à¦¤à¦°à§à¦—ত, যে পাতা(গà§à¦²à¦¿) "পà§à¦°à¦ªà¦¾à¦¤à¦¾à¦•à¦¾à¦°" (cascading) বৈশিষà§à¦Ÿà§à¦¯ সহযোগে সà§à¦°à¦•à§à¦·à¦¿à¦¤ করা হয়েছে:
$2',
'namespaceprotected' => "'''$1''' নামসà§à¦¥à¦¾à¦¨à§‡ কোন পাতা আপনার সমà§à¦ªà¦¾à¦¦à¦¨à¦¾ করার অনà§à¦®à¦¤à¦¿ নেই।",
'customcssprotected' => 'আপনার à¦à¦‡ সিà¦à¦¸à¦à¦¸ পাতাটি সমà§à¦ªà¦¾à¦¦à¦¨à¦¾ করার অনà§à¦®à¦¤à¦¿ নেই, কারণ ঠপাতায় অনà§à¦¯ বà§à¦¯à¦¬à¦¹à¦¾à¦°à¦•à¦¾à¦°à§€à¦° নিজসà§à¦¬ সেটিংস রয়েছে।',
'customjsprotected' => 'আপনার à¦à¦‡ জাভাসà§à¦•à§à¦°à¦¿à¦ªà§à¦Ÿ পাতাটি সমà§à¦ªà¦¾à¦¦à¦¨à¦¾ করার অনà§à¦®à¦¤à¦¿ নেই, কারণ ঠপাতায় অনà§à¦¯ বà§à¦¯à¦¬à¦¹à¦¾à¦°à¦•à¦¾à¦°à§€à¦° নিজসà§à¦¬ সেটিংস রয়েছে।',
+'mycustomcssprotected' => 'আপনার à¦à¦‡ সিà¦à¦¸à¦à¦¸ পাতাটি সমà§à¦ªà¦¾à¦¦à¦¨à¦¾ করার অনà§à¦®à¦¤à¦¿ নেই।',
+'mycustomjsprotected' => 'আপনার à¦à¦‡ জাভাসà§à¦•à§à¦°à¦¿à¦ªà§à¦Ÿ পাতাটি সমà§à¦ªà¦¾à¦¦à¦¨à¦¾ করার অনà§à¦®à¦¤à¦¿ নেই।',
+'myprivateinfoprotected' => 'আপনার বà§à¦¯à¦•à§à¦¤à¦¿à¦—ত তথà§à¦¯ সমà§à¦ªà¦¾à¦¦à¦¨à¦¾ করতে আপনার অনà§à¦®à¦¤à¦¿ নেই',
+'mypreferencesprotected' => 'আপনার পছনà§à¦¦à¦¸à¦®à§‚হ সমà§à¦ªà¦¾à¦¦à¦¨à¦¾ করতে আপনার অনà§à¦®à¦¤à¦¿ নেই',
'ns-specialprotected' => '{{ns:special}} নামসà§à¦¥à¦¾à¦¨à§‡ পাতাসমূহ সমà§à¦ªà¦¾à¦¦à¦¨à¦¾ করা যাবে না।',
'titleprotected' => "[[User:$1|$1]]-কে à¦à¦‡ শিরোনামের পাতা সৃষà§à¦Ÿà¦¿ করতে বাধা দেয়া হচà§à¦›à§‡à¥¤ কারণ: ''$2''।",
'filereadonlyerror' => '"$1" ফাইলটিকে পরিবরà§à¦¤à¦¨ করা সমà§à¦­à¦¬ হচà§à¦›à§‡ না কারন "$2" ফাইল রিপোসিটোরি রিড-অনলি-মোডে আছে।
@@ -484,10 +494,19 @@ $2',
'welcomecreation-msg' => 'আপনার অà§à¦¯à¦¾à¦•à¦¾à¦‰à¦¨à§à¦Ÿ তৈরী হয়েছে।
আপনার [[Special:Preferences|{{SITENAME}} পছনà§à¦¦à¦¸à¦®à§‚হ]] পরিবরà§à¦¤à¦¨ করে নিতে ভà§à¦²à¦¬à§‡à¦¨ না।',
'yourname' => 'বà§à¦¯à¦¬à¦¹à¦¾à¦°à¦•à¦¾à¦°à§€ নাম:',
+'userlogin-yourname' => 'বà§à¦¯à¦¬à¦¹à¦¾à¦°à¦•à¦¾à¦°à§€ নাম',
+'userlogin-yourname-ph' => 'আপনার বà§à¦¯à¦¬à¦¹à¦¾à¦•à¦¾à¦°à§€ নাম পà§à¦°à¦¬à§‡à¦¶ করান',
+'createacct-another-username-ph' => 'আপনার বà§à¦¯à¦¬à¦¹à¦¾à¦•à¦¾à¦°à§€ নাম পà§à¦°à¦¬à§‡à¦¶ করান',
'yourpassword' => 'শবà§à¦¦à¦šà¦¾à¦¬à¦¿:',
+'userlogin-yourpassword' => 'শবà§à¦¦à¦šà¦¾à¦¬à¦¿ (Password)',
+'userlogin-yourpassword-ph' => 'আপনার শবà§à¦¦à¦šà¦¾à¦¬à¦¿ (পাসওয়ারà§à¦¡) লিখà§à¦¨',
+'createacct-yourpassword-ph' => 'শবà§à¦¦à¦šà¦¾à¦¬à¦¿ পà§à¦°à¦¦à¦¾à¦¨ করà§à¦¨',
'yourpasswordagain' => 'শবà§à¦¦à¦šà¦¾à¦¬à¦¿à¦Ÿà¦¿ (password) আবার লিখà§à¦¨',
+'createacct-yourpasswordagain' => 'শবà§à¦¦à¦šà¦¾à¦¬à¦¿ নিশà§à¦šà¦¿à¦¤ করà§à¦¨',
+'createacct-yourpasswordagain-ph' => 'আবারও শবà§à¦¦à¦šà¦¾à¦¬à¦¿ পà§à¦°à¦¦à¦¾à¦¨ করà§à¦¨',
'remembermypassword' => 'à¦à¦•à¦¾à¦§à¦¿à¦• সেশনের জনà§à¦¯ শবà§à¦¦à¦šà¦¾à¦¬à¦¿ মনে রাখা হোক (সরà§à¦¬à§‹à¦šà§à¦š $1 {{PLURAL:$1|দিনের|দিনের}} জনà§à¦¯)',
-'securelogin-stick-https' => 'লগইনের পর à¦à¦‡à¦šà¦Ÿà¦¿à¦Ÿà¦¿à¦ªà¦¿à¦à¦¸-à¦à¦° সাথে সংযোগকৃত থাকà§à¦¨',
+'userlogin-remembermypassword' => 'আমাকে পà§à¦°à¦¬à§‡à¦¶ অবসà§à¦¥à¦¾à¦¯à¦¼ রাখো',
+'userlogin-signwithsecure' => 'নিরাপদ সংযোগ বà§à¦¯à¦¬à¦¹à¦¾à¦° করà§à¦¨',
'yourdomainname' => 'আপনার ডোমেইন',
'password-change-forbidden' => 'আপনি à¦à¦‡ উইকিতে পাসওয়ারà§à¦¡ পরিবরà§à¦¤à¦¨ করতে পারবেন না।',
'externaldberror' => 'হয় কোন বহিঃসà§à¦¥ যাচাইকরণ ডাটাবেজ তà§à¦°à§à¦Ÿà¦¿ ঘটেছে অথবা আপনার বহিঃসà§à¦¥ অà§à¦¯à¦¾à¦•à¦¾à¦‰à¦¨à§à¦Ÿ হালনাগাদ করার অনà§à¦®à¦¤à¦¿ নেই।',
@@ -499,18 +518,44 @@ $2',
'logout' => 'পà§à¦°à¦¸à§à¦¥à¦¾à¦¨ করà§à¦¨',
'userlogout' => 'পà§à¦°à¦¸à§à¦¥à¦¾à¦¨',
'notloggedin' => 'আপনি সংযà§à¦•à§à¦¤ নন',
+'userlogin-noaccount' => 'কোনও অà§à¦¯à¦¾à¦•à¦¾à¦‰à¦¨à§à¦Ÿ নেই?',
+'userlogin-joinproject' => '{{SITENAME}}-ঠযোগ দিন',
'nologin' => "আপনার কি উইকিপিডিয়াতে অà§à¦¯à¦¾à¦•à¦¾à¦‰à¦¨à§à¦Ÿ নেই? তাহলে '''$1'''।",
'nologinlink' => 'অà§à¦¯à¦¾à¦•à¦¾à¦‰à¦¨à§à¦Ÿ তৈরি করà§à¦¨',
'createaccount' => 'নতà§à¦¨ অà§à¦¯à¦¾à¦•à¦¾à¦‰à¦¨à§à¦Ÿ খà§à¦²à§à¦¨',
'gotaccount' => "আপনার কি ইতিমধà§à¦¯à§‡ à¦à¦•à¦Ÿà¦¿ অà§à¦¯à¦¾à¦•à¦¾à¦‰à¦¨à§à¦Ÿ তৈরি করা আছে? '''$1''' করà§à¦¨à¥¤",
'gotaccountlink' => 'পà§à¦°à¦¬à§‡à¦¶',
'userlogin-resetlink' => 'আপনার লগইনের বিসà§à¦¤à¦¾à¦°à¦¿à¦¤ তথà§à¦¯à¦¾à¦¦à¦¿ ভà§à¦²à§‡ গেছেন?',
+'userlogin-resetpassword-link' => 'শবà§à¦¦à¦šà¦¾à¦¬à¦¿ পà§à¦¨à¦°à¦¾à¦¯à¦¼ ধারà§à¦¯ করà§à¦¨',
+'helplogin-url' => 'Help:পà§à¦°à¦¬à§‡à¦¶',
+'userlogin-helplink' => '[[{{MediaWiki:helplogin-url}}|লগইন সংকà§à¦°à¦¾à¦¨à§à¦¤ সাহাযà§à¦¯]]',
+'userlogin-loggedin' => 'আপনি বরà§à¦¤à¦®à¦¾à¦¨à§‡ {{GENDER:$1|$1}} হিসাবে লগইন আছেন।
+অনà§à¦¯ বà§à¦¯à¦¬à¦¹à¦¾à¦°à¦•à¦¾à¦°à§€ নামে লগইন করতে চাইলে নিচের ফরà§à¦®à¦Ÿà¦¿ বà§à¦¯à¦¬à¦¹à¦¾à¦° করà§à¦¨à¥¤',
+'userlogin-createanother' => 'আরেকটি অà§à¦¯à¦¾à¦•à¦¾à¦‰à¦¨à§à¦Ÿ তৈরি করà§à¦¨',
+'createacct-join' => 'আপনার সমà§à¦ªà¦°à§à¦•à¦¿à¦¤ তথà§à¦¯ নিচে যোগ করà§à¦¨à¥¤',
+'createacct-another-join' => 'নিচে আপনার নতà§à¦¨ অà§à¦¯à¦¾à¦•à¦¾à¦‰à¦¨à§à¦Ÿà§‡à¦° তথà§à¦¯ দিন।',
+'createacct-emailrequired' => 'ইমেইল ঠিকানা',
+'createacct-emailoptional' => 'ইমেইল ঠিকানা (à¦à¦šà§à¦›à¦¿à¦•)',
+'createacct-email-ph' => 'আপনার ইমেইল ঠিকানা যোগ করà§à¦¨',
+'createacct-another-email-ph' => 'আপনার ইমেইল ঠিকানা পà§à¦°à¦¬à§‡à¦¶ করান',
'createaccountmail' => 'à¦à¦•à¦Ÿà¦¿ র‌à§à¦¯à¦¾à¦¨à§à¦¡à¦® পাসওয়ারà§à¦¡ নিরà§à¦¬à¦¾à¦šà¦¨ করà§à¦¨ à¦à¦¬à¦‚ নিরà§à¦§à¦¾à¦°à¦¿à¦¤ ইমেইল ঠিকানায় পাঠিয়ে দিন',
+'createacct-realname' => 'আসল নাম (à¦à¦šà§à¦›à¦¿à¦•)',
'createaccountreason' => 'কারণ:',
+'createacct-reason' => 'কারণ',
+'createacct-reason-ph' => 'কেন আপনি আরেকটি অà§à¦¯à¦¾à¦•à¦¾à¦‰à¦¨à§à¦Ÿ তৈরি করছেন',
+'createacct-captcha' => 'নিরাপতà§à¦¤à¦¾ পরীকà§à¦·à¦¾',
+'createacct-imgcaptcha-ph' => 'উপরে যে লেখা দেখতে পাচà§à¦›à§‡à¦¨ তা লিখà§à¦¨',
+'createacct-submit' => 'আপনার অà§à¦¯à¦¾à¦•à¦¾à¦‰à¦¨à§à¦Ÿ তৈরি করà§à¦¨',
+'createacct-another-submit' => 'আরেকটি অà§à¦¯à¦¾à¦•à¦¾à¦‰à¦¨à§à¦Ÿ তৈরি করà§à¦¨',
+'createacct-benefit-heading' => '{{SITENAME}} আপনার মত লোকেরই তৈরি।',
+'createacct-benefit-body1' => '{{PLURAL:$1|টি সমà§à¦ªà¦¾à¦¦à¦¨à¦¾}}',
+'createacct-benefit-body2' => '{{PLURAL:$1|টি পাতা}}',
+'createacct-benefit-body3' => 'জন সামà§à¦ªà§à¦°à¦¤à¦¿à¦• {{PLURAL:$1|অবদানকারী}}',
'badretype' => "আপনার পà§à¦°à¦¬à§‡à¦¶ করানো শবà§à¦¦à¦šà¦¾à¦¬à¦¿'টি মিলছেনা।",
'userexists' => 'à¦à¦‡ বà§à¦¯à¦¬à¦¹à¦¾à¦°à¦•à¦¾à¦°à§€ নামটি ইতমধà§à¦¯à§‡ বà§à¦¯à¦¬à¦¹à¦¾à¦° করা হয়েছে।
অনà§à¦—à§à¦°à¦¹ করে অনà§à¦¯ নাম বেছে নিন।',
'loginerror' => 'পà§à¦°à¦¬à§‡à¦¶ করতে সমসà§à¦¯à¦¾ হয়েছে',
+'createacct-error' => 'অà§à¦¯à¦¾à¦•à¦¾à¦‰à¦¨à§à¦Ÿ তৈরি তà§à¦°à§à¦Ÿà¦¿',
'createaccounterror' => 'অà§à¦¯à¦¾à¦•à¦¾à¦‰à¦¨à§à¦Ÿ তৈরি হয়নি: $1',
'nocookiesnew' => 'বà§à¦¯à¦¬à¦¹à¦¾à¦°à¦•à¦¾à¦°à§€à¦° অà§à¦¯à¦¾à¦•à¦¾à¦‰à¦¨à§à¦Ÿà¦Ÿà¦¿ সৃষà§à¦Ÿà¦¿ করা হয়েছে, কিনà§à¦¤à§ আপনি à¦à¦–নও অà§à¦¯à¦¾à¦•à¦¾à¦‰à¦¨à§à¦Ÿà§‡ পà§à¦°à¦¬à§‡à¦¶ করেননি। {{SITENAME}}-তে কà§à¦•à¦¿ বà§à¦¯à¦¬à¦¹à¦¾à¦° করে বà§à¦¯à¦¬à¦¹à¦¾à¦°à¦•à¦¾à¦°à§€à¦¦à§‡à¦° অà§à¦¯à¦¾à¦•à¦¾à¦‰à¦¨à§à¦Ÿà§‡ পà§à¦°à¦¬à§‡à¦¶ করানো হয়। আপনার বà§à¦°à¦¾à¦‰à¦œà¦¾à¦°à§‡ কà§à¦•à¦¿à¦—à§à¦²à¦¿ নিষà§à¦•à§à¦°à¦¿à¦¯à¦¼ করা আছে। অনà§à¦—à§à¦°à¦¹ করে কà§à¦•à¦¿à¦—à§à¦²à¦¿ সকà§à¦°à¦¿à¦¯à¦¼ করà§à¦¨ à¦à¦¬à¦‚ আপনার নতà§à¦¨ বà§à¦¯à¦¬à¦¹à¦¾à¦°à¦•à¦¾à¦°à§€ নাম ও শবà§à¦¦à¦šà¦¾à¦¬à¦¿ বà§à¦¯à¦¬à¦¹à¦¾à¦° করে অà§à¦¯à¦¾à¦•à¦¾à¦‰à¦¨à§à¦Ÿà§‡ পà§à¦°à¦¬à§‡à¦¶ করà§à¦¨à¥¤',
'nocookieslogin' => '{{SITENAME}} ঠকà§à¦•à¦¿ (cookies) à¦à¦° মাধà§à¦¯à¦®à§‡ বà§à¦¯à¦¬à¦¹à¦¾à¦°à¦•à¦¾à¦°à§€à¦¦à§‡à¦° লগ-ইন সমà§à¦ªà¦¨à§à¦¨ করা হয়। আপনার বà§à¦°à¦¾à¦Šà¦œà¦¾à¦°à§‡ কà§à¦•à¦¿ বনà§à¦§ করে দেওয়া আছে। কà§à¦•à¦¿ চালৠকরে আবার চেষà§à¦Ÿà¦¾ করà§à¦¨à¥¤',
@@ -561,11 +606,13 @@ $2',
যদি ভà§à¦² করে অà§à¦¯à¦¾à¦•à¦¾à¦‰à¦¨à§à¦Ÿà¦Ÿà¦¿ সৃষà§à¦Ÿà¦¿ হয়ে থাকে, তাহলে à¦à¦‡ বারà§à¦¤à¦¾à¦Ÿà¦¿ উপেকà§à¦·à¦¾ করà§à¦¨à¥¤',
'usernamehasherror' => 'বà§à¦¯à¦¬à¦•à¦¾à¦°à¦•à¦¾à¦°à§€ নামে হà§à¦¯à¦¾à¦¶ বরà§à¦£ থাকতে পারবে না',
-'login-throttled' => 'আপনি সামà§à¦ªà§à¦°à¦¤à¦¿à¦• পরপর বেশ কয়েকবার পà§à¦°à¦¬à§‡à¦¶à§‡à¦° চেষà§à¦Ÿà¦¾ করেছেন।
-পà§à¦¨à¦°à¦¾à¦¯à¦¼ চেষà§à¦Ÿà¦¾ করার পূরà§à¦¬à§‡ অনà§à¦—à§à¦°à¦¹ করে কিছà§à¦•à§à¦·à¦£ অপেকà§à¦·à¦¾ করà§à¦¨à¥¤',
+'login-throttled' => 'আপনি সামà§à¦ªà§à¦°à¦¤à¦¿à¦• সময়ে পরপর বেশ কয়েকবার পà§à¦°à¦¬à§‡à¦¶à§‡à¦° চেষà§à¦Ÿà¦¾ করেছেন।
+পà§à¦¨à¦°à¦¾à¦¯à¦¼ চেষà§à¦Ÿà¦¾ করার পূরà§à¦¬à§‡ অনà§à¦—à§à¦°à¦¹ করে $1 অপেকà§à¦·à¦¾ করà§à¦¨à¥¤',
'login-abort-generic' => 'আপনার লগইন সফল ছিলো না - বাতিল করা হয়েছে',
'loginlanguagelabel' => 'ভাষা: $1',
'suspicious-userlogout' => 'আপনার পà§à¦°à¦¸à§à¦¥à¦¾à¦¨à§‡à¦° অনà§à¦°à§‹à¦§ বাতিল হয়েছে কারণ অনà§à¦®à¦¿à¦¤ যে আপনার বà§à¦°à¦¾à¦‰à¦œà¦¾à¦° অসমà§à¦ªà§‚রà§à¦£ অথবা পূবরà§à¦¬à¦¤à§€ তথà§à¦¯ পà§à¦°à§‡à¦°à¦£ করেছে।',
+'createacct-another-realname-tip' => 'আসল নাম à¦à¦šà§à¦›à¦¿à¦•à¥¤
+আপনি যদি তা দিতে চান, তাহলে তা বà§à¦¯à¦¬à¦¹à¦¾à¦°à¦•à¦¾à¦°à§€à¦•à§‡ তাদের কাজের জনà§à¦¯ সà§à¦¬à§€à¦•à§ƒà¦¤à¦¿à¦¦à¦¾à¦¨à§‡ বà§à¦¯à¦¬à¦¹à¦¾à¦° করা হবে।',
# Email sending
'php-mail-error-unknown' => 'পিà¦à¦‡à¦šà¦ªà¦¿ à¦à¦° মেইল () কারà§à¦¯à§‡ অজà§à¦žà¦¾à¦¤ ভà§à¦²',
@@ -581,8 +628,7 @@ $2',
'newpassword' => 'নতà§à¦¨ শবà§à¦¦à¦šà¦¾à¦¬à¦¿:',
'retypenew' => 'নতà§à¦¨ শবà§à¦¦à¦šà¦¾à¦¬à¦¿ আবার লিখà§à¦¨:',
'resetpass_submit' => 'শবà§à¦¦à¦šà¦¾à¦¬à¦¿ দাও à¦à¦¬à¦‚ লগ-ইন করো',
-'resetpass_success' => 'আপনার পারà§à¦¸à¦“য়ারà§à¦¡ সফলভাবে পরিবরà§à¦¤à¦¨ করা হয়েছে!
-আপনি à¦à¦–ন লগইন করতে পারেন...',
+'changepassword-success' => 'আপনার শবà§à¦¦à¦šà¦¾à¦¬à¦¿ সাফলভাবে পরিবরà§à¦¤à§€à¦¤ হয়েছে।',
'resetpass_forbidden' => 'শবà§à¦¦à¦šà¦¾à¦¬à¦¿ পরিবরà§à¦¤à¦¨ করা সমà§à¦­à¦¬ নয়',
'resetpass-no-info' => 'à¦à¦‡ পাতাটিতে সরাসরি পà§à¦°à¦¬à§‡à¦¶à¦¾à¦§à¦¿à¦•à¦¾à¦° পেতে আপনাকে অবশà§à¦¯à¦‡ লগইন করতে হবে।',
'resetpass-submit-loggedin' => 'শবà§à¦¦à¦šà¦¾à¦¬à¦¿ পরিবরà§à¦¤à¦¨',
@@ -594,10 +640,11 @@ $2',
# Special:PasswordReset
'passwordreset' => 'শবà§à¦¦à¦šà¦¾à¦¬à¦¿ রিসেট',
-'passwordreset-text' => 'আপনার শবà§à¦¦à¦šà¦¾à¦¬à¦¿ বদলের জনà§à¦¯ নিচের ফরà§à¦®à¦Ÿà¦¿ পূরণ করà§à¦¨à¥¤',
+'passwordreset-text-one' => 'আপনার পাসওয়ারà§à¦¡ পà§à¦¨à¦°à¦¾à¦¯à¦¼ সেট করতে à¦à¦‡ ফরà§à¦®à¦Ÿà¦¿ পূরণ করà§à¦¨à¥¤',
+'passwordreset-text-many' => '{{PLURAL:$1|আপনার পাসওয়ারà§à¦¡ রিসেট করতে à¦à¦‡ তথà§à¦¯à¦—à§à¦²à§‹à¦° যেকোন à¦à¦•à¦Ÿà¦¾ পà§à¦°à¦¬à§‡à¦¶ করান।}}',
'passwordreset-legend' => 'শবà§à¦¦à¦šà¦¾à¦¬à¦¿ রিসেট',
'passwordreset-disabled' => 'à¦à¦‡ উইকিতে শবà§à¦¦à¦šà¦¾à¦¬à¦¿ রিসেটের সà§à¦¬à¦¿à¦§à¦¾ নিষà§à¦•à§à¦°à¦¿à¦¯à¦¼ রয়েছে।',
-'passwordreset-pretext' => '{{PLURAL:$1||নিচে উলà§à¦²à§‡à¦–িত ডেটাগà§à¦²à§‹à¦° কোনো à¦à¦•à¦Ÿà¦¿ পà§à¦°à¦¬à§‡à¦¶ করান}}',
+'passwordreset-emaildisabled' => 'à¦à¦‡ উইকিতে ইমেইল অপশনটি বনà§à¦§ করা হয়েছে।',
'passwordreset-username' => 'বà§à¦¯à¦¬à¦¹à¦¾à¦°à¦•à¦¾à¦°à§€ নাম:',
'passwordreset-domain' => 'ডোমেইন:',
'passwordreset-capture' => 'অনà§à¦¸à¦¨à§à¦§à¦¾à¦¨à§‡à¦° ফলাফলের ইমেইল দেখà§à¦¨?',
@@ -627,7 +674,7 @@ $2
অসà§à¦¥à¦¾à¦¯à¦¼à§€ শবà§à¦¦à¦šà¦¾à¦¬à¦¿: $2',
'passwordreset-emailsent' => 'শবà§à¦¦à¦šà¦¾à¦¬à¦¿ বদলের à¦à¦•à¦Ÿà¦¿ ই-মেইল পাঠানো হয়েছে।',
'passwordreset-emailsent-capture' => 'সà§à¦®à¦°à¦£ করিয়ে দেয়ার জনà§à¦¯ à¦à¦•à¦Ÿà¦¿ ইমেইল করা হয়েছে, যা নিচে দেখানো হচà§à¦›à§‡à¥¤',
-'passwordreset-emailerror-capture' => 'সà§à¦®à¦°à¦£ করিয়ে দেয়ার জনà§à¦¯ à¦à¦•à¦Ÿà¦¿ ইমেইল তৈরী করা হয়েছিল, যা নিচে দেখানো হচà§à¦›à§‡, তবে $1 বà§à¦¯à¦¬à¦¹à¦¾à¦°à¦•à¦¾à¦°à§€à¦•à§‡ à¦à¦Ÿà¦¿ পাঠানো যায়নি',
+'passwordreset-emailerror-capture' => 'সà§à¦®à¦°à¦£ করিয়ে দেয়ার জনà§à¦¯ à¦à¦•à¦Ÿà¦¿ ইমেইল তৈরী করা হয়েছিল, যা নিচে দেখানো হচà§à¦›à§‡, তবে $1 {{GENDER:$2|বà§à¦¯à¦¬à¦¹à¦¾à¦°à¦•à¦¾à¦°à§€à¦•à§‡}} à¦à¦Ÿà¦¿ পাঠানো যায়নি!',
# Special:ChangeEmail
'changeemail' => 'ই-মেইল ঠিকানা পরিবরà§à¦¤à¦¨',
@@ -641,6 +688,17 @@ $2
'changeemail-submit' => 'ই-মেইল পরিবরà§à¦¤à¦¨',
'changeemail-cancel' => 'বাতিল',
+# Special:ResetTokens
+'resettokens' => 'রিসেট টোকেন',
+'resettokens-text' => 'আপনি টোকেন রিসেট করতে পারেন, যা অà§à¦¯à¦¾à¦•à¦¾à¦‰à¦¨à§à¦Ÿà§‡à¦° সাথে সমà§à¦ªà¦°à§à¦•à¦¿à¦¤ আপনার বà§à¦¯à¦•à§à¦¤à¦¿à¦—ত তথà§à¦¯ দেখার কাজে বà§à¦¯à¦¬à¦¹à¦¾à¦° করা হয়।',
+'resettokens-no-tokens' => 'রিসেট করার মত কোনো টোকেন নেই।',
+'resettokens-legend' => 'রিসেট টোকেন',
+'resettokens-tokens' => 'টোকেন:',
+'resettokens-token-label' => '$1 (বরà§à¦¤à¦®à¦¾à¦¨: $2)',
+'resettokens-watchlist-token' => 'ওয়েব ফিড (Atom/RSS) টোকেন পরিবরà§à¦¤à¦¨à§‡à¦° জনà§à¦¯ [[Special:Watchlist|নজরতালিকায় থাকা পাতাগà§à¦²à§‹à¦¤à§‡ পরিবরà§à¦¤à¦¨ à¦à¦¸à§‡à¦›à§‡]]',
+'resettokens-done' => 'টোকেন রিসেট।',
+'resettokens-resetbutton' => 'নিরà§à¦¬à¦¾à¦šà¦¿à¦¤ টোকেন রিসেট',
+
# Edit page toolbar
'bold_sample' => 'গাঢ় লেখা',
'bold_tip' => 'গাঢ় লেখা',
@@ -831,12 +889,15 @@ $1 নিষেধাজà§à¦žà¦¾ আরোপ করেছেন। নিষà§
সমà§à¦­à¦¬à¦¤à¦ƒ পাতাটি মà§à¦›à§‡ ফেলা হয়েছে।',
'edit-conflict' => 'সমà§à¦ªà¦¾à¦¦à¦¨à¦¾ সংঘাত।',
'edit-no-change' => 'আপনার সমà§à¦ªà¦¾à¦¦à¦¨à¦¾à¦Ÿà¦¿ উপেকà§à¦·à¦¾ করা হয়েছে, কারণ লেখাতে কোনো পরিবরà§à¦¤à¦¨ করা হয়নি।',
+'postedit-confirmation' => 'আপনার সমà§à¦ªà¦¾à¦¦à¦¨à¦¾ সংরকà§à¦·à¦¿à¦¤ হয়েছে।',
'edit-already-exists' => 'নতà§à¦¨ পাতা সৃষà§à¦Ÿà¦¿ করা যায়নি।
পাতাটি ইতিমধà§à¦¯à§‡à¦‡ বিদà§à¦¯à¦®à¦¾à¦¨à¥¤',
'defaultmessagetext' => 'আদি টেকà§à¦¸à¦Ÿ',
'content-failed-to-parse' => '$1 মডেলের জনà§à¦¯ $2 কনà§à¦Ÿà§‡à¦¨à§à¦Ÿ পারà§à¦¸ করা যাচà§à¦›à§‡ না: $3',
'invalid-content-data' => 'ভà§à¦² কনà§à¦Ÿà§‡à¦¨à§à¦Ÿ ডাটা',
'content-not-allowed-here' => '"$1" কনà§à¦Ÿà§‡à¦¨à§à¦Ÿà¦Ÿà¦¿ [[$2]] পাতায় অনà§à¦®à§‹à¦¦à¦¿à¦¤ নয়',
+'editwarning-warning' => 'à¦à¦‡ পাতাটি তà§à¦¯à¦¾à¦— করলে আপনার আপনার করা পরিবরà§à¦¤à¦¨à¦—à§à¦²à§‹ হারিয়ে যেতে পারে।
+আপনি যদি লগইন করা থাকেন, আপনি à¦à¦‡ সতরà§à¦•à§€à¦•à¦°à¦£ বারà§à¦¤à¦¾à¦Ÿà¦¿ আপনার পছনà§à¦¦à§‡à¦° "সমà§à¦ªà¦¾à¦¦à¦¨à¦¾" অনà§à¦šà§à¦›à§‡à¦¦ থেকে নিসà§à¦•à§à¦°à¦¿à¦¯à¦¼ করতে পারেন।',
# Content models
'content-model-wikitext' => 'উইকিটেকà§à¦¸à¦Ÿ',
@@ -871,6 +932,7 @@ $1 নিষেধাজà§à¦žà¦¾ আরোপ করেছেন। নিষà§
'undo-failure' => 'ঠসমà§à¦ªà¦¾à¦¦à¦¨à¦¾ মধà§à¦¯à¦¬à¦°à§à¦¤à§€ সমà§à¦ªà¦¾à¦¦à¦¨à¦¾à¦¸à¦®à§‚হের কারণে পূরà§à¦¬à¦¾à¦¬à¦¸à§à¦¥à¦¾à¦¯à¦¼ ফিরিয়ে নেওয়া যাবে না।',
'undo-norev' => 'সমà§à¦ªà¦¾à¦¦à¦¨à¦¾à¦Ÿà¦¿ বাতিল করা যাচà§à¦›à§‡à¦¨à¦¾ কারণ à¦à¦Ÿà¦¿ আর নেই বা মà§à¦›à§‡ ফেলা হয়েছে।',
'undo-summary' => '[[Special:Contributions/$2|$2]] ([[User talk:$2|আলাপ]])-à¦à¦° সমà§à¦ªà¦¾à¦¦à¦¿à¦¤ $1 নমà§à¦¬à¦° সংশোধনটি বাতিল করা হয়েছে',
+'undo-summary-username-hidden' => 'à¦à¦•à¦œà¦¨ লà§à¦•à¦¾à¦¨à§‹ বà§à¦¯à¦¬à¦¹à¦¾à¦°à¦•à¦¾à¦°à§€ $1 রিভিশন পà§à¦¨à¦°à¦¾à¦¯à¦¼ ফিরিয়ে à¦à¦¨à§‡à¦›à§‡à¦¨',
# Account creation failure
'cantcreateaccounttitle' => 'অà§à¦¯à¦¾à¦•à¦¾à¦‰à¦¨à§à¦Ÿ তৈরি করা যাবে না',
@@ -1051,6 +1113,7 @@ $1",
'compareselectedversions' => 'নিরà§à¦¬à¦¾à¦šà¦¿à¦¤ সংসà§à¦•à¦°à¦£à¦—à§à¦²à§‹ তà§à¦²à¦¨à¦¾ করো',
'showhideselectedversions' => 'নিরà§à¦¬à¦¾à¦šà¦¿à¦¤ সংশোধনগà§à¦²à§‹ দেখাও/লà§à¦•à¦¾à¦“',
'editundo' => 'পূরà§à¦¬à¦¾à¦¬à¦¸à§à¦¥à¦¾à¦¯à¦¼ আনো',
+'diff-empty' => '(কোন পারà§à¦¥à¦•à§à¦¯ নেই)',
'diff-multi' => '({{PLURAL:$2|à¦à¦•à¦œà¦¨ বà§à¦¯à¦¬à¦¹à¦¾à¦°à¦•à¦¾à¦°à§€ |$2 জন বà§à¦¯à¦¬à¦¹à¦¾à¦°à¦•à¦¾à¦°à§€}} সমà§à¦ªà¦¾à¦¦à¦¿à¦¤ {{PLURAL:$1|à¦à¦•à¦Ÿà¦¿ অনà§à¦¤à¦°à§à¦¬à¦°à§à¦¤à§€à¦•à¦¾à¦²à§€à¦¨ সংশোধন|$1টি অনà§à¦¤à¦°à§à¦¬à¦°à§à¦¤à§€à¦•à¦¾à¦²à§€à¦¨ সংশোধন}} দেখানো হয়নি।)',
'diff-multi-manyusers' => '($2 জন {{PLURAL:$2|বà§à¦¯à¦¬à¦¹à¦¾à¦°à¦¾à¦•à¦¾à¦°à§€à¦°}} সমà§à¦ªà¦¾à¦¦à¦¿à¦¤ {{PLURAL:$1|à¦à¦•à¦Ÿà¦¿ সামà§à¦ªà§à¦°à¦¤à¦¿à¦• সংসà§à¦•à¦°à¦£|$1 টি সামà§à¦ªà§à¦°à¦¤à¦¿à¦• সংসà§à¦•à¦°à¦£}} পà§à¦°à¦¦à¦°à§à¦¶à¦¿à¦¤ হচà§à¦›à§‡ না)',
'difference-missing-revision' => '$1 পারà§à¦¥à¦•à§à¦¯à§‡à¦° {{PLURAL:$2|à¦à¦•à¦Ÿà¦¿ সংসà§à¦•à¦°à¦£|$2টি সংসà§à¦•à¦°à¦£à¦¸à¦®à§‚হ}} খà§à¦œà§‡ পাওয়া যাচà§à¦›à§‡ না।
@@ -1078,7 +1141,6 @@ $1",
'searchmenu-legend' => 'অনà§à¦¸à¦¨à§à¦§à¦¾à¦¨ অপশন',
'searchmenu-exists' => "'''à¦à¦‡ উইকিতে \"[[:\$1]]\" নামে à¦à¦•à¦Ÿà¦¿ পাতা রয়েছে'''",
'searchmenu-new' => "'''\"[[:\$1]]\" পাতাটি à¦à¦‡ উইকিতে তৈরি করà§à¦¨!'''",
-'searchhelp-url' => 'Help:সহায়িকা',
'searchmenu-prefix' => '[[Special:PrefixIndex/$1|à¦à¦‡ পà§à¦°à¦¿à¦«à¦¿à¦•à§à¦¸ রয়েছে à¦à¦®à¦¨ পাতা দেখà§à¦¨]]',
'searchprofile-articles' => 'বিষয়বসà§à¦¤à§à¦° পাতা',
'searchprofile-project' => 'সহায়িকা à¦à¦¬à¦‚ পà§à¦°à¦•à¦²à§à¦ª পাতা',
@@ -1120,15 +1182,7 @@ $1",
'powersearch-togglenone' => 'কিছৠনয়',
'search-external' => 'বহিঃসà§à¦¥ অনà§à¦¸à¦¨à§à¦§à¦¾à¦¨',
'searchdisabled' => '{{SITENAME}} অনà§à¦¸à¦¨à§à¦§à¦¾à¦¨ à¦à¦–ন নিষà§à¦•à§à¦°à¦¿à¦¯à¦¼ আছে। আপনি গà§à¦—লের মাধà§à¦¯à¦®à§‡ অনà§à¦¸à¦¨à§à¦§à¦¾à¦¨ চালাতে পারেন। লকà§à¦·à§à¦¯ করà§à¦¨ যে {{SITENAME}}-à¦à¦° বিষয়বসà§à¦¤à§à¦° উপর গà§à¦—লের ইনà§à¦¡à§‡à¦•à§à¦¸à¦—à§à¦²à¦¿ হালনাগাদ না-ও করা থাকতে পারে।',
-
-# Quickbar
-'qbsettings' => 'কà§à¦‡à¦•à¦¬à¦¾à¦°',
-'qbsettings-none' => 'কিছà§à¦‡ না',
-'qbsettings-fixedleft' => 'সà§à¦¥à¦¾à¦¯à¦¼à§€ বাম',
-'qbsettings-fixedright' => 'সà§à¦¥à¦¾à¦¯à¦¼à§€ ডান',
-'qbsettings-floatingleft' => 'ভাসমান বাম',
-'qbsettings-floatingright' => 'ভাসমান ডান',
-'qbsettings-directionality' => 'ফিকà§à¦¸à¦¡, আপনার ভাষার লেখা শà§à¦°à§à¦° দিকের উপর ভিতà§à¦¤à¦¿ করে',
+'search-error' => 'অনà§à¦¸à¦¨à§à¦§à¦¾à¦¨à§‡à¦° সময় à¦à¦•à¦Ÿà¦¿ তà§à¦°à§à¦Ÿà¦¿ হয়েছে: $1',
# Preferences page
'preferences' => 'আমার পছনà§à¦¦',
@@ -1162,7 +1216,6 @@ $1",
'resetprefs' => 'অসংরকà§à¦·à¦¿à¦¤ পরিবরà§à¦¤à¦¨à¦—à§à¦²à§‹ পরিসà§à¦•à¦¾à¦° করো',
'restoreprefs' => 'সকল পূরà§à¦¬à¦¨à¦¿à¦°à§à¦§à¦¾à¦°à¦¿à¦¤ সেটিং ফিরিয়ে আনো (সকল সেকশনে)',
'prefs-editing' => 'সমà§à¦ªà¦¾à¦¦à¦¨à¦¾',
-'prefs-edit-boxsize' => 'সমà§à¦ªà¦¾à¦¦à¦¨à¦¾ উইনà§à¦¡à§‹à¦° আকার।',
'rows' => 'সারি:',
'columns' => 'কলাম:',
'searchresultshead' => 'অনà§à¦¸à¦¨à§à¦§à¦¾à¦¨',
@@ -1173,7 +1226,7 @@ $1",
'recentchangesdays-max' => 'সরà§à¦¬à§‹à¦šà§à¦š $1 {{PLURAL:$1|দিন|দিন}}',
'recentchangescount' => 'সামà§à¦ªà§à¦°à¦¤à¦¿à¦• পরিবরà§à¦¤à¦¨à§‡ পà§à¦°à¦¦à¦°à§à¦¶à¦¿à¦¤ সমà§à¦ªà¦¾à¦¦à¦¨à¦¾à¦° সংখà§à¦¯à¦¾:',
'prefs-help-recentchangescount' => 'à¦à¦¤à§‡ সামà§à¦ªà§à¦°à¦¤à¦¿à¦• পরিবরà§à¦¤à¦¨à¦¸à¦®à§‚হ, পাতার ইতিহাস à¦à¦¬à¦‚ লগ অনà§à¦¤à¦°à§à¦­à§à¦•à§à¦¤à¥¤',
-'prefs-help-watchlist-token' => 'à¦à¦‡ ঘরটি à¦à¦•à¦Ÿà¦¿ গোপন শবà§à¦¦ চাবি দà§à¦¬à¦¾à¦°à¦¾ পূরণ করলে আপনার নজর তালিকার জনà§à¦¯ à¦à¦•à¦Ÿà¦¿ আরà¦à¦¸à¦à¦¸ ফিড তৈরী হবে। যারা à¦à¦‡ ঘরের চাবি জানবে তারা আপনার নজর তালিকা দেখতে পারবে, তাই à¦à¦•à¦Ÿà¦¿ গোপন মান বà§à¦¯à¦¬à¦¹à¦¾à¦° করà§à¦¨à¥¤ à¦à¦–ানে à¦à¦²à§‹à¦®à§‡à¦²à§‹à¦­à¦¾à¦¬à§‡ তৈরী à¦à¦•à¦Ÿà¦¿ মান দেখানো হয়েছে যা আপনি বà§à¦¯à¦¬à¦¹à¦¾à¦° করতে পারেন: $1',
+'prefs-help-watchlist-token2' => 'à¦à¦Ÿà¦¿ আপনার নজরতালিকার ওয়েব ফিডের গোপন চাবি। যে কেউ যিনি à¦à¦Ÿà¦¾ জানেন তিনি আপনার নজরতালিকা পড়তে সকà§à¦·à¦® হবেন, তাই à¦à¦Ÿà¦¿ পà§à¦°à¦•à¦¾à¦¶ করবেন না। [[Special:ResetTokens|আপনার à¦à¦Ÿà¦¿ পà§à¦¨à¦°à¦¾à¦¯à¦¼ সেট করার পà§à¦°à¦¯à¦¼à§‹à¦œà¦¨ হলে à¦à¦–ানে কà§à¦²à¦¿à¦• করà§à¦¨]]।',
'savedprefs' => 'আপনার পছনà§à¦¦à¦—à§à¦²à§‹ সংরকà§à¦·à¦£ করা হয়েছে।',
'timezonelegend' => 'সময়সà§à¦¥à¦¾à¦¨:',
'localtime' => 'সà§à¦¥à¦¾à¦¨à§€à¦¯à¦¼ সময়:',
@@ -1204,7 +1257,6 @@ $1",
'prefs-reset-intro' => 'আপনি à¦à¦‡ পাতা বà§à¦¯à¦¬à¦¹à¦¾à¦° করে আপনার পছনà§à¦¦à¦¸à¦®à§‚হকে সাইটের পূরà§à¦¬à¦ªà§à¦°à¦¦à¦¤à§à¦¤ সেটিংসে পরিবরà§à¦¤à¦¨ করতে পারেন।
পরিবরà§à¦¤à¦¨ করার পর à¦à¦Ÿà¦¾ আর ফিরিয়ে আনা যাবে না।',
'prefs-emailconfirm-label' => 'ই-মেইল নিশà§à¦šà¦¿à¦¤à¦•à¦°à¦£:',
-'prefs-textboxsize' => 'সমà§à¦ªà¦¾à¦¦à¦¨à¦¾ উইনà§à¦¡à§‹à¦° আকার',
'youremail' => 'ইমেইল *',
'username' => '{{GENDER:$1|বà§à¦¯à¦¬à¦¹à¦¾à¦°à¦•à¦¾à¦°à§€ নাম}}:',
'uid' => '{{GENDER:$1|বà§à¦¯à¦¬à¦¹à¦¾à¦°à¦•à¦¾à¦°à§€}} নং (ID):',
@@ -1237,6 +1289,8 @@ $1",
'prefs-dateformat' => 'তারিখ বিনà§à¦¯à¦¾à¦¸',
'prefs-timeoffset' => 'সময় অফসেট',
'prefs-advancedediting' => 'সাধারণ অপশন',
+'prefs-editor' => 'সমà§à¦ªà¦¾à¦¦à¦•',
+'prefs-preview' => 'পà§à¦°à¦¾à¦•à¦¦à¦°à§à¦¶à¦¨',
'prefs-advancedrc' => 'উচà§à¦šà¦¤à¦° অপশন',
'prefs-advancedrendering' => 'উচà§à¦šà¦¤à¦° অপশন',
'prefs-advancedsearchoptions' => 'উচà§à¦šà¦¤à¦° অপশন',
@@ -1244,7 +1298,9 @@ $1",
'prefs-displayrc' => 'পà§à¦°à¦¦à¦°à§à¦¶à¦¨à§€ অপশন',
'prefs-displaysearchoptions' => 'পà§à¦°à¦¦à¦°à§à¦¶à¦¨à§€ অপশন',
'prefs-displaywatchlist' => 'পà§à¦°à¦¦à¦°à§à¦¶à¦¨à§€ অপশন',
+'prefs-tokenwatchlist' => 'টোকেন',
'prefs-diffs' => 'পারà§à¦¥à¦•à§à¦¯',
+'prefs-help-prefershttps' => 'পরবরà§à¦¤à§€ লগইনের পর থেকে à¦à¦‡ পরিবরà§à¦¤à¦¨à¦—à§à¦²à§‹ কারà§à¦¯à¦•à¦° হবে।',
# User preference: email validation using jQuery
'email-address-validity-valid' => 'ইমেইল ঠিকানাটি সঠিক',
@@ -1271,6 +1327,8 @@ $1",
'userrights-notallowed' => 'আপনার, বà§à¦¯à¦¬à¦¹à¦¾à¦°à¦•à¦¾à¦°à§€ অধিকার যà§à¦•à§à¦¤ বা অপসারণ করার অনà§à¦®à¦¤à¦¿ নেই।',
'userrights-changeable-col' => 'দল যা আপনি পরিবরà§à¦¤à¦¨ করতে পারেন',
'userrights-unchangeable-col' => 'দল যা আপনি পরিবরà§à¦¤à¦¨ করতে পারবেন না',
+'userrights-conflict' => 'বà§à¦¯à¦¬à¦¹à¦¾à¦°à¦•à¦¾à¦°à§€ অধিকার দà§à¦¬à¦¨à§à¦¦à§à¦¬! অনà§à¦—à§à¦°à¦¹ করে নিশà§à¦šà¦¿à¦¤ হোন à¦à¦¬à¦‚ পà§à¦¨à¦°à¦¾à¦¯à¦¼ চেষà§à¦Ÿà¦¾ করà§à¦¨à¥¤',
+'userrights-removed-self' => 'আপনি সফলভাবে আপনার নিজের অধিকার পরিবরà§à¦¤à¦¨ করেছেন। à¦à¦° ফলে à¦à¦–ন থেকে আপনি আর à¦à¦‡ পাতায় পà§à¦°à¦¬à§‡à¦¶ করতে পারবেন না।',
# Groups
'group' => 'দল:',
@@ -1337,10 +1395,18 @@ $1",
'right-unblockself' => 'à¦à¦•à¦œà¦¨à¦•à§‡ আনবà§à¦²à¦• করà§à¦¨',
'right-protect' => 'পাতাটির সà§à¦°à¦•à§à¦·à¦¾ সীমা পরিবরà§à¦¤à¦¨ করà§à¦¨ à¦à¦¬à¦‚ সà§à¦°à¦•à§à¦·à¦¿à¦¤ পাতটি সমà§à¦ªà¦¾à¦¦à¦¨à¦¾ করà§à¦¨',
'right-editprotected' => 'সà§à¦°à¦•à§à¦·à¦¿à¦¤ পাতা সমà§à¦ªà¦¾à¦¦à¦¨à¦¾ (কà§à¦¯à¦¾à¦¸à¦•à¦¾à¦¡à¦¿à¦‚ সà§à¦°à¦•à§à¦·à¦¾ ছাড়া)',
+'right-editsemiprotected' => 'পাতা সমà§à¦ªà¦¾à¦¦à¦¨à¦¾ সà§à¦°à¦•à§à¦·à¦¿à¦¤ রয়েছে, "{{int:protect-level-autoconfirmed}}"',
'right-editinterface' => 'বà§à¦¯à¦¬à¦¹à¦¾à¦°à¦•à¦¾à¦°à§€ ইনà§à¦Ÿà¦¾à¦°à¦«à§‡à¦¸ সমà§à¦ªà¦¾à¦¦à¦¨à¦¾',
'right-editusercssjs' => 'অনà§à¦¯ বà§à¦¯à¦¬à¦¹à¦¾à¦°à¦•à¦¾à¦°à§€à¦—ণের CSS à¦à¦¬à¦‚ JS ফাইল সমà§à¦ªà¦¾à¦¦à¦¨à¦¾',
'right-editusercss' => 'অনà§à¦¯ বà§à¦¯à¦¬à¦¹à¦¾à¦°à¦•à¦¾à¦°à§€à¦—ণের CSS ফাইল সমà§à¦ªà¦¾à¦¦à¦¨à¦¾',
'right-edituserjs' => 'অনà§à¦¯ বà§à¦¯à¦¬à¦¹à¦¾à¦°à¦•à¦¾à¦°à§€à¦—ণের JS ফাইল সমà§à¦ªà¦¾à¦¦à¦¨à¦¾',
+'right-editmyusercss' => 'আপনার নিজসà§à¦¬ বà§à¦¯à¦¬à¦¹à¦¾à¦°à¦•à¦¾à¦°à§€ সিà¦à¦¸à¦à¦¸ ফাইল সমà§à¦ªà¦¾à¦¦à¦¨à¦¾ করà§à¦¨',
+'right-editmyuserjs' => 'আপনার নিজসà§à¦¬ বà§à¦¯à¦¬à¦¹à¦¾à¦°à¦•à¦¾à¦°à§€ জাভাসà§à¦•à§à¦°à¦¿à¦ªà§à¦Ÿ ফাইল সমà§à¦ªà¦¾à¦¦à¦¨à¦¾ করà§à¦¨',
+'right-viewmywatchlist' => 'আপনার নজরতালিকা দেখà§à¦¨',
+'right-editmywatchlist' => 'আপনার নজরতালিকা সমà§à¦ªà¦¾à¦¦à¦¨à¦¾ করà§à¦¨à¥¤ মনে রাখবেন, à¦à¦‡ পরিবরà§à¦¤à¦¨à§‡à¦° পরও বিভিনà§à¦¨ পাতা তালিকায় যà§à¦•à§à¦¤ হয়ে থেতে পারে।',
+'right-viewmyprivateinfo' => 'আপনার বà§à¦¯à¦•à§à¦¤à¦¿à¦—ত তথà§à¦¯ দেখà§à¦¨ (যেমন ইমেইল ঠিকানা, আসল নাম)',
+'right-editmyprivateinfo' => 'আপনার বà§à¦¯à¦•à§à¦¤à¦¿à¦—ত তথà§à¦¯ সমà§à¦ªà¦¾à¦¦à¦¨à¦¾ করà§à¦¨ (যেমন ইমেইল ঠিকানা, আসল নাম)',
+'right-editmyoptions' => 'আপনার পছনà§à¦¦à¦¸à¦®à§‚হ পরিবরà§à¦¤à¦¨ করà§à¦¨',
'right-rollback' => 'à¦à¦•à¦Ÿà¦¿ নিরà§à¦¦à¦¿à¦·à§à¦Ÿ পাতার সরà§à¦¬à¦¶à§‡à¦· বà§à¦¯à¦¬à¦¹à¦¾à¦°à¦•à¦¾à¦°à§€à¦° সমà§à¦ªà¦¦à¦¨à¦¾ পূরà§à¦¬à¦¾à¦¬à¦¸à§à¦¥à¦¾à¦¯à¦¼ ফিরিয়ে আনà§à¦¨',
'right-markbotedits' => 'রোলড-বà§à¦¯à¦¾à¦• সমà§à¦ªà¦¾à¦¦à¦¨à¦¾à¦¸à¦®à§‚হকে বট সমà§à¦ªà¦¾à¦¦à¦¨à¦¾ হিসেবে চিহà§à¦¨à¦¿à¦¤ করো',
'right-noratelimit' => 'রেট লিমিটের ভিতà§à¦¤à¦¿à¦¤à§‡ পরিবরà§à¦¤à¦¨ হবে না',
@@ -1402,12 +1468,19 @@ $1",
'action-userrights-interwiki' => 'অনà§à¦¯à¦¾à¦¨à§à¦¯ উইকির বà§à¦¯à¦¬à¦¹à¦¾à¦°à¦•à¦¾à¦°à§€à¦¦à§‡à¦° অধিকারসমূহ সমà§à¦ªà¦¾à¦¦à¦¨à¦¾ করà§à¦¨',
'action-siteadmin' => 'ডাটাবেজ বনà§à¦§ অথবা খà§à¦²à§à¦¨',
'action-sendemail' => 'ই-মেইল পাঠাও',
+'action-editmywatchlist' => 'আপনার নজরতালিকা পরিবরà§à¦¤à¦¨ করà§à¦¨',
+'action-viewmywatchlist' => 'আপনার নজরতালিকা দেখà§à¦¨',
+'action-viewmyprivateinfo' => 'আপনার বà§à¦¯à¦•à§à¦¤à¦¿à¦—ত তথà§à¦¯ দেখà§à¦¨',
+'action-editmyprivateinfo' => 'আপনার বà§à¦¯à¦•à§à¦¤à¦¿à¦—ত তথà§à¦¯ সমà§à¦ªà¦¾à¦¦à¦¨à¦¾ করà§à¦¨',
# Recent changes
'nchanges' => '$1 {{PLURAL:$1|পরিবরà§à¦¤à¦¨|পরিবরà§à¦¤à¦¨à¦¸à¦®à§‚হ}}',
+'enhancedrc-since-last-visit' => '$1 {{PLURAL:$1|সরà§à¦¬à¦¶à§‡à¦· পà§à¦°à¦¦à¦°à§à¦¶à¦¨à§‡à¦° পর}}',
+'enhancedrc-history' => 'ইতিহাস',
'recentchanges' => 'সামà§à¦ªà§à¦°à¦¤à¦¿à¦• পরিবরà§à¦¤à¦¨à¦¸à¦®à§‚হ',
'recentchanges-legend' => 'সামà§à¦ªà§à¦°à¦¤à¦¿à¦• পরিবরà§à¦¤à¦¨à§‡à¦° পছনà§à¦¦à¦¸à¦®à§‚হ',
'recentchanges-summary' => 'à¦à¦‡ পাতায় উইকিটির সবচেয়ে সামà§à¦ªà§à¦°à¦¤à¦¿à¦• পরিবরà§à¦¤à¦¨à¦—à§à¦²à¦¿ অনà§à¦¸à¦°à¦£ করà§à¦¨à¥¤',
+'recentchanges-noresult' => 'নিরà§à¦§à¦¾à¦°à¦¿à¦¤ সময়ের মধà§à¦¯à§‡ কোনো পরিবরà§à¦¤à¦¨ পাওয়া যায়নি।',
'recentchanges-feed-description' => 'à¦à¦‡ ফিডে উইকিটির সবচেয়ে সামà§à¦ªà§à¦°à¦¤à¦¿à¦• পরিবরà§à¦¤à¦¨à¦—à§à¦²à¦¿ অনà§à¦¸à¦°à¦£ করà§à¦¨à¥¤',
'recentchanges-label-newpage' => 'à¦à¦‡ সমà§à¦ªà¦¾à¦¦à¦¨à¦¾à¦¯à¦¼ à¦à¦•à¦Ÿà¦¿ নতà§à¦¨ পাতা তৈরি হয়েছে',
'recentchanges-label-minor' => 'à¦à¦Ÿà¦¿ à¦à¦•à¦Ÿà¦¿ অনà§à¦²à§à¦²à§‡à¦–িত সমà§à¦ªà¦¾à¦¦à¦¨à¦¾',
@@ -1446,7 +1519,6 @@ $1",
'recentchangeslinked-feed' => 'সমà§à¦ªà¦°à§à¦•à¦¿à¦¤ পরিবরà§à¦¤à¦¨',
'recentchangeslinked-toolbox' => 'সমà§à¦ªà¦°à§à¦•à¦¿à¦¤ পরিবরà§à¦¤à¦¨',
'recentchangeslinked-title' => '"$1"-à¦à¦° সাথে সমà§à¦ªà¦°à§à¦•à¦¿à¦¤ পরিবরà§à¦¤à¦¨à¦¸à¦®à§‚হ',
-'recentchangeslinked-noresult' => 'সংযোগকৃত পাতাগà§à¦²à¦¿à¦¤à§‡ পà§à¦°à¦¦à¦¤à§à¦¤ সময়সীমার জনà§à¦¯ কোন পরিবরà§à¦¤à¦¨ হয়নি।',
'recentchangeslinked-summary' => "à¦à¦•à¦Ÿà¦¿ নিরà§à¦¦à¦¿à¦·à§à¦Ÿ পাতা (অথবা নিরà§à¦¦à¦¿à¦·à§à¦Ÿ বিষয়শà§à¦°à§‡à¦£à§€à¦¤à§‡) থেকে সংযà§à¦•à§à¦¤ ঠপাতার সামà§à¦ªà§à¦°à¦¤à¦¿à¦• পরিবরà§à¦¤à¦¨à§‡à¦° তালিকা দেওয়া হয়েছে। আপনার [[Special:Watchlist|আপনার নজরতালিকায়]] রাখা পাতাগà§à¦²à¦¿ '''গাঢ়''' করে দেখানো হয়েছে।",
'recentchangeslinked-page' => 'পাতার নাম:',
'recentchangeslinked-to' => 'পà§à¦°à¦¦à¦¤à§à¦¤ পাতায় সংযà§à¦•à§à¦¤ আছে à¦à¦®à¦¨ পাতাগà§à¦²à§‹à¦° পরিবরà§à¦¤à¦¨ দেখাও',
@@ -1457,7 +1529,7 @@ $1",
'reuploaddesc' => 'আপলোড বাতিল করো à¦à¦¬à¦‚ আপলোড ফরà§à¦®à§‡ ফেরত যাও।',
'upload-tryagain' => 'পরিবরà§à¦¤à¦¿à¦¤ ফাইল বরà§à¦£à¦¨à¦¾ জমা দিন',
'uploadnologin' => 'আপনি লগ-ইন করেননি।',
-'uploadnologintext' => 'আপলোড করতে হলে আপনাকে অবশà§à¦¯à¦‡ আগে [[Special:UserLogin|লগ-ইন]] করতে হবে।',
+'uploadnologintext' => 'ফাইল আপলোড করতে হলে আপনাকে অবশà§à¦¯à¦‡ $1 করতে হবে।',
'upload_directory_missing' => 'আপলোড ডাইরেকà§à¦Ÿà¦°à¦¿ ($1) পাওয়া যাচà§à¦›à§‡ না à¦à¦¬à¦‚ ওয়েব সারà§à¦­à¦¾à¦° করà§à¦¤à§ƒà¦• তৈরি করা যাচà§à¦›à§‡ না।',
'upload_directory_read_only' => 'আপলোড ডিরেকà§à¦Ÿà¦°à¦¿à¦Ÿà¦¿ ($1) ওয়েবসারà§à¦­à¦¾à¦° করà§à¦¤à§ƒà¦• লিখনযোগà§à¦¯ নয়।',
'uploaderror' => 'আপলোড ঠসমসà§à¦¯à¦¾ হয়েছে',
@@ -1672,7 +1744,6 @@ $1',
'http-read-error' => 'HTTP পঠন তà§à¦°à§à¦Ÿà¦¿à¥¤',
'http-timed-out' => 'HTTP অনà§à¦°à§‹à¦§à§‡à¦° সময় পার হয়েছে।',
'http-curl-error' => 'ইউআরà¦à¦² নিয়ে আসার কà§à¦·à§‡à¦¤à§à¦°à§‡ তà§à¦°à§à¦Ÿà¦¿: $1',
-'http-host-unreachable' => 'URL-ঠপৌà¦à¦›à¦¾à¦¨à§‹ যায়নি',
'http-bad-status' => 'HTTP অনà§à¦°à§‹à¦§à§‡à¦° সময় কোন সমসà§à¦¯à¦¾ হয়েছে: $1 $2',
# Some likely curl errors. More could be added from <http://curl.haxx.se/libcurl/c/libcurl-errors.html>
@@ -1700,6 +1771,10 @@ $1',
'listfiles_size' => 'আকার',
'listfiles_description' => 'বিবরণ',
'listfiles_count' => 'সংসà§à¦•à¦°à¦£',
+'listfiles-show-all' => 'ছবির পà§à¦°à¦¾à¦¤à¦¨ সংসà§à¦•à¦°à¦£ সংযোজন',
+'listfiles-latestversion' => 'বরà§à¦¤à¦®à¦¾à¦¨ সংসà§à¦•à¦°à¦£',
+'listfiles-latestversion-yes' => 'হà§à¦¯à¦¾à¦',
+'listfiles-latestversion-no' => 'না',
# File description page
'file-anchor-link' => 'ফাইল',
@@ -1795,6 +1870,13 @@ Maybe you want to edit the description on its [$2 file description page] there.'
'randompage' => 'অজানা যেকোনো পাতা',
'randompage-nopages' => 'যে {{PLURAL:$2|নামসà§à¦¥à¦¾à¦¨à§‡|নামসà§à¦¥à¦¾à¦¨à¦¸à¦®à§‚হে}} কোন পাতা নেই: $1।',
+# Random page in category
+'randomincategory' => 'বিষয়শà§à¦°à§‡à¦£à§€à¦° অজানা যেকোনো পাতা',
+'randomincategory-invalidcategory' => '"$1" à¦à¦•à¦Ÿà¦¿ তà§à¦°à§à¦Ÿà¦¿à¦ªà§‚রà§à¦£ বিষয়শà§à¦°à§‡à¦£à§€à¦° নাম।',
+'randomincategory-nopages' => '[[:Category:$1]]-ঠকোন পাতা নেই।',
+'randomincategory-selectcategory' => 'à¦à¦‡ বিষয়শà§à¦°à§‡à¦£à§€à¦° à¦à¦•à¦Ÿà¦¿ অজানা যেকোনো পাতা: $1 $2।',
+'randomincategory-selectcategory-submit' => 'যাও',
+
# Random redirect
'randomredirect' => 'অনিরà§à¦§à¦¾à¦°à¦¿à¦¤ পà§à¦¨à¦°à§à¦¨à¦¿à¦°à§à¦¦à§‡à¦¶',
'randomredirect-nopages' => '"$1" à¦à¦‡ নামসà§à¦¥à¦¾à¦¨à§‡ কোন পà§à¦¨à¦°à§à¦¨à¦¿à¦°à§à¦¦à§‡à¦¶ নেই।',
@@ -1820,17 +1902,13 @@ Maybe you want to edit the description on its [$2 file description page] there.'
'statistics-users-active-desc' => 'বà§à¦¯à¦¬à¦¹à¦¾à¦°à¦•à¦¾à¦°à§€ যারা বিগত {{PLURAL:$1|দিনে|$1 দিনে}} à¦à¦•à¦Ÿà¦¿ কাজ করেছেন।',
'statistics-mostpopular' => 'সবচেয়ে বেশী বার দেখা পাতাসমূহ',
-'disambiguations' => 'দà§à¦¬à§à¦¯à¦°à§à¦¥à¦¤à¦¾-দূরীকরণ পাতাসমূহে সংযোগকৃত পাতাসমূহ',
-'disambiguationspage' => 'Template:দà§à¦¬à§à¦¯à¦°à§à¦¥à¦¤à¦¾_নিরসন',
-'disambiguations-text' => "নিচের পাতাগà§à¦²à¦¿à¦¤à§‡ অনà§à¦¤à¦¤ à¦à¦•à¦Ÿà¦¿ '''দà§à¦¬à§à¦¯à¦°à§à¦¥à¦¤à¦¾ নিরসন পাতা'''-তে সংযোগ আছে।
-à¦à¦° পরিবরà§à¦¤à§‡ à¦à¦—à§à¦²à¦¿ থেকে à¦à¦•à¦Ÿà¦¿ উপযà§à¦•à§à¦¤ বিষয়ে সংযোগ থাকা আবশà§à¦¯à¦•à¥¤<br />
-যদি কোন পাতায় à¦à¦®à¦¨ কোন টেমপà§à¦²à§‡à¦Ÿ থাকে যেটিতে [[MediaWiki:Disambiguationspage]] থেকে সংযোগ আছে, তবে সেই পাতাটিকে à¦à¦•à¦Ÿà¦¿ দà§à¦¬à§à¦¯à¦°à§à¦¥à¦¤à¦¾ নিরসন পাতা হিসেবে গণà§à¦¯ করা হয়।",
-
'pageswithprop' => 'পাতার উপাদান সমà§à¦¬à¦²à¦¿à¦¤ পৃষà§à¦ à¦¾à¦¸à¦®à§‚হ',
'pageswithprop-legend' => 'পাতার উপাদান সমà§à¦¬à¦²à¦¿à¦¤ পৃষà§à¦ à¦¾à¦¸à¦®à§‚হ',
'pageswithprop-text' => 'à¦à¦•à¦Ÿà¦¿ নিরà§à¦¦à¦¿à¦·à§à¦Ÿ পাতার বৈশিষà§à¦Ÿ রয়েছে à¦à¦®à¦¨ পাতাসমূহের তালিকা।',
'pageswithprop-prop' => 'বৈশিষà§à¦Ÿà§‡à¦° নাম:',
'pageswithprop-submit' => 'চলো',
+'pageswithprop-prophidden-long' => 'দীরà§à¦˜ পà§à¦°à§‹à¦ªà¦¾à¦°à§à¦Ÿà¦¿ টেকà§à¦¸à¦Ÿà¦—à§à¦²à§‹ লà§à¦•à¦¾à¦¨à§‹ রয়েছে ($1)',
+'pageswithprop-prophidden-binary' => 'বাইনারি পà§à¦°à§‹à¦ªà¦¾à¦°à§à¦Ÿà¦¿ টেকà§à¦¸à¦Ÿà¦—à§à¦²à§‹ লà§à¦•à¦¾à¦¨à§‹ রয়েছে ($1)',
'doubleredirects' => 'দà§à¦‡à¦¬à¦¾à¦° করা পà§à¦¨à¦°à§à¦¨à¦¿à¦°à§à¦¦à§‡à¦¶à¦¨à¦¾à¦—à§à¦²à¦¿',
'doubleredirectstext' => 'à¦à¦‡ পাতায় à¦à¦®à¦¨ পাতাগà§à¦²à§‹à¦° তালিকা আছে, যেগà§à¦²à§‹ অনà§à¦¯ কোন পà§à¦¨à¦°à§à¦¨à¦¿à¦°à§à¦¦à§‡à¦¶à¦¨à¦¾ পাতায় পà§à¦¨à¦°à§à¦¨à¦¿à¦°à§à¦¦à§‡à¦¶à¦¿à¦¤ হয়েছে। পà§à¦°à¦¤à¦¿à¦Ÿà¦¿ সারিতে পà§à¦°à¦¥à¦® ও দà§à¦¬à¦¿à¦¤à§€à¦¯à¦¼ পà§à¦¨à¦°à§à¦¨à¦¿à¦°à§à¦¦à§‡à¦¶à¦¨à¦¾à¦° জনà§à¦¯ সংযোগ আছে à¦à¦¬à¦‚ দà§à¦¬à¦¿à¦¤à§€à¦¯à¦¼ পà§à¦¨à¦°à§à¦¨à¦¿à¦°à§à¦¦à§‡à¦¶à¦¨à¦¾à¦Ÿà¦¿à¦° লকà§à¦·à§à¦¯ সংযোগটিও দেওয়া আছে। à¦à¦‡ লকà§à¦·à§à¦¯ সংযোগটিই সাধারণত "আসল" লকà§à¦·à§à¦¯ পাতা, যেটিতে পà§à¦°à¦¥à¦® পà§à¦¨à¦°à§à¦¨à¦¿à¦°à§à¦¦à§‡à¦¶à¦¨à¦¾à¦Ÿà¦¿ থেকে সংযোগ থাকা উচিত।
@@ -1888,6 +1966,7 @@ Maybe you want to edit the description on its [$2 file description page] there.'
'mostrevisions' => 'সবচেয়ে বেশী বার সমà§à¦ªà¦¾à¦¦à¦¿à¦¤ নিবনà§à¦§à¦¸à¦®à§‚হ',
'prefixindex' => 'উপসরà§à¦— সহ সমসà§à¦¤ পাতা',
'prefixindex-namespace' => 'পà§à¦°à¦¿à¦«à¦¿à¦•à§à¦¸ সমà§à¦ªà¦¬à¦²à¦¿à¦¤ সকল পাতা ($1 নামসà§à¦¥à¦¾à¦¨)',
+'prefixindex-strip' => 'তালিকা থেকে পà§à¦°à¦¿à¦«à¦¿à¦•à§à¦¸ সরাও',
'shortpages' => 'সংকà§à¦·à¦¿à¦ªà§à¦¤ পাতাসমূহ',
'longpages' => 'দীরà§à¦˜ পাতাসমূহ',
'deadendpages' => 'যেসব পাতা থেকে কোনো সংযোগ নেই',
@@ -1903,6 +1982,7 @@ Maybe you want to edit the description on its [$2 file description page] there.'
'listusers' => 'বà§à¦¯à¦¬à¦¹à¦¾à¦°à¦•à¦¾à¦°à§€à¦° তালিকা',
'listusers-editsonly' => 'শà§à¦§à§à¦®à¦¾à¦¤à§à¦° à¦à¦®à¦¨ বà§à¦¯à¦¬à¦¹à¦¾à¦°à¦•à¦¾à¦°à§€à¦¦à§‡à¦° দেখাও যাদের অবদান আছে',
'listusers-creationsort' => 'তৈরির তারিখ অনà§à¦¸à¦¾à¦°à§‡ সাজাও',
+'listusers-desc' => 'বড় থেকে ছোট কà§à¦°à¦® অনà§à¦¯à¦¾à¦¯à¦¼à§€ সাজাও',
'usereditcount' => '$1 {{PLURAL:$1|সমà§à¦ªà¦¾à¦¦à¦¨à¦¾|সমà§à¦ªà¦¾à¦¦à¦¨à¦¾}}',
'usercreated' => '{{GENDER:$3|তৈরি হয়েছে}} $1 তারিখ, সময়: $2',
'newpages' => 'নতà§à¦¨ পাতাসমূহ',
@@ -2080,10 +2160,9 @@ Maybe you want to edit the description on its [$2 file description page] there.'
'unwatchthispage' => 'নজর সরিয়ে নিন',
'notanarticle' => 'বিষয়বসà§à¦¤à§ পাতা নয়',
'notvisiblerev' => 'অপর à¦à¦•à¦œà¦¨ বà§à¦¯à¦¬à¦¹à¦¾à¦°à¦•à¦¾à¦°à§€ করà§à¦¤à§ƒà¦• পà§à¦°à¦£à§€à¦¤ সরà§à¦¬à¦¶à§‡à¦· সংসà§à¦•à¦°à¦£à¦Ÿà¦¿ অপসারিত হয়েছে',
-'watchnochange' => 'পà§à¦°à¦¦à¦°à§à¦¶à¦¿à¦¤ সময়সীমার মধà§à¦¯à§‡ আপনার নজরতালিকায় রাখা কোন পাতায় কোন রকম সমà§à¦ªà¦¾à¦¦à¦¨à¦¾ ঘটেনি।',
'watchlist-details' => 'নজরতালিকাতে {{PLURAL:$1|$1টি পাতা|$1টি পাতা}} আছে (আলাপ পাতাগà§à¦²à¦¿ গণনায় না ধরে)।',
-'wlheader-enotif' => '* ই-মেইল à¦à¦° মাধমে নিরà§à¦¦à§‡à¦¶à¦¨à¦¾à¦° বà§à¦¯à¦¬à¦¸à§à¦¥à¦¾ চালৠকরা আছে।',
-'wlheader-showupdated' => "* আপনার শেষ আগমনের পর থেকে যেসব পাতায় পরিবরà§à¦¤à¦¨ হয়েছে সেগà§à¦²à¦¿ '''গাঢ়''' করে দেখানো হয়েছে",
+'wlheader-enotif' => 'ইমেল বিজà§à¦žà¦ªà§à¦¤à¦¿ সকà§à¦°à¦¿à¦¯à¦¼ করা আছে।',
+'wlheader-showupdated' => "আপনার শেষ আগমনের পর থেকে যেসব পাতায় পরিবরà§à¦¤à¦¨ হয়েছে সেগà§à¦²à¦¿ '''গাঢ়''' করে দেখানো হয়েছে।",
'watchmethod-recent' => 'নজরে রাখা পাতাগà§à¦²à¦¿à¦¤à§‡ সামà§à¦ªà§à¦°à¦¤à¦¿à¦• পরিবরà§à¦¤à¦¨ পরীকà§à¦·à¦¾ করা হচà§à¦›à§‡',
'watchmethod-list' => 'নজরে রাখা পাতাগà§à¦²à¦¿à¦¤à§‡ সামà§à¦ªà§à¦°à¦¤à¦¿à¦• পরিবরà§à¦¤à¦¨ পরীকà§à¦·à¦¾ করা হচà§à¦›à§‡',
'watchlistcontains' => 'আপনার নজরতালিকায় $1 টি {{PLURAL:$1|পাতা|পাতা}} রয়েছে।',
@@ -2329,7 +2408,7 @@ $1',
'contributions' => '{{GENDER:$1|বà§à¦¯à¦¬à¦¹à¦¾à¦°à¦•à¦¾à¦°à§€à¦°}} অবদান',
'contributions-title' => '$1 বà§à¦¯à¦¬à¦¹à¦¾à¦°à¦•à¦¾à¦°à§€à¦° অবদানসমূহ',
'mycontris' => 'অবদান',
-'contribsub2' => '$1 ($2)-à¦à¦° জনà§à¦¯',
+'contribsub2' => '{{GENDER:$3|$1}} ($2)-à¦à¦° জনà§à¦¯',
'nocontribs' => 'à¦à¦‡ শরà§à¦¤à¦—à§à¦²à¦¿à¦° সাথে মিলে যায়, à¦à¦®à¦¨ কোন পরিবরà§à¦¤à¦¨ খà§à¦à¦œà§‡ পাওয়া যায়নি।',
'uctop' => '(বরà§à¦¤à¦®à¦¾à¦¨)',
'month' => 'à¦à¦‡ মাস (বা তার আগে) থেকে:',
@@ -2486,13 +2565,11 @@ $1',
'ipb_blocked_as_range' => 'তà§à¦°à§à¦Ÿà¦¿: $1 আইপি ঠিকানাটিকে সরাসরি বাধা দেওয়া হয়নি à¦à¦¬à¦‚ বাধা তà§à¦²à§‡ নেওয়া যাবে না। তবে ঠিকানাটি $2 সীমার অনà§à¦¤à¦°à§à¦­à§à¦•à§à¦¤ à¦à¦¬à¦‚ সেটি থেকে বাধা তà§à¦²à§‡ নেওয়া সমà§à¦­à¦¬à¥¤',
'ip_range_invalid' => 'অবৈধ আইপি শà§à¦°à§‡à¦£à§€',
'ip_range_toolarge' => '/$1 à¦à¦° বড় রেঞà§à¦œà¦¬à§à¦²à¦• বà§à¦¯à¦¬à¦¹à¦¾à¦° অনà§à¦®à¦¦à¦¿à¦¤ নয়।',
-'blockme' => 'আমাকে বাধা দেওয়া হোক',
'proxyblocker' => 'পà§à¦°à¦•à§à¦¸à¦¿ বাধাদানকারী',
-'proxyblocker-disabled' => 'à¦à¦‡ ফাংশনটি নিষà§à¦•à§à¦°à¦¿à¦¯à¦¼à¥¤',
'proxyblockreason' => 'আপনার আইপি ঠিকানাকে বাধা দেয়া হয়েছে কারণ à¦à¦Ÿà¦¿ à¦à¦•à¦Ÿà¦¿ উনà§à¦®à§à¦•à§à¦¤ পà§à¦°à¦•à§à¦¸à¦¿à¥¤ অনà§à¦—à§à¦°à¦¹ করে আপনার ইনà§à¦Ÿà¦¾à¦°à¦¨à§‡à¦Ÿ সেবা পà§à¦°à¦¦à¦¾à¦¨à¦•à¦¾à¦°à§€ কোমà§à¦ªà¦¾à¦¨à¦¿à¦° সাথে কারিগরি সহায়তার বà§à¦¯à¦¾à¦ªà¦¾à¦°à§‡ যোগাযোগ করà§à¦¨ à¦à¦¬à¦‚ à¦à¦‡ গà§à¦°à§à¦¤à§à¦¬à¦ªà§‚রà§à¦£ নিরাপতà§à¦¤à¦¾ সমসà§à¦¯à¦¾à¦° বà§à¦¯à¦¾à¦ªà¦¾à¦°à§‡ তাদেরকে অবহিত করà§à¦¨à¥¤',
-'proxyblocksuccess' => 'নিষà§à¦ªà¦¨à§à¦¨ হয়েছে।',
'sorbsreason' => 'আপনার আইপি ঠিকানাটি {{SITENAME}}-à¦à¦° বà§à¦¯à¦¬à¦¹à¦¾à¦° করা DNSBL-ঠউনà§à¦®à§à¦•à§à¦¤ পà§à¦°à¦•à§à¦¸à¦¿ হিসেবে তালিকাভà§à¦•à§à¦¤ আছে।',
'sorbs_create_account_reason' => 'আপনার আইপি ঠিকানাটি {{SITENAME}}-à¦à¦° বà§à¦¯à¦¬à¦¹à¦¾à¦° করা DNSBL-ঠউনà§à¦®à§à¦•à§à¦¤ পà§à¦°à¦•à§à¦¸à¦¿ হিসেবে তালিকাভà§à¦•à§à¦¤ আছে। আপনি কোন অà§à¦¯à¦¾à¦•à¦¾à¦‰à¦¨à§à¦Ÿ সৃষà§à¦Ÿà¦¿ করতে পারবেন না।',
+'xffblockreason' => 'X-Forwarded-For হেডারে থাকা আইপি ঠিকানাটি বà§à¦²à¦• করা হয়েছে, হয় à¦à¦Ÿà¦¿ আপনার নিজের অথবা আপনার বà§à¦¯à¦¬à¦¹à§ƒà¦¤ পà§à¦°à¦•à§à¦¸à¦¿ সারà§à¦­à¦¾à¦°à§‡à¦° আইপি ঠিকানা। বà§à¦²à¦• করার কারণ হল: $1',
'cant-block-while-blocked' => 'আপনি নিজে বà§à¦²à¦• থাকা অবসà§à¦¥à¦¾à¦¯à¦¼ অনà§à¦¯à¦¨à§à¦¯ বà§à¦¯à¦¬à¦¹à¦¾à¦°à¦•à¦¾à¦°à§€à¦•à§‡ বà§à¦²à¦• করতে পারবেন না।',
'cant-see-hidden-user' => 'আপনি যে বà§à¦¯à¦¬à¦¹à¦¾à¦°à¦•à¦¾à¦°à§€à¦•à§‡ বà§à¦²à¦• বা লà§à¦•à¦¿à¦¯à¦¼à§‡ রাখতে চাচà§à¦›à§‡à¦¨ তাকে আগে থেকেই বà§à¦²à¦• বা লà§à¦•à¦¿à¦¯à¦¼à§‡ রাখা হয়েছে। à¦à¦›à¦¾à¦¡à¦¼à¦¾ আপনার Hideuser অধিকার নেই, তাই আপনি বà§à¦¯à¦¬à¦¹à¦¾à¦°à¦•à¦¾à¦°à§€à¦° অবসà§à¦¥à¦¾ পরিবরà§à¦¤à¦¨ করতে পারবেন না।',
'ipbblocked' => 'আপনি অনà§à¦¯ কোন বà§à¦¯à¦¬à¦¹à¦¾à¦°à¦•à¦°à§€à¦•à§‡ বà§à¦²à¦• বা আনবà§à¦²à¦• করতে পারবেন না, কারণ আপনি নিজেই বà§à¦²à¦• রয়েছেন',
@@ -2652,6 +2729,8 @@ $1',
'thumbnail-more' => 'বড় করো',
'filemissing' => 'ফাইল হারিয়ে গেছে',
'thumbnail_error' => 'থামà§à¦¬à¦¨à§‡à¦‡à¦² সৃষà§à¦Ÿà¦¿ করতে গিয়ে তà§à¦°à§à¦Ÿà¦¿: $1',
+'thumbnail_error_remote' => '$1 থেকে তà§à¦°à§à¦Ÿà¦¿à¦° বারà§à¦¤à¦¾:
+$2',
'djvu_page_error' => 'DjVu পাতা সীমার বাইরে',
'djvu_no_xml' => 'DjVu ফাইলের জনà§à¦¯ XML আনতে পারা যায়নি।',
'thumbnail-temp-create' => 'অসà§à¦¥à¦¾à¦¯à¦¼à§€ থামà§à¦¬à¦¨à§‡à¦‡à¦² ফাইল তৈরী করা সমà§à¦­à¦¬ নয়',
@@ -2799,12 +2878,6 @@ $1',
'tooltip-preferences-save' => 'পছনà§à¦¦ সংরকà§à¦·à¦£',
'tooltip-summary' => 'à¦à¦•à¦Ÿà¦¿ সংকà§à¦·à¦¿à¦ªà§à¦¤ সারাংশ দিন',
-# Stylesheets
-'nostalgia.css' => '/* সিà¦à¦¸à¦à¦¸ à¦à¦–ানে সà§à¦¥à¦¾à¦ªà¦¨ করা নসà§à¦Ÿà¦¾à¦²à¦œà¦¿à¦¯à¦¼à¦¾ সà§à¦•à¦¿à¦¨ বà§à¦¯à¦¬à¦¹à¦¾à¦°à¦•à¦¾à¦°à§€à¦¦à§‡à¦° পà§à¦°à¦­à¦¾à¦¬à¦¿à¦¤ করবে */',
-
-# Scripts
-'nostalgia.js' => '/* à¦à¦–ানে যেকোন কোন জাভাসà§à¦•à§à¦°à¦¿à¦ªà§à¦Ÿ নসà§à¦Ÿà¦¾à¦²à¦œà¦¿à¦¯à¦¼à¦¾ সà§à¦•à¦¿à¦¨ বà§à¦¯à¦¬à¦¹à¦¾à¦° করা বà§à¦¯à¦¬à¦¹à¦¾à¦°à¦•à¦¾à¦°à§€à¦¦à§‡à¦° জনà§à¦¯ লোড করা হবে*/',
-
# Metadata
'notacceptable' => 'আপনার কà§à¦²à¦¾à¦¯à¦¼à§‡à¦¨à§à¦Ÿ পড়তে পারে à¦à¦®à¦¨ ফরমà§à¦¯à¦¾à¦Ÿà§‡ উইকি সারà§à¦­à¦¾à¦° উপাতà§à¦¤ সরবরাহ করতে পারছে না।',
@@ -2876,8 +2949,6 @@ $1',
'pageinfo-category-files' => 'ফাইলের সংখà§à¦¯à¦¾',
# Skin names
-'skinname-standard' => 'কà§à¦²à¦¾à¦¸à¦¿à¦•',
-'skinname-nostalgia' => 'নসà§à¦Ÿà¦¾à¦²à¦œà¦¿à¦¯à¦¼à¦¾',
'skinname-cologneblue' => 'কলোন বà§à¦²à§',
'skinname-monobook' => 'মনোবà§à¦•',
'skinname-modern' => 'মডারà§à¦¨',
@@ -2958,11 +3029,25 @@ $1',
'minutes' => '{{PLURAL:$1|$1 মিনিট|$1 মিনিট}}',
'hours' => '{{PLURAL:$1|$1 ঘণà§à¦Ÿà¦¾|$1 ঘণà§à¦Ÿà¦¾}}',
'days' => '{{PLURAL:$1|$1 দিন|$1 দিন}}',
+'weeks' => '{{PLURAL:$1|$1 সপà§à¦¤à¦¾à¦¹}}',
'months' => '{{PLURAL:$1|$1 মাস}}',
'years' => '{{PLURAL:$1|$1 বছর}}',
'ago' => '$1 আগে',
'just-now' => 'à¦à¦–নই',
+# Human-readable timestamps
+'hours-ago' => '$1 {{PLURAL:$1|ঘনà§à¦Ÿà¦¾}} পূরà§à¦¬à§‡',
+'minutes-ago' => '$1 {{PLURAL:$1|মিনিট}} পূরà§à¦¬à§‡',
+'seconds-ago' => '$1 {{PLURAL:$1|সেকেনà§à¦¡}} পূরà§à¦¬à§‡',
+'monday-at' => 'সোমবার, $1',
+'tuesday-at' => 'মঙà§à¦—লবার, $1',
+'wednesday-at' => 'বà§à¦§à¦¬à¦¾à¦°, $1',
+'thursday-at' => 'বৃহসà§à¦ªà¦¤à¦¿à¦¬à¦¾à¦°, $1',
+'friday-at' => 'শà§à¦•à§à¦°à¦¬à¦¾à¦°, $1',
+'saturday-at' => 'শনিবার, $1',
+'sunday-at' => 'রবিবার, $1',
+'yesterday-at' => 'গতকাল, $1',
+
# Bad image list
'bad_image_list' => 'ফরমà§à¦¯à¦¾à¦Ÿà¦Ÿà¦¿ à¦à¦°à¦•à¦®:
@@ -2989,7 +3074,7 @@ $1',
* gpslongitude
* gpsaltitude',
-# EXIF tags
+# Exif tags
'exif-imagewidth' => 'চওড়া',
'exif-imagelength' => 'লমà§à¦¬à¦¾',
'exif-bitspersample' => 'উপাদানপà§à¦°à¦¤à¦¿ বিট',
@@ -3168,7 +3253,7 @@ $1',
'exif-originalimageheight' => 'কà§à¦°à¦ª করার পূরà§à¦¬à§‡ চিতà§à¦°à¦Ÿà¦¿à¦° উচà§à¦šà¦¤à¦¾',
'exif-originalimagewidth' => 'কà§à¦°à¦ª করার পূরà§à¦¬à§‡ চিতà§à¦°à¦Ÿà¦¿à¦° পà§à¦°à¦¸à§à¦¥',
-# EXIF attributes
+# Exif attributes
'exif-compression-1' => 'অসংকà§à¦šà¦¿à¦¤',
'exif-compression-2' => 'সিসিআইটিটি গà§à¦°à§à¦ª ৩ ১-ডাইমেনশনাম মডিফাইড হাফমà§à¦¯à¦¾à¦¨ রান লেংকà§à¦¥ à¦à¦¨à¦•à§‹à¦¡à¦¿à¦‚',
'exif-compression-3' => 'সিসিআইটিটি গà§à¦°à§à¦ª ৩ ফà§à¦¯à¦¾à¦•à§à¦¸ à¦à¦¨à¦•à§‹à¦¡à¦¿à¦‚',
@@ -3598,7 +3683,6 @@ $4-ঠনিশà§à¦šà¦¿à¦¤à¦•à¦°à¦£ কোডটি মেয়াদোতà§
'version-other' => 'অনà§à¦¯',
'version-mediahandlers' => 'মিডিয়া বà§à¦¯à¦¬à¦¸à§à¦¥à¦¾à¦ªà¦•',
'version-hooks' => 'হà§à¦•',
-'version-extension-functions' => 'à¦à¦•à§à¦¸à¦Ÿà§‡à¦¨à¦¶à¦¨à§‡à¦° কাজ',
'version-parser-extensiontags' => 'পারà§à¦¸à¦¾à¦° à¦à¦•à§à¦¸à¦Ÿà§‡à¦¨à¦¶à¦¨ টà§à¦¯à¦¾à¦—',
'version-parser-function-hooks' => 'পারà§à¦¸à¦¾à¦° ফাংশন হà§à¦•',
'version-hook-name' => 'হà§à¦•à§‡à¦° নাম',
@@ -3607,6 +3691,7 @@ $4-ঠনিশà§à¦šà¦¿à¦¤à¦•à¦°à¦£ কোডটি মেয়াদোতà§
'version-license' => 'লাইসেনà§à¦¸',
'version-poweredby-credits' => "à¦à¦‡à¦• উইকিটি পরিচালিত হচà§à¦›à§‡ '''[//www.mediawiki.org/ মিডিয়াউইকি]'''-à¦à¦° মাধà§à¦¯à¦®à§‡, কপিরাইট © ২০০১-$1 $2।",
'version-poweredby-others' => 'অনà§à¦¯à¦¾à¦¨à§à¦¯',
+'version-poweredby-translators' => 'translatewiki.net অনà§à¦¬à¦¾à¦¦à¦•à¦—ণ',
'version-credits-summary' => '[[Special:Version|মিডিয়াউইকি]] সফটওয়à§à¦¯à¦¾à¦°à§‡ অবদানের জনà§à¦¯ আমরা à¦à¦‡ বà§à¦¯à¦•à§à¦¤à¦¿à¦•à§‡ সà§à¦¬à§€à¦•à§ƒà¦¤à¦¿ দিতে চাই।',
'version-license-info' => 'মিডিয়াউইকি à¦++++কটি ফà§à¦°à¦¿ সফটওয়à§à¦¯à¦¾à¦°, আপনি à¦à¦Ÿà¦¿ বিতরণ করতে পারবেন à¦à¦¬à¦‚/অথবা সমà§à¦ªà¦¦à¦¾à¦¨à¦¾ করতে পারবেন, à¦à¦•à§à¦·à§‡à¦¤à§à¦°à§‡ ফà§à¦°à¦¿ সফটওয়à§à¦¯à¦¾à¦° ফাউনà§à¦¡à§‡à¦¶à¦¨à§‡à¦° পà§à¦°à¦•à¦¾à¦¶à¦¿à¦¤ গনৠজেনারেল পাবলিক লাইসেনà§à¦¸à§‡à¦° ২য় অথবা সামà§à¦ªà§à¦°à¦¤à¦¿à¦•à¦¤à¦® কোনো সংসà§à¦•à¦°à¦£ মেনে চলতে হবে।
@@ -3620,12 +3705,17 @@ $4-ঠনিশà§à¦šà¦¿à¦¤à¦•à¦°à¦£ কোডটি মেয়াদোতà§
'version-entrypoints-header-entrypoint' => 'শà§à¦°à§',
'version-entrypoints-header-url' => 'ইউআরà¦à¦²',
-# Special:FilePath
-'filepath' => 'ফাইলের পাথ',
-'filepath-page' => 'ফাইল:',
-'filepath-submit' => 'চলো',
-'filepath-summary' => 'à¦à¦‡ বিশেষ পাতায় ফাইলের পূরà§à¦£à¦¾à¦™à§à¦— পাথ দেখা যাবে।
-চিতà§à¦°à¦—à§à¦²à§‹ পূরà§à¦£ রেজà§à¦¯à§à¦²à§‡à¦¶à¦¨à§‡ পà§à¦°à¦¦à¦°à§à¦¶à¦¿à¦¤ হবে, অনà§à¦¯à¦¾à¦¨à§à¦¯ ধরনের ফাইলগà§à¦²à§‹ তার নিরà§à¦§à¦¾à¦°à¦¿à¦¤ পà§à¦°à§‹à¦—à§à¦°à¦¾à¦®à§‡à¦° মাধà§à¦¯à¦®à§‡ ওপেন হবে।',
+# Special:Redirect
+'redirect' => 'ফাইল, বà§à¦¯à¦¬à¦¹à¦¾à¦°à¦•à¦°à§€, অথবা রিভিশন আইডি দà§à¦¬à¦¾à¦°à¦¾ পà§à¦¨à¦ƒà¦¨à¦¿à¦°à§à¦¦à§‡à¦¶ করা হয়েছে',
+'redirect-legend' => 'à¦à¦•à¦Ÿà¦¿ ফাইল অথবা পাতায় পà§à¦¨à¦ƒà¦¨à¦¿à¦°à§à¦¦à§‡à¦¶ করা হয়েছে',
+'redirect-summary' => 'à¦à¦‡ বিশেষ পাতাটি পà§à¦¨à¦ƒà¦¨à¦¿à¦°à§à¦¦à§‡à¦¶à¦¿à¦¤ হয়েছে à¦à¦•à¦Ÿà¦¿ ফাইলে (ফাইলের নাম), à¦à¦•à¦Ÿà¦¿ পাতা (রিভিশন আইডি), অথবা à¦à¦•à¦Ÿà¦¿ বà§à¦¯à¦¬à¦¹à¦¾à¦°à¦•à¦°à§€ পাতায় (সংখà§à¦¯à¦¾à¦¯à¦¼ লেখা বà§à¦¯à¦¬à¦¹à¦¾à¦°à¦•à¦¾à¦°à§€ আইডি)।',
+'redirect-submit' => 'যাও',
+'redirect-lookup' => 'দেখà§à¦¨:',
+'redirect-value' => 'মান:',
+'redirect-user' => 'বà§à¦¯à¦¬à¦¹à¦¾à¦°à¦•à¦¾à¦°à§€ আইডি',
+'redirect-revision' => 'পাতা সংসà§à¦•à¦°à¦£',
+'redirect-file' => 'ফাইলের নাম',
+'redirect-not-exists' => 'মান পাওয়া যায়নি',
# Special:FileDuplicateSearch
'fileduplicatesearch' => 'ডà§à¦ªà§à¦²à¦¿à¦•à§‡à¦Ÿ ফাইলের জনà§à¦¯ অনà§à¦¸à¦¨à§à¦§à¦¾à¦¨',
@@ -3674,12 +3764,16 @@ $4-ঠনিশà§à¦šà¦¿à¦¤à¦•à¦°à¦£ কোডটি মেয়াদোতà§
'tags' => 'সঠিক চেঞà§à¦œ টà§à¦¯à¦¾à¦—',
'tag-filter' => '[[Special:Tags|টà§à¦¯à¦¾à¦—]] ছাকনী:',
'tag-filter-submit' => 'ছাকনী',
+'tag-list-wrapper' => '([[Special:Tags|{{PLURAL:$1|টà§à¦¯à¦¾à¦—}}]]: $2)',
'tags-title' => 'টà§à¦¯à¦¾à¦—সমূহ',
'tags-intro' => 'à¦à¦‡ পাতায় সফটওয়à§à¦¯à¦¾à¦°à¦Ÿà¦¿ à¦à¦•à¦Ÿà¦¿ সমà§à¦ªà¦¾à¦¦à¦¨à¦¾ চিহà§à¦¨à¦¿à¦¤ করার জনà§à¦¯ যে সকল টà§à¦¯à¦¾à¦— বà§à¦¯à¦¬à¦¹à¦¾à¦° করে তার তালিকা ও বরà§à¦£à¦¨à¦¾ রয়েছে।',
'tags-tag' => 'টà§à¦¯à¦¾à¦— নাম',
'tags-display-header' => 'পরিনরà§à¦¤à¦¨ পাতার বৈশিষà§à¦Ÿ',
'tags-description-header' => 'অরà§à¦¥à§‡à¦° পূরà§à¦£ বণনা',
+'tags-active-header' => 'সকà§à¦°à¦¿à¦¯à¦¼?',
'tags-hitcount-header' => 'টà§à¦¯à¦¾à¦—কৃত পরিবরà§à¦¸à¦¤à¦¨à¦®à§‚হ',
+'tags-active-yes' => 'হà§à¦¯à¦¾à¦',
+'tags-active-no' => 'না',
'tags-edit' => 'সমà§à¦ªà¦¾à¦¦à¦¨à¦¾',
'tags-hitcount' => '$1 {{PLURAL:$1|পরিবরà§à¦¤à¦¨|পরিবরà§à¦¤à¦¨à¦¸à¦®à§‚হ}}',
@@ -3700,6 +3794,7 @@ $4-ঠনিশà§à¦šà¦¿à¦¤à¦•à¦°à¦£ কোডটি মেয়াদোতà§
'dberr-problems' => ' দà§à¦ƒà¦–িত! à¦à¦‡ সাইটটি বরà§à¦¤à¦®à¦¾à¦¨à§‡ কারীগরী অসà§à¦¬à¦¿à¦§à¦¾à¦° মà§à¦–োমà§à¦–ি হয়েছে।',
'dberr-again' => 'কয়েক মিনিট পর পà§à¦¨à¦°à¦¾à¦¯à¦¼ পরিদরà§à¦¶à¦¨à§‡à¦° চেষà§à¦Ÿà¦¾ করà§à¦¨à¥¤',
'dberr-info' => '(ডেটাবেজ সারà§à¦­à¦¾à¦° $1-à¦à¦° সাথে যোগাযোগ করা সমà§à¦­à¦¬ হয়নি)',
+'dberr-info-hidden' => '(ডাটাবেজ সারà§à¦­à¦¾à¦°à§‡à¦° সাথে সংযোগ দেয়া সমà§à¦­à¦¬ হচà§à¦›à§‡ না)',
'dberr-usegoogle' => 'à¦à¦‡ পরিসà§à¦¥à¦¿à¦¤à¦¿à¦¤à§‡ আপনি গà§à¦—লের মাধà§à¦¯à¦®à§‡ অনà§à¦¸à¦¨à§à¦§à¦¾à¦¨ করার চেষà§à¦Ÿà¦¾ করতে পারেন।',
'dberr-outofdate' => 'খেয়াল করà§à¦¨ যে, আমাদের বিষয়বসà§à¦¤à§ সমà§à¦ªà¦°à§à¦•à¦¿à¦¤ তাদের সূচি মেয়াদ উতà§à¦¤à§€à¦°à§à¦£ হতে পারে।',
'dberr-cachederror' => 'à¦à¦Ÿà¦¿ অনà§à¦°à§‹à¦§à¦•à§ƒà¦¤ পাতার কà§à¦¯à¦¾à¦¶à§‡ লিপি, যা হালনাগাতকৃত নাও হতে পারে।',
@@ -3715,6 +3810,9 @@ $4-ঠনিশà§à¦šà¦¿à¦¤à¦•à¦°à¦£ কোডটি মেয়াদোতà§
'htmlform-submit' => 'জমা দাও',
'htmlform-reset' => 'পরিবরà§à¦¤à¦¨ বাতিল',
'htmlform-selectorother-other' => 'অনà§à¦¯',
+'htmlform-no' => 'না',
+'htmlform-yes' => 'হà§à¦¯à¦¾à¦',
+'htmlform-chosen-placeholder' => 'অপশন নিরà§à¦¬à¦¾à¦šà¦¨ করà§à¦¨',
# SQLite database support
'sqlite-has-fts' => '$1 সহ পূরà§à¦£ টেকà§à¦¸à¦Ÿ সারà§à¦š সমরà§à¦¥à¦¨',
@@ -3832,4 +3930,19 @@ $4-ঠনিশà§à¦šà¦¿à¦¤à¦•à¦°à¦£ কোডটি মেয়াদোতà§
# Image rotation
'rotate-comment' => 'ছবিটি ঘড়ির কাটার দিকে $1 {{PLURAL:$1|ডিগà§à¦°à¦¿}} ঘà§à¦°à¦¾à¦¨à§‹ হয়েছে',
+# Limit report
+'limitreport-title' => 'পারà§à¦¸à¦¾à¦° পà§à¦°à§‹à¦«à¦¾à¦‡à¦²à¦¿à¦‚ তথà§à¦¯:',
+'limitreport-cputime' => 'সিপিইউ সময় বà§à¦¯à¦¬à¦¹à¦¾à¦°',
+'limitreport-cputime-value' => '$1 {{PLURAL:$1|সেকেনà§à¦¡}}',
+'limitreport-walltime' => 'পà§à¦°à¦•à§ƒà¦¤ সময় বà§à¦¯à¦¬à¦¹à¦¾à¦°',
+'limitreport-walltime-value' => '$1 {{PLURAL:$1|সেকেনà§à¦¡}}',
+'limitreport-ppvisitednodes' => 'পà§à¦°à¦¾à¦• পà§à¦°à¦¸à§‡à¦¸à¦° পরিদরà§à¦¶à¦¨ সংযোগ গণনা',
+'limitreport-ppgeneratednodes' => 'পà§à¦°à¦¾à¦• পà§à¦°à¦¸à§‡à¦¸à¦° উৎপনà§à¦¨ সংযোগ গণনা',
+'limitreport-postexpandincludesize' => 'পরবরà§à¦¤à§€-পà§à¦°à¦¸à¦¾à¦°à¦¿à¦¤ অনà§à¦¤à¦°à§à¦­à§à¦•à§à¦¤ আকার',
+'limitreport-postexpandincludesize-value' => '$1/$2 {{PLURAL:$2|বাইট}}',
+'limitreport-templateargumentsize' => 'টেমপà§à¦²à§‡à¦Ÿ পà§à¦¯à¦¾à¦°à¦¾à¦®à¦¿à¦Ÿà¦¾à¦°à§‡à¦° আকার',
+'limitreport-templateargumentsize-value' => '$1/$2 {{PLURAL:$2|বাইট}}',
+'limitreport-expansiondepth' => 'সরà§à¦¬à§‹à¦šà§à¦š গভীরতা বিসà§à¦¤à¦¾à¦°',
+'limitreport-expensivefunctioncount' => 'বà§à¦¯à¦¯à¦¼à¦¬à¦¹à§à¦² পারà§à¦¸à¦¾à¦° ফাংশন গণনা',
+
);
diff --git a/languages/messages/MessagesBo.php b/languages/messages/MessagesBo.php
index 926ac408..8beff878 100644
--- a/languages/messages/MessagesBo.php
+++ b/languages/messages/MessagesBo.php
@@ -221,7 +221,7 @@ $messages = array(
'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).
+# 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).
'aboutsite' => '{{SITENAME}}ངེད་ཀྱི་སà¾à½¼à½¢à¼',
'aboutpage' => 'Project: ཡི་སà¾à½¼à½¢à¼',
'copyright' => 'དྲ་བའི་ནང་དོན་$1སྟེང་དུ་ཡོདà¼',
@@ -231,7 +231,6 @@ $messages = array(
'disclaimers' => 'དགག་བྱà¼',
'disclaimerpage' => 'Project:སྤྱིའི་དགག་བྱà¼',
'edithelp' => 'རྩོམ་སྒྲིག་རོགས་རམà¼',
-'edithelppage' => 'Help:རྩོམ་སྒྲིག',
'helppage' => 'Help:ནང་དོན་',
'mainpage' => 'གཙོ་ངོསà¼',
'mainpage-description' => 'གཙོ་ངོསà¼',
@@ -333,7 +332,7 @@ $messages = array(
'newpassword' => 'ལམ་ཡིག་གསར་བà¼',
'retypenew' => 'ལམ་ཡིག་གསར་བ་བསà¾à¾±à½¢à¼‹à½ à½‡à½´à½‚་བྱོསà¼',
'resetpass_submit' => 'ལམ་ཡིག་བསྒྲིགས་ནས་ནང་འཛུལ་བྱེད་པà¼',
-'resetpass_success' => 'ལམ་ཡིག་བདེ་ལེགས་ངང་བརྗེས་ཟིན༠ད་ནི་ནང་འཛུལ་བྱེད་བཞིན་པ་་་',
+'changepassword-success' => 'ལམ་ཡིག་བདེ་ལེགས་ངང་བརྗེས་ཟིན༠ད་ནི་ནང་འཛུལ་བྱེད་བཞིན་པ་་་',
'resetpass_forbidden' => 'ལམ་ཡིག་བརྗེ་མི་à½à½´à½–à¼',
'resetpass-submit-loggedin' => 'ལམ་ཡིག་བརྗེ་བà¼',
'resetpass-submit-cancel' => 'རྩིས་མེད་à½à½¼à½„སà¼',
diff --git a/languages/messages/MessagesBpy.php b/languages/messages/MessagesBpy.php
index 6b088dba..8025ce8a 100644
--- a/languages/messages/MessagesBpy.php
+++ b/languages/messages/MessagesBpy.php
@@ -76,9 +76,6 @@ $messages = array(
'tog-shownumberswatching' => 'চাকà§à¦°à¦¾à¦° সংখà§à¦¯à¦¾à¦¹à¦¾à¦¨ দেহাদে',
'tog-oldsig' => 'আগেতà§à¦¤à¦° আসে সà§à¦¬à¦¾à¦•à§à¦·à¦°à¦°à¦¹à¦¾à¦¨:',
'tog-fancysig' => 'সà§à¦¬à¦¾à¦•à§à¦·à¦°à¦¹à¦¾à¦¨à¦°à§‡ উইকিটেকà§à¦¸à¦Ÿ বà§à¦²à¦¿à¦¯à¦¼à¦¾ নিংকর (নিজেতà§à¦¤ লিঙà§à¦• নেইকরিয়া)',
-'tog-externaleditor' => 'অকরাতই বারেদের সমà§à¦ªà¦¾à¦¦à¦• বà§à¦¯à¦¬à¦¹à¦¾à¦° কর (হà§à¦¦à§à¦¦à¦¾ দকà§à¦· বà§à¦¯à¦¬à¦¹à¦¾à¦°à¦•à¦¾à¦°à§€à¦°à¦•à¦¾, কমà§à¦ªà¦¿à¦‰à¦Ÿà¦¾à¦°à¦° মা বিশেষ সেটিংস দরকার। [//www.mediawiki.org/wiki/Manual:External_editors বিসà§à¦¤à¦¾à¦°à¦¿à¦¤ পৌ।])',
-'tog-externaldiff' => 'অকরাতই বারেদের সমà§à¦ªà¦¾à¦¦à¦• বà§à¦¯à¦¬à¦¹à¦¾à¦° কর (হà§à¦¦à§à¦¦à¦¾ দকà§à¦· বà§à¦¯à¦¬à¦¹à¦¾à¦°à¦•à¦¾à¦°à§€à¦°à¦•à¦¾, কমà§à¦ªà¦¿à¦‰à¦Ÿà¦¾à¦°à¦° মা বিশেষ সেটিংস দরকার। [//www.mediawiki.org/wiki/Manual:External_editors বিসà§à¦¤à¦¾à¦°à¦¿à¦¤ পৌ।])',
-'tog-showjumplinks' => '"চঙদে" বà§à¦²à¦¤à¦¾à¦°à¦¾ মিলাপর য়à§à¦¯à¦¾à¦¥à¦¾à¦™à¦¦à§‡',
'tog-uselivepreview' => 'লগে লগে মিলà§à¦²à§‡à¦™ আহান দেহাদে (জাভাসà§à¦•à§à¦°à¦¿à¦ªà§à¦Ÿ) (লইনাসে)',
'tog-forceeditsummary' => 'খালি পতা সারমরà§à¦® হমিলে মরে হারপà§à§±à¦¾à¦¦à§‡',
'tog-watchlisthideown' => 'মি পতাসৠঅতা গà§à¦° মর তালাবিতà§à¦¤',
@@ -91,6 +88,7 @@ $messages = array(
'tog-diffonly' => 'ফারাকর তলে পাতাহানর বিষয়বসà§à¦¤à§ নাদেখাদি',
'tog-showhiddencats' => 'আরà§à¦®à§‡ আসে থাকহানি ফংকর',
'tog-norollbackdiff' => 'রোলবà§à¦¯à¦¾à¦•à¦° পিসে ফারাক না দেখাদি',
+'tog-useeditwarning' => 'পতানির সময় ইতৠনাকরিয়া বেলিয়া গেলেগা মরে সিঙকরেদিস',
'underline-always' => 'হারি সময়',
'underline-never' => 'সà§à¦ªà§Œà¦¨à¦¾',
@@ -276,7 +274,7 @@ $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).
+# 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).
'aboutsite' => '{{SITENAME}}র বারে',
'aboutpage' => 'Project:বারে',
'copyright' => '$1-র মাতà§à¦™à§‡ à¦à¦¹à¦¾à¦¨à¦° মেথেলহানি পানা à¦à¦•à¦°à§‡à¦°à¥¤',
@@ -286,7 +284,6 @@ $1',
'disclaimers' => 'দাবি বেলানি',
'disclaimerpage' => 'Project:ইজà§à¦œà§ দাবি বেলানি',
'edithelp' => 'পতানি পাংলাক',
-'edithelppage' => 'Help:কিসাদে_পাতা_আহান_পতানি',
'helppage' => 'Help:পাংলাক',
'mainpage' => 'পয়লা পাতা',
'mainpage-description' => 'পয়লা পাতা',
@@ -359,17 +356,6 @@ $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' => 'তালা দেনার কারণহান মাত, লগে কà§à¦®à§à¦ªà¦¾à¦—া মà§à¦•à¦¿à¦¤à§‡à¦‡ অহান মাত',
@@ -416,7 +402,6 @@ $1',
'viewsourcetext' => 'পাতা à¦à¦¹à¦¾à¦¨à¦° উতà§à¦¸ চা বারো কপি করে পারর:',
'protectedinterface' => 'পাতা à¦à¦¹à¦¾à¦¨à¦° মেথেল উইকি সফটওয়à§à¦¯à¦¾à¦°à¦° ইনà§à¦Ÿà¦¾à¦°à¦«à§‡à¦¸à¦° পৌহান দের, অহানে à¦à¦¹à¦¾à¦¨à¦°à§‡ ইতৠকরিয়া থনা অসে à¦à¦¬à¦¿à¦‰à¦¸à§‡à¦¤à§à¦¤ ঙাকà§à¦•à¦°à¦¾à¦¨à¦¿à¦° কাজে।',
'editinginterface' => "'''সিঙà§à¦‡à¦¸:''' তি à¦à¦®à¦¨ পাতা আহান পতার যেহান সফটওয়à§à¦¯à¦¾à¦°à¦° কা ইনà§à¦Ÿà¦¾à¦°à¦«à§‡à¦¸ টেকà§à¦¸à¦Ÿ দের হানে। পাতা à¦à¦¹à¦¾à¦° পতানিহান আতাকà§à¦°à¦¾à¦° ইনà§à¦Ÿà¦¾à¦°à¦«à§‡à¦¸ সিল পরতইগা, যেহান আর আ আতাকà§à¦°à¦¾à¦‡à¦¦à§‡à¦–তাই। অনà§à¦¬à¦¾à¦¦à¦° কা [//translatewiki.net/wiki/Main_Page?setlang=bpy translatewiki.net] বà§à¦¯à¦¬à¦¹à¦¾à¦° করানির বারে খালকর। à¦à¦¹à¦¾à¦¨ মিডিয়াউইকির সà§à¦¥à¦¾à¦¨à§€à¦¯à¦¼à¦•à¦°à¦£ পà§à¦°à¦•à¦²à§à¦ªà¦¹à¦¾à¦¨à¥¤",
-'sqlhidden' => '(à¦à¦¸ কিউ à¦à¦² কোয়েরি গà§à¦°à¦¿à¦¯à¦¼à¦¾ আসে)',
'cascadeprotected' => 'পাতা à¦à¦¹à¦¾à¦¨ পতানি থা নেই, কিদিয়া বà§à¦²à§à¦²à§‡ {{PLURAL:$1|হান পাতা|হান পাতার}} মা তিলà§à¦‡à¦¸à§‡, যে পাতা/পাতাহানিরতা cascading অপশন অহান লয়া সà§à¦°à¦•à§à¦·à¦¿à¦¤ অসে।
$2',
'namespaceprotected' => "'''$1''' নাঙর থাকে কোন পাতা পতানিরকা তরতা য়à§à¦¯à¦¾à¦¥à¦¾à¦‚ নেই।",
@@ -439,7 +424,6 @@ $2',
'yourpassword' => 'খনà§à¦¤à¦¾à¦šà¦¾à¦¬à¦¿à¦— (password)',
'yourpasswordagain' => 'খনà§à¦¤à¦¾à¦šà¦¾à¦¬à¦¿à¦— (password) আরাকমৠইকর',
'remembermypassword' => 'আহার গজে সেশনর কা খনà§à¦¤à¦¾à¦šà¦¾à¦¬à¦¿ মনে থ(সরà§à¦¬à§‹à¦šà§à¦š $1 {{PLURAL:$1|দিনর|দিনর}} কা)',
-'securelogin-stick-https' => 'লগইন করানির পিছে à¦à¦‡à¦šà¦Ÿà¦¿à¦Ÿà¦¿à¦ªà¦¿à¦à¦¸-র লগে সংযোগ থ',
'yourdomainname' => 'তর ডোমেইনগ',
'externaldberror' => 'ডাটেবেজর মা বেসেপ আহান ইসে নাইলে তরতা বারেদের à¦à¦•à¦¾à¦‰à¦¨à§à¦Ÿ বদালানির য়à§à¦¯à¦¾à¦¥à¦¾à¦‚ নেই।',
'login' => 'হমানি',
@@ -535,7 +519,7 @@ $2',
'newpassword' => 'নà§à§±à¦¾ খনà§à¦¤à¦¾à¦šà¦¾à¦¬à¦¿:',
'retypenew' => 'নà§à§±à¦¾ খনà§à¦¤à¦¾à¦šà¦¾à¦¬à¦¿ বারো টাইপ কর:',
'resetpass_submit' => 'খনà§à¦¤à¦¾à¦šà¦¾à¦¬à¦¿ লেপকর বারো লগ-ইন কর',
-'resetpass_success' => 'তর খনà§à¦¤à¦¾ চাবি হবাই বালাই পতিল। তি à¦à¦ªà¦¾à¦—া ভিতরে হমারগা...',
+'changepassword-success' => 'তর খনà§à¦¤à¦¾ চাবি হবাই বালাই পতিল। তি à¦à¦ªà¦¾à¦—া ভিতরে হমারগা...',
'resetpass_forbidden' => 'খনà§à¦¤à¦¾à¦šà¦¾à¦¬à¦¿à¦— সিলকরানি নà§à§±à¦¾à¦°à¦²à¦¾à¦™',
'resetpass-no-info' => 'পাতা à¦à¦¹à¦¾à¦¨à¦¾à¦¤ হমিতে গেলেগা তি যেসারেউ লগইন করানি লাগতই।',
'resetpass-submit-loggedin' => 'খনà§à¦¤à¦¾à¦šà¦¾à¦¬à¦¿ সিলকর',
@@ -711,6 +695,8 @@ $2',
'edit-conflict' => 'পতানিত বেসেপ ইসে',
'edit-already-exists' => 'নà§à§±à¦¾ পাতাহান হঙকরানি নাইল।
পাতাà¦à¦¹à¦¾à¦¨ আগেতà§à¦¤à¦° আসে।',
+'editwarning-warning' => 'পাতা à¦à¦¹à¦¾à¦¨ বেলিয়া গেলেগা তি সিলকরিসত অতা মাঙà§à¦‡à¦¤à§‡ পারে।
+তি লগইন করিসতগ ইলে, à¦à¦°à§‡ সিঙকরানির পৌ à¦à¦¹à¦¾à¦¨ তর "পতানি" থাকেতà§à¦¤ আরà§à¦® করানি পারর।',
# Parser/template warnings
'post-expand-template-inclusion-warning' => "'''সিঙà§à¦‡à¦¸:''' টেমপà§à¦²à§‡à¦Ÿà§‡à¦° ইনকà§à¦²à§à¦¡ অংতাহান ডাঙর অসে। টেমপà§à¦²à§‡à¦Ÿ কতহান তিলকরানি নà§à¦“য়ারতে পারে।",
@@ -840,7 +826,6 @@ $2',
'searchmenu-legend' => 'বিসারানির অপশনহানি',
'searchmenu-exists' => "'''উইকি à¦à¦¹à¦¾à¦¤ \"[[:\$1]]\" নাঙে পাতা আহান আসে'''",
'searchmenu-new' => "'''\"[[:\$1]]\" নাঙর পাতাহান à¦à¦°à§‡ উইকিত হঙকর!'''",
-'searchhelp-url' => 'Help:পাংলাক',
'searchmenu-prefix' => '[[Special:PrefixIndex/$1|à¦à¦°à§‡ prefix à¦à¦¤à¦¾à¦² আসে পাতাহানি]]',
'searchprofile-articles' => 'কনà§à¦Ÿà§‡à¦¨à§à¦Ÿà¦° পাতাহানি',
'searchprofile-project' => 'পাঙলাক বারো পà§à¦°à¦•à¦²à§à¦ªà¦° পাতা',
@@ -880,14 +865,6 @@ $2',
'powersearch-togglenone' => 'কিতà§à¦¤à¦¾à¦‰ নেই',
'search-external' => 'বারেদে বিসারা',
-# Quickbar
-'qbsettings' => 'কà§à¦‡à¦•à¦¬à¦¾à¦°',
-'qbsettings-none' => 'কিতà§à¦¤à¦¾à¦‰ নেই',
-'qbsettings-fixedleft' => 'লেপà§à¦ªà¦¾ বিঙ',
-'qbsettings-fixedright' => 'লেপà§à¦ªà¦¾ বাত',
-'qbsettings-floatingleft' => 'বাহের বিঙ',
-'qbsettings-floatingright' => 'বাহের বাত',
-
# Preferences page
'preferences' => 'পছনহানি',
'mypreferences' => 'মর পছন',
@@ -1018,7 +995,6 @@ $2',
'recentchangeslinked-feed' => 'সাকেই আসে পতা',
'recentchangeslinked-toolbox' => 'সাকেই আসে পতা',
'recentchangeslinked-title' => 'পতানিহান "$1"র লগে সরà§à¦®à§à¦ªà¦• আসে',
-'recentchangeslinked-noresult' => 'দেনা অসে খেনà§à¦¤à¦¾à¦®à¦° ভিতরে পতাসিতা নেই।',
'recentchangeslinked-summary' => "লেপকরা পাতা আহান (অথবা লেপকরা বিষয়শà§à¦°à§‡à¦£à§€)তà§à¦¤ তিলসে à¦à¦°à§‡ পাতা à¦à¦¹à¦¾à¦¨à¦° হাদি à¦à¦¹à¦¾à¦¨ পতাসি অহানর লাতঙ দেনা অইল। তর [[Special:Watchlist|তর চালাতঙ]]ঠথসি পাতাহানি '''গাঢ়''' করিয়া দেহাদেনা অসে।",
'recentchangeslinked-page' => 'পাতার নাঙ:',
'recentchangeslinked-to' => 'দিয়াসি পাতাহানর বদালা মিলাপ আসে পাতাহানির পতানিহানি দেহাদে',
@@ -1138,9 +1114,6 @@ $2',
'statistics-articles' => 'পাতার কনà§à¦Ÿà§‡à¦¨à¦¹à¦¾à¦¨à¦¿',
'statistics-pages' => 'পাতাহানি',
-'disambiguations' => 'সনà§à¦¦à¦‡ চà§à¦®à¦•à¦°à§‡à¦° পাতাহানি',
-'disambiguationspage' => 'Template:সনà§à¦¦à¦‡ চà§à¦®',
-
'doubleredirects' => 'আলথকে যানা দà§à¦¬à¦¿à¦®à¦¾à¦‰ মাতের',
'brokenredirects' => 'বারো-নিরà§à¦¦à§‡à¦¶ কামনাকরের',
@@ -1676,11 +1649,6 @@ Also see [[Special:WantedCategories|wanted categories]].',
'version-software-product' => 'পণà§à¦¯',
'version-software-version' => 'সংসà§à¦•à¦°à¦£',
-# Special:FilePath
-'filepath' => 'ফাইলর পথহান:',
-'filepath-page' => 'ফাইল:',
-'filepath-submit' => 'পথ',
-
# Special:SpecialPages
'specialpages' => 'বিশেষ পাতাহানি',
'specialpages-group-login' => 'à¦à¦•à¦¾à¦‰à¦¨à§à¦Ÿà¦¹à¦¾à¦¤ হমানি/মিহানি',
diff --git a/languages/messages/MessagesBqi.php b/languages/messages/MessagesBqi.php
index 36cac436..d0ac8c4c 100644
--- a/languages/messages/MessagesBqi.php
+++ b/languages/messages/MessagesBqi.php
@@ -45,8 +45,6 @@ $messages = array(
'tog-enotifrevealaddr' => 'نشودادن امیل مو درامیلهای آگاهی-خبری',
'tog-shownumberswatching' => 'نشودادن شماره کاربران درحال کار یاتماشا',
'tog-fancysig' => 'امضاهای ناتمام - بدون لینکهای اتوماتیک',
-'tog-externaleditor' => 'بی دقتی در استÙاده از اصلاح کننده های خارجی',
-'tog-externaldiff' => 'استÙاده زه برنامه های مختل٠خارجی بوسیله پیش نمایش(سی تجربه کردن Ùقط نیاز به تنظیم خاص کامپیوترتان دارین)',
'tog-showjumplinks' => 'قادر ساختن "پرش به" لینکهای دردسترس',
'tog-uselivepreview' => 'استÙاده زه پیش نمایش زنده(جاوااسکریپ) (تجربی )',
'tog-forceeditsummary' => 'یادآوری سریع به مو هنگام اصلاح عقیم وخلاصه',
diff --git a/languages/messages/MessagesBr.php b/languages/messages/MessagesBr.php
index 20e49e2b..daab6d47 100644
--- a/languages/messages/MessagesBr.php
+++ b/languages/messages/MessagesBr.php
@@ -16,6 +16,7 @@
* @author Gwenn-Ael
* @author Kaganer
* @author Malafaya
+ * @author Nemo bis
* @author VIGNERON
* @author Y-M D
* @author לערי ריינה×רט
@@ -209,9 +210,6 @@ $messages = array(
'tog-shownumberswatching' => 'Diskouez an niver a lennerien',
'tog-oldsig' => 'Ar sinadur zo evit poent :',
'tog-fancysig' => 'Ober gant ar sinadur evel pa vefe wikitestenn (hep liamm emgefre)',
-'tog-externaleditor' => "Ober gant ur skridaozer diavaez dre ziouer (evit arbennigourien hepken rak ezhomm zo arventenniñ hoc'h urzhiataer evit se. [//www.mediawiki.org/wiki/Manual:External_editors Titouroù all.])",
-'tog-externaldiff' => "Ober gant ur c'heñverier diavaez dre ziouer (evit arbennigourien hepken rak ezhomm zo arventenniñ hoc'h urzhiataer evit se. [//www.mediawiki.org/wiki/Manual:External_editors Titouroù all.])",
-'tog-showjumplinks' => 'Gweredekaat al liammoù moned "lammat da"',
'tog-uselivepreview' => 'Implijout Rakwelet prim (taol-arnod)',
'tog-forceeditsummary' => 'Kemenn din pa ne skrivan netra er stern diverrañ',
'tog-watchlisthideown' => "Kuzhat ma c'hemmoù er rollad evezhiañ",
@@ -225,6 +223,8 @@ $messages = array(
'tog-showhiddencats' => 'Diskouez ar rummadoù kuzhet',
'tog-noconvertlink' => 'Diweredekaat amdroadur an titloù',
'tog-norollbackdiff' => 'Na ziskouez an diff goude un distaoladenn',
+'tog-useeditwarning' => 'Kas keloù din pa guitaan ur bajenn degaset kemmoù enni hep enrollañ',
+'tog-prefershttps' => "Implijout bepred ur c'hevreadur suraet pa vezit kevreet",
'underline-always' => 'Atav',
'underline-never' => 'Morse',
@@ -288,6 +288,18 @@ $messages = array(
'oct' => 'Her',
'nov' => 'Du',
'dec' => 'Kzu',
+'january-date' => '$1 a viz Genver',
+'february-date' => "$1 a viz C'hwevrer",
+'march-date' => '$1 a viz Meurzh',
+'april-date' => '$1 a viz Ebrel',
+'may-date' => '$1 a viz Mae',
+'june-date' => '$1 a viz Even',
+'july-date' => '$1 a viz Gouere',
+'august-date' => '$1 a viz Eost',
+'september-date' => '$1 a viz Gwengolo',
+'october-date' => '$1 a viz Here',
+'november-date' => '$1 a viz Du',
+'december-date' => '$1 a viz Kerzu',
# Categories related messages
'pagecategories' => '{{PLURAL:$1|Rummad |Rummad }}',
@@ -369,6 +381,7 @@ $messages = array(
'create-this-page' => 'Krouiñ ar bajenn-mañ',
'delete' => 'Diverkañ',
'deletethispage' => 'Diverkañ ar bajenn-mañ',
+'undeletethispage' => 'Diziverkañ ar bajenn-mañ',
'undelete_short' => "Diziverkañ {{PLURAL:$1|ur c'hemm|$1 kemm}}",
'viewdeleted_short' => "Gwelet {{PLURAL:$1|ur c'hemm diverket|$1 kemm diverket}}",
'protect' => 'Gwareziñ',
@@ -412,7 +425,7 @@ $1',
'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).
+# 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).
'aboutsite' => 'Diwar-benn {{SITENAME}}',
'aboutpage' => 'Project:Diwar-benn',
'copyright' => "Danvez a c'haller implijout dindan $1.",
@@ -422,7 +435,6 @@ $1',
'disclaimers' => 'Kemennoù',
'disclaimerpage' => 'Project:Kemenn hollek',
'edithelp' => 'Skoazell',
-'edithelppage' => 'Help:Penaos kemmañ traoù er pennadoù',
'helppage' => 'Help:Skoazell',
'mainpage' => 'Degemer',
'mainpage-description' => 'Degemer',
@@ -499,16 +511,12 @@ Ur roll eus ar pajennoù dibar reizh a c'hallit kavour war [[Special:SpecialPage
# General errors
'error' => 'Fazi',
'databaseerror' => 'Fazi bank roadennoù',
-'dberrortext' => 'C\'hoarvezet ez eus ur fazi ereadur eus ar reked er bank roadennoù, ar pezh a c\'hall talvezout ez eus un draen er meziant.
-Setu ar goulenn bet pledet gantañ da ziwezhañ :
-<blockquote><code>$1</code></blockquote>
-adal an arc\'hwel "<code>$2</code>".
-Adkaset eo bet ar fazi "<samp>$3: $4</samp>" gant ar bank roadennoù.',
-'dberrortextcl' => 'Ur fazi ereadur zo en ur reked savet ouzh ar bank roadennoù.
-Setu ar goulenn bet pledet gantañ da ziwezhañ :
-"$1"
-adal an arc\'hwel "$2"
-Adkaset eo bet ar fazi "$3 : $4" gant ar bank roadennoù.',
+'databaseerror-text' => 'Ur fazi zo bet er reked diaz roadennoù.
+Marteze ez eus un draen er meziant.',
+'databaseerror-textcl' => 'Ur fazi zo bet er reked diaz roadennoù.',
+'databaseerror-query' => 'Reked : $1',
+'databaseerror-function' => "Arc'hwel : $1",
+'databaseerror-error' => 'Fazi : $1',
'laggedslavemode' => "Diwallit : marteze a-walc'h n'emañ ket ar c'hemmoù diwezhañ war ar bajenn-mañ",
'readonly' => 'Hizivadurioù stanket war ar bank roadennoù',
'enterlockreason' => 'Merkit perak eo stanket hag istimit pegeit e chomo evel-henn',
@@ -560,12 +568,15 @@ Goulenn : $2",
'viewyourtext' => "Gallout a rit gwelet hag eilañ mammenn ho '''kemmoù''' d'ar bajenn-mañ :",
'protectedinterface' => 'Testenn ar bajenn-mañ a dalvez evit etrefas ar meziant er wiki-mañ. Setu perak eo bet gwarezet ar bajenn.',
'editinginterface' => "'''Diwallit :''' Emaoc'h o kempenn ur bajenn a dalvez da sevel skridoù evit etrefas ar meziant. Ar c'hemmoù graet d'ar bajenn-mañ a cheñcho etrefas an holl implijerien. Mar fell deoc'h skoazellañ evit treiñ traoù, soñjit kentoc'h implijout [//translatewiki.net/wiki/Main_Page?setlang=br translatewiki.net], ar raktres evit lec'helaat MediaWiki.",
-'sqlhidden' => '(Reked SQL kuzhet)',
'cascadeprotected' => 'Gwarezet eo ar bajenn-mañ; n\'haller ket kemmañ anezhi ken p\'he c\'haver {{PLURAL:$1|er bajenn|e-mesk ar pajennoù}} da-heul zo bet gwarezet en ur zibab an dibarzh "skalierad" :
$2',
'namespaceprotected' => "N'oc'h ket aotreet da gemmañ pajennoù an esaouenn anv '''$1'''.",
'customcssprotected' => "N'oc'h ket aotreet da gemmañ ar bajenn CSS-mañ rak kavout a reer enni arventennoù personel un implijer all.",
'customjsprotected' => "N'oc'h ket aotreet da gemmañ ar bajenn JavaScript-mañ rak kavout a reer enni arventennoù personel un implijer all.",
+'mycustomcssprotected' => "N'oc'h ket aotreet da gemmañ d'ar bajenn CSS-mañ.",
+'mycustomjsprotected' => "N'oc'h ket aotreet da gemmañ d'ar bajenn JavaScript-mañ.",
+'myprivateinfoprotected' => "N'ho peus ket ar gwirioù evit kemmañ ho titouroù personel.",
+'mypreferencesprotected' => "N'ho peus ket ar gwirioù evit kemmañ ho Penndibaboù.",
'ns-specialprotected' => "N'haller ket kemmañ ar pajennoù en esaouenn anv {{ns:special}}.",
'titleprotected' => "Gwarezet eo bet an titl-mañ p'eo bet krouet gant [[User:$1|$1]].
Setu amañ perak ''$2''.",
@@ -590,10 +601,19 @@ Notit mat e c'hallo pajennoù zo kenderc'hel da vezañ diskwelet evel pa vefec'h
'welcomecreation-msg' => 'Krouet eo bet ho kont implijer.
Na zisoñjit ket resisaat ho [[Special:Preferences|penndibaboù evit {{SITENAME}}]].',
'yourname' => 'Anv implijer :',
+'userlogin-yourname' => 'Anv implijer',
+'userlogin-yourname-ph' => "Merkit hoc'h anv implijer",
+'createacct-another-username-ph' => 'Ebarzhiñ an anv implijer',
'yourpassword' => 'Ger-tremen :',
+'userlogin-yourpassword' => 'Ger-tremen',
+'userlogin-yourpassword-ph' => 'Merkit ho ker-tremen',
+'createacct-yourpassword-ph' => 'Skrivit ur ger-tremen',
'yourpasswordagain' => 'Skrivit ho ker-tremen en-dro',
+'createacct-yourpasswordagain' => 'Kadarnaat ar ger-tremen',
+'createacct-yourpasswordagain-ph' => 'Skrivit ar ger-tremen adarre',
'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',
+'userlogin-remembermypassword' => "Derc'hel ac'hanon kevreet",
+'userlogin-signwithsecure' => 'Implijout ur gevreadenn suraet',
'yourdomainname' => 'Ho tomani',
'password-change-forbidden' => "Ne c'hallit ket kemmañ ar gerioù-tremen er wiki-mañ.",
'externaldberror' => "Pe ez eus bet ur fazi gwiriekaat diavaez er bank titouroù pe n'oc'h ket aotreet da nevesaat ho kont diavaez.",
@@ -605,18 +625,41 @@ Na zisoñjit ket resisaat ho [[Special:Preferences|penndibaboù evit {{SITENAME}
'logout' => 'Digevreañ',
'userlogout' => 'Digevreañ',
'notloggedin' => 'Digevreet',
+'userlogin-noaccount' => "Kont ebet ganeoc'h c'hoazh ?",
+'userlogin-joinproject' => 'Kemer perzh e {{SITENAME}}',
'nologin' => "N'hoc'h eus kont ebet ? $1.",
'nologinlink' => 'Krouiñ ur gont',
'createaccount' => 'Krouiñ ur gont nevez',
'gotaccount' => "Ur gont zo ganeoc'h dija ? '''$1'''.",
'gotaccountlink' => 'Kevreañ',
'userlogin-resetlink' => "Ha disoñjet eo bet ho titouroù kevreañ ganeoc'h ?",
+'userlogin-resetpassword-link' => 'Adderaouekaat ho ker-tremen',
+'helplogin-url' => 'Help:Kevreañ',
+'userlogin-helplink' => '[[{{MediaWiki:helplogin-url}}|Skoazell evit kevreañ]]',
+'createacct-join' => 'Skrivit ho titouroù amañ dindan.',
+'createacct-another-join' => 'Ebarzhiñ titouroù ar gont nevez amañ dindan.',
+'createacct-emailrequired' => "Chomlec'h postel",
+'createacct-emailoptional' => "Chomlec'h postel (direizh)",
+'createacct-email-ph' => "Skrivit ho chomlec'h postel",
+'createacct-another-email-ph' => "Ebarzhiñ ur chomlec'h postel",
'createaccountmail' => 'Dre bostel',
+'createacct-realname' => 'Anv gwir (diret)',
'createaccountreason' => 'Abeg :',
+'createacct-reason' => 'Abeg',
+'createacct-reason-ph' => "Perak emaoc'h o krouiñ ur gont all",
+'createacct-captcha' => 'Kontroll surentez',
+'createacct-imgcaptcha-ph' => 'Ebarzhit an destenn a welit a-us',
+'createacct-submit' => 'Krouiñ ho kont',
+'createacct-another-submit' => 'Krouiñ ur gont all',
+'createacct-benefit-heading' => "{{SITENAME}} zo graet gant tud eveldoc'h.",
+'createacct-benefit-body1' => '$1 {{PLURAL:$1|kemm}}',
+'createacct-benefit-body2' => 'pajenn{{PLURAL:$1|}}',
+'createacct-benefit-body3' => "{{PLURAL:$1|c'henlabourer|kenlabourer}} nevez",
'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 gevreañ',
+'createacct-error' => "Ur fazi 'zo bet o krouiñ ar gont",
'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.",
@@ -673,10 +716,11 @@ Mat e vefe deoc\'h kevreañ ha cheñch ho ker-tremen bremañ.
Na daolit ket evezh ouzh ar c\'hemenn-mañ m\'eo bet krouet ar gont dre fazi.',
'usernamehasherror' => "N'haller ket ober gant an arouezenn # en anvioù an implijerien",
'login-throttled' => "Betek re oc'h heus klasket kevreañ en aner.
-Gortozit a-raok klask en-dro.",
+Gortozit $1, mar plij, a-raok esaeañ en-dro.",
'login-abort-generic' => 'Dibosupl ho kevreañ - Dilezet',
'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.',
+'createacct-another-realname-tip' => "Diret eo skrivañ hoc'h anv gwir. Ma skrivit anezhañ e vo implijet evit lakaat war wel ar pezh a vo bet degaset ganeoc'h.",
# Email sending
'php-mail-error-unknown' => "Fazi dianav en arc'hwel postel () PHP",
@@ -692,8 +736,7 @@ Gortozit a-raok klask en-dro.",
'newpassword' => 'Ger-tremen nevez :',
'retypenew' => 'Adskrivañ ar ger-tremen nevez :',
'resetpass_submit' => 'Cheñch ar ger-tremen ha kevreañ',
-'resetpass_success' => "Cheñchet eo bet ho ker-tremen.
-Kevreet e vioc'h bremañ...",
+'changepassword-success' => 'Cheñchet eo bet ho ker-tremen !',
'resetpass_forbidden' => "N'haller ket cheñch ar gerioù-termen",
'resetpass-no-info' => "Ret eo deoc'h bezañ kevreet a-benn mont d'ar bajenn-se war-eeun.",
'resetpass-submit-loggedin' => 'Cheñch ger-tremen',
@@ -704,10 +747,11 @@ Kevreet e vioc'h bremañ...",
# Special:PasswordReset
'passwordreset' => 'Adderaouekaat ar ger-tremen',
-'passwordreset-text' => 'Leuniañ ar furmskrid-mañ da adderaouekaat ho ker-tremen.',
+'passwordreset-text-one' => 'Leugnit ar furmskrid-mañ evit adderaouekaat ho ker-tremen.',
+'passwordreset-text-many' => '{{PLURAL:$1|Leugnit unan eus ar maeziennoù da adderaouekaat ho ker-tremen.}}',
'passwordreset-legend' => 'Adsevel ar ger-tremen',
'passwordreset-disabled' => 'Diweredekaet eo bet an adsevel gerioù-tremen war ar wiki-mañ.',
-'passwordreset-pretext' => '{{PLURAL:$1||Merkit unan eus an tammoù roadennoù dindan}}',
+'passwordreset-emaildisabled' => "Ne c'haller ket ober gant posteloù er wiki-mañ.",
'passwordreset-username' => 'Anv implijer :',
'passwordreset-domain' => 'Domani :',
'passwordreset-capture' => 'Gwelet ar postel ?',
@@ -744,6 +788,15 @@ Ger-tremen da c'hortoz : $2",
'changeemail-submit' => "Cheñch chomlec'h postel",
'changeemail-cancel' => 'Nullañ',
+# Special:ResetTokens
+'resettokens' => 'Adderaouekaat ar jedoueroù',
+'resettokens-no-tokens' => "N'eus jedouer ebet da adderaouekaat.",
+'resettokens-legend' => 'Adderaouekaat ar jedoureoù',
+'resettokens-tokens' => 'Jedoueroù :',
+'resettokens-token-label' => '$1 (talvoud bremañ : $2)',
+'resettokens-done' => 'Jedoueroù adderaouekaet.',
+'resettokens-resetbutton' => 'Adderaouekaat ar jedoueroù diuzet',
+
# Edit page toolbar
'bold_sample' => 'Testenn dev',
'bold_tip' => 'Testenn dev',
@@ -941,12 +994,15 @@ Abeg dianav.",
Diverket eo bet evit doare.',
'edit-conflict' => 'Tabut kemmañ.',
'edit-no-change' => "N'eo ket bet kemeret ho tegasadenn e kont rak ne oa ket bet kemmet netra en destenn.",
+'postedit-confirmation' => 'Enrollet eo bet ho kemmoù.',
'edit-already-exists' => "N'eus ket bet gallet krouiñ ur bajenn nevez.
Krouet e oa bet c'hoazh.",
'defaultmessagetext' => 'Testenn dre ziouer',
'content-failed-to-parse' => "C'hwitet eo dielfennadur endalc'had $2 evit ar patrom $1: $3",
'invalid-content-data' => "n'eo ket mat roadennoù an endalc'had",
'content-not-allowed-here' => 'N\'eo ket aotreet an endalc\'had "$1" er bajenn [[$2]]',
+'editwarning-warning' => "Mar kuitait ar bajenn-mañ e c'hallit koll ar c'hemmoù degaset ganeoc'h.
+Ma'z oc'h kevreet e c'hallit diweredekaat ar c'hemenn-diwall-mañ e rann \"Aozañ\" en ho penndibaboù.",
# Content models
'content-model-wikitext' => 'wikitestenn',
@@ -981,6 +1037,7 @@ A-gostez eo bet lezet an arventenn-se.',
'undo-failure' => "N'eus ket bet tu da zisteuler ar c'hemm-mañ abalamour d'un tabut gant kemmoù degaset e-keit-se.",
'undo-norev' => "N'eus ket bet gallet degas ar c'hemmoù-mañ rak pe n'eus ket anezho pe int bet diverket.",
'undo-summary' => 'Dizober kemmoù $1 a-berzh [[Special:Contributions/$2|$2]] ([[User talk:$2|kaozeal]])',
+'undo-summary-username-hidden' => 'Dizober ar reizhadenn $1 gant un implijer kuzhet',
# Account creation failure
'cantcreateaccounttitle' => 'Dibosupl krouiñ ar gont',
@@ -1158,6 +1215,7 @@ Gwiriit ne vo ket torret red istor ar bajenn gant ar c'hemm-mañ.",
'compareselectedversions' => 'Keñveriañ ar stummoù diuzet',
'showhideselectedversions' => 'Diskouez/Kuzhat ar stummoù diuzet',
'editundo' => 'dizober',
+'diff-empty' => '(Disheñvelder ebet)',
'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.)",
'difference-missing-revision' => "!!{{PLURAL:$2|Un adweladur|$2 adweladurioù}} eus an disheñvelder ($1) {{PLURAL:$2|n'eo ket bet kavet|n'int ket bet adkavet}}.
@@ -1185,7 +1243,6 @@ Gallout a reot kavout munudoù e [{{fullurl:{{#Special:Log}}/delete|page={{FULLP
'searchmenu-legend' => 'Dibarzhioù klask',
'searchmenu-exists' => "'''Ur bajenn anvet\"[[:\$1]]\" zo war ar wiki-mañ'''",
'searchmenu-new' => "'''Krouiñ ar bajenn \"[[:\$1]]\" war ar wiki-mañ !'''",
-'searchhelp-url' => 'Help:Skoazell',
'searchmenu-prefix' => '[[Special:PrefixIndex/$1|Furchal er pajennoù a grog gant ar rakger-mañ]]',
'searchprofile-articles' => 'Pajennoù gant boued',
'searchprofile-project' => 'Pajennoù skoazell ha pajennoù ar raktres',
@@ -1226,15 +1283,7 @@ Gallout a reot kavout munudoù e [{{fullurl:{{#Special:Log}}/delete|page={{FULLP
'powersearch-togglenone' => 'Hini ebet',
'search-external' => 'Klask diavaez',
'searchdisabled' => "<p>Diweredekaet eo bet an arc'hwel klask war an destenn a-bezh evit ur frapad rak ur samm re vras e oa evit ar servijer. Emichañs e vo tu d'e adlakaat pa vo ur servijer galloudusoc'h ganeomp. Da c'hortoz e c'hallit klask gant Google:</p>",
-
-# Quickbar
-'qbsettings' => 'Personelaat ar varrenn ostilhoù',
-'qbsettings-none' => 'Hini ebet',
-'qbsettings-fixedleft' => 'Kleiz',
-'qbsettings-fixedright' => 'Dehou',
-'qbsettings-floatingleft' => 'War-neuñv a-gleiz',
-'qbsettings-floatingright' => 'War-neuñv a-zehou',
-'qbsettings-directionality' => 'Difiñv, hervez an tu ma vez skrivet ho yezh',
+'search-error' => 'Ur fazi a zo bet e-ser klask : $1',
# Preferences page
'preferences' => 'Penndibaboù',
@@ -1268,7 +1317,6 @@ Gallout a reot kavout munudoù e [{{fullurl:{{#Special:Log}}/delete|page={{FULLP
'resetprefs' => 'Adlakaat ar penndibaboù kent',
'restoreprefs' => 'Adlakaat an holl arventennoù dre ziouer (en holl gevrennoù)',
'prefs-editing' => 'Prenestr skridaozañ',
-'prefs-edit-boxsize' => 'Ment ar prenestr skridaozañ.',
'rows' => 'Linennoù :',
'columns' => 'Bannoù',
'searchresultshead' => 'Klask',
@@ -1279,9 +1327,6 @@ Gallout a reot kavout munudoù e [{{fullurl:{{#Special:Log}}/delete|page={{FULLP
'recentchangesdays-max' => "D'ar muiañ $1 {{PLURAL:$1|deiz|deiz}}",
'recentchangescount' => 'Niver a gemmoù da ziskouez dre ziouer',
'prefs-help-recentchangescount' => "Kemer a ra an dra-mañ e kont ar c'hemmoù diwezhañ, istor ar pajennoù hag ar marilhoù.",
-'prefs-help-watchlist-token' => "Leuniañ ar c'hombod-mañ gant un dalvoudenn guzh a lakaio ul lanvad RSS war-sav evit ho rollad evezhiañ.
-Kement den hag a ouio eus ho jedouer a c'hallo lenn ho rollad evezhiañ, dibabit un dalvoudegezh suraet.
-Setu aze un dalvoudenn ganet dre zegouezh hag a c'hallfec'h implijout : $1",
'savedprefs' => 'Enrollet eo bet ar penndibaboù.',
'timezonelegend' => 'Takad eur :',
'localtime' => "Eur lec'hel :",
@@ -1311,7 +1356,6 @@ Setu aze un dalvoudenn ganet dre zegouezh hag a c'hallfec'h implijout : $1",
'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ñ',
'youremail' => 'Postel :',
'username' => '{{GENDER:$1|Anv implijer|Anv implijerez}}:',
'uid' => '{{GENDER:$1|Niv. identelezh an implijer|Niv. identelezh an implijerez}}:',
@@ -1344,6 +1388,8 @@ Ma skrivit anezhañ e vo implijet evit lakaat war wel ar pezh a vo bet degaset g
'prefs-dateformat' => 'Furmad an deiziadoù',
'prefs-timeoffset' => 'Linkadur eur',
'prefs-advancedediting' => 'Dibarzhioù araokaet',
+'prefs-editor' => 'Aozer',
+'prefs-preview' => 'Rakwelet',
'prefs-advancedrc' => 'Dibarzhioù araokaet',
'prefs-advancedrendering' => 'Dibarzhioù araokaet',
'prefs-advancedsearchoptions' => 'Dibarzhioù araokaet',
@@ -1351,7 +1397,9 @@ Ma skrivit anezhañ e vo implijet evit lakaat war wel ar pezh a vo bet degaset g
'prefs-displayrc' => 'Dibarzhioù diskwel',
'prefs-displaysearchoptions' => 'Dibarzhioù diskwel',
'prefs-displaywatchlist' => 'Dibarzhioù diskwel',
+'prefs-tokenwatchlist' => 'Jedouer',
'prefs-diffs' => "Diforc'hioù",
+'prefs-help-prefershttps' => "Efediñ a ray an dibarzh-mañ kentañ gwech ma kevreoc'h.",
# User preference: email validation using jQuery
'email-address-validity-valid' => "Reizh eo ar chomlec'h postel war a seblant",
@@ -1378,6 +1426,7 @@ Ma skrivit anezhañ e vo implijet evit lakaat war wel ar pezh a vo bet degaset g
'userrights-notallowed' => "N'oc'h ket aotreet da ouzhpennañ na da lemel gwirioù an implijerien.",
'userrights-changeable-col' => "Ar strolladoù a c'hallit cheñch",
'userrights-unchangeable-col' => "Ar strolladoù n'hallit ket cheñch",
+'userrights-removed-self' => "Lamet ho peus ho kwirioù deoc'h-c'hwi. Dre se ne c'hallit ket ken mont d'ar bajenn-mañ.",
# Groups
'group' => 'Strollad :',
@@ -1443,11 +1492,18 @@ Ma skrivit anezhañ e vo implijet evit lakaat war wel ar pezh a vo bet degaset g
'right-proxyunbannable' => 'Tremen dreist stankadennoù emgefre ar proksioù',
'right-unblockself' => 'En em zistankañ',
'right-protect' => 'Kemmañ live gwareziñ ar pajennoù ha kemmañ ar pajennoù gwarezet',
-'right-editprotected' => 'Kemmañ ar pajennoù gwarezet (hep gwarez dre skalierad)',
+'right-editprotected' => 'Aozañ ar pajennoù gwarezet evel "{{int:protect-level-sysop}}"',
+'right-editsemiprotected' => 'Aozañ ar pajennoù gwarezet evel "{{int:protect-level-autoconfirmed}}"',
'right-editinterface' => 'Kemmañ an etrefas implijer',
'right-editusercssjs' => 'Kemmañ restroù CSS ha JS implijerien all',
'right-editusercss' => 'Kemmañ restroù CSS implijerien all',
'right-edituserjs' => 'Kemmañ restroù JS implijerien all',
+'right-editmyusercss' => "Aozañ ho restroù implijer CSS deoc'h-c'hwi",
+'right-editmyuserjs' => "Aoazañ ho restroù JavaScript implijer deoc'h-c'hwi",
+'right-viewmywatchlist' => "Gwelet ho roll-evezhiañ deoc'h-c'hwi",
+'right-viewmyprivateinfo' => "Gwelet ho roadennoù prevez deoc'h-c'hwi (da sk. chomlec'h postel, anv gwirion)",
+'right-editmyprivateinfo' => "Aozañ ho roadennoù prevez deoc'h-c'hwi (da sk. chomlec'h postel, anv gwirion)",
+'right-editmyoptions' => 'Kemmañ ho penndibaboù',
'right-rollback' => 'Disteuler prim kemmoù an implijer diwezhañ kemmet gantañ ur bajenn resis',
'right-markbotedits' => "Merkañ ar c'hemmoù distaolet evel kemmoù bet graet gant robotoù.",
'right-noratelimit' => 'Na sell ket ar bevennoù feurioù outañ',
@@ -1509,12 +1565,19 @@ Ma skrivit anezhañ e vo implijet evit lakaat war wel ar pezh a vo bet degaset g
'action-userrights-interwiki' => 'Kemmañ gwirioù an implijerien war wikioù all',
'action-siteadmin' => 'Prennañ pe dibrennañ ar bank roadennoù',
'action-sendemail' => 'Kas posteloù',
+'action-editmywatchlist' => 'kemmañ ho roll evezhiañ',
+'action-viewmywatchlist' => 'gwelet ho roll evezhiañ',
+'action-viewmyprivateinfo' => 'Gwelet ho titouroù prevez',
+'action-editmyprivateinfo' => 'aozañ ho titouroù prevez',
# Recent changes
'nchanges' => '$1 {{PLURAL:$1|kemm|kemm}}',
+'enhancedrc-since-last-visit' => '$1 {{PLURAL:$1|abaoe ho kweladenn diwezhañ}}',
+'enhancedrc-history' => 'istor',
'recentchanges' => 'Kemmoù diwezhañ',
'recentchanges-legend' => "Dibarzhioù ar c'hemmoù diwezhañ",
'recentchanges-summary' => "Dre ar bajenn-mañ e c'hallit heuliañ ar c'hemmoù diwezhañ bet degaset d'ar wiki.",
+'recentchanges-noresult' => "N'eus bet kemm ebet a glot gant an dezverkoù-se e-pad ar prantad diferet.",
'recentchanges-feed-description' => "Heuilhit ar c'hemmoù diwezhañ er wiki el lusk-mañ.",
'recentchanges-label-newpage' => "Gant ar c'hemm-mañ e vo krouet ur bajenn nevez.",
'recentchanges-label-minor' => "Ur c'hemm dister eo hemañ",
@@ -1551,7 +1614,6 @@ Ma skrivit anezhañ e vo implijet evit lakaat war wel ar pezh a vo bet degaset g
'recentchangeslinked-feed' => 'Heuliañ ar pajennoù liammet',
'recentchangeslinked-toolbox' => 'Heuliañ ar pajennoù liammet',
'recentchangeslinked-title' => 'Kemmoù a denn da "$1"',
-'recentchangeslinked-noresult' => 'Kemm ebet war ar pajennoù liammet e-pad an amzer spisaet.',
'recentchangeslinked-summary' => "Rollet eo war ar bajenn dibar-mañ ar c'hemmoù diwezhañ bet degaset war ar pajennoù liammet ouzh ur bajenn lakaet (pe ouzh izili ur rummad lakaet).
E '''tev''' emañ ar pajennoù zo war ho [[Special:Watchlist|roll evezhiañ]].",
'recentchangeslinked-page' => 'Anv ar bajenn :',
@@ -1563,7 +1625,7 @@ E '''tev''' emañ ar pajennoù zo war ho [[Special:Watchlist|roll evezhiañ]].",
'reuploaddesc' => "Distreiñ d'ar furmskrid.",
'upload-tryagain' => 'Kas deskrivadur ar restr kemmet',
'uploadnologin' => 'Digevreet',
-'uploadnologintext' => "Ret eo deoc'h bezañ [[Special:UserLogin|kevreetet]] a-benn gellout enporzhiañ restroù war ar servijer.",
+'uploadnologintext' => "Ret eo deoc'h $1 evit gallout enporzhiañ restroù war ar servijer.",
'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 enporzhiañ',
@@ -1790,7 +1852,6 @@ Diweredekaet eo bet img_auth.php evit ur surentez eus ar gwellañ",
'http-read-error' => 'Fazi lenn HTTP.',
'http-timed-out' => 'Erru eo termen ar reked HTTP.',
'http-curl-error' => 'Fazi adtapout an URL : $1',
-'http-host-unreachable' => "N'eus ket bet gallet tizhout an URL.",
'http-bad-status' => 'Ur gudenn a zo bet e-pad ar reked HTTP : $1 $2',
# Some likely curl errors. More could be added from <http://curl.haxx.se/libcurl/c/libcurl-errors.html>
@@ -1818,6 +1879,10 @@ Diweredekaet eo bet img_auth.php evit ur surentez eus ar gwellañ",
'listfiles_size' => 'Ment (e bitoù)',
'listfiles_description' => 'Deskrivadur',
'listfiles_count' => 'Stummoù',
+'listfiles-show-all' => 'Stummoù kozh eus skeudennoù e-barzh',
+'listfiles-latestversion' => 'Stumm diwezhañ',
+'listfiles-latestversion-yes' => 'Ya',
+'listfiles-latestversion-no' => 'Ket',
# File description page
'file-anchor-link' => 'Skeudenn',
@@ -1912,6 +1977,13 @@ Marteze a-walc'h e fell deoc'h kemmañ an deskrivadur anezhi war ar [$2 bajenn d
'randompage' => 'Ur bajenn dre zegouezh',
'randompage-nopages' => 'N\'eus pajenn ebet en {{PLURAL:$2|esaouennn anv|esaouennoù anv}} da-heul : "$1".',
+# Random page in category
+'randomincategory' => 'Ur bajenn dre zegouezh er rummad',
+'randomincategory-invalidcategory' => '"$1" n\'eo ket un anv rummad reizh.',
+'randomincategory-nopages' => "N'eus pajenn ebet e [[:Category:$1]].",
+'randomincategory-selectcategory' => 'Tapout ur bajenn dre zegouezh eus ar rummad : $1 $2.',
+'randomincategory-selectcategory-submit' => 'Mont',
+
# Random redirect
'randomredirect' => 'Ur bajenn adkas dre zegouezh',
'randomredirect-nopages' => 'N\'eus pajenn adkas ebet en esaouenn anv "$1".',
@@ -1937,12 +2009,6 @@ Marteze a-walc'h e fell deoc'h kemmañ an deskrivadur anezhi war ar [$2 bajenn d
'statistics-users-active-desc' => "Implijerien o deus degaset da nebeutañ ur c'hemm {{PLURAL:$1|an deiz paseet|e-kerzh an $1 deiz diwezhañ}}",
'statistics-mostpopular' => 'Pajennoù muiañ sellet',
-'disambiguations' => 'Pajennoù enno liammoù war-zu pajennoù disheñvelout',
-'disambiguationspage' => 'Template:Disheñvelout',
-'disambiguations-text' => "Liammet eo ar pajennoù da-heul ouzh ur '''bajenn disheñvelout'''.
-Padal e tlefent kas war-eeun d'an danvez anezho.<br />
-Sellet e vez ouzh ur bajenn evel ouzh ur bajenn disheñvelout ma ra gant ur patrom liammet ouzh [[MediaWiki:Disambiguationspage]]",
-
'pageswithprop' => 'Pajennoù gant ur perzh pajenn',
'pageswithprop-legend' => 'Pajennoù gant ur perzh pajenn',
'pageswithprop-prop' => 'Anv ar perzh :',
@@ -2005,6 +2071,7 @@ $1 {{PLURAL:$1|rummad|rummad}}',
'mostrevisions' => 'Pennadoù bet kemmet ar muiañ',
'prefixindex' => 'An holl bajennoù a grog gant...',
'prefixindex-namespace' => 'An holl bajennoù enno ur rakger (esaouenn anv $1)',
+'prefixindex-strip' => 'Lemel ar rakger er roll',
'shortpages' => 'Pennadoù berr',
'longpages' => 'Pennadoù hir',
'deadendpages' => 'Pajennoù dall (hep liamm diabarzh)',
@@ -2200,10 +2267,9 @@ Amañ e vo rollet ar c\'hemmoù da zont evit ar bajenn-mañ hag ar bajenn gaozea
'unwatchthispage' => 'Paouez da evezhiañ',
'notanarticle' => 'Pennad ebet',
'notvisiblerev' => 'Stumm diverket',
-'watchnochange' => "N'ez eus elfenn ebet eus ar re evezhiet ganeoc'h a zo bet kemmet e-pad ar prantad spisaet",
'watchlist-details' => "Lakaet hoc'h eus {{PLURAL:$1|$1 bajenn|$1 pajenn}} dindan evezh, anez kontañ ar pajennoù kaozeal.",
-'wlheader-enotif' => "* War enaou emañ ar c'has posteloù.",
-'wlheader-showupdated' => "* E '''tev''' emañ merket ar pajennoù bet kemmet abaoe ar wezh ziwezhañ hoc'h eus sellet outo",
+'wlheader-enotif' => "Gweredekaet eo ar c'has posteloù.",
+'wlheader-showupdated' => "E '''tev''' emañ merket ar pajennoù bet kemmet abaoe ar wezh ziwezhañ hoc'h eus sellet outo",
'watchmethod-recent' => "Gwiriañ ar c'hemmoù diwezhañ er pajennoù dindan evezh",
'watchmethod-list' => "Gwiriañ ar c'hemmoù diwezhañ evit ar pajennoù evezhiet",
'watchlistcontains' => '$1 {{PLURAL:$1|pajenn|pajenn}} zo en ho rollad evezhiañ',
@@ -2451,7 +2517,7 @@ $1',
'contributions' => 'Degasadennoù an {{GENDER:$1|implijer|implijerez}}',
'contributions-title' => 'Degasadennoù an implijer evit $1',
'mycontris' => 'Ma degasadennoù',
-'contribsub2' => 'Evit $1 ($2)',
+'contribsub2' => 'Evit {{GENDER:$3|$1}} ($2)',
'nocontribs' => "N'eus bet kavet kemm ebet o klotañ gant an dezverkoù-se.",
'uctop' => '(red)',
'month' => 'Abaoe miz (hag a-raok) :',
@@ -2604,11 +2670,8 @@ Setu aze an abeg(où) m\'eo bet stanket $1 : "\'\'$2\'\'"',
'ipb_blocked_as_range' => "Fazi : N'eo ket bet stanket ar chomlec'h IP $1 war-eeun, setu n'hall ket bezañ distanket. Stanket eo bet dre al live $2 avat, hag a c'hall bezañ distanket.",
'ip_range_invalid' => 'Stankañ IP direizh.',
'ip_range_toolarge' => "N'eo ket aotreet stankañ pajennoù brasoc'h evit /$1.",
-'blockme' => "Stankit ac'hanon",
'proxyblocker' => 'Stanker proksi',
-'proxyblocker-disabled' => "Diweredekaet eo an arc'hwel-mañ.",
'proxyblockreason' => "Stanket eo bet hoc'h IP rak ur proksi digor eo. Trugarez da gelaouiñ ho pourvezer moned ouzh ar Genrouedad pe ho skoazell deknikel eus ar gudenn surentez-mañ.",
-'proxyblocksuccess' => 'Echu.',
'sorbsreason' => "Rollet eo ho chomlec'h IP evel ur proksi digor en DNSBL implijet gant {{SITENAME}}.",
'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.",
@@ -2773,6 +2836,7 @@ Kit da welet [//www.mediawiki.org/wiki/Localisation Lec'heladur MediaWiki] ha [/
'thumbnail-more' => 'Brasaat',
'filemissing' => 'Restr ezvezant',
'thumbnail_error' => 'Fazi e-ser krouiñ an alberz : $1',
+'thumbnail_error_remote' => 'Kemennadenn fazi gant $1 : $2',
'djvu_page_error' => 'Pajenn DjVu er-maez ar bevennoù',
'djvu_no_xml' => 'Dibosupl da dapout an XML evit ar restr DjVu',
'thumbnail-temp-create' => 'Dibosupl krouiñ ur restr vunut padennek',
@@ -2921,17 +2985,11 @@ Talvezout a ra da ouzhpennañ un displegadenn er c\'hombod diverrañ.',
# Stylesheets
'common.css' => '/** Talvezout a raio ar CSS lakaet amañ evit an holl wiskadurioù */',
-'standard.css' => '/* Talvezout a raio ar CSS lakaet amañ evit implijerien ar gwiskadur Standard */',
-'nostalgia.css' => '/* Talvezout a raio ar CSS lakaet amañ evit implijerien ar gwiskadur Melkoni */',
'cologneblue.css' => '/* Talvezout a raio ar CSS lakaet amañ evit implijerien ar gwiskadur Glaz Kologn */',
'monobook.css' => '/* Talvezout a raio ar CSS lakaet amañ evit implijerien ar gwiskadur Monobook */',
-'myskin.css' => '/* Talvezout a raio ar CSS lakaet amañ evit implijerien ar gwiskadur MySkin */',
-'chick.css' => '/* Talvezout a raio ar CSS lakaet amañ evit implijerien ar gwiskadur Plogig */',
-'simple.css' => '/* Talvezout a raio ar CSS lakaet amañ implijerien ar gwiskadur Eeun */',
'modern.css' => '/* Talvezout a raio ar CSS lakaet amañ evit implijerien ar gwiskadur Modern */',
'vector.css' => '/* Talvezout a raio ar CSS lakaet amañ evit implijerien ar gwiskadur Vektor */',
'print.css' => '/* Talvezout a raio ar CSS lakaet amañ evit ar moullañ */',
-'handheld.css' => '/* Talvezout a raio ar CSS lakaet amañ evit an ardivinkoù hezoug diouzh ar gwiskadur kefluniet e $wgHandheldStyle */',
'noscript.css' => '/* Talvezout a raio ar CSS lakaet amañ evit an implijerien o deus diweredekaet JavaScript */',
'group-autoconfirmed.css' => '/* Talvezout a raio ar CSS lakaet amañ evit an impjerien bet kadarnaet ent emgefre hepken */',
'group-bot.css' => '/* Talvezout a raio ar CSS lakaet amañ evit ar robotoù hepken */',
@@ -2940,13 +2998,8 @@ Talvezout a ra da ouzhpennañ un displegadenn er c\'hombod diverrañ.',
# Scripts
'common.js' => '/* Kement JavaScript amañ a vo karget evit an holl implijerien war kement pajenn lennet ganto. */',
-'standard.js' => '/* Kement JavaScript amañ a vo karget evit an implijerien a ra gant ar gwiskadur Standard */',
-'nostalgia.js' => '/* Kement JavaScript amañ a vo karget evit an implijerien a ra gant ar gwiskadur Melkoni */',
'cologneblue.js' => '/* Kement JavaScript amañ a vo karget evit an implijerien a ra gant ar gwiskadur Glaz Kologn */',
'monobook.js' => '/* Kement JavaScript amañ a vo karget evit an implijerien a ra gant ar gwiskadur MonoBook */',
-'myskin.js' => '/* Kement JavaScript amañ a vo karget evit an implijerien a ra gant ar gwiskadur MySkin */',
-'chick.js' => '/* Kement JavaScript amañ a vo karget evit an implijerien a ra gant ar gwiskadur Plogig */',
-'simple.js' => '/* Kement JavaScript amañ a vo karget evit an implijerien a ra gant ar gwiskadur Eeun */',
'modern.js' => '/* Kement JavaScript amañ a vo karget evit an implijerien a ra gant ar gwiskadur Modern */',
'vector.js' => '/* Kement JavaScript amañ a vo karget evit an implijerien a ra gant ar gwiskadur Vektor */',
@@ -3019,13 +3072,8 @@ Sur a-walc'h abalamour d'ul liamm enni a gas d'ul lec'hienn ziavaez berzet.",
'pageinfo-category-files' => 'Niver a restroù',
# Skin names
-'skinname-standard' => 'Standard',
-'skinname-nostalgia' => 'Melkoni',
'skinname-cologneblue' => 'Glaz Kologn',
'skinname-monobook' => 'MonoBook',
-'skinname-myskin' => 'MySkin',
-'skinname-chick' => 'Plogig',
-'skinname-simple' => 'Eeun',
'skinname-modern' => 'Modern',
'skinname-vector' => 'Vektor',
@@ -3103,11 +3151,25 @@ Ma vez erounezet ganeoc'h e c'hallje tagañ ho reizhiad.",
'minutes' => '{{PLURAL:$1|$1 vunutenn|$1 munutenn}}',
'hours' => '{{PLURAL:$1|$1 eurvezh|$1 eurvezh}}',
'days' => '{{PLURAL:$1|$1 deiz|$1 deiz}}',
+'weeks' => '{{PLURAL:$1|$1 sizhun}}',
'months' => '{{PLURAL:$1|$1 miz}}',
'years' => '{{PLURAL:$1|$1 bloaz|$1 vloaz}}',
'ago' => '$1 zo',
'just-now' => 'bremañ diouzhtu',
+# Human-readable timestamps
+'hours-ago' => '$1 {{PLURAL:$1|eur}} zo',
+'minutes-ago' => '$1 {{PLURAL:$1|vunutenn|munut}} zo',
+'seconds-ago' => '$1 {{PLURAL:$1|eiladenn}} zo',
+'monday-at' => 'Dilun da $1',
+'tuesday-at' => 'Dimeurzh da $1',
+'wednesday-at' => "Dimerc'her da $1",
+'thursday-at' => 'Diriaou da $1',
+'friday-at' => 'Digwener da $1',
+'saturday-at' => 'Disadorn da $1',
+'sunday-at' => 'Disul da $1',
+'yesterday-at' => "Dec'h da $1",
+
# Bad image list
'bad_image_list' => "Setu doare ar furmad :
@@ -3135,7 +3197,7 @@ Kuzhet e vo ar re all dre ziouer.
* gpslongitude
* gpsaltitude",
-# EXIF tags
+# Exif tags
'exif-imagewidth' => 'Ledander',
'exif-imagelength' => 'Hed',
'exif-bitspersample' => 'Niv. a vitoù dre barzhioù',
@@ -3313,7 +3375,7 @@ Kuzhet e vo ar re all dre ziouer.
'exif-originalimageheight' => 'Sav ar skeudenn a-raok na vije bet krennet',
'exif-originalimagewidth' => 'Ledander ar skeudenn a-raok na vije bet krennet',
-# EXIF attributes
+# Exif attributes
'exif-compression-1' => 'Hep gwaskañ',
'exif-compression-2' => 'CCITT Strollad 3 1 Hirder kodañ Huffman kemmet a vent 1',
'exif-compression-3' => 'CCITT Strollad 3 kodañ ar pelleiler',
@@ -3723,7 +3785,6 @@ Gallout a rit [[Special:EditWatchlist|implijout an aozer boutin ivez]].',
'version-other' => 'Diseurt',
'version-mediahandlers' => 'Merer danvez liesvedia',
'version-hooks' => 'Galvoù',
-'version-extension-functions' => "Arc'hwelioù an astennoù",
'version-parser-extensiontags' => 'Balizenn dielfennañ o tont eus an astennoù',
'version-parser-function-hooks' => "Galv an arc'hwelioù dielfennañ",
'version-hook-name' => 'Anv ar galv',
@@ -3732,6 +3793,7 @@ Gallout a rit [[Special:EditWatchlist|implijout an aozer boutin ivez]].',
'version-license' => 'Aotre-implijout',
'version-poweredby-credits' => "Mont a ra ar wiki-mañ en-dro a-drugarez da '''[//www.mediawiki.org/ MediaWiki]''', copyright © 2001-$1 $2.",
'version-poweredby-others' => 're all',
+'version-poweredby-translators' => 'troerien translatewiki.net',
'version-credits-summary' => 'Karout a rafemp trugarekaat an dud-mañ evit ho kenlabour e [[Special:Version|MediaWiki]].',
'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.
@@ -3745,12 +3807,15 @@ Sañset oc'h bezañ resevet [{{SERVER}}{{SCRIPTPATH}}/COPYING un eilskrid eus ar
'version-entrypoints-header-entrypoint' => 'Poent mont e-barzh',
'version-entrypoints-header-url' => 'URL',
-# Special:FilePath
-'filepath' => 'Hent moned ur restr',
-'filepath-page' => 'Restr :',
-'filepath-submit' => 'Mont',
-'filepath-summary' => 'Diskouez a ra ar bajenn-mañ hent moned klok ur restr.
-Diskouezet eo ar skeudennoù gant ur pizhder uhel, erounit a ra ar restroù all war-eeun gant o frogramm stag.',
+# Special:Redirect
+'redirect-legend' => "Adkas d'ur restr pe d'ur bajenn",
+'redirect-submit' => 'Mont',
+'redirect-lookup' => 'Klask :',
+'redirect-value' => 'Talvoud :',
+'redirect-user' => 'ID an implijer',
+'redirect-revision' => 'Adwel ar bajenn',
+'redirect-file' => 'Anv ar restr',
+'redirect-not-exists' => "Talvoud n'eo ket bet kavet",
# Special:FileDuplicateSearch
'fileduplicatesearch' => 'Klask ar restroù e doubl',
@@ -3805,7 +3870,10 @@ Diskouezet eo ar skeudennoù gant ur pizhder uhel, erounit a ra ar restroù all
'tags-tag' => 'Anv ar valizenn',
'tags-display-header' => "Neuz e rolloù ar c'hemmoù",
'tags-description-header' => 'Deskrivadur klok ar valizenn',
+'tags-active-header' => 'Oberiant ?',
'tags-hitcount-header' => 'Kemmoù balizennet',
+'tags-active-yes' => 'Ya',
+'tags-active-no' => 'Ket',
'tags-edit' => 'aozañ',
'tags-hitcount' => '$1 {{PLURAL:$1|kemm|kemm}}',
@@ -3826,6 +3894,7 @@ Diskouezet eo ar skeudennoù gant ur pizhder uhel, erounit a ra ar restroù all
'dberr-problems' => "Ho tigarez ! Kudennoù teknikel zo gant al lec'hienn-mañ.",
'dberr-again' => 'Gortozit un nebeud munutennoù a-raok adkargañ.',
'dberr-info' => '(Dibosupl kevreañ ouzh servijer an diaz roadennoù: $1)',
+'dberr-info-hidden' => "(Ne c'haller ket mont da servijer an diaz roadennoù)",
'dberr-usegoogle' => "E-keit-se esaeit klask dre c'hGoogle.",
'dberr-outofdate' => "Notit mat e c'hall o menegerioù dezho bezañ dispredet e-keñver ar boued zo ganeomp.",
'dberr-cachederror' => 'Un eilstumm memoret eus ar bajenn goulennet eo hemañ, gallout a ra bezañ dispredet.',
@@ -3841,6 +3910,9 @@ Diskouezet eo ar skeudennoù gant ur pizhder uhel, erounit a ra ar restroù all
'htmlform-submit' => 'Kas',
'htmlform-reset' => "Dizober ar c'hemmoù",
'htmlform-selectorother-other' => 'Unan all',
+'htmlform-no' => 'Ket',
+'htmlform-yes' => 'Ya',
+'htmlform-chosen-placeholder' => 'Diuzañ un dibarzh',
# SQLite database support
'sqlite-has-fts' => '$1 gant enklask eus an destenn a-bezh embreget',
@@ -3953,4 +4025,13 @@ A-hend-all e c'hallit ober gant ar furmskrid eeunaet dindan. Ouzhpennet e vo hoc
'duration-centuries' => "$1 {{PLURAL:$1|c'hantved|kantved}}",
'duration-millennia' => '$1 {{PLURAL:$1|milvloaz|milvoaz}}',
+# Limit report
+'limitreport-cputime' => 'Amzer implij ar CPU',
+'limitreport-cputime-value' => '$1 {{PLURAL:$1|eiladenn}}',
+'limitreport-walltime' => 'Amzer implij gwirion',
+'limitreport-walltime-value' => '$1 {{PLURAL:$1|eiladenn}}',
+'limitreport-postexpandincludesize-value' => '$1/$2 {{PLURAL:$2|okted}}',
+'limitreport-templateargumentsize' => 'Ment arguzenn ar patrom',
+'limitreport-templateargumentsize-value' => '$1/$2 {{PLURAL:$2|okted}}',
+
);
diff --git a/languages/messages/MessagesBrh.php b/languages/messages/MessagesBrh.php
index 78ac968a..089112cd 100644
--- a/languages/messages/MessagesBrh.php
+++ b/languages/messages/MessagesBrh.php
@@ -8,7 +8,6 @@
* @file
*
* @author Imdadb
- * @author Southparkfan
*/
$messages = array(
@@ -114,7 +113,6 @@ $messages = array(
'delete' => 'Mesa',
'protect' => 'Rakk',
'protect_change' => 'badal kar',
-'protectthispage' => '',
'newpage' => 'Púskuno panna',
'talkpage' => 'Dá panna ná bárav aŧ ítgap kabo',
'talkpagelinktext' => 'Ãtgap',
diff --git a/languages/messages/MessagesBs.php b/languages/messages/MessagesBs.php
index d1c100d2..0db0d0c4 100644
--- a/languages/messages/MessagesBs.php
+++ b/languages/messages/MessagesBs.php
@@ -17,6 +17,7 @@
* @author Kaganer
* @author Kal-El
* @author Malafaya
+ * @author Nemo bis
* @author Palapa
* @author Seha
* @author Smooth O
@@ -309,9 +310,6 @@ $messages = array(
'tog-shownumberswatching' => 'Prikaži broj korisnika koji prate',
'tog-oldsig' => 'Postojeći potpis:',
'tog-fancysig' => 'Smatraj potpis kao wikitekst (bez automatskog linka)',
-'tog-externaleditor' => 'Koristi vanjski program za ureÄ‘ivanje po postavkama (samo za naprednije korisnike, potrebne su posebne postavke na vaÅ¡em raÄunaru)',
-'tog-externaldiff' => 'Koristi vanjski (diff) program po pretpostavljenom za prikaz razlika (samo za naprednije korisnike, potrebne su posebne postavke na vaÅ¡em raÄunaru)',
-'tog-showjumplinks' => 'Omogući "skoÄi na" linkove',
'tog-uselivepreview' => 'Koristite pregled uživo (eksperimentalno)',
'tog-forceeditsummary' => 'Opomeni me pri unosu praznog sažetka',
'tog-watchlisthideown' => 'Sakrij moje izmjene sa spiska praćenih Älanaka',
@@ -325,6 +323,8 @@ $messages = array(
'tog-showhiddencats' => 'Prikaži skrivene kategorije',
'tog-noconvertlink' => 'Onemogući konverziju naslova linkova',
'tog-norollbackdiff' => 'Nakon vraćanja zanemari prikaz razlika',
+'tog-useeditwarning' => 'Upozori me kada napustim stranicu za izmjene bez spašenih promjena',
+'tog-prefershttps' => 'Uvijek koristi sigurnu konekciju kada sam prijavljen.',
'underline-always' => 'Uvijek',
'underline-never' => 'Nikad',
@@ -388,6 +388,18 @@ $messages = array(
'oct' => 'okt',
'nov' => 'nov',
'dec' => 'dec',
+'january-date' => '$1. januar',
+'february-date' => '$1. februar',
+'march-date' => '$1. mart',
+'april-date' => '$1. april',
+'may-date' => '$1. maj',
+'june-date' => '$1. juni',
+'july-date' => '$1. juli',
+'august-date' => '$1. august',
+'september-date' => '$1. septembar',
+'october-date' => '$1. oktobar',
+'november-date' => '$1. novembar',
+'december-date' => '$1. decembar',
# Categories related messages
'pagecategories' => '{{PLURAL:$1|Kategorija|Kategorije}}',
@@ -469,6 +481,7 @@ $messages = array(
'create-this-page' => 'Napravi ovu stranicu',
'delete' => 'Obriši',
'deletethispage' => 'Obriši ovu stranicu',
+'undeletethispage' => 'Povrati ovu stranicu',
'undelete_short' => 'Vrati obrisanih {{PLURAL:$1|$1 izmjenu|$1 izmjene|$1 izmjena}}',
'viewdeleted_short' => 'Pogledaj {{PLURAL:$1|jednu obrisanu izmjenu|$1 obrisane izmjene|$1 obrisanih izmjena}}',
'protect' => 'Zaštitite',
@@ -512,7 +525,7 @@ $1',
'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).
+# 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).
'aboutsite' => 'O projektu {{SITENAME}}',
'aboutpage' => 'Project:O_projektu_{{SITENAME}}',
'copyright' => 'Svi sadržaji podliježu "$1" licenci.',
@@ -522,7 +535,6 @@ $1',
'disclaimers' => 'Odricanje odgovornosti',
'disclaimerpage' => 'Project:Uslovi korištenja, pravne napomene i odricanje odgovornosti',
'edithelp' => 'Pomoć pri uređivanju stranice',
-'edithelppage' => 'Help:Uređivanje',
'helppage' => 'Help:Sadržaj',
'mainpage' => 'PoÄetna strana',
'mainpage-description' => 'PoÄetna strana',
@@ -550,7 +562,6 @@ $1',
'newmessagesdifflinkplural' => '{{PLURAL:$1|posljednja izmjena|posljednje izmjene}}',
'youhavenewmessagesmulti' => 'Imate nove poruke na $1',
'editsection' => 'uredi',
-'editsection-brackets' => '[$1]',
'editold' => 'uredi',
'viewsourceold' => 'pogledaj izvor',
'editlink' => 'uredi',
@@ -600,15 +611,8 @@ Spisak valjanih posebnih stranica se može naći na [[Special:SpecialPages|{{int
# General errors
'error' => 'Greška',
'databaseerror' => 'Greška u bazi',
-'dberrortext' => 'Desila je se sintaksna greška kod upita prema bazi podataka.
-Ovo je se desilo zbog moguće greške u softveru.
-Posljednji pokušani upit je bio: <blockquote><code>$1</code></blockquote> iz funkcije "<code>$2</code>".
-Baza podataka je vratila grešku "<samp>$3: $4</samp>".',
-'dberrortextcl' => 'Desila se sintaksna greška upita baze.
-Posljednji pokušani upit je bio:
-"$1"
-iz funkcije "$2".
-Baza podataka je vratila grešku "$3: $4".',
+'databaseerror-function' => 'Funkcija: $1',
+'databaseerror-error' => 'Greška: $1',
'laggedslavemode' => "'''Upozorenje''': Stranica, možda, nije ažurirana.",
'readonly' => 'Baza je zakljuÄana',
'enterlockreason' => 'Unesite razlog za zakljuÄavanje, ukljuÄujući procjenu vremena otkljuÄavanja',
@@ -664,12 +668,15 @@ Da biste dodali ili izmjenili prijevode svih wikija, posjetite [//translatewiki.
'editinginterface' => "'''Upozorenje:''' Mijenjate stranicu koja sadrži aktivan tekst programa.
Promjene na ovoj stranici dovode i do promjena za druge korisnike ovog wikija.
Za dodavanje ili promjene prijevoda svih wikija, molimo Vas koristite [//translatewiki.net/ translatewiki.net], projekt prijevoda za MediaWiki.",
-'sqlhidden' => '(SQL pretraga sakrivena)',
'cascadeprotected' => 'Uređivanje ove stranice je zabranjeno jer sadrži {{PLURAL:$1|stranicu zaštićenu|stranice zaštićene}} od uređivanja iz razloga:
$2',
'namespaceprotected' => "Vi nemate dozvulu da mijenjate stranicu '''$1'''.",
'customcssprotected' => 'Nemate dozvolu za mijenjanje ove CSS stranice jer sadrži osobne postavke nekog drugog korisnika.',
'customjsprotected' => 'Nemate dozvolu za mijenjanje ove JavaScript stranice jer sadrži osobne postavke nekog drugog korisnika.',
+'mycustomcssprotected' => 'Nemate dozvolu da uređujete ovu CSS stranicu.',
+'mycustomjsprotected' => 'Nemate dozvolu da uređujete ovu stranicu sa JavaScriptom.',
+'myprivateinfoprotected' => 'Nemate dozvolu da uređujete svoje privatne informacije.',
+'mypreferencesprotected' => 'Nemate dozvolu da uređujete svoje postavke.',
'ns-specialprotected' => 'Specijalne stranice se ne mogu uređivati.',
'titleprotected' => 'Naslov stranice je zaštićen od postavljanja od strane korisnika [[User:$1|$1]].
Iz razloga "\'\'$2\'\'".',
@@ -691,10 +698,19 @@ Obratite pažnju da neke stranice mogu nastaviti da se prikazuju kao da ste još
'welcomecreation-msg' => 'Vaš nalog je napravljen.
Ne zaboravite da prilagodite sebi svoja [[Special:Preferences|{{SITENAME}} podešavanja]].',
'yourname' => 'KorisniÄko ime:',
+'userlogin-yourname' => 'KorisniÄko ime',
+'userlogin-yourname-ph' => 'Unesite VaÅ¡e korisniÄko ime',
+'createacct-another-username-ph' => 'Unesite korisniÄko ime',
'yourpassword' => 'Å ifra:',
+'userlogin-yourpassword' => 'Å ifra',
+'userlogin-yourpassword-ph' => 'Unesite Vašu šifru/lozinku',
+'createacct-yourpassword-ph' => 'Unesite Å¡ifru/lozinku',
'yourpasswordagain' => 'Ponovite Å¡ifru:',
+'createacct-yourpasswordagain' => 'Potvrdite Å¡ifru/lozinku',
+'createacct-yourpasswordagain-ph' => 'Unesite Å¡ifru/lozinku opet',
'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',
+'userlogin-remembermypassword' => 'Ostavi me prijavljen',
+'userlogin-signwithsecure' => 'Koristite sigurnu konekciju',
'yourdomainname' => 'Vaš domen:',
'password-change-forbidden' => 'Ne možete da promjenite lozinku na ovom wikiju.',
'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.',
@@ -706,14 +722,37 @@ Ne zaboravite da prilagodite sebi svoja [[Special:Preferences|{{SITENAME}} podeÅ
'logout' => 'Odjavi me',
'userlogout' => 'Odjavi me',
'notloggedin' => 'Niste prijavljeni',
+'userlogin-noaccount' => 'Nemate korisniÄki raÄun?',
+'userlogin-joinproject' => 'Pridružite se {{GRAMMAR:dativ|{{SITENAME}}}}',
'nologin' => 'Nemate korisniÄko ime? $1.',
'nologinlink' => 'Napravite nalog',
'createaccount' => 'Napravi korisniÄki raÄun',
'gotaccount' => 'Već imate korisniÄki raÄun? $1.',
'gotaccountlink' => 'Prijavi se',
'userlogin-resetlink' => 'Zaboravili ste detalje vaše prijave?',
+'userlogin-resetpassword-link' => 'Resetirajte svoju Å¡ifru/lozinku',
+'helplogin-url' => 'Help:Prijavljivanje',
+'userlogin-helplink' => '[[{{MediaWiki:helplogin-url}}|Pomoć pri prijavljivanju]]',
+'userlogin-createanother' => 'Napravi joÅ¡ jedan raÄun',
+'createacct-join' => 'Unesite svoje podatke ispod.',
+'createacct-another-join' => 'Unesite informacije o novom raÄunu ispod.',
+'createacct-emailrequired' => 'Adresa e-pošte',
+'createacct-emailoptional' => 'Adresa e-pošte (opcionalno)',
+'createacct-email-ph' => 'Unesite Vašu adresu e-pоšte',
+'createacct-another-email-ph' => 'Unesite adresu e-pošte',
'createaccountmail' => 'Koristite privremenu, sluÄajno stvorenu Å¡ifru/lozinku i poÅ¡aljite na navedenu adrеsu e-poÅ¡te',
+'createacct-realname' => 'Pravo ime (opcionalno)',
'createaccountreason' => 'Razlog:',
+'createacct-reason' => 'Razlog',
+'createacct-reason-ph' => 'ZaÅ¡to pravite joÅ¡ jedan korisniÄki raÄun?',
+'createacct-captcha' => 'Sigurnosna provjera',
+'createacct-imgcaptcha-ph' => 'Unesite tekst koji vidite iznad',
+'createacct-submit' => 'Napravite svoj korisniÄki raÄun',
+'createacct-another-submit' => 'Napravi joÅ¡ jedan korisniÄki raÄun',
+'createacct-benefit-heading' => '{{SITENAME}} je napravljen od strane ljudi kao Å¡to ste Vi.',
+'createacct-benefit-body1' => '{{PLURAL:$1|izmjena|izmjene}}',
+'createacct-benefit-body2' => '{{PLURAL:$1|stranica|stranice|stranica}}',
+'createacct-benefit-body3' => 'nedavni {{PLURAL:$1|doprinosa}}',
'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.',
@@ -776,10 +815,12 @@ Trebali biste se prijaviti i promjeniti Å¡ifru.
Možete ignorisati ovu poruku, ako je korisniÄki raÄun napravljen greÅ¡kom.',
'usernamehasherror' => 'KorisniÄko ime ne može sadržavati haÅ¡ znakove',
'login-throttled' => 'Previše puta ste se pokušali prijaviti.
-Molimo Vas da saÄekate prije nego Å¡to pokuÅ¡ate ponovo.',
+Molimo Vas da saÄekate $1 prije nego Å¡to pokuÅ¡ate ponovo.',
'login-abort-generic' => 'Vaša prijava nije bila uspješna – Prekinuto',
'loginlanguagelabel' => 'Jezik: $1',
'suspicious-userlogout' => 'Vaš zahtjev za odjavu je odbijen jer je poslan preko pokvarenog preglednika ili keširanog proksija.',
+'createacct-another-realname-tip' => 'Pravo ime nije obavezno.
+Ako izaberete da date ime, biće korišteno za pripisivanje za vaš rad.',
# Email sending
'php-mail-error-unknown' => 'Nepoznata greška u PHP funkciji mail()',
@@ -796,8 +837,7 @@ Da biste završili prijavu, morate unijeti novu šifru ovdje:',
'newpassword' => 'Nova Å¡ifra:',
'retypenew' => 'Unesite ponovo novu Å¡ifru:',
'resetpass_submit' => 'Odredi Å¡ifru i prijavi se',
-'resetpass_success' => 'Vaša šifra/lozinka je uspiješno promjenjena!
-Prijavljujem vas...',
+'changepassword-success' => 'Vaša šifra/lozinka je uspiješno promjenjena!',
'resetpass_forbidden' => 'Å ifre ne mogu biti promjenjene',
'resetpass-no-info' => 'Morate biti prijavljeni da bi ste pristupili ovoj stranici direktno.',
'resetpass-submit-loggedin' => 'Promijeni Å¡ifru',
@@ -809,10 +849,11 @@ Možda ste već uspješno promijenili Vašu šifru ili ste tražili novu privrem
# Special:PasswordReset
'passwordreset' => 'Poništavanje šifre',
-'passwordreset-text' => 'Ispunite ovaj obrazac da biste resetovali Vašu šifru/lozinku.',
+'passwordreset-text-one' => 'Ispunite ovaj obrazac da biste resetovali Vašu šifru/lozinku.',
+'passwordreset-text-many' => '{{PLURAL:$1|Ispunite jedno od polja kako bi ste resetirali svoju Å¡ifru/lozinku.}}',
'passwordreset-legend' => 'Poništi šifru',
'passwordreset-disabled' => 'Poništavanje šifre je onemogućeno na ovoj wiki.',
-'passwordreset-pretext' => '{{PLURAL:$1||Unesite jedan dio podataka ispod}}',
+'passwordreset-emaildisabled' => 'E-pošta je onemogućena na ovom wikiju.',
'passwordreset-username' => 'KorisniÄko ime:',
'passwordreset-domain' => 'Domen:',
'passwordreset-capture' => 'Pogledati krajnji e-mail?',
@@ -835,7 +876,7 @@ Trebate se prijaviti i odabrati novu Å¡ifru. Ako je neko drugi napravio ovaj zah
Privremena Å¡ifra: $2',
'passwordreset-emailsent' => 'Podsjetnik o šifri/lozinci je poslat na Vašu E-mail adresu.',
'passwordreset-emailsent-capture' => 'Poslat je podsjetnik preko e-pošte (prikazan dole).',
-'passwordreset-emailerror-capture' => 'Napravljen je podsjetnik preko e-pošte (prikazan dole), ali ga ne mogu poslati korisniku zbog sljedećeg razloga: $1',
+'passwordreset-emailerror-capture' => 'E-poruka za resetiranje Å¡ifre/lozinke, prikazan ispod, je poslan, ali slanje {{GENDER:$2|korisniku|korisnici}} nije uspjelo: $1',
# Special:ChangeEmail
'changeemail' => 'Promijeni e-mail adresu',
@@ -1057,11 +1098,14 @@ Nije ponuđeno nikakvo objašnjenje.',
Izgleda da je obrisana.',
'edit-conflict' => 'Sukob izmjena.',
'edit-no-change' => 'Vaša izmjena je ignorirana, jer nije bilo promjena teksta stranice.',
+'postedit-confirmation' => 'VaÅ¡a izmjena je saÄuvana.',
'edit-already-exists' => 'Stranica nije mogla biti kreirana.
Izgleda da već postoji.',
'defaultmessagetext' => 'UobiÄajeni tekst poruke',
'invalid-content-data' => 'Nevaljani podaci sadržaja',
'content-not-allowed-here' => 'Sadržaj napisan u obliku "$1" nije dozvoljen na stranici [[$2]]',
+'editwarning-warning' => 'NapuÅ¡tanje ove stranice može dovesti do gubitka svih promjena koje ste naÄinili.
+Ako ste prijavljeni, možete iskljuÄiti ovo upozorenje u Sekciji za "UreÄ‘ivanje" vaÅ¡ih opcija.',
# Content models
'content-model-wikitext' => 'wikitekst',
@@ -1097,6 +1141,7 @@ Molimo da provjerite usporedbu ispod da budete sigurni da to želite uÄiniti, a
'undo-failure' => 'Izmjene se ne mogu vratiti zbog konflikta sa izmjenama u međuvremenu.',
'undo-norev' => 'Izmjena se ne može vratiti jer ne postoji ranija ili je obrisana.',
'undo-summary' => 'Vraćena izmjena $1 [[Special:Contributions/$2|korisnika $2]] ([[User talk:$2|razgovor]])',
+'undo-summary-username-hidden' => 'Poništi izmjenu $1 od skrivenog korisnika',
# Account creation failure
'cantcreateaccounttitle' => 'Nije moguće napraviti korisniÄki raÄun',
@@ -1277,6 +1322,7 @@ Korištenje navigacionih linkova će resetovati ovaj stupac.',
'compareselectedversions' => 'Uporedite oznaÄene verzije',
'showhideselectedversions' => 'Pokaži/sakrij odabrane verzije',
'editundo' => 'ukloni ovu izmjenu',
+'diff-empty' => '(Nema razlike)',
'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}})',
'difference-missing-revision' => '{{PLURAL:$2|Jedna izmjena|$2 izmjene}} od ove razlike ($1) ne {{PLURAL:$2|postoji|postoje}}.
@@ -1304,7 +1350,6 @@ Više informacija možete pronaći u [{{fullurl:{{#Special:Log}}/delete|page={{F
'searchmenu-legend' => 'Opcije pretrage',
'searchmenu-exists' => "'''Postoji stranica pod nazivom \"[[:\$1]]\" na ovoj wiki'''",
'searchmenu-new' => "'''Napravi stranicu \"[[:\$1|\$1]]\" na ovoj wiki!'''",
-'searchhelp-url' => 'Help:Sadržaj',
'searchmenu-prefix' => '[[Special:PrefixIndex/$1|Pregledaj stranice sa ovim prefiksom]]',
'searchprofile-articles' => 'Stranice sadržaja',
'searchprofile-project' => 'Stranice pomoći i projekta',
@@ -1347,15 +1392,6 @@ PokuÅ¡ajte u VaÅ¡ upit ukljuÄiti prefiks ''all:'' da bi ste pretražili sav sad
'search-external' => 'Vanjska pretraga',
'searchdisabled' => '<p>Izvinjavamo se! Puno pretraga teksta je privremeno onemogućena. U međuvremenu, možete koristiti Google za pretragu. Indeks može biti stariji.',
-# Quickbar
-'qbsettings' => 'Podešavanja brze palete',
-'qbsettings-none' => 'Nikakva',
-'qbsettings-fixedleft' => 'PriÄvršćena lijevo',
-'qbsettings-fixedright' => 'PriÄvršćena desno',
-'qbsettings-floatingleft' => 'Plutajuća lijevo',
-'qbsettings-floatingright' => 'Plutajući desno',
-'qbsettings-directionality' => 'Čvrsto, u zavisnosti od usmjerenosti pisma Vašeg jezika',
-
# Preferences page
'preferences' => 'Postavke',
'mypreferences' => 'Postavke',
@@ -1388,7 +1424,6 @@ PokuÅ¡ajte u VaÅ¡ upit ukljuÄiti prefiks ''all:'' da bi ste pretražili sav sad
'resetprefs' => 'Vrati podešavanja',
'restoreprefs' => 'Vrati sve pretpostavljene postavke',
'prefs-editing' => 'VeliÄine tekstualnog polja',
-'prefs-edit-boxsize' => 'VeliÄina prozora za ureÄ‘ivanje.',
'rows' => 'Redova',
'columns' => 'Kolona',
'searchresultshead' => 'Podešavanja rezultata pretrage',
@@ -1399,9 +1434,6 @@ PokuÅ¡ajte u VaÅ¡ upit ukljuÄiti prefiks ''all:'' da bi ste pretražili sav sad
'recentchangesdays-max' => '(najviše $1 {{PLURAL:$1|dan|dana}})',
'recentchangescount' => 'Broj uređivanja za prikaz po pretpostavkama:',
'prefs-help-recentchangescount' => 'Ovo ukljuÄuje nedavne izmjene, historije stranice i zapise.',
-'prefs-help-watchlist-token' => 'Popunjavanjem ovog polja tajnim kljuÄem će generisati RSS fid za VaÅ¡ spisak praćenja.
-Svako ko zna kljuÄ u ovom polju će biti u mogućnosti da proÄita VaÅ¡ spisak praćenja, tako da trebate izabrati sigurnu vrijednost.
-Ovdje su navedene neke nasumiÄno odabrane vrijednosti koje možete koristiti: $1',
'savedprefs' => 'VaÅ¡e postavke su saÄuvane.',
'timezonelegend' => 'Vremenska zona:',
'localtime' => 'Lokalno vrijeme:',
@@ -1432,7 +1464,6 @@ Ovdje su navedene neke nasumiÄno odabrane vrijednosti koje možete koristiti: $
'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:',
-'prefs-textboxsize' => 'VeliÄina prozora za ureÄ‘ivanje',
'youremail' => 'E-mail:',
'username' => '{{GENDER:$1|KorisniÄko}} ime:',
'uid' => '{{GENDER:$1|KorisniÄki}} ID:',
@@ -1465,6 +1496,8 @@ Ako izaberete da date ime, biće korišteno za pripisivanje za vaš rad.',
'prefs-dateformat' => 'Format datuma',
'prefs-timeoffset' => 'Vremenska razlika',
'prefs-advancedediting' => 'Opće opcije',
+'prefs-editor' => 'Urednik',
+'prefs-preview' => 'Prethodni pregled',
'prefs-advancedrc' => 'Napredne opcije',
'prefs-advancedrendering' => 'Napredne opcije',
'prefs-advancedsearchoptions' => 'Napredne opcije',
@@ -1499,6 +1532,8 @@ Ako izaberete da date ime, biće korišteno za pripisivanje za vaš rad.',
'userrights-notallowed' => 'VaÅ¡ raÄun nema privilegije da dodaje ili oduzima prava korisnika.',
'userrights-changeable-col' => 'Grupe koje možete mijenjati',
'userrights-unchangeable-col' => 'Grupe koje ne možete mijenjati',
+'userrights-conflict' => 'Sukob u korisniÄkim pravima! Molimo poÅ¡aljite VaÅ¡e promjene ponovno.',
+'userrights-removed-self' => 'Uspješno ste uklonili vlastite prava. Zbog toga više niste u stanju pristupiti ovoj stranici.',
# Groups
'group' => 'Grupa:',
@@ -1564,11 +1599,18 @@ Ako izaberete da date ime, biće korišteno za pripisivanje za vaš rad.',
'right-proxyunbannable' => 'Zaobilaženje automatskih blokada proxy-ja',
'right-unblockself' => 'Deblokiraj samog sebe',
'right-protect' => 'Promjena nivoa zaštite i uređivanje kaskadno zaštićenih stranica',
-'right-editprotected' => 'Uređivanje zaštićenih stranica (bez povezanih zaštita)',
+'right-editprotected' => 'Uređivanje stranice zaštićenih kao "{{int:protect-level-sysop}}"',
+'right-editsemiprotected' => 'Uređivanje stranica zaštićenih kao "{{int:protect-level-autoconfirmed}}"',
'right-editinterface' => 'UreÄ‘ivanje korisniÄkog interfejsa',
'right-editusercssjs' => 'Uređivanje CSS i JS datoteka drugih korisnika',
'right-editusercss' => 'Uređivanje CSS datoteka drugih korisnika',
'right-edituserjs' => 'Uređivanje JS datoteka drugih korisnika',
+'right-editmyusercss' => 'Uredite svoje vlastite korisniÄke CSS datoteke',
+'right-editmyuserjs' => 'Uredite vlastite korisniÄke JavaScript datoteke',
+'right-viewmywatchlist' => 'Pogledaj svoj spisak praćenih stranica',
+'right-viewmyprivateinfo' => 'Vidite svoje privatne podatke (npr. adresa e-pošte, pravo ime)',
+'right-editmyprivateinfo' => 'Uredite svoje privatne podatke (npr. adresa e-pošte, pravo ime)',
+'right-editmyoptions' => 'Uredite svoje postavke',
'right-rollback' => 'Brzo vraćanje izmjena na zadnjeg korisnika koji je uređivao određenu stranicu',
'right-markbotedits' => 'OznaÄavanje vraćenih izmjena kao izmjene bota',
'right-noratelimit' => 'Izbjegavanje ograniÄenja uzrokovanih brzinom',
@@ -1630,9 +1672,14 @@ Ako izaberete da date ime, biće korišteno za pripisivanje za vaš rad.',
'action-userrights-interwiki' => 'ureÄ‘ujete korisniÄka prava korisnika na drugim wikijima',
'action-siteadmin' => 'zakljuÄavate ili otkljuÄavate bazu podataka',
'action-sendemail' => 'pošalji e-mail poruke',
+'action-editmywatchlist' => 'uredite svoj spisak praćenih stranica',
+'action-viewmywatchlist' => 'pogledajte svoj spisak praćenih stranica',
+'action-viewmyprivateinfo' => 'pogledajte svoje privatne informacije',
+'action-editmyprivateinfo' => 'uredite svoje privatne podatke',
# Recent changes
'nchanges' => '$1 {{PLURAL:$1|promjena|promjene|promjena}}',
+'enhancedrc-history' => 'historija',
'recentchanges' => 'Nedavne izmjene',
'recentchanges-legend' => 'Postavke nedavnih izmjena',
'recentchanges-summary' => 'Na ovoj stranici možete pratiti nedavne izmjene.',
@@ -1672,7 +1719,6 @@ Ako izaberete da date ime, biće korišteno za pripisivanje za vaš rad.',
'recentchangeslinked-feed' => 'Srodne izmjene',
'recentchangeslinked-toolbox' => 'Srodne izmjene',
'recentchangeslinked-title' => 'Srodne promjene sa "$1"',
-'recentchangeslinked-noresult' => 'Nema izmjena na povezanim stranicama u zadanom periodu.',
'recentchangeslinked-summary' => "Ova posebna stranica prikazuje promjene na povezanim stranicama.
Stranice koje su na vašem [[Special:Watchlist|spisku praćenja]] su '''podebljane'''.",
'recentchangeslinked-page' => 'Naslov stranice:',
@@ -1684,7 +1730,7 @@ Stranice koje su na vašem [[Special:Watchlist|spisku praćenja]] su '''podeblja
'reuploaddesc' => 'Vratite se na upitnik za slanje.',
'upload-tryagain' => 'Pošaljite izmijenjeni opis datoteke',
'uploadnologin' => 'Niste prijavljeni',
-'uploadnologintext' => 'Morate biti [[Special:UserLogin|prijavljeni]] da bi ste slali datoteke.',
+'uploadnologintext' => 'Morate biti $1 da bi ste slali datoteke.',
'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',
@@ -1904,7 +1950,6 @@ Za optimalnu sigurnost, img_auth.php je onemogućena.',
'http-read-error' => 'GreÅ¡ka pri Äitanju HTTP.',
'http-timed-out' => 'Istekao HTTP zahtjev.',
'http-curl-error' => 'Greška pri otvaranju URLa: $1',
-'http-host-unreachable' => 'Ovaj URL nije bilo moguće otvoriti',
'http-bad-status' => 'Nastao je problem tokom HTTP zahtjeva: $1 $2',
# Some likely curl errors. More could be added from <http://curl.haxx.se/libcurl/c/libcurl-errors.html>
@@ -1935,6 +1980,9 @@ Možda možete pokušati kada bude manje opterećenje.',
'listfiles_size' => 'VeliÄina',
'listfiles_description' => 'Opis',
'listfiles_count' => 'Verzije',
+'listfiles-latestversion' => 'Trenutna verzija',
+'listfiles-latestversion-yes' => 'Da',
+'listfiles-latestversion-no' => 'Ne',
# File description page
'file-anchor-link' => 'Datoteka',
@@ -2031,6 +2079,10 @@ Prije brisanja provjerite da li druge stranice vode na te Å¡ablone.',
'randompage' => 'SluÄajna stranica',
'randompage-nopages' => 'Nema stranica u {{PLURAL:$2|slijedećem imenskom prostoru|slijedećim imenskim prostorima}}: "$1".',
+# Random page in category
+'randomincategory' => 'SluÄajna stranica u kategoriji',
+'randomincategory-selectcategory-submit' => 'Idi',
+
# Random redirect
'randomredirect' => 'SluÄajno preusmjerenje',
'randomredirect-nopages' => 'Ne postoje preusmjerenja u imenskom prostoru "$1".',
@@ -2056,12 +2108,6 @@ Prije brisanja provjerite da li druge stranice vode na te Å¡ablone.',
'statistics-users-active-desc' => 'Korisnici koju su izvršili akciju u toku {{PLURAL:$1|zadnjeg dana|zadnja $1 dana|zadnjih $1 dana}}',
'statistics-mostpopular' => 'Najviše pregledane stranice',
-'disambiguations' => 'Stranice koje vode na Ävor Älanke',
-'disambiguationspage' => '{{ns:template}}:ÄŒvor',
-'disambiguations-text' => "Slijedeće stranice sadrže najmanje jedan link na '''Ävor stranicom'''.
-Umjesto toga, one se trebaju povezati sa konkretnim konkretnim stranicom.<br />
-Stranica se smatra Ävorom, ukoliko koristi Å¡ablon koji je povezan sa spiskom [[MediaWiki:Disambiguationspage]]",
-
'pageswithprop-prop' => 'Naziv svojstva:',
'pageswithprop-submit' => 'Idi',
@@ -2315,10 +2361,9 @@ Buduće promjene ove stranice i njoj pridružene stranice za razgovor će biti n
'unwatchthispage' => 'Ukinite praćenje',
'notanarticle' => 'Nije Älanak',
'notvisiblerev' => 'Revizija je obrisana',
-'watchnochange' => 'Ništa što pratite nije promjenjeno u prikazanom vremenu.',
'watchlist-details' => '{{PLURAL:$1|$1 stranica praćena|$1 stranice praćene|$1 stranica praćeno}} ne raÄunajući stranice za razgovor.',
-'wlheader-enotif' => '* Obavještavanje e-poštom je omogućeno.',
-'wlheader-showupdated' => "* Stranice koje su izmijenjene od kad ste ih posljednji put posjetili su prikazane '''podebljanim slovima'''",
+'wlheader-enotif' => 'Obavještavanje e-poštom je omogućeno.',
+'wlheader-showupdated' => "Stranice koje su izmijenjene od kad ste ih posljednji put posjetili su prikazane '''podebljanim slovima'''",
'watchmethod-recent' => 'provjerava se da li ima praćenih stranica u nedavnim izmjenama',
'watchmethod-list' => 'provjerava se da li ima nedavnih izmjena u praćenim stranicama',
'watchlistcontains' => 'VaÅ¡ spisak praćenih Älanaka sadrži $1 {{PLURAL:$1|stranicu|stranica}}.',
@@ -2566,7 +2611,7 @@ $1',
'contributions' => 'Doprinosi {{GENDER:$1|korisnika|korisnice|korisnika}}',
'contributions-title' => 'Doprinosi korisnika $1',
'mycontris' => 'Doprinos',
-'contribsub2' => 'Za $1 ($2)',
+'contribsub2' => 'Za {{GENDER:$3|$1}} ($2)',
'nocontribs' => 'Nisu nađene promjene koje zadovoljavaju ove uslove.',
'uctop' => '(trenutno)',
'month' => 'Od mjeseca (i ranije):',
@@ -2723,11 +2768,8 @@ Možda je već deblokirana.',
Međutim, možda je blokirana kao dio bloka $2, koji se ne može deblokirati.',
'ip_range_invalid' => 'NetaÄan raspon IP adresa.',
'ip_range_toolarge' => 'Nisu dopuštene blokade veće od /$1.',
-'blockme' => 'Blokiraj me',
'proxyblocker' => 'Bloker proksija',
-'proxyblocker-disabled' => 'Ova funkcija je onemogućena.',
'proxyblockreason' => 'VaÅ¡a IP adresa je blokirana jer je ona otvoreni proksi. Molimo vas da kontaktirate vaÅ¡eg davatelja internetskih usluga (Internet Service Provider-a) ili tehniÄku podrÅ¡ku i obavijestite ih o ovom ozbiljnom sigurnosnom problemu.',
-'proxyblocksuccess' => 'Proksi uspješno blokiran.',
'sorbsreason' => 'Vaša IP adresa je prikazana kao otvoreni proxy u DNSBL koji koristi {{SITENAME}}.',
'sorbs_create_account_reason' => 'Vaša IP adresa je prikazana kao otvoreni proxy u DNSBL korišten od {{SITENAME}}.
Ne možete napraviti raÄun',
@@ -2898,6 +2940,8 @@ Molimo posjetite [//www.mediawiki.org/wiki/Localisation MediaWiki lokalizaciju]
'thumbnail-more' => 'uvećajte',
'filemissing' => 'Nedostaje datoteka',
'thumbnail_error' => 'Greška pri pravljenju umanjene slike: $1',
+'thumbnail_error_remote' => 'Poruka o grešci iz $1:
+$2',
'djvu_page_error' => 'DjVu stranica je van opsega',
'djvu_no_xml' => 'Za XML-datoteku se ne može pozvati DjVu datoteka',
'thumbnail-temp-create' => 'Ne mogu da napravim privremenu smanjenu sliku',
@@ -3049,26 +3093,15 @@ Dopušta unos razloga u sažetak.',
# Stylesheets
'common.css' => '/* CSS umetnut ovdje primijenit će se na sve skinove */',
-'standard.css' => '/* CSS umetnut ovdje uticat će na korisnike koji koriste Standard skin */',
-'nostalgia.css' => '/* CSS umetnut ovdje uticat će na korisnike koji koriste Nostalgia skin */',
'cologneblue.css' => '/* CSS umetnut ovdje uticat će na korisnike koji koriste Cologne Blue skin */',
'monobook.css' => '/* CSS umetnut ovdje uticat će na korisnike koji koriste Monobook skin */',
-'myskin.css' => '/* CSS umetnut ovdje uticat će na korisnike koji koriste MySkin skin */',
-'chick.css' => '/* CSS umetnut ovdje uticat će na korisnike koji koriste Chick skin */',
-'simple.css' => '/* CSS umetnut ovdje uticat će na korisnike koji koriste Simple skin */',
'modern.css' => '/* CSS umetnut ovdje uticat će na korisnike koji koriste Modern skin */',
'print.css' => '/* CSS umetnut ovdje uticat će na izgled isprintane stranice */',
-'handheld.css' => '/* CSS umetnut ovdje uticat će na ruÄne sprave koji rade na skinu konfigurisanom u $wgHandheldStyle */',
# Scripts
'common.js' => '/* Bilo koja JavaScript će biti uÄitana za sve korisnike pri svakom uÄitavanju stranice. */',
-'standard.js' => '/* Bilo koja JavaScript će biti uÄitana za sve korisnike koji koriste Standard skin */',
-'nostalgia.js' => '/* Bilo koja JavaScript će biti uÄitana za sve korisnike koji koriste Nostalgia skin */',
'cologneblue.js' => '/* Bilo koja JavaScript će biti uÄitana za sve korisnike koji koriste Cologne Blue skin */',
'monobook.js' => '/* Bilo koja JavaScript će biti uÄitana za sve korisnike koji koriste MonoBook skin */',
-'myskin.js' => '/* Bilo koja JavaScript će biti uÄitana za sve korisnike koji koriste MySkin skin */',
-'chick.js' => '/* Bilo koja JavaScript će biti uÄitana za sve korisnike koji koriste Chick skin */',
-'simple.js' => '/* Bilo koja JavaScript će biti uÄitana za sve korisnike koji koriste Simple skin */',
'modern.js' => '/* Bilo koja JavaScript će biti uÄitana za sve korisnike koji koriste Modern skin */',
# Metadata
@@ -3141,13 +3174,8 @@ Ovo je vjerovatno izazvao vezom ka vanjskoj nepoželjnoj stranici.',
'pageinfo-category-files' => 'Broj datoteka',
# Skin names
-'skinname-standard' => 'KlasiÄno',
-'skinname-nostalgia' => 'Nostalgija',
'skinname-cologneblue' => 'Kelnsko plavo',
'skinname-monobook' => 'MonoKnjiga',
-'skinname-myskin' => 'MojaKoža',
-'skinname-chick' => 'Pile (chick)',
-'skinname-simple' => 'Jednostavna',
'skinname-modern' => 'Moderna',
# Patrolling
@@ -3224,11 +3252,25 @@ $1',
'minutes' => '{{PLURAL:$1|$1 minuta|$1 minute|$1 minuta}}',
'hours' => '{{PLURAL:$1|$1 sat|$1 sata|$1 sati}}',
'days' => '{{PLURAL:$1|$1 dan|$1 dana|$1 dana}}',
+'weeks' => '{{PLURAL:$1|$1 sedmica}}',
'months' => '{{PLURAL:$1|$1 mjesec|$1 mjeseci}}',
'years' => '{{PLURAL:$1|$1 godina|$1 godine|$1 godina}}',
'ago' => 'prije $1',
'just-now' => 'upravo sad',
+# Human-readable timestamps
+'hours-ago' => 'prije $1 {{PLURAL:$1|sat|sata|sati}}',
+'minutes-ago' => 'prije $1 {{PLURAL:$1|minute|minute|minuta}}',
+'seconds-ago' => 'prije $1 {{PLURAL:$1|sekunde|sekunde|sekundi}}',
+'monday-at' => 'Ponedeljak u $1',
+'tuesday-at' => 'Utorak u $1',
+'wednesday-at' => 'Srijeda u $1',
+'thursday-at' => 'ÄŒetvrtak u $1',
+'friday-at' => 'Petak u $1',
+'saturday-at' => 'Subota u $1',
+'sunday-at' => 'Nedjelja u $1',
+'yesterday-at' => 'JuÄer u $1',
+
# Bad image list
'bad_image_list' => "Koristi se sljedeći format:
@@ -3257,7 +3299,7 @@ Svi drugi linkovi u istoj liniji se smatraju izuzecima, npr. kod stranica gdje s
* gpslongitude
* gpsaltitude',
-# EXIF tags
+# Exif tags
'exif-imagewidth' => 'Å irina',
'exif-imagelength' => 'Visina',
'exif-bitspersample' => 'Bita po komponenti',
@@ -3435,7 +3477,7 @@ Svi drugi linkovi u istoj liniji se smatraju izuzecima, npr. kod stranica gdje s
'exif-originalimageheight' => 'Visina slike prije nego Å¡to je odrezana',
'exif-originalimagewidth' => 'Å irina slike prije nego Å¡to je odrezana',
-# EXIF attributes
+# Exif attributes
'exif-compression-1' => 'Nekompresovano',
'exif-compression-2' => 'CCITT Grupa 3 1 — Dimenzionalno izmijenjeo Huffmanovo šifriranje po dužini',
'exif-compression-3' => 'CCITT Grupa 3 faks Å¡ifriranje',
@@ -3888,7 +3930,6 @@ TakoÄ‘er možete [[Special:EditWatchlist|koristiti standardni ureÄ‘ivaÄ]].',
'version-other' => 'Ostalo',
'version-mediahandlers' => 'UpravljaÄi medije',
'version-hooks' => 'Kuke',
-'version-extension-functions' => 'Funkcije proširenja (ekstenzije)',
'version-parser-extensiontags' => "Parser proširenja (''tagovi'')",
'version-parser-function-hooks' => 'Kuke parserske funkcije',
'version-hook-name' => 'Naziv kuke',
@@ -3910,12 +3951,13 @@ Trebali biste dobiti [{{SERVER}}{{SCRIPTPATH}}/KOPIJU GNU opće javne licence] z
'version-entrypoints-header-entrypoint' => 'Ulazna taÄka',
'version-entrypoints-header-url' => 'URL',
-# Special:FilePath
-'filepath' => 'Putanja datoteke',
-'filepath-page' => 'Datoteka:',
-'filepath-submit' => 'Idi',
-'filepath-summary' => 'Ova posebna stranica prikazuje potpunu putanju za datoteku.
-Slike su prikazane u punoj veliÄini, ostale vrste datoteka su prikazane direktno sa, s njima povezanim, programom.',
+# Special:Redirect
+'redirect-submit' => 'Idi',
+'redirect-value' => 'Vrijednost:',
+'redirect-user' => 'KorisniÄki ID',
+'redirect-revision' => 'Verzija stranice',
+'redirect-file' => 'Naziv datoteke',
+'redirect-not-exists' => 'Vrijednost nije pronađena',
# Special:FileDuplicateSearch
'fileduplicatesearch' => 'Pretraga za duplim datotekama',
@@ -3964,12 +4006,15 @@ Slike su prikazane u punoj veliÄini, ostale vrste datoteka su prikazane direktn
'tags' => 'Oznake valjane izmjene',
'tag-filter' => 'Filter [[Special:Tags|oznaka]]:',
'tag-filter-submit' => 'Filter',
+'tag-list-wrapper' => '([[Special:Tags|{{PLURAL:$1|Oznaka|Oznake}}]]: $2)',
'tags-title' => 'Oznake',
'tags-intro' => 'Ova stranica prikazuje spisak oznaka koje softver može staviti na svaku izmjenu i njihovo znaÄenje.',
'tags-tag' => 'Naziv oznake',
'tags-display-header' => 'Vidljivost na spisku izmjena',
'tags-description-header' => 'Puni opis znaÄenja',
'tags-hitcount-header' => 'OznaÄene izmjene',
+'tags-active-yes' => 'Da',
+'tags-active-no' => 'Ne',
'tags-edit' => 'uređivanje',
'tags-hitcount' => '$1 {{PLURAL:$1|izmjena|izmjene|izmjena}}',
@@ -4005,6 +4050,9 @@ Slike su prikazane u punoj veliÄini, ostale vrste datoteka su prikazane direktn
'htmlform-submit' => 'Pošalji',
'htmlform-reset' => 'Vrati izmjene',
'htmlform-selectorother-other' => 'Ostalo',
+'htmlform-no' => 'Ne',
+'htmlform-yes' => 'Da',
+'htmlform-chosen-placeholder' => 'Izaberite opciju',
# SQLite database support
'sqlite-has-fts' => '$1 sa podrškom pretrage cijelog teksta',
@@ -4122,4 +4170,7 @@ InaÄe, možete ispuniti jednostavan obrazac ispod. VaÅ¡ komentar biti će dodan
# Image rotation
'rotate-comment' => 'Slika rotirana za $1 {{PLURAL:$1|stepen|stepeni}} u smjeru kazaljke na satu',
+# Limit report
+'limitreport-walltime-value' => '$1 {{PLURAL:$1|sekunda|sekunde|sekundi}}',
+
);
diff --git a/languages/messages/MessagesBug.php b/languages/messages/MessagesBug.php
index 64eb16bd..a8d0f1d5 100644
--- a/languages/messages/MessagesBug.php
+++ b/languages/messages/MessagesBug.php
@@ -248,9 +248,6 @@ $messages = array(
'search-result-size' => '$1 ({{PLURAL:$2|1 ada|$2 ada}})',
'search-redirect' => '(redirect $1)',
-# Quickbar
-'qbsettings-none' => 'Dégaga',
-
# Preferences page
'mypreferences' => 'Bérékkeŋeŋna iyya',
'prefsnologin' => "Déppa ma'log attama'",
diff --git a/languages/messages/MessagesBxr.php b/languages/messages/MessagesBxr.php
new file mode 100644
index 00000000..88bc5d93
--- /dev/null
+++ b/languages/messages/MessagesBxr.php
@@ -0,0 +1,72 @@
+<?php
+/** Buryat (Russia) (бурÑад)
+ *
+ * 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 Russian
+ *
+ */
+
+$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_TALK => 'MediaWiki_Ñ…ÑлÑлÑÑÑ…Ñ',
+ NS_TEMPLATE => 'Загбар',
+ NS_TEMPLATE_TALK => 'Загбар_Ñ…ÑлÑлÑÑÑ…Ñ',
+ NS_HELP => 'Туһаламжа',
+ NS_HELP_TALK => 'Туһаламжа_Ñ…ÑлÑлÑÑл',
+ NS_CATEGORY => 'Категори',
+ NS_CATEGORY_TALK => 'Категори_Ñ…ÑлÑлÑÑÑ…Ñ',
+);
+
+$namespaceAliases = array(
+ # Russian namespaces
+ 'ОбÑуждение' => NS_TALK,
+ 'УчаÑтник' => NS_USER,
+ 'ОбÑуждение_учаÑтника' => NS_USER_TALK,
+ 'ОбÑуждение_{{GRAMMAR:genitive|$1}}' => NS_PROJECT_TALK,
+ 'ОбÑуждение_файла' => NS_FILE_TALK,
+ 'ОбÑуждение_MediaWiki' => NS_MEDIAWIKI_TALK,
+ 'ОбÑуждение_шаблона' => NS_TEMPLATE_TALK,
+ 'Справка' => NS_HELP,
+ 'ОбÑуждение_Ñправки' => NS_HELP_TALK,
+ 'КатегориÑ' => NS_CATEGORY,
+ 'ОбÑуждение_категории' => NS_CATEGORY_TALK,
+);
+
+// Remove Russian gender aliases
+$namespaceGenderAliases = array();
+
+$specialPageAliases = array(
+ 'Activeusers' => array( 'ЭдÑбхитÑй_Ñ…ÑÑ€ÑглÑгшÑд' ),
+ 'Allmessages' => array( 'Бүхы_зурбаÑ' ),
+ 'Allpages' => array( 'Соохи_бүхы_хуудаһан' ),
+ 'Ancientpages' => array( 'Хуушарһан_хуудаһан' ),
+ 'Categories' => array( 'Категоринууд' ),
+ 'ComparePages' => array( 'Хуудаһа_хариÑуулха' ),
+ 'Confirmemail' => array( 'Сахим_хаÑг_баталха' ),
+ 'CreateAccount' => array( 'ДанÑа_Ò¯Ò¯ÑÑ…ÑÑ…Ñ' ),
+ 'Mypage' => array( 'Минии_хуудаһан' ),
+ 'Mytalk' => array( 'Минии_Ñ…ÑлÑлÑÑл' ),
+ 'Myuploads' => array( 'Минии_ашаалһан_зүйл' ),
+ 'Newpages' => array( 'ШÑнÑ_хуудаһан' ),
+ 'Popularpages' => array( 'Оло_уншагдаһан_хуудаһан' ),
+ 'Protectedpages' => array( 'Хамгаалалтатай_хуудаһан' ),
+ 'Protectedtitles' => array( 'Хамгаалалтатай_гаршаг' ),
+ 'Recentchanges' => array( 'Сайтдахи_хубилалтанууд' ),
+ 'Upload' => array( 'Ðшаалха' ),
+ 'Userlogin' => array( 'ÐÑбтÑрхÑ' ),
+ 'Userlogout' => array( 'Гараха' ),
+);
+
diff --git a/languages/messages/MessagesCa.php b/languages/messages/MessagesCa.php
index 9db64c4c..759a4c10 100644
--- a/languages/messages/MessagesCa.php
+++ b/languages/messages/MessagesCa.php
@@ -18,12 +18,14 @@
* @author Gemmaa
* @author Grondin
* @author Iradigalesc
+ * @author Jmarchn
* @author Jordi Roqué
* @author Juanpabl
* @author Kaganer
* @author Marcmpujol
* @author Martorell
* @author McDutchie
+ * @author Nemo bis
* @author Pasqual (ca)
* @author Paucabot
* @author PerroVerd
@@ -31,6 +33,7 @@
* @author Pitort
* @author Pérez
* @author Qllach
+ * @author QuimGil
* @author SMP
* @author Smeira
* @author Solde
@@ -38,6 +41,7 @@
* @author Ssola
* @author Toniher
* @author Vriullop
+ * @author XVEC
* @author Àlex
* @author לערי ריינה×רט
*/
@@ -228,9 +232,6 @@ $messages = array(
'tog-shownumberswatching' => "Mostra el nombre d'usuaris que hi vigilen",
'tog-oldsig' => 'Signatura actual:',
'tog-fancysig' => 'Tractar la signatura com a text wiki (sense enllaç automàtic)',
-'tog-externaleditor' => "Utilitza per defecte un editor extern (opció per a experts, requereix la configuració adient de l'ordinador, [//www.mediawiki.org/wiki/Manual:External_editors consulteu-ho al manual])",
-'tog-externaldiff' => "Utilitza per defecte un altre visualitzador de diferències (opció per a experts, requereix la configuració adient de l'ordinador, [//www.mediawiki.org/wiki/Manual:External_editors consulteu-ho al manual])",
-'tog-showjumplinks' => "Habilita els enllaços de dreceres d'accessibilitat",
'tog-uselivepreview' => 'Utilitza la previsualització automàtica (cal JavaScript) (experimental)',
'tog-forceeditsummary' => "Avisa'm en deixar el resum de la modificació en blanc",
'tog-watchlisthideown' => 'Amaga les meues edicions de la llista de seguiment',
@@ -244,6 +245,8 @@ $messages = array(
'tog-showhiddencats' => 'Mostra les categories ocultes',
'tog-noconvertlink' => 'Inhabilita la conversió dels títols dels enllaços',
'tog-norollbackdiff' => 'Omet la pàgina de diferències després de realitzar una reversió',
+'tog-useeditwarning' => "Avisa'm quan surti d'una pàgina d'edició amb canvis sense desar",
+'tog-prefershttps' => 'Utilitza sempre una connexió segura en iniciar una sessió',
'underline-always' => 'Sempre',
'underline-never' => 'Mai',
@@ -307,6 +310,18 @@ $messages = array(
'oct' => 'oct',
'nov' => 'nov',
'dec' => 'des',
+'january-date' => '$1 de gener',
+'february-date' => '$1 de febrer',
+'march-date' => '$1 de març',
+'april-date' => "$1 d'abril",
+'may-date' => '$1 de maig',
+'june-date' => '$1 de juny',
+'july-date' => '$1 de juliol',
+'august-date' => "$1 d'agost",
+'september-date' => '$1 de setembre',
+'october-date' => "$1 d'octubre",
+'november-date' => '$1 de novembre',
+'december-date' => '$1 de desembre',
# Categories related messages
'pagecategories' => '{{PLURAL:$1|Categoria|Categories}}',
@@ -389,6 +404,7 @@ $messages = array(
'create-this-page' => 'Crea aquesta pàgina',
'delete' => 'Elimina',
'deletethispage' => 'Elimina la pàgina',
+'undeletethispage' => "Desfés l'eliminació d'aquesta pàgina",
'undelete_short' => "Restaura {{PLURAL:$1|l'edició eliminada|$1 edicions eliminades}}",
'viewdeleted_short' => 'Mostra {{PLURAL:$1|una edició eliminada|$1 edicions eliminades}}',
'protect' => 'Protecció',
@@ -432,7 +448,7 @@ $1",
'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).
+# 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).
'aboutsite' => 'Quant al projecte {{SITENAME}}',
'aboutpage' => 'Project:Quant a',
'copyright' => "El contingut està disponible sota la llicència $1 si no s'indica el contrari.",
@@ -442,7 +458,6 @@ $1",
'disclaimers' => 'Avís general',
'disclaimerpage' => 'Project:Avís general',
'edithelp' => 'Ajuda',
-'edithelppage' => "Help:Com s'edita una pàgina",
'helppage' => 'Help:Ãndex',
'mainpage' => 'Pàgina principal',
'mainpage-description' => 'Pàgina principal',
@@ -519,17 +534,11 @@ Vegeu la llista de pàgines especials a [[Special:SpecialPages]].',
# General errors
'error' => 'Error',
'databaseerror' => "S'ha produït un error en la base de dades",
-'dberrortext' => "S'ha produït un error de sintaxi en una consulta a la base de dades.
-Açò podria indicar un error en el programari.
-La darrera consulta que s'ha intentat fer ha estat:
-<blockquote><code>$1</code></blockquote>
-des de la funció «<code>$2</code>».
-L'error de retorn ha estat «<samp>$3: $4</samp>».",
-'dberrortextcl' => "S'ha produït un error de sintaxi en una consulta a la base de dades.
-La darrera consulta que s'ha intentat fer ha estat:
-<blockquote><tt>$1</tt></blockquote>
-des de la funció «<tt>$2</tt>».
-L'error de retorn ha estat «<tt>$3: $4</tt>».",
+'databaseerror-text' => "S'ha produït un error en la consulta de la base de dades.
+Això pot indicar un error en el programari.",
+'databaseerror-textcl' => "S'ha produït un error en la consulta de la base de dades.",
+'databaseerror-query' => 'Consulta: $1',
+'databaseerror-function' => 'Funció: $1',
'laggedslavemode' => 'Avís: La pàgina podria mancar de modificacions recents.',
'readonly' => 'La base de dades es troba bloquejada',
'enterlockreason' => 'Escriviu una raó pel bloqueig, així com una estimació de quan tindrà lloc el desbloqueig',
@@ -563,6 +572,7 @@ Potser ja ha estat esborrat per algú altre.",
'cannotdelete-title' => 'No es pot suprimir la pàgina " $1 "',
'delete-hook-aborted' => 'Un «hook» ha interromput la supressió.
No ha donat cap explicació.',
+'no-null-revision' => "No s'ha pogut crear una nova revisió nul·la de la pàgina «$1»",
'badtitle' => 'El títol no és correcte',
'badtitletext' => 'El títol de la pàgina que heu introduït no és correcte, és en blanc o conté un enllaç trencat amb un altre projecte. També podria contenir algun caràcter no acceptat als títols de pàgina.',
'perfcached' => "Les dades següents es troben a la memòria cau i podrien no estar al dia. Hi ha un màxim {{PLURAL:$1|d'un resultat|de $1 resultats}} disponibles a la memòria cau.",
@@ -581,12 +591,15 @@ Consulta: $2',
'protectedinterface' => "Aquesta pàgina proporciona el text de la interfície del software d'aquest wiki i està protegida per evitar els abusos.
Per agregar o canviar les traduccions per a tots els wikis, si us plau fes servir [//translatewiki.net/ translatewiki.net], el projecte de localització de MediaWiki.",
'editinginterface' => "'''Avís:''' Esteu editant una pàgina que conté cadenes de text per a la interfície d'aquest programari. Tingueu en compte que els canvis que es fan a aquesta pàgina afecten a l'aparença de la interfície d'altres usuaris. Per afegir o modificar traduccions a totes les wikis, plantegeu-vos utilitzar la [//translatewiki.net/ translatewiki.net], el projecte de localització de MediaWiki.",
-'sqlhidden' => '(consulta SQL oculta)',
'cascadeprotected' => "Aquesta pàgina està protegida i no es pot modificar perquè està inclosa en {{PLURAL:$1|la següent pàgina, que té|les següents pàgines, que tenen}} activada l'opció de «protecció en cascada»:
$2",
'namespaceprotected' => "No teniu permís per a modificar pàgines en l'espai de noms '''$1'''.",
'customcssprotected' => "No teniu permisos per editar la pàgina CSS perquè conté els paràmetres personals d'un altre usuari.",
'customjsprotected' => "No teniu permisos per editar la pàgina JavaScript perquè conté els paràmetres personals d'un altre usuari.",
+'mycustomcssprotected' => 'No tens permís per editar aquesta pàgina CSS.',
+'mycustomjsprotected' => 'No tens permís per editar aquesta pàgina JavaScript.',
+'myprivateinfoprotected' => 'No tens permís per editar la teva informació privada.',
+'mypreferencesprotected' => 'No tens permís per editar les teves preferències.',
'ns-specialprotected' => 'No es poden modificar les pàgines especials.',
'titleprotected' => "La creació d'aquesta pàgina està protegida per [[User:$1|$1]].
Els seus motius han estat: «''$2''».",
@@ -610,10 +623,19 @@ Tingueu en compte que, fins que buideu la memòria cau del navegador, algunes pÃ
'welcomecreation-msg' => 'El vostre compte ha estat creat.
No oblideu de canviar les vostres [[Special:Preferences|preferències de {{SITENAME}}]].',
'yourname' => "Nom d'usuari",
+'userlogin-yourname' => 'Usuari',
+'userlogin-yourname-ph' => "Introduïu el vostre nom d'usuari",
+'createacct-another-username-ph' => "Introdueix el nom d'usuari",
'yourpassword' => 'Contrasenya',
+'userlogin-yourpassword' => 'Contrasenya',
+'userlogin-yourpassword-ph' => 'Introduïu la vostra contrasenya',
+'createacct-yourpassword-ph' => 'Introduïu una contrasenya',
'yourpasswordagain' => 'Escriviu una altra vegada la contrasenya',
+'createacct-yourpasswordagain' => 'Confirmeu la contrasenya',
+'createacct-yourpasswordagain-ph' => 'Introduïu de nou la contrasenya',
'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",
+'userlogin-remembermypassword' => 'Mantén-me connectat',
+'userlogin-signwithsecure' => 'Connexió segura',
'yourdomainname' => 'El vostre domini',
'password-change-forbidden' => 'No podeu canviar les contrasenyes en aquest wiki.',
'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.",
@@ -625,18 +647,44 @@ No oblideu de canviar les vostres [[Special:Preferences|preferències de {{SITEN
'logout' => 'Finalitza la sessió',
'userlogout' => 'Finalitza la sessió',
'notloggedin' => 'No us heu identificat',
+'userlogin-noaccount' => 'No teniu cap compte?',
+'userlogin-joinproject' => 'Uniu-vos a {{SITENAME}}',
'nologin' => "No teniu un compte? '''$1'''.",
'nologinlink' => 'Crea un compte',
'createaccount' => 'Crea un compte',
'gotaccount' => 'Ja teniu un compte? $1.',
'gotaccountlink' => 'Inicia una sessió',
'userlogin-resetlink' => "Heu oblidat les vostres dades d'accés?",
+'userlogin-resetpassword-link' => 'Reinicia la contrasenya',
+'helplogin-url' => 'Help:Registrar-se',
+'userlogin-helplink' => '[[{{MediaWiki:helplogin-url}}|Ajuda]]',
+'userlogin-loggedin' => 'Heu iniciat una sessió com {{GENDER:$1|$1}}.
+Feu servir el formulari de sota per iniciar la sessió com un altre usuari.',
+'userlogin-createanother' => 'Crea un altre compte',
+'createacct-join' => 'Introduïu les vostres dades.',
+'createacct-another-join' => 'Introdueix la informació del nou compte a continuació:',
+'createacct-emailrequired' => 'Adreça de correu electrònic',
+'createacct-emailoptional' => 'Adreça de correu electrònic (opcional)',
+'createacct-email-ph' => 'Introduïu la vostra adreça de correu electrònic',
+'createacct-another-email-ph' => 'Introdueix una adreça de correu electrònic',
'createaccountmail' => "Utilitza una contrasenya aleatòria temporal i envia-la a l'adreça de correu indicada",
+'createacct-realname' => 'Nom real (opcional)',
'createaccountreason' => 'Motiu:',
+'createacct-reason' => 'Motiu',
+'createacct-reason-ph' => 'Per què creeu un altre compte',
+'createacct-captcha' => 'Control de seguretat',
+'createacct-imgcaptcha-ph' => 'Introduïu el text que apareix a dalt',
+'createacct-submit' => 'Crea el meu compte',
+'createacct-another-submit' => 'Crea un altre compte',
+'createacct-benefit-heading' => '{{SITENAME}} és feta per gent com tu.',
+'createacct-benefit-body1' => '{{PLURAL:$1|edició|edicions}}',
+'createacct-benefit-body2' => '{{PLURAL:$1|pàgina|pàgines}}',
+'createacct-benefit-body3' => '{{PLURAL:$1|col·laborador recent|col·laboradors recents}}',
'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ó",
+'createacct-error' => 'Error de creació de compte',
'createaccounterror' => "No s'ha pogut crear el compte: $1",
'nocookiesnew' => "S'ha creat el compte d'usuari, però no esteu enregistrat. El projecte {{SITENAME}} usa galetes per enregistrar els usuaris. Si us plau activeu-les, per a poder enregistrar-vos amb el vostre nom d'usuari i la clau.",
'nocookieslogin' => 'El programari {{SITENAME}} utilitza galetes per enregistrar usuaris. Teniu les galetes desactivades. Activeu-les i torneu a provar.',
@@ -691,10 +739,12 @@ Introduïu una adreça amb un format adequat o bé buideu el camp.",
Si no hi teniu cap relació i aquest compte ha estat creat per error, simplement ignoreu el missatge.",
'usernamehasherror' => "El nom d'usuari no pot contenir caràcters hash",
'login-throttled' => "Heu realitzat massa intents d'accés a la sessió.
-Si us plau, esperi abans de tornar-ho a intentar.",
+Espereu $1 abans de tornar-ho a provar.",
'login-abort-generic' => "L'entrada al compte d'usuari no ha reeixit - Abortada",
'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.",
+'createacct-another-realname-tip' => "El nom real és opcional.
+Si decidiu proporcionar-lo, s'utilitzarà per a reconèixer a l'usuari el seu treball.",
# Email sending
'php-mail-error-unknown' => 'Error desconegut en la funció mail() de PHP',
@@ -710,8 +760,7 @@ Si us plau, esperi abans de tornar-ho a intentar.",
'newpassword' => 'Contrasenya nova',
'retypenew' => 'Torneu a escriure la nova contrasenya:',
'resetpass_submit' => 'Definiu una contrasenya i inicieu una sessió',
-'resetpass_success' => "La vostra contrasenya s'ha canviat correctament!
-Ara s'està iniciant la sessió...",
+'changepassword-success' => "S'ha canviat la vostra contrasenya amb èxit!",
'resetpass_forbidden' => 'No poden canviar-se les contrasenyes',
'resetpass-no-info' => "Heu d'estar registrats en un compte per a poder accedir directament a aquesta pàgina.",
'resetpass-submit-loggedin' => 'Canvia la contrasenya',
@@ -723,10 +772,11 @@ Deveu haver canviat la vostra contrasenya o demanat una nova contrasenya tempora
# Special:PasswordReset
'passwordreset' => 'Restablir contrasenya',
-'passwordreset-text' => 'Completeu el següent formulari per reinicialitzar la vostra contrasenya',
+'passwordreset-text-one' => 'Cal completar aquest formulari per reiniciar la contrasenya',
+'passwordreset-text-many' => '{{PLURAL:$1|Ompliu un dels camps per a reiniciar la vostra contrasenya.}}',
'passwordreset-legend' => 'Restablir contrasenya',
'passwordreset-disabled' => "S'ha desactivat el restabliment de contranyes en aquest wiki.",
-'passwordreset-pretext' => '{{PLURAL:$1||Introduïu un dels elements de dades següents}}',
+'passwordreset-emaildisabled' => 'Les opcions de correu electrònic no estan habilitades en aquest wiki.',
'passwordreset-username' => "Nom d'usuari:",
'passwordreset-domain' => 'Domini',
'passwordreset-capture' => 'Veure el missatge de correu electrònic?',
@@ -749,7 +799,7 @@ Hauríeu d'entrar ara per fixar una nova contrasenya. Si algú que no sou vós Ã
Contrasenya temporal: $2",
'passwordreset-emailsent' => "S'ha enviat un correu de reinicialització de contrasenya.",
'passwordreset-emailsent-capture' => "S'ha enviat un correu electrònic de reinicialització de contrasenya, tal com es mostra a continuació.",
-'passwordreset-emailerror-capture' => "S'ha generat un missatge recordatori de correu electrònic, que es mostra a continuació, però ha fallat l'enviament a l'usuari: $1",
+'passwordreset-emailerror-capture' => "S'ha generat un correu electrònic de renovació de contrasenya, que es mostra a continuació, però ha fallat l'enviament a {{GENDER:$2:l'usuari|la usuària}}: $1",
# Special:ChangeEmail
'changeemail' => 'Canvi de correu electrònic',
@@ -763,6 +813,19 @@ Contrasenya temporal: $2",
'changeemail-submit' => 'Canvia de correu electrònic',
'changeemail-cancel' => 'Cancel·la',
+# Special:ResetTokens
+'resettokens' => 'Reinicia els testimonis',
+'resettokens-text' => "Des d'aquí podeu reiniciar els testimonis que permeten l'accés a certes dades privades associades amb el vostre compte.
+
+Ho hauríeu de fer si accidentalment els heu compartit amb algú o si el vostre compte ha estat compromès.",
+'resettokens-no-tokens' => 'No hi ha testimonis per reiniciar.',
+'resettokens-legend' => 'Reinicia els testimonis',
+'resettokens-tokens' => 'Testimonis:',
+'resettokens-token-label' => '$1 (valor actual: $2)',
+'resettokens-watchlist-token' => 'Testimoni del canal web (Atom/RSS) dels [[Special:Watchlist|canvis a la llista de seguiment]]',
+'resettokens-done' => "S'han reiniciat els testimonis.",
+'resettokens-resetbutton' => 'Reinicia els testimonis seleccionats',
+
# Edit page toolbar
'bold_sample' => 'Text en negreta',
'bold_tip' => 'Text en negreta',
@@ -957,12 +1020,15 @@ No s'ha donat cap explicació.",
Sembla haver estat esborrada.",
'edit-conflict' => "Conflicte d'edició.",
'edit-no-change' => 'La vostra modificació ha estat ignorada perquè no feia cap canvi al text.',
+'postedit-confirmation' => 'La modificació ha estat desada.',
'edit-already-exists' => "No s'ha pogut crear una pàgina.
Ja existeix.",
'defaultmessagetext' => 'Missatge per defecte',
'content-failed-to-parse' => "Ha fallat l'anàlisi del contingut de $2 per al model $1: $3",
'invalid-content-data' => 'Dades de contingut no vàlides',
'content-not-allowed-here' => 'No és permés el contingut "$1" a la pàgina [[$2]]',
+'editwarning-warning' => "Si sortiu d'aquesta pàgina perdreu tots els canvis que hàgiu fet.
+Si teniu un compte d'usuari, podeu eliminar aquest avís a la secció «Caixa d'edició» de les vostres preferències.",
# Content models
'content-model-wikitext' => 'wikitext',
@@ -997,6 +1063,7 @@ Se n'han omès els arguments.",
'undo-failure' => 'No pot desfer-se la modificació perquè hi ha edicions entre mig que hi entren en conflicte.',
'undo-norev' => "No s'ha pogut desfer l'edició perquè no existeix o ha estat esborrada.",
'undo-summary' => 'Es desfà la revisió $1 de [[Special:Contributions/$2|$2]] ([[User talk:$2|Discussió]])',
+'undo-summary-username-hidden' => "Desfés la revisió $1 d'un usuari ocult",
# Account creation failure
'cantcreateaccounttitle' => 'No es pot crear el compte',
@@ -1176,6 +1243,7 @@ Assegureu-vos que aquest canvi mantindrà la continuïtat històrica de la pàgi
'compareselectedversions' => 'Compara les versions seleccionades',
'showhideselectedversions' => 'Mostra/oculta les versions seleccionades',
'editundo' => 'desfés',
+'diff-empty' => '(Cap diferència)',
'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}})",
'difference-missing-revision' => "{{PLURAL:$2|Una revisió|$2 revisions}} d'aquesta diferència ($1) no {{PLURAL:$2|s'ha|s'han}} trobat.
@@ -1203,7 +1271,6 @@ Es pot trobar més informació en el [{{fullurl:{{#Special:Log}}/delete|page={{F
'searchmenu-legend' => 'Opcions de cerca',
'searchmenu-exists' => "'''Hi ha una pàgina anomenada «[[:$1]]» en aquest wiki'''",
'searchmenu-new' => "'''Creeu la pàgina «[[:$1]]» en aquest wiki!'''",
-'searchhelp-url' => 'Help:Ajuda',
'searchmenu-prefix' => '[[Special:PrefixIndex/$1|Mostra pàgines amb aquest prefix]]',
'searchprofile-articles' => 'Pàgines de contingut',
'searchprofile-project' => "Pàgines d'ajuda i de projecte",
@@ -1244,15 +1311,7 @@ Es pot trobar més informació en el [{{fullurl:{{#Special:Log}}/delete|page={{F
'powersearch-togglenone' => 'Cap',
'search-external' => 'Cerca externa',
'searchdisabled' => 'La cerca dins el projecte {{SITENAME}} està inhabilitada. Mentrestant, podeu cercar a través de Google, però tingueu en compte que la seua base de dades no estarà actualitzada.',
-
-# Quickbar
-'qbsettings' => 'Quickbar',
-'qbsettings-none' => 'Cap',
-'qbsettings-fixedleft' => "Fixa a l'esquerra",
-'qbsettings-fixedright' => 'Fixa a la dreta',
-'qbsettings-floatingleft' => "Surant a l'esquerra",
-'qbsettings-floatingright' => 'Surant a la dreta',
-'qbsettings-directionality' => "Fix, segons la direcció d'escriptura del vostre idioma",
+'search-error' => "S'ha produït un error durant la recerca: $1",
# Preferences page
'preferences' => 'Preferències',
@@ -1286,7 +1345,6 @@ Es pot trobar més informació en el [{{fullurl:{{#Special:Log}}/delete|page={{F
'resetprefs' => 'Esborra els canvis no guardats',
'restoreprefs' => 'Restaura les preferències per defecte',
'prefs-editing' => "Caixa d'edició",
-'prefs-edit-boxsize' => "Mida de la finestra d'edició.",
'rows' => 'Files',
'columns' => 'Columnes',
'searchresultshead' => 'Preferències de la cerca',
@@ -1297,9 +1355,9 @@ Es pot trobar més informació en el [{{fullurl:{{#Special:Log}}/delete|page={{F
'recentchangesdays-max' => '(màxim $1 {{PLURAL:$1|dia|dies}})',
'recentchangescount' => "Nombre d'edicions a mostrar per defecte:",
'prefs-help-recentchangescount' => 'Inclou els canvis recents, els historials de pàgines i els registres.',
-'prefs-help-watchlist-token' => 'Si ompliu aquest camp amb una clau secreta es generarà un fil RSS per a la vostra llista de seguiment.
-Aquell qui conegui aquesta clau serà capaç de llegir la vostra llista de seguiment, per tant esculliu un valor segur.
-A continuació es mostra un valor generat de forma aleatòria que podeu fer servir: $1',
+'prefs-help-watchlist-token2' => 'Aquesta és la clau secreta pel canal de continguts de la vostra llista de seguiment.
+Qualsevol que la conegui podria llegir la vostra llista de seguiment, així que no la compartiu.
+[[Special:ResetTokens|Cliqueu aquí si voleu restaurar-la]].',
'savedprefs' => "S'han desat les vostres preferències",
'timezonelegend' => 'Fus horari:',
'localtime' => 'Hora local:',
@@ -1330,7 +1388,6 @@ A continuació es mostra un valor generat de forma aleatòria que podeu fer serv
'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:',
-'prefs-textboxsize' => "Mida de la caixa d'edició",
'youremail' => 'Correu electrònic:',
'username' => "{{GENDER:$1|Nom d'usuari}}:",
'uid' => "{{GENDER:$1|Usuari}} Identificador d'usuari:",
@@ -1361,6 +1418,8 @@ Ha de tenir com a molt {{PLURAL:$1|un caràcter|$1 caràcters}}.',
'prefs-dateformat' => 'Format de la data',
'prefs-timeoffset' => 'Decalatge horari',
'prefs-advancedediting' => 'Opcions generals',
+'prefs-editor' => 'Edició',
+'prefs-preview' => 'Previsualització',
'prefs-advancedrc' => 'Opcions avançades',
'prefs-advancedrendering' => 'Opcions avançades',
'prefs-advancedsearchoptions' => 'Opcions avançades',
@@ -1368,7 +1427,9 @@ Ha de tenir com a molt {{PLURAL:$1|un caràcter|$1 caràcters}}.',
'prefs-displayrc' => "Opcions d'aparença",
'prefs-displaysearchoptions' => 'Opcions de visualització',
'prefs-displaywatchlist' => 'Opcions de visualització',
+'prefs-tokenwatchlist' => 'Testimoni',
'prefs-diffs' => 'Difs',
+'prefs-help-prefershttps' => 'Aquesta preferència tindrà efecte quan inicieu una nova sessió.',
# User preference: email validation using jQuery
'email-address-validity-valid' => "L'adreça de correu electrònic sembla vàlida",
@@ -1395,6 +1456,8 @@ Ha de tenir com a molt {{PLURAL:$1|un caràcter|$1 caràcters}}.',
'userrights-notallowed' => "No teniu autorització per concedir o retirar permisos d'usuari.",
'userrights-changeable-col' => 'Grups que podeu canviar',
'userrights-unchangeable-col' => 'Grups que no podeu canviar',
+'userrights-conflict' => "Conflicte de canvis dels permisos d'usuari. Reviseu i confirmeu els canvis.",
+'userrights-removed-self' => 'Heu suprimit els propis permisos correctament. Per tant, ja no podreu tornar a accedir a aquesta pàgina.',
# Groups
'group' => 'Grup:',
@@ -1460,11 +1523,19 @@ Ha de tenir com a molt {{PLURAL:$1|un caràcter|$1 caràcters}}.',
'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-editprotected' => 'Modificar pàgines protegides (sense protecció de cascada)',
+'right-editsemiprotected' => 'Edita les pàgines protegides com «{{int:protect-level-autoconfirmed}}»',
'right-editinterface' => "Editar la interfície d'usuari",
'right-editusercssjs' => "Editar els fitxers de configuració CSS i JS d'altres usuaris",
'right-editusercss' => "Editar els fitxers de configuració CSS d'altres usuaris",
'right-edituserjs' => "Editar els fitxers de configuració JS d'altres usuaris",
+'right-editmyusercss' => 'Editeu els fitxers CSS propis',
+'right-editmyuserjs' => 'Editeu els propis fitxers de JavaScript',
+'right-viewmywatchlist' => 'Mostra la llista de seguiment pròpia',
+'right-editmywatchlist' => 'Edita la llista de seguiment pròpia. Tingueu en compte que algunes accions encara afegiran pàgina fins i tot sense aquest permís.',
+'right-viewmyprivateinfo' => 'Mostra les dades privades (p. ex., adreça electrònica o nom real)',
+'right-editmyprivateinfo' => 'Modifica les dades privades (p. ex., adreça electrònica o nom real)',
+'right-editmyoptions' => 'Edita les pròpies preferències',
'right-rollback' => "Revertir ràpidament l'últim editor d'una pàgina particular",
'right-markbotedits' => 'Marcar les reversions com a edicions de bot',
'right-noratelimit' => "No veure's afectat pels límits d'accions",
@@ -1526,12 +1597,19 @@ Ha de tenir com a molt {{PLURAL:$1|un caràcter|$1 caràcters}}.',
'action-userrights-interwiki' => "modificar permisos d'usuari en altres wikis",
'action-siteadmin' => 'bloquejar o desbloquejar la base de dades',
'action-sendemail' => 'enviar missatges de correu',
+'action-editmywatchlist' => 'edita la llista de seguiment',
+'action-viewmywatchlist' => 'mostra la llista de seguiment',
+'action-viewmyprivateinfo' => 'mostra la informació personal',
+'action-editmyprivateinfo' => 'edita la informació personal',
# Recent changes
'nchanges' => '$1 {{PLURAL:$1|canvi|canvis}}',
+'enhancedrc-since-last-visit' => '$1 {{PLURAL:$1|des de la darrera visita}}',
+'enhancedrc-history' => 'historial',
'recentchanges' => 'Canvis recents',
'recentchanges-legend' => 'Opcions de canvis recents',
'recentchanges-summary' => 'Seguiu els canvis recents del projecte {{SITENAME}} en aquesta pàgina.',
+'recentchanges-noresult' => 'Cap canvi corresponent a aquests criteris en el període indicat.',
'recentchanges-feed-description' => 'Segueix en aquest canal els canvis més recents del wiki.',
'recentchanges-label-newpage' => 'Aquesta modificació inicià una pàgina',
'recentchanges-label-minor' => 'Aquesta és una modificació menor',
@@ -1568,7 +1646,6 @@ Ha de tenir com a molt {{PLURAL:$1|un caràcter|$1 caràcters}}.',
'recentchangeslinked-feed' => 'Canvis relacionats',
'recentchangeslinked-toolbox' => "Seguiment d'enllaços",
'recentchangeslinked-title' => 'Canvis relacionats amb «$1»',
-'recentchangeslinked-noresult' => 'No ha hagut cap canvi a les pàgines enllaçades durant el període de temps.',
'recentchangeslinked-summary' => "A continuació trobareu una llista dels canvis recents a les pàgines enllaçades des de la pàgina donada (o entre els membres d'una categoria especificada).
Les pàgines de la vostra [[Special:Watchlist|llista de seguiment]] apareixen en '''negreta'''.",
'recentchangeslinked-page' => 'Nom de la pàgina:',
@@ -1580,8 +1657,7 @@ Les pàgines de la vostra [[Special:Watchlist|llista de seguiment]] apareixen en
'reuploaddesc' => 'Torna al formulari per apujar.',
'upload-tryagain' => 'Envia la descripció del fitxer modificat',
'uploadnologin' => 'No heu iniciat una sessió',
-'uploadnologintext' => "Heu d'[[Special:UserLogin|iniciar una sessió]]
-per a penjar-hi fitxers.",
+'uploadnologintext' => 'Heu de $1 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",
@@ -1787,7 +1863,6 @@ Per seguretat, img_auth.php està desactivat.",
'http-read-error' => 'Error de lectura HTTP.',
'http-timed-out' => 'La petició HTTP ha expirat.',
'http-curl-error' => "Error en recuperar l'URL: $1",
-'http-host-unreachable' => "No s'ha pogut accedir a l'URL.",
'http-bad-status' => 'Hi ha hagut un problema durant la petició HTTP: $1 $2',
# Some likely curl errors. More could be added from <http://curl.haxx.se/libcurl/c/libcurl-errors.html>
@@ -1816,6 +1891,9 @@ Si filtreu per usuari només es mostraran els fitxers la versió més recent del
'listfiles_size' => 'Mida (octets)',
'listfiles_description' => 'Descripció',
'listfiles_count' => 'Versions',
+'listfiles-show-all' => 'Inclou versions antigues de les imatges',
+'listfiles-latestversion' => 'Versió actual',
+'listfiles-latestversion-yes' => 'Sí',
# File description page
'file-anchor-link' => 'Fitxer',
@@ -1910,6 +1988,13 @@ Potser voleu modificar-ne la descripció en la seva [$2 pàgina de descripció].
'randompage' => "Pàgina a l'atzar",
'randompage-nopages' => "No hi ha cap pàgina en {{PLURAL:$2|l'espai de noms següent|els espais de noms següents}}: $1.",
+# Random page in category
+'randomincategory' => 'Pàgina aleatòria en la categoria',
+'randomincategory-invalidcategory' => '«$1» no és un nom de categoria vàlid.',
+'randomincategory-nopages' => 'No hi ha pàgines a la categoria [[:Category:$1|$1]].',
+'randomincategory-selectcategory' => "Obté una pàgina a l'atzar de la categoria: $1 $2.",
+'randomincategory-selectcategory-submit' => 'Vés-hi',
+
# Random redirect
'randomredirect' => "Redirecció a l'atzar",
'randomredirect-nopages' => "No hi ha cap redirecció a l'espai de noms «$1».",
@@ -1935,17 +2020,13 @@ Potser voleu modificar-ne la descripció en la seva [$2 pàgina de descripció].
'statistics-users-active-desc' => "Usuaris que han dut a terme alguna acció en {{PLURAL:$1|l'últim dia|els últims $1 dies}}",
'statistics-mostpopular' => 'Pàgines més visualitzades',
-'disambiguations' => 'Pàgines que enllacen a pàgines de desambiguació',
-'disambiguationspage' => 'Template:Desambiguació',
-'disambiguations-text' => "Les següents pàgines tenen algun enllaç a una '''pàgina de desambiguació'''.
-És possible que hagin d'enllaçar a una altra pàgina més apropiada.<br />
-Una pàgina es tracta com de desambiguació si utilitza una plantilla que està enllaçada a [[MediaWiki:Disambiguationspage]].",
-
'pageswithprop' => 'Pàgines amb una propietat de pàgina',
'pageswithprop-legend' => 'Pàgines amb una propietat de pàgina',
'pageswithprop-text' => 'Aquesta pàgina llista les pàgines que utilitzen una propietat de pàgina en particular.',
'pageswithprop-prop' => 'Nom de la propietat:',
'pageswithprop-submit' => 'Vés',
+'pageswithprop-prophidden-long' => 'valor de propietat text llarg ocult ($1)',
+'pageswithprop-prophidden-binary' => 'valor de propietat binària oculta ($1)',
'doubleredirects' => 'Redireccions dobles',
'doubleredirectstext' => 'Aquesta pàgina llista les pàgines que redirigeixen a altres pàgines de redirecció.
@@ -2003,6 +2084,7 @@ Les entrades <del>ratllades</del> s\'han resolt.',
'mostrevisions' => 'Pàgines més modificades',
'prefixindex' => 'Totes les pàgines per prefix',
'prefixindex-namespace' => 'Totes les pàgines amb prefix (espai de noms $1)',
+'prefixindex-strip' => 'Suprimeix el prefix a la llista',
'shortpages' => 'Pàgines curtes',
'longpages' => 'Pàgines llargues',
'deadendpages' => 'Pàgines atzucac',
@@ -2018,6 +2100,7 @@ Les entrades <del>ratllades</del> s\'han resolt.',
'listusers' => "Llista d'usuaris",
'listusers-editsonly' => 'Mostra només usuaris amb edicions',
'listusers-creationsort' => 'Ordena per data de creació',
+'listusers-desc' => 'Ordena en ordre descendent',
'usereditcount' => '$1 {{PLURAL:$1|modificació|modificacions}}',
'usercreated' => '{{GENDER:$3|Creat}}: $1 a les $2',
'newpages' => 'Pàgines noves',
@@ -2194,10 +2277,9 @@ S\'hi mostraran els canvis futurs que tinguin lloc en aquesta pàgina i la corre
'unwatchthispage' => 'Desatén',
'notanarticle' => 'No és una pàgina amb contingut',
'notvisiblerev' => 'La versió ha estat esborrada',
-'watchnochange' => "No s'ha editat cap dels elements que vigileu en el període de temps que es mostra.",
'watchlist-details' => 'Teniu $1 {{PLURAL:$1|pàgina vigilada|pàgines vigilades}}, sense comptar les pàgines de discussió.',
-'wlheader-enotif' => "* S'ha habilitat la notificació per correu electrònic.",
-'wlheader-showupdated' => "* Les pàgines que s'han canviat des de la vostra darrera visita es mostren '''en negreta'''",
+'wlheader-enotif' => 'La notificació per correu electrònic està habilitada.',
+'wlheader-showupdated' => "Les pàgines que s'han canviat des de la vostra darrera visita es mostren en '''negreta'''.",
'watchmethod-recent' => "s'està comprovant si hi ha pàgines vigilades en les edicions recents",
'watchmethod-list' => "s'està comprovant si hi ha edicions recents en les pàgines vigilades",
'watchlistcontains' => 'La vostra llista de seguiment conté {{PLURAL:$1|una única pàgina|$1 pàgines}}.',
@@ -2445,7 +2527,7 @@ $1",
'contributions' => "Contribucions de {{GENDER:$1|l'usuari|la usuària}}",
'contributions-title' => "Contribucions de l'usuari $1",
'mycontris' => 'Contribucions',
-'contribsub2' => 'Per $1 ($2)',
+'contribsub2' => 'Per a {{GENDER:$3|$1}} ($2)',
'nocontribs' => "No s'ha trobat canvis que encaixessin amb aquests criteris.",
'uctop' => '(actual)',
'month' => 'Mes (i anteriors):',
@@ -2605,13 +2687,11 @@ Per més detalls, a sota es mostra el registre de supressions:',
'ipb_blocked_as_range' => "Error: L'adreça IP $1 no està blocada directament i per tant no pot ésser desbloquejada. Ara bé, sí que ho està per formar part del rang $2 que sí que pot ser desblocat.",
'ip_range_invalid' => 'Rang de IP no vàlid.',
'ip_range_toolarge' => 'No estan permesos el bloquejos de rangs més grans que /$1.',
-'blockme' => "Bloca'm",
'proxyblocker' => 'Bloqueig de proxy',
-'proxyblocker-disabled' => "S'ha inhabilitat la funció.",
'proxyblockreason' => "La vostra adreça IP ha estat bloquejada perquè és un proxy obert. Si us plau contactau el vostre proveïdor d'Internet o servei tècnic i informau-los d'aquest seriós problema de seguretat.",
-'proxyblocksuccess' => 'Fet.',
'sorbsreason' => "La vostra adreça IP està llistada com a servidor intermediari (''proxy'') obert dins la llista negra de DNS que fa servir el projecte {{SITENAME}}.",
'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",
+'xffblockreason' => "Una adreça IP present en la capçalera X-Forwarded-For, ja sigui vostra o la d'un servidor proxy que esteu utilitzant, ha estat blocada. El motiu inicial del bloqueig és: $1",
'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}}.',
@@ -2776,6 +2856,8 @@ En el darrer cas, podeu fer servir un enllaç com ara [[{{#Special:Export}}/{{Me
'thumbnail-more' => 'Amplia',
'filemissing' => 'Fitxer inexistent',
'thumbnail_error' => "S'ha produït un error en crear la miniatura: $1",
+'thumbnail_error_remote' => "Missatge d'error de $1:
+$2",
'djvu_page_error' => "La pàgina DjVu està fora de l'abast",
'djvu_no_xml' => "No s'ha pogut recollir l'XML per al fitxer DjVu",
'thumbnail-temp-create' => "No s'ha pogut creat el fitxer de miniatura temporal",
@@ -3002,8 +3084,6 @@ Això deu ser degut per un enllaç a un lloc extern inclòs a la llista negra.',
'pageinfo-category-files' => "Nombre d'arxius",
# Skin names
-'skinname-standard' => 'Clàssic',
-'skinname-nostalgia' => 'Nostàlgia',
'skinname-cologneblue' => 'Colònia blava',
# Patrolling
@@ -3082,11 +3162,25 @@ Si l'executeu, podeu comprometre la seguretat del vostre sistema.",
'minutes' => '{{PLURAL:$1|$1 minut|$1 minuts}}',
'hours' => '{{PLURAL:$1|$1 hora|$1 hores}}',
'days' => '{{PLURAL:$1|$1 dia|$1 dies}}',
+'weeks' => '{{PLURAL:$1|$1 setmana|$1 setmanes}}',
'months' => '{{PLURAL:$1|$1 mes|$1 mesos}}',
'years' => '{{PLURAL:$1|$1 any|$1 anys}}',
'ago' => 'fa $1',
'just-now' => 'ara mateix',
+# Human-readable timestamps
+'hours-ago' => 'fa $1 {{PLURAL:$1|hora|hores}}',
+'minutes-ago' => 'fa $1 {{PLURAL:$1|minut|minuts}}',
+'seconds-ago' => 'fa $1 {{PLURAL:$1|segon|segons}}',
+'monday-at' => 'Dilluns a les $1',
+'tuesday-at' => 'Dimarts a les $1',
+'wednesday-at' => 'Dimecres a les $1',
+'thursday-at' => 'Dijous a les $1',
+'friday-at' => 'Divendres a les $1',
+'saturday-at' => 'Dissabte a les $1',
+'sunday-at' => 'Diumenge a les $1',
+'yesterday-at' => 'Ahir a les $1',
+
# Bad image list
'bad_image_list' => "El format ha de ser el següent:
@@ -3113,7 +3207,7 @@ La resta d'enllaços de la línia són les excepcions, és a dir, les pàgines o
* gpslongitude
* gpsaltitude",
-# EXIF tags
+# Exif tags
'exif-imagewidth' => 'Amplada',
'exif-imagelength' => 'Alçada',
'exif-bitspersample' => 'Octets per component',
@@ -3291,7 +3385,7 @@ La resta d'enllaços de la línia són les excepcions, és a dir, les pàgines o
'exif-originalimageheight' => 'Alçada de la imatge abans que fos retallada',
'exif-originalimagewidth' => 'Amplada de la imatge abans que fos retallada',
-# EXIF attributes
+# Exif attributes
'exif-compression-1' => 'Sense compressió',
'exif-compression-2' => 'Codificació CCITT Grup 3 longitud monodimensional de Huffman modificat',
'exif-compression-3' => 'Codificació de fax CCITT grup 3',
@@ -3689,7 +3783,6 @@ També podeu [[Special:EditWatchlist|utilitzar l'editor estàndard]].",
'version-other' => 'Altres',
'version-mediahandlers' => 'Connectors multimèdia',
'version-hooks' => 'Lligams',
-'version-extension-functions' => "Funcions d'extensió",
'version-parser-extensiontags' => "Etiquetes d'extensió de l'analitzador",
'version-parser-function-hooks' => "Lligams funcionals de l'analitzador",
'version-hook-name' => 'Nom del lligam',
@@ -3698,6 +3791,7 @@ També podeu [[Special:EditWatchlist|utilitzar l'editor estàndard]].",
'version-license' => 'Llicència',
'version-poweredby-credits' => "El wiki funciona gràcies a '''[//www.mediawiki.org/ MediaWiki]''', copyright © 2001-$1 $2.",
'version-poweredby-others' => 'altres',
+'version-poweredby-translators' => 'Traductors de translatewiki.net',
'version-credits-summary' => 'El nostre reconeixement a les següents persones per la seva aportació a [[Special:Version|MediaWiki]]',
'version-license-info' => "MediaWiki és programari lliure, podeu redistribuir-lo i/o modificar-lo sota els termes de la Llicència Pública General GNU publicada per la Free Software Foundation, ja sigui de la seva versió 2 o (a elecció vostra) qualsevol versió posterior.
@@ -3711,12 +3805,17 @@ Amb aquest programa heu d'haver rebut [{{SERVER}}{{SCRIPTPATH}}/COPYING una còp
'version-entrypoints-header-entrypoint' => "Punt d'entrada",
'version-entrypoints-header-url' => 'URL',
-# Special:FilePath
-'filepath' => 'Camí del fitxer',
-'filepath-page' => 'Fitxer:',
-'filepath-submit' => 'Vés-hi',
-'filepath-summary' => "Aquesta pàgina especial retorna un camí complet d'un fitxer.
-Les imatges es mostren en plena resolució; altres tipus de fitxer s'inicien directament amb el seu programa associat.",
+# Special:Redirect
+'redirect' => 'Redirigeix per fitxer, usuari o ID de la revisió',
+'redirect-legend' => 'Redirigeix a un fitxer o a una pàgina',
+'redirect-summary' => "Aquesta pàgina especial redirigeix a un fitxer (donat el nom del fitxer), una pàgina (donada un ID de la revisió), o a una pàgina d'usuari (donat un ID numèric d'usuari).",
+'redirect-submit' => 'Vés-hi',
+'redirect-lookup' => 'Consulta:',
+'redirect-value' => 'Valor:',
+'redirect-user' => "ID d'usuari",
+'redirect-revision' => 'Revisió de la pàgina',
+'redirect-file' => 'Nom del fitxer',
+'redirect-not-exists' => "No s'ha trobat el valor",
# Special:FileDuplicateSearch
'fileduplicatesearch' => 'Cerca fitxers duplicats',
@@ -3766,12 +3865,15 @@ Les imatges es mostren en plena resolució; altres tipus de fitxer s'inicien dir
'tags' => 'Etiquetes de canvi vàlides',
'tag-filter' => "Filtre d'[[Special:Tags|etiquetes]]:",
'tag-filter-submit' => 'Filtra',
+'tag-list-wrapper' => '([[Special:Tags|{{PLURAL:$1|Etiqueta|Etiquetes}}]]: $2)',
'tags-title' => 'Etiquetes',
'tags-intro' => 'Aquesta pàgina llista les etiquetes amb les què el programari pot marcar una modificació, i llur significat.',
'tags-tag' => "Nom de l'etiqueta",
'tags-display-header' => 'Aparença de la llista de canvis',
'tags-description-header' => 'Descripció completa del significat',
+'tags-active-header' => 'Actiu?',
'tags-hitcount-header' => 'Canvis etiquetats',
+'tags-active-yes' => 'Sí',
'tags-edit' => 'modifica',
'tags-hitcount' => '$1 {{PLURAL:$1|canvi|canvis}}',
@@ -3792,6 +3894,7 @@ Les imatges es mostren en plena resolució; altres tipus de fitxer s'inicien dir
'dberr-problems' => 'Ho sentim. Aquest lloc web està experimentant dificultats tècniques.',
'dberr-again' => 'Intenteu esperar uns minuts i tornar a carregar.',
'dberr-info' => '(No es pot contactar amb el servidor de dades: $1)',
+'dberr-info-hidden' => '(No es pot contactar amb el servidor de la base de dades)',
'dberr-usegoogle' => 'Podeu intentar fer la cerca via Google mentrestant.',
'dberr-outofdate' => 'Tingueu en compte que la seva indexació del nostre contingut pot no estar actualitzada.',
'dberr-cachederror' => 'A continuació hi ha una còpia emmagatzemada de la pàgina demanada, que pot no estar actualitzada.',
@@ -3807,6 +3910,9 @@ Les imatges es mostren en plena resolució; altres tipus de fitxer s'inicien dir
'htmlform-submit' => 'Tramet',
'htmlform-reset' => 'Desfés els canvis',
'htmlform-selectorother-other' => 'Altres',
+'htmlform-no' => 'No',
+'htmlform-yes' => 'Sí',
+'htmlform-chosen-placeholder' => 'Seleccioneu una opció',
# SQLite database support
'sqlite-has-fts' => '$1, amb suport de búsqueda de text íntegre',
@@ -3924,4 +4030,19 @@ Altrament, podeu fer servir un senzill formulari a continuació. El vostre comen
# Image rotation
'rotate-comment' => 'Imatge girada $1 {{PLURAL:$1|grau|graus}} en el sentit de les agulles del rellotge',
+# Limit report
+'limitreport-title' => "Perfil de dades de l'analitzador:",
+'limitreport-cputime' => "Temps d'ús de CPU",
+'limitreport-cputime-value' => '$1 {{PLURAL:$1|segon|segons}}',
+'limitreport-walltime' => "Temps real d'ús",
+'limitreport-walltime-value' => '$1 {{PLURAL:$1|segon|segons}}',
+'limitreport-ppvisitednodes' => 'Nombre de nodes visitats pel preprocessador',
+'limitreport-ppgeneratednodes' => 'Nombre de nodes generats pel preprocessador',
+'limitreport-postexpandincludesize' => "Mida d'inclusió post-expansió",
+'limitreport-postexpandincludesize-value' => '$1/$2 {{PLURAL:$2|byte|bytes}}',
+'limitreport-templateargumentsize' => "Mida de l'argument de plantilla",
+'limitreport-templateargumentsize-value' => '$1/$2 {{PLURAL:$2|byte|bytes}}',
+'limitreport-expansiondepth' => "Profunditat màxima d'expansió",
+'limitreport-expensivefunctioncount' => "Número de funcions d'anàlisi dispendioses",
+
);
diff --git a/languages/messages/MessagesCbk_zam.php b/languages/messages/MessagesCbk_zam.php
index 3273f677..b58427e2 100644
--- a/languages/messages/MessagesCbk_zam.php
+++ b/languages/messages/MessagesCbk_zam.php
@@ -115,8 +115,8 @@ Por favor mira tambien el maga [[Special:WantedCategories|categoria requeridas]]
# Watchlist
'watch' => 'Vicia',
-'created' => 'creao',
'changed' => 'cambiao',
+'created' => 'creao',
# Delete
'actioncomplete' => 'Completo el accion',
diff --git a/languages/messages/MessagesCdo.php b/languages/messages/MessagesCdo.php
index da6ad8ca..7c96e25d 100644
--- a/languages/messages/MessagesCdo.php
+++ b/languages/messages/MessagesCdo.php
@@ -45,7 +45,6 @@ $messages = array(
'tog-shownumberswatching' => '顯示監視用戶其數é‡',
'tog-oldsig' => '存在其簽å',
'tog-fancysig' => '共簽å當æˆç¶­åŸºæ–‡æœ¬ï¼ˆç„¡è‡ªå‹•éˆæŽ¥ï¼‰',
-'tog-showjumplinks' => 'å…許「跳é˜ã€å¯è¨ªå•å…¶éˆæŽ¥',
'tog-uselivepreview' => '使å³æ™‚é è¦½ï¼ˆæ•†ð¡…實驗)',
'tog-forceeditsummary' => 'æ醒我行é˜èœ€è†ç©ºç™½å…¶ç·¨è¼¯ç¸½çµ',
'tog-watchlisthideown' => 'è¶ç›£è¦–å–®ð¡…è—起我其修改',
@@ -58,6 +57,7 @@ $messages = array(
'tog-diffonly' => '伓使敆下底其顯示ð£èœ€æ§˜å…¶åœ°æ–¹é¡¯ç¤ºé é¢å…§å®¹',
'tog-showhiddencats' => '㪗è—類別',
'tog-norollbackdiff' => '敆回滾其時候,無å•ð£èœ€æ§˜å…¶åœ°æ–¹',
+'tog-useeditwarning' => '我編輯é é¢å…¶æ™‚候離開,起動警告我蜀下',
'underline-always' => 'ç›´é ­',
'underline-never' => 'é ­ð¡…ç„¡',
@@ -121,6 +121,18 @@ $messages = array(
'oct' => 'å月',
'nov' => 'å一月',
'dec' => 'å二月',
+'january-date' => '一月$1號',
+'february-date' => '二月$1號',
+'march-date' => '三月$1號',
+'april-date' => '四月$1號',
+'may-date' => '五月$1號',
+'june-date' => '六月$1號',
+'july-date' => '七月$1號',
+'august-date' => '八月$1號',
+'september-date' => 'ä¹æœˆ$1號',
+'october-date' => 'å月$1號',
+'november-date' => 'å一月$1號',
+'december-date' => 'å二月$1號',
# Categories related messages
'pagecategories' => '{{PLURAL:$1}}類別',
@@ -201,6 +213,7 @@ $messages = array(
'create-this-page' => '創建茲蜀é ',
'delete' => '刪除',
'deletethispage' => '刪除茲é ',
+'undeletethispage' => 'æ¢å¾©èŒ²èœ€é ',
'undelete_short' => 'æ¢å¾©$1回修改{{PLURAL:$1}}',
'viewdeleted_short' => '覷蜀覷$1回刪掉其修改{{PLURAL:$1}}',
'protect' => 'ä¿è­·',
@@ -244,7 +257,7 @@ $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).
+# 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).
'aboutsite' => '關於{{SITENAME}}',
'aboutpage' => 'Project:關於',
'copyright' => '內容敆$1下底會使ç²å¾—。',
@@ -254,7 +267,6 @@ $1',
'disclaimers' => '無負責è²æ˜Ž',
'disclaimerpage' => 'Project:無負責è²æ˜Ž',
'edithelp' => '修改ä¿è­·',
-'edithelppage' => 'Help:SiÅ­-gÄi',
'helppage' => 'Help:目錄',
'mainpage' => 'é ­é ',
'mainpage-description' => 'é ­é ',
@@ -330,17 +342,6 @@ $1',
# General errors
'error' => 'é„­å’¯',
'databaseerror' => '數據庫有鄭',
-'dberrortext' => '蜀è†æ•¸æ“šåº«æŸ¥è©¢å…¶èªžæ³•éŒ¯èª¤ç™¼ç”Ÿå’¯ã€‚
-茲å¯èƒ½ä»£è¡¨èŒ²è»Ÿä»¶å…¶èœ€è†æ¼æ´žã€‚
-最後嘗試其數據庫查詢是:
-<blockquote><code>$1</code></blockquote>
-è¶å‡½æ•¸ã€Œ<code>$2</code>ã€ä¾†å…¶ã€‚
-數據庫返回錯誤「<samp>$3: $4</samp>ã€ã€‚',
-'dberrortextcl' => '蜀è†æ•¸æ“šåº«æŸ¥è©¢èªžæ³•éŒ¯èª¤ç™¼ç”Ÿå’¯ã€‚
-最後蜀回嘗試其數據庫查詢是:
-「$1ã€
-è¶å‡½æ•¸ã€Œ$2ã€ä¾†å…¶ã€‚
-數據庫返回錯誤「$3: $4ã€',
'laggedslavemode' => "'''警告:'''é é¢å¯èƒ½ç„¡æœ€è¿‘其更新。",
'readonly' => '數據庫乞鎖起咯',
'readonlytext' => 'Só-gé̤ṳ-kó cÄ«-buàng ké̤ṳk nè̤ng sÅ̤ kÄ« lÄu, mâ̤-sÄi siÄ sÄ­ng dèu-mĕ̤k hĕ̤k có̤ siÅ­-gÄi, ô kÅ̤-nèng sê ôi-lÄu nÄ­k-siòng mì-hô, cÄ­-hâiu cêu â̤ ciáng-siòng.
@@ -380,10 +381,11 @@ SÅ̤ kÄ« só-gé̤ṳ-kó gì guÄng-lÄ«-uòng cÅ«ng-kuÄng gÄi-sék: $1',
'editinginterface' => "'''警告:'''æ±æ•†ð¡…修改其é é¢å»®ð¡…æ供茲蜀è†è»Ÿä»¶å…¶ç•Œé¢æ–‡æœ¬ã€‚
茲蜀é å…¶æ”¹è®Šæœƒå½±éŸ¿é˜å…¶å®ƒç”¨æˆ¶å…¶ç”¨æˆ¶ç•Œé¢å…¶é¡¯ç¤ºã€‚
如果蔔想修改維基其翻譯,起動é˜åª’體維基本地化計劃[//translatewiki.net/wiki/Main_Page?setlang=en translatewiki.net]。",
-'sqlhidden' => '(SQL查詢è—起咯)',
'namespaceprotected' => "æ±ð£ä½¿ä¿®æ”¹æ•†'''$1'''命å空間其é é¢ã€‚",
'customcssprotected' => 'æ±ð£ä½¿ä¿®æ”¹èŒ²èœ€è†CSSé é¢ï¼Œå› ç‚ºä¼Šæœ‰åˆ¥èœ€éš»ç”¨æˆ¶å…¶è¨­å®šã€‚',
'customjsprotected' => 'æ±ð£ä½¿ä¿®æ”¹èŒ²èœ€è†JavaScripté é¢ï¼Œå› ç‚ºä¼Šæœ‰åˆ¥èœ€éš»ç”¨æˆ¶å…¶è¨­å®šã€‚',
+'mycustomcssprotected' => 'æ±ð£ä½¿ä¿®æ”¹èŒ²èœ€è†CSSé é¢ã€‚',
+'mycustomjsprotected' => 'æ±ð£ä½¿ä¿®æ”¹èŒ²èœ€è†JavaScripté é¢ã€‚',
'ns-specialprotected' => 'ð£ä½¿ä¿®æ”¹ç‰¹æ®Šé é¢ã€‚',
'titleprotected' => "茲蜀è†æ¨™é¡Œå…±[[User:$1|$1]]ä¿è­·å…¶å’¯ã€‚
原因是「''$2''ã€ã€‚",
@@ -404,10 +406,18 @@ SÅ̤ kÄ« só-gé̤ṳ-kó gì guÄng-lÄ«-uòng cÅ«ng-kuÄng gÄi-sék: $1',
'welcomecreation-msg' => 'æ±å…¶è³¬æˆ¶å·²ç¶“開好了。
伓嗵ð£è¨˜æ”¹èœ€æ”¹æ±å…¶[[Special:Preferences|{{SITENAME}}設定]]。',
'yourname' => '用戶å:',
+'userlogin-yourname' => '用戶å',
+'userlogin-yourname-ph' => '輸底æ±å…¶ç”¨æˆ¶å',
'yourpassword' => '密碼:',
+'userlogin-yourpassword' => '密碼',
+'userlogin-yourpassword-ph' => '輸底æ±å…¶å¯†ç¢¼',
+'createacct-yourpassword-ph' => '輸底蜀è†å¯†ç¢¼',
'yourpasswordagain' => 'é‡æ–°æ‹å›‡å¯†ç¢¼ï¼š',
+'createacct-yourpasswordagain' => '確定密碼',
+'createacct-yourpasswordagain-ph' => 'å†è¼¸å…¥èœ€å›žå¯†ç¢¼',
'remembermypassword' => '共我敆茲蜀è†ç€è¦½å™¨å…¶èº’底記錄記定幾日(最価$1日){{PLURAL:$1}}',
-'securelogin-stick-https' => '躒底以後ä¿æŒHTTPS連接',
+'userlogin-remembermypassword' => 'ä¿æŒæˆ‘躒底其',
+'userlogin-signwithsecure' => '使安全其連接',
'yourdomainname' => 'æ±å…¶åŸŸå:',
'password-change-forbidden' => 'æ±ð£ä½¿æ•†èŒ²èœ€è†ç¶­åŸºç™¾ç§‘ð¡…修改密碼。',
'externaldberror' => 'å¯èƒ½æ˜¯é©—證數據庫鄭咯,或者是æ±ð£ä½¿å‡ç´šæ±å…¶å¤–部賬戶。',
@@ -419,18 +429,38 @@ SÅ̤ kÄ« só-gé̤ṳ-kó gì guÄng-lÄ«-uòng cÅ«ng-kuÄng gÄi-sék: $1',
'logout' => '躒出',
'userlogout' => '躒出',
'notloggedin' => '未躒底',
+'userlogin-noaccount' => 'æ±ç„¡è³¬æˆ¶ï¼Ÿ',
+'userlogin-joinproject' => '共{{SITENAME}}加底其',
'nologin' => 'æ±ç„¡è³¬æˆ¶ï¼Ÿ$1',
'nologinlink' => '開蜀隻賬戶',
'createaccount' => '開賬戶',
'gotaccount' => "已經有賬戶了?'''$1'''。",
'gotaccountlink' => '躒底',
'userlogin-resetlink' => '躒底其資料ð£è¨˜å’¯ï¼Ÿ',
+'userlogin-resetpassword-link' => 'é‡ç½®æ±å…¶å¯†ç¢¼',
+'helplogin-url' => 'Help: 躒底',
+'userlogin-helplink' => '[[{{MediaWiki:helplogin-url}}|幫助躒底]]',
+'createacct-join' => '敆下底輸底æ±å…¶ä¿¡æ¯ã€‚',
+'createacct-emailrequired' => 'é›»å­éƒµä»¶åœ°å€',
+'createacct-emailoptional' => 'é›»å­éƒµä»¶åœ°å€ï¼ˆæ„›å¯«å°±å¯«ï¼‰',
+'createacct-email-ph' => '輸底æ±å…¶é›»å­éƒµä»¶åœ°å€',
'createaccountmail' => '使臨時其隨機密碼,共伊é€é˜æŒ‡å®šå…¶é›»å­éƒµä»¶åœ°å€',
+'createacct-realname' => '實際其å字(愛寫就寫)',
'createaccountreason' => '原因:',
+'createacct-reason' => '原因',
+'createacct-reason-ph' => 'æ±å¥šå‹¢å¾©é–‹èœ€éš»è³¬æˆ¶',
+'createacct-captcha' => '安全檢查',
+'createacct-imgcaptcha-ph' => '輸底æ±æ•†æ‡¸é ‚看見其文字',
+'createacct-submit' => '開賬戶',
+'createacct-benefit-heading' => '{{SITENAME}}是共æ±èœ€æ§˜å…¶å„‚åšå…¶ã€‚',
+'createacct-benefit-body1' => '{{PLURAL:$1|修改}}',
+'createacct-benefit-body2' => '{{PLURAL:$1|é é¢}}',
+'createacct-benefit-body3' => '最近其{{PLURAL:$1|è²¢ç»è€…}}',
'badretype' => 'æ±è¼¸åº•å…¶å¯†ç¢¼ð£èœ€æ§˜ã€‚',
'userexists' => '用戶å已經乞別人使去了。
èµ·å‹•å¦å¤–å†èµ·èœ€è†å字。',
'loginerror' => '躒底有鄭',
+'createacct-error' => '賬戶開出毛病咯',
'createaccounterror' => '無能çƒé–‹è³¬æˆ¶ï¼š$1',
'noname' => 'æ±æœªæŒ‡å®šèœ€è†åˆæ³•å…¶ç”¨æˆ¶å。',
'loginsuccesstitle' => '躒底æˆåŠŸ',
@@ -643,7 +673,6 @@ SÅ̤ kÄ« só-gé̤ṳ-kó gì guÄng-lÄ«-uòng cÅ«ng-kuÄng gÄi-sék: $1',
'nextn' => '後{{PLURAL:$1}}$1è†',
'shown-title' => 'æ¯é é¡¯ç¤º$1{{PLURAL:$1|è†çµæžœ}}',
'viewprevnext' => '看($1 {{int:pipe-separator}} $2)($3)。',
-'searchhelp-url' => 'Help:目錄',
'searchprofile-articles' => '內容é ',
'searchprofile-images' => '多媒體',
'searchprofile-everything' => '所有乇',
@@ -769,7 +798,7 @@ SÅ̤ kÄ« só-gé̤ṳ-kó gì guÄng-lÄ«-uòng cÅ«ng-kuÄng gÄi-sék: $1',
'uploadbtn' => '上傳文件',
'reuploaddesc' => 'å–消上傳,轉去上傳é é¢',
'uploadnologin' => '未躒底',
-'uploadnologintext' => 'SÄ•ng [[Special:UserLogin|láuk-diÄ“]] ciáh â̤-sÄi siông-duòng ùng-giông.',
+'uploadnologintext' => 'æ±è‘—$1æ‰æœƒä½¿ä¸Šå‚³æ–‡ä»¶ã€‚',
'uploaderror' => '上傳有鄭',
'uploadlog' => '上傳日誌',
'uploadlogpage' => '上傳日誌',
@@ -840,8 +869,6 @@ SÅ̤ kÄ« só-gé̤ṳ-kó gì guÄng-lÄ«-uòng cÅ«ng-kuÄng gÄi-sék: $1',
'statistics' => '統計',
'statistics-header-users' => '用戶統計',
-'disambiguationspage' => 'Template:歧義',
-
'brokenredirects-edit' => '改',
'brokenredirects-delete' => '刪',
@@ -937,7 +964,6 @@ SÅ̤ kÄ« só-gé̤ṳ-kó gì guÄng-lÄ«-uòng cÅ«ng-kuÄng gÄi-sék: $1',
'watchthispage' => '監視茲é ',
'unwatch' => '伓使監視',
'unwatchthispage' => 'åœæ­¢ç›£è¦–',
-'watchnochange' => 'æ±å…¶ç›£è¦–é é¢å…¨éƒ¨éƒ½ç„¡å„‚定動。',
'watchlist-details' => '{{PLURAL:$1}}$1é æ•†æ±å…¶ç›£è¦–å–®ð¡…,無算討論é ã€‚',
'wlshowlast' => '顯示最$1點é˜$2æ—¥$3',
'watchlist-options' => '監視單é¸é …',
@@ -1301,9 +1327,6 @@ $5
'watchlisttools-edit' => '看共修改監視單',
'watchlisttools-raw' => '修改原始監視單',
-# Special:FilePath
-'filepath-page' => '文件:',
-
# Special:SpecialPages
'specialpages' => '特殊é ',
diff --git a/languages/messages/MessagesCe.php b/languages/messages/MessagesCe.php
index f5bb2d1e..0533b951 100644
--- a/languages/messages/MessagesCe.php
+++ b/languages/messages/MessagesCe.php
@@ -22,18 +22,18 @@ $namespaceNames = array(
NS_SPECIAL => 'Белхан',
NS_TALK => 'Дийцаре',
NS_USER => 'Декъашхо',
- NS_USER_TALK => 'Декъашхон_дийцаре',
+ NS_USER_TALK => 'Декъашхочун_дийцаре',
NS_PROJECT_TALK => '{{GRAMMAR:genitive|$1}}_дийцаре',
- NS_FILE => 'Хlум',
- NS_FILE_TALK => 'Хlуман_дийцаре',
+ NS_FILE => 'Файл',
+ NS_FILE_TALK => 'Файлан_дийцаре',
NS_MEDIAWIKI => 'MediaWiki',
NS_MEDIAWIKI_TALK => 'MediaWiki_дийцаре',
- NS_TEMPLATE => 'Куцкеп',
- NS_TEMPLATE_TALK => 'Куцкеп_дийцаре',
- NS_HELP => 'Гlо',
- NS_HELP_TALK => 'Гlон_дийцаре',
- NS_CATEGORY => 'Кадегар',
- NS_CATEGORY_TALK => 'Кадегар_дийцаре',
+ NS_TEMPLATE => 'Кеп',
+ NS_TEMPLATE_TALK => 'Кепан_дийцаре',
+ NS_HELP => 'ГӀо',
+ NS_HELP_TALK => 'ГӀо_дийцаре',
+ NS_CATEGORY => 'Категори',
+ NS_CATEGORY_TALK => 'Категорин_дийцаре',
);
$namespaceAliases = array(
@@ -43,25 +43,134 @@ $namespaceAliases = array(
'Юзер' => NS_USER,
'Юзери_дийца' => NS_USER_TALK,
'Дийцаре_декъашхо' => NS_USER_TALK,
+ 'Декъашхон_дийцаре' => NS_USER_TALK,
'$1_Дийца' => NS_PROJECT_TALK,
'Дийцаре_{{GRAMMAR:genitive|$1}}' => NS_PROJECT_TALK,
'Сурт' => NS_FILE,
'Сурти_дийца' => NS_FILE_TALK,
+ 'Хlум' => NS_FILE,
+ 'Хlуман_дийцаре' => NS_FILE_TALK,
'Дийцаре_хlуман' => NS_FILE_TALK,
'МедйаВики' => NS_MEDIAWIKI,
'МедйаВики_дийца' => NS_MEDIAWIKI_TALK,
'MediaWiki_Дийцаре' => NS_MEDIAWIKI_TALK,
'Дакъан' => NS_TEMPLATE,
'Дакъан_дийца' => NS_TEMPLATE_TALK,
+ 'Куцкеп' => NS_TEMPLATE,
+ 'Куцкеп_дийцаре' => NS_TEMPLATE_TALK,
'ГІо' => NS_HELP,
'ГІодан_дийца' => NS_HELP_TALK,
+ 'Гlо' => NS_HELP,
+ 'Гlон_дийцаре' => NS_HELP_TALK,
'Тоба' => NS_CATEGORY,
- 'Тобан_дийца' => NS_CATEGORY_TALK
+ 'Тобан_дийца' => NS_CATEGORY_TALK,
+ 'Кадегар' => NS_CATEGORY,
+ 'Кадегар_дийцаре' => NS_CATEGORY_TALK,
);
// Remove Russian aliases
$namespaceGenderAliases = array();
+$specialPageAliases = array(
+ 'Activeusers' => array( 'Жигара_декъашхой' ),
+ 'Allmessages' => array( 'ГӀирÑа_хаамаш' ),
+ 'Allpages' => array( 'МаÑÑо_агӀонаш' ),
+ 'Ancientpages' => array( 'Яззамаш_оцу_терахьца_Ñ‚Ñххьара_тадар_дина_долу' ),
+ 'Badtitle' => array( 'Хилийта_йиш_йоцу_цӀе' ),
+ 'Blankpage' => array( 'ЕÑа_агӀо' ),
+ 'Block' => array( 'Блоктоха' ),
+ 'Blockme' => array( 'Блоктоха_Ñуна' ),
+ 'Booksources' => array( 'Жайнашан_хьоÑташ' ),
+ 'BrokenRedirects' => array( 'ДIахаьдна_долу_дIаÑахьажораш' ),
+ 'Categories' => array( 'Категореш' ),
+ 'ChangeEmail' => array( 'Хийца_e-mail' ),
+ 'ChangePassword' => array( 'Хийца_ишар' ),
+ 'ComparePages' => array( 'ÐгӀонаш_ÑŽÑтар' ),
+ 'Confirmemail' => array( 'Бакъе_e-mail' ),
+ 'Contributions' => array( 'Къинхьегам' ),
+ 'CreateAccount' => array( 'Кхолла_декъашхон_дӀаÑздар' ),
+ 'Deadendpages' => array( 'Дика_йоцу_агӀонаш' ),
+ 'DeletedContributions' => array( 'ДӀабÑхкина_къинхьегам' ),
+ 'Disambiguations' => array( 'Цхьатера_маьӀна_дерш' ),
+ 'DoubleRedirects' => array( 'ШалгӀа_дӀаÑахьажийнарш' ),
+ 'EditWatchlist' => array( 'Табе_тергаме_могӀам' ),
+ 'Emailuser' => array( 'Декъашхочунга_кехат' ),
+ 'Export' => array( 'ЭкÑпорт' ),
+ 'Fewestrevisions' => array( 'Ðаггахь_беш_болу_хицамаш' ),
+ 'FileDuplicateSearch' => array( 'Цхьатера_файлаш_лахар' ),
+ 'Filepath' => array( 'Файл_йолче' ),
+ 'Import' => array( 'Импорт' ),
+ 'Invalidateemail' => array( 'ÐдреÑ_бакъдар_юхадаккха' ),
+ 'JavaScriptTest' => array( 'JavaScript_теÑтировать_Ñн' ),
+ 'BlockList' => array( 'Блоктоьхнарш' ),
+ 'LinkSearch' => array( 'Хьажоригаш_лахар' ),
+ 'Listadmins' => array( 'Куьгалхойн_могӀам' ),
+ 'Listbots' => array( 'Шаболх_бечара_могӀам' ),
+ 'Listfiles' => array( 'Файланши_могӀам' ),
+ 'Listgrouprights' => array( 'Декъашхошан_бакъонаш' ),
+ 'Listredirects' => array( 'ДIаÑахьажоран_могIам' ),
+ 'Listusers' => array( 'Декъашхойн_могӀам' ),
+ 'Lockdb' => array( 'Хааман_базан_блоктохар' ),
+ 'Log' => array( 'Тептарш' ),
+ 'Lonelypages' => array( 'Байлахь_йиÑина_агIонаш' ),
+ 'Longpages' => array( 'Беха_Ñззамаш' ),
+ 'MergeHistory' => array( 'Цхьаьнатоьхна_категореш' ),
+ 'MIMEsearch' => array( 'MIME_чухула_лахар' ),
+ 'Mostcategories' => array( 'Дуккха_категореш_тӀе_тоьхна_йолу_агӀонаш' ),
+ 'Mostimages' => array( 'МаÑÑарел_дуккха_лелайо_файлаш' ),
+ 'Mostinterwikis' => array( 'Дукха_юкъарвики_хьажоригаш' ),
+ 'Mostlinked' => array( 'Дуккха_хьажоригаш_тIе_тоьхна_йолу_агIонаш' ),
+ 'Mostlinkedcategories' => array( 'Дуккха_тӀе_хьажораш_йолу_категореш' ),
+ 'Mostlinkedtemplates' => array( 'МаÑÑарел_дуккха_а_леладо_кепаш' ),
+ 'Mostrevisions' => array( 'Сих_Ñиха_ниÑйина_йолу_агIонаш' ),
+ 'Movepage' => array( 'ÐгӀона_цӀе_хийцар' ),
+ 'Mycontributions' => array( 'Сан_къинхьегам' ),
+ 'Mypage' => array( 'Сан_агӀо' ),
+ 'Mytalk' => array( 'Сан_дийцаре' ),
+ 'Myuploads' => array( 'Сан_файлаш' ),
+ 'Newimages' => array( 'Керла_файлаш' ),
+ 'Newpages' => array( 'Керла_агӀонаш' ),
+ 'PermanentLink' => array( 'Гуттарлера_хьажориг' ),
+ 'Popularpages' => array( 'ГӀарÑлла_агӀонаш' ),
+ 'Preferences' => array( 'ГӀирÑаш' ),
+ 'Prefixindex' => array( 'Хьалха_агIонашан_цIераш_хIотто_йеза' ),
+ 'Protectedpages' => array( 'ГIаролла_дина_агIонаш' ),
+ 'Protectedtitles' => array( 'ГIаролла_дина_цIераш' ),
+ 'Randompage' => array( 'Цахууш_ниÑйелла_агIо' ),
+ 'Randomredirect' => array( 'Цахууш_ниÑделла_дIаÑахьажор' ),
+ 'Recentchanges' => array( 'Керла_ниÑдарш' ),
+ 'Recentchangeslinked' => array( 'Кхуьнца_долу_ниÑдарш' ),
+ 'Revisiondelete' => array( 'ДӀадÑхна_ниÑдарш' ),
+ 'Search' => array( 'Лахар' ),
+ 'Shortpages' => array( 'Боцоа_Ñззамаш' ),
+ 'Specialpages' => array( 'Леррина_агӀонаш' ),
+ 'Statistics' => array( 'Бухехьдерг' ),
+ 'Tags' => array( 'Билгалонаш' ),
+ 'Unblock' => array( 'БлокдӀаÑкхар' ),
+ 'Uncategorizedcategories' => array( 'Категореш_йоцу_категореш' ),
+ 'Uncategorizedimages' => array( 'Категореш_йоцу_файлаш' ),
+ 'Uncategorizedpages' => array( 'Категореш_йоцу_агIонаш' ),
+ 'Uncategorizedtemplates' => array( 'Категореш_йоцу_кепаш' ),
+ 'Undelete' => array( 'МеттахӀоттор' ),
+ 'Unlockdb' => array( 'БлокдӀаÑкхар_ХБ' ),
+ 'Unusedcategories' => array( 'Лелош_доцу_категореш' ),
+ 'Unusedimages' => array( 'Лелош_доцу_файлаш' ),
+ 'Unusedtemplates' => array( 'Лелош_доцу_кепаш' ),
+ 'Upload' => array( 'Файл_чуÑккхар' ),
+ 'UploadStash' => array( 'ДӀахьулйина_файл_чуÑккхар' ),
+ 'Userlogin' => array( 'Чувалар/Ñлар' ),
+ 'Userlogout' => array( 'Ðравалар/Ñлар' ),
+ 'Userrights' => array( 'Бакъона_урхалладар' ),
+ 'Version' => array( 'ВерÑи' ),
+ 'Wantedcategories' => array( 'Оьшуш_йолу_категореш' ),
+ 'Wantedfiles' => array( 'Оьшуш_йолу_файлаш' ),
+ 'Wantedpages' => array( 'Оьшуш_йолу_агIонаш' ),
+ 'Wantedtemplates' => array( 'Оьшуш_йолу_кепаш' ),
+ 'Watchlist' => array( 'Тергаме_могӀам' ),
+ 'Whatlinkshere' => array( 'Хьажоригаш_кхузе' ),
+ 'Withoutinterwiki' => array( 'Кхечу_меттанашан_хьажориг_йоцу_агIонаш' ),
+);
+
$magicWords = array(
'redirect' => array( '0', '#дlаÑахьажайар\'', '\'#хьажайо\'', '\'#REDIRECT', '#перенаправление', '#перенапр', '#REDIRECT' ),
'notoc' => array( '0', '__БÐЦ_ЧУЛÐЦÐÐœ__', '__БÐЦ_ЧУЛ__', '__БЕЗ_ОГЛÐВЛЕÐИЯ__', '__БЕЗ_ОГЛ__', '__NOTOC__' ),
@@ -239,9 +348,6 @@ $messages = array(
'tog-shownumberswatching' => 'Гайта декъашхойн терахь, агlо латийна болу шай тергаме могlам юкъа',
'tog-oldsig' => 'Хьалххьажар долучу куьгтаlорна:',
'tog-fancysig' => 'Шен вики-къаÑтаман куьгтаlдар (ша шех хьажориг йоцуш)',
-'tog-externaleditor' => 'Лелайан арахьара рéдаккхар (гlулкхдириг леррина ниÑйина хила йеза, [//www.mediawiki.org/wiki/Manual:External_editors кхин дlа.])',
-'tog-externaldiff' => 'Лелабан арахьара диллагlарам башхо тарйо гlÐ¸Ñ€Ñ (гlулкхдириг леррина ниÑйина хила йеза, [//www.mediawiki.org/wiki/Manual:External_editors кхин дlа.])',
-'tog-showjumplinks' => 'Латайе гӀодарна хьажорагаш «дехьа гӀо оцу»',
'tog-uselivepreview' => 'Лелайа чехка хьалха хьажа (JavaScript, муха ю хьажарна)',
'tog-forceeditsummary' => 'Дага даийта, нагахь ниÑйарх лаьцна чохь Ñзйина Ñцахь',
'tog-watchlisthideown' => 'КъайлаÑха Ð°Ñ Ð½Ð¸Ñйинарш оцу тергаме могlам чура',
@@ -255,6 +361,7 @@ $messages = array(
'tog-showhiddencats' => 'Гайта къайлаха йолу категореш',
'tog-noconvertlink' => 'Хааман хьажориг кхуллу гlÐ¸Ñ€Ñ Ð´lабайа',
'tog-norollbackdiff' => 'Юха Ñккхиначул тӀаьхьа ма гайта верÑешан башхо',
+'tog-useeditwarning' => 'Хаамбе бина хийцамаш дӀаÑзцабеш аÑа болх дӀатоÑучу хенахь',
'underline-always' => 'Даимна',
'underline-never' => 'Цкъа а',
@@ -318,6 +425,18 @@ $messages = array(
'oct' => 'октÑбрь',
'nov' => 'ноÑбрь',
'dec' => 'декабрь',
+'january-date' => 'Январь $1',
+'february-date' => 'Февраль $1',
+'march-date' => 'Март $1',
+'april-date' => 'Ðпрель $1',
+'may-date' => 'Май $1',
+'june-date' => 'Июнь $1',
+'july-date' => 'Июль $1',
+'august-date' => 'ÐвгуÑÑ‚ $1',
+'september-date' => 'СентÑбрь $1',
+'october-date' => 'ОктÑбрь $1',
+'november-date' => 'ÐоÑбрь $1',
+'december-date' => 'Декабрь $1',
# Categories related messages
'pagecategories' => '{{PLURAL:$1|Категори|Категореш}}',
@@ -339,7 +458,7 @@ $messages = array(
'broken-file-category' => '{{#switch:{{NAMESPACE}}
|{{ns:0}}=Болх цабеш файлийн хьажорагаш йолу агӀонаш}}',
-'linkprefix' => '/^(.*?)([a-zA-Z\\x80-\\xff]+)$/sD',
+'linkprefix' => '/^((?>.*(?<![a-zA-Z\\x80-\\xff])))(.+)$/sD',
'about' => 'Цуьнах лаьцна',
'article' => 'Яззам',
@@ -402,6 +521,7 @@ $messages = array(
'create-this-page' => 'Кхолла хlара агlо',
'delete' => 'ДӀаÑккха',
'deletethispage' => 'ДӀаÑккха хӀара агӀо',
+'undeletethispage' => 'ХӀара агӀо меттахӀоттор',
'undelete_short' => 'Меттахlоттайé $1 {{PLURAL:$1|ниÑйинарг|ниÑйинарш|ниÑйинарш}}',
'viewdeleted_short' => 'Хьажар {{PLURAL:$1|$1 дlадаьккхина нийÑдар|$1 дlадаьхна нийÑдарш|$1 дlадаьхна нийÑдарш}}',
'protect' => 'Гlаролла дé',
@@ -445,7 +565,7 @@ $1',
'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).
+# 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).
'aboutsite' => '{{grammar:genitive|{{SITENAME}}}} лаьцна',
'aboutpage' => 'Project:Цуьнах лаьцна',
'copyright' => 'Чулацам лело мега догӀуш хиларца оцу $1.',
@@ -455,7 +575,6 @@ $1',
'disclaimers' => 'Бехк тӀе ца Ñцар',
'disclaimerpage' => 'Project:БÑхк тӀецалацар',
'edithelp' => 'ГӀо оцу тадарна',
-'edithelppage' => 'Help:ÐиÑвохаам оцу редаккхарна',
'helppage' => 'Help:Чулацам',
'mainpage' => 'Коьрта агӀо',
'mainpage-description' => 'Коьрта агӀо',
@@ -485,7 +604,6 @@ $1',
'newmessagesdifflinkplural' => '{{PLURAL:$1|тӀаьхьара бина хийцамаш}}',
'youhavenewmessagesmulti' => 'Хьуна кхаьчна керла хаам оцу $1',
'editsection' => 'ниÑйé',
-'editsection-brackets' => '[$1]',
'editold' => 'ниÑйé',
'viewsourceold' => 'хьажа йолш йолучу ишаре',
'editlink' => 'ниÑйé',
@@ -580,10 +698,11 @@ $1',
'editinginterface' => "'''Тергам бе:''' Ðхьа таеш ÑŽ интерфейÑан йоза долу агӀо програмин латторан.
Цуна бина хийцам хьокху википедин кхечу декъашхошна гур бу.
Хьокху хаамийн гочдар тӀетоха Ñ Ñ…Ð¸Ð¹Ñ†Ð° лела йе Ñайт MediaWiki [//translatewiki.net/ translatewiki.net].",
-'sqlhidden' => '(SQL жоп дехар къайладаккха)',
'namespaceprotected' => 'ХӀан бакъо Ñц анна цӀераш чохь тадарш да «$1».',
'customcssprotected' => 'Хьан бакъо Ñц хӀара CSS-агӀо таÑ, иза кхечу декъашхочун Ð³Ó€ÐµÑ€Ñ Ð±Ð¾Ð»Ñƒ дера.',
'customjsprotected' => 'Хьан бакъо Ñц хӀара JavaScript-агӀо таÑ, иза кхечу декъашхочун Ð³Ó€ÐµÑ€Ñ Ð±Ð¾Ð»Ñƒ дера.',
+'mycustomcssprotected' => 'Хьан бакъо Ñц хӀара CSS агӀо таÑ.',
+'mycustomjsprotected' => 'Хьан бакъо Ñц JavaScript агӀо таÑ.',
'exception-nologin' => 'Ðхьа хӀой вовзийтина/йовзийтина вац/Ñц',
# Virus scanner
@@ -596,9 +715,18 @@ $1',
Цхьа йолу агӀонаш чохь хьо хьай цӀарца болх беш Ñана хила тарло ишта ца хилийта керлаÑкха браузеран кÑш.",
'welcomeuser' => 'Марша ДогӀийла, $1!',
'yourname' => 'Декъашхочун цӀе:',
+'userlogin-yourname' => 'Декъашхочун цӀе',
+'userlogin-yourname-ph' => 'Язъе декъашхочун цӀе',
'yourpassword' => 'Пароль:',
+'userlogin-yourpassword' => 'Пароль',
+'userlogin-yourpassword-ph' => 'Язъе хьай пароль',
+'createacct-yourpassword-ph' => 'Язъе пароль',
'yourpasswordagain' => 'Юха Ñзъе пароль:',
+'createacct-yourpasswordagain' => 'Бакъе пароль',
+'createacct-yourpasswordagain-ph' => 'Кхин цкъа Ñзъе пароль',
'remembermypassword' => 'Даглаца Ñан дӀавазвалар/Ñлар хӀокху гӀулкхдечу гӀирÑа Ñ‚Ó€ÑÑ…ÑŒ (цхьан $1 {{PLURAL:$1|ден|динахь|динахь}})',
+'userlogin-remembermypassword' => 'Дагахь латт ве/е Ñо',
+'userlogin-signwithsecure' => 'Ларийна цхьаьнакхетар',
'yourdomainname' => 'Хьан машан меттиг:',
'password-change-forbidden' => 'Хьан йиш Ñц хӀокху вики чохь пароль хийца.',
'login' => 'СиÑтемин чугӀо',
@@ -609,17 +737,37 @@ $1',
'logout' => 'Болх дӀаберзор',
'userlogout' => 'Болх дӀаберзор',
'notloggedin' => 'Хьо вовзийта/йовзийта гlирÑан',
+'userlogin-noaccount' => 'Декъашхочун дӀаÑздар дац хьа?',
+'userlogin-joinproject' => '{{grammar:genitive|{{SITENAME}}}} юкъахӀотта',
'nologin' => "Декъашхочун дӀаÑздар дац хьа? '''$1'''.",
'nologinlink' => 'Кхолла декъашхочун дӀаÑздар',
'createaccount' => 'Кхолла декъашхочун дӀаÑздар',
'gotaccount' => "Дlавазвелла вуй хьо? '''$1'''.",
'gotaccountlink' => 'Довзийта',
'userlogin-resetlink' => 'Чуволу/йолу хаам биц бела?',
+'userlogin-resetpassword-link' => 'Пароль кхоÑÑар',
+'helplogin-url' => 'Help:СиÑтемин довзийтар',
+'userlogin-helplink' => '[[{{MediaWiki:helplogin-url}}|СиÑтемин чудаха гӀодар]]',
+'createacct-join' => 'ДӀаÑзбе лахахь хай хаам.',
+'createacct-emailrequired' => 'Электронни почтан адреÑ',
+'createacct-emailoptional' => 'Электронни почтан Ð°Ð´Ñ€ÐµÑ (ца Ñздича мега)',
+'createacct-email-ph' => 'ДӀаÑзде Ñлектронни почтан адреÑ',
'createaccountmail' => 'хааман зӀене хула',
+'createacct-realname' => 'Хьан цӀе (ца Ñзйича мега)',
'createaccountreason' => 'Бахьан:',
+'createacct-reason' => 'Бахьна',
+'createacct-reason-ph' => '{{PLURAL:$1|агӀо|агӀонаш}}‎',
+'createacct-captcha' => 'Кхерамзалла хьажар',
+'createacct-imgcaptcha-ph' => 'ДӀаÑзде хьайна лакхахь гуш долу йоза',
+'createacct-submit' => 'Кхолла декъашхочун дӀаÑздар',
+'createacct-benefit-heading' => '{{SITENAME}} кхолийна хьо Ñанначу наха.',
+'createacct-benefit-body1' => '{{PLURAL:$1|ниÑдар|ниÑдарш}}',
+'createacct-benefit-body2' => '{{PLURAL:$1|Ñззам|Ñззамаш}}',
+'createacct-benefit-body3' => '{{PLURAL:$1|декъашхо|декъашхой}} тӀаьхьарачу хенахь',
'badretype' => 'Ðхьа Ñзъен ишарш цхьатера Ñц',
'userexists' => 'Ðхьа Ñзъен декъашхочун цӀе йолуш ÑŽ, дехар до кхин цӀе харжар.',
'loginerror' => 'Гlалат ду декъашхо вовзарехь/йовзарехь',
+'createacct-error' => 'ДӀаÑздар кхуллуш гӀалат ду',
'createaccounterror' => 'Декъашхочун дӀаÑздар кхолла йиш Ñц: $1',
'nocookieslogin' => '{{SITENAME}} лелош ÑŽ «cookies» декъашхой ÑиÑтемин чуболучу хенахь. Ðхьа иш дӀайаьйина.',
'nocookiesforlogin' => '{{int:nocookieslogin}}',
@@ -661,6 +809,7 @@ $1',
# Special:PasswordReset
'passwordreset' => 'Пароль кхоÑÑар',
+'passwordreset-text-many' => '{{PLURAL:$1|Пароль кхоÑÑа юза лахара цхьа меттиг.}}',
'passwordreset-legend' => 'Пароль кхоÑÑар',
'passwordreset-username' => 'Декъашхочун цӀе:',
'passwordreset-domain' => 'Домен:',
@@ -678,6 +827,18 @@ $1',
'changeemail-submit' => 'Хийца email',
'changeemail-cancel' => 'Цаоьшу',
+# Special:ResetTokens
+'resettokens' => 'Токенаш кхоÑÑар',
+'resettokens-text' => 'Хьан йиш ÑŽ токенаш кхоÑÑа, цара йиш хуьлуьйту цхьаболу долара хаамашна тӀекхача, уьш ÑŽ хьан дӀаÑздар ца вовшахтеÑна.
+
+Хьона иза оьшу, ахьа хьай токенаш цхьам гучу Ñьхна елахь Ñ Ñ…ÑŒÐ°Ð½ аккаунт йохийна елахь.',
+'resettokens-legend' => 'Токенаш кхоÑÑар',
+'resettokens-tokens' => 'Токенаш:',
+'resettokens-token-label' => '$1 (карара маьӀна: $2)',
+'resettokens-watchlist-token' => 'Веб-каналан (Atom/RSS) токен [[Special:Watchlist|хьан тергаме могӀам чура агӀонашна хийцамаш бар]]',
+'resettokens-done' => 'Токенаш кхиÑÑина.',
+'resettokens-resetbutton' => 'КъаÑтина токенаш кхоÑÑар',
+
# Edit page toolbar
'bold_sample' => 'ДерÑтино до йоза',
'bold_tip' => 'ДерÑтино до йоза',
@@ -711,6 +872,8 @@ $1',
'summary-preview' => 'Цуьнах лаьцна хирду:',
'blockedtitle' => 'Декъашхочун блоктоьхана',
'nosuchsectiontitle' => 'Дакъа каро йиш Ñц.',
+'nosuchsectiontext' => 'Хьо гӀерта дуцу дакъа тадан.
+Хьо хӀокху агӀоне хьоьжучу хенахь иза кхечухьа деккхина Ñ Ð´Ó€Ð°Ð´Ð°ÑŒÐºÐºÑ…Ð¸Ð½Ð° хела тарло.',
'loginreqtitle' => 'Хьай цӀарца чугӀо',
'loginreqlink' => 'Логин',
'accmailtitle' => 'Пароль дlаÑхьийтина.',
@@ -792,6 +955,7 @@ $1',
'moveddeleted-notice' => 'Иза агӀо дӀаÑккхина Ñра.
Хаийтарна лахахьа гойту, цуьнца долу дӀаÑздарш кху тептар чура дӀаÑхарш а цӀе хийцарш а.',
'log-fulllog' => 'Хьажа деригге тептаре',
+'postedit-confirmation' => 'Хьан ниÑдар дÓайазъдина.',
# Content models
'content-model-javascript' => 'JavaScript',
@@ -807,6 +971,7 @@ $1',
# "Undo" feature
'undo-success' => 'ÐиÑйинарг а Ñ‚lе цалаца мега. Дехар до, хьажа цхьатерра йуй башхо, тешна хила, баккъалла иза хийцам буйте хьуна безарг, Ñ‚lакха Ñ‚lе таlайе «дlайазйе агlо», хийцам Ñ…lотта ба.',
'undo-summary' => 'Юхадаьккхина {{GENDER:$2|декъашхочун}} [[Special:Contributions/$2|$2]] ([[User talk:$2|дийц.]]) ниÑдар $1',
+'undo-summary-username-hidden' => 'Юхадаьккхина декъашхочун ниÑдарш $1, цунна цӀе дӀахьулйина',
# History pages
'viewpagelogs' => 'Гайта хlокху агlонан тептар',
@@ -905,7 +1070,6 @@ $1',
'searchmenu-legend' => 'Лахарна гlÐ¸Ñ€Ñ Ð½Ð¸Ñба',
'searchmenu-exists' => "'''ХӀокху вики чохь йолуш ю ишта агӀо «[[:$1]]»'''",
'searchmenu-new' => "'''Кхолла ишта агlо «[[:$1]]» хlокху вики-кхолламашчохь!'''",
-'searchhelp-url' => 'Help:Чулацам',
'searchmenu-prefix' => '[[Special:PrefixIndex/$1|Гайта агlонаш ишта хlоттам болуш]]',
'searchprofile-articles' => 'КъаьÑтина агlонаш',
'searchprofile-project' => 'ГӀона а проектан а агӀонаш',
@@ -942,6 +1106,7 @@ $1',
'powersearch-toggleall' => 'МаÑÑо',
'powersearch-togglenone' => 'Хlумма цаоьшу',
'search-external' => 'Ðрахула лахар',
+'search-error' => 'Лохуш гӀалат даьлла: $1',
# Preferences page
'preferences' => 'ГlÐ¸Ñ€Ñ Ð½Ð¸Ñбан',
@@ -969,6 +1134,7 @@ $1',
'prefs-email' => 'Электронан почтан параметраш',
'prefs-rendering' => 'Ðрахьара хатl',
'saveprefs' => 'lалашдан',
+'resetprefs' => 'КхоÑÑар',
'restoreprefs' => 'МеттахӀоттабе Ð³Ó€Ð¸Ñ€Ñ Iад битарца',
'prefs-editing' => 'Тадар',
'rows' => 'МогӀанаш:',
@@ -980,9 +1146,6 @@ $1',
'recentchangesdays-max' => 'Къезиг $1 {{PLURAL:$1|дена}}',
'recentchangescount' => 'Iад йитарца гойтуш долу ниÑдаршан дукхалла',
'prefs-help-recentchangescount' => 'Гойту керла ниÑдарш, агӀонашан иÑтори, тептарш.',
-'prefs-help-watchlist-token' => 'Кхуза къайлах догӀа Ñздича хьан тергаме ÑпиÑкан RSS-транÑлÑци кхуллур ÑŽ.
-МаÑÑо а догӀа хууш верг транÑлÑци еша йиш йолуш ву.
-Цундела цхьанне а ца хуу догӀа харжа деза. Хьан йиш ю ца хууш кхоьллина догӀа лелада: $1',
'savedprefs' => 'Хьан Ð³Ó€Ð¸Ñ€Ñ Ó€Ð°Ð»Ð°ÑˆÐ±Ð¸Ð½Ð°.',
'timezonelegend' => 'Сахьатан аÑа:',
'localtime' => 'Меттигера хан:',
@@ -1005,7 +1168,6 @@ $1',
'prefs-reset-intro' => 'ХӀара агӀо лело мега ахьа ниÑбина Ð³Ó€Ð¸Ñ€Ñ Ó€Ð°Ð´ битарца юха бокхуш.
ХӀара дешдерг кхочушъ динчул тӀехьа хьан йиш хир-Ñц и юха меттахӀотто.',
'prefs-emailconfirm-label' => 'Бакъ ÑÑ€ Ñлектрони почт:',
-'prefs-textboxsize' => 'Тадаран коран барам',
'youremail' => 'Кехат Ñздо зlе цlе:',
'username' => '{{GENDER:$1|Декъашхочун цӀе}}:',
'uid' => 'Декъашхочун {{GENDER:$1|код}}:',
@@ -1031,6 +1193,7 @@ $1',
'prefs-dateformat' => 'Терахьан формат',
'prefs-timeoffset' => 'Хенан гӀирÑ',
'prefs-advancedediting' => 'Юкъара параметреш',
+'prefs-preview' => 'Хьалха муха ю хьажар',
'prefs-advancedrc' => 'Кхин Ð³Ó€Ð¸Ñ€Ñ Ð½Ð¸Ñбар',
'prefs-advancedrendering' => 'Кхин Ð³Ó€Ð¸Ñ€Ñ Ð½Ð¸Ñбар',
'prefs-advancedsearchoptions' => 'Кхин Ð³Ó€Ð¸Ñ€Ñ Ð½Ð¸Ñбар',
@@ -1124,10 +1287,19 @@ $1',
'right-proxyunbannable' => 'прокÑен автоматичеÑки блоктохаран чекхбовлар',
'right-unblockself' => 'ша шин блокдӀаÑккхар',
'right-protect' => 'ÐгӀона гӀоралла хийцар а гӀоралла дина агӀо ниÑÑÑ€ а',
+'right-editprotected' => '«{{int:protect-level-sysop}}» бахьанца гӀоралла дина агӀонаш ниÑÑÑ€',
+'right-editsemiprotected' => '«{{int:protect-level-autoconfirmed}}» бахьанца гӀоралла дина агӀонаш ниÑÑÑ€',
'right-editinterface' => 'лелош йолу интерфейÑан хийцам бар',
'right-editusercssjs' => 'кхечу декъашхойн CSS- а JS- а файлаш ниÑÑÑ€',
'right-editusercss' => 'кхечу декъашхойн CSS-файлаш нÑÑÑ€',
'right-edituserjs' => 'кхечу декъашхойн JavaScript-файлаш ниÑÑÑ€',
+'right-editmyusercss' => 'Декъашхочун CSS файлаш таÑÑ€',
+'right-editmyuserjs' => 'Лелош йолу шен JavaScript-файлаш таÑÑ€',
+'right-viewmywatchlist' => 'Шен тергаме могӀане хьажар',
+'right-editmywatchlist' => 'Хьайн тергаме могӀам табар. Тидам бе, цхьадолу динарш могӀам юкъа шаш кхетар ду.',
+'right-viewmyprivateinfo' => 'Хьан долара хаамашка хьажар (маÑала, Ñлектронан адреÑ, бакъ цӀе)',
+'right-editmyprivateinfo' => 'Хьан долара хаамаш ниÑбар (маÑала, Ñлектронан адреÑ, бакъ цӀе)',
+'right-editmyoptions' => 'Тае хьайн гӀоли хетарг',
'right-rollback' => 'билгала агӀона тӀехьарчу декъашхочо дина ниÑдарш Ñиха юхадахар',
'right-markbotedits' => 'юхудохучу ниÑдаршан шаболх бечунна ниÑдарш аьлла билгало Ñн',
'right-noratelimit' => 'чехкалин доза дац',
@@ -1167,6 +1339,7 @@ $1',
'recentchanges' => 'Керла ниÑдарш',
'recentchanges-legend' => 'ГlÐ¸Ñ€Ñ Ð½Ð¸Ñбарна керла ниÑдарш',
'recentchanges-summary' => 'Лахахь гайтина хене хьаьжна Википедин агӀонашкахь тӀаьхьара бина хийцамаш',
+'recentchanges-noresult' => 'Билгал йинчу хенахь цӀа хийцамаш бина бац.',
'recentchanges-feed-description' => 'Тергам бе тlаьхьара вики хийцаман хlокху ларца.',
'recentchanges-label-newpage' => 'Оцу ниÑдарца кхоллина керла агlо.',
'recentchanges-label-minor' => 'Ð¥lара ниÑдинарг къаÑтийна жимо долушÑан',
@@ -1210,6 +1383,7 @@ $1',
'uploadbtn' => 'Файл чуÑккхар',
'reuploaddesc' => 'Юху гӀо файл чуйоккху агӀоне',
'upload-tryagain' => 'ДӀадахьийта хийцина файлах лаьцнарг',
+'uploadnologintext' => 'Серверан чу файлаш Ñха хьо $1.',
'upload-permitted' => 'Магийна файлашан тайпанаш: $1.',
'uploadlogpage' => 'ЧуÑхаран тéптар',
'uploadlogpagetext' => 'Лахахьа гойтуш бу могlам Ñ‚lаьххьара чуÑхна файлаши. Ишта хьажа. [[Special:ImageList|файлаши могlам]] йа [[Special:NewImages|галеларе файлаши]].',
@@ -1333,6 +1507,11 @@ PICT # тайп тайпан
# Random page
'randompage' => 'Цахууш ниÑйелла агӀо',
+# Random page in category
+'randomincategory' => 'Категори чу цахууш нийÑа елла агӀо',
+'randomincategory-selectcategory' => 'Категори чу цахууш нийÑа елла агӀона чу гӀо: $1 $2.',
+'randomincategory-selectcategory-submit' => 'Дехьа гӀо',
+
# Random redirect
'randomredirect' => 'Цахууш ниÑделла дIаÑахьажор',
@@ -1351,9 +1530,6 @@ PICT # тайп тайпан
'statistics-users-active' => 'Жигара декъашхой',
'statistics-users-active-desc' => 'Декъашхой, муьлха цхьа хlум дина болу, кху {{PLURAL:$1|тlаьххьара $1 динахь|тlаьххьара $1 дийнахь}}',
-'disambiguations' => 'Дуккха маьӀнаш долу хьажорца йолу агӀонаш',
-'disambiguationspage' => 'Кеп:цхьатера маьӀна доцуш',
-
'pageswithprop' => 'ÐгӀонаш цхьадолу къаÑтамашца',
'pageswithprop-legend' => 'ÐгӀонаш цхьадолу къаÑтамашца',
'pageswithprop-text' => 'Кхузахь гойтуш ÑŽ агӀонаш цхьадолу къаÑтамаш куьйга юху билгал даьхнарш.',
@@ -1404,6 +1580,7 @@ PICT # тайп тайпан
'mostrevisions' => 'Сих Ñиха ниÑйина йолу агIонаш',
'prefixindex' => 'Хьалха агlонашан цlераш хlотто йеза',
'prefixindex-namespace' => 'Хьалха агӀонашан цӀераш хӀотто еза («{{ns:$1}}»)',
+'prefixindex-strip' => 'Хиламийн могӀам чура Ð¿Ñ€ÐµÑ„Ð¸ÐºÑ ÐºÑŠÐ°Ð¹Ð»Ð°Ñккха',
'shortpages' => 'Боцоа Ñззамаш',
'longpages' => 'Беха Ñззамаш',
'deadendpages' => 'Дика йоцу агIонаш',
@@ -1412,6 +1589,7 @@ PICT # тайп тайпан
'listusers' => 'Декъашхой могlам',
'listusers-editsonly' => 'Цхаъ мукъане а хийцам бина декъашхой гайта',
'listusers-creationsort' => 'Кхолларан хене хьаьжна ниÑÑŠÑÑ€',
+'listusers-desc' => 'Харжа къезиг хиларца',
'usercreated' => '{{GENDER:$3|дӀавазвелла|дӀаÑзелла}} $1 $2',
'newpages' => 'Керла агlонаш',
'newpages-username' => 'Декъашхо:',
@@ -1527,6 +1705,7 @@ PICT # тайп тайпан
'unwatch' => 'Тергамах къаÑта',
'notanarticle' => 'Бац Ñззам',
'watchlist-details' => 'Хьан тергаме могlамца $1 {{PLURAL:$1|агlо|агlонаш|агlонаш}} ю, дийцаре агlонаша йоцуш.',
+'wlheader-showupdated' => "Хийцам бина агӀонаш '''Ӏаьржа''' шрифтцан билгальÑха ÑŽ.",
'wlnote' => 'Лахахьа {{PLURAL:$1|Ñ‚lаьхьа богlу $1 хийцам|Ñ‚lаьхьа богlу $1 хийцамаш|Ñ‚lаьхьа богlу $1 хийцамаш}} Ñ…lокху {{PLURAL:$2|Ñ‚lаьхьар|Ñ‚lаьхьара|Ñ‚lаьхьара}} <strong>$2</strong> {{plural:$2|Ñохьт|Ñохьатехь|Ñохьташкахь}}.',
'wlshowlast' => 'Гайта Ñ‚lаьххьара $1 Ñахьташ $2 денош $3',
'watchlist-options' => 'Тергаме могlаман гlÐ¸Ñ€Ñ Ð½Ð¸Ñбар',
@@ -1971,7 +2150,6 @@ PICT # тайп тайпан
'common.css' => '/** Чуйиллина йолу кхузе CSS хир йу лелош маÑхьа кечйечу чохь */',
'monobook.css' => '/* Чуйиллина йолу кхузе CSS хир йу лелош маÑхьа Monobook чохь */',
'print.css' => '/* Чуйиллина йолу кхузе CSS хир йу лелош маÑхьа зорба тухучуче чохь */',
-'handheld.css' => '/* Чуйиллина йолу кхузе CSS хир йу лелош маÑхьа койнаш чохь, дукхах ерг хатl ниÑдеш оцу $wgHandheldStyle */',
# Scripts
'common.js' => '/* Чуйиллина йолу кхузе JavaScript код гучу ера ÑŽ маÑÑо декъашхошна оцара Ñхьаелларца Ñ…lора агlо */',
@@ -1995,7 +2173,6 @@ PICT # тайп тайпан
'pageinfo-toolboxlink' => 'Ðгlонах болу бовзам',
# Skin names
-'skinname-standard' => 'Лела ма Ñрра',
'skinname-cologneblue' => 'Кёльнин Ñингаттам',
'skinname-modern' => 'Кхузаманан',
'skinname-vector' => 'Векторни',
@@ -2031,6 +2208,7 @@ PICT # тайп тайпан
'newimages' => 'Керлачу файлийн галерий',
'newimages-summary' => 'ХӀокху белхан агӀона чохь гойтуш ю дукха хан йоццуш чуйаьхна файлаш.',
'newimages-legend' => 'Литтар',
+'showhidebots' => '$1 шабелхалой',
'ilsubmit' => 'Лаха',
'sp-newimages-showfrom' => 'Гайта керла файлаш $2, $1 тӀера дуьйна',
@@ -2064,7 +2242,7 @@ PICT # тайп тайпан
* gpslongitude
* gpsaltitude',
-# EXIF tags
+# Exif tags
'exif-imagewidth' => 'Шоралла',
'exif-imagelength' => 'Локхалла',
'exif-bitspersample' => 'БеÑан кIоргалла',
@@ -2108,7 +2286,7 @@ PICT # тайп тайпан
'exif-pngfilecomment' => 'PNG-файлан билгалдаккхар',
'exif-giffilecomment' => 'GIF-файлан билгалдаккхар',
-# EXIF attributes
+# Exif attributes
'exif-compression-1' => 'ТIеIовдан Ñц',
'exif-copyrighted-false' => 'Юкъараллин хьал',
@@ -2205,10 +2383,16 @@ PICT # тайп тайпан
'version-other' => 'Кхин',
'version-license' => 'Бакъо',
-# Special:FilePath
-'filepath' => 'ХIуман тIе болу некъ',
-'filepath-page' => 'Файл:',
-'filepath-submit' => 'Дехьа гӀо',
+# Special:Redirect
+'redirect' => 'Декъашхочун файлан тӀера дӀаÑхьажор',
+'redirect-legend' => 'Файлан Ñ Ð°Ð³Ó€Ð¾Ð½Ð° тӀера дӀаÑхьажор',
+'redirect-summary' => 'ХӀара агӀо лело йиш ÑŽ файлан Ñ Ð°Ð³Ó€Ð¾Ð½Ð° тӀера дӀаÑхьажош.',
+'redirect-submit' => 'Дехьа гӀо',
+'redirect-lookup' => 'Лаха:',
+'redirect-value' => 'МаьӀна:',
+'redirect-user' => 'Декъашхочун ID',
+'redirect-revision' => 'ÐгӀона верÑи',
+'redirect-file' => 'Файлан цӀе',
# Special:FileDuplicateSearch
'fileduplicatesearch' => 'Лаха цхьатера йолу файлаш',
@@ -2243,6 +2427,7 @@ PICT # тайп тайпан
'tags' => 'Болш болу хийцаман къаÑтам',
'tag-filter' => 'КъаÑтам [[Special:Tags|хьажар]]:',
'tag-filter-submit' => 'Литта',
+'tag-list-wrapper' => '([[Special:Tags|{{PLURAL:$1|Билгало|Билгалонаш}}]]: $2)',
'tags-title' => 'Билгалонаш',
'tags-intro' => 'ХӀокху агӀона чохь гойтуш бу билгалошан могӀам царца программин латторо билгал доху ниÑдарш, кхин билгалошан маьӀна а.',
'tags-tag' => 'Билгалона цӀе',
@@ -2295,4 +2480,17 @@ PICT # тайп тайпан
# Search suggestions
'searchsuggest-search' => 'Лаха',
+# Limit report
+'limitreport-title' => 'ÐгӀона хӀоттам къаÑторан хаамаш:',
+'limitreport-cputime' => 'ПроцеÑÑоран хан лелор',
+'limitreport-walltime' => 'Йодуш йолу хенахь лелор',
+'limitreport-ppvisitednodes' => 'ПрепроцеÑÑор хьаьжна шадин дукхалла',
+'limitreport-ppgeneratednodes' => 'ПрепроцеÑÑÐ¾Ñ€Ñ Ñгенерировать бина шадин дукхалла',
+'limitreport-postexpandincludesize' => 'СхьаÑÑŒÑтина юккъерчаран барам',
+'limitreport-postexpandincludesize-value' => '$1/$2 {{PLURAL:$2|байт|байташ}}',
+'limitreport-templateargumentsize' => 'Кепан аргументан барам',
+'limitreport-templateargumentsize-value' => '$1/$2 {{PLURAL:$2|байт|байташ}}',
+'limitreport-expansiondepth' => 'Шордаларан уггар йокха кӀоргалла',
+'limitreport-expensivefunctioncount' => 'ÐгӀона хӀоттам къаÑторан «еза» функцеш',
+
);
diff --git a/languages/messages/MessagesCeb.php b/languages/messages/MessagesCeb.php
index f8910a16..7bb494f2 100644
--- a/languages/messages/MessagesCeb.php
+++ b/languages/messages/MessagesCeb.php
@@ -97,9 +97,6 @@ $messages = array(
'tog-shownumberswatching' => 'Ipakita ang gidaghanon sa mga gumagamit nga nagbantay usab',
'tog-oldsig' => 'Paunang tan-aw sa eksisting nga pirma:',
'tog-fancysig' => 'Hilaw nga pirma (walay awtomatikong sumpay)',
-'tog-externaleditor' => 'Gamita ang eksternal nga editor isip default (para sa mga eksperto lamang, kinahanglan og espesyal nga setting sa imong kompyuter)',
-'tog-externaldiff' => 'Gamita ang eksternal nga diff isip default (para sa mga eksperto lamang, kinahanglan og espesyal nga setting sa imong kompyuter)',
-'tog-showjumplinks' => 'I-enable ang "ambak sa" nga sumpay sa aksesibilidad',
'tog-uselivepreview' => 'Gamita ang live nga paunang tan-aw (JavaScript kinahanglan) (Eksperimental)',
'tog-forceeditsummary' => 'Pahibaloi ako kon blangko ang mubong sugid alang sa pag-usab',
'tog-watchlisthideown' => 'Tagoa ang akong mga giusab',
@@ -288,7 +285,7 @@ Palihog paghulat bag-o nimo sulayan pag-akses og usab ang kining panid.
$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).
+# 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).
'aboutsite' => 'Mahitungod sa {{SITENAME}}',
'aboutpage' => 'Project:Mahitungod sa',
'copyright' => 'Mga sulod makita sa $1.',
@@ -298,7 +295,6 @@ $1',
'disclaimers' => 'Mga pagpasabot',
'disclaimerpage' => 'Project:Mga pagpasabot',
'edithelp' => 'Tabang sa pag-usab',
-'edithelppage' => 'Help:Pag-usab',
'helppage' => 'Help:Mga sulod',
'mainpage' => 'Unang Panid',
'mainpage-description' => 'Unang Panid',
@@ -365,17 +361,6 @@ Ang lista sa mga balidong espesyal nga mga panid makita sa [[Special:SpecialPage
# General errors
'error' => 'Sayop',
'databaseerror' => 'Sayop sa database',
-'dberrortext' => 'May nahitabong sayop sa database query syntax.
-Mahimong nagpakita kini og bug sa software.
-Ang naulahing gi-attempt nga database query mao ang:
-<blockquote><tt>$1</tt></blockquote>
-from within function "<tt>$2</tt>".
-MySQL returned error "<tt>$3: $4</tt>".',
-'dberrortextcl' => 'May nahitabong sayop sa database query syntax.
-Ang naulahing gi-attempt nga database query mao ang:
-"$1"
-from within function "$2".
-MySQL returned error "$3: $4"',
'laggedslavemode' => 'Pahibalo: Mahimong dili mahiapil sa panid ang mga bag-ong kausaban.',
'readonly' => 'Gitrangkahan ang database',
'enterlockreason' => 'Pagbutang og rason para sa lock, apil ang banabana kon kanus-a ma-release ang lock',
@@ -426,7 +411,6 @@ Palihog sulayi'g usab sa pipila ka minutos.",
'editinginterface' => "'''Pahibalo:''' Imo nang usbon ang panid nga gigamit sa paghatag og interface text para sa software.
Ang mga pag-usab niining panid moapekto sa appearance sa user interface nga alang sa ubang gumagamit.
Para sa mga paghubad, palihog ikonsider ang paggamit sa [//translatewiki.net/wiki/Main_Page?setlang=ceb translatewiki.net], ang MediaWiki localisation project.",
-'sqlhidden' => '(nakatagong SQL query)',
'cascadeprotected' => 'Ang kining panid giprotektahan sa pag-usab tungod kay nahiapil kini sa mosunod nga {{PLURAL:$1|panid, nga|mga panid, nga}} giprotektahan pinaagi sa pag-turn on gamit ang "cascading" nga opsyon:
$2',
'namespaceprotected' => "Wala kay permiso nga mag-usab sa mga panid sa '''$1''' nga ngalang espasyo.",
@@ -711,7 +695,6 @@ Hinumdomi nga ang paggamit sa mga sumpay sa nabigasyon mo-reset sa column.',
'prevn' => 'miaging {{PLURAL:$1|$1}}',
'nextn' => 'sunod {{PLURAL:$1|$1}}',
'viewprevnext' => 'Tan-awa sa ($1 {{int:pipe-separator}} $2) ($3)',
-'searchhelp-url' => 'Help:Mga sulod',
'searchprofile-everything' => 'Tanan ng bagay',
'search-result-size' => '$1 ({{PLURAL:$2|1 pulong|$2 ka mga pulong}})',
'search-redirect' => '(redirek $1)',
@@ -737,14 +720,6 @@ Sulayi'g prefix ang imong gipangita gamit ang ''all:'' alang mangita sa tanang s
Puyde ka mangita gamit ang Google sa kasamtangan.
Hinumdomi nga ang ilang indeks sa sulod sa {{SITENAME}} mahimong dugay-dugay na.',
-# Quickbar
-'qbsettings' => 'Quickbar',
-'qbsettings-none' => 'Wala',
-'qbsettings-fixedleft' => 'Naka-fix sa wala',
-'qbsettings-fixedright' => 'Naka-fix sa tuo',
-'qbsettings-floatingleft' => 'Floating sa wala',
-'qbsettings-floatingright' => 'Floating sa tuo',
-
# Preferences page
'preferences' => 'Mga preperensiya',
'mypreferences' => 'Akong preperensiya',
@@ -772,7 +747,6 @@ Hinumdomi nga ang ilang indeks sa sulod sa {{SITENAME}} mahimong dugay-dugay na.
'resetprefs' => 'Limpyohi ang wala matipigi nga mga kausaban',
'restoreprefs' => 'Ibalik ang tanang default settings',
'prefs-editing' => 'Nagausab',
-'prefs-edit-boxsize' => 'Size sa edit window.',
'rows' => 'Mga row:',
'columns' => 'Mga kolum:',
'searchresultshead' => 'Pangitaa',
@@ -811,7 +785,6 @@ Hinumdomi nga ang ilang indeks sa sulod sa {{SITENAME}} mahimong dugay-dugay na.
'prefs-reset-intro' => 'Puyde nimo gamiton ang kining panid aron ma-reset ang imong mga preprensiya ngadto sa default sa sayt.
Dili kini puyde mabalik.',
'prefs-emailconfirm-label' => 'Kompirmasyon sa e-mail:',
-'prefs-textboxsize' => 'Size sa editing window',
'youremail' => 'E-mail:',
'username' => 'Username:',
'uid' => 'ID sa gumagamit:',
diff --git a/languages/messages/MessagesCh.php b/languages/messages/MessagesCh.php
index 19117a7f..53e43065 100644
--- a/languages/messages/MessagesCh.php
+++ b/languages/messages/MessagesCh.php
@@ -49,7 +49,6 @@ $messages = array(
'tog-enotifminoredits' => "E-mail yu' lokkue' ni mandikike' na tinilaika gi pÂÃ¥hina siha.",
'tog-enotifrevealaddr' => "Na'annok iyo-ku e-mail address gi notifikasion e-mail.",
'tog-shownumberswatching' => "Na'annok i numirun muna'sesetbi siha ni mana'atan.",
-'tog-showjumplinks' => "Na'sedi i ina'chetton ni \"ta'yoki guatu\"",
'tog-forceeditsummary' => "Na'tungo' yu' annai mamo'lu yu' summaria gueku",
'tog-watchlisthideown' => "NÃ¥'na' tinilaika-hu gi listan pinilan",
'tog-watchlisthidebots' => "NÃ¥'na' i tinilaikan bot gi listan pinilan",
@@ -203,7 +202,7 @@ $messages = array(
'jumptonavigation' => 'nabegasion',
'jumptosearch' => 'aligao',
-# 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).
+# 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).
'aboutsite' => 'Pot {{SITENAME}}',
'aboutpage' => 'Project:Pot',
'copyright' => 'Guåha i sinahguan gi halom $1.',
@@ -213,7 +212,6 @@ $messages = array(
'disclaimers' => 'Diklarasion Inadahi',
'disclaimerpage' => 'Project:Diklarasion inadahi henerat',
'edithelp' => 'Ayudo tumulaika',
-'edithelppage' => 'Help:Tumulaika',
'helppage' => 'Help:Guinaha',
'mainpage' => 'Fanhaluman',
'mainpage-description' => 'Fanhaluman',
@@ -631,7 +629,6 @@ Fanapunta na para u na'nuebu i kolumna anggen un usa i inachetton nabegasion.",
'prevn' => "{{PLURAL:$1|$1}} ni manmå'pos",
'nextn' => "{{PLURAL:$1|$1}} ni manmamaila'",
'viewprevnext' => 'Atan i ($1 {{int:pipe-separator}} $2) ($3)',
-'searchhelp-url' => 'Help:Guinaha',
'search-result-size' => '$1 ({{PLURAL:$2|1 na palabra|$2 na palabra siha}})',
'search-result-score' => 'Prinisisu: $1%',
'search-redirect' => "(na'dirihi $1)",
@@ -657,13 +654,6 @@ Fanapunta na para u na'nuebu i kolumna anggen un usa i inachetton nabegasion.",
Siña hao manaligao gi Google gi entretanto.
Fanapunta na fana'an ti gus nuebu i listan-ñiha i guinahan {{SITENAME}}.",
-# Quickbar
-'qbsettings-none' => "TÃ¥ya'",
-'qbsettings-fixedleft' => 'Maplanta gi akague',
-'qbsettings-fixedright' => "Maplanta gi agapa'",
-'qbsettings-floatingleft' => "Mamå'ya gi akague",
-'qbsettings-floatingright' => "Mamå'ya gi agapa'",
-
# Preferences page
'preferences' => "I ga'ña-mu",
'mypreferences' => "I ga'ña-hu",
@@ -755,7 +745,6 @@ Yanggen un decidi mamo'lu, ma'usa ha' sempre para muna'i hao ni kreditu ni che'c
'recentchangeslinked-feed' => 'Umachetton na tinilaika siha',
'recentchangeslinked-toolbox' => 'Umachetton na tinilaika siha',
'recentchangeslinked-title' => 'Tinilaika pumarehu yan "$1"',
-'recentchangeslinked-noresult' => "Tåya' na tinilaika siha ni maninachetton na påhina gi tiempon ma'ayek.",
'recentchangeslinked-summary' => "Lista este ni tinilaika siha gi halacha ginen un påhina ma'ayek (pat ni miembro siha ginen un katigoria ma'ayek).
'''Potpot''' i påhina siha ginen [[Special:Watchlist|Listan pinilan-mu]].",
'recentchangeslinked-page' => "Nå'an i påhina:",
@@ -803,9 +792,6 @@ Yanggen un decidi mamo'lu, ma'usa ha' sempre para muna'i hao ni kreditu ni che'c
# Statistics
'statistics-mostpopular' => "PÃ¥hina siha ni mas ma'atan",
-'disambiguations' => "Ti mania'abak na påhina siha",
-'disambiguationspage' => 'Template:disambig',
-
'doubleredirects' => "Mandoble na inachetton ma'dirihi siha",
'brokenredirects' => "Manmayulang na muna'dirihi siha",
diff --git a/languages/messages/MessagesChr.php b/languages/messages/MessagesChr.php
index 845ae8c9..9867ae2b 100644
--- a/languages/messages/MessagesChr.php
+++ b/languages/messages/MessagesChr.php
@@ -46,6 +46,7 @@ $messages = array(
'navigation' => 'Ꭰá‚Ꭹáá— á¥á³',
# Cologne Blue skin
+'qbpageinfo' => 'ᎦᎷᎯáá—',
'qbspecialpages' => 'Ꭴá¤áŽµá›',
'help' => 'ᎠᎵáá•áŽ¸á—',
diff --git a/languages/messages/MessagesCkb.php b/languages/messages/MessagesCkb.php
index ef5852bc..6716b784 100644
--- a/languages/messages/MessagesCkb.php
+++ b/languages/messages/MessagesCkb.php
@@ -61,17 +61,20 @@ $specialPageAliases = array(
'Allmessages' => array( 'ھەموو_پەیامەکان' ),
'Allpages' => array( 'ھەموو_پەڕەکان' ),
'Ancientpages' => array( 'پەڕە_کۆنەکان' ),
+ 'Blankpage' => array( 'پەڕەی_واڵا' ),
+ 'Booksources' => array( 'سەرچاوەکانی_کتێب' ),
'BrokenRedirects' => array( 'ڕەوانکەرە_شکاوەکان' ),
'Categories' => array( 'پۆلەکان' ),
'ChangePassword' => array( 'تێپەڕوشەگۆڕان،_تێپەڕەوشە_ڕێکخستنەوە' ),
'Confirmemail' => array( 'بڕواکردن_ئیمەیل' ),
'Contributions' => array( 'بەشدارییەکان' ),
- 'CreateAccount' => array( 'ھەژمار_دروستکردن' ),
+ 'CreateAccount' => array( 'دروستکردنی_ھەژمار' ),
'Deadendpages' => array( 'پەڕە_بەربەستراوەکان' ),
'DoubleRedirects' => array( 'ڕەوانکەرە_دووپاتکراوەکان' ),
'Emailuser' => array( 'ئیمەیل_بەکارھێنەر' ),
'Export' => array( 'ھەناردن' ),
'Fewestrevisions' => array( 'کەمترین__پێداچوونەوەکان' ),
+ 'Import' => array( 'ھاوردن' ),
'Listadmins' => array( 'لیستی_بەڕێوبەران' ),
'Listbots' => array( 'لیستی_بۆتەکان' ),
'Listfiles' => array( 'لیستی_پەڕگەکان' ),
@@ -176,9 +179,6 @@ $messages = array(
'tog-shownumberswatching' => 'ژمارەی بەکارھێنەرە چاودێڕەکان نیشان بدە',
'tog-oldsig' => 'واژووی ئێستا:',
'tog-fancysig' => 'وەکوو ویکیدەق واژووەکە لەبەر چاو بگرە (بێ بەستەرێکی خۆگەڕ)',
-'tog-externaleditor' => 'دەستکاریکەری دەرەکی بەکاربێنە Ù„Û• حاڵەتی دیÙاڵتدا (تەنھا بۆ شارەزایان، ڕێکخستنی تایبەتی پێویستە Ù„Û• سەر کۆمپیوتەرەکەت [//www.mediawiki.org/wiki/Manual:External_editors زانیاریی زۆرتر.])',
-'tog-externaldiff' => 'Ù„Û• پرۆگرامێکی دەرەکی بۆ بینینی جیاوازیەکان Ú©Û•ÚµÚ© وەرگرە Ù„Û• دیÙاڵتدا (تەنها بۆ شارەزایان، ڕێکخستنی تایبەتی پێویستە Ù„Û• سەر کۆمپیوتەرەکەت. [//www.mediawiki.org/wiki/Manual:External_editors زانیاریی زۆرتر.])',
-'tog-showjumplinks' => 'ڕێگە بدە بۆ بەستەرەکانی «{{int:jumpto}}»',
'tog-uselivepreview' => 'لە پێشبینینی زیندوو کەڵک وەرگرە (جاڤاسکریپت پێویستە) (تاقیکاری‌)',
'tog-forceeditsummary' => 'ئەگەر کورتەی دەستکاریم نەنووسی پێم بڵێ',
'tog-watchlisthideown' => 'دەستکارییەکانم بشارەوە لە پێرستی چاودێری',
@@ -192,6 +192,7 @@ $messages = array(
'tog-showhiddencats' => 'پۆلە شاردراوەکان نیشان بدە',
'tog-noconvertlink' => 'لەکارخستنی ئاڵوگۆڕی سەرناوی بەستەر',
'tog-norollbackdiff' => 'لە دوای گەڕاندنەوە جیاوازی نیشان مەدە',
+'tog-useeditwarning' => 'ھۆشیارم بکەوە کاتێک لە پەڕەیەکی دەستکاری بە گۆڕانکاریی پاشەکەوت‌نەکراو دەردەچم',
'underline-always' => 'ھەمیشە',
'underline-never' => 'قەت',
@@ -255,6 +256,18 @@ $messages = array(
'oct' => 'تشرینی یەکەم',
'nov' => 'تشرینی دووەم',
'dec' => 'کانوونی یەکەم',
+'january-date' => '$1ی کانوونی دووەم',
+'february-date' => '$1ی شوبات',
+'march-date' => '$1ی ئازار',
+'april-date' => '$1ی نیسان',
+'may-date' => '$1ی ئایار',
+'june-date' => '$1ی حوزەیران',
+'july-date' => '$1ی تەممووز',
+'august-date' => '$1ی ئاب',
+'september-date' => '$1ی ئەیلوول',
+'october-date' => '$1ی تشرینی یەکەم',
+'november-date' => '$1ی تشرینی دووەم',
+'december-date' => '$1ی کانوونی یەکەم',
# Categories related messages
'pagecategories' => '{{PLURAL:$1|پۆل|پۆلەکان}}',
@@ -337,6 +350,7 @@ $messages = array(
'create-this-page' => 'ئەم پەڕە دروست بکە',
'delete' => 'سڕینەوە',
'deletethispage' => 'سڕینه‌وه‌ی ئه‌م په‌ڕه‌یه‌',
+'undeletethispage' => 'ئەم پەڕەیە بھێنەوە',
'undelete_short' => '{{PLURAL:$1|یەک گۆڕانکاریی|$1 گۆڕانکاریی}} سڕاوە بەجێبھێنەرەوە',
'viewdeleted_short' => '{{PLURAL:$1|یەک گۆڕانکاریی سڕاو|$1 گۆڕانکاریی سڕاو}} ببینە',
'protect' => 'پاراستن',
@@ -378,7 +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).
+# 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).
'aboutsite' => 'سەبارەت بە {{SITENAME}}',
'aboutpage' => 'Project:سەبارەت',
'copyright' => 'ناوەرۆک لە ژێر $1 لەبەردەستدایە.',
@@ -388,7 +402,6 @@ $1',
'disclaimers' => 'نابەرپرسییەکان',
'disclaimerpage' => 'Project:بەرپرسنەبوون',
'edithelp' => 'ڕێنوێنیی دەستکاریکردن',
-'edithelppage' => 'Help:دەستکاریکردن',
'helppage' => 'Help:ناوەرۆک',
'mainpage' => 'دەستپێک',
'mainpage-description' => 'دەستپێک',
@@ -470,17 +483,6 @@ $1',
# General errors
'error' => 'هه‌ڵه‌',
'databaseerror' => 'ھەڵەی بنکەدراوه',
-'dberrortext' => 'ھەڵەیەکی ڕستەنووسی لە داواکاریی بنکەیدراو ڕووی داوە.
-لەوانەیە ئەوە نیشاندەری کەلێنێک لە نەرمامێرەکەدا بێت.
-دوایین تێکۆشان بۆ داواکاری بنکەیدراو:
-<blockquote><code>$1</code></blockquote>
-لە ناو کرداری "<code>$2</code>".
-بنکەیدراو ھەڵەی "<samp>$3: $4</samp>" گەڕاندووەتەوە.',
-'dberrortextcl' => 'هەڵەیەکی ڕستەنووسی لە داواکاریی بنکە‌یدراو ڕوویداوە.
-دوایین تێکۆشان بۆ داواکاری بنکەیدراو ئەمە بووە:
-"$1"
-لە نێو کرداری "$2".
-بنکەیدراو ھەڵەی "$3: $4" گەڕاندووەتەوە',
'laggedslavemode' => 'ئاگاداری: لەوانەیە لاپەڕەکە نوێکردنەکان لە بەر نەگرێت.',
'readonly' => 'بنکەدراوە داخراوە',
'enterlockreason' => 'هۆیەک بۆ قوÙڵ‌کردنەکە بنووسە Ú©Û• تێیدا کاتی کردنەوەی Ù‚Û†ÙÚµÛ•Ú©Û• باس کرابێت',
@@ -536,7 +538,6 @@ $1',
'editinginterface' => "'''ئاگاداری:''' تۆ خەریکی دەستکاریی پەڕەیەکی کە بۆ دابینکردنی دەقی ڕواڵەتی نەرمامێر بە کار دەھێنرێت.
گۆڕانکاریی ئەم پەڕەیە کاریگەر دەبێت لە سەر ڕواڵەتی پەڕەکانی بەکارھێنەرانی تر لەم ویکییەدا.
بۆ زیادکردن یان گۆڕینی وەرگێڕانەکان بۆ ھەموو ویکییەکان، تکایە لە [//translatewiki.net/ translatewiki.net]، پرۆژەی ناوچەیی کردنی میدیاویکی کەڵک وەربگرە.",
-'sqlhidden' => '(داواکاریی SQL شاراوەیە)',
'cascadeprotected' => 'ئەم لاپەڕە پارێزراوە لە دەستکاریی، چونکا خراوەتە سەر ڕیزی ئەم {{PLURAL:$1|لاپەڕانه‌، کە}} که‌ به‌ هه‌ڵکردنی بژارده‌ی داڕژان هه‌ڵکراوه‌:
$2',
'namespaceprotected' => "تۆ ناتوانی لاپەڕەکانی ناو نەیمسپەیسی '''$1''' بگۆڕی.",
@@ -559,10 +560,19 @@ $2',
'welcomecreation-msg' => 'ھەژمارەکەت دروست کرا.
لە بیرت نەچێت [[Special:Preferences|ھەڵبژاردەکانی {{SITENAME}}]]ت بگۆڕی.',
'yourname' => 'ناوی بەکارھێنەری:',
+'userlogin-yourname' => 'ناوی بەکارھێنەر',
+'userlogin-yourname-ph' => 'ناوی بەکارھێنەریت بنووسە',
+'createacct-another-username-ph' => 'ناوی بەکارھێنەریت بنووسە',
'yourpassword' => 'تێپەڕوشە:',
+'userlogin-yourpassword' => 'تێپەڕوشە',
+'userlogin-yourpassword-ph' => 'تێپەڕوشەکەت بنووسە',
+'createacct-yourpassword-ph' => 'تێپەروشەیەک بنووسە',
'yourpasswordagain' => 'دیسان تێپەڕوشەکە بنووسەوە:',
+'createacct-yourpasswordagain' => 'تێپەروشە پشتڕاست بکەرەوە',
+'createacct-yourpasswordagain-ph' => 'تێپەروشە دیسان بنووسەوە',
'remembermypassword' => 'چوونە ژوورەوەم لەسەر ئەم کۆمپیوتەرە پاشەکەوت بکە (ئەو پەڕی $1 {{PLURAL:$1|ڕۆژ}}ە)',
-'securelogin-stick-https' => 'پاش چوونەژوورەوە پەیوەندیی لەگەڵ HTTPS بھێڵەوە',
+'userlogin-remembermypassword' => 'چوونەژوورەوەکەم ڕابگرە',
+'userlogin-signwithsecure' => 'پەیوەندیی دڵنیا بەکاربھێنە',
'yourdomainname' => 'دۆمەینەکەت:',
'password-change-forbidden' => 'ناتوانیت تێپەڕوشەکانت لەم ویکییەدا بگۆڕیت.',
'externaldberror' => 'یان هەڵەی ڕێگەپێدانی بنکەدراو هەیە یان ڕێگات پێ نادرێت بۆ نوێ کردنی هەژماری دەرەکیت.',
@@ -574,18 +584,38 @@ $2',
'logout' => 'بچۆ دەرەوە',
'userlogout' => 'بچۆ دەرەوە',
'notloggedin' => 'لە ژوورەوە نیت',
+'userlogin-noaccount' => 'ھەژمارت نییە؟',
+'userlogin-joinproject' => 'Ú•Û•Ú¯Û•Úµ {{SITENAME}} Ú©Û•ÙˆÛ•',
'nologin' => 'ھەژمارت نییە؟ $1.',
'nologinlink' => 'ھەژمارێک دروست بکە',
'createaccount' => 'ھەژمار دروست بکە',
'gotaccount' => 'ھەژمارت ھەیە لێرە؟ $1.',
'gotaccountlink' => 'بچۆ ژوورەوە',
'userlogin-resetlink' => 'وردەکارییەکانی چوونەژوورەوەتت لە بیر کردووە؟',
+'userlogin-resetpassword-link' => 'تێپەڕوشە ڕیسێت بکەوە',
+'helplogin-url' => 'Help:چوونەژوورەوە',
+'userlogin-helplink' => '[[{{MediaWiki:helplogin-url}}|یارمەتی بۆ چوونەژوورەوە]]',
+'createacct-join' => 'زانیارییەکەت لە ژێرەوە بنووسە.',
+'createacct-emailrequired' => 'ناونیشانی ئیمەیل',
+'createacct-emailoptional' => 'ناونیشانی ئیمەیل (دڵخوازانە)',
+'createacct-email-ph' => 'ناونیشانی ئیمەیلەکەت بنووسە',
'createaccountmail' => 'تێپەڕوشەیەکی ڕەمەکیی کاتی بەکاربھێنە و بینێرە بۆ ناونیشانی ئیمەیلی دیاری‌کراوی ژێرەوە',
+'createacct-realname' => 'ناوی ڕاستی (دڵخوازانە)',
'createaccountreason' => 'هۆکار:',
+'createacct-reason' => 'ھۆکار',
+'createacct-reason-ph' => 'بۆ ھەژمارێکی تر دروست دەکەی',
+'createacct-captcha' => 'تاوتوێی ئاسایشی',
+'createacct-imgcaptcha-ph' => 'دەقەکەی لە ژێرەوە دەیبینی بینووسە',
+'createacct-submit' => 'ھەژمارەکەت دروست بکە',
+'createacct-benefit-heading' => '{{SITENAME}} لە لایەن کەسانێک وەکوو خۆت دروست کراوە.',
+'createacct-benefit-body1' => '{{PLURAL:$1|دەستکاری}}',
+'createacct-benefit-body2' => '{{PLURAL:$1|Ù¾Û•Ú•Û•}}',
+'createacct-benefit-body3' => 'دوایین {{PLURAL:$1|بەشداربوو|بەشداربووان}}',
'badretype' => 'تێپەڕوشەکان لەیەک ناچن.',
'userexists' => 'ئەو ناوەی تۆ داوتە پێشتر بەکارھێنراوە.
ناوێکی دیکە ھەڵبژێرە.',
'loginerror' => 'ھەڵەی چوونەژوورەوە',
+'createacct-error' => 'ھەڵە لە دروستکردنی ھەژمار',
'createaccounterror' => 'ناتوانیت هەژماری بەکارهێنەر دروست بکەیت: $1',
'nocookiesnew' => 'ھەژماری بەکارھێنەر دروست‌کرا، بەڵام بە سەرکەوتوویی نەچوویتەوە ژوورەوە.
{{SITENAME}} بۆ چوونەوە ژوورەوەی بەکارھێنەر لە شەکرۆکە کەڵک وەردەگرێت.
@@ -657,7 +687,7 @@ $2',
'newpassword' => 'تێپەڕوشەی نوێ:',
'retypenew' => 'تێپەڕوشەی نوێ دوبارە بنووسەوە:',
'resetpass_submit' => 'تێپەڕوشە رێکخە و بچۆ ژوورەوە',
-'resetpass_success' => 'تێپەروشەکەت بە سەرکەوتوویی گۆڕدرا. ئێستا چوونە ژوورەوەت...',
+'changepassword-success' => 'تێپەروشەکەت بە سەرکەوتوویی گۆڕدرا. ئێستا چوونە ژوورەوەت...',
'resetpass_forbidden' => 'تێپەڕوشەکە ناگۆڕدرێت',
'resetpass-no-info' => 'بۆ گەیشتنی راستەوخۆ بەم پەڕە ئەشێ بچیتە ژوورەوە.',
'resetpass-submit-loggedin' => 'تێپەڕوشە بگۆڕە',
@@ -668,7 +698,6 @@ $2',
# Special:PasswordReset
'passwordreset' => 'دووبارە ڕێکخستنەوەی تێپەڕوشە',
-'passwordreset-text' => 'ئەم Ùۆرمە Ù¾Ú• بکەوە بۆ گرتنی ئیمەیلێکی بیرخەرەوەی وردەکارییەکانی ھەژمارەکەت.',
'passwordreset-legend' => 'دووبارە ڕێکخستنەوەی تێپەڕوشە',
'passwordreset-username' => 'ناوی بەکارھێنەری:',
'passwordreset-domain' => 'پاوان:',
@@ -693,7 +722,7 @@ $2
تێپەڕوشەی کاتی: $2',
'passwordreset-emailsent' => 'ئیمەیلێکی ڕیسێتکردنەوەی تێپەڕوشە نێردرا.',
'passwordreset-emailsent-capture' => 'ئیمەیلێکی ڕیسێتکردنەوەی تێپەڕوشە نێردرا، کە لە ژێرەوە نیشان دراوە.',
-'passwordreset-emailerror-capture' => 'ئیمەیلێکی بیرخەرەوە نێردرا کە لە خوارەوە نیشاندراوە، بەڵام ناردنی بۆ بەکارھێنەر تووشی ھەڵە بووە: $1',
+'passwordreset-emailerror-capture' => 'ئیمەیلێکی ڕیسێتکردنەوەی تێپەڕوشە نێردرا، کە لە ژێرەوە نیشان دراوە، بەڵام ناردنەکەی بۆ {{GENDER:$2|بەکارھێنەر}} سەرکەوتوو نەبوو: $1',
# Special:ChangeEmail
'changeemail' => 'ئەدرەسی ئیمەیڵ بگۆڕە',
@@ -906,10 +935,12 @@ $2
لەوە دەچی سڕدرابێتەوه.‌',
'edit-conflict' => 'کێشەی دەستکاری.',
'edit-no-change' => 'دەستکاریەکەت بەرچاو نەخرا، لەبەر ئەوەی هیچ گۆڕانکارییەکت لەسەر دەقەکە نەکردووە.',
+'postedit-confirmation' => 'دەستکارییەکەت پاشەکەوت کرا.',
'edit-already-exists' => 'تواناییی دروستکردنی پەڕەی نوێ نییە.
ئەمە پەڕەیە پێشتر هەبووە.',
'defaultmessagetext' => 'دەقی پەیامی هەمیشەیی',
'invalid-content-data' => 'دراوەی ناوەرۆکی نادروست',
+'editwarning-warning' => 'بەجێ‌هێشتنی ئەم لاپەڕەیە دەبێتە هۆی لە‌دەست چوونی هەموو ئەو گۆڕانکاریانەی کردووتە.',
# Content models
'content-model-wikitext' => 'ویکیدەق',
@@ -1137,7 +1168,6 @@ $1",
'searchmenu-legend' => 'ھەڵبژاردەکانی گەڕان',
'searchmenu-exists' => "'''پەڕەیەک بە ناوی «[[:$1]]» لەم ویکییەدا ھەیە.'''",
'searchmenu-new' => "'''لەم ویکییەدا پەڕەی « [[:$1]] » دروست بکە!'''",
-'searchhelp-url' => 'Help:پێرست',
'searchmenu-prefix' => '[[Special:PrefixIndex/$1|گەڕیان لە پەڕەکانی بەم پێشگرەوە]]',
'searchprofile-articles' => 'پەڕە بە ناوەڕۆکەکان',
'searchprofile-project' => 'پەڕەکانی یارمەتی و پڕۆژە',
@@ -1182,14 +1212,6 @@ $1",
دەتوانی بۆ ئێستا لە گەڕانی گووگڵ کەڵک وەرگری.
لەیادت بێت لەوانەیە پێرستەکانیان بۆ گەڕانی ناو {{SITENAME}}، کات‌بەسەرچوو بێت.',
-# Quickbar
-'qbsettings' => 'خێرا-تووڵ',
-'qbsettings-none' => 'هیچ',
-'qbsettings-fixedleft' => 'چەپ‌ سەپێندراو',
-'qbsettings-fixedright' => 'ڕاست سەپێندراو',
-'qbsettings-floatingleft' => 'سەراوی چەپ',
-'qbsettings-floatingright' => 'سەراوی ڕاست',
-
# Preferences page
'preferences' => 'ھەڵبژاردەکان',
'mypreferences' => 'ھەڵبژاردەکان',
@@ -1222,7 +1244,6 @@ $1",
'resetprefs' => 'گۆڕانکارییە پاشەکەوت نەکراوەکان پاک بکەرەوە',
'restoreprefs' => 'ھەموو ڕێکخستنەکان ببەرەوە بۆ باری بنچینەیی',
'prefs-editing' => 'دەستکاریکردن',
-'prefs-edit-boxsize' => 'قەبارەی پەنجەرەی دەستکاریکردن.',
'rows' => 'ڕیزەکان:',
'columns' => 'ستوونەکان:',
'searchresultshead' => 'گەڕان',
@@ -1233,9 +1254,6 @@ $1",
'recentchangesdays-max' => '(ئەوپەڕی $1 {{PLURAL:$1|ڕۆژە|ڕۆژە}})',
'recentchangescount' => 'ژمارەی گۆڕانکارییەکان Ú©Û• نیشان ئەدرێن Ù„Û• حاڵەتی دیÙاڵت:',
'prefs-help-recentchangescount' => 'ئەمە دوایین گۆڕانکارییەکان، مێژووی پەڕەکان و لۆگەکانیش لەبەردەگرێت.',
-'prefs-help-watchlist-token' => 'بە Ù¾Ú• کردنەوەی ئەم شوێنە بۆشاییە بە وشەیەکی نهێنی، Ùیدی RSS بۆ لیستی چاودێریەکەت درووست دەکرێت.
- هەر کەس ئەو وشە نهێنیەی هەبێ دەتوانێ چاو لە لیستی چاودێریەکەت بکات، بۆیە دراوەیەکی پارێزراو هەڵیبژێرە.
-Ùەرموو ئەمە دراوەیەکی بە هەڵکەوت درووست‌کراو Ú©Û• دەتوانی Ú©Û•ÚµÚ©ÛŒ لێ‌وەرگری: $1',
'savedprefs' => 'ھەڵبژاردەکانت پاشەکەوت کران',
'timezonelegend' => 'ناوچەکات:',
'localtime' => 'کاتی ناوچەیی:',
@@ -1266,7 +1284,6 @@ $1",
'prefs-reset-intro' => 'دەتوانی لەم لاپەڕە بۆ گەڕانەوەی هەڵبژاردەکانت بۆ بنچینەیی ماڵپەر کەڵک وەرگریت.
گەر ئەوە بکەی ئیتر گۆڕانەکەت ناگەڕێتەوە.',
'prefs-emailconfirm-label' => 'پشتڕاست کردنەوەی ئیمەیل:',
-'prefs-textboxsize' => 'قەبارەی پەنجەرەی دەستکاریکردن',
'youremail' => 'ئیمەیل:',
'username' => '{{GENDER:$1|ناوی به‌کارھێنەر}}:',
'uid' => 'پێناسەی {{GENDER:$1|به‌کارھێنەر}}:',
@@ -1397,11 +1414,19 @@ $1",
'right-proxyunbannable' => 'لادان لە بەربەستنە خۆگەڕەکانی پرۆکسییەکان',
'right-unblockself' => 'کردنەوەی خۆیان',
'right-protect' => 'گۆڕینی ئاستەکانی پاراستن و دەستکاریی پەڕە پارێزراوە تاڤگەیییەکان',
-'right-editprotected' => 'دەستکاری لاپەڕە پارێزراوەکان (بێ پاراستنی زنجیری)',
+'right-editprotected' => 'دەستکاریی پەڕە پارێزراوەکانی وەک «{{int:protect-level-sysop}}»',
+'right-editsemiprotected' => 'دەستکاریی پەڕە پارێزراوەکانی وەک «{{int:protect-level-autoconfirmed}}»',
'right-editinterface' => 'دەستکاریی ڕووکاری بەکارھێنەر',
'right-editusercssjs' => 'دەستکاریی پەڕگەکانی جاڤاسکریپت و CSSی بەکارھێنەرانی تر',
'right-editusercss' => 'دەستکاریی پەڕگەکانی CSSی بەکارھێنەرانی تر',
'right-edituserjs' => 'دەستکاریی پەڕگەکانی جاڤاسکریپتی بەکارھێنەرانی تر',
+'right-editmyusercss' => 'دەستکاریی پەڕگەکانی CSSی بەکارھێنەریی خۆی',
+'right-editmyuserjs' => 'دەستکاریی پەڕگەکانی جاڤاسکریپتی بەکارھێنەریی خۆی',
+'right-viewmywatchlist' => 'دیتنی پێرستی چاودێریی خۆی',
+'right-editmywatchlist' => 'دەستکاریی پێرستی چاودێریی خۆی. تکایە لەبەر چاو بگرە ھەندێک کردەوە ھێشتا پەڕەکان زیاد دەکا تەنانەت بەبێ ئەم ماÙÛ•.',
+'right-viewmyprivateinfo' => 'دیتنی دراوە تایبەتییەکانی خۆی (وەک ناونیشانی ئیمەیل، ناوی ڕاستی)',
+'right-editmyprivateinfo' => 'دەستکاریی دراوە تایبەتییەکانی خۆی (وەک ناونیشانی ئیمەیل، ناوی ڕاستی)',
+'right-editmyoptions' => 'دەستکاریی ھەڵبژاردەکانی خۆی',
'right-rollback' => 'گەڕاندنەوەی خێرای دەستکاریەکانی دوایین بەکارھێنەر کە پەڕەیەکی دیاریکراوی دەستکاری کردووە',
'right-markbotedits' => 'نیشانکردنی دەستکارییە گەڕێنراوەکان وەک دەستکارییەکانی بۆت',
'right-noratelimit' => 'کاریگەری وەرنەگرتن لە سنوورەکانی خێرایی',
@@ -1504,7 +1529,6 @@ $1",
'recentchangeslinked-feed' => 'گۆڕانکارییە پەیوەندیدارەکان',
'recentchangeslinked-toolbox' => 'گۆڕانکارییە پەیوەندیدارەکان',
'recentchangeslinked-title' => 'گۆڕانکارییە پەیوەندیدارەکان بە "$1" ـەوە',
-'recentchangeslinked-noresult' => 'هیچ گۆڕانکارییەک لە لاپەڕەکانی بەستەر پێ‌دراو، لە درێژەی ماوەی دراوە.',
'recentchangeslinked-summary' => "ئەمە لیستێکی گۆڕانکارییەکانی ئەم دوایییانەی ئەو پەڕانەیە کە بەستەریان ھەیە لە پەڕەیەکی دیاریکراو (یان بۆ ئەندامەکانی پۆلێکی دیاریکراو)
پەڕەکانی [[Special:Watchlist|لیستی چاودێرییەکەت]] '''ئەستوورن'''.",
'recentchangeslinked-page' => 'ناوی پەڕە:',
@@ -1516,7 +1540,7 @@ $1",
'reuploaddesc' => 'هەڵوەشانەوەی بارکردن Ùˆ گەڕانەوە بۆ Ùۆرمی بارکردن',
'upload-tryagain' => 'پێناسەی گۆڕدراوی پەڕگە بنێرە',
'uploadnologin' => 'لەژوورەوە نیت',
-'uploadnologintext' => 'بۆ بارکردنی پەڕگەکان ئەشێ [[Special:UserLogin|لە ژوورەوە بیت]].',
+'uploadnologintext' => 'بۆ بارکردنی پەڕگەکان دەبێ $1.',
'upload_directory_missing' => 'لقی بارکردن ($1) ون بووە و ڕاژەکاری‌وێب بۆی درووست ناکرێت.',
'upload_directory_read_only' => 'ڕاژەکاری‌وێب دەسەڵاتی نووسینی سەر لقی بارکردنی ($1) نیە.',
'uploaderror' => 'ھەڵە لە بارکردن دا',
@@ -1658,9 +1682,6 @@ $1',
'img-auth-nofile' => 'Ùایلی "$1" بوونی نیه‌',
'img-auth-isdir' => 'هه‌وڵ ده‌ده‌ی بۆ کردنه‌وه‌ی بوخچه‌ی "$1" له‌ کاتێکدا ته‌نیا کردنه‌وه‌ی Ùایل رێپێدراوه‌',
-# HTTP errors
-'http-host-unreachable' => 'توانای دەست‌پێ‌گەیشتنی URL نیە',
-
# 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 کە ڕاچاوت کردووە توانای دەست‌پێ‌گەیشتنی نییە.
@@ -1805,12 +1826,6 @@ $1',
'statistics-users-active-desc' => 'ئەو بەکارھێنەرانە کە لە {{PLURAL:$1|ڕۆژ|$1 ڕۆژ}}ی ڕابردوودا کارێکیان جێبەجێ کردبێت.',
'statistics-mostpopular' => 'زۆرترین لاپەڕە بینراوەکان',
-'disambiguations' => 'پەڕەکانی بەستەردراو بۆ پەڕەکانی ڕوونکردنەوە',
-'disambiguationspage' => 'Template:ڕوونکردنەوە',
-'disambiguations-text' => "ئەم پەڕانە لانی کەم یەک بەستەریان بۆ '''پەڕەی ڕوونکردنەوە''' ھەیە.
-لەوانەیە لە جیاتی ئەو، بەستەریان ھەبێت بۆ بابەتەکانیی گونجاو.<br />
-ئەگەر پەڕەیەک لە داڕێژەیەک کەڵک وەرگرێت کە بەستەری ھەبێت بۆ [[MediaWiki:Disambiguationspage]]، وەک پەڕەی ڕوونکردنەوە لەبەر چاو دەگیرێت.",
-
'pageswithprop' => 'پەڕەکان بە تایبەتمەندیی پەڕە',
'pageswithprop-legend' => 'پەڕەکان بە تایبەتمەندیی پەڕە',
'pageswithprop-text' => 'ئەم پەڕەیە ئەو پەڕانەی تایبەتمەندییەکی پەرەیەکی دیاریکراو بەکاردەھێنن پێرست دەکا.',
@@ -2057,10 +2072,9 @@ $1',
'unwatchthispage' => 'ئیتر چاودێری مەکە',
'notanarticle' => 'پەڕەی بێ ناوەڕۆک',
'notvisiblerev' => 'پیاچوونەوە سڕاوەتەوە',
-'watchnochange' => 'ھیچکام لەو بابەتانە چاودێڕییان دەکەیت، لە ماوەی نیشاندراودا دەستکاری نەکراون.',
'watchlist-details' => '{{PLURAL:$1|$1 پەڕە|$1 پەڕە}} لە لیستی چاودێریەکەتدایە، بێجگە پەڕەکانی لێدوان.',
-'wlheader-enotif' => '* ئەکرێ بە E-mail ئاگاداری بدەی',
-'wlheader-showupdated' => "* â€Ø¦Û•Ùˆ پەڕانە Ú©Û• Ù„Û• پاش دواین سەردانت دەستکاری کراون بە '''ئەستوور''' نیشان دراون",
+'wlheader-enotif' => 'ئاگاداری بە ئیمەیل چالاکە.',
+'wlheader-showupdated' => "â€Ø¦Û•Ùˆ پەڕانە Ú©Û• Ù„Û• پاش دواین سەردانت دەستکاری کراون بە '''ئەستوور''' نیشان دراون",
'watchmethod-recent' => 'سەرنج‌دانی دوایین دەستکاریەکان بۆ لاپەڕە چاودێری‌کراوەکان',
'watchmethod-list' => 'سەرنج‌دانی لاپەڕە چاودێری‌کراوەکان بۆ دوایین دەستکاریەکان',
'watchlistcontains' => 'لیستی چاودێڕییەکانت $1 {{PLURAL:$1|پەڕە|پەڕە}}ی تێدایە.',
@@ -2447,12 +2461,9 @@ $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}} کەڵکی لێ‌وەر دەگرێ، وەک پرۆکسیەکی کراوە لیست کراوە.
بۆیە ناتوانی هەژمارە درووست‌بکەی.',
@@ -2811,13 +2822,8 @@ $1',
'pageinfo-category-files' => 'ژمارەی پەڕگەکان',
# Skin names
-'skinname-standard' => 'کلاسیک',
-'skinname-nostalgia' => 'غەریبی',
'skinname-cologneblue' => 'شینی کۆلۆن',
'skinname-monobook' => 'Ù…Û†Ù†Û†',
-'skinname-myskin' => 'پێستی خۆم',
-'skinname-chick' => 'جووچک',
-'skinname-simple' => 'ساکار',
'skinname-modern' => 'مۆدێڕن',
'skinname-vector' => 'ڤێکتۆر',
@@ -2888,11 +2894,25 @@ $1',
'minutes' => '{{PLURAL:$1|$1 خولەک}}',
'hours' => '{{PLURAL:$1|$1 کاتژمێر}}',
'days' => '{{PLURAL:$1|$1 Ú•Û†Ú˜}}',
+'weeks' => '{{PLURAL:$1|$1 Ø­Û•Ùتە}}',
'months' => '{{PLURAL:$1|$1 مانگ}}',
'years' => '{{PLURAL: $1|$1 ساڵ}}',
'ago' => '$1 Ù„Û•Ù…Û• Ù¾ÛŽØ´',
'just-now' => 'ھەرئێستا',
+# Human-readable timestamps
+'hours-ago' => '$1 {{PLURAL:$1|کاتژمێر}} لەمه پێش',
+'minutes-ago' => '$1 {{PLURAL:$1|خولەک}} لەمە پێش',
+'seconds-ago' => '$1 {{PLURAL:$1|چرکە}} لەمە پێش',
+'monday-at' => 'دووشەممە $1',
+'tuesday-at' => 'سێشەممە $1',
+'wednesday-at' => 'چوارشەممە $1',
+'thursday-at' => 'پێنجشەممە $1',
+'friday-at' => 'ھەینی $1',
+'saturday-at' => 'شەممە $1',
+'sunday-at' => 'یەکشەممە $1',
+'yesterday-at' => 'دوێنێ $1',
+
# Bad image list
'bad_image_list' => 'Ùۆرمات بەم Ø´ÛŽÙˆÛ•ÛŒ خوارەوەیە:
@@ -2925,7 +2945,7 @@ $1',
* gpslongitude
* gpsaltitude',
-# EXIF tags
+# Exif tags
'exif-imagewidth' => 'پانی',
'exif-imagelength' => 'بەرزی',
'exif-ycbcrpositioning' => 'شوێنی Y و C',
@@ -2992,7 +3012,7 @@ $1',
# Make & model, can be wikified in order to link to the camera and model name
'exif-subjectnewscode-value' => '$2 ($1)',
-# EXIF attributes
+# Exif attributes
'exif-compression-1' => 'نەپەستێنراو',
'exif-copyrighted-true' => 'خاوەنی ماÙÛŒ بڵاوکردنەوە',
@@ -3363,7 +3383,6 @@ $5
'version-other' => 'Other',
'version-mediahandlers' => 'Media handlers',
'version-hooks' => 'قولاپەکان',
-'version-extension-functions' => 'Extension functions',
'version-parser-extensiontags' => 'Parser extension tags',
'version-parser-function-hooks' => 'Parser function hooks',
'version-hook-name' => 'ناوی قولاپ',
@@ -3376,13 +3395,6 @@ $5
'version-software-version' => 'وەشان',
'version-entrypoints-header-url' => 'ناونیشانی ئینتەرنێتی',
-# Special:FilePath
-'filepath' => 'ڕێڕەوی پەڕگە',
-'filepath-page' => 'Ù¾Û•Ú•Ú¯Û•:',
-'filepath-submit' => 'بڕۆ',
-'filepath-summary' => 'ئەم لاپەڕە تایبەتە ڕێڕەوی تەواو بۆ پەڕگەیەک دەگەڕێنێتەوە.
-وێنەکان لە قەبارەی تەواو‌دا نیشان‌ دەدرێن و جۆرە پەڕگەکانی دیکە بە پڕۆگرامی هاوپەیوەندی خۆی ڕاستەوخۆ دەست‌پێ‌دەکات.',
-
# Special:FileDuplicateSearch
'fileduplicatesearch' => 'گەڕان بۆ پەڕگە دووپات کراوەکان',
'fileduplicatesearch-summary' => 'گەڕان بۆ پەڕگە دووبارەکراوەکان لەسەر بنەمای نرخی hash.',
diff --git a/languages/messages/MessagesCo.php b/languages/messages/MessagesCo.php
index d54e0306..198345f4 100644
--- a/languages/messages/MessagesCo.php
+++ b/languages/messages/MessagesCo.php
@@ -491,7 +491,7 @@ U to indirizzu IP serà registratu indu a cronolugia di ista pagina.",
'ilsubmit' => 'Ricerca',
'bydate' => 'per data',
-# EXIF tags
+# Exif tags
'exif-orientation' => 'Orientazione',
'exif-imagedescription' => "Titulu di l'imagine",
'exif-artist' => 'Autore',
@@ -532,9 +532,6 @@ U to indirizzu IP serà registratu indu a cronolugia di ista pagina.",
# Special:Version
'version' => 'Versione',
-# Special:FilePath
-'filepath-page' => 'Schedariu:',
-
# Special:SpecialPages
'specialpages' => 'Pagine spiciale',
diff --git a/languages/messages/MessagesCps.php b/languages/messages/MessagesCps.php
index 5184de1f..17de57f0 100644
--- a/languages/messages/MessagesCps.php
+++ b/languages/messages/MessagesCps.php
@@ -43,10 +43,6 @@ $messages = array(
'tog-shownumberswatching' => 'Ipakita ang mga numero sang mga gatan-aw nga manug-usar',
'tog-oldsig' => 'Nagkayara nga pirma:',
'tog-fancysig' => 'Ituring ang pirma bilang teksto sang wiki (wala sang automatik nga link)',
-'tog-externaleditor' => 'Maggamit sang panggwa nga manug-ilis paagi sa default ( para sa mga ekspeto lang, kinanglan ang espesyal nga mga setting sa imo kompyuter)',
-'tog-externaldiff' => 'Maggamit sang panggwa nga kinala-in paagi sa default ( para sa mga ekspeto lang, kinanglan ang espesyal nga setting sa imo kumpyuter.
-[//www.mediawiki.org/wiki/Manual:External_editors Mas madamu pa nga impormasyon.])',
-'tog-showjumplinks' => 'Pasugtan ang mga "tumbo sa" kadali-an nga mga link',
'tog-uselivepreview' => 'Maggamit sang buhi nga prebyu (kinanglan ang Javascript) (Eksperimental)',
'tog-forceeditsummary' => 'Hambalan ako kung nagapasulod sang wala unod nga pag-ilis kabilugan',
'tog-watchlisthideown' => 'Itago ang akon mga pagbag-o halin sa listahan sang mga ginabantayan',
@@ -244,7 +240,7 @@ $1',
'pool-queuefull' => 'Puno na ang pisan sang mga pila',
'pool-errorunknown' => 'Wala nabal-an nga kasal-anan',
-# 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).
+# 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).
'aboutsite' => 'Tuhoy sa {{SITENAME}}',
'aboutpage' => 'Project:Nahanungod sa',
'copyright' => 'Ang unod bakante sa idalum sang $1',
@@ -254,7 +250,6 @@ $1',
'disclaimers' => 'Mga pagpangindi',
'disclaimerpage' => 'Project:Pangkabilugan nga pagpangindi',
'edithelp' => 'Bulig sa pag-ilis',
-'edithelppage' => 'Help:Pag-ilis',
'helppage' => 'Help:Mga ka-undan',
'mainpage' => 'Panguna nga pahina',
'mainpage-description' => 'Panguna nga pahina',
@@ -328,17 +323,6 @@ Ang listahan sang inbalido nga mga pinasahi nga pahina makit-an sa [[Special:Spe
# General errors
'error' => 'Sala',
'databaseerror' => 'Diperensya sa database',
-'dberrortext' => 'May sala sa database query syntax.
-Posible tungod mini sa depekto sa software.
-Ang nagligad nga database query mini:
-<blockquote><tt>$1</tt></blockquote>
-nga halin sa ulubrahon nga "<tt>$2</tt>".
-Nagbalik sang sala nga "<tt>$3: $4</tt>" ang MySQL.',
-'dberrortextcl' => 'May ara sang kasal-anan sa usisa nga pangpapagpaangot sa kalipunan sang datos.
-Ang ulihi nga pagtisting pagusisa sa kalipunan sang datos amu ang:
-"$1"
-halin sa ulubrahon nga "$2".
-Ginbalik sang kalipunan sang datos ang kasal-anan nga "$3: $4"',
'laggedslavemode' => 'Pahibalo: Posible nga wala unod ang pahina sang mga yanda nga bag-ong nadugang.',
'readonly' => 'Nakakandado ang database',
'enterlockreason' => 'Maghatag sang kabangdanan sa pagkakandado, upod ang bana-bana kung san-o ang kandado ibuy-an',
@@ -391,7 +375,6 @@ Palihog tistingan liwat sa pila ka minutos.',
'editinginterface' => "'''Paandam:''' gin-islan mo ang pahina nga gina-usar nga nagahatag teksto sang interface sa sopwer.
Makaapekto ang mga gin-islan sa mini nga pahina sa gwaan nga itsura ka interface sang manug-usar sa iban nga mga manug-usar.
Para sa mga pagtransleyt, palihog konsidera gamit ang [http://translatewiki.net/wiki/Main_Page?setlang=en translatewiki.net], ang MediaWiki proyekto sa paglokalisa.",
-'sqlhidden' => '(nakatago ang pamangkot sang SQL)',
'cascadeprotected' => 'Ginprotektahan ang mini nga pahina sa pagpangilis, tungod naupod ini sa mga gasunod nga {{PLURAL:$1|pahina, nga|mga pahina, nga}} protektado upod ang "cascading" nga pilili-an nga naga-andar:
$2',
'namespaceprotected' => "Wala ka sang permiso nga magliwat sang mga pahina nga ara sa namespace nga '''$1'''.",
diff --git a/languages/messages/MessagesCrh_cyrl.php b/languages/messages/MessagesCrh_cyrl.php
index fce5ba82..1d8cf70a 100644
--- a/languages/messages/MessagesCrh_cyrl.php
+++ b/languages/messages/MessagesCrh_cyrl.php
@@ -135,9 +135,6 @@ $messages = array(
'tog-shownumberswatching' => 'Козеткен къулланыджы ÑайыÑыны коÑьтер',
'tog-oldsig' => 'Шимдики имза:',
'tog-fancysig' => 'Имза викиметин киби олÑун (автоматик багъланты олмаз)',
-'tog-externaleditor' => 'Тыш тюрлендиргич (редактор) къуллан (теджрибели къулланыджылар ичюн; компьютеринъизни махÑÑƒÑ Ñазламакъ керек. [ //www.mediawiki.org/wiki/Manual:External_editors тафÑилÑтлы малюмат мында])',
-'tog-externaldiff' => 'Тенъештирмек ичюн тыш бир программа къуллан (теджрибели къулланыджылар ичюн; компьютеринъизни махÑÑƒÑ Ñазламакъ керек. [ //www.mediawiki.org/wiki/Manual:External_editors тафÑилÑтлы малюмат мында])',
-'tog-showjumplinks' => '«Бар» багълантыÑыны фааллештир',
'tog-uselivepreview' => 'Джанлы бакъып чыкъув хуÑуÑиетини къуллан (JavaScript) (даа денъеме алында)',
'tog-forceeditsummary' => 'Денъиштирменинъ къыÑкъа тарифини бош ташлаÑам мени тенбиле',
'tog-watchlisthideown' => 'Козетюв джедвелимден меним денъиштирмелеримни гизле',
@@ -233,7 +230,7 @@ $messages = array(
'noindex-category' => 'ИндекÑÑиз Ñаифелер',
'broken-file-category' => 'Ичинде бозукъ файл багълантылары олгъан Ñаифелер',
-'linkprefix' => '/^(.*?)([a-zâçğıñöşüA-ZÂÇĞİÑÖŞÜa-ÑÑ‘Ð-ЯЫ„]+)$/sDu',
+'linkprefix' => '/^((?>.*(?<![a-zâçğıñöşüA-ZÂÇĞİÑÖŞÜa-ÑÑ‘Ð-ЯЫ„])))(.+)$/sDu',
'about' => 'Ðкъкъында',
'article' => 'Саифе',
@@ -336,7 +333,7 @@ $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).
+# 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).
'aboutsite' => '{{SITENAME}} акъкъында',
'aboutpage' => 'Project:Ðкъкъында',
'copyright' => 'Малюмат $1 бинаÑн кечилип ола.',
@@ -346,7 +343,6 @@ $1',
'disclaimers' => 'ДжевапкÑрлыкъ реди',
'disclaimerpage' => 'Project:Умумий Малюмат МукъавелеÑи',
'edithelp' => 'Саифелер наÑыл денъиштирилир?',
-'edithelppage' => 'Help:Саифе наÑыл денъиштирилир',
'helppage' => 'Help:Мундеридже',
'mainpage' => 'Баш Саифе',
'mainpage-description' => 'Баш Саифе',
@@ -423,16 +419,6 @@ $1',
# General errors
'error' => 'Хата',
'databaseerror' => 'Малюмат базаÑынынъ хатаÑÑ‹',
-'dberrortext' => 'Малюмат базаÑындан Ñораткъанда ÑинтакÑÐ¸Ñ Ñ…Ð°Ñ‚Ð°ÑÑ‹ олды.
-Бу программадаки бир хата ола биле.
-"<tt>$2</tt>" функциÑÑындан олгъан малюмат базаÑындан Ñонъки Ñоратма:
-<blockquote><tt>$1</tt></blockquote>.
-Малюмат базаÑынынъ бильдирген хатаÑÑ‹ "<tt>$3: $4</tt>".',
-'dberrortextcl' => 'Малюмат базаÑындан Ñораткъанда ÑинтакÑÐ¸Ñ Ñ…Ð°Ñ‚Ð°ÑÑ‹ олды.
-Малюмат базаÑындан Ñонъки Ñоратма:
-«$1»
-Къулланылгъан Ñ„ÑƒÐ½ÐºÑ†Ð¸Ñ Â«$2».
-Малюмат базаÑынынъ бильдирген хатаÑÑ‹ «$3: $4».',
'laggedslavemode' => 'Дикъкъат! Бу Ñаифеде Ñонъки Ñнъарув олмай биле.',
'readonly' => 'Малюмат базаÑÑ‹ килитленди',
'enterlockreason' => 'Блок Ñтювнинъ Ñебебини ве девамыны кирÑетинъиз.',
@@ -481,7 +467,6 @@ $1',
'viewsourcetext' => 'Саифенинъ кодуны козьден кечирип копиÑлай билеÑинъиз:',
'protectedinterface' => 'Бу Ñаифеде ÑиÑтема интерфейÑининъ метни бар. Онынъ ичюн мында бир хата чыкъмаÑын деп оны денъиштирмек ÑÑакъ.',
'editinginterface' => "'''Тенби''': MediaWiki ÑиÑтемаÑынынъ Ð¸Ð½Ñ‚ÐµÑ€Ñ„ÐµÐ¹Ñ ÑаифеÑини денъиштиреÑтаÑыз. Бу Ñаифедеки денъиштирмелер интерфейÑнинъ корюнишини бу викининъ башкъа къулланыджылары ичюн де денъиштиреджек. Лютфен, вики интерфейÑини терджиме Ñтмек ичюн [//translatewiki.net/wiki/Main_Page?setlang=crh translatewiki.net] Ñайтыны (MediaWiki реÑмий Ð»Ð¾ÐºÐ°Ð»Ð¸Ð·Ð°Ñ†Ð¸Ñ Ð»ÐµÐ¹Ñ…Ð°ÑÑ‹) къулланынъыз.",
-'sqlhidden' => '(SQL иÑтинтагъы Ñакълы)',
'cascadeprotected' => 'Бу Ñаифени денъиштирип оламазÑынъыз, чюнки каÑкад къорчалав алтында булунгъан {{PLURAL:$1|Ñаифеге|Ñаифелерге}} менÑюптир:
$2',
'namespaceprotected' => "'''$1''' иÑим фезаÑында Ñаифелер денъиштирмеге акъкъынъыз ёкъ.",
@@ -502,7 +487,6 @@ $2',
'yourpassword' => 'Паролинъиз',
'yourpasswordagain' => 'Парольни бир даа Ñзынъыз:',
'remembermypassword' => 'Киришимни бу компьютерде хатырла (Ñнъ чокъ $1 {{PLURAL:$1|кунь|кунь}} ичюн)',
-'securelogin-stick-https' => 'Кирген Ñонъ HTTPS-ге багъланып тур',
'yourdomainname' => 'Домен адынъыз',
'externaldberror' => 'Сайткъа киргенде бир хата олды. Бу тыш ÑÑабынъызны денъиштирмек акъкъынъыз олмагъанындан Ñебеп мейдангъа келип ола.',
'login' => 'Кириш',
@@ -585,7 +569,7 @@ $2 къулланыджыÑына вакътынджа <code>$3</code> пароÐ
'newpassword' => 'Янъы пароль',
'retypenew' => 'Янъы парольни текрар Ñзынъыз',
'resetpass_submit' => 'Пароль къойып кир',
-'resetpass_success' => 'Паролинъиз мувафакъиетнен денъиштирильди! Отурымынъыз ачылмакъта...',
+'changepassword-success' => 'Паролинъиз мувафакъиетнен денъиштирильди! Отурымынъыз ачылмакъта...',
'resetpass_forbidden' => 'Пароль денъиштирмек ÑÑакъ',
'resetpass-no-info' => 'Бу Ñаифеге догърудан иришмек ичюн отурым ачмакъ керекÑинъиз.',
'resetpass-submit-loggedin' => 'Парольни денъиштир',
@@ -853,7 +837,6 @@ $3 мына бу Ñебепни бильдирди: ''$2''",
'searchmenu-legend' => 'Къыдырув Ñазламалары',
'searchmenu-exists' => "'''Бу викиде \"[[:\$1]]\" адлы бир Ñаифе бар'''",
'searchmenu-new' => "'''Бу викиде \"[[:\$1]]\" ÑаифеÑини Ñрат!'''",
-'searchhelp-url' => 'Help:Мундеридже',
'searchmenu-prefix' => '[[Special:PrefixIndex/$1|Бу префикÑли Ñаифелерни коÑьтер]]',
'searchprofile-articles' => 'Малюмат Ñаифелери',
'searchprofile-project' => 'Ярдым ве лейха Ñаифелери',
@@ -893,9 +876,6 @@ $3 мына бу Ñебепни бильдирди: ''$2''",
'search-external' => 'Тыш къыдырув',
'searchdisabled' => '{{SITENAME}} Ñайтында къыдырув Ñпма вакътынджа токътатылды. Бу арада Google къулланып {{SITENAME}} ичинде къыдырув Ñпып олаÑынъыз. Къыдырув Ñайтларында индекÑлемелерининъ бираз ÑÑки къалгъан ола биледжегини козь огюне алынъыз.',
-# Quickbar
-'qbsettings' => 'Вызлы иришим Ñутун Ñазламалары',
-
# Preferences page
'preferences' => 'Сазламалар',
'mypreferences' => 'Сазламалар',
@@ -923,7 +903,6 @@ $3 мына бу Ñебепни бильдирди: ''$2''",
'resetprefs' => 'Сакъланмагъан Ñазламаларны ильк алына кетир',
'restoreprefs' => 'Бутюн ог бельгиленген Ñазламаларны къайтар',
'prefs-editing' => 'Саифелерни денъиштирюв',
-'prefs-edit-boxsize' => 'Язув пенджереÑининъ ольчюлери.',
'rows' => 'Сатыр',
'columns' => 'Сутун',
'searchresultshead' => 'Къыдырув',
@@ -958,7 +937,6 @@ $3 мына бу Ñебепни бильдирди: ''$2''",
'prefs-files' => 'Файллар',
'prefs-reset-intro' => 'Бу Ñаифени Ñазламаларынъызны Ñайт ог бельгиленгенине къайтармакъ ичюн къуллана билеÑинъиз. Бу лÑгъу Ñтилип оламаз.',
'prefs-emailconfirm-label' => 'E-mail таÑдыкъланмаÑÑ‹:',
-'prefs-textboxsize' => 'Язув пенджереÑининъ ольчюлери',
'youremail' => 'E-mail адреÑинъиз:',
'username' => 'Къулланыджы ады:',
'uid' => 'Къайд номери:',
@@ -1079,7 +1057,6 @@ $3 мына бу Ñебепни бильдирди: ''$2''",
'recentchangeslinked-feed' => 'Багълы денъиштирмелер',
'recentchangeslinked-toolbox' => 'Багълы денъиштирмелер',
'recentchangeslinked-title' => '"$1" иле багълы денъиштирмелер',
-'recentchangeslinked-noresult' => 'Сайлангъан вакъытта багълы Ñаифелерде ич бир денъиштирме олмады.',
'recentchangeslinked-summary' => "Бу махÑÑƒÑ Ñаифеде багълы Ñаифелерде Ñонъки Ñпылгъан денъиштирмелер джедвели бар. [[Special:Watchlist|Козетюв джедвелинъиз]]деки Ñаифелер '''къалын''' оларакъ коÑьтериле.",
'recentchangeslinked-page' => 'Саифе ады:',
'recentchangeslinked-to' => 'Берильген Ñаифе ерине берильген Ñаифеге багъланты берген олгъан Ñаифелерини коÑьтер',
@@ -1270,12 +1247,6 @@ $3 мына бу Ñебепни бильдирди: ''$2''",
'statistics-header-hooks' => 'Дигер ÑтатиÑтика',
'statistics-mostpopular' => 'Энъ Ñыкъ бакъылгъан Ñаифелер',
-'disambiguations' => 'Чокъ маналы терминлер Ñаифелери',
-'disambiguationspage' => 'Template:disambig',
-'disambiguations-text' => "Ðшагъыдыки Ñаифелер '''чокъ маналы Ñаифелер'''ге багъланты ола.
-Бельки де олар бир конкрет Ñаифеге багъланты олмалы.<br />
-Эгер Ñаифеде, [[MediaWiki:Disambiguationspage]] ÑаифеÑинде ады кечкен шаблон ерлештирильген олÑа, о Ñаифе чокъ маналыдыр.",
-
'doubleredirects' => 'Ðлламагъа олгъан ёлламалар',
'doubleredirectstext' => 'Бу Ñаифеде дигер ёллама Ñаифелерине ёлланма олгъан Ñаифелери коÑьтериле.
Эр Ñатырда биринджи ве Ñкинджи ёлламагъа багълантылар да, Ñкинджи ёлламанынъ макъÑат ÑаифеÑи (адетиндже о биринджи ёлламанынъ керекли макъÑады ола) да бар.
@@ -1426,10 +1397,9 @@ $3 мына бу Ñебепни бильдирди: ''$2''",
'unwatch' => 'Козетме',
'unwatchthispage' => 'Бу Ñаифени козетме',
'notanarticle' => 'Малюмат ÑаифеÑи дегиль',
-'watchnochange' => 'КоÑьтерильген заман аралыгъында козетюв джедвелинъиздеки Ñаифелернинъ ич бири денъиштирильмеген.',
'watchlist-details' => 'Музакере Ñаифелерини ÑÑапкъа алмайып, козетюв джедвелинъизде {{PLURAL:$1|1|$1}} Ñаифе бар.',
-'wlheader-enotif' => '* E-mail иле хабер берюв ачылды.',
-'wlheader-showupdated' => "* Сонъки зиÑретинъизден Ñонъ денъиштирильген Ñаифелер '''къалын арифлернен''' коÑьтерильди.",
+'wlheader-enotif' => 'E-mail иле хабер берюв ачылды.',
+'wlheader-showupdated' => "Сонъки зиÑретинъизден Ñонъ денъиштирильген Ñаифелер '''къалын арифлернен''' коÑьтерильди.",
'watchmethod-recent' => 'Ñонъки денъиштирмелер араÑында козеткен Ñаифелеринъиз къыдырыла',
'watchmethod-list' => 'козетюв джедвелиндеки Ñаифелер тешкериле',
'watchlistcontains' => 'Сизинъ козетюв джедвелинъизде {{PLURAL:$1|1|$1}} Ñаифе бар.',
@@ -1818,13 +1788,8 @@ MediaWiki интерфейÑининъ чешит тиллерге терджиÐ
'spam_blanking' => 'Бар олгъан верÑиÑларда $1 Ñайтына багълантылар бар, темизлев',
# Skin names
-'skinname-standard' => 'Стандарт',
-'skinname-nostalgia' => 'ÐоÑтальгиÑ',
'skinname-cologneblue' => 'Кёльн аÑретлиги',
'skinname-monobook' => 'MonoBook',
-'skinname-myskin' => 'Озь реÑимлеме',
-'skinname-chick' => 'Чипче',
-'skinname-simple' => 'Ðдий',
# Patrol log
'patrol-log-page' => 'Тешкерюв журналы',
@@ -1897,7 +1862,7 @@ MediaWiki интерфейÑининъ чешит тиллерге терджиÐ
* gpslongitude
* gpsaltitude',
-# EXIF tags
+# Exif tags
'exif-make' => 'Камера маркаÑÑ‹',
'exif-model' => 'Камера модели',
'exif-artist' => 'ЯратыджыÑÑ‹',
@@ -1922,7 +1887,7 @@ MediaWiki интерфейÑининъ чешит тиллерге терджиÐ
'exif-gpstimestamp' => 'GPS Ñааты (атом Ñааты)',
'exif-gpssatellites' => 'Ольчемек ичюн къуллангъаны Ñпутниклер',
-# EXIF attributes
+# Exif attributes
'exif-compression-1' => 'Сыкъыштырылмагъан',
'exif-orientation-3' => '180° айландырылгъан',
diff --git a/languages/messages/MessagesCrh_latn.php b/languages/messages/MessagesCrh_latn.php
index e6a763e0..9b516380 100644
--- a/languages/messages/MessagesCrh_latn.php
+++ b/languages/messages/MessagesCrh_latn.php
@@ -129,9 +129,6 @@ $messages = array(
'tog-shownumberswatching' => 'Közetken qullanıcı sayısını köster',
'tog-oldsig' => 'Åžimdiki imza:',
'tog-fancysig' => 'İmza vikimetin kibi olsun (avtomatik bağlantı olmaz)',
-'tog-externaleditor' => 'Tış türlendirgiç (redaktor) qullan (tecribeli qullanıcılar içün; kompyuteriñizni mahsus sazlamaq kerek. [ //www.mediawiki.org/wiki/Manual:External_editors tafsilâtlı malümat mında])',
-'tog-externaldiff' => 'Teñeştimek içün tış bir programma qullan (tecribeli qullanıcılar içün; kompyuteriñizni mahsus sazlamaq kerek. [ //www.mediawiki.org/wiki/Manual:External_editors tafsilâtlı malümat mında])',
-'tog-showjumplinks' => '"Bar" bağlantısını faalleştir',
'tog-uselivepreview' => 'Canlı baqıp çıquv hususiyetini qullan (JavaScript) (daa deñeme alında)',
'tog-forceeditsummary' => 'Deñiştirmeniñ qısqa tarifini boş taşlasam meni tenbile',
'tog-watchlisthideown' => 'Közetüv cedvelimden menim deñiştirmelerimni gizle',
@@ -227,7 +224,7 @@ $messages = array(
'noindex-category' => 'Ä°ndekssiz saifeler',
'broken-file-category' => 'İçinde bozuq fayl bağlantıları olğan saifeler',
-'linkprefix' => '/^(.*?)([a-zâçğıñöşüA-ZÂÇĞİÑÖŞÜa-ÑÑ‘Ð-ЯЫ„]+)$/sDu',
+'linkprefix' => '/^((?>.*(?<![a-zâçğıñöşüA-ZÂÇĞİÑÖŞÜa-ÑÑ‘Ð-ЯЫ„])))(.+)$/sDu',
'about' => 'Aqqında',
'article' => 'Saife',
@@ -331,7 +328,7 @@ $1',
'pool-queuefull' => 'Soratma toplayıcısı tolu',
'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).
+# 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).
'aboutsite' => '{{SITENAME}} aqqında',
'aboutpage' => 'Project:Aqqında',
'copyright' => 'Malümat $1 binaen keçilip ola.',
@@ -341,7 +338,6 @@ $1',
'disclaimers' => 'Cevapkârlıq redi',
'disclaimerpage' => 'Project:Umumiy Malümat Muqavelesi',
'edithelp' => 'Saifeler nasıl deñiştirilir?',
-'edithelppage' => 'Help:Saife nasıl deñiştirilir',
'helppage' => 'Help:Münderice',
'mainpage' => 'BaÅŸ Saife',
'mainpage-description' => 'BaÅŸ Saife',
@@ -418,16 +414,6 @@ Bar olğan bütün mahsus saifelerni [[Special:SpecialPages|{{int:specialpages}}
# General errors
'error' => 'Hata',
'databaseerror' => 'Malümat bazasınıñ hatası',
-'dberrortext' => 'Malümat bazasından soratqanda sintaksis hatası oldı.
-Bu programmadaki bir hata ola bile.
-"<tt>$2</tt>" funktsiyasından olğan malümat bazasından soñki soratma:
-<blockquote><tt>$1</tt></blockquote>.
-Malümat bazasınıñ bildirgen hatası "<tt>$3: $4</tt>".',
-'dberrortextcl' => 'Malümat bazasından soratqanda sintaksis hatası oldı.
-Malümat bazasından soñki soratma:
-"$1"
-Qullanılğan funktsiya "$2".
-Malümat bazasınıñ bildirgen hatası "$3: $4".',
'laggedslavemode' => 'Diqqat! Bu saifede soñki yañaruv olmay bile.',
'readonly' => 'Malümat bazası kilitlendi',
'enterlockreason' => 'Blok etüvniñ sebebini ve devamını kirsetiñiz.',
@@ -476,7 +462,6 @@ Soratma: $2',
'viewsourcetext' => 'Saifeniñ kodunı közden keçirip kopiyalay bilesiñiz:',
'protectedinterface' => 'Bu saifede viki interfeysiniñ metni bar. Onıñ içün mında bir hata çıqmasın dep onı deñiştirmek yasaq.',
'editinginterface' => "'''Tenbi''': MediaWiki sistemasınıñ interfeys saifesini deñiştireyatasız. Bu saifedeki deñiştirmeler interfeysniñ körünişini bu vikiniñ başqa qullanıcıları içün de deñiştirecek. Lütfen, viki interfeysini tercime etmek içün [//translatewiki.net/wiki/Main_Page?setlang=crh translatewiki.net] saytını (MediaWiki resmiy lokalizatsiya leyhası) qullanıñız.",
-'sqlhidden' => '(SQL istintağı saqlı)',
'cascadeprotected' => 'Bu saifeni deñiştirip olamazsıñız, çünki kaskad qorçalav altında bulunğan {{PLURAL:$1|saifege|saifelerge}} mensüptir:
$2',
'namespaceprotected' => "'''$1''' isim fezasında saifeler deñiştirmege aqqıñız yoq.",
@@ -497,7 +482,6 @@ Sebep: ''$2''.",
'yourpassword' => 'Paroliñiz',
'yourpasswordagain' => 'Parolni bir daa yazıñız:',
'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' => 'Saytqa kirgende bir hata oldı. Bu tış esabıñıznı deñiştirmek aqqıñız olmağanından sebep meydanğa kelip ola.',
'login' => 'KiriÅŸ',
@@ -581,7 +565,7 @@ Lütfen, qayta kirmezden evel biraz bekleñiz.',
'newpassword' => 'Yañı parol',
'retypenew' => 'Yañı parolni tekrar yazıñız',
'resetpass_submit' => 'Parol qoyıp kir',
-'resetpass_success' => 'Paroliñiz muvafaqiyetnen deñiştirildi! Oturımıñız açılmaqta...',
+'changepassword-success' => 'Paroliñiz muvafaqiyetnen deñiştirildi! Oturımıñız açılmaqta...',
'resetpass_forbidden' => 'Parol deñiştirmek yasaq',
'resetpass-no-info' => 'Bu saifege doğrudan irişmek içün oturım açmaq kereksiñiz.',
'resetpass-submit-loggedin' => 'Parolni deñiştir',
@@ -849,7 +833,6 @@ Vikide bu saifege oşağan saifelerni [[Special:Search|tapıp baqıñız]].',
'searchmenu-legend' => 'Qıdıruv sazlamaları',
'searchmenu-exists' => "'''Bu vikide \"[[:\$1]]\" adlı bir saife bar'''",
'searchmenu-new' => "'''Bu vikide \"[[:\$1]]\" saifesini yarat!'''",
-'searchhelp-url' => 'Help:Münderice',
'searchmenu-prefix' => '[[Special:PrefixIndex/$1|Bu prefiksli saifelerni köster]]',
'searchprofile-articles' => 'Malümat saifeleri',
'searchprofile-project' => 'Yardım ve leyha saifeleri',
@@ -889,9 +872,6 @@ Vikide bu saifege oşağan saifelerni [[Special:Search|tapıp baqıñız]].',
'search-external' => 'Tış qıdıruv',
'searchdisabled' => '{{SITENAME}} saytında qıdıruv yapma vaqtınca toqtatıldı. Bu arada Google qullanıp {{SITENAME}} içinde qıdıruv yapıp olasıñız. Qıdıruv saytlarında indekslemeleriniñ biraz eski qalğan ola bilecegini köz ögüne alıñız.',
-# Quickbar
-'qbsettings' => 'Vızlı irişim sutun sazlamaları',
-
# Preferences page
'preferences' => 'Sazlamalar',
'mypreferences' => 'Sazlamalar',
@@ -919,7 +899,6 @@ Vikide bu saifege oşağan saifelerni [[Special:Search|tapıp baqıñız]].',
'resetprefs' => 'Saqlanmağan sazlamalarnı ilk alına ketir',
'restoreprefs' => 'Bütün ög belgilengen sazlamalarnı qaytar',
'prefs-editing' => 'Saifelerni deñiştirüv',
-'prefs-edit-boxsize' => 'Yazuv penceresiniñ ölçüleri.',
'rows' => 'Satır',
'columns' => 'Sutun',
'searchresultshead' => 'Qıdıruv',
@@ -954,7 +933,6 @@ Vikide bu saifege oşağan saifelerni [[Special:Search|tapıp baqıñız]].',
'prefs-files' => 'Fayllar',
'prefs-reset-intro' => 'Bu saifeni sazlamalarıñıznı sayt ög belgilengenine qaytarmaq içün qullana bilesiñiz. Bu lâğu etilip olamaz.',
'prefs-emailconfirm-label' => 'E-mail tasdıqlanması:',
-'prefs-textboxsize' => 'Yazuv penceresiniñ ölçüleri',
'youremail' => 'E-mail adresiñiz:',
'username' => 'Qullanıcı adı:',
'uid' => 'Qayd nomeri:',
@@ -1075,7 +1053,6 @@ Eger bildirseñiz, saifelerdeki deñiştirmelerni kimniñ yapqanını köstermek
'recentchangeslinked-feed' => 'Bağlı deñiştirmeler',
'recentchangeslinked-toolbox' => 'Bağlı deñiştirmeler',
'recentchangeslinked-title' => '"$1" ile bağlı deñiştirmeler',
-'recentchangeslinked-noresult' => 'Saylanğan vaqıtta bağlı saifelerde iç bir deñiştirme olmadı.',
'recentchangeslinked-summary' => "Bu mahsus saifede bağlı saifelerde soñki yapılğan deñiştirmeler cedveli bar. [[Special:Watchlist|Közetüv cedveliñiz]]deki saifeler '''qalın''' olaraq kösterile.",
'recentchangeslinked-page' => 'Saife adı:',
'recentchangeslinked-to' => 'Berilgen saife yerine berilgen saifege bağlantı bergen olğan saifelerni köster',
@@ -1265,12 +1242,6 @@ Sutun serlevasına bir basuv sortirlemeniñ tertibini deñiştirir.',
'statistics-header-hooks' => 'Diger statistika',
'statistics-mostpopular' => 'Eñ sıq baqılğan saifeler',
-'disambiguations' => 'Çoq manalı terminler saifeleri',
-'disambiguationspage' => '{{ns:template}}:disambig',
-'disambiguations-text' => "Aşağıdıki saifeler '''çoq manalı saifeler'''ge bağlantı ola.
-Belki de olar bir konkret saifege bağlantı olmalı.<br />
-Eger saifede, [[MediaWiki:Disambiguationspage]] saifesinde adı keçken şablon yerleştirilgen olsa, o saife çoq manalıdır.",
-
'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.
@@ -1421,10 +1392,9 @@ Bundan soñ, bu saifede ve onıñ muzakere saifesinde yapılacaq deñiştirmeler
'unwatch' => 'Közetme',
'unwatchthispage' => 'Bu saifeni közetme',
'notanarticle' => 'Malümat saifesi degil',
-'watchnochange' => 'Kösterilgen zaman aralığında közetüv cedveliñizdeki saifelerniñ iç biri deñiştirilmegen.',
'watchlist-details' => 'Muzakere saifelerini esapqa almayıp, közetüv cedveliñizde {{PLURAL:$1|1|$1}} saife bar.',
-'wlheader-enotif' => '* E-mail ile haber berüv açıldı.',
-'wlheader-showupdated' => "* Soñki ziyaretiñizden soñ deñiştirilgen saifeler '''qalın ariflernen''' kösterildi.",
+'wlheader-enotif' => 'E-mail ile haber berüv açıldı.',
+'wlheader-showupdated' => "Soñki ziyaretiñizden soñ deñiştirilgen saifeler '''qalın ariflernen''' kösterildi.",
'watchmethod-recent' => 'soñki deñiştirmeler arasında közetken saifeleriñiz qıdırıla',
'watchmethod-list' => 'közetüv cedvelindeki saifeler teşkerile',
'watchlistcontains' => 'Siziñ közetüv cedveliñizde {{PLURAL:$1|1|$1}} saife bar.',
@@ -1812,13 +1782,8 @@ MediaWiki interfeysiniñ çeşit tillerge tercime etüvde iştirak etmege istese
'spam_blanking' => 'Bar olğan versiyalarda $1 saytına bağlantılar bar, temizlev',
# Skin names
-'skinname-standard' => 'Standart',
-'skinname-nostalgia' => 'Nostalgiya',
'skinname-cologneblue' => 'Köln asretligi',
'skinname-monobook' => 'MonoBook',
-'skinname-myskin' => 'Öz resimleme',
-'skinname-chick' => 'Çipçe',
-'skinname-simple' => 'Adiy',
# Patrol log
'patrol-log-page' => 'Teşkerüv jurnalı',
@@ -1891,7 +1856,7 @@ Er satır * işaretinen başlamalı. Satırnıñ birinci bağlantısı qоşmağ
* gpslongitude
* gpsaltitude',
-# EXIF tags
+# Exif tags
'exif-make' => 'Kamera markası',
'exif-model' => 'Kamera modeli',
'exif-artist' => 'Yaratıcısı',
@@ -1916,7 +1881,7 @@ Er satır * işaretinen başlamalı. Satırnıñ birinci bağlantısı qоşmağ
'exif-gpstimestamp' => 'GPS saatı (atom saatı)',
'exif-gpssatellites' => 'Ölçemek içün qullanğanı sputnikler',
-# EXIF attributes
+# Exif attributes
'exif-compression-1' => 'Sıqıştırılmağan',
'exif-orientation-3' => '180° aylandırılğan',
diff --git a/languages/messages/MessagesCs.php b/languages/messages/MessagesCs.php
index bb5d992b..c4277c26 100644
--- a/languages/messages/MessagesCs.php
+++ b/languages/messages/MessagesCs.php
@@ -392,9 +392,6 @@ $messages = array(
'tog-shownumberswatching' => 'Zobrazovat poÄet sledujících uživatelů',
'tog-oldsig' => 'Stávající podpis:',
'tog-fancysig' => 'Používat v podpisu wikitext (bez automatického odkazu)',
-'tog-externaleditor' => 'ImplicitnÄ› používat externí editor (pouze pro pokroÄilé, vyžaduje speciální nastavení poÄítaÄe; [//www.mediawiki.org/wiki/Manual:External_editors další informace])',
-'tog-externaldiff' => 'ImplicitnÄ› používat externí porovnávací program (pouze pro pokroÄilé, vyžaduje speciální nastavení poÄítaÄe; [//www.mediawiki.org/wiki/Manual:External_editors další informace])',
-'tog-showjumplinks' => 'Používat odkazy „skoÄit na“ pro vyšší přístupnost',
'tog-uselivepreview' => 'Používat rychlý náhled (experimentální)',
'tog-forceeditsummary' => 'Upozornit, když nevyplním shrnutí editace',
'tog-watchlisthideown' => 'Na seznamu sledovaných stránek skrýt moje editace',
@@ -408,6 +405,8 @@ $messages = array(
'tog-showhiddencats' => 'Zobrazit skryté kategorie',
'tog-noconvertlink' => 'Vypnout konverzi názvů',
'tog-norollbackdiff' => 'Po vrácení změny nezobrazovat porovnání rozdílů',
+'tog-useeditwarning' => 'Upozornit, když budu opouštět editaci bez uložení změn',
+'tog-prefershttps' => 'Po pÅ™ihlášení používat vždy zabezpeÄené spojení',
'underline-always' => 'Vždy',
'underline-never' => 'Nikdy',
@@ -471,6 +470,18 @@ $messages = array(
'oct' => '10.',
'nov' => '11.',
'dec' => '12.',
+'january-date' => '$1. ledna',
+'february-date' => '$1. února',
+'march-date' => '$1. března',
+'april-date' => '$1. dubna',
+'may-date' => '$1. května',
+'june-date' => '$1. Äervna',
+'july-date' => '$1. Äervence',
+'august-date' => '$1. srpna',
+'september-date' => '$1. září',
+'october-date' => '$1. října',
+'november-date' => '$1. listopadu',
+'december-date' => '$1. prosince',
# Categories related messages
'pagecategories' => '{{PLURAL:$1|Kategorie|Kategorie|Kategorie}}',
@@ -552,6 +563,7 @@ $messages = array(
'create-this-page' => 'Vytvořit tuto stránku',
'delete' => 'Smazat',
'deletethispage' => 'Smazat stránku',
+'undeletethispage' => 'Obnovit tuto stránku',
'undelete_short' => 'Obnovit $1 {{PLURAL:$1|verzi|verze|verzí}}',
'viewdeleted_short' => 'Zobrazit {{PLURAL:$1|smazanou editaci|$1 smazané editace|$1 smazaných editací}}',
'protect' => 'Zamknout',
@@ -595,7 +607,7 @@ $1',
'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).
+# 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).
'aboutsite' => 'O&nbsp;{{grammar:6sg|{{SITENAME}}}}',
'aboutpage' => 'Project:{{SITENAME}}',
'copyright' => 'Obsah je dostupný pod $1, pokud není uvedeno jinak.',
@@ -605,7 +617,6 @@ $1',
'disclaimers' => 'VylouÄení odpovÄ›dnosti',
'disclaimerpage' => 'Project:VylouÄení odpovÄ›dnosti',
'edithelp' => 'Pomoc při editování',
-'edithelppage' => 'Help:Jak editovat stránku',
'helppage' => 'Help:Obsah',
'mainpage' => 'Hlavní strana',
'mainpage-description' => 'Hlavní strana',
@@ -683,17 +694,12 @@ Zkuste se podívat na [[Special:SpecialPages|seznam vÅ¡ech existujících speciÃ
# General errors
'error' => 'Chyba',
'databaseerror' => 'Chyba databáze',
-'dberrortext' => 'Při dotazu do databáze došlo k syntaktické chybě.
-PříÄinou může být chyba v programu.
-Poslední dotaz byl:
-<blockquote><code>$1</code></blockquote>
-z funkce „<code>$2</code>“.
-Databáze vrátila chybu „<samp>$3: $4</samp>“.',
-'dberrortextcl' => 'Při dotazu do databáze došlo k syntaktické chybě.
-Poslední dotaz byl:
-„$1“
-z funkce „$2“.
-Databáze vrátila chybu „$3: $4“',
+'databaseerror-text' => 'Došlo k chybě při dotazu do databáze.
+Může to být způsobeno chybou v softwaru.',
+'databaseerror-textcl' => 'Došlo k chybě při dotazu do databáze.',
+'databaseerror-query' => 'Dotaz: $1',
+'databaseerror-function' => 'Funkce: $1',
+'databaseerror-error' => 'Chyba: $1',
'laggedslavemode' => 'Upozornění: Stránka nemusí být zcela aktuální.',
'readonly' => 'Databáze je uzamÄena',
'enterlockreason' => 'Udejte důvod zamÄení, vÄetnÄ› odhadu, za jak dlouho dojde k odemÄení.',
@@ -725,6 +731,7 @@ Pokud toto není váš případ, možná jste nalezli chybu v software. Prosíme
Možná už byl(a) smazán(a) někým jiným.',
'cannotdelete-title' => 'Stránku „$1“ nelze smazat',
'delete-hook-aborted' => 'Smazání bylo bez bližšího vysvětlení zrušeno přípojným bodem.',
+'no-null-revision' => 'Nepodařilo se vytvořit novou prázdnou revizi stránky „$1“',
'badtitle' => 'Neplatný název',
'badtitletext' => 'Požadovaný název stránky byl neplatný, prázdný nebo obsahoval nesprávnou pÅ™edponu mezijazykového Äi interwiki odkazu. Možná obsahoval znaky, které v názvu nejsou dovoleny.',
'perfcached' => 'Následující data jsou z cache a nemusí být plně aktuální. Cache může obsahovat maximálně {{PLURAL:$1|jeden výsledek|$1 výsledky|$1 výsledků}}.',
@@ -745,12 +752,15 @@ Pro přidávání a změny překladů pro všechny wiki použijte [//translatewi
'editinginterface' => "'''Upozornění:''' Editujete stránku, která definuje texty rozhraní.
Změny této stránky ovlivní vzhled uživatelského rozhraní všem uživatelům této wiki.
Pro přidávání a změny překladů pro všechny wiki použijte [//translatewiki.net/ translatewiki.net], projekt pro lokalizaci MediaWiki.",
-'sqlhidden' => '(SQL dotaz skryt)',
'cascadeprotected' => 'Tato stránka je zamÄena, neboÅ¥ je vložena do {{PLURAL:$1|následující stránky zamÄené|následujících stránek zamÄených|následujících stránek zamÄených}} kaskádovým zámkem:
$2',
'namespaceprotected' => "Nemáte povoleno editovat stránky ve jmenném prostoru '''$1'''.",
'customcssprotected' => 'Nemáte povoleno editovat tuto stránku s CSS, protože obsahuje osobní nastavení jiného uživatele.',
'customjsprotected' => 'Nemáte povoleno editovat tuto stránku s JavaScriptem, protože obsahuje osobní nastavení jiného uživatele.',
+'mycustomcssprotected' => 'Nemáte oprávnění editovat tuto stránku s CSS.',
+'mycustomjsprotected' => 'Nemáte oprávnění editovat tuto stránku s JavaScriptem.',
+'myprivateinfoprotected' => 'Nemáte oprávnění měnit své soukromé údaje.',
+'mypreferencesprotected' => 'Nemáte oprávnění změnit svá nastavení.',
'ns-specialprotected' => 'Stránky ve jmenném prostoru {{ns:special}} nelze editovat.',
'titleprotected' => "Stránku s tímto názvem nelze založit, protože název zamknul uživatel [[User:$1|$1]] s odůvodněním: ''$2''.",
'filereadonlyerror' => "Nelze zmÄ›nit soubor „$1“, protože úložiÅ¡tÄ› souborů „$2“ je momentálnÄ› pouze pro Ätení.
@@ -774,10 +784,19 @@ Uvědomte si, že některé stránky se mohou i nadále zobrazovat, jako byste b
'welcomecreation-msg' => 'Váš úÄet byl vytvoÅ™en.
Nezapomeňte si upravit své [[Special:Preferences|nastavení {{grammar:2sg|{{SITENAME}}}}]].',
'yourname' => 'Uživatelské jméno:',
+'userlogin-yourname' => 'Uživatelské jméno',
+'userlogin-yourname-ph' => 'Zadejte své uživatelské jméno',
+'createacct-another-username-ph' => 'Zadejte uživatelské jméno',
'yourpassword' => 'Heslo:',
+'userlogin-yourpassword' => 'Heslo',
+'userlogin-yourpassword-ph' => 'Zadejte své heslo',
+'createacct-yourpassword-ph' => 'Zadejte heslo',
'yourpasswordagain' => 'Zopakujte heslo:',
+'createacct-yourpasswordagain' => 'Potvrzení hesla',
+'createacct-yourpasswordagain-ph' => 'Zadejte heslo ještě jednou',
'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',
+'userlogin-remembermypassword' => 'Přihlásit trvale',
+'userlogin-signwithsecure' => 'Používat zabezpeÄené pÅ™ipojení',
'yourdomainname' => 'Vaše doména',
'password-change-forbidden' => 'Na této wiki nemůžete měnit hesla.',
'externaldberror' => 'BuÄ nastala chyba externí autentizaÄní databáze, nebo nemáte dovoleno mÄ›nit svůj externí úÄet.',
@@ -789,18 +808,44 @@ Nezapomeňte si upravit své [[Special:Preferences|nastavení {{grammar:2sg|{{SI
'logout' => 'Odhlásit se',
'userlogout' => 'Odhlášení',
'notloggedin' => 'Nejste přihlášen(a)',
+'userlogin-noaccount' => 'Nemáte úÄet?',
+'userlogin-joinproject' => 'Přidejte se k {{grammar:3sg|{{SITENAME}}}}',
'nologin' => 'Dosud nemáte úÄet? $1.',
'nologinlink' => 'Zaregistrujte se',
'createaccount' => 'VytvoÅ™it úÄet',
'gotaccount' => "Už jste registrováni? '''$1'''.",
'gotaccountlink' => 'Přihlaste se',
'userlogin-resetlink' => 'Zapomněli jste přihlašovací údaje?',
+'userlogin-resetpassword-link' => 'Obnovit heslo',
+'helplogin-url' => 'Help:Přihlášení',
+'userlogin-helplink' => '[[{{MediaWiki:helplogin-url}}|Nápověda k přihlašování]]',
+'userlogin-loggedin' => 'Již jste {{GENDER:$1|přihlášen|přihlášena}} jako $1.
+Pomocí formuláře níže se můžete přihlásit jako jiný uživatel.',
+'userlogin-createanother' => 'VytvoÅ™it jiný úÄet',
+'createacct-join' => 'Níže zadejte své údaje.',
+'createacct-another-join' => 'Níže zadejte údaje nového úÄtu.',
+'createacct-emailrequired' => 'E-mailová adresa',
+'createacct-emailoptional' => 'E-mailová adresa (nepovinné)',
+'createacct-email-ph' => 'Zadejte svou e-mailovou adresu',
+'createacct-another-email-ph' => 'Zadejte e-mailovou adresu',
'createaccountmail' => 'Použít doÄasné náhodné heslo a odeslat ho na uvedenou e-mailovou adresu',
+'createacct-realname' => 'SkuteÄné jméno (nepovinné)',
'createaccountreason' => 'Důvod:',
+'createacct-reason' => 'Důvod',
+'createacct-reason-ph' => 'ProÄ si vytváříte další úÄet',
+'createacct-captcha' => 'BezpeÄnostní kontrola',
+'createacct-imgcaptcha-ph' => 'Opište výše zobrazený text',
+'createacct-submit' => 'VytvoÅ™it úÄet',
+'createacct-another-submit' => 'VytvoÅ™it jiný úÄet',
+'createacct-benefit-heading' => '{{grammar:4sg|{{SITENAME}}}} tvoří lidé jako vy.',
+'createacct-benefit-body1' => '{{PLURAL:$1|editace|editace|editací}}',
+'createacct-benefit-body2' => '{{PLURAL:$1|stránka|stránky|stránek}}',
+'createacct-benefit-body3' => '{{PLURAL:$1|nedávný přispěvatel|nedávní přispěvatelé|nedávných přispěvatelů}}',
'badretype' => 'Vámi napsaná hesla nesouhlasí.',
'userexists' => 'Zadané uživatelské jméno se již používá.
Zvolte si prosím jiné jméno.',
'loginerror' => 'Chyba při přihlašování',
+'createacct-error' => 'Chyba pÅ™i zakládání úÄtu',
'createaccounterror' => 'NepodaÅ™ilo se vytvoÅ™it uživatelský úÄet: $1',
'nocookiesnew' => 'Uživatelský úÄet byl vytvoÅ™en, ale nejste pÅ™ihlášeni. {{SITENAME}} používá cookies k pÅ™ihlášení uživatelů. Vy máte cookies vypnuty. Prosím zapnÄ›te je a pÅ™ihlaste se znovu s vaším novým uživatelským jménem a heslem.',
'nocookieslogin' => '{{SITENAME}} používá cookies k přihlášení uživatelů. Vy máte cookies vypnuty. Prosím zapněte je a zkuste znovu.',
@@ -858,10 +903,12 @@ Měli byste se co nejdřív přihlásit a změnit si heslo.
Pokud byl úÄet vytvoÅ™en omylem, považujte tuto zprávu za bezpÅ™edmÄ›tnou.',
'usernamehasherror' => 'Uživatelské jméno nemůže obsahovat znak mřížka (#)',
'login-throttled' => 'Provedli jste příliš mnoho pokusů o přihlášení.
-PoÄkejte chvíli, než to zkusíte znovu.',
+Než to zkusíte znovu, musíte poÄkat na vyprÅ¡ení lhůty $1.',
'login-abort-generic' => 'Vaše přihlášení se nezdařilo – přerušeno',
'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.',
+'createacct-another-realname-tip' => 'SkuteÄné jméno je nepovinné.
+Pokud se ho rozhodnete uvést, bude použito pro oznaÄení autorství vaší práce.',
# Email sending
'php-mail-error-unknown' => 'Neznámá chyba v PHP funkci mail()',
@@ -877,8 +924,7 @@ PoÄkejte chvíli, než to zkusíte znovu.',
'newpassword' => 'Nové heslo:',
'retypenew' => 'Napište znovu nové heslo',
'resetpass_submit' => 'Nastavit heslo a přihlásit se',
-'resetpass_success' => 'Vaše heslo bylo úspěšně změněno!
-Probíhá přihlašování…',
+'changepassword-success' => 'Vaše heslo bylo úspěšně změněno!',
'resetpass_forbidden' => 'Hesla nelze změnit.',
'resetpass-no-info' => 'K této stránce mají přímý přístup jen přihlášení uživatelé.',
'resetpass-submit-loggedin' => 'Změnit heslo',
@@ -890,10 +936,11 @@ Možná jste si již úspěšně heslo změnili, nebo jste si vyžádali nové d
# Special:PasswordReset
'passwordreset' => 'Reset hesla',
-'passwordreset-text' => 'Pro získání nového hesla vyplňte tento formulář.',
+'passwordreset-text-one' => 'Pro získání nového hesla vyplňte tento formulář.',
+'passwordreset-text-many' => '{{PLURAL:$1|Pro získání nového hesla zadejte jeden z údajů.}}',
'passwordreset-legend' => 'Znovu nastavit heslo',
'passwordreset-disabled' => 'Znovunastavení hesla je na této wiki zakázáno.',
-'passwordreset-pretext' => '{{PLURAL:$1||Zadejte jeden z údajů níže}}',
+'passwordreset-emaildisabled' => 'E-mailové funkce byly na této wiki vypnuty.',
'passwordreset-username' => 'Uživatelské jméno:',
'passwordreset-domain' => 'Doména:',
'passwordreset-capture' => 'Prohlédnout si výsledný e-mail?',
@@ -921,7 +968,7 @@ tedy změnit, můžete tuto zprávu ignorovat a nadále používat původní hes
DoÄasné heslo: $2',
'passwordreset-emailsent' => 'E-mail pro získání nového hesla byl odeslán.',
'passwordreset-emailsent-capture' => 'Byl odeslán e-mail pro získání nového hesla, který je zobrazen níže.',
-'passwordreset-emailerror-capture' => 'Byl vygenerován připomínací e-mail, který je zobrazen níže, ale nepodařilo se ho odeslat uživateli: $1',
+'passwordreset-emailerror-capture' => 'Byl vygenerován e-mail pro získání nového hesla, který je zobrazen níže, ale nepodařilo se ho odeslat {{GENDER:$2|uživateli|uživatelce}}: $1',
# Special:ChangeEmail
'changeemail' => 'Změna e-mailové adresy',
@@ -935,6 +982,19 @@ DoÄasné heslo: $2',
'changeemail-submit' => 'Změnit e-mail',
'changeemail-cancel' => 'Storno',
+# Special:ResetTokens
+'resettokens' => 'Reinicializace klíÄů',
+'resettokens-text' => 'Na této stránce můžete reinicializovat klíÄe, které umožňují přístup k jistým soukromým údajům spojeným s vaším úÄtem.
+
+{{GENDER:|MÄ›l|MÄ›la|MÄ›li}} byste to provést v případÄ›, že jste je omylem nÄ›komu {{GENDER:|prozradil|prozradila|prozradili}}, nebo byl váš úÄet naruÅ¡en.',
+'resettokens-no-tokens' => 'Neexistují žádné klíÄe, které by bylo možno reinicializovat.',
+'resettokens-legend' => 'Reinicializace klíÄů',
+'resettokens-tokens' => 'KlíÄe:',
+'resettokens-token-label' => '$1 (aktuální hodnota: $2)',
+'resettokens-watchlist-token' => 'KlÃ­Ä k webovému kanálu (Atom/RSS) [[Special:Watchlist|zmÄ›n sledovaných stránek]]',
+'resettokens-done' => 'KlíÄe reinicializovány',
+'resettokens-resetbutton' => 'Reinicializovat vybrané klíÄe',
+
# Edit page toolbar
'bold_sample' => 'TuÄný text',
'bold_tip' => 'TuÄný text',
@@ -1123,11 +1183,14 @@ Podrobnosti si můžete prohlédnout v níže zobrazeném seznamu provedených p
Zřejmě byla smazána.',
'edit-conflict' => 'EditaÄní konflikt.',
'edit-no-change' => 'Vaše editace byla ignorována, protože nedošlo k žádné změně textu.',
+'postedit-confirmation' => 'Vaše změny byly uloženy.',
'edit-already-exists' => 'Nepodařilo se vytvořit novou stránku, protože již existuje.',
'defaultmessagetext' => 'Výchozí text hlášení',
'content-failed-to-parse' => 'Nepodařilo se zpracovat data $2 do modelu $1: $3',
'invalid-content-data' => 'Obsažená data jsou chybná',
'content-not-allowed-here' => 'Obsah typu $1 není na stránce [[$2]] dovolen.',
+'editwarning-warning' => 'Opuštěním této stránky se mohou veškeré provedené změny ztratit.
+Přihlášení uživatelé si mohou toto varování vypnout na záložce „Editace“ v uživatelském nastavení.',
# Content models
'content-model-wikitext' => 'wikitext',
@@ -1162,6 +1225,7 @@ Tyto argumenty byly vynechány.',
'undo-failure' => 'Editace nemohla být zrušena kvůli konfliktu mezilehlých editací.',
'undo-norev' => 'Tuto editaci není možné vrátit, protože neexistuje nebo byla smazána.',
'undo-summary' => 'Zrušena verze $1 od uživatele [[Special:Contributions/$2|$2]] ([[User talk:$2|diskuse]])',
+'undo-summary-username-hidden' => 'Zrušena verze $1 od skrytého uživatele',
# Account creation failure
'cantcreateaccounttitle' => 'Nelze vytvoÅ™it uživatelský úÄet',
@@ -1341,6 +1405,7 @@ Ujistěte se, že tato změna udrží souvislost a posloupnost verzí v historii
'compareselectedversions' => 'Porovnat vybrané verze',
'showhideselectedversions' => 'Zobrazit/skrýt vybrané revize',
'editundo' => 'zrušit editaci',
+'diff-empty' => '(Žádný rozdíl)',
'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ů}}.)',
'difference-missing-revision' => '{{PLURAL:$2|Jedna z revizí|$2 revize|$2 revizí}} k požadovanému porovnání ($1) {{PLURAL:$2|neexistuje|neexistují|neexistuje}}.
@@ -1368,7 +1433,6 @@ Podrobnosti mohou být uvedeny v [{{fullurl:{{#Special:Log}}/delete|page={{FULLP
'searchmenu-legend' => 'Možnosti hledání',
'searchmenu-exists' => "'''Na této wiki existuje stránka nazvaná „[[:$1]]“.'''",
'searchmenu-new' => "'''Vytvořte na této wiki stránku „[[:$1]]“!'''",
-'searchhelp-url' => 'Help:Obsah',
'searchmenu-prefix' => '[[Special:PrefixIndex/$1|Zobrazit stránky, jejichž název zaÄíná „$1“]]',
'searchprofile-articles' => 'Články',
'searchprofile-project' => 'Nápověda a projektové stránky',
@@ -1410,15 +1474,7 @@ Pokud na zaÄátek dotazu pÅ™idáte ''all:'', bude se hledat vÅ¡ude (vÄetnÄ› di
'powersearch-togglenone' => 'Nic',
'search-external' => 'Externí hledání',
'searchdisabled' => '<p>Omlouváme se. Plnotextové vyhledávání je doÄasnÄ› nedostupné. Zatím můžete zkusit vyhledávání Googlem; je ale možné, že jeho výsledky nemusí být aktuální.</p>',
-
-# Quickbar
-'qbsettings' => 'Nastavení lišty nástrojů',
-'qbsettings-none' => 'Žádný',
-'qbsettings-fixedleft' => 'Leží vlevo',
-'qbsettings-fixedright' => 'Leží vpravo',
-'qbsettings-floatingleft' => 'Plovoucí vlevo',
-'qbsettings-floatingright' => 'Plovoucí vpravo',
-'qbsettings-directionality' => 'Pevný v závislosti na směrovosti vašeho písma',
+'search-error' => 'Při hledání došlo k chybě: $1',
# Preferences page
'preferences' => 'Nastavení',
@@ -1452,7 +1508,6 @@ Pokud na zaÄátek dotazu pÅ™idáte ''all:'', bude se hledat vÅ¡ude (vÄetnÄ› di
'resetprefs' => 'Vrátit původní nastavení',
'restoreprefs' => 'Obnovit všechna výchozí nastavení (ve všech sekcích)',
'prefs-editing' => 'Editace',
-'prefs-edit-boxsize' => 'Velikost editaÄního okna:',
'rows' => 'Řádky',
'columns' => 'Sloupce',
'searchresultshead' => 'Vyhledávání',
@@ -1463,9 +1518,8 @@ Pokud na zaÄátek dotazu pÅ™idáte ''all:'', bude se hledat vÅ¡ude (vÄetnÄ› di
'recentchangesdays-max' => 'Maximálně $1 {{PLURAL:$1|den|dny|dní}}',
'recentchangescount' => 'PoÄet implicitnÄ› zobrazovaných záznamů:',
'prefs-help-recentchangescount' => 'Týká se posledních změn, historie stránek a protokolovacích záznamů.',
-'prefs-help-watchlist-token' => 'Pokud do tohoto pole vyplníte tajný klíÄ, bude vytvoÅ™en RSS kanál vaÅ¡ich sledovaných stránek.
-Kdokoli, kdo bude tento klÃ­Ä znát, pak bude moci váš seznam sledovaných stránek Äíst, takže dbejte na bezpeÄnost.
-Můžete použít tuto náhodně vygenerovanou hodnotu: $1',
+'prefs-help-watchlist-token2' => 'Toto je tajný klÃ­Ä k webovému kanálu vaÅ¡ich sledovaných stránek. Kdokoli, kdo bude tento klÃ­Ä znát, bude moci váš seznam sledovaných stránek Äíst, takže ho neÅ¡iÅ™te.
+[[Special:ResetTokens|Kliknutím sem ho můžete reinicializovat.]]',
'savedprefs' => 'Vaše nastavení bylo uloženo.',
'timezonelegend' => 'Časové pásmo:',
'localtime' => 'Místní Äas:',
@@ -1496,7 +1550,6 @@ Můžete použít tuto náhodně vygenerovanou hodnotu: $1',
'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:',
-'prefs-textboxsize' => 'Velikost editaÄního okna',
'youremail' => 'E-mail:',
'username' => '{{GENDER:$1|Uživatelské jméno}}:',
'uid' => '{{GENDER:$1|Uživatelské}} ID:',
@@ -1530,6 +1583,8 @@ Vaše adresa v takovém případě není prozrazena.',
'prefs-dateformat' => 'Formát data',
'prefs-timeoffset' => 'Časový posun',
'prefs-advancedediting' => 'Obecné nastavení',
+'prefs-editor' => 'Editor',
+'prefs-preview' => 'Náhled',
'prefs-advancedrc' => 'Rozšířené možnosti',
'prefs-advancedrendering' => 'Rozšířené možnosti',
'prefs-advancedsearchoptions' => 'Rozšířené možnosti',
@@ -1537,7 +1592,9 @@ Vaše adresa v takovém případě není prozrazena.',
'prefs-displayrc' => 'Možnosti zobrazení',
'prefs-displaysearchoptions' => 'Možnosti zobrazení',
'prefs-displaywatchlist' => 'Možnosti zobrazení',
+'prefs-tokenwatchlist' => 'KlíÄ',
'prefs-diffs' => 'Porovnání verzí',
+'prefs-help-prefershttps' => 'Toto nastavení se projeví při příštím přihlášení.',
# User preference: email validation using jQuery
'email-address-validity-valid' => 'E-mailová adresa vypadá jako platná',
@@ -1564,6 +1621,8 @@ Vaše adresa v takovém případě není prozrazena.',
'userrights-notallowed' => 'Nemáte oprávnění měnit uživatelská práva.',
'userrights-changeable-col' => 'Skupiny, které můžete měnit',
'userrights-unchangeable-col' => 'Skupiny, které nemůžete měnit',
+'userrights-conflict' => 'Konflikt zmÄ›n uživatelských práv! Zkontrolujte a potvrÄte požadované zmÄ›ny.',
+'userrights-removed-self' => 'Úspěšně jste si odebrali vlastní práva. Tudíž už nemáte k této stránce přístup.',
# Groups
'group' => 'Skupina:',
@@ -1629,11 +1688,19 @@ Vaše adresa v takovém případě není prozrazena.',
'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 kaskádovÄ› zamÄených stránek',
-'right-editprotected' => 'Editace zamÄených stránek (bez kaskádového zámku)',
+'right-editprotected' => 'Editace stránek zamÄených na „{{int:protect-level-sysop}}“',
+'right-editsemiprotected' => 'Editace stránek zamÄených na „{{int:protect-level-autoconfirmed}}“',
'right-editinterface' => 'Editace zpráv uživatelského rozhraní',
'right-editusercssjs' => 'Editace CSS a JS souborů jiných uživatelů',
'right-editusercss' => 'Editace CSS souborů jiných uživatelů',
'right-edituserjs' => 'Editace JavaScriptových souborů jiných uživatelů',
+'right-editmyusercss' => 'Editace vašich uživatelských CSS souborů',
+'right-editmyuserjs' => 'Editace vašich uživatelských JavaScriptových souborů',
+'right-viewmywatchlist' => 'Prohlížení vlastního seznamu sledovaných stránek',
+'right-editmywatchlist' => 'Editace vlastního seznamu sledovaných stránek. Uvědomte si, že některé akce do něj mohou přidat stránky i bez tohoto oprávnění.',
+'right-viewmyprivateinfo' => 'Prohlížení vlastních soukromých údajů (napÅ™. e-mailová adresa, skuteÄné jméno)',
+'right-editmyprivateinfo' => 'ZmÄ›na vaÅ¡ich soukromých údajů (napÅ™. e-mailová adresa, skuteÄné jméno)',
+'right-editmyoptions' => 'Změna vašich uživatelských nastavení',
'right-rollback' => 'Rychlý revert úprav posledního uživatele editujícího danou stránku',
'right-markbotedits' => 'OznaÄování revertů jako editace bota',
'right-noratelimit' => 'Imunita vůÄi rychlostním limitům',
@@ -1695,12 +1762,19 @@ Vaše adresa v takovém případě není prozrazena.',
'action-userrights-interwiki' => 'upravovat práva uživatelů na jiných wiki',
'action-siteadmin' => 'zamykat nebo odemykat databázi',
'action-sendemail' => 'posílat e-maily',
+'action-editmywatchlist' => 'upravovat vlastní seznam sledovaných stránek',
+'action-viewmywatchlist' => 'prohlížet vlastní seznam sledovaných stránek',
+'action-viewmyprivateinfo' => 'prohlížet si své soukromé údaje',
+'action-editmyprivateinfo' => 'změnit své soukromé údaje',
# Recent changes
'nchanges' => '$1 {{PLURAL:$1|změna|změny|změn}}',
+'enhancedrc-since-last-visit' => '$1 {{PLURAL:$1|od poslední návštěvy}}',
+'enhancedrc-history' => 'historie',
'recentchanges' => 'Poslední změny',
'recentchanges-legend' => 'Možnosti posledních změn',
'recentchanges-summary' => 'Sledujte poslední změny na {{grammar:6sg|{{SITENAME}}}} na této stránce.',
+'recentchanges-noresult' => 'V daném období neodpovídaly zadaným kritériím žádné změny.',
'recentchanges-feed-description' => 'Na tomto kanále sledujte poslední změny na {{grammar:6sg|{{SITENAME}}}}.',
'recentchanges-label-newpage' => 'Touto editací byla založena nová stránka',
'recentchanges-label-minor' => 'Toto je malá editace',
@@ -1738,7 +1812,6 @@ $3',
'recentchangeslinked-feed' => 'Související změny',
'recentchangeslinked-toolbox' => 'Související změny',
'recentchangeslinked-title' => 'Související změny pro stránku „$1“',
-'recentchangeslinked-noresult' => 'V zadaném období nebyly na odkazovaných stránkách provedeny žádné změny.',
'recentchangeslinked-summary' => "Níže je seznam nedávných změn stránek odkazovaných ze zadané stránky (nebo patřících do dané kategorie). Vaše [[Special:Watchlist|sledované stránky]] jsou '''zvýrazněny'''.",
'recentchangeslinked-page' => 'Název stránky:',
'recentchangeslinked-to' => 'Zobrazit změny na stránkách odkazujících na zadanou stránku',
@@ -1749,7 +1822,7 @@ $3',
'reuploaddesc' => 'ZruÅ¡it naÄítání a vrátit se do formuláře.',
'upload-tryagain' => 'Uložit upravený popis souboru',
'uploadnologin' => 'Nejste přihlášen(a)',
-'uploadnologintext' => 'Pro naÄtení souboru se musíte [[Special:UserLogin|pÅ™ihlásit]].',
+'uploadnologintext' => 'Pro naÄtení souboru se musíte $1.',
'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Ä›',
@@ -1970,7 +2043,6 @@ Z bezpeÄnostních důvodů je img_auth.php vypnuto.',
'http-read-error' => 'Chyba pÅ™i Ätení HTTP.',
'http-timed-out' => 'Čas pro HTTP požadavek vypršel.',
'http-curl-error' => 'Chyba pÅ™i Ätení z URL: $1',
-'http-host-unreachable' => 'Nepodařilo se kontaktovat URL',
'http-bad-status' => 'Při provádění HTTP požadavku nastal problém: $1 $2',
# Some likely curl errors. More could be added from <http://curl.haxx.se/libcurl/c/libcurl-errors.html>
@@ -1998,6 +2070,10 @@ Z bezpeÄnostních důvodů je img_auth.php vypnuto.',
'listfiles_size' => 'Velikost (bajtů)',
'listfiles_description' => 'Popis',
'listfiles_count' => 'Verze',
+'listfiles-show-all' => 'Zahrnout staré verze obrázků',
+'listfiles-latestversion' => 'Aktuální verze',
+'listfiles-latestversion-yes' => 'Ano',
+'listfiles-latestversion-no' => 'Ne',
# File description page
'file-anchor-link' => 'Soubor',
@@ -2094,6 +2170,13 @@ Vstup: <code>typ obsahu/podtyp</code>, napÅ™. <code>image/jpeg</code>.',
'randompage' => 'Náhodná stránka',
'randompage-nopages' => 'V {{PLURAL:$2|následujícím jmenném prostoru|následujících jmenných prostorech}} nejsou žádné stránky: $1.',
+# Random page in category
+'randomincategory' => 'Náhodná stránka z kategorie',
+'randomincategory-invalidcategory' => '„$1“ není platný název kategorie.',
+'randomincategory-nopages' => 'V [[:Category:$1|kategorii $1]] žádné stránky nejsou.',
+'randomincategory-selectcategory' => 'Získat náhodnou stránku z kategorie: $1 $2',
+'randomincategory-selectcategory-submit' => 'Přejít',
+
# Random redirect
'randomredirect' => 'Náhodné přesměrování',
'randomredirect-nopages' => 'Ve jmenném prostoru „$1“ nejsou žádná přesměrování.',
@@ -2119,17 +2202,13 @@ Vstup: <code>typ obsahu/podtyp</code>, napÅ™. <code>image/jpeg</code>.',
'statistics-users-active-desc' => 'Uživatelé, kteří v {{plural:$1|posledním dni|posledních $1 dnech}} provedli nějakou operaci',
'statistics-mostpopular' => 'NejÄtenÄ›jší stránky',
-'disambiguations' => 'Stránky odkazující na rozcestníky',
-'disambiguationspage' => 'Template:Rozcestník',
-'disambiguations-text' => "Následující stránky obsahují nejméně jeden odkaz na '''rozcestník'''.
-Asi by místo toho měly odkazovat na konkrétnější stránku.<br />
-Stránka je považována za rozcestník, pokud používá některou ze šablon odkazovaných na [[MediaWiki:Disambiguationspage]].",
-
'pageswithprop' => 'Stránky s vlastností',
'pageswithprop-legend' => 'Stránky s vlastností',
'pageswithprop-text' => 'Tato stránka obsahuje seznam stránek, které používají zadanou vlastnost stránky.',
'pageswithprop-prop' => 'Název vlastnosti:',
'pageswithprop-submit' => 'Provést',
+'pageswithprop-prophidden-long' => 'dlouhá hodnota textové vlastnosti skryta ($1)',
+'pageswithprop-prophidden-binary' => 'hodnota binární vlastnosti skryta ($1)',
'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í.
@@ -2187,6 +2266,7 @@ Každý řádek obsahuje odkaz na první a druhé přesměrování a k tomu cíl
'mostrevisions' => 'Stránky s nejvíce revizemi',
'prefixindex' => 'Seznam stránek dle zaÄátku názvu',
'prefixindex-namespace' => 'Seznam stránek dle zaÄátku názvu (jmenný prostor $1)',
+'prefixindex-strip' => 'ZaÄátek názvu v seznamu odříznout',
'shortpages' => 'Nejkratší stránky',
'longpages' => 'Nejdelší stránky',
'deadendpages' => 'Slepé stránky',
@@ -2202,6 +2282,7 @@ Každý řádek obsahuje odkaz na první a druhé přesměrování a k tomu cíl
'listusers' => 'Uživatelé',
'listusers-editsonly' => 'Zobrazit pouze uživatele s editacemi',
'listusers-creationsort' => 'Seřadit podle data registrace',
+'listusers-desc' => 'Řadit sestupně',
'usereditcount' => '$1 {{PLURAL:$1|editace|editace|editací}}',
'usercreated' => '{{GENDER:$3|Registrován|Registrována|Registrován(a)}} $1 v $2',
'newpages' => 'Nejnovější stránky',
@@ -2379,10 +2460,9 @@ Ve [[Special:Watchlist|sledovaných stránkách]] se tak budou objevovat budoucÃ
'unwatchthispage' => 'Nesledovat tuto stránku',
'notanarticle' => 'Toto není stránka',
'notvisiblerev' => 'Verze byla smazána',
-'watchnochange' => 'Žádná ze sledovaných položek nebyla editována v době, která je zobrazena.',
'watchlist-details' => 'Na vaÅ¡em seznamu sledovaných stránek {{PLURAL:$1|je $1 stránka|jsou $1 stránky|je $1 stránek}}, nepoÄítají se diskusní stránky.',
-'wlheader-enotif' => '* Upozorňování e-mailem je zapnuto.',
-'wlheader-showupdated' => "* Stránky, které se zmÄ›nily od vaší poslední návÅ¡tÄ›vy, jsou zobrazeny '''tuÄnÄ›'''",
+'wlheader-enotif' => 'Upozorňování e-mailem je zapnuto.',
+'wlheader-showupdated' => "Stránky, které se zmÄ›nily od vaší poslední návÅ¡tÄ›vy, jsou zobrazeny '''tuÄnÄ›'''.",
'watchmethod-recent' => 'hledají se sledované stránky mezi posledními změnami',
'watchmethod-list' => 'hledají se nejnovější editace sledovaných stránek',
'watchlistcontains' => 'Na vašem seznamu sledovaných stránek {{PLURAL:$1|je $1 položka|jsou $1 položky|je $1 položek}}.',
@@ -2622,7 +2702,7 @@ $1',
'contributions' => 'Příspěvky {{GENDER:$1|uživatele|uživatelky}}',
'contributions-title' => 'Příspěvky uživatele $1',
'mycontris' => 'Příspěvky',
-'contribsub2' => '$1 ($2)',
+'contribsub2' => '{{GENDER:$3|uživatele|uživatelky}} $1 ($2)',
'nocontribs' => 'Nenalezeny žádné změny vyhovující kritériím.',
'uctop' => '(aktuální)',
'month' => 'Do měsíce:',
@@ -2777,13 +2857,11 @@ Vizte též [[Special:BlockList|seznam všech probíhajících bloků]].',
'ipb_blocked_as_range' => 'Chyba: IP adresa $1 není blokována přímo a tak ji nelze odblokovat. Je Äástí zablokovaného rozsahu $2, který může být odblokován.',
'ip_range_invalid' => 'Neplatný IP rozsah.',
'ip_range_toolarge' => 'Blokování rozsahů větších než /$1 není dovoleno.',
-'blockme' => 'Zablokuj mÄ›',
'proxyblocker' => 'Blokování proxy serverů',
-'proxyblocker-disabled' => 'Tato funkce je vypnuta.',
'proxyblockreason' => 'VaÅ¡e IP adresa byla zablokována, protože funguje jako otevÅ™ený proxy server. Kontaktujte svého poskytovatele internetového pÅ™ipojení nebo technickou podporu a informujte je o tomto vážném bezpeÄnostním problému.',
-'proxyblocksuccess' => 'Hotovo.',
'sorbsreason' => 'Vaše IP adresa je uvedena na seznamu DNSBL jako otevřený proxy server.',
'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',
+'xffblockreason' => 'IP adresa uvedená v hlaviÄce X-Forwarded-For, aÅ¥ už vaÅ¡e, nebo patřící proxy serveru, který používáte, byla zablokována. ZdůvodnÄ›ní tohoto zablokování: $1',
'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}}',
@@ -2941,6 +3019,8 @@ Pokud si přejete přispívat k lokalizaci softwaru MediaWiki, navštivte [//www
'thumbnail-more' => 'Zvětšit',
'filemissing' => 'Chybějící soubor',
'thumbnail_error' => 'Chyba při vytváření náhledu: $1',
+'thumbnail_error_remote' => 'Chybové hlášení z {{grammar:2sg|$1}}:
+$2',
'djvu_page_error' => 'Stránka DjVu mimo rozsah',
'djvu_no_xml' => 'Vytvoření XML pro soubor DjVu se nezdařilo.',
'thumbnail-temp-create' => 'DoÄasný soubor náhledu nelze vytvoÅ™it.',
@@ -3087,17 +3167,11 @@ Uložte jej na svůj disk a nahrajte ho sem.',
# Stylesheets
'common.css' => '/* Zde uvedené CSS bude ovlivňovat všechny styly */',
-'standard.css' => '/* Zde uvedené CSS bude ovlivňovat pouze styl „Klasický“ */',
-'nostalgia.css' => '/* Zde uvedené CSS bude ovlivňovat pouze styl „Nostalgie“ */',
'cologneblue.css' => '/* Zde uvedené CSS bude ovlivňovat pouze styl „Kolínská modř“ */',
'monobook.css' => '/* Zde uvedené CSS bude ovlivňovat pouze styl „Monobook“ */',
-'myskin.css' => '/* Zde uvedené CSS bude ovlivňovat pouze styl „Můj vzhled“ */',
-'chick.css' => '/* Zde uvedené CSS bude ovlivňovat pouze styl „Kuře“ */',
-'simple.css' => '/* Zde uvedené CSS bude ovlivňovat pouze styl „Jednoduchý“ */',
'modern.css' => '/* Zde uvedené CSS bude ovlivňovat pouze styl „Moderní“ */',
'vector.css' => '/* Zde uvedené CSS bude ovlivňovat pouze styl „Vektor“ */',
'print.css' => '/* Zde uvedené CSS bude ovlivňovat tiskový výstup */',
-'handheld.css' => '/* Zde uvedené CSS bude ovlivňovat přenosná zařízení vycházející ze stylu nastaveného v proměnné $wgHandheldStyle */',
'noscript.css' => '/* Zde uvedené CSS bude ovlivňovat uživatele s vypnutým JavaScriptem */',
'group-autoconfirmed.css' => '/* Zde uvedené CSS bude ovlivňovat pouze automaticky schválené uživatele */',
'group-bot.css' => '/* Zde uvedené CSS bude ovlivňovat pouze boty */',
@@ -3106,13 +3180,8 @@ Uložte jej na svůj disk a nahrajte ho sem.',
# Scripts
'common.js' => '/* Zde uvedený JavaScript bude použit pro vÅ¡echny uživatele pÅ™i naÄtení každé stránky. */',
-'standard.js' => '/* JavaScript pro uživatele používající vzhled „Klasický“ */',
-'nostalgia.js' => '/* JavaScript pro uživatele používající vzhled „Nostalgie“ */',
'cologneblue.js' => '/* JavaScript pro uživatele používající vzhled „Kolínská modř“ */',
'monobook.js' => '/* JavaScript pro uživatele používající vzhled MonoBook */',
-'myskin.js' => '/* JavaScript pro uživatele používající vzhled „Můj vzhled“ */',
-'chick.js' => '/* JavaScript pro uživatele používající vzhled „Kuře“ */',
-'simple.js' => '/* JavaScript pro uživatele používající vzhled „Jednoduchý“ */',
'modern.js' => '/* JavaScript pro uživatele používající vzhled „Moderní“ */',
'vector.js' => '/* JavaScript pro uživatele používající vzhled „Vektor“ */',
'group-autoconfirmed.js' => '/* Zde uvedený JavaScript bude použit pouze pro automaticky schválené uživatele */',
@@ -3191,12 +3260,7 @@ Uložte jej na svůj disk a nahrajte ho sem.',
'pageinfo-category-files' => 'PoÄet souborů',
# Skin names
-'skinname-standard' => 'Klasický',
-'skinname-nostalgia' => 'Nostalgie',
'skinname-cologneblue' => 'Kolínská modř',
-'skinname-myskin' => 'Můj vzhled',
-'skinname-chick' => 'Kuře',
-'skinname-simple' => 'Jednoduchý',
'skinname-modern' => 'Moderní',
'skinname-vector' => 'Vektor',
@@ -3276,11 +3340,25 @@ OtevÅ™ením souboru můžete ohrozit svůj poÄítaÄ.",
'minutes' => '{{PLURAL:$1|$1 minuta|$1 minuty|$1 minut}}',
'hours' => '{{PLURAL:$1|$1 hodina|$1 hodiny|$1 hodin}}',
'days' => '{{PLURAL:$1|$1 den|$1 dny|$1 dní}}',
+'weeks' => '{{PLURAL:$1|$1 týden|$1 týdny|$1 týdnů}}',
'months' => '{{PLURAL:$1|$1 měsíc|$1 měsíce|$1 měsíců}}',
'years' => '{{PLURAL:$1|$1 rok|$1 roky|$1 let}}',
'ago' => 'před $1',
'just-now' => 'právÄ› teÄ',
+# Human-readable timestamps
+'hours-ago' => 'před $1 {{PLURAL:$1|hodinou|hodinami}}',
+'minutes-ago' => 'před $1 {{PLURAL:$1|minutou|minutami}}',
+'seconds-ago' => 'před $1 {{PLURAL:$1|sekundou|sekundami}}',
+'monday-at' => 'v pondělí v $1',
+'tuesday-at' => 'v úterý v $1',
+'wednesday-at' => 've středu v $1',
+'thursday-at' => 've Ätvrtek v $1',
+'friday-at' => 'v pátek v $1',
+'saturday-at' => 'v sobotu v $1',
+'sunday-at' => 'v neděli v $1',
+'yesterday-at' => 'vÄera v $1',
+
# Bad image list
'bad_image_list' => 'Tato stránka má následující formát:
@@ -3306,7 +3384,7 @@ Obsahuje pouze seznam s odrážkami (řádka zaÄíná s *). První odkaz na Å™Ã
* gpslongitude
* gpsaltitude',
-# EXIF tags
+# Exif tags
'exif-imagewidth' => 'Šířka',
'exif-imagelength' => 'Výška',
'exif-bitspersample' => 'Bitů na složku',
@@ -3484,7 +3562,7 @@ Obsahuje pouze seznam s odrážkami (řádka zaÄíná s *). První odkaz na Å™Ã
'exif-originalimageheight' => 'Výška obrázku před oříznutím',
'exif-originalimagewidth' => 'Šířka obrázku před oříznutím',
-# EXIF attributes
+# Exif attributes
'exif-compression-1' => 'Nekomprimovaný',
'exif-compression-2' => '1-rozměrné modifikované Huffmanovo kódování délky běhu CCITT Group 3',
'exif-compression-3' => 'Kódování faxů CCITT Group 3',
@@ -3798,7 +3876,6 @@ Opravdu si přejete znovu tuto stránku založit?',
'confirm-unwatch-top' => 'Vyjmout tuto stránku ze sledovaných?',
# Separators for various lists, etc.
-'autocomment-prefix' => '–&#32;',
'ellipsis' => '…',
'percent' => '$1&#160;%',
@@ -3938,7 +4015,6 @@ Seznam editovaných stránek můžete také [[Special:EditWatchlist|editovat ve
'version-other' => 'Jiné',
'version-mediahandlers' => 'Obsluha médií',
'version-hooks' => 'Přípojné body',
-'version-extension-functions' => 'Rozšiřující funkce',
'version-parser-extensiontags' => 'PÅ™idané syntaktické znaÄky',
'version-parser-function-hooks' => 'Funkce parseru',
'version-hook-name' => 'Název přípojného bodu',
@@ -3947,6 +4023,7 @@ Seznam editovaných stránek můžete také [[Special:EditWatchlist|editovat ve
'version-license' => 'Licence',
'version-poweredby-credits' => "Tato wiki běží na '''[//www.mediawiki.org/ MediaWiki]''', copyright © 2001–$1 $2.",
'version-poweredby-others' => 'další',
+'version-poweredby-translators' => 'překladatelé na translatewiki.net',
'version-credits-summary' => 'Následujícím lidem bychom rádi poděkovali za jejich příspěvky [[Special:Version|MediaWiki]].',
'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.
@@ -3962,12 +4039,17 @@ MediaWiki je distribuována v nadÄ›ji, že bude užiteÄná, avÅ¡ak BEZ JAKÉKOL
'version-entrypoints-articlepath' => '[https://www.mediawiki.org/wiki/Manual:$wgArticlePath Cesta k Älánkům]',
'version-entrypoints-scriptpath' => '[https://www.mediawiki.org/wiki/Manual:$wgScriptPath Cesta ke skriptům]',
-# Special:FilePath
-'filepath' => 'Cesta k souboru',
-'filepath-page' => 'Soubor:',
-'filepath-submit' => 'Přejít',
-'filepath-summary' => 'Tato speciální stránka vrátí úplnou cestu k souboru.
-Obrázky se zobrazí v plném rozlišení, jiné typy souborů se otevřenou v přiřazených programech.',
+# Special:Redirect
+'redirect' => 'Přesměrování podle souboru, uživatele nebo ID revize',
+'redirect-legend' => 'PÅ™esmÄ›rování na soubor Äi stránku',
+'redirect-summary' => 'Tato speciální stránka pÅ™esmÄ›rovává na soubor (podle názvu), stránku (podle ID revize) nebo uživatele (podle Äíselného uživatelského ID).',
+'redirect-submit' => 'Přejít',
+'redirect-lookup' => 'Najít:',
+'redirect-value' => 'Hodnota:',
+'redirect-user' => 'Uživatelské ID',
+'redirect-revision' => 'Revizi stránky',
+'redirect-file' => 'Jméno souboru',
+'redirect-not-exists' => 'Hodnota nenalezena',
# Special:FileDuplicateSearch
'fileduplicatesearch' => 'Hledání duplicitních souborů',
@@ -4016,12 +4098,16 @@ Obrázky se zobrazí v plném rozlišení, jiné typy souborů se otevřenou v p
'tags' => 'Platné znaÄky pro zmÄ›ny',
'tag-filter' => 'Filtr podle [[Special:Tags|znaÄek]]:',
'tag-filter-submit' => 'Filtrovat',
+'tag-list-wrapper' => '([[Special:Tags|{{PLURAL:$1|ZnaÄka|ZnaÄky}}]]: $2)',
'tags-title' => 'ZnaÄky',
'tags-intro' => 'Tato stránka obsahuje seznam znaÄek, kterými může software oznaÄovat jednotlivé editace, a jejich významy.',
'tags-tag' => 'Název znaÄky',
'tags-display-header' => 'Zobrazení na seznamech změn',
'tags-description-header' => 'Úplný popis významu',
+'tags-active-header' => 'Aktivní?',
'tags-hitcount-header' => 'OznaÄené zmÄ›ny',
+'tags-active-yes' => 'Ano',
+'tags-active-no' => 'Ne',
'tags-edit' => 'editovat',
'tags-hitcount' => '$1 {{PLURAL:$1|změna|změny|změn}}',
@@ -4042,6 +4128,7 @@ Obrázky se zobrazí v plném rozlišení, jiné typy souborů se otevřenou v p
'dberr-problems' => 'Promiňte! Tento server má v tuto chvíli technické problémy.',
'dberr-again' => 'Zkuste nÄ›kolik minut poÄkat a poté znovu naÄíst stránku.',
'dberr-info' => '(Nelze navázat spojení s databázovým serverem: $1)',
+'dberr-info-hidden' => '(Nelze navázat spojení s databázovým serverem)',
'dberr-usegoogle' => 'Mezitím můžete zkusit hledat pomocí Google.',
'dberr-outofdate' => 'Uvědomte si, že jejich vyhledávací index našeho obsahu může být zastaralý.',
'dberr-cachederror' => 'Následující stránka je kopie z cache a nemusí být aktuální.',
@@ -4057,6 +4144,9 @@ Obrázky se zobrazí v plném rozlišení, jiné typy souborů se otevřenou v p
'htmlform-submit' => 'Odeslat',
'htmlform-reset' => 'Vrátit změny',
'htmlform-selectorother-other' => 'Jiná hodnota',
+'htmlform-no' => 'Ne',
+'htmlform-yes' => 'Ano',
+'htmlform-chosen-placeholder' => 'Zvolte možnost',
# SQLite database support
'sqlite-has-fts' => '$1 s podporou plnotextového vyhledávání',
@@ -4174,4 +4264,19 @@ Jinak můžete využít jednoduchý formulář níže. Váš komentář bude př
# Image rotation
'rotate-comment' => 'Obrázek otoÄen o $1 {{PLURAL:$1|stupeň|stupnÄ›|stupňů}} po smÄ›ru hodinových ruÄiÄek',
+# Limit report
+'limitreport-title' => 'Data profilování parseru:',
+'limitreport-cputime' => 'Využití Äasu procesoru',
+'limitreport-cputime-value' => '$1 {{PLURAL:$1|sekunda|sekundy|sekund}}',
+'limitreport-walltime' => 'Využití reálného Äasu',
+'limitreport-walltime-value' => '$1 {{PLURAL:$1|sekunda|sekundy|sekund}}',
+'limitreport-ppvisitednodes' => 'PoÄet uzlů navÅ¡tívených preprocesorem',
+'limitreport-ppgeneratednodes' => 'PoÄet uzlů vygenerovaných preprocesorem',
+'limitreport-postexpandincludesize' => 'Velikost vložení po expanzi',
+'limitreport-postexpandincludesize-value' => '$1/$2 {{PLURAL:$2|bajt|bajty|bajtů}}',
+'limitreport-templateargumentsize' => 'Velikost argumentů šablon',
+'limitreport-templateargumentsize-value' => '$1/$2 {{PLURAL:$2|bajt|bajty|bajtů}}',
+'limitreport-expansiondepth' => 'Největší hloubka expanze',
+'limitreport-expensivefunctioncount' => 'PoÄet nároÄných funkcí parseru',
+
);
diff --git a/languages/messages/MessagesCsb.php b/languages/messages/MessagesCsb.php
index 759a487d..2d2d4bfa 100644
--- a/languages/messages/MessagesCsb.php
+++ b/languages/messages/MessagesCsb.php
@@ -68,9 +68,6 @@ $messages = array(
'tog-shownumberswatching' => 'Pòkażë lëczba ùzérającëch brëkòwników',
'tog-oldsig' => 'Pòdzérk wëzdrzatkù twòjegò pòdpisënka',
'tog-fancysig' => 'Wzérôj na pòdpisënk jakno na wikikòd (bez aùtomatnych lënków)',
-'tog-externaleditor' => 'Brëkùjë domëslno bùtnowégò editora (blós dlô ekspertów, je nót ekstra nastôwów w twòjim kòmpùtrze)',
-'tog-externaldiff' => 'Brëkùjë domëslno bùtnowégò nôrzãdza diff (blós dlô ekspertów.je nót ekstra nastôwów w twòjim kòmpùtrze)',
-'tog-showjumplinks' => 'Włączë lënczi przëstãpù "òbaczë téż"',
'tog-uselivepreview' => 'Brëkùjë wtimczasnegò pòdzérkù (JavaScript) (eksperimentalné)',
'tog-forceeditsummary' => 'Pëtôj przed wéńdzenim do pùstégò pòdrechòwania edicëji',
'tog-watchlisthideown' => 'Zatacë mòjé edicëje z lëstë ùzérónëch artiklów',
@@ -253,7 +250,7 @@ $messages = array(
'jumptonavigation' => 'nawigacëji',
'jumptosearch' => 'szëkbë',
-# 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).
+# 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).
'aboutsite' => 'Ã’ {{SITENAME}}',
'aboutpage' => 'Project:Ã’_{{SITENAME}}',
'copyright' => 'Zamkłosc hewòtny starnë je ùżëczónô wedle reglów $1.',
@@ -263,7 +260,6 @@ $messages = array(
'disclaimers' => 'Prawné zastrzedżi',
'disclaimerpage' => 'Project:Prawné zastrzedżi',
'edithelp' => 'Pòmòc do edicëji',
-'edithelppage' => 'Help:Editowanié starnë',
'helppage' => 'Help:Spisënk zamkłoscë',
'mainpage' => 'Przédnô starna',
'mainpage-description' => 'Przédnô starna',
@@ -583,9 +579,6 @@ Spróbùjë szëkbë z przëdôwkã ''all:'' dlô całowny zamkłoscë starnów
'powersearch-redir' => 'Lësta przeczerowaniów',
'powersearch-field' => 'Szëkba za',
-# Quickbar
-'qbsettings' => 'Sztrépk chùtczégò przistãpù',
-
# Preferences page
'preferences' => 'Preferencëje',
'mypreferences' => 'Mòje nastôwë',
@@ -642,7 +635,6 @@ Spróbùjë szëkbë z przëdôwkã ''all:'' dlô całowny zamkłoscë starnó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ë:',
-'prefs-textboxsize' => 'Miara edicjowégò òkna',
'youremail' => 'E-mail:',
'username' => 'Miono brëkòwnika:',
'uid' => 'ID brëkòwnika:',
@@ -819,8 +811,6 @@ Wszëtczé gòdzënë tikają conë ùniwersalnégò czasë.',
'statistics' => 'Statisticzi',
'statistics-header-users' => 'Statistika brëkòwników',
-'disambiguationspage' => 'Template:Starnë_ùjednoznacznieniô',
-
'doubleredirects' => 'Dëbeltné przeczérowania',
'brokenredirects' => 'Zerwóné przeczerowania',
@@ -917,7 +907,7 @@ Czej chcesz remôc starnã z lëste ùzéronëch artiklów, klikni ''Òprzestôj
'unwatchthispage' => 'Òprzestôj ùzerac ną starnã',
'notanarticle' => 'To nie je artikel',
'watchlist-details' => 'Ùzérôsz {{PLURAL:$1|$1 artikel|$1 artikle/-ów}}, nie rechùjąc diskùsëjów.',
-'wlheader-showupdated' => "* Artiklë jakczé òsta zmienioné òd Twòji slédny wizytë są wëapratnioné '''pògrëbieniém'''",
+'wlheader-showupdated' => "Artiklë jakczé òsta zmienioné òd Twòji slédny wizytë są wëapratnioné '''pògrëbieniém'''",
'watchmethod-list' => 'szëkba ùzérónëch artiklów westrzód pòslédnëch edicëjów',
'watchlistcontains' => 'Na twòji lësce ùzérónëch artiklów {{PLURAL:$1|je 1 strana|są $1 starnë|je $1 starnów}}.',
'wlnote' => "Niżi môsz wëskrzënioné {{PLURAL:$1|slédną zmianã|'''$1''' slédnëch zmianów}} zrobioné òb {{PLURAL:$2|gòdzënã|'''$2''' gòdzënë/gòdzënów}}.",
@@ -1051,7 +1041,6 @@ Biéj do [[Special:BlockList|lëstë zascëgónëch adresów IP]] abë òbaczëc
'blocklogentry' => 'zablokòwôł [[$1]], czas blokadë: $2 $3',
'unblocklogentry' => 'òdblokòwôł $1',
'block-log-flags-nocreate' => 'blokada ùsôdzaniô kònta',
-'proxyblocksuccess' => 'Fertich.',
# Developer tools
'lockbtn' => 'Zascëgôj bazã pòdôwków',
@@ -1227,7 +1216,7 @@ Jinszé pòla bãdą domëslno zataconé.
* gpslongitude
* gpsaltitude',
-# EXIF tags
+# Exif tags
'exif-source' => 'Zdrój',
'exif-languagecode' => 'Jãzëk',
diff --git a/languages/messages/MessagesCu.php b/languages/messages/MessagesCu.php
index ba529576..8a6738d0 100644
--- a/languages/messages/MessagesCu.php
+++ b/languages/messages/MessagesCu.php
@@ -156,6 +156,18 @@ $messages = array(
'oct' => 'ок҃т',
'nov' => 'но҃є',
'dec' => 'дє҃к',
+'january-date' => 'ꙗноуарїꙗ $1 чиÑла',
+'february-date' => 'фєвроуарїꙗ $1 чиÑла',
+'march-date' => 'мартїꙗ $1 чиÑла',
+'april-date' => 'апрїлїꙗ $1 чиÑла',
+'may-date' => 'маїꙗ $1 чиÑла',
+'june-date' => 'їоунїꙗ $1 чиÑла',
+'july-date' => 'їоулїꙗ $1 чиÑла',
+'august-date' => 'аѷгоуÑта $1 чиÑла',
+'september-date' => 'Ñєптємврїꙗ $1 чиÑла',
+'october-date' => 'октѡврїꙗ $1 чиÑла',
+'november-date' => 'ноємврїꙗ $1 чиÑла',
+'december-date' => 'дєкємврїꙗ $1 чиÑла',
# Categories related messages
'pagecategories' => '{{PLURAL:$1|Катигорїꙗ|Катигорїи|Катигорїѩ|Катигорїѩ}}',
@@ -168,7 +180,7 @@ $messages = array(
'category-subcat-count' => '{{PLURAL:$2|Сѥи катигорїи тъкъмо Ñê™— подъкатигорїꙗ Ñ¥ÑÑ‚ÑŠ|Сѥи катигорїи {{PLURAL:$1|ѥдина подъкатигорїꙗ Ñ¥ÑÑ‚ÑŠ|2 подъкатигорїи Ñ¥ÑÑ‚Ñ”|$1 подъкатигорїѩ ÑÑ«Ñ‚ÑŠ}} · а вьÑÑ© жє подъкатигорїѩ чиÑло $2 Ñ¥ÑÑ‚ÑŠ}}',
'listingcontinuesabbrev' => '· вѧщє',
-'linkprefix' => '/^(.*?)(„|«)$/sD',
+'linkprefix' => '/^((?>.*(?<!(?:„|«)$)))(.+)$/sDu',
'about' => 'опьÑаниѥ',
'article' => 'члѣнъ',
@@ -240,7 +252,7 @@ $messages = array(
'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).
+# 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).
'aboutsite' => 'О {{grammar:instrumental|{{SITENAME}}}}',
'aboutpage' => 'Project:О Ñѥмь опꙑтьÑтвовании',
'copyright' => 'подъ прощєниѥмь $1 пьÑано Ñ¥ÑÑ‚ÑŠ',
@@ -248,7 +260,6 @@ $messages = array(
'currentevents' => 'Ñѫщѧѩ вѣщи',
'currentevents-url' => 'Project:Сѫщѧѩ вѣщи',
'edithelp' => 'помощь по иÑправлѥниѭ',
-'edithelppage' => 'Help:ИÑправлѥниѥ Ñтраницѧ',
'helppage' => 'Help:Каталогъ',
'mainpage' => 'главьна Ñтраница',
'mainpage-description' => 'главьна Ñтраница',
@@ -302,8 +313,15 @@ $messages = array(
'welcomecreation-msg' => 'твоѥ польꙃєватєльÑко мѣÑто Ñътворєно Ñ¥ÑÑ‚ÑŠ â™
нꙑнѣ иê™Ð¼Ñ£Ð½Ð¸Ñ‚и [[Special:Preferences|{{GRAMMAR:genitive|{{SITENAME}}}} Ñтрои]] можєши',
'yourname' => 'твоѥ имѧ',
+'userlogin-yourname' => 'польꙃєватєлꙗ имѧ',
+'userlogin-yourname-ph' => 'твоѥ польꙃєватєлꙗ имѧ напьши',
'yourpassword' => 'таино Ñлово напиши',
+'userlogin-yourpassword' => 'таино Ñлово',
+'userlogin-yourpassword-ph' => 'твоѥ таино Ñлово напьши',
+'createacct-yourpassword-ph' => 'таино Ñлово напьши',
'yourpasswordagain' => 'опакꙑ таиноѥ Ñлово напиши',
+'createacct-yourpasswordagain' => 'таина Ñлова оувѣрѥниѥ',
+'createacct-yourpasswordagain-ph' => 'опакꙑ жє таино Ñлово напьши',
'login' => 'въниди',
'nav-login-createaccount' => 'въниди / ÑÑŠê™Ð¸Ð¶Ð´Ð¸ Ñи мѣÑто',
'userlogin' => 'въниди / ÑÑŠê™Ð¸Ð¶Ð´Ð¸ Ñи мѣÑто',
@@ -315,10 +333,17 @@ $messages = array(
'createaccount' => 'ÑÑŠê™Ð¸Ð¶Ð´Ð¸ Ñи мѣÑто',
'gotaccount' => 'мѣÑто ти Ñ¥ÑÑ‚ÑŠ ли? $1',
'gotaccountlink' => 'въниди',
+'helplogin-url' => 'Help:Въниждѥниѥ',
'createaccountreason' => 'какъ ÑъмꙑÑлъ :',
+'createacct-reason' => 'какъ ÑъмꙑÑлъ',
+'createacct-submit' => 'ÑÑŠê™Ð¸Ð¶Ð´Ð¸ Ñи мѣÑто',
+'createacct-benefit-heading' => '{{SITENAME}} ÑÑŠê™ÑŒÐ´Ð°Ñ¥Ñ‚ÑŠ Ñѧ чьловѣкꙑ · ижє ꙗко тꙑ ÑÑ«Ñ‚ÑŠ',
+'createacct-benefit-body1' => '{{PLURAL:$1|мѣна|мѣнꙑ|мѣнъ}}',
+'createacct-benefit-body2' => '{{PLURAL:$1|Ñтраница|Ñтраници|Ñтраницѧ}}',
'userexists' => 'Ñѫщє польꙃєватєлꙗ имѧ пьÑа â™
бѫди добръ · ино ÑÑ¥ иê™Ð¾Ð±Ñ€Ñ§Ñ‰Ð¸',
'loginerror' => 'въхода блаê™Ð½Ð°',
+'createacct-error' => 'мѣÑта Ñътворѥниꙗ блаê™Ð½Ð°',
'loginsuccess' => "'''нꙑнѣ тꙑ {{GENDER|въшьлъ|въшьла}} въ {{grammar:locative|{{SITENAME}}}} подь имьньмъ â– $1 â–.'''",
'mailmypassword' => 'поÑъли ново таино Ñлово',
'accountcreated' => 'мѣÑто Ñътворєно Ñ¥ÑÑ‚ÑŠ',
@@ -382,6 +407,7 @@ $messages = array(
'template-protected' => '(ê™Ð°Ð±Ñ€Ð°Ð½Ñ”но Ñ¥ÑÑ‚ÑŠ)',
'template-semiprotected' => '(чѧÑтьно ê™Ð°Ð±Ñ€Ð°Ð½Ñ¥Ð½Ð¾)',
'hiddencategories' => 'Ñê™— Ñтраница въ {{PLURAL:$1|1 Ñъкрꙑтѣи катигорїи|$1 Ñъкрꙑтѣхъ катигорїѩ}} Ñѧ авлꙗѥтъ :',
+'postedit-confirmation' => 'твоꙗ мѣна Ñъхранѥна Ñ¥ÑÑ‚ÑŠ',
# History pages
'viewpagelogs' => 'Ñи Ñтраницѧ Ñ—Ñторїѩ',
@@ -423,7 +449,6 @@ $messages = array(
'viewprevnext' => 'виждь ($1 {{int:pipe-separator}} $2) ($3)',
'searchmenu-exists' => "'''Ñтраница имєньмь â– [[:$1]] ■ѥÑÑ‚ÑŠ Ñтворѥна ÑŽ'''",
'searchmenu-new' => "'''Ñтраницѫ â– [[:$1]] â– Ñътворити можєши'''",
-'searchhelp-url' => 'Help:Каталогъ',
'searchprofile-articles' => 'члѣни',
'searchprofile-project' => 'опꙑтьÑтвовании и помощи Ñтраницѧ',
'searchprofile-images' => 'дѣла',
@@ -623,9 +648,6 @@ $messages = array(
'statistics-files' => 'положєнꙑ дѣла',
'statistics-users-active' => 'дѣꙗтєльнꙑ польꙃєватєлє',
-'disambiguations' => 'Ñтраницѧ ижє Ñъвѧê™Ð¸ ÑÑŠ мъногоÑъмꙑÑлиꙗ имѫтъ',
-'disambiguationspage' => 'Template:мъногоÑъмꙑÑлиѥ',
-
'brokenredirects-edit' => 'иÑправи',
'brokenredirects-delete' => 'поничьжєниѥ',
@@ -876,7 +898,17 @@ $messages = array(
'showhidebots' => '($1 аѵтоматъ)',
'ilsubmit' => 'ищи',
-# EXIF tags
+# Human-readable timestamps
+'monday-at' => 'понєдѣл҄ьникъ · $1',
+'tuesday-at' => 'въторьникъ · $1',
+'wednesday-at' => 'Ñрѣда · $1',
+'thursday-at' => 'чєтврьтъкъ · $1',
+'friday-at' => 'пѧтъкъ · $1',
+'saturday-at' => 'Ñѫбота · $1',
+'sunday-at' => 'нєдѣлꙗ · $1',
+'yesterday-at' => 'вьчєра · $1',
+
+# Exif tags
'exif-artist' => 'творьць',
'exif-languagecode' => 'Ñ©ê™ê™‘къ',
'exif-iimcategory' => 'катигорїꙗ',
@@ -928,8 +960,9 @@ $messages = array(
'version-license' => 'прощєниѥ',
'version-software-version' => 'обраê™ÑŠ',
-# Special:FilePath
-'filepath-page' => 'дѣло :',
+# Special:Redirect
+'redirect-submit' => 'прѣиди',
+'redirect-file' => 'дѣла имѧ',
# Special:FileDuplicateSearch
'fileduplicatesearch-filename' => 'дѣла имѧ :',
@@ -945,6 +978,10 @@ $messages = array(
# Database error messages
'dberr-header' => 'Вики тєхнїчьнꙑ отѧжєниꙗ имѣтъ',
+# HTML forms
+'htmlform-no' => 'нѣтъ',
+'htmlform-yes' => 'да',
+
# New logging system
'logentry-delete-delete' => '$1 {{GENDER:$2|поничьжилъ|поничьжила}} Ñтраницѫ â– $3 â–',
'logentry-move-move' => '$1 {{GENDER:$2|нарєчє}} Ñтраницѫ â– $3 ■имєньмь â– $4 â–',
diff --git a/languages/messages/MessagesCv.php b/languages/messages/MessagesCv.php
index aca61206..0bbb896f 100644
--- a/languages/messages/MessagesCv.php
+++ b/languages/messages/MessagesCv.php
@@ -72,9 +72,6 @@ $messages = array(
'tog-shownumberswatching' => 'Страницăна миçе хутшăнакан Ñăнав ÑпиÑокне кĕртнине кăтартмалла',
'tog-oldsig' => 'Хальхи алӑ пуÑни:',
'tog-fancysig' => 'Хăвăр тунă алă пуÑнин вики-паллиÑем',
-'tog-externaleditor' => 'Палăртман чухне тулашри редактора уÑă курмалла',
-'tog-externaldiff' => 'Палăртман чухне верÑиÑене танлаштарма тулашри программăна уÑă курмалла',
-'tog-showjumplinks' => '«... патне куç» хушма каçăÑене уÑă курмалла',
'tog-uselivepreview' => 'Хăвăрт кăтартакан малтанхи курăнăва уÑă курмалла (JavaScript, ÑкÑпериментлă)',
'tog-forceeditsummary' => 'ТӳрлетӳÑен кĕÑке ăнлантарăвне кăтартман чухне аÑăрхаттармалла',
'tog-watchlisthideown' => 'Сăнав ÑпиÑокĕнче Ñпĕ тунă тӳрлетӳÑене кăтартмалла мар',
@@ -156,7 +153,7 @@ $messages = array(
'category-file-count-limited' => 'Ку категоринче $1 файл.',
'listingcontinuesabbrev' => '(малалли)',
-'linkprefix' => '/^(.*?)([a-zA-Z\\x80-\\xff«"]+)$/sD',
+'linkprefix' => '/^((?>.*(?<![a-zA-Z\\x80-\\xff«"])))(.+)$/sD',
'about' => 'Ăнлантаркăч',
'article' => 'СтатьÑ',
@@ -244,7 +241,7 @@ $messages = array(
'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).
+# 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).
'aboutsite' => '{{SITENAME}} çинчен',
'aboutpage' => 'Project:çинчен',
'copyright' => 'Ку ăшлăх $1 килĕшӳллĕн Ñарăлать.',
@@ -254,7 +251,6 @@ $messages = array(
'disclaimers' => 'Яваплăха тивĕçтерменни',
'disclaimerpage' => 'Project:Яваплăха тивĕçтерменни',
'edithelp' => 'УлшăнуÑене кĕртме пулăшакан пулăшу',
-'edithelppage' => 'Help:УлшăнуÑене кĕртме пулăшакан пулăшу',
'helppage' => 'Help:Пулăшу',
'mainpage' => 'Тĕп Ñтраница',
'mainpage-description' => 'Тĕп Ñтраницă',
@@ -318,16 +314,6 @@ $messages = array(
# General errors
'error' => 'Йăнăш',
'databaseerror' => 'Пĕлĕм пуххин йăнăшĕ',
-'dberrortext' => 'Пĕлĕм пуххине Ñнă ыйтăвĕнче ÑинтакÑÐ¸Ñ Ð¹ÄƒÐ½ÄƒÑˆÄ• пур.
-Пĕлĕм пуххине Ñнă юлашки ыйту:
-<blockquote><tt>$1</tt></blockquote>
-<tt>«$2»</tt> функци ыйтнă.
-MySQL çак йăнăша тавăрнă <tt>«$3: $4»</tt>.',
-'dberrortextcl' => 'Пĕлĕм пуххине Ñнă ыйтăвĕнче ÑинтакÑÐ¸Ñ Ð¹ÄƒÐ½ÄƒÑˆÄ• пур.
-Пĕлĕм пуххине Ñнă юлашки ыйту:
-«$1»
-«$2» функци ыйтнă.
-MySQL çак йăнăша тавăрнă «$3: $4».',
'laggedslavemode' => 'ÐÑăрхăр! Страница çинче юлашки улшăнуÑене кăтартмаÑăр пултарнă.',
'readonly' => 'Пĕлĕм пуххине çыраÑÑине чарÑа хунă',
'enterlockreason' => 'Чарнин Ñăлтавне тата палăртнă вăхăта кăтартăр.',
@@ -368,7 +354,6 @@ $1',
'protectedpagetext' => 'Ку Ñтраницăна тӳрлетме май çук, хӳтĕленĕ.',
'viewsourcetext' => 'ЭÑир ку Ñтраницăн малтанхи текÑтне пăхма тата копилеме пултаратăр:',
'protectedinterface' => "Ку Ñтраница çинче MediaWiki'н ÑиÑтемлă çырăвĕ вырнаçнă, ăна проект админиÑтраторĕÑем çеç улăштарма пултараççĕ.",
-'sqlhidden' => '(SQL ыйтăва пытарнă)',
'namespaceprotected' => 'Сирĕн «$1» ÑÑ‚ уçлăхĕнчи ÑтатьÑÑене тӳрлетмелли май çук..',
'ns-specialprotected' => '«{{ns:special}}» ÑÑ‚ уçлăхĕнчи ÑтраницăÑене ÑÑир тӳрлетеймеÑÑ‚Ä•Ñ€.',
'titleprotected' => "Ку Ñтлă Ñтраницăна хатĕрлеÑÑине [[Хутшăнакан:$1|$1]] хутшăнакан чарÑа хунă.
@@ -581,16 +566,12 @@ $1 хутшăнакан патне, е ытти [[{{MediaWiki:Grouppage-sysop}}|
'textmatches' => 'СтатьÑÑенчи текÑÑ‚ пĕрпеклĕхĕ',
'prevn' => 'малтанхи {{PLURAL:$1|$1}}',
'nextn' => 'малалли {{PLURAL:$1|$1}}',
-'searchhelp-url' => 'Help:Пулăшу',
'search-result-size' => '$1 ({{PLURAL:$2|1 Ñăмах|$2 Ñăмах}})',
'showingresults' => 'ÐÑларах ÑÑир <b>#$2</b> пуçлаÑа кăтартнă <b>$1</b> йĕркене куратăр.',
'showingresultsheader' => "{{PLURAL:$5|Результат '''$1''' '''$3''' хушшинчен|РезультатÑем'''$1 - $2''' '''$3''' хушшинчен}} '''$4''' валли",
'powersearch' => 'Ðнлă шырав',
'powersearch-legend' => 'Ðнлă шырав',
-# Quickbar
-'qbsettings' => 'Ðавигаци хăми',
-
# Preferences page
'preferences' => 'ĔнерлевÑем',
'mypreferences' => 'Ман ĕнерлевÑем',
@@ -797,12 +778,6 @@ $1 хутшăнакан патне, е ытти [[{{MediaWiki:Grouppage-sysop}}|
'statistics-header-users' => 'ХутшăнаканÑен ÑтатиÑтики',
'statistics-mostpopular' => 'Чи нумай пăхакан ÑтраницăÑем',
-'disambiguations' => 'Ðумай пĕлтерĕшлĕ ÑтатьÑÑене кăтартакан ÑтраницăÑем',
-'disambiguationspage' => 'Template:Disambig',
-'disambiguations-text' => "Çак ÑтатьÑÑем '''нумай пĕлтерĕшле ÑтраницăÑем'''çине куçараççĕ.
-Унта ÐºÑƒÃ§Ð°Ñ€Ð°Ñ Ð²Ñ‹Ñ€ÄƒÐ½Ð½Ðµ вĕÑем кирлĕ ÑтраницăÑем çине куçармалла пулĕ.<br />
-Енчен те Ñтраница çинче [[MediaWiki:Disambiguationspage]] Ñтраницăра кăтартнă шаблон Ñтне вырнаçтарнă пулÑан вăл нумай пĕлтерĕшлĕ Ñтраница шутланать.",
-
'doubleredirects' => 'Икĕ хут куçараканÑем',
'brokenredirects' => 'Татăк куçару ÑтранициÑем',
@@ -1129,7 +1104,7 @@ Also see [[Special:WantedCategories|wanted categories]].',
# Metadata
'metadata' => 'МетаданнăйÑем:',
-# EXIF tags
+# Exif tags
'exif-exifversion' => 'Exif верÑийĕ',
'exif-flashpixversion' => 'Ĕçлеме пултаракан FlashPix верÑийĕ',
'exif-gpsversionid' => 'GPS-информаци блокĕн верÑийĕ',
@@ -1194,10 +1169,6 @@ Also see [[Special:WantedCategories|wanted categories]].',
# Special:Version
'version' => 'MediaWiki верÑийĕ',
-# Special:FilePath
-'filepath' => 'Файл çулĕ',
-'filepath-submit' => 'Çул',
-
# Special:FileDuplicateSearch
'fileduplicatesearch' => 'Пĕр пек файлÑен шыравĕ',
'fileduplicatesearch-legend' => 'ДубликатÑен шыравĕ',
diff --git a/languages/messages/MessagesCy.php b/languages/messages/MessagesCy.php
index 7ca2a513..e7c38184 100644
--- a/languages/messages/MessagesCy.php
+++ b/languages/messages/MessagesCy.php
@@ -147,9 +147,6 @@ $messages = array(
'tog-shownumberswatching' => "Dangos y nifer o ddefnyddwyr sy'n gwylio",
'tog-oldsig' => 'Y llofnod cyfredol:',
'tog-fancysig' => 'Trin y llofnod fel testun wici (heb gyswllt wici awtomatig)',
-'tog-externaleditor' => 'Defnyddio golygydd allanol trwy ragosodiad (ar gyfer arbenigwyr yn unig; mae arno angen gosodiadau arbennig ar eich cyfrifiadur. [//www.mediawiki.org/wiki/Manual:External_editors Rhagor o wybodaeth.])',
-'tog-externaldiff' => 'Defnyddio "external diff" trwy ragosodiad (ar gyfer arbenigwyr yn unig; mae arno angen gosodiadau arbennig ar eich cyfrifiadur. [//www.mediawiki.org/wiki/Manual:External_editors Rhagor o wybodaeth.])',
-'tog-showjumplinks' => 'Galluogi dolenni hygyrchedd "neidio i"',
'tog-uselivepreview' => 'Defnyddio rhagolwg byw (arbrofol)',
'tog-forceeditsummary' => 'Tynnu fy sylw pan adawaf flwch crynodeb golygu yn wag',
'tog-watchlisthideown' => 'Cuddio fy ngolygiadau fy hunan yn fy rhestr wylio',
@@ -162,6 +159,8 @@ $messages = array(
'tog-diffonly' => "Peidio â dangos cynnwys y dudalen islaw'r gymhariaeth ar dudalennau cymharu",
'tog-showhiddencats' => 'Dangos categorïau cuddiedig',
'tog-norollbackdiff' => 'Hepgor dangos cymhariaeth ar ôl gwrthdroi golygiad',
+'tog-useeditwarning' => "Tynnwch fy sylw pan wyf ar fin gadael tudalen olygu heb roi'r newidiadau ar gadw",
+'tog-prefershttps' => 'Defnyddio cysylltiad diogel bob amser tra fy mod wedi mewngofnodi',
'underline-always' => 'Bob amser',
'underline-never' => 'Byth',
@@ -225,6 +224,18 @@ $messages = array(
'oct' => 'Hyd',
'nov' => 'Tach',
'dec' => 'Rhag',
+'january-date' => '$1 Ionawr',
+'february-date' => '$1 Chwefror',
+'march-date' => '$1 Mawrth',
+'april-date' => '$1 Ebrill',
+'may-date' => '$1 Mai',
+'june-date' => '$1 Mehefin',
+'july-date' => '$1 Gorffennaf',
+'august-date' => '$1 Awst',
+'september-date' => '$1 Medi',
+'october-date' => '$1 Hydref',
+'november-date' => '$1 Tachwedd',
+'december-date' => '$1 Rhagfyr',
# Categories related messages
'pagecategories' => '{{PLURAL:$1|Categori|Categori|Categorïau|Categorïau|Categorïau|Categorïau}}',
@@ -306,6 +317,7 @@ $messages = array(
'create-this-page' => "Creu'r dudalen",
'delete' => 'Dileu',
'deletethispage' => 'Dileer y dudalen hon',
+'undeletethispage' => 'Adfer y dudalen hon',
'undelete_short' => 'Adfer $1 {{PLURAL:$1|golygiad|golygiad|olygiad|golygiad}}',
'viewdeleted_short' => "Edrych ar y {{PLURAL:$1|golygiad sydd wedi'i ddileu|golygiad sydd wedi'i ddileu|$1 olygiad sydd wedi'u dileu|$1 golygiad sydd wedi'u dileu|$1 golygiad sydd wedi'u dileu|$1 golygiad sydd wedi'u dileu}}",
'protect' => 'Diogelu',
@@ -349,7 +361,7 @@ $1',
'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).
+# 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).
'aboutsite' => 'Ynglŷn â {{SITENAME}}',
'aboutpage' => 'Project:Amdanom',
'copyright' => "Rhoddir y cynnwys ar gael ar delerau'r drwydded $1, heblaw ei fod wedi nodi'n wahanol.",
@@ -359,7 +371,6 @@ $1',
'disclaimers' => 'Gwadiadau',
'disclaimerpage' => 'Project:Gwadiad Cyffredinol',
'edithelp' => 'Help gyda golygu',
-'edithelppage' => 'Help:Golygu',
'helppage' => 'Help:Cymorth',
'mainpage' => 'Hafan',
'mainpage-description' => 'Hafan',
@@ -388,7 +399,7 @@ $1',
'youhavenewmessagesmulti' => 'Mae negeseuon newydd gennych ar $1',
'editsection' => 'golygu',
'editold' => 'golygu',
-'viewsourceold' => 'dangos y tarddiad',
+'viewsourceold' => 'dangos côd y dudalen',
'editlink' => 'golygu',
'viewsourcelink' => 'dangos côd y dudalen',
'editsectionhint' => "Golygu'r adran: $1",
@@ -436,17 +447,12 @@ Mae rhestr o'r tudalennau arbennig dilys i'w gael [[Special:SpecialPages|yma]]."
# General errors
'error' => 'Gwall',
'databaseerror' => 'Gwall databas',
-'dberrortext' => 'Mae gwall cystrawen ymholi wedi taro\'r gronfa ddata.
-Efallai fod gwall yn y meddalwedd.
-Y gofyniad diwethaf a ofynwyd i\'r gronfa ddata oedd:
-<blockquote><code>$1</code></blockquote>
-o\'r ffwythiant "<code>$2</code>".
-Rhoddwyd y côd gwall "<samp>$3: $4</samp>".',
-'dberrortextcl' => 'Mae gwall cystrawen wedi taro\'r databas.
-Y gofyniad olaf y trïodd y databas oedd:
-"$1"
-o\'r ffwythiant "$2".
-Rhoddwyd y côd gwall "$3: $4<".',
+'databaseerror-text' => "Cafwyd gwall wrth ymholi'r gronfa ddata.
+Efallai bod byg yn y meddalwedd.",
+'databaseerror-textcl' => "Cafwyd gwall wrth ymholi'r gronfa ddata.",
+'databaseerror-query' => 'Ymholiad: $1',
+'databaseerror-function' => 'Ffwythiant: $1',
+'databaseerror-error' => 'Gwall: $1',
'laggedslavemode' => "Rhybudd: hwyrach nad yw'r dudalen yn cynnwys diwygiadau diweddar.",
'readonly' => 'Databas ar glo',
'enterlockreason' => "Rhowch eglurhad dros gloi'r databas, ac amcangyfrif hyd at pa bryd y bydd y databas dan glo",
@@ -480,6 +486,7 @@ Efallai fod rhywun arall eisoes wedi'i dileu.",
'cannotdelete-title' => "Ni ellir dileu'r dudalen '$1'",
'delete-hook-aborted' => 'Terfynwyd y dilead cyn pryd gan fachyn.
Ni roddodd eglurhad.',
+'no-null-revision' => 'Ni lwyddwyd i wneud diwygiad newydd heb unrhyw newid ynddo, i\'r dudalen "$1"',
'badtitle' => 'Teitl gwael',
'badtitletext' => "Mae'r teitl a ofynnwyd amdano yn annilys, yn wag, neu cysylltu'n anghywir rhwng ieithoedd neu wicïau. Gall fod ynddo un nod neu ragor na ellir eu defnyddio mewn teitlau.",
'perfcached' => "Mae'r wybodaeth ganlynol yn gopi cadw; mae'n bosib nad y fersiwn diweddaraf ydyw. Cedwir hyd at {{PLURAL:$1||un canlyniad yn unig|ddau ganlyniad|dri canlyniad|$1 chanlyniad|$1 canlyniad}} yn y copi cadw.",
@@ -498,12 +505,15 @@ Ceisiwch eto ymhen rhai munudau.",
'viewyourtext' => "Cewch weld a copïo ffynhonnell ''eich golygiadau'' i'r dudalen hon:",
'protectedinterface' => "Testun ar gyfer rhyngwyneb y wici yw cynnwys y dudalen hon. Clowyd y dudalen er mwyn ei diogeli. Os am gyfieithu'r neges neu ei newid ym mhob wici yn hytrach nag yn hwn yn unig, defnyddiwch [//translatewiki.net/ translatewiki.net], y prosiect MediaWiki sy'n hyrwyddo'r gwaith cyfieithu.",
'editinginterface' => "'''Dalier sylw:''' Rydych yn golygu tudalen sy'n rhan o destun rhyngwyneb y meddalwedd. Bydd newidiadau i'r dudalen hon yn effeithio ar y rhyngwyneb a ddefnyddir ar y wici hwn yn unig. Os am gyfieithu'r neges rhagosodedig a ddefnyddir ar bob wici, ystyriwch ddefnyddio [//translatewiki.net/ translatewiki.net], sef y prosiect MediaWiki sy'n hyrwyddo creu rhyngwyneb amlieithog ar wicïau.",
-'sqlhidden' => '(cuddiwyd chwiliad SQL)',
'cascadeprotected' => "Diogelwyd y dudalen hon rhag ei newid, oherwydd ei bod wedi ei chynnwys yn y {{PLURAL:$1|dudalen ganlynol|dudalen ganlynol|tudalennau canlynol|tudalennau canlynol|tudalennau canlynol|tudalennau canlynol}}, a {{PLURAL:$1|honno yn ei thro wedi ei|honno yn ei thro wedi ei|rheiny yn eu tro wedi eu|rheiny yn eu tro wedi eu|rheiny yn eu tro wedi eu|rheiny yn eu tro wedi eu}} diogelu, a'r dewisiad 'sgydol' ynghynn:
$2",
'namespaceprotected' => "Nid oes caniatâd gennych i olygu tudalennau yn y parth '''$1'''.",
'customcssprotected' => "Nid oes caniatâd ganddoch i olygu'r dudalen CSS hon oherwydd bod gosodiadau personol defnyddiwr arall arno.",
'customjsprotected' => "Nid oes caniatâd ganddoch i olygu'r dudalen JavaScript hon oherwydd bod gosodiadau personol defnyddiwr arall arno.",
+'mycustomcssprotected' => "Does dim caniatad gennych i olygu'r dudalen CSS hon.",
+'mycustomjsprotected' => "Does dim caniatad gennych i olygu'r dudalen JavaScript hon.",
+'myprivateinfoprotected' => 'Nid oes caniatad gennych i olygu eich manylion personol preifat.',
+'mypreferencesprotected' => 'Nid oes caniatad gennych i olygu eich dewisiadau eich hunan.',
'ns-specialprotected' => 'Ni ellir golygu tudalennau arbennig.',
'titleprotected' => "Diogelwyd y teitl hwn rhag ei greu gan [[User:$1|$1]].
Rhoddwyd y rheswm hwn - ''$2''.",
@@ -527,10 +537,19 @@ Sylwer y bydd rhai tudalennau yn parhau i ymddangos fel ag yr oeddent pan oeddec
'welcomeuser' => 'Croeso, $1!',
'welcomecreation-msg' => 'Peidiwch ag anghofio newid eich [[Special:Preferences|{{SITENAME}} preferences]].',
'yourname' => 'Eich enw defnyddiwr:',
+'userlogin-yourname' => 'Enw Defnyddiwr',
+'userlogin-yourname-ph' => 'Rhowch eich enw defnyddiwr',
+'createacct-another-username-ph' => "Rhowch enw'r defnyddiwr",
'yourpassword' => 'Cyfrinair:',
+'userlogin-yourpassword' => 'Cyfrinair',
+'userlogin-yourpassword-ph' => 'Teipiwch eich cyfrinair',
+'createacct-yourpassword-ph' => 'Rhowch gyfrinair',
'yourpasswordagain' => 'Ail-deipiwch y cyfrinair:',
+'createacct-yourpasswordagain' => 'Gwirwch eich cyfrinair',
+'createacct-yourpasswordagain-ph' => 'Rhowch eich cyfrinair eto',
'remembermypassword' => "Y porwr hwn i gofio'r manylion mewngofnodi (am hyd at $1 {{PLURAL:$1||diwrnod|ddiwrnod|diwrnod}})",
-'securelogin-stick-https' => "Cadw'r cyswllt â HTTPS ar ôl mewngofnodi",
+'userlogin-remembermypassword' => "Cadw'r sesiwn yn fyw tan i mi allgofnodi",
+'userlogin-signwithsecure' => 'Defnyddio cysylltiad diogel',
'yourdomainname' => 'Eich parth:',
'password-change-forbidden' => 'Ni allwch newid cyfrineiriau ar y wici hwn.',
'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.",
@@ -539,21 +558,47 @@ Sylwer y bydd rhai tudalennau yn parhau i ymddangos fel ag yr oeddent pan oeddec
'loginprompt' => "Mae'n rhaid galluogi cwcis er mwyn mewngofnodi i {{SITENAME}}.",
'userlogin' => 'Mewngofnodi / creu cyfrif',
'userloginnocreate' => 'Mewngofnodi',
-'logout' => 'Allgofnodi',
+'logout' => 'Allgofnoder',
'userlogout' => 'Allgofnodi',
'notloggedin' => 'Nid ydych wedi mewngofnodi',
-'nologin' => "Dim cyfrif gennych? '''$1'''.",
+'userlogin-noaccount' => 'Dim cyfrif gennych?',
+'userlogin-joinproject' => 'Ymuno â {{SITENAME}}',
+'nologin' => 'Dim cyfrif gennych? $1.',
'nologinlink' => 'Crëwch gyfrif',
'createaccount' => 'Creu cyfrif newydd',
-'gotaccount' => "Oes cyfrif gennych eisoes? '''$1'''.",
-'gotaccountlink' => 'Mewngofnodwch',
+'gotaccount' => 'Oes cyfrif gennych eisoes? $1.',
+'gotaccountlink' => 'Mewngofnodi',
'userlogin-resetlink' => 'Ydych chi wedi anghofio eich manylion mewngofnodi?',
+'userlogin-resetpassword-link' => 'Ailosod eich cyfrinair',
+'helplogin-url' => 'Help:Mewngofnodi',
+'userlogin-helplink' => '[[{{MediaWiki:helplogin-url}}|Cymorth i fewngofnodi]]',
+'userlogin-loggedin' => 'Rydych eisoes wedi mewngofnodi wrth yr enw {{GENDER:$1|$1}}.
+Defnyddiwch y ffurflen isod i fewngofnodi wrth rhyw enw arall.',
+'userlogin-createanother' => 'Creu cyfrif ychwanegol',
+'createacct-join' => 'Rhowch eich manylion isod',
+'createacct-another-join' => 'Rhowch fanylion y cyfrif newydd isod.',
+'createacct-emailrequired' => 'Cyfeiriad ebost',
+'createacct-emailoptional' => 'Cyfeiriad ebost (dewisol)',
+'createacct-email-ph' => 'Rhowch eich cyfeiriad ebost',
+'createacct-another-email-ph' => 'Rhowch y cyfeiriad e-bost',
'createaccountmail' => "Defnyddio cyfrinair ar hap dros dro a'i anfon i'r cyfeiriad e-bost a roddwyd",
+'createacct-realname' => 'Enw cywir (dewisiol)',
'createaccountreason' => 'Rheswm:',
+'createacct-reason' => 'Rheswm',
+'createacct-reason-ph' => 'Pam ydych yn creu cyfrif arall?',
+'createacct-captcha' => 'Gwiriad diogelwch',
+'createacct-imgcaptcha-ph' => 'Nodwch y testun a welwch uchod',
+'createacct-submit' => 'Creer y cyfrif',
+'createacct-another-submit' => 'Creer y cyfrif ychwanegol',
+'createacct-benefit-heading' => 'Ffrwyth llafur pobl fel chi yw {{SITENAME}}.',
+'createacct-benefit-body1' => '{{PLURAL:$1|golygiad|golygiad|olygiad|golygiad}}',
+'createacct-benefit-body2' => '{{PLURAL:$1|tudalen|dudalen|dudalen|tudalen|thudalen|tudalen}}',
+'createacct-benefit-body3' => "{{PLURAL:$1|cyfranwyr yn|wedi cyfrannu'n}} ddiweddar",
'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',
+'createacct-error' => 'Nam wrth greu cyfrif',
'createaccounterror' => "Ni lwyddwyd i greu'r cyfrif: $1",
'nocookiesnew' => "Mae'r cyfrif defnyddiwr wedi cael ei greu, ond nid ydych wedi mewngofnodi. Mae {{SITENAME}} yn defnyddio cwcis wrth i ddefnyddwyr fewngofnodi. Rydych chi wedi analluogi cwcis. Mewngofnodwch eto gyda'ch enw defnyddiwr a'ch cyfrinair newydd os gwelwch yn dda, ar ôl galluogi cwcis.",
'nocookieslogin' => 'Mae {{SITENAME}} yn defnyddio cwcis wrth i ddefnyddwyr fewngofnodi. Rydych chi wedi analluogi cwcis. Trïwch eto os gwelwch yn dda, ar ôl galluogi cwcis.',
@@ -604,11 +649,13 @@ Felly ni chaiff defnyddwyr sy'n defnyddio'r cyfeiriad IP hwn greu rhagor o gyfri
Rhydd ichi anwybyddu\'r neges hon os mai camgymeriad oedd creu\'r cyfrif.',
'usernamehasherror' => 'Ni all enw defnyddiwr gynnwys symbolau stwnsh',
-'login-throttled' => 'Rydych wedi ceisio mewngofnodi gormod o weithiau ar unwaith.
-Oedwch ychydig cyn mentro eto.',
+'login-throttled' => 'Rydych wedi ceisio mewngofnodi gormod o weithiau ar ben ei gilydd.
+Oedwch $1 cyn mentro eto.',
'login-abort-generic' => 'Ni lwyddodd y mewngofnodi - Rhoddwyd y gorau iddo',
'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.',
+'createacct-another-realname-tip' => "Gallwch ddewis roi eich enw go iawn.
+Os y gwnewch, fe gaiff yr enw go iawn ei defnyddio wrth dadogi'ch gwaith.",
# Email sending
'php-mail-error-unknown' => 'Gwall anhysbys yng ngweithrediad post() PHP',
@@ -624,8 +671,7 @@ Er mwyn cwblhau'r mewngofnodi, rhaid i chi osod cyfrinair newydd fel hyn:",
'newpassword' => 'Cyfrinair newydd:',
'retypenew' => 'Ail-deipiwch y cyfrinair newydd:',
'resetpass_submit' => 'Gosod y cyfrinair a mewngofnodi',
-'resetpass_success' => "Llwyddodd y newid i'ch cyfrinair!
-Wrthi'n eich mewngofnodi...",
+'changepassword-success' => "Llwyddodd y newid i'ch cyfrinair!",
'resetpass_forbidden' => 'Ni ellir newid cyfrineiriau',
'resetpass-no-info' => 'Ni allwch fynd at y dudalen hon yn uniongyrchol heblaw eich bod wedi mewngofnodi.',
'resetpass-submit-loggedin' => 'Newidier y cyfrinair',
@@ -637,10 +683,11 @@ Gall fod eich bod wedi llwyddo newid eich cyfrinair eisoes neu eich bod wedi gof
# Special:PasswordReset
'passwordreset' => 'Ailosod cyfrinair',
-'passwordreset-text' => 'Cwblhewch y ffurflen hon er mwyn ailosod eich cyfrinair.',
+'passwordreset-text-one' => 'Cwblhewch y ffurflen hon er mwyn ailosod eich cyfrinair.',
+'passwordreset-text-many' => "{{PLURAL:$1|Llanwch un o'r blychau er mwyn ailosod eich cyfrinair.}}",
'passwordreset-legend' => 'Ailosod y cyfrinair',
'passwordreset-disabled' => 'Analluogwyd ailosod cyfrineiriau ar y wici hwn.',
-'passwordreset-pretext' => "{{PLURAL:$1|||Rhowch un o'r darnau o ddata isod|Rhowch un o'r darnau o ddata isod|Rhowch un o'r darnau o ddata isod|Rhowch un o'r darnau o ddata isod|Rhowch un o'r darnau o ddata isod}}",
+'passwordreset-emaildisabled' => 'Analluogwyd offer e-bost ar y wici hwn.',
'passwordreset-username' => 'Eich enw defnyddiwr:',
'passwordreset-domain' => 'Parth:',
'passwordreset-capture' => 'Gweld yr e-bost a gaiff ei anfon?',
@@ -663,7 +710,7 @@ Dylech fewngofnodi nawr a dewis cyfrinair newydd. Os mai rhywun arall a ofynodd
Y cyfrinair dros dro: $2",
'passwordreset-emailsent' => 'Anfonwyd e-bost i ailosod eich cyfrinair atoch.',
'passwordreset-emailsent-capture' => "Anfonwyd e-bost i ailosod cyfrinair, ac fe'i ddangosir isod.",
-'passwordreset-emailerror-capture' => "Lluniwyd e-bost atgoffa fel ag a welir isod, ond ni lwyddwyd i'w anfon at y defnyddiwr: $1",
+'passwordreset-emailerror-capture' => "Lluniwyd e-bost i ailosod cyfrinair fel ag a welir isod, ond ni lwyddwyd i'w anfon at y {{GENDER:$2|defnyddiwr}}: $1",
# Special:ChangeEmail
'changeemail' => 'Newid y cyfeiriad e-bost',
@@ -675,7 +722,20 @@ Y cyfrinair dros dro: $2",
'changeemail-none' => '(dim)',
'changeemail-password' => 'Eich cyfrinair ar {{SITENAME}}:',
'changeemail-submit' => 'Newidier y cyfeiriad e-bost',
-'changeemail-cancel' => 'Dileer',
+'changeemail-cancel' => 'Diddymer',
+
+# Special:ResetTokens
+'resettokens' => 'Ailosod tocynnau',
+'resettokens-text' => "Gallwch ailosod tocynnau sy'n galluogi mynediad at rai manylion preifat sydd ynghlwm wrth y cyfrif yma.
+
+Dylech wneud hyn os wnaethoch rannu'r manylion hyn gyda rhywun ar ddamwain neu os oes problem wedi codi gyda diogelwch eich cyfrif.",
+'resettokens-no-tokens' => "Nid oes unrhyw docynnau i'w hailosod.",
+'resettokens-legend' => 'Ailosod tocynnau',
+'resettokens-tokens' => 'Tocynnau:',
+'resettokens-token-label' => '$1 (gwerth presennol: $2)',
+'resettokens-watchlist-token' => "Tocyn i borthiant gwe (Atom/RSS) y [[Special:Watchlist|newidiadau i'r tudalennau ar eich rhestr wylio]]",
+'resettokens-done' => 'Ailosodwyd y tocynnau.',
+'resettokens-resetbutton' => 'Ailosoder y tocynnau a ddewiswyd',
# Edit page toolbar
'bold_sample' => 'Testun cryf',
@@ -867,12 +927,15 @@ Ni roddodd eglurhad.',
Ymddengys iddi gael ei dileu.",
'edit-conflict' => 'Cyd-ddigwyddiad golygu.',
'edit-no-change' => 'Anwybyddwyd eich golygiad, gan na newidiwyd y testun.',
+'postedit-confirmation' => 'Rhoddwyd eich golygiad ar gadw.',
'edit-already-exists' => 'Ni ellid creu tudalen newydd.
Mae ar gael yn barod.',
'defaultmessagetext' => 'Y testun rhagosodedig',
'content-failed-to-parse' => "Ni lwyddwyd i ddosrannu'r cynnwys sydd ar ffurf $2 yn ôl y model $1: $3",
'invalid-content-data' => "Data annilys i'r cynnwys",
'content-not-allowed-here' => 'Nid yw cynnwys ar ffurf "$1" yn cael ei ganiatau ar y dudalen [[$2]]',
+'editwarning-warning' => 'Os y gadewch y dudalen hon mae\'n bosib y collwch eich newidiadau iddi.
+Os ydych wedi mewngofnodi gallwch ddiddymu\'r rhybudd hwn yn yr adran "Golygu" yn eich dewisiadau.',
# Content models
'content-model-wikitext' => 'cystrawen wici',
@@ -907,6 +970,7 @@ Cafodd yr argiau hyn eu hepgor.",
'undo-failure' => 'Methwyd a dadwneud y golygiad oherwydd gwrthdaro â golygiadau cyfamserol.',
'undo-norev' => "Ni ellid dadwneud y golygiad oherwydd nad yw'n bod neu iddo gael ei ddileu.",
'undo-summary' => 'Dadwneud y golygiad $1 gan [[Special:Contributions/$2|$2]] ([[User talk:$2|Sgwrs]] | [[Special:Contributions/$2|{{MediaWiki:Contribslink}}]])',
+'undo-summary-username-hidden' => 'Dadwneud y golygiad $1 gan ddefnyddiwr cudd',
# Account creation failure
'cantcreateaccounttitle' => 'Yn methu creu cyfrif',
@@ -1086,6 +1150,7 @@ Pan yn gwneud hyn dylid sicrhau nad yw dilyniant hanes tudalennau yn cael ei ddi
'compareselectedversions' => 'Cymharer y fersiynau dewisedig',
'showhideselectedversions' => 'Dangos/cuddio y diwygiadau dewisedig',
'editundo' => 'dadwneud',
+'diff-empty' => '(Dim gwahaniaeth)',
'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}}.)',
'difference-missing-revision' => "Ni chafwyd hyd i $1 {{PLURAL:$2|diwygiad|diwygiad|ddiwygiad|diwygiad}} o'r gwahaniaeth ($1) {{PLURAL:$2|hwn}}.
@@ -1113,7 +1178,6 @@ Mae manylion pellach i'w cael yn [{{fullurl:{{#Special:Log}}/delete|page={{FULLP
'searchmenu-legend' => 'Dewisiadau chwilio',
'searchmenu-exists' => "'''Mae tudalen o'r enw \"[[\$1]]\" ar y wici hwn'''",
'searchmenu-new' => "'''Creu'r dudalen \"[[:\$1]]\" ar y wici hwn!'''",
-'searchhelp-url' => 'Help:Cymorth',
'searchmenu-prefix' => "[[Special:PrefixIndex/$1|Chwilio drwy tudalennau gyda'r rhagddodiad hwn]]",
'searchprofile-articles' => 'Tudalennau pwnc (erthyglau/ffeiliau)',
'searchprofile-project' => 'Tudalennau Cymorth a Phrosiect',
@@ -1156,15 +1220,7 @@ Mae manylion pellach i'w cael yn [{{fullurl:{{#Special:Log}}/delete|page={{FULLP
'searchdisabled' => "Mae'r teclyn chwilio ar {{SITENAME}} wedi'i analluogi dros dro.
Yn y cyfamser gallwch chwilio drwy Google.
Cofiwch y gall mynegeion Google o gynnwys {{SITENAME}} fod ar ei hôl hi.",
-
-# Quickbar
-'qbsettings' => 'Panel llywio',
-'qbsettings-none' => 'Dim',
-'qbsettings-fixedleft' => 'Sefydlog ar y chwith',
-'qbsettings-fixedright' => 'Sefydlog ar y dde',
-'qbsettings-floatingleft' => 'Yn arnofio ar y chwith',
-'qbsettings-floatingright' => 'Yn arnofio ar y dde',
-'qbsettings-directionality' => "Yn sefydlog, ar yr ochr o'r ddalen lle rydych yn dechrau ysgrifennu eich iaith",
+'search-error' => 'Cafwyd gwall wrth chwilio: $1',
# Preferences page
'preferences' => 'Dewisiadau',
@@ -1198,7 +1254,6 @@ Cofiwch y gall mynegeion Google o gynnwys {{SITENAME}} fod ar ei hôl hi.",
'resetprefs' => "Clirio'r darpar newidiadau",
'restoreprefs' => 'Adfer yr holl osodiadau diofyn (ymhob adran)',
'prefs-editing' => 'Golygu',
-'prefs-edit-boxsize' => 'Maint y blwch testun.',
'rows' => 'Rhesi:',
'columns' => 'Colofnau:',
'searchresultshead' => 'Chwilio',
@@ -1209,9 +1264,9 @@ Cofiwch y gall mynegeion Google o gynnwys {{SITENAME}} fod ar ei hôl hi.",
'recentchangesdays-max' => '(hyd at $1 {{PLURAL:$1||diwrnod|ddiwrnod|diwrnod|diwrnod|diwrnod}})',
'recentchangescount' => "Nifer y golygiadau i'w dangos yn ddiofyn:",
'prefs-help-recentchangescount' => 'Mae hwn yn cynnwys newidiadau diweddar, hanesion tudalennau, a logiau.',
-'prefs-help-watchlist-token' => "Gallwch gynhyrchu porthiant RSS ar gyfer eich rhestr wylio drwy osod allwedd gudd yn y blwch hwn.
-Gall unrhywun sy'n gwybod yr allwedd ddarllen eich rhestr wylio, felly gofalwch ddewis allwedd ddiogel.
-Dyma allwedd wedi ei chreu ar hap y gallwch ei defnyddio: $1",
+'prefs-help-watchlist-token2' => "Dyma'r tocyn cudd i borthiant gwe eich rhestr wylio.
+Bydd unrhyw un sy'n gwybod hwn yn gallu darllen eich rhestr wylio, felly peidiwch a'i roi i neb.
+[[Special:ResetTokens|Cliciwch fan hyn os oes angen ailosod y tocyn]].",
'savedprefs' => 'Mae eich dewisiadau wedi cael eu cadw.',
'timezonelegend' => 'Ardal amser:',
'localtime' => 'Amser lleol:',
@@ -1242,7 +1297,6 @@ Dyma allwedd wedi ei chreu ar hap y gallwch ei defnyddio: $1",
'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:",
-'prefs-textboxsize' => 'Maint y ffenestr olygu',
'youremail' => 'Eich cyfeiriad e-bost',
'username' => '{{GENDER:$1|Enw defnyddiwr}}:',
'uid' => '{{GENDER:$1|ID y defnyddiwr}}:',
@@ -1275,6 +1329,8 @@ Mae'r wybodaeth hon ar gael i'r cyhoedd.",
'prefs-dateformat' => 'Fformat dyddiad',
'prefs-timeoffset' => 'Atred amser',
'prefs-advancedediting' => 'Dewisiadau cyffredinol',
+'prefs-editor' => 'Golygydd',
+'prefs-preview' => 'Rhagolwg',
'prefs-advancedrc' => 'Dewisiadau uwch',
'prefs-advancedrendering' => 'Dewisiadau uwch',
'prefs-advancedsearchoptions' => 'Dewisiadau uwch',
@@ -1282,7 +1338,9 @@ Mae'r wybodaeth hon ar gael i'r cyhoedd.",
'prefs-displayrc' => 'Dewisiadau arddangos',
'prefs-displaysearchoptions' => 'Dewisiadau arddangos',
'prefs-displaywatchlist' => 'Dewisiadau arddangos',
+'prefs-tokenwatchlist' => 'Tocyn',
'prefs-diffs' => "Cymharu golygiadau ('gwahan')",
+'prefs-help-prefershttps' => "Bydd y dewis yma'n cael ei roi ar waith y tro nesaf i chi fewngofnodi.",
# User preference: email validation using jQuery
'email-address-validity-valid' => 'Y cyfeiriad e-bost yn ymddangos yn un dilys',
@@ -1309,6 +1367,8 @@ Mae'r wybodaeth hon ar gael i'r cyhoedd.",
'userrights-notallowed' => 'Nid oes ganiatâd priodol gennych i ychwanegu neu dynnu hawliau defnyddwyr.',
'userrights-changeable-col' => 'Grwpiau y gallwch eu newid',
'userrights-unchangeable-col' => 'Grwpiau na allwch eu newid',
+'userrights-conflict' => "Gwrthdaro oherwydd newid i hawliau defnyddiwr! Adolygwch eich newidiadau a'u cadarnhau.",
+'userrights-removed-self' => "Rydych wedi llwyddo rhoi'r gorau i'ch galluoedd. Gan hynny, nid ydych yn cael myned i'r dudalen hon bellach.",
# Groups
'group' => 'Grŵp:',
@@ -1374,11 +1434,19 @@ Mae'r wybodaeth hon ar gael i'r cyhoedd.",
'right-proxyunbannable' => 'Mynd heibio i flociau awtomatig gan weinyddion dirprwyol',
'right-unblockself' => 'Dad-flocio ei hunan',
'right-protect' => 'Newid lefelau diogelu a golygu tudalennau a sgydol-ddiogelwyd',
-'right-editprotected' => 'Golygu tudalennau sydd wedi eu diogelu (ond bod hebddynt ddiogelu sgydol)',
+'right-editprotected' => 'Golygu tudalennau sydd wedi eu diogelu ond mai "{{int:protect-level-sysop}}"',
+'right-editsemiprotected' => 'Golygu tudalennau sydd wedi eu diogelu, ond "{{int:protect-level-autoconfirmed}}"',
'right-editinterface' => "Golygu'r rhyngwyneb",
'right-editusercssjs' => 'Golygu ffeiliau CSS a JS yn perthyn i ddefnyddwyr eraill',
'right-editusercss' => 'Golygu ffeiliau CSS yn perthyn i ddefnyddwyr eraill',
'right-edituserjs' => 'Golygu ffeiliau JS yn perthyn i ddefnyddwyr eraill',
+'right-editmyusercss' => 'Golygu eich ffeiliau defnyddiwr CSS eich hunan.',
+'right-editmyuserjs' => 'Golygu eich ffeiliau defnyddiwr JavaScript eich hunan.',
+'right-viewmywatchlist' => 'Gweld eich rhestr wylio',
+'right-editmywatchlist' => 'Golygu eich rhestr wylio. Sylwer bod rhai gweithredoedd yn arwain at ychwanegu tudalennau hyd yn oed heb yr hawl hon.',
+'right-viewmyprivateinfo' => 'Gweld eich manylion personol preifat eich hunan (e.e. cyfeiriad ebost, enw cywir)',
+'right-editmyprivateinfo' => 'Golygu eich manylion personol preifat eich hunan (e.e. cyfeiriad ebost, enw cywir)',
+'right-editmyoptions' => 'Golygu eich dewisiadau',
'right-rollback' => 'Gwrthdroi golygiadau defnyddiwr diwethaf rhyw dudalen yn sydyn',
'right-markbotedits' => 'Marcio golygiadau wedi eu gwrthdroi yn olygiadau bot',
'right-noratelimit' => 'Bod heb gyfyngiad ar gyflymder eich gweithredoedd',
@@ -1440,12 +1508,19 @@ Mae'r wybodaeth hon ar gael i'r cyhoedd.",
'action-userrights-interwiki' => 'golygu galluoedd y defnyddwyr ar wicïau eraill',
'action-siteadmin' => "cloi neu ddatgloi'r databas",
'action-sendemail' => 'anfon e-bost',
+'action-editmywatchlist' => 'golygu eich rhestr wylio',
+'action-viewmywatchlist' => 'gweld eich rhestr wylio',
+'action-viewmyprivateinfo' => 'gweld eich manylion personol preifat',
+'action-editmyprivateinfo' => 'golygu eich manylion personol preifat',
# Recent changes
'nchanges' => '$1 {{PLURAL:$1|newid|newid|newid|newid|newid|o newidiadau}}',
+'enhancedrc-since-last-visit' => '$1 {{PLURAL:$1|ers eich ymweliad diwethaf}}',
+'enhancedrc-history' => 'hanes',
'recentchanges' => 'Newidiadau diweddar',
'recentchanges-legend' => "Dewisiadau'r newidiadau diweddar",
'recentchanges-summary' => "Dilynwch y newidiadau diweddaraf i'r wici ar y dudalen hon.",
+'recentchanges-noresult' => "Ni chafwyd unrhyw newidiadau yn ystod y cyfnod oedd yn cyfateb i'r gofyniad.",
'recentchanges-feed-description' => "Dilynwch y newidiadau diweddaraf i'r wici gyda'r porthiant hwn.",
'recentchanges-label-newpage' => 'Dechreuwyd tudalen newydd wrth olygu',
'recentchanges-label-minor' => 'Mân olygiad',
@@ -1482,7 +1557,6 @@ Mae'r wybodaeth hon ar gael i'r cyhoedd.",
'recentchangeslinked-feed' => 'Newidiadau perthnasol',
'recentchangeslinked-toolbox' => 'Newidiadau perthnasol',
'recentchangeslinked-title' => 'Newidiadau cysylltiedig â "$1"',
-'recentchangeslinked-noresult' => 'Ni chafwyd unrhyw newidiadau i dudalennau cysylltiedig yn ystod cyfnod yr ymholiad.',
'recentchangeslinked-summary' => "Mae'r dudalen arbennig hon yn dangos y newidiadau diweddaraf i'r tudalennau hynny y mae cyswllt yn arwain atynt ar y dudalen a enwir (neu newidiadau i dudalennau sy'n aelodau o'r categori a enwir). Dangosir tudalennau sydd ar [[Special:Watchlist|eich rhestr wylio]] mewn print '''trwm'''.",
'recentchangeslinked-page' => 'Tudalen:',
'recentchangeslinked-to' => "Dangos newidiadau i'r tudalennau â chyswllt arnynt sy'n arwain at y dudalen a enwir",
@@ -1493,7 +1567,7 @@ Mae'r wybodaeth hon ar gael i'r cyhoedd.",
'reuploaddesc' => "Dileu'r uwchlwytho a dychwelyd i'r ffurflen uwchlwytho",
'upload-tryagain' => "Uwchlwyther disgrifiad newydd o'r ffeil",
'uploadnologin' => 'Nid ydych wedi mewngofnodi',
-'uploadnologintext' => "Mae'n rhaid i chi [[Special:UserLogin|fewngofnodi]] er mwyn uwchlwytho ffeiliau.",
+'uploadnologintext' => "Mae'n rhaid $1 er mwyn uwchlwytho ffeiliau.",
'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",
@@ -1709,7 +1783,6 @@ Er mwyn sicrhau'r diogelwch gorau posib, analluogwyd img_auth.php.",
'http-read-error' => 'Cafwyd gwall wrth ddarllen yr HTTP.',
'http-timed-out' => 'Goroedi wedi digwydd ar y cais HTTP.',
'http-curl-error' => 'Cafwyd gwall wrth nôl yr URL: $1',
-'http-host-unreachable' => 'Wedi methu cyrraedd yr URL.',
'http-bad-status' => 'Cafwyd trafferth yn ystod y cais HTTP: $1 $2',
# Some likely curl errors. More could be added from <http://curl.haxx.se/libcurl/c/libcurl-errors.html>
@@ -1740,6 +1813,10 @@ Efallai yr hoffech rhoi cynnig arni ar adeg llai prysur.',
'listfiles_size' => 'Maint',
'listfiles_description' => 'Disgrifiad',
'listfiles_count' => 'Fersiynau',
+'listfiles-show-all' => "Cynnwys hen fersiynau o'r delweddau",
+'listfiles-latestversion' => 'Y fersiwn diweddaraf',
+'listfiles-latestversion-yes' => 'Ie',
+'listfiles-latestversion-no' => 'Na',
# File description page
'file-anchor-link' => 'Ffeil',
@@ -1836,6 +1913,13 @@ Cofiwch chwilio am gysylltiadau eraill at nodyn a'u hystyried cyn ei ddileu.",
'randompage' => 'Tudalen ar hap',
'randompage-nopages' => 'Does dim tudalennau yn y {{PLURAL:$2|parth hwn|parth hwn|parthau hyn|parthau hyn|parthau hyn|parthau hyn}}: $1.',
+# Random page in category
+'randomincategory' => "Tudalen ar hap o blith tudalennau'r categori",
+'randomincategory-invalidcategory' => 'Nid yw "$1" yn enw dilys i gategori.',
+'randomincategory-nopages' => 'Nid oes unrhyw dudalennau yn y categori [[:Category:$1]].',
+'randomincategory-selectcategory' => "Nôl tudalen ar hap o'r categori: $1 $2.",
+'randomincategory-selectcategory-submit' => 'Gwneler',
+
# Random redirect
'randomredirect' => 'Tudalen ailgyfeirio ar hap',
'randomredirect-nopages' => 'Does dim tudalennau ailgyfeirio yn y parth "$1".',
@@ -1861,16 +1945,13 @@ Cofiwch chwilio am gysylltiadau eraill at nodyn a'u hystyried cyn ei ddileu.",
'statistics-users-active-desc' => 'Defnyddwyr sydd wedi gweithredu unwaith neu ragor yn ystod y {{PLURAL:$1||diwrnod|deuddydd|tridiau|$1 diwrnod|$1 diwrnod}} diwethaf',
'statistics-mostpopular' => "Tudalennau sy'n derbyn ymweliad amlaf",
-'disambiguations' => "Tudalennau sy'n cysylltu â thudalennau gwahaniaethu",
-'disambiguationspage' => 'Template:Gwahaniaethu',
-'disambiguations-text' => "Mae'r tudalennau canlynol yn cynnwys un neu ragor o gysylltau, sydd yn arwain at '''dudalennau gwahaniaethu'''. Hwyrach y byddai'n hwylusach petai'r cyswllt yn arwain yn syth at y dudalen briodol.<br />
-Diffinir tudalen yn dudalen gwahaniaethu pan mae'n cynnwys un o'r nodiadau '[[MediaWiki:Disambiguationspage|tudalen gwahaniaethu]]'.",
-
'pageswithprop' => 'Tudalennau a chanddynt nodwedd arbennig',
'pageswithprop-legend' => 'Tudalennau a chanddynt nodwedd arbennig',
'pageswithprop-text' => "Mae'r dudalen hon yn rhestru tudalennau sydd yn defnyddio nodwedd arbennig yn y dudalen.",
'pageswithprop-prop' => "Enw'r nodwedd:",
'pageswithprop-submit' => 'Gwneler',
+'pageswithprop-prophidden-long' => 'gwerth priodwedd ar destun hir, a guddiwyd ($1)',
+'pageswithprop-prophidden-binary' => 'gwerth y briodwedd ddeuol, a guddiwyd ($1)',
'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.
@@ -1927,6 +2008,7 @@ Gosodwyd <del>llinell</del> drwy'r eitemau sydd eisoes wedi eu datrys.",
'mostrevisions' => 'Tudalennau yn nhrefn nifer y newidiadau iddynt',
'prefixindex' => 'Pob tudalen yn ôl parth',
'prefixindex-namespace' => 'Pob tudalen â rhagddodiad penodol (y parth $1)',
+'prefixindex-strip' => 'Diosg y rhagddodiad wrth restru',
'shortpages' => 'Erthyglau byr',
'longpages' => 'Tudalennau hirion',
'deadendpages' => 'Tudalennau heb gysylltiadau ynddynt',
@@ -1942,6 +2024,7 @@ Gosodwyd <del>llinell</del> drwy'r eitemau sydd eisoes wedi eu datrys.",
'listusers' => 'Rhestr defnyddwyr',
'listusers-editsonly' => 'Dangos y defnyddwyr hynny sydd wedi golygu rhywbeth yn unig',
'listusers-creationsort' => 'Trefnwch yn ôl dyddiad creu',
+'listusers-desc' => 'Trefnu gan ddisgyn',
'usereditcount' => '$1 {{PLURAL:$1|golygiad|golygiad|olygiad|golygiad|golygiad|o olygiadau}}',
'usercreated' => '{{GENDER:$3|Crëwyd}} ar $1 am $2',
'newpages' => 'Erthyglau newydd',
@@ -2120,10 +2203,9 @@ Pan fydd y dudalen hon, neu ei thudalen sgwrs, yn newid, fe fyddant yn ymddangos
'unwatchthispage' => 'Stopio gwylio',
'notanarticle' => 'Ddim yn erthygl/ffeil',
'notvisiblerev' => 'Y diwygiad wedi cael ei ddileu',
-'watchnochange' => "Ni olygwyd dim o'r erthyglau yr ydych yn cadw golwg arnynt yn ystod y cyfnod uchod.",
'watchlist-details' => '{{PLURAL:$1|Nid oes dim tudalennau|Mae $1 dudalen|Mae $1 dudalen|Mae $1 tudalen|Mae $1 thudalen|Mae $1 o dudalennau}} ar eich rhestr wylio, heb gynnwys tudalennau sgwrs.',
-'wlheader-enotif' => '*Galluogwyd hysbysiadau trwy e-bost.',
-'wlheader-showupdated' => "*Mae tudalennau sydd wedi newid ers i chi eu gweld ddiwethaf wedi'u '''hamlygu'''",
+'wlheader-enotif' => 'Galluogwyd hysbysiadau trwy e-bost.',
+'wlheader-showupdated' => "Mae tudalennau sydd wedi newid ers i chi eu gweld ddiwethaf wedi'u '''hamlygu'''.",
'watchmethod-recent' => "yn chwilio'r diwygiadau diweddar am dudalennau ar y rhestr wylio",
'watchmethod-list' => "yn chwilio'r tudalennau ar y rhestr wylio am ddiwygiadau diweddar",
'watchlistcontains' => '{{PLURAL:$1|Nid oes dim tudalennau|Mae $1 dudalen|Mae $1 dudalen|Mae $1 tudalen|Mae $1 thudalen|Mae $1 o dudalennau}} ar eich rhestr wylio.',
@@ -2371,7 +2453,7 @@ $1',
'contributions' => "{{GENDER:$1|Cyfraniadau'r defnyddiwr}}",
'contributions-title' => "Cyfraniadau'r defnyddiwr am $1",
'mycontris' => 'Cyfraniadau',
-'contribsub2' => 'Dros $1 ($2)',
+'contribsub2' => 'Gan {{GENDER:$3|$1}} ($2)',
'nocontribs' => "Heb ddod o hyd i newidiadau gyda'r meini prawf hyn.",
'uctop' => '(cyfredol)',
'month' => 'Cyfraniadau hyd at fis (ac yn gynharach):',
@@ -2529,14 +2611,12 @@ Gallwch weld rhestr y rhwystrau a'r gwaharddiadau sydd yn weithredol ar hyn o br
'ipb_blocked_as_range' => "Gwall: Nid yw'r cyfeiriad IP $1 wedi'n rwystro'n uniongyrchol ac felly ni ellir ei ddadrwystro. Wedi dweud hynny, y mae'n rhan o'r amrediad $2 sydd wedi'i rwystro; gellir dadrwystro'r amrediad.",
'ip_range_invalid' => 'Ystod IP annilys.',
'ip_range_toolarge' => "Ni chaniateir rhwystrau ystod sy'n fwy na /$1.",
-'blockme' => 'Rhwystro fi',
'proxyblocker' => 'Dirprwy-flociwr',
-'proxyblocker-disabled' => 'Analluogwyd y swyddogaeth hon.',
'proxyblockreason' => "Mae eich cyfeiriad IP wedi'i rwystro gan ei fod yn ddirprwy agored. Cysylltwch â'ch Cyflenwr Gwasanaeth Rhyngrwyd neu gymorth technegol er mwyn eu hysbysu am y broblem ddiogelwch ddifrifol yma.",
-'proxyblocksuccess' => 'Gwnaethpwyd.',
'sorbsreason' => 'Mae eich cyfeiriad IP wedi cael ei osod ymhlith y dirprwyon agored ar y Rhestr DNS Gwaharddedig a ddefnyddir gan {{SITENAME}}.',
'sorbs_create_account_reason' => 'Mae eich cyfeiriad IP wedi cael ei osod ymhlith y dirprwyon agored ar y Rhestr DNS Gwaharddedig a ddefnyddir gan {{SITENAME}}.
Ni allwch greu cyfrif',
+'xffblockreason' => "Mae un o'r cyfeiriadau IP yn y pennyn 'X-Forwarded-For' wedi cael ei atal; naill ai eich cyfeiriad chi neu un o'r gweinyddion dirprwyol a ddefnyddiwyd gennych. Y rheswm gwreiddiol dros atal oedd: $1",
'cant-block-while-blocked' => 'Ni allwch flocio defnyddwyr eraill tra bod rhwystr arnoch chithau.',
'cant-see-hidden-user' => "Mae'r defnyddiwr yr ydych yn ceisio'i rwystro wedi ei rwystro a'i guddio'n barod.
Gan nad yw'r gallu i guddio defnyddwyr gennych, ni allwch weld y rhwystr sydd ar y defnyddiwr na'i olygu.",
@@ -2701,6 +2781,8 @@ Os ydych am gyfrannu at y gwaith o gyfieithu ar gyfer holl prosiectau MediaWiki
'thumbnail-more' => 'Chwyddo',
'filemissing' => 'Ffeil yn eisiau',
'thumbnail_error' => "Cafwyd gwall wrth greu'r mân-lun: $1",
+'thumbnail_error_remote' => 'Neges am y gwall o $1:
+$2',
'djvu_page_error' => 'Y dudalen DjVu allan o amrediad',
'djvu_no_xml' => 'Ddim yn gallu mofyn XML ar gyfer ffeil DjVu',
'thumbnail-temp-create' => 'Wedi methu gwneud ffeil mân-lun dros dro',
@@ -2849,6 +2931,7 @@ Mae ffolder dros dro yn eisiau.',
Gellir ychwanegu rheswm dros y dadwneud yn y crynodeb.',
'tooltip-preferences-save' => 'Rhodder y dewisiadau ar gadw',
'tooltip-summary' => 'Rhowch grynodeb byr',
+'tooltip-iwiki' => '$1 - $2',
# Metadata
'notacceptable' => "Dydy gweinydd y wici ddim yn medru rhoi'r data mewn fformat darllenadwy i'ch cleient.",
@@ -2922,8 +3005,6 @@ Achos hyn yn fwy na thebyg yw presenoldeb cysylltiad i wefan ar y rhestr wahardd
'pageinfo-category-files' => 'Nifer y ffeiliau',
# Skin names
-'skinname-standard' => 'Safonol',
-'skinname-nostalgia' => 'Hiraeth',
'skinname-cologneblue' => 'Glas Cwlen',
# Patrolling
@@ -3004,11 +3085,25 @@ Mae'n bosib y bydd eich cyfrifiadur yn cael ei danseilio wrth ddefnyddio'r ffeil
'minutes' => '{{PLURAL:$1||$1 munud|$1 funud|$1 munud|$1 munud|$1 munud}}',
'hours' => '{{PLURAL:$1|$1 awr}}',
'days' => '{{PLURAL:$1||$1 diwrnod|$1 ddiwrnod|$1 diwrnod|$1 diwrnod|$1 diwrnod}}',
+'weeks' => '{{PLURAL:$1|$1 wythnos|$1 wythnosau}}',
'months' => '{{PLURAL:$1|$1 mis|mis|deufis|$1 mis}}',
'years' => '{{PLURAL:$1|$1 blwyddyn|blwyddyn|$1 flynedd|$1 blynedd|$1 blynedd|$1 mlynedd}}',
'ago' => '$1 yn ôl',
'just-now' => 'nawr',
+# Human-readable timestamps
+'hours-ago' => '$1 {{PLURAL:$1|awr}} yn ôl',
+'minutes-ago' => '$1 {{PLURAL:$1|munud|munud|funud|munud}} yn ôl',
+'seconds-ago' => '$1 {{PLURAL:$1|eiliad}} yn ôl',
+'monday-at' => 'Dydd Llun am $1',
+'tuesday-at' => 'Dydd Mawrth am $1',
+'wednesday-at' => 'Dydd Mercher am $1',
+'thursday-at' => 'Dydd Iau am $1',
+'friday-at' => 'Dydd Gwener am $1',
+'saturday-at' => 'Dydd Sadwrn am $1',
+'sunday-at' => 'Dydd Sul am $1',
+'yesterday-at' => 'Ddoe am $1',
+
# Bad image list
'bad_image_list' => "Dyma'r fformat:
@@ -3037,7 +3132,7 @@ Cuddir y meysydd eraill trwy ragosodiad.
* gpslongitude
* gpsaltitude",
-# EXIF tags
+# Exif tags
'exif-imagewidth' => 'Lled',
'exif-imagelength' => 'Uchder',
'exif-bitspersample' => 'Nifer y didau i bob cydran',
@@ -3215,7 +3310,7 @@ Cuddir y meysydd eraill trwy ragosodiad.
'exif-originalimageheight' => 'Uchder y ddelwedd cyn iddi gael ei thocio',
'exif-originalimagewidth' => 'Lled y ddelwedd cyn iddi gael ei thocio',
-# EXIF attributes
+# Exif attributes
'exif-compression-1' => 'Heb ei gywasgu',
'exif-compression-2' => 'Amgodio hyd rhediad Huffman Addasedig 1-Dimensiwn Grŵp 3 y CCITT',
'exif-compression-3' => 'Amgodio ffacs Grŵp 3 CCITT',
@@ -3594,7 +3689,6 @@ Gallwch hefyd [[Special:EditWatchlist|ddefnyddio\'r rhestr arferol]].',
'version-other' => 'Arall',
'version-mediahandlers' => 'Trinyddion cyfryngau',
'version-hooks' => 'Bachau',
-'version-extension-functions' => 'Ffwythiannau estyn',
'version-parser-extensiontags' => 'Tagiau estyn dosrannydd',
'version-parser-function-hooks' => 'Bachau ffwythiant dosrannu',
'version-hook-name' => "Enw'r bachyn",
@@ -3603,6 +3697,7 @@ Gallwch hefyd [[Special:EditWatchlist|ddefnyddio\'r rhestr arferol]].',
'version-license' => 'Trwydded',
'version-poweredby-credits' => "Mae'r wici hwn wedi'i nerthu gan '''[//www.mediawiki.org/ MediaWiki]''', hawlfraint © 2001 - $1 $2.",
'version-poweredby-others' => 'eraill',
+'version-poweredby-translators' => 'cyfieithwyr translatewiki.net',
'version-credits-summary' => 'Hoffem gydnabod cyfraniad y bobl canlynol i [[Special:Version|MediaWiki]].',
'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.
@@ -3616,12 +3711,17 @@ Dylech fod wedi derbyn [{{SERVER}}{{SCRIPTPATH}}/COPYING gopi o GNU General Publ
'version-entrypoints-header-entrypoint' => 'Man cyflwyno',
'version-entrypoints-header-url' => 'URL',
-# Special:FilePath
-'filepath' => 'Llwybr y ffeil',
-'filepath-page' => 'Ffeil:',
-'filepath-submit' => 'Eler',
-'filepath-summary' => "Mae'r dudalen arbennig hon yn adrodd llwybr ffeil yn gyfan.
-Dangosir delweddau ar eu maint llawn, dechreuir ffeiliau o fathau eraill yn uniongyrchol gan y rhaglen gysylltiedig.",
+# Special:Redirect
+'redirect' => 'Ailgyfeirio yn ôl enw ffeil, ID defnyddiwr neu ID diwygiad tudalen',
+'redirect-legend' => 'Ailgyfeirio i ffeil neu dudalen',
+'redirect-summary' => "Mae'r dudalen arbennig hon yn arwain at ffeil (o roi enw'r ffeil), at dudalen (o roi ID rhyw ddidwygiad o'r dudalen), neu at dudalen defnyddiwr (o roi rhif y defnyddiwr).",
+'redirect-submit' => 'Ati',
+'redirect-lookup' => 'Chwilio drwy:',
+'redirect-value' => 'Chwilio am:',
+'redirect-user' => 'ID defnyddwyr',
+'redirect-revision' => 'Rhifau diwygiadau tudalennau',
+'redirect-file' => 'Enwau ffeiliau',
+'redirect-not-exists' => "Heb lwyddo i'w ganfod",
# Special:FileDuplicateSearch
'fileduplicatesearch' => 'Chwilio am ffeiliau dyblyg',
@@ -3671,12 +3771,16 @@ Dangosir delweddau ar eu maint llawn, dechreuir ffeiliau o fathau eraill yn unio
'tags' => 'Tagiau newidiadau',
'tag-filter' => 'Hidl [[Special:Tags|tagiau]]:',
'tag-filter-submit' => 'Hidlo',
+'tag-list-wrapper' => '([[Special:Tags|{{PLURAL:$1|Tag|Tagiau}}]]: $2)',
'tags-title' => 'Tagiau',
'tags-intro' => "Dyma restr o'r tagiau y mae'r meddalwedd yn defnyddio i farcio golygiad, ynghyd â'r rhesymau dros eu defnyddio.",
'tags-tag' => "Enw'r tag",
'tags-display-header' => 'Y nodyn a welir ar logiau',
'tags-description-header' => 'Disgrifiad llawn y tag',
+'tags-active-header' => 'Yn weithredol?',
'tags-hitcount-header' => 'Nifer wedi tagio',
+'tags-active-yes' => 'Ydy',
+'tags-active-no' => 'Nacydy',
'tags-edit' => 'golygu',
'tags-hitcount' => '$1 {{PLURAL:$1|newid}}',
@@ -3697,6 +3801,7 @@ Dangosir delweddau ar eu maint llawn, dechreuir ffeiliau o fathau eraill yn unio
'dberr-problems' => "Mae'n ddrwg gennym! Mae'r wefan hon yn dioddef anawsterau technegol.",
'dberr-again' => 'Oedwch am ychydig funudau cyn ceisio ail-lwytho.',
'dberr-info' => '(Ni ellir cysylltu â gweinydd y bas data: $1)',
+'dberr-info-hidden' => '(Ni ellir cysylltu â gweinydd y gronfa ddata)',
'dberr-usegoogle' => 'Yn y cyfamser gallwch geisio chwilio gyda Google.',
'dberr-outofdate' => "Sylwch y gall eu mynegeion o'n cynnwys fod ar ei hôl hi.",
'dberr-cachederror' => "Dyma gopi o'r dudalen a ofynnwyd amdani, a dynnwyd o'r celc. Mae'n bosib nad y fersiwn diweddaraf yw'r copi hwn.",
@@ -3712,6 +3817,9 @@ Dangosir delweddau ar eu maint llawn, dechreuir ffeiliau o fathau eraill yn unio
'htmlform-submit' => 'Gosoder',
'htmlform-reset' => 'Datod y newidiadau',
'htmlform-selectorother-other' => 'Arall',
+'htmlform-no' => 'Na/Nac ydw/Na fydd...',
+'htmlform-yes' => 'Ie/Iawn/Ydw/Oes...',
+'htmlform-chosen-placeholder' => 'Dewiswch opsiwn',
# SQLite database support
'sqlite-has-fts' => '$1 gyda chymorth chwilio yr holl destun',
@@ -3828,4 +3936,19 @@ Dangosir delweddau ar eu maint llawn, dechreuir ffeiliau o fathau eraill yn unio
# Image rotation
'rotate-comment' => "Trowyd y llun $1 {{PLURAL:$1|gradd|radd|radd|gradd}} gyda'r cloc",
+# Limit report
+'limitreport-title' => 'Data proffil y dosrannwr:',
+'limitreport-cputime' => 'Defnydd amser CPU',
+'limitreport-cputime-value' => '$1 {{PLURAL:$1|eiliad}}',
+'limitreport-walltime' => 'Defnydd amser real',
+'limitreport-walltime-value' => '$1 {{PLURAL:$1|eiliad}}',
+'limitreport-ppvisitednodes' => "Rhif y nodau ar ymweliadau'r rhagbrosesydd",
+'limitreport-ppgeneratednodes' => 'Rhif y nodau a gynhyrchodd y rhagbrosesydd',
+'limitreport-postexpandincludesize' => 'Uchafswm maint y nodiadau ar ôl eu chwyddo',
+'limitreport-postexpandincludesize-value' => '$1/$2 {{PLURAL:$2|beit|beit|feit|beit}}',
+'limitreport-templateargumentsize' => 'Maint arg y nodyn',
+'limitreport-templateargumentsize-value' => '$1/$2 {{PLURAL:$2|beit|beit|feit|beit}}',
+'limitreport-expansiondepth' => 'Uchafswm dyfnder yr ehangu',
+'limitreport-expensivefunctioncount' => "Nifer y ffwythiannau dosrannu sy'n dreth ar adnoddau",
+
);
diff --git a/languages/messages/MessagesDa.php b/languages/messages/MessagesDa.php
index 3dec03f9..d0900898 100644
--- a/languages/messages/MessagesDa.php
+++ b/languages/messages/MessagesDa.php
@@ -42,6 +42,7 @@
* @author Qaqqalik
* @author Remember the dot
* @author Sarrus
+ * @author Simeondahl
* @author Sir48
* @author Slomox
* @author Steenth
@@ -222,9 +223,6 @@ $messages = array(
'tog-shownumberswatching' => 'Vis antal brugere, der overvåger',
'tog-oldsig' => 'Nuværende signatur:',
'tog-fancysig' => 'Behandl signatur som wikitekst uden automatisk henvisning',
-'tog-externaleditor' => 'Brug ekstern editor automatisk (kun for rutinerede brugere, da det kræver særlige indstillinger på din computer. [//www.mediawiki.org/wiki/Manual:External_editors Flere oplysninger.])',
-'tog-externaldiff' => 'Brug ekstern forskelsvisning automatisk (kun for rutinerede brugere, da det kræver særlige indstillinger på din computer. [//www.mediawiki.org/wiki/Manual:External_editors Flere oplysninger.])',
-'tog-showjumplinks' => 'Vis tilgængeligheds-henvisninger',
'tog-uselivepreview' => 'Brug automatisk forhåndsvisning (er på forsøgsstadiet)',
'tog-forceeditsummary' => 'Advar mig hvis jeg ikke udfylder beskrivelsesfeltet',
'tog-watchlisthideown' => 'Skjul egne ændringer i overvågningslisten',
@@ -238,6 +236,8 @@ $messages = array(
'tog-showhiddencats' => 'Vis skjulte kategorier',
'tog-noconvertlink' => 'Slå konvertering af sidetitler fra',
'tog-norollbackdiff' => 'Vis ikke forskel efter tilbagerulning',
+'tog-useeditwarning' => 'Advar mig, hvis jeg forlader en redigeringsside med ændringer, der ikke er gemt.',
+'tog-prefershttps' => 'Brug altid en sikker forbindelse, når du er logget ind',
'underline-always' => 'Altid',
'underline-never' => 'Aldrig',
@@ -301,6 +301,18 @@ $messages = array(
'oct' => 'okt',
'nov' => 'nov',
'dec' => 'dec',
+'january-date' => '$1. januar',
+'february-date' => '$1. februar',
+'march-date' => '$1. marts',
+'april-date' => '$1. april',
+'may-date' => '$1. maj',
+'june-date' => '$1. juni',
+'july-date' => '$1. juli',
+'august-date' => '$1. august',
+'september-date' => '$1. september',
+'october-date' => '$1. oktober',
+'november-date' => '$1. november',
+'december-date' => '$1. december',
# Categories related messages
'pagecategories' => '{{PLURAL:$1|Kategori|Kategorier}}',
@@ -382,6 +394,7 @@ $messages = array(
'create-this-page' => 'Opret denne side',
'delete' => 'Slet',
'deletethispage' => 'Slet side',
+'undeletethispage' => 'Gendan denne side',
'undelete_short' => 'Fortryd sletning af {{PLURAL:$1|én version|$1 versioner}}',
'viewdeleted_short' => 'Vis {{PLURAL:$1|en slettet redigering|$1 slettede redigeringer}}',
'protect' => 'Beskyt',
@@ -425,7 +438,7 @@ $1',
'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).
+# 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).
'aboutsite' => 'Om {{SITENAME}}',
'aboutpage' => 'Project:Om',
'copyright' => 'Indholdet er udgivet under $1 medmindre andet er angivet.',
@@ -435,7 +448,6 @@ $1',
'disclaimers' => 'Forbehold',
'disclaimerpage' => 'Project:Generelle forbehold',
'edithelp' => 'Hjælp til redigering',
-'edithelppage' => 'Help:Hvordan redigerer jeg en side',
'helppage' => 'Help:Hjælp',
'mainpage' => 'Forside',
'mainpage-description' => 'Forside',
@@ -511,17 +523,12 @@ En liste over gyldige specialsider findes på [[Special:SpecialPages|{{int:speci
# General errors
'error' => 'Fejl',
'databaseerror' => 'Databasefejl',
-'dberrortext' => 'Der er opstået en syntaksfejl i en databaseforespørgsel.
-Det kan tyde på en fejl i softwaren.
-Den sidst forsøgte databaseforespørgsel var:
-<blockquote><code>$1</code></blockquote>
-fra funktionen "<code>$2</code>".
-Databasen returnerede fejlen "<samp>$3: $4</samp>".',
-'dberrortextcl' => 'Der er opstået en syntaksfejl i en databaseforespørgsel.
-Den seneste forsøgte databaseforespørgsel var:
-"$1"
-fra funktionen "$2".
-Databasen returnerede fejlen "$3: $4"',
+'databaseerror-text' => 'Der opstod fejl i en forespørgsel til databasen.
+Dette kan indikere en fejl i softwaren.',
+'databaseerror-textcl' => 'Der opstod fejl i en forespørgsel til databasen.',
+'databaseerror-query' => 'Forespørgsel: $1',
+'databaseerror-function' => 'Funktion: $1',
+'databaseerror-error' => 'Fejl: $1',
'laggedslavemode' => "'''Bemærk:''' Den viste side indeholder muligvis ikke de nyeste ændringer.",
'readonly' => 'Databasen er skrivebeskyttet',
'enterlockreason' => 'Skriv en begrundelse for skrivebeskyttelsen, med samt en vurdering af, hvornår skrivebeskyttelsen ophæves igen',
@@ -555,6 +562,7 @@ Den kan være blevet slettet af en anden.',
'cannotdelete-title' => 'Kan ikke slette siden "$1"',
'delete-hook-aborted' => 'Sletningen blev afbrudt af en programfunktion.
Der var ikke nogen forklaring.',
+'no-null-revision' => 'Kunne ikke oprette nye tom revision for side "$1"',
'badtitle' => 'Forkert titel',
'badtitletext' => 'Den ønskede sides titel var ikke tilladt, tom eller siden er forkert henvist fra en {{SITENAME}} på et andet sprog.
Den kan indeholde et eller flere tegn, som ikke kan anvendes i titler.',
@@ -575,12 +583,15 @@ Forespørgsel: $2',
Hvis du vil tilføje eller ændre oversættelser til alle wiki-websteder, brug venligst [//translatewiki.net/ translatewiki.net], MediaWiki lokalisering projektet.',
'editinginterface' => "'''Advarsel:''' Du redigerer en side som bruges i programmets grænseflade. Ændringer på denne side vil påvirke udseendet af grænsefladen for andre brugere af denne wiki.
For at tilføje eller ændre oversættelser på alle wikier bedes du benytte [//translatewiki.net/ translatewiki.net], projektet for oversættelse af MediaWiki.",
-'sqlhidden' => '(SQL forespørgsel skjult)',
'cascadeprotected' => 'Denne side er skrivebeskyttet, da den er indeholdt i nedenstående {{PLURAL:$1|side|sider}}, som er skrivebeskyttet med tilvalg af "nedarvende sidebeskyttelse":
$2',
'namespaceprotected' => 'Du har ikke rettigheder til at redigere sider i $1-navnerummet.',
'customcssprotected' => 'Du har ikke tilladelse til at redigere denne CSS-side, da den indeholder en anden brugers personlige indstillinger.',
'customjsprotected' => 'Du har ikke tilladelse til at redigere denne JavaScript-side, da den indeholder en anden brugers personlige indstillinger.',
+'mycustomcssprotected' => 'Du har ikke rettigheder til at redigere denne CSS-side.',
+'mycustomjsprotected' => 'Du har ikke rettigheder til at redigere denne JavaScript-side.',
+'myprivateinfoprotected' => 'Du har ikke tilladelse til at redigere dine private oplysninger.',
+'mypreferencesprotected' => 'Du har ikke tilladelse til at redigere dine præferencer.',
'ns-specialprotected' => 'Sider i navnerummet {{ns:special}} kan ikke redigeres.',
'titleprotected' => "Dette sidenavn er beskyttet mod oprettelse af [[User:$1|$1]]. Begrundelsen for beskyttelsen er ''$2''.",
'filereadonlyerror' => 'Ude af stand til at redigere filen "$1", fordi fildatabasen "$2" er skrivebeskyttet.
@@ -604,10 +615,19 @@ Bemærk, at nogle sider stadigvæk kan vises som om du var logget på, indtil du
'welcomecreation-msg' => 'Din konto er blevet oprettet.
Glem ikke at ændre dine [[Special:Preferences|{{SITENAME}} indstillinger]].',
'yourname' => 'Dit brugernavn:',
+'userlogin-yourname' => 'Brugernavn',
+'userlogin-yourname-ph' => 'Indtast dit brugernavn',
+'createacct-another-username-ph' => 'Indtast Brugernavn',
'yourpassword' => 'Din adgangskode:',
+'userlogin-yourpassword' => 'Adgangskode',
+'userlogin-yourpassword-ph' => 'Indtast din adgangskode',
+'createacct-yourpassword-ph' => 'Indtast kodeord',
'yourpasswordagain' => 'Gentag adgangskode',
+'createacct-yourpasswordagain' => 'Bekræft kodeord',
+'createacct-yourpasswordagain-ph' => 'Indtast kodeord igen',
'remembermypassword' => 'Husk mit brugernavn i denne browser (højst $1 {{PLURAL:$1|dag|dage}})',
-'securelogin-stick-https' => 'Behold forbindelsen til HTTPS efter login',
+'userlogin-remembermypassword' => 'Husk mig',
+'userlogin-signwithsecure' => 'Brug sikker forbindelse',
'yourdomainname' => 'Dit domænenavn:',
'password-change-forbidden' => 'Du kan ikke ændre adgangskoder på denne wiki.',
'externaldberror' => 'Der er opstået en fejl i en ekstern adgangsdatabase, eller du har ikke rettigheder til at opdatere denne.',
@@ -619,18 +639,44 @@ Glem ikke at ændre dine [[Special:Preferences|{{SITENAME}} indstillinger]].',
'logout' => 'Log af',
'userlogout' => 'Log af',
'notloggedin' => 'Ikke logget på',
+'userlogin-noaccount' => 'Har du ikke en konto?',
+'userlogin-joinproject' => 'Slut dig til {{SITENAME}}',
'nologin' => 'Har du ingen konto? $1.',
'nologinlink' => 'Opret en ny brugerkonto',
'createaccount' => 'Opret en ny brugerkonto',
'gotaccount' => 'Har du allerede en konto? $1.',
'gotaccountlink' => 'Log på',
'userlogin-resetlink' => 'Har du glemt dine login oplysninger?',
+'userlogin-resetpassword-link' => 'Nulstil din adgangskode',
+'helplogin-url' => 'Help:Logge på',
+'userlogin-helplink' => '[[{{MediaWiki:helplogin-url}}|Hjælp til at logge på]]',
+'userlogin-loggedin' => 'Du er allerede logget på som {{GENDER:$1|$1}}.
+Brug formularen nedenfor til at logge på som en anden bruger.',
+'userlogin-createanother' => 'Opret en anden konto',
+'createacct-join' => 'Indtast dine oplysninger nedenfor.',
+'createacct-another-join' => 'Angiv den nye kontos oplysninger nedenfor.',
+'createacct-emailrequired' => 'Mailadresse',
+'createacct-emailoptional' => 'Mailadresse (valgfri)',
+'createacct-email-ph' => 'Indtast din mailadresse',
+'createacct-another-email-ph' => 'Indtast e-mailadresse',
'createaccountmail' => 'Brug en midlertidig tilfældig adgangskode og send den til den angivne e-mailadresse',
+'createacct-realname' => 'Dit rigtige navn',
'createaccountreason' => 'Begrundelse:',
+'createacct-reason' => 'Ã…rsag',
+'createacct-reason-ph' => 'Hvorfor vil du oprette endnu en konto',
+'createacct-captcha' => 'Sikkerhedskontrol',
+'createacct-imgcaptcha-ph' => 'Indtast venligst ovenstående tekst',
+'createacct-submit' => 'Opret din konto',
+'createacct-another-submit' => 'Oprette en anden konto',
+'createacct-benefit-heading' => '{{SITENAME}} laves af mennesker som dig.',
+'createacct-benefit-body1' => '{{PLURAL:$1|redigering|redigeringer}}',
+'createacct-benefit-body2' => '{{PLURAL:$1|side|sider}}',
+'createacct-benefit-body3' => '{{PLURAL:$1|nylig bidragyder|nylige bidragydere}}',
'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',
+'createacct-error' => 'Fejl ved kontooprettelse',
'createaccounterror' => 'Kunne ikke oprette brugerkonto: $1',
'nocookiesnew' => 'Din brugerkonto er nu oprettet, men du er ikke logget på. {{SITENAME}} bruger cookies til at logge brugere på. Du har slået cookies fra. Vær venlig at slå cookies til, og derefter kan du logge på med dit nye brugernavn og kodeord.',
'nocookieslogin' => '{{SITENAME}} bruger cookies til at logge brugere på. Du har slået cookies fra. Slå dem venligst til og prøv igen.',
@@ -662,8 +708,7 @@ Hvis en anden har bestilt den nye adgangskode, eller hvis du er kommet i tanke o
kan du bare ignorere denne e-mail og fortsætte med at bruge din gamle adgangskode.',
'noemail' => 'Der er ikke oplyst en e-mailadresse for bruger "$1".',
'noemailcreate' => 'Du skal angive en gyldig e-mailadresse',
-'passwordsent' => 'En ny adgangskode er sendt til e-mail-adressen,
-som er registreret for "$1".
+'passwordsent' => 'En ny adgangskode er sendt til e-mailadressen, som er registreret for "$1".
Du bør logge på og ændre din adgangskode straks efter du har modtaget e-mailen.',
'blocked-mailpassword' => 'Din IP-adresse er spærret for ændring af sider. For at forhindre misbrug, er det heller ikke muligt, at bestille et nyt password.',
'eauthentsent' => 'En bekræftelsesmail er sendt til den angivne e-mailadresse.
@@ -673,12 +718,12 @@ Før en e-mail kan modtages af andre brugere af {{SITENAME}}-mailfunktionen, ska
'mailerror' => 'Fejl ved afsendelse af e-mail: $1',
'acct_creation_throttle_hit' => 'Besøgende med samme IP-adresse som dig har oprettet {{PLURAL:$1|en konto|$1 kontoer}} det sidste døgn, og det er ikke tilladt at oprette flere.
Derfor kan besøgende ikke oprette flere kontoer fra denne IP-adresse i øjeblikket.',
-'emailauthenticated' => 'Din e-mail-adresse blev bekræftet $2 $3.',
+'emailauthenticated' => 'Din e-mailadresse blev bekræftet $2 $3.',
'emailnotauthenticated' => 'Din e-mail-adresse er endnu ikke bekræftet og de avancerede e-mail-funktioner er slået fra indtil bekræftelse har fundet sted (d.u.a.). Log ind med den midlertidige adgangskode, der er blevet sendt til dig, for at bekræfte, eller bestil et nyt på loginsiden.',
'noemailprefs' => 'Angiv en e-mailadresse, så følgende funktioner er til rådighed.',
-'emailconfirmlink' => 'Bekræft e-mail-adressen (autentificering).',
+'emailconfirmlink' => 'Bekræft din e-mailadresse',
'invalidemailaddress' => 'E-mailadressen kan ikke accepteres da den tilsyneladende har et ugyldigt format. Skriv venligst en e-mailadresse med et korrekt format eller tøm feltet.',
-'cannotchangeemail' => 'De email-adresser, der er tilknyttet brugerkontoer, kan ikke ændres på denne wiki.',
+'cannotchangeemail' => 'De e-mailadresser, der er tilknyttet brugerkontoer, kan ikke ændres på denne wiki.',
'emaildisabled' => 'Denne hjemmeside kan ikke sende emails.',
'accountcreated' => 'Brugerkonto oprettet',
'accountcreatedtext' => 'Brugerkontoen for [[{{ns:User}}:$1|$1]] ([[{{ns:User talk}}:$1|diskussion]]) er oprettet.',
@@ -689,10 +734,12 @@ Du opfordres til at logge ind og ændre adgangskoden med det samme.
Du kan ignorere denne besked hvis kontoen blev oprettet ved en fejl.',
'usernamehasherror' => 'Brugernavn må ikke indeholde #',
'login-throttled' => 'Du har forsøgt at logge på for mange gange.
-Vent venligst før du prøver igen.',
+Vent venligst $1, før du prøver igen.',
'login-abort-generic' => 'Det lykkedes dig ikke at logge på - afbrudt',
'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.',
+'createacct-another-realname-tip' => 'Angivelse af rigtigt navn er valgfrit.
+Hvis du vælger at oplyse dit navn, vil det blive brugt til at tilskrive dig dit arbejde.',
# Email sending
'php-mail-error-unknown' => "Ukendt fejl i PHP's mail()-funtion",
@@ -708,8 +755,7 @@ Vent venligst før du prøver igen.',
'newpassword' => 'Ny adgangskode:',
'retypenew' => 'Gentag ny adgangskode:',
'resetpass_submit' => 'Gem adgangskode og log på',
-'resetpass_success' => 'Din adgangskode er blevet ændret med succes!
-Logger dig på nu...',
+'changepassword-success' => 'Din adgangskode er nu ændret!',
'resetpass_forbidden' => 'Adgangskoder kan ikke ændres',
'resetpass-no-info' => 'Du skal være logget på for at komme direkte til denne side.',
'resetpass-submit-loggedin' => 'Skift adgangskode',
@@ -721,33 +767,34 @@ Du har muligvis allerede skiftet din adgangskode eller anmodet om en ny midlerti
# Special:PasswordReset
'passwordreset' => 'Nulstil adgangskode',
-'passwordreset-text' => 'Udfyld denne formular for at nulstille din adgangskode.',
+'passwordreset-text-one' => 'Udfyld denne formular for at nulstille din adgangskode.',
+'passwordreset-text-many' => '{{PLURAL:$1|Udfyld en af felterne nedenfor for at nulstille din adgangskode.}}',
'passwordreset-legend' => 'Nulstil adgangskode',
'passwordreset-disabled' => 'Nulstilling af kodeord er slået fra på denne wiki.',
-'passwordreset-pretext' => '{{PLURAL:$1||Indtast en af de nedenstående oplysninger}}',
+'passwordreset-emaildisabled' => 'E-mailfunktioner er slået fra på denne wiki.',
'passwordreset-username' => 'Brugernavn:',
'passwordreset-domain' => 'Domæne:',
'passwordreset-capture' => 'Se den resulterende e-mail?',
'passwordreset-capture-help' => 'Hvis du krydser dette felt af, vil emailen (med den midlertidige adgangskode) blive vist til dig i tillæg til at blive sendt til brugeren.',
'passwordreset-email' => 'E-mailadresse:',
'passwordreset-emailtitle' => 'Kontooplysninger på {{SITENAME}}',
-'passwordreset-emailtext-ip' => 'Nogen (sandsynligvis dig, fra IP-adressen $1) har anmodet om at få nulstillet din adgangskode til {{SITENAME}} ($4). {{PLURAL:$3|Den følgende brugerkonto er associeret|De følgende brugerkonti er associerede}} med denne e-mail-adresse:
+'passwordreset-emailtext-ip' => 'Nogen (sandsynligvis dig, fra IP-adressen $1) har anmodet om at få nulstillet din adgangskode til {{SITENAME}} ($4). {{PLURAL:$3|Den følgende brugerkonto er associeret|De følgende brugerkonti er associerede}} med denne e-mailadresse:
$2
{{PLURAL:$3|Denne midlertidige adgangskode|Disse midlertidige adgangskoder}} vil udløbe om {{PLURAL:$5|en dag|$5 dage}}.
-Du bør logge på og vælge en ny adgangskode nu. Hvis en anden end dig har gjort denne anmodning, eller hvis du er kommet i tanke om din oprindelig adgangskode og ikke længere ønsker at ændre den, kan du ignorere denne meddelelse og fortsætte med at bruge din gamle adgangskode.',
-'passwordreset-emailtext-user' => 'Brugeren $1 på {{SITENAME}} har anmodet om at få nulstillet din adgangskode til {{SITENAME}} ($4). {{PLURAL:$3|Den følgende brugerkonto er associeret|De følgende brugerkonti er associerede}} med denne e-mail-adresse:
+Du bør logge på og vælge en ny adgangskode nu. Hvis en anden end dig har lavet denne anmodning, eller hvis du er kommet i tanke om din oprindelig adgangskode og ikke længere ønsker at ændre den, kan du ignorere denne meddelelse og fortsætte med at bruge din gamle adgangskode.',
+'passwordreset-emailtext-user' => 'Brugeren $1 på {{SITENAME}} har anmodet om at få nulstillet din adgangskode til {{SITENAME}} ($4). {{PLURAL:$3|Den følgende brugerkonto er associeret|De følgende brugerkonti er associerede}} med denne e-mailadresse:
$2
{{PLURAL:$3|Denne midlertidige adgangskode|Disse midlertidige adgangskoder}} vil udløbe om {{PLURAL:$5|en dag|$5 dage}}.
-Du bør logge på og vælge en ny adgangskode nu. Hvis en anden end dig har gjort denne anmodning, eller hvis du er kommet i tanke om din oprindelig adgangskode og ikke længere ønsker at ændre den, kan du ignorere denne meddelelse og fortsætte med at bruge din gamle adgangskode.',
+Du bør logge på og vælge en ny adgangskode nu. Hvis en anden end dig har lavet denne anmodning, eller hvis du er kommet i tanke om din oprindelig adgangskode og ikke længere ønsker at ændre den, kan du ignorere denne meddelelse og fortsætte med at bruge din gamle adgangskode.',
'passwordreset-emailelement' => 'Brugernavn: $1
Midlertidig adgangskode: $2',
'passwordreset-emailsent' => 'En e-mail om nulstilling af adgangskode er blevet sendt.',
'passwordreset-emailsent-capture' => 'En e-mail om nulstilling af adgangskode, som vist nedenfor, er blevet sendt.',
-'passwordreset-emailerror-capture' => 'En påmindelsesemail, som vist nedenfor, blev genereret, men det lykkedes ikke at sende den til brugeren: $1',
+'passwordreset-emailerror-capture' => 'En mail om nulstilling af adgangskode, som vist nedenfor, blev genereret, men det lykkedes ikke at sende den til {{GENDER:$2|bruger}}: $1',
# Special:ChangeEmail
'changeemail' => 'Ændre e-mailadresse',
@@ -758,9 +805,22 @@ Midlertidig adgangskode: $2',
'changeemail-newemail' => 'Ny e-mailadresse:',
'changeemail-none' => '(ingen)',
'changeemail-password' => 'Din adgangskode til {{SITENAME}}:',
-'changeemail-submit' => 'Ændre email',
+'changeemail-submit' => 'Ændre e-mail',
'changeemail-cancel' => 'Afbryd',
+# Special:ResetTokens
+'resettokens' => 'Nulstil nøgler',
+'resettokens-text' => 'Du kan nulstille nøgler, som giver adgang til visse private data i forbindelse med din konto her.
+
+Du bør gøre det, hvis du ved et uheld deler dem med nogen, eller hvis din konto er blevet kompromitteret.',
+'resettokens-no-tokens' => 'Der er ingen nøgler at nulstille.',
+'resettokens-legend' => 'Nulstil nøgler',
+'resettokens-tokens' => 'Nøgler:',
+'resettokens-token-label' => '$1(aktuel værdi: $2)',
+'resettokens-watchlist-token' => 'Nøgle for web-feed (Atom/RSS) af [[Special:Watchlist|ændringer af sider på din overvågningsliste]]',
+'resettokens-done' => 'Nøgler er nulstillet.',
+'resettokens-resetbutton' => 'Nulstil valgte nøgler',
+
# Edit page toolbar
'bold_sample' => 'Fed tekst',
'bold_tip' => 'Fed tekst',
@@ -957,11 +1017,14 @@ Sletnings- og flytteloggerne for siden er vist nedenfor.',
Den ser du til at være slettet.',
'edit-conflict' => 'Redigeringskonflikt.',
'edit-no-change' => 'Din ændring ignoreredes, fordi der ikke var ændring af teksten.',
+'postedit-confirmation' => 'Din redigering er gemt.',
'edit-already-exists' => 'En ny side kunne ikke oprettes, fordi den allerede findes.',
'defaultmessagetext' => 'Standardtekst',
'content-failed-to-parse' => 'Kunne ikke fortolke $2-indholdet af $1-modellen: $3',
'invalid-content-data' => 'Ugyldig indholdsdata',
'content-not-allowed-here' => '"$1" indhold er ikke tilladt på siden [[$2]]',
+'editwarning-warning' => 'Hvis du forlader siden nu, risikerer du at miste alle ændringer, som du har lavet.
+Denne advarsel kan slås fra under "Redigering" i dine indstillinger.',
# Content models
'content-model-wikitext' => 'wikitekst',
@@ -995,6 +1058,7 @@ Kontroller venligst sammenligningen herunder for at bekræfte at det er hvad du
'undo-failure' => 'Redigeringen kunne ikke fjernes på grund af konflikter med efterfølgende redigeringer.',
'undo-norev' => 'Redigeringen kunne ikke fjernes fordi den ikke findes eller er blevet slettet.',
'undo-summary' => 'Fjerner version $1 af [[Special:Contributions/$2|$2]] ([[User talk:$2|diskussion]])',
+'undo-summary-username-hidden' => 'Fortryde revision $1 af en skjult bruger',
# Account creation failure
'cantcreateaccounttitle' => 'Brugerkontoen kan ikke oprettes.',
@@ -1171,6 +1235,7 @@ Vær opmæksom på at bevare kontinuiteten i sidehistorikken.
'compareselectedversions' => 'Sammenlign valgte versioner',
'showhideselectedversions' => 'Vis/skjul udvalgte versioner',
'editundo' => 'fjern redigering',
+'diff-empty' => '(Ingen forskel)',
'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)',
'difference-missing-revision' => '{{PLURAL:$2|En revision|$2 revisioner}} af denne forskel ($1) {{PLURAL:$2|blev|blev}} ikke fundet.
@@ -1198,7 +1263,6 @@ Detaljer kan findes i [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}
'searchmenu-legend' => 'Søgemuligheder',
'searchmenu-exists' => "'''Der er en side med navnet \"[[:\$1]]\" på denne wiki'''",
'searchmenu-new' => "'''Opret siden \"[[:\$1]]\" i denne wiki'''",
-'searchhelp-url' => 'Help:Hjælp',
'searchmenu-prefix' => '[[Special:PrefixIndex/$1|Vis alle sider som begynder med dette præfiks]]',
'searchprofile-articles' => 'Indholdssider',
'searchprofile-project' => 'Hjælpe- og projektsider',
@@ -1240,15 +1304,7 @@ Du kan prøve at bruge \"all:\" som præfiks for at søge i alt indhold (inkl. d
'powersearch-togglenone' => 'Ingen',
'search-external' => 'Brug anden søgemaskine',
'searchdisabled' => '<p>Beklager! Fuldtekstsøgningen er midlertidigt afbrudt på grund af for stor belastning på serverne. I mellemtidem kan du anvende Google- eller Yahoo!-søgefelterne herunder. Bemærk at deres kopier af {{SITENAME}}s indhold kan være forældet.</p>',
-
-# Quickbar
-'qbsettings' => 'Hurtigmenu',
-'qbsettings-none' => 'Ingen',
-'qbsettings-fixedleft' => 'Fast venstre',
-'qbsettings-fixedright' => 'Fast højre',
-'qbsettings-floatingleft' => 'Flydende venstre',
-'qbsettings-floatingright' => 'Flydende højre',
-'qbsettings-directionality' => 'Fast, afhængigt af dit sprogs skriveretning',
+'search-error' => 'Der opstod en fejl under søgning: $1',
# Preferences page
'preferences' => 'Indstillinger',
@@ -1282,7 +1338,6 @@ Du kan prøve at bruge \"all:\" som præfiks for at søge i alt indhold (inkl. d
'resetprefs' => 'Gendan indstillinger',
'restoreprefs' => 'Gendan alle standardindstillinger (i alle sektioner)',
'prefs-editing' => 'Redigering',
-'prefs-edit-boxsize' => 'Størrelse på redigeringsvinduet.',
'rows' => 'Rækker',
'columns' => 'Kolonner',
'searchresultshead' => 'Søgeresultater',
@@ -1293,9 +1348,9 @@ Du kan prøve at bruge \"all:\" som præfiks for at søge i alt indhold (inkl. d
'recentchangesdays-max' => '(maks. $1 {{PLURAL:$1|dag|dage}})',
'recentchangescount' => 'Antal redigeringer som skal vises som standard:',
'prefs-help-recentchangescount' => 'Det gælder for seneste ændringer, historikker og logger.',
-'prefs-help-watchlist-token' => 'Hvis du udfylder dette felt med en hemmelig værdi, vil der laves et RSS-feed for din overvågningsliste.
-Alle som kender nøglen i feltet vil være i stand til at læse din overvågningsliste, så vælg en sikker værdi.
-Her er en tilfældig genereret værdi som du kan bruge: $1',
+'prefs-help-watchlist-token2' => 'Dette er den hemmelige nøgle til web-feed af din overvågningsliste.
+Hvis andre kender den, man vil være i stand til at læse din overvågningsliste, så del den ikke.
+[[Special:ResetTokens|Klik her hvis du har brug at nulstille den]].',
'savedprefs' => 'Dine indstillinger er blevet gemt.',
'timezonelegend' => 'Tidszone:',
'localtime' => 'Lokaltid:',
@@ -1326,7 +1381,6 @@ Her er en tilfældig genereret værdi som du kan bruge: $1',
'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:',
-'prefs-textboxsize' => 'Størrelse på redigeringsvindue',
'youremail' => 'Din e-mailadresse:',
'username' => '{{GENDER:$1|Brugernavn}}:',
'uid' => '{{GENDER:$1|Brugernummer}}:',
@@ -1352,13 +1406,15 @@ Informationen vil være offentlig.',
Hvis du vælger at oplyse dit navn, vil det blive brugt til at tilskrive dig dit arbejde.',
'prefs-help-email' => 'Angivelse af e-mailadresse er valgfrit, men den gør det muligt at sende dig en ny adgangskode hvis du glemmer den.',
'prefs-help-email-others' => 'Du kan også vælge at lade andre kontakte dig gennem din bruger eller diskussions side uden at behøve at afsløre din identitet.',
-'prefs-help-email-required' => 'E-mail-adresse er krævet.',
+'prefs-help-email-required' => 'E-mailadresse er krævet.',
'prefs-info' => 'Grundlæggende information',
'prefs-i18n' => 'Internationalisering:',
'prefs-signature' => 'Signatur',
'prefs-dateformat' => 'Formatering af datoer',
'prefs-timeoffset' => 'Tidsforskel',
'prefs-advancedediting' => 'Generelle indstillinger',
+'prefs-editor' => 'Redaktør',
+'prefs-preview' => 'Forhåndsvisning',
'prefs-advancedrc' => 'Avancerede indstillinger',
'prefs-advancedrendering' => 'Avancerede indstillinger',
'prefs-advancedsearchoptions' => 'Avancerede indstillinger',
@@ -1366,7 +1422,9 @@ Hvis du vælger at oplyse dit navn, vil det blive brugt til at tilskrive dig dit
'prefs-displayrc' => 'Indstillinger for visning',
'prefs-displaysearchoptions' => 'Visningsmuligheder',
'prefs-displaywatchlist' => 'Visningsmuligheder',
+'prefs-tokenwatchlist' => 'Mærke',
'prefs-diffs' => 'Forskelle',
+'prefs-help-prefershttps' => 'Denne indstilling træder i kraft næste gang du logger på.',
# User preference: email validation using jQuery
'email-address-validity-valid' => 'E-mailadressen ser ud til at være gyldig',
@@ -1393,6 +1451,9 @@ Hvis du vælger at oplyse dit navn, vil det blive brugt til at tilskrive dig dit
'userrights-notallowed' => 'Du har ikke tilladelse til at tilføje eller fjerne brugerrettigheder.',
'userrights-changeable-col' => 'Redigerbare grupper',
'userrights-unchangeable-col' => 'Uredigerbare grupper',
+'userrights-conflict' => 'Konflikt i ændringer af brugerrettigheder!
+Vær venlig at gennemse og bekræft dine ændringer.',
+'userrights-removed-self' => 'Du har fjernet dine egne rettigheder. Du har derfor ikke længere adgang til denne side.',
# Groups
'group' => 'Gruppe:',
@@ -1458,11 +1519,19 @@ Hvis du vælger at oplyse dit navn, vil det blive brugt til at tilskrive dig dit
'right-proxyunbannable' => 'Redigere gennem automatisk blokeret proxy',
'right-unblockself' => 'Fjerne blokering af dig selv',
'right-protect' => 'Ændre beskyttelsesniveauer og redigere cascade-beskyttede sider',
-'right-editprotected' => 'Ændre beskyttede sider (uden nedarvet sidebeskyttelse)',
+'right-editprotected' => 'Redigere sider beskyttet som "{{int:protect-level-sysop}}"',
+'right-editsemiprotected' => 'Rediger sider, der er beskyttet som "{{int:protect-level-autoconfirmed}}"',
'right-editinterface' => 'Ændre brugergrænsefladens tekster',
'right-editusercssjs' => 'Ændre andre brugeres JS og CSS filer',
'right-editusercss' => 'Ændre andre brugeres CSS filer',
'right-edituserjs' => 'Ændre andre brugeres JS filer',
+'right-editmyusercss' => 'Redigere dine egne CSS-filer',
+'right-editmyuserjs' => 'Redigere dine egne JavaScript-filer',
+'right-viewmywatchlist' => 'Se din egen overvågningsliste',
+'right-editmywatchlist' => 'Redigere din egen overvågningsliste. Bemærk nogle handlinger tilføjer sider selv uden denne rettelse.',
+'right-viewmyprivateinfo' => 'Se dine egne private data (f.eks. e-mailadresse, rigtige navn)',
+'right-editmyprivateinfo' => 'Redigere dine egne private data (f.eks. e-mailadresse, rigtige navn)',
+'right-editmyoptions' => 'Redigere dine egne indstillinger',
'right-rollback' => 'Hurtig gendannelse af alle redigeringer foretaget af den seneste bruger',
'right-markbotedits' => 'Markere gendannelser som ændringer foretaget af en robot',
'right-noratelimit' => 'Upåvirket af hastighedsgrænser',
@@ -1523,13 +1592,20 @@ Hvis du vælger at oplyse dit navn, vil det blive brugt til at tilskrive dig dit
'action-userrights' => 'ændre alle brugerrettigheder',
'action-userrights-interwiki' => 'ændre brugerrettigheder for brugere på andre wikier',
'action-siteadmin' => 'låse eller låse databasen op',
-'action-sendemail' => 'sende email',
+'action-sendemail' => 'sende e-mail',
+'action-editmywatchlist' => 'rediger din overvågningsliste',
+'action-viewmywatchlist' => 'se din overvågningsliste',
+'action-viewmyprivateinfo' => 'se din private information',
+'action-editmyprivateinfo' => 'rediger dine private oplysninger',
# Recent changes
'nchanges' => '$1 {{PLURAL:$1|ændring|ændringer}}',
+'enhancedrc-since-last-visit' => '$1 {{PLURAL:$1|siden sidste besøg}}',
+'enhancedrc-history' => 'historik',
'recentchanges' => 'Seneste ændringer',
'recentchanges-legend' => 'Indstillinger for seneste ændringer',
'recentchanges-summary' => "På denne side kan du følge de seneste ændringer på '''{{SITENAME}}'''.",
+'recentchanges-noresult' => 'Ingen ændringer i den angivne periode matcher disse kriterier.',
'recentchanges-feed-description' => 'Med dette feed kan du følge de seneste ændringer på {{SITENAME}}.',
'recentchanges-label-newpage' => 'Denne redigering oprettede en ny side',
'recentchanges-label-minor' => 'Dette er en mindre ændring',
@@ -1567,7 +1643,6 @@ Hvis du vælger at oplyse dit navn, vil det blive brugt til at tilskrive dig dit
'recentchangeslinked-feed' => 'Relaterede ændringer',
'recentchangeslinked-toolbox' => 'Relaterede ændringer',
'recentchangeslinked-title' => 'Ændringer der relaterer til $1',
-'recentchangeslinked-noresult' => 'I det valgte tidsrum blev der ikke foretaget ændringer på sider der henvises til.',
'recentchangeslinked-summary' => "Denne specialside viser de seneste ændringer på de sider der henvises til. Sider på din overvågningsliste er vist med '''fed''' skrift.",
'recentchangeslinked-page' => 'Side:',
'recentchangeslinked-to' => 'Vis ændringer i sider der henviser til den angivne side i stedet',
@@ -1578,7 +1653,7 @@ Hvis du vælger at oplyse dit navn, vil det blive brugt til at tilskrive dig dit
'reuploaddesc' => 'Tilbage til formularen til at lægge filer op.',
'upload-tryagain' => 'Gem modificeret filbeskrivelse',
'uploadnologin' => 'Ikke logget på',
-'uploadnologintext' => 'Du skal være [[Special:UserLogin|logget på]] for at kunne lægge filer op.',
+'uploadnologintext' => 'Du skal $1 for at kunne lægge filer op.',
'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',
@@ -1802,7 +1877,6 @@ For optimal sikkerhed er img_auth.php deaktiveret.",
'http-read-error' => 'HTTP-læsefejl.',
'http-timed-out' => 'HTTP-forespørgslen tog for lang tid.',
'http-curl-error' => 'Fejl under hentning af URL: $1',
-'http-host-unreachable' => 'Webadresse er ikke tilgængelig.',
'http-bad-status' => 'Der opstod et problem under HTTP-forespørgslen: $1 $2',
# Some likely curl errors. More could be added from <http://curl.haxx.se/libcurl/c/libcurl-errors.html>
@@ -1830,6 +1904,10 @@ For optimal sikkerhed er img_auth.php deaktiveret.",
'listfiles_size' => 'Størrelse (Byte)',
'listfiles_description' => 'Beskrivelse',
'listfiles_count' => 'Versioner',
+'listfiles-show-all' => 'Vis også gamle versioner af billeder',
+'listfiles-latestversion' => 'Nuværende version',
+'listfiles-latestversion-yes' => 'Ja',
+'listfiles-latestversion-no' => 'Nej',
# File description page
'file-anchor-link' => 'Fil',
@@ -1926,6 +2004,13 @@ Husk at kontrollere for andre henvisninger til skabelonerne før de slettes.',
'randompage' => 'Tilfældig side',
'randompage-nopages' => 'Der er ingen sider i {{PLURAL:$2|navnerummet|disse navnerum:}} $1.',
+# Random page in category
+'randomincategory' => 'Tilfældig side i kategori',
+'randomincategory-invalidcategory' => '"$1" er ikke et gyldigt kategorinavn.',
+'randomincategory-nopages' => 'Der er ingen sider i [[:Category:$1]].',
+'randomincategory-selectcategory' => 'Få tilfældig side fra kategori: $1 $2.',
+'randomincategory-selectcategory-submit' => 'GÃ¥ til',
+
# Random redirect
'randomredirect' => 'Tilfældige henvisninger',
'randomredirect-nopages' => 'Der er ingen omdirigeringer i navnerummet $1.',
@@ -1951,17 +2036,13 @@ Husk at kontrollere for andre henvisninger til skabelonerne før de slettes.',
'statistics-users-active-desc' => 'Brugere som har udført handlinger i {{PLURAL:$1|det sidste døgn|de sidste $1 dage}}',
'statistics-mostpopular' => 'Mest besøgte sider',
-'disambiguations' => 'Sider, der henviser til flertydige titler',
-'disambiguationspage' => 'Template:Flertydig',
-'disambiguations-text' => "De følgende sider henviser til mindst en side med en '''flertydig titel'''.
-De bør henvise direkte til et mere passende emne i stedet.<br />
-En side behandles som en side med en flertydig titel hvis den bruger en skabelon som der er henvist til fra [[MediaWiki:Disambiguationspage]].",
-
'pageswithprop' => 'Sider med en sideegenskab',
'pageswithprop-legend' => 'Sider med en sideegenskab',
'pageswithprop-text' => 'Denne side viser en liste over sider, der har en bestemt sideegenskab.',
'pageswithprop-prop' => 'Egenskabsnavn:',
'pageswithprop-submit' => 'Vis',
+'pageswithprop-prophidden-long' => 'lang tekst værdi for egenskaben skjult ($1)',
+'pageswithprop-prophidden-binary' => 'binær værdi for egenskaben skjult ($1)',
'doubleredirects' => 'Dobbelte omdirigeringer',
'doubleredirectstext' => 'Dette er en liste over sider som omdirigerer til andre omdirigeringssider.
@@ -2019,6 +2100,7 @@ Hver linje indeholder henvisninger til den første og den anden omdirigering, sÃ
'mostrevisions' => 'Sider med de fleste ændringer',
'prefixindex' => 'Alle sider med præfiks',
'prefixindex-namespace' => 'Alle sider med præfiks (navnerummet $1)',
+'prefixindex-strip' => 'Strip præfiks i listen',
'shortpages' => 'Korte sider',
'longpages' => 'Lange sider',
'deadendpages' => 'Blindgydesider',
@@ -2034,6 +2116,7 @@ Hver linje indeholder henvisninger til den første og den anden omdirigering, sÃ
'listusers' => 'Brugerliste',
'listusers-editsonly' => 'Vis kun brugere med redigeringer',
'listusers-creationsort' => 'Sorter efter oprettelsesdato',
+'listusers-desc' => 'Sortér i faldende rækkefølge',
'usereditcount' => '{{PLURAL:$1|én redigering|$1 redigeringer}}',
'usercreated' => '{{GENDER:$3|Oprettet}} den $1 $2',
'newpages' => 'Nyeste sider',
@@ -2169,7 +2252,7 @@ Den e-mail-adresse, du har angivet i [[Special:Preferences|dine indstillinger]],
'usermaildisabled' => 'Bruger-e-mail deaktiveret',
'usermaildisabledtext' => 'Du kan ikke sende e-mails til andre brugere på denne wiki',
'noemailtitle' => 'Ingen e-mailadresse',
-'noemailtext' => 'Denne bruger har ikke angivet en gyldig e-mail-adresse.',
+'noemailtext' => 'Denne bruger har ikke angivet en gyldig e-mailadresse.',
'nowikiemailtitle' => 'E-mail er ikke tilladt',
'nowikiemailtext' => 'Denne bruger har valgt ikke at modtage e-mail fra andre brugere.',
'emailnotarget' => 'Ikke-eksisterende eller ugyldigt brugernavn for modtageren.',
@@ -2211,10 +2294,9 @@ Fremtidige ændringer af denne side og dens tilknyttede diskussionsside vil bliv
'unwatchthispage' => 'Fjern overvågning',
'notanarticle' => 'Ikke en artikel',
'notvisiblerev' => 'Versionen er blevet slettet',
-'watchnochange' => 'Ingen af siderne i din overvågningsliste er ændret i den valgte periode.',
'watchlist-details' => 'Du har $1 {{PLURAL:$1|side|sider}} på din overvågningsliste (ekskl. diskussionssider).',
-'wlheader-enotif' => '* E-mail-underretning er slået til.',
-'wlheader-showupdated' => "* Sider der er ændret siden dit sidste besøg, er '''fremhævet'''",
+'wlheader-enotif' => 'E-mail-underretning er slået til.',
+'wlheader-showupdated' => "Sider, der er ændret siden dit sidste besøg, er vist med '''fed skrift'''.",
'watchmethod-recent' => 'Tjekker seneste ændringer for sider i din overvågningsliste',
'watchmethod-list' => 'Tjekker seneste ændringer for sider i din overvågningsliste',
'watchlistcontains' => 'Din overvågningsliste indeholder $1 {{PLURAL:$1|side|sider}}.',
@@ -2457,7 +2539,7 @@ $1',
'contributions' => '{{GENDER:$1|Brugerbidrag}}',
'contributions-title' => 'Brugerbidrag for $1',
'mycontris' => 'Bidrag',
-'contribsub2' => 'For $1 ($2)',
+'contribsub2' => 'For {{GENDER:$3|$1}} ($2)',
'nocontribs' => 'Ingen ændringer er fundet som opfylder disse kriterier.',
'uctop' => '(seneste)',
'month' => 'MÃ¥ned:',
@@ -2614,13 +2696,11 @@ Se [[Special:BlockList|blokeringslisten]] for den nuværende liste med aktuelle
'ipb_blocked_as_range' => 'Fejl: IP-adressen $1 er ikke direkte blokeret. Derfor kan en blokering ikke ophæves. Adressen er blokeret som en del af intervallet $2. Denne blokering kan ophæves.',
'ip_range_invalid' => 'Ugyldigt IP-interval.',
'ip_range_toolarge' => 'Blokeringer af IP-serier større end /$1 er ikke tilladte.',
-'blockme' => 'Bloker mig',
'proxyblocker' => 'Proxy-blokering',
-'proxyblocker-disabled' => 'Denne funktion er ikke i brug.',
'proxyblockreason' => "Din IP-adresse er blevet blokeret fordi den er en såkaldt ''åben proxy''. Kontakt din Internet-udbyder eller tekniske hotline og oplyse dem om dette alvorlige sikkerhedsproblem.",
-'proxyblocksuccess' => 'Færdig.',
'sorbsreason' => 'IP-adressen er opført i DNSBL på {{SITENAME}} som åben PROXY.',
'sorbs_create_account_reason' => 'IP-adressen er opført i DNSBL på {{SITENAME}} som åben PROXY. Oprettelse af nye brugere er ikke mulig.',
+'xffblockreason' => 'En IP-adresse der er indeholdt i X-Fremsendt-Til hovedet, enten din egen eller en på en proxy-server, du bruger, er blevet blokeret. Den oprindelige grund til blokeringen var:$1',
'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',
@@ -2778,6 +2858,8 @@ Besøg venligst [//www.mediawiki.org/wiki/Localisation MediaWiki-lokalisering] o
'thumbnail-more' => 'Forstør',
'filemissing' => 'Filen mangler',
'thumbnail_error' => 'Fejl ved oprettelse af thumbnail: $1',
+'thumbnail_error_remote' => 'Fejlbesked fra $1:
+$2',
'djvu_page_error' => 'DjVu-side udenfor sideområdet',
'djvu_no_xml' => 'XML-data kan ikke hentes til DjVu-filen',
'thumbnail-temp-create' => 'Kunne ikke oprette midlertidig miniaturefil',
@@ -3005,13 +3087,8 @@ Dette skyldes sandsynligvis en henvisning til et sortlistet eksternt websted.',
'pageinfo-category-files' => 'Antal filer',
# Skin names
-'skinname-standard' => 'Klassik',
-'skinname-nostalgia' => 'Nostalgi',
'skinname-cologneblue' => 'Kølnerblå',
'skinname-monobook' => 'MonoBook',
-'skinname-myskin' => 'Eget udseende',
-'skinname-chick' => 'Chick',
-'skinname-simple' => 'Enkelt',
'skinname-modern' => 'Moderne',
# Patrolling
@@ -3090,11 +3167,25 @@ Du kan beskadige dit system hvis du udfører den.",
'minutes' => '{{PLURAL: $1|$1 minut|$1 minutter}}',
'hours' => '{{PLURAL: $1|$1 time|$1 timer}}',
'days' => '{{PLURAL: $1|$1 dag|$1 dage}}',
+'weeks' => '{{PLURAL:$1|$1 uge|$1 uger}}',
'months' => '{{PLURAL:$1|$1 måned|$1 måneder}}',
'years' => '{{PLURAL:$1|$1 år}}',
'ago' => '$1 siden',
'just-now' => 'lige nu',
+# Human-readable timestamps
+'hours-ago' => '$1 {{PLURAL:$1|time|timer}} siden',
+'minutes-ago' => '$1 {{PLURAL:$1|minut|minutter}} siden',
+'seconds-ago' => '$1 {{PLURAL:$1|sekund|sekunder}} siden',
+'monday-at' => 'Mandag kl. $1',
+'tuesday-at' => 'Tirsdag kl. $1',
+'wednesday-at' => 'Onsdag kl. $1',
+'thursday-at' => 'Torsdag kl. $1',
+'friday-at' => 'Fredag kl. $1',
+'saturday-at' => 'Lørdag kl. $1',
+'sunday-at' => 'Søndag kl. $1',
+'yesterday-at' => 'Igår kl. $1',
+
# Bad image list
'bad_image_list' => 'Formatet er:
@@ -3121,7 +3212,7 @@ Kun indholdet af lister (linjer startende med *) bliver brugt. Den første henvi
* gpslongitude
* gpsaltitude',
-# EXIF tags
+# Exif tags
'exif-imagewidth' => 'Bredde',
'exif-imagelength' => 'Længde',
'exif-bitspersample' => 'Bits pr. farvekomponent',
@@ -3299,7 +3390,7 @@ Kun indholdet af lister (linjer startende med *) bliver brugt. Den første henvi
'exif-originalimageheight' => 'Højden af billedet inden det blev beskåret',
'exif-originalimagewidth' => 'Bredden af billedet inden det blev beskåret',
-# EXIF attributes
+# Exif attributes
'exif-compression-1' => 'Ukomprimeret',
'exif-compression-2' => 'CCITT Gruppe 3 1-dimensionel modificeret Huffman run length encoding',
'exif-compression-3' => 'CCITT Gruppe 3 fax-kodning',
@@ -3522,22 +3613,24 @@ Kun indholdet af lister (linjer startende med *) bliver brugt. Den første henvi
'limitall' => 'alle',
# Email address confirmation
-'confirmemail' => 'Bekræft e-mail-adressen',
+'confirmemail' => 'Bekræft e-mailadresse',
'confirmemail_noemail' => 'Du har ikke angivet en gyldig e-mailadresse 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_text' => '{{SITENAME}} kræver, at du bekræfter en e-mailadresse (autentificering), før du kan bruge de udvidede e-mailfunktioner. 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-mailadressen 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-mailadresse. Denne kode skal ikke bruges til at logge på, den kræves til aktivering af e-mailfunktionerne i Wikien.',
-'confirmemail_sendfailed' => 'Bekræftelsesmailen kunne ikke afsendes. Kontroller at e-mail-adressen er korrekt.
+'confirmemail_sendfailed' => '{{SITENAME}} kunne ikke afsende din bekræftelsesmail.
+Kontroller at e-mailadressen er korrekt.
-Svarbesked fra mailserveren: $1',
+Besked 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_needlogin' => 'Du skal $1 for at bekræfte din e-mailadresse.',
+'confirmemail_success' => 'E-mailadressen er blevet bekræftet.
+Du kan nu [[Special:UserLogin|logge på]].',
+'confirmemail_loggedin' => 'Din e-mailadresse er nu bekræftet.',
+'confirmemail_error' => 'Der skete en fejl under lagring af din bekræftelse.',
+'confirmemail_subject' => '[{{SITENAME}}] - bekræftelse af e-mailadresse',
'confirmemail_body' => 'Hej,
Nogen med IP-adresse $1, sandsynligvis dig, har bestilt en bekræftelse af denne e-mailadresse til brugerkontoen "$2" på {{SITENAME}}.
@@ -3550,9 +3643,9 @@ Hvis denne e-mailadresse *ikke* hører til den anførte brugerkonto, skal du i s
--
{{SITENAME}}: {{fullurl:{{Mediawiki:mainpage}}}}',
-'confirmemail_body_changed' => 'Der er nogen, sandsynligvis dig, fra ip-adressen $1, der har ændret emailadressen for kontoen "$2" til denne adresse på {{SITENAME}}.
+'confirmemail_body_changed' => 'Der er nogen, sandsynligvis dig, fra ip-adressen $1, der har ændret e-mailadressen 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:
+For at bekræfte, at denne konto virkeligt tilhører dig og for at genaktivere e-mailfunktionerne på {{SITENAME}}, bedes du åbne følgende link i en browser:
$3
@@ -3684,7 +3777,6 @@ Du kan også [[Special:EditWatchlist|bruge standard editoren]].',
'version-other' => 'Andet',
'version-mediahandlers' => 'Specialhåndtering af mediefiler',
'version-hooks' => 'Funktionstilføjelser',
-'version-extension-functions' => 'Udvidelsesfunktioner',
'version-parser-extensiontags' => 'Tilføjede tags',
'version-parser-function-hooks' => 'Oversætter-funktioner',
'version-hook-name' => 'Navn',
@@ -3693,6 +3785,7 @@ Du kan også [[Special:EditWatchlist|bruge standard editoren]].',
'version-license' => 'Licens',
'version-poweredby-credits' => "Denne wiki er drevet af '''[//www.mediawiki.org/ MediaWiki ]''', copyright © 2001-$1 $2.",
'version-poweredby-others' => 'andre',
+'version-poweredby-translators' => 'translatewiki.net oversættere',
'version-credits-summary' => 'Vi vil gerne anerkende følgende personer for deres bidrag til [[Special:Version|MediaWiki]].',
'version-license-info' => 'MediaWiki er fri 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.
@@ -3706,12 +3799,17 @@ Du skulle have modtaget [{{SERVER}}{{SCRIPTPATH}}/COPYING en kopi af GNU General
'version-entrypoints-header-entrypoint' => 'Indgangspunkt',
'version-entrypoints-header-url' => 'URL',
-# Special:FilePath
-'filepath' => 'Filsti',
-'filepath-page' => 'Fil:',
-'filepath-submit' => 'Vis sti',
-'filepath-summary' => 'Denne specialside giver et direkte link til en fil.
-Billeder vises i fuld opløsning, og andre mediatyper vil blive aktiveret med deres tilhørende program.',
+# Special:Redirect
+'redirect' => 'Omdirigering pga. fil, bruger eller udgave ID',
+'redirect-legend' => 'Omstilling til en fil eller en side',
+'redirect-summary' => "Denne side omdirigerer en (hvis filnavnet er angivet), en side (hvis udgave ID'et er angivet) eller en brugerside (hvis et numerisk brugernummer er angivet).",
+'redirect-submit' => 'Kør',
+'redirect-lookup' => 'Slå op:',
+'redirect-value' => 'Værdi:',
+'redirect-user' => 'Bruger ID',
+'redirect-revision' => 'Sideversion',
+'redirect-file' => 'Filnavn',
+'redirect-not-exists' => 'Værdi ej fundet',
# Special:FileDuplicateSearch
'fileduplicatesearch' => 'Find dubletfiler',
@@ -3765,7 +3863,10 @@ Billeder vises i fuld opløsning, og andre mediatyper vil blive aktiveret med de
'tags-tag' => 'Tagnavn',
'tags-display-header' => 'Udseende på ændringslister',
'tags-description-header' => 'Beskrivelse af betydning',
+'tags-active-header' => 'Aktivt?',
'tags-hitcount-header' => 'Taggede ændringer',
+'tags-active-yes' => 'Ja',
+'tags-active-no' => 'Nej',
'tags-edit' => 'Redigér',
'tags-hitcount' => '{{PLURAL:$1|en ændring|$1 ændringer}}',
@@ -3786,6 +3887,7 @@ Billeder vises i fuld opløsning, og andre mediatyper vil blive aktiveret med de
'dberr-problems' => 'Undskyld! Siden har tekniske problemer.',
'dberr-again' => 'Prøv at vente et par minutter og opdater så siden igen.',
'dberr-info' => '(Kan ikke komme i kontakt med databaseserveren: $1)',
+'dberr-info-hidden' => '(Kan ikke komme i kontakt med databaseserveren)',
'dberr-usegoogle' => 'Du kan prøve at søge med Google imens.',
'dberr-outofdate' => 'Bemærk at deres indeks over vores sider kan være forældet.',
'dberr-cachederror' => 'Det følgende er en mellemlagret kopi af den forespurgte side. Den kan være forældet.',
@@ -3801,6 +3903,9 @@ Billeder vises i fuld opløsning, og andre mediatyper vil blive aktiveret med de
'htmlform-submit' => 'Gem',
'htmlform-reset' => 'Annuller ændringer',
'htmlform-selectorother-other' => 'Anden',
+'htmlform-no' => 'Nej',
+'htmlform-yes' => 'Ja',
+'htmlform-chosen-placeholder' => 'Vælg en mulighed',
# SQLite database support
'sqlite-has-fts' => '$1 med fuld-tekst søgnings support',
@@ -3918,4 +4023,17 @@ Ellers kan du bruge den enkle formular nedenfor. Din kommentar vil blive tilføj
# Image rotation
'rotate-comment' => 'Billedet roteres med $1 {{PLURAL:$1| grad|grader}} med uret',
+# Limit report
+'limitreport-title' => 'Profildata for parser:',
+'limitreport-cputime' => 'Brugt CPU-tid',
+'limitreport-cputime-value' => '$1 {{PLURAL:$1|sekund|sekunder}}',
+'limitreport-walltime' => 'Brugt reel tid',
+'limitreport-walltime-value' => '$1 {{PLURAL:$1|sekund|sekunder}}',
+'limitreport-ppvisitednodes' => 'Antal nodebesøg for preprocessor',
+'limitreport-ppgeneratednodes' => 'Antal noder genereret af preprocessor',
+'limitreport-postexpandincludesize' => 'Inkluderet størrelse efter udvidelse',
+'limitreport-templateargumentsize' => 'Skabelon argumentstørrelse',
+'limitreport-expansiondepth' => 'Største udvidelsesdybde',
+'limitreport-expensivefunctioncount' => 'Antal dyre parserfunktioner',
+
);
diff --git a/languages/messages/MessagesDe.php b/languages/messages/MessagesDe.php
index e840e815..baba6967 100644
--- a/languages/messages/MessagesDe.php
+++ b/languages/messages/MessagesDe.php
@@ -13,6 +13,7 @@
* @author Church of emacs
* @author DaSch
* @author Das Schäfchen
+ * @author DerHexer
* @author Dschwen
* @author Duesentrieb
* @author Filzstift
@@ -55,6 +56,7 @@
* @author Rillke
* @author SVG
* @author Saibo
+ * @author Se4598
* @author Sebastian Wallroth
* @author Shirayuki
* @author Spacebirdy
@@ -165,6 +167,7 @@ $specialPageAliases = array(
'Myuploads' => array( 'Meine_hochgeladenen_Dateien' ),
'Newimages' => array( 'Neue_Dateien' ),
'Newpages' => array( 'Neue_Seiten' ),
+ 'PagesWithProp' => array( 'Seiten_mit_Eigenschaften' ),
'PasswordReset' => array( 'Passwort_neu_vergeben' ),
'PermanentLink' => array( 'Permanenter_Link', 'Permalink' ),
'Popularpages' => array( 'Beliebteste_Seiten' ),
@@ -176,6 +179,7 @@ $specialPageAliases = array(
'Randomredirect' => array( 'Zufällige_Weiterleitung' ),
'Recentchanges' => array( 'Letzte_Änderungen' ),
'Recentchangeslinked' => array( 'Änderungen_an_verlinkten_Seiten' ),
+ 'Redirect' => array( 'Weiterleitung' ),
'Revisiondelete' => array( 'Versionslöschung' ),
'Search' => array( 'Suche' ),
'Shortpages' => array( 'Kürzeste_Seiten' ),
@@ -256,6 +260,8 @@ $magicWords = array(
'fullpagenamee' => array( '1', 'VOLLER_SEITENNAME_URL', 'FULLPAGENAMEE' ),
'subpagename' => array( '1', 'UNTERSEITE', 'SUBPAGENAME' ),
'subpagenamee' => array( '1', 'UNTERSEITE_URL', 'SUBPAGENAMEE' ),
+ 'rootpagename' => array( '1', 'STAMMSEITE', 'ROOTPAGENAME' ),
+ 'rootpagenamee' => array( '1', 'STAMMSEITE_URL', 'ROOTPAGENAMEE' ),
'basepagename' => array( '1', 'OBERSEITE', 'BASEPAGENAME' ),
'basepagenamee' => array( '1', 'OBERSEITE_URL', 'BASEPAGENAMEE' ),
'talkpagename' => array( '1', 'DISKUSSIONSSEITE', 'DISK', 'TALKPAGENAME' ),
@@ -442,9 +448,6 @@ $messages = array(
'tog-shownumberswatching' => 'Anzahl der beobachtenden Benutzer anzeigen',
'tog-oldsig' => 'Vorhandene Signatur:',
'tog-fancysig' => 'Signatur als Wikitext behandeln (ohne automatische Verlinkung)',
-'tog-externaleditor' => 'Externen Editor standardmäßig nutzen (nur für Experten, erfordert spezielle Einstellungen auf dem eigenen Computer. [//www.mediawiki.org/wiki/Manual:External_editors Weitere Informationen hierzu.])',
-'tog-externaldiff' => 'Externes Programm standardmäßig für Versionsunterschiede nutzen (nur für Experten, erfordert spezielle Einstellungen auf dem eigenen Computer. [//www.mediawiki.org/wiki/Manual:External_editors Weitere Informationen hierzu.])',
-'tog-showjumplinks' => '„Wechseln-zu“-Links aktivieren',
'tog-uselivepreview' => 'Vorschau sofort anzeigen (experimentell)',
'tog-forceeditsummary' => 'Warnen, sofern beim Speichern die Zusammenfassung fehlt',
'tog-watchlisthideown' => 'Eigene Bearbeitungen in der Beobachtungsliste ausblenden',
@@ -458,6 +461,8 @@ $messages = array(
'tog-showhiddencats' => 'Anzeige versteckter Kategorien',
'tog-noconvertlink' => 'Konvertierung des Titels deaktivieren',
'tog-norollbackdiff' => 'Unterschied nach dem Zurücksetzen unterdrücken',
+'tog-useeditwarning' => 'Warnen, sofern eine zur Bearbeitung geöffnete Seite verlassen wird, die nicht gespeicherte Änderungen enthält',
+'tog-prefershttps' => 'Wenn angemeldet, immer eine sichere Verbindung benutzen.',
'underline-always' => 'immer',
'underline-never' => 'nie',
@@ -521,6 +526,18 @@ $messages = array(
'oct' => 'Okt.',
'nov' => 'Nov.',
'dec' => 'Dez.',
+'january-date' => '$1. Januar',
+'february-date' => '$1. Februar',
+'march-date' => '$1. März',
+'april-date' => '$1. April',
+'may-date' => '$1. Mai',
+'june-date' => '$1. Juni',
+'july-date' => '$1. Juli',
+'august-date' => '$1. August',
+'september-date' => '$1. September',
+'october-date' => '$1. Oktober',
+'november-date' => '$1. November',
+'december-date' => '$1. Dezember',
# Categories related messages
'pagecategories' => '{{PLURAL:$1|Kategorie|Kategorien}}',
@@ -602,6 +619,7 @@ $messages = array(
'create-this-page' => 'Seite erstellen',
'delete' => 'Löschen',
'deletethispage' => 'Diese Seite löschen',
+'undeletethispage' => 'Diese Seite wiederherstellen',
'undelete_short' => '{{PLURAL:$1|1 Version|$1 Versionen}} wiederherstellen',
'viewdeleted_short' => '{{PLURAL:$1|Eine gelöschte Version|$1 gelöschte Versionen}} ansehen',
'protect' => 'Schützen',
@@ -645,7 +663,7 @@ $1',
'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).
+# 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).
'aboutsite' => 'Ãœber {{SITENAME}}',
'aboutpage' => 'Project:Ãœber_{{SITENAME}}',
'copyright' => 'Der Inhalt ist verfügbar unter der Lizenz $1, sofern nicht anders angegeben.',
@@ -655,7 +673,6 @@ $1',
'disclaimers' => 'Impressum',
'disclaimerpage' => 'Project:Impressum',
'edithelp' => 'Bearbeitungshilfe',
-'edithelppage' => 'Help:Bearbeiten',
'helppage' => 'Help:Inhaltsverzeichnis',
'mainpage' => 'Hauptseite',
'mainpage-description' => 'Hauptseite',
@@ -734,15 +751,12 @@ Alle verfügbaren Spezialseiten sind in der [[Special:SpecialPages|Liste der Spe
# General errors
'error' => 'Fehler',
'databaseerror' => 'Datenbankfehler',
-'dberrortext' => 'Es ist ein Datenbankfehler aufgetreten.
-Der Grund kann ein Programmierfehler sein.
-Die letzte Datenbankabfrage lautete:
-<blockquote><code>$1</code></blockquote>
-aus der Funktion „<code>$2</code>“.
-Die Datenbank meldete den Fehler „<samp>$3: $4</samp>“.',
-'dberrortextcl' => 'Es gab einen Syntaxfehler in der Datenbankabfrage.
-Die letzte Datenbankabfrage lautete: „$1“ aus der Funktion „<tt>$2</tt>“.
-Die Datenbank meldete den Fehler: „<tt>$3: $4</tt>“.',
+'databaseerror-text' => 'Es ist ein Datenbankabfragefehler aufgetreten.
+Dies könnte auf einen Fehler in der Software hindeuten.',
+'databaseerror-textcl' => 'Es ist ein Datenbankabfragefehler aufgetreten.',
+'databaseerror-query' => 'Abfrage: $1',
+'databaseerror-function' => 'Funktion: $1',
+'databaseerror-error' => 'Fehler: $1',
'laggedslavemode' => "'''Achtung:''' Die angezeigte Seite könnte unter Umständen nicht die letzten Bearbeitungen enthalten.",
'readonly' => 'Datenbank gesperrt',
'enterlockreason' => 'Bitte gib einen Grund ein, warum die Datenbank gesperrt werden soll und eine Abschätzung über die Dauer der Sperrung',
@@ -775,6 +789,7 @@ Möglicherweise wurde sie bereits von jemand anderem gelöscht.',
'cannotdelete-title' => 'Seite „$1“ kann nicht gelöscht werden',
'delete-hook-aborted' => 'Die Löschung wurde von einer Programmerweiterung zu MediaWiki verhindert.
Es ist hierzu keine Erklärung verfügbar.',
+'no-null-revision' => 'Die neue Nullversion für die Seite „$1“ konnte nicht erstellt werden',
'badtitle' => 'Ungültiger Titel',
'badtitletext' => 'Der Titel der angeforderten Seite ist ungültig, leer oder ein ungültiger Sprachlink von einem anderen Wiki.',
'perfcached' => 'Die folgenden Daten stammen aus dem Cache und sind möglicherweise nicht aktuell. Maximal {{PLURAL:$1|ein Ergebnis ist|$1 Ergebnisse sind}} im Cache verfügbar.',
@@ -797,12 +812,15 @@ Nutze bitte [//translatewiki.net/ translatewiki.net], das Lokalisierungsprojekt
'editinginterface' => "'''Warnung:''' Diese Seite enthält von der MediaWiki-Software genutzten Text.
Änderungen auf dieser Seite wirken sich auf die Benutzeroberfläche dieses Wikis aus.
Nutze bitte [//translatewiki.net/ translatewiki.net], das Lokalisierungsprojekt von MediaWiki, um Übersetzungen für alle Wikis hinzuzufügen oder zu ändern.",
-'sqlhidden' => '(Die SQL-Datenbankabfrage ist verborgen.)',
'cascadeprotected' => 'Diese Seite ist zur Bearbeitung gesperrt. Sie ist in die {{PLURAL:$1|folgende Seite|folgenden Seiten}} eingebunden, die mittels der Kaskadensperroption geschützt {{PLURAL:$1|ist|sind}}:
$2',
'namespaceprotected' => "Du hast nicht die erforderliche Berechtigung, um Seiten im Namensraum '''$1''' bearbeiten zu können.",
'customcssprotected' => 'Du hast nicht die Berechtigung, diese CSS enthaltende Seite zu bearbeiten, da sie die persönlichen Einstellungen eines anderen Benutzers enthält.',
'customjsprotected' => 'Du hast nicht die Berechtigung, diese JavaScript enthaltende Seite zu bearbeiten, da es sich hierbei um die persönlichen Einstellungen eines anderen Benutzers handelt.',
+'mycustomcssprotected' => 'Du hast keine Berechtigung, diese CSS-Seite zu bearbeiten.',
+'mycustomjsprotected' => 'Du hast keine Berechtigung, diese JavaScript-Seite zu bearbeiten.',
+'myprivateinfoprotected' => 'Du hast keine Berechtigung, deine privaten Informationen zu bearbeiten.',
+'mypreferencesprotected' => 'Du hast keine Berechtigung, deine Einstellungen zu bearbeiten.',
'ns-specialprotected' => 'Spezialseiten können nicht bearbeitet werden.',
'titleprotected' => "Eine Seite mit diesem Namen kann nicht angelegt werden.
Die Sperre wurde durch [[User:$1|$1]] mit der Begründung ''„$2“'' eingerichtet.",
@@ -827,10 +845,19 @@ Beachte, dass einige Seiten noch anzeigen können, dass du angemeldet bist, sola
'welcomecreation-msg' => 'Dein Benutzerkonto wurde erstellt.
Vergiss nicht, deine [[Special:Preferences|{{SITENAME}}-Einstellungen]] zu ändern.',
'yourname' => 'Benutzername:',
+'userlogin-yourname' => 'Benutzername',
+'userlogin-yourname-ph' => 'Gib deinen Benutzernamen ein',
+'createacct-another-username-ph' => 'Benutzername',
'yourpassword' => 'Passwort:',
+'userlogin-yourpassword' => 'Passwort',
+'userlogin-yourpassword-ph' => 'Gib dein Passwort ein',
+'createacct-yourpassword-ph' => 'Gib dein Passwort ein',
'yourpasswordagain' => 'Passwort wiederholen:',
+'createacct-yourpasswordagain' => 'Passwort bestätigen',
+'createacct-yourpasswordagain-ph' => 'Gib das Passwort erneut ein',
'remembermypassword' => 'Mit diesem Browser dauerhaft angemeldet bleiben (maximal $1 {{PLURAL:$1|Tag|Tage}})',
-'securelogin-stick-https' => 'Nach dem Anmelden mit HTTPS verbunden bleiben',
+'userlogin-remembermypassword' => 'Angemeldet bleiben',
+'userlogin-signwithsecure' => 'Sichere Verbindung verwenden',
'yourdomainname' => 'Deine Domain:',
'password-change-forbidden' => 'Du kannst auf diesem Wiki keine Passwörter ändern.',
'externaldberror' => 'Entweder es liegt ein Fehler bei der externen Authentifizierung vor oder du darfst dein externes Benutzerkonto nicht aktualisieren.',
@@ -842,18 +869,44 @@ Vergiss nicht, deine [[Special:Preferences|{{SITENAME}}-Einstellungen]] zu ände
'logout' => 'Abmelden',
'userlogout' => 'Abmelden',
'notloggedin' => 'Nicht angemeldet',
+'userlogin-noaccount' => 'Du hast noch kein Benutzerkonto?',
+'userlogin-joinproject' => '{{SITENAME}} beitreten',
'nologin' => 'Du hast kein Benutzerkonto? $1.',
'nologinlink' => 'Neues Benutzerkonto anlegen',
'createaccount' => 'Benutzerkonto anlegen',
'gotaccount' => "Du hast bereits ein Benutzerkonto? '''$1'''.",
'gotaccountlink' => 'Anmelden',
'userlogin-resetlink' => 'Die Anmeldedaten vergessen?',
+'userlogin-resetpassword-link' => 'Passwort zurücksetzen',
+'helplogin-url' => 'Help:Anmelden',
+'userlogin-helplink' => '[[{{MediaWiki:helplogin-url}}|Hilfe beim Anmelden]]',
+'userlogin-loggedin' => 'Du bist bereits als {{GENDER:$1|$1}} angemeldet.
+Benutze das unten stehende Formular, um sich unter einem anderen Benutzer anzumelden.',
+'userlogin-createanother' => 'Ein weiteres Benutzerkonto erstellen',
+'createacct-join' => 'Gib unten deine Informationen ein.',
+'createacct-another-join' => 'Gib unten die Informationen des neuen Benutzerkontos ein.',
+'createacct-emailrequired' => 'E-Mail-Adresse',
+'createacct-emailoptional' => 'E-Mail-Adresse (optional)',
+'createacct-email-ph' => 'Gib deine E-Mail-Adresse ein',
+'createacct-another-email-ph' => 'E-Mail-Adresse',
'createaccountmail' => 'Ein temporäres Zufallspasswort verwenden und an die angegebene E-Mail-Adresse versenden',
+'createacct-realname' => 'Bürgerlicher Name (optional)',
'createaccountreason' => 'Grund:',
+'createacct-reason' => 'Begründung',
+'createacct-reason-ph' => 'Warum erstellst du ein anderes Benutzerkonto?',
+'createacct-captcha' => 'Sicherheitsprüfung',
+'createacct-imgcaptcha-ph' => 'Gib den Text ein, den du oben siehst.',
+'createacct-submit' => 'Dein Benutzerkonto erstellen',
+'createacct-another-submit' => 'Anderes Benutzerkonto erstellen',
+'createacct-benefit-heading' => '{{SITENAME}} wird von Menschen wie dir geschaffen.',
+'createacct-benefit-body1' => '{{PLURAL:$1|Bearbeitung|Bearbeitungen}}',
+'createacct-benefit-body2' => '{{PLURAL:$1|Seite|Seiten}}',
+'createacct-benefit-body3' => '{{PLURAL:$1|aktiver Autor|aktive Autoren}}',
'badretype' => 'Die beiden Passwörter stimmen nicht überein.',
'userexists' => 'Dieser Benutzername ist schon vergeben.
Bitte wähle einen anderen.',
'loginerror' => 'Fehler bei der Anmeldung',
+'createacct-error' => 'Fehler beim Erstellen des Benutzerkontos',
'createaccounterror' => 'Benutzerkonto konnte nicht erstellt werden: $1',
'nocookiesnew' => 'Der Benutzerzugang wurde erstellt, aber du bist nicht angemeldet. {{SITENAME}} benötigt für diese Funktion Cookies, bitte aktiviere diese und melde dich dann mit deinem neuen Benutzernamen und dem zugehörigen Passwort an.',
'nocookieslogin' => '{{SITENAME}} benutzt Cookies zur Anmeldung der Benutzer. Du hast Cookies deaktiviert, bitte aktiviere diese und versuche es erneut.',
@@ -909,11 +962,13 @@ Besucher, die diese IP-Adresse verwenden, können momentan keine Benutzerkonten
Falls das Benutzerkonto irrtümlich angelegt wurde, kannst du diese Nachricht ignorieren.',
'usernamehasherror' => 'Benutzernamen dürfen kein Rautenzeichen enthalten',
-'login-throttled' => 'Du hast zu oft vergeblich versucht, dich anzumelden.
-Bitte warte etwas, bevor du es erneut versuchst.',
+'login-throttled' => 'Du hast zu oft versucht, dich anzumelden.
+Bitte warte $1, bevor du es erneut probierst.',
'login-abort-generic' => 'Deine Anmeldung war nicht erfolgreich – Abgebrochen',
'loginlanguagelabel' => 'Sprache: $1',
'suspicious-userlogout' => 'Deine Abmeldeanfrage wurde verweigert, da sie vermutlich von einem defekten Browser oder einem Cache-Proxy gesendet wurde.',
+'createacct-another-realname-tip' => 'Der bürgerliche Name ist optional.
+Wenn du ihn angibst, wird er für die Zuordnung der Beiträge verwendet.',
# Email sending
'php-mail-error-unknown' => 'Unbekannter Fehler mit der Funktion mail() von PHP',
@@ -929,8 +984,7 @@ Bitte warte etwas, bevor du es erneut versuchst.',
'newpassword' => 'Neues Passwort:',
'retypenew' => 'Neues Passwort (nochmal):',
'resetpass_submit' => 'Passwort übermitteln und anmelden',
-'resetpass_success' => 'Dein Passwort wurde erfolgreich geändert!
-Du wirst nun angemeldet …',
+'changepassword-success' => 'Dein Passwort wurde erfolgreich geändert!',
'resetpass_forbidden' => 'Das Passwort kann nicht geändert werden.',
'resetpass-no-info' => 'Du musst dich anmelden, um auf diese Seite direkt zuzugreifen.',
'resetpass-submit-loggedin' => 'Passwort ändern',
@@ -942,10 +996,11 @@ Möglicherweise hast du dein Passwort bereits erfolgreich geändert oder ein neu
# Special:PasswordReset
'passwordreset' => 'Passwort zurücksetzen',
-'passwordreset-text' => 'Bitte dieses Formular ausfüllen, um dein Passwort zurückzusetzen.',
+'passwordreset-text-one' => 'Fülle dieses Formular aus, um dein Passwort zurückzusetzen.',
+'passwordreset-text-many' => '{{PLURAL:$1|Füll eines der Felder aus, um dein Passwort zurückzusetzen.}}',
'passwordreset-legend' => 'Passwort zurücksetzen',
'passwordreset-disabled' => 'Das Zurücksetzen von Passwörtern wurde in diesem Wiki deaktiviert.',
-'passwordreset-pretext' => '{{PLURAL:$1||Gib eines der folgenden Daten ein.}}',
+'passwordreset-emaildisabled' => 'Die E-Mail-Funktionen wurden auf diesem Wiki deaktiviert.',
'passwordreset-username' => 'Benutzername:',
'passwordreset-domain' => 'Domain:',
'passwordreset-capture' => 'Die E-Mail-Nachricht ansehen?',
@@ -972,7 +1027,7 @@ $2
Temporäres Passwort: $2',
'passwordreset-emailsent' => 'Eine Passwortzurücksetzungs-E-Mail wurde versandt.',
'passwordreset-emailsent-capture' => 'Eine Passwortzurücksetzungs-E-Mail wurde versandt, die unten angezeigt wird.',
-'passwordreset-emailerror-capture' => 'Die unten angezeigte Passwortzurücksetzungs-E-Mail wurde generiert, allerdings ist der Versand an den Benutzer gescheitert: $1',
+'passwordreset-emailerror-capture' => 'Die unten angezeigte Passwortzurücksetzungs-E-Mail wurde generiert, allerdings ist der Versand an {{GENDER:$2|den Benutzer|die Benutzerin}} gescheitert: $1',
# Special:ChangeEmail
'changeemail' => 'E-Mail-Adresse ändern',
@@ -986,6 +1041,19 @@ Temporäres Passwort: $2',
'changeemail-submit' => 'E-Mail-Adresse ändern',
'changeemail-cancel' => 'Abbrechen',
+# Special:ResetTokens
+'resettokens' => 'Tokens zurücksetzen',
+'resettokens-text' => 'Du kannst Tokens zurücksetzen, die dir den Zugriff auf bestimmte private Daten ermöglichen, die mit deinem Benutzerkonto hier verknüpft sind.
+
+Du solltest dies nur machen, wenn du die Tokens versehentlich mit jemandem geteilt hast oder dein Konto gefährdet ist.',
+'resettokens-no-tokens' => 'Es gibt keine Tokens zum Zurücksetzen.',
+'resettokens-legend' => 'Tokens zurücksetzen',
+'resettokens-tokens' => 'Tokens:',
+'resettokens-token-label' => '$1 (aktueller Wert: $2)',
+'resettokens-watchlist-token' => 'Token für den Webfeed (Atom/RSS) der [[Special:Watchlist|Änderungen an Seiten auf deiner Beobachtungsliste]]',
+'resettokens-done' => 'Tokens zurückgesetzt.',
+'resettokens-resetbutton' => 'Ausgewählte Tokens zurücksetzen',
+
# Edit page toolbar
'bold_sample' => 'Fetter Text',
'bold_tip' => 'Fetter Text',
@@ -1178,11 +1246,14 @@ Zu deiner Information folgt das Lösch- und Verschiebungs-Logbuch mit der Begrü
Sie wurde anscheinend gelöscht.',
'edit-conflict' => 'Bearbeitungskonflikt.',
'edit-no-change' => 'Deine Bearbeitung wurde ignoriert, da keine Änderung an dem Text vorgenommen wurde.',
+'postedit-confirmation' => 'Deine Bearbeitung wurde gespeichert.',
'edit-already-exists' => 'Die neue Seite konnte nicht erstellt werden, da sie bereits vorhanden ist.',
'defaultmessagetext' => 'Standardtext',
'content-failed-to-parse' => 'Parsen des Inhalts $2 für Modell $1 fehlgeschlagen: $3',
'invalid-content-data' => 'Ungültige Inhaltsdaten',
'content-not-allowed-here' => 'Der Inhalt „$1“ ist auf der Seite [[$2]] nicht erlaubt',
+'editwarning-warning' => 'Das Verlassen dieser Seite kann dazu führen, dass deine Änderungen verloren gehen.
+Wenn du angemeldet bist, kannst du das Anzeigen dieser Warnung im Bereich „Bearbeiten“ deiner Einstellungen abschalten.',
# Content models
'content-model-wikitext' => 'Wikitext',
@@ -1216,6 +1287,7 @@ Bitte prüfe den Vergleich unten, um sicherzustellen, dass du dies tun möchtest
'undo-failure' => 'Die Änderung konnte nicht rückgängig gemacht werden, da der betroffene Abschnitt zwischenzeitlich verändert wurde.',
'undo-norev' => 'Die Bearbeitung konnte nicht rückgängig gemacht werden, da sie nicht vorhanden ist oder gelöscht wurde.',
'undo-summary' => 'Änderung $1 von [[Special:Contributions/$2|$2]] ([[User talk:$2|Diskussion]]) rückgängig gemacht.',
+'undo-summary-username-hidden' => 'Änderung $1 eines versteckten Benutzers rückgängig gemacht.',
# Account creation failure
'cantcreateaccounttitle' => 'Das Benutzerkonto kann nicht erstellt werden',
@@ -1393,6 +1465,7 @@ Stelle sicher, dass die Versionsgeschichte einer Seite historisch korrekt ist.',
'compareselectedversions' => 'Gewählte Versionen vergleichen',
'showhideselectedversions' => 'Gewählte Versionen zeigen/verstecken',
'editundo' => 'rückgängig machen',
+'diff-empty' => '(kein Unterschied)',
'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)',
'difference-missing-revision' => '{{PLURAL:$2|Eine Version|$2 Versionen}} dieser Unterschiedsanzeige ($1) {{PLURAL:$2|wurde|wurden}} nicht gefunden.
@@ -1420,7 +1493,6 @@ Einzelheiten sind im [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}}
'searchmenu-legend' => 'Suchoptionen',
'searchmenu-exists' => "'''Es gibt eine Seite, die den Namen „[[:$1]]“ hat.'''",
'searchmenu-new' => "'''Erstelle die Seite „[[:$1]]“ in diesem Wiki.'''",
-'searchhelp-url' => 'Help:Hilfe',
'searchmenu-prefix' => '[[Special:PrefixIndex/$1|Zeige alle Seiten, die mit dem Suchbegriff anfangen]]',
'searchprofile-articles' => 'Inhaltsseiten',
'searchprofile-project' => 'Hilfe- und Projektseiten',
@@ -1461,15 +1533,7 @@ Einzelheiten sind im [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}}
'powersearch-togglenone' => 'Keine',
'search-external' => 'Externe Suche',
'searchdisabled' => 'Die {{SITENAME}}-Suche ist deaktiviert. Du kannst unterdessen mit Google suchen. Bitte bedenke, dass der Suchindex von {{SITENAME}} veraltet sein kann.',
-
-# Quickbar
-'qbsettings' => 'Seitenleiste',
-'qbsettings-none' => 'Keine',
-'qbsettings-fixedleft' => 'Links, fest',
-'qbsettings-fixedright' => 'Rechts, fest',
-'qbsettings-floatingleft' => 'Links, schwebend',
-'qbsettings-floatingright' => 'Rechts, schwebend',
-'qbsettings-directionality' => 'Fest, abhängig von der Schreibrichtung der gewählten Sprache',
+'search-error' => 'Bei der Suche ist ein Fehler aufgetreten: $1',
# Preferences page
'preferences' => 'Einstellungen',
@@ -1503,7 +1567,6 @@ Einzelheiten sind im [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}}
'resetprefs' => 'Eingaben verwerfen',
'restoreprefs' => 'Alle Standardeinstellungen wiederherstellen (in allen Abschnitten)',
'prefs-editing' => 'Bearbeiten',
-'prefs-edit-boxsize' => 'Größe des Bearbeitungsfensters:',
'rows' => 'Zeilen:',
'columns' => 'Spalten:',
'searchresultshead' => 'Suche',
@@ -1514,9 +1577,9 @@ Einzelheiten sind im [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}}
'recentchangesdays-max' => 'Maximal $1 {{PLURAL:$1|Tag|Tage}}',
'recentchangescount' => 'Anzahl der standardmäßig angezeigten Bearbeitungen:',
'prefs-help-recentchangescount' => 'Dies umfasst die Liste der letzten Änderungen, die Versionsgeschichte und die Logbücher.',
-'prefs-help-watchlist-token' => 'Das Ausfüllen dieses Feldes mit einem geheimen Schlüssel generiert einen RSS-Feed für deine Beobachtungsliste.
-Jeder, der diesen Schlüssel kennt, kann deine Beobachtungsliste einsehen. Wähle also einen sicheren Wert.
-Hier ein zufällig generierter Wert, den du verwenden kannst: $1',
+'prefs-help-watchlist-token2' => 'Dies ist der geheime Schlüssel zum Webfeed deiner Beobachtungsliste.
+Jeder, der ihn kennt, kann deine Beobachtungsliste lesen. Teile ihn deshalb nicht.
+[[Special:ResetTokens|Klicke hier, wenn du ihn zurücksetzen musst]].',
'savedprefs' => 'Deine Einstellungen wurden gespeichert.',
'timezonelegend' => 'Zeitzone:',
'localtime' => 'Ortszeit:',
@@ -1547,7 +1610,6 @@ Hier ein zufällig generierter Wert, den du verwenden kannst: $1',
'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:',
-'prefs-textboxsize' => 'Größe des Bearbeitungsfensters',
'youremail' => 'E-Mail-Adresse:',
'username' => '{{GENDER:$1|Benutzername}}:',
'uid' => '{{GENDER:$1|Benutzerkennung}}:',
@@ -1581,6 +1643,8 @@ Diese Information ist öffentlich.',
'prefs-dateformat' => 'Datumsformat',
'prefs-timeoffset' => 'Zeitunterschied',
'prefs-advancedediting' => 'Allgemeine Optionen',
+'prefs-editor' => 'Bearbeitungsprogramm',
+'prefs-preview' => 'Vorschau',
'prefs-advancedrc' => 'Erweiterte Optionen',
'prefs-advancedrendering' => 'Erweiterte Optionen',
'prefs-advancedsearchoptions' => 'Erweiterte Optionen',
@@ -1588,7 +1652,9 @@ Diese Information ist öffentlich.',
'prefs-displayrc' => 'Anzeigeoptionen',
'prefs-displaysearchoptions' => 'Anzeigeoptionen',
'prefs-displaywatchlist' => 'Anzeigeoptionen',
+'prefs-tokenwatchlist' => 'Token',
'prefs-diffs' => 'Versionsvergleich',
+'prefs-help-prefershttps' => 'Diese Einstellung wird bei deiner nächsten Anmeldung wirksam',
# User preference: email validation using jQuery
'email-address-validity-valid' => 'Diese E-Mail-Adresse scheint gültig zu sein.',
@@ -1616,6 +1682,8 @@ Diese Information ist öffentlich.',
'userrights-notallowed' => 'Du verfügst nicht über die erforderlichen Berechtigungen, um Benutzerrechte vergeben oder entziehen zu können.',
'userrights-changeable-col' => 'Gruppenzugehörigkeit, die du ändern kannst',
'userrights-unchangeable-col' => 'Gruppenzugehörigkeit, die du nicht ändern kannst',
+'userrights-conflict' => 'Benutzerrechteänderungskonflikt! Bitte überprüfe und bestätige deine Änderungen.',
+'userrights-removed-self' => 'Du hast deine eigenen Rechte erfolgreich entfernt. Du kannst nicht länger auf diese Seite zugreifen.',
# Groups
'group' => 'Gruppe:',
@@ -1681,11 +1749,19 @@ Diese Information ist öffentlich.',
'right-proxyunbannable' => 'Ausnahme von automatischen Proxysperren',
'right-unblockself' => 'Sich entsperren',
'right-protect' => 'Seitenschutzstatus ändern und kaskadengeschützte Seiten bearbeiten',
-'right-editprotected' => 'Geschützte Seiten bearbeiten (ohne Kaskadenschutz)',
+'right-editprotected' => 'Seiten bearbeiten, die als „{{int:protect-level-sysop}}“ geschützt sind',
+'right-editsemiprotected' => 'Seiten bearbeiten, die als „{{int:protect-level-autoconfirmed}}“ geschützt sind',
'right-editinterface' => 'Benutzeroberfläche bearbeiten',
'right-editusercssjs' => 'Fremde CSS- und JavaScript-Dateien bearbeiten',
'right-editusercss' => 'Fremde CSS-Dateien bearbeiten',
'right-edituserjs' => 'Fremde JavaScript-Dateien bearbeiten',
+'right-editmyusercss' => 'Eigene Benutzer-CSS-Dateien bearbeiten',
+'right-editmyuserjs' => 'Eigene Benutzer-JavaScript-Dateien bearbeiten',
+'right-viewmywatchlist' => 'Eigene Beobachtungsliste ansehen',
+'right-editmywatchlist' => 'Eigene Beobachtungsliste bearbeiten. Einige Aktionen ermöglichen das Hinzufügen von Seiten ohne dieses Recht.',
+'right-viewmyprivateinfo' => 'Eigene private Daten ansehen (beispielsweise E-Mail-Adresse, bürgerlicher Name)',
+'right-editmyprivateinfo' => 'Eigene private Daten bearbeiten (beispielsweise E-Mail-Adresse, bürgerlicher Name)',
+'right-editmyoptions' => 'Eigene Einstellungen bearbeiten',
'right-rollback' => 'Schnelles Zurücksetzen',
'right-markbotedits' => 'Schnell zurückgesetzte Bearbeitungen als Bot-Bearbeitung markieren',
'right-noratelimit' => 'Keine Beschränkung durch Limits',
@@ -1747,12 +1823,19 @@ Diese Information ist öffentlich.',
'action-userrights-interwiki' => 'die Rechte von Benutzern in anderen Wikis zu ändern',
'action-siteadmin' => 'die Datenbank zu sperren oder freizugeben',
'action-sendemail' => 'E-Mails zu senden',
+'action-editmywatchlist' => 'deine Beobachtungsliste zu bearbeiten',
+'action-viewmywatchlist' => 'deine Beobachtungsliste anzusehen',
+'action-viewmyprivateinfo' => 'deine privaten Informationen einzusehen',
+'action-editmyprivateinfo' => 'deine privaten Informationen zu bearbeiten',
# Recent changes
'nchanges' => '$1 {{PLURAL:$1|Änderung|Änderungen}}',
+'enhancedrc-since-last-visit' => '$1 {{PLURAL:$1|seit dem letzten Besuch}}',
+'enhancedrc-history' => 'Versionsgeschichte',
'recentchanges' => 'Letzte Änderungen',
'recentchanges-legend' => 'Anzeigeoptionen',
'recentchanges-summary' => 'Auf dieser Seite kannst du die letzten Änderungen in diesem Wiki nachverfolgen.',
+'recentchanges-noresult' => 'Keine Änderungen während des angegebenen Zeitraums entsprechen diesen Kriterien.',
'recentchanges-feed-description' => 'Verfolge mit diesem Feed die letzten Änderungen in {{SITENAME}}.',
'recentchanges-label-newpage' => 'Neue Seite',
'recentchanges-label-minor' => 'Kleine Änderung',
@@ -1791,7 +1874,6 @@ Stand: $4, $5 Uhr.",
'recentchangeslinked-feed' => 'Änderungen an verlinkten Seiten',
'recentchangeslinked-toolbox' => 'Änderungen an verlinkten Seiten',
'recentchangeslinked-title' => 'Änderungen an Seiten, die von „$1“ verlinkt sind',
-'recentchangeslinked-noresult' => 'Im ausgewählten Zeitraum wurden an den verlinkten Seiten keine Änderungen vorgenommen.',
'recentchangeslinked-summary' => "Diese Spezialseite listet die letzten Änderungen an den verlinkten Seiten auf (bzw. bei Kategorien an den Mitgliedern dieser Kategorie). Seiten auf deiner [[Special:Watchlist|Beobachtungsliste]] sind '''fett''' dargestellt.",
'recentchangeslinked-page' => 'Seite:',
'recentchangeslinked-to' => 'Zeige Änderungen auf Seiten, die hierher verlinken',
@@ -1802,7 +1884,7 @@ Stand: $4, $5 Uhr.",
'reuploaddesc' => 'Abbrechen und zurück zur Hochladen-Seite',
'upload-tryagain' => 'Geänderte Dateibeschreibung abschicken',
'uploadnologin' => 'Nicht angemeldet',
-'uploadnologintext' => 'Du musst [[Special:UserLogin|angemeldet]] sein, um Dateien hochladen zu können.',
+'uploadnologintext' => 'Du musst dich $1, um Dateien hochladen zu können.',
'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',
@@ -2029,7 +2111,6 @@ Aus Sicherheitsgründen ist img_auth.php deaktiviert.',
'http-read-error' => 'HTTP-Lesefehler.',
'http-timed-out' => 'Zeitüberschreitung bei der HTTP-Anfrage.',
'http-curl-error' => 'Fehler beim Abruf der URL: $1',
-'http-host-unreachable' => 'URL konnte nicht erreicht werden.',
'http-bad-status' => 'Während der HTTP-Anfrage ist ein Fehler aufgetreten: $1 $2',
# Some likely curl errors. More could be added from <http://curl.haxx.se/libcurl/c/libcurl-errors.html>
@@ -2057,6 +2138,10 @@ Aus Sicherheitsgründen ist img_auth.php deaktiviert.',
'listfiles_size' => 'Größe',
'listfiles_description' => 'Beschreibung',
'listfiles_count' => 'Versionen',
+'listfiles-show-all' => 'Alte Bildversionen einschließen',
+'listfiles-latestversion' => 'Aktuelle Version',
+'listfiles-latestversion-yes' => 'Ja',
+'listfiles-latestversion-no' => 'Nein',
# File description page
'file-anchor-link' => 'Datei',
@@ -2151,6 +2236,13 @@ Vielleicht möchtest du die Beschreibung auf der dortigen [$2 Dateibeschreibungs
'randompage' => 'Zufällige Seite',
'randompage-nopages' => 'Es sind keine Seiten {{PLURAL:$2|im folgenden Namensraum|in den folgenden Namensräumen}} enthalten: „$1“',
+# Random page in category
+'randomincategory' => 'Zufällige Seite einer Kategorie',
+'randomincategory-invalidcategory' => '„$1“ ist kein gültiger Kategorienname.',
+'randomincategory-nopages' => 'Es gibt keine Seiten in [[:Category:$1]].',
+'randomincategory-selectcategory' => 'Zufällige Seite aus der Kategorie: $1 $2',
+'randomincategory-selectcategory-submit' => 'Los',
+
# Random redirect
'randomredirect' => 'Zufällige Weiterleitung',
'randomredirect-nopages' => 'Im Namensraum „$1“ sind keine Weiterleitungen vorhanden.',
@@ -2176,17 +2268,13 @@ Vielleicht möchtest du die Beschreibung auf der dortigen [$2 Dateibeschreibungs
'statistics-users-active-desc' => 'Benutzer mit Bearbeitungen {{PLURAL:$1|während der letzten 24 Stunden|während der vergangenen $1 Tage}}',
'statistics-mostpopular' => 'Meistbesuchte Seiten',
-'disambiguations' => 'Seiten die auf Begriffsklärungsseiten verlinken',
-'disambiguationspage' => 'Template:Begriffsklärung',
-'disambiguations-text' => "Die folgenden Seiten enthalten mindestens einen Link zur einer '''Begriffsklärungsseite'''. Stattdessen sollten sie möglicherweise auf die eigentlich gemeinte Seite verlinken.
-
-Eine Seite gilt als Begriffsklärungsseite, wenn sie mindestens eine der auf der Seite [[MediaWiki:Disambiguationspage|Disambiguationspage]] aufgeführten Vorlagen enthält.",
-
'pageswithprop' => 'Seiten mit einer Seiteneigenschaft',
'pageswithprop-legend' => 'Seiten mit einer Seiteneigenschaft',
'pageswithprop-text' => 'Diese Spezialseite listet Seiten auf, die eine bestimmte Seiteneigenschaft verwenden.',
'pageswithprop-prop' => 'Eigenschaftsname:',
'pageswithprop-submit' => 'Los',
+'pageswithprop-prophidden-long' => 'Langtexteigenschaftswert versteckt ($1)',
+'pageswithprop-prophidden-binary' => 'Binäreigenschaftswert versteckt ($1)',
'doubleredirects' => 'Doppelte Weiterleitungen',
'doubleredirectstext' => 'Diese Liste enthält Weiterleitungen, die auf Weiterleitungen verlinken.
@@ -2244,6 +2332,7 @@ Jede Zeile enthält Links zur ersten und zweiten Weiterleitung sowie dem Ziel de
'mostrevisions' => 'Seiten mit den meisten Versionen',
'prefixindex' => 'Alle Seiten (mit Präfix)',
'prefixindex-namespace' => 'Alle Seiten mit Präfix (Namensraum $1)',
+'prefixindex-strip' => 'Präfix in der Liste abschneiden',
'shortpages' => 'Kurze Seiten',
'longpages' => 'Lange Seiten',
'deadendpages' => 'Nicht verlinkende Seiten',
@@ -2259,6 +2348,7 @@ Jede Zeile enthält Links zur ersten und zweiten Weiterleitung sowie dem Ziel de
'listusers' => 'Benutzerverzeichnis',
'listusers-editsonly' => 'Zeige nur Benutzer mit Beiträgen',
'listusers-creationsort' => 'Nach Erstelldatum sortieren',
+'listusers-desc' => 'In absteigender Reihenfolge sortieren',
'usereditcount' => '$1 {{PLURAL:$1|Bearbeitung|Bearbeitungen}}',
'usercreated' => '{{GENDER:$3|Erstellt}} am $1 um $2 Uhr',
'newpages' => 'Neue Seiten',
@@ -2434,10 +2524,9 @@ Spätere Änderungen an dieser Seite und der zugehörigen Diskussionsseite werde
'unwatchthispage' => 'Nicht mehr beobachten',
'notanarticle' => 'Keine Seite',
'notvisiblerev' => 'Version wurde gelöscht',
-'watchnochange' => 'Keine der von dir beobachteten Seiten wurde während des angezeigten Zeitraums bearbeitet.',
'watchlist-details' => 'Du beobachtest {{PLURAL:$1|eine Seite|$1 Seiten}}, ohne dass Diskussionsseiten gezählt werden.',
-'wlheader-enotif' => '* Der E-Mail-Benachrichtigungsdienst ist aktiviert.',
-'wlheader-showupdated' => "* Seiten mit noch nicht gesehenen Änderungen werden '''fett''' dargestellt",
+'wlheader-enotif' => 'Der E-Mail-Benachrichtigungsdienst ist aktiviert.',
+'wlheader-showupdated' => "Seiten mit noch nicht gesehenen Änderungen werden '''fett''' dargestellt.",
'watchmethod-recent' => 'Überprüfen der letzten Bearbeitungen für die Beobachtungsliste',
'watchmethod-list' => 'Überprüfen der Beobachtungsliste nach letzten Bearbeitungen',
'watchlistcontains' => 'Deine Beobachtungsliste enthält $1 {{PLURAL:$1|Seite|Seiten}}.',
@@ -2675,7 +2764,7 @@ $1',
'contributions' => '{{GENDER:$1|Benutzerbeiträge}}',
'contributions-title' => 'Benutzerbeiträge von „$1“',
'mycontris' => 'Beiträge',
-'contribsub2' => 'Für $1 ($2)',
+'contribsub2' => 'Von {{GENDER:$3|$1}} ($2)',
'nocontribs' => 'Es wurden keine Benutzerbeiträge mit diesen Kriterien gefunden.',
'uctop' => '(aktuell)',
'month' => 'und Monat:',
@@ -2830,13 +2919,11 @@ Siehe die [[Special:BlockList|Liste der gesperrten IP-Adressen und Benutzernamen
'ipb_blocked_as_range' => 'Fehler: Die IP-Adresse $1 wurde als Teil der Bereichssperre $2 indirekt gesperrt. Eine Entsperrung von $1 alleine ist nicht möglich.',
'ip_range_invalid' => 'Ungültiger IP-Adressbereich.',
'ip_range_toolarge' => 'Adressbereiche, die größer als /$1 sind, sind nicht erlaubt.',
-'blockme' => 'Sperre mich',
'proxyblocker' => 'Proxy blocker',
-'proxyblocker-disabled' => 'Diese Funktion ist deaktiviert.',
'proxyblockreason' => 'Deine IP-Adresse wurde gesperrt, da sie ein offener Proxy ist. Bitte kontaktiere deinen Internet-Provider oder deine Systemadministratoren und informiere sie über dieses mögliche Sicherheitsproblem.',
-'proxyblocksuccess' => 'Erledigt.',
'sorbsreason' => 'Die IP-Adresse ist in der DNSBL von {{SITENAME}} als offener PROXY gelistet.',
'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.',
+'xffblockreason' => 'Eine IP-Adresse im X-Forwarded-For-Header wurde gesperrt, entweder deine oder die des benutzten Proxyservers. Der ursprüngliche Sperrgrund war: $1',
'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',
@@ -2998,6 +3085,8 @@ Bitte besuche die Seiten [//www.mediawiki.org/wiki/Localisation MediaWiki-Lokali
'thumbnail-more' => 'vergrößern',
'filemissing' => 'Datei fehlt',
'thumbnail_error' => 'Fehler beim Erstellen des Vorschaubildes: $1',
+'thumbnail_error_remote' => 'Fehlermeldung von $1:
+$2',
'djvu_page_error' => 'DjVu-Seite außerhalb des Seitenbereichs',
'djvu_no_xml' => 'XML-Daten können für die DjVu-Datei nicht abgerufen werden',
'thumbnail-temp-create' => 'Die Datei für die temporäre Miniaturansicht konnte nicht erstellt werden',
@@ -3143,20 +3232,15 @@ Diese auf dem lokalen Rechner speichern und danach hier hochladen.',
'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.',
+'tooltip-iwiki' => '$1 – $2',
# Stylesheets
'common.css' => '/* Das folgende CSS wird für alle Benutzeroberflächen geladen. */',
-'standard.css' => '/* Das folgende CSS wird für Benutzer der Klassik-Benutzeroberfläche geladen. Für allgemeingültige Benutzeroberflächen-Anpassungen bitte [[MediaWiki:Common.css]] bearbeiten. */',
-'nostalgia.css' => '/* Das folgende CSS wird für Benutzer der Nostalgie-Benutzeroberfläche geladen. */',
'cologneblue.css' => '/* Das folgende CSS wird für Benutzer der Kölnisch-Blau-Benutzeroberfläche geladen. Für allgemeingültige Benutzeroberflächen-Anpassungen bitte [[MediaWiki:Common.css]] bearbeiten. */',
'monobook.css' => '/* Das folgende CSS wird für Benutzer der MonoBook-Benutzeroberfläche geladen */',
-'myskin.css' => '/* Das folgende CSS wird für Benutzer der MySkin-Benutzeroberfläche geladen. Für allgemeingültige Benutzeroberflächen-Anpassungen bitte [[MediaWiki:Common.css]] bearbeiten. */',
-'chick.css' => '/* Das folgende CSS wird für Benutzer der Küken-Benutzeroberfläche geladen. Für allgemeingültige Benutzeroberflächen-Anpassungen bitte [[MediaWiki:Common.css]] bearbeiten. */',
-'simple.css' => '/* Das folgende CSS wird für Benutzer der Einfach-Benutzeroberfläche geladen. Für allgemeingültige Benutzeroberflächen-Anpassungen bitte [[MediaWiki:Common.css]] bearbeiten. */',
'modern.css' => '/* Das folgende CSS wird für Benutzer der Modern-Benutzeroberfläche geladen. Für allgemeingültige Benutzeroberflächen-Anpassungen bitte MediaWiki:Common.css bearbeiten. */',
'vector.css' => '/* Das folgende CSS wird für Benutzer der Vector-Benutzeroberfläche geladen. Für allgemeingültige Benutzeroberflächen-Anpassungen bitte [[MediaWiki:Common.css]] bearbeiten. */',
'print.css' => '/* Das folgende CSS wird in der Druckausgabe geladen. */',
-'handheld.css' => '/* Das folgende CSS wird für Handheld-Geräte, basierend auf der in $wgHandheldStyle konfigurierten Benutzeroberfläche, geladen. */',
'noscript.css' => '/* Das folgende CSS wirkt sich für Benutzer aus, die JavaScript deaktiviert haben */',
'group-autoconfirmed.css' => '/* CSS an dieser Stelle wirkt sich nur auf automatisch bestätigte Benutzer aus */',
'group-bot.css' => '/* CSS an dieser Stelle wirkt sich nur auf Bots aus */',
@@ -3165,13 +3249,8 @@ Diese auf dem lokalen Rechner speichern und danach hier hochladen.',
# Scripts
'common.js' => '/* Das folgende JavaScript wird für alle Benutzer geladen. */',
-'standard.js' => '/* Das folgende JavaScript wird für Benutzer der Klassik-Benutzeroberfläche geladen. Allgemeingültiges JavaScript bitte in [[MediaWiki:Common.js]] eintragen. */',
-'nostalgia.js' => '/* Das folgende JavaScript wird für Benutzer der Nostalgie-Benutzeroberfläche geladen. */',
'cologneblue.js' => '/* Das folgende JavaScript wird für Benutzer der Kölnisch-Blau-Benutzeroberfläche geladen. Allgemeingültiges JavaScript bitte in [[MediaWiki:Common.js]] eintragen. */',
'monobook.js' => '/* Das folgende JavaScript wird für Benutzer der Monobook-Benutzeroberfläche geladen. */',
-'myskin.js' => '/* Das folgende JavaScript wird für Benutzer der MySkin-Benutzeroberfläche geladen. Allgemeingültiges JavaScript bitte in [[MediaWiki:Common.js]] eintragen. */',
-'chick.js' => '/* Das folgende JavaScript wird für Benutzer der Küken-Benutzeroberfläche geladen. Allgemeingültiges JavaScript bitte in [[MediaWiki:Common.js]] eintragen. */',
-'simple.js' => '/* Das folgende JavaScript wird für Benutzer der Einfach-Benutzeroberfläche geladen. Allgemeingültiges JavaScript bitte in [[MediaWiki:Common.js]] eintragen. */',
'modern.js' => '/* Das folgende JavaScript wird für Benutzer der Modern-Benutzeroberfläche geladen. Allgemeingültiges JavaScript bitte in [[MediaWiki:Common.js]] eintragen. */',
'vector.js' => '/* Das folgende JavaScript wird für Benutzer der Vector-Benutzeroberfläche geladen. Allgemeingültiges JavaScript bitte in [[MediaWiki:Common.js]] eintragen. */',
'group-autoconfirmed.js' => '/* Das folgende JavaScript wird nur für automatisch bestätigte Benutzer geladen. */',
@@ -3252,13 +3331,8 @@ Das liegt wahrscheinlich an einem Link auf eine externe Seite.',
'pageinfo-category-files' => 'Anzahl der Dateien',
# Skin names
-'skinname-standard' => 'Klassik',
-'skinname-nostalgia' => 'Nostalgie',
'skinname-cologneblue' => 'Kölnisch Blau',
'skinname-monobook' => 'MonoBook',
-'skinname-myskin' => 'MySkin',
-'skinname-chick' => 'Küken',
-'skinname-simple' => 'Einfach',
'skinname-modern' => 'Modern',
'skinname-vector' => 'Vector',
@@ -3337,11 +3411,25 @@ Durch das Herunterladen und Öffnen der Datei kann dein Computer beschädigt wer
'minutes' => '{{PLURAL:$1|$1 Minute|$1 Minuten}}',
'hours' => '{{PLURAL:$1|1 Stunde|$1 Stunden}}',
'days' => '{{PLURAL:$1|$1 Tag|$1 Tage}}',
+'weeks' => '{{PLURAL:$1|$1 Woche|$1 Wochen}}',
'months' => '{{PLURAL:$1|1 Monat|$1 Monate}}',
'years' => '{{PLURAL:$1|1 Jahr|$1 Jahre}}',
'ago' => 'vor $1',
'just-now' => 'gerade eben',
+# Human-readable timestamps
+'hours-ago' => 'vor {{PLURAL:$1|einer Stunde|$1 Stunden}}',
+'minutes-ago' => 'vor {{PLURAL:$1|einer Minute|$1 Minuten}}',
+'seconds-ago' => 'vor {{PLURAL:$1|einer Sekunde|$1 Sekunden}}',
+'monday-at' => 'Montag um $1',
+'tuesday-at' => 'Dienstag um $1',
+'wednesday-at' => 'Mittwoch um $1',
+'thursday-at' => 'Donnerstag um $1',
+'friday-at' => 'Freitag um $1',
+'saturday-at' => 'Samstag um $1',
+'sunday-at' => 'Sonntag um $1',
+'yesterday-at' => 'Gestern um $1',
+
# Bad image list
'bad_image_list' => 'Format:
@@ -3369,7 +3457,7 @@ Weitere werden standardmäßig nicht angezeigt.
* gpslongitude
* gpsaltitude',
-# EXIF tags
+# Exif tags
'exif-imagewidth' => 'Breite',
'exif-imagelength' => 'Höhe',
'exif-bitspersample' => 'Bits pro Farbkomponente',
@@ -3547,7 +3635,7 @@ Weitere werden standardmäßig nicht angezeigt.
'exif-originalimageheight' => 'Bildhöhe vor dem Zuschneiden',
'exif-originalimagewidth' => 'Bildbreite vor dem Zuschneiden',
-# EXIF attributes
+# Exif attributes
'exif-compression-1' => 'Unkomprimiert',
'exif-compression-2' => 'CCITT Gruppe 3 1-dimensionale modifizierte Huffman-Lauflängenkodierung',
'exif-compression-3' => 'CCITT Gruppe 3 Faxcodierung',
@@ -3956,7 +4044,6 @@ Du kannst auch die [[Special:EditWatchlist|Standardseite]] zum Bearbeiten benutz
'version-other' => 'Sonstige Erweiterungen',
'version-mediahandlers' => 'Mediennutzungserweiterungen',
'version-hooks' => "Schnittstellen ''(Hooks)''",
-'version-extension-functions' => 'Funktionsaufrufe',
'version-parser-extensiontags' => "Parsererweiterungen ''(Tags)''",
'version-parser-function-hooks' => "Parsererweiterungen ''(Funktionen)''",
'version-hook-name' => 'Schnittstellenname',
@@ -3966,6 +4053,7 @@ Du kannst auch die [[Special:EditWatchlist|Standardseite]] zum Bearbeiten benutz
'version-license' => 'Lizenz',
'version-poweredby-credits' => "Diese Website nutzt '''[//www.mediawiki.org/wiki/MediaWiki/de MediaWiki]''', Copyright © 2001–$1 $2.",
'version-poweredby-others' => 'andere',
+'version-poweredby-translators' => 'Ãœbersetzer von translatewiki.net',
'version-credits-summary' => 'Wir danken folgenden Personen für ihre Beiträge zu [[Special:Version|MediaWiki]].',
'version-license-info' => "MediaWiki ist eine 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.
@@ -3981,11 +4069,17 @@ Eine [{{SERVER}}{{SCRIPTPATH}}/COPYING Kopie der ''GNU General Public License'']
'version-entrypoints-articlepath' => '[https://www.mediawiki.org/wiki/Manual:$wgArticlePath Artikelpfad]',
'version-entrypoints-scriptpath' => '[https://www.mediawiki.org/wiki/Manual:$wgScriptPath Skriptpfad]',
-# Special:FilePath
-'filepath' => 'Dateipfad',
-'filepath-page' => 'Datei:',
-'filepath-submit' => 'Los',
-'filepath-summary' => 'Mit dieser Spezialseite lässt sich der komplette Pfad der aktuellen Version einer Datei ohne Umweg abfragen. Die angefragte Datei wird direkt dargestellt bzw. mit der verknüpften Anwendung gestartet.',
+# Special:Redirect
+'redirect' => 'Weiterleitung auf Benutzerseite, Seitenversion oder Datei',
+'redirect-legend' => 'Weiterleitung auf eine Benutzerseite, Seitenversion oder Datei',
+'redirect-summary' => 'Diese Spezialseite leitet auf eine Benutzerseite (numerische Benutzerkennung angegeben), Seitenversion (Versionskennung angegeben) oder Datei (Dateiname angegeben) weiter.',
+'redirect-submit' => 'Los',
+'redirect-lookup' => 'Suchen:',
+'redirect-value' => 'Kennung oder Dateiname:',
+'redirect-user' => 'Benutzerseite',
+'redirect-revision' => 'Seitenversion',
+'redirect-file' => 'Datei',
+'redirect-not-exists' => 'Der Wert wurde nicht gefunden',
# Special:FileDuplicateSearch
'fileduplicatesearch' => 'Dateiduplikatsuche',
@@ -4035,6 +4129,7 @@ Eine [{{SERVER}}{{SCRIPTPATH}}/COPYING Kopie der ''GNU General Public License'']
'tags' => 'Gültige Änderungsmarkierungen',
'tag-filter' => '[[Special:Tags|Markierungs]]-Filter:',
'tag-filter-submit' => 'Filter',
+'tag-list-wrapper' => '([[Special:Tags|{{PLURAL:$1|Markierung|Markierungen}}]]: $2)',
'tags-title' => 'Markierungen',
'tags-intro' => 'Diese Seite zeigt alle Markierungen, die für Bearbeitungen verwendet wurden, sowie deren Bedeutung.
@@ -4042,7 +4137,10 @@ Bei entsprechender Einstellung können die Missbrauchfilter beliebige Markierung
'tags-tag' => 'Markierungsname',
'tags-display-header' => 'Benennung auf den Änderungslisten',
'tags-description-header' => 'Vollständige Beschreibung',
+'tags-active-header' => 'Aktiv?',
'tags-hitcount-header' => 'Markierte Änderungen',
+'tags-active-yes' => 'Ja',
+'tags-active-no' => 'Nein',
'tags-edit' => 'bearbeiten',
'tags-hitcount' => '$1 {{PLURAL:$1|Änderung|Änderungen}}',
@@ -4063,6 +4161,7 @@ Bei entsprechender Einstellung können die Missbrauchfilter beliebige Markierung
'dberr-problems' => 'Entschuldigung. Diese Seite hat momentan technische Schwierigkeiten.',
'dberr-again' => 'Warte einige Minuten und versuche dann neu zu laden.',
'dberr-info' => '(Kann keine Verbindung zum Datenbank-Server herstellen: $1)',
+'dberr-info-hidden' => '(Es konnte keine Verbindung mit dem Datenbankserver hergestellt werden)',
'dberr-usegoogle' => 'Du könntest in der Zwischenzeit mit Google suchen.',
'dberr-outofdate' => 'Beachte, dass der Suchindex unserer Inhalte bei Google veraltet sein kann.',
'dberr-cachederror' => 'Folgendes ist eine Kopie des Caches der angeforderten Seite und kann veraltet sein.',
@@ -4078,6 +4177,9 @@ Bei entsprechender Einstellung können die Missbrauchfilter beliebige Markierung
'htmlform-submit' => 'Speichern',
'htmlform-reset' => 'Änderungen rückgängig machen',
'htmlform-selectorother-other' => 'Andere',
+'htmlform-no' => 'Nein',
+'htmlform-yes' => 'Ja',
+'htmlform-chosen-placeholder' => 'Wähle eine Option',
# SQLite database support
'sqlite-has-fts' => 'Version $1 mit Unterstützung für die Volltextsuche',
@@ -4195,4 +4297,22 @@ Anderenfalls kannst du auch das untenstehende einfache Formular nutzen. Dein Kom
# Image rotation
'rotate-comment' => 'Bild um $1 {{PLURAL:$1|Grad}} im Uhrzeigersinn gedreht',
+# Limit report
+'limitreport-title' => 'Parser-Profiling-Daten:',
+'limitreport-cputime' => 'CPU-Zeit-Nutzung',
+'limitreport-cputime-value' => '{{PLURAL:$1|Eine Sekunde|$1 Sekunden}}',
+'limitreport-walltime' => 'Echtzeitnutzung',
+'limitreport-walltime-value' => '{{PLURAL:$1|Eine Sekunde|$1 Sekunden}}',
+'limitreport-ppvisitednodes' => 'Besuchte Knotenanzahl des Präprozessors',
+'limitreport-ppvisitednodes-value' => '$1/$2',
+'limitreport-ppgeneratednodes' => 'Erzeugte Knotenanzahl des Präprozessors',
+'limitreport-ppgeneratednodes-value' => '$1/$2',
+'limitreport-postexpandincludesize' => 'Einbindungsgröße nach dem Expandieren',
+'limitreport-postexpandincludesize-value' => '$1/$2 {{PLURAL:$2|Byte|Bytes}}',
+'limitreport-templateargumentsize' => 'Vorlagenargumentgröße',
+'limitreport-templateargumentsize-value' => '$1/$2 {{PLURAL:$2|Byte|Bytes}}',
+'limitreport-expansiondepth' => 'Höchste Expansionstiefe',
+'limitreport-expansiondepth-value' => '$1/$2',
+'limitreport-expensivefunctioncount' => 'Anzahl aufwändiger Parserfunktionen',
+
);
diff --git a/languages/messages/MessagesDe_at.php b/languages/messages/MessagesDe_at.php
index 5e185b6e..cdd2bb06 100644
--- a/languages/messages/MessagesDe_at.php
+++ b/languages/messages/MessagesDe_at.php
@@ -19,11 +19,11 @@ $fallback = 'de';
$messages = array(
# Dates
-'january' => 'Jänner',
-'february' => 'Februar',
-'december' => 'Dezember',
-'january-gen' => 'Jänners',
-'february-gen' => 'Febers',
-'jan' => 'Jän',
+'january' => 'Jänner',
+'february' => 'Februar',
+'december' => 'Dezember',
+'january-gen' => 'Jänners',
+'february-gen' => 'Februars',
+'jan' => 'Jän',
);
diff --git a/languages/messages/MessagesDe_ch.php b/languages/messages/MessagesDe_ch.php
index e293a784..a4fabf95 100644
--- a/languages/messages/MessagesDe_ch.php
+++ b/languages/messages/MessagesDe_ch.php
@@ -24,7 +24,7 @@ $messages = array(
'tog-hideminor' => 'Kleine Änderungen in den «Letzten Änderungen» ausblenden',
'tog-hidepatrolled' => 'Kontrollierte Änderungen in den «Letzten Änderungen» ausblenden',
'tog-newpageshidepatrolled' => 'Kontrollierte Seiten bei den «Neuen Seiten» ausblenden',
-'tog-usenewrc' => 'Seitenbezogene Gruppierung in den «Letzten Änderungen» und auf der Beobachtungsliste (benötigt JavaScript)',
+'tog-usenewrc' => 'Erweiterte Darstellung der «Letzten Änderungen» (benötigt JavaScript)',
'tog-minordefault' => 'Eigene Änderungen standardmässig als minim markieren',
'tog-externaleditor' => 'Externen Editor standardmässig nutzen (nur für Experten, erfordert spezielle Einstellungen auf dem eigenen Computer. [//www.mediawiki.org/wiki/Manual:External_editors Weitere Informationen hierzu.])',
'tog-externaldiff' => 'Externes Programm standardmässig für Versionsunterschiede nutzen (nur für Experten, erfordert spezielle Einstellungen auf dem eigenen Computer. [//www.mediawiki.org/wiki/Manual:External_editors Weitere Informationen hierzu.])',
@@ -45,9 +45,9 @@ $messages = array(
'dberrortext' => 'Es ist ein Datenbankfehler aufgetreten.
Der Grund kann ein Programmierfehler sein.
Die letzte Datenbankabfrage lautete:
-<blockquote><code>$1</code></blockquote>
-aus der Funktion «<code>$2</code>».
-Die Datenbank meldete den Fehler «<samp>$3: $4</samp>».',
+<blockquote><tt>$1</tt></blockquote>
+aus der Funktion «<tt>$2</tt>».
+Die Datenbank meldete den Fehler «<tt>$3: $4</tt>».',
'dberrortextcl' => 'Es gab einen Syntaxfehler in der Datenbankabfrage.
Die letzte Datenbankabfrage lautete: «$1» aus der Funktion «<tt>$2</tt>».
Die Datenbank meldete den Fehler: «<tt>$3: $4</tt>».',
@@ -71,8 +71,8 @@ Möglicherweise wurde sie bereits von jemand anderem gelöscht.',
'actionthrottledtext' => 'Im Rahmen einer Anti-Spam-Massnahme oder aufgrund eines Missbrauchsfilters kann diese Aktion in einem kurzen Zeitabstand nur begrenzt oft ausgeführt werden. Diese Grenze hast du überschritten.
Bitte versuche es in ein paar Minuten erneut.',
'editinginterface' => "'''Warnung:''' Diese Seite enthält von der MediaWiki-Software genutzten Text.
-Änderungen auf dieser Seite wirken sich auf die Benutzeroberfläche dieses Wikis aus.
-Nutze bitte [//translatewiki.net/ translatewiki.net], das Lokalisierungsprojekt von MediaWiki, um Übersetzungen für alle Wikis hinzuzufügen oder zu ändern.",
+Änderungen auf dieser Seite wirken sich auf die Benutzeroberfläche aus.
+Ziehe bitte im Fall von Übersetzungen in Betracht, diese bei [//translatewiki.net/wiki/Main_Page?setlang=de-ch translatewiki.net], der Lokalisierungsplattform für MediaWiki, durchzuführen.",
'titleprotected' => "Eine Seite mit diesem Namen kann nicht angelegt werden.
Die Sperre wurde durch [[User:$1|$1]] mit der Begründung ''«$2»'' eingerichtet.",
'filereadonlyerror' => 'Die Datei «$1» kann nicht verändert werden, da auf das Dateirepositorium «$2» nur Lesezugriff möglich ist.
@@ -86,35 +86,29 @@ Der Administrator, der den Schreibzugriff sperrte, gab folgenden Grund an: «$3Â
'nosuchusershort' => 'Der Benutzername «$1» ist nicht vorhanden. Bitte überprüfe die Schreibweise.',
'passwordremindertext' => 'Jemand mit der IP-Adresse $1, wahrscheinlich du selbst, hat ein neues Passwort für die Anmeldung bei {{SITENAME}} ($4) angefordert.
-Das automatisch generierte Passwort für Benutzer «$2» lautet nun: $3
+Das automatisch generierte Passwort für Benutzer „$2“ lautet nun: $3
Falls du dies wirklich gewünscht hast, solltest du dich jetzt anmelden und das Passwort ändern.
Das neue Passwort ist {{PLURAL:$5|1 Tag|$5 Tage}} gültig.
-Bitte ignoriere dieses E-Mail, falls du es nicht selbst angefordert hast. Das alte Passwort bleibt weiterhin gültig.',
+Bitte ignoriere dieses E-Mail, falls du sie nicht selbst angefordert hast. Das alte Passwort bleibt weiterhin gültig.',
'noemail' => '{{GENDER:$1|Benutzer|Benutzerin|Benutzer}} «$1» hat keine E-Mail-Adresse angegeben.',
'passwordsent' => 'Ein neues, temporäres Passwort wurde an die E-Mail-Adresse von Benutzer «$1» gesandt.
Bitte melde dich damit an, sobald du es erhalten hast. Das alte Passwort bleibt weiterhin gültig.',
'eauthentsent' => 'Ein Bestätigungs-E-Mail wurde an die angegebene Adresse verschickt.
Bevor ein E-Mail von anderen Benutzern über die E-Mail-Funktion empfangen werden kann, muss die Adresse und ihre tatsächliche Zugehörigkeit zu diesem Benutzerkonto erst bestätigt werden. Bitte befolge die Hinweise im Bestätigungs-E-Mail.',
-'throttled-mailpassword' => 'Es wurde innerhalb der letzten {{PLURAL:$1|Stunde|$1 Stunden}} bereits ein Passwortzurücksetzungs-E-Mail angefordert. Um einen Missbrauch der Funktion zu verhindern, kann nur {{PLURAL:$1|einmal pro Stunde|alle $1 Stunden}} ein Passwortzurücksetzungs-E-Mail angefordert werden.',
'mailerror' => 'Fehler beim Senden des E-Mails: $1',
'createaccount-text' => 'Es wurde für dich ein Benutzerkonto «$2» auf {{SITENAME}} ($4) erstellt. Das automatisch generierte Passwort für «$2» ist «$3». Du solltest dich nun anmelden und das Passwort ändern.
Falls das Benutzerkonto irrtümlich angelegt wurde, kannst du diese Nachricht ignorieren.',
-# Email sending
+# E-mail sending
'user-mail-no-addy' => 'Versuchte ein E-Mail ohne Angabe einer E-Mail-Adresse zu versenden',
-'user-mail-no-body' => 'Es wurde versucht, ein E-Mail mit einem leeren oder zu kurzen Textkörper zu versenden.',
# Change password dialog
'resetpass_announce' => 'Anmeldung mit dem per E-Mail zugesandten Code. Um die Anmeldung abzuschliessen, musst du jetzt ein neues Passwort wählen.',
-# Special:PasswordReset
-'passwordreset-emailsent' => 'Ein Passwortzurücksetzungs-E-Mail wurde versandt.',
-'passwordreset-emailsent-capture' => 'Ein Passwortzurücksetzungs-E-Mail wurde versandt, das unten angezeigt wird.',
-
# Edit pages
'missingsummary' => "'''Hinweis:''' Du hast keine Zusammenfassung angegeben. Wenn du erneut auf «{{int:savearticle}}» klickst, wird deine Änderung ohne Zusammenfassung übernommen.",
'missingcommentheader' => "'''Achtung:''' Du hast kein Betreff/Überschrift eingegeben. Wenn du erneut auf «{{int:savearticle}}» klickst, wird deine Bearbeitung ohne Überschrift gespeichert.",
@@ -161,7 +155,6 @@ Das Passwort für dieses neue Benutzerkonto kann auf der Spezialseite «[[Specia
'userjsyoucanpreview' => "'''Tipp:''' Benutze den «{{int:showpreview}}»-Button, um dein neues JavaScript vor dem Speichern zu testen.",
'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''.",
'editing' => 'Bearbeiten von «$1»',
-'creating' => 'Erstellen von «$1»',
'editingsection' => 'Bearbeiten von «$1» (Abschnitt)',
'editingcomment' => 'Bearbeiten von «$1» (Neuer Abschnitt)',
'explainconflict' => "Jemand anders hat diese Seite geändert, nachdem du angefangen hast sie zu bearbeiten.
@@ -201,7 +194,7 @@ Du hast darauf keinen Zugriff.',
'mergehistory-comment' => '«[[:$1]]» vereinigt nach «[[:$2]]»: $3',
# Diffs
-'history-title' => '$1: Versionsgeschichte',
+'history-title' => 'Versionsgeschichte von «$1»',
# Search results
'searchresults-title' => 'Suchergebnisse für «$1»',
@@ -230,6 +223,10 @@ Du hast darauf keinen Zugriff.',
'right-override-export-depth' => 'Exportiere Seiten einschliesslich verlinkter Seiten bis zu einer Tiefe von 5',
'right-passwordreset' => 'Passwort eines Benutzers zurücksetzen und das dazu verschickte E-Mail einsehen',
+# User rights log
+'rightslogentry' => 'änderte die Benutzerrechte für «$1» von «$2» auf «$3»',
+'rightslogentry-autopromote' => 'wurde automatisch von «$2» nach «$3» zugeordnet',
+
# Recent changes
'rc_categories' => 'Nur Seiten aus den Kategorien (getrennt mit «|»):',
'rc-old-title' => 'ursprünglich erstellt als «$1»',
@@ -277,7 +274,7 @@ Bitte gib der Datei einen Namen, der den Inhalt besser beschreibt.",
'upload-unknown-size' => 'Unbekannte Grösse',
# File backend
-'backend-fail-maxsize' => 'Die Datei $1 konnte nicht gespeichert werden, da sie grösser als {{PLURAL:$2|ein Byte|$2 Bytes}} ist.',
+'backend-fail-maxsize' => 'Die Datei $1 konnte nicht erstellt werden, da sie grösser als {{PLURAL:$2|ein Byte|$2 Byte}} ist.',
'backend-fail-readonly' => 'Das Speicher-Backend «$1» befindet sich derzeit im Lesemodus. Der angegebene Grund lautet: «$2»',
'backend-fail-synced' => 'Die Datei «$1» befindet sich, innerhalb des internen Speicher-Backends, in einem inkonsistenten Zustand.',
'backend-fail-connect' => 'Es konnte keine Verbindung zum Speicher-Backend «$1» hergestellt werden.',
@@ -349,11 +346,11 @@ Die Ausgabe kann durch die Auswahl des Logbuchtyps, des Benutzers oder des Seite
'allpages-bad-ns' => 'Der Namensraum «$1» ist in {{SITENAME}} nicht vorhanden.',
# Special:LinkSearch
-'linksearch-text' => 'Diese Spezialseite ermöglicht die Suche nach Seiten, in denen bestimmte Weblinks enthalten sind. Dabei können Platzhalter wie beispielsweise <code>*.beispiel.ch</code> benutzt werden. Es muss mindestens eine Top-Level-Domain, z. B. «*.org». angegeben werden. <br />{{PLURAL:$2|Unterstütztes Protokoll|Unterstützte Protokolle}}: <code>$1</code> (Standard ist http, falls kein Protokoll angegeben ist.)',
+'linksearch-text' => 'Diese Spezialseite ermöglicht die Suche nach Seiten, in denen bestimmte Weblinks enthalten sind. Dabei können Platzhalter wie beispielsweise <code>*.beispiel.ch</code> benutzt werden. Es muss mindestens eine Top-Level-Domain, z. B. «*.org». angegeben werden. <br />Unterstützte Protokolle: <code>$1</code> (Diese bitte nicht bei der Suchanfrage angeben.)',
-# Email user
-'emailpagetext' => 'Du kannst {{GENDER:$1|dem Benutzer|der Benutzerin}} mit dem unten stehenden Formular ein E-Mail senden.
-Als Absender wird die E-Mail-Adresse aus deinen [[Special:Preferences|Einstellungen]] eingetragen, damit {{GENDER:$1|der Benutzer|die Benutzerin}} dir direkt antworten kann.',
+# E-mail user
+'emailpagetext' => 'Du kannst dem Benutzer mit dem unten stehenden Formular ein E-Mail senden.
+Als Absender wird die E-Mail-Adresse aus deinen [[Special:Preferences|Einstellungen]] eingetragen, damit der Benutzer dir antworten kann.',
'defemailsubject' => '{{SITENAME}} - E-Mail von Benutzer «$1»',
'emailnotarget' => 'Nicht vorhandener oder ungültiger Benutzername für den Empfang eines E-Mails.',
'emailccme' => 'Sende eine Kopie des E-Mails an mich',
@@ -362,7 +359,7 @@ Als Absender wird die E-Mail-Adresse aus deinen [[Special:Preferences|Einstellun
# Watchlist
'addedwatchtext' => 'Die Seite «[[:$1]]» wurde zu deiner [[Special:Watchlist|Beobachtungsliste]] hinzugefügt.
-Spätere Änderungen an dieser Seite und der zugehörigen Diskussionsseite werden dort gelistet.',
+Spätere Änderungen an dieser Seite und der zugehörigen Diskussionsseite werden dort gelistet und die Seite wird in der [[Special:RecentChanges|Liste der letzten Änderungen]] in Fettschrift angezeigt.',
'removedwatchtext' => 'Die Seite «[[:$1]]» wurde von deiner [[Special:Watchlist|Beobachtungsliste]] entfernt.',
'iteminvalidname' => 'Problem mit dem Eintrag «$1», ungültiger Name.',
@@ -390,7 +387,7 @@ Spätere Änderungen an dieser Seite und der zugehörigen Diskussionsseite werde
'protect-locked-blocked' => "Du kannst den Seitenschutz nicht ändern, da dein Benutzerkonto gesperrt ist. Hier sind die aktuellen Seitenschutz-Einstellungen der Seite '''«$1»:'''",
'protect-locked-dblock' => "Die Datenbank ist gesperrt, der Seitenschutz kann daher nicht geändert werden. Hier sind die aktuellen Seitenschutz-Einstellungen der Seite '''«$1»:'''",
'protect-locked-access' => "Dein Benutzerkonto verfügt nicht über die notwendigen Rechte zur Änderung des Seitenschutzes. Hier sind die aktuellen Seitenschutzeinstellungen der Seite '''«$1»:'''",
-'protect-fallback' => 'Nur Benutzern mit der «$1»-Berechtigung erlauben.',
+'protect-fallback' => 'Es wird die «$1»-Berechtigung benötigt.',
'minimum-size' => 'Mindestgrösse',
'maximum-size' => 'Maximalgrösse:',
@@ -511,39 +508,36 @@ Weitere werden standardmässig nicht angezeigt.
'exif-isospeedratings-overflow' => 'Grösser als 65535',
-# Email address confirmation
+# E-mail address confirmation
'confirmemail_text' => '{{SITENAME}} erfordert, dass du deine E-Mail-Adresse bestätigst (authentifizierst), bevor du die erweiterten E-Mail-Funktionen benutzen kannst. Klicke bitte auf die unten stehende, mit «Bestätigungscode zuschicken» beschriftete Schaltfläche, damit ein automatisch erstelltes E-Mail an die angegebene Adresse geschickt wird. Dieses 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 das E-Mail, bevor du einen neuen Code anforderst.',
-'confirmemail_sent' => 'Das Bestätigungs-E-Mail wurde verschickt.',
-'confirmemail_sendfailed' => '{{SITENAME}} konnte das 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_body' => 'Hallo,
-jemand mit der IP-Adresse $1, wahrscheinlich du selbst, hat das Benutzerkonto «$2» bei {{SITENAME}} registriert.
+jemand mit der IP-Adresse $1, wahrscheinlich du selbst, hat das Benutzerkonto «$2» in {{SITENAME}} registriert.
-Um die E-Mail-Funktionen von {{SITENAME}} (wieder) zu aktivieren und um zu bestätigen,
-dass dieses Benutzerkonto wirklich zu deiner E-Mail-Adresse und damit zu dir gehört, öffne bitte folgenden Link in deinem Browser:
+Um die E-Mail-Funktion von {{SITENAME}} (wieder) zu aktivieren und um zu bestätigen,
+dass dieses Benutzerkonto wirklich zu deiner E-Mail-Adresse und damit zu dir gehört, öffne bitte die folgende Web-Adresse:
$3
+Sollte die vorstehende Adresse in deinem E-Mail-Programm über mehrere Zeilen gehen, musst du sie allenfalls per Hand in die Adresszeile deines Web-Browsers einfügen.
+
Wenn du das genannte Benutzerkonto *nicht* registriert hast, folge diesem Link, um den Bestätigungsprozess abzubrechen:
$5
-Dieser Bestätigungscode ist gültig bis zum $6, $7 Uhr.',
+Dieser Bestätigungscode ist gültig bis $6, $7 Uhr.',
'confirmemail_body_changed' => 'Jemand mit der IP-Adresse $1, wahrscheinlich du selbst,
-hat die E-Mail-Adresse des Benutzerkontos «$2» zu dieser Adresse bei {{SITENAME}} geändert.
+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 bei {{SITENAME}} zu reaktivieren, öffne diesen Link in deinem Browser:
+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-Bestätigung abzubrechen:
+um die E-Mail-Adress-Bestätigung abzubrechen:
$5
@@ -568,7 +562,7 @@ Dieser Bestätigungscode ist gültig bis $4.',
'autosumm-new' => 'Die Seite wurde neu angelegt: «$1»',
# Live preview
-'livepreview-error' => 'Verbindung nicht möglich: $1 «$2». Bitte die normale Vorschau benutzen.',
+'livepreview-error' => 'Verbindung nicht möglich: $1 «$1». Bitte die normale Vorschau benutzen.',
# Watchlist editor
'watchlistedit-normal-explain' => 'Dies sind die Einträge deiner Beobachtungsliste. Um Einträge zu entfernen, markiere die Kästchen neben den Einträgen und klicke am Ende der Seite auf «{{int:Watchlistedit-normal-submit}}». Du kannst deine Beobachtungsliste auch im [[Special:EditWatchlist/raw|Listenformat bearbeiten]].',
diff --git a/languages/messages/MessagesDe_formal.php b/languages/messages/MessagesDe_formal.php
index ad7e1c9f..31a782a0 100644
--- a/languages/messages/MessagesDe_formal.php
+++ b/languages/messages/MessagesDe_formal.php
@@ -71,8 +71,12 @@ Nutzen Sie bitte [//translatewiki.net/ translatewiki.net], das Lokalisierungspro
# Login and logout pages
'logouttext' => "'''Sie sind nun abgemeldet.'''
-Sie können {{SITENAME}} jetzt anonym weiternutzen, oder sich erneut unter demselben oder einem anderen Benutzernamen <span class='plainlinks'>[$1 anmelden]</span>.
+Sie können {{SITENAME}} jetzt anonym weiternutzen, oder sich erneut unter demselben oder einem anderen Benutzernamen [[Special:UserLogin|anmelden]].
Beachten Sie, dass einige Seiten noch anzeigen können, dass Sie angemeldet sind, solange Sie nicht Ihren Browsercache geleert haben.",
+'welcomecreation' => '== Willkommen, $1! ==
+
+Ihr Benutzerkonto wurde soeben eingerichtet.
+Vergessen Sie nicht, Ihre [[Special:Preferences|Einstellungen]] anzupassen.',
'yourdomainname' => 'Ihre Domain:',
'password-change-forbidden' => 'Sie können auf diesem Wiki keine Passwörter ändern.',
'externaldberror' => 'Entweder es liegt ein Fehler bei der externen Authentifizierung vor oder Sie dürfen Ihr externes Benutzerkonto nicht aktualisieren.',
@@ -130,21 +134,16 @@ Bitte warten Sie, bevor Sie es erneut probieren.',
Möglicherweise haben Sie Ihr Passwort bereits erfolgreich geändert oder ein neues temporäres Passwort beantragt.',
# Special:PasswordReset
-'passwordreset-text' => 'Bitte dieses Formular ausfüllen, um Ihr Passwort zurückzusetzen.',
+'passwordreset-text' => 'Bitte dieses Formular ausfüllen, um per E-Mail eine Erinnerung zu den Anmeldeinformationen Ihres Benutzerkontos zu erhalten.',
'passwordreset-pretext' => '{{PLURAL:$1||Geben Sie eines der folgenden Daten ein.}}',
-'passwordreset-capture-help' => 'Wenn Sie dieses Kästchen ankreuzen, wird die E-Mail-Nachricht mit dem temporären Passwort sowohl Ihnen angezeigt als auch dem Benutzer zugesandt.',
-'passwordreset-emailtext-ip' => 'Jemand mit der IP-Adresse $1, wahrscheinlich Sie selbst, hat eine Zurücksetzung Ihres
-Passworts bei {{SITENAME}} angefordert ($4). {{PLURAL:$3|Das folgende Benutzerkonto ist|Die folgenden Benutzerkonten sind}}
-mit dieser E-Mail-Adresse verknüpft:
+'passwordreset-capture-help' => 'Sofern Sie dieses Kästchen ankreuzen, wird die E-Mail-Nachricht mit dem temporären Passwort, sowohl Ihnen angezeigt, als auch dem Benutzer zugesandt.',
+'passwordreset-emailtext-ip' => 'Jemand mit der IP-Adresse $1, wahrscheinlich Sie selbst, hat eine Erinnerung an Ihre Benutzerkonteninformationen für {{SITENAME}} angefordert ($4). {{PLURAL:$3|Das folgende Benutzerkonto ist|Die folgenden Benutzerkonten sind}} mit dieser E-Mail-Adresse verknüpft:
$2
{{PLURAL:$3|Dieses temporäre Passwort läuft|Diese temporären Passwörter laufen}} innerhalb von {{PLURAL:$5|einem Tag|$5 Tagen}} ab.
-Sie sollten sich anmelden und ein neues Passwort vergeben. Falls jemand anderes diese
-Anfrage getätigt hat oder Sie sich wieder an Ihr ursprüngliches Passwort erinnern können und es nicht länger
-ändern möchten, können Sie diese Nachricht ignorieren und weiterhin Ihr altes
-Passwort benutzen.',
-'passwordreset-emailtext-user' => 'Benutzer $1 bei {{SITENAME}} hat eine Zurücksetzung Ihres Passworts bei {{SITENAME}} angefordert ($4). {{PLURAL:$3|Das folgende Benutzerkonto ist|Die folgenden Benutzerkonten sind}} mit dieser E-Mail-Adresse verknüpft:
+Sie sollten sich anmelden und ein neues Passwort vergeben. Falls jemand anderes diese Anfrage getätigt hat oder Sie sich wieder an Ihr ursprüngliches Passwort erinnern können und es nicht länger ändern möchten, können Sie diese Nachricht ignorieren und weiterhin Ihr altes Passwort benutzen.',
+'passwordreset-emailtext-user' => 'Benutzer $1 auf {{SITENAME}} hat eine Erinnerung an Ihre Benutzerkonteninformationen für {{SITENAME}} angefordert ($4). {{PLURAL:$3|Das folgende Benutzerkonto ist|Die folgenden Benutzerkonten sind}} mit dieser E-Mail-Adresse verknüpft:
$2
@@ -158,7 +157,7 @@ $2
'sig_tip' => 'Ihre Signatur mit Zeitstempel',
# Edit pages
-'anoneditwarning' => "Sie bearbeiten diese Seite unangemeldet. Wenn Sie sie abspeichern, wird Ihre aktuelle IP-Adresse in der Versionsgeschichte aufgezeichnet und ist damit unwiderruflich '''öffentlich''' einsehbar.",
+'anoneditwarning' => "Sie bearbeiten diese Seite unangemeldet. Wenn Sie 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 kein Betreff/Überschrift eingegeben. Wenn Sie erneut auf „{{int:savearticle}}“ klicken, wird Ihre Bearbeitung ohne Überschrift gespeichert.",
@@ -452,10 +451,10 @@ Bitte prüfen Sie, ob sie korrekt von der Quelle übertragen wurde.',
'cachedspecial-viewing-cached-ttl' => 'Sie sehen die gecachte Version dieser Seite, die bis zu $1 alt sein kann.',
'cachedspecial-viewing-cached-ts' => 'Sie sehen die gecachte Version dieser Seite, die möglicherweise nicht aktuell ist.',
-# Email user
+# E-mail user
'mailnologintext' => 'Sie müssen [[Special:UserLogin|angemeldet sein]] und eine bestätigte E-Mail-Adresse in Ihren [[Special:Preferences|Einstellungen]] eingetragen haben, um anderen Benutzern E-Mails schicken zu können.',
-'emailpagetext' => 'Sie können {{GENDER:$1|dem Benutzer|der Benutzerin}} mit dem unten stehenden Formular eine E-Mail senden.
-Als Absender wird die E-Mail-Adresse aus Ihren [[Special:Preferences|Einstellungen]] eingetragen, damit {{GENDER:$1|der Benutzer|die Benutzerin}} Ihnen direkt antworten kann.',
+'emailpagetext' => 'Sie könnent dem Benutzer mit dem unten stehenden Formular eine E-Mail senden.
+Als Absender wird die E-Mail-Adresse aus ihren [[Special:Preferences|Einstellungen]] eingetragen, damit der Benutzer Ihnen antworten kann.',
'emailccsubject' => 'Kopie Ihrer Nachricht an $1: $2',
'emailsenttext' => 'Ihre E-Mail wurde verschickt.',
@@ -466,7 +465,8 @@ Als Absender wird die E-Mail-Adresse aus Ihren [[Special:Preferences|Einstellung
'watchnologintext' => 'Sie müssen [[Special:UserLogin|angemeldet]] sein, um Ihre Beobachtungsliste bearbeiten zu können.',
'addedwatchtext' => 'Die Seite „[[:$1]]“ wurde zu Ihrer [[Special:Watchlist|Beobachtungsliste]] hinzugefügt.
-Spätere Änderungen an dieser Seite und der dazugehörigen Diskussionsseite werden dort gelistet.',
+Spätere Änderungen an dieser Seite und der dazugehörigen Diskussionsseite werden dort gelistet und
+in der Übersicht der [[Special:RecentChanges|letzten Änderungen]] in Fettschrift dargestellt.',
'removedwatchtext' => 'Die Seite „[[:$1]]“ wurde von Ihrer [[Special:Watchlist|Beobachtungsliste]] entfernt.',
'watchnochange' => 'Keine der von Ihnen beobachteten Seiten wurde während des angezeigten Zeitraums bearbeitet.',
'watchlist-details' => 'Sie beobachten {{PLURAL:$1|1 Seite|$1 Seiten}}.',
@@ -474,7 +474,11 @@ Spätere Änderungen an dieser Seite und der dazugehörigen Diskussionsseite wer
'enotif_body' => 'Hallo $WATCHINGUSERNAME,
-$PAGEINTRO $NEWPAGE
+die {{SITENAME}}-Seite „$PAGETITLE“ wurde von $PAGEEDITOR am $PAGEEDITDATE um $PAGEEDITTIME Uhr $CHANGEDORCREATED.
+
+Aktuelle Version: $PAGETITLE_URL
+
+$NEWPAGE
Zusammenfassung des Bearbeiters: $PAGESUMMARY $PAGEMINOREDIT
@@ -482,17 +486,16 @@ Kontakt zum Bearbeiter:
E-Mail: $PAGEEDITOR_EMAIL
Wiki: $PAGEEDITOR_WIKI
-Bei weiterer Aktivität auf der Seite werden Ihnen so lange keine weiteren Benachrichtigungs-E-Mails gesendet, bis Sie die Seite wieder besucht haben.
-Auf Ihrer Beobachtungsliste können Sie alle Benachrichtigungsmarkierungen zusammen zurücksetzen.
+Es werden Ihnen solange keine weiteren Benachrichtigungs-E-Mails gesendet, bis Sie die Seite wieder besucht haben. Auf Ihrer Beobachtungsliste können Sie alle Benachrichtigungsmarkierungen zusammen zurücksetzen.
-Ihr freundliches {{SITENAME}}-Benachrichtigungssystem
+ Das freundliche {{SITENAME}}-Benachrichtigungssystem
--
-Um die Einstellungen der E-Mail-Benachrichtigung anzupassen, besuchen Sie {{canonicalurl:{{#special:Preferences}}}}.
+Um die Einstellungen der E-Mail-Benachrichtigung anzupassen, besuchen Sie {{canonicalurl:{{#special:Preferences}}}}
-Um die Einstellungen Ihrer Beobachtungsliste anzupassen, besuchen Sie {{canonicalurl:{{#special:EditWatchlist}}}}.
+Um die Einstellungen Ihrer Beobachtungsliste anzupassen, besuchen Sie {{canonicalurl:{{#special:EditWatchlist}}}}
-Um diese Seite von Ihrer Beobachtungsliste zu entfernen, besuchen Sie $UNWATCHURL.
+Um diese Seite von Ihrer Beobachtungsliste zu entfernen, besuchen Sie $UNWATCHURL
Rückmeldungen und weitere Hilfe: {{canonicalurl:{{MediaWiki:Helppage}}}}',
@@ -551,22 +554,22 @@ Bitte geben Sie den Grund für die Sperre an.',
'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|defekten Weiterleitungen]] überprüfen.
+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, letztere ist 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 existierende Seite überschreiben.
+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.",
'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|defekten Weiterleitungen]] überprüfen.
+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 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 existierende Seite überschreiben.
+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.
@@ -642,7 +645,7 @@ Das liegt wahrscheinlich an einem Link auf eine externe Seite.',
'mediawarning' => "'''Warnung:''' Dieser Dateityp kann böswilligen Programmcode enthalten.
Durch das Herunterladen und Öffnen der Datei kann Ihr Computer beschädigt werden.",
-# Email address confirmation
+# E-mail address confirmation
'confirmemail_noemail' => 'Sie haben keine gültige E-Mail-Adresse in Ihren [[Special:Preferences|persönlichen Einstellungen]] eingetragen.',
'confirmemail_text' => '{{SITENAME}} erfordert, dass Sie Ihre E-Mail-Adresse bestätigen (authentifizieren), bevor Sie die erweiterten E-Mail-Funktionen benutzen können. Klicken Sie 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 Sie diese Webseite in Ihrem Webbrowser öffnen, bestätigen Sie, dass die angegebene E-Mail-Adresse korrekt und gültig ist.',
'confirmemail_pending' => 'Es wurde Ihnen bereits ein Bestätigungscode per E-Mail zugeschickt.
@@ -659,18 +662,20 @@ Rückmeldung des Mailservers: $1',
'confirmemail_error' => 'Es gab einen Fehler bei der Bestätigung Ihrer E-Mail-Adresse.',
'confirmemail_body' => 'Hallo,
-jemand mit der IP-Adresse $1, wahrscheinlich Sie selbst, hat das Benutzerkonto „$2“ bei {{SITENAME}} registriert.
+jemand mit der IP-Adresse $1, wahrscheinlich Sie selbst, hat das Benutzerkonto „$2“ in {{SITENAME}} registriert.
-Um die E-Mail-Funktionen von {{SITENAME}} (wieder) zu aktivieren und um zu bestätigen,
-dass dieses Benutzerkonto wirklich zu Ihrer E-Mail-Adresse und damit zu Ihnen gehört, öffnen Sie bitte folgenden Link in Ihrem Browser:
+Um die E-Mail-Funktion von {{SITENAME}} (wieder) zu aktivieren und um zu bestätigen,
+dass dieses Benutzerkonto wirklich zu Ihrer E-Mail-Adresse und damit zu Ihnen gehört, öffnen Sie bitte die folgende Web-Adresse:
$3
+Sollte die vorstehende Adresse in Ihrem E-Mail-Programm über mehrere Zeilen gehen, müssen Sie diese eventuell per Hand in die Adresszeile Ihres Web-Browsers einfügen.
+
Wenn Sie das genannte Benutzerkonto *nicht* registriert haben, folgen Sie diesem Link, um den Bestätigungsprozess abzubrechen:
$5
-Dieser Bestätigungscode ist gültig bis zum $6, $7 Uhr.',
+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.
diff --git a/languages/messages/MessagesDiq.php b/languages/messages/MessagesDiq.php
index f21854b1..bf37f545 100644
--- a/languages/messages/MessagesDiq.php
+++ b/languages/messages/MessagesDiq.php
@@ -16,6 +16,7 @@
* @author Kaganer
* @author Mirzali
* @author Nemo bis
+ * @author Neribij
* @author Olvörg
* @author Reedy
* @author Sahim
@@ -25,129 +26,137 @@
$namespaceNames = array(
NS_MEDIA => 'Medya',
NS_SPECIAL => 'Xısusi',
- NS_TALK => 'Werênayış',
+ NS_TALK => 'Mesac',
NS_USER => 'Karber',
- NS_USER_TALK => 'Karber_werênayış',
- NS_PROJECT_TALK => '$1_werênayış',
+ NS_USER_TALK => 'Karber_mesac',
+ NS_PROJECT_TALK => '$1_mesac',
NS_FILE => 'Dosya',
- NS_FILE_TALK => 'Dosya_werênayış',
+ NS_FILE_TALK => 'Dosya_mesac',
NS_MEDIAWIKI => 'MediaWiki',
- NS_MEDIAWIKI_TALK => 'MediaWiki_werênayış',
+ NS_MEDIAWIKI_TALK => 'MediaWiki_mesac',
NS_TEMPLATE => 'Åžablon',
- NS_TEMPLATE_TALK => 'Şablon_werênayış',
+ NS_TEMPLATE_TALK => 'Åžablon_mesac',
NS_HELP => 'PeÅŸti',
- NS_HELP_TALK => 'Peşti_werênayış',
+ NS_HELP_TALK => 'PeÅŸti_mesac',
NS_CATEGORY => 'Kategoriye',
- NS_CATEGORY_TALK => 'Kategoriye_werênayış',
+ NS_CATEGORY_TALK => 'Kategoriye_mesac',
);
$namespaceAliases = array(
- 'Karber_mesac' => NS_USER_TALK,
- 'Desteg' => NS_HELP,
- 'Desteg_werênayış' => NS_HELP_TALK,
- 'Kategori' => NS_CATEGORY,
- 'Kategori_werênayış' => NS_CATEGORY_TALK,
+ 'Werênayış' => NS_TALK,
+ 'Karber_werênayış' => NS_USER_TALK,
+ '$1_werênayış' => NS_PROJECT_TALK,
+ 'Dosya_werênayış' => NS_FILE_TALK,
+ 'MediaWiki_werênayış' => NS_MEDIAWIKI_TALK,
+ 'Şablon_werênayış' => NS_TEMPLATE_TALK,
+ 'Desteg' => NS_HELP,
+ 'Desteg_werênayış' => NS_HELP_TALK,
+ 'Peşti_werênayış' => NS_HELP_TALK,
+ 'Kategori' => NS_CATEGORY,
+ 'Kategori_werênayış' => NS_CATEGORY_TALK,
+ 'Kategoriye_werênayış' => NS_CATEGORY_TALK,
);
$specialPageAliases = array(
- 'Activeusers' => array( 'KarberêAktivi', 'AktivKarberi' ),
- 'Allmessages' => array( 'MesaciPêro' ),
- 'Allpages' => array( 'PeleyPêro' ),
+ 'Activeusers' => array( 'KarberéAktivi', 'AktivKarberi' ),
+ 'Allmessages' => array( 'MesaciPéro' ),
+ 'Allpages' => array( 'PeleyPéro' ),
'Ancientpages' => array( 'PeleyKehani' ),
'Badtitle' => array( 'SernameyoXırab' ),
- 'Blankpage' => array( 'PelêVengi' ),
- 'Block' => array( 'Bloqe', 'BloqeIP', 'BloqeyêKarber' ),
- 'Blockme' => array( 'BloqeyêMe' ),
+ 'Blankpage' => array( 'PeréVengi' ),
+ 'Block' => array( 'Bloqe', 'BloqeIP', 'BloqeyéKarber' ),
+ 'Blockme' => array( 'BloqeyéMe' ),
'Booksources' => array( 'KıtabeÇıme' ),
- 'BrokenRedirects' => array( 'HetênayışoXırab' ),
- 'Categories' => array( 'Kategoriy' ),
- 'ChangeEmail' => array( 'EpostaVurnayış' ),
- 'ChangePassword' => array( 'ParolaBıvurnê', 'ParolaResetke' ),
- 'ComparePages' => array( 'PelaPêverke' ),
+ 'BrokenRedirects' => array( 'HeténayışoXırab' ),
+ 'Categories' => array( 'Kategoriyan' ),
+ 'ChangeEmail' => array( 'EpostaVırnayış' ),
+ 'ChangePassword' => array( 'ParolaBıvırné', 'ParolaResetke' ),
+ 'ComparePages' => array( 'PeraPéverke' ),
'Confirmemail' => array( 'EpostayAraÅŸtke' ),
- 'Contributions' => array( 'Ä°ÅŸtiraqi' ),
- 'CreateAccount' => array( 'HesabVırazê' ),
- 'Deadendpages' => array( 'PelaBıgirê' ),
- 'DeletedContributions' => array( 'İştıraqêkeBesterneyayê' ),
- 'Disambiguations' => array( 'Arêzekerdış' ),
+ 'Contributions' => array( 'Dekerdışi' ),
+ 'CreateAccount' => array( 'HesabVırazé' ),
+ 'Deadendpages' => array( 'PeraBıgiré' ),
+ 'DeletedContributions' => array( 'DekerdışékeBesterneyayé' ),
+ 'Disambiguations' => array( 'Arézekerdış' ),
'DoubleRedirects' => array( 'HetanayışoDılet' ),
- 'EditWatchlist' => array( 'ListeyaSeyrkerdışiVurnayış' ),
+ 'EditWatchlist' => array( 'ListeyaSeyrkerdışiVırnayış' ),
'Emailuser' => array( 'EpostayaKarberi' ),
'Export' => array( 'Ateberde' ),
- 'Fewestrevisions' => array( 'TewrtaynRevizyon' ),
+ 'Fewestrevisions' => array( 'TewrtaynRewizyon' ),
'FileDuplicateSearch' => array( 'KopyaydosyaCıgeyrayış', 'DıletdosyaCıgeyrayış' ),
'Filepath' => array( 'RayaDosya', 'HerunaDosya', 'CayêDosya' ),
- 'Import' => array( 'Azeredê', 'Atewrke' ),
- 'Invalidateemail' => array( 'EpostaAraştkerdışiBıterknê' ),
- 'BlockList' => array( 'ListeyêBloqi', 'IPBloqi', 'Blokqeyê_IP' ),
+ 'Import' => array( 'Azeredé', 'Atewrke' ),
+ 'Invalidateemail' => array( 'EpostaAraştkerdışiBıterkné' ),
+ 'BlockList' => array( 'ListeyéBloqan', 'IPBloqi', 'Blokqeyé_IP' ),
'LinkSearch' => array( 'GreCıgeyrayış' ),
- 'Listadmins' => array( 'ListeyaSerkaran' ),
+ 'Listadmins' => array( 'ListeyaÄ°darekaran' ),
'Listbots' => array( 'ListeyaBotan' ),
- 'Listfiles' => array( 'ListeyaDosyayan', 'DosyayaListeke', 'ListeyêResiman' ),
- 'Listgrouprights' => array( 'ListeyaHeqandêGruban', 'HeqêGrubdeKarberan' ),
- 'Listredirects' => array( 'ListeyaArêzekerdışan' ),
+ 'Listfiles' => array( 'ListeyaDosyayan', 'DosyayaListeke', 'ListeyéResiman' ),
+ 'Listgrouprights' => array( 'ListeyaHeqandéGruban', 'HeqéGrubdeKarberan' ),
+ 'Listredirects' => array( 'ListeyaArézekerdışan' ),
'Listusers' => array( 'ListeyaKarberan', 'KarberaListeke' ),
'Lockdb' => array( 'DBKilitke' ),
'Log' => array( 'Qeyd', 'Qeydi' ),
- 'Lonelypages' => array( 'PeleyêBêwayıri' ),
- 'Longpages' => array( 'PeleyêDergi' ),
- 'MergeHistory' => array( 'VerênanPêtewrke' ),
+ 'Lonelypages' => array( 'PeréBéwayıri' ),
+ 'Longpages' => array( 'PeréDergi' ),
+ 'MergeHistory' => array( 'VerénanPétewrke' ),
'MIMEsearch' => array( 'NIMECıgeyrayış' ),
- 'Mostcategories' => array( 'TewrvêşiKategoriyıni' ),
- 'Mostimages' => array( 'DosyeyêkeCırêvêşiGreDeyayo' ),
- 'Mostinterwikis' => array( 'TewrvêşiTeberwiki' ),
- 'Mostlinked' => array( 'PeleyêkeCırêvêşiGreDeyayo' ),
- 'Mostlinkedcategories' => array( 'KategoriyêkeCırêvêşiGreDeyayo' ),
- 'Mostlinkedtemplates' => array( 'ŞablonêkeCırêvêşiGreDeyayo' ),
- 'Mostrevisions' => array( 'TewrvêşiRevizyon' ),
- 'Movepage' => array( 'PelerBerê' ),
- 'Mycontributions' => array( 'İştıraqêMe' ),
- 'Mypage' => array( 'PeleyêMe' ),
- 'Mytalk' => array( 'WerênayışêMe' ),
- 'Myuploads' => array( 'BarkerdışeMe' ),
- 'Newimages' => array( 'DosyeyêNewey', 'ResimêNewey' ),
- 'Newpages' => array( 'PeleyêNewey' ),
+ 'Mostcategories' => array( 'TewrvéşiKategoriyıni' ),
+ 'Mostimages' => array( 'DosyeyékeCırévéşiGreDeyayo' ),
+ 'Mostinterwikis' => array( 'TewrvéşiTeberwiki' ),
+ 'Mostlinked' => array( 'PerékeCırévéşiGreDeyayo' ),
+ 'Mostlinkedcategories' => array( 'KategoriyayékeCırévéşiGreDeyayo' ),
+ 'Mostlinkedtemplates' => array( 'ŞablonékeCırévéşiGreDeyayo' ),
+ 'Mostrevisions' => array( 'TewrvéşiRevizyon' ),
+ 'Movepage' => array( 'PelerBeré' ),
+ 'Mycontributions' => array( 'DekerdenéMe' ),
+ 'Mypage' => array( 'PeréMe' ),
+ 'Mytalk' => array( 'VatenayışéMe' ),
+ 'Myuploads' => array( 'BarkerdışéMe' ),
+ 'Newimages' => array( 'DosyeyéNewey', 'ResiméNewey' ),
+ 'Newpages' => array( 'PeréNewey' ),
'PasswordReset' => array( 'ParolaResetkerdış' ),
'PermanentLink' => array( 'GreyoDaimi' ),
- 'Popularpages' => array( 'PeleyêPopuleri' ),
+ 'Popularpages' => array( 'PeréPopuleri' ),
'Preferences' => array( 'Tercihi' ),
'Prefixindex' => array( 'SerVerole' ),
- 'Protectedpages' => array( 'PeleyêkeStaryayê' ),
- 'Protectedtitles' => array( 'SernameyêkeStaryayê' ),
- 'Randompage' => array( 'Raştamê', 'PelayakeRaştamê' ),
- 'Randomredirect' => array( 'HetenayışoRaştame' ),
- 'Recentchanges' => array( 'VurnayışêPeyêni' ),
- 'Recentchangeslinked' => array( 'GreyêVurnayışêPeyêni' ),
- 'Revisiondelete' => array( 'RevizyoniBesterne' ),
+ 'Protectedpages' => array( 'PerékeStaryayé' ),
+ 'Protectedtitles' => array( 'SernameyékeStaryayé' ),
+ 'Randompage' => array( 'Raştameye', 'PelayakeRaştamé' ),
+ 'Randomredirect' => array( 'HetenayışoRaştameye' ),
+ 'Recentchanges' => array( 'VırnayışéPeyéni' ),
+ 'Recentchangeslinked' => array( 'GreyéVırnayışéPeyénan' ),
+ 'Redirect' => array( 'Hetenayış' ),
+ 'Revisiondelete' => array( 'RewizyoniBesterne' ),
'Search' => array( 'Cıgeyre' ),
- 'Shortpages' => array( 'PeleyêKılmi' ),
- 'Specialpages' => array( 'PeleyêXısusi' ),
+ 'Shortpages' => array( 'PeleyéKılmi' ),
+ 'Specialpages' => array( 'PeréBexsey' ),
'Statistics' => array( 'Ä°statistiki' ),
'Tags' => array( 'Etiketi' ),
'Unblock' => array( 'BloqiWedarne' ),
- 'Uncategorizedcategories' => array( 'KategoriyêkeKategorinêbiyê' ),
- 'Uncategorizedimages' => array( 'DosyeyêkeKategorinêbiyê' ),
- 'Uncategorizedpages' => array( 'PeleyêkeKategorinêbiyê' ),
- 'Uncategorizedtemplates' => array( 'ŞablonêkeKategorinêbiyê' ),
+ 'Uncategorizedcategories' => array( 'KategoriyayékeKategoriyanébiyé' ),
+ 'Uncategorizedimages' => array( 'DosyeyékeKategoriyanébiyé' ),
+ 'Uncategorizedpages' => array( 'PeleyékeKategoriyanébiyé' ),
+ 'Uncategorizedtemplates' => array( 'ŞablonékeKategoriyanébiyé' ),
'Undelete' => array( 'Peyserbiya' ),
'Unlockdb' => array( 'DBKılitiAke' ),
- 'Unusedcategories' => array( 'KategoriyêkeNêkaryayê' ),
- 'Unusedimages' => array( 'DosyeyêkeNêkaryayê' ),
- 'Unusedtemplates' => array( 'ŞablonêkeNêkaryayê' ),
- 'Unwatchedpages' => array( 'PeleyêkeNêweyneyênê' ),
+ 'Unusedcategories' => array( 'KategoriyayékeNékariyayé' ),
+ 'Unusedimages' => array( 'DosyeyékeNékariyayé' ),
+ 'Unusedtemplates' => array( 'ŞablonékeNékariyayé' ),
+ 'Unwatchedpages' => array( 'PeleyékeNéweyneyéné' ),
'Upload' => array( 'Barkerdış' ),
- 'UploadStash' => array( 'BarkerdışêNımtey' ),
+ 'UploadStash' => array( 'BarkerdışéNımıtey' ),
'Userlogin' => array( 'KarberCıkewtış' ),
'Userlogout' => array( 'KarberVıcyayış' ),
- 'Userrights' => array( 'HeqêKarberan', 'SysopKerdış', 'BotKerdış' ),
+ 'Userrights' => array( 'HeqéKarberan', 'SysopKerdış', 'BotKerdış' ),
'Version' => array( 'Versiyon' ),
- 'Wantedcategories' => array( 'KategoriyêkeWazênê' ),
- 'Wantedfiles' => array( 'DosyeyêkeWazênê' ),
- 'Wantedpages' => array( 'PeleyêkeWazênê' ),
- 'Wantedtemplates' => array( 'ŞablonêkeWazênê' ),
- 'Watchlist' => array( 'ListaSeyri' ),
- 'Whatlinkshere' => array( 'PelarêGre' ),
- 'Withoutinterwiki' => array( 'Bêİnterwiki' ),
+ 'Wantedcategories' => array( 'KategoriyayékeWazéné' ),
+ 'Wantedfiles' => array( 'DosyeyékeWazéné' ),
+ 'Wantedpages' => array( 'PerékeWazéné' ),
+ 'Wantedtemplates' => array( 'ŞablonékeWazéné' ),
+ 'Watchlist' => array( 'ListeySeyran' ),
+ 'Whatlinkshere' => array( 'PerarêGre' ),
+ 'Withoutinterwiki' => array( 'Béİnterwiki' ),
);
$magicWords = array(
@@ -338,9 +347,6 @@ $messages = array(
'tog-shownumberswatching' => 'Amarê karberanê seyrkerdoğan bımocne',
'tog-oldsig' => 'Ä°mzaya mewcude:',
'tog-fancysig' => 'İmza rê mameleyê wikimeqaley bıke (bê gıreyo otomatik)',
-'tog-externaleditor' => 'Editorê teberi standard bıxebetne (tenya seba ekspertano, komputerê şıma de eyarê xısusiy lazımê. [//www.mediawiki.org/wiki/Manual:External_editors Melumato vêşêr.])',
-'tog-externaldiff' => 'Têverşanayışan pê programê teberi vıraze (tenya seba ekspertano, komputerê şıma de eyarê xısusiy lazımê. [//www.mediawiki.org/wiki/Manual:External_editors Melumato vêşêr.])',
-'tog-showjumplinks' => 'Gıreyê "şo"y aktif ke',
'tog-uselivepreview' => 'Verqayt di weseye karneno (JavaScript lazım o) (Cerbino)',
'tog-forceeditsummary' => 'Mı ke xulasa kerde cı vira, hay be mı ser de',
'tog-watchlisthideown' => 'Vurnayışanê mı lista mına seyrkerdışi de bınımne',
@@ -354,6 +360,7 @@ $messages = array(
'tog-showhiddencats' => 'Kategoriyanê dızdiye bımocne',
'tog-noconvertlink' => 'Greyê sernami çerx kerdışi bıqefılne',
'tog-norollbackdiff' => 'Peyserardışi ra dıme ferqi caverde',
+'tog-useeditwarning' => 'Wexto ke mı yew pela nizami be vurnayışanê nêqeydbiyayeyan caverdê, hay be mı ser de',
'underline-always' => 'Tım',
'underline-never' => 'Qet',
@@ -417,6 +424,18 @@ $messages = array(
'oct' => 'TÅŸv',
'nov' => 'TÅŸp',
'dec' => 'Kan',
+'january-date' => 'Çele $1',
+'february-date' => 'Şıbate $1',
+'march-date' => 'Adar $1',
+'april-date' => 'Nisane $1',
+'may-date' => 'Gulane $1',
+'june-date' => 'Hezirane $1',
+'july-date' => 'Temuze $1',
+'august-date' => 'Tebaxe $1',
+'september-date' => 'KeÅŸkelun $1',
+'october-date' => 'Cıtan $1',
+'november-date' => 'Qasım $1',
+'december-date' => 'Kanun $1',
# Categories related messages
'pagecategories' => '{{PLURAL:$1|Kategoriye|Kategoriy}}',
@@ -502,6 +521,7 @@ $messages = array(
'create-this-page' => 'Na pele bınuse',
'delete' => 'Bestere',
'deletethispage' => 'Ena perer besternê',
+'undeletethispage' => 'Na perer mebesterne',
'undelete_short' => '{{PLURAL:$1|Yew vurnayışi|$1 Vurnayışan}} mestere',
'viewdeleted_short' => '{{PLURAL:$1|Yew vurnayışo esterıte|$1 Vurnayışanê esterıtan}} bımocne',
'protect' => 'Bıpawe',
@@ -545,7 +565,7 @@ $1',
'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).
+# 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).
'aboutsite' => 'Heqa {{SITENAME}}i de',
'aboutpage' => 'Project:Heqdê cı',
'copyright' => 'Zerrekacı $1 bındı not biya.',
@@ -555,7 +575,6 @@ $1',
'disclaimers' => 'Redê mesuliyeti',
'disclaimerpage' => 'Project:Reddê mesuliyetê bıngey',
'edithelp' => 'Peştdariya vurnayışi',
-'edithelppage' => 'Help:Vurnayış',
'helppage' => 'Help:Estêni',
'mainpage' => 'Pera Seri',
'mainpage-description' => 'Pela Seri',
@@ -587,7 +606,6 @@ $1',
'newmessagesdifflinkplural' => 'peyni {{PLURAL:$1|vurnayış|vurnayışi}}',
'youhavenewmessagesmulti' => '$1 mesaco newe esto',
'editsection' => 'bıvurne',
-'editsection-brackets' => '[$1]',
'editold' => 'bıvurne',
'viewsourceold' => 'çımey cı bıvinê',
'editlink' => 'bıvurne',
@@ -639,16 +657,9 @@ Seba lista pelanê xasanê vêrdeyan reca kena: [[Special:SpecialPages|{{int:spe
# General errors
'error' => 'Xırab',
'databaseerror' => 'Xeta serveri',
-'dberrortext' => 'Rêzê vateyê malumati de xeta bı.
-No xeta belka software ra yo.
-"<blockquote><tt>$1</tt></blockquote>.
-<tt>$2</tt>" ra pers kerdışê peyin:
-Malumatê yo ke xeta dayo "<tt>$3: $4</tt>".',
-'dberrortextcl' => 'Persê rêzê vateyê database de xeta bı.
-Persê databaseyê peyin:
-"$1"
-Fonksiyono ke ÅŸuxulyo "$2".
-Mesacê ke database dayo "$3: $4"',
+'databaseerror-query' => 'Perskerdış:$1',
+'databaseerror-function' => 'Fonksiyon: $1',
+'databaseerror-error' => 'Xırab: $1',
'laggedslavemode' => 'Diqet: Pel de newe vıraşteyi belka çini .',
'readonly' => 'database kılit biyo',
'enterlockreason' => 'Database kılit biyo',
@@ -701,12 +712,13 @@ Perse: $2',
'editinginterface' => "'''İqaz:''' Şıma hayo yew pela ke seba nuşteyê meqalanê cayanê bırnayeyan dana, vurnenê.
Vurnayışê na pele karberanê binan rê serpela karberi kena ke bımocno.
Seba çarnayışi, yardımê [//translatewiki.net/wiki/Main_Page?setlang=diq translatewiki.net]i ra procêdoşkerdışi rê diqet kerên.",
-'sqlhidden' => '(SQL pers kerdışê nımıte)',
'cascadeprotected' => 'No pel de vurnayiş qedexe biyo, çunke şıma tuşa "kademeyın" aqtif kerdo u no {{PLURAL:$1|pelo|pelo}} pawıteyo de xebıtyeno:
$2',
'namespaceprotected' => "No '''$1''' ca de icazetê şıma çino şıma pel rêz keri.",
'customcssprotected' => 'Mısadeyê şıma çıniyo ke na pela CSSi bıvurnên, çıke na pela xısusiye eyaranê karberan muhtewa kena.',
'customjsprotected' => 'Mısadeyê şıma çıniyo ke na pela Java Scripti bıvurnên, çıke na pela xısusiye eyaranê karberan muhtewa kena.',
+'mycustomcssprotected' => "Na pera CSS'i re tenya idarekari şene bıvurne",
+'mycustomjsprotected' => "Na pera JavaScript'i re tenya idarekari şene bıvurne",
'ns-specialprotected' => 'Pelê xısusiy nênê vurnayış.',
'titleprotected' => 'Eno [[User:$1|$1]] zerreyê ena peli nişeno vuriye.
Sebeb: "\'\'$2\'\'".',
@@ -731,10 +743,19 @@ Wexta ke verhafızayê cıgerayoxê şıma pak beno no benate de taye peli de he
'welcomecreation-msg' => 'Hesabê şıma abiyo.
[[Special:Preferences|{{SITENAME}} vurnayişê tercihanê xo]], xo vir ra mekere.',
'yourname' => 'Nameyê karberi:',
+'userlogin-yourname' => 'Nameyê karberi',
+'userlogin-yourname-ph' => 'Nameyê xoye karberi cıkewe',
+'createacct-another-username-ph' => 'Namey karberi de fi',
'yourpassword' => 'Parola',
+'userlogin-yourpassword' => 'Parola',
+'userlogin-yourpassword-ph' => 'Parolaya xo cıkewe',
+'createacct-yourpassword-ph' => 'Parola cıkewe',
'yourpasswordagain' => 'Parola reyna bınusne:',
+'createacct-yourpasswordagain' => 'Parola tesdiq ke',
+'createacct-yourpasswordagain-ph' => 'Parola fına cıkewe',
'remembermypassword' => 'Parola mı nê cıgeyrayoği de bia xo viri (seba tewr zêde $1 {{PLURAL:$1|roce|rocan}})',
-'securelogin-stick-https' => "Dekewtış kerdışi dıma HTTPS'i dı grêdaye bıman",
+'userlogin-remembermypassword' => 'Mı biya xo viri',
+'userlogin-signwithsecure' => 'Ebe teqdimkerê asayişın cıkewe',
'yourdomainname' => 'Nameyê şıma yo meydani',
'password-change-forbidden' => 'Şıma na wiki de nêşenê parola bıvurnê.',
'externaldberror' => 'Ya database de xeta esta ya zi heqê şıma çino şıma no hesab bıvurni.',
@@ -746,18 +767,40 @@ Wexta ke verhafızayê cıgerayoxê şıma pak beno no benate de taye peli de he
'logout' => 'Bıveciye',
'userlogout' => 'Bıveciye',
'notloggedin' => 'Şıma cıkewtış nêvıraşto',
+'userlogin-noaccount' => 'Hesabê şıma çıniyo?',
+'userlogin-joinproject' => 'Cıkewe {{SITENAME}}',
'nologin' => "Hesabê şıma çıniyo? '''$1'''.",
'nologinlink' => 'Yew hesab ake',
'createaccount' => 'Hesab vıraze',
'gotaccount' => "Hesabê şıma esto? '''$1'''.",
'gotaccountlink' => 'Cı kewe',
'userlogin-resetlink' => 'Melumatê cıkewtışi xo vira kerdê?',
+'userlogin-resetpassword-link' => 'Parolaya xo reset ke',
+'helplogin-url' => 'Help:Qeydbiyayış',
+'userlogin-helplink' => '[[{{MediaWiki:helplogin-url}}|Desteg be qeydbiyayış ra]]',
+'createacct-join' => 'Cêr melumatê xo cı ke',
+'createacct-emailrequired' => 'Adresa e-postey',
+'createacct-emailoptional' => 'Adresa e-postey (mecburi niya)',
+'createacct-email-ph' => 'Adresa e-posteyê xo cıkewe',
+'createacct-another-email-ph' => 'Adresa e-posta de fi',
'createaccountmail' => 'Yew parolaya rastameyiya ravêrdiye bıgurene û parola ena adresa e-postey rê bırışe',
+'createacct-realname' => 'Nameyo raştıkên (mecburi niyo)',
'createaccountreason' => 'Sebeb:',
+'createacct-reason' => 'Sebeb',
+'createacct-reason-ph' => 'Şımaye çı xo re zewbi hesab vırazeni?',
+'createacct-captcha' => 'Qontrolê asayişi',
+'createacct-imgcaptcha-ph' => 'Nuşteyo ke cor aseno ey cı ke',
+'createacct-submit' => 'Hesabê xo vıraze',
+'createacct-another-submit' => 'Zewbi hesab vıraz',
+'createacct-benefit-heading' => '{{SITENAME}} meÅŸ de merduman ÅŸi',
+'createacct-benefit-body1' => '{{PLURAL:$1|vurnayış|vurnayışi}}',
+'createacct-benefit-body2' => '{{PLURAL:$1|pele|peli}}',
+'createacct-benefit-body3' => '{{PLURAL:$1|iştıraqkerdoğo nıkayên|iştıraqkerdoğê nıkayêni}}',
'badretype' => 'Parolayê ke şıma nuşti yewbini nêtepışneni.',
'userexists' => 'Jewna karber enê nami karneno.
Mara reca xorê jewna name bınusnê.',
'loginerror' => 'Xetayê hesab ekerdışi',
+'createacct-error' => 'Xetaya vıraştışê hesabi',
'createaccounterror' => 'Hesab nêvırazyeno: $1',
'nocookiesnew' => 'Hesabê karberi vıraziya, labelê şıma nêşay cı kewê.
Semedê akerdışê hesabi çerezê {{SITENAME}}i gurêniyenê.
@@ -813,7 +856,7 @@ Yew formato meqbul de adresê e-posta bınuse ya zi veng bıverde.',
'createaccount-text' => 'Kesê, be e-posteyê şıma ra {{SITENAME}} ($4) de, ebe nameyê "$2" u parola "$3" ra yew hesab vıraşto.
Şıma gani cı kewê u parola xo nıka bıvurnê.',
'usernamehasherror' => 'Namey karberi de karakteri gani têmiyan ra mebê',
-'login-throttled' => 'Demekê cıwa ver de şıma zah teşebbusê hesab akerdış kerd.
+'login-throttled' => 'Demekê $1 cıwa ver de şıma zah teşebbusê hesab akerdış kerd.
Bıne vındere u newe ra dest pê bıkere.',
'login-abort-generic' => 'Dekewtışê şıma xırabo-terkneyayo',
'loginlanguagelabel' => 'Zıwan: $1',
@@ -833,8 +876,7 @@ Bıne vındere u newe ra dest pê bıkere.',
'newpassword' => 'Parola newiye:',
'retypenew' => 'Parola newiye tekrar ke:',
'resetpass_submit' => 'Parola eyar kere u newe ra dekewe',
-'resetpass_success' => 'Parolaya sima newke viriye!
-Newke dekewe...',
+'changepassword-success' => 'Parola şıma be serkewtış vuriye!',
'resetpass_forbidden' => 'parolayi nêvuryayi',
'resetpass-no-info' => 'şıma gani hesab akere u hona bıeşke bırese cı',
'resetpass-submit-loggedin' => 'Parola bıvurne',
@@ -846,10 +888,10 @@ Newke dekewe...',
# Special:PasswordReset
'passwordreset' => 'Parola reset ke',
-'passwordreset-text' => 'Seba eyarkerdışê parolaya xo ra nê formi pır kerê.',
+'passwordreset-text-one' => 'Na form de parola reset kerdış temamiye',
+'passwordreset-text-many' => '{{PLURAL:$1|Qande parola reset kerdışi cayanra taynın pırkeri}}',
'passwordreset-legend' => 'Parola reset ke',
'passwordreset-disabled' => 'Parola reset kerdış ena viki sera qefılneyayo.',
-'passwordreset-pretext' => '{{PLURAL:$1||Enê cerenan ra jeweri defiye de}}',
'passwordreset-username' => 'Nameyê karberi:',
'passwordreset-domain' => 'Domain:',
'passwordreset-capture' => 'neticey e-postay bımocne?',
@@ -872,7 +914,7 @@ Ena parolaya deqewe de u xorê ju parolaya newi bıweçine. Parolaya şıma emay
Parola vêrdiye: $2',
'passwordreset-emailsent' => 'Yew e-posteyê esterıtışê parola rışiya.',
'passwordreset-emailsent-capture' => 'Yew e-posteyê esterıtışê parolayo ke rışiya, no cêr mocniyayo.',
-'passwordreset-emailerror-capture' => 'ey cêri e-postay xo vira kerdışi vıraziyê lakin merdum dê $1 rê nêrışiyê.',
+'passwordreset-emailerror-capture' => 'Yew e-posteyê esterıtışê parolayo ke rışiya, no cêr mocniyayo, ema {{GENDER:$2|karber}}i rê rıştış de mıwefeq nêbi: $1',
# Special:ChangeEmail
'changeemail' => 'E-posta adresa xo bıvurnê',
@@ -886,6 +928,15 @@ Parola vêrdiye: $2',
'changeemail-submit' => 'E-postay xo bıvurne',
'changeemail-cancel' => 'Bıtexelne',
+# Special:ResetTokens
+'resettokens' => 'Reset fi ye',
+'resettokens-no-tokens' => 'Ena reset nefina',
+'resettokens-legend' => 'Reset fi ye',
+'resettokens-tokens' => 'Beli kerdeni:',
+'resettokens-token-label' => '$1 (weziyeta newki: $2)',
+'resettokens-done' => 'Reset fi',
+'resettokens-resetbutton' => 'Reset fiyayış weçin',
+
# Edit page toolbar
'bold_sample' => 'Metno qalın',
'bold_tip' => 'Metno qalın',
@@ -1076,12 +1127,15 @@ Yew sebeb beyan nibı.',
Hewna kerde aseno.',
'edit-conflict' => 'Vurnayişê pêverdiyaye .',
'edit-no-change' => 'Vurnayişê şıma qebul nêbı, çunke nuşte de yew vurnayiş n3evıraziya.',
+'postedit-confirmation' => 'Vurnayış qeyd be',
'edit-already-exists' => 'Pelo newe nêvıraziyeno.
Pel ca ra esto.',
'defaultmessagetext' => 'Hesıbyaye metne mesaci',
'content-failed-to-parse' => 'Qandê madela $3 zereyê $1, $2 sero nêagozyayo',
'invalid-content-data' => 'Zerrey malumati nêravêrdeyo',
'content-not-allowed-here' => '"$1" sero per da [[$2]] rê mısade nêdeyêno',
+'editwarning-warning' => 'ihtimal o ke wexta şıma peli ra bıveci, vurnayiş o ke şıma kerdo, hewna şiyêro .
+eke şıma kewtê hesabê xo, no hişyari tercihanê xo ra şıma eşkeni "{{int:prefs-editing}}" bıvındarnî .',
# Content models
'content-model-wikitext' => 'wikimetin',
@@ -1115,6 +1169,7 @@ Taye şabloni zerre pel de nêmociyayeni.',
'undo-failure' => 'Sebayê pêverameyişê vurnayişan karo tepêya gırewtış nêbı.',
'undo-norev' => 'Vurnayiş tepêya nêgeryeno çunke ya vere cû hewna biyo ya zi ca ra çino.',
'undo-summary' => 'Peysergırewtışê teshisê $1i be terefê [[Special:Contributions/$2|$2i]] ([[User talk:$2|Werênayış]])',
+'undo-summary-username-hidden' => "Rewizyona veri $1'i hewada",
# Account creation failure
'cantcreateaccounttitle' => 'Nêşenay hesab rakerê',
@@ -1295,6 +1350,7 @@ no vurnayişo ke şıma keni kontrol bıkere yew pelo kehen nêbo.',
'compareselectedversions' => 'Rewizyonanê weçineyan pêver ke',
'showhideselectedversions' => 'Revizyonanê weçinıtan bımocne/bınımne',
'editundo' => 'peyser bia',
+'diff-empty' => '(Babetna niyo)',
'diff-multi' => '({{PLURAL:$1|Yew revizyono miyanên|$1 revizyonê miyanêni}} terefê {{PLURAL:$2|yew karberi|$2 karberan}} nêmocno)',
'diff-multi-manyusers' => '({{PLURAL:$1|jew timar kerdışo qıckeko|$1 timar kerdışo qıckeko}} timar kerdo, $2 {{PLURAL:$2|Karber|karberi}} memocne)',
'difference-missing-revision' => 'Ferqê {{PLURAL:$2|Yew rewizyonê|$2 rewizyonê}} {{PLURAL:$2|dı|dı}} ($1) sero çıniyo.
@@ -1322,7 +1378,6 @@ Detayê besternayışi [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}
'searchmenu-legend' => 'bıgeyre tercihan (sae bıke)',
'searchmenu-exists' => "''Ena 'Wikipediya de ser \"[[:\$1]]\" yew pel esto'''",
'searchmenu-new' => "''Na Wiki de pelay \"[[:\$1]]\" vıraze!'''",
-'searchhelp-url' => 'Help:Tedeestey',
'searchmenu-prefix' => '[[Special:PrefixIndex/$1|pê eno prefix ser pelan de bigêre]]',
'searchprofile-articles' => 'Pelê tedeestey',
'searchprofile-project' => 'Pelê yardım u procey',
@@ -1365,15 +1420,6 @@ Pe verbendi ''all:'', vaceyê xo bıvurni ki contenti hemi cıgeyro (pelanê mı
'search-external' => 'Cıgeyrayışê teberi',
'searchdisabled' => '{{SITENAME}} no keyepel de cıgerayiş muweqqet bıryayo. no benatê de şıma pê Google eşkeni zerreyê {{SITENAME}} de cıgerayiş bıkeri.',
-# Quickbar
-'qbsettings' => 'Çûwo pêt',
-'qbsettings-none' => 'Çıniyo',
-'qbsettings-fixedleft' => 'Rêcaene çhep',
-'qbsettings-fixedright' => 'Rêcaene raşt',
-'qbsettings-floatingleft' => 'rêcaene çhep',
-'qbsettings-floatingright' => 'rêcaene raşt',
-'qbsettings-directionality' => 'Sabito, hereket de dosya da zıwan de şımaya gıredayeyo',
-
# Preferences page
'preferences' => 'Tercihi',
'mypreferences' => 'Tercihi',
@@ -1406,7 +1452,6 @@ Pe verbendi ''all:'', vaceyê xo bıvurni ki contenti hemi cıgeyro (pelanê mı
'resetprefs' => 'Vurnayışê ke qeyd nêbiy, pak ke',
'restoreprefs' => 'Sazanê hesıbyaya pêron newe ke',
'prefs-editing' => 'Cay pela nustısi',
-'prefs-edit-boxsize' => 'Ebatê pencereyê vurnayîşî.',
'rows' => 'Xeti:',
'columns' => 'Estûni:',
'searchresultshead' => 'Cı geyre',
@@ -1417,9 +1462,6 @@ Pe verbendi ''all:'', vaceyê xo bıvurni ki contenti hemi cıgeyro (pelanê mı
'recentchangesdays-max' => 'Tewr zaf $1 {{PLURAL:$1|roc|roci}}',
'recentchangescount' => 'Amarê vurnayışê ke hesıbyaye deye bımocneyê:',
'prefs-help-recentchangescount' => 'Ney de vurnayışê peyêni, tarixê pelan u cıkewteni asenê.',
-'prefs-help-watchlist-token' => 'Eke no ca pê kılito dızdeni/miyanki pırr bo, lista şımawa seyrkerdışi rê yew cıresnayışê RSSi vıraziyeno.
-Her kamo ke nê kılitê nê cay zaneno, şeno lista şımawa seyrkerdışi ki bıwano, coke ra yewo sağlem weçine.
-Etıya şıma rê yew kılito raştameo ke şıma şenê bıgurenê/bıxebetnê: $1',
'savedprefs' => 'Tecihê şıma qeyd biy.',
'timezonelegend' => 'Warey saete:',
'localtime' => 'saeta mehelliye:',
@@ -1450,7 +1492,6 @@ Etıya şıma rê yew kılito raştameo ke şıma şenê bıgurenê/bıxebetnê:
'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' => 'Tesdiqiya E-posta:',
-'prefs-textboxsize' => 'Ebatê pencerey vurnayışi',
'youremail' => 'E-Mail (mecbur niyo) *:',
'username' => '{{GENDER:$1|Nameyê karberi}}:',
'uid' => 'Kamiya {{GENDER:$1|karberi}}:',
@@ -1487,6 +1528,8 @@ Kaberê bini ke şıma de kewti irtıbat, adresa e-postey şıma eşkera nêbena
'prefs-dateformat' => 'Formatê tarixi',
'prefs-timeoffset' => 'Wext offset',
'prefs-advancedediting' => 'Herayen weçinayış',
+'prefs-editor' => 'Timarkar',
+'prefs-preview' => 'Verqayt',
'prefs-advancedrc' => 'Tercihê raverberdey',
'prefs-advancedrendering' => 'Tercihê raverberdey',
'prefs-advancedsearchoptions' => 'Tercihê raverberdey',
@@ -1494,6 +1537,7 @@ Kaberê bini ke şıma de kewti irtıbat, adresa e-postey şıma eşkera nêbena
'prefs-displayrc' => 'Tercihan bımocne',
'prefs-displaysearchoptions' => 'Weçinayışê mocnayışi',
'prefs-displaywatchlist' => 'Weçinayışê mocnayışi',
+'prefs-tokenwatchlist' => 'Morge',
'prefs-diffs' => 'Ferqi',
# User preference: email validation using jQuery
@@ -1587,11 +1631,13 @@ Kaberê bini ke şıma de kewti irtıbat, adresa e-postey şıma eşkera nêbena
'right-proxyunbannable' => 'Blokanê otomatikiê proksiyan ra ravêre',
'right-unblockself' => 'Blokeyınan ake',
'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-editprotected' => 'Pera pawıtiyan sero bıxebteye (bê pawıtena kaskadi (game be game))',
+'right-editsemiprotected' => 'Xısusi pera timaryayış "{{int:protect-level-autoconfirmed}}"',
'right-editinterface' => 'Interfaceê karberi sero bıgureye',
'right-editusercssjs' => 'CSS u dosyanê JSiê karberanê binan sero bıgureye',
'right-editusercss' => 'Dosyanê CSSiê karberanê binan sero bıgureye',
'right-edituserjs' => 'Dosyanê JSiê karberanê binan sero bıgureye',
+'right-viewmywatchlist' => 'Lista seyr de xo bıvin',
'right-rollback' => 'Lez/herbi vurnayışanê karberê peyêni tekrar bıke, oyo ke yew be yew pelê sero gureyao',
'right-markbotedits' => 'Vurnayışanê peyd ameyan, vurnayışê boti deye nışan kerê',
'right-noratelimit' => 'Sinoranê xızi (rate limit) ra tesir nêbi',
@@ -1653,9 +1699,15 @@ Kaberê bini ke şıma de kewti irtıbat, adresa e-postey şıma eşkera nêbena
'action-userrights-interwiki' => 'heqqa karberanê ke wikiyê binî de hemî bivurne',
'action-siteadmin' => 'database kilit bike ya zi a bike',
'action-sendemail' => 'e-posta bırşe',
+'action-editmywatchlist' => 'Listeyseyran de xo bıvırne',
+'action-viewmywatchlist' => 'Listeyseyran de xo bıvin',
+'action-viewmyprivateinfo' => 'Xısusi tercihane xo bıvin',
+'action-editmyprivateinfo' => 'Xısusi malumate xo bıvurne',
# Recent changes
'nchanges' => '$1 {{PLURAL:$1|fın vurna|fıni vurna}}',
+'enhancedrc-since-last-visit' => '$1 {{PLURAL:$1|ra yok wazino}}',
+'enhancedrc-history' => 'verenayış',
'recentchanges' => 'Vurnayışê peyêni',
'recentchanges-legend' => 'Tercihê vurnayışanê peyênan',
'recentchanges-summary' => 'Ena pele de wiki sero vurnayışanê peyênan teqib ke.',
@@ -1697,7 +1749,6 @@ Kaberê bini ke şıma de kewti irtıbat, adresa e-postey şıma eşkera nêbena
'recentchangeslinked-feed' => 'Vurnayışê elaqeyıni',
'recentchangeslinked-toolbox' => 'Vurnayışê elaqeyıni',
'recentchangeslinked-title' => 'vurnayışan ser "$1"',
-'recentchangeslinked-noresult' => 'Pelanê ke link biye ey vurnayîşî çino.',
'recentchangeslinked-summary' => "Lista cêrêne, pela bêlikerdiye rê (ya zi karberanê kategoriya bêlikerdiye rê) pelanê gırêdayoğan de lista de vurnayışê peyênana.
[[Special:Watchlist|Lista şımaya seyrkedışi de]] peli be nuşteyo '''qolınd''' bêli kerdê.",
'recentchangeslinked-page' => 'Nameyê pele:',
@@ -1709,7 +1760,7 @@ Kaberê bini ke şıma de kewti irtıbat, adresa e-postey şıma eşkera nêbena
'reuploaddesc' => 'Barkerdışi iptal ke u peyser şo formê barkerdışi',
'upload-tryagain' => 'Deskripyonê dosyayî ke vurîya ey qeyd bike',
'uploadnologin' => 'Şıma cıkewtış nêvıraşto',
-'uploadnologintext' => 'Ti gani [[Special:UserLogin|cikewte]] biyo ke dosya bar bike.',
+'uploadnologintext' => 'Ti ÅŸeni $1 dosya bar bikere.',
'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şî',
@@ -1931,7 +1982,6 @@ qey pawıtışi, img_auth.php battal verdiyayo.",
'http-read-error' => 'Wendişê HTTP de xeta esta.',
'http-timed-out' => 'Waştişê HTTP qediya.',
'http-curl-error' => 'Xetayê URLi: $1',
-'http-host-unreachable' => 'URL rê niresa.',
'http-bad-status' => 'Waştişê tu HTTP yew problem biya: $1 $2',
# Some likely curl errors. More could be added from <http://curl.haxx.se/libcurl/c/libcurl-errors.html>
@@ -1962,6 +2012,9 @@ keyepel nıka zaf meşğulo yew dema herayi de newe ra tesel bıkerê.',
'listfiles_size' => 'Gırdiye',
'listfiles_description' => 'Sılasnayış',
'listfiles_count' => 'Versiyoni',
+'listfiles-latestversion' => 'Versiyono verin',
+'listfiles-latestversion-yes' => 'E',
+'listfiles-latestversion-no' => 'Nê',
# File description page
'file-anchor-link' => 'Dosya',
@@ -2056,6 +2109,11 @@ listeya ke ha ver a têna na {{PLURAL:$1|dosyaya ewwili|dosyaya $1 ewwili}} mocn
'randompage' => 'Pela raÅŸtameyiye',
'randompage-nopages' => 'Ena {{PLURAL:$2|cayêname|cayênameyî}} de enê pelan çin o: $1.',
+# Random page in category
+'randomincategory' => 'Äžoseri pera kategoriya',
+'randomincategory-invalidcategory' => '"$1" namedı kategori çıniya',
+'randomincategory-selectcategory-submit' => 'Åžo',
+
# Random redirect
'randomredirect' => 'Xoseri hetenayış',
'randomredirect-nopages' => 'Ena cayênameyê "$1"î de redereksiyonî çin o.',
@@ -2081,10 +2139,6 @@ listeya ke ha ver a têna na {{PLURAL:$1|dosyaya ewwili|dosyaya $1 ewwili}} mocn
'statistics-users-active-desc' => '{{PLURAL:$1|roco peyin de|$1 roco peyin de}} karber ê ke kar kerdê.',
'statistics-mostpopular' => 'Pelayanê ke tewr zafî vînî biye',
-'disambiguations' => 'Pelayê ke maneyo bini rê gırey cı esto',
-'disambiguationspage' => 'Template:Maneo bin',
-'disambiguations-text' => "Peleyê ke satır da sıteyên dı pelanê '''maneo bin'''i rê esteyina zeregri mocnenê. Nara satırda dıdın dı zi <br />tiya de [[MediaWiki:Disambiguationspage|Pelaya Maneo do bini ]] gani heme gıreyê şablonê ciya-manayan re gıre dayış icab keno.",
-
'pageswithprop' => 'Peli be yew xısusiyetê pele',
'pageswithprop-legend' => 'Peli be yew xısusiyetê pele',
'pageswithprop-text' => 'Na per pimanen pera kena liste.',
@@ -2341,10 +2395,9 @@ Ena deme ra, ma qe vurnayışan ser ena pele tı haberdar keni.',
'unwatchthispage' => 'temaşa kerdışê peli vındarn.',
'notanarticle' => 'mebhesê peli niyo',
'notvisiblerev' => 'Revizyon esteriyayo',
-'watchnochange' => 'pelê listeya temaşakerdışê şıma ye wextê nişane biyaye de rocane nêbiyo.',
'watchlist-details' => '{{PLURAL:$1|$1 pele|$1 peleyan}} listeyê seyr-kerdışi şıma dı, peleyanê vurnayışi dahil niyo.',
-'wlheader-enotif' => 'pê * E-mail xeber dayiş biyo a.',
-'wlheader-showupdated' => "* ziyaretê şıma ye peyini de vuryayişê peli pê '''nuşteyo qalıni''' mocyayo.",
+'wlheader-enotif' => 'E-mail xeber dayiÅŸ abiyo.',
+'wlheader-showupdated' => "ziyaretê şıma ye peyini de vuryayişê peli pê '''nuşteyo qalıni''' mocyayo.",
'watchmethod-recent' => 'pel ê ke şıma temaşa kenî vuryayişê peyinê ey konrol beno',
'watchmethod-list' => 'pel ê ke şıma temaşa kenî vuryayişê peyinê ey konrol beno',
'watchlistcontains' => 'listeya seyrkerdışê şıma de $1 tene {{PLURAL:$1|peli|peli}} estî.',
@@ -2596,7 +2649,7 @@ $1',
'contributions' => 'İştıraqê {{GENDER:$1|karber}}i',
'contributions-title' => 'Dekerdenê karber de $1',
'mycontris' => 'İştıraqi',
-'contribsub2' => 'Qandê $1 ($2)',
+'contribsub2' => 'Qandê {{GENDER:$3|$1}} ($2)',
'nocontribs' => 'Ena kriteriya de vurnayîş çini yo.',
'uctop' => '(weziyet)',
'month' => 'AÅŸm:',
@@ -2752,11 +2805,8 @@ belka ver-grewtış wedariyayo.',
labele parçeya benateyê na $2 adresibi u ey ra ver-geryayo u şıma eşkeni no wedari.',
'ip_range_invalid' => 'Rêza IPi nêvêrena.',
'ip_range_toolarge' => 'Menzilan ke /$1 ra girdêrê inan rê izin nidano.',
-'blockme' => 'Mi blok bik',
'proxyblocker' => 'blokarê proxyi',
-'proxyblocker-disabled' => 'Eno fonksiyon nêxebetiyeno.',
'proxyblockreason' => 'IPadresa şıma yew proxyo akerdeyo u ey ra verniyê ey geriya.',
-'proxyblocksuccess' => 'Qeyd ke.',
'sorbs' => 'DNSBL',
'sorbsreason' => 'IP adresa şıma, hetê no {{SITENAME}} keyepeli ra DNSBL de proxy hesibyayo u liste biyo.',
'sorbs_create_account_reason' => 'IP adresa şıma, hetê no translatewiki.net keyepeli ra DNSBL de proxy hesibyayo u liste biyo.
@@ -2924,6 +2974,7 @@ eke şıma qayili paşt bıdi mahalli kerdışê wikimedyayi, kerem kerê pelê
'thumbnail-more' => 'Gırd ke',
'filemissing' => 'Dosya biya vini',
'thumbnail_error' => 'Thumbnail niviraziya: $1',
+'thumbnail_error_remote' => '$1 ra mesaco xırab: $2',
'djvu_page_error' => 'pelê DjVuyi bêşumulo',
'djvu_no_xml' => 'Qe DjVu nieşkenî XML fetch bikî',
'thumbnail-temp-create' => 'İdare dosyay resimiya nêvırazêna',
@@ -3150,13 +3201,8 @@ Tı eşkeno yew sebeb bınus.',
'pageinfo-category-files' => 'Amarê dosyeyan',
# Skin names
-'skinname-standard' => 'Klasik',
-'skinname-nostalgia' => 'Nostalciya',
'skinname-cologneblue' => 'Cologne Blue',
'skinname-monobook' => 'MonoBook',
-'skinname-myskin' => 'MySkin',
-'skinname-chick' => 'Şıq',
-'skinname-simple' => 'Rehat',
'skinname-modern' => 'Modern',
'skinname-vector' => 'Vektor',
@@ -3241,11 +3287,25 @@ Gurênayışê nae de, beno ke sistemê şıma zerar bıvêno.",
'minutes' => '{{PLURAL:$1|$1 deqa|$1 deqan}}',
'hours' => '{{PLURAL:$1|$1 saete|$1 saetan}}',
'days' => '{{PLURAL:$1|$1 roce|$1 rocan}}',
+'weeks' => '{{PLURAL:$1|$1 hefte|$1 hefteyan}}',
'months' => '{{PLURAL:$1|aÅŸme|$1 aÅŸman}}',
'years' => '{{PLURAL:$1|$1 serre|$1 serran}}',
'ago' => 'Verê $1',
'just-now' => 'Hema newke',
+# Human-readable timestamps
+'hours-ago' => 'Verê $1 {{PLURAL:$1|saete|saetan}}',
+'minutes-ago' => 'Verê $1 {{PLURAL:$1|deqa|deqan}}',
+'seconds-ago' => 'Verê $1 {{PLURAL:$1|saniya|saniyeyan}}',
+'monday-at' => 'Dışeme $1 de',
+'tuesday-at' => 'Sêşeme $1 de',
+'wednesday-at' => 'Çarşeme $1 de',
+'thursday-at' => 'PancÅŸeme $1 de',
+'friday-at' => 'Êne $1 de',
+'saturday-at' => 'Åžeme $1 de',
+'sunday-at' => 'Kırê $1 de',
+'yesterday-at' => 'Vızêri $1 de',
+
# Bad image list
'bad_image_list' => 'Şeklo umumi wınayo:
@@ -3330,7 +3390,7 @@ Eg ena dosya, kondisyonê orcinali ra bıvuriya, belki detayanê hemi nıeseno.'
'metadata-langitem' => "'''$2:''' $1",
'metadata-langitem-default' => '$1',
-# EXIF tags
+# Exif tags
'exif-imagewidth' => 'Herayey',
'exif-imagelength' => 'Dergi',
'exif-bitspersample' => 'yew parçe de biti',
@@ -3523,7 +3583,7 @@ $4, $5, $6 $7
$8',
'exif-subjectnewscode-value' => '$2 ($1)',
-# EXIF attributes
+# Exif attributes
'exif-compression-1' => 'Nêdegusneyayo',
'exif-compression-2' => 'CCITT Grube 3 1-ebadın kodkerdışê dergiya gurenayışê Huffmanio modifiyekerde',
'exif-compression-3' => 'CCITT Group 3 fax kodkerdış',
@@ -3865,7 +3925,6 @@ Ma rica keno tesdiq bike ke ti raştî wazeno eno pel bivirazo.",
'semicolon-separator' => '&#32;',
'comma-separator' => ',&#32;',
'colon-separator' => ':&#32;',
-'autocomment-prefix' => '-&#32;',
'pipe-separator' => '&#32;|&#32;',
'word-separator' => '&#32;',
'ellipsis' => '...',
@@ -4034,7 +4093,6 @@ Ti hem zi eÅŸkeno [[Special:EditWatchlist|use the standard editor]].',
'version-other' => 'Bin',
'version-mediahandlers' => 'Kulbê medyayî',
'version-hooks' => 'Çengelî',
-'version-extension-functions' => 'Funksiyonê ekstensiyonî',
'version-parser-extensiontags' => 'Etiketê ekstensiyon ê parserî',
'version-parser-function-hooks' => 'Çengelê ekstensiyon ê parserî',
'version-hook-name' => 'Nameyê çengelî',
@@ -4044,6 +4102,7 @@ Ti hem zi eÅŸkeno [[Special:EditWatchlist|use the standard editor]].',
'version-license' => 'Lisans',
'version-poweredby-credits' => "Ena wiki, dezginda '''[//www.mediawiki.org/ MediaWiki]''' ya piya vıraziyaya, heqê telifi © 2001-$1 $2.",
'version-poweredby-others' => 'Zewmi',
+'version-poweredby-translators' => "Açernere translatewiki.net'i",
'version-credits-summary' => 'Ma qayılime ke [[Special:Version|MediaWiki]] rê ke kami destek dayo wa mayê vanime inan bışınasne.',
'version-license-info' => "MediaWiki xoseri jew nuştereno; MediaWiki'yer, weqfê xoseri nuşteren GNU lisansiya merdumi şene ke vıla kerê, bıvurnê u timar kerê.
@@ -4059,12 +4118,16 @@ enê programiya piya [{{SERVER}}{{SCRIPTPATH}}/COPYING jew kopyay lisans dê GNU
'version-entrypoints-articlepath' => '[https://www.mediawiki.org/wiki/Manual:$wgArticlePath Article path]',
'version-entrypoints-scriptpath' => '[https://www.mediawiki.org/wiki/Manual:$wgScriptPath Script path]',
-# Special:FilePath
-'filepath' => 'Heruna dosyayer',
-'filepath-page' => 'Dosya:',
-'filepath-submit' => 'Åžo',
-'filepath-summary' => 'Na pela xısusiye raya temame jû dosya rê ana.
-Resımi be tam asayış mocniyayê, tipê dosyaê bini be programê cıyo elaqedar direkt dest keno pê.',
+# Special:Redirect
+'redirect' => "Hetenayışa dosyay, karberi yana rewizyona ID'i",
+'redirect-legend' => 'Hetenayışa dosya yana pela',
+'redirect-submit' => 'Åžo',
+'redirect-lookup' => 'Bewni',
+'redirect-value' => 'Erc:',
+'redirect-user' => "ID'ê Karberi",
+'redirect-revision' => 'Rewizyona pela',
+'redirect-file' => 'Namey dosya',
+'redirect-not-exists' => 'Erc nêvineyê',
# Special:FileDuplicateSearch
'fileduplicatesearch' => 'Dosyayanê zey pêyan cı geyrê',
@@ -4114,12 +4177,16 @@ satır ê ke pê ney # # destpêkenê zey mışore/mıjore muamele vineno.
'tags' => 'Etiketê vurnayîşê raştî',
'tag-filter' => 'Avrêcê [[Special:Tags|Etiketi]]:',
'tag-filter-submit' => 'Avrêc',
+'tag-list-wrapper' => '([[Special:Tags|{{PLURAL:$1|Etiket|Etiketi}}]]: $2)',
'tags-title' => 'Etiketan',
'tags-intro' => 'Eno pel de listeyê eyiketî este ke belki software pê ey edit kenî.',
'tags-tag' => 'Nameyê etiketi',
'tags-display-header' => 'Listeyê vurnayîşî de esayîş',
'tags-description-header' => 'Deskripsyonê manay ê hemî',
+'tags-active-header' => 'Activ o?',
'tags-hitcount-header' => 'Vurnayîşî ke etiket biyê',
+'tags-active-yes' => 'E',
+'tags-active-no' => 'Nê',
'tags-edit' => 'bıvurne',
'tags-hitcount' => '$1 {{PLURAL:$1|vurnayış|vurnayışi}}',
@@ -4155,6 +4222,9 @@ satır ê ke pê ney # # destpêkenê zey mışore/mıjore muamele vineno.
'htmlform-submit' => 'BiÅŸirav',
'htmlform-reset' => 'Vurnayişî reyna biyar',
'htmlform-selectorother-other' => 'Bin',
+'htmlform-no' => 'Nê',
+'htmlform-yes' => 'Eya',
+'htmlform-chosen-placeholder' => 'Opsiyon weçine',
# SQLite database support
'sqlite-has-fts' => '$1 tam-metn destegê cı geyrayışiya piya',
@@ -4271,4 +4341,16 @@ satır ê ke pê ney # # destpêkenê zey mışore/mıjore muamele vineno.
# Image rotation
'rotate-comment' => 'Resim heta sehata $1 {{PLURAL:$1|derece|derecey}} bi cerx',
+# Limit report
+'limitreport-title' => 'Agoznaye malumata profili:',
+'limitreport-cputime' => 'CPU dem karnayış',
+'limitreport-cputime-value' => '$1 {{PLURAL:$1|saniye|saniyeyan}}',
+'limitreport-walltime' => 'Raştay demdı bıkarn',
+'limitreport-walltime-value' => '$1 {{PLURAL:$1|saniye|saniyeyan}}',
+'limitreport-postexpandincludesize-value' => '$1/$2 {{PLURAL:$2|bayt|bayti}}',
+'limitreport-templateargumentsize' => 'Ebata hacetandi ÅŸablonan',
+'limitreport-templateargumentsize-value' => '$1/$2 {{PLURAL:$2|bayt|bayti}}',
+'limitreport-expansiondepth' => 'Tewr veşi herayina dergbiyayışi',
+'limitreport-expensivefunctioncount' => 'Amoriya fonksiyonde vay agozni',
+
);
diff --git a/languages/messages/MessagesDsb.php b/languages/messages/MessagesDsb.php
index b00d6ee4..ef04517a 100644
--- a/languages/messages/MessagesDsb.php
+++ b/languages/messages/MessagesDsb.php
@@ -15,6 +15,7 @@
* @author Kaganer
* @author Michawiki
* @author Murjarik
+ * @author Nemo bis
* @author Nepl1
* @author Pe7er
* @author Qualia
@@ -190,9 +191,6 @@ $messages = array(
'tog-shownumberswatching' => 'Licbu wobglědujucych wužywarjow pokazaś',
'tog-oldsig' => 'Eksistěrujuca signatura:',
'tog-fancysig' => 'Ze signaturu kaž z wikitekstom wobchadaś (bźez awtomatiskego wótkaza)',
-'tog-externaleditor' => 'Eksterny editor ako standard wužywaś (jano za ekspertow, pomina sebje specialne nastajenja na wašom licadle. [//www.mediawiki.org/wiki/Manual:External_editors Dalšne informacije.])',
-'tog-externaldiff' => 'Eksterny diff ako standard wužywaś (jano za ekspertow, pomina sebje specialne nastajenja na wašom licadle. [//www.mediawiki.org/wiki/Manual:External_editors Dalšne informacije.])',
-'tog-showjumplinks' => 'Wótkaze typa „źi do†zmóžniś',
'tog-uselivepreview' => 'Live-pśeglěd wužywaś (JavaScript) (eksperimentelnje)',
'tog-forceeditsummary' => 'Warnowaś, gaž pśi składowanju zespominanje felujo',
'tog-watchlisthideown' => 'Móje změny na wobglědowańskej lisćinje schowaś',
@@ -205,6 +203,7 @@ $messages = array(
'tog-diffonly' => 'Pśi pśirownowanju wersijow jano rozdźěle pokazaś',
'tog-showhiddencats' => 'Schowane kategorije pokazaÅ›',
'tog-norollbackdiff' => 'Rozdźěl pó slědkstajenju zanjechaś',
+'tog-useeditwarning' => 'Warnowaś, gaž bok spušća se z njeskłaźonymi změnami',
'underline-always' => 'pśecej',
'underline-never' => 'žednje',
@@ -392,7 +391,7 @@ $1',
'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).
+# 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).
'aboutsite' => 'Wó {{GRAMMAR:lokatiw|{{SITENAME}}}}',
'aboutpage' => 'Project:Wó_{{GRAMMAR:lokatiw|{{SITENAME}}}}',
'copyright' => 'Wopśimjeśe stoj pód $1.',
@@ -402,7 +401,6 @@ $1',
'disclaimers' => 'Impresum',
'disclaimerpage' => 'Project:impresum',
'edithelp' => 'Pomoc pśi wobźěłanju',
-'edithelppage' => 'Help:Pomoc pśi wobźěłanju',
'helppage' => 'Help:Pomoc',
'mainpage' => 'GÅ‚owny bok',
'mainpage-description' => 'GÅ‚owny bok',
@@ -479,17 +477,6 @@ Płaśece specialne boki namakaju se pód [[Special:SpecialPages|lisćinu specia
# General errors
'error' => 'Zmólka',
'databaseerror' => 'Zmólka w datowej bance',
-'dberrortext' => 'Syntaktiska zmólka pśi wótpšašowanju datoweje banki nastata.
-To by mógło zmólki w softwarje byś.
-Slědne wótpšašowanje jo było:
-<blockquote><code>$1</code></blockquote>
-z funkcije "<code>$2</code>".
-Datowa banka jo zmólku "<samp>$3: $4</samp>" wrośiła.',
-'dberrortextcl' => 'Syntaktiska zmólka pśi wótpšašowanju datoweje banki nastata.
-Slědne wopytane wótpšašowanje jo było:
-"$1"
-z funkcije "$2".
-Datowa banka jo zmólku "$3: $4" wrośiła',
'laggedslavemode' => 'Glědaj: Jo móžno, až pokazany bok nejaktualnjejše změny njewopśimjejo.',
'readonly' => 'Datowa banka jo zacynjona',
'enterlockreason' => 'Pšosym zapódaj pśicynu za zacynjenje datoweje banki a informaciju, ga buźo zasej pśistupna',
@@ -541,7 +528,6 @@ Wótpšašanje: $2',
Aby pśełožki za wšykne wikije pśidał abo změnił, wužyj pšosym [//translatewiki.net/ translatewiki.net], lokalizěrowański projekt MediaWiki.',
'editinginterface' => "'''Warnowanje:''' Wobźěłujoš bok, kótaryž se wužywa, aby se tekst za pówjerch software MediaWiki k dispoziciji stajił. Změny na toś tom boku buźo wuglědanje wužywarskego pówjercha za drugich wužywarjow na toś tom wikiju wobwliwowaś.
Aby pśełožki za wšykne wikije pśidał abo změnił, wužywaj pšosym [//translatewiki.net/ translatewiki.net], projekt MediaWiki za lokalizacije.",
-'sqlhidden' => '(Wótpšašanje SQL schowane)',
'cascadeprotected' => 'Za toś ten bok jo se wobźěłowanje znjemóžniło, dokulaž jo zawězany do {{PLURAL:$1|slědujucego boka|slědujuceju bokowu|slědujucych bokow}}, {{PLURAL:$1|kótaryž jo|kótarejž stej|kótarež su}} pśez kaskadowu opciju {{PLURAL:$1|šćitany|šćitanej|šćitane}}: $2',
'namespaceprotected' => "Njejsy wopšawnjony, boki w rumje: '''$1''' wobźěłaś.",
'customcssprotected' => 'Njamaš pšawo, aby toś ten CSS-bok wobźěłał, dokulaž wopśimujo wósobinske nastajenja drugego wužywarja.',
@@ -569,10 +555,18 @@ Móžoš {{SITENAME}} anomymnje dalej wužywaś abo móžoš <span class='plainl
'welcomeuser' => 'Witaj $1',
'welcomecreation-msg' => 'Twójo konto jo se załožyło. Njezabydni změniś swóje [[Special:Preferences|nastajenja za {{SITENAME}}]].',
'yourname' => 'mě wužywarja',
+'userlogin-yourname' => 'Wužywarske mě',
+'userlogin-yourname-ph' => 'Zapódaj swójo wužywarske mě',
'yourpassword' => 'šćitne gronidło:',
+'userlogin-yourpassword' => 'Gronidło',
+'userlogin-yourpassword-ph' => 'Zapódaj swójo gronidło',
+'createacct-yourpassword-ph' => 'Zapódaj gronidło',
'yourpasswordagain' => 'Šćitne gronidło hyšći raz zapódaś:',
+'createacct-yourpasswordagain' => 'Gronidło wobkšuśiś',
+'createacct-yourpasswordagain-ph' => 'Zapódaj gronidło hyšći raz',
'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ś',
+'userlogin-remembermypassword' => 'Pśizjawjony wóstaś',
+'userlogin-signwithsecure' => 'Wěsty zwisk wužywaś',
'yourdomainname' => 'Twója domejna',
'password-change-forbidden' => 'Njamóžoš gronidła w toś tom wikiju změniś.',
'externaldberror' => 'Abo jo wustupiła eksterna zmólka awtentifikacije datoweje banki, abo njesmějoš swójo eksterne wužywarske konto aktualizěrowaś.',
@@ -584,12 +578,17 @@ Móžoš {{SITENAME}} anomymnje dalej wužywaś abo móžoš <span class='plainl
'logout' => 'wótzjawiś se',
'userlogout' => 'wótzjawiś se',
'notloggedin' => 'Njepśizjawjony(a)',
+'userlogin-noaccount' => 'Njamaš wužywarske konto?',
+'userlogin-joinproject' => 'Konto za {{GRAMMAR:akuzatiw|{{SITENAME}}}} załožyś',
'nologin' => 'Njamaš wužywarske konto? $1.',
'nologinlink' => 'Nowe wužywarske konto załožyś',
'createaccount' => 'Wužywarske konto załožyś',
'gotaccount' => "Maš južo wužywarske konto? '''$1'''.",
'gotaccountlink' => 'Pśizjawiś se',
'userlogin-resetlink' => 'Sy pśizjawjeńske daty zabył?',
+'userlogin-resetpassword-link' => 'Gronidło anulěrowaś',
+'helplogin-url' => 'Help:Pśizjawiś',
+'userlogin-helplink' => '[[{{MediaWiki:helplogin-url}}|Pomoc za pśizjawjenje]]',
'createaccountmail' => 'Nachylne pśidatne gronidło wužywaś a jo na slědujucu e-mailowu adresu pósłaś',
'createaccountreason' => 'Pśicyna:',
'badretype' => 'Šćitnej gronidle, kótarejž sy zapódał, se njemakajotej.',
@@ -665,7 +664,7 @@ Móžoš toś te zdźělenje ignorowaś, jolic toś te konto jo se jano zamólnj
'newpassword' => 'Nowe šćitne gronidło:',
'retypenew' => 'Nowe šćitne gronidło (hyšći raz):',
'resetpass_submit' => 'Šćitne gronidło nastajiś a se pśizjawiś',
-'resetpass_success' => 'Twójo nowe šćitne gronidło jo nastajone. Něnto se pśizjaw …',
+'changepassword-success' => 'Twójo nowe šćitne gronidło jo nastajone. Něnto se pśizjaw …',
'resetpass_forbidden' => 'Gronidła njedaju se změniś',
'resetpass-no-info' => 'Dejš pśizjawjony byś, aby direktny pśistup na toś ten bok měł.',
'resetpass-submit-loggedin' => 'Gronidło změniś',
@@ -676,10 +675,8 @@ Sy snaź swójo gronidło južo wuspěšnje změnił abo nowe nachylne gronidło
# Special:PasswordReset
'passwordreset' => 'Gronidło slědk stajiś',
-'passwordreset-text' => 'Wupołni toś ten formular, aby swójo gronidło anulěrował.',
'passwordreset-legend' => 'Gronidło slědk stajiś',
'passwordreset-disabled' => 'Slědkstajenja gronidłow su se znjemóžnili na toś tom wikiju.',
-'passwordreset-pretext' => '{{PLURAL:$1||Zapódaj dołojce jadne ze slědujucych datowych podaśow}}',
'passwordreset-username' => 'Wužywarske mě:',
'passwordreset-domain' => 'Domena:',
'passwordreset-capture' => 'E-mail se woglědaś?',
@@ -898,12 +895,14 @@ Njejo žedno wujasnjenje.',
Zda sem až jo wulašowany.',
'edit-conflict' => 'Wobźěłański konflikt.',
'edit-no-change' => 'Wašo wobźěłanje jo se ignorěrowało, dokulaž tekst njejo se změnił.',
+'postedit-confirmation' => 'Twója změna jo se składła.',
'edit-already-exists' => 'Njejo móžno było nowy bok napóraś.
Eksistěrujo južo.',
'defaultmessagetext' => 'Standardny tekst powěźeńki',
'content-failed-to-parse' => 'Parsowanje wopśimjeśa $2 za model $1 jo se njeraźiło: $3',
'invalid-content-data' => 'Njepłaśiwe wopśimjeśowe daty',
'content-not-allowed-here' => 'Wopśimjeśe "$1" njejo na boku [[$2]] dowólone',
+'editwarning-warning' => 'Gaž toś ten bok se spušća, mógu se změny zgubiś, kótarež sy pśewjadł. Jolic sy pśizjawjeny, móžoš toś to warnowanje we wótrězku {{int:prefs-editing}} swójich nastajenjow znjemóžniś.',
# Content models
'content-model-wikitext' => 'wikitekst',
@@ -1142,7 +1141,6 @@ Drobnostki móžoš w [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}
'searchmenu-legend' => 'Pytańske opcije',
'searchmenu-exists' => "'''Jo bok z mjenim \"[[\$1]]\" na toÅ› tom wikiju'''",
'searchmenu-new' => "'''Napóraj bok \"[[:\$1|\$1]]\" na toś tom wikiju!'''",
-'searchhelp-url' => 'Help:Pomoc',
'searchmenu-prefix' => '[[Special:PrefixIndex/$1|Boki z toś tym prefiksom pśepytaś]]',
'searchprofile-articles' => 'Wopśimjeśowe boki',
'searchprofile-project' => 'Pomoc a projektowe boki',
@@ -1184,15 +1182,6 @@ Drobnostki móžoš w [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}
'search-external' => 'Eksterne pytanje',
'searchdisabled' => 'Pytanje we {{SITENAME}} jo se deaktiwěrowało. Tak dłujko móžoš w googlu pytaś. Pšosym wobmysli, až móžo pytanski indeks za {{SITENAME}} njeaktualny byś.',
-# Quickbar
-'qbsettings' => 'Bocna lejstwa',
-'qbsettings-none' => 'Žedne',
-'qbsettings-fixedleft' => 'nalěwo fiksěrowane',
-'qbsettings-fixedright' => 'napšawo fiksěrowane',
-'qbsettings-floatingleft' => 'nalěwo se znosujuce',
-'qbsettings-floatingright' => 'napšawo se znosujuce',
-'qbsettings-directionality' => 'Kšuty, wótwisny wót pisańskego směra twójeje rěcy',
-
# Preferences page
'preferences' => 'Nastajenja',
'mypreferences' => 'Nastajenja',
@@ -1225,7 +1214,6 @@ Drobnostki móžoš w [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}
'resetprefs' => 'Njeskłaźone změny zachyśiś',
'restoreprefs' => 'WÅ¡e standardne nastajenja wobnowiÅ›',
'prefs-editing' => 'Wobźěłaś',
-'prefs-edit-boxsize' => 'Wjelikosć wobźěłowańskego wokna',
'rows' => 'Rědki:',
'columns' => 'SÅ‚upy:',
'searchresultshead' => 'PytaÅ›',
@@ -1236,9 +1224,6 @@ Drobnostki móžoš w [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}
'recentchangesdays-max' => '(maksimalnje $1 {{PLURAL:$1|źeń|dnja|dny|dnjow}})',
'recentchangescount' => 'Licba změnow, kótaraž ma se pó standarźe pokazaś:',
'prefs-help-recentchangescount' => 'To wopśimujo aktualne změny, stawizny bokow a protokole.',
-'prefs-help-watchlist-token' => 'Wupołnjenje toś togo póla z pótajmnym klucom buźo RSS-kanal za twóju wobglědowańku napóraś.
-Něchten, kenž znajo kluc w toś tom pólu, móžo twóju wobglědowańku cytaś, wubjeŕ togodla wěstu gódnotu.
-How jo pśipadnje napórana gódnota, kótaruž móžoš wužywaś: $1',
'savedprefs' => 'Twóje nastajenja su se składowali.',
'timezonelegend' => 'Casowa cona:',
'localtime' => 'Městny cas:',
@@ -1269,7 +1254,6 @@ How jo pśipadnje napórana gódnota, kótaruž móžoš wužywaś: $1',
'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:',
-'prefs-textboxsize' => 'Wjelikosć wobźěłowańskego wokna',
'youremail' => 'E-mail:',
'username' => 'Mě {{GENDER:$1|wužywarja|wužywarki}}:',
'uid' => 'ID {{GENDER:$1|wužywarja|wužywarki}}:',
@@ -1506,7 +1490,6 @@ Móžoš toś ten bok wužywaś, aby slědk stajił swóje nastajenja na standar
'recentchangeslinked-feed' => 'Změny w zwězanych bokach',
'recentchangeslinked-toolbox' => 'Změny w zwězanych bokach',
'recentchangeslinked-title' => 'Změny na bokach, kótarež su z „$1“ zalinkowane',
-'recentchangeslinked-noresult' => 'Zalinkowane boki njejsu we wuzwólonem casu se změnili.',
'recentchangeslinked-summary' => "To jo lisćina slědnych změnow, kótarež buchu na wótkazanych bokach cynjone (resp. pśi wěstych kategorijach na cłonkach kategorije).
Boki na [[Special:Watchlist|wobglědowańce]] su '''tucne'''.",
'recentchangeslinked-page' => 'mÄ› boka:',
@@ -1518,7 +1501,7 @@ Boki na [[Special:Watchlist|wobglědowańce]] su '''tucne'''.",
'reuploaddesc' => 'Nagraśe pśetergnuś a slědk k nagrawańskemu formularoju',
'upload-tryagain' => 'Změnjone datajowe wopisanje wótpósłaś',
'uploadnologin' => 'Njepśizjawjony',
-'uploadnologintext' => 'Dejš se [[Special:UserLogin|pśizjawiś]], aby mógał dataje nagraś.',
+'uploadnologintext' => 'Dejš se $1, aby mógał dataje nagraś.',
'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',
@@ -1741,7 +1724,6 @@ Za optimalnu wěstotu img_auth.php jo znjemóžnjony.',
'http-read-error' => 'Cytańska zmólka HTTP.',
'http-timed-out' => 'HTTP-napšašowanje jo cas pśekšocyło.',
'http-curl-error' => 'Zmólka pśi wótwółowanju URL: $1',
-'http-host-unreachable' => 'URL njejo był pśistupny.',
'http-bad-status' => 'Wob cas HTTP-napšašowanje jo problem był: $1 $2',
# Some likely curl errors. More could be added from <http://curl.haxx.se/libcurl/c/libcurl-errors.html>
@@ -1887,11 +1869,6 @@ Snaź coš wopisanje na jeje [$2 boku datajowego wopisanja] wobźěłaś.',
'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',
'statistics-mostpopular' => 'Nejwěcej woglědane boki',
-'disambiguations' => 'Boki, kótarež wótkazuju na boki wěcejzmysłowosći',
-'disambiguationspage' => 'Template:Rozjasnjenje zapśimjeśow',
-'disambiguations-text' => 'Slědujuce boki wopśimuju nanejmjenjej jaden wótkaz k bokoju rozjasnjenja zapśimjeśow. Wóne by dejali město togo ku gódnjejšemu bokoju wótkazaś.<br />
-Maju bok za bok rozjasnjenja zapśimjeśow, gaž wužywa pśedłogu, na kótaruž wótkazujo se wót [[MediaWiki:Disambiguationspage]].',
-
'pageswithprop' => 'Boki z kakosću boka',
'pageswithprop-legend' => 'Boki z kakosću boka',
'pageswithprop-text' => 'Toś ten bok nalicyjo boki, kótarež wužywaju wěstu kakosć boka.',
@@ -2142,10 +2119,9 @@ Pózdźejšne změny na toś tom boku a w pśisłušecej diskusiji se tam nalicu
'unwatchthispage' => 'Dalej njewobglědowaś',
'notanarticle' => 'To njejo žeden nastawk',
'notvisiblerev' => 'Wersija bu wulašowana',
-'watchnochange' => 'Žeden wót tebje wobglědowany bok njejo se we wótpowědujucem casu wobźěłał.',
'watchlist-details' => 'Wobglědujoš {{PLURAL:$1|$1 bok|$1 boka|$1 boki|$1 bokow}}, bźez diskusijnych bokow.',
-'wlheader-enotif' => '* E-mailowe powěsće su aktiwizěrowane.',
-'wlheader-showupdated' => "* Boki, kótarež su wót twójogo slědnego woglěda se změnili, pokazuju se '''tucnje'''.",
+'wlheader-enotif' => 'E-mailowe powěsće su aktiwizěrowane.',
+'wlheader-showupdated' => "Boki, kótarež su wót twójogo slědnego woglěda se změnili, pokazuju se '''tucnje'''.",
'watchmethod-recent' => 'Kontrolěrowanje aktualnych změnow we wobglědowańce',
'watchmethod-list' => 'Pśepytanje wobglědowanych bokow za aktualnymi změnami',
'watchlistcontains' => 'Twója wobglědowańka wopśimujo $1 {{PLURAL:$1|bok|boka|boki|bokow}}.',
@@ -2532,13 +2508,11 @@ Glědaj do [[Special:BlockList|lisćiny blokěrowanjow]], aby blokěrowanja pśe
'ipb_blocked_as_range' => 'Zmólka: IP-adresa $1 njejo direktnje blokěrowana a njeda se wótblokěrowaś. Jo pak ako źěl wobcerka $2 blokěrowana, kótaryž da se wótblokěrowaś.',
'ip_range_invalid' => 'Njepłaśecy wobłuk IP-adresow.',
'ip_range_toolarge' => 'Wobcerkowe bloki, kótarež su wětše ako /$1, njejsu dowólone.',
-'blockme' => 'blokěruj mě',
'proxyblocker' => 'Blokěrowanje proxy',
-'proxyblocker-disabled' => 'Toś ta funkcija jo znjemóžnjona.',
'proxyblockreason' => 'Twója IP-adresa jo se blokěrowała, dokulaž jo wócynjony proxy. Pšosym kontaktěruj swójogo seśowego providera abo swóje systemowe administratory a informěruj je wó toś tom móžnem wěstotnem problemje.',
-'proxyblocksuccess' => 'Gótowe.',
'sorbsreason' => 'Twója IP-adresa jo w DNSBL we {{GRAMMAR:lokatiw|{{SITENAME}}}} zapisana ako wócynjony proxy.',
'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ś.',
+'xffblockreason' => 'IP-adresa w header X-Forwarded-For, pak twója pak ta proksy-serwera, kótaryž wužywaš, jo se zablokěrowała. Spócetna pśicyna za blokěrowanje jo była: $1',
'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',
@@ -2922,13 +2896,8 @@ W zespominanju dajo se pśicyna pódaś.',
'pageinfo-category-files' => 'Licba datajow',
# Skin names
-'skinname-standard' => 'Klasiski',
-'skinname-nostalgia' => 'Nostalgiski',
'skinname-cologneblue' => 'Kölnski Módry',
'skinname-monobook' => 'MonoBook',
-'skinname-myskin' => 'Mój šat',
-'skinname-chick' => 'Kurjetko',
-'skinname-simple' => 'Jadnorje',
'skinname-modern' => 'Moderny',
# Patrolling
@@ -3036,7 +3005,7 @@ Slědujuce wótkaze w tej samej smužce se za wuwześa naglědaju, w kótarychž
* gpslongitude
* gpsaltitude',
-# EXIF tags
+# Exif tags
'exif-imagewidth' => 'Šyrokosć',
'exif-imagelength' => 'Wusokosć',
'exif-bitspersample' => 'Bity na komponentu',
@@ -3214,7 +3183,7 @@ Slědujuce wótkaze w tej samej smužce se za wuwześa naglědaju, w kótarychž
'exif-originalimageheight' => 'Wusokosć wobraza pśed pśirězowanim',
'exif-originalimagewidth' => 'Šyrokosć wobraza pśed pśirězowanim',
-# EXIF attributes
+# Exif attributes
'exif-compression-1' => 'Njekompriměrowany',
'exif-compression-2' => 'CCITT kupka 3 jadnodimensionalne modificěrowane koděrowanje Huffman běgoweje dłujkosći',
'exif-compression-3' => 'CCITT kupka 3 faksowe koděrowanje',
@@ -3607,7 +3576,6 @@ Móžoš teke [[Special:EditWatchlist|standardny wobźěłowański bok wužywaś
'version-other' => 'Druge',
'version-mediahandlers' => 'Pśeźěłaki medijow',
'version-hooks' => 'Kokule',
-'version-extension-functions' => 'Funkcije rozšyrjenjow',
'version-parser-extensiontags' => 'Tagi parserowych rozšyrjenjow',
'version-parser-function-hooks' => 'Parserowe funkcije',
'version-hook-name' => 'MÄ› kokule',
@@ -3629,13 +3597,6 @@ Ty by dejał [{{SERVER}}{{SCRIPTPATH}}/COPYING kopiju licence GNU General Public
'version-entrypoints-header-entrypoint' => 'Zastupny dypk',
'version-entrypoints-header-url' => 'URL',
-# Special:FilePath
-'filepath' => 'Datajowa droga',
-'filepath-page' => 'Dataja:',
-'filepath-submit' => 'PytaÅ›',
-'filepath-summary' => 'Toś ten specialny bok wróśa dopołnu drogu za dataju.
-Wobraze se w połnym wótgranicowanju pokazuju, druge datajowe typy se ze zwězanym programom direktnje startuju.',
-
# Special:FileDuplicateSearch
'fileduplicatesearch' => 'Za duplikatnymi datajami pytaÅ›',
'fileduplicatesearch-summary' => 'Za datajowymi duplikatami na zakłaźe gótnoty hash pytaś.',
diff --git a/languages/messages/MessagesDtp.php b/languages/messages/MessagesDtp.php
index 436c90ab..2ec192b5 100644
--- a/languages/messages/MessagesDtp.php
+++ b/languages/messages/MessagesDtp.php
@@ -44,9 +44,6 @@ $messages = array(
'tog-shownumberswatching' => 'Pokitono ginumu do momomoguno minongintong',
'tog-oldsig' => 'Sain poinsandad:',
'tog-fancysig' => 'Pokitono sain sobaagi do tikwiki (ingaa oporian toput )',
-'tog-externaleditor' => 'Pomoguno pongigidit poinlabus sobaagi do pongoiso (montok di angasampin nopo, mongoguno do nuludan pointantu id kompiutonu. [//www.mediawiki.org/wiki/Manual:External_editors Lobi pomoilaan.])',
-'tog-externaldiff' => 'Pomoguno pongigidit poinlabus sobaagi do pongoiso (montok di angasampin nopo, mongoguno do nuludan pointantu id kompiutonu. [//www.mediawiki.org/wiki/Manual:External_editors Lobi pomoilaan.])',
-'tog-showjumplinks' => 'Pasagao "tumopik hilo" noputan awayaan',
'tog-uselivepreview' => 'Momoguno pongingintong poimpasi (momoguno JawaSikrip) (pogumbalan)',
'tog-forceeditsummary' => 'Posoroho oku no nung awu nosuangan kutak koinibaan niditan',
'tog-watchlisthideown' => 'Polisoko niditanku mantad do lis piintangan',
@@ -246,7 +243,7 @@ $1',
'pool-queuefull' => 'Noponu nuludan pool',
'pool-errorunknown' => 'Ukam nosilap',
-# 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).
+# 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).
'aboutsite' => 'Kokomoi {{SITENAME}}',
'aboutpage' => 'Project:Kokomoi',
'copyright' => 'Suang di haro do kokomoi $1.',
@@ -256,7 +253,6 @@ $1',
'disclaimers' => 'Pogoliman',
'disclaimerpage' => 'Project:Pogoliman kosoruan',
'edithelp' => 'Sokodung mongidit',
-'edithelppage' => 'Help:Mongidit',
'helppage' => 'Help:Susuang',
'mainpage' => 'Natad tagayo',
'mainpage-description' => 'Natad tagayo',
@@ -334,17 +330,6 @@ Lis pointopot bobolikon pinatantu okito id [[Special:SpecialPages|{{int:specialp
# General errors
'error' => 'Nosilopan',
'databaseerror' => 'Nakasala databing',
-'dberrortext' => 'Nokosilap pogiuludan databing.
-Haro kaanto kutu id posuang-suangon.
-Tohuri pinokianu pogiuludan databing nopo nga:
-<blockquote><code>$1</code></blockquote>
-mantad suang momoguno "<code>$2</code>".
-Databing nokosilap pinopoguli "<samp>$3: $4</samp>".',
-'dberrortextcl' => 'Haro kinosilapan pinongimuhatan sintak diri databing.
-Pinokianu databing di nokotohuri nopo nga:
-"$1"
-mantad kopomogunoon "$2".
-Nokosilap pinonimbar databing do "$3: $4"',
'laggedslavemode' => "'''Panansarahan:''' Awu moti kaanto nopinwoguan suang do bolikon diti.",
'readonly' => 'Nokunsian databing',
'enterlockreason' => 'Posuango sabab do mongunsi, poobion do gisom soira oukaban kunsi',
@@ -401,7 +386,6 @@ Nung mongoruhang toi monimban do waliwboros tongowiki, mangai noh gunoo iri puru
'editinginterface' => "Panansarahan :''' Mongidit ko diti bolikon di gunoon do poposodia diri pongurasan montok posuang-suangon.
Sinuratan id bolikon diti kopogoit do pongitanan kourasan momoguno montok momomoguno suai.
Montok mongoruhang toi monimban do waliwboros, gunoo noh [//translatewiki.net/ translatewiki.net], purujik popodusun ModiaWiki.",
-'sqlhidden' => '(Pongimuhatan SQL poinlisok)',
'cascadeprotected' => 'Notingoligan bolikon diti mantad do pingiditan tu nokosuang id bolikon, {{PLURAL:$1 | do | it}} pinilian tingolig "kasading" poinsikit:
$2',
'namespaceprotected' => "Ingaa kasagaannu do mongidit bobolikon it kinoingaran '''$1'''.",
@@ -435,7 +419,6 @@ Soroho noh do mongolon do [[Special:Preferences|{{SITENAME}} komoisaannu]].',
'yourpassword' => 'Kaatalib:',
'yourpasswordagain' => 'Mintaipo kaatalib:',
'remembermypassword' => 'Soroho ot loginku id popogihuman diti (gisom solinaid do $1 {{PLURAL:$1|tadau|madau}})',
-'securelogin-stick-https' => 'Toririmo poinhubung hilo HTTPS soira kosuang log',
'yourdomainname' => 'Damin nu:',
'password-change-forbidden' => 'Awu koh kopongolon kaatalib id wiki diti.',
'externaldberror' => 'Haro nokosilap pongintutunan bingdata toi awu ko pasagaon monginwagu takaun poinsoliwannu.',
@@ -542,7 +525,7 @@ Momongoh do sinuang log, mositi do powonsoionnu kaatalib wagu do hiti.:',
'newpassword' => 'Kaatalib wagu:',
'retypenew' => 'Mitaipo kaatalib wagu:',
'resetpass_submit' => 'Posoino kaatalib om sumuang log',
-'resetpass_success' => 'Naalanan noh kaatalibnu!
+'changepassword-success' => 'Naalanan noh kaatalibnu!
Baino sumuang log...',
'resetpass_forbidden' => 'Awu milo alanan kaatalib',
'resetpass-no-info' => 'Mositi sumuang log ko do mongoguno monilombus id bolikon diti.',
@@ -554,10 +537,8 @@ Naalanannu noh kaatalib toi nokopokianu koh no do kaatalib daamot.',
# Special:PasswordReset
'passwordreset' => 'Pudoliai kawagu kaatalib',
-'passwordreset-text' => 'Gonopo poom diti do mangaramit tongosurat-i ponorou do nokomoi id akaun.',
'passwordreset-legend' => 'Pudoliai kawagu kaatalib',
'passwordreset-disabled' => 'Pomudolian kawagu do kaatalib kitaantob id wiki diti.',
-'passwordreset-pretext' => '{{PLURAL:$1||Posuango iso data id siriba}}',
'passwordreset-username' => 'Ngarandait:',
'passwordreset-domain' => 'Sumanganu:',
'passwordreset-capture' => 'Intaai surat-i dii nowonsoi?',
@@ -953,7 +934,6 @@ Intaai [[Special:BlockList|lis nantaban]] montok lis kawawagu karaja mogoduh om
'searchmenu-legend' => 'Pilion ihum-ihumon',
'searchmenu-exists' => "'''Haro no bolikon pinungaranan do \"[[:\$1]]\" hiti id wiki.'''",
'searchmenu-new' => "'''Pomonsoi do bolikon \"[[:\$1]]\"hiti id wiki!'''",
-'searchhelp-url' => 'Help:Susuang',
'searchprofile-articles' => 'Suang bobolikon',
'searchprofile-project' => 'Tatabang om Tongobolikon purujik',
'searchprofile-images' => 'Multimodia',
@@ -993,14 +973,6 @@ Umbalai momogonop it ihumonnu miampai do ''all:'' mooi do oihum ot oinsanan suan
Milo ko mogihum maya Googol do daamot.
Imurai no do indik suang diti {{SITENAME}} nopo nga nokolipas.',
-# Quickbar
-'qbsettings' => 'Barposikap',
-'qbsettings-none' => 'Ingaa',
-'qbsettings-fixedleft' => 'Pogolibango',
-'qbsettings-fixedright' => 'Pawanano',
-'qbsettings-floatingleft' => 'Posoibaho gibang',
-'qbsettings-floatingright' => 'Posoibaho wanan',
-
# Preferences page
'preferences' => 'Pipilion',
'mypreferences' => 'Pipilion',
@@ -1105,7 +1077,6 @@ Imurai no do indik suang diti {{SITENAME}} nopo nga nokolipas.',
'recentchangeslinked' => 'Kinaalanan di kohompit',
'recentchangeslinked-toolbox' => 'Kinaalanan di kohompit',
'recentchangeslinked-title' => "Kinowolion 'parameter' it awu noguno: $1",
-'recentchangeslinked-noresult' => 'Ingaa nalanan do noputan bolikon id timpu nokomoi.',
'recentchangeslinked-summary' => "Iti nopo nga lis kawawagu kaalanai winonsoi kumaa noputan bobolikon mantad bolikon pointantu (toi kumaa momomoguno tinansaran pointantu).
Bobolikon id [[Special:Watchlist|lis pintangannu]] nopo nga '''pinakapal'''.",
'recentchangeslinked-page' => 'Ngaran bolikon:',
@@ -1171,8 +1142,6 @@ Kointalangan dilo [$2 kointalangan pail] okito id siriba.',
# Statistics
'statistics' => 'Runumboboyo',
-'disambiguationspage' => 'Template:patarango',
-
# Miscellaneous special pages
'nbytes' => '$1 {{PLURAL:$1|bait|babait}}',
'nmembers' => '$1 {{PLURAL:$1|koombolutan|tongokoombolutan}}',
diff --git a/languages/messages/MessagesDv.php b/languages/messages/MessagesDv.php
index 4016edc0..87c5aeb6 100644
--- a/languages/messages/MessagesDv.php
+++ b/languages/messages/MessagesDv.php
@@ -19,45 +19,74 @@ $rtl = true;
$namespaceNames = array(
NS_MEDIA => 'Þ‰Þ©Þ‘Þ¨Þ‡Þ§',
- NS_SPECIAL => 'Þ€Þ§Þ‡Þ°ÞžÞ¦',
+ NS_SPECIAL => 'ÞšÞ§Þ‡Þ°ÞÞ¦',
NS_MAIN => '',
NS_TALK => 'ÞšÞ¨Þ”Þ§ÞÞª',
NS_USER => 'Þ‰Þ¬Þ‰Þ°Þ„Þ¦ÞƒÞª',
NS_USER_TALK => 'Þ‰Þ¬Þ‰Þ°Þ„Þ¦ÞƒÞªÞŽÞ¬_ÞˆÞ§Þ€Þ¦Þ†Þ¦',
- NS_FILE => 'ÞŠÞ¦Þ‡Þ¨ÞÞ°',
- NS_FILE_TALK => 'ÞŠÞ¦Þ‡Þ¨ÞÞ°_ÞšÞ¨Þ”Þ§ÞÞª',
+ NS_PROJECT_TALK => '$1ÞŽÞ¬_ÞˆÞ§Þ€Þ¦Þ†Þ¦',
+ NS_FILE => 'ÞŠÞ¦Þ‡Þ¨ÞÞª',
+ 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(
+ 'Þ€Þ§Þ‡Þ°ÞžÞ¦' => NS_SPECIAL,
+ 'ÞŠÞ¦Þ‡Þ¨ÞÞ°' => NS_FILE,
+ 'ÞŠÞ¦Þ‡Þ¨ÞÞ°_ÞšÞ¨Þ”Þ§ÞÞª' => NS_FILE_TALK,
+ 'Þ‰Þ©Þ‘Þ¨Þ”Þ§ÞˆÞ¨Þ†Þ¨_ÞšÞ¨Þ”Þ§ÞÞª' => NS_MEDIAWIKI_TALK,
+ 'ފަންވަތް_ÞšÞ¨Þ”Þ§ÞÞª' => NS_TEMPLATE_TALK,
+ 'Þ‡Þ¬Þ€Þ©_ÞšÞ¨Þ”Þ§ÞÞª' => NS_HELP_TALK,
+ 'Þ¤Þ¨ÞÞ°Þ‰Þª_ÞšÞ¨Þ”Þ§ÞÞª' => NS_CATEGORY_TALK,
);
$specialPageAliases = array(
- 'Allpages' => array( 'Þ€ÞªÞƒÞ¨Þ€Þ§ ÞÞ¦ÞŠÞ°Þ™Þ§Þ‡Þ¬Þ‡Þ°' ),
+ 'Activeusers' => array( 'ހަރަކާތްތެރި_މެމްބަރުން' ),
+ 'Allmessages' => array( 'Þ€ÞªÞƒÞ¨Þ€Þ§_Þ‰Þ¬ÞÞ¬Þ–Þ¬Þ‡Þ°' ),
+ 'Allpages' => array( 'Þ€ÞªÞƒÞ¨Þ€Þ§_ÞžÞ¦ÞŠÞ°Þ™Þ§Þ‡Þ¬Þ‡Þ°' ),
+ 'Ancientpages' => array( 'ބާ_ޞަފްޙާތައް' ),
+ 'Blankpage' => array( 'Þ€ÞªÞÞ°_ÞžÞ¦ÞŠÞ°Þ™Þ§' ),
'Contributions' => array( 'Þ™Þ¨Þ‡Þ°ÞÞ§' ),
- 'CreateAccount' => array( 'Þ‰Þ¬Þ‰Þ°Þ„Þ¦ÞƒÞªÞ†Þ¦Þ‚Þ° Þ€Þ§ÞÞ¨ÞÞ°Þ†ÞªÞƒÞ¦Þ‡Þ°ÞˆÞ§' ),
- 'Emailuser' => array( 'Þ‰Þ¬Þ‰Þ°Þ„Þ¦ÞƒÞ¦ÞÞ° Þ‡Þ©-Þ‰Þ¬Þ‡Þ¨ÞÞ° ÞŠÞ®Þ‚ÞªÞˆÞ§' ),
- 'BlockList' => array( 'Þ„Þ°ÞÞ®Þ†Þ° Þ†ÞªÞƒÞ¬ÞˆÞ¨ÞŠÞ¦Þ‡Þ¨ÞˆÞ§ ÞÞ¨ÞÞ°Þ“Þ°' ),
- 'Listfiles' => array( 'ÞŠÞ¦Þ‡Þ¨ÞÞ° ÞÞ¨ÞÞ°Þ“Þ°' ),
- 'Longpages' => array( 'Þ‹Þ¨ÞŽÞª Þަފްޙާތައް' ),
- 'Newimages' => array( 'Þ‡Þ§ ÞŠÞ¦Þ‡Þ¨ÞÞ°' ),
- 'Newpages' => array( 'Þ‡Þ§ Þަފްހާތައް' ),
+ 'CreateAccount' => array( 'Þ‰Þ¬Þ‰Þ°Þ„Þ¦ÞƒÞªÞ†Þ¦Þ‚Þ°_Þ€Þ§ÞÞ¨ÞÞ°Þ†ÞªÞƒÞ¦Þ‡Þ°ÞˆÞ§' ),
+ 'Emailuser' => array( 'Þ‰Þ¬Þ‰Þ°Þ„Þ¦ÞƒÞ¦ÞÞ°_Þ‡Þ©-Þ‰Þ¬Þ‡Þ¨ÞÞ°_ÞŠÞ®Þ‚ÞªÞˆÞ§' ),
+ 'BlockList' => array( 'Þ„Þ°ÞÞ®Þ†Þ°_Þ†ÞªÞƒÞ¬ÞˆÞ¨ÞŠÞ¦Þ‡Þ¨ÞˆÞ§_ÞÞ¨ÞÞ°Þ“Þ°' ),
+ 'Listfiles' => array( 'ÞŠÞ¦Þ‡Þ¨ÞÞ°_ÞÞ¨ÞÞ°Þ“Þ°' ),
+ 'Log' => array( 'ÞÞ®ÞŽÞª' ),
+ 'Longpages' => array( 'Þ‹Þ¨ÞŽÞª_Þަފްޙާތައް' ),
+ 'Mypage' => array( 'Þ‰Þ¦ÞŽÞ­_ÞžÞ¦ÞŠÞ°Þ™Þ§' ),
+ 'Mytalk' => array( 'Þ‰Þ¦ÞŽÞ­_ÞˆÞ§Þ€Þ¦Þ†Þ¦' ),
+ 'Myuploads' => array( 'Þ‰Þ¦ÞŽÞ­_ÞŠÞ¦Þ‡Þ¨Þުތައް' ),
+ 'Newimages' => array( 'Þ‡Þ§_ÞŠÞ¦Þ‡Þ¨ÞÞ°' ),
+ 'Newpages' => array( 'Þ‡Þ§_Þަފްހާތައް' ),
'Preferences' => array( 'ތަރުޖީހުތައް' ),
- 'Protectedpages' => array( 'Þ‹Þ¨ÞŠÞ§Þ¢ÞªÞ†ÞªÞƒÞ¬ÞˆÞ¨ÞŠÞ¦Þ‡Þ¨ÞˆÞ§ Þަފްޙާތައް' ),
- 'Randompage' => array( 'Þ†Þ®Þ‚Þ°Þ‰Þ¬ÞˆÞ¬ÞÞ° ÞÞ¦ÞŠÞ°Þ™Þ§Þ‡Þ¬Þ‡Þ°' ),
- 'Recentchanges' => array( 'Þ‡Þ¬Þ‚Þ°Þ‰Þ¬ ÞŠÞ¦Þ€ÞªÞŽÞ¬ Þ„Þ¦Þ‹Þ¦Þްތައް' ),
- 'Shortpages' => array( 'Þ†ÞªÞƒÞª Þަފްޙާތައް' ),
- 'Specialpages' => array( 'Þ™Þ§Þ‡Þ°ÞÞ¦ Þަފްޙާތައް' ),
- 'Uncategorizedtemplates' => array( 'Þ¤Þ¨ÞÞ°Þ‰ÞªÞ†ÞªÞƒÞ¬ÞˆÞ¨ÞŠÞ¦Þ‡Þ¨ Þ‚ÞªÞˆÞ§ ފަންވަތް' ),
- 'Unusedcategories' => array( 'Þ„Þ­Þ‚ÞªÞ‚Þ° Þ‚ÞªÞ†ÞªÞƒÞ§ Þ¤Þ¨Þްމުތައް' ),
- 'Unusedimages' => array( 'Þ„Þ­Þ‚ÞªÞ‚Þ° Þ‚ÞªÞ†ÞªÞƒÞ§ ÞŠÞ¦Þ‡Þ¨ÞÞ°' ),
+ 'Protectedpages' => array( 'Þ‹Þ¨ÞŠÞ§Þ¢ÞªÞ†ÞªÞƒÞ¬ÞˆÞ¨ÞŠÞ¦Þ‡Þ¨ÞˆÞ§_Þަފްޙާތައް' ),
+ 'Protectedtitles' => array( 'ދިފާޢުކުރެވިފައިވާ_ނަންތައް' ),
+ 'Randompage' => array( 'Þ†Þ®Þ‚Þ°Þ‰Þ¬ÞˆÞ¬ÞÞ°_ÞÞ¦ÞŠÞ°Þ™Þ§Þ‡Þ¬Þ‡Þ°' ),
+ 'Recentchanges' => array( 'Þ‡Þ¬Þ‚Þ°Þ‰Þ¬_ÞŠÞ¦Þ€ÞªÞŽÞ¬_Þ„Þ¦Þ‹Þ¦Þުތައް' ),
+ 'Search' => array( 'Þ€Þ¯Þ‡Þ°Þ‹Þ¦ÞˆÞ§' ),
+ 'Shortpages' => array( 'Þ†ÞªÞƒÞª_Þަފްޙާތައް' ),
+ 'Specialpages' => array( 'Þ™Þ§Þ‡Þ°ÞÞ¦_Þަފްޙާތައް' ),
+ 'Statistics' => array( 'ތަފާÞÞ°Þ€Þ¨ÞÞ§Þ„Þª' ),
+ 'Uncategorizedpages' => array( 'Þ¤Þ¨ÞÞ°Þ‰ÞªÞ†ÞªÞƒÞ¬ÞˆÞ¨ÞŠÞ¦Þ‡Þ¨Þ‚ÞªÞˆÞ§_ޞަފްޙާތައް' ),
+ 'Uncategorizedtemplates' => array( 'Þ¤Þ¨ÞÞ°Þ‰ÞªÞ†ÞªÞƒÞ¬ÞˆÞ¨ÞŠÞ¦Þ‡Þ¨Þ‚ÞªÞˆÞ§_ފަންވަތް' ),
+ 'Unusedcategories' => array( 'Þ„Þ­Þ‚ÞªÞ‚Þ°_Þ‚ÞªÞ†ÞªÞƒÞ§_Þ¤Þ¨Þްމުތައް' ),
+ 'Unusedimages' => array( 'Þ„Þ­Þ‚ÞªÞ‚Þ°_Þ‚ÞªÞ†ÞªÞƒÞ§_ÞŠÞ¦Þ‡Þ¨ÞÞ°' ),
+ 'Unusedtemplates' => array( 'ބޭނުންނުކުރާ_ފަންވަތްތައް' ),
'Upload' => array( 'ÞŠÞ®Þ‚ÞªÞ‡Þ°ÞˆÞ§' ),
'Userlogin' => array( 'ÞˆÞ¦Þ‹Þ¬ÞˆÞ¦Þ‘Þ¦Þ‡Þ¨ÞŽÞ¦Þ‚Þ°Þ‚Þ¦ÞˆÞ§' ),
- 'Userlogout' => array( 'Þ„Þ­ÞƒÞ¦ÞÞ° ÞˆÞ¦Þ‘Þ¦Þ‡Þ¨ÞŽÞ¦Þ‚Þ°Þ‚Þ¦ÞˆÞ§' ),
+ 'Userlogout' => array( 'Þ„Þ­ÞƒÞ¦ÞÞ°_ÞˆÞ¦Þ‘Þ¦Þ‡Þ¨ÞŽÞ¦Þ‚Þ°Þ‚Þ¦ÞˆÞ§' ),
+ 'Wantedcategories' => array( 'Þ„Þ­Þ‚ÞªÞ‚Þ°ÞˆÞ§_Þ¤Þ¨Þްމުތައް' ),
+ 'Wantedfiles' => array( 'Þ„Þ­Þ‚ÞªÞ‚Þ°ÞˆÞ§_ÞŠÞ¦Þ‡Þ¨Þުތައް' ),
+ 'Wantedpages' => array( 'ބޭނުންވާ_ޞަފްޙާތައް' ),
+ 'Wantedtemplates' => array( 'ބޭނުންވާ_ފަންވަތްތައް' ),
+ 'Watchlist' => array( 'Þ‰Þ¦ÞŽÞ­_Þ‚Þ¦Þ’Þ¦ÞƒÞª' ),
);
$messages = array(
@@ -232,7 +261,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).
+# 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).
'aboutsite' => '{{SITENAME}}ގެ ތަޢާރަފު',
'aboutpage' => 'Project:ތަޢާރަފު',
'copyright' => 'Þ€ÞªÞƒÞ¨Þ€Þ§ Þ‰Þ§Þ‡Þ°Þ‹Þ§Þ‡Þ¬Þ‡Þ° $1 ÞŽÞ¬ Þ‹Þ¦ÞÞªÞ‚Þ° ÞÞ¨Þ„Þ¬Þ‚Þ° Þ‡Þ¬Þ„Þ¦Þ€ÞªÞ‡Þ°Þ“Þ¬ÞˆÞ¬.',
@@ -242,7 +271,6 @@ $1',
'disclaimers' => 'Þ‡Þ¨Þ‡ÞªÞާނުތައް',
'disclaimerpage' => 'Project:Þ¢Þ§Þ‡Þ°Þ‰Þª Þ¢Þ¨Þ‡ÞªÞާނުތައް',
'edithelp' => 'Þ„Þ¦Þ‹Þ¦Þުތައް ÞŽÞ¬Þ‚Þ¦Þ‡ÞªÞ‰Þ¦ÞÞ° Þ‡Þ¬Þ€Þ© Þ‡Þ¬Þ‡Þ°',
-'edithelppage' => 'އެހީ: އުނިއިތުރު ގެންނެވުން',
'helppage' => 'Help:ÞŠÞ¨Þ€ÞªÞƒÞ¨Þްތު',
'mainpage' => 'Þ‰Þ¦Þ‡Þ¨ ÞžÞ¦ÞŠÞ°Þ™Þ§',
'mainpage-description' => 'Þ‰Þ¦Þ‡Þ¨ ÞžÞ¦ÞŠÞ°Þ™Þ§',
@@ -348,7 +376,7 @@ $1',
'newpassword' => 'Þ‡Þ¦Þ‡Þª ÞÞ¨Þ‡Þ°ÞƒÞªÞ„Þ¦ÞÞ°:',
'retypenew' => 'Þ‡Þ¦Þ‡Þª ÞÞ¨Þ‡Þ°ÞƒÞªÞ„Þ¦ÞÞ° Þ‡Þ¦ÞÞªÞ‚Þ°ÞÞ¨Þ”ÞªÞ‡Þ°ÞˆÞ§:',
'resetpass_submit' => 'ÞÞ¨Þ‡Þ°ÞƒÞªÞ„Þ¦ÞÞ° Þ€Þ¦Þ‰Þ¦Þ–Þ¦Þ‡Þ°ÞÞ¦ÞˆÞ§ÞŠÞ¦Þ‡Þ¨ ÞˆÞ¦Þ‹Þ¬ÞˆÞ¦Þ‘Þ¦Þ‡Þ¨ÞŽÞ¦Þ‚Þ°Þ‚Þ¦ÞˆÞ§',
-'resetpass_success' => 'ތިބެފުޅާގެ ÞÞ¨Þ‡Þ°ÞƒÞªÞ„Þ¦ÞÞ° Þ„Þ¦Þ‹Þ¦ÞÞªÞ†ÞªÞƒÞ¬ÞˆÞ¨Þ‡Þ°Þ–Þ¬.
+'changepassword-success' => 'ތިބެފުޅާގެ ÞÞ¨Þ‡Þ°ÞƒÞªÞ„Þ¦ÞÞ° Þ„Þ¦Þ‹Þ¦ÞÞªÞ†ÞªÞƒÞ¬ÞˆÞ¨Þ‡Þ°Þ–Þ¬.
Þ‰Þ¨Þ€Þ§ÞƒÞª ÞˆÞ¦Þ‹Þ¬ÞˆÞ¦Þ‘Þ¦Þ‡Þ¨ÞŽÞ¦Þ‚Þ°Þ‚Þ¦ÞˆÞ¦Þ‚Þ©...',
'resetpass_forbidden' => 'ÞÞ¨Þ‡Þ°ÞƒÞªÞ„Þ¦ÞÞ° Þ„Þ¦Þ‹Þ¦ÞÞ¬Þ‡Þ° Þ‚ÞªÞ†ÞªÞƒÞ¬ÞˆÞ­Þ‚Þ¬Þ‡Þ¬ÞˆÞ¬',
'resetpass-submit-loggedin' => 'ÞÞ¨Þ‡Þ°ÞƒÞªÞ„Þ¦ÞÞ° Þ„Þ¦Þ‹Þ¦ÞÞªÞ†ÞªÞƒÞ¦Þ‡Þ°ÞˆÞ§',
@@ -470,7 +498,6 @@ $1',
'shown-title' => 'Þ‹Þ¦Þ‡Þ°Þ†Þ¦ÞˆÞ§Þ‚Þ© ÞžÞ¦ÞŠÞ°Þ™Þ§Þ‡Þ¦Þ†Þ¦ÞÞ° $1 {{PLURAL:$1|ނަތީޖާ|ނަތީޖާ }}',
'viewprevnext' => 'Þ„Þ¦Þ‡Þ°ÞÞ¦ÞˆÞ§($1 {{int:pipe-separator}} $2) ($3).',
'searchmenu-new' => "''' Þ‰Þ¨ ÞˆÞ¨Þ†Þ©ÞŽÞ¦Þ‡Þ¨ \"[[:\$1]]\" ÞŠÞ¦ÞÞ°Þ“Þ¦ÞˆÞ¦Þ‡Þ¨Þ‹Þ¬Þ‡Þ°ÞˆÞ§! '''",
-'searchhelp-url' => 'Help:ÞŠÞ¨Þ€ÞªÞƒÞ¨Þްތު',
'searchprofile-articles' => 'މަޒުމޫނު ޞަފްޙާތައް',
'searchprofile-project' => 'Þ‡Þ¬Þ€Þ© ޞަފްޙާތަކާއި Þ‰Þ¦ÞÞ°ÞƒÞ«Þ¢Þª ޞަފްޙާތައް',
'searchprofile-images' => 'Þ‰Þ¦ÞÞ°Þ“Þ¨Þ‰Þ©Þ‘Þ¨Þ‡Þ§',
@@ -707,7 +734,6 @@ Also see [[Special:WantedCategories|wanted categories]].',
'blocklink' => 'ÞŠÞ¨Þ”Þ¦ÞˆÞ¦Þ…ÞªÞ‡Þ¦Þ…ÞªÞ‡Þ°ÞˆÞ§',
'unblocklink' => 'ÞŠÞ¨Þ”Þ¦ÞˆÞ¦Þ…ÞªÞ‡Þ¬Þ…ÞªÞ‚Þ° Þ„Þ¦Þ‹Þ¦ÞÞªÞ†ÞªÞƒÞ¦Þ‡Þ°ÞˆÞ§',
'contribslink' => 'Þ™Þ¨Þ‡Þ°ÞžÞ§',
-'proxyblocksuccess' => 'ÞŠÞªÞƒÞ¨Þ€Þ¦Þ‰Þ¦ÞˆÞ¬Þ‡Þ°Þ–Þ¬.',
# Developer tools
'lockdb' => 'Þ†Þ®ÞÞ§ÞƒÞª Þ„Þ¦Þ‚Þ°Þ‹ÞªÞ†ÞªÞƒÞ¦Þ‡Þ°ÞˆÞ§',
@@ -801,7 +827,7 @@ Also see [[Special:WantedCategories|wanted categories]].',
# Metadata
'metadata' => 'Þ‰Þ¬Þ“Þ¦Þ‘Þ­Þ“Þ§',
-# EXIF tags
+# Exif tags
'exif-imagewidth' => 'ÞŠÞªÞ…Þ§Þ‰Þ¨Þ‚Þ°',
'exif-imagelength' => 'Þ‡ÞªÞÞ°Þ‰Þ¨Þ‚Þ°',
'exif-imagedescription' => 'ތަÞÞ°ÞˆÞ©ÞƒÞªÞŽÞ¬ ÞÞªÞƒÞªÞ€Þ©',
diff --git a/languages/messages/MessagesEe.php b/languages/messages/MessagesEe.php
index 633f5f28..5c7c89eb 100644
--- a/languages/messages/MessagesEe.php
+++ b/languages/messages/MessagesEe.php
@@ -588,9 +588,6 @@ Wòateŋu akpɔ alesi woŋlɔe.',
# Special:Version
'version' => 'Tata',
-# Special:FilePath
-'filepath-submit' => 'Yi',
-
# Special:FileDuplicateSearch
'fileduplicatesearch-submit' => 'Dii',
diff --git a/languages/messages/MessagesEgl.php b/languages/messages/MessagesEgl.php
index ccc01396..0d97e11e 100644
--- a/languages/messages/MessagesEgl.php
+++ b/languages/messages/MessagesEgl.php
@@ -322,14 +322,6 @@ Cancellä',
'powersearch-toggleall' => 'Tütt',
'powersearch-togglenone' => 'Ansöin',
-# Quickbar
-'qbsettings' => 'Quickbar',
-'qbsettings-none' => 'Ansöin',
-'qbsettings-fixedleft' => 'Fiss a sinistar',
-'qbsettings-fixedright' => 'Fiss a destar',
-'qbsettings-floatingleft' => 'Fluttuant a sinistar',
-'qbsettings-floatingright' => 'Fluttuant a destar',
-
# Preferences page
'preferences' => 'Prefereinz',
'mypreferences' => 'Al me prefereinz',
@@ -610,7 +602,7 @@ Vadä la pàgina dal file',
# Metadata
'metadata' => 'Metadat',
-# EXIF tags
+# Exif tags
'exif-exposuretime-format' => '$1 s ($2)',
'exif-gpsareainformation' => "Nom d'la zona GPS",
'exif-gpsdatestamp' => 'Data GPS',
@@ -657,10 +649,6 @@ Vadä la pàgina dal file',
'version-license' => 'Licinza',
'version-poweredby-others' => 'ätar',
-# Special:FilePath
-'filepath-page' => 'Immàgin:',
-'filepath-submit' => 'Vé',
-
# Special:FileDuplicateSearch
'fileduplicatesearch-filename' => 'Nom dal file:',
'fileduplicatesearch-submit' => 'Cercä',
diff --git a/languages/messages/MessagesEl.php b/languages/messages/MessagesEl.php
index a5983829..ab4f228c 100644
--- a/languages/messages/MessagesEl.php
+++ b/languages/messages/MessagesEl.php
@@ -37,6 +37,7 @@
* @author Reedy
* @author Remember the dot
* @author Sinopeus
+ * @author Tifa93
* @author Urhixidur
* @author Xaris333
* @author ZaDiak
@@ -100,13 +101,16 @@ $specialPageAliases = array(
'Allmessages' => array( 'ΌλαΤαΜηνÏματα' ),
'Allpages' => array( 'ΌλεςΟιΣελίδες' ),
'Ancientpages' => array( 'ΑÏχαίεςΣελίδες' ),
+ 'Badtitle' => array( 'ΚακόςΤίτλος' ),
'Blankpage' => array( 'ΚενήΣελίδα' ),
'Block' => array( 'ΦÏαγή', 'ΦÏαγήIP', 'ΦÏαγήΧÏήστη' ),
'Blockme' => array( 'ΦÏαγήΕμένα' ),
'Booksources' => array( 'ΠηγέςΒιβλίων' ),
'BrokenRedirects' => array( 'ΚατεστÏαμμένεςΑνακατευθÏνσεις' ),
'Categories' => array( 'ΚατηγοÏίες' ),
+ 'ChangeEmail' => array( 'ΑλλαγήEmail' ),
'ChangePassword' => array( 'ΑλλαγήΚωδικοÏ', 'ΑÏχικοποίησηΠάσου', 'ΑÏχικοποίησηΚωδικοÏ' ),
+ 'ComparePages' => array( 'ΣÏγκÏισηΣελίδων' ),
'Confirmemail' => array( 'ΕπιβεβαίωσηEmail' ),
'Contributions' => array( 'ΣυνεισφοÏές' ),
'CreateAccount' => array( 'ΔημιουÏγίαΛογαÏιασμοÏ' ),
@@ -145,6 +149,7 @@ $specialPageAliases = array(
'Mycontributions' => array( 'ΟιΣυνεισφοÏέςΜου' ),
'Mypage' => array( 'ΗΣελίδαΜου' ),
'Mytalk' => array( 'ΗΣυζήτησήΜου' ),
+ 'Myuploads' => array( 'ΟιΕπιφοÏτώσειςΜου' ),
'Newimages' => array( 'ÎέαΑÏχεία', 'ÎέεςΕικόνες' ),
'Newpages' => array( 'ÎέεςΣελίδες' ),
'Popularpages' => array( 'ΔημοφιλείςΣελίδες' ),
@@ -386,9 +391,6 @@ $messages = array(
'tog-shownumberswatching' => 'Εμφάνιση του αÏÎ¹Î¸Î¼Î¿Ï Ï„Ï‰Î½ συνδεδεμένων χÏηστών',
'tog-oldsig' => 'ΥπάÏχουσα υπογÏαφή:',
'tog-fancysig' => 'ΜεταχείÏιση υπογÏαφής ως κώδικα wiki (χωÏίς αυτόματο σÏνδεσμο)',
-'tog-externaleditor' => 'ΧÏήση εξωτεÏÎ¹ÎºÎ¿Ï ÎµÏ€ÎµÎ¾ÎµÏγαστή από Ï€Ïοεπιλογή (για Ï€ÏοχωÏημένους μόνο, χÏειάζεται ειδικές Ïυθμίσεις του υπολογιστή σας. [//www.mediawiki.org/wiki/Manual:External_editors ΠεÏισσότεÏες πληÏοφοÏίες.])',
-'tog-externaldiff' => 'ΧÏήση εξωτεÏÎ¹ÎºÎ¿Ï diff από Ï€Ïοεπιλογή (για Ï€ÏοχωÏημένους μόνο, χÏειάζεται ειδικές Ïυθμίσεις του υπολογιστή σας. [//www.mediawiki.org/wiki/Manual:External_editors ΠεÏισσότεÏες πληÏοφοÏίες.])',
-'tog-showjumplinks' => 'ΕνεÏγοποίηση των συνδέσμων Ï€Ïοσβασιμότητας του Ï„Ïπου «μετάβαση σε»',
'tog-uselivepreview' => 'ΧÏήση ζωντανής Ï€Ïοεπισκόπησης (απαιτεί JavaScript) (πειÏαματικό)',
'tog-forceeditsummary' => 'Îα ειδοποιοÏμαι κατά την εισαγωγή κενής σÏνοψης επεξεÏγασίας',
'tog-watchlisthideown' => 'ΑπόκÏυψη των επεξεÏγασιών μου από τη λίστα παÏακολοÏθησης',
@@ -402,6 +404,8 @@ $messages = array(
'tog-showhiddencats' => 'Εμφάνιση κÏυμμένων κατηγοÏιών',
'tog-noconvertlink' => 'ΑπενεÏγοποίησε την μετατÏοπή τίτλου συνδέσμου',
'tog-norollbackdiff' => 'ΠαÏάλειψη διαφοÏάς μετά την εκτέλεση επαναφοÏάς',
+'tog-useeditwarning' => 'ΠÏοειδοποίηση όταν εγκαταλείπω μία σελίδα επεξεÏγασίας χωÏίς να έχω Ï€Ïώτα αποθηκεÏσει τις αλλαγές',
+'tog-prefershttps' => 'Îα γίνεται πάντα χÏήση ασφαλοÏÏ‚ σÏνδεσης όταν ο χÏήστης είναι συνδεδεμένος',
'underline-always' => 'Πάντα',
'underline-never' => 'Ποτέ',
@@ -465,6 +469,18 @@ $messages = array(
'oct' => 'Οκτ',
'nov' => 'Îοε',
'dec' => 'Δεκ',
+'january-date' => '$1 ΙανουαÏίου',
+'february-date' => '$1 ΦεβÏουαÏίου',
+'march-date' => '$1 ΜαÏτίου',
+'april-date' => '$1 ΑπÏιλίου',
+'may-date' => '$1 ΜαÎου',
+'june-date' => '$1 Ιουνίου',
+'july-date' => '$1 Ιουλίου',
+'august-date' => '$1 ΑυγοÏστου',
+'september-date' => '$1 ΣεπτεμβÏίου',
+'october-date' => '$1 ΟκτωβÏίου',
+'november-date' => '$1 ÎοεμβÏίου',
+'december-date' => '$1 ΔεκεμβÏίου',
# Categories related messages
'pagecategories' => '{{PLURAL:$1|ΚατηγοÏία|ΚατηγοÏίες}}',
@@ -546,6 +562,7 @@ $messages = array(
'create-this-page' => 'ΔημιουÏγία αυτής της σελίδας',
'delete' => 'ΔιαγÏαφή',
'deletethispage' => 'ΔιαγÏαφή αυτής της σελίδας',
+'undeletethispage' => 'ΕπαναφοÏά αυτής της διαγεγÏαμμένης σελίδας',
'undelete_short' => 'ΕπαναφοÏά {{PLURAL:$1|μίας διαγεγÏαμμένης επεξεÏγασίας|$1 διαγεγÏαμμένων επεξεÏγασιών}}.',
'viewdeleted_short' => 'ΠÏοβολή {{PLURAL:$1|μίας διαγεγÏαμμένης επεξεÏγασίας|$1 διαγεγÏαμμένων επεξεÏγασιών}}',
'protect' => 'ΠÏοστασία',
@@ -589,7 +606,7 @@ $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).
+# 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).
'aboutsite' => 'Σχετικά με {{SITENAME}}',
'aboutpage' => 'Project:Σχετικά',
'copyright' => 'Το πεÏιεχόμενο είναι διαθέσιμο σÏμφωνα με την $1.',
@@ -599,7 +616,6 @@ $1',
'disclaimers' => 'Αποποίηση ευθυνών',
'disclaimerpage' => 'Project:Γενική αποποίηση',
'edithelp' => 'Βοήθεια σχετικά με την επεξεÏγασία',
-'edithelppage' => 'Help:ΕπεξεÏγασία',
'helppage' => 'Help:ΠεÏιεχόμενα',
'mainpage' => 'ΑÏχική σελίδα',
'mainpage-description' => 'ΑÏχική σελίδα',
@@ -676,17 +692,7 @@ $1',
# General errors
'error' => 'Σφάλμα',
'databaseerror' => 'Σφάλμα στη βάση δεδομένων',
-'dberrortext' => 'Σημειώθηκε συντακτικό σφάλμα σε εÏώτημα Ï€Ïος τη βάση δεδομένων.
-Πιθανόν να Ï€Ïόκειται για ένδειξη σφάλματος στο λογισμικό.
-Το τελευταίο εÏώτημα Ï€Ïος τη βάση δεδομένων που επιχειÏήθηκε ήταν:
-<blockquote><code>$1</code></blockquote>
-μέσα από τη συνάÏτηση «<code>$2</code>».
-Η βάση δεδομένων επέστÏεψε σφάλμα «<samp>$3: $4</samp>».',
-'dberrortextcl' => 'Σημειώθηκε συντακτικό σφάλμα σε εÏώτημα Ï€Ïος τη βάση δεδομένων.
-Το τελευταίο εÏώτημα που επιχειÏήθηκε ήταν:
-«$1»
-μέσα από τη συνάÏτηση «$2».
-Η βάση δεδομένων επέστÏεψε σφάλμα «$3: $4».',
+'databaseerror-error' => 'Σφάλμα: $1',
'laggedslavemode' => "'''ΠÏοειδοποίηση:''' Η σελίδα μποÏεί να μην πεÏιέχει Ï€Ïόσφατες ενημεÏώσεις.",
'readonly' => 'Κλειδωμένη βάση δεδομένων',
'enterlockreason' => 'Εισαγάγετε μια αιτία για το κλείδωμα και μια εκτίμησή για το πότε το κλείδωμα αυτό θα αÏθεί',
@@ -740,12 +746,15 @@ $1',
Για να Ï€Ïοσθέσετε ή να αλλάξετε τις μεταφÏάσεις για όλα τα wikis, παÏακαλοÏμε χÏησιμοποιήστε [//translatewiki.net/ translatewiki.net], το εγχείÏημα τοπικοποίησης του MediaWiki.',
'editinginterface' => "'''ΠÏοσοχή:''' ΕπεξεÏγάζεστε μια σελίδα η οποία χÏησιμοποιείται για να παÏέχει κείμενο διεπαφής για το λογισμικό. Αλλαγές σε αυτή τη σελίδα θα επηÏεάσουν την εμφάνιση της διεπαφής χÏήστη για τους άλλους χÏήστες. Εάν θέλετε να διοÏθώσετε τη μετάφÏαση, μποÏείτε να χÏησιμοποιήσετε το [//translatewiki.net/ translatewiki.net], το εγχείÏημα για με τις μεταφÏάσεις των μηνυμάτων MediaWiki.",
-'sqlhidden' => '(το αίτημα SQL δεν εμφανίζεται)',
'cascadeprotected' => 'Αυτή η σελίδα έχει Ï€Ïοστατευθεί από επεξεÏγασία, επειδή πεÏιλαμβάνεται {{PLURAL:$1|στην ακόλουθη σελίδα, που είναι Ï€Ïοστατευμένη|στις ακόλουθες σελίδες, που είναι Ï€Ïοστατευμένες}} με ενεÏγοποιημένη τη «διαδοχική» Ï€Ïοστασία στο:
$2',
'namespaceprotected' => "Δεν έχετε άδεια να επεξεÏγάζεστε σελίδες στον τομέα '''$1'''.",
'customcssprotected' => 'Δεν έχετε δικαιώματα για να επεξεÏγαστείτε αυτή τη σελίδα CSS, επειδή πεÏιέχει Ï€Ïοσωπικές Ïυθμίσεις άλλου χÏήστη.',
'customjsprotected' => 'Δεν έχετε δικαιώματα για να επεξεÏγαστείτε αυτή τη σελίδα JavaScript, επειδή πεÏιέχει Ï€Ïοσωπικές Ïυθμίσεις άλλου χÏήστη.',
+'mycustomcssprotected' => 'Δεν έχετε άδεια για να επεξεÏγαστείτε αυτήν τη σελίδα CSS.',
+'mycustomjsprotected' => 'Δεν έχετε άδεια για να επεξεÏγαστείτε αυτήν τη σελίδα JavaScript.',
+'myprivateinfoprotected' => 'Δεν έχετε άδεια για να επεξεÏγαστείτε τα Ï€Ïοσωπικά σας στοιχεία.',
+'mypreferencesprotected' => 'Δεν έχετε άδεια για να επεξεÏγαστείτε τις Ï€Ïοτιμήσεις σας.',
'ns-specialprotected' => 'Σελίδες στον τομέα {{ns:special}} δεν γίνεται να επεξεÏγαστοÏν.',
'titleprotected' => "Αυτός ο τίτλος έχει Ï€Ïοστατευθεί από την δημιουÏγία από τον [[User:$1|$1]].
Ο λόγος που δίνεται είναι ''$2''.",
@@ -770,10 +779,19 @@ $2',
'welcomecreation-msg' => 'Ο λογαÏιασμός σας έχει δημιουÏγηθεί.
Μην ξεχάσετε να αλλάξετε τις [[Special:Preferences|{{SITENAME}} Ï€Ïοτιμήσεις]] σας.',
'yourname' => 'Όνομα χÏήστη:',
+'userlogin-yourname' => 'Όνομα χÏήστη',
+'userlogin-yourname-ph' => 'Εισάγετε το όνομα χÏήστη σας',
+'createacct-another-username-ph' => 'Εισάγετε το όνομα χÏήστη',
'yourpassword' => 'Κωδικός:',
+'userlogin-yourpassword' => 'Κωδικός',
+'userlogin-yourpassword-ph' => 'Εισάγετε τον κωδικό σας',
+'createacct-yourpassword-ph' => 'Εισαγωγή κωδικοÏ',
'yourpasswordagain' => 'ΕπαναπληκτÏολόγηση κωδικοÏ:',
+'createacct-yourpasswordagain' => 'Επιβεβαίωση κωδικοÏ',
+'createacct-yourpasswordagain-ph' => 'Εισαγωγή ÎºÏ‰Î´Î¹ÎºÎ¿Ï Î¾Î±Î½Î¬',
'remembermypassword' => 'Απομνημόνευση της σÏνδεσής μου σε αυτόν τον πεÏιηγητή (για μέγιστο $1 {{PLURAL:$1|ημέÏα|ημέÏες}})',
-'securelogin-stick-https' => 'Μείνετε συνδεδεμένοι με HTTPS μετά την είσοδο',
+'userlogin-remembermypassword' => 'ΔιατηÏήστε με σε σÏνδεση',
+'userlogin-signwithsecure' => 'ΧÏησιμοποιείστε ασφαλή σÏνδεση',
'yourdomainname' => 'Το domain σας:',
'password-change-forbidden' => 'Δεν μποÏείτε να αλλάξετε τους κωδικοÏÏ‚ Ï€Ïόσβασης σε αυτό το βίκι.',
'externaldberror' => 'Είτε συνέβη κάποιο σφάλμα εξωτεÏικής πιστοποίησης της βάσης δεδομένων είτε δεν σας έχει επιτÏαπεί να ενημεÏώσετε τον εξωτεÏικό σας λογαÏιασμό.',
@@ -785,18 +803,41 @@ $2',
'logout' => 'Έξοδος',
'userlogout' => 'Έξοδος',
'notloggedin' => 'Δεν έχετε συνδεθεί.',
+'userlogin-noaccount' => 'Δεν έχετε λογαÏιασμό;',
+'userlogin-joinproject' => 'Συνδεθείτε σε {{SITENAME}}',
'nologin' => 'Δεν έχετε λογαÏιασμό; $1.',
'nologinlink' => 'ΔημιουÏγήστε έναν λογαÏιασμό',
'createaccount' => 'ΔημιουÏγία λογαÏιασμοÏ',
'gotaccount' => 'Έχετε ήδη λογαÏιασμό; $1.',
'gotaccountlink' => 'Είσοδος',
'userlogin-resetlink' => 'Ξεχάσατε τα στοιχεία εισόδου σας;',
+'userlogin-resetpassword-link' => 'Έκδοση νέου ÎºÏ‰Î´Î¹ÎºÎ¿Ï Ï€Ïόσβασης',
+'helplogin-url' => 'Help:ΣÏνδεση',
+'userlogin-helplink' => '[[{{MediaWiki:helplogin-url}}|Βοήθεια για τη σÏνδεσή σας]]',
+'createacct-join' => 'Εισάγετε τα στοιχεία σας παÏακάτω.',
+'createacct-another-join' => 'Εισάγετε τα στοιχεία του νέου λογαÏÎ¹Î±ÏƒÎ¼Î¿Ï Ï€Î±Ïακάτω.',
+'createacct-emailrequired' => 'ΔιεÏθυνση ηλεκτÏÎ¿Î½Î¹ÎºÎ¿Ï Ï„Î±Ï‡Ï…Î´Ïομείου',
+'createacct-emailoptional' => 'ΔιεÏθυνση ηλεκτÏÎ¿Î½Î¹ÎºÎ¿Ï Ï„Î±Ï‡Ï…Î´Ïομείου (Ï€ÏοαιÏετικό)',
+'createacct-email-ph' => 'Εισάγετε το email σας',
+'createacct-another-email-ph' => 'Εισάγετε τη διεÏθυνση ηλεκτÏÎ¿Î½Î¹ÎºÎ¿Ï Ï„Î±Ï‡Ï…Î´Ïομείου',
'createaccountmail' => 'ΧÏήση τυχαίου Ï€ÏοσωÏÎ¹Î½Î¿Ï ÎºÏ‰Î´Î¹ÎºÎ¿Ï Ï€Ïόσβασης και αποστολή του στην παÏεχώμενη διεÏθυνση ηλεκτÏÎ¿Î½Î¹ÎºÎ¿Ï Ï„Î±Ï‡Ï…Î´Ïομείου',
+'createacct-realname' => 'ΠÏαγματικό όνομα (Ï€ÏοαιÏετικό)',
'createaccountreason' => 'Αιτία:',
+'createacct-reason' => 'Λόγος',
+'createacct-reason-ph' => 'Γιατί δημιουÏγείτε έναν άλλο λογαÏιασμό',
+'createacct-captcha' => 'Έλεγχος ασφαλείας',
+'createacct-imgcaptcha-ph' => 'Εισαγωγή του κειμένου που βλέπετε παÏαπάνω',
+'createacct-submit' => 'ΔημιουÏγία λογαÏÎ¹Î±ÏƒÎ¼Î¿Ï Ï‡Ïήστη',
+'createacct-another-submit' => 'ΔημιουÏγήσετε έναν άλλο λογαÏιασμό',
+'createacct-benefit-heading' => '{{SITENAME}} έχει γίνει από ανθÏώπους όπως εσÏ.',
+'createacct-benefit-body1' => '{{PLURAL:$1|επεξεÏγασία|επεξεÏγασίες}}',
+'createacct-benefit-body2' => '{{PLURAL:$1|σελίδα|σελίδες}}',
+'createacct-benefit-body3' => 'Ï€Ïόσφατοι {{PLURAL:$1|συνεισφέÏων|συνεισφέÏοντες}}',
'badretype' => 'Οι κωδικοί που έχετε δηλώσει δεν συμφωνοÏν Î¼ÎµÏ„Î±Î¾Ï Ï„Î¿Ï…Ï‚.',
'userexists' => 'Το όνομα χÏήστη που εισαγάγατε βÏίσκεται ήδη σε χÏήση.
ΠαÏακαλοÏμε, διαλέξτε ένα διαφοÏετικό.',
'loginerror' => 'Σφάλμα σÏνδεσης',
+'createacct-error' => 'Σφάλμα δημιουÏγίας λογαÏιασμοÏ',
'createaccounterror' => 'Δεν ήταν δυνατή η δημιουÏγία λογαÏιασμοÏ: $1',
'nocookiesnew' => 'Ο λογαÏιασμός χÏήστη έχει δημιουÏγηθεί, αλλά δεν έχετε ακόμα συνδεθεί. Το {{SITENAME}} χÏησιμοποιεί cookies κατά τη σÏνδεση των χÏηστών. Τα cookies είναι απενεÏγοποιημένα στον υπολογιστή σας. ΠαÏακαλοÏμε ενεÏγοποιήστε τα και στη συνέχεια συνδεθείτε χÏησιμοποιώντας το νέο όνομα χÏήστη σας και τον κωδικό σας.',
'nocookieslogin' => 'Το {{SITENAME}} χÏησιμοποιεί cookies κατά τη σÏνδεση των χÏηστών. Τα cookies είναι απενεÏγοποιημένα στον υπολογιστή σας. ΠαÏακαλοÏμε ενεÏγοποιήστε τα και ξαναδοκιμάστε!',
@@ -848,11 +889,13 @@ $2',
ΜποÏείτε να αγνοήσετε αυτό το μήνυμα, αν αυτός ο λογαÏιασμός δημιουÏγήθηκε εσφαλμένα.',
'usernamehasherror' => 'Το όνομα χÏήστη δεν μποÏεί να πεÏιέχει ειδικοÏÏ‚ χαÏακτήÏες',
-'login-throttled' => 'Τελευταία κάνατε πάÏα πολλές απόπειÏες σÏνδεσης.
-ΠαÏακαλοÏμε πεÏιμένετε Ï€ÏÎ¿Ï„Î¿Ï Î¾Î±Î½Î±Î´Î¿ÎºÎ¹Î¼Î¬ÏƒÎµÏ„Îµ.',
+'login-throttled' => 'Κάνατε πάÏα πολλές Ï€Ïόσφατες απόπειÏες σÏνδεσης.
+ΠαÏακαλοÏμε πεÏιμένετε $1 Ï€ÏÎ¿Ï„Î¿Ï Î¾Î±Î½Î±Î´Î¿ÎºÎ¹Î¼Î¬ÏƒÎµÏ„Îµ.',
'login-abort-generic' => 'Η είσοδος δεν πέτυχε - Ματαιώθηκε',
'loginlanguagelabel' => 'Γλώσσα: $1',
'suspicious-userlogout' => 'Το αίτημα αποσÏνδεσής σας απεÏÏίφθη επειδή φαίνεται ότι στάλθηκε από ένα λανθασμένο φυλλομετÏητή (browser) ή διακομιστή Ï€ÏοσωÏινής αποθήκευσης.',
+'createacct-another-realname-tip' => 'Το Ï€Ïαγματικό όνομα είναι Ï€ÏοαιÏετικό
+Αν επιλέξετε να το δώσετε, αυτό θα μποÏεί να χÏησιμοποιηθεί για να αναγνωÏιστεί η δουλειά σας.',
# Email sending
'php-mail-error-unknown' => 'Άγνωστο σφάλμα στη συνάÏτηση mail() της PHP.',
@@ -868,7 +911,7 @@ $2',
'newpassword' => 'Îέος κωδικός Ï€Ïόσβασης',
'retypenew' => 'ΠληκτÏολογήστε ξανά το νέο κωδικό.',
'resetpass_submit' => 'Δώστε κωδικό Ï€Ïόσβασης και συνδεθείτε',
-'resetpass_success' => 'Ο κωδικός Ï€Ïόσβασής σας άλλαξε επιτυχώς! ΤώÏα σας συνδέουμε...',
+'changepassword-success' => 'Ο κωδικός Ï€Ïόσβασής σας άλλαξε επιτυχώς!',
'resetpass_forbidden' => 'Οι κωδικοί Ï€Ïόσβασης δεν μποÏοÏν να αλλαχθοÏν',
'resetpass-no-info' => 'ΠÏέπει να είστε συνδεδεμένος για να δείτε αυτήν την σελίδα απευθείας',
'resetpass-submit-loggedin' => 'Αλλαγή κωδικοÏ',
@@ -880,10 +923,11 @@ $2',
# Special:PasswordReset
'passwordreset' => 'Κωδικός επαναφοÏάς',
-'passwordreset-text' => 'ΣυμπληÏώστε αυτή τη φόÏμα για να επαναφέÏετε τον κωδικό σας.',
+'passwordreset-text-one' => 'ΣυμπληÏώστε την παÏακάτω φόÏμα για να επαναφέÏετε τον κωδικό Ï€Ïόσβασής σας.',
+'passwordreset-text-many' => '{{PLURAL:$1|ΣυμπληÏώστε ένα από τα πεδία για να επαναφέÏετε τον κωδικό Ï€Ïόσβασής σας.}}',
'passwordreset-legend' => 'ΕπαναφοÏά ÎºÏ‰Î´Î¹ÎºÎ¿Ï Ï€Ïόσβασης',
'passwordreset-disabled' => 'Η επαναφοÏά ÎºÏ‰Î´Î¹ÎºÎ¿Ï Ï€Ïόσβασης έχει απενεÏγοποιηθεί σε αυτό το wiki',
-'passwordreset-pretext' => '{{PLURAL:$1||Εισάγεται ένα από τα στοιχεία δεδομένων που βλέπετε παÏακάτω}}',
+'passwordreset-emaildisabled' => "Τα χαÏακτηÏιστικά ηλεκτÏÎ¿Î½Î¹ÎºÎ¿Ï Ï„Î±Ï‡Ï…Î´Ïομείου έχουν απενεÏγοποιηθεί σ' αυτό το wiki.",
'passwordreset-username' => 'Όνομα χÏήστη:',
'passwordreset-domain' => 'Domain:',
'passwordreset-capture' => 'ΠÏοβολή του μηνÏματος ηλεκτÏÎ¿Î½Î¹ÎºÎ¿Ï Ï„Î±Ï‡Ï…Î´Ïομείου που δημιουÏγήθηκε;',
@@ -906,7 +950,7 @@ $2
ΠÏοσωÏινός κωδικός Ï€Ïόσβασης:$2',
'passwordreset-emailsent' => 'Έχει αποσταλεί email επαναφοÏάς κωδικοÏ.',
'passwordreset-emailsent-capture' => 'Έχει αποσταλεί email επαναφοÏάς κωδικοÏ, το οποίο φαίνεται πιο κάτω.',
-'passwordreset-emailerror-capture' => 'Ένα email επαναφοÏάς ÎºÏ‰Î´Î¹ÎºÎ¿Ï Î­Ï‡ÎµÎ¹ δημιουÏγηθεί, το οποίο φαίνεται πιο κάτω, αλλά απέτυχε η αποστολή του στο χÏήστη: $1',
+'passwordreset-emailerror-capture' => 'Ένα email επαναφοÏάς ÎºÏ‰Î´Î¹ÎºÎ¿Ï Î­Ï‡ÎµÎ¹ δημιουÏγηθεί, το οποίο φαίνεται πιο κάτω, αλλά απέτυχε η αποστολή του στο {{GENDER:$2|χÏήστη}}: $1',
# Special:ChangeEmail
'changeemail' => 'Αλλαγή της διεÏθυνσης ηλεκτÏÎ¿Î½Î¹ÎºÎ¿Ï Ï„Î±Ï‡Ï…Î´Ïομείου',
@@ -920,6 +964,19 @@ $2
'changeemail-submit' => 'Αλλαγή διεÏθυνσης ηλεκτÏÎ¿Î½Î¹ÎºÎ¿Ï Ï„Î±Ï‡Ï…Î´Ïομείου',
'changeemail-cancel' => 'ΑκÏÏωση',
+# Special:ResetTokens
+'resettokens' => 'ΕπαναφοÏά των κλειδιών',
+'resettokens-text' => 'ΜποÏείτε να επαναφέÏετε τα κλειδιά, τα οποία επιτÏέπουν την Ï€Ïόσβαση σε οÏισμένα ιδιωτικά δεδομένα που συνδέονται με τον λογαÏιασμό σας εδώ.
+
+ΠÏέπει να το κάνετε εάν κατά λάθος τα μοιÏαστήκατε με κάποιον ή αν ο λογαÏιασμός σας έχει παÏαβιαστεί.',
+'resettokens-no-tokens' => 'Δεν υπάÏχουν κλειδιά για επαναφοÏά.',
+'resettokens-legend' => 'ΕπαναφοÏά των κλειδιών',
+'resettokens-tokens' => 'Κλειδιά:',
+'resettokens-token-label' => '$1 (Ï„Ïέχουσα τιμή: $2)',
+'resettokens-watchlist-token' => 'Κλειδί Ïοής της λίστα παÏακολοÏθησης',
+'resettokens-done' => 'ΕπαναφοÏά κλειδιών.',
+'resettokens-resetbutton' => 'ΕπαναφοÏά επιλεγμένων κλειδιών',
+
# Edit page toolbar
'bold_sample' => 'Έντονο κείμενο',
'bold_tip' => 'Έντονο κείμενο',
@@ -1110,12 +1167,15 @@ $2
Φαίνεται πως έχει διαγÏαφεί.',
'edit-conflict' => 'ΣÏγκÏουση επεξεÏγασιών.',
'edit-no-change' => 'Η επεξεÏγασία σας αγνοήθηκε, επειδή δεν έγινε καμία αλλαγή στο κείμενο.',
+'postedit-confirmation' => 'H επεξεÏγασία σας αποθηκεÏτηκε.',
'edit-already-exists' => 'Δεν ήταν εφικτό να δημιουÏγηθεί η νέα σελίδα.
ΥπάÏχει ήδη.',
'defaultmessagetext' => 'ΠÏοεπιλεγμένο κείμενο μηνÏματος',
'content-failed-to-parse' => 'Απέτυχε η ανάλυση πεÏιεχομένου του $2 για το μοντέλο $1:$3',
'invalid-content-data' => 'Μη έγκυÏα δεδομένα πεÏιεχομένου',
'content-not-allowed-here' => 'Το πεÏιεχόμενο «$1» δεν επιτÏέπεται στη σελίδα [[$2]]',
+'editwarning-warning' => 'Αφήνοντας αυτή τη σελίδα μποÏεί να σας κάνει να χάσετε κάποιες αλλαγές που έχετε κάνει.
+Αν έχετε συνδεθεί, μποÏείτε να απενεÏγοποιήσετε αυτή την Ï€Ïοειδοποίηση στην ενότητα "ΕπεξεÏγασία" των Ï€Ïοτιμήσεών σας.',
# Content models
'content-model-wikitext' => 'βικικείμενο',
@@ -1150,6 +1210,7 @@ $2
'undo-failure' => 'Η επεξεÏγασία δεν μποÏοÏσε να αναστÏαφεί λόγω αντικÏουόμενων ενδιάμεσων επεξεÏγασιών.',
'undo-norev' => 'Η ανάκληση αυτής της επεξεÏγασίας δεν ηταν δυνατό να Ï€Ïαγματοποιηθεί επειδή δεν υπάÏχει ή επειδή έχει διαγÏαφεί.',
'undo-summary' => 'ΑναίÏεση αναθεώÏησης $1 υπό τον/την [[Special:Contributions/$2|$2]] ([[User talk:$2|Συζήτηση]])',
+'undo-summary-username-hidden' => 'ΑναίÏεση αναθεώÏησης $1 από ένα κÏυμμένο χÏήστη',
# Account creation failure
'cantcreateaccounttitle' => 'Ο λογαÏιασμός δεν μποÏεί να δημιουÏγηθεί',
@@ -1327,6 +1388,7 @@ $1",
'compareselectedversions' => 'ΣÏγκÏιση των επιλεγμένων εκδόσεων',
'showhideselectedversions' => 'Εμφάνιση/απόκÏυψη των επιλεγμένων εκδοχών',
'editundo' => 'αναίÏεση',
+'diff-empty' => '(Καμία διαφοÏά)',
'diff-multi' => '({{PLURAL:$1|Μία ενδιάμεση αναθεώÏηση|$1 ενδιάμεσες αναθεωÏήσεις}} από {{PLURAL:$2|ένα χÏήστη|$2 χÏήστες}} δεν {{PLURAL:$1|εμφανίζεται|εμφανίζονται}})',
'diff-multi-manyusers' => '({{PLURAL:$1|Μία ενδιάμεση αναθεώÏηση|$1 ενδιάμεσες αναθεωÏήσεις}} από πεÏισσότεÏο από $2 {{PLURAL:$2|χÏήστη|χÏήστες}} δεν εμφανίζ{{PLURAL:$1|εται|ονται}})',
'difference-missing-revision' => '{{PLURAL:$2|Μία αναθεώÏηση|$2 αναθεωÏήσεις}} αυτής της διαφοÏάς ($1) δεν {{PLURAL:$2|μπόÏεσε να βÏεθεί|μπόÏεσαν να βÏεθοÏν}}.
@@ -1354,7 +1416,6 @@ $1",
'searchmenu-legend' => 'Επιλογές αναζήτησης',
'searchmenu-exists' => "'''ΥπάÏχει μια σελίδα που ονομάζεται «[[:$1]]» σε αυτό το wiki.'''",
'searchmenu-new' => "'''ΔημιουÏγήστε τη σελίδα «[[:$1]]» σε αυτό το wiki!'''",
-'searchhelp-url' => 'Help:ΠεÏιεχόμενα',
'searchmenu-prefix' => '[[Special:PrefixIndex/$1|Πλοηγηθείτε σε σελίδες με αυτό το Ï€Ïόθεμα]]',
'searchprofile-articles' => 'Σελίδες πεÏιεχομένου',
'searchprofile-project' => 'Σελίδες Βοήθειας και ΕγχειÏήματος',
@@ -1395,15 +1456,7 @@ $1",
'powersearch-togglenone' => 'Καμία',
'search-external' => 'ΕξωτεÏική αναζήτηση',
'searchdisabled' => 'Η αναζήτηση για τον ιστότοπο "{{SITENAME}}" είναι απενεÏγοποιημένη. ΜποÏείτε να αναζητήσετε μέσω του Google εν τω μεταξÏ. Σημειώστε ότι οι κατάλογοί τους για το πεÏιεχόμενο του ιστοτόπου "{{SITENAME}}" μποÏεί να είναι απαÏχαιωμένοι.',
-
-# Quickbar
-'qbsettings' => 'ΓÏήγοÏη Ï€Ïόσβαση',
-'qbsettings-none' => 'Καμία',
-'qbsettings-fixedleft' => 'ΣταθεÏά αÏιστεÏά',
-'qbsettings-fixedright' => 'ΣταθεÏά δεξιά',
-'qbsettings-floatingleft' => 'Πλανώμενα αÏιστεÏά',
-'qbsettings-floatingright' => 'Πλανώμενα δεξιά',
-'qbsettings-directionality' => 'ΔιοÏθώθηκε, ανάλογα με τις κατευθÏνσεις του σεναÏίου εντολών της γλώσσας σας',
+'search-error' => 'ΠαÏουσιάστηκε σφάλμα κατά την αναζήτηση:$1',
# Preferences page
'preferences' => 'ΠÏοτιμήσεις',
@@ -1437,7 +1490,6 @@ $1",
'resetprefs' => 'ΕπαναφοÏά Ï€Ïοτιμήσεων',
'restoreprefs' => 'ΕπαναφοÏά όλων των Ï€Ïοεπιλεγμένων Ïυθμίσεων',
'prefs-editing' => 'ΕπεξεÏγασία',
-'prefs-edit-boxsize' => 'Μέγεθος του παÏαθÏÏου επεξεÏγασίας.',
'rows' => 'ΣειÏές',
'columns' => 'Στήλες',
'searchresultshead' => 'Αποτελέσματα αναζήτησης/Ρυθμίσεις',
@@ -1448,9 +1500,9 @@ $1",
'recentchangesdays-max' => '($1 {{PLURAL:$1|ημέÏα|ημέÏες}} το μέγιστο)',
'recentchangescount' => 'ΑÏιθμός επεξεÏγασιών που να εμφανίζονται για Ï€Ïοεπιλογή.',
'prefs-help-recentchangescount' => 'Αυτό πεÏιλαμβάνει τις Ï€Ïόσφατες αλλαγές, τα ιστοÏικά των σελίδων, και τα αÏχεία διαγÏαφών.',
-'prefs-help-watchlist-token' => 'Η συμπλήÏωση Î±Ï…Ï„Î¿Ï Ï„Î¿Ï… πεδίου με ένα κÏυφό κλειδί θα δημιουÏγήσει μια δÏάση RSS για τη λίστα παÏακολοÏθησής σας.
-Οποιοσδήποτε ξέÏει το κλειδί σε αυτό το πεδίο θα μποÏεί να διαβάσει τη λίστα παÏακολοÏθησής σας, για αυτό διαλέξτε κάτι ασφαλές.
-Εδώ είναι ένα τυχαίως δημιουÏγημένο Ï€Ïοϊόν που μποÏείτε να χÏησιμοποιήσετε: $1',
+'prefs-help-watchlist-token2' => 'Αυτό είναι το μυστικό κλειδί για την web Ï„Ïοφοδοσία της λίστας παÏακολοÏθησής σας.
+Όποιος το γνωÏίζει θα είναι σε θέση να διαβάσει την λίστα παÏακολοÏθησης σας, οπότε μην τον μοιÏάζεστε.
+[[Special: ResetTokens|Κάνε κλικ εδώ εάν θέλετε να τον επαναφέÏετε]].',
'savedprefs' => 'Οι Ï€Ïοτιμήσεις σας έχουν αποθηκευτεί.',
'timezonelegend' => 'Ζώνη ÏŽÏας:',
'localtime' => 'Εμφάνιση τοπικής ÏŽÏας:',
@@ -1480,7 +1532,6 @@ $1",
'prefs-common-css-js' => 'Κοινά CSS/JS για όλα τα skins:',
'prefs-reset-intro' => 'ΜποÏείτε να χÏησιμοποιήσετε αυτήν την σελίδα για να επαναÏÏυθμίσετε τις Ï€Ïοτιμήσεις σας στις Ï€Ïοεπιλογές του ιστότοπου. Αυτό δεν μποÏεί να αναστÏεφθεί.',
'prefs-emailconfirm-label' => 'Επιβεβαίωση e-mail:',
-'prefs-textboxsize' => 'Μέγεθος πλαίσιου επεξεÏγασίας',
'youremail' => 'ΔιεÏθυνση ηλεκτÏÎ¿Î½Î¹ÎºÎ¿Ï Ï„Î±Ï‡Ï…Î´Ïομείου:',
'username' => '{{GENDER:$1|Όνομα χÏήστη}}:',
'uid' => '{{GENDER:$1|ΑναγνωÏιστικό χÏήστη}}:',
@@ -1513,6 +1564,8 @@ $1",
'prefs-dateformat' => 'ΜοÏφή ημεÏομηνίας',
'prefs-timeoffset' => 'ΔιαφοÏά χÏόνου',
'prefs-advancedediting' => 'ΠÏοηγμένες επιλογές',
+'prefs-editor' => 'Συντάκτης',
+'prefs-preview' => 'ΠÏοεπισκόπηση',
'prefs-advancedrc' => 'ΠÏοηγμένες επιλογές',
'prefs-advancedrendering' => 'ΠÏοηγμένες επιλογές',
'prefs-advancedsearchoptions' => 'ΠÏοηγμένες επιλογές',
@@ -1520,7 +1573,9 @@ $1",
'prefs-displayrc' => 'Εμφάνιση επιλογών',
'prefs-displaysearchoptions' => 'Επιλογές εμφάνισης',
'prefs-displaywatchlist' => 'Επιλογές εμφάνισης',
+'prefs-tokenwatchlist' => 'Κλειδί',
'prefs-diffs' => 'ΔιαφοÏές',
+'prefs-help-prefershttps' => 'Αυτή η Ï€Ïοτίμηση θα τεθεί σε Î¹ÏƒÏ‡Ï ÏƒÏ„Î·Î½ επόμενή σας σÏνδεση.',
# User preference: email validation using jQuery
'email-address-validity-valid' => 'Η διεÏθυνση ηλεκτÏÎ¿Î½Î¹ÎºÎ¿Ï Ï„Î±Ï‡Ï…Î´Ïομείου φαίνεται έγκυÏη',
@@ -1547,6 +1602,8 @@ $1",
'userrights-notallowed' => 'Δεν έχετε άδεια για να Ï€Ïοσθέσετε ή να καταÏγήσετε δικαιώματα χÏήστη.',
'userrights-changeable-col' => 'Ομάδες που μποÏείτε να αλλάξετε',
'userrights-unchangeable-col' => 'Ομάδες που δεν μποÏείτε να αλλάξετε',
+'userrights-conflict' => 'ΣÏγκÏουση αλλαγών στα δικαιώματα χÏήστη! ΠαÏακαλώ επανεξετάστε και επικυÏώστε τις αλλαγές σας.',
+'userrights-removed-self' => 'Έχετε καταÏγήσει επιτυχώς τα δικά σας δικαιώματα. Ως εκ τοÏτου, δεν είστε πλέον σε θέση να έχετε Ï€Ïόσβαση σε αυτή τη σελίδα.',
# Groups
'group' => 'Ομάδα:',
@@ -1613,10 +1670,15 @@ $1",
'right-unblockself' => 'ΑναίÏεση φÏαγής του εαυτοÏ',
'right-protect' => 'Αλλαγή των επιπέδων Ï€Ïοστασίας και επεξεÏγασία Ï€Ïοστατευμένων σελίδων',
'right-editprotected' => 'ΕπεξεÏγασία Ï€Ïοστατευμένων σελίδων (χωÏίς διαδοχική Ï€Ïοστασία)',
+'right-editsemiprotected' => 'ΕπεξεÏγασία Ï€Ïοστατευμένων σελίδων ως "{{int:protect-level-autoconfirmed}}"',
'right-editinterface' => 'ΕπεξεÏγασία της διασÏνδεσης χÏήστη',
'right-editusercssjs' => 'ΜεταγÏαφή των αÏχείων CSS και JS άλλων χÏηστών',
'right-editusercss' => 'ΜεταγÏαφή των αÏχείων CSS άλλων χÏηστών',
'right-edituserjs' => 'ΜεταγÏαφή των αÏχείων JS άλλων χÏηστών',
+'right-editmyusercss' => 'ΕπεξεÏγασία των ιδιωτικών αÏχείων CSS χÏήστη',
+'right-editmyuserjs' => 'ΕπεξεÏγασία των ιδιωτικών αÏχείων JavaScript χÏήστη',
+'right-viewmywatchlist' => 'ΠÏοβολή της δικής σας λίστα παÏακολοÏθησης',
+'right-editmyoptions' => 'ΕπεξεÏγασία των Ï€Ïοτιμήσεών σας',
'right-rollback' => 'ΓÏήγοÏη αναστÏοφή των επεξεÏγασιών του τελευταίου χÏήστη που επεξεÏγάστηκε μια σελίδα',
'right-markbotedits' => 'Σήμανση επαναφεÏόμενων επεξεÏγασιών ως επεξεÏγασιών μποτ',
'right-noratelimit' => 'Îα μην επηÏεάζεται από τα ÏŒÏια ÏυθμοÏ',
@@ -1678,9 +1740,15 @@ $1",
'action-userrights-interwiki' => 'επεξεÏγαστείτε τα δικαιώματα χÏηστών σε άλλα wiki',
'action-siteadmin' => 'να κλειδώσετε ή ξεκλειδώσετε τη βάση δεδομένων',
'action-sendemail' => 'αποστείλετε μηνÏματα ηλεκτÏÎ¿Î½Î¹ÎºÎ¿Ï Ï„Î±Ï‡Ï…Î´Ïομείου',
+'action-editmywatchlist' => 'επεξεÏγαστείτε τη λίστα παÏακολοÏθησής σας',
+'action-viewmywatchlist' => 'Ï€Ïοβάλετε τη λίστα παÏακολοÏθησής σας',
+'action-viewmyprivateinfo' => 'Ï€Ïοβάλετε τις Ï€Ïοσωπικές σας πληÏοφοÏίες',
+'action-editmyprivateinfo' => 'επεξεÏγαστείτε τις Ï€Ïοσωπικές σας πληÏοφοÏίες',
# Recent changes
'nchanges' => '$1 {{PLURAL:$1|αλλαγή|αλλαγές}}',
+'enhancedrc-since-last-visit' => '$1 {{PLURAL:$1|από την τελευταία επίσκεψη}}',
+'enhancedrc-history' => 'ιστοÏικό',
'recentchanges' => 'ΠÏόσφατες αλλαγές',
'recentchanges-legend' => 'Επιλογές Ï€Ïόσφατων αλλαγών',
'recentchanges-summary' => 'ΠαÏακολουθήστε σε αυτή τη σελίδα τις πιο Ï€Ïόσφατες αλλαγές στο Wiki.',
@@ -1720,7 +1788,6 @@ $1",
'recentchangeslinked-feed' => 'Σχετικές αλλαγές',
'recentchangeslinked-toolbox' => 'Σχετικές αλλαγές',
'recentchangeslinked-title' => 'Αλλαγές σχετικές με το «$1»',
-'recentchangeslinked-noresult' => 'Δεν υπάÏχουν αλλαγές στις συνδεδεμένες σελίδες κατά τη διάÏκεια της δοσμένης πεÏιόδου.',
'recentchangeslinked-summary' => "Αυτός είναι ένα κατάλογος αλλαγών που έγιναν Ï€Ïόσφατα σε σελίδες που συνδέονται από μια καθοÏισμένη σελίδα (ή σε μέλη μιας καθοÏισμένης κατηγοÏίας).
Σελίδες στην [[Special:Watchlist|λίστα παÏακολοÏθησής]] σας είναι '''έντονες'''.",
'recentchangeslinked-page' => 'Όνομα σελίδας:',
@@ -1949,7 +2016,6 @@ $1',
'http-read-error' => 'Σφάλμα ανάγνωσης HTTP.',
'http-timed-out' => 'Ο χÏόνος του αιτήματος HTTP έληξε.',
'http-curl-error' => 'Σφάλμα κατά τη λήψη του URL: $1',
-'http-host-unreachable' => 'Το URL δεν ήταν Ï€Ïοσβάσιμο.',
'http-bad-status' => 'ΥπήÏξε Ï€Ïόβλημα κατά τη διάÏκεια του αιτήματος HTTP: $1 $2',
# Some likely curl errors. More could be added from <http://curl.haxx.se/libcurl/c/libcurl-errors.html>
@@ -1978,6 +2044,9 @@ $1',
'listfiles_size' => 'Μέγεθος',
'listfiles_description' => 'ΠεÏιγÏαφή',
'listfiles_count' => 'Εκδόσεις',
+'listfiles-latestversion' => 'ΤÏέχουσα έκδοση',
+'listfiles-latestversion-yes' => 'Îαι',
+'listfiles-latestversion-no' => 'Όχι',
# File description page
'file-anchor-link' => 'ΑÏχείο',
@@ -2073,6 +2142,12 @@ $1',
'randompage' => 'Τυχαίο λήμμα',
'randompage-nopages' => 'Δεν υπάÏχουν σελίδες {{PLURAL:$2|στον ακόλουθο ονοματοχώÏο|στους ακόλουθους ονοματοχώÏους}}: $1.',
+# Random page in category
+'randomincategory' => 'Τυχαία σελίδα στην κατηγοÏία',
+'randomincategory-invalidcategory' => 'Το «$1» δεν είναι έγκυÏο όνομα κατηγοÏίας.',
+'randomincategory-nopages' => 'Δεν υπάÏχουν σελίδες στην κατηγοÏία [[:Category:$1|$1]].',
+'randomincategory-selectcategory-submit' => 'Μετάβαση',
+
# Random redirect
'randomredirect' => 'Τυχαία ανακατεÏθυνση',
'randomredirect-nopages' => 'Δεν υπάÏχουν ανακατευθÏνσεις στον ονοματοχώÏο "$1".',
@@ -2098,12 +2173,6 @@ $1',
'statistics-users-active-desc' => 'ΧÏήστες που έχουν κάνει κάποια επεξεÏγασία μέσα σε {{PLURAL:$1|μέÏα|$1 μέÏες}}',
'statistics-mostpopular' => 'Οι πιο δημοφιλείς σελίδες',
-'disambiguations' => 'Σελίδες με συνδέσμους σε σελίδες αποσαφήνισης',
-'disambiguationspage' => 'Project:ΣÏνδεσμοι_Ï€Ïος_τις_σελίδες_αποσαφήνισης',
-'disambiguations-text' => "Οι ακόλουθες σελίδες οδηγοÏν σε μια '''σελίδα αποσαφήνισης'''.
-Αντιθέτως θα έπÏεπε να κατευθÏνουν στο κατάλληλο θέμα.<br />
-Μια σελίδα αντιμετωπίζεται ως σελίδα αποσαφήνισης αν χÏησιμοποιεί ένα Ï€Ïότυπο το οποίο συνδέεται από το [[MediaWiki:Disambiguationspage]]",
-
'pageswithprop' => 'Σελίδες με ιδιότητα σελίδας',
'pageswithprop-legend' => 'Σελίδες με ιδιότητα σελίδας',
'pageswithprop-text' => 'Αυτή η σελίδα ταξινομεί σελίδες που χÏησιμοποιοÏν μια συγκεκÏιμένη ιδιότητα σελίδας.',
@@ -2357,10 +2426,9 @@ $1',
'unwatchthispage' => 'ΠαÏση παÏακολοÏθησης αυτής της σελίδας',
'notanarticle' => 'Η σελίδα αυτή δεν είναι σελίδα πεÏιεχομένου.',
'notvisiblerev' => 'Η έκδοση έχει διαγÏαφεί',
-'watchnochange' => 'Δεν υπήÏξε δÏαστηÏιότητα επεξεÏγασίας στις σελίδες που παÏακολουθείτε κατά την εμφανιζόμενη χÏονική πεÏίοδο.',
'watchlist-details' => '{{PLURAL:$1|$1 σελίδα|$1 σελίδες}} στη λίστα παÏακολοÏθησης σας, χωÏίς να Ï€ÏοσμετÏοÏνται οι σελίδες συζήτησης.',
-'wlheader-enotif' => '* Η ειδοποίηση με ηλεκτÏονικό ταχυδÏομείο έχει ενεÏγοποιηθεί.',
-'wlheader-showupdated' => "* Σελίδες που έχουν υποστεί αλλαγές από την τελευταία φοÏά που τις επισκεφθήκατε εμφανίζονται με '''έντονους χαÏακτήÏες'''.",
+'wlheader-enotif' => 'Η ειδοποίηση ηλεκτÏÎ¿Î½Î¹ÎºÎ¿Ï Ï„Î±Ï‡Ï…Î´Ïομείου ενεÏγοποιήθηκε.',
+'wlheader-showupdated' => "Σελίδες που έχουν υποστεί αλλαγές από την τελευταία φοÏά που τις επισκεφθήκατε εμφανίζονται με '''έντονους χαÏακτήÏες'''.",
'watchmethod-recent' => 'Έλεγχος Ï€Ïόσφατων αλλαγών σε σελίδες υπό παÏακολοÏθηση',
'watchmethod-list' => 'Έλεγχος σελίδων υπό παÏακολοÏθηση για Ï€Ïόσφατες αλλαγές',
'watchlistcontains' => 'Η λίστα παÏακολοÏθησής σας πεÏιέχει $1 {{PLURAL:$1|σελίδα|σελίδες}}.',
@@ -2604,7 +2672,7 @@ $1',
'contributions' => 'ΣυνεισφοÏές {{GENDER:$1|χÏήστη|χÏήστÏιας}}',
'contributions-title' => 'ΣυνεισφοÏές χÏήστη για {{GENDER:$1|τον|την}} $1',
'mycontris' => 'ΣυνεισφοÏές',
-'contribsub2' => 'Για τον/την $1 ($2)',
+'contribsub2' => 'Για {{GENDER:$1|τον|την}} $1 ($2)',
'nocontribs' => 'Δεν βÏέθηκαν αλλαγές με αυτά τα κÏιτήÏια.',
'uctop' => '(Ï„Ïέχουσα)',
'month' => 'Από το μήνα (και νωÏίτεÏα):',
@@ -2760,11 +2828,8 @@ $1',
'ipb_blocked_as_range' => 'Σφάλμα! Η φÏαγή της διεÏθυνσης IP $1 δεν είναι άμεση και δεν μποÏεί να αÏθεί. Όμως αποτελεί μέÏος της πεÏιοχής $2, της οποίας η φÏαγή μποÏεί να αÏθεί.',
'ip_range_invalid' => 'Το εÏÏος των διευθÏνσεων IP δεν είναι έγκυÏο.',
'ip_range_toolarge' => 'ΦÏαγές range μεγαλÏτεÏων από /$1 δεν επιτÏέπονται.',
-'blockme' => 'ΦÏαγή σε μένα',
'proxyblocker' => 'ΕÏγαλείο φÏαγής διακομιστών (proxy blocker)',
-'proxyblocker-disabled' => 'Η λειτουÏγία αυτή έχει απενεÏγοποιηθεί.',
'proxyblockreason' => 'Η διεÏθυνση IP σας έχει υποστεί φÏαγή γιατί είναι open proxy. ΠαÏακαλοÏμε επικοινωνείστε με τον παÏοχέα υπηÏεσιών ΔιαδικτÏου που χÏησιμοποιείτε ή με την τεχνική υποστήÏιξη, για να θέσετε υπ΄ όψη τους αυτό το σοβαÏÏŒ θέμα ασφάλειας.',
-'proxyblocksuccess' => 'ΟλοκληÏώθηκε!',
'sorbsreason' => 'Η διεÏθυνση IP σας έχει χαÏακτηÏισθεί ως open proxy στο DNSBL.',
'sorbs_create_account_reason' => 'Η διεÏθυνση IP σας έχει χαÏακτηÏισθεί open proxy στο DNSBL. Δεν μποÏείτε να δημιουÏγήσετε λογαÏιασμό χÏήστη.',
'cant-block-while-blocked' => 'Δεν μποÏείτε να φÏάξετε άλλους χÏήστες ενώ είστε φÏαγμένος/η.',
@@ -2929,6 +2994,8 @@ $1',
'thumbnail-more' => 'Μεγέθυνση',
'filemissing' => 'ΑγνοοÏμενο αÏχείο',
'thumbnail_error' => 'Σφάλμα στη δημιουÏγία μικÏογÏαφίας: $1',
+'thumbnail_error_remote' => 'Μήνυμα σφάλματος από $1:
+$2',
'djvu_page_error' => 'Σελίδα DjVu εκτός οÏίων',
'djvu_no_xml' => 'Αδυναμία Ï€Ïοσκόμισης XML για το αÏχείο DjVu',
'thumbnail-temp-create' => 'ΑδÏνατη η δημιουÏγία Ï€ÏοσωÏÎ¹Î½Î¿Ï Î±Ïχείου μικÏογÏαφίας',
@@ -3077,27 +3144,16 @@ $1',
# Stylesheets
'common.css' => '/* Το τοποθετημένο εδώ CSS θα εφαÏμοστεί σε όλα τα skins */',
-'standard.css' => '/* Το τοποθετημένο εδώ CSS θα επηÏεάσει χÏήστες του Standard skin */',
-'nostalgia.css' => '/* Το τοποθετημένο εδώ CSS θα επηÏεάσει χÏήστες του Nostalgia skin */',
'cologneblue.css' => '/* Το τοποθετημένο εδώ CSS θα επηÏεάσει χÏήστες του Cologne Blue skin */',
'monobook.css' => '/* Το τοποθετημένο εδώ CSS θα επηÏεάσει χÏήστες του Monobook skin */',
-'myskin.css' => '/* Το τοποθετημένο εδώ CSS θα επηÏεάσει χÏήστες του MySkin skin */',
-'chick.css' => '/* Το τοποθετημένο εδώ CSS θα επηÏεάσει χÏήστες του Chick skin */',
-'simple.css' => '/* Το τοποθετημένο εδώ CSS θα επηÏεάσει χÏήστες του Simple skin */',
'modern.css' => '/* Το τοποθετημένο εδώ CSS θα επηÏεάσει χÏήστες του Modern skin */',
'vector.css' => '/* Το τοποθετημένο εδώ CSS θα επηÏεάσει χÏήστες του Vector skin */',
'print.css' => '/* Το τοποθετημένο εδώ CSS θα επηÏεάσει το αποτέλεσμα της εκτÏπωσης */',
-'handheld.css' => '/* Το τοποθετημένο εδώ CSS θα επηÏεάσει συσκευές χειÏός βάση του skin Ïυθμισμένου στο $wgHandheldStyle */',
# Scripts
'common.js' => '/* Οποιοσδήποτε κώδικας JavaScript εδώ θα φοÏτωθεί για όλους τους χÏήστες σε κάθε φόÏτωση σελίδας. */',
-'standard.js' => '/* Οποιοσδήποτε κώδικας JavaScript εδώ θα φοÏτωθεί για χÏήστες που χÏησιμοποιοÏν το Standard skin */',
-'nostalgia.js' => '/* Οποιοσδήποτε κώδικας JavaScript εδώ θα φοÏτωθεί για χÏήστες που χÏησιμοποιοÏν το Nostalgia skin */',
'cologneblue.js' => '/* Οποιοσδήποτε κώδικας JavaScript εδώ θα φοÏτωθεί για χÏήστες που χÏησιμοποιοÏν το Cologne Blue skin */',
'monobook.js' => '/* Οποιοσδήποτε κώδικας JavaScript εδώ θα φοÏτωθεί για χÏήστες που χÏησιμοποιοÏν το MonoBook skin */',
-'myskin.js' => '/* Οποιοσδήποτε κώδικας JavaScript εδώ θα φοÏτωθεί για χÏήστες που χÏησιμοποιοÏν το MySkin skin */',
-'chick.js' => '/* Οποιοσδήποτε κώδικας JavaScript εδώ θα φοÏτωθεί για χÏήστες που χÏησιμοποιοÏν το Chick skin */',
-'simple.js' => '/* Οποιοσδήποτε κώδικας JavaScript εδώ θα φοÏτωθεί για χÏήστες που χÏησιμοποιοÏν το Simple skin */',
'modern.js' => '/* Οποιοσδήποτε κώδικας JavaScript εδώ θα φοÏτωθεί για χÏήστες που χÏησιμοποιοÏν το Modern skin */',
'vector.js' => '/* Οποιοσδήποτε κώδικας JavaScript εδώ θα φοÏτωθεί για χÏήστες που χÏησιμοποιοÏν το Vector skin */',
@@ -3173,10 +3229,6 @@ $1',
'pageinfo-category-files' => 'ΑÏιθμός αÏχείων',
# Skin names
-'skinname-standard' => 'Κλασσικό',
-'skinname-nostalgia' => 'Îοσταλγία',
-'skinname-myskin' => 'ΤοSkinΜου',
-'skinname-simple' => 'Απλό',
'skinname-modern' => 'ΜοντέÏνο',
# Patrolling
@@ -3254,11 +3306,25 @@ $1',
'minutes' => '{{PLURAL:$1|$1 λεπτό|$1 λεπτά}}',
'hours' => '{{PLURAL:$1|$1 ÏŽÏα|$1 ÏŽÏες}}',
'days' => '{{PLURAL:$1|$1 μέÏα|$1 μέÏες}}',
+'weeks' => '{{PLURAL:$1|$1 εβδομάδα|$1 εβδομάδες}}',
'months' => '{{PLURAL:$1|$1 μήνας|$1 μήνες}}',
'years' => '{{PLURAL:$1|$1 έτος|$1 έτη}}',
'ago' => '$1 Ï€Ïιν',
'just-now' => 'μόλις Ï„ÏŽÏα',
+# Human-readable timestamps
+'hours-ago' => '$1 {{PLURAL:$1|ÏŽÏα|ÏŽÏες}} Ï€Ïιν',
+'minutes-ago' => '$1 {{PLURAL:$1|λεπτό|λεπτά}} Ï€Ïιν',
+'seconds-ago' => '$1 {{PLURAL:$1|δευτεÏόλεπτο|δευτεÏόλεπτα}} Ï€Ïιν',
+'monday-at' => 'ΔευτέÏα στις $1',
+'tuesday-at' => 'ΤÏίτη στις $1',
+'wednesday-at' => 'ΤετάÏτη στις $1',
+'thursday-at' => 'Πέμπτη στις $1',
+'friday-at' => 'ΠαÏασκευή στις $1',
+'saturday-at' => 'Σαββάτο στις $1',
+'sunday-at' => 'ΚυÏιακή στις $1',
+'yesterday-at' => 'Χθες στις $1',
+
# Bad image list
'bad_image_list' => 'Η σÏνταξη είναι ως εξής:
@@ -3286,7 +3352,7 @@ $1',
* gpslongitude
* gpsaltitude',
-# EXIF tags
+# Exif tags
'exif-imagewidth' => 'Πλάτος',
'exif-imagelength' => 'Υψος',
'exif-bitspersample' => 'Bits ανά στοιχείο',
@@ -3464,7 +3530,7 @@ $1',
'exif-originalimageheight' => 'Ύψος εικόνας Ï€Ïιν από την πεÏικοπή της',
'exif-originalimagewidth' => 'Πλάτος της εικόνας Ï€Ïιν από την πεÏικοπή της',
-# EXIF attributes
+# Exif attributes
'exif-compression-1' => 'Έχει αποσυμπιεστεί.',
'exif-compression-2' => 'Εκτέλεση μήκους κωδικοποίησης CCITT Ομάδα 3 Μιας-Διαστάσεως Modified Huffman',
'exif-compression-3' => 'Κωδικοποίηση Φαξ CCITT Ομάδας 3',
@@ -3858,7 +3924,6 @@ $5
'version-other' => 'Άλλα',
'version-mediahandlers' => 'ΧειÏιστές των μέσων',
'version-hooks' => 'ΆγκιστÏα',
-'version-extension-functions' => 'ΣυναÏτήσεις επεκτάσεων',
'version-parser-extensiontags' => 'Ετικέτες επεκτάσεων του ÏƒÏ…Î½Ï„Î±ÎºÏ„Î¹ÎºÎ¿Ï Î±Î½Î±Î»Ï…Ï„Î®',
'version-parser-function-hooks' => 'ΆγκιστÏα συναÏτήσεων του ÏƒÏ…Î½Ï„Î±ÎºÏ„Î¹ÎºÎ¿Ï Î±Î½Î±Î»Ï…Ï„Î®',
'version-hook-name' => 'Όνομα άγκιστÏου',
@@ -3880,12 +3945,15 @@ $5
'version-entrypoints-header-entrypoint' => 'Σημείο εισόδου',
'version-entrypoints-header-url' => 'URL',
-# Special:FilePath
-'filepath' => 'ΔιαδÏομή αÏχείου',
-'filepath-page' => 'ΑÏχείο:',
-'filepath-submit' => 'Μετάβαση',
-'filepath-summary' => 'Αυτή η ειδική σελίδα επιστÏέφει την πλήÏη διαδÏομή ενός αÏχείου.
-Οι εικόνες εμφανίζονται σε πλήÏη ανάλυση, ενώ άλλοι Ï„Ïποι αÏχείων ανοίγονται απευθείας με το αντίστοιχο Ï€ÏόγÏαμμα.',
+# Special:Redirect
+'redirect-legend' => 'ΑνακατεÏθυνση σε ένα αÏχείο ή μια σελίδα',
+'redirect-submit' => 'Μετάβαση',
+'redirect-lookup' => 'Αναζήτηση:',
+'redirect-value' => 'Τιμή:',
+'redirect-user' => 'ΑναγνωÏιστικό χÏήση',
+'redirect-revision' => 'ΑναθεώÏηση σελίδας',
+'redirect-file' => 'Όνομα αÏχείου',
+'redirect-not-exists' => 'Η τιμή δε βÏέθηκε',
# Special:FileDuplicateSearch
'fileduplicatesearch' => 'Αναζήτηση για διπλά αÏχεία',
@@ -3975,6 +4043,9 @@ $5
'htmlform-submit' => 'Υποβολή',
'htmlform-reset' => 'ΑναστÏοφή αλλαγών',
'htmlform-selectorother-other' => 'Άλλο',
+'htmlform-no' => 'Όχι',
+'htmlform-yes' => 'Îαι',
+'htmlform-chosen-placeholder' => 'Κάντε μια επιλογή',
# SQLite database support
'sqlite-has-fts' => '$1 με υποστήÏιξη αναζήτησης πλήÏους κειμένου',
@@ -4092,4 +4163,15 @@ $5
# Image rotation
'rotate-comment' => 'Η εικόνα πεÏιστÏάφηκε $1 {{PLURAL:$1| μοίÏα|μοίÏες}} δεξιόστÏοφα',
+# Limit report
+'limitreport-title' => 'Δεδομένα που σκιαγÏαφοÏν το Ï€Ïοφίλ του ÏƒÏ…Î½Ï„Î±ÎºÏ„Î¹ÎºÎ¿Ï Î±Î½Î±Î»Ï…Ï„Î®:',
+'limitreport-cputime' => 'ΧÏόνος χÏήσης CPU',
+'limitreport-walltime' => 'ΧÏήση Ï€ÏÎ±Î³Î¼Î±Ï„Î¹ÎºÎ¿Ï Ï‡Ïόνου',
+'limitreport-ppvisitednodes' => 'ΚαταμέτÏηση κόμβων επισκεφθέντων από τον Ï€ÏοεπεξεÏγαστή',
+'limitreport-ppgeneratednodes' => 'ΚαταμέτÏηση κόμβων παÏαχθέντων από τον Ï€ÏοεπεξεÏγαστή',
+'limitreport-postexpandincludesize' => 'Μέγεθος συμπεÏίληψης Ï€Ïιν την ανάπτυξη',
+'limitreport-templateargumentsize' => 'Μέγεθος οÏισμάτων Ï€ÏοτÏπων',
+'limitreport-expansiondepth' => 'ΜεγαλÏτεÏο βάθος ανάπτυξης',
+'limitreport-expensivefunctioncount' => 'Πλήθος ακÏιβών συναÏτήσεων ÏƒÏ…Î½Ï„Î±ÎºÏ„Î¹ÎºÎ¿Ï Î±Î½Î±Î»Ï…Ï„Î®',
+
);
diff --git a/languages/messages/MessagesEml.php b/languages/messages/MessagesEml.php
index 3db105df..b0fd2ad3 100644
--- a/languages/messages/MessagesEml.php
+++ b/languages/messages/MessagesEml.php
@@ -99,9 +99,6 @@ Nutêv ca alcuni pàgini i putrèbber cuntinuèr a cràdder ca vueter a-sîv dis
'yourrealname' => 'Al tô vér nàmm:',
'yourlanguage' => 'Léngua:',
-# Special:Log/newusers
-'newuserlogpage' => 'Regestér di nÅv utèint',
-
# Recent changes
'recentchanges' => 'Ûltem cambiamèint',
'diff' => 'diferèinzi',
@@ -132,6 +129,9 @@ Nutêv ca alcuni pàgini i putrèbber cuntinuèr a cràdder ca vueter a-sîv dis
# Special:AllPages
'allpages' => 'Tôt al pàgin',
+# Special:Log/newusers
+'newuserlogpage' => 'Regestér di nÅv utèint',
+
# Watchlist
'watchlist' => 'Al còsi ca guèrd',
'watch' => 'Tîn a drê',
diff --git a/languages/messages/MessagesEn.php b/languages/messages/MessagesEn.php
index f90dfdf3..ffbc88ab 100644
--- a/languages/messages/MessagesEn.php
+++ b/languages/messages/MessagesEn.php
@@ -161,19 +161,27 @@ $datePreferenceMigrationMap = array(
$dateFormats = array(
'mdy time' => 'H:i',
'mdy date' => 'F j, Y',
+ 'mdy monthonly' => 'F Y',
'mdy both' => 'H:i, F j, Y',
+ 'mdy pretty' => 'F j',
'dmy time' => 'H:i',
'dmy date' => 'j F Y',
+ 'dmy monthonly' => 'F Y',
'dmy both' => 'H:i, j F Y',
+ 'dmy pretty' => 'j F',
'ymd time' => 'H:i',
'ymd date' => 'Y F j',
+ 'ymd monthonly' => 'Y F',
'ymd both' => 'H:i, Y F j',
+ 'ymd pretty' => 'F j',
'ISO 8601 time' => 'xnH:xni:xns',
'ISO 8601 date' => 'xnY-xnm-xnd',
+ 'ISO 8601 monthonly' => 'xnY-xnm',
'ISO 8601 both' => 'xnY-xnm-xnd"T"xnH:xni:xns',
+ 'ISO 8601 pretty' => 'xnm-xnd'
);
/**
@@ -249,6 +257,8 @@ $magicWords = array(
'fullpagenamee' => array( 1, 'FULLPAGENAMEE' ),
'subpagename' => array( 1, 'SUBPAGENAME' ),
'subpagenamee' => array( 1, 'SUBPAGENAMEE' ),
+ 'rootpagename' => array( 1, 'ROOTPAGENAME' ),
+ 'rootpagenamee' => array( 1, 'ROOTPAGENAMEE' ),
'basepagename' => array( 1, 'BASEPAGENAME' ),
'basepagenamee' => array( 1, 'BASEPAGENAMEE' ),
'talkpagename' => array( 1, 'TALKPAGENAME' ),
@@ -268,6 +278,7 @@ $magicWords = array(
'img_center' => array( 1, 'center', 'centre' ),
'img_framed' => array( 1, 'framed', 'enframed', 'frame' ),
'img_frameless' => array( 1, 'frameless' ),
+ 'img_lang' => array( 1, 'lang=$1' ),
'img_page' => array( 1, 'page=$1', 'page $1' ),
'img_upright' => array( 1, 'upright', 'upright=$1', 'upright $1' ),
'img_border' => array( 1, 'border' ),
@@ -310,6 +321,7 @@ $magicWords = array(
'revisionyear' => array( 1, 'REVISIONYEAR' ),
'revisiontimestamp' => array( 1, 'REVISIONTIMESTAMP' ),
'revisionuser' => array( 1, 'REVISIONUSER' ),
+ 'revisionsize' => array( 1, 'REVISIONSIZE' ),
'plural' => array( 0, 'PLURAL:' ),
'fullurl' => array( 0, 'FULLURL:' ),
'fullurle' => array( 0, 'FULLURLE:' ),
@@ -374,12 +386,12 @@ $magicWords = array(
$specialPageAliases = array(
'Activeusers' => array( 'ActiveUsers' ),
'Allmessages' => array( 'AllMessages' ),
+ 'AllMyUploads' => array( 'AllMyUploads', 'AllMyFiles' ),
'Allpages' => array( 'AllPages' ),
'Ancientpages' => array( 'AncientPages' ),
'Badtitle' => array( 'Badtitle' ),
'Blankpage' => array( 'BlankPage' ),
'Block' => array( 'Block', 'BlockIP', 'BlockUser' ),
- 'Blockme' => array( 'BlockMe' ),
'Booksources' => array( 'BookSources' ),
'BrokenRedirects' => array( 'BrokenRedirects' ),
'Categories' => array( 'Categories' ),
@@ -391,7 +403,6 @@ $specialPageAliases = array(
'CreateAccount' => array( 'CreateAccount' ),
'Deadendpages' => array( 'DeadendPages' ),
'DeletedContributions' => array( 'DeletedContributions' ),
- 'Disambiguations' => array( 'Disambiguations' ),
'DoubleRedirects' => array( 'DoubleRedirects' ),
'EditWatchlist' => array( 'EditWatchlist' ),
'Emailuser' => array( 'EmailUser' ),
@@ -427,7 +438,7 @@ $specialPageAliases = array(
'Mycontributions' => array( 'MyContributions' ),
'Mypage' => array( 'MyPage' ),
'Mytalk' => array( 'MyTalk' ),
- 'Myuploads' => array( 'MyUploads' ),
+ 'Myuploads' => array( 'MyUploads', 'MyFiles' ),
'Newimages' => array( 'NewFiles', 'NewImages' ),
'Newpages' => array( 'NewPages' ),
'PagesWithProp' => array( 'PagesWithProp', 'Pageswithprop', 'PagesByProp', 'Pagesbyprop' ),
@@ -439,9 +450,12 @@ $specialPageAliases = array(
'Protectedpages' => array( 'ProtectedPages' ),
'Protectedtitles' => array( 'ProtectedTitles' ),
'Randompage' => array( 'Random', 'RandomPage' ),
+ 'RandomInCategory' => array( 'RandomInCategory' ),
'Randomredirect' => array( 'RandomRedirect' ),
'Recentchanges' => array( 'RecentChanges' ),
'Recentchangeslinked' => array( 'RecentChangesLinked', 'RelatedChanges' ),
+ 'Redirect' => array( 'Redirect' ),
+ 'ResetTokens' => array( 'ResetTokens' ),
'Revisiondelete' => array( 'RevisionDelete' ),
'Search' => array( 'Search' ),
'Shortpages' => array( 'ShortPages' ),
@@ -461,8 +475,8 @@ $specialPageAliases = array(
'Unwatchedpages' => array( 'UnwatchedPages' ),
'Upload' => array( 'Upload' ),
'UploadStash' => array( 'UploadStash' ),
- 'Userlogin' => array( 'UserLogin' ),
- 'Userlogout' => array( 'UserLogout' ),
+ 'Userlogin' => array( 'UserLogin', 'Login' ),
+ 'Userlogout' => array( 'UserLogout', 'Logout' ),
'Userrights' => array( 'UserRights', 'MakeSysop', 'MakeBot' ),
'Version' => array( 'Version' ),
'Wantedcategories' => array( 'WantedCategories' ),
@@ -533,10 +547,10 @@ $preloadedMessages = array(
'disclaimers',
'edit',
'editsection',
- 'editsection-brackets',
'editsectionhint',
'help',
'helppage',
+ 'interlanguage-link-title',
'jumpto',
'jumptonavigation',
'jumptosearch',
@@ -622,8 +636,8 @@ The sidebar for MonoBook is generated from this message, lines that do not
begin with * or ** are discarded, furthermore lines that do begin with ** and
do not contain | are also discarded, but do not depend on this behavior for
future releases. Also note that since each list value is wrapped in a unique
-XHTML id it should only appear once and include characters that are legal
-XHTML id names.
+(X)HTML id it should only appear once and include characters that are legal
+(X)HTML id names.
*/
'sidebar' => '
* navigation
@@ -664,9 +678,6 @@ XHTML id names.
'tog-shownumberswatching' => 'Show the number of watching users',
'tog-oldsig' => '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. [//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. [//www.mediawiki.org/wiki/Manual:External_editors More information.])',
-'tog-showjumplinks' => 'Enable "jump to" accessibility links',
'tog-uselivepreview' => 'Use live preview (experimental)',
'tog-forceeditsummary' => 'Prompt me when entering a blank edit summary',
'tog-watchlisthideown' => 'Hide my edits from the watchlist',
@@ -680,6 +691,8 @@ XHTML id names.
'tog-showhiddencats' => 'Show hidden categories',
'tog-noconvertlink' => 'Disable link title conversion', # only translate this message to other languages if you have to change it
'tog-norollbackdiff' => 'Omit diff after performing a rollback',
+'tog-useeditwarning' => 'Warn me when I leave an edit page with unsaved changes',
+'tog-prefershttps' => 'Always use a secure connection when logged in',
'underline-always' => 'Always',
'underline-never' => 'Never',
@@ -693,56 +706,68 @@ XHTML id names.
'editfont-serif' => 'Serif font',
# Dates
-'sunday' => 'Sunday',
-'monday' => 'Monday',
-'tuesday' => 'Tuesday',
-'wednesday' => 'Wednesday',
-'thursday' => 'Thursday',
-'friday' => 'Friday',
-'saturday' => 'Saturday',
-'sun' => 'Sun',
-'mon' => 'Mon',
-'tue' => 'Tue',
-'wed' => 'Wed',
-'thu' => 'Thu',
-'fri' => 'Fri',
-'sat' => 'Sat',
-'january' => 'January',
-'february' => 'February',
-'march' => 'March',
-'april' => 'April',
-'may_long' => 'May',
-'june' => 'June',
-'july' => 'July',
-'august' => 'August',
-'september' => 'September',
-'october' => 'October',
-'november' => 'November',
-'december' => 'December',
-'january-gen' => 'January',
-'february-gen' => 'February',
-'march-gen' => 'March',
-'april-gen' => 'April',
-'may-gen' => 'May',
-'june-gen' => 'June',
-'july-gen' => 'July',
-'august-gen' => 'August',
-'september-gen' => 'September',
-'october-gen' => 'October',
-'november-gen' => 'November',
-'december-gen' => 'December',
-'jan' => 'Jan',
-'feb' => 'Feb',
-'mar' => 'Mar',
-'apr' => 'Apr',
-'may' => 'May',
-'jun' => 'Jun',
-'jul' => 'Jul',
-'aug' => 'Aug',
-'sep' => 'Sep',
-'oct' => 'Oct',
-'nov' => 'Nov',
-'dec' => 'Dec',
+'sunday' => 'Sunday',
+'monday' => 'Monday',
+'tuesday' => 'Tuesday',
+'wednesday' => 'Wednesday',
+'thursday' => 'Thursday',
+'friday' => 'Friday',
+'saturday' => 'Saturday',
+'sun' => 'Sun',
+'mon' => 'Mon',
+'tue' => 'Tue',
+'wed' => 'Wed',
+'thu' => 'Thu',
+'fri' => 'Fri',
+'sat' => 'Sat',
+'january' => 'January',
+'february' => 'February',
+'march' => 'March',
+'april' => 'April',
+'may_long' => 'May',
+'june' => 'June',
+'july' => 'July',
+'august' => 'August',
+'september' => 'September',
+'october' => 'October',
+'november' => 'November',
+'december' => 'December',
+'january-gen' => 'January',
+'february-gen' => 'February',
+'march-gen' => 'March',
+'april-gen' => 'April',
+'may-gen' => 'May',
+'june-gen' => 'June',
+'july-gen' => 'July',
+'august-gen' => 'August',
+'september-gen' => 'September',
+'october-gen' => 'October',
+'november-gen' => 'November',
+'december-gen' => 'December',
+'jan' => 'Jan',
+'feb' => 'Feb',
+'mar' => 'Mar',
+'apr' => 'Apr',
+'may' => 'May',
+'jun' => 'Jun',
+'jul' => 'Jul',
+'aug' => 'Aug',
+'sep' => 'Sep',
+'oct' => 'Oct',
+'nov' => 'Nov',
+'dec' => 'Dec',
+'january-date' => 'January $1',
+'february-date' => 'February $1',
+'march-date' => 'March $1',
+'april-date' => 'April $1',
+'may-date' => 'May $1',
+'june-date' => 'June $1',
+'july-date' => 'July $1',
+'august-date' => 'August $1',
+'september-date' => 'September $1',
+'october-date' => 'October $1',
+'november-date' => 'November $1',
+'december-date' => 'December $1',
# Categories related messages
'pagecategories' => '{{PLURAL:$1|Category|Categories}}',
@@ -765,7 +790,7 @@ XHTML id names.
'broken-file-category' => 'Pages with broken file links',
'categoryviewer-pagedlinks' => '($1) ($2)', # only translate this message to other languages if you have to change it
-'linkprefix' => '/^(.*?)([a-zA-Z\\x80-\\xff]+)$/sD', # only translate this message to other languages if you have to change it
+'linkprefix' => '/^((?>.*(?<![a-zA-Z\\x80-\\xff])))(.+)$/sD', # only translate this message to other languages if you have to change it
'about' => 'About',
'article' => 'Content page',
@@ -830,6 +855,7 @@ XHTML id names.
'create-this-page' => 'Create this page',
'delete' => 'Delete',
'deletethispage' => 'Delete this page',
+'undeletethispage' => 'Undelete this page',
'undelete_short' => 'Undelete {{PLURAL:$1|one edit|$1 edits}}',
'viewdeleted_short' => 'View {{PLURAL:$1|one deleted edit|$1 deleted edits}}',
'protect' => 'Protect',
@@ -875,7 +901,7 @@ $1',
'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).
+# 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).
'aboutsite' => 'About {{SITENAME}}',
'aboutpage' => 'Project:About',
'copyright' => 'Content is available under $1 unless otherwise noted.',
@@ -885,7 +911,7 @@ $1',
'disclaimers' => 'Disclaimers',
'disclaimerpage' => 'Project:General disclaimer',
'edithelp' => 'Editing help',
-'edithelppage' => 'Help:Editing',
+'edithelppage' => 'https://www.mediawiki.org/wiki/Special:MyLanguage/Help:Editing_pages', # do not translate or duplicate this message to other languages
'helppage' => 'Help:Contents',
'mainpage' => 'Main Page',
'mainpage-description' => 'Main page',
@@ -918,7 +944,6 @@ See [[Special:Version|version page]].',
'youhavenewmessagesmulti' => 'You have new messages on $1',
'newtalkseparator' => ',&#32;', # do not translate or duplicate this message to other languages
'editsection' => 'edit',
-'editsection-brackets' => '[$1]', # only translate this message to other languages if you have to change it
'editold' => 'edit',
'viewsourceold' => 'view source',
'editlink' => 'edit',
@@ -947,6 +972,7 @@ See [[Special:Version|version page]].',
'red-link-title' => '$1 (page does not exist)',
'sort-descending' => 'Sort descending',
'sort-ascending' => 'Sort ascending',
+'interlanguage-link-title' => '$1 – $2', # only translate this message to other languages if you have to change it
# Short words for each namespace, by default used in the namespace tab in monobook
'nstab-main' => 'Page',
@@ -974,17 +1000,12 @@ A list of valid special pages can be found at [[Special:SpecialPages|{{int:speci
# General errors
'error' => 'Error',
'databaseerror' => 'Database error',
-'dberrortext' => 'A database query syntax error has occurred.
-This may indicate a bug in the software.
-The last attempted database query was:
-<blockquote><code>$1</code></blockquote>
-from within function "<code>$2</code>".
-Database returned error "<samp>$3: $4</samp>".',
-'dberrortextcl' => 'A database query syntax error has occurred.
-The last attempted database query was:
-"$1"
-from within function "$2".
-Database returned error "$3: $4"',
+'databaseerror-text' => 'A database query error has occurred.
+This may indicate a bug in the software.',
+'databaseerror-textcl' => 'A database query error has occurred.',
+'databaseerror-query' => 'Query: $1',
+'databaseerror-function' => 'Function: $1',
+'databaseerror-error' => 'Error: $1',
'laggedslavemode' => "'''Warning:''' Page may not contain recent updates.",
'readonly' => 'Database locked',
'enterlockreason' => 'Enter a reason for the lock, including an estimate of when the lock will be released',
@@ -1018,6 +1039,7 @@ It may have already been deleted by someone else.',
'cannotdelete-title' => 'Cannot delete page "$1"',
'delete-hook-aborted' => 'Deletion aborted by hook.
It gave no explanation.',
+'no-null-revision' => 'Could not create new null revision for page "$1"',
'badtitle' => 'Bad title',
'badtitletext' => 'The requested page title was invalid, empty, or an incorrectly linked inter-language or inter-wiki title.
It may contain one or more characters that cannot be used in titles.',
@@ -1041,12 +1063,15 @@ To add or change translations for all wikis, please use [//translatewiki.net/ tr
'editinginterface' => "'''Warning:''' You are editing a page that is used to provide interface text for the software.
Changes to this page will affect the appearance of the user interface for other users on this wiki.
To add or change translations for all wikis, please use [//translatewiki.net/ translatewiki.net], the MediaWiki localisation project.",
-'sqlhidden' => '(SQL query hidden)',
'cascadeprotected' => 'This page has been protected from editing because it is included in the following {{PLURAL:$1|page, which is|pages, which are}} protected with the "cascading" option turned on:
$2',
'namespaceprotected' => "You do not have permission to edit pages in the '''$1''' namespace.",
'customcssprotected' => "You do not have permission to edit this CSS page because it contains another user's personal settings.",
'customjsprotected' => "You do not have permission to edit this JavaScript page because it contains another user's personal settings.",
+'mycustomcssprotected' => 'You do not have permission to edit this CSS page.',
+'mycustomjsprotected' => 'You do not have permission to edit this JavaScript page.',
+'myprivateinfoprotected' => 'You do not have permission to edit your private information.',
+'mypreferencesprotected' => 'You do not have permission to edit your preferences.',
'ns-specialprotected' => 'Special pages cannot be edited.',
'titleprotected' => 'This title has been protected from creation by [[User:$1|$1]].
The reason given is "\'\'$2\'\'".',
@@ -1056,7 +1081,7 @@ The administrator who locked it offered this explanation: "$3".',
'invalidtitle-knownnamespace' => 'Invalid title with namespace "$2" and text "$3"',
'invalidtitle-unknownnamespace' => 'Invalid title with unknown namespace number $1 and text "$2"',
'exception-nologin' => 'Not logged in',
-'exception-nologin-text' => 'This page or action requires you to be logged in on this wiki.',
+'exception-nologin-text' => 'Please [[Special:Userlogin|log in]] to be able to access this page or action.',
# Virus scanner
'virus-badscanner' => "Bad configuration: Unknown virus scanner: ''$1''",
@@ -1064,72 +1089,115 @@ The administrator who locked it offered this explanation: "$3".',
'virus-unknownscanner' => 'unknown antivirus:',
# Login and logout pages
-'logouttext' => "'''You are now logged out.'''
+'logouttext' => "'''You are now logged out.'''
Note that some pages may continue to be displayed as if you were still logged in, until you clear your browser cache.",
-'welcomeuser' => 'Welcome, $1!',
-'welcomecreation-msg' => 'Your account has been created.
-Do not forget to change your [[Special:Preferences|{{SITENAME}} preferences]].',
-'yourname' => 'Username:',
-'yourpassword' => 'Password:',
-'yourpasswordagain' => 'Retype password:',
-'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:',
-'password-change-forbidden' => 'You cannot change passwords on this wiki.',
-'externaldberror' => 'There was either an authentication database error or you are not allowed to update your external account.',
-'login' => 'Log in',
-'nav-login-createaccount' => 'Log in / create account',
-'loginprompt' => 'You must have cookies enabled to log in to {{SITENAME}}.',
-'userlogin' => 'Log in / create account',
-'userloginnocreate' => 'Log in',
-'logout' => 'Log out',
-'userlogout' => 'Log out',
-'userlogout-summary' => '', # do not translate or duplicate this message to other languages
-'notloggedin' => 'Not logged in',
-'nologin' => "Don't have an account? $1.",
-'nologinlink' => 'Create an account',
-'createaccount' => 'Create account',
-'gotaccount' => 'Already have an account? $1.',
-'gotaccountlink' => 'Log in',
-'userlogin-resetlink' => 'Forgotten your login details?',
-'createaccountmail' => 'Use a temporary random password and send it to the specified email address',
-'createaccountreason' => 'Reason:',
-'badretype' => 'The passwords you entered do not match.',
-'userexists' => 'Username entered already in use.
+'welcomeuser' => 'Welcome, $1!',
+'welcomecreation-msg' => 'Your account has been created.
+You can change your {{SITENAME}} [[Special:Preferences|preferences]] if you wish.',
+'yourname' => 'Username:',
+'userlogin-yourname' => 'Username',
+'userlogin-yourname-ph' => 'Enter your username',
+'createacct-another-username-ph' => 'Enter the username',
+'createacct-helpusername' => '', # do not translate or duplicate this message to other languages
+'yourpassword' => 'Password:',
+'userlogin-yourpassword' => 'Password',
+'userlogin-yourpassword-ph' => 'Enter your password',
+'createacct-yourpassword-ph' => 'Enter a password',
+'yourpasswordagain' => 'Retype password:',
+'createacct-yourpasswordagain' => 'Confirm password',
+'createacct-yourpasswordagain-ph' => 'Enter password again',
+'remembermypassword' => 'Remember my login on this browser (for a maximum of $1 {{PLURAL:$1|day|days}})',
+'userlogin-remembermypassword' => 'Keep me logged in',
+'userlogin-signwithsecure' => 'Use secure connection',
+'yourdomainname' => 'Your domain:',
+'password-change-forbidden' => 'You cannot change passwords on this wiki.',
+'externaldberror' => 'There was either an authentication database error or you are not allowed to update your external account.',
+'login' => 'Log in',
+'nav-login-createaccount' => 'Log in / create account',
+'loginprompt' => 'You must have cookies enabled to log in to {{SITENAME}}.',
+'userlogin' => 'Log in / create account',
+'userloginnocreate' => 'Log in',
+'logout' => 'Log out',
+'userlogout' => 'Log out',
+'userlogout-summary' => '', # do not translate or duplicate this message to other languages
+'notloggedin' => 'Not logged in',
+'userlogin-noaccount' => "Don't have an account?",
+'userlogin-joinproject' => 'Join {{SITENAME}}',
+'nologin' => "Don't have an account? $1.",
+'nologinlink' => 'Create an account',
+'createaccount' => 'Create account',
+'gotaccount' => 'Already have an account? $1.',
+'gotaccountlink' => 'Log in',
+'userlogin-resetlink' => 'Forgotten your login details?',
+'userlogin-resetpassword-link' => 'Forgot your password?',
+'helplogin-url' => 'Help:Logging in',
+'userlogin-helplink' => '[[{{MediaWiki:helplogin-url}}|Help with logging in]]',
+'userlogin-loggedin' => 'You are already logged in as {{GENDER:$1|$1}}.
+Use the form below to log in as another user.',
+'userlogin-createanother' => 'Create another account',
+'createacct-join' => 'Enter your information below.',
+'createacct-another-join' => "Enter the new account's information below.",
+'createacct-emailrequired' => 'Email address',
+'createacct-emailoptional' => 'Email address (optional)',
+'createacct-email-ph' => 'Enter your email address',
+'createacct-another-email-ph' => 'Enter email address',
+'createaccountmail' => 'Use a temporary random password and send it to the specified email address',
+'createacct-realname' => 'Real name (optional)',
+'createaccountreason' => 'Reason:',
+'createacct-reason' => 'Reason',
+'createacct-reason-ph' => 'Why you are creating another account',
+'createacct-captcha' => 'Security check',
+'createacct-imgcaptcha-help' => '', # do not translate or duplicate this message to other languages
+'createacct-imgcaptcha-ph' => 'Enter the text you see above',
+'createacct-submit' => 'Create your account',
+'createacct-another-submit' => 'Create another account',
+'createacct-benefit-heading' => '{{SITENAME}} is made by people like you.',
+'createacct-benefit-icon1' => 'icon-edits', # do not translate or duplicate this message to other languages
+'createacct-benefit-head1' => '{{NUMBEROFEDITS}}', # do not translate or duplicate this message to other languages
+'createacct-benefit-body1' => '{{PLURAL:$1|edit|edits}}',
+'createacct-benefit-icon2' => 'icon-pages', # do not translate or duplicate this message to other languages
+'createacct-benefit-head2' => '{{NUMBEROFARTICLES}}', # do not translate or duplicate this message to other languages
+'createacct-benefit-body2' => '{{PLURAL:$1|page|pages}}',
+'createacct-benefit-icon3' => 'icon-contributors', # do not translate or duplicate this message to other languages
+'createacct-benefit-head3' => '{{NUMBEROFACTIVEUSERS}}', # do not translate or duplicate this message to other languages
+'createacct-benefit-body3' => 'recent {{PLURAL:$1|contributor|contributors}}',
+'badretype' => 'The passwords you entered do not match.',
+'userexists' => 'Username entered already in use.
Please choose a different name.',
-'loginerror' => 'Login error',
-'createaccounterror' => 'Could not create account: $1',
-'nocookiesnew' => 'The user account was created, but you are not logged in.
+'loginerror' => 'Login error',
+'createacct-error' => 'Account creation error',
+'createaccounterror' => 'Could not create account: $1',
+'nocookiesnew' => 'The user account was created, but you are not logged in.
{{SITENAME}} uses cookies to log in users.
You have cookies disabled.
Please enable them, then log in with your new username and password.',
-'nocookieslogin' => '{{SITENAME}} uses cookies to log in users.
+'nocookieslogin' => '{{SITENAME}} uses cookies to log in users.
You have cookies disabled.
Please enable them and try again.',
-'nocookiesfornew' => 'The user account was not created, as we could not confirm its source.
+'nocookiesfornew' => 'The user account was not created, as we could not confirm its source.
Ensure you have cookies enabled, reload this page and try again.',
-'nocookiesforlogin' => '{{int:nocookieslogin}}', # only translate this message to other languages if you have to change it
-'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".
+'nocookiesforlogin' => '{{int:nocookieslogin}}', # only translate this message to other languages if you have to change it
+'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".
Usernames are case sensitive.
Check your spelling, or [[Special:UserLogin/signup|create a new account]].',
-'nosuchusershort' => 'There is no user by the name "$1".
+'nosuchusershort' => 'There is no user by the name "$1".
Check your spelling.',
-'nouserspecified' => 'You have to specify a username.',
-'login-userblocked' => 'This user is blocked. Login not allowed.',
-'wrongpassword' => 'Incorrect password entered.
+'nouserspecified' => 'You have to specify a username.',
+'login-userblocked' => 'This user is blocked. Login not allowed.',
+'wrongpassword' => 'Incorrect password entered.
Please try again.',
-'wrongpasswordempty' => 'Password entered was blank.
+'wrongpasswordempty' => 'Password entered was blank.
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' => 'Email new password',
-'passwordremindertitle' => 'New temporary password for {{SITENAME}}',
-'passwordremindertext' => 'Someone (probably you, from IP address $1) requested a new
+'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' => 'Email new password',
+'passwordremindertitle' => 'New temporary password for {{SITENAME}}',
+'passwordremindertext' => 'Someone (probably you, from IP address $1) requested a new
password for {{SITENAME}} ($4). A temporary password for user
"$2" has been created and was set to "$3". If this was your
intent, you will need to log in and choose a new password now.
@@ -1138,53 +1206,55 @@ Your temporary password will expire in {{PLURAL:$5|one day|$5 days}}.
If someone else made this request, or if you have remembered your password,
and you no longer wish to change it, you may ignore this message and
continue using your old password.',
-'noemail' => 'There is no email address recorded for user "$1".',
-'noemailcreate' => 'You need to provide a valid email address.',
-'passwordsent' => 'A new password has been sent to the email address registered for "$1".
+'noemail' => 'There is no email address recorded for user "$1".',
+'noemailcreate' => 'You need to provide a valid email address.',
+'passwordsent' => 'A new password has been sent to the email address registered for "$1".
Please log in again after you receive it.',
-'blocked-mailpassword' => 'Your IP address is blocked from editing, and so is not allowed to use the password recovery function to prevent abuse.',
-'eauthentsent' => 'A confirmation email has been sent to the nominated email address.
+'blocked-mailpassword' => 'Your IP address is blocked from editing, and so is not allowed to use the password recovery function to prevent abuse.',
+'eauthentsent' => 'A confirmation email has been sent to the specified email address.
Before any other email is sent to the account, you will have to follow the instructions in the email, to confirm that the account is actually yours.',
-'throttled-mailpassword' => 'A password reset email has already been sent, within the last {{PLURAL:$1|hour|$1 hours}}.
+'throttled-mailpassword' => 'A password reset email has already been sent, within the last {{PLURAL:$1|hour|$1 hours}}.
To prevent abuse, only one password reset email 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
-'loginend-https' => '', # 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
-'signupend-https' => '', # 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.
+'loginstart' => '', # do not translate or duplicate this message to other languages
+'loginend' => '', # do not translate or duplicate this message to other languages
+'loginend-https' => '', # 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
+'signupend-https' => '', # 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.
As a result, visitors using this IP address cannot create any more accounts at the moment.',
-'emailauthenticated' => 'Your email address was authenticated on $2 at $3.',
-'emailnotauthenticated' => 'Your email address is not yet authenticated.
+'emailauthenticated' => 'Your email address was confirmed on $2 at $3.',
+'emailnotauthenticated' => 'Your email address is not yet confirmed.
No email will be sent for any of the following features.',
-'noemailprefs' => 'Specify an email address in your preferences for these features to work.',
-'emailconfirmlink' => 'Confirm your email address',
-'invalidemailaddress' => 'The email address cannot be accepted as it appears to have an invalid format.
+'noemailprefs' => 'Specify an email address in your preferences for these features to work.',
+'emailconfirmlink' => 'Confirm your email address',
+'invalidemailaddress' => 'The email address cannot be accepted as it appears to have an invalid format.
Please enter a well-formatted address or empty that field.',
-'cannotchangeemail' => 'Account email addresses cannot be changed on this wiki.',
-'emaildisabled' => 'This site cannot send emails.',
-'accountcreated' => 'Account created',
+'cannotchangeemail' => 'Account email addresses cannot be changed on this wiki.',
+'emaildisabled' => 'This site cannot send emails.',
+'accountcreated' => 'Account created',
'accountcreatedtext' => 'The user account for [[{{ns:User}}:$1|$1]] ([[{{ns:User talk}}:$1|talk]]) has been created.',
-'createaccount-title' => 'Account creation for {{SITENAME}}',
-'createaccount-text' => 'Someone created an account for your email address on {{SITENAME}} ($4) named "$2", with password "$3".
+'createaccount-title' => 'Account creation for {{SITENAME}}',
+'createaccount-text' => 'Someone created an account for your email address on {{SITENAME}} ($4) named "$2", with password "$3".
You should log in and change your password now.
You may ignore this message, if this account was created in error.',
-'usernamehasherror' => 'Username cannot contain hash characters',
-'login-throttled' => 'You have made too many recent login attempts.
-Please wait before trying again.',
-'login-abort-generic' => 'Your login was unsuccessful - Aborted',
-'loginlanguagelabel' => 'Language: $1',
-'loginlanguagelinks' => '* {{#language:de}}|de
+'usernamehasherror' => 'Username cannot contain hash characters',
+'login-throttled' => 'You have made too many recent login attempts.
+Please wait $1 before trying again.',
+'login-abort-generic' => 'Your login was unsuccessful - Aborted',
+'loginlanguagelabel' => 'Language: $1',
+'loginlanguagelinks' => '* {{#language:de}}|de
* {{#language:en}}|en
* {{#language:eo}}|eo
* {{#language:fr}}|fr
* {{#language:es}}|es
* {{#language:it}}|it
* {{#language:nl}}|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.',
+'suspicious-userlogout' => 'Your request to log out was denied because it looks like it was sent by a broken browser or caching proxy.',
+'createacct-another-realname-tip' => 'Real name is optional.
+If you choose to provide it, this will be used for giving the user attribution for their work.',
# Email sending
'pear-mail-error' => '$1', # do not translate or duplicate this message to other languages
@@ -1202,10 +1272,8 @@ To finish logging in, you must set a new password here:',
'oldpassword' => 'Old password:',
'newpassword' => 'New password:',
'retypenew' => 'Retype new password:',
-'resetpass-abort-generic' => 'Password change has been aborted by an extension.',
'resetpass_submit' => 'Set password and log in',
-'resetpass_success' => 'Your password has been changed successfully!
-Now logging you in...',
+'changepassword-success' => 'Your password has been changed successfully!',
'resetpass_forbidden' => 'Passwords cannot be changed',
'resetpass-no-info' => 'You must be logged in to access this page directly.',
'resetpass-submit-loggedin' => 'Change password',
@@ -1213,13 +1281,15 @@ Now logging you in...',
'resetpass-wrong-oldpass' => 'Invalid temporary or current password.
You may have already successfully changed your password or requested a new temporary password.',
'resetpass-temp-password' => 'Temporary password:',
+'resetpass-abort-generic' => 'Password change has been aborted by an extension.',
# Special:PasswordReset
'passwordreset' => 'Reset password',
-'passwordreset-text' => 'Complete this form to reset your password.',
+'passwordreset-text-one' => 'Complete this form to reset your password.',
+'passwordreset-text-many' => '{{PLURAL:$1|Fill one of the fields to reset your password.}}',
'passwordreset-legend' => 'Reset password',
'passwordreset-disabled' => 'Password resets have been disabled on this wiki.',
-'passwordreset-pretext' => '{{PLURAL:$1||Enter one of the pieces of data below}}',
+'passwordreset-emaildisabled' => 'Email features have been disabled on this wiki.',
'passwordreset-username' => 'Username:',
'passwordreset-domain' => 'Domain:',
'passwordreset-capture' => 'View the resulting email?',
@@ -1251,7 +1321,7 @@ password.',
Temporary password: $2',
'passwordreset-emailsent' => 'A password reset email has been sent.',
'passwordreset-emailsent-capture' => 'A password reset email has been sent, which is shown below.',
-'passwordreset-emailerror-capture' => 'A password reset email was generated, which is shown below, but sending it to the user failed: $1',
+'passwordreset-emailerror-capture' => 'A password reset email was generated, which is shown below, but sending it to the {{GENDER:$2|user}} failed: $1',
# Special:ChangeEmail
'changeemail' => 'Change email address',
@@ -1266,6 +1336,20 @@ Temporary password: $2',
'changeemail-submit' => 'Change email',
'changeemail-cancel' => 'Cancel',
+# Special:ResetTokens
+'resettokens' => 'Reset tokens',
+'resettokens-summary' => '', # do not translate or duplicate this message to other languages
+'resettokens-text' => 'You can reset tokens which allow access to certain private data associated with your account here.
+
+You should do it if you accidentally shared them with someone or if your account has been compromised.',
+'resettokens-no-tokens' => 'There are no tokens to reset.',
+'resettokens-legend' => 'Reset tokens',
+'resettokens-tokens' => 'Tokens:',
+'resettokens-token-label' => '$1 (current value: $2)',
+'resettokens-watchlist-token' => 'Token for the web feed (Atom/RSS) of [[Special:Watchlist|changes to pages on your watchlist]]',
+'resettokens-done' => 'Tokens reset.',
+'resettokens-resetbutton' => 'Reset selected tokens',
+
# Edit page toolbar
'bold_sample' => 'Bold text',
'bold_tip' => 'Bold text',
@@ -1480,6 +1564,7 @@ It gave no explanation.',
It appears to have been deleted.',
'edit-conflict' => 'Edit conflict.',
'edit-no-change' => 'Your edit was ignored because no change was made to the text.',
+'postedit-confirmation' => 'Your edit was saved.',
'edit-already-exists' => 'Could not create a new page.
It already exists.',
'addsection-preload' => '', # do not translate or duplicate this message to other languages
@@ -1488,6 +1573,8 @@ It already exists.',
'content-failed-to-parse' => 'Failed to parse $2 content for $1 model: $3',
'invalid-content-data' => 'Invalid content data',
'content-not-allowed-here' => '"$1" content is not allowed on page [[$2]]',
+'editwarning-warning' => 'Leaving this page may cause you to lose any changes you have made.
+If you are logged in, you can disable this warning in the "Editing" section of your preferences.',
# Content models
'content-model-wikitext' => 'wikitext',
@@ -1518,11 +1605,12 @@ These arguments have been omitted.",
'converter-manual-rule-error' => 'Error detected in manual language conversion rule',
# "Undo" feature
-'undo-success' => 'The edit can be undone.
+'undo-success' => 'The edit can be undone.
Please check the comparison below to verify that this is what you want to do, and then save the changes below to finish undoing the edit.',
-'undo-failure' => 'The edit could not be undone due to conflicting intermediate edits.',
-'undo-norev' => 'The edit could not be undone because it does not exist or was deleted.',
-'undo-summary' => 'Undo revision $1 by [[Special:Contributions/$2|$2]] ([[User talk:$2|talk]])',
+'undo-failure' => 'The edit could not be undone due to conflicting intermediate edits.',
+'undo-norev' => 'The edit could not be undone because it does not exist or was deleted.',
+'undo-summary' => 'Undo revision $1 by [[Special:Contributions/$2|$2]] ([[User talk:$2|talk]])',
+'undo-summary-username-hidden' => 'Undo revision $1 by a hidden user',
# Account creation failure
'cantcreateaccounttitle' => 'Cannot create account',
@@ -1616,17 +1704,17 @@ Other administrators on {{SITENAME}} will still be able to access the hidden con
'revdelete-suppress-text' => "Suppression should '''only''' be used for the following cases:
* Potentially libelous information
* Inappropriate personal information
-*: ''home addresses and telephone numbers, social security numbers, etc.''",
+*: ''home addresses and telephone numbers, national identification numbers, etc.''",
'revdelete-legend' => 'Set visibility restrictions',
-'revdelete-hide-text' => 'Hide revision text',
+'revdelete-hide-text' => 'Revision text',
'revdelete-hide-image' => 'Hide file content',
'revdelete-hide-name' => 'Hide action and target',
-'revdelete-hide-comment' => 'Hide edit summary',
-'revdelete-hide-user' => "Hide editor's username/IP address",
+'revdelete-hide-comment' => 'Edit summary',
+'revdelete-hide-user' => "Editor's username/IP address",
'revdelete-hide-restricted' => 'Suppress data from administrators as well as others',
'revdelete-radio-same' => '(do not change)',
-'revdelete-radio-set' => 'Yes',
-'revdelete-radio-unset' => 'No',
+'revdelete-radio-set' => 'Hidden',
+'revdelete-radio-unset' => 'Visible',
'revdelete-suppress' => 'Suppress data from administrators as well as others',
'revdelete-unsuppress' => 'Remove restrictions on restored revisions',
'revdelete-log' => 'Reason:',
@@ -1709,6 +1797,7 @@ Note that using the navigation links will reset this column.',
'compareselectedversions' => 'Compare selected revisions',
'showhideselectedversions' => 'Change visibility of selected revisions',
'editundo' => 'undo',
+'diff-empty' => '(No difference)',
'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)',
'difference-missing-revision' => '{{PLURAL:$2|One revision|$2 revisions}} of this difference ($1) {{PLURAL:$2|was|were}} not found.
@@ -1738,9 +1827,7 @@ Details can be found in the [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENA
'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
'searchprofile-articles' => 'Content pages',
'searchprofile-project' => 'Help and Project pages',
'searchprofile-images' => 'Multimedia',
@@ -1797,19 +1884,11 @@ Note that their indexes of {{SITENAME}} content may be out of date.',
<input type="radio" name="sitesearch" id="gWWW" value="" /><label for="gWWW">WWW</label>
</div>
</form>', # do not translate or duplicate this message to other languages
+'search-error' => 'An error has occurred while searching: $1',
# OpenSearch description
'opensearch-desc' => '{{SITENAME}} ({{CONTENTLANGUAGE}})', # do not translate or duplicate this message to other languages
-# Quickbar
-'qbsettings' => 'Quickbar',
-'qbsettings-none' => 'None',
-'qbsettings-fixedleft' => 'Fixed left',
-'qbsettings-fixedright' => 'Fixed right',
-'qbsettings-floatingleft' => 'Floating left',
-'qbsettings-floatingright' => 'Floating right',
-'qbsettings-directionality' => 'Fixed, depending on the script directionality of your language',
-
# Preferences page
'preferences' => 'Preferences',
'preferences-summary' => '', # do not translate or duplicate this message to other languages
@@ -1844,7 +1923,6 @@ Note that their indexes of {{SITENAME}} content may be out of date.',
'resetprefs' => 'Clear unsaved changes',
'restoreprefs' => 'Restore all default settings (in all sections)',
'prefs-editing' => 'Editing',
-'prefs-edit-boxsize' => 'Size of the edit window.',
'rows' => 'Rows:',
'columns' => 'Columns:',
'searchresultshead' => 'Search',
@@ -1855,9 +1933,9 @@ Note that their indexes of {{SITENAME}} content may be out of date.',
'recentchangesdays-max' => 'Maximum $1 {{PLURAL:$1|day|days}}',
'recentchangescount' => 'Number of edits to show by default:',
'prefs-help-recentchangescount' => 'This includes recent changes, page histories, and logs.',
-'prefs-help-watchlist-token' => "Filling in this field with a secret key will generate an RSS feed for your watchlist.
-Anyone who knows the key in this field will be able to read your watchlist, so choose a secure value.
-Here's a randomly-generated value you can use: $1",
+'prefs-help-watchlist-token2' => 'This is the secret key to the web feed of your watchlist.
+Anyone who knows it will be able to read your watchlist, so do not share it.
+[[Special:ResetTokens|Click here if you need to reset it]].',
'savedprefs' => 'Your preferences have been saved.',
'timezonelegend' => 'Time zone:',
'localtime' => 'Local time:',
@@ -1888,7 +1966,6 @@ Here's a randomly-generated value you can use: $1",
'prefs-reset-intro' => 'You can use this page to reset your preferences to the site defaults.
This cannot be undone.',
'prefs-emailconfirm-label' => 'Email confirmation:',
-'prefs-textboxsize' => 'Size of editing window',
'youremail' => 'Email:',
'username' => '{{GENDER:$1|Username}}:',
'uid' => '{{GENDER:$1|User}} ID:',
@@ -1926,6 +2003,8 @@ Your email address is not revealed when other users contact you.',
'prefs-dateformat' => 'Date format',
'prefs-timeoffset' => 'Time offset',
'prefs-advancedediting' => 'General options',
+'prefs-editor' => 'Editor',
+'prefs-preview' => 'Preview',
'prefs-advancedrc' => 'Advanced options',
'prefs-advancedrendering' => 'Advanced options',
'prefs-advancedsearchoptions' => 'Advanced options',
@@ -1933,7 +2012,9 @@ Your email address is not revealed when other users contact you.',
'prefs-displayrc' => 'Display options',
'prefs-displaysearchoptions' => 'Display options',
'prefs-displaywatchlist' => 'Display options',
+'prefs-tokenwatchlist' => 'Token',
'prefs-diffs' => 'Diffs',
+'prefs-help-prefershttps' => 'This preference will take effect on your next login.',
# User preference: email validation using jQuery
'email-address-validity-valid' => 'Email address appears valid',
@@ -1963,6 +2044,8 @@ Your email address is not revealed when other users contact you.',
'userrights-changeable-col' => 'Groups you can change',
'userrights-unchangeable-col' => 'Groups you cannot change',
'userrights-irreversible-marker' => '$1*', # only translate this message to other languages if you have to change it
+'userrights-conflict' => 'Conflict of user rights changes! Please review and confirm your changes.',
+'userrights-removed-self' => 'You successfully removed your own rights. As such, you are no longer able to access this page.',
# Groups
'group' => 'Group:',
@@ -2028,11 +2111,19 @@ Your email address is not revealed when other users contact you.',
'right-proxyunbannable' => 'Bypass automatic blocks of proxies',
'right-unblockself' => 'Unblock oneself',
'right-protect' => 'Change protection levels and edit cascade-protected pages',
-'right-editprotected' => 'Edit protected pages (without cascading protection)',
+'right-editprotected' => 'Edit pages protected as "{{int:protect-level-sysop}}"',
+'right-editsemiprotected' => 'Edit pages protected as "{{int:protect-level-autoconfirmed}}"',
'right-editinterface' => 'Edit the user interface',
'right-editusercssjs' => "Edit other users' CSS and JavaScript files",
'right-editusercss' => "Edit other users' CSS files",
'right-edituserjs' => "Edit other users' JavaScript files",
+'right-editmyusercss' => 'Edit your own user CSS files',
+'right-editmyuserjs' => 'Edit your own user JavaScript files',
+'right-viewmywatchlist' => 'View your own watchlist',
+'right-editmywatchlist' => 'Edit your own watchlist. Note some actions will still add pages even without this right.',
+'right-viewmyprivateinfo' => 'View your own private data (e.g. email address, real name)',
+'right-editmyprivateinfo' => 'Edit your own private data (e.g. email address, real name)',
+'right-editmyoptions' => 'Edit your own preferences',
'right-rollback' => 'Quickly rollback the edits of the last user who edited a particular page',
'right-markbotedits' => 'Mark rolled-back edits as bot edits',
'right-noratelimit' => 'Not be affected by rate limits',
@@ -2094,14 +2185,21 @@ Your email address is not revealed when other users contact you.',
'action-userrights-interwiki' => 'edit user rights of users on other wikis',
'action-siteadmin' => 'lock or unlock the database',
'action-sendemail' => 'send emails',
+'action-editmywatchlist' => 'edit your watchlist',
+'action-viewmywatchlist' => 'view your watchlist',
+'action-viewmyprivateinfo' => 'view your private information',
+'action-editmyprivateinfo' => 'edit your private information',
# Recent changes
'nchanges' => '$1 {{PLURAL:$1|change|changes}}',
+'enhancedrc-since-last-visit' => '$1 {{PLURAL:$1|since last visit}}',
+'enhancedrc-history' => 'history',
'recentchanges' => 'Recent changes',
'recentchanges-url' => 'Special:RecentChanges', # do not translate or duplicate this message to other languages
'recentchanges-legend' => 'Recent changes options',
'recentchanges-summary' => 'Track the most recent changes to the wiki on this page.',
'recentchangestext' => '-', # do not translate or duplicate this message to other languages
+'recentchanges-noresult' => 'No changes during the given period matching these criteria.',
'recentchanges-feed-description' => 'Track the most recent changes to the wiki in this feed.',
'recentchanges-label-newpage' => 'This edit created a new page',
'recentchanges-label-minor' => 'This is a minor edit',
@@ -2137,15 +2235,14 @@ Your email address is not revealed when other users contact you.',
'rc-old-title' => 'originally created as "$1"',
# Recent changes linked
-'recentchangeslinked' => 'Related changes',
-'recentchangeslinked-feed' => 'Related changes',
-'recentchangeslinked-toolbox' => 'Related changes',
-'recentchangeslinked-title' => 'Changes related to "$1"',
-'recentchangeslinked-noresult' => 'No changes on linked pages during the given period.',
-'recentchangeslinked-summary' => "This is a list of changes made recently to pages linked from a specified page (or to members of a specified category).
+'recentchangeslinked' => 'Related changes',
+'recentchangeslinked-feed' => 'Related changes',
+'recentchangeslinked-toolbox' => 'Related changes',
+'recentchangeslinked-title' => 'Changes related to "$1"',
+'recentchangeslinked-summary' => "This is a list of changes made recently to pages linked from a specified page (or to members of a specified category).
Pages on [[Special:Watchlist|your watchlist]] are '''bold'''.",
-'recentchangeslinked-page' => 'Page name:',
-'recentchangeslinked-to' => 'Show changes to pages linked to the given page instead',
+'recentchangeslinked-page' => 'Page name:',
+'recentchangeslinked-to' => 'Show changes to pages linked to the given page instead',
# Upload
'upload' => 'Upload file',
@@ -2153,7 +2250,7 @@ Pages on [[Special:Watchlist|your watchlist]] are '''bold'''.",
'reuploaddesc' => 'Cancel upload and return to the upload form',
'upload-tryagain' => 'Submit modified file description',
'uploadnologin' => 'Not logged in',
-'uploadnologintext' => 'You must be [[Special:UserLogin|logged in]] to upload files.',
+'uploadnologintext' => 'You must $1 to upload files.',
'upload_directory_missing' => 'The upload directory ($1) is missing and could not be created by the webserver.',
'upload_directory_read_only' => 'The upload directory ($1) is not writable by the webserver.',
'uploaderror' => 'Upload error',
@@ -2172,6 +2269,7 @@ To include a file in a page, use a link in one of the following forms:
'upload-preferred' => 'Preferred file types: $1.',
'upload-prohibited' => 'Prohibited file types: $1.',
'uploadfooter' => '-', # do not translate or duplicate this message to other languages
+'upload-default-description' => '-', # do not translate or duplicate this message to other languages
'uploadlog' => 'upload log',
'uploadlogpage' => 'Upload log',
'uploadlogpagetext' => 'Below is a list of the most recent file uploads.
@@ -2388,14 +2486,13 @@ For optimal security, img_auth.php is disabled.',
'img-auth-bad-query-string' => 'The URL has an invalid query string.',
# HTTP errors
-'http-invalid-url' => 'Invalid URL: $1',
-'http-invalid-scheme' => 'URLs with the "$1" scheme are not supported.',
-'http-request-error' => 'HTTP request failed due to unknown error.',
-'http-read-error' => 'HTTP read error.',
-'http-timed-out' => 'HTTP request timed out.',
-'http-curl-error' => 'Error fetching URL: $1',
-'http-host-unreachable' => 'Could not reach URL.',
-'http-bad-status' => 'There was a problem during the HTTP request: $1 $2',
+'http-invalid-url' => 'Invalid URL: $1',
+'http-invalid-scheme' => 'URLs with the "$1" scheme are not supported.',
+'http-request-error' => 'HTTP request failed due to unknown error.',
+'http-read-error' => 'HTTP read error.',
+'http-timed-out' => 'HTTP request timed out.',
+'http-curl-error' => 'Error fetching URL: $1',
+'http-bad-status' => 'There was a problem during the HTTP request: $1 $2',
# Some likely curl errors. More could be added from <http://curl.haxx.se/libcurl/c/libcurl-errors.html>
'upload-curl-error6' => 'Could not reach URL',
@@ -2415,17 +2512,21 @@ You may want to try at a less busy time.',
'upload_source_file' => '(a file on your computer)',
# Special:ListFiles
-'listfiles-summary' => 'This special page shows all uploaded files.',
-'listfiles_search_for' => 'Search for media name:',
-'imgfile' => 'file',
-'listfiles' => 'File list',
-'listfiles_thumb' => 'Thumbnail',
-'listfiles_date' => 'Date',
-'listfiles_name' => 'Name',
-'listfiles_user' => 'User',
-'listfiles_size' => 'Size',
-'listfiles_description' => 'Description',
-'listfiles_count' => 'Versions',
+'listfiles-summary' => 'This special page shows all uploaded files.',
+'listfiles_search_for' => 'Search for media name:',
+'imgfile' => 'file',
+'listfiles' => 'File list',
+'listfiles_thumb' => 'Thumbnail',
+'listfiles_date' => 'Date',
+'listfiles_name' => 'Name',
+'listfiles_user' => 'User',
+'listfiles_size' => 'Size',
+'listfiles_description' => 'Description',
+'listfiles_count' => 'Versions',
+'listfiles-show-all' => 'Include old versions of images',
+'listfiles-latestversion' => 'Current version',
+'listfiles-latestversion-yes' => 'Yes',
+'listfiles-latestversion-no' => 'No',
# File description page
'file-anchor-link' => 'File',
@@ -2529,6 +2630,13 @@ Remember to check for other links to the templates before deleting them.',
'randompage-nopages' => 'There are no pages in the following {{PLURAL:$2|namespace|namespaces}}: $1.',
'randompage-url' => 'Special:Random', # do not translate or duplicate this message to other languages
+# Random page in category
+'randomincategory' => 'Random page in category',
+'randomincategory-invalidcategory' => '"$1" is not a valid category name.',
+'randomincategory-nopages' => 'There are no pages in the [[:Category:$1|$1]] category.',
+'randomincategory-selectcategory' => 'Get random page from category: $1 $2.',
+'randomincategory-selectcategory-submit' => 'Go',
+
# Random redirect
'randomredirect' => 'Random redirect',
'randomredirect-nopages' => 'There are no redirects in the namespace "$1".',
@@ -2556,19 +2664,14 @@ Remember to check for other links to the templates before deleting them.',
'statistics-mostpopular' => 'Most viewed pages',
'statistics-footer' => '', # do not translate or duplicate this message to other languages
-'disambiguations' => 'Pages linking to disambiguation pages',
-'disambiguations-summary' => '', # do not translate or duplicate this message to other languages
-'disambiguationspage' => 'Template:disambig',
-'disambiguations-text' => "The following pages contain at least one link to a '''disambiguation page'''.
-They may have to link to a more appropriate page instead.<br />
-A page is treated as a disambiguation page if it uses a template that is linked from [[MediaWiki:Disambiguationspage]].",
-
-'pageswithprop' => 'Pages with a page property',
-'pageswithprop-summary' => '', # do not translate or duplicate this message to other languages
-'pageswithprop-legend' => 'Pages with a page property',
-'pageswithprop-text' => 'This page lists pages that use a particular page property.',
-'pageswithprop-prop' => 'Property name:',
-'pageswithprop-submit' => 'Go',
+'pageswithprop' => 'Pages with a page property',
+'pageswithprop-summary' => '', # do not translate or duplicate this message to other languages
+'pageswithprop-legend' => 'Pages with a page property',
+'pageswithprop-text' => 'This page lists pages that use a particular page property.',
+'pageswithprop-prop' => 'Property name:',
+'pageswithprop-submit' => 'Go',
+'pageswithprop-prophidden-long' => 'long text property value hidden ($1)',
+'pageswithprop-prophidden-binary' => 'binary property value hidden ($1)',
'doubleredirects' => 'Double redirects',
'doubleredirects-summary' => '', # do not translate or duplicate this message to other languages
@@ -2650,6 +2753,7 @@ It now redirects to [[$2]].',
'prefixindex' => 'All pages with prefix',
'prefixindex-namespace' => 'All pages with prefix ($1 namespace)',
'prefixindex-summary' => '', # do not translate or duplicate this message to other languages
+'prefixindex-strip' => 'Strip prefix in list',
'shortpages' => 'Short pages',
'shortpages-summary' => '', # do not translate or duplicate this message to other languages
'longpages' => 'Long pages',
@@ -2671,6 +2775,7 @@ It now redirects to [[$2]].',
'listusers-summary' => '', # do not translate or duplicate this message to other languages
'listusers-editsonly' => 'Show only users with edits',
'listusers-creationsort' => 'Sort by creation date',
+'listusers-desc' => 'Sort in descending order',
'usereditcount' => '$1 {{PLURAL:$1|edit|edits}}',
'usercreated' => '{{GENDER:$3|Created}} on $1 at $2',
'newpages' => 'New pages',
@@ -2866,10 +2971,9 @@ Future changes to this page and its associated talk page will be listed there.',
'unwatchthispage' => 'Stop watching',
'notanarticle' => 'Not a content page',
'notvisiblerev' => 'The last revision by a different user has been deleted',
-'watchnochange' => 'None of your watched items were edited in the time period displayed.',
'watchlist-details' => '{{PLURAL:$1|$1 page|$1 pages}} on your watchlist, not counting talk pages.',
-'wlheader-enotif' => '* Email notification is enabled.',
-'wlheader-showupdated' => "* Pages that have been changed since you last visited them are shown in '''bold'''",
+'wlheader-enotif' => 'Email notification is enabled.',
+'wlheader-showupdated' => "Pages that have been changed since you last visited them are shown in '''bold'''.",
'watchmethod-recent' => 'checking recent edits for watched pages',
'watchmethod-list' => 'checking watched pages for recent edits',
'watchlistcontains' => 'Your watchlist contains $1 {{PLURAL:$1|page|pages}}.',
@@ -2909,9 +3013,9 @@ Contact the editor:
mail: $PAGEEDITOR_EMAIL
wiki: $PAGEEDITOR_WIKI
-There will be no other notifications in case of further activity unless you visit this page. You could also reset the notification flags for all your watched pages on your watchlist.
+There will be no other notifications in case of further activity unless you visit this page while logged in. You could also reset the notification flags for all your watched pages on your watchlist.
- Your friendly {{SITENAME}} notification system
+Your friendly {{SITENAME}} notification system
--
To change your email notification settings, visit
@@ -3129,7 +3233,7 @@ $1',
'contributions-summary' => '', # do not translate or duplicate this message to other languages
'contributions-title' => 'User contributions for $1',
'mycontris' => 'Contributions',
-'contribsub2' => 'For $1 ($2)',
+'contribsub2' => 'For {{GENDER:$3|$1}} ($2)',
'nocontribs' => 'No changes were found matching these criteria.',
'uctop' => '(current)',
'month' => 'From month (and earlier):',
@@ -3295,16 +3399,14 @@ See the [[Special:BlockList|block list]] for the list of currently operational b
It is, however, blocked as part of the range $2, which can be unblocked.',
'ip_range_invalid' => 'Invalid IP range.',
'ip_range_toolarge' => 'Range blocks larger than /$1 are not allowed.',
-'blockme' => 'Block me',
'proxyblocker' => 'Proxy blocker',
-'proxyblocker-disabled' => 'This function is disabled.',
'proxyblockreason' => 'Your IP address has been blocked because it is an open proxy.
Please contact your Internet service provider or technical support of your organization and inform them of this serious security problem.',
-'proxyblocksuccess' => 'Done.',
'sorbs' => 'DNSBL', # only translate this message to other languages if you have to change it
'sorbsreason' => 'Your IP address is listed as an open proxy in the DNSBL used by {{SITENAME}}.',
'sorbs_create_account_reason' => 'Your IP address is listed as an open proxy in the DNSBL used by {{SITENAME}}.
You cannot create an account',
+'xffblockreason' => 'An IP address present in the X-Forwarded-For header, either yours or that of a proxy server you are using, has been blocked. The original block reason was: $1',
'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.",
@@ -3400,6 +3502,7 @@ Please merge them manually.'''",
'movesubpagetext' => 'This page has $1 {{PLURAL:$1|subpage|subpages}} shown below.',
'movenosubpage' => 'This page has no subpages.',
'movereason' => 'Reason:',
+'move-redirect-text' => '', # do not translate or duplicate this message to other languages
'revertmove' => 'revert',
'delete_and_move' => 'Delete and move',
'delete_and_move_text' => '== Deletion required ==
@@ -3459,7 +3562,7 @@ In the latter case you can also use a link, for example [[{{#Special:Export}}/{{
'allmessagesdefault' => 'Default message text',
'allmessagescurrent' => 'Current message text',
'allmessagestext' => 'This is a list of system messages available in the MediaWiki namespace.
-Please visit [//www.mediawiki.org/wiki/Localisation MediaWiki Localisation] and [//translatewiki.net translatewiki.net] if you wish to contribute to the generic MediaWiki localisation.',
+Please visit [https://www.mediawiki.org/wiki/Localisation MediaWiki Localisation] and [//translatewiki.net translatewiki.net] if you wish to contribute to the generic MediaWiki localisation.',
'allmessagesnotsupportedDB' => "This page cannot be used because '''\$wgUseDatabaseMessages''' has been disabled.",
'allmessages-filter-legend' => 'Filter',
'allmessages-filter' => 'Filter by customization state:',
@@ -3474,6 +3577,8 @@ Please visit [//www.mediawiki.org/wiki/Localisation MediaWiki Localisation] and
'thumbnail-more' => 'Enlarge',
'filemissing' => 'File missing',
'thumbnail_error' => 'Error creating thumbnail: $1',
+'thumbnail_error_remote' => 'Error message from $1:
+$2',
'djvu_page_error' => 'DjVu page out of range',
'djvu_no_xml' => 'Unable to fetch XML for DjVu file',
'thumbnail-temp-create' => 'Unable to create temporary thumbnail file',
@@ -3700,17 +3805,11 @@ You can view its source',
# 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
-'standard.css' => '/* CSS placed here will affect users of the Standard skin */', # only translate this message to other languages if you have to change it
-'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
-'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
'vector.css' => '/* CSS placed here will affect users of the Vector skin */', # only translate this message to other languages if you have to change it
'print.css' => '/* CSS placed here will affect the print output */', # only translate this message to other languages if you have to change it
-'handheld.css' => '/* CSS placed here will affect handheld devices based on the skin configured in $wgHandheldStyle */', # only translate this message to other languages if you have to change it
'noscript.css' => '/* CSS placed here will affect users with JavaScript disabled */', # only translate this message to other languages if you have to change it
'group-autoconfirmed.css' => '/* CSS placed here will affect autoconfirmed users only */', # only translate this message to other languages if you have to change it
'group-bot.css' => '/* CSS placed here will affect bots only */', # only translate this message to other languages if you have to change it
@@ -3719,13 +3818,8 @@ You can view its source',
# Scripts
'common.js' => '/* Any JavaScript here will be loaded for all users on every page load. */', # only translate this message to other languages if you have to change it
-'standard.js' => '/* Any JavaScript here will be loaded for users using the Standard skin */', # only translate this message to other languages if you have to change it
-'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
-'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
'vector.js' => '/* Any JavaScript here will be loaded for users using the Vector skin */', # only translate this message to other languages if you have to change it
'group-autoconfirmed.js' => '/* Any JavaScript here will be loaded for autoconfirmed users only */', # only translate this message to other languages if you have to change it
@@ -3757,6 +3851,8 @@ This is probably caused by a link to a blacklisted external site.',
'spam_reverting' => 'Reverting to last revision not containing links to $1',
'spam_blanking' => 'All revisions contained links to $1, blanking',
'spam_deleting' => 'All revisions contained links to $1, deleting',
+'simpleantispam-label' => "Anti-spam check.
+Do '''NOT''' fill this in!",
# Info page
'pageinfo-header' => '-', # do not translate or duplicate this message to other languages
@@ -3808,13 +3904,8 @@ This is probably caused by a link to a blacklisted external site.',
'pageinfo-category-files' => 'Number of files',
# Skin names
-'skinname-standard' => 'Classic', # only translate this message to other languages if you have to change it
-'skinname-nostalgia' => 'Nostalgia', # only translate this message to other languages if you have to change it
'skinname-cologneblue' => 'Cologne Blue', # only translate this message to other languages if you have to change it
'skinname-monobook' => 'MonoBook', # only translate this message to other languages if you have to change it
-'skinname-myskin' => 'MySkin', # only translate this message to other languages if you have to change it
-'skinname-chick' => 'Chick', # only translate this message to other languages if you have to change it
-'skinname-simple' => 'Simple', # only translate this message to other languages if you have to change it
'skinname-modern' => 'Modern', # only translate this message to other languages if you have to change it
'skinname-vector' => 'Vector', # only translate this message to other languages if you have to change it
@@ -3866,7 +3957,7 @@ By executing it, your system may be compromised.",
'svg-long-desc' => 'SVG file, nominally $1 × $2 pixels, file size: $3',
'svg-long-desc-animated' => 'Animated SVG file, nominally $1 × $2 pixels, file size: $3',
'svg-long-error' => 'Invalid SVG file: $1',
-'show-big-image' => 'Full resolution',
+'show-big-image' => 'Original file',
'show-big-image-preview' => 'Size of this preview: $1.',
'show-big-image-other' => 'Other {{PLURAL:$2|resolution|resolutions}}: $1.',
'show-big-image-size' => '$1 × $2 pixels',
@@ -3900,11 +3991,26 @@ By executing it, your system may be compromised.",
'minutes' => '{{PLURAL:$1|$1 minute|$1 minutes}}',
'hours' => '{{PLURAL:$1|$1 hour|$1 hours}}',
'days' => '{{PLURAL:$1|$1 day|$1 days}}',
+'weeks' => '{{PLURAL:$1|$1 week|$1 weeks}}',
'months' => '{{PLURAL:$1|$1 month|$1 months}}',
'years' => '{{PLURAL:$1|$1 year|$1 years}}',
'ago' => '$1 ago',
'just-now' => 'just now',
+# Human-readable timestamps
+'hours-ago' => '$1 {{PLURAL:$1|hour|hours}} ago',
+'minutes-ago' => '$1 {{PLURAL:$1|minute|minutes}} ago',
+'seconds-ago' => '$1 {{PLURAL:$1|second|seconds}} ago',
+'monday-at' => 'Monday at $1',
+'tuesday-at' => 'Tuesday at $1',
+'wednesday-at' => 'Wednesday at $1',
+'thursday-at' => 'Thursday at $1',
+'friday-at' => 'Friday at $1',
+'saturday-at' => 'Saturday at $1',
+'sunday-at' => 'Sunday at $1',
+'today-at' => '$1', # do not translate or duplicate this message to other languages
+'yesterday-at' => 'Yesterday at $1',
+
# Bad image list
'bad_image_list' => 'The format is as follows:
@@ -3989,7 +4095,7 @@ Others will be hidden by default.
'metadata-langitem' => "'''$2:''' $1", # only translate this message to other languages if you have to change it
'metadata-langitem-default' => '$1', # only translate this message to other languages if you have to change it
-# EXIF tags
+# Exif tags
'exif-imagewidth' => 'Width',
'exif-imagelength' => 'Height',
'exif-bitspersample' => 'Bits per component',
@@ -4186,7 +4292,7 @@ $4, $5, $6 $7
$8', # only translate this message to other languages if you have to change it
'exif-subjectnewscode-value' => '$2 ($1)', # only translate this message to other languages if you have to change it
-# EXIF attributes
+# Exif attributes
'exif-compression-1' => 'Uncompressed',
'exif-compression-2' => 'CCITT Group 3 1-Dimensional Modified Huffman run length encoding',
'exif-compression-3' => 'CCITT Group 3 fax encoding',
@@ -4425,7 +4531,7 @@ $8', # only translate this message to other languages if you have to change it
# External editor support
'edit-externally' => 'Edit this file using an external application',
-'edit-externally-help' => '(See the [//www.mediawiki.org/wiki/Manual:External_editors setup instructions] for more information)',
+'edit-externally-help' => '(See the [https://www.mediawiki.org/wiki/Manual:External_editors setup instructions] for more information)',
# 'all' in various places, this might be different for inflected languages
'watchlistall2' => 'all',
@@ -4534,7 +4640,7 @@ Please confirm that you really want to recreate this page.",
'semicolon-separator' => ';&#32;', # only translate this message to other languages if you have to change it
'comma-separator' => ',&#32;', # only translate this message to other languages if you have to change it
'colon-separator' => ':&#32;', # only translate this message to other languages if you have to change it
-'autocomment-prefix' => '-&#32;', # only translate this message to other languages if you have to change it
+'autocomment-prefix' => '', # do not translate or duplicate this message to other languages
'pipe-separator' => '&#32;|&#32;', # only translate this message to other languages if you have to change it
'word-separator' => '&#32;', # only translate this message to other languages if you have to change it
'ellipsis' => '...', # only translate this message to other languages if you have to change it
@@ -4732,7 +4838,6 @@ You can also [[Special:EditWatchlist|use the standard editor]].',
'version-other' => 'Other',
'version-mediahandlers' => 'Media handlers',
'version-hooks' => 'Hooks',
-'version-extension-functions' => 'Extension functions',
'version-parser-extensiontags' => 'Parser extension tags',
'version-parser-function-hooks' => 'Parser function hooks',
'version-hook-name' => 'Hook name',
@@ -4740,8 +4845,9 @@ You can also [[Special:EditWatchlist|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 '''[//www.mediawiki.org/ MediaWiki]''', copyright © 2001-$1 $2.",
+'version-poweredby-credits' => "This wiki is powered by '''[https://www.mediawiki.org/ MediaWiki]''', copyright © 2001-$1 $2.",
'version-poweredby-others' => 'others',
+'version-poweredby-translators' => 'translatewiki.net translators',
'version-credits-summary' => 'We would like to recognize the following persons for their contribution to [[Special:Version|MediaWiki]].',
'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.
@@ -4760,12 +4866,18 @@ You should have received [{{SERVER}}{{SCRIPTPATH}}/COPYING a copy of the GNU Gen
'version-entrypoints-api-php' => '[https://www.mediawiki.org/wiki/Manual:api.php api.php]', # do not translate or duplicate this message to other languages
'version-entrypoints-load-php' => '[https://www.mediawiki.org/wiki/Manual:load.php load.php]', # do not translate or duplicate this message to other languages
-# Special:FilePath
-'filepath' => 'File path',
-'filepath-page' => 'File:',
-'filepath-submit' => 'Go',
-'filepath-summary' => 'This special page returns the complete path for a file.
-Images are shown in full resolution, other file types are started with their associated program directly.',
+# Special:Redirect
+'redirect' => 'Redirect by file, user, or revision ID',
+'redirect-legend' => 'Redirect to a file or page',
+'redirect-text' => '', # do not translate or duplicate this message to other languages
+'redirect-summary' => 'This special page redirects to a file (given the file name), a page (given a revision ID), or a user page (given a numeric user ID). Usage: [[{{#Special:Redirect}}/file/Example.jpg]], [[{{#Special:Redirect}}/revision/328429]], or [[{{#Special:Redirect}}/user/101]].',
+'redirect-submit' => 'Go',
+'redirect-lookup' => 'Lookup:',
+'redirect-value' => 'Value:',
+'redirect-user' => 'User ID',
+'redirect-revision' => 'Page revision',
+'redirect-file' => 'File name',
+'redirect-not-exists' => 'Value not found',
# Special:FileDuplicateSearch
'fileduplicatesearch' => 'Search for duplicate files',
@@ -4816,12 +4928,16 @@ Images are shown in full resolution, other file types are started with their ass
'tags-summary' => '', # do not translate or duplicate this message to other languages
'tag-filter' => '[[Special:Tags|Tag]] filter:',
'tag-filter-submit' => 'Filter',
+'tag-list-wrapper' => '([[Special:Tags|{{PLURAL:$1|Tag|Tags}}]]: $2)',
'tags-title' => 'Tags',
'tags-intro' => 'This page lists the tags that the software may mark an edit with, and their meaning.',
'tags-tag' => 'Tag name',
'tags-display-header' => 'Appearance on change lists',
'tags-description-header' => 'Full description of meaning',
+'tags-active-header' => 'Active?',
'tags-hitcount-header' => 'Tagged changes',
+'tags-active-yes' => 'Yes',
+'tags-active-no' => 'No',
'tags-edit' => 'edit',
'tags-hitcount' => '$1 {{PLURAL:$1|change|changes}}',
@@ -4840,10 +4956,10 @@ Images are shown in full resolution, other file types are started with their ass
# Database error messages
'dberr-header' => 'This wiki has a problem',
-'dberr-problems' => 'Sorry!
-This site is experiencing technical difficulties.',
+'dberr-problems' => 'Sorry! This site is experiencing technical difficulties.',
'dberr-again' => 'Try waiting a few minutes and reloading.',
'dberr-info' => '(Cannot contact the database server: $1)',
+'dberr-info-hidden' => '(Cannot contact the database server)',
'dberr-usegoogle' => 'You can try searching via Google in the meantime.',
'dberr-outofdate' => 'Note that their indexes of our content may be out of date.',
'dberr-cachederror' => 'This is a cached copy of the requested page, and may not be up to date.',
@@ -4859,6 +4975,9 @@ This site is experiencing technical difficulties.',
'htmlform-submit' => 'Submit',
'htmlform-reset' => 'Undo changes',
'htmlform-selectorother-other' => 'Other',
+'htmlform-no' => 'No',
+'htmlform-yes' => 'Yes',
+'htmlform-chosen-placeholder' => 'Select an option',
# SQLite database support
'sqlite-has-fts' => '$1 with full-text search support',
@@ -5001,4 +5120,23 @@ Otherwise, you can use the easy form below. Your comment will be added to the pa
# Image rotation
'rotate-comment' => 'Image rotated by $1 {{PLURAL:$1|degree|degrees}} clockwise',
+# Limit report
+'limitreport-title' => 'Parser profiling data:',
+'limitreport-cputime' => 'CPU time usage',
+'limitreport-cputime-value' => '$1 {{PLURAL:$1|second|seconds}}',
+'limitreport-walltime' => 'Real time usage',
+'limitreport-walltime-value' => '$1 {{PLURAL:$1|second|seconds}}',
+'limitreport-ppvisitednodes' => 'Preprocessor visited node count',
+'limitreport-ppvisitednodes-value' => '$1/$2', # only translate this message to other languages if you have to change it
+'limitreport-ppgeneratednodes' => 'Preprocessor generated node count',
+'limitreport-ppgeneratednodes-value' => '$1/$2', # only translate this message to other languages if you have to change it
+'limitreport-postexpandincludesize' => 'Post-expand include size',
+'limitreport-postexpandincludesize-value' => '$1/$2 {{PLURAL:$2|byte|bytes}}',
+'limitreport-templateargumentsize' => 'Template argument size',
+'limitreport-templateargumentsize-value' => '$1/$2 {{PLURAL:$2|byte|bytes}}',
+'limitreport-expansiondepth' => 'Highest expansion depth',
+'limitreport-expansiondepth-value' => '$1/$2', # only translate this message to other languages if you have to change it
+'limitreport-expensivefunctioncount' => 'Expensive parser function count',
+'limitreport-expensivefunctioncount-value' => '$1/$2', # only translate this message to other languages if you have to change it
+
);
diff --git a/languages/messages/MessagesEn_ca.php b/languages/messages/MessagesEn_ca.php
index 5067935e..af3c5ae5 100644
--- a/languages/messages/MessagesEn_ca.php
+++ b/languages/messages/MessagesEn_ca.php
@@ -8,23 +8,10 @@
* @file
*
* @author Dantman
- * @author FrigidNinja
- * @author Shirayuki
* @author Techman224
*/
$messages = array(
-'talkpagelinktext' => 'Talk',
-'talk' => 'Discussion',
-
-# 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}}',
-'mainpage' => 'Main Page',
-
-'editsection' => 'edit',
-'editsectionhint' => 'Edit section: $1',
-'red-link-title' => '$1 (page does not exist)',
-
# Special:UploadStash
'uploadstash-summary' => 'This page provides access to files which are uploaded (or in process of uploading) but are not yet published to the wiki. These files are not visible to anyone but the user who uploaded them.',
@@ -33,20 +20,10 @@ $messages = array(
this action has been cancelled as a precaution against session hijacking.
Go back to the previous page, reload that page and then try again.',
-# Block/unblock
-'ipbreason-dropdown' => '*Common block reasons
-** Inserting false information
-** Removing content from pages
-** Spamming links to external sites
-** Inserting nonsense/gibberish into pages
-** Intimidating behaviour/harassment
-** Abusing multiple accounts
-** Unacceptable username',
-
# EXIF tags
'exif-ycbcrcoefficients' => 'Colour space transformation matrix coefficients',
-'exif-colorspace' => 'Colour space',
-'exif-licenseurl' => 'URL for copyright licence',
+'exif-colorspace' => 'Colour space',
+'exif-licenseurl' => 'URL for copyright licence',
'exif-subjectdistance-value' => '$1 metres',
@@ -70,11 +47,11 @@ Go back to the previous page, reload that page and then try again.',
'exif-ycbcrpositioning-1' => 'Centred',
-# Email address confirmation
-'confirmemail_invalidated' => 'Email address confirmation cancelled',
+# E-mail address confirmation
+'confirmemail_invalidated' => 'E-mail address confirmation cancelled',
# Special:Version
-'version-license' => 'Licence',
+'version-license' => 'Licence',
'version-license-info' => 'MediaWiki is free software; you can redistribute it and/or modify it under the terms of the GNU General Public Licence as published by the Free Software Foundation; either version 2 of the Licence, 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 Licence for more details.
diff --git a/languages/messages/MessagesEn_gb.php b/languages/messages/MessagesEn_gb.php
index 1429a54e..c38fd296 100644
--- a/languages/messages/MessagesEn_gb.php
+++ b/languages/messages/MessagesEn_gb.php
@@ -7,14 +7,11 @@
* @ingroup Language
* @file
*
- * @author Amire80
* @author Dantman
* @author Fitoschido
* @author Hazard-SJ
* @author Jon Harald Søby
- * @author Lloffiwr
* @author Reedy
- * @author Shirayuki
* @author The Evil IP address
*/
@@ -27,10 +24,10 @@ $specialPageAliases = array(
$messages = array(
# User preference toggles
-'tog-watchcreations' => 'Add pages I create and files I upload to my watchlist',
-'tog-watchdefault' => 'Add pages and files I edit to my watchlist',
-'tog-watchmoves' => 'Add pages and files I move to my watchlist',
-'tog-watchdeletion' => 'Add pages and files I delete to my watchlist',
+'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',
+'tog-watchdeletion' => 'Add pages I delete to my watchlist',
'tog-showjumplinks' => 'Enable ‘jump to’ accessibility links',
# Categories related messages
@@ -45,9 +42,9 @@ $messages = array(
'dberrortext' => 'A database query syntax error has occurred.
This may indicate a bug in the software.
The last attempted database query was:
-<blockquote><code>$1</code></blockquote>
-from within function ‘<code>$2</code>.’
-Database returned error ‘<samp>$3: $4</samp>.’',
+<blockquote><tt>$1</tt></blockquote>
+from within function ‘<tt>$2</tt>.’
+Database returned error ‘<tt>$3: $4</tt>.’',
'dberrortextcl' => 'A database query syntax error has occurred.
The last attempted database query was:
‘$1’
@@ -70,17 +67,9 @@ Please report this to an [[Special:ListUsers/sysop|administrator]], making note
'unexpected' => 'Unexpected value: ‘$1’=‘$2’.',
'cannotdelete' => 'The page or file ‘$1’ could not be deleted.
It may have already been deleted by someone else.',
-'protectedinterface' => 'This page provides interface text for the software on this wiki, and is protected to prevent abuse.
-To add or change translations for all wikis, please use [//translatewiki.net/ translatewiki.net], the MediaWiki localisation project.',
-'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 on this wiki.
-To add or change translations for all wikis, please use [//translatewiki.net/ translatewiki.net], the MediaWiki localisation project.",
'cascadeprotected' => 'This page has been protected from editing, because it is included in the following {{PLURAL:$1|page, which is|pages, which are}} protected with the ‘cascading’ option turned on:
$2',
-# Preferences page
-'prefs-i18n' => 'Internationalisation',
-
# Miscellaneous special pages
'uncategorizedpages' => 'Uncategorised pages',
'uncategorizedcategories' => 'Uncategorised categories',
@@ -96,24 +85,6 @@ Go back to the previous page, reload that page and then try again.',
'blockiptext' => 'Use the form below to block write access from a specific IP address or username.
This should be done only to prevent vandalism, and in accordance with [[{{MediaWiki:Policy-url}}|policy]].
Fill in a specific reason below (for example, citing particular pages that were vandalised).',
-'ipbreason-dropdown' => '*Common block reasons
-** Inserting false information
-** Removing content from pages
-** Spamming links to external sites
-** Inserting nonsense/gibberish into pages
-** Intimidating behaviour/harassment
-** Abusing multiple accounts
-** Unacceptable username',
-'proxyblockreason' => 'Your IP address has been blocked because it is an open proxy.
-Please contact your Internet service provider or technical support of your organisation and inform them of this serious security problem.',
-
-# Namespace 8 related
-'allmessagestext' => 'This is a list of system messages available in the MediaWiki namespace.
-Please visit [//www.mediawiki.org/wiki/Localisation MediaWiki Localisation] and [//translatewiki.net translatewiki.net] if you wish to contribute to the generic MediaWiki localisation.',
-'allmessages-filter' => 'Filter by customisation state:',
-
-# Special:Import
-'import-error-unserialize' => 'Revision $2 of page "$1" could not be unserialised. The revision was reported to use content model $3 serialised as $4.',
# Metadata
'metadata-help' => 'This file contains additional information, probably added from the digital camera or scanner used to create or digitise it.
@@ -125,7 +96,6 @@ If the file has been modified from its original state, some details may not full
'exif-datetimedigitized' => 'Date and time of digitising',
'exif-subsectimedigitized' => 'DateTimeDigitised subseconds',
'exif-exposureprogram' => 'Exposure programme',
-'exif-organisationinimage' => 'Organisation depicted',
'exif-exposureprogram-2' => 'Normal programme',
'exif-exposureprogram-5' => 'Creative programme (biased toward depth of field)',
@@ -133,8 +103,6 @@ If the file has been modified from its original state, some details may not full
'exif-subjectdistance-value' => '$1 metres',
-'exif-meteringmode-2' => 'Centre weighted average',
-
'exif-sensingmethod-2' => 'One-chip colour area sensor',
'exif-sensingmethod-3' => 'Two-chip colour area sensor',
'exif-sensingmethod-4' => 'Three-chip colour area sensor',
@@ -151,22 +119,14 @@ If the file has been modified from its original state, some details may not full
# Pseudotags used for GPSDestDistanceRef
'exif-gpsdestdistance-k' => 'Kilometres',
-'exif-ycbcrpositioning-1' => 'Centred',
-
-'exif-iimcategory-lab' => 'Labour',
-
-# Email address confirmation
+# E-mail address confirmation
'confirmemail_invalidated' => 'E-mail address confirmation cancelled',
# Special:Version
-'version-credits-summary' => 'We would like to recognise the following persons for their contribution to [[Special:Version|MediaWiki]].',
'version-license-info' => 'MediaWiki is free software; you can redistribute it and/or modify it under the terms of the GNU General Public Licence as published by the Free Software Foundation; either version 2 of the Licence, 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 Licence for more details.
You should have received [{{SERVER}}{{SCRIPTPATH}}/COPYING a copy of the GNU General Public Licence] along with this program; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA or [//www.gnu.org/licenses/old-licenses/gpl-2.0.html read it online].',
-# Feedback
-'feedback-error1' => 'Error: Unrecognised result from API',
-
);
diff --git a/languages/messages/MessagesEo.php b/languages/messages/MessagesEo.php
index bd77a006..2144c401 100644
--- a/languages/messages/MessagesEo.php
+++ b/languages/messages/MessagesEo.php
@@ -29,6 +29,7 @@
* @author Michawiki
* @author Mihxil
* @author MinuteElectron
+ * @author Nemo bis
* @author Objectivesea
* @author Omnipaedista
* @author Pedroca cerebral
@@ -80,11 +81,17 @@ $namespaceAliases = array(
'Kategoria_diskuto' => NS_CATEGORY_TALK,
);
+$namespaceGenderAliases = array(
+ NS_USER => array( 'male' => 'Uzanto', 'female' => 'Uzantino' ),
+ NS_USER_TALK => array( 'male' => 'Uzanto-Diskuto', 'female' => 'Uzantino-Diskuto' ),
+);
+
$specialPageAliases = array(
'Activeusers' => array( 'Aktivaj_uzantoj' ),
'Allmessages' => array( 'Ĉiuj_mesaÄoj' ),
'Allpages' => array( 'Ĉiuj_paÄoj' ),
'Ancientpages' => array( 'Malnovaj_paÄoj' ),
+ 'Badtitle' => array( 'Malbona_titolo' ),
'Blankpage' => array( 'Malplena_paÄo' ),
'Block' => array( 'Forbari_IP-adreson' ),
'Blockme' => array( 'Forbari_min' ),
@@ -93,7 +100,7 @@ $specialPageAliases = array(
'Categories' => array( 'Kategorioj' ),
'ChangeEmail' => array( 'ÅœanÄi_retpoÅton' ),
'ChangePassword' => array( 'ÅœanÄi_pasvorton' ),
- 'ComparePages' => array( 'Komparu_paÄojn' ),
+ 'ComparePages' => array( 'Kompari_paÄojn', 'Komparu_paÄojn' ),
'Confirmemail' => array( 'Konfirmi_per_retpoÅto' ),
'Contributions' => array( 'Kontribuoj' ),
'CreateAccount' => array( 'Krei_konton' ),
@@ -101,27 +108,27 @@ $specialPageAliases = array(
'DeletedContributions' => array( 'Forigitaj_kontribuoj' ),
'Disambiguations' => array( 'Apartigiloj' ),
'DoubleRedirects' => array( 'Duoblaj_alidirektiloj' ),
- 'EditWatchlist' => array( 'Redakti_atenatron' ),
+ 'EditWatchlist' => array( 'Redakti_atentaron' ),
'Emailuser' => array( 'RetpoÅti_uzanton' ),
- 'Export' => array( 'Eksporti' ),
+ 'Export' => array( 'Elporti', 'Eksporti' ),
'Fewestrevisions' => array( 'Plej_malmultaj_revizioj' ),
'FileDuplicateSearch' => array( 'Serĉi_pri_duoblaj_dosieroj' ),
- 'Filepath' => array( 'Dosiero-pado' ),
- 'Import' => array( 'Importi' ),
+ 'Filepath' => array( 'Pado_de_dosiero', 'Dosiero-pado' ),
+ 'Import' => array( 'Enporti', 'Importi' ),
'Invalidateemail' => array( 'Malvalidigi_retpoÅton' ),
'BlockList' => array( 'Forbarlisto_de_IP-adresoj', 'IP-adresa_forbarlisto' ),
'LinkSearch' => array( 'Serĉi_ligilon' ),
'Listadmins' => array( 'Listigi_administrantojn' ),
'Listbots' => array( 'Listigi_robotojn' ),
- 'Listfiles' => array( 'Bildolisto' ),
+ 'Listfiles' => array( 'Listigi_dosierojn', 'Listigi_bildojn', 'Bildolisto' ),
'Listgrouprights' => array( 'Gruprajtoj_de_uzantoj' ),
- 'Listredirects' => array( 'Listigi_alidirektojn' ),
+ 'Listredirects' => array( 'Listigi_alidirektilojn', 'Listigi_alidirektojn' ),
'Listusers' => array( 'Listo_de_uzantoj' ),
'Lockdb' => array( 'Åœlosi_datumbazon' ),
'Log' => array( 'Protokolo', 'Protokoloj' ),
'Lonelypages' => array( 'Neligitaj_paÄoj' ),
'Longpages' => array( 'Longaj_paÄoj' ),
- 'MergeHistory' => array( 'Kunigi_historion' ),
+ 'MergeHistory' => array( 'Unuigi_kronologion', 'Kunigi_kronologion', 'Kunigi_historion' ),
'MIMEsearch' => array( 'MIME-Serĉo' ),
'Mostcategories' => array( 'Plej_multaj_kategorioj' ),
'Mostimages' => array( 'Plej_ligitaj_bildoj' ),
@@ -131,7 +138,7 @@ $specialPageAliases = array(
'Mostrevisions' => array( 'Plej_multaj_revizioj' ),
'Movepage' => array( 'Alinomigi_paÄon' ),
'Mycontributions' => array( 'Miaj_kontribuoj', 'MiajKontribuoj' ),
- 'Mypage' => array( 'MiaPaÄo', 'Mia_paÄo' ),
+ 'Mypage' => array( 'Mia_paÄo', 'MiaPaÄo' ),
'Mytalk' => array( 'Mia_diskutpaÄo', 'MiaDiskutpaÄo' ),
'Myuploads' => array( 'Miaj_alÅutaĵoj' ),
'Newimages' => array( 'Novaj_bildoj' ),
@@ -144,7 +151,7 @@ $specialPageAliases = array(
'Protectedpages' => array( 'Protektitaj_paÄoj' ),
'Protectedtitles' => array( 'Protektitaj_titoloj' ),
'Randompage' => array( 'Hazarda_paÄo' ),
- 'Randomredirect' => array( 'Hazarda_alidirekto' ),
+ 'Randomredirect' => array( 'Hazarda_alidirektilo', 'Hazarda_alidirekto' ),
'Recentchanges' => array( 'Lastaj_ÅanÄoj' ),
'Recentchangeslinked' => array( 'Rilataj_ÅanÄoj' ),
'Revisiondelete' => array( 'Forigi_revizion' ),
@@ -179,7 +186,7 @@ $specialPageAliases = array(
);
$magicWords = array(
- 'redirect' => array( '0', '#ALIDIREKTU', '#ALIDIREKTI', '#AL', '#REDIRECT' ),
+ 'redirect' => array( '0', '#ALIDIREKTI', '#ALIDIREKTU', '#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__' ),
@@ -218,6 +225,7 @@ $magicWords = array(
'pagenamee' => array( '1', 'PAÄœONOMOO', 'PAGXONOMOO', 'PAÄœNOMOO', 'PAGXNOMOO', 'PAGENAMEE' ),
'namespace' => array( '1', 'NOMSPACO', 'NAMESPACE' ),
'namespacee' => array( '1', 'NOMSPACOO', 'NAMESPACEE' ),
+ 'namespacenumber' => array( '1', 'NUMERODENOMSPACO', 'NOMSPACNUMERO', 'NAMESPACENUMBER' ),
'talkspace' => array( '1', 'DISKUTNOMSPACO', 'TALKSPACE' ),
'talkspacee' => array( '1', 'DISKUTNOMSPACOO', 'TALKSPACEE' ),
'fullpagename' => array( '1', 'TUTAPAÄœONOMO', 'TUTAPAGXONOMO', 'TUTAPAÄœNOMO', 'TUTAPAGXNOMO', 'FULLPAGENAME' ),
@@ -253,12 +261,14 @@ $magicWords = array(
'img_text_bottom' => array( '1', 'suba-teksto', 'text-bottom' ),
'img_link' => array( '1', 'ligilo=$1', 'link=$1' ),
'img_alt' => array( '1', 'alternative=$1', 'alt=$1' ),
+ 'img_class' => array( '1', 'klaso=$1', 'class=$1' ),
'int' => array( '0', 'ENE:', 'INT:' ),
'sitename' => array( '1', 'TTT-NOMO', 'RETPAÄœNOMO', 'RETPAGXNOMO', 'RETEJNOMO', 'SITENAME' ),
'nse' => array( '0', 'NSS:', 'NSO:', 'NSE:' ),
'localurl' => array( '0', 'LOKATTT:', 'LOCALURL:' ),
'localurle' => array( '0', 'LOKATTTT:', 'LOCALURLE:' ),
'articlepath' => array( '0', 'ARTIKOLAPADO', 'ARTIKOLAVOJO', 'ARTICLEPATH' ),
+ 'pageid' => array( '0', 'IDENTIGILODEPAÄœO', 'PAÄœID', 'PAGEID' ),
'server' => array( '0', 'SERVILO', 'SERVER' ),
'servername' => array( '0', 'NOMODESERVILO', 'SERVILANOMO', 'SERVILONOMO', 'SERVERNAME' ),
'scriptpath' => array( '0', 'SKRIPTO-VOJO', 'SKRIPTOVOJO', 'SKRIPTVOJO', 'SCRIPTPATH' ),
@@ -344,10 +354,6 @@ $messages = array(
'tog-shownumberswatching' => 'Montri la nombron da priatentaj uzantoj',
'tog-oldsig' => 'Ekzistanta subskribo:',
'tog-fancysig' => 'Trakti subskribon kiel vikitekston (sen aÅ­tomata ligo)',
-'tog-externaleditor' => 'Defaŭlte uzi eksteran tekstprilaborilon (nur por ekspertoj, ĉar tio necesigas specialajn agordojn en via komputilo. [//www.mediawiki.org/wiki/Manual:External_editors Pliaj informoj.])',
-'tog-externaldiff' => 'DefaÅ­lte uzi eksteran ÅanÄmontrilon (nur por ekspertoj, ĉar tio necesigas specialajn agordojn en via komputilo. [//www.mediawiki.org/wiki/Manual:External_editors Pliaj informoj.])',
-'tog-showjumplinks' => 'Ebligi alirligojn "salti al"
-<!-- Bonvolu kontroli ĉu Äustas la traduko de : Enable "jump to" accessibility links -->',
'tog-uselivepreview' => 'Uzi tujan antaÅ­rigardon (per ÄœavaSkripto) (Eksperimenta)',
'tog-forceeditsummary' => 'Averti min kiam mi konservas malplenan redaktoresumon',
'tog-watchlisthideown' => 'KaÅi miajn redaktojn de la atentaro',
@@ -360,6 +366,7 @@ $messages = array(
'tog-diffonly' => 'Ne montri paÄan enhavon sub la ÅanÄoj',
'tog-showhiddencats' => 'Montri kaÅitajn kategoriojn',
'tog-norollbackdiff' => 'Preterlasi ÅanÄoelmontron post malfaro',
+'tog-useeditwarning' => 'Averti min kiam mi forlasas redaktan paÄon kun nekonservitaj ÅanÄoj',
'underline-always' => 'Ĉiam',
'underline-never' => 'Neniam',
@@ -423,6 +430,18 @@ $messages = array(
'oct' => 'Okt',
'nov' => 'Nov',
'dec' => 'Dec',
+'january-date' => '$1-a de januaro',
+'february-date' => '$1-a de februaro',
+'march-date' => '$1-a de marto',
+'april-date' => '$1-a de aprilo',
+'may-date' => '$1-a de majo',
+'june-date' => '$1-a de junio',
+'july-date' => '$1-a de julio',
+'august-date' => '$1-a de aÅ­gusto',
+'september-date' => '$1-a de septembro',
+'october-date' => '$1-a de oktobro',
+'november-date' => '$1-a de novembro',
+'december-date' => '$1-a de decembro',
# Categories related messages
'pagecategories' => '{{PLURAL:$1|Kategorio|Kategorioj}}',
@@ -504,6 +523,7 @@ $messages = array(
'create-this-page' => 'Krei ĉi tiun paÄon',
'delete' => 'Forigi',
'deletethispage' => 'Forigi ĉi tiun paÄon',
+'undeletethispage' => 'Restarigi tiun ĉi paÄon',
'undelete_short' => 'Malforigi {{PLURAL:$1|redakton|$1 redaktojn}}',
'viewdeleted_short' => 'Vidi {{PLURAL:$1|unu forigitan redakton|$1 forigitajn redaktojn}}',
'protect' => 'Protekti',
@@ -547,7 +567,7 @@ $1',
'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).
+# 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).
'aboutsite' => 'Pri {{SITENAME}}',
'aboutpage' => 'Project:Enkonduko',
'copyright' => 'La enhavo estas disponebla laÅ­ $1.',
@@ -557,7 +577,6 @@ $1',
'disclaimers' => 'Malgarantio',
'disclaimerpage' => 'Project:Malgarantia paÄo',
'edithelp' => 'Helpo pri redaktado',
-'edithelppage' => 'Help:Kiel redakti paÄon',
'helppage' => 'Help:Enhavo',
'mainpage' => 'ĈefpaÄo',
'mainpage-description' => 'ĈefpaÄo',
@@ -634,17 +653,6 @@ Listo de validaj specialaj paÄoj estas trovebla ĉe [[Special:SpecialPages|{{in
# General errors
'error' => 'Eraro',
'databaseerror' => 'Datumbaza eraro',
-'dberrortext' => 'Sintakseraro okazis dum informpeto al la datenbazo.
-Ĝi eble indikas misaĵeton en la programaro.
-Jen la plej laste provita informpeto:
-<blockquote><code>$1</code></blockquote>
-el la funkcio "<code>$2</code>".
-La datenbazo liveris eraron "<samp>$3: $4</samp>".',
-'dberrortextcl' => 'Sintaksa eraro de la datumbaza informmendo okazis.
-La lasta provita datumbaza informmendo estis:
-"$1"
-el la funkcio "$2".
-Datumbazo liveris la erarmesaÄon "$3: $4".',
'laggedslavemode' => 'Avertu: la paÄo eble ne enhavas lastatempajn Äisdatigojn.',
'readonly' => 'Datumaro Ålosita, nurlega',
'enterlockreason' => 'Bonvolu klarigi, kial oni Ålosas la datumaron, kaj
@@ -702,12 +710,13 @@ Peto: $2',
'protectedinterface' => 'Ĉi tiu paÄo provizas interfacan tekston por la softvaro, kaj estas Ålosita por malebligi misuzon.
Por aldoni aÅ­ ÅanÄi tradukojn por ĉiuj vikioj, bonvolu uzi [//translatewiki.net/ translatewiki.net], la projekto por provizi tradukojn por MediaWiki.',
'editinginterface' => "'''Atentu:''' Vi redaktas paÄon, kiu estas uzata kiel interfaca teksto por la programaro. ÅœanÄoj de ĉi tiu teksto povas ÅanÄi aspekton de la interfaco por aliaj uzantoj sur ĉi tiu vikio. Por aldoni aÅ­ ÅanÄi tradukojn, bonvolu uzi [//translatewiki.net/ translatewiki.net], la MediaWiki-projekton por lingvigaj versioj.",
-'sqlhidden' => '(SQL serĉomendo kaÅita)',
'cascadeprotected' => 'Ĉi tiu paÄo estas protektita kontraÅ­ redaktado, ĉar Äi estas inkludita en la {{PLURAL:$1|sekvan paÄon, kiu|sekvajn paÄojn, kiuj}} estas {{PLURAL:$1|protektata|protektataj}} kun la "kaskada" opcio turnita sur:
$2',
'namespaceprotected' => "Vi ne rajtas redakti paÄojn en la '''$1''' nomspaco.",
'customcssprotected' => 'Vi ne rajtas redakti ĉi tiun CSS-paÄon, ĉar Äi enhavas personajn alÄustigojn de alia uzanto.',
'customjsprotected' => 'Vi ne rajtas redakti ĉi tiun JavaScript-paÄon, ĉar Äi enhavas personajn alÄustigojn de alia uzanto.',
+'mycustomcssprotected' => 'Vi ne havas la rajton redakti tiun ĉi CSS-paÄon.',
+'mycustomjsprotected' => 'Vi ne havas la rajton redakti tiun ĉi JavaScript-paÄon.',
'ns-specialprotected' => 'PaÄoj en la {{ns:special}} nomspaco ne povas esti redaktataj.',
'titleprotected' => "Ĉi titolo estas protektita de kreado de [[User:$1|$1]].
La kialo donata estis ''$2''.",
@@ -733,10 +742,16 @@ Notu ke iuj paÄoj daÅ­re Åajnos kvazaÅ­ vi ankoraÅ­ estus ensalutinta, Äis vi
'welcomecreation-msg' => 'Via konto estas kreita.
Ne forgesu ÅanÄi viajn [[Special:Preferences|{{SITENAME}}-preferojn]]',
'yourname' => 'Salutnomo:',
+'userlogin-yourname' => 'Uzantonomo',
+'userlogin-yourname-ph' => 'Enigu vian uzantonomon',
'yourpassword' => 'Pasvorto:',
+'userlogin-yourpassword' => 'Pasvorto',
+'userlogin-yourpassword-ph' => 'Enigu vian pasvorton',
'yourpasswordagain' => 'Retajpu pasvorton',
+'createacct-yourpasswordagain' => 'Konfirmu 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',
+'userlogin-remembermypassword' => 'Memoru mian ensaluton',
+'userlogin-signwithsecure' => 'Uzu sekurigitan konekton',
'yourdomainname' => 'Via domajno',
'password-change-forbidden' => 'Ve ne povas ÅanÄi pasvortojn en ĉi tiu vikio.',
'externaldberror' => 'AÅ­ estis datenbaza eraro rilate al ekstera aÅ­tentikigado, aÅ­ vi ne rajtas Äisdatigi vian eksteran konton.',
@@ -748,14 +763,34 @@ Ne forgesu ÅanÄi viajn [[Special:Preferences|{{SITENAME}}-preferojn]]',
'logout' => 'Elsaluti',
'userlogout' => 'Elsaluti',
'notloggedin' => 'Ne ensalutinta',
+'userlogin-noaccount' => 'Ĉu vi ne havas konton?',
+'userlogin-joinproject' => 'AliÄu al {{SITENAME}}',
'nologin' => 'Ĉu vi ne havas konton? $1.',
'nologinlink' => 'Krei konton',
'createaccount' => 'Krei novan konton',
'gotaccount' => "Ĉu vi jam havas konton? '''$1'''.",
'gotaccountlink' => 'Ensaluti',
'userlogin-resetlink' => 'Ĉu vi forgesis ensalutajn detalojn?',
+'userlogin-resetpassword-link' => 'Restarigu vian pasvorton',
+'helplogin-url' => 'Help:Ensalutado',
+'userlogin-helplink' => '[[{{MediaWiki:helplogin-url}}|Helpo pri ensalutado]]',
+'createacct-join' => 'Suben enigu informojn pri vi',
+'createacct-emailrequired' => 'RetpoÅta adreso',
+'createacct-emailoptional' => 'RetpoÅta adreso (nedeviga)',
+'createacct-email-ph' => 'Enigu vian retpoÅtan adreson',
'createaccountmail' => 'Uzi provizoran hazardsignan pasvorton kaj sendi Äin al la retpoÅto suben',
+'createacct-realname' => 'Vera nomo (nedeviga)',
'createaccountreason' => 'Kialo:',
+'createacct-reason' => 'Kialo',
+'createacct-reason-ph' => 'Kial vi kreas plian konton',
+'createacct-captcha' => 'Sekureca kontrolo',
+'createacct-imgcaptcha-ph' => 'Entajpu la supran tekston',
+'createacct-submit' => 'Krei konton',
+'createacct-another-submit' => 'Krei alian konton',
+'createacct-benefit-heading' => '{{SITENAME}} estas kreata de homoj kiel vi.',
+'createacct-benefit-body1' => '{{PLURAL:$1|redakto|redaktoj}}',
+'createacct-benefit-body2' => '{{PLURAL:$1|paÄo|paÄoj}}',
+'createacct-benefit-body3' => '{{PLURAL:$1|lasta kontribuanto|lastaj kontribuantoj}}',
'badretype' => 'La pasvortojn kiujn vi tajpis ne egalas.',
'userexists' => 'Salutnomo enigita jam estas uzata.
Bonvolu elekti alian nomon.',
@@ -817,7 +852,7 @@ Enigi bone formatita adreso aÅ­ malplenigi tiun kampon.',
Vi povas ignori ĉi mesaÄon, se ĉi konto estis kreita erare.',
'usernamehasherror' => 'Salutnomo ne povas enhavi kriphaketaĵajn signojn',
-'login-throttled' => 'Vi tro ofte provis eniri la pasvorton por ĉi tiu konto.
+'login-throttled' => 'Vi tro ofte provis ensaluti.
Bonvolu Äisatendi antaÅ­ retrovi.',
'login-abort-generic' => 'Via ensaluto malsukcesis - Ĉesigita',
'loginlanguagelabel' => 'Lingvo: $1',
@@ -837,7 +872,7 @@ Bonvolu Äisatendi antaÅ­ retrovi.',
'newpassword' => 'Nova pasvorto',
'retypenew' => 'Retajpi novan pasvorton',
'resetpass_submit' => 'Fari pasvorton kaj ensaluti',
-'resetpass_success' => 'Via pasvorto estis ÅanÄita sukcese! Nun vi estos ensalutata.',
+'changepassword-success' => 'Via pasvorto estis sukcese ÅanÄita! Nun ensalutanta vin...',
'resetpass_forbidden' => 'Pasvortoj ne estas ÅanÄeblaj',
'resetpass-no-info' => 'Vi devas ensaluti por atingi ĉi tiun paÄon rekte.',
'resetpass-submit-loggedin' => 'ÅœanÄi pasvorton',
@@ -849,10 +884,9 @@ Vi eble jam ÅanÄis vian pasvorton aÅ­ petis novan provizoran pasvorton.',
# Special:PasswordReset
'passwordreset' => 'Restarigo de pasvorto',
-'passwordreset-text' => 'Plenigu ĉi tiun formularon por renovigi vian pasvorton.',
'passwordreset-legend' => 'Refari pasvorton',
'passwordreset-disabled' => 'Pasvortaj restarigoj estis malÅaltitaj en ĉi tiu vikio.',
-'passwordreset-pretext' => '{{PLURAL:$1||Enigi unu el la jenaj datenoj}}',
+'passwordreset-emaildisabled' => 'RetpoÅtaj funkcioj estas malfunkciigitaj en tiu ĉi vikio.',
'passwordreset-username' => 'Salutnomo:',
'passwordreset-domain' => 'Domajno:',
'passwordreset-capture' => 'Vidi la rezultan retpoÅton?',
@@ -881,7 +915,7 @@ aÅ­ se vi memoris vian originalan pasvorton, kaj vi ne plu volas ÅanÄi
Provizora pasvorto: $2',
'passwordreset-emailsent' => 'Renovigita pasvorto estis retpoÅte sendita.',
'passwordreset-emailsent-capture' => 'RetpoÅto kun renovigita pasvorto estis sendita, kiu estas montrata sube.',
-'passwordreset-emailerror-capture' => 'Memoriga retpoÅto estis generita, montrata sube, sed sendado al uzanto malsukcesis: $1',
+'passwordreset-emailerror-capture' => 'RetpoÅto kun renovigita pasvorto estis generita, montrata sube, sed sendado al uzanto malsukcesis: $1',
# Special:ChangeEmail
'changeemail' => 'ÅœanÄi retpoÅtadreson',
@@ -1094,12 +1128,15 @@ Jen la protokolo pri forigado kaj alinomigado por via referenco.',
VerÅajne Äi estis forigita.',
'edit-conflict' => 'Redakto-konflikto.',
'edit-no-change' => 'Via redakto estis ignorita, ĉar neniu ÅanÄo estis farita al la teksto.',
+'postedit-confirmation' => 'Via redakto estis konservita.',
'edit-already-exists' => 'Ne eblis krei novan paÄon.
Äœi jam ekzistas.',
'defaultmessagetext' => 'DefaÅ­lta teksto',
'content-failed-to-parse' => 'Oni malsukcesis analizi $2-entenon laÅ­ la $1-modelo: $3',
'invalid-content-data' => 'Enhavo estas malvalida',
'content-not-allowed-here' => 'Enhavo de $1 ne estas permesita en paÄo [[$2]]',
+'editwarning-warning' => 'Forlasante ĉi tiun paÄon kaÅ­zos al vi perdi iun ajn ÅanÄojn kiujn vi faris.
+Se vi ensalutas, vi povas malÅalti ĉi tiun averton en la sekcio "{{int:prefs-editing}}" de viaj preferoj.',
# Content models
'content-model-wikitext' => 'vikiteksto',
@@ -1313,6 +1350,7 @@ Certigu ke ĉi tiu ÅanÄo tenos kontinuecon de la historia paÄo.',
'compareselectedversions' => 'Kompari la elektitajn versiojn',
'showhideselectedversions' => 'Montri/kaÅi elektitajn versiojn',
'editundo' => 'malfari',
+'diff-empty' => '(Neniu diferenco)',
'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}}.)',
'difference-missing-revision' => '{{PLURAL:$2|Unu revizio|$2 revizioj}} de ĉi tiu malsameco ($1) ne {{PLURAL:$2|estis|estis}} trovebla.
@@ -1340,7 +1378,6 @@ Detaloj troveblos en la [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}
'searchmenu-legend' => 'Serĉaj opcioj',
'searchmenu-exists' => "'''Estas paÄo nomita \"[[:\$1]]\" en ĉi tiu vikio'''",
'searchmenu-new' => "'''Krei la paÄon \"[[:\$1]]\" en ĉi tiu vikio!'''",
-'searchhelp-url' => 'Help:Enhavo',
'searchmenu-prefix' => '[[Special:PrefixIndex/$1|Traserĉi paÄojn kun ĉi tiu prefikso]]',
'searchprofile-articles' => 'Enhavaj paÄoj',
'searchprofile-project' => 'PaÄoj pri Helpo kaj Projektoj',
@@ -1383,15 +1420,7 @@ Provu prefiksi vian mendon kun ''all:'' por serĉi ĉiun enhavon (inkluzivante d
'search-external' => 'Ekstera serĉo',
'searchdisabled' => '<p>Oni provizore malÅaltis serĉadon per la plenteksta
indekso pro troÅarÄita servilo. Intertempe, vi povas serĉi per <i>guglo</i> aÅ­ per <i>jahu!</i>:</p>',
-
-# Quickbar
-'qbsettings' => 'Preferoj pri ilaro',
-'qbsettings-none' => 'Neniu',
-'qbsettings-fixedleft' => 'FiksiÄas maldekstre',
-'qbsettings-fixedright' => 'FiksiÄas dekstre',
-'qbsettings-floatingleft' => 'Åœvebas maldekstre',
-'qbsettings-floatingright' => 'Åœvebas dekstre',
-'qbsettings-directionality' => 'Fiksita, laÅ­ la teksto-direkteco de via lingvo',
+'search-error' => 'Okazis eraro dum serĉado: $1',
# Preferences page
'preferences' => 'Preferoj',
@@ -1425,7 +1454,6 @@ indekso pro troÅarÄita servilo. Intertempe, vi povas serĉi per <i>guglo</i> a
'resetprefs' => 'ForviÅi nekonservitajn ÅanÄojn',
'restoreprefs' => 'Restarigi ĉiujn defaŭltajn preferojn',
'prefs-editing' => 'Redaktado',
-'prefs-edit-boxsize' => 'Grandeco de la redakto-kesko.',
'rows' => 'Linioj:',
'columns' => 'Kolumnoj:',
'searchresultshead' => 'Serĉi',
@@ -1436,9 +1464,6 @@ indekso pro troÅarÄita servilo. Intertempe, vi povas serĉi per <i>guglo</i> a
'recentchangesdays-max' => '(maksimume $1 {{PLURAL:$1|tago|tagoj}})',
'recentchangescount' => 'Nombro de redaktoj por montri defaÅ­lte:',
'prefs-help-recentchangescount' => 'Ĉi tiu inkluzivas lastajn ÅanÄojn, paÄajn historiojn, kaj protokolojn.',
-'prefs-help-watchlist-token' => 'Plenigo de ĉi tiu kampo kun sekreta Ålosilo generos RSS-fonton por via atentaro.
-Iu kiu konas la Ålosilon en ĉi tiu kampo povos legi vian atentaron, do bonvolu elekti sekuran valoron.
-Jen hazarde generita valoro por via uzo: $1',
'savedprefs' => 'Viaj preferoj estas konservitaj.',
'timezonelegend' => 'Horzono:',
'localtime' => 'Loka tempo:',
@@ -1469,7 +1494,6 @@ Jen hazarde generita valoro por via uzo: $1',
'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:',
-'prefs-textboxsize' => 'Grandeco de redakta fenestro',
'youremail' => 'Retadreso:',
'username' => '{{GENDER:$1|Salutnomo}}:',
'uid' => '{{GENDER:$1|Uzanto}}-identaĵo:',
@@ -1500,6 +1524,8 @@ Jen hazarde generita valoro por via uzo: $1',
'prefs-dateformat' => 'Data formato',
'prefs-timeoffset' => 'Tempa deÅovo',
'prefs-advancedediting' => 'Äœeneralaj opcioj',
+'prefs-editor' => 'Redaktilo',
+'prefs-preview' => 'AntaÅ­rigardo',
'prefs-advancedrc' => 'Progresaj opcioj',
'prefs-advancedrendering' => 'Progresaj opcioj',
'prefs-advancedsearchoptions' => 'Progresaj opcioj',
@@ -1507,6 +1533,7 @@ Jen hazarde generita valoro por via uzo: $1',
'prefs-displayrc' => 'Montraj opcioj',
'prefs-displaysearchoptions' => 'Montraj opcioj',
'prefs-displaywatchlist' => 'Montraj opcioj',
+'prefs-tokenwatchlist' => 'Ä´etono',
'prefs-diffs' => 'Diferencoj',
# User preference: email validation using jQuery
@@ -1604,6 +1631,9 @@ Jen hazarde generita valoro por via uzo: $1',
'right-editusercssjs' => 'Redaktu CSS- kaj JS-dosierojn de aliaj uzantoj',
'right-editusercss' => 'Redaktu CSS-dosierojn de aliaj uzantoj',
'right-edituserjs' => 'Redaktu JS-dosierojn de aliaj uzantoj',
+'right-editmyusercss' => 'Redakti viajn proprajn CSS-dosierojn',
+'right-editmyuserjs' => 'Redakti viajn proprajn JavaScript-dosierojn',
+'right-viewmywatchlist' => 'Rigardi vian atentaron',
'right-rollback' => 'Tuj malfari la redaktojn de la lasta uzanto kiu redaktis specifan paÄon',
'right-markbotedits' => 'Marki restarigitajn redaktojn kiel robotajn redaktojn',
'right-noratelimit' => 'Ne influita de po-limoj',
@@ -1707,7 +1737,6 @@ Jen hazarde generita valoro por via uzo: $1',
'recentchangeslinked-feed' => 'Rilataj paÄoj',
'recentchangeslinked-toolbox' => 'Rilataj paÄoj',
'recentchangeslinked-title' => 'ÅœanÄoj rilataj al "$1"',
-'recentchangeslinked-noresult' => 'Neniuj ÅanÄoj en ligitaj paÄoj dum la donata periodo.',
'recentchangeslinked-summary' => "Jen listo de ÅanÄoj faritaj lastatempe al paÄoj ligitaj el specifa paÄo (aÅ­ al membroj de specifa kategorio).
PaÄoj en [[Special:Watchlist|via atentaro]] estas '''grasaj'''.",
'recentchangeslinked-page' => 'Nomo de paÄo:',
@@ -1719,7 +1748,7 @@ PaÄoj en [[Special:Watchlist|via atentaro]] estas '''grasaj'''.",
'reuploaddesc' => 'Reveni al la alÅuta formularo.',
'upload-tryagain' => 'Enigi ÅanÄitan dosieran priskribon',
'uploadnologin' => 'Ne ensalutinta',
-'uploadnologintext' => 'Se vi volas alÅuti dosierojn, vi devas [[Special:UserLogin|ensaluti]].',
+'uploadnologintext' => 'Vi devas [[Special:UserLogin|ensaluti]] por alÅuti dosierojn.',
'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',
@@ -1933,7 +1962,6 @@ Por optimuma sekureco, img_auth.php estas malÅalta.',
'http-read-error' => 'HTTP-legeraro.',
'http-timed-out' => 'HTTP-peto eltempiÄis.',
'http-curl-error' => 'Eraro venigante URL-on: $1',
-'http-host-unreachable' => 'URL-o ne estis atingebla.',
'http-bad-status' => 'Estis problemo dum la HTTP-peto: $1 $2',
# Some likely curl errors. More could be added from <http://curl.haxx.se/libcurl/c/libcurl-errors.html>
@@ -2082,12 +2110,6 @@ Bonvolu kontroli aliajn ligilojn al la Åablonoj antaÅ­ ol forigi ilin.',
'statistics-users-active-desc' => 'Uzantoj kiuj faris agon en la {{PLURAL:$1|lasta tago|lastaj $1 tagoj}}',
'statistics-mostpopular' => 'Plej ofte montrataj paÄoj',
-'disambiguations' => 'PaÄoj ligitaj al apartigiloj',
-'disambiguationspage' => 'Template:Apartigilo',
-'disambiguations-text' => "La jenaj paÄoj alligas '''apartigilon'''.
-Ili devus anstataÅ­e alligi la Äustan temon.<br />
-PaÄo estas traktata kiel apartigilo se Äi uzas Åablonon kiu estas ligita de [[MediaWiki:Disambiguationspage]]",
-
'pageswithprop' => 'PaÄoj kun paÄa atributo',
'pageswithprop-legend' => 'PaÄoj kun paÄa atributo',
'pageswithprop-prop' => 'Nomo de la atributo:',
@@ -2340,10 +2362,9 @@ La retadreso kiun vi enigis en [[Special:Preferences|viaj preferoj]] aperos kiel
'unwatchthispage' => 'Malatenti paÄon',
'notanarticle' => 'Ne estas artikolo',
'notvisiblerev' => 'Versio estis forigita',
-'watchnochange' => 'Neniu artikolo en via atentaro redaktiÄis dum la prispektita tempoperiodo.',
'watchlist-details' => '{{PLURAL:$1|$1 paÄon|$1 paÄojn}} en via atentaro, krom diskutpaÄoj.',
-'wlheader-enotif' => '* RetpoÅta sciigo estas ebligita',
-'wlheader-showupdated' => "* MontriÄas per '''dikaj literoj''' tiuj paÄoj, kiujn oni ÅanÄis ekde kiam vi laste vizitis ilin",
+'wlheader-enotif' => 'RetpoÅta sciigo estas ebligita',
+'wlheader-showupdated' => "MontriÄas per '''dikaj literoj''' tiuj paÄoj, kiujn oni ÅanÄis ekde kiam vi laste vizitis ilin",
'watchmethod-recent' => 'traserĉas lastajn redaktojn',
'watchmethod-list' => 'traserĉas priatentitajn',
'watchlistcontains' => 'Via atentaro enhavas $1 {{PLURAL:$1|paÄon|paÄojn}}.',
@@ -2743,11 +2764,8 @@ La kialo donita por la forbaro de $1 estis: "$2"',
'ipb_blocked_as_range' => 'Eraro: La IP-adreso $1 ne estas forbarita rekte kaj ne povas esti malforbarita. Tamen Äi estas forbarita kiel parto de la intervalo $2, kiu ne povas esti malforbarita.',
'ip_range_invalid' => 'Malvalida IP-adresa intervalo.',
'ip_range_toolarge' => 'IP-adresaj intervaloj pli grandaj ol /$1 estas malpermesataj.',
-'blockme' => 'Forbari min',
'proxyblocker' => 'Forbarilo por prokuriloj.',
-'proxyblocker-disabled' => 'Ĉi tiu funkcio estas malÅaltita.',
'proxyblockreason' => 'Via IP-adreso estis forbarita ĉar Äi estas malferma prokurilo. Bonvolu kontakti vian provizanto de retservo aÅ­ komputika helpisto kaj informu ilin de ĉi serioza problemo pri sekureco.',
-'proxyblocksuccess' => 'Farita.',
'sorbsreason' => 'Via IP-adreso estas listigita kiel malferma prokurilo en la DNSBL uzata de {{SITENAME}}.',
'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.',
@@ -3068,17 +3086,11 @@ Datoj de versioj kaj nomoj de redaktantoj estos preservitaj.
# Stylesheets
'common.css' => '/* La jena CSS influos la aspekton de ĉiaj temoj. */',
-'standard.css' => '/* La jena CSS influos la paÄaspekton por uzantoj de la Klasika temo. */',
-'nostalgia.css' => '/* La jena CSS influos la paÄaspekton por uzantoj de la Nostalgia temo. */',
'cologneblue.css' => '/* La jena CSS influos la paÄaspekton por uzantoj de la Kolonja Blua temo. */',
'monobook.css' => '/* La jena CSS influos la paÄaspekton por uzantoj de la Libreja temo. */',
-'myskin.css' => '/* La jena CSS influos la paÄaspekton por uzantoj de la MiÅela temo. */',
-'chick.css' => '/* La jena CSS influos la paÄaspekton por uzantoj de la Kokida temo. */',
-'simple.css' => '/* La jena CSS influos la paÄaspekton por uzantoj de la Simpla temo. */',
'modern.css' => '/* La jena CSS influos la paÄaspekton por uzantoj de la Moderna temo. */',
'vector.css' => '/* La jena CSS influos la paÄaspekton por uzantoj de la Vektora temo. */',
'print.css' => '/* La jena CSS influos la prezentadon de la presaĵo. */',
-'handheld.css' => '/* La jena CSS influos manpremitajn komputilojn sur bazo de la temo kiu arangiÄis en $wgHandheldStyle. */',
'noscript.css' => '/* La jena CSS influos uzantojn, kiuj desebligis Äœavaskripton. */',
'group-autoconfirmed.css' => '/* La jena CSS sole influos auxtokonfirmatajn uzantojn. */',
'group-bot.css' => '/* La jena CSS sole influos robotojn. */',
@@ -3087,13 +3099,8 @@ Datoj de versioj kaj nomoj de redaktantoj estos preservitaj.
# Scripts
'common.js' => '/* La jena Äœavaskripto ÅargiÄos por ĉiaj uzantoj ĉe ĉiu paÄoÅargado. */',
-'standard.js' => '/* La jena Äœavaskripto ÅargiÄos por uzantoj de la Klasika temo. */',
-'nostalgia.js' => '/* La jena Äœavaskripto ÅargiÄos por uzantoj de la Nostalgia temo. */',
'cologneblue.js' => '/* La jena Äœavaskripto ÅargiÄos por uzantoj de la Kolonja Blua temo. */',
'monobook.js' => '/* La jena Äœavaskripto ÅargiÄos por uzantoj de la Libreja temo. */',
-'myskin.js' => '/* La jena Äœavaskripto ÅargiÄos por uzantoj de la MiÅela temo. */',
-'chick.js' => '/* La jena Äœavaskripto ÅargiÄos por uzantoj de la Kokida temo. */',
-'simple.js' => '/* La jena Äœavaskripto ÅargiÄos por uzantoj de la Simpla temo. */',
'modern.js' => '/* La jena Äœavaskripto ÅargiÄos por uzantoj de la Moderna temo. */',
'vector.js' => '/* La jena Äœavaskripto ÅargiÄos por uzantoj de la Vektora temo. */',
'group-autoconfirmed.js' => '/* La jena Äœavaskripto sole ÅargiÄos por auxtokonfirmataj uzantoj. */',
@@ -3172,13 +3179,8 @@ Datoj de versioj kaj nomoj de redaktantoj estos preservitaj.
'pageinfo-category-files' => 'Nombro de dosieroj',
# Skin names
-'skinname-standard' => 'Klasiko',
-'skinname-nostalgia' => 'Nostalgio',
'skinname-cologneblue' => 'Kolonja Bluo',
'skinname-monobook' => 'Librejo',
-'skinname-myskin' => 'MiÅelo',
-'skinname-chick' => 'Kokido',
-'skinname-simple' => 'Simplo',
'skinname-modern' => 'Moderno',
'skinname-vector' => 'Vektoro',
@@ -3256,11 +3258,17 @@ $1',
'minutes' => '{{PLURAL:$1|$1 minuto|$1 minutoj}}',
'hours' => '{{PLURAL:$1|$1 horo|$1 horoj}}',
'days' => '{{PLURAL:$1|$1 tago|$1 tagoj}}',
+'weeks' => '{{PLURAL:$1|$1 semajno|$1 semajnoj}}',
'months' => '{{PLURAL:$1|$1 monato|$1 monatoj}}',
'years' => '{{PLURAL:$1|$1 jaro|$1 jaroj}}',
'ago' => 'antaÅ­ $1',
'just-now' => 'ĵus nune',
+# Human-readable timestamps
+'hours-ago' => 'antaÅ­ $1 {{PLURAL:$1|horo|horoj}}',
+'minutes-ago' => 'antaÅ­ $1 {{PLURAL:$1|minuto|minutoj}}',
+'seconds-ago' => 'antaÅ­ $1 {{PLURAL:$1|sekundo|sekundoj}}',
+
# Bad image list
'bad_image_list' => 'La formato estas jen:
@@ -3289,7 +3297,7 @@ Aliaj estos kaÅitaj defaÅ­lte.
* gpslongitude
* gpsaltitude',
-# EXIF tags
+# Exif tags
'exif-imagewidth' => 'LarÄeco',
'exif-imagelength' => 'Alteco',
'exif-bitspersample' => 'Bitokoj en komponanto',
@@ -3467,7 +3475,7 @@ Aliaj estos kaÅitaj defaÅ­lte.
'exif-originalimageheight' => 'Alto de bildo antaÅ­ stuco',
'exif-originalimagewidth' => 'LarÄo de bildo antaÅ­ stuco',
-# EXIF attributes
+# Exif attributes
'exif-compression-1' => 'Nedensigita',
'exif-compression-2' => 'CCITT-Grupo 3 modifita ciferado laÅ­ Huffman Dimensio-1',
'exif-compression-3' => 'CCITT Grupo-3 ĉifrado por faksilo',
@@ -3914,7 +3922,6 @@ Vi povas ankaÅ­ [[Special:EditWatchlist|redakti norme]].',
'version-other' => 'Alia',
'version-mediahandlers' => 'Mediaj traktiloj',
'version-hooks' => 'Hokoj',
-'version-extension-functions' => 'Kromprogramaj funkcioj',
'version-parser-extensiontags' => 'Sintaksaj etend-etikedoj',
'version-parser-function-hooks' => 'Hokoj de sintaksaj funkcioj',
'version-hook-name' => 'Nomo de hoko',
@@ -3936,13 +3943,6 @@ Oni devis doni al vi [{{SERVER}}{{SCRIPTPATH}}/COPYING ekzempleron de la GNU Gen
'version-entrypoints-header-entrypoint' => 'Eniropunkto',
'version-entrypoints-header-url' => 'Retadreso',
-# Special:FilePath
-'filepath' => 'Vojo al dosiero',
-'filepath-page' => 'Dosiero:',
-'filepath-submit' => 'Vojo',
-'filepath-summary' => 'Ĉi tiu speciala paÄo liveras kompletan vojon al dosiero.
-Bildoj montriÄas en plena distingivo, aliaj dosiertipoj estas malfermataj rekte per ties asociita programo.',
-
# Special:FileDuplicateSearch
'fileduplicatesearch' => 'Serĉu duplikatajn dosierojn',
'fileduplicatesearch-summary' => 'Serĉi duplikatajn dosierojn bazite de haketvaloro.',
@@ -4032,6 +4032,8 @@ Bildoj montriÄas en plena distingivo, aliaj dosiertipoj estas malfermataj rekte
'htmlform-submit' => 'Ek!',
'htmlform-reset' => 'Malfari ÅanÄojn',
'htmlform-selectorother-other' => 'Alia',
+'htmlform-no' => 'Ne',
+'htmlform-yes' => 'Jes',
# SQLite database support
'sqlite-has-fts' => '$1 kun tut-teksta subteno',
diff --git a/languages/messages/MessagesEs.php b/languages/messages/MessagesEs.php
index d435f980..05f68047 100644
--- a/languages/messages/MessagesEs.php
+++ b/languages/messages/MessagesEs.php
@@ -60,6 +60,7 @@
* @author Lin linao
* @author Linterweb
* @author Locos epraix
+ * @author Luckas
* @author Luis Felipe Schenone
* @author Mahadeva
* @author Manuelt15
@@ -70,10 +71,12 @@
* @author Muro de Aguas
* @author Omnipaedista
* @author Orgullomoore
+ * @author Ovruni
* @author Paucabot
* @author Penarc
* @author PerroVerd
* @author Pertile
+ * @author Pginer
* @author Piolinfax
* @author Platonides
* @author PoLuX124
@@ -144,10 +147,10 @@ $specialPageAliases = array(
'Booksources' => array( 'FuentesDeLibros', 'Fuentes_de_libros' ),
'BrokenRedirects' => array( 'RedireccionesRotas', 'Redirecciones_rotas' ),
'Categories' => array( 'Categorías' ),
- 'ChangeEmail' => array( 'CambiarEmail', 'CambiarCorreo' ),
+ 'ChangeEmail' => array( 'Cambiar_correo_electrónico', 'CambiarEmail', 'CambiarCorreo' ),
'ChangePassword' => array( 'Cambiar_contraseña', 'CambiarContraseña', 'ResetearContraseña', 'Resetear_contraseña' ),
- 'ComparePages' => array( 'CompararPáginas' ),
- 'Confirmemail' => array( 'ConfirmarEmail', 'Confirmar_correo_electrónico' ),
+ 'ComparePages' => array( 'Comparar_páginas', 'CompararPáginas' ),
+ 'Confirmemail' => array( 'Confirmar_correo_electrónico', 'ConfirmarEmail' ),
'Contributions' => array( 'Contribuciones' ),
'CreateAccount' => array( 'Crear_una_cuenta', 'CrearCuenta' ),
'Deadendpages' => array( 'PáginasSinSalida', 'Páginas_sin_salida' ),
@@ -155,7 +158,7 @@ $specialPageAliases = array(
'Disambiguations' => array( 'Desambiguaciones', 'Desambiguación' ),
'DoubleRedirects' => array( 'RedireccionesDobles', 'Redirecciones_dobles' ),
'EditWatchlist' => array( 'EditarSeguimiento' ),
- 'Emailuser' => array( 'MandarEmailUsuario' ),
+ 'Emailuser' => array( 'Enviar_correo_electrónico', 'MandarEmailUsuario' ),
'Export' => array( 'Exportar' ),
'Fewestrevisions' => array( 'MenosEdiciones', 'Menos_ediciones' ),
'FileDuplicateSearch' => array( 'BuscarArchivosDuplicados', 'Buscar_archivos_duplicados' ),
@@ -401,9 +404,6 @@ $messages = array(
'tog-shownumberswatching' => 'Mostrar el número de usuarios que la vigilan',
'tog-oldsig' => 'Firma actual:',
'tog-fancysig' => 'Tratar la firma como wikitexto (sin un enlace automático)',
-'tog-externaleditor' => 'Utilizar editor externo por defecto (sólo para expertos: son necesarios ajustes especiales en la computadora; [//www.mediawiki.org/wiki/Manual:External_editors más información])',
-'tog-externaldiff' => "Utilizar ''diferencia'' externa por defecto (sólo para expertos: son necesarios ajustes especiales en la computadora; [//www.mediawiki.org/wiki/Manual:External_editors más información])",
-'tog-showjumplinks' => 'Habilitar los enlaces de accesibilidad «saltar a»',
'tog-uselivepreview' => 'Usar previsualización en vivo (requiere JavaScript) (experimental)',
'tog-forceeditsummary' => 'Avisarme cuando grabe la página sin introducir un resumen de edición',
'tog-watchlisthideown' => 'Ocultar mis ediciones en la lista de seguimiento',
@@ -417,6 +417,8 @@ $messages = array(
'tog-showhiddencats' => 'Mostrar las categorías escondidas',
'tog-noconvertlink' => 'Desactivar la conversión de título de enlace',
'tog-norollbackdiff' => "Omitir la ''diferencia'' después de revertir",
+'tog-useeditwarning' => 'Advertirme cuando abandone una página editada con cambios sin grabar',
+'tog-prefershttps' => 'Utiliza una conexión segura siempre que haya iniciado una sesión',
'underline-always' => 'Siempre',
'underline-never' => 'Nunca',
@@ -480,6 +482,18 @@ $messages = array(
'oct' => 'oct',
'nov' => 'nov',
'dec' => 'dic',
+'january-date' => '$1 de enero',
+'february-date' => '$1 de febrero',
+'march-date' => '$1 de marzo',
+'april-date' => '$1 de abril',
+'may-date' => '$1 de mayo',
+'june-date' => '$1 de junio',
+'july-date' => '$1 de julio',
+'august-date' => '$1 de agosto',
+'september-date' => '$1 de septiembre',
+'october-date' => '$1 de octubre',
+'november-date' => '$1 de noviembre',
+'december-date' => '$1 de diciembre',
# Categories related messages
'pagecategories' => '{{PLURAL:$1|Categoría|Categorías}}',
@@ -561,6 +575,7 @@ $messages = array(
'create-this-page' => 'Crear esta página',
'delete' => 'Borrar',
'deletethispage' => 'Borrar esta página',
+'undeletethispage' => 'Restaurar esta página',
'undelete_short' => 'Restaurar {{PLURAL:$1|una edición|$1 ediciones}}',
'viewdeleted_short' => 'Ver {{PLURAL:$1|una edición borrada|$1 ediciones borradas}}',
'protect' => 'Proteger',
@@ -604,7 +619,7 @@ $1',
'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).
+# 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).
'aboutsite' => 'Acerca de {{SITENAME}}',
'aboutpage' => 'Project:Acerca de',
'copyright' => 'El contenido está disponible bajo $1 a menos que se indique lo contrario.',
@@ -614,7 +629,6 @@ $1',
'disclaimers' => 'Aviso legal',
'disclaimerpage' => 'Project:Limitación general de responsabilidad',
'edithelp' => 'Ayuda de edición',
-'edithelppage' => 'Help:Cómo se edita una página',
'helppage' => 'Help:Contenidos',
'mainpage' => 'Página principal',
'mainpage-description' => 'Página principal',
@@ -690,17 +704,12 @@ Puedes ver una lista de las páginas especiales en [[Special:SpecialPages|{{int:
# General errors
'error' => 'Error',
'databaseerror' => 'Error de la base de datos',
-'dberrortext' => 'Ha ocurrido un error de sintaxis en una consulta a la base de datos.
-Esto puede indicar un error en el software.
-La última consulta a la base de datos que se intentó fue:
-<blockquote><code>$1</code></blockquote>
-dentro de la función "<code>$2</code>".
-La base de datos devolvió el error "<samp>$3: $4</samp>".',
-'dberrortextcl' => 'Ha ocurrido un error de sintaxis en una consulta a la base de datos.
-La última consulta a la base de datos que se intentó fue:
-«$1»
-desde la función «$2».
-Base de datos retornó error «$3: $4».',
+'databaseerror-text' => 'Se ha producido un error en la base de datos.
+Esto puede indicar un bug en el software.',
+'databaseerror-textcl' => 'Se ha producido un error en la base de datos.',
+'databaseerror-query' => 'Consulta: $1',
+'databaseerror-function' => 'Función: $1',
+'databaseerror-error' => 'Error: $1',
'laggedslavemode' => "'''Aviso:''' puede que falten las actualizaciones más recientes en esta página.",
'readonly' => 'Base de datos bloqueada',
'enterlockreason' => 'Explique el motivo del bloqueo, incluyendo una estimación de cuándo se producirá el desbloqueo',
@@ -734,6 +743,7 @@ Por favor, avisa a un [[Special:ListUsers/sysop|administrador]], tomando nota de
Puede que ya haya sido borrado por alguien más.',
'cannotdelete-title' => 'No se puede borrar la página «$1»',
'delete-hook-aborted' => 'La modificación que intentaste hacer fue cancelada por un gancho de extensión. No hay explicación disponible.',
+'no-null-revision' => 'No se pudo crear la nueva revisión nula para la página "$1"',
'badtitle' => 'Título incorrecto',
'badtitletext' => 'El título de la página solicitada está vacío, no es válido, o es un enlace interidioma o interwiki incorrecto.
Puede que contenga uno o más caracteres que no se pueden usar en los títulos.',
@@ -755,12 +765,15 @@ Para agregar o cambiar las traducciones para todos los wikis, por favor, usa [//
'editinginterface' => "'''Aviso:''' Estás editando una página usada para proporcionar el texto de la interfaz para el software.
Los cambios en esta página afectarán a la apariencia de la interfaz para los demás usuarios de este wiki.
Para añadir o cambiar las traducciones, por favor considera usar [//translatewiki.net/ translatewiki.net], el proyecto de localización de MediaWiki.",
-'sqlhidden' => '(Consulta SQL oculta)',
'cascadeprotected' => 'Esta página ha sido protegida para su edición, porque está incluida en {{PLURAL:$1|la siguiente página|las siguientes páginas}}, que están protegidas con la opción de «cascada»:
$2',
'namespaceprotected' => "No tienes permiso para editar las páginas del espacio de nombres '''$1'''.",
'customcssprotected' => 'No tienes permiso para editar esta página CSS, porque contiene configuraciones personales de otro usuario.',
'customjsprotected' => 'No tienes permiso para editar esta página JavaScript, porque contiene configuraciones personales de otro usuario.',
+'mycustomcssprotected' => 'No tienes permiso para editar esta página CSS.',
+'mycustomjsprotected' => 'No tienes permiso para editar esta página JavaScript.',
+'myprivateinfoprotected' => 'No tienes permiso para editar tu información privada.',
+'mypreferencesprotected' => 'No tienes permiso para editar tus preferencias.',
'ns-specialprotected' => 'Las páginas especiales no se pueden editar',
'titleprotected' => 'Esta página ha sido protegida contra creación por [[User:$1|$1]].
El motivo dado fue: "\'\'$2\'\'".',
@@ -783,10 +796,19 @@ Tenga en cuenta que algunas páginas pueden continuar mostrándose como si todav
'welcomecreation-msg' => 'Se ha creado tu cuenta.
No olvides personalizar tus [[Special:Preferences|preferencias de {{SITENAME}}]].',
'yourname' => 'Nombre de usuario:',
+'userlogin-yourname' => 'Usuario',
+'userlogin-yourname-ph' => 'Escribe tu nombre de usuario',
+'createacct-another-username-ph' => 'Ingrese el nombre de usuario',
'yourpassword' => 'Contraseña:',
+'userlogin-yourpassword' => 'Contraseña',
+'userlogin-yourpassword-ph' => 'Escribe tu contraseña',
+'createacct-yourpassword-ph' => 'Escribe una contraseña',
'yourpasswordagain' => 'Confirma la contraseña:',
+'createacct-yourpasswordagain' => 'Confirma la contraseña',
+'createacct-yourpasswordagain-ph' => 'Repite la contraseña',
'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',
+'userlogin-remembermypassword' => 'Mantener mi sesión iniciada',
+'userlogin-signwithsecure' => 'Usar conexión segura',
'yourdomainname' => 'Dominio',
'password-change-forbidden' => 'No puedes cambiar las contraseñas de este wiki.',
'externaldberror' => 'Hubo un error de autenticación externa de la base de datos o bien no tienes autorización para actualizar tu cuenta externa.',
@@ -798,18 +820,44 @@ No olvides personalizar tus [[Special:Preferences|preferencias de {{SITENAME}}]]
'logout' => 'Cerrar sesión',
'userlogout' => 'Cerrar sesión',
'notloggedin' => 'No has iniciado sesión',
+'userlogin-noaccount' => '¿No tienes una cuenta?',
+'userlogin-joinproject' => 'Únete a {{SITENAME}}',
'nologin' => '¿No tienes una cuenta? $1.',
'nologinlink' => 'Crear una cuenta',
'createaccount' => 'Crear una cuenta',
'gotaccount' => '¿Ya tienes una cuenta? $1.',
'gotaccountlink' => 'Entrar',
'userlogin-resetlink' => '¿Olvidaste tus datos de acceso?',
+'userlogin-resetpassword-link' => 'Restablecer la contraseña',
+'helplogin-url' => 'Help:Inicio de sesión',
+'userlogin-helplink' => '[[{{MediaWiki:helplogin-url}}|Ayuda]]',
+'userlogin-loggedin' => 'Ya estás conectado como {{GENDER:$1|$1}}.
+Usa el formulario de abajo para iniciar sesión como otro usuario.',
+'userlogin-createanother' => 'Crear otra cuenta',
+'createacct-join' => 'Introduce tus datos debajo.',
+'createacct-another-join' => 'Introduzca la información de la nueva cuenta a continuación.',
+'createacct-emailrequired' => 'Dirección de correo electrónico',
+'createacct-emailoptional' => 'Dirección de correo electrónico (opcional)',
+'createacct-email-ph' => 'Escribe tu dirección de correo electrónico',
+'createacct-another-email-ph' => 'Introduzca la dirección de correo electrónico',
'createaccountmail' => 'Utilizar una contraseña aleatoria temporal y enviarla a la dirección de correo electrónico especificada',
+'createacct-realname' => 'Nombre real (opcional)',
'createaccountreason' => 'Motivo:',
+'createacct-reason' => 'Motivo',
+'createacct-reason-ph' => 'Por qué estás creando otra cuenta',
+'createacct-captcha' => 'Comprobación de seguridad',
+'createacct-imgcaptcha-ph' => 'Escribe el texto de arriba',
+'createacct-submit' => 'Crea tu cuenta',
+'createacct-another-submit' => 'Crear otra cuenta',
+'createacct-benefit-heading' => '{{SITENAME}} lo construye gente como tú.',
+'createacct-benefit-body1' => '{{PLURAL:$1|edición|ediciones}}',
+'createacct-benefit-body2' => '{{PLURAL:$1|página|páginas}}',
+'createacct-benefit-body3' => '{{PLURAL:$1|colaborador reciente|colaboradores recientes}}',
'badretype' => 'Las contraseñas no coinciden.',
'userexists' => 'El nombre de usuario indicado ya está en uso.
Por favor escoge un nombre diferente.',
'loginerror' => 'Error de inicio de sesión',
+'createacct-error' => 'Error al crear la cuenta',
'createaccounterror' => 'No se pudo crear la cuenta: $1',
'nocookiesnew' => 'La cuenta de usuario ha sido creada, pero no has iniciado sesión.
{{SITENAME}} usa <em>cookies</em> para identificar a los usuarios registrados.
@@ -870,10 +918,12 @@ La contraseña asignada automáticamente es «$3». Por favor entra ahora y camb
Puedes ignorar este mensaje si esta cuenta fue creada por error.',
'usernamehasherror' => 'El nombre de usuario no puede contener símbolos de almohadilla/numeral',
-'login-throttled' => 'Has intentado demasiadas veces iniciar sesión. Por favor espera antes de intentarlo nuevamente.',
+'login-throttled' => 'Has intentado demasiadas veces iniciar sesión. Por favor espera $1 antes de intentarlo nuevamente.',
'login-abort-generic' => 'Tu inicio de sesión no fue exitoso - Cancelado',
'loginlanguagelabel' => 'Idioma: $1',
'suspicious-userlogout' => 'Tu solicitud de desconexión ha sido denegada, pues parece haber sido enviada desde un navegador defectuoso o un proxy caché.',
+'createacct-another-realname-tip' => 'El nombre Real es opcional.
+Si elige proporcionarlo, se usará para dar al usuario la atribución de su trabajo.',
# Email sending
'php-mail-error-unknown' => 'Error desconocido en la función mail() de PHP.',
@@ -890,8 +940,7 @@ Por favor, introduce una nueva contraseña aquí:',
'newpassword' => 'Contraseña nueva:',
'retypenew' => 'Confirmar la contraseña nueva:',
'resetpass_submit' => 'Establecer contraseña e iniciar sesión',
-'resetpass_success' => '¡Tu contraseña se ha cambiado con éxito!
-Iniciando sesión...',
+'changepassword-success' => 'La contraseña ha sido cambiada con éxito.',
'resetpass_forbidden' => 'No se pueden cambiar las contraseñas',
'resetpass-no-info' => 'Debes iniciar sesión para acceder directamente a esta página.',
'resetpass-submit-loggedin' => 'Cambiar contraseña',
@@ -903,10 +952,11 @@ Puede que ya hayas cambiado la contraseña o que hayas pedido una temporal.',
# Special:PasswordReset
'passwordreset' => 'Restablecimiento de contraseña',
-'passwordreset-text' => 'Completa este formulario para restablecer la contraseña.',
+'passwordreset-text-one' => 'Completa este formulario para restablecer tu contraseña.',
+'passwordreset-text-many' => '{{PLURAL:$1|Completa uno de los campos para restablecer tu contraseña.}}',
'passwordreset-legend' => 'Restablecer contraseña',
'passwordreset-disabled' => 'Se ha desactivado el restablecimiento de contraseñas en este wiki.',
-'passwordreset-pretext' => '{{PLURAL:$1||Introduce uno de los elementos de datos siguientes}}',
+'passwordreset-emaildisabled' => 'Las funciones de correo electrónico han sido desactivadas en esta wiki.',
'passwordreset-username' => 'Nombre de usuario:',
'passwordreset-domain' => 'Dominio:',
'passwordreset-capture' => '¿Ver el mensaje resultante?',
@@ -935,7 +985,7 @@ ignorar este mensaje y continuar usando tu contraseña anterior.',
Contraseña temporal: $2',
'passwordreset-emailsent' => 'Se ha enviado un correo electrónico para el restablecimiento de tu contraseña.',
'passwordreset-emailsent-capture' => 'Se ha enviado un correo para el restablecimiento de la contraseña, el cual se muestra a continuación.',
-'passwordreset-emailerror-capture' => 'Un recordatorio por correo electrónico fue generado, que se muestra a continuación, pero el envío al usuario falló: $1',
+'passwordreset-emailerror-capture' => 'Se generó un correo electrónico de restablecimiento de contraseña, que se muestra a continuación, pero el envío {{GENDER:$2|al usuario|a la usuaria}} falló. $1',
# Special:ChangeEmail
'changeemail' => 'Cambiar la dirección de correo electrónico',
@@ -949,6 +999,19 @@ Contraseña temporal: $2',
'changeemail-submit' => 'Cambiar correo electrónico',
'changeemail-cancel' => 'Cancelar',
+# Special:ResetTokens
+'resettokens' => 'Restablecer claves',
+'resettokens-text' => 'Puede restablecer las claves que permiten el acceso a ciertos datos privados asociados a tu cuenta aquí.
+
+Deberías hacerlo si accidentalmente la has compartido con alguien o si su cuenta ha sido comprometida.',
+'resettokens-no-tokens' => 'No hay claves para restablecer.',
+'resettokens-legend' => 'Restablecer claves',
+'resettokens-tokens' => 'Claves:',
+'resettokens-token-label' => '$1 (valor actual: $2)',
+'resettokens-watchlist-token' => 'Clave para la lista de seguimiento (RSS/Atom) de los [[Special:Watchlist|cambios a las páginas en tu lista de seguimiento]]',
+'resettokens-done' => 'Restablecimiento de claves.',
+'resettokens-resetbutton' => 'Restablecer las claves',
+
# Edit page toolbar
'bold_sample' => 'Texto en negrita',
'bold_tip' => 'Texto en negrita',
@@ -1144,12 +1207,15 @@ No se aportaron explicaciones.',
Parece que ha sido borrada.',
'edit-conflict' => 'Conflicto de edición.',
'edit-no-change' => 'Se ignoró tu revisión, porque no se hizo ningún cambio al texto.',
+'postedit-confirmation' => 'Se ha guardado tu edición.',
'edit-already-exists' => 'No se pudo crear una página nueva.
Ya existe.',
'defaultmessagetext' => 'Texto de mensaje predeterminado',
'content-failed-to-parse' => 'No se pudo analizar el contenido $2 del modelo $1: $3',
'invalid-content-data' => 'Datos de contenido inválidos',
'content-not-allowed-here' => 'El contenido "$1" no está permitido en la página [[$2]]',
+'editwarning-warning' => 'Si abandonas esta página perderás tus cambios.
+Si estás identificado, puedes deshabilitar esta advertencia en la sección "Edición" de tus preferencias.',
# Content models
'content-model-wikitext' => 'texto wiki',
@@ -1184,6 +1250,7 @@ Ese o esos parámetros han sido omitidos.',
'undo-failure' => 'No se puede deshacer la edición ya que otro usuario ha realizado una edición intermedia.',
'undo-norev' => 'La edición no puede ser deshecha porque no existe o ha sido borrada.',
'undo-summary' => 'Deshecha la revisión $1 de [[Special:Contributions/$2|$2]] ([[User talk:$2|disc.]])',
+'undo-summary-username-hidden' => 'Deshacer revisión $1 por usuario oculto',
# Account creation failure
'cantcreateaccounttitle' => 'No se puede crear la cuenta',
@@ -1365,6 +1432,7 @@ Nota que usar los enlaces de navegación borrará las selecciones de esta column
'compareselectedversions' => 'Comparar versiones seleccionadas',
'showhideselectedversions' => 'Mostrar/ocultar versiones seleccionadas',
'editundo' => 'deshacer',
+'diff-empty' => '(Sin diferencias)',
'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}})',
'difference-missing-revision' => 'No {{PLURAL:$2|se ha encontrado|se han encontrado}} {{PLURAL:$2|una revisión|$2 revisiones}} de esta diferencia ($1).
@@ -1392,7 +1460,6 @@ Los detalles pueden encontrarse en el [{{fullurl:{{#Special:Log}}/delete|page={{
'searchmenu-legend' => 'Opciones de búsqueda',
'searchmenu-exists' => "'''Hay una página llamada \"[[:\$1]]\" en esta wiki.'''",
'searchmenu-new' => "'''¡Crea la página «[[:$1]]» en este wiki!'''",
-'searchhelp-url' => 'Help:Ayuda',
'searchmenu-prefix' => '[[Special:PrefixIndex/$1|Otras páginas con este prefijo]]',
'searchprofile-articles' => 'Páginas de contenido',
'searchprofile-project' => 'Páginas de ayuda y de proyecto',
@@ -1435,15 +1502,7 @@ Prueba a usar el prefijo ''all:'' para buscar en todo el contenido (incluyendo p
'search-external' => 'Búsqueda externa',
'searchdisabled' => 'Las búsquedas en {{SITENAME}} están temporalmente desactivadas.
Mientras tanto puedes buscar mediante Google, pero ten en cuenta que sus índices relativos a {{SITENAME}} pueden estar desactualizados.',
-
-# Quickbar
-'qbsettings' => 'Quickbar',
-'qbsettings-none' => 'Ninguna',
-'qbsettings-fixedleft' => 'Fija a la izquierda',
-'qbsettings-fixedright' => 'Fija a la derecha',
-'qbsettings-floatingleft' => 'Flotante a la izquierda',
-'qbsettings-floatingright' => 'Flotante a la derecha',
-'qbsettings-directionality' => 'Fijos, dependiendo de la direccionalidad de la escritura de su idioma',
+'search-error' => 'Ha ocurrido un error al buscar: $1',
# Preferences page
'preferences' => 'Preferencias',
@@ -1477,7 +1536,6 @@ Mientras tanto puedes buscar mediante Google, pero ten en cuenta que sus índice
'resetprefs' => 'Limpiar cambios sin guardar',
'restoreprefs' => 'Restaurar la configuración predeterminada',
'prefs-editing' => 'Edición',
-'prefs-edit-boxsize' => 'Tamaño de la ventana de edición.',
'rows' => 'Filas:',
'columns' => 'Columnas:',
'searchresultshead' => 'Búsquedas',
@@ -1488,8 +1546,9 @@ Mientras tanto puedes buscar mediante Google, pero ten en cuenta que sus índice
'recentchangesdays-max' => '(máximo {{PLURAL:$1|un día|$1 días}})',
'recentchangescount' => 'Número de ediciones a mostrar de manera predeterminada:',
'prefs-help-recentchangescount' => 'Esto incluye cambios recientes, historiales de página, y registros.',
-'prefs-help-watchlist-token' => 'Rellenar este campo con una clave secreta generará un canal RSS para tu lista de seguimiento.
-Cualquiera que conozca la clave en este campo será capaz de leer tu lista de seguimiento, así que escoge un valor seguro. Aquí hay un valor generado aleatoriamente que puedes usar: $1',
+'prefs-help-watchlist-token2' => 'Esta es la clave secreta para el canal de contenido web de tu lista de seguimiento.
+Cualquier persona que la conozca podría leer tu lista, así que no la compartas.
+[[Special:ResetTokens|Pulsa aquí si necesitas restablecerla]].',
'savedprefs' => 'Tus preferencias han sido guardadas.',
'timezonelegend' => 'Zona horaria:',
'localtime' => 'Hora local:',
@@ -1520,7 +1579,6 @@ Cualquiera que conozca la clave en este campo será capaz de leer tu lista de se
'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:',
-'prefs-textboxsize' => 'Tamaño de la página de edición',
'youremail' => 'Correo electrónico:',
'username' => '{{GENDER:$1|Nombre de usuario|Nombre de usuaria}}:',
'uid' => 'ID de {{GENDER:$1|usuario|usuaria}}:',
@@ -1552,6 +1610,8 @@ Tu dirección de correo no se revela cuando otros usuarios te contactan.',
'prefs-dateformat' => 'Formato de fecha',
'prefs-timeoffset' => 'Diferencia horaria',
'prefs-advancedediting' => 'Opciones generales',
+'prefs-editor' => 'Editor',
+'prefs-preview' => 'Previsualización',
'prefs-advancedrc' => 'Opciones avanzadas',
'prefs-advancedrendering' => 'Opciones avanzadas',
'prefs-advancedsearchoptions' => 'Opciones avanzadas',
@@ -1559,7 +1619,9 @@ Tu dirección de correo no se revela cuando otros usuarios te contactan.',
'prefs-displayrc' => 'Opciones de mostrado',
'prefs-displaysearchoptions' => 'Opciones de visualización',
'prefs-displaywatchlist' => 'Opciones de visualización',
+'prefs-tokenwatchlist' => 'Clave',
'prefs-diffs' => 'Diferencias',
+'prefs-help-prefershttps' => 'Esta preferencia tendrá efecto en tu próximo inicio de sesión.',
# User preference: email validation using jQuery
'email-address-validity-valid' => 'La dirección de correo electrónico parece ser válida',
@@ -1586,6 +1648,8 @@ Tu dirección de correo no se revela cuando otros usuarios te contactan.',
'userrights-notallowed' => 'No tienes permiso para agregar o quitar derechos de usuario.',
'userrights-changeable-col' => 'Grupos que puedes cambiar',
'userrights-unchangeable-col' => 'Grupos que no puedes cambiar',
+'userrights-conflict' => '¡Conflicto de cambio de los derechos de usuario! Por favor, revisar y confirmar tus cambios.',
+'userrights-removed-self' => 'Usted eliminado con éxito sus propios derechos. Por lo tanto, usted ya no es capaz de acceder a esta página.',
# Groups
'group' => 'Grupo:',
@@ -1651,11 +1715,19 @@ Tu dirección de correo no se revela cuando otros usuarios te contactan.',
'right-proxyunbannable' => 'Pasar por encima de bloqueos automáticos de proxies',
'right-unblockself' => 'Desbloquearse uno mismo',
'right-protect' => 'Cambiar niveles de protección y editar páginas protegidas en cascada',
-'right-editprotected' => 'Editar páginas protegidas (sin la protección «en cascada»)',
+'right-editprotected' => 'Editar páginas protegidas como «{{int:protect-level-sysop}}»',
+'right-editsemiprotected' => 'Editar páginas protegidas como «{{int:protect-level-autoconfirmed}}»',
'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-editmyusercss' => 'Editar tus archivos de usuario CSS',
+'right-editmyuserjs' => 'Editar tus propios archivos JavaScript de usuario',
+'right-viewmywatchlist' => 'Ver tu lista de seguimiento',
+'right-editmywatchlist' => 'Editar tu lista de seguimiento. Algunas acciones seguirán agregando páginas aún sin este derecho.',
+'right-viewmyprivateinfo' => 'Ver tu información privada (ej. email, nombre real)',
+'right-editmyprivateinfo' => 'Editar tus propios datos privados (ej: email, nombre real)',
+'right-editmyoptions' => 'Editar tus propias preferencias',
'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',
@@ -1717,12 +1789,19 @@ Tu dirección de correo no se revela cuando otros usuarios te contactan.',
'action-userrights-interwiki' => 'modificar los derechos de usuarios en otros wikis',
'action-siteadmin' => 'bloquear o desbloquear la base de datos',
'action-sendemail' => 'enviar correos electrónicos',
+'action-editmywatchlist' => 'Editar tu lista de seguimiento',
+'action-viewmywatchlist' => 'Ver tu lista de seguimiento',
+'action-viewmyprivateinfo' => 'ver tu información privada',
+'action-editmyprivateinfo' => 'Editar tu información privada',
# Recent changes
'nchanges' => '$1 {{PLURAL:$1|cambio|cambios}}',
+'enhancedrc-since-last-visit' => '$1 {{PLURAL:$1|desde la última visita}}',
+'enhancedrc-history' => 'historial',
'recentchanges' => 'Cambios recientes',
'recentchanges-legend' => 'Opciones sobre cambios recientes',
'recentchanges-summary' => 'Sigue los cambios más recientes de la wiki en esta página.',
+'recentchanges-noresult' => 'No hubo cambios durante el período seleccionado que respondan a esos criterios.',
'recentchanges-feed-description' => 'Realiza un seguimiento de los cambios más recientes en el wiki en este canal.',
'recentchanges-label-newpage' => 'Esta edición creó una nueva página',
'recentchanges-label-minor' => 'Esta es una edición menor',
@@ -1759,7 +1838,6 @@ Tu dirección de correo no se revela cuando otros usuarios te contactan.',
'recentchangeslinked-feed' => 'Cambios relacionados',
'recentchangeslinked-toolbox' => 'Cambios relacionados',
'recentchangeslinked-title' => 'Cambios relacionados con «$1»',
-'recentchangeslinked-noresult' => 'No hubo cambios en las páginas enlazadas durante el periodo indicado.',
'recentchangeslinked-summary' => "Esta página es una lista de los últimos cambios en las páginas enlazadas desde una página (o en las pertenecientes a una categoría). Las páginas que están en tu [[Special:Watchlist|lista de seguimiento]] aparecen en '''negrita'''.",
'recentchangeslinked-page' => 'Nombre de la página:',
'recentchangeslinked-to' => 'Muestra los cambios recientes en lugar de la página indicada',
@@ -1770,7 +1848,7 @@ Tu dirección de correo no se revela cuando otros usuarios te contactan.',
'reuploaddesc' => 'Regresar al formulario para subir.',
'upload-tryagain' => 'Envíe la descripción del archivo modificado',
'uploadnologin' => 'No has iniciado sesión',
-'uploadnologintext' => 'Tienes que [[Special:UserLogin|iniciar sesión]] para poder subir archivos.',
+'uploadnologintext' => 'Tienes que $1 para subir archivos.',
'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',
@@ -1996,7 +2074,6 @@ Para óptima seguridad, img_auth.php está desactivado.',
'http-read-error' => 'Error de lectura HTTP.',
'http-timed-out' => 'La solicitud HTTP ha expirado.',
'http-curl-error' => 'Error al recuperar el URL: $1',
-'http-host-unreachable' => 'No fue posible acceder a la URL.',
'http-bad-status' => 'Ha habido un problema durante la solicitud HTTP: $1 $2',
# Some likely curl errors. More could be added from <http://curl.haxx.se/libcurl/c/libcurl-errors.html>
@@ -2025,6 +2102,10 @@ Cuando el usuario la filtra, solo se muestran los archivos cargados por el usuar
'listfiles_size' => 'Tamaño (bytes)',
'listfiles_description' => 'Descripción',
'listfiles_count' => 'Versiones',
+'listfiles-show-all' => 'Incluir versiones antiguas de las imágenes',
+'listfiles-latestversion' => 'Versión actual',
+'listfiles-latestversion-yes' => 'Sí',
+'listfiles-latestversion-no' => 'No',
# File description page
'file-anchor-link' => 'Archivo',
@@ -2123,6 +2204,13 @@ Entrada: contenttype/subtype, p. ej. <code>image/jpeg</code>.',
'randompage' => 'Página aleatoria',
'randompage-nopages' => 'No hay páginas en los siguientes {{PLURAL:$2|espacio de nombre|espacios de nombre}}: $1.',
+# Random page in category
+'randomincategory' => 'Página aleatoria en categoría',
+'randomincategory-invalidcategory' => '"$1" no es una categoría válida.',
+'randomincategory-nopages' => 'No hay páginas en la categoría [[:Category:$1|$1]].',
+'randomincategory-selectcategory' => 'Obtener una página aleatoria de categoría: $1 $2.',
+'randomincategory-selectcategory-submit' => 'Ir',
+
# Random redirect
'randomredirect' => 'Ir a una redirección cualquiera',
'randomredirect-nopages' => 'No hay redirecciones en el espacio de nombres «$1».',
@@ -2148,17 +2236,13 @@ Entrada: contenttype/subtype, p. ej. <code>image/jpeg</code>.',
'statistics-users-active-desc' => 'Usuarios que han ejecutado una acción en {{PLURAL:$1|el último día|los últimos $1 días}}',
'statistics-mostpopular' => 'Páginas más vistas',
-'disambiguations' => 'Páginas que enlazan con páginas de desambiguación',
-'disambiguationspage' => 'Template:Desambiguación',
-'disambiguations-text' => "Las siguientes páginas contienen al menos un enlace a una '''página de desambiguación'''.
-En lugar de ello deberían enlazar a una página más apropiada.<br />
-Una página es considerada página de desambiguación si utiliza la plantilla que está enlazada desde [[MediaWiki:Disambiguationspage]].",
-
'pageswithprop' => 'Páginas con una propiedad de página',
'pageswithprop-legend' => 'Páginas con una propiedad de página',
'pageswithprop-text' => 'Esta página muestra las páginas que usan la propiedad de una página en particular',
'pageswithprop-prop' => 'Nombre de la propiedad',
'pageswithprop-submit' => 'Ir',
+'pageswithprop-prophidden-long' => 'hay un largo valor en la propiedad texto oculta ($1)',
+'pageswithprop-prophidden-binary' => 'valor de la propiedad binaria oculta ($1)',
'doubleredirects' => 'Redirecciones dobles',
'doubleredirectstext' => 'Esta página contiene una lista de páginas que redirigen a otras páginas de redirección.
@@ -2216,6 +2300,7 @@ Las entradas <del>tachadas</del> han sido resueltas.',
'mostrevisions' => 'Artículos con más ediciones',
'prefixindex' => 'Todas las páginas con prefijo',
'prefixindex-namespace' => 'Todas las páginas con el prefijo (espacio de nombres $1)',
+'prefixindex-strip' => 'Prefijo de la hilera en la lista',
'shortpages' => 'Páginas cortas',
'longpages' => 'Páginas largas',
'deadendpages' => 'Páginas sin salida',
@@ -2231,6 +2316,7 @@ Las entradas <del>tachadas</del> han sido resueltas.',
'listusers' => 'Lista de usuarios',
'listusers-editsonly' => 'Muestra sólo usuarios con ediciones',
'listusers-creationsort' => 'Ordenado por fecha de creación',
+'listusers-desc' => 'Ordenar de forma descendente',
'usereditcount' => '$1 {{PLURAL:$1|edición|ediciones}}',
'usercreated' => '{{GENDER:$3|Registrado|Registrada}} el $1 a las $2',
'newpages' => 'Páginas nuevas',
@@ -2406,10 +2492,9 @@ La dirección de correo electrónico que indicaste en [[Special:Preferences|tus
'unwatchthispage' => 'Dejar de vigilar',
'notanarticle' => 'No es un artículo',
'notvisiblerev' => 'La última revisión de un usuario diferente ha sido borrada',
-'watchnochange' => 'Ninguno de los artículos de tu lista de seguimiento fue editado en el periodo de tiempo mostrado.',
'watchlist-details' => '{{PLURAL:$1|$1 página|$1 páginas}} en su lista de seguimiento, sin contar las de discusión.',
-'wlheader-enotif' => '* La notificación por correo electrónico está activada.',
-'wlheader-showupdated' => "* Las páginas modificadas desde su última visita aparecen en '''negrita'''",
+'wlheader-enotif' => 'La notificación por correo está activada.',
+'wlheader-showupdated' => "Las páginas modificadas desde su última visita aparecen en '''negrita'''.",
'watchmethod-recent' => 'revisando cambios recientes en páginas vigiladas',
'watchmethod-list' => 'revisando las páginas vigiladas en busca de cambios recientes',
'watchlistcontains' => 'Tu lista de seguimiento posee $1 {{PLURAL:$1|página|páginas}}.',
@@ -2653,7 +2738,7 @@ $1',
'contributions' => 'Contribuciones {{GENDER:$1|del usuario|de la usuaria}}',
'contributions-title' => 'Contribuciones {{GENDER:$1|del usuario|de la usuaria}} $1',
'mycontris' => 'Contribuciones',
-'contribsub2' => '$1 ($2)',
+'contribsub2' => 'Para {{GENDER:$3|$1}} ($2)',
'nocontribs' => 'No se encontraron cambios que cumplieran estos criterios.',
'uctop' => '(edición actual)',
'month' => 'Desde el mes (y anteriores):',
@@ -2808,13 +2893,11 @@ Consulta la [[Special:BlockList|lista de bloqueos]] para ver la lista de bloqueo
Sin embargo, está bloqueada como parte del rango $2, que puede ser desbloqueado.',
'ip_range_invalid' => 'El rango de IP no es válido.',
'ip_range_toolarge' => 'Los bloqueos de rango superiores a /$1 no están permitidos.',
-'blockme' => 'Bloquearme',
'proxyblocker' => 'Bloqueador de proxies',
-'proxyblocker-disabled' => 'Esta función está desactivada.',
'proxyblockreason' => 'Su dirección IP ha sido bloqueada porque es un proxy abierto. Por favor, contacte con su proveedor de servicios de Internet o con su servicio de asistencia técnica e infórmeles de este grave problema de seguridad.',
-'proxyblocksuccess' => 'Hecho.',
'sorbsreason' => 'Su dirección IP está listada como proxy abierto en DNSBL.',
'sorbs_create_account_reason' => 'Su dirección IP está listada como proxy abierto en DNSBL. No puede crear una cuenta',
+'xffblockreason' => 'Una dirección IP presente en la cabecera X-Forwarded-For, tuya o del servidor proxy que estás usando, ha sido bloqueada. El motivo original del bloqueo fue: $1',
'cant-block-while-blocked' => 'No puedes bloquear a otros usuarios mientras estás bloquead{{GENDER:|o|a}}.',
'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',
@@ -2976,6 +3059,8 @@ Por favor visita [//www.mediawiki.org/wiki/Localisation Localización MediaWiki]
'thumbnail-more' => 'Aumentar',
'filemissing' => 'Falta archivo',
'thumbnail_error' => 'Error al crear miniatura: $1',
+'thumbnail_error_remote' => 'Mensaje de error de $1 :
+$2',
'djvu_page_error' => 'Página DjVu fuera de rango',
'djvu_no_xml' => 'Imposible obtener XML para el archivo DjVu',
'thumbnail-temp-create' => 'No se ha podido crear el archivo temporal de la miniatura',
@@ -3128,17 +3213,11 @@ Permite añadir una razón al resumen de edición.',
# Stylesheets
'common.css' => '/* El CSS colocado en esta página será aplicado a todas las apariencias */',
-'standard.css' => '/* El CSS colocado en esta página afectará a los usuarios que usen la piel "Standard" */',
-'nostalgia.css' => '/* El CSS colocado en esta página afectará a los usuarios que usen la piel "Nostalgia" */',
'cologneblue.css' => '/* El CSS colocado en esta página afectará a los usuarios que usen la piel "Cologne Blue" */',
'monobook.css' => '/* El CSS colocado en esta página afectará a los usuarios que usen la piel "MonoBook" */',
-'myskin.css' => '/* El CSS colocado en esta página afectará a los usuarios que usen la piel "MySkin" */',
-'chick.css' => '/* El CSS colocado en esta página afectará a los usuarios que usen la piel ""Chick" */',
-'simple.css' => '/* El CSS colocado en esta página afectará a los usuarios que usen la piel "Simple" */',
'modern.css' => '/* El CSS colocado en esta página afectará a los usuarios que usen la piel "Modern" */',
'vector.css' => '/* El CSS colocado en esta página afectará a los usuarios que usen la piel "Vector" */',
'print.css' => '/* Los estilos CSS colocados aquí afectarán la impresión */',
-'handheld.css' => '/* Los estilos CSS colocados aquí afectarán a los dispositivos móviles basados en las pieles configuradas en $wgHandheldStyle */',
'noscript.css' => '/* Los estilos CSS colocados aquí se aplicarán a los usuarios que hayan desactivado el JavaScript en su navegador */',
'group-autoconfirmed.css' => '/* Los estilos CSS colocados aquí se aplicarán para todos los usuarios del grupo Usuarios autoconfirmados */',
'group-bot.css' => '/* Los estilos CSS colocados aquí se aplicarán para todos los usuarios del grupo Bots */',
@@ -3147,13 +3226,8 @@ Permite añadir una razón al resumen de edición.',
# Scripts
'common.js' => '/* Cualquier código JavaScript escrito aquí se cargará para todos los usuarios en cada carga de página */',
-'standard.js' => '/* Cualquier código JavaScript escrito aquí se cargará para todos los usuarios que usen la piel Estandar */',
-'nostalgia.js' => '/* Cualquier código JavaScript escrito aquí se cargará para todos los usuarios que usen la piel Nostalgia. */',
'cologneblue.js' => '/* Cualquier código JavaScript escrito aquí se cargará para todos los usuarios que usen la piel Colonia azul */',
'monobook.js' => '/* El código JavaScript que se ponga aquí será cargado por los usuarios de la piel MonoBook */',
-'myskin.js' => '/* Cualquier código JavaScript escrito aquí se cargará para todos los usuarios que usen la piel Mi piel */',
-'chick.js' => '/* Cualquier código JavaScript escrito aquí se cargará para todos los usuarios que usen la piel Pollito */',
-'simple.js' => '/* Cualquier código JavaScript escrito aquí se cargará para todos los usuarios que usen la piel Simple */',
'modern.js' => '/* Cualquier código JavaScript escrito aquí se cargará para todos los usuarios que usen la piel Moderna */',
'vector.js' => '/* Cualquier código JavaScript escrito aquí se cargará para todos los usuarios que usen la piel Vector */',
'group-autoconfirmed.js' => '/* Cualquier código JavaScript escrito aquí se cargará para todos los usuarios del grupo Usuarios autoconfirmados */',
@@ -3234,13 +3308,8 @@ Esto podría estar causado por un enlace a un sitio externo incluido en la lista
'pageinfo-category-files' => 'Número de archivos',
# Skin names
-'skinname-standard' => 'Estándar',
-'skinname-nostalgia' => 'Nostalgia',
'skinname-cologneblue' => 'Colonia azul',
'skinname-monobook' => 'MonoBook',
-'skinname-myskin' => 'Mi piel',
-'skinname-chick' => 'Pollito',
-'skinname-simple' => 'Simple',
'skinname-modern' => 'Moderna',
'skinname-vector' => 'Vector',
@@ -3324,11 +3393,25 @@ Ejecutarlo podría comprometer la seguridad de su equipo.",
'minutes' => '{{PLURAL:$1|un minuto|$1 minutos}}',
'hours' => '{{PLURAL:$1|una hora|$1 horas}}',
'days' => '{{PLURAL:$1|un día|$1 días}}',
+'weeks' => '{{PLURAL:$1|$1 semana|$1 semanas}}',
'months' => '{{PLURAL:$1|$1 mes|$1 meses}}',
'years' => '{{PLURAL:$1|$1 año|$1 años}}',
'ago' => 'hace $1',
'just-now' => 'Ahora mismo',
+# Human-readable timestamps
+'hours-ago' => 'hace $1 {{PLURAL:$1|hora|horas}}',
+'minutes-ago' => 'hace {{PLURAL:$1|un minuto|$1 minutos}}',
+'seconds-ago' => 'hace $1 {{PLURAL:$1|segundo|segundos}}',
+'monday-at' => 'El lunes a las $1',
+'tuesday-at' => 'El martes a las $1',
+'wednesday-at' => 'El miércoles a las $1',
+'thursday-at' => 'El jueves a las $1',
+'friday-at' => 'El viernes a las $1',
+'saturday-at' => 'El sábado a las $1',
+'sunday-at' => 'El domingo a las $1',
+'yesterday-at' => 'Ayer a las $1',
+
# Bad image list
'bad_image_list' => 'El formato es el siguiente:
@@ -3357,7 +3440,7 @@ Existen otros campos que se mantendrán ocultos por defecto.
* gpslongitude
* gpsaltitude',
-# EXIF tags
+# Exif tags
'exif-imagewidth' => 'Anchura',
'exif-imagelength' => 'Altura',
'exif-bitspersample' => 'Bits por componente',
@@ -3535,7 +3618,7 @@ Existen otros campos que se mantendrán ocultos por defecto.
'exif-originalimageheight' => 'Altura de la imagen antes de que fuera recortada',
'exif-originalimagewidth' => 'Ancho de la imagen antes de que fuera recortada',
-# EXIF attributes
+# Exif attributes
'exif-compression-1' => 'Sin comprimir',
'exif-compression-2' => 'CCITT Group 3 1-Dimensional Modified Huffman run length encoding',
'exif-compression-3' => 'Codificación de fax CCITT grupo 3',
@@ -3923,7 +4006,6 @@ También puedes [[Special:EditWatchlist|usar el editor estándar]].',
'version-other' => 'Otro',
'version-mediahandlers' => 'Manejadores multimedia',
'version-hooks' => 'Extensiones',
-'version-extension-functions' => 'Funciones de extensiones',
'version-parser-extensiontags' => 'Etiquetas de extensiones sintácticas',
'version-parser-function-hooks' => 'Extensiones de funciones sintácticas',
'version-hook-name' => 'Nombre de la extensión',
@@ -3932,6 +4014,7 @@ También puedes [[Special:EditWatchlist|usar el editor estándar]].',
'version-license' => 'Licencia',
'version-poweredby-credits' => "Este wiki funciona gracias a '''[//www.mediawiki.org/ MediaWiki]''', copyright © 2001-$1 $2.",
'version-poweredby-others' => 'otros',
+'version-poweredby-translators' => 'Traductores de translatewiki.net',
'version-credits-summary' => 'Queremos reconocer a las siguientes personas por su contribución a [[Special:Version|MediaWiki]].',
'version-license-info' => 'MediaWiki es software libre; puedes redistribuirlo y/o modificarlo bajo los términos de la Licencia General Pública de GNU como la publica la Free Software Foundation; ya sea la versión 2 de la licencia, o (a tu elección) cualquier versión posterior.
@@ -3947,12 +4030,17 @@ Has recibido [{{SERVER}}{{SCRIPTPATH}}/COPYING una copia de la Licencia Pública
'version-entrypoints-articlepath' => '[https://www.mediawiki.org/wiki/Manual:$wgArticlePath Ruta del artículo]',
'version-entrypoints-scriptpath' => '[https://www.mediawiki.org/wiki/Manual:$wgScriptPath Ruta de la secuencia de comandos (script)]',
-# Special:FilePath
-'filepath' => 'Ruta de archivo',
-'filepath-page' => 'Archivo:',
-'filepath-submit' => 'Ir',
-'filepath-summary' => 'Esta página devuelve la ruta completa de un archivo.
-Las imágenes se muestran en resolución máxima, otros tipos de archivo se inician directamente con su programa asociado.',
+# Special:Redirect
+'redirect' => 'Redirigir por archivo, usuario o ID de revisión',
+'redirect-legend' => 'Redirigir a un archivo o página',
+'redirect-summary' => 'Esta página especial redirige a un fichero (dado un nombre de fichero), a una página (dado un identificador de revisión) o a una página de usuario (dado en identificador numérico de usuario).',
+'redirect-submit' => 'Ir',
+'redirect-lookup' => 'Buscar:',
+'redirect-value' => 'Valor:',
+'redirect-user' => 'Id. del usuario',
+'redirect-revision' => 'Revisión de página',
+'redirect-file' => 'Nombre de fichero',
+'redirect-not-exists' => 'No se encontró el valor',
# Special:FileDuplicateSearch
'fileduplicatesearch' => 'Búsqueda de archivos duplicados',
@@ -4002,12 +4090,15 @@ Las imágenes se muestran en resolución máxima, otros tipos de archivo se inic
'tags' => 'Cambio de etiquetas válida',
'tag-filter' => 'Filtro de [[Special:Tags|etiquetas]]:',
'tag-filter-submit' => 'Filtro',
+'tag-list-wrapper' => '([[Special:Tags|{{PLURAL:$1|Etiqueta|Etiquetas}}]]: $2)',
'tags-title' => 'Etiquetas',
'tags-intro' => 'Esta página lista las etiquetas con las que el software puede marcar una edición y su significado.',
'tags-tag' => 'Nombre de etiqueta',
'tags-display-header' => 'Apariencia de la lista de cambios',
'tags-description-header' => 'Descripción completa de significado',
+'tags-active-header' => '¿Activo?',
'tags-hitcount-header' => 'Cambios etiquetados',
+'tags-active-yes' => 'Sí',
'tags-edit' => 'editar',
'tags-hitcount' => '$1 {{PLURAL:$1|cambio|cambios}}',
@@ -4028,6 +4119,7 @@ Las imágenes se muestran en resolución máxima, otros tipos de archivo se inic
'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-info-hidden' => '(No se puede contactar con la base de datos del servidor)',
'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.',
@@ -4043,6 +4135,9 @@ Las imágenes se muestran en resolución máxima, otros tipos de archivo se inic
'htmlform-submit' => 'Enviar',
'htmlform-reset' => 'Deshacer cambios',
'htmlform-selectorother-other' => 'Otro',
+'htmlform-no' => 'No',
+'htmlform-yes' => 'Sí',
+'htmlform-chosen-placeholder' => 'Selecciona una opción',
# SQLite database support
'sqlite-has-fts' => '$1 con soporte para búsqueda de texto completo',
@@ -4161,4 +4256,19 @@ En otro caso, puedes usar el siguiente formulario. Tu comentario será añadido
# Image rotation
'rotate-comment' => 'Imagen girada por $1 {{PLURAL:$1|grado|grados}} en el sentido de las agujas del reloj',
+# Limit report
+'limitreport-title' => 'Datos de perfilado del analizador:',
+'limitreport-cputime' => 'Tiempo de uso de CPU',
+'limitreport-cputime-value' => '$1 {{PLURAL:$1|segundo|segundos}}',
+'limitreport-walltime' => 'Tiempo real de uso',
+'limitreport-walltime-value' => '$1 {{PLURAL:$1|segundo|segundos}}',
+'limitreport-ppvisitednodes' => 'N.º de nodos visitados por el preprocesador',
+'limitreport-ppgeneratednodes' => 'N.º de nodos generados por el preprocesador',
+'limitreport-postexpandincludesize' => 'Tamaño de inclusión posexpansión',
+'limitreport-postexpandincludesize-value' => '$1/$2 {{PLURAL:$2|byte|bytes}}',
+'limitreport-templateargumentsize' => 'Argumento del tamaño de la plantilla',
+'limitreport-templateargumentsize-value' => '$1/$2 {{PLURAL:$2|byte|bytes}}',
+'limitreport-expansiondepth' => 'Profundidad máxima de expansión',
+'limitreport-expensivefunctioncount' => 'Cuenta de la funcion expansiva del analizador',
+
);
diff --git a/languages/messages/MessagesEt.php b/languages/messages/MessagesEt.php
index a0a42b24..505d0903 100644
--- a/languages/messages/MessagesEt.php
+++ b/languages/messages/MessagesEt.php
@@ -9,6 +9,7 @@
*
* @author Avjoska
* @author Cylly1512
+ * @author Geitost
* @author Hendrik
* @author Hendrix
* @author Jaan513
@@ -18,6 +19,7 @@
* @author Ker
* @author Kyng
* @author Morel
+ * @author Nemo bis
* @author Oop
* @author Pikne
* @author Silvar
@@ -105,6 +107,7 @@ $specialPageAliases = array(
'Myuploads' => array( 'Minu_üleslaaditu' ),
'Newimages' => array( 'Uued_failid' ),
'Newpages' => array( 'Uued_leheküljed' ),
+ 'PagesWithProp' => array( 'Atribuudiga_leheküljed' ),
'PasswordReset' => array( 'Parooli_lähtestamine' ),
'PermanentLink' => array( 'Püsilink' ),
'Popularpages' => array( 'Loetumad_leheküljed' ),
@@ -320,9 +323,6 @@ $messages = array(
'tog-shownumberswatching' => 'Näita jälgivate kasutajate hulka',
'tog-oldsig' => 'Praegune allkiri:',
'tog-fancysig' => 'Kasuta vikiteksti vormingus allkirja (ilma automaatse lingita kasutajalehele)',
-'tog-externaleditor' => 'Kasuta vaikimisi välist redaktorit (ainult asjatundjatele, tarvis arvuti eriseadistust – [//www.mediawiki.org/wiki/Manual:External_editors lisateave])',
-'tog-externaldiff' => 'Kasuta vaikimisi välist võrdlusvahendit (ainult asjatundjatele, tarvis arvuti eriseadistust – [//www.mediawiki.org/wiki/Manual:External_editors lisateave])',
-'tog-showjumplinks' => 'Kuva lehekülje ülaservas "mine"-lingid',
'tog-uselivepreview' => 'Kasuta elavat eelvaadet (katseline)',
'tog-forceeditsummary' => 'Nõua redigeerimisel resümee välja täitmist',
'tog-watchlisthideown' => 'Peida minu redaktsioonid jälgimisloendist',
@@ -335,6 +335,8 @@ $messages = array(
'tog-diffonly' => 'Ära näita erinevuste vaate all lehe sisu',
'tog-showhiddencats' => 'Näita peidetud kategooriaid',
'tog-norollbackdiff' => 'Ära näita erinevusi pärast tühistamist',
+'tog-useeditwarning' => 'Hoiata mind, kui lahkun redigeerimisleheküljelt muudatusi salvestamata',
+'tog-prefershttps' => 'Kasuta sisselogimisel alati turvalist ühendust',
'underline-always' => 'Alati',
'underline-never' => 'Mitte kunagi',
@@ -398,6 +400,18 @@ $messages = array(
'oct' => 'okt',
'nov' => 'nov',
'dec' => 'dets',
+'january-date' => '$1. jaanuar',
+'february-date' => '$1. veebruar',
+'march-date' => '$1. märts',
+'april-date' => '$1. aprill',
+'may-date' => '$1. mai',
+'june-date' => '$1. juuni',
+'july-date' => '$1. juuli',
+'august-date' => '$1. august',
+'september-date' => '$1. september',
+'october-date' => '$1. oktoober',
+'november-date' => '$1. november',
+'december-date' => '$1. detsember',
# Categories related messages
'pagecategories' => '{{PLURAL:$1|Kategooria|Kategooriad}}',
@@ -479,6 +493,7 @@ $messages = array(
'create-this-page' => 'Loo see lehekülg',
'delete' => 'Kustuta',
'deletethispage' => 'Kustuta see lehekülg',
+'undeletethispage' => 'Taasta see lehekülg',
'undelete_short' => 'Taasta {{PLURAL:$1|üks muudatus|$1 muudatust}}',
'viewdeleted_short' => 'Vaata {{PLURAL:$1|üht|$1}} kustutatud redaktsiooni',
'protect' => 'Kaitse',
@@ -520,7 +535,7 @@ 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).
+# 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).
'aboutsite' => '{{GRAMMAR:genitive|{{SITENAME}}}} tiitelandmed',
'aboutpage' => 'Project:Tiitelandmed',
'copyright' => 'Sisu on kasutatav litsentsi $1 tingimustel, kui pole öeldud teisiti.',
@@ -530,7 +545,6 @@ $1',
'disclaimers' => 'Hoiatused',
'disclaimerpage' => 'Project:Hoiatused',
'edithelp' => 'Redigeerimisjuhend',
-'edithelppage' => 'Help:Kuidas_lehte_redigeerida',
'helppage' => 'Help:Sisukord',
'mainpage' => 'Esileht',
'mainpage-description' => 'Esileht',
@@ -560,7 +574,6 @@ Vaata [[Special:Version|versiooni lehekülge]].',
'newmessagesdifflinkplural' => '{{PLURAL:$1|viimane muudatus|viimased muudatused}}',
'youhavenewmessagesmulti' => 'Sulle on uusi sõnumeid $1',
'editsection' => 'muuda',
-'editsection-brackets' => '[$1]',
'editold' => 'redigeeri',
'viewsourceold' => 'vaata lähteteksti',
'editlink' => 'redigeeri',
@@ -610,17 +623,12 @@ Käibel olevad erileheküljed on loetletud leheküljel [[Special:SpecialPages|{{
# General errors
'error' => 'Viga',
'databaseerror' => 'Andmebaasi viga',
-'dberrortext' => 'Andmebaasipäringus oli süntaksiviga.
-Selle võis tingida tarkvaraviga.
-Viimane andmebaasipäring oli:
-<blockquote><code>$1</code></blockquote>
-ja see ilmnes funktsiooniga "<code>$2</code>".
-Andmebaas tagastas veateate "<samp>$3: $4</samp>".',
-'dberrortextcl' => 'Andmebaasipäringus oli süntaksiviga.
-Viimane andmebaasipäring oli:
-"$1"
-ja see kutsuti funktsioonist "$2".
-Andmebaas tagastas veateate "$3: $4".',
+'databaseerror-text' => 'Esines andmebaasipäringu tõrge.
+See võib viidata veale tarkvaras.',
+'databaseerror-textcl' => 'Esines andmebaasipäringu tõrge.',
+'databaseerror-query' => 'Päring: $1',
+'databaseerror-function' => 'Funktsioon: $1',
+'databaseerror-error' => 'Tõrge: $1',
'laggedslavemode' => 'Hoiatus: Leheküljel võivad puududa viimased uuendused.',
'readonly' => 'Andmebaas on hetkel kirjutuskaitse all',
'enterlockreason' => 'Sisesta lukustamise põhjus ning juurdepääsu taastamise ligikaudne aeg',
@@ -674,12 +682,15 @@ Et lisada ja muuta tõlkeid kõigi vikide jaoks, kasuta palun MediaWiki lokalise
'editinginterface' => "'''Hoiatus:''' Redigeerid tarkvara kasutajaliidese tekstiga lehekülge.
Muudatused siin mõjutavad kõikide selle viki kasutajate kasutajaliidest.
Et lisada ja muuta tõlkeid kõigi vikide jaoks, kasuta palun MediaWiki lokaliseerimisprojekti [//translatewiki.net/ translatewiki.net].",
-'sqlhidden' => '(SQL päring peidetud)',
'cascadeprotected' => 'See lehekülg on muutmise eest kaitstud, sest see on osa {{PLURAL:$1|järgmisest leheküljest|järgmistest lehekülgedest}}, mis on kaskaadkaitse all:
$2',
'namespaceprotected' => "Sul pole õigust redigeerida lehekülgi nimeruumis '''$1'''.",
'customcssprotected' => 'Sul pole õigust seda CSS-lehekülge redigeerida, sest see sisaldab teise kasutaja isiklikke sätteid.',
'customjsprotected' => 'Sul pole õigust seda JavaScripti lehekülge redigeerida, sest see sisaldab teise kasutaja isiklikke sätteid.',
+'mycustomcssprotected' => 'Sul pole õigust redigeerida seda CSS-lehekülge.',
+'mycustomjsprotected' => 'Sul pole õigust redigeerida seda JavaScript-lehekülge.',
+'myprivateinfoprotected' => 'Sul pole lubatud oma eraandmeid redigeerida.',
+'mypreferencesprotected' => 'Sul pole lubatud oma eelistusi muuta.',
'ns-specialprotected' => 'Erilehekülgi ei saa redigeerida.',
'titleprotected' => "Kasutaja [[User:$1|$1]] on selle pealkirjaga lehe loomise keelanud esitades järgmise põhjenduse: ''$2''.",
'filereadonlyerror' => 'Faili "$1" ei saa muuta, sest hoidla "$2" on kirjutuskaitstud.
@@ -703,10 +714,19 @@ Pane tähele, et seni kuni sa pole oma võrgulehitseja puhvrit tühjendanud, võ
'welcomecreation-msg' => 'Sinu konto on loodud.
Ära unusta seada oma {{GRAMMAR:genitive|{{SITENAME}}}} [[Special:Preferences|eelistusi]].',
'yourname' => 'Kasutajanimi:',
+'userlogin-yourname' => 'Kasutajanimi',
+'userlogin-yourname-ph' => 'Sisesta oma kasutajanimi',
+'createacct-another-username-ph' => 'Sisesta kasutajanimi',
'yourpassword' => 'Parool:',
+'userlogin-yourpassword' => 'Parool',
+'userlogin-yourpassword-ph' => 'Sisesta oma parool',
+'createacct-yourpassword-ph' => 'Sisesta parool',
'yourpasswordagain' => 'Sisesta parool uuesti:',
+'createacct-yourpasswordagain' => 'Parooli kinnitus',
+'createacct-yourpasswordagain-ph' => 'Sisesta uuesti parool',
'remembermypassword' => 'Jäta parool meelde (kuni $1 {{PLURAL:$1|päevaks|päevaks}})',
-'securelogin-stick-https' => 'Jätka pärast sisselogimist HTTPS-ühenduse kasutamist',
+'userlogin-remembermypassword' => 'Jää sisseloginuks',
+'userlogin-signwithsecure' => 'Kasuta turvalist ühendust',
'yourdomainname' => 'Sinu domeen:',
'password-change-forbidden' => 'Selles vikis ei saa paroole muuta.',
'externaldberror' => 'Esines autentimistõrge või sul pole õigust konto andmeid muuta.',
@@ -718,18 +738,44 @@ Pane tähele, et seni kuni sa pole oma võrgulehitseja puhvrit tühjendanud, võ
'logout' => 'Logi välja',
'userlogout' => 'Logi välja',
'notloggedin' => 'Sisse logimata',
+'userlogin-noaccount' => 'Kas sul pole kontot?',
+'userlogin-joinproject' => 'Ãœhine projektiga {{SITENAME}}',
'nologin' => 'Kas sul pole kontot? $1.',
'nologinlink' => 'Registreeru siin',
'createaccount' => 'Loo uus konto',
'gotaccount' => "Kui sul on juba konto, '''$1'''.",
'gotaccountlink' => 'logi sisse',
'userlogin-resetlink' => 'Kas oled unustanud oma sisselogimisandmed?',
+'userlogin-resetpassword-link' => 'Lähtesta oma parool',
+'helplogin-url' => 'Help:Sisselogimine',
+'userlogin-helplink' => '[[{{MediaWiki:helplogin-url}}|Sisselogimisabi]]',
+'userlogin-loggedin' => 'Oled juba sisse logitud nimega {{GENDER:$1|$1}}.
+Kasuta allolevat vormi, et logida sisse teise kasutajaga.',
+'userlogin-createanother' => 'Loo teine konto',
+'createacct-join' => 'Sisesta allapoole oma andmed.',
+'createacct-another-join' => 'Sisesta allpool uue konto andmed.',
+'createacct-emailrequired' => 'E-posti aadress',
+'createacct-emailoptional' => 'E-posti aadress (valikuline)',
+'createacct-email-ph' => 'Sisesta oma e-posti aadress',
+'createacct-another-email-ph' => 'Sisesta e-posti aadress',
'createaccountmail' => 'Kasuta juhuslikku parooli ja saada see määratud e-posti aadressile',
+'createacct-realname' => 'Pärisnimi (valikuline)',
'createaccountreason' => 'Põhjus:',
+'createacct-reason' => 'Põhjus',
+'createacct-reason-ph' => 'Miks lood teist kontot?',
+'createacct-captcha' => 'Turvakontroll',
+'createacct-imgcaptcha-ph' => 'Sisesta ülalnähtav tekst',
+'createacct-submit' => 'Loo oma konto',
+'createacct-another-submit' => 'Loo teine konto',
+'createacct-benefit-heading' => '{{SITENAME}} on sinusuguste inimeste tehtud.',
+'createacct-benefit-body1' => '{{PLURAL:$1|muudatus|muudatust}}',
+'createacct-benefit-body2' => '{{PLURAL:$1|lehekülg|lehekülge}}',
+'createacct-benefit-body3' => '{{PLURAL:$1|hiljutine kaastööline|hiljutist kaastöölist}}',
'badretype' => 'Sisestatud paroolid ei lange kokku.',
'userexists' => 'Sisestatud kasutajanimi on juba kasutusel.
Palun valige uus nimi.',
'loginerror' => 'Viga sisselogimisel',
+'createacct-error' => 'Tõrge konto loomisel',
'createaccounterror' => 'Kasutajakonto loomine ebaõnnestus: $1',
'nocookiesnew' => 'Kasutajakonto loodi, aga sa ei ole sisse logitud, sest {{SITENAME}} kasutab kasutajate tuvastamisel küpsiseid. Sinu brauseris on küpsised keelatud. Palun sea küpsised lubatuks ja logi siis oma vastse kasutajanime ning parooliga sisse.',
'nocookieslogin' => '{{SITENAME}} kasutab kasutajate tuvastamisel küpsiseid. Sinu brauseris on küpsised keelatud. Palun sea küpsised lubatuks ja proovi siis uuesti.',
@@ -781,11 +827,13 @@ Ole hea ja sisesta õige e-posti aadress või jäta väli tühjaks.',
Kui kasutajakonto loomine on eksitus, võid käesolevat sõnumit lihtsalt eirata.',
'usernamehasherror' => 'Kasutajanimi ei või sisaldada trellimärke ("#").',
-'login-throttled' => 'Oled lühikese aja jooksul liiga palju äpardunud logimiskatseid sooritanud.
-Palun pea nüüd pisut vahet.',
+'login-throttled' => 'Oled lühikese aja jooksul proovinud liiga palju kordi sisse logida.
+Palun oota $1, enne kui uuesti proovid.',
'login-abort-generic' => 'Sisselogimine ebaõnnestus – Katkestatud',
'loginlanguagelabel' => 'Keel: $1',
'suspicious-userlogout' => 'Sinu väljalogimiskatse nurjus, sest see näis olevat katkise veebilehitseja või puhverserveri saadetud.',
+'createacct-another-realname-tip' => 'Tegelik nimi on valikuline.
+Kui otsustad selle sisestada, kasutatakse seda kasutaja töö temale omistamiseks.',
# Email sending
'php-mail-error-unknown' => 'Tundmatu tõrge PHP funktsioonis mail().',
@@ -802,8 +850,8 @@ Sisselogimise lõpetamiseks pead siia uue parooli sisestama:',
'newpassword' => 'Uus parool:',
'retypenew' => 'Sisesta uus parool uuesti:',
'resetpass_submit' => 'Sisesta parool ja logi sisse',
-'resetpass_success' => 'Sinu parool on edukalt muudetud!
-Sisselogimine...',
+'changepassword-success' => 'Sinu parool on edukalt muudetud!
+Sind logitakse nüüd sisse...',
'resetpass_forbidden' => 'Paroole ei saa muuta',
'resetpass-no-info' => 'Pead olema sisselogitud, et sellele lehele pääseda.',
'resetpass-submit-loggedin' => 'Muuda parool',
@@ -815,10 +863,11 @@ Võib-olla oled juba edukalt muudnud oma salasõna või taotlenud uut ajutist sa
# Special:PasswordReset
'passwordreset' => 'Parooli lähtestamine',
-'passwordreset-text' => 'Täida see vorm, et oma parool lähtestada.',
+'passwordreset-text-one' => 'Täida see vorm, et oma parool lähtestada.',
+'passwordreset-text-many' => '{{PLURAL:$1|Täida üks väljadest, et oma parool lähtestada.}}',
'passwordreset-legend' => 'Parooli lähtestamine',
'passwordreset-disabled' => 'Selles vikis on paroolide lähtestamine keelatud.',
-'passwordreset-pretext' => '{{PLURAL:$1||Sisesta üks järgmistest andmeüksustest.}}',
+'passwordreset-emaildisabled' => 'E-posti funktsioonid on selles vikis keelatud.',
'passwordreset-username' => 'Kasutajanimi:',
'passwordreset-domain' => 'Domeen:',
'passwordreset-capture' => 'Näita lähetatavat e-kirja?',
@@ -841,7 +890,7 @@ Peaksid nüüd sisse logima ja uue parooli valima. Kui selle palve esitas keegi
Ajutine parool: $2',
'passwordreset-emailsent' => 'Parooli lähtestamise e-kiri on saadetud.',
'passwordreset-emailsent-capture' => 'E-kirjatsi on saadetud allpool näidatav parooli lähtestuskiri.',
-'passwordreset-emailerror-capture' => 'Koostati allpool näidatav meeldetuletus, aga selle e-kirjatsi kasutajale saatmine ebaõnnestus: $1',
+'passwordreset-emailerror-capture' => 'Koostati allpool näidatav parooli lähtestuskiri, aga selle e-kirjatsi {{GENDER:$2|kasutajale}} saatmine ebaõnnestus: $1',
# Special:ChangeEmail
'changeemail' => 'E-posti aadressi muutmine',
@@ -855,6 +904,19 @@ Ajutine parool: $2',
'changeemail-submit' => 'Muuda e-posti aadress',
'changeemail-cancel' => 'Loobu',
+# Special:ResetTokens
+'resettokens' => 'Lubade lähtestamine',
+'resettokens-text' => 'Saad lähtestada load, mida on vaja siin sinu kontoga seotud kindlatele eraandmetele ligipääsuks.
+
+Peaksid load lähtestama, kui jagasid neid kogemata või kui su konto on kellegi teise võimusesse sattunud.',
+'resettokens-no-tokens' => 'Lähtestatavad load puuduvad.',
+'resettokens-legend' => 'Lubade lähtestamine',
+'resettokens-tokens' => 'Load:',
+'resettokens-token-label' => '$1 (praegune väärtus: $2)',
+'resettokens-watchlist-token' => '[[Special:Watchlist|Jälgimisloendis olevatel lehekülgedel tehtud muudatuste]] võrgutoite (Atom/RSS) luba',
+'resettokens-done' => 'Load lähtestatud.',
+'resettokens-resetbutton' => 'Lähtesta valitud load',
+
# Edit page toolbar
'bold_sample' => 'Rasvane kiri',
'bold_tip' => 'Rasvane kiri',
@@ -1052,11 +1114,14 @@ Allpool on esitatud lehekülje kustutamis- ja teisaldamislogi.',
Tundub, et see on kustutatud.',
'edit-conflict' => 'Redigeerimiskonflikt.',
'edit-no-change' => 'Sinu redigeerimist ignoreeriti, sest tekstile ei olnud tehtud muudatusi.',
+'postedit-confirmation' => 'Sinu muudatus on salvestatud.',
'edit-already-exists' => 'Ei saanud alustada uut lehekülge.
See on juba olemas.',
'defaultmessagetext' => 'Sõnumi vaiketekst',
'invalid-content-data' => 'Vigased sisuandmed',
'content-not-allowed-here' => 'Lehekülg [[$2]] ei või sisaldada $1.',
+'editwarning-warning' => 'Sellelt leheküljelt lahkumise tõttu võivad tehtud muudatused kaotsi minna.
+Kui oled sisse loginud, saad selle hoiatuse eelistuste alaosas "Toimetamine" keelata.',
# Content models
'content-model-wikitext' => 'vikiteksti',
@@ -1086,6 +1151,7 @@ Need argumendid on välja jäetud.",
'undo-failure' => 'Muudatust ei saa vahapeal tehtud redigeerimiste tõttu tühistada.',
'undo-norev' => 'Muudatust ei saanud tühistada, kuna seda ei ole või see kustutati.',
'undo-summary' => 'Eemaldatud muudatus $1, mille tegi [[Special:Contributions/$2|$2]] ([[User talk:$2|arutelu]])',
+'undo-summary-username-hidden' => 'Eemaldatud redaktsioon $1, mille tegi peidetud kasutaja',
# Account creation failure
'cantcreateaccounttitle' => 'Ei saa kontot luua',
@@ -1167,10 +1233,10 @@ Saad seda muudatust vaadata. [{{fullurl:{{#Special:Log}}/suppress|page={{FULLPAG
'revdelete-no-file' => 'Faili ei ole.',
'revdelete-show-file-confirm' => 'Kas oled kindel, et soovid häha faili "<nowiki>$1</nowiki>" kustutatud redaktsiooni, mis tehti $2 kell $3?',
'revdelete-show-file-submit' => 'Jah',
-'revdelete-selected' => "'''{{PLURAL:$2|Valitud versioon|Valitud versioonid}} artiklist [[:$1]]:'''",
+'revdelete-selected' => "'''Valitud {{PLURAL:$2|redaktsioon|redaktsioonid}} leheküljest [[:$1]]:'''",
'logdelete-selected' => "'''Valitud {{PLURAL:$1|logisissekanne|logisissekanded}}:'''",
-'revdelete-text' => "'''Kustutatud redaktsioonid kajastuvad endiselt lehe ajaloos ja logides, kuid osa nende sisust pole tavakasutajatele nähtav.'''
-{{GRAMMAR:genitive|{{SITENAME}}}} administraatorid saavad varjatud sisu siiski vaadata ning seda vajadusel taastada, kui see pole just täiendavalt ära keelatud.",
+'revdelete-text' => "'''Kustutatud redaktsioonid ja sündmused kajastuvad endiselt lehekülje ajaloos ja logides, kuid osa nende sisust pole avalikult nähtav.'''
+{{GRAMMAR:genitive|{{SITENAME}}}} administraatorid saavad peidetud sisu siiski vaadata ning seda vajadusel selle liidese kaudu taastada, kui see pole just täiendavalt keelatud.",
'revdelete-confirm' => 'Kinnita, et soovid tõesti seda teha ning et saad aru tagajärgedest ja tegevus on kooskõlas [[{{MediaWiki:Policy-url}}|siinsete kokkulepetega]].',
'revdelete-suppress-text' => "Andmed tuleks varjata '''ainult''' järgnevatel juhtudel:
* Sobimatu isiklik teave
@@ -1266,6 +1332,7 @@ Pane tähele, et navigeerimislinkide kasutamine lähtestab redaktsioonide valiku
'compareselectedversions' => 'Võrdle valitud redaktsioone',
'showhideselectedversions' => 'Muuda valitud redaktsioonide nähtavust',
'editundo' => 'eemalda',
+'diff-empty' => '(Erinevus puudub)',
'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.)',
'difference-missing-revision' => 'Selle erinevuste vaate {{PLURAL:$2|üht|$2}} redaktsiooni ($1) ei leitud.
@@ -1293,7 +1360,6 @@ Harilikult tähendab see seda, et sind siia juhatanud link on vananenud ja siin
'searchmenu-legend' => 'Otsingu sätted',
'searchmenu-exists' => "'''Lehekülg pealkirjaga \"[[:\$1]]\" on olemas.'''",
'searchmenu-new' => "'''Loo lehekülg pealkirjaga \"[[:\$1]]\".'''",
-'searchhelp-url' => 'Help:Sisukord',
'searchmenu-prefix' => '[[Special:PrefixIndex/$1|Sirvi selle eesliitega lehekülgi]]',
'searchprofile-articles' => 'Sisuleheküljed',
'searchprofile-project' => 'Abi- ja projektilehed',
@@ -1338,15 +1404,7 @@ päringu ees prefiksit ''all:''. Konkreetsest nimeruumist otsimiseks kasuta pref
'searchdisabled' => "Otsimine on preagu keelatud.
Vahepeal saad otsimiseks Google'it kasutada.
Pane tähele, et Google'is talletatud {{GRAMMAR:genitive|{{SITENAME}}}} sisu võib olla iganenud.",
-
-# Quickbar
-'qbsettings' => 'Kiirriba',
-'qbsettings-none' => 'Puudub',
-'qbsettings-fixedleft' => 'Püsivalt vasakul',
-'qbsettings-fixedright' => 'Püsivalt paremal',
-'qbsettings-floatingleft' => 'Ujuvalt vasakul',
-'qbsettings-floatingright' => 'Ujuvalt paremal',
-'qbsettings-directionality' => 'Fikseeritud, tulenevalt sinu keeles kasutatava kirja suunast',
+'search-error' => 'Otsimise ajal ilmnes tõrge: $1',
# Preferences page
'preferences' => 'Eelistused',
@@ -1380,7 +1438,6 @@ Pane tähele, et Google'is talletatud {{GRAMMAR:genitive|{{SITENAME}}}} sisu võ
'resetprefs' => 'Lähtesta eelistused',
'restoreprefs' => 'Taasta kõik vaike-eelistused (kõigil kaartidel)',
'prefs-editing' => 'Toimetamine',
-'prefs-edit-boxsize' => 'Toimetamise akna suurus.',
'rows' => 'Ridu:',
'columns' => 'Veerge:',
'searchresultshead' => 'Otsingutulemite sätted',
@@ -1391,9 +1448,9 @@ Pane tähele, et Google'is talletatud {{GRAMMAR:genitive|{{SITENAME}}}} sisu võ
'recentchangesdays-max' => 'Ülemmäär $1 {{PLURAL:$1|päev|päeva}}',
'recentchangescount' => 'Mitut redaktsiooni vaikimisi näidata:',
'prefs-help-recentchangescount' => 'See käib viimaste muudatuste, lehekülgede ajalugude ja logide kohta.',
-'prefs-help-watchlist-token' => 'Selle välja täitmine tekitab sinu jälgimisloendile RSS-toite.
-Igaüks, kes teab sellel väljal olevat võtit, saab lugeda sinu jälgimisloendit, seega vali turvaline väärtus.
-Siin on juhuslik väärtus, mida saad kasutada: $1',
+'prefs-help-watchlist-token2' => 'See on sinu jälgimisloendi võrgutoite salavõti.
+Igaüks, kes seda teab, saab lugeda sinu jälgimisloendit. Seega ära jaga seda.
+[[Special:ResetTokens|Klõpsa siia, kui sul on vaja see lähtestada]].',
'savedprefs' => 'Sinu eelistused on salvestatud.',
'timezonelegend' => 'Ajavöönd:',
'localtime' => 'Kohalik aeg:',
@@ -1424,7 +1481,6 @@ Siin on juhuslik väärtus, mida saad kasutada: $1',
'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:',
-'prefs-textboxsize' => 'Toimetamisakna suurus',
'youremail' => 'E-posti aadress:',
'username' => '{{GENDER:$1|Kasutajanimi}}:',
'uid' => '{{GENDER:$1|Kasutaja}} ID:',
@@ -1458,6 +1514,8 @@ See teave on avalik.',
'prefs-dateformat' => 'Kuupäeva vorming',
'prefs-timeoffset' => 'Ajavahe',
'prefs-advancedediting' => 'Ãœldsuvandid',
+'prefs-editor' => 'Redaktor',
+'prefs-preview' => 'Eelvaade',
'prefs-advancedrc' => 'Täpsemad eelistused',
'prefs-advancedrendering' => 'Täpsemad eelistused',
'prefs-advancedsearchoptions' => 'Täpsemad eelistused',
@@ -1465,7 +1523,9 @@ See teave on avalik.',
'prefs-displayrc' => 'Kuvasätted',
'prefs-displaysearchoptions' => 'Kuvasätted',
'prefs-displaywatchlist' => 'Kuvasätted',
+'prefs-tokenwatchlist' => 'Luba',
'prefs-diffs' => 'Erinevused',
+'prefs-help-prefershttps' => 'See eelistus jõustub pärast järgmist sisselogimist.',
# User preference: email validation using jQuery
'email-address-validity-valid' => 'Sobiv e-posti aadress',
@@ -1492,6 +1552,8 @@ See teave on avalik.',
'userrights-notallowed' => 'Sul pole õigust kasutajaõigusi lisada ega eemaldada.',
'userrights-changeable-col' => 'Rühmad, mida sa saad muuta',
'userrights-unchangeable-col' => 'Rühmad, mida sa ei saa muuta',
+'userrights-conflict' => 'Kasutajaõiguste muutmise konflikt! Palun vaata oma muudatused üle ja kinnita need.',
+'userrights-removed-self' => 'Võtsid edukalt endalt õigused. Seetõttu sellele leheküljele sa enam ligi ei pääse.',
# Groups
'group' => 'Rühm:',
@@ -1557,11 +1619,19 @@ See teave on avalik.',
'right-proxyunbannable' => 'Mööduda automaatsetest puhverserveri blokeeringutest',
'right-unblockself' => 'Eemaldada enda blokeeringut',
'right-protect' => 'Muuta kaitsetasemeid ja redigeerida kaskaadkaitsega lehekülgi',
-'right-editprotected' => 'Muuta kaitstud lehekülgi, millel ei ole kaskaadkaitset',
+'right-editprotected' => 'Muuta lehekülgi kaitsetasemega "{{int:protect-level-sysop}}"',
+'right-editsemiprotected' => 'Muuta lehekülgi kaitsetasemega "{{int:protect-level-autoconfirmed}}"',
'right-editinterface' => 'Muuta kasutajaliidest',
'right-editusercssjs' => 'Redigeerida teiste kasutajate CSS- ja JS-faile',
'right-editusercss' => 'Redigeerida teiste kasutajate CSS-faile',
'right-edituserjs' => 'Redigeerida teiste kasutajate JS-faile',
+'right-editmyusercss' => 'Redigeerida oma CSS-kasutajafaile',
+'right-editmyuserjs' => 'Redigeerida oma JavaScript-kasutajafaile',
+'right-viewmywatchlist' => 'Vaadata oma jälgimisloendit',
+'right-editmywatchlist' => 'Redigeerida oma jälgimisloendit. Pane tähele, et mõne toiminguga lisatakse lehekülgi siiski ka ilma selle õiguseta.',
+'right-viewmyprivateinfo' => 'Vaadata oma eraandmeid (nt e-posti aadress, pärisnimi)',
+'right-editmyprivateinfo' => 'Redigeerida oma eraandmeid (nt e-posti aadress, pärisnimi)',
+'right-editmyoptions' => 'Muuta oma eelistusi',
'right-rollback' => 'Tühistada otsekohe lehekülje viimase redigeerija muudatused',
'right-markbotedits' => 'Märkida muudatuse tühistamine robotimuudatusena',
'right-noratelimit' => 'Hoiduda piirangumääradest',
@@ -1623,12 +1693,19 @@ See teave on avalik.',
'action-userrights-interwiki' => 'teiste vikide kasutajate õigusi muuta',
'action-siteadmin' => 'andmebaasi lukustada või avada',
'action-sendemail' => 'e-kirju saata',
+'action-editmywatchlist' => 'oma jälgimisloendit redigeerida',
+'action-viewmywatchlist' => 'oma jälgimisloendit vaadata',
+'action-viewmyprivateinfo' => 'oma eraandmeid vaadata',
+'action-editmyprivateinfo' => 'oma eraandmeid redigeerida',
# Recent changes
'nchanges' => '$1 {{PLURAL:$1|muudatus|muudatust}}',
+'enhancedrc-since-last-visit' => '$1 {{PLURAL:$1|viimase vaatamise järel}}',
+'enhancedrc-history' => 'ajalugu',
'recentchanges' => 'Viimased muudatused',
'recentchanges-legend' => 'Viimaste muudatuste seaded',
'recentchanges-summary' => 'Jälgi sellel leheküljel viimaseid muudatusi.',
+'recentchanges-noresult' => 'Selles ajavahemikus pole tehtud neile kriteeriumitele vastavaid muudatusi.',
'recentchanges-feed-description' => 'Jälgi vikisse tehtud viimaseid muudatusi.',
'recentchanges-label-newpage' => 'See muudatus lõi uue lehekülje',
'recentchanges-label-minor' => 'See on pisiparandus',
@@ -1665,7 +1742,6 @@ See teave on avalik.',
'recentchangeslinked-feed' => 'Seotud muudatused',
'recentchangeslinked-toolbox' => 'Seotud muudatused',
'recentchangeslinked-title' => 'Leheküljega "$1" seotud muudatused',
-'recentchangeslinked-noresult' => 'Antud ajavahemiku jooksul ei ole lingitud lehekülgedel muudatusi tehtud.',
'recentchangeslinked-summary' => "Siin on loetletud määratud leheküljelt viidatud (või määratud kategooria) lehekülgedel tehtud viimased muudatused.
Sinu [[Special:Watchlist|jälgimisloendi]] leheküljed on '''rasvaselt''' esile toodud.",
'recentchangeslinked-page' => 'Lehekülje nimi:',
@@ -1677,7 +1753,7 @@ Sinu [[Special:Watchlist|jälgimisloendi]] leheküljed on '''rasvaselt''' esile
'reuploaddesc' => 'Tagasi üleslaadimise vormi juurde.',
'upload-tryagain' => 'Salvesta muudetud faili kirjeldus',
'uploadnologin' => 'Sisse logimata',
-'uploadnologintext' => 'Kui soovid faile üles laadida, pead [[Special:UserLogin|sisse logima]].',
+'uploadnologintext' => 'Pead $1, et faili üles laadida.',
'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',
@@ -1880,7 +1956,6 @@ Turvakaalutlustel on img_auth.php kasutus keelatud.',
'http-read-error' => 'HTTP-lugemistõrge.',
'http-timed-out' => 'HTTP-päring aegus.',
'http-curl-error' => 'Tõrge URL-i $1 lugemisel',
-'http-host-unreachable' => 'Internetiaadress pole kättesaadav.',
'http-bad-status' => 'HTTP-päringu ajal ilmnes tõrge: $1 $2',
# Some likely curl errors. More could be added from <http://curl.haxx.se/libcurl/c/libcurl-errors.html>
@@ -1911,6 +1986,10 @@ Samuti võid proovida siis, kui võrgukoht on vähem hõivatud.',
'listfiles_size' => 'Suurus',
'listfiles_description' => 'Kirjeldus',
'listfiles_count' => 'Versioonid',
+'listfiles-show-all' => 'Kaasa arvatud piltide vanad versioonid',
+'listfiles-latestversion' => 'Praegune versioon',
+'listfiles-latestversion-yes' => 'Jah',
+'listfiles-latestversion-no' => 'Ei',
# File description page
'file-anchor-link' => 'Pilt',
@@ -2004,6 +2083,13 @@ Sisesta kujul tüüp/alamtüüp, näiteks <code>image/jpeg</code>.',
'randompage' => 'Juhuslik artikkel',
'randompage-nopages' => '{{PLURAL:$2|Järgmises nimeruumis|Järgmistes nimeruumides}} ei ole ühtegi lehekülge: $1.',
+# Random page in category
+'randomincategory' => 'Juhuslik lehekülg kategoorias',
+'randomincategory-invalidcategory' => '"$1" pole sobiv kategooria nimi.',
+'randomincategory-nopages' => 'Kategoorias "[[:Category:$1|$1]]" puuduvad leheküljed.',
+'randomincategory-selectcategory' => 'Hangi juhuslik lehekülg kategooriast: $1 $2.',
+'randomincategory-selectcategory-submit' => 'Mine',
+
# Random redirect
'randomredirect' => 'Juhuslik ümbersuunamine',
'randomredirect-nopages' => 'Nimeruumis "$1" ei ole ümbersuunamislehekülgi.',
@@ -2029,17 +2115,13 @@ Sisesta kujul tüüp/alamtüüp, näiteks <code>image/jpeg</code>.',
'statistics-users-active-desc' => 'Kasutajad, kes on viimase {{PLURAL:$1|päeva|$1 päeva}} jooksul tegutsenud',
'statistics-mostpopular' => 'Enim vaadatud leheküljed',
-'disambiguations' => 'Täpsustuslehekülgedele linkivad leheküljed',
-'disambiguationspage' => 'Template:Täpsustuslehekülg',
-'disambiguations-text' => "Järgmised leheküljed sisaldavad vähemalt üht linki '''täpsustusleheküljele'''.
-Võimalik, et sellised lingid peaks viitama sobivamatele lehekülgedele.
-Lehekülg loetakse täpsustusleheküljeks, kui see kasutab malli, millele viitab sõnum [[MediaWiki:Disambiguationspage]].",
-
'pageswithprop' => 'Leheatribuudiga leheküljed',
'pageswithprop-legend' => 'Leheatribuudiga leheküljed',
'pageswithprop-text' => 'Sellel leheküljel on loetletud mõnd leheatribuuti kasutavad leheküljed.',
'pageswithprop-prop' => 'Atribuudi nimi:',
'pageswithprop-submit' => 'Mine',
+'pageswithprop-prophidden-long' => 'pika tekstiatribuudi väärtus peidetud ($1)',
+'pageswithprop-prophidden-binary' => 'kahendatribuudi väärtus peidetud ($1)',
'doubleredirects' => 'Kahekordsed ümbersuunamised',
'doubleredirectstext' => 'Käesolev leht esitab loendi lehtedest, mis sisaldavad ümbersuunamisi teistele ümbersuunamislehtedele.
@@ -2097,6 +2179,7 @@ Igal real on ära toodud esimene ja teine ümbersuunamisleht ning samuti teise Ã
'mostrevisions' => 'Kõige pikema redigeerimislooga leheküljed',
'prefixindex' => 'Kõik pealkirjad eesliitega',
'prefixindex-namespace' => 'Kõik pealkirjad eesliitega (nimeruumis $1)',
+'prefixindex-strip' => 'Ära näita loendis eesliidet',
'shortpages' => 'Lühikesed leheküljed',
'longpages' => 'Pikad leheküljed',
'deadendpages' => 'Edasipääsuta leheküljed',
@@ -2112,6 +2195,7 @@ Igal real on ära toodud esimene ja teine ümbersuunamisleht ning samuti teise Ã
'listusers' => 'Kasutajad',
'listusers-editsonly' => 'Näita vaid kasutajaid, kes on teinud muudatusi',
'listusers-creationsort' => 'Järjesta konto loomise aja järgi',
+'listusers-desc' => 'Järjesta laskuvalt',
'usereditcount' => '$1 {{PLURAL:$1|redigeerimine|redigeerimist}}',
'usercreated' => 'Konto {{GENDER:$3|loomise}} aeg: $1 kell $2',
'newpages' => 'Uued leheküljed',
@@ -2288,10 +2372,9 @@ Edasised muudatused sellel leheküljel ja seotud aruteluleheküljel tuuakse ära
'unwatchthispage' => 'Ära jälgi',
'notanarticle' => 'Pole artikkel',
'notvisiblerev' => 'Redaktsioon on kustutatud',
-'watchnochange' => 'Valitud ajavahemiku jooksul pole ühelgi jälgitaval leheküljel muudatusi tehtud.',
'watchlist-details' => 'Jälgimisloendis on {{PLURAL:$1|$1 lehekülg|$1 lehekülge}} (ei arvestata arutelulehekülgi).',
-'wlheader-enotif' => '* E-posti teel teavitamine on aktiveeritud.',
-'wlheader-showupdated' => "* Leheküljed, mida on muudetud peale sinu viimast külastust, on '''rasvases kirjas'''.",
+'wlheader-enotif' => 'E-posti teel teavitamine on lubatud.',
+'wlheader-showupdated' => "Leheküljed, mida on muudetud peale sinu viimast külastust, on '''rasvases kirjas'''.",
'watchmethod-recent' => 'jälgitud lehekülgedel tehtud viimaste muudatuste läbivaatamine',
'watchmethod-list' => 'jälgitavate lehekülgede viimased muudatused',
'watchlistcontains' => 'Sinu jälgimisloendis on $1 {{PLURAL:$1|lehekülg|lehekülge}}.',
@@ -2541,7 +2624,7 @@ $1',
'contributions' => '{{GENDER:$1|Kasutaja}} kaastöö',
'contributions-title' => 'Kasutaja $1 kaastöö',
'mycontris' => 'Kaastöö',
-'contribsub2' => 'Kasutaja $1 ($2) jaoks',
+'contribsub2' => 'Kasutaja {{GENDER:$3|$1}} ($2) jaoks',
'nocontribs' => 'Antud kriteeriumitele vastavaid muudatusi ei leitud.',
'uctop' => '(praegune)',
'month' => 'Alates kuust (ja varasemad):',
@@ -2698,11 +2781,8 @@ Blokeering võib juba eemaldatud olla.',
See kuulub aga blokeeritud IP-vahemikku $2, mille blokeeringut saab eemaldada.',
'ip_range_invalid' => 'Vigane IP-vahemik.',
'ip_range_toolarge' => 'Suuremad aadressiblokid kui /$1 pole lubatud.',
-'blockme' => 'Blokeeri mind',
'proxyblocker' => 'Proksiblokeerija',
-'proxyblocker-disabled' => 'See funktsioon ei toimi.',
'proxyblockreason' => 'Sinu IP-aadress on blokeeritud, sest see on avatud proksi. Palun võta ühendust oma internetiteenuse pakkujaga või tehnilise toega ja teata neile sellest probleemist.',
-'proxyblocksuccess' => 'Tehtud.',
'sorbsreason' => 'Sinu IP-aadress on {{GRAMMAR:genitive|{{SITENAME}}}} kasutatavas DNS-põhises mustas nimekirjas märgitud kui avatud proksi.',
'sorbs_create_account_reason' => 'Sinu IP-aadress on {{GRAMMAR:genitive|{{SITENAME}}}} kasutatavas DNS-põhises mustas nimekirjas märgitud kui avatud proksi.
Sa ei saa kasutajakontot luua.',
@@ -2867,6 +2947,8 @@ Kui soovid MediaWiki tarkvara tõlkimises osaleda, siis vaata lehti [//www.media
'thumbnail-more' => 'Suurenda',
'filemissing' => 'Fail puudub',
'thumbnail_error' => 'Viga pisipildi loomisel: $1',
+'thumbnail_error_remote' => 'Tõrketeade asukohast $1:
+$2',
'djvu_page_error' => 'DjVu-failis ei ole sellist lehekülge',
'djvu_no_xml' => 'DjVu failist XML-i lugemine ebaõnnestus.',
'thumbnail-temp-create' => 'Ajutist pisipildifaili ei õnnestu luua.',
@@ -3020,7 +3102,6 @@ Samuti võimaldab see resümee reale põhjenduse lisamist.',
# Stylesheets
'common.css' => '/* Siin olevat CSS-i kasutavad kõik kujundused. */',
-'standard.css' => '/* Siin olev CSS puudutab Standard-kujunduse kasutajaid. */',
# Scripts
'common.js' => '/* Siinne JavaScript laaditakse igale kasutajatele igal laaditud leheküljel. */',
@@ -3097,13 +3178,8 @@ See on ilmselt põhjustatud linkimisest mustas nimekirjas olevasse välisvõrguk
'pageinfo-category-files' => 'Failide arv',
# Skin names
-'skinname-standard' => 'Algeline',
-'skinname-nostalgia' => 'Nostalgia',
'skinname-cologneblue' => 'Kölni sinine',
'skinname-monobook' => 'MonoBook',
-'skinname-myskin' => 'Minu kujundus',
-'skinname-chick' => 'Tibu',
-'skinname-simple' => 'Lihtne',
'skinname-modern' => 'Uudne',
'skinname-vector' => 'Vektor',
@@ -3183,11 +3259,25 @@ Järgnevas loendis, mis on sorteeritud $2, on '''$1''' {{PLURAL:$1|fail|faili}}.
'minutes' => '{{PLURAL:$1|üks minut|$1 minutit}}',
'hours' => '{{PLURAL:$1|üks tund|$1 tundi}}',
'days' => '{{PLURAL:$1|üks päev|$1 päeva}}',
+'weeks' => '{{PLURAL:$1|$1 nädal|$1 nädalat}}',
'months' => '{{PLURAL:$1|Ãœks kuu|$1 kuud}}',
'years' => '{{PLURAL:$1|Ãœks aasta|$1 aastat}}',
'ago' => '$1 tagasi',
'just-now' => 'just nüüd',
+# Human-readable timestamps
+'hours-ago' => '$1 {{PLURAL:$1|tund|tundi}} tagasi',
+'minutes-ago' => '$1 {{PLURAL:$1|minut|minutit}} tagasi',
+'seconds-ago' => '$1 {{PLURAL:$1|sekund|sekundit}} tagasi',
+'monday-at' => 'Esmaspäeval kell $1',
+'tuesday-at' => 'Teisipäeval kell $1',
+'wednesday-at' => 'Kolmapäeval kell $1',
+'thursday-at' => 'Neljapäeval kell $1',
+'friday-at' => 'Reedel kell $1',
+'saturday-at' => 'Laupäeval kell $1',
+'sunday-at' => 'Pühapäeval kell $1',
+'yesterday-at' => 'Eile kell $1',
+
# Bad image list
'bad_image_list' => 'Arvesse võetakse ainult nimekirja ühikud (read, mis algavad sümboliga *).
Esimene link real peab olema link kõlbmatule failile.
@@ -3221,7 +3311,7 @@ Kui faili on rakendustarkvaraga töödeldud, võib osa andmeid olla muudetud võ
* gpslongitude
* gpsaltitude',
-# EXIF tags
+# Exif tags
'exif-imagewidth' => 'Laius',
'exif-imagelength' => 'Kõrgus',
'exif-bitspersample' => 'Bitti komponendi kohta',
@@ -3381,7 +3471,7 @@ Kui faili on rakendustarkvaraga töödeldud, võib osa andmeid olla muudetud võ
'exif-originalimageheight' => 'Pildi kõrgus enne kärpimist',
'exif-originalimagewidth' => 'Pildi laius enne kärpimist',
-# EXIF attributes
+# Exif attributes
'exif-compression-1' => 'Pakkimata',
'exif-copyrighted-true' => 'Kaitstud',
@@ -3750,7 +3840,6 @@ Sa võid [[Special:EditWatchlist|kasutada ka harilikku tekstiredaktorit]].',
'version-other' => 'Muu',
'version-mediahandlers' => 'Meediatöötlejad',
'version-hooks' => 'Haagid',
-'version-extension-functions' => 'Lisafunktsioonid',
'version-parser-extensiontags' => 'Parseri lisamärgendid',
'version-parser-function-hooks' => 'Parserifunktsioonid',
'version-hook-name' => 'Haagi nimi',
@@ -3759,6 +3848,7 @@ Sa võid [[Special:EditWatchlist|kasutada ka harilikku tekstiredaktorit]].',
'version-license' => 'Litsents',
'version-poweredby-credits' => "See viki kasutab '''[//www.mediawiki.org/ MediaWiki]''' tarkvara. Autoriõigus © 2001–$1 $2.",
'version-poweredby-others' => 'teised',
+'version-poweredby-translators' => 'translatewiki.net-i tõlkijad',
'version-credits-summary' => 'Tahame tunnustada järgmisi inimesi [[Special:Version|MediaWikile]] tehtud kaastöö eest.',
'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.
@@ -3772,12 +3862,17 @@ GNU Ãœldise Avaliku Litsentsi [{{SERVER}}{{SCRIPTPATH}}/COPYING eksemplar] peaks
'version-entrypoints-header-entrypoint' => 'Sisendpunkt',
'version-entrypoints-header-url' => 'URL',
-# Special:FilePath
-'filepath' => 'Failitee',
-'filepath-page' => 'Fail:',
-'filepath-submit' => 'Mine',
-'filepath-summary' => 'See erileht määrab otsitava failini viiva tee.
-Pilt kuvatakse algupärases suuruses, muu fail avatakse koheselt seostuva programmiga.',
+# Special:Redirect
+'redirect' => 'Ümbersuunamine faili, kasutaja või redaktsiooni identifikaatori järgi',
+'redirect-legend' => 'Ümbersuunamine faili juurde või leheküljele',
+'redirect-summary' => 'See erilehekülg suunab ümber faili (toodud failinimi), lehekülje (toodud redaktsiooni identifikaator) või kasutajalehekülje (toodud numbriline kasutaja identfikaator) juurde.',
+'redirect-submit' => 'Mine',
+'redirect-lookup' => 'Leia:',
+'redirect-value' => 'Väärtus:',
+'redirect-user' => 'Kasutaja identifikaator',
+'redirect-revision' => 'Lehekülje redaktsioon',
+'redirect-file' => 'Failinimi',
+'redirect-not-exists' => 'Väärtust ei leitud',
# Special:FileDuplicateSearch
'fileduplicatesearch' => 'Faili duplikaatide otsimine',
@@ -3827,12 +3922,16 @@ Pilt kuvatakse algupärases suuruses, muu fail avatakse koheselt seostuva progra
'tags' => 'Käibivad muudatusmärgised',
'tag-filter' => '[[Special:Tags|Märgisefilter]]:',
'tag-filter-submit' => 'Filtri',
+'tag-list-wrapper' => '([[Special:Tags|{{PLURAL:$1|Märgis|Märgised}}]]: $2)',
'tags-title' => 'Märgised',
'tags-intro' => 'See lehekülg loetleb märgised, millega tarkvara võib muudatused märgistada, ja nende kirjeldused.',
'tags-tag' => 'Märgise nimi',
'tags-display-header' => 'Tähistus muudatusloendis',
'tags-description-header' => 'Täiskirjeldus',
+'tags-active-header' => 'Aktiivne?',
'tags-hitcount-header' => 'Märgistatud muudatused',
+'tags-active-yes' => 'Jah',
+'tags-active-no' => 'Ei',
'tags-edit' => 'muuda',
'tags-hitcount' => '$1 {{PLURAL:$1|muudatus|muudatust}}',
@@ -3853,6 +3952,7 @@ Pilt kuvatakse algupärases suuruses, muu fail avatakse koheselt seostuva progra
'dberr-problems' => 'Kahjuks on sellel saidil tehnilisi probleeme',
'dberr-again' => 'Oota mõni hetk ja laadi lehekülg uuesti.',
'dberr-info' => '(Ei saa ühendust andmebaasi serveriga: $1)',
+'dberr-info-hidden' => '(Andmebaasiserveriga ei saa ühendust.)',
'dberr-usegoogle' => "Proovi vahepeal otsida Google'ist.",
'dberr-outofdate' => "Pane tähele, et Google'is talletatud meie sisu võib olla iganenud.",
'dberr-cachederror' => 'See koopia taotletud leheküljest on vahemälus ja ei pruugi olla ajakohane.',
@@ -3868,6 +3968,9 @@ Pilt kuvatakse algupärases suuruses, muu fail avatakse koheselt seostuva progra
'htmlform-submit' => 'Saada',
'htmlform-reset' => 'Tühista muudatused',
'htmlform-selectorother-other' => 'Muu',
+'htmlform-no' => 'Ei',
+'htmlform-yes' => 'Jah',
+'htmlform-chosen-placeholder' => 'Vali säte',
# SQLite database support
'sqlite-has-fts' => '$1 koos täistekstiotsingu toega',
@@ -3985,4 +4088,19 @@ Kui ei, kasuta allolevat lihtsat vormi. Sinu kommentaar lisatakse koos kasutajan
# Image rotation
'rotate-comment' => 'Pilti pööratud $1 {{PLURAL:$1|kraad|kraadi}} päripäeva',
+# Limit report
+'limitreport-title' => 'Parseri profiilimisandmed:',
+'limitreport-cputime' => 'Protsessoriaja kasutus',
+'limitreport-cputime-value' => '$1 {{PLURAL:$1|sekund|sekundit}}',
+'limitreport-walltime' => 'Reaalaja kasutus',
+'limitreport-walltime-value' => '$1 {{PLURAL:$1|sekund|sekundit}}',
+'limitreport-ppvisitednodes' => 'Eelprotsessori külastatud sõlmede arv',
+'limitreport-ppgeneratednodes' => 'Eelprotsessori genereeritud sõlmede arv',
+'limitreport-postexpandincludesize' => 'Hõrendusjärgne kaasa arvatav suurus',
+'limitreport-postexpandincludesize-value' => '$1/$2 {{PLURAL:$2|bait|baiti}}',
+'limitreport-templateargumentsize' => 'Malli argumendi suurus',
+'limitreport-templateargumentsize-value' => '$1/$2 {{PLURAL:$2|bait|baiti}}',
+'limitreport-expansiondepth' => 'Suurim hõrendussügavus',
+'limitreport-expensivefunctioncount' => 'Kulukate parserifunktsioonide arv',
+
);
diff --git a/languages/messages/MessagesEu.php b/languages/messages/MessagesEu.php
index 11cf9272..7749d0d9 100644
--- a/languages/messages/MessagesEu.php
+++ b/languages/messages/MessagesEu.php
@@ -14,6 +14,7 @@
* @author Kaustubh
* @author Kobazulo
* @author Malafaya
+ * @author Nemo bis
* @author Reedy
* @author Theklan
* @author Unai Fdz. de Betoño
@@ -155,9 +156,6 @@ $messages = array(
'tog-shownumberswatching' => 'Jarraitzen duen erabiltzaile kopurua erakutsi',
'tog-oldsig' => 'Egungo sinadura:',
'tog-fancysig' => 'Sinadura wikitestu gisa tratatu (lotura automatikorik gabe)',
-'tog-externaleditor' => 'Lehenetsi bezala kanpoko editore bat erabili (adituentzako bakarrik, zure ordenagailuak konfigurazio berezia izan behar du. [//www.mediawiki.org/wiki/Manual:External_editors Informazio gehiago.])',
-'tog-externaldiff' => 'Lehenetsi bezala kanpoko diff erreminta erabili (adituentzako bakarrik, zure ordenagailuak konfigurazio berezia izan behar du. [//www.mediawiki.org/wiki/Manual:External_editors Informazio gehiago.])',
-'tog-showjumplinks' => '"Hona jo" irisgarritasun loturak gaitu',
'tog-uselivepreview' => 'Zuzeneko aurrebista erakutsi (JavaScript) (Proba fasean)',
'tog-forceeditsummary' => 'Aldaketaren laburpena zuri uzterakoan ohartarazi',
'tog-watchlisthideown' => 'Segimendu zerrendan nire aldaketak ezkutatu',
@@ -170,6 +168,7 @@ $messages = array(
'tog-diffonly' => "''Diff''-ak agertzen direnean, orrialdearen edukiera ezkutatu",
'tog-showhiddencats' => 'Ikusi kategoria ezkutuak',
'tog-norollbackdiff' => 'Rollback bat egin ondoren ezberdintasunak ez hartu aintzat',
+'tog-useeditwarning' => 'Abisa nazazu gorde gabeko aldaketak eginez orrialde bat uzten dudanean',
'underline-always' => 'Beti',
'underline-never' => 'Inoiz ez',
@@ -233,6 +232,18 @@ $messages = array(
'oct' => 'Urr',
'nov' => 'Aza',
'dec' => 'Abe',
+'january-date' => 'Urtarrilaren $1',
+'february-date' => 'Otsailaren $1',
+'march-date' => 'Martxoaren $1',
+'april-date' => 'Apirilaren $1',
+'may-date' => 'Maiatzaren $1',
+'june-date' => 'Ekainaren $1',
+'july-date' => 'Uztailaren $1',
+'august-date' => 'Abuztuaren $1',
+'september-date' => 'Irailaren $1',
+'october-date' => 'Urriaren $1',
+'november-date' => 'Azaroaren $1',
+'december-date' => 'Abenduaren $1',
# Categories related messages
'pagecategories' => '{{PLURAL:$1|Kategoria|Kategoriak}}',
@@ -314,6 +325,7 @@ $messages = array(
'create-this-page' => 'Orrialde hau sortu',
'delete' => 'Ezabatu',
'deletethispage' => 'Ezabatu orri hau',
+'undeletethispage' => 'Orrialde hau bergaitu',
'undelete_short' => 'Berreskuratu {{PLURAL:$1|aldaketa bat|$1 aldaketa}}',
'viewdeleted_short' => 'Ikusi ezabatutako {{PLURAL:$1|bidalketa bat|$1 bidalketa}}',
'protect' => 'Babestu',
@@ -357,7 +369,7 @@ $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).
+# 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).
'aboutsite' => '{{SITENAME}}(e)ri buruz',
'aboutpage' => 'Project:Honi_buruz',
'copyright' => 'Eduki guztia $1(r)en babespean dago.',
@@ -367,7 +379,6 @@ $1',
'disclaimers' => 'Mugaketak',
'disclaimerpage' => 'Project:Erantzukizunen mugaketa orokorra',
'edithelp' => 'Aldaketak egiteko laguntza',
-'edithelppage' => 'Help:Aldaketak egiteko laguntza',
'helppage' => 'Help:Laguntza',
'mainpage' => 'Azala',
'mainpage-description' => 'Azala',
@@ -444,17 +455,6 @@ Existitzen direnen zerrenda ikus dezakezu [[Special:SpecialPages|{{int:specialp
# General errors
'error' => 'Errorea',
'databaseerror' => 'Datu-base errorea',
-'dberrortext' => 'Datu-basean kontsulta egiterakoan sintaxi errore bat gertatu da.
-Baliteke softwareak bug bat izatea.
-Datu-basean egindako azken kontsulta:
-<blockquote><code>$1</code></blockquote>
-funtzio honekin: "<code>$2</code>".
-Datu-baseak emandako errorea: "<samp>$3: $4</samp>".',
-'dberrortextcl' => 'Datu-basean kontsulta egiterakoan sintaxi errore bat gertatu da.
-Datu-basean egindako azken kontsulta:
-"$1"
-funtzio honekin: "$2".
-Datu-baseak emandako errore informazioa: "$3: $4"',
'laggedslavemode' => 'Oharra: Baliteke orrialde honetan azken aldaketak ez erakustea.',
'readonly' => 'Datu-basea blokeatuta dago',
'enterlockreason' => 'Zehaztu blokeatzeko arrazoia, noiz kenduko den jakinaraziz',
@@ -509,12 +509,13 @@ Wiki guztientzako aldaketak egin edo gehitzeko, mesedez erabili [//translatewiki
'editinginterface' => "'''Oharra:''' Softwarearen interfazerako testua duen orri bat aldatzen ari zara.
Orri honetako aldaketek wiki honetako erabiltzaile guztiei eragingo diete.
Itzulpenetarako, erabil ezazu [//translatewiki.net/ translatewiki.net], MediaWiki proiektuan.",
-'sqlhidden' => '(ezkutuko SQL kontsulta)',
'cascadeprotected' => "Orrialde hau aldaketen aurka babestua dago, ''kaskada'' aukerarekin babestu {{PLURAL:$1|duten orrialde honetan|dituzten orrialde hauetan}} txertaturik dagoelako:
$2",
'namespaceprotected' => "Ez daukazu '''$1''' izen-tarteko orrialdeak aldatzeko baimenik.",
'customcssprotected' => 'Ez duzu baimenik CSS orrialde hau aldatzeko beste erabiltzaile baten hobespen pertsonalak dituelako.',
'customjsprotected' => 'Ez duzu baimenik JavaScript orrialde hau aldatzeko beste erabiltzaile baten hobespen pertsonalak dituelako.',
+'mycustomcssprotected' => 'Ez duzu baimenik CSS orrialde hau aldatzeko.',
+'mycustomjsprotected' => 'Ez duzu baimentik JavaScript orrialdea aldatzeko.',
'ns-specialprotected' => 'Ezin dira {{ns:special}} izen-tarteko orrialdeak editatu.',
'titleprotected' => "[[User:$1|$1]]ek izenburu hau sortzea ekidin zuen.
Emandako arrazoia ''$2'' izan zen.",
@@ -540,10 +541,19 @@ Kontuan izan orrialde batzuk saioa hasita bazenu bezala ikus ditzakezula nabigat
'welcomecreation-msg' => 'Zure kontua sortua izan da.
Ez ezazu ahaztu zure [[Special:Preferences|{{SITENAME}} hobespenak]] aldatzea.',
'yourname' => 'Erabiltzaile izena',
+'userlogin-yourname' => 'Erabiltzale izena',
+'userlogin-yourname-ph' => 'Sartu zure erabiltzaile izena',
+'createacct-another-username-ph' => 'Lankide-izena idatzi',
'yourpassword' => 'Pasahitza:',
+'userlogin-yourpassword' => 'Pasahitza',
+'userlogin-yourpassword-ph' => 'Sartu zuren pasahitza',
+'createacct-yourpassword-ph' => 'Sartu pasahitza',
'yourpasswordagain' => 'Pasahitza berriz',
+'createacct-yourpasswordagain' => 'Pasahitza berridatzi',
+'createacct-yourpasswordagain-ph' => 'Sartu pasahitza berriro ere',
'remembermypassword' => 'Nire saioa ordenagailu honetan gogoratu ({{PLURAL:$1|egun baterako|$1 egunetarako }} gehienez)',
-'securelogin-stick-https' => 'Mantendu konektatua HTTPSra sartu ondoren',
+'userlogin-remembermypassword' => 'Manten nazazu barruan',
+'userlogin-signwithsecure' => 'Erabili konexio ziurra',
'yourdomainname' => 'Zure domeinua',
'password-change-forbidden' => 'Ezin duzu pasahitzarik aldatu wiki honetan.',
'externaldberror' => 'Kanpoko datu-base autentifikazio errorea gertatu da edo ez duzu zure kanpo kontua eguneratzeko baimenik.',
@@ -555,18 +565,40 @@ Ez ezazu ahaztu zure [[Special:Preferences|{{SITENAME}} hobespenak]] aldatzea.',
'logout' => 'Saioa itxi',
'userlogout' => 'Saioa itxi',
'notloggedin' => 'Saioa hasi gabe',
+'userlogin-noaccount' => 'Ez al duzu konturik?',
+'userlogin-joinproject' => 'Batu {{SITENAME}}(r)ekin',
'nologin' => "Ez duzu erabiltzaile konturik? '''$1'''.",
'nologinlink' => 'Kontua sortu',
'createaccount' => 'Kontua sortu',
'gotaccount' => "Baduzu erabiltzaile kontua? '''$1'''.",
'gotaccountlink' => 'Saioa hasi',
'userlogin-resetlink' => 'Saioa hasteko datuak ahaztu dituzu?',
+'userlogin-resetpassword-link' => 'Zure pasahitza berrezarri',
+'helplogin-url' => 'Help:Sarrera',
+'userlogin-helplink' => '[[{{MediaWiki:helplogin-url}}|Barrura sartzeko laguntza]]',
+'createacct-join' => 'Sartu zure informazioa azpian.',
+'createacct-emailrequired' => 'E-posta helbidea',
+'createacct-emailoptional' => 'E-posta helbidea (hautazkoa)',
+'createacct-email-ph' => 'Sartu zure e-posta helbidea',
+'createacct-another-email-ph' => 'Posta elektronikoaren helbidea sartu',
'createaccountmail' => 'Erabili behin-behineko pasahitz ausazko bat eta bidali behean agertzeko den e-posta helbidera',
+'createacct-realname' => 'Benetako izena (hautazkoa)',
'createaccountreason' => 'Arrazoia:',
+'createacct-reason' => 'Arrazoia',
+'createacct-reason-ph' => 'Zergatik ari zaren beste erabiltzaile kontu bat',
+'createacct-captcha' => 'Segurtasun froga',
+'createacct-imgcaptcha-ph' => 'Sartu gainean ikusten duzun testua',
+'createacct-submit' => 'Kontua sortu',
+'createacct-another-submit' => 'Beste kontu bat sortu',
+'createacct-benefit-heading' => '{{SITENAME}} zu bezalako pertsonek egiten dute.',
+'createacct-benefit-body1' => '{{PLURAL:$1|edizio bat|$1 edizio}}',
+'createacct-benefit-body2' => '{{PLURAL:$1|Orrialde 1|$1 orrialde}}',
+'createacct-benefit-body3' => 'azkeneko {{PLURAL:$1|egilea|egileak}}',
'badretype' => 'Idatzitako pasahitzak ez dira berdinak.',
'userexists' => 'Aukeratutako erabiltzaile izena hartuta dago.
Mesedez beste bat aukeratu.',
'loginerror' => 'Errorea saioa hastean',
+'createacct-error' => 'Kontua sortzerakoan arazoa',
'createaccounterror' => 'Ezin izan da kontua sortu: $1',
'nocookiesnew' => 'Erabiltzaile kontua sortu da, baina ez da saioa hasi. {{SITENAME}}(e)k cookieak erabiltzen ditu saioekin eta ezgaituta dauzkazu. Gaitu itzazu mesedez, eta ondoren saiatu saioa hasten zure erabiltzaile izen eta pasahitz berriak erabiliz.',
'nocookieslogin' => '{{SITENAME}}(e)k cookieak erabiltzen ditu saioekin eta ezgaituta dauzkazu. Gaitu itzazu mesedez, eta saiatu berriz.',
@@ -645,7 +677,7 @@ Berriro saiatu aurretik itxaron ezazu, mesedez.',
'newpassword' => 'Pasahitz berria:',
'retypenew' => 'Pasahitz berria berriz idatzi:',
'resetpass_submit' => 'Pasahitza definitu eta saioa hasi',
-'resetpass_success' => 'Zure pasahitza aldatu egin da! Saioa hasten...',
+'changepassword-success' => 'Zure pasahitza aldatu egin da! Saioa hasten...',
'resetpass_forbidden' => 'Ezin dira pasahitzak aldatu',
'resetpass-no-info' => 'Orrialde honetara zuzenean sartzeko izena eman behar duzu.',
'resetpass-submit-loggedin' => 'Pasahitza aldatu',
@@ -657,9 +689,11 @@ Agian dagoeneko ondo aldatu duzu zure pasahitza edo behin-behineko pasahitza bat
# Special:PasswordReset
'passwordreset' => 'Pasahitzaren berrezarpena',
-'passwordreset-text' => 'Bete ezazu formulario hau zure pasahitza berrezartzeko.',
+'passwordreset-text-one' => 'Bete formulario hau zure pasahitza berrezartzeko.',
+'passwordreset-text-many' => '{{PLURAL:$1|Sartu datuetako bat zure pasahitza berrezartzeko.}}',
'passwordreset-legend' => 'Pasahitza berrezarri',
'passwordreset-disabled' => 'Pasahitza berrezartzea ez da posible wiki honetan.',
+'passwordreset-emaildisabled' => 'E-posta aukerak ez daude eskuragarri wiki honetan.',
'passwordreset-username' => 'Lankide izena:',
'passwordreset-domain' => 'Domeinua:',
'passwordreset-capture' => 'Bidaliko den e-posta ikusi nahi?',
@@ -868,12 +902,15 @@ Ez du azalpenik eman.',
'edit-gone-missing' => 'Ezin da orria eguneratu. Ezabatu omen dute.',
'edit-conflict' => 'Aldaketa gatazka.',
'edit-no-change' => 'Zure edizioa baztertu da testua aldatu ez duzulako.',
+'postedit-confirmation' => 'Zure aldaketa gorde da.',
'edit-already-exists' => 'Ezin izan da orri berria sortu.
Jada existitzen da.',
'defaultmessagetext' => 'Testu lehenetsia',
'content-failed-to-parse' => 'Ezin izan da $2(r)en edukia parseatu $1 modeloarentzat: $3',
'invalid-content-data' => 'Eduki datu baliogabea',
'content-not-allowed-here' => '"$1" edukia ez dago baimendua [[$2]] orrialdean',
+'editwarning-warning' => 'Orrialde honetatik irteten bazara, egindako aldaketak galdu egingo dira.
+Saioa hasi baduzu, mezu hau kendu dezakezu zure hobespenen orrialdeko "Aldatzen" atalean.',
# Content models
'content-model-wikitext' => 'wikitestua',
@@ -1109,7 +1146,6 @@ Kontura zaitez nabigazio loturek, zutabea ezabatu dezakela.',
'searchmenu-legend' => 'Bilaketa aukerak',
'searchmenu-exists' => "'''\"[[:\$1]]\" izena duen orrialde bat badago wiki honetan'''",
'searchmenu-new' => "'''\"[[:\$1]]\" orrialde sortu wiki honetan!'''",
-'searchhelp-url' => 'Help:Laguntza',
'searchmenu-prefix' => '[[Special:PrefixIndex/$1|Aurrizki hau duten orrialdeetatik nabigatu]]',
'searchprofile-articles' => 'Eduki-orriak',
'searchprofile-project' => 'Laguntza eta Proiektu-orriak',
@@ -1152,14 +1188,6 @@ Saia zaitez zure eskeraren aurretik ''all:'' jartzen eduki guztien artean bilatz
'search-external' => 'Kanpo bilaketa',
'searchdisabled' => '{{SITENAME}}(e)n ezgaituta dago bilaketa. Dena dela, Google erabiliz ere egin dezakezu bilaketa. Kontuan izan bertan dituzten {{SITENAME}}(e)ko emaitzak zaharkituta egon daitezkeela.',
-# Quickbar
-'qbsettings' => 'Laster-barra',
-'qbsettings-none' => 'Ezein ere',
-'qbsettings-fixedleft' => 'Eskuinean',
-'qbsettings-fixedright' => 'Ezkerrean',
-'qbsettings-floatingleft' => 'Ezkerrean mugikor',
-'qbsettings-floatingright' => 'Eskubian flotatzen',
-
# Preferences page
'preferences' => 'Hobespenak',
'mypreferences' => 'Hobespenak',
@@ -1192,7 +1220,6 @@ Saia zaitez zure eskeraren aurretik ''all:'' jartzen eduki guztien artean bilatz
'resetprefs' => 'Hasieratu',
'restoreprefs' => 'Konfigurazio lehenetsi guztiak berrezarri',
'prefs-editing' => 'Aldatzen',
-'prefs-edit-boxsize' => 'Edizio lehioaren tamaina.',
'rows' => 'Lerroak:',
'columns' => 'Zutabeak:',
'searchresultshead' => 'Bilaketa',
@@ -1231,7 +1258,6 @@ Saia zaitez zure eskeraren aurretik ''all:'' jartzen eduki guztien artean bilatz
'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:',
'username' => '{{GENDER:$1|Erabiltzaile izena}}:',
'uid' => '{{GENDER:$1|Erabiltzaile}} zenbakia:',
@@ -1365,6 +1391,8 @@ $1 {{PLURAL:$1|karakteretik|karakteretik}} behera izan behar ditu.',
'right-editusercssjs' => 'Beste lankideen CSS eta JS fitxategiak aldatu',
'right-editusercss' => 'Beste lankideen CSS fitxategiak aldatu',
'right-edituserjs' => 'Beste lankideen JS fitxategiak aldatu',
+'right-editmyusercss' => 'Aldatu zure CSS fitxategi propioak',
+'right-editmyuserjs' => 'Aldatu zure JavaScript fitxategi propioak',
'right-rollback' => 'Orrialde zehatz bat aldatu zuen azken lankidearen aldaketak modu azkar batean leheneratu',
'right-markbotedits' => 'Atzera bueltan eginiko aldaketak bot baten aldaketak balira markatu',
'right-noratelimit' => 'Ez dio eragiten erlazio mugak',
@@ -1467,7 +1495,6 @@ $1 {{PLURAL:$1|karakteretik|karakteretik}} behera izan behar ditu.',
'recentchangeslinked-feed' => 'Lotutako orrietako aldaketak',
'recentchangeslinked-toolbox' => 'Lotutako orrietako aldaketak',
'recentchangeslinked-title' => '"$1"(e)kin harremanetan dauden aldaketak',
-'recentchangeslinked-noresult' => 'Emandako epean ez da egon aldaketarik loturiko orrialdetan.',
'recentchangeslinked-summary' => "Zerrenda honetan zehazturiko orrialde bati (edo kategoria berezi bateko azkeneko kideei) lotura duten orrietan eginiko azken aldaketak agertzen dira.
[[Special:Watchlist|Zurre jarraitze zerrenda]]n agertzen diren orrialdeak '''beltze'''z agertzen dira.",
'recentchangeslinked-page' => 'Orriaren izena:',
@@ -1642,7 +1669,6 @@ Fitxategien sarbidea baino ez da onartzen.',
'http-read-error' => 'HTTP irakurketa-akatsa.',
'http-timed-out' => 'HTTP eskaera iraungi da.',
'http-curl-error' => 'Errorea URLa bilatzerakoan: $1',
-'http-host-unreachable' => 'Ezin da URL-a atzeman.',
'http-bad-status' => 'Arazo bat egon da HTTP eskaera bitartean: $1 $2',
# Some likely curl errors. More could be added from <http://curl.haxx.se/libcurl/c/libcurl-errors.html>
@@ -1781,12 +1807,6 @@ Bere [$2 fitxategiaren deskribapen orrialdea] behean dago.',
'statistics-users-active-desc' => 'Aurreko {{PLURAL:$1|egunean|egunetan}} jardueraren bat gauzatu duten erabiltzaileak',
'statistics-mostpopular' => 'Orri bisitatuenak',
-'disambiguations' => 'Argipen orrietara lotzen duten orriak',
-'disambiguationspage' => 'Template:argipen',
-'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.",
-
'pageswithprop' => 'Orrialde propietatea duten orrialdeak',
'pageswithprop-legend' => 'Orrialde propietatea duten orrialdeak',
'pageswithprop-prop' => 'Ezaugarriaren izena:',
@@ -2029,10 +2049,9 @@ Orrialde honen hurrengo aldaketak zerrenda horretan ageriko dira aurrerantzean.'
'unwatchthispage' => 'Jarraitzeari utzi',
'notanarticle' => 'Ez da eduki orrialdea',
'notvisiblerev' => 'Berrikusketa desegin da',
-'watchnochange' => 'Hautatutako denbora tartean ez da aldaketarik izan zure jarraipen zerrendako orrialdeetan.',
'watchlist-details' => '{{PLURAL:$1|Orrialde $1|$1 orrialde}} jarraitzen, eztabaida orrialdeak kontuan hartu gabe.',
-'wlheader-enotif' => '* Posta bidezko ohartarazpena gaituta dago.',
-'wlheader-showupdated' => "* Bisitatu zenituen azken alditik aldaketak izan dituzten orrialdeak '''beltzez''' nabarmenduta daude",
+'wlheader-enotif' => 'Posta bidezko ohartarazpena gaituta dago.',
+'wlheader-showupdated' => "Bisitatu zenituen azken alditik aldaketak izan dituzten orrialdeak '''beltzez''' nabarmenduta daude.",
'watchmethod-recent' => 'Aldaketa berriak aztertzen jarraipen zerrendako orrialdeen bila',
'watchmethod-list' => 'jarraipen zerrendako orrialdeak aldaketa berrien bila aztertzen',
'watchlistcontains' => 'Zure jarraipen zerrendak {{PLURAL:$1|orrialde $1 du|$1 orrialde ditu}}.',
@@ -2419,11 +2438,8 @@ Ikus [[Special:BlockList|blokeoen zerrenda]] aktibo dauden blokeoak eta debekuak
Hala ere, $2-(r)en parte denez, blokeoa kendu daiteke.',
'ip_range_invalid' => 'Baliogabeko IP eremua.',
'ip_range_toolarge' => '/$1 baino handiagoak diren blokeo eremuak ezin dira eskuratu.',
-'blockme' => 'Blokea nazazu',
'proxyblocker' => 'Proxy blokeatzailea',
-'proxyblocker-disabled' => 'Funtzio hau ez-gaitua dago.',
'proxyblockreason' => 'Zure IP helbidea blokeatu egin da proxy ireki baten zaudelako. Mesedez, zure Interneteko Zerbitzu Hornitzailearekin harremanetan jar zaitez segurtasun arazo honetaz ohartarazteko.',
-'proxyblocksuccess' => 'Egina.',
'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.',
@@ -2770,10 +2786,7 @@ Baliteke zerrenda beltzean dagoen kanpo lotura batek sortzea arazo hori.',
'pageinfo-category-files' => 'Fitxategi kopurua',
# Skin names
-'skinname-standard' => 'Lehenetsia',
-'skinname-nostalgia' => 'Nostalgia',
'skinname-cologneblue' => 'Cologne Blue',
-'skinname-simple' => 'Arrunta',
'skinname-modern' => 'Modernoa',
# Patrolling
@@ -2852,11 +2865,25 @@ Zure sisteman exekutatzea arriskutsua izan liteke.",
'minutes' => '{{PLURAL:$1|minutu $1|$1 minutu}}',
'hours' => '{{PLURAL:$1|ordu $1|$1 ordu}}',
'days' => '{{PLURAL:$1|egun $1|$1 egun}}',
+'weeks' => '{{PLURAL: $1|aste $1|$1 aste}}',
'months' => '{{PLURAL: $1|hilabete $1|$1 hilabete}}',
'years' => '{{PLURAL: $1|urte $1|$1 urte}}',
'ago' => 'Duela $1',
'just-now' => 'orain',
+# Human-readable timestamps
+'hours-ago' => 'Orain dela {{PLURAL:$1|ordu bat|$1 ordu}}',
+'minutes-ago' => 'Orain dela {{PLURAL:$1|minutu bat|$1 minutu}}',
+'seconds-ago' => 'Orain dela {{PLURAL:$1|segundu bat|$1 segundu}}',
+'monday-at' => 'Astelehena $1(e)tan',
+'tuesday-at' => 'Asteartea $1(e)tan',
+'wednesday-at' => 'Asteazkena $1(e)tan',
+'thursday-at' => 'Osteguna $1(e)tan',
+'friday-at' => 'Ostirala $1(e)tan',
+'saturday-at' => 'Larunbata $1(e)tan',
+'sunday-at' => 'Igandea $1(e)tan',
+'yesterday-at' => 'Atzo $1(e)tan',
+
# Bad image list
'bad_image_list' => 'Formatua hurrengoa da:
@@ -2882,7 +2909,7 @@ Zerrenda elementuak (hasieran * duten lerroak) baino ez dira kontuan hartzen. Le
* gpslongitude
* gpsaltitude',
-# EXIF tags
+# Exif tags
'exif-imagewidth' => 'Zabalera',
'exif-imagelength' => 'Altuera',
'exif-bitspersample' => 'Bit osagaiko',
@@ -3058,7 +3085,7 @@ Zerrenda elementuak (hasieran * duten lerroak) baino ez dira kontuan hartzen. Le
'exif-originalimageheight' => 'Irudiaren altuera moztu aurretik',
'exif-originalimagewidth' => 'Irudiaren zabalera moztu aurretik',
-# EXIF attributes
+# Exif attributes
'exif-compression-1' => 'Konprimatu gabe',
'exif-compression-6' => 'JPEG',
@@ -3422,7 +3449,6 @@ Halaber [[Special:EditWatchlist|aldatzaile estandarra]] erabil dezakezu.',
'version-other' => 'Bestelakoak',
'version-mediahandlers' => 'Media gordailuak',
'version-hooks' => 'Estentsioak',
-'version-extension-functions' => 'Luzapen funtzioak',
'version-parser-extensiontags' => 'Parser luzapen etiketak',
'version-parser-function-hooks' => 'Parser funtzio estentsioak',
'version-hook-name' => 'Estentsioaren izena',
@@ -3438,12 +3464,16 @@ Halaber [[Special:EditWatchlist|aldatzaile estandarra]] erabil dezakezu.',
'version-entrypoints-header-entrypoint' => 'Sarrera puntua',
'version-entrypoints-header-url' => 'URL',
-# Special:FilePath
-'filepath' => 'Fitxategi bidea',
-'filepath-page' => 'Fitxategia:',
-'filepath-submit' => 'Joan',
-'filepath-summary' => 'Orri berezi honek fitxategiaren ibilbidea itzultzen du.
-Irudiak bereizmen handienean daude, bestelako fitxategi motak beraiei esleitutako programarekin hasiko dira zuzenean.',
+# Special:Redirect
+'redirect' => 'Birzuzendu fitxategi, lankide edo berrikuspen IDaren arabera',
+'redirect-legend' => 'Orrialde edo fitxategi batera birzuzendu',
+'redirect-submit' => 'Joan',
+'redirect-lookup' => 'Ikuskatu:',
+'redirect-value' => 'Balioa:',
+'redirect-user' => 'Erabiltzailearen identifikazioa (ID):',
+'redirect-revision' => 'Orrialdearen berrikuspena',
+'redirect-file' => 'Fitxategiaren izena',
+'redirect-not-exists' => 'Ez da baliorik aurkitu',
# Special:FileDuplicateSearch
'fileduplicatesearch' => 'Artxibo bikoiztuen bilaketa',
@@ -3529,6 +3559,9 @@ Irudiak bereizmen handienean daude, bestelako fitxategi motak beraiei esleitutak
'htmlform-submit' => 'Bidali',
'htmlform-reset' => 'Aldaketak desegin',
'htmlform-selectorother-other' => 'Beste bat',
+'htmlform-no' => 'Ez',
+'htmlform-yes' => 'Bai',
+'htmlform-chosen-placeholder' => 'Aukeratu',
# SQLite database support
'sqlite-has-fts' => '$1 testu osoan bilatzeko laguntzarekin',
diff --git a/languages/messages/MessagesExt.php b/languages/messages/MessagesExt.php
index 61a1b3af..cf6a54dc 100644
--- a/languages/messages/MessagesExt.php
+++ b/languages/messages/MessagesExt.php
@@ -49,9 +49,6 @@ $messages = array(
'tog-shownumberswatching' => "Muestral el númeru d'usuárius que la vehilan",
'tog-oldsig' => 'Firma dessistenti:',
'tog-fancysig' => 'Tratal la firma cumu testu wiki (sin atiju automáticu)',
-'tog-externaleditor' => 'Gastal eitol esternu pol defeutu (solu pa sabihondus, es mestel una configuración especial nel ordinaol)',
-'tog-externaldiff' => 'Gastal def esternu pol defeutu (solu pa sabihondus, es mestel una configuración especial nel ordinaol)',
-'tog-showjumplinks' => 'Premitil los atihus d\'acesibiliá "sartal a"',
'tog-uselivepreview' => 'Gastal "live preview" (JavaScript) (en prebas)',
'tog-forceeditsummary' => 'Avisalmi cuandu nu escreba una síntesis dun chambu',
'tog-watchlisthideown' => 'Açonchal las mis eicionis ena lista e seguimientu',
@@ -228,7 +225,7 @@ $messages = array(
'jumptonavigation' => 'Güiquipeandu',
'jumptosearch' => 'Landeal',
-# 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).
+# 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).
'aboutsite' => 'Al tentu {{SITENAME}}',
'aboutpage' => 'Project:Enjolmación',
'copyright' => 'Continiu disponibri bahu $1.',
@@ -238,7 +235,6 @@ $messages = array(
'disclaimers' => 'Avissu legal',
'disclaimerpage' => 'Project:Arrayu heneral de responsabiliá',
'edithelp' => "Ayua d'eición",
-'edithelppage' => 'Help:Eitandu',
'helppage' => 'Help:Continius',
'mainpage' => 'Página prencipal',
'mainpage-description' => 'Páhina prencipal',
@@ -308,17 +304,6 @@ Pueis alcuentral una lista colas páhinas especialis desistentis en [[Special:Sp
# General errors
'error' => 'Marru',
'databaseerror' => 'Marru ena basi e datus',
-'dberrortext' => 'Marru sintáticu ena consurta a la bassi de datus:
-Estu puei sel ebiu a un marru nel software.
-La úrtima consurta jue:
-<blockquote><tt>$1</tt></blockquote>
-endrentu la junción "<tt>$2</tt>".
-La bassi de datus degorvió el marru "<tt>$3: $4</tt>".',
-'dberrortextcl' => 'Marru sintáticu ena consurta a la bassi de datus.
-La úrtima consurta jue:
-"$1"
-endrentu la junción "$2".
-La bassi de datus degorvió el marru "$3: $4"',
'laggedslavemode' => 'Avisu: Es posibri que la páhina nu esté atualizá.',
'readonly' => 'Basi e datus atarugá',
'enterlockreason' => 'Escrebi una razón pal tarugu, i cuandu esti
@@ -361,7 +346,6 @@ Pol favol, contauta con un [[Special:ListUsers/sysop|çajoril]], mentandu la URL
'protectedinterface' => "Esta páhina proporciona el testu la entrihazi el software, razón pola que s'alcuentra atarugá.",
'editinginterface' => "'''Cudiau:''' Estás eitandu una página que propolciona el testu la entrijazi el software. Los chambus hechus aquina afeutarán a la entrijazi d'otrus ussuárius.
Pa traucil, consiera gastal [//translatewiki.net/wiki/Main_Page?setlang=en translatewiki.net], el proyeutu de traución de MediaWiki.",
-'sqlhidden' => '(Consurta SQL açonchá)',
'cascadeprotected' => 'Esta páhina s\'alcuentra protehia ebiu a que horma parti e {{PLURAL:$1|la siguienti páhina|las siguientis páhinas}}, qu\'están protehias cola oción "proteción en cascá" ativá:
$2',
'namespaceprotected' => "Nu tiinis premisu pa eital páhinas nel \"espaciu e nombris\" '''\$1'''.",
@@ -458,7 +442,7 @@ Si s\'á criau la cuenta ebiu a angún marru, inora esti mensahi.',
'newpassword' => 'Consínia nueva:',
'retypenew' => 'Güervi a escrebil la nueva consínia:',
'resetpass_submit' => 'Escrebi la consínia i entra',
-'resetpass_success' => 'La tu consínia á siu chambá! Ya pueis entral otra vezi ena tu cuenta...',
+'changepassword-success' => 'La tu consínia á siu chambá! Ya pueis entral otra vezi ena tu cuenta...',
'resetpass_forbidden' => 'Nu es possibri escambial las consínias',
'resetpass-submit-loggedin' => 'Escambial consínia',
'resetpass-submit-cancel' => 'Cancelal',
@@ -768,7 +752,6 @@ Asigurati e qu'esti chambu mantenga la continuiá el estorial la páhina.",
'viewprevnext' => 'Vel ($1 {{int:pipe-separator}} $2) ($3).',
'searchmenu-legend' => 'Ocionis de landeu',
'searchmenu-new' => "'''Crial el artículu \"[[:\$1]]\"'''",
-'searchhelp-url' => 'Help:Continius',
'searchprofile-images' => 'Murtimeya',
'searchprofile-everything' => 'Tó',
'searchprofile-advanced' => 'Avançau',
@@ -797,14 +780,6 @@ Asigurati e qu'esti chambu mantenga la continuiá el estorial la páhina.",
'search-external' => 'Landeu estelnu',
'searchdisabled' => 'Los landeus en {{SITENAME}} están temporalmenti desativaus. Mentris tantu, pueis landeal meyanti landerus esternus, inque ten en cuenta que los sus éndicis concernientis a {{SITENAME}} puein nu estal atualizaus.',
-# Quickbar
-'qbsettings' => 'Preferéncias la "Quickbar"',
-'qbsettings-none' => 'Dengunu',
-'qbsettings-fixedleft' => 'Asiahau a la gocha',
-'qbsettings-fixedright' => 'Asiahau a la derecha',
-'qbsettings-floatingleft' => 'Frotanti ena gocha',
-'qbsettings-floatingright' => 'Frotanti ena derecha',
-
# Preferences page
'preferences' => 'Preferéncias',
'mypreferences' => 'Las mis preferéncias',
@@ -827,7 +802,6 @@ Asigurati e qu'esti chambu mantenga la continuiá el estorial la páhina.",
'saveprefs' => 'Emburacal',
'resetprefs' => 'Esborral los chambus nu emburacaus',
'prefs-editing' => 'Eitandu',
-'prefs-edit-boxsize' => "Grandol de la ventana d'eición.",
'rows' => 'Filas:',
'columns' => 'Colunas:',
'searchresultshead' => 'Landeal',
@@ -1007,7 +981,6 @@ Amás premiti qu'otrus ussuárius contatin contigu pol mé la tu página d'ussuÃ
'recentchangeslinked-feed' => 'Chambus relacionaus',
'recentchangeslinked-toolbox' => 'Chambus relacionaus',
'recentchangeslinked-title' => 'Chambus relacionaus con "$1"',
-'recentchangeslinked-noresult' => 'Nu ai chambus enas páhinas atihás nel períu lihiu.',
'recentchangeslinked-summary' => "Nesta páhina especial ai una lista colos úrtimus chambus en páhinas qu'están atihás dendi una páhina concreta (u en miembrus de una detelminá categoria).
Las páhinas de la tu [[Special:Watchlist|lista e seguimientu]] están en '''negrina'''.",
'recentchangeslinked-page' => 'Nombri la páhina:',
@@ -1219,10 +1192,6 @@ Pursa nel entítulu la coluna pa chambal el ordin.',
'statistics-users-active-desc' => 'Ussuárius que aigan hechu anguna ación {{PLURAL:$1|nel úrtimu dia|enus úrtimus $1 dias}}',
'statistics-mostpopular' => 'Páhinas mas visoreás',
-'disambiguations' => 'Páhinas de desambiguáncia',
-'disambiguationspage' => 'Template:desambiguáncia',
-'disambiguations-text' => "Las siguientis páhinas atihan a una '''páhina e desambiguáncia'''. Estas eberian atihal al artículu apropiau.<br />Una páhina se consiera e desambiguáncia si gasta una prantilla qu'está atihá endi [[MediaWiki:Disambiguationspage]]",
-
'doubleredirects' => 'Redirecionis dobris',
'brokenredirects' => 'Redirecionis eschangás',
@@ -1396,10 +1365,9 @@ Si quieis ehal de vehilal la páhina, pursa sobri \"Ehal de vehilal\".",
'unwatchthispage' => 'Ehal de vehilal',
'notanarticle' => 'Nu es un artículu',
'notvisiblerev' => 'La revisión á siu esborrá',
-'watchnochange' => 'Nu s´eitó denguna e las tus páhinas vehilás nel períu lihiu.',
'watchlist-details' => '{{PLURAL:$1|$1 artículu|$1 artículus}} vehilaus (sin contal las carabas).',
-'wlheader-enotif' => '* Se premitin notificacionis pol email.',
-'wlheader-showupdated' => "* Las páhinas que s'án emburacau dendi la úrtima vezi que las visoreasti son muestrás en '''negrina'''",
+'wlheader-enotif' => 'Se premitin notificacionis pol email.',
+'wlheader-showupdated' => "Las páhinas que s'án emburacau dendi la úrtima vezi que las visoreasti son muestrás en '''negrina'''",
'watchmethod-recent' => 'comprebandu las úrtimas eicionis en páhinas vehilás',
'watchmethod-list' => 'Revisandu las páhinas vehilás en cata los úrtimus chambus',
'watchlistcontains' => 'Ai $1 {{PLURAL:$1|páhina|páhinas}} ena tu lista e seguimientu.',
@@ -1695,11 +1663,8 @@ Escrebi una razón concreta embahu (pol sabulugal, almientandu páhinas qu'aigan
'ipb_cant_unblock' => "Marru: Nu s'á alcuentrau el tarugu con ID $1. Es posibri que ya aiga siu desatarugau.",
'ipb_blocked_as_range' => "Marru: La IP $1 nu s'alcuentra atarugá diretamenti, polo que nu puei sel desatarugá. Nu ostanti, hue atarugá cumu parti el intervalu $2, que puei sel desatarugau.",
'ip_range_invalid' => "Rangu d'IP nu premitiu.",
-'blockme' => 'Atarugami',
'proxyblocker' => 'Tarugaol de proxys',
-'proxyblocker-disabled' => "Esta hunción s'alcuentra desativá.",
'proxyblockreason' => "La tu direción IP á siu atarugá polque es un proxy abiertu. Pol favol, contauta con el tu proveol de sirvicius d'Internet u con el tu sirviciu d'asisténcia télefónica i enhórmalus desti gravi pobrema e seguráncia.",
-'proxyblocksuccess' => 'Hechu.',
'sorbsreason' => 'La tu direción IP apaici ena lista e proxys abiertus en DNSBL gastá pol {{SITENAME}}.',
'sorbs_create_account_reason' => 'La tu direción IP apaici ena lista e proxys abiertus en DNSBL gastá pol {{SITENAME}}. Nu se te premiti crial una cuenta',
@@ -2009,7 +1974,7 @@ Cualisquiel otru atihu ena mesma línia se consierará ececión, p.s. páhinas o
* gpslongitude
* gpsaltitude',
-# EXIF tags
+# Exif tags
'exif-imagewidth' => 'Anchón',
'exif-imagelength' => 'Artura',
'exif-bitspersample' => 'Bits pol componenti',
@@ -2093,7 +2058,7 @@ Cualisquiel otru atihu ena mesma línia se consierará ececión, p.s. páhinas o
'exif-gpsdatestamp' => 'Fecha el GPS',
'exif-gpsdifferential' => 'Correción diferencial de GPS',
-# EXIF attributes
+# Exif attributes
'exif-compression-1' => 'Descomprimiu',
'exif-unknowndate' => 'Fecha andarria',
@@ -2355,7 +2320,6 @@ Pol favol, confirma si rialmenti quieis gorvel a crial la páhina.",
'version-specialpages' => 'Páhinas especialis',
'version-variables' => 'Variabris',
'version-other' => 'Otru',
-'version-extension-functions' => "Huncionis d'estensionis",
'version-hook-name' => 'Nombri el Hook',
'version-hook-subscribedby' => 'Suscritu pol',
'version-version' => '(Velsión $1)',
@@ -2364,13 +2328,6 @@ Pol favol, confirma si rialmenti quieis gorvel a crial la páhina.",
'version-software-product' => 'Proutu',
'version-software-version' => 'Velsión',
-# Special:FilePath
-'filepath' => "Ruta d'archivu",
-'filepath-page' => 'Archivu:',
-'filepath-submit' => 'Ruta',
-'filepath-summary' => "Esta páhina especial degüervi la ruta compreta dun archivu.
-Las imahin se muestran a resolución compreta; las demas crasis d'archivu s'ehecutan diretamenti con el su pograma asociau.",
-
# Special:FileDuplicateSearch
'fileduplicatesearch' => 'Landeal archivus dupricaus',
'fileduplicatesearch-legend' => 'Landeal dupricaus',
diff --git a/languages/messages/MessagesFa.php b/languages/messages/MessagesFa.php
index a898c86c..91af22c6 100644
--- a/languages/messages/MessagesFa.php
+++ b/languages/messages/MessagesFa.php
@@ -108,6 +108,7 @@ $specialPageAliases = array(
'Filepath' => array( 'مسیر_پرونده' ),
'Import' => array( 'درون_ریزی_صÙحه' ),
'Invalidateemail' => array( 'باطل_کردن_رایانامه' ),
+ 'JavaScriptTest' => array( 'تست_جاوا_اسکریپت' ),
'BlockList' => array( 'Ùهرست_بستن_نشانی_آی‌پی' ),
'LinkSearch' => array( 'جستجوی_پیوند' ),
'Listadmins' => array( 'Ùهرست_مدیران' ),
@@ -124,6 +125,7 @@ $specialPageAliases = array(
'MIMEsearch' => array( 'جستجوی_MIME' ),
'Mostcategories' => array( 'بیشترین_رده' ),
'Mostimages' => array( 'بیشترین_تصویر' ),
+ 'Mostinterwikis' => array( 'بیشترین_میان‌ویکی' ),
'Mostlinked' => array( 'بیشترین_پیوند' ),
'Mostlinkedcategories' => array( 'رده_با_بیشترین_پیوند' ),
'Mostlinkedtemplates' => array( 'الگو_با_بیشترین_پیوند' ),
@@ -146,6 +148,7 @@ $specialPageAliases = array(
'Randomredirect' => array( 'تغییرمسیر_تصادÙÛŒ' ),
'Recentchanges' => array( 'تغییرات_اخیر' ),
'Recentchangeslinked' => array( 'تغییرات_مرتبط' ),
+ 'Redirect' => array( 'تغییرمسیر' ),
'Revisiondelete' => array( 'حذÙ_نسخه' ),
'Search' => array( 'جستجو' ),
'Shortpages' => array( 'صÙحه‌های_کوتاه' ),
@@ -464,9 +467,6 @@ $messages = array(
'tog-shownumberswatching' => 'شمار کاربران پی‌گیری‌کننده نمایش یابد',
'tog-oldsig' => 'امضای کنونی:',
'tog-fancysig' => 'امضا به صورت ویکی‌متن در نظر گرÙته شود (بدون درج خودکار پیوند)',
-'tog-externaleditor' => 'استÙاده از ویرایشگر خارجی به‌طور پیش‌Ùرض (Ùقط برای کاربران حرÙه‌ای؛ نیازمند تنظیمات ویژه در رایانهٔ شما است. [//www.mediawiki.org/wiki/Manual:External_editors اطلاعات بیشتر].)',
-'tog-externaldiff' => 'استÙاده از تÙاوت‌گیر (diff) خارجی به‌طور پیش‌Ùرض (Ùقط برای کاربران حرÙه‌ای؛ نیازمند تنظیمات ویژه در رایانهٔ شما است. [//www.mediawiki.org/wiki/Manual:External_editors اطلاعات بیشتر].)',
-'tog-showjumplinks' => 'پیوندهای دسترسی‌پذیری «پرش به» Ùعال باشد',
'tog-uselivepreview' => 'استÙاده از پیش‌نمایش زنده (نیازمند جاوااسکریپت) (آزمایشی)',
'tog-forceeditsummary' => 'هنگامی که خلاصهٔ ویرایش ننوشته‌ام به من اطلاع داده شود',
'tog-watchlisthideown' => 'ویرایش‌های خودم در Ùهرست پی‌گیری‌ها پنهان شود',
@@ -480,6 +480,8 @@ $messages = array(
'tog-showhiddencats' => 'رده‌های پنهان نمایش داده شود',
'tog-noconvertlink' => 'تبدیل عنوان پیوند غیرÙعال شود',
'tog-norollbackdiff' => 'بعد از واگردانی تÙاوت نشان داده نشود',
+'tog-useeditwarning' => 'زمان خروج از صÙحهٔ ویرایش در صورت داشتن ویرایش‌های‌ ذخیره‌نشده به من هشدار داده شود',
+'tog-prefershttps' => 'هنگامی Ú©Ù‡ ثبت ورود انجام گرÙته همواره از اتصال امن استÙاده شود',
'underline-always' => 'همیشه',
'underline-never' => 'هرگز',
@@ -543,6 +545,18 @@ $messages = array(
'oct' => 'اکتبر',
'nov' => 'نوامبر',
'dec' => 'دسامبر',
+'january-date' => '$1 ژانویه',
+'february-date' => '$1 Ùوریه',
+'march-date' => '$1 مارس',
+'april-date' => '$1 آوریل',
+'may-date' => '$1 مه',
+'june-date' => '$1 ژوئن',
+'july-date' => '$1 ژوئیه',
+'august-date' => '$1 اوت',
+'september-date' => '$1 سپتامبر',
+'october-date' => '$1 اکتبر',
+'november-date' => '$1 نوامبر',
+'december-date' => '$1 دسامبر',
# Categories related messages
'pagecategories' => '{{PLURAL:$1|رده|رده‌ها}}',
@@ -624,6 +638,7 @@ $messages = array(
'create-this-page' => 'ایجاد این صÙحه',
'delete' => 'حذÙ',
'deletethispage' => 'حذ٠این صÙحه',
+'undeletethispage' => 'احیای این صÙحه',
'undelete_short' => 'احیای {{PLURAL:$1|یک ویرایش|$1 ویرایش}}',
'viewdeleted_short' => 'نمایش {{PLURAL:$1|یک ویرایش حذÙ‌شده|$1 ویرایش حذÙ‌شده}}',
'protect' => 'محاÙظت',
@@ -667,7 +682,7 @@ $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).
+# 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).
'aboutsite' => 'دربارهٔ {{SITENAME}}',
'aboutpage' => 'Project:درباره',
'copyright' => 'محتوایات تحت اجازه‌نامهٔ $1 هستند مگر اینکه خلاÙØ´ ذکر شده باشد.',
@@ -677,7 +692,6 @@ $1',
'disclaimers' => 'تکذیب‌نامه‌ها',
'disclaimerpage' => 'Project:تکذیب‌نامهٔ عمومی',
'edithelp' => 'راهنمای ویرایش‌کردن',
-'edithelppage' => 'Help:ویرایش',
'helppage' => 'Help:محتوا',
'mainpage' => 'صÙحهٔ اصلی',
'mainpage-description' => 'صÙحهٔ اصلی',
@@ -758,19 +772,12 @@ $1',
# General errors
'error' => 'خطا',
'databaseerror' => 'خطای پایگاه داده',
-'dberrortext' => 'اشکال نحوی در درخواست Ùرستاده شده به پایگاه داده رخ داد.
-دلیل این مشکل می‌تواند ایرادی در نرم‌اÙزار باشد.
-آخرین درخواست Ú©Ù‡ برای پایگاه داده Ùرستاد شد این بود:
-<blockquote class="mw-content-ltr"><code>$1</code></blockquote>
-این درخواست از درون عملگر «<span class="mw-content-ltr"><code>$2</code></span>» Ùرستاده شد.
-پایگاه داده این خطا را بازگرداند:
-<div class="mw-content-ltr"><samp>$3: $4</samp></div>',
-'dberrortextcl' => 'اشکال نحوی در درخواست Ùرستاده شده به پایگاه داده رخ داد.
-آخرین درخواستی Ú©Ù‡ برای پایگاه داده Ùرستاد شد این بود:
-<div class="mw-content-ltr">$1</div>
-این درخواست از درون عملگر «<span class="mw-content-ltr">$2</span>» Ùرستاده شد.
-پایگاه داده این خطا را بازگرداند:
-<div class="mw-content-ltr">$3: $4</div>',
+'databaseerror-text' => 'مشکلی در پایگاه‌داده‌ها رخ داده‌است.
+این ممکن است نشان‌دهندهٔ ایرادی در نرم‌اÙزار باشد.',
+'databaseerror-textcl' => 'یک خطای پرس‌وجوی پایگاه داده‌های رخ داده‌است.',
+'databaseerror-query' => 'پرس‌وجو: $1',
+'databaseerror-function' => 'تابع: $1',
+'databaseerror-error' => 'خطا: $1',
'laggedslavemode' => "'''هشدار:''' صÙحه ممکن است به‌روزرسانی‌های اخیر را شامل نشود.",
'readonly' => 'پایگاه داده Ù‚ÙÙ„ شد',
'enterlockreason' => 'دلیلی برای Ù‚ÙÙ„ کردن ذکر کنید، Ú©Ù‡ حاوی تقریبی از زمانی باشد Ú©Ù‡ Ù‚ÙÙ„ برداشته خواهد شد',
@@ -804,6 +811,7 @@ $1',
'cannotdelete-title' => 'نمی‌توان صÙحهٔ «$1» را حذ٠کرد',
'delete-hook-aborted' => 'حذ٠توسط قلاب لغو شد.
توضیحی در این مورد داده نشد.',
+'no-null-revision' => 'امکان ایجاد نسخهٔ پوچ برای صÙحهٔ «$1» وجود نداشت',
'badtitle' => 'عنوان بد',
'badtitletext' => 'عنوان درخواستی نامعتبر، خالی، یا عنوانی میان‌زبانی یا میان‌ویکی‌ای با پیوند نادرست بود.
ممکن است حاوی یک یا چند نویسه باشد Ú©Ù‡ نمی‌توانند در عنوان‌ها استÙاده شوند.',
@@ -827,12 +835,15 @@ $1',
'editinginterface' => "'''هشدار:''' صÙحه‌ای Ú©Ù‡ ویرایش می‌کنید شامل متنی است Ú©Ù‡ در واسط کاربر این نرم‌اÙزار به کار رÙته‌است.
تغییر این صÙحه منجر به تغییر ظاهر واسط کاربر این نرم‌اÙزار برای دیگر کاربران خواهد شد.
برای اÙزودن یا تغییر دادن ترجمه برای همهٔ ویکی‌ها، لطÙاً از [//translatewiki.net/ translatewiki.net]ØŒ پروژهٔ محلی‌سازی مدیاویکی، استÙاده کنید.",
-'sqlhidden' => '(دستور اس‌کیوال پنهان شده)',
'cascadeprotected' => 'این صÙحه در مقابل ویرایش محاÙظت شده‌است چون در {{PLURAL:$1|صÙحهٔ|صÙحه‌های}} محاÙظت‌شدهٔ زیر Ú©Ù‡ گزینهٔ «آبشاری» در {{PLURAL:$1|آن|آن‌ها}} انتخاب شده قرار گرÙته‌است:
$2',
'namespaceprotected' => "شما اجازهٔ ویرایش صÙحه‌های Ùضای نام '''$1''' را ندارید.",
'customcssprotected' => 'شما اجازهٔ ویرایش این صÙحهٔ سی‌اس‌اس را ندارید، زیرا حاوی تنظیم‌های شخصی یک کاربر دیگر است.',
'customjsprotected' => 'شما اجازهٔ ویرایش این صÙحهٔ جاوااسکریپت را ندارید، زیرا حاوی تنظیم‌های شخصی یک کاربر دیگر است.',
+'mycustomcssprotected' => 'شما دارای مجوز ویرایش این صÙحهٔ سی‌اس‌اس نیستید.',
+'mycustomjsprotected' => 'شما دارای مجوز ویرایش این صÙحهٔ جاوااسکریپت نیستید.',
+'myprivateinfoprotected' => 'شما دارای مجوز ویرایش اطلاعات شخصی خود نیستید.',
+'mypreferencesprotected' => 'شما دارای مجوز ویرایش تنظیمات خود نیستید.',
'ns-specialprotected' => 'صÙحه‌های ویژه غیر قابل ویرایش هستند.',
'titleprotected' => "این عنوان توسط [[User:$1|$1]] در برابر ایجاد محاÙظت شده‌است.
دلیل ارائه‌شده این است: «''$2''».",
@@ -856,10 +867,19 @@ $2',
'welcomecreation-msg' => 'حساب کاربری شما ایجاد شده است.
Ùراموش نکنید Ú©Ù‡ [[Special:Preferences|ترجیحات {{SITENAME}}]] خود را تغییر دهید.',
'yourname' => 'نام کاربری:',
+'userlogin-yourname' => 'نام کاربری',
+'userlogin-yourname-ph' => 'نام کاربریتان را وارد کنید',
+'createacct-another-username-ph' => 'نام کاربریتان را وارد کنید',
'yourpassword' => 'رمز عبور:',
+'userlogin-yourpassword' => 'گذرواژه',
+'userlogin-yourpassword-ph' => 'گذرواژه را وارد کنید',
+'createacct-yourpassword-ph' => 'یک گذرواژه وارد کنید',
'yourpasswordagain' => 'تکرار گذرواژه:',
+'createacct-yourpasswordagain' => 'گذرواژه را دوباره وارد کنید',
+'createacct-yourpasswordagain-ph' => 'گذرواژه را وارد کنید برای بار دوم',
'remembermypassword' => 'گذرواژه را (تا حداکثر $1 {{PLURAL:$1|روز|روز}}) در این رایانه به خاطر بسپار',
-'securelogin-stick-https' => 'پس از ورود به سامانه به HTTPS متصل بمان',
+'userlogin-remembermypassword' => 'من را واردشده نگه‌دار',
+'userlogin-signwithsecure' => 'از ورود امن استÙاده کنید',
'yourdomainname' => 'دامنهٔ شما:',
'password-change-forbidden' => 'شما نمی‌توانید گذرواژه‌ها را در این ویکی تغییر دهید.',
'externaldberror' => 'خطایی در ارتباط با پایگاه داده رخ داده‌است یا اینکه شما اجازهٔ به‌روزرسانی حساب خارجی خود را ندارید.',
@@ -871,18 +891,44 @@ $2',
'logout' => 'خروج از سامانه',
'userlogout' => 'خروج از سامانه',
'notloggedin' => 'به سامانه وارد نشده‌اید',
+'userlogin-noaccount' => 'حساب کاربری ندارید؟',
+'userlogin-joinproject' => 'در {{SITENAME}} نام‌نویسی کنید!',
'nologin' => 'حساب کاربری ندارید؟ $1.',
'nologinlink' => 'یک حساب کاربری جدید بسازید',
'createaccount' => 'ایجاد حساب کاربری',
'gotaccount' => 'حساب کاربری دارید؟ $1.',
'gotaccountlink' => 'به سامانه وارد شوید',
'userlogin-resetlink' => 'جزئیات ورود را Ùراموش کرده‌اید؟',
+'userlogin-resetpassword-link' => 'گذرواژه‌تان را Ùراموش کردید؟',
+'helplogin-url' => 'Help:ورود به سامانه',
+'userlogin-helplink' => '[[{{MediaWiki:helplogin-url}}|راهنمای ورود به سامانه]]',
+'userlogin-loggedin' => 'شما در حال حاضر به‌عنوان {{GENDER:$1|$1}} وارد سیستم شده‌اید.
+از Ùرم پایین برای ورود به‌عنوان یک کاربر دیگر استÙاده کنید.',
+'userlogin-createanother' => 'ایجاد یک حساب کاربری دیگر',
+'createacct-join' => 'اطلاعاتتان را در زیر وارد کنید',
+'createacct-another-join' => 'در زیر اطلاعات کاربری جدیدتان را وارد کنید.',
+'createacct-emailrequired' => 'نشانی رایانامه',
+'createacct-emailoptional' => 'نشانی رایانامه (اختیاری)',
+'createacct-email-ph' => 'نشانی رایانامه را وارد کنید',
+'createacct-another-email-ph' => 'نشانی رایانامه را وارد کنید',
'createaccountmail' => 'استÙاده از رمز عبور موقت تصادÙÛŒ Ùˆ Ùرستادن آن به نشانی ایمیل مشخص‌شده',
+'createacct-realname' => 'نام واقعی (اختیاری)',
'createaccountreason' => 'دلیل:',
+'createacct-reason' => 'دلیل',
+'createacct-reason-ph' => 'چرا شما حساب دیگری می‌سازید؟',
+'createacct-captcha' => 'بررسی امنیتی',
+'createacct-imgcaptcha-ph' => 'متن تصویری که در بالا می‌بینید، وارد کنید',
+'createacct-submit' => 'حسابتان را بسازید',
+'createacct-another-submit' => 'ایجاد حساب کاربری دیگر',
+'createacct-benefit-heading' => '{{SITENAME}} توسط اÙرادی مانند شما ساخته شده‌است',
+'createacct-benefit-body1' => '{{PLURAL:$1|ویرایش}}',
+'createacct-benefit-body2' => '{{PLURAL:$1|صÙحه}}',
+'createacct-benefit-body3' => '{{PLURAL:$1|مشارکت‌کنندهٔ|مشارکت‌کنندگان}} اخیر',
'badretype' => 'گذرواژه‌هایی که وارد کرده‌اید یکسان نیستند.',
'userexists' => 'نام کاربری‌ای Ú©Ù‡ وارد کردید قبلاً استÙاده شده‌است.
لطÙاً یک نام دیگر انتخاب کنید.',
'loginerror' => 'خطا در ورود به سامانه',
+'createacct-error' => 'خطای ایجاد حساب کاربری',
'createaccounterror' => 'امکان ساختن این حساب وجود ندارد: $1',
'nocookiesnew' => 'حساب کاربری ایجاد شد، اما شما وارد سامانه نشدید.
{{SITENAME}} برای ورود کاربران به سامانه از Ú©ÙˆÚ©ÛŒ استÙاده می‌کند.
@@ -947,11 +993,13 @@ $2',
اگر این حساب اشتباهی ساخته شده است، این پیغام را نادیده بگیرید.',
'usernamehasherror' => 'نام کاربری نمی‌تواند شامل نویسه‌های درهم باشد',
-'login-throttled' => 'شما چندین‌بار برای ورود به سامانه تلاش کرده‌اید.
-لطÙاً پیش از آنکه دوباره تلاش کنید Ú©Ù…ÛŒ صبر کنید.',
+'login-throttled' => 'شما به تازگی چندین‌بار برای ثبت ورود تلاش کرده‌اید.
+لطÙاً پیش از آنکه دوباره تلاش کنید $1 صبر کنید.',
'login-abort-generic' => 'ورود شما به سیستم ناموÙÙ‚ بود - خاتمهٔ ناگهانی داده شد',
'loginlanguagelabel' => 'زبان: $1',
'suspicious-userlogout' => 'درخواست شما برای خروج از سامانه رد شد زیرا به نظر می‌رسد که این درخواست توسط یک مرورگر معیوب یا پروکسی میانگیر ارسال شده باشد.',
+'createacct-another-realname-tip' => 'نام واقعی اختیاری است.
+اگر آن را وارد کنید هنگام ارجاع به آثارتان Ùˆ انتساب آن‌ها به شما از نام واقعی‌تان استÙاده خواهد شد.',
# Email sending
'php-mail-error-unknown' => 'خطای ناشناخته در تابع mail()‎ پی‌اچ‌پی',
@@ -968,8 +1016,7 @@ $2',
'newpassword' => 'گذرواژهٔ جدید:',
'retypenew' => 'گذرواژهٔ جدید را دوباره وارد کنید',
'resetpass_submit' => 'تنظیم گذرواژه و ورود به سامانه',
-'resetpass_success' => 'گذرواژهٔ شما با موÙقیت تغییر یاÙت!
-اکنون وارد خواهید شد...',
+'changepassword-success' => 'گذرواژهٔ شما با موÙقیت تغییر داده شد!',
'resetpass_forbidden' => 'نمی‌توان گذرواژه‌ها را تغییر داد',
'resetpass-no-info' => 'برای دسترسی مستقیم به این صÙحه شما باید به سامانه وارد شده باشید.',
'resetpass-submit-loggedin' => 'تغییر گذرواژه',
@@ -981,10 +1028,11 @@ $2',
# Special:PasswordReset
'passwordreset' => 'بازنشانی گذرواژه',
-'passwordreset-text' => 'این Ùرم برای تنظیم مجدد رمز عبور خود را پر کنید.',
+'passwordreset-text-one' => 'برای بازنشانی گذرواژه‌تان این Ùرم را کامل کنید.',
+'passwordreset-text-many' => '{{PLURAL:$1|یکی از موارد را برای بازنشانی گذرواژه‌تان پر کنید.}}',
'passwordreset-legend' => 'بازنشانی گذرواژه',
'passwordreset-disabled' => 'بازنشانی گذرواژه در این ویکی غیرÙعال شده است.',
-'passwordreset-pretext' => '{{PLURAL:$1||یکی از قطعه‌های داده را در زیر وارد کنید}}',
+'passwordreset-emaildisabled' => 'ویژگی‌های رایانامه در این ویکی ناÙعال شده‌اند.',
'passwordreset-username' => 'نام کاربری:',
'passwordreset-domain' => 'دامنه:',
'passwordreset-capture' => 'رایانامهٔ نهایی نشان داده شود؟',
@@ -1007,7 +1055,7 @@ $2
گذرواژهٔ موقت: $2',
'passwordreset-emailsent' => 'یک نامهٔ بازنشانی گذرواژه Ùرستاده شده است.',
'passwordreset-emailsent-capture' => 'یک رایانامهٔ بازنشانی Ú©Ù‡ در پایین نمایش داده شده، Ùرستاده شده است.',
-'passwordreset-emailerror-capture' => 'رایانامهٔ یادآور همانطور Ú©Ù‡ در زیر مشاهده می‌Ùرمایید ایجاد شد ولی ارسال آن به کاربر موÙقیت‌آمیز نبود: $1',
+'passwordreset-emailerror-capture' => 'رایانامهٔ بازنشانی، Ú©Ù‡ در زیر نمایش داده شده، ایجاد شد، ولی ارسال آن به {{GENDER:$2|کاربر}} موÙقیت‌آمیز نبود: $1',
# Special:ChangeEmail
'changeemail' => 'تغییر نشانی رایانامه',
@@ -1021,6 +1069,18 @@ $2
'changeemail-submit' => 'تغییر رایانامه',
'changeemail-cancel' => 'انصراÙ',
+# Special:ResetTokens
+'resettokens' => 'بازنشانی شناساننده‌ها',
+'resettokens-text' => 'شما می توانید شناساننده‌ها که اجازهٔ دسترسی به برخی داده‌های خصوصی مرتبط با حسابتان را می‌دهد بازنشانی کنید.
+در صورتی باید این کار را انجام دهید Ú©Ù‡ تصادقاً آن‌ها را با کسی در میان گذاشته‌اید یا به حسابتان Ù†Ùوذ شده است.',
+'resettokens-no-tokens' => 'هیچ شناساننده‌ای برای بازنشانی وجود ندارد.',
+'resettokens-legend' => 'بازنشانی شناساننده‌ها',
+'resettokens-tokens' => 'شناساننده‌ها:',
+'resettokens-token-label' => '$1 (مقدار کنونی: $2)',
+'resettokens-watchlist-token' => 'شناساننده برای خوراک وب٠[[Special:Watchlist|تغییرات صÙحه‌هایی Ú©Ù‡ پیگیری می‌کنید]] (اتم/آراس‌اس)',
+'resettokens-done' => 'بازنشانی شناساننده‌ها.',
+'resettokens-resetbutton' => 'بازشناسی شناساننده‌های گزیده‌شده.',
+
# Edit page toolbar
'bold_sample' => 'متن پررنگ',
'bold_tip' => 'متن پررنگ',
@@ -1225,12 +1285,15 @@ $2
به نظرمی‌رسد Ú©Ù‡ صÙحه حذ٠شده باشد.',
'edit-conflict' => 'تعارض ویرایشی.',
'edit-no-change' => 'ویرایش شما نادیده گرÙته شد، زیرا تغییری در متن داده نشده بود.',
+'postedit-confirmation' => 'ویرایش شما ذخیره شد.',
'edit-already-exists' => 'امکان ساختن صÙحهٔ جدید وجود ندارد.
این صÙحه از قبل وجود داشته‌است.',
'defaultmessagetext' => 'متن پیش‌Ùرض پیغام',
'content-failed-to-parse' => 'عدم موÙقیت در تجزیه محتوای $2 برای مدل $1: $3',
'invalid-content-data' => 'داده محتوای نامعتبر',
'content-not-allowed-here' => 'محتوای «$1» در صÙحهٔ [[$2]] مجاز نیست',
+'editwarning-warning' => 'خروج از این صÙحه ممکن است باعث از دست رÙتن هرچه نوشته‌اید شود.
+اگر شما با نام کاربری وارد شده‌اید می‌توانید این هشدار را در بخش «در حال ویرایش» ترجیحاتتان بیابید.',
# Content models
'content-model-wikitext' => 'ویکی‌متن',
@@ -1266,6 +1329,7 @@ $2
'undo-failure' => 'به علت تعارض با ویرایش‌های میانی، این ویرایش را نمی‌توان خنثی کرد.',
'undo-norev' => 'این ویرایش را نمی‌توان خنثی کرد چون وجود ندارد یا حذ٠شده‌است.',
'undo-summary' => 'خنثی‌سازی ویرایش $1 توسط [[Special:Contributions/$2|$2]] ([[User talk:$2|بحث]])',
+'undo-summary-username-hidden' => 'خنثی‌سازی نسخهٔ $1 به دست یک کاربر پنهان‌شده',
# Account creation failure
'cantcreateaccounttitle' => 'نمی‌توان حساب باز کرد',
@@ -1444,6 +1508,7 @@ $1",
'compareselectedversions' => 'مقایسهٔ نسخه‌های انتخاب‌شده',
'showhideselectedversions' => 'نمایش/نهÙتن نسخه‌های انتخاب شده',
'editundo' => 'خنثی‌سازی',
+'diff-empty' => '(بدون تÙاوت)',
'diff-multi' => '({{PLURAL:$1|یک|$1}} ویرایش میانی توسط {{PLURAL:$2|یک|$2}} کاربر نشان داده نشده‌است)',
'diff-multi-manyusers' => '({{PLURAL:$1|یک|$1}} ویرایش میانی توسط بیش از {{PLURAL:$2|یک|$2}} کاربر نشان داده نشده‌است)',
'difference-missing-revision' => '{{PLURAL:$2|یک ویرایش|$2 ویرایش}} از تÙاوت نسخه‌ها ($1) {{PLURAL:$2|یاÙت|یاÙت}} نشد.
@@ -1471,7 +1536,6 @@ $1",
'searchmenu-legend' => 'گزینه‌های جستجو',
'searchmenu-exists' => "'''صÙحه‌ای با عنوان \"[[:\$1]]\" در این ویکی وجود دارد.'''",
'searchmenu-new' => "'''صÙحهٔ «[[:$1]]» را در این ویکی بسازید!'''",
-'searchhelp-url' => 'Help:محتوا',
'searchmenu-prefix' => '[[Special:PrefixIndex/$1|مرور صÙحه‌های با این پیشوند]]',
'searchprofile-articles' => 'صÙحه‌های محتوایی',
'searchprofile-project' => 'صÙحه‌های راهنما Ùˆ پروژه',
@@ -1515,15 +1579,7 @@ $1",
'searchdisabled' => 'جستجو در {{SITENAME}} Ùعال نیست.
موقتاً می‌توانید از جستجوی Google استÙاده کنید.
توجه کنید که نتایج حاصل از جستجو با آن روش ممکن است به‌روز نباشند.',
-
-# Quickbar
-'qbsettings' => 'نوار سریع',
-'qbsettings-none' => 'نباشد',
-'qbsettings-fixedleft' => 'ثابت چپ',
-'qbsettings-fixedright' => 'ثابت راست',
-'qbsettings-floatingleft' => 'شناور چپ',
-'qbsettings-floatingright' => 'شناور راست',
-'qbsettings-directionality' => 'ثابت، بسته به جهت نگارش زبان شما',
+'search-error' => 'خطایی هنگام جست‌وجو رخ داده است: $1',
# Preferences page
'preferences' => 'ترجیحات',
@@ -1557,7 +1613,6 @@ $1",
'resetprefs' => 'صÙرکردن ترجیحات',
'restoreprefs' => 'برگرداندن تمام تنظیمات پیش‌Ùرض (در تمامی قسمت‌ها)',
'prefs-editing' => 'ویرایش',
-'prefs-edit-boxsize' => 'اندازهٔ پنجرهٔ ویرایش.',
'rows' => 'تعداد سطرها:',
'columns' => 'تعداد ستون‌ها:',
'searchresultshead' => 'جستجو',
@@ -1568,9 +1623,8 @@ $1",
'recentchangesdays-max' => 'حداکثر $1 {{PLURAL:$1|روز}}',
'recentchangescount' => 'تعداد پیش‌Ùرض ویرایش‌های نمایش یاÙته:',
'prefs-help-recentchangescount' => 'این گزینه شامل تغییرات اخیر، تاریخچهٔ صÙحه‌ها Ùˆ سیاهه‌ها می‌شود.',
-'prefs-help-watchlist-token' => 'پرکردن این بخش با یک کلید رمز سبب ایجاد یک خوراک آراس‌اس برای Ùهرست پی‌گیری شما می‌شود.
-هر کس Ú©Ù‡ این کلید را بداند می‌تواند Ùهرست پی‌گیری شما را بخواند، پس مقداری ایمن انتخاب کنید.
-مقدار تصادÙÛŒ Ú©Ù‡ برای شما ایجاد شده‌است: $1',
+'prefs-help-watchlist-token2' => 'این کلید رمز خوراک وب Ùهرست پی‌گیری‌های شماست.
+هرکس آن را بداند می‌تواند Ùهرست پی‌گیری‌هایتان را بخواند، بنابراین آن را به اشتراک نگذارید. [[Special:ResetTokens|اگر لازم است آن را تغییر دهید اینجا را کلیک کنید]].',
'savedprefs' => 'ترجیحات شما ذخیره شد.',
'timezonelegend' => 'منطقهٔ زمانی:',
'localtime' => 'زمان محلی:',
@@ -1601,7 +1655,6 @@ $1",
'prefs-reset-intro' => 'شما می‌توانید از این صÙحه برای بازگرداندن تنظیمات خود به پیش‌Ùرض تارنما استÙاده کنید.
این کار بازگشت‌ناپذیر است.',
'prefs-emailconfirm-label' => 'تأیید رایانامه:',
-'prefs-textboxsize' => 'اندازهٔ جعبهٔ ویرایش',
'youremail' => 'رایانامه:',
'username' => '{{GENDER:$1|نام کاربری}}:',
'uid' => 'شناسهٔ {{GENDER:$1|کاربری}}:',
@@ -1637,6 +1690,8 @@ $1",
'prefs-dateformat' => 'آرایش تاریخ',
'prefs-timeoffset' => 'Ùاصلهٔ زمانی',
'prefs-advancedediting' => 'تنظیمات عمومی',
+'prefs-editor' => 'ویرایشگر',
+'prefs-preview' => 'پیش‌نمایش',
'prefs-advancedrc' => 'گزینه‌های پیشرÙته',
'prefs-advancedrendering' => 'گزینه‌های پیشرÙته',
'prefs-advancedsearchoptions' => 'گزینه‌های پیشرÙته',
@@ -1644,7 +1699,9 @@ $1",
'prefs-displayrc' => 'گزینه‌های نمایش',
'prefs-displaysearchoptions' => 'گزینه‌های نمایش',
'prefs-displaywatchlist' => 'گزینه‌های نمایش',
+'prefs-tokenwatchlist' => 'نشانه',
'prefs-diffs' => 'تÙاوت‌ها',
+'prefs-help-prefershttps' => 'تأثیر این ترجیح بعد از ورود بعدی شما اعمال خواهد شد.',
# User preference: email validation using jQuery
'email-address-validity-valid' => 'نشانی رایانامه معتبر به نظر می‌رسد',
@@ -1671,6 +1728,8 @@ $1",
'userrights-notallowed' => 'شما مجوز برای اÙزودن یا حذ٠حقوق کاربر را ندارید.',
'userrights-changeable-col' => 'گروه‌هایی که می‌توانید تغییر دهید',
'userrights-unchangeable-col' => 'گروه‌هایی که نمی‌توانید تغییر دهید',
+'userrights-conflict' => 'تعارض دسترسی‌های کاربری! لطÙاً بررسی کنید Ùˆ تغییرات را تأیید کنید.',
+'userrights-removed-self' => 'شما با موÙقیت دسترسی‌های خود را واستاندید. به این ترتیب شما دیگر به این صÙحه دسترسی ندارید.',
# Groups
'group' => 'گروه:',
@@ -1736,11 +1795,19 @@ $1",
'right-proxyunbannable' => 'تاثیر نپذیرÙتن از قطع دسترسی خودکار پروکسی‌ها',
'right-unblockself' => 'بازکردن دسترسی خود',
'right-protect' => 'تغییر میزان محاÙظت صÙحه‌ها Ùˆ ویرایش صÙحه‌های محاÙظت شده آبشاری',
-'right-editprotected' => 'ویرایش صÙحه‌های محاÙظت شده (به شرط نبود محاÙظت آبشاری)',
+'right-editprotected' => 'ویرایش صÙحه‌های محاÙظت شده به عنوان "{{int:protect-level-sysop}}"',
+'right-editsemiprotected' => 'ویرایش صÙحه Ø­Ùاظت‌شده به عنوان "{{int:protect-level-autoconfirmed}}"',
'right-editinterface' => 'ویرایش واسط کاربری',
'right-editusercssjs' => 'ویرایش صÙحه‌های CSS Ùˆ JS دیگر کاربرها',
'right-editusercss' => 'ویرایش صÙحه‌های CSS دیگر کاربرها',
'right-edituserjs' => 'ویرایش صÙحه‌های JS دیگر کاربرها',
+'right-editmyusercss' => 'پرونده‌های سی‌اس‌اس کاربری خود را ویرایش کنید',
+'right-editmyuserjs' => 'پرونده‌های جاوااسکریپت کاربری خود را ویرایش کنید',
+'right-viewmywatchlist' => 'Ùهرست پیگیری‌های خود را ببینید',
+'right-editmywatchlist' => 'Ùهرست پیگیری‌های خود را ویرایش کنید. توجه داشته باشید برخی از اقدامات حتی بدون این دسترسی هم صÙحه‌ها را اضاÙÙ‡ می‌کنند.',
+'right-viewmyprivateinfo' => 'داده‌های خصوصی خود را ببینید (مانند رایانشانی و نام واقعی)',
+'right-editmyprivateinfo' => 'داده‌های خصوصی خود را ویرایش کنید (مانند رایانشانی و نام واقعی)',
+'right-editmyoptions' => 'ترجیحات خود را ویرایش',
'right-rollback' => 'واگردانی سریع ویرایش‌های آخرین کاربری Ú©Ù‡ یک صÙحه را ویرایش کرده‌است',
'right-markbotedits' => 'علامت‌زدن ویرایش‌های واگردانی‌شده به‌عنوان ویرایش ربات',
'right-noratelimit' => 'تاثیر نپذیرÙتن از محدودیت سرعت',
@@ -1802,12 +1869,19 @@ $1",
'action-userrights-interwiki' => 'ویرایش اختیارات کاربری کاربران یک ویکی دیگر',
'action-siteadmin' => 'Ù‚ÙÙ„ کردن Ùˆ باز کردن پایگاه داده',
'action-sendemail' => 'ارسال ایمیل',
+'action-editmywatchlist' => 'Ùهرست پیگیری‌های خود را ویرایش کنید',
+'action-viewmywatchlist' => 'Ùهرست پیگیری‌های خود را ببینید',
+'action-viewmyprivateinfo' => 'اطلاعات خصوصی خود را ببینید',
+'action-editmyprivateinfo' => 'اطلاعات خصوصی خود را ویرایش کنید',
# Recent changes
'nchanges' => '$1 تغییر',
+'enhancedrc-since-last-visit' => '$1 {{PLURAL:$1|از آخرین بازدید}}',
+'enhancedrc-history' => 'تاریخچه',
'recentchanges' => 'تغییرات اخیر',
'recentchanges-legend' => 'گزینه‌های تغییرات اخیر',
'recentchanges-summary' => 'آخرین تغییرات ویکی را در این صÙحه پی‌گیری کنید.',
+'recentchanges-noresult' => 'هیچ تغییری در طول دورهٔ تعیین‌شده با این معیارها هم‌خوانی نداشت.',
'recentchanges-feed-description' => 'آخرین تغییرات ویکی را در این خوراک پی‌گیری کنید.',
'recentchanges-label-newpage' => 'این ویرایش صÙحه‌ای جدید ایجاد کرد',
'recentchanges-label-minor' => 'این ویرایش جزئی‌است',
@@ -1844,7 +1918,6 @@ $1",
'recentchangeslinked-feed' => 'تغییرات مرتبط',
'recentchangeslinked-toolbox' => 'تغییرات مرتبط',
'recentchangeslinked-title' => 'تغییرات مرتبط با $1',
-'recentchangeslinked-noresult' => 'در بازهٔ زمانی داده‌شده تغییری در صÙحه‌های پیوندداده رخ نداده‌است.',
'recentchangeslinked-summary' => "در زیر Ùهرستی از تغییرات اخیر صÙحه‌های پیوند داده شده از این صÙحه (یا اعضای رده مورد نظر) را می‌بینید.
صÙحه‌هایی Ú©Ù‡ در [[Special:Watchlist|Ùهرست پی‌گیری‌هایتان]] باشند به صورت '''پررنگ''' نشان داده می‌شوند.",
'recentchangeslinked-page' => 'نام صÙحه:',
@@ -1856,7 +1929,7 @@ $1",
'reuploaddesc' => 'بازگشت به Ùرم بارگذاری',
'upload-tryagain' => 'ارسال توضیحات تغییر یاÙته پرونده',
'uploadnologin' => 'به سامانه وارد نشده‌اید',
-'uploadnologintext' => 'برای بارگذاری پرونده‌ها باید [[Special:UserLogin|به سامانه وارد شوید]].',
+'uploadnologintext' => 'برای بارگذاری پرونده باید $1.',
'upload_directory_missing' => 'شاخهٔ بارگذاری ($1) وجود ندارد و قابل ایجاد نیست.',
'upload_directory_read_only' => 'شاخهٔ بارگذاری ($1) از طر٠سرور وب قابل نوشتن نیست.',
'uploaderror' => 'خطای بارگذاری',
@@ -2081,7 +2154,6 @@ https://www.mediawiki.org/wiki/Manual:Image_Authorization را ببینید.',
'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>
@@ -2112,6 +2184,10 @@ https://www.mediawiki.org/wiki/Manual:Image_Authorization را ببینید.',
'listfiles_size' => 'اندازه',
'listfiles_description' => 'توضیح',
'listfiles_count' => 'نسخه‌ها',
+'listfiles-show-all' => 'شامل نسخه‌های قدیمی عکس‌ها',
+'listfiles-latestversion' => 'نسخهٔ Ùعلی',
+'listfiles-latestversion-yes' => 'بله',
+'listfiles-latestversion-no' => 'خیر',
# File description page
'file-anchor-link' => 'پرونده',
@@ -2209,6 +2285,13 @@ https://www.mediawiki.org/wiki/Manual:Image_Authorization را ببینید.',
'randompage' => 'مقالهٔ تصادÙÛŒ',
'randompage-nopages' => 'هیچ صÙحه‌ای در این {{PLURAL:$2|Ùضای نام|Ùضاهای نام}} موجود نیست: $1.',
+# Random page in category
+'randomincategory' => 'صÙحهٔ تصادÙÛŒ در رده',
+'randomincategory-invalidcategory' => '«$1» نامی معتبر برای یک ردهٔ نیست.',
+'randomincategory-nopages' => 'هیج صÙحه‌ای در رده [[:Category:$1|$1]] وجود ندارد.',
+'randomincategory-selectcategory' => 'دریاÙت صÙحه‌ای تصادÙÛŒ از دسته‌بندی: $1 $2.',
+'randomincategory-selectcategory-submit' => 'برو',
+
# Random redirect
'randomredirect' => 'تغییرمسیر تصادÙÛŒ',
'randomredirect-nopages' => 'هیج صÙحهٔ تغییرمسیری در Ùضای نام «$1» موجود نیست.',
@@ -2234,17 +2317,13 @@ https://www.mediawiki.org/wiki/Manual:Image_Authorization را ببینید.',
'statistics-users-active-desc' => 'کاربرانی Ú©Ù‡ در {{PLURAL:$1|روز|$1 روز}} قبل Ùعالیتی انجام داده‌اند',
'statistics-mostpopular' => 'صÙحه‌هایی Ú©Ù‡ بیشترین تعداد بازدیدکننده را داشته‌اند',
-'disambiguations' => 'صÙحه‌های دارای پیوند به صÙحه‌های ابهام‌زدایی',
-'disambiguationspage' => 'Template:ابهام‌زدایی',
-'disambiguations-text' => "صÙحه‌های زیر حاوی حداقل یک پیوند به یک '''صÙحهٔ ابهام‌زدایی''' هستند.
-این صÙحه‌ها شاید در عوض به موضوعات مرتبط پیوند داده شوند.<br />
-یک صÙحه هنگامی صÙحهٔ ابهام‌زدایی در نظر گرÙته می‌شود Ú©Ù‡ در آن از الگویی Ú©Ù‡ به [[MediaWiki:Disambiguationspage]] پیوند دارد استÙاده شده باشد.",
-
'pageswithprop' => 'صÙحه‌های دارای خاصیت صÙحه',
'pageswithprop-legend' => 'صÙحه‌های دارای خاصیت صÙحه',
'pageswithprop-text' => 'این صÙحه Ùهرستی است از صÙحه‌هایی Ú©Ù‡ از یک خاصیت صÙحهٔ خاص استÙاده می‌کنند.',
'pageswithprop-prop' => 'نام خاصیت:',
'pageswithprop-submit' => 'برو',
+'pageswithprop-prophidden-long' => 'جزییات مخÙÛŒ متن طولانی ($1)',
+'pageswithprop-prophidden-binary' => 'جزییات مقدار مخÙÛŒ باینری ($1)',
'doubleredirects' => 'تغییرمسیرهای دوتایی',
'doubleredirectstext' => 'این صÙحه Ùهرستی از صÙحه‌های تغییرمسیری را ارائه می‌کند Ú©Ù‡ به صÙحهٔ تغییرمسیر دیگری اشاره می‌کنند.
@@ -2302,6 +2381,7 @@ https://www.mediawiki.org/wiki/Manual:Image_Authorization را ببینید.',
'mostrevisions' => 'صÙحه‌های دارای بیشترین نسخه',
'prefixindex' => 'تمام صÙحه‌ها با پیشوند',
'prefixindex-namespace' => 'همهٔ صÙحه‌های دارای پیشوند (Ùضای‌نام $1)',
+'prefixindex-strip' => 'حذ٠پیشوند در Ùهرست',
'shortpages' => 'صÙحه‌های کوتاه',
'longpages' => 'صÙحه‌های بلند',
'deadendpages' => 'صÙحه‌های بن‌بست',
@@ -2317,6 +2397,7 @@ https://www.mediawiki.org/wiki/Manual:Image_Authorization را ببینید.',
'listusers' => 'Ùهرست کاربران',
'listusers-editsonly' => 'Ùقط کاربرانی Ú©Ù‡ ویرایش دارند را نشان بده',
'listusers-creationsort' => 'مرتب کردن بر اساس تاریخ ایجاد',
+'listusers-desc' => 'ترتیب نزولی',
'usereditcount' => '$1 {{PLURAL:$1|ویرایش|ویرایش}}',
'usercreated' => '{{GENDER:$3|ایجادشده}} در تاریخ $1 در ساعت $2',
'newpages' => 'صÙحه‌های تازه',
@@ -2493,10 +2574,9 @@ https://www.mediawiki.org/wiki/Manual:Image_Authorization را ببینید.',
'unwatchthispage' => 'توق٠پی‌گیری',
'notanarticle' => 'صÙحه محتوایی نیست',
'notvisiblerev' => 'آخرین نسخه توسط کاربری دیگر حذ٠شده‌است',
-'watchnochange' => 'هیچ یک از موارد در حال پی‌گیری شما در دورهٔ زمانی نمایش‌یاÙته ویرایش نشده است.',
'watchlist-details' => 'بدون احتساب صÙحه‌های بحث، {{PLURAL:$1|$1 صÙحه|$1 صÙحه}} در Ùهرست پی‌گیری‌های شما قرار {{PLURAL:$1|دارد|دارند}}.',
-'wlheader-enotif' => '*اطلاع‌رسانی از طریق رایانامه امکان‌پذیر است.',
-'wlheader-showupdated' => "*صÙحه‌هایی Ú©Ù‡ پس از آخرین سرزدنتان به آنها تغییر کرده‌اند '''پررنگ''' نشان داده شده‌اند.",
+'wlheader-enotif' => 'آگاه‌سازی رایانامه‌ای Ùعال است.',
+'wlheader-showupdated' => "صÙحه‌هایی Ú©Ù‡ پس از آخرین بازدید شما تغییر کرده‌اند '''پررنگ''' نمایش داده شده‌اند.",
'watchmethod-recent' => 'بررسی ویرایش‌های اخیر برای صÙحه‌های مورد پی‌گیری',
'watchmethod-list' => 'بررسی صÙحه‌های مورد پی‌گیری برای ویرایش‌های اخیر',
'watchlistcontains' => 'Ùهرست پی‌گیری‌های شما حاوی $1 {{PLURAL:$1|صÙحه|صÙحه}} است.',
@@ -2752,7 +2832,7 @@ $1',
'contributions' => 'مشارکت‌های {{GENDER:$1|کاربر}}',
'contributions-title' => 'مشارکت‌های کاربری $1',
'mycontris' => 'مشارکت‌ها',
-'contribsub2' => 'برای $1 ($2)',
+'contribsub2' => 'برای {{GENDER:$3|$1}} ($2)',
'nocontribs' => 'هیچ تغییری با این مشخصات یاÙت نشد.',
'uctop' => '(بالا)',
'month' => 'در این ماه (و پیش از آن):',
@@ -2911,15 +2991,13 @@ $1',
این نشانی به همراه بازه $2 بسته شده که قابل باز شدن است.',
'ip_range_invalid' => 'بازهٔ آی‌پی نامعتبر.',
'ip_range_toolarge' => 'قطع دسترسی بازه‌های بزرگتر از /$1 مجاز نیست.',
-'blockme' => 'دسترسی مرا قطع کن',
'proxyblocker' => 'مسدود کننده پروکسی',
-'proxyblocker-disabled' => 'این عملکرد غیرÙعال شده‌است.',
'proxyblockreason' => 'نشانی آی‌پی شما بسته شده است چون متعلق به یک پروکسی باز است.
لطÙاً با ارائه دهندهً خدمات اینترنت خود یا پشتیبانی ÙÙ†ÛŒ تماس بگیرید Ùˆ آنها را از این مشکل امنیتی جدی آگاه کنید.',
-'proxyblocksuccess' => 'انجام شد.',
'sorbsreason' => 'نشانی آی‌پی شما توسط DNSBL مورد استÙاده {{SITENAME}} به عنوان یک پروکسی باز گزارش شده‌است.',
'sorbs_create_account_reason' => 'نشانی آی‌پی شما توسط DNSBL مورد استÙاده {{SITENAME}} به عنوان یک پروکسی باز گزارش شده‌است.
شما اجازهٔ ساختن حساب کاربری ندارید.',
+'xffblockreason' => 'نشانی آی‌پی در X-Forwarded-For header موجود است Ùˆ پروکسی شما یا سروری Ú©Ù‡ از آن استÙاده می‌کنید بسته‌شده‌است. دلیل بسته‌شدن: $1',
'cant-block-while-blocked' => 'در مدتی که دسترسی شما بسته است نمی‌توانید دسترسی کاربران دیگر را قطع کنید.',
'cant-see-hidden-user' => 'کاربری که می‌خواهید ببندید قبلاً بسته شده و پنهان گردیده است. چون شما دسترسی پنهان کردن کاربران را ندارید، نمی‌توانید قطع دسترسی کاربر را ببینید یا ویرایش کنید.',
'ipbblocked' => 'شما نمی‌توانید دسترسی دیگر کاربران را ببندید یا باز کنید زیرا دسترسی خودتان بسته است.',
@@ -3086,6 +3164,8 @@ $1',
'thumbnail-more' => 'بزرگ‌کردن',
'filemissing' => 'پرونده وجود ندارد',
'thumbnail_error' => 'خطا در ایجاد بندانگشتی: $1',
+'thumbnail_error_remote' => 'پیام خطای $1 :
+$2',
'djvu_page_error' => 'صÙحهٔ DjVu خارج از حدود مجاز',
'djvu_no_xml' => 'امکان پیدا کردن پروندهٔ XML برای استÙادهٔ DjVu وجود نداشت.',
'thumbnail-temp-create' => 'نمی‌توان پروندهٔ بندانگشتی موقت را ساخت',
@@ -3311,13 +3391,8 @@ $1',
'pageinfo-category-files' => 'تعداد پرونده‌ها',
# Skin names
-'skinname-standard' => 'کلاسیک',
-'skinname-nostalgia' => 'نوستالژی',
'skinname-cologneblue' => 'آبی کلن',
'skinname-monobook' => 'مونوبوک',
-'skinname-myskin' => 'پوستهٔ من',
-'skinname-chick' => 'شیک',
-'skinname-simple' => 'ساده',
'skinname-modern' => 'مدرن',
'skinname-vector' => 'برداری',
@@ -3397,11 +3472,25 @@ $1',
'minutes' => '{{PLURAL: $1|دقیقه|دقیقه}}',
'hours' => '{{PLURAL: $1|ساعت|ساعت}}',
'days' => '{{PLURAL: $1|روز|روز}}',
+'weeks' => '{{PLURAL:$1|$1 Ù‡Ùته|$1 Ù‡Ùته}}',
'months' => '{{PLURAL:$1|$1 ماه|}}',
'years' => '{{PLURAL:$1|$1 سال|}}',
'ago' => '$1 پیش',
'just-now' => 'هم‌اکنون',
+# Human-readable timestamps
+'hours-ago' => '$1 ساعت قبل',
+'minutes-ago' => '$1 دقیقه قبل',
+'seconds-ago' => '$1 {{PLURAL:$1|ثانیه|ثانیه}} قبل',
+'monday-at' => 'دوشنبهٔ $1',
+'tuesday-at' => 'سه‌شنبهٔ $1',
+'wednesday-at' => 'چهارشنبهٔ $1',
+'thursday-at' => 'پنج‌شنبهٔ $1',
+'friday-at' => 'جمعهٔ $1',
+'saturday-at' => 'شنبهٔ $1',
+'sunday-at' => 'یک‌شنبهٔ $1',
+'yesterday-at' => 'دیروز در $1',
+
# Bad image list
'bad_image_list' => 'اطلاعات را باید اینگونه وارد کنید:
@@ -3429,7 +3518,7 @@ $1',
* gpslongitude
* gpsaltitude',
-# EXIF tags
+# Exif tags
'exif-imagewidth' => 'عرض',
'exif-imagelength' => 'طول',
'exif-bitspersample' => 'نقطه در هر جزء',
@@ -3608,7 +3697,7 @@ $1',
'exif-originalimageheight' => 'بلندی تصویر قبل از برش دادن',
'exif-originalimagewidth' => 'پهنای تصویر قبل از برش دادن',
-# EXIF attributes
+# Exif attributes
'exif-compression-1' => 'غیرÙشرده',
'exif-compression-2' => 'رمزگذاری سی‌سی‌آی‌تی‌تی گروه Û³ یک بعدی به روش هاÙمن تغییریاÙته روی طول',
'exif-compression-3' => 'رمزگذاری نمابر سی‌سی‌آی‌تی‌تی گروه ۳',
@@ -4064,7 +4153,6 @@ $5
'version-other' => 'غیره',
'version-mediahandlers' => 'به‌دست‌گیرنده‌های رسانه‌ها',
'version-hooks' => 'قلاب‌ها',
-'version-extension-functions' => 'عملگرهای اÙزونه',
'version-parser-extensiontags' => 'برچسب‌های اÙزونه تجزیه‌گر',
'version-parser-function-hooks' => 'قلاب‌های عملگر تجزیه‌گر',
'version-hook-name' => 'نام قلاب',
@@ -4074,6 +4162,7 @@ $5
'version-license' => 'اجازه‌نامه',
'version-poweredby-credits' => "این ویکی توسط '''[//www.mediawiki.org/ مدیاویکی]''' پشتیبانی می‌شود، کلیهٔ حقوق محÙوظ است © 2001-$1 $2.",
'version-poweredby-others' => 'دیگران',
+'version-poweredby-translators' => 'مترجمان translatewiki.net',
'version-credits-summary' => 'اÙراد زیر را به خاطر ویرایش‌هایش در [[Special:Version|مدیاویکی]] معرÙÛŒ می‌نمائیم.',
'version-license-info' => 'مدیاویکی نرم‌اÙزاری رایگان است؛ می‌توانید آن را تحت شرایط مجوز عمومی همگانی گنو Ú©Ù‡ توسط بنیاد نرم‌اÙزار رایگان منتشر شده‌است، بازنشر کنید؛ یا نسخهٔ Û² از این مجوز، یا (بنا به اختیار) نسخه‌های بعدی.
@@ -4089,11 +4178,17 @@ $5
'version-entrypoints-articlepath' => '[https://www.mediawiki.org/wiki/Manual:$wgArticlePath مسیر مقاله]',
'version-entrypoints-scriptpath' => '[https://www.mediawiki.org/wiki/Manual:$wgScriptPath مسیر اسکریپت]',
-# Special:FilePath
-'filepath' => 'مسیر پرونده',
-'filepath-page' => 'پرونده:',
-'filepath-submit' => 'برو',
-'filepath-summary' => 'این صÙحهٔ ویژه نشانی کامل برای یک پرونده را نشان می‌دهد. تصاویر با Ú©ÛŒÙیت وضوح کامل نشان داده می‌شوند، سایر انواع پرونده با برنامه مخصوص به خودشان باز می‌شوند.',
+# Special:Redirect
+'redirect' => 'تغییرمسیر توسط پرونده، کاربر یا شناسهٔ نسخه',
+'redirect-legend' => 'تغییرمسیر به یک پرونده یا صÙحه',
+'redirect-summary' => 'این صÙحهٔ ویژه به پرونده (نام پرونده داده‌شده)ØŒ صÙحه (شماره شناسهٔ صÙحه داده‌شده) یا صÙحهٔ کاربری (شناسهٔ عددی کاربری داده‌شده) تغییرمسیر می‌یابد',
+'redirect-submit' => 'برو',
+'redirect-lookup' => 'جستجو:',
+'redirect-value' => 'مقدار:',
+'redirect-user' => 'شناسهٔ کاربر',
+'redirect-revision' => 'نسخهٔ صÙحه',
+'redirect-file' => 'نام پرونده',
+'redirect-not-exists' => 'مقدار پیدا نشد',
# Special:FileDuplicateSearch
'fileduplicatesearch' => 'جستجو برای پرونده‌های تکراری',
@@ -4142,12 +4237,16 @@ $5
'tags' => 'برچسب‌های تغییر مجاز',
'tag-filter' => 'پالایش [[Special:Tags|برچسب‌ها]]:',
'tag-filter-submit' => 'پالایه',
+'tag-list-wrapper' => '([[Special:Tags|{{PLURAL:$1|برچسب|برچسب}}]]: $2)',
'tags-title' => 'برچسب‌ها',
'tags-intro' => 'این صÙحه Ùهرستی‌است از برچسب‌هایی Ú©Ù‡ نرم‌اÙزار با آن‌ها ویرایش‌ها را علامت‌گذری می‌کند، به همراه معانی آن‌ها.',
'tags-tag' => 'نام برچسب',
'tags-display-header' => 'نمایش در Ùهرست‌های تغییرات',
'tags-description-header' => 'توضیح کامل معنی',
+'tags-active-header' => 'Ùعال؟',
'tags-hitcount-header' => 'تغییرهای برچسب‌دار',
+'tags-active-yes' => 'بله',
+'tags-active-no' => 'خیر',
'tags-edit' => 'ویرایش',
'tags-hitcount' => '$1 {{PLURAL:$1|تغییر|تغییر}}',
@@ -4168,6 +4267,7 @@ $5
'dberr-problems' => 'شرمنده! این تارنما از مشکلات ÙÙ†ÛŒ رنج می‌برد.',
'dberr-again' => 'چند دقیقه صبر کند Ùˆ دوباره صÙحه را بارگیری کنید.',
'dberr-info' => '(امکان برقراری ارتباط با کارساز پایگاه داده وجود ندارد: $1)',
+'dberr-info-hidden' => '(امکان تماس با پایگاه‌داده‌ها کارساز امکان‌پذیر نیست)',
'dberr-usegoogle' => 'شما در این مدت می‌توانید با استÙاده از Ú¯ÙˆÚ¯Ù„ جستجو کنید.',
'dberr-outofdate' => 'توجه کنید که نمایه‌های آن‌ها از محتوای ما ممکن است به روز نباشد.',
'dberr-cachederror' => 'آن‌چه در ادامه می‌آید یک Ú©Ù¾ÛŒ از صÙحهٔ درخواست شده است Ú©Ù‡ در کاشه قرار دارد، Ùˆ ممکن است به روز نباشد.',
@@ -4183,6 +4283,9 @@ $5
'htmlform-submit' => 'ارسال',
'htmlform-reset' => 'خنثی کردن تغییرات',
'htmlform-selectorother-other' => 'دیگر',
+'htmlform-no' => 'نه',
+'htmlform-yes' => 'بله',
+'htmlform-chosen-placeholder' => 'یک گزینه را انتخاب کنید',
# SQLite database support
'sqlite-has-fts' => '$1 با پشتیبانی از جستجو در متن کامل',
@@ -4299,4 +4402,19 @@ $5
# Image rotation
'rotate-comment' => 'تصویر به دست $1 {{PLURAL:$1|درجهٔ|درجهٔ}} ساعت‌گرد چرخانده شد',
+# Limit report
+'limitreport-title' => 'داده‌های رخ‌نمانگاری تجزیه‌کننده:',
+'limitreport-cputime' => 'زمان مصر٠سی‌پی‌یو',
+'limitreport-cputime-value' => '$1 {{PLURAL:$1|ثانیه}}',
+'limitreport-walltime' => 'استÙاده زمان واقعی',
+'limitreport-walltime-value' => '$1 {{PLURAL:$1|ثانیه|ثانیه}}',
+'limitreport-ppvisitednodes' => 'شمارش گرهٔ پیش‌پردازنده مشاهده‌شده',
+'limitreport-ppgeneratednodes' => 'شمارش گره پیش‌پردازنده تولیدشده',
+'limitreport-postexpandincludesize' => 'شامل اندازه پس گسترش',
+'limitreport-postexpandincludesize-value' => '$1/$2 {{PLURAL:$2|بایت|بایت}}',
+'limitreport-templateargumentsize' => 'اندازه عملگر الگو',
+'limitreport-templateargumentsize-value' => '$1/$2 {{PLURAL:$2|بایت|بایت}}',
+'limitreport-expansiondepth' => 'بیشترین عمق گسترش',
+'limitreport-expensivefunctioncount' => 'تعداد تابع تجزیه‌گر پرمصرÙ',
+
);
diff --git a/languages/messages/MessagesFi.php b/languages/messages/MessagesFi.php
index b43a274f..1fd5da97 100644
--- a/languages/messages/MessagesFi.php
+++ b/languages/messages/MessagesFi.php
@@ -18,6 +18,7 @@
* @author Jaakonam
* @author Jack Phoenix
* @author Jafeluv
+ * @author Kaanteli
* @author Kaganer
* @author Kulmalukko
* @author Linnea
@@ -27,6 +28,7 @@
* @author Ochs
* @author Olli
* @author Pxos
+ * @author Samoasambia
* @author Silvonen
* @author Snidata
* @author Str4nd
@@ -344,9 +346,6 @@ $messages = array(
'tog-shownumberswatching' => 'Näytä sivua tarkkailevien käyttäjien määrä',
'tog-oldsig' => 'Nykyinen allekirjoitus:',
'tog-fancysig' => 'Muotoilematon allekirjoitus ilman automaattista linkkiä',
-'tog-externaleditor' => 'Käytä ulkoista tekstieditoria oletuksena. Vain kokeneille käyttäjille, vaatii selaimen asetusten muuttamista. (<span class="plainlinks">[//www.mediawiki.org/wiki/Manual:External_editors Ohje]</span>)',
-'tog-externaldiff' => 'Käytä oletuksena ulkoista työkalua sivun eri versioiden välisten erojen tarkasteluun. Vain kokeneille käyttäjille, vaatii selaimen asetusten muuttamista. (<span class="plainlinks">[//www.mediawiki.org/wiki/Manual:External_editors Ohje]</span>)',
-'tog-showjumplinks' => 'Lisää loikkaa-käytettävyyslinkit sivun alkuun',
'tog-uselivepreview' => 'Käytä välitöntä esikatselua (kokeellinen)',
'tog-forceeditsummary' => 'Huomauta minua, jos en ole kirjoittanut yhteenvetoa',
'tog-watchlisthideown' => 'Piilota omat muokkaukset tarkkailulistalta',
@@ -360,6 +359,8 @@ $messages = array(
'tog-showhiddencats' => 'Näytä piilotetut luokat',
'tog-noconvertlink' => 'Älä muunna linkkien otsikoita toiseen kirjoitusjärjestelmään',
'tog-norollbackdiff' => 'Älä näytä eroavaisuuksia, kun olet palauttanut muokkauksen palauta-työkalulla',
+'tog-useeditwarning' => 'Varoita minua, kun poistun muokkaussivulta tallentamatta muutoksia',
+'tog-prefershttps' => 'Käytä aina suojattua yhteyttä, kun olet kirjautunut sisään',
'underline-always' => 'Aina',
'underline-never' => 'Ei koskaan',
@@ -423,6 +424,18 @@ $messages = array(
'oct' => 'lokakuu',
'nov' => 'marraskuu',
'dec' => 'joulukuu',
+'january-date' => '$1. tammikuuta',
+'february-date' => '$1. helmikuuta',
+'march-date' => '$1. maaliskuuta',
+'april-date' => '$1. huhtikuuta',
+'may-date' => '$1. toukokuuta',
+'june-date' => '$1. kesäkuuta',
+'july-date' => '$1. heinäkuuta',
+'august-date' => '$1. elokuuta',
+'september-date' => '$1. syyskuuta',
+'october-date' => '$1. lokakuuta',
+'november-date' => '$1. marraskuuta',
+'december-date' => '$1. joulukuuta',
# Categories related messages
'pagecategories' => '{{PLURAL:$1|Luokka|Luokat}}',
@@ -504,6 +517,7 @@ $messages = array(
'create-this-page' => 'Luo tämä sivu',
'delete' => 'Poista',
'deletethispage' => 'Poista tämä sivu',
+'undeletethispage' => 'Palauta tämä sivu',
'undelete_short' => 'Palauta {{PLURAL:$1|yksi muokkaus|$1 muokkausta}}',
'viewdeleted_short' => 'Näytä {{PLURAL:$1|poistettu muokkaus|$1 poistettua muokkausta}}',
'protect' => 'Suojaa',
@@ -547,7 +561,7 @@ $1',
'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).
+# 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).
'aboutsite' => 'Tietoja {{GRAMMAR:elative|{{SITENAME}}}}',
'aboutpage' => 'Project:Tietoja',
'copyright' => 'Sisältö on käytettävissä lisenssillä $1, ellei toisin ole mainittu.',
@@ -557,7 +571,6 @@ $1',
'disclaimers' => 'Vastuuvapaus',
'disclaimerpage' => 'Project:Vastuuvapaus',
'edithelp' => 'Muokkausohjeet',
-'edithelppage' => 'Help:Kuinka sivuja muokataan',
'helppage' => 'Help:Sisällys',
'mainpage' => 'Etusivu',
'mainpage-description' => 'Etusivu',
@@ -635,13 +648,12 @@ Luettelo toimintosivuista löytyy sivulta [[Special:SpecialPages|{{int:specialpa
# General errors
'error' => 'Virhe',
'databaseerror' => 'Tietokantavirhe',
-'dberrortext' => 'Tietokantakyselyssä oli syntaksivirhe.
-Se saattaa johtua ohjelmointivirheestä.
-Viimeinen tietokantakysely:
-<blockquote><code>$1</code></blockquote>
-Se tehtiin funktiosta <code>$2</code>.
-Tietokanta palautti virheen <samp>$3: $4</samp>.',
-'dberrortextcl' => 'Tietokantakyselyssä oli syntaksivirhe. Viimeinen tietokantakysely, jota yritettiin, oli: â€$1â€. Se tehtiin funktiosta â€$2â€. Tietokanta palautti virheen â€$3: $4â€.',
+'databaseerror-text' => 'Tietokantakyselyssä on tapahtunut virhe.
+Ohjelmistossa saattaa olla vikaa (bugi).',
+'databaseerror-textcl' => 'Tietokantakyselyssä on tapahtunut virhe.',
+'databaseerror-query' => 'Kysely: $1',
+'databaseerror-function' => 'Toiminto (funktio): $1',
+'databaseerror-error' => 'Virhe: $1',
'laggedslavemode' => "'''Varoitus:''' Sivu ei välttämättä sisällä viimeisimpiä muutoksia.",
'readonly' => 'Tietokanta on lukittu',
'enterlockreason' => 'Anna lukituksen syy sekä sen arvioitu poistamisaika',
@@ -674,6 +686,7 @@ Ilmoita tästä [[Special:ListUsers/sysop|ylläpitäjälle]] ja kerro viestissä
Joku muu on saattanut poistaa sen.',
'cannotdelete-title' => 'Sivua $1 ei voi poistaa',
'delete-hook-aborted' => 'Laajennuskoodi esti poiston antamatta syytä.',
+'no-null-revision' => 'Nollamuokkausta sivulla "$1" ei voi tehdä',
'badtitle' => 'Virheellinen otsikko',
'badtitletext' => 'Pyytämäsi sivunimi oli virheellinen, tyhjä tai väärin linkitetty kieltenvälinen tai wikienvälinen nimi.
Siinä saattaa olla yksi tai useampi sellainen merkki, jota ei voi käyttää sivujen nimissä.',
@@ -693,12 +706,15 @@ Viestien kääntäminen tulisi tehdä [//translatewiki.net/ translatewiki.netiss
'editinginterface' => "'''Varoitus:''' Muokkaat sivua, joka sisältää ohjelmiston käyttöliittymätekstiä.
Muutokset tähän sivuun vaikuttavat muiden käyttäjien käyttöliittymän ulkoasuun tässä wikissä.
Viestien kääntäminen tulisi tehdä [//translatewiki.net/ translatewiki.netissä] – MediaWikin kotoistusprojektissa.",
-'sqlhidden' => '(SQL-kysely piilotettu)',
'cascadeprotected' => 'Tämä sivu on suojattu muokkauksilta, koska se on sisällytetty {{PLURAL:$1|seuraavaan tarttuvasti suojattuun sivuun|seuraaviin tarttuvasti suojattuihin sivuihin}}:
$2',
'namespaceprotected' => "Et voi muokata sivuja nimiavaruudessa '''$1'''.",
'customcssprotected' => 'Sinulla ei ole oikeutta muuttaa tätä CSS-sivua, koska se sisältää toisen käyttäjän henkilökohtaisia asetuksia.',
'customjsprotected' => 'Sinulla ei ole oikeutta muuttaa tätä JavaScript-sivua, koska se sisältää toisen käyttäjän henkilökohtaisia asetuksia.',
+'mycustomcssprotected' => 'Sinulla ei ole oikeutta muokata tätä CSS-sivua.',
+'mycustomjsprotected' => 'Sinulla ei ole oikeutta muokata tätä JavaScript-sivua.',
+'myprivateinfoprotected' => 'Sinulla ei ole oikeutta muokata omia tietojasi.',
+'mypreferencesprotected' => 'Sinulla ei ole oikeutta muokata omia asetuksiasi.',
'ns-specialprotected' => 'Toimintosivuja ei voi muokata.',
'titleprotected' => "Käyttäjä [[User:$1|$1]] on suojannut tämän sivunimen, ja sivua ei voi luoda.
Syynä on: ''$2''.",
@@ -723,10 +739,19 @@ Huomaa, että jotkut sivut saattavat näkyä edelleen kuin olisit kirjautunut si
'welcomecreation-msg' => 'Käyttäjätunnuksesi on luotu.
Älä unohda virittää {{GRAMMAR:genitive|{{SITENAME}}}} [[Special:Preferences|asetuksiasi]].',
'yourname' => 'Käyttäjätunnus:',
+'userlogin-yourname' => 'Käyttäjätunnus',
+'userlogin-yourname-ph' => 'Kirjoita käyttäjätunnus',
+'createacct-another-username-ph' => 'Lisää käyttäjätunnus',
'yourpassword' => 'Salasana:',
+'userlogin-yourpassword' => 'Salasana',
+'userlogin-yourpassword-ph' => 'Kirjoita salasana',
+'createacct-yourpassword-ph' => 'Kirjoita salasana',
'yourpasswordagain' => 'Salasana uudelleen:',
+'createacct-yourpasswordagain' => 'Vahvista salasana',
+'createacct-yourpasswordagain-ph' => 'Kirjoita salasana uudelleen',
'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',
+'userlogin-remembermypassword' => 'Pidä minut kirjautuneena',
+'userlogin-signwithsecure' => 'Käytä salattua yhteyttä',
'yourdomainname' => 'Verkkonimi:',
'password-change-forbidden' => 'Et voi muuttaa salasanoja tässä wikissä.',
'externaldberror' => 'Tapahtui virhe ulkoisen autentikointitietokannan käytössä tai sinulla ei ole lupaa päivittää tunnustasi.',
@@ -738,17 +763,43 @@ Huomaa, että jotkut sivut saattavat näkyä edelleen kuin olisit kirjautunut si
'logout' => 'Kirjaudu ulos',
'userlogout' => 'Kirjaudu ulos',
'notloggedin' => 'Et ole kirjautunut',
+'userlogin-noaccount' => 'Eikö sinulla vielä ole käyttäjätunnusta?',
+'userlogin-joinproject' => 'Liity {{GRAMMAR:illative|{{SITENAME}}}}',
'nologin' => 'Jos sinulla ei ole vielä käyttäjätunnusta, $1.',
'nologinlink' => 'voit luoda sellaisen',
'createaccount' => 'Luo uusi käyttäjätunnus',
'gotaccount' => "Jos sinulla on jo tunnus, voit '''$1'''.",
'gotaccountlink' => 'kirjautua sisään',
'userlogin-resetlink' => 'Unohditko salasanasi?',
+'userlogin-resetpassword-link' => 'Vaihda salasanaasi',
+'helplogin-url' => 'Help:Sisäänkirjautuminen',
+'userlogin-helplink' => '[[{{MediaWiki:helplogin-url}}|Auta sisäänkirjautumisessa]]',
+'userlogin-loggedin' => 'Olet jo kirjautunut sisään tunnuksella {{GENDER:$1|$1}}.
+Käytä alla olevaa lomaketta kirjautuaksesi sisään toisena käyttäjänä.',
+'userlogin-createanother' => 'Luo toinen käyttäjätunnus',
+'createacct-join' => 'Kirjoita tietosi alle.',
+'createacct-another-join' => 'Lisää uuden käyttäjätunnuksen tiedot alle.',
+'createacct-emailrequired' => 'Sähköpostiosoite',
+'createacct-emailoptional' => 'Sähköpostiosoite (vapaaehtoinen)',
+'createacct-email-ph' => 'Anna sähköpostiosoitteesi',
+'createacct-another-email-ph' => 'Lisää sähköpostiosoite',
'createaccountmail' => 'Käytä satunnaista väliaikaissalasanaa ja lähetä se alla olevaan sähköpostiosoitteeseen',
+'createacct-realname' => 'Oikea nimi (vapaaehtoinen)',
'createaccountreason' => 'Syy:',
+'createacct-reason' => 'Syy',
+'createacct-reason-ph' => 'Miksi olet luomassa toista käyttäjätunnusta',
+'createacct-captcha' => 'Turvatarkastus',
+'createacct-imgcaptcha-ph' => 'Kirjoita teksti, jonka näet edellä',
+'createacct-submit' => 'Luo tunnus',
+'createacct-another-submit' => 'Luo toinen käyttäjätunnus',
+'createacct-benefit-heading' => '{{SITENAME}} on sinun kaltaistesi ihmisten tekemä.',
+'createacct-benefit-body1' => '{{PLURAL:$1|muokkaus|muokkausta}}',
+'createacct-benefit-body2' => '{{PLURAL:$1|sivu|sivua}}',
+'createacct-benefit-body3' => '{{PLURAL:$1|viimeikainen muokkaaja|viimeaikaista muokkaajaa}}',
'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',
+'createacct-error' => 'Virhe tunnuksen luomisessa',
'createaccounterror' => 'Tunnuksen luonti ei onnistunut: $1',
'nocookiesnew' => 'Käyttäjätunnus on luotu, mutta et ole kirjautunut sisään.
{{SITENAME}} käyttää evästeitä sisäänkirjautumisen yhteydessä.
@@ -799,10 +850,12 @@ Tunnus on "$2" ja sen salasana on "$3". Sinun on syytä kirjautua sisään ja va
Sinun ei tarvitse välittää tästä viestistä, jos tämä tunnus on luotu virheellisesti.',
'usernamehasherror' => 'Käyttäjätunnus ei voi sisältää ristikkomerkkejä (#).',
'login-throttled' => 'Olet tehnyt liian monta kirjautumisyritystä.
-Odota ennen kuin yrität uudelleen.',
+Odota $1 ennen kuin yrität uudelleen.',
'login-abort-generic' => 'Kirjautuminen epäonnistui – keskeytetty',
'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ä.',
+'createacct-another-realname-tip' => 'Vapaaehtoinen.
+Nimesi näytetään käyttäjätunnuksesi sijasta sivun tekijäluettelossa.',
# Email sending
'php-mail-error-unknown' => 'Tuntematon virhe PHP:n mail()-funktiossa',
@@ -818,7 +871,7 @@ Odota ennen kuin yrität uudelleen.',
'newpassword' => 'Uusi salasana:',
'retypenew' => 'Uusi salasana uudelleen:',
'resetpass_submit' => 'Aseta salasana ja kirjaudu sisään',
-'resetpass_success' => 'Salasanan vaihto onnistui.',
+'changepassword-success' => 'Salasanan vaihto onnistui.',
'resetpass_forbidden' => 'Salasanoja ei voi vaihtaa.',
'resetpass-no-info' => 'Et voi nähdä tätä sivua kirjautumatta sisään.',
'resetpass-submit-loggedin' => 'Muuta salasana',
@@ -830,10 +883,11 @@ Olet saattanut jo onnistuneesti vaihtaa salasanasi tai pyytää uutta väliaikai
# Special:PasswordReset
'passwordreset' => 'Salasanan vaihto',
-'passwordreset-text' => 'Täytä tämä lomake vaihtaaksesi salasanasi.',
+'passwordreset-text-one' => 'Täytä tämä lomake vaihtaaksesi salasanasi.',
+'passwordreset-text-many' => '{{PLURAL:$1|Täytä yksi kentistä alustaaksesi salasanasi.}}',
'passwordreset-legend' => 'Salasanan vaihto',
'passwordreset-disabled' => 'Salasanojen vaihtaminen ei ole mahdollista tässä wikissä.',
-'passwordreset-pretext' => '{{PLURAL:$1||Kirjoita jokin jäljempänä pyydetty tieto}}',
+'passwordreset-emaildisabled' => 'Sähköpostitoiminnot on poistettu käytöstä tässä wikissä.',
'passwordreset-username' => 'Käyttäjätunnus:',
'passwordreset-domain' => 'Verkkotunnus:',
'passwordreset-capture' => 'Näytä lähetettävä sähköpostiviesti?',
@@ -863,7 +917,7 @@ voit jättää tämän viestin huomiotta ja jatkaa vanhan salasanan käyttöä.'
Väliaikainen salasana: $2',
'passwordreset-emailsent' => 'Salasanan palautuksesta kertova viesti on lähetetty sähköpostitse.',
'passwordreset-emailsent-capture' => 'Salasanan palautuksesta kertova sähköpostiviesti on lähetetty, ja se näkyy myös alla.',
-'passwordreset-emailerror-capture' => 'Alla näytettävä sähköpostiviesti luotiin, mutta sen lähettäminen käyttäjälle epäonnistui: $1',
+'passwordreset-emailerror-capture' => 'Allaoleva sähköpostiviesti luotiin, mutta sen lähettäminen {{GENDER:$2|käyttäjälle}} epäonnistui: $1',
# Special:ChangeEmail
'changeemail' => 'Muuta sähköpostiosoitetta',
@@ -877,6 +931,19 @@ Väliaikainen salasana: $2',
'changeemail-submit' => 'Muuta sähköpostiosoite',
'changeemail-cancel' => 'Peruuta',
+# Special:ResetTokens
+'resettokens' => 'Uudista avaimet',
+'resettokens-text' => 'Tällä sivulla voit uudistaa avaimesi, jotka mahdollistavat pääsyn käyttäjätunnukseesi liittyviin tiettyihin yksityisiin tietoihin.
+
+Sinun pitäisi tehdä tämä, jos olet vahingossa jakanut avaimet jonkun kanssa tai jos käyttäjätunnuksesi on vaarannettu.',
+'resettokens-no-tokens' => 'Avaimia ei ole uudistettavaksi.',
+'resettokens-legend' => 'Uudista avaimet',
+'resettokens-tokens' => 'Avaimet:',
+'resettokens-token-label' => '$1 (nykyinen arvo: $2)',
+'resettokens-watchlist-token' => '[[Special:Watchlist|Tarkkailulistan]] verkkosyötteen (Atom tai RSS) avain',
+'resettokens-done' => 'Avaimet on uudistettu.',
+'resettokens-resetbutton' => 'Uudista valitut avaimet',
+
# Edit page toolbar
'bold_sample' => 'Lihavoitu teksti',
'bold_tip' => 'Lihavointi',
@@ -1057,12 +1124,15 @@ Alla on tämän sivun poisto- ja siirtohistoria:",
Se on ilmeisesti poistettu.',
'edit-conflict' => 'Päällekkäinen muokkaus.',
'edit-no-change' => 'Muokkauksesi sivuutettiin, koska tekstiin ei tehty mitään muutoksia.',
+'postedit-confirmation' => 'Muokkauksesi on tallennettu.',
'edit-already-exists' => 'Uuden sivun luominen ei onnistunut.
Se on jo olemassa.',
'defaultmessagetext' => 'Viestin oletusteksti',
'content-failed-to-parse' => 'Sisältö tyypiltään $2 ei jäsenny tyypiksi $1: $3',
'invalid-content-data' => 'Virheellinen sisältö',
'content-not-allowed-here' => 'Sivun [[$2]] sisältö ei voi olla tyyppiä $1.',
+'editwarning-warning' => 'Tältä sivulta poistuminen saattaa aiheuttaa kaikkien tekemiesi muutosten katoamisen.
+Jos olet kirjautuneena sisään, voit poistaa tämän varoituksen käytöstä asetuksissa osiossa "Muokkaus".',
# Content models
'content-model-wikitext' => 'wikiteksti',
@@ -1097,6 +1167,7 @@ Varmista alla olevasta vertailusta, että haluat saada aikaan tämän lopputulok
'undo-failure' => 'Muokkausta ei voi kumota välissä olevien ristiriitaisten muutosten vuoksi.',
'undo-norev' => 'Muokkausta ei voida kumota, koska sitä ei ole olemassa tai se on poistettu.',
'undo-summary' => 'Kumottu muokkaus $1, jonka teki [[Special:Contributions/$2|$2]] ([[User talk:$2|keskustelu]])',
+'undo-summary-username-hidden' => 'Kumottu muokkaus $1, jonka on tehnyt piilotettu käyttäjä',
# Account creation failure
'cantcreateaccounttitle' => 'Tunnusta ei voida luoda',
@@ -1271,6 +1342,7 @@ Uuden ja vanhan sivun muutoksien pitää muodostaa jatkumo – ne eivät saa men
'compareselectedversions' => 'Vertaile valittuja versioita',
'showhideselectedversions' => 'Näytä tai piilota valitut versiot',
'editundo' => 'kumoa',
+'diff-empty' => '(ei eroavaisuuksia)',
'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ää}}}}.)',
'difference-missing-revision' => '{{PLURAL:$2|Yhtä versiota|$2 versiota}} tästä vertailusta ($1) {{PLURAL:$2|ei}} löytynyt.
@@ -1300,7 +1372,6 @@ $1 {{int:pipe-separator}} $2',
'searchmenu-legend' => 'Hakuasetukset',
'searchmenu-exists' => "'''Tässä wikissä on sivu nimellä [[:$1]].'''",
'searchmenu-new' => "'''Luo sivu ''[[:$1]]'' tähän wikiin.'''",
-'searchhelp-url' => 'Help:Sisällys',
'searchmenu-prefix' => '[[Special:PrefixIndex/$1|Selaa sivuja tällä etuliitteellä]]',
'searchprofile-articles' => 'Sisältösivut',
'searchprofile-project' => 'Ohje- ja projektisivut',
@@ -1342,15 +1413,7 @@ Kokeile lisätä haun alkuun ''all:'', niin haku kohdistuu kaikkeen sisältöön
'powersearch-togglenone' => 'Poista valinnat',
'search-external' => 'Ulkoinen haku',
'searchdisabled' => 'Tekstihaku on poistettu toistaiseksi käytöstä suuren kuorman vuoksi. Voit käyttää alla olevaa Googlen hakukenttää sivujen etsimiseen, kunnes haku tulee taas käyttöön. <small>Huomaa, että ulkopuoliset kopiot {{GRAMMAR:genitive|{{SITENAME}}}} sisällöstä eivät välttämättä ole ajan tasalla.</small>',
-
-# Quickbar
-'qbsettings' => 'Pikavalikko',
-'qbsettings-none' => 'Ei mitään',
-'qbsettings-fixedleft' => 'Tekstin mukana, vasen',
-'qbsettings-fixedright' => 'Tekstin mukana, oikea',
-'qbsettings-floatingleft' => 'Pysyen vasemmalla',
-'qbsettings-floatingright' => 'Pysyen oikealla',
-'qbsettings-directionality' => 'Kiinteä, riippuen käyttämäsi kielen kirjoitusjärjestelmän suunnasta',
+'search-error' => 'Virhe ilmaantui haettaessa: $1',
# Preferences page
'preferences' => 'Asetukset',
@@ -1384,7 +1447,6 @@ Kokeile lisätä haun alkuun ''all:'', niin haku kohdistuu kaikkeen sisältöön
'resetprefs' => 'Tyhjennä tallentamattomat muutokset',
'restoreprefs' => 'Palauta kaikki oletusasetuksiin (kaikissa osioissa)',
'prefs-editing' => 'Muokkaus',
-'prefs-edit-boxsize' => 'Muokkauskentän koko.',
'rows' => 'Rivejä',
'columns' => 'Sarakkeita',
'searchresultshead' => 'Haku',
@@ -1395,9 +1457,9 @@ Kokeile lisätä haun alkuun ''all:'', niin haku kohdistuu kaikkeen sisältöön
'recentchangesdays-max' => 'Enintään $1 {{PLURAL:$1|päivä|päivää}}',
'recentchangescount' => 'Näytettävien muutoksien määrä oletuksena',
'prefs-help-recentchangescount' => 'Tämä sisältää tuoreet muutokset, muutoshistoriat ja lokit.',
-'prefs-help-watchlist-token' => 'Tämän kentän täyttäminen salaisella avaimella tuottaa RSS-syötteen tarkkailulistastasi.
-Kaikki, jotka tietävät tähän kenttään kirjoitetun avaimen pystyvät lukemaan tarkkailulistaa, joten valitse turvallinen arvo.
-Tässä satunnaisesti tuotettu arvo, jota voit käyttää: $1',
+'prefs-help-watchlist-token2' => 'Tämä on salainen avain tarkkailulistasi verkkosyötteeseen.
+Kuka tahansa, joka tietää sen voi lukea tarkkailulistaasi, joten älä paljasta sitä.
+[[Special:ResetTokens|Napsauta tästä, jos sinun pitää uudistaa se]].',
'savedprefs' => 'Asetuksesi on tallennettu.',
'timezonelegend' => 'Aikavyöhyke',
'localtime' => 'Paikallinen aika',
@@ -1427,7 +1489,6 @@ Tässä satunnaisesti tuotettu arvo, jota voit käyttää: $1',
'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',
'youremail' => 'Sähköpostiosoite',
'username' => '{{GENDER:$1|Käyttäjätunnus}}',
'uid' => '{{GENDER:$1|Tunniste}}',
@@ -1459,6 +1520,8 @@ Tämä tieto on julkinen.',
'prefs-dateformat' => 'Päiväyksen muoto',
'prefs-timeoffset' => 'Aikavyöhyke',
'prefs-advancedediting' => 'Perusasetukset',
+'prefs-editor' => 'Muokkain',
+'prefs-preview' => 'Esikatselu',
'prefs-advancedrc' => 'Lisäasetukset',
'prefs-advancedrendering' => 'Lisäasetukset',
'prefs-advancedsearchoptions' => 'Lisäasetukset',
@@ -1466,7 +1529,9 @@ Tämä tieto on julkinen.',
'prefs-displayrc' => 'Perusasetukset',
'prefs-displaysearchoptions' => 'Näyttöasetukset',
'prefs-displaywatchlist' => 'Näyttöasetukset',
+'prefs-tokenwatchlist' => 'Avain',
'prefs-diffs' => 'Eroavaisuudet',
+'prefs-help-prefershttps' => 'Tämä asetus tulee voimaan seuraavan sisäänkirjautumisesi yhteydessä.',
# User preference: email validation using jQuery
'email-address-validity-valid' => 'Sähköpostiosoite vaikuttaa kelvolliselta',
@@ -1493,6 +1558,8 @@ Tämä tieto on julkinen.',
'userrights-notallowed' => 'Sinulla ei ole oikeutta lisätä tai poistaa käyttäjien oikeuksia.',
'userrights-changeable-col' => 'Ryhmät, joita voit muuttaa',
'userrights-unchangeable-col' => 'Ryhmät, joita et voi muuttaa',
+'userrights-conflict' => 'Päällekkäinen käyttöoikeuksien muutos! Tarkista tekemäsi muutokset ja vahvista ne.',
+'userrights-removed-self' => 'Poistit onnistuneesti omat oikeutesi. Tämän jälkeen et enää pääse tälle sivulle.',
# Groups
'group' => 'Ryhmä',
@@ -1558,11 +1625,19 @@ Tämä tieto on julkinen.',
'right-proxyunbannable' => 'Ohittaa automaattiset välityspalvelinestot',
'right-unblockself' => 'Poistaa esto itseltään',
'right-protect' => 'Muuttaa suojaustasoja ja muokata tarttuvasti suojattuja sivuja',
-'right-editprotected' => 'Muokata suojattuja sivuja (pois lukien laajennettu sisällytyssuojaus)',
+'right-editprotected' => 'Muokata sivuja, jotka on suojattu tasolle "{{int:protect-level-sysop}}"',
+'right-editsemiprotected' => 'Muokata sivuja, jotka on suojattu tasolle "{{int:protect-level-autoconfirmed}}"',
'right-editinterface' => 'Muokata käyttöliittymätekstejä',
'right-editusercssjs' => 'Muokata toisten käyttäjien CSS- ja JavaScript-tiedostoja',
'right-editusercss' => 'Muokata toisten käyttäjien CSS-tiedostoja',
'right-edituserjs' => 'Muokata toisten käyttäjien JavaScript-tiedostoja',
+'right-editmyusercss' => 'Muokata omia CSS-tiedostojaan',
+'right-editmyuserjs' => 'Muokata omia JavaScript-tiedostojaan',
+'right-viewmywatchlist' => 'Tarkastella tarkkailulistaasi',
+'right-editmywatchlist' => 'Muokata tarkkailulistaasi. Huomaa, että jotkin toiminnot lisäävät yhä sivuja listallesi riippumatta tästä oikeudesta.',
+'right-viewmyprivateinfo' => 'Nähdä omat yksityiset tietosi (esim. sähköpostiosoite, oikea nimi)',
+'right-editmyprivateinfo' => 'Muokata omia yksityisiä tietojasi (esim. sähköpostiosoite, oikea nimi)',
+'right-editmyoptions' => 'Muokata omia asetuksiasi',
'right-rollback' => 'Palauttaa nopeasti käyttäjän viimeisimmät muokkaukset sivuun',
'right-markbotedits' => 'Kumota muokkauksia bottimerkinnällä',
'right-noratelimit' => 'Ohittaa nopeusrajoitukset',
@@ -1624,12 +1699,19 @@ Tämä tieto on julkinen.',
'action-userrights-interwiki' => 'muokata muiden wikien käyttäjien käyttöoikeuksia',
'action-siteadmin' => 'lukita tai avata tietokantaa',
'action-sendemail' => 'lähettää sähköpostia',
+'action-editmywatchlist' => 'muokata tarkkailulistaasi',
+'action-viewmywatchlist' => 'tarkastella tarkkailulistaasi',
+'action-viewmyprivateinfo' => 'katsoa omia yksityisiä tietojasi',
+'action-editmyprivateinfo' => 'muokata omia yksityisiä tietojasi',
# Recent changes
'nchanges' => '$1 {{PLURAL:$1|muutos|muutosta}}',
+'enhancedrc-since-last-visit' => '$1 {{PLURAL:$1|viimeisen käynnin jälkeen}}',
+'enhancedrc-history' => 'historia',
'recentchanges' => 'Tuoreet muutokset',
'recentchanges-legend' => 'Tuoreiden muutosten asetukset',
'recentchanges-summary' => 'Tällä sivulla voi seurata tuoreita {{GRAMMAR:illative|{{SITENAME}}}} tehtyjä muutoksia.',
+'recentchanges-noresult' => 'Ei muutoksia, jotka täyttävät nämä kriteerit valitun ajanjakson aikana.',
'recentchanges-feed-description' => 'Tällä sivulla voi seurata tuoreita {{GRAMMAR:illative|{{SITENAME}}}} tehtyjä muutoksia.',
'recentchanges-label-newpage' => 'Tämä muutos loi uuden sivun',
'recentchanges-label-minor' => 'Tämä on pieni muutos',
@@ -1666,7 +1748,6 @@ Tämä tieto on julkinen.',
'recentchangeslinked-feed' => 'Linkitettyjen sivujen muutokset',
'recentchangeslinked-toolbox' => 'Linkitettyjen sivujen muutokset',
'recentchangeslinked-title' => 'Sivulta $1 linkitettyjen sivujen muutokset',
-'recentchangeslinked-noresult' => 'Ei muutoksia linkitettyihin sivuihin annetulla aikavälillä.',
'recentchangeslinked-summary' => "Tämä toimintosivu näyttää muutokset sivuihin, joihin on viitattu tältä sivulta. [[Special:Watchlist|Tarkkailulistallasi]] olevat sivut on '''lihavoitu'''.",
'recentchangeslinked-page' => 'Sivu',
'recentchangeslinked-to' => 'Näytä muutokset sivuihin, joilla on linkki annettuun sivuun',
@@ -1677,7 +1758,7 @@ Tämä tieto on julkinen.',
'reuploaddesc' => 'Peruuta tallennus ja palaa tallennuslomakkeelle.',
'upload-tryagain' => 'Lähetä muutettu tiedostokuvaus',
'uploadnologin' => 'Et ole kirjautunut sisään',
-'uploadnologintext' => 'Sinun pitää olla [[Special:UserLogin|kirjautuneena sisään]], jotta voisit tallentaa tiedostoja.',
+'uploadnologintext' => 'Sinun pitää $1 tallentaaksesi tiedostoja.',
'upload_directory_missing' => 'Tallennushakemisto $1 puuttuu, eikä palvelin pysty luomaan sitä.',
'upload_directory_read_only' => 'Palvelimella ei ole kirjoitusoikeuksia tallennushakemistoon $1.',
'uploaderror' => 'Tallennusvirhe',
@@ -1891,7 +1972,6 @@ Parhaan turvallisuuden vuoksi img_auth.php on poissa käytöstä.',
'http-read-error' => 'HTTP-lukuvirhe.',
'http-timed-out' => 'HTTP-pyyntö aikakatkaistiin.',
'http-curl-error' => 'Virhe noudettaessa verkko-osoitetta: $1',
-'http-host-unreachable' => 'Ei voitu tavoittaa verkko-osoitetta',
'http-bad-status' => 'HTTP-pyynnön aikana oli ongelma: $1 $2',
# Some likely curl errors. More could be added from <http://curl.haxx.se/libcurl/c/libcurl-errors.html>
@@ -1919,6 +1999,10 @@ Parhaan turvallisuuden vuoksi img_auth.php on poissa käytöstä.',
'listfiles_size' => 'Koko',
'listfiles_description' => 'Kuvaus',
'listfiles_count' => 'Versioita',
+'listfiles-show-all' => 'Näytä myös kuvien vanhemmat versiot',
+'listfiles-latestversion' => 'Uusin versio',
+'listfiles-latestversion-yes' => 'Kyllä',
+'listfiles-latestversion-no' => 'Ei',
# File description page
'file-anchor-link' => 'Tiedosto',
@@ -2014,6 +2098,13 @@ Syöte: sisältötyyppi/alatyyppi, esimerkiksi <code>image/jpeg</code>.',
'randompage' => 'Satunnainen sivu',
'randompage-nopages' => '{{PLURAL:$2|Nimiavaruudessa|Nimiavaruuksissa}} $1 ei ole sivuja.',
+# Random page in category
+'randomincategory' => 'Satunnainen sivu luokasta',
+'randomincategory-invalidcategory' => '$1 ei ole kelvollinen luokan nimi.',
+'randomincategory-nopages' => 'Luokassa [[:Category:$1|$1]] ei ole sivuja.',
+'randomincategory-selectcategory' => 'Hae satunnainen sivu luokasta: $1 $2',
+'randomincategory-selectcategory-submit' => 'Hae',
+
# Random redirect
'randomredirect' => 'Satunnainen ohjaus',
'randomredirect-nopages' => 'Nimiavaruudessa â€$1†ei ole ohjaussivuja.',
@@ -2039,17 +2130,13 @@ Syöte: sisältötyyppi/alatyyppi, esimerkiksi <code>image/jpeg</code>.',
'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.',
'statistics-mostpopular' => 'Katsotuimmat sivut',
-'disambiguations' => 'Linkit täsmennyssivuihin',
-'disambiguationspage' => 'Template:Täsmennyssivu',
-'disambiguations-text' => "Seuraavilla sivuilla on linkkejä ''täsmennyssivuihin''.
-Täsmennyssivun sijaan ne voisivat linkittää suoraan asianomaiseen aiheeseen.<br />
-Sivua kohdellaan täsmennyssivuna, jos se käyttää mallinetta, johon on linkki sivulta [[MediaWiki:Disambiguationspage]].",
-
'pageswithprop' => 'Sivut sivun ominaisuuden mukaan',
'pageswithprop-legend' => 'Sivut sivun ominaisuuden mukaan',
'pageswithprop-text' => 'Tällä sivulla on lueteltu sivut, jotka käyttävät erityistä sivun ominaisuutta.',
'pageswithprop-prop' => 'Ominaisuuden nimi',
'pageswithprop-submit' => 'Siirry',
+'pageswithprop-prophidden-long' => 'Pitkä tekstimuotoinen ominaisuuden arvo piilotettu ($1)',
+'pageswithprop-prophidden-binary' => 'ominaisuuden binääriarvo on piilotettu ($1)',
'doubleredirects' => 'Kaksinkertaiset ohjaukset',
'doubleredirectstext' => 'Tässä listassa on ohjaussivut, jotka ohjaavat toiseen ohjaussivuun.
@@ -2107,6 +2194,7 @@ Jokaisella rivillä on linkit ensimmäiseen ja toiseen ohjaukseen sekä toisen o
'mostrevisions' => 'Muokatuimmat sivut',
'prefixindex' => 'Kaikki sivut katkaisuhaulla',
'prefixindex-namespace' => 'Kaikki sivut etuliitteellä (nimiavaruus $1)',
+'prefixindex-strip' => 'Älä näytä etuliitteitä listauksessa',
'shortpages' => 'Lyhyet sivut',
'longpages' => 'Pitkät sivut',
'deadendpages' => 'Sivut, joilla ei ole linkkejä',
@@ -2122,6 +2210,7 @@ Jokaisella rivillä on linkit ensimmäiseen ja toiseen ohjaukseen sekä toisen o
'listusers' => 'Käyttäjälista',
'listusers-editsonly' => 'Näytä vain käyttäjät, joilla on muokkauksia',
'listusers-creationsort' => 'Lajittele tunnuksen luontipäivämäärän mukaan',
+'listusers-desc' => 'Lajittele alenevassa järjestyksessä',
'usereditcount' => '$1 {{PLURAL:$1|muokkaus|muokkausta}}',
'usercreated' => '{{GENDER:$3|Luotu}} $1 kello $2',
'newpages' => 'Uudet sivut',
@@ -2298,10 +2387,9 @@ Tulevaisuudessa sivuun ja sen keskustelusivuun tehtävät muutokset listataan tÃ
'unwatchthispage' => 'Lopeta tarkkailu',
'notanarticle' => 'Ei ole sivu',
'notvisiblerev' => 'Versio on poistettu',
-'watchnochange' => 'Valittuna ajanjaksona yhtäkään tarkkailemistasi sivuista ei muokattu.',
'watchlist-details' => 'Tarkkailulistalla on {{PLURAL:$1|$1 sivu|$1 sivua}} keskustelusivuja mukaan laskematta.',
-'wlheader-enotif' => '* Sähköposti-ilmoitukset ovat käytössä.',
-'wlheader-showupdated' => "* Sivut, joita on muokattu viimeisen käyntisi jälkeen, on '''lihavoitu'''.",
+'wlheader-enotif' => 'Sähköposti-ilmoitus on käytössä.',
+'wlheader-showupdated' => "Sivut, joita on muokattu viimeisen käyntisi jälkeen, on '''lihavoitu'''.",
'watchmethod-recent' => 'tarkistetaan tuoreimpia muutoksia tarkkailluille sivuille',
'watchmethod-list' => 'tarkistetaan tarkkailtujen sivujen tuoreimmat muutokset',
'watchlistcontains' => 'Tarkkailulistallasi on {{PLURAL:$1|yksi sivu|$1 sivua}}.',
@@ -2540,7 +2628,7 @@ $1',
'contributions' => '{{GENDER:$1|Käyttäjän}} muokkaukset',
'contributions-title' => 'Käyttäjän $1 muokkaukset',
'mycontris' => 'Omat muokkaukset',
-'contribsub2' => 'Käyttäjän $1 ($2) muokkaukset',
+'contribsub2' => 'Käyttäjän {{GENDER:$3|$1}} ($2) muokkaukset',
'nocontribs' => 'Näihin ehtoihin sopivia muokkauksia ei löytynyt.',
'uctop' => '(uusin)',
'month' => 'Kuukausi',
@@ -2693,14 +2781,12 @@ Alla on ote häivytyslokista.',
'ipb_blocked_as_range' => 'IP-osoite $1 on estetty välillisesti ja sen estoa ei voi poistaa. Se on estetty osana verkkoaluetta $2, jonka eston voi poistaa',
'ip_range_invalid' => 'Virheellinen IP-alue.',
'ip_range_toolarge' => 'Suuremmat osoitealue-estot kuin /$1 eivät ole sallittuja.',
-'blockme' => 'Estä minut',
'proxyblocker' => 'Välityspalvelinesto',
-'proxyblocker-disabled' => 'Tämä toiminto ei ole käytössä.',
'proxyblockreason' => 'IP-osoitteestasi on estetty muokkaukset, koska se on avoin välityspalvelin. Ota yhteyttä Internet-palveluntarjoajaasi tai tekniseen tukeen ja kerro heille tästä tietoturvaongelmasta.',
-'proxyblocksuccess' => 'Valmis.',
'sorbsreason' => 'IP-osoitteesi on listattu avoimena välityspalvelimena DNSBL:n mustalla listalla sivustolla {{SITENAME}}.',
'sorbs_create_account_reason' => 'IP-osoitteesi on listattu avoimena välityspalvelimena DNSBL:n mustalla listalla sivustolla {{SITENAME}}.
Et voi luoda käyttäjätunnusta.',
+'xffblockreason' => 'Yhteydet IP-osoitteesta, joka löytyy sinun tai käyttämäsi välipalvelimen X-Forwarded-For-otsakkeesta, on estetty. Alkuperäinen estämisen syy oli: $1',
'cant-block-while-blocked' => 'Et voi estää muita käyttäjiä kun olet itse 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ä',
@@ -2858,6 +2944,8 @@ Jos haluat muokata MediaWikin yleistä kotoistusta, käy [//www.mediawiki.org/wi
'thumbnail-more' => 'Suurenna',
'filemissing' => 'Tiedosto puuttuu',
'thumbnail_error' => 'Pienoiskuvan luominen epäonnistui: $1',
+'thumbnail_error_remote' => 'Virheilmoitus kohteesta $1:
+$2',
'djvu_page_error' => 'DjVu-tiedostossa ei ole pyydettyä sivua',
'djvu_no_xml' => 'DjVu-tiedoston XML-vienti epäonnistui',
'thumbnail-temp-create' => 'Väliaikaisen esikatselukuvan luonti epäonnistui',
@@ -3005,13 +3093,8 @@ Voit katsella sivun lähteenä olevaa wikitekstiä.',
# Stylesheets
'common.css' => '/* Tämä sivu sisältää koko sivustoa muuttavia tyylejä. */',
-'standard.css' => '/* Tämä sivu sisältää Perus-ulkoasua muuttavia tyylejä. */',
-'nostalgia.css' => '/* Tämä sivu sisältää Nostalgia-ulkoasua muuttavia tyylejä. */',
'cologneblue.css' => '/* Tämä sivu sisältää Kölnin sininen -ulkoasua muuttavia tyylejä. */',
'monobook.css' => '/* Tämä sivu sisältää Monobook-ulkoasua muuttavia tyylejä. */',
-'myskin.css' => '/* Tämä sivu sisältää Oma tyylisivu -ulkoasua muuttavia tyylejä. */',
-'chick.css' => '/* Tämä sivu sisältää Chick-ulkoasua muuttavia tyylejä. */',
-'simple.css' => '/* Tämä sivu sisältää Yksinkertainen-ulkoasua muuttavia tyylejä. */',
'modern.css' => '/* Tämä sivu sisältää Moderni-ulkoasua muuttavia tyylejä. */',
'vector.css' => '/* Tämä sivu sisältää Vector-ulkoasua muuttavia tyylejä. */',
'print.css' => '/* Tämä sivu sisältää tulostettua sivua muuttavia tyylejä */',
@@ -3023,13 +3106,8 @@ Voit katsella sivun lähteenä olevaa wikitekstiä.',
# Scripts
'common.js' => '/* Tämän sivun JavaScript-koodi liitetään jokaiseen sivulataukseen */',
-'standard.js' => '/* Tämän sivun JavaScript-koodi liitetään Perus-tyyliin */',
-'nostalgia.js' => '/* Tämän sivun JavaScript-koodi liitetään Nostalgia-tyyliin */',
'cologneblue.js' => '/* Tämän sivun JavaScript-koodi liitetään Kölnin sininen -tyyliin */',
'monobook.js' => '/* Tämän sivun JavaScript-koodi liitetään Monobook-tyyliin */',
-'myskin.js' => '/* Tämän sivun JavaScript-koodi liitetään Oma tyylisivu -tyyliin */',
-'chick.js' => '/* Tämän sivun JavaScript-koodi liitetään Chick-tyyliin */',
-'simple.js' => '/* Tämän sivun JavaScript-koodi liitetään Yksinkertaistettuun tyyliin */',
'modern.js' => '/* Tämän sivun JavaScript-koodi liitetään Moderni-tyyliin */',
'vector.js' => '/* Tämän sivun JavaScript-koodi liitetään Vector-tyyliin */',
'group-autoconfirmed.js' => '/* Tämän sivun JavaScript-koodi liitetään vain automaattisesti hyväksytyille käyttäjille */',
@@ -3108,13 +3186,8 @@ Voit katsella sivun lähteenä olevaa wikitekstiä.',
'pageinfo-category-files' => 'Tiedostojen määrä',
# Skin names
-'skinname-standard' => 'Perus',
-'skinname-nostalgia' => 'Nostalgia',
'skinname-cologneblue' => 'Kölnin sininen',
'skinname-monobook' => 'Monobook',
-'skinname-myskin' => 'Oma tyylisivu',
-'skinname-chick' => 'Chick',
-'skinname-simple' => 'Yksinkertainen',
'skinname-modern' => 'Moderni',
# Patrolling
@@ -3192,11 +3265,25 @@ Suorittamalla sen järjestelmäsi voi muuttua epäluotettavaksi.",
'minutes' => '{{PLURAL:$1|$1 minuutti|$1 minuuttia}}',
'hours' => '{{PLURAL:$1|$1 tunti|$1 tuntia}}',
'days' => '{{PLURAL:$1|$1 päivä|$1 päivää}}',
+'weeks' => '{{PLURAL:$1|viikko|$1 viikkoa}}',
'months' => '{{PLURAL:$1|$1 kuukausi|$1 kuukautta}}',
'years' => '{{PLURAL:$1|$1 vuosi|$1 vuotta}}',
'ago' => '$1 sitten',
'just-now' => 'juuri nyt',
+# Human-readable timestamps
+'hours-ago' => '{{PLURAL:$1|tunti|$1 tuntia}} sitten',
+'minutes-ago' => '{{PLURAL:$1|minuutti|$1 minuuttia}} sitten',
+'seconds-ago' => '{{PLURAL:$1|sekunti|$1 sekuntia}} sitten',
+'monday-at' => 'Maanantaina klo $1',
+'tuesday-at' => 'Tiistaina klo $1',
+'wednesday-at' => 'Keskiviikkona klo $1',
+'thursday-at' => 'Torstaina klo $1',
+'friday-at' => 'Perjantaina klo $1',
+'saturday-at' => 'Lauantaina klo $1',
+'sunday-at' => 'Sunnuntaina klo $1',
+'yesterday-at' => 'Eilen klo $1',
+
# Bad image list
'bad_image_list' => 'Listan muoto on seuraava:
@@ -3224,7 +3311,7 @@ Kaikki muut linkit ovat poikkeuksia eli toisin sanoen sivuja, joissa tiedostoa s
* gpslongitude
* gpsaltitude',
-# EXIF tags
+# Exif tags
'exif-imagewidth' => 'Leveys',
'exif-imagelength' => 'Korkeus',
'exif-bitspersample' => 'Bittiä komponentissa',
@@ -3402,7 +3489,7 @@ Kaikki muut linkit ovat poikkeuksia eli toisin sanoen sivuja, joissa tiedostoa s
'exif-originalimageheight' => 'Kuvan korkeus ennen kuin sitä rajattiin',
'exif-originalimagewidth' => 'Kuvan leveys ennen kuin sitä rajattiin',
-# EXIF attributes
+# Exif attributes
'exif-compression-1' => 'Pakkaamaton',
'exif-compression-2' => 'CCITT:n Group 3 -yksiulotteinen muokattu Huffman-ajopituuskoodaus',
'exif-compression-3' => 'CCITT:n Group 3 -faksipakkaus',
@@ -3792,7 +3879,6 @@ Voit myös muokata listaa [[Special:EditWatchlist|tavalliseen tapaan]].',
'version-other' => 'Muut',
'version-mediahandlers' => 'Median käsittelijät',
'version-hooks' => 'Kytköspisteet',
-'version-extension-functions' => 'Laajennusfunktiot',
'version-parser-extensiontags' => 'Jäsentimen laajennustagit',
'version-parser-function-hooks' => 'Jäsentimen laajennusfunktiot',
'version-hook-name' => 'Kytköspisteen nimi',
@@ -3801,6 +3887,7 @@ Voit myös muokata listaa [[Special:EditWatchlist|tavalliseen tapaan]].',
'version-license' => 'Lisenssi',
'version-poweredby-credits' => "Tämä wiki käyttää '''[//www.mediawiki.org/ MediaWikiä]'''. Copyright © 2001–$1 $2.",
'version-poweredby-others' => 'muut',
+'version-poweredby-translators' => 'translatewiki.net-kääntäjät',
'version-credits-summary' => 'Haluaisimme kiittää seuraavia henkilöitä heidän panoksestaan [[Special:Version|MediaWiki-ohjelmistoon]].',
'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 minkä tahansa myöhemmän version mukaisesti.
@@ -3814,12 +3901,17 @@ Sinun olisi pitänyt saada [{{SERVER}}{{SCRIPTPATH}}/COPYING kopio GNU General P
'version-entrypoints-header-entrypoint' => 'Aloituskohta',
'version-entrypoints-header-url' => 'URL',
-# Special:FilePath
-'filepath' => 'Tiedoston osoite',
-'filepath-page' => 'Tiedosto',
-'filepath-submit' => 'Siirry',
-'filepath-summary' => 'Tämä toimintosivu palauttaa tiedoston URL-osoitteen.
-Kuvat näytetään täysikokoisina. Muut tiedostot avataan niille määritetyssä ohjelmassa.',
+# Special:Redirect
+'redirect' => 'Ohjaus tiedostonimen, käyttäjätunnisteen tai versiotunnisteen mukaan',
+'redirect-legend' => 'Ohjaus tiedostoon tai sivulle',
+'redirect-summary' => 'Tämä toimintosivu ohjaa tiedostoon (tiedostonimen mukaan), sivulle (versiotunnisteen mukaan) tai käyttäjäsivulle (käyttäjätunnisteen numeron mukaan).',
+'redirect-submit' => 'Siirry',
+'redirect-lookup' => 'Hae:',
+'redirect-value' => 'Arvo:',
+'redirect-user' => 'Käyttäjätunniste',
+'redirect-revision' => 'Sivun versio',
+'redirect-file' => 'Tiedostonimi',
+'redirect-not-exists' => 'Arvoa ei löytynyt',
# Special:FileDuplicateSearch
'fileduplicatesearch' => 'Kaksoiskappaleiden haku',
@@ -3868,12 +3960,16 @@ Kuvat näytetään täysikokoisina. Muut tiedostot avataan niille määritetyssÃ
'tags' => 'Voimassa olevat muutosmerkinnät',
'tag-filter' => '[[Special:Tags|Merkintäsuodatin]]',
'tag-filter-submit' => 'Suodata',
+'tag-list-wrapper' => '([[Special:Tags|{{PLURAL:$1|Merkintä|Merkinnät}}]]: $2)',
'tags-title' => 'Merkinnät',
'tags-intro' => 'Tämä sivu luetteloi merkinnät, joilla ohjelmisto voi merkitä muokkauksia, ja niiden tarkoitukset.',
'tags-tag' => 'Merkintänimi',
'tags-display-header' => 'Näkyvyys muutosluetteloissa',
'tags-description-header' => 'Täysi kuvaus tarkoituksesta',
+'tags-active-header' => 'Aktiivinen?',
'tags-hitcount-header' => 'Merkityt muutokset',
+'tags-active-yes' => 'Kyllä',
+'tags-active-no' => 'Ei',
'tags-edit' => 'muokkaa',
'tags-hitcount' => '$1 {{PLURAL:$1|muutos|muutosta}}',
@@ -3894,6 +3990,7 @@ Kuvat näytetään täysikokoisina. Muut tiedostot avataan niille määritetyssÃ
'dberr-problems' => 'Tällä sivustolla on teknisiä ongelmia.',
'dberr-again' => 'Odota hetki ja lataa sivu uudelleen.',
'dberr-info' => '(Tietokantapalvelimeen yhdistäminen epäonnistui: $1)',
+'dberr-info-hidden' => '(Tietokantapalvelimeen ei saada yhteyttä)',
'dberr-usegoogle' => 'Voit koettaa hakea Googlesta, kunnes virhe korjataan.',
'dberr-outofdate' => 'Googlen indeksi ei välttämättä ole ajan tasalla.',
'dberr-cachederror' => 'Alla on välimuistissa oleva sivun versio, joka ei välttämättä ole ajan tasalla.',
@@ -3909,6 +4006,9 @@ Kuvat näytetään täysikokoisina. Muut tiedostot avataan niille määritetyssÃ
'htmlform-submit' => 'Lähetä',
'htmlform-reset' => 'Kumoa muutokset',
'htmlform-selectorother-other' => 'Muu',
+'htmlform-no' => 'Ei',
+'htmlform-yes' => 'Kyllä',
+'htmlform-chosen-placeholder' => 'Valitse vaihtoehto',
# SQLite database support
'sqlite-has-fts' => '$1, jossa on tuki kokotekstihaulle',
@@ -4026,4 +4126,15 @@ Muussa tapauksessa voit käyttää alla olevaa helpompaa lomaketta. Kommenttisi
# Image rotation
'rotate-comment' => 'Kuvaa käännettiin $1 {{PLURAL:$1|aste|astetta}} myötäpäivään',
+# Limit report
+'limitreport-title' => 'Jäsentimen profilointitiedot',
+'limitreport-cputime' => 'Suorittimen ajankäyttö',
+'limitreport-cputime-value' => '$1 {{PLURAL:$1|sekunti|sekuntia}}',
+'limitreport-walltime' => 'Todellinen ajankäyttö',
+'limitreport-walltime-value' => '$1 {{PLURAL:$1|sekunti|sekuntia}}',
+'limitreport-postexpandincludesize-value' => '$1/$2 {{PLURAL:$2|tavu|tavua}}',
+'limitreport-templateargumentsize' => 'Mallineen argumenttien koko',
+'limitreport-templateargumentsize-value' => '$1/$2 {{PLURAL:$2|tavu|tavua}}',
+'limitreport-expansiondepth' => 'Suurin laajennussyvyys',
+
);
diff --git a/languages/messages/MessagesFit.php b/languages/messages/MessagesFit.php
index f370e318..7c9a7261 100644
--- a/languages/messages/MessagesFit.php
+++ b/languages/messages/MessagesFit.php
@@ -44,7 +44,6 @@ $messages = array(
'tog-shownumberswatching' => 'Näytä kuinka moni käyttäjä valvoo sivua',
'tog-oldsig' => 'Nykynen allekirjotus',
'tog-fancysig' => 'Mookkaamaton allekirjotus ilman auttomaattista linkkiä',
-'tog-externaleditor' => 'Käytä ekterniä tekstiedituuria stantartina. Vain kokenheile käyttäjile, vaatii taattorin asetuksitten muuttamista. Käytä eksterniä tekstiedituuria oletuksena. Vain kokeneille käyttäjille, vaatii selaimen asetusten muuttamista. ([//www.mediawiki.org/wiki/Manual:External_editors Ohje])',
# Dates
'sunday' => 'pyhä',
diff --git a/languages/messages/MessagesFj.php b/languages/messages/MessagesFj.php
index 2f35c1a0..7ee949f3 100644
--- a/languages/messages/MessagesFj.php
+++ b/languages/messages/MessagesFj.php
@@ -159,7 +159,7 @@ $messages = array(
# Special:AllPages
'allpagessubmit' => 'Lako',
-# Email user
+# E-mail user
'defemailsubject' => '{{SITENAME}} I vola livaliva',
# Watchlist
diff --git a/languages/messages/MessagesFo.php b/languages/messages/MessagesFo.php
index 3aea92eb..556170aa 100644
--- a/languages/messages/MessagesFo.php
+++ b/languages/messages/MessagesFo.php
@@ -142,9 +142,6 @@ $messages = array(
'tog-shownumberswatching' => 'Vís tal av brúkarum sum fylgja við',
'tog-oldsig' => 'Verandi undirskrift:',
'tog-fancysig' => 'Viðgerð undirskriftina sum wikitekstur (uttan sjálvvirkandi leinkju)',
-'tog-externaleditor' => 'Nýt útvortis ritil sum fyrimynd (bert fyri fólk við serkunnleika, tað er tørvur á serligum innstillingum á tínari teldu. [//www.mediawiki.org/wiki/Manual:External_editors More information.])',
-'tog-externaldiff' => 'Nýt útvortis diff sum fyrimynd (bert fyri serfrøðingar, tín telda tørvar serligar innstillingar. [//www.mediawiki.org/wiki/Manual:External_editors More information.])',
-'tog-showjumplinks' => 'Ger leinkuna "far til" virknað',
'tog-uselivepreview' => 'Nýt "live preview" (á royndarstøði)',
'tog-forceeditsummary' => 'Gev mær boð, um eg ikki havi skrivað ein samandrátt um mína rætting',
'tog-watchlisthideown' => 'Fjal mínar rættingar frá eftirliti',
@@ -157,6 +154,8 @@ $messages = array(
'tog-diffonly' => 'Vís ikki innihaldið av síðuni undir broytingum',
'tog-showhiddencats' => 'Vís goymdir bólkar',
'tog-norollbackdiff' => 'Vís ikki munin eftir eina afturrulling',
+'tog-useeditwarning' => 'Ãvara meg, tá ið eg fari frá einari rættingarsíðu, sum hevur broytingar ið ikki eru goymdar.',
+'tog-prefershttps' => 'Nýt altíð trygt samband, meðan tú ert innritað/ur',
'underline-always' => 'Altíð',
'underline-never' => 'Ongantíð',
@@ -220,6 +219,18 @@ $messages = array(
'oct' => 'okt',
'nov' => 'nov',
'dec' => 'des',
+'january-date' => 'Januar $1',
+'february-date' => 'Februar $1',
+'march-date' => 'Mars $1',
+'april-date' => 'Apríl $1',
+'may-date' => 'Maj $1',
+'june-date' => 'Juni $1',
+'july-date' => 'Juli $1',
+'august-date' => 'August $1',
+'september-date' => 'September $1',
+'october-date' => 'Oktober $1',
+'november-date' => 'November $1',
+'december-date' => 'Desember $1',
# Categories related messages
'pagecategories' => '{{PLURAL:$1|Bólkur|Bólkar}}',
@@ -301,6 +312,7 @@ $messages = array(
'create-this-page' => 'Stovna hesa síðuna',
'delete' => 'Strika',
'deletethispage' => 'Strika hesa síðuna',
+'undeletethispage' => 'Endurskapað hesa síðuna',
'undelete_short' => 'Ógilda striking av {{PLURAL:$1|einari rætting|$1 broytingum}}',
'viewdeleted_short' => 'Vís {{PLURAL:$1|eina strikaða broyting|$1 strikaðar broytingar}}',
'protect' => 'Friða',
@@ -344,7 +356,7 @@ $1',
'pool-queuefull' => 'Køin til "hylin" er full',
'pool-errorunknown' => 'Ókend villa',
-# 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).
+# 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).
'aboutsite' => 'Um {{SITENAME}}',
'aboutpage' => 'Project:Um',
'copyright' => 'Innihaldið er tøkt undir $1, um ikki annað er viðmerkt.',
@@ -354,7 +366,6 @@ $1',
'disclaimers' => 'Fyrivarni',
'disclaimerpage' => 'Project:Generelt fyrivarni',
'edithelp' => 'Rættingarhjálp',
-'edithelppage' => 'Help:Rættihjálp',
'helppage' => 'Help:Innihald',
'mainpage' => 'Forsíða',
'mainpage-description' => 'Forsíða',
@@ -432,17 +443,7 @@ Hetta kann eisini benda á ein feil í software'ini sum {{SITENAME}} brúkar.",
# General errors
'error' => 'Villa',
'databaseerror' => 'Villa í dátagrunni',
-'dberrortext' => '↓ Tað er hend ein syntaks villa í fyrispurninginum til dátugrunnin.
-Hetta kann merkja, at tað er feilur í ritbúnaðinum (software).
-Seinasta royndin at spyrja dátugrunnin var:
-<blockquote><code>$1</code></blockquote>
-frá innaru funktión "<code>$2</code>".
-Dátagrunnurin gav feilmelding "<samp>$3: $4</samp>".',
-'dberrortextcl' => '↓ Ein syntaks feilur hendi í fyrispurningi til dátugrunnin.
-Seinasta royndin at leita í dátugrunninum var:
- "$1"
-frá funktiónini "$2".
-Dátugrunnurin sendi aftur feilmeldingina: "$3: $4"',
+'databaseerror-error' => 'Feilur: $1',
'laggedslavemode' => "'''Ãvaring:''' Síðan inniheldur møguliga ikki nýggjar dagføringar.",
'readonly' => 'Dátubasan er stongd fyri skriving',
'enterlockreason' => 'Skriva eina orsøk fyri at stongja síðuna fyri skriving, saman við einari meting av, nær ið síðan verður lást upp aftur',
@@ -476,6 +477,7 @@ Møguliga hevur onkur annar longu strikað hana.',
'cannotdelete-title' => 'Kann ikki strika síðu "$1"',
'delete-hook-aborted' => 'Ein húkur (hook) forðaði fyri sletting.
Ongin frágreiðing varð givin.',
+'no-null-revision' => 'Tað bar ikki til at upprætta nýggja tóma versjón fyri síðuna "$1"',
'badtitle' => 'Ógyldugt heiti',
'badtitletext' => 'Umbidna síðan er ógyldugt, tómt ella skeivt tilslóðað heiti millum mál ella wikur.',
'perfcached' => 'Fylgjandi upplýsingar eru "fangaðir" (cached) og eru møguliga ikki dagførdir. à mesta lagi {{PLURAL:$1|eitt úrslit er|$1 úrslit eru}} tøk í cache.',
@@ -498,13 +500,16 @@ Fyri at gera rættingar ella broyta týðingar á øllum wiki'um, vinarliga nýt
'editinginterface' => "↓ '''Ãvaring:''' Tú rættar eina síðu sum verður brúkt til at geva markamóts tekst til ritbúnaðin (software).
Broytingar á hesi síðu fara at ávirka útsjóndina á brúkara markamótinum (interface) fyri aðrar brúkarar á hesi wiki.
Fyri at gera týðingar ella broyta týðingar á øllum wiki, vinarliga nýt [//translatewiki.net/ translatewiki.net], sum er ein MediaWiki verkætlan.",
-'sqlhidden' => '(SQL fyrispurningur fjaldur)',
'cascadeprotected' => 'Henda síðan er vard fyri rættingum, tí hon er í fylgjandi {{PLURAL:$1|síðu, sum er|síðum, sum eru}}
vardar við "arvaðari síðuverjing"
$2',
'namespaceprotected' => 'Tú hevur ikki loyvi til at rætta síður í $1 navnateiginum.',
'customcssprotected' => 'Tú hevur ikki loyvi til at rætta hesa CSS síðuna, tí hon inniheldur persónligar innstillingar hjá øðrum brúkara.',
'customjsprotected' => 'Tú hevur ikki loyvir til at rætta hesa JavaScript síðuna, tí hon inniheldur persónligar innstillingar hjá øðrum brúkara.',
+'mycustomcssprotected' => 'Tú hevur ikki loyvi til at rætta hesa CSS síðuna.',
+'mycustomjsprotected' => 'Tú hevur ikki loyvi til at rætta hesa JavaScript síðuna.',
+'myprivateinfoprotected' => 'Tú hevur ikki loyvi til at rætta tína privatu kunning.',
+'mypreferencesprotected' => 'Tú hevur ikki loyvi til at rætta tínar preferensur.',
'ns-specialprotected' => 'Serstakar síður kunnu ikki rættast.',
'titleprotected' => '[[User:$1|$1]] hevur vart hetta heitið frá skapan.
Givin orsøk er "\'\'$2\'\'".',
@@ -529,10 +534,19 @@ Legg til merkis, at summar síður framvegis vera vístar, sum um tú enn vart l
'welcomecreation-msg' => 'Tín konta er nú stovnað.
Gloym ikki at broyta tínar [[Special:Preferences|{{SITENAME}}-innstillingar]].',
'yourname' => 'Títt brúkaranavn:',
+'userlogin-yourname' => 'Brúkaranavn',
+'userlogin-yourname-ph' => 'Skriva títt brúkaranavn',
+'createacct-another-username-ph' => 'Skriva brúkaranavnið',
'yourpassword' => 'Títt loyniorð:',
+'userlogin-yourpassword' => 'Loyniorð',
+'userlogin-yourpassword-ph' => 'Skriva títt loyniorð',
+'createacct-yourpassword-ph' => 'Skrivað eitt loyniorð',
'yourpasswordagain' => 'Skriva loyniorð umaftur:',
+'createacct-yourpasswordagain' => 'Váttað loyniorðið',
+'createacct-yourpasswordagain-ph' => 'Skrivað loyniorðið enn einaferð',
'remembermypassword' => 'Minst til logg inn hjá mær á hesum kaganum (í mesta lagi í $1 {{PLURAL:$1|dag|dagar}})',
-'securelogin-stick-https' => 'Varðveit sambandið við HTTPS eftir logg inn',
+'userlogin-remembermypassword' => 'Lat meg vera innritaðan',
+'userlogin-signwithsecure' => 'Nýt trygt samband',
'yourdomainname' => 'Títt domene:',
'password-change-forbidden' => 'Tú kanst ikki broyta loyniorð á hesi wiki.',
'externaldberror' => 'Antin var talan um ein atgongd dátubasu feil, ella hevur tú ikki loyvi til at dagføra tína eksternu kontu.',
@@ -544,18 +558,41 @@ Gloym ikki at broyta tínar [[Special:Preferences|{{SITENAME}}-innstillingar]].'
'logout' => 'Útrita',
'userlogout' => 'Rita út',
'notloggedin' => 'Ikki ritað inn',
+'userlogin-noaccount' => 'Hevur tú ikki nakra kontu?',
+'userlogin-joinproject' => 'Meldað teg til {{SITENAME}}',
'nologin' => 'Hevur tú ikki eina kontu? $1.',
'nologinlink' => 'Stovna eina kontu',
'createaccount' => 'Stovna nýggja kontu',
'gotaccount' => "Hevur tú longu eina kontu? '''$1'''.",
'gotaccountlink' => 'Rita inn',
'userlogin-resetlink' => 'Hevur tú gloymt tínar logg inn upplýsingar',
+'userlogin-resetpassword-link' => 'Nullstilla títt loyniorð',
+'helplogin-url' => 'Help:Innritan',
+'userlogin-helplink' => '[[{{MediaWiki:helplogin-url}}|Hjálp til innritan]]',
+'createacct-join' => 'Skrivað tínar upplýsingar niðanfyri.',
+'createacct-another-join' => 'Skriva upplýsingarnar fyri tað nýggju kontuna niðanfyri.',
+'createacct-emailrequired' => 'Teldupost adressa',
+'createacct-emailoptional' => 'Teldupost adressa (valfrítt)',
+'createacct-email-ph' => 'Skrivað tína email adressu',
+'createacct-another-email-ph' => 'Skriva tína t-post adressu',
'createaccountmail' => 'Nýt eitt fyribils tilvildarligt loyniorð og send tað til nevndu t-post adressuna',
+'createacct-realname' => 'Veruligt navn (valfrítt)',
'createaccountreason' => 'Orsøk:',
+'createacct-reason' => 'Orsøk',
+'createacct-reason-ph' => 'Hví upprættar tú eina nýggja kontu',
+'createacct-captcha' => 'Trygdarkekk',
+'createacct-imgcaptcha-ph' => 'Skriva tekstin ið tú sært omanfyri',
+'createacct-submit' => 'Upprætta tína kontu',
+'createacct-another-submit' => 'Upprætta eina aðra kontu',
+'createacct-benefit-heading' => '{{SITENAME}} er gjørd av fólki sum tær.',
+'createacct-benefit-body1' => '{{PLURAL:$1|rætting|rættingar}}',
+'createacct-benefit-body2' => '{{PLURAL:$1|síða|síður}}',
+'createacct-benefit-body3' => 'seinasti/u {{PLURAL:$1|høvundur|høvundar}}',
'badretype' => 'Loyniorðið tú hevur skriva er ikki rætt.',
'userexists' => 'Brúkaranavnið sum tú valdi er longu í nýtslu.
Vinarliga vel eitt annað navn.',
'loginerror' => 'Innritanarbrek',
+'createacct-error' => 'Feilur við skapan av konto',
'createaccounterror' => 'Kundi ikki skapa kontu: $1',
'nocookiesnew' => 'Brúkarakontan er nú gjørd, men tú ert ikki loggaður inn.
{{SITENAME}} brúkar "cookies" fyri at innrita brúkarar.
@@ -619,10 +656,12 @@ Tú eigur at innrita og broyta loyniorðið nú.
Tú kanst síggja burtur frá hesum boðum, um henda kontan varð upprættað av misgáum.',
'usernamehasherror' => 'Brúkaranavn kann ikki innihalda teknið #',
'login-throttled' => 'Tú hevur roynt at rita inn ov nógvar ferðir nýliga.
-Vinarliga bíða áðrenn tú roynir aftur.',
+Vinarliga bíða $1 áðrenn tú roynir aftur.',
'login-abort-generic' => 'Tað miseydnaðist tær at rita inn - avbrotið',
'loginlanguagelabel' => 'Mál: $1',
'suspicious-userlogout' => 'Tín fyrispurningur um at útrita var noktaður, tí tað sær út til at hann varð sendur frá einum oyðiløgdum kaga ella caching proxy.',
+'createacct-another-realname-tip' => 'Veruligt navn er valfrítt.
+Um tú velur at skriva tað, so verður tað nýtt til at geva brúkaranum æruna fyri hennara/hansara arbeiði.',
# Email sending
'php-mail-error-unknown' => "Ókend villa í PHP'sa teldupost () funktión.",
@@ -638,8 +677,7 @@ Fyri at gera innritanina lidna, mást tú velja tær eitt nýtt loyniorð her:',
'newpassword' => 'Nýtt loyniorð:',
'retypenew' => 'Skriva nýtt loyniorð umaftur:',
'resetpass_submit' => 'Vel loyniorð og rita inn',
-'resetpass_success' => 'Tað hevur eydnast tær at broyta títt loyniorð!
-Nú verður tú ritaður inn...',
+'changepassword-success' => 'Títt loyniorð er nú broytt!',
'resetpass_forbidden' => 'Loyniorð kunnu ikki broytast',
'resetpass-no-info' => 'Tú mást vera loggaður á fyri at fáa beinleiðis atgongd til hesa síðu.',
'resetpass-submit-loggedin' => 'Broyt loyniorð',
@@ -651,10 +689,11 @@ Møguliga hevur tú longu broytt títt loyniorð ella biðið um eitt nýtt fyri
# Special:PasswordReset
'passwordreset' => 'Nullstilla loyniorðið',
-'passwordreset-text' => 'Útfyll hetta skjalið fyri at nullstilla títt loyniorð.',
+'passwordreset-text-one' => 'Útfyll henda teigin fyri at nullstilla títt loyniorð.',
+'passwordreset-text-many' => '{{PLURAL:$1|Útfyll ein av teigunum fyri at nullstilla títt loyniorð.}}',
'passwordreset-legend' => 'Nulstilla loyniorðið',
'passwordreset-disabled' => 'Tað ber ikki til at nullstilla loyniorðið á hesi wiki.',
-'passwordreset-pretext' => '{{PLURAL:$1||Skriva ein av upplýsingunum niðanfyri}}',
+'passwordreset-emaildisabled' => 'Teldupost funksjónir eru óvirknar á hesi wiki.',
'passwordreset-username' => 'Brúkaranavn:',
'passwordreset-domain' => 'Umdømi (domain):',
'passwordreset-capture' => 'Sí tann endaliga t-postin?',
@@ -679,7 +718,7 @@ Tú eigur at rita inn og velja eitt nýtt loyniorð nú. Um onkur annar hevur gj
Fyribils loyniorð: $2',
'passwordreset-emailsent' => 'Ein teldupostur har tú kanst nullstillað loyniorðið er blivin sendur.',
'passwordreset-emailsent-capture' => 'Ein teldupostur, har ið tú kanst nullstilla loyniorðið, er blivin sendur, sum víst niðanfyri.',
-'passwordreset-emailerror-capture' => 'Ein áminningar teldupostur varð gjørdur, sum víst niðanfyri, men tað miseydnaðist at senda til brúkaran: $1',
+'passwordreset-emailerror-capture' => 'Ein teldupostur við nullstillaðum loyniorði var gjørdur, sum víst niðanfyri, men tað miseydnaðist at senda til {{GENDER:$2|brúkaran}}: $1',
# Special:ChangeEmail
'changeemail' => 'Broyt teldupost adressu',
@@ -693,6 +732,18 @@ Fyribils loyniorð: $2',
'changeemail-submit' => 'Broyt t-post',
'changeemail-cancel' => 'Ógilda',
+# Special:ResetTokens
+'resettokens' => 'Nullstilla lyklar',
+'resettokens-text' => 'Tú kanst nullstilla lyklar sum geva atgongd til ávís privat dáta sum eru knýtt at tínari konto her.
+
+Tú eigur at gera tað um tú av óvart hevur deilt lyklarnar við onkran, ella um tín konta hevur verið útsett fyri vandastøðu.',
+'resettokens-no-tokens' => 'Tað eru ongir lyklar at nullstilla.',
+'resettokens-legend' => 'Nullstilla lyklar',
+'resettokens-tokens' => 'Lyklar:',
+'resettokens-token-label' => '$1 (dagsins virði: $2)',
+'resettokens-done' => 'Nullstilla lyklar.',
+'resettokens-resetbutton' => 'Nullstilla útvaldu lyklar (tokens)',
+
# Edit page toolbar
'bold_sample' => 'Feitir stavir',
'bold_tip' => 'Feitir stavir',
@@ -896,12 +947,15 @@ Ongin frágreiðing finst.',
Tað sær út til at hon er blivin strikað.',
'edit-conflict' => 'Rættingar trupulleiki (konflikt).',
'edit-no-change' => 'Tín rætting var sæð burtur frá, tí ongin broyting varð gjørd í tekstinum.',
+'postedit-confirmation' => 'Tín rætting varð goymd.',
'edit-already-exists' => 'Tað var ikki møguligt at upprætta nýggja síðu.
Síðan er longu til.',
'defaultmessagetext' => 'Standard boðtekstur',
'content-failed-to-parse' => 'Kláraði ikki at tulka $2 innihaldi fyri $1 modell: $3',
'invalid-content-data' => 'Ógyldug innihalds dáta',
'content-not-allowed-here' => '"$1" innihald er ikki loyvt á síðu [[$2]]',
+'editwarning-warning' => 'Um tú fert frá hesi síðuni, so kanst tú missa tær broytingar ið tú hevur gjørt.
+Um tú hevur ritað inn, so kanst tú sláa hesa ávaring frá í "Rættingar" partinum í tínum innstillingum.',
# Content models
'content-model-wikitext' => 'wikitekst',
@@ -934,6 +988,7 @@ Vinarliga kanna eftir samanberingina niðanfyri fyri at vátta, at hetta er tað
'undo-failure' => 'Rættingin kundi ikki takast burtur orsakað av konfliktum við rættingum sum eru gjørdar eftir at tú fór í gongd at rætta.',
'undo-norev' => 'Rættingin kann ikki takast burtur, tí at hon er ikki til ella var strikað.',
'undo-summary' => 'Tak burtur versjón $1 hjá [[Special:Contributions/$2|$2]] ([[User talk:$2|kjak]])',
+'undo-summary-username-hidden' => 'Angra versjón $1 sum ein fjaldur brúkari hevur gjørt',
# Account creation failure
'cantcreateaccounttitle' => 'Tað ber ikki til at upprætta konto',
@@ -1095,6 +1150,7 @@ Tryggja tær, at henda broyting fer at varðveita framhaldssøguna hjá síðuni
'compareselectedversions' => 'Bera saman valdar útgávur',
'showhideselectedversions' => 'Vís/fjal valdu versjónir',
'editundo' => 'afturstilla',
+'diff-empty' => '(Ongin munur)',
'diff-multi' => '({{PLURAL:$1|Ein versjón herímillum|$1 versjónir sum liggja ímillum}} av {{PLURAL:$2|einum brúkara|$2 brúkarar}} ikki víst)',
'diff-multi-manyusers' => '({{PLURAL:$1|Ein versjón sum liggur ímillum|$1 versjónir sum liggja ímillum}} skrivaðar av meira enn $2 {{PLURAL:$2|brúkara|brúkarum}} ikki víst)',
@@ -1118,7 +1174,6 @@ Tryggja tær, at henda broyting fer at varðveita framhaldssøguna hjá síðuni
'searchmenu-legend' => 'Leiti møguleikar',
'searchmenu-exists' => "'''Tað er longu ein síða sum eitur \"[[:\$1]]\" á hesi wiki.'''",
'searchmenu-new' => "'''Stovna síðuna \"[[:\$1]]\" á hesi wiki!'''",
-'searchhelp-url' => 'Help:Innihald',
'searchmenu-prefix' => '[[Special:PrefixIndex/$1|Leita í síðum við hesum prefiksinum (byrjan av orðinum)]]',
'searchprofile-articles' => 'Innihaldssíður',
'searchprofile-project' => 'Hjálpar og verkætlanar síður',
@@ -1162,14 +1217,7 @@ Tú kanst royna at brúka ''all:'' sum fyrsta stavilsi fyri at søkja í øllum
'searchdisabled' => '{{SITENAME}} leitan er sett úr gildi.
Tú kanst leita via Google ímeðan.
Legg til merkis, at teirra innihaldsyvirlit av {{SITENAME}} kann vera gamalt og ikki dagført.',
-
-# Quickbar
-'qbsettings' => 'Skundfjøl innstillingar',
-'qbsettings-none' => 'Eingin',
-'qbsettings-fixedleft' => 'Fast vinstru',
-'qbsettings-fixedright' => 'Fast høgru',
-'qbsettings-floatingleft' => 'Flótandi vinstru',
-'qbsettings-floatingright' => 'Flótandi høgra',
+'search-error' => 'Ein feilur hendi undir leitanini: $1',
# Preferences page
'preferences' => 'Innstillingar',
@@ -1203,7 +1251,6 @@ Legg til merkis, at teirra innihaldsyvirlit av {{SITENAME}} kann vera gamalt og
'resetprefs' => 'Reinsa ikki goymdar broytingar',
'restoreprefs' => 'Nullstilla alt til standard innstillingar (í øllum teigum)',
'prefs-editing' => 'Broyting av greinum',
-'prefs-edit-boxsize' => 'Støddin á rættingar vindeyganum.',
'rows' => 'Røð:',
'columns' => 'Teigar:',
'searchresultshead' => 'Leita',
@@ -1214,9 +1261,6 @@ Legg til merkis, at teirra innihaldsyvirlit av {{SITENAME}} kann vera gamalt og
'recentchangesdays-max' => 'Ã mesta lagi $1 {{PLURAL:$1|dagur|dagar}}',
'recentchangescount' => 'Tal av rættingum at vísa í standard:',
'prefs-help-recentchangescount' => 'Ãroknað seinastu broytingar, søgur hjá síðum og loggar.',
-'prefs-help-watchlist-token' => 'Um tú fyllir út henda teigin við einum tryggum lykli, so verður ein RSS feed upprættaður til tín eftirlitslista.
-Ein og hvør ið kennir lykilin í hesum teiginum, hevur møguleika fyri at lesa tín eftirlitslista, so vel ein trygt virði.
-Her er eitt tilvildarliga valdt virði, sum tú kanst brúka: $1',
'savedprefs' => 'Tínar innstillingar eru goymdar.',
'timezonelegend' => 'Tíðar sona:',
'localtime' => 'Lokal tíð:',
@@ -1247,7 +1291,6 @@ Her er eitt tilvildarliga valdt virði, sum tú kanst brúka: $1',
'prefs-reset-intro' => 'Tú kanst brúka hesa síðuna til at nullstilla allar tínar valdu innstillingar, so tað kemur aftur til standard.
Tú kanst ikki angra, tá tað fyrst er gjørt.',
'prefs-emailconfirm-label' => 'Vátta tína t-post adressu:',
-'prefs-textboxsize' => 'Støddin á rættingar vindeyganum',
'youremail' => 'T-postur (sjálvboðið)*:',
'username' => '{{GENDER:$1|Brúkaranavn}}:',
'uid' => '{{GENDER:$1|Brúkari}} ID:',
@@ -1282,6 +1325,8 @@ Tín t-post adressa verður ikki avdúkað, tá aðrir brúkarir seta seg í sam
'prefs-dateformat' => 'Slag av dagfesting',
'prefs-timeoffset' => 'Tíðarmunur',
'prefs-advancedediting' => 'Møguleikar sum heild',
+'prefs-editor' => 'Persónur sum rættar',
+'prefs-preview' => 'Forskoðan',
'prefs-advancedrc' => 'Víðkaðir møguleikar',
'prefs-advancedrendering' => 'Víðkaðir møguleikar',
'prefs-advancedsearchoptions' => 'Víðkaðir møguleikar',
@@ -1289,6 +1334,7 @@ Tín t-post adressa verður ikki avdúkað, tá aðrir brúkarir seta seg í sam
'prefs-displayrc' => 'Vís møguleikar',
'prefs-displaysearchoptions' => 'Vís møguleikar',
'prefs-displaywatchlist' => 'Vís møguleikar',
+'prefs-tokenwatchlist' => 'Lykil',
'prefs-diffs' => 'Munir',
# User preference: email validation using jQuery
@@ -1316,6 +1362,8 @@ Tín t-post adressa verður ikki avdúkað, tá aðrir brúkarir seta seg í sam
'userrights-notallowed' => 'Tú hevur ikki loyvi til at geva ella taka burtur brúkara rættindi.',
'userrights-changeable-col' => 'Bólkar sum tú kanst broyta',
'userrights-unchangeable-col' => 'Bólkar, ið tú ikki kanst broyta',
+'userrights-conflict' => 'Ósamsvar viðvíkjandi broytingum í brúkararættindum! Vinarliga endurskoða og vátta tínar broytingar.',
+'userrights-removed-self' => 'Tað eydnaðist tær at taka burtur tíni egnu rættindi. Tí kanst tú ikki longur fáa atgongd til hesa síðuna.',
# Groups
'group' => 'Bólkur:',
@@ -1374,11 +1422,19 @@ Tín t-post adressa verður ikki avdúkað, tá aðrir brúkarir seta seg í sam
'right-hideuser' => 'Sperra eitt brúkaranavn og goyma tað burtur fyri almenninginum',
'right-unblockself' => 'Taka burtur sperring hjá sær sjálvum',
'right-protect' => 'Broyt verjustøður og rætta kaskadu-vardar síður',
-'right-editprotected' => 'Rætta vardar síður (uttan niðurarvaða verju)',
+'right-editprotected' => 'Rætta síður sum eru vardar sum "{{int:protect-level-sysop}}"',
+'right-editsemiprotected' => 'Rætta síður sum er vardar sum "{{int:protect-level-autoconfirmed}}"',
'right-editinterface' => 'Rætta brúkaramarkamótið',
'right-editusercssjs' => 'Rætta CSS og JavaScript fílur hjá øðrum brúkarum',
'right-editusercss' => 'Rætta CSS fílur hjá øðrum brúkarum',
'right-edituserjs' => 'Rætta JavaScript fílur hjá øðrum brúkarum',
+'right-editmyusercss' => 'Rætta tínar egnu brúkara CSS fílur',
+'right-editmyuserjs' => 'Rætta tínar egnu brúkara JavaScript fílur',
+'right-viewmywatchlist' => 'Síggj tín egna eftirlitslista',
+'right-editmywatchlist' => 'Rætta tín egna eftirlitslista. Legg til merkis at summar handlingar fara framvegis at leggja síður afturat sjálvt uttan hesi rættindi.',
+'right-viewmyprivateinfo' => 'Síggj tíni egnu privatu upplýsingar (t.d. teldupostadressu, veruligt navn)',
+'right-editmyprivateinfo' => 'Rætta tíni egnu privatu dáta (t.d. teldupost adresssu, veruligt navn)',
+'right-editmyoptions' => 'Rætta tínar egnu innstillingar',
'right-rollback' => 'Rulla skjótt aftur (tak burtur) rættingarnar hjá tí seinasta brúkaranum á einari ávísari síðu',
'right-markbotedits' => 'Markera afturrullaðar rættingar sum rættingar frá einum botti',
'right-noratelimit' => 'Ikki ávirkað av hámarksferð',
@@ -1440,12 +1496,17 @@ Tín t-post adressa verður ikki avdúkað, tá aðrir brúkarir seta seg í sam
'action-userrights-interwiki' => 'broyt brúkararættindi hjá brúkarum á øðrum wikium',
'action-siteadmin' => 'stong ella læs upp dátugrunnin',
'action-sendemail' => 'send teldupostar',
+'action-editmywatchlist' => 'rætta tín eftirlitslista',
+'action-viewmywatchlist' => 'síggja tín eftirlitslista',
+'action-viewmyprivateinfo' => 'hygg at tínari privatu kunning',
+'action-editmyprivateinfo' => 'rætta tína privatu kunning',
# Recent changes
'nchanges' => '$1 {{PLURAL:$1|broyting|broytingar}}',
'recentchanges' => 'Seinastu broytingar',
'recentchanges-legend' => 'Nýligar broytingar møguleikar',
'recentchanges-summary' => 'à hesi síðu kanst tú fylgja teimum nýggjastu broytingunum á hesi wiki.',
+'recentchanges-noresult' => 'Ongar broytingar í nevnda tíðarskeiðnum passa til hesi krøvini.',
'recentchanges-feed-description' => "Við hesum feed'inum kanst tú fylgja teimum seinastu broytingunum á hesi wiki'ini.",
'recentchanges-label-newpage' => 'Henda rætting upprættaði eina nýggja síðu',
'recentchanges-label-minor' => 'Hetta er ein lítil rætting',
@@ -1482,7 +1543,6 @@ Tín t-post adressa verður ikki avdúkað, tá aðrir brúkarir seta seg í sam
'recentchangeslinked-feed' => 'Viðkomandi broytingar',
'recentchangeslinked-toolbox' => 'Viðkomandi broytingar',
'recentchangeslinked-title' => 'Broytingar sum vísa til "$1"',
-'recentchangeslinked-noresult' => 'Ongar broytingar á slóðaðar síður í valda tíðarskeiði.',
'recentchangeslinked-summary' => "Hetta er ein listi við broytingum sum nýliga eru gjørdir á síðum sum víst verður til frá einari serstakari síðu (ella til limir í einum serstøkum bólki).
Síður á [[Special:Watchlist|tínum eftiransingarlista]] eru skrivaðar við '''feitum'''.",
'recentchangeslinked-page' => 'Síðu heiti:',
@@ -1494,8 +1554,7 @@ Síður á [[Special:Watchlist|tínum eftiransingarlista]] eru skrivaðar við '
'reuploaddesc' => 'Angra uppløðu og far aftur til upload formin',
'upload-tryagain' => 'Goym broytta fílu frágreiðing',
'uploadnologin' => 'Ikki ritað inn',
-'uploadnologintext' => 'Tú mást hava [[Special:UserLogin|ritað inn]]
-fyri at leggja fílur upp.',
+'uploadnologintext' => 'Tú mást $1 fyri at leggja fílur út.',
'upload-recreate-warning' => "'''Ãvaring: Ein fíla við hasum navninum er blivin strikað ella flutt.'''
Strikingar og flytingar loggurin (søgan) fyri ta síðuna verður vístur her niðanfyri fyri at gera tað lættari hjá tær:",
@@ -1682,7 +1741,6 @@ Bert fílu atgongd er loyvd.',
'http-read-error' => 'HTTP lesifeilur.',
'http-timed-out' => 'HTTP fyrispurningurin tók ov langa tíð.',
'http-curl-error' => 'Feilur meðan vit heintaðu URL: $1',
-'http-host-unreachable' => 'Internetadressan er ikki atkomulig.',
'http-bad-status' => 'Tað hendi ein feilur undir viðgerðini av HTTP fyrispurnininum: $1 $2',
# Some likely curl errors. More could be added from <http://curl.haxx.se/libcurl/c/libcurl-errors.html>
@@ -1712,6 +1770,8 @@ Tú kanst eisini royna aftur, tá tað ikki eru so nógv í gongd her í senn.',
'listfiles_size' => 'Stødd',
'listfiles_description' => 'Frágreiðing',
'listfiles_count' => 'Versjónir',
+'listfiles-latestversion-yes' => 'Ja',
+'listfiles-latestversion-no' => 'Nei',
# File description page
'file-anchor-link' => 'Mynd',
@@ -1805,6 +1865,13 @@ Minst til at kanna eftir um aðrar síður slóða til fyrimyndirnar, áðrenn t
'randompage' => 'Tilvildarlig síða',
'randompage-nopages' => 'Tað eru ongar síður í hesum {{PLURAL:$2|navnarúminum|navnarúmunum}}: $1.',
+# Random page in category
+'randomincategory' => 'Tilvildarlig síða í bólkinum',
+'randomincategory-invalidcategory' => '"$1" kann ikki brúkast sum bólkaheiti.',
+'randomincategory-nopages' => 'Tað eru ongar síður í [[:Category:$1]].',
+'randomincategory-selectcategory' => 'Fá tilvildarliga síðu frá bólki: $1 $2.',
+'randomincategory-selectcategory-submit' => 'Far',
+
# Random redirect
'randomredirect' => 'Tilvildarlig ávísingarsíða',
'randomredirect-nopages' => 'Tað eru ongar víðaristillingar til navnarúmið "$1".',
@@ -1830,17 +1897,12 @@ Minst til at kanna eftir um aðrar síður slóða til fyrimyndirnar, áðrenn t
'statistics-users-active-desc' => 'Brúkarar ið hava framt eina handling seinasta/u {{PLURAL:$1|døgnið|$1 dagarnar}}',
'statistics-mostpopular' => 'Mest sæddu síður',
-'disambiguations' => 'Síður sum vísa til síður við fleirfaldum týdningi',
-'disambiguationspage' => 'Template:fleiri týdningar',
-'disambiguations-text' => "Hesar síður innihalda í minsta lagi ein leinkju til eina '''síðu við fleiri týdningum'''.
-Tær eiga heldur at slóða til ein meira passandi síðu í staðin.<br />
-Ein síða verður sædd sum ein síða við fleiri týdningum, um hon brúkar eina fyrimynd, sum slóðar frá [[MediaWiki:Disambiguationspage]].",
-
'pageswithprop' => 'Síður við síðueginleika',
'pageswithprop-legend' => 'Síður við einum síðueginleika',
'pageswithprop-text' => 'Henda síðan vísir síður ein lista yvir síður, sum hava ein serstakan síðueginleika.',
'pageswithprop-prop' => 'Navn á eginleika:',
'pageswithprop-submit' => 'Far',
+'pageswithprop-prophidden-long' => 'langur tekstur eginleikavirði er fjalt ($1)',
'doubleredirects' => 'Tvífaldað ávísing',
'doubleredirectstext' => 'Henda síða gevur yvirlit yvir síður, sum vísa víðari til aðrar víðaristillaðar síður.
@@ -1897,6 +1959,7 @@ Víðaristilling verður nú gjørd til [[$2]].',
'mostrevisions' => 'Greinir við flestum útgávum',
'prefixindex' => 'Allar síður við forskoyti (prefiks)',
'prefixindex-namespace' => 'Allar síður við prefiksi (navnarúmið $1)',
+'prefixindex-strip' => 'Tak burtur prefiks í listanum',
'shortpages' => 'Stuttar síður',
'longpages' => 'Langar síður',
'deadendpages' => 'Gøtubotnssíður',
@@ -2082,8 +2145,9 @@ Framtíðar broytingar á hesi síðu og tilknýttu kjaksíðuni verða at sígg
'unwatchthispage' => 'Halt uppat við at hava eftirlit',
'notanarticle' => 'Ongin innihaldssíða',
'notvisiblerev' => 'Seinasta versjón av einum øðrum brúkara er blivin slettað',
-'watchnochange' => 'Ongin grein í tínum eftirliti er rætta innanfyri hetta tíðarskeiði.',
'watchlist-details' => '{{PLURAL:$1|$1 síða|$1 síður}} á tínum vaktarlista, kjaksíður ikki íroknaðar.',
+'wlheader-enotif' => 'Tað ber nú til at senda teldupost.',
+'wlheader-showupdated' => "Síður sum eru broyttar síðan tú seinast vitjaði tær, eru vístar við '''feitum'''.",
'watchmethod-recent' => 'kanna eftir nýligum rættingum á eftirlitssíðum',
'watchmethod-list' => 'kannar síður undir eftirliti fyri feskar broytingar',
'watchlistcontains' => 'Títt eftirlit inniheldur {{PLURAL:$1|eina síðu|$1 síður}}.',
@@ -2420,10 +2484,7 @@ Fjalingarloggurin er vístur niðanfyri til kunningar:',
'ipb-otherblocks-header' => '{{PLURAL:$1|Onnur sperring|Aðrar sperringar}}',
'unblock-hideuser' => 'Tú kanst ikki taka burtur sperringina hjá hesum brúkara, eftirsum brúkaranavnið hjá viðkomandi er fjalt.',
'ipb_cant_unblock' => 'Feilur: Sperring ID $1 ikki funnin. Tað er møguligt, at sperringin longu er tikin burtur.',
-'blockme' => 'Sperra meg',
'proxyblocker' => 'Proxy sperring',
-'proxyblocker-disabled' => 'Henda funksjónin er ikki virkin.',
-'proxyblocksuccess' => 'Liðugt.',
'sorbsreason' => 'Tín IP adressa er merkt sum ein open proxy í DNSBL sum {{SITENAME}} brúkar.',
'sorbs_create_account_reason' => 'Tín IP adressa er merkt sum ein open proxy í DNSBL sum {{SITENAME}} brúkar.
Tú kanst ikki upprætta eina konto.',
@@ -2575,6 +2636,8 @@ Vinarliga vitja [//www.mediawiki.org/wiki/Localisation MediaWiki Localisation] o
'thumbnail-more' => 'Víðka',
'filemissing' => 'Fíla vantar',
'thumbnail_error' => 'Feilur við upprættan av thumbnail (lítlari mynd): $1',
+'thumbnail_error_remote' => 'Feilboð frá $1:
+$2',
'djvu_page_error' => 'DjVu síða uttanfyri økið',
'djvu_no_xml' => 'Tað bar ikki til at heinta XML fyri DjVu fílu',
'thumbnail-temp-create' => 'Tað bar ikki til at upprættað eina fyribils pinkalítla stødd (thumbnail) av fíluni',
@@ -2774,8 +2837,6 @@ Vinarliga royn aftur.',
'pageinfo-category-files' => 'Tal av fílum',
# Skin names
-'skinname-standard' => 'Standardur',
-'skinname-nostalgia' => 'Nostalgiskur',
'skinname-cologneblue' => 'Cologne-bláur',
# Patrolling
@@ -2836,11 +2897,25 @@ Vinarliga royn aftur.',
'minutes' => '{{PLURAL:$1|$1 minuttur|$1 minuttir}}',
'hours' => '{{PLURAL:$1|$1 tími|$1 tímar}}',
'days' => '{{PLURAL:$1|$1 dagur|$1 dagar}}',
+'weeks' => '{{PLURAL:$1|$1 vika|$1 vikur}}',
'months' => '{{PLURAL:$1|$1 mánaður|$1 mánaðir}}',
'years' => '{{PLURAL:$1|$1 ár}}',
'ago' => '$1 síðan',
'just-now' => 'júst nú',
+# Human-readable timestamps
+'hours-ago' => '$1 {{PLURAL:$1|tími|tímar}} síðan',
+'minutes-ago' => '$1 {{PLURAL:$1|minuttur|minuttir}} síðan',
+'seconds-ago' => '$1 {{PLURAL:$1|sekund|sekundir}} síðan',
+'monday-at' => 'Mánadagin kl. $1',
+'tuesday-at' => 'Týsdagin kl. $1',
+'wednesday-at' => 'Mikudagin kl. $1',
+'thursday-at' => 'Hósdagin kl. $1',
+'friday-at' => 'Fríggjadagin kl. $1',
+'saturday-at' => 'Leygardagin kl. $1',
+'sunday-at' => 'Sunnudagin kl. $1',
+'yesterday-at' => 'à gjár kl. $1',
+
# Bad image list
'bad_image_list' => 'Støddin er soleiðis:
@@ -2870,7 +2945,7 @@ Onnur metadáta verða fjald sum standard.
* gpslongitude
* gpsaltitude',
-# EXIF tags
+# Exif tags
'exif-imagewidth' => 'Breidd',
'exif-imagelength' => 'Hædd',
'exif-bitspersample' => 'Bits per komponent',
@@ -2912,7 +2987,7 @@ Onnur metadáta verða fjald sum standard.
'exif-originalimageheight' => 'Hæddin á myndini, áðrenn hon varð skorin',
'exif-originalimagewidth' => 'Breiddin á myndini, áðrenn hon varð skorin',
-# EXIF attributes
+# Exif attributes
'exif-compression-1' => 'Ikki komprimerað',
'exif-copyrighted-true' => 'Vard av upphavrætti',
@@ -3069,11 +3144,17 @@ Hendan váttanarkoda fer úr gildi tann $4.',
'version-license' => 'Lisensur',
'version-poweredby-credits' => "Henda wiki verður rikin av '''[//www.mediawiki.org/ MediaWiki]''', copyright © 2001-$1 $2.",
'version-poweredby-others' => 'onnur',
+'version-poweredby-translators' => 'translatewiki.net týðarar',
'version-credits-summary' => 'Vit ynskja at takka fylgjandi persónum fyri teirra íkast til [[Special:Version|MediaWiki]].',
'version-software-version' => 'Útgáva',
-# Special:FilePath
-'filepath-page' => 'Fíla:',
+# Special:Redirect
+'redirect-submit' => 'Far',
+'redirect-value' => 'Virði:',
+'redirect-user' => 'Brúkara ID',
+'redirect-revision' => 'Síðuversjón',
+'redirect-file' => 'Fílunavn',
+'redirect-not-exists' => 'Virði ikki funnið',
# Special:FileDuplicateSearch
'fileduplicatesearch-filename' => 'Fílunavn:',
diff --git a/languages/messages/MessagesFr.php b/languages/messages/MessagesFr.php
index 3b773d34..bb9395f7 100644
--- a/languages/messages/MessagesFr.php
+++ b/languages/messages/MessagesFr.php
@@ -10,6 +10,7 @@
* @author Agzennay
* @author Amqui
* @author Arkanosis
+ * @author Ayack
* @author Boniface
* @author Brunoperel
* @author Cedric31
@@ -30,6 +31,7 @@
* @author Erkethan
* @author Esbardu
* @author Fabrice Ferrer
+ * @author Frakir
* @author François Melchior
* @author Fryed-peach
* @author Geoleplubo
@@ -418,9 +420,6 @@ $messages = array(
'tog-shownumberswatching' => "Afficher le nombre d'utilisateurs qui suivent la page",
'tog-oldsig' => 'Signature existante :',
'tog-fancysig' => 'Traiter la signature comme du wikitexte (sans lien automatique)',
-'tog-externaleditor' => "Utiliser par défaut un éditeur de texte externe (pour les utilisateurs avancés, nécessite des réglages spécifiques sur votre ordinateur, [//www.mediawiki.org/wiki/Manual:External_editors/fr plus d'informations]).",
-'tog-externaldiff' => "Utiliser un comparateur externe par défaut (pour les utilisateurs avancés, nécessite des réglages sur votre ordinateur, [//www.mediawiki.org/wiki/Manual:External_editors/fr plus d'informations]).",
-'tog-showjumplinks' => 'Activer les liens « navigation » et « recherche » en haut de page',
'tog-uselivepreview' => 'Utiliser l’aperçu rapide (expérimental)',
'tog-forceeditsummary' => "M'avertir lorsque je n'ai pas spécifié de résumé de modification",
'tog-watchlisthideown' => 'Masquer mes propres modifications dans la liste de suivi',
@@ -434,6 +433,8 @@ $messages = array(
'tog-showhiddencats' => 'Afficher les catégories cachées',
'tog-noconvertlink' => 'Désactiver la conversion des titres',
'tog-norollbackdiff' => "Ne pas afficher le diff lors d'une révocation",
+'tog-useeditwarning' => "M'avertir quand je quitte une page de modification sans publier les changements",
+'tog-prefershttps' => 'Toujours utiliser une connexion sécurisée en étant connecté',
'underline-always' => 'Toujours',
'underline-never' => 'Jamais',
@@ -497,6 +498,18 @@ $messages = array(
'oct' => 'oct',
'nov' => 'nov',
'dec' => 'déc',
+'january-date' => '$1 janvier',
+'february-date' => '$1 février',
+'march-date' => '$1 mars',
+'april-date' => '$1 avril',
+'may-date' => '$1 mai',
+'june-date' => '$1 juin',
+'july-date' => '$1 juillet',
+'august-date' => '$1 août',
+'september-date' => '$1 septembre',
+'october-date' => '$1 octobre',
+'november-date' => '$1 novembre',
+'december-date' => '$1 décembre',
# Categories related messages
'pagecategories' => '{{PLURAL:$1|Catégorie|Catégories}}',
@@ -578,6 +591,7 @@ $messages = array(
'create-this-page' => 'Créer cette page',
'delete' => 'Supprimer',
'deletethispage' => 'Supprimer cette page',
+'undeletethispage' => 'Annuler la suppression de cette page',
'undelete_short' => 'Restaurer $1 modification{{PLURAL:$1||s}}',
'viewdeleted_short' => 'Voir {{PLURAL:$1|une modification supprimée|$1 modifications supprimées}}',
'protect' => 'Protéger',
@@ -621,7 +635,7 @@ $1",
'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).
+# 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).
'aboutsite' => 'À propos de {{SITENAME}}',
'aboutpage' => 'Project:À propos',
'copyright' => 'Le contenu est disponible sous licence $1 sauf mention contraire.',
@@ -631,7 +645,6 @@ $1",
'disclaimers' => 'Avertissements',
'disclaimerpage' => 'Project:Avertissements généraux',
'edithelp' => 'Aide',
-'edithelppage' => 'Aide:Édition',
'helppage' => 'Help:Accueil',
'mainpage' => 'Accueil',
'mainpage-description' => 'Accueil',
@@ -708,17 +721,11 @@ Une liste des pages spéciales valides se trouve sur [[Special:SpecialPages|{{in
# General errors
'error' => 'Erreur',
'databaseerror' => 'Erreur de la base de données',
-'dberrortext' => "Une erreur de syntaxe de la requête dans la base de données est survenue.
-Ceci peut indiquer un bogue dans le logiciel.
-La dernière requête traitée par la base de données était :
-<blockquote><code>$1</code></blockquote>
-depuis la fonction « <code>$2</code> ».
-La base de données a renvoyé l'erreur « <samp>$3 : $4</samp> ».",
-'dberrortextcl' => "Une requête dans la base de données comporte une erreur de syntaxe.
-La dernière requête émise était :
-« $1 »
-dans la fonction « $2 ».
-La base de données a renvoyé l'erreur « $3 : $4 ».",
+'databaseerror-text' => "Une erreur de requête de base de données s'est produite. Cela peut provenir d'un bogue dans le logiciel.",
+'databaseerror-textcl' => "Une erreur de requête de base de données s'est produite.",
+'databaseerror-query' => 'Requête : $1',
+'databaseerror-function' => 'Fonction : $1',
+'databaseerror-error' => 'Erreur : $1',
'laggedslavemode' => 'Attention, cette page peut ne pas contenir les toutes dernières modifications effectuées',
'readonly' => 'Base de données verrouillée',
'enterlockreason' => "Indiquez la raison du verrouillage ainsi qu'une estimation de sa durée",
@@ -752,6 +759,7 @@ La suppression a peut-être déjà été effectuée par quelqu’un d’autre.',
'cannotdelete-title' => 'Impossible de supprimer la page « $1 »',
'delete-hook-aborted' => "Suppression annulée par une extension.
Aucune explication n'a été fournie.",
+'no-null-revision' => 'Impossible de créer une nouvelle révision vide pour la page « $1 »',
'badtitle' => 'Mauvais titre',
'badtitletext' => 'Le titre de la page demandée est invalide, vide, ou il s’agit d’un titre inter-langue ou inter-projet mal formé. Il contient peut-être un ou plusieurs caractères qui ne peuvent pas être utilisés dans les titres.',
'perfcached' => 'Les données suivantes sont en cache et peuvent ne pas être à jour. Un maximum de {{PLURAL:$1|un résultat|$1 résultats}} est disponible dans le cache.',
@@ -772,12 +780,15 @@ Essayez à nouveau dans quelques minutes.",
Pour ajouter ou modifier des traductions sur tous les wikis, veuillez utiliser [//translatewiki.net/ translatewiki.net], le projet de localisation de MediaWiki.",
'editinginterface' => "'''Attention''' : vous êtes en train de modifier une page utilisée pour créer le texte de l’interface du logiciel. Les changements sur cette page se répercuteront sur l’apparence de l’interface utilisateur pour les autres utilisateurs de ce wiki.
Pour ajouter ou modifier des traductions pour tous les wikis, veuillez utiliser [//translatewiki.net/ translatewiki.net], le projet d’internationalisation de MediaWiki.",
-'sqlhidden' => '(Requête SQL cachée)',
'cascadeprotected' => 'Cette page est protégée car elle est incluse par {{PLURAL:$1|la page suivante, qui a été protégée|les pages suivantes, qui ont été protégées}} avec l’option « protection en cascade » activée :
$2',
'namespaceprotected' => "Vous n'avez pas la permission de modifier les pages de l'espace de noms « '''$1''' ».",
'customcssprotected' => "Vous n'avez pas la permission de modifier cette page de CSS, car elle contient les paramètres personnels d'un autre utilisateur.",
'customjsprotected' => "Vous n'avez pas la permission de modifier cette page de JavaScript, car elle contient les paramètres personnels d'un autre utilisateur.",
+'mycustomcssprotected' => 'Vous n’avez pas le droit de modifier cette page CSS.',
+'mycustomjsprotected' => 'Vous n’avez pas le droit de modifier cette page JavaScript.',
+'myprivateinfoprotected' => 'Vous n’avez pas les droits pour modifier vos informations personnelles.',
+'mypreferencesprotected' => 'Vous n’avez pas les droits pour modifier vos préférences.',
'ns-specialprotected' => "Les pages dans l'espace de noms « {{ns:special}} » ne peuvent pas être modifiées.",
'titleprotected' => "Ce titre a été protégé à la création par [[User:$1|$1]].
Le motif avancé est « ''$2'' ».",
@@ -802,10 +813,19 @@ Notez que certaines pages peuvent être encore affichées comme si vous étiez t
'welcomecreation-msg' => "Votre compte a été créé.
N'oubliez pas de modifier [[Special:Preferences|vos préférences pour {{SITENAME}}]].",
'yourname' => "Nom d'utilisateur :",
+'userlogin-yourname' => "Nom d'utilisateur",
+'userlogin-yourname-ph' => "Entrez votre nom d'utilisateur",
+'createacct-another-username-ph' => 'Saisir le nom d’utilisateur',
'yourpassword' => 'Mot de passe&nbsp;:',
+'userlogin-yourpassword' => 'Mot de passe',
+'userlogin-yourpassword-ph' => 'Entrez votre mot de passe',
+'createacct-yourpassword-ph' => 'Entrez un mot de passe',
'yourpasswordagain' => 'Confirmez le mot de passe :',
+'createacct-yourpasswordagain' => 'Confirmez le mot de passe',
+'createacct-yourpasswordagain-ph' => 'Entrez à nouveau le mot de passe',
'remembermypassword' => 'Me reconnecter automatiquement lors des prochaines visites avec ce navigateur (au maximum $1&nbsp;{{PLURAL:$1|jour|jours}})',
-'securelogin-stick-https' => 'Rester connecté en HTTPS après la connexion',
+'userlogin-remembermypassword' => 'Garder ma session active',
+'userlogin-signwithsecure' => 'Utiliser une connexion sécurisée',
'yourdomainname' => 'Votre domaine :',
'password-change-forbidden' => 'Vous ne pouvez pas modifier les mots de passe sur ce wiki.',
'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.",
@@ -817,18 +837,44 @@ N'oubliez pas de modifier [[Special:Preferences|vos préférences pour {{SITENAM
'logout' => 'Se déconnecter',
'userlogout' => 'Déconnexion',
'notloggedin' => 'Non connecté',
+'userlogin-noaccount' => "Vous n'avez pas de compte ?",
+'userlogin-joinproject' => 'Rejoignez {{SITENAME}}',
'nologin' => "Vous n'êtes pas encore inscrit ? $1.",
'nologinlink' => 'Créer un compte',
'createaccount' => 'Créer un compte',
'gotaccount' => "Vous avez déjà un compte ? '''$1'''.",
'gotaccountlink' => 'Connectez-vous',
'userlogin-resetlink' => 'Vous avez oublié vos détails de connexion ?',
+'userlogin-resetpassword-link' => 'Réinitialiser le mot de passe',
+'helplogin-url' => 'Help:Connexion',
+'userlogin-helplink' => '[[{{MediaWiki:helplogin-url}}|Aide à la connexion]]',
+'userlogin-loggedin' => 'Vous êtes déjà connecté en tant que {{GENDER:$1|$1}}.
+Utilisez le formulaire ci-dessous pour vous connecter avec un autre utilisateur.',
+'userlogin-createanother' => 'Créer un autre compte',
+'createacct-join' => 'Entrez vos informations ci-dessous.',
+'createacct-another-join' => 'Saisir les informations du nouveau compte ci-dessous.',
+'createacct-emailrequired' => 'Adresse de courriel',
+'createacct-emailoptional' => 'Adresse de courriel (facultative)',
+'createacct-email-ph' => 'Entrez votre adresse de courriel',
+'createacct-another-email-ph' => 'Saisir l’adresse de courriel',
'createaccountmail' => 'Utiliser un mot de passe aléatoire temporaire et l’envoyer à l’adresse de courriel spécifiée',
+'createacct-realname' => 'Nom réel (facultatif)',
'createaccountreason' => 'Motif :',
+'createacct-reason' => 'Motif',
+'createacct-reason-ph' => 'Pourquoi créez-vous un autre compte',
+'createacct-captcha' => 'Contrôle de sécurité',
+'createacct-imgcaptcha-ph' => 'Entrez le texte que vous voyez ci-dessus',
+'createacct-submit' => 'Créez votre compte',
+'createacct-another-submit' => 'Créer un autre compte',
+'createacct-benefit-heading' => '{{SITENAME}} est écrit par des gens comme vous.',
+'createacct-benefit-body1' => '{{PLURAL:$1|modification|modifications}}',
+'createacct-benefit-body2' => '{{PLURAL:$1|article|articles}}',
+'createacct-benefit-body3' => '{{PLURAL:$1|contributeur récent|contributeurs récents}}',
'badretype' => 'Les mots de passe que vous avez saisis ne correspondent pas.',
'userexists' => "Nom d'utilisateur entré déjà utilisé.
Veuillez choisir un nom différent.",
'loginerror' => 'Erreur de connexion',
+'createacct-error' => 'Erreur lors de la création du compte',
'createaccounterror' => 'Impossible de créer le compte : $1',
'nocookiesnew' => "Le compte utilisateur a été créé, mais vous n'êtes pas connecté{{GENDER:||e|(e)}}. {{SITENAME}} utilise des cookies pour la connexion mais vous les avez désactivés. Veuillez les activer et vous reconnecter avec le même nom et le même mot de passe.",
'nocookieslogin' => '{{SITENAME}} utilise des cookies pour la connexion mais vous les avez désactivés. Veuillez les activer et vous reconnecter.',
@@ -885,11 +931,13 @@ Vous devriez ouvrir une session et modifier dès à présent votre mot de passe.
Ignorez ce message si ce compte a été créé par erreur.',
'usernamehasherror' => "Le nom d'utilisateur ne peut pas contenir des caractères de hachage",
-'login-throttled' => 'Vous avez tenté un trop grand nombre de connexions dernièrement.
-Veuillez attendre avant d’essayer à nouveau.',
+'login-throttled' => "Vous avez tenté un trop grand nombre de connexions dernièrement.
+Veuillez attendre $1 avant d'essayer à nouveau.",
'login-abort-generic' => 'Votre tentative de connexion a échoué',
'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.",
+'createacct-another-realname-tip' => 'Le vrai nom est optionnel.
+Si vous décidez de le fournir, il sera utilisé pour attribuer à l’utilisateur ses travaux.',
# Email sending
'php-mail-error-unknown' => 'Erreur inconnue dans la fonction mail() de PHP.',
@@ -905,8 +953,7 @@ Veuillez attendre avant d’essayer à nouveau.',
'newpassword' => 'Nouveau mot de passe :',
'retypenew' => 'Confirmer le nouveau mot de passe :',
'resetpass_submit' => 'Changer le mot de passe et se connecter',
-'resetpass_success' => 'Votre mot de passe a bien été modifié !
-Vous allez maintenant être connecté…',
+'changepassword-success' => 'Votre mot de passe a été changé avec succès !',
'resetpass_forbidden' => 'Les mots de passe ne peuvent pas être changés',
'resetpass-no-info' => 'Vous devez être connecté pour avoir accès à cette page.',
'resetpass-submit-loggedin' => 'Changer de mot de passe',
@@ -918,10 +965,11 @@ Vous avez peut-être déjà changé votre mot de passe ou demandé un nouveau mo
# Special:PasswordReset
'passwordreset' => 'Remise à zéro du mot de passe',
-'passwordreset-text' => 'Remplissez ce formulaire pour réinitialiser votre mot de passe.',
+'passwordreset-text-one' => 'Remplissez ce formulaire pour réinitialiser votre mot de passe.',
+'passwordreset-text-many' => '{{PLURAL:$1|Remplissez un des champs pour réinitialiser votre mot de passe.}}',
'passwordreset-legend' => 'Remise à zéro du mot de passe',
'passwordreset-disabled' => 'La réinitialisation des mots de passe a été désactivée sur ce wiki.',
-'passwordreset-pretext' => '{{PLURAL:$1||Entrez un élément de données ci-dessous}}',
+'passwordreset-emaildisabled' => 'Les fonctionnalités e-mail ont été désactivées sur ce wiki.',
'passwordreset-username' => "Nom d'utilisateur :",
'passwordreset-domain' => 'Domaine :',
'passwordreset-capture' => 'Voir le courriel résultant?',
@@ -942,7 +990,7 @@ $2
Mot de passe temporaire : $2",
'passwordreset-emailsent' => 'Un courriel de réinitialisation de mot de passe a été envoyé.',
'passwordreset-emailsent-capture' => 'Un courriel de réinitialisation de mot de passe a été envoyé, qui est affiché ci-dessous.',
-'passwordreset-emailerror-capture' => "Un courriel de réinitialisation de mot de passe a été généré, qui est affiché ci-dessous, mais l'envoi à l'utilisateur a échoué : $1",
+'passwordreset-emailerror-capture' => "Un courriel de réinitialisation de mot de passe a été généré, qui est affiché ci-dessous, mais l'envoi à l'{{GENDER:$2|utilisateur}} a échoué : $1",
# Special:ChangeEmail
'changeemail' => 'Changer l’adresse de courriel',
@@ -956,6 +1004,19 @@ Mot de passe temporaire : $2",
'changeemail-submit' => 'Changer l’adresse de courriel',
'changeemail-cancel' => 'Annuler',
+# Special:ResetTokens
+'resettokens' => 'Réinitialiser les jetons',
+'resettokens-text' => "Ici, vous pouvez réinitialiser les jetons qui permettent d’accéder à certaines données privées associées à votre compte.
+
+Vous devriez le faire si vous les avez partagés accidentellement avec quelqu'un ou si votre compte a été compromis.",
+'resettokens-no-tokens' => 'Il n’y a aucun jeton à réinitialiser.',
+'resettokens-legend' => 'Réinitialiser les jetons',
+'resettokens-tokens' => 'Jetons :',
+'resettokens-token-label' => '$1 (valeur actuelle : $2)',
+'resettokens-watchlist-token' => 'Jeton pour le flux (Atom/RSS) web de [[Special:Watchlist|modifications de pages de votre liste de suivi]]',
+'resettokens-done' => 'Jetons réinitialisés.',
+'resettokens-resetbutton' => 'Réinitialiser les jetons sélectionnés',
+
# Edit page toolbar
'bold_sample' => 'Texte gras',
'bold_tip' => 'Texte gras',
@@ -1150,12 +1211,15 @@ Cause inconnue',
Il semble qu'elle ait été supprimée.",
'edit-conflict' => 'Conflit de modification.',
'edit-no-change' => "Votre modification a été ignorée car aucun changement n'a été fait au texte.",
+'postedit-confirmation' => 'Votre modification a été enregistrée.',
'edit-already-exists' => "La nouvelle page n'a pas pu être créée.
Elle existe déjà.",
'defaultmessagetext' => 'Message par défaut',
'content-failed-to-parse' => 'Échec de l’analyse syntaxique du contenu de $2 pour le modèle $1: $3',
'invalid-content-data' => 'Données du contenu non valides',
'content-not-allowed-here' => 'Le contenu « $1 » n’est pas autorisé sur la page [[$2]]',
+'editwarning-warning' => 'Quitter cette page vous fera perdre toutes les modifications que vous avez faites.
+Si vous êtes connecté, vous pouvez désactiver cet avertissement dans la section « Modification » de vos préférences.',
# Content models
'content-model-wikitext' => 'wikitexte',
@@ -1188,6 +1252,7 @@ Il devrait y avoir moins de $2 appel{{PLURAL:$2||s}}, alors qu'il y en a mainten
'undo-failure' => 'Cette modification ne peut pas être défaite : cela entrerait en conflit avec les modifications intermédiaires.',
'undo-norev' => "La modification n'a pas pu être défaite parce qu'elle est inexistante ou qu'elle a été supprimée.",
'undo-summary' => 'Annulation des modifications $1 de [[Special:Contributions/$2|$2]] ([[User talk:$2|discussion]])',
+'undo-summary-username-hidden' => 'Annuler la révision $1 par un utilisateur masqué',
# Account creation failure
'cantcreateaccounttitle' => 'Vous ne pouvez pas créer de compte.',
@@ -1364,6 +1429,7 @@ Assurez-vous que cette opération conservera la continuité de l'historique de l
'compareselectedversions' => 'Comparer les versions sélectionnées',
'showhideselectedversions' => 'Afficher/masquer les versions sélectionnées',
'editundo' => 'annuler',
+'diff-empty' => '(Aucune différence)',
'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}})",
'difference-missing-revision' => "{{PLURAL:$2|Une révision|$2 révisions}} de cette différence ($1) {{PLURAL:$2|n'a pas été trouvée|n'ont pas été trouvées}}.
@@ -1391,7 +1457,6 @@ Vous pouvez trouver des détails dans le [{{fullurl:{{#Special:Log}}/delete|page
'searchmenu-legend' => 'Options de recherche',
'searchmenu-exists' => "'''Il existe une page nommée « [[:$1]] » sur ce wiki'''",
'searchmenu-new' => "'''Créer la page « [[:$1|$1]] » sur ce wiki !'''",
-'searchhelp-url' => 'Help:Accueil',
'searchmenu-prefix' => '[[Special:PrefixIndex/$1|Rechercher les pages commençant par ce préfixe]]',
'searchprofile-articles' => 'Pages de contenu',
'searchprofile-project' => "Pages d'aide et de projet",
@@ -1433,15 +1498,7 @@ Essayez en utilisant le préfixe ''all:'' pour rechercher dans tout le contenu (
'powersearch-togglenone' => 'Aucune',
'search-external' => 'Recherche externe',
'searchdisabled' => 'La recherche sur {{SITENAME}} est désactivée. En attendant la réactivation, vous pouvez effectuer une recherche via Google. Attention, leur indexation du contenu de {{SITENAME}} peut ne pas être à jour.',
-
-# Quickbar
-'qbsettings' => "Barre d'outils",
-'qbsettings-none' => 'Aucune',
-'qbsettings-fixedleft' => 'Gauche',
-'qbsettings-fixedright' => 'Droite',
-'qbsettings-floatingleft' => 'Flottante à gauche',
-'qbsettings-floatingright' => 'Flottante à droite',
-'qbsettings-directionality' => "Fixe, en fonction de la directivité d'écriture de votre langue",
+'search-error' => "Une erreur s'est produite en recherchant : $1",
# Preferences page
'preferences' => 'Préférences',
@@ -1475,7 +1532,6 @@ Essayez en utilisant le préfixe ''all:'' pour rechercher dans tout le contenu (
'resetprefs' => 'Rétablir les préférences',
'restoreprefs' => 'Restaurer tous les paramètres par défaut (dans toutes les sections)',
'prefs-editing' => 'Modification',
-'prefs-edit-boxsize' => 'Taille de la fenêtre de modification.',
'rows' => 'Rangées :',
'columns' => 'Colonnes :',
'searchresultshead' => 'Filtrer avec cette valeur',
@@ -1486,9 +1542,9 @@ Essayez en utilisant le préfixe ''all:'' pour rechercher dans tout le contenu (
'recentchangesdays-max' => '(maximum $1 jour{{PLURAL:$1||s}})',
'recentchangescount' => 'Nombre de modifications à afficher par défaut :',
'prefs-help-recentchangescount' => "Ceci inclut les modifications récentes, les pages d'historiques et les journaux.",
-'prefs-help-watchlist-token' => 'Remplissez ce champ avec une valeur secrète et un flux RSS sera généré pour votre liste de suivi.
-Toute personne connaissant ce jeton pourra lire votre liste de suivi, choisissez donc une valeur sécurisée.
-Voici une valeur générée aléatoirement que vous pouvez utiliser : $1',
+'prefs-help-watchlist-token2' => 'Voici la clé secrète du flux Web de votre liste de suivi.
+Toute personne la connaissant pourra lire votre liste de suivi, ne la communiquez donc pas.
+[[Special:ResetTokens|Cliquez ici si vous devez la réinitialiser]].',
'savedprefs' => 'Les préférences ont été sauvegardées.',
'timezonelegend' => 'Fuseau horaire :',
'localtime' => 'Heure locale :',
@@ -1518,7 +1574,6 @@ Voici une valeur générée aléatoirement que vous pouvez utiliser : $1',
'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',
'youremail' => 'Courriel :',
'username' => "{{GENDER:$1|Nom d'utilisateur|Nom d'utilisatrice}} :",
'uid' => "Numéro d'{{GENDER:$1|utilisateur|utilisatrice}}:",
@@ -1552,6 +1607,8 @@ Cette information sera publique.',
'prefs-dateformat' => 'Format des dates',
'prefs-timeoffset' => 'Décalage horaire',
'prefs-advancedediting' => 'Options générales',
+'prefs-editor' => 'Éditeur',
+'prefs-preview' => 'Aperçu',
'prefs-advancedrc' => 'Options avancées',
'prefs-advancedrendering' => 'Options avancées',
'prefs-advancedsearchoptions' => 'Options avancées',
@@ -1559,7 +1616,9 @@ Cette information sera publique.',
'prefs-displayrc' => "Options d'affichage",
'prefs-displaysearchoptions' => "Options d'affichage",
'prefs-displaywatchlist' => "Options d'affichage",
+'prefs-tokenwatchlist' => 'Jeton',
'prefs-diffs' => 'Différences',
+'prefs-help-prefershttps' => 'Cette préférence sera effective lors de votre prochaine connexion.',
# User preference: email validation using jQuery
'email-address-validity-valid' => 'Semble valide',
@@ -1586,6 +1645,8 @@ Cette information sera publique.',
'userrights-notallowed' => 'Vous n’avez pas la permission d’ajouter ou supprimer des droits d’utilisateur.',
'userrights-changeable-col' => 'Les groupes que vous pouvez modifier',
'userrights-unchangeable-col' => 'Les groupes que vous ne pouvez pas modifier',
+'userrights-conflict' => 'Conflit de modification de droits utilisateur ! Veuillez relire et confirmer vos modifications.',
+'userrights-removed-self' => 'Vous avez bien supprimé vos propres droits. Du coup, vous ne pouvez plus accéder à cette page.',
# Groups
'group' => 'Groupe :',
@@ -1651,11 +1712,19 @@ Cette information sera publique.',
'right-proxyunbannable' => 'Ne pas être affecté par les blocages automatiques de serveurs mandataires',
'right-unblockself' => 'Se débloquer soi-même',
'right-protect' => 'Modifier les niveaux de protection et modifier les pages protégées en cascade',
-'right-editprotected' => 'Modifier les pages protégées (sans protection en cascade)',
+'right-editprotected' => 'Modifier les pages protégées avec « {{int:protect-level-sysop}} »',
+'right-editsemiprotected' => 'Modifier les pages protégées avec « {{int:protect-level-autoconfirmed}} »',
'right-editinterface' => "Modifier l'interface utilisateur",
'right-editusercssjs' => "Modifier les fichiers CSS et JavaScript d'autres utilisateurs",
'right-editusercss' => "Modifier les fichiers CSS d'autres utilisateurs",
'right-edituserjs' => "Modifier les fichiers JavaScript d'autres utilisateurs",
+'right-editmyusercss' => 'Modifier vos propres fichiers CSS utilisateur',
+'right-editmyuserjs' => 'Modifier vos propres fichiers JavaScript utilisateur',
+'right-viewmywatchlist' => 'Afficher votre propre liste de suivi',
+'right-editmywatchlist' => 'Modifier votre propre liste de suivi. Remarquez que certaines actions ajouteront encore des pages sans ce droit.',
+'right-viewmyprivateinfo' => 'Voir vos données personnelles (exemple adresse, vrai nom)',
+'right-editmyprivateinfo' => 'Modifier vos données personnelles (exemple adresse, vrai nom)',
+'right-editmyoptions' => 'Modifier vos préférences',
'right-rollback' => "Révoquer rapidement les modifications du dernier contributeur d'une page particulière",
'right-markbotedits' => 'Marquer des modifications révoquées comme ayant été faites par un robot.',
'right-noratelimit' => 'Ne pas être affecté par les limites de taux',
@@ -1717,12 +1786,19 @@ Cette information sera publique.',
'action-userrights-interwiki' => "modifier les droits des utilisateurs sur d'autres wikis",
'action-siteadmin' => 'verrouiller ou déverrouiller la base de données',
'action-sendemail' => 'envoyer des courriels',
+'action-editmywatchlist' => 'modifier votre liste de suivi',
+'action-viewmywatchlist' => 'afficher votre liste de suivi',
+'action-viewmyprivateinfo' => 'voir vos informations personnelles',
+'action-editmyprivateinfo' => 'modifier vos informations personnelles',
# Recent changes
'nchanges' => '$1 modification{{PLURAL:$1||s}}',
+'enhancedrc-since-last-visit' => '$1 {{PLURAL:$1|depuis la dernière visite}}',
+'enhancedrc-history' => 'historique',
'recentchanges' => 'Modifications récentes',
'recentchanges-legend' => 'Options des modifications récentes',
'recentchanges-summary' => 'Piste les changements les plus récents du wiki sur cette page.',
+'recentchanges-noresult' => 'Aucune modification correspondant à ces critères sur la période indiquée.',
'recentchanges-feed-description' => 'Suivre les dernières modifications de ce wiki dans un flux.',
'recentchanges-label-newpage' => 'Cette modification a créé une nouvelle page',
'recentchanges-label-minor' => 'Cette modification est mineure',
@@ -1759,7 +1835,6 @@ Cette information sera publique.',
'recentchangeslinked-feed' => 'Suivi des pages liées',
'recentchangeslinked-toolbox' => 'Suivi des pages liées',
'recentchangeslinked-title' => 'Suivi des pages associées à « $1 »',
-'recentchangeslinked-noresult' => "Il n'y a pas de modification des pages liées pendant la période choisie.",
'recentchangeslinked-summary' => "Cette page spéciale montre les modifications récentes sur les pages qui sont liées. Les pages de votre liste de suivi sont '''en gras'''.",
'recentchangeslinked-page' => 'Nom de la page :',
'recentchangeslinked-to' => "Afficher les modifications des pages qui comportent un lien vers la page donnée plutôt que l'inverse",
@@ -1770,7 +1845,7 @@ Cette information sera publique.',
'reuploaddesc' => "Annuler et retourner au formulaire d'import",
'upload-tryagain' => 'Envoyer la description du fichier modifiée',
'uploadnologin' => 'Non connecté(e)',
-'uploadnologintext' => 'Vous devez être [[Special:UserLogin|connecté]] pour importer des fichiers.',
+'uploadnologintext' => 'Vous devez $1 pour importer des fichiers.',
'upload_directory_missing' => "Le répertoire d'import de fichier ($1) est introuvable et n'a pas pu être créé par le serveur web.",
'upload_directory_read_only' => "Le répertoire d'import de fichier ($1) n'est pas accessible en écriture depuis le serveur web.",
'uploaderror' => "Erreur lors de l'import",
@@ -2000,7 +2075,6 @@ Pour une sécurité optimale, img_auth.php est désactivé.",
'http-read-error' => 'Erreur de lecture HTTP.',
'http-timed-out' => 'La requête HTTP a expiré.',
'http-curl-error' => "Erreur lors de la récupération de l'URL : $1",
-'http-host-unreachable' => "Impossible d'atteindre l'URL.",
'http-bad-status' => 'Il y a eu un problème lors de la requête HTTP : $1 $2',
# Some likely curl errors. More could be added from <http://curl.haxx.se/libcurl/c/libcurl-errors.html>
@@ -2028,6 +2102,10 @@ Pour une sécurité optimale, img_auth.php est désactivé.",
'listfiles_size' => 'Taille',
'listfiles_description' => 'Description',
'listfiles_count' => 'Versions',
+'listfiles-show-all' => 'Inclure les anciennes versions des images',
+'listfiles-latestversion' => 'Version actuelle',
+'listfiles-latestversion-yes' => 'Oui',
+'listfiles-latestversion-no' => 'Non',
# File description page
'file-anchor-link' => 'Fichier',
@@ -2126,6 +2204,13 @@ N'oubliez pas de vérifier s'il n'y a pas d'autres liens vers les modèles avant
'randompage' => 'Page au hasard',
'randompage-nopages' => "Il n'y a aucune page dans {{PLURAL:$2|l'espace de noms|les espaces de noms}} : $1.",
+# Random page in category
+'randomincategory' => 'Page au hasard dans la catégorie',
+'randomincategory-invalidcategory' => '« $1 » n’est pas un nom de catégorie valide.',
+'randomincategory-nopages' => 'Il n’y a pas de page dans [[:Category:$1]].',
+'randomincategory-selectcategory' => 'Prendre une page au hasard dans la catégorie : $1 $2.',
+'randomincategory-selectcategory-submit' => 'Aller',
+
# Random redirect
'randomredirect' => 'Page de redirection au hasard',
'randomredirect-nopages' => "Il n'y a aucune page de redirection dans l'espace de noms « $1 ».",
@@ -2151,17 +2236,13 @@ N'oubliez pas de vérifier s'il n'y a pas d'autres liens vers les modèles avant
'statistics-users-active-desc' => 'Utilisateurs ayant fait au moins une action durant {{PLURAL:$1|le dernier jours|les $1 derniers jours}}',
'statistics-mostpopular' => 'Pages les plus consultées',
-'disambiguations' => "Pages ayant des liens vers des pages d'homonymie",
-'disambiguationspage' => 'Template:Homonymie',
-'disambiguations-text' => "Les pages suivantes comportent au moins un lien vers une '''page d'homonymie'''.
-Elles devraient plutôt pointer vers le bon article.<br />
-Une page est considérée comme une page d'homonymie si elle utilise un modèle lié à [[MediaWiki:Disambiguationspage]]",
-
'pageswithprop' => 'Pages avec une propriété de page',
'pageswithprop-legend' => 'Pages avec une propriété de page',
'pageswithprop-text' => 'Cette page liste les pages qui utilisent une propriété de page particulière.',
'pageswithprop-prop' => 'Nom de la propriété:',
'pageswithprop-submit' => 'Aller',
+'pageswithprop-prophidden-long' => 'valeur de propriété de texte long masquée ($1)',
+'pageswithprop-prophidden-binary' => 'valeur de propriété binaire masquée ($1)',
'doubleredirects' => 'Doubles redirections',
'doubleredirectstext' => 'Voici une liste des pages qui redirigent vers des pages qui sont elles-mêmes des pages de redirection.
@@ -2219,6 +2300,7 @@ Les entrées <del>barrées</del> ont été résolues.',
'mostrevisions' => 'Pages les plus modifiées',
'prefixindex' => 'Toutes les pages commençant par…',
'prefixindex-namespace' => 'Toutes les pages avec préfixe (espace de noms $1)',
+'prefixindex-strip' => 'Enlever le préfixe dans la liste',
'shortpages' => 'Pages courtes',
'longpages' => 'Pages longues',
'deadendpages' => 'Pages en impasse',
@@ -2234,6 +2316,7 @@ Les entrées <del>barrées</del> ont été résolues.',
'listusers' => 'Liste des utilisateurs',
'listusers-editsonly' => 'Ne montrer que les utilisateurs ayant au moins une contribution',
'listusers-creationsort' => 'Trier par date de création',
+'listusers-desc' => 'Trier en ordre descendant',
'usereditcount' => '$1 modification{{PLURAL:$1||s}}',
'usercreated' => '{{GENDER:$3|Créé}} le $1 à $2',
'newpages' => 'Nouvelles pages',
@@ -2411,10 +2494,9 @@ Les prochaines modifications de cette page et de la page de discussion associée
'unwatchthispage' => 'Ne plus suivre',
'notanarticle' => "Ce n'est pas une page de contenu",
'notvisiblerev' => 'La version a été supprimée',
-'watchnochange' => "Aucun des éléments que vous suivez n'a été modifié durant la période affichée.",
'watchlist-details' => 'Votre liste de suivi référence $1 page{{PLURAL:$1||s}}, sans compter les pages de discussion.',
-'wlheader-enotif' => '* La notification par courriel est activée.',
-'wlheader-showupdated' => "* Les pages qui ont été modifiées depuis votre dernière visite sont affichées en '''gras'''.",
+'wlheader-enotif' => 'La notification par courriel est activée.',
+'wlheader-showupdated' => "Les pages qui ont été modifiées depuis votre dernière visite sont affichées en '''gras'''.",
'watchmethod-recent' => 'vérification des modifications récentes pour y trouver des pages suivies',
'watchmethod-list' => 'vérification des pages suivies pour y trouver des modifications récentes',
'watchlistcontains' => 'Votre liste de suivi référence $1 page{{PLURAL:$1||s}}.',
@@ -2668,7 +2750,7 @@ $1',
'contributions' => 'Contributions de l’{{GENDER:$1|utilisateur|utilisatrice}}',
'contributions-title' => 'Liste des contributions de l’utilisat{{GENDER:$1|eur|rice|eur}} $1',
'mycontris' => 'Contributions',
-'contribsub2' => 'Pour $1 ($2)',
+'contribsub2' => 'Pour {{GENDER:$3|$1}} ($2)',
'nocontribs' => "Aucune modification correspondant à ces critères n'a été trouvée.",
'uctop' => '(actuel)',
'month' => 'À partir du mois (et précédents) :',
@@ -2825,15 +2907,13 @@ Il est possible qu'un déblocage ait déjà été effectué.",
Elle fait cependant partie de la plage $2 qui, elle, peut être débloquée.",
'ip_range_invalid' => 'Plage IP incorrecte.',
'ip_range_toolarge' => 'Les blocages de plages plus grandes que /$1 ne sont pas autorisées.',
-'blockme' => 'Bloquez-moi',
'proxyblocker' => 'Bloqueur de mandataires',
-'proxyblocker-disabled' => 'Cette fonction est désactivée.',
'proxyblockreason' => "Votre adresse IP a été bloquée car il s'agit d'un mandataire ouvert.
Veuillez contacter votre fournisseur d'accès Internet ou votre support technique et l'informer de ce sérieux problème de sécurité.",
-'proxyblocksuccess' => 'Fait.',
'sorbsreason' => 'Votre adresse IP est listée comme mandataire ouvert dans le DNSBL utilisé par {{SITENAME}}.',
'sorbs_create_account_reason' => 'Votre adresse IP est listée comme mandataire ouvert dans le DNSBL utilisé par {{SITENAME}}.
Vous ne pouvez pas créer un compte.',
+'xffblockreason' => "Une adresse IP dans l'en-tête X-Forwarded-For, soit la vôtre ou celle d'un serveur proxy que vous utilisez, a été bloquée. La raison du blocage initial est : $1",
'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é",
@@ -2989,6 +3069,8 @@ Veuillez visiter la [//www.mediawiki.org/wiki/Localisation Localisation de Media
'thumbnail-more' => 'Agrandir',
'filemissing' => 'Fichier manquant',
'thumbnail_error' => 'Erreur lors de la création de la miniature : $1',
+'thumbnail_error_remote' => "Message d'erreur de $1 :
+$2",
'djvu_page_error' => 'Page DjVu hors limites',
'djvu_no_xml' => 'Impossible de récupérer le XML pour le fichier DjVu',
'thumbnail-temp-create' => 'Impossible de créer le fichier de vignette temporaire',
@@ -3139,20 +3221,15 @@ Vous pouvez toutefois en visualiser la source.',
'tooltip-undo' => '« Annuler » rétablit la modification précédente et ouvre la fenêtre de modification en mode prévisualisation. Il est possible d’ajouter une raison dans le résumé.',
'tooltip-preferences-save' => 'Sauvegarder les préférences',
'tooltip-summary' => 'Entrez un bref résumé',
+'tooltip-iwiki' => '$1 — $2',
# Stylesheets
'common.css' => '/* Le CSS placé ici sera appliqué à tous les habillages. */',
-'standard.css' => '/* Le CSS placé ici affectera les utilisateurs de l’habillage Standard. */',
-'nostalgia.css' => '/* Le CSS placé ici affectera les utilisateurs de l’habillage Nostalgia. */',
'cologneblue.css' => '/* Le CSS placé ici affectera les utilisateurs de l’habillage Cologne Blue. */',
'monobook.css' => '/* Le CSS placé ici affectera les utilisateurs de l’habillage Monobook. */',
-'myskin.css' => '/* Le CSS placé ici affectera les utilisateurs de l’habillage MySkin. */',
-'chick.css' => '/* Le CSS placé ici affectera les utilisateurs de l’habillage Chick. */',
-'simple.css' => '/* Le CSS placé ici affectera les utilisateurs de l’habillage Simple. */',
'modern.css' => '/* Le CSS placé ici affectera les utilisateurs de l’habillage Modern. */',
'vector.css' => '/* Le CSS placé ici affectera les utilisateurs de l’habillage Vector. */',
'print.css' => '/* Le CSS placé ici affectera les impressions */',
-'handheld.css' => '/* Le CSS placé ici affectera les appareils mobiles en fonction de l\'habillage configuré $wgHandheldStyle */',
'noscript.css' => '/* Le CSS placé ici affectera les utilisateurs ayant désactivé Javascript. */',
'group-autoconfirmed.css' => '/* Le CSS placé ici affectera les utilisateurs auto-confirmés seulement. */',
'group-bot.css' => '/* Le CSS placé ici affectera les robots seulement. */',
@@ -3161,13 +3238,8 @@ Vous pouvez toutefois en visualiser la source.',
# Scripts
'common.js' => '/* Tout JavaScript ici sera chargé avec chaque page accédée par n’importe quel utilisateur. */',
-'standard.js' => '/* Tout JavaScript ici sera chargé avec les pages accédées par les utilisateurs de l’habillage Standard uniquement */',
-'nostalgia.js' => '/* Tout JavaScript ici sera chargé avec les pages accédées par les utilisateurs de l’habillage Nostalgie uniquement */',
'cologneblue.js' => '/* Tout JavaScript ici sera chargé avec les pages accédées par les utilisateurs de l’habillage Bleu de cologne uniquement */',
'monobook.js' => '/* Tout JavaScript ici sera chargé avec les pages accédées par les utilisateurs de l’habillage MonoBook uniquement. */',
-'myskin.js' => '/* Tout JavaScript ici sera chargé avec les pages accédées par les utilisateurs de l’habillage Mon habillage uniquement */',
-'chick.js' => '/* Tout JavaScript ici sera chargé avec les pages accédées par les utilisateurs de l’habillage Poussin uniquement */',
-'simple.js' => '/* Tout JavaScript ici sera chargé avec les pages accédées par les utilisateurs de l’habillage Simple uniquement */',
'modern.js' => '/* Tout JavaScript ici sera chargé avec les pages accédées par les utilisateurs de l’habillage Moderne uniquement */',
'vector.js' => '/* Tout code JavaScript placé ici sera chargé pour les utilisateurs de l’habillage Vector */',
'group-autoconfirmed.js' => '/* Le JavaScript inclus ici n’affectera que les utilisateurs auto-confirmés */',
@@ -3246,13 +3318,8 @@ Vous pouvez toutefois en visualiser la source.',
'pageinfo-category-files' => 'Nombre de fichiers',
# Skin names
-'skinname-standard' => 'Standard',
-'skinname-nostalgia' => 'Nostalgie',
'skinname-cologneblue' => 'Bleu de Cologne',
'skinname-monobook' => 'Monobook',
-'skinname-myskin' => 'Mon Interface',
-'skinname-chick' => 'Poussin',
-'skinname-simple' => 'Simple',
'skinname-modern' => 'Moderne',
'skinname-vector' => 'Vector',
@@ -3332,11 +3399,25 @@ Si vous l'exécutez, votre système peut être compromis.",
'minutes' => '{{PLURAL:$1|$1 minute|$1 minutes}}',
'hours' => '{{PLURAL:$1|$1 heure|$1 heures}}',
'days' => '{{PLURAL:$1|$1 jour|$1 jours}}',
+'weeks' => '{{PLURAL:$1|$1 semaine|$1 semaines}}',
'months' => '{{PLURAL:$1|$1 mois}}',
'years' => '{{PLURAL:$1|$1 an|$1 ans}}',
'ago' => 'Il y a $1',
'just-now' => "à l'instant",
+# Human-readable timestamps
+'hours-ago' => 'il y a $1 {{PLURAL:$1|heure|heures}}',
+'minutes-ago' => 'il y a $1 {{PLURAL:$1|minute|minutes}}',
+'seconds-ago' => 'il y a $1 {{PLURAL:$1|seconde|secondes}}',
+'monday-at' => 'Lundi à $1',
+'tuesday-at' => 'Mardi à $1',
+'wednesday-at' => 'Mercredi à $1',
+'thursday-at' => 'Jeudi à $1',
+'friday-at' => 'Vendredi à $1',
+'saturday-at' => 'Samedi à $1',
+'sunday-at' => 'Dimanche à $1',
+'yesterday-at' => 'Hier à $1',
+
# Bad image list
'bad_image_list' => 'Le format est le suivant :
@@ -3364,7 +3445,7 @@ Les autres liens sur la même ligne sont considérés comme des exceptions, par
* gpsaltitude",
'metadata-langitem' => "'''$2&nbsp;:''' $1",
-# EXIF tags
+# Exif tags
'exif-imagewidth' => 'Largeur',
'exif-imagelength' => 'Hauteur',
'exif-bitspersample' => 'Bits par composante',
@@ -3542,7 +3623,7 @@ Les autres liens sur la même ligne sont considérés comme des exceptions, par
'exif-originalimageheight' => "Hauteur de l'image avant qu'elle ait été recadrée",
'exif-originalimagewidth' => "Largeur de l'image avant qu'elle ait été recadrée",
-# EXIF attributes
+# Exif attributes
'exif-compression-1' => 'Non compressé',
'exif-compression-2' => 'CCITT Groupe 3 Longueur du codage Huffman modifié de dimension 1',
'exif-compression-3' => 'CCITT Groupe 3 codage du fax',
@@ -3869,7 +3950,6 @@ Veuillez confirmer que vous désirez réellement recréer cette page.",
# Separators for various lists, etc.
'semicolon-separator' => '&nbsp;;&#32;',
'colon-separator' => '&nbsp;:&#32;',
-'autocomment-prefix' => '&#32;–&#32;',
'percent' => '$1&#160;%',
# Multipage image navigation
@@ -4017,7 +4097,6 @@ Vous pouvez aussi [[Special:EditWatchlist|utiliser l'éditeur normal]].",
'version-other' => 'Divers',
'version-mediahandlers' => 'Manipulateurs de médias',
'version-hooks' => 'Greffons',
-'version-extension-functions' => "Fonctions d'extension internes",
'version-parser-extensiontags' => "Balises étendues de l'analyseur syntaxique",
'version-parser-function-hooks' => "Fonctions étendues de l'analyseur syntaxique",
'version-hook-name' => 'Nom du greffon',
@@ -4026,6 +4105,7 @@ Vous pouvez aussi [[Special:EditWatchlist|utiliser l'éditeur normal]].",
'version-license' => 'Licence',
'version-poweredby-credits' => "Ce wiki fonctionne grâce à '''[//www.mediawiki.org/ MediaWiki]''', copyright © 2001-$1 $2.",
'version-poweredby-others' => 'autres',
+'version-poweredby-translators' => 'traducteurs de translatewiki.net',
'version-credits-summary' => 'Nous tenons à remercier les personnes suivantes pour leur contribution à [[Special:Version|MediaWiki]].',
'version-license-info' => "MediaWiki est un logiciel libre, vous pouvez le redistribuer 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.
@@ -4041,12 +4121,17 @@ Vous devriez avoir reçu [{{SERVER}}{{SCRIPTPATH}}/COPYING une copie de la Licen
'version-entrypoints-articlepath' => '[https://www.mediawiki.org/wiki/Manual:$wgArticlePath Chemin d’article]',
'version-entrypoints-scriptpath' => '[https://www.mediawiki.org/wiki/Manual:$wgScriptPath Chemin de script]',
-# Special:FilePath
-'filepath' => "Chemin d'accès du fichier",
-'filepath-page' => 'Fichier :',
-'filepath-submit' => 'Aller',
-'filepath-summary' => "Cette page spéciale retourne le chemin d'accès complet d'un fichier.
-Les images sont montrées dans leur pleine résolution, les autres fichiers sont chargés et démarrés directement avec leur programme associé.",
+# Special:Redirect
+'redirect' => 'Redirigé par fichier, utilisateur, ou ID de révision',
+'redirect-legend' => 'Rediriger vers une page ou un fichier',
+'redirect-summary' => "Cette page spéciale redirige vers un fichier (nom donné au fichier), une page (ID attribuée à la révision) ou une page d'utilisateur (identifiant numérique attribué à l'utilisateur).",
+'redirect-submit' => 'Valider',
+'redirect-lookup' => 'Recherche :',
+'redirect-value' => 'Valeur :',
+'redirect-user' => "ID de l'utilisateur",
+'redirect-revision' => 'Révision de la page',
+'redirect-file' => 'Nom du fichier',
+'redirect-not-exists' => 'Valeur non trouvée',
# Special:FileDuplicateSearch
'fileduplicatesearch' => 'Recherche de doublons',
@@ -4096,12 +4181,16 @@ Les images sont montrées dans leur pleine résolution, les autres fichiers sont
'tags' => 'Balises des modifications valides',
'tag-filter' => 'Filtrer les [[Special:Tags|balises]] :',
'tag-filter-submit' => 'Filtrer',
+'tag-list-wrapper' => '([[Special:Tags|{{PLURAL:$1|Balise|Balises}}]] : $2)',
'tags-title' => 'Balises',
'tags-intro' => 'Cette page liste les balises que le logiciel peut utiliser pour marquer une modification et la signification de chacune.',
'tags-tag' => 'Nom de la balise',
'tags-display-header' => 'Apparence dans les listes de modifications',
'tags-description-header' => 'Description complète de la balise',
+'tags-active-header' => 'Actif ?',
'tags-hitcount-header' => 'Modifications balisées',
+'tags-active-yes' => 'Oui',
+'tags-active-no' => 'Non',
'tags-edit' => 'modifier',
'tags-hitcount' => '$1 modification{{PLURAL:$1||s}}',
@@ -4122,6 +4211,7 @@ Les images sont montrées dans leur pleine résolution, les autres fichiers sont
'dberr-problems' => 'Désolé ! Ce site rencontre des difficultés techniques.',
'dberr-again' => "Essayez d'attendre quelques minutes et rechargez.",
'dberr-info' => '(Connexion au serveur de base de données impossible : $1)',
+'dberr-info-hidden' => '(Connexion au serveur de base de données impossible)',
'dberr-usegoogle' => 'Vous pouvez essayer de chercher avec Google pendant ce temps.',
'dberr-outofdate' => 'Notez que leurs index de notre contenu peuvent être dépassés.',
'dberr-cachederror' => 'Ceci est une copie cachée de la page demandée et peut être dépassée.',
@@ -4137,6 +4227,9 @@ Les images sont montrées dans leur pleine résolution, les autres fichiers sont
'htmlform-submit' => 'Soumettre',
'htmlform-reset' => 'Défaire les modifications',
'htmlform-selectorother-other' => 'Autre',
+'htmlform-no' => 'Non',
+'htmlform-yes' => 'Oui',
+'htmlform-chosen-placeholder' => 'Choisir une option',
# SQLite database support
'sqlite-has-fts' => '$1 avec recherche en texte intégral supportée',
@@ -4254,4 +4347,19 @@ Sinon, vous pouvez utiliser le formulaire simplifié ci-dessous. Votre commentai
# Image rotation
'rotate-comment' => "Image pivotée de $1 {{PLURAL:$1|degré|degrés}} dans le sens des aiguilles d'une montre",
+# Limit report
+'limitreport-title' => 'Données d’optimisation de l’analyseur :',
+'limitreport-cputime' => 'Temps CPU d’utilisation',
+'limitreport-cputime-value' => '$1 {{PLURAL:$1|seconde|secondes}}',
+'limitreport-walltime' => 'Temps réel d’utilisation',
+'limitreport-walltime-value' => '$1 {{PLURAL:$1|seconde|secondes}}',
+'limitreport-ppvisitednodes' => 'Nombre de nœuds de préprocesseur visités',
+'limitreport-ppgeneratednodes' => 'Nombre de nœuds de préprocesseur générés',
+'limitreport-postexpandincludesize' => 'Taille d’inclusion après expansion',
+'limitreport-postexpandincludesize-value' => '$1/$2 {{PLURAL:$2|octet|octets}}',
+'limitreport-templateargumentsize' => 'Taille de l’argument du modèle',
+'limitreport-templateargumentsize-value' => '$1/$2 {{PLURAL:$2|octet|octets}}',
+'limitreport-expansiondepth' => 'Plus grande profondeur d’expansion',
+'limitreport-expensivefunctioncount' => 'Nombre de fonctions d’analyse coûteuses',
+
);
diff --git a/languages/messages/MessagesFrc.php b/languages/messages/MessagesFrc.php
index c40e7e79..03e022f2 100644
--- a/languages/messages/MessagesFrc.php
+++ b/languages/messages/MessagesFrc.php
@@ -49,8 +49,6 @@ $messages = array(
'tog-shownumberswatching' => 'Montrer le montant de guetteurs',
'tog-oldsig' => '↓ Preview du signature existant:',
'tog-fancysig' => 'Signature brute (sans liens préparés)',
-'tog-externaleditor' => 'Utiliser par défaut un éditeur de texte externe (pour les utilisateurs avancés, nécessite des réglages spécifiques sur votre ordinateur)',
-'tog-externaldiff' => 'User un autre comparateur comme réglage ordinaire',
'tog-showjumplinks' => 'Mettre les "liens vites" en haut de la page',
'tog-uselivepreview' => "User la vue d'avance vite (JavaScript) (En assai)",
'tog-forceeditsummary' => "M'avertir quand j'ai laissé la boëte de commentaires vide",
diff --git a/languages/messages/MessagesFrp.php b/languages/messages/MessagesFrp.php
index 5ec69652..7c5a5cb0 100644
--- a/languages/messages/MessagesFrp.php
+++ b/languages/messages/MessagesFrp.php
@@ -338,9 +338,6 @@ $messages = array(
'tog-shownumberswatching' => 'Montrar lo nombro d’utilisators que siuvont na pâge',
'tog-oldsig' => 'Signatura ègzistenta :',
'tog-fancysig' => 'Trètar la signatura coment de vouiquitèxto (sen lim ôtomatico)',
-'tog-externaleditor' => 'Empleyér per dèfôt un changior de tèxto de defôr (solament por los utilisators avanciês, at fôta d’una configuracion spèciâla sur voutron ordenator. [//www.mediawiki.org/wiki/Manual:External_editors Més d’enformacions.])',
-'tog-externaldiff' => 'Empleyér per dèfôt un comparator de defôr (solament por los utilisators avanciês, at fôta d’una configuracion spèciâla sur voutron ordenator. [//www.mediawiki.org/wiki/Manual:External_editors Més d’enformacions.])',
-'tog-showjumplinks' => 'Activar los lims d’accèssibilitât « {{int:jumpto}} »',
'tog-uselivepreview' => 'Empleyér l’apèrçu rapido (at fôta de JavaScript) (èxpèrimentâl)',
'tog-forceeditsummary' => 'Mè balyér na semonce quand j’é pas buchiê de rèsumâ de changement',
'tog-watchlisthideown' => 'Cachiér los mins changements dedens la lista de siuvu',
@@ -354,6 +351,7 @@ $messages = array(
'tog-showhiddencats' => 'Montrar les catègories cachiêes',
'tog-noconvertlink' => 'Dèsactivar la convèrsion des titros des lims',
'tog-norollbackdiff' => 'Pas fâre vêre la dif pendent na rèvocacion',
+'tog-useeditwarning' => 'M’avèrtir quand quito una pâge de changement sen sôvar los changements',
'underline-always' => 'Tojorn',
'underline-never' => 'Jamés',
@@ -417,6 +415,18 @@ $messages = array(
'oct' => 'oct',
'nov' => 'nov',
'dec' => 'dèc',
+'january-date' => '$1 de janviér',
+'february-date' => '$1 de fevriér',
+'march-date' => '$1 de mârs',
+'april-date' => '$1 d’avril',
+'may-date' => '$1 de mê',
+'june-date' => '$1 de jouen',
+'july-date' => '$1 de julyèt',
+'august-date' => '$1 d’oût',
+'september-date' => '$1 de septembro',
+'october-date' => '$1 d’octobro',
+'november-date' => '$1 de novembro',
+'december-date' => '$1 de dècembro',
# Categories related messages
'pagecategories' => 'Catègorie{{PLURAL:$1||s}}',
@@ -498,6 +508,7 @@ $messages = array(
'create-this-page' => 'Fâre cela pâge',
'delete' => 'Suprimar',
'deletethispage' => 'Suprimar ceta pâge',
+'undeletethispage' => 'Refâre cela pâge',
'undelete_short' => 'Refâre {{PLURAL:$1|un changement|$1 changements}}',
'viewdeleted_short' => 'Vêre {{PLURAL:$1|un changement suprimâ|$1 changements suprimâs}}',
'protect' => 'Protègiér',
@@ -541,7 +552,7 @@ $1',
'pool-queuefull' => 'La renche d’ôvra est plêna',
'pool-errorunknown' => 'Fôta 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).
+# 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).
'aboutsite' => 'Sur {{SITENAME}}',
'aboutpage' => 'Project:A propôs',
'copyright' => 'Lo contegnu est disponiblo desot licence $1.',
@@ -551,7 +562,6 @@ $1',
'disclaimers' => 'Semonces',
'disclaimerpage' => 'Project:Semonces g·ènèrales',
'edithelp' => 'Éde',
-'edithelppage' => 'Help:Coment changiér na pâge',
'helppage' => 'Help:Somèro',
'mainpage' => 'Reçua',
'mainpage-description' => 'Reçua',
@@ -629,17 +639,6 @@ Na lista de les pâges spèciâles justes sè trôve dessus [[Special:SpecialPag
# General errors
'error' => 'Fôta',
'databaseerror' => 'Fôta de la bâsa de balyês',
-'dberrortext' => 'Na fôta de sintaxa de la demanda dens la bâsa de balyês est arrevâye.
-Cen pôt endicar na cofierie dedens la programeria.
-La dèrriére demanda trètâye per la bâsa de balyês ére :
-<blockquote><code>$1</code></blockquote>
-dês la fonccion « <code>$2</code> ».
-La bâsa de balyês at retornâ la fôta « <samp>$3 : $4</samp> ».',
-'dberrortextcl' => 'Na fôta de sintaxa de la demanda dens la bâsa de balyês est arrevâye.
-La dèrriére demanda trètâye per la bâsa de balyês ére :
-« $1 »
-dês la fonccion « $2 ».
-La bâsa de balyês at retornâ la fôta « $3 : $4 ».',
'laggedslavemode' => "'''Atencion :''' cela pâge pôt pas contegnir tôs los dèrriérs changements fêts.",
'readonly' => 'Bâsa de balyês vèrrolyêe',
'enterlockreason' => 'Buchiéd na rêson du vèrroly et pués un’èstimacion de la sina durâ',
@@ -696,12 +695,15 @@ Por apondre ou ben changiér des traduccions sur tôs los vouiquis, se vos plét
'editinginterface' => "'''Atencion :''' vos éte aprés changiér na pâge empleyêe por fâre lo tèxto d’entèrface de la programeria.
Los changements sè cognetront sur l’aparence de l’entèrface utilisator por los ôtros utilisators de ceti vouiqui.
Por apondre ou ben changiér des traduccions sur tôs los vouiquis, se vos plét empleyéd [//translatewiki.net/ translatewiki.net], lo projèt de localisacion de MediaWiki.",
-'sqlhidden' => '(Demanda SQL cachiêe)',
'cascadeprotected' => 'Cela pâge-que est protègiêe, el est entrebetâye dedens {{PLURAL:$1|ceta pâge qu’est étâye protègiêe|cetes pâges que sont étâyes protègiêes}} avouéc lo chouèx « protèccion en cascâda » activâ :
$2',
'namespaceprotected' => "Vos éd pas la pèrmission de changiér les pâges de l’èspâço de noms « '''$1''' ».",
'customcssprotected' => 'Vos éd pas la pèrmission de changiér cela pâge CSS, contint la configuracion a sè d’un ôtr’utilisator.',
'customjsprotected' => 'Vos éd pas la pèrmission de changiér cela pâge JavaScript, contint la configuracion a sè d’un ôtr’utilisator.',
+'mycustomcssprotected' => 'Vos éd pas la pèrmission de changiér cela pâge CSS.',
+'mycustomjsprotected' => 'Vos éd pas la pèrmission de changiér cela pâge JavaScript.',
+'myprivateinfoprotected' => 'Vos éd pas la pèrmission de changiér voutres enformacions a sè.',
+'mypreferencesprotected' => 'Vos éd pas la pèrmission de changiér voutres prèferences.',
'ns-specialprotected' => 'Les pâges spèciâles pôvont pas étre changiêes.',
'titleprotected' => "Cél titro est étâ protègiê a la crèacion per [[User:$1|$1]].
La rêson balyêe est « ''$2'' ».",
@@ -727,10 +729,19 @@ Notâd qu’y at des pâges que pôvont étre oncor fêtes vêre coment se vos Ã
'welcomecreation-msg' => 'Voutron compto est étâ fêt.
Oubliâd pas de changiér voutres [[Special:Preferences|prèferences dessus {{SITENAME}}]].',
'yourname' => 'Nom d’utilisator :',
+'userlogin-yourname' => 'Nom d’utilisator',
+'userlogin-yourname-ph' => 'Buchiéd voutron nom d’utilisator',
+'createacct-another-username-ph' => 'Buchiéd lo nom d’utilisator',
'yourpassword' => 'Contresegno :',
+'userlogin-yourpassword' => 'Contresegno',
+'userlogin-yourpassword-ph' => 'Buchiéd voutron contresegno',
+'createacct-yourpassword-ph' => 'Buchiéd un contresegno',
'yourpasswordagain' => 'Confirmâd lo contresegno :',
+'createacct-yourpasswordagain' => 'Confirmâd lo contresegno',
+'createacct-yourpasswordagain-ph' => 'Tornâd buchiér lo contresegno',
'remembermypassword' => 'Sè rapelar de mon contresegno sur ceti navigator (por lo més $1 jorn{{PLURAL:$1||s}})',
-'securelogin-stick-https' => 'Réstar branchiê en HTTPS aprés lo branchement',
+'userlogin-remembermypassword' => 'Gouardar ma sèance activa',
+'userlogin-signwithsecure' => 'Empleyér un branchement sècurisâ',
'yourdomainname' => 'Voutron domêno :',
'password-change-forbidden' => 'Vos pouede pas changiér los contresegnos sur ceti vouiqui.',
'externaldberror' => 'Ou ben na fôta est arrevâye avouéc la bâsa de balyês d’ôtentificacion de defôr ou ben vos éte pas ôtorisâ{{GENDER:||ye|(ye)}} a betar a jorn voutron compto de defôr.',
@@ -742,18 +753,41 @@ Oubliâd pas de changiér voutres [[Special:Preferences|prèferences dessus {{SI
'logout' => 'Sè dèbranchiér',
'userlogout' => 'Dèbranchement',
'notloggedin' => 'Pas branchiê',
+'userlogin-noaccount' => 'Vos éd p’oncor un compto ?',
+'userlogin-joinproject' => 'Rejuegnéd {{SITENAME}}',
'nologin' => "Vos éd p’oncor un compto ? '''$1.'''",
'nologinlink' => 'Féte un compto',
'createaccount' => 'Fâre un compto',
'gotaccount' => "Vos éd ja un compto ? '''$1.'''",
'gotaccountlink' => 'Branchiéd-vos',
'userlogin-resetlink' => 'Vos éd oubliâ voutros dètalys de branchement ?',
+'userlogin-resetpassword-link' => 'Rebetar a zérô lo contresegno',
+'helplogin-url' => 'Help:Branchement',
+'userlogin-helplink' => '[[{{MediaWiki:helplogin-url}}|Éde u branchement]]',
+'createacct-join' => 'Buchiéd voutres enformacions ce-desot.',
+'createacct-another-join' => 'Buchiéd les enformacions sur lo compto novél ce-desot.',
+'createacct-emailrequired' => 'Adrèce èlèctronica',
+'createacct-emailoptional' => 'Adrèce èlèctronica (u chouèx)',
+'createacct-email-ph' => 'Buchiéd voutron adrèce èlèctronica',
+'createacct-another-email-ph' => 'Buchiéd l’adrèce èlèctronica',
'createaccountmail' => 'Empleyér un contresegno temporèro fêt per hasârd et lo mandar a l’adrèce èlèctronica spècifiâye ce-desot',
+'createacct-realname' => 'Veré nom (u chouèx)',
'createaccountreason' => 'Rêson :',
+'createacct-reason' => 'Rêson',
+'createacct-reason-ph' => 'Porquè féte-vos un ôtro compto',
+'createacct-captcha' => 'Contrôlo de sècuritât',
+'createacct-imgcaptcha-ph' => 'Buchiéd lo tèxto que vos vêde ce-dessus',
+'createacct-submit' => 'Féte voutron compto',
+'createacct-another-submit' => 'Féte un ôtro compto',
+'createacct-benefit-heading' => '{{SITENAME}} est ècrit per des coment vos.',
+'createacct-benefit-body1' => 'changement{{PLURAL:$1||s}}',
+'createacct-benefit-body2' => 'pâge{{PLURAL:$1||s}}',
+'createacct-benefit-body3' => '{{PLURAL:$1|novél contributor|novéls contributors}}',
'badretype' => 'Los contresegnos que vos éd buchiês sont pas pariérs.',
'userexists' => 'Lo nom d’utilisator buchiê est ja empleyê.
Se vos plét, chouèsésséd-nen un ôtro.',
'loginerror' => 'Fôta de branchement',
+'createacct-error' => 'Fôta pendent la crèacion du compto',
'createaccounterror' => 'Y at pas moyen de fâre lo compto : $1',
'nocookiesnew' => "Lo compto utilisator est étâ fêt, mas vos éte pas branchiê{{GENDER:||e|(e)}}.
{{SITENAME}} emplèye des tèmouens (''cookies'') por lo branchement mas vos los éd dèsactivâs.
@@ -840,7 +874,7 @@ Por chavonar lo branchement, vos dête buchiér un contresegno novél ique :',
'newpassword' => 'Contresegno novél :',
'retypenew' => 'Confirmar lo contresegno novél :',
'resetpass_submit' => 'Changiér lo contresegno et pués sè branchiér',
-'resetpass_success' => 'Voutron contresegno est étâ changiê avouéc reusséta !
+'changepassword-success' => 'Voutron contresegno est étâ changiê avouéc reusséta !
Branchement en côrs...',
'resetpass_forbidden' => 'Los contresegnos pôvont pas étre changiês',
'resetpass-no-info' => 'Vos dête étre branchiê por arrevar tot drêt a cela pâge.',
@@ -853,10 +887,11 @@ Pôt-étre vos éd ja changiê voutron contresegno avouéc reusséta ou ben dema
# Special:PasswordReset
'passwordreset' => 'Remês’a zérô du contresegno',
-'passwordreset-text' => 'Rempléd ceti formulèro por rebetar a zérô voutron contresegno.',
+'passwordreset-text-one' => 'Rempléd ceti formulèro por rebetar a zérô voutron contresegno.',
+'passwordreset-text-many' => '{{PLURAL:$1|Rempléd yon des champs por rebetar a zérô voutron contresegno.}}',
'passwordreset-legend' => 'Rebetar a zérô lo contresegno',
'passwordreset-disabled' => 'La remês’a zérô des contresegnos est étâye dèsactivâye sur ceti vouiqui.',
-'passwordreset-pretext' => '{{PLURAL:$1||Buchiéd yona de les piéces de balyês ce-desot}}',
+'passwordreset-emaildisabled' => 'Les fonccionalitâts de mèssageria èlèctronica sont étâyes dèsactivâyes sur ceti vouiqui.',
'passwordreset-username' => 'Nom d’utilisator :',
'passwordreset-domain' => 'Domêno :',
'passwordreset-capture' => 'Est-o que vos voléd vêre lo mèssâjo que rèsulte ?',
@@ -887,7 +922,7 @@ vos pouede ignorar ceti mèssâjo et continuar a empleyér voutron viely contres
Contresegno temporèro : $2',
'passwordreset-emailsent' => 'Un mèssâjo de remês’a zérô de contresegno est étâ mandâ.',
'passwordreset-emailsent-capture' => 'Un mèssâjo de remês’a zérô de contresegno est étâ mandâ, qu’est montrâ ce-desot.',
-'passwordreset-emailerror-capture' => 'Un mèssâjo de sovegnence est étâ fêt, qu’est montrâ ce-desot, mas l’èxpèdicion a l’utilisator at pas reussi : $1',
+'passwordreset-emailerror-capture' => 'Un mèssâjo de remês’a zérô de contresegno est étâ fêt, qu’est montrâ ce-desot, mas l’èxpèdicion a l’utilisat{{GENDER:$2|or|rice}} at pas reussi : $1',
# Special:ChangeEmail
'changeemail' => 'Changiér l’adrèce èlèctronica',
@@ -1109,12 +1144,15 @@ Nion’èxplicacion est étâye balyêe.',
Semble que seye étâye suprimâye.',
'edit-conflict' => 'Conflit de changement.',
'edit-no-change' => 'Voutron changement est étâ ignorâ, nion changement est étâ fêt u tèxto.',
+'postedit-confirmation' => 'Voutron changement est étâ encartâ.',
'edit-already-exists' => 'Y at pas moyen de fâre na pâge novèla.
Ègziste ja.',
'defaultmessagetext' => 'Mèssâjo per dèfôt',
'content-failed-to-parse' => 'Falyita de l’analisa du contegnu de $2 por lo modèlo $1 : $3',
'invalid-content-data' => 'Balyês du contegnu pas justes',
'content-not-allowed-here' => 'Lo contegnu « $1 » est pas ôtorisâ sur la pâge [[$2]]',
+'editwarning-warning' => 'Quitar ceta pâge vos farat pèrdre tôs los changements que vos éd fêts.
+Se vos éte branchiê, vos pouede enlevar ceti avèrtissement dens la sèccion « Fenétra d’èdicion » de voutres prèferences.',
# Content models
'content-model-wikitext' => 'vouiquitèxto',
@@ -1150,6 +1188,7 @@ Se vos plét, controlâd la comparèson ce-desot por vos assurar qu’o est fran
'undo-failure' => 'Lo changement at pas possu étre dèfêt a côsa d’un conflit avouéc des changements entèrmèdièros.',
'undo-norev' => 'Lo changement at pas possu étre dèfêt perce qu’il est pas ègzistent ou ben qu’il est étâ suprimâ.',
'undo-summary' => 'Dèfêta du changement $1 de [[Special:Contributions/$2|$2]] ([[User talk:$2|discutar]])',
+'undo-summary-username-hidden' => 'Dèfêta du changement $1 d’un utilisator cachiê',
# Account creation failure
'cantcreateaccounttitle' => 'Y at pas moyen de fâre lo compto',
@@ -1332,6 +1371,7 @@ Notâd que l’usâjo des lims de navigacion rebeterat a zérô cela colona.',
'compareselectedversions' => 'Comparar les vèrsions chouèsies',
'showhideselectedversions' => 'Montrar / cachiér les vèrsions chouèsies',
'editundo' => 'dèfâre',
+'diff-empty' => '(Niona difèrence)',
'diff-multi' => '({{PLURAL:$1|Na vèrsion entèrmèdièra|$1 vèrsions entèrmèdières}} per {{PLURAL:$2|un utilisator|$2 utilisators}} {{PLURAL:$1|est pas montrâye|sont pas montrâyes}})',
'diff-multi-manyusers' => '({{PLURAL:$1|Na 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âye|sont pas montrâyes}})',
'difference-missing-revision' => '{{PLURAL:$2|Na vèrsion|$2 vèrsions}} de cela difèrence ($1) {{PLURAL:$2|est pas étâye trovâye|sont pas étâyes trovâyes}}.
@@ -1359,7 +1399,6 @@ Vos pouede trovar més de dètalys sur lo [{{fullurl:{{#Special:Log}}/delete|pag
'searchmenu-legend' => 'Chouèx de rechèrche',
'searchmenu-exists' => "'''Y at na pâge apelâye « [[:$1]] » sur ceti vouiqui.'''",
'searchmenu-new' => "'''Fâre la pâge « [[:$1|$1]] » sur ceti vouiqui !'''",
-'searchhelp-url' => 'Help:Somèro',
'searchmenu-prefix' => '[[Special:PrefixIndex/$1|Fâre dèfelar les pâges que començont per ceti prèfixo]]',
'searchprofile-articles' => 'Pâges de contegnu',
'searchprofile-project' => 'Pâges d’éde et pâges projèt',
@@ -1403,15 +1442,7 @@ Vos pouede trovar més de dètalys sur lo [{{fullurl:{{#Special:Log}}/delete|pag
'searchdisabled' => 'La rechèrche dessus {{SITENAME}} est dèsactivâye.
Pendent cél temps, vos pouede fâre na rechèrche avouéc Google.
Notâd que lor endèxacion du contegnu de {{SITENAME}} pôt pas étre a jorn.',
-
-# Quickbar
-'qbsettings' => 'Bârra rapida',
-'qbsettings-none' => 'Pas yona',
-'qbsettings-fixedleft' => 'Fix’a gôche',
-'qbsettings-fixedright' => 'Fix’a drêta',
-'qbsettings-floatingleft' => 'Fllotent’a gôche',
-'qbsettings-floatingright' => 'Fllotent’a drêta',
-'qbsettings-directionality' => 'Fixa, d’aprés la dirèccionalitât d’ècritura de voutra lengoua',
+'search-error' => 'Na fôta est arrevâye en rechèrchient : $1',
# Preferences page
'preferences' => 'Prèferences',
@@ -1445,7 +1476,6 @@ Notâd que lor endèxacion du contegnu de {{SITENAME}} pôt pas étre a jorn.',
'resetprefs' => 'Èfaciér los changements pas encartâs',
'restoreprefs' => 'Rètablir tota la configuracion per dèfôt',
'prefs-editing' => 'Changement',
-'prefs-edit-boxsize' => 'Talye de la fenétra de changement.',
'rows' => 'Renches :',
'columns' => 'Colones :',
'searchresultshead' => 'Rechèrche',
@@ -1456,9 +1486,6 @@ Notâd que lor endèxacion du contegnu de {{SITENAME}} pôt pas étre a jorn.',
'recentchangesdays-max' => 'Por lo més $1 jorn{{PLURAL:$1||s}}',
'recentchangescount' => 'Nombro de changements a montrar per dèfôt :',
'prefs-help-recentchangescount' => 'Los dèrriérs changements, los historicos de pâges et los jornals avouéc.',
-'prefs-help-watchlist-token' => 'Rempléd ceti champ avouéc na cllâf secrèta et pués un flux RSS serat fêt por voutra lista de siuvu.
-Tôs celos que cognessont cela cllâf porront liére voutra lista de siuvu, chouèsésséd vêr na valor sècurisâye.
-Vê-que na valor fêta per hasârd que vos pouede empleyér : $1',
'savedprefs' => 'Voutres prèferences sont étâyes encartâyes.',
'timezonelegend' => 'Fus horèro :',
'localtime' => 'Hora locâla :',
@@ -1489,7 +1516,6 @@ Vê-que na valor fêta per hasârd que vos pouede empleyér : $1',
'prefs-reset-intro' => 'Vos pouede empleyér 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 l’adrèce èlèctronica :',
-'prefs-textboxsize' => 'Talye de la fenétra de changement',
'youremail' => 'Adrèce èlèctronica :',
'username' => 'Nom d’utilisat{{GENDER:$1|or|rice}} :',
'uid' => 'Identifient d’utilisat{{GENDER:$1|or|rice}} :',
@@ -1730,7 +1756,6 @@ Se vos chouèsésséd de lo balyér, serat empleyê por vos atribuar voutres ôv
'recentchangeslinked-feed' => 'Changements liyês',
'recentchangeslinked-toolbox' => 'Changements liyês',
'recentchangeslinked-title' => 'Changements liyês a « $1 »',
-'recentchangeslinked-noresult' => 'Y at gins de changement sur les pâges liyêes pendent lo temps chouèsi.',
'recentchangeslinked-summary' => "O est na lista des dèrriérs changements sur les pâges liyêes a na pâge spècifiâye (sur los membros d’una catègorie spècifiâye).
Les pâges de voutra [[Special:Watchlist|lista de siuvu]] sont en '''grâs'''.",
'recentchangeslinked-page' => 'Nom de la pâge :',
@@ -1981,7 +2006,6 @@ Por na sècuritât pèrfèta, img_auth.php est dèsactivâ.',
'http-read-error' => 'Fôta de lèctura HTTP.',
'http-timed-out' => 'La demanda HTTP at èxpirâ.',
'http-curl-error' => 'Fôta pendent la rècupèracion de l’URL : $1',
-'http-host-unreachable' => 'Y at pas moyen d’avengiér l’URL.',
'http-bad-status' => 'Y at avu un problèmo pendent la demanda HTTP : $1 $2',
# Some likely curl errors. More could be added from <http://curl.haxx.se/libcurl/c/libcurl-errors.html>
@@ -2135,12 +2159,6 @@ Oubliâd pas de controlar s’y at gins d’ôtro lim de vers los modèlos devan
'statistics-users-active-desc' => 'Utilisators qu’ant fêt por lo muens un’accion pendent {{PLURAL:$1|lo jorn passâ|los $1 jorns passâs}}',
'statistics-mostpopular' => 'Pâges les ples vues',
-'disambiguations' => 'Pâges qu’ant des lims de vers des pâges d’homonimia',
-'disambiguationspage' => 'Template:Homonimia',
-'disambiguations-text' => "Cetes pâges ant por lo muens un lim de vers na '''pâge d’homonimia'''.
-Devriant pletout pouentar vers na pâge que vat avouéc.<br />
-Na pâge est trètâye coment na pâge d’homonimia s’emplèye un modèlo liyê a [[MediaWiki:Disambiguationspage]].",
-
'pageswithprop' => 'Pâges avouéc na propriètât de pâge',
'pageswithprop-legend' => 'Pâges avouéc na propriètât de pâge',
'pageswithprop-text' => 'Ceta pâge liste les pâges qu’emplèyont na propriètât de pâge particuliére.',
@@ -2397,10 +2415,9 @@ Los changements que vegnont de ceta pâge et de la sina pâge de discussion y se
'unwatchthispage' => 'Pas més siuvre',
'notanarticle' => 'O est pas na pâge de contegnu',
'notvisiblerev' => 'La dèrriére vèrsion per un ôtr’utilisator est étâye suprimâye',
-'watchnochange' => 'Pas yona de les piéces que vos siude est étâye changiêe pendent lo temps fêt vêre.',
'watchlist-details' => 'Y at $1 pâge{{PLURAL:$1||s}} dedens voutra lista de siuvu, sen comptar les pâges de discussion.',
-'wlheader-enotif' => '* La notificacion per mèssageria èlèctronica est activâye.',
-'wlheader-showupdated' => "* Les pâges que sont étâyes changiêes dês voutra dèrriére visita sont montrâyes en '''grâs'''.",
+'wlheader-enotif' => 'La notificacion per mèssageria èlèctronica est activâye.',
+'wlheader-showupdated' => "Les pâges que sont étâyes changiêes dês voutra dèrriére visita sont montrâyes en '''grâs'''.",
'watchmethod-recent' => 'contrôlo des novéls changements por y trovar des pâges siuvues',
'watchmethod-list' => 'contrôlo de les pâges siuvues por y trovar des novéls changements',
'watchlistcontains' => 'Voutra lista de siuvu contint $1 pâge{{PLURAL:$1||s}}.',
@@ -2815,12 +2832,9 @@ O est possiblo qu’un dèblocâjo èye ja étâ fêt.',
Portant, el est avouéc la plage $2 que pôt étre dèblocâ.',
'ip_range_invalid' => 'Plage d’adrèces IP fôssa.',
'ip_range_toolarge' => 'Los blocâjos de plages d’adrèces IP ples grantes que /$1 sont pas ôtorisâs.',
-'blockme' => 'Blocâd-mè',
'proxyblocker' => "Bloquior de sèrvors mandatèros (''proxies'')",
-'proxyblocker-disabled' => 'Cela fonccion est dèsactivâ.',
'proxyblockreason' => "Voutra adrèce IP at étâ blocâ perce qu’o est un sèrvor mandatèro (''proxy'') uvèrt.
Vos volyéd veriér vers voutron fornissor d’accès u Malyâjo ou ben voutra assistance tècnica et l’enformar de cél problèmo de sècuritât sèriox.",
-'proxyblocksuccess' => 'Chavonâ.',
'sorbsreason' => "Voutra adrèce IP est listâ coment sèrvor mandatèro (''proxy'') uvèrt dens lo DNSBL utilisâ per {{SITENAME}}.",
'sorbs_create_account_reason' => "Voutra adrèce IP est listâ coment sèrvor mandatèro (''proxy'') uvèrt dens lo DNSBL utilisâ per {{SITENAME}}.
Vos pouede pas fâre un compto.",
@@ -3134,17 +3148,11 @@ Pèrmèt de rètablir la vèrsion devant et pués d’apondre una rêson dens la
# Stylesheets
'common.css' => '/* Lo code CSS betâ ique serat aplicâ a tôs los habelyâjos. */',
-'standard.css' => '/* Lo code CSS betâ ique afècterat los usanciérs de l’habelyâjo « Estandârd ». */',
-'nostalgia.css' => '/* Lo code CSS betâ ique afècterat los usanciérs de l’habelyâjo « Cafârd ». */',
'cologneblue.css' => '/* Lo code CSS betâ ique afècterat los usanciérs de l’habelyâjo « Blu de Cologne ». */',
'monobook.css' => '/* Lo code CSS betâ ique afècterat los usanciérs de l’habelyâjo « MonoBook ». */',
-'myskin.css' => '/* Lo code CSS betâ ique afècterat los usanciérs de l’habelyâjo « MonHabelyâjo ». */',
-'chick.css' => '/* Lo code CSS betâ ique afècterat los usanciérs de l’habelyâjo « Pugin ». */',
-'simple.css' => '/* Lo code CSS betâ ique afècterat los usanciérs de l’habelyâjo « Simplo ». */',
'modern.css' => '/* Lo code CSS betâ ique afècterat los usanciérs de l’habelyâjo « Modèrno ». */',
'vector.css' => '/* Lo code CSS betâ ique afècterat los usanciérs de l’habelyâjo « Vèctor ». */',
'print.css' => '/* Lo code CSS betâ ique afècterat les emprèssions. */',
-'handheld.css' => '/* Lo code CSS betâ ique afècterat los aparèlys mobilos d’aprés l’habelyâjo configurâ dedens « $wgHandheldStyle ». */',
'noscript.css' => '/* Lo code CSS betâ ique afècterat los usanciérs qu’ont dèsactivâ lo code JavaScript. */',
'group-autoconfirmed.css' => '/* Lo code CSS betâ ique afècterat ren que los usanciérs encartâs. */',
'group-bot.css' => '/* Lo code CSS betâ ique afècterat ren que los bots. */',
@@ -3153,13 +3161,8 @@ Pèrmèt de rètablir la vèrsion devant et pués d’apondre una rêson dens la
# Scripts
'common.js' => '/* Tot code JavaScript betâ ique serat chargiê per tôs los usanciérs avouéc châque chargement de pâge. */',
-'standard.js' => '/* Tot code JavaScript betâ ique serat chargiê per los usanciérs de l’habelyâjo « Estandârd ». */',
-'nostalgia.js' => '/* Tot code JavaScript betâ ique serat chargiê per los usanciérs de l’habelyâjo « Cafârd ». */',
'cologneblue.js' => '/* Tot code JavaScript betâ ique serat chargiê per los usanciérs de l’habelyâjo « Blu de Cologne ». */',
'monobook.js' => '/* Tot code JavaScript betâ ique serat chargiê per los usanciérs de l’habelyâjo « MonoBook ». */',
-'myskin.js' => '/* Tot code JavaScript betâ ique serat chargiê per los usanciérs de l’habelyâjo « MonHabelyâjo ». */',
-'chick.js' => '/* Tot code JavaScript betâ ique serat chargiê per los usanciérs de l’habelyâjo « Pugin ». */',
-'simple.js' => '/* Tot code JavaScript betâ ique serat chargiê per los usanciérs de l’habelyâjo « Simplo ». */',
'modern.js' => '/* Tot code JavaScript betâ ique serat chargiê per los usanciérs de l’habelyâjo « Modèrno ». */',
'vector.js' => '/* Tot code JavaScript betâ ique serat chargiê per los usanciérs de l’habelyâjo « Vèctor ». */',
'group-autoconfirmed.js' => '/* Tot code JavaScript betâ ique serat chargiê ren que por los usanciérs encartâs. */',
@@ -3230,13 +3233,8 @@ O est probâblament diu a un lim de vers un seto de defôr qu’aparêt sur la l
'pageinfo-protect-cascading-yes' => 'Ouè',
# Skin names
-'skinname-standard' => 'Estandârd',
-'skinname-nostalgia' => 'Cafârd',
'skinname-cologneblue' => 'Blu de Cologne',
'skinname-monobook' => 'MonoBook',
-'skinname-myskin' => 'MonHabelyâjo',
-'skinname-chick' => 'Pugin',
-'skinname-simple' => 'Simplo',
'skinname-modern' => 'Modèrno',
'skinname-vector' => 'Vèctor',
@@ -3344,7 +3342,7 @@ Los ôtros champs seront cachiês per dèfôt.
* gpsaltitude',
'metadata-langitem' => "'''$2 :''' $1",
-# EXIF tags
+# Exif tags
'exif-imagewidth' => 'Largior',
'exif-imagelength' => 'Hôtior',
'exif-bitspersample' => 'Bits per composenta',
@@ -3522,7 +3520,7 @@ Los ôtros champs seront cachiês per dèfôt.
'exif-originalimageheight' => 'Hôtior de l’émâge devant qu’el èye étâ tornâ cadrar',
'exif-originalimagewidth' => 'Largior de l’émâge devant qu’el èye étâ tornâ cadrar',
-# EXIF attributes
+# Exif attributes
'exif-compression-1' => 'Pas comprèssâ',
'exif-compression-2' => 'CCITT tropa 3 longior du codâjo Huffman changiê de dimension 1',
'exif-compression-3' => 'CCITT tropa 3 codâjo du faxe',
@@ -3845,7 +3843,6 @@ Volyéd confirmar que vos voléd franc refâre cela pâge.",
# Separators for various lists, etc.
'semicolon-separator' => '&nbsp;;&#32;',
'colon-separator' => '&nbsp;:&#32;',
-'autocomment-prefix' => '&#32;–&#32;',
'percent' => '$1&#160;%',
# Multipage image navigation
@@ -3993,7 +3990,6 @@ Vos pouede asse-ben utilisar l’[[Special:EditWatchlist|èditor normal]].',
'version-other' => 'De totes sôrtes',
'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',
'version-parser-function-hooks' => 'Grèfons de les fonccions du parsor',
'version-hook-name' => 'Nom du grèfon',
@@ -4015,13 +4011,6 @@ Vos devriâd avêr reçu un [{{SERVER}}{{SCRIPTPATH}}/COPYING ègzemplèro de la
'version-entrypoints-header-entrypoint' => 'Pouent d’entrâ',
'version-entrypoints-header-url' => 'URL',
-# Special:FilePath
-'filepath' => 'Chemin d’accès du fichiér',
-'filepath-page' => 'Fichiér :',
-'filepath-submit' => 'Alar trovar',
-'filepath-summary' => 'Ceta pâge spèciâla montre lo chemin d’accès complèt d’un fichiér.
-Les émâges sont montrâs dens lor plêna rèsolucion, los ôtros fichiérs sont chargiês et dèmarrâs tot drêt avouéc lor programo associyê.',
-
# Special:FileDuplicateSearch
'fileduplicatesearch' => 'Rechèrche des fichiérs en doblo',
'fileduplicatesearch-summary' => 'Rechèrche des fichiérs en doblo d’aprés lor mârca de chaplâjo.',
diff --git a/languages/messages/MessagesFrr.php b/languages/messages/MessagesFrr.php
index df8f5f55..4c740a78 100644
--- a/languages/messages/MessagesFrr.php
+++ b/languages/messages/MessagesFrr.php
@@ -7,6 +7,7 @@
* @ingroup Language
* @file
*
+ * @author Geitost
* @author Inkowik
* @author Maartenvdbent
* @author Merlissimo
@@ -49,9 +50,6 @@ $messages = array(
'tog-shownumberswatching' => "Taal faan brükern uunwise, diar det sidj uun't uug haa",
'tog-oldsig' => 'Aktuel signatuur:',
'tog-fancysig' => 'Signatuur üs wikitekst uunsä (saner ferwisangen)',
-'tog-externaleditor' => 'Ekstern program för werjuunsferskeel brük (bluas för eksperten, auer diarför iinstelangen üüb dan reegner feranert wurd skel). [//www.mediawiki.org/wiki/Manual:External_editors Muar diartu.]',
-'tog-externaldiff' => 'Ekstern program för werjuunsferskeel brük (bluas för eksperten, auer diarför iinstelangen üüb dan reegner feranert wurd skel). [//www.mediawiki.org/wiki/Manual:External_editors Muar diartu.]',
-'tog-showjumplinks' => '"Waksle tu"-ferwisangen aktiwiare',
'tog-uselivepreview' => 'Live-föörskau funktjuun brük (eksperimentel)',
'tog-forceeditsummary' => "Wäärne, wan bi't seekrin nian tuupfaadang uunden woort",
'tog-watchlisthideown' => "Aanj feranrangen bi a sidjen, diar ik uun't uug behual wal, fersteeg",
@@ -64,6 +62,8 @@ $messages = array(
'tog-diffonly' => 'Bi en werjuunsferglik bluas di ferskeel uunwise, ei det hialer sidj',
'tog-showhiddencats' => 'Ferbürgen kategoriin uunwise',
'tog-norollbackdiff' => "Ferskeel efter't turagsaaten fersteeg",
+'tog-useeditwarning' => 'Waarskaue mi, wan en sidj slööden woort, huar noch ünseekert feranrangen maaget wurden san',
+'tog-prefershttps' => 'Leewen en seeker ferbinjag brük, wan ik uunmeldet san.',
'underline-always' => 'Leewen',
'underline-never' => 'Nimer',
@@ -127,6 +127,18 @@ $messages = array(
'oct' => 'Okt.',
'nov' => 'Now.',
'dec' => 'Det.',
+'january-date' => '$1. Janewoore',
+'february-date' => '$1. Febrewoore',
+'march-date' => '$1. Maarts',
+'april-date' => '$1. April',
+'may-date' => '$1. Mei',
+'june-date' => '$1. Jüüne',
+'july-date' => '$1. Jüüle',
+'august-date' => '$1. August',
+'september-date' => '$1. September',
+'october-date' => '$1. Oktuuber',
+'november-date' => '$1. Nofember',
+'december-date' => '$1. Detsember',
# Categories related messages
'pagecategories' => '{{PLURAL:$1|Kategorii|Kategoriin}}',
@@ -208,6 +220,7 @@ $messages = array(
'create-this-page' => 'Nei sidj maage',
'delete' => 'Strik',
'deletethispage' => 'Detdiar sidj strik',
+'undeletethispage' => 'Detdiar stregen sidj turaghaale',
'undelete_short' => '{{PLURAL:$1|1 werjuun|$1 werjuunen}} weder iinstel',
'viewdeleted_short' => '{{PLURAL:$1|Ian stregen werjuun|$1 stregen werjuunen}} uunluke',
'protect' => 'Seekre',
@@ -251,7 +264,7 @@ $1',
'pool-queuefull' => 'Pool as auerläästet',
'pool-errorunknown' => 'Ünbekäänd 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).
+# 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).
'aboutsite' => 'Auer {{SITENAME}}',
'aboutpage' => 'Project:Auer',
'copyright' => 'Det stäänt oner det lisens $1.',
@@ -261,7 +274,6 @@ $1',
'disclaimers' => 'Disclaimers',
'disclaimerpage' => 'Project:Disclaimers',
'edithelp' => "Halep bi't bewerkin",
-'edithelppage' => 'Help:Beårbe',
'helppage' => 'Help:Auersicht',
'mainpage' => 'Hoodsidj',
'mainpage-description' => 'Hoodsidj',
@@ -293,7 +305,6 @@ Luke efter bi't [[Special:Version|werjuunssidj]]",
'newmessagesdifflinkplural' => 'leetst {{PLURAL:$1|feranrang|feranrangen}}',
'youhavenewmessagesmulti' => 'Dü heest nei bööd üüb $1',
'editsection' => 'Bewerke',
-'editsection-brackets' => '[$1]',
'editold' => 'Bewerke',
'viewsourceold' => 'kweltekst uunwise',
'editlink' => 'bewerke',
@@ -345,16 +356,12 @@ En list mä aal a spezial-sidjen fanjst dü üüb [[Special:SpecialPages|{{int:s
# General errors
'error' => 'Feeler',
'databaseerror' => 'Dootenbeenkfeeler',
-'dberrortext' => 'Diar as wat skiaf gingen mä det dootenbeenk.
-Ferlicht as det software ei bi a rä.
-Det leetst uunfraag tu\'t dootenbeenk wiar:
-<blockquote><code>$1</code></blockquote>
-faan det funktsjuun "<code>$2</code>".
-Det dootenbeenk swaaret mä "<samp>$3: $4</samp>".',
-'dberrortextcl' => "Bi't uffraagin faan a dootenbeenk as wat skiaf gingen. Det leetst uffraag wiar:
-„$1“
-ütj det funktjuun „$2“.
-At dootebeenk swaaret: „$3: $4“.",
+'databaseerror-text' => "Bi't uunfraag tu a dootenbeenk as wat skiaf gingen.
+Diar küd wat mä a software ferkiard wees.",
+'databaseerror-textcl' => "Diar as en feeler bi't uunfraag tu a dootenbeenk föörkimen.",
+'databaseerror-query' => 'Uunfraag: $1',
+'databaseerror-function' => 'Funktjuun: $1',
+'databaseerror-error' => 'Feeler: $1',
'laggedslavemode' => "'''Paase üüb:''' Ferlicht wiset detdiar sidj ei a leetst stant.",
'readonly' => 'Dootenbeenk speret.',
'enterlockreason' => 'Wees so gud an du en grünj uun, huaram det dootenbeenk speret wurd skal, an hü loong det (amanbi) speret wurd skal.',
@@ -386,6 +393,7 @@ Wan't det ei as, do heest dü ferlicht en feeler uun't software fünjen. Wees so
Det as ferlicht al faan hoker ööders stregen wurden.',
'cannotdelete-title' => 'Sidj „$1“ koon ei stregen wurd.',
'delete-hook-aborted' => 'Det striken as faan en software-feranrang faan MediaWiki ferhanert wurden. Di grünj as ei bekäänd.',
+'no-null-revision' => 'Det nul-werjuun för det sidj "$1" küd ei skrewen wurd.',
'badtitle' => 'Ferkiard tiitel',
'badtitletext' => 'Didiar sidjennööm gongt ei. Hi as ferlicht leesag of as en ferkiard ferwisang faan en ööder projekt.',
'perfcached' => 'Jodiar dooten kem faan a cache an san ferlicht ei muar aktuel. Ei muar üs {{PLURAL:$1|ian resultoot as|$1 resultooten san}} uun a cache.',
@@ -406,13 +414,16 @@ Wees so gud an ferschük det glik noch ans weder.',
Dü könst [//translatewiki.net/ translatewiki.net] faan MediaWiki brük, am auersaatangen för ale wiki projekten tu maagin.',
'editinginterface' => "'''Paase üüb:''' Üüb detdiar sidj stäänt tekst, diar faan't MediaWiki software brükt woort. Wan dü diar wat feranerst, feranerst dü di skak faan't Nordfriisk Wikipedia.
Wan dü wat auersaat wel, maage det mä [//translatewiki.net/ translatewiki.net], det as det MediaWiki lokalisiarangsprojekt.",
-'sqlhidden' => 'SQL-uffraag as ferbürgen',
'cascadeprotected' => 'Detdiar sidj koon ei bewerket wurd. Hat as uun {{PLURAL:$1|detdiar sidj|jodiar sidjen}}
iinbünjen, diar auer kaskaadenseekerhaid seekert {{PLURAL:$1|as|san}}:
$2',
'namespaceprotected' => "Dü heest ei det brükerrocht, am sidjen uun di nöömrüm '''$1''' tu bewerkin.",
'customcssprotected' => 'Dü mutst detheer CSS sidj ei bewerke, auer det hoker ööders hiart.',
'customjsprotected' => 'Dü mutst detheer JavaScript sidj ei bewerke, auer det hoker ööders hiart.',
+'mycustomcssprotected' => 'Dü mutst detdiar CSS-sidj ei bewerke.',
+'mycustomjsprotected' => 'Dü mutst detdiar JavaScript-sidj ei bewerke.',
+'myprivateinfoprotected' => 'Dü heest ei det brükerrocht, am din priwoot dooten tu feranrin.',
+'mypreferencesprotected' => 'Dü heest ei det brükerrocht, am din iinstelangen tu feranrin.',
'ns-specialprotected' => 'Spezial-sidjen kön ei bewerket wurd.',
'titleprotected' => 'En sidj mä didiar nööm koon ei uunlaanj wurd.
Di brüker [[User:$1|$1]] hää det sidj speret, an di grünj as: "\'\'$2\'\'".',
@@ -436,10 +447,19 @@ Enkelt sidjen wise ferlicht noch uun, dat dü uunmeldet beest, so loong dü dan
'welcomecreation-msg' => 'Din brükerkonto as iinracht wurden.
Ferjid det ei, an aachte üüb din [[Special:Preferences|{{SITENAME}} iinstelangen]].',
'yourname' => 'Brükernööm:',
+'userlogin-yourname' => 'Brükernööm',
+'userlogin-yourname-ph' => 'Du dan Brükernööm iin',
+'createacct-another-username-ph' => 'Brükernööm iindu',
'yourpassword' => 'Paaswurd:',
+'userlogin-yourpassword' => 'Paaswurd',
+'userlogin-yourpassword-ph' => 'Paaswurd iindu',
+'createacct-yourpassword-ph' => 'Paaswurd iindu',
'yourpasswordagain' => 'Skriiw det paaswurd noch ans weder hen:',
+'createacct-yourpasswordagain' => 'Paaswurd gudkään',
+'createacct-yourpasswordagain-ph' => 'Du det paaswurd noch ans iin',
'remembermypassword' => 'Üüb diheer reegner üüb düür uunmelde (maksimaal för $1 {{PLURAL:$1|dai|daar}})',
-'securelogin-stick-https' => "Efter't uunmeldin auer HTTPS ferbünjen bliiw",
+'userlogin-remembermypassword' => 'Uunmeldet bliiw',
+'userlogin-signwithsecure' => 'Seeker ferbinjang brük',
'yourdomainname' => 'Din domain:',
'password-change-forbidden' => 'Üüb detheer wiki könst dü nian paaswurden feranre.',
'externaldberror' => 'Deer läit en fäägel bai jü äkstärn autentifisiiring for, unti dü möist din äkstärn brükerkonto äi aktualisiire.',
@@ -451,18 +471,41 @@ Ferjid det ei, an aachte üüb din [[Special:Preferences|{{SITENAME}} iinstelang
'logout' => 'Ufmelde',
'userlogout' => 'Ufmelde',
'notloggedin' => 'Ei uunmeldet',
+'userlogin-noaccount' => 'Dü heest noch nian brükerkonto ?',
+'userlogin-joinproject' => 'Bi {{SITENAME}} mämaage',
'nologin' => 'Dü heest nian brükerkonto? $1.',
'nologinlink' => 'Nei brükerkonto iinracht',
'createaccount' => 'Brükerkonto iinracht',
'gotaccount' => "Dü hääst ål en brükerkonto? '''$1'''.",
'gotaccountlink' => 'Uunmelde',
'userlogin-resetlink' => 'Heest dü din login dooten ferjiden?',
+'userlogin-resetpassword-link' => 'Paaswurd turagsaat',
+'helplogin-url' => 'Help:Uunmelde',
+'userlogin-helplink' => "[[{{MediaWiki:helplogin-url}}|Halep bi't uunmeldin]]",
+'createacct-join' => 'Du oner din dooten iin.',
+'createacct-another-join' => "Skriiw oner a dooten för't nei brükerkonto hen",
+'createacct-emailrequired' => 'E-mail adres',
+'createacct-emailoptional' => 'E-mail adres (optional)',
+'createacct-email-ph' => 'Du din e-mail adres iin',
+'createacct-another-email-ph' => 'E-Mail-adres uundu',
'createaccountmail' => 'E-mail tu detdiar adres ferschüür mä en tidjwiis tufelag paaswurd',
+'createacct-realname' => 'Rocht nööm (optional)',
'createaccountreason' => 'Grünj:',
+'createacct-reason' => 'Grünj',
+'createacct-reason-ph' => 'Huaram dü en ööder brükerkonto iinrachtst',
+'createacct-captcha' => 'Seekerhaidspreew',
+'createacct-imgcaptcha-ph' => 'Skriiw di tekst, diar dü boowen schochst',
+'createacct-submit' => 'Din brükerkonto iinracht',
+'createacct-another-submit' => 'En ööder brükerkonto iinracht',
+'createacct-benefit-heading' => '{{SITENAME}} woort faan lidj üs di maaget.',
+'createacct-benefit-body1' => '{{PLURAL:$1|feranrang|feranrangen}}',
+'createacct-benefit-body2' => '{{PLURAL:$1|sidj|sidjen}}',
+'createacct-benefit-body3' => 'aktiif {{PLURAL:$1|skriiwer|skriiwern}}',
'badretype' => 'Jo tau paaswurden san ei likedenang.',
'userexists' => 'Dideer brükernoome as ål ferjääwen.
Wees sü gödj en kiis en ouderen.',
'loginerror' => "Bi't uunmeldin as wat skiaf gingen",
+'createacct-error' => "Bi't iinrachten faan det brükerkonto as wat skiaf gingen",
'createaccounterror' => 'Brükerkonto küd ei iinracht wurd: $1',
'nocookiesnew' => 'Det brükerkonto as iinracht wurden, oober dü beest ei uunmeldet.
{{SITENAME}} brükt cookies för detdiar aktjuun.
@@ -524,11 +567,12 @@ Dü skulst di nü uunmelde an det paaswurd anre.
Wan det brükerkonto ütj fersen uunlaanj wurden as, säärst dü niks widjer onernem.',
'usernamehasherror' => 'Uun brükernöömer mut nian rütjen föörkem.',
-'login-throttled' => 'Dü heest tu oofding fersoocht, di önjtumälden.
-Wees sü gödj än täif, bit dü wider ferseechst.',
+'login-throttled' => 'Dü heest tufölsis fersoocht, di uuntumeldin.
+Wees so gud an teew $1, iar dü det noch ans ferschükst.',
'login-abort-generic' => 'Det uunmeldin hää ei loket - Ufbreegen',
'loginlanguagelabel' => 'Spriak: $1',
'suspicious-userlogout' => 'Din ufmeldang as ei föörnimen wurden, auer det uunfraag ferlicht faan en uunstakenen browser of faan en cache-proxy kaam.',
+'createacct-another-realname-tip' => 'Stäänt tu wool. Wan dü dan rochten nööm uundääst, koon hi mä din feranrangen ferbünjen wurd.',
# Email sending
'php-mail-error-unknown' => 'Ünbekäänd feeler mä det funktsjuun mail() faan PHP.',
@@ -544,8 +588,7 @@ Am det uunmeldin uftuslütjen, skel dü en nei paaswurd iindu.',
'newpassword' => 'Nei paaswurd:',
'retypenew' => 'Skriiw det paaswurd noch ans weder hen:',
'resetpass_submit' => 'Paaswurd saat an uunmelde',
-'resetpass_success' => 'Din paaswurd as feranert wurden!
-Dü woorst nü uunmeldet ...',
+'changepassword-success' => 'Din paaswurd as feranert wurden!',
'resetpass_forbidden' => 'Det paaswurd koon ei feranert wurd.',
'resetpass-no-info' => 'Dü skel di uunmelde, am üüb det sidj tutugripen.',
'resetpass-submit-loggedin' => 'Paaswurd feranre',
@@ -558,10 +601,11 @@ of am en nei paaswurd uunfraaget.',
# Special:PasswordReset
'passwordreset' => 'Paaswurd turagsaat',
-'passwordreset-text' => 'Fal detheer formulaar ütj, am din paaswurd turag tu saaten.',
+'passwordreset-text-one' => 'Fal detheer formulaar ütj, am din paaswurd turag tu saaten.',
+'passwordreset-text-many' => '{{PLURAL:$1|Fal ian fial ütj, am din paaswurd turag tu saaten.}}',
'passwordreset-legend' => 'Paaswurd turagsaat',
'passwordreset-disabled' => 'Dü könst din paaswurd uun detdiar wiki ei turagsaat.',
-'passwordreset-pretext' => '{{PLURAL:$1||Du ian faan jo dooten oner iin}}',
+'passwordreset-emaildisabled' => 'E-mail as üüb detheer Wiki ufknipset wurden.',
'passwordreset-username' => 'Brükernoome:',
'passwordreset-domain' => 'Domain:',
'passwordreset-capture' => 'Wel dü det e-mail nooracht uunluke?',
@@ -583,7 +627,7 @@ $2
Tidwis paasuurd: $2',
'passwordreset-emailsent' => 'Diar as en E-Mail tu di onerwais.',
'passwordreset-emailsent-capture' => 'Detdiar E-Mail, wat oner uunwiset woort, as tu di onerwais.',
-'passwordreset-emailerror-capture' => 'Detdiar E-Mail, wat oner uunwiset woort, wiar tu di onerwais, oober küd ei ufsjüürd wurd: $1',
+'passwordreset-emailerror-capture' => 'Detdiar E-Mail, wat oner uunwiset woort, wiar tu di onerwais, oober küd ei tu di {{GENDER:$2|brüker}} ufsjüürd wurd: $1',
# Special:ChangeEmail
'changeemail' => 'Feranre det E-Mail-adres',
@@ -597,6 +641,17 @@ Tidwis paasuurd: $2',
'changeemail-submit' => 'E-mail adres feranre',
'changeemail-cancel' => 'Ufbreeg',
+# Special:ResetTokens
+'resettokens' => 'Tokens turagsaat',
+'resettokens-text' => "Dü könst 'tokens' turagsaat, am priwoot dooten tu bewerkin, diar mä din brükerkonto ferbünjen san.",
+'resettokens-no-tokens' => 'Diar san nian tokens turagtusaaten.',
+'resettokens-legend' => 'Tokens turagsaat',
+'resettokens-tokens' => 'Tokens:',
+'resettokens-token-label' => '$1 (aktuel wäärs: $2)',
+'resettokens-watchlist-token' => "Token för webfeed (Atom/RSS) mä [[Special:Watchlist|feranrangen faan sidjen, diar dü uun't uug behual wel]]",
+'resettokens-done' => 'Tokems san turagsaat wurden.',
+'resettokens-resetbutton' => 'Enkelt tokens turagsaat',
+
# Edit page toolbar
'bold_sample' => 'Fäät buksteewen',
'bold_tip' => 'Fäät buksteewen',
@@ -792,11 +847,14 @@ Uun't strik- an fersküüw-logbuk oner stäänt muar diartu.",
'edit-gone-missing' => 'Detdiar sidj küd ei aktualisiaret wurd. Ferlicht as det stregen wurden.',
'edit-conflict' => "Konflikt bi't bewerkin (BK).",
'edit-no-change' => 'Din feranrang woort ei seekert, auer dü di tekst ei feranert heest.',
+'postedit-confirmation' => 'Din feranrang as seekert wurden.',
'edit-already-exists' => 'Det nei sidj küd ei iinracht wurd. Son sidj as al diar.',
'defaultmessagetext' => 'Standard tekst',
'content-failed-to-parse' => "Parsing faan $2 för't model $1 ging skiaf: $3",
'invalid-content-data' => 'Diar stäänt wat uun, wat diar ei hen hiart',
'content-not-allowed-here' => '„$1“ mut ei skrewen wurd üüb sidj [[$2]]',
+'editwarning-warning' => 'Wan dü detheer sidj slotst, kön feranrangen ferleesen gung.
+Üs uunmeldet brüker könst dü detheer wäärnang bi din iinstelangen oner „Bewerke“ wechknipse.',
# Content models
'content-model-wikitext' => 'wikitekst',
@@ -830,6 +888,7 @@ Luke oner, of dü det uk würelk du wel, an do seekre din feranrangen.',
'undo-failure' => 'Det feranrang küd ei stregen wurd, auer di kirew uuntesken feranert wurden as.',
'undo-norev' => 'Det feranrang küd ei turagsaat wurd, auer diar niks as of auer det sidj stregen wurden as.',
'undo-summary' => 'Feranrang $1 faan [[Special:Contributions/$2|$2]] ([[User talk:$2|Diskusjuun]]) turagsaat.',
+'undo-summary-username-hidden' => 'Feranrang $1 faan en ferbürgenen brüker turagsaat',
# Account creation failure
'cantcreateaccounttitle' => 'Det brükerkonto koon ei iinracht wurd',
@@ -1003,6 +1062,7 @@ A nawigatjuun links saat ales weder turag üüb di ual stant.',
'compareselectedversions' => 'Werjuunen ferglik',
'showhideselectedversions' => 'Werjuunen wise of fersteeg',
'editundo' => 'turagsaat',
+'diff-empty' => '(nään ferskeel)',
'diff-multi' => '({{PLURAL:$1|Ian werjuun diartesken|$1 werjuunen diartesken}} faan {{PLURAL:$2|ään brüker|$2 brükern}} {{PLURAL:$1|woort|wurd}} ei uunwiset)',
'diff-multi-manyusers' => '({{PLURAL:$1|Ian werjuun diartesken|$1 werjuunen diartesken}} faan muar üs $2 {{PLURAL:$2|brüker|brükern}} wurd ei uunwiset)',
'difference-missing-revision' => "{{PLURAL:$2|Ian werjuun|$2 werjuunen}} faan di ferskeel ($1) {{PLURAL:$2|as|san}} ei fünjen wurden.
@@ -1030,7 +1090,6 @@ Dü könst det uun't [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}}
'searchmenu-legend' => 'Säkmöölikhäide',
'searchmenu-exists' => "'''Deer as en sid nååmd \"[[:\$1]]\" önj jüdeer Wiki'''",
'searchmenu-new' => "'''Maage det sidj „[[:$1]]“ uun detheer wiki.'''",
-'searchhelp-url' => 'Help:Auersicht',
'searchmenu-prefix' => '[[Special:PrefixIndex/$1|Wise aal jo sidjen, diar so began]]',
'searchprofile-articles' => 'Artiikler',
'searchprofile-project' => 'Halep- an Projektsidjen',
@@ -1071,15 +1130,7 @@ Dü könst det uun't [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}}
'powersearch-togglenone' => 'Nianen',
'search-external' => 'Schük ekstern',
'searchdisabled' => 'Det schüken üüb {{SITENAME}} as ei aktiif. Dü könst uuntesken mä Google schük. Seenk diaram, dat Google sin steegwurden miast ei üüb a leetst stant san.',
-
-# Quickbar
-'qbsettings' => 'Sidjenliist',
-'qbsettings-none' => 'Niinj',
-'qbsettings-fixedleft' => 'Lachts, fääst',
-'qbsettings-fixedright' => 'Rochts, fääst',
-'qbsettings-floatingleft' => 'Lachts, auergung',
-'qbsettings-floatingright' => 'Rochts, auergung',
-'qbsettings-directionality' => 'Fääst, hinget faan di skriiwwai faan det spriak uf',
+'search-error' => "Diar as wat skiaf gingen bi't schüken: $1",
# Preferences page
'preferences' => 'Iinstelangen',
@@ -1113,7 +1164,6 @@ Dü könst det uun't [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}}
'resetprefs' => 'Wech diarmä',
'restoreprefs' => 'Normool iinstelangen weder haale (uun arke kirew)',
'prefs-editing' => 'Bewerke',
-'prefs-edit-boxsize' => "Grate faan't wönang tu't bewerkin:",
'rows' => 'Räen:',
'columns' => 'Spleder:',
'searchresultshead' => 'Schük',
@@ -1124,7 +1174,9 @@ Dü könst det uun't [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}}
'recentchangesdays-max' => 'Ei muar üs {{PLURAL:$1|ään dai|$1 daar}}',
'recentchangescount' => 'Soföl feranrangen skel uunwiset wurd:',
'prefs-help-recentchangescount' => 'Det san a leetst feranrangen, werjuunen an logbuken.',
-'prefs-help-watchlist-token' => "Wan dü detdiar fial mä en hiamelken code ütjfalst, woort en RSS-feed iinracht. Arken mä didiar code koon do sä, wat dü uun't uug behual wel. Diaram skul hi ei so ianfach wees, nem dach didiar: $1",
+'prefs-help-watchlist-token2' => "Detdiar as di hiamelk kai för't webfeed mä sidjen, diar dü uun't uug behual wel.
+Mä didiar kai koon arken jodiar sidjen beluke, diaram skulst dü ham ei widjerdu.
+[[Special:ResetTokens|Trak diar]], wan dü ham turagsaat wel.",
'savedprefs' => 'Din iinstelangen san seekert wurden.',
'timezonelegend' => 'Tidjsoon:',
'localtime' => 'Lokaal tidj:',
@@ -1155,7 +1207,6 @@ Dü könst det uun't [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}}
'prefs-reset-intro' => 'Üüb detdiar sidj könst dü weder a normool iinstelangen iinracht.
Do san jo ual iinstelangen wech.',
'prefs-emailconfirm-label' => 'E-Mail gudkäänd:',
-'prefs-textboxsize' => "Grate faan't wönang tu bewerkin",
'youremail' => 'E-mail:',
'username' => '{{GENDER:$1|Brükernööm}}:',
'uid' => '{{GENDER:$1|Brükerkäänang}}:',
@@ -1187,6 +1238,8 @@ Arken koon det lees.',
'prefs-dateformat' => "Formaat faan't dootem",
'prefs-timeoffset' => 'Ferskeel faan a klooktidj',
'prefs-advancedediting' => 'Algemian',
+'prefs-editor' => 'Skriiwer',
+'prefs-preview' => 'Föörskau',
'prefs-advancedrc' => 'Ütjwidjet mögelkhaiden',
'prefs-advancedrendering' => 'Ütjwidjet mögelkhaiden',
'prefs-advancedsearchoptions' => 'Ütjwidjet mögelkhaiden',
@@ -1194,7 +1247,9 @@ Arken koon det lees.',
'prefs-displayrc' => "Mögelkhaiden för't uunwisin",
'prefs-displaysearchoptions' => "Mögelkhaiden för't uunwisin",
'prefs-displaywatchlist' => "Mögelkhaiden för't uunwisin",
+'prefs-tokenwatchlist' => 'Token',
'prefs-diffs' => 'Ferskeel',
+'prefs-help-prefershttps' => 'Detdiar iinstelang täält, wan dü di naist tooch uunmeldest.',
# User preference: email validation using jQuery
'email-address-validity-valid' => 'Detdiar E-Mail-adres schocht gud ütj.',
@@ -1221,6 +1276,8 @@ Arken koon det lees.',
'userrights-notallowed' => 'Dü heest ei det rocht, am brükerrochten tu feranrin.',
'userrights-changeable-col' => 'Lasmootskapen, diar dü feranre könst',
'userrights-unchangeable-col' => 'Lasmootskapen, diar dü ei feranre könst',
+'userrights-conflict' => "Konflikt bi't feranrin faan brükerrochten! Du din feranrangen noch ans iin.",
+'userrights-removed-self' => 'Dü heest din aanj brükerrochtem stregen. Dü könst nü ei muar üüb det sidj tugrip.',
# Groups
'group' => 'Skööl:',
@@ -1286,10 +1343,19 @@ Arken koon det lees.',
'right-proxyunbannable' => 'Ãœtjnoom faan automaatisk proxy-speren',
'right-unblockself' => 'Sper apheew för ään salew',
'right-protect' => 'Sidjenseekerhaid feranre an kaskaaden-seekert sidjen bewerke',
+'right-editprotected' => 'Sidjen bewerke, diar mä „{{int:protect-level-sysop}}“ seekert san.',
+'right-editsemiprotected' => 'Sidjen bewerke, diar mä „{{int:protect-level-autoconfirmed}}“ seekert san.',
'right-editinterface' => 'Brüker-skak bewerke',
'right-editusercssjs' => 'CSS- an JavaScript-datein faan ööder brükern bewerke',
'right-editusercss' => 'CSS-datein faan ööder brükern bewerke',
'right-edituserjs' => 'JavaScript-datein faan ööder brükern bewerke',
+'right-editmyusercss' => 'Aanj CSS-datein bewerke',
+'right-editmyuserjs' => 'Aanj JavaScript-datein bewerke',
+'right-viewmywatchlist' => "Sidjen uunluke, diar ik uun't uug behual wal",
+'right-editmywatchlist' => "Sidjen bewerke, diar dü uun't uug behual wel. Enkelt aktjuunen kön diar wat saner din dun feranre.",
+'right-viewmyprivateinfo' => 'Aanj priwoot dooten uunluke (t.b. e-mail-adres, rocht nööm)',
+'right-editmyprivateinfo' => 'Aanj priwoot dooten bewerke (t.b. e-mail-adres, rocht nööm)',
+'right-editmyoptions' => 'Aanj iinstelangen bewerke',
'right-rollback' => 'Feranrangen faan di leetst brüker gau turagsaat',
'right-markbotedits' => 'Gau turagsaatangen üs bot-iindracher kääntiakne',
'right-noratelimit' => 'Ei troch limits beskäären',
@@ -1351,12 +1417,19 @@ Arken koon det lees.',
'action-userrights-interwiki' => 'brükerrochten uun ööder Wikis tu bewerkin',
'action-siteadmin' => 'det dootenbeenk tu sperin an eebentumaagin',
'action-sendemail' => 'e-mails tu schüüren',
+'action-editmywatchlist' => "sidjen, diar dü uun't uug behual wel, tu bewerkin",
+'action-viewmywatchlist' => "sidjen uuntulukin, diar dü uun't uug behual wel",
+'action-viewmyprivateinfo' => 'din priwoot dooten uuntulukin',
+'action-editmyprivateinfo' => 'din priwoot dooten tu bewerkin',
# Recent changes
'nchanges' => '$1 {{PLURAL:$1|feranrang|feranrangen}}',
+'enhancedrc-since-last-visit' => '$1 {{PLURAL:$1|sant dan leetst beschük}}',
+'enhancedrc-history' => 'Ferluup',
'recentchanges' => 'Leetst feranrangen',
'recentchanges-legend' => "Iinstelangen för't uunwisin",
'recentchanges-summary' => "Üüb detdiar sidj könst dü a leetst feranrangen faan't Nordfriisk Wikipedia ferfulge.",
+'recentchanges-noresult' => 'Uun di uunjiwen tidjrüm san sok feranrangen ei föörnimen wurden.',
'recentchanges-feed-description' => "Mä didiar feed könst dü a leetst feranrangen faan't Nordfriisk Wikipedia ferfulge.",
'recentchanges-label-newpage' => 'Nei sidj uunlaanj',
'recentchanges-label-minor' => 'Letj feranrang',
@@ -1393,7 +1466,6 @@ Arken koon det lees.',
'recentchangeslinked-feed' => 'Feranrangen bi ferlinket sidjen',
'recentchangeslinked-toolbox' => 'Feranrangen bi ferlinket sidjen',
'recentchangeslinked-title' => 'Feranrangen bi sidjen, huar faan "$1" üüb ferwiset woort',
-'recentchangeslinked-noresult' => 'Uun detdiar tidj san jo ferlinket sidjen ei feranert wurden.',
'recentchangeslinked-summary' => "Detdiar spezial-sidj wiset a leetst feranrangen faan ferwiset sidjen (of faan sidjen uun en was kategorii). Sidjen, diar dü [[Special:Watchlist|uun't uug behual]] wel, san '''fäät''' skrewen.",
'recentchangeslinked-page' => 'Sidjennööm:',
'recentchangeslinked-to' => 'Wise feranrangen üüb sidjen, diar heerhen ferwise.',
@@ -1404,7 +1476,7 @@ Arken koon det lees.',
'reuploaddesc' => "Ufbreeg an turag tu't sidj för't huuchschüüren",
'upload-tryagain' => 'Feranert dateibeskriiwang ufsjüür',
'uploadnologin' => 'Ei uunmeldet',
-'uploadnologintext' => 'Dü möist [[Special:UserLogin|önjmälded weese]], am dat dü dootäie huuchsiinje koost.',
+'uploadnologintext' => 'Dü skel di $1, amdat dü datein huuchschüür könst.',
'upload_directory_missing' => 'Det archiif-fertiaknis ($1) as ei diar, an küd faan di webserver uk ei iinracht wurd.',
'upload_directory_read_only' => 'Uun det archiif-fertiaknis ($1) küd faan di webserver ei skrewen wurd.',
'uploaderror' => "Bi't huuchschüüren as wat skiaf gingen",
@@ -1611,7 +1683,6 @@ För a seekerhaid as img_auth.php ei aktiwiaret.',
'http-read-error' => "HTTP-feeler bi't leesen.",
'http-timed-out' => 'Det HTTP-uffraag hää tu loong düüret (time-out).',
'http-curl-error' => "Feeler bi't ufrepen faan det URL: $1",
-'http-host-unreachable' => 'URL küd ei fünjen wurd',
'http-bad-status' => "Feeler bi't HTTP-uffraag: $1 $2",
# Some likely curl errors. More could be added from <http://curl.haxx.se/libcurl/c/libcurl-errors.html>
@@ -1639,6 +1710,9 @@ För a seekerhaid as img_auth.php ei aktiwiaret.',
'listfiles_size' => 'Grate',
'listfiles_description' => 'Beskriiwang',
'listfiles_count' => 'Werjuunen',
+'listfiles-show-all' => 'Ual bilwerjuunen mä iinslütj',
+'listfiles-latestversion' => 'Aktuel werjuun',
+'listfiles-latestversion-no' => 'Naan',
# File description page
'file-anchor-link' => 'Datei',
@@ -1735,6 +1809,13 @@ Iar dü ian strikst, stel seeker, dat diar nian ferwisangen üüb detdetdiar fö
'randompage' => 'Tufelag sidj',
'randompage-nopages' => 'Diar san nian sidjen uun {{PLURAL:$2|nöömrüm|nöömrümer}}: $1.',
+# Random page in category
+'randomincategory' => "Tufelag sidj uun't kategorii",
+'randomincategory-invalidcategory' => '"$1" as üs kategoriinööm ei tuläät.',
+'randomincategory-nopages' => 'Diar san nian sidjen uun [[:Category:$1]].',
+'randomincategory-selectcategory' => "Tufelag sidj uun't kategorii: $1 $2.",
+'randomincategory-selectcategory-submit' => 'Widjer',
+
# Random redirect
'randomredirect' => 'Tufelag widjerfeerang',
'randomredirect-nopages' => 'Uun di nöömrüm „$1“ san nian widjerfeerangen.',
@@ -1760,17 +1841,13 @@ Iar dü ian strikst, stel seeker, dat diar nian ferwisangen üüb detdetdiar fö
'statistics-users-active-desc' => 'Brükern, diar wat bewerket haa uun a leetst {{PLURAL:$1|dai|$1 daar}}',
'statistics-mostpopular' => 'Sidjen mä a miast kliks',
-'disambiguations' => 'Sidjen, diar üüb muardüüdag artiikler ferwise',
-'disambiguationspage' => 'Template:Muardüüdag artiikel',
-'disambiguations-text' => "Jodiar sidjen haa tumanst ian ferwisang üüb en '''muardüüdagen artiikel'''. Ferlicht skul jo beeder direkt üüb det mend sidj ferwise.
-
-En sidj täält üs '''muardüüdag artiikel''', wan hat tumanst ian föörlaag faan det [[MediaWiki:Disambiguationspage|Disambiguationspage]] häält.",
-
'pageswithprop' => 'Sidjen mä en sidjeneegenoort',
'pageswithprop-legend' => 'Sidjen mä en sidjeneegenoort',
'pageswithprop-text' => 'Detheer Spezial-sidj feert sidjen mä was sidjeneegenoorten ap.',
'pageswithprop-prop' => 'Sidjeneegenoort:',
'pageswithprop-submit' => 'Widjer',
+'pageswithprop-prophidden-long' => 'Eegenskapswäärs för lung tekster ferbürgen ($1)',
+'pageswithprop-prophidden-binary' => 'Binär eegenskapswäärs ferbürgen ($1)',
'doubleredirects' => 'Dobelt widjerfeerangen',
'doubleredirectstext' => "Detheer list feert widjerfeerangen ap, diar üüb widjerfeerangen widjer feer.
@@ -1827,6 +1904,7 @@ Uun arke rä stun ferwisangen tu't iarst an ööder widjerfeerang an uk tu det s
'mostrevisions' => 'Sidjen mä miast feranrangen',
'prefixindex' => 'Aal a sidjen (mä prefix)',
'prefixindex-namespace' => 'Aal a sidjen mä prefix (nöömrüm $1)',
+'prefixindex-strip' => 'Prefix uun det list ei uunwise',
'shortpages' => 'Kurt sidjen',
'longpages' => 'Lung sidjen',
'deadendpages' => 'Sidjen saner ferwisangen',
@@ -2015,10 +2093,9 @@ Feranrangen faan detdiar sidj wurd üüb detdiar list fäästhäälen.",
'unwatchthispage' => "Ei muar uun't uug behual",
'notanarticle' => 'Nään artiikel',
'notvisiblerev' => 'Det werjuun faan en öödern brüker as stregen wurden.',
-'watchnochange' => "A sidjen, diar dü uun't uug heest, san uun di uunwiset tidjrüm ei bewerket wurden.",
'watchlist-details' => "Dü heest {{PLURAL:$1|1 sidj|$1 sidjen}} uun't uug.",
'wlheader-enotif' => 'Di e-mail siinst as aktiif.',
-'wlheader-showupdated' => "* Nei feranert sidjen wurd '''fäät''' uunwiset.",
+'wlheader-showupdated' => "Nei feranert sidjen wurd '''fäät''' uunwiset.",
'watchmethod-recent' => "Leetst feranrangen faan sidjen, diar dü uun't uug heest",
'watchmethod-list' => "Sidjen, diar dü uun't uug heest, am a leetst feranrangen beluke",
'watchlistcontains' => "Dü häälst $1 {{PLURAL:$1|sidj|sidjen}} uun't uug.",
@@ -2255,7 +2332,7 @@ $1",
'contributions' => '{{GENDER:$1|Brüker}} bidracher',
'contributions-title' => 'Brükerbidracher för "$1"',
'mycontris' => 'Bidracher',
-'contribsub2' => 'For $1 ($2)',
+'contribsub2' => 'För $1 ($2)',
'nocontribs' => 'Diar wiar nian paasin brükerbidracher',
'uctop' => '(aktuel)',
'month' => 'faan muun (of iarer):',
@@ -2410,14 +2487,12 @@ Luke bi't [[Special:BlockList|sperlist]] för aal jo aktuel speren.",
'ipb_blocked_as_range' => 'Feeler: Det IP-adres $1 as auer det widjloftag sper $2 speret. Det sper faan $1 alian koon ei apheewen wurd.',
'ip_range_invalid' => 'Ferkiard IP-adresrüm',
'ip_range_toolarge' => 'Adresrümen mut ei grater üs /$1 wees.',
-'blockme' => 'Spere mi',
'proxyblocker' => 'Proxy blocker',
-'proxyblocker-disabled' => 'Detdiar funktjuun as ei aktiif',
'proxyblockreason' => 'Din IP-adres as speret wurden, auer det tu en eebenen proxy hiart.
Fertel det dan ISP of dan süsteemsiinst. Eeben proxys stel det seekerhaid uun fraag.',
-'proxyblocksuccess' => 'Klaar.',
'sorbsreason' => 'Din IP-adres as uun det DNSBL faan {{SITENAME}} üs eeben proxy apfeerd.',
'sorbs_create_account_reason' => 'Din IP-adres as uun det DNSBL faan {{SITENAME}} üs eeben proxy apfeerd. Dü könst nian brükerkonto maage.',
+'xffblockreason' => 'En IP-adres uun di X-Forwarded-For-Header as speret wurden, det as din aanj of det faan dan proxy server. Di spergrünj as: $1',
'cant-block-while-blocked' => 'Dü könst nian ööder brükern spere, so loong dü salew speret beest.',
'cant-see-hidden-user' => 'Di brüker, diar dü spere wel, as al speret an ferbürgen. Dü heest oober ei det "hideuser"-rocht an könst det sper ei bewerke.',
'ipbblocked' => 'Dü könst ööder brükern ei spere an uk nian speren apheew, auer dü salew speret beest.',
@@ -2573,6 +2648,8 @@ Wees so gud an beschük a sidjen [//www.mediawiki.org/wiki/Localisation MediaWik
'thumbnail-more' => 'Fergratre',
'filemissing' => 'Datei ei diar',
'thumbnail_error' => "Bi't skriiwen faan det föörskaubil as wat skiaf gingen: $1",
+'thumbnail_error_remote' => 'Feeler faan $1:
+$2',
'djvu_page_error' => 'DjVu-sidj as bütjen faan a sidjenrüm',
'djvu_no_xml' => 'XML-dooten för det DjVu-datei kön ei ufrepen wurd',
'thumbnail-temp-create' => 'Det datei för det tidjwiis sümnaielbil küd ei skrewen wurd',
@@ -2862,11 +2939,25 @@ $1",
'minutes' => '{{PLURAL:$1|$1 minüüt|$1 minüüten}}',
'hours' => '{{PLURAL:$1|$1 stünj|$1 stünjen}}',
'days' => '{{PLURAL:$1|$1 dai|$1 daar}}',
+'weeks' => '{{PLURAL:$1|$1 weg|$1 wegen}}',
'months' => '{{PLURAL:$1|$1 muun|$1 muuner}}',
'years' => '{{PLURAL:$1|$1 juar|$1 juaren}}',
'ago' => 'föör $1',
'just-now' => 'jüst nü',
+# Human-readable timestamps
+'hours-ago' => 'föör {{PLURAL:$1|ian stünj|$1 stünjen}}',
+'minutes-ago' => 'föör {{PLURAL:$1|ian minüüt|$1 minüüten}}',
+'seconds-ago' => 'föör {{PLURAL:$1|ian sekund|$1 sekunden}}',
+'monday-at' => 'Mundai am a klook $1',
+'tuesday-at' => 'Teisdai am a klook $1',
+'wednesday-at' => 'Wäärnsdai am a klook $1',
+'thursday-at' => 'Süürsdai am a klook $1',
+'friday-at' => 'Freidai am a klook $1',
+'saturday-at' => 'Saninj am a klook $1',
+'sunday-at' => 'Söndai am a klook $1',
+'yesterday-at' => 'Jister am a klook $1',
+
# Bad image list
'bad_image_list' => 'Formaat:
@@ -2894,7 +2985,7 @@ Ferwisangen uun det salew rä wurd üs ütjnoomen uunsen, huar det datei dach uu
* gpslongitude
* gpsaltitude',
-# EXIF tags
+# Exif tags
'exif-imagewidth' => 'Breetje',
'exif-imagelength' => 'Hööchde',
'exif-bitspersample' => 'Bits per klöör',
@@ -3072,7 +3163,7 @@ Ferwisangen uun det salew rä wurd üs ütjnoomen uunsen, huar det datei dach uu
'exif-originalimageheight' => "Hööchde faan't bil föör't beklapen",
'exif-originalimagewidth' => "Breetje faan't bil föör't beklapen",
-# EXIF attributes
+# Exif attributes
'exif-compression-1' => 'Ãœnkomprimiaret',
'exif-compression-2' => 'CCITT Group 3 1-Dimensional Modified Huffman run length encoding',
'exif-compression-3' => 'CCITT Group 3 fax encoding',
@@ -3455,7 +3546,6 @@ Dü könst uk det [[Special:EditWatchlist|normool sidj]] tu bewerkin nem.",
'version-other' => 'Ööders wat',
'version-mediahandlers' => 'Ãœtjwidjet medien-funktjuunen',
'version-hooks' => 'Hooks',
-'version-extension-functions' => 'Ãœtjwidjet funktjuunen',
'version-parser-extensiontags' => 'Parser extension tags',
'version-parser-function-hooks' => 'Parser function hooks',
'version-hook-name' => 'Hook nööm',
@@ -3464,6 +3554,7 @@ Dü könst uk det [[Special:EditWatchlist|normool sidj]] tu bewerkin nem.",
'version-license' => 'Lisens',
'version-poweredby-credits' => "Detheer wääbsteed werket mä '''[//www.mediawiki.org/wiki/MediaWiki/de MediaWiki]''', Copyright © 2001–$1 $2.",
'version-poweredby-others' => 'öödern',
+'version-poweredby-translators' => 'Auersaatern faan translatewiki.net',
'version-credits-summary' => 'Wi besoonke üs bi jodiar persuunen för hör bidracher tu [[Special:Version|MediaWiki]].',
'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.
@@ -3477,11 +3568,17 @@ You should have received [{{SERVER}}{{SCRIPTPATH}}/COPYING a copy of the GNU Gen
'version-entrypoints-header-entrypoint' => 'Hüsdörsidj',
'version-entrypoints-header-url' => 'URL',
-# Special:FilePath
-'filepath' => 'Datei-wai',
-'filepath-page' => 'Datei:',
-'filepath-submit' => 'Widjer',
-'filepath-summary' => 'Mä detdiar spezial-sidj könst di hial datei-wai uffraage. Det datei woort geliks wiset of mä en ferbünjen program begand.',
+# Special:Redirect
+'redirect' => 'Widjerfeerang üüb en brükersidj, sidjenwerjuun of datei.',
+'redirect-legend' => 'Widjerfeerang üüb en sidjenwerjuun of datei.',
+'redirect-summary' => 'Det spezial-sidj feert widjer üüb en brükersidj, sidjenwerjuun of datei.',
+'redirect-submit' => 'Widjer',
+'redirect-lookup' => 'Schük:',
+'redirect-value' => 'Käänang of dateinööm:',
+'redirect-user' => 'Brüker-ID',
+'redirect-revision' => 'Sidjenwerjuun',
+'redirect-file' => 'Dateinööm',
+'redirect-not-exists' => 'Wäärs ei fünjen',
# Special:FileDuplicateSearch
'fileduplicatesearch' => 'Schük dobelt datein',
@@ -3531,6 +3628,7 @@ You should have received [{{SERVER}}{{SCRIPTPATH}}/COPYING a copy of the GNU Gen
'tags' => 'Feranrangskääntiaken',
'tag-filter' => '[[Special:Tags|Kääntiaken]] filter:',
'tag-filter-submit' => 'Filter',
+'tag-list-wrapper' => '([[Special:Tags|{{PLURAL:$1|Kääntiaken|Kääntiakens}}]]: $2)',
'tags-title' => 'Kääntiaken',
'tags-intro' => "Det sidj wiset kääntiaken, diar för't bewerkin brükt wurd, an wat jo men.",
'tags-tag' => 'Kääntiaken-nööm',
@@ -3557,6 +3655,7 @@ You should have received [{{SERVER}}{{SCRIPTPATH}}/COPYING a copy of the GNU Gen
'dberr-problems' => 'Dää mi iarag! Det sidj hää technisk komer.',
'dberr-again' => 'Teew en uugenblak an ferschük det noch ans.',
'dberr-info' => '(Koon ei mä a dootenbeenk-server ferbinj: $1)',
+'dberr-info-hidden' => '(Ferbinjang mä a dootenbeenk-server as skiaf gingen)',
'dberr-usegoogle' => 'Uun a teskentidj küdst dü det mä Google ferschük.',
'dberr-outofdate' => 'Seenk diaram, dat Google ferlicht ual dooten uunwiset.',
'dberr-cachederror' => 'Detheer komt ütj en cache an as ferlicht ei muar aktuel.',
@@ -3572,6 +3671,9 @@ You should have received [{{SERVER}}{{SCRIPTPATH}}/COPYING a copy of the GNU Gen
'htmlform-submit' => 'Auerdreeg',
'htmlform-reset' => 'Feranrangen turagsaat.',
'htmlform-selectorother-other' => 'Öödern',
+'htmlform-no' => 'Naan',
+'htmlform-yes' => 'Ja',
+'htmlform-chosen-placeholder' => 'Schük ütj',
# SQLite database support
'sqlite-has-fts' => "Werjuun $1 mä halep för't schüken uun di hialer tekst.",
@@ -3690,4 +3792,19 @@ You should have received [{{SERVER}}{{SCRIPTPATH}}/COPYING a copy of the GNU Gen
# Image rotation
'rotate-comment' => 'Bil am $1 {{PLURAL:$1|graad}} mä a klook dreid.',
+# Limit report
+'limitreport-title' => 'Parser-profiling dooten:',
+'limitreport-cputime' => 'CPU-tidj',
+'limitreport-cputime-value' => '$1 {{PLURAL:$1|sekund|sekunden}}',
+'limitreport-walltime' => 'Würelk tidj',
+'limitreport-walltime-value' => '$1 {{PLURAL:$1|sekund|sekunden}}',
+'limitreport-ppvisitednodes' => 'Taal faan ferbinjangsknooter för di föörproseser',
+'limitreport-ppgeneratednodes' => 'Faan di föörproseser bereegent ferbinjangsknooter',
+'limitreport-postexpandincludesize' => "Grate faan iinbinjangen efter't ütjwidjin",
+'limitreport-postexpandincludesize-value' => '$1/$2 bytes',
+'limitreport-templateargumentsize' => "Grate faan't föörlaagenargument",
+'limitreport-templateargumentsize-value' => '$1/$2 bytes',
+'limitreport-expansiondepth' => 'Maksimaal ütjwidjangsjipde',
+'limitreport-expensivefunctioncount' => 'Taal faan apwendag parser-funktjuunen',
+
);
diff --git a/languages/messages/MessagesFur.php b/languages/messages/MessagesFur.php
index bbd2d613..e5c12116 100644
--- a/languages/messages/MessagesFur.php
+++ b/languages/messages/MessagesFur.php
@@ -141,11 +141,10 @@ $messages = array(
'tog-enotifrevealaddr' => 'Distapone fûr il gno recapit email tai messaçs di notifiche',
'tog-shownumberswatching' => 'Mostre il numar di utents che a stan tignint di voli',
'tog-fancysig' => 'Interprete lis firmis come test wiki (cence un leam automatic)',
-'tog-externaleditor' => 'Dopre un editôr esterni come opzion predeterminade (dome par utents esperts, a coventin impuestazions specifichis, [//www.mediawiki.org/wiki/Manual:External_editors cjale culì par altris informazions.])',
-'tog-externaldiff' => 'Dopre editôr difarencis esterni come opzion predeterminade',
'tog-watchlisthideown' => 'Plate i miei cambiaments inte liste des pagjinis tignudis di voli',
'tog-ccmeonemails' => 'Mandimi une copie dai messaçs che o mandi ai altris utents',
'tog-showhiddencats' => 'Mostre categoriis platadis',
+'tog-useeditwarning' => 'Visimi cuant che o stoi par lassâ une pagjine dulà che a son cambiaments no salvâts',
'underline-always' => 'Simpri',
'underline-never' => 'Mai',
@@ -316,7 +315,7 @@ $messages = array(
'jumptosearch' => 'ricercje',
'pool-errorunknown' => 'Erôr no cognossût',
-# 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).
+# 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).
'aboutsite' => 'Informazions su {{SITENAME}}',
'aboutpage' => 'Project:Informazions',
'copyright' => 'Il contignût al è disponibil sot de $1',
@@ -326,7 +325,6 @@ $messages = array(
'disclaimers' => 'Avîs legâi',
'disclaimerpage' => 'Project:Avîs gjenerâi',
'edithelp' => 'Jutori pai cambiaments',
-'edithelppage' => 'Help:Cambiaments',
'helppage' => 'Help:Contignûts',
'mainpage' => 'Pagjine principâl',
'mainpage-description' => 'Pagjine principâl',
@@ -668,7 +666,6 @@ Leiende: (cur) = difarencis cun la version atuâl, (prec) = difarencis cun la ve
'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',
@@ -704,14 +701,6 @@ Leiende: (cur) = difarencis cun la version atuâl, (prec) = difarencis cun la ve
'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',
-'qbsettings-none' => 'Nissune',
-'qbsettings-fixedleft' => 'Fis a Çampe',
-'qbsettings-fixedright' => 'Fis a Drete',
-'qbsettings-floatingleft' => 'Flutuant a çampe',
-'qbsettings-floatingright' => 'Flutuant a diestre',
-
# Preferences page
'preferences' => 'Preferencis',
'mypreferences' => 'Preferencis',
@@ -735,7 +724,6 @@ Leiende: (cur) = difarencis cun la version atuâl, (prec) = difarencis cun la ve
'resetprefs' => 'Predeterminât',
'restoreprefs' => 'Torne a lis impostazions predeterminadis',
'prefs-editing' => 'Cambiament',
-'prefs-edit-boxsize' => 'Dimensions dal barcon pai cambiaments.',
'rows' => 'Riis',
'columns' => 'Colonis:',
'searchresultshead' => 'Ricercje',
@@ -864,7 +852,6 @@ La tô direzion di pueste no ven mostrade cuant che i utents ti contatin.',
'recentchangeslinked-feed' => 'Cambiaments leâts',
'recentchangeslinked-toolbox' => 'Cambiaments leâts',
'recentchangeslinked-title' => 'Cambiaments leâts a "$1"',
-'recentchangeslinked-noresult' => 'Nissun cambiament aes pagjinis leadis tal periodi specificât.',
'recentchangeslinked-summary' => "Cheste pagjine speciâl e mostre i cambiaments plui recents aes pagjinis leadis a chê specificade (o leadis ai elements intune categorie specificade). Lis [[Special:Watchlist|pagjinis tignudis di voli]] a son mostradis in '''gruessut'''.",
'recentchangeslinked-page' => 'Non de pagjine:',
'recentchangeslinked-to' => 'Mostre dome i cambiaments aes pagjinis leadis a chê specificade',
@@ -993,9 +980,6 @@ La descrizion su la sô [$2 pagjine di descrizion] e je mostrade ca sot.',
'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',
-'disambiguationspage' => 'Template:disambig',
-
'doubleredirects' => 'Re-indreçaments doplis',
'brokenredirects' => 'Re-indreçaments che no funzionin',
@@ -1157,10 +1141,9 @@ e la pagjine e sarà '''gruessute''' te [[Special:RecentChanges|liste dai ultins
'unwatch' => 'No stâ tignî di voli',
'unwatchthispage' => 'No stâ tignî di voli plui',
'notanarticle' => 'Cheste pagjine no je une vôs',
-'watchnochange' => 'Nissun element di chei tignûts di voli al è stât cambiât tal periodi mostrât.',
'watchlist-details' => '{{PLURAL:$1|E je $1 pagjine tignude|A son $1 pagjinis tignudis}} di voli, cence contâ lis pagjinis di discussion.',
-'wlheader-enotif' => '* Notifiche par pueste eletroniche ativade.',
-'wlheader-showupdated' => "* Lis pagjinis gambiadis de ultime volte che tu lis âs cjaladis a son mostradis in '''gruessut'''",
+'wlheader-enotif' => 'Notifiche par pueste eletroniche ativade.',
+'wlheader-showupdated' => "Lis pagjinis gambiadis de ultime volte che tu lis âs cjaladis a son mostradis in '''gruessut'''",
'watchlistcontains' => 'Tu stâs tignint di voli $1 {{PLURAL:$1|pagjine|pagjinis}}.',
'wlnote' => "Ca sot {{PLURAL:$1|al è il cambiament plui recent|a son i '''$1''' cambiaments plui recents}} {{PLURAL:$2|inte ultime ore|intes '''$2''' oris passadis}}.",
'wlshowlast' => 'Mostre ultimis $1 oris $2 zornadis $3',
@@ -1482,8 +1465,6 @@ Par plasê va su [//www.mediawiki.org/wiki/Localisation MediaWiki Localisation]
'nocredits' => 'Nissune informazion sui ricognossiments disponibil par cheste pagjine.',
# Skin names
-'skinname-standard' => 'Classiche',
-'skinname-nostalgia' => 'Nostalgjie',
'skinname-modern' => 'Moderne',
# Browsing diffs
@@ -1535,7 +1516,7 @@ Se il file al è stât cambiât rispiet al so stât origjinâl, cualchi informaz
* gpslongitude
* gpsaltitude',
-# EXIF tags
+# Exif tags
'exif-imagewidth' => 'Largjece',
'exif-imagelength' => 'Altece',
'exif-orientation' => 'Orientament',
@@ -1553,7 +1534,7 @@ Se il file al è stât cambiât rispiet al so stât origjinâl, cualchi informaz
'exif-contrast' => 'Control contrast',
'exif-gpsaltitude' => 'Altitudin',
-# EXIF attributes
+# Exif attributes
'exif-compression-1' => 'Cence compression',
'exif-unknowndate' => 'Date no cognossude',
@@ -1638,9 +1619,6 @@ Se il file al è stât cambiât rispiet al so stât origjinâl, cualchi informaz
'version-license' => 'Licence',
'version-software-version' => 'Version',
-# Special:FilePath
-'filepath-page' => 'Non dal file:',
-
# Special:FileDuplicateSearch
'fileduplicatesearch-filename' => 'Non dal file:',
'fileduplicatesearch-submit' => 'Cîr',
diff --git a/languages/messages/MessagesFy.php b/languages/messages/MessagesFy.php
index 515022f8..db3b20da 100644
--- a/languages/messages/MessagesFy.php
+++ b/languages/messages/MessagesFy.php
@@ -172,9 +172,6 @@ $messages = array(
'tog-shownumberswatching' => 'It tal brûkers sjen litte dat dizze side folget',
'tog-oldsig' => 'Hûdige sinjatuerprintallyk:',
'tog-fancysig' => 'Sinjatuer as wikitekst behannelje (sûnder automatyske keppeling)',
-'tog-externaleditor' => 'Standert in eksterne tekstbewurker brûke (allinne foar experts - foar dizze funksje binne spesjale ynstellings nedich)',
-'tog-externaldiff' => 'Standert in ekstern ferlikingsprogramma brûke (allinne foar experts - foar dizze funksje binne spesjale ynstellings nedich)',
-'tog-showjumplinks' => '"gean nei"-tapaslikens-links ynskeakelje',
'tog-uselivepreview' => '"live proefbyld" brûke (JavaScript nedich - eksperimenteel)',
'tog-forceeditsummary' => 'Warskôgje at ik de gearfetting leech lit.',
'tog-watchlisthideown' => 'Eigen bewurkings op myn folchlist ferbergje',
@@ -360,7 +357,7 @@ Wachtsje efkes foardatsto op 'e nij tagong ta dizze side probearrest te krijen.
$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).
+# 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).
'aboutsite' => 'Oer de {{SITENAME}}',
'aboutpage' => 'Project:Ynfo',
'copyright' => 'Ynhâld is beskikber ûnder de $1.',
@@ -370,7 +367,6 @@ $1",
'disclaimers' => 'Foarbehâld',
'disclaimerpage' => 'Project:Algemien foarbehâld',
'edithelp' => 'Bewurk-help',
-'edithelppage' => 'Help:Bewurk-rie',
'helppage' => 'Help:Help',
'mainpage' => 'Haadside',
'mainpage-description' => 'Haadside',
@@ -435,16 +431,6 @@ $1",
# General errors
'error' => 'Fout',
'databaseerror' => 'Databankfout',
-'dberrortext' => 'Sinboufout in databankfraach.
-De lêst besochte databankfraach wie:
-<blockquote><tt>$1</tt></blockquote>
-fan funksje "<tt>$2</tt>" út.
-MySQL joech fout "<tt>$3: $4</tt>" werom.',
-'dberrortextcl' => 'Sinboufout yn databankfraach.
-De lêst besochte databankfraach wie:
-"$1"
-fanút funksje "$2" .
-MySQL joech fout "$3: $4"',
'laggedslavemode' => 'Warskôging: Mûglik binne resinte bewurkings noch net trochfierd.',
'readonly' => "Databank is 'Net-skriuwe'.",
'enterlockreason' => "Skriuw wêrom de databank 'net-skriuwe' makke is, en hoenear't men wêr nei alle gedachten wer skriuwe kin.",
@@ -489,7 +475,6 @@ Query: $2',
'viewsourcetext' => 'Jo kinne de boarnetekst fan dizze side besjen en kopiearje:',
'protectedinterface' => "Dizze side befettet tekst foar berjochten fan 'e software en is befeilige om misbrûk tefoaren te kommen.",
'editinginterface' => "'''Warskôging;''' Jo bewurkje in side dy't brûkt wurdt troch software. Bewurkings op dizze side beynfloedzje de gebrûksynterface fan elkenien. Oerweagje foar oersettings [//translatewiki.net/wiki/Main_Page?setlang=fy translatewiki.net] te brûken, it oersetprojekt foar MediaWiki.",
-'sqlhidden' => '(SQL query ferburgen)',
'cascadeprotected' => 'Dizze side is skoattele tsjin wizigjen, om\'t der in ûnderdiel útmakket fan de neikommende {{PLURAL:$1|side|siden}}, dy\'t skoattele {{PLURAL:$1|is|binne}} mei de "ûnderlizzende siden" opsje ynskeakele: $2',
'namespaceprotected' => "Jo hawwe gjin rjochten om siden yn'e nammerûmte '''$1''' te bewurkjen.",
'ns-specialprotected' => "Siden yn'e nammerûmte {{ns:special}} kinne net bewurke wurde.",
@@ -585,7 +570,7 @@ Jo moatte efkes wachtsje foar't jo it op'e nij besykje kinne.",
'newpassword' => 'Nij wachtwurd',
'retypenew' => 'Nij wachtwurd (nochris)',
'resetpass_submit' => 'Wachtwurd ynstelle en oanmelde',
-'resetpass_success' => 'Jo wachtwurd is feroare. Dwaande mei oanmelden ...',
+'changepassword-success' => 'Jo wachtwurd is feroare. Dwaande mei oanmelden ...',
'resetpass_forbidden' => 'Wachtwurden kinne net feroare wurde',
'resetpass-no-info' => "Jo moatte oanmeld wêze foar't Jo dizze side brûke kinne.",
'resetpass-submit-loggedin' => 'Wachtwurd feroarje',
@@ -919,7 +904,6 @@ Prebearje in oare sykopdracht.',
'searchmenu-legend' => 'Sykopsjes',
'searchmenu-exists' => "'''Der is in side mei namme \"[[:\$1]]\" yn dizze wiki'''",
'searchmenu-new' => "'''Meitsje de side \"[[:\$1]]\" yn dizze wiki!'''",
-'searchhelp-url' => 'Help:Help',
'searchmenu-prefix' => '[[Special:PrefixIndex/$1|Sidenammen mei dit foarheaksel werjaan]]',
'searchprofile-articles' => 'Ynhâldlike siden',
'searchprofile-project' => 'Projektsiden',
@@ -961,14 +945,6 @@ Jo kinne ek in nammerûmte as foarheaksel brûke.",
'search-external' => 'Utwindich sykje',
'searchdisabled' => '<p>Op it stuit stiet it trochsykjen fan tekst út omdat dizze funksje tefolle kompjûterkapasiteit ferget. As we nije apparatuer krije, en dy is ûnderweis, dan wurdt dizze funksje wer aktyf. Oant salang kinne jo sykje fia Google:</p>',
-# Quickbar
-'qbsettings' => 'Menu',
-'qbsettings-none' => 'Ut',
-'qbsettings-fixedleft' => 'Lofts fêst',
-'qbsettings-fixedright' => 'Rjochts fêst',
-'qbsettings-floatingleft' => 'Lofts sweevjend',
-'qbsettings-floatingright' => 'Rjochts sweevjend',
-
# Preferences page
'preferences' => 'Ynstellings',
'mypreferences' => 'Myn foarkarynstellings',
@@ -993,7 +969,6 @@ Jo kinne ek in nammerûmte as foarheaksel brûke.",
'resetprefs' => 'Ynstellings werom sette',
'restoreprefs' => 'Tebek nei de standertynstellings',
'prefs-editing' => 'Siden bewurkje',
-'prefs-edit-boxsize' => 'Ofmjittings fan it bewurkingsfinster',
'rows' => 'Rigen',
'columns' => 'Kolommen',
'searchresultshead' => 'Sykje',
@@ -1028,7 +1003,6 @@ Jo kinne ek in nammerûmte as foarheaksel brûke.",
'prefs-files' => 'Triemen',
'prefs-custom-js' => 'Persoanlik JS',
'prefs-emailconfirm-label' => 'Netpostbefêstiging:',
-'prefs-textboxsize' => 'Ofmjittings bewurkingsskerm',
'youremail' => 'Jo netpostadres:',
'username' => 'Meidochnamme:',
'uid' => 'Wikinûmer:',
@@ -1237,7 +1211,6 @@ Jo kinne ek oaren de mûglikheid jaan kontakt mei jo op te nimmen troch in ferwi
'recentchangeslinked-feed' => 'Folgje keppelings',
'recentchangeslinked-toolbox' => 'Folgje keppelings',
'recentchangeslinked-title' => 'Feroarings yn ferbân mei "$1"',
-'recentchangeslinked-noresult' => "Der hawwe gjin bewurkings yn 'e bedoelde perioade west op'e siden dy't hjirwei linke wurde.",
'recentchangeslinked-summary' => "Dizze spesjale side lit de lêste bewurkings sjen op siden dy't keppele wurde fan in spesifisearre side ôf (of fan in spesifisearre Kategory ôf). Siden dy't op [[Special:Watchlist|jo folchlist]] steane, wurde '''tsjûk''' werjûn.",
'recentchangeslinked-page' => 'Sidenamme:',
'recentchangeslinked-to' => 'Feroarings oan siden mei ferwizings nei dizze side besjen',
@@ -1494,11 +1467,6 @@ Ferjit net de "Wat is hjirmei keppele" nei te gean foar it fuortheljen fan dit s
'statistics-users-active-desc' => "Brûkers dy't yn 'e ôfrûne {{PLURAL:$1|dei|$1 dagen}} in hanneling útfierd hawwe",
'statistics-mostpopular' => 'Meast besjoene siden',
-'disambiguations' => 'Betsjuttingssiden',
-'disambiguationspage' => 'Template:Neibetsjuttings',
-'disambiguations-text' => "De ûndersteande siden keppelje mei in '''Betsjuttingssiden'''.
-Se soenen mei de side sels keppele wurde moatte.<br /> In side wurdt sjoen as betsjuttingssiden, as de side ien berjocht fan [[MediaWiki:Disambiguationspage]] brûkt.",
-
'doubleredirects' => 'Dûbelde synonimen',
'doubleredirectstext' => '<b>Let op!</b> Der kinne missen yn dizze list stean! Dat komt dan ornaris troch oare keppelings ûnder de "#REDIRECT". Eltse rigel jout keppelings nei it earste synonym, it twadde synonym en dan it werklike doel.',
'double-redirect-fixed-move' => '[[$1]] is ferplakt en is no in trochferwizing nei [[$2]]',
@@ -1697,7 +1665,6 @@ At jo letter in side net mear folgje wolle, dan brûke jo op dy side de keppelin
'unwatch' => 'Ferjit',
'unwatchthispage' => 'Ferjit dizze side',
'notanarticle' => 'Dit kin net folge wurde.',
-'watchnochange' => "Fan de siden dy't jo folgje is der yn dizze perioade net ien feroare.",
'watchlist-details' => 'Jo folchlist hat {{PLURAL:$1|$1 side|$1 siden}}, oerlissiden net meiteld.',
'watchmethod-recent' => 'Koartlyn feroare ...',
'watchmethod-list' => 'Folge ...',
@@ -1946,7 +1913,6 @@ Meld de krekte reden! Neam bygelyks de siden dy't oantaaste waarden.",
'ipb_expiry_invalid' => 'Tiid fan ferrinnen is net goed.',
'ipb_already_blocked' => '"$1" is al útsluten',
'ipb_cant_unblock' => 'Flater: It útsluten fan ID $1 kin net fûn wurde. It is miskien al net mear útsluten.',
-'proxyblocksuccess' => 'Dien.',
# Developer tools
'lockdb' => "Meitsje de database 'Net-skriuwe'",
@@ -2118,10 +2084,6 @@ Sjoch: [//www.mediawiki.org/wiki/Localisation MediaWiki Localisation], [//transl
'spamprotectiontext' => "De side dy't jo fêstlizze woene is blokkearre troch in spam filter. Dit wurdt wierskynlik feroarsake troch in ferwizing nei in ekstern webstee.",
'spamprotectionmatch' => 'De neikommende tekst hat it spam filter aktivearre: $1',
-# Skin names
-'skinname-standard' => 'Standert',
-'skinname-nostalgia' => 'Nostalgy',
-
# Patrolling
'markaspatrolleddiff' => 'Markearje as kontroleare',
'markaspatrolledtext' => 'Markearje dizze side as kontrolearre',
@@ -2179,7 +2141,7 @@ Alle folgjende links dy't op deselde rigel steane, wurde behannele as útsûnder
* gpslongitude
* gpsaltitude',
-# EXIF tags
+# Exif tags
'exif-samplesperpixel' => 'Oantal komponinten',
'exif-xresolution' => 'Horizontale resolúsje',
'exif-yresolution' => 'Fertikale resolúsje',
@@ -2317,11 +2279,6 @@ Wolle jo de side wier op 'e nij skriuwe?",
'version-software-product' => 'Produkt',
'version-software-version' => 'Ferzje',
-# Special:FilePath
-'filepath' => 'Triempad',
-'filepath-page' => 'Triem:',
-'filepath-submit' => 'Pad',
-
# Special:FileDuplicateSearch
'fileduplicatesearch' => 'Sykje op duplikaten',
'fileduplicatesearch-legend' => 'Sykje op duplikaten',
diff --git a/languages/messages/MessagesGa.php b/languages/messages/MessagesGa.php
index 8a51059f..782df491 100644
--- a/languages/messages/MessagesGa.php
+++ b/languages/messages/MessagesGa.php
@@ -126,9 +126,6 @@ $messages = array(
'tog-shownumberswatching' => 'Taispeán an méid úsáideoirí atá ag faire',
'tog-oldsig' => 'Réamhamharc ar an síniú atá ann:',
'tog-fancysig' => 'Sínithe bunúsacha mar vicítéacs (gan nasc uathoibríoch)',
-'tog-externaleditor' => 'Bain úsáid as eagarthóir seachtrach mar réamhshocrú (saineolaithe amháin, tá socrú speisialta de dhíth ort. [//www.mediawiki.org/wiki/Manual:External_editors Tuilleadh eolais.])',
-'tog-externaldiff' => 'Bain úsáid as difríocht sheachtrach mar réamhshocrú (saineolaithe amháin, tá socrú speisialta de dhíth ort. [//www.mediawiki.org/wiki/Manual:External_editors Tuilleadh eolais.])',
-'tog-showjumplinks' => 'Cumasaigh naisc insroichteachta “léim go dtíâ€',
'tog-uselivepreview' => 'Bain úsáid as réamhamharc beo (JavaScript) (Turgnamhach)',
'tog-forceeditsummary' => 'Cuir in iúl dom nuair a chuirim isteach achoimre eagair folamh',
'tog-watchlisthideown' => 'Folaigh mo chuid athruithe ón liosta faire',
@@ -221,7 +218,7 @@ $messages = array(
'listingcontinuesabbrev' => 'ar lean.',
'index-category' => 'Leathanaigh innéacsaithe',
-'linkprefix' => '/^(.*?)([a-zA-Z\\x80-\\xff]+)$/sD',
+'linkprefix' => '/^((?>.*(?<![a-zA-Z\\x80-\\xff])))(.+)$/sD',
'about' => 'Maidir leis',
'article' => 'Leathanach ábhair',
@@ -318,7 +315,7 @@ $messages = array(
'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).
+# 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).
'aboutsite' => 'Maidir leis an {{SITENAME}}',
'aboutpage' => 'Project:Maidir leis',
'copyright' => 'Tá an t-ábhar le fáil faoin $1.',
@@ -328,7 +325,6 @@ $messages = array(
'disclaimers' => 'Séanadh',
'disclaimerpage' => 'Project:Séanadh_ginearálta',
'edithelp' => 'Cabhair eagarthóireachta',
-'edithelppage' => 'Help:Eagarthóireacht',
'helppage' => 'Help:Clár_ábhair',
'mainpage' => 'Príomhleathanach',
'mainpage-description' => 'Príomhleathanach',
@@ -354,7 +350,6 @@ $messages = array(
'newmessagesdifflink' => 'difear ón leasú leathdhéanach',
'youhavenewmessagesmulti' => 'Tá teachtaireachtaí nua agat ar $1',
'editsection' => 'athraigh',
-'editsection-brackets' => '[$1]',
'editold' => 'athraigh',
'viewsourceold' => 'féach ar foinse',
'editlink' => 'cur in eagar',
@@ -404,17 +399,6 @@ Tá liosta de leathanaigh speisialta bhailí ar fáil ag [[Special:SpecialPages|
# General errors
'error' => 'Earráid',
'databaseerror' => 'Earráid sa bhunachar sonraí',
-'dberrortext' => 'Tharla earráid chomhréire in iarratas chuig an mbunachar sonraí.
-B\'fhéidir gur fabht sa bhogearraí é seo.
-Seo é an t-iarratas deireanach chuig an mbunachar sonrai:
-<blockquote><tt>$1</tt></blockquote>
-ón bhfeidhm "<tt>$2</tt>".
-Thug MySQL an earráid seo: "<tt>$3: $4</tt>".',
-'dberrortextcl' => 'Tharla earráid chomhréire in iarratas chuig an bhunachar sonraí.
-"$1",
-ón bhfeidhm "$2",
-ab ea an t-iarratas deireanach chuig an mbunachar sonrai.
-Thug MySQL an earráid seo: "$3: $4".',
'laggedslavemode' => "Rabhadh: B'fhéidir nach bhfuil na nuashonrúcháin is déanaí le feiceáil ar an leathanach seo.",
'readonly' => 'Bunachar sonraí faoi ghlas',
'enterlockreason' => 'Iontráil cúis don glasáil, agus meastachán
@@ -464,7 +448,6 @@ Bain trial arís as i gcionn cúpla bomaite más é do thoil é.',
'viewsourcetext' => 'Is féidir foinse an leathanach seo a fheiceáil ná a cóipeáil:',
'editinginterface' => "'''Rabhadh:''' Tá tú ag athrú leathanaigh a bhfuil téacs comhéadain do na bogearraí air. Cuirfear athruithe ar an leathanach seo i bhfeidhm ar an gcomhéadan úsáideora.
Más maith leat MediaWiki a aistriú, cuimhnigh ar [//translatewiki.net/wiki/Main_Page?setlang=ga translatewiki.net] (tionscadal logánaithe MediaWiki) a úsáid.",
-'sqlhidden' => '(Iarratas SQL folaithe)',
'namespaceprotected' => "Ní chead agat leathanaigh a chur in eagar san ainmspás '''$1'''.",
'ns-specialprotected' => 'Ní féidir leathanaigh speisialta a chur in eagar.',
'titleprotected' => "Tá an teideal seo cosanta ar chruthú le [[User:$1|$1]].
@@ -482,6 +465,7 @@ Tabhair faoi deara go taispeáinfear roinnt leathanaigh mar atá tú logáilte i
'welcomeuser' => 'Fáilte, $1!',
'welcomecreation-msg' => 'Cruthaíodh do chuntas.',
'yourname' => "D'ainm úsáideora",
+'userlogin-yourname' => 'Ainm úsáideora',
'yourpassword' => "D'fhocal faire",
'yourpasswordagain' => "Athiontráil d'fhocal faire",
'remembermypassword' => "Cuimhnigh ar m'fhocal faire ar an ríomhaire seo (ar feadh uastréimhse de $1 {{PLURAL:$1|lá|lá}})",
@@ -501,8 +485,14 @@ Tabhair faoi deara go taispeáinfear roinnt leathanaigh mar atá tú logáilte i
'gotaccount' => "An bhfuil cuntas agat cheana féin? '''$1'''.",
'gotaccountlink' => 'Logáil isteach',
'userlogin-resetlink' => 'Sonraí logála isteach dearmadta agat?',
+'createacct-emailrequired' => 'Seoladh ríomhphoist',
+'createacct-email-ph' => 'Iontráil do sheoladh ríomhphoist',
+'createacct-another-email-ph' => 'Iontráil seoladh ríomhphoist',
'createaccountmail' => 'le ríomhphost',
'createaccountreason' => 'Fáth:',
+'createacct-reason' => 'Cúis',
+'createacct-submit' => 'Cruthaigh do chuntas',
+'createacct-another-submit' => 'Cruthaigh cuntas eile',
'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.',
@@ -795,7 +785,6 @@ Treoir: (rth) = difríocht ón leagan reatha, (rmh) = difríocht ón leagan roim
'viewprevnext' => 'Taispeáin ($1 {{int:pipe-separator}} $2) ($3).',
'searchmenu-legend' => 'Sainroghanna cuardaithe',
'searchmenu-new' => "'''Cruthaigh an leathanach \"[[:\$1]]\" ar an vicí seo!'''",
-'searchhelp-url' => 'Help:Clár_ábhair',
'searchprofile-articles' => 'Leathanaigh ábhair',
'searchprofile-project' => 'Leathanaigh thionscadail agus cabhair',
'searchprofile-images' => 'Ilmheáin',
@@ -831,14 +820,6 @@ Bain triail as ''all:'' a chur roimh d'iarratas chun an t-inneachar ar fad (leat
'powersearch-togglenone' => 'Tada',
'searchdisabled' => "Tá brón orainn! Mhíchumasaíodh an cuardach téacs iomlán go sealadach chun luas an tsuímh a chosaint. Idir an dá linn, is féidir leat an cuardach Google anseo thíos a úsáid - b'fhéidir go bhfuil sé as dáta.",
-# Quickbar
-'qbsettings' => 'Sainroghanna an bosca uirlisí',
-'qbsettings-none' => 'Faic',
-'qbsettings-fixedleft' => 'Greamaithe ar chlé',
-'qbsettings-fixedright' => 'Greamaithe ar dheis',
-'qbsettings-floatingleft' => 'Ag faoileáil ar chlé',
-'qbsettings-floatingright' => 'Ag faoileáil ar dheis',
-
# Preferences page
'preferences' => 'Sainroghanna',
'mypreferences' => 'Sainroghanna',
@@ -1009,7 +990,6 @@ do chuid dreachtaí a chur i leith tusa.',
'recentchangeslinked-feed' => 'Athruithe gaolmhara',
'recentchangeslinked-toolbox' => 'Athruithe gaolmhara',
'recentchangeslinked-title' => 'Athruithe gaolmhara le "$1"',
-'recentchangeslinked-noresult' => 'Níl aon athraithe ar na leathanaigh naiscthe le linn an tréimhse tugtha.',
'recentchangeslinked-summary' => "Seo liosta na n-athruithe atá deanta is déanaí le leathanaigh atá naiscthe as leathanach sonraithe (nó baill an chatagóir sonraithe).
Tá na leathanaigh ar do [[Special:Watchlist|liosta faire]] i '''gcló trom'''.",
'recentchangeslinked-page' => 'Ainm leathanaigh:',
@@ -1144,9 +1124,6 @@ Má theastáilann uait do chomhad a uaslódáil fós, téigh ar ais agus úsáid
'statistics-header-users' => 'Staidreamh úsáideora',
'statistics-pages' => 'Leathanaigh',
-'disambiguations' => 'Leathanaigh idirdhealaithe',
-'disambiguationspage' => '{{ns:project}}:Naisc_go_leathanaigh_idirdhealaithe',
-
'doubleredirects' => 'Athsheoltaí dúbailte',
'doubleredirectstext' => '<b>Tabhair faoi deara:</b> B\'fheidir go bhfuil toraidh bréagacha ar an liosta seo.
De ghnáth cíallaíonn sé sin go bhfuil téacs breise le naisc thíos sa chéad #REDIRECT no #ATHSHEOLADH.<br />
@@ -1302,11 +1279,9 @@ agus beidh '''cló trom''' ar a theideal san [[Special:RecentChanges|liosta de n
'unwatchthispage' => 'Ná fair fós',
'notanarticle' => 'Níl alt ann',
'notvisiblerev' => 'Scriosadh an leagan',
-'watchnochange' => 'Níor athraíodh ceann ar bith de na leathanaigh atá ar do liosta faire,
-taobh istigh den tréimhse atá roghnaithe agat.',
'watchlist-details' => 'Tá tú ag faire ar {{PLURAL:$1|leathanach amháin|$1 leathanaigh}}, gan leathanaigh phlé a chur san áireamh.',
-'wlheader-enotif' => '* Cumasaíodh fógraí riomhphoist.',
-'wlheader-showupdated' => "* Tá '''cló trom''' ar leathanaigh a athraíodh ón uair is deireanaí a d'fhéach tú orthu.",
+'wlheader-enotif' => 'Cumasaíodh fógraí riomhphoist.',
+'wlheader-showupdated' => "Tá '''cló trom''' ar leathanaigh a athraíodh ón uair is deireanaí a d'fhéach tú orthu.",
'watchmethod-recent' => 'ag seiceáil na athruithe deireanacha ar do chuid leathanaigh faire',
'watchmethod-list' => 'ag seiceáil na leathanaigh faire ar do chuid athruithe deireanacha',
'watchlistcontains' => 'Tá {{PLURAL:$1|leathanach amháin|$1 leathanaigh}} ar do liosta faire.',
@@ -1576,7 +1551,6 @@ liosta a fháil de coisc atá i bhfeidhm faoi láthair.',
'proxyblockreason' => "Coisceadh do sheoladh IP dá bharr gur seachfhreastalaí
neamhshlándála is ea é. Déan teagmháil le do chomhlacht idirlín nó le do lucht cabhrach teicneolaíochta
go mbeidh 'fhios acu faoin fadhb slándála tábhachtach seo.",
-'proxyblocksuccess' => 'Rinneadh.',
'sorbsreason' => 'Liostalaítear do sheoladh IP mar sheachfhreastalaí oscailte sa DNSBL.',
# Developer tools
@@ -1788,13 +1762,8 @@ iarradh sábháil. Is dócha gur nasc chuig suíomh seachtrach ba chúis leis.',
'spambot_username' => 'MediaWiki turscar glanadh',
# Skin names
-'skinname-standard' => 'Clasaiceach',
-'skinname-nostalgia' => 'Sean-nós',
'skinname-cologneblue' => 'Gorm Köln',
'skinname-monobook' => 'MonoBook',
-'skinname-myskin' => 'MoChraiceann',
-'skinname-chick' => 'Sicín',
-'skinname-simple' => 'Simplí',
'skinname-modern' => 'Nua-aimseartha',
'skinname-vector' => 'Veicteoir',
@@ -1868,7 +1837,7 @@ Beidh na cinn eile ceilte de réir réamhshocraithe.
* gpslongitude
* gpsaltitude',
-# EXIF tags
+# Exif tags
'exif-imagewidth' => 'Leithead',
'exif-imagelength' => 'Airde',
'exif-bitspersample' => 'Gíotáin sa chomhpháirt',
@@ -1985,7 +1954,7 @@ Beidh na cinn eile ceilte de réir réamhshocraithe.
'exif-languagecode' => 'Teanga',
'exif-iimcategory' => 'Catagóir',
-# EXIF attributes
+# Exif attributes
'exif-compression-1' => 'Neamh-chomhbhrúite',
'exif-unknowndate' => 'Dáta anaithnid',
@@ -2217,11 +2186,6 @@ Rachaidh an cód deimhnithe seo as feidhm ag $4.',
'version-software-version' => 'Leagan',
'version-entrypoints-header-url' => 'URL',
-# Special:FilePath
-'filepath' => 'Cosán comhaid',
-'filepath-page' => 'Comhad:',
-'filepath-submit' => 'Gabh',
-
# Special:FileDuplicateSearch
'fileduplicatesearch-filename' => 'Ainm comhaid:',
'fileduplicatesearch-submit' => 'Cuardaigh',
diff --git a/languages/messages/MessagesGag.php b/languages/messages/MessagesGag.php
index c736abdc..636e8415 100644
--- a/languages/messages/MessagesGag.php
+++ b/languages/messages/MessagesGag.php
@@ -124,9 +124,6 @@ $messages = array(
'tog-enotifrevealaddr' => 'Bildirmää maillerinde e-mail adresimi göster.',
'tog-shownumberswatching' => 'İzlään kullanıcı sayısın göster',
'tog-fancysig' => 'Çii imza (İmzanız görüner nesoy onu yukarda belirttiniz. Sayfanıza avtomatik baalantı yaratılmaycêk)',
-'tog-externaleditor' => 'Düzmää başka editor programmasılan yap',
-'tog-externaldiff' => 'Karşılaştırmakları dış programmalan yap.',
-'tog-showjumplinks' => '"Git" baalantısın işlet',
'tog-uselivepreview' => 'Tez cannı ön siiri kullan (JavaScript) (êksperimental)',
'tog-forceeditsummary' => 'Bana haber ver ne zaman ani kısa annatmanı boş braacam',
'tog-watchlisthideown' => 'Bakmaa listamdan benim diişmäklerimi sakla',
@@ -280,7 +277,7 @@ $messages = array(
'jumptonavigation' => 'kullan',
'jumptosearch' => 'ara',
-# 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).
+# 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).
'aboutsite' => '{{SITENAME}} için',
'aboutpage' => 'Project:Uurunda',
'copyright' => 'İçersindeki $1 altında.',
@@ -290,7 +287,6 @@ $messages = array(
'disclaimers' => 'Cuvapçılık reti',
'disclaimerpage' => 'Project:Genel cuvapçılık reti',
'edithelp' => 'Nesoy var nicä diiştirmää?',
-'edithelppage' => 'Help:Nesoy var nicä sayfa diiştirmää',
'helppage' => 'Help:İçindekilär',
'mainpage' => 'BaÅŸ yaprak',
'mainpage-description' => 'BaÅŸ yaprak',
@@ -576,7 +572,6 @@ Nışannar: (bitki) = şindiki versiyalan aradaki fark,
'prevn' => 'ilerki {{PLURAL:$1|$1}}',
'nextn' => 'geeriki {{PLURAL:$1|$1}}',
'viewprevnext' => '($1 {{int:pipe-separator}} $2) ($3).',
-'searchhelp-url' => 'Help:İçindekilär',
'search-result-size' => '$1 ({{PLURAL:$2|1 laf|$2 laf}})',
'search-redirect' => '(göndermää $1)',
'search-section' => '(bölüm $1)',
@@ -655,7 +650,6 @@ Aaramaanızın önünä ''all:'' prefiksini koyun da deneyin hepsi içlii aarama
'recentchangeslinked-feed' => 'İlgili diişilmäklär',
'recentchangeslinked-toolbox' => 'İlgili diişilmäklär',
'recentchangeslinked-title' => '"$1" ilgili diişmäklär',
-'recentchangeslinked-noresult' => 'Baalantılı sayfalarda verilmiş devirde diişmäk olmadı.',
'recentchangeslinked-summary' => "Bu maasus sayfa baalantılı sayfalardaki diişmäkleri sayêr.
Sizin bakmaa [[Special:Watchlist|listasındaki]] sayfalar verildi '''kalın''' bukvalarnan.",
'recentchangeslinked-page' => 'Yaprak adı:',
@@ -724,8 +718,6 @@ Sizin bakmaa [[Special:Watchlist|listasındaki]] sayfalar verildi '''kalın''' b
'statistics-users-active-desc' => 'Bitki {{PLURAL:$1|gün|$1 günde}} çalışmaa yapmaa kullanıcılar',
'statistics-mostpopular' => 'En anılmış yazılar',
-'disambiguations' => 'Maana aydınnatmak yaprakları',
-
'doubleredirects' => 'İki kerä yönnendirmeler',
'brokenredirects' => 'Var olmayan yazıya yapılmış yönnendirmeler',
diff --git a/languages/messages/MessagesGan_hans.php b/languages/messages/MessagesGan_hans.php
index 983559c8..eeca5690 100644
--- a/languages/messages/MessagesGan_hans.php
+++ b/languages/messages/MessagesGan_hans.php
@@ -63,9 +63,6 @@ $messages = array(
'tog-shownumberswatching' => '显示有几多人监视',
'tog-oldsig' => '现有𠮶签å:',
'tog-fancysig' => 'æ¦ç­¾å以维基字对待(冇自动连结)',
-'tog-externaleditor' => '默认用外部编辑器(专家用𠮶功能,è¦åˆ°å€·ð ®¶ç”µè„‘上头特别𠮶设置一下)',
-'tog-externaldiff' => '默认用外部差异比较器(专家用𠮶功能,è¦åˆ°æ±ð ®¶ç”µè„‘上头特别𠮶设置下。[//www.mediawiki.org/wiki/Manual:External_editors 别𠮶信æ¯])',
-'tog-showjumplinks' => 'å¯ç”¨â€œè·³åˆ°â€è®¿é—®é“¾æŽ¥',
'tog-uselivepreview' => '使用å³æ—¶é¢„览(JavaScript)(实验中)',
'tog-forceeditsummary' => '冇改动注解时è¦åŒå¶è¯',
'tog-watchlisthideown' => '监视列表弆到å¶ð ®¶ç¼–辑',
@@ -258,7 +255,7 @@ $messages = array(
$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).
+# 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).
'aboutsite' => '关于 {{SITENAME}}',
'aboutpage' => 'Project:关于',
'copyright' => '个版𠮶内容系根æ®$1𠮶æ¡æ¬¾å‘布。',
@@ -268,7 +265,6 @@ $1',
'disclaimers' => 'å…责声明',
'disclaimerpage' => 'Project:å…责声明',
'edithelp' => '编写帮助',
-'edithelppage' => 'Help:啷编写文章',
'helppage' => 'Help:说明',
'mainpage' => 'å°é¢',
'mainpage-description' => 'å°é¢',
@@ -337,17 +333,6 @@ $1',
# General errors
'error' => '错误',
'databaseerror' => 'æ•°æ®åº“错误',
-'dberrortext' => 'æ•°æ®åº“查询语法有错。
-å¯èƒ½ç³»è½¯ä»¶æœ‰é”™ã€‚
-最æ™ð ®¶æ•°æ®åº“指令系:
-<blockquote><tt>$1</tt></blockquote>
-æ¥è‡ªå‡½æ•° "<tt>$2</tt>"。
-MySQL回到错误 "<tt>$3: $4</tt>"。',
-'dberrortextcl' => 'æ•°æ®åº“查询语法有错。
-最æ™ð ®¶æ•°æ®åº“指令系:
-“$1â€
-æ¥è‡ªå‡½æ•°â€œ$2â€ã€‚
-MySQL回到错误“$3: $4â€ã€‚',
'laggedslavemode' => '警告:页é¢å¯èƒ½å†‡æœ‰æ–°è¿‘内容。',
'readonly' => 'æ•°æ®åº“上正é”å•°',
'enterlockreason' => '请输入é”到数æ®åº“𠮶ç†ç”±ï¼ŒåŒ…括预计几时间解é”',
@@ -388,7 +373,6 @@ MySQL回到错误“$3: $4â€ã€‚',
'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 [//translatewiki.net/wiki/Main_Page?setlang=en translatewiki.net], the MediaWiki localisation project.",
-'sqlhidden' => '(SQL 弆到𠮶查询)',
'cascadeprotected' => '个页已拖ä¿æŠ¤ï¼Œå› ä¸ºä½¢æ‹–“è”é”ä¿æŠ¤â€ð ®¶{{PLURAL:$1|一åª|几åª}}æ‹–ä¿æŠ¤é¡µåŒ…到:
$2',
'namespaceprotected' => "倷冇æƒç¼–写'''$1'''空间里度𠮶页é¢ã€‚",
@@ -468,7 +452,7 @@ $2',
'newpassword' => '新密ç ï¼š',
'retypenew' => '确认密ç :',
'resetpass_submit' => '设定密ç åŒåˆ°ç™»å…¥',
-'resetpass_success' => '倷𠮶密ç æ”¹æ­£å–½ï¼æ­£å¸®å€·ç™»å…¥...',
+'changepassword-success' => '倷𠮶密ç æ”¹æ­£å–½ï¼æ­£å¸®å€·ç™»å…¥...',
'resetpass_forbidden' => '到{{SITENAME}}上改伓正密ç ',
'resetpass-submit-loggedin' => '设过å¸æˆ·å¯†ç ',
'resetpass-submit-cancel' => 'å–消',
@@ -743,7 +727,6 @@ $2',
'viewprevnext' => '眵å–($1 {{int:pipe-separator}} $2) ($3)',
'searchmenu-exists' => "'''个åªwiki已有一åªå«ã€Œ[[:$1]]ã€ð ®¶é¡µã€‚'''",
'searchmenu-new' => "'''嘚个åªwiki上建立「[[:$1]]ã€é¡µï¼'''",
-'searchhelp-url' => 'Help:说明',
'searchprofile-articles' => '内容页',
'searchprofile-project' => '帮助åŒå¾—计划页',
'searchprofile-images' => '多媒体',
@@ -776,14 +759,6 @@ $2',
'powersearch-field' => '寻',
'searchdisabled' => '{{SITENAME}}𠮶æœç´¢åŠŸèƒ½å·²ç»å…³é—­ã€‚倷å¯ä»¥ç”¨Google寻å–。但系佢𠮶索引å¯èƒ½ç³»æ—©å…ˆð ®¶ã€‚',
-# Quickbar
-'qbsettings' => 'å¿«æ·å¯¼èˆªæ¡',
-'qbsettings-none' => '冇',
-'qbsettings-fixedleft' => '左首固定',
-'qbsettings-fixedright' => 'å³é¦–固定',
-'qbsettings-floatingleft' => '左首漂移',
-'qbsettings-floatingright' => '左首漂移',
-
# Preferences page
'preferences' => 'å‚数设置',
'mypreferences' => 'å¶ð ®¶å‚数设置',
@@ -916,7 +891,6 @@ $2',
'recentchangeslinked-feed' => '链接页𠮶更改',
'recentchangeslinked-toolbox' => '链接页𠮶更改',
'recentchangeslinked-title' => '链接页𠮶改动到 "$1"',
-'recentchangeslinked-noresult' => '个段时间𠮶链接页冇更改。',
'recentchangeslinked-summary' => "个åªç‰¹æ®Šé¡µåˆ—出个页连出去页é¢ð ®¶æœ€æ™æ”¹åŠ¨ï¼ˆæˆ–ç³»æŸåªåˆ†ç±»ð ®¶é¡µé¢ï¼‰ã€‚
[[Special:Watchlist|倷𠮶监视列表]]页é¢ä¼šç”¨'''粗体'''显到。",
'recentchangeslinked-page' => '页é¢åå­ï¼š',
@@ -1112,11 +1086,6 @@ $2',
'statistics-users-active-desc' => '头$1æ—¥æ“作过𠮶用户',
'statistics-mostpopular' => '眵𠮶人最多𠮶页é¢',
-'disambiguations' => '扤清楚页',
-'disambiguationspage' => 'Template:扤清楚',
-'disambiguations-text' => "底下𠮶页é¢éƒ½æœ‰åˆ°'''扤清楚页'''𠮶链接, 但系佢俚应当系连到正当𠮶标题。<br />
-如果一åªé¡µé¢ç³»é“¾æŽ¥è‡ª[[MediaWiki:Disambiguationspage]],佢会拖当æˆæ‰¤æ¸…楚页。",
-
'doubleredirects' => 'åŒé‡é‡å®šå‘页é¢',
'doubleredirectstext' => '底下𠮶é‡å®šå‘链接到别åªé‡å®šå‘页é¢:',
'double-redirect-fixed-move' => '[[$1]]拕移动正,佢个下拕é‡å®šå‘到[[$2]]。',
@@ -1269,10 +1238,9 @@ Also see [[Special:WantedCategories|wanted categories]].',
'unwatch' => '莫çœåˆ°',
'unwatchthispage' => '莫çœåˆ°ä¸ªé¡µ',
'notanarticle' => '伓系文章',
-'watchnochange' => '一径到显示𠮶时间之内,倷çœåˆ°ð ®¶é¡µé¢å†‡æ”¹åŠ¨ã€‚',
'watchlist-details' => '$1åªé¡µé¢ï¼ˆä¼“算讨论页) æ‹–çœåˆ°å“©',
-'wlheader-enotif' => '* å¯åŠ¨å˜žemail通知功能。',
-'wlheader-showupdated' => "* 上回倷眵𠮶页é¢æ”¹åŠ¨ð ®¶éƒ¨åˆ†ç”¨'''粗体'''显到",
+'wlheader-enotif' => 'å¯åŠ¨å˜žemail通知功能。',
+'wlheader-showupdated' => "上回倷眵𠮶页é¢æ”¹åŠ¨ð ®¶éƒ¨åˆ†ç”¨'''粗体'''显到",
'watchmethod-recent' => '眵å–æ‹–çœåˆ°ð ®¶é¡µé¢ð ®¶æœ€è¿‘编辑',
'watchmethod-list' => '望å–监视页里头最æ™ð ®¶æ”¹åŠ¨',
'watchlistcontains' => '倷𠮶监视列表包å«$1åªé¡µé¢ã€‚',
@@ -1547,11 +1515,8 @@ $1',
'ipb_already_blocked' => 'é”到嘞"$1"',
'ipb_cant_unblock' => '错误: 冇å‘现Block ID $1。个åªIPè¯ä¼“定拖解å°å–½ã€‚',
'ip_range_invalid' => '冇用𠮶IP范围。',
-'blockme' => 'å°å¥å¶åŽ»',
'proxyblocker' => '代ç†å°é”器',
-'proxyblocker-disabled' => '个åªåŠŸèƒ½ç”¨ä¼“正喽。',
'proxyblockreason' => '倷𠮶IP系一åªå…¬å¼€ð ®¶ä»£ç†ï¼Œä½¢æ‹–å°åˆ°å˜žã€‚请è”络倷𠮶InternetæœåŠ¡æ供商或技术帮助å†å‘Šè¯µä½¢ä¿šä¸ªåªä¸¥é‡ð ®¶å®‰å…¨é—®é¢˜ã€‚',
-'proxyblocksuccess' => '扤正啰。',
'sorbsreason' => '{{SITENAME}}用𠮶 DNSBL 查到倷𠮶IP地å€ç³»åªå…¬å¼€ä»£ç†æœåŠ¡å™¨ã€‚',
'sorbs_create_account_reason' => '{{SITENAME}}用𠮶 DNSBL 检查到倷𠮶IP地å€ç³»åªå…¬å¼€ä»£ç†æœåŠ¡å™¨ï¼Œå€·ä¹Ÿå°±æ–°å¼€ä¼“æ­£å¸æˆ·ã€‚',
@@ -1858,7 +1823,7 @@ $1',
* gpslongitude
* gpsaltitude',
-# EXIF tags
+# Exif tags
'exif-imagewidth' => '阔',
'exif-imagelength' => '高',
'exif-bitspersample' => 'æ¯åƒç´ byteæ•°',
@@ -1972,7 +1937,7 @@ $1',
'exif-gpsdatestamp' => 'GPS日期',
'exif-gpsdifferential' => 'GPS差动修正',
-# EXIF attributes
+# Exif attributes
'exif-compression-1' => '冇压缩',
'exif-unknowndate' => '未知𠮶日期',
@@ -2224,7 +2189,6 @@ $3
'version-variables' => 'å˜é‡',
'version-other' => '别𠮶',
'version-mediahandlers' => '媒体处ç†ç¨‹åº',
-'version-extension-functions' => '扩展功能',
'version-parser-extensiontags' => '解æžå™¨æ‰©å±•æ ‡ç­¾',
'version-hook-name' => 'é’©å­å',
'version-hook-subscribedby' => '订阅人',
@@ -2234,11 +2198,6 @@ $3
'version-software' => '装正𠮶软件',
'version-software-version' => '版本',
-# Special:FilePath
-'filepath' => '文件路径',
-'filepath-page' => '文件:',
-'filepath-submit' => '路径',
-
# Special:FileDuplicateSearch
'fileduplicatesearch-filename' => '文件å:',
'fileduplicatesearch-submit' => '寻',
diff --git a/languages/messages/MessagesGan_hant.php b/languages/messages/MessagesGan_hant.php
index 55e707f3..4628ab30 100644
--- a/languages/messages/MessagesGan_hant.php
+++ b/languages/messages/MessagesGan_hant.php
@@ -85,9 +85,6 @@ $messages = array(
'tog-shownumberswatching' => '顯示有幾多人監視',
'tog-oldsig' => 'ç¾æœ‰å—°ç°½å:',
'tog-fancysig' => 'æ¦ç°½å以維基字å°å¾…(冇自動連çµï¼‰',
-'tog-externaleditor' => '默èªç”¨å¤–部編輯器(專家用嗰功能,è¦åˆ°å€·å—°é›»è…¦ä¸Šé ­ç‰¹åˆ¥å—°è¨­ç½®ä¸€ä¸‹ï¼‰',
-'tog-externaldiff' => '默èªç”¨å¤–部差異比較器(專家用嗰功能,è¦åˆ°æ±å—°é›»è…¦ä¸Šé ­ç‰¹åˆ¥å—°è¨­ç½®ä¸‹ã€‚[//www.mediawiki.org/wiki/Manual:External_editors 別嗰信æ¯])',
-'tog-showjumplinks' => '啟用“跳到â€è¨ªå•é€£çµ',
'tog-uselivepreview' => '使用å³æ™‚é è¦½ï¼ˆJavaScript)(實驗中)',
'tog-forceeditsummary' => '冇改動注解時è¦åŒæˆ‘話',
'tog-watchlisthideown' => '監視列表弆到我嗰編輯',
@@ -280,7 +277,7 @@ $messages = array(
$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).
+# 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).
'aboutsite' => '關於 {{SITENAME}}',
'aboutpage' => 'Project:關於',
'copyright' => '箇版嗰內容係根據$1å—°æ¢æ¬¾ç™¼ä½ˆã€‚',
@@ -290,7 +287,6 @@ $1',
'disclaimers' => 'å…責è²æ˜Ž',
'disclaimerpage' => 'Project:å…責è²æ˜Ž',
'edithelp' => '編寫幫助',
-'edithelppage' => 'Help:啷編寫文章',
'helppage' => 'Help:説明',
'mainpage' => 'å°é¢',
'mainpage-description' => 'å°é¢',
@@ -359,17 +355,6 @@ $1',
# General errors
'error' => '錯誤',
'databaseerror' => '資料庫錯誤',
-'dberrortext' => '資料庫查詢語法有錯。
-å¯èƒ½ä¿‚軟件有錯。
-最æ™å—°è³‡æ–™åº«æŒ‡ä»¤ä¿‚:
-<blockquote><tt>$1</tt></blockquote>
-來自函數 "<tt>$2</tt>"。
-MySQL回到錯誤 "<tt>$3: $4</tt>"。',
-'dberrortextcl' => '資料庫查詢語法有錯。
-最æ™å—°è³‡æ–™åº«æŒ‡ä»¤ä¿‚:
-“$1â€
-來自函數“$2â€ã€‚
-MySQL回到錯誤“$3: $4â€ã€‚',
'laggedslavemode' => '警告:é é¢å¯èƒ½å†‡æœ‰æ–°è¿‘內容。',
'readonly' => '資料庫上正鎖哩',
'enterlockreason' => '請輸入鎖到資料庫嗰ç†ç”±ï¼ŒåŒ…括é è¨ˆå¹¾æ™‚間解鎖',
@@ -410,7 +395,6 @@ MySQL回到錯誤“$3: $4â€ã€‚',
'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 [//translatewiki.net/wiki/Main_Page?setlang=en translatewiki.net], the MediaWiki localisation project.",
-'sqlhidden' => '(SQL 弆到嗰查詢)',
'cascadeprotected' => '箇é å·²æ‹•ä¿è­·ï¼Œå› ç‚ºä½¢æ‹•ã€Œè¯éŽ–ä¿è­·ã€å—°{{PLURAL:$1|一隻|幾隻}}æ‹•ä¿è­·é åŒ…到:
$2',
'namespaceprotected' => "倷冇權編寫'''$1'''空間裡度嗰é é¢ã€‚",
@@ -490,7 +474,7 @@ $2',
'newpassword' => '新密碼:',
'retypenew' => '確èªå¯†ç¢¼:',
'resetpass_submit' => '設定密碼åŒåˆ°ç™»å…¥',
-'resetpass_success' => 'æ±å—°å¯†ç¢¼æ”¹æ­£å“©ï¼ç®‡ä¸‹æ±ç™»å…¥å˜š...',
+'changepassword-success' => 'æ±å—°å¯†ç¢¼æ”¹æ­£å“©ï¼ç®‡ä¸‹æ±ç™»å…¥å˜š...',
'resetpass_forbidden' => '到{{SITENAME}}上改伓正密碼',
'resetpass-submit-loggedin' => '設éŽå¸³æˆ¶å¯†ç¢¼',
'resetpass-submit-cancel' => 'å–消',
@@ -765,7 +749,6 @@ $2',
'viewprevnext' => '望下($1 {{int:pipe-separator}} $2) ($3)',
'searchmenu-exists' => "'''箇隻wiki已有一隻å«ã€Œ[[:$1]]ã€å—°é ã€‚'''",
'searchmenu-new' => "'''到箇隻wiki上建立「[[:$1]]ã€é ï¼'''",
-'searchhelp-url' => 'Help:説明',
'searchprofile-articles' => '內容é ',
'searchprofile-project' => '幫助åŒå¾—計劃é ',
'searchprofile-images' => '多媒體',
@@ -798,14 +781,6 @@ $2',
'powersearch-field' => 'å°‹',
'searchdisabled' => '{{SITENAME}}å—°æœç´¢åŠŸèƒ½å·²ç¶“關閉。倷å¯ä»¥ç”¨Googleå°‹å–。但係佢嗰索引å¯èƒ½ä¿‚早先嗰。',
-# Quickbar
-'qbsettings' => 'å¿«æ·å°Žèˆªæ¢',
-'qbsettings-none' => '冇',
-'qbsettings-fixedleft' => '左首固定',
-'qbsettings-fixedright' => 'å³é¦–固定',
-'qbsettings-floatingleft' => '左首漂移',
-'qbsettings-floatingright' => '左首漂移',
-
# Preferences page
'preferences' => 'åƒæ•¸è¨­ç½®',
'mypreferences' => '我嗰åƒæ•¸è¨­ç½®',
@@ -938,7 +913,6 @@ $2',
'recentchangeslinked-feed' => '連çµé å—°æ›´æ”¹',
'recentchangeslinked-toolbox' => '連çµé å—°æ›´æ”¹',
'recentchangeslinked-title' => '連çµé å—°æ”¹å‹•åˆ° "$1"',
-'recentchangeslinked-noresult' => '箇段時間嗰連çµé å†‡æ›´æ”¹ã€‚',
'recentchangeslinked-summary' => "箇隻特殊é åˆ—出箇é é€£å‡ºåŽ»é é¢å—°é ‚æ™å—°æ”¹å‹•ï¼ˆæˆ–ä¿‚æŸéš»åˆ†é¡žå—°é é¢ï¼‰ã€‚
[[Special:Watchlist|æ±å—°ç›£è¦–列表]]é é¢æœƒç”¨'''ç²—é«”'''顯到。",
'recentchangeslinked-page' => 'é é¢åå­ï¼š',
@@ -1134,11 +1108,6 @@ $2',
'statistics-users-active-desc' => 'é ­$1æ—¥æ“作éŽå—°ç”¨æˆ¶',
'statistics-mostpopular' => '眵嗰人頂多嗰é é¢',
-'disambiguations' => '扤清楚é ',
-'disambiguationspage' => 'Template:舞清楚',
-'disambiguations-text' => "底下嗰é é¢éƒ½æœ‰åˆ°'''扤清楚é '''嗰連çµ, 但係佢俚應當係連到正當嗰標題。<br />
-如果一隻é é¢ä¿‚連çµè‡ª[[MediaWiki:Disambiguationspage]],佢會拕當æˆæ‰¤æ¸…楚é ã€‚",
-
'doubleredirects' => 'é›™é‡é‡å®šå‘é é¢',
'doubleredirectstext' => '底下嗰é‡å®šå‘連çµåˆ°åˆ¥éš»é‡å®šå‘é é¢:',
'double-redirect-fixed-move' => '[[$1]]拕移動正,佢箇下拕é‡å®šå‘到[[$2]]。',
@@ -1291,10 +1260,9 @@ Also see [[Special:WantedCategories|wanted categories]].',
'unwatch' => '莫çœåˆ°',
'unwatchthispage' => '莫çœåˆ°ç®‡é ',
'notanarticle' => '伓係文章',
-'watchnochange' => '一徑到顯示嗰時間之內,倷çœåˆ°å—°é é¢å†‡æ”¹å‹•ã€‚',
'watchlist-details' => '$1éš»é é¢ï¼ˆä¼“算討論é ï¼‰ æ‹•çœåˆ°å“©',
-'wlheader-enotif' => '* 啟動嘞email通知功能。',
-'wlheader-showupdated' => "* 上回倷眵嗰é é¢æ”¹å‹•å—°éƒ¨åˆ†ç”¨'''ç²—é«”'''顯到",
+'wlheader-enotif' => '啟動哩email通知功能。',
+'wlheader-showupdated' => "上回倷眵嗰é é¢æ”¹å‹•å—°éƒ¨åˆ†ç”¨'''ç²—é«”'''顯到",
'watchmethod-recent' => '眵å–æ‹•çœåˆ°å—°é é¢å—°é ‚æ™å—°ç·¨è¼¯',
'watchmethod-list' => '望å–監視é è£¡é ­é ‚æ™å—°æ”¹å‹•',
'watchlistcontains' => '倷嗰監視列表包å«$1éš»é é¢ã€‚',
@@ -1569,11 +1537,8 @@ $1',
'ipb_already_blocked' => '鎖到哩"$1"',
'ipb_cant_unblock' => '錯誤: 冇發ç¾Block ID $1。箇隻IP話伓定拕解å°å“©ã€‚',
'ip_range_invalid' => '冇用嗰IP範åœã€‚',
-'blockme' => 'å°å¥æˆ‘去',
'proxyblocker' => '代ç†å°éŽ–器',
-'proxyblocker-disabled' => '箇隻功能用伓正哩。',
'proxyblockreason' => 'æ±å—°IP係一隻公開嗰代ç†ï¼Œä½¢æ‹•å°åˆ°å“©ã€‚è«‹è¯çµ¡æ±å—°Internetæœå‹™æ供商或技術幫助å†å‘Šèª¦ä½¢ä¿šç®‡éš»åš´é‡å—°å®‰å…¨å•é¡Œã€‚',
-'proxyblocksuccess' => '舞正哩。',
'sorbsreason' => '{{SITENAME}}用嗰 DNSBL 查到æ±å—°IP地å€ä¿‚隻公開代ç†æœå‹™å™¨ã€‚',
'sorbs_create_account_reason' => '{{SITENAME}}用嗰 DNSBL 檢查到æ±å—°IP地å€ä¿‚隻公開代ç†æœå‹™å™¨ï¼Œæ±ä¹Ÿå°±æ–°é–‹ä¼“正帳戶。',
@@ -1880,7 +1845,7 @@ $1',
* gpslongitude
* gpsaltitude',
-# EXIF tags
+# Exif tags
'exif-imagewidth' => 'é—Š',
'exif-imagelength' => '高',
'exif-bitspersample' => 'æ¯åƒç´ byte數',
@@ -1994,7 +1959,7 @@ $1',
'exif-gpsdatestamp' => 'GPS日期',
'exif-gpsdifferential' => 'GPS差動修正',
-# EXIF attributes
+# Exif attributes
'exif-compression-1' => '冇壓縮',
'exif-unknowndate' => '未知嗰日期',
@@ -2246,7 +2211,6 @@ $3
'version-variables' => '變é‡',
'version-other' => '別嗰',
'version-mediahandlers' => '媒體處ç†ç¨‹åº',
-'version-extension-functions' => '擴展功能',
'version-parser-extensiontags' => '解æžå™¨æ“´å±•æ¨™ç±¤',
'version-hook-name' => '鉤å­å',
'version-hook-subscribedby' => '訂閱人',
@@ -2256,11 +2220,6 @@ $3
'version-software' => 'è£æ­£å—°è»Ÿä»¶',
'version-software-version' => '版本',
-# Special:FilePath
-'filepath' => '文件路徑',
-'filepath-page' => '文件:',
-'filepath-submit' => '路徑',
-
# Special:FileDuplicateSearch
'fileduplicatesearch-filename' => '文件å:',
'fileduplicatesearch-submit' => 'å°‹',
diff --git a/languages/messages/MessagesGd.php b/languages/messages/MessagesGd.php
index 158115b7..a65a09d6 100644
--- a/languages/messages/MessagesGd.php
+++ b/languages/messages/MessagesGd.php
@@ -65,9 +65,6 @@ $messages = array(
'tog-shownumberswatching' => "Nochd àireamh nan cleachdaichean a tha a' cumail sùil air",
'tog-oldsig' => 'An t-earr-sgrìobhadh làithreach:',
'tog-fancysig' => 'Làimhsich an t-earr-sgrìobhadh mar wikitext (gun cheangal leis fhèin)',
-'tog-externaleditor' => "Cleachd deasaichear on taobh a-muigh a ghnàth (do shàr-eòlaichean a-mhàin, feumaidh seo roghainnean sònraichte air a' choimpiutair agad [//www.mediawiki.org/wiki/Manual:External_editors Barrachd fiosrachaidh.])",
-'tog-externaldiff' => "Cleachd diff on taobh a-muigh a ghnàth (do shàr-eòlaichean a-mhàin, feumaidh seo roghainnean sònraichte air a' choimpiutair agad. [//www.mediawiki.org/wiki/Manual:External_editors Barrachd fiosrachaidh.])",
-'tog-showjumplinks' => 'Cuir an comas ceanglaichean so-inntrigeachd "gearr leum gu"',
'tog-uselivepreview' => 'Cleachd an ro-shealladh beò (feumaidh seo JavaScript) (deuchainneach)',
'tog-forceeditsummary' => "Cuir ceist nuair a dh'fhàgas mi gearr-chunntas an deasachaidh bàn",
'tog-watchlisthideown' => 'Falaich mo mhùthaidhean fhèin air mo chlàr-faire',
@@ -80,6 +77,7 @@ $messages = array(
'tog-diffonly' => 'Na seall susbaint nan duilleagan fo na diofaichean',
'tog-showhiddencats' => 'Seall na roinnean falaichte',
'tog-norollbackdiff' => 'Na dèan diof às dèidh roiligeadh air ais',
+'tog-useeditwarning' => 'Thoir rabhadh dhomh ma bhios mi an impis duilleag deasachaidh fhàgail mus do shàbhail mi na mùthaidhean agam',
'underline-always' => 'An-còmhnaidh',
'underline-never' => 'Na dèan seo idir',
@@ -267,7 +265,7 @@ $1",
'pool-queuefull' => 'Tha ciutha nam pròiseasan làn',
'pool-errorunknown' => 'Mearachd neo-aithnichte',
-# 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).
+# 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).
'aboutsite' => 'Mu dhèidhinn {{SITENAME}}',
'aboutpage' => 'Project:Mu dhèidhinn',
'copyright' => 'Tha susbaint ri làimh fo $1.',
@@ -277,7 +275,6 @@ $1",
'disclaimers' => 'Aithrisean-àichidh',
'disclaimerpage' => 'Project:Aithris-àichidh choitcheann',
'edithelp' => 'Cobhair deasachaidh',
-'edithelppage' => 'Help:Deasachadh',
'helppage' => 'Help:Susbaint',
'mainpage' => 'Prìomh dhuilleag',
'mainpage-description' => 'Prìomh dhuilleag',
@@ -355,17 +352,6 @@ Gheibh thu liosta nan duilleagan sònraichte 's dligheach aig [[Special:SpecialP
# General errors
'error' => 'Mearachd',
'databaseerror' => 'Mearachd an stòir-dhàta',
-'dberrortext' => 'Thachair mearachd co-chàraidh rè iarrtas an stòir-dhàta.
-Faodaidh gu bheil seo a\' comharrachadh mearachd sa bhathar-bhog.
-Seo iarrtas an stòir-dhàta mu dheireadh a chaidh feuchainn ris:
-<blockquote><code>$1</code></blockquote>
-o bhroinn an fhoincsein "<code>$2</code>".
-Thill an stòr-dàta a\' mhearachd "<samp>$3: $4</samp>".',
-'dberrortextcl' => 'Thachair mearachd co-chàraidh rè iarrtas an stòir-dhàta.
-Seo iarrtas an stòir-dhàta mu dheireadh a chaidh feuchainn ris:
-"$1"
-o bhroinn an fhoincsein "$2".
-Thill an stòr-dàta a\' mhearachd "$3: $4"',
'laggedslavemode' => "'''Rabhadh:''' Faodaidh nach eil ùrachaidhean a rinneadh o chionn ghoirid a' nochdadh san duilleag.",
'readonly' => 'Stòr-dàta glaiste',
'enterlockreason' => "Cuir a-steach adhbhar a' ghlais, a' gabhail a-steach tuairmeas air fuasgladh a' ghlais.",
@@ -421,7 +407,6 @@ Feuch ris a-rithist às a dhèidh seo.",
'editinginterface' => "'''Rabhadh:''' Tha thu a' deasachadh duilleag a tha 'ga chleachdadh a chum teacsa eadar-aghaidh a sholar airson a' bhathar-bhog.
Ma dh'atharraicheas tu an duilleag seo, bidh buaidh ann air coltas na h-eadar-aghaidh mar a chì càch e air an uicipeid seo.
Gus eadar-theangachadh atharrachadh no a chur ris airson gach uicipeid, cleachd [//translatewiki.net/ translatewiki.net], pròiseactan eadar-theangachadh MediaWiki.",
-'sqlhidden' => "(Iarrtas SQL 'ga fhalach)",
'cascadeprotected' => 'Chaidh an duilleag seo a dhìon o dheasachadh a chionn \'s gu bheil e am broinn {{PLURAL:$1|na duilleige|nan duilleagan}} a leanas a chaidh an dìon \'s an roghainn "mar eas" air:
$2',
'namespaceprotected' => "Chan eil cead agad duilleagan san namespace '''$1''' a dheasachadh.",
@@ -453,7 +438,6 @@ Na dìochuimhnich na [[Special:Preferences|roghainnean agad air {{SITENAME}}]] a
'yourpassword' => 'Am facal-faire agad',
'yourpasswordagain' => 'Ath-sgrìobh facal-faire',
'remembermypassword' => "Cuimhnich gu bheil mi air logadh a-steach air a' choimpiutair seo (suas gu $1 {{PLURAL:$1|latha|latha|làithean|latha}})",
-'securelogin-stick-https' => 'Glèidh an ceangal ri HTTPS as dèidh logadh a-steach',
'yourdomainname' => 'An àrainn-lìn agad:',
'password-change-forbidden' => 'Chan urrainn dhut faclan-faire atharrachadh air an uicipeid seo.',
'externaldberror' => 'Thachair mearachd le dearbhadh an stòir-dhàta air neo chan eil cead agad an cunntas agad air an taobh a-muigh ùrachadh.',
@@ -561,7 +545,7 @@ Gus an clàradh a-steach a choileadh, tha agad ri facal-faire ùr a shuidheachad
'newpassword' => 'Facal-faire ùr',
'retypenew' => 'Ath-sgrìobh am facal-faire ùr',
'resetpass_submit' => "Suidhich am facal-faire 's clàraich a-steach",
-'resetpass_success' => "Chaidh am facal-faire agad atharrachadh!
+'changepassword-success' => "Chaidh am facal-faire agad atharrachadh!
'Gad chlàradh a-steach an-dràsta...",
'resetpass_forbidden' => 'Cha ghabh na faclan-faire atharrachadh',
'resetpass-no-info' => 'Feumaidh tu clàradh a-steach mus dèan thu inntrigeadh dìreach dhan duilleag seo.',
@@ -573,10 +557,8 @@ Saoil an do dh'atharraich thu am facal-faire agad mu thràth no an do dh'iarr th
# Special:PasswordReset
'passwordreset' => 'Ath-shuidhich am facal-faire',
-'passwordreset-text' => 'Lìon am foirm seo gus am facal-faire agad ath-shuidheachadh.',
'passwordreset-legend' => 'Ath-shuidhich am facal-faire',
'passwordreset-disabled' => 'Chaidh ath-shuidheachadh nam faclan-faire a chur à comas air an uicipeid seo.',
-'passwordreset-pretext' => '{{PLURAL:$1||Cuir a-steach aon dhe na pìosan dàta gu h-ìosal}}',
'passwordreset-username' => 'Ainm-cleachdaiche:',
'passwordreset-domain' => 'Àrainn-lìn:',
'passwordreset-capture' => "A bheil thu airson coimhead air a' phost-d?",
@@ -599,7 +581,7 @@ Bu chòir dhut clàradh a-steach agus facal-faire ùr a thaghadh an-dràsta. Ma
Facal-faire sealach: $2',
'passwordreset-emailsent' => 'Chaidh post-d airson ath-shuidheachadh an fhacail-fhaire a chur.',
'passwordreset-emailsent-capture' => 'Chaidh post-d a chum ath-shuidheachadh an fhacail-fhaire a chur agus chì thu sin gu h-ìosal.',
-'passwordreset-emailerror-capture' => "Chaidh cuimhneachan a chur air a' phost-d agus chì thu sin gu h-ìosal ach cha b' urrainn dhuinn a chur dhan chleachdaiche: $1",
+'passwordreset-emailerror-capture' => "Chaidh post-d a chum ath-shuidheachadh an fhacail-fhaire a ghintinn agus chì thu sin gu h-ìosal ach cha b' urrainn dhuinn a chur dhan chleachdaiche: $1",
# Special:ChangeEmail
'changeemail' => 'Atharraich am post-d',
@@ -826,6 +808,8 @@ Tha e ann mu thràth.",
'content-failed-to-parse' => "Dh'fhàillig parsadh susbaint $2 airson modail $1: $3",
'invalid-content-data' => 'Dàta susbaint a tha mì-dhligheach',
'content-not-allowed-here' => 'Chan eil susbaint "$1" ceadaichte air an duilleag [[$2]]',
+'editwarning-warning' => 'Ma dh\'fhàgas tu an duilleag seo, faodaidh gun caill thu mùthadh sam bith a rinn thu.
+Ma tha thu air logadh a-steach, \'s urrainn dhut an rabhadh seo a chur dheth san roinn "Deasachadh" sna roghainnean agad.',
# Content models
'content-model-wikitext' => 'wikitext',
@@ -941,7 +925,6 @@ Feuch is [[Special:Search|lorg duilleagan ùra iomachaidh air an uici]]",
'searchmenu-legend' => 'Roghainnean luirg',
'searchmenu-exists' => "'''Tha duilleag air a bheil \"[[:\$1]]\" air an uicipeid seo.'''",
'searchmenu-new' => "'''Cruthaich an duilleag \"[[:\$1]]\" air an uicipeid seo!'''",
-'searchhelp-url' => 'Help:Cuideachadh',
'searchmenu-prefix' => '[[Special:PrefixIndex/$1|Rùraich duilleagan aig a bheil an ro-leasachan seo]]',
'searchprofile-articles' => 'Duilleagan susbainte',
'searchprofile-project' => "Duilleagan nan cobharach 's nam pròiseactan",
@@ -986,15 +969,6 @@ Feuch ri ''all:'' a chuir air beulaibh an iarrtais agad gus rannsachadh a dhèan
'S urrainn dhut lorg a dhèanamh air Google san eadar-àm.
Faodaidh gum bi inneacsan susbaint {{SITENAME}} tuilleadh 's sean ge-tà.",
-# Quickbar
-'qbsettings' => 'Grad-bhàr',
-'qbsettings-none' => 'Chan eil gin',
-'qbsettings-fixedleft' => 'Socraichte air an taobh chlì',
-'qbsettings-fixedright' => 'Socraichte air an taobh deas',
-'qbsettings-floatingleft' => 'Air fleòd air an taobh chlì',
-'qbsettings-floatingright' => 'Air fleòd air an taobh deas',
-'qbsettings-directionality' => 'Socraichte a-rèir comhair sgriobt do chànain',
-
# Preferences page
'preferences' => 'Roghainnean',
'mypreferences' => 'Na roghainnean agam',
@@ -1023,7 +997,6 @@ Faodaidh gum bi inneacsan susbaint {{SITENAME}} tuilleadh 's sean ge-tà.",
'resetprefs' => 'Falamhaich atharrachaidhean nach deach a shàbhaladh fhathast',
'restoreprefs' => 'Aisig na roghainnean bunaiteach uile',
'prefs-editing' => "A' deasachadh",
-'prefs-edit-boxsize' => 'Meud uinneag an deasachaidh.',
'rows' => 'Sreathan',
'columns' => 'Colbhan',
'searchresultshead' => 'Lorg',
@@ -1050,7 +1023,6 @@ Faodaidh gum bi inneacsan susbaint {{SITENAME}} tuilleadh 's sean ge-tà.",
'prefs-common-css-js' => 'CSS/JavaScript ann an coitcheann do gach craiceann:',
'prefs-reset-intro' => "'S urrainn dhut bun-roghainnean na làraich ath-shuidheachadh air an duilleag seo. Cha ghabh seo a neo-dhèanamh.",
'prefs-emailconfirm-label' => 'Dearbhadh puist-d:',
-'prefs-textboxsize' => 'Meud na h-uinneige deasachaidh',
'youremail' => 'Post-dealain:',
'username' => '{{GENDER:$1|Ainm-cleachdaiche}}:',
'uid' => "ID {{GENDER:$1|a' chleachdaiche}}:",
@@ -1187,7 +1159,6 @@ Chan fhaicear an seòladh fhèin nuair a chuireas cuideigin post-dealain thugad.
'recentchangeslinked-feed' => 'Mùthaidhean buntainneach',
'recentchangeslinked-toolbox' => 'Mùthaidhean buntainneach',
'recentchangeslinked-title' => 'Mùthaidhean co-cheangailte ri "$1"',
-'recentchangeslinked-noresult' => 'Cha dàinig atharrachadh air duilleag cho-cheangailte am broinn na h-ùine a thagh thu.',
'recentchangeslinked-summary' => "Seo liosta nam mùthaidhean a chaidh a chur air duilleagan a tha a' ceangal o dhuilleag shònraichte (no ri buill de roinn shònraichte).
Tha duilleagan air [[Special:Watchlist|do chlàr-faire]] ann an litrichean '''troma'''.",
'recentchangeslinked-page' => 'Ainm na duilleige:',
@@ -1246,8 +1217,6 @@ Chithear an tuairisgeul a tha aice air [duilleag tuairisgeul an fhaidhle $2] gu
# Statistics
'statistics' => 'Staitistearachd',
-'disambiguationspage' => 'Template:ciallan',
-
'doubleredirects' => 'Ath-seòlaidhean dùbailte',
'brokenredirects' => 'Ath-stiùireidhean briste',
@@ -1334,9 +1303,8 @@ Nochdaidh mùthaidhean a nithear air an duilleag seo \'s air an duilleag deasbai
'unwatch' => 'Na cum sùil tuilleadh',
'unwatchthispage' => 'Na cum sùil tuilleadh',
'notanarticle' => 'Chan e duilleag susbaint a tha ann',
-'watchnochange' => "Cha deach na duilleagan air d' fhaire a dheasachadh anns a' chuairt ùine taisbeanta.",
'watchlist-details' => 'Tha {{PLURAL:$1|$1 duilleag|$1 dhuilleag|$1 duilleagan|$1 duilleag}} air do chlàr-faire, gun luaidh air na duilleagan deasbaireachd.',
-'wlheader-showupdated' => "* Tha clò '''trom''' air duilleagan a chaidh atharrachadh on turas mu dheireadh a thadhail thu orra.",
+'wlheader-showupdated' => "Tha clò '''trom''' air duilleagan a chaidh atharrachadh on turas mu dheireadh a thadhail thu orra.",
'watchmethod-recent' => "A' sgrùdadh deasachaidhean ùra airson duilleagan air d' fhaire",
'watchmethod-list' => "A' sgrùdadh duilleagan air d' fhaire airson deasachaidhean ùra",
'watchlistcontains' => 'Tha $1 {{PLURAL:$1|duilleag|dhuilleag|duilleagan|duilleag}} air do chlàr-faire.',
@@ -1482,7 +1450,6 @@ Seo roghainnean làithreach na duilleige '''$1''':",
'block-log-flags-nocreate' => 'cruthachadh de chunntasan ùra à comas',
'ipb_expiry_invalid' => 'Tha an t-àm-crìochnachaidh mì-dhligheach.',
'ip_range_invalid' => 'Raon IP neo-iomchaidh.',
-'proxyblocksuccess' => 'Dèanta.',
# Developer tools
'lockdb' => 'Glais an stòr-dàta',
diff --git a/languages/messages/MessagesGl.php b/languages/messages/MessagesGl.php
index c752cbdc..a170f929 100644
--- a/languages/messages/MessagesGl.php
+++ b/languages/messages/MessagesGl.php
@@ -95,6 +95,7 @@ $specialPageAliases = array(
'Filepath' => array( 'Ruta_do_ficheiro' ),
'Import' => array( 'Importar' ),
'Invalidateemail' => array( 'Invalidar_o_enderezo_de_correo_electrónico' ),
+ 'JavaScriptTest' => array( 'Proba_do_JavaScript' ),
'BlockList' => array( 'Lista_de_bloqueos', 'Lista_dos_bloqueos_a_enderezos_IP' ),
'LinkSearch' => array( 'Buscar_ligazóns_web' ),
'Listadmins' => array( 'Lista_de_administradores' ),
@@ -111,6 +112,7 @@ $specialPageAliases = array(
'MIMEsearch' => array( 'Procura_MIME' ),
'Mostcategories' => array( 'Páxinas_con_máis_categorías' ),
'Mostimages' => array( 'Ficheiros_máis_ligados' ),
+ 'Mostinterwikis' => array( 'Páxinas_con_máis_interwikis' ),
'Mostlinked' => array( 'Páxinas_máis_ligadas' ),
'Mostlinkedcategories' => array( 'Categorías_máis_ligadas' ),
'Mostlinkedtemplates' => array( 'Modelos_máis_ligados' ),
@@ -122,6 +124,7 @@ $specialPageAliases = array(
'Myuploads' => array( 'As_miñas_subidas' ),
'Newimages' => array( 'Imaxes_novas' ),
'Newpages' => array( 'Páxinas_novas' ),
+ 'PagesWithProp' => array( 'Páxinas_con_propiedades' ),
'PasswordReset' => array( 'Restablecer_o_contrasinal' ),
'PermanentLink' => array( 'Ligazón_permanente' ),
'Popularpages' => array( 'Páxinas_populares' ),
@@ -133,6 +136,7 @@ $specialPageAliases = array(
'Randomredirect' => array( 'Redirección_aleatoria' ),
'Recentchanges' => array( 'Cambios_recentes' ),
'Recentchangeslinked' => array( 'Cambios_relacionados' ),
+ 'Redirect' => array( 'Redirección' ),
'Revisiondelete' => array( 'Revisións_borradas' ),
'Search' => array( 'Procurar' ),
'Shortpages' => array( 'Páxinas_curtas' ),
@@ -279,9 +283,6 @@ $messages = array(
'tog-shownumberswatching' => 'Mostrar o número de usuarios que están a vixiar',
'tog-oldsig' => 'Sinatura actual:',
'tog-fancysig' => 'Tratar a sinatura como se fose texto wiki (sen ligazón automática)',
-'tog-externaleditor' => 'Usar un editor externo por defecto (só para expertos; cómpre configurar o computador. [//www.mediawiki.org/wiki/Manual:External_editors Máis información.])',
-'tog-externaldiff' => 'Usar as diferenzas externas por defecto (só para expertos; cómpre configurar o computador. [//www.mediawiki.org/wiki/Manual:External_editors Máis información.])',
-'tog-showjumplinks' => 'Permitir as ligazóns de accesibilidade "ir a"',
'tog-uselivepreview' => 'Usar a vista previa en tempo real (experimental)',
'tog-forceeditsummary' => 'Avisádeme cando o campo resumo estea baleiro',
'tog-watchlisthideown' => 'Agochar as edicións propias na lista de vixilancia',
@@ -295,6 +296,8 @@ $messages = array(
'tog-showhiddencats' => 'Mostrar as categorías ocultas',
'tog-noconvertlink' => 'Desactivar a conversión dos títulos de ligazón',
'tog-norollbackdiff' => 'Omitir as diferenzas despois de levar a cabo unha reversión de edicións',
+'tog-useeditwarning' => 'Avisádeme cando deixe unha páxina de edición cos cambios sen gardar',
+'tog-prefershttps' => 'Utilizar unha conexión segura sempre que acceda ao sistema',
'underline-always' => 'Sempre',
'underline-never' => 'Nunca',
@@ -358,6 +361,18 @@ $messages = array(
'oct' => 'out',
'nov' => 'nov',
'dec' => 'dec',
+'january-date' => '$1 de xaneiro',
+'february-date' => '$1 de febreiro',
+'march-date' => '$1 de marzo',
+'april-date' => '$1 de abril',
+'may-date' => '$1 de maio',
+'june-date' => '$1 de xuño',
+'july-date' => '$1 de xullo',
+'august-date' => '$1 de agosto',
+'september-date' => '$1 de setembro',
+'october-date' => '$1 de outubro',
+'november-date' => '$1 de novembro',
+'december-date' => '$1 de decembro',
# Categories related messages
'pagecategories' => '{{PLURAL:$1|Categoría|Categorías}}',
@@ -439,6 +454,7 @@ $messages = array(
'create-this-page' => 'Crear esta páxina',
'delete' => 'Borrar',
'deletethispage' => 'Borrar esta páxina',
+'undeletethispage' => 'Restaurar esta páxina',
'undelete_short' => 'Restaurar {{PLURAL:$1|unha edición|$1 edicións}}',
'viewdeleted_short' => 'Ver {{PLURAL:$1|unha edición borrada|$1 edicións borradas}}',
'protect' => 'Protexer',
@@ -482,7 +498,7 @@ $1',
'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).
+# 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).
'aboutsite' => 'Acerca de {{SITENAME}}',
'aboutpage' => 'Project:Acerca de',
'copyright' => 'Todo o contido está dispoñible baixo a licenza $1, agás que se indique o contrario.',
@@ -492,7 +508,6 @@ $1',
'disclaimers' => 'Advertencias',
'disclaimerpage' => 'Project:Advertencia xeral',
'edithelp' => 'Axuda de edición',
-'edithelppage' => 'Help:Como editar unha páxina',
'helppage' => 'Help:Axuda',
'mainpage' => 'Portada',
'mainpage-description' => 'Portada',
@@ -569,17 +584,12 @@ Pode atopar unha lista coas páxinas especiais válidas en [[Special:SpecialPage
# General errors
'error' => 'Erro',
'databaseerror' => 'Erro na base de datos',
-'dberrortext' => 'Ocorreu un erro de sintaxe na consulta á base de datos.
-Isto pódese deber a un erro no software.
-A última consulta á base de datos foi:
-<blockquote><code>$1</code></blockquote>
-desde a función "<code>$2</code>".
-A base de datos devolveu o erro "<samp>$3: $4</samp>".',
-'dberrortextcl' => 'Ocorreu un erro de sintaxe na consulta.
-A última consulta á base de datos foi:
-"$1"
-desde a función "$2".
-A base de datos devolveu o erro "$3: $4"',
+'databaseerror-text' => 'Produciuse un erro na pescuda na base de datos.
+Isto pode ser indicativo dun erro no software.',
+'databaseerror-textcl' => 'Produciuse un erro na pescuda na base de datos.',
+'databaseerror-query' => 'Pescuda: $1',
+'databaseerror-function' => 'Función: $1',
+'databaseerror-error' => 'Erro: $1',
'laggedslavemode' => "'''Aviso:''' A páxina pode non conter as actualizacións recentes.",
'readonly' => 'Base de datos pechada',
'enterlockreason' => 'Dea unha razón para o peche, incluíndo unha estimación de até cando se manterá',
@@ -613,6 +623,7 @@ Se cadra, xa a borrou alguén.',
'cannotdelete-title' => 'Non se pode borrar a páxina "$1"',
'delete-hook-aborted' => 'O borrado foi abortado polo asociador.
Este non deu ningunha explicación.',
+'no-null-revision' => 'Non se puido crear a nova revisión nula para a páxina "$1"',
'badtitle' => 'Título incorrecto',
'badtitletext' => 'O título da páxina pedida non era válido, estaba baleiro ou proviña dunha ligazón interlingüística ou interwiki incorrecta.
Poida que conteña un ou máis caracteres dos que non se poden empregar nos títulos.',
@@ -635,12 +646,15 @@ Para engadir ou modificar as traducións en todos os wikis utilice [//translatew
'editinginterface' => "'''Aviso:''' Está editando unha páxina usada para fornecer o texto da interface do software.
Os cambios nesta páxina afectarán á aparencia da interface dos outros usuarios do wiki.
Para engadir ou modificar as traducións en todos os wikis utilice [//translatewiki.net/wiki/Main_Page?setlang=gl translatewiki.net], o proxecto de localización de MediaWiki.",
-'sqlhidden' => '(Procura SQL agochada)',
'cascadeprotected' => 'Esta páxina foi protexida fronte á edición debido a que está incluída {{PLURAL:$1|na seguinte páxina protexida, que ten|nas seguintes páxinas protexidas, que teñen}} a "protección en serie" activada:
$2',
'namespaceprotected' => "Non ten os permisos necesarios para modificar páxinas no espazo de nomes '''$1'''.",
'customcssprotected' => 'Non ten os permisos necesarios para modificar esta páxina de CSS, dado que contén a configuración persoal doutro usuario.',
'customjsprotected' => 'Non ten os permisos necesarios para modificar esta páxina de JavaScript, dado que contén a configuración persoal doutro usuario.',
+'mycustomcssprotected' => 'Non ten os permisos necesarios para editar esta páxina de CSS.',
+'mycustomjsprotected' => 'Non ten os permisos necesarios para editar esta páxina de JavaScript.',
+'myprivateinfoprotected' => 'Non ten os permisos necesarios para editar a súa información privada.',
+'mypreferencesprotected' => 'Non ten os permisos necesarios para editar as súas preferencias.',
'ns-specialprotected' => 'Non se poden editar as páxinas no espazo de nomes "{{ns:special}}".',
'titleprotected' => "Este título foi protexido da creación por [[User:$1|$1]].
O motivo achegado é ''$2''.",
@@ -665,10 +679,19 @@ Teña en conta que algunhas páxinas poden continuar aparecendo como se aínda e
'welcomecreation-msg' => 'A súa conta foi creada correctamente.
Non esqueza personalizar as súas [[Special:Preferences|preferencias de {{SITENAME}}]].',
'yourname' => 'Nome de usuario:',
+'userlogin-yourname' => 'Nome de usuario',
+'userlogin-yourname-ph' => 'Insira o seu nome de usuario',
+'createacct-another-username-ph' => 'Insira o nome de usuario',
'yourpassword' => 'Contrasinal:',
+'userlogin-yourpassword' => 'Contrasinal',
+'userlogin-yourpassword-ph' => 'Insira o seu contrasinal',
+'createacct-yourpassword-ph' => 'Insira un contrasinal',
'yourpasswordagain' => 'Insira o contrasinal outra vez:',
+'createacct-yourpasswordagain' => 'Confirme o contrasinal',
+'createacct-yourpasswordagain-ph' => 'Insira o contrasinal outra vez',
'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',
+'userlogin-remembermypassword' => 'Manter a miña conexión',
+'userlogin-signwithsecure' => 'Utilizar a conexión segura',
'yourdomainname' => 'O seu dominio:',
'password-change-forbidden' => 'Non pode mudar os contrasinais neste wiki.',
'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.',
@@ -680,18 +703,44 @@ Non esqueza personalizar as súas [[Special:Preferences|preferencias de {{SITENA
'logout' => 'Saír ao anonimato',
'userlogout' => 'Saír ao anonimato',
'notloggedin' => 'Non accedeu ao sistema',
+'userlogin-noaccount' => 'Non está rexistrado?',
+'userlogin-joinproject' => 'Únase a {{SITENAME}}',
'nologin' => 'Non está rexistrado? $1.',
'nologinlink' => 'Cree unha conta',
'createaccount' => 'Crear unha conta nova',
'gotaccount' => 'Xa ten unha conta? $1.',
'gotaccountlink' => 'Acceda ao sistema',
'userlogin-resetlink' => 'Esqueceu os seus datos de rexistro?',
+'userlogin-resetpassword-link' => 'Restablecer o seu contrasinal',
+'helplogin-url' => 'Help:Rexistro',
+'userlogin-helplink' => '[[{{MediaWiki:helplogin-url}}|Axuda co rexistro]]',
+'userlogin-loggedin' => 'Xa accedeu ao sistema como {{GENDER:$1|$1}}.
+Utilice o formulario inferior para acceder como outro usuario.',
+'userlogin-createanother' => 'Crear outra conta',
+'createacct-join' => 'Insira a súa información embaixo.',
+'createacct-another-join' => 'Insira a información da nova conta embaixo.',
+'createacct-emailrequired' => 'Enderezo de correo electrónico',
+'createacct-emailoptional' => 'Enderezo de correo electrónico (opcional)',
+'createacct-email-ph' => 'Insira o seu enderezo de correo electrónico',
+'createacct-another-email-ph' => 'Insira o enderezo de correo electrónico',
'createaccountmail' => 'Utilizar un contrasinal aleatorio temporal e envialo ao enderezo de correo electrónico especificado',
+'createacct-realname' => 'Nome real (opcional)',
'createaccountreason' => 'Motivo:',
+'createacct-reason' => 'Motivo',
+'createacct-reason-ph' => 'Por que crea outra conta?',
+'createacct-captcha' => 'Comprobación de seguridade',
+'createacct-imgcaptcha-ph' => 'Insira o texto que ve enriba',
+'createacct-submit' => 'Crear a conta',
+'createacct-another-submit' => 'Crear outra conta',
+'createacct-benefit-heading' => 'Xente coma vostede elabora {{SITENAME}}.',
+'createacct-benefit-body1' => '{{PLURAL:$1|edición|edicións}}',
+'createacct-benefit-body2' => '{{PLURAL:$1|páxina|páxinas}}',
+'createacct-benefit-body3' => '{{PLURAL:$1|colaborador recente|colaboradores recentes}}',
'badretype' => 'Os contrasinais que inseriu non coinciden.',
'userexists' => 'O nome de usuario que inseriu xa está en uso.
Escolla un nome diferente.',
'loginerror' => 'Erro ao acceder ao sistema',
+'createacct-error' => 'Erro ao crear a conta',
'createaccounterror' => 'Non se puido crear a conta: $1',
'nocookiesnew' => 'A conta de usuario foi creada, pero non accedeu ao sistema.
{{SITENAME}} para rexistrar os usuarios.
@@ -758,11 +807,13 @@ Debe acceder ao sistema e mudar o contrasinal agora.
Pode facer caso omiso desta mensaxe se se creou esta conta por erro.',
'usernamehasherror' => 'O nome de usuario non pode conter cancelos ("#")',
-'login-throttled' => 'Fixo demasiados intentos de inserir o contrasinal.
-Por favor, agarde antes de probar outra vez.',
+'login-throttled' => 'Fixo demasiados intentos de acceder ao sistema.
+Por favor, agarde $1 antes de probar outra vez.',
'login-abort-generic' => 'Acceso ao sistema incorrecto; abortado',
'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.',
+'createacct-another-realname-tip' => 'O nome real é opcional.
+Se escolle dalo utilizarase para atribuír ao usuario o seu traballo.',
# Email sending
'php-mail-error-unknown' => 'Erro descoñecido na función mail() do PHP.',
@@ -778,8 +829,7 @@ Por favor, agarde antes de probar outra vez.',
'newpassword' => 'Contrasinal novo:',
'retypenew' => 'Insira outra vez o novo contrasinal:',
'resetpass_submit' => 'Establecer o contrasinal e acceder ao sistema',
-'resetpass_success' => 'O seu contrasinal modificouse correctamente!
-Accedendo ao sistema...',
+'changepassword-success' => 'O seu contrasinal modificouse correctamente!',
'resetpass_forbidden' => 'Non se poden mudar os contrasinais',
'resetpass-no-info' => 'Debe rexistrarse para acceder directamente a esta páxina.',
'resetpass-submit-loggedin' => 'Cambiar o contrasinal',
@@ -791,10 +841,11 @@ Pode ser que xa cambiase o seu contrasinal ou que solicitase un novo contrasinal
# Special:PasswordReset
'passwordreset' => 'Restablecer o contrasinal',
-'passwordreset-text' => 'Encha este formulario para restablecer o seu contrasinal.',
+'passwordreset-text-one' => 'Encha este formulario para restablecer o seu contrasinal.',
+'passwordreset-text-many' => '{{PLURAL:$1|Encha un dos campos para restablecer o seu contrasinal.}}',
'passwordreset-legend' => 'Restablecer o contrasinal',
'passwordreset-disabled' => 'O restablecemento de contrasinais está desactivado neste wiki.',
-'passwordreset-pretext' => '{{PLURAL:$1||Introduza un dos datos a continuación}}',
+'passwordreset-emaildisabled' => 'As funcións do correo electrónico están desactivadas neste wiki.',
'passwordreset-username' => 'Nome de usuario:',
'passwordreset-domain' => 'Dominio:',
'passwordreset-capture' => 'Quere ollar o correo electrónico?',
@@ -825,7 +876,7 @@ ignore esta mensaxe e continúe empregando o seu contrasinal vello.',
Contrasinal temporal: $2',
'passwordreset-emailsent' => 'Enviouse o correo electrónico de restablecemento do contrasinal.',
'passwordreset-emailsent-capture' => 'Enviouse un correo electrónico de restablecemento do contrasinal, mostrado a continuación.',
-'passwordreset-emailerror-capture' => 'Xerouse un correo electrónico recordatorio, mostrado a continuación, pero o envío ao usuario fallou: $1',
+'passwordreset-emailerror-capture' => 'Xerouse un correo electrónico de restablecemento do contrasinal, mostrado a continuación, pero o envío {{GENDER:$2|ao usuario|á usuaria}} fallou: $1',
# Special:ChangeEmail
'changeemail' => 'Cambiar o enderezo de correo electrónico',
@@ -839,6 +890,19 @@ Contrasinal temporal: $2',
'changeemail-submit' => 'Cambiar o correo electrónico',
'changeemail-cancel' => 'Cancelar',
+# Special:ResetTokens
+'resettokens' => 'Restablecer os pases',
+'resettokens-text' => 'Aquí pode restablecer os pases que permiten acceder a certos datos privados asociados á súa conta.
+
+Debería facelo se os compartiu accidentalmente con alguén ou se a súa conta foi comprometida.',
+'resettokens-no-tokens' => 'Non hai ningún pase que restablecer.',
+'resettokens-legend' => 'Restablecer os pases',
+'resettokens-tokens' => 'Pases:',
+'resettokens-token-label' => '$1 (valor actual: $2)',
+'resettokens-watchlist-token' => 'Pase para a fonte de novas (Atom/RSS) web dos [[Special:Watchlist|cambios feitos nas páxinas da súa lista de vixilancia]]',
+'resettokens-done' => 'Restablecéronse os pases.',
+'resettokens-resetbutton' => 'Restablecer os pases seleccionados',
+
# Edit page toolbar
'bold_sample' => 'Texto en negra',
'bold_tip' => 'Texto en negra',
@@ -1037,12 +1101,15 @@ Este non deu ningunha explicación.',
Semella que foi borrada.',
'edit-conflict' => 'Conflito de edición.',
'edit-no-change' => 'A súa edición foi ignorada dado que non fixo ningún cambio no texto.',
+'postedit-confirmation' => 'Gardouse a súa edición.',
'edit-already-exists' => 'Non se pode crear a nova páxina.
Esta xa existe.',
'defaultmessagetext' => 'Texto predeterminado',
'content-failed-to-parse' => 'Erro ao analizar o contido de "$2" para o modelo de $1: $3',
'invalid-content-data' => 'Datos de contido inválidos',
'content-not-allowed-here' => 'O contido "$1" non está permitido na páxina "[[$2]]"',
+'editwarning-warning' => 'Deixar esta páxina pode causar a perda de calquera cambio feito.
+Se accedeu ao sistema, pode desactivar esta mensaxe de advertencia na sección "Edición" das súas preferencias.',
# Content models
'content-model-wikitext' => 'texto wiki',
@@ -1078,6 +1145,7 @@ Comprobe a comparación que aparece a continuación para confirmar que isto é o
'undo-failure' => 'Non se pode desfacer a edición debido a un conflito con algunha das edicións intermedias.',
'undo-norev' => 'A edición non se pode desfacer porque non existe ou foi eliminada.',
'undo-summary' => 'Desfíxose a edición $1 de [[Special:Contributions/$2|$2]] ([[User talk:$2|conversa]])',
+'undo-summary-username-hidden' => 'Desfíxose a edición $1 dun usuario agochado',
# Account creation failure
'cantcreateaccounttitle' => 'Non pode crear unha conta de usuario',
@@ -1257,6 +1325,7 @@ Asegúrese de que esta modificación da páxina mantén a continuidade históric
'compareselectedversions' => 'Comparar as versións seleccionadas',
'showhideselectedversions' => 'Mostrar/Agochar as versións seleccionadas',
'editundo' => 'desfacer',
+'diff-empty' => '(Sen diferenzas)',
'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}}.)',
'difference-missing-revision' => 'Non se {{PLURAL:$2|atopou revisión ningunha|atoparon $2 revisións}} desta diferenza ($1).
@@ -1284,7 +1353,6 @@ O [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} rexistro de borrad
'searchmenu-legend' => 'Opcións de busca',
'searchmenu-exists' => "* Páxina \"'''[[\$1]]'''\"",
'searchmenu-new' => "'''Crear a páxina \"[[:\$1]]\" neste wiki!'''",
-'searchhelp-url' => 'Help:Contidos',
'searchmenu-prefix' => '[[Special:PrefixIndex/$1|Navegue polas páxinas que comezan coas mesmas iniciais]]',
'searchprofile-articles' => 'Páxinas de contido',
'searchprofile-project' => 'Páxinas do proxecto e de axuda',
@@ -1328,15 +1396,7 @@ Probe a fixar a súa petición con ''all:'' para procurar en todo o contido (inc
'searchdisabled' => 'As procuras en {{SITENAME}} están deshabilitadas por cuestións de rendemento.
Mentres tanto pode procurar usando o Google.
Note que os seus índices do contido de {{SITENAME}} poden estar desactualizados.',
-
-# Quickbar
-'qbsettings' => 'Opcións da barra rápida',
-'qbsettings-none' => 'Ningunha',
-'qbsettings-fixedleft' => 'Fixa á esquerda',
-'qbsettings-fixedright' => 'Fixa á dereita',
-'qbsettings-floatingleft' => 'Flotante á esquerda',
-'qbsettings-floatingright' => 'Flotante á dereita',
-'qbsettings-directionality' => 'Fixa, segundo a dirección de escritura da súa lingua',
+'search-error' => 'Produciuse un erro durante a procura: $1',
# Preferences page
'preferences' => 'Preferencias',
@@ -1370,7 +1430,6 @@ Note que os seus índices do contido de {{SITENAME}} poden estar desactualizados
'resetprefs' => 'Eliminar os cambios non gardados',
'restoreprefs' => 'Restaurar todas as preferencias por defecto (en todas as seccións)',
'prefs-editing' => 'Edición',
-'prefs-edit-boxsize' => 'Tamaño da caixa de edición.',
'rows' => 'Filas:',
'columns' => 'Columnas:',
'searchresultshead' => 'Procurar',
@@ -1381,9 +1440,9 @@ Note que os seus índices do contido de {{SITENAME}} poden estar desactualizados
'recentchangesdays-max' => 'Máximo: $1 {{PLURAL:$1|día|días}}',
'recentchangescount' => 'Número de edicións a mostrar por defecto:',
'prefs-help-recentchangescount' => 'Isto inclúe os cambios recentes, os historiais e mais os rexistros.',
-'prefs-help-watchlist-token' => 'Ao encher este campo cunha clave secreta xerarase unha fonte de novas RSS para a súa lista de vixilancia.
-Calquera que saiba esta clave poderá ler a súa lista de vixilancia, así que escolla un valor seguro.
-Velaquí un valor xerado ao chou que pode usar: $1',
+'prefs-help-watchlist-token2' => 'Esta é a clave secreta da fonte de novas web para a súa lista de vixilancia.
+Calquera persoa que a saiba poderá ler a súa lista de vixilancia; non comparta esta clave.
+[[Special:ResetTokens|Prema aquí se necesita restablecela]].',
'savedprefs' => 'Gardáronse as súas preferencias.',
'timezonelegend' => 'Zona horaria:',
'localtime' => 'Hora local:',
@@ -1414,7 +1473,6 @@ Velaquí un valor xerado ao chou que pode usar: $1',
'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:',
-'prefs-textboxsize' => 'Tamaño da caixa de edición',
'youremail' => 'Correo electrónico:',
'username' => 'Nome de {{GENDER:$1|usuario|usuaria}}:',
'uid' => 'ID de {{GENDER:$1|usuario|usuaria}}:',
@@ -1448,6 +1506,8 @@ Se escolle dalo utilizarase para atribuírlle o seu traballo.',
'prefs-dateformat' => 'Formato da data',
'prefs-timeoffset' => 'Desprazamento horario',
'prefs-advancedediting' => 'Opcións xerais',
+'prefs-editor' => 'Editor',
+'prefs-preview' => 'Vista previa',
'prefs-advancedrc' => 'Opcións avanzadas',
'prefs-advancedrendering' => 'Opcións avanzadas',
'prefs-advancedsearchoptions' => 'Opcións avanzadas',
@@ -1455,7 +1515,9 @@ Se escolle dalo utilizarase para atribuírlle o seu traballo.',
'prefs-displayrc' => 'Opcións de visualización',
'prefs-displaysearchoptions' => 'Opcións de visualización',
'prefs-displaywatchlist' => 'Opcións de visualización',
+'prefs-tokenwatchlist' => 'Pase',
'prefs-diffs' => 'Diferenzas',
+'prefs-help-prefershttps' => 'Esta preferencia ha aplicarse no seu vindeiro acceso ao sistema.',
# User preference: email validation using jQuery
'email-address-validity-valid' => 'O enderezo de correo electrónico semella válido',
@@ -1482,6 +1544,8 @@ Se escolle dalo utilizarase para atribuírlle o seu traballo.',
'userrights-notallowed' => 'Non dispón dos permisos necesarios para asignar ou retirar dereitos de usuario.',
'userrights-changeable-col' => 'Os grupos que pode cambiar',
'userrights-unchangeable-col' => 'Os grupos que non pode cambiar',
+'userrights-conflict' => 'Hai un conflito na modificación dos dereitos de usuario! Por favor, revíseo e confirme os seus cambios.',
+'userrights-removed-self' => 'Retirou correctamente os seus propios dereitos. Polo tanto, xa non ten acceso a esta páxina.',
# Groups
'group' => 'Grupo:',
@@ -1547,11 +1611,19 @@ Se escolle dalo utilizarase para atribuírlle o seu traballo.',
'right-proxyunbannable' => 'Evitar os bloqueos autamáticos a proxies',
'right-unblockself' => 'Desbloquearse a si mesmo',
'right-protect' => 'Cambiar os niveis de protección e editar páxinas protexidas coa opción "protección en serie"',
-'right-editprotected' => 'Editar páxinas protexidas (que non teñan protección en serie)',
+'right-editprotected' => 'Editar páxinas protexidas con "{{int:protect-level-sysop}}"',
+'right-editsemiprotected' => 'Editar páxinas protexidas con "{{int:protect-level-autoconfirmed}}"',
'right-editinterface' => 'Editar a interface de usuario',
'right-editusercssjs' => 'Editar os ficheiros CSS e JavaScript doutros usuarios',
'right-editusercss' => 'Editar os ficheiros CSS doutros usuarios',
'right-edituserjs' => 'Editar os ficheiros JavaScript doutros usuarios',
+'right-editmyusercss' => 'Editar os ficheiros CSS propios',
+'right-editmyuserjs' => 'Editar os ficheiros JavaScript propios',
+'right-viewmywatchlist' => 'Ver a lista de vixilancia propia',
+'right-editmywatchlist' => 'Editar a lista de vixilancia propia. Teña en conta que algunhas accións engadirán páxinas igualmente mesmo sen este dereito.',
+'right-viewmyprivateinfo' => 'Ver os datos privados propios (por exemplo, o enderezo de correo electrónico ou o nome real)',
+'right-editmyprivateinfo' => 'Editar os datos privados propios (por exemplo, o enderezo de correo electrónico ou o nome real)',
+'right-editmyoptions' => 'Editar as preferencias propias',
'right-rollback' => 'Reverter rapidamente as edicións do último usuario que editou unha páxina en particular',
'right-markbotedits' => 'Marcar as edicións desfeitas como edicións dun bot',
'right-noratelimit' => 'Non ser afectado polos límites de frecuencia',
@@ -1613,12 +1685,19 @@ Se escolle dalo utilizarase para atribuírlle o seu traballo.',
'action-userrights-interwiki' => 'editar os permisos de usuario dos usuarios doutros wikis',
'action-siteadmin' => 'bloquear ou desbloquear a base de datos',
'action-sendemail' => 'enviar correos electrónicos',
+'action-editmywatchlist' => 'editar a súa lista de vixilancia',
+'action-viewmywatchlist' => 'ver a súa lista de vixilancia',
+'action-viewmyprivateinfo' => 'ver a súa información privada',
+'action-editmyprivateinfo' => 'editar a súa información privada',
# Recent changes
'nchanges' => '$1 {{PLURAL:$1|modificación|modificacións}}',
+'enhancedrc-since-last-visit' => '$1 {{PLURAL:$1|desde a última visita}}',
+'enhancedrc-history' => 'historial',
'recentchanges' => 'Cambios recentes',
'recentchanges-legend' => 'Opcións dos cambios',
'recentchanges-summary' => 'Nesta páxina pode seguir as modificacións máis recentes feitas no wiki.',
+'recentchanges-noresult' => 'Non se produciron cambios que coincidisen con eses criterios durante o período especificado.',
'recentchanges-feed-description' => 'Nesta fonte de novas pode seguir as modificacións máis recentes feitas no wiki.',
'recentchanges-label-newpage' => 'Esta edición creou unha nova páxina',
'recentchanges-label-minor' => 'Esta é unha edición pequena',
@@ -1655,7 +1734,6 @@ Se escolle dalo utilizarase para atribuírlle o seu traballo.',
'recentchangeslinked-feed' => 'Cambios relacionados',
'recentchangeslinked-toolbox' => 'Cambios relacionados',
'recentchangeslinked-title' => 'Cambios relacionados con "$1"',
-'recentchangeslinked-noresult' => 'Non se produciron cambios nas páxinas vinculadas a esta durante o período de tempo seleccionado.',
'recentchangeslinked-summary' => "Esta é unha lista dos cambios que se realizaron recentemente nas páxinas vinculadas a esta (ou nos membros da categoría especificada).
As páxinas da súa [[Special:Watchlist|lista de vixilancia]] aparecen en '''negra'''.",
'recentchangeslinked-page' => 'Nome da páxina:',
@@ -1667,7 +1745,7 @@ As páxinas da súa [[Special:Watchlist|lista de vixilancia]] aparecen en '''neg
'reuploaddesc' => 'Cancelar a carga e volver ao formulario de carga',
'upload-tryagain' => 'Enviar a descrición do ficheiro modificada',
'uploadnologin' => 'Non accedeu ao sistema',
-'uploadnologintext' => 'Debe [[Special:UserLogin|acceder ao sistema]] para poder cargar ficheiros.',
+'uploadnologintext' => 'Debe $1 para poder cargar ficheiros.',
'upload_directory_missing' => 'Falta o directorio de carga ($1) e non pode ser creado polo servidor da páxina web.',
'upload_directory_read_only' => 'O servidor web non pode escribir no directorio de carga ($1).',
'uploaderror' => 'Erro ao cargar',
@@ -1901,7 +1979,6 @@ Para unha seguridade óptima, img_auth.php está desactivado.',
'http-read-error' => 'Erro de lectura HTTP.',
'http-timed-out' => 'O pedido HTTP expirou.',
'http-curl-error' => 'Ocorreu un erro ao acceder ao URL: $1',
-'http-host-unreachable' => 'Non se puido acceder ao URL.',
'http-bad-status' => 'Houbo un problema durante a solicitude HTTP: $1 $2',
# Some likely curl errors. More could be added from <http://curl.haxx.se/libcurl/c/libcurl-errors.html>
@@ -1932,6 +2009,10 @@ Tamén pode reintentalo cando haxa menos actividade.',
'listfiles_size' => 'Tamaño',
'listfiles_description' => 'Descrición',
'listfiles_count' => 'Versións',
+'listfiles-show-all' => 'Incluír as versións vellas das imaxes',
+'listfiles-latestversion' => 'Versión actual',
+'listfiles-latestversion-yes' => 'Si',
+'listfiles-latestversion-no' => 'Non',
# File description page
'file-anchor-link' => 'Ficheiro',
@@ -2029,6 +2110,13 @@ Lembre verificar outras ligazóns cara aos modelos antes de borralos.',
'randompage' => 'Páxina aleatoria',
'randompage-nopages' => 'Non hai páxinas {{PLURAL:$2|no seguinte espazo de nomes|nos seguintes espazos de nomes}}: $1.',
+# Random page in category
+'randomincategory' => 'Páxina aleatoria na categoría',
+'randomincategory-invalidcategory' => '"$1" non é un nome de categoría válido.',
+'randomincategory-nopages' => 'Non hai páxinas na [[:Category:$1]].',
+'randomincategory-selectcategory' => 'Ir a unha páxina ao chou da categoría: $1 $2.',
+'randomincategory-selectcategory-submit' => 'Ir',
+
# Random redirect
'randomredirect' => 'Redirección aleatoria',
'randomredirect-nopages' => 'Non hai redireccións no espazo de nomes "$1".',
@@ -2054,17 +2142,13 @@ Lembre verificar outras ligazóns cara aos modelos antes de borralos.',
'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}}',
'statistics-mostpopular' => 'Páxinas máis vistas',
-'disambiguations' => 'Páxinas que ligan con páxinas de homónimos',
-'disambiguationspage' => 'Template:Homónimos',
-'disambiguations-text' => "As seguintes páxinas conteñen, polo menos, unha ligazón cara a unha '''páxina de homónimos'''.
-No canto de ligar cos homónimos deben apuntar cara á páxina apropiada.<br />
-Unha páxina trátase como páxina de homónimos cando nela se usa un modelo que está ligado desde [[MediaWiki:Disambiguationspage]].",
-
'pageswithprop' => 'Páxinas cunha propiedade de páxina',
'pageswithprop-legend' => 'Páxinas cunha propiedade de páxina',
'pageswithprop-text' => 'Esta páxina lista aquelas páxinas que utilizan unha propiedade de páxina determinada.',
'pageswithprop-prop' => 'Nome da propiedade:',
'pageswithprop-submit' => 'Mostrar',
+'pageswithprop-prophidden-long' => 'agochouse o valor de propiedade de texto longo ($1)',
+'pageswithprop-prophidden-binary' => 'agochouse o valor de propiedade binaria ($1)',
'doubleredirects' => 'Redireccións dobres',
'doubleredirectstext' => 'Esta lista contén as páxinas que redirixen cara a outras páxinas de redirección.
@@ -2122,6 +2206,7 @@ As entradas <del>riscadas</del> xa foron resoltas.',
'mostrevisions' => 'Páxinas con máis revisións',
'prefixindex' => 'Todas as páxinas con prefixo',
'prefixindex-namespace' => 'Todas as páxinas con prefixo (espazo de nomes $1)',
+'prefixindex-strip' => 'Quitar o prefixo na lista',
'shortpages' => 'Páxinas curtas',
'longpages' => 'Páxinas longas',
'deadendpages' => 'Páxinas sen ligazóns cara a outras',
@@ -2137,6 +2222,7 @@ As entradas <del>riscadas</del> xa foron resoltas.',
'listusers' => 'Lista de usuarios',
'listusers-editsonly' => 'Mostrar só os usuarios con edicións',
'listusers-creationsort' => 'Ordenar por data de creación',
+'listusers-desc' => 'Ordenar de xeito descendente',
'usereditcount' => '$1 {{PLURAL:$1|edición|edicións}}',
'usercreated' => '{{GENDER:$3|Creado|Creada}} o $1 ás $2',
'newpages' => 'Páxinas novas',
@@ -2314,10 +2400,9 @@ Os cambios futuros nesta páxina e na súa páxina de conversa asociada serán l
'unwatchthispage' => 'Deixar de vixiar',
'notanarticle' => 'Non é unha páxina de contido',
'notvisiblerev' => 'A revisión foi borrada',
-'watchnochange' => 'Ningún dos elementos baixo vixilancia foi editado no período de tempo indicado.',
'watchlist-details' => 'Hai {{PLURAL:$1|unha páxina|$1 páxinas}} na súa lista de vixilancia, sen contar as de conversa.',
-'wlheader-enotif' => '* A notificación por correo electrónico está activada.',
-'wlheader-showupdated' => "* As páxinas que cambiaron desde a súa última visita móstranse en '''negra'''",
+'wlheader-enotif' => 'A notificación por correo electrónico está activada.',
+'wlheader-showupdated' => "As páxinas que cambiaron desde a súa última visita móstranse en '''negra'''.",
'watchmethod-recent' => 'comprobando as edicións recentes na procura de páxinas vixiadas',
'watchmethod-list' => 'comprobando as páxinas vixiadas na procura de edicións recentes',
'watchlistcontains' => 'A súa lista de vixilancia ten $1 {{PLURAL:$1|páxina|páxinas}}.',
@@ -2570,7 +2655,7 @@ $1',
'contributions' => 'Contribucións {{GENDER:$1|do usuario|da usuaria}}',
'contributions-title' => 'Contribucións de $1',
'mycontris' => 'Contribucións',
-'contribsub2' => 'De $1 ($2)',
+'contribsub2' => 'De {{GENDER:$3|$1}} ($2)',
'nocontribs' => 'Non se deron atopado cambios con eses criterios.',
'uctop' => '(última revisión)',
'month' => 'Desde o mes de (e anteriores):',
@@ -2725,15 +2810,13 @@ Olle a [[Special:BlockList|lista de bloqueos]] para comprobar os bloqueos vixent
'ipb_blocked_as_range' => 'Erro: O enderezo IP $1 non está bloqueado directamente e non se pode desbloquear. Porén, está bloqueado por estar no rango $2, que si se pode desbloquear.',
'ip_range_invalid' => 'Rango IP non válido.',
'ip_range_toolarge' => 'Non están permitidos os rangos de bloqueo maiores que /$1.',
-'blockme' => 'Bloquearme',
'proxyblocker' => 'Bloqueador de proxy',
-'proxyblocker-disabled' => 'Esta función está desactivada.',
'proxyblockreason' => 'O seu enderezo IP foi bloqueado porque é un proxy aberto.
Por favor, contacte co seu fornecedor de acceso á Internet ou co seu soporte técnico e informe deste grave problema de seguridade.',
-'proxyblocksuccess' => 'Feito.',
'sorbsreason' => 'O seu enderezo IP está rexistrado como un proxy aberto na lista DNSBL usada por {{SITENAME}}.',
'sorbs_create_account_reason' => 'O seu enderezo IP está rexistrado como un proxy aberto na lista DNSBL usada por {{SITENAME}}.
Polo tanto, non pode crear unha conta',
+'xffblockreason' => 'Un enderezo IP presente na cabeceira X-Forwarded-For, ou ben seu ou ben dun servidor proxy que está utilizando, foi bloqueado. O motivo do bloqueo orixinal é: $1',
'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',
@@ -2896,6 +2979,8 @@ Por favor, visite a [//www.mediawiki.org/wiki/Localisation localización MediaWi
'thumbnail-more' => 'Ampliar',
'filemissing' => 'O ficheiro non se dá atopado',
'thumbnail_error' => 'Erro ao crear a miniatura: $1',
+'thumbnail_error_remote' => 'Mensaxe de erro de $1:
+$2',
'djvu_page_error' => 'A páxina DjVu está fóra do rango',
'djvu_no_xml' => 'Non se puido obter o XML para o ficheiro DjVu',
'thumbnail-temp-create' => 'Non se puido crear o ficheiro de miniatura temporal',
@@ -3045,17 +3130,11 @@ Pode ver o código fonte.',
# Stylesheets
'common.css' => '/** O CSS que se coloque aquí será aplicado a todas as aparencias */',
-'standard.css' => '/* O CSS que se coloque aquí afectará a quen use a aparencia Clásica */',
-'nostalgia.css' => '/* O CSS que se coloque aquí afectará a quen use a aparencia Morriña */',
'cologneblue.css' => '/* O CSS que se coloque aquí afectará a quen use a aparencia Azul colonial */',
'monobook.css' => '/* O CSS que se coloque aquí afectará a quen use a aparencia Monobook */',
-'myskin.css' => '/* O CSS que se coloque aquí afectará a quen use a aparencia A miña aparencia */',
-'chick.css' => '/* O CSS que se coloque aquí afectará a quen use a aparencia Parrulo */',
-'simple.css' => '/* O CSS que se coloque aquí afectará a quen use a aparencia Sinxela */',
'modern.css' => '/* O CSS que se coloque aquí afectará a quen use a aparencia Moderna */',
'vector.css' => '/* O CSS que se coloque aquí afectará a quen use a aparencia Vector */',
'print.css' => '/* O CSS que se coloque aquí afectará ás impresións */',
-'handheld.css' => '/* O CSS que se coloque aquí afectará aos dispositivos móbiles baseados na aparencia configurada en $wgHandheldStyle */',
'noscript.css' => '/* O CSS que se coloque aquí afectará aos usuarios co JavaScript desactivado */',
'group-autoconfirmed.css' => '/* O CSS que se coloque aquí afectará soamente aos usuarios autoconfirmados */',
'group-bot.css' => '/* O CSS que se coloque aquí afectará soamente aos bots */',
@@ -3064,13 +3143,8 @@ Pode ver o código fonte.',
# Scripts
'common.js' => '/* Calquera JavaScript que haxa aquí será cargado para todos os usuarios en cada páxina que vexan. */',
-'standard.js' => '/* Calquera JavaScript que haxa aquí será cargado para os usuarios que usen a aparencia Clásica */',
-'nostalgia.js' => '/* Calquera JavaScript que haxa aquí será cargado para os usuarios que usen a aparencia Morriña */',
'cologneblue.js' => '/* Calquera JavaScript que haxa aquí será cargado para os usuarios que usen a aparencia Azul colonial */',
'monobook.js' => '/* Calquera JavaScript que haxa aquí será cargado para os usuarios que usen a aparencia MonoBook */',
-'myskin.js' => '/* O JavaScript que se coloque aquí afectará a quen use a aparencia A miña aparencia */',
-'chick.js' => '/* Calquera JavaScript que haxa aquí será cargado para os usuarios que usen a aparencia Parrulo */',
-'simple.js' => '/* Calquera JavaScript que haxa aquí será cargado para os usuarios que usen a aparencia Sinxela */',
'modern.js' => '/* Calquera JavaScript que haxa aquí será cargado para os usuarios que usen a aparencia Moderna */',
'vector.js' => '/* Calquera JavaScript que haxa aquí será cargado para os usuarios que usen a aparencia Vector */',
'group-autoconfirmed.js' => '/* Calquera JavaScript que haxa aquí será cargado soamente para os usuarios autoconfirmados */',
@@ -3150,13 +3224,8 @@ Isto, probabelmente, se debe a unha ligazón cara a un sitio externo que está n
'pageinfo-category-files' => 'Número de ficheiros',
# Skin names
-'skinname-standard' => 'Clásica',
-'skinname-nostalgia' => 'Morriña',
'skinname-cologneblue' => 'Azul colonial',
'skinname-monobook' => 'MonoBook',
-'skinname-myskin' => 'A miña aparencia',
-'skinname-chick' => 'Parrulo',
-'skinname-simple' => 'Sinxela',
'skinname-modern' => 'Moderna',
# Patrolling
@@ -3235,11 +3304,25 @@ O seu sistema pode quedar comprometido se o executa.",
'minutes' => '{{PLURAL:$1|$1 minuto|$1 minutos}}',
'hours' => '{{PLURAL:$1|$1 hora|$1 horas}}',
'days' => '{{PLURAL:$1|$1 día|$1 días}}',
+'weeks' => '{{PLURAL:$1|$1 semana|$1 semanas}}',
'months' => '{{PLURAL:$1|$1 mes|$1 meses}}',
'years' => '{{PLURAL:$1|$1 ano|$1 anos}}',
'ago' => 'hai $1',
'just-now' => 'agora mesmo',
+# Human-readable timestamps
+'hours-ago' => 'hai {{PLURAL:$1|unha hora|$1 horas}}',
+'minutes-ago' => 'hai {{PLURAL:$1|un minuto|$1 minutos}}',
+'seconds-ago' => 'hai {{PLURAL:$1|un segundo|$1 segundos}}',
+'monday-at' => 'O luns ás $1',
+'tuesday-at' => 'O martes ás $1',
+'wednesday-at' => 'O mércores ás $1',
+'thursday-at' => 'O xoves ás $1',
+'friday-at' => 'O venres ás $1',
+'saturday-at' => 'O sábado ás $1',
+'sunday-at' => 'O domingo ás $1',
+'yesterday-at' => 'Onte ás $1',
+
# Bad image list
'bad_image_list' => 'O formato é o seguinte:
@@ -3268,7 +3351,7 @@ Os demais agocharanse por omisión.
* gpslongitude
* gpsaltitude',
-# EXIF tags
+# Exif tags
'exif-imagewidth' => 'Ancho',
'exif-imagelength' => 'Alto',
'exif-bitspersample' => 'Bits por compoñente',
@@ -3446,7 +3529,7 @@ Os demais agocharanse por omisión.
'exif-originalimageheight' => 'Altura da imaxe antes de ser cortada',
'exif-originalimagewidth' => 'Ancho da imaxe antes de ser cortada',
-# EXIF attributes
+# Exif attributes
'exif-compression-1' => 'Sen comprimir',
'exif-compression-2' => 'CCITT Grupo 3 Lonxitude de codificación unidimensional Huffman modificada',
'exif-compression-3' => 'CCITT Grupo 3 codificación de fax',
@@ -3846,7 +3929,6 @@ Tamén pode [[Special:EditWatchlist|empregar o editor normal]].',
'version-other' => 'Outros',
'version-mediahandlers' => 'Executadores de multimedia',
'version-hooks' => 'Asociadores',
-'version-extension-functions' => 'Funcións das extensións',
'version-parser-extensiontags' => 'Etiquetas das extensións do analizador',
'version-parser-function-hooks' => 'Asociadores da función do analizador',
'version-hook-name' => 'Nome do asociador',
@@ -3855,6 +3937,7 @@ Tamén pode [[Special:EditWatchlist|empregar o editor normal]].',
'version-license' => 'Licenza',
'version-poweredby-credits' => "Este wiki está desenvolvido por '''[//www.mediawiki.org/wiki/MediaWiki/gl MediaWiki]''', dereitos de autor © 2001-$1 $2.",
'version-poweredby-others' => 'outros',
+'version-poweredby-translators' => 'os tradutores de translatewiki.net',
'version-credits-summary' => 'Queremos recoñecer as seguintes persoas polas súas achegas a [[Special:Version|MediaWiki]].',
'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.
@@ -3870,12 +3953,17 @@ Debería recibir [{{SERVER}}{{SCRIPTPATH}}/COPYING unha copia da licenza públic
'version-entrypoints-articlepath' => '[https://www.mediawiki.org/wiki/Manual:$wgArticlePath Ruta dos artigos]',
'version-entrypoints-scriptpath' => '[https://www.mediawiki.org/wiki/Manual:$wgScriptPath Ruta das escrituras]',
-# Special:FilePath
-'filepath' => 'Ruta do ficheiro',
-'filepath-page' => 'Ficheiro:',
-'filepath-submit' => 'Ir',
-'filepath-summary' => 'Esta páxina especial devolve a ruta completa dun ficheiro.
-As imaxes móstranse na súa resolución completa; outros tipos de ficheiros inícianse directamente co seu programa asociado.',
+# Special:Redirect
+'redirect' => 'Redirixir por nome de ficheiro, ID de usuario ou ID de revisión',
+'redirect-legend' => 'Redirixir a un ficheiro ou unha páxina',
+'redirect-summary' => 'Esta páxina especial redirixe cara a un ficheiro (dado o nome), unha páxina (dado o ID dunha revisión) ou unha páxina de usuario (dado o ID dun usuario).',
+'redirect-submit' => 'Continuar',
+'redirect-lookup' => 'Procurar:',
+'redirect-value' => 'Valor:',
+'redirect-user' => 'ID de usuario',
+'redirect-revision' => 'Revisión de páxina',
+'redirect-file' => 'Nome de ficheiro',
+'redirect-not-exists' => 'Non se atopou o valor',
# Special:FileDuplicateSearch
'fileduplicatesearch' => 'Procurar ficheiros duplicados',
@@ -3924,12 +4012,16 @@ As imaxes móstranse na súa resolución completa; outros tipos de ficheiros inÃ
'tags' => 'Etiquetas de cambios válidas',
'tag-filter' => 'Filtrar as [[Special:Tags|etiquetas]]:',
'tag-filter-submit' => 'Filtro',
+'tag-list-wrapper' => '([[Special:Tags|{{PLURAL:$1|Etiqueta|Etiquetas}}]]: $2)',
'tags-title' => 'Etiquetas',
'tags-intro' => 'Esta páxina lista as etiquetas coas que o software pode marcar unha edición, e mailos seus significados.',
'tags-tag' => 'Nome da etiqueta',
'tags-display-header' => 'Aparición nas listas de cambios',
'tags-description-header' => 'Descrición completa do significado',
+'tags-active-header' => 'Activa?',
'tags-hitcount-header' => 'Edicións etiquetadas',
+'tags-active-yes' => 'Si',
+'tags-active-no' => 'Non',
'tags-edit' => 'editar',
'tags-hitcount' => '$1 {{PLURAL:$1|modificación|modificacións}}',
@@ -3950,6 +4042,7 @@ As imaxes móstranse na súa resolución completa; outros tipos de ficheiros inÃ
'dberr-problems' => 'Sentímolo! Este sitio está experimentando dificultades técnicas.',
'dberr-again' => 'Por favor, agarde uns minutos e logo probe a cargar de novo a páxina.',
'dberr-info' => '(Non se pode conectar co servidor da base de datos: $1)',
+'dberr-info-hidden' => '(Non se pode conectar co servidor da base de datos)',
'dberr-usegoogle' => 'Mentres tanto, pode probar a buscar co Google.',
'dberr-outofdate' => 'Teña en conta que os índices de Google do noso contido poden non estar actualizados.',
'dberr-cachederror' => 'O seguinte contido é unha copia da memoria caché da páxina solicitada, polo que pode non estar actualizada.',
@@ -3965,6 +4058,9 @@ As imaxes móstranse na súa resolución completa; outros tipos de ficheiros inÃ
'htmlform-submit' => 'Enviar',
'htmlform-reset' => 'Desfacer os cambios',
'htmlform-selectorother-other' => 'Outro',
+'htmlform-no' => 'Non',
+'htmlform-yes' => 'Si',
+'htmlform-chosen-placeholder' => 'Seleccione unha opción',
# SQLite database support
'sqlite-has-fts' => '$1 con soporte para procuras de texto completo',
@@ -4082,4 +4178,19 @@ En caso contrario, pode empregar o formulario sinxelo inferior. O seu comentario
# Image rotation
'rotate-comment' => 'Imaxe rotada $1 {{PLURAL:$1|grao|graos}} en sentido horario',
+# Limit report
+'limitreport-title' => 'Datos do perfil do analizador:',
+'limitreport-cputime' => 'Tempo de uso da CPU',
+'limitreport-cputime-value' => '$1 {{PLURAL:$1|segundo|segundos}}',
+'limitreport-walltime' => 'Tempo real de uso',
+'limitreport-walltime-value' => '$1 {{PLURAL:$1|segundo|segundos}}',
+'limitreport-ppvisitednodes' => 'Número de nodos do preprocesador visitados',
+'limitreport-ppgeneratednodes' => 'Número de nodos do preprocesador xerados',
+'limitreport-postexpandincludesize' => 'Tamaño de inclusión logo da expansión',
+'limitreport-postexpandincludesize-value' => '$1/$2 {{PLURAL:$2|byte|bytes}}',
+'limitreport-templateargumentsize' => 'Tamaño dos argumentos do modelo',
+'limitreport-templateargumentsize-value' => '$1/$2 {{PLURAL:$2|byte|bytes}}',
+'limitreport-expansiondepth' => 'Máxima profundidade de expansión',
+'limitreport-expensivefunctioncount' => 'Número de funcións de análise custosas',
+
);
diff --git a/languages/messages/MessagesGn.php b/languages/messages/MessagesGn.php
index 8c13c250..08e925cb 100644
--- a/languages/messages/MessagesGn.php
+++ b/languages/messages/MessagesGn.php
@@ -540,11 +540,6 @@ Reomĩsérõ ta'ãnga peteĩ kuatiaroguépe, eipuru peteĩ joaju:
# Special:Version
'version' => "Mba'ereko",
-# Special:FilePath
-'filepath' => 'Ruta de archivo',
-'filepath-page' => 'Archivo:',
-'filepath-submit' => 'Ruta',
-
# Special:SpecialPages
'specialpages' => 'Kuatiarogue hekochĩchĩva',
diff --git a/languages/messages/MessagesGrc.php b/languages/messages/MessagesGrc.php
index bd030445..f1161fd4 100644
--- a/languages/messages/MessagesGrc.php
+++ b/languages/messages/MessagesGrc.php
@@ -67,9 +67,6 @@ $messages = array(
'tog-shownumberswatching' => 'ΔεικνÏναι τὸν á¼€Ïιθμὸν τῶν παÏακολουθοÏντων χÏωμένων',
'tog-oldsig' => 'ΠÏοθεώÏησις τῆς ὑπαÏχοÏσης ὑπογÏαφῆς:',
'tog-fancysig' => 'ἈκατέÏγασται ὑπογÏαφαί á¼Î½ εἴδει βικι-κειμένου (ἄνευ αá½Ï„ομάτου συνδέσμου)',
-'tog-externaleditor' => 'ΧÏῆσθαι á¼Î¾Ï‰Ï„έÏῳ Ï€ÏογÏάμματι á¼Ï€ÎµÎ¾ÎµÏγασίας κειμένων κατὰ Ï€Ïοεπιλογήν (Ï€Ïὸς εἰδικοὺς μόνον· ἀπαÏαίτητοι εἰσὶν εἰδικαὶ ῥυθμίσεις τινὲς á¼Î½ τῇ σῇ ὑπολογιστικῇ μηχανῇ)',
-'tog-externaldiff' => 'ΧÏῆσθαι á¼Î¾Ï‰Ï„έÏῳ λογισμικῷ ἀντιπαÏαβολῆς κατὰ Ï€Ïοεπιλογὴν (Ï€Ïὸς εἰδικοὺς μόνον· ἀπαÏαίτητοι εἰσὶν εἰδικαὶ ῥυθμίσεις τινες á¼Î½ τῇ σῇ ὑπολογιστικῇ μηχανῇ)',
-'tog-showjumplinks' => 'ἘνεÏγοποιεῖν τοὺς "ἅλμα Ï€Ïὸς" συνδέσμους Ï€Ïοσβασιμότητος',
'tog-uselivepreview' => 'ΧÏῆσθαι ἀμέσῳ Ï€ÏοθεωÏήσει (JavaScript) (ΠειÏαστικόν)',
'tog-forceeditsummary' => 'ΠÏομήνυσόν με εἰ εἰσάγω κενὴν σÏνοψιν μεταγÏαφῆς',
'tog-watchlisthideown' => 'Οὠδηλοῦν Ï„á½°Ï‚ á¼Î¼á½°Ï‚ μεταβολὰς á¼Î½ τοῖς á¼Ï†Î¿Ïωμένοις μου',
@@ -263,7 +260,7 @@ $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).
+# 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).
'aboutsite' => 'ΠεÏὶ {{SITENAME}}',
'aboutpage' => 'Project:ΠεÏὶ',
'copyright' => 'Ἡ διάθεσις τοῦδε πεÏιεχομένου á¼ÏƒÏ„ιν ὑπὸ $1.',
@@ -273,7 +270,6 @@ $1',
'disclaimers' => 'Ἀποποιήσεις',
'disclaimerpage' => 'Project:Γενικὴ ἀποποίησις',
'edithelp' => 'Βοήθεια πεÏὶ τοῦ μεταγÏάφειν',
-'edithelppage' => 'Help:Βοήθεια πεÏὶ τοῦ μεταγÏάφειν',
'helppage' => 'Help:ΠεÏιεχόμενα',
'mainpage' => 'ΚυÏία Δέλτος',
'mainpage-description' => 'ΚυÏία Δέλτος',
@@ -345,17 +341,6 @@ $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' => 'Λέγε διὰ τὶ τὸ ἀποκλῄειν τε καὶ ὅτε τοῦτο á¼€Ïθήσεται',
@@ -396,7 +381,6 @@ $1',
'protectedpagetext' => 'Ἥδε ἡ δέλτος ἀποκεκλῃμένη á¼ÏƒÏ„ὶν εἰς ἀποτÏοπὴν τοῦ μεταγÏάφειν.',
'viewsourcetext' => 'Ἔξεστί σοι á½Ïᾶν τε καὶ ἀντιγÏάφειν τὴν τῆς δέλτου πηγήν:',
'protectedinterface' => 'Ἥδε ἡ δέλτος παÏέχει κείμενον διεπιφανείας διὰ τὸ λογισμικὸν καὶ κεκλῃσμένη á¼ÏƒÏ„ὶ Ï€Ïος ἀποφυγὴν καταχÏήσεων.',
-'sqlhidden' => '(πεῦσις SQL κεκÏυμμένη)',
'cascadeprotected' => 'Ἥδε ἡ δέλτος πεφÏλακται, διότι συμπεÏιλαμβάνεται á¼Î½ {{PLURAL:$1|τῇ ἑξῆς δέλτῳ á¼¥Ï€ÎµÏ Ï€ÎµÏ†Ï…Î»Î±Î³Î¼Î­Î½Î· á¼ÏƒÏ„ὶ|ταῖς ἑξῆς δέλτοις Î±á¼µÏ€ÎµÏ Ï€ÎµÏ†Ï…Î»Î±Î³Î¼Î­Î½Î±Î¹ εἰσὶ}} μέσῳ τῆς á¼Î½ÎµÏγοποιηθεῖσας διαδοχικῆς Ï€Ïοστασίας á¼Î½ Ï„á¿·:
$2',
'namespaceprotected' => "Οá½Îº ἔξεστί σοι μεταγÏάφειν δέλτους á¼Î½ Ï„á¿· ὀνοματείῳ '''$1'''.",
@@ -487,7 +471,7 @@ $2',
'newpassword' => 'Îέον σÏνθημα:',
'retypenew' => 'ἈνατÏπωσις νέου συνθήματος:',
'resetpass_submit' => 'ἈναδιοÏισμὸς συνθήματος καὶ σÏνδεσις',
-'resetpass_success' => 'Τὸ σὸν σÏνθημα εὖ μεταβεβλημένον á¼ÏƒÏ„ίν! Îῦν συνδέῃ...',
+'changepassword-success' => 'Τὸ σὸν σÏνθημα εὖ μεταβεβλημένον á¼ÏƒÏ„ίν! Îῦν συνδέῃ...',
'resetpass_forbidden' => 'Οá½Îº ἔξεστι τοῖς συνθήμασιν ἀλλαγῆναι',
'resetpass-no-info' => 'Ἐὰν μὴ συνδέῃ οá½Îº ἔξεστί σοι εá½Î¸Î­Ï‰Ï‚ δεῦÏο βαίνειν.',
'resetpass-submit-loggedin' => 'Ἀλλάττειν σÏνθημα',
@@ -798,7 +782,6 @@ $1",
'searchmenu-legend' => 'Ἐπιλογαὶ ζητήσεως',
'searchmenu-exists' => "'''ὙπάÏχει δέλτος τις ὀνόματι \"[[:\$1]]\" á¼Î½ τῷδε Ï„á¿· βίκι'''",
'searchmenu-new' => "'''Ποιεῖν τὴν δέλτον \"[[:\$1]]\" á¼Î½ τῷδε Ï„á¿· βίκι'''",
-'searchhelp-url' => 'Help:ΠεÏιεχόμενα',
'searchmenu-prefix' => '[[Special:PrefixIndex/$1|Ζήτησις δέλτων á¼Ï‡Î¿Ï…σῶν τόδε τὸ Ï€Ïόθεμα]]',
'searchprofile-articles' => 'Δέλτοι πεÏιεχομένων',
'searchprofile-project' => 'Βοήθεια καὶ δέλτοι á¼Î³Ï‡ÎµÎ¹Ïήματος',
@@ -839,14 +822,6 @@ $1",
'powersearch-togglenone' => 'Οá½Î´Î­Î½',
'search-external' => 'ἘξωτέÏα ἀναζήτησις',
-# Quickbar
-'qbsettings' => 'Ταχεῖα Ï€Ïόσβασις',
-'qbsettings-none' => 'Οá½Î´Î­Î½',
-'qbsettings-fixedleft' => 'ΣταθεÏá½° á¼€ÏιστεÏÏŽÏ‚',
-'qbsettings-fixedright' => 'ΣταθεÏá½° δεξιώς',
-'qbsettings-floatingleft' => 'Πλανώμενα αÏιστεÏÏŽÏ‚',
-'qbsettings-floatingright' => 'Πλανώμενα δεξιώς',
-
# Preferences page
'preferences' => 'ΠÏοαιÏέσεις',
'mypreferences' => 'Αἱ Ï€ÏοαιÏέσεις μου',
@@ -876,7 +851,6 @@ $1",
'resetprefs' => 'ἘκκαθαίÏειν ἀσώτους ἀλλαγάς',
'restoreprefs' => 'Ἐπανιστάναι á¼Ï€Î¬ÏƒÎ±Ï‚ Ï„á½°Ï‚ Ï€ÏοκαθωÏισμένας ῥυθμίσεις',
'prefs-editing' => 'Τὸ μεταγÏάφειν',
-'prefs-edit-boxsize' => 'Μέγεθος τῆς θυÏίδος μεταγÏαφῆς.',
'rows' => 'ΣειÏαί:',
'columns' => 'Στῆλαι:',
'searchresultshead' => 'Ζητεῖν',
@@ -914,7 +888,6 @@ $1",
'prefs-custom-css' => 'CSS παÏαγγελτόν',
'prefs-custom-js' => 'JS παÏαγγελτόν',
'prefs-emailconfirm-label' => 'Ἐπιβεβαίωσις ἠλ.-διευθÏνσεως:',
-'prefs-textboxsize' => 'Μέγεθος τῆς θυÏίδος μεταγÏαφῆς',
'youremail' => 'ἨλεκτÏονικαὶ á¼Ï€Î¹ÏƒÏ„ολαί:',
'username' => 'Ὄνομα χÏωμένου:',
'uid' => 'Ταυτότης χÏωμένου:',
@@ -1127,7 +1100,6 @@ $1",
'recentchangeslinked-feed' => 'Οἰκεῖαι μεταβολαί',
'recentchangeslinked-toolbox' => 'Οἰκεῖαι μεταβολαί',
'recentchangeslinked-title' => 'Μεταβολαὶ οἰκεῖαι "$1"',
-'recentchangeslinked-noresult' => 'Οá½Î´ÎµÎ¼Î¯Î± ἀλλαγὴ τῶν συνδεδεμένων δέλτων á¼Î½ τῇ δεδομένῃ χÏονικῇ πεÏιόδῳ.',
'recentchangeslinked-summary' => "á½Î´Îµ á¼ÏƒÏ„ὶ κατάλογος τῶν νέων μεταβόλων κατὰ δέλτους συνδεδεμένας σὺν δέλτῳ τινί (á¼¢ κατὰ μέλη κατηγοÏίας τινός).
Δέλτοι á¼Î½ Ï„á¿· [[Special:Watchlist|καταλόγῳ á¼Ï†Î¿Ïωμένων]] σου '''ἔντονοι''' εἰσίν.",
'recentchangeslinked-page' => 'Ὄνομα δέλτου:',
@@ -1344,9 +1316,6 @@ $1",
'statistics-users-active-desc' => 'ΧÏώμενοι δÏαστήÏιοι á¼Î½ Ï„á¿· παÏελθόντι μηνί {{PLURAL:$1|ἡμέÏα|$1 ἡμέÏαι}}',
'statistics-mostpopular' => 'Αἱ πλέον θεωÏουμέναι δέλτοι',
-'disambiguations' => 'Σαφηνίσεως δέλτοι',
-'disambiguationspage' => 'Template:σαφήνισις',
-
'doubleredirects' => 'ἈναδιευθÏνσεις διπλότυπαι',
'doubleredirectstext' => 'Ἥδε ἡ δέλτος συγκαταλέγει δέλτους Î±á¼µÏ€ÎµÏ á¼€Î½Î±ÎºÎ±Ï„ÎµÏ…Î¸Ïνουσι Ï€Ïὸς ἑτέÏας δέλτους ἀνακατευθÏνσεως. Πᾶσα σειÏά πεÏιέχει συνδέσμους Ï€Ïὸς τὴν τε Ï€Ïώτην καὶ τὴν τε δευτέÏαν δέλτον ἀνακατευθÏνσεως καὶ τὸν τε Ï€ÏοοÏισμὸν τῆς δευτέÏας δέλτου ἀνακατευθÏνσεως á¼¥Ï€ÎµÏ á¼ÏƒÏ„ὶ συνήθως ὠπÏαγματικὸς Ï€ÏοοÏισμὸς τῆς ἀνακατευθÏνσεως ὅπου σὲ ἔδει δεδεγμένος εἶναι. Τὰ <del>διαγεγÏαμμένα</del> λήμματα á¼Ï€Î¹Î»Î­Î»Ï…νται.',
'double-redirect-fixed-move' => 'Ἡ [[$1]] κεκίνηται, τὸ νῦν ἀναδιευθÏνεται Ï€Ïὸς τὴν [[$2]]',
@@ -1542,9 +1511,8 @@ $1",
'unwatchthispage' => 'Παῦσαι τὸ á¼Ï†Î¿Ïᾶν',
'notanarticle' => 'Μὴ δέλτος χÏήματος',
'notvisiblerev' => 'ἈναθεώÏησις διαγεγÏαμμένη',
-'watchnochange' => 'Οá½Î´á½²Î½ á¼Îº τῶν á¼Ï†Î¿Ïωμένων τεμαχίων σου μετεγÏάφη Ï„á¿· δεικνυμένῳ χÏόνῳ.',
'watchlist-details' => '{{PLURAL:$1|$1 δέλτος|$1 δέλτοι}} á¼Ï†Î¿Ïωμέναι, ἄνευ τῶν δέλτων διαλέξεως πεÏιλαμβανομένων.',
-'wlheader-enotif' => '* ΣÏστημα εἰδήσεως μέσῳ ἠλ-á¼Ï€Î¹ÏƒÏ„ολῶν á¼Î½ÎµÏγόν.',
+'wlheader-enotif' => 'ΣÏστημα εἰδήσεως μέσῳ ἠλ-á¼Ï€Î¹ÏƒÏ„ολῶν á¼Î½ÎµÏγόν.',
'watchmethod-recent' => 'á¼Î»Î­Î³Ï‡ÎµÎ¹Î½ Ï€Ïοσφάτους μεταγÏαφὰς πεÏὶ á¼Ï†Î¿Ïωμένων δέλτων',
'watchmethod-list' => 'á¼Î»Î­Î³Ï‡ÎµÎ¹Î½ á¼Ï†Î¿Ïωμένας δέλτους πεÏὶ μεταγÏαφὰς Ï€Ïοσφάτους',
'watchlistcontains' => 'Ἡ á¼Ï†Î¿Ïοδιαλογὴ σου πεÏιέχει $1 {{PLURAL:$1|δέλτον|δέλτους}}.',
@@ -1843,10 +1811,7 @@ $1',
'ipb_cant_unblock' => 'Σφάλμα: Ἡ φÏαγὴ τῆς ID $1 οá½Ï‡ εὑÏέθη.
Εἰκότως ἀποπεφÏαγμένη ἤδη á¼ÏƒÏ„ίν.',
'ip_range_invalid' => 'ἌκυÏον IP-εὖÏος.',
-'blockme' => 'ΦÏάξον με',
'proxyblocker' => 'ἘÏγαλεῖον φÏαγῆς διακομιστῶν',
-'proxyblocker-disabled' => 'Ἥδε ἡ á¼Î½Î­Ïγεια κατεσταλμένη εστίν.',
-'proxyblocksuccess' => 'Γενομένη.',
'cant-block-while-blocked' => 'Οá½Îº ἔξεστί σοι φÏάττειν ἑτέÏους χÏωμένους á¼Î½ ὅσῳ πεφÏαγμένος εἶ.',
# Developer tools
@@ -2197,7 +2162,7 @@ $1',
* gpslongitude
* gpsaltitude',
-# EXIF tags
+# Exif tags
'exif-imagewidth' => 'Πλάτος',
'exif-imagelength' => 'á½ÏˆÎ¿Ï‚',
'exif-bitspersample' => 'Δυφία ἀνὰ συνιστῶσαν',
@@ -2319,7 +2284,7 @@ $1',
'exif-label' => 'ἘπιγÏαφή',
'exif-disclaimer' => 'Ἀποποίησις εá½Î¸Ïνης',
-# EXIF attributes
+# Exif attributes
'exif-compression-1' => 'Ἀσυμπίεστος',
'exif-copyrighted-true' => 'Ὑποκείμενον έν δικαιώμασιν',
@@ -2602,7 +2567,6 @@ $5
'version-other' => 'Ἄλλα',
'version-mediahandlers' => 'ΧειÏισταὶ μέσων',
'version-hooks' => 'ἈγγÏλαι',
-'version-extension-functions' => 'ἘνέÏγειαι á¼Ï€ÎµÎºÏ„άσεων',
'version-parser-extensiontags' => 'ΣἠμαντÏα á¼Ï€ÎµÎºÏ„άσεων λεξιαναλυτικοῦ Ï€ÏογÏάμματος',
'version-parser-function-hooks' => 'ἈγγÏλαι á¼Î½ÎµÏγειῶν λεξιαναλυτικοῦ Ï€ÏογÏάμματος',
'version-hook-name' => 'Ὄνομα ἀγκÏλης',
@@ -2614,11 +2578,6 @@ $5
'version-software-product' => 'ΠÏοϊόν',
'version-software-version' => 'Ἔκδοσις',
-# Special:FilePath
-'filepath' => 'ΔιαδÏομὴ á¼€Ïχείου',
-'filepath-page' => 'ἈÏχεῖον:',
-'filepath-submit' => 'Ἰέναι',
-
# Special:FileDuplicateSearch
'fileduplicatesearch' => 'Ζήτησις διπλότυπων á¼€Ïχείων',
'fileduplicatesearch-summary' => 'Ζητεῖν διπλότυπα á¼€Ïχεῖα βάσει κεÏματιζομένων τιμῶν.',
diff --git a/languages/messages/MessagesGsw.php b/languages/messages/MessagesGsw.php
index 01ff8748..46e3e29e 100644
--- a/languages/messages/MessagesGsw.php
+++ b/languages/messages/MessagesGsw.php
@@ -16,6 +16,7 @@
* @author MaxSem
* @author Melancholie
* @author MichaelFrey
+ * @author Nemo bis
* @author Purodha
* @author Remember the dot
* @author Spacebirdy
@@ -162,9 +163,6 @@ $messages = array(
'tog-shownumberswatching' => 'Aazahl Benutzer aazeige, wo ne Syten am Aaluege sy (i den Artikelsyte, i de «letschten Änderigen» und i der Beobachtigslischte)',
'tog-oldsig' => 'Vorschau vu dr Unterschrift:',
'tog-fancysig' => 'Signatur as Wikitext behandle (ohni automatischi Vergleichig)',
-'tog-externaleditor' => 'Externe Editor als Standard bruche (nume fir Experte, doderzue brucht s speziälli Yystellige uf em Computer. [//www.mediawiki.org/wiki/Manual:External_editors Wyteri Informatione doderzue.])',
-'tog-externaldiff' => 'Extern Programm fir Versionsunterschid als Standard bruche (nume fir Experte, doderzue brucht s speziälli Yystellige uf em Computer. [//www.mediawiki.org/wiki/Manual:External_editors Wyteri Informatione doderzue.])',
-'tog-showjumplinks' => '«Wächsle-zu»-Links ermügleche',
'tog-uselivepreview' => 'Live-Vorschau bruche (JavaScript) (experimentell)',
'tog-forceeditsummary' => 'Sag mer s, wänn i s Zämmefassigsfeld läär loss',
'tog-watchlisthideown' => 'Eigeni Änderige uf d Beobachtigslischt usblände',
@@ -178,6 +176,7 @@ $messages = array(
'tog-showhiddencats' => 'Zeig di versteckte Kategorie',
'tog-noconvertlink' => 'Konvertierig vum Titel deaktiviere',
'tog-norollbackdiff' => 'Unterschid noch em Zrucksetze unterdrucke',
+'tog-useeditwarning' => 'Warn mi, wänn I ne Syte verloss mit Bearbeitige, wu nonig gspycheret sin',
'underline-always' => 'immer',
'underline-never' => 'nie',
@@ -364,7 +363,7 @@ 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).
+# 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).
'aboutsite' => 'Ãœber {{GRAMMAR:akkusativ|{{SITENAME}}}}',
'aboutpage' => 'Project:Ãœber {{UCFIRST:{{GRAMMAR:akkusativ|{{SITENAME}}}}}}',
'copyright' => 'Der Inhalt vo dere Syte stoht unter der $1.',
@@ -374,7 +373,6 @@ Di maximal Wartezyt fir e Lock isch umme',
'disclaimers' => 'Impressum',
'disclaimerpage' => 'Project:Impressum',
'edithelp' => 'Rotschläg fir s Bearbeite',
-'edithelppage' => 'Help:Ändere',
'helppage' => 'Help:Hilf',
'mainpage' => 'Houptsyte',
'mainpage-description' => 'Houptsyte',
@@ -451,17 +449,6 @@ Alli verfiegbare Spezialsyte sin in dr [[Special:SpecialPages|Lischt vu Spezials
# General errors
'error' => 'Fähler',
'databaseerror' => 'Fähler in dr Datebank',
-'dberrortext' => 'S isch e Datebankfähler ufträtte.
-Dr Grund cha ne e Programmierfähler syy.
-Di letscht Datebankabfrog isch
-<blockquote><code>$1</code></blockquote>
-us dr Funktion „<code>$2</code>“ gsi.
-D Datebank het dr Fähler „<samp>$3: $4</samp>“ gmäldet.',
-'dberrortextcl' => 'S het e Syntaxfähler gee in dr Abfrog vu dr Datebank.
-Di letscht Datebankabfrog isch
-„$1“
-us dr Funktion „$2“ gsi.
-D Datebank het dr Fähler „$3: $4“ gmäldet.',
'laggedslavemode' => 'Warnig: di letschte Änderige wäre u. U. nonig aazeigt!',
'readonly' => 'Datebank isch gsperrt',
'enterlockreason' => 'Bitte gib e Grund y, worum d Datebank soll gsperrt wäre un e Yschätzig wie lang si soll gsperrt blybe',
@@ -509,7 +496,6 @@ Abfrog: $2',
'viewyourtext' => "Du chasch dr Quälltext vu '''Dyre Bearbeitig''' vu däre Syte aaluege un kopiere:",
'protectedinterface' => 'In däre Syte het s Text fir s Sproch-Interface vu dr Software un si isch gsperrt, zum Missbruch z verhindre.',
'editinginterface' => "'''Obacht:''' Du bisch e Syten am Verändere, wu zum User.Interface ghert. Wänn Du die Syte veränderesch, no änderet sich s User-Interface au fir di andere Benutzer vu däm Wiki. Fir Ibersetzige lueg bitte, eb Du doodefir s [//translatewiki.net/wiki/Main_Page?setlang=gsw Translatewiki] witt bruuche, s MediaWiki-Lokalisierigsprojäkt.",
-'sqlhidden' => '(SQL-Abfrog verschteckt)',
'cascadeprotected' => 'Die Syte isch fir s Bearbeite gsperrt. Si isch yybunde in {{PLURAL:$1|die Syte, wu do chunnt|die Syte, wu do chemme}} , wu mit ere Kaskadesperroption gschitzt {{PLURAL:$1|isch|sin}}:
$2',
'namespaceprotected' => "Du hesch kei Berächtigung, die Syte im '''$1'''-Namensruum z bearbeite.",
@@ -541,7 +527,6 @@ Ochat: s cha syy, ass bstimmti Syte eso aazeigt wäre, wie wänn Du allno aagmä
'yourpassword' => 'Passwort:',
'yourpasswordagain' => 'Passwort no mol yygee:',
'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',
'password-change-forbidden' => 'Du chasch uf däm Wiki kei Passwerter ändere.',
'externaldberror' => 'Entwäder s lit e Fähler bi dr externe Authentifizierung vor, oder Du derfsch Dyy extern Benutzerkonto nid aktualisiere.',
@@ -643,7 +628,7 @@ Wänn s Benutzerkonto us Versäh aaglait woren isch, chasch die Nochricht ignori
'newpassword' => 'Nöis Passwort',
'retypenew' => 'Nöis Passwort (es zwöits Mal)',
'resetpass_submit' => 'Passwort ibermittle un aamälde',
-'resetpass_success' => 'Dyy Passwort isch erfolgryych gänderet wore. Jetz chunnt d Aamäldig …',
+'changepassword-success' => 'Dyy Passwort isch erfolgryych gänderet wore. Jetz chunnt d Aamäldig …',
'resetpass_forbidden' => 'S Passwort cha nid gänderet wäre.',
'resetpass-no-info' => 'Du muesch Di aamälde zum uf die Syte diräkt zuegryfe z chenne.',
'resetpass-submit-loggedin' => 'Passwort ändere',
@@ -654,10 +639,8 @@ Villicht hesch Dyy Passwort scho gänderet oder e nej temporär Passwort aagford
# Special:PasswordReset
'passwordreset' => 'Passwort zruggsetze',
-'passwordreset-text' => 'Bitte des Formular uusfille, ass De E-Mail e Erinnerig zue dr Aamäldeinformatione vu Dyym Benutzerkonto iberchunnsch.',
'passwordreset-legend' => 'Passwort zrucksetze',
'passwordreset-disabled' => 'S Zrucksetze vu Passwerter isch in däm Wiki deaktiviert wore.',
-'passwordreset-pretext' => '{{PLURAL:$1||Gib eis vu däne Daten aa}}',
'passwordreset-username' => 'Benutzername:',
'passwordreset-domain' => 'Domain:',
'passwordreset-capture' => 'Die E-Mail aaluege?',
@@ -893,6 +876,8 @@ Si isch schyns glescht wore.',
'content-failed-to-parse' => 'Parse vum Inhalt $2 fir Modell $1 fählgschlaa: $3',
'invalid-content-data' => 'Uugiltigi Inhaltsdate',
'content-not-allowed-here' => 'Dr Inhalt „$1“ isch uf dr Syte [[$2]] nit erlaubt',
+'editwarning-warning' => 'Wänn Du die Syte verlosch, cha s syy, ass Du alli Bearbeitige verliersch, wu Du do dra gmacht hesch.
+Wänn Du aagmäldet bisch, chasch s Anzeige vu däre Warnig im „{{int:prefs-editing}}“-Beryych vu Dyyne Yystelligen abstelle.',
# Content models
'content-model-wikitext' => 'Wikitext',
@@ -1128,7 +1113,6 @@ Einzelheite chasch im [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}
'searchmenu-legend' => 'Suechoptione',
'searchmenu-exists' => "* Syte '''[[$1]]'''",
'searchmenu-new' => "'''[[:$1|Leg d Syte ''$1'' in dem Wiki aa!]]'''",
-'searchhelp-url' => 'Help:Hilf',
'searchmenu-prefix' => '[[Special:PrefixIndex/$1|Zeige alli Syte, wu mit dem Suechbegriff aafange]]',
'searchprofile-articles' => 'Inhaltssyte',
'searchprofile-project' => 'Hilf- un Projäktsyte',
@@ -1170,15 +1154,6 @@ Einzelheite chasch im [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}
'search-external' => 'Externi Suech',
'searchdisabled' => 'D {{SITENAME}}-Suech isch deaktiviert. Du chasch mit Google sueche, s cha aber syy ass dr Suechindex vu Google fir {{SITENAME}} veraltet isch.',
-# Quickbar
-'qbsettings' => 'Syteleischte',
-'qbsettings-none' => 'Keini',
-'qbsettings-fixedleft' => 'Links, fescht',
-'qbsettings-fixedright' => 'Rächts, fescht',
-'qbsettings-floatingleft' => 'Links, in dr Schwebi',
-'qbsettings-floatingright' => 'Rächts, in dr Schwebi',
-'qbsettings-directionality' => 'Fescht, abhängig vu dr Schrybrichtig vu dr gwehlte Sproch',
-
# Preferences page
'preferences' => 'Yystellige',
'mypreferences' => 'Yystellige',
@@ -1211,7 +1186,6 @@ Einzelheite chasch im [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}
'resetprefs' => 'Änderige doch nid spychere',
'restoreprefs' => 'Alli Standardyystellige widerhärstelle',
'prefs-editing' => 'Tekscht-Ygab',
-'prefs-edit-boxsize' => 'Gressi vum Bearbeitigsfänschter.',
'rows' => 'Zylene',
'columns' => 'Spaltene',
'searchresultshead' => 'Suech-Ergäbnis',
@@ -1222,9 +1196,6 @@ Einzelheite chasch im [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}
'recentchangesdays-max' => '(Maximal $1 {{PLURAL:$1|Tag|Täg}})',
'recentchangescount' => 'Aazahl vu Bearbeitige, wu standardmässig aazeigt wäre:',
'prefs-help-recentchangescount' => 'Des umfasst d Lischt vu dr letschte Änderige, d Versionsgschicht un d Logbiecher.',
-'prefs-help-watchlist-token' => 'S Uusfille vu däm Fäld mit eme gheime Schlissel generiert e RSS-Feed fir Dyy Beobachtigslischt.
-E jede, wu dää Schlissel chännt, chaa Dyy Beobachtigslischt bschaue. Wehl wäge däm e sichere Wärt.
-Do het s e zuefellig generierte Wärt, wu du chasch bruche: $1',
'savedprefs' => 'Dyni Ystellige sy gspycheret worde.',
'timezonelegend' => 'Zytzone:',
'localtime' => 'Ortszyt:',
@@ -1255,7 +1226,6 @@ Do het s e zuefellig generierte Wärt, wu du chasch bruche: $1',
'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:',
-'prefs-textboxsize' => 'Greßi vum Bearbeitigsfänschter',
'youremail' => 'E-Mail-Adräss:',
'username' => 'Benutzername:',
'uid' => 'Benutzer-ID:',
@@ -1491,7 +1461,6 @@ Des cha nimmi ruckgängig gmacht wäre.',
'recentchangeslinked-feed' => 'Verlinktes prüefe',
'recentchangeslinked-toolbox' => 'Verlinktes prüefe',
'recentchangeslinked-title' => 'Änderigen a Sytene, wo „$1“ druf verlinkt',
-'recentchangeslinked-noresult' => 'Kener Änderigen a verlinkte Sytenen im usgwählte Zytruum.',
'recentchangeslinked-summary' => "Die Spezialsyte zeigt d Änderige vo allne Syte, wo ei vo dir bestimmti Syte druf verlinkt, bzw. vo allne Syte, wo zu eire vo dir bestimmte Kategorie ghöre.
Sytene, wo zu dyre [[Special:Watchlist|Beobachtigslischte]] ghöre, erschyne '''fett'''.",
'recentchangeslinked-page' => 'Syte:',
@@ -1717,7 +1686,6 @@ Us Sicherheitsgrinde isch img_auth.php deaktiviert.',
'http-read-error' => 'Fähler bim Läse vu HTTP.',
'http-timed-out' => 'Uuszyt bim HTTP-Versuech.',
'http-curl-error' => 'Fähler bim Ufsueche vu dr URL: $1',
-'http-host-unreachable' => 'URL isch nit z verwitsche',
'http-bad-status' => 'Bi dr HTTP-Aafrog isch e Fähler ufdrätte: $1 $2',
# Some likely curl errors. More could be added from <http://curl.haxx.se/libcurl/c/libcurl-errors.html>
@@ -1863,12 +1831,6 @@ Iberprief anderi Link zue dr Vorlage, voreb Du die leschesch.',
'statistics-users-active-desc' => 'Benutzer mit Bearbeitige {{PLURAL:$1|in dr letschte 24 Stund|in dr letschte $1 Täg}}',
'statistics-mostpopular' => 'Am meischte aagluegti Syte',
-'disambiguations' => 'Syte, wu uf Begriffsklärigssyte verlinke',
-'disambiguationspage' => 'Template:Begriffsklärig',
-'disambiguations-text' => 'Die Syte verwyyse uf e Begriffsklärigs-Syte. Sie sotte aber besser uf d Syte verwyyse, wu eigetli gmeint sin.
-
-E Syte wird as Begriffsklärigs-Syte behandlet, wänn [[MediaWiki:Disambiguationspage]] uf si verwyyst.',
-
'doubleredirects' => 'Doppleti Wyterleitige (Redirects)',
'doubleredirectstext' => 'Die Lischt zeigt Wyterleitige, wu uf anderi Wyterleitige verwyyse.
In jedere Zyylete het s Link 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.
@@ -2115,10 +2077,9 @@ Wänn Du d Syte speter wider vu dr Lischt witt stryyche, deno druck eifach uf â€
'unwatchthispage' => 'Nimmi beobachte',
'notanarticle' => 'Kei Syte',
'notvisiblerev' => 'Version isch glescht wore',
-'watchnochange' => 'Vo den Artikle, wo du beobachtisch, isch im aazeigte Zytruum kene veränderet worde.',
'watchlist-details' => '{{PLURAL:$1|1 Syte wird|$1 Sytene wärde}} beobachtet (Diskussionssyte nid zelt, aber ou beobachtet).',
-'wlheader-enotif' => '* Dr E-Mail-Benochrichtigungsdienscht isch aktiviert.',
-'wlheader-showupdated' => "* Syte mit Anderige, wu no nit aagluegt sin, sin '''fett''' dargstellt.",
+'wlheader-enotif' => 'Dr E-Mail-Benochrichtigungsdienscht isch aktiviert.',
+'wlheader-showupdated' => "Syte mit Anderige, wu no nit aagluegt sin, sin '''fett''' dargstellt.",
'watchmethod-recent' => 'Iberpriefe vu dr letschte Bearbeitige fir d Beobachtigslischt',
'watchmethod-list' => 'Iberpriefe vu dr Beobachtigslischt no letschte Bearbeitige',
'watchlistcontains' => 'In Dyynere Beobachtigslischt het s $1 {{PLURAL:$1|Syte|Syte}}.',
@@ -2501,11 +2462,8 @@ Go d Sperri ufhebe lueg d [[Special:BlockList|Lisch vu allene aktive Sperrine]].
'ipb_blocked_as_range' => 'Fähler: D IP-Adräss $1 isch as Teil vu dr Beryychssperri $2 indirekt gsperrt. S isch nit megli, nume $1 z entsperre.',
'ip_range_invalid' => 'Uugiltige IP-Adrässberyych.',
'ip_range_toolarge' => 'Adrässberyych, wu greßer sin wie /$1, sin nit erlaubt.',
-'blockme' => 'Sperr mi',
'proxyblocker' => 'Proxy blocker',
-'proxyblocker-disabled' => 'Die Funktion isch deaktiviert.',
'proxyblockreason' => 'Dyni IP-Adrässe isch gsperrt wore, wel si ne ufige Proxy isch. Bitte kontaktier Dyyn Internet-Provider oder Dyni Systemadministratore un informier si iber des Sicherheitsproblem.',
-'proxyblocksuccess' => 'Fertig.',
'sorbsreason' => 'D IP-Adräss isch in dr DNSBL vu {{SITENAME}} as uffige PROXY glischtet.',
'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.',
@@ -2964,7 +2922,7 @@ Andri wäre standardmäßig nit aazeigt.
* gpslongitude
* gpsaltitude',
-# EXIF tags
+# Exif tags
'exif-imagewidth' => 'Breiti',
'exif-imagelength' => 'Längi',
'exif-bitspersample' => 'Bit pro Farbkomponente',
@@ -3142,7 +3100,7 @@ Andri wäre standardmäßig nit aazeigt.
'exif-originalimageheight' => 'Bildhechi vor em Zueschnyde',
'exif-originalimagewidth' => 'Bildbreiti vor em Zueschnyde',
-# EXIF attributes
+# Exif attributes
'exif-compression-1' => 'Uukomprimiert',
'exif-compression-2' => 'CCITT Gruppe 3 1-dimensionali modifizierti Huffman-Lauflengekodierig',
'exif-compression-3' => 'CCITT Gruppe 3 Faxkodierig',
@@ -3529,7 +3487,6 @@ Du chasch au d [[Special:EditWatchlist|Standard-Bearbeitigssyte]] bruuche.',
'version-other' => 'Anders',
'version-mediahandlers' => 'Medie-Handler',
'version-hooks' => "Schnittstelle ''(Hook)''",
-'version-extension-functions' => 'Funktionsufruef',
'version-parser-extensiontags' => "Parser-Erwyterige ''(tags)''",
'version-parser-function-hooks' => 'Parser-Funktione',
'version-hook-name' => 'Schnittstellename',
@@ -3551,13 +3508,6 @@ E [{{SERVER}}{{SCRIPTPATH}}/COPYING Kopi vu dr GNU General Public-Lizänz] sott
'version-entrypoints-header-entrypoint' => 'Yygangspunkt',
'version-entrypoints-header-url' => 'URL',
-# Special:FilePath
-'filepath' => 'Dateipfad',
-'filepath-page' => 'Datei:',
-'filepath-submit' => 'Gang',
-'filepath-summary' => 'Mit däre Spezialsyte losst sich dr komplett Pfad vu dr aktuälle Version vun ere Datei ohni Umwäg abfroge.
-Di aagfrogt Datei wird diräkt dargstellt bzw. mit dr verchnipfte Aawändig gstartet.',
-
# Special:FileDuplicateSearch
'fileduplicatesearch' => 'Datei-Duplikat sueche',
'fileduplicatesearch-summary' => 'Suech no Datei-Duplikat uf dr Grundlag vu ihrem Hash-Wärt.',
diff --git a/languages/messages/MessagesGu.php b/languages/messages/MessagesGu.php
index 85986cdb..35edb974 100644
--- a/languages/messages/MessagesGu.php
+++ b/languages/messages/MessagesGu.php
@@ -148,6 +148,8 @@ $digitTransformTable = array(
$digitGroupingPattern = "##,##,###";
+$linkTrail = "/^([\x{0A80}-\x{0AFF}]+)(.*)$/sDu";
+
$messages = array(
# User preference toggles
'tog-underline' => 'કડીઓની નીચે લીટી (અંડરલાઇન):',
@@ -179,9 +181,6 @@ $messages = array(
'tog-shownumberswatching' => 'ધà«àª¯àª¾àª¨ રાખતા સભà«àª¯à«‹àª¨à«€ સંખà«àª¯àª¾ બતાવો',
'tog-oldsig' => 'હાલના હસà«àª¤àª¾àª•à«àª·àª°:',
'tog-fancysig' => 'હસà«àª¤àª¾àª•à«àª·àª°àª¨à«‹ વિકિલખાણ તરીકે ઉપયોગ કરો (સà«àªµàªšàª¾àª²àª¿àª¤ કડી વગર)',
-'tog-externaleditor' => 'બીજà«àª‚ àªàª¡à«€àªŸàª° વાપરો. (ફકà«àª¤ àªàª•àª¸àªªàª°à«àªŸ માટે, તમારા કમà«àªªà«àª¯à«àªŸàª°àª®àª¾àª‚ સેટીંગà«àª¸ બદલવા પડશે. [//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. [//www.mediawiki.org/wiki/Manual:External_editors More information.])',
-'tog-showjumplinks' => "''આના પર જાવ'' કડીને સકà«àª°à«€àª¯ કરો.",
'tog-uselivepreview' => 'જીવંત પૂરà«àªµàª¦àª°à«àª¶àª¨ વાપરો (પà«àª°àª¾àª¯à«‹àª—ીક)',
'tog-forceeditsummary' => "કોરો 'ફેરફાર સારાંશ' ઉમેરતા પહેલા મને ચેતવો",
'tog-watchlisthideown' => "'મારી ધà«àª¯àª¾àª¨àª¸à«àªšà«€'માં મે કરેલા ફેરફારો છà«àªªàª¾àªµà«‹",
@@ -195,6 +194,8 @@ $messages = array(
'tog-showhiddencats' => 'છà«àªªà«€ શà«àª°à«‡àª£à«€àª“ દરà«àª¶àª¾àªµà«‹',
'tog-noconvertlink' => 'Disable link title conversion',
'tog-norollbackdiff' => 'રોલબેક કરà«àª¯àª¾ પછીના તફાવતો છà«àªªàª¾àªµà«‹',
+'tog-useeditwarning' => 'સાચવà«àª¯àª¾ વગર જો હà«àª‚ પૃષà«àª  છોડà«àª‚ તો મને ચેતવણી આપો',
+'tog-prefershttps' => 'સભà«àª¯àª¨àª¾àª®àª¥à«€ પà«àª°àªµà«‡àª¶ કરà«àª¯à«‹ હોય તà«àª¯àª¾àª°à«‡ સà«àª°àª•à«àª·àª¿àª¤ જોડાણ (https) જ વાપરો',
'underline-always' => 'હંમેશાં',
'underline-never' => 'કદી નહિ',
@@ -258,6 +259,18 @@ $messages = array(
'oct' => 'ઓકટો',
'nov' => 'નવે',
'dec' => 'ડિસે',
+'january-date' => 'જાનà«àª¯à«àª†àª°à«€ $1',
+'february-date' => 'ફેબà«àª°à«àª†àª°à«€ $1',
+'march-date' => 'મારà«àªš $1',
+'april-date' => 'àªàªªà«àª°àª¿àª² $1',
+'may-date' => 'મે $1',
+'june-date' => 'જà«àª¨ $1',
+'july-date' => 'જà«àª²àª¾àªˆ $1',
+'august-date' => 'ઓગસà«àªŸ $1',
+'september-date' => 'સપà«àªŸà«‡àª®à«àª¬àª° $1',
+'october-date' => 'ઓકà«àªŸà«‹àª¬àª° $1',
+'november-date' => 'નવેમà«àª¬àª° $1',
+'december-date' => 'ડિસેમà«àª¬àª° $1',
# Categories related messages
'pagecategories' => '{{PLURAL:$1|શà«àª°à«‡àª£à«€|શà«àª°à«‡àª£à«€àª“}}',
@@ -278,7 +291,7 @@ $messages = array(
'noindex-category' => 'અનà«àª•à«àª°àª®àª£àª¿àª•àª¾ નહી બનાવેલા પાનાં',
'broken-file-category' => 'ફાઇલોની તà«àª°à«‚ટક કડીઓવાળાં પાનાં',
-'linkprefix' => '/^(.*?)((?:[a-zA-Z\\x80-\\xff]|કà«|ખà«|ગà«|ઘà«|ચà«|છà«|જà«|àªà«|ટà«|ઠà«|ડà«|ઢà«|ણà«|તà«|થà«|દà«|ધà«|નà«|પà«|ફà«|બà«|ભà«|મà«|યà«|રà«|લà«|વà«|સà«|શà«|ષà«|હà«|ળà«|કà«àª·à«|જà«àªžà«|અ|આ|ઇ|ઈ|ઉ|ઊ|àª|àª|ઓ|ઔ|અં|અઃ|અàª|àª|ઑ|ઋ|àª|઼|।|à«|ા|િ|à«€|à«|à«‚|ે|ૈ|à«‹|à«Œ|ં|ઃ|à«…|ૉ|ૃ)+)$/sD',
+'linkprefix' => '/^((?>.*(?<![a-zA-Z\\x80-\\xff])(?<!કà«|ખà«|ગà«|ઘà«|ચà«|છà«|જà«|àªà«|ટà«|ઠà«|ડà«|ઢà«|ણà«|તà«|થà«|દà«|ધà«|નà«|પà«|ફà«|બà«|ભà«|મà«|યà«|રà«|લà«|વà«|સà«|શà«|ષà«|હà«|ળà«|અં|અઃ|અàª)(?<!કà«àª·à«|જà«àªžà«)(?<!અ|આ|ઇ|ઈ|ઉ|ઊ|àª|àª|ઓ|ઔ|àª|ઑ|ઋ|àª|઼|।|à«|ા|િ|à«€|à«|à«‚|ે|ૈ|à«‹|à«Œ|ં|ઃ|à«…|ૉ|ૃ)))(.+)$/sD',
'about' => 'વિષે',
'article' => 'લેખનà«àª‚ પાનà«àª‚',
@@ -342,6 +355,7 @@ $messages = array(
'create-this-page' => 'આ પાનà«àª‚ બનાવો.',
'delete' => 'રદ કરો',
'deletethispage' => 'આ પાનà«àª‚ હટાવો',
+'undeletethispage' => 'આ પાનà«àª‚ પà«àª¨àª°à«àªœà«€àªµà«€àª¤ કરો',
'undelete_short' => 'હટાવેલ {{PLURAL:$1|àªàª• ફેરફાર|$1 ફેરફારો}} પરત લાવો.',
'viewdeleted_short' => '{{PLURAL:$1|ભૂંસી નાખેલો àªàª•|ભૂંસી નાખેલા $1}} ફેરફાર જà«àª“',
'protect' => 'સà«àª°àª•à«àª·àª¿àª¤ કરો',
@@ -387,7 +401,7 @@ $1',
'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).
+# 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).
'aboutsite' => '{{SITENAME}} વિષે',
'aboutpage' => 'Project:વિષે',
'copyright' => 'અલગથી ઉલà«àª²à«‡àª– ન કરાયો હોય તà«àª¯àª¾àª‚ સà«àª§à«€ માહિતી $1 હેઠળ ઉપલબà«àª§ છે.',
@@ -397,7 +411,6 @@ $1',
'disclaimers' => 'જાહેર ઇનકાર',
'disclaimerpage' => 'Project:સામાનà«àª¯ જાહેર ઇનકાર',
'edithelp' => 'ફેરફારો માટે મદદ',
-'edithelppage' => 'Help:ફેરફાર',
'helppage' => 'Help:સૂચિ',
'mainpage' => 'મà«àª–પૃષà«àª ',
'mainpage-description' => 'મà«àª–પૃષà«àª ',
@@ -427,7 +440,6 @@ $1',
'newmessagesdifflinkplural' => 'છેલà«àª²àª¾ {{PLURAL:$1|ફેરફાર|ફેરફારો}}',
'youhavenewmessagesmulti' => '$1 ઉપર તમારા માટે નવો સંદેશ છે.',
'editsection' => 'ફેરફાર કરો',
-'editsection-brackets' => '[$1]',
'editold' => 'ફેરફાર કરો',
'viewsourceold' => 'સà«àª°à«‹àª¤ જà«àª“',
'editlink' => 'ફેરફાર',
@@ -477,17 +489,12 @@ $1',
# General errors
'error' => 'તà«àª°à«àªŸàª¿',
'databaseerror' => 'ડેટાબેઠતà«àª°à«àªŸàª¿',
-'dberrortext' => 'માહિતીસંચ ને અપાયેલ શોધના સૂતà«àª°àª®àª¾àª‚ ચૂક છે.
-આ સોફà«àªŸàªµà«‡àª°àª®àª¾àª‚ નાની તà«àª°à«àªŸàª¿ (bug) ને લીધે હોઇ શકે.
-માહિતીસંચય પર કરાયેલ છેલà«àª²àª¾àª®àª¾àª‚ છેલà«àª²à«€ શોધ આ પà«àª°àª®àª¾àª£à«‡ હતી:
-<blockquote><code>$1</code></blockquote>
-આ ફંકશન થકી "<code>$2</code>".
-માહિતીસંચયે આપેલ ચૂકનà«àª‚ વિવરણ "<samp>$3: $4</samp>".',
-'dberrortextcl' => 'માહિતીસંચ ને અપાયેલ શોધના સૂતà«àª°àª®àª¾àª‚ ચૂક છે.
-માહિતીસંચ પર કરાયેલ છેલà«àª²àª¾àª®àª¾àª‚ છેલà«àª²à«€ શોધ આ પà«àª°àª®àª¾àª£à«‡ હતી:
-"$1"
-આ ફંકશન થકી "$2".
-માહિતીસંચે આપેલ ચૂકનà«àª‚ વિવરણ "$3: $4"',
+'databaseerror-text' => 'ડેટાબેઠપà«àª°àª¶à«àª¨ કà«àª·àª¤àª¿ ઉદà«àª­àªµà«€ છે.
+આ કદાચ સોફà«àªŸàªµà«‡àª°àª®àª¾àª‚ રહેલ ખામી હોઇ શકે છે.',
+'databaseerror-textcl' => 'ડેટાબેઠપà«àª°àª¶à«àª¨ કà«àª·àª¤àª¿ ઉદà«àª­àªµà«€ છે.',
+'databaseerror-query' => 'પà«àª°àª¶à«àª¨: $1',
+'databaseerror-function' => 'વિધેય: $1',
+'databaseerror-error' => 'કà«àª·àª¤àª¿: $1',
'laggedslavemode' => 'ચેતવણી: પાનà«àª‚ તાજેતરના ફેરફાર ધરાવતà«àª‚ નથી.',
'readonly' => 'ડેટાબેઠસà«àª¥àª—િત',
'enterlockreason' => 'સà«àª¥àª—િતતા કà«àª¯àª¾àª°à«‡ દà«àª° કરાશે તેના અંદાજ શાથે,સà«àª¥àª—િત કરવાનà«àª‚ કારણ આપો',
@@ -543,12 +550,15 @@ Query: $2',
'editinginterface' => "'''ચેતવણી:''' તમે જે પાનામાં ફેરફાર કરી રહà«àª¯àª¾ છો તે પાનà«àª‚ સોફà«àªŸàªµà«‡àª° માટે ઇનà«àªŸàª°àª«à«‡àª¸ ટેકà«àª¸àªŸ પà«àª°à«€ પાડે છે.
અહીંનો બદલાવ આ વિકિ પર ઉપસà«àª¥àª¿àª¤ અનà«àª¯ સભà«àª¯à«‹àª¨àª¾ ઇનà«àªŸàª°àª«à«‡àª¸àª¨àª¾àª‚ દેખાવ ઉપર અસરકરà«àª¤àª¾ બનશે.
બધાંજ વિકિ માટે ભાષાંતર ઉમેરવા કે બદલવા માટે કૃપા કરી [//translatewiki.net/ translatewiki.net], મિડિયાવિકી સà«àª¥àª¾àª¨àª¿àª¯àª•àª°àª£ પà«àª°àª•àª²à«àªª, વાપરો.",
-'sqlhidden' => '(છà«àªªà«€ SQL કà«àªµà«‡àª°à«€)',
'cascadeprotected' => 'આ પાના પર ફેરફાર પà«àª°àª¤àª¿àª¬àª‚ધિત છે કેમ કે આ પાનà«àª‚ {{PLURAL:$1|àªàªµà«àª‚ પાનà«àª‚|àªàªµàª¾ પાના}} માં શામિલ છે જેમાં અનà«àªµàª°à«àª¤à«€ (પગથિયામય)સંરકà«àª·àª£ સકà«àª°à«€àª¯ છે :
$2',
'namespaceprotected' => "તમને '''$1''' નામાવકાશનાં પાનાંમાં ફેરફાર કરવાની પરવાનગી નથી.",
'customcssprotected' => 'તમને આ પાનà«àª‚ બદલવાની પરવાનગી નથી કારણકે આ પાનામાં બીજા સભà«àª¯àª¨à«€ પસંદગીના સેટીંગà«àª¸ છે.',
'customjsprotected' => 'તમને આ JavaScript પાનà«àª‚ બદલવાની પરવાનગી નથી કારણકે આ પાનામાં બીજા સભà«àª¯àª¨à«€ પસંદગીના સેટીંગà«àª¸ છે.',
+'mycustomcssprotected' => 'તમને આ CSS ફાઇલમાં ફેરફાર કરવાની પરવાનગી નથી.',
+'mycustomjsprotected' => 'તમને આ જાવાસà«àª•à«àª°àª¿àªªà«àªŸ ફાઇલમાં ફેરફાર કરવાની પરવાનગી નથી.',
+'myprivateinfoprotected' => 'તમને તમારી અંગત માહિતીમાં ફેરફાર કરવાની પરવાનગી નથી.',
+'mypreferencesprotected' => 'તમને તમારી પà«àª°àª¾àª¥àª®àª¿àª•àª¤àª¾àª“માં ફેરફાર કરવાની પરવાનગી નથી.',
'ns-specialprotected' => 'ખાસ પાનાંમાં ફેરફાર ન થઇ શકે.',
'titleprotected' => 'આ મથાળà«àª‚ (વિષય) [[User:$1|$1]] બનાવવા માટે સà«àª°àª•à«àª·àª¿àª¤ કરવામાં આવà«àª¯à«‹ છે.
આ માટેનà«àª‚ કારણ છે-- "\'\'$2\'\'".',
@@ -570,10 +580,19 @@ $2',
'welcomecreation-msg' => 'તમારૂં ખાતà«àª‚ ખà«àª²à«€ ગયà«àª‚ છે.
તમારી [[Special:Preferences|{{SITENAME}} પસંદ]] બદલવાનà«àª‚ ભૂલશો નહીં.',
'yourname' => 'સભà«àª¯ નામ:',
+'userlogin-yourname' => 'સભà«àª¯ નામ',
+'userlogin-yourname-ph' => 'તમારૂં સભà«àª¯ નામ દાખલ કરો',
+'createacct-another-username-ph' => 'તમારૂં સભà«àª¯àª¨àª¾àª® દાખલ કરો',
'yourpassword' => 'ગà«àªªà«àª¤ સંજà«àªžàª¾:',
+'userlogin-yourpassword' => 'ગà«àªªà«àª¤ સંજà«àªžàª¾',
+'userlogin-yourpassword-ph' => 'ગà«àªªà«àª¤ સંજà«àªžàª¾ લખો',
+'createacct-yourpassword-ph' => 'પાસવરà«àª¡ દાખલ કરો',
'yourpasswordagain' => 'ગà«àªªà«àª¤ સંજà«àªžàª¾ (પાસવરà«àª¡) ફરી લખો',
+'createacct-yourpasswordagain' => 'પાસવરà«àª¡àª¨à«€ ખાતરી કરો',
+'createacct-yourpasswordagain-ph' => 'પાસવરà«àª¡ ફરીથી દાખલ કરો',
'remembermypassword' => 'આ કોમà«àª¯à«‚ટર પર મારી લૉગ ઇન વિગતો ધà«àª¯àª¾àª¨àª®àª¾àª‚ રાખો (વધà«àª®àª¾àª‚ વધૠ$1 {{PLURAL:$1|દિવસ|દિવસ}} માટે)',
-'securelogin-stick-https' => 'લોગ-ઈન કરà«àª¯àª¾ પછી HTTPS સાથે જોડાયેલા રહો.',
+'userlogin-remembermypassword' => 'મને પà«àª°àªµà«‡àª¶àª¿àª¤ રાખો',
+'userlogin-signwithsecure' => 'સલામત જોડાણ વાપરો',
'yourdomainname' => 'તમારૂં ડોમેઇન:',
'password-change-forbidden' => 'તમે આ વિકિ માટે પાસવરà«àª¡à«àª¸ બદલી શકતા નથી.',
'externaldberror' => 'પà«àª°àª®àª¾àª£àª­à«‚તતાની તà«àª°à«àªŸà«€ આવી અથવા તમારૂ બહારનૠખાતà«àª‚ અપડેટ કરવાનો અધિકાર તમને નથી.',
@@ -585,18 +604,42 @@ $2',
'logout' => 'બહાર નીકળો',
'userlogout' => 'બહાર નીકળો/લૉગ આઉટ',
'notloggedin' => 'પà«àª°àªµà«‡àª¶ કરેલ નથી',
+'userlogin-noaccount' => 'શà«àª‚ તમારૂં ખાતà«àª‚ નથી ?',
+'userlogin-joinproject' => '{{SITENAME}} સાથે જોડાવ',
'nologin' => "શà«àª‚ તમારૂં ખાતà«àª‚ નથી? તો નવà«àª‚ '''$1'''.",
'nologinlink' => 'ખાતà«àª‚ ખોલો',
'createaccount' => 'નવà«àª‚ ખાતà«àª‚ ખોલો',
'gotaccount' => "પહેલેથી ખાતà«àª‚ ખોલેલà«àª‚ છે? '''$1'''.",
'gotaccountlink' => 'પà«àª°àªµà«‡àª¶ કરો',
'userlogin-resetlink' => 'પોતાની પà«àª°àªµà«‡àª¶ માહિતી ભૂલી ગયા છો?',
+'userlogin-resetpassword-link' => 'તમારી ગà«àªªà«àª¤àª¸àª‚જà«àªžàª¾ બદલો',
+'helplogin-url' => 'Help:પà«àª°àªµà«‡àª¶ માટે',
+'userlogin-helplink' => '[[{{MediaWiki:helplogin-url}}|પà«àª°àªµà«‡àª¶àªµàª¾ માટેની મદદ]]',
+'userlogin-createanother' => 'બીજà«àª‚ ખાતà«àª‚ બનાવો',
+'createacct-join' => 'તમારી માહિતી નીચે દાખલ કરો.',
+'createacct-another-join' => 'નવા ખાતાંની માહિતી નીચે દાખલ કરો.',
+'createacct-emailrequired' => 'ઇમેલ સરનામà«àª‚',
+'createacct-emailoptional' => 'ઇમેલ સરનામà«àª‚ (વૈકલà«àªªàª¿àª•)',
+'createacct-email-ph' => 'તમારà«àª‚ ઇમેલ સરનામà«àª‚ દાખલ કરો',
+'createacct-another-email-ph' => 'તમારà«àª‚ ઇમેલ સરનામà«àª‚ દાખલ કરો',
'createaccountmail' => 'કામચલાઉ ગમે-તેમ પાસવરà«àª¡ વાપરો અને તેને સà«àªªàª·à«àªŸ કરેલ ઇમેલ સરનામા પર મોકલો',
+'createacct-realname' => 'સાચà«àª‚ નામ (વૈકલà«àªªàª¿àª•)',
'createaccountreason' => 'કારણ:',
+'createacct-reason' => 'કારણ',
+'createacct-reason-ph' => 'તમે કેમ બીજà«àª‚ ખાતà«àª‚ બનાવો છો',
+'createacct-captcha' => 'સલામતી ચકાસણી',
+'createacct-imgcaptcha-ph' => 'તમે જે લખાણ જà«àª“ છો તે દાખલ કરો',
+'createacct-submit' => 'તમારà«àª‚ ખાતà«àª‚ બનાવો',
+'createacct-another-submit' => 'બીજà«àª‚ ખાતà«àª‚ બનાવો',
+'createacct-benefit-heading' => '{{SITENAME}} ઠતમારા જેવા લોકો વડે બનાવેલ છે.',
+'createacct-benefit-body1' => '{{PLURAL:$1|ફેરફાર|ફેરફારો}}',
+'createacct-benefit-body2' => '{{PLURAL:$1|પાનà«àª‚|પાનાં}}',
+'createacct-benefit-body3' => 'તાજેતરના {{PLURAL:$1|યોગદાનકરà«àª¤àª¾|યોગદાનકરà«àª¤àª¾àª“}}',
'badretype' => 'તમે દાખલ કરેલ ગà«àªªà«àª¤àª¸àª‚જà«àªžàª¾ મળતી આવતી નથી.',
'userexists' => 'દાખલ કરેલà«àª‚ સભà«àª¯àª¨àª¾àª® વપરાશમાં છે.</br>
કૃપયા અનà«àª¯ નામ પસંદ કરો.',
'loginerror' => 'પà«àª°àªµà«‡àª¶ તà«àª°à«àªŸàª¿',
+'createacct-error' => 'ખાતà«àª‚ બનાવવામાં કà«àª·àª¤àª¿ આવી',
'createaccounterror' => 'ખાતà«àª‚ ખોલી શકાયà«àª‚ નથી: $1',
'nocookiesnew' => 'તમારૠસભà«àª¯ ખાતà«àª‚ બની ગયà«àª‚ છે પણ તમે પà«àª°àªµà«‡àª¶ (લોગ ઇન) કરà«àª¯à«‹ નથી.
@@ -663,11 +706,13 @@ $2',
જો આ ખાતૠભà«àª²àª¥à«€ બનેલà«àª‚ હોય તો,આ સંદેશને અવગણી શકો છો.',
'usernamehasherror' => 'સભà«àª¯àª¨àª¾àª®àª®àª¾àª‚ ગડબડિયા ચિહà«àª¨à«‹ ન હોઈ શકે',
-'login-throttled' => 'તમે હાલમાં જ ઘણા પà«àª°àªµà«‡àª¶ પà«àª°àª¯àª¤à«àª¨à«‹ કરà«àª¯àª¾.
-કૃપા કરી ફરી પà«àª°àª¯àª¾àª¸ પહેલાં થોડી રાહ જà«àª“.',
+'login-throttled' => 'તમે હાલમાં ઘણાં જ પà«àª°àªµà«‡àª¶ પà«àª°àª¯àª¤à«àª¨à«‹ કરà«àª¯àª¾ છે.
+કૃપા કરી ફરી પà«àª°àª¯àª¤à«àª¨ કરતાં પહેલાં $1 રાહ જà«àª“.',
'login-abort-generic' => 'તમારà«àª‚ પà«àª°àªµà«‡àª¶ નિષà«àª«àª³ થયà«àª‚ - છોડી દેવાયà«àª‚',
'loginlanguagelabel' => 'ભાષા: $1',
'suspicious-userlogout' => 'લોગ આઉટ કરવાની તમારી વિનંતિ પૂરી ન કરી શકાઇ. àªàª® લાગે છે કે તેને તૃટિ પામેલ બà«àª°àª¾àª‰àªàª° કે પà«àª°à«‹àª•à«àª¸à«€ દà«àªµàª¾àª°àª¾ મોકલાઈ હતી.',
+'createacct-another-realname-tip' => 'સાચà«àª‚ નામ મરજીયાત છે.
+જો તમે તે આપવાનà«àª‚ પસંદ કરશો, તો તેનો ઉપયોગ તમે કરેલ યોગદાનનà«àª‚ શà«àª°à«‡àª¯ આપવા માટે થશે.',
# Email sending
'php-mail-error-unknown' => 'PHPની મેલ() કામગીરીમાં અજà«àªžàª¾àª¤ તà«àª°à«àªŸàª¿',
@@ -683,7 +728,7 @@ $2',
'newpassword' => 'નવી ગà«àªªà«àª¤àª¸àª‚જà«àªžàª¾:',
'retypenew' => 'નવી ગà«àªªà«àª¤ સંજà«àªžàª¾ (પાસવરà«àª¡) ફરી લખો:',
'resetpass_submit' => 'ગà«àªªà«àª¤àª¸àª‚જà«àªžàª¾ બદલીને પà«àª°àªµà«‡àª¶ કરો.',
-'resetpass_success' => 'તમારી ગà«àªªà«àª¤àª¸àª‚જà«àªžàª¾ સફળતાપૂરà«àªµàª• બદલાઇ ગઇ! હવે તમે ...માં પà«àª°àªµà«‡àª¶ કરી શકો છો',
+'changepassword-success' => 'તમારી ગà«àªªà«àª¤àª¸àª‚જà«àªžàª¾ સફળતાપૂરà«àªµàª• બદલાઇ ગઇ છે!',
'resetpass_forbidden' => 'ગà«àªªà«àª¤àª¸àª‚જà«àªžàª¾ બદલી શકાશે નહીં',
'resetpass-no-info' => 'બારોબાર આ પાનà«àª‚ જોવા માટે પà«àª°àªµà«‡àª¶ કરવો આવશà«àª¯àª• છે.',
'resetpass-submit-loggedin' => 'ગà«àªªà«àª¤àª¸àª‚જà«àªžàª¾ બદલો',
@@ -695,10 +740,10 @@ $2',
# Special:PasswordReset
'passwordreset' => 'પાસવરà«àª¡ રીસેટ કરો',
-'passwordreset-text' => 'તમારો પાસવરà«àª¡ બદલવા માટે આ ફોરà«àª® પૂરૠકરો.',
+'passwordreset-text-one' => 'તમારો પાસવરà«àª¡ બદલવા માટે આ ફોરà«àª® પૂરૠકરો.',
'passwordreset-legend' => 'પાસવરà«àª¡ રીસેટ કરો',
'passwordreset-disabled' => 'આ વિકી પર પાસવરà«àª¡ રીસેટ કરવા પર પà«àª°àª¤àª¿àª¬àª‚ધ છે.',
-'passwordreset-pretext' => '{{PLURAL: $1| | àªàª• નીચે માહિતીના ટà«àª•àª¡àª¾àª“ દાખલ}}',
+'passwordreset-emaildisabled' => 'આ વિકિ પર ઇમેઇલ સગવડ બંધ છે.',
'passwordreset-username' => 'સભà«àª¯ નામ:',
'passwordreset-domain' => 'ડોમેઈન:',
'passwordreset-capture' => 'પરિણામી ઈ મેલ જોવો છે ?',
@@ -721,7 +766,7 @@ $2
કામચલાઉ પાસવરà«àª¡: $2',
'passwordreset-emailsent' => 'પાસવરà«àª¡ બદલવાનો ઇમેલ મોકલવામાં આવà«àª¯à«‹ છે.',
'passwordreset-emailsent-capture' => 'પાસવરà«àª¡ બદલવાનો ઇમેલ મોકલવામાં આવà«àª¯à«‹ છે, જે નીચે પà«àª°àª®àª¾àª£à«‡ છે.',
-'passwordreset-emailerror-capture' => 'àªàª• સà«àª®à«ƒàª¤àª¿àªªàª¤à«àª° ઈ મેલ બનાવવા માં આવà«àª¯à«‹ છે, જે આ પà«àª°àª®àª¾àª£à«‡ છે, પરંતૠતે યà«àªàª° ને મોકલવા માં નિષà«àª«àª³ થયો છે: $1',
+'passwordreset-emailerror-capture' => 'પાસવરà«àª¡ ફરી ગોઠવવા માટેનો ઇમેલ બનાવવામાં આવà«àª¯à«‹ છે, જે નીચે પà«àª°àª®àª¾àª£à«‡ છે, પરંતૠતે {{GENDER:$2|સભà«àª¯}}ને મોકલવામાં નિષà«àª«àª³ થયો છે: $1',
# Special:ChangeEmail
'changeemail' => 'ઈ મેલ ખાતૠબદલવા માટે',
@@ -735,6 +780,16 @@ $2
'changeemail-submit' => 'ઈ મેલ બદલો',
'changeemail-cancel' => 'રદ કરો',
+# Special:ResetTokens
+'resettokens' => 'નિશાનીઓ ફરી ગોઠવો',
+'resettokens-no-tokens' => 'અહીં ફરી ગોઠવવા માટેનાં કોઇ ટોકન નથી',
+'resettokens-legend' => 'નિશાનીઓ ફરી ગોઠવો',
+'resettokens-tokens' => 'નિશાનીઓ:',
+'resettokens-token-label' => '$1 (હાલની કિંમત: $2)',
+'resettokens-watchlist-token' => '[[Special:Watchlist|તમારી ધà«àª¯àª¾àª¨àª¸à«‚ચિના પાનામાં ફેરફાર ]]ની વેબ ફીડ (Atom/RSS) નિશાની',
+'resettokens-done' => 'નિશાનીઓ ફરી ગોઠવવામાં આવી.',
+'resettokens-resetbutton' => 'પસંદ કરેલ નિશાનીઓ ફરી ગોઠવો',
+
# Edit page toolbar
'bold_sample' => 'ઘાટા અકà«àª·àª°',
'bold_tip' => 'ઘાટà«àª‚ લખાણ',
@@ -933,11 +988,14 @@ $2
લાગે છે કોઇઠઆ પાનà«àª‚ હટાવી દીધà«àª‚ છે',
'edit-conflict' => 'સંપાદન સંઘરà«àª·.',
'edit-no-change' => 'તમારા ફેરફારો અવગણાયા, કેમકે અકà«àª·àª°àª•àª¾àª¯àª¾àª®àª¾àª‚ કોઈ ફેરફારાના હતો',
+'postedit-confirmation' => 'તમે કરેલો ફેરફાર સચવાઈ ગયો છે.',
'edit-already-exists' => 'નવà«àª‚ પાનà«àª‚ બનાવી ન શકાયà«àª‚
તે પહેલેથી હાજર છે.',
'defaultmessagetext' => 'મૂળભૂત સંદેશ લખાણ',
'invalid-content-data' => 'અયોગà«àª¯ વિગત માહિતી',
'content-not-allowed-here' => '"$1" વિગત [[$2]] પાનાં પર માનà«àª¯ નથી',
+'editwarning-warning' => 'આ પાનà«àª‚ છોડી દેશો તો તમારા ફેરફારો સચવાશે નહીં.
+જો તમે પà«àª°àªµà«‡àª¶ કરેલો હોય તો તમે આ ચેતવણીને તમારી પસંદના "ફેરફાર" વિભાગના વિકલà«àªªà«‹ બદલીને બંધ કરી શકો છો.',
# Content models
'content-model-wikitext' => 'વિકિલખાણ',
@@ -1148,6 +1206,7 @@ $1",
'compareselectedversions' => 'પસંદ કરેલા સરખાવો',
'showhideselectedversions' => 'પસંદ કરેલા બતાવો / સંતાડો',
'editundo' => 'રદ કરો',
+'diff-empty' => '(કોઇ ભેદ નહી)',
'diff-multi' => '{{PLURAL:$2|àªàª• સભà«àª¯àª કરેલà«àª‚|$2 સભà«àª¯à«‹àª કરેલા}} ({{PLURAL:$1|વચગાળાનà«àª‚ àªàª• પà«àª¨àª°àª¾àªµàª°à«àª¤àª¨ દરà«àª¶àª¾àªµà«àª¯àª‚|વચગાળાનાં $1 પà«àª¨àª°àª¾àªµàª°à«àª¤àª¨à«‹ દરà«àª¶àª¾àªµà«àª¯àª¾àª‚}} નથી.)',
'diff-multi-manyusers' => '{{PLURAL:$2|àªàª• સભà«àª¯àª કરેલà«àª‚|$2 સભà«àª¯à«‹àª કરેલા}} ({{PLURAL:$1|વચગાળાનà«àª‚ àªàª• પà«àª¨àª°àª¾àªµàª°à«àª¤àª¨ દરà«àª¶àª¾àªµà«àª¯àª‚|વચગાળાનાં $1 પà«àª¨àª°àª¾àªµàª°à«àª¤àª¨à«‹ દરà«àª¶àª¾àªµà«àª¯àª¾àª‚}} નથી.)',
@@ -1171,7 +1230,6 @@ $1",
'searchmenu-legend' => 'શોધ વિકલà«àªªà«‹',
'searchmenu-exists' => "''' આ વિકિ પર \"[[:\$1]]\" નામે પાનà«àª‚ પહેલેથી અસà«àª¤àª¿àª¤à«àªµàª®àª¾àª‚ છે.'''",
'searchmenu-new' => "'''આ વિકિ પર \"[[:\$1]]\" નામે પાનà«àª‚ બનાવો!'''",
-'searchhelp-url' => 'Help:સૂચિ',
'searchmenu-prefix' => '[[Special:PrefixIndex/$1|આ પૂરà«àªµàª¾àª•à«àª·àª° વાળા પાનાં જà«àª“]]',
'searchprofile-articles' => 'લેખનà«àª‚ પાનà«àª‚',
'searchprofile-project' => 'મદદ અને યોજના પાનà«àª‚',
@@ -1215,15 +1273,7 @@ $1",
'searchdisabled' => "{{SITENAME}} ઉપર શોધ બંધ કરી દેવામાં આવી છે.
તà«àª¯àª¾àª‚ સà«àª§à«€ તમે ગà«àª—લ દà«àªµàª¾àª°àª¾ શોધ કરી શકો.
'''નોંધઃ'''{{SITENAME}}નાં તેમના (ગà«àª—લના) ઈનà«àª¡à«‡àª•à«àª¸ જà«àª¨àª¾ હોઇ શકે.",
-
-# Quickbar
-'qbsettings' => 'શીઘà«àª°àªªàªŸà«àªŸ',
-'qbsettings-none' => 'કોઇપણ નહીં',
-'qbsettings-fixedleft' => 'અચળ ડાબે',
-'qbsettings-fixedright' => 'અચળ જમણે',
-'qbsettings-floatingleft' => 'ચલિત ડાબે',
-'qbsettings-floatingright' => 'ચલિત જમણે',
-'qbsettings-directionality' => 'નિશà«àªšàª¿àª¤, તમારી ભાષા સà«àª•à«àª°àª¿àªªà«àªŸ directionality પર આધાર રાખીને',
+'search-error' => 'શોધ કરતી વખતે કà«àª·àª¤àª¿ આવી: $1',
# Preferences page
'preferences' => 'પસંદ',
@@ -1257,7 +1307,6 @@ $1",
'resetprefs' => 'બીન સાચવેલ ફેરફારો સાફ કરો',
'restoreprefs' => 'મૂળ વિકલà«àªªà«‹ ફરી ગોઠવો (બધાં વિભાગોમાં)',
'prefs-editing' => 'સંપાદન',
-'prefs-edit-boxsize' => 'ફેરફાર ફલકનà«àª‚ માપ',
'rows' => 'પંકà«àª¤àª¿àª“',
'columns' => 'સà«àª¤àª‚ભ',
'searchresultshead' => 'શોધો',
@@ -1268,9 +1317,6 @@ $1",
'recentchangesdays-max' => 'મહતà«àª¤àª® $1 {{PLURAL:$1|દિવસ|દિવસો}}',
'recentchangescount' => 'સમાનà«àª¯ પણે ફલકમાં બતાવવાના ફેરફારોની સંખà«àª¯àª¾',
'prefs-help-recentchangescount' => 'આમાં તાજા ફેરફારો, ઇતિહાસ અને લોગ શામિલ છે.',
-'prefs-help-watchlist-token' => 'ગà«àªªà«àª¤ સંજà«àªžàª¾ આ ખાનામાં ભરતા તમારી ધà«àª¯àª¾àª¨àª¸à«‚ચિ માટે RSS માહિતીનà«àª‚ નિરà«àª®àª¾àª£ થશે.
-જેની પાસે તમારી આ ગà«àªªà«àª¤ સંજà«àªžàª¾ હશે ત તમારી ધà«àª¯àª¾àª¨àª¸à«‚ચિ વપરે શકશે. આથી સà«àª°àª•à«àª·àª¿àª¤ àªàªµà«‹ શબà«àª¦ પસંદ કરશો.
-તમે વાપરી શકો તેવી અસંગત રચાયેલી રીતે સંજà«àªžàª¾ અહીં અપેલ છે : $1',
'savedprefs' => 'તમારી પસંદગી સચવાઈ ગઈ છે.',
'timezonelegend' => 'સમય કà«àª·à«‡àª¤à«àª°:',
'localtime' => 'સà«àª¥àª¾àª¨à«€àª• સમય:',
@@ -1301,7 +1347,6 @@ $1",
'prefs-reset-intro' => 'તમી આ પાનાનો ઉપયોગ કરીને તમારા વિકલà«àªªà«‹ ની ગોઠવણી મૂળના વિકલà«àªªà«‹ સમાન ગોઠવી શકો છો.
આને ઉલટાવી ન શકાય.',
'prefs-emailconfirm-label' => 'ઇ-મેલ પà«àª·à«àªŸà«€',
-'prefs-textboxsize' => 'ફેરફાર ફલકનà«àª‚ માપ',
'youremail' => 'ઇ-મેઇલ:',
'username' => '{{GENDER:$1|સભà«àª¯àª¨àª¾àª®}}:',
'uid' => '{{GENDER:$1|સભà«àª¯}} ઓળખ:',
@@ -1336,6 +1381,8 @@ HTML નાકà«àª‚ ચકાસો',
'prefs-dateformat' => 'તારીખ લખવાની શૈલિ',
'prefs-timeoffset' => 'સમય ખંડ',
'prefs-advancedediting' => 'સામાનà«àª¯ વિકલà«àªªà«‹',
+'prefs-editor' => 'સંપાદક',
+'prefs-preview' => 'પૂરà«àªµàª¾àªµàª²à«‹àª•àª¨',
'prefs-advancedrc' => 'અદà«àª¯àª¤àª¨ વિકલà«àªªà«‹',
'prefs-advancedrendering' => 'અદà«àª¯àª¤àª¨ વિકલà«àªªà«‹',
'prefs-advancedsearchoptions' => 'અદà«àª¯àª¤àª¨ વિકલà«àªªà«‹',
@@ -1343,6 +1390,7 @@ HTML નાકà«àª‚ ચકાસો',
'prefs-displayrc' => 'પà«àª°àª¦àª°à«àª¶àª¨ વિકલà«àªªà«‹',
'prefs-displaysearchoptions' => 'પà«àª°àª¦àª°à«àª¶àª¨ વિકલà«àªªà«‹',
'prefs-displaywatchlist' => 'પà«àª°àª¦àª°à«àª¶àª¨ વિકલà«àªªà«‹',
+'prefs-tokenwatchlist' => 'નિશાની',
'prefs-diffs' => 'ફરક',
# User preference: email validation using jQuery
@@ -1435,11 +1483,17 @@ HTML નાકà«àª‚ ચકાસો',
'right-proxyunbannable' => 'અવેજીના અવયંચાલિત ખંડોને ટાળો',
'right-unblockself' => 'તમને જાતે જ અપà«àª°àª¤àª¿àª¬àª‚ધિત કરો',
'right-protect' => 'સંરકà«àª·àª£ સà«àª¤àª° બદલો અને ધોધાકાર-સંરકà«àª·àª¿àª¤ પાનાઓમાં ફેરફાર કરો.',
-'right-editprotected' => 'સંરકà«àª·àª¿àª¤ પાનામાં ફેરફાર કરો (પગથિયામય સà«àª°àª•à«àª·àª¾ વગર)',
+'right-editprotected' => 'પાનામાં "{{int:protect-level-sysop}}" તરીકે ફેરફાર કરો',
'right-editinterface' => 'સભà«àª¯ સંભાષણ પટલમાં ફેરફાર કરો',
'right-editusercssjs' => 'અનà«àª¯ સભà«àª¯à«‹àª¨à«€ CSS અને JavaScript ફાઇલમાં ફેરફાર કરો',
'right-editusercss' => 'અનà«àª¯ સભà«àª¯à«‹àª¨à«€ CSS ફાઇલમાં ફેરફાર કરો',
'right-edituserjs' => 'અનà«àª¯ સભà«àª¯à«‹àª¨à«€ JavaScript ફાઇલમાં ફેરફાર કરો',
+'right-editmyusercss' => 'તમારી પોતાની CSS ફાઇલોમાં ફેરફાર કરો',
+'right-editmyuserjs' => 'તમારી પોતાની જાવાસà«àª•à«àª°àª¿àªªà«àªŸ ફાઇલોમાં ફેરફાર કરો',
+'right-viewmywatchlist' => 'તમારી પોતાની ધà«àª¯àª¾àª¨àª¸à«‚ચી જà«àª“',
+'right-viewmyprivateinfo' => 'તમારી પોતાની અંગત માહિતી જà«àª“ (દા.ત. ઇમેલ સરનામà«àª‚, ખરà«àª‚ નામ)',
+'right-editmyprivateinfo' => 'તમારી પોતાની અંગત માહિતીમાં ફેરફાર કરો (દા.ત. ઇમેલ સરનામà«àª‚, ખરà«àª‚ નામ)',
+'right-editmyoptions' => 'તમારી પોતાની પà«àª°àª¾àª¥àª®àª¿àª•àª¤àª¾àª“માં ફેરફાર કરો',
'right-rollback' => 'ચોકà«àª•àª¸ પાનામાં જે છેલà«àª²àª¾ સભà«àª¯àª ફેરફારો કરà«àª¯àª¾àª‚ હોય તેને àªàª¡àªªàª¥à«€ ઉલટાવો',
'right-markbotedits' => 'ઉલટાવનારા અને બોટ ફેરફારો નોંધો',
'right-noratelimit' => 'àªàª¡àªªàª¨à«€ સીમાને કારણે અસર ન થવી જોઇàª.',
@@ -1501,9 +1555,15 @@ HTML નાકà«àª‚ ચકાસો',
'action-userrights-interwiki' => 'અનà«àª¯ વિકિ પરના સભà«àª¯à«‹àª¨àª¾ હકà«àª•à«‹ સંપાદિત કરો.',
'action-siteadmin' => 'માહિતી સંચયને ઉઘાડો અને વાસો.',
'action-sendemail' => 'ઈ-મેલ મોકલો',
+'action-editmywatchlist' => 'તમારી ધà«àª¯àª¾àª¨àª¸à«‚ચીમાં ફેરફાર કરો',
+'action-viewmywatchlist' => 'તમારી ધà«àª¯àª¾àª¨àª¸à«‚ચી જà«àª“',
+'action-viewmyprivateinfo' => 'તમારી અંગત માહિતી જà«àª“',
+'action-editmyprivateinfo' => 'તમારી અંગત માહિતીમાં ફેરફાર કરો',
# Recent changes
'nchanges' => '$1 {{PLURAL:$1|ફેરફાર|ફેરફારો}}',
+'enhancedrc-since-last-visit' => '$1 {{PLURAL:$1|છેલà«àª²à«€ મà«àª²àª¾àª•àª¾àª¤àª¥à«€}}',
+'enhancedrc-history' => 'ઇતિહાસ',
'recentchanges' => 'તાજા ફેરફારો',
'recentchanges-legend' => 'હાલમાં થયેલા ફેરફારોના વિકલà«àªª',
'recentchanges-summary' => 'વિકિમાં તાજેતરમાં થયેલા ફેરફારો પર અહિંથી નજર રાખો.',
@@ -1542,7 +1602,6 @@ HTML નાકà«àª‚ ચકાસો',
'recentchangeslinked-feed' => 'આની સાથે જોડાયેલા ફેરફાર',
'recentchangeslinked-toolbox' => 'આની સાથે જોડાયેલા ફેરફાર',
'recentchangeslinked-title' => '"$1" ને લગતા ફેરફારો',
-'recentchangeslinked-noresult' => 'સંકળાયેલાં પાનાંમાં સà«àªšàªµà«‡àª²àª¾ સમય દરમà«àª¯àª¾àª¨ કોઇ ફેરફાર થયાં નથી.',
'recentchangeslinked-summary' => "આ àªàªµàª¾ ફેરફારોની યાદી છે જે આ ચોકà«àª•àª¸ પાના (કે શà«àª°à«‡àª£à«€àª¨àª¾àª‚ સભà«àª¯ પાનાઓ) સાથે જોડાયેલા પાનાઓમાં તાજેતરમાં કરવામાં આવà«àª¯àª¾ હોય.
<br />[[Special:Watchlist|તમારી ધà«àª¯àª¾àª¨àª¸à«‚ચિમાં]] હોય તેવા પાનાં '''ઘાટા અકà«àª·àª°'''માં વરà«àª£àªµà«àª¯àª¾àª‚ છે",
'recentchangeslinked-page' => 'પાનાનà«àª‚ નામ:',
@@ -1554,7 +1613,7 @@ HTML નાકà«àª‚ ચકાસો',
'reuploaddesc' => 'ફાઇલ ચઢાવવાનà«àª‚ રદ કરો અને ફાઇલ ચઢાવવાના પાના પર પાછા જાવ',
'upload-tryagain' => 'સà«àª§àª¾àª°à«€àª¤ ફાઇલ વરà«àª£àª¨ ચડાવો',
'uploadnologin' => 'પà«àª°àªµà«‡àª¶ કરેલ નથી',
-'uploadnologintext' => 'ફાઇલ ચઢાવવા માટે [[Special:UserLogin|logged in]] પà«àª°àªµà«‡àª¶ કરેલો હોવો જોઇàª',
+'uploadnologintext' => 'તમારે ફાઇલà«àª¸ ચડાવવા માટે $1 હોવà«àª‚ જ જોઇàª.',
'upload_directory_missing' => 'ફાઇલ ચડાવવાની ડાયરેકà«àªŸàª°à«€ ($1) ગાયબ છે અને વેબસરà«àªµàª° દà«àªµàª¾àª°àª¾ તેની રચના ન કરી શકાઇ.',
'upload_directory_read_only' => 'ચઢાવેલી ડાયરેકà«àªŸàª°à«€ ($1) ઠવેબ બà«àª°àª¾àª‰àªàª° દà«àªµàª¾àª°àª¾ લેખન યોગà«àª¯ નથી.',
'uploaderror' => 'ફાઇલ ચઢાવમાં ચૂક',
@@ -1769,7 +1828,6 @@ https://www.mediawiki.org/wiki/Manual:Image_Authorization. જà«àª“',
'http-read-error' => 'HTTP વાચન તà«àª°à«àªŸàª¿.',
'http-timed-out' => ' HTTP અરજી કાલાતિત થઇ ગઇ.',
'http-curl-error' => 'URL: $1 ખેંચી લાવવામાં તà«àª°à«àªŸàª¿',
-'http-host-unreachable' => 'URL સà«àª§à«€ ન પહોંચી શકાયà«àª‚.',
'http-bad-status' => 'HTTP અરજી વખતે કોઈ અડચણ આવી : $1 $2',
# Some likely curl errors. More could be added from <http://curl.haxx.se/libcurl/c/libcurl-errors.html>
@@ -1800,6 +1858,10 @@ https://www.mediawiki.org/wiki/Manual:Image_Authorization. જà«àª“',
'listfiles_size' => 'માપ',
'listfiles_description' => 'વરà«àª£àª¨',
'listfiles_count' => 'આવૃતà«àª¤àª¿',
+'listfiles-show-all' => 'ચિતà«àª°à«‹àª¨à«€ જૂની આવૃતà«àª¤àª¿àª“નો સમાવેશ કરો',
+'listfiles-latestversion' => 'વરà«àª¤àª®àª¾àª¨ આવૃતિ',
+'listfiles-latestversion-yes' => 'હા',
+'listfiles-latestversion-no' => 'ના',
# File description page
'file-anchor-link' => 'ફાઇલ/દસà«àª¤àª¾àªµà«‡àªœ',
@@ -1892,6 +1954,9 @@ https://www.mediawiki.org/wiki/Manual:Image_Authorization. જà«àª“',
'randompage' => 'કોઈ પણ àªàª• લેખ',
'randompage-nopages' => 'આ {{PLURAL:$2|નામસà«àª¥àª³|નામસà«àª¥àª³à«‹}}માં કોઇ પાના નથી: $1.',
+# Random page in category
+'randomincategory-selectcategory-submit' => 'જાઓ',
+
# Random redirect
'randomredirect' => 'દિશાહીન નિરà«àª¦à«‡àª¶àª¨',
'randomredirect-nopages' => 'નામ સà«àª¥àª³ "$1" માં કોઇ દિશા નિરà«àª¦à«‡àª¶àª¨ નથી',
@@ -1917,12 +1982,6 @@ https://www.mediawiki.org/wiki/Manual:Image_Authorization. જà«àª“',
'statistics-users-active-desc' => 'સભà«àª¯ કે જેમણે છેલà«àª²àª¾ {{PLURAL:$1|દિવસ|$1 દિવસો}}માં ફેરફારો કરà«àª¯àª¾àª‚ છે',
'statistics-mostpopular' => 'સૌથી વધૠજોવાયેલા પાના',
-'disambiguations' => 'સંદિગà«àª§ શીરà«àª·àª•àªµàª¾àª³àª¾àª‚ પાનાં સાથે જોડાતાં પૃષà«àª à«‹',
-'disambiguationspage' => 'Template:અસંદિગà«àª§',
-'disambiguations-text' => "નીચેના પાના '''સંદિગà«àª§ વાકà«àª¯à«‹ વાળા પાના''' સાથે ઓછામાં ઓછી àªàª• કડી દà«àªµàª¾àª°àª¾ જોડાયેલા છે.
-તેઓ વધૠયોગà«àª¯ પાનાં સાથે જોડાયેલા હોવા જોઇàª.<br />
-પાનાને સંદિગà«àª§ વાકà«àª¯à«‹ વાળà«àª‚ પાનà«àª‚ તà«àª¯àª¾àª°à«‡ કહી શકાય જà«àª¯àª¾àª°à«‡ તે [[MediaWiki:Disambiguationspage]] નામના માળખા સાથે જોડાયેલà«àª‚ હોય.",
-
'pageswithprop' => 'પાનાં ગà«àª£àª§àª°à«àª® સાથેનાં પાનાંઓ',
'pageswithprop-legend' => 'પાનાં ગà«àª£àª§àª°à«àª® સાથેનાં પાનાંઓ',
'pageswithprop-prop' => 'ગà«àª£àª§àª°à«àª® નામ:',
@@ -2174,10 +2233,9 @@ https://www.mediawiki.org/wiki/Manual:Image_Authorization. જà«àª“',
'unwatchthispage' => 'નીરીકà«àª·àª£ બંધ કરો',
'notanarticle' => 'માહિતી વિનાનà«àª‚ પાનà«àª‚',
'notvisiblerev' => 'અનà«àª¯ સભà«àª¯ દà«àªµàª¾àª°àª¾ થયેલà«àª‚ સંપાદન ભૂંસી નખાયà«àª‚ છે.',
-'watchnochange' => 'તમારા દà«àªµàª¾àª°àª¾ નિરીકà«àª·àª¿àª¤ પાના આપેલ સમય ગાળામાં ફેરફારીત થયા',
'watchlist-details' => 'ચરà«àªšàª¾àª¨àª¾àª‚ પાનાં ન ગણતા {{PLURAL:$1|$1 પાનà«àª‚|$1 પાનાં}} ધà«àª¯àª¾àª¨àª¸à«‚ચીમાં છે.',
-'wlheader-enotif' => '*ઈ-મેલ સૂચના પદà«àª§àª¤àª¿ સકà«àª°à«€àª¯ કરાઈ.',
-'wlheader-showupdated' => "*તમારી મà«àª²àª¾àª•àª¾àª¤ લીધા પછી બદલાયેલા પાના '''ઘાટા''' અકà«àª·àª°à«‹ વડે દરà«àª¶àª¾àªµà«àª¯àª¾àª‚ છે",
+'wlheader-enotif' => 'ઈમેલ સૂચના પદà«àª§àª¤àª¿ સકà«àª°à«€àª¯ કરાઈ.',
+'wlheader-showupdated' => "તમારી છેલà«àª²à«€ મà«àª²àª¾àª•àª¾àª¤ પછી બદલાયેલાં પાના '''ઘાટા''' અકà«àª·àª°à«‹ વડે દરà«àª¶àª¾àªµà«àª¯àª¾àª‚ છે.",
'watchmethod-recent' => 'હાલમાં ફેરફાર થયેલ પાનાની ચકાસણી જારી',
'watchmethod-list' => 'હાલમાં થયેલ ફેરફાર માટે નીરીકà«àª·à«€àª¤ પાના તપાસાય છે',
'watchlistcontains' => 'તમારી ધà«àª¯àª¾àª¨àª¸à«‚ચીમાં $1 {{PLURAL:$1|પાનà«àª‚|પાનાં}} છે.',
@@ -2432,7 +2490,7 @@ $1',
'contributions' => '{{GENDER:$1|સભà«àª¯}}નà«àª‚ યોગદાન',
'contributions-title' => 'સભà«àª¯ $1નà«àª‚ યોગદાન',
'mycontris' => 'યોગદાન',
-'contribsub2' => '$1 માટે ($2)',
+'contribsub2' => '($2) માટે {{GENDER:$3|$1}}',
'nocontribs' => 'આ પરિમાણને મળતી પરિણામ નથી મળà«àª¯àª¾àª‚',
'uctop' => '(વરà«àª¤àª®àª¾àª¨)',
'month' => ':મહિનાથી (અને પહેલાનાં)',
@@ -2594,12 +2652,9 @@ $1',
જો કે આને સામૂહિક $2 રોક લગાવાઇ હોવાથી તે સમૂ હની રોક હટાવી શકાશે.',
'ip_range_invalid' => 'અવૈધ IP શà«àª°à«‡àª£à«€',
'ip_range_toolarge' => '/$1થી મોટા વિસà«àª¤àª¾àª° પà«àª°àª¤àª¿àª¬àª‚ધની પરવાનગી નથી.',
-'blockme' => 'મને પà«àª°àª¤àª¿àª¬àª‚ધિત કરો',
'proxyblocker' => 'અવેજી (પà«àª°à«‹àª•à«àª¸à«€) રોક લગાડનાર',
-'proxyblocker-disabled' => 'આ સà«àªµàª¿àª§àª¾ નિષà«àª•à«àª°à«€àª¯ કરી છે.',
'proxyblockreason' => 'તમારા IP સરનામા પરા રોક લગાડાઈ છે કેમકે તેàªàª• ખà«àª²à«àª²à«€ પà«àª°à«‹àª•à«àª¸à«€ છે.
કૃપયા તમારા ઇંટરનેટ સેવા પà«àª°àª¦àª¾àª¤àª¾ કે તકનીકી સહાય વિભાગનો સંપરà«àª• કરી જણાવો કે આ àªàª• ભયંકર સà«àª°àª•à«àª·àª¾ મામલો છે.',
-'proxyblocksuccess' => 'સંપનà«àª¨',
'sorbsreason' => '{{SITENAME}} દà«àªµàª¾àª°àª¾ વપરાયેલા DNSBL માં તમારà«àª‚ IP સરનામà«àª‚ àªàª• ખà«àª²à«àª²à«€ પà«àª°à«‹àª•à«àª¸à«€ તરીકે નોંધાયà«àª‚ છે.',
'sorbs_create_account_reason' => '{{SITENAME}} માં વપરાતા DNSBL દà«àªµàª¾àª°àª¾ તમારા IP સરનામાને ખà«àª²à«€ પà«àª°à«‹àª•à«àª¸à«€ જણાવાઇ છે.
તમે ખાતાની રચના નહીં કરી શકો.',
@@ -3045,11 +3100,25 @@ $1',
'minutes' => '{{PLURAL:$1|$1 મિનિટ|$1 મિનિટો}}',
'hours' => '{{PLURAL:$1|$1 કલાક|$1 કલાકો}}',
'days' => '{{PLURAL:$1|$1 દિવસ|$1 દિવસો}}',
+'weeks' => '{{PLURAL:$1|$1 અઠવાડિયà«àª‚|$1 અઠવાડિયાં}}',
'months' => '{{PLURAL:$1|$1 મહિનો|$1 મહિનાઓ}}',
'years' => '{{PLURAL:$1|$1 વરà«àª·|$1 વરà«àª·à«‹}}',
'ago' => '$1 પહેલાં',
'just-now' => 'હમણાં',
+# Human-readable timestamps
+'hours-ago' => '$1 {{PLURAL:$1|કલાક|કલાકો}} ago',
+'minutes-ago' => '$1 {{PLURAL:$1|મિનિટ|મિનિટો}} ago',
+'seconds-ago' => '$1 {{PLURAL:$1|સેકંડ|સેકંડો}} ago',
+'monday-at' => '$1 પર સોમવાર',
+'tuesday-at' => '$1 પર મંગળવાર',
+'wednesday-at' => '$1 પર બà«àª§àªµàª¾àª°',
+'thursday-at' => '$1 પર ગà«àª°à«àªµàª¾àª°',
+'friday-at' => '$1 પર શà«àª•à«àª°àªµàª¾àª°',
+'saturday-at' => '$1 પર શનિવાર',
+'sunday-at' => '$1 પર રવિવાર',
+'yesterday-at' => '$1 પર ગઇકાલ',
+
# Bad image list
'bad_image_list' => 'ફોરà«àª®à«‡àªŸ નીચે મà«àªœàª¬ છે:
@@ -3079,7 +3148,7 @@ $1',
* gpslongitude
* gpsaltitude',
-# EXIF tags
+# Exif tags
'exif-imagewidth' => 'પહોળાઈ',
'exif-imagelength' => 'ઊંચાઈ',
'exif-bitspersample' => 'બીટà«àª¸ પà«àª°àª¤àª¿ ભાગ',
@@ -3257,7 +3326,7 @@ $1',
'exif-originalimageheight' => 'છબી પર ફેરફાર કરà«àª¯àª¾ પહેલા ની ઊંચાઈ',
'exif-originalimagewidth' => 'છબી પર ફેરફાર કરà«àª¯àª¾ પહેલા ની પહોળાઈ',
-# EXIF attributes
+# Exif attributes
'exif-compression-1' => 'અસંકોચિત',
'exif-compression-2' => 'CCITT સમà«àª¦àª¾àª¯ à«© ૧-પરિમાણિય ફેરફાર કરેલૠHuffman રન લંબઈ àªàª¨à«àª•à«‹àª¡àª¿àª‚ગ',
'exif-compression-3' => 'CCITT સમૂહ 3 ફેકà«àª¸ àªàª¨àª•à«‹àª¡àª¿àª‚ગ',
@@ -3645,7 +3714,6 @@ $5
'version-other' => 'અનà«àª¯',
'version-mediahandlers' => 'દà«àª°àª¶à«àª¯àª¶à«àª°àª¾àªµà«àª¯ માધà«àª¯àª®àª¨àª¾ ધારક',
'version-hooks' => 'ખૂંટા',
-'version-extension-functions' => 'વિસà«àª¤àª¾àª°àª• કારà«àª¯',
'version-parser-extensiontags' => 'પૃથકà«àª•àª°àª£ વિસà«àª¤àª¾àª°àª• ટૅગà«àª¸',
'version-parser-function-hooks' => 'પદચà«àª›à«‡àª¦ કારà«àª¯ ખૂંટા',
'version-hook-name' => 'ખૂંટાનà«àª‚ નામà«',
@@ -3654,6 +3722,7 @@ $5
'version-license' => 'પરવાનો',
'version-poweredby-credits' => "આ વિકિ '''[//www.mediawiki.org/ MediaWiki]''' દà«àªµàª¾àª°àª¾ ચાલે છે, પà«àª°àª•àª¾àª¶àª¨àª¾àª§àª¿àª•àª¾àª° © 2001-$1 $2.",
'version-poweredby-others' => 'અનà«àª¯à«‹',
+'version-poweredby-translators' => 'ટà«àª°àª¾àª¨à«àª¸àª²à«‡àªŸàªµàª¿àª•àª¿.નેટ ભાષાંતરકરà«àª¤àª¾àª“',
'version-license-info' => 'મિડિયાવિકિ àªàª• મà«àª•à«àª¤ સોફà«àªŸàªµà«‡àª° છે. તમે તેનà«àª‚ પà«àª¨àªƒàªµàª¿àª¤àª°àª£ કરી શકો છો અને/અથવા તેને the Free Software Foundation દà«àªµàª¾àª°àª¾ પà«àª°àª•àª¾àª¶àª¿àª¤ GNU General Public License હેઠળ તેના સંસà«àª•àª°àª£ 2 ને કે તે પછીના સંસà«àª•àª°àª£ મઠારી શકો છો .
મિડિયા વિકિ ને તે આશાથી વિતરીત કરાયà«àª‚ છે કે તે લોકોને ઉપયોગિ થશે કોઇ વોરેંટી વિના અથવા કોઇ કારà«àª¯ સંબધી વેચાણકે તેની યોગà«àª¯àª¤àª¾ બદà«àª¦àª² ખાતà«àª°à«€ સિવાય. વધારે માહિતે માટે GNU General Public Licens જà«àª“.
@@ -3665,12 +3734,15 @@ $5
'version-entrypoints-header-entrypoint' => 'પà«àª°àªµà«‡àª¶ સà«àª¥àª³',
'version-entrypoints-header-url' => 'URL',
-# Special:FilePath
-'filepath' => 'ફાઈલ પથ',
-'filepath-page' => 'ફાઇલ:',
-'filepath-submit' => 'કરો',
-'filepath-summary' => 'આ ખાસ પાનà«àª‚ કોઇ ફાઇલનો સંપૂરà«àª£ પથ બતાવે છે.
-ચિતà«àª°à«‹àª¨à«‡ તેમના પૂરà«àª£ ઘનતà«àªµ સાથે બતાવાય છે, અનà«àª¯ ફાઈલો તેમને તેમના સંલગà«àª¨ પà«àª°à«‹àª—à«àª°àª¾àª® દà«àªµàª¾àª°àª¾ સીધી ખોલવામાં આવશે.',
+# Special:Redirect
+'redirect-legend' => 'ફાઇલ અથવા પાનાં તરફ વાળો',
+'redirect-submit' => 'જાઓ',
+'redirect-lookup' => 'જà«àª“:',
+'redirect-value' => 'કિંમત:',
+'redirect-user' => 'સભà«àª¯ નામ',
+'redirect-revision' => 'પાનાંની આવૃતà«àª¤àª¿',
+'redirect-file' => 'ફાઇલ નામ',
+'redirect-not-exists' => 'કિંમત મળી નહી',
# Special:FileDuplicateSearch
'fileduplicatesearch' => 'નકલ ફાઇલ શોધો',
@@ -3719,12 +3791,16 @@ $5
'tags' => 'વૈધ ફેરફાર પાના',
'tag-filter' => '[[Special:Tags|ટૅગ]] ચાળણી',
'tag-filter-submit' => 'ચાળણી',
+'tag-list-wrapper' => '([[Special:Tags|{{PLURAL:$1|ટેગ|ટેગà«àª¸}}]]: $2)',
'tags-title' => 'ટૅગà«àª¸',
'tags-intro' => 'આ પાના પર સૉફà«àªŸàªµà«…ર દà«àªµàª¾àª°àª¾, સંપાદનને ચિહà«àª¨àª¿àª¤ કરાયેલાં ટૅગà«àª¸àª¨à«€ યાદી અને તેનાં અરà«àª¥ છે.',
'tags-tag' => 'ટૅગનà«àª‚ નામ',
'tags-display-header' => 'ફેરફારની યાદિઓમાં દેખાવ',
'tags-description-header' => 'અરà«àª¥àª¨à«àª‚ પૂરà«àª£ વિવરણ',
+'tags-active-header' => 'સકà«àª°àª¿àª¯?',
'tags-hitcount-header' => 'અંકિત ફેરફારો',
+'tags-active-yes' => 'હા',
+'tags-active-no' => 'ના',
'tags-edit' => 'ફેરફાર કરો',
'tags-hitcount' => '$1 {{PLURAL:$1|ફેરફાર|ફેરફારો}}',
@@ -3760,6 +3836,9 @@ $5
'htmlform-submit' => 'જમા કરો',
'htmlform-reset' => 'ફેરફાર ઉલટાવો',
'htmlform-selectorother-other' => 'અનà«àª¯',
+'htmlform-no' => 'ના',
+'htmlform-yes' => 'હા',
+'htmlform-chosen-placeholder' => 'વિકલà«àªª પસંદ કરો',
# SQLite database support
'sqlite-has-fts' => '$1 પૂરà«àª£ શબà«àª¦ શોધ સહીત',
@@ -3872,4 +3951,12 @@ $5
# Image rotation
'rotate-comment' => 'ચિતà«àª° $1 {{PLURAL:$1|ડિગà«àª°à«€|ડિગà«àª°à«€àª“}} ઘડિયાળની દિશામાં ફેરવવામાં આવà«àª¯à«àª‚',
+# Limit report
+'limitreport-cputime' => 'CPU સમય વપરાશ',
+'limitreport-cputime-value' => '$1 {{PLURAL:$1|સેકંડ|સેકંડો}}',
+'limitreport-walltime' => 'ખરો સમય વપરાશ',
+'limitreport-walltime-value' => '$1 {{PLURAL:$1|સેકંડ|સેકંડો}}',
+'limitreport-postexpandincludesize-value' => '$1/$2 {{PLURAL:$2|બાઇટ|બાઇટà«àª¸}}',
+'limitreport-templateargumentsize-value' => '$1/$2 {{PLURAL:$2|બાઇટ|બાઇટà«àª¸}}',
+
);
diff --git a/languages/messages/MessagesGv.php b/languages/messages/MessagesGv.php
index ffa975ac..1e2aafed 100644
--- a/languages/messages/MessagesGv.php
+++ b/languages/messages/MessagesGv.php
@@ -59,13 +59,13 @@ $messages = array(
'tog-shownumberswatching' => 'Taishbyn earroo ny h-ymmydeyryn ta freill arrey',
'tog-oldsig' => "Roie-haishbynys jeh'n screeuys t'ayn hannah:",
'tog-fancysig' => 'Stiur y screeuys myr wikiteks (gyn kiangley seyr-obbragh)',
-'tog-showjumplinks' => 'Doostey kianglaghyn roshtynagh "lheim dys"',
'tog-watchlisthideown' => 'Follee my arraghyn hene er my rolley arrey',
'tog-watchlisthidebots' => 'Follee arraghyn botyn er my rolley arrey',
'tog-watchlisthideminor' => 'Follee myn-arraghyn er my rolley arrey',
'tog-watchlisthidepatrolled' => 'Follee arraghyn er nyn scrutaghey er my rolley arrey',
'tog-ccmeonemails' => 'Cur coip dou jeh dagh post-l verrym da ymmydeyr elley',
'tog-showhiddencats' => 'Taishbyn ny ronnaghyn follit',
+'tog-useeditwarning' => 'Cur raaue dou my ta mee faagail duillag reaghey gyn sauail yn obbyr jeant aym',
'underline-always' => 'Dagh keayrt',
'underline-never' => 'Ny jean eh arragh',
@@ -240,7 +240,7 @@ $messages = array(
'jumptosearch' => 'ronsee',
'pool-errorunknown' => 'Doilleeid gyn enney',
-# 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).
+# 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).
'aboutsite' => 'Mychione {{SITENAME}}',
'aboutpage' => 'Project:Mychione',
'copyright' => 'Ta stoo ry-gheddyn rere $1.',
@@ -250,7 +250,6 @@ $messages = array(
'disclaimers' => 'Jiooldeyderyn',
'disclaimerpage' => 'Project:Obbalys cadjin',
'edithelp' => 'Cooney reaghee',
-'edithelppage' => 'Help:Reaghey',
'helppage' => 'Help:Cummal',
'mainpage' => 'Ard-ghuillag',
'mainpage-description' => 'Ard-ghuillag',
@@ -332,7 +331,6 @@ Cur-shiu coontey jeh da [[Special:ListUsers/sysop|reireyder]], as goaill stiagh
'actionthrottledtext' => "Myr saase noi-spam, cha nod oo jannoo yn obbyr shoh rouyr keayrtyn ayns tammylt beg, as t'ou er roshtyn yn earroo smoo. Jean eab noa dy gerrid, my saillt.",
'protectedpagetext' => "Ta'n duillag shoh fo ghlass, as cha nod oo eshyn y reaghey.",
'viewsourcetext' => 'Foddee oo jeeagh as jean aascreeuyn er bun ny duillag shoh:',
-'sqlhidden' => '(briaght SQL follit)',
'namespaceprotected' => "Cha nel kiart ayd duillagyn 'sy reamys '''$1''' y reaghey.",
'ns-specialprotected' => 'Cha nod oo reaghey duillagyn er lheh.',
@@ -504,6 +502,8 @@ Foddee shiu goll er ash as reaghey duillag t'ayn nish, ny [[Special:UserLogin|lo
By chair dhyt smooinagh vel eh kiart goll er oai lesh reaghey yn duillag shoh.<br />
Ta lioar ny scryssaghyn magh kiarit ayns shoh rere dty chaays hene:",
+'editwarning-warning' => "My faagys oo y duillag, hed caghlaaghyn erbee er coayl, foddee.
+My t'ou uss loggalt stiagh, foddee oo lhiettal y raaue shoh 'sy tosheeaghtyn ayd, 'sy rheynn \"Reaghey\".",
# Account creation failure
'cantcreateaccounttitle' => 'Cha nod coontys y chroo',
@@ -577,7 +577,6 @@ Ogher: '''({{int:cur}})''' = anchaslyssyn rish y lhieggan t'ayn nish,
'shown-title' => 'Taishbyn $1 {{PLURAL:$1|eiyrtys|eiyrtyssyn}} er dagh duillag',
'viewprevnext' => 'Jeeagh er ($1 {{int:pipe-separator}} $2) ($3)',
'searchmenu-new' => "'''Croo yn duillag \"[[:\$1]]\" er y wiki shoh!'''",
-'searchhelp-url' => 'Help:Cummal',
'searchprofile-articles' => 'Duillagyn cummal',
'searchprofile-project' => 'Duillagyn Coonee as Shalee',
'searchprofile-everything' => 'Dagh red',
@@ -606,9 +605,6 @@ My t'ou uss son ronsaghey dagh cooid (as shen goaill stiagh duillagyn resooney,
'powersearch-field' => 'Ronsee er son',
'search-external' => 'Ronsaghey mooie',
-# Quickbar
-'qbsettings-none' => 'Veg',
-
# Preferences page
'preferences' => 'Tosheeaghtyn',
'mypreferences' => 'My hosheeaghtyn',
@@ -776,7 +772,6 @@ My bailliu eh y chiarail, bee eh ymmydit son cur gys lieh y chur dhyt er son yn
'recentchangeslinked-feed' => 'Caghlaaghyn-vooinjerys',
'recentchangeslinked-toolbox' => 'Caghlaaghyn conastagh',
'recentchangeslinked-title' => 'Caghlaaghyn bentyn rish "$1"',
-'recentchangeslinked-noresult' => 'Cha nel caghlaa erbee er duillagyn kianglt car y traa taishbynit.',
'recentchangeslinked-summary' => "Shoh rolley caghlaaghyn va jeant er duillagyn kianglt veih duillag sonrit (ny er olteynyn ronney sonrit).<br />
Ta duillagyn er [[Special:Watchlist|dty rolley arrey]] ayns '''clou trome'''.",
'recentchangeslinked-page' => 'Ennym y duillag:',
@@ -876,8 +871,6 @@ Ta duillagyn er [[Special:Watchlist|dty rolley arrey]] ayns '''clou trome'''.",
'statistics-header-users' => 'Staydraa ymmydeyr',
'statistics-pages' => 'Duillagyn',
-'disambiguations' => 'Duillagyn ta kianglt rish duillagyn reddaghey',
-
'doubleredirects' => 'Aa-enmyssyn dooblagh',
'brokenredirects' => 'Aa-enmyssyn brisht',
@@ -1193,7 +1186,6 @@ Shoh ny reaghaghyn roie da'n duillag '''$1''':",
'unblocklogentry' => '$1 er ny neughlassey magh',
'block-log-flags-anononly' => 'ymmydeyryn neuenmyssit ynrican',
'block-log-flags-nocreate' => 'gyn kiart coontyssyn y chroo',
-'proxyblocksuccess' => 'Jeant.',
# Move page
'move-page' => '$1 y scughey',
@@ -1367,7 +1359,7 @@ Bee adsyn elley follit dy seyr-obbragh.<br />
* gpslongitude
* gpsaltitude',
-# EXIF tags
+# Exif tags
'exif-imagewidth' => 'Lheead',
'exif-imagelength' => 'Yrjid',
'exif-ycbcrpositioning' => 'Soie Y as C',
@@ -1465,9 +1457,6 @@ Bee adsyn elley follit dy seyr-obbragh.<br />
'version-license' => 'Kiedoonys',
'version-software-version' => 'Lhieggan',
-# Special:FilePath
-'filepath-page' => 'Coadan:',
-
# Special:FileDuplicateSearch
'fileduplicatesearch-filename' => 'Ennym y choadan:',
'fileduplicatesearch-submit' => 'Ronsee',
diff --git a/languages/messages/MessagesHa.php b/languages/messages/MessagesHa.php
index 3e82212b..c6883f70 100644
--- a/languages/messages/MessagesHa.php
+++ b/languages/messages/MessagesHa.php
@@ -41,8 +41,6 @@ $messages = array(
'tog-shownumberswatching' => "A nuna adadin ma'aikata masu bin sawun wannan shafi",
'tog-oldsig' => 'Rigya-ganin sa-hannu da ake da shi',
'tog-fancysig' => 'A É—auki matanin sa-hannu a matsayin matanin Wiki (ba tare da mahaÉ—in otomatik ba)',
-'tog-externaleditor' => 'Bisa manufa, a yi amfani da editan matani daban (zuwa ga ƙwararri: kuna buƙatar sauya saitin kwamfyutarku)',
-'tog-externaldiff' => 'Bisa manufa, a yi amfani da kwatantau daban (zuwa ga ƙwararri: kuna buƙatar sauya saitin kwamfyutarku)',
'tog-showjumplinks' => 'A lamunta mahaÉ—an "a tsallaka zuwa"',
'tog-uselivepreview' => 'A yi amfani da rigya-gani mai sauƙi (ana buƙatar JavaScript) (hajar gwaji)',
'tog-forceeditsummary' => 'A gargaɗe ni idan na ajiye kangon fili na taƙaitawa',
diff --git a/languages/messages/MessagesHak.php b/languages/messages/MessagesHak.php
index 06ea72f5..770bd899 100644
--- a/languages/messages/MessagesHak.php
+++ b/languages/messages/MessagesHak.php
@@ -46,9 +46,6 @@ $messages = array(
'tog-shownumberswatching' => '展示監視中嘅使用人數目',
'tog-oldsig' => 'ç¾æœ‰ç°½å:',
'tog-fancysig' => '將簽å看åšç¶­åŸºæ–‡å­—(毋會自動產生éˆæŽ¥ï¼‰',
-'tog-externaleditor' => '默èªä½¿ç”¨å¤–部編輯器(進階者專用,æ±å˜…電腦需è¦ç‰¹æ®Šè¨­å®šã€‚[//www.mediawiki.org/wiki/Manual:External_editors 更多訊æ¯ã€‚])',
-'tog-externaldiff' => 'Sat-thin sá¹³Ì-yung ngoi-phu chhâ-yi fun-sak',
-'tog-showjumplinks' => '啟用“跳轉到â€è¨ªå•éˆæŽ¥',
'tog-uselivepreview' => '使用å³æ™‚é è¦½ï¼ˆå¯¦é©—中)',
'tog-forceeditsummary' => 'é‚„å‚輸入編寫摘è¦æ™‚æ醒亻厓',
'tog-watchlisthideown' => '監視列表肚隱è—亻厓嘅編寫',
@@ -61,6 +58,8 @@ $messages = array(
'tog-diffonly' => 'å°æ¯”版本毋åŒæ™‚下背毋展示é é¢å…§å®¹',
'tog-showhiddencats' => '展示隱è—分類',
'tog-norollbackdiff' => '执行回退後毋顯示差別',
+'tog-useeditwarning' => '當離開é é¢ä¹‹æ™‚變更還å‚儲存,請æ醒𠊎',
+'tog-prefershttps' => '登入時一直使用安全連線',
'underline-always' => '總係使用',
'underline-never' => '從來毋用',
@@ -124,6 +123,18 @@ $messages = array(
'oct' => '10月',
'nov' => '11月',
'dec' => '12月',
+'january-date' => '1月$1日',
+'february-date' => '2月$1日',
+'march-date' => '3月$1日',
+'april-date' => '4月$1日',
+'may-date' => '5月$1日',
+'june-date' => '6月$1日',
+'july-date' => '7月$1日',
+'august-date' => '8月$1日',
+'september-date' => '9月$1日',
+'october-date' => '10月$1日',
+'november-date' => '11月$1日',
+'december-date' => '12月$1日',
# Categories related messages
'pagecategories' => '$1隻分類',
@@ -205,6 +216,7 @@ $messages = array(
'create-this-page' => '建立本é ',
'delete' => '刪除',
'deletethispage' => '刪除本é ',
+'undeletethispage' => 'å–消刪除邇é ',
'undelete_short' => 'æ¢å¾©$1隻分删除嘅编寫',
'viewdeleted_short' => '查看$1項已刪除嘅修訂',
'protect' => 'ä¿è­·',
@@ -246,7 +258,7 @@ $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).
+# 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).
'aboutsite' => '關於 {{SITENAME}}',
'aboutpage' => 'Project:關於',
'copyright' => '除éžå¦æœ‰è¬›æ˜Žï¼Œå¦å‰‡æœ¬ç«™å…§å®¹éƒ½ä¿‚以$1æ¢æ¬¾æ供。',
@@ -256,7 +268,6 @@ $1',
'disclaimers' => 'å…責è²æ˜Ž',
'disclaimerpage' => 'Project:一般å…責è²æ˜Ž',
'edithelp' => '編寫幫手',
-'edithelppage' => 'Help:Phiên-cho hong-mien',
'helppage' => 'Help:目錄',
'mainpage' => 'é ­é ',
'mainpage-description' => 'é ­é ',
@@ -334,17 +345,8 @@ $1',
# General errors
'error' => '差錯',
'databaseerror' => '數據庫差錯',
-'dberrortext' => '發生數據庫查詢語法錯誤。
-å¯èƒ½ä¿‚由於軟體自身嘅錯誤所引起。
-最後一次數據庫查詢指令係:
-<blockquote><code>$1</code></blockquote>
-來自於函數“<code>$2</code>â€ã€‚
-數據庫返回錯誤“<samp>$3: $4</samp>â€ã€‚',
-'dberrortextcl' => '發生數據庫查詢語法錯誤。
-最後一次嘅數據庫查詢是:
-「$1ã€
-來自於函數「$2ã€ã€‚
-數據庫返回錯誤「$3: $4ã€ã€‚',
+'databaseerror-text' => '出ç¾è³‡æ–™åº«æŸ¥è©¢éŒ¯èª¤ã€‚
+邇å¯èƒ½è¡¨ç¤ºè»Ÿä»¶è‚šå­˜åœ¨éŒ¯èª¤ã€‚',
'laggedslavemode' => "'''警告:'''é é¢å¯èƒ½æ¯‹åŒ…å«æœ€è¿‘嘅更新。",
'readonly' => '數據庫分人鎖定',
'enterlockreason' => '請撳入ç¦æ­¢è¨ªå•åŽŸå› , 包括估計é‡æ–°é–‹æ”¾å˜…時間',
@@ -400,7 +402,6 @@ $1',
'editinginterface' => "'''警告:'''æ±ä»Šä¸‹ç·¨å¯«ç·Šå˜…é é¢ä¿‚用於æ供軟件嘅界é¢æ–‡å­—。
改變邇é å°‡å½±éŸ¿å…¶ä»–在邇隻wiki上嘅用戶界é¢å¤–觀。
å‡ä½¿æ„›ä¿®æ”¹æ‰€æœ‰wiki嘅翻譯,請到[//translatewiki.net/ translatewiki.net]上嘅MediaWiki本地化計劃。",
-'sqlhidden' => '(隱è—SQL查詢)',
'cascadeprotected' => '邇隻é é¢å·²ç¶“ç•€ä¿è­·ï¼Œå› ç‚ºé‚‡éš»é é¢è¢«ä»¥ä¸‹å·²æ¨™è¨»"è¯éŽ–ä¿è­·"嘅{{PLURAL:$1|一個|多個}}ç•€ä¿è­·é é¢åŒ…å«ï¼š
$2',
'namespaceprotected' => "æ±é‚„無權é™ç·¨è¼¯'''$1'''å字空間嘅é é¢ã€‚",
@@ -429,10 +430,18 @@ $2',
'welcomecreation-msg' => 'æ±å˜…賬號已經建立。
莫添忘訖設置[[Special:Preferences|{{SITENAME}}嘅個人åƒæ•¸]]。',
'yourname' => '用戶å:',
+'userlogin-yourname' => '用戶å',
+'userlogin-yourname-ph' => '輸入æ±å˜…用戶å',
'yourpassword' => '密碼:',
+'userlogin-yourpassword' => '密碼',
+'userlogin-yourpassword-ph' => '輸入æ±å˜…密碼',
+'createacct-yourpassword-ph' => '輸入æ±å˜…密碼',
'yourpasswordagain' => 'å†ä¸€æ“ºè¼¸å…¥å¯†ç¢¼ï¼š',
+'createacct-yourpasswordagain' => '確èªå¯†ç¢¼',
+'createacct-yourpasswordagain-ph' => 'å†ä¸€æ“ºè¼¸å…¥å¯†ç¢¼',
'remembermypassword' => '在邇隻ç€è¦½å™¨ä¸Šè¨˜ä¸‹ð ŠŽå˜…登入狀態(最長$1日)',
-'securelogin-stick-https' => '登入後繼續用HTTPS連接',
+'userlogin-remembermypassword' => 'ä¿æŒð ŠŽå˜…登入狀態',
+'userlogin-signwithsecure' => '使用安全連線',
'yourdomainname' => 'æ±å˜…域å:',
'password-change-forbidden' => 'æ±åšæ¯‹å¾—更改本wiki上嘅密碼。',
'externaldberror' => '邇å¯èƒ½ä¿‚由於驗證數據庫差錯或者æ±åˆ†ç³»çµ±ç¦æ­¢æ›´æ–°æ±å˜…外部賬號。',
@@ -444,18 +453,38 @@ $2',
'logout' => '登出',
'userlogout' => '登出',
'notloggedin' => 'é‚„å‚登入',
+'userlogin-noaccount' => '還無帳戶係無?',
+'userlogin-joinproject' => 'åƒèˆ‡ {{SITENAME}}',
'nologin' => '還無帳號係無?$1。',
'nologinlink' => '建立帳號',
'createaccount' => '建立帳號',
'gotaccount' => '已經æ“有帳號係無?$1。',
'gotaccountlink' => '登入',
'userlogin-resetlink' => '毋記得æ±å˜…登入信æ¯ï¼Ÿ',
+'userlogin-resetpassword-link' => 'é‡ç½®çˆ¾å˜…密碼',
+'helplogin-url' => 'Help:登入',
+'userlogin-helplink' => '[[{{MediaWiki:helplogin-url}}|登入説明]]',
+'createacct-join' => '輸入æ±å˜…基本資料:',
+'createacct-emailrequired' => '電郵地å€ï¼š',
+'createacct-emailoptional' => '電郵地å€ï¼ˆå¯é¸ï¼‰',
+'createacct-email-ph' => '設置電郵地å€',
'createaccountmail' => '使用一隻臨時嘅隨機密碼,並發é€å…¶åˆ°ä»¥ä¸‹æŒ‡å®šå˜…é›»å­éƒµä»¶åœ°å€',
+'createacct-realname' => '實å(å¯é¸ï¼‰',
'createaccountreason' => '原因:',
+'createacct-reason' => '原因',
+'createacct-reason-ph' => 'æ±åšéº½å˜…愛創建å¦ä¸€éš»å¸³è™Ÿ',
+'createacct-captcha' => '安全檢查',
+'createacct-imgcaptcha-ph' => '輸入æ±åœ¨ä¸ŠèƒŒçœ‹åˆ°å˜…字符',
+'createacct-submit' => '建立帳號',
+'createacct-benefit-heading' => '{{SITENAME}}是由撈您共樣嘅人建立。',
+'createacct-benefit-body1' => '$1次編寫',
+'createacct-benefit-body2' => '$1é ',
+'createacct-benefit-body3' => '近期$1隻貢ç»äºº',
'badretype' => 'æ±æ‰€æ’³å…¥å˜…密碼並毋相åŒ',
'userexists' => 'æ±æ‰€å¡«å…¥å˜…用戶å稱已經存在。
è«‹å¦é¸ä¸€éš»å稱。',
'loginerror' => '登入差錯',
+'createacct-error' => '帳戶建立差錯',
'createaccounterror' => '無辦法建立帳號:$1',
'nocookiesnew' => '本用戶賬號已分建立,但係æ±ç™»å…¥å¤±æ•—。{{SITENAME}}使用cookie登入。æ±å·²åœç”¨cookie。請啓用cookie,之後使用æ±å˜…新用戶å和密碼登入。',
'nocookieslogin' => '{{SITENAME}}用cookie登入。æ±å·²åœç”¨cookie。請啓用cookie後å†è©¦ä¸€æ“ºã€‚',
@@ -508,6 +537,8 @@ $2',
如果該賬戶建立錯誤嘅話,æ±å¯ä»¥å¿½ç•¥é‚‡æ¢è¨Šæ¯ã€‚',
'usernamehasherror' => '用戶å毋å¯ä»¥åŒ…å«Hash字符',
+'login-throttled' => 'æ±å·²ç¶“嘗試多次登入動作。
+請等陣å†è©¦ã€‚',
'login-abort-generic' => '登入錯誤 - 中止',
'loginlanguagelabel' => '語言:$1',
'suspicious-userlogout' => 'æ±ç™»å‡ºå˜…è¦æ±‚已經分拒絕,因為其å¯èƒ½ä¿‚由已æ壞嘅ç€è¦½å™¨æˆ–者緩存代ç†å‚³é€ã€‚',
@@ -526,7 +557,8 @@ $2',
'newpassword' => '舊密碼:',
'retypenew' => 'å†ä¸€æ“ºè¼¸å…¥å¯†ç¢¼ï¼š',
'resetpass_submit' => '設定密碼並登入',
-'resetpass_success' => 'Ngì-ke meÌt-meÌt yí-kîn pûn sṳ̀n-kûng kiên-kói! Hien-ha chang vi ngì tên-ngiÌp...',
+'changepassword-success' => 'æ±æˆåŠŸæ›´æ”¹çŸ£æ±å˜…密碼ï¼
+今下為æ±ç™»å…¥ç·Š...',
'resetpass_forbidden' => '無辦法更改密碼',
'resetpass-no-info' => 'æ±å¿…須登入後直接進入邇隻é é¢ã€‚',
'resetpass-submit-loggedin' => '更改密碼',
@@ -538,10 +570,9 @@ $2',
# Special:PasswordReset
'passwordreset' => 'é‡è¨­å¯†ç¢¼',
-'passwordreset-text' => '完æˆé‚‡éš»è¡¨æ ¼ä»¥é‡ç½®æ±å˜…密碼。',
'passwordreset-legend' => 'é‡ç½®å¯†ç ',
'passwordreset-disabled' => '邇隻維基上已ç¦æ­¢çŸ£é‡è¨­å¯†ç¢¼ã€‚',
-'passwordreset-pretext' => '{{PLURAL:$1||輸入下列其中一隻}}',
+'passwordreset-emaildisabled' => 'é›»å­éƒµä»¶åŠŸèƒ½åœ¨æ­¤ wiki 上已ç¦ç”¨ã€‚',
'passwordreset-username' => '用戶å:',
'passwordreset-domain' => '域å:',
'passwordreset-capture' => '查看生æˆå˜…é›»å­éƒµä»¶ä¿‚無?',
@@ -829,7 +860,6 @@ Liá-chhṳ chhà-fûng he yù $1 só fûng ke. Tông-chûng ke ngièn-yîn he '
'viewprevnext' => '查看($1 {{int:pipe-separator}} $2)($3)',
'searchmenu-exists' => "'''在邇隻wiki上已經有一é å–Šåšâ€œ[[:$1]]â€ã€‚'''",
'searchmenu-new' => "'''在本wiki上建立邇隻é é¢â€œ[[:$1]]â€ï¼'''",
-'searchhelp-url' => 'Help:目錄',
'searchprofile-articles' => '內容é é¢',
'searchprofile-project' => '幫助撈計劃é é¢',
'searchprofile-images' => '多媒體',
@@ -863,14 +893,6 @@ Liá-chhṳ chhà-fûng he yù $1 só fûng ke. Tông-chûng ke ngièn-yîn he '
'powersearch-togglelabel' => '監查:',
'searchdisabled' => '{{SITENAME}}由於性能方é¢å˜…原因,全文æœå·²åˆ†æš«æ™‚åœç”¨ã€‚æ±åšå¾—暫時通éŽGoogleæœå°‹ã€‚è«‹ç•™æ„佢兜嘅索引å¯èƒ½æœƒéŽæ™‚。',
-# Quickbar
-'qbsettings' => '快速導航欄',
-'qbsettings-none' => 'ç„¡',
-'qbsettings-fixedleft' => 'Hiong-chó ku-thin',
-'qbsettings-fixedright' => 'Hiong-yu ku-thin',
-'qbsettings-floatingleft' => 'Phêu-yì chhai chó',
-'qbsettings-floatingright' => 'Phêu-yì chhai yu',
-
# Preferences page
'preferences' => 'å好設定',
'mypreferences' => 'å好設定',
@@ -1002,7 +1024,6 @@ Tshòng-tón pit-sî chhai $1-ke sṳ-ngièn yî-ha.',
'recentchangeslinked-feed' => '相關更改',
'recentchangeslinked-toolbox' => '相關更改',
'recentchangeslinked-title' => '撈“$1â€æœ‰é—œå˜…更改',
-'recentchangeslinked-noresult' => '在邇一段時間肚éˆæŽ¥å˜…é é¢ä¸¦ç„¡æ›´æ”¹ã€‚',
'recentchangeslinked-summary' => "邇一隻特殊é é¢åˆ—示''ç”±''所分出嘅一隻é é¢ä¹‹éˆæŽ¥åˆ°é é¢å˜…最近更改(或者是å°æ–¼æŒ‡å®šåˆ†é¡žå˜…æˆå“¡ï¼‰ã€‚
在[[Special:Watchlist|æ±å˜…監視列表]]肚嘅é é¢æœƒç”¨'''ç²—é«”'''顯示。",
'recentchangeslinked-page' => 'é é¢å:',
@@ -1013,7 +1034,8 @@ Tshòng-tón pit-sî chhai $1-ke sṳ-ngièn yî-ha.',
'uploadbtn' => '上傳文件',
'reuploaddesc' => 'å–消上載並返回上載表單',
'uploadnologin' => 'é‚„å‚登入',
-'uploadnologintext' => 'Ngì pit-sî chó-siên [[Special:UserLogin|tên-ngiÌp]] chhòi-nèn sông-chai vùn-khien.',
+'uploadnologintext' => 'æ±å¿…須先[[Special:UserLogin|登入]]
+æ­£åšå¾—上傳文件。',
'upload_directory_read_only' => '上傳目錄($1)毋存在或無寫權é™ã€‚',
'uploaderror' => '上傳差錯',
'uploadtext' => "Sá¹³Ì-yung ha-mien ke péu-tân lòi song-chhòn yung-chhai vùn-chông nui sîn-ke thù-hìn tóng-on. Yeu kiám-sá¹³ feÌt-chá sêu-chhà yî-chhièn song-chhòn ke thù-phién khó-yî chin-ngiÌp [[Special:FileList|Thù-hìn chhîn-tân]], song-chhòn lâu chhù-hi chiông-chhai [[Special:Log/upload|Song-chhòn ngit-ki]] chûng ki-liuÌk. Yeu-chhai vùn-chông chûng kâ-ngiÌp thù-hiong, sá¹³Ì-yung yî-ha hìn-sá¹³t ke lièn-chiap: '''<nowiki>[[{{ns:file}}:file.jpg]]</nowiki>''', '''<nowiki>[[{{ns:file}}:file.png|Thi-von vùn-sá¹³]]</nowiki>''' feÌt-he '''<nowiki>[[{{ns:media}}:file.ogg]]</nowiki>'''.",
@@ -1146,10 +1168,6 @@ Tshòng-tón pit-sî chhai $1-ke sṳ-ngièn yî-ha.',
'statistics-header-users' => '用戶統計',
'statistics-mostpopular' => '分查閱次數最多嘅é é¢',
-'disambiguations' => 'Sêu-hàm fù-chông',
-'disambiguationspage' => 'Template:消歧義',
-'disambiguations-text' => 'Yî-ha ke hong-mien tû-yû to <b> sêu-hàm fù-chông </b> ke lièn-chiap, than yin-kôi he lièn-to sṳt-tông ke phêu-thì. <br /> Yit-ke hong-mien chiông-voi pûn-ngìn sṳ-vi Sêu-hàm fù-chông kó-yèn kí he lièn-chhṳ [[MediaWiki:disambiguationspage]].',
-
'doubleredirects' => 'é›™é‡é‡å®šå‘é ',
'doubleredirectstext' => 'Mî yit-hàng pâu-hàm to thi-yit lâu thi-ngi-ke chhûng-thin hong-mien ke lièn-chiap, yî-khiÌp thi-ngi ke chhûng-thin hong-mien ke thi-yit-hàng vùn-sá¹³, thûng-sòng hién-sá¹³ ke he "chṳ̂n-chá¹³n" ke muk-phêu vùn-chông, ye-he thi-yit-ke chhûng-thin hong-mien yin-kôi chá¹³Ì-hiong ke vùn-chông.',
@@ -1294,10 +1312,9 @@ Also see [[Special:WantedCategories|wanted categories]].',
'unwatch' => 'å–消監視',
'unwatchthispage' => 'åœæ­¢ç›£è¦–',
'notanarticle' => '毋係內容é é¢',
-'watchnochange' => '在顯示嘅時間段內æ±æ‰€ç›£è¦–嘅é é¢ç„¡æ›´æ”¹ã€‚',
'watchlist-details' => '毋包å«äº¤æµé ï¼Œæ±å˜…監視列表上有$1éš»é é¢ã€‚',
-'wlheader-enotif' => '* Yí-kîn khí-thung email thûng-tî kûng-nèn.',
-'wlheader-showupdated' => "* Chhai ngì song-chhṳ kiám-sṳ heu yû pûn chhùng-siû ko ke vùn-chông chiông-voi hién-sṳ vi '''chhû-thí'''.",
+'wlheader-enotif' => 'Yí-kîn khí-thung email thûng-tî kûng-nèn.',
+'wlheader-showupdated' => "Chhai ngì song-chhṳ kiám-sṳ heu yû pûn chhùng-siû ko ke vùn-chông chiông-voi hién-sṳ vi '''chhû-thí'''.",
'watchmethod-recent' => '檢查分監視é é¢å˜…最近編寫',
'watchmethod-list' => '檢查最近編寫嘅分監視é é¢',
'watchlistcontains' => 'æ±å˜…監視列表包å«$1éš»é é¢ã€‚',
@@ -1441,7 +1458,7 @@ Also see [[Special:WantedCategories|wanted categories]].',
'contributions' => '{{GENDER:$1|用戶}}è²¢ç»',
'contributions-title' => '$1嘅用戶貢ç»',
'mycontris' => 'è²¢ç»',
-'contribsub2' => '$1 ($2) ke kung-hien',
+'contribsub2' => '$1嘅貢ç»ï¼ˆ$2)',
'nocontribs' => '毋尋到符åˆç‰¹å¾µå˜…更改。',
'uctop' => '(最新修改)',
'month' => '從邇月(或還較早):',
@@ -1543,7 +1560,6 @@ Also see [[Special:WantedCategories|wanted categories]].',
'ip_range_invalid' => '無效嘅IP範åœã€‚',
'proxyblocker' => '代ç†å°éŽ–器',
'proxyblockreason' => 'æ±å˜…IP地å€ä¿‚一隻開放嘅代ç†ï¼Œå…¶å·²ç¶“分å°éŽ–。請è¯ç¹«æ±å˜…網際網路æœå‹™æ供商或技術支æ´è€…並講佢兜è½é‚‡éš»åš´é‡å˜…安全å•é¡Œã€‚',
-'proxyblocksuccess' => '完æˆã€‚',
'sorbsreason' => 'Ngì-ke IP chhô-vi pûn DNSBL lieÌt-vi suÌk-yî khôi-fong thoi-lî fuÌk-vu-khí.',
'sorbs_create_account_reason' => 'Ngì-ke IP chhô-vi pûn DNSBL lieÌt-vi suÌk-yî khôi-fong thoi-lî fuÌk-vu-khí. Só-yî ngì mò-fap kien-liÌp chong-ho.',
diff --git a/languages/messages/MessagesHaw.php b/languages/messages/MessagesHaw.php
index d3f835d5..b0084fa3 100644
--- a/languages/messages/MessagesHaw.php
+++ b/languages/messages/MessagesHaw.php
@@ -253,7 +253,7 @@ $messages = array(
'jumptonavigation' => 'ka ho‘okele ‘ana',
'jumptosearch' => 'huli',
-# 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).
+# 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).
'aboutsite' => 'E pili ana iÄ {{SITENAME}}',
'aboutpage' => 'Project:E pili ana',
'copyrightpage' => '{{ns:project}}:Palapala ho‘okuleana',
@@ -262,7 +262,6 @@ $messages = array(
'disclaimers' => 'Palapala hoʻokuʻu kuleana',
'disclaimerpage' => 'Project:Palapala hoʻokuʻu kuleana',
'edithelp' => 'KÅkua me ka ho‘ololi ‘ana',
-'edithelppage' => 'Help:Ho‘ololi',
'helppage' => 'Help:Papa kuhikuhi',
'mainpage' => "Kahua pa'a",
'mainpage-description' => 'Ka papa kinohi',
@@ -363,7 +362,7 @@ E ʻoluʻolu, e kūlia hou.',
# Change password dialog
'newpassword' => 'ʻŌlelo hÅ«nÄ hou:',
-'resetpass_success' => 'Ua loli ‘ia kÄu hua‘Ålelo huna! E ‘e‘e iÄ‘oe...',
+'changepassword-success' => 'Ua loli ‘ia kÄu hua‘Ålelo huna! E ‘e‘e iÄ‘oe...',
# Edit page toolbar
'bold_sample' => 'Ho‘okÄ‘ele',
@@ -464,7 +463,6 @@ E Ê»oluÊ»olu, e hÅÊ»oia i ka hoÊ»okÅ«kÅ« Ê»ana i lalo, a laila, e mÄlama i nÄ
'prevn' => '{{PLURAL:$1|$1}} ma mua',
'nextn' => '{{PLURAL:$1|$1}} ma hope',
'viewprevnext' => 'NÄnÄ i nÄ ($1 {{int:pipe-separator}} $2) ($3)',
-'searchhelp-url' => 'Help:Papa kuhikuhi',
'search-result-size' => '$1 ({{PLURAL:$2|1 huaÊ»Ålelo|$2 huaÊ»Ålelo}})',
'search-section' => '(mÄhele $1)',
'search-suggest' => 'ʻO kēia paha kou manaʻo: $1',
@@ -584,8 +582,6 @@ E Ê»oluÊ»olu, e hÅÊ»oia i ka hoÊ»okÅ«kÅ« Ê»ana i lalo, a laila, e mÄlama i nÄ
# Statistics
'statistics' => 'Papa helu',
-'disambiguationspage' => 'Template:HuaÊ»Ålelo puana like',
-
'brokenredirects-edit' => 'e ho‘ololi',
'brokenredirects-delete' => 'e kÄpae',
@@ -740,7 +736,6 @@ E Ê»ike iÄ $2 no ka papa o nÄ kÄpae Ê»ana hou.',
'unblocklink' => 'mai pale',
'change-blocklink' => 'hoʻololi ka palena',
'contribslink' => 'nÄ ha‘awina',
-'blockme' => 'E ke‘a ia‘u',
# Move page
'move-page-legend' => 'Hoʻoneʻe i ka ʻaoʻao',
diff --git a/languages/messages/MessagesHe.php b/languages/messages/MessagesHe.php
index 381f9d7e..4400c4d4 100644
--- a/languages/messages/MessagesHe.php
+++ b/languages/messages/MessagesHe.php
@@ -9,6 +9,7 @@
*
* @author Agbad
* @author Amire80
+ * @author Dekel E
* @author Drorsnir
* @author Guycn1
* @author Hoo
@@ -23,6 +24,7 @@
* @author YaronSh
* @author ×ור שפיר×
* @author ערן
+ * @author פדיחה
* @author שומבלע
* @author תומר ט
*/
@@ -107,6 +109,7 @@ $specialPageAliases = array(
'MIMEsearch' => array( 'חיפוש_MIME' ),
'Mostcategories' => array( 'הקטגוריות_הרבות_ביותר', 'הדפי×_מרובי-הקטגוריות_ביותר' ),
'Mostimages' => array( 'הקבצי×_המקושרי×_ביותר', 'התמונות_המקושרות_ביותר' ),
+ 'Mostinterwikis' => array( 'קישורי_השפה_הרבי×_ביותר' ),
'Mostlinked' => array( 'הדפי×_המקושרי×_ביותר', 'המקושרי×_ביותר' ),
'Mostlinkedcategories' => array( 'הקטגוריות_המקושרות_ביותר' ),
'Mostlinkedtemplates' => array( 'התבניות_המקושרות_ביותר' ),
@@ -118,6 +121,7 @@ $specialPageAliases = array(
'Myuploads' => array( 'ההעל×ות_שלי' ),
'Newimages' => array( 'קבצי×_חדשי×', 'תמונות_חדשות', 'גלריית_קבצי×_חדשי×', 'גלריית_תמונות_חדשות' ),
'Newpages' => array( 'דפי×_חדשי×' ),
+ 'PagesWithProp' => array( 'דפי×_×¢×_מ×פייני×', 'דפי×_לפי_מ×פייני×' ),
'PasswordReset' => array( '×יפוס_סיסמה' ),
'PermanentLink' => array( 'קישור_קבוע' ),
'Popularpages' => array( 'הדפי×_הנצפי×_ביותר', 'דפי×_פופולריי×' ),
@@ -129,6 +133,7 @@ $specialPageAliases = array(
'Randomredirect' => array( 'הפניה_×קר×ית' ),
'Recentchanges' => array( 'שינויי×_×חרוני×' ),
'Recentchangeslinked' => array( 'שינויי×_בדפי×_המקושרי×' ),
+ 'Redirect' => array( 'הפניה' ),
'Revisiondelete' => array( 'מחיקת_ושחזור_גרס×ות' ),
'Search' => array( 'חיפוש' ),
'Shortpages' => array( 'דפי×_קצרי×' ),
@@ -201,6 +206,7 @@ $magicWords = array(
'pagenamee' => array( '1', '×©× ×”×“×£ מקודד', 'PAGENAMEE' ),
'namespace' => array( '1', 'מרחב הש×', 'NAMESPACE' ),
'namespacee' => array( '1', 'מרחב ×”×©× ×ž×§×•×“×“', 'NAMESPACEE' ),
+ 'namespacenumber' => array( '1', 'מספר_מרחב_הש×', 'NAMESPACENUMBER' ),
'talkspace' => array( '1', 'מרחב השיחה', 'TALKSPACE' ),
'talkspacee' => array( '1', 'מרחב השיחה מקודד', 'TALKSPACEE' ),
'subjectspace' => array( '1', 'מרחב הנוש×', 'מרחב הערכי×', 'SUBJECTSPACE', 'ARTICLESPACE' ),
@@ -313,6 +319,7 @@ $magicWords = array(
'url_query' => array( '0', 'ש×ילתה', 'QUERY' ),
'defaultsort_noerror' => array( '0', '×œ×œ× ×©×’×™××”', 'noerror' ),
'defaultsort_noreplace' => array( '0', '×œ×œ× ×”×—×œ×¤×”', 'noreplace' ),
+ 'pagesincategory_pages' => array( '0', 'דפי×', 'pages' ),
);
$datePreferences = array(
@@ -384,9 +391,6 @@ $messages = array(
'tog-shownumberswatching' => 'הצגת מספר ×”×ž×©×ª×ž×©×™× ×”×¢×•×§×‘×™×',
'tog-oldsig' => 'החתימה הנוכחית:',
'tog-fancysig' => 'פירוש החתימה כקוד ויקי (×œ×œ× ×§×™×©×•×¨ ×וטומטי)',
-'tog-externaleditor' => 'שימוש בעורך חיצוני כברירת מחדל (×œ×ž×©×ª×ž×©×™× ×ž×•×ž×—×™× ×‘×œ×‘×“, דורש הגדרות מיוחדות במחשב. [//www.mediawiki.org/wiki/Manual:External_editors למידע נוסף.])',
-'tog-externaldiff' => 'שימוש בתוכנת השוו×ת הגרס×ות החיצונית כברירת מחדל (×œ×ž×©×ª×ž×©×™× ×ž×•×ž×—×™× ×‘×œ×‘×“, דורש הגדרות מיוחדות במחשב. [//www.mediawiki.org/wiki/Manual:External_editors למידע נוסף.])',
-'tog-showjumplinks' => 'הצגת קישורי נגישות מסוג "{{int:jumpto}}"',
'tog-uselivepreview' => 'שימוש בתצוגה מקדימה מהירה (ניסיוני)',
'tog-forceeditsummary' => 'הצגת ×זהרה בעת הכנסת תקציר עריכה ריק',
'tog-watchlisthideown' => 'הסתרת העריכות שלי ברשימת המעקב',
@@ -400,6 +404,8 @@ $messages = array(
'tog-showhiddencats' => 'הצגת קטגוריות מוסתרות',
'tog-noconvertlink' => 'ביטול המרת ×§×™×©×•×¨×™× ×œ×›×•×ª×¨×•×ª',
'tog-norollbackdiff' => 'השמטת ×”×”×‘×“×œ×™× ×‘×™×Ÿ הגרס×ות ל×חר ביצוע שחזור',
+'tog-useeditwarning' => 'הצגת ×זהרה בעת עזיבת דף עריכה ×¢× ×©×™× ×•×™×™× ×©×˜×¨× × ×©×ž×¨×•',
+'tog-prefershttps' => 'תמיד להשתמש בתקשורת מ×ובטחת ל×חר הכניסה לחשבון',
'underline-always' => 'תמיד',
'underline-never' => '×œ×¢×•×œ× ×œ×',
@@ -463,6 +469,18 @@ $messages = array(
'oct' => "×וק'",
'nov' => "נוב'",
'dec' => "דצמ'",
+'january-date' => '$1 בינו×ר',
+'february-date' => '$1 בפברו×ר',
+'march-date' => '$1 במרץ',
+'april-date' => '$1 ב×פריל',
+'may-date' => '$1 במ××™',
+'june-date' => '$1 ביוני',
+'july-date' => '$1 ביולי',
+'august-date' => '$1 ב×וגוסט',
+'september-date' => '$1 בספטמבר',
+'october-date' => '$1 ב×וקטובר',
+'november-date' => '$1 בנובמבר',
+'december-date' => '$1 בדצמבר',
# Categories related messages
'pagecategories' => '{{PLURAL:$1|קטגוריה|קטגוריות}}',
@@ -544,6 +562,7 @@ $messages = array(
'create-this-page' => 'יצירת דף זה',
'delete' => 'מחיקה',
'deletethispage' => 'מחיקת דף זה',
+'undeletethispage' => 'שחזור דף זה',
'undelete_short' => 'שחזור {{PLURAL:$1|עריכה ×חת|$1 עריכות}}',
'viewdeleted_short' => 'צפייה ב{{PLURAL:$1|עריכה מחוקה ×חת|Ö¾$1 עריכות מחוקות}}',
'protect' => '×”×’× ×”',
@@ -587,7 +606,7 @@ $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).
+# 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).
'aboutsite' => '×ודות {{SITENAME}}',
'aboutpage' => 'Project:×ודות',
'copyright' => 'התוכן זמין לפי תנ××™ $1 ××œ× ×× × ×מר ×חרת.',
@@ -597,7 +616,6 @@ $1',
'disclaimers' => 'הבהרה משפטית',
'disclaimerpage' => 'Project:הבהרה משפטית',
'edithelp' => 'עזרה לעריכה',
-'edithelppage' => 'Help:עריכת דף',
'helppage' => 'Help:תפריט ר×שי',
'mainpage' => 'עמוד ר×שי',
'mainpage-description' => 'עמוד ר×שי',
@@ -676,17 +694,12 @@ $1',
# General errors
'error' => 'שגי××”',
'databaseerror' => 'שגי×ת בסיס נתוני×',
-'dberrortext' => '×ירעה שגי×ת תחביר בש×ילתה לבסיס הנתוני×.
-שגי××” זו עלולה להעיד על ב××’ בתוכנה.
-הש×ילתה ×”×חרונה לבסיס ×”× ×ª×•× ×™× ×©×”×ª×•×›× ×” ניסתה להריץ הייתה:
-<blockquote lang="en" dir="ltr"><code>$1</code></blockquote>
-מתוך הפונקציה "<code lang="en" dir="ltr">$2</code>".
-בסיס ×”× ×ª×•× ×™× ×”×—×–×™×¨ ×ת השגי××” הב××”: "<samp lang="en" dir="ltr">$3: $4</samp>".',
-'dberrortextcl' => '×ירעה שגי×ת תחביר בש×ילתה לבסיס הנתוני×.
-הש×ילתה ×”×חרונה שבוצעה לבסיס ×”× ×ª×•× ×™× ×”×™×™×ª×”:
-"$1"
-מתוך הפונקציה "$2".
-בסיס ×”× ×ª×•× ×™× ×”×—×–×™×¨ ×ת השגי××” "$3: $4".',
+'databaseerror-text' => '×ירעה שגי××” בש×ילתה לבסיס הנתוני×.
+שגי××” זו עלולה להעיד על ב××’ בתוכנה.',
+'databaseerror-textcl' => '×ירעה שגי××” בש×ילתה לבסיס הנתוני×.',
+'databaseerror-query' => 'ש×ילתה: $1',
+'databaseerror-function' => 'פונקציה: $1',
+'databaseerror-error' => 'שגי××”: $1',
'laggedslavemode' => "'''×זהרה:''' הדף עשוי ×©×œ× ×œ×”×›×™×œ ×¢×“×›×•× ×™× ×חרוני×.",
'readonly' => 'בסיס ×”× ×ª×•× ×™× × ×¢×•×œ',
'enterlockreason' => 'הזינו סיבה לנעילת בסיס הנתוני×, כולל הערכה לגבי מועד שחרור הנעילה.',
@@ -720,6 +733,7 @@ $1',
'cannotdelete-title' => '×œ× × ×™×ª×Ÿ למחוק ×ת הדף "$1"',
'delete-hook-aborted' => 'המחיקה הופסקה על־ידי מבנה Hook.
×œ× × ×™×ª×Ÿ הסבר.',
+'no-null-revision' => '×œ× × ×™×ª×Ÿ ×”×™×” ליצור גרסת־דמה בדף "$1"',
'badtitle' => 'כותרת שגויה',
'badtitletext' => 'כותרת הדף המבוקש הייתה בלתי־תקינה, ריקה, ×ו קישור שגוי לשפה ×חרת ×ו ×œ×ž×™×–× ×חר.
ייתכן ×©×”×™× ×ž×›×™×œ×” תו ×חד ×ו יותר ש×ינו יכול לשמש בכותרות.',
@@ -741,12 +755,15 @@ $1',
'editinginterface' => "'''×זהרה:''' הדף ש××ª× ×¢×•×¨×›×™× ×”×•× ×חד ×”×“×¤×™× ×”×ž×¡×¤×§×™× ×”×•×“×¢×•×ª מערכת לתוכנה.
×©×™× ×•×™×™× ×‘×“×£ ×–×” ישפיעו על תצוגת ממשק המשתמש של ×ž×©×ª×ž×©×™× ××—×¨×™× ×‘×תר ויקי ×–×”.
כדי להוסיף ×ו לשנות ×ª×¨×’×•×ž×™× ×‘×›×œ ×תרי הוויקי, ×× × ×”×©×ª×ž×©×• ב־[//translatewiki.net/ translatewiki.net], פרויקט ×”×ª×¨×’×•× ×©×œ מדיה־ויקי.",
-'sqlhidden' => '(ש×ילתת ×”Ö¾SQL מוסתרת)',
'cascadeprotected' => 'דף ×–×” מוגן מעריכה ×›×™ ×”×•× ×ž×•×›×œ×œ {{PLURAL:$1|בדף הב×, שמופעלת עליו|×‘×“×¤×™× ×”×‘××™×, שמופעלת עליה×}} ×”×’× ×” מדורגת:
$2',
'namespaceprotected' => "××™× ×›× ×ž×•×¨×©×™× ×œ×¢×¨×•×š ×“×¤×™× ×‘×ž×¨×—×‘ ×”×©× '''$1'''.",
'customcssprotected' => '××™× ×›× ×ž×•×¨×©×™× ×œ×¢×¨×•×š דף CSS ×–×”, כיוון ×©×”×•× ×›×•×œ×œ ×ת ההגדרות ×”×ישיות של משתמש ×חר.',
'customjsprotected' => '××™× ×›× ×ž×•×¨×©×™× ×œ×¢×¨×•×š דף JavaScript ×–×”, כיוון ×©×”×•× ×›×•×œ×œ ×ת ההגדרות ×”×ישיות של משתמש ×חר.',
+'mycustomcssprotected' => '××™× ×›× ×ž×•×¨×©×™× ×œ×¢×¨×•×š דף CSS ×–×”.',
+'mycustomjsprotected' => '××™× ×›× ×ž×•×¨×©×™× ×œ×¢×¨×•×š דף JavaScript ×–×”.',
+'myprivateinfoprotected' => '×ין לך הרש××” לערוך ×ת המידע הפרטי שלך',
+'mypreferencesprotected' => '×ין לך הרש××” לערוך ×ת ההעדפות שלך.',
'ns-specialprotected' => '×œ× × ×™×ª×Ÿ לערוך ×“×¤×™× ×ž×™×•×—×“×™×.',
'titleprotected' => '×œ× × ×™×ª×Ÿ ליצור דף ×–×”, כיוון שהמשתמש [[User:$1|$1]] הגן עליו מפני יצירה.
הסיבה שניתנה לכך ×”×™× "$2".',
@@ -771,10 +788,19 @@ $2',
'welcomecreation-msg' => 'חשבונך נוצר.
× × ×œ× ×œ×©×›×•×— להת××™× ×ת [[Special:Preferences|העדפות המשתמש]] שלך ב{{grammar:תחילית|{{SITENAME}}}}.',
'yourname' => '×©× ×ž×©×ª×ž×©:',
+'userlogin-yourname' => '×©× ×ž×©×ª×ž×©',
+'userlogin-yourname-ph' => 'יש להקליד ×ת ×©× ×”×ž×©×ª×ž×©',
+'createacct-another-username-ph' => 'יש להקליד ×ת ×©× ×”×ž×©×ª×ž×©',
'yourpassword' => 'סיסמה:',
+'userlogin-yourpassword' => 'סיסמה',
+'userlogin-yourpassword-ph' => 'יש להקליד ×ת הסיסמה',
+'createacct-yourpassword-ph' => 'יש להקליד סיסמה',
'yourpasswordagain' => 'חזרה על הסיסמה:',
+'createacct-yourpasswordagain' => '×ימות הסיסמה',
+'createacct-yourpasswordagain-ph' => 'יש להקליד ×ת הסיסמה שנית',
'remembermypassword' => 'שמירת הכניסה שלי בדפדפן ×”×–×” (ל{{PLURAL:$1|×™×•× ×חד|יומיי×|Ö¾$1 ימי×}} לכל היותר)',
-'securelogin-stick-https' => 'המשך שימוש ב־HTTPS ×חרי הכניסה',
+'userlogin-remembermypassword' => 'לזכור שנכנסתי',
+'userlogin-signwithsecure' => 'שימוש בחיבור מ×ובטח',
'yourdomainname' => '×”×ž×ª×—× ×©×œ×š:',
'password-change-forbidden' => '××™× ×›× ×™×›×•×œ×™× ×œ×©× ×•×ª סיסמ×ות ב×תר ×–×”.',
'externaldberror' => 'הייתה שגי××” בבסיס ×”× ×ª×•× ×™× ×©×œ ההזדהות, ×ו ש××™× ×›× ×¨×©××™× ×œ×¢×“×›×Ÿ ×ת ×—×©×‘×•× ×›× ×”×—×™×¦×•× ×™.',
@@ -786,18 +812,44 @@ $2',
'logout' => 'יצי××” מהחשבון',
'userlogout' => 'יצי××” מהחשבון',
'notloggedin' => '×œ× ×‘×—×©×‘×•×Ÿ',
+'userlogin-noaccount' => '×ין לך חשבון?',
+'userlogin-joinproject' => 'הצטרפות ל{{grammar:תחילית|{{SITENAME}}}}',
'nologin' => '×ין ×œ×›× ×—×©×‘×•×Ÿ? $1.',
'nologinlink' => 'הרשמה',
'createaccount' => 'יצירת חשבון חדש',
'gotaccount' => 'כבר נרשמת×? $1.',
'gotaccountlink' => 'כניסה לחשבון',
'userlogin-resetlink' => 'שכחת ×ת פרטי הכניסה?',
+'userlogin-resetpassword-link' => '×יפוס הסיסמה',
+'helplogin-url' => 'Help:כניסה לחשבון',
+'userlogin-helplink' => '[[{{MediaWiki:helplogin-url}}|עזרה בכניסה לחשבון]]',
+'userlogin-loggedin' => '××ª× ×›×‘×¨ ×ž×—×•×‘×¨×™× ×œ×—×©×‘×•×Ÿ {{GENDER:$1|$1}}.
+השתמשו בטופס שלהלן כדי להתחבר לחשבון ×חר.',
+'userlogin-createanother' => 'יצירת חשבון ×חר',
+'createacct-join' => 'יש להקליד להלן ×ת ×”×¤×¨×˜×™× ×©×œ×š.',
+'createacct-another-join' => 'יש להקליד להלן ×ת פרטי החשבון החדש.',
+'createacct-emailrequired' => 'כתובת דו×"ל',
+'createacct-emailoptional' => 'כתובת דו×"ל (×œ× ×—×•×‘×”)',
+'createacct-email-ph' => 'יש להקליד ×ת כתובת הדו×"ל שלך',
+'createacct-another-email-ph' => 'יש להקליד כתובת דו×"ל',
'createaccountmail' => 'שימוש בסיסמה זמנית ×קר×ית ושליחתה לכתובת הדו×"ל שצוינה',
+'createacct-realname' => '×©× ×מיתי (×œ× ×—×•×‘×”)',
'createaccountreason' => 'סיבה:',
+'createacct-reason' => 'סיבה',
+'createacct-reason-ph' => 'סיבה ליצירת חשבון נוסף',
+'createacct-captcha' => 'בדיקת ×בטחה',
+'createacct-imgcaptcha-ph' => 'יש להקליד ×ת הטקסט המופיע למעלה',
+'createacct-submit' => 'יצירת החשבון שלך',
+'createacct-another-submit' => 'יצירת חשבון ×חר',
+'createacct-benefit-heading' => '×× ×©×™× ×›×ž×•×š ×™×•×¦×¨×™× ×ת {{SITENAME}}.',
+'createacct-benefit-body1' => '{{PLURAL:$1|עריכה|עריכות}}',
+'createacct-benefit-body2' => '{{PLURAL:$1|דף|דפי×}}',
+'createacct-benefit-body3' => '{{PLURAL:$1|תור×|תורמי×}} ל×חרונה',
'badretype' => 'הסיסמ×ות ×©×”×–× ×ª× ×ינן מת×ימות.',
'userexists' => '×©× ×”×ž×©×ª×ž×© ×©×‘×—×¨×ª× ×›×‘×¨ × ×ž×¦× ×‘×©×™×ž×•×©.
×× × ×‘×—×¨×• ×©× ×חר.',
'loginerror' => 'שגי××” בכניסה ל×תר',
+'createacct-error' => 'שגי××” ביצירת חשבון',
'createaccounterror' => '×œ× × ×™×ª×Ÿ ×”×™×” ליצור ×ת החשבון: $1',
'nocookiesnew' => 'חשבון המשתמש ×©×œ×›× × ×•×¦×¨, ×ך ×œ× × ×›× ×¡×ª× ×›×ž×©×ª×ž×©×™× ×¨×©×•×ž×™×.
כדי להכניס ×ž×©×ª×ž×©×™× ×œ×ž×¢×¨×›×ª עושה {{SITENAME}} שימוש בעוגיות.
@@ -862,10 +914,12 @@ $2',
ב××¤×©×¨×•×ª×›× ×œ×”×ª×¢×œ× ×ž×”×•×“×¢×” זו, ×× ×”×—×©×‘×•×Ÿ נוצר בטעות.',
'usernamehasherror' => '×©× ×ž×©×ª×ž×© ×ינו יכול לכלול תווי סולמית',
'login-throttled' => '×‘×™×¦×¢×ª× ×œ×חרונה ניסיונות ×¨×‘×™× ×ž×“×™ להיכנס לחשבון ×–×”.
-×× × ×”×ž×ª×™× ×• לפני שתנסו שוב.',
+×× × ×”×ž×ª×™× ×• $1 לפני שתנסו שוב.',
'login-abort-generic' => 'הכניסה לחשבון ×œ× ×”×¦×œ×™×—×” - ×”×™× ×”×•×¤×¡×§×”',
'loginlanguagelabel' => 'שפה: $1',
'suspicious-userlogout' => '×‘×§×©×ª×›× ×œ×¦×ת מהחשבון נדחתה כיוון שנר××” ×©×”×™× × ×©×œ×—×” על ידי דפדפן שבור ×ו שרת פרוקסי ×¢× ×–×™×›×¨×•×Ÿ מטמון.',
+'createacct-another-realname-tip' => '×”×©× ×”×מיתי ×”×•× ×ופציונ×לי.
+×× ×ª×‘×—×¨×• לספקו, ×”×•× ×™×©×ž×© לייחוס עבודת המשתמש ×ליו.',
# Email sending
'php-mail-error-unknown' => 'שגי××” ×œ× ×™×“×•×¢×” בפונקציה mail()‎ של PHP',
@@ -882,7 +936,7 @@ $2',
'newpassword' => 'סיסמה חדשה:',
'retypenew' => 'חזרה על הסיסמה החדשה:',
'resetpass_submit' => 'הגדרת הסיסמה וכניסה לחשבון',
-'resetpass_success' => 'הססמה שלך הוחלפה בהצלחה! כעת תתבצע כניסה למערכת…',
+'changepassword-success' => '×¡×™×¡×ž×ª×›× ×©×•× ×ª×” בהצלחה!',
'resetpass_forbidden' => '×œ× × ×™×ª×Ÿ לשנות סיסמ×ות.',
'resetpass-no-info' => '×¢×œ×™×›× ×œ×”×™×›× ×¡ לחשבון כדי לגשת לדף ×–×” ב×ופן ישיר.',
'resetpass-submit-loggedin' => 'שינוי סיסמה',
@@ -894,10 +948,11 @@ $2',
# Special:PasswordReset
'passwordreset' => '×יפוס סיסמה',
-'passwordreset-text' => 'מל×ו טופס ×–×” כדי ל×פס ×ת הסיסמה.',
+'passwordreset-text-one' => 'מל×ו טופס ×–×” כדי ל×פס ×ת הסיסמה.',
+'passwordreset-text-many' => '{{PLURAL:$1||מל×ו ×חד מהשדות הב××™× ×›×“×™ ל×פס ×ת הסיסמה.}}',
'passwordreset-legend' => '×יפוס סיסמה',
'passwordreset-disabled' => '×יפוסי סיסמה בוטלו ב×תר ויקי ×–×”.',
-'passwordreset-pretext' => '{{PLURAL:$1||הקלידו ×חד מפריטי המידע למטה}}',
+'passwordreset-emaildisabled' => 'שירותי הדו×"ל בוטלו ב×תר ויקי ×–×”.',
'passwordreset-username' => '×©× ×ž×©×ª×ž×©:',
'passwordreset-domain' => 'תחו×:',
'passwordreset-capture' => 'לצפות בדו×"ל הנשלח?',
@@ -927,7 +982,7 @@ $2
סיסמה זמנית: $2',
'passwordreset-emailsent' => 'נשלח דו×ר ×לקטרוני ל×יפוס הסיסמה.',
'passwordreset-emailsent-capture' => 'נשלח דו×ר ×לקטרוני ל×יפוס הסיסמה, ×•×”×•× ×ž×•×¦×’ להלן.',
-'passwordreset-emailerror-capture' => 'נוצר דו×ר ×לקטרוני ל×יפוס הסיסמה, ×•×”×•× ×ž×•×¦×’ להלן, ×ך שליחתו למשתמש נכשלה: $1',
+'passwordreset-emailerror-capture' => 'נוצר דו×ר ×לקטרוני ל×יפוס הסיסמה, ×•×”×•× ×ž×•×¦×’ להלן, ×ך שליחתו ל{{GENDER:$2|משתמש|משתמשת}} נכשלה: $1',
# Special:ChangeEmail
'changeemail' => 'שינוי כתובת דו×"ל',
@@ -941,6 +996,19 @@ $2
'changeemail-submit' => 'שינוי כתובת הדו×"ל',
'changeemail-cancel' => 'ביטול',
+# Special:ResetTokens
+'resettokens' => '×יפוס ×סימוני×',
+'resettokens-text' => 'בעמוד ×–×” ניתן ל×פס ××¡×™×ž×•× ×™× ×©×ž××¤×©×¨×™× ×’×™×©×” ×œ× ×ª×•× ×™× ×¤×¨×˜×™×™× ×©×œ החשבון שלך.
+
+רצוי לעשות ×–×ת ×× ×©×™×ª×¤×ª ××•×ª× ×‘×˜×¢×•×ª ×¢× ××—×¨×™× ×ו ×× ×—×©×‘×•× ×š נפרץ.',
+'resettokens-no-tokens' => '×ין ××¡×™×ž×•× ×™× ×œ×יפוס.',
+'resettokens-legend' => '×יפוס ×סימוני×',
+'resettokens-tokens' => '×סימוני×:',
+'resettokens-token-label' => '$1 (ערך נוכחי: $2)',
+'resettokens-watchlist-token' => '×סימון להזנת הרשת (Atom/RSS) של [[Special:Watchlist|×©×™× ×•×™×™× ×©×œ ×“×¤×™× ×‘×¨×©×™×ž×ª המעקב]]',
+'resettokens-done' => '×”××¡×™×ž×•× ×™× ×ופסו.',
+'resettokens-resetbutton' => '×יפוס ×”××¡×™×ž×•× ×™× ×©× ×‘×—×¨×•',
+
# Edit page toolbar
'bold_sample' => 'טקסט מודגש',
'bold_tip' => 'טקסט מודגש',
@@ -1133,12 +1201,15 @@ $2
נר××” ×©×”×•× × ×ž×—×§.',
'edit-conflict' => 'התנגשות עריכה.',
'edit-no-change' => 'המערכת התעלמה מעריכתכ×, כיוון ×©×œ× × ×¢×©×” שינוי בטקסט.',
+'postedit-confirmation' => 'עריכתך נשמרה.',
'edit-already-exists' => '×œ× × ×™×ª×Ÿ ליצור דף חדש.
×”×•× ×›×‘×¨ קיי×.',
'defaultmessagetext' => 'טקסט ההודעה המקורי',
'content-failed-to-parse' => 'פענוח $2 כתוכן מסוג $1 נכשל: $3',
'invalid-content-data' => 'מידע שגוי על התוכן',
'content-not-allowed-here' => 'תוכן מסוג "$1" ×ינו מותר בדף [[$2]]',
+'editwarning-warning' => 'עזיבת דף ×–×” עשויה ×œ×’×¨×•× ×œ×ובדן כל ×”×©×™× ×•×™×™× ×©×‘×™×¦×¢×ª×.
+×× ××ª× ×ž×—×•×‘×¨×™× ×œ×—×©×‘×•×Ÿ, תוכלו לבטל ×זהרה זו בחלק "עריכה" שבהעדפות שלכ×.',
# Content models
'content-model-wikitext' => 'טקסט ויקי',
@@ -1173,6 +1244,7 @@ $2
'undo-failure' => '×œ× × ×™×ª×Ÿ ×”×™×” לבטל ×ת העריכה עקב התנגשות ×¢× ×¢×¨×™×›×•×ª מ×וחרות יותר.',
'undo-norev' => '×œ× × ×™×ª×Ÿ ×”×™×” לבטל ×ת העריכה ×›×™ ×”×™× ××™× ×” קיימת ×ו ×›×™ ×”×™× × ×ž×—×§×”.',
'undo-summary' => 'ביטול גרסה $1 של [[Special:Contributions/$2|$2]] ([[User talk:$2|שיחה]])',
+'undo-summary-username-hidden' => 'ביטול גרסה $1 של משתמש מוסתר',
# Account creation failure
'cantcreateaccounttitle' => '×œ× × ×™×ª×Ÿ ליצור ×ת החשבון',
@@ -1352,6 +1424,7 @@ $1",
'compareselectedversions' => 'השוו×ת הגרס×ות שנבחרו',
'showhideselectedversions' => 'הצגת/הסתרת הגרס×ות שנבחרו',
'editundo' => 'ביטול',
+'diff-empty' => '(×ין הבדלי×)',
'diff-multi' => '({{PLURAL:$1|גרסת ×‘×™× ×™×™× ×חת|$1 גרס×ות ביניי×}} של {{PLURAL:$2|משתמש ×חד|$2 משתמשי×}} {{PLURAL:$1|××™× ×” מוצגת|×ינן מוצגות}})',
'diff-multi-manyusers' => '({{PLURAL:$1|גרסת ×‘×™× ×™×™× ×חת|$1 גרס×ות ביניי×}} של יותר {{PLURAL:$2|ממשתמש ×חד|מ־$2 משתמשי×}} {{PLURAL:$1|××™× ×” מוצגת|×ינן מוצגות}})',
'difference-missing-revision' => '{{PLURAL:$2|גרסה ×חת|$2 גרס×ות}} של ההבדל ×”×–×” בין שתי גרס×ות ($1) {{PLURAL:$2|×œ× × ×ž×¦××”|×œ× × ×ž×¦×ו}}.
@@ -1379,7 +1452,6 @@ $1",
'searchmenu-legend' => '×פשרויות חיפוש',
'searchmenu-exists' => "'''×§×™×™× ×“×£ ×‘×©× \"[[:\$1]]\" ב×תר ×–×”.'''",
'searchmenu-new' => "'''יצירת הדף \"[[:\$1]]\" ב×תר ×–×”.'''",
-'searchhelp-url' => 'Help:תפריט ר×שי',
'searchmenu-prefix' => '[[Special:PrefixIndex/$1|מצי×ת ×“×¤×™× ×¢× ×§×™×“×•×ž×ª זו]]',
'searchprofile-articles' => 'דפי תוכן',
'searchprofile-project' => 'עזרה ודפי המיז×',
@@ -1422,15 +1494,7 @@ $1",
'searchdisabled' => 'חיפוש ב{{grammar:תחילית|{{SITENAME}}}} ×ינו מופעל כעת.
×‘×™× ×ª×™×™× ×פשר לחפש ב×מצעות גוגל.
שימו לב שייתכן שהמידע של {{SITENAME}} ×©× ×ינו מעודכן.',
-
-# Quickbar
-'qbsettings' => 'הגדרות סרגל כלי×',
-'qbsettings-none' => 'לל×',
-'qbsettings-fixedleft' => 'קבוע משמ×ל',
-'qbsettings-fixedright' => 'קבוע מימין',
-'qbsettings-floatingleft' => 'צף משמ×ל',
-'qbsettings-floatingright' => 'צף מימין',
-'qbsettings-directionality' => 'קבוע, תלוי בכיוון הכתב של השפה שלך',
+'search-error' => '×ירעה שגי××” במהלך החיפוש: $1',
# Preferences page
'preferences' => 'העדפות',
@@ -1464,7 +1528,6 @@ $1",
'resetprefs' => 'מחיקת ×©×™× ×•×™×™× ×©×œ× × ×©×ž×¨×•',
'restoreprefs' => 'שחזור ההגדרות ההתחלתיות (בכל הלשוניות)',
'prefs-editing' => 'עריכה',
-'prefs-edit-boxsize' => 'גודל חלון העריכה.',
'rows' => 'שורות:',
'columns' => 'עמודות:',
'searchresultshead' => 'חיפוש',
@@ -1475,9 +1538,9 @@ $1",
'recentchangesdays-max' => 'לכל היותר {{PLURAL:$1|×™×•× ×חד|יומיי×|$1 ימי×}}',
'recentchangescount' => 'מספר העריכות שיוצגו כברירת מחדל:',
'prefs-help-recentchangescount' => 'כולל ×©×™× ×•×™×™× ×חרוני×, היסטוריית הדף ויומני×.',
-'prefs-help-watchlist-token' => 'מילוי השדה ×”×–×” במפתח סודי ייצור הזנת RSS עבור רשימת המעקב שלכ×.
-כל מי שיודע ×ת המפתח שבשדה ×–×” יוכל ×œ×§×¨×•× ×ת רשימת המעקב שלכ×, לכן ×¢×œ×™×›× ×œ×‘×—×•×¨ ערך בטוח.
-תוכלו להשתמש בערך הב×, שנוצר ב×ופן ×קר××™: $1',
+'prefs-help-watchlist-token2' => 'זהו המפתח הסודי של ההזנה של רשימת המעקב שלך.
+כל מי שיודע ×ותו יוכל ×œ×§×¨×•× ×ת רשימת המעקב שלך, לכן ×ין לשתף ×ותו.
+[[Special:ResetTokens|×× ×™×© בכך צורך, ×פשר ל×פס ×ותו ×›×ן]].',
'savedprefs' => 'העדפותיך נשמרו.',
'timezonelegend' => '×זור זמן:',
'localtime' => 'זמן מקומי:',
@@ -1508,7 +1571,6 @@ $1",
'prefs-reset-intro' => 'ב××¤×©×¨×•×ª×›× ×œ×”×©×ª×ž×© בדף ×–×” כדי להחזיר ×ת ההעדפות ×©×œ×›× ×œ×”×’×“×¨×•×ª ברירת המחדל של ×”×תר.
×œ× × ×™×ª×Ÿ לבטל פעולה זו.',
'prefs-emailconfirm-label' => '×ימות כתובת דו×"ל:',
-'prefs-textboxsize' => 'גודל חלון העריכה',
'youremail' => 'דו×ר ×לקטרוני:',
'username' => '×©× {{GENDER:$1|המשתמש|המשתמשת}}:',
'uid' => 'המספר הסידורי של {{GENDER:$1|המשתמש|המשתמשת}}:',
@@ -1544,6 +1606,8 @@ $1",
'prefs-dateformat' => 'מבנה ת×ריך',
'prefs-timeoffset' => 'הפרש זמני×',
'prefs-advancedediting' => '×פשרויות כלליות',
+'prefs-editor' => 'חלון העריכה',
+'prefs-preview' => 'תצוגה מקדימה',
'prefs-advancedrc' => '×פשרויות מתקדמות',
'prefs-advancedrendering' => '×פשרויות מתקדמות',
'prefs-advancedsearchoptions' => '×פשרויות מתקדמות',
@@ -1551,7 +1615,9 @@ $1",
'prefs-displayrc' => '×פשרויות תצוגה',
'prefs-displaysearchoptions' => '×פשרויות תצוגה',
'prefs-displaywatchlist' => '×פשרויות תצוגה',
+'prefs-tokenwatchlist' => '×סימון',
'prefs-diffs' => '×”×‘×“×œ×™× ×‘×™×Ÿ גרס×ות',
+'prefs-help-prefershttps' => 'העדפה זו תיכנס לתוקף בכניסה הב××” לחשבון.',
# User preference: email validation using jQuery
'email-address-validity-valid' => 'כתובת הדו×ר ×”×לקטרוני נר×ית תקינה',
@@ -1578,6 +1644,8 @@ $1",
'userrights-notallowed' => '×ין ×œ×›× ×”×¨×©××” להוסיף ×ו להסיר הרש×ות של משתמשי×.',
'userrights-changeable-col' => 'קבוצות שב××¤×©×¨×•×ª×›× ×œ×©× ×•×ª',
'userrights-unchangeable-col' => 'קבוצות ש×ין ב××¤×©×¨×•×ª×›× ×œ×©× ×•×ª',
+'userrights-conflict' => 'התנגשות בין שינויי הרש×ות משתמש! ×× × ×‘×“×§×• ×ת ×”×©×™× ×•×™×™× ×©×œ×›× ×•×שרו ×ות×.',
+'userrights-removed-self' => 'הסרת בהצלחה ×ת הרש×ות המשתמש שלך. לכן ×ין לך כעת ×פשרות לגשת לדף ×–×”.',
# Groups
'group' => 'קבוצה:',
@@ -1643,11 +1711,19 @@ $1",
'right-proxyunbannable' => 'עקיפת חסימות ×וטומטיות של שרתי פרוקסי',
'right-unblockself' => 'שחרור חסימה של עצמך',
'right-protect' => 'שינוי רמות ×”×’× ×” ועריכת ×“×¤×™× ×”×ž×•×’× ×™× ×‘×”×’× ×” מדורגת',
-'right-editprotected' => 'עריכת ×“×¤×™× ×ž×•×’× ×™× (×œ×œ× ×”×’× ×” מדורגת)',
+'right-editprotected' => 'עריכת ×“×¤×™× ×©×ž×•×’× ×™× ×‘×¨×ž×ª "{{int:protect-level-sysop}}"',
+'right-editsemiprotected' => 'עריכת ×“×¤×™× ×©×ž×•×’× ×™× ×‘×¨×ž×ª "{{int:protect-level-autoconfirmed}}"',
'right-editinterface' => 'עריכת ממשק המשתמש',
'right-editusercssjs' => 'עריכת דפי CSS ו־JavaScript של ×ž×©×ª×ž×©×™× ×חרי×',
'right-editusercss' => 'עריכת דפי CSS של ×ž×©×ª×ž×©×™× ×חרי×',
'right-edituserjs' => 'עריכת דפי JavaScript של ×ž×©×ª×ž×©×™× ×חרי×',
+'right-editmyusercss' => 'עריכת דפי CSS של עצמך',
+'right-editmyuserjs' => 'עריכת דפי JavaScript של עצמך',
+'right-viewmywatchlist' => 'צפייה ברשימת המעקב של עצמך',
+'right-editmywatchlist' => 'עריכת רשימת המעקב של עצמך. יצוין שמספר פעולות עדיין יוסיפו ×“×¤×™× ×’× ×œ×œ× ×”×¨×©××” זו.',
+'right-viewmyprivateinfo' => 'צפייה במידע הפרטי של עצמך (כגון: כתובת דו×"ל, ×©× ×מיתי)',
+'right-editmyprivateinfo' => 'עריכת המידע הפרטי של עצמך (כגון: כתובת דו×"ל, ×©× ×מיתי)',
+'right-editmyoptions' => 'עריכת ההעדפות של עצמך',
'right-rollback' => 'שחזור מהיר של עריכות המשתמש ×”×חרון שערך דף מסוי×',
'right-markbotedits' => 'סימון עריכות משוחזרות כעריכות של בוט',
'right-noratelimit' => 'עקיפת הגבלת קצב העריכות',
@@ -1709,12 +1785,19 @@ $1",
'action-userrights-interwiki' => 'לערוך ×ת ההרש×ות של ×ž×©×ª×ž×©×™× ×‘×תרי ויקי ×חרי×',
'action-siteadmin' => 'לנעול ×ו לבטל ×ת נעילת בסיס הנתוני×',
'action-sendemail' => 'לשלוח דו×ר ×לקטרוני',
+'action-editmywatchlist' => 'לערוך ×ת רשימת המעקב שלך',
+'action-viewmywatchlist' => 'לצפות ברשימת המעקב שלך',
+'action-viewmyprivateinfo' => 'לצפות במידע הפרטי שלכ×',
+'action-editmyprivateinfo' => 'לערוך ×ת המידע הפרטי שלכ×',
# Recent changes
'nchanges' => '{{PLURAL:$1|שינוי ×חד|$1 שינויי×}}',
+'enhancedrc-since-last-visit' => '$1 {{PLURAL:$1|מ××– ביקורך ×”×חרון}}',
+'enhancedrc-history' => 'היסטוריה',
'recentchanges' => '×©×™× ×•×™×™× ×חרוני×',
'recentchanges-legend' => '×פשרויות ×‘×©×™× ×•×™×™× ×”×חרוני×',
'recentchanges-summary' => 'ניתן לעקוב ×חרי ×”×©×™× ×•×™×™× ×”××—×¨×•× ×™× ×‘×תר בדף ×–×”.',
+'recentchanges-noresult' => '×œ× ×”×™×• בתקופה זו ×©×™× ×•×™×™× ×”×ž×ª××™×ž×™× ×œ×פשרויות שנבחרו.',
'recentchanges-feed-description' => 'ניתן לעקוב ×חרי ×”×©×™× ×•×™×™× ×”××—×¨×•× ×™× ×‘×תר בדף ×–×”.',
'recentchanges-label-newpage' => 'בעריכה זו נוצר דף חדש',
'recentchanges-label-minor' => 'זוהי עריכה משנית',
@@ -1751,7 +1834,6 @@ $1",
'recentchangeslinked-feed' => '×©×™× ×•×™×™× ×‘×“×¤×™× ×”×ž×§×•×©×¨×™×',
'recentchangeslinked-toolbox' => '×©×™× ×•×™×™× ×‘×“×¤×™× ×”×ž×§×•×©×¨×™×',
'recentchangeslinked-title' => '×©×™× ×•×™×™× ×‘×“×¤×™× ×”×ž×§×•×©×¨×™× ×ž×”×“×£ $1',
-'recentchangeslinked-noresult' => '×œ× ×”×™×• ×©×™× ×•×™×™× ×‘×“×¤×™× ×”×ž×§×•×©×¨×™× ×‘×ª×§×•×¤×” זו.',
'recentchangeslinked-summary' => "בדף מיוחד ×–×” ×¨×©×•×ž×™× ×”×©×™× ×•×™×™× ×”××—×¨×•× ×™× ×‘×“×¤×™× ×”×ž×§×•×©×¨×™× ×ž×ª×•×š הדף (×ו ×‘×“×¤×™× ×”×›×œ×•×œ×™× ×‘×§×˜×’×•×¨×™×”).
×“×¤×™× ×‘[[Special:Watchlist|רשימת המעקב שלכ×]] ×ž×•×¦×’×™× ×‘'''הדגשה'''.",
'recentchangeslinked-page' => '×©× ×”×“×£:',
@@ -1763,7 +1845,7 @@ $1",
'reuploaddesc' => 'ביטול ההעל××” וחזרה לטופס העל×ת ×§×‘×¦×™× ×œ×©×¨×ª',
'upload-tryagain' => 'שליחת התי×ור החדש של הקובץ',
'uploadnologin' => '×œ× × ×›× ×¡×ª× ×œ×—×©×‘×•×Ÿ',
-'uploadnologintext' => '×¢×œ×™×›× [[Special:UserLogin|להיכנס לחשבון]] כדי להעלות קבצי×.',
+'uploadnologintext' => '×¢×œ×™×›× $1 כדי להעלות קבצי×.',
'upload_directory_missing' => 'שרת ×”×ינטרנט ×ינו יכול ליצור ×ת תיקיית ההעל×ות ($1) החסרה.',
'upload_directory_read_only' => 'שרת ×”×ינטרנט ×ינו יכול לכתוב בתיקיית ההעל×ות ($1).',
'uploaderror' => 'שגי××” בהעל×ת הקובץ',
@@ -1994,7 +2076,6 @@ $1',
'http-read-error' => 'שגי×ת קרי××” של HTTP.',
'http-timed-out' => 'עבר זמן ההמתנה של בקשת ה־HTTP.',
'http-curl-error' => 'שגי××” בקבלת כתובת ×”Ö¾URLâ€: $1',
-'http-host-unreachable' => '×œ× × ×™×ª×Ÿ להגיע לכתובת ×”Ö¾URL.',
'http-bad-status' => 'הייתה בעיה בשליחת בקשת ×”Ö¾HTTPâ€: $1 $2',
# Some likely curl errors. More could be added from <http://curl.haxx.se/libcurl/c/libcurl-errors.html>
@@ -2022,6 +2103,10 @@ $1',
'listfiles_size' => 'גודל',
'listfiles_description' => 'תי×ור',
'listfiles_count' => 'גרס×ות',
+'listfiles-show-all' => 'כולל גרס×ות ישנות של תמונות',
+'listfiles-latestversion' => 'גרסה נוכחית',
+'listfiles-latestversion-yes' => 'כן',
+'listfiles-latestversion-no' => 'ל×',
# File description page
'file-anchor-link' => 'קובץ',
@@ -2119,6 +2204,13 @@ $1',
'randompage' => 'דף ×קר××™',
'randompage-nopages' => '×ין ×“×¤×™× {{PLURAL:$2|במרחב ×”×©× ×”×‘×|במרחבי ×”×©× ×”×‘××™×}}: $1.',
+# Random page in category
+'randomincategory' => 'דף ×קר××™ בקטגוריה',
+'randomincategory-invalidcategory' => '"$1" ×ינו ×©× ×ª×§×™×Ÿ לקטגוריה.',
+'randomincategory-nopages' => '×ין ×“×¤×™× ×‘×§×˜×’×•×¨×™×” [[:Category:$1|$1]].',
+'randomincategory-selectcategory' => 'קבלת דף ×קר××™ מהקטגוריה: $1 $2.',
+'randomincategory-selectcategory-submit' => 'מעבר',
+
# Random redirect
'randomredirect' => 'הפניה ×קר×ית',
'randomredirect-nopages' => '×ין הפניות במרחב ×”×©× "$1".',
@@ -2144,17 +2236,13 @@ $1',
'statistics-users-active-desc' => '×ž×©×ª×ž×©×™× ×©×‘×™×¦×¢×• פעולה כלשהי {{PLURAL:$1|×‘×™×•× ×”×חרון|×‘×™×•×ž×™×™× ×”×חרוני×|ב־$1 ×”×™×ž×™× ×”×חרוני×}}',
'statistics-mostpopular' => '×”×“×¤×™× ×”× ×¦×¤×™× ×‘×™×•×ª×¨',
-'disambiguations' => '×“×¤×™× ×©×ž×§×©×¨×™× ×œ×“×¤×™ פירושוני×',
-'disambiguationspage' => 'Template:פירושוני×',
-'disambiguations-text' => "×‘×“×¤×™× ×”×‘××™× ×™×© לפחות קישור ×חד ל'''דף פירושוני×'''.
-ייתכן ×©×¢×œ×™×”× ×œ×§×©×¨ ×‘×ž×§×•× ×–×ת לדף מת××™× ×™×•×ª×¨.<br />
-דף נחשב לדף ×¤×™×¨×•×©×•× ×™× ×× ×”×•× ×ž×©×ª×ž×© בתבנית המקושרת מהדף [[MediaWiki:Disambiguationspage]].",
-
'pageswithprop' => '×“×¤×™× ×¢× ×ž×פיין דף',
'pageswithprop-legend' => '×“×¤×™× ×¢× ×ž×פיין דף',
'pageswithprop-text' => 'בדף ×–×” מופיעה רשימת ×“×¤×™× ×©×ž×©×ª×ž×©×™× ×‘×ž×פיין דף מסוי×.',
'pageswithprop-prop' => '×©× ×”×ž×פיין:',
'pageswithprop-submit' => 'הצגה',
+'pageswithprop-prophidden-long' => 'ערך ×רוך של מ×פיין טקסטו×לי הוסתר ($1)',
+'pageswithprop-prophidden-binary' => 'ערך של מ×פיין בינ×רי הוסתר ($1)',
'doubleredirects' => 'הפניות כפולות',
'doubleredirectstext' => 'בדף ×”×–×” מופיעה רשימת דפי הפניה ×©×ž×¤× ×™× ×œ×“×¤×™ הפניה ×חרי×.
@@ -2212,6 +2300,7 @@ $1',
'mostrevisions' => '×”×“×¤×™× ×‘×¢×œ×™ מספר העריכות הגבוה ביותר',
'prefixindex' => 'רשימת ×”×“×¤×™× ×”×ž×ª×—×™×œ×™× ×‘â€¦',
'prefixindex-namespace' => 'רשימת ×”×“×¤×™× ×”×ž×ª×—×™×œ×™× ×‘â€¦ (במרחב ×”×©× $1)',
+'prefixindex-strip' => 'הסתרת התחילית ברשימה',
'shortpages' => '×“×¤×™× ×§×¦×¨×™×',
'longpages' => '×“×¤×™× ×רוכי×',
'deadendpages' => '×“×¤×™× ×œ×œ× ×§×™×©×•×¨×™×',
@@ -2227,6 +2316,7 @@ $1',
'listusers' => 'רשימת משתמשי×',
'listusers-editsonly' => 'הצגת ×ž×©×ª×ž×©×™× ×¢× ×¢×¨×™×›×•×ª בלבד',
'listusers-creationsort' => 'סידור לפי ת×ריך היצירה',
+'listusers-desc' => 'סידור בסדר יורד',
'usereditcount' => '{{PLURAL:$1|עריכה ×חת|$1 עריכות}}',
'usercreated' => '{{GENDER:$3|נוצר|נוצרה}} ב־$2, $1',
'newpages' => '×“×¤×™× ×—×“×©×™×',
@@ -2405,10 +2495,9 @@ $1',
'unwatchthispage' => 'הפסקת המעקב ×חרי דף ×–×”',
'notanarticle' => 'זהו ×ינו דף תוכן',
'notvisiblerev' => 'הגרסה ×”×חרונה שנוצרה על ידי משתמש ×חר נמחקה',
-'watchnochange' => '××£ ×חד ×ž×”×“×¤×™× ×‘×¨×©×™×ž×ª המעקב ×œ× ×¢×•×“×›×Ÿ בפרק הזמן המצוין למעלה.',
'watchlist-details' => 'ברשימת המעקב יש {{PLURAL:$1|דף ×חד|$1 דפי×}} (×œ× ×›×•×œ×œ דפי שיחה).',
-'wlheader-enotif' => '* הודעות דו×"ל מ×ופשרות.',
-'wlheader-showupdated' => "* ×“×¤×™× ×©×”×©×ª× ×• מ××– ×‘×™×§×•×¨×›× ×”×חרון ×‘×”× ×ž×•×¦×’×™× ×‘'''הדגשה'''.",
+'wlheader-enotif' => 'הודעות דו×"ל מ×ופשרות.',
+'wlheader-showupdated' => "×“×¤×™× ×©×”×©×ª× ×• מ××– ×‘×™×§×•×¨×›× ×”×חרון ×‘×”× ×ž×•×¦×’×™× ×‘'''הדגשה'''.",
'watchmethod-recent' => 'בודק ×ת ×”×“×¤×™× ×©×‘×¨×©×™×ž×ª המעקב ×œ×©×™× ×•×™×™× ×חרוני×.',
'watchmethod-list' => 'בודק ×ת העריכות ×”×חרונות ×‘×“×¤×™× ×©×‘×¨×©×™×ž×ª המעקב',
'watchlistcontains' => 'רשימת המעקב כוללת {{PLURAL:$1|דף ×חד|$1 דפי×}}.',
@@ -2654,7 +2743,7 @@ $1',
'contributions' => 'תרומות {{GENDER:$1|המשתמש|המשתמשת}}',
'contributions-title' => 'תרומות של המשתמש $1',
'mycontris' => 'תרומות',
-'contribsub2' => 'עבור $1 ($2)',
+'contribsub2' => 'עבור {{GENDER:$3|$1}} ($2)',
'nocontribs' => '×œ× × ×ž×¦×ו ×©×™× ×•×™×™× ×”×ž×ª××™×ž×™× ×œ×§×¨×™×˜×¨×™×•× ×™× ×לו.',
'uctop' => '(נוכחי)',
'month' => 'עד החודש:',
@@ -2811,14 +2900,12 @@ $1',
'ipb_blocked_as_range' => 'שגי××”: כתובת ×”Ö¾IP $1 ××™× ×” חסומה ישירות ולכן ×œ× × ×™×ª×Ÿ לשחרר ×ת חסימתה. ×¢× ×–×ת, ×”×™× ×—×¡×•×ž×” כחלק מהטווח $2, שניתן לשחרר ×ת חסימתו.',
'ip_range_invalid' => 'טווח IP שגוי.',
'ip_range_toolarge' => '×œ× × ×™×ª×Ÿ ×œ×—×¡×•× ×˜×•×•×—×™× ×’×“×•×œ×™× ×žÖ¾<span dir="ltr">/$1</span>.',
-'blockme' => '×—×¡×•× ×ותי',
'proxyblocker' => '×—×•×¡× ×¤×¨×•×§×¡×™',
-'proxyblocker-disabled' => '×פשרות זו מבוטלת.',
'proxyblockreason' => 'כתובת ×”Ö¾IP ×©×œ×›× × ×—×¡×ž×” ×ž×©×•× ×©×”×™× ×›×ª×•×‘×ª של שרת פרוקסי פתוח.
×× × ×¦×¨×• קשר ×¢× ×¡×¤×§ ×”×ינטרנט ×©×œ×›× ×ו ×¢× ×”×ª×ž×™×›×” הטכנית של ×”×רגון ×©×œ×›× ×•×”×•×“×™×¢×• ×œ×”× ×¢×œ בעיית ×”×בטחה החמורה ×”×–×ת.',
-'proxyblocksuccess' => 'בוצע.',
'sorbsreason' => 'כתובת ×”Ö¾IP ×©×œ×›× ×¨×©×•×ž×” ככתובת פרוקסי פתוחה ב־DNSBL ש×תר ×–×” משתמש בו.',
'sorbs_create_account_reason' => 'כתובת ×”Ö¾IP ×©×œ×›× ×¨×©×•×ž×” ככתובת פרוקסי פתוחה ב־DNSBL ש×תר ×–×” משתמש בו. ××™× ×›× ×™×›×•×œ×™× ×œ×™×¦×•×¨ חשבון.',
+'xffblockreason' => 'כתובת IP הנמצ×ת בכותרת X-Forwarded-For, בין ×× ×©×œ×›× ×ו של שרת פרוקסי ש××ª× ×ž×©×ª×ž×©×™× ×‘×•, נחסמה. סיבת החסימה המקורית הייתה: $1',
'cant-block-while-blocked' => '××™× ×›× ×™×›×•×œ×™× ×œ×—×¡×•× ×ž×©×ª×ž×©×™× ××—×¨×™× ×›×©××ª× ×—×¡×•×ž×™×.',
'cant-see-hidden-user' => 'המשתמש ש××ª× ×ž× ×¡×™× ×œ×—×¡×•× ×›×‘×¨ × ×—×¡× ×•×”×•×¡×ª×¨. כיוון ש×ין ×œ×›× ×ת ההרש××” לחסימת משתמש והסתרתו, ××™× ×›× ×¨×©××™× ×œ×¦×¤×•×ª בחסימת המשתמש ×ו לערוך ×ותה.',
'ipbblocked' => '××™× ×›× ×™×›×•×œ×™× ×œ×—×¡×•× ×ו לשחרר ×ת ×—×¡×™×ž×ª× ×©×œ ×ž×©×ª×ž×©×™× ×חרי×, כיוון ש××ª× ×¢×¦×ž×›× ×—×¡×•×ž×™×',
@@ -2983,6 +3070,8 @@ $1',
'thumbnail-more' => 'הגדלה',
'filemissing' => 'קובץ חסר',
'thumbnail_error' => 'שגי××” ביצירת תמונה ממוזערת: $1',
+'thumbnail_error_remote' => 'הודעת שגי××” של $1:
+$2',
'djvu_page_error' => 'דף ה־DjVu מחוץ לטווח',
'djvu_no_xml' => '×œ× × ×™×ª×Ÿ ×”×™×” לקבל ×ת ×”Ö¾XML עבור קובץ ×”Ö¾DjVu',
'thumbnail-temp-create' => '×œ× ×”×¦×œ×™×—×” יצירת קובץ תמונה ממוזערת זמני',
@@ -3133,17 +3222,11 @@ $1',
# Stylesheets
'common.css' => '/* הסגנונות ×”× ×›×ª×‘×™× ×›×ן ישפיעו על כל ×”×¢×™×¦×•×‘×™× */',
-'standard.css' => '/* הסגנונות ×”× ×›×ª×‘×™× ×›×ן ישפיעו על העיצוב Standard בלבד */',
-'nostalgia.css' => '/* הסגנונות ×”× ×›×ª×‘×™× ×›×ן ישפיעו על העיצוב Nostalgia בלבד */',
'cologneblue.css' => '/* הסגנונות ×”× ×›×ª×‘×™× ×›×ן ישפיעו על העיצוב CologneBlue בלבד */',
'monobook.css' => '/* הסגנונות ×”× ×›×ª×‘×™× ×›×ן ישפיעו על העיצוב MonoBook בלבד */',
-'myskin.css' => '/* הסגנונות ×”× ×›×ª×‘×™× ×›×ן ישפיעו על העיצוב MySkin בלבד */',
-'chick.css' => '/* הסגנונות ×”× ×›×ª×‘×™× ×›×ן ישפיעו על העיצוב Chick בלבד */',
-'simple.css' => '/* הסגנונות ×”× ×›×ª×‘×™× ×›×ן ישפיעו על העיצוב Simple בלבד */',
'modern.css' => '/* הסגנונות ×”× ×›×ª×‘×™× ×›×ן ישפיעו על העיצוב Modern בלבד */',
'vector.css' => '/* הסגנונות ×”× ×›×ª×‘×™× ×›×ן ישפיעו על העיצוב Vector בלבד */',
'print.css' => '/* הסגנונות ×”× ×›×ª×‘×™× ×›×ן ישפיעו על הפלט בהדפסה בלבד */',
-'handheld.css' => '/* הסגנונות ×”× ×›×ª×‘×™× ×›×ן ישפיעו על ×ž×›×©×™×¨×™× × ×™×™×“×™× ×”×ž×‘×•×¡×¡×™× ×¢×œ העיצוב שבהגדרה $wgHandheldStyle בלבד */',
'noscript.css' => '/* הסגנונות ×”× ×›×ª×‘×™× ×›×ן ישפיעו על ×ž×©×ª×ž×©×™× ×¢× JavaScript מבוטל */',
'group-autoconfirmed.css' => '/* הסגנונות ×”× ×›×ª×‘×™× ×›×ן ישפיעו על ×ž×©×ª×ž×©×™× ×•×ª×™×§×™× ×‘×œ×‘×“ */',
'group-bot.css' => '/* הסגנונות ×”× ×›×ª×‘×™× ×›×ן ישפיעו על ×‘×•×˜×™× ×‘×œ×‘×“ */',
@@ -3152,13 +3235,8 @@ $1',
# Scripts
'common.js' => '/* כל סקריפט JavaScript שנכתב ×›×ן ירוץ עבור כל ×”×ž×©×ª×ž×©×™× ×‘×›×œ טעינת עמוד */',
-'standard.js' => '/* כל סקריפט JavaScript שנכתב ×›×ן ירוץ רק עבור ×”×ž×©×ª×ž×©×™× ×‘×¢×™×¦×•×‘ Standard */',
-'nostalgia.js' => '/* כל סקריפט JavaScript שנכתב ×›×ן ירוץ רק עבור ×”×ž×©×ª×ž×©×™× ×‘×¢×™×¦×•×‘ Nostalgia */',
'cologneblue.js' => '/* כל סקריפט JavaScript שנכתב ×›×ן ירוץ רק עבור ×”×ž×©×ª×ž×©×™× ×‘×¢×™×¦×•×‘ CologneBlue */',
'monobook.js' => '/* כל סקריפט JavaScript שנכתב ×›×ן ירוץ רק עבור ×”×ž×©×ª×ž×©×™× ×‘×¢×™×¦×•×‘ Monobook */',
-'myskin.js' => '/* כל סקריפט JavaScript שנכתב ×›×ן ירוץ רק עבור ×”×ž×©×ª×ž×©×™× ×‘×¢×™×¦×•×‘ MySkin */',
-'chick.js' => '/* כל סקריפט JavaScript שנכתב ×›×ן ירוץ רק עבור ×”×ž×©×ª×ž×©×™× ×‘×¢×™×¦×•×‘ Chick */',
-'simple.js' => '/* כל סקריפט JavaScript שנכתב ×›×ן ירוץ רק עבור ×”×ž×©×ª×ž×©×™× ×‘×¢×™×¦×•×‘ Simple */',
'modern.js' => '/* כל סקריפט JavaScript שנכתב ×›×ן ירוץ רק עבור ×”×ž×©×ª×ž×©×™× ×‘×¢×™×¦×•×‘ Modern */',
'vector.js' => '/* כל סקריפט JavaScript שנכתב ×›×ן ירוץ רק עבור ×”×ž×©×ª×ž×©×™× ×‘×¢×™×¦×•×‘ Vector */',
'group-autoconfirmed.js' => '/* כל סקריפט JavaScript שנכתב ×›×ן ירוץ עבור ×ž×©×ª×ž×©×™× ×•×ª×™×§×™× ×‘×œ×‘×“ */',
@@ -3238,13 +3316,8 @@ $1',
'pageinfo-category-files' => 'מספר הקבצי×',
# Skin names
-'skinname-standard' => 'קל×סי',
-'skinname-nostalgia' => 'נוסטלגיה',
'skinname-cologneblue' => '×ž×™× ×›×—×•×œ×™×',
'skinname-monobook' => 'מונובוק',
-'skinname-myskin' => 'העיצוב שלי',
-'skinname-chick' => "צ'יק",
-'skinname-simple' => 'פשוט',
'skinname-modern' => 'מודרני',
'skinname-vector' => 'וקטור',
@@ -3327,11 +3400,25 @@ $1',
'minutes' => '{{PLURAL:$1|דקה|$1 דקות}}',
'hours' => '{{PLURAL:$1|שעה|שעתיי×|$1 שעות}}',
'days' => '{{PLURAL:$1|יו×|יומיי×|$1 ימי×}}',
+'weeks' => '{{PLURAL:$1|שבוע|שבועיי×|$1 שבועות}}',
'months' => '{{PLURAL:$1|חודש|חודשיי×|$1 חודשי×}}',
'years' => '{{PLURAL:$1|שנה|שנתיי×|$1 שני×}}',
'ago' => 'לפני $1',
'just-now' => 'לפני זמן קצר',
+# Human-readable timestamps
+'hours-ago' => 'לפני {{PLURAL:$1|שעה|שעתיי×|$1 שעות}}',
+'minutes-ago' => 'לפני {{PLURAL:$1|דקה|$1 דקות}}',
+'seconds-ago' => 'לפני {{PLURAL:$1|שנייה|$1 שניות}}',
+'monday-at' => '×‘×™×•× ×©× ×™ בשעה $1',
+'tuesday-at' => '×‘×™×•× ×©×œ×™×©×™ בשעה $1',
+'wednesday-at' => '×‘×™×•× ×¨×‘×™×¢×™ בשעה $1',
+'thursday-at' => '×‘×™×•× ×—×ž×™×©×™ בשעה $1',
+'friday-at' => '×‘×™×•× ×©×™×©×™ בשעה $1',
+'saturday-at' => 'בשבת בשעה $1',
+'sunday-at' => '×‘×™×•× ×¨×שון בשעה $1',
+'yesterday-at' => '×תמול בשעה $1',
+
# Bad image list
'bad_image_list' => 'דרך הכתיבה בהודעה ×”×™× ×›×ž×ª×•×ר להלן:
@@ -3361,7 +3448,7 @@ $1',
* gpslongitude
* gpsaltitude',
-# EXIF tags
+# Exif tags
'exif-imagewidth' => 'רוחב',
'exif-imagelength' => 'גובה',
'exif-bitspersample' => '×‘×™×˜×™× ×œ×¨×›×™×‘',
@@ -3540,7 +3627,7 @@ $1',
'exif-originalimageheight' => 'גובה התמונה לפני קיטוע',
'exif-originalimagewidth' => 'רוחב התמונה לפני קיטוע',
-# EXIF attributes
+# Exif attributes
'exif-compression-1' => '×œ× ×“×—×•×¡',
'exif-compression-2' => 'קידוד הופמן מו××ª× ×—×“-מימדי ל×ורך ריצה CCITT קבוצה 3',
'exif-compression-3' => 'קידוד פקס CCITT קבוצה 3',
@@ -3993,7 +4080,6 @@ $5
'version-other' => '×חר',
'version-mediahandlers' => 'מציגי מדיה',
'version-hooks' => 'מבני Hook',
-'version-extension-functions' => 'פונקציות של הרחבות',
'version-parser-extensiontags' => 'תגיות של הרחבות מפענח',
'version-parser-function-hooks' => '×ž×‘× ×™× ×©×œ פונקציות מפענח',
'version-hook-name' => '×©× ×”Ö¾Hook',
@@ -4002,6 +4088,7 @@ $5
'version-license' => 'רישיון',
'version-poweredby-credits' => "×תר הוויקי ×”×–×” מופעל על ידי '''[//www.mediawiki.org/ מדיה־ויקי]''', © 2001–$1 $2.",
'version-poweredby-others' => '×חרי×',
+'version-poweredby-translators' => 'מתרגמי translatewiki.net',
'version-credits-summary' => '×נו ×¨×•×¦×™× ×œ×”×•×“×•×ª ל×× ×©×™× ×”×‘××™× ×¢×œ ×ª×¨×•×ž×ª× ×œ[[Special:Version|מדיה־ויקי]].',
'version-license-info' => "מדיה־ויקי ×”×™× ×ª×•×›× ×” חופשית; ב××¤×©×¨×•×ª×›× ×œ×”×¤×™×¥ ×ותה מחדש ו/×ו לשנות ×ותה לפי תנ××™ הרישיון הציבורי הכללי של גנו ×”×ž×¤×•×¨×¡× ×¢×œ ידי המוסד לתוכנה חופשית: גרסה 2 של רישיון ×–×”, ×ו (לפי בחירתכ×) כל גרסה מ×וחרת יותר.
@@ -4015,12 +4102,17 @@ $5
'version-entrypoints-header-entrypoint' => 'נקודת כניסה',
'version-entrypoints-header-url' => 'כתובת',
-# Special:FilePath
-'filepath' => 'נתיב לקובץ',
-'filepath-page' => 'הקובץ:',
-'filepath-submit' => 'הצגה',
-'filepath-summary' => 'דף ×–×” מציג ×ת הנתיב ×”×ž×œ× ×œ×§×‘×¦×™× ×©×”×•×¢×œ×•.
-תמונות מוצגות ברזולוציה מל××”, וסוגי ×§×‘×¦×™× ××—×¨×™× ×ž×•×¦×’×™× ×™×©×™×¨×•×ª ב×מצעות התוכנה שהוגדרה להצגת×.',
+# Special:Redirect
+'redirect' => 'הפניה לפי ×©× ×§×•×‘×¥, מספר משתמש ×ו מספר גרסה',
+'redirect-legend' => 'הפניה לקובץ ×ו לדף',
+'redirect-summary' => 'דף מיוחד ×–×” מפנה לקובץ (בהינתן ×©× ×”×§×•×‘×¥), לדף (בהינתן מספר גרסה), ×ו לדף משתמש (בהינתן מספר משתמש).',
+'redirect-submit' => 'מעבר',
+'redirect-lookup' => 'סוג:',
+'redirect-value' => 'ערך:',
+'redirect-user' => 'מספר משתמש',
+'redirect-revision' => 'גרסת דף',
+'redirect-file' => '×©× ×§×•×‘×¥',
+'redirect-not-exists' => 'הערך ×œ× × ×ž×¦×',
# Special:FileDuplicateSearch
'fileduplicatesearch' => 'חיפוש ×§×‘×¦×™× ×›×¤×•×œ×™×',
@@ -4069,12 +4161,16 @@ $5
'tags' => 'התגיות הקיימות לסימון שינויי×',
'tag-filter' => 'מסנן [[Special:Tags|תגיות]]:',
'tag-filter-submit' => 'סינון',
+'tag-list-wrapper' => '([[Special:Tags|{{PLURAL:$1|תגית|תגיות}}]]: $2)',
'tags-title' => 'תגיות',
'tags-intro' => 'דף ×–×” מכיל רשימה של תגיות שהתוכנה יכולה לסמן ×יתן עריכה, ומשמעויותיהן.',
'tags-tag' => '×©× ×”×ª×’×™×ª',
'tags-display-header' => 'הופעה ברשימות השינויי×',
'tags-description-header' => 'תי×ור ×ž×œ× ×©×œ המשמעות',
+'tags-active-header' => 'פעילה?',
'tags-hitcount-header' => '×©×™× ×•×™×™× ×¢× ×ª×’×™×•×ª',
+'tags-active-yes' => 'כן',
+'tags-active-no' => 'ל×',
'tags-edit' => 'עריכה',
'tags-hitcount' => '{{PLURAL:$1|שינוי ×חד|$1 שינויי×}}',
@@ -4095,6 +4191,7 @@ $5
'dberr-problems' => 'מצטערי×! קיימת בעיה טכנית ב×תר ×–×”.',
'dberr-again' => 'נסו להמתין מספר שניות ולהעלות מחדש ×ת הדף.',
'dberr-info' => '(×œ× × ×™×ª×Ÿ ליצור קשר ×¢× ×©×¨×ª הנתוני×: $1)',
+'dberr-info-hidden' => '(×œ× × ×™×ª×Ÿ ליצור קשר ×¢× ×©×¨×ª הנתוני×)',
'dberr-usegoogle' => 'ב××¤×©×¨×•×ª×›× ×œ× ×¡×•×ª לחפש דרך גוגל בינתיי×.',
'dberr-outofdate' => 'שימו לב שהתוכן שלנו כפי שנשמר במ×גר ×©× ×¢×©×•×™ ×©×œ× ×œ×”×™×•×ª מעודכן.',
'dberr-cachederror' => 'זהו עותק שמור של המידע, ×•×”×•× ×¢×©×•×™ ×©×œ× ×œ×”×™×•×ª מעודכן.',
@@ -4110,6 +4207,9 @@ $5
'htmlform-submit' => 'שליחה',
'htmlform-reset' => 'ביטול השינויי×',
'htmlform-selectorother-other' => '×חר',
+'htmlform-no' => 'ל×',
+'htmlform-yes' => 'כן',
+'htmlform-chosen-placeholder' => '× × ×œ×‘×—×•×¨ ×פשרות',
# SQLite database support
'sqlite-has-fts' => '$1 ×¢× ×ª×ž×™×›×” בחיפוש בטקסט מל×',
@@ -4227,4 +4327,19 @@ $5
# Image rotation
'rotate-comment' => 'התמונה סובבה {{PLURAL:$1|במעלה ×חת|ב֫־$1 מעלות}} בכיוון השעון',
+# Limit report
+'limitreport-title' => 'מידע על ביצועי המפענח:',
+'limitreport-cputime' => 'זמן CPU',
+'limitreport-cputime-value' => '{{PLURAL:$1|שנייה|$1 שניות}}',
+'limitreport-walltime' => 'זמן ×מיתי',
+'limitreport-walltime-value' => '{{PLURAL:$1|שנייה|$1 שניות}}',
+'limitreport-ppvisitednodes' => 'מספר ×”×¦×ž×ª×™× ×©×§×“×־המפענח ביקר בה×',
+'limitreport-ppgeneratednodes' => 'מספר ×”×¦×ž×ª×™× ×©×§×“×־המפענח יצר',
+'limitreport-postexpandincludesize' => 'גודל הטקסט המוכלל ל×חר הפריסה',
+'limitreport-postexpandincludesize-value' => '{{PLURAL:$2|$1 מתוך בית ×חד|$1/$2 בתי×}}',
+'limitreport-templateargumentsize' => 'גודל ×”×¤×¨×ž×˜×¨×™× ×©×œ התבניות',
+'limitreport-templateargumentsize-value' => '{{PLURAL:$2|$1 מתוך בית ×חד|$1/$2 בתי×}}',
+'limitreport-expansiondepth' => 'עומק הפריסה הגבוה ביותר',
+'limitreport-expensivefunctioncount' => 'מספר פונקציות המפענח שגוזלות מש×בי×',
+
);
diff --git a/languages/messages/MessagesHi.php b/languages/messages/MessagesHi.php
index 1ca66566..1a6a7a00 100644
--- a/languages/messages/MessagesHi.php
+++ b/languages/messages/MessagesHi.php
@@ -183,7 +183,7 @@ $digitTransformTable = array(
'8' => '८', # &#x096e;
'9' => '९', # &#x096f;
);
-$linkTrail = "/^([a-z]+)(.*)$/sD";
+$linkTrail = "/^([a-z\x{0900}-\x{0963}\x{0966}-\x{A8E0}-\x{A8FF}]+)(.*)$/sDu";
$digitGroupingPattern = "##,##,###";
@@ -218,9 +218,6 @@ $messages = array(
'tog-shownumberswatching' => 'धà¥à¤¯à¤¾à¤¨ रखने वाले सदसà¥à¤¯à¥‹à¤‚ की संखà¥à¤¯à¤¾ दिखाà¤à¤',
'tog-oldsig' => 'वरà¥à¤¤à¤®à¤¾à¤¨ हसà¥à¤¤à¤¾à¤•à¥à¤·à¤°:',
'tog-fancysig' => 'हसà¥à¤¤à¤¾à¤•à¥à¤·à¤° का विकिपाठ के समान मानें (बिना सà¥à¤µà¤šà¤¾à¤²à¤¿à¤¤ कड़ी के)',
-'tog-externaleditor' => 'डिफ़ॉलà¥à¤Ÿ रूप से बाहà¥à¤¯ समà¥à¤ªà¤¾à¤¦à¤• का उपयोग करें (केवल विशेषजà¥à¤žà¥‹à¤‚ के लिà¤, इसके लिठसंगणक पर विशेष जमाव चाहिठहोंगे। [//www.mediawiki.org/wiki/Manual:External_editors अधिक जानकारी।])',
-'tog-externaldiff' => 'डिफ़ॉलà¥à¤Ÿ रूप से बाहà¥à¤¯ अनà¥à¤¤à¤° का उपयोग करें (केवल विशेषजà¥à¤žà¥‹à¤‚ के लिà¤, इसके लिठसंगणक पर विशेष जमाव चाहिठहोंगे। [//www.mediawiki.org/wiki/Manual:External_editors अधिक जानकारी।])',
-'tog-showjumplinks' => '"की ओर जाà¤à¤‚" कड़ियाठउपलबà¥à¤§ कराà¤à¤',
'tog-uselivepreview' => 'सजीवन à¤à¤²à¤• का उपयोग करें (पà¥à¤°à¤¯à¥‹à¤—ातà¥à¤®à¤•)',
'tog-forceeditsummary' => 'यदि समà¥à¤ªà¤¾à¤¦à¤¨ सारांश ना दिया गया हो तो मà¥à¤à¥‡ सूचित करें',
'tog-watchlisthideown' => 'मेरी धà¥à¤¯à¤¾à¤¨à¤¸à¥‚ची से मेरे किठपरिवरà¥à¤¤à¤¨ छिपाà¤à¤',
@@ -233,6 +230,8 @@ $messages = array(
'tog-diffonly' => 'अवतरणों में अनà¥à¤¤à¤° दरà¥à¤¶à¤¾à¤¤à¥‡ समय पà¥à¤°à¤¾à¤¨à¥‡ अवतरण न दिखाà¤à¤',
'tog-showhiddencats' => 'छिपाई हà¥à¤ˆ शà¥à¤°à¥‡à¤£à¤¿à¤¯à¤¾à¤ दिखाà¤à¤',
'tog-norollbackdiff' => 'समà¥à¤ªà¤¾à¤¦à¤¨ वापस लेने के बाद अनà¥à¤¤à¤° न दिखाà¤à¤',
+'tog-useeditwarning' => 'जब मैं किसी समà¥à¤ªà¤¾à¤¦à¤¨ पृषà¥à¤  को बिना सहेजे बदलावों के साथ छोड़ूठतो मà¥à¤à¥‡ सूचित करें।',
+'tog-prefershttps' => 'लॉगिन करने के पशà¥à¤šà¤¾à¤¤à¥ सदैव सà¥à¤°à¤•à¥à¤·à¤¿à¤¤ कनेकà¥à¤¶à¤¨ का पà¥à¤°à¤¯à¥‹à¤— करें',
'underline-always' => 'सदैव',
'underline-never' => 'कभी नहीं',
@@ -296,6 +295,18 @@ $messages = array(
'oct' => 'अकà¥à¤Ÿà¥‚॰',
'nov' => 'नव॰',
'dec' => 'दिस॰',
+'january-date' => 'जनवरी $1',
+'february-date' => 'फ़रवरी $1',
+'march-date' => 'मारà¥à¤š $1',
+'april-date' => 'अपà¥à¤°à¥ˆà¤² $1',
+'may-date' => 'मई $1',
+'june-date' => 'जून $1',
+'july-date' => 'जà¥à¤²à¤¾à¤ˆ $1',
+'august-date' => 'अगसà¥à¤¤ $1',
+'september-date' => 'सितमà¥à¤¬à¤° $1',
+'october-date' => 'अकà¥à¤Ÿà¥‚बर $1',
+'november-date' => 'नवमà¥à¤¬à¤° $1',
+'december-date' => 'दिसमà¥à¤¬à¤° $1',
# Categories related messages
'pagecategories' => '{{PLURAL:$1|शà¥à¤°à¥‡à¤£à¥€|शà¥à¤°à¥‡à¤£à¤¿à¤¯à¤¾à¤}}',
@@ -377,6 +388,7 @@ $messages = array(
'create-this-page' => 'यह पृषà¥à¤  बनाà¤à¤',
'delete' => 'हटाà¤à¤',
'deletethispage' => 'इस पृषà¥à¤  को हटायें',
+'undeletethispage' => 'इस पृषà¥à¤  को पà¥à¤¨à¤°à¥à¤¸à¥à¤¥à¤¾à¤ªà¤¿à¤¤ करें।',
'undelete_short' => '{{PLURAL:$1|à¤à¤• हटाया गया|$1 हटाठगà¤}} बदलाव वापस लायें',
'viewdeleted_short' => 'देखें {{PLURAL:$1|à¤à¤• हटाया गया समà¥à¤ªà¤¾à¤¦à¤¨|$1 हटाठगठसमà¥à¤ªà¤¾à¤¦à¤¨}}',
'protect' => 'सà¥à¤°à¤•à¥à¤·à¤¿à¤¤ करें',
@@ -420,7 +432,7 @@ $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).
+# 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).
'aboutsite' => '{{SITENAME}} के बारे में',
'aboutpage' => 'Project:परिचय',
'copyright' => 'उपलबà¥à¤§ सामगà¥à¤°à¥€ $1 के अधीन है जब तक अलग से उलà¥à¤²à¥‡à¤– ना किया गया हो।',
@@ -430,7 +442,6 @@ $1',
'disclaimers' => 'असà¥à¤µà¥€à¤•à¤°à¤£',
'disclaimerpage' => 'Project:साधारण असà¥à¤µà¥€à¤•à¤°à¤£',
'edithelp' => 'समà¥à¤ªà¤¾à¤¦à¤¨ सहायता',
-'edithelppage' => 'Help:संपादन',
'helppage' => 'Help:सहायता',
'mainpage' => 'मà¥à¤–पृषà¥à¤ ',
'mainpage-description' => 'मà¥à¤–पृषà¥à¤ ',
@@ -509,17 +520,12 @@ $1',
# General errors
'error' => 'तà¥à¤°à¥à¤Ÿà¤¿',
'databaseerror' => 'डाटाबेस तà¥à¤°à¥à¤Ÿà¤¿',
-'dberrortext' => 'डाटाबेस पà¥à¤°à¤¶à¥à¤¨ वाकà¥à¤¯à¤°à¤šà¤¨à¤¾ में तà¥à¤°à¥à¤Ÿà¤¿ मिली है।
-संभव है कि यह सॉफ़à¥à¤Ÿà¤µà¥‡à¤¯à¤° में तà¥à¤°à¥à¤Ÿà¤¿ की वजह से हो।
-पिछला डाटाबेस पà¥à¤°à¤¶à¥à¤¨ था:
-<blockquote><code>$1</code></blockquote>
- "<code>$2</code>" कारà¥à¤¯ समूह से।
-डाटाबेस की तà¥à¤°à¥à¤Ÿà¤¿ थी "<samp>$3: $4</samp>"।',
-'dberrortextcl' => 'डाटाबेस पà¥à¤°à¤¶à¥à¤¨ की वाकà¥à¤¯à¤°à¤šà¤¨à¤¾ में तà¥à¤°à¥à¤Ÿà¤¿ मिली।
-डाटाबेस में पिछला पà¥à¤°à¤¶à¥à¤¨ था:
-"$1"
-कारà¥à¤¯à¤¸à¤®à¥‚ह "$2" से।
-डाटाबेस से तà¥à¤°à¥à¤Ÿà¤¿ आई "$3: $4"',
+'databaseerror-text' => 'डाटाबेस अनà¥à¤°à¥‹à¤§ तà¥à¤°à¥à¤Ÿà¤¿ हà¥à¤ˆ है।
+संभवतः सॉफ़à¥à¤Ÿà¤µà¥‡à¤¯à¤° में गड़बड़ी है।',
+'databaseerror-textcl' => 'डाटाबेस अनà¥à¤°à¥‹à¤§ तà¥à¤°à¥à¤Ÿà¤¿ हà¥à¤ˆ है।',
+'databaseerror-query' => 'अनà¥à¤°à¥‹à¤§: $1',
+'databaseerror-function' => 'फ़ंकà¥à¤¶à¤¨: $1',
+'databaseerror-error' => 'तà¥à¤°à¥à¤Ÿà¤¿: $1',
'laggedslavemode' => "'''चेतावनी:''' यह पृषà¥à¤  अदà¥à¤¯à¤¤à¤¨à¥€à¤¤ जानकारी-यà¥à¤•à¥à¤¤ ना होने की आशंका है।",
'readonly' => 'डाटाबेस लॉक किया हà¥à¤† है',
'enterlockreason' => 'लॉक करने का कारण दीजिà¤, साथ ही लॉक खà¥à¤²à¤¨à¥‡ के समय का लगभग आकलन दिजीये।',
@@ -553,6 +559,7 @@ $1',
'cannotdelete-title' => '"$1" पृषà¥à¤  को हटाया नहीं जा सकता',
'delete-hook-aborted' => 'हà¥à¤• दà¥à¤µà¤¾à¤°à¤¾ हटाना बीच में ही छोड़ा गया।
इसने कोई कारण नहीं बताया।',
+'no-null-revision' => '"$1" पृषà¥à¤  के लिठबिना बदलावों का नया अवतरण बनाने में असफल।',
'badtitle' => 'खराब शीरà¥à¤·à¤•',
'badtitletext' => 'आपके दà¥à¤µà¤¾à¤°à¤¾ अनà¥à¤°à¥‹à¤§à¤¿à¤¤ शीरà¥à¤·à¤• अयोगà¥à¤¯, ख़ाली या गलत जà¥à¥œà¤¾ हà¥à¤† अंतर-भाषीय या अंतर-विकि शीरà¥à¤·à¤• है।
इसमें à¤à¤• या à¤à¤• से अधिक à¤à¤¸à¥‡ कॅरेकà¥à¤Ÿà¤° हो सकते हैं जो शीरà¥à¤·à¤• में पà¥à¤°à¤¯à¥‹à¤— नहीं किये जा सकते।',
@@ -575,12 +582,15 @@ $1',
'editinginterface' => "'''चेतावनी:''' आप à¤à¤• à¤à¤¸à¥‡ पृषà¥à¤  को बदल रहे हैं जो सॉफ़à¥à¤Ÿà¤µà¥‡à¤¯à¤° का इंटरफ़ेस पाठ पà¥à¤°à¤¦à¤¾à¤¨ करता है।
इस पृषà¥à¤  को बदलने से अनà¥à¤¯ सदसà¥à¤¯à¥‹à¤‚ को पà¥à¤°à¤¦à¤°à¥à¤¶à¤¿à¤¤ इंटरफ़ेस की शकà¥à¤²à¥‹à¤¸à¥‚रत में बदलाव आà¤à¤—ा।
सभी विकियों के लिठअनà¥à¤µà¤¾à¤¦ बदलने या जोड़ने के लिठकृपया मीडियाविकि की कà¥à¤·à¥‡à¤¤à¥à¤°à¥€à¤¯à¤•à¤°à¤£ परियोजना [//translatewiki.net/wiki/Main_Page?setlang=hi translatewiki.net] का पà¥à¤°à¤¯à¥‹à¤— करें।",
-'sqlhidden' => '(छà¥à¤ªà¤¾à¤ˆ हà¥à¤ˆ SQL पृचà¥à¤›à¤¾)',
'cascadeprotected' => 'यह पृषà¥à¤  सà¥à¤°à¤•à¥à¤·à¤¿à¤¤ हैं, कà¥à¤¯à¥‹à¤‚की यह निमà¥à¤¨à¤²à¤¿à¤–ित {{PLURAL:$1|पृषà¥à¤ |पृषà¥à¤ à¥‹à¤‚}} की सà¥à¤°à¤•à¥à¤·à¤¾-सीà¥à¥€ में समाविषà¥à¤Ÿ है:
$2',
'namespaceprotected' => "आपको '''$1''' नामसà¥à¤¥à¤¾à¤¨ में समाविषà¥à¤Ÿ पृषà¥à¤ à¥‹à¤‚ को बदलने की अनà¥à¤®à¤¤à¤¿ नहीं है।",
'customcssprotected' => 'आपको इस CSS पृषà¥à¤  को संपादित करने की अनà¥à¤®à¤¤à¤¿ नहीं है, कà¥à¤¯à¥‹à¤‚कि इसमें अनà¥à¤¯ सदसà¥à¤¯ की वà¥à¤¯à¤•à¥à¤¤à¤¿à¤—त सेटिंगà¥à¤¸ शामिल हैं।',
'customjsprotected' => 'आपको इस जावासà¥à¤•à¥à¤°à¤¿à¤ªà¥à¤Ÿ पृषà¥à¤  को संपादित करने की अनà¥à¤®à¤¤à¤¿ नहीं है, कà¥à¤¯à¥‹à¤‚कि इसमें अनà¥à¤¯ सदसà¥à¤¯ की वà¥à¤¯à¤•à¥à¤¤à¤¿à¤—त सेटिंगà¥à¤¸ शामिल हैं।',
+'mycustomcssprotected' => 'आपके पास इस CSS पृषà¥à¤  को समà¥à¤ªà¤¾à¤¦à¤¿à¤¤ करने का अधिकार नहीं है।',
+'mycustomjsprotected' => 'आपके पास इस जावासà¥à¤•à¥à¤°à¤¿à¤ªà¥à¤Ÿ पृषà¥à¤  को समà¥à¤ªà¤¾à¤¦à¤¿à¤¤ करने का अधिकार नहीं है।',
+'myprivateinfoprotected' => 'आपके पास अपनी वà¥à¤¯à¤•à¥à¤¤à¤¿à¤—त जानकारी बदलने की अनà¥à¤®à¤¤à¤¿ नहीं है।',
+'mypreferencesprotected' => 'आपके पास अपनी वरीयताà¤à¤ बदलने की अनà¥à¤®à¤¤à¤¿ नहीं है।',
'ns-specialprotected' => 'विशेष पृषà¥à¤  समà¥à¤ªà¤¾à¤¦à¤¿à¤¤ नहीं किये जा सकते।',
'titleprotected' => 'सदसà¥à¤¯ [[User:$1|$1]] ने इस शीरà¥à¤·à¤• का पृषà¥à¤  बनाने से सà¥à¤°à¤•à¥à¤·à¤¿à¤¤ किया हà¥à¤† है।
इसके लिये निमà¥à¤¨ कारण दिया गया है: "\'\'$2\'\'"',
@@ -605,10 +615,19 @@ $2',
'welcomecreation-msg' => 'आपका खाता बना दिया गया है।
अपनी [[Special:Preferences|{{SITENAME}} वरीयताà¤à¤]] बदलना ना भूलियेगा।',
'yourname' => 'सदसà¥à¤¯à¤¨à¤¾à¤®:',
+'userlogin-yourname' => 'सदसà¥à¤¯à¤¨à¤¾à¤®',
+'userlogin-yourname-ph' => 'अपना सदसà¥à¤¯à¤¨à¤¾à¤® लिखें',
+'createacct-another-username-ph' => 'सदसà¥à¤¯à¤¨à¤¾à¤® पà¥à¤°à¤¦à¤¾à¤¨ करें',
'yourpassword' => 'कूटशबà¥à¤¦:',
+'userlogin-yourpassword' => 'कूटशबà¥à¤¦ (पासवरà¥à¤¡)',
+'userlogin-yourpassword-ph' => 'अपना कूटशबà¥à¤¦ लिखें',
+'createacct-yourpassword-ph' => 'कूटशबà¥à¤¦ दरà¥à¤œ करें',
'yourpasswordagain' => 'कूटशबà¥à¤¦ दà¥à¤¬à¤¾à¤°à¤¾ लिखें:',
+'createacct-yourpasswordagain' => 'कूटशबà¥à¤¦ की पà¥à¤·à¥à¤Ÿà¤¿ करें',
+'createacct-yourpasswordagain-ph' => 'कूटशबà¥à¤¦ पà¥à¤¨à¤ƒ लिखें',
'remembermypassword' => 'इस बà¥à¤°à¤¾à¤‰à¤œà¤¼à¤° पर मेरा लॉगिन याद रखें (अधिकतम $1 {{PLURAL:$1|दिन|दिनों}} के लिà¤)',
-'securelogin-stick-https' => 'पà¥à¤°à¤µà¥‡à¤¶ के बाद HTTPS से जà¥à¤¡à¤¼à¥‡ रहें',
+'userlogin-remembermypassword' => 'मà¥à¤à¥‡ लॉगà¥à¤¡ इन रखें',
+'userlogin-signwithsecure' => 'सà¥à¤°à¤•à¥à¤·à¤¿à¤¤ कनेकà¥à¤¶à¤¨ का पà¥à¤°à¤¯à¥‹à¤— करें',
'yourdomainname' => 'आपका डोमेन:',
'password-change-forbidden' => 'आप इस विकि पर कूटशबà¥à¤¦ नहीं बदल सकते हैं।',
'externaldberror' => 'या तो पà¥à¤°à¤®à¤¾à¤£à¤¿à¤•à¤°à¤£ डाटाबेस में तà¥à¤°à¥à¤Ÿà¤¿ हà¥à¤ˆ है या फिर आपको अपना बाहà¥à¤¯ खाता अपडेट करने की अनà¥à¤®à¤¤à¤¿ नहीं है।',
@@ -620,18 +639,41 @@ $2',
'logout' => 'सतà¥à¤°à¤¾à¤‚त',
'userlogout' => 'सतà¥à¤°à¤¾à¤‚त',
'notloggedin' => 'लॉग इन नहीं किया है',
+'userlogin-noaccount' => 'खाता नहीं है?',
+'userlogin-joinproject' => '{{SITENAME}} से जà¥à¤¡à¤¼à¥‡à¤‚',
'nologin' => "कà¥à¤¯à¤¾ आपने सदसà¥à¤¯à¤¤à¤¾ नहीं ली है? '''$1'''।",
'nologinlink' => 'नया खाता बनाà¤à¤',
'createaccount' => 'खाता बनाà¤à¤',
'gotaccount' => "पहले से आपका खाता है? '''$1''' करें।",
'gotaccountlink' => 'लॉग इन',
'userlogin-resetlink' => 'अपनी पà¥à¤°à¤µà¥‡à¤¶ जानकारी भूल गठहैं?',
+'userlogin-resetpassword-link' => 'अपना कूटशबà¥à¤¦ रीसेट करें',
+'helplogin-url' => 'Help:लॉगिंग इन',
+'userlogin-helplink' => '[[{{MediaWiki:helplogin-url}}|लॉग इन करने में सहायता]]',
+'createacct-join' => 'अपनी जानकारी नीचे लिखें',
+'createacct-another-join' => 'नठखाते की जानकारी नीचे पà¥à¤°à¤¦à¤¾à¤¨ करें।',
+'createacct-emailrequired' => 'ई-मेल पता',
+'createacct-emailoptional' => 'ई-मेल पता (वैकलà¥à¤ªà¤¿à¤•)',
+'createacct-email-ph' => 'अपना ई-मेल पता लिखें',
+'createacct-another-email-ph' => 'ईमेल पता पà¥à¤°à¤¦à¤¾à¤¨ करें',
'createaccountmail' => 'à¤à¤• असà¥à¤¥à¤¾à¤¯à¥€ यादृचà¥à¤›à¤¿à¤• (रैंडम) कूटशबà¥à¤¦ चà¥à¤¨à¥‡à¤‚ और उसे निरà¥à¤¦à¤¿à¤·à¥à¤Ÿ ई-मेल पते पर भेजें',
+'createacct-realname' => 'असली नाम (वैकलà¥à¤ªà¤¿à¤•)',
'createaccountreason' => 'कारण:',
+'createacct-reason' => 'कारण',
+'createacct-reason-ph' => 'आप à¤à¤• अनà¥à¤¯ खाता कà¥à¤¯à¥‹à¤‚ बना रहे हैं',
+'createacct-captcha' => 'सà¥à¤°à¤•à¥à¤·à¤¾ जाà¤à¤š',
+'createacct-imgcaptcha-ph' => 'उपरोकà¥à¤¤ पाठ लिखें',
+'createacct-submit' => 'अपना खाता बनाà¤à¤',
+'createacct-another-submit' => 'à¤à¤• अनà¥à¤¯ खाता खोलें',
+'createacct-benefit-heading' => '{{SITENAME}} आपके जैसे लोगों दà¥à¤µà¤¾à¤°à¤¾ बनायी गई है।',
+'createacct-benefit-body1' => '{{PLURAL:$1|समà¥à¤ªà¤¾à¤¦à¤¨}}',
+'createacct-benefit-body2' => '{{PLURAL:$1|पृषà¥à¤ }}',
+'createacct-benefit-body3' => '{{PLURAL:$1|योगदानकरà¥à¤¤à¤¾}}',
'badretype' => 'आपने जो कूटशबà¥à¤¦ दिये हैं वे à¤à¤• दूसरे से नहीं मिलते। फिर से लिखें।',
'userexists' => 'आपका दिया सदसà¥à¤¯à¤¨à¤¾à¤® पहले से पà¥à¤°à¤¯à¥‹à¤— में है।
कृपया कोई अनà¥à¤¯ सदसà¥à¤¯à¤¨à¤¾à¤® चà¥à¤¨à¥‡à¤‚।',
'loginerror' => 'लॉग इन तà¥à¤°à¥à¤Ÿà¤¿',
+'createacct-error' => 'खाता निरà¥à¤®à¤¾à¤£ तà¥à¤°à¥à¤Ÿà¤¿',
'createaccounterror' => 'खाता नहीं बन पाया: $1',
'nocookiesnew' => 'आपका खाता खोल दिया गया है, पर आप लॉग इन नहीं हà¥à¤ हैं।
{{SITENAME}} पर लॉग इन करने के लिये कà¥à¤•à¥€à¤œà¤¼ का पà¥à¤°à¤¯à¥‹à¤— होता है।
@@ -694,10 +736,12 @@ $2',
यदि यह खाता गलती से खोला गया है, तो आप इस मेसेज को नज़रंदाज़ कर सकते हैं।',
'usernamehasherror' => 'सदसà¥à¤¯à¤¨à¤¾à¤® में हैश कैरैकà¥à¤Ÿà¤° वरà¥à¤œà¤¿à¤¤ हैं।',
'login-throttled' => 'आपने हाल ही में कई बार लॉग इन करने के पà¥à¤°à¤¯à¤¾à¤¸ किये हैं।
-पà¥à¤¨à¤ƒ पà¥à¤°à¤¯à¤¾à¤¸ करने से पहले थोड़ी पà¥à¤°à¤¤à¥€à¤•à¥à¤·à¤¾ करें।',
+पà¥à¤¨à¤ƒ पà¥à¤°à¤¯à¤¾à¤¸ करने से पहले कृपया $1 पà¥à¤°à¤¤à¥€à¤•à¥à¤·à¤¾ करें।',
'login-abort-generic' => 'आपका सतà¥à¤°à¤¾à¤°à¤®à¥à¤­ असफल रहा - निषà¥à¤«à¤²à¤¿à¤¤',
'loginlanguagelabel' => 'भाषा: $1',
'suspicious-userlogout' => 'अपका लॉग आउट करने का अनà¥à¤°à¥‹à¤§ असà¥à¤µà¥€à¤•à¥ƒà¤¤ कर दिया गया है कà¥à¤¯à¥‹à¤‚कि à¤à¤¸à¤¾ पà¥à¤°à¤¤à¥€à¤¤ होता है कि यह किसी खराब बà¥à¤°à¤¾à¤‰à¤œà¤¼à¤° या कैश करने वाली पà¥à¤°à¥‰à¤•à¥à¤¸à¥€ दà¥à¤µà¤¾à¤°à¤¾ भेजा गया था।',
+'createacct-another-realname-tip' => 'असली नाम देना आवशà¥à¤¯à¤• नहीं है।
+यदि आप पà¥à¤°à¤¦à¤¾à¤¨ करते हैं तो इसका पà¥à¤°à¤¯à¥‹à¤— सदसà¥à¤¯ के योगदानों के लिये उनको शà¥à¤°à¥‡à¤¯ (attribution) देने के लिये किया जायेगा।',
# Email sending
'php-mail-error-unknown' => 'PHP के mail() फ़ंकà¥à¤¶à¤¨ में अजà¥à¤žà¤¾à¤¤ तà¥à¤°à¥à¤Ÿà¤¿ हà¥à¤ˆà¥¤',
@@ -714,8 +758,7 @@ $2',
'newpassword' => 'नया कूटशबà¥à¤¦:',
'retypenew' => 'नया कूटशबà¥à¤¦ पà¥à¤¨: लिखें:',
'resetpass_submit' => 'कूटशबà¥à¤¦ बनाà¤à¤ और लॉग इन करें',
-'resetpass_success' => 'आपका कूटशबà¥à¤¦ बदल दिया गया है!
-आपको लॉग इन किया जा रहा है...',
+'changepassword-success' => 'आपका कूटशबà¥à¤¦ बदल दिया गया है!',
'resetpass_forbidden' => 'कूटशबà¥à¤¦ बदले नहीं जा सकते',
'resetpass-no-info' => 'इस पृषà¥à¤  का सीधे पà¥à¤°à¤¯à¥‹à¤— करने के लिठआपको लॉग इन करना होगा।',
'resetpass-submit-loggedin' => 'कूटशबà¥à¤¦ बदलें',
@@ -727,10 +770,11 @@ $2',
# Special:PasswordReset
'passwordreset' => 'कूटशबà¥à¤¦ रीसेट',
-'passwordreset-text' => 'अपने कूटशबà¥à¤¦ को रीसेट करने के लिठइस फ़ॉरà¥à¤® को पूरा करें।',
+'passwordreset-text-one' => 'अपना कूटशबà¥à¤¦ रीसेट करने के लिठयह फ़ॉरà¥à¤® भरें।',
+'passwordreset-text-many' => '{{PLURAL:$1|अपना कूटशबà¥à¤¦ रीसेट करने के लिठनिमà¥à¤¨ में से कोई à¤à¤• भरें।}}',
'passwordreset-legend' => 'कूटशबà¥à¤¦ रीसेट करें',
'passwordreset-disabled' => 'कूटशबà¥à¤¦ रीसेट करना इस विकी पर अकà¥à¤·à¤® है।',
-'passwordreset-pretext' => '{{PLURAL:$1||नीचे पूछे गठडेटा में से à¤à¤• लिखें}}',
+'passwordreset-emaildisabled' => 'इस विकि पर ई-मेल सà¥à¤µà¤¿à¤§à¤¾ अकà¥à¤·à¤® कर दी गयी है।',
'passwordreset-username' => 'सदसà¥à¤¯à¤¨à¤¾à¤®:',
'passwordreset-domain' => 'डोमेन:',
'passwordreset-capture' => 'परिणामसà¥à¤µà¤°à¥‚प बना ई-मेल देखें?',
@@ -752,7 +796,8 @@ $2
असà¥à¤¥à¤¾à¤¯à¥€ कूटशबà¥à¤¦: $2',
'passwordreset-emailsent' => 'à¤à¤• कूटशबà¥à¤¦ रीसेट ई-मेल भेज दिया गया है।',
'passwordreset-emailsent-capture' => 'नीचे दिखाया गया कूटशबà¥à¤¦ रीसेट ई-मेल भेज दिया गया है।',
-'passwordreset-emailerror-capture' => 'नीचे दृषà¥à¤Ÿà¤¿à¤¤ अनà¥à¤¸à¥à¤®à¤¾à¤°à¤• ई-मेल उतà¥à¤ªà¤¨à¥à¤¨ किया गया था, परंतॠउसे $1 सदसà¥à¤¯ को भेजना असफल रहा।',
+'passwordreset-emailerror-capture' => 'नीचे दृषà¥à¤Ÿà¤¿à¤¤ कूटशबà¥à¤¦ रीसेट ई-मेल उतà¥à¤ªà¤¨à¥à¤¨ किया गया था, परंतॠउसे {{GENDER:$2|सदसà¥à¤¯}} को भेजना असफल रहा।
+तà¥à¤°à¥à¤Ÿà¤¿: $1',
# Special:ChangeEmail
'changeemail' => 'ई-मेल पता परिवरà¥à¤¤à¤¿à¤¤ करें',
@@ -766,6 +811,19 @@ $2
'changeemail-submit' => 'ई-मेल बदलें',
'changeemail-cancel' => 'रदà¥à¤¦ करें',
+# Special:ResetTokens
+'resettokens' => 'टोकन रीसेट करें',
+'resettokens-text' => 'जो टोकन आपके खाते से समà¥à¤¬à¤¦à¥à¤§ कà¥à¤› विशिषà¥à¤Ÿ वà¥à¤¯à¤•à¥à¤¤à¤¿à¤—त जानकारी पà¥à¤°à¤¦à¤¾à¤¨ करते हैं, आप उनà¥à¤¹à¥‡à¤‚ यहाठरीसेट कर सकते हैं।
+
+यदि आपने उनà¥à¤¹à¥‡à¤‚ गलती से किसी को दिखा दिया है या फिर आपका खाता हैक हो गया है तो आपको इनà¥à¤¹à¥‡à¤‚ रीसेट कर देना चाहिà¤à¥¤',
+'resettokens-no-tokens' => 'रीसेट करने के लिठकोई टोकन नहीं हैं।',
+'resettokens-legend' => 'टोकन रीसेट करें',
+'resettokens-tokens' => 'टोकन:',
+'resettokens-token-label' => '$1 (वरà¥à¤¤à¤®à¤¾à¤¨ मूलà¥à¤¯: $2)',
+'resettokens-watchlist-token' => '[[Special:Watchlist|आपकी धà¥à¤¯à¤¾à¤¨à¤¸à¥‚ची के पृषà¥à¤ à¥‹à¤‚ में बदलावों]] की वेब फ़ीड (Atom/RSS) हेतॠटोकन',
+'resettokens-done' => 'टोकन रीसेट कर दिठगà¤à¥¤',
+'resettokens-resetbutton' => 'चà¥à¤¨à¥‡ हà¥à¤ टोकन रीसेट करें',
+
# Edit page toolbar
'bold_sample' => 'मोटा पाठ',
'bold_tip' => 'बोलà¥à¤¡ पाठ',
@@ -972,12 +1030,15 @@ $2
लगता है यह हटा दिया गया है।',
'edit-conflict' => 'संपादन अंतरà¥à¤µà¤¿à¤°à¥‹à¤§',
'edit-no-change' => 'आपने कोई बदलाव ही नहीं किà¤, अतः आपके इस संपादन को नज़रंदाज़ कर दिया गया है।',
+'postedit-confirmation' => 'आपका समà¥à¤ªà¤¾à¤¦à¤¨ सहेजा गया है।',
'edit-already-exists' => 'नया पृषà¥à¤  बनाया नहीं जा सका।
यह पहले से मौजूद है।',
'defaultmessagetext' => 'संदेश का डिफ़ॉलà¥à¤Ÿ पाठ',
'content-failed-to-parse' => '$1 के लिठ$2 सामगà¥à¤°à¥€ को पारà¥à¤¸ करने में विफल, तà¥à¤°à¥à¤Ÿà¤¿: $3',
'invalid-content-data' => 'अवैध डाटा सामगà¥à¤°à¥€',
'content-not-allowed-here' => '[[$2]] पृषà¥à¤  पर "$1" सामगà¥à¤°à¥€ मना है।',
+'editwarning-warning' => 'इस पृषà¥à¤  को छोड़ने पर आपके दà¥à¤µà¤¾à¤°à¤¾ किये गठकोई भी बदलाव गायब हो जाà¤à¤à¤—े।
+यदि आपने लॉग इन किया हà¥à¤† है तो आप इस सूचना का दिखना अपनी वरीयताओं के "संपादन" भाग में बंद कर सकते हैं।',
# Content models
'content-model-wikitext' => 'विकिटेकà¥à¤¸à¥à¤Ÿ',
@@ -1013,6 +1074,7 @@ $2
'undo-failure' => 'इस बीच अनà¥à¤¯ बदलाव होने के कारण यह संपादन पूरà¥à¤µà¤µà¤¤ करना संभव नहीं है।',
'undo-norev' => 'यह बदलाव वापिस नहीं कर पाये हैं कà¥à¤¯à¥‹à¤‚कि या तो इसे पहले से पलटा दिया गया है या फिर पृषà¥à¤  हटा दिया गया है।',
'undo-summary' => '[[Special:Contributions/$2|$2]] ([[User talk:$2|वारà¥à¤¤à¤¾]]) दà¥à¤µà¤¾à¤°à¤¾ किठबदलाव $1 को पूरà¥à¤µà¤µà¤¤ किये',
+'undo-summary-username-hidden' => 'छà¥à¤ªà¤¾à¤ गठसदसà¥à¤¯ दà¥à¤µà¤¾à¤°à¤¾ किये संशोधन $1 को पूरà¥à¤µà¤µà¤¤ किया',
# Account creation failure
'cantcreateaccounttitle' => 'खाता खोल नहीं सकते',
@@ -1194,6 +1256,7 @@ $1",
'compareselectedversions' => 'चà¥à¤¨à¥‡ हà¥à¤ अवतरणों की तà¥à¤²à¤¨à¤¾ करें',
'showhideselectedversions' => 'चयनित अवतरण दिखाà¤à¤/छिपाà¤à¤',
'editundo' => 'पूरà¥à¤µà¤µà¤¤ करें',
+'diff-empty' => '(कोई अंतर नहीं)',
'diff-multi' => '({{PLURAL:$2|à¤à¤• योगदानकरà¥à¤¤à¤¾|$2 योगदानकरà¥à¤¤à¤¾à¤“ं}} दà¥à¤µà¤¾à¤°à¤¾ {{PLURAL:$1|किया बीच का à¤à¤•|किठबीच के $1}} अवतरण दरà¥à¤¶à¤¾à¤ नहीं हैं।)',
'diff-multi-manyusers' => '({{PLURAL:$2|à¤à¤• योगदानकरà¥à¤¤à¤¾|$2 योगदानकरà¥à¤¤à¤¾à¤“ं}} दà¥à¤µà¤¾à¤°à¤¾ {{PLURAL:$1|किया बीच का à¤à¤•|किठबीच के $1}} अवतरण दरà¥à¤¶à¤¾à¤ नहीं हैं।)',
'difference-missing-revision' => 'इस अंतर {{PLURAL:$2|का à¤à¤• अवतरण|के $2 अवतरण}} ($1) नहीं {{PLURAL:$2|पाया गया|पाठगà¤}}।
@@ -1220,7 +1283,6 @@ $1",
'searchmenu-legend' => 'खोज विकलà¥à¤ª',
'searchmenu-exists' => "'''इस विकि पर \"[[:\$1]]\" नाम का à¤à¤• पृषà¥à¤  है'''",
'searchmenu-new' => "'''इस विकि पर \"[[:\$1]]\" नाम का पृषà¥à¤  बनाà¤à¤!'''",
-'searchhelp-url' => 'Help:सहायता',
'searchmenu-prefix' => '[[Special:PrefixIndex/$1|इस उपसरà¥à¤— वाले पृषà¥à¤  देखें]]',
'searchprofile-articles' => 'सामगà¥à¤°à¥€ पृषà¥à¤ ',
'searchprofile-project' => 'सहायता और परियोजना पृषà¥à¤ ',
@@ -1263,15 +1325,7 @@ $1",
'searchdisabled' => '{{SITENAME}} पर खोज अकà¥à¤·à¤® है।
आप गूगल से खोज कर सकते हैं।
धà¥à¤¯à¤¾à¤¨ रखें कि उनकी {{SITENAME}} सामगà¥à¤°à¥€ की सूची पà¥à¤°à¤¾à¤¨à¥€ हो सकती है।',
-
-# Quickbar
-'qbsettings' => 'शीघà¥à¤°à¤ªà¤Ÿ',
-'qbsettings-none' => 'बिलà¥à¤•à¥à¤² नहीं',
-'qbsettings-fixedleft' => 'सà¥à¤¥à¤¿à¤° बाईं ओर',
-'qbsettings-fixedright' => 'सà¥à¤¥à¤¿à¤° दाहिनी ओर',
-'qbsettings-floatingleft' => 'असà¥à¤¥à¤¿à¤° बाईं ओर',
-'qbsettings-floatingright' => 'असà¥à¤¥à¤¿à¤° दाहिनी ओर',
-'qbsettings-directionality' => 'निशà¥à¤šà¤¿à¤¤, आपकी भाषा की लिपि की दिशातà¥à¤®à¤•à¤¤à¤¾ पर निरà¥à¤­à¤°',
+'search-error' => 'खोजते समय निमà¥à¤¨ तà¥à¤°à¥à¤Ÿà¤¿ उतà¥à¤ªà¤¨à¥à¤¨ हà¥à¤ˆ है: $1',
# Preferences page
'preferences' => 'मेरी वरीयताà¤à¤',
@@ -1305,7 +1359,6 @@ $1",
'resetprefs' => 'ना संजोये गये बदलाव रदà¥à¤¦ करें',
'restoreprefs' => 'वापिस मूल जमावों पर आ जाà¤à¤ (सभी भागों में)',
'prefs-editing' => 'संपादन',
-'prefs-edit-boxsize' => 'संपादन विंडो का आकार।',
'rows' => 'कतारें:',
'columns' => 'कॉलम:',
'searchresultshead' => 'खोज',
@@ -1316,9 +1369,9 @@ $1",
'recentchangesdays-max' => 'अधिकतम $1 {{PLURAL:$1|दिन}}',
'recentchangescount' => 'मूल रूप से कितने संपादन दिखाà¤à¤:',
'prefs-help-recentchangescount' => 'इसमें हाल के बदलाव, पृषà¥à¤  इतिहास व लॉग शामिल हैं।',
-'prefs-help-watchlist-token' => 'इस कोषà¥à¤ à¤• में गà¥à¤ªà¥à¤¤ कà¥à¤‚जी पà¥à¤°à¤¦à¤¾à¤¨ करने से आपकी धà¥à¤¯à¤¾à¤¨à¤¸à¥‚ची के लिठà¤à¤• आर॰à¤à¤¸à¥°à¤à¤¸ फ़ीड बन जाà¤à¤—ी।
-जो भी इस कोषà¥à¤ à¤• में मौजूद कà¥à¤‚जी को जानता है वह आपकी धà¥à¤¯à¤¾à¤¨à¤¸à¥‚ची को पढ़ सकेगा, अतः कोई सà¥à¤°à¤•à¥à¤·à¤¿à¤¤ कà¥à¤‚जी चà¥à¤¨à¥‡à¤‚।
-यह है आपके लिठà¤à¤• यंतà¥à¤°à¤œà¤¨à¤¿à¤¤ कà¥à¤‚जी जिसका आप चाहें तो पà¥à¤°à¤¯à¥‹à¤— कर सकते हैं: $1',
+'prefs-help-watchlist-token2' => 'यह आपकी धà¥à¤¯à¤¾à¤¨à¤¸à¥‚ची की वेब फ़ीड की गोपनीय चाबी है।
+यह जिसके भी पास होगी वह आपकी धà¥à¤¯à¤¾à¤¨à¤¸à¥‚ची पढ़ सकेगा, इसिलठइसे किसी के साथ बांटियेगा नहीं।
+[[Special:ResetTokens|इसे रीसेट करने के लिठयहाठकà¥à¤²à¤¿à¤• करें]]।',
'savedprefs' => 'आपकी वरीयताà¤à¤ संजोई गई हैं।',
'timezonelegend' => 'समयमंडल:',
'localtime' => 'सà¥à¤¥à¤¾à¤¨à¥€à¤¯ समय:',
@@ -1349,7 +1402,6 @@ $1",
'prefs-reset-intro' => 'आप इस पृषà¥à¤  के ज़रिठअपनी वरीयताओं को साइट की मूल वरीयताओं के समान बना सकते हैं।
इसके बाद आप वापस पà¥à¤°à¤¾à¤¨à¥€ सà¥à¤¥à¤¿à¤¤à¤¿ पर नहीं आ सकेंगे।',
'prefs-emailconfirm-label' => 'ई-मेल पà¥à¤·à¥à¤Ÿà¤¿à¤•à¤°à¤£:',
-'prefs-textboxsize' => 'संपादन विंडो का आकार:',
'youremail' => 'आपका ई-मेल पता:',
'username' => '{{GENDER:$1|सदसà¥à¤¯à¤¨à¤¾à¤®}}:',
'uid' => '{{GENDER:$1|सदसà¥à¤¯}} कà¥à¤°à¤®à¤¾à¤‚क:',
@@ -1384,6 +1436,8 @@ HTML टैग की जाà¤à¤š करें।',
'prefs-dateformat' => 'तिथि पà¥à¤°à¤¾à¤°à¥‚प',
'prefs-timeoffset' => 'समयांतर',
'prefs-advancedediting' => 'सामानà¥à¤¯ विकलà¥à¤ª',
+'prefs-editor' => 'समà¥à¤ªà¤¾à¤¦à¤•',
+'prefs-preview' => 'पूरà¥à¤µà¤¾à¤µà¤²à¥‹à¤•à¤¨',
'prefs-advancedrc' => 'उनà¥à¤¨à¤¤ विकलà¥à¤ª',
'prefs-advancedrendering' => 'उनà¥à¤¨à¤¤ विकलà¥à¤ª',
'prefs-advancedsearchoptions' => 'उनà¥à¤¨à¤¤ विकलà¥à¤ª',
@@ -1391,7 +1445,9 @@ HTML टैग की जाà¤à¤š करें।',
'prefs-displayrc' => 'पà¥à¤°à¤¦à¤°à¥à¤¶à¤¨ विकलà¥à¤ª',
'prefs-displaysearchoptions' => 'पà¥à¤°à¤¦à¤°à¥à¤¶à¤¨ विकलà¥à¤ª',
'prefs-displaywatchlist' => 'पà¥à¤°à¤¦à¤°à¥à¤¶à¤¨ विकलà¥à¤ª',
+'prefs-tokenwatchlist' => 'टोकन',
'prefs-diffs' => 'अंतर',
+'prefs-help-prefershttps' => 'यह वरीयता आपके अगले लॉगिन पर पà¥à¤°à¤­à¤¾à¤µà¥€ होगी।',
# User preference: email validation using jQuery
'email-address-validity-valid' => 'ई-मेल पता वैध पà¥à¤°à¤¤à¥€à¤¤ होता है',
@@ -1418,6 +1474,8 @@ HTML टैग की जाà¤à¤š करें।',
'userrights-notallowed' => 'आपके पास सदसà¥à¤¯ अधिकार जोड़ने या हटाने की अनà¥à¤®à¤¤à¤¿ नहीं है।',
'userrights-changeable-col' => 'समूह जिनà¥à¤¹à¥‡à¤‚ आप बदल सकते हैं',
'userrights-unchangeable-col' => 'समूह जिनà¥à¤¹à¥‡à¤‚ आप नहीं बदल सकते हैं',
+'userrights-conflict' => 'सदसà¥à¤¯ अधिकार बदलावों में अंतरà¥à¤µà¤¿à¤°à¥‹à¤§! कृपया अपने बदलाव जाà¤à¤šà¥‡à¤‚ और पà¥à¤¨à¤ƒ सà¥à¤¨à¤¿à¤¶à¥à¤šà¤¿à¤¤ करें।',
+'userrights-removed-self' => 'आपने सफलतापूरà¥à¤µà¤• अपने अधिकार हटा दिठहैं। अतः आप अब यह पृषà¥à¤  नहीं देख सकते हैं।',
# Groups
'group' => 'समूह:',
@@ -1483,11 +1541,19 @@ HTML टैग की जाà¤à¤š करें।',
'right-proxyunbannable' => 'सà¥à¤µà¤šà¤¾à¤²à¤¿à¤¤ पà¥à¤°à¥Œà¤•à¥à¤¸à¥€ बà¥à¤²à¥‰à¤•à¥à¤¸ को नज़रंदाज़ करें',
'right-unblockself' => 'सà¥à¤µà¤¯à¤‚ को अनावरà¥à¤¦à¥à¤§ करें',
'right-protect' => 'सà¥à¤°à¤•à¥à¤·à¤¾ सà¥à¤¤à¤° बदलें और सीढ़ी-सà¥à¤°à¤•à¥à¤·à¤¿à¤¤ पृषà¥à¤  समà¥à¤ªà¤¾à¤¦à¤¿à¤¤ करें',
-'right-editprotected' => 'सà¥à¤°à¤•à¥à¤·à¤¿à¤¤ पृषà¥à¤  समà¥à¤ªà¤¾à¤¦à¤¿à¤¤ करें (बिना सीà¥à¥€ सà¥à¤°à¤•à¥à¤·à¤¾ वाले)',
+'right-editprotected' => 'उन सà¥à¤°à¤•à¥à¤·à¤¿à¤¤ पृषà¥à¤  समà¥à¤ªà¤¾à¤¦à¤¿à¤¤ करें जिनके समà¥à¤ªà¤¾à¤¦à¤¨ की "{{int:protect-level-sysop}}"',
+'right-editsemiprotected' => 'उन पृषà¥à¤ à¥‹à¤‚ को समà¥à¤ªà¤¾à¤¦à¤¿à¤¤ करें जिनका सà¥à¤°à¤•à¥à¤·à¤¾ सà¥à¤¤à¤° है "{{int:protect-level-autoconfirmed}}"',
'right-editinterface' => 'सॉफ़à¥à¤Ÿà¤µà¥‡à¤¯à¤° इंटरफ़ेस समà¥à¤ªà¤¾à¤¦à¤¿à¤¤ करें',
'right-editusercssjs' => 'अनà¥à¤¯ सदसà¥à¤¯à¥‹à¤‚ के सी॰à¤à¤¸à¥°à¤à¤¸ और जावासà¥à¤•à¥à¤°à¤¿à¤ªà¥à¤Ÿ पृषà¥à¤  समà¥à¤ªà¤¾à¤¦à¤¿à¤¤ करें',
'right-editusercss' => 'अनà¥à¤¯ सदसà¥à¤¯à¥‹à¤‚ के सी॰à¤à¤¸à¥°à¤à¤¸ पृषà¥à¤  समà¥à¤ªà¤¾à¤¦à¤¿à¤¤ करें',
'right-edituserjs' => 'अनà¥à¤¯ सदसà¥à¤¯à¥‹à¤‚ के जावासà¥à¤•à¥à¤°à¤¿à¤ªà¥à¤Ÿ पृषà¥à¤  समà¥à¤ªà¤¾à¤¦à¤¿à¤¤ करें',
+'right-editmyusercss' => 'अपनी सदसà¥à¤¯ सà¥à¤¤à¤° की सी॰à¤à¤¸à¥°à¤à¤¸ फ़ाइलें समà¥à¤ªà¤¾à¤¦à¤¿à¤¤ करें',
+'right-editmyuserjs' => 'अपनी सदसà¥à¤¯ सà¥à¤¤à¤° की जावासà¥à¤•à¥à¤°à¤¿à¤ªà¥à¤Ÿ फ़ाइलें समà¥à¤ªà¤¾à¤¦à¤¿à¤¤ करें',
+'right-viewmywatchlist' => 'अपनी धà¥à¤¯à¤¾à¤¨à¤¸à¥‚ची देखें',
+'right-editmywatchlist' => 'अपनी धà¥à¤¯à¤¾à¤¨à¤¸à¥‚ची समà¥à¤ªà¤¾à¤¦à¤¿à¤¤ करें। धà¥à¤¯à¤¾à¤¨ दें कि कà¥à¤› कारà¥à¤¯ इस अधिकार के बिना भी धà¥à¤¯à¤¾à¤¨à¤¸à¥‚ची में पृषà¥à¤  जोड़ेंगे।',
+'right-viewmyprivateinfo' => 'अपना वà¥à¤¯à¤•à¥à¤¤à¤¿à¤—त डाटा देखें (जैसे ई-मेल पता, असली नाम)',
+'right-editmyprivateinfo' => 'अपना वà¥à¤¯à¤•à¥à¤¤à¤¿à¤—त डाटा समà¥à¤ªà¤¾à¤¦à¤¿à¤¤ करें (जैसे ई-मेल पता, असली नाम)',
+'right-editmyoptions' => 'अपनी वरीयताà¤à¤ समà¥à¤ªà¤¾à¤¦à¤¿à¤¤ करें',
'right-rollback' => 'किसी पृषà¥à¤  का अंतिम समà¥à¤ªà¤¾à¤¦à¤¨ करने वाले सदसà¥à¤¯ के समà¥à¤ªà¤¾à¤¦à¤¨ वापिस लें',
'right-markbotedits' => 'वापिस लेने में हà¥à¤ संपादनों को बॉट समà¥à¤ªà¤¾à¤¦à¤¨ चिनà¥à¤¹à¤¿à¤¤ करें',
'right-noratelimit' => 'रेट लिमिटà¥à¤¸ से बेअसर हों',
@@ -1549,12 +1615,19 @@ HTML टैग की जाà¤à¤š करें।',
'action-userrights-interwiki' => 'अनà¥à¤¯ विकियों पर सदसà¥à¤¯ अधिकार बदलने',
'action-siteadmin' => 'डाटाबेस को ताला लगाने या खोलने',
'action-sendemail' => 'ई-मेल भेजने',
+'action-editmywatchlist' => 'धà¥à¤¯à¤¾à¤¨à¤¸à¥‚ची समà¥à¤ªà¤¾à¤¦à¤¿à¤¤ करने',
+'action-viewmywatchlist' => 'अपनी धà¥à¤¯à¤¾à¤¨à¤¸à¥‚ची देखने',
+'action-viewmyprivateinfo' => 'अपनी वà¥à¤¯à¤•à¥à¤¤à¤¿à¤—त जानकारी देखने',
+'action-editmyprivateinfo' => 'अपनी वà¥à¤¯à¤•à¥à¤¤à¤¿à¤—त जानकारी बदलने',
# Recent changes
'nchanges' => '$1 {{PLURAL:$1|बदलाव}}',
+'enhancedrc-since-last-visit' => '$1 {{PLURAL:$1|अंतिम बार देखने के बाद से}}',
+'enhancedrc-history' => 'इतिहास',
'recentchanges' => 'हाल में हà¥à¤ बदलाव',
'recentchanges-legend' => 'हाल के परिवरà¥à¤¤à¤¨ संबंधी विकलà¥à¤ª',
'recentchanges-summary' => 'इस विकि पर हाल में हà¥à¤ बदलाव इस पनà¥à¤¨à¥‡ पर देखे जा सकते हैं।',
+'recentchanges-noresult' => 'इस अवधि के दौरान इन मापदंडों को पूरà¥à¤£ करते कोई परिवरà¥à¤¤à¤¨ नहीं किठगठहैं।',
'recentchanges-feed-description' => 'इस विकि पर हाल में हà¥à¤ बदलाव इस फ़ीड में देखे जा सकते हैं।',
'recentchanges-label-newpage' => 'इस संपादन से नया पृषà¥à¤  बना',
'recentchanges-label-minor' => 'यह à¤à¤• छोटा समà¥à¤ªà¤¾à¤¦à¤¨ है',
@@ -1591,7 +1664,6 @@ HTML टैग की जाà¤à¤š करें।',
'recentchangeslinked-feed' => 'पृषà¥à¤  से जà¥à¥œà¥‡ बदलाव',
'recentchangeslinked-toolbox' => 'पृषà¥à¤  से जà¥à¥œà¥‡ बदलाव',
'recentchangeslinked-title' => '"$1" से जà¥à¥œà¥‡ बदलाव',
-'recentchangeslinked-noresult' => 'जà¥à¥œà¥‡ हà¥à¤ पृषà¥à¤ à¥‹à¤‚ में दी हà¥à¤ˆ अवधि में कोई भी बदलाव नहीं हà¥à¤ हैं।',
'recentchangeslinked-summary' => "यह पृषà¥à¤  किसी विशिषà¥à¤Ÿ पृषà¥à¤  से जà¥à¥œà¥‡ पृषà¥à¤ à¥‹à¤‚ (या किसी शà¥à¤°à¥‡à¤£à¥€ में शà¥à¤°à¥‡à¤£à¥€à¤¬à¤¦à¥à¤§ पृषà¥à¤ à¥‹à¤‚) में हाल में हà¥à¤ बदलावों की सूची दरà¥à¤¶à¤¾à¤¤à¤¾ है।
[[Special:Watchlist|आपकी धà¥à¤¯à¤¾à¤¨à¤¸à¥‚ची]] में मौजूद पृषà¥à¤  '''मोटे''' अकà¥à¤·à¤°à¥‹à¤‚ में दिखेंगे।",
'recentchangeslinked-page' => 'पृषà¥à¤  नाम:',
@@ -1603,7 +1675,7 @@ HTML टैग की जाà¤à¤š करें।',
'reuploaddesc' => 'अपलोड रदà¥à¤¦ करें और पà¥à¤¨à¤ƒ अपलोड फ़ॉरà¥à¤® पर जाà¤à¤',
'upload-tryagain' => 'संशोधित फ़ाइल विवरण भेजें',
'uploadnologin' => 'लॉग इन नहीं किया है',
-'uploadnologintext' => 'फ़ाइलें अपलोड करने के लिये [[Special:UserLogin|लॉग इन]] करना आवशà¥à¤¯à¤• है।',
+'uploadnologintext' => 'फ़ाइलें अपलोड करने के लिये $1 करना आवशà¥à¤¯à¤• है।',
'upload_directory_missing' => 'अपलोड डाइरेकà¥à¤Ÿà¤°à¥€ ($1) मौजूद नहीं है, और वेबसरà¥à¤µà¤° इसका निरà¥à¤®à¤¾à¤£ नहीं कर पाया।',
'upload_directory_read_only' => 'अपलोड डाइरेकà¥à¤Ÿà¤°à¥€ ($1) में वेबसरà¥à¤µà¤° लिख नहीं पा रहा है।',
'uploaderror' => 'अपलोड तà¥à¤°à¥à¤Ÿà¤¿',
@@ -1835,7 +1907,6 @@ https://www.mediawiki.org/wiki/Manual:Image_Authorization देखें।',
'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>
@@ -1866,6 +1937,10 @@ https://www.mediawiki.org/wiki/Manual:Image_Authorization देखें।',
'listfiles_size' => 'आकार',
'listfiles_description' => 'विवरण',
'listfiles_count' => 'अवतरण',
+'listfiles-show-all' => 'इसमें चितà¥à¤°à¥‹à¤‚ के पà¥à¤°à¤¾à¤¨à¥‡ अवतरण शामिल हैं',
+'listfiles-latestversion' => 'वरà¥à¤¤à¤®à¤¾à¤¨ अवतरण',
+'listfiles-latestversion-yes' => 'हाà¤',
+'listfiles-latestversion-no' => 'नहीं',
# File description page
'file-anchor-link' => 'फ़ाइल',
@@ -1963,6 +2038,13 @@ https://www.mediawiki.org/wiki/Manual:Image_Authorization देखें।',
'randompage' => 'यादृचà¥à¤›à¤¿à¤• पृषà¥à¤ ',
'randompage-nopages' => 'कोई भी पृषà¥à¤  {{PLURAL:$2|इस नामसà¥à¤¥à¤¾à¤¨|इन नामसà¥à¤¥à¤¾à¤¨à¥‹à¤‚}} में नहीं हैं: $1।',
+# Random page in category
+'randomincategory' => 'शà¥à¤°à¥‡à¤£à¥€ में यादृचà¥à¤›à¤¿à¤• (रैंडम) पृषà¥à¤ ',
+'randomincategory-invalidcategory' => '"$1" à¤à¤• मानà¥à¤¯ शà¥à¤°à¥‡à¤£à¥€ नाम नहीं है।',
+'randomincategory-nopages' => '[[:Category:$1|$1]] शà¥à¤°à¥‡à¤£à¥€ में कोई पृषà¥à¤  नहीं हैं।',
+'randomincategory-selectcategory' => 'शà¥à¤°à¥‡à¤£à¥€ से यादृचà¥à¤›à¤¿à¤• (रैंडम) पृषà¥à¤  खोलें: $1 $2',
+'randomincategory-selectcategory-submit' => 'खोलें',
+
# Random redirect
'randomredirect' => 'किसी à¤à¤• पà¥à¤¨à¤°à¥à¤¨à¤¿à¤°à¥à¤¦à¥‡à¤¶à¤¨ पर जाà¤à¤',
'randomredirect-nopages' => 'नामसà¥à¤¥à¤¾à¤¨ "$1" में कोई पà¥à¤¨à¤°à¥à¤¨à¤¿à¤°à¥à¤¦à¥‡à¤¶à¤¨ नहीं हैं।',
@@ -1988,12 +2070,6 @@ https://www.mediawiki.org/wiki/Manual:Image_Authorization देखें।',
'statistics-users-active-desc' => 'पिछले {{PLURAL:$1|à¤à¤• दिन|$1 दिनों}} में कà¥à¤› गतिविधि रखने वाले सदसà¥à¤¯',
'statistics-mostpopular' => 'सबसे अधिक देखे गठपृषà¥à¤ ',
-'disambiguations' => 'बहà¥à¤µà¤¿à¤•à¤²à¥à¤ªà¥€ पृषà¥à¤ à¥‹à¤‚ से जà¥à¥œà¤¤à¥‡ पृषà¥à¤ ',
-'disambiguationspage' => 'Template:बहà¥à¤µà¤¿à¤•à¤²à¥à¤ªà¥€',
-'disambiguations-text' => "निमà¥à¤¨à¤¾à¤‚कित पृषà¥à¤  कम-से-कम à¤à¤• '''बहà¥à¤µà¤¿à¤•à¤²à¥à¤ªà¥€ पृषà¥à¤ ''' से जà¥à¤¡à¤¼à¤¤à¥‡ हैं।
-संभवतः इनà¥à¤¹à¥‡à¤‚ उपयà¥à¤•à¥à¤¤ पृषà¥à¤  से जà¥à¤¡à¤¼à¤¾ होना चाहिà¤à¥¤<br />
-यदि कोई पृषà¥à¤  à¤à¤¸à¥‡ साà¤à¤šà¥‡ का पà¥à¤°à¤¯à¥‹à¤— करता है जो [[MediaWiki:Disambiguationspage]] से जà¥à¤¡à¤¼à¤¾ हà¥à¤† है, तो उसे बहà¥à¤µà¤¿à¤•à¤²à¥à¤ªà¥€ पृषà¥à¤  माना जाता है।",
-
'doubleredirects' => 'दà¥à¤—à¥à¤¨à¥‡ पà¥à¤¨à¤°à¥à¤¨à¤¿à¤°à¥à¤¦à¥‡à¤¶',
'doubleredirectstext' => 'यह पृषà¥à¤  उन पृषà¥à¤ à¥‹à¤‚ की सूची देता है जो अनà¥à¤¯ पà¥à¤¨à¤°à¥à¤¨à¤¿à¤°à¥à¤¦à¥‡à¤¶à¤¿à¤¤ पृषà¥à¤ à¥‹à¤‚ की ओर पà¥à¤¨à¤°à¥à¤¨à¤¿à¤°à¥à¤¦à¥‡à¤¶à¤¿à¤¤ हैं।
हर कतार में पहले और दूसरे पà¥à¤¨à¤°à¥à¤¨à¤¿à¤°à¥à¤¦à¥‡à¤¶à¤¨ की कड़ियाà¤, तथा दूसरे पà¥à¤¨à¤°à¥à¤¨à¤¿à¤°à¥à¤¦à¥‡à¤¶à¤¨ का लकà¥à¤·à¥à¤¯ भी है, आमतौर पर यही "वासà¥à¤¤à¤µà¤¿à¤•" लकà¥à¤·à¥à¤¯à¤¿à¤¤ पृषà¥à¤  होगा, और पहला पà¥à¤¨à¤°à¥à¤¦à¥‡à¤¶à¤¨ वासà¥à¤¤à¤µ में इसी को लकà¥à¤·à¥à¤¯à¤¿à¤¤ होना चाहिà¤à¥¤
@@ -2051,6 +2127,7 @@ https://www.mediawiki.org/wiki/Manual:Image_Authorization देखें।',
'mostrevisions' => 'सरà¥à¤µà¤¾à¤§à¤¿à¤• अवतरणित पृषà¥à¤ ',
'prefixindex' => 'उपसरà¥à¤— अनà¥à¤¸à¤¾à¤° पृषà¥à¤ ',
'prefixindex-namespace' => 'उपसरà¥à¤— वाले सभी पृषà¥à¤  ($1 नामसà¥à¤¥à¤¾à¤¨)',
+'prefixindex-strip' => 'सूची में उपसरà¥à¤— छà¥à¤ªà¤¾à¤à¤',
'shortpages' => 'छोटे पृषà¥à¤ ',
'longpages' => 'लमà¥à¤¬à¥‡ पृषà¥à¤ ',
'deadendpages' => 'बंद सिरे पृषà¥à¤ ',
@@ -2243,10 +2320,9 @@ https://www.mediawiki.org/wiki/Manual:Image_Authorization देखें।',
'unwatchthispage' => 'धà¥à¤¯à¤¾à¤¨à¤¸à¥‚ची से हटाà¤à¤',
'notanarticle' => 'सामगà¥à¤°à¥€ पृषà¥à¤  नहीं',
'notvisiblerev' => 'किसी अनà¥à¤¯ सदसà¥à¤¯ दà¥à¤µà¤¾à¤°à¤¾ किया अनà¥à¤¤à¤¿à¤® अवतरण हटाया गया है',
-'watchnochange' => 'दिये गये समय में आपके धà¥à¤¯à¤¾à¤¨à¤¸à¥‚ची में मौजूद पृषà¥à¤ à¥‹à¤‚ में कोई भी बदलाव नहीं हà¥à¤ हैं।',
'watchlist-details' => 'वारà¥à¤¤à¤¾ पृषà¥à¤ à¥‹à¤‚ के अलावा {{PLURAL:$1|$1 पृषà¥à¤ }} आपकी धà¥à¤¯à¤¾à¤¨à¤¸à¥‚ची में हैं।',
-'wlheader-enotif' => '* ई-मेल नोटिफिकेशन सकà¥à¤·à¤® हैं।',
-'wlheader-showupdated' => "* पृषà¥à¤  जो आपके दà¥à¤µà¤¾à¤°à¤¾ देखे जाने के बाद बदले गये हैं, '''बोलà¥à¤¡''' दिखेंगे।",
+'wlheader-enotif' => 'ई-मेल नोटिफ़िकेशन सकà¥à¤·à¤® हैं।',
+'wlheader-showupdated' => "पृषà¥à¤  जो आपके दà¥à¤µà¤¾à¤°à¤¾ देखे जाने के बाद बदले गये हैं '''बोलà¥à¤¡''' दिखेंगे।",
'watchmethod-recent' => 'धà¥à¤¯à¤¾à¤¨à¤¸à¥‚ची में दिये गये पृषà¥à¤ à¥‹à¤‚ में हाल में हà¥à¤ बदलाव देख रहे हैं',
'watchmethod-list' => 'धà¥à¤¯à¤¾à¤¨à¤¸à¥‚ची में दिये गये पृषà¥à¤ à¥‹à¤‚ में हाल में हà¥à¤ बदलाव देख रहे हैं',
'watchlistcontains' => 'आपकी धà¥à¤¯à¤¾à¤¨à¤¸à¥‚ची में $1 {{PLURAL:$1|पृषà¥à¤ }} हैं।',
@@ -2500,7 +2576,7 @@ $1',
'contributions' => '{{GENDER:$1|सदसà¥à¤¯}} योगदान',
'contributions-title' => '$1 के योगदान',
'mycontris' => 'योगदान',
-'contribsub2' => '$1 के लिये ($2)',
+'contribsub2' => '{{GENDER:$3|$1}} ($2) के लिये',
'nocontribs' => 'इन कसौटियों से मिलनेवाले बदलाव मिले नहीं।',
'uctop' => '(मौजूदा)',
'month' => 'इस महिनेसे (और पà¥à¤°à¤¾à¤¨à¥‡à¤‚):',
@@ -2658,12 +2734,9 @@ $1 को बाधà¥à¤¯ करने का कारण है: "$2"',
फिर भी, $2 पà¥à¤°à¤•à¤¾à¤° को बाधà¥à¤¯ किया जा सकता है, जिनको अबाधà¥à¤¯ किया जा सकता है।',
'ip_range_invalid' => 'गलत आईपी रेंज',
'ip_range_toolarge' => '/$1 से अधिक बड़े रेञà¥à¤œ बà¥à¤²à¥‰à¤•à¥‹à¤‚ की अनà¥à¤®à¤¤à¤¿ नहीं है।',
-'blockme' => 'मà¥à¤à¥‡ बà¥à¤²à¥‰à¤• करो',
'proxyblocker' => 'पà¥à¤°à¥‰à¤•à¥à¤¸à¥€ बà¥à¤²à¥‰à¤•à¤°',
-'proxyblocker-disabled' => 'यह कारà¥à¤¯ रदà¥à¤¦ कर दिया गया हैं।',
'proxyblockreason' => 'आपका IP पता बाधित किया जा चà¥à¤•à¤¾ है कà¥à¤¯à¥‹à¤‚कि यह à¤à¤• मà¥à¤•à¥à¤¤ पà¥à¤°à¤¤à¤¿à¤¨à¤¿à¤§à¤¿ है।
कृपया आप अपने इंटरनेट सेवा पà¥à¤°à¤¦à¤¾à¤¨ करने वाले से या तकनीकी सहायक से समà¥à¤ªà¤°à¥à¤• करें अथवा उनà¥à¤¹à¥‡à¤‚ इस भयावह सà¥à¤°à¤•à¥à¤·à¤¾ समसà¥à¤¯à¤¾ के बारे में सूचित करें।',
-'proxyblocksuccess' => 'हो गया।',
'sorbsreason' => '{{SITENAME}} दà¥à¤µà¤¾à¤°à¤¾ इसà¥à¤¤à¥‡à¤®à¤¾à¤²à¤®à¥‡à¤‚ लाये जाने वाले DNSBL में आपके आईपी à¤à¤¡à¥à¤°à¥‡à¤¸à¤•à¥‹ ओपन पà¥à¤°à¥‰à¤•à¥à¤¸à¥€à¤®à¥‡à¤‚ दरà¥à¤¶à¤¾à¤¯à¤¾ गया हैं।',
'sorbs_create_account_reason' => '{{SITENAME}} के DNSBL ने आपका आईपी à¤à¤¡à¥à¤°à¥‡à¤¸ ओपन पà¥à¤°à¥‹à¤•à¥à¤¸à¥€ करके सूचित किया हैं। आप खाता खोल नहीं सकतें।',
'cant-block-while-blocked' => 'आप खà¥à¤¦ ही अवरोधित हैं इसलिठइस समय आप औरों को अवरोधित नहीं कर सकते हैं।',
@@ -2833,6 +2906,7 @@ $1 को बाधà¥à¤¯ करने का कारण है: "$2"',
'thumbnail-more' => 'बड़ा करें',
'filemissing' => 'फ़ाईल मिली नहीं',
'thumbnail_error' => 'थंबनेल बनाने में तà¥à¤°à¥à¤Ÿà¤¿ हà¥à¤ˆ है: $1',
+'thumbnail_error_remote' => '$1 से तà¥à¤°à¥à¤Ÿà¤¿ सनà¥à¤¦à¥‡à¤¶: $2',
'djvu_page_error' => 'DjVu पृषà¥à¤  रेंजके बाहर हैं',
'djvu_no_xml' => 'DjVu फ़ाईलके लिये XML नहीं मिल पाया',
'thumbnail-temp-create' => 'असà¥à¤¥à¤¾à¤¯à¥€ थमà¥à¤¬à¤¨à¥‡à¤² फ़ाइल बनाने में असफल',
@@ -3132,11 +3206,25 @@ $1',
'minutes' => '{{PLURAL:$1|$1 minute|$1 minutes}}',
'hours' => '{{PLURAL:$1|$1 hour|$1 hours}}',
'days' => '{{PLURAL:$1|$1 day|$1 days}}',
+'weeks' => '{{PLURAL:$1|$1 सपà¥à¤¤à¤¾à¤¹}}',
'months' => '{{PLURAL:$1|महीना|महीने}}',
'years' => '{{PLURAL:$1|$1 वरà¥à¤·}}',
'ago' => '$1 पहले',
'just-now' => 'अभी-अभी',
+# Human-readable timestamps
+'hours-ago' => '$1 {{PLURAL:$1|घंटा|घंटे}} पहले',
+'minutes-ago' => '$1 {{PLURAL:$1|मिनट}} पहले',
+'seconds-ago' => '$1 {{PLURAL:$1|सॅकेंड}} पहले',
+'monday-at' => 'सोमवार को $1 बजे',
+'tuesday-at' => 'मंगलवार को $1 बजे',
+'wednesday-at' => 'बà¥à¤§à¤µà¤¾à¤° को $1 बजे',
+'thursday-at' => 'गà¥à¤°à¥‚वार को $1 बजे',
+'friday-at' => 'शà¥à¤•à¥à¤°à¤µà¤¾à¤° को $1 बजे',
+'saturday-at' => 'शनिवार को $1 बजे',
+'sunday-at' => 'रविवार को $1 बजे',
+'yesterday-at' => 'कल $1 बजे',
+
# Bad image list
'bad_image_list' => 'पà¥à¤°à¤¾à¤°à¥‚प इस पà¥à¤°à¤•à¤¾à¤° है:
@@ -3165,7 +3253,7 @@ $1',
* gpslongitude
* gpsaltitude',
-# EXIF tags
+# Exif tags
'exif-imagewidth' => 'चौडाई',
'exif-imagelength' => 'ऊà¤à¤šà¤¾à¤ˆ',
'exif-bitspersample' => 'पà¥à¤°à¤¤à¤¿ घटक बीटà¥à¤¸',
@@ -3342,7 +3430,7 @@ $1',
'exif-originalimageheight' => 'छवि की ऊà¤à¤šà¤¾à¤ˆ उभरा होने से पहले',
'exif-originalimagewidth' => 'छवि की चौड़ाई उभरा होने से पहले',
-# EXIF attributes
+# Exif attributes
'exif-compression-1' => 'अनकॉमà¥à¤ªà¥à¤°à¥‡à¤¸à¥à¤¸à¥à¤¡',
'exif-compression-3' => 'CCITT गà¥à¤°à¥à¤ª 3 फ़ैकà¥à¤¸ à¤à¤¨à¤•à¥‹à¤¡à¤¿à¤‚ग',
'exif-compression-4' => 'CCITT गà¥à¤°à¥à¤ª 4 फ़ैकà¥à¤¸ à¤à¤¨à¤•à¥‹à¤¡à¤¿à¤‚ग',
@@ -3653,7 +3741,6 @@ $5
# Separators for various lists, etc.
'semicolon-separator' => ';',
-'autocomment-prefix' => '-',
# Multipage image navigation
'imgmultipageprev' => '↠पिछला पृषà¥à¤ ',
@@ -3784,7 +3871,6 @@ $5
'version-other' => 'अनà¥à¤¯',
'version-mediahandlers' => 'मीडिया संचालक',
'version-hooks' => 'हूक',
-'version-extension-functions' => 'विसà¥à¤¤à¤¾à¤° पà¥à¤°à¤•à¤¾à¤°à¥à¤¯à¤¾à¤¤à¥à¤®à¤•à¤¤à¤¾',
'version-parser-extensiontags' => 'पारà¥à¤¸à¤° à¤à¤•à¥à¤¸à¥à¤Ÿà¥‡à¤‚शन टैग',
'version-parser-function-hooks' => 'पारà¥à¤¸à¤° कारà¥à¤¯ हूक',
'version-hook-name' => 'हूक नाम',
@@ -3798,12 +3884,10 @@ $5
'version-software-version' => 'अवतरण',
'version-entrypoints-header-url' => 'यू॰आर॰à¤à¤²',
-# Special:FilePath
-'filepath' => 'सञà¥à¤šà¤¿à¤•à¤¾ पथ',
-'filepath-page' => 'सञà¥à¤šà¤¿à¤•à¤¾:',
-'filepath-submit' => 'जाइà¤',
-'filepath-summary' => 'यह विशेष पृषà¥à¤  सञà¥à¤šà¤¿à¤•à¤¾ का पूरा पथ देता है।
-चितà¥à¤° पूरे रिज़ोलà¥à¤¯à¥‚शन के साथ दिखता हैं, अनà¥à¤¯ सञà¥à¤šà¤¿à¤•à¤¾ पà¥à¤°à¤•à¤¾à¤° उनके समà¥à¤¬à¤¨à¥à¤§à¤¿à¤¤ पà¥à¤°à¥‹à¤—à¥à¤°à¥‡à¤® डाइरेकà¥à¤Ÿà¤°à¥€ से आरमà¥à¤­ होते हैं।',
+# Special:Redirect
+'redirect-user' => 'सदसà¥à¤¯ आई॰डी',
+'redirect-revision' => 'पृषà¥à¤  अवतरण संखà¥à¤¯à¤¾',
+'redirect-file' => 'फ़ाइल नाम',
# Special:FileDuplicateSearch
'fileduplicatesearch' => 'फ़ाईल दà¥à¤µà¤¿à¤°à¤¾à¤µà¥ƒà¤¤à¥à¤¤à¤¿ खोजें',
@@ -3852,6 +3936,7 @@ $5
'tags' => 'वैध बदलाव चिपà¥à¤ªà¤¿à¤¯à¤¾à¤',
'tag-filter' => '[[Special:Tags|चिपà¥à¤ªà¥€]] छननी:',
'tag-filter-submit' => 'छननी',
+'tag-list-wrapper' => '([[Special:Tags|{{PLURAL:$1|टैग}}]]: $2)',
'tags-title' => 'चिपà¥à¤ªà¤¿à¤¯à¤¾à¤',
'tags-intro' => 'यह पृषà¥à¤  अरà¥à¤¥ सहित वह चिपà¥à¤ªà¤¿à¤¯à¤¾à¤ दरà¥à¤¶à¤¾à¤¤à¤¾ है जिनका कोई तंतà¥à¤°à¤¾à¤‚श किसी संपादन पर निशान लगाने के लिठइसà¥à¤¤à¥‡à¤®à¤¾à¤² कर सकता है।',
'tags-tag' => 'चिपà¥à¤ªà¥€ का नाम',
@@ -3893,6 +3978,9 @@ $5
'htmlform-submit' => 'जमा करें',
'htmlform-reset' => 'बदलाव पà¥à¤°à¤¾à¤¨à¥€ सà¥à¤¥à¤¿à¤¤à¤¿ पर लाà¤à¤',
'htmlform-selectorother-other' => 'अनà¥à¤¯',
+'htmlform-no' => 'नहीं',
+'htmlform-yes' => 'हाà¤',
+'htmlform-chosen-placeholder' => 'à¤à¤• विकलà¥à¤ª चà¥à¤¨à¥‡à¤‚',
# SQLite database support
'sqlite-has-fts' => '$1 पूरà¥à¤£ पाठ खोज समरà¥à¤¥à¤¨ के साथ',
diff --git a/languages/messages/MessagesHif_latn.php b/languages/messages/MessagesHif_latn.php
index e1df1935..ac292cb2 100644
--- a/languages/messages/MessagesHif_latn.php
+++ b/languages/messages/MessagesHif_latn.php
@@ -65,9 +65,6 @@ $messages = array(
'tog-shownumberswatching' => 'Ketna sadasya dekhe hai ke number dekhao',
'tog-oldsig' => 'Abhi ke signature:',
'tog-fancysig' => 'Signature ke wikitext ke rakam dekho (binaa automatic jorr se)',
-'tog-externaleditor' => 'Apne se bahaari editor ke kaam me lao (khaali chalaak logan khatir, computer me special settings ke jaruri hai. [//www.mediawiki.org/wiki/Manual:External_editors More information.])',
-'tog-externaldiff' => ' Apne se bahaari editor ke kaam me lao (khaali chalaak logan khatir, computer me special settings ke jaruri hai. [//www.mediawiki.org/wiki/Manual:External_editors More information.])',
-'tog-showjumplinks' => '"jump to" accessibility jorr ke laabu karo',
'tog-uselivepreview' => 'Jinda jhalak ke kaam me lao',
'tog-forceeditsummary' => 'Ek khali badlao waala summary ke likhe ke time hamse puchho',
'tog-watchlisthideown' => 'Hamaar badlao ke hamaar dhyaan suchi se lukao',
@@ -80,6 +77,8 @@ $messages = array(
'tog-diffonly' => 'Diff ke niche panna ke content ke nai dekhao',
'tog-showhiddencats' => 'Lukawal waala vibhag ke dekhao',
'tog-norollbackdiff' => 'Rollback kare ke baad diff ke mitae do',
+'tog-useeditwarning' => 'Jab ham koi panna se bina bachae nikaltaa hae, tab hamke warning do',
+'tog-prefershttps' => 'Logged in hoe pe secure connection ke kaam me lao',
'underline-always' => 'Sab time',
'underline-never' => 'Kabhi nai',
@@ -143,6 +142,18 @@ $messages = array(
'oct' => 'Oct',
'nov' => 'Nov',
'dec' => 'Dec',
+'january-date' => 'January $1',
+'february-date' => 'February $1',
+'march-date' => 'March $1',
+'april-date' => 'April $1',
+'may-date' => 'May $1',
+'june-date' => 'June $1',
+'july-date' => 'July $1',
+'august-date' => 'August $1',
+'september-date' => 'September $1',
+'october-date' => 'October $1',
+'november-date' => 'November $1',
+'december-date' => 'December $1',
# Categories related messages
'pagecategories' => '{{PLURAL:$1|Vibhag|Vibhag}}',
@@ -224,6 +235,7 @@ $messages = array(
'create-this-page' => 'Ii panna ke banao',
'delete' => 'Mitao',
'deletethispage' => 'Ii panna ke mitao',
+'undeletethispage' => 'Ii panna ke undelete karo',
'undelete_short' => '{{PLURAL:$1|ek badlao|$1 badlao}} ke pahile jaise karo',
'viewdeleted_short' => 'Dekho {{PLURAL:$1|ek mitawal badlao|$1 mitawal badlao}}',
'protect' => 'Bachao',
@@ -267,7 +279,7 @@ $1',
'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).
+# 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).
'aboutsite' => '{{SITENAME}} ke baare me',
'aboutpage' => 'Project:Ke baare me',
'copyright' => 'Agar duusra kaaran nai dewa gais hae, tab aap ii panna me likha gae chij ke aap $1 ke niche kaam me lae sakta hai.',
@@ -277,7 +289,6 @@ $1',
'disclaimers' => 'Jimmewari se chhutkaari',
'disclaimerpage' => 'Project:Saadharan jimmewari nai lo',
'edithelp' => 'Badlao pe madat',
-'edithelppage' => 'Help:Badle me',
'helppage' => 'Help:Madat',
'mainpage' => 'Pahila Panna',
'mainpage-description' => 'Pahila Panna',
@@ -354,17 +365,12 @@ Sahi khaas panna ke suchi [[Special:SpecialPages|{{int:specialpages}}]]pe mili.'
# General errors
'error' => 'Galti',
'databaseerror' => 'Database me galti hai',
-'dberrortext' => 'Database ke khoj me syntax error hoe gais hae.
-Iske matlab ii hoe sake hae ki saait software me bug hoi.
-Pahile waala database ke khoj ke kosis rahaa:
-<blockquote><code>$1</code></blockquote>
-"<code>$2</code>" function ke bhitar se.
-Database ke galti sandes rahaa "<samp>$3: $4</samp>".',
-'dberrortextcl' => 'Database ke khoj me syntax error hoe gais hae.
-Pahile waala database ke khoj ke kosis rahaa:
-"$1"
-"$2" function ke bhitar se.
-Database ke galti sandes rahaa "$3: $4"',
+'databaseerror-text' => 'Database ke khoj me kuchh karrbarr bhais hae
+Ii saait software me ek bug ke indicate kare hae.',
+'databaseerror-textcl' => 'Database ke khoj me kuchh garrbarri hoe gais hae.',
+'databaseerror-query' => 'Khoj:$1',
+'databaseerror-function' => 'Kaam: $1',
+'databaseerror-error' => 'Galti: $1',
'laggedslavemode' => 'Chetawni: Panna me nawaa badlao sait nai hoi.',
'readonly' => 'Database band hai',
'enterlockreason' => 'Band kare ke kaaran likho, aur ii bhi likho ki kab khola jaai.',
@@ -397,6 +403,7 @@ Iske, URL ke likh ke, koi administrator ke report karo.',
'cannotdelete-title' => 'Panna "$1" ke mitae nai saktaa hae',
'delete-hook-aborted' => 'Mitae ke kisis ke hook rok diis hae.
Uu koi kaaran nai dis hae.',
+'no-null-revision' => 'Panna "$1" ke khatir nawaa null badlao nai banae sakaa hae',
'badtitle' => 'Kharaab title',
'badtitletext' => 'Jon panna aap mangta hai uske page title invalid, galat, nai to an incorrectly linked inter-language or inter-wiki title. Isme sait ek yah jaada character hoi jon ki title me nai kaam me lawa jae sake hai.',
'perfcached' => 'Niche likha data ke cache karaa gais hai aur sait purana hoi. Jaada se jaada {{PLURAL:$1|ek result |$1 results}} cache me hae.',
@@ -418,12 +425,15 @@ Sab wiki me anuwaad ke jorre nai to badle ke khatir, meharbaani kar ke [//transl
'editinginterface' => "'''Chetawani:''' Aap ek panna ke badaltaa hai jon ki software ke interface text dewe hae.
Ii panna me badlao ke asar duusra sadasya ke interface pe bhi hoi.
Translation khatir [//translatewiki.net/ translatewiki.net], the MediaWiki localisation project, ke kaam me lao.",
-'sqlhidden' => '(SQL query lukawal hai)',
'cascadeprotected' => 'Ii panna ke badlao se bachawa gais hai, kahe ki iske {{PLURAL:$1|panna, jon ki|panna, jon ki}} surakchhit hae "cascading" option turned on ke saathe me rakkhaa gais hai:
$2',
'namespaceprotected' => "Aap ke paas '''$1''' namespace me panna ke badle ke adhikar nai hai.",
'customcssprotected' => 'Aap ke ii CSS panna ke badle ke ijaajat nai hae, kaahe ki isme duusra sadasya ke personal settings hae.',
'customjsprotected' => 'Aap ke ii JavaScript panna ke badle ke ijaajat nai hae, kaahe ki isme duusra sadasya ke personal settings hae.',
+'mycustomcssprotected' => 'Ii panna ke badle ke khatir aap ke lage iajaajat nai hae.',
+'mycustomjsprotected' => 'Sadasya ke naam',
+'myprivateinfoprotected' => 'Aap ke aapan private jaankari ke badle ke ijaajat nai hae.',
+'mypreferencesprotected' => 'Aap ke aapan preferences ke badle ke ijaajat nai hae.',
'ns-specialprotected' => 'Khaas panna ke badla nai jae sake hai.',
'titleprotected' => "Ii title ke banae se [[User:$1|$1]] rokis hai.
Iske kaaran hai ''$2''.",
@@ -447,10 +457,19 @@ Yaad rakhna ki kuch panna wahi rakam se dekhai jaise ki aap log in bhaya hai, ja
'welcomecreation-msg' => 'Aap ke account banae dewa gais hai.
Aapan [[Special:Preferences|{{SITENAME}} pasand]] ke badle nai bhulna.',
'yourname' => 'Username:',
+'userlogin-yourname' => 'Aapan username ke likho',
+'userlogin-yourname-ph' => 'Password',
+'createacct-another-username-ph' => 'Username ke likho',
'yourpassword' => 'Password:',
+'userlogin-yourpassword' => 'Aapan password ke likho',
+'userlogin-yourpassword-ph' => 'Aapan password ke likho',
+'createacct-yourpassword-ph' => 'Aapan password ke likho',
'yourpasswordagain' => 'Password fir se type karo:',
+'createacct-yourpasswordagain' => 'Aapan password ke confirm karo',
+'createacct-yourpasswordagain-ph' => 'Hame lagged in rahan do',
'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',
+'userlogin-remembermypassword' => 'Secure connection ke kaam me lao',
+'userlogin-signwithsecure' => 'Secure connection ke kaam me lao',
'yourdomainname' => 'Aap ke domain:',
'password-change-forbidden' => 'Aap ii wiki me password nai badle saktaa hae.',
'externaldberror' => 'Koi bahaari database authentication error hai, nai to aap ke bahaari account badle ke adhikar nai hai.',
@@ -462,18 +481,41 @@ Aapan [[Special:Preferences|{{SITENAME}} pasand]] ke badle nai bhulna.',
'logout' => 'Log out',
'userlogout' => 'Sadasya logout',
'notloggedin' => 'Aap logged in nai hai',
+'userlogin-noaccount' => 'Aap ke lage account hae?',
+'userlogin-joinproject' => '{{SITENAME}} ke join karo',
'nologin' => "Account nai hai? '''$1'''.",
'nologinlink' => 'Nawaa account banao',
'createaccount' => 'Nawaa account banao',
'gotaccount' => "Aap ke pas pahile se account hai ki nai? '''$1'''.",
'gotaccountlink' => 'Log in',
'userlogin-resetlink' => 'Ka aap aapan login kare waala jaankari ke bhulae gaya hae?',
+'userlogin-resetpassword-link' => 'Aapan password ke reset karo',
+'helplogin-url' => 'Help:Logging in',
+'userlogin-helplink' => '[[{{MediaWiki:helplogin-url}}|Aap ke login khatir madat]]',
+'createacct-join' => 'Aapan jankari niche likho',
+'createacct-another-join' => 'Account ke baare me jaankari niche likho',
+'createacct-emailrequired' => 'Email address',
+'createacct-emailoptional' => 'Email address (jaruri nai hae)',
+'createacct-email-ph' => 'Aapan mail address ke likho',
+'createacct-another-email-ph' => 'Email address ke likho',
'createaccountmail' => 'Ek temporary password ke kaam me laao aur iske batawa gais Email pe bhej do',
+'createacct-realname' => 'Aslii naam (jaruri nai hae)',
'createaccountreason' => 'Kaaran:',
+'createacct-reason' => 'Kaaran',
+'createacct-reason-ph' => 'Aap ke ii account ke banae ke kaaran',
+'createacct-captcha' => 'Security check',
+'createacct-imgcaptcha-ph' => 'Niche dekhae waala text ke likho',
+'createacct-submit' => 'Aapan account banao',
+'createacct-another-submit' => 'Duusra account banao',
+'createacct-benefit-heading' => 'Aap ke rakam log {{SITENAME}} ke banain hae.',
+'createacct-benefit-body1' => '{{PLURAL:$1|badlao}}',
+'createacct-benefit-body2' => '{{PLURAL:$1|panna}}',
+'createacct-benefit-body3' => 'haali ke {{PLURAL:$1|yogdaan de waala}}',
'badretype' => 'Jon duuno password aap likha hai uu ek rakam nai hae.',
'userexists' => 'Ii sadasya ke naam aur koi ke hae.
Duusra sadasya ke naam ke choose karo.',
'loginerror' => 'Login me kuchh wrong hae',
+'createacct-error' => 'Account ke banae me galti',
'createaccounterror' => 'Account ke nai banae sakaa hae: $1',
'nocookiesnew' => 'Aap ke account banae dewa gais hae lekin aap logged in nai hae.
{{SITENAME}} me sadasya ke login khatir cookies hae.
@@ -534,11 +576,13 @@ Meharbaani kar ke achchha address ke enter karo nai to uu field ke khali kar do.
Aap ke chaahi ki aap login kar ke password ke badal do.
Agar ii account galti se banaa hai tab ii sandes ke ignore kar do.',
'usernamehasherror' => 'Sadasya ke naam me hash akchhar ke nai kaam me lawa jaae sake hae',
-'login-throttled' => 'Aap bahut jaada dafe ii account ke password ke enter kare ke kosis karaa hai.
-Thora deri baad fir se kosis karna.',
+'login-throttled' => 'Aap bahut jaada dafe ii account ke password ke enter kare ke kosis karaa hae.
+$1 talak wait kar ke fir se try karo.',
'login-abort-generic' => 'Aap ke login nai chalaa - Aborted',
'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.',
+'createacct-another-realname-tip' => 'Aslii naam ke jaruri nai hae.
+Agar aap iske diya hae tab iske aapke kaam ke attribute kare ke khatir kaam me lawa jaai.',
# Email sending
'php-mail-error-unknown' => 'PHP ke mail() function me koi anjaan kharaabi hae',
@@ -555,7 +599,7 @@ Login khatam kare khatir, aap ke nawaa password set kare ke parri hian:',
'newpassword' => 'Nawaa password:',
'retypenew' => 'Password fir se type karo:',
'resetpass_submit' => 'Password ke set kar ke login karo',
-'resetpass_success' => 'Aap ke password ke safalta se badal dewa gais hai! Aap ke ab login karaa jaae hai...',
+'changepassword-success' => 'Aap ke password ke safalta se badal dewa gais hai!',
'resetpass_forbidden' => 'Password nai badlaa jaae sake hai',
'resetpass-no-info' => 'Ii panna ke sidha access kare ke khatir aap ke logged in rahe ke parri.',
'resetpass-submit-loggedin' => 'Password ke badlo',
@@ -567,10 +611,11 @@ Sait aap password ke safalta se badal sia hoga nai to nawaa temporary password k
# Special:PasswordReset
'passwordreset' => 'Password ke badlo',
-'passwordreset-text' => 'Password ke reset kare ke khatir ii form ke bharo.',
+'passwordreset-text-one' => 'Aapan password ke reset kare ke khatir ii form ke bharo.',
+'passwordreset-text-many' => '{{PLURAL:$1|Aapan password ke reset kare ke khatir ek field me likho}}',
'passwordreset-legend' => 'Password ke badlo',
'passwordreset-disabled' => 'II wiki me password ke badle ke ijaajat nai hae.',
-'passwordreset-pretext' => '{{PLURAL:$1||Niche ke ek data ke likho}}',
+'passwordreset-emaildisabled' => 'Ii wiki me email ke band kar dewa gais hae.',
'passwordreset-username' => 'Sadasya ke naam:',
'passwordreset-domain' => 'Domain:',
'passwordreset-capture' => 'Banawa gais e-mail ke dekho',
@@ -593,7 +638,7 @@ Aap ke chaahi ki aap login kar ke ek nawaa password banao. Agar aur koi ii requ
Kuchh din ke khatir password: $2',
'passwordreset-emailsent' => 'Aap ke password yaad karae ke khatir ek e-mail ke bhej dewa gais hae.',
'passwordreset-emailsent-capture' => 'Ek password yaad karae waala e-mail, jiske niche dekhawa jaawe hae, ke bhej dewa gais hae.',
-'passwordreset-emailerror-capture' => 'Ek yaad karae waala e-mail ke banawa gais hae, jiske niche dekhawa jaawe hae, lekin jiske bheje nai jawa sake hae: $1',
+'passwordreset-emailerror-capture' => 'Ek password yaad karae waala e-mail ke banawa gais hae, jiske niche dekhawa jaawe hae, lekin jiske {{GENDER:$2|user}} ke lage bheje nai jawa sake hae: $1',
# Special:ChangeEmail
'changeemail' => 'E-mail address ke badlo',
@@ -607,6 +652,19 @@ Kuchh din ke khatir password: $2',
'changeemail-submit' => 'E-mail badlo',
'changeemail-cancel' => 'Kaat do',
+# Special:ResetTokens
+'resettokens' => 'Token ke reset karo',
+'resettokens-text' => 'Aap aapan private data pe access roke ke khatir token ke reset kare saktaa hae.
+
+Aap ke ii kare ke chaahi agar aap galti se ii jaankari ke aur koi ke de diya hae nai to aap ke account ke bare me aur koi ke pataa hae.',
+'resettokens-no-tokens' => 'Reset kare ke jhatir koi token nai hae.',
+'resettokens-legend' => 'Token ke reset karo',
+'resettokens-tokens' => 'Chinh (token)',
+'resettokens-token-label' => '$1 (abhi ke value: $2)',
+'resettokens-watchlist-token' => 'Dhyan suchi ke web feed token (Atom/RSS) of [[Special:Watchlist|changes to pages on your watchlist]]',
+'resettokens-done' => 'Token ke reset kar dewa gais hae.',
+'resettokens-resetbutton' => 'Chuna gais token ke reset karo',
+
# Edit page toolbar
'bold_sample' => 'Motaa text',
'bold_tip' => 'Motaa text',
@@ -810,12 +868,15 @@ Ii koi kaaran nai diis hai.',
Janae hai ki iske koi mitae dii hai.',
'edit-conflict' => 'Badlao me conflict hai.',
'edit-no-change' => 'Aap ke badle ke kosis ke ignore kar dewa gais hai, kahe ki text ke badla nai gais hai.',
+'postedit-confirmation' => 'Aap ke badlao ke bachae lewa gais hae.',
'edit-already-exists' => 'Nawaa panna nai banae sakaa hai.
Ii naam ke panna abhi hai.',
'defaultmessagetext' => 'Default message text',
'content-failed-to-parse' => '$1 model ke khatir $2 ke parse nai kare sakaa hae: $3',
'invalid-content-data' => 'Panna me likha gais chij right nai hae',
'content-not-allowed-here' => 'Panna [[$2]] me "$1" likhe ke ijaajat nai hae',
+'editwarning-warning' => 'Ii panna ke chore se jetna changes aap karaa hae nai save hoi.
+Agar aap logged in hae, tab aap ii chetauni ke "Editing" vibhag me disable kare saktaa hae.',
# Content models
'content-model-wikitext' => 'wikitext',
@@ -851,6 +912,7 @@ Niche ke comparison ke check kar ke dekho ki aap yahi kare mangta rahaa, aur fir
'undo-failure' => 'Ii badalo ke paile jaise nai karaa jaae sake hai kahe ki biich me badlao hai.',
'undo-norev' => 'Ii badlao ke pahile jaise nai karaa jaae sake hai kahe ki ii badalo abhi nai hai nai to iske mitae dewa gais hai.',
'undo-summary' => '$1 badlao [[Special:Contributions/$2|$2]] se, ke pahile jaise karo ([[User talk:$2|Talk]])',
+'undo-summary-username-hidden' => 'Hidden sadasya ke badalo $1 ke pahile jaise karo',
# Account creation failure
'cantcreateaccounttitle' => 'Account nai banae sakta hai',
@@ -1031,6 +1093,7 @@ Ii baat ke dhyan me rakhna ki navigation jorr ke kaam me laae se ii column reset
'compareselectedversions' => 'Chuna gae version ke compare karo',
'showhideselectedversions' => 'Chuna gae versions ke dekhao/lukao',
'editundo' => 'Pahile jaise kar do',
+'diff-empty' => '(ek rakam)',
'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.)',
'difference-missing-revision' => 'Ii badlao ($1) {{PLURAL:$2|was|were}} pe {{PLURAL:$2|One revision|$2 revisions}} nai pawa gais hae
@@ -1057,7 +1120,6 @@ Iske baare me aur jaankari [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAM
'searchmenu-legend' => 'Khoje ke option',
'searchmenu-exists' => "'''Ii wiki me \"[[\$1]]\" naam ke panna hai'''",
'searchmenu-new' => "'''Ii wiki me \"[[:\$1]]\" panna ke banao!'''",
-'searchhelp-url' => 'Help:Madat',
'searchmenu-prefix' => '[[Special:PrefixIndex/$1|Ii prefix ke panna ke browse karo]]',
'searchprofile-articles' => 'Content panna',
'searchprofile-project' => 'Madat aur Project panna',
@@ -1101,15 +1163,7 @@ Aapan query ke ''all:'' se suruu kar ke visay suchi me khojo (including talk pag
'searchdisabled' => '{{SITENAME}} me abhi khoje ke anumati nai hai.
Aap tab tak Google se khoje sakta hai.
Yaad rakhna ki uu log ke {{SITENAME}} ke index saait purana hoi.',
-
-# Quickbar
-'qbsettings' => 'Quickbar',
-'qbsettings-none' => 'Koi nai',
-'qbsettings-fixedleft' => 'Left me fixed hai',
-'qbsettings-fixedright' => 'Right me fixed hai',
-'qbsettings-floatingleft' => 'Baaen or baho',
-'qbsettings-floatingright' => 'Daaen or baho',
-'qbsettings-directionality' => 'Banae dewa gais hae, lekin ii aap ke bhasa ke script directionality ke uppar nibhar hae',
+'search-error' => 'Khoje ke tim ek error hoe gais hae:$1',
# Preferences page
'preferences' => 'Pasand',
@@ -1143,7 +1197,6 @@ Yaad rakhna ki uu log ke {{SITENAME}} ke index saait purana hoi.',
'resetprefs' => 'Binaa bachawa gias badlao ke mitao',
'restoreprefs' => 'Sab default settings ke pahile jaise karo (sab vibhag me)',
'prefs-editing' => 'Badaltaa hai',
-'prefs-edit-boxsize' => 'Edit window ke size.',
'rows' => 'Line:',
'columns' => 'Column:',
'searchresultshead' => 'Khojo',
@@ -1154,9 +1207,9 @@ Yaad rakhna ki uu log ke {{SITENAME}} ke index saait purana hoi.',
'recentchangesdays-max' => '(sab se jaada $1 {{PLURAL:$1|din|din}})',
'recentchangescount' => 'Default se ketnaa badlao ke dekhae ke chaahi:',
'prefs-help-recentchangescount' => 'Isme hai haali ke badlao, panna ke itihaas aur loga.',
-'prefs-help-watchlist-token' => 'Ii jaankari me gupt sabd bhare se aap ke dhyan suchi ke khatir ek RSS feed ban jaai.
-Koi bhi jan, jon ki ii gupt sabd ke jaanat hoi, aap ke dhyan suchi ke parre saki, tab aap achchha se gupt sabd ke sochna.
-Hian pe ek, apne se banaa sabd hae, jiske aap kaam me laae saktaa hae: $1',
+'prefs-help-watchlist-token2' => 'Aap ke dhyan suchi ke web feed ke ii secret key hae.
+Aur koi agar iske bare me jaane hae aap ke dhyan suchi ke parrhae sake hae, tab iske aur ki ke nai dena.
+[[Special:ResetTokens|Agar aap iske reset kare mangtaa hae tab hian pe click karo]].',
'savedprefs' => 'Aap ke pasand ke save kar lewa gais hai.',
'timezonelegend' => 'Time ke zone:',
'localtime' => 'Sthaniye samay:',
@@ -1187,7 +1240,6 @@ Hian pe ek, apne se banaa sabd hae, jiske aap kaam me laae saktaa hae: $1',
'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:',
-'prefs-textboxsize' => 'editing window ke size',
'youremail' => 'E-mail:',
'username' => '{{GENDER:$1|Sadasya ke naam}}:',
'uid' => '{{GENDER:$1|Sadasya}} ID:',
@@ -1218,6 +1270,8 @@ Iske $1 {{PLURAL:$1|character|characters}} se kamti rahe ke chaahi.',
'prefs-dateformat' => 'Tarik ke format',
'prefs-timeoffset' => 'Time ke offset',
'prefs-advancedediting' => 'General',
+'prefs-editor' => 'Sampaadak',
+'prefs-preview' => 'Preview',
'prefs-advancedrc' => 'Uchchaa pasand',
'prefs-advancedrendering' => 'Uchchaa pasand',
'prefs-advancedsearchoptions' => 'Uchchaa pasand',
@@ -1225,7 +1279,9 @@ Iske $1 {{PLURAL:$1|character|characters}} se kamti rahe ke chaahi.',
'prefs-displayrc' => 'Choice dekhao',
'prefs-displaysearchoptions' => 'Choice dekhao',
'prefs-displaywatchlist' => 'Choice dekhao',
+'prefs-tokenwatchlist' => 'Chinh (token)',
'prefs-diffs' => 'Farka',
+'prefs-help-prefershttps' => 'Aap ke agla login pe ii preferences effect me aai.',
# User preference: email validation using jQuery
'email-address-validity-valid' => 'E-mail address kanuni hae',
@@ -1252,6 +1308,8 @@ Iske $1 {{PLURAL:$1|character|characters}} se kamti rahe ke chaahi.',
'userrights-notallowed' => 'Aap ke account ke user rights de aur hatae ke adhikar nai hai.',
'userrights-changeable-col' => 'Groups jiske aap badle sakta hai',
'userrights-unchangeable-col' => 'Groups jiske aap badle nai sakta hai',
+'userrights-conflict' => 'User right me conflict hae. Meharbaani kar ke aapan balao ke fir se apply karo.',
+'userrights-removed-self' => 'App appan ijaajat ke hatae dia hae. Iske natija ii hoi ki app ii panna ke ab nai access kare sakegaa',
# Groups
'group' => 'Jhund:',
@@ -1317,11 +1375,19 @@ Iske $1 {{PLURAL:$1|character|characters}} se kamti rahe ke chaahi.',
'right-proxyunbannable' => 'Proxies ke automatic blocks ke bypass karo',
'right-unblockself' => 'Apne ke unblock karo',
'right-protect' => 'Protection level ke badlo aur cascade-protected panna ke badlo',
-'right-editprotected' => 'Bachawa gais panna ke badlo (without cascading protection)',
+'right-editprotected' => 'Badla gais panna ke "{{int:protect-level-sysop}}" ke rakam bachawa gais hae',
+'right-editsemiprotected' => 'Badla gais panna ke "{{int:protect-level-autoconfirmed}}" ke rakam bachawa gais hae',
'right-editinterface' => 'User interface ke badlo',
'right-editusercssjs' => 'Duusra sadsya ke CSS aur JS files ke badlo',
'right-editusercss' => 'Duusra sadsya ke CSS files ke badlo',
'right-edituserjs' => 'Duusra sadsya ke JS files ke badlo',
+'right-editmyusercss' => 'Aapan CSS files ke badlo',
+'right-editmyuserjs' => 'Aapan JacaScript file ke edit karo',
+'right-viewmywatchlist' => 'Appan dhyan suchi ke dekho',
+'right-editmywatchlist' => 'Aapan dhyan suchi ke edit karo. Note karna ki app ke kuchh action bina ii rights ke nawaa panna jorri.',
+'right-viewmyprivateinfo' => 'Aapn private data ke dekho (jaise ki email address, aslii naam)',
+'right-editmyprivateinfo' => 'Aapn private data ke badlo (jaise ki email address, aslii naam)',
+'right-editmyoptions' => 'Aapan preferences ke badlo',
'right-rollback' => 'Jaldi se ek khaas panna ke pichhla sadasya ke badlao ke ulta kar do',
'right-markbotedits' => 'Rolled-back edits ke bot edits mark karo',
'right-noratelimit' => 'Rrate limits se koi asar nai hai',
@@ -1383,12 +1449,17 @@ Iske $1 {{PLURAL:$1|character|characters}} se kamti rahe ke chaahi.',
'action-userrights-interwiki' => 'duusra wiki ke sadasya ke adhikar ke badlo',
'action-siteadmin' => 'database ke band karo nai to kholo',
'action-sendemail' => 'E-mail bhejo',
+'action-editmywatchlist' => 'Aapan dhyan suchi ke badlo',
+'action-viewmywatchlist' => 'Aapan dhyan suchi ke dekho',
+'action-viewmyprivateinfo' => 'Aapan private jaankari ke dekho',
+'action-editmyprivateinfo' => 'Aapan private jaankari ke badlo',
# Recent changes
'nchanges' => '$1 {{PLURAL:$1|badlao|badlao}}',
'recentchanges' => 'Nawaa badlao',
'recentchanges-legend' => 'Nawaa badlao options',
'recentchanges-summary' => 'Wiki me ii panna ke nawaa badlao pe dhyan rakho.',
+'recentchanges-noresult' => 'Ii criteria ke match kare waala ii period me koi badlao nai hae.',
'recentchanges-feed-description' => 'Abhi haali me bhae ii wiki ke feed me ke track karo.',
'recentchanges-label-newpage' => 'Ii badlao ek nawaa panna banais hae',
'recentchanges-label-minor' => 'Ii ek chhota badlao hae',
@@ -1425,7 +1496,6 @@ Iske $1 {{PLURAL:$1|character|characters}} se kamti rahe ke chaahi.',
'recentchangeslinked-feed' => 'Panna ke jurraa badlao',
'recentchangeslinked-toolbox' => 'Panna ke jurraa badlao',
'recentchangeslinked-title' => '"$1" ke badlao',
-'recentchangeslinked-noresult' => 'Linked pages me ii time ke bhitar koi changes nai bhae.',
'recentchangeslinked-summary' => "Ii panna pahile waala badlao jon panna hian pe jurra hae ke suchi de hae (nai to vises vibhag ke sadasya).
Panna jon [[Special:Watchlist|aap ke dhyan suchi]] me hae '''mota''' kara gais hae.",
'recentchangeslinked-page' => 'Panna ke naam:',
@@ -1437,7 +1507,7 @@ Panna jon [[Special:Watchlist|aap ke dhyan suchi]] me hae '''mota''' kara gais
'reuploaddesc' => 'Upload ke cancel kar ke upload form pe lauto',
'upload-tryagain' => 'Badla gais file ke description bhejo',
'uploadnologin' => 'Aap abhi loged in nai hai',
-'uploadnologintext' => 'Aap ke [[Special:UserLogin|logged in]] kare ke chaahi, file upload kare ke khatir.',
+'uploadnologintext' => 'Aap ke file upload kare ke khatir $1 kare ke parri.',
'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',
@@ -1655,7 +1725,6 @@ Puura surakchha ke khatir, img_auth.php ke band kar dewa gais hae.',
'http-read-error' => 'HTTP ke parrhe me galti hae',
'http-timed-out' => 'HTTP ke khatir time nai hae.',
'http-curl-error' => 'URL ke laawe me galti hoe gais hae: $1',
-'http-host-unreachable' => 'URL pahunche nai sakaa hae',
'http-bad-status' => 'HTTP ke maange ke time kuch garrbarr hoe gais hae: $1 $2',
# Some likely curl errors. More could be added from <http://curl.haxx.se/libcurl/c/libcurl-errors.html>
@@ -1808,17 +1877,13 @@ Templates ke delete kare se pahile duusra links ke bhi check kare ke nai bhulna.
'statistics-users-active-desc' => 'Sadasya jon ki pichhle {{PLURAL:$1|din|$1 din}} me kuchh karin hai.',
'statistics-mostpopular' => 'Sab se jaada dekha gae panna',
-'disambiguations' => 'Garrbarri ke sudhare waala panna',
-'disambiguationspage' => 'Template:disambig',
-'disambiguations-text' => "Niche ke panna '''disambiguation panna''' se link hoe hai.
-Saait isse aur achchha panna se link hoi. <br />
-Ek panna ke disambiguation panna maana jaae hae jab ki ii ek template ke kaam me laae hae jon ki [[MediaWiki:Disambiguationspage]] se link hoe hae.",
-
'pageswithprop' => 'Panna, aapan property ke saathe',
'pageswithprop-legend' => 'Panna, aapan poperty ke saathe',
'pageswithprop-text' => 'Ii panaa, uu panna ke list kare hae jon ki koi khaas panna ke property ke use kare hae.',
'pageswithprop-prop' => 'Property ke naam:',
'pageswithprop-submit' => 'Jaao',
+'pageswithprop-prophidden-long' => 'lamba text property value hidden ($1 kilobytes)',
+'pageswithprop-prophidden-binary' => 'binary property ke hidden value ($1 kilobytes)',
'doubleredirects' => 'Dugna redirects',
'doubleredirectstext' => 'Ii panna uu panna ke suchi de hai jon ki duusra redirect panna pe redirect kare hai.
@@ -1876,6 +1941,7 @@ Sab row me pahila aur duusra redirect ke jorr hae, aur isme duusra redirect ke n
'mostrevisions' => 'Sab se jaada badlao waala panna',
'prefixindex' => 'Sab panna jisme prefix index hai',
'prefixindex-namespace' => 'Sab panna jisme prefix ($1 namespace)hae',
+'prefixindex-strip' => 'List me se prefix ke strip karo',
'shortpages' => 'Chhota panna',
'longpages' => 'Lamba panna',
'deadendpages' => 'Jon panna se koi jurre nai hai',
@@ -2068,10 +2134,9 @@ Ii panna ke aage ke badlao aur usse jurra baat waala panna ki suchi hian pe hae.
'unwatchthispage' => 'Ab dhyan nai rakkho',
'notanarticle' => 'Ii content panna nai hai',
'notvisiblerev' => 'Badlao ke mitae dewa gais hai',
-'watchnochange' => 'Aap ke koi bhi dhyan me rakkhaa gae chij ke ii time me badla nai gais hai.',
'watchlist-details' => '{{PLURAL:$1|$1 panna|$1 panna}} pe dhyan dewa jae hai, baat waala panna ke chhorr ke.',
-'wlheader-enotif' => '* E-mail notification ke enable kar dewa gais hai.',
-'wlheader-showupdated' => "* Panna jiske aap ke pichhla visit ke ke baad badal dewa gais hia ke '''bold''' me dekhawa gais hai",
+'wlheader-enotif' => 'E-mail notification ke enable kar dewa gais hai.',
+'wlheader-showupdated' => "Panna jiske aap ke pichhla visit ke ke baad badal dewa gais hia ke '''bold''' me dekhawa jaawe hai.",
'watchmethod-recent' => 'Dhyan me rakkhaa gais panna ke nawaa badlao ke check karaa jaawe hai',
'watchmethod-list' => 'dhyan me rakkha gais panna ke nawaa badlao ke khatir check karaa jaawe hai',
'watchlistcontains' => 'Aap ke dhyan suchi me $1 {{PLURAL:$1|panna|panna}} hai.',
@@ -2493,15 +2558,13 @@ Saait iske pahile khol dewa gais hoi.',
Lekin iske, as part of the range $2, block karaa gais hai, jiske unblock karaa jaawe sake hai.',
'ip_range_invalid' => 'IP ke range me galti hai.',
'ip_range_toolarge' => '/$1 se barraa range blocks ke ijajat nai hae.',
-'blockme' => 'Ham ke roko',
'proxyblocker' => 'Proxy roke waala',
-'proxyblocker-disabled' => 'Ii function pe rukawat hai.',
'proxyblockreason' => 'Aap ke IP address ke block kar dewa gais hai kahe ki ii ek open proxy hai.
Meharbaani kar ke aap aapan Internet service provider, nai to tech support, ke contact kar ke ii serious security problem ke baare me batao.',
-'proxyblocksuccess' => 'Hoe gais hai.',
'sorbsreason' => 'DNSBL used by {{SITENAME}} me aap ke IP address ke as an open proxy list karaa gais hai.',
'sorbs_create_account_reason' => 'DNSBL used by {{SITENAME}} me aap ke IP address ke as an open proxy list karaa gais hai.
Aap ke ek account banae ke ijajat nai hai',
+'xffblockreason' => 'Ek IP address jon ki X-Forwarded-For header me hae, chaahe aap ke nai to jon proxy server ke aap use kartaa hae ke, ke block kar dewa gais hae. Suruu waala block kare ke kaaran rahaa:$1',
'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.',
@@ -2666,6 +2729,8 @@ Agar aap generic MediaWiki localisation ke yogdaan de mangtaa hai tab meharbani
'thumbnail-more' => 'Barraa karo',
'filemissing' => 'File missing',
'thumbnail_error' => 'Thumbnail banae me galti hoe gais: $1',
+'thumbnail_error_remote' => 'Error ke sandes from $1:
+$2',
'djvu_page_error' => 'DjVu panna range me nai hae',
'djvu_no_xml' => ' DjVu file ke XML ke nai paawe sakaa hae',
'thumbnail-temp-create' => 'Temporary thumbnail file ke nai banae sakaa hae',
@@ -2963,11 +3028,25 @@ Iske execute kare se aap ke system me garrbarr hoe sake hae.",
'minutes' => '{{PLURAL:$1|$1 second|$1 seconds}}',
'hours' => '{{PLURAL:$1|$1 ghanta}}',
'days' => '{{PLURAL:$1|$1 din}}',
+'weeks' => '{{PLURAL:$1|$1 haftaa}}',
'months' => '{{PLURAL:$1|$1 mahina}}',
'years' => '{{PLURAL:$1saal}}',
'ago' => '$1 pahile',
'just-now' => 'ekdam abhi',
+# Human-readable timestamps
+'hours-ago' => '$1 {{PLURAL:$1|ghanta}} ago',
+'minutes-ago' => '$1 {{PLURAL:$1|minute}} bhais',
+'seconds-ago' => '$1 {{PLURAL:$1|second}} bhais',
+'monday-at' => 'Sombar ke $1 baje',
+'tuesday-at' => 'Mangar ke $1 baje',
+'wednesday-at' => 'Budh ke $1 baje',
+'thursday-at' => 'Bif ke $1 baje',
+'friday-at' => 'Suk ke $1 baje',
+'saturday-at' => 'Sanichar ke $1 baje',
+'sunday-at' => 'Etwaar ke $1 baje',
+'yesterday-at' => 'Kal $1 baje',
+
# Bad image list
'bad_image_list' => 'Format ii rakam hai:
@@ -2994,7 +3073,7 @@ Wahii line pe aur koi jorr exception consider karaa jai i.e. jahaan pe panna sak
* gpslongitude
* gpsaltitude',
-# EXIF tags
+# Exif tags
'exif-imagewidth' => 'Chaurrai',
'exif-imagelength' => 'Unchai',
'exif-bitspersample' => 'Bits per component',
@@ -3172,7 +3251,7 @@ Wahii line pe aur koi jorr exception consider karaa jai i.e. jahaan pe panna sak
'exif-originalimageheight' => 'Crop kare se pahile, chaapa ke uunchai',
'exif-originalimagewidth' => 'Crop kare se pahike, chhapa ke churrai',
-# EXIF attributes
+# Exif attributes
'exif-compression-1' => 'Bina compres karaa gais',
'exif-compression-2' => 'CCITT Group 3 1-Dimensional Modified Huffman run length ke encoding',
'exif-compression-3' => 'CCITT Group 3 fax ke encoding',
@@ -3542,9 +3621,6 @@ You can also [[Special:EditWatchlist/raw|edit the raw list]].',
'version-other' => 'Duusra',
'version-poweredby-others' => 'duusra waala',
-# Special:FilePath
-'filepath-submit' => 'Jaao',
-
# Special:FileDuplicateSearch
'fileduplicatesearch-filename' => 'File ke naam:',
'fileduplicatesearch-submit' => 'Khojo',
diff --git a/languages/messages/MessagesHil.php b/languages/messages/MessagesHil.php
index 7b38419a..1c611e35 100644
--- a/languages/messages/MessagesHil.php
+++ b/languages/messages/MessagesHil.php
@@ -48,9 +48,6 @@ $messages = array(
'tog-shownumberswatching' => 'Ipakita ang numero sang mga nagalantaw nga manug-gamit',
'tog-oldsig' => 'Nagapabilin nga pirma:',
'tog-fancysig' => 'Tratoha ang pirma bilang wikitext (wala sang tabid nga dayon)',
-'tog-externaleditor' => 'Gamiton dayon ang pang-guha nga manug-ilis (para sa mga sagad lamang, nagakinahanglan sang espesyal nga pagkay-o sa imo computer. [//www.mediawiki.org/wiki/Manual:External_editors Mas madamo pa nga impormasyon.])',
-'tog-externaldiff' => 'Gamiton dayon ang pang-guha nga diff (para sa mga sagad lamang, nagakinahanglan sang espesyal nga pagkay-o sa imo computer. [//www.mediawiki.org/wiki/Manual:External_editors Mas madamo pa nga impormasyon.])',
-'tog-showjumplinks' => 'Sugtan ang "maglumpat sa" nga mga tabid sang paalagyan',
'tog-uselivepreview' => 'Gamiton ang preview nga live (nagakinahanglan sang JavaScript) (experimentohanon)',
'tog-forceeditsummary' => 'Sugidi ako kon magasulod ako sa blanko nga kabilogan sang pag-ilis',
'tog-watchlisthideown' => 'Tagua ang akon mga pag-ilis sa akon ginabantayan',
@@ -250,7 +247,7 @@ $1',
'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).
+# 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).
'aboutsite' => 'Nahanungod sa {{SITENAME}}',
'aboutpage' => 'Project:Nahanungod',
'copyright' => 'Ang unod nga abeylabol nga naga paidalum $1.',
@@ -260,7 +257,6 @@ $1',
'disclaimers' => 'Diskleymer',
'disclaimerpage' => 'Project:Kabilogan nga diskleymer',
'edithelp' => 'Bulig sa pag Ilis',
-'edithelppage' => 'Help:I-husto',
'helppage' => 'Help:Mga Unod',
'mainpage' => 'Mayor nga Panid',
'mainpage-description' => 'Mayor nga Panid',
@@ -338,17 +334,6 @@ May lista sang mga nagaka-igo nga mga espesyal nga mga panid sa [[Special:Specia
# General errors
'error' => 'Sala/Eror',
'databaseerror' => 'May sala sa database',
-'dberrortext' => 'May sala sa syntax sang pagpangita sa database.
-Ini nagakahulogan nga basi may sapat-sapat/bug sa software.
-Ang pinaka-ulihe nga pagtilaw sa pagpangita sa database amo ang:
-<blockquote><code>$1</code></blockquote>
-nga halin sa buluhaton nga "<code>$2</code>".
-Ang database nagbalik sang sala/eror nga "<samp>$3: $4</samp>".',
-'dberrortextcl' => 'May sala sa syntax sang pagpangita sa database.
-Ang pinaka-ulihe nga pamilit sa pagpangita sa database amo ang:
-"$1"
-nga halin sa buluhaton nga "$2".
-Ang database nagbalik sang sala/eror nga "$3: $4"',
'laggedslavemode' => "'''Pahibalo:''' Ang panid indi dapat maka-angkon sang mga ulihe nga pagbag-o.",
'readonly' => 'Naka-kandado ang database',
'enterlockreason' => 'Magbutang sang rason para sa pagkandado, upod na ang paghaum-haom kon san-o ang kandado pagabuksan',
@@ -404,7 +389,6 @@ Palihog tilawan mo liwat pagkatapos sang malip-ot nga tinion.',
'editinginterface' => "'''Pahibalo:''' Naga-ilis ka sang panid nga ginagamit sa paghatag sang mga teksto sang interface para sa software.
Ang mga pagbag-o sang sini nga panid maga-apekto sa hitsura sang interface sang panid sang manug-gamit sang iban.
Para sa mga paglubad/pagbadbad, palihog kilalanon ang paggamit sang [//translatewiki.net/wiki/Main_Page?setlang=en translatewiki.net], ang proyekto sang MediaWiki para sa localisasyon.",
-'sqlhidden' => '(Nakatago ang pagpamangkot sang SQL)',
'cascadeprotected' => 'Ang ini nga panid ginpangapinan agod nga indi ma-ilisan, bangud nga ini nadal sa masunod nga {{PLURAL:$1|panid, nga|mga panid, nga}} ginapangapinan sang naga-"kaskad" nga pililian nga naga-andar:
$2',
'namespaceprotected' => "Wala ka ginapasugtan nga mag-ilis sang mga panid sa '''$1''' nga lugar-espasyo.",
@@ -438,7 +422,6 @@ Indi pagkalimtan ang pag-ilis sa imo nga [[Special:Preferences|{{SITENAME}} pagp
'yourpassword' => 'Kontra-senyas:',
'yourpasswordagain' => 'Suliton ang kontra-senyas:',
'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',
'password-change-forbidden' => 'Indi ka mahimo nga makailis sang pasword sa sini nga wiki.',
'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.',
@@ -549,7 +532,7 @@ Agod nga makatapos ka sa pagsulod, kinahanglan mo magbutang sang bag-o nga paswo
'newpassword' => 'Bag-o nga pasword:',
'retypenew' => 'Suliton ang bag-o nga pasword:',
'resetpass_submit' => 'Ibutang ang pasword kag magsulod',
-'resetpass_success' => 'Ang imo pasword madinalag-on nga gin-ilisan!
+'changepassword-success' => 'Ang imo pasword madinalag-on nga gin-ilisan!
Ginapasulod ka na...',
'resetpass_forbidden' => 'Ang mga pasword indi mahimo nga paga-ilisan',
'resetpass-no-info' => 'Kinahanglan nga nakasulod ka agod nga makadtoan ang ini nga panid sing derecho.',
@@ -561,10 +544,8 @@ Mahimo nga madinalag-on mo nga nga gin-ilisan ang imo pasword ukon nagpangabay k
# Special:PasswordReset
'passwordreset' => 'Liwaton ang pasword',
-'passwordreset-text' => 'Taposon ang ini nga formas agod nga makabaton sang e-mail nga nagapahanumdom sang mga detalye sang imo akawnt.',
'passwordreset-legend' => 'Liwaton ang pasword',
'passwordreset-disabled' => 'Ang mga pagliwat sang pasword gin-untat sa sini nga wiki.',
-'passwordreset-pretext' => '{{PLURAL:$1||Magbutang sang isa sang mga datos sa idalom}}',
'passwordreset-username' => 'Ngalan sang Manog-gamit"',
'passwordreset-domain' => 'Domeyn:',
'passwordreset-capture' => 'Lantawon ang nagresuta nga e-mail?',
@@ -1065,7 +1046,6 @@ Ang mga detalye mahimo nga makita sa [{{fullurl:{{#Special:Log}}/delete|page={{F
'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',
@@ -1110,15 +1090,6 @@ Testingan mo i-prefiks ang imo pamangkot upod sang ''tanan:'' para makita mo ang
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',
-'qbsettings-directionality' => 'Indi na maliwat, depende sa direksyon sang iskrip sang imo lenggwahe',
-
# Preferences page
'preferences' => 'Mga Ginabasehan',
'mypreferences' => 'Mga Ginabasehan',
@@ -1151,7 +1122,6 @@ Tandai nga ang ila nga palasulundan sang mga unod sang {{SITENAME}} mahimo nga m
'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',
@@ -1162,9 +1132,6 @@ Tandai nga ang ila nga palasulundan sang mga unod sang {{SITENAME}} mahimo nga m
'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:',
@@ -1195,7 +1162,6 @@ Ini isa ka wala pinilian nga balor nga imo mahimo gamiton: $1',
'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:',
@@ -1433,7 +1399,6 @@ Ang imo adres sang e-mail wala ginapakita kon kontakon ka sang iban.',
'recentchangeslinked-feed' => 'May labot nga pag-ilis',
'recentchangeslinked-toolbox' => 'May labot nga pag-ilis',
'recentchangeslinked-title' => 'Mga ginlain nga kapareho kay "$1"',
-'recentchangeslinked-noresult' => 'Wala mga pagbag-o sa mga sugpon nga mga panid sa ginhatag nga tiempo.',
'recentchangeslinked-summary' => "Ini ang mga lista sang mga bag-o lang gid nga nahimo nga mga pahina nga gintabid halin sa gin klaro nga pahina (o mga katapo sa mga kategorya nga gin klaro).
Mga Pahina sa [[Special:Watchlist|imo lista-lantaw]] ay '''dukot'''.",
'recentchangeslinked-page' => 'Ngalan ka Pahina:',
@@ -1520,8 +1485,6 @@ Ang gusto nga {{PLURAL:\$3|tipo sang file amo|mga tipo sang file amo ang}} \$2."
# Statistics
'statistics' => 'Mga Statistik',
-'disambiguationspage' => 'Template:disambig',
-
'brokenredirects-edit' => 'ilisan',
'brokenredirects-delete' => 'panason',
@@ -1900,7 +1863,7 @@ Ang iban ay pagataguon sang default.
* gpslongitude
* gpsaltitude',
-# EXIF tags
+# Exif tags
'exif-lightsource' => 'Ginghalinan sang sanag',
'exif-flash' => 'Igpat',
'exif-subjectarea' => 'Subject area',
diff --git a/languages/messages/MessagesHr.php b/languages/messages/MessagesHr.php
index b2bfc728..baeb6b8e 100644
--- a/languages/messages/MessagesHr.php
+++ b/languages/messages/MessagesHr.php
@@ -13,6 +13,7 @@
* @author Dalibor Bosits
* @author Demicx
* @author Dnik
+ * @author DzWiki
* @author Ex13
* @author Excaliboor
* @author FriedrickMILBarbarossa
@@ -24,6 +25,7 @@
* @author MayaSimFan
* @author Meno25
* @author Mvrban
+ * @author Nemo bis
* @author Roberta F.
* @author SpeedyGonsales
* @author Tivek
@@ -345,9 +347,6 @@ $messages = array(
'tog-shownumberswatching' => 'Prikaži broj suradnika koji prate stranicu (u nedavnim izmjenama, popisu praćenja i samim Älancima)',
'tog-oldsig' => 'Pregled postojećeg potpisa:',
'tog-fancysig' => 'ObiÄan potpis kao wikitekst (bez automatske poveznice)',
-'tog-externaleditor' => 'Uvijek koristi vanjski program za ureÄ‘ivanje (samo za napredne, potrebne su posebne postavke na raÄunalu. [//www.mediawiki.org/wiki/Manual:External_editors Dodatne informacije.])',
-'tog-externaldiff' => 'Uvijek koristi vanjski program za usporedbu (samo za napredne, potrebne su posebne postavke na raÄunalu. [//www.mediawiki.org/wiki/Manual:External_editors Dodatne informacije.])',
-'tog-showjumplinks' => 'UkljuÄi pomoćne poveznice "SkoÄi na"',
'tog-uselivepreview' => 'UkljuÄi trenutaÄni pretpregled (zahtijeva JavaScript) (eksperimentalno)',
'tog-forceeditsummary' => 'Podsjeti me ako sažetak uređivanja ostavljam praznim',
'tog-watchlisthideown' => 'Sakrij moja uređivanja s popisa praćenja',
@@ -360,6 +359,8 @@ $messages = array(
'tog-diffonly' => 'Ne prikazuj sadržaj stranice prilikom usporedbe inaÄica',
'tog-showhiddencats' => 'Prikaži skrivene kategorije',
'tog-norollbackdiff' => 'Izostavi razliku nakon upotrebe ukloni',
+'tog-useeditwarning' => 'Upozori me kad napuštam stranicu za uređivanje bez spremanja izmjena',
+'tog-prefershttps' => 'Uvijek koristi sigurnu vezu kod prijave',
'underline-always' => 'Uvijek',
'underline-never' => 'Nikad',
@@ -423,6 +424,18 @@ $messages = array(
'oct' => 'lis',
'nov' => 'stu',
'dec' => 'pro',
+'january-date' => '$1. sijeÄnja',
+'february-date' => '$1. veljaÄe',
+'march-date' => '$1. ožujka',
+'april-date' => '$1. travnja',
+'may-date' => '$1. svibnja',
+'june-date' => '$1. lipnja',
+'july-date' => '$1. srpnja',
+'august-date' => '$1. kolovoza',
+'september-date' => '$1. rujna',
+'october-date' => '$1. listopada',
+'november-date' => '$1. studenoga',
+'december-date' => '$1. prosinca',
# Categories related messages
'pagecategories' => '{{PLURAL:$1|Kategorija|Kategorije}}',
@@ -504,6 +517,7 @@ $messages = array(
'create-this-page' => 'ZapoÄni ovu stranicu',
'delete' => 'Izbriši',
'deletethispage' => 'Izbriši ovu stranicu',
+'undeletethispage' => 'Vrati ovu stranicu',
'undelete_short' => 'Vrati {{PLURAL:$1|$1 uređivanje|$1 uređivanja}}',
'viewdeleted_short' => 'Prikaži $1 {{plural: $1|izbrisano uređivanje|izbrisana uređivanja|izbrisanih uređivanja}}',
'protect' => 'Zaštiti',
@@ -547,7 +561,7 @@ $1',
'pool-queuefull' => 'Red Äekanja je pun',
'pool-errorunknown' => 'Nepoznata pogrješ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).
+# 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).
'aboutsite' => 'O projektu {{SITENAME}}',
'aboutpage' => 'Project:O_projektu_{{SITENAME}}',
'copyright' => 'Sadržaji se koriste u skladu s $1.',
@@ -557,7 +571,6 @@ $1',
'disclaimers' => 'Odricanje od odgovornosti',
'disclaimerpage' => 'Project:General_disclaimer',
'edithelp' => 'Kako uređivati stranicu',
-'edithelppage' => 'Help:Kako_uređivati_stranicu',
'helppage' => 'Help:Pomoć',
'mainpage' => 'Glavna stranica',
'mainpage-description' => 'Glavna stranica',
@@ -634,17 +647,7 @@ Za popis svih posebnih stranica posjetite [[Special:SpecialPages|ovdje]].',
# General errors
'error' => 'Pogreška',
'databaseerror' => 'Pogreška baze podataka',
-'dberrortext' => 'Došlo je do sintaksne pogrješke u upitu bazi.
-Možda se radi o pogrješci u softveru.
-Posljednji je pokušaj upita glasio:
-<blockquote><tt>$1</tt></blockquote>
-iz funkcije "<tt>$2</tt>".
-Baza je vratila pogrješku "<tt>$3: $4</tt>".',
-'dberrortextcl' => 'Došlo je do sintaksne pogreške s upitom bazi.
-Posljednji pokušaj upita je glasio:
-"$1"
-iz funkcije "$2".
-Baza je vratila pogrešku "$3: $4"',
+'databaseerror-error' => 'Pogrješka: $1',
'laggedslavemode' => 'Upozorenje: na stranici se možda ne nalaze najnovije promjene.',
'readonly' => 'Baza podataka je zakljuÄana',
'enterlockreason' => 'UpiÅ¡i razlog zakljuÄavanja i procjenu vremena otkljuÄavanja',
@@ -695,12 +698,15 @@ Upit: $2',
'protectedinterface' => 'Ova stranica je zaštićena od izmjena jer sadrži tekst MediaWiki softvera.
AKo želite prevesti neprevedenu poruku ili popraviti prijevod neke druge poruke za sve MediaWiki wikije, posjetite [//translatewiki.net/ translatewiki.net], projekt za lokalizaciju MediaWiki softvera.',
'editinginterface' => "'''Upozorenje:''' UreÄ‘ujete stranicu koja se rabi za prikaz teksta u suÄelju softvera. Promjene uÄinjene na ovoj stranici će se odraziti na izgled korisniÄkog suÄelja kod drugih suradnika. Za prijevod, razmotrite uporabu [//translatewiki.net/wiki/Main_Page?setlang=hr translatewiki.net], projekta lokalizacije MedijeWiki.",
-'sqlhidden' => '(SQL upit sakriven)',
'cascadeprotected' => 'Ova je stranica zakljuÄana za ureÄ‘ivanja jer je ukljuÄena u {{PLURAL:$1|slijedeću stranicu|slijedeće stranice}}, koje su zaÅ¡tićene "prenosivom zaÅ¡titom":
$2',
'namespaceprotected' => "Ne možete uređivati stranice u imenskom prostoru '''$1'''.",
'customcssprotected' => 'Ne možete uređivati ovu CSS stranicu zato što ona sadrži osobne postavke drugog suradnika.',
'customjsprotected' => 'Ne možete uređivati ovu JavaScript stranicu zato što ona sadrži osobne postavke drugog suradnika.',
+'mycustomcssprotected' => 'Nemate ovlasti za uređivanje ove CSS stranice.',
+'mycustomjsprotected' => 'Nemate ovlasti za uređivanje ove JavaScript stranice.',
+'myprivateinfoprotected' => 'Nemate ovlasti za uređivanje Vaših osobnih informacija.',
+'mypreferencesprotected' => 'Nemate ovlasti za uređivanje Vaših postavki.',
'ns-specialprotected' => "Stranice u imenskom prostoru ''{{ns:special}}'' ne mogu se uređivati.",
'titleprotected' => "Ovaj naslov je od kreiranja zaštitio suradnik [[User:$1|$1]], uz razlog: ''$2''.",
'filereadonlyerror' => 'Ne mogu izmijeniti datoteku "$1" jer je spremiÅ¡te "$2" dostupno samo za Äitanje.
@@ -724,10 +730,19 @@ Neke se stranice mogu prikazivati kao da ste još uvijek prijavljeni, sve dok ne
'welcomecreation-msg' => 'VaÅ¡ je suradniÄki raÄun otvoren.
Ne zaboravite prilagoditi Vaše [[Special:Preferences|{{SITENAME}} postavke]].',
'yourname' => 'SuradniÄko ime',
+'userlogin-yourname' => 'SuradniÄko ime',
+'userlogin-yourname-ph' => 'Unesite VaÅ¡e suradniÄko ime',
+'createacct-another-username-ph' => 'UpiÅ¡ite suradniÄko ime:',
'yourpassword' => 'Lozinka:',
+'userlogin-yourpassword' => 'Zaporka',
+'userlogin-yourpassword-ph' => 'Unesite Vašu zaporku',
+'createacct-yourpassword-ph' => 'Unesite zaporku',
'yourpasswordagain' => 'Ponovno upišite lozinku',
+'createacct-yourpasswordagain' => 'Potvrdi zaporku',
+'createacct-yourpasswordagain-ph' => 'Unesite zaporku ponovno',
'remembermypassword' => 'Zapamti moju lozinku na ovom raÄunalu (najduže $1 {{PLURAL:$1|dan|dana}})',
-'securelogin-stick-https' => 'Ostani spojen na HTTPS nakon prijave',
+'userlogin-remembermypassword' => 'Zapamti me',
+'userlogin-signwithsecure' => 'Rabi sigurnu vezu',
'yourdomainname' => 'Vaša domena',
'password-change-forbidden' => 'Ne možete promjeniti zaporku na ovom projektu.',
'externaldberror' => 'DoÅ¡lo je do pogreÅ¡ke s vanjskom autorizacijom ili Vam nije dopuÅ¡teno osvježavanje vanjskog suradniÄkog raÄuna.',
@@ -739,18 +754,41 @@ Ne zaboravite prilagoditi Vaše [[Special:Preferences|{{SITENAME}} postavke]].',
'logout' => 'Odjavi se',
'userlogout' => 'Odjavi se',
'notloggedin' => 'Niste prijavljeni',
+'userlogin-noaccount' => 'Nemate suradniÄki raÄun?',
+'userlogin-joinproject' => 'Pridružite se {{SITENAME}}',
'nologin' => 'Nemate suradniÄki raÄun? $1.',
'nologinlink' => 'Otvorite raÄun',
'createaccount' => 'Otvori novi suradniÄki raÄun',
'gotaccount' => "Već imate suradniÄki raÄun? '''$1'''.",
'gotaccountlink' => 'Prijavite se',
'userlogin-resetlink' => 'Zaboravili ste detalje vaše prijave?',
+'userlogin-resetpassword-link' => 'Ponovno postavi zaporku',
+'userlogin-helplink' => '[[{{MediaWiki:helplogin-url}}|Pomoć pri prijavi]]',
+'userlogin-createanother' => 'Stvori joÅ¡ jedan raÄun',
+'createacct-join' => 'Upišite ispod svoje podatke.',
+'createacct-another-join' => 'UpiÅ¡ite dolje podatke o novom raÄunu.',
+'createacct-emailrequired' => 'Adresa e-pošte',
+'createacct-emailoptional' => 'Adresa e-pošte',
+'createacct-email-ph' => 'Upišite svoju adresu e-pošte',
+'createacct-another-email-ph' => 'Upišite adresu e-pošte',
'createaccountmail' => 'Uporabite nasumice odabranu privremenu zaporku i pošaljite ju na navedenu adresu e-pošte',
+'createacct-realname' => 'Stvarno ime (neobvezatno)',
'createaccountreason' => 'Razlog:',
+'createacct-reason' => 'Razlog',
+'createacct-reason-ph' => 'ZaÅ¡to stvarate drugi raÄun',
+'createacct-captcha' => 'Sigurnosna provjera',
+'createacct-imgcaptcha-ph' => 'Unesite tekst koji vidite iznad',
+'createacct-submit' => 'Stvorite svoj suradniÄki raÄun',
+'createacct-another-submit' => 'Stvori joÅ¡ jedan raÄun',
+'createacct-benefit-heading' => '{{SITENAME}} su stvorili ljudi poput Vas.',
+'createacct-benefit-body1' => '{{PLURAL:$1|uređivanje|uređivanja}}',
+'createacct-benefit-body2' => '{{PLURAL:$1|stranica|stranice|stranica}}',
+'createacct-benefit-body3' => 'nedavnih {{PLURAL:$1|suradnik|suradnika}}',
'badretype' => 'Unesene lozinke nisu istovjetne.',
'userexists' => 'Uneseno suradniÄko ime već je u upotrebi.
Unesite neko drugo ime.',
'loginerror' => 'Pogrješka u prijavi',
+'createacct-error' => 'PogrjeÅ¡ka u stvaranju raÄuna',
'createaccounterror' => 'Ne može se stvoriti raÄun: $1',
'nocookiesnew' => "SuradniÄki raÄun je otvoren, ali niste uspjeÅ¡no prijavljeni. Naime, {{SITENAME}} koristi kolaÄiće (''cookies'') u procesu prijave. IskljuÄili ste kolaÄiće. Molim ukljuÄite ih i pokuÅ¡ajte ponovo s VaÅ¡im novim imenom i lozinkom.",
'nocookieslogin' => "{{SITENAME}} koristi kolaÄiće (''cookies'') u procesu prijave. IskljuÄili ste kolaÄiće. Molim ukljuÄite ih i pokuÅ¡ajte ponovo.",
@@ -808,7 +846,7 @@ Molim unesite ispravno oblikovanu adresu ili ostavite polje praznim.',
Možete zanemariti ovu poruku ako je suradniÄki raÄun stvoren nenamjerno.',
'usernamehasherror' => 'SuradniÄko ime ne može sadržavati znakove #',
'login-throttled' => 'Nedavno ste se previše puta pokušali prijaviti.
-Molimo Vas da priÄekate prije nego Å¡to pokuÅ¡ate ponovo.',
+Molimo Vas priÄekajte $1 prije nego Å¡to pokuÅ¡ate ponovno.',
'login-abort-generic' => 'Vaša prijava bila je neuspješna - Prekinuto',
'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).',
@@ -826,7 +864,7 @@ Molimo Vas da priÄekate prije nego Å¡to pokuÅ¡ate ponovo.',
'newpassword' => 'Nova lozinka',
'retypenew' => 'Ponovno unesite lozinku',
'resetpass_submit' => 'Postavite lozinku i prijavite se',
-'resetpass_success' => 'Uspješno ste promijenili zaporku. Prijavljujem Vas...',
+'changepassword-success' => 'Zaporka je uspješno postavljena!',
'resetpass_forbidden' => 'Lozinka ne može biti promijenjena',
'resetpass-no-info' => 'Morate biti prijavljeni da biste izravno pristupili ovoj stranici.',
'resetpass-submit-loggedin' => 'Promijeni lozinku',
@@ -838,10 +876,10 @@ Možda ste već uspješno promijenili Vašu lozinku ili ste zatražili novu priv
# Special:PasswordReset
'passwordreset' => 'Ponovno postavi lozinku',
-'passwordreset-text' => 'Ispunite ovaj obrazac ako želite poništiti Vašu zaporku.',
+'passwordreset-text-one' => 'Ispunite ovaj obrazac ako želite ponovno postaviti Vašu zaporku.',
'passwordreset-legend' => 'Poništi lozinku',
'passwordreset-disabled' => 'Poništavanje lozinke je onemogućeno na ovom wikiju.',
-'passwordreset-pretext' => '{{PLURAL:$1||Unesite jedan od dijelova podataka u nastavku}}',
+'passwordreset-emaildisabled' => 'Funkcija e-pošte je onemogućena na ovom wikiju.',
'passwordreset-username' => 'SuradniÄko ime:',
'passwordreset-domain' => 'Domena:',
'passwordreset-capture' => 'Pogledati krajnju poruku?',
@@ -1074,12 +1112,15 @@ Razlog nije ponuđen.',
ÄŒini se kako je obrisana.',
'edit-conflict' => 'Sukob uređivanja.',
'edit-no-change' => 'Vaše uređivanje je zanemareno, jer nikakva promjena sadržaja nije napravljena.',
+'postedit-confirmation' => 'VaÅ¡e je ureÄ‘ivanje saÄuvano.',
'edit-already-exists' => 'Neuspješno stvaranje nove stranice.
Stranica već postoji.',
'defaultmessagetext' => 'Prvotni tekst poruke',
'content-failed-to-parse' => "Obrada (''parsiranje'') formata $2 za model $1 nije uspjela: $3",
'invalid-content-data' => 'Nevaljani sadržaj',
'content-not-allowed-here' => 'Sadržaj napisan u obliku "$1"-a nije dozvoljen na stranici [[$2]]',
+'editwarning-warning' => 'Napuštanje ove stranice može uzrokovati gubitak svake izmjene koju ste napravili.
+Možete onemogućiti ovo upozorenje u odjeljku "{{int:prefs-editing}}" Vaših postavki.',
# Content models
'content-model-wikitext' => 'wikitekst',
@@ -1291,6 +1332,7 @@ Primijetite da uporaba navigacijskih poveznica resetira Vaše izbore u stupcu.',
'compareselectedversions' => 'Usporedi odabrane inaÄice',
'showhideselectedversions' => 'Otkrij/sakrij odabrane izmjene',
'editundo' => 'ukloni ovu izmjenu',
+'diff-empty' => 'Nema razlike inaÄ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)',
'difference-missing-revision' => '{{PLURAL:$2|Uređivanje|$2 uređivanja}} sljedeće šifre ($1) ne {{PLURAL:$2|postoji|postoje}}.
@@ -1318,7 +1360,6 @@ Više informacija možete pronaći u [{{fullurl:{{#Special:Log}}/delete|page={{F
'searchmenu-legend' => 'Mogućnosti pretraživanja',
'searchmenu-exists' => "* Stranica '''[[$1]]'''",
'searchmenu-new' => "'''Stvori stranicu \"[[:\$1]]\" na ovoj wiki!'''",
-'searchhelp-url' => 'Help:Pomoć',
'searchmenu-prefix' => '[[Special:PrefixIndex/$1|Pretraži stranice s ovim prefiksom]]',
'searchprofile-articles' => 'Stranice sa sadržajem',
'searchprofile-project' => 'Pomoć i stranice projekta',
@@ -1360,15 +1401,6 @@ Više informacija možete pronaći u [{{fullurl:{{#Special:Log}}/delete|page={{F
'search-external' => 'Vanjski pretraživaÄ',
'searchdisabled' => '<p>Oprostite! Pretraga po cjelokupnoj bazi je zbog bržeg rada projekta {{SITENAME}} trenutaÄno onemogućena. Možete se poslužiti tražilicom Google.</p>',
-# Quickbar
-'qbsettings' => 'Traka',
-'qbsettings-none' => 'Bez',
-'qbsettings-fixedleft' => 'Lijevo nepomiÄno',
-'qbsettings-fixedright' => 'Desno nepomiÄno',
-'qbsettings-floatingleft' => 'Lijevo leteće',
-'qbsettings-floatingright' => 'Desno leteće',
-'qbsettings-directionality' => 'Fiksno, ovisno o smjeru pisma Vašeg jezika',
-
# Preferences page
'preferences' => 'Postavke',
'mypreferences' => 'Moje postavke',
@@ -1401,7 +1433,6 @@ Više informacija možete pronaći u [{{fullurl:{{#Special:Log}}/delete|page={{F
'resetprefs' => 'Vrati na prvotne postavke',
'restoreprefs' => 'Vrati sve postavke na prvotno zadane',
'prefs-editing' => 'Širina okvira za uređivanje',
-'prefs-edit-boxsize' => 'VeliÄina prozora za ureÄ‘ivanje.',
'rows' => 'Redova',
'columns' => 'Stupaca',
'searchresultshead' => 'Prikaz rezultata pretrage',
@@ -1412,7 +1443,6 @@ Više informacija možete pronaći u [{{fullurl:{{#Special:Log}}/delete|page={{F
'recentchangesdays-max' => '(maksimalno $1 {{PLURAL:$1|dan|dana}})',
'recentchangescount' => 'Zadani broj izmjena koje se prikazuju:',
'prefs-help-recentchangescount' => 'Ovo ukljuÄuje nedavne promjene, stare izmjene, i evidencije.',
-'prefs-help-watchlist-token' => 'Popunjavanjem ovog polja tajnim kljuÄem generirat će se RSS redak za VaÅ¡ popis praćenja. Svatko tko zna kljuÄ moći će Äitati VaÅ¡ popis praćenih stranica, slijedom toga odaberite sigurnu vrijednost. Ovdje su nasumiÄno generirane vrijednosti koje možete rabiti: $1',
'savedprefs' => 'VaÅ¡e postavke su saÄuvane.',
'timezonelegend' => 'Vremenska zona:',
'localtime' => 'Lokalno vrijeme:',
@@ -1442,7 +1472,6 @@ Više informacija možete pronaći u [{{fullurl:{{#Special:Log}}/delete|page={{F
'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',
'youremail' => 'Vaša elektronska pošta *',
'username' => 'Ime {{GENDER:$1|suradnika|suradnice}}:',
'uid' => 'ID-broj {{GENDER:$1|suradnika|suradnice}}:',
@@ -1473,6 +1502,8 @@ Ne smije biti duži od $1 {{PLURAL:$1|znaka|znaka|znakova}}.',
'prefs-dateformat' => 'Format datuma',
'prefs-timeoffset' => 'Vremensko poravnavanje',
'prefs-advancedediting' => 'Napredne mogućnosti',
+'prefs-editor' => 'UreÄ‘ivaÄ',
+'prefs-preview' => 'Prikaži kako će izgledati',
'prefs-advancedrc' => 'Napredne mogućnosti',
'prefs-advancedrendering' => 'Napredne mogućnosti',
'prefs-advancedsearchoptions' => 'Napredne mogućnosti',
@@ -1481,6 +1512,7 @@ Ne smije biti duži od $1 {{PLURAL:$1|znaka|znaka|znakova}}.',
'prefs-displaysearchoptions' => 'Mogućnosti prikaza',
'prefs-displaywatchlist' => 'Mogućnosti prikaza',
'prefs-diffs' => 'razl',
+'prefs-help-prefershttps' => 'Ova mogućnost će stupiti na snagu kod sljedeće prijave.',
# User preference: email validation using jQuery
'email-address-validity-valid' => 'Adresa e-pošte pokazuje se ispravnom',
@@ -1572,11 +1604,15 @@ Ne smije biti duži od $1 {{PLURAL:$1|znaka|znaka|znakova}}.',
'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-editprotected' => 'Uređivanje zaštićenih stranica (bez prenosive zaštite)',
'right-editinterface' => 'UreÄ‘ivanje suradniÄkog suÄelja',
'right-editusercssjs' => 'Uređivanje CSS i JS stranica drugih suradnika',
'right-editusercss' => 'Uređivanje CSS stranica drugih suradnika',
'right-edituserjs' => 'Uređivanje JS stranica drugih suradnika',
+'right-viewmywatchlist' => 'Pregled svojeg popisa praćenih stranica',
+'right-viewmyprivateinfo' => 'Vidite svoje privatne podatke (npr. adresu e-pošte, stvarno ime)',
+'right-editmyprivateinfo' => 'Uredite svoje privatne podatke (npr. adresa e-pošte, stvarno ime)',
+'right-editmyoptions' => 'Uredite svoje postavke',
'right-rollback' => 'Brzo uklanjanje izmjena zadnjeg suradnika na određenoj stranici',
'right-markbotedits' => 'OznaÄavanje uklonjenih izmjena kao izmjenu bota',
'right-noratelimit' => 'Bez vremenskog ograniÄenja ureÄ‘ivanja',
@@ -1638,9 +1674,14 @@ Ne smije biti duži od $1 {{PLURAL:$1|znaka|znaka|znakova}}.',
'action-userrights-interwiki' => 'ureÄ‘ivanje suradniÄkih prava suradnika na drugim wikijima',
'action-siteadmin' => 'zakljuÄavanje ili otkljuÄavanje baze podataka',
'action-sendemail' => 'pošalji e-poštu',
+'action-editmywatchlist' => 'uredite svoj popis praćenih stranica',
+'action-viewmywatchlist' => 'pregled popisa Vaših praćenih stranica',
+'action-viewmyprivateinfo' => 'pregled Vaših privatnih podataka',
+'action-editmyprivateinfo' => 'uredite svoje privatne podatke',
# Recent changes
'nchanges' => '{{PLURAL:$1|$1 promjena|$1 promjene|$1 promjena}}',
+'enhancedrc-history' => 'povijest',
'recentchanges' => 'Nedavne promjene',
'recentchanges-legend' => 'Izbornik nedavnih promjena',
'recentchanges-summary' => 'Na ovoj stranici možete pratiti nedavne promjene u wikiju.',
@@ -1680,7 +1721,6 @@ Ne smije biti duži od $1 {{PLURAL:$1|znaka|znaka|znakova}}.',
'recentchangeslinked-feed' => 'Povezane stranice',
'recentchangeslinked-toolbox' => 'Povezane stranice',
'recentchangeslinked-title' => 'Povezane promjene sa "$1"',
-'recentchangeslinked-noresult' => 'Nema promjena na povezanim stranicama u zadanom periodu.',
'recentchangeslinked-summary' => "Ova posebna stranica pokazuje nedavne promjene na povezanim stranicama (ili stranicama određene kategorije). Stranice koje su na [[Special:Watchlist|Vašem popisu praćenja]] su '''podebljane'''.",
'recentchangeslinked-page' => 'Naslov stranice:',
'recentchangeslinked-to' => 'Pokaži promjene na stranicama s poveznicom na ovu stranicu',
@@ -1691,7 +1731,7 @@ Ne smije biti duži od $1 {{PLURAL:$1|znaka|znaka|znakova}}.',
'reuploaddesc' => 'Vratite se u obrazac za postavljanje.',
'upload-tryagain' => 'Pošalji izmijenjeni opis datoteke',
'uploadnologin' => 'Niste prijavljeni',
-'uploadnologintext' => 'Za postavljanje datoteka morate biti [[Special:UserLogin|prijavljeni]].',
+'uploadnologintext' => 'Za postavljanje datoteka morate biti $1.',
'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',
@@ -1901,7 +1941,6 @@ Za optimalnu sigurnost, img_auth.php je onemogućena.',
'http-read-error' => 'PogrjeÅ¡ka pri Äitanju HTTP.',
'http-timed-out' => 'HTTP zahtjev je istekao.',
'http-curl-error' => 'Pogrješka pri otvaranju URL-a: $1',
-'http-host-unreachable' => 'URL nije dostupan.',
'http-bad-status' => 'Došlo je do problema tijekom HTTP zahtjeva: $1 $2',
# Some likely curl errors. More could be added from <http://curl.haxx.se/libcurl/c/libcurl-errors.html>
@@ -1930,6 +1969,8 @@ Kad je filtriran po suradniku, popis prikazuje samo one datoteke Äije je poslje
'listfiles_size' => 'VeliÄina (u bajtovima)',
'listfiles_description' => 'Opis',
'listfiles_count' => 'InaÄice',
+'listfiles-latestversion-yes' => 'Da',
+'listfiles-latestversion-no' => 'Ne',
# File description page
'file-anchor-link' => 'Slika',
@@ -2023,6 +2064,9 @@ Možda želite urediti njen opis na [$2 stranici opisa datoteke].',
'randompage' => 'SluÄajna stranica',
'randompage-nopages' => 'Nema stranica u {{PLURAL:$2|imenskom prostoru|imenskim prostorima}}: $1.',
+# Random page in category
+'randomincategory-selectcategory-submit' => 'Idi',
+
# Random redirect
'randomredirect' => 'SluÄajno preusmjeravanje',
'randomredirect-nopages' => 'Nema preusmjeravanja u imenskom prostoru "$1".',
@@ -2048,12 +2092,6 @@ Možda želite urediti njen opis na [$2 stranici opisa datoteke].',
'statistics-users-active-desc' => 'Suradnici koji su napravili neku od radnji u posljednjih {{PLURAL:$1|dan|$1 dana}}',
'statistics-mostpopular' => 'Najposjećenije stranice',
-'disambiguations' => 'Stranice koje vode na razdvojbene stranice',
-'disambiguationspage' => 'Template:Razdvojba',
-'disambiguations-text' => "Sljedeće stranice povezuju na '''razdvojbenu stranicu'''.
-Umjesto toga bi trebale povezivati na prikladnu temu.<br />
-Stranica se tretira kao razdvojbena stranica ako rabi predložak na kojega vodi [[MediaWiki:Disambiguationspage]]",
-
'pageswithprop-prop' => 'Ime osobine:',
'pageswithprop-submit' => 'Idi',
@@ -2307,10 +2345,9 @@ Promjene na toj stranici i njenoj stranici za razgovor bit će prikazane na popi
'unwatchthispage' => 'Prekini praćenje',
'notanarticle' => 'Nije Älanak',
'notvisiblerev' => 'Izmjena je obrisana',
-'watchnochange' => 'Niti jedna od praćenih stranica nije promijenjena od Vašeg zadnjeg posjeta.',
'watchlist-details' => '{{PLURAL:$1|$1 stranica|$1 stranice|$1 stranica}} se nalazi na popisu praćenja, ne brojeći stranice za razgovor.',
-'wlheader-enotif' => '* UkljuÄeno je izvješćivanje e-mailom.',
-'wlheader-showupdated' => "* Stranice koje su promijenjene od Vašeg zadnjeg posjeta prikazane su '''podebljano'''",
+'wlheader-enotif' => 'UkljuÄeno je izvješćivanje e-poÅ¡tom.',
+'wlheader-showupdated' => "Stranice koje su promijenjene od Vašeg zadnjeg posjeta prikazane su '''podebljano'''",
'watchmethod-recent' => 'provjera nedavnih promjena praćenih stranica',
'watchmethod-list' => 'provjera praćanih stranica za nedavne promjene',
'watchlistcontains' => 'Vaš popis praćenja sadrži $1 {{PLURAL:$1|stranicu|stranice|stranica}}.',
@@ -2553,7 +2590,7 @@ $1',
'contributions' => 'Doprinosi {{GENDER:$1|suradnika|suradnice}}',
'contributions-title' => 'SuradniÄki doprinosi za $1',
'mycontris' => 'Moji doprinosi',
-'contribsub2' => 'Za $1 ($2)',
+'contribsub2' => 'Za {{GENDER:$3|$1}} ($2)',
'nocontribs' => 'Nema promjena koje udovoljavaju ovim kriterijima.',
'uctop' => '(vrh)',
'month' => 'Od mjeseca (i ranije):',
@@ -2711,11 +2748,8 @@ Za popis trenutaÄnih zabrana i blokiranja vidi [[Special:BlockList|popis blokir
'ipb_blocked_as_range' => 'Pogreška: IP adresa $1 nije blokirana direktno te stoga ne može biti odblokirana. Blokirana je kao dio opsega $2, koji može biti odblokiran.',
'ip_range_invalid' => 'Raspon IP adresa nije valjan.',
'ip_range_toolarge' => 'Opsezi blokiranja veći od /$1 nisu dozvoljeni.',
-'blockme' => 'Blokiraj me',
'proxyblocker' => 'Zaštita od otvorenih posrednika (proxyja)',
-'proxyblocker-disabled' => 'Ova funkcija je onemogućena.',
'proxyblockreason' => 'VaÅ¡a je IP adresa blokirana jer se radi o otvorenom posredniku (proxyju). Molimo stupite u vezu s VaÅ¡im davateljem internetskih usluga (ISP-om) ili službom tehniÄke podrÅ¡ke i obavijestite ih o ovom ozbiljnom sigurnosnom problemu.',
-'proxyblocksuccess' => 'Napravljeno.',
'sorbsreason' => 'Vaša IP adresa je na popisu otvorenih posrednika na poslužitelju DNSBL.',
'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.',
@@ -3103,12 +3137,8 @@ Razlog je vjerojatno vanjska poveznica koja se nalazi na crnom popisu.',
'pageinfo-category-files' => 'Broj datoteka',
# Skin names
-'skinname-standard' => 'Standardna',
-'skinname-nostalgia' => 'Nostalgija',
'skinname-cologneblue' => 'Kölnska plava',
'skinname-monobook' => 'MonoBook',
-'skinname-myskin' => 'MySkin',
-'skinname-chick' => 'Chick',
# Patrolling
'markaspatrolleddiff' => 'OznaÄi za pregledano',
@@ -3185,11 +3215,17 @@ Njegovim izvršavanjem mogli biste oštetiti svoj sustav.",
'minutes' => '{{PLURAL:$1|$1 minuta|$1 minute|$1 minuta}}',
'hours' => '{{PLURAL:$1|$1 sat|$1 sata|$1 sati}}',
'days' => '{{PLURAL:$1|$1 dan|$1 dana|$1 dana}}',
+'weeks' => '{{PLURAL:$1|$1 tjedan|$1 tjedna|$1 tjedana}}',
'months' => '{{PLURAL:$1|$1 mjesec|$1 mjeseca|$1 mjeseci}}',
'years' => '{{PLURAL:$1|$1 godina|$1 godine|$1 godina}}',
'ago' => 'prije $1',
'just-now' => 'upravo',
+# Human-readable timestamps
+'hours-ago' => 'prije $1 {{PLURAL:$1|sat|sata|sati}}',
+'minutes-ago' => 'prije $1 {{PLURAL:$1|minute|minuta}}',
+'seconds-ago' => 'prije $1 {{PLURAL:$1|sekunde|sekundi}}',
+
# Bad image list
'bad_image_list' => "Rabi se sljedeći format:
@@ -3220,7 +3256,7 @@ Svaka sljedeća poveznica u istom retku je izuzetak, npr. kod stranica gdje se s
* gpslongitude
* gpsaltitude',
-# EXIF tags
+# Exif tags
'exif-imagewidth' => 'Å irina',
'exif-imagelength' => 'Visina',
'exif-bitspersample' => 'Dubina boje',
@@ -3398,7 +3434,7 @@ Svaka sljedeća poveznica u istom retku je izuzetak, npr. kod stranica gdje se s
'exif-originalimageheight' => 'Visina slike prije nego Å¡to je obrezana',
'exif-originalimagewidth' => 'Å irina slike prije nego Å¡to je obrezana',
-# EXIF attributes
+# Exif attributes
'exif-compression-1' => 'Nesažeto',
'exif-compression-2' => 'CCITT Grupa 3 1 — Dimenzionalno izmijenjeno Huffmanovo šifriranje po dužini',
'exif-compression-3' => 'CCITT Grupa 3 faks kodiranje',
@@ -3845,7 +3881,6 @@ Također možete koristiti [[Special:EditWatchlist|standardni editor]].',
'version-other' => 'Ostalo',
'version-mediahandlers' => 'Rukovatelji medijima',
'version-hooks' => 'Kuke',
-'version-extension-functions' => 'Funkcije proširenja',
'version-parser-extensiontags' => 'Oznake proširenja parsera',
'version-parser-function-hooks' => 'Kuke funkcija parsera',
'version-hook-name' => 'Ime kuke',
@@ -3867,12 +3902,11 @@ Trebali ste primiti [{{SERVER}}{{SCRIPTPATH}}/COPYING kopiju GNU opće javne lic
'version-entrypoints-header-entrypoint' => 'PoÄetna adresa',
'version-entrypoints-header-url' => 'URL',
-# Special:FilePath
-'filepath' => 'Putanja datoteke',
-'filepath-page' => 'Datoteka:',
-'filepath-submit' => 'Idi',
-'filepath-summary' => 'Ova posebna stranica daje Vam kompletnu putanju do neke datoteke.
-Slike se na taj naÄin prikazuju u punoj rezoluciji, a drugi tipovi datoteka se otvaraju na klik (kako je već namjeÅ¡teno u VaÅ¡em operacijskom sustavu).',
+# Special:Redirect
+'redirect-submit' => 'Idi',
+'redirect-value' => 'Vrijednost:',
+'redirect-user' => 'ID suradnika',
+'redirect-file' => 'DatoteÄno ime',
# Special:FileDuplicateSearch
'fileduplicatesearch' => 'Traži kopije datoteka',
@@ -3921,12 +3955,15 @@ Slike se na taj naÄin prikazuju u punoj rezoluciji, a drugi tipovi datoteka se
'tags' => 'Valjane oznake izmjena',
'tag-filter' => 'Filtar [[Special:Tags|oznaka]]:',
'tag-filter-submit' => 'Filtar',
+'tag-list-wrapper' => '([[Special:Tags|{{PLURAL:$1|Oznaka|Oznake}}]]: $2)',
'tags-title' => 'Oznake',
'tags-intro' => 'Ova je stranica popis oznaka s kojima softver može oznaÄiti promjenu te njihovo znaÄenje.',
'tags-tag' => 'Naziv oznake',
'tags-display-header' => 'Izgled na popisima izmjena',
'tags-description-header' => 'Puni opis znaÄenja',
'tags-hitcount-header' => 'OznaÄene izmjene',
+'tags-active-yes' => 'Da',
+'tags-active-no' => 'Ne',
'tags-edit' => 'uredi',
'tags-hitcount' => '$1 {{PLURAL:$1|promjena|promjene|promjena}}',
@@ -3947,6 +3984,7 @@ Slike se na taj naÄin prikazuju u punoj rezoluciji, a drugi tipovi datoteka se
'dberr-problems' => 'IspriÄavamo se! Ova stranica ima tehniÄkih poteÅ¡koća.',
'dberr-again' => 'PriÄekajte nekoliko minuta i ponovno uÄitajte.',
'dberr-info' => '(Ne mogu se spojiti na poslužitelj baze: $1)',
+'dberr-info-hidden' => '(Ne mogu se spojiti na poslužitelj baze)',
'dberr-usegoogle' => 'U međuvremenu pokušajte tražiti putem Googlea.',
'dberr-outofdate' => 'Imajte na umu da su njihova kazala našeg sadržaja možda zastarjela.',
'dberr-cachederror' => 'Sljedeće je dohvaćena kopija tražene stranice, te možda nije ažurirana.',
@@ -3962,6 +4000,9 @@ Slike se na taj naÄin prikazuju u punoj rezoluciji, a drugi tipovi datoteka se
'htmlform-submit' => 'Pošalji',
'htmlform-reset' => 'Poništi izmjene',
'htmlform-selectorother-other' => 'Drugi',
+'htmlform-no' => 'Ne',
+'htmlform-yes' => 'Da',
+'htmlform-chosen-placeholder' => 'Odaberite opciju',
# SQLite database support
'sqlite-has-fts' => '$1 s podrškom pretraživanja cijelog teksta',
diff --git a/languages/messages/MessagesHsb.php b/languages/messages/MessagesHsb.php
index 13ded396..55add6b4 100644
--- a/languages/messages/MessagesHsb.php
+++ b/languages/messages/MessagesHsb.php
@@ -11,6 +11,7 @@
* @author J budissin
* @author Kaganer
* @author Michawiki
+ * @author Nemo bis
* @author Shirayuki
* @author TchoÅ™
* @author Tlustulimu
@@ -184,9 +185,6 @@ $messages = array(
'tog-shownumberswatching' => 'LiÄbu wobkedźbowacych wužiwarjow pokazać',
'tog-oldsig' => 'Eksistowaca signatura:',
'tog-fancysig' => 'Ze signaturu kaž z wikitekstom wobchadźeć (bjez awtomatiskeho wotkaza)',
-'tog-externaleditor' => 'Eksterny editor jako standard wužiwać (jenož za ekspertow, žada sej specialne nastajenja na waÅ¡im liÄaku. [//www.mediawiki.org/wiki/Manual:External_editors DalÅ¡e informacije.])',
-'tog-externaldiff' => 'Eksterny diff-program jako standard wužiwać (jenož za ekspertow, žada sej specialne nastajenja na waÅ¡im liÄaku. [//www.mediawiki.org/wiki/Manual:External_editors DalÅ¡e informacije.])',
-'tog-showjumplinks' => 'Wotkazy typa „dźi do†zmóžnić',
'tog-uselivepreview' => 'Live-přehlad wužiwać (wužaduje sej JavaScript) (eksperimentalny)',
'tog-forceeditsummary' => 'Mje skedźbnić, jeli zabudu zjeće',
'tog-watchlisthideown' => 'Moje změny we wobkedźbowankach schować',
@@ -199,6 +197,7 @@ $messages = array(
'tog-diffonly' => 'Jenož rozdźěle pokazać (nic pak zbytny wobsah)',
'tog-showhiddencats' => 'Schowane kategorije pokazać',
'tog-norollbackdiff' => 'Rozdźěl po wróćostajenju zanjechać',
+'tog-useeditwarning' => 'Warnować, hdyž so wobdźěłowanska strona z njeskładowanymi změnami wopušća',
'underline-always' => 'Přeco',
'underline-never' => 'Ženje',
@@ -262,6 +261,18 @@ $messages = array(
'oct' => 'okt',
'nov' => 'now',
'dec' => 'dec',
+'january-date' => '$1. januara',
+'february-date' => '$1. februara',
+'march-date' => '$1. měrca',
+'april-date' => '$1. apryla',
+'may-date' => '$1. meje',
+'june-date' => '$1. junija',
+'july-date' => '$1. julija',
+'august-date' => '$1. awgusta',
+'september-date' => '$1. septembra',
+'october-date' => '$1. oktobra',
+'november-date' => '$1. nowembra',
+'december-date' => '$1. decembra',
# Categories related messages
'pagecategories' => '{{PLURAL:$1|Kategorija|Kategoriji|Kategorije|Kategorije}}',
@@ -343,6 +354,7 @@ $messages = array(
'create-this-page' => 'Stronu wutworić',
'delete' => 'wušmórnyć',
'deletethispage' => 'Stronu wušmórnyć',
+'undeletethispage' => 'Tutu stronu wobnowić',
'undelete_short' => '{{PLURAL:$1|jednu wersiju|$1 wersiji|$1 wersije|$1 wersijow}} wobnowić',
'viewdeleted_short' => '{{PLURAL:$1|jednu wušmórnjenu změnu|$1 wušmórnjenej změnje|$1 wušmórnjene změny|$1 wušmórnjenych změnow}} sej wobhladać',
'protect' => 'škitać',
@@ -386,7 +398,7 @@ $1',
'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).
+# 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).
'aboutsite' => 'Wo {{GRAMMAR:lokatiw|{{SITENAME}}}}',
'aboutpage' => 'Project:Wo',
'copyright' => 'Wobsah steji pod $1.',
@@ -396,7 +408,6 @@ $1',
'disclaimers' => 'Licencne postajenja',
'disclaimerpage' => 'Project:Impresum',
'edithelp' => 'Pomoc za wobdźěłowanje',
-'edithelppage' => 'Help:Wobdźěłowanje',
'helppage' => 'Help:Wobsah',
'mainpage' => 'HÅ‚owna strona',
'mainpage-description' => 'HÅ‚owna strona',
@@ -473,16 +484,6 @@ Płaćiwe specialne strony hodźa so pod [[Special:SpecialPages|lisćinu special
# General errors
'error' => 'Zmylk',
'databaseerror' => 'Zmylk w datowej bance',
-'dberrortext' => 'Syntaktiski zmylk při wotprašowanju datoweje banki.
-To móhło zmylk w programje być. Poslednje spytane wotprašenje w datowej bance běše:
-<blockquote><code>$1</code></blockquote>
-z funkcije "<code>$2</code>".
-Datowa banka wróći zmylk "<samp>$3: $4</samp>".',
-'dberrortextcl' => 'Syntaktiski zmylk je we wotprašowanju datoweje banki wustupił.
-Poslednje wotprašenje w datowej bance běše:
-"$1"
-z funkcije "$2".
-Datowa banka wróći zmylk "$3: $4"',
'laggedslavemode' => "'''Kedźbu:''' Je móžno, zo strona žane zaktualizowanja njewobsahuje.",
'readonly' => 'Datowa banka je zawrjena',
'enterlockreason' => 'Zapodaj pÅ™iÄinu za zawrjenje a pÅ™ibližny Äas, hdy budźe zawrjenje zbÄ›hnjene',
@@ -534,12 +535,15 @@ Wotprašenje: $2',
'protectedinterface' => 'Tuta strona wobsahuje tekst za wužiwarski powjerch softwary na tutym wikiju a je škitana, zo by so znjewužiwanje zadźěwało.
Zo by přełožki za wšě wikije přidał abo změnił, wužij prošu [//translatewiki.net/ translatewiki.net], projekt MediaWiki za lokalizaciju.',
'editinginterface' => "'''Warnowanje:''' Wobdźěłuješ stronu, kotraž so wužiwa, zo by tekst za wužiwarski powjerch softwary k dispoziciji stajiła. Změny na stronje wuskutkuja so na napohlad wužiwarskeho powjercha za druhich wužiwarjow na tutym wikiju. Zo by přełožki za wšě wikije přidał abo změnił, wužij prošu [//translatewiki.net/ translatewiki.net], projekt MediaWiki za lokalizaciju.",
-'sqlhidden' => '(SQL wotprašenje schowane)',
'cascadeprotected' => 'Tuta strona je za wobdźěłowanje zawrjena, dokelž je w {{PLURAL:$1|slědowacej stronje|slědowacymaj stronomaj|slědowacych stronach|slědowacych stronach}} zapřijata, {{PLURAL:$1|kotraž je|kotrejž stej|kotrež su|kotrež su}} přez kaskadowu opciju {{PLURAL:$1|škitana|škitanej|škitane|škitane}}:
$2',
'namespaceprotected' => "Nimaš dowolnosć, zo by stronu w mjenowym rumje '''$1''' wobdźěłał.",
'customcssprotected' => 'Nimaš prawo, zo by tutu CSS-stronu wobdźěłał, dokelž wosobinske nastajenja druheho wužiwarja wobsahuje.',
'customjsprotected' => 'Nimaš prawo, zo by tutu JavaScript-stronu wobdźěłał, dokelž wosobinske nastajenja druheho wužiwarja wobsahuje.',
+'mycustomcssprotected' => 'Nimaš prawo tutu CSS-stronu wobdźěłać.',
+'mycustomjsprotected' => 'Nimaš prawo tutu JavaScript-stronu wobdźěłać.',
+'myprivateinfoprotected' => 'Nimaš prawo swoje priwatne informacije wobdźěłać.',
+'mypreferencesprotected' => 'Nimaš prawo swoje nastajenja wobdźěłać.',
'ns-specialprotected' => 'Specialne strony njedadźa so wobdźěłać.',
'titleprotected' => 'Tutón titul bu přećiwo wutworjenju přez [[User:$1|$1]] škitany.
Podata pÅ™iÄina je \'\'"$2"\'\'.',
@@ -565,10 +569,18 @@ Wobkedźbuj, zo so někotre strony dale jewja, kaž by hišće přizjewjeny był
'welcomecreation-msg' => 'Twoje konto bu wutworjene.
Njezabudź swoje [[Special:Preferences|nastajenja za {{GRAMMAR:akuzatiw|{{SITENAME}}}}]] změnić.',
'yourname' => 'Wužiwarske mjeno:',
+'userlogin-yourname' => 'Wužiwarske mjeno',
+'userlogin-yourname-ph' => 'Zapodaj swoje wužiwarske mjeno',
'yourpassword' => 'Hesło:',
+'userlogin-yourpassword' => 'Hesło',
+'userlogin-yourpassword-ph' => 'Zapodaj swoje hesło',
+'createacct-yourpassword-ph' => 'Zapodaj hesło',
'yourpasswordagain' => 'Hesło znowa zapodać:',
+'createacct-yourpasswordagain' => 'Hesło wobkrućić',
+'createacct-yourpasswordagain-ph' => 'Zapodaj hesło hišće raz',
'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ć',
+'userlogin-remembermypassword' => 'Přizjewjeny wostać',
+'userlogin-signwithsecure' => 'Wěsty zwisk wužiwać',
'yourdomainname' => 'Twoja domejna:',
'password-change-forbidden' => 'Njemóžeš hesła na tutym wikiju změnić.',
'externaldberror' => 'Běše pak eksterny zmylk awtentifikacije datoweje banki, pak njesměš swoje eksterne konto aktualizować.',
@@ -580,18 +592,38 @@ Njezabudź swoje [[Special:Preferences|nastajenja za {{GRAMMAR:akuzatiw|{{SITENA
'logout' => 'wotzjewić',
'userlogout' => 'wotzjewić',
'notloggedin' => 'Njepřizjewjeny',
+'userlogin-noaccount' => 'Nimaš žane konto?',
+'userlogin-joinproject' => 'Konto za {{GRAMMAR:akuzatiw|{{SITENAME}}}} załožić',
'nologin' => 'Nimaš žane konto? $1.',
'nologinlink' => 'Konto załožić',
'createaccount' => 'Konto załožić',
'gotaccount' => 'Maš hižo wužiwarske konto? $1.',
'gotaccountlink' => 'Přizjewić',
'userlogin-resetlink' => 'Přizjewjenske daty zabył?',
+'userlogin-resetpassword-link' => 'Hesło anulować',
+'helplogin-url' => 'Help:Přizjewić',
+'userlogin-helplink' => '[[{{MediaWiki:helplogin-url}}|Pomoc za přizjewjenje]]',
+'createacct-join' => 'Zapodaj deleka swoje informacije.',
+'createacct-emailrequired' => 'E-mejlowa adresa',
+'createacct-emailoptional' => 'E-mejlowa adresa (opcionalny)',
+'createacct-email-ph' => 'Zapodaj swoju e-mejlowu adresu',
'createaccountmail' => 'Nachwilne přidatne hesło wužiwać a jo na slědowacu e-mejlowu adresu pósłać',
+'createacct-realname' => 'Woprawdźite mjeno (opcionalny)',
'createaccountreason' => 'PÅ™iÄina:',
+'createacct-reason' => 'PÅ™iÄina',
+'createacct-reason-ph' => 'Čehodla załožuješ druhe konto?',
+'createacct-captcha' => 'Wěstotna kontrola',
+'createacct-imgcaptcha-ph' => 'Zapodaj tekst, kotryž deleka widźiš',
+'createacct-submit' => 'Twoje konto załožić',
+'createacct-benefit-heading' => '{{SITENAME}} je so wot ludźi kaž ty wutworił.',
+'createacct-benefit-body1' => '{{PLURAL:$1|změna|změnje|změny|změnow}}',
+'createacct-benefit-body2' => '{{PLURAL:$1|strona|stronje|strony|stronow}}',
+'createacct-benefit-body3' => '{{PLURAL:$1|aktiwny sobuskutkowar|aktiwnej sobuskutkowarjej|aktiwni sobuskutkowarjo}}',
'badretype' => 'Hesle, kotrejž sy zapodał, so njekryjetej.',
'userexists' => 'Wužiwarske mjeno, kotrež sy zapodał, so hižo wužiwa.
Prošu wubjer druhe mjeno.',
'loginerror' => 'Zmylk při přizjewjenju',
+'createacct-error' => 'Zmylk při załožowanju konta',
'createaccounterror' => 'Wužiwarske konto njeda so załožić: $1',
'nocookiesnew' => 'Wužiwarske konto bu załožene, njejsy pak přizjewjeny. {{SITENAME}} wužiwa placki (cookies), zo bychu so wužiwarjo přizjewili. Sy placki znjemóžnił. Prošu zmóžń je a přizjew so potom ze swojim nowym wužiwarskim mjenom a hesłom.',
'nocookieslogin' => '{{SITENAME}} wužiwa placki za přizjewjenje wužiwarjow.
@@ -661,7 +693,7 @@ MóžeÅ¡ tutu zdźělenku ignorować, jeli so wužiwarske konto zmylnje wutworiÅ
'newpassword' => 'Nowe hesło:',
'retypenew' => 'Nowe hesło wospjetować:',
'resetpass_submit' => 'Hesło posrědkować a so přizjewić',
-'resetpass_success' => 'Twoje hesło bu wuspěšnje změnjene! Nětko přizjewjenje běži...',
+'changepassword-success' => 'Twoje hesło bu wuspěšnje změnjene! Nětko přizjewjenje běži...',
'resetpass_forbidden' => 'Hesła njedadźa so změnić.',
'resetpass-no-info' => 'Dyrbiš so přizjewić, zo by direktny přistup na tutu stronu měł.',
'resetpass-submit-loggedin' => 'Hesło změnić',
@@ -673,10 +705,11 @@ Snano sy swoje hesło hižo wuspěšnje změnił abo nowe nachwilne hesło poža
# Special:PasswordReset
'passwordreset' => 'Hesło wróćo stajić',
-'passwordreset-text' => 'Wupjelń tutón formular, zo by swoje hesło anulował.',
+'passwordreset-text-one' => 'Wupjelń tutón formular, zo by swoje hesło anulował.',
+'passwordreset-text-many' => '{{PLURAL:$1|Zapodaj jedyn z datow, zo by swoje hesło anulował.}}',
'passwordreset-legend' => 'Hesło wróćo stajić',
'passwordreset-disabled' => 'Wróćostajenje hesłow je so na tutym wikiju znjemóžniło.',
-'passwordreset-pretext' => '{{PLURAL:$1||Zapodaj deleka jedne ze slědowacych datowych podaćow}}',
+'passwordreset-emaildisabled' => 'E-mejlowe funkcije su so na tutym wikiju znjemóžnili.',
'passwordreset-username' => 'Wužiwarske mjeno:',
'passwordreset-domain' => 'Domena:',
'passwordreset-capture' => 'E-mejlku sej wobhladać?',
@@ -699,7 +732,7 @@ Ty měł so nětko přizjewić a nowe hesło wubrać. Jeli něchtó druhi je tut
Nachwilne hesło: $2',
'passwordreset-emailsent' => 'E-mejl za anulowanje hesło je so pósłała.',
'passwordreset-emailsent-capture' => 'E-mejl za anulowanje hesła je so pósłała, kotraž so deleka pokazuje.',
-'passwordreset-emailerror-capture' => 'E-mejl za anulowanje hesła je so wutworiła, kotraž so deleka pokazuje, ale słanje wužiwarjej je so njeporadźiło: $1',
+'passwordreset-emailerror-capture' => 'E-mejl za anulowanje hesła je so wutworiła, kotraž so deleka pokazuje, ale słanje {{GENDER:$2|wužiwarjej|wužiwarce}} je so njeporadźiło: $1',
# Special:ChangeEmail
'changeemail' => 'E-mejlowu adresu změnić',
@@ -899,12 +932,14 @@ Njeje žane wujasnjenje podała.',
Zda so, zo je hîžo wušmórnjena.',
'edit-conflict' => 'Wobdźěłanski konflikt.',
'edit-no-change' => 'Waše wobdźěłanje bu ignorowane, dokelž tekst njebu zm,ěnjeny.',
+'postedit-confirmation' => 'Twoja změna je so składowała.',
'edit-already-exists' => 'Njebě móžno nowu stronu wutworić.
Eksistuje hižo.',
'defaultmessagetext' => 'Standardny tekst zdźělenki',
'content-failed-to-parse' => 'Parsowanje wobsaha $2 za model $1 je so njeporadźiło: $3',
'invalid-content-data' => 'Njepłaćiwe wobsahowe daty',
'content-not-allowed-here' => 'Wobsah "$1" njeje na stronje [[$2]] dowoleny',
+'editwarning-warning' => 'Hdyž so strona wopušća, móža so změny zhubić, kotrež sy přewjedł. Jeli sy přizjewjeny, móžeš tute warnowanje we wotrězku "Wobdźěłowanje" swojich nastajenjow znjemóžnić.',
# Content models
'content-model-wikitext' => 'wikitekst',
@@ -937,6 +972,7 @@ DyrbjaÅ‚a mjenje haÄ $2 {{PLURAL:$2|woÅ‚anje|woÅ‚anjej|woÅ‚anja|woÅ‚anjow}} mÄ›
'undo-failure' => 'Wobdźěłanje njehodźeše so wotstronić, dokelž wotpowědny wotrězk bu mjeztym změnjeny.',
'undo-norev' => 'Změna njeda so cofnyć, dokelž njeeksistuje abo bu wušmórnjena.',
'undo-summary' => 'Změna $1 [[Special:Contributions/$2|$2]] ([[User talk:$2|diskusija]]) bu cofnjena.',
+'undo-summary-username-hidden' => 'Změna $1 schowaneho wužiwarja je so anulowała',
# Account creation failure
'cantcreateaccounttitle' => 'Wužiwarske konto njeda so wutworić.',
@@ -1141,7 +1177,6 @@ Podrobnosće móžeš w [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}
'searchmenu-legend' => 'Pytanske opcije',
'searchmenu-exists' => "'''Je strona z mjenom \"[[\$1]]\" na tutym wikiju'''",
'searchmenu-new' => "'''Wutwor stronu \"[[:\$1|\$1]]\" na tutym wikiju!'''",
-'searchhelp-url' => 'Help:Wobsah',
'searchmenu-prefix' => '[[Special:PrefixIndex/$1|Strony z tutym prefiksom přepytać]]',
'searchprofile-articles' => 'Wobsahowe strony',
'searchprofile-project' => 'Pomoc a projektowe strony',
@@ -1183,15 +1218,7 @@ Spytaj swoje naprašowanje z prefiksom ''all:'' wužiwać, zo by wšón wobsah (
'powersearch-togglenone' => 'Žadyn',
'search-external' => 'Eksterne pytanje',
'searchdisabled' => 'Pytanje w {{GRAMMAR:lokatiw|{{SITENAME}}}} tuchwilu móžne njeje. Móžeš mjeztym z Google pytać. Wobkedźbuj, zo móža wuslědki z wobsaha {{GRAMMAR:genitiw|{{SITENAME}}}} zestarjene być.',
-
-# Quickbar
-'qbsettings' => 'PobóÄna lajsta',
-'qbsettings-none' => 'Žane',
-'qbsettings-fixedleft' => 'Leži nalěwo',
-'qbsettings-fixedright' => 'Leži naprawo',
-'qbsettings-floatingleft' => 'Wisa nalěwo',
-'qbsettings-floatingright' => 'Wisa naprawo',
-'qbsettings-directionality' => 'Kruty, wotwisny wot pisanskeho smÄ›ra twojeje rÄ›Äe',
+'search-error' => 'Při pytanju je so zmylk wustupił: $1',
# Preferences page
'preferences' => 'Nastajenja',
@@ -1225,7 +1252,6 @@ Spytaj swoje naprašowanje z prefiksom ''all:'' wužiwać, zo by wšón wobsah (
'resetprefs' => 'Njeskładowane změny zaćisnyć',
'restoreprefs' => 'Wšě standardne nastajenja wobnowić',
'prefs-editing' => 'Wobdźěłowanje',
-'prefs-edit-boxsize' => 'Wulkosć wobdźěłowanskeho wokna.',
'rows' => 'Rjadki:',
'columns' => 'Stołpiki:',
'searchresultshead' => 'Pytać',
@@ -1236,9 +1262,6 @@ Spytaj swoje naprašowanje z prefiksom ''all:'' wužiwać, zo by wšón wobsah (
'recentchangesdays-max' => '(Maksimalnje $1 {{PLURAL:$1|dźeń|dnjej|dny|dnjow}})',
'recentchangescount' => 'LiÄba stronow, kotraž ma so po standardźe pokazać:',
'prefs-help-recentchangescount' => 'To zapřijima aktualne změny, stawizny stronow a protokole.',
-'prefs-help-watchlist-token' => 'Wupjelnjenje tutoho pola z tajnym kluÄom budźe RSS-kanal za twoje wobkedźbowanki wupÅ‚odźić.
-NÄ›chtó, kiž kluÄ w tutym polu znaje, móže twoje wobkedźbowanki Äitać, wubjer tohodla wÄ›stu hódnotu.
-Tu je připadnje wupłodźena hódnota, kotruž móžeš wužiwać: $1',
'savedprefs' => 'Nastajenja buchu składowane.',
'timezonelegend' => 'ÄŒasowe pasmo:',
'localtime' => 'Lokalny Äas:',
@@ -1269,7 +1292,6 @@ Tu je připadnje wupłodźena hódnota, kotruž móžeš wužiwać: $1',
'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:',
-'prefs-textboxsize' => 'Wulkosć wobdźěłowanskeho wokna',
'youremail' => 'E-mejl:',
'username' => 'Mjeno {{GENDER:$1|wužiwarja|wužiwarki}}:',
'uid' => 'ID {{GENDER:$1|wužiwarja|wužiwarki}}:',
@@ -1300,6 +1322,8 @@ SmÄ› mjenje haÄ $1 {{PLURAL:$1|znamjeÅ¡ko|znamjeÅ¡ce|znamjeÅ¡ka|znamjeÅ¡kow}} d
'prefs-dateformat' => 'Datumowy format',
'prefs-timeoffset' => 'ÄŒasowe wotchilenje',
'prefs-advancedediting' => 'Powšitkowny',
+'prefs-editor' => 'Editor',
+'prefs-preview' => 'Přehlad',
'prefs-advancedrc' => 'Rozšěrjene opcije',
'prefs-advancedrendering' => 'Rozšěrjene opcije',
'prefs-advancedsearchoptions' => 'Rozšěrjene opcije',
@@ -1334,6 +1358,8 @@ SmÄ› mjenje haÄ $1 {{PLURAL:$1|znamjeÅ¡ko|znamjeÅ¡ce|znamjeÅ¡ka|znamjeÅ¡kow}} d
'userrights-notallowed' => 'Twoje konto nima trěbne prawa, zo by wužiwarske prawa přidźěliło abo zebrało.',
'userrights-changeable-col' => 'Skupiny, kotrež móžeš změnić',
'userrights-unchangeable-col' => 'Skupiny, kotrež njemóžeš změnić',
+'userrights-conflict' => 'Konflikt wužiwarskich prawow! ProÅ¡u ÄiÅ„ swoje zmÄ›ny hišće raz.',
+'userrights-removed-self' => 'Sy swoje prawa wuspěšnje wotstronił. Tohodla nimaš hižo přistup na tutu stronu měć.',
# Groups
'group' => 'Skupina:',
@@ -1399,11 +1425,19 @@ SmÄ› mjenje haÄ $1 {{PLURAL:$1|znamjeÅ¡ko|znamjeÅ¡ce|znamjeÅ¡ka|znamjeÅ¡kow}} d
'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-editprotected' => 'Strony wobdźěłać, kotrež su přez "{{int:protect-level-sysop}}" škitane',
+'right-editsemiprotected' => 'Strony wobdźěłać, kotrež su přez "{{int:protect-level-autoconfirmed}}" škitane',
'right-editinterface' => 'Wužiwarski powjerch wobdźěłać',
'right-editusercssjs' => 'Dataje CSS a JS druhich wužiwarjow wobdźěłać',
'right-editusercss' => 'Dataje CSS druhich wužiwarjow wobdźěłać',
'right-edituserjs' => 'Dataje JS druhich wužiwarjow wobdźěłać',
+'right-editmyusercss' => 'Twoje swójske wužiwarske CSS-dataje wobdźěłać',
+'right-editmyuserjs' => 'Twoje swójske wužiwarske JavaScript-dataje wobdźěłać',
+'right-viewmywatchlist' => 'Sej swójske wobkedźbowanki wobhladać',
+'right-editmywatchlist' => 'Swoje wobkedźbowanki wobdźěłać. Wobkedźbuj, zo někotre akcije hišće bjez tutoho prawa strony přidawaja.',
+'right-viewmyprivateinfo' => 'Swójske priwatne daty sej wobhladać (na př. e-mejlowu adresu, woprawdźite mjeno)',
+'right-editmyprivateinfo' => 'Swójske priwatne daty wobdźěłać (na př. e-mejlowu adresu, woprawdźite mjeno)',
+'right-editmyoptions' => 'Twoje swójske nastajenja wobdźěłać',
'right-rollback' => 'Poslednjeho wužiwarja, kotryž wěstu stronu wobdźěła, spěšnje rewertować',
'right-markbotedits' => 'Rewertowane změny jako botowe změny markěrować',
'right-noratelimit' => 'Přez žane limity wobmjezowane',
@@ -1465,12 +1499,17 @@ SmÄ› mjenje haÄ $1 {{PLURAL:$1|znamjeÅ¡ko|znamjeÅ¡ce|znamjeÅ¡ka|znamjeÅ¡kow}} d
'action-userrights-interwiki' => 'Wužiwarske prawa wužiwarjow w druhich wikijach wobdźěłać',
'action-siteadmin' => 'Datowu banku zawrěć abo wotewrić',
'action-sendemail' => 'E-mejle pósłać',
+'action-editmywatchlist' => 'twoje wobkedźbowanki wobdźěłać',
+'action-viewmywatchlist' => 'Sej swójske wobkedźbowanki wobhladać',
+'action-viewmyprivateinfo' => 'twoje priwatne informacije sej wobhladać',
+'action-editmyprivateinfo' => 'twoje priwatne informacije wobdźěłać',
# Recent changes
'nchanges' => '$1 {{PLURAL:$1|změna|změnje|změny|změnow}}',
'recentchanges' => 'Aktualne změny',
'recentchanges-legend' => 'Opcije aktualnych změnow',
'recentchanges-summary' => 'Na tutej stronje móžeš najaktualniše změny w {{GRAMMAR:lokatiw|{{SITENAME}}}} wobkedźbować.',
+'recentchanges-noresult' => 'Žane zmÄ›ny za daty Äas tutym kriterijam njewotpowÄ›duja.',
'recentchanges-feed-description' => 'Slěduj najaktualniše změny {{GRAMMAR:genitiw|{{SITENAME}}}} w tutym kanalu.',
'recentchanges-label-newpage' => 'Tuta změna je nowu stronu wutworiła',
'recentchanges-label-minor' => 'To je snadna změna',
@@ -1508,7 +1547,6 @@ SmÄ› mjenje haÄ $1 {{PLURAL:$1|znamjeÅ¡ko|znamjeÅ¡ce|znamjeÅ¡ka|znamjeÅ¡kow}} d
'recentchangeslinked-feed' => 'Změny zwjazanych stron',
'recentchangeslinked-toolbox' => 'Změny na zwjazanych stronach',
'recentchangeslinked-title' => 'Změny na stronach, kotrež su z „$1“ wotkazane',
-'recentchangeslinked-noresult' => 'Njejsu změny zwajzanych stron we wubranej dobje.',
'recentchangeslinked-summary' => "Tuta strona nalistuje poslednje zmÄ›ny na wotkazanych stronach (resp. pola kategorijow na ÄÅ‚onach kategorije).
Strony na [[Special:Watchlist|wobkedźbowankach]] su '''tuÄne'''.",
'recentchangeslinked-page' => 'Mjeno strony:',
@@ -1520,7 +1558,7 @@ Strony na [[Special:Watchlist|wobkedźbowankach]] su '''tuÄne'''.",
'reuploaddesc' => 'Nahraće přetorhnyć a so k nahrawanskemu formularej wróćić.',
'upload-tryagain' => 'Změnjene datajowe wopisanje wotpósłać',
'uploadnologin' => 'Njepřizjewjeny',
-'uploadnologintext' => 'Dyrbiš [[Special:UserLogin|přizjewjeny]] być, zo by dataje nahrawać móhł.',
+'uploadnologintext' => 'Dyrbiš so $1, zo by dataje nahrawać móhł.',
'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',
@@ -1745,7 +1783,6 @@ Za optimalnu wěstotu je img_auth.php znjemóžnjeny.',
'http-read-error' => 'ÄŒitanski zmylk HTTP.',
'http-timed-out' => 'NapraÅ¡owanje HTTP je Äas pÅ™ekroÄiÅ‚o.',
'http-curl-error' => 'Zmylk při wołanju URL: $1',
-'http-host-unreachable' => 'URL njeda so docpěć.',
'http-bad-status' => 'Problem je za HTTP-naprašowanje wustupił: $1 $2',
# Some likely curl errors. More could be added from <http://curl.haxx.se/libcurl/c/libcurl-errors.html>
@@ -1891,10 +1928,6 @@ Snano chceš wopisanje na jeje [$2 stronje datajoweho wopisanja] wobdźěłać.'
'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',
'statistics-mostpopular' => 'Najhusćišo wopytowane strony',
-'disambiguations' => 'Strony, kotrež na strony wjacezmyslnosće wotkazuja',
-'disambiguationspage' => 'Template:Wjacezmyslnosć',
-'disambiguations-text' => "Slědowace strony wobsahuja znajmjeńša jedyn wotkaz k stronje '''rozjasnjenja wjacezmyslnosće'''. Měli město toho na poprawnu stronu wotkazać.<br />Maja stronu za stronu rozjasnjenja wjacezmyslnosće, jeli předłohu wužiwa, na kotruž so wot [[MediaWiki:Disambiguationspage]] wotkazuje.",
-
'pageswithprop' => 'Strony z kajkosću strony',
'pageswithprop-legend' => 'Strony z kajkosću strony',
'pageswithprop-text' => 'Tuta strona nalistuje strony, kotrež wěstu kajkosć strony wužiwaja.',
@@ -2144,10 +2177,9 @@ Přichodne změny tuteje strony a přisłušneje diskusijneje strony budu so tam
'unwatchthispage' => 'wobkedźbowanje skónÄić',
'notanarticle' => 'njeje nastawk',
'notvisiblerev' => 'Wersija bu wušmórnjena',
-'watchnochange' => 'Žana z twojich wobkedźbowanych stron njebu w podatej dobje wobdźěłana.',
'watchlist-details' => '{{PLURAL:$1|$1 wobkedźbowana strona|$1 wobkedźbowanej stronje|$1 wobkedźbowane strony|$1 wobkedźbowanych stronow}}, diskusijne strony wuwzate.',
-'wlheader-enotif' => '* E-mejlowe zdźělenje je zmóžnjene.',
-'wlheader-showupdated' => '* Strony, kotrež buchu po twojim poslednim wopyće zmÄ›njene so <b>tuÄne</b> pokazuja.',
+'wlheader-enotif' => 'E-mejlowa zdźělenska słužba je zmóžnjena.',
+'wlheader-showupdated' => "Strony, kotrež su so po twojim poslednim wopyće zmÄ›nili, so '''tuÄne''' pokazuja.",
'watchmethod-recent' => 'Aktualne změny za wobkedźbowane strony přepruwować',
'watchmethod-list' => 'Wobkedźbowanki za aktualnymi změnami přepruwować',
'watchlistcontains' => 'Maš $1 {{PLURAL:$1|stronu|stronje|strony|stronow}} w swojich wobkedźbowankach.',
@@ -2537,14 +2569,12 @@ Hlej [[Special:BlockList|lisćinu blokowanjow]], zo by zablokowanjow pruwował.'
'ipb_blocked_as_range' => 'Zmylk: IP $1 njeje direktnje zablokowana a njeda so wublokować. Blokuje so wšak jako dźěl wobwoda $2, kotryž da so wublokować.',
'ip_range_invalid' => 'Njepłaciwy wobłuk IP-adresow.',
'ip_range_toolarge' => 'WobÅ‚ukowe bloki, kotrež su wjetÅ¡e haÄ /$1, njejsu dowolene.',
-'blockme' => 'Blokować',
'proxyblocker' => 'Awtomatiske blokowanje wotewrjenych proksy-serwerow',
-'proxyblocker-disabled' => 'Tuta funkcija je deaktiwizowana.',
'proxyblockreason' => 'Twoja IP-adresa bu zablokowana, dokelž je wotewrjeny proksy. Prošu skontaktuj swojeho prowidera abo syćoweho administratora a informuj jeho wo tutym chutnym wěstotnym problemje.',
-'proxyblocksuccess' => 'DokónÄene.',
'sorbs' => 'SORBS DNSbl',
'sorbsreason' => 'Twoja IP-adresa je jako wotewrjeny proksy na DNSBL {{GRAMMAR:genitiw|{{SITENAME}}}} zapisana.',
'sorbs_create_account_reason' => 'Twoja IP-adresa je jako wotewrjeny proksy na DNSBL {{GRAMMAR:genitiw|{{SITENAME}}}} zapisana. Njemóžeš konto wutworić.',
+'xffblockreason' => 'IP-adresa w header X-Forwarded-For, pak twoja pak ta proksy-serwera, kotryž wužiwaÅ¡, je so zablokowaÅ‚a. PrÄ›njotna pÅ™iÄina za blokowanje bÄ›: $1',
'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',
@@ -2695,6 +2725,8 @@ W poslednim padźe móžeš tež wotkaz wužiwać, na př. „[[{{#Special:Expor
'thumbnail-more' => 'powjetšić',
'filemissing' => 'Dataja pobrachuje',
'thumbnail_error' => 'Zmylk při wutworjenju miniaturki: $1',
+'thumbnail_error_remote' => 'Zmylkowa zdźělenka wot $1:
+$2',
'djvu_page_error' => 'Strona DjVU zwonka wobłuka strony',
'djvu_no_xml' => 'Daty XML njemóža so za dataju DjVU wotwołać',
'thumbnail-temp-create' => 'Temporerna dataja za miniaturny wobrazk njeda so wutworić',
@@ -2918,13 +2950,8 @@ W poslednim padźe móžeš tež wotkaz wužiwać, na př. „[[{{#Special:Expor
'pageinfo-category-files' => 'LiÄba datajow',
# Skin names
-'skinname-standard' => 'Klasiski',
-'skinname-nostalgia' => 'Nostalgija',
'skinname-cologneblue' => 'Kölnjanska módrina',
'skinname-monobook' => 'MonoBook',
-'skinname-myskin' => 'MySkin',
-'skinname-chick' => 'Ćipka',
-'skinname-simple' => 'Jednory',
'skinname-modern' => 'Moderny',
# Patrolling
@@ -3002,11 +3029,25 @@ $1',
'minutes' => '{{PLURAL:$1|$1 mjeńšinu|$1 mjeńšinomaj|$1 mjeńšinami|$1 mjeńšinami}}',
'hours' => '{{PLURAL:$1|$1 hodźinu|$1 hodźinomaj|$1 hodźinami|$1 hodźinami}}',
'days' => '{{PLURAL:$1|$1 dnjom|$1 dnjomaj|$1 dnjemi|$1 dnjemi}}',
+'weeks' => '{{PLURAL:$1|$1 tydźeń|$1 njedźeli|$1 njedźele|$1 njedźel}}',
'months' => '{{PLURAL:$1|$1 měsacom|$1 měsacomaj|$1 měsacami}}',
'years' => '{{PLURAL:$1|$1 lětom|$1 lětomaj|$1 lětami}}',
'ago' => 'před $1',
'just-now' => 'runje',
+# Human-readable timestamps
+'hours-ago' => 'před $1 {{PLURAL:$1|hodźinu|hodźinomaj|hodźinami}}',
+'minutes-ago' => 'před $1 {{PLURAL:$1|mjeńšinu|mjeńšinomaj|mjeńšinami}}',
+'seconds-ago' => 'před $1 {{PLURAL:$1|sekundu|sekundomaj|sekundami}}',
+'monday-at' => 'Póndźela $1',
+'tuesday-at' => 'Wutora $1',
+'wednesday-at' => 'Srjeda $1',
+'thursday-at' => 'Štwórtk $1',
+'friday-at' => 'Pjatk $1',
+'saturday-at' => 'Sobota $1',
+'sunday-at' => 'Njedźela $1',
+'yesterday-at' => 'WÄera $1',
+
# Bad image list
'bad_image_list' => 'Format:
@@ -3033,7 +3074,7 @@ Nasledne wotkazy na samsnej lince definuja wuwzaća, hdźež so wobraz smě naje
* gpslongitude
* gpsaltitude',
-# EXIF tags
+# Exif tags
'exif-imagewidth' => 'Šěrokosć',
'exif-imagelength' => 'Wysokosć',
'exif-bitspersample' => 'Bitow na barbowu komponentu',
@@ -3211,7 +3252,7 @@ Nasledne wotkazy na samsnej lince definuja wuwzaća, hdźež so wobraz smě naje
'exif-originalimageheight' => 'Wysokosć wobraza před přitřihowanjom',
'exif-originalimagewidth' => 'Šěrokosć wobraza před přitřihowanjom',
-# EXIF attributes
+# Exif attributes
'exif-compression-1' => 'Njekomprimowany',
'exif-compression-2' => 'CCITT skupina 3 jednodimensionalne modificěrowane kodowanje Huffman běhoweje dołhosće',
'exif-compression-3' => 'CCITT skupina 3 faksowe kodowanje',
@@ -3597,7 +3638,6 @@ Móžeš tež [[Special:EditWatchlist|standardnu wobdźěłowansku stronu]] wuž
'version-other' => 'Druhe',
'version-mediahandlers' => 'Předźěłaki medijow',
'version-hooks' => 'Hoki',
-'version-extension-functions' => 'Funkcije rozšěrjenjow',
'version-parser-extensiontags' => "Parserowe rozÅ¡Ä›rjenja ''(tafliÄki)''",
'version-parser-function-hooks' => 'Parserowe funkcije',
'version-hook-name' => 'Mjeno hoki',
@@ -3619,12 +3659,17 @@ Ty měł [{{SERVER}}{{SCRIPTPATH}}/COPYING kopiju licency GNU General Public Lic
'version-entrypoints-header-entrypoint' => 'Zastupny dypk',
'version-entrypoints-header-url' => 'URL',
-# Special:FilePath
-'filepath' => 'Datajowy puć',
-'filepath-page' => 'Dataja:',
-'filepath-submit' => 'Pytać',
-'filepath-summary' => 'Tuta specialna strona wróća dospołny puć aktualneje datajoweje wersije.
-Wobrazy so połnym rozeznaću pokazuja, druhe datajowe typy so ze zwjazanym programom startuja.',
+# Special:Redirect
+'redirect' => 'Po datajowym mjenje, wužiwarju abo wersijowym ID dale sposrědkować',
+'redirect-legend' => 'Do dataje abo strony dale sposrědkować',
+'redirect-summary' => 'Tuta specialna strona so do dataje (datajowe mjeno je podate), strony (wersijowy ID je podaty) abo wužiwarskeje strony (numeriski wužiwarski ID je podaty) dale sposrědkuje.',
+'redirect-submit' => 'Los',
+'redirect-lookup' => 'Pytać:',
+'redirect-value' => 'Hódnota:',
+'redirect-user' => 'ID wužiwarja',
+'redirect-revision' => 'Wersija strony',
+'redirect-file' => 'Datajowe mjeno',
+'redirect-not-exists' => 'Hódnota njeje so namakała',
# Special:FileDuplicateSearch
'fileduplicatesearch' => 'Dwójne dataje pytać',
@@ -3715,6 +3760,9 @@ Wobrazy so połnym rozeznaću pokazuja, druhe datajowe typy so ze zwjazanym prog
'htmlform-submit' => 'Wotpósłać',
'htmlform-reset' => 'Změny cofnyć',
'htmlform-selectorother-other' => 'Druhe',
+'htmlform-no' => 'NÄ›',
+'htmlform-yes' => 'Haj',
+'htmlform-chosen-placeholder' => 'Wubjer móžnosć',
# SQLite database support
'sqlite-has-fts' => '$1 połnotekstowe pytanje podpěruje.',
diff --git a/languages/messages/MessagesHt.php b/languages/messages/MessagesHt.php
index ef8f3eb9..c07491d9 100644
--- a/languages/messages/MessagesHt.php
+++ b/languages/messages/MessagesHt.php
@@ -171,9 +171,6 @@ $messages = array(
'tog-shownumberswatching' => 'Montre kantite itlizatè k’ap swiv',
'tog-oldsig' => 'Gade pou wè siyati ki egziste deja:',
'tog-fancysig' => 'Konsidere siyati sa tankou yon wikitèks (san lyen ki ta otomatik)',
-'tog-externaleditor' => 'Itilize editè ki pa nan sistèm wikimedya pa defo',
-'tog-externaldiff' => 'Itilize yon konparatè ki pa nan sitsèm wikimedya pa defo',
-'tog-showjumplinks' => 'Pèmèt lyen aksesibilite « ale nan »',
'tog-uselivepreview' => 'Itilize kout je an dirèk (sa mande JavaScrip) (Esperimantal)',
'tog-forceeditsummary' => 'Notifye m lè m ap antre yon somè modifikasyon vid',
'tog-watchlisthideown' => 'Kache modifikasyon m yo nan lis swivi mwen a',
@@ -370,7 +367,7 @@ $1',
'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).
+# 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).
'aboutsite' => 'Apwopo {{SITENAME}}',
'aboutpage' => 'Project:Apwopo',
'copyright' => 'Kontni disponib anba $1.',
@@ -380,7 +377,6 @@ $1',
'disclaimers' => 'Avètisman',
'disclaimerpage' => 'Project:Avètisman jeneral yo',
'edithelp' => 'Èd pou modifye paj',
-'edithelppage' => 'Help:Modifye yon paj',
'helppage' => 'Help:Èd',
'mainpage' => 'Paj prensipal',
'mainpage-description' => 'Paj prensipal',
@@ -451,17 +447,6 @@ Ou ka jwenn yon lis paj espesial ki valid yo la [[Special:SpecialPages|{{int:spe
# General errors
'error' => 'Erè',
'databaseerror' => 'Erè nan bazdone.',
-'dberrortext' => 'Yon rekèt nan bazdone a bay yon erè.
-Sa kapab vle di genyen yon erè nan lojisyèl nan.
-Dènye esè a te :
-<blockquote><tt>$1</tt></blockquote>
-depi fonksyon sa « <tt>$2</tt> ».
-Bazdone ritounen erè sa « <tt>$3 : $4</tt> ».',
-'dberrortextcl' => 'Yon rekèt nan bazdone a bay yon erè.
-Dènye esè nan baz done a te:
-« $1 »
-depi fonksyon sa « $2 ».
-Bazdone a te bay mesaj erè sa « $3 : $4 ».',
'laggedslavemode' => "'''Atansyon:''' paj sa a kapab pa anrejistre modifikasyon ki fèk fèt yo.",
'readonly' => 'Bazdone a fèmen toutbon.',
'enterlockreason' => 'Bay yon rezon pou fème bazdone a ak yon estimasyon ki lè w ap ouvri l ankò',
@@ -507,7 +492,6 @@ Demann : $2',
'viewsourcetext' => 'Ou kapab gade epitou modifye kontni atik sa a pou ou travay anlè li :',
'protectedinterface' => 'Paj sa ap bay tèks pou entèfas lojisyèl an e li pwoteje pou anpeche move itilizasyon nou ta kapab fè ak li.',
'editinginterface' => "'''Pòte atansyon :''' ou ap modifye yon paj ki itilize nan kreyasyon tèks entèfas lojisyèl an. Chanjman yo ap ritounen, li ap depann de kèk sityasyon, nan tout paj ke lòt itilizatè yo kapab wè tou. Pou tradiksyon yo, nap envite w itilize pwojè MediaWiki pou mesaj entènasyonal yo (tradiksyon) nan paj sa [//translatewiki.net/wiki/Main_Page?setlang=fr translatewiki.net].",
-'sqlhidden' => '(Demann SQL an kache)',
'cascadeprotected' => 'Paj sa pwoteje kounye a paske l nan {{PLURAL:$1|paj ki douvan l|paj yo ki douvan l}}, paske {{PLURAL:$1|l te pwoteje|yo te pwoteje}} ak opsyon « pwoteksyon pou tout paj ki nan premye paj an - kaskad » aktive :
$2',
'namespaceprotected' => "Ou pa gen dwa modifye paj nan espas non « '''$1''' ».",
@@ -529,7 +513,6 @@ Note ke kèk paj gendwa afiche tankou ou te toujou konekte tank ou pa efase kach
'yourpassword' => 'Mopas ou an :',
'yourpasswordagain' => 'Mete mopas ou an ankò :',
'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',
@@ -611,7 +594,7 @@ Pa pòte atansyon pou mesaj sa si kont sa kreye pa erè.',
'newpassword' => 'Nouvo mopas:',
'retypenew' => 'Konfime nouvo mopas an :',
'resetpass_submit' => 'Chanje mopas epitou konekte',
-'resetpass_success' => 'Nou chanje mopas ou an avèk siksè ! Nap konekte ou kounye a...',
+'changepassword-success' => 'Nou chanje mopas ou an avèk siksè ! Nap konekte ou kounye a...',
'resetpass_forbidden' => 'Nou pa kapab chanje mopas yo nan sistèm sa',
'resetpass-no-info' => 'Ou dwe konekte ou pou ou kapab jwenn paj sa.',
'resetpass-submit-loggedin' => 'Modifye mopas sa',
@@ -890,7 +873,6 @@ Lejand : ({{MediaWiki:Cur}}) = diferans ak vèsyon kounye a, ({{MediaWiki:Last}}
'prevn' => '{{PLURAL:$1|$1}} anvan yo',
'nextn' => '{{PLURAL:$1|$1}} swivan yo',
'viewprevnext' => 'Wè ($1 {{int:pipe-separator}} $2) ($3).',
-'searchhelp-url' => 'Help:Èd',
'searchprofile-everything' => 'Tout',
'search-result-size' => '$1 ({{PLURAL:$2| mo|$2 mo yo}})',
'search-redirect' => '(redireksyon depi $1)',
@@ -972,7 +954,6 @@ Si ou mete li, n ap itilize li pou nou ka nonmen ou pou kontribisyon ou yo.',
'recentchangeslinked-feed' => 'Swivi pou lyen yo',
'recentchangeslinked-toolbox' => 'Swivi pou lyen yo',
'recentchangeslinked-title' => 'Chanjman ki an relasyon ak "$1"',
-'recentchangeslinked-noresult' => 'Pa genyen pyès chanjman nan paj lye sa yo pou peryòd ou bay la.',
'recentchangeslinked-summary' => "Paj espesyal sa a ap montre dènye chanjman nan paj ki genyen lyen depi yon paj spesifie (oubyen pou manm you kategori spesifie) yo. Paj yo ki nan [[Special:Watchlist|lis swivi]] ou an ap ekri '''fonse'''",
'recentchangeslinked-page' => 'Non paj la :',
'recentchangeslinked-to' => 'Afiche modifikasyon yo ki genyen yon lyen vè paj yo ba ou a plito',
@@ -1022,8 +1003,6 @@ Si ou mete li, n ap itilize li pou nou ka nonmen ou pou kontribisyon ou yo.',
# Statistics
'statistics' => 'Estatistik',
-'disambiguations' => 'Paj yo ki genyen menm non',
-
'doubleredirects' => 'Redireksyon de fwa',
'brokenredirects' => 'redireksyon ki pa mache yo',
diff --git a/languages/messages/MessagesHu.php b/languages/messages/MessagesHu.php
index f2b92346..5ad847a8 100644
--- a/languages/messages/MessagesHu.php
+++ b/languages/messages/MessagesHu.php
@@ -28,6 +28,7 @@
* @author Kaganer
* @author KossuthRad
* @author Misibacsi
+ * @author Nemo bis
* @author R-Joe
* @author Samat
* @author Sucy
@@ -344,9 +345,6 @@ $messages = array(
'tog-shownumberswatching' => 'A lapot figyelő szerkesztők számának megjelenítése',
'tog-oldsig' => 'A jelenlegi aláírás:',
'tog-fancysig' => 'Az aláírás wikiszöveg (nem lesz automatikusan hivatkozásba rakva)',
-'tog-externaleditor' => 'Külső szerkesztőprogram használata (Csak haladók számára, speciális beállításokra van szükség a számítógépen. [//www.mediawiki.org/wiki/Manual:External_editors További információ angolul.])',
-'tog-externaldiff' => 'Külső diff program használata (Csak haladók számára, speciális beállításokra van szükség a számítógépen. [//www.mediawiki.org/wiki/Manual:External_editors További információ angolul.])',
-'tog-showjumplinks' => 'Helyezzen el hivatkozást („Ugrásâ€) a beépített eszköztárra',
'tog-uselivepreview' => 'Élő előnézet használata (kísérleti)',
'tog-forceeditsummary' => 'Figyelmeztessen, ha nem adok meg szerkesztési összefoglalót',
'tog-watchlisthideown' => 'Saját szerkesztések elrejtése',
@@ -359,6 +357,8 @@ $messages = array(
'tog-diffonly' => 'Ne mutassa a lap tartalmát a lapváltozatok közötti eltérések megtekintésekor',
'tog-showhiddencats' => 'Rejtett kategóriák megjelenítése',
'tog-norollbackdiff' => 'Ne jelenjenek meg az eltérések visszaállítás után',
+'tog-useeditwarning' => 'Figyelmeztessen, ha szerkesztéskor a módosítások mentése nélkül akarom elhagyni a lapot',
+'tog-prefershttps' => 'Mindig biztonságos kapcsolatot használjon, amikor be vagyok jelentkezve',
'underline-always' => 'mindig',
'underline-never' => 'soha',
@@ -422,6 +422,18 @@ $messages = array(
'oct' => 'okt',
'nov' => 'nov',
'dec' => 'dec',
+'january-date' => 'Január $1',
+'february-date' => 'Február $1',
+'march-date' => 'Március $1',
+'april-date' => 'Ãprilis $1',
+'may-date' => 'Május $1',
+'june-date' => 'Június $1',
+'july-date' => 'Július $1',
+'august-date' => 'Augusztus $1',
+'september-date' => 'Szeptember $1',
+'october-date' => 'Október $1',
+'november-date' => 'November $1',
+'december-date' => 'December $1',
# Categories related messages
'pagecategories' => '{{PLURAL:$1|Kategória|Kategória}}',
@@ -503,6 +515,7 @@ $messages = array(
'create-this-page' => 'Oldal létrehozása',
'delete' => 'Törlés',
'deletethispage' => 'Lap törlése',
+'undeletethispage' => 'Lap helyreállítása',
'undelete_short' => '{{PLURAL:$1|Egy|$1}} szerkesztés helyreállítása',
'viewdeleted_short' => '{{PLURAL:$1|Egy|$1}} törölt szerkesztés megtekintése',
'protect' => 'Lapvédelem',
@@ -545,7 +558,7 @@ $1',
'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).
+# 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).
'aboutsite' => 'A {{SITENAME}} wikiről',
'aboutpage' => 'Project:Rólunk',
'copyright' => 'A tartalom további jelölés hiányában a(z) $1 feltételei szerint használható fel.',
@@ -555,7 +568,6 @@ $1',
'disclaimers' => 'Jogi nyilatkozat',
'disclaimerpage' => 'Project:Jogi nyilatkozat',
'edithelp' => 'Szerkesztési segítség',
-'edithelppage' => 'Help:Szerkesztés',
'helppage' => 'Help:Tartalom',
'mainpage' => 'Kezdőlap',
'mainpage-description' => 'Kezdőlap',
@@ -634,15 +646,11 @@ Az érvényes speciális lapok listáját a [[Special:SpecialPages|{{int:special
# General errors
'error' => 'Hiba',
'databaseerror' => 'Adatbázishiba',
-'dberrortext' => 'Szintaktikai hiba található az adatbázis-lekérdezésben.
-Ezt szoftverhiba okozhatta.
-Az utolsó adatbázis-lekérdezés a(z) „<code>$2</code>†függvényből történt, és a következő volt:
-<blockquote><code>$1</code></blockquote>
-Az adatbázis ezzel a hibával tért vissza: „<samp>$3: $4</samp>â€.',
-'dberrortextcl' => 'Szintaktikai hiba található az adatbázis-lekérdezésben.
-Az utolsó adatbázis-lekérdezés a(z) „$2†függvényből történt, és a következő volt:
-„$1â€
-Az adatbázis ezzel a hibával tért vissza: „$3: $4â€.',
+'databaseerror-text' => 'Hiba történt az adatbázis-lekérdezés során. Lehetséges, hogy ez egy szoftverhiba eredménye.',
+'databaseerror-textcl' => 'Hiba történt az adatbázis-lekérdezés során.',
+'databaseerror-query' => 'Lekérdezés: $1',
+'databaseerror-function' => 'Függvény: $1',
+'databaseerror-error' => 'Hiba: $1',
'laggedslavemode' => "'''Figyelem:''' Ez a lap nem feltétlenül tartalmazza a legfrissebb változtatásokat!",
'readonly' => 'Az adatbázis le van zárva',
'enterlockreason' => 'Add meg a lezárás okát, valamint egy becslést, hogy mikor lesz a lezárásnak vége',
@@ -676,6 +684,7 @@ Talán már valaki más törölte.',
'cannotdelete-title' => 'Nem lehet törölni a(z) „$1†lapot',
'delete-hook-aborted' => 'A törlés meg lett szakítva egy hook által.
Nem lett magyarázat csatolva.',
+'no-null-revision' => 'Nem sikerült új null-revíziót létrehozni a(z) „$1†lap számára.',
'badtitle' => 'Hibás cím',
'badtitletext' => 'A kért oldal címe érvénytelen, üres, vagy rosszul hivatkozott nyelvközi vagy wikiközi cím volt. Olyan karaktereket is tartalmazhatott, melyek a címekben nem használhatóak.',
'perfcached' => "Az alábbi adatok gyorsítótárból (''cache''-ből) származnak, és ezért lehetséges, hogy nem a legfrissebb változatot mutatják. Legfeljebb {{PLURAL:$1|egy|$1 }} eredmény áll rendelkezésre a gyorsítótárban.",
@@ -693,12 +702,15 @@ Lekérdezés: $2',
'viewyourtext' => "Megtekintheted és kimásolhatod a '''saját szerkesztéseidet''' az alábbi lapra:",
'protectedinterface' => 'Ez a lap a szoftver felületéhez szolgáltat szöveget, és a visszaélések elkerülése miatt le van zárva.',
'editinginterface' => "'''Vigyázat:''' egy olyan lapot szerkesztesz, ami a MediaWiki szoftver felületéhez tartozik. A lap megváltoztatása hatással lesz a kinézetre, ahogy más szerkesztők látják a lapot. Fordításra inkább használd a MediaWiki fordítására indított kezdeményezést, a [//translatewiki.net/wiki/Main_Page?setlang=hu translatewiki.net-et].",
-'sqlhidden' => '(rejtett SQL lekérdezés)',
'cascadeprotected' => 'Ez a lap szerkesztés elleni védelemmel lett ellátva, mert a következő {{PLURAL:$1|lapon|lapokon}} be van kapcsolva a „kaszkádolt†védelem:
$2',
'namespaceprotected' => "Nincs jogosultságod a(z) '''$1''' névtérben található lapok szerkesztésére.",
'customcssprotected' => 'Nem szerkesztheted ezt a CSS-lapot, mert egy másik felhasználó személyes beállításait tartalmazza.',
'customjsprotected' => 'Nem szerkesztheted ezt a JavaScript-lapot, mert egy másik felhasználó személyes beállításait tartalmazza.',
+'mycustomcssprotected' => 'Nincs jogod szerkeszteni ezt a CSS lapot.',
+'mycustomjsprotected' => 'Nincs jogod szerkeszteni ezt a Javascript lapot.',
+'myprivateinfoprotected' => 'Nincs jogod módosítani a privát adataidat.',
+'mypreferencesprotected' => 'Nincs jogod módosítani a beállításaidat.',
'ns-specialprotected' => 'A speciális lapok nem szerkeszthetők.',
'titleprotected' => "Ilyen címmel nem lehet szócikket készíteni, [[User:$1|$1]] letiltotta.
Az indoklás: „''$2''â€.",
@@ -723,10 +735,19 @@ Lehetséges, hogy néhány oldalon továbbra is azt látod, be vagy jelentkezve,
'welcomecreation-msg' => 'A felhasználói fiókod elkészült.
Ne felejtsd el módosítani a [[Special:Preferences|{{SITENAME}} beállításaidat]].',
'yourname' => 'Szerkesztőneved:',
+'userlogin-yourname' => 'Felhasználónév',
+'userlogin-yourname-ph' => 'Add meg a felhasználóneved',
+'createacct-another-username-ph' => 'Add meg a felhasználónevet',
'yourpassword' => 'Jelszavad:',
+'userlogin-yourpassword' => 'Jelszó',
+'userlogin-yourpassword-ph' => 'Add meg a jelszavad',
+'createacct-yourpassword-ph' => 'Add meg a jelszavad',
'yourpasswordagain' => 'Jelszavad ismét:',
+'createacct-yourpasswordagain' => 'Új jelszó megerősítése',
+'createacct-yourpasswordagain-ph' => 'Ãrd be a jelszót újra',
'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',
+'userlogin-remembermypassword' => 'Maradjak bejelentkezve',
+'userlogin-signwithsecure' => 'Biztonságos kapcsolat használata',
'yourdomainname' => 'A domainneved:',
'password-change-forbidden' => 'Nem módosíthatod a jelszót ezen a wikin.',
'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.',
@@ -738,18 +759,41 @@ Ne felejtsd el módosítani a [[Special:Preferences|{{SITENAME}} beállításaid
'logout' => 'Kijelentkezés',
'userlogout' => 'Kijelentkezés',
'notloggedin' => 'Nem vagy bejelentkezve',
+'userlogin-noaccount' => 'Nem rendelkezel még felhasználói fiókkal?',
+'userlogin-joinproject' => 'Csatlakozz a(z) {{SITENAME}} wikihez',
'nologin' => 'Nem rendelkezel még felhasználói fiókkal? $1.',
'nologinlink' => 'Itt regisztrálhatsz',
'createaccount' => 'Regisztráció',
'gotaccount' => "Ha már korábban regisztráltál, '''$1'''.",
'gotaccountlink' => 'Bejelentkezés',
'userlogin-resetlink' => 'Elfelejtetted a bejelentkezési adataidat?',
+'userlogin-resetpassword-link' => 'A jelszó alaphelyzetbe állítása',
+'helplogin-url' => 'Help:Bejelentkezés',
+'userlogin-helplink' => '[[{{MediaWiki:helplogin-url}}|Segítség a bejelentkezéshez]]',
+'createacct-join' => 'Add meg az alábbi információkat.',
+'createacct-another-join' => 'Add meg az új fiók adatait alább.',
+'createacct-emailrequired' => 'E-mail cím',
+'createacct-emailoptional' => 'E-mail cím (opcionális)',
+'createacct-email-ph' => 'Add meg e-mail címed',
+'createacct-another-email-ph' => 'Add meg az emailcímet',
'createaccountmail' => 'Ãtmeneti, véletlenszerű jelszó beállítása és kiküldése a megadott e-mail címre',
+'createacct-realname' => 'Igazi neved (nem kötelező)',
'createaccountreason' => 'Indoklás:',
+'createacct-reason' => 'Indoklás',
+'createacct-reason-ph' => 'Miért hozol létre egy másik fiókot',
+'createacct-captcha' => 'Biztonsági ellenőrzés',
+'createacct-imgcaptcha-ph' => 'Ãrd be a szöveget, amit fent látsz',
+'createacct-submit' => 'Felhasználói fiók létrehozása',
+'createacct-another-submit' => 'Újabb felhasználó létrehozása',
+'createacct-benefit-heading' => 'A(z) {{SITENAME}}-t hozzád hasonló emberek készítik.',
+'createacct-benefit-body1' => '{{PLURAL:$1|szerkesztés|szerkesztés}}',
+'createacct-benefit-body2' => '{{PLURAL:$1|lap|lap}}',
+'createacct-benefit-body3' => 'aktív {{PLURAL:$1|szerkesztő|szerkesztő}}',
'badretype' => 'A megadott jelszavak nem egyeznek.',
'userexists' => 'A megadott felhasználónév már foglalt.
Kérlek, válassz másikat!',
'loginerror' => 'Hiba történt a bejelentkezés során',
+'createacct-error' => 'Fióklétrehozási hiba',
'createaccounterror' => 'Nem sikerült létrehozni a felhasználói fiókot: $1',
'nocookiesnew' => 'A felhasználói fiókod létrejött, de nem vagy bejelentkezve. A wiki sütiket („cookieâ€) használ a szerkesztÅ‘k azonosítására. Nálad ezek le vannak tiltva. Kérlek, engedélyezd Å‘ket a böngészÅ‘dben, majd lépj be az új azonosítóddal és jelszavaddal.',
'nocookieslogin' => 'A wiki sütiket („cookieâ€) használ a szerkesztÅ‘k azonosításhoz.
@@ -807,7 +851,7 @@ A hozzá tartozó jelszó "$3", melyet a bejelentkezés után minél előbb vál
Ha nem kértél új azonosítót, és tévedésből kaptad ezt a levelet, hagyd figyelmen kívül.',
'usernamehasherror' => 'A felhasználónév nem tartalmazhat hash karaktereket',
'login-throttled' => 'Túl sok hibás bejelentkezés.
-Várj egy kicsit, mielőtt újra próbálkozol.',
+Várj $1, mielőtt újra próbálkozol.',
'login-abort-generic' => 'A bejelentkezés sikertelen – megszakítva',
'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.',
@@ -826,7 +870,7 @@ Várj egy kicsit, mielőtt újra próbálkozol.',
'newpassword' => 'Új jelszó:',
'retypenew' => 'Új jelszó ismét:',
'resetpass_submit' => 'Add meg a jelszót és jelentkezz be',
-'resetpass_success' => 'A jelszavad megváltoztatása sikeresen befejeződött! Bejelentkezés...',
+'changepassword-success' => 'A jelszavad megváltoztatása sikeresen befejeződött!',
'resetpass_forbidden' => 'A jelszavak nem változtathatók meg',
'resetpass-no-info' => 'Be kell jelentkezned, hogy közvetlenül elérd ezt a lapot.',
'resetpass-submit-loggedin' => 'Jelszó megváltoztatása',
@@ -838,10 +882,11 @@ Lehet, hogy már sikeresen megváltoztattad a jelszavad, vagy pedig időközben
# Special:PasswordReset
'passwordreset' => 'Jelszó törlése',
-'passwordreset-text' => 'Az alábbi űrlap kitöltése után egy jelszóemlékeztető e-mailt kapsz a fiókod adataival.',
+'passwordreset-text-one' => 'A jelszavad alaphelyzetbe állításához töltsd ki az űrlapot.',
+'passwordreset-text-many' => '{{PLURAL:$1|A jelszavad alaphelyzetbe állításához töltsd ki az alábbi mezők egyikét.}}',
'passwordreset-legend' => 'Új jelszó kérése',
'passwordreset-disabled' => 'Új jelszó kérése nem engedélyezett ezen a wikin.',
-'passwordreset-pretext' => '{{PLURAL:$1||Ãrd be az alábbi adatok egyikét}}',
+'passwordreset-emaildisabled' => 'Az e-mail funkció le van tiltva ezen a wikin.',
'passwordreset-username' => 'Felhasználónév:',
'passwordreset-domain' => 'Tartomány:',
'passwordreset-capture' => 'Meg szeretnéd nézni az elkészült üzenetet?',
@@ -862,7 +907,7 @@ $2
Ideiglenes jelszó: $2',
'passwordreset-emailsent' => 'Jelszó-visszaállító e-mail elküldve.',
'passwordreset-emailsent-capture' => 'Az alább látható jelszó-visszaállító e-mail lett elküldve.',
-'passwordreset-emailerror-capture' => 'Az emlékeztető levél generálása megtörtént, mint az alább látszik, de elküldése a szerkesztőnek nem sikerült: $1',
+'passwordreset-emailerror-capture' => 'A jelszó-visszaállító e-mail generálása megtörtént, mint az alább látszik, de elküldése a {{GENDER:$2|szerkesztőnek}} nem sikerült: $1',
# Special:ChangeEmail
'changeemail' => 'E-mail cím megváltoztatása',
@@ -1070,12 +1115,15 @@ Nem lett magyarázat csatolva.',
Úgy tűnik, hogy törölve lett.',
'edit-conflict' => 'Szerkesztési ütközés.',
'edit-no-change' => 'A szerkesztésed figyelmen kívül lett hagyva, mivel nem változtattál a lap szövegén.',
+'postedit-confirmation' => 'A szerkesztésedet elmentettük.',
'edit-already-exists' => 'Az új lap nem készíthető el.
Már létezik.',
'defaultmessagetext' => 'Alapértelmezett szöveg',
'content-failed-to-parse' => 'Hiba történt a $2 tartalom $1 modellre történő konvertálása során: $3',
'invalid-content-data' => 'Érvénytelen tartalom adat',
'content-not-allowed-here' => '"$1" tartalom nem engedélyezett a [[$2]] oldalon',
+'editwarning-warning' => 'A lap elhagyásával az összes itt végzett változtatás elveszhet.
+Ha be vagy jelentkezve letilthatod ezt a figyelmeztetést a beállításaid „Szerkesztés†szakaszában.',
# Content models
'content-model-wikitext' => 'wikiszöveg',
@@ -1284,6 +1332,7 @@ Győződj meg róla, hogy a laptörténet folytonossága megmarad.',
'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-empty' => '(Nincs különbség)',
'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)',
'difference-missing-revision' => 'A(z) "{{PAGENAME}}" nevű oldal #$1 $2 változata nem létezik.
@@ -1310,7 +1359,6 @@ Ezt általában egy elavult, törölt oldalra mutató laptörténeti hivatkozás
'searchmenu-legend' => 'Keresési beállítások',
'searchmenu-exists' => "'''A wikin már van „[[:$1]]†nevű lap'''",
'searchmenu-new' => "'''Hozd létre a(z) „[[:$1]]†nevű lapot ezen a wikin!'''",
-'searchhelp-url' => 'Help:Tartalom',
'searchmenu-prefix' => '[[Special:PrefixIndex/$1|Ilyen előtagú lapok listázása]]',
'searchprofile-articles' => 'Tartalmi oldalak',
'searchprofile-project' => 'Segítség- és projektlapok',
@@ -1351,15 +1399,7 @@ Ezt általában egy elavult, törölt oldalra mutató laptörténeti hivatkozás
'powersearch-togglenone' => 'Egyik sem',
'search-external' => 'Külső kereső',
'searchdisabled' => 'Elnézésed kérjük, de a teljes szöveges keresés terhelési okok miatt átmenetileg nem használható. Ezidő alatt használhatod a lenti Google keresést, mely viszont lehetséges, hogy nem teljesen friss adatokkal dolgozik.',
-
-# Quickbar
-'qbsettings' => 'Gyorsmenü',
-'qbsettings-none' => 'Nincs',
-'qbsettings-fixedleft' => 'Fix baloldali',
-'qbsettings-fixedright' => 'Fix jobboldali',
-'qbsettings-floatingleft' => 'Lebegő baloldali',
-'qbsettings-floatingright' => 'Lebegő jobboldali',
-'qbsettings-directionality' => 'Rögzített, a nyelved írásának irányától függően',
+'search-error' => 'A keresés közben hiba történt: $1',
# Preferences page
'preferences' => 'Beállítások',
@@ -1393,7 +1433,6 @@ Ezt általában egy elavult, törölt oldalra mutató laptörténeti hivatkozás
'resetprefs' => 'Alaphelyzet',
'restoreprefs' => 'A beállítások alaphelyzetbe állítása',
'prefs-editing' => 'Szerkesztés',
-'prefs-edit-boxsize' => 'A szerkesztőablak mérete.',
'rows' => 'Sor',
'columns' => 'Oszlop',
'searchresultshead' => 'Keresés',
@@ -1404,9 +1443,9 @@ Ezt általában egy elavult, törölt oldalra mutató laptörténeti hivatkozás
'recentchangesdays-max' => '(maximum {{PLURAL:$1|egy|$1}} nap)',
'recentchangescount' => 'Az alapértelmezettként mutatott szerkesztések száma:',
'prefs-help-recentchangescount' => 'Ez vonatkozik a friss változtatásokra, laptörténetekre és naplókra is.',
-'prefs-help-watchlist-token' => 'Ha ebbe a mezőbe beírsz egy titkos kulcsot, RSS feed fog készülni a figyelőlistádról.
-Bárki, aki tudja a fenti mezőbe beírt kulcsot, látni fogja a figyelőlistádat, így válassz egy titkos értéket.
-Itt van egy véletlenszerűen generált érték, amit használhatsz: $1',
+'prefs-help-watchlist-token2' => 'Ez a titkos kulcs a figyelőlistádhoz.
+Aki ismeri, meg tudja nézni, milyen lapokat figyelsz, úgyhogy ne oszdd meg másokkal.
+[[Special:ResetTokens|Kattints ide, ha meg akarod változtatni]].',
'savedprefs' => 'Az új beállításaid érvénybe léptek.',
'timezonelegend' => 'Időzóna:',
'localtime' => 'Helyi idő:',
@@ -1437,7 +1476,6 @@ Itt van egy véletlenszerűen generált érték, amit használhatsz: $1',
'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:',
-'prefs-textboxsize' => 'A szerkesztőablak mérete',
'youremail' => 'Az e-mail címed:',
'username' => '{{GENDER:$1|Szerkesztőnév}}:',
'uid' => '{{GENDER:$1|Azonosító}}:',
@@ -1468,6 +1506,8 @@ A műveletet nem lehet visszavonni.',
'prefs-dateformat' => 'Dátumformátum',
'prefs-timeoffset' => 'Időeltérés',
'prefs-advancedediting' => 'Ãltalános',
+'prefs-editor' => 'Szerkesztő',
+'prefs-preview' => 'Előnézet',
'prefs-advancedrc' => 'Haladó beállítások',
'prefs-advancedrendering' => 'Haladó beállítások',
'prefs-advancedsearchoptions' => 'Haladó beállítások',
@@ -1501,6 +1541,7 @@ A műveletet nem lehet visszavonni.',
'userrights-notallowed' => 'Nincs jogosultságod jogosultságok adására vagy elvételére.',
'userrights-changeable-col' => 'Megváltoztatható csoportok',
'userrights-unchangeable-col' => 'Nem megváltoztatható csoportok',
+'userrights-conflict' => 'Felhasználói jogok ütközése! Kérlek, végezd el újra a változtatásokat.',
# Groups
'group' => 'Csoport:',
@@ -1566,7 +1607,7 @@ A műveletet nem lehet visszavonni.',
'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 kaszkádolt védelemmel rendelkező lapok szerkesztése',
-'right-editprotected' => 'kaszkád védelem nélküli védett lapok szerkesztése',
+'right-editprotected' => '"{{int:protect-level-sysop}}" védelmi szintű lapok szerkesztése',
'right-editinterface' => 'felhasználói felület szerkesztése',
'right-editusercssjs' => 'más felhasználók CSS és JS fájljainak szerkesztése',
'right-editusercss' => 'más felhasználók CSS fájljainak szerkesztése',
@@ -1635,9 +1676,12 @@ A műveletet nem lehet visszavonni.',
# Recent changes
'nchanges' => '{{PLURAL:$1|egy|$1}} változtatás',
+'enhancedrc-since-last-visit' => '$1 az utolsó látogatás óta',
+'enhancedrc-history' => 'történet',
'recentchanges' => 'Friss változtatások',
'recentchanges-legend' => 'A friss változtatások beállításai',
'recentchanges-summary' => 'Ezen a lapon a wikiben történt legutóbbi fejleményeket lehet nyomon követni.',
+'recentchanges-noresult' => 'A megadott időszakban nincs a feltételeknek megfelelő szerkesztés.',
'recentchanges-feed-description' => 'Kövesd a wiki friss változtatásait ezzel a hírcsatornával.',
'recentchanges-label-newpage' => 'Ezzel a szerkesztéssel egy új lap jött létre',
'recentchanges-label-minor' => 'Ez egy apró szerkesztés',
@@ -1674,7 +1718,6 @@ A műveletet nem lehet visszavonni.',
'recentchangeslinked-feed' => 'Kapcsolódó változtatások',
'recentchangeslinked-toolbox' => 'Kapcsolódó változtatások',
'recentchangeslinked-title' => 'A(z) $1 laphoz kapcsolódó változtatások',
-'recentchangeslinked-noresult' => 'A megadott időtartam alatt nem történt változtatás a kapcsolódó lapokon.',
'recentchangeslinked-summary' => "Alább azon lapoknak a legutóbbi változtatásai láthatóak, amelyekre hivatkozik egy megadott lap (vagy tagjai a megadott kategóriának).
A [[Special:Watchlist|figyelőlistádon]] szereplő lapok '''félkövérrel''' vannak jelölve.",
'recentchangeslinked-page' => 'Lap neve:',
@@ -1686,7 +1729,7 @@ A [[Special:Watchlist|figyelőlistádon]] szereplő lapok '''félkövérrel''' v
'reuploaddesc' => 'Visszatérés a feltöltési űrlaphoz.',
'upload-tryagain' => 'Módosított fájl-leírás elküldése',
'uploadnologin' => 'Nem vagy bejelentkezve',
-'uploadnologintext' => 'Csak regisztrált felhasználók tölthetnek fel fájlokat. [[Special:UserLogin|Jelentkezz be]] vagy regisztrálj!',
+'uploadnologintext' => '{{UCFIRST:$1}} fájlok feltöltéséhez.',
'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',
@@ -1911,7 +1954,6 @@ Ez a wiki publikus, így a biztonság miatt az img_auth.php ki van kapcsolva.',
'http-read-error' => 'HTTP-olvasási hiba.',
'http-timed-out' => 'A HTTP-kérés túllépte a határidőt.',
'http-curl-error' => 'Hiba történt az URL lekérésekor: $1',
-'http-host-unreachable' => 'Nem sikerült elérni az URL-t.',
'http-bad-status' => 'Probléma történt a HTTP-kérés közben: $1 $2',
# Some likely curl errors. More could be added from <http://curl.haxx.se/libcurl/c/libcurl-errors.html>
@@ -2057,12 +2099,6 @@ Ellenőrizd a meglévő hivatkozásokat, mielőtt törölnéd őket.',
'statistics-users-active-desc' => 'Szerkesztők, akik csináltak valamit az elmúlt {{PLURAL:$1|egy|$1}} napban',
'statistics-mostpopular' => 'Legtöbbször megtekintett lapok',
-'disambiguations' => 'Egyértelműsítő lapokra mutató lapok',
-'disambiguationspage' => 'Template:Egyért',
-'disambiguations-text' => "A következő oldalak '''egyértelműsítő lapra''' mutató hivatkozást tartalmaznak.
-A megfelelő szócikkre kellene mutatniuk inkább.<br />
-Egy oldal egyértelműsítő lapnak számít, ha tartalmazza a [[MediaWiki:Disambiguationspage]] oldalról belinkelt sablonok valamelyikét.",
-
'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.
@@ -2310,10 +2346,9 @@ Ezután minden, a lapon vagy annak vitalapján történő változást ott fogsz
'unwatchthispage' => 'Figyelés leállítása',
'notanarticle' => 'Nem szócikk',
'notvisiblerev' => 'A változat törölve lett',
-'watchnochange' => 'Egyik figyelt lap sem változott a megadott időintervallumon belül.',
'watchlist-details' => 'A vitalapokon kívül {{PLURAL:$1|egy|$1}} lap van a figyelőlistádon.',
-'wlheader-enotif' => '* Az e-mailen keresztül történő értesítés engedélyezve.',
-'wlheader-showupdated' => "* Azok a lapok, amelyek megváltoztak, mióta utoljára megnézted őket, '''vastagon''' láthatók.",
+'wlheader-enotif' => 'Az e-mailen keresztül történő értesítés engedélyezve.',
+'wlheader-showupdated' => "Azok a lapok, amelyek megváltoztak, mióta utoljára megnézted őket, '''vastagon''' láthatóak.",
'watchmethod-recent' => 'a figyelt lapokon belüli legfrissebb szerkesztések',
'watchmethod-list' => 'a legfrissebb szerkesztésekben található figyelt lapok',
'watchlistcontains' => 'A figyelőlistádon {{PLURAL:$1|egy|$1}} lap szerepel.',
@@ -2711,11 +2746,8 @@ Add meg a blokkolás okát is (például idézd a blokkolandó személy által v
'ipb_blocked_as_range' => 'Hiba: a(z) $1 IP-cím nem blokkolható közvetlenül, és nem lehet feloldani. A(z) $2 tartomány részeként van blokkolva, amely feloldható.',
'ip_range_invalid' => 'Érvénytelen IP-tartomány.',
'ip_range_toolarge' => 'Nem engedélyezettek azok a tartományblokkok, melyek nagyobbak mint /$1.',
-'blockme' => 'Saját magam blokkolása',
'proxyblocker' => 'Proxyblokkoló',
-'proxyblocker-disabled' => 'Ez a funkció le van tiltva.',
'proxyblockreason' => "Az IP-címeden ''nyílt proxy'' üzemel. Amennyiben nem használsz proxyt, vedd fel a kapcsolatot egy informatikussal vagy az internetszolgáltatóddal ezen súlyos biztonsági probléma ügyében.",
-'proxyblocksuccess' => 'Kész.',
'sorbsreason' => 'Az IP-címed nyitott proxyként szerepel e webhely által használt DNSBL listán.',
'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.',
@@ -3035,17 +3067,11 @@ Mentsd el a számítógépedre, majd töltsd fel ide.',
# Stylesheets
'common.css' => '/* Közös CSS az összes felületnek */',
-'standard.css' => '/* Az ide elhelyezett CSS hatással lesz a Klasszikus felület használóira */',
-'nostalgia.css' => '/* Az ide elhelyezett CSS hatással lesz a Nosztalgia felület használóira */',
'cologneblue.css' => '/* Az ide elhelyezett CSS hatással lesz a Kölni kék felület használóira */',
'monobook.css' => '/* Az ide elhelyezett CSS hatással lesz a Monobook felület használóira */',
-'myskin.css' => '/* Az ide elhelyezett CSS hatással lesz a MySkin felület használóira */',
-'chick.css' => '/* Az ide elhelyezett CSS hatással lesz a Chick felület használóira */',
-'simple.css' => '/* Az ide elhelyezett CSS hatással lesz a Egyszerű felület használóira */',
'modern.css' => '/* Az ide elhelyezett CSS hatással lesz a Modern felület használóira */',
'vector.css' => '/* Az ide elhelyezett CSS hatással lesz a Vector felület használóira */',
'print.css' => '/* Az ide elhelyezett CSS hatással lesz a nyomtatás kimenetelére */',
-'handheld.css' => '/* Az ide elhelyezett CSS hatással lesz azon kézi eszközökre, amelyek $wgHandheldStyle felülettel vannak konfigurálva */',
'noscript.css' => '/* Az ide elhelyezett CSS azon felhasználókra lesz hatással, ahol a JavaScript le van tiltva */',
'group-autoconfirmed.css' => '/* Az ide elhelyezett CSS az automatikusan megerősített felhasználókra lesz hatással */',
'group-bot.css' => '/* Az ide elhelyezett CSS csak botokra lesz hatással */',
@@ -3054,13 +3080,8 @@ Mentsd el a számítógépedre, majd töltsd fel ide.',
# Scripts
'common.js' => '/* Az ide elhelyezett JavaScript kód minden felhasználó számára lefut az oldalak betöltésekor. */',
-'standard.js' => '/* A Klasszikus felületet használó szerkesztők számára betöltendő JavaScriptek */',
-'nostalgia.js' => '/* A Nosztalgia felületet használó szerkesztők számára betöltendő JavaScriptek */',
'cologneblue.js' => '/* A Kölni kék felületet használó szerkesztők számára betöltendő JavaScriptek */',
'monobook.js' => '/* A Monobook felületet használó szerkesztők számára betöltendő JavaScriptek */',
-'myskin.js' => '/* A MySkin felületet használó szerkesztők számára betöltendő JavaScriptek */',
-'chick.js' => '/* A Chick felületet használó szerkesztők számára betöltendő JavaScriptek */',
-'simple.js' => '/* Az Egyszerű felületet használó szerkesztők számára betöltendő JavaScriptek */',
'modern.js' => '/* A Modern felületet használó szerkesztők számára betöltendő JavaScriptek */',
'vector.js' => '/* A Vector felületet használó szerkesztők számára betöltendő JavaScriptek */',
'group-autoconfirmed.js' => '/* Az ide elhelyezett JavaScript csak automatikusan megerősített felhasználóknak töltődik be */',
@@ -3137,13 +3158,8 @@ Ez valószínűleg egy olyan link miatt van, ami egy feketelistán lévő oldalr
'pageinfo-category-files' => 'Fájlok száma',
# Skin names
-'skinname-standard' => 'Klasszikus',
-'skinname-nostalgia' => 'Nosztalgia',
'skinname-cologneblue' => 'Kölni kék',
'skinname-monobook' => 'MonoBook',
-'skinname-myskin' => 'MySkin',
-'skinname-chick' => 'Chick',
-'skinname-simple' => 'Egyszerű',
'skinname-modern' => 'Modern',
# Patrolling
@@ -3226,6 +3242,9 @@ A futtatása során kárt tehet a számítógépedben.",
'ago' => '$1 ezelőtt',
'just-now' => 'épp most',
+# Human-readable timestamps
+'hours-ago' => '$1 {{PLURAL:$1|órával|órával}} ezelőtt',
+
# Bad image list
'bad_image_list' => 'A formátum a következő:
@@ -3253,7 +3272,7 @@ míg a többi elem a táblázat összecsukása után alapértelmezett esetben re
* gpslongitude
* gpsaltitude',
-# EXIF tags
+# Exif tags
'exif-imagewidth' => 'Szélesség',
'exif-imagelength' => 'Magasság',
'exif-bitspersample' => 'Bitek összetevőnként',
@@ -3431,7 +3450,7 @@ míg a többi elem a táblázat összecsukása után alapértelmezett esetben re
'exif-originalimageheight' => 'Kép magassága a levágás előtt',
'exif-originalimagewidth' => 'Kép szélessége a levágás előtt',
-# EXIF attributes
+# Exif attributes
'exif-compression-1' => 'Nem tömörített',
'exif-compression-2' => 'CCITT Group 3 1 dimenziós módosított Huffman kódolás',
'exif-compression-3' => 'CCITT Group 3 fax kódolás',
@@ -3821,7 +3840,6 @@ minden egyes sor egy figyelt lap címe. Ha kész vagy, kattints a lista alatt ta
'version-other' => 'Egyéb',
'version-mediahandlers' => 'Médiafájl-kezelők',
'version-hooks' => 'Hookok',
-'version-extension-functions' => 'A kiterjesztések függvényei',
'version-parser-extensiontags' => 'Az értelmező kiterjesztéseinek tagjei',
'version-parser-function-hooks' => 'Az értelmező függvényeinek hookjai',
'version-hook-name' => 'Hook neve',
@@ -3830,6 +3848,7 @@ minden egyes sor egy figyelt lap címe. Ha kész vagy, kattints a lista alatt ta
'version-license' => 'Licenc',
'version-poweredby-credits' => "Ez a wiki '''[//www.mediawiki.org/ MediaWiki]''' szoftverrel működik, copyright © 2001-$1 $2.",
'version-poweredby-others' => 'mások',
+'version-poweredby-translators' => 'translatewiki.net fordítók',
'version-credits-summary' => 'Szeretnénk elismerni a következő személyek hozzájárulását a [[Special:Version|MediaWiki]] szoftverhez.',
'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.
@@ -3843,13 +3862,6 @@ A MediaWikit abban a reményben terjesztjük, hogy hasznos lesz, de GARANCIA NÉ
'version-entrypoints-header-entrypoint' => 'Belépési pont',
'version-entrypoints-header-url' => 'URL',
-# Special:FilePath
-'filepath' => 'Fájlelérés',
-'filepath-page' => 'Fájl:',
-'filepath-submit' => 'Elérési út',
-'filepath-summary' => 'Ezen lap segítségével lekérheted egy adott fájl pontos útvonalát.
-A képek teljes méretben jelennek meg, más fájltípusok közvetlenül a hozzájuk rendelt programmal indulnak el.',
-
# Special:FileDuplicateSearch
'fileduplicatesearch' => 'Duplikátumok keresése',
'fileduplicatesearch-summary' => 'Fájlok duplikátumainak keresése hash értékük alapján.',
@@ -3938,6 +3950,8 @@ A képek teljes méretben jelennek meg, más fájltípusok közvetlenül a hozzÃ
'htmlform-submit' => 'Elküldés',
'htmlform-reset' => 'Változtatások visszavonása',
'htmlform-selectorother-other' => 'egyéb',
+'htmlform-no' => 'Nem',
+'htmlform-yes' => 'Igen',
# SQLite database support
'sqlite-has-fts' => '$1 teljes szöveges keresés támogatással',
diff --git a/languages/messages/MessagesHy.php b/languages/messages/MessagesHy.php
index d246d13c..aa7b2898 100644
--- a/languages/messages/MessagesHy.php
+++ b/languages/messages/MessagesHy.php
@@ -9,6 +9,7 @@
*
* @author Ahmed-Najib-Biabani-Ibrahimkhel
* @author Chaojoker
+ * @author Nemo bis
* @author Pandukht
* @author Reedy
* @author Ruben Vardanyan (me@RubenVardanyan.com)
@@ -304,9 +305,6 @@ $messages = array(
'tog-shownumberswatching' => 'Õ‘Õ¸Ö‚ÕµÖ Õ¿Õ¡Õ¬ Õ§Õ» Õ°Õ½Õ¯Õ¸Õ² Õ´Õ¡Õ½Õ¶Õ¡Õ¯Õ«ÖÕ¶Õ¥Ö€Õ« Õ©Õ«Õ¾Õ¨',
'tog-oldsig' => 'Ներկայիս ստորագրությունն է․',
'tog-fancysig' => 'ÕÕ¿Õ¸Ö€Õ¡Õ£Ö€Õ¸Ö‚Õ©ÕµÕ¸Ö‚Õ¶Õ¨ Õ¾Õ«Ö„Õ«Õ¿Õ¥Ö„Õ½Õ¿Õ« Õ¿Õ¥Õ½Ö„Õ¸Õ¾ (Õ¡Õ¼Õ¡Õ¶Ö Õ¡Õ¾Õ¿Õ¸Õ´Õ¡Õ¿ Õ°Õ²Õ´Õ¡Õ¶)',
-'tog-externaleditor' => 'Õ•Õ£Õ¿Õ¡Õ£Õ¸Ö€Õ®Õ¥Õ¬ Õ¡Ö€Õ¿Õ¡Ö„Õ«Õ¶ Õ­Õ´Õ¢Õ¡Õ£Ö€Õ«Õ¹ Õ¨Õ½Õ¿ Õ¬Õ¼Õ¸Ö‚Õ©ÕµÕ¡Õ¶ (ÕºÕ¡Õ°Õ¡Õ¶Õ»Õ¸Ö‚Õ´ Õ§ Õ°Õ¡Õ¿Õ¸Ö‚Õ¯ Õ¶Õ¡Õ­Õ¨Õ¶Õ¿Ö€Õ¸Ö‚Õ©ÕµÕ¸Ö‚Õ¶Õ¶Õ¥Ö€ Õ±Õ¥Ö€ Õ°Õ¡Õ´Õ¡Õ¯Õ¡Ö€Õ£Õ¹Õ¸Ö‚Õ´)',
-'tog-externaldiff' => 'Õ•Õ£Õ¿Õ¡Õ£Õ¸Ö€Õ®Õ¥Õ¬ Õ¿Õ¡Ö€Õ¢Õ¥Ö€Õ¡Õ¯Õ¶Õ¥Ö€Õ« Õ°Õ¡Õ´Õ¥Õ´Õ¡Õ¿Õ´Õ¡Õ¶ Õ¡Ö€Õ¿Õ¡Ö„Õ«Õ¶ Õ®Ö€Õ¡Õ£Õ«Ö€ Õ¨Õ½Õ¿ Õ¬Õ¼Õ¸Ö‚Õ©ÕµÕ¡Õ¶ (ÕºÕ¡Õ°Õ¡Õ¶Õ»Õ¸Ö‚Õ´ Õ§ Õ°Õ¡Õ¿Õ¸Ö‚Õ¯ Õ¶Õ¡Õ­Õ¨Õ¶Õ¿Ö€Õ¸Ö‚Õ©ÕµÕ¸Ö‚Õ¶Õ¶Õ¥Ö€ Õ±Õ¥Ö€ Õ°Õ¡Õ´Õ¡Õ¯Õ¡Ö€Õ£Õ¹Õ¸Ö‚Õ´)',
-'tog-showjumplinks' => 'Õ„Õ«Õ¡ÖÕ¶Õ¥Õ¬ «անÖÕ¶Õ¥Õ¬ դեպի» Ö…Õ£Õ¶Õ¡Õ¯Õ¡Õ¶ Õ°Õ²Õ¸Ö‚Õ´Õ¶Õ¥Ö€Õ¨',
'tog-uselivepreview' => 'Õ•Õ£Õ¿Õ¡Õ£Õ¸Ö€Õ®Õ¥Õ¬ Õ¸Ö‚Õ²Õ«Õ² Õ¶Õ¡Õ­Õ¡Õ¤Õ«Õ¿Õ¸Ö‚Õ´ (JavaScript) (Õ“Õ¸Ö€Õ±Õ¶Õ¡Õ¯Õ¡Õ¶)',
'tog-forceeditsummary' => 'Õ†Õ¡Õ­Õ¡Õ¦Õ£Õ¸Ö‚Õ·Õ¡ÖÕ¶Õ¥Õ¬ Õ­Õ´Õ¢Õ¡Õ£Ö€Õ´Õ¡Õ¶ Õ¡Õ´ÖƒÕ¸ÖƒÕ¸Ö‚Õ´Õ¨ Õ¤Õ¡Õ¿Õ¡Ö€Õ¯ Õ©Õ¸Õ²Õ¶Õ¥Õ¬Õ¸Ö‚ Õ¤Õ¥ÕºÖ„Õ¸Ö‚Õ´',
'tog-watchlisthideown' => 'Ô¹Õ¡Ö„ÖÕ¶Õ¥Õ¬ Õ«Õ´ Õ­Õ´Õ¢Õ¡Õ£Ö€Õ¸Ö‚Õ´Õ¶Õ¥Ö€Õ¨ Õ°Õ½Õ¯Õ¡ÖÕ¡Õ¶Õ¯Õ«Ö',
@@ -319,6 +317,7 @@ $messages = array(
'tog-diffonly' => 'Õ‰ÖÕ¸Ö‚ÖÕ¡Õ¤Ö€Õ¥Õ¬ Õ§Õ»Õ« ÕºÕ¡Ö€Õ¸Ö‚Õ¶Õ¡Õ¯Õ¸Ö‚Õ©ÕµÕ¸Ö‚Õ¶Õ¨ Õ¿Õ¡Ö€Õ¢Õ¥Ö€Õ¸Ö‚Õ©ÕµÕ¸Ö‚Õ¶Õ¶Õ¥Ö€Õ« Õ¶Õ¥Ö€Ö„Ö‡Õ«Ö',
'tog-showhiddencats' => 'Õ‘Õ¸Ö‚ÖÕ¡Õ¤Ö€Õ¥Õ¬ Õ©Õ¡Ö„Õ¶Õ¾Õ¡Õ® Õ¯Õ¡Õ¿Õ¥Õ£Õ¸Ö€Õ«Õ¡Õ¶Õ¥Ö€Õ¨',
'tog-norollbackdiff' => 'Õ‰ÖÕ¸Ö‚ÖÕ¡Õ¤Ö€Õ¥Õ¬ Õ¿Õ¡Ö€Õ¢Õ¥Ö€Õ¸Ö‚Õ©ÕµÕ¸Ö‚Õ¶Õ¶Õ¥Ö€Õ¨ Õ°Õ¥Õ¿ Õ£Õ¬Õ¸Ö€Õ¥Õ¬Õ¸Ö‚Ö Õ°Õ¥Õ¿Õ¸',
+'tog-useeditwarning' => 'Ô¶Õ£Õ¸Ö‚Õ·Õ¡ÖÕ¶Õ¥Õ¬ Õ«Õ¶Õ±, Õ¥Ö€Õ¢ Õ¥Õ½ Õ¬Ö„Õ¸Ö‚Õ´ Õ¥Õ´ Õ­Õ´Õ¢Õ¡Õ£Ö€Õ´Õ¡Õ¶ Õ§Õ»Õ¨ Õ¡Õ¼Õ¡Õ¶Ö Õ¯Õ¡Õ¿Õ¡Ö€Õ¡Õ® ÖƒÕ¸ÖƒÕ¸Õ­Õ¸Ö‚Õ©ÕµÕ¸Ö‚Õ¶Õ¶Õ¥Ö€Õ¨ Õ°Õ«Õ·Õ¥Õ¬Õ¸Ö‚Ö‰',
'underline-always' => 'Õ„Õ«Õ·Õ¿',
'underline-never' => 'ÔµÖ€Õ¢Õ¥Ö„',
@@ -382,6 +381,18 @@ $messages = array(
'oct' => 'Õ°Õ¸Õ¯',
'nov' => 'Õ¶Õ¸Õµ',
'dec' => 'Õ¤Õ¥Õ¯',
+'january-date' => 'Õ€Õ¸Ö‚Õ¶Õ¾Õ¡Ö€Õ« $1',
+'february-date' => 'Õ“Õ¥Õ¿Ö€Õ¾Õ¡Ö€Õ« $1',
+'march-date' => 'Õ„Õ¡Ö€Õ¿Õ« $1',
+'april-date' => 'Ô±ÕºÖ€Õ«Õ¬Õ« $1',
+'may-date' => 'Õ„Õ¡ÕµÕ«Õ½Õ« $1',
+'june-date' => 'Õ€Õ¸Ö‚Õ¶Õ«Õ½Õ« $1',
+'july-date' => 'Õ€Õ¸Ö‚Õ¬Õ«Õ½Õ« $1',
+'august-date' => 'Õ•Õ£Õ¸Õ½Õ¿Õ¸Õ½Õ« $1',
+'september-date' => 'ÕÕ¥ÕºÕ¿Õ¥Õ´Õ¢Õ¥Ö€Õ« $1',
+'october-date' => 'Õ€Õ¸Õ¯Õ¿Õ¥Õ´Õ¢Õ¥Ö€Õ« $1',
+'november-date' => 'Õ†Õ¸ÕµÕ¥Õ´Õ¢Õ¥Ö€Õ« $1',
+'december-date' => 'Ô´Õ¥Õ¯Õ¿Õ¥Õ´Õ¢Õ¥Ö€Õ« $1',
# Categories related messages
'pagecategories' => '{{PLURAL:$1|Ô¿Õ¡Õ¿Õ¥Õ£Õ¸Ö€Õ«Õ¡|Ô¿Õ¡Õ¿Õ¥Õ£Õ¸Ö€Õ«Õ¡Õ¶Õ¥Ö€}}',
@@ -503,7 +514,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).
+# 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).
'aboutsite' => '{{grammar:genitive|{{SITENAME}}}} Õ´Õ¡Õ½Õ«Õ¶',
'aboutpage' => 'Project:Ô·Õ¸Ö‚Õ©ÕµÕ¸Ö‚Õ¶Õ¨',
'copyright' => 'Կայքի բովանդակությունը գտնվում է «$1» արտոնագրի տակ։',
@@ -513,7 +524,6 @@ $1',
'disclaimers' => 'Ô±Õ¦Õ¡Õ¿Õ¸Ö‚Õ´ ÕºÕ¡Õ¿Õ¡Õ½Õ­Õ¡Õ¶Õ¡Õ¿Õ¾Õ¸Ö‚Õ©ÕµÕ¸Ö‚Õ¶Õ«Ö',
'disclaimerpage' => 'Project:Ô±Õ¦Õ¡Õ¿Õ¸Ö‚Õ´ ÕºÕ¡Õ¿Õ¡Õ½Õ­Õ¡Õ¶Õ¡Õ¿Õ¾Õ¸Ö‚Õ©ÕµÕ¸Ö‚Õ¶Õ«Ö',
'edithelp' => 'Ô½Õ´Õ¢Õ¡Õ£Ö€Õ´Õ¡Õ¶ Õ¸Ö‚Õ²Õ¥ÖÕ¸Ö‚ÕµÖ',
-'edithelppage' => 'Help:Ô½Õ´Õ¢Õ¡Õ£Ö€Õ¸Ö‚Õ´',
'helppage' => 'Help:Ô³Õ¬Õ­Õ¡ÖÕ¡Õ¶Õ¯',
'mainpage' => 'Ô³Õ¬Õ­Õ¡Õ¾Õ¸Ö€ Õ§Õ»',
'mainpage-description' => 'Ô³Õ¬Õ­Õ¡Õ¾Õ¸Ö€ Õ§Õ»',
@@ -590,17 +600,6 @@ $1',
# General errors
'error' => 'ÕÕ­Õ¡Õ¬',
'databaseerror' => 'ÕÕ¾ÕµÕ¡Õ¬Õ¶Õ¥Ö€Õ« Õ¢Õ¡Õ¦Õ¡ÕµÕ« Õ½Õ­Õ¡Õ¬',
-'dberrortext' => 'Õ€Õ¡ÕµÕ¿Õ¶Õ¡Õ¢Õ¥Ö€Õ¾Õ¥Õ¬ Õ§ Õ¿Õ¾ÕµÕ¡Õ¬Õ¶Õ¥Ö€Õ« Õ¢Õ¡Õ¦Õ¡ÕµÕ«Õ¶ Õ°Õ¡ÕµÖÕ« Õ·Õ¡Ö€Õ¡Õ°ÕµÕ¸Ö‚Õ½Õ¸Ö‚Õ©ÕµÕ¡Õ¶ Õ½Õ­Õ¡Õ¬Ö‰
-ÕÕ¡ Õ¯Õ¡Ö€Õ¸Õ² Õ§ Õ¬Õ«Õ¶Õ¥Õ¬ Õ®Ö€Õ¡Õ£Ö€Õ¡ÕµÕ«Õ¶ Õ¡ÕºÕ¡Õ°Õ¸Õ¾Õ´Õ¡Õ¶ Õ½Õ­Õ¡Õ¬Õ«ÖÖ‰
-ÕÕ¾ÕµÕ¡Õ¬Õ¶Õ¥Ö€Õ« Õ¢Õ¡Õ¦Õ¡ÕµÕ«Õ¶ Õ¾Õ¥Ö€Õ»Õ«Õ¶ Õ°Õ¡ÕµÖÕ¶ էր․
-<blockquote><tt>$1</tt></blockquote>
-Õ°Õ¥Õ¿Ö‡ÕµÕ¡Õ¬ Ö†Õ¸Ö‚Õ¶Õ¯ÖÕ«Õ¡ÕµÕ« Õ´Õ¡Ö€Õ´Õ¶Õ«Ö <tt>«$2»</tt>Ö‰
-ÕÕ¾ÕµÕ¬Õ¡Õ¶Õ¥Ö€Õ« Õ¢Õ¡Õ¦Õ¡ÕµÕ« Õ¾Õ¥Ö€Õ¡Õ¤Õ¡Ö€Õ±Ö€Õ¡Õ® Õ½Õ­Õ¡Õ¬Õ¶ է․ <tt>«$3: $4»</tt>Ö‰',
-'dberrortextcl' => 'Õ€Õ¡ÕµÕ¿Õ¶Õ¡Õ¢Õ¥Ö€Õ¾Õ¥Õ¬ Õ§ Õ¿Õ¾ÕµÕ¡Õ¬Õ¶Õ¥Ö€Õ« Õ¢Õ¡Õ¦Õ¡ÕµÕ«Õ¶ Õ°Õ¡ÕµÖÕ« Õ·Õ¡Ö€Õ¡Õ°ÕµÕ¸Ö‚Õ½Õ¸Ö‚Õ©ÕµÕ¡Õ¶ Õ½Õ­Õ¡Õ¬Ö‰
-ÕÕ¾ÕµÕ¡Õ¬Õ¶Õ¥Ö€Õ« Õ¢Õ¡Õ¦Õ¡ÕµÕ«Õ¶ Õ¾Õ¥Ö€Õ»Õ«Õ¶ Õ°Õ¡ÕµÖÕ¶ Õ§Ö€.
-«$1»
-Õ°Õ¥Õ¿Ö‡ÕµÕ¡Õ¬ Ö†Õ¸Ö‚Õ¶Õ¯ÖÕ«Õ¡ÕµÕ« Õ´Õ¡Ö€Õ´Õ¶Õ«Ö <tt>«$2»</tt>Ö‰
-ÕÕ¾ÕµÕ¡Õ¬Õ¶Õ¥Ö€Õ« Õ¢Õ¡Õ¦Õ¡ÕµÕ« Õ¾Õ¥Ö€Õ¡Õ¤Õ¡Ö€Õ±Ö€Õ¡Õ® Õ½Õ­Õ¡Õ¬Õ¶ Õ§. <tt>«$3: $4»</tt>Ö‰',
'laggedslavemode' => 'Ô¶Õ£Õ¸Ö‚Õ·Õ¡ÖÕ¸Ö‚Õ´. Õ§Õ»Õ¨ Õ¯Õ¡Ö€Õ¸Õ² Õ§ Õ¹ÕºÕ¡Ö€Õ¸Ö‚Õ¶Õ¡Õ¯Õ¥Õ¬ Õ¾Õ¥Ö€Õ»Õ«Õ¶ ÖƒÕ¸ÖƒÕ¸Õ­Õ¸Ö‚Õ©ÕµÕ¸Ö‚Õ¶Õ¶Õ¥Ö€Õ¨Ö‰',
'readonly' => 'ÕÕ¾ÕµÕ¡Õ¬Õ¶Õ¥Ö€Õ« Õ¢Õ¡Õ¦Õ¡Õ¶ Õ¯Õ¸Õ²ÕºÕ¾Õ¡Õ® Õ§',
'enterlockreason' => 'Õ†Õ·Õ¥Ö„ Õ¯Õ¸Õ²ÕºÕ´Õ¡Õ¶ ÕºÕ¡Õ¿Õ³Õ¡Õ¼Õ¨ Ö‡ Õ´Õ¸Õ¿Õ¡Õ¾Õ¸Ö€ ÕªÕ¡Õ´Õ¯Õ¥Õ¿Õ¨',
@@ -652,7 +651,6 @@ $1',
'editinginterface' => "'''ÕˆÖ‚Õ·Õ¡Õ¤Ö€Õ¸Ö‚Õ©ÕµÕ¸Ö‚Õ¶Õ''' Ô´Õ¸Ö‚Ö„ Õ­Õ´Õ¢Õ¡Õ£Ö€Õ¸Ö‚Õ´ Õ¥Ö„ Õ®Ö€Õ¡Õ£Ö€Õ¡ÕµÕ«Õ¶ Õ¡ÕºÕ¡Õ°Õ¸Õ¾Õ´Õ¡Õ¶ Õ´Õ«Õ»Õ¥Ö€Õ¥Õ½Õ« Õ¿Õ¥Ö„Õ½Õ¿ ÕºÕ¡Ö€Õ¸Ö‚Õ¶Õ¡Õ¯Õ¸Õ² Õ§Õ»Ö‰
Ô±ÕµÕ½ Õ§Õ»Õ« ÖƒÕ¸ÖƒÕ¸Õ­Õ¸Ö‚Õ©ÕµÕ¸Ö‚Õ¶Õ¨ Õ¯Õ¡Õ¶Õ¤Ö€Õ¡Õ¤Õ¡Õ¼Õ¶Õ¡ Õ¡ÕµÕ¬ Õ´Õ¡Õ½Õ¶Õ¡Õ¯Õ«ÖÕ¶Õ¥Ö€Õ«Õ¶ Õ¿Õ¥Õ½Õ¡Õ¶Õ¥Õ¬Õ« Õ´Õ«Õ»Õ¥Ö€Õ¥Õ½Õ¨ Õ¡ÕµÕ½ Õ¾Õ«Ö„Õ«Õ« Õ¾Ö€Õ¡Ö‰
Ô¹Õ¡Ö€Õ£Õ´Õ¡Õ¶Õ¸Ö‚Õ©ÕµÕ¸Ö‚Õ¶Õ¶Õ¥Ö€Õ« Õ°Õ¡Õ´Õ¡Ö€ Õ¶Õ¡Õ­Õ¨Õ¶Õ¿Ö€Õ¥Õ¬Õ« Õ§ Ö…Õ£Õ¿Õ¡Õ£Õ¸Ö€Õ®Õ¥Õ¬ [//translatewiki.net/wiki/Main_Page?setlang=hy translatewiki.net]Õ Õ„Õ¥Õ¤Õ«Õ¡Õ¾Õ«Ö„Õ« Õ®Ö€Õ¡Õ£Ö€Õ« Õ¿Õ¥Õ²Õ¡ÕµÕ¶Õ¡ÖÕ´Õ¡Õ¶ Õ¶Õ¡Õ­Õ¡Õ£Õ«Õ®Õ¨Ö‰",
-'sqlhidden' => '(SQL Õ°Õ¡ÕµÖÕ¸Ö‚Õ´Õ¨ Õ©Õ¡Ö„ÖÕ¾Õ¡Õ® Õ§)',
'cascadeprotected' => 'Ô±ÕµÕ½ Õ§Õ»Õ¨ ÕºÕ¡Õ·Õ¿ÕºÕ¡Õ¶Õ¾Õ¡Õ® Õ§ Õ­Õ´Õ¢Õ¡Õ£Ö€Õ¸Ö‚Õ´Õ«Ö, Ö„Õ¡Õ¶Õ« Õ¸Ö€ Õ¨Õ¶Õ¤Õ£Ö€Õ¯Õ¾Õ¡Õ® Õ§ Õ°Õ¥Õ¿Ö‡ÕµÕ¡Õ¬ {{PLURAL:$1|Õ§Õ»Õ«|Õ§Õ»Õ¥Ö€Õ«}} Õ¿Õ¥Ö„Õ½Õ¿Õ¸Ö‚Õ´, {{PLURAL:$1|Õ¸Ö€Õ¨|Õ¸Ö€Õ¸Õ¶Ö„}} ÕºÕ¡Õ·Õ¿ÕºÕ¡Õ¶Õ¾Õ¥Õ¬ {{PLURAL:$1|Õ§|Õ¥Õ¶}} Õ¯Õ¡Õ½Õ¯Õ¡Õ¤Õ¡ÕµÕ«Õ¶ Õ°Õ¶Õ¡Ö€Õ¡Õ¾Õ¸Ö€Õ¸Ö‚Õ©ÕµÕ¡Õ´Õ¢.
$2',
'namespaceprotected' => 'Դուք չունեք «$1» անվանատարածքի էջերի խմբագրման իրավունք։',
@@ -677,10 +675,18 @@ $2',
'welcomecreation-msg' => 'ÕÕ¥Ö€ Õ°Õ¡Õ·Õ«Õ¾Õ¶ Õ½Õ¿Õ¥Õ²Õ®Õ¾Õ¡Õ® Õ§Ö‰
Õ‰Õ´Õ¸Õ¼Õ¡Õ¶Õ¡Ö„ ÖƒÕ¸ÖƒÕ¸Õ­Õ¥Õ¬ Õ±Õ¥Ö€ [[Special:Preferences|Õ¶Õ¡Õ­Õ¨Õ¶Õ¿Ö€Õ¸Ö‚Õ©ÕµÕ¸Ö‚Õ¶Õ¶Õ¥Ö€Õ¨]]Ö‰',
'yourname' => 'Õ„Õ¡Õ½Õ¶Õ¡Õ¯ÖÕ« Õ¡Õ¶Õ¸Ö‚Õ¶Õ',
+'userlogin-yourname' => 'Õ„Õ¡Õ½Õ¶Õ¡Õ¯ÖÕ¡ÕµÕ«Õ¶ Õ¡Õ¶Õ¸Ö‚Õ¶',
+'userlogin-yourname-ph' => 'Õ„Õ¸Ö‚Õ¿Ö„Õ¡Õ£Ö€Õ¥Ö„ Õ±Õ¥Ö€ Õ´Õ¡Õ½Õ¶Õ¡Õ¯ÖÕ¡ÕµÕ«Õ¶ Õ¡Õ¶Õ¸Ö‚Õ¶Õ¨',
'yourpassword' => 'Ô³Õ¡Õ²Õ¿Õ¶Õ¡Õ¢Õ¡Õ¼Õ',
+'userlogin-yourpassword' => 'Ô³Õ¡Õ²Õ¿Õ¶Õ¡Õ¢Õ¡Õ¼',
+'userlogin-yourpassword-ph' => 'Õ„Õ¸Ö‚Õ¿Ö„Õ¡Õ£Ö€Õ¥Ö„ Õ±Õ¥Ö€ Õ£Õ¡Õ²Õ¿Õ¶Õ¡Õ¢Õ¡Õ¼Õ¨',
+'createacct-yourpassword-ph' => 'Õ„Õ¸Ö‚Õ¿Ö„Õ¡Õ£Ö€Õ¥Ö„ Õ£Õ¡Õ²Õ¿Õ¶Õ¡Õ¢Õ¡Õ¼Õ¨',
'yourpasswordagain' => 'Ô¿Ö€Õ¯Õ¶Õ¥Ö„ Õ£Õ¡Õ²Õ¿Õ¶Õ¡Õ¢Õ¡Õ¼Õ¨',
+'createacct-yourpasswordagain' => 'Õ€Õ¡Õ½Õ¿Õ¡Õ¿Õ¥Ö„ Õ£Õ¡Õ²Õ¿Õ¶Õ¡Õ¢Õ¡Õ¼Õ¨',
+'createacct-yourpasswordagain-ph' => 'Ô¿Ö€Õ¯Õ«Õ¶ Õ´Õ¸Ö‚Õ¿Ö„Õ¡Õ£Ö€Õ¥Ö„ Õ£Õ¡Õ²Õ¿Õ¶Õ¡Õ¢Õ¡Õ¼Õ¨',
'remembermypassword' => 'Õ€Õ«Õ·Õ¥Õ¬ Õ«Õ´ Õ´Õ¸Ö‚Õ¿Ö„Õ¨ Õ¡ÕµÕ½ Õ¤Õ«Õ¿Õ¡Ö€Õ¯Õ¹Õ¸Ö‚Õ´ ($1 {{PLURAL:$1|Ö…Ö€Õ«Ö}} Õ¸Õ¹ Õ¡Õ¾Õ¥Õ¬ ÕªÕ¡Õ´Õ¯Õ¥Õ¿Õ¸Õ¾)',
-'securelogin-stick-https' => 'Õ„Õ¸Ö‚Õ¿Ö„ Õ£Õ¸Ö€Õ®Õ¥Õ¬Õ¸Ö‚Ö Õ°Õ¥Õ¿Õ¸ Õ·Õ¡Ö€Õ¸Ö‚Õ¶Õ¡Õ¯Õ¥Õ¬ Õ¡Õ·Õ­Õ¡Õ¿Õ¡Õ¶Ö„Õ¨ HTTPS–ով',
+'userlogin-remembermypassword' => 'Õ„Õ¸Ö‚Õ¿Ö„ Õ£Õ¸Ö€Õ®Õ¡Õ® Õ´Õ¶Õ¡Õ¬',
+'userlogin-signwithsecure' => 'Õ•Õ£Õ¿Õ¡Õ£Õ¸Ö€Õ®Õ¥Õ¬ Õ¡Õ¶Õ¾Õ¿Õ¡Õ¶Õ£ Õ´Õ«Õ¡ÖÕ¸Ö‚Õ´',
'yourdomainname' => 'ÕÕ¥Ö€ Õ¤Õ¸Õ´Õ¥Õ¶Õ¨Õ',
'password-change-forbidden' => 'Ô±ÕµÕ½ Õ¾Õ«Ö„Õ«Õ¸Ö‚Õ´ Õ¹Õ¥Ö„ Õ¯Õ¡Ö€Õ¸Õ² ÖƒÕ¸Õ­Õ¥Õ¬ Õ£Õ¡Õ²Õ¿Õ¶Õ¡Õ¢Õ¡Õ¼Ö‰',
'externaldberror' => 'ÕÕ¥Õ²Õ« Õ§ Õ¸Ö‚Õ¶Õ¥ÖÕ¥Õ¬ Õ¾Õ¡Õ¾Õ¥Ö€Õ¡ÖÕ´Õ¡Õ¶ Õ¡Ö€Õ¿Õ¡Ö„Õ«Õ¶ Õ¿Õ¾ÕµÕ¡Õ¬Õ¶Õ¥Ö€Õ« Õ¢Õ¡Õ¦Õ¡ÕµÕ« Õ½Õ­Õ¡Õ¬, Õ¯Õ¡Õ´ Õ¤Õ¸Ö‚Ö„ Õ¹Õ¸Ö‚Õ¶Õ¥Ö„ Õ¢Õ¡Õ¾Õ¡Ö€Õ¡Ö€ Õ«Ö€Õ¡Õ¾Õ¸Ö‚Õ¶Ö„Õ¶Õ¥Ö€ Õ±Õ¥Ö€ Õ¡Ö€Õ¿Õ¡Ö„Õ«Õ¶ Õ°Õ¡Õ·Õ¾Õ« ÖƒÕ¸ÖƒÕ¸Õ­Õ´Õ¡Õ¶ Õ°Õ¡Õ´Õ¡Ö€Ö‰',
@@ -692,14 +698,31 @@ $2',
'logout' => 'Ô´Õ¸Ö‚Ö€Õ½ Õ£Õ¡Õ¬ Õ°Õ¡Õ´Õ¡Õ¯Õ¡Ö€Õ£Õ«Ö',
'userlogout' => 'ÔµÕ¬Õ¶Õ¥Õ¬ Õ°Õ¡Õ´Õ¡Õ¯Õ¡Ö€Õ£Õ«Ö',
'notloggedin' => 'Ô´Õ¸Ö‚Ö„ Õ¹Õ¥Ö„ Õ´Õ¿Õ¥Õ¬ Õ°Õ¡Õ´Õ¡Õ¯Õ¡Ö€Õ£',
+'userlogin-noaccount' => 'Õ€Õ¡Õ·Õ«Õ¾ Õ¹Õ¸Ö‚Õ¶Õ¥ÕžÖ„Ö‰',
+'userlogin-joinproject' => 'Õ„Õ«Õ¡ÖÕ¥Ö„ {{SITENAME}} Õ¶Õ¡Õ­Õ¡Õ£Õ®Õ«Õ¶',
'nologin' => "Õ‰Õ¸Ö‚Õ¶Õ¥ÕžÖ„ Õ°Õ¡Õ·Õ«Õ¾ '''$1'''Ö‰",
'nologinlink' => 'ÕÕ¿Õ¥Õ²Õ®Õ¥Õ¬ Õ´Õ¡Õ½Õ¶Õ¡Õ¯ÖÕ¡ÕµÕ«Õ¶ Õ°Õ¡Õ·Õ«Õ¾',
'createaccount' => 'ÕÕ¿Õ¥Õ²Õ®Õ¥Õ¬ Õ¶Õ¸Ö€ Õ°Õ¡Õ·Õ«Õ¾',
'gotaccount' => "Ô´Õ¸Ö‚Ö„ Õ¡Ö€Õ¤Õ¥Õ¶ Õ£Ö€Õ¡Õ¶ÖÕ¾Õ¡ÕžÕ® Õ¥Ö„Ö‰ '''$1'''Ö‰",
'gotaccountlink' => 'Õ„Õ¸Ö‚Õ¿Ö„ Õ£Õ¸Ö€Õ®Õ¥Ö„ Õ°Õ¡Õ´Õ¡Õ¯Õ¡Ö€Õ£',
'userlogin-resetlink' => 'Õ„Õ¸Õ¼Õ¡ÖÕ¥ÕžÕ¬ Õ¥Ö„ ÕÕ¥Ö€ Õ°Õ¡Õ·Õ¾Õ« Õ¿Õ¾ÕµÕ¡Õ¬Õ¶Õ¥Ö€Õ¨Ö‰',
+'userlogin-resetpassword-link' => 'Ô¶Ö€Õ¸ÕµÕ¡ÖÕ¶Õ¥Õ¬ Õ±Õ¥Ö€ Õ£Õ¡Õ²Õ¿Õ¶Õ¡Õ¢Õ¡Õ¼Õ¨Ö‰',
+'createacct-join' => 'Õ„Õ¸Ö‚Õ¿Ö„Õ¡Õ£Ö€Õ¥Ö„ ÕÕ¥Ö€ Õ¿Õ¥Õ²Õ¥Õ¯Õ¸Ö‚Õ©ÕµÕ¸Ö‚Õ¶Õ¶Õ¥Ö€Õ¨ Õ½Õ¿Õ¸Ö€Ö‡',
+'createacct-emailrequired' => 'Էլ–փոստի Õ°Õ¡Õ½ÖÕ¥',
+'createacct-emailoptional' => 'Էլ–փոստի Õ°Õ¡Õ½ÖÕ¥ (Õ¸Õ¹ ÕºÕ¡Ö€Õ¿Õ¡Õ¤Õ«Ö€)',
+'createacct-email-ph' => 'Õ„Õ¸Ö‚Õ¿Ö„Õ¡Õ£Ö€Õ¥Ö„ Õ±Õ¥Ö€ էլ–փոստի Õ°Õ¡Õ½ÖÕ¥Õ¶',
'createaccountmail' => 'Õ•Õ£Õ¿Õ¡Õ£Õ¸Ö€Õ®Õ¥Õ¬ ÕªÕ¡Õ´Õ¡Õ¶Õ¡Õ¯Õ¡Õ¾Õ¸Ö€ ÕºÕ¡Õ¿Õ¡Õ°Õ¡Õ¯Õ¡Õ¶ Õ£Õ¡Õ²Õ¿Õ¶Õ¡Õ¢Õ¡Õ¼, Õ¸Ö€Õ¨ Õ¯Õ¸Ö‚Õ²Õ¡Ö€Õ¯Õ¾Õ« Õ±Õ¥Ö€ էլ–փոստի Õ°Õ¡Õ½ÖÕ¥Õ«Õ¶Ö‰',
+'createacct-realname' => 'Ô»Ö€Õ¡Õ¯Õ¡Õ¶ Õ¡Õ¶Õ¸Ö‚Õ¶ (ÕºÕ¡Ö€Õ¿Õ¡Õ¤Õ«Ö€ Õ¹Õ§)',
'createaccountreason' => 'ÕŠÕ¡Õ¿Õ³Õ¡Õ¼Õ¨Õ',
+'createacct-reason' => 'ÕŠÕ¡Õ¿Õ³Õ¡Õ¼',
+'createacct-reason-ph' => 'Ô»Õ¶Õ¹Õ¸ÕžÖ‚ Õ¥Ö„ ÖƒÕ¸Ö€Õ±Õ¸Ö‚Õ´ Õ½Õ¿Õ¥Õ²Õ®Õ¥Õ¬ Õ´Õ¥Õ¯ Õ¡ÕµÕ¬ Õ°Õ¡Õ·Õ«Õ¾',
+'createacct-captcha' => 'Ô±Õ¶Õ¾Õ¿Õ¡Õ¶Õ£Õ¸Ö‚Õ©ÕµÕ¡Õ¶ Õ½Õ¿Õ¸Ö‚Õ£Õ¸Ö‚Õ´',
+'createacct-imgcaptcha-ph' => 'Õ„Õ¸Ö‚Õ¿Ö„Õ¡Õ£Ö€Õ¥Ö„ Õ¾Õ¥Ö€Õ¨ Õ¢Õ¥Ö€Õ¾Õ¡Õ® Õ£Ö€Õ¾Õ¡Õ®Ö„Õ¨',
+'createacct-submit' => 'ÕÕ¿Õ¥Õ²Õ®Õ¥Õ¬ Õ±Õ¥Ö€ Õ°Õ¡Õ·Õ«Õ¾Õ¨',
+'createacct-benefit-heading' => '{{SITENAME}}Õ Õ½Õ¿Õ¥Õ²Õ®Õ¾Õ¡Õ® Õ±Õ¥Ö€ ÕºÕ¥Õ½ Õ´Õ¡Ö€Õ¤Õ¯Õ¡Õ¶Ö Õ¯Õ¸Õ²Õ´Õ«ÖÖ‰',
+'createacct-benefit-body1' => '{{PLURAL:$1|Õ­Õ´Õ¢Õ¡Õ£Ö€Õ¸Ö‚Õ´}}',
+'createacct-benefit-body2' => '{{PLURAL:$1|Õ§Õ»}}',
+'createacct-benefit-body3' => 'Õ¾Õ¥Ö€Õ»Õ¥Ö€Õ½ Õ¡Õ¯Õ¿Õ«Õ¾ {{PLURAL:$1|Õ´Õ¡Õ½Õ¶Õ¡Õ¯Õ«Ö}}',
'badretype' => 'ÕÕ¥Ö€ Õ´Õ¸Ö‚Õ¿Ö„Õ¡Õ£Ö€Õ¡Õ® Õ£Õ¡Õ²Õ¿Õ¶Õ¡Õ¢Õ¡Õ¼Õ¥Ö€Õ¨ Õ¹Õ¥Õ¶ Õ°Õ¡Õ´Õ¨Õ¶Õ¯Õ¶Õ¸Ö‚Õ´Ö‰',
'userexists' => 'Ô±ÕµÕ½ Õ´Õ¡Õ½Õ¶Õ¡Õ¯ÖÕ« Õ¡Õ¶Õ¸Ö‚Õ¶Õ¨ Õ¡Ö€Õ¤Õ¥Õ¶ Õ¦Õ¢Õ¡Õ²Õ¾Õ¡Õ® Õ§Ö‰ Ô½Õ¶Õ¤Ö€Õ¸Ö‚Õ´ Õ¥Õ¶Ö„ Õ¨Õ¶Õ¿Ö€Õ¥Õ¬ Õ´Õ¥Õ¯ Õ¡ÕµÕ¬ Õ¡Õ¶Õ¸Ö‚Õ¶Ö‰',
'loginerror' => 'Õ„Õ¸Ö‚Õ¿Ö„Õ« Õ½Õ­Õ¡Õ¬',
@@ -769,7 +792,7 @@ $2',
'newpassword' => 'Õ†Õ¸Ö€ Õ£Õ¡Õ²Õ¿Õ¶Õ¡Õ¢Õ¡Õ¼Õ¨.',
'retypenew' => 'Õ€Õ¡Õ½Õ¿Õ¡Õ¿Õ¥Ö„ Õ¶Õ¸Ö€ Õ£Õ¡Õ²Õ¿Õ¶Õ¡Õ¢Õ¡Õ¼Õ¨.',
'resetpass_submit' => 'Õ€Õ¡Õ½Õ¿Õ¡Õ¿Õ¥Õ¬ Õ£Õ¡Õ²Õ¿Õ¶Õ¡Õ¢Õ¡Õ¼Õ¨ Ö‡ Õ´Õ¿Õ¶Õ¥Õ¬ Õ°Õ¡Õ´Õ¡Õ¯Õ¡Ö€Õ£',
-'resetpass_success' => 'ÕÕ¥Ö€ Õ£Õ¡Õ²Õ¿Õ¶Õ¡Õ¢Õ¡Õ¼Õ¨ ÖƒÕ¸Õ­Õ¾Õ¡Õ® Õ§Ö‰ Õ„Õ¸Ö‚Õ¿Ö„ համակարգ…',
+'changepassword-success' => 'ÕÕ¥Ö€ Õ£Õ¡Õ²Õ¿Õ¶Õ¡Õ¢Õ¡Õ¼Õ¨ ÖƒÕ¸Õ­Õ¾Õ¡Õ® Õ§Ö‰ Õ„Õ¸Ö‚Õ¿Ö„ համակարգ…',
'resetpass_forbidden' => 'Ô³Õ¡Õ²Õ¿Õ¶Õ¡Õ¢Õ¡Õ¼Õ¨ Õ¹Õ« Õ¯Õ¡Ö€Õ¸Õ² ÖƒÕ¸Õ­Õ¾Õ¥Õ¬',
'resetpass-no-info' => 'Ô±ÕµÕ½ Õ§Õ»Õ«Õ¶ Õ¸Ö‚Õ²Õ«Õ² Õ¤Õ«Õ´Õ¥Õ¬Õ¸Ö‚ Õ°Õ¡Õ´Õ¡Ö€ Õ¡Õ¶Õ°Ö€Õ¡ÕªÕ¥Õ·Õ¿ Õ§ Õ´Õ¿Õ¶Õ¥Õ¬ Õ°Õ¡Õ´Õ¡Õ¯Õ¡Ö€Õ£Ö‰',
'resetpass-submit-loggedin' => 'Õ“Õ¸Õ­Õ¥Õ¬ Õ£Õ¡Õ²Õ¿Õ¶Õ¡Õ¢Õ¡Õ¼Õ¨',
@@ -780,7 +803,6 @@ $2',
# Special:PasswordReset
'passwordreset' => 'ÕŽÕ¥Ö€Õ¡Õ¯Õ¡Õ¶Õ£Õ¶Õ¥Õ¬ Õ£Õ¡Õ²Õ¿Õ¶Õ¡Õ¢Õ¡Õ¼Õ¨',
-'passwordreset-text' => 'Ô¼Ö€Õ¡ÖÖ€Õ¥Ö„ Õ±Ö‡Õ¨Õ Õ§Õ¬-ÖƒÕ¸Õ½Õ¿Õ¸Õ¾ Õ±Õ¥Ö€ Õ¿Õ¾ÕµÕ¡Õ¬Õ¶Õ¥Ö€Õ« Õ´Õ¡Õ½Õ«Õ¶ Õ°Õ«Õ·Õ¥ÖÕ¸Ö‚Õ´ Õ½Õ¿Õ¡Õ¶Õ¡Õ¬Õ¸Ö‚ Õ°Õ¡Õ´Õ¡Ö€Ö‰',
'passwordreset-legend' => 'ÕŽÕ¥Ö€Õ¡Õ¯Õ¡Õ¶Õ£Õ¶Õ¥Õ¬ Õ£Õ¡Õ²Õ¿Õ¶Õ¡Õ¢Õ¡Õ¼Õ¨',
'passwordreset-disabled' => 'Ô³Õ¡Õ²Õ¿Õ¶Õ¡Õ¢Õ¡Õ¼Õ« Õ¾Õ¥Ö€Õ¡Õ¯Õ¡Õ¶Õ£Õ¶Õ¸Ö‚Õ´Õ¨ Õ¡ÕµÕ½ Õ¾Õ«Ö„Õ«Õ¸Ö‚Õ´ Õ©Õ¸Ö‚ÕµÕ¬Õ¡Õ¿Ö€Õ¾Õ¡Õ® Õ¹Õ§Ö‰',
'passwordreset-username' => 'Õ„Õ¡Õ½Õ¶Õ¡Õ¯ÖÕ« Õ¡Õ¶Õ¸Ö‚Õ¶Õ',
@@ -1011,7 +1033,10 @@ $2',
'log-fulllog' => 'Ô´Õ«Õ¿Õ¥Õ¬ Õ¡Õ´Õ¢Õ¸Õ²Õ»Õ¡Õ¯Õ¡Õ¶ Õ¿Õ¥Õ²Õ¥Õ¯Õ¡Õ´Õ¡Õ¿ÕµÕ¡Õ¶Õ¨',
'edit-conflict' => 'Ô½Õ´Õ¢Õ¡Õ£Ö€Õ´Õ¡Õ¶ Õ¨Õ¶Õ°Õ¡Ö€Õ¸Ö‚Õ´Ö‰',
'edit-no-change' => 'ÕÕ¥Ö€ Õ­Õ´Õ¢Õ¡Õ£Ö€Õ¸Ö‚Õ´Õ¨ Õ¡Õ¶Õ¿Õ¥Õ½Õ¾Õ¥Õ¬ Õ§, Ö„Õ¡Õ¶Õ« Õ¸Ö€ Õ¸Õ¹ Õ´Õ« ÖƒÕ¸ÖƒÕ¸Õ­Õ¸Ö‚Õ©ÕµÕ¸Ö‚Õ¶ Õ¹Õ« Õ¯Õ¡Õ¿Õ¡Ö€Õ¾Õ¥Õ¬ Õ¿Õ¥Ö„Õ½Õ¿Õ« Õ´Õ¥Õ»Ö‰',
+'postedit-confirmation' => 'ÕÕ¥Ö€ Õ­Õ´Õ¢Õ¡Õ£Ö€Õ¸Ö‚Õ´Õ¨ ÕºÕ¡Õ°ÕºÕ¡Õ¶Õ¾Õ¡Õ® Õ§:',
'defaultmessagetext' => 'Ô¼Õ¼Õ¥Õ¬ÕµÕ¡Õ¶ Õ¿Õ¥Ö„Õ½Õ¿Õ¨',
+'editwarning-warning' => 'Ô±ÕµÕ½ Õ§Õ»Õ¨ Õ¬Ö„Õ¥Õ¬Õ¸Õ¾ Õ¤Õ¸Ö‚Ö„ Õ¯Õ¡Ö€Õ¸Õ² Õ¥Ö„ Õ¯Õ¸Ö€ÖÕ¶Õ¥Õ¬ Õ±Õ¥Ö€ Õ¯Õ¡Õ¿Õ¡Ö€Õ¡Õ® ÖƒÕ¸ÖƒÕ¸Õ­Õ¸Ö‚Õ©ÕµÕ¸Ö‚Õ¶Õ¶Õ¥Ö€Õ¨Ö‰
+ÔµÕ©Õ¥ Õ¤Õ¸Ö‚Ö„ Õ£Ö€Õ¡Õ¶ÖÕ¾Õ¡Õ® Õ¥Ö„ Õ°Õ¡Õ´Õ¡Õ¯Õ¡Ö€Õ£Õ¸Ö‚Õ´, Õ¯Õ¡Ö€Õ¸Õ² Õ¥Ö„ Õ¡Õ¶Õ»Õ¡Õ¿Õ¥Õ¬ Õ¡ÕµÕ½ Õ¶Õ¡Õ­Õ¡Õ¦Õ£Õ¸Ö‚Õ·Õ¡ÖÕ¸Ö‚Õ´Õ¨ Õ±Õ¥Ö€ Õ¶Õ¡Õ­Õ¨Õ¶Ö€Õ¸Ö‚Õ©ÕµÕ¸Ö‚Õ¶Õ¶Õ¥Ö€Õ« «{{int:prefs-editing}}» Õ¢Õ¡ÕªÕ¶Õ¸Ö‚Õ´Ö‰',
# Content models
'content-model-wikitext' => 'Õ¾Õ«Ö„Õ«Õ¿Õ¥Ö„Õ½Õ¿',
@@ -1147,7 +1172,6 @@ $3 Õ´Õ¡Õ½Õ¶Õ¡Õ¯Õ«ÖÕ¨ Õ¿Õ¾Õ¥Õ¬ Õ§ Õ°Õ¥Õ¿Ö‡ÕµÕ¡Õ¬ ÕºÕ¡Õ¿Õ³Õ¡Õ¼Õ¨. ''$2''",
'searchmenu-legend' => 'ÕˆÖ€Õ¸Õ¶Õ´Õ¡Õ¶ Õ¨Õ¶Õ¿Ö€Õ¡Õ¶Ö„Õ¶Õ¥Ö€',
'searchmenu-exists' => "'''Ô±ÕµÕ½ Õ¾Õ«Ö„Õ«Õ¸Ö‚Õ´, Õ£Õ¸ÕµÕ¸Ö‚Õ©ÕµÕ¸Ö‚Õ¶ Õ¸Ö‚Õ¶Õ« \"[[:\$1]]\" Õ¡Õ¶Õ¾Õ¡Õ¶Õ¸Ö‚Õ´Õ¸Õ¾ Õ§Õ»Õ¨Ö‰'''",
'searchmenu-new' => "'''ÕÕ¿Õ¥Õ²Õ®Õ¥Õ›Õ¬ \"[[:\$1]]\" Õ§Õ»Õ¨ Õ¡ÕµÕ½ Õ¾Õ«Ö„Õ«Õ¸Ö‚Õ´'''",
-'searchhelp-url' => 'Help:Ô³Õ¬Õ­Õ¡ÖÕ¡Õ¶Õ¯',
'searchmenu-prefix' => '[[Special:PrefixIndex/$1|Õ‘Õ¸Ö‚ÖÕ¡Õ¤Ö€Õ¥Õ¬ Õ¡ÕµÕ½ Õ¶Õ¡Õ­Õ¡Õ®Õ¡Õ¶ÖÕ¸Õ¾ Õ½Õ¯Õ½Õ¾Õ¸Õ² Õ§Õ»Õ¥Ö€Õ¨]]',
'searchprofile-articles' => 'Õ€Õ«Õ´Õ¶Õ¡Õ¯Õ¡Õ¶ Õ§Õ»Õ¥Ö€',
'searchprofile-project' => 'Õ•Õ£Õ¶Õ¸Ö‚Õ©ÕµÕ¡Õ¶ Ö‡ Õ¶Õ¡Õ­Õ¡Õ£Õ®Õ¥Ö€Õ« Õ§Õ»Õ¥Ö€',
@@ -1189,14 +1213,6 @@ $3 Õ´Õ¡Õ½Õ¶Õ¡Õ¯Õ«ÖÕ¨ Õ¿Õ¾Õ¥Õ¬ Õ§ Õ°Õ¥Õ¿Ö‡ÕµÕ¡Õ¬ ÕºÕ¡Õ¿Õ³Õ¡Õ¼Õ¨. ''$2''",
'search-external' => 'Ô±Ö€Õ¿Õ¡Ö„Õ«Õ¶ Õ¸Ö€Õ¸Õ¶Õ¸Ö‚Õ´',
'searchdisabled' => '{{SITENAME}} Õ¯Õ¡ÕµÖ„Õ« Õ¶Õ¥Ö€Ö„Õ«Õ¶ Õ¸Ö€Õ¸Õ¶Õ¸Ö‚Õ´Õ¨ Õ¡Õ¶Õ»Õ¡Õ¿Õ¾Õ¡Õ® Õ§Ö‰ Ô´Õ¸Ö‚Ö„ Õ¯Õ¡Ö€Õ¸Õ² Õ¥Ö„ Õ¸Ö€Õ¸Õ¶Õ¥Õ¬ Õ¯Õ¡ÕµÖ„Õ« ÕºÕ¡Ö€Õ¸Ö‚Õ¶Õ¡Õ¯Õ¸Ö‚Õ©ÕµÕ¸Ö‚Õ¶Õ¨ Õ¡Ö€Õ¿Õ¡Ö„Õ«Õ¶ Õ¸Ö€Õ¸Õ¶Õ´Õ¡Õ¶ Õ·Õ¡Ö€ÕªÕ«Õ¹Õ¶Õ¥Ö€Õ¸Õ¾ (Google, Yahoo...), Õ½Õ¡Õ¯Õ¡ÕµÕ¶, Õ« Õ¶Õ¯Õ¡Õ¿Õ« Õ¸Ö‚Õ¶Õ¥ÖÕ¥Ö„, Õ¸Ö€ Õ¯Õ¡ÕµÖ„Õ« Õ«Ö€Õ¥Õ¶Ö Õ«Õ¶Õ¤Õ¥Ö„Õ½Õ¶Õ¥Ö€Õ¨ Õ¯Õ¡Ö€Õ¸Õ² Õ¥Õ¶ Õ°Õ¶Õ¡ÖÕ¡Õ® Õ¬Õ«Õ¶Õ¥Õ¬Ö‰',
-# Quickbar
-'qbsettings' => 'Ô±Ö€Õ¡Õ£ Õ¡Õ¶ÖÕ´Õ¡Õ¶ Õ¾Õ¡Õ°Õ¡Õ¶Õ¡Õ¯',
-'qbsettings-none' => 'Õ‰ÖÕ¸Ö‚ÖÕ¡Õ¤Ö€Õ¥Õ¬',
-'qbsettings-fixedleft' => 'ÕÕ¡Õ­Õ«Ö Õ¡Õ¶Õ·Õ¡Ö€Õª',
-'qbsettings-fixedright' => 'Ô±Õ»Õ«Ö Õ¡Õ¶Õ·Õ¡Ö€Õª',
-'qbsettings-floatingleft' => 'ÕÕ¡Õ­Õ«Ö Õ¬Õ¸Õ²Õ¡ÖÕ¸Õ²',
-'qbsettings-floatingright' => 'Ô±Õ»Õ«Ö Õ¬Õ¸Õ²Õ¡ÖÕ¸Õ²',
-
# Preferences page
'preferences' => 'Õ†Õ¡Õ­Õ¨Õ¶Õ¿Ö€Õ¸Ö‚Õ©ÕµÕ¸Ö‚Õ¶Õ¶Õ¥Ö€',
'mypreferences' => 'Õ†Õ¡Õ­Õ¨Õ¶Õ¿Ö€Õ¸Ö‚Õ©ÕµÕ¸Ö‚Õ¶Õ¶Õ¥Ö€',
@@ -1226,7 +1242,6 @@ $3 Õ´Õ¡Õ½Õ¶Õ¡Õ¯Õ«ÖÕ¨ Õ¿Õ¾Õ¥Õ¬ Õ§ Õ°Õ¥Õ¿Ö‡ÕµÕ¡Õ¬ ÕºÕ¡Õ¿Õ³Õ¡Õ¼Õ¨. ''$2''",
'resetprefs' => 'Ô±Õ¶Õ¿Õ¥Õ½Õ¥Õ¬ ÖƒÕ¸ÖƒÕ¸Õ­Õ¸Ö‚Õ©ÕµÕ¸Ö‚Õ¶Õ¶Õ¥Ö€Õ¨',
'restoreprefs' => 'Ô¶Ö€Õ¸ÕµÕ¡ÖÕ¶Õ¥Õ¬, Õ¢Õ¥Ö€Õ¥Õ¬Õ¸Õ¾ Õ«Õ¬Õ¼Õ¥Õ¬Õ¡ÕµÕ¶ Õ¶Õ¡Õ­Õ¨Õ¶Õ¿Ö€Õ¡Õ¶Ö„Õ¶Õ¥Ö€Õ«Õ¶',
'prefs-editing' => 'Ô½Õ´Õ¢Õ¡Õ£Ö€Õ¸Ö‚Õ´',
-'prefs-edit-boxsize' => 'Ô½Õ´Õ¢Õ¡Õ£Ö€Õ´Õ¡Õ¶ ÕºÕ¡Õ¿Õ¸Ö‚Õ°Õ¡Õ¶Õ« Õ¹Õ¡ÖƒÕ¨Ö‰',
'rows' => 'ÕÕ¸Õ²Õ¥Ö€`',
'columns' => 'ÕÕµÕ¸Ö‚Õ¶Õ¡Õ¯Õ¶Õ¥Ö€',
'searchresultshead' => 'ÕˆÖ€Õ¸Õ¶Õ¸Ö‚Õ´',
@@ -1236,9 +1251,6 @@ $3 Õ´Õ¡Õ½Õ¶Õ¡Õ¯Õ«ÖÕ¨ Õ¿Õ¾Õ¥Õ¬ Õ§ Õ°Õ¥Õ¿Ö‡ÕµÕ¡Õ¬ ÕºÕ¡Õ¿Õ³Õ¡Õ¼Õ¨. ''$2''",
'recentchangesdays-max' => '($1 {{PLURAL:$1|Ö…Ö€Õ«Ö|Ö…Ö€Õ«Ö}} Õ¸Õ¹ Õ¡Õ¾Õ¥Õ¬)',
'recentchangescount' => 'Ô½Õ´Õ¢Õ¡Õ£Ö€Õ¸Ö‚Õ´Õ¶Õ¥Ö€Õ« Õ©Õ«Õ¾Õ¨ Õ¨Õ½Õ¿ Õ¬Õ¼Õ¸Ö‚Õ©ÕµÕ¡Õ¶.',
'prefs-help-recentchangescount' => 'Õ†Õ¥Ö€Õ¡Õ¼Õ¸Ö‚Õ´ Õ§ Õ¾Õ¥Ö€Õ»Õ«Õ¶ ÖƒÕ¸ÖƒÕ¸Õ­Õ¸Ö‚Õ©ÕµÕ¸Ö‚Õ¶Õ¶Õ¥Ö€Õ¨, Õ§Õ»Õ¥Ö€Õ« ÕºÕ¡Õ¿Õ´Õ¸Ö‚Õ©ÕµÕ¸Ö‚Õ¶Õ¨ Ö‡ Õ¿Õ¥Õ²Õ¥Õ¯Õ¡Õ´Õ¡Õ¿ÕµÕ¡Õ¶Õ¶Õ¥Ö€Õ¨Ö‰',
-'prefs-help-watchlist-token' => 'Ô±ÕµÕ½ Õ¤Õ¡Õ·Õ¿Õ¨ Õ£Õ¡Õ²Õ¿Õ¶Õ« Õ¢Õ¡Õ¶Õ¡Õ¬Õ«Õ¸Õ¾ Õ¬Õ¼Õ¡ÖÕ¶Õ¥Õ¬Õ¨ Õ¯Õ¢Õ¥Ö€Õ« Õ±Õ¥Ö€ Õ°Õ½Õ¯Õ¸Õ²Õ¸Ö‚Õ©ÕµÕ¡Õ¶ ÖÕ¡Õ¶Õ¯Õ« RSS ÕªÕ¡ÕºÕ¡Õ¾Õ¥Õ¶Õ« Õ½Õ¿Õ¥Õ²Õ®Õ´Õ¡Õ¶Õ¨Ö‰
-Õ‘Õ¡Õ¶Õ¯Õ¡ÖÕ¡Õ® Õ´Õ¥Õ¯Õ¨, Õ¸Õ¾ Õ£Õ«Õ¿Õ« Õ¡ÕµÕ½ Õ¢Õ¡Õ¶Õ¡Õ¬Õ«Õ¶, Õ¯Õ¡Ö€Õ¸Õ² Õ§ Õ¯Õ¡Ö€Õ¤Õ¡Õ¬ Õ±Õ¥Ö€ Õ°Õ½Õ¯Õ¸Õ²Õ¸Ö‚Õ©ÕµÕ¡Õ¶ ÖÕ¡Õ¶Õ¯Õ¨, Õ¡ÕµÕ¤ ÕºÕ¡Õ¿Õ³Õ¡Õ¼Õ¸Õ¾ Õ¨Õ¶Õ¿Ö€Õ¥Ö„ Õ£Õ¡Õ²Õ¿Õ¶Õ« Õ¡Ö€ÕªÕ¥Ö„Ö‰
-Ô´Õ¸Ö‚Ö„ Õ¯Õ¡Ö€Õ¸Õ² Õ¥Ö„ Ö…Õ£Õ¿Õ¡Õ£Õ¸Ö€Õ®Õ¥Õ¬ Õ¡ÕµÕ½ ÕºÕ¡Õ¿Õ¡Õ°Õ¡Õ¯Õ¡Õ¶Õ¸Ö€Õ¥Õ¶ Õ£Õ¥Õ¶Õ¥Ö€Õ¡ÖÕ¾Õ¡Õ® Õ¢Õ¡Õ¶Õ¡Õ¬Õ«Õ¶Õ $1',
'savedprefs' => 'ÕÕ¥Ö€ Õ¶Õ¡Õ­Õ¨Õ¶Õ¿Ö€Õ¸Ö‚Õ©ÕµÕ¸Ö‚Õ¶Õ¶Õ¥Ö€Õ¨ Õ°Õ«Õ·Õ¾Õ¡Õ® Õ¥Õ¶Ö‰',
'timezonelegend' => 'ÔºÕ¡Õ´Õ¡ÕµÕ«Õ¶ Õ£Õ¸Õ¿Õ«.',
'localtime' => 'ÕÕ¥Õ²Õ¡Õ¯Õ¡Õ¶ ÕªÕ¡Õ´Õ¡Õ¶Õ¡Õ¯.',
@@ -1268,7 +1280,6 @@ $3 Õ´Õ¡Õ½Õ¶Õ¡Õ¯Õ«ÖÕ¨ Õ¿Õ¾Õ¥Õ¬ Õ§ Õ°Õ¥Õ¿Ö‡ÕµÕ¡Õ¬ ÕºÕ¡Õ¿Õ³Õ¡Õ¼Õ¨. ''$2''",
'prefs-reset-intro' => 'Ô±ÕµÕ½ Õ§Õ»Õ¸Ö‚Õ´ Õ°Õ¶Õ¡Õ¡Ö€Õ¡Õ¾Õ¸Ö€ Õ§ Õ¦Ö€Õ¸ÕµÕ¡ÖÕ¶Õ¥Õ¬ Õ±Õ¥Ö€ Õ¢Õ¸Õ¬Õ¸Ö€ Õ¶Õ¡Õ­Õ¨Õ¶Ö€Õ¡Õ¶Ö„Õ¶Õ¥Ö€Õ¨, ÖƒÕ¸Õ­Õ¥Õ¬Õ¸Õ¾ Õ¤Ö€Õ¡Õ¶Ö„ Õ«Õ¬Õ¼Õ¥Õ¬Õ¡ÕµÕ¶ Õ¶Õ¡Õ­Õ¨Õ¶Õ¿Ö€Õ¡Õ¶Ö„Õ¶Õ¥Ö€Õ«Ö‰
Ô³Õ¸Ö€Õ®Õ¸Õ²Õ¸Ö‚Õ©ÕµÕ¸Ö‚Õ¶Õ¨ Õ°Õ¡Õ½Õ¿Õ¡Õ¿Õ¥Õ¬Õ¸Ö‚Ö Õ°Õ¥Õ¿Õ¸, Õ¶Õ¡Õ®Õ¨Õ¶Õ¿Ö€Õ¡Õ¶Ö„Õ¶Õ¥Ö€Õ¨ Õ°Õ¶Õ¡Õ¡Ö€Õ¾Õ¸Ö€ Õ¹Õ« Õ¬Õ«Õ¶Õ¥Õ¬Õ¸Ö‚ Õ°Õ¥Õ¿ Õ¢Õ¥Ö€Õ¥Õ¬Ö‰',
'prefs-emailconfirm-label' => 'Ô·Õ¬-ÖƒÕ¸Õ½Õ¿Õ« Õ¾Õ¡Õ¾Õ¥Ö€Õ¡Öում․',
-'prefs-textboxsize' => 'Ô½Õ´Õ¢Õ¡Õ£Ö€Õ´Õ¡Õ¶ ÕºÕ¡Õ¿Õ¸Ö‚Õ°Õ¡Õ¶Õ« Õ¹Õ¡ÖƒÕ¨',
'youremail' => 'Ô·Õ¬Õ¥Õ¯Õ¿Ö€Õ¸Õ¶Õ¡ÕµÕ«Õ¶ ÖƒÕ¸Õ½Õ¿.',
'username' => '{{GENDER:$1|Õ„Õ¡Õ½Õ¶Õ¡Õ¯ÖÕ« Õ¡Õ¶Õ¸Ö‚Õ¶}}Õ',
'uid' => 'Õ„Õ¡Õ½Õ¶Õ¡Õ¯ÖÕ« Õ«Õ¤Õ¥Õ¶Õ¿Õ«Ö†Õ«Õ¯Õ¡Õ¿Õ¸Ö€.',
@@ -1420,7 +1431,6 @@ $3 Õ´Õ¡Õ½Õ¶Õ¡Õ¯Õ«ÖÕ¨ Õ¿Õ¾Õ¥Õ¬ Õ§ Õ°Õ¥Õ¿Ö‡ÕµÕ¡Õ¬ ÕºÕ¡Õ¿Õ³Õ¡Õ¼Õ¨. ''$2''",
'recentchangeslinked-feed' => 'Ô¿Õ¡ÕºÕ¾Õ¡Õ® ÖƒÕ¸ÖƒÕ¸Õ­Õ¸Ö‚Õ©ÕµÕ¸Ö‚Õ¶Õ¶Õ¥Ö€',
'recentchangeslinked-toolbox' => 'Ô¿Õ¡ÕºÕ¾Õ¡Õ® ÖƒÕ¸ÖƒÕ¸Õ­Õ¸Ö‚Õ©ÕµÕ¸Ö‚Õ¶Õ¶Õ¥Ö€',
'recentchangeslinked-title' => '«$1» էջին կապված փոփոխությունները',
-'recentchangeslinked-noresult' => 'Ô¿Õ¡ÕºÕ¡Õ¯ÖÕ¾Õ¡Õ® Õ§Õ»Õ¥Ö€Õ¸Ö‚Õ´ Õ¶Õ·Õ¾Õ¡Õ® ÕªÕ¡Õ´Õ¡Õ¶Õ¡Õ¯Õ¡Õ¨Õ¶Õ©Õ¡ÖÖ„Õ¸Ö‚Õ´ ÖƒÕ¸ÖƒÕ¸Õ­Õ¸Ö‚Õ©ÕµÕ¸Ö‚Õ¶Õ¶Õ¥Ö€ Õ¹Õ¥Õ¶ Õ¥Õ²Õ¥Õ¬Ö‰',
'recentchangeslinked-summary' => "Ô±ÕµÕ½ Õ½ÕºÕ¡Õ½Õ¡Ö€Õ¯Õ¸Õ² Õ§Õ»Õ¸Ö‚Õ´ Õ¢Õ¥Ö€Õ¾Õ¡Õ® Õ¥Õ¶ Õ°Õ²Õ¾Õ¸Õ² Õ§Õ»Õ¥Ö€Õ¸Ö‚Õ´ Õ¯Õ¡Õ¿Õ¡Ö€Õ¾Õ¡Õ® Õ¾Õ¥Ö€Õ»Õ«Õ¶ ÖƒÕ¸ÖƒÕ¸Õ­Õ¸Ö‚Õ©ÕµÕ¸Ö‚Õ¶Õ¶Õ¥Ö€Õ¨Ö‰ ÕÕ¥Ö€ Õ°Õ½Õ¯Õ¡ÖÕ¡Õ¶Õ¯Õ« Õ§Õ»Õ¥Ö€Õ¨ Õ¶Õ¥Ö€Õ¯Õ¡ÕµÕ¡ÖÕ¾Õ¡Õ® Õ¥Õ¶ '''Õ©Õ¡Õ¾Õ¡Õ¿Õ¡Õ¼'''Ö‰",
'recentchangeslinked-page' => 'Ô·Õ»Õ« Õ¡Õ¶Õ¾Õ¡Õ¶Õ¸Ö‚Õ´Õ¨Õ',
'recentchangeslinked-to' => 'Õ€Õ¡Õ¯Õ¡Õ¼Õ¡Õ›Õ¯Õ¨. ÖÕ¸Ö‚ÕµÖ Õ¿Õ¡Õ¬ Õ¡ÕµÕ½ Õ§Õ»Õ«Õ¶ Õ°Õ²Õ¸Õ² Õ§Õ»Õ¥Ö€Õ« ÖƒÕ¸ÖƒÕ¸Õ­Õ¸Ö‚Õ©ÕµÕ¸Ö‚Õ¶Õ¶Õ¥Ö€Õ¨Ö‰',
@@ -1625,12 +1635,6 @@ $3 Õ´Õ¡Õ½Õ¶Õ¡Õ¯Õ«ÖÕ¨ Õ¿Õ¾Õ¥Õ¬ Õ§ Õ°Õ¥Õ¿Ö‡ÕµÕ¡Õ¬ ÕºÕ¡Õ¿Õ³Õ¡Õ¼Õ¨. ''$2''",
'statistics-users-active-desc' => 'ÕŽÕ¥Ö€Õ»Õ«Õ¶ {{PLURAL:$1|Ö…Ö€|$1 Ö…Ö€}}Õ¸Ö‚Õ´ Õ¸Ö€Ö‡Õ§ Õ£Õ¸Ö€Õ®Õ¸Õ²Õ¸Ö‚Õ©ÕµÕ¸Ö‚Õ¶ Õ¥Õ¶ Õ¯Õ¡Õ¿Õ¡Ö€Õ¡Õ® Õ´Õ¡Õ½Õ¶Õ¡Õ¯Õ«ÖÕ¶Õ¥Ö€',
'statistics-mostpopular' => 'Ô±Õ´Õ¥Õ¶Õ¡Õ°Õ¡Õ³Õ¡Õ­ Õ¤Õ«Õ¿Õ¾Õ¸Õ² Õ§Õ»Õ¥Ö€',
-'disambiguations' => 'ÔµÖ€Õ¯Õ«Õ´Õ¡Õ½Õ¿Õ¸Ö‚Õ©ÕµÕ¡Õ¶ ÖƒÕ¡Ö€Õ¡Õ¿Õ´Õ¡Õ¶ Õ§Õ»Õ¥Ö€',
-'disambiguationspage' => 'Template:ÔµÖ€Õ¯Õ«Õ´Õ¡Õ½Õ¿',
-'disambiguations-text' => 'Õ€Õ¥Õ¿Ö‡ÕµÕ¡Õ¬ Õ§Õ»Õ¥Ö€Õ¨ Õ°Õ²Õ¸Ö‚Õ´ Õ¥Õ¶ Õ¥Ö€Õ¯Õ«Õ´Õ¡Õ½Õ¿Õ¸Ö‚Õ©ÕµÕ¡Õ¶ ÖƒÕ¡Ö€Õ¡Õ¿Õ´Õ¡Õ¶ Õ§Õ»Õ¥Ö€Õ«Õ¶Ö‰
-Õ“Õ¸Õ­Õ¡Ö€Õ¥Õ¶Õ¨ Õ¶Ö€Õ¡Õ¶Ö„, Õ°Õ¡Õ¾Õ¡Õ¶Õ¡Õ¢Õ¡Ö€, ÕºÕ¥Õ¿Ö„ Õ§ Õ°Õ²Õ¥Õ¶ Õ°Õ¡Õ´Õ¡ÕºÕ¡Õ¿Õ¡Õ½Õ­Õ¡Õ¶ Õ©Õ¥Õ´Õ¡ÕµÕ«Õ¶Ö‰<br />
-Ô·Õ»Õ¨ Õ°Õ¡Õ´Õ¡Ö€Õ¾Õ¸Ö‚Õ´ Õ§ Õ¥Ö€Õ¯Õ«Õ´Õ¡Õ½Õ¿Õ¸Ö‚Õ©ÕµÕ¡Õ¶ ÖƒÕ¡Ö€Õ¡Õ¿Õ´Õ¡Õ¶ Õ§Õ», Õ¥Õ©Õ¥ Õ¡ÕµÕ¶ ÕºÕ¡Ö€Õ¸Ö‚Õ¶Õ¡Õ¯Õ¸Ö‚Õ´ Õ§ [[MediaWiki:Disambiguationspage]] Õ§Õ»Õ¸Ö‚Õ´ Õ¨Õ¶Õ¤Õ£Ö€Õ¯Õ¾Õ¡Õ® Õ¯Õ¡Õ²Õ¡ÕºÕ¡Ö€Õ¶Õ¥Ö€Õ«Ö Õ¸Ö€Ö‡Õ§ Õ´Õ¥Õ¯Õ¨Ö‰',
-
'pageswithprop-submit' => 'Ô±Õ¶ÖÕ¶Õ¥Õ¬',
'doubleredirects' => 'Ô¿Ö€Õ¯Õ¶Õ¡Õ¯Õ« Õ¾Õ¥Ö€Õ¡Õ°Õ²Õ¸Ö‚Õ´Õ¶Õ¥Ö€',
@@ -1819,10 +1823,9 @@ $1-Õ¨ Õ°Õ²Õ¾Õ¥Õ¬ Õ§ $2 Õ«Ö',
'unwatch' => 'Õ€Õ¡Õ¶Õ¥Õ¬ Õ°Õ½Õ¯Õ¸Ö‚Õ´Õ«Ö',
'unwatchthispage' => 'Õ€Õ¡Õ¶Õ¥Õ¬ Õ°Õ½Õ¯Õ¸Ö‚Õ´Õ«Ö',
'notanarticle' => 'Õ€Õ¸Õ¤Õ¾Õ¡Õ® Õ¹Õ§',
-'watchnochange' => 'ÕˆÕ¹ Õ´Õ« Õ°Õ½Õ¯Õ¾Õ¸Õ² Õ§Õ» Õ¹Õ« ÖƒÕ¸ÖƒÕ¸Õ­Õ¾Õ¥Õ¬ ÖÕ¸Ö‚ÖÕ¡Õ¤Ö€Õ¾Õ¸Õ² ÕªÕ¡Õ´Õ¡Õ¶Õ¡Õ¯Õ¡Õ°Õ¡Õ¿Õ¾Õ¡Õ®Õ¸Ö‚Õ´Ö‰',
'watchlist-details' => 'ÕÕ¥Ö€ Õ°Õ½Õ¯Õ¡ÖÕ¡Õ¶Õ¯Õ¸Ö‚Õ´ Õ¯Õ¡ {{PLURAL:$1|$1 Õ§Õ»|$1 Õ§Õ»}}` Ö„Õ¶Õ¶Õ¡Ö€Õ¯Õ´Õ¡Õ¶ Õ§Õ»Õ¥Ö€Õ¨ Õ¹Õ°Õ¡Õ·Õ¾Õ¡Õ®Ö‰',
-'wlheader-enotif' => '* Ô·Õ¬-ÖƒÕ¸Õ½Õ¿Õ¸Õ¾ Õ¿Õ¥Õ²Õ¥Õ¯Õ¡ÖÕ¸Ö‚Õ´Õ¨ Õ´Õ«Õ¡ÖÕ¾Õ¡Õ® Õ§Ö‰',
-'wlheader-showupdated' => "* Ô·Õ»Õ¥Ö€Õ¨, Õ¸Ö€Õ¸Õ¶Ö„ ÖƒÕ¸ÖƒÕ¸Õ­Õ¾Õ¥Õ¬ Õ¥Õ¶ Õ±Õ¥Ö€ Õ¤Ö€Õ¡Õ¶Ö Õ¾Õ¥Ö€Õ»Õ«Õ¶ Õ¡ÕµÖÕ«Ö Õ°Õ¥Õ¿Õ¸ Õ¢Õ¥Ö€Õ¾Õ¡Õ® Õ¥Õ¶ '''Õ©Õ¡Õ¾Õ¡Õ¿Õ¡Õ¼'''Ö‰",
+'wlheader-enotif' => 'Ô·Õ¬-ÖƒÕ¸Õ½Õ¿Õ¸Õ¾ Õ¿Õ¥Õ²Õ¥Õ¯Õ¡ÖÕ¸Ö‚Õ´Õ¨ Õ´Õ«Õ¡ÖÕ¾Õ¡Õ® Õ§Ö‰',
+'wlheader-showupdated' => "Ô·Õ»Õ¥Ö€Õ¨, Õ¸Ö€Õ¸Õ¶Ö„ ÖƒÕ¸ÖƒÕ¸Õ­Õ¾Õ¥Õ¬ Õ¥Õ¶ Õ±Õ¥Ö€ Õ¤Ö€Õ¡Õ¶Ö Õ¾Õ¥Ö€Õ»Õ«Õ¶ Õ¡ÕµÖÕ«Ö Õ°Õ¥Õ¿Õ¸ Õ¢Õ¥Ö€Õ¾Õ¡Õ® Õ¥Õ¶ '''Õ©Õ¡Õ¾Õ¡Õ¿Õ¡Õ¼'''Ö‰",
'watchmethod-recent' => 'Õ¾Õ¥Ö€Õ»Õ«Õ¶ ÖƒÕ¸ÖƒÕ¸Õ­Õ¸Ö‚Õ©ÕµÕ¸Ö‚Õ¶Õ¶Õ¥Ö€Õ¨ Õ°Õ½Õ¯Õ¾Õ¸Õ² Õ§Õ»Õ¥Ö€Õ« Õ°Õ¡Õ´Õ¡Ö€',
'watchmethod-list' => 'Õ°Õ½Õ¯Õ¾Õ¸Õ² Õ§Õ»Õ¥Ö€Õ« Õ¾Õ¥Ö€Õ»Õ«Õ¶ ÖƒÕ¸ÖƒÕ¸Õ­Õ¸Ö‚Õ©ÕµÕ¸Ö‚Õ¶Õ¶Õ¥Ö€Õ¨',
'watchlistcontains' => 'ÕÕ¥Ö€ Õ°Õ½Õ¯Õ¡ÖÕ¡Õ¶Õ¯Õ¸Ö‚Õ´ Õ¯Õ¡ $1 {{PLURAL:$1|Õ§Õ»|Õ§Õ»}}Ö‰',
@@ -2160,7 +2163,6 @@ $1',
'ip_range_invalid' => 'IP-Õ°Õ¡Õ½ÖÕ¥Õ¶Õ¥Ö€Õ« Õ¡Õ¶Õ©Õ¸Ö‚ÕµÕ¬Õ¡Õ¿Ö€Õ¥Õ¬Õ« Õ¬Õ¡ÕµÕ¶Õ¸Ö‚ÕµÕ©Ö‰',
'proxyblocker' => 'Õ“Õ¸Õ­Õ¡Õ¶Õ¸Ö€Õ¤Õ« Õ¡Ö€Õ£Õ¥Õ¬Õ¡ÖƒÕ¡Õ¯Õ¸Ö‚Õ´',
'proxyblockreason' => 'ÕÕ¥Ö€ IP-Õ°Õ¡Õ½ÖÕ¥Õ¶ Õ¡Ö€Õ£Õ¥Õ¬Õ¡ÖƒÕ¡Õ¯Õ¾Õ¥Õ¬ Õ§, Ö„Õ¡Õ¶Õ« Õ¸Ö€ Õ¡ÕµÕ¶ ÕºÕ¡Õ¿Õ¯Õ¡Õ¶Õ¸Ö‚Õ´ Õ§ Õ°Õ¡Õ¶Ö€Õ¡ÕµÕ«Õ¶ Õ´Õ«Õ»Õ¶Õ¸Ö€Õ¤ (ÕºÖ€Õ¸Ö„Õ½Õ«) Õ½Õ¥Õ¼Õ¾Õ¥Ö€Õ«Õ¶Ö‰ Ô½Õ¶Õ¤Ö€Õ¸Ö‚Õ´ Õ¥Õ¶Ö„ Õ¯Õ¡ÕºÕ¾Õ¥Õ¬ Õ±Õ¥Ö€ ÖÕ¡Õ¶ÖÕ¡ÕµÕ«Õ¶ Õ¯Õ¡Õ´ Õ¿Õ¥Õ­Õ¶Õ«Õ¯Õ¡Õ¯Õ¡Õ¶ Õ®Õ¡Õ¼Õ¡ÕµÕ¸Ö‚Õ©ÕµÕ¡Õ¶ Õ¿Ö€Õ¡Õ´Õ¡Õ¤Ö€Õ¸Õ²Õ« Õ°Õ¥Õ¿ Ö‡ Õ¿Õ¥Õ²Õ¥Õ¯Õ¡ÖÕ¶Õ¥Õ¬ Õ¡ÕµÕ½ Õ¬Õ¸Ö‚Ö€Õ» Õ¡Õ¶Õ¾Õ¿Õ¡Õ¶Õ£Õ¸Ö‚Õ©ÕµÕ¡Õ¶ Õ­Õ¶Õ¤Ö€Õ« Õ´Õ¡Õ½Õ«Õ¶Ö‰',
-'proxyblocksuccess' => 'Ô±Ö€Õ¾Õ¡Õ® Õ§Ö‰',
'sorbsreason' => 'ÕÕ¥Ö€ IP-Õ°Õ¡Õ½ÖÕ¥Õ¶ Õ°Õ¡Õ·Õ¾Õ¾Õ¡Õ® Õ§ Õ¸Ö€ÕºÕ¥Õ½ Õ¡Õ¦Õ¡Õ¿ Ö…Õ£Õ¿Õ¡Õ£Õ¸Ö€Õ®Õ´Õ¡Õ¶ ÖƒÕ¸Õ­Õ¡Õ¶Õ¸Ö€Õ¤ DNSBL ÖÕ¡Õ¶Õ¯Õ¸Ö‚Õ´Ö‰',
'sorbs_create_account_reason' => 'ÕÕ¥Ö€ IP-Õ°Õ¡Õ½ÖÕ¥Õ¶ Õ°Õ¡Õ·Õ¾Õ¾Õ¡Õ® Õ§ Õ¸Ö€ÕºÕ¥Õ½ Õ¡Õ¦Õ¡Õ¿ Ö…Õ£Õ¿Õ¡Õ£Õ¸Ö€Õ®Õ´Õ¡Õ¶ ÖƒÕ¸Õ­Õ¡Õ¶Õ¸Ö€Õ¤ DNSBL ÖÕ¡Õ¶Õ¯Õ¸Ö‚Õ´Ö‰ Ô´Õ¸Ö‚Ö„ Õ¹Õ¥Ö„ Õ¯Õ¡Ö€Õ¸Õ² Õ½Õ¿Õ¥Õ²Õ®Õ¥Õ¬ Õ´Õ¡Õ½Õ¶Õ¡Õ¯ÖÕ¡ÕµÕ«Õ¶ Õ°Õ¡Õ·Õ«Õ¾Ö‰',
'ipbnounblockself' => 'Ô´Õ¸Ö‚Ö„ Õ¹Õ¥Ö„ Õ¯Õ¡Ö€Õ¸Õ² Õ¡Ö€Õ£Õ¥Õ¬Õ¡ÖƒÕ¡Õ¯Õ¥Õ¬ Õ«Õ¶Ö„Õ¶Õ¥Ö€Õ¤ Õ±Õ¥Õ¦',
@@ -2448,13 +2450,8 @@ Please visit [//www.mediawiki.org/wiki/Localisation MediaWiki Localisation] and
'pageinfo-protect-cascading-yes' => 'Ô±ÕµÕ¸',
# Skin names
-'skinname-standard' => 'Ô´Õ¡Õ½Õ¡Õ¯Õ¡Õ¶',
-'skinname-nostalgia' => 'Õ€Õ¡ÕµÖ€Õ¥Õ¶Õ¡Õ¢Õ¡Õ²Õ±Õ¸Ö‚Õ©ÕµÕ¸Ö‚Õ¶',
'skinname-cologneblue' => 'Õ”ÕµÕ¸Õ¬Õ¶Õ« Õ©Õ¡Õ­Õ«Õ®',
'skinname-monobook' => 'Õ„Õ«Õ¡Ô³Õ«Ö€Ö„',
-'skinname-myskin' => 'Ô»Õ´ÕÕ¥Õ½Ö„',
-'skinname-chick' => 'Ô¾Õ«Õ¿',
-'skinname-simple' => 'ÕŠÕ¡Ö€Õ¦',
'skinname-modern' => 'Õ„Õ¸Õ¤Õ¥Ö€Õ¶',
'skinname-vector' => 'ÕÕ¸Õ¾Õ¸Ö€Õ¡Õ¯Õ¡Õ¶',
@@ -2550,7 +2547,7 @@ $1',
* gpslongitude
* gpsaltitude',
-# EXIF tags
+# Exif tags
'exif-imagewidth' => 'Ô¼Õ¡ÕµÕ¶Ö„',
'exif-imagelength' => 'Ô²Õ¡Ö€Õ±Ö€Õ¸Ö‚Õ©ÕµÕ¸Ö‚Õ¶',
'exif-artist' => 'Õ€Õ¥Õ²Õ«Õ¶Õ¡Õ¯',
@@ -2693,10 +2690,6 @@ $3
# Special:Version
'version' => 'Õ„Õ¥Õ¤Õ«Õ¡ÕŽÕ«Ö„Õ« Õ¿Õ¡Ö€Õ¢Õ¥Ö€Õ¡Õ¯Õ¨',
-# Special:FilePath
-'filepath-page' => 'Õ†Õ«Õ·Ö„Õ',
-'filepath-submit' => 'Ô±Õ¶ÖÕ¶Õ¥Õ¬',
-
# Special:FileDuplicateSearch
'fileduplicatesearch' => 'Õ“Õ¶Õ¿Ö€Õ¥Õ¬ Õ¯Ö€Õ¯Õ¶Ö…Ö€Õ«Õ¶Õ¡Õ¯ ÕºÕ¡Õ¿Õ¯Õ¥Ö€Õ¶Õ¥Ö€',
'fileduplicatesearch-summary' => 'Õ“Õ¶Õ¿Ö€Õ¥Õ¬ Õ¯Ö€Õ¯Õ¶Ö…Ö€Õ«Õ¶Õ¡Õ¯ ÕºÕ¡Õ¿Õ¯Õ¥Ö€Õ¶Õ¥Ö€Õ Õ°Õ¥Õ· Õ¡Ö€ÕªÕ¥Ö„Õ¶Õ¥Ö€Õ« Õ°Õ«Õ´Õ¡Õ¶ Õ¾Ö€Õ¡',
diff --git a/languages/messages/MessagesIa.php b/languages/messages/MessagesIa.php
index 6e545313..438d9a70 100644
--- a/languages/messages/MessagesIa.php
+++ b/languages/messages/MessagesIa.php
@@ -12,6 +12,7 @@
* @author Kaganer
* @author Malafaya
* @author McDutchie
+ * @author Nemo bis
* @author Reedy
* @author Yfdyh000
* @author לערי ריינה×רט
@@ -173,9 +174,6 @@ $messages = array(
'tog-shownumberswatching' => 'Monstrar le numero de usatores que observa le pagina',
'tog-oldsig' => 'Signatura existente:',
'tog-fancysig' => 'Tractar signatura como wikitexto (sin ligamine automatic)',
-'tog-externaleditor' => 'Usar un editor externe qua standard (pro expertos solmente, necessita configuration special in tu computator. [//www.mediawiki.org/wiki/Manual:External_editors Plus informationes.])',
-'tog-externaldiff' => "Usar un programma ''diff'' externe qua standard (pro expertos solmente, necessita configuration special in tu computator. [//www.mediawiki.org/wiki/Manual:External_editors Plus informationes.])",
-'tog-showjumplinks' => 'Activar ligamines de accessibilitate "saltar a"',
'tog-uselivepreview' => 'Usar previsualisation in directo (experimental)',
'tog-forceeditsummary' => 'Avisar me si io non entra un summario de modification',
'tog-watchlisthideown' => 'Celar mi proprie modificationes in le observatorio',
@@ -189,6 +187,8 @@ $messages = array(
'tog-showhiddencats' => 'Monstrar categorias celate',
'tog-noconvertlink' => 'Disactivar conversion de titulos de ligamines',
'tog-norollbackdiff' => 'Omitter le diff post le execution de un revocation',
+'tog-useeditwarning' => 'Advertir me quando io quita un pagina de modification sin publicar le cambiamentos',
+'tog-prefershttps' => 'Sempre usar un connexion secur in session aperte',
'underline-always' => 'Sempre',
'underline-never' => 'Nunquam',
@@ -252,6 +252,18 @@ $messages = array(
'oct' => 'oct',
'nov' => 'nov',
'dec' => 'dec',
+'january-date' => '$1 de januario',
+'february-date' => '$1 de februario���',
+'march-date' => '$1 de martio',
+'april-date' => '$1 de april',
+'may-date' => '$1 de maio',
+'june-date' => '$1 de junio',
+'july-date' => '$1 de julio',
+'august-date' => '$1 de augusto',
+'september-date' => '$1 de septembre',
+'october-date' => '$1 de octobre',
+'november-date' => '$1 de novembre',
+'december-date' => '$1 de decembre',
# Categories related messages
'pagecategories' => '{{PLURAL:$1|Categoria|Categorias}}',
@@ -333,6 +345,7 @@ $messages = array(
'create-this-page' => 'Crear iste pagina',
'delete' => 'Deler',
'deletethispage' => 'Deler iste pagina',
+'undeletethispage' => 'Restaurar iste pagina',
'undelete_short' => 'Restaurar {{PLURAL:$1|un modification|$1 modificationes}}',
'viewdeleted_short' => 'Vider {{PLURAL:$1|un modification|$1 modificationes}} delite',
'protect' => 'Proteger',
@@ -349,7 +362,7 @@ $messages = array(
'articlepage' => 'Vider pagina de contento',
'talk' => 'Discussion',
'views' => 'Representationes',
-'toolbox' => 'Instrumentario',
+'toolbox' => 'Instrumentos',
'userpage' => 'Vider pagina del usator',
'projectpage' => 'Vider pagina de projecto',
'imagepage' => 'Vider le pagina del file',
@@ -376,7 +389,7 @@ $1',
'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).
+# 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).
'aboutsite' => 'A proposito de {{SITENAME}}',
'aboutpage' => 'Project:A proposito',
'copyright' => 'Le contento es disponibile sub $1 si non alteremente specificate.',
@@ -386,7 +399,6 @@ $1',
'disclaimers' => 'Declaration de non-responsabilitate',
'disclaimerpage' => 'Project:Declaration general de non-responsabilitate',
'edithelp' => 'Adjuta de modification',
-'edithelppage' => 'Help:Modification',
'helppage' => 'Help:Contento',
'mainpage' => 'Pagina principal',
'mainpage-description' => 'Pagina principal',
@@ -463,17 +475,12 @@ Un lista de paginas special valide se trova a [[Special:SpecialPages|{{int:speci
# General errors
'error' => 'Error',
'databaseerror' => 'Error del base de datos',
-'dberrortext' => 'Un error de syntaxe occurreva durante un consulta del base de datos.
-Isto pote indicar le presentia de un defecto in le software.
-Le ultime consulta que esseva tentate es:
-<blockquote><code>$1</code></blockquote>
-effectuate per le function "<code>$2</code>".
-Le base de datos retornava le error "<samp>$3: $4</samp>".',
-'dberrortextcl' => 'Un error de syntaxe occurreva durante un consulta del base de datos.
-Le ultime consulta que esseva tentate es:
-"$1"
-effectuate per le function "$2".
-Le base de datos retornava le error "$3: $4"',
+'databaseerror-text' => 'Un error ha occurrite in un consulta del base de datos.
+Isto pote indicar un defecto in le software.',
+'databaseerror-textcl' => 'Un error ha occurrite in un consulta del base de datos.',
+'databaseerror-query' => 'Consulta: $1',
+'databaseerror-function' => 'Function: $1',
+'databaseerror-error' => 'Error: $1',
'laggedslavemode' => 'Attention: Es possibile que le pagina non contine actualisationes recente.',
'readonly' => 'Base de datos blocate',
'enterlockreason' => 'Describe le motivo del blocada, includente un estimation
@@ -508,6 +515,7 @@ Es possibile que un altere persona lo ha ja delite.',
'cannotdelete-title' => 'Non pote deler le pagina "$1"',
'delete-hook-aborted' => 'Le deletion ha essite abortate per un extension.
Nulle explication es disponibile.',
+'no-null-revision' => 'Non ha potite crear un nove version vacue del le pagina "$1"',
'badtitle' => 'Titulo invalide',
'badtitletext' => 'Le titulo de pagina requestate es invalide, vacue, o un titulo interlingual o interwiki incorrectemente ligate.
Es possibile que illo contine un o plure characteres que non pote esser usate in titulos.',
@@ -529,12 +537,15 @@ Per favor reprova post alcun minutas.',
'editinginterface' => "'''Attention:''' Le texto de iste pagina face parte del interfacie pro le software.
Omne modification a iste pagina cambiara le apparentia del interfacie pro altere usatores de iste wiki.
Pro adder o modificar traductiones pro tote le wikis, per favor usa [//translatewiki.net/ translatewiki.net], le projecto de traduction de MediaWiki.",
-'sqlhidden' => '(Consulta SQL non monstrate)',
'cascadeprotected' => 'Iste pagina ha essite protegite contra modificationes, proque illo es includite in le sequente {{PLURAL:$1|pagina, le qual|paginas, le quales}} es protegite usante le option "cascada":
$2',
'namespaceprotected' => "Tu non ha le permission de modificar paginas in le spatio de nomines '''$1'''.",
'customcssprotected' => 'Tu non ha le permission de modificar iste pagina de CSS perque illo contine le configuration personal de un altere usator.',
'customjsprotected' => 'Tu non ha le permission de modificar iste pagina de JavaScript perque illo contine le configuration personal de un altere usator.',
+'mycustomcssprotected' => 'Tu non ha le permission de modificar iste pagina de CSS.',
+'mycustomjsprotected' => 'Tu non ha le permission de modificar iste pagina de JavaScript.',
+'myprivateinfoprotected' => 'Tu non ha le permission de modificar le proprie information private.',
+'mypreferencesprotected' => 'Tu non ha le permission de modificar le proprie preferentias.',
'ns-specialprotected' => 'Le paginas special non es modificabile.',
'titleprotected' => "Iste titulo ha essite protegite contra creation per [[User:$1|$1]].
Le motivo specificate es ''$2''.",
@@ -559,10 +570,19 @@ Nota que alcun paginas pote continuar a apparer como si tu esserea ancora authen
'welcomecreation-msg' => 'Tu conto ha essite create.
Non oblida personalisar tu [[Special:Preferences|preferentias in {{SITENAME}}]].',
'yourname' => 'Nomine de usator:',
+'userlogin-yourname' => 'Nomine de usator',
+'userlogin-yourname-ph' => 'Entra tu nomine de usator',
+'createacct-another-username-ph' => 'Entra le nomine de usator',
'yourpassword' => 'Contrasigno:',
+'userlogin-yourpassword' => 'Contrasigno',
+'userlogin-yourpassword-ph' => 'Entra tu contrasigno',
+'createacct-yourpassword-ph' => 'Entra un contrasigno',
'yourpasswordagain' => 'Repete contrasigno:',
+'createacct-yourpasswordagain' => 'Confirma contrasigno',
+'createacct-yourpasswordagain-ph' => 'Repete le contrasigno',
'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',
+'userlogin-remembermypassword' => 'Mantener mi session aperte',
+'userlogin-signwithsecure' => 'Usar un connexion secur',
'yourdomainname' => 'Tu dominio:',
'password-change-forbidden' => 'Non es possibile cambiar le contrasigno in iste wiki.',
'externaldberror' => 'O il occurreva un error in le base de datos de authentication, o tu non ha le autorisation de actualisar tu conto externe.',
@@ -574,18 +594,44 @@ Non oblida personalisar tu [[Special:Preferences|preferentias in {{SITENAME}}]].
'logout' => 'Clauder session',
'userlogout' => 'Clauder session',
'notloggedin' => 'Tu non ha aperite un session',
+'userlogin-noaccount' => 'Non ha un conto?',
+'userlogin-joinproject' => 'Crear un conto in {{SITENAME}}',
'nologin' => 'Tu non ha un conto? $1.',
'nologinlink' => 'Crear un conto',
'createaccount' => 'Crear conto',
'gotaccount' => "Tu jam ha un conto? '''$1'''.",
'gotaccountlink' => 'Aperir session',
'userlogin-resetlink' => 'Datos de authentication oblidate?',
+'userlogin-resetpassword-link' => 'Reinitialisar contrasigno',
+'helplogin-url' => 'Help:Aperir session',
+'userlogin-helplink' => '[[{{MediaWiki:helplogin-url}}|Adjuta a aperir session]]',
+'userlogin-loggedin' => 'Tu ha jam aperite session como {{GENDER:$1|$1}}.
+Usa le formulario sequente pro aperir session como altere usator.',
+'userlogin-createanother' => 'Crear un altere conto',
+'createacct-join' => 'Specifica tu information hic infra.',
+'createacct-another-join' => 'Specifica le informationes del nove conto ci infra.',
+'createacct-emailrequired' => 'Adresse de e-mail',
+'createacct-emailoptional' => 'Adresse de e-mail (optional)',
+'createacct-email-ph' => 'Entra tu adresse de e-mail',
+'createacct-another-email-ph' => 'Entra adresse de e-mail',
'createaccountmail' => 'Usar un contrasigno aleatori temporari e inviar lo al adresse de e-mail specificate',
+'createacct-realname' => 'Nomine real (optional)',
'createaccountreason' => 'Motivo:',
+'createacct-reason' => 'Motivo',
+'createacct-reason-ph' => 'Proque crea tu un altere conto?',
+'createacct-captcha' => 'Controlo de securitate',
+'createacct-imgcaptcha-ph' => 'Scribe le texto que tu vide hic supra',
+'createacct-submit' => 'Crear tu conto',
+'createacct-another-submit' => 'Crear un altere conto',
+'createacct-benefit-heading' => '{{SITENAME}} es facite per gente como tu.',
+'createacct-benefit-body1' => '{{PLURAL:$1|modification|modificationes}}',
+'createacct-benefit-body2' => '{{PLURAL:$1|pagina|paginas}}',
+'createacct-benefit-body3' => '{{PLURAL:$1|contributor|contributores}} recente',
'badretype' => 'Le duo contrasignos que tu scribeva non es identic.',
'userexists' => 'Iste nomine de usator es jam in uso.
Selige un altere nomine.',
'loginerror' => 'Error in le apertura del session',
+'createacct-error' => 'Error de creation de conto',
'createaccounterror' => 'Non poteva crear le conto: $1',
'nocookiesnew' => "Le conto de usator ha essite create, sed tu non ha aperite un session.
{{SITENAME}} usa ''cookies'' pro mantener le sessiones del usatores.
@@ -652,11 +698,13 @@ Tu deberea aperir un session e cambiar tu contrasigno ora.
Tu pote ignorar iste message si iste conto ha essite create in error.',
'usernamehasherror' => 'Le nomine de usator non pote continer grillias/cardinales/signos de numero ("#")',
-'login-throttled' => 'Tu ha facite troppo de tentativas de identification.
-Per favor attende ante de probar lo novemente.',
+'login-throttled' => 'Tu ha facite troppo de tentativas de aperir session.
+Per favor attende $1 ante de probar lo novemente.',
'login-abort-generic' => 'Apertura de session non succedite - Abortate',
'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.',
+'createacct-another-realname-tip' => 'Le nomine real es optional.
+Si tu opta pro dar lo, isto essera usate pro dar al usator attribution pro su contributiones.',
# Email sending
'php-mail-error-unknown' => 'Error incognite in le function mail() de PHP',
@@ -673,8 +721,7 @@ Pro completar le accesso, tu debe definir un nove contrasigno hic:',
'newpassword' => 'Nove contrasigno:',
'retypenew' => 'Repete le nove contrasigno:',
'resetpass_submit' => 'Definir contrasigno e aperir un session',
-'resetpass_success' => 'Tu contrasigno ha essite cambiate correctemente!
-Ora, apertura de session in progresso…',
+'changepassword-success' => 'Tu contrasigno ha essite cambiate!',
'resetpass_forbidden' => 'Le contrasignos non pote esser cambiate',
'resetpass-no-info' => 'Tu debe aperir un session pro poter acceder directemente a iste pagina.',
'resetpass-submit-loggedin' => 'Cambiar contrasigno',
@@ -686,10 +733,11 @@ Es possibile que tu ha ja cambiate tu contrasigno o requestate un nove contrasig
# Special:PasswordReset
'passwordreset' => 'Reinitialisar contrasigno',
-'passwordreset-text' => 'Completa iste formulario pro reinitialisar tu contrasigno.',
+'passwordreset-text-one' => 'Completa iste formulario pro reinitialisar tu contrasigno.',
+'passwordreset-text-many' => '{{PLURAL:$1|Completa un de iste campos pro reinitialisar tu contrasigno.}}',
'passwordreset-legend' => 'Reinitialisar contrasigno',
'passwordreset-disabled' => 'Le reinitialisation de contrasignos ha essite disactivate in iste wiki.',
-'passwordreset-pretext' => '{{PLURAL:$1||Entra un del elementos de datos hic infra}}',
+'passwordreset-emaildisabled' => 'Le functionalitate de e-mail ha essite disactivate in iste wiki.',
'passwordreset-username' => 'Nomine de usator:',
'passwordreset-domain' => 'Dominio:',
'passwordreset-capture' => 'Vider le e-mail resultante?',
@@ -721,7 +769,7 @@ contrasigno.',
Contrasigno temporari: $2',
'passwordreset-emailsent' => 'Un message de e-mail pro le reinitialisation del contrasigno ha essite inviate.',
'passwordreset-emailsent-capture' => 'Un message de e-mail pro le reinitialisation del contrasigno ha essite inviate; iste message es monstrate hic infra.',
-'passwordreset-emailerror-capture' => 'Un e-mail de rememoration ha essite generate; iste message es monstrate hic infra, ma le invio al usator ha fallite: $1',
+'passwordreset-emailerror-capture' => 'Un e-mail pro le reinitialisation del contrasigno ha essite generate; iste message es monstrate hic infra, ma le invio al {{GENDER:$2|usator}} ha fallite: $1',
# Special:ChangeEmail
'changeemail' => 'Cambiar adresse de e-mail',
@@ -735,6 +783,19 @@ Contrasigno temporari: $2',
'changeemail-submit' => 'Cambiar e-mail',
'changeemail-cancel' => 'Cancellar',
+# Special:ResetTokens
+'resettokens' => 'Reinitialisar indicios',
+'resettokens-text' => 'Hic tu pote reinitialisar le indicios que permitte le accesso a certe datos private associate a tu conto.
+
+Tu deberea facer lo si tu los ha accidentalmente dividite con un altere persona o si tu conto ha essite compromittite.',
+'resettokens-no-tokens' => 'Il non ha indicios a reinitialisar.',
+'resettokens-legend' => 'Reinitialisar indicios',
+'resettokens-tokens' => 'Indicios:',
+'resettokens-token-label' => '$1 (valor actual: $2)',
+'resettokens-watchlist-token' => 'Indicio pro syndication web (Atom/RSS) de [[Special:Watchlist|modificationes a paginas in tu observatorio]]',
+'resettokens-done' => 'Indicios reinitialisate.',
+'resettokens-resetbutton' => 'Reinitialisar le indicios seligite',
+
# Edit page toolbar
'bold_sample' => 'Texto grasse',
'bold_tip' => 'Texto grasse',
@@ -940,12 +1001,15 @@ Nulle explication disponibile.',
Pare que illo ha essite delite.',
'edit-conflict' => 'Conflicto inter modificationes.',
'edit-no-change' => 'Tu modification ha essite ignorate, proque nulle cambio esseva facite in le texto.',
+'postedit-confirmation' => 'Tu modification ha essite salveguardate.',
'edit-already-exists' => 'Non poteva crear un nove pagina.
Illo existe ja.',
'defaultmessagetext' => 'Texto predefinite del message',
'content-failed-to-parse' => 'Impossibile processar le contento $2 pro le modello $1: $3',
'invalid-content-data' => 'Datos de contento invalide',
'content-not-allowed-here' => 'Le contento "$1" non es permittite in le pagina [[$2]]',
+'editwarning-warning' => 'Quitar iste pagina pote causar le perdita de omne modificationes que tu ha facite.
+Si tu ha aperite un session, tu pote disactivar iste aviso in le section "Modification" de tu preferentias.',
# Content models
'content-model-wikitext' => 'wikitexto',
@@ -981,6 +1045,7 @@ Per favor controla le comparation infra pro verificar que tu vole facer isto, e
'undo-failure' => 'Le modification non poteva esser annullate a causa de conflicto con modificationes intermedie.',
'undo-norev' => 'Impossibile annullar le modification proque illo non existe o esseva delite.',
'undo-summary' => 'Annullava le version $1 per [[Special:Contributions/$2|$2]] ([[User talk:$2|Discussion]] | [[Special:Contributions/$2|{{MediaWiki:Contribslink}}]])',
+'undo-summary-username-hidden' => 'Disfacer le revision $1 facite per un usator celate',
# Account creation failure
'cantcreateaccounttitle' => 'Non pote crear conto',
@@ -1164,6 +1229,7 @@ Nota que le uso del ligamines de navigation causara le perdita de tote cambios i
'compareselectedversions' => 'Comparar versiones seligite',
'showhideselectedversions' => 'Revelar/celar le versiones seligite',
'editundo' => 'disfacer',
+'diff-empty' => '(Nulle differentia)',
'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)',
'difference-missing-revision' => '{{PLURAL:$2|Un version|$2 versiones}} de iste differentia ($1) non ha essite trovate.
@@ -1191,7 +1257,6 @@ Detalios se trova in le [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}
'searchmenu-legend' => 'Optiones de recerca',
'searchmenu-exists' => "'''Existe un pagina nominate \"[[\$1]]\" in iste wiki'''",
'searchmenu-new' => "'''Crea le pagina \"[[:\$1]]\" in iste wiki!'''",
-'searchhelp-url' => 'Help:Contento',
'searchmenu-prefix' => '[[Special:PrefixIndex/$1|Navigar per le paginas con iste prefixo]]',
'searchprofile-articles' => 'Paginas de contento',
'searchprofile-project' => 'Paginas de adjuta e del projecto',
@@ -1235,15 +1300,7 @@ Tenta prefixar tu consulta con ''all:'' pro cercar in tote le contento (includen
'searchdisabled' => 'Le recerca in {{SITENAME}} es disactivate.
Tu pote cercar via Google in le interim.
Nota que lor indices del contento de {{SITENAME}} pote esser obsolete.',
-
-# Quickbar
-'qbsettings' => 'Barra rapide',
-'qbsettings-none' => 'Necun',
-'qbsettings-fixedleft' => 'Fixe a sinistra',
-'qbsettings-fixedright' => 'Fixe a dextra',
-'qbsettings-floatingleft' => 'Flottante a sinistra',
-'qbsettings-floatingright' => 'Flottante a dextra',
-'qbsettings-directionality' => 'Fixe, dependente del direction de scriptura de tu lingua',
+'search-error' => 'Un error ha occurrite durante le recerca: $1',
# Preferences page
'preferences' => 'Preferentias',
@@ -1277,7 +1334,6 @@ Nota que lor indices del contento de {{SITENAME}} pote esser obsolete.',
'resetprefs' => 'Reverter cambios',
'restoreprefs' => 'Restaurar tote le preselectiones (in tote le sectiones)',
'prefs-editing' => 'Modification',
-'prefs-edit-boxsize' => 'Dimensiones del fenestra de modification.',
'rows' => 'Lineas:',
'columns' => 'Columnas:',
'searchresultshead' => 'Recerca',
@@ -1288,9 +1344,9 @@ Nota que lor indices del contento de {{SITENAME}} pote esser obsolete.',
'recentchangesdays-max' => '(non plus de $1 {{PLURAL:$1|die|dies}})',
'recentchangescount' => 'Numero de modificationes a monstrar per predefinition:',
'prefs-help-recentchangescount' => 'Isto include modificationes recente, historias de paginas, e registros.',
-'prefs-help-watchlist-token' => 'Le insertion de un clave secrete in iste campo generara un syndication RSS de tu observatorio.
-Omnes persona cognoscente le clave in iste campo potera leger tu observatorio. Selige ergo un valor secur!
-Ecce un valor aleatorimente generate que tu pote usar: $1',
+'prefs-help-watchlist-token2' => 'Isto es le clave secrete pro le syndication web de tu observatorio.
+Omne persona qui lo cognosce pote leger tu observatorio, dunque, non divide lo.
+[[Special:ResetTokens|Clicca hic pro reinitialisar lo]].',
'savedprefs' => 'Tu preferentias ha essite confirmate.',
'timezonelegend' => 'Fuso horari:',
'localtime' => 'Hora local:',
@@ -1321,7 +1377,6 @@ Ecce un valor aleatorimente generate que tu pote usar: $1',
'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:',
-'prefs-textboxsize' => 'Dimension del fenestra de modification',
'youremail' => 'E-mail:',
'username' => '{{GENDER:$1|Nomine de usator}}:',
'uid' => 'ID del {{GENDER:$1|usator}}:',
@@ -1355,6 +1410,8 @@ Si tu opta pro dar lo, isto essera usate pro dar te attribution pro tu contribut
'prefs-dateformat' => 'Formato de data',
'prefs-timeoffset' => 'Differentia de tempore',
'prefs-advancedediting' => 'Optiones general',
+'prefs-editor' => 'Editor',
+'prefs-preview' => 'Previsualisation',
'prefs-advancedrc' => 'Optiones avantiate',
'prefs-advancedrendering' => 'Optiones avantiate',
'prefs-advancedsearchoptions' => 'Optiones avantiate',
@@ -1362,7 +1419,9 @@ Si tu opta pro dar lo, isto essera usate pro dar te attribution pro tu contribut
'prefs-displayrc' => 'Optiones de presentation',
'prefs-displaysearchoptions' => 'Optiones de presentation',
'prefs-displaywatchlist' => 'Optiones de presentation',
+'prefs-tokenwatchlist' => 'Indicio',
'prefs-diffs' => 'Differentias',
+'prefs-help-prefershttps' => 'Iste preferentia habera effecto a partir de tu proxime session.',
# User preference: email validation using jQuery
'email-address-validity-valid' => 'Sembla valide',
@@ -1389,6 +1448,8 @@ Si tu opta pro dar lo, isto essera usate pro dar te attribution pro tu contribut
'userrights-notallowed' => 'Tu non ha le permission de adder o remover derectos de usator.',
'userrights-changeable-col' => 'Gruppos que tu pote modificar',
'userrights-unchangeable-col' => 'Gruppos que tu non pote modificar',
+'userrights-conflict' => 'Conflicto inter cambiamentos de derectos de usator! Per favor revide e confirma tu cambiamentos.',
+'userrights-removed-self' => 'Tu ha removite con successo tu proprie derectos. In consequentia, tu non plus pote acceder a iste pagina.',
# Groups
'group' => 'Gruppo:',
@@ -1454,11 +1515,19 @@ Si tu opta pro dar lo, isto essera usate pro dar te attribution pro tu contribut
'right-proxyunbannable' => 'Contornar le blocadas automatic de proxy',
'right-unblockself' => 'Disblocar se mesme',
'right-protect' => 'Cambiar nivellos de protection e modificar paginas protegite in cascada',
-'right-editprotected' => 'Modificar paginas protegite (sin cascada)',
+'right-editprotected' => 'Modificar paginas protegite con "{{int:protect-level-sysop}}"',
+'right-editsemiprotected' => 'Modificar paginas protegite como "{{int:protect-level-autoconfirmed}}"',
'right-editinterface' => 'Modificar le interfacie de usator',
'right-editusercssjs' => 'Modificar le files CSS e JS de altere usatores',
'right-editusercss' => 'Modificar le files CSS de altere usatores',
'right-edituserjs' => 'Modificar le files JS de altere usatores',
+'right-editmyusercss' => 'Modificar le proprie files CSS de usator',
+'right-editmyuserjs' => 'Modificar le proprie files JavaScript de usator',
+'right-viewmywatchlist' => 'Vider le proprie observatorio',
+'right-editmywatchlist' => 'Modificar le proprie observatorio. Remarca que alcun actiones totevia adde paginas mesmo sin iste derecto.',
+'right-viewmyprivateinfo' => 'Vider le proprie datos private (p.ex. adresse de e-mail, nomine real)',
+'right-editmyprivateinfo' => 'Modificar le proprie datos private (p.ex. adresse de e-mail, nomine real)',
+'right-editmyoptions' => 'Modificar le proprie preferentias',
'right-rollback' => 'Rapidemente revocar le modificationes del ultime usator que modificava un pagina particular',
'right-markbotedits' => 'Marcar modificationes de reversion como facite per un bot',
'right-noratelimit' => 'Non esser subjecte al limites de frequentia de actiones',
@@ -1520,12 +1589,19 @@ Si tu opta pro dar lo, isto essera usate pro dar te attribution pro tu contribut
'action-userrights-interwiki' => 'modificar le derectos de usatores in altere wikis',
'action-siteadmin' => 'blocar e disblocar le base de datos',
'action-sendemail' => 'inviar e-mail',
+'action-editmywatchlist' => 'modificar le proprie observatorio',
+'action-viewmywatchlist' => 'vider le proprie observatorio',
+'action-viewmyprivateinfo' => 'vider le proprie information private',
+'action-editmyprivateinfo' => 'modificar le proprie information private',
# Recent changes
'nchanges' => '$1 {{PLURAL:$1|modification|modificationes}}',
+'enhancedrc-since-last-visit' => '$1 {{PLURAL:$1|desde le ultime visita}}',
+'enhancedrc-history' => 'historia',
'recentchanges' => 'Modificationes recente',
'recentchanges-legend' => 'Optiones del modificationes recente',
'recentchanges-summary' => 'Seque le plus recente modificationes a {{SITENAME}} in iste pagina.',
+'recentchanges-noresult' => 'Nulle modification facite in le periodo specificate que corresponde a iste criterios.',
'recentchanges-feed-description' => 'Seque le modificationes le plus recente al wiki in iste syndication.',
'recentchanges-label-newpage' => 'Iste modification creava un nove pagina',
'recentchanges-label-minor' => 'Isto es un modification minor',
@@ -1562,7 +1638,6 @@ Si tu opta pro dar lo, isto essera usate pro dar te attribution pro tu contribut
'recentchangeslinked-feed' => 'Modificationes ligate',
'recentchangeslinked-toolbox' => 'Modificationes ligate',
'recentchangeslinked-title' => 'Modificationes associate a "$1"',
-'recentchangeslinked-noresult' => 'Nulle modificationes in paginas ligate durante iste periodo.',
'recentchangeslinked-summary' => "Isto es un lista de modificationes facite recentemente in paginas ligate ab un pagina specific (o in membros de un categoria specific).
Le paginas presente in [[Special:Watchlist|tu observatorio]] appare in litteras '''grasse'''.",
'recentchangeslinked-page' => 'Nomine del pagina:',
@@ -1574,7 +1649,7 @@ Le paginas presente in [[Special:Watchlist|tu observatorio]] appare in litteras
'reuploaddesc' => 'Cancellar e retornar al formulario de incargamento',
'upload-tryagain' => 'Submitter description modificate del file',
'uploadnologin' => 'Tu non ha aperite un session',
-'uploadnologintext' => 'Tu debe [[Special:UserLogin|aperir un session]] pro poter incargar files.',
+'uploadnologintext' => 'Tu debe $1 pro poter incargar files.',
'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',
@@ -1808,7 +1883,6 @@ Pro securitate optimal, img_auth.php es disactivate.',
'http-read-error' => 'Error de lectura HTTP.',
'http-timed-out' => 'Le requesta HTTP ha expirate.',
'http-curl-error' => 'Error al obtener datos del URL: $1',
-'http-host-unreachable' => 'Non poteva acceder al URL',
'http-bad-status' => 'Un problema occurreva durante le requesta HTTP: $1 $2',
# Some likely curl errors. More could be added from <http://curl.haxx.se/libcurl/c/libcurl-errors.html>
@@ -1839,6 +1913,10 @@ Pote esser preferite reprovar quando le sito es minus occupate.',
'listfiles_size' => 'Grandor',
'listfiles_description' => 'Description',
'listfiles_count' => 'Versiones',
+'listfiles-show-all' => 'Includer ancian versiones de imagines',
+'listfiles-latestversion' => 'Version actual',
+'listfiles-latestversion-yes' => 'Si',
+'listfiles-latestversion-no' => 'No',
# File description page
'file-anchor-link' => 'File',
@@ -1935,6 +2013,13 @@ Memora verificar que non existe altere ligamines al patronos ante que tu los del
'randompage' => 'Pagina aleatori',
'randompage-nopages' => 'Il non ha paginas in le sequente {{PLURAL:$2|spatio|spatios}} de nomines: $1.',
+# Random page in category
+'randomincategory' => 'Pagina aleatori in categoria',
+'randomincategory-invalidcategory' => '"$1" non es un nomine de categoria valide.',
+'randomincategory-nopages' => 'Il non ha paginas in [[:Category:$1]].',
+'randomincategory-selectcategory' => 'Prender un pagina qualcunque del categoria: $1 $2.',
+'randomincategory-selectcategory-submit' => 'Va',
+
# Random redirect
'randomredirect' => 'Redirection aleatori',
'randomredirect-nopages' => 'Il non ha redirectiones in le spatio de nomines "$1".',
@@ -1960,18 +2045,13 @@ Memora verificar que non existe altere ligamines al patronos ante que tu los del
'statistics-users-active-desc' => 'Usatores qui ha facite un action durante le {{PLURAL:$1|die|$1 dies}} passate',
'statistics-mostpopular' => 'Le paginas plus visitate',
-'disambiguations' => 'Paginas con ligamines a paginas de disambiguation',
-'disambiguationspage' => 'Template:Disambig
-Template:Disambiguation',
-'disambiguations-text' => "Le sequente paginas contine al minus un ligamine a un '''pagina de disambiguation'''.
-Istes debe forsan ligar directemente al articulo sur le thema in question.<br />
-Un pagina se tracta como pagina de disambiguation si illo usa un patrono que es ligate ab [[MediaWiki:Disambiguationspage]].",
-
'pageswithprop' => 'Paginas con un proprietate de pagina',
'pageswithprop-legend' => 'Paginas con un proprietate de pagina',
'pageswithprop-text' => 'Iste pagina lista le paginas que usa un certe proprietate de pagina.',
'pageswithprop-prop' => 'Nomine del proprietate:',
'pageswithprop-submit' => 'Va',
+'pageswithprop-prophidden-long' => 'valor de proprietate de texto longe celate ($1)',
+'pageswithprop-prophidden-binary' => 'valor de proprietate binari celate ($1)',
'doubleredirects' => 'Redirectiones duple',
'doubleredirectstext' => 'Iste pagina lista paginas de redirection verso altere paginas de redirection.
@@ -2029,6 +2109,7 @@ Le entratas <del>cancellate</del> ha essite resolvite.',
'mostrevisions' => 'Paginas le plus modificate',
'prefixindex' => 'Tote le paginas con prefixo',
'prefixindex-namespace' => 'Tote le paginas con prefixo (spatio de nomines $1)',
+'prefixindex-strip' => 'Remover prefixo in lista',
'shortpages' => 'Paginas curte',
'longpages' => 'Paginas longe',
'deadendpages' => 'Paginas sin exito',
@@ -2044,6 +2125,7 @@ Le entratas <del>cancellate</del> ha essite resolvite.',
'listusers' => 'Lista de usatores',
'listusers-editsonly' => 'Monstrar solmente usatores con modificationes',
'listusers-creationsort' => 'Ordinar per data de creation',
+'listusers-desc' => 'Ordinar in senso descendente',
'usereditcount' => '$1 {{PLURAL:$1|modification|modificationes}}',
'usercreated' => '{{GENDER:$3|Create}} le $1 a $2',
'newpages' => 'Nove paginas',
@@ -2225,10 +2307,9 @@ Le modificationes futur in iste pagina e in le pagina de discussion associate es
'unwatchthispage' => 'Disobservar',
'notanarticle' => 'Non es un articulo',
'notvisiblerev' => 'Le version ha essite delite',
-'watchnochange' => 'Nulle articulo que tu observa esseva modificate durante le periodo de tempore indicate.',
'watchlist-details' => '{{PLURAL:$1|$1 pagina|$1 paginas}} es in tu observatorio, sin contar le paginas de discussion.',
-'wlheader-enotif' => '* Le notificationes via e-mail es active.',
-'wlheader-showupdated' => "* Le paginas que ha essite modificate post tu ultime visita se monstra in litteras '''grasse'''",
+'wlheader-enotif' => 'Le notification via e-mail es active.',
+'wlheader-showupdated' => "Le paginas que ha essite modificate post tu ultime visita se monstra in litteras '''grasse'''.",
'watchmethod-recent' => 'cerca paginas sub observation in modificationes recente',
'watchmethod-list' => 'cerca modificationes recente in paginas sub observation',
'watchlistcontains' => 'Tu observatorio contine $1 {{PLURAL:$1|pagina|paginas}}.',
@@ -2311,10 +2392,12 @@ Tote le horas es in le fuso horari del servitor.',
'deletecomment' => 'Motivo:',
'deleteotherreason' => 'Motivo altere/additional:',
'deletereasonotherlist' => 'Altere motivo',
-'deletereason-dropdown' => '*Motivos habitual pro deler paginas
-** Requesta del autor
+'deletereason-dropdown' => '*Motivos commun pro deler
+** Spam
+** Vandalismo
** Violation de copyright
-** Vandalismo',
+** Requesta del autor
+** Redirection rupte',
'delete-edit-reasonlist' => 'Modificar le motivos pro deletion',
'delete-toobig' => 'Iste pagina ha un grande historia de modificationes con plus de $1 {{PLURAL:$1|version|versiones}}.
Le deletion de tal paginas ha essite restringite pro impedir le disruption accidental de {{SITENAME}}.',
@@ -2484,7 +2567,7 @@ $1',
'contributions' => 'Contributiones del {{GENDER:$1|usator}}',
'contributions-title' => 'Contributiones del usator $1',
'mycontris' => 'Contributiones',
-'contribsub2' => 'Pro $1 ($2)',
+'contribsub2' => 'Pro {{GENDER:$3|$1}} ($2)',
'nocontribs' => 'Necun modification ha essite trovate secundo iste criterios.',
'uctop' => '(ultime)',
'month' => 'A partir del mense (e anterior):',
@@ -2644,15 +2727,13 @@ Vide le [[Special:BlockList|lista de blocadas]] pro le lista de bannimentos e bl
Illo es, nonobstante, blocate como parte del intervallo $2, le qual pote esser disblocate.',
'ip_range_invalid' => 'Intervallo de adresses IP invalide.',
'ip_range_toolarge' => 'Non es permittite blocar un gamma de adresses IP plus grande que /$1.',
-'blockme' => 'Blocar me',
'proxyblocker' => 'Blocator de proxy',
-'proxyblocker-disabled' => 'Iste function es disactivate.',
'proxyblockreason' => 'Tu adresse IP ha essite blocate proque illo es un proxy aperte.
Per favor contacta tu providitor de servicio internet o supporto technic e informa les de iste problema grave de securitate.',
-'proxyblocksuccess' => 'Succedite.',
'sorbsreason' => 'Tu adresse IP es listate como proxy aperte in le DNSBL usate per {{SITENAME}}.',
'sorbs_create_account_reason' => 'Tu adresse IP es listate como proxy aperte in le DNSBL usate per {{SITENAME}}.
Tu non pote crear un conto',
+'xffblockreason' => 'Un adresse IP presente in le capite X-Forwarded-For, o le tue o illo de un servitor proxy que tu usa, ha essite blocate. Le motivo original pro le blocada es: $1',
'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',
@@ -2821,6 +2902,8 @@ Per favor visita [//www.mediawiki.org/wiki/Localisation MediaWiki Localisation]
'thumbnail-more' => 'Aggrandir',
'filemissing' => 'File manca',
'thumbnail_error' => 'Error durante le creation del miniatura: $1',
+'thumbnail_error_remote' => 'Message de error ab $1:
+$2',
'djvu_page_error' => 'Pagina DjVu foras de limite',
'djvu_no_xml' => 'Impossibile obtener XML pro file DjVu',
'thumbnail-temp-create' => 'Impossibile crear un file temporari de miniatura',
@@ -2971,27 +3054,16 @@ Es possibile adder un motivo in le summario.',
# Stylesheets
'common.css' => '/* Le CSS placiate hic se applicara a tote le stilos */',
-'standard.css' => '/* Le CSS placiate hic afficera le usatores del apparentia Classic */',
-'nostalgia.css' => '/* Le CSS placiate hic afficera le usatores del apparentia Nostalgia */',
'cologneblue.css' => '/* Le CSS placiate hic afficera le usatores del apparentia Colonia Blau */',
'monobook.css' => '/* Le CSS placiate hic afficera le usatores del apparentia MonoBook */',
-'myskin.css' => '/* Le CSS placiate hic afficera le usatores del apparentia "Mi apparentia" */',
-'chick.css' => '/* Le CSS placiate hic afficera le usatores del apparentia Chique */',
-'simple.css' => '/* Le CSS placiate hic afficera le usatores del apparentia Simple */',
'modern.css' => '/* Le CSS placiate hic afficera le usatores del apparentia Moderne */',
'vector.css' => '/* Le CSS placiate hic afficera le usatores del apparentia Vector */',
'print.css' => '/* Le CSS placiate hic influentiara le apparentia del paginas imprimite */',
-'handheld.css' => '/* Le CSS placiate hic afficera le apparatos mobile basate super le apparentia configurate in $wgHandheldStyle */',
# Scripts
'common.js' => '/* Omne JavaScript hic se executara pro tote le usatores a cata cargamento de pagina. */',
-'standard.js' => '/* Omne JavaScript hic se executara pro le usatores del apparentia Classic */',
-'nostalgia.js' => '/* Omne JavaScript hic se executara pro le usatores del apparentia Nostalgia */',
'cologneblue.js' => '/* Omne JavaScript hic se executara pro le usatores del apparentia Colonia Blau */',
'monobook.js' => '/* Omne JavaScript hic se executara pro le usatores del apparentia MonoBook */',
-'myskin.js' => '/* Omne JavaScript hic se executara pro le usatores del apparentia "Mi apparentia" */',
-'chick.js' => '/* Omne JavaScript hic se executara pro le usatores del apparentia Chique */',
-'simple.js' => '/* Omne JavaScript hic se executara pro le usatores del apparentia Simple */',
'modern.js' => '/* Omne JavaScript hic se executara pro le usatores del apparentia Moderne */',
'vector.js' => '/* Omne JavaScript hic se executara pro le usatores del apparentia Vector */',
@@ -3067,13 +3139,8 @@ Le causa es probabilemente un ligamine verso un sito externe que es presente in
'pageinfo-category-files' => 'Numero de files',
# Skin names
-'skinname-standard' => 'Classic',
-'skinname-nostalgia' => 'Nostalgia',
'skinname-cologneblue' => 'Colonia Blau',
'skinname-monobook' => 'MonoBook',
-'skinname-myskin' => 'Mi apparentia',
-'skinname-chick' => 'Chique',
-'skinname-simple' => 'Simple',
'skinname-modern' => 'Moderne',
# Patrolling
@@ -3151,11 +3218,25 @@ Le execution de illo pote compromitter le securitate de tu systema.",
'minutes' => '{{PLURAL:$1|$1 minuta|$1 minutas}}',
'hours' => '{{PLURAL:$1|$1 hora|$1 horas}}',
'days' => '{{PLURAL:$1|$1 die|$1 dies}}',
+'weeks' => '$1 {{PLURAL:$1|septimana|septimanas}}',
'months' => '{{PLURAL:$1|$1 mense|$1 menses}}',
'years' => '{{PLURAL:$1|$1 anno|$1 annos}}',
'ago' => '$1 retro',
'just-now' => 'Justo nunc',
+# Human-readable timestamps
+'hours-ago' => '$1 {{PLURAL:$1|hora|horas}} retro',
+'minutes-ago' => '$1 {{PLURAL:$1|minuta|minutas}} retro',
+'seconds-ago' => '$1 {{PLURAL:$1|secunda|secundas}} retro',
+'monday-at' => 'Lunedi a $1',
+'tuesday-at' => 'Martedi a $1',
+'wednesday-at' => 'Mercuridi a $1',
+'thursday-at' => 'Jovedi a $1',
+'friday-at' => 'Venerdi a $1',
+'saturday-at' => 'Sabbato a $1',
+'sunday-at' => 'Dominica a $1',
+'yesterday-at' => 'Heri a $1',
+
# Bad image list
'bad_image_list' => 'Le formato es como seque:
@@ -3185,7 +3266,7 @@ Le alteres essera initialmente celate.
* gpslongitude
* gpsaltitude',
-# EXIF tags
+# Exif tags
'exif-imagewidth' => 'Latitude',
'exif-imagelength' => 'Altitude',
'exif-bitspersample' => 'Bits per componente',
@@ -3363,7 +3444,7 @@ Le alteres essera initialmente celate.
'exif-originalimageheight' => 'Altitude del imagine ante taliar',
'exif-originalimagewidth' => 'Latitude del imagine ante taliar',
-# EXIF attributes
+# Exif attributes
'exif-compression-1' => 'Non comprimite',
'exif-compression-2' => 'CCITT Group 3 1-Dimensional Modified Huffman run length encoding',
'exif-compression-3' => 'CCITT Group 3 codification fax',
@@ -3758,7 +3839,6 @@ Tu pote etiam [[Special:EditWatchlist|usar le editor standard]].',
'version-other' => 'Altere',
'version-mediahandlers' => 'Executores de media',
'version-hooks' => 'Uncinos',
-'version-extension-functions' => 'Functiones de extensiones',
'version-parser-extensiontags' => 'Etiquettas de extension del analysator syntactic',
'version-parser-function-hooks' => 'Uncinos de functiones del analysator syntactic',
'version-hook-name' => 'Nomine del uncino',
@@ -3767,6 +3847,7 @@ Tu pote etiam [[Special:EditWatchlist|usar le editor standard]].',
'version-license' => 'Licentia',
'version-poweredby-credits' => "Iste wiki es actionate per '''[//www.mediawiki.org/ MediaWiki]''', copyright © 2001-$1 $2.",
'version-poweredby-others' => 'alteres',
+'version-poweredby-translators' => 'Traductores de translatewiki.net',
'version-credits-summary' => 'Nos vole recognoscer le sequente personas pro lor contribution a [[Special:Version|MediaWiki]].',
'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.
@@ -3782,12 +3863,17 @@ Vos deberea haber recipite [{{SERVER}}{{SCRIPTPATH}}/COPYING un exemplar del Lic
'version-entrypoints-articlepath' => '[https://www.mediawiki.org/wiki/Manual:$wgArticlePath Cammino al articulo]',
'version-entrypoints-scriptpath' => '[https://www.mediawiki.org/wiki/Manual:$wgScriptPath Cammino al script]',
-# Special:FilePath
-'filepath' => 'Cammino del file',
-'filepath-page' => 'File:',
-'filepath-submit' => 'Va',
-'filepath-summary' => 'Iste pagina special retorna le cammino complete de un file.
-Le imagines se monstra in plen resolution, le altere typos de file se executa directemente con lor programmas associate.',
+# Special:Redirect
+'redirect' => 'Rediriger per nomine de file, ID de usator o ID de version',
+'redirect-legend' => 'Rediriger a un file o pagina',
+'redirect-summary' => 'Iste pagina special redirige a un file (si es date le nomine de un file), a un pagina (si es date un ID de version) o a un pagina de usator (si es date un ID de usator numeric).',
+'redirect-submit' => 'Va',
+'redirect-lookup' => 'Cercar:',
+'redirect-value' => 'Valor:',
+'redirect-user' => 'ID de usator',
+'redirect-revision' => 'Version de pagina',
+'redirect-file' => 'Nomine de file',
+'redirect-not-exists' => 'Valor non trovate',
# Special:FileDuplicateSearch
'fileduplicatesearch' => 'Cercar files duplicate',
@@ -3837,12 +3923,16 @@ Le imagines se monstra in plen resolution, le altere typos de file se executa di
'tags' => 'Etiquettas valide de modification',
'tag-filter' => 'Filtro de [[Special:Tags|etiquettas]]:',
'tag-filter-submit' => 'Filtrar',
+'tag-list-wrapper' => '([[Special:Tags|{{PLURAL:$1|Etiquetta|Etiquettas}}]]: $2)',
'tags-title' => 'Etiquettas',
'tags-intro' => 'Iste pagina lista le etiquettas con le quales le software pote marcar un modification, e lor significato.',
'tags-tag' => 'Nomine del etiquetta',
'tags-display-header' => 'Apparentia in listas de modificationes',
'tags-description-header' => 'Description complete del significato',
+'tags-active-header' => 'Active?',
'tags-hitcount-header' => 'Modificationes etiquettate',
+'tags-active-yes' => 'Si',
+'tags-active-no' => 'No',
'tags-edit' => 'modificar',
'tags-hitcount' => '$1 {{PLURAL:$1|modification|modificationes}}',
@@ -3863,6 +3953,7 @@ Le imagines se monstra in plen resolution, le altere typos de file se executa di
'dberr-problems' => 'Pardono! Iste sito ha incontrate difficultates technic.',
'dberr-again' => 'Proba attender alcun minutas e recargar.',
'dberr-info' => '(Non pote contactar le servitor del base de datos: $1)',
+'dberr-info-hidden' => '(Non pote contactar le servitor del base de datos)',
'dberr-usegoogle' => 'Tu pote probar cercar con Google intertanto.',
'dberr-outofdate' => 'Nota que lor indices de nostre contento pote esser obsolete.',
'dberr-cachederror' => 'Lo sequente es un copia del cache del pagina requestate, e pote esser obsolete.',
@@ -3878,6 +3969,9 @@ Le imagines se monstra in plen resolution, le altere typos de file se executa di
'htmlform-submit' => 'Submitter',
'htmlform-reset' => 'Disfacer modificationes',
'htmlform-selectorother-other' => 'Altere',
+'htmlform-no' => 'No',
+'htmlform-yes' => 'Si',
+'htmlform-chosen-placeholder' => 'Selige un option',
# SQLite database support
'sqlite-has-fts' => '$1 con supporto de recerca de texto integre',
@@ -3995,4 +4089,19 @@ Si non, tu pote usar le formulario facile hic infra. Tu commento essera addite a
# Image rotation
'rotate-comment' => 'Imagine rotate de $1 {{PLURAL:$1|grado|grados}} in senso horologic',
+# Limit report
+'limitreport-title' => 'Datos de rendimento del analysator syntactic:',
+'limitreport-cputime' => 'Tempore de uso del CPU',
+'limitreport-cputime-value' => '$1 {{PLURAL:$1|secunda|secundas}}',
+'limitreport-walltime' => 'Tempore de uso real',
+'limitreport-walltime-value' => '$1 {{PLURAL:$1|secunda|secundas}}',
+'limitreport-ppvisitednodes' => 'Numero de nodos de preprocessor visitate',
+'limitreport-ppgeneratednodes' => 'Numero de nodos de preprocessor generate',
+'limitreport-postexpandincludesize' => 'Dimension de inclusion post expansion',
+'limitreport-postexpandincludesize-value' => '$1/$2 {{PLURAL:$2|byte|bytes}}',
+'limitreport-templateargumentsize' => 'Dimension del argumento del patrono',
+'limitreport-templateargumentsize-value' => '$1/$2 {{PLURAL:$2|byte|bytes}}',
+'limitreport-expansiondepth' => 'Maxime profunditate de expansion',
+'limitreport-expensivefunctioncount' => 'Numero de functiones analysator costose',
+
);
diff --git a/languages/messages/MessagesId.php b/languages/messages/MessagesId.php
index e09510ac..2c3b33d4 100644
--- a/languages/messages/MessagesId.php
+++ b/languages/messages/MessagesId.php
@@ -266,6 +266,7 @@ $specialPageAliases = array(
'MIMEsearch' => array( 'Pencarian_MIME', 'PencarianMIME' ),
'Mostcategories' => array( 'Kategori_terbanyak', 'KategoriTerbanyak' ),
'Mostimages' => array( 'Berkas_paling_digunakan', 'BerkasPalingDigunakan' ),
+ 'Mostinterwikis' => array( 'Interwiki_terbanyak', 'InterwikiTerbanyak' ),
'Mostlinked' => array( 'Halaman_paling_digunakan', 'HalamanPalingDigunakan' ),
'Mostlinkedcategories' => array( 'Kategori_paling_digunakan', 'KategoriPalingDigunakan' ),
'Mostlinkedtemplates' => array( 'Templat_paling_digunakan', 'TemplatPalingDigunakan' ),
@@ -369,11 +370,6 @@ $messages = array(
'tog-shownumberswatching' => 'Tunjukkan jumlah pemantau',
'tog-oldsig' => 'Tanda tangan sekarang:',
'tog-fancysig' => 'Perlakukan tanda tangan sebagai teks wiki (tanpa suatu pranala otomatis)',
-'tog-externaleditor' => 'Gunakan editor eksternal secara bawaan (hanya untuk ahli, perlu pengaturan khusus pada komputer Anda.
-[//www.mediawiki.org/wiki/Manual:External_editors Informasi selengkapnya].)',
-'tog-externaldiff' => 'Gunakan diff eksternal secara bawaan (hanya untuk ahli, perlu pengaturan khusus pada komputer Anda.
-[//www.mediawiki.org/wiki/Manual:External_editors Informasi selengkapnya].)',
-'tog-showjumplinks' => 'Aktifkan pranala pembantu "langsung ke"',
'tog-uselivepreview' => 'Gunakan pratayang langsung (eksperimental)',
'tog-forceeditsummary' => 'Ingatkan saya bila kotak ringkasan suntingan masih kosong',
'tog-watchlisthideown' => 'Sembunyikan suntingan saya di daftar pantauan',
@@ -387,6 +383,8 @@ $messages = array(
'tog-showhiddencats' => 'Tampilkan kategori tersembunyi',
'tog-noconvertlink' => 'Matikan konversi judul pranala',
'tog-norollbackdiff' => 'Jangan tampilkan perbedaan setelah melakukan pengembalian',
+'tog-useeditwarning' => 'Ingatkan saya bila meninggalkan halaman penyuntingan sebelum menyimpan perubahan',
+'tog-prefershttps' => 'Selalu gunakan koneksi aman ketika masuk log',
'underline-always' => 'Selalu',
'underline-never' => 'Tidak pernah',
@@ -450,6 +448,18 @@ $messages = array(
'oct' => 'Okt',
'nov' => 'Nov',
'dec' => 'Des',
+'january-date' => '$1 Januari',
+'february-date' => '$1 Februari',
+'march-date' => '$1 Maret',
+'april-date' => '$1 April',
+'may-date' => '$1 Mei',
+'june-date' => '$1 Juni',
+'july-date' => '$1 Juli',
+'august-date' => '$1 Agustus',
+'september-date' => '$1 September',
+'october-date' => '$1 Oktober',
+'november-date' => '$1 November',
+'december-date' => '$1 Desember',
# Categories related messages
'pagecategories' => '{{PLURAL:$1|Kategori}}',
@@ -471,7 +481,7 @@ $messages = array(
'broken-file-category' => 'Halaman dengan gambar rusak',
'categoryviewer-pagedlinks' => '($1) ($2)',
-'linkprefix' => '/^(.*?)([a-zA-Z\\x80-\\xff]+)$/sD',
+'linkprefix' => '/^((?>.*(?<![a-zA-Z\\x80-\\xff])))(.+)$/sD',
'about' => 'Tentang',
'article' => 'Halaman isi',
@@ -534,6 +544,7 @@ $messages = array(
'create-this-page' => 'Buat halaman ini',
'delete' => 'Hapus',
'deletethispage' => 'Hapus halaman ini',
+'undeletethispage' => 'Batalkan penghapusan',
'undelete_short' => 'Batal hapus {{PLURAL:$1|$1 suntingan}}',
'viewdeleted_short' => 'Lihat {{PLURAL:$1|$1 suntingan}} yang dihapus',
'protect' => 'Lindungi',
@@ -577,7 +588,7 @@ $1',
'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).
+# 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).
'aboutsite' => 'Tentang {{SITENAME}}',
'aboutpage' => 'Project:Perihal',
'copyright' => 'Konten tersedia sesuai di bawah $1.',
@@ -587,7 +598,6 @@ $1',
'disclaimers' => 'Penyangkalan',
'disclaimerpage' => 'Project:Penyangkalan umum',
'edithelp' => 'Bantuan penyuntingan',
-'edithelppage' => 'Help:Penyuntingan',
'helppage' => 'Help:Isi',
'mainpage' => 'Halaman Utama',
'mainpage-description' => 'Halaman Utama',
@@ -618,7 +628,6 @@ $1',
'newmessagesdifflinkplural' => '{{PLURAL:$1|perubahan}} terakhir',
'youhavenewmessagesmulti' => 'Anda mendapat pesan baru pada $1',
'editsection' => 'sunting',
-'editsection-brackets' => '[$1]',
'editold' => 'sunting',
'viewsourceold' => 'lihat sumber',
'editlink' => 'sunting',
@@ -668,17 +677,12 @@ Daftar halaman istimewa yang sah dapat dilihat di [[Special:SpecialPages|{{int:s
# General errors
'error' => 'Kesalahan',
'databaseerror' => 'Kesalahan basis data',
-'dberrortext' => 'Ada kesalahan sintaks pada permintaan basis data.
-Kesalahan ini mungkin menandakan adanya sebuah \'\'bug\'\' dalam perangkat lunak.
-Permintaan basis data yang terakhir adalah:
-<blockquote><code>$1</code></blockquote>
-dari dalam fungsi "<code>$2</code>".
-Basis data menghasilkan kesalahan "<samp>$3: $4</samp>".',
-'dberrortextcl' => 'Ada kesalahan sintaks pada permintaan basis data.
-Permintaan basis data yang terakhir adalah:
-"$1"
-dari dalam fungsi "$2".
-Basis data menghasilkan kesalahan "$3: $4".',
+'databaseerror-text' => 'Sebuah galat kueri basis data telah terjadi.
+Hal ini mungkin mengindikasikan ada kesalahan pada perangkat lunaknya.',
+'databaseerror-textcl' => 'Sebuah galat kueri basis data telah terjadi.',
+'databaseerror-query' => 'Kueri: $1',
+'databaseerror-function' => 'Fungsi: $1',
+'databaseerror-error' => 'Kesalahan: $1',
'laggedslavemode' => 'Peringatan: Halaman mungkin tidak berisi perubahan terbaru.',
'readonly' => 'Basis data dikunci',
'enterlockreason' => 'Masukkan alasan penguncian, termasuk perkiraan kapan kunci akan dibuka',
@@ -710,6 +714,7 @@ Mungkin telah dihapus oleh orang lain.',
'cannotdelete-title' => 'Tidak dapat menghapus halaman "$1"',
'delete-hook-aborted' => 'Penghapusan dibatalkan oleh kait parser.
Tidak ada keterangan.',
+'no-null-revision' => 'Tidak dapat membuat revisi null baru untuk halaman "$1"',
'badtitle' => 'Judul tidak sah',
'badtitletext' => 'Judul halaman yang diminta tidak sah, kosong, atau judul antarbahasa atau antarwiki yang salah sambung.',
'perfcached' => 'Data berikut ini diambil dari singgahan dan mungkin bukan data mutakhir. {{PLURAL:$1||}}$1 hasil maksimal tersedia di tembolok.',
@@ -726,12 +731,15 @@ Tidak ada keterangan.',
'protectedinterface' => 'Halaman ini memuat teks antarmuka untuk perangkat lunak pada wiki ini, dan dilindungi terhadap penyalahgunaan. Untuk menambah atau mengubah terjemahan pada semua wiki, harap gunakan [//translatewiki.net/ translatewiki.net], proyek pelokalan MediaWiki.',
'editinginterface' => "'''Peringatan:''' Anda menyunting suatu halaman yang digunakan untuk menyediakan teks antarmuka untuk perangkat lunak situs ini. Perubahan teks ini akan memengaruhi tampilan pada antarmuka pengguna untuk pengguna lain di wiki ini.
Untuk menambah atau mengubahterjemahan untuk semua wiki, harap gunakan [//translatewiki.net/ translatewiki.net], proyek pelokalan MediaWiki.",
-'sqlhidden' => '(Permintaan SQL disembunyikan)',
'cascadeprotected' => 'Halaman ini telah dilindungi dari penyuntingan karena disertakan di {{PLURAL:$1|halaman|halaman-halaman}} berikut yang telah dilindungi dengan opsi "runtun":
$2',
'namespaceprotected' => "Anda tak memiliki hak akses untuk menyunting halaman di ruang nama '''$1'''.",
'customcssprotected' => 'Anda tidak memiliki izin untuk menyunting halaman CSS ini, karena berisi pengaturan pribadi pengguna lain.',
'customjsprotected' => 'Anda tidak memiliki izin untuk menyunting halaman JavaScript ini, karena berisi pengaturan pribadi pengguna lain.',
+'mycustomcssprotected' => 'Anda tidak memiliki izin untuk menyunting halaman CSS ini.',
+'mycustomjsprotected' => 'Anda tidak memiliki izin untuk menyunting halaman JavaScript ini.',
+'myprivateinfoprotected' => 'Anda tidak memiliki izin untuk menyunting informasi pribadi Anda.',
+'mypreferencesprotected' => 'Anda tidak memiliki izin untuk menyunting preferensi Anda.',
'ns-specialprotected' => 'Halaman pada ruang nama {{ns:special}} tidak dapat disunting.',
'titleprotected' => "Judul ini dilindungi dari pembuatan oleh [[User:$1|$1]].
Alasan yang diberikan adalah ''$2''.",
@@ -755,10 +763,19 @@ Ingatlah bahwa beberapa halaman mungkin masih menampilkan anda seperti masih mas
'welcomeuser' => 'Selamat datang, $1 !',
'welcomecreation-msg' => 'Akun Anda telah dibuat. Jangan lupa mengatur konfigurasi [[Special:Preferences|preferensi {{SITENAME}}]] Anda.',
'yourname' => 'Nama pengguna:',
+'userlogin-yourname' => 'Nama pengguna',
+'userlogin-yourname-ph' => 'Masukkan nama pengguna Anda',
+'createacct-another-username-ph' => 'Masukkan nama pengguna',
'yourpassword' => 'Kata sandi:',
+'userlogin-yourpassword' => 'Kata sandi',
+'userlogin-yourpassword-ph' => 'Masukkan kata sandi',
+'createacct-yourpassword-ph' => 'Masukkan kata sandi',
'yourpasswordagain' => 'Ulangi kata sandi:',
+'createacct-yourpasswordagain' => 'Konfirmasi kata sandi',
+'createacct-yourpasswordagain-ph' => 'Masukkan lagi kata sandi',
'remembermypassword' => 'Ingat kata sandi saya di komputer ini (selama $1 {{PLURAL:$1|hari|hari}})',
-'securelogin-stick-https' => 'Tetap terhubung ke HTTPS setelah masuk',
+'userlogin-remembermypassword' => 'Biarkan saya tetap masuk',
+'userlogin-signwithsecure' => 'Gunakan server aman',
'yourdomainname' => 'Domain Anda:',
'password-change-forbidden' => 'Anda tidak dapat mengubah kata sandi pada wiki ini.',
'externaldberror' => 'Telah terjadi kesalahan otentikasi basis data eksternal atau Anda tidak diizinkan melakukan kemaskini terhadap akun eksternal Anda.',
@@ -770,18 +787,44 @@ Ingatlah bahwa beberapa halaman mungkin masih menampilkan anda seperti masih mas
'logout' => 'Keluar log',
'userlogout' => 'Keluar log',
'notloggedin' => 'Belum masuk log',
+'userlogin-noaccount' => 'Belum punya akun?',
+'userlogin-joinproject' => 'Join {{SITENAME}}',
'nologin' => 'Belum mempunyai akun? $1.',
'nologinlink' => 'Daftarkan akun baru',
'createaccount' => 'Buat akun baru',
'gotaccount' => "Sudah terdaftar sebagai pengguna? '''$1'''.",
'gotaccountlink' => 'Masuk log',
'userlogin-resetlink' => 'Lupa detail info masuk Anda?',
+'userlogin-resetpassword-link' => 'Buat ulang kata sandi',
+'helplogin-url' => 'Help:Masuk log',
+'userlogin-helplink' => '[[{{MediaWiki:helplogin-url}}|Bantuan masuk log]]',
+'userlogin-loggedin' => 'Andan telah masuk log sebagai $1.
+Gunakan formulir di bawah untuk masuk log sebagai pengguna lain.',
+'userlogin-createanother' => 'Buat akun lain',
+'createacct-join' => 'Masukkan informasi Anda di bawah ini.',
+'createacct-another-join' => 'Masukkan informasi akun baru di bawah ini.',
+'createacct-emailrequired' => 'Alamat surel',
+'createacct-emailoptional' => 'Alamat surel (opsional)',
+'createacct-email-ph' => 'Masukkan alamat surel Anda',
+'createacct-another-email-ph' => 'Masukkan alamat surel',
'createaccountmail' => 'Gunakan kata sandi acak sementara dan kirimkan ke surel yang diinginkan',
+'createacct-realname' => 'Nama asli (opsional)',
'createaccountreason' => 'Alasan:',
+'createacct-reason' => 'Alasan',
+'createacct-reason-ph' => 'Mengapa Anda membuat akun lain',
+'createacct-captcha' => 'Pemeriksaan keamanan',
+'createacct-imgcaptcha-ph' => 'Masukkan teks yang Anda lihat di atas',
+'createacct-submit' => 'Buat akun Anda',
+'createacct-another-submit' => 'Buat akun lain',
+'createacct-benefit-heading' => '{{SITENAME}} dibuat oleh orang-orang seperti Anda.',
+'createacct-benefit-body1' => '{{PLURAL:$1|suntingan}}',
+'createacct-benefit-body2' => '{{PLURAL:$1|halaman}}',
+'createacct-benefit-body3' => '{{PLURAL:$1|kontributor}} terakhir',
'badretype' => 'Kata sandi yang Anda masukkan salah.',
'userexists' => 'Nama pengguna yang dimasukkan telah digunakan.
Silakan tentukan nama yang lain.',
'loginerror' => 'Kesalahan masuk log',
+'createacct-error' => 'Pembuatan akun gagal',
'createaccounterror' => 'Tidak dapat membuat akun: $1',
'nocookiesnew' => 'Akun pengguna telah dibuat, tetapi Anda belum masuk log. {{SITENAME}} menggunakan kuki untuk log pengguna. Kuki pada peramban web Anda dinonaktifkan. Silakan aktifkan dan masuk log kembali dengan nama pengguna dan kata sandi Anda.',
'nocookieslogin' => '{{SITENAME}} menggunakan kuki untuk log penggunanya. Kuki pada peramban web Anda dimatikan. Silakan aktifkan dan coba lagi.',
@@ -835,11 +878,13 @@ Harap masukkan alamat surel dalam format yang benar atau kosongkan isian tersebu
Anda dapat mengabaikan pesan ini jika akun ini dibuat karena suatu kesalahan.',
'usernamehasherror' => 'Nama pengguna tidak bisa mengandung tanda pagar',
-'login-throttled' => 'Anda telah berkali-kali mencoba masuk log.
+'login-throttled' => 'Anda sudah terlalu sering mencoba masuk log.
Silakan menunggu sebelum mencoba lagi.',
'login-abort-generic' => 'Proses masuk Anda tidak berhasil - Dibatalkan',
'loginlanguagelabel' => 'Bahasa: $1',
'suspicious-userlogout' => 'Permintaan Anda untuk keluar log ditolak karena tampaknya dikirim oleh penjelajah yang rusak atau proksi penyinggah.',
+'createacct-another-realname-tip' => 'Nama asli bersifat opsional.
+Jika Anda memberikannya, nama asli Anda akan digunakan untuk memberi pengenalan atas hasil kerja Anda.',
# Email sending
'php-mail-error-unknown' => 'Kesalahan yang tidak dikenal dalam fungsi mail() PHP',
@@ -855,8 +900,7 @@ Silakan menunggu sebelum mencoba lagi.',
'newpassword' => 'Kata sandi baru:',
'retypenew' => 'Ketik ulang kata sandi baru:',
'resetpass_submit' => 'Atur kata sandi dan masuk log',
-'resetpass_success' => 'Kata sandi Anda telah berhasil diubah!
-Sekarang memproses masuk log Anda...',
+'changepassword-success' => 'Kata sandi Anda telah berhasil diubah!',
'resetpass_forbidden' => 'Kata sandi tidak dapat diubah',
'resetpass-no-info' => 'Anda harus masuk log untuk mengakses halaman ini secara langsung.',
'resetpass-submit-loggedin' => 'Ganti kata sandi',
@@ -868,10 +912,11 @@ Anda mungkin telah berhasil mengganti kata sandi Anda atau telah meminta kata sa
# Special:PasswordReset
'passwordreset' => 'Setel ulang kata sandi',
-'passwordreset-text' => 'Lengkapi formulir ini untuk menyetel ulang kata sandi.',
+'passwordreset-text-one' => 'Lengkapi formulir ini untuk menyetel ulang kata sandi.',
+'passwordreset-text-many' => '{{PLURAL:$1|Isi salah satu kotak di bawah ini untuk menyetel ulang kata sandi Anda.}}',
'passwordreset-legend' => 'Setel ulang kata sandi',
'passwordreset-disabled' => 'Penyetelan ulang sandi telah dimatikan di wiki ini.',
-'passwordreset-pretext' => '{{PLURAL:$1||Masukkan salah satu data di bawah ini}}',
+'passwordreset-emaildisabled' => 'Fitur surel telah dinonaktifkan pada wiki ini.',
'passwordreset-username' => 'Nama pengguna:',
'passwordreset-domain' => 'Domain:',
'passwordreset-capture' => 'Lihat surel yang dihasilkan?',
@@ -901,7 +946,7 @@ ingin mengubahnya, Anda dapat mengabaikan pesan ini dan terus menggunakan sandi
Sandi sementara: $2',
'passwordreset-emailsent' => 'Surel setel ulang kata sandi telah dikirimkan.',
'passwordreset-emailsent-capture' => 'Surel setel ulang kata sandi telah dikirim, yang ditampilkan di bawah.',
-'passwordreset-emailerror-capture' => 'Surel pengingat, yang ditampilkan di bawah, telah dihasilkan, tetapi gagal mengirimkannya ke pengguna: $1',
+'passwordreset-emailerror-capture' => 'Surel setel ulang kata sandi telah dibuat, yang ditampilkan di bawah, namun pengiriman pada {{GENDER:$2|pengguna}} gagal: $1',
# Special:ChangeEmail
'changeemail' => 'Ubah alamat surel',
@@ -915,6 +960,19 @@ Sandi sementara: $2',
'changeemail-submit' => 'Ubah surel',
'changeemail-cancel' => 'Batalkan',
+# Special:ResetTokens
+'resettokens' => 'Reset token',
+'resettokens-text' => 'Anda dapat me-reset Token yang memungkinkan akses ke data pribadi tertentu yang terkait dengan akun Anda di sini.
+
+Anda harus melakukannya jika Anda secara tidak sengaja berbagi dengan seseorang atau jika akun Anda telah disusupi.',
+'resettokens-no-tokens' => 'Tidak ada token untuk di-reset.',
+'resettokens-legend' => 'Reset token',
+'resettokens-tokens' => 'Token:',
+'resettokens-token-label' => '$1 (nilai saat ini: $2)',
+'resettokens-watchlist-token' => 'Token untuk sindikasi web (Atom/RSS) dari [[Special:Watchlist|perubahan di daftar pantauan Anda]]',
+'resettokens-done' => 'Reset token.',
+'resettokens-resetbutton' => 'Reset token yang dipilih',
+
# Edit page toolbar
'bold_sample' => 'Teks ini akan dicetak tebal',
'bold_tip' => 'Teks tebal',
@@ -1110,12 +1168,15 @@ tanpa ada keterangan.',
Halaman kemungkinan telah dihapus.',
'edit-conflict' => 'Konflik penyuntingan.',
'edit-no-change' => 'Suntingan diabaikan, karena Anda tidak melakukan perubahan atas teks.',
+'postedit-confirmation' => 'Suntingan Anda tersimpan.',
'edit-already-exists' => 'Tidak dapat membuat halaman baru
karena telah ada.',
'defaultmessagetext' => 'Teks baku',
'content-failed-to-parse' => 'Gagal menjabarkan konten $2 untuk model $1: $3',
'invalid-content-data' => 'Data konten tidak sah',
'content-not-allowed-here' => 'Konten "$1" tidak diizinkan di halaman [[$2]]',
+'editwarning-warning' => 'Meninggalkan halaman ini dapat menyebabkan semua perubahan yang belum tersimpan hilang.
+Jika Anda telah masuk log, Anda dapat mematikan peringatan ini lewat bagian "Penyuntingan" pada halaman preferensi Anda.',
# Content models
'content-model-wikitext' => 'teks wiki',
@@ -1149,6 +1210,7 @@ Beberapa templat akan diabaikan.',
'undo-failure' => 'Suntingan ini tidak dapat dibalikkan karena konflik penyuntingan antara.',
'undo-norev' => 'Suntingan ini tidak dapat dibalikkan karena halaman tidak ditemukan atau telah dihapuskan.',
'undo-summary' => 'Membalikkan revisi $1 oleh [[Special:Contributions/$2|$2]] ([[User talk:$2|bicara]])',
+'undo-summary-username-hidden' => 'Batalkan revisi $1 oleh seorang pengguna tersembunyi',
# Account creation failure
'cantcreateaccounttitle' => 'Akun tak dapat dibuat',
@@ -1327,6 +1389,7 @@ Pastikan bahwa perubahan ini tetap mempertahankan kontinuitas versi terdahulu ha
'compareselectedversions' => 'Bandingkan versi terpilih',
'showhideselectedversions' => 'Tampilkan/sembunyikan versi terpilih',
'editundo' => 'balikkan',
+'diff-empty' => '(Tidak ada perbedaan)',
'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)',
'difference-missing-revision' => '{{PLURAL:$2|Satu revisi|$2 revisi}} dari perbedaan ini ($1) {{PLURAL:$2|tidak|tidak}} ditemukan.
@@ -1354,7 +1417,6 @@ Rinciannya dapat ditemukan di [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGE
'searchmenu-legend' => 'Opsi pencarian',
'searchmenu-exists' => "* Halaman '''[[$1]]'''",
'searchmenu-new' => "'''Buat halaman \"[[:\$1]]\" di wiki ini!'''",
-'searchhelp-url' => 'Help:Isi',
'searchmenu-prefix' => '[[Special:PrefixIndex/$1|Lihat daftar halaman dengan awalan ini]]',
'searchprofile-articles' => 'Halaman isi',
'searchprofile-project' => 'Halaman Bantuan dan Proyek',
@@ -1397,15 +1459,7 @@ Rinciannya dapat ditemukan di [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGE
'searchdisabled' => 'Pencarian {{SITENAME}} sementara dimatikan.
Anda dapat mencari melalui Google untuk sementara waktu.
Perlu diingat bahwa indeks Google untuk konten {{SITENAME}} mungkin belum mencakup perubahan-perubahan terakhir.',
-
-# Quickbar
-'qbsettings' => 'Pengaturan bar pintas',
-'qbsettings-none' => 'Tidak ada',
-'qbsettings-fixedleft' => 'Tetap sebelah kiri',
-'qbsettings-fixedright' => 'Tetap sebelah kanan',
-'qbsettings-floatingleft' => 'Mengambang sebelah kiri',
-'qbsettings-floatingright' => 'Mengambang sebelah kanan',
-'qbsettings-directionality' => 'Tetap, tergantung pada bentuk skrip dari bahasa Anda',
+'search-error' => 'Kesalahan terjadi saat mencari: $1',
# Preferences page
'preferences' => 'Preferensi',
@@ -1439,7 +1493,6 @@ Perlu diingat bahwa indeks Google untuk konten {{SITENAME}} mungkin belum mencak
'resetprefs' => 'Batalkan perubahan',
'restoreprefs' => 'Kembalikan semua setelan bawaan',
'prefs-editing' => 'Penyuntingan',
-'prefs-edit-boxsize' => 'Ukuran kotak penyuntingan.',
'rows' => 'Baris:',
'columns' => 'Kolom:',
'searchresultshead' => 'Cari',
@@ -1450,8 +1503,9 @@ Perlu diingat bahwa indeks Google untuk konten {{SITENAME}} mungkin belum mencak
'recentchangesdays-max' => '(maksimum $1 {{PLURAL:$1|hari|hari}})',
'recentchangescount' => 'Standar jumlah suntingan yang ditampilkan:',
'prefs-help-recentchangescount' => 'Opsi ini berlaku untuk perubahan terbaru, versi terdahulu halaman, dan log.',
-'prefs-help-watchlist-token' => 'Mengisi kotak ini dengan kunci rahasia (PIN) akan menghasilkan sindikasi RSS untuk daftar pantauan Anda. Siapa pun yang mengetahui kunci ini dapat membaca daftar pantauan Anda, jadi pilihlah nilainya dengan hati-hati
-Berikut ini adalah nilai acak yang dapat Anda gunakan: $1',
+'prefs-help-watchlist-token2' => 'Ini adalah kunci rahasia (token) ke web feed dari daftar pantauan Anda.
+Siapa saja yang tahu akan dapat melihat daftar pantauan Anda, jadi jangan dibagikan.
+[[Special:ResetTokens|Klik di sini jika Anda perlu menyetel ulang]].',
'savedprefs' => 'Preferensi Anda telah disimpan',
'timezonelegend' => 'Zona waktu:',
'localtime' => 'Waktu setempat:',
@@ -1482,7 +1536,6 @@ Berikut ini adalah nilai acak yang dapat Anda gunakan: $1',
'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:',
-'prefs-textboxsize' => 'Ukuran kotak suntingan',
'youremail' => 'Surel:',
'username' => '{{GENDER:$1|Nama pengguna}}:',
'uid' => 'ID {{GENDER:$1|pengguna}}:',
@@ -1517,6 +1570,8 @@ Jika Anda memberikannya, nama asli Anda akan digunakan untuk memberi pengenalan
'prefs-dateformat' => 'Format tanggal',
'prefs-timeoffset' => 'Format waktu',
'prefs-advancedediting' => 'Pilihan umum',
+'prefs-editor' => 'Penyunting',
+'prefs-preview' => 'Pratayang',
'prefs-advancedrc' => 'Opsi lanjutan',
'prefs-advancedrendering' => 'Opsi lanjutan',
'prefs-advancedsearchoptions' => 'Opsi lanjutan',
@@ -1524,7 +1579,9 @@ Jika Anda memberikannya, nama asli Anda akan digunakan untuk memberi pengenalan
'prefs-displayrc' => 'Pilihan tampilan',
'prefs-displaysearchoptions' => 'Pilihan tampilan',
'prefs-displaywatchlist' => 'Pilihan tampilan',
+'prefs-tokenwatchlist' => 'Tanda',
'prefs-diffs' => 'Beda',
+'prefs-help-prefershttps' => 'Preferensi ini akan diaktifkan kali berikutnya Anda masuk log.',
# User preference: email validation using jQuery
'email-address-validity-valid' => 'Alamat surel tampaknya sah',
@@ -1553,6 +1610,8 @@ Jika Anda memberikannya, nama asli Anda akan digunakan untuk memberi pengenalan
'userrights-changeable-col' => 'Kelompok yang dapat Anda ubah',
'userrights-unchangeable-col' => 'Kelompok yang tidak dapat Anda ubah',
'userrights-irreversible-marker' => '$1*',
+'userrights-conflict' => 'Konflik perubahan hak pengguna! Silakan tinjau ulang dan konfirmasi perubahan anda.',
+'userrights-removed-self' => 'Anda berhasil mencabut hak-hak Anda. Anda tidak bisa lagi mengakses halaman ini.',
# Groups
'group' => 'Kelompok:',
@@ -1618,11 +1677,19 @@ Jika Anda memberikannya, nama asli Anda akan digunakan untuk memberi pengenalan
'right-proxyunbannable' => 'Mengabaikan pemblokiran otomatis atas proksi',
'right-unblockself' => 'Lepaskan blokir sendiri',
'right-protect' => 'Ubah tingkat pelindungan dan sunting halaman yang dilindungi beruntun',
-'right-editprotected' => 'Menyunting halaman yang dilindungi (tanpa pelindungan runtun)',
+'right-editprotected' => 'Sunting halaman yang dilindungi sebagai "{{int:protect-level-sysop}}"',
+'right-editsemiprotected' => 'Sunting halaman yang dilindungi sebagai "{{int:protect-level-autoconfirmed}}"',
'right-editinterface' => 'Menyunting antarmuka pengguna',
'right-editusercssjs' => 'Menyunting arsip CSS dan JS pengguna lain',
'right-editusercss' => 'Menyunting berkas CSS pengguna lain',
'right-edituserjs' => 'Menyunting berkas JS pengguna lain',
+'right-editmyusercss' => 'Sunting berkas CSS pengguna Anda',
+'right-editmyuserjs' => 'Sunting berkas JavaScript pengguna Anda',
+'right-viewmywatchlist' => 'Lihat daftar pantau Anda',
+'right-editmywatchlist' => 'Sunting daftar pantau Anda. Masih ada cara menambahkan halaman tanpa harus memiliki hak ini.',
+'right-viewmyprivateinfo' => 'Lihat data pribadi Anda (alamat surel, nama asli, dll.)',
+'right-editmyprivateinfo' => 'Sunting data pribadi Anda (alamat surel, nama asli, dll.)',
+'right-editmyoptions' => 'Sunting preferensi Anda',
'right-rollback' => 'Mengembalikan dengan cepat suntingan-suntingan pengguna terakhir yang menyunting halaman tertentu',
'right-markbotedits' => 'Menandai pengembalian revisi sebagai suntingan bot',
'right-noratelimit' => 'Tidak dipengaruhi oleh pembatasan jumlah suntingan',
@@ -1684,13 +1751,20 @@ Jika Anda memberikannya, nama asli Anda akan digunakan untuk memberi pengenalan
'action-userrights-interwiki' => 'menyunting hak akses dari pengguna di wiki lain',
'action-siteadmin' => 'mengunci atau membuka kunci basis data',
'action-sendemail' => 'kirim surel',
+'action-editmywatchlist' => 'sunting daftar pantau Anda',
+'action-viewmywatchlist' => 'lihat daftar pantau Anda',
+'action-viewmyprivateinfo' => 'lihat informasi pribadi Anda',
+'action-editmyprivateinfo' => 'sunting informasi pribadi Anda',
# Recent changes
'nchanges' => '$1 {{PLURAL:$1|perubahan|perubahan}}',
+'enhancedrc-since-last-visit' => '$1 {{PLURAL:$1|sejak kunjungan terakhir}}',
+'enhancedrc-history' => 'riwayat',
'recentchanges' => 'Perubahan terbaru',
'recentchanges-legend' => 'Opsi perubahan terbaru',
'recentchanges-summary' => "Temukan perubahan terbaru dalam wiki di halaman ini.<br />
;Keterangan:(<span style=\"color:blue;\">beda</span>) perubahan, (<span style=\"color:blue;\">versi</span>) sejarah revisi, '''B''' halaman baru, '''b''' suntingan bot, '''k''' suntingan kecil, <span class=\"unpatrolled\">!</span> perubahan belum dipatroli,<br /><span style=\"color:green;\">'''(+ ''bita'')'''</span> isi konten bertambah, <span style=\"color:red;\">(- ''bita'')</span> isi konten berkurang, (↠Ringkasan otomatis), (→ <span style=\"color:grey;\">Suntingan bagian</span>)",
+'recentchanges-noresult' => 'Tidak ada perubahan dalam rentang waktu ini yang cocok dengan kriteria.',
'recentchanges-feed-description' => 'Temukan perubahan terbaru dalam wiki di umpan ini.',
'recentchanges-label-newpage' => 'Suntingan ini membuat halaman baru',
'recentchanges-label-minor' => 'Ini adalah suntingan kecil',
@@ -1729,7 +1803,6 @@ Jika Anda memberikannya, nama asli Anda akan digunakan untuk memberi pengenalan
'recentchangeslinked-feed' => 'Perubahan terkait',
'recentchangeslinked-toolbox' => 'Perubahan terkait',
'recentchangeslinked-title' => 'Perubahan yang terkait dengan "$1"',
-'recentchangeslinked-noresult' => 'Tidak terjadi perubahan pada halaman-halaman terkait selama periode yang telah ditentukan.',
'recentchangeslinked-summary' => "Halaman istimewa ini memberikan daftar perubahan terakhir pada halaman-halaman terkait. Halaman yang Anda pantau ditandai dengan '''cetak tebal'''.",
'recentchangeslinked-page' => 'Nama halaman:',
'recentchangeslinked-to' => 'Perlihatkan perubahan dari halaman-halaman yang terhubung dengan halaman yang disajikan',
@@ -1740,7 +1813,7 @@ Jika Anda memberikannya, nama asli Anda akan digunakan untuk memberi pengenalan
'reuploaddesc' => 'Kembali ke formulir pemuatan',
'upload-tryagain' => 'Kirim perubahan keterangan berkas',
'uploadnologin' => 'Belum masuk log',
-'uploadnologintext' => 'Anda harus [[Special:UserLogin|masuk log]] untuk dapat memuatkan berkas.',
+'uploadnologintext' => 'Anda harus $1 untuk dapat mengunggah berkas.',
'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',
@@ -1963,7 +2036,6 @@ Untuk pilihan keamanan, img_auth.php dinonaktifkan.',
'http-read-error' => 'Kesalahan pembacaan HTTP',
'http-timed-out' => 'Permintaan HTTP lewat tenggat.',
'http-curl-error' => 'Kesalahan saat mengambil URL: $1',
-'http-host-unreachable' => 'Tidak dapat mencapai URL.',
'http-bad-status' => 'Ada masalah saat permintaan halaman HTTP: $1 $2',
# Some likely curl errors. More could be added from <http://curl.haxx.se/libcurl/c/libcurl-errors.html>
@@ -1992,6 +2064,10 @@ Ketika disaring oleh pengguna, hanya versi berkas terbaru dari berkas yang diung
'listfiles_size' => 'Ukuran',
'listfiles_description' => 'Deskripsi',
'listfiles_count' => 'Versi',
+'listfiles-show-all' => 'Termasuk versi lama gambar',
+'listfiles-latestversion' => 'Versi terkini',
+'listfiles-latestversion-yes' => 'Ya',
+'listfiles-latestversion-no' => 'Tidak',
# File description page
'file-anchor-link' => 'Berkas',
@@ -2089,6 +2165,13 @@ Cek dahulu pranala lain ke templat tersebut sebelum menghapusnya.',
'randompage' => 'Halaman sembarang',
'randompage-nopages' => 'Tidak ada halaman pada {{PLURAL:$2||}}ruang nama berikut: $1.',
+# Random page in category
+'randomincategory' => 'Halaman acak dalam kategori',
+'randomincategory-invalidcategory' => '"$1" bukanlah nama kategori yang berlaku.',
+'randomincategory-nopages' => 'Tidak ada halaman dalam [[:Category:$1]].',
+'randomincategory-selectcategory' => 'Dapatkan halaman acak dari kategori: $1 $2.',
+'randomincategory-selectcategory-submit' => 'Lanjut',
+
# Random redirect
'randomredirect' => 'Pengalihan sembarang',
'randomredirect-nopages' => 'Tak terdapat pengalihan pada ruang nama "$1".',
@@ -2114,17 +2197,13 @@ Cek dahulu pranala lain ke templat tersebut sebelum menghapusnya.',
'statistics-users-active-desc' => 'Pengguna yang telah melakukan suatu aktivitas dalam {{PLURAL:$1|sehari|$1 hari}} terakhir.',
'statistics-mostpopular' => 'Halaman yang paling banyak ditampilkan',
-'disambiguations' => 'Halaman yang terhubung ke halaman disambiguasi',
-'disambiguationspage' => 'Template:Disambig',
-'disambiguations-text' => "Halaman-halaman berikut memiliki pranala ke suatu '''halaman disambiguasi'''.
-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]].",
-
'pageswithprop' => 'Halaman dengan halaman properti',
'pageswithprop-legend' => 'Halaman dengan halaman properti',
'pageswithprop-text' => 'Halaman ini berisi daftar halaman yang menggunakan properti halaman tertentu.',
'pageswithprop-prop' => 'Nama properti:',
'pageswithprop-submit' => 'Lanjut',
+'pageswithprop-prophidden-long' => 'nilai properti teks panjang tersembunyi ($1 kilobita)',
+'pageswithprop-prophidden-binary' => 'nilai properti biner tersembunyi ($1 kilobita)',
'doubleredirects' => 'Pengalihan ganda',
'doubleredirectstext' => 'Halaman ini memuat daftar halaman yang dialihkan ke halaman pengalihan yang lain.
@@ -2182,6 +2261,7 @@ Nama yang telah <del>dicoret</del> berarti telah dibetulkan.',
'mostrevisions' => 'Halaman dengan perubahan terbanyak',
'prefixindex' => 'Semua halaman dengan awalan',
'prefixindex-namespace' => 'Semua halaman dengan awalan (ruang nama $1)',
+'prefixindex-strip' => 'Strip awalan dalam daftar',
'shortpages' => 'Halaman pendek',
'longpages' => 'Halaman panjang',
'deadendpages' => 'Halaman buntu',
@@ -2197,6 +2277,7 @@ Nama yang telah <del>dicoret</del> berarti telah dibetulkan.',
'listusers' => 'Daftar pengguna',
'listusers-editsonly' => 'Tampilkan hanya pengguna yang memiliki kontribusi',
'listusers-creationsort' => 'Urutkan menurut tanggal pendaftaran',
+'listusers-desc' => 'Urutkan menurun',
'usereditcount' => '$1 {{PLURAL:$1|suntingan|suntingan}}',
'usercreated' => '{{GENDER:$3|Dibuat}} pada $1 pukul $2',
'newpages' => 'Halaman baru',
@@ -2375,10 +2456,9 @@ Perubahan-perubahan berikutnya pada halaman tersebut dan halaman pembicaraan ter
'unwatchthispage' => 'Batal pantau halaman ini',
'notanarticle' => 'Bukan sebuah halaman isi',
'notvisiblerev' => 'Revisi telah dihapus',
-'watchnochange' => 'Tak ada halaman pantauan Anda yang telah berubah dalam jangka waktu yang dipilih.',
'watchlist-details' => 'Terdapat {{PLURAL:$1|$1 halaman|$1 halaman}} di daftar pantauan Anda, tidak termasuk halaman pembicaraan.',
-'wlheader-enotif' => '* Notifikasi surel diaktifkan.',
-'wlheader-showupdated' => "* Halaman-halaman yang telah berubah sejak kunjungan terakhir Anda ditampilkan dengan '''huruf tebal'''",
+'wlheader-enotif' => 'Notifikasi surel diaktifkan.',
+'wlheader-showupdated' => "Halaman-halaman yang telah berubah sejak kunjungan terakhir Anda ditampilkan dengan '''huruf tebal'''.",
'watchmethod-recent' => 'periksa daftar perubahan terbaru terhadap halaman yang dipantau',
'watchmethod-list' => 'periksa halaman yang dipantau terhadap perubahan terbaru',
'watchlistcontains' => 'Daftar pantauan Anda berisi $1 {{PLURAL:$1|halaman|halaman}}.',
@@ -2620,7 +2700,7 @@ $1',
'contributions' => 'Kontribusi {{GENDER:$1|pengguna}}',
'contributions-title' => 'Kontribusi pengguna untuk $1',
'mycontris' => 'Kontribusi',
-'contribsub2' => 'Untuk $1 ($2)',
+'contribsub2' => 'Untuk {{GENDER:$3|$1}} ($2)',
'nocontribs' => 'Tidak ada perubahan yang sesuai dengan kriteria tersebut.',
'uctop' => '(saat ini)',
'month' => 'Sejak bulan (dan sebelumnya):',
@@ -2776,14 +2856,12 @@ Lihat [[Special:BlockList|daftar pemblokiran]] untuk semua pengguna yang saat in
'ipb_blocked_as_range' => 'Kesalahan: IP $1 tidak diblok secara langsung dan tidak dapat dilepaskan. IP $1 diblok sebagai bagian dari pemblokiran kelompok IP $2, yang dapat dilepaskan.',
'ip_range_invalid' => 'Blok IP tidak sah.',
'ip_range_toolarge' => 'Rentang blok lebih besar dari /$1 tidak diperbolehkan.',
-'blockme' => 'Blokir saya',
'proxyblocker' => 'Pemblokir proxy',
-'proxyblocker-disabled' => 'Fitur ini sedang tidak diakfifkan.',
'proxyblockreason' => 'Alamat IP Anda telah diblokir karena alamat IP Anda adalah proxy terbuka. Silakan hubungi penyedia jasa internet Anda atau dukungan teknis dan beritahukan mereka masalah keamanan serius ini.',
-'proxyblocksuccess' => 'Selesai.',
'sorbs' => 'DNSBL',
'sorbsreason' => 'Alamat IP anda terdaftar sebagai proxy terbuka di DNSBL.',
'sorbs_create_account_reason' => 'Alamat IP anda terdaftar sebagai proxy terbuka di DNSBL. Anda tidak dapat membuat akun.',
+'xffblockreason' => 'Sebuah alamat IP di kepala X-Forwarded-For, entah milik Anda atau server proxy yang Anda pakai, telah diblokir. Alasan pemblokirannya adalah: $1',
'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',
@@ -2944,6 +3022,8 @@ Silakan kunjungi [//www.mediawiki.org/wiki/Localisation Pelokalan MediaWiki] dan
'thumbnail-more' => 'Perbesar',
'filemissing' => 'Berkas tak ditemukan',
'thumbnail_error' => 'Gagal membuat miniatur: $1',
+'thumbnail_error_remote' => 'Pesan kesalahan dari $1:
+$2',
'djvu_page_error' => 'Halaman DjVu di luar rentang',
'djvu_no_xml' => 'XML untuk berkas DjVu tak dapat diperoleh',
'thumbnail-temp-create' => 'Tidak dapat membuat berkas kecil temporer',
@@ -3092,17 +3172,11 @@ Simpan ke komputer Anda dan unggah ke sini.',
# Stylesheets
'common.css' => '/* CSS yang ada di sini akan diterapkan pada semua kulit. */',
-'standard.css' => '/* CSS yang ada di sini akan diterapkan pada kulit Standar. */',
-'nostalgia.css' => '/* CSS yang ada di sini akan diterapkan pada kulit Nostalgia. */',
'cologneblue.css' => '/* CSS yang ada di sini akan diterapkan pada kulit Cologne Blue. */',
'monobook.css' => '/* CSS yang ada di sini akan diterapkan pada kulit Monobook. */',
-'myskin.css' => '/* CSS yang ada di sini akan diterapkan pada kulit MySkin. */',
-'chick.css' => '/* CSS yang ada di sini akan diterapkan pada kulit Chick. */',
-'simple.css' => '/* CSS yang ada di sini akan diterapkan pada kulit Sederhana. */',
'modern.css' => '/* CSS yang ada di sini akan diterapkan pada kulit Modern. */',
'vector.css' => '/* CSS nan ado di siko diterapkan pado kulik Vektor. */',
'print.css' => '/* CSS yang ada di sini akan diterapkan pada tampilan cetak. */',
-'handheld.css' => '/* CSS yang ada di sini akan diterapkan untuk tampilan piranti genggam yang dikonfigurasi di $wgHandheldStyle. */',
'noscript.css' => '/* CSS di sini akan mempengaruhi pengguna dengan skrip Java non-aktif */',
'group-autoconfirmed.css' => '/* CSS di sini hanya mempengaruhi pengguna terkonfirmasi otomatis */',
'group-bot.css' => '/* CSS di sini hanya mempengaruhi bot */',
@@ -3111,13 +3185,8 @@ Simpan ke komputer Anda dan unggah ke sini.',
# Scripts
'common.js' => '/* JavaScript yang ada di sini akan diterapkan untuk semua kulit. */',
-'standard.js' => '/* Semua JavaScript di sini akan dimuatkan untuk para pengguna yang menggunakan kulit Standard */',
-'nostalgia.js' => '/* Semua JavaScript di sini akan dimuatkan untuk para pengguna yang menggunakan kulit Nostalgia */',
'cologneblue.js' => '/* Semua JavaScript di sini akan dimuatkan untuk para pengguna yang menggunakan kulit Cologne Blue */',
'monobook.js' => '/* Semua JavaScript di sini akan dimuatkan untuk para pengguna yang menggunakan kulit MonoBook */',
-'myskin.js' => '/* Semua JavaScript di sini akan dimuatkan untuk para pengguna yang menggunakan kulit MySkin */',
-'chick.js' => '/* Semua JavaScript di sini akan dimuatkan untuk para pengguna yang menggunakan kulit Chick */',
-'simple.js' => '/* Semua JavaScript di sini akan dimuatkan untuk para pengguna yang menggunakan kulit Simple */',
'modern.js' => '/* Semua JavaScript di sini akan dimuatkan untuk para pengguna yang menggunakan kulit Modern */',
'vector.js' => '/* Semua JavaScript di sini akan dimuatkan untuk para pengguna yang menggunakan kulit Vector */',
'group-autoconfirmed.js' => '/* Semua JavaScript di sini hanya dimuatkan untuk pengguna terkonfirmasi otomatis */',
@@ -3198,13 +3267,8 @@ Ini mungkin disebabkan oleh pranala ke situs luar yang termasuk dalam daftar hit
'pageinfo-category-files' => 'Jumlah berkas',
# Skin names
-'skinname-standard' => 'Klasik',
-'skinname-nostalgia' => 'Nostalgia',
'skinname-cologneblue' => 'Biru Köln',
'skinname-monobook' => 'MonoBook',
-'skinname-myskin' => 'MySkin',
-'skinname-chick' => 'Chick',
-'skinname-simple' => 'Sederhana',
'skinname-modern' => 'Modern',
'skinname-vector' => 'Vektor',
@@ -3289,11 +3353,25 @@ Jika dijalankan, sistem Anda akan berisiko terserang.",
'minutes' => '{{PLURAL:$1|$1 menit|$1 menit}}',
'hours' => '{{PLURAL:$1|$1 jam|$1 jam}}',
'days' => '{{PLURAL:$1|$1 hari|$1 hari}}',
+'weeks' => '{{PLURAL:$1|$1 minggu|$1 minggu}}',
'months' => '{{PLURAL:$1|$1 bulan|$1 bulan}}',
'years' => '{{PLURAL:$1|$1 tahun|$1 tahun}}',
'ago' => '$1 yang lalu',
'just-now' => 'baru saja',
+# Human-readable timestamps
+'hours-ago' => '$1 {{PLURAL:$1|jam}} yang lalu',
+'minutes-ago' => '$1 {{PLURAL:$1|menit}} yang lalu',
+'seconds-ago' => '$1 {{PLURAL:$1|detik}} yang lalu',
+'monday-at' => 'Senin pukul $1',
+'tuesday-at' => 'Selasa pukul $1',
+'wednesday-at' => 'Rabu pukul $1',
+'thursday-at' => 'Kamis pukul $1',
+'friday-at' => 'Jumat pukul $1',
+'saturday-at' => 'Sabtu pukul $1',
+'sunday-at' => 'Minggu pukul $1',
+'yesterday-at' => 'Kemarin pukul $1',
+
# Bad image list
'bad_image_list' => 'Formatnya sebagai berikut:
@@ -3353,7 +3431,7 @@ Data lain akan disembunyikan secara bawaan.
'metadata-langitem' => "'''$2:''' $1",
'metadata-langitem-default' => '$1',
-# EXIF tags
+# Exif tags
'exif-imagewidth' => 'Lebar',
'exif-imagelength' => 'Tinggi',
'exif-bitspersample' => 'Bit per komponen',
@@ -3546,7 +3624,7 @@ $4, $5 - $6, $7
$8',
'exif-subjectnewscode-value' => '$2 ($1)',
-# EXIF attributes
+# Exif attributes
'exif-compression-1' => 'Tak terkompresi',
'exif-compression-2' => 'CCITT Group 3 1-Dimensional Modified Huffman RLE',
'exif-compression-3' => 'CCITT Group 3 fax encoding',
@@ -3888,7 +3966,6 @@ Silakan konfirmasi jika Anda ingin membuat ulang halaman ini.",
'semicolon-separator' => ';&#32;',
'comma-separator' => ',&#32;',
'colon-separator' => ':&#32;',
-'autocomment-prefix' => '-&#32;',
'pipe-separator' => '&#32;|&#32;',
'word-separator' => '&#32;',
'ellipsis' => '...',
@@ -4016,7 +4093,6 @@ Anda juga dapat [[Special:EditWatchlist|menggunakan penyunting standar Anda]].',
'version-other' => 'Lain-lain',
'version-mediahandlers' => 'Penanganan media',
'version-hooks' => 'Kait',
-'version-extension-functions' => 'Fungsi ekstensi',
'version-parser-extensiontags' => 'Tag ekstensi parser',
'version-parser-function-hooks' => 'Kait fungsi parser',
'version-hook-name' => 'Nama kait',
@@ -4026,6 +4102,7 @@ Anda juga dapat [[Special:EditWatchlist|menggunakan penyunting standar Anda]].',
'version-license' => 'Lisensi',
'version-poweredby-credits' => "Wiki ini didukung oleh '''[//www.mediawiki.org/ MediaWiki]''', hak cipta © 2001-$1 $2.",
'version-poweredby-others' => 'lainnya',
+'version-poweredby-translators' => 'penerjemah translatewiki.net',
'version-credits-summary' => 'Kami ingin mengakui orang-orang berikut atas kontribusinya terhadap [[Special:Version|MediaWiki]].',
'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.
@@ -4041,12 +4118,17 @@ Anda seharusnya telah menerima [{{SERVER}}{{SCRIPTPATH}}/COPYING salinan Lisensi
'version-entrypoints-articlepath' => '[https://www.mediawiki.org/wiki/Manual:$wgArticlePath Artikel path]',
'version-entrypoints-scriptpath' => '[https://www.mediawiki.org/wiki/Manual:$wgScriptPath Skrip path]',
-# Special:FilePath
-'filepath' => 'Lokasi berkas',
-'filepath-page' => 'Berkas:',
-'filepath-submit' => 'Cari',
-'filepath-summary' => 'Halaman istimewa ini menampilkan jalur lengkap untuk suatu berkas.
-Gambar ditampilkan dalam resolusi penuh dan tipe lain berkas akan dibuka langsung dengan program terkaitnya.',
+# Special:Redirect
+'redirect' => 'Pengalihan oleh berkas, pengguna atau ID revisi',
+'redirect-legend' => 'Pengalihan ke sebuah berkas atau halaman',
+'redirect-summary' => 'Halaman istimewa ini beralih ke berkas (sesuai nama berkasnya), halaman (sesuai ID revisinya), atau halaman pengguna (sesuai ID numerik penggunanya).',
+'redirect-submit' => 'Lanjut',
+'redirect-lookup' => 'Pencarian:',
+'redirect-value' => 'Nilai:',
+'redirect-user' => 'ID pengguna',
+'redirect-revision' => 'Revisi halaman',
+'redirect-file' => 'Nama berkas',
+'redirect-not-exists' => 'Nilai tidak ditemukan',
# Special:FileDuplicateSearch
'fileduplicatesearch' => 'Pencarian berkas duplikat',
@@ -4095,12 +4177,16 @@ Gambar ditampilkan dalam resolusi penuh dan tipe lain berkas akan dibuka langsun
'tags' => 'Tag perubahan yang valid',
'tag-filter' => 'Filter [[Special:Tags|tag]]:',
'tag-filter-submit' => 'Penyaring',
+'tag-list-wrapper' => '([[Special:Tags|{{PLURAL:$1|Tag}}]]: $2)',
'tags-title' => 'Tanda',
'tags-intro' => 'Halaman ini berisi daftar tag yang dapat ditandai oleh perangkat lunak terhadap suatu suntingan berikut artinya.',
'tags-tag' => 'Nama tag',
'tags-display-header' => 'Tampilan di daftar perubahan',
'tags-description-header' => 'Deskripsi lengkap atau makna',
+'tags-active-header' => 'Aktif?',
'tags-hitcount-header' => 'Perubahan bertag',
+'tags-active-yes' => 'Ya',
+'tags-active-no' => 'Tidak',
'tags-edit' => 'sunting',
'tags-hitcount' => '$1 {{PLURAL:$1|perubahan|perubahan}}',
@@ -4121,6 +4207,7 @@ Gambar ditampilkan dalam resolusi penuh dan tipe lain berkas akan dibuka langsun
'dberr-problems' => 'Maaf! Situs ini mengalami masalah teknis.',
'dberr-again' => 'Cobalah menunggu beberapa menit dan muat ulang.',
'dberr-info' => '(Tak dapat tersambung dengan server basis data: $1)',
+'dberr-info-hidden' => '(Tidak dapat menghubungi peladen basis data)',
'dberr-usegoogle' => 'Anda dapat mencoba pencarian melalui Google untuk sementara waktu.',
'dberr-outofdate' => 'Harap diperhatikan bahwa indeks mereka terhadap isi kami mungkin sudah kedaluwarsa.',
'dberr-cachederror' => 'Berikut adalah salinan tersimpan halaman yang diminta, dan mungkin bukan yang terbaru.',
@@ -4136,6 +4223,9 @@ Gambar ditampilkan dalam resolusi penuh dan tipe lain berkas akan dibuka langsun
'htmlform-submit' => 'Kirim',
'htmlform-reset' => 'Balikkan perubahan',
'htmlform-selectorother-other' => 'Lain-lain',
+'htmlform-no' => 'Tidak',
+'htmlform-yes' => 'Ya',
+'htmlform-chosen-placeholder' => 'Pilih opsi',
# SQLite database support
'sqlite-has-fts' => '$1 dengan dukungan pencarian teks lengkap',
@@ -4253,4 +4343,13 @@ Jika tidak, Anda dapat menggunakan formulir mudah di bawah ini. Komentar Anda ak
# Image rotation
'rotate-comment' => 'Gambar diputar $1 {{PLURAL:$1|derajat}} searah jarum jam',
+# Limit report
+'limitreport-cputime' => 'Penggunaan waktu CPU',
+'limitreport-cputime-value' => '$1 {{PLURAL:$1|detik|detik}}',
+'limitreport-walltime' => 'Penggunaan waktu riil',
+'limitreport-walltime-value' => '$1 {{PLURAL:$1|detik|detik}}',
+'limitreport-postexpandincludesize-value' => '$1/$2 {{PLURAL:$2|bita|bita}}',
+'limitreport-templateargumentsize-value' => '$1/$2 {{PLURAL:$2|bita|bita}}',
+'limitreport-expensivefunctioncount' => 'Perhitungan fungsi parser yang mahal',
+
);
diff --git a/languages/messages/MessagesIe.php b/languages/messages/MessagesIe.php
index 281987db..0112545d 100644
--- a/languages/messages/MessagesIe.php
+++ b/languages/messages/MessagesIe.php
@@ -161,9 +161,6 @@ $messages = array(
'tog-shownumberswatching' => 'Monstrar li númere de usatores vigilant',
'tog-oldsig' => 'Prevision de signature in existentie:',
'tog-fancysig' => 'Tractar signature quam textu wiki (sin un catenun auto-crate)',
-'tog-externaleditor' => 'Usar redactor extern per contumacie (solmen por usatores expert, besona de colocationes special in tui computator. [//www.mediawiki.org/wiki/Manual:External_editors Plu information.])',
-'tog-externaldiff' => 'Usar diferentie extern per contumacie (solmen por usatores expert, besona de colocationes special in tui computator. [//www.mediawiki.org/wiki/Manual:External_editors Plu information.])',
-'tog-showjumplinks' => 'Permisser catenunes de accessebilitá "saltar a"',
'tog-uselivepreview' => 'Usar prevision in vivi (exige JavaScript) (experimental)',
'tog-forceeditsummary' => 'Suggester me quande intrar un redaction che summarium in blanc',
'tog-watchlisthideown' => 'Ocultar mi redactiones del liste de págines vigilat',
@@ -338,7 +335,7 @@ Pleser atende un témpor quelc ante que vu prova accesser ti págine denov.
$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).
+# 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).
'aboutsite' => 'Concernent {{SITENAME}}',
'aboutpage' => 'Project:Concernent',
'copyright' => 'Contenete disponibil sub $1.',
@@ -348,7 +345,6 @@ $1',
'disclaimers' => 'Advertimentes',
'disclaimerpage' => 'Project:Advertimentes comun',
'edithelp' => 'Redacter auxilie',
-'edithelppage' => 'Help:Redactant',
'helppage' => 'Help:Contenete',
'mainpage' => 'Págine principal',
'mainpage-description' => 'Págine principal',
@@ -626,7 +622,6 @@ Vider li [[Special:IPBlockList|liste de bloc de IP]] por li liste de bloces e ba
'viewprevnext' => 'Vider ($1 {{int:pipe-separator}} $2) ($3)',
'searchmenu-exists' => "'''Vi un págine nominat \"[[:\$1]]\" in ti wiki.'''",
'searchmenu-new' => "'''Crear li págine \"[[:\$1]]\" in ti wiki!'''",
-'searchhelp-url' => 'Help:Contenete',
'searchprofile-articles' => 'Págines de contenete',
'searchprofile-project' => 'Auxilie e Págines de projecte',
'searchprofile-images' => 'Multimedia',
@@ -648,9 +643,6 @@ Vider li [[Special:IPBlockList|liste de bloc de IP]] por li liste de bloces e ba
'search-nonefound' => 'Ne esset constatat resultates por li question.',
'powersearch' => 'Serchar avansat',
-# Quickbar
-'qbsettings' => 'Personalisation del barre de utensiles',
-
# Preferences page
'preferences' => 'Preferenties',
'mypreferences' => 'Mi preferenties',
@@ -759,7 +751,6 @@ Tui adresse de e-mail ne es revelat quande altri usatores contacter vu.',
'recentchangeslinked-feed' => 'Relatet modificationes',
'recentchangeslinked-toolbox' => 'Changes referet',
'recentchangeslinked-title' => 'Changes relatet por "$1"',
-'recentchangeslinked-noresult' => 'Nequant change in págines ligat durante li periode anunciat.',
'recentchangeslinked-summary' => "Ti es un liste de changes fat recentmen por págines ligat de un págine specificat (o por membres de un categorie specificat).
Págines in [[Special:Watchlist|tui liste de págines vigilat]] es '''nigri'''.",
'recentchangeslinked-page' => 'Nómine de págine:',
@@ -893,8 +884,6 @@ Li descrition es in li [$2 págine de descrition del file] ta e es monstrat in i
'statistics-users-active-desc' => 'Usatores qui have efectuat un action in li ultim {{PLURAL:$1|die|dies}}',
'statistics-mostpopular' => 'Págines max visitat',
-'disambiguationspage' => 'Template:disambig',
-
'brokenredirects-edit' => 'redacter',
'brokenredirects-delete' => 'deleter',
@@ -994,10 +983,9 @@ Li descrition es in li [$2 págine de descrition del file] ta e es monstrat in i
'watch' => 'Vigilar',
'watchthispage' => 'Vigilar ti págine',
'unwatch' => 'Desvigilar',
-'watchnochange' => 'Nequant de tui tui partes vigilat esset redactet in li periode de témpor monstrat.',
'watchlist-details' => '{{PLURAL:$1|$1 págine|$1 págines}} in tui liste de págines vigilat, sin págines de discussion.',
-'wlheader-enotif' => '* Li notification de e-mail es permisset.',
-'wlheader-showupdated' => "* Págines quel hat esset mutat desde tui ultim visitation es monstrat in '''nigri'''",
+'wlheader-enotif' => 'Li notification de e-mail es permisset.',
+'wlheader-showupdated' => "Págines quel hat esset mutat desde tui ultim visitation es monstrat in '''nigri'''",
'watchmethod-recent' => 'controlant nov redactiones por págines vigilat',
'watchmethod-list' => 'controlant págines vigilat por nov redactiones',
'watchlistcontains' => 'Tui liste de págines vigilat contene $1 {{PLURAL:$1|págine|págines}}.',
@@ -1360,7 +1348,6 @@ Vu posse anc [[Special:EditWatchlist|usar li redactor uniform]].',
'version-other' => 'Altri',
'version-mediahandlers' => 'Manuettes de media',
'version-hooks' => 'Croces',
-'version-extension-functions' => 'Functiones de extension',
'version-parser-extensiontags' => 'Puntales de extension analisatores',
'version-parser-function-hooks' => 'Croces de functiones analisatores',
'version-hook-name' => 'Nómine de croc',
@@ -1372,9 +1359,6 @@ Vu posse anc [[Special:EditWatchlist|usar li redactor uniform]].',
'version-software-product' => 'Producte',
'version-software-version' => 'Version',
-# Special:FilePath
-'filepath-page' => 'Figura:',
-
# Special:SpecialPages
'specialpages' => 'Págines special',
'specialpages-group-maintenance' => 'Raportes de conservation',
diff --git a/languages/messages/MessagesIg.php b/languages/messages/MessagesIg.php
index e8386990..d80520c1 100644
--- a/languages/messages/MessagesIg.php
+++ b/languages/messages/MessagesIg.php
@@ -104,9 +104,6 @@ $messages = array(
'tog-shownumberswatching' => 'Zi onuogụgụ ndi na banife nke ne lé',
'tog-oldsig' => 'Létu ntakiri ndẹlu ejị a ma gí:',
'tog-fancysig' => 'Mesò ka nkábi nwéré édé wiki (nké énwéghị jikodo nke ná»r na onwe)',
-'tog-externaleditor' => 'Jí irü èzí nà áká (màkà ndi òkà nání, ȯ chá»rá» ndósé nke kárí na nsónùsòrò gi)',
-'tog-externaldiff' => 'Jí nkéichè èzí nà áká (màkà ndi òkà nání, ȯ chá»rá» ndósé nke kárí na nsónùsòrò gi)',
-'tog-showjumplinks' => 'Kwé ka njikodo "mani énū" I mé',
'tog-uselivepreview' => 'Jí nlé ntàkírí dí ndụ (à gí nwé JavaScript) (mmètú kanyí lé)',
'tog-forceeditsummary' => 'Gwam mgbè okwu nsem màkà orüm rürü a díghị',
'tog-watchlisthideown' => 'Zonari orüm fwuör ndetu ihem ne lé',
@@ -304,7 +301,7 @@ $1',
'pool-queuefull' => 'Pool kyu zùrù',
'pool-errorunknown' => 'Nsogbu nke námaghi',
-# 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).
+# 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).
'aboutsite' => 'Maka {{SITENAME}}',
'aboutpage' => 'Project:Ihe owù',
'copyright' => 'Ihe di ime ná»r okpúrụ $1',
@@ -314,7 +311,6 @@ $1',
'disclaimers' => 'Ihe anyí chá»rá» ki ma',
'disclaimerpage' => 'Project:Ihe I kweshiri ma',
'edithelp' => 'Inyetuáká I rüwa',
-'edithelppage' => 'Help: I rüwa',
'helppage' => 'Help: Ihe di ime',
'mainpage' => 'Ihü Mbu',
'mainpage-description' => 'Ihü Mbu',
@@ -426,7 +422,6 @@ Orürü: $1<br />
'editinginterface' => "'''Okwu egú:''' I na rü ihü né nyé ihu maka mkpurụ edemede nke eji-a-rü nka.
Gbanwere më ihüa ga mètú ihu élélé nke onye-na-banife maka ndi ozor.
Maka ikuwaria na asụsụ nke ozor, biko chetu I ji [//translatewiki.net/wiki/Main_Page?setlang=ig translatewiki.net], ihe orü MediaWiki di na ama ama.",
-'sqlhidden' => '(nchowa SQL zonari a zonari)',
'namespaceprotected' => "I weghị ike I rüwa élu ihü nor na '''$1''' áháama.",
'ns-specialprotected' => 'Ihü mkpà, a nweriki ru na ya.',
@@ -493,7 +488,7 @@ Biko meríáríá ya.',
'newpassword' => 'Mkpurụ okwu ejị a gafẹ nke ohúrù',
'retypenew' => 'Dechákwari mkpurụ okwu ejị a gafẹ nke ohúrù:',
'resetpass_submit' => 'Bá okwu éjị gáfè na áhà à bànyè',
-'resetpass_success' => 'Mkpurụ okwu ejị a gafẹ a gbanwere nke oma!
+'changepassword-success' => 'Mkpurụ okwu ejị a gafẹ a gbanwere nke oma!
I na á banye...',
'resetpass_forbidden' => 'Okwu éjị à gáfè enwéghịkị gabnwe',
'resetpass-submit-loggedin' => 'Gbanwe okwu éjị à gáfe',
@@ -715,7 +710,6 @@ Okwu ụmà: '''({{int:cur}})''' = gbánwe na nké orü mbu, '''({{int:last}})''
'viewprevnext' => 'Lé ($1 {{int:pipe-separator}} $2) ($3)',
'searchmenu-legend' => 'Màkà nchöwa',
'searchmenu-new' => "'''Ké ihü \"[[:\$1]]\" na wiki nke á!'''",
-'searchhelp-url' => 'Help:Ihe di ime',
'searchprofile-articles' => 'Ihü ihe dị',
'searchprofile-project' => 'Ihü Nkwádo na Orürü',
'searchprofile-images' => 'Nkaníle',
@@ -749,14 +743,6 @@ Nwàné ótù okwu íshí na ihe à nè tú jí ''háníle:'' à tuó ihe nílé
'powersearch-toggleall' => 'Haníle',
'powersearch-togglenone' => 'Efù',
-# Quickbar
-'qbsettings' => 'Mkpá»rá»-ȯsȯ-á»sá»',
-'qbsettings-none' => 'Efù',
-'qbsettings-fixedleft' => 'Gbado na áká èkpè',
-'qbsettings-fixedright' => 'Gbado na áká ìkengà',
-'qbsettings-floatingleft' => 'Ne fé na áká èkpè',
-'qbsettings-floatingright' => 'Ne fé na áká nrí',
-
# Preferences page
'preferences' => 'Otu ha dosẹrẹ ihe',
'mypreferences' => 'Otú m shị na dose ihem',
@@ -1022,8 +1008,6 @@ Ihü ná»r na [[Special:Watchlist|ndétu ihe à ne lé]] di na mkpụrụ edemed
'statistics-views-total' => 'Há hụrụ ya olé níle',
'statistics-users-active' => "Ọ'bànifé di galagala",
-'disambiguationspage' => 'Template:á»lúchịgị',
-
'double-redirect-fixed-move' => '[[$1]] a puziele.
Ubwa, o na ga [[$2]].',
@@ -1301,8 +1285,6 @@ Ngá bu ihe hé mèkwàrà nà ihü '''$1''':",
'unblocklogentry' => 'àkwáchị gị $1',
'block-log-flags-nocreate' => "à ké á»'bànifé bàchìrì",
'block-log-flags-noemail' => 'ha kwàchịrị e-mail',
-'blockme' => 'Kwàchím',
-'proxyblocksuccess' => 'Ọméchá.',
# Developer tools
'lockdb' => 'Gbàchí uche nsónùsòrò',
@@ -1524,7 +1506,7 @@ Nke ozor gí zonari na áká onwe ha.
* gpslongitude
* gpsaltitude',
-# EXIF tags
+# Exif tags
'exif-imagewidth' => 'Àsáa',
'exif-imagelength' => 'Ógólógó',
'exif-orientation' => 'Ãvú nà àsáa',
@@ -1695,11 +1677,6 @@ Nke ozor gí zonari na áká onwe ha.
'version-entrypoints-header-entrypoint' => 'Ébé á»Ì€bụ̀bà',
'version-entrypoints-header-url' => 'URL',
-# Special:FilePath
-'filepath' => 'UzỠusòrò',
-'filepath-page' => 'Usòrò:',
-'filepath-submit' => 'Gá',
-
# Special:FileDuplicateSearch
'fileduplicatesearch-filename' => 'Ãhà usòrò:',
'fileduplicatesearch-submit' => 'Chá»wa',
diff --git a/languages/messages/MessagesIk.php b/languages/messages/MessagesIk.php
index 70c37329..65eb8163 100644
--- a/languages/messages/MessagesIk.php
+++ b/languages/messages/MessagesIk.php
@@ -7,31 +7,16 @@
* @ingroup Language
* @file
*
- * @author Emperyan
* @author Hercule
* @author Zanimum (on ik.wikipedia.org)
*/
$messages = array(
-# Dates
-'january' => 'Siqiññaatchiaq',
-'february' => 'Siqiññaasugruk',
-'march' => 'Paniqsiivik',
-'april' => 'Tiŋmirrat Tatqiat',
-'may_long' => 'Suvluġvik',
-'june' => 'Iġñivik',
-'july' => 'Isavik',
-'august' => 'Tiŋŋivik',
-'september' => 'Niġlaalgit Tiŋŋiviat',
-'october' => 'Nuliaġvik',
-'november' => 'Quyyavik',
-'december' => 'Uvluiḷaq',
-
# 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).
-'helppage' => 'Help:anniqsuiruq',
-'mainpage' => 'Makpiġaaq Kanna',
+'helppage' => 'Help:anniqsuiruq',
+'mainpage' => 'Makpiġaaq Kanna',
'mainpage-description' => 'Makpibaaq Kanna',
-'portal-url' => 'Project:qargi',
+'portal-url' => 'Project:qargi',
# Search results
'searchhelp-url' => 'Help:anniqsuiruq',
diff --git a/languages/messages/MessagesIke_cans.php b/languages/messages/MessagesIke_cans.php
index 95f36016..8cea6d07 100644
--- a/languages/messages/MessagesIke_cans.php
+++ b/languages/messages/MessagesIke_cans.php
@@ -143,6 +143,8 @@ $messages = array(
'editinginterface' => "'''áƒá“‚ᖅᑎᕈᑎ—''' á‹á•¼áŠ ᓱá–ᓯᖅṠáƒá‘­áŠá–… ᒪᑉá±á‘•á–… áŠá‘áƒá“ᓇᓯᕗᖅ á„ᔭᑦᓴᖅ ᖃᕋᓴá…á”­á–… á‘•á–…á“´á“•á–…á¹ áƒá‘­áŠá–… áŠá•¿á‘¦á‘á–… ᖃᕆᑕá…á”­á…ᑉ á‘Žá‘Žá•‹á•á••á–“. áŠá“¯áŠá™³á‘á–… áƒá‘­áŠá–… ᒪᑉá±á‘•á–… áƒá“„ᒃᑎá‘ᑦ á…áƒá‘­á±á‘ŽáŠ áŠá“ªá“šá–‘á–…á‘áŠá–… ᓇᑭᒪᖅá³á–… ᖃᑕᙳᑎ.",
# Login and logout pages
+'welcomecreation' => "== áŠá•†á…ᙵáƒá¹, $1! ==
+á±á’‹á•—á–… ᖃᑕᙳᑎ á…áƒá‘­á±á‘ŽáŠ ᑮᓇá…á”­á–á‘Žá–ƒá•á••á’ƒ áƒá“±áƒá“ªá“•á–“áƒá‘¦á”­á¹. áƒá–…á‘‘ ᓱá–ᓯᖅṠ{{SITENAME}} áƒá“á“‚áŠá‘á–… «''á“‚á± áŠá’¥''»",
'yourname' => 'á…áƒá‘­á±á‘ŽáŠ áŠá‘Žá–…',
'yourpassword' => 'á…áƒá‘­á±á‘ŽáŠ á¸á“šá™µá“´á…á‘Ž',
'yourpasswordagain' => 'á‘•á’ªá‘ᒪᓃᖅṠáƒá’ƒá“¯á’á–…á‘á–… á…áƒá‘­á±á‘ŽáŠ á¸á“šá™µá“´á…á‘Ž',
@@ -275,7 +277,7 @@ $messages = array(
# Special:Categories
'categories' => 'á“„áŠá‘‰á³á‘¦',
-# Email user
+# E-mail user
'emailuser' => 'á‘­á’á‘Žá…ᑉ ᓯᑎᓂᖅá¹á–“ áƒá“„á’ƒ',
'emailfrom' => 'ᓇᑭᑦ',
'emailmessage' => 'á‘­á’¡á’á¹',
diff --git a/languages/messages/MessagesIke_latn.php b/languages/messages/MessagesIke_latn.php
index 79fe8922..4325b713 100644
--- a/languages/messages/MessagesIke_latn.php
+++ b/languages/messages/MessagesIke_latn.php
@@ -127,6 +127,8 @@ $messages = array(
'editinginterface' => "'''iniqtiruti—''' aaha suqusiqpaa iqiak mappitaq atuinnasivuq iijatsaq qarasaujaq taqsaliqpaa ikiaq aqittuq qaritaujaup titirarvinga. asiaNngutuq ikiaq mappitaq inuktitut uikipitia allanguqtuaq nakimaqpuq qatannguti.",
# Login and logout pages
+'welcomecreation' => "== ariunngaipaa, $1! ==
+pigivuq qatannguti uikipitia kiinaujaqutiqarvik isuillingaitjapaa. iqtuu suqusiqpa{{SITENAME}} inniatuq—«''nipi ami''»",
'yourname' => 'uikipitia atiq',
'yourpassword' => 'uikipitia palanngasauti',
'yourpasswordagain' => 'tamatumaniiqpaa iksigaqtuq uikipitia palanngasauti',
@@ -248,7 +250,7 @@ $messages = array(
# Special:Categories
'categories' => 'nuapput',
-# Email user
+# E-mail user
'emailfrom' => 'nakit',
'emailmessage' => 'kiggapaa',
'emailsend' => 'qiutsavigivaa',
diff --git a/languages/messages/MessagesIlo.php b/languages/messages/MessagesIlo.php
index 492f0a1b..3449654f 100644
--- a/languages/messages/MessagesIlo.php
+++ b/languages/messages/MessagesIlo.php
@@ -65,9 +65,6 @@ $messages = array(
'tog-shownumberswatching' => 'Ipakita ti bilang dagiti agbuybuya nga agar-aramat',
'tog-oldsig' => 'Ti adda a pirma:',
'tog-fancysig' => 'Tratuen ti pirma a kas wikitext (nga awan ti automatiko a panagsilpo)',
-'tog-externaleditor' => 'Isigud ti panag-usar iti ruar a pnag-urnos (para dagiti eksperto laeng, masapul ti nangruna a kasasaad a panagikabil idiay kompiutermo. [//www.mediawiki.org/wiki/Manual:External_editors Adu pay a pakaammo.])',
-'tog-externaldiff' => 'Isigud ti panag-usar iti ruar a sabali (para dagiti eksperto laeng, masapul ti nangruna a kasasaad a panagikabil idiay kompiutermo. [//www.mediawiki.org/wiki/Manual:External_editors Adu pay a pakaammo.])',
-'tog-showjumplinks' => 'Pakabaelan a "lumaktaw kadagiti" naipalaka a pagserkan a silpo',
'tog-uselivepreview' => 'Usaren ti agdama a panagipadas (eksperimento)',
'tog-forceeditsummary' => 'Pakaammuannak no sumrek ti blanko a pakabuklan ti panag-urnos',
'tog-watchlisthideown' => 'Ilemmeng dagiti inurnosko manipud ti listaan ti bambantayan',
@@ -80,6 +77,8 @@ $messages = array(
'tog-diffonly' => 'Saan nga iparang ti linaon ti panid dita baba dagiti pagiddiatan',
'tog-showhiddencats' => 'Ipakita dagiti nailemmeng a kategoria',
'tog-norollbackdiff' => 'Laksiden ti paggiddiatan kalpasan ti panagaramid ti panagisubli',
+'tog-useeditwarning' => 'Pakaunaannak no pumanawak iti maysa pagurnosan a panid no adda ti saan a naidulin a sinuksukatan',
+'tog-prefershttps' => 'Kankanayon nga agusar ti natalged a pannakaisilpo no nakastrek',
'underline-always' => 'Kanayon',
'underline-never' => 'Saan uray kaanoman',
@@ -143,6 +142,18 @@ $messages = array(
'oct' => 'Okt',
'nov' => 'Nob',
'dec' => 'Dis',
+'january-date' => 'Enero $1',
+'february-date' => 'Pebrero $1',
+'march-date' => 'Marso $1',
+'april-date' => 'Abril $1',
+'may-date' => 'Mayo $1',
+'june-date' => 'Hunio $1',
+'july-date' => 'Hulio $1',
+'august-date' => 'Agosto $1',
+'september-date' => 'Septiembre $1',
+'october-date' => 'Oktubre $1',
+'november-date' => 'Nobiembre $1',
+'december-date' => 'Disiembre $1',
# Categories related messages
'pagecategories' => '{{PLURAL:$1|Kategoria|Katkategoria}}',
@@ -224,6 +235,7 @@ $messages = array(
'create-this-page' => 'Aramidem daytoy a panid',
'delete' => 'Ikkaten',
'deletethispage' => 'Ikkaten daytoy a panid',
+'undeletethispage' => 'Isubli ti pannakaikkat daytoy a panid',
'undelete_short' => 'Isubli ti pannakaikkat {{PLURAL:$1|ti maysa a naurnos|dagiti $1 a naurnos}}',
'viewdeleted_short' => 'Kitaen {{PLURAL:$1|ti maysa a naikkat a naurnos|dagiti $1 a naikkat a naurnos}}',
'protect' => 'Salakniban',
@@ -267,7 +279,7 @@ $1',
'pool-queuefull' => 'Napunnon ti nagyanan ti pagur-urayan',
'pool-errorunknown' => 'Di am-ammo a biddut',
-# 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).
+# 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).
'aboutsite' => 'Maipanggep ti {{SITENAME}}',
'aboutpage' => 'Project:Maipanggep',
'copyright' => 'Ti linaon ket magun-od babaen ti $1 malaksid no adda sabali a naibaga.',
@@ -277,7 +289,6 @@ $1',
'disclaimers' => 'Dagiti renunsia',
'disclaimerpage' => 'Project:Sapasap a renunsia',
'edithelp' => 'Tulong ti panag-urnos',
-'edithelppage' => 'Help:Panag-urnos',
'helppage' => 'Help:Dagiti linaon',
'mainpage' => 'Umuna a Panid',
'mainpage-description' => 'Umuna a Panid',
@@ -355,17 +366,12 @@ Masarakan ti listaan dagiti umisu nga espesial a pampanid iti [[Special:SpecialP
# General errors
'error' => 'Biddut',
'databaseerror' => 'Biddut iti database',
-'dberrortext' => 'Adda napasamak a biddut ti nakaibatayan ti datos a panagsapul ti gramatika.
-Adda ngata kiteb iti sopwer.
-Ti kinaudi a panagipadas ti panagsapul ti nakaibatayan ti datos ket:
-<blockquote><code>$1</code></blockquote>
-naggapu ti uneg ti pamay-an "<code>$2</code>".
-Ti nakaibatayan ti datos ket nangipatulod ti biddut "<samp>$3: $4</samp>".',
-'dberrortextcl' => 'Adda biddut ti database ti gramatika a panagsapul.
-Ti kinaudi a panagsapul ti database ket:
-"$1"
-naggapu ti uneg ti opisio "$2".
-Ti database ket nangipatulod ti biddut "$3: $4".',
+'databaseerror-text' => 'Adda napasamak a biddut ti usisa ti database.
+Daytoy ket mabalin a mangibagbaga ti parikut ti sopwer.',
+'databaseerror-textcl' => 'Adda napasamak a biddut ti usisa ti database.',
+'databaseerror-query' => 'Usisa: $1',
+'databaseerror-function' => 'Annong: $1',
+'databaseerror-error' => 'Biddut: $1',
'laggedslavemode' => "'''Ballaag:''' Ti panid ket mabalin a saan nga aglaon kadagiti kinaudi a panagpabaro.",
'readonly' => 'Narikepan ti database',
'enterlockreason' => 'Agikabil ti rason para iti pannakarikep, agraman ti maysa a karkulo no kaanonto a maluktan',
@@ -400,6 +406,7 @@ Amangan no adda sabali a nangikkaten.',
'cannotdelete-title' => 'Saan a maikkat ti panid "$1"',
'delete-hook-aborted' => 'Inukas ti kawit ti panagborra.
Awan ti intedna a palawag.',
+'no-null-revision' => 'Saan a makaaramid ti awan serbina a panagbaliw para iti panid "$1"',
'badtitle' => 'Madi a titulo',
'badtitletext' => 'Ti kiniddaw idi a titulo ti panid ket imbalido, blanko, wenno maysa a saan nga husto a naisilpo a silpo ti pagsasao wenno interwiki a titulo.
Mabalin nga aglaon ti a maysa wenno ad-adu a karakter a saan a mausar kadagiti titulo.',
@@ -423,12 +430,15 @@ Ti aginayon wenno panagibaliw kadagiti panagipatarus para kadagiti amin a wiki,
'editinginterface' => "'''Ballaag:''' Ur-urnosem ti maysa a panid a maar-aramat a mangted iti testo ti interface para iti sopwer.
Dagiti panagsukat iti daytoy a panid ket maarigan ti langa ti panagaramat nga interface dagiti sabali nga agar-aramat iti daytoy a wiki.
Ti aginayon wenno panagibaliw kadagiti panagipatarus para kadagiti amin a wiki, pangngaasi nga usaren ti [//translatewiki.net/ translatewiki.net], ti lokalisasion a gandat ti MediaWiki.",
-'sqlhidden' => '(Nailemmeng ti SQL a panagbiruk)',
'cascadeprotected' => 'Daytoy a panid ket nasalakniban para iti panag-urnos ngamin ket nairaman kadagiti sumaganad {{PLURAL:$1|a panid, a|a pampanid, a}} nasalakniban nga adda ti napili nga "agsariap" :
$2',
'namespaceprotected' => "Awan ti pammalubosmo nga agurnos kadagiti panid iti '''$1''' a nagan ti espasio.",
'customcssprotected' => 'Awan ti pammalubosmo nga agurnos iti daytoy panid ti CSS, ngamin ket adda linaonna a tagikua dagiti agar-aramat ti sabali a kasasaad.',
'customjsprotected' => 'Awan ti pammalubosmo nga agurnos iti daytoy a panid ti JavaScript, ngamin ket adda linaonna a tagikua dagiti agar-aramat ti sabali a kasasaad.',
+'mycustomcssprotected' => 'Awan pammalubosmo nga agurnos iti daytoy a panid ti CSS.',
+'mycustomjsprotected' => 'Awan pammalubosmo nga agurnos iti daytoy a panid ti JavaScript.',
+'myprivateinfoprotected' => 'Awan pammalubosmo nga agurnos iti pribado a pakaammom.',
+'mypreferencesprotected' => 'Awan pammalubosmo nga agurnos kadagiti kakaykayatam.',
'ns-specialprotected' => 'Saan a mabalin nga urnosen dagiti espesial a panid.',
'titleprotected' => "Daytoy a titulo ket nasalakniban manipud ti panakapartuat babaen ni [[User:$1|$1]].
Ti naited a rason ket ''$2''.",
@@ -453,10 +463,19 @@ Laglagipen nga adda met dagiti panid nga agtultuloy a maiparang a kasla nakastre
'welcomecreation-msg' => 'Naaramiden ti pakabilangam.
Dimo liplipatan a sukatan dagiti kakaykayatam idiay [[Special:Preferences|{{SITENAME}} kakaykayatan]].',
'yourname' => 'Nagan ti agar-aramat:',
+'userlogin-yourname' => 'Nagan ti agar-aramat',
+'userlogin-yourname-ph' => 'Ikabil ti naganmo nga agar-aramat',
+'createacct-another-username-ph' => 'Ikabil ti nagan ti agar-aramat',
'yourpassword' => 'Kontrasenias:',
+'userlogin-yourpassword' => 'Kontrasenias',
+'userlogin-yourpassword-ph' => 'Ikabilmo ti kontrasenias',
+'createacct-yourpassword-ph' => 'Agikabil ti kontrasenias',
'yourpasswordagain' => 'Uliten ti kontrasenias:',
+'createacct-yourpasswordagain' => 'Pasingkedan ti kontrasenias',
+'createacct-yourpasswordagain-ph' => 'Ikabil manen ti kontrasenias',
'remembermypassword' => 'Laglagipem ti iseserrekko iti daytoy a pagbasabasa (para iti kapaut iti $1 {{PLURAL:$1|nga aldaw|nga al-aldaw}})',
-'securelogin-stick-https' => 'Agyanka a nakasilpo iti HTTPS kalpasan no nakastrekka',
+'userlogin-remembermypassword' => 'Taginayonennak nga iserrek',
+'userlogin-signwithsecure' => 'Usaren ti natalged a pannakaisilpo',
'yourdomainname' => 'Ti bukodmo a pagturayan:',
'password-change-forbidden' => 'Saanmo a mabalin ti mangbaliw kadagiti kontrasenias iti daytoy a wiki.',
'externaldberror' => 'Adda biddut idi ti panakapasingked ti database wenno saanmo a mabalin ti agpabaro ti bukodmo nga akin-ruar a pakabilangan.',
@@ -468,18 +487,41 @@ Dimo liplipatan a sukatan dagiti kakaykayatam idiay [[Special:Preferences|{{SITE
'logout' => 'Rummuar',
'userlogout' => 'Rummuar',
'notloggedin' => 'Saan a nakastrek',
+'userlogin-noaccount' => 'Awan ti pakabilangam?',
+'userlogin-joinproject' => 'Tumipon iti {{SITENAME}}',
'nologin' => 'Awan pakabilangam? $1.',
'nologinlink' => 'Agaramid ti pakabilangan',
'createaccount' => 'Agaramid ti pakabilangan',
'gotaccount' => 'Addaanka kadin ti pakabilangam? $1.',
'gotaccountlink' => 'Sumrek',
'userlogin-resetlink' => 'Nalipatam dagiti salaysay ti pagserrekmo?',
+'userlogin-resetpassword-link' => 'Iyasentar manen ti kontrasenias',
+'helplogin-url' => 'Help:Panagserrek',
+'userlogin-helplink' => '[[{{MediaWiki:helplogin-url}}|Tulong iti panagserrek]]',
+'createacct-join' => 'Ikabil ti pakaammom dita baba.',
+'createacct-another-join' => 'Ikabil ti pakaammo ti baro a pakabilangan dita baba.',
+'createacct-emailrequired' => 'Esurat a pagtaengan',
+'createacct-emailoptional' => 'Esurat a pagtaengan (pagpilian)',
+'createacct-email-ph' => 'Ikabil ti esurat a pagtaengam',
+'createacct-another-email-ph' => 'Ikabil ti esurat a pagtaengan',
'createaccountmail' => 'Agusar ti pugto a temporario a kontrasenias ken ipatulod idiay naisangayan nga esurat a pagtaengan',
+'createacct-realname' => 'Pudno a nagan (pagpilian)',
'createaccountreason' => 'Rason:',
+'createacct-reason' => 'Rason',
+'createacct-reason-ph' => 'Apay nga agparpartuatka manen ti sabali a pakabilangan',
+'createacct-captcha' => 'Panagkita ti seguridad',
+'createacct-imgcaptcha-ph' => 'Ikabil ti testo a makitam dita ngato',
+'createacct-submit' => 'Partuatem ti pakabilangam',
+'createacct-another-submit' => 'Agaramid pay ti sabali a pakabilangan',
+'createacct-benefit-heading' => 'Ti {{SITENAME}} ket inar-aramid babaen ti tattao a kasla kenka.',
+'createacct-benefit-body1' => '{{PLURAL:$1|nga inurnos|nga inur-urnos}}',
+'createacct-benefit-body2' => '{{PLURAL:$1|a panid|a pampanid}}',
+'createacct-benefit-body3' => 'nga agdama a {{PLURAL:$1|nagparawad|nagparparawad}}',
'badretype' => 'Saan nga agpada dagiti inkabilmo a kontrasenias.',
'userexists' => 'Maus-usaren ti inkabilmo a nagan.
Pangngaasi nga agpilika ti sabali a nagan.',
'loginerror' => 'Biddut ti iseserrek',
+'createacct-error' => 'Biddut ti panagpartuat ti pakabilangan',
'createaccounterror' => 'Saan a makaaramid ti pakabilangan: $1',
'nocookiesnew' => 'Naaramid ti pakabilangan ti agar-aramat, ngem saanka a nakastrek.
Ti {{SITENAME}} ket agus-usar kadagiti "galietas" tapno maiserrek dagiti agar-aramat.
@@ -548,10 +590,12 @@ Nasken a sumrekka ken sukatam ti kontraseniasmo tattan.
Mabalinmo ti saan a mangikaskaso ti daytoy a mensahe, no biddut a naaramid daytoy a pakabilangan.',
'usernamehasherror' => 'Ti nagan ti agar-aramat ket nasken a saan nga aglaon kadagiti "hash" a karakter',
'login-throttled' => 'Adu unay ti panagpadasmo a sumrek.
-Pangaasi nga agurayka sakbay nga agipadas manen.',
+Pangngaasi nga agurayka ti $1 sakbay a padasem manen.',
'login-abort-generic' => 'Napaay ti panagserrekmo - Napasardeng',
'loginlanguagelabel' => 'Pagsasao: $1',
'suspicious-userlogout' => 'Naiparit ti panagkiddawmo a rummuar ngamin ket kasla inpatulod ti nadadael a panagbasabasa wenno pannakaidulin a pannakbagi.',
+'createacct-another-realname-tip' => 'Saan a nasken ti pudno a nagan.
+No kayatmo nga ited, mausarto daytoy para iti panangited ti pammadayaw para kadagiti obrada.',
# Email sending
'php-mail-error-unknown' => 'Di ammo a biddut ti surat ti PHP() nga annong.',
@@ -567,9 +611,7 @@ Tapno malpaska a makastrek, nasken a mangikabilka ti baro a kontrasenias ditoy:'
'newpassword' => 'Baro a kontrasenias:',
'retypenew' => 'Imakinilya manen ti baro a kontrasenias:',
'resetpass_submit' => 'Ikabil ti kontrasenias ken sumrek',
-'resetpass_success' => 'Nagballigi a nabaliwan ti kontrasenias mo!
-</br>
-Iserrek kan...',
+'changepassword-success' => 'Balligi a nasukatan ti kontraseniasmo!',
'resetpass_forbidden' => 'Saan a masukatan dagiti kontrasenias',
'resetpass-no-info' => 'Masapul a nakastrekka tapno dagus a makapanka iti daytoy a panid.',
'resetpass-submit-loggedin' => 'Sukatan ti kontrasenias',
@@ -581,10 +623,11 @@ Mabalin a nagballigi ti panagsukatmo ti kontrasenias wenno nagkiddaw ti baro a t
# Special:PasswordReset
'passwordreset' => 'Iyasentar manen ti kontrasenias',
-'passwordreset-text' => 'Lippasem daytoy a porma tapno maidisso manen ti bukodmo a kontrasenias.',
+'passwordreset-text-one' => 'Lippasem daytoy a porma tapno maiyasentar manen ti bukodmo a kontrasenias.',
+'passwordreset-text-many' => '{{PLURAL:$1|Agikabil ti maysa kadagiti pagikabilan tapno maiyasentar manen ti bukodmo a kontrasenias.}}',
'passwordreset-legend' => 'Iyasentar manen ti kontrasenias',
'passwordreset-disabled' => 'Nabaldado dagiti panangiyasentar manen ti kontrasenias iti daytoy a wiki.',
-'passwordreset-pretext' => '{{PLURAL:$1||Ikabil ti maysa a piraso ti datos dita baba}}',
+'passwordreset-emaildisabled' => 'Dagiti langa ti esurat ket nabaldado iti daytoy a wiki.',
'passwordreset-username' => 'Nagan ti agar-aramat:',
'passwordreset-domain' => 'Pagturayan:',
'passwordreset-capture' => 'Kitaen ti nagbanagan ti esurat?',
@@ -614,7 +657,7 @@ agtuloykan nga agusar ti daan a kontraseniasmo.',
Temporario a kontrasenias: $2',
'passwordreset-emailsent' => 'Ti maysa nga esurat ti panangiyasentar manen ti kontrasenias ket naipatuloden.',
'passwordreset-emailsent-capture' => 'Ti maysa nga esurat ti panangiyasentar manen ti kontrasenias ket naipatuloden, a napaikita dita baba.',
-'passwordreset-emailerror-capture' => 'Ti maysa nga esurat ti panangidisso manen ti kontrasenias ket naaramiden, a napaikita dita baba, ngem napaay a napaitulod iti agar-aramat: $1',
+'passwordreset-emailerror-capture' => 'Naaramid ti maysa nga esurat a panangyasentar manen ti kontrasenias, a napaikita dita baba, ngem ti panangitulod kenni {{GENDER:$2|agar-aramat}} ket napaay: $1',
# Special:ChangeEmail
'changeemail' => 'Sukatan ti esurat a pagtaengan',
@@ -628,6 +671,19 @@ Temporario a kontrasenias: $2',
'changeemail-submit' => 'Sukatan ti esurat',
'changeemail-cancel' => 'Ukasen',
+# Special:ResetTokens
+'resettokens' => 'Iyasentar manen dagiti tandaan',
+'resettokens-text' => 'Mabalinmo nga iyasentar dagiti tandaan a mangpalubos ti panagserrek ti naisangayan a pribado datos a mainaig ti pakabilangam ditoy.
+
+Aramidem daytoy no aksidente nga inbingaymo dagitoy iti sabali wenno ti pakabilangam ket nakomprimiso.',
+'resettokens-no-tokens' => 'Awan dagiti maiyasentar manen a tandaan.',
+'resettokens-legend' => 'Iyasentar manen dagiti tandaan',
+'resettokens-tokens' => 'Dagiti tandaan:',
+'resettokens-token-label' => '$1 (agdama a pateg: $2)',
+'resettokens-watchlist-token' => 'Tandaan para iti pakan ti web (Atom/RSS) kadagiti [[Special:Watchlist|panagbalbaliw ti pampanid idiay bambantayam]]',
+'resettokens-done' => 'Naiyasentar manen dagiti tandaan.',
+'resettokens-resetbutton' => 'Iyasentar manen dagiti napili a tandaan',
+
# Edit page toolbar
'bold_sample' => 'Napuskol a testo',
'bold_tip' => 'Napuskol a testo',
@@ -834,12 +890,15 @@ Awan ti intedna a palawag.',
Kasla met naikkaten.',
'edit-conflict' => 'Adda kasinnungat ti panag-urnos.',
'edit-no-change' => 'Ti inurnosmo ket saan a naikaskaso, ngamin ket awan ti nasukatan a testo.',
+'postedit-confirmation' => 'Ti inurnosmo ket naidulinen.',
'edit-already-exists' => 'Saan a makaaramid ti baro a panid.
Adda met daytoyen.',
'defaultmessagetext' => 'Kasisigud a testo ti mensahe',
'content-failed-to-parse' => 'Napaay a nausig ti $2 a linaon para iti $1 a modelo: $3',
'invalid-content-data' => 'Imbalido a datos ti linaon',
'content-not-allowed-here' => 'Ti "$1" a linaon ket saan a maipalubos idiay panid ti [[$2]]',
+'editwarning-warning' => 'Ti ipapanaw ti daytoy a panid ket makapataud ti panakapukaw kadagiti aniaman a binalbaliwam.
+No nakastrekka, mabalinmo nga ibaldado daytoy a ballaag idiay "Panagurnos" a paset kadagiti kakaykayatam.',
# Content models
'content-model-wikitext' => 'wikitext',
@@ -875,6 +934,7 @@ Pangngaasi a kitaen ti pagipadaan dita baba tapno maamuan no agpaypayso ti kayat
'undo-failure' => 'Ti inurnos ket saan a maipasubli gaputa adda dagiti nakisinnungat a patingnga a naurnos.',
'undo-norev' => 'Saan a maibabawi ti naurnos ngamin ket awan daytoy wenno mabalin a naikkaten.',
'undo-summary' => 'Ibabawi ti $1 a binaliwan babaen ni [[Special:Contributions/$2|$2]] ([[User talk:$2|tungtungan]])',
+'undo-summary-username-hidden' => 'Isubli ti $1 a binaliwan babaen ti nailemmeng nga agar-aramat',
# Account creation failure
'cantcreateaccounttitle' => 'Saan a makaaramid ti pakabilangan',
@@ -1056,6 +1116,7 @@ Usaren ti radio a buton a tukol ti pinagtipon iti laeng panagbaliw a naaramid id
'compareselectedversions' => 'Ipada dagiti pinili a binaliwan',
'showhideselectedversions' => 'Ipakita/ilemmeng dagiti napili a nabaliwan',
'editundo' => 'ibabawi',
+'diff-empty' => '(Awan ti paggiddiatan)',
'diff-multi' => '({{PLURAL:$1|Maysa nga agtengnga a panangbalbaliw|Dagiti $1 nga agtennga a panangbalbaliw}} babaen {{PLURAL:$2|ti agararamat|dagiti $2 nga agararamat}} ti saan a naipakita)',
'diff-multi-manyusers' => '({{PLURAL:$1|Maysa nga agtengnga a panangbalbaliw|Dagiti $1 nga agtengnga a panangbalbaliw}} babaen ti ad-adu ngem $2 {{PLURAL:$2|nga agar-aramat|kadagiti agar-aramat}} ti saan a naipakita)',
'difference-missing-revision' => '{{PLURAL:$2|Maysa a panagbalbaliw|$2 kadagiti panagbalbaliw}} iti daytoy a paggiddiatan ($1) {{PLURAL:$2|ket ti|ket dagiti}} saan a naburikan.
@@ -1083,7 +1144,6 @@ Dagiti salaysay ket mabalin a mabirukan idiay [{{fullurl:{{#Special:Log}}/delete
'searchmenu-legend' => 'Pagpilian ti panagbiruk',
'searchmenu-exists' => "'''Adda panid a nanaganan ti \"[[:\$1]]\" iti daytoy a wiki.'''",
'searchmenu-new' => "'''Partuaten ti panid ti \"[[:\$1]]\" iti daytoy a wiki!'''",
-'searchhelp-url' => 'Help:Dagiti linaon',
'searchmenu-prefix' => '[[Special:PrefixIndex/$1|Kitaem dagiti panid nga adda kastoy a naipasaruno]]',
'searchprofile-articles' => 'Dagiti naglaon a panid',
'searchprofile-project' => 'Tulong ken Gandat a pampanid',
@@ -1127,15 +1187,7 @@ Padasem a pasarunuan ti panagbiruk mo ti ''all:'' tapno birukem amin a nagyan (
'searchdisabled' => 'Ti panagbiruk iti {{SITENAME}} ket nabaldado.
Mabalinmo ti agbiruk idiay Google tattan.
Laglagipem laeng a dagiti pagsurotan nagyan ti {{SITENAME}} ket baka baak.',
-
-# Quickbar
-'qbsettings' => 'Quickbar',
-'qbsettings-none' => 'Awan',
-'qbsettings-fixedleft' => 'Agyan latta iti kanigid',
-'qbsettings-fixedright' => 'Agyan latta iti kanawan',
-'qbsettings-floatingleft' => 'Tumpaw ti kanigid',
-'qbsettings-floatingright' => 'Tumpaw ti kanawan',
-'qbsettings-directionality' => 'Nasimpa, gapu laeng ti papanan ti panagsurat ti pagsasaom',
+'search-error' => 'Adda maysa a biddut napasamak bayat nga agbirbiruk:$1',
# Preferences page
'preferences' => 'Kakaykayatan',
@@ -1169,7 +1221,6 @@ Laglagipem laeng a dagiti pagsurotan nagyan ti {{SITENAME}} ket baka baak.',
'resetprefs' => 'Dalusan dagiti saan a naidulin a sinuksukatan',
'restoreprefs' => 'Isubli amin dagiti kasisigud a pannakaiyasentar (kadagiti amin a paset)',
'prefs-editing' => 'Ur-urnosen',
-'prefs-edit-boxsize' => 'Kadakkel ti tawa ti panag-urnos.',
'rows' => 'Ar-aray:',
'columns' => 'Tuk-tukol:',
'searchresultshead' => 'Biruken',
@@ -1180,10 +1231,9 @@ Laglagipem laeng a dagiti pagsurotan nagyan ti {{SITENAME}} ket baka baak.',
'recentchangesdays-max' => 'Kapaut nga $1 {{PLURAL:$1|nga aldaw|nga al-aldaw}}',
'recentchangescount' => 'Dagiti bilang dagiti naurnos a kinasigud a maiparang:',
'prefs-help-recentchangescount' => 'Nairaman dagiti kinaudian a baliwan, dagiti pakasaritaan ti panid, ken dagiti listaan.',
-'prefs-help-watchlist-token' => 'No ikkam daytoy pagikabilan ti sekreto a tulbek, agaramid ti pakan a RSS para ti binambantayam.
-No adda makaammo daytoy a tulbek ditoy a pagikabilan ket mabalin da a basaen ti binambantayam, masapul nga agpilika ti pateg a seguridad.
-
-Adda ditoy ti pugto a pateg a mausarmo: $1',
+'prefs-help-watchlist-token2' => 'Daytoy ti sekreto a tulbek iti pakan ti web iti listaan ti banbantayam.
+Ti sinoman a makaammo daytoy ket mabalinda a basaen ti listaan ti banbantayam, isunga saanmo nga ipabingay.
+[[Special:ResetTokens|Pindutem ditoy no kayatmo nga iyasentar manen]].',
'savedprefs' => 'Naidulinen dagiti kakaykayatam.',
'timezonelegend' => 'Sona ti oras:',
'localtime' => 'Lokal nga oras:',
@@ -1214,7 +1264,6 @@ Adda ditoy ti pugto a pateg a mausarmo: $1',
'prefs-reset-intro' => 'Mabalinmo nga usaren daytoy a panid tapno maisublim dagita kakaykayatam iti kasisigud ti daytoy a wiki.
Ngem saanto a mabalinen nga ipasubli.',
'prefs-emailconfirm-label' => 'Pammasingked ti esurat:',
-'prefs-textboxsize' => 'Ti kadakkel ti pagurnosan a tawa',
'youremail' => 'Esurat:',
'username' => '{{GENDER:$1|Nagan ti agar-aramat}}:',
'uid' => 'ID ti {{GENDER:$1|Agar-aramat}}:',
@@ -1250,6 +1299,8 @@ Ti esurat a pagtaengam ket saan a maipakita kadagiti agar-aramat nga agkontak ke
'prefs-dateformat' => 'Kita ti petsa',
'prefs-timeoffset' => 'Tangda ti oras',
'prefs-advancedediting' => 'Dagiti sapasap a pagpilian',
+'prefs-editor' => 'Mannurat',
+'prefs-preview' => 'Ipadas',
'prefs-advancedrc' => 'Dagiti napasayaat a pagpilian',
'prefs-advancedrendering' => 'Dagiti napasayaat a pagpilian',
'prefs-advancedsearchoptions' => 'Dagiti napasayaat a pagpilian',
@@ -1257,7 +1308,9 @@ Ti esurat a pagtaengam ket saan a maipakita kadagiti agar-aramat nga agkontak ke
'prefs-displayrc' => 'Ipakita dagiti pagpilian',
'prefs-displaysearchoptions' => 'Ipakita dagiti pagpilian',
'prefs-displaywatchlist' => 'Ipakita dagiti pagpilian',
+'prefs-tokenwatchlist' => 'Tandaan',
'prefs-diffs' => 'Sabali',
+'prefs-help-prefershttps' => 'Daytoy a kakaykayatan ket mapakabaelanto iti sumaruno nga iseserrekmo.',
# User preference: email validation using jQuery
'email-address-validity-valid' => 'Ti esurat a pagtaengan ket kasla umiso',
@@ -1284,6 +1337,8 @@ Ti esurat a pagtaengam ket saan a maipakita kadagiti agar-aramat nga agkontak ke
'userrights-notallowed' => 'Awan ti pammalubos nga agnayon wenno agikkat kadagiti karbengan ti agar-aramat.',
'userrights-changeable-col' => 'Dagiti grupo a mabalinmo a baliwan',
'userrights-unchangeable-col' => 'Dagiti grupo a dimo mabalin a baliwan',
+'userrights-conflict' => 'Suppiat dagiti panagbaliw kadagiti karbengan ti agar-aramat! Pangngaasi nga irepasom ken pasingkedam dagiti sinuksukatam.',
+'userrights-removed-self' => 'Nagballigika a nagikkat kadagiti karbengam. Isu a kastoyen ket saanmo a mabalin a pastrekan daytoy a panid.',
# Groups
'group' => 'Grupo:',
@@ -1349,11 +1404,19 @@ Ti esurat a pagtaengam ket saan a maipakita kadagiti agar-aramat nga agkontak ke
'right-proxyunbannable' => 'Labsan dagiti automatiko a serra dagiti pannakbagi',
'right-unblockself' => 'Ikkaten ti kabukbukodan a pannaka-serra',
'right-protect' => 'Sukatan dagiti agpang ti salaknib ken urnosen dagiti nasalakniban ti sariap a panid',
-'right-editprotected' => 'Urnosen dagiti nasalakniban a panid (nga awan ti sariap a salaknib")',
+'right-editprotected' => 'Urnosen dagiti panid a nasalakniban a kas "{{int:protect-level-sysop}}"',
+'right-editsemiprotected' => 'Urnosen dagiti panid a nasalakniban a kas "{{int:protect-level-autoconfirmed}}"',
'right-editinterface' => 'Urnosen ti "interface" ti agar-aramat',
'right-editusercssjs' => 'Urnosen dagiti CSS ken JavaScript a papeles dagiti sabsabali nga agar-aramat',
'right-editusercss' => 'Urnosen dagiti CSS a papeles dagiti sabsabali nga agar-aramat',
'right-edituserjs' => 'Urnosen dagiti JavaScript a papeles dagiti sabsabali nga agar-aramat',
+'right-editmyusercss' => 'Urnosem dagiti bukodmo a papeles ti CSS ti agar-aramat',
+'right-editmyuserjs' => 'Urnosem dagiti bukodmo a papeles ti JavaScript ti agar-aramat',
+'right-viewmywatchlist' => 'Kitaem ti bukodmo a listaan ti banbantayan',
+'right-editmywatchlist' => 'Urnosem ti bukodmo a listaan ti agar-aramat. Laglagipen nga adda dagiti tignay a mangnayonto pay laeng ti pampanid urayno awan daytoy a karbengan.',
+'right-viewmyprivateinfo' => 'Kitaem ti bukodmo a pribado a datos (kasla ti esurat a pagtaengan, pudno a nagan)',
+'right-editmyprivateinfo' => 'Urnosem ti bukodmo a pribado a datos (kasla ti esurat a pagtaengan, pudno a nagan)',
+'right-editmyoptions' => 'Urnosem dagiti bukodmo a kakaykayatan',
'right-rollback' => 'Pardasan nga ipasubli dagiti inurnos ti naudi nga agar-aramat a nagurnos ti kakasta a panid',
'right-markbotedits' => 'Markaan dagiti napasubli nga urnos a kas inurnos dagiti bot',
'right-noratelimit' => 'Saan a maaringan kadagiti patingga a pagpataray',
@@ -1415,12 +1478,19 @@ Ti esurat a pagtaengam ket saan a maipakita kadagiti agar-aramat nga agkontak ke
'action-userrights-interwiki' => 'urnosen dagiti karbengan ti agar-aramat iti agar-aramat kadagiti sabsabali a wiki',
'action-siteadmin' => 'kandaduan wenno lukatan daytoy "database"',
'action-sendemail' => 'agipatulod kadagiti esurat',
+'action-editmywatchlist' => 'urnosem ti bukodmo a listaan ti banbantayan',
+'action-viewmywatchlist' => 'kitaem ti bukodmo a listaan ti banbantayan',
+'action-viewmyprivateinfo' => 'kitaem ti bukodmo a pribado a pakaammo',
+'action-editmyprivateinfo' => 'urnosem ti bukodmo a pribado a pakaammo',
# Recent changes
'nchanges' => '$1 {{PLURAL:$1|sinukatan|dagiti sinukatan}}',
+'enhancedrc-since-last-visit' => '$1 {{PLURAL:$1|manipud idi naudi a panagsarungkar}}',
+'enhancedrc-history' => 'pakasaritaan',
'recentchanges' => 'Kaudian a balbaliw',
'recentchanges-legend' => 'Pagpilian kadagiti kaudian a balbaliw',
'recentchanges-summary' => 'Siputen dagiti kinaudi a panagbalbaliw ti wiki iti daytoy a panid.',
+'recentchanges-noresult' => 'Awan ti nasuksukatan iti las-ud ti naited a paset ti panawen a kapada dagitoy a kriteria.',
'recentchanges-feed-description' => 'Siputen dagiti kinaudi a panagbalbaliw ti wiki iti daytoy a pakan.',
'recentchanges-label-newpage' => 'Daytoy a panag-urnos ket nakapartuat ti baro a panid',
'recentchanges-label-minor' => 'Daytoy ket bassit a panag-urnos',
@@ -1457,7 +1527,6 @@ Ti esurat a pagtaengam ket saan a maipakita kadagiti agar-aramat nga agkontak ke
'recentchangeslinked-feed' => 'Mainaig a sinukatan',
'recentchangeslinked-toolbox' => 'Mainaig a sinuksukatan',
'recentchangeslinked-title' => 'Sinukatan a mainaig iti "$1"',
-'recentchangeslinked-noresult' => 'Awan ti sinukatan kadagiti naisilpo a pampanid kabayatan ti naited a panawen.',
'recentchangeslinked-summary' => "Listaan daytoy dagiti kaudian a sinukatan kadagiti pampanid a nakasilpo manipud iti maysa a napili a panid (wenno kadagiti kameng ti maysa a nainaganan a kategoria).
Dagiti panid iti [[Special:Watchlist|listaan ti bambantayam]] ket '''napuskol'''.",
'recentchangeslinked-page' => 'Nagan ti panid:',
@@ -1469,7 +1538,7 @@ Dagiti panid iti [[Special:Watchlist|listaan ti bambantayam]] ket '''napuskol'''
'reuploaddesc' => 'Ukasen ti pag-ipan ken agsubli idiay kabuklan ti pag-ipan',
'upload-tryagain' => 'Ited ti napabaro a panagipalawag ti papeles',
'uploadnologin' => 'Saan a nakastrek',
-'uploadnologintext' => 'Masapul a [[Special:UserLogin|nakaserrekka]] tapno makaipanka iti papeles.',
+'uploadnologintext' => 'Nasken ti $1 tapno makaipanka iti papeles.',
'upload_directory_missing' => 'Ti direktorio ti pag-ipan ($1) ket napukaw ken saan a mabalin nga aramiden iti webserver.',
'upload_directory_read_only' => 'Ti pagipanan a direktoria ($1) ket saan a masuratan ti webserver.',
'uploaderror' => 'Biddut ti panang-ipan',
@@ -1692,7 +1761,6 @@ Para iti kangatuan a talinaay, nabaldado ti img_auth.php.',
'http-read-error' => 'Biddut ti panagbasa ti HTTP.',
'http-timed-out' => 'Nagsardeng ti panagkiddaw ti HTTP.',
'http-curl-error' => 'Biddut ti panagala ti URL: $1',
-'http-host-unreachable' => 'Di madanon ti URL',
'http-bad-status' => 'Adda pakirut idi las-ud ti panagkiddaw ti HTTP: $1 $2',
# Some likely curl errors. More could be added from <http://curl.haxx.se/libcurl/c/libcurl-errors.html>
@@ -1723,6 +1791,10 @@ Baka kayatmo a padasen no saan a makumikom nga oras.',
'listfiles_size' => 'Kadakkel',
'listfiles_description' => 'Panagipalpalawag',
'listfiles_count' => 'Dagiti bersion',
+'listfiles-show-all' => 'Iraman dagiti daan a bersion dagiti ladawan',
+'listfiles-latestversion' => 'Agdama a bersion',
+'listfiles-latestversion-yes' => 'Wen',
+'listfiles-latestversion-no' => 'Saan',
# File description page
'file-anchor-link' => 'Papeles',
@@ -1819,6 +1891,13 @@ Laglagipem ti agkita kadagiti sabsabali a silpo ti plantilia sakbay nga ikkatem
'randompage' => 'Pugto a panid',
'randompage-nopages' => 'Awan ti pampanid iti sumaganad a {{PLURAL:$2|nagan ti espasio|nagnagan ti espasio}}: $1.',
+# Random page in category
+'randomincategory' => 'Pugto a panid iti kategoria',
+'randomincategory-invalidcategory' => 'Ti "$1" ket saan nga umisu a nagan ti kategoria.',
+'randomincategory-nopages' => 'Awan ti pampanid iti [[:Category:$1]].',
+'randomincategory-selectcategory' => 'Agala ti pugto a panid manipud ti kategoria: $1 $2.',
+'randomincategory-selectcategory-submit' => 'Inkan',
+
# Random redirect
'randomredirect' => 'Pugto a baw-ing',
'randomredirect-nopages' => 'Awan dagiti baw-ing iti daytoy a nagan ti espasio ti "$1".',
@@ -1844,17 +1923,13 @@ Laglagipem ti agkita kadagiti sabsabali a silpo ti plantilia sakbay nga ikkatem
'statistics-users-active-desc' => 'Dagiti agar-aramat a nagtungpal ti aramid ti napalabas nga {{PLURAL:$1|aldaw|$1 nga al-aldaw}}',
'statistics-mostpopular' => 'Kaaduan a nabuya a pampanid',
-'disambiguations' => 'Dagiti panid a nakasilpo kadagiti panangilawlawag a panid',
-'disambiguationspage' => 'Template:Panangilawlawag',
-'disambiguations-text' => "Dagiti sumaganad a panid ket aglaon ti saan a basbasit ngem maysa a silpo iti '''panangilawlawag a panid'''.
-Dagitoy ket embes a nasken a maisilpoda kadagiti maitutop a panid.<br />
-Ti panid ket matrato a kas panangilawlawag a panid no agusar ti plantilia a nakasilpo manipud idiay [[MediaWiki:Disambiguationspage]].",
-
'pageswithprop' => 'Pampanid nga adda maysa a tagikua ti panid',
'pageswithprop-legend' => 'Pampanid nga adda maysa a tagikua ti panid',
'pageswithprop-text' => 'Daytoy a panid ket ilistana ti pampanid nga agus-usar ti naisangayan a tagikua ti panid.',
'pageswithprop-prop' => 'Nagan ti tagikua:',
'pageswithprop-submit' => 'Inkan',
+'pageswithprop-prophidden-long' => 'atiddog a testo ti tagikua a nailemmeng ($1)',
+'pageswithprop-prophidden-binary' => 'binario a pateg ti tagikua a nailemmeng ($1)',
'doubleredirects' => 'Dagiti namindua a naibaw-ing',
'doubleredirectstext' => 'Daytoy a panid ket ilistana dagiti panid nga agbaw-ing kadagiti sabsabali a baw-ing a pampanid.
@@ -1913,6 +1988,7 @@ Tattan ket naibaw-ing idiay [[$2]].',
'mostrevisions' => 'Dagiti artikulo a kaaduan ti pannakabalbaliwna',
'prefixindex' => 'Dagiti amin a panid nga addaan iti pasaruno',
'prefixindex-namespace' => 'Amin a panid nga addaan ti pasaruno ($1 a nagan ti espasio)',
+'prefixindex-strip' => 'Ikkaten ti pasaruno iti listaan',
'shortpages' => 'Dagiti ababa a panid',
'longpages' => 'Dagiti atiddog a panid',
'deadendpages' => 'Dagiti ngudo a panid',
@@ -1928,6 +2004,7 @@ Tattan ket naibaw-ing idiay [[$2]].',
'listusers' => 'Listaan dagiti agar-aramat',
'listusers-editsonly' => 'Ipakita laeng dagiti agar-aramat nga adda inurnosda',
'listusers-creationsort' => 'Ilasin no ania a petsa ti pannakaaramid',
+'listusers-desc' => 'Paglalasinen iti agpababa nga urnos',
'usereditcount' => '$1 {{PLURAL:$1|nga inurnos|kadagiti inurnos}}',
'usercreated' => '{{GENDER:$3|Inaramid}} idi $1 idi $2',
'newpages' => 'Baro a pampanid',
@@ -2104,10 +2181,9 @@ Dagiti masakbayan a panagsukat iti daytoy a panid ken dagiti mainaig a tungtunga
'unwatchthispage' => 'Isardeng a bantayan daytoy a panid',
'notanarticle' => 'Saan a naglaon a panid',
'notvisiblerev' => 'Ti panagbalbaliw ti sabali nga agar-aramat ket naikkaten',
-'watchnochange' => 'Awan dagiti binambantayam ket naurnos dita panawen a naipakita.',
'watchlist-details' => '{{PLURAL:$1|$1 panid|$1 dagiti panid}} a bambantayam, saan a mairaman dagiti panid ti tungtungan.',
-'wlheader-enotif' => '* Napakabaelan ti pakiammo ti esurat.',
-'wlheader-showupdated' => "* Dagiti panid a nasukatan manipud ti kinaudi a panagsarungkarmo ket naipakita iti '''napuskol'''",
+'wlheader-enotif' => 'Napakabaelan ti panangipakaammo ti esurat.',
+'wlheader-showupdated' => "Dagiti panid a nasukatanen manipud ti kinaudi a panagsarungkarmo ket naipakita iti '''napuskol'''",
'watchmethod-recent' => 'kitkitaen dagiti kinaudi nga inurnos kadagiti bambantayan a panid',
'watchmethod-list' => 'kitkitaen dagiti bambantayan a panid kadagiti kinaudi nga inurnos',
'watchlistcontains' => 'Ti listaan ti bambantayam ket aglaon ti $1 {{PLURAL:$1|a panid|a pampanid}}.',
@@ -2361,7 +2437,7 @@ $1',
'contributions' => 'Naar-aramid ti {{GENDER:$1|Agar-aramat}}',
'contributions-title' => 'Inar-aramid ti agar-aramat para kenni $1',
'mycontris' => 'Naar-aramid',
-'contribsub2' => 'Para iti $1 ($2)',
+'contribsub2' => 'Para kenni {{GENDER:$3|$1}} ($2)',
'nocontribs' => 'Awan ti nasarakan a nasukatan a kapada daytoy a kita.',
'uctop' => '(agdama)',
'month' => 'Manipud iti bulan ti (ken nasapsapa pay):',
@@ -2520,15 +2596,13 @@ Kitaen ti [[Special:BlockList|Listaan ti lapden nga IP]] para iti listaan kadagi
Ngem, nupay kasta, naserran a kas paset ti sakup ti $2, a mabalin a malukatan ti serrana.',
'ip_range_invalid' => 'Imbalido a sakup ti IP.',
'ip_range_toolarge' => 'Dagiti serra a nasakup a dakdakkel ngem /$1 ket saan a maipalubos.',
-'blockme' => 'Serraannak',
'proxyblocker' => 'Pannakbagi a panagserra',
-'proxyblocker-disabled' => 'Daytoy a panagaramid ket nabaldado.',
'proxyblockreason' => 'Ti IP a pagtaengam ket naserraan ngamin ket daytoy ket nakalukat a panakbagi.
Pangngaasi ta kontakem ti agit-ited ti serbisio ti Internetmo wenno teknikal a suporta ti kaurnusam ken ibagam kaniada ti nakaro a parikut ti seguridad.',
-'proxyblocksuccess' => 'Nalpasen.',
'sorbsreason' => 'Ti IP a pagtaengam ket nakalista a kasla "nalukatan a pannakbagi" idiay DNSBL nga inusar ti {{SITNAME}}.',
'sorbs_create_account_reason' => 'Ti IP a pagtaengam ket nakalista a kasla "nalukatan a pannakbagi" idiay DNSBL nga inusar ti {{SITNAME}}.
Saanka a makaaramid ti pakabilangan',
+'xffblockreason' => 'Ti maysa nga IP a pagtaengan nga adda iti X-Forwarded-For header, mabalin a kukuam wenno ti pannakbagi a server nga us-usarem, ket naserraan. Ti kasisigud a rason ti pannakaserra idi ket: $1',
'cant-block-while-blocked' => 'Saanmo a maserraan dagiti sabali nga agar-aramat no naserraanka met.',
'cant-see-hidden-user' => 'Ti agar-aramat a kayatmo a serraan ket naserraan ken nailemmeng.
Ket awan met ti karbengam nga agilemming ti agar-aramat, saan mo a makita wenno mabaliwan ti serra ti agar-aramat.',
@@ -2695,6 +2769,8 @@ Pangngaasi a bisitaen ti [//www.mediawiki.org/wiki/Localisation Lokalisasion ti
'thumbnail-more' => 'Padakkelen',
'filemissing' => 'Napukaw ti papeles',
'thumbnail_error' => 'Biddut ti panagaramid ti bassit a ladawan: $1',
+'thumbnail_error_remote' => 'Biddut a mensahe manipud ti $1:
+$2',
'djvu_page_error' => 'Ti DjVu a panid ket saan a nasakup',
'djvu_no_xml' => 'Saan a naala ti XML iti DjVu a papeles',
'thumbnail-temp-create' => 'Saan a makaaramid ti temporario a bassit a ladawan ti papeles',
@@ -2991,11 +3067,25 @@ No usarem daytoy, baka makompromiso ti sistema.",
'minutes' => '{{PLURAL:$1|$1 minuto|$1 minutos}}',
'hours' => '{{PLURAL:$1|$1 nga oras|$1 nga or-oras}}',
'days' => '{{PLURAL:$1|$1 nga aldaw|$1 nga al-aldaw}}',
+'weeks' => '{{PLURAL:$1|$1 a lawas|$1 a law-lawas}}',
'months' => '{{PLURAL:$1|$1 a bulan|$1 a bulbulan}}',
'years' => '{{PLURAL:$1|$1 a tawen|$1 a tawtawen}}',
'ago' => '$1 nagtapos',
'just-now' => 'tatta laeng',
+# Human-readable timestamps
+'hours-ago' => '$1 nga {{PLURAL:$1|oras|or-oras}} ti napalabas',
+'minutes-ago' => '$1 a {{PLURAL:$1|minuto|minutos}} ti napalabas',
+'seconds-ago' => '$1 a {{PLURAL:$1|segundo|seg-segundo}} ti napalabas',
+'monday-at' => 'Lunes idiay $1',
+'tuesday-at' => 'Martes idiay $1',
+'wednesday-at' => 'Mierkoles idiay $1',
+'thursday-at' => 'Huebes idiay $1',
+'friday-at' => 'Biernes idiay $1',
+'saturday-at' => 'Sabado idiay $1',
+'sunday-at' => 'Dominggo idiay $1',
+'yesterday-at' => 'Idi kalman idiay $1',
+
# Bad image list
'bad_image_list' => 'Ti kinabuklan ket kas iti sumaganad:
@@ -3025,7 +3115,7 @@ Dagiti dadduma ket mailemmeng a kinasigud.
* gpslongitude
* gpsaltitude',
-# EXIF tags
+# Exif tags
'exif-imagewidth' => 'Kaakaba',
'exif-imagelength' => 'Katayag',
'exif-bitspersample' => 'Dagiti bit tunggal maysa a komponente',
@@ -3202,7 +3292,7 @@ Dagiti dadduma ket mailemmeng a kinasigud.
'exif-originalimageheight' => 'Kangato ti imahen sakbay nga naputed',
'exif-originalimagewidth' => 'Kalawa ti imahen sakbay nga naputed',
-# EXIF attributes
+# Exif attributes
'exif-compression-1' => 'Saan a napespes',
'exif-copyrighted-true' => 'Nakarbengan a kopia',
@@ -3593,7 +3683,6 @@ Mabalinmo pay nga [[Special:EditWatchlist|usaren ti dati a panagurnos]].',
'version-other' => 'Sabali',
'version-mediahandlers' => 'Agtengtengngel kadagiti midia',
'version-hooks' => 'Dagiti kawit',
-'version-extension-functions' => 'Dagiti pagpaatiddog a pamay-an',
'version-parser-extensiontags' => 'Dagiti parser a pagpaatiddog nga etiketa',
'version-parser-function-hooks' => 'Parser a pamay-an dagiti kawit',
'version-hook-name' => 'Nagan ti kawit',
@@ -3602,6 +3691,7 @@ Mabalinmo pay nga [[Special:EditWatchlist|usaren ti dati a panagurnos]].',
'version-license' => 'Lisensia',
'version-poweredby-credits' => "Daytoy a wiki ket pinaandar ti '''[//www.mediawiki.org/ MediaWiki]''', karbengan a kopia © 2001-$1 $2.",
'version-poweredby-others' => 'dadduma pay',
+'version-poweredby-translators' => 'agipatpatarus ti translatewiki.net',
'version-credits-summary' => 'Kayatmi koma a pammadayawan dagiti sumaganad a tao para kadagiti inparawadda iti [[Special:Version|MediaWiki]].',
'version-license-info' => 'Ti MediaWiki ket nawaya a sopwer; maiwarasmo ken/wenno mabaliwam babaen ti banag iti GNU General Public License a naipablaak babaen ti Free Software Foundation; nupay iti bersion 2 iti Lisensia, wenno (ti panagpilim) ti aniaman a bersion.
@@ -3615,12 +3705,17 @@ Naka-awatka koman ti [{{SERVER}}{{SCRIPTPATH}}/COPYING kopia iti GNU Sapasap a
'version-entrypoints-header-entrypoint' => 'Pagserrekan a puntos',
'version-entrypoints-header-url' => 'URL',
-# Special:FilePath
-'filepath' => 'Dalanan ti papeles',
-'filepath-page' => 'Papeles:',
-'filepath-submit' => 'Inkan',
-'filepath-summary' => 'Daytoy nga espesial a panid ket agisubli ti kompleto a dalan ti papeles.
-Dagiti imahen ket agparang iti kadakkelan a resolusion, dagiti sabali a kita ti papeles ket dagus a mangrugida idiay nakairamananda a programa.',
+# Special:Redirect
+'redirect' => 'Ibaw-ing babaen ti papeles, agar-aramat, wenno ID ti panagbaliw',
+'redirect-legend' => 'Ibaw-ing iti papeles wenno panid',
+'redirect-summary' => 'Daytoy nga espesial a panid ket maibaw-ing iti papeles (iti nagan ti papeles), ti panid (iti ID ti panagbaliw), wenno ti panid ti agar-aramat (iti numeriko nga ID ti agar-aramat).',
+'redirect-submit' => 'Inkan',
+'redirect-lookup' => 'Kitaen:',
+'redirect-value' => 'Pateg:',
+'redirect-user' => 'ID ti agar-aramat',
+'redirect-revision' => 'Panagbaliw ti panid',
+'redirect-file' => 'Nagan ti papeles',
+'redirect-not-exists' => 'Saan a nabirukan ti pateg',
# Special:FileDuplicateSearch
'fileduplicatesearch' => 'Agbiruk kadagiti duplikado a papeles',
@@ -3669,12 +3764,16 @@ Dagiti imahen ket agparang iti kadakkelan a resolusion, dagiti sabali a kita ti
'tags' => 'Umisu a sukatan dagiti etiketa',
'tag-filter' => '[[Special:Tags|Ti etiketa]] a sagat:',
'tag-filter-submit' => 'Sagat',
+'tag-list-wrapper' => '([[Special:Tags|{{PLURAL:$1|Etiketa|Et-etiketa}}]]: $2)',
'tags-title' => 'Dagiti etiketa',
'tags-intro' => 'Daytoy a panid ket ilistana dagiti etiketa nga usaren ti sopwer nga agmarka ti panag-urnos, ken dagiti kaibuksilanda.',
'tags-tag' => 'Nagan ti etiketa',
'tags-display-header' => 'Tabas dagiti listaan ti panagsukat',
'tags-description-header' => 'Napno a panangipalpalawag iti kayatna a saoen.',
+'tags-active-header' => 'Aktibo?',
'tags-hitcount-header' => 'Dagiti etiketa a sinukatan',
+'tags-active-yes' => 'Wen',
+'tags-active-no' => 'Saan',
'tags-edit' => 'urnosen',
'tags-hitcount' => '$1 {{PLURAL:$1|a sinukatan|kadagiti sinukatan}}',
@@ -3695,6 +3794,7 @@ Dagiti imahen ket agparang iti kadakkelan a resolusion, dagiti sabali a kita ti
'dberr-problems' => 'Pasensian a! Daytoy a pagsaadan ket agdadama ti teknikal a pagrigrigatan.',
'dberr-again' => 'Padasem ti agururay to manu a minutos ken agikarga.',
'dberr-info' => '(Saan a makontak ti database server: $1)',
+'dberr-info-hidden' => '(Saan a makontak ti database server)',
'dberr-usegoogle' => 'Padasem ti agbiruk idiay Google tatta.',
'dberr-outofdate' => 'Palagip a dagiti listaan da kadagiti kukuami a nagyan ket baka nagpaso.',
'dberr-cachederror' => 'Daytoy ket naidulin a kopia ti kiniddawmo a panid, ken mabalin a saan a kabarbaro.',
@@ -3710,6 +3810,9 @@ Dagiti imahen ket agparang iti kadakkelan a resolusion, dagiti sabali a kita ti
'htmlform-submit' => 'Ited',
'htmlform-reset' => 'Ibabawi ti sinukatan',
'htmlform-selectorother-other' => 'Sabali',
+'htmlform-no' => 'Saan',
+'htmlform-yes' => 'Wen',
+'htmlform-chosen-placeholder' => 'Agpili ti pagpilian',
# SQLite database support
'sqlite-has-fts' => '$1 adda ti suporta ti napno a testo ti panagbiruk',
@@ -3827,4 +3930,19 @@ Nupay kasta, mau-sarmo ti nakabuklan dita baba. Ti komentario nga itedmo ket mai
# Image rotation
'rotate-comment' => 'Ti ladawan ket napusipos babaen ti $1 {{PLURAL:$1|a degrado|a degdegrado}} nga agpakanawan',
+# Limit report
+'limitreport-title' => 'Panagbariweswes a datos ti parser:',
+'limitreport-cputime' => 'Panagusar nga oras ti CPU',
+'limitreport-cputime-value' => '$1 {{PLURAL:$1|segundo|seg-segundo}}',
+'limitreport-walltime' => 'Pudno nga oras a panagusar',
+'limitreport-walltime-value' => '$1 {{PLURAL:$1|segundo|seg-segundo}}',
+'limitreport-ppvisitednodes' => 'Nabisita a bilang ti nodo ti preproseso',
+'limitreport-ppgeneratednodes' => 'Napataud a bilang ti nodo ti preproseso',
+'limitreport-postexpandincludesize' => 'Pannakairaman a kadakkel ti kalpasan a panagpadakkel',
+'limitreport-postexpandincludesize-value' => '$1/$2 {{PLURAL:$2|a byte|kadagiti byte}}',
+'limitreport-templateargumentsize' => 'Argumento a kadakkel ti plantilia',
+'limitreport-templateargumentsize-value' => '$1/$2 {{PLURAL:$2|a byte|kadagiti byte}}',
+'limitreport-expansiondepth' => 'Kangatuan a panagpadakkel ti kauneg',
+'limitreport-expensivefunctioncount' => 'Bilang ti nangina nga annong ti parser',
+
);
diff --git a/languages/messages/MessagesInh.php b/languages/messages/MessagesInh.php
index 6a603dc7..0626ea7f 100644
--- a/languages/messages/MessagesInh.php
+++ b/languages/messages/MessagesInh.php
@@ -48,9 +48,6 @@ $messages = array(
'tog-shownumberswatching' => 'Ший теркама дагарленгах оагӀув чулаьца бола дакъалаьцархой таьрах хьахьокха',
'tog-oldsig' => 'Дола кулгайоазув:',
'tog-fancysig' => 'Ший кулга Ñздара маÑÑахоамбаккхам (ший лоӀаме Ӏинка йоацаш)',
-'tog-externaleditor' => 'Ðрена гӀалатнийÑдарца болх бе (ший болх ховш болачара мара мегаш дац, хьамлоархIара ший-тайпара оттам Ñша; [//www.mediawiki.org/wiki/Manual:External_editors хьажа Ñша])',
-'tog-externaldiff' => 'Ðрена бӀаÑакхоÑÑа болхоагӀувца болх бе (ший болх ховш болачара мара мегаш дац, хьамлоархIара ший-тайпара оттам Ñша; [//www.mediawiki.org/wiki/Manual:External_editors хьажа Ñша])',
-'tog-showjumplinks' => '"Дехьадала" Ñха новкъоÑтала Ӏинк хьахьокха',
'tog-uselivepreview' => 'Сиха бӀарахьажар (JavaScript) (ЭкÑпериментально)',
'tog-forceeditsummary' => 'Хоам бе, хувцамий лоацам белгал даь деце',
'tog-watchlisthideown' => 'Са хувцамаш теркама дагарчера къайладаккха',
@@ -238,7 +235,7 @@ $messages = array(
'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).
+# 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).
'aboutsite' => 'Лоацам {{SITENAME}}',
'aboutpage' => 'Project:Лоацам',
'copyright' => '$1 чулоацамаца тIакхоачаш да.',
@@ -248,7 +245,6 @@ $messages = array(
'disclaimers' => 'Бокъонах юхавалаp',
'disclaimerpage' => 'Project:Бокъонах юхавалаp',
'edithelp' => 'Хувцама куцтохкам',
-'edithelppage' => 'Help:ГӀалатнийÑдар',
'helppage' => 'Help:Чулоацам',
'mainpage' => 'Кертера оагӀув',
'mainpage-description' => 'Кертера оагӀув',
@@ -523,7 +519,6 @@ $messages = array(
'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' => 'Медифаг',
@@ -557,9 +552,6 @@ $messages = array(
'powersearch-toggleall' => 'Деррига',
'powersearch-togglenone' => 'Цхьаккха',
-# Quickbar
-'qbsettings-none' => 'Цхьаккха',
-
# Preferences page
'preferences' => 'Оттамаш',
'mypreferences' => 'Оттамаш',
@@ -679,7 +671,6 @@ $messages = array(
'recentchangeslinked-feed' => 'Гаргалон хувцамаш',
'recentchangeslinked-toolbox' => 'Гаргалон хувцамаш',
'recentchangeslinked-title' => '$1ца хьалаьца хувцамаш',
-'recentchangeslinked-noresult' => 'Укх заманашка гаргарон оагIувнаш Ñ‚Iа хувцамаш хиннаÑц.',
'recentchangeslinked-summary' => "Ер, Iинк ÑÑŒ йола оагIув (е укх цатегачу чуйоагIараш), дукха ха йоацаш хьийца оагIувнашкий дагарле Ñ.
[[Special:Watchlist|Шун теркама дагарленашках]] чуйоагIа оагIувнаш '''белгалаÑÑŒ Ñ'''.",
'recentchangeslinked-page' => 'ОагIува цIи',
@@ -749,8 +740,6 @@ $messages = array(
'statistics' => 'Дагара куц',
'statistics-pages' => 'ОагIувнаш',
-'disambiguationspage' => 'Template: ЦаI маIандоацар',
-
'brokenredirects-edit' => 'хувца',
'brokenredirects-delete' => 'дIадаккха',
@@ -920,8 +909,6 @@ $messages = array(
'blocklogentry' => '[[$1]] чIега белаб, $2 $3 ха Ñлалца',
'unblocklogentry' => '$1 юха ÑÑта Ñ',
'block-log-flags-nocreate' => 'ЛархIамий дагарчена цIи Ñьккхар пурам Ñнза Ñ.',
-'blockme' => 'ЧIега бола Ñона',
-'proxyblocksuccess' => 'Хьадаьд.',
# Move page
'move-page-legend' => 'ОагIува цIи хувца',
@@ -1073,7 +1060,7 @@ $messages = array(
* gpslongitude
* gpsaltitude',
-# EXIF tags
+# Exif tags
'exif-imagewidth' => 'Шерал',
'exif-imagelength' => 'Лакхал',
'exif-imagedescription' => 'Сурта цIи',
@@ -1133,11 +1120,6 @@ $messages = array(
'version-version' => '(Доржам $1)',
'version-software-version' => 'Доржам',
-# Special:FilePath
-'filepath' => 'Паьлачу никъ',
-'filepath-page' => 'Паьл:',
-'filepath-submit' => 'Дехьа гӀо',
-
# Special:FileDuplicateSearch
'fileduplicatesearch-filename' => 'ПаьлацIи:',
'fileduplicatesearch-submit' => 'Лаха',
diff --git a/languages/messages/MessagesIo.php b/languages/messages/MessagesIo.php
index 8b2f4909..599890c4 100644
--- a/languages/messages/MessagesIo.php
+++ b/languages/messages/MessagesIo.php
@@ -138,7 +138,6 @@ $messages = array(
'tog-enotifrevealaddr' => 'Montrez mea e-posto adreso en notifiko e-posti',
'tog-shownumberswatching' => 'Montrez nombro di surveyanta uzanti',
'tog-fancysig' => 'Traktez signaturo kom wikikodo (sen automata ligilo)',
-'tog-externaleditor' => 'Uzez extera redaktanto nespecigite (nur por experti, bezonas specala moderi ye vua komputoro .[//www.mediawiki.org/wiki/Manual:External_editors Plusa informo.])',
'tog-forceeditsummary' => 'Notifikez me kande skribanta vakua redakto-rezumo',
'tog-watchlisthideown' => 'Celez mea redaktaji de la surveyaji',
'tog-watchlisthidebots' => 'Celez redaktaji da roboti de la surveyaji',
@@ -308,7 +307,7 @@ $messages = array(
'jumptonavigation' => 'pilotado',
'jumptosearch' => 'serchez',
-# 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).
+# 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).
'aboutsite' => 'Pri {{SITENAME}}',
'aboutpage' => 'Project:Pri {{SITENAME}}',
'copyright' => 'La kontenajo esas disponebla sub $1.',
@@ -318,7 +317,6 @@ $messages = array(
'disclaimers' => 'Legala averto',
'disclaimerpage' => 'Project:Generala des-agnosko',
'edithelp' => 'Helpo pri redaktado',
-'edithelppage' => 'Help:Redaktado',
'helppage' => 'Help:Helpo',
'mainpage' => 'Frontispico',
'mainpage-description' => 'Frontispico',
@@ -469,7 +467,7 @@ Voluntez enirar altrafoye pos recevar ol.',
'newpassword' => 'Nova pasovorto:',
'retypenew' => 'Riskribez la nova pasovorto:',
'resetpass_submit' => 'Establisez pasovoro ed enirez',
-'resetpass_success' => 'Vua chanjo di pasovorto sucesis! Nun, vu eniras...',
+'changepassword-success' => 'Vua chanjo di pasovorto sucesis! Nun, vu eniras...',
'resetpass-submit-loggedin' => 'Chanjar pasovorto',
'resetpass-temp-password' => 'Provizora pasovorto:',
@@ -658,7 +656,6 @@ Surskriburo: '''({{int:cur}})''' = diferi kun l'aktuala versiono,
'nextn-title' => 'Sequanta $1 {{PLURAL:$1|rezultajo|rezultaji}}',
'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''",
@@ -690,10 +687,6 @@ Probez prefixizar vua demando kun ''all:'' por serchar omna kontenajo (inkluzant
'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"',
-'qbsettings-none' => 'Nula',
-
# Preferences page
'preferences' => 'Preferaji',
'mypreferences' => 'Preferaji',
@@ -944,8 +937,6 @@ Volutez kontrolar <strong>[[:$1]]</strong> se vu ne esas certa pri chanjar olu.
'statistics-pages' => 'Pagini',
'statistics-mostpopular' => 'Maxim ofte vizitita pagini',
-'disambiguations' => 'Pagini di desambiguizo',
-
'doubleredirects' => 'Duopla ridirektili',
'brokenredirects' => 'Ridirektili nekorekta',
@@ -1073,7 +1064,6 @@ Volutez kontrolar <strong>[[:$1]]</strong> se vu ne esas certa pri chanjar olu.
'unwatch' => 'Ne plus surveyar',
'unwatchthispage' => 'Ne plus surveyar',
'notanarticle' => 'Ne esas artiklo',
-'watchnochange' => 'Nula artikli ek vua listo di surveyaji redaktesis dum la tempo montrata.',
'watchmethod-recent' => 'serchante recenta chanji en la listo di surveyaji',
'watchmethod-list' => 'serchante recenta redakti en la listo di surveyaji',
'watchlistcontains' => 'Vua listo di surveyaji kontenas $1 {{PLURAL:$1|pagino|pagini}}.',
@@ -1256,7 +1246,6 @@ Videz [[Special:BlockList|IP-blokuslisto]] por revizor blokusadi.',
'unblocklogentry' => 'desblokusis "$1"',
'ipb_expiry_invalid' => 'Nevalida expiro-tempo.',
'ip_range_invalid' => 'Nevalida IP-rango.',
-'proxyblocksuccess' => 'Facita.',
# Developer tools
'lockdb' => 'Blokusar datumaro',
@@ -1428,7 +1417,7 @@ Vu darfos adjuntar kauso en la rezumo.',
# Metadata
'metadata' => 'Metadonaji',
-# EXIF tags
+# Exif tags
'exif-imagewidth' => 'Larjeso',
'exif-imagelength' => 'Alteso',
'exif-artist' => 'Autoro',
@@ -1529,9 +1518,6 @@ Vu darfos adjuntar kauso en la rezumo.',
'version-software-product' => 'Produkturo',
'version-software-version' => 'Versiono',
-# Special:FilePath
-'filepath-page' => 'Arkivo:',
-
# Special:FileDuplicateSearch
'fileduplicatesearch-submit' => 'Serchar',
diff --git a/languages/messages/MessagesIs.php b/languages/messages/MessagesIs.php
index fc441f6b..86b82817 100644
--- a/languages/messages/MessagesIs.php
+++ b/languages/messages/MessagesIs.php
@@ -263,9 +263,6 @@ $messages = array(
'tog-shownumberswatching' => 'Sýna fjölda vaktandi notenda',
'tog-oldsig' => 'Núverandi undirskrift:',
'tog-fancysig' => 'Meðhöndla undirskrift sem wikimál (án sjálfvirks tengils)',
-'tog-externaleditor' => 'Nota utanaðkomandi ritil sjálfgefið (eingöngu fyrir reynda, þarfnast sérstakra stillinga á tölvunni þinni. [//www.mediawiki.org/wiki/Manual:External_editors Frekari upplýsingar.])',
-'tog-externaldiff' => 'Nota utanaðkomandi mismun sjálfgefið (eingöngu fyrir reynda, þarfnast sérstakra stillinga á tölvunni þinni. [//www.mediawiki.org/wiki/Manual:External_editors Frekari upplýsingar.])',
-'tog-showjumplinks' => 'Virkja „stökkva á“ aðgengitengla',
'tog-uselivepreview' => 'Nota beina forskoðun (JavaScript) (à tilraunastigi)',
'tog-forceeditsummary' => 'Birta áminningu þegar breytingarágripið er tómt',
'tog-watchlisthideown' => 'Ekki sýna mínar breytingar á vaktlistanum',
@@ -278,6 +275,7 @@ $messages = array(
'tog-diffonly' => 'Ekki sýna síðuefni undir mismunum',
'tog-showhiddencats' => 'Sýna falda flokka',
'tog-norollbackdiff' => 'Sleppa breytingu eftir að endurvakning síðu hefur verið gerð.',
+'tog-useeditwarning' => 'Vara mig við þegar ég fer frá breytingarsíðu með óvistaðar breytingar',
'underline-always' => 'Alltaf',
'underline-never' => 'Aldrei',
@@ -341,6 +339,18 @@ $messages = array(
'oct' => 'okt',
'nov' => 'nóv',
'dec' => 'des',
+'january-date' => '$1. janúar',
+'february-date' => '$1. febrúar',
+'march-date' => '$1. mars',
+'april-date' => '$1. apríl',
+'may-date' => '$1. maí',
+'june-date' => '$1. júní',
+'july-date' => '$1. júlí',
+'august-date' => '$1. ágúst',
+'september-date' => '$1. september',
+'october-date' => '$1. október',
+'november-date' => '$1. nóvember',
+'december-date' => '$1. desember',
# Categories related messages
'pagecategories' => '{{PLURAL:$1|Flokkur|Flokkar}}',
@@ -361,7 +371,7 @@ $messages = array(
'noindex-category' => 'Óraðaðar skrár',
'broken-file-category' => 'Síður með brotna myndatengla',
-'linkprefix' => '/^(.*?)([áÃðÃéÉíÃóÓúÚýÃþÞæÆöÖA-Za-z-–]+)$/sDu',
+'linkprefix' => '/^((?>.*(?<![áÃðÃéÉíÃóÓúÚýÃþÞæÆöÖA-Za-z-–])))(.+)$/sDu',
'about' => 'Um',
'article' => 'Efnissíða',
@@ -424,6 +434,7 @@ $messages = array(
'create-this-page' => 'Skapa þessari síðu',
'delete' => 'Eyða',
'deletethispage' => 'Eyða þessari síðu',
+'undeletethispage' => 'Endurvekja þessa síðu',
'undelete_short' => 'Endurvekja {{PLURAL:$1|eina breytingu|$1 breytingar}}',
'viewdeleted_short' => 'Skoða {{PLURAL:$1|eina eydda breytingu|$1 eyddar breytingar}}',
'protect' => 'Vernda',
@@ -467,7 +478,7 @@ $1',
'pool-queuefull' => 'Vefþjónninn er yfirhlaðinn í augnablikinu.',
'pool-errorunknown' => 'Óþekkt villa',
-# 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).
+# 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).
'aboutsite' => 'Um {{SITENAME}}',
'aboutpage' => 'Project:Um verkefnið',
'copyright' => 'Efni má nota samkvæmt $1.',
@@ -477,7 +488,6 @@ $1',
'disclaimers' => 'Fyrirvarar',
'disclaimerpage' => 'Project:Almennur fyrirvari',
'edithelp' => 'Breytingarhjálp',
-'edithelppage' => 'Help:Breyta',
'helppage' => 'Help:Efnisyfirlit',
'mainpage' => 'Forsíða',
'mainpage-description' => 'Forsíða',
@@ -553,17 +563,6 @@ Sjá [[Special:Version|útgáfusíðuna]].',
# General errors
'error' => 'Villa',
'databaseerror' => 'Gagnagrunnsvilla',
-'dberrortext' => 'Málfræðivilla kom upp í gangagrnunsfyrirspurninni.
-Þetta gæti verið vegna villu í hugbúnaðinum.
-Síðasta gagnagrunnsfyrirspurnin var:
-<blockquote><code>$1</code></blockquote>
-úr aðgerðinni: „<code>$2</code>".
-MySQL skilar villuboðunum „<samp>$3: $4</samp>".',
-'dberrortextcl' => 'Málfræðivilla kom upp í gangagrnunsfyrirspurninni.
-Síðasta gagnagrunnsfyrirspurnin var:
-„$1“
-úr aðgerðinni: „$2“.
-MySQL skilar villuboðanum „$3: $4“',
'laggedslavemode' => 'Viðvörun: Síðan inniheldur ekki nýjustu uppfærslur.',
'readonly' => 'Gagnagrunnur læstur',
'enterlockreason' => 'Gefðu fram ástæðu fyrir læsingunni, og einnig áætlun
@@ -618,12 +617,13 @@ Til þess að bæta við eða breyta þýðingum fyrir öll wiki verkefni, vinsa
'editinginterface' => "'''Aðvörun:''' Þú ert að breyta síðu sem hefur að geyma texta fyrir notendaumhverfi hugbúnaðarins.
Breytingar á þessari síðu munu hafa áhrif á notendaumhverfi annarra notenda á þessu vefsvæði.
Til þess að bæta við eða breyta þýðingum fyrir öll wiki verkefni, vinsamlegast notaðu [//translatewiki.net/wiki/Main_Page?setlang=is translatewiki.net], staðfæringaverkefni MediaWiki.",
-'sqlhidden' => '(SQL-fyrirspurn falin)',
'cascadeprotected' => 'Þessi síða hefur verið vernduð fyrir breytingum, vegna þess að hún er innifalin í eftirfarandi {{PLURAL:$1|síðu, sem er vernduð|síðum, sem eru verndaðar}} með „keðjuverndun“:
$2',
'namespaceprotected' => "Þú hefur ekki leyfi til að breyta síðum í '''$1''' nafnrýminu.",
'customcssprotected' => 'Þú hefur ekki leyfi að breyta þessari CSS-umbrotsíðu, því hún hefur notendastillingar annars notanda.',
'customjsprotected' => 'Þú hefur ekki leyfi til að breyta þessari JavaScript síðu, því hún hefur notendastillingar annars notanda.',
+'mycustomcssprotected' => 'Þú hefur ekki leyfi til þess að breyta þessari CSS-síðu.',
+'mycustomjsprotected' => 'Þú hefur ekki leyfi til þess að breyta þessari JavaScript-síðu.',
'ns-specialprotected' => 'Kerfissíðum er ekki hægt að breyta.',
'titleprotected' => "Þessi titill hefur verið verndaður fyrir sköpun af [[User:$1|$1]].
Ãstæðan sem gefin var ''$2''.",
@@ -649,10 +649,18 @@ Athugaðu að sumar síður kunna að birtast líkt og þú sért ennþá skráÃ
'welcomecreation-msg' => 'Aðgangurinn þinn hefur verið búinn til.
Ekki gleyma að breyta [[Special:Preferences|{{SITENAME}} stillingunum]] þínum.',
'yourname' => 'Notandanafn:',
+'userlogin-yourname' => 'Notandanafn',
+'userlogin-yourname-ph' => 'Skrifaðu inn notendanafnið þitt',
'yourpassword' => 'Lykilorð:',
+'userlogin-yourpassword' => 'Lykilorð',
+'userlogin-yourpassword-ph' => 'Skrifaðu niður lykilorðið þitt',
+'createacct-yourpassword-ph' => 'Skrifaðu niður lykilorð',
'yourpasswordagain' => 'Endurrita lykilorð:',
+'createacct-yourpasswordagain' => 'Staðfestu lykilorðið',
+'createacct-yourpasswordagain-ph' => 'Sláðu inn lykilorðið aftur',
'remembermypassword' => 'Muna innskráninguna mína í þessum vafra (í allt að $1 {{PLURAL:$1|dag|daga}})',
-'securelogin-stick-https' => 'Halda öllum samskiptum áfram yfir HTTPS eftir að þú skráir þig inn',
+'userlogin-remembermypassword' => 'Muna innskráningu mína',
+'userlogin-signwithsecure' => 'Nota örugga tengingu',
'yourdomainname' => 'Þitt lén:',
'password-change-forbidden' => 'Þú getur ekki breytt lykilorðum á þessum wiki.',
'externaldberror' => 'Uppfærsla mistókst. Annaðhvort varð villa í gagnasafninu eða að þér sé óheimilt að uppfæra aðra aðganga.',
@@ -664,18 +672,38 @@ Ekki gleyma að breyta [[Special:Preferences|{{SITENAME}} stillingunum]] þínum
'logout' => 'Útskráning',
'userlogout' => 'Útskrá',
'notloggedin' => 'Ekki innskráð(ur)',
+'userlogin-noaccount' => 'Ãttu ekki aðgang?',
+'userlogin-joinproject' => 'Sameina {{SITENAME}}',
'nologin' => 'Ekki með aðgang? $1.',
'nologinlink' => 'Stofnaðu aðgang',
'createaccount' => 'Nýskrá',
'gotaccount' => "Nú þegar með notandanafn? '''$1'''.",
'gotaccountlink' => 'Skráðu þig inn',
'userlogin-resetlink' => 'Gleymdir þú notendaupplýsingunum þínum?',
+'userlogin-resetpassword-link' => 'Endursetja lykilorð',
+'helplogin-url' => 'Help:Innskráning',
+'userlogin-helplink' => '[[{{MediaWiki:helplogin-url}}|Hjálp við innskráningu]]',
+'createacct-join' => 'Sláðu inn þínar upplýsingar fyrir neðan.',
+'createacct-emailrequired' => 'Netfang',
+'createacct-emailoptional' => 'Netfang (valfrjálst)',
+'createacct-email-ph' => 'Skrifaðu niður netfangið þitt',
'createaccountmail' => 'Nota handahófsvalið bráðabirgðalykilorð og senda það á netfangið sem er tilgreint hér fyrir neðan',
+'createacct-realname' => 'Raunverulegt nafn (valfrjálst)',
'createaccountreason' => 'Ãstæða:',
+'createacct-reason' => 'Ãstæða',
+'createacct-reason-ph' => 'Afhverju ertu að búa til annan aðgang',
+'createacct-captcha' => 'Öryggis athugun',
+'createacct-imgcaptcha-ph' => 'Sláðu inn textann að ofan',
+'createacct-submit' => 'Búa til aðganginn',
+'createacct-benefit-heading' => '{{SITENAME}} er skrifuð af fólki eins og þér.',
+'createacct-benefit-body1' => '{{PLURAL:$1|breyting|breytingar}}',
+'createacct-benefit-body2' => '{{PLURAL:$1|síða|síður}}',
+'createacct-benefit-body3' => '{{PLURAL:$1|nýlegur stuðningsaðili|nýlegir stuðningsaðilar}}',
'badretype' => 'Lykilorðin sem þú skrifaðir eru ekki eins.',
'userexists' => 'Þetta notandanafn er þegar í notkun.
Vinsamlegast veldu þér annað.',
'loginerror' => 'Innskráningarvilla',
+'createacct-error' => 'Stofnun aðgangs mistókst',
'createaccounterror' => 'Gat ekki búið til notanda: $1',
'nocookiesnew' => 'Innskráningin var búin til, en þú ert ekki skráð(ur) inn.
{{SITENAME}} notar vefkökur til að skrá inn notendur.
@@ -756,7 +784,7 @@ Til að klára að skrá þig inn, verður þú að endurstilla lykilorðið hé
'newpassword' => 'Nýja lykilorðið',
'retypenew' => 'Endurtaktu nýja lykilorðið:',
'resetpass_submit' => 'Skrifaðu aðgangsorðið og skráðu þig inn',
-'resetpass_success' => 'Aðgangsorðinu þínu hefur verið breytt! Skráir þig inn...',
+'changepassword-success' => 'Aðgangsorðinu þínu hefur verið breytt! Skráir þig inn...',
'resetpass_forbidden' => 'Ekki er hægt að breyta lykilorðum',
'resetpass-no-info' => 'Þú verður að vera skráð(ur) inn til að hafa aðgang að þessari síðu.',
'resetpass-submit-loggedin' => 'Breyta lykilorði',
@@ -768,10 +796,10 @@ Til að klára að skrá þig inn, verður þú að endurstilla lykilorðið hé
# Special:PasswordReset
'passwordreset' => 'Endurstilla lykilorð',
-'passwordreset-text' => 'Fylltu út þennan reit til að endursetja lykilorðið þitt.',
+'passwordreset-text-one' => 'Útfylltu þetta eyðublað til þess að endursetja lykilorðið.',
'passwordreset-legend' => 'Endurstilla lykilorð',
'passwordreset-disabled' => 'Lokað hefur verið fyrir að endurstilla lykilorð á þessum wiki.',
-'passwordreset-pretext' => '{{PLURAL:$1||Sláðu inn einn hluta gagnanna hér fyrir neðan}}',
+'passwordreset-emaildisabled' => 'Tölvupósteiginleikar hafa verið gerðir óvirkir á þessum wiki.',
'passwordreset-username' => 'Notandanafn:',
'passwordreset-domain' => 'Lén:',
'passwordreset-capture' => 'Sjá áminninguna sem var send í tölvupósti?',
@@ -797,7 +825,7 @@ Ef það varst ekki þú sem fórst fram á þetta, eða ef þú mannst lykilorÃ
Tímabundið lykilorð: $2',
'passwordreset-emailsent' => 'Töluvpóstur til að endursetja lykilorðið hefur verið sendur.',
'passwordreset-emailsent-capture' => 'Tölvupóstur til að endursetja lykilorðið hefur verið sendur í tölvupósti, sem er sýndur hér fyrir neðan.',
-'passwordreset-emailerror-capture' => 'Ãminning var búin til, sem er sýnd hér fyrir neðan, en ekki tókst að senda hana til notandans: $1',
+'passwordreset-emailerror-capture' => 'Tölvupóstur til að endursetja lykilorðið var búinn til, sem er sýndur hér fyrir neðan, en ekki tókst að senda hana til {{GENDER:$2|notandans}}: $1',
# Special:ChangeEmail
'changeemail' => 'Breyting netfangs',
@@ -1006,12 +1034,15 @@ Engin skýring gefin.',
Svo virðist sem henni hafi verið eytt.',
'edit-conflict' => 'Breytingaárekstur.',
'edit-no-change' => 'Breyting þín var hunsuð, því engin breyting var á textanum.',
+'postedit-confirmation' => 'Breytingin þín var vistuð.',
'edit-already-exists' => 'Gat ekki skapað nýja síðu.
Hún er nú þegar til.',
'defaultmessagetext' => 'Sjálfgefinn skilaboða texti',
'content-failed-to-parse' => 'Gat ekki þáttað $2 efni samkvæmt $1 líkani: $3',
'invalid-content-data' => 'Ógild efnisgögn.',
'content-not-allowed-here' => '„$1“ efni er ekki leyfilegt á síðunni [[$2]]',
+'editwarning-warning' => 'Ef farið er frá þessari síðu gætu þær breytingar sem þú hefur gert tapast.
+Ef þú ert skráður inn, þá getur þú óvirkjað þessi skilaboð í „Breytingarflipanum" undir stillingum.',
# Content models
'content-model-wikitext' => 'wiki-texti',
@@ -1255,7 +1286,6 @@ Frekari upplýsingar eru í [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENA
'searchmenu-legend' => 'Leitarvalmöguleikar',
'searchmenu-exists' => "'''Það er síða að nafni „[[:$1]]“ á þessum wiki'''",
'searchmenu-new' => "'''Skapaðu síðuna \"[[:\$1]]\" á þessum wiki!'''",
-'searchhelp-url' => 'Help:Efnisyfirlit',
'searchmenu-prefix' => '[[Special:PrefixIndex/$1|Leita að síðum með þessu forskeyti]]',
'searchprofile-articles' => 'Efnissíður',
'searchprofile-project' => 'Hjálpar- og verkefnasíður',
@@ -1298,15 +1328,7 @@ Frekari upplýsingar eru í [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENA
'searchdisabled' => '{{SITENAME}}-leit er óvirk.
Þú getur leitað í genum Google á meðan.
Athugaðu að skrár þeirra yfir {{SITENAME}}-efni kunna að vera úreltar.',
-
-# Quickbar
-'qbsettings' => 'Valblað',
-'qbsettings-none' => 'Sleppa',
-'qbsettings-fixedleft' => 'Fast vinstra megin',
-'qbsettings-fixedright' => 'Fast hægra megin',
-'qbsettings-floatingleft' => 'Fljótandi til vinstri',
-'qbsettings-floatingright' => 'Fljótandi til hægri',
-'qbsettings-directionality' => 'Lagað, fer eftir því í hvaða átt er skrifað á þínu tungumáli.',
+'search-error' => 'Villa kom upp við leit að: $1',
# Preferences page
'preferences' => 'Stillingar',
@@ -1340,7 +1362,6 @@ Athugaðu að skrár þeirra yfir {{SITENAME}}-efni kunna að vera úreltar.',
'resetprefs' => 'Endurstilla valmöguleika',
'restoreprefs' => 'Endurheimta allar stillingar',
'prefs-editing' => 'Breytingarflipinn',
-'prefs-edit-boxsize' => 'Stærð breytingagluggans.',
'rows' => 'Raðir',
'columns' => 'Dálkar',
'searchresultshead' => 'Leit',
@@ -1351,8 +1372,6 @@ Athugaðu að skrár þeirra yfir {{SITENAME}}-efni kunna að vera úreltar.',
'recentchangesdays-max' => '(hámark $1 {{PLURAL:$1|dag|daga}})',
'recentchangescount' => 'Fjöldi síðna:',
'prefs-help-recentchangescount' => 'Taldar eru með nýlegar breytingar, breytingarskrár og aðgerðarskrár.',
-'prefs-help-watchlist-token' => 'Með því að fylla út þennan reit með leynilegum lykli býr til RSS-efnistraum fyrir vaktlistann þinn. Allir sem vita hver lykillinn er geta lesið vaktlistann þinn, svo veldu öruggt eigindargildi.
-Hér er gildi sem var valið af handahófi sem þú getur notað: $1',
'savedprefs' => 'Stillingarnar þínar hafa verið vistaðar.',
'timezonelegend' => 'Tímabelti:',
'localtime' => 'Staðartími:',
@@ -1383,7 +1402,6 @@ Hér er gildi sem var valið af handahófi sem þú getur notað: $1',
'prefs-reset-intro' => 'Þessi síða er til að endurstilla stillingarnar til sjálfgefnum gildum.
Ekki er hægt að taka þessa breytingu til baka.',
'prefs-emailconfirm-label' => 'Staðfesting netfangs:',
-'prefs-textboxsize' => 'Stærð breytingarglugga',
'youremail' => 'Netfang:',
'username' => '{{Gender:$1|Notandanafn}}:',
'uid' => 'Raðnúmer {{GENDER:$1|notanda}}:',
@@ -1520,6 +1538,8 @@ Tölvupóstfang þitt er ekki gefið upp þegar aðrir notendur hafa samband viÃ
'right-editusercssjs' => 'Breyta CSS- og JS-skrám annarra',
'right-editusercss' => 'Breyta CSS-skrám annarra',
'right-edituserjs' => 'Breyta JS-skrám annarra',
+'right-editmyusercss' => 'Breyta þinni eigin CSS-notandaskrá',
+'right-editmyuserjs' => 'Breyta þinni eigin JavaScript-notandaskrá',
'right-rollback' => 'Taka snögglega aftur breytingar síðasta notanda sem breytti síðunni',
'right-markbotedits' => 'Merkja endurtektar breytingar sem vélmennabreytingar',
'right-noratelimit' => 'Sneiða hjá takmörkunum',
@@ -1623,7 +1643,6 @@ Tölvupóstfang þitt er ekki gefið upp þegar aðrir notendur hafa samband viÃ
'recentchangeslinked-feed' => 'Skyldar breytingar',
'recentchangeslinked-toolbox' => 'Skyldar breytingar',
'recentchangeslinked-title' => 'Breytingar tengdar "$1"',
-'recentchangeslinked-noresult' => 'Engar breytingar á tengdum síðum á þessu tímabili.',
'recentchangeslinked-summary' => "Þetta er listi yfir nýlega gerðar breytingar á síðum sem tengt er í frá tilgreindri síðu (eða á meðlimum úr tilgreindum flokki).
Síður á [[Special:Watchlist|vaktlistanum þínum]] eru '''feitletraðar'''.",
'recentchangeslinked-page' => 'Nafn á síða:',
@@ -1856,7 +1875,6 @@ Vegna öryggissjónarmiða er img_auth.php óvirkt.',
'http-read-error' => 'HTTP lesturs villa.',
'http-timed-out' => 'Tímamörk HTTP beiðni rann út.',
'http-curl-error' => 'Villa við að sækja vefslóð: $1',
-'http-host-unreachable' => 'Gat ekki náð í vefslóðina',
'http-bad-status' => 'Mistök við HTTP beiðnina: $1 $2',
# Some likely curl errors. More could be added from <http://curl.haxx.se/libcurl/c/libcurl-errors.html>
@@ -2009,12 +2027,6 @@ Leitarstrengurinn á að vera á þessu formi: efnistag/myndasnið, t.d. <code>i
'statistics-users-active-desc' => 'Notendur sem hafa framkvæmt aðgerð {{PLURAL:$1|síðastliðin dag|síðastliðna $1 daga}}',
'statistics-mostpopular' => 'Mest skoðuðu síður',
-'disambiguations' => 'Síður sem tengja á aðgreiningarsíður',
-'disambiguationspage' => 'Template:Aðgreining',
-'disambiguations-text' => "Þessar síður innihalda tengla á svokallaðar „'''aðgreiningarsíður'''“.
-Laga ætti tenglanna og láta þá vísa á rétta síðu.<br />
-Farið er með síðu sem aðgreiningarsíðu ef að hún inniheldur snið sem vísað er í frá [[MediaWiki:Disambiguationspage]]",
-
'pageswithprop-submit' => 'Ãfram',
'doubleredirects' => 'Tvöfaldar tilvísanir',
@@ -2264,10 +2276,9 @@ Frekari breytingar á henni eða spjallsíðu hennar munu verða sýndar þar.',
'unwatchthispage' => 'Hætta vöktun',
'notanarticle' => 'Ekki efnisleg síða',
'notvisiblerev' => 'Síðasta breyting eftir annan notanda hefur verið eytt.',
-'watchnochange' => 'Engri síðu á vaktlistanum þínum hefur verið breytt á tilgreindu tímabili.',
'watchlist-details' => '{{PLURAL:$1|$1 síða|$1 síður}} á vaktlistanum þínum, fyrir utan spjallsíður.',
-'wlheader-enotif' => '* Tilkynning með tölvupósti er virk.',
-'wlheader-showupdated' => "* Síðum sem hefur verið breytt síðan þú skoðaðir þær síðast eru '''feitletraðar'''",
+'wlheader-enotif' => 'Tilkynning með tölvupósti er virk.',
+'wlheader-showupdated' => "Síðum sem hefur verið breytt síðan þú skoðaðir þær síðast eru '''feitletraðar'''.",
'watchmethod-recent' => 'kanna hvort nýlegar breytingar innihalda vaktaðar síður',
'watchmethod-list' => 'leita að breytingum í vöktuðum síðum',
'watchlistcontains' => 'Vaktlistinn þinn inniheldur {{PLURAL:$1|$1 síðu|$1 síður}}.',
@@ -2678,12 +2689,9 @@ Sjá [[Special:BlockList|ítarlegri lista]] fyrir öll núgildandi bönn.',
Vistfangið var bannað sem hluti af fjöldabanninu $2, sem er hægt að afbanna.',
'ip_range_invalid' => 'Ógilt vistfangasvið.',
'ip_range_toolarge' => 'Fjöldabönn stærri en /$1 eru óheimil.',
-'blockme' => 'Banna mig',
'proxyblocker' => 'Vefsels bann',
-'proxyblocker-disabled' => 'Þessi virkni er óvirk.',
'proxyblockreason' => 'Vistfangið þitt hefur verið bannað því það er opið vefsel.
Vinsamlegast hafðu samband við internetþjónustuaðilann þinn eða netstjóra félagsins og láttu þá vita af þessu alvarlegu öryggisvandamáli.',
-'proxyblocksuccess' => 'Búinn.',
'sorbsreason' => 'Vistfangið þitt er á lista yfir opin vefsel í DNSBL sem er í notkun á {{SITENAME}}.',
'sorbs_create_account_reason' => 'Vistfangið þitt er á lista yfir opin vefsel í DNSBL sem er notað af {{SITENAME}}.
Þú getur ekki stofnað aðgang.',
@@ -2846,6 +2854,8 @@ Vinsamlegast heimsæktu [//www.mediawiki.org/wiki/Localisation MediaWiki-staðfÃ
'thumbnail-more' => 'Stækka',
'filemissing' => 'Skrá vantar',
'thumbnail_error' => 'Villa við gerð smámyndar: $1',
+'thumbnail_error_remote' => 'Villumelding frá $1:
+$2',
'djvu_page_error' => 'DjVu-blaðsíða er utan marka',
'djvu_no_xml' => 'Mistókst að sækja XML-gögn fyrir DjVu skrá',
'thumbnail-temp-create' => 'Mistókst að búa til tímabundna smámynd.',
@@ -3074,13 +3084,8 @@ Vinsamlegast reyndu aftur.',
'pageinfo-category-files' => 'Fjöldi skráa',
# Skin names
-'skinname-standard' => 'Sígilt',
-'skinname-nostalgia' => 'Gamaldags',
'skinname-cologneblue' => 'Kölnarblátt',
'skinname-monobook' => 'EinBók',
-'skinname-myskin' => 'Mitt þema',
-'skinname-chick' => 'Gella',
-'skinname-simple' => 'Einfalt',
'skinname-modern' => 'Nútímalegt',
# Patrolling
@@ -3155,11 +3160,25 @@ Vinsamlegast reyndu aftur.',
'minutes' => '{{PLURAL:$1|einni mínútu|$1 mínútum}}',
'hours' => '{{PLURAL:$1|einum klukkutíma|$1 klukkutímum}}',
'days' => '{{PLURAL:$1|einum degi|$1 dögum}}',
+'weeks' => '{{PLURAL:$1|$1 vika|$1 vikur}}',
'months' => '{{PLURAL:$1|$1 mánuði|$1 mánuðum}}',
'years' => '{{PLURAL:$1|$1 ári|$1 árum}}',
'ago' => '$1 síðan',
'just-now' => 'akkúrat núna',
+# Human-readable timestamps
+'hours-ago' => '$1 {{PLURAL:$1|klukkutíma|klukkutímum}} síðan',
+'minutes-ago' => '$1 {{PLURAL:$1|mínútu|mínútum}} síðan',
+'seconds-ago' => '$1 {{PLURAL:$1|sekúndu|sekúndum}} síðan',
+'monday-at' => 'Mánudag klukkan $1',
+'tuesday-at' => 'Þriðjudag klukkan $1',
+'wednesday-at' => 'Miðvikudag klukkan $1',
+'thursday-at' => 'Fimmtudag klukkan $1',
+'friday-at' => 'Föstudag klukkan $1',
+'saturday-at' => 'Laugardag klukkan $1',
+'sunday-at' => 'Sunnudag klukkan $1',
+'yesterday-at' => 'à gær klukkan $1',
+
# Bad image list
'bad_image_list' => 'Sniðið er eftirfarandi:
@@ -3189,7 +3208,7 @@ Ef skránni hefur verið breytt, kann að vera að einhverjar upplýsingar eigi
* gpslongitude
* gpsaltitude',
-# EXIF tags
+# Exif tags
'exif-imagewidth' => 'Breidd',
'exif-imagelength' => 'Hæð',
'exif-bitspersample' => 'Bæti á einingu',
@@ -3348,7 +3367,7 @@ Ef skránni hefur verið breytt, kann að vera að einhverjar upplýsingar eigi
'exif-originalimageheight' => 'Hæð myndarinnar fyrir skerðingu',
'exif-originalimagewidth' => 'Breidd myndar fyrir skerðingu',
-# EXIF attributes
+# Exif attributes
'exif-compression-1' => 'Ósamþjappað',
'exif-copyrighted-true' => 'Höfundaréttarvarið',
@@ -3708,7 +3727,6 @@ einn titil í hverri línu.
'version-skins' => 'Þemu',
'version-other' => 'Aðrar',
'version-mediahandlers' => 'Rekill margmiðlunarskráa',
-'version-extension-functions' => 'Aðgerðir smáforrita',
'version-parser-extensiontags' => 'Þáttuð smáforrita tög',
'version-hook-subscribedby' => 'à áskrift af',
'version-version' => '(Útgáfa $1)',
@@ -3725,12 +3743,13 @@ MediaWiki er útgefin í þeirri von að hann sé gagnlegur, en ÃN ALLRAR ÃBYR
'version-software-version' => 'Útgáfa',
'version-entrypoints-header-url' => 'vefslóð',
-# Special:FilePath
-'filepath' => 'Slóð skráar',
-'filepath-page' => 'Skrá:',
-'filepath-submit' => 'Ãfram',
-'filepath-summary' => 'Þessi kerfisíða birtir fulla vefslóð skráar.
-Myndir eru sýndar í fullri upplausn og önnur skráarsnið eru ræst í sjálfvöldu forriti til þess að opna skránna.',
+# Special:Redirect
+'redirect-submit' => 'Ãfram',
+'redirect-lookup' => 'Fletta upp:',
+'redirect-value' => 'Gildi:',
+'redirect-user' => 'Notandanúmer',
+'redirect-file' => 'Skráarnafn',
+'redirect-not-exists' => 'Gildi fannst ekki',
# Special:FileDuplicateSearch
'fileduplicatesearch' => 'Leita að afriti',
@@ -3820,6 +3839,9 @@ Myndir eru sýndar í fullri upplausn og önnur skráarsnið eru ræst í sjálf
'htmlform-submit' => 'Senda',
'htmlform-reset' => 'Taka aftur breytingu',
'htmlform-selectorother-other' => 'Annað',
+'htmlform-no' => 'Nei',
+'htmlform-yes' => 'Já',
+'htmlform-chosen-placeholder' => 'Veldu valmöguleika',
# SQLite database support
'sqlite-has-fts' => '$1 með fullum texta leitar stuðningi',
diff --git a/languages/messages/MessagesIt.php b/languages/messages/MessagesIt.php
index 3d2b0771..f554aed5 100644
--- a/languages/messages/MessagesIt.php
+++ b/languages/messages/MessagesIt.php
@@ -59,6 +59,7 @@
* @author S.Örvarr.S
* @author SabineCretella
* @author Sannita
+ * @author Shirayuki
* @author Stefano-c
* @author Tonyfroio
* @author Trixt
@@ -319,9 +320,6 @@ $messages = array(
'tog-shownumberswatching' => 'Mostra il numero di utenti che hanno la pagina in osservazione',
'tog-oldsig' => 'Firma attuale:',
'tog-fancysig' => 'Tratta la firma come wikitesto (senza un collegamento automatico)',
-'tog-externaleditor' => "Usa per default un editor di testi esterno (solo per utenti esperti, richiede l'uso di impostazioni particolari sul proprio computer. [//www.mediawiki.org/wiki/Manual:External_editors Ulteriori informazioni.])",
-'tog-externaldiff' => "Usa per default un programma di diff esterno (solo per utenti esperti, richiede l'uso di impostazioni particolari sul proprio computer. [//www.mediawiki.org/wiki/Manual:External_editors Ulteriori informazioni.])",
-'tog-showjumplinks' => 'Attiva i collegamenti accessibili "vai a"',
'tog-uselivepreview' => "Abilita la funzione ''Live preview'' (anteprima in diretta - sperimentale)",
'tog-forceeditsummary' => 'Chiedi conferma se il campo oggetto è vuoto',
'tog-watchlisthideown' => 'Nascondi le mie modifiche negli osservati speciali',
@@ -335,6 +333,8 @@ $messages = array(
'tog-showhiddencats' => 'Mostra categorie nascoste',
'tog-noconvertlink' => 'Disattiva la conversione dei titoli dei link',
'tog-norollbackdiff' => 'Non mostrare il confronto tra versioni dopo aver effettuato un rollback',
+'tog-useeditwarning' => 'Avvisa quando si lascia una pagina di modifica con modifiche non salvate',
+'tog-prefershttps' => "Usa sempre una connessione sicura quando effettuo l'accesso",
'underline-always' => 'Sempre',
'underline-never' => 'Mai',
@@ -398,6 +398,18 @@ $messages = array(
'oct' => 'ott',
'nov' => 'nov',
'dec' => 'dic',
+'january-date' => '$1 gennaio',
+'february-date' => '$1 febbraio',
+'march-date' => '$1 marzo',
+'april-date' => '$1 aprile',
+'may-date' => '$1 maggio',
+'june-date' => '$1 giugno',
+'july-date' => '$1 luglio',
+'august-date' => '$1 agosto',
+'september-date' => '$1 settembre',
+'october-date' => '$1 ottobre',
+'november-date' => '$1 novembre',
+'december-date' => '$1 dicembre',
# Categories related messages
'pagecategories' => '{{PLURAL:$1|Categoria|Categorie}}',
@@ -479,6 +491,7 @@ $messages = array(
'create-this-page' => 'Crea questa pagina',
'delete' => 'Cancella',
'deletethispage' => 'Cancella questa pagina',
+'undeletethispage' => 'Recupera questa pagina',
'undelete_short' => 'Recupera {{PLURAL:$1|una revisione|$1 revisioni}}',
'viewdeleted_short' => 'Vedi {{PLURAL:$1|una modifica cancellata|$1 modifiche cancellate}}',
'protect' => 'Proteggi',
@@ -522,7 +535,7 @@ $1',
'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).
+# 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).
'aboutsite' => 'Informazioni su {{SITENAME}}',
'aboutpage' => 'Project:Informazioni',
'copyright' => 'Il contenuto è disponibile in base alla licenza $1, se non diversamente specificato.',
@@ -532,7 +545,6 @@ $1',
'disclaimers' => 'Avvertenze',
'disclaimerpage' => 'Project:Avvertenze generali',
'edithelp' => 'Guida',
-'edithelppage' => 'Help:Modifica',
'helppage' => 'Help:Indice',
'mainpage' => 'Pagina principale',
'mainpage-description' => 'Pagina principale',
@@ -609,17 +621,12 @@ L'elenco delle pagine speciali valide si trova in [[Special:SpecialPages|Elenco
# General errors
'error' => 'Errore',
'databaseerror' => 'Errore del database',
-'dberrortext' => 'Errore di sintassi nella richiesta inoltrata al database.
-Ciò potrebbe indicare la presenza di un bug nel software.
-L\'ultima query inviata al database è stata:
-<blockquote><code>$1</code></blockquote>
-richiamata dalla funzione "<code>$2</code>".
-Il database ha restituito il seguente errore "<samp>$3: $4</samp>".',
-'dberrortextcl' => 'Errore di sintassi nella richiesta inoltrata al database.
-L\'ultima query inviata al database è stata:
-"$1"
-richiamata dalla funzione "$2".
-Il database ha restituito il seguente errore "$3: $4".',
+'databaseerror-text' => 'Si è verificato un errore in una query sul database.
+Potrebbe indicare un bug nel software.',
+'databaseerror-textcl' => 'Si è verificato un errore in una query sul database.',
+'databaseerror-query' => 'Query: $1',
+'databaseerror-function' => 'Funzione: $1',
+'databaseerror-error' => 'Errore: $1',
'laggedslavemode' => "'''Attenzione:''' la pagina potrebbe non riportare gli aggiornamenti più recenti.",
'readonly' => 'Database bloccato',
'enterlockreason' => 'Indicare il motivo del blocco, specificando il momento in cui è presumibile che venga rimosso',
@@ -653,6 +660,7 @@ Potrebbe essere stato già cancellato da qualcun altro.',
'cannotdelete-title' => 'Impossibile eliminare la pagina "$1"',
'delete-hook-aborted' => "La cancellazione è stata annullata dall'hook.
Non è stata restituita alcuna spiegazione.",
+'no-null-revision' => 'Non può essere creata una versione nulla per la pagina "$1"',
'badtitle' => 'Titolo non corretto',
'badtitletext' => 'Il titolo della pagina richiesta è vuoto, errato oppure deriva da un errore nei collegamenti interlingua o interwiki.
Potrebbe inoltre contenere uno o più caratteri il cui uso non è ammesso nei titoli.',
@@ -673,12 +681,15 @@ Query: $2',
Per aggiungere o modificare traduzioni per tutti i wiki usare [//translatewiki.net/ translatewiki.net], il progetto di localizzazione di MediaWiki.",
'editinginterface' => "'''Attenzione:''' Il testo di questa pagina fa parte dell'interfaccia utente del sito. Tutte le modifiche apportate a questa pagina si riflettono sui messaggi visualizzati per tutti gli utenti su questo wiki.
Per aggiungere o modificare le traduzioni valide su tutti i wiki, considera la possibilità di usare [//translatewiki.net/wiki/Main_Page?setlang=it translatewiki.net], il progetto MediaWiki per la localizzazione.",
-'sqlhidden' => '(la query SQL è stata nascosta)',
'cascadeprotected' => 'Su questa pagina non è possibile effettuare modifiche perché è stata inclusa {{PLURAL:$1|nella pagina indicata di seguito, che è stata protetta|nelle pagine indicate di seguito, che sono state protette}} selezionando la protezione "ricorsiva":
$2',
'namespaceprotected' => "Non si dispone dei permessi necessari per modificare le pagine del namespace '''$1'''.",
'customcssprotected' => 'Non si dispone dei permessi necessari alla modifica di questa pagina CSS, in quanto contiene le impostazioni personali di un altro utente.',
'customjsprotected' => 'Non si dispone dei permessi necessari alla modifica di questa pagina JavaScript, in quanto contiene le impostazioni personali di un altro utente.',
+'mycustomcssprotected' => 'Non si dispone dei permessi necessari per modificare questa pagina CSS.',
+'mycustomjsprotected' => 'Non si dispone dei permessi necessari per modificare questa pagina JavaScript.',
+'myprivateinfoprotected' => 'Non si dispone dei permessi necessari per modificare i propri dati personali.',
+'mypreferencesprotected' => 'Non si dispone dei permessi necessari per modificare le proprie preferenze.',
'ns-specialprotected' => 'Non è possibile modificare le pagine speciali.',
'titleprotected' => "La creazione di una pagina con questo titolo è stata bloccata da [[User:$1|$1]].
La motivazione è la seguente: ''$2''.",
@@ -703,10 +714,19 @@ Nota che alcune pagine potrebbero continuare ad apparire come se il logout non f
'welcomecreation-msg' => "L'account è stato creato correttamente.
Non dimenticare di personalizzare le [[Special:Preferences|preferenze di {{SITENAME}}]].",
'yourname' => 'Nome utente:',
+'userlogin-yourname' => 'Nome utente',
+'userlogin-yourname-ph' => 'Inserisci il tuo nome utente',
+'createacct-another-username-ph' => 'Inserisci il nome utente',
'yourpassword' => 'Password:',
+'userlogin-yourpassword' => 'Password',
+'userlogin-yourpassword-ph' => 'Inserisci la tua password',
+'createacct-yourpassword-ph' => 'Inserisci una password',
'yourpasswordagain' => 'Ripeti la password:',
+'createacct-yourpasswordagain' => 'Conferma password',
+'createacct-yourpasswordagain-ph' => 'Inserisci nuovamente la password',
'remembermypassword' => 'Ricorda la password su questo browser (per un massimo di $1 {{PLURAL:$1|giorno|giorni}})',
-'securelogin-stick-https' => 'Resta connesso attraverso HTTPS dopo il login',
+'userlogin-remembermypassword' => 'Mantienimi collegato',
+'userlogin-signwithsecure' => 'Usa una connessione sicura',
'yourdomainname' => 'Specificare il dominio',
'password-change-forbidden' => 'Non è possibile modificare le password su questo wiki.',
'externaldberror' => 'Si è verificato un errore con il server di autenticazione esterno, oppure non si dispone delle autorizzazioni necessarie per aggiornare il proprio accesso esterno.',
@@ -718,18 +738,44 @@ Non dimenticare di personalizzare le [[Special:Preferences|preferenze di {{SITEN
'logout' => 'Esci',
'userlogout' => 'esci',
'notloggedin' => 'Accesso non effettuato',
+'userlogin-noaccount' => 'Non hai ancora effettuato la registrazione?',
+'userlogin-joinproject' => 'Registrati su {{SITENAME}}',
'nologin' => 'Non hai ancora un accesso? $1.',
'nologinlink' => 'Registrati',
'createaccount' => 'Registrati',
'gotaccount' => 'Hai già un accesso? $1.',
'gotaccountlink' => 'Entra',
'userlogin-resetlink' => 'Hai dimenticato i tuoi dati di accesso?',
+'userlogin-resetpassword-link' => 'Reimposta la tua password',
+'helplogin-url' => 'Help:Login',
+'userlogin-helplink' => '[[{{MediaWiki:helplogin-url}}|Aiuto con il login]]',
+'userlogin-loggedin' => 'Sei già connesso come {{GENDER:$1|$1}}.
+Usa il modulo sottostante per accedere come altro utente.',
+'userlogin-createanother' => "Crea un'altra utenza",
+'createacct-join' => 'Inserisci i tuoi dati qui sotto.',
+'createacct-another-join' => 'Inserisci le informazioni per la registrazione qui sotto.',
+'createacct-emailrequired' => 'Indirizzo email',
+'createacct-emailoptional' => 'Indirizzo di posta elettronica (opzionale)',
+'createacct-email-ph' => 'Inserisci il tuo indirizzo email',
+'createacct-another-email-ph' => "Inserisci l'indirizzo di posta elettronica",
'createaccountmail' => "Usa una password casuale temporanea e inviala all'indirizzo di posta elettronica specificato",
+'createacct-realname' => 'Nome reale (opzionale)',
'createaccountreason' => 'Motivo:',
+'createacct-reason' => 'Motivo',
+'createacct-reason-ph' => "Perché stai creando un'altra utenza",
+'createacct-captcha' => 'Controllo di sicurezza',
+'createacct-imgcaptcha-ph' => 'Inserisci il testo che vedi sopra',
+'createacct-submit' => 'Crea la tua utenza',
+'createacct-another-submit' => "Crea un'altra utenza",
+'createacct-benefit-heading' => '{{SITENAME}} cresce grazie a persone come te.',
+'createacct-benefit-body1' => '{{PLURAL:$1|modifica|modifiche}}',
+'createacct-benefit-body2' => '{{PLURAL:$1|pagina|pagine}}',
+'createacct-benefit-body3' => '{{PLURAL:$1|contributore recente|contributori recenti}}',
'badretype' => 'Le password inserite non coincidono tra loro.',
'userexists' => 'Il nome utente inserito è già utilizzato.
Scegliere un nome utente diverso.',
'loginerror' => "Errore durante l'accesso",
+'createacct-error' => "Errore durante la creazione dell'utenza",
'createaccounterror' => "Impossibile creare l'account: $1",
'nocookiesnew' => "La registrazione è stata completata, ma non è stato possibile accedere a {{SITENAME}} perché i cookie sono disattivati. Riprovare l'accesso con il nome utente e la password appena creati dopo aver attivato i cookie nel proprio browser.",
'nocookieslogin' => "L'accesso a {{SITENAME}} richiede l'uso dei cookie, che risultano disattivati. Riprovare l'accesso dopo aver attivato i cookie nel proprio browser.",
@@ -783,10 +829,11 @@ Non verranno inviati messaggi email per le funzioni elencate di seguito.",
Se l\'accesso è stato creato per errore, si può ignorare questo messaggio.',
'usernamehasherror' => 'Il nome utente non può contenere caratteri hash',
'login-throttled' => 'Sono stati effettuati troppi tentativi di accesso in breve tempo.
-Riprovare più tardi.',
+Attendi $1 e riprova in seguito.',
'login-abort-generic' => 'Il tuo login non ha avuto successo - Annullato',
'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.',
+'createacct-another-realname-tip' => "L'indicazione del proprio nome vero è opzionale; se si sceglie di inserirlo, verrà utilizzato per attribuire la paternità dei contenuti inviati.",
# Email sending
'php-mail-error-unknown' => 'Errore sconosciuto nella funzione PHP mail()',
@@ -802,8 +849,7 @@ Riprovare più tardi.',
'newpassword' => 'Nuova password:',
'retypenew' => 'Riscrivi la nuova password:',
'resetpass_submit' => 'Imposta la password e accedi al sito',
-'resetpass_success' => 'La tua password è stata modificata correttamente!
-Ora stai per accedere...',
+'changepassword-success' => 'La password è stata modificata correttamente!',
'resetpass_forbidden' => 'Non è possibile modificare le password',
'resetpass-no-info' => "Devi aver effettuato l'accesso per accedere a questa pagina direttamente.",
'resetpass-submit-loggedin' => 'Cambia password',
@@ -815,10 +861,11 @@ La password potrebbe essere stata già cambiata, oppure potrebbe essere stata ri
# Special:PasswordReset
'passwordreset' => 'Reimposta password',
-'passwordreset-text' => 'Compila questo modulo per reimpostare la tua password.',
+'passwordreset-text-one' => 'Compila questo modulo per reimpostare la tua password.',
+'passwordreset-text-many' => '{{PLURAL:$1|Compila uno dei campi per reimpostare la tua password.}}',
'passwordreset-legend' => 'Reimposta password',
'passwordreset-disabled' => 'La reimpostazione delle password è stata disabilitata su questa wiki',
-'passwordreset-pretext' => '{{PLURAL:$1||Immetti uno dei dati richiesti qui sotto}}',
+'passwordreset-emaildisabled' => 'Le funzionalità di posta elettronica sono state disabilitate su questa wiki.',
'passwordreset-username' => 'Nome utente:',
'passwordreset-domain' => 'Dominio:',
'passwordreset-capture' => 'Visualizzare il contenuto del messaggio e-mail?',
@@ -845,7 +892,7 @@ Se non sei stato tu a fare la richiesta, o se ti sei ricordato la password origi
Password temporanea: $2',
'passwordreset-emailsent' => 'È stata inviata una email di reimpostazione della password.',
'passwordreset-emailsent-capture' => 'È stata inviata una email di reimpostazione della password, il contenuto è riportato di seguito.',
-'passwordreset-emailerror-capture' => "È stata generata l'email di promemoria riportata di seguito. L'invio non è riuscito all'utente: $1",
+'passwordreset-emailerror-capture' => "È stata generata una email di reimpostazione della password, riportata di seguito. L'invio {{GENDER:$2|all'utente}} non è riuscito: $1",
# Special:ChangeEmail
'changeemail' => "Modifica l'indirizzo e-mail",
@@ -859,6 +906,19 @@ Password temporanea: $2',
'changeemail-submit' => 'Modifica e-mail',
'changeemail-cancel' => 'Annulla',
+# Special:ResetTokens
+'resettokens' => 'Reimposta token',
+'resettokens-text' => "Qui puoi reimpostare le chiavi che permettono l'accesso a determinati dati privati associati alla tua utenza.
+
+Dovresti farlo se le hai accidentalmente condivise con qualcuno o se la tua utenza è stato compromessa.",
+'resettokens-no-tokens' => 'Non ci sono token da reimpostare.',
+'resettokens-legend' => 'Reimposta token',
+'resettokens-tokens' => 'Token:',
+'resettokens-token-label' => '$1 (valore attuale: $2)',
+'resettokens-watchlist-token' => 'Token per il feed web (Atom/RSS) delle [[Special:Watchlist|modifiche alle pagine nei tuoi osservati speciali]]',
+'resettokens-done' => 'Token reimpostati.',
+'resettokens-resetbutton' => 'Reset token selezionati',
+
# Edit page toolbar
'bold_sample' => 'Grassetto',
'bold_tip' => 'Grassetto',
@@ -1044,12 +1104,15 @@ Non è stata restituita alcuna spiegazione.",
Sembra che sia stata cancellata.',
'edit-conflict' => 'Conflitto di edizione.',
'edit-no-change' => 'La modifica è stata ignorata poiché non sono stati apportati cambiamenti al testo.',
+'postedit-confirmation' => 'La modifica è stata salvata.',
'edit-already-exists' => 'Impossibile creare una nuova pagina.
Esiste già.',
'defaultmessagetext' => 'Testo predefinito',
'content-failed-to-parse' => 'Impossibile analizzare $2 per il modello $1: $3',
'invalid-content-data' => 'Dati contenuti non validi',
'content-not-allowed-here' => 'Contenuto in "$1" non consentito nella pagine [[$2]]',
+'editwarning-warning' => 'Lasciare questa pagina potrebbe causare la perdita di tutte le modifiche fatte.
+Se hai effettuato l\'accesso, puoi disattivare questo avviso nella sezione "Casella di modifica" delle tue preferenze.',
# Content models
'content-model-wikitext' => 'wikitesto',
@@ -1084,6 +1147,7 @@ Controlla le differenze mostrate sotto fra le due versioni per essere certo che
'undo-failure' => 'Impossibile annullare la modifica a causa di un conflitto con modifiche intermedie.',
'undo-norev' => 'La modifica non può essere annullata perché non esiste o è stata cancellata.',
'undo-summary' => 'Annullata la modifica $1 di [[Special:Contributions/$2|$2]] ([[User talk:$2|discussione]])',
+'undo-summary-username-hidden' => 'Annullata la modifica $1 di un utente nascosto',
# Account creation failure
'cantcreateaccounttitle' => 'Impossibile registrare un utente',
@@ -1257,6 +1321,7 @@ Vedi l'[[Special:BlockList|elenco dei blocchi]] per l'elenco dei bandi e dei blo
'compareselectedversions' => 'Confronta le versioni selezionate',
'showhideselectedversions' => 'Mostra/nascondi versioni selezionate',
'editundo' => 'annulla',
+'diff-empty' => '(Nessuna differenza)',
'diff-multi' => '({{PLURAL:$1|Una revisione intermedia|$1 revisioni intermedie}} di {{PLURAL:$2|un utente|$2 utenti}} non {{PLURAL:$1|mostrata|mostrate}})',
'diff-multi-manyusers' => '({{PLURAL:$1|Una revisione intermedia|$1 revisioni intermedie}} di oltre $2 {{PLURAL:$2|utente|utenti}} non {{PLURAL:$1|mostrata|mostrate}})',
'difference-missing-revision' => '{{PLURAL:$2|Una versione|$2 versioni}} di questa differenza ($1) {{PLURAL:$2|non è stata trovata|non sono state trovate}}.
@@ -1284,7 +1349,6 @@ I dettagli possono essere trovati nel [{{fullurl:{{#Special:Log}}/delete|page={{
'searchmenu-legend' => 'Opzioni di ricerca',
'searchmenu-exists' => "'''Sul sito esiste una pagina il cui nome è \"[[:\$1]]\"'''",
'searchmenu-new' => 'Crea la pagina "[[:$1]]" su questo sito',
-'searchhelp-url' => 'Help:Indice',
'searchmenu-prefix' => '[[Special:PrefixIndex/$1|Visualizza le pagine con questo prefisso]]',
'searchprofile-articles' => 'Pagine di contenuti',
'searchprofile-project' => 'Pagine di aiuto e relative al progetto',
@@ -1325,15 +1389,7 @@ I dettagli possono essere trovati nel [{{fullurl:{{#Special:Log}}/delete|page={{
'powersearch-togglenone' => 'Nessuno',
'search-external' => 'Ricerca esterna',
'searchdisabled' => 'La ricerca interna di {{SITENAME}} non è attiva; nel frattempo si può provare ad usare un motore di ricerca esterno come Google. (Si noti però che i contenuti di {{SITENAME}} presenti in tali motori potrebbero non essere aggiornati.)',
-
-# Quickbar
-'qbsettings' => 'Quickbar',
-'qbsettings-none' => 'Nessuno',
-'qbsettings-fixedleft' => 'Fisso a sinistra',
-'qbsettings-fixedright' => 'Fisso a destra',
-'qbsettings-floatingleft' => 'Fluttuante a sinistra',
-'qbsettings-floatingright' => 'Fluttuante a destra',
-'qbsettings-directionality' => 'Fisso, a seconda della direzione del testo nella tua lingua',
+'search-error' => 'Si è verificato un errore durante la ricerca: $1',
# Preferences page
'preferences' => 'Preferenze',
@@ -1367,7 +1423,6 @@ I dettagli possono essere trovati nel [{{fullurl:{{#Special:Log}}/delete|page={{
'resetprefs' => 'Reimposta le preferenze',
'restoreprefs' => 'Ripristina le impostazioni predefinite (in tutte le sezioni)',
'prefs-editing' => 'Casella di modifica',
-'prefs-edit-boxsize' => 'Dimensioni della finestra di modifica.',
'rows' => 'Righe:',
'columns' => 'Colonne:',
'searchresultshead' => 'Ricerca',
@@ -1378,7 +1433,8 @@ I dettagli possono essere trovati nel [{{fullurl:{{#Special:Log}}/delete|page={{
'recentchangesdays-max' => '(massimo $1 {{PLURAL:$1|giorno|giorni}})',
'recentchangescount' => 'Numero di modifiche da mostrare per default:',
'prefs-help-recentchangescount' => 'Comprende ultime modifiche, cronologie e registri.',
-'prefs-help-watchlist-token' => "Compilando questo campo con una chiave segreta verrà generato un feed RSS per i propri osservati speciali. Chiunque conosca la chiave in questo campo potrà leggere gli osservati speciali, quindi assicurasi di inserire un valore sicuro. Qui c'è un valore generato casualmente che si può usare: $1",
+'prefs-help-watchlist-token2' => 'Questa è la chiave segreta per il feed web dei tuoi osservati speciali.
+Chiunque la conosce sarà in grado di leggere i tuoi osservati speciali, per cui non condividerla. [[Special:ResetTokens|Clicca qui se hai bisogno di reimpostarla]].',
'savedprefs' => 'Le preferenze sono state salvate.',
'timezonelegend' => 'Fuso orario:',
'localtime' => 'Ora locale:',
@@ -1409,7 +1465,6 @@ I dettagli possono essere trovati nel [{{fullurl:{{#Special:Log}}/delete|page={{
'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:",
-'prefs-textboxsize' => 'Dimensione della finestra di modifica',
'youremail' => 'Indirizzo email:',
'username' => '{{GENDER:$1|Nome utente}}:',
'uid' => '{{GENDER:$1|ID utente}}:',
@@ -1442,6 +1497,8 @@ Il tuo indirizzo non viene rivelato quando gli altri utenti ti contattano.',
'prefs-dateformat' => 'Formato data',
'prefs-timeoffset' => 'Ore di differenza',
'prefs-advancedediting' => 'Opzioni generali',
+'prefs-editor' => 'Editore',
+'prefs-preview' => 'Anteprima',
'prefs-advancedrc' => 'Opzioni avanzate',
'prefs-advancedrendering' => 'Opzioni avanzate',
'prefs-advancedsearchoptions' => 'Opzioni avanzate',
@@ -1449,7 +1506,9 @@ Il tuo indirizzo non viene rivelato quando gli altri utenti ti contattano.',
'prefs-displayrc' => 'Opzioni di visualizzazione',
'prefs-displaysearchoptions' => 'Opzioni di visualizzazione',
'prefs-displaywatchlist' => 'Opzioni di visualizzazione',
+'prefs-tokenwatchlist' => 'Token',
'prefs-diffs' => 'Differenze',
+'prefs-help-prefershttps' => 'Questa preferenza avrà effetto dal prossimo accesso.',
# User preference: email validation using jQuery
'email-address-validity-valid' => "L'indirizzo e-mail sembra valido",
@@ -1476,6 +1535,8 @@ Il tuo indirizzo non viene rivelato quando gli altri utenti ti contattano.',
'userrights-notallowed' => "Non disponi dell'autorizzazione per aggiungere o rimuovere i permessi utente.",
'userrights-changeable-col' => 'Gruppi modificabili',
'userrights-unchangeable-col' => 'Gruppi non modificabili',
+'userrights-conflict' => 'Conflitto di modifica dei diritti utente! Controlla e conferma le tue modifiche.',
+'userrights-removed-self' => 'Hai rimosso con successo i tuoi diritti. E quindi, non sarai più in grado di accedere a questa pagina.',
# Groups
'group' => 'Gruppo:',
@@ -1541,11 +1602,19 @@ Il tuo indirizzo non viene rivelato quando gli altri utenti ti contattano.',
'right-proxyunbannable' => 'Ignora i blocchi automatici dei proxy',
'right-unblockself' => 'Sblocca se stesso',
'right-protect' => 'Cambia i livelli di protezione e modifica pagine protette ricorsivamente',
-'right-editprotected' => 'Modifica pagine protette',
+'right-editprotected' => 'Modifica pagine protette con "{{int:protect-level-sysop}}"',
+'right-editsemiprotected' => 'Modifica pagine protette con "{{int:protect-level-autoconfirmed}}"',
'right-editinterface' => "Modifica l'interfaccia utente",
'right-editusercssjs' => 'Modifica i file CSS e JS di altri utenti',
'right-editusercss' => 'Modifica i file CSS di altri utenti',
'right-edituserjs' => 'Modifica i file JS di altri utenti',
+'right-editmyusercss' => 'Modifica il file CSS del proprio utente',
+'right-editmyuserjs' => 'Modifica il file JavaScript del proprio utente',
+'right-viewmywatchlist' => 'Visualizza i propri osservati speciali',
+'right-editmywatchlist' => 'Modifica i propri osservati speciali. Da notare che alcune azioni potranno ancora aggiungere pagine anche senza questo diritto.',
+'right-viewmyprivateinfo' => 'Visualizza i propri dati personali (ad esempio: indirizzo email, nome vero)',
+'right-editmyprivateinfo' => 'Modifica i propri dati personali (ad esempio: indirizzo email, nome vero)',
+'right-editmyoptions' => 'Modifica le proprie preferenze',
'right-rollback' => "Annulla rapidamente le modifiche dell'ultimo utente che ha modificato una particolare pagina",
'right-markbotedits' => 'Segna le modifiche soggette a rollback come effettuate da bot',
'right-noratelimit' => 'Non soggetto al limite di azioni',
@@ -1607,12 +1676,19 @@ Il tuo indirizzo non viene rivelato quando gli altri utenti ti contattano.',
'action-userrights-interwiki' => 'modificare i diritti degli utenti su altre wiki',
'action-siteadmin' => 'bloccare e sbloccare il database',
'action-sendemail' => 'inviare e-mail',
+'action-editmywatchlist' => 'modificare i propri osservati speciali',
+'action-viewmywatchlist' => 'vedere i propri osservati speciali',
+'action-viewmyprivateinfo' => 'vedere i propri dati personali',
+'action-editmyprivateinfo' => 'modificare i propri dati personali',
# Recent changes
'nchanges' => '$1 {{PLURAL:$1|modifica|modifiche}}',
+'enhancedrc-since-last-visit' => "$1 {{PLURAL:$1|dall'ultima visita}}",
+'enhancedrc-history' => 'cronologia',
'recentchanges' => 'Ultime modifiche',
'recentchanges-legend' => 'Opzioni ultime modifiche',
'recentchanges-summary' => 'Questa pagina presenta le modifiche più recenti ai contenuti del sito.',
+'recentchanges-noresult' => 'Nessuna modifica durante il periodo inserito che soddisfa questi criteri.',
'recentchanges-feed-description' => 'Questo feed riporta le modifiche più recenti ai contenuti del sito.',
'recentchanges-label-newpage' => 'Questa modifica ha creato una nuova pagina',
'recentchanges-label-minor' => 'Questa è una modifica minore',
@@ -1649,7 +1725,6 @@ Il tuo indirizzo non viene rivelato quando gli altri utenti ti contattano.',
'recentchangeslinked-feed' => 'Modifiche correlate',
'recentchangeslinked-toolbox' => 'Modifiche correlate',
'recentchangeslinked-title' => 'Modifiche correlate a "$1"',
-'recentchangeslinked-noresult' => 'Nessuna modifica alle pagine collegate nel periodo specificato.',
'recentchangeslinked-summary' => "Questa pagina speciale mostra le modifiche più recenti alle pagine collegate da quella specificata (o contenute nella categoria specificata).
Le pagine contenute nella propria lista degli [[Special:Watchlist|Osservati speciali]] sono evidenziate in '''grassetto'''.",
'recentchangeslinked-page' => 'Nome della pagina:',
@@ -1661,7 +1736,7 @@ Le pagine contenute nella propria lista degli [[Special:Watchlist|Osservati spec
'reuploaddesc' => 'Torna al modulo per il caricamento.',
'upload-tryagain' => 'Invia la descrizione del file modificato',
'uploadnologin' => 'Accesso non effettuato',
-'uploadnologintext' => "Il caricamento dei file è consentito solo agli utenti registrati che hanno eseguito [[Special:UserLogin|l'accesso]] al sito.",
+'uploadnologintext' => 'Per caricare file è necessario $1.',
'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',
@@ -1877,7 +1952,6 @@ Per una sicurezza ottimale, img_auth.php è disattivato.',
'http-read-error' => 'Errore di lettura HTTP.',
'http-timed-out' => 'Richiesta HTTP scaduta.',
'http-curl-error' => "Errore durante il recupero dell'URL: $1",
-'http-host-unreachable' => 'URL non raggiungibile.',
'http-bad-status' => "C'è stato un problema durante la richiesta HTTP: $1 $2",
# Some likely curl errors. More could be added from <http://curl.haxx.se/libcurl/c/libcurl-errors.html>
@@ -1905,6 +1979,10 @@ Per una sicurezza ottimale, img_auth.php è disattivato.',
'listfiles_size' => 'Dimensione in byte',
'listfiles_description' => 'Descrizione',
'listfiles_count' => 'Versioni',
+'listfiles-show-all' => 'Includi le vecchie versioni delle immagini',
+'listfiles-latestversion' => 'Versione attuale',
+'listfiles-latestversion-yes' => 'Sì',
+'listfiles-latestversion-no' => 'No',
# File description page
'file-anchor-link' => 'File',
@@ -2000,6 +2078,13 @@ Probabilmente vuoi modificare la descrizione presente nella [$2 pagina di descri
'randompage' => 'Una pagina a caso',
'randompage-nopages' => 'Non ci sono pagine {{PLURAL:$2|nel seguente namespace|nei seguenti namespace}}: $1.',
+# Random page in category
+'randomincategory' => 'Pagina casuale in una categoria',
+'randomincategory-invalidcategory' => '"$1" non è un nome di categoria valido.',
+'randomincategory-nopages' => 'Non ci sono pagine in [[:Category:$1]].',
+'randomincategory-selectcategory' => 'Ottieni una pagina casuale dalla categoria: $1 $2.',
+'randomincategory-selectcategory-submit' => 'Vai',
+
# Random redirect
'randomredirect' => 'Un redirect a caso',
'randomredirect-nopages' => 'Non ci sono redirect nel namespace "$1".',
@@ -2025,17 +2110,13 @@ Probabilmente vuoi modificare la descrizione presente nella [$2 pagina di descri
'statistics-users-active-desc' => "Utenti che hanno effettuato un'azione {{PLURAL:$1|nell'ultimo giorno|negli ultimi $1 giorni}}",
'statistics-mostpopular' => 'Pagine più visitate',
-'disambiguations' => 'Pagine che si collegano a pagine di disambiguazione',
-'disambiguationspage' => 'Template:Disambigua',
-'disambiguations-text' => "Le pagine nella lista che segue contengono almeno un collegamento a una '''pagina di disambiguazione'''.
-Esse potrebbero dover puntare a una pagina più appropriata.<br />
-Vengono considerate pagine di disambiguazione tutte quelle che contengono i template elencati in [[MediaWiki:Disambiguationspage]].",
-
'pageswithprop' => 'Pagine con una proprietà di pagina',
'pageswithprop-legend' => 'Pagine con una proprietà di pagina',
'pageswithprop-text' => 'Questa pagina elenca le pagine che utilizzano una particolare proprietà di pagina.',
'pageswithprop-prop' => 'Nome proprietà:',
'pageswithprop-submit' => 'Vai',
+'pageswithprop-prophidden-long' => 'valore testuale lungo della proprietà nascosto ($1)',
+'pageswithprop-prophidden-binary' => 'valore binario della proprietà nascosto ($1)',
'doubleredirects' => 'Redirect doppi',
'doubleredirectstext' => 'In questa pagina sono elencate pagine che reindirizzano ad altre pagine di redirect.
@@ -2093,6 +2174,7 @@ I redirect <del>cancellati</del> sono stati corretti.',
'mostrevisions' => 'Pagine con più versioni',
'prefixindex' => 'Indice delle pagine per lettere iniziali',
'prefixindex-namespace' => 'Tutte le pagine con il prefisso del namespace $1',
+'prefixindex-strip' => "Nascondi prefisso nell'elenco",
'shortpages' => 'Pagine più corte',
'longpages' => 'Pagine più lunghe',
'deadendpages' => 'Pagine senza uscita',
@@ -2108,6 +2190,7 @@ I redirect <del>cancellati</del> sono stati corretti.',
'listusers' => 'Elenco degli utenti',
'listusers-editsonly' => 'Mostra solo utenti con dei contributi',
'listusers-creationsort' => 'Ordina per data di creazione',
+'listusers-desc' => 'Ordina in senso decrescente',
'usereditcount' => '$1 {{PLURAL:$1|contributo|contributi}}',
'usercreated' => '{{GENDER:$3|Creato/a}} il $1 alle $2',
'newpages' => 'Pagine più recenti',
@@ -2285,10 +2368,9 @@ D\'ora in poi, le modifiche apportate alla pagina e alla sua discussione verrann
'unwatchthispage' => 'Smetti di seguire',
'notanarticle' => 'Questa pagina non è una voce',
'notvisiblerev' => 'La revisione è stata cancellata',
-'watchnochange' => 'Nessuna delle pagine osservate è stata modificata nel periodo selezionato.',
'watchlist-details' => 'La lista degli osservati speciali contiene {{PLURAL:$1|una pagina (e la rispettiva pagina di discussione)|$1 pagine (e le rispettive pagine di discussione)}}.',
-'wlheader-enotif' => '* La notifica via e-mail è attiva.',
-'wlheader-showupdated' => "* Le pagine che sono state modificate dopo l'ultima visita sono evidenziate in '''grassetto'''.",
+'wlheader-enotif' => 'La notifica via email è attiva.',
+'wlheader-showupdated' => "Le pagine che sono state modificate dopo l'ultima visita sono evidenziate in '''grassetto'''.",
'watchmethod-recent' => 'controllo delle modifiche recenti per gli osservati speciali',
'watchmethod-list' => 'controllo degli osservati speciali per modifiche recenti',
'watchlistcontains' => 'La lista degli osservati speciali contiene {{PLURAL:$1|una pagina|$1 pagine}}.',
@@ -2529,7 +2611,7 @@ $1',
'contributions' => 'Contributi {{GENDER:$1|utente}}',
'contributions-title' => 'Contributi di $1',
'mycontris' => 'contributi',
-'contribsub2' => 'Per $1 ($2)',
+'contribsub2' => 'Per {{GENDER:$3|$1}} ($2)',
'nocontribs' => 'Non sono state trovate modifiche che soddisfino i criteri di ricerca.',
'uctop' => '(attuale)',
'month' => 'Dal mese (e precedenti):',
@@ -2685,13 +2767,11 @@ Consultare l'[[Special:BlockList|elenco dei blocchi]] per l'elenco dei bandi o b
'ipb_blocked_as_range' => "Errore: L'indirizzo IP $1 non è soggetto a blocco individuale e non può essere sbloccato. Il blocco è invece attivo a livello dell'intervallo $2, che può essere sbloccato.",
'ip_range_invalid' => 'Intervallo di indirizzi IP non valido.',
'ip_range_toolarge' => 'Non è possibile bloccare range superiori al /$1',
-'blockme' => 'Bloccami',
'proxyblocker' => 'Blocco dei proxy aperti',
-'proxyblocker-disabled' => 'Questa funzione è disabilitata.',
'proxyblockreason' => 'Questo indirizzo IP è stato bloccato perché risulta essere un proxy aperto. Si prega di contattare il proprio fornitore di accesso a Internet o il supporto tecnico e informarli di questo grave problema di sicurezza.',
-'proxyblocksuccess' => 'Fatto.',
'sorbsreason' => 'Questo indirizzo IP è elencato come proxy aperto nella blacklist DNSBL utilizzata da {{SITENAME}}.',
'sorbs_create_account_reason' => 'Non è possibile creare nuovi accessi da questo indirizzo IP perché è elencato come proxy aperto nella blacklist DNSBL utilizzata da {{SITENAME}}.',
+'xffblockreason' => "Un indirizzo IP presente nell'intestazione X-Forwarded-For, tuo o del server proxy che stai utilizzando, è stato bloccato. La motivazione originale del blocco è: $1",
'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',
@@ -2841,6 +2921,8 @@ Visitare [//www.mediawiki.org/wiki/Localisation MediaWiki Localisation] e [//tra
'thumbnail-more' => 'Ingrandisci',
'filemissing' => 'File mancante',
'thumbnail_error' => 'Errore nella creazione della miniatura: $1',
+'thumbnail_error_remote' => 'Messaggio di errore da $1:
+$2',
'djvu_page_error' => 'Numero di pagina DjVu errato',
'djvu_no_xml' => "Impossibile ottenere l'XML per il file DjVu",
'thumbnail-temp-create' => 'Impossibile creare il file temporaneo delle miniature',
@@ -2988,17 +3070,11 @@ Tutte le operazioni di importazione trans-wiki sono registrate nel [[Special:Log
# Stylesheets
'common.css' => '/* Gli stili CSS inseriti qui si applicano a tutte le skin */',
-'standard.css' => '/* Gli stili CSS inseriti qui si applicano agli utenti che usano la skin Standard */',
-'nostalgia.css' => '/* Gli stili CSS inseriti qui si applicano agli utenti che usano la skin Nostalgia */',
'cologneblue.css' => '/* Gli stili CSS inseriti qui si applicano agli utenti che usano la skin Cologne Blue */',
'monobook.css' => '/* Gli stili CSS inseriti qui si applicano agli utenti che usano la skin Monobook */',
-'myskin.css' => '/* Gli stili CSS inseriti qui si applicano agli utenti che usano la skin MySkin */',
-'chick.css' => '/* Gli stili CSS inseriti qui si applicano agli utenti che usano la skin Chick */',
-'simple.css' => '/* Gli stili CSS inseriti qui si applicano agli utenti che usano la skin Simple */',
'modern.css' => '/* Gli stili CSS inseriti qui si applicano agli utenti che usano la skin Modern */',
'vector.css' => '/* Gli stili CSS inseriti qui si applicano agli utenti che usano la skin Vector */',
'print.css' => "/* Gli stili CSS inseriti qui si applicano all'output in stampa */",
-'handheld.css' => '/* Gli stili CSS inseriti qui si applicano ai dispositivi portatili basati sulla skin configurata in $wgHandheldStyle */',
'noscript.css' => '/ * Gli stili CSS inseriti qui si applicano agli utenti che hanno JavaScript disabilitato * /',
'group-autoconfirmed.css' => '/ * Gli stili CSS inseriti qui si applicheranno solo ad utenti autoconvalidati * /',
'group-bot.css' => '/ * Gli stili CSS inseriti qui si applicheranno solo ai bot * /',
@@ -3007,13 +3083,8 @@ Tutte le operazioni di importazione trans-wiki sono registrate nel [[Special:Log
# Scripts
'common.js' => '/* Il codice JavaScript inserito qui viene caricato da ciascuna pagina, per tutti gli utenti. */',
-'standard.js' => '/* Il codice JavaScript inserito qui viene caricato dagli utenti che usano la skin Standard */',
-'nostalgia.js' => '/* Il codice JavaScript inserito qui viene caricato dagli utenti che usano la skin Nostalgia */',
'cologneblue.js' => '/* Il codice JavaScript inserito qui viene caricato dagli utenti che usano la skin Cologne Blue */',
'monobook.js' => '/* Il codice JavaScript inserito qui viene caricato dagli utenti che usano la skin MonoBook */',
-'myskin.js' => '/* Il codice JavaScript inserito qui viene caricato dagli utenti che usano la skin MySkin */',
-'chick.js' => '/* Il codice JavaScript inserito qui viene caricato dagli utenti che usano la skin Chick */',
-'simple.js' => '/* Il codice JavaScript inserito qui viene caricato dagli utenti che usano la skin Simple */',
'modern.js' => '/* Il codice JavaScript inserito qui viene caricato dagli utenti che usano la skin Modern */',
'vector.js' => '/* Il codice JavaScript inserito qui viene caricato dagli utenti che usano la skin Vector */',
'group-autoconfirmed.js' => '/ * Il codice JavaScript inserito qui viene caricato solo per gli utenti autoconvalidati * /',
@@ -3091,9 +3162,6 @@ Tutte le operazioni di importazione trans-wiki sono registrate nel [[Special:Log
'pageinfo-category-subcats' => 'Numero di sottocategorie',
'pageinfo-category-files' => 'Numero di file',
-# Skin names
-'skinname-nostalgia' => 'Nostalgia',
-
# Patrolling
'markaspatrolleddiff' => 'Segna la modifica come verificata',
'markaspatrolledtext' => 'Segna questa pagina come verificata',
@@ -3172,11 +3240,25 @@ $1',
'minutes' => '{{PLURAL:$1|un minuto|$1 minuti}}',
'hours' => "{{PLURAL:$1|un'ora|$1 ore}}",
'days' => '{{PLURAL:$1|$1 giorno|$1 giorni}}',
+'weeks' => '{{PLURAL:$1|$1 settimana|$1 settimane}}',
'months' => '{{PLURAL:$1|$1 mese|$1 mesi}}',
'years' => '{{PLURAL:$1|$1 anno|$1 anni}}',
'ago' => '$1 fa',
'just-now' => 'proprio ora',
+# Human-readable timestamps
+'hours-ago' => '$1 {{PLURAL:$1|ora|ore}} fa',
+'minutes-ago' => '$1 {{PLURAL:$1|minuto|minuti}} fa',
+'seconds-ago' => '$1 {{PLURAL:$1|secondo|secondi}} fa',
+'monday-at' => 'Lunedì alle $1',
+'tuesday-at' => 'Martedì alle $1',
+'wednesday-at' => 'Mercoledì alle $1',
+'thursday-at' => 'Giovedì alle $1',
+'friday-at' => 'Venerdì alle $1',
+'saturday-at' => 'Sabato alle $1',
+'sunday-at' => 'Domenica alle $1',
+'yesterday-at' => 'Ieri alle $1',
+
# Bad image list
'bad_image_list' => "Il formato è il seguente:
@@ -3203,7 +3285,7 @@ I collegamenti successivi, sulla stessa riga, sono considerati come eccezioni (o
* gpslongitude
* gpsaltitude",
-# EXIF tags
+# Exif tags
'exif-imagewidth' => 'Larghezza',
'exif-imagelength' => 'Altezza',
'exif-bitspersample' => 'Bit per campione',
@@ -3381,7 +3463,7 @@ I collegamenti successivi, sulla stessa riga, sono considerati come eccezioni (o
'exif-originalimageheight' => "Altezza dell'immagine prima che fosse ritagliata",
'exif-originalimagewidth' => "Larghezza dell'immagine prima che fosse ritagliata",
-# EXIF attributes
+# Exif attributes
'exif-compression-1' => 'Nessuno',
'exif-compression-2' => 'CCITT gruppo 3 monodimensionale - codifica run length di Huffman modificata',
'exif-compression-3' => 'Codifica fax CCITT Group 3',
@@ -3789,7 +3871,6 @@ Si noti che è anche possibile [[Special:EditWatchlist|modificare la lista con l
'version-other' => 'Altro',
'version-mediahandlers' => 'Gestori di contenuti multimediali',
'version-hooks' => 'Hook',
-'version-extension-functions' => 'Funzioni introdotte da estensioni',
'version-parser-extensiontags' => 'Tag riconosciuti dal parser introdotti da estensioni',
'version-parser-function-hooks' => 'Hook per funzioni del parser',
'version-hook-name' => "Nome dell'hook",
@@ -3798,6 +3879,7 @@ Si noti che è anche possibile [[Special:EditWatchlist|modificare la lista con l
'version-license' => 'Licenza',
'version-poweredby-credits' => "Questo wiki è realizzato con '''[//www.mediawiki.org/ MediaWiki]''', copyright © 2001-$1 $2.",
'version-poweredby-others' => 'altri',
+'version-poweredby-translators' => 'traduttori di translatewiki.net',
'version-credits-summary' => 'Siamo lieti di riconoscere le seguenti persone per aver contribuito a [[Special:Version|MediaWiki]].',
'version-license-info' => 'MediaWiki è un software libero; puoi 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.
@@ -3813,12 +3895,17 @@ Questo programma deve essere distribuito assieme ad [{{SERVER}}{{SCRIPTPATH}}/CO
'version-entrypoints-articlepath' => '[https://www.mediawiki.org/wiki/Manual:$wgArticlePath Percorso voci]',
'version-entrypoints-scriptpath' => '[https://www.mediawiki.org/wiki/Manual:$wgScriptPath Percorso script]',
-# Special:FilePath
-'filepath' => 'Percorso di un file',
-'filepath-page' => 'Nome del file:',
-'filepath-submit' => 'Vai',
-'filepath-summary' => 'Questa pagina speciale restituisce il percorso completo di un file.
-Le immagini vengono mostrate alla massima risoluzione disponibile, per gli altri tipi di file viene avviato direttamente il programma associato.',
+# Special:Redirect
+'redirect' => 'Reindirizzamento da file, utente o ID versione',
+'redirect-legend' => 'Reindirizza a un file o una pagina',
+'redirect-summary' => 'Questa pagina speciale reindirizza a un file (specificando il nome del file), a una pagina (specificando un ID di versione) o a un utente (specificando un ID utente numerico).',
+'redirect-submit' => 'Vai',
+'redirect-lookup' => 'Ricerca:',
+'redirect-value' => 'Valore:',
+'redirect-user' => 'ID utente',
+'redirect-revision' => 'Versione pagina',
+'redirect-file' => 'Nome del file',
+'redirect-not-exists' => 'Valore non trovato',
# Special:FileDuplicateSearch
'fileduplicatesearch' => 'Ricerca dei file duplicati',
@@ -3868,12 +3955,16 @@ Le immagini vengono mostrate alla massima risoluzione disponibile, per gli altri
'tags' => 'Etichette di modifiche valide',
'tag-filter' => 'Filtra per [[Special:Tags|etichetta]]:',
'tag-filter-submit' => 'Filtra',
+'tag-list-wrapper' => '([[Special:Tags|{{PLURAL:$1|Etichetta|Etichette}}]]: $2)',
'tags-title' => 'Etichette',
'tags-intro' => 'Questa pagina elenca le etichette che il software potrebbe associare a una modifica e il loro significato.',
'tags-tag' => "Nome dell'etichetta",
'tags-display-header' => 'Aspetto nella lista delle modifiche',
'tags-description-header' => 'Descrizione completa del significato',
+'tags-active-header' => 'Attivo?',
'tags-hitcount-header' => 'Modifiche che hanno etichetta',
+'tags-active-yes' => 'Sì',
+'tags-active-no' => 'No',
'tags-edit' => 'modifica',
'tags-hitcount' => '$1 {{PLURAL:$1|modifica|modifiche}}',
@@ -3894,6 +3985,7 @@ Le immagini vengono mostrate alla massima risoluzione disponibile, per gli altri
'dberr-problems' => 'Questo sito sta avendo dei problemi tecnici.',
'dberr-again' => 'Prova ad attendere qualche minuto e ricaricare.',
'dberr-info' => '(Impossibile contattare il server del database: $1)',
+'dberr-info-hidden' => '(Impossibile contattare il server del database)',
'dberr-usegoogle' => 'Puoi provare a cercare su Google nel frattempo.',
'dberr-outofdate' => 'Nota che la loro indicizzazione dei nostri contenuti potrebbe non essere aggiornata.',
'dberr-cachederror' => 'Quella che segue è una copia cache della pagina richiesta, e potrebbe non essere aggiornata.',
@@ -3909,6 +4001,9 @@ Le immagini vengono mostrate alla massima risoluzione disponibile, per gli altri
'htmlform-submit' => 'Invia',
'htmlform-reset' => 'Annulla modifiche',
'htmlform-selectorother-other' => 'Altro',
+'htmlform-no' => 'No',
+'htmlform-yes' => 'Sì',
+'htmlform-chosen-placeholder' => "Seleziona un'opzione",
# SQLite database support
'sqlite-has-fts' => '$1 con la possibilità di ricerca completa nel testo',
@@ -4025,4 +4120,19 @@ Le immagini vengono mostrate alla massima risoluzione disponibile, per gli altri
# Image rotation
'rotate-comment' => 'Immagine ruotata di $1 {{PLURAL:$1|grado|gradi}} in senso orario',
+# Limit report
+'limitreport-title' => 'Dati profilo del parser:',
+'limitreport-cputime' => 'Tempo di utilizzo CPU',
+'limitreport-cputime-value' => '$1 {{PLURAL:$1|secondo|secondi}}',
+'limitreport-walltime' => 'Tempo di utilizzo reale',
+'limitreport-walltime-value' => '$1 {{PLURAL:$1|secondo|secondi}}',
+'limitreport-ppvisitednodes' => 'Numero nodi preprocessore visitati',
+'limitreport-ppgeneratednodes' => 'Numero nodi preprocessore generati',
+'limitreport-postexpandincludesize' => 'Dimensione inclusioni post-espansione',
+'limitreport-postexpandincludesize-value' => '$1/$2 {{PLURAL:$2|byte}}',
+'limitreport-templateargumentsize' => 'Dimensione parametri template',
+'limitreport-templateargumentsize-value' => '$1/$2 {{PLURAL:$2|byte}}',
+'limitreport-expansiondepth' => 'Massima profondità di espansione',
+'limitreport-expensivefunctioncount' => 'Numero funzioni parser dispendiose',
+
);
diff --git a/languages/messages/MessagesJa.php b/languages/messages/MessagesJa.php
index f7a96970..29a2f53b 100644
--- a/languages/messages/MessagesJa.php
+++ b/languages/messages/MessagesJa.php
@@ -59,6 +59,7 @@
* @author 欅
* @author è‹ç‡­Î±
* @author é’å­å®ˆæ­Œ
+ * @author ì•„ë¼
*/
$datePreferences = array(
@@ -132,7 +133,7 @@ $specialPageAliases = array(
'Deadendpages' => array( '有効ãªãƒšãƒ¼ã‚¸ã¸ã®ãƒªãƒ³ã‚¯ãŒãªã„ページ', 'è¡Œãæ­¢ã¾ã‚Šãƒšãƒ¼ã‚¸' ),
'DeletedContributions' => array( '削除ã•ã‚ŒãŸæŠ•ç¨¿è¨˜éŒ²', '削除ã•ã‚ŒãŸæŠ•ç¨¿å±¥æ­´', '削除歴' ),
'Disambiguations' => array( '曖昧ã•å›žé¿ã®ãƒšãƒ¼ã‚¸', '曖昧ã•å›žé¿' ),
- 'DoubleRedirects' => array( '二é‡ãƒªãƒ€ã‚¤ãƒ¬ã‚¯ãƒˆ' ),
+ 'DoubleRedirects' => array( '二é‡ãƒªãƒ€ã‚¤ãƒ¬ã‚¯ãƒˆ', '二é‡è»¢é€' ),
'EditWatchlist' => array( 'ウォッãƒãƒªã‚¹ãƒˆã®ç·¨é›†', 'ウォッãƒãƒªã‚¹ãƒˆç·¨é›†' ),
'Emailuser' => array( 'メールé€ä¿¡', 'ウィキメール' ),
'Export' => array( 'データ書ã出ã—', 'データー書ã出ã—', 'エクスãƒãƒ¼ãƒˆ' ),
@@ -141,6 +142,7 @@ $specialPageAliases = array(
'Filepath' => array( 'パスã®å–å¾—' ),
'Import' => array( 'データå–ã‚Šè¾¼ã¿', 'データーå–ã‚Šè¾¼ã¿', 'インãƒãƒ¼ãƒˆ' ),
'Invalidateemail' => array( 'メール無効化', 'メール無効' ),
+ 'JavaScriptTest' => array( 'JavaScriptテスト', 'JavaScript試験' ),
'BlockList' => array( 'ブロック一覧', 'ブロックã®ä¸€è¦§' ),
'LinkSearch' => array( '外部リンク検索' ),
'Listadmins' => array( '管ç†è€…一覧' ),
@@ -157,6 +159,7 @@ $specialPageAliases = array(
'MIMEsearch' => array( 'MIME検索', 'MIMEタイプ検索' ),
'Mostcategories' => array( 'カテゴリã®å¤šã„ページ', 'カテゴリã®å¤šã„é …ç›®' ),
'Mostimages' => array( '被リンクã®å¤šã„ファイル', '使用箇所ã®å¤šã„ファイル' ),
+ 'Mostinterwikis' => array( 'ウィキ間リンクã®å¤šã„ページ' ),
'Mostlinked' => array( '被リンクã®å¤šã„ページ' ),
'Mostlinkedcategories' => array( '被リンクã®å¤šã„カテゴリ' ),
'Mostlinkedtemplates' => array( '使用箇所ã®å¤šã„テンプレート', '被リンクã®å¤šã„テンプレート' ),
@@ -167,7 +170,8 @@ $specialPageAliases = array(
'Mytalk' => array( 'トークページ', '会話ページ', 'マイトーク', 'マイ・トーク' ),
'Myuploads' => array( '自分ã®ã‚¢ãƒƒãƒ—ロード記録' ),
'Newimages' => array( 'æ–°ç€ãƒ•ã‚¡ã‚¤ãƒ«', 'æ–°ã—ã„ファイルã®ä¸€è¦§', 'æ–°ç€ç”»åƒå±•ç¤ºå®¤' ),
- 'Newpages' => array( 'æ–°ã—ã„ページ', 'æ–°è¦é …ç›®' ),
+ 'Newpages' => array( 'æ–°ã—ã„ページ' ),
+ 'PagesWithProp' => array( 'プロパティãŒã‚るページ' ),
'PasswordReset' => array( 'パスワードå†è¨­å®š', 'パスワードã®å†è¨­å®š', 'パスワードã®ãƒªã‚»ãƒƒãƒˆ', 'パスワードリセット' ),
'PermanentLink' => array( '固定リンク', 'パーマリンク' ),
'Popularpages' => array( '人気ページ' ),
@@ -179,6 +183,7 @@ $specialPageAliases = array(
'Randomredirect' => array( 'ãŠã¾ã‹ã›ãƒªãƒ€ã‚¤ãƒ¬ã‚¯ãƒˆ', 'ãŠã¾ã‹ã›è»¢é€' ),
'Recentchanges' => array( '最近ã®æ›´æ–°', '最近更新ã—ãŸãƒšãƒ¼ã‚¸' ),
'Recentchangeslinked' => array( '関連ページã®æ›´æ–°çŠ¶æ³', 'リンク先ã®æ›´æ–°çŠ¶æ³' ),
+ 'Redirect' => array( '転é€', 'リダイレクト' ),
'Revisiondelete' => array( '版指定削除', '特定版削除' ),
'Search' => array( '検索' ),
'Shortpages' => array( '短ã„ページ' ),
@@ -392,9 +397,6 @@ $messages = array(
'tog-shownumberswatching' => 'ページをウォッãƒã—ã¦ã„る利用者数を表示',
'tog-oldsig' => '既存ã®ç½²å:',
'tog-fancysig' => 'ç½²åをウィキ文ã¨ã—ã¦æ‰±ã† (自動リンクãªã—)',
-'tog-externaleditor' => '既定ã§ç·¨é›†ã«å¤–部アプリケーションを使用 (上級者å‘ã‘ã€ã‚³ãƒ³ãƒ”ューターã«ç‰¹æ®Šãªè¨­å®šãŒå¿…è¦ã€‚[//www.mediawiki.org/wiki/Manual:External_editors 詳細])',
-'tog-externaldiff' => '差分表示ã«å¤–部アプリケーションを使用 (上級者å‘ã‘ã€ã‚³ãƒ³ãƒ”ューターã«ç‰¹æ®Šãªè¨­å®šãŒå¿…è¦ã€‚[//www.mediawiki.org/wiki/Manual:External_editors 詳細])',
-'tog-showjumplinks' => '利用ã—ã‚„ã™ã•å‘上ã®ãŸã‚ã®ã€Œ{{int:jumpto}}ã€ãƒªãƒ³ã‚¯ã‚’有効ã«ã™ã‚‹',
'tog-uselivepreview' => 'ライブプレビューを使用 (開発中)',
'tog-forceeditsummary' => 'è¦ç´„欄ãŒç©ºæ¬„ã®å ´åˆã«ç¢ºèªã‚’促ã™',
'tog-watchlisthideown' => 'ウォッãƒãƒªã‚¹ãƒˆã«è‡ªåˆ†ã®ç·¨é›†ã‚’表示ã—ãªã„',
@@ -408,6 +410,8 @@ $messages = array(
'tog-showhiddencats' => 'éš ã—カテゴリを表示',
'tog-noconvertlink' => 'リンクタイトル変æ›ã‚’無効ã«ã™ã‚‹',
'tog-norollbackdiff' => 'å·»ã戻ã—後ã®å·®åˆ†ã‚’表示ã—ãªã„',
+'tog-useeditwarning' => '変更をä¿å­˜ã›ãšã«ç·¨é›†ç”»é¢ã‹ã‚‰é›¢ã‚Œã‚ˆã†ã¨ã—ãŸã‚‰è­¦å‘Š',
+'tog-prefershttps' => 'ログインã™ã‚‹éš›ã€å¸¸ã« SSL (https) 接続を使用ã™ã‚‹',
'underline-always' => '常ã«ä»˜ã‘ã‚‹',
'underline-never' => '常ã«ä»˜ã‘ãªã„',
@@ -471,6 +475,18 @@ $messages = array(
'oct' => '10月',
'nov' => '11月',
'dec' => '12月',
+'january-date' => '1月$1日',
+'february-date' => '2月$1日',
+'march-date' => '3月$1日',
+'april-date' => '4月$1日',
+'may-date' => '5月$1日',
+'june-date' => '6月$1日',
+'july-date' => '7月$1日',
+'august-date' => '8月$1日',
+'september-date' => '9月$1日',
+'october-date' => '10月$1日',
+'november-date' => '11月$1日',
+'december-date' => '12月$1日',
# Categories related messages
'pagecategories' => '{{PLURAL:$1|カテゴリ}}',
@@ -552,6 +568,7 @@ $messages = array(
'create-this-page' => 'ã“ã®ãƒšãƒ¼ã‚¸ã‚’作æˆ',
'delete' => '削除',
'deletethispage' => 'ã“ã®ãƒšãƒ¼ã‚¸ã‚’削除',
+'undeletethispage' => 'ã“ã®ãƒšãƒ¼ã‚¸ã‚’復元',
'undelete_short' => '{{PLURAL:$1|$1 編集}}を復元',
'viewdeleted_short' => '{{PLURAL:$1|削除ã•ã‚ŒãŸ $1 編集}}を閲覧',
'protect' => 'ä¿è­·',
@@ -595,7 +612,7 @@ $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).
+# 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).
'aboutsite' => '{{SITENAME}}ã«ã¤ã„ã¦',
'aboutpage' => 'Project:{{SITENAME}}ã«ã¤ã„ã¦',
'copyright' => '特ã«è¨˜è¼‰ãŒãªã„é™ã‚Šã€å†…容ã¯$1ã®ãƒ©ã‚¤ã‚»ãƒ³ã‚¹ã§åˆ©ç”¨ã§ãã¾ã™ã€‚',
@@ -605,7 +622,6 @@ $1',
'disclaimers' => 'å…責事項',
'disclaimerpage' => 'Project:å…責事項',
'edithelp' => '編集ã®ä»•æ–¹',
-'edithelppage' => 'Help:編集',
'helppage' => 'Help:目次',
'mainpage' => 'メインページ',
'mainpage-description' => 'メインページ',
@@ -685,17 +701,12 @@ URL ã‚’é–“é•ã£ã¦å…¥åŠ›ã—ãŸã‹ã€æ­£ã—ããªã„リンクをãŸã©ã£ãŸå¯è
# General errors
'error' => 'エラー',
'databaseerror' => 'データベース エラー',
-'dberrortext' => 'データベース クエリã®æ§‹æ–‡ã‚¨ãƒ©ãƒ¼ãŒç™ºç”Ÿã—ã¾ã—ãŸã€‚
-ソフトウェアã«ãƒã‚°ãŒã‚ã‚‹å¯èƒ½æ€§ãŒã‚ã‚Šã¾ã™ã€‚
-最後ã«å®Ÿè¡Œã‚’試ã¿ãŸã‚¯ã‚¨ãƒª:
-<blockquote><code>$1</code></blockquote>
-(関数「<code>$2</code>ã€å†…)。
-データベースã¯ã‚¨ãƒ©ãƒ¼ã€Œ<samp>$3: $4</samp>ã€ã‚’è¿”ã—ã¾ã—ãŸã€‚',
-'dberrortextcl' => 'データベース クエリã®æ§‹æ–‡ã‚¨ãƒ©ãƒ¼ãŒç™ºç”Ÿã—ã¾ã—ãŸã€‚
-最後ã«å®Ÿè¡Œã‚’試ã¿ãŸã‚¯ã‚¨ãƒª:
-「$1ã€
-(関数「$2ã€å†…)。
-データベースã¯ã‚¨ãƒ©ãƒ¼ã€Œ$3: $4ã€ã‚’è¿”ã—ã¾ã—ãŸ',
+'databaseerror-text' => 'データベース クエリã®ã‚¨ãƒ©ãƒ¼ãŒç™ºç”Ÿã—ã¾ã—ãŸã€‚
+ã“ã‚Œã¯ã‚½ãƒ•ãƒˆã‚¦ã‚§ã‚¢ã®ãƒã‚°ã§ã‚ã‚‹å¯èƒ½æ€§ãŒã‚ã‚Šã¾ã™ã€‚',
+'databaseerror-textcl' => 'データベース クエリã®ã‚¨ãƒ©ãƒ¼ãŒç™ºç”Ÿã—ã¾ã—ãŸã€‚',
+'databaseerror-query' => 'クエリ: $1',
+'databaseerror-function' => '関数: $1',
+'databaseerror-error' => 'エラー: $1',
'laggedslavemode' => "'''警告:''' ページã«æœ€æ–°ã®ç·¨é›†ãŒå映ã•ã‚Œã¦ã„ãªã„å¯èƒ½æ€§ãŒã‚ã‚Šã¾ã™ã€‚",
'readonly' => 'データベースãŒãƒ­ãƒƒã‚¯ã•ã‚Œã¦ã„ã¾ã™',
'enterlockreason' => 'ロックã®ç†ç”±ã¨ãƒ­ãƒƒã‚¯è§£é™¤ã®äºˆå®šã‚’入力ã—ã¦ãã ã•ã„',
@@ -729,6 +740,7 @@ URL ã‚’é–“é•ã£ã¦å…¥åŠ›ã—ãŸã‹ã€æ­£ã—ããªã„リンクをãŸã©ã£ãŸå¯è
'cannotdelete-title' => '「$1ã€ã¨ã„ã†ãƒšãƒ¼ã‚¸ã‚’削除ã§ãã¾ã›ã‚“',
'delete-hook-aborted' => 'フックã«ã‚ˆã£ã¦å‰Šé™¤ãŒä¸­æ­¢ã•ã‚Œã¾ã—ãŸã€‚
ç†ç”±ã¯ä¸æ˜Žã§ã™ã€‚',
+'no-null-revision' => 'ページ「$1ã€ã«æ–°ã—ã„空編集ã®ç‰ˆã‚’作æˆã§ãã¾ã›ã‚“ã§ã—ãŸã€‚',
'badtitle' => 'æ­£ã—ããªã„ページå',
'badtitletext' => '無効ã¾ãŸã¯ç©ºã®ãƒšãƒ¼ã‚¸åãŒæŒ‡å®šã•ã‚ŒãŸã‹ã€è¨€èªžé–“/ウィキ間リンクã®æ–¹æ³•ã«èª¤ã‚ŠãŒã‚ã‚Šã¾ã™ã€‚
ページåã«ä½¿ç”¨ã§ããªã„文字ãŒå«ã¾ã‚Œã¦ã„ã‚‹å¯èƒ½æ€§ãŒã‚ã‚Šã¾ã™ã€‚',
@@ -752,12 +764,15 @@ URL ã‚’é–“é•ã£ã¦å…¥åŠ›ã—ãŸã‹ã€æ­£ã—ããªã„リンクをãŸã©ã£ãŸå¯è
'editinginterface' => "'''警告:''' ソフトウェアã®ã‚¤ãƒ³ã‚¿ãƒ¼ãƒ•ã‚§ã‚¤ã‚¹ã«ä½¿ç”¨ã•ã‚Œã‚‹ãƒ†ã‚­ã‚¹ãƒˆã®ãƒšãƒ¼ã‚¸ã‚’編集ã—ã¦ã„ã¾ã™ã€‚
ã“ã®ãƒšãƒ¼ã‚¸ã‚’変更ã™ã‚‹ã¨ã€ã“ã®ã‚¦ã‚£ã‚­ã®ä»–ã®åˆ©ç”¨è€…ã®ãƒ¦ãƒ¼ã‚¶ãƒ¼ã‚¤ãƒ³ã‚¿ãƒ¼ãƒ•ã‚§ã‚¤ã‚¹ã®å¤–観ã«å½±éŸ¿ã—ã¾ã™ã€‚
ã™ã¹ã¦ã®ã‚¦ã‚£ã‚­ã«å¯¾ã—ã¦ç¿»è¨³ã‚’追加/変更ã™ã‚‹å ´åˆã¯ã€MediaWiki ã®åœ°åŸŸåŒ–プロジェクト [//translatewiki.net/wiki/Main_Page?setlang=ja translatewiki.net] を使用ã—ã¦ãã ã•ã„。",
-'sqlhidden' => '(SQL クエリéžè¡¨ç¤º)',
'cascadeprotected' => 'ã“ã®ãƒšãƒ¼ã‚¸ã¯ã€ã€Œã‚«ã‚¹ã‚±ãƒ¼ãƒ‰ä¿è­·ã€ãŒæŒ‡å®šã•ã‚ŒãŸçŠ¶æ…‹ã§ä¿è­·ã•ã‚Œã¦ã„る以下ã®{{PLURAL:$1|ページ|ページ群}}ã§èª­ã¿è¾¼ã¾ã‚Œã¦ã„ã‚‹ãŸã‚ã€ç·¨é›†ã§ããªã„よã†ã«ä¿è­·ã•ã‚Œã¦ã„ã¾ã™:
$2',
'namespaceprotected' => "'''$1'''åå‰ç©ºé–“ã«ã‚るページを編集ã™ã‚‹æ¨©é™ãŒã‚ã‚Šã¾ã›ã‚“。",
'customcssprotected' => 'ã“ã® CSS ページã¯ä»–ã®åˆ©ç”¨è€…ã®å€‹äººè¨­å®šã‚’å«ã‚“ã§ã„ã‚‹ãŸã‚ã€ã‚ãªãŸã«ã¯ç·¨é›†ã™ã‚‹æ¨©é™ãŒã‚ã‚Šã¾ã›ã‚“。',
'customjsprotected' => 'ã“ã® JavaScript ページã¯ä»–ã®åˆ©ç”¨è€…ã®å€‹äººè¨­å®šã‚’å«ã‚“ã§ã„ã‚‹ãŸã‚ã€ã‚ãªãŸã«ã¯ç·¨é›†ã™ã‚‹æ¨©é™ãŒã‚ã‚Šã¾ã›ã‚“。',
+'mycustomcssprotected' => 'ã‚ãªãŸã«ã¯ CSS ページを編集ã™ã‚‹æ¨©é™ãŒã‚ã‚Šã¾ã›ã‚“。',
+'mycustomjsprotected' => 'ã‚ãªãŸã«ã¯ JavaScript ページを編集ã™ã‚‹æ¨©é™ãŒã‚ã‚Šã¾ã›ã‚“。',
+'myprivateinfoprotected' => 'ã‚ãªãŸã«ã¯è‡ªèº«ã®éžå…¬é–‹æƒ…報を編集ã™ã‚‹æ¨©é™ãŒã‚ã‚Šã¾ã›ã‚“。',
+'mypreferencesprotected' => 'ã‚ãªãŸã«ã¯è‡ªèº«ã®å€‹äººè¨­å®šã‚’編集ã™ã‚‹æ¨©é™ãŒã‚ã‚Šã¾ã›ã‚“。',
'ns-specialprotected' => '特別ページã¯ç·¨é›†ã§ãã¾ã›ã‚“。',
'titleprotected' => "[[User:$1|$1]]ã«ã‚ˆã‚Šã“ã®ãƒšãƒ¼ã‚¸åã‚’æŒã¤ãƒšãƒ¼ã‚¸ã®ä½œæˆã¯ä¿è­·ã•ã‚Œã¦ã„ã¾ã™ã€‚
ç†ç”±ã¯ã€Œ''$2''ã€ã§ã™ã€‚",
@@ -782,10 +797,19 @@ $2',
'welcomecreation-msg' => 'アカウントãŒä½œæˆã•ã‚Œã¾ã—ãŸã€‚
[[Special:Preferences|{{SITENAME}}ã®å€‹äººè¨­å®š]]ã®å¤‰æ›´ã‚‚忘れãªã„よã†ã«ã—ã¦ãã ã•ã„。',
'yourname' => '利用者å:',
+'userlogin-yourname' => '利用者å',
+'userlogin-yourname-ph' => '利用者åを入力',
+'createacct-another-username-ph' => '利用者åを入力',
'yourpassword' => 'パスワード:',
+'userlogin-yourpassword' => 'パスワード',
+'userlogin-yourpassword-ph' => 'パスワードを入力',
+'createacct-yourpassword-ph' => 'パスワードを入力',
'yourpasswordagain' => 'パスワードå†å…¥åŠ›:',
+'createacct-yourpasswordagain' => 'パスワードå†å…¥åŠ›',
+'createacct-yourpasswordagain-ph' => 'パスワードをå†å…¥åŠ›',
'remembermypassword' => 'ã“ã®ãƒ–ラウザーã«ãƒ­ã‚°ã‚¤ãƒ³æƒ…報をä¿å­˜ (最長 $1 {{PLURAL:$1|æ—¥|日間}})',
-'securelogin-stick-https' => 'ログイン後も SSL (https) 接続を維æŒ',
+'userlogin-remembermypassword' => 'ログイン状態をä¿æŒ',
+'userlogin-signwithsecure' => 'SSL (https) 接続を使用',
'yourdomainname' => 'ドメイン:',
'password-change-forbidden' => 'ã“ã®ã‚¦ã‚£ã‚­ã§ã¯ãƒ‘スワードを変更ã§ãã¾ã›ã‚“。',
'externaldberror' => 'èªè¨¼ãƒ‡ãƒ¼ã‚¿ãƒ™ãƒ¼ã‚¹ã§ã‚¨ãƒ©ãƒ¼ãŒç™ºç”Ÿã—ãŸã€ã¾ãŸã¯å¤–部アカウントã®æ›´æ–°ãŒè¨±å¯ã•ã‚Œã¦ã„ã¾ã›ã‚“。',
@@ -797,18 +821,44 @@ $2',
'logout' => 'ログアウト',
'userlogout' => 'ログアウト',
'notloggedin' => 'ログインã—ã¦ã„ã¾ã›ã‚“',
+'userlogin-noaccount' => '登録ãŒã¾ã ã®å ´åˆ',
+'userlogin-joinproject' => '{{SITENAME}}ã®ã‚¢ã‚«ã‚¦ãƒ³ãƒˆã‚’作æˆ',
'nologin' => '登録ãŒã¾ã ã®å ´åˆã€$1。',
'nologinlink' => 'アカウントを作æˆã—ã¦ãã ã•ã„',
'createaccount' => 'アカウント作æˆ',
'gotaccount' => 'アカウントを既ã«æŒã£ã¦ã„ã‚‹å ´åˆã€$1。',
'gotaccountlink' => 'ログインã—ã¦ãã ã•ã„',
'userlogin-resetlink' => 'ログイン情報をãŠå¿˜ã‚Œã§ã™ã‹?',
+'userlogin-resetpassword-link' => 'パスワードをå†è¨­å®š',
+'helplogin-url' => 'Help:ログイン',
+'userlogin-helplink' => '[[{{MediaWiki:helplogin-url}}|ログインã®ãƒ˜ãƒ«ãƒ—]]',
+'userlogin-loggedin' => '{{GENDER:$1|$1}} ã¨ã—ã¦æ—¢ã«ãƒ­ã‚°ã‚¤ãƒ³ã—ã¦ã„ã¾ã™ã€‚
+別ã®åˆ©ç”¨è€…ã¨ã—ã¦ãƒ­ã‚°ã‚¤ãƒ³ã™ã‚‹ã«ã¯ä¸‹ã®ãƒ•ã‚©ãƒ¼ãƒ ã‚’使用ã—ã¦ãã ã•ã„。',
+'userlogin-createanother' => '別アカウントを作æˆ',
+'createacct-join' => '以下ã®æƒ…報を入力ã—ã¦ãã ã•ã„。',
+'createacct-another-join' => 'æ–°ã—ã„アカウントã®æƒ…報を以下ã«è¨˜å…¥ã—ã¦ãã ã•ã„。',
+'createacct-emailrequired' => 'メールアドレス',
+'createacct-emailoptional' => 'メールアドレス (çœç•¥å¯èƒ½)',
+'createacct-email-ph' => 'メールアドレスを入力',
+'createacct-another-email-ph' => 'メールアドレスを入力',
'createaccountmail' => '一時的ãªç„¡ä½œç‚ºã®ãƒ‘スワードを生æˆã—ã¦ã€æŒ‡å®šã—ãŸãƒ¡ãƒ¼ãƒ«ã‚¢ãƒ‰ãƒ¬ã‚¹ã«é€ä¿¡',
+'createacct-realname' => '本å (çœç•¥å¯èƒ½)',
'createaccountreason' => 'ç†ç”±:',
+'createacct-reason' => 'ç†ç”±',
+'createacct-reason-ph' => 'アカウントを作æˆã™ã‚‹ç†ç”±',
+'createacct-captcha' => '自動作æˆé˜²æ­¢ãƒã‚§ãƒƒã‚¯',
+'createacct-imgcaptcha-ph' => '上ã«è¡¨ç¤ºã•ã‚Œã¦ã„る文字列を入力',
+'createacct-submit' => 'アカウントを作æˆ',
+'createacct-another-submit' => '別アカウントを作æˆ',
+'createacct-benefit-heading' => '{{SITENAME}}ã¯ã€ã‚ãªãŸã®ã‚ˆã†ãªäººã€…ãŒå‰µã£ã¦ã„ã¾ã™ã€‚',
+'createacct-benefit-body1' => '{{PLURAL:$1|編集}}',
+'createacct-benefit-body2' => '{{PLURAL:$1|ページ}}',
+'createacct-benefit-body3' => '最近ã®{{PLURAL:$1|貢献者}}',
'badretype' => '入力ã—ãŸãƒ‘スワードãŒä¸€è‡´ã—ã¾ã›ã‚“。',
'userexists' => '入力ã•ã‚ŒãŸåˆ©ç”¨è€…åã¯æ—¢ã«ä½¿ç”¨ã•ã‚Œã¦ã„ã¾ã™ã€‚
ä»–ã®åå‰ã‚’é¸ã‚“ã§ãã ã•ã„。',
'loginerror' => 'ログインã®ã‚¨ãƒ©ãƒ¼',
+'createacct-error' => 'アカウント作æˆã‚¨ãƒ©ãƒ¼',
'createaccounterror' => 'アカウントを作æˆã§ãã¾ã›ã‚“ã§ã—ãŸ: $1',
'nocookiesnew' => '利用者アカウントã¯ä½œæˆã•ã‚Œã¾ã—ãŸãŒã€ãƒ­ã‚°ã‚¤ãƒ³ã—ã¦ã„ã¾ã›ã‚“。
{{SITENAME}}ã§ã¯åˆ©ç”¨è€…ã®ãƒ­ã‚°ã‚¤ãƒ³ã« Cookie を使用ã—ã¾ã™ã€‚
@@ -877,10 +927,12 @@ Cookieを有効ã«ã—ã¦ã„ã‚‹ã“ã¨ã‚’確èªã—ã¦ã€ã“ã®ãƒšãƒ¼ã‚¸ã‚’å†èª­è¾
ã“ã®ã‚¢ã‚«ã‚¦ãƒ³ãƒˆãŒä½•ã‹ã®æ‰‹é•ã„ã§ä½œæˆã•ã‚ŒãŸå ´åˆã¯ã€ã“ã®ãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ã‚’無視ã—ã¦ãã ã•ã„。',
'usernamehasherror' => '利用者åã«ã¯ç•ªå·è¨˜å·ã‚’å«ã‚ã‚‹ã“ã¨ãŒã§ãã¾ã›ã‚“',
'login-throttled' => 'ログインã®å¤±æ•—ãŒåˆ¶é™å›žæ•°ã‚’超ãˆã¾ã—ãŸã€‚
-ã—ã°ã‚‰ã時間をãŠã„ã¦ã‹ã‚‰å†åº¦è©¦ã—ã¦ãã ã•ã„。',
+$1å¾…ã£ã¦ã‹ã‚‰å†åº¦è©¦ã—ã¦ãã ã•ã„。',
'login-abort-generic' => 'ログインã«å¤±æ•—ã—ã¾ã—㟠- 中止',
'loginlanguagelabel' => '言語: $1',
'suspicious-userlogout' => '壊れãŸãƒ–ラウザーã¾ãŸã¯ã‚­ãƒ£ãƒƒã‚·ãƒ¥ãƒ—ロキシã«ã‚ˆã£ã¦é€ä¿¡ã•ã‚ŒãŸå¯èƒ½æ€§ãŒã‚ã‚‹ãŸã‚ã€ãƒ­ã‚°ã‚¢ã‚¦ãƒˆè¦æ±‚ã¯æ‹’å¦ã•ã‚Œã¾ã—ãŸã€‚',
+'createacct-another-realname-tip' => '本åã¯çœç•¥ã§ãã¾ã™ã€‚
+入力ã™ã‚‹ã¨ã€ãã®åˆ©ç”¨è€…ã®è‘—作物ã®å¸°å±žè¡¨ç¤ºã«ä½¿ã‚ã‚Œã¾ã™ã€‚',
# Email sending
'php-mail-error-unknown' => 'PHPã®mail()関数ã§ã®ä¸æ˜Žãªã‚¨ãƒ©ãƒ¼ã§ã™ã€‚',
@@ -897,8 +949,7 @@ Cookieを有効ã«ã—ã¦ã„ã‚‹ã“ã¨ã‚’確èªã—ã¦ã€ã“ã®ãƒšãƒ¼ã‚¸ã‚’å†èª­è¾
'newpassword' => 'æ–°ã—ã„パスワード:',
'retypenew' => 'æ–°ã—ã„パスワードをå†å…¥åŠ›:',
'resetpass_submit' => 'å†è¨­å®šã—ã¦ãƒ­ã‚°ã‚¤ãƒ³',
-'resetpass_success' => 'パスワードを変更ã—ã¾ã—ãŸ!
-ログインã—ã¦ã„ã¾ã™...',
+'changepassword-success' => 'パスワードを変更ã—ã¾ã—ãŸ!',
'resetpass_forbidden' => 'パスワードã¯å¤‰æ›´ã§ãã¾ã›ã‚“',
'resetpass-no-info' => 'ã“ã®ãƒšãƒ¼ã‚¸ã«ç›´æŽ¥ã‚¢ã‚¯ã‚»ã‚¹ã™ã‚‹ãŸã‚ã«ã¯ãƒ­ã‚°ã‚¤ãƒ³ã—ã¦ã„ã‚‹å¿…è¦ãŒã‚ã‚Šã¾ã™ã€‚',
'resetpass-submit-loggedin' => 'パスワードを変更',
@@ -910,10 +961,11 @@ Cookieを有効ã«ã—ã¦ã„ã‚‹ã“ã¨ã‚’確èªã—ã¦ã€ã“ã®ãƒšãƒ¼ã‚¸ã‚’å†èª­è¾
# Special:PasswordReset
'passwordreset' => 'パスワードã®å†è¨­å®š',
-'passwordreset-text' => 'ã“ã®ãƒ•ã‚©ãƒ¼ãƒ ã«è¨˜å…¥ã™ã‚‹ã¨ã€ãƒ‘スワードをå†è¨­å®šã§ãã¾ã™ã€‚',
+'passwordreset-text-one' => 'パスワードをå†è¨­å®šã™ã‚‹ã«ã¯ã“ã®ãƒ•ã‚©ãƒ¼ãƒ ã«è¨˜å…¥ã—ã¦ãã ã•ã„。',
+'passwordreset-text-many' => '{{PLURAL:$1|パスワードをå†è¨­å®šã™ã‚‹ã«ã¯ã„ãšã‚Œã‹ã®æ¬„ã«è¨˜å…¥ã—ã¦ãã ã•ã„。}}',
'passwordreset-legend' => 'パスワードã®å†è¨­å®š',
'passwordreset-disabled' => 'パスワードã®å†è¨­å®šã¯ã€ã“ã®ã‚¦ã‚£ã‚­ã§ã¯ç„¡åŠ¹ã«ãªã£ã¦ã„ã¾ã™ã€‚',
-'passwordreset-pretext' => '{{PLURAL:$1||下記ã®ãƒ‡ãƒ¼ã‚¿ã®ã„ãšã‚Œã‹ 1 ã¤ã‚’入力ã—ã¦ãã ã•ã„}}',
+'passwordreset-emaildisabled' => 'メール機能ã¯ã€ã“ã®ã‚¦ã‚£ã‚­ã§ã¯ç„¡åŠ¹åŒ–ã•ã‚Œã¦ã„ã¾ã™ã€‚',
'passwordreset-username' => '利用者å:',
'passwordreset-domain' => 'ドメイン:',
'passwordreset-capture' => 'ãŠé€ã‚Šã™ã‚‹ãƒ¡ãƒ¼ãƒ«ã®å†…容を表示ã—ã¾ã™ã‹?',
@@ -946,7 +998,7 @@ $2
仮パスワード: $2',
'passwordreset-emailsent' => 'パスワードå†è¨­å®šãƒ¡ãƒ¼ãƒ«ã‚’ãŠé€ã‚Šã—ã¾ã—ãŸã€‚',
'passwordreset-emailsent-capture' => '下記ã®å†…容ã®ã€ãƒ‘スワードå†è¨­å®šãƒ¡ãƒ¼ãƒ«ã‚’ãŠé€ã‚Šã—ã¾ã—ãŸã€‚',
-'passwordreset-emailerror-capture' => '以下ã®å†…容ã®ãƒ‘スワードå†è¨­å®šãƒ¡ãƒ¼ãƒ«ã‚’生æˆã—ã¾ã—ãŸãŒã€åˆ©ç”¨è€…ã¸ã®é€ä¿¡ã«å¤±æ•—ã—ã¾ã—ãŸ: $1',
+'passwordreset-emailerror-capture' => '以下ã®å†…容ã®ãƒ‘スワードå†è¨­å®šãƒ¡ãƒ¼ãƒ«ã‚’生æˆã—ã¾ã—ãŸãŒã€{{GENDER:$2|利用者}}ã¸ã®é€ä¿¡ã«å¤±æ•—ã—ã¾ã—ãŸ: $1',
# Special:ChangeEmail
'changeemail' => 'メールアドレスã®å¤‰æ›´',
@@ -960,6 +1012,19 @@ $2
'changeemail-submit' => 'メールアドレスを変更',
'changeemail-cancel' => '中止',
+# Special:ResetTokens
+'resettokens' => 'トークンã®å†è¨­å®š',
+'resettokens-text' => 'ã“ã“ã§ã¯ã€ã‚¢ã‚«ã‚¦ãƒ³ãƒˆã«é–¢é€£ä»˜ã‘られãŸç‰¹å®šã®éžå…¬é–‹ãƒ‡ãƒ¼ã‚¿ã«ã‚¢ã‚¯ã‚»ã‚¹ã™ã‚‹ãŸã‚ã®ãƒˆãƒ¼ã‚¯ãƒ³ã‚’å†è¨­å®šã§ãã¾ã™ã€‚
+
+トークンを誤ã£ã¦ä»–人ã«æ•™ãˆã¦ã—ã¾ã£ãŸå ´åˆã‚„ã‚ãªãŸã®ã‚¢ã‚«ã‚¦ãƒ³ãƒˆãŒä¾µå®³ã•ã‚ŒãŸå ´åˆã¯ã€å¿…ãšå†è¨­å®šã—ã¦ãã ã•ã„。',
+'resettokens-no-tokens' => 'å†è¨­å®šã§ãるトークンã¯ã‚ã‚Šã¾ã›ã‚“。',
+'resettokens-legend' => 'トークンã®å†è¨­å®š',
+'resettokens-tokens' => 'トークン:',
+'resettokens-token-label' => '$1 (ç¾åœ¨ã®å€¤: $2)',
+'resettokens-watchlist-token' => '[[Special:Watchlist|ã‚ãªãŸã®ã‚¦ã‚©ãƒƒãƒãƒªã‚¹ãƒˆã«ç™»éŒ²ã•ã‚Œã¦ã„るページã®å¤‰æ›´]]を列挙ã™ã‚‹ãƒ•ã‚£ãƒ¼ãƒ‰ (Atom/RSS) ã®ãƒˆãƒ¼ã‚¯ãƒ³',
+'resettokens-done' => 'トークンをå†è¨­å®šã—ã¾ã—ãŸã€‚',
+'resettokens-resetbutton' => 'é¸æŠžã—ãŸãƒˆãƒ¼ã‚¯ãƒ³ã‚’å†è¨­å®š',
+
# Edit page toolbar
'bold_sample' => '太字',
'bold_tip' => '太字',
@@ -1166,12 +1231,15 @@ $1ã¾ãŸã¯ä»–ã®[[{{MediaWiki:Grouppage-sysop}}|管ç†è€…]]ã«ã“ã®ãƒ–ロッã‚
æ—¢ã«å‰Šé™¤ã•ã‚Œã¦ã„るよã†ã§ã™ã€‚',
'edit-conflict' => '編集ãŒç«¶åˆã€‚',
'edit-no-change' => '文章ãŒå¤‰æ›´ã•ã‚Œã¦ã„ãªã„ãŸã‚ã€ç·¨é›†ã¯ç„¡è¦–ã•ã‚Œã¾ã—ãŸã€‚',
+'postedit-confirmation' => '編集をä¿å­˜ã—ã¾ã—ãŸã€‚',
'edit-already-exists' => 'æ–°ã—ã„ページを作æˆã§ãã¾ã›ã‚“ã§ã—ãŸã€‚
ãã®ãƒšãƒ¼ã‚¸ã¯æ—¢ã«å­˜åœ¨ã—ã¾ã™ã€‚',
'defaultmessagetext' => '既定ã®ãƒ¡ãƒƒã‚»ãƒ¼ã‚¸æ–‡',
'content-failed-to-parse' => '$2ã®ã‚³ãƒ³ãƒ†ãƒ³ãƒ„ã‚’$1モデルã¨ã—ã¦æ§‹æ–‡è§£æžã§ãã¾ã›ã‚“ã§ã—ãŸ: $3',
'invalid-content-data' => '本文データãŒç„¡åŠ¹ã§ã™',
'content-not-allowed-here' => 'ページ [[$2]] ã§ã¯ã€ã€Œ$1ã€ã‚³ãƒ³ãƒ†ãƒ³ãƒ„ã¯è¨±å¯ã•ã‚Œã¦ã„ã¾ã›ã‚“',
+'editwarning-warning' => 'ã“ã®ãƒšãƒ¼ã‚¸ã‚’離れるã¨ã€ã‚ãªãŸãŒè¡Œãªã£ãŸå¤‰æ›´ãŒã™ã¹ã¦å¤±ã‚ã‚Œã¦ã—ã¾ã†ã‹ã‚‚ã—ã‚Œã¾ã›ã‚“。
+ログインã—ã¦ã„ã‚‹å ´åˆã€å€‹äººè¨­å®šã®ã€Œç·¨é›†ã€ã‚¿ãƒ–ã§ã“ã®è­¦å‘Šã‚’表示ã—ãªã„よã†ã«ã™ã‚‹ã“ã¨ãŒã§ãã¾ã™ã€‚',
# Content models
'content-model-wikitext' => 'ウィキテキスト',
@@ -1207,6 +1275,7 @@ $1ã¾ãŸã¯ä»–ã®[[{{MediaWiki:Grouppage-sysop}}|管ç†è€…]]ã«ã“ã®ãƒ–ロッã‚
'undo-failure' => '中間ã®ç‰ˆã§ã®ç·¨é›†ã¨ç«¶åˆã—ãŸãŸã‚ã€å–り消ã›ã¾ã›ã‚“ã§ã—ãŸã€‚',
'undo-norev' => 'å–り消ãã†ã¨ã—ãŸç·¨é›†ãŒå­˜åœ¨ã—ãªã„ã‹å‰Šé™¤æ¸ˆã¿ã®ãŸã‚å–り消ã›ã¾ã›ã‚“ã§ã—ãŸã€‚',
'undo-summary' => '[[Special:Contributions/$2|$2]] ([[User talk:$2|トーク]]) ã«ã‚ˆã‚‹ç‰ˆ $1 ã‚’å–り消ã—',
+'undo-summary-username-hidden' => '秘匿ã•ã‚ŒãŸåˆ©ç”¨è€…ã«ã‚ˆã‚‹ç‰ˆ $1 ã‚’å–り消ã—',
# Account creation failure
'cantcreateaccounttitle' => 'アカウントを作æˆã§ãã¾ã›ã‚“',
@@ -1388,6 +1457,7 @@ $1",
'compareselectedversions' => 'é¸æŠžã—ãŸç‰ˆåŒå£«ã‚’比較',
'showhideselectedversions' => 'é¸æŠžã—ãŸç‰ˆã‚’表示/éžè¡¨ç¤º',
'editundo' => 'å–り消ã—',
+'diff-empty' => '(相é•ç‚¹ãªã—)',
'diff-multi' => '({{PLURAL:$2|$2人ã®åˆ©ç”¨è€…}}ã«ã‚ˆã‚‹ã€{{PLURAL:$1|é–“ã®$1版}}ãŒéžè¡¨ç¤º)',
'diff-multi-manyusers' => '({{PLURAL:$2|$2人を超ãˆã‚‹åˆ©ç”¨è€…}}ã«ã‚ˆã‚‹ã€{{PLURAL:$1|é–“ã®$1版}}ãŒéžè¡¨ç¤º)',
'difference-missing-revision' => '指定ã•ã‚ŒãŸ{{PLURAL:$2|$2版}}ã®å·®åˆ† ($1) ãŒè¦‹ã¤ã‹ã‚Šã¾ã›ã‚“ã§ã—ãŸã€‚
@@ -1415,7 +1485,6 @@ $1",
'searchmenu-legend' => '検索オプション',
'searchmenu-exists' => "'''ã“ã®ã‚¦ã‚£ã‚­ã«ã¯ã€Œ[[:$1]]ã€ã¨ã„ã†åå‰ã®ãƒšãƒ¼ã‚¸ãŒã‚ã‚Šã¾ã™'''",
'searchmenu-new' => "'''ã“ã®ã‚¦ã‚£ã‚­ã§ãƒšãƒ¼ã‚¸ã€Œ[[:$1]]ã€ã‚’æ–°è¦ä½œæˆã™ã‚‹'''",
-'searchhelp-url' => 'Help:目次',
'searchmenu-prefix' => '[[Special:PrefixIndex/$1|ã“ã®æ–‡å­—列ã‹ã‚‰å§‹ã¾ã‚‹åå‰ã®ãƒšãƒ¼ã‚¸ã‚’見る]]',
'searchprofile-articles' => '本文ページ',
'searchprofile-project' => 'ヘルプã¨ãƒ—ロジェクトページ',
@@ -1459,15 +1528,7 @@ $1",
'searchdisabled' => '{{SITENAME}}ã®æ¤œç´¢æ©Ÿèƒ½ã¯ç„¡åŠ¹åŒ–ã•ã‚Œã¦ã„ã¾ã™ã€‚
ã•ã—ã‚ãŸã£ã¦ã¯Googleãªã©ã§æ¤œç´¢ã§ãã¾ã™ã€‚
ãŸã ã—外部ã®æ¤œç´¢ã‚¨ãƒ³ã‚¸ãƒ³ã®ç´¢å¼•ã«ã‚ã‚‹{{SITENAME}}ã®ã‚³ãƒ³ãƒ†ãƒ³ãƒ„ã¯å¤ã„å ´åˆãŒã‚ã‚Šã¾ã™ã€‚',
-
-# Quickbar
-'qbsettings' => 'クイックãƒãƒ¼',
-'qbsettings-none' => 'ãªã—',
-'qbsettings-fixedleft' => '左端',
-'qbsettings-fixedright' => 'å³ç«¯',
-'qbsettings-floatingleft' => 'ウィンドウã®å·¦ä¸Šã«å›ºå®š',
-'qbsettings-floatingright' => 'ウィンドウã®å³ä¸Šã«å›ºå®š',
-'qbsettings-directionality' => 'ã‚ãªãŸã®è¨€èªžã®æ–‡å­—体系ã®æ›¸å­—æ–¹å‘ã«å¿œã˜ã¦å›ºå®š',
+'search-error' => '検索ã™ã‚‹éš›ã«ã‚¨ãƒ©ãƒ¼ãŒç™ºç”Ÿã—ã¾ã—ãŸ: $1',
# Preferences page
'preferences' => '個人設定',
@@ -1501,7 +1562,6 @@ $1",
'resetprefs' => 'ä¿å­˜ã—ã¦ã„ãªã„変更を破棄',
'restoreprefs' => 'ã™ã¹ã¦åˆæœŸè¨­å®šã«æˆ»ã™ (ã™ã¹ã¦ã®ç¯€ã«ã¤ã„ã¦)',
'prefs-editing' => '編集',
-'prefs-edit-boxsize' => '編集ウィンドウã®ã‚µã‚¤ã‚ºã€‚',
'rows' => '行数:',
'columns' => '列数:',
'searchresultshead' => '検索',
@@ -1512,9 +1572,9 @@ $1",
'recentchangesdays-max' => '(最大 $1 {{PLURAL:$1|日|日間}})',
'recentchangescount' => '既定ã§è¡¨ç¤ºã™ã‚‹ä»¶æ•°:',
'prefs-help-recentchangescount' => 'ã“ã®è¨­å®šã¯æœ€è¿‘ã®æ›´æ–°ã€ãƒšãƒ¼ã‚¸ã®å±¥æ­´ã€ãŠã‚ˆã³è¨˜éŒ²ã«é©ç”¨ã•ã‚Œã¾ã™ã€‚',
-'prefs-help-watchlist-token' => 'ã“ã®æ¬„ã«ç§˜å¯†éµã‚’入力ã™ã‚‹ã¨ã€ã‚ãªãŸã®ã‚¦ã‚©ãƒƒãƒãƒªã‚¹ãƒˆã®RSSフィードãŒç”Ÿæˆã•ã‚Œã¾ã™ã€‚
-ã“ã®æ¬„ã«å…¥åŠ›ã•ã‚Œã¦ã„ã‚‹éµã‚’知ã£ã¦ã„る人ã¯èª°ã§ã‚‚ã“ã®ã‚¦ã‚©ãƒƒãƒãƒªã‚¹ãƒˆã‚’閲覧ã§ãるよã†ã«ãªã‚‹ãŸã‚ã€ä»–人ã«åˆ†ã‹ã‚‰ãªã„値をé¸ã‚“ã§ãã ã•ã„。
-乱数ã«ã‚ˆã£ã¦ç”Ÿæˆã•ã‚ŒãŸæ¬¡ã®å€¤ã‚’使ã†ã“ã¨ã‚‚ã§ãã¾ã™: $1',
+'prefs-help-watchlist-token2' => 'ã“ã‚Œã¯ã‚ãªãŸã®ã‚¦ã‚©ãƒƒãƒãƒªã‚¹ãƒˆ フィードã®ç§˜å¯†ã®ã‚³ãƒ¼ãƒ‰ã§ã™ã€‚
+ã“ã®ãƒˆãƒ¼ã‚¯ãƒ³ã‚’知ã£ã¦ã„る人ã¯èª°ã§ã‚‚ã‚ãªãŸã®ã‚¦ã‚©ãƒƒãƒãƒªã‚¹ãƒˆã‚’読ã‚ã¦ã—ã¾ã†ãŸã‚ã€ä»–ã®äººã«æ•™ãˆãªã„ã§ãã ã•ã„。
+[[Special:ResetTokens|トークンをå†è¨­å®šã™ã‚‹å¿…è¦ãŒã‚ã‚‹å ´åˆã¯ã“ã“をクリックã—ã¦ãã ã•ã„]]。',
'savedprefs' => '個人設定をä¿å­˜ã—ã¾ã—ãŸã€‚',
'timezonelegend' => 'タイムゾーン:',
'localtime' => 'ローカルã®æ™‚刻:',
@@ -1545,7 +1605,6 @@ $1",
'prefs-reset-intro' => 'ã“ã®ãƒšãƒ¼ã‚¸ã‚’使用ã™ã‚‹ã¨ã€è‡ªåˆ†ã®å€‹äººè¨­å®šã‚’ã“ã®ã‚µã‚¤ãƒˆã®åˆæœŸè¨­å®šã«æˆ»ã›ã¾ã™ã€‚
ã“ã®æ“作ã¯å–り消ã›ã¾ã›ã‚“。',
'prefs-emailconfirm-label' => 'メールアドレスã®ç¢ºèª:',
-'prefs-textboxsize' => '編集画é¢ã®å¤§ãã•',
'youremail' => 'メールアドレス:',
'username' => '{{GENDER:$1|利用者å}}:',
'uid' => '{{GENDER:$1|利用者}} ID:',
@@ -1583,6 +1642,8 @@ $1 {{PLURAL:$1|文字}}以下ã§ã‚ã‚‹å¿…è¦ãŒã‚ã‚Šã¾ã™ã€‚',
'prefs-dateformat' => '日付ã¨æ™‚刻ã®å½¢å¼',
'prefs-timeoffset' => '時差',
'prefs-advancedediting' => '全般オプション',
+'prefs-editor' => 'エディター',
+'prefs-preview' => 'プレビュー',
'prefs-advancedrc' => '詳細設定',
'prefs-advancedrendering' => '詳細設定',
'prefs-advancedsearchoptions' => '詳細設定',
@@ -1590,7 +1651,9 @@ $1 {{PLURAL:$1|文字}}以下ã§ã‚ã‚‹å¿…è¦ãŒã‚ã‚Šã¾ã™ã€‚',
'prefs-displayrc' => '表示ã®è¨­å®š',
'prefs-displaysearchoptions' => '表示ã®è¨­å®š',
'prefs-displaywatchlist' => '表示ã®è¨­å®š',
+'prefs-tokenwatchlist' => 'トークン',
'prefs-diffs' => '差分',
+'prefs-help-prefershttps' => 'ã“ã®è¨­å®šã¯ã€æ¬¡å›žãƒ­ã‚°ã‚¤ãƒ³ã®éš›ã«å映ã•ã‚Œã¾ã™ã€‚',
# User preference: email validation using jQuery
'email-address-validity-valid' => 'メールアドレスã¯æœ‰åŠ¹ã®ã‚ˆã†ã§ã™',
@@ -1619,6 +1682,8 @@ $1 {{PLURAL:$1|文字}}以下ã§ã‚ã‚‹å¿…è¦ãŒã‚ã‚Šã¾ã™ã€‚',
'userrights-changeable-col' => '変更ã§ãるグループ',
'userrights-unchangeable-col' => '変更ã§ããªã„グループ',
'userrights-irreversible-marker' => '$1*',
+'userrights-conflict' => '利用者権é™ã®å¤‰æ›´ãŒç«¶åˆã—ã¦ã„ã¾ã™! 変更内容を確èªã—ã¦ãã ã•ã„。',
+'userrights-removed-self' => 'ã‚ãªãŸè‡ªèº«ã®æ¨©é™ã‚’除去ã—ã¾ã—ãŸã€‚ãã®ãŸã‚ã€ã“ã®ãƒšãƒ¼ã‚¸ã«ã¯ã‚‚ã†ã‚¢ã‚¯ã‚»ã‚¹ã§ãã¾ã›ã‚“。',
# Groups
'group' => 'グループ:',
@@ -1684,11 +1749,19 @@ $1 {{PLURAL:$1|文字}}以下ã§ã‚ã‚‹å¿…è¦ãŒã‚ã‚Šã¾ã™ã€‚',
'right-proxyunbannable' => 'プロキシã®è‡ªå‹•ãƒ–ロックを回é¿',
'right-unblockself' => '自身ã«å¯¾ã™ã‚‹ãƒ–ロックを解除',
'right-protect' => 'ä¿è­·ãƒ¬ãƒ™ãƒ«ã‚’変更ã—ã€ã‚«ã‚¹ã‚±ãƒ¼ãƒ‰ä¿è­·ã•ã‚ŒãŸãƒšãƒ¼ã‚¸ã‚’編集',
-'right-editprotected' => 'ä¿è­·ãƒšãƒ¼ã‚¸ (カスケードä¿è­·ã‚’除ã) を編集',
+'right-editprotected' => '「{{int:protect-level-sysop}}ã€ã®ä¿è­·ã‚’設定ã•ã‚ŒãŸãƒšãƒ¼ã‚¸ã‚’編集',
+'right-editsemiprotected' => '「{{int:protect-level-autoconfirmed}}ã€ã®ä¿è­·ã‚’設定ã•ã‚ŒãŸãƒšãƒ¼ã‚¸ã‚’編集',
'right-editinterface' => 'ユーザーインターフェースを編集',
'right-editusercssjs' => 'ä»–ã®åˆ©ç”¨è€…ã®CSSファイル/JavaScriptファイルを編集',
'right-editusercss' => 'ä»–ã®åˆ©ç”¨è€…ã®CSSファイルを編集',
'right-edituserjs' => 'ä»–ã®åˆ©ç”¨è€…ã®JavaScriptファイルを編集',
+'right-editmyusercss' => '自身ã®CSSファイルを編集',
+'right-editmyuserjs' => '自身ã®JavaScriptファイルを編集',
+'right-viewmywatchlist' => 'ウォッãƒãƒªã‚¹ãƒˆã‚’閲覧',
+'right-editmywatchlist' => '自身ã®ã‚¦ã‚©ãƒƒãƒãƒªã‚¹ãƒˆã‚’編集 (注: ã“ã®æ¨©é™ãŒãªãã¦ã‚‚ページを追加ã§ãる権é™ãŒä»–ã«ã‚‚ã‚ã‚Šã¾ã™)',
+'right-viewmyprivateinfo' => '自身ã®éžå…¬é–‹ãƒ‡ãƒ¼ã‚¿ (例: メールアドレスã€æœ¬å) を閲覧',
+'right-editmyprivateinfo' => '自身ã®éžå…¬é–‹ãƒ‡ãƒ¼ã‚¿ (例: メールアドレスã€æœ¬å) を編集',
+'right-editmyoptions' => '自身ã®å€‹äººè¨­å®šã‚’編集',
'right-rollback' => '特定ページを最後ã«ç·¨é›†ã—ãŸåˆ©ç”¨è€…ã®ç·¨é›†ã‚’å³æ™‚å·»ã戻ã—',
'right-markbotedits' => 'å·»ã戻ã—をボットã®ç·¨é›†ã¨ã—ã¦æ‰±ã†',
'right-noratelimit' => '速度制é™ã‚’å—ã‘ãªã„',
@@ -1750,12 +1823,19 @@ $1 {{PLURAL:$1|文字}}以下ã§ã‚ã‚‹å¿…è¦ãŒã‚ã‚Šã¾ã™ã€‚',
'action-userrights-interwiki' => 'ä»–ã®ã‚¦ã‚£ã‚­ã®åˆ©ç”¨è€…ã®åˆ©ç”¨è€…権é™å¤‰æ›´',
'action-siteadmin' => 'データベースã®ãƒ­ãƒƒã‚¯ã¾ãŸã¯ãƒ­ãƒƒã‚¯è§£é™¤',
'action-sendemail' => 'メールã®é€ä¿¡',
+'action-editmywatchlist' => '自身ã®ã‚¦ã‚©ãƒƒãƒãƒªã‚¹ãƒˆã®ç·¨é›†',
+'action-viewmywatchlist' => '自身ã®ã‚¦ã‚©ãƒƒãƒãƒªã‚¹ãƒˆã®é–²è¦§',
+'action-viewmyprivateinfo' => '自分ã®éžå…¬é–‹æƒ…å ±ã®é–²è¦§',
+'action-editmyprivateinfo' => '自分ã®éžå…¬é–‹æƒ…å ±ã®ç·¨é›†',
# Recent changes
'nchanges' => '$1 {{PLURAL:$1|回ã®å¤‰æ›´}}',
+'enhancedrc-since-last-visit' => 'æœ€çµ‚é–²è¦§ä»¥é™ $1 {{PLURAL:$1|件}}',
+'enhancedrc-history' => '履歴',
'recentchanges' => '最近ã®æ›´æ–°',
'recentchanges-legend' => '最近ã®æ›´æ–°ã®ã‚ªãƒ—ション',
'recentchanges-summary' => 'ã“ã®ãƒšãƒ¼ã‚¸ã§ã¯ã€ã“ã®ã‚¦ã‚£ã‚­ã§ã®æœ€è¿‘ã®æ›´æ–°ã‚’確èªã§ãã¾ã™ã€‚',
+'recentchanges-noresult' => '指定ã—ãŸæ¡ä»¶ã«è©²å½“ã™ã‚‹æœŸé–“ã®å¤‰æ›´ã¯ã‚ã‚Šã¾ã›ã‚“。',
'recentchanges-feed-description' => 'ã“ã®ãƒ•ã‚£ãƒ¼ãƒ‰ã§ã“ã®ã‚¦ã‚£ã‚­ã®æœ€è¿‘ã®æ›´æ–°ã‚’追跡ã§ãã¾ã™ã€‚',
'recentchanges-label-newpage' => 'ã“ã®ç·¨é›†ã§æ–°ã—ã„ページãŒä½œæˆã•ã‚Œã¾ã—ãŸ',
'recentchanges-label-minor' => 'ã“ã‚Œã¯ç´°éƒ¨ã®ç·¨é›†ã§ã™',
@@ -1794,7 +1874,6 @@ $1 {{PLURAL:$1|文字}}以下ã§ã‚ã‚‹å¿…è¦ãŒã‚ã‚Šã¾ã™ã€‚',
'recentchangeslinked-feed' => '関連ページã®æ›´æ–°çŠ¶æ³',
'recentchangeslinked-toolbox' => '関連ページã®æ›´æ–°çŠ¶æ³',
'recentchangeslinked-title' => '「$1ã€ã¨é–¢é€£ã™ã‚‹å¤‰æ›´',
-'recentchangeslinked-noresult' => '指定期間中ã«æŒ‡å®šãƒšãƒ¼ã‚¸ã®ãƒªãƒ³ã‚¯å…ˆã«å¤‰æ›´ã¯ã‚ã‚Šã¾ã›ã‚“ã§ã—ãŸã€‚',
'recentchangeslinked-summary' => "ã“ã‚Œã¯æŒ‡å®šã—ãŸãƒšãƒ¼ã‚¸ã‹ã‚‰ãƒªãƒ³ã‚¯ã•ã‚Œã¦ã„ã‚‹ (ã¾ãŸã¯æŒ‡å®šã—ãŸã‚«ãƒ†ã‚´ãƒªã«å«ã¾ã‚Œã¦ã„ã‚‹) ページã®æœ€è¿‘ã®å¤‰æ›´ã®ä¸€è¦§ã§ã™ã€‚
[[Special:Watchlist|自分ã®ã‚¦ã‚©ãƒƒãƒãƒªã‚¹ãƒˆ]]ã«ã‚るページã¯'''太字'''ã§è¡¨ç¤ºã•ã‚Œã¾ã™ã€‚",
'recentchangeslinked-page' => 'ページå:',
@@ -1806,7 +1885,7 @@ $1 {{PLURAL:$1|文字}}以下ã§ã‚ã‚‹å¿…è¦ãŒã‚ã‚Šã¾ã™ã€‚',
'reuploaddesc' => 'アップロードを中止ã—ã¦ã‚¢ãƒƒãƒ—ロードフォームã¸æˆ»ã‚‹',
'upload-tryagain' => '修正ã—ãŸãƒ•ã‚¡ã‚¤ãƒ«è§£èª¬ã‚’投稿',
'uploadnologin' => 'ログインã—ã¦ã„ã¾ã›ã‚“',
-'uploadnologintext' => 'ファイルをアップロードã™ã‚‹ã«ã¯[[Special:UserLogin|ログイン]]ã™ã‚‹å¿…è¦ãŒã‚ã‚Šã¾ã™ã€‚',
+'uploadnologintext' => 'ファイルをアップロードã™ã‚‹ã«ã¯$1ã™ã‚‹å¿…è¦ãŒã‚ã‚Šã¾ã™ã€‚',
'upload_directory_missing' => 'アップロード先ディレクトリ ($1) ãŒè¦‹ã¤ã‹ã‚Šã¾ã›ã‚“ã§ã—ãŸã€‚ウェブ サーãƒãƒ¼ã«ã‚ˆã‚‹ä½œæˆã‚‚ã§ãã¾ã›ã‚“ã§ã—ãŸã€‚',
'upload_directory_read_only' => 'アップロード先ディレクトリ ($1) ã«ã¯ã€ã‚¦ã‚§ãƒ–サーãƒãƒ¼ãŒæ›¸ãè¾¼ã‚ã¾ã›ã‚“。',
'uploaderror' => 'アップロードã®ã‚¨ãƒ©ãƒ¼',
@@ -2046,7 +2125,6 @@ https://www.mediawiki.org/wiki/Manual:Image_Authorization ã‚’ã”覧ãã ã•ã„ã
'http-read-error' => 'HTTP読ã¿è¾¼ã¿ã‚¨ãƒ©ãƒ¼ã§ã™ã€‚',
'http-timed-out' => 'HTTPè¦æ±‚ãŒã‚¿ã‚¤ãƒ ã‚¢ã‚¦ãƒˆã—ã¾ã—ãŸã€‚',
'http-curl-error' => 'URLã‹ã‚‰ã®å–å¾—ã«å¤±æ•—ã—ã¾ã—ãŸ: $1',
-'http-host-unreachable' => 'URLã«åˆ°é”ã§ãã¾ã›ã‚“。',
'http-bad-status' => 'HTTP リクエストã§å•é¡ŒãŒç™ºç”Ÿã—ã¾ã—ãŸ: $1 $2',
# Some likely curl errors. More could be added from <http://curl.haxx.se/libcurl/c/libcurl-errors.html>
@@ -2077,6 +2155,10 @@ URLãŒæ­£ã—ã„ã‚‚ã®ã§ã‚ã‚Šã€ã‚¦ã‚§ãƒ–サイトãŒç¨¼åƒã—ã¦ã„ã‚‹ã“ã¨ã‚
'listfiles_size' => 'サイズ',
'listfiles_description' => '概è¦',
'listfiles_count' => '版数',
+'listfiles-show-all' => 'ç”»åƒã®å¤ã„版をå«ã‚ã‚‹',
+'listfiles-latestversion' => 'ç¾åœ¨ã®ç‰ˆ',
+'listfiles-latestversion-yes' => 'ã¯ã„',
+'listfiles-latestversion-no' => 'ã„ã„ãˆ',
# File description page
'file-anchor-link' => 'ファイル',
@@ -2175,6 +2257,13 @@ contenttype/subtypeã®å½¢å¼ã§å…¥åŠ›ã—ã¦ãã ã•ã„ (例: <code>image/jpeg</
'randompage' => 'ãŠã¾ã‹ã›è¡¨ç¤º',
'randompage-nopages' => '以下ã®{{PLURAL:$2|åå‰ç©ºé–“}}ã«ã¯ãƒšãƒ¼ã‚¸ãŒã‚ã‚Šã¾ã›ã‚“: $1',
+# Random page in category
+'randomincategory' => 'カテゴリ内ã§ãŠã¾ã‹ã›è¡¨ç¤º',
+'randomincategory-invalidcategory' => '「$1ã€ã¯æœ‰åŠ¹ãªã‚«ãƒ†ã‚´ãƒªåã§ã¯ã‚ã‚Šã¾ã›ã‚“。',
+'randomincategory-nopages' => 'カテゴリ [[:Category:$1|$1]] ã«ã¯ãƒšãƒ¼ã‚¸ãŒã‚ã‚Šã¾ã›ã‚“。',
+'randomincategory-selectcategory' => '以下ã®ã‚«ãƒ†ã‚´ãƒªã§ãŠã¾ã‹ã›è¡¨ç¤º: $1 $2',
+'randomincategory-selectcategory-submit' => '表示',
+
# Random redirect
'randomredirect' => 'ãŠã¾ã‹ã›ãƒªãƒ€ã‚¤ãƒ¬ã‚¯ãƒˆ',
'randomredirect-nopages' => '「$1ã€åå‰ç©ºé–“ã«è»¢é€ãƒšãƒ¼ã‚¸ã¯ã‚ã‚Šã¾ã›ã‚“。',
@@ -2200,17 +2289,13 @@ contenttype/subtypeã®å½¢å¼ã§å…¥åŠ›ã—ã¦ãã ã•ã„ (例: <code>image/jpeg</
'statistics-users-active-desc' => 'éŽåŽ» {{PLURAL:$1|$1 日間}}ã«ä½•ã‚‰ã‹ã®æ“作をã—ãŸåˆ©ç”¨è€…',
'statistics-mostpopular' => '最も閲覧ã•ã‚Œã¦ã„るページ',
-'disambiguations' => '曖昧ã•å›žé¿ãƒšãƒ¼ã‚¸ã«ãƒªãƒ³ã‚¯ã—ã¦ã„るページ',
-'disambiguationspage' => 'Template:曖昧回é¿',
-'disambiguations-text' => "以下ã®ãƒšãƒ¼ã‚¸ã«ã¯'''曖昧ã•å›žé¿ãƒšãƒ¼ã‚¸'''ã¸ã®ãƒªãƒ³ã‚¯ãŒ 1 個以上ã‚ã‚Šã¾ã™ã€‚
-ã“れらã®ãƒªãƒ³ã‚¯ã¯ã€ã‚ˆã‚Šé©åˆ‡ãªãƒšãƒ¼ã‚¸ã¸ã®ãƒªãƒ³ã‚¯ã«å¤‰æ›´ã™ã‚‹å¿…è¦ãŒã‚ã‚Šã¾ã™ã€‚<br />
-[[MediaWiki:Disambiguationspage]] ã«ãƒªãƒ³ã‚¯ãŒã‚るテンプレートを使用ã—ã¦ã„るページをã€æ›–昧ã•å›žé¿ãƒšãƒ¼ã‚¸ã¨è¦‹ãªã—ã¾ã™ã€‚",
-
'pageswithprop' => 'ページプロパティãŒã‚るページ',
'pageswithprop-legend' => 'ページプロパティãŒã‚るページ',
'pageswithprop-text' => 'ã“ã®ãƒšãƒ¼ã‚¸ã§ã¯ã€ç‰¹å®šã®ãƒšãƒ¼ã‚¸ãƒ—ロパティをæŒã¤ãƒšãƒ¼ã‚¸ã‚’列挙ã—ã¾ã™ã€‚',
'pageswithprop-prop' => 'プロパティå:',
'pageswithprop-submit' => '実行',
+'pageswithprop-prophidden-long' => 'プロパティ値ã®ãƒ†ã‚­ã‚¹ãƒˆãŒé•·ã„ãŸã‚éžè¡¨ç¤º ($1)',
+'pageswithprop-prophidden-binary' => 'プロパティ値ã®ãƒã‚¤ãƒŠãƒªãŒé•·ã„ãŸã‚éžè¡¨ç¤º ($1)',
'doubleredirects' => '二é‡è»¢é€',
'doubleredirectstext' => 'ã“ã®ãƒšãƒ¼ã‚¸ã§ã¯ã€è»¢é€ãƒšãƒ¼ã‚¸ã¸ã®è»¢é€ãƒšãƒ¼ã‚¸ã‚’列挙ã—ã¾ã™ã€‚
@@ -2269,6 +2354,7 @@ contenttype/subtypeã®å½¢å¼ã§å…¥åŠ›ã—ã¦ãã ã•ã„ (例: <code>image/jpeg</
'mostrevisions' => '版ã®å¤šã„ページ',
'prefixindex' => '先頭ãŒåŒã˜å…¨ãƒšãƒ¼ã‚¸',
'prefixindex-namespace' => '先頭ãŒåŒã˜å…¨ãƒšãƒ¼ã‚¸ ($1åå‰ç©ºé–“)',
+'prefixindex-strip' => '一覧ã§æŽ¥é ­è¾žã‚’çœç•¥',
'shortpages' => '短ã„ページ',
'longpages' => 'é•·ã„ページ',
'deadendpages' => 'è¡Œãæ­¢ã¾ã‚Šãƒšãƒ¼ã‚¸',
@@ -2284,6 +2370,7 @@ contenttype/subtypeã®å½¢å¼ã§å…¥åŠ›ã—ã¦ãã ã•ã„ (例: <code>image/jpeg</
'listusers' => '利用者一覧',
'listusers-editsonly' => '投稿記録ã®ã‚る利用者ã®ã¿ã‚’表示',
'listusers-creationsort' => '作æˆæ—¥é †ã«ä¸¦ã¹æ›¿ãˆ',
+'listusers-desc' => 'é™é †ã«ä¸¦ã¹æ›¿ãˆã‚‹',
'usereditcount' => '$1 {{PLURAL:$1|回編集}}',
'usercreated' => '$1 $2 ã«{{GENDER:$3|作æˆ}}',
'newpages' => 'æ–°ã—ã„ページ',
@@ -2464,10 +2551,9 @@ contenttype/subtypeã®å½¢å¼ã§å…¥åŠ›ã—ã¦ãã ã•ã„ (例: <code>image/jpeg</
'unwatchthispage' => 'ウォッãƒã‚’ã‚„ã‚ã‚‹',
'notanarticle' => '記事ã§ã¯ã‚ã‚Šã¾ã›ã‚“',
'notvisiblerev' => '別ã®åˆ©ç”¨è€…ã«ã‚ˆã‚‹æœ€çµ‚版ã¯å‰Šé™¤ã•ã‚Œã¾ã—ãŸ',
-'watchnochange' => 'ウォッãƒãƒªã‚¹ãƒˆã«ç™»éŒ²ã—ã¦ã„るページã§ã€æŒ‡å®šæœŸé–“内ã«ç·¨é›†ã•ã‚ŒãŸã‚‚ã®ã¯ã‚ã‚Šã¾ã›ã‚“。',
'watchlist-details' => 'ウォッãƒãƒªã‚¹ãƒˆã«ã¯ {{PLURAL:$1|$1 ページ}}ãŒç™»éŒ²ã•ã‚Œã¦ã„ã¾ã™ (トークページを除ã)。',
-'wlheader-enotif' => '* メール通知ãŒæœ‰åŠ¹ã«ãªã£ã¦ã„ã¾ã™ã€‚',
-'wlheader-showupdated' => "* 最終訪å•ä»¥é™ã«å¤‰æ›´ã•ã‚ŒãŸãƒšãƒ¼ã‚¸ã¯ã€'''太字'''ã§è¡¨ç¤ºã•ã‚Œã¾ã™",
+'wlheader-enotif' => 'メール通知ãŒæœ‰åŠ¹ã«ãªã£ã¦ã„ã¾ã™ã€‚',
+'wlheader-showupdated' => "最終訪å•ä»¥é™ã«å¤‰æ›´ã•ã‚ŒãŸãƒšãƒ¼ã‚¸ã¯ã€'''太字'''ã§è¡¨ç¤ºã•ã‚Œã¾ã™ã€‚",
'watchmethod-recent' => '最近ã®æ›´æ–°å†…ã®ã‚¦ã‚©ãƒƒãƒã•ã‚Œã¦ã„るページを確èªä¸­',
'watchmethod-list' => 'ウォッãƒã•ã‚Œã¦ã„るページ内ã®æœ€è¿‘ã®æ›´æ–°ã‚’確èªä¸­',
'watchlistcontains' => 'ウォッãƒãƒªã‚¹ãƒˆã«ã¯ {{PLURAL:$1|$1 ページ}}ãŒç™»éŒ²ã•ã‚Œã¦ã„ã¾ã™ã€‚',
@@ -2724,7 +2810,7 @@ $1',
'contributions' => '{{GENDER:$1|利用者}}ã®æŠ•ç¨¿è¨˜éŒ²',
'contributions-title' => '$1ã®æŠ•ç¨¿è¨˜éŒ²',
'mycontris' => '投稿記録',
-'contribsub2' => '利用者: $1 ($2)',
+'contribsub2' => '利用者: {{GENDER:$3|$1}} ($2)',
'nocontribs' => 'ã“れらã®æ¡ä»¶ã«ä¸€è‡´ã™ã‚‹å¤‰æ›´ã¯è¦‹ã¤ã‹ã‚Šã¾ã›ã‚“ã§ã—ãŸã€‚',
'uctop' => '(最新)',
'month' => 'ã“ã®æœˆä»¥å‰:',
@@ -2883,16 +2969,14 @@ $1 ã®ãƒ–ロックã®ç†ç”±ã¯ã€Œ''$2''ã€ã§ã™ã€‚",
ãŸã ã—ã€$2ã®ç¯„囲ã§ãƒ–ロックã•ã‚Œã¦ãŠã‚Šã€ã“ã¡ã‚‰ã®ãƒ–ロックã¯åˆ¥é€”解除ã§ãã¾ã™ã€‚',
'ip_range_invalid' => 'IP範囲ãŒç„¡åŠ¹ã§ã™ã€‚',
'ip_range_toolarge' => '/$1より広範囲ã®ç¯„囲ブロックã¯è¨±å¯ã•ã‚Œã¦ã„ã¾ã›ã‚“。',
-'blockme' => '自分をブロック',
'proxyblocker' => 'プロキシブロック係',
-'proxyblocker-disabled' => 'ã“ã®æ©Ÿèƒ½ã¯ç„¡åŠ¹ã«ãªã£ã¦ã„ã¾ã™ã€‚',
'proxyblockreason' => 'ã“ã®IPアドレスã¯å…¬é–‹ãƒ—ロキシã§ã‚ã‚‹ãŸã‚ブロックã•ã‚Œã¦ã„ã¾ã™ã€‚
ã”使用中ã®ã‚¤ãƒ³ã‚¿ãƒ¼ãƒãƒƒãƒˆã‚µãƒ¼ãƒ“スプロãƒã‚¤ãƒ€ãƒ¼ã¾ãŸã¯æ‰€å±žçµ„ç¹”ã®æŠ€è¡“担当者ã«é€£çµ¡ã—ã¦ã€ã“ã‚ŒãŒæ·±åˆ»ãªã‚»ã‚­ãƒ¥ãƒªãƒ†ã‚£å•é¡Œã§ã‚ã‚‹ã“ã¨ã‚’ä¼ãˆã¦ãã ã•ã„。',
-'proxyblocksuccess' => '完了。',
'sorbs' => 'DNSBL',
'sorbsreason' => 'ã”使用中ã®IPアドレスãŒã€{{SITENAME}}ã®ä½¿ç”¨ã—ã¦ã„ã‚‹DNSBLã«å…¬é–‹ãƒ—ロキシã¨ã—ã¦è¨˜è¼‰ã•ã‚Œã¦ã„ã¾ã™ã€‚',
'sorbs_create_account_reason' => 'ã”使用中ã®IPアドレスãŒã€{{SITENAME}}ã®ä½¿ç”¨ã—ã¦ã„ã‚‹DNSBLã«å…¬é–‹ãƒ—ロキシã¨ã—ã¦è¨˜è¼‰ã•ã‚Œã¦ã„ã¾ã™ã€‚
アカウント作æˆã¯ã§ãã¾ã›ã‚“',
+'xffblockreason' => 'X-Forwarded-For ヘッダーã«å«ã¾ã‚Œã¦ã„ã‚‹ IP アドレスãŒãƒ–ロックã•ã‚Œã¦ã„ã¾ã™ã€‚ã“ã‚Œã¯ã‚ãªãŸã®ã‚‚ã®ã‹ã€ã‚ãªãŸãŒåˆ©ç”¨ã—ã¦ã„るプロキシサーãƒãƒ¼ã®ã‚‚ã®ã§ã™ã€‚å…ƒã®ãƒ–ロックã®ç†ç”±ã¯: $1',
'cant-block-while-blocked' => 'ブロックã•ã‚Œã¦ã„ã‚‹é–“ã¯ã€ä»–ã®åˆ©ç”¨è€…をブロックã§ãã¾ã›ã‚“。',
'cant-see-hidden-user' => 'ブロックã—よã†ã¨ã—ã¦ã„る利用者ã¯ã€æ—¢ã«ãƒ–ロックã•ã‚Œéš ã•ã‚Œã¦ã„ã¾ã™ã€‚
ã‚ãªãŸã«ã¯ hideuser 権é™ãŒãªã„ãŸã‚ã€ã“ã®åˆ©ç”¨è€…ã®ãƒ–ロックã®é–²è¦§/編集ã¯ã§ãã¾ã›ã‚“。',
@@ -3059,6 +3143,8 @@ MediaWiki 全般ã®ãƒ­ãƒ¼ã‚«ãƒ©ã‚¤ã‚º (地域化) ã«è²¢çŒ®ã—ãŸã„å ´åˆã¯ã€
'thumbnail-more' => '拡大',
'filemissing' => 'ファイルãŒã‚ã‚Šã¾ã›ã‚“',
'thumbnail_error' => 'サムãƒã‚¤ãƒ«ã®ä½œæˆã‚¨ãƒ©ãƒ¼: $1',
+'thumbnail_error_remote' => '$1ãŒè¿”ã—ãŸã‚¨ãƒ©ãƒ¼ãƒ¡ãƒƒã‚»ãƒ¼ã‚¸:
+$2',
'djvu_page_error' => 'DjVuページãŒç¯„囲外ã§ã™',
'djvu_no_xml' => 'DjVuファイルã®XMLデータをå–å¾—ã§ãã¾ã›ã‚“',
'thumbnail-temp-create' => '一時的ãªã‚µãƒ ãƒã‚¤ãƒ«ãƒ•ã‚¡ã‚¤ãƒ«ã‚’作æˆã§ãã¾ã›ã‚“',
@@ -3212,17 +3298,11 @@ MediaWiki 全般ã®ãƒ­ãƒ¼ã‚«ãƒ©ã‚¤ã‚º (地域化) ã«è²¢çŒ®ã—ãŸã„å ´åˆã¯ã€
# Stylesheets
'common.css' => '/* ã“ã“ã«è¨˜è¿°ã—ãŸCSSã¯ã™ã¹ã¦ã®å¤–装ã«å映ã•ã‚Œã¾ã™ */',
-'standard.css' => '/* ã“ã“ã«è¨˜è¿°ã—ãŸCSSã¯ã‚¹ã‚¿ãƒ³ãƒ€ãƒ¼ãƒ‰å¤–装ã®åˆ©ç”¨è€…ã«å½±éŸ¿ã—ã¾ã™ */',
-'nostalgia.css' => '/* ã“ã“ã«è¨˜è¿°ã—ãŸCSSã¯ãƒŽã‚¹ã‚¿ãƒ«ã‚¸ã‚¢å¤–装ã®åˆ©ç”¨è€…ã«å½±éŸ¿ã—ã¾ã™ */',
'cologneblue.css' => '/* ã“ã“ã«è¨˜è¿°ã—ãŸCSSã¯ã‚±ãƒ«ãƒ³ãƒ–ルー外装ã®åˆ©ç”¨è€…ã«å½±éŸ¿ã—ã¾ã™ */',
'monobook.css' => '/* ã“ã“ã«è¨˜è¿°ã—ãŸCSSã¯ãƒ¢ãƒŽãƒ–ック外装ã®åˆ©ç”¨è€…ã«å½±éŸ¿ã—ã¾ã™ */',
-'myskin.css' => '/* ã“ã“ã«è¨˜è¿°ã—ãŸCSSã¯ãƒžã‚¤ã‚¹ã‚­ãƒ³å¤–装ã®åˆ©ç”¨è€…ã«å½±éŸ¿ã—ã¾ã™ */',
-'chick.css' => '/* ã“ã“ã«è¨˜è¿°ã—ãŸCSSã¯ãƒãƒƒã‚¯å¤–装ã®åˆ©ç”¨è€…ã«å½±éŸ¿ã—ã¾ã™ */',
-'simple.css' => '/* ã“ã“ã«è¨˜è¿°ã—ãŸCSSã¯ã‚·ãƒ³ãƒ—ル外装ã®åˆ©ç”¨è€…ã«å½±éŸ¿ã—ã¾ã™ */',
'modern.css' => '/* ã“ã“ã«è¨˜è¿°ã—ãŸCSSã¯ãƒ¢ãƒ€ãƒ³å¤–装ã®åˆ©ç”¨è€…ã«å½±éŸ¿ã—ã¾ã™ */',
'vector.css' => '/* ã“ã“ã«è¨˜è¿°ã—ãŸCSSã¯ãƒ™ã‚¯ã‚¿ãƒ¼å¤–装ã®åˆ©ç”¨è€…ã«å½±éŸ¿ã—ã¾ã™ */',
'print.css' => '/* ã“ã“ã«è¨˜è¿°ã—ãŸCSSã¯å°åˆ·å‡ºåŠ›ã«å½±éŸ¿ã—ã¾ã™ */',
-'handheld.css' => '/* ã“ã“ã«è¨˜è¿°ã—ãŸCSSã¯$wgHandheldStyleã§è¨­å®šã•ã‚ŒãŸå¤–装ã«åŸºã¥ãæºå¸¯æ©Ÿå™¨ã«å½±éŸ¿ã—ã¾ã™ */',
'noscript.css' => '/* ã“ã“ã«è¨˜è¿°ã—ãŸCSSã¯JavaScriptを無効ã«ã—ã¦ã„る利用者ã«å½±éŸ¿ã—ã¾ã™ */',
'group-autoconfirmed.css' => '/* ã“ã“ã«è¨˜è¿°ã—ãŸCSSã¯è‡ªå‹•æ‰¿èªã•ã‚ŒãŸåˆ©ç”¨è€…ã®ã¿ã«å½±éŸ¿ã—ã¾ã™ */',
'group-bot.css' => '/* ã“ã“ã«è¨˜è¿°ã—ãŸCSSã¯ãƒœãƒƒãƒˆã®ã¿ã«å½±éŸ¿ã—ã¾ã™ */',
@@ -3231,13 +3311,8 @@ MediaWiki 全般ã®ãƒ­ãƒ¼ã‚«ãƒ©ã‚¤ã‚º (地域化) ã«è²¢çŒ®ã—ãŸã„å ´åˆã¯ã€
# Scripts
'common.js' => '/* ã“ã“ã«ã‚ã‚‹ã™ã¹ã¦ã®JavaScriptã¯ã€ã™ã¹ã¦ã®ãƒšãƒ¼ã‚¸èª­ã¿è¾¼ã¿ã§ã™ã¹ã¦ã®åˆ©ç”¨è€…ã«å¯¾ã—ã¦èª­ã¿è¾¼ã¾ã‚Œã¾ã™ */',
-'standard.js' => '/* ã“ã“ã«ã‚ã‚‹ã™ã¹ã¦ã®JavaScriptã¯ã€ã‚¹ã‚¿ãƒ³ãƒ€ãƒ¼ãƒ‰å¤–装を使用ã—ã¦ã„る利用者ã«å¯¾ã—ã¦èª­ã¿è¾¼ã¾ã‚Œã¾ã™ */',
-'nostalgia.js' => '/* ã“ã“ã«ã‚ã‚‹ã™ã¹ã¦ã®JavaScriptã¯ã€ãƒŽã‚¹ã‚¿ãƒ«ã‚¸ã‚¢å¤–装を使用ã—ã¦ã„る利用者ã«å¯¾ã—ã¦èª­ã¿è¾¼ã¾ã‚Œã¾ã™ */',
'cologneblue.js' => '/* ã“ã“ã«ã‚ã‚‹ã™ã¹ã¦ã®JavaScriptã¯ã€ã‚±ãƒ«ãƒ³ãƒ–ルー外装を使用ã—ã¦ã„る利用者ã«å¯¾ã—ã¦èª­ã¿è¾¼ã¾ã‚Œã¾ã™ */',
'monobook.js' => '/* ã“ã“ã«ã‚ã‚‹ã™ã¹ã¦ã®JavaScriptã¯ã€ãƒ¢ãƒŽãƒ–ック外装を使用ã—ã¦ã„る利用者ã«å¯¾ã—ã¦èª­ã¿è¾¼ã¾ã‚Œã¾ã™ */',
-'myskin.js' => '/* ã“ã“ã«ã‚ã‚‹ã™ã¹ã¦ã®JavaScriptã¯ã€ãƒžã‚¤ã‚¹ã‚­ãƒ³å¤–装を使用ã—ã¦ã„る利用者ã«å¯¾ã—ã¦èª­ã¿è¾¼ã¾ã‚Œã¾ã™ */',
-'chick.js' => '/* ã“ã“ã«ã‚ã‚‹ã™ã¹ã¦ã®JavaScriptã¯ã€ãƒãƒƒã‚¯å¤–装を使用ã—ã¦ã„る利用者ã«å¯¾ã—ã¦èª­ã¿è¾¼ã¾ã‚Œã¾ã™ */',
-'simple.js' => '/* ã“ã“ã«ã‚ã‚‹ã™ã¹ã¦ã®JavaScriptã¯ã€ã‚·ãƒ³ãƒ—ル外装を使用ã—ã¦ã„る利用者ã«å¯¾ã—ã¦èª­ã¿è¾¼ã¾ã‚Œã¾ã™ */',
'modern.js' => '/* ã“ã“ã«ã‚ã‚‹ã™ã¹ã¦ã®JavaScriptã¯ã€ãƒ¢ãƒ€ãƒ³å¤–装を使用ã—ã¦ã„る利用者ã«å¯¾ã—ã¦èª­ã¿è¾¼ã¾ã‚Œã¾ã™ */',
'vector.js' => '/* ã“ã“ã«ã‚ã‚‹ã™ã¹ã¦ã®JavaScriptã¯ã€ãƒ™ã‚¯ã‚¿ãƒ¼å¤–装を使用ã—ã¦ã„る利用者ã«å¯¾ã—ã¦èª­ã¿è¾¼ã¾ã‚Œã¾ã™ */',
'group-autoconfirmed.js' => '/* ã“ã“ã«ã‚ã‚‹ã™ã¹ã¦ã®JavaScriptã¯ã€è‡ªå‹•æ‰¿èªã•ã‚ŒãŸåˆ©ç”¨è€…ã«å¯¾ã—ã¦èª­ã¿è¾¼ã¾ã‚Œã¾ã™ */',
@@ -3318,13 +3393,8 @@ MediaWiki 全般ã®ãƒ­ãƒ¼ã‚«ãƒ©ã‚¤ã‚º (地域化) ã«è²¢çŒ®ã—ãŸã„å ´åˆã¯ã€
'pageinfo-category-files' => 'ファイル数',
# Skin names
-'skinname-standard' => 'クラシック',
-'skinname-nostalgia' => 'ノスタルジア',
'skinname-cologneblue' => 'ケルンブルー',
'skinname-monobook' => 'モノブック',
-'skinname-myskin' => 'マイスキン',
-'skinname-chick' => 'ãƒãƒƒã‚¯',
-'skinname-simple' => 'シンプル',
'skinname-modern' => 'モダン',
'skinname-vector' => 'ベクター',
@@ -3409,11 +3479,25 @@ $1',
'minutes' => '{{PLURAL:$1|$1 分}}',
'hours' => '{{PLURAL:$1|$1 時間}}',
'days' => '{{PLURAL:$1|$1 æ—¥}}',
+'weeks' => '{{PLURAL:$1|$1 週間}}',
'months' => '{{PLURAL:$1|$1 ã‹æœˆ}}',
'years' => '{{PLURAL:$1|$1 å¹´}}',
'ago' => '$1å‰',
'just-now' => 'ã¡ã‚‡ã†ã©ä»Š',
+# Human-readable timestamps
+'hours-ago' => '$1 {{PLURAL:$1|時間}}å‰',
+'minutes-ago' => '$1 {{PLURAL:$1|分}}å‰',
+'seconds-ago' => '$1 {{PLURAL:$1|秒}}å‰',
+'monday-at' => '月曜日 $1',
+'tuesday-at' => 'ç«æ›œæ—¥ $1',
+'wednesday-at' => '水曜日 $1',
+'thursday-at' => '木曜日 $1',
+'friday-at' => '金曜日 $1',
+'saturday-at' => '土曜日 $1',
+'sunday-at' => '日曜日 $1',
+'yesterday-at' => '昨日 $1',
+
# Bad image list
'bad_image_list' => '書å¼ã¯ä»¥ä¸‹ã®é€šã‚Šã§ã™:
@@ -3496,7 +3580,7 @@ Variants for Chinese language
* gpslongitude
* gpsaltitude',
-# EXIF tags
+# Exif tags
'exif-imagewidth' => 'ç”»åƒã®å¹…',
'exif-imagelength' => 'ç”»åƒã®é«˜ã•',
'exif-bitspersample' => 'ç”»åƒã®ãƒ“ットã®æ·±ã•',
@@ -3674,7 +3758,7 @@ Variants for Chinese language
'exif-originalimageheight' => 'トリミングã•ã‚Œã‚‹å‰ã®ç”»åƒã®é«˜ã•',
'exif-originalimagewidth' => 'トリミングã•ã‚Œã‚‹å‰ã®ç”»åƒã®å¹…',
-# EXIF attributes
+# Exif attributes
'exif-compression-1' => '無圧縮',
'exif-compression-2' => 'CCITT Group 3 1次元修正ãƒãƒ•ãƒžãƒ³é€£é•·ç¬¦å·åŒ–',
'exif-compression-3' => 'CCITT Group 3 ファックス符å·åŒ–',
@@ -4149,7 +4233,6 @@ $5
'version-other' => 'ãã®ä»–',
'version-mediahandlers' => 'メディアãƒãƒ³ãƒ‰ãƒ©ãƒ¼',
'version-hooks' => 'フック',
-'version-extension-functions' => '拡張機能関数',
'version-parser-extensiontags' => '構文解æžæ‹¡å¼µæ©Ÿèƒ½ã‚¿ã‚°',
'version-parser-function-hooks' => 'パーサー関数フック',
'version-hook-name' => 'フックå',
@@ -4158,6 +4241,7 @@ $5
'version-license' => 'ライセンス',
'version-poweredby-credits' => "ã“ã®ã‚¦ã‚£ã‚­ã¯ã€'''[//www.mediawiki.org/ MediaWiki]''' (copyright © 2001-$1 $2) ã§å‹•ä½œã—ã¦ã„ã¾ã™ã€‚",
'version-poweredby-others' => 'ãã®ä»–',
+'version-poweredby-translators' => 'translatewiki.net ã®ç¿»è¨³è€…ãŸã¡',
'version-credits-summary' => '[[Special:Version|MediaWiki]] ã«è²¢çŒ®ã—ãŸä»¥ä¸‹ã®äººãŸã¡ã«æ„Ÿè¬ã—ã¾ã™ã€‚',
'version-license-info' => 'MediaWikiã¯ãƒ•ãƒªãƒ¼ã‚½ãƒ•ãƒˆã‚¦ã‚§ã‚¢ã§ã™ã€‚ã‚ãªãŸã¯ã€ãƒ•ãƒªãƒ¼ã‚½ãƒ•ãƒˆã‚¦ã‚§ã‚¢è²¡å›£ã®ç™ºè¡Œã™ã‚‹GNU一般公衆利用許諾書 (GNU General Public License) (ãƒãƒ¼ã‚¸ãƒ§ãƒ³2ã€ã¾ãŸã¯ãれ以é™ã®ãƒ©ã‚¤ã‚»ãƒ³ã‚¹) ã®è¦ç´„ã«åŸºã¥ãã€ã“ã®ãƒ©ã‚¤ãƒ–ラリをå†é…布ãŠã‚ˆã³æ”¹å¤‰ã§ãã¾ã™ã€‚
@@ -4173,12 +4257,17 @@ MediaWikiã¯ã€æœ‰ç”¨ã§ã‚ã‚‹ã“ã¨ã‚’期待ã—ã¦é…布ã•ã‚Œã¦ã„ã¾ã™ãŒã€
'version-entrypoints-articlepath' => '[https://www.mediawiki.org/wiki/Manual:$wgArticlePath/ja 記事ã®ãƒ‘ス]',
'version-entrypoints-scriptpath' => '[https://www.mediawiki.org/wiki/Manual:$wgScriptPath/ja スクリプトパス]',
-# Special:FilePath
-'filepath' => 'ファイルパス',
-'filepath-page' => 'ファイル:',
-'filepath-submit' => 'å–å¾—',
-'filepath-summary' => 'ã“ã®ç‰¹åˆ¥ãƒšãƒ¼ã‚¸ã¯ã€ãƒ•ã‚¡ã‚¤ãƒ«ã¸ã®å®Œå…¨ãªãƒ‘スを返ã—ã¾ã™ã€‚
-ç”»åƒã¯æœ€å¤§è§£åƒåº¦ã§è¡¨ç¤ºã•ã‚Œã€ä»–ã®ãƒ•ã‚¡ã‚¤ãƒ«ã‚¿ã‚¤ãƒ—ã¯é–¢é€£ä»˜ã‘ã•ã‚ŒãŸãƒ—ログラムãŒç›´æŽ¥èµ·å‹•ã—ã¾ã™ã€‚',
+# Special:Redirect
+'redirect' => 'ファイルåã€åˆ©ç”¨è€…IDã€ç‰ˆIDã§ã®è»¢é€',
+'redirect-legend' => 'ファイルã¾ãŸã¯ãƒšãƒ¼ã‚¸ãƒ˜ã®è»¢é€',
+'redirect-summary' => 'ã“ã®ç‰¹åˆ¥ãƒšãƒ¼ã‚¸ã¯ã€ãƒ•ã‚¡ã‚¤ãƒ« (ファイルåを指定)ã€ãƒšãƒ¼ã‚¸ (版 ID を指定)ã€åˆ©ç”¨è€…ページ (利用者 ID ã‚’æ•´æ•°ã§æŒ‡å®š) ã«è»¢é€ã•ã‚Œã¾ã™ã€‚',
+'redirect-submit' => '実行',
+'redirect-lookup' => '検索ã®ç¨®é¡ž:',
+'redirect-value' => '値:',
+'redirect-user' => '利用者 ID',
+'redirect-revision' => 'ページã®ç‰ˆ ID',
+'redirect-file' => 'ファイルå',
+'redirect-not-exists' => '値ãŒè¦‹ã¤ã‹ã‚Šã¾ã›ã‚“',
# Special:FileDuplicateSearch
'fileduplicatesearch' => 'é‡è¤‡ãƒ•ã‚¡ã‚¤ãƒ«ã®æ¤œç´¢',
@@ -4227,12 +4316,16 @@ MediaWikiã¯ã€æœ‰ç”¨ã§ã‚ã‚‹ã“ã¨ã‚’期待ã—ã¦é…布ã•ã‚Œã¦ã„ã¾ã™ãŒã€
'tags' => '有効ãªå¤‰æ›´ã‚¿ã‚°',
'tag-filter' => '[[Special:Tags|ã‚¿ã‚°]]絞り込ã¿:',
'tag-filter-submit' => '絞り込ã¿',
+'tag-list-wrapper' => '([[Special:Tags|{{PLURAL:$1|ã‚¿ã‚°}}]]: $2)',
'tags-title' => 'ã‚¿ã‚°',
'tags-intro' => 'ã“ã®ãƒšãƒ¼ã‚¸ã¯ã€ã‚½ãƒ•ãƒˆã‚¦ã‚§ã‚¢ãŒç·¨é›†ã«å¯¾ã—ã¦ä»˜ã‘ã‚‹ã‚¿ã‚°ã¨ãã®æ„味ã®ä¸€è¦§ã§ã™ã€‚',
'tags-tag' => 'ã‚¿ã‚°å',
'tags-display-header' => '変更一覧ã«è¡¨ç¤ºã•ã‚Œã‚‹ã‚‚ã®',
'tags-description-header' => '詳細ãªæ„味ã®èª¬æ˜Ž',
+'tags-active-header' => 'アクティブ?',
'tags-hitcount-header' => 'ã‚¿ã‚°ãŒä»˜ä¸Žã•ã‚ŒãŸå¤‰æ›´',
+'tags-active-yes' => 'ã¯ã„',
+'tags-active-no' => 'ã„ã„ãˆ',
'tags-edit' => '編集',
'tags-hitcount' => '$1 {{PLURAL:$1|回ã®å¤‰æ›´}}',
@@ -4253,6 +4346,7 @@ MediaWikiã¯ã€æœ‰ç”¨ã§ã‚ã‚‹ã“ã¨ã‚’期待ã—ã¦é…布ã•ã‚Œã¦ã„ã¾ã™ãŒã€
'dberr-problems' => '申ã—訳ã‚ã‚Šã¾ã›ã‚“! ã“ã®ã‚¦ã‚§ãƒ–サイトã«æŠ€è¡“çš„ãªéšœå®³ãŒç™ºç”Ÿã—ã¦ã„ã¾ã™ã€‚',
'dberr-again' => '数分間待ã£ãŸå¾Œã€ã‚‚ã†ä¸€åº¦èª­ã¿è¾¼ã‚“ã§ãã ã•ã„。',
'dberr-info' => '(データベースサーãƒãƒ¼ $1 ã«æŽ¥ç¶šã§ãã¾ã›ã‚“ã§ã—ãŸ)',
+'dberr-info-hidden' => '(データベース サーãƒãƒ¼ã¨é€šä¿¡ã§ãã¾ã›ã‚“)',
'dberr-usegoogle' => 'å…ƒã«æˆ»ã‚‹ã¾ã§ã€Googleを利用ã—ã¦æ¤œç´¢ã§ãã¾ã™ã€‚',
'dberr-outofdate' => 'åŽé›†ã•ã‚ŒãŸå†…容ã¯å¤ã„å¯èƒ½æ€§ãŒã‚ã‚‹ã“ã¨ã«æ³¨æ„ã—ã¦ãã ã•ã„。',
'dberr-cachederror' => 'ã“ã‚Œã¯è¦æ±‚ã•ã‚ŒãŸãƒšãƒ¼ã‚¸ã‚’キャッシュã—ãŸè¤‡è£½ã§ã‚ã‚Šã€å¤ããªã£ã¦ã„ã‚‹å¯èƒ½æ€§ãŒã‚ã‚Šã¾ã™ã€‚',
@@ -4268,6 +4362,9 @@ MediaWikiã¯ã€æœ‰ç”¨ã§ã‚ã‚‹ã“ã¨ã‚’期待ã—ã¦é…布ã•ã‚Œã¦ã„ã¾ã™ãŒã€
'htmlform-submit' => 'é€ä¿¡',
'htmlform-reset' => '変更をå–り消ã™',
'htmlform-selectorother-other' => 'ãã®ä»–',
+'htmlform-no' => 'ã„ã„ãˆ',
+'htmlform-yes' => 'ã¯ã„',
+'htmlform-chosen-placeholder' => 'é¸æŠžã—ã¦ãã ã•ã„',
# SQLite database support
'sqlite-has-fts' => '$1 (全文検索ã‚ã‚Š)',
@@ -4385,4 +4482,19 @@ MediaWikiã¯ã€æœ‰ç”¨ã§ã‚ã‚‹ã“ã¨ã‚’期待ã—ã¦é…布ã•ã‚Œã¦ã„ã¾ã™ãŒã€
# Image rotation
'rotate-comment' => 'ç”»åƒã‚’時計回り㫠$1 {{PLURAL:$1|度}}回転',
+# Limit report
+'limitreport-title' => 'パーサーã®ãƒ—ロファイリング データ:',
+'limitreport-cputime' => 'CPU 時間',
+'limitreport-cputime-value' => '$1 {{PLURAL:$1|秒}}',
+'limitreport-walltime' => '実時間',
+'limitreport-walltime-value' => '$1 {{PLURAL:$1|秒}}',
+'limitreport-ppvisitednodes' => 'プリプロセッサãŒè¨ªå•ã—ãŸãƒŽãƒ¼ãƒ‰æ•°',
+'limitreport-ppgeneratednodes' => 'プリプロセッサãŒç”Ÿæˆã—ãŸãƒŽãƒ¼ãƒ‰æ•°',
+'limitreport-postexpandincludesize' => 'å‚照読ã¿è¾¼ã¿ã®å±•é–‹å¾Œã®ã‚µã‚¤ã‚º',
+'limitreport-postexpandincludesize-value' => '$1/$2 {{PLURAL:$2|ãƒã‚¤ãƒˆ}}',
+'limitreport-templateargumentsize' => 'テンプレート引数ã®ã‚µã‚¤ã‚º',
+'limitreport-templateargumentsize-value' => '$1/$2 {{PLURAL:$2|ãƒã‚¤ãƒˆ}}',
+'limitreport-expansiondepth' => '展開ã®æœ€å¤§æ·±ã•',
+'limitreport-expensivefunctioncount' => '高負è·ãƒ‘ーサー関数ã®æ•°',
+
);
diff --git a/languages/messages/MessagesJam.php b/languages/messages/MessagesJam.php
index 9de985dc..a5f83393 100644
--- a/languages/messages/MessagesJam.php
+++ b/languages/messages/MessagesJam.php
@@ -43,9 +43,6 @@ $messages = array(
'tog-shownumberswatching' => 'Shuo di nomba a wachin yuuza',
'tog-oldsig' => 'Priivyuu a egzisin signicha:',
'tog-fancysig' => 'Chriit signicha az wikitex (widoutn aatamatik lingk)',
-'tog-externaleditor' => 'Yuuz extoernal edita bai difaalt (fi expoert onli, niid speshal setn pahn yu kompiuta)',
-'tog-externaldiff' => 'Yuuz extoernal dif bai difaalt (fi expoert onli, niid speshal setn pahn yu kompiuta)',
-'tog-showjumplinks' => 'Eniebl "jomp tu" aksesibiliti lingk',
'tog-uselivepreview' => 'Yuuz laiv priivyuu (rikwaya JavaScript) (experimental)',
'tog-forceeditsummary' => 'Pramp mi wen entarin blangk edit somari',
'tog-watchlisthideown' => 'Aid mi editdem frahn di wachlis',
@@ -243,7 +240,7 @@ $1',
'pool-queuefull' => 'Puul kyuu fulop',
'pool-errorunknown' => 'Anuon era',
-# 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).
+# 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).
'aboutsite' => 'Habowt {{SITENAME}}',
'aboutpage' => 'Project: អំពី',
'copyright' => 'Kantent avielobl anda $1.',
@@ -253,7 +250,6 @@ $1',
'disclaimers' => 'Diskliema',
'disclaimerpage' => 'Project: Jinaral diskliema',
'edithelp' => 'Editin elp',
-'edithelppage' => 'Help: Editin',
'helppage' => 'Help: Kantent',
'mainpage' => 'Mien piej',
'mainpage-description' => 'Mien piej',
@@ -324,17 +320,6 @@ A lis a valid peshal piej kiahn fain a [[Special:SpecialPages|{{int:specialpages
# General errors
'error' => 'Era',
'databaseerror' => 'Dietabies era',
-'dberrortext' => 'A dietabies kwieri sintax era okor.
-Dis maita indikiet wahn bog ina di saafwier.
-Di laas atemp dietabies kwieri ena:
-<blockquote><tt>$1</tt></blockquote>
-frahn widin fongshan "<tt>$2</tt>".
-Dietabies ritoern era "<tt>$3: $4</tt>".',
-'dberrortextcl' => 'A dietabies kwieri sintax era okor.
-Di laas attemp dietabies kwieri ena:
-"$1"
-frahn widin fongshan "$2".
-Dietabies ritoern era "$3: $4"',
'laggedslavemode' => "'''Waanin:''' Piej maita no kantien riisant opdiet.",
'readonly' => 'Dietabies lak',
'enterlockreason' => 'Enta a riizn fi di lak, inkluudn a estimet a wen di lak wi riliis',
@@ -387,7 +372,6 @@ Begyu chrai agen ina fyuu minit.',
'editinginterface' => "'''Waanin:''' Yu de edit page we yuuz fi provaid intafies tex fi di saafwier.
Chienj tu dis piej wi afek di apierans a di yuuza intafies fi ada yuuzadem.
Fi chranslieshan, begyu kansida fi yuuz [//translatewiki.net/wiki/Main_Page?setlang=en translatewiki.net], di MediaWiki luokalaizieshan projek.",
-'sqlhidden' => '(SQL kwieri aidwe)',
'cascadeprotected' => 'Dis piej protek frahn edit, bikaa i\'inkluud ina di falarin {{PLURAL:$1|piej, ush|piejdem, ush}} protek wid di "kiaskiedn" apshan ton aan:
$2',
'namespaceprotected' => "Yu no gat no pomishan fi edit piej ina di '''$1''' niemspies.",
@@ -507,7 +491,7 @@ Fi finish lag iin, yu mos set a nyuu paaswod yaso:',
'newpassword' => 'Nyuu paaswod:',
'retypenew' => 'Ritaip nyuu paaswod:',
'resetpass_submit' => 'Set paaswod ahn lag iin',
-'resetpass_success' => 'Yu paaswod chienj soksesfuli!
+'changepassword-success' => 'Yu paaswod chienj soksesfuli!
A lag yu iin nou ...',
'resetpass_forbidden' => 'Paaswod kyaahn chienj',
'resetpass-no-info' => 'Yu mos lag iin fi akses dis piej dairek.',
diff --git a/languages/messages/MessagesJut.php b/languages/messages/MessagesJut.php
index 503c0f4f..b0b0ff3c 100644
--- a/languages/messages/MessagesJut.php
+++ b/languages/messages/MessagesJut.php
@@ -43,8 +43,6 @@ $messages = array(
'tog-enotifrevealaddr' => "Ves miin e-mail-adresse i mails ve besked ændrenger'm",
'tog-shownumberswatching' => 'Ves åntal brugere, der åvervåger',
'tog-fancysig' => 'Signaturer uden åtåmatisk henvesnenge',
-'tog-externaleditor' => 'Brug ekstern redigærengsmåskiin åtåmatisk',
-'tog-externaldiff' => 'Brug ekstern førskelsvesnenge åtåmatisk',
'tog-showjumplinks' => 'Ves tilgængelegheds-henvesnenger',
'tog-uselivepreview' => 'Brug åtåmatisk førhåndsvesnenge (JavaScript) (eksperimentel)',
'tog-forceeditsummary' => 'Advar, hves sammenfatnenge mangler ve gemnenge',
@@ -206,7 +204,6 @@ $messages = array(
'disclaimers' => 'Førbeholt',
'disclaimerpage' => 'Project:Huses førbeholt',
'edithelp' => 'Hjælp til redigærenge',
-'edithelppage' => "Help:Vordan redigærer a'n side",
'helppage' => 'Help:Hjælpførside',
'mainpage' => 'Førsit',
'mainpage-description' => 'Førsit',
@@ -441,7 +438,6 @@ hersenenge, (førge) = førskel til den førge hersenenge, l = lile til mendre Ã
'prevn' => 'førge {{PLURAL:$1|$1}}',
'nextn' => 'nægste {{PLURAL:$1|$1}}',
'viewprevnext' => 'Ves ($1 {{int:pipe-separator}} $2) ($3)',
-'searchhelp-url' => 'Help:Hjælpførside',
'searchall' => 'Ã¥l',
'powersearch' => 'SøÄ',
@@ -489,7 +485,6 @@ hersenenge, (førge) = førskel til den førge hersenenge, l = lile til mendre Ã
'recentchangeslinked-feed' => 'Relaterede ændrenger',
'recentchangeslinked-toolbox' => 'Relaterede ændrenger',
'recentchangeslinked-title' => 'Ændrenger der vegånde til "$1"',
-'recentchangeslinked-noresult' => 'I det udvalgte tidsrum blev der ekke føretaget ændrenger på siderne der henveses til.',
'recentchangeslinked-summary' => "Denne sonstside beser de seneste ændrenger på de sider der henveses til. Sider på din åvervågnengsliste er vest ve '''fed''' skreft.",
# Upload
diff --git a/languages/messages/MessagesJv.php b/languages/messages/MessagesJv.php
index 5f618574..6c315dec 100644
--- a/languages/messages/MessagesJv.php
+++ b/languages/messages/MessagesJv.php
@@ -81,11 +81,6 @@ $messages = array(
'tog-shownumberswatching' => 'Tuduhna cacahé pangawas',
'tog-oldsig' => 'Tapak asma sing ana:',
'tog-fancysig' => 'Anggepen tapak asta minangka teks wiki (tanpa pranala otomatis)',
-'tog-externaleditor' => 'Pigunakaken program pangolah tembung jawi (namung tumrap ahli, perlu pangaturan mligi ing komputer panjenengan.
-[//www.mediawiki.org/wiki/Manual:External_editors Informasi sajangkepipun].)',
-'tog-externaldiff' => 'Pigunakaken diff eksternal sacara bektan (namung tumrap para ahli, perlu pangaturan mligi ing komputer panjenengan.
-[//www.mediawiki.org/wiki/Manual:External_editors Informasi sajangkepipun].)',
-'tog-showjumplinks' => 'Aktifna pranala pambiyantu "langsung menyang"',
'tog-uselivepreview' => 'Nganggoa pratayang langsung (mbutuhaké JavaScript) (eksperimental)',
'tog-forceeditsummary' => 'Élingna aku menawa kothak ringkesan suntingan isih kosong',
'tog-watchlisthideown' => 'Delikna suntinganku ing daftar pangawasan',
@@ -98,6 +93,7 @@ $messages = array(
'tog-diffonly' => 'Aja dituduhaké isi kaca ing ngisor bédané suntingan',
'tog-showhiddencats' => 'Tuduhna kategori sing didelikaké',
'tog-norollbackdiff' => 'Lirwaaké prabédan sawusé nglakokaké sawijining pambalikan.',
+'tog-useeditwarning' => 'Èlingaké kula yèn kula ninggalaké suntingan sing durung kasimpen',
'underline-always' => 'Tansah',
'underline-never' => 'Ora',
@@ -161,6 +157,10 @@ $messages = array(
'oct' => 'Okt',
'nov' => 'Nov',
'dec' => 'Des',
+'may-date' => '$1 Mèi',
+'september-date' => '$1 Sèptèmber',
+'november-date' => '$1 Novèmber',
+'december-date' => '$1 Dèsèmber',
# Categories related messages
'pagecategories' => '{{PLURAL:$1|Kategori|Kategori}}',
@@ -242,6 +242,7 @@ $messages = array(
'create-this-page' => 'Nggawé kaca iki',
'delete' => 'Busak',
'deletethispage' => 'Busak kaca iki',
+'undeletethispage' => 'Wurung busak kaca iki',
'undelete_short' => 'Batal busak $1 {{PLURAL:$1|suntingan|suntingan}}',
'viewdeleted_short' => 'Pirsani {{PLURAL:$1|suntingan|suntingan}} ingkang sampun kabusak',
'protect' => 'Reksanen',
@@ -285,7 +286,7 @@ $1',
'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).
+# 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).
'aboutsite' => 'Prakara {{SITENAME}}',
'aboutpage' => 'Project:Prakara',
'copyright' => 'Kabèh isi kasedyakaké miturut $1.',
@@ -295,7 +296,6 @@ $1',
'disclaimers' => 'Pamaidonan',
'disclaimerpage' => 'Project:Panyangkalan umum',
'edithelp' => 'Pitulung panyuntingan',
-'edithelppage' => 'Help:panyuntingan',
'helppage' => 'Help:Isi',
'mainpage' => 'Kaca Utama',
'mainpage-description' => 'Kaca Utama',
@@ -370,16 +370,6 @@ Iki manawa uga nuduhaké anané kesalahan ing piranti alus sing dipigunakaké dÃ
# General errors
'error' => 'Kasalahan',
'databaseerror' => 'Kasalahan database',
-'dberrortext' => 'Ana kasalahan sintaks ing panyuwunan basis data.
-Kasalahan iki mbokmenawa nuduhaké anané \'\'bug\'\' ing software.
-Panyuwunan basis data sing pungkasan yakuwi: <blockquote><code>$1</code></blockquote>
-saka jroning fungsi "<code>$2</code>".
-Basis data ngasilaké kasalahan "<samp>$3: $4</samp>".',
-'dberrortextcl' => 'Ana kasalahan sintaks ing panyuwunan basis data.
-Panyuwunan basis data sing pungkasan iku:
-"$1"
-saka jroning fungsi "$2".
-Basis data ngasilaké kasalahan "$3: $4".',
'laggedslavemode' => 'Pènget: Kaca iki mbokmenawa isiné dudu pangowahan pungkasan.',
'readonly' => 'Database dikunci',
'enterlockreason' => 'Lebokna alesan panguncèn, kalebu uga prakiran kapan kunci bakal dibuka',
@@ -426,12 +416,12 @@ Mangga dicoba manèh ing sawetara menit.',
'editinginterface' => "'''Pènget:''' Panjenengan nyunting kaca sing dianggo nyedyakaké tèks antarmuka kanggo piranti alus.
Pangowahan kaca iki bakal awèh pangaruh marang tampilan antarmuka panganggo kanggoné panganggo liya.
Kanggo terjemahan, mangga nganggo [//translatewiki.net/wiki/Main_Page?setlang=en translatewiki.net], proyèk lokalisasi MediaWiki.",
-'sqlhidden' => '(Panyuwunan SQL didelikaké)',
'cascadeprotected' => 'Kaca iki wis direksa saka panyuntingan amerga disertakaké ing {{PLURAL:$1|kaca|kaca-kaca}} ngisor iki sing wis direksa mawa opsi "runtun" diaktifaké:
$2',
'namespaceprotected' => "Panjenengan ora kagungan idin kanggo nyunting kaca ing bilik nama '''$1'''.",
'customcssprotected' => 'Sampéyan ora dililakaké nyunting kaca CSS iki amarga kaisi pangaturan pribadi saka panganggo liya.',
'customjsprotected' => 'Sampéyan ora dililakaké nyunting kaca JavaScript iki amarga kaisi pangaturan pribadi saka panganggo liya.',
+'mycustomcssprotected' => 'Sampèyan ora duwé idin kanggo ngowah kaca CSS iki.',
'ns-specialprotected' => 'Kaca ing bilik nama astaméwa utawa kusus, ora bisa disunting.',
'titleprotected' => "Irah-irahan iki direksa ora olèh digawé déning [[User:$1|$1]].
Alesané yaiku ''$2''.",
@@ -457,10 +447,11 @@ Cathet yèn sapérangan kaca mungkin isih nampilaké kayata sampéyan isih mlebu
'welcomeuser' => 'Sugeng Rawuh, $1!',
'welcomecreation-msg' => 'Akun panjenengan wis kacipta. Aja lali nata konfigurasi [[Special:Preferences|preferensi {{SITENAME}}]] panjenengan.',
'yourname' => 'Asma pangangeman',
+'userlogin-yourname' => 'Jeneng panganggo',
+'userlogin-yourname-ph' => 'Lebokaké jenengné panganggo',
'yourpassword' => 'Tembung sandhi:',
'yourpasswordagain' => 'Balènana 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',
'password-change-forbidden' => 'Sampéyan ora bisa ngganti tembung sandhi nèng wiki iki.',
'externaldberror' => 'Ana kasalahan otèntikasi basis dhata èksternal utawa panjenengan ora pareng nglakoni pemutakhiran marang akun èksternal panjenengan.',
@@ -552,7 +543,7 @@ Tulung nunggu dhisik sadurungé njajal manèh.',
'newpassword' => 'Tembung sandi anyar:',
'retypenew' => 'Ketik ulang tembung sandi anyar:',
'resetpass_submit' => 'Nata tembung sandhi lan mlebu log',
-'resetpass_success' => 'Tembung sandhi panjenengan wis suksès diowahi! Saiki mrosès mlebu log panjenengan...',
+'changepassword-success' => 'Tembung sandhi panjenengan wis suksès diowahi! Saiki mrosès mlebu log panjenengan...',
'resetpass_forbidden' => 'Tembung sandhi ora bisa diganti',
'resetpass-no-info' => 'Panjenengan kudu mlebu log kanggo ngaksès kaca iki sacara langsung.',
'resetpass-submit-loggedin' => 'Ganti tembung sandi',
@@ -564,10 +555,8 @@ Panjengen manawa wis kasil ganti tembung sandi utawa nyuwun tembung sandi saunta
# Special:PasswordReset
'passwordreset' => 'Balèni setèl tembung sandhi',
-'passwordreset-text' => 'Jangkepi pormulir iki kanggo mbalèkaké tembung sandhiné Sampéyan.',
'passwordreset-legend' => 'Balèni setèl tembung sandhi',
'passwordreset-disabled' => 'Piranti kanggo mbalèni nyetèl tembung sandhi dipatèni nèng wiki iki.',
-'passwordreset-pretext' => '{{PLURAL:$1||Lebokaké siji bagéyan data ngisor iki}}',
'passwordreset-username' => 'Jeneng panganggo:',
'passwordreset-domain' => 'Domain:',
'passwordreset-capture' => 'Delok layang èlèktronik sing diasilaké?',
@@ -590,7 +579,7 @@ Sampéyan kudu mlebu log lan milih siji tembung sandhi anyar saiki. Yèn wong li
Tembung sandhi sawetara: $2',
'passwordreset-emailsent' => 'Layang èlèktronik kanggo mbalèkaké tembung sandhi wis dikirim.',
'passwordreset-emailsent-capture' => 'Layang èlèktronik kanggo mbalèkaké tembung sandhi wis dikirim, bisa didelok ngisor iki.',
-'passwordreset-emailerror-capture' => 'Layang èlèktronik pangèling ditampilaké nèng ngisor iki, nanging ora kasil dikirim: $1',
+'passwordreset-emailerror-capture' => 'Layang èlèktronik kanggo mbalèkaké tembung sandhi wis ditokaké, bisa didelok ngisor iki, nanging gagal nalika dikirim menyang panganggoné: $1',
# Special:ChangeEmail
'changeemail' => 'Ganti alamat layang èlèktronik',
@@ -1030,7 +1019,6 @@ Rinciané bisa ditemokaké nèng [{{fullurl:{{#Special:Log}}/delete|page={{FULLP
'searchmenu-legend' => 'Pilihan panggolèkan',
'searchmenu-exists' => "'''Ana kaca kanthi jeneng \"[[\$1]]\" ing wiki iki'''",
'searchmenu-new' => "'''Gawé kaca \"[[:\$1]]\" ing wiki iki!'''",
-'searchhelp-url' => 'Help:Isi',
'searchmenu-prefix' => '[[Special:PrefixIndex/$1|Tlusuri kaca-kaca kanthi tembung-wiwitan iki]]',
'searchprofile-articles' => 'Kaca isi',
'searchprofile-project' => 'Kaca pitulung lan proyèk',
@@ -1072,15 +1060,6 @@ Rinciané bisa ditemokaké nèng [{{fullurl:{{#Special:Log}}/delete|page={{FULLP
'search-external' => 'Panggolèkan èkstèrnal',
'searchdisabled' => 'Sawetara wektu iki panjenengan ora bisa nggolèk mawa fungsi golèk {{SITENAME}}. Kanggo saiki mangga panjenengan bisa golèk nganggo Google. Nanging isi indèks Google kanggo {{SITENAME}} bisa waé lawas lan durung dianyari.',
-# Quickbar
-'qbsettings' => 'Pengaturan bar sidhatan',
-'qbsettings-none' => 'Ora ana',
-'qbsettings-fixedleft' => 'Tetep sisih kiwa',
-'qbsettings-fixedright' => 'Tetep sisih tengen',
-'qbsettings-floatingleft' => 'Ngambang sisih kiwa',
-'qbsettings-floatingright' => 'Ngambang sisih tengen',
-'qbsettings-directionality' => 'Wis pesthi, gumantung saka wujud skrip basané Sampéyan',
-
# Preferences page
'preferences' => 'Preferensi (pilihan)',
'mypreferences' => 'Préferènsi',
@@ -1113,7 +1092,6 @@ Rinciané bisa ditemokaké nèng [{{fullurl:{{#Special:Log}}/delete|page={{FULLP
'resetprefs' => 'Resikana owah-owahan sing ora disimpen',
'restoreprefs' => 'Balèkna kabèh setèlan baku',
'prefs-editing' => 'Panyuntingan',
-'prefs-edit-boxsize' => 'Ukuran kothak panyuntingan.',
'rows' => 'Larikan:',
'columns' => 'Kolom:',
'searchresultshead' => 'Panggolèkan',
@@ -1124,9 +1102,6 @@ Rinciané bisa ditemokaké nèng [{{fullurl:{{#Special:Log}}/delete|page={{FULLP
'recentchangesdays-max' => '(maksimum $1 {{PLURAL:$1|dina|dina}})',
'recentchangescount' => 'Cacahé suntingan sing ditampilaké:',
'prefs-help-recentchangescount' => 'Iki klebu owah-owahan pungkasan, kaca sajarah, lan log.',
-'prefs-help-watchlist-token' => 'Ngisi kothak iki nganggo kunci wadi (PIN) bakal ngasilaké sindikasi RSS kanggo daftar pantauan panjenengan.
-Sapa waé sing meruhi kunci iki bisa maca daftar pantauan panjenengan, mula pilihen isi sing aman.
-Iki aji acak sing bisa panjenengan gunakaké: $1',
'savedprefs' => 'Préferènsi Panjenengan wis disimpen',
'timezonelegend' => 'Zona wektu:',
'localtime' => 'Wektu saenggon:',
@@ -1157,7 +1132,6 @@ Iki aji acak sing bisa panjenengan gunakaké: $1',
'prefs-reset-intro' => 'Panjenengan bisa migunakaké kaca iki kanggo mbalèkaké préferensi panjenengan marang setèlan baku situs.
Pembalikan ora bisa dibatalaké.',
'prefs-emailconfirm-label' => 'Konfirmasi layang-e:',
-'prefs-textboxsize' => 'Ukuran kothak suntingan',
'youremail' => 'Layang élèktronik (E-mail):',
'username' => '{{GENDER:$1|Asma panganggo}}:',
'uid' => '{{GENDER:$1|ID panganggo}}:',
@@ -1289,7 +1263,7 @@ Alamat layang èlèktronik Sampéyan ora dituduhaké nalika wong liya ngubungi S
'right-proxyunbannable' => 'Bypass pamblokiran otomatis proxy-proxy',
'right-unblockself' => 'Bukak blokirané dhéwéké',
'right-protect' => 'Ganti undhaking pangreksan lan owah kaca-kaca sing direksa',
-'right-editprotected' => 'Sunting kaca-kaca sing direksa (tanpa pangreksan runtun)',
+'right-editprotected' => 'Owah kaca-kaca sing direksa (tanpa pangreksan runtun)',
'right-editinterface' => 'Sunting interface (antarmuka) panganggo',
'right-editusercssjs' => 'Sunting berkas-berkas CSS lan JS panganggo liya',
'right-editusercss' => 'Sunting berkas-berkas CSS panganggo liya',
@@ -1397,7 +1371,6 @@ Alamat layang èlèktronik Sampéyan ora dituduhaké nalika wong liya ngubungi S
'recentchangeslinked-feed' => 'Pranala Pilihan',
'recentchangeslinked-toolbox' => 'Pranala Pilihan',
'recentchangeslinked-title' => 'Owah-owahan sing ana gandhèngané karo "$1"',
-'recentchangeslinked-noresult' => 'Ora ana owah-owahan ing kaca-kaca kagandhèng iki salawasé periode sing wis ditemtokaké.',
'recentchangeslinked-summary' => "Kaca astaméwa (kaca kusus) iki mènèhi daftar owah-owahan pungkasan ing kaca-kaca sing kagandhèng (utawa anggota sawijining kateogri). Kaca sing [[Special:Watchlist|panjenengan awasi]] ditandhani '''kandel'''.",
'recentchangeslinked-page' => 'Jeneng kaca:',
'recentchangeslinked-to' => 'Nuduhaké owah-owahan menyang kaca sing disambung menyang kaca-kaca iki',
@@ -1408,7 +1381,7 @@ Alamat layang èlèktronik Sampéyan ora dituduhaké nalika wong liya ngubungi S
'reuploaddesc' => 'Bali ing formulir pamotan',
'upload-tryagain' => 'Kirim déskripsi berkas sing wis diowah',
'uploadnologin' => 'Durung mlebu log',
-'uploadnologintext' => 'Panjenengan kudu [[Special:UserLogin|mlebu log]] supaya olèh ngunggahaké gambar utawa berkas liyané.',
+'uploadnologintext' => 'Sampéyan kudu [[Special:UserLogin|mlebu log]] supaya bisa ngunggah berkas.',
'upload_directory_missing' => 'Direktori pamunggahan ($1) ora ditemokaké lan ora bisa digawé déning server wèb.',
'upload_directory_read_only' => 'Dirèktori pangunggahan ($1) ora bisa ditulis déning server wèb.',
'uploaderror' => 'Kaluputan pangunggahan berkas',
@@ -1618,7 +1591,6 @@ Kanggo kamanan paling apik, img_auth.php dipatèni.',
'http-read-error' => 'Kasalahan maca HTTP.',
'http-timed-out' => 'Panjalukan HTTP kliwat wates wektu.',
'http-curl-error' => 'Kasalahan nalika njupuk URL: $1',
-'http-host-unreachable' => 'Ora bisa ngranggèh URL.',
'http-bad-status' => 'Ana masalah nalika njaluk HTTP: $1 $2',
# Some likely curl errors. More could be added from <http://curl.haxx.se/libcurl/c/libcurl-errors.html>
@@ -1770,12 +1742,6 @@ Priksanen dhisik pranala-pranala menyang cithakan iki sadurungé mbusak.',
'statistics-users-active-desc' => 'Panganggo sing ngayahi aktivitas jroning {{PLURAL:$1|dia|$1 dina}} pungkasan',
'statistics-mostpopular' => 'Kaca sing paling akèh dideleng',
-'disambiguations' => 'Kaca sing kaubung nèng kaca disambiguasi',
-'disambiguationspage' => 'Template:Disambig',
-'disambiguations-text' => "Kaca-kaca iki kaisi paling ora sak pranala nuju '''kaca disambiguasi'''.
-Mungkin kuduné diubungaké nèng kaca sing luwih pantes.<br />
-Kaca kaanggep kaca disambiguasi yèn kuwi nganggo templat sing kaubung saka [[MediaWiki:Disambiguationspage]].",
-
'pageswithprop' => 'Kaca-kaca mawa ubarampé',
'pageswithprop-legend' => 'Kaca-kaca mawa ubarampé',
'pageswithprop-text' => 'Kaca iki njlèntèhaké kaca-kaca sing nganggo ubarampé astamiwa.',
@@ -2028,10 +1994,9 @@ Owah-owahan sing dumadi ing tembé ing kaca iku lan kaca dhiskusi sing kagandhè
'unwatchthispage' => 'Batalna olèhé ngawasi kaca iki',
'notanarticle' => 'Dudu kaca artikel',
'notvisiblerev' => 'Révisi wis dibusak',
-'watchnochange' => 'Ora ana kaca ing daftar pangawasan panjenengan sing diowahi ing mangsa wektu sing dipilih.',
'watchlist-details' => 'Ngawasaké {{PLURAL:$1|$1 kaca|$1 kaca}}, ora kalebu kaca-kaca dhiskusi.',
-'wlheader-enotif' => '* Notifikasi e-mail diaktifaké.',
-'wlheader-showupdated' => "* Kaca-kaca sing wis owah wiwit ditiliki panjenengan kaping pungkasan, dituduhaké mawa '''aksara kandel'''",
+'wlheader-enotif' => 'Notifikasi e-mail diaktifaké.',
+'wlheader-showupdated' => "Kaca-kaca sing wis owah wiwit ditiliki panjenengan kaping pungkasan, dituduhaké mawa '''aksara kandel'''",
'watchmethod-recent' => 'priksa daftar owah-owahan anyar kanggo kaca sing diawasi',
'watchmethod-list' => 'priksa kaca sing diawasi kanggo owah-owahan anyar',
'watchlistcontains' => 'Daftar pangawasan panjenengan isiné ana $1 {{PLURAL:$1|kaca|kaca}}.',
@@ -2431,12 +2396,9 @@ Mangga mirsani [[Special:BlockList|daftar panganggo sing diblokir]] kanggo dafta
'ipb_blocked_as_range' => 'Kaluputan: IP $1 ora diblokir sacara langsung lan ora bisa dijabel blokiré. IP $1 diblokir mawa bagéyan saka pamblokiran kelompok IP $2, sing bisa dijabel pamblokirané.',
'ip_range_invalid' => 'Blok IP ora absah.',
'ip_range_toolarge' => 'Jangkahé blokiran luwih gedhé saka /$1 ora dililakaké.',
-'blockme' => 'Blokiren aku',
'proxyblocker' => 'Pamblokir proxy',
-'proxyblocker-disabled' => 'Fungsi iki saiki lagi dipatèni.',
'proxyblockreason' => "Alamat IP panjenengan wis diblokir amerga alamat IP panjenengan iku ''open proxy''.
Mangga ngubungi sing nyedyakaké dines internèt panjenengan utawa pitulungan tèknis lan aturana masalah kaamanan sérius iki.",
-'proxyblocksuccess' => 'Bubar.',
'sorbsreason' => "Alamat IP panjenengan didaftar minangka ''open proxy'' ing DNSBL.",
'sorbs_create_account_reason' => "Alamat IP panjenengan didaftar minangka ''open proxy'' ing DNSBL. Panjenengan ora bisa nggawé akun utawa rékening.",
'cant-block-while-blocked' => 'Panjenengan ora bisa mblokir panganggo liya nalika panjenengan dhéwé pinuju diblokir.',
@@ -2919,7 +2881,7 @@ Pranala-pranala sabanjuré ing baris sing padha dianggep minangka ''pengecualian
* gpslongitude
* gpsaltitude',
-# EXIF tags
+# Exif tags
'exif-imagewidth' => 'Jembar',
'exif-imagelength' => 'Dhuwur',
'exif-bitspersample' => 'Bit per komponèn',
@@ -3097,7 +3059,7 @@ Pranala-pranala sabanjuré ing baris sing padha dianggep minangka ''pengecualian
'exif-originalimageheight' => 'Dhuwuré gambar sakdurungé dikethok',
'exif-originalimagewidth' => 'Jembaré gambar sakdurungé dikethok',
-# EXIF attributes
+# Exif attributes
'exif-compression-1' => 'Ora dikomprèsi',
'exif-compression-2' => 'CCITT Group 3 1-Dimensional Modified Huffman RLE',
'exif-compression-3' => 'CCITT Group 3 fax encoding',
@@ -3475,7 +3437,6 @@ Panjenengan uga bisa [[Special:EditWatchlist|nganggo éditor standar panjenengan
'version-other' => 'Liyané',
'version-mediahandlers' => 'Pananganan média',
'version-hooks' => 'Canthèlan-canthèlan',
-'version-extension-functions' => 'Fungsi-fungsi èkstènsi',
'version-parser-extensiontags' => 'Rambu èkstènsi parser',
'version-parser-function-hooks' => 'Canthèlan fungsi parser',
'version-hook-name' => 'Jeneng canthèlan',
@@ -3497,13 +3458,6 @@ Anda seharusnya telah menerima [{{SERVER}}{{SCRIPTPATH}}/COPYING salinan Lisensi
'version-entrypoints-header-entrypoint' => 'Tithik lebon',
'version-entrypoints-header-url' => 'URL',
-# Special:FilePath
-'filepath' => 'Lokasi berkas',
-'filepath-page' => 'Berkas:',
-'filepath-submit' => 'Golèk',
-'filepath-summary' => 'Kaca astaméwa utawa kusus iki nuduhaké jalur pepak sawijining berkas.
-Gambar dituduhaké mawa résolusi kebak lan tipe liyané berkas bakal dibuka langsung mawa program kagandhèng.',
-
# Special:FileDuplicateSearch
'fileduplicatesearch' => 'Golèk berkas duplikat',
'fileduplicatesearch-summary' => 'Golèk duplikat berkas adhedhasar biji hash-é.',
diff --git a/languages/messages/MessagesKa.php b/languages/messages/MessagesKa.php
index 95663f36..18dd6be8 100644
--- a/languages/messages/MessagesKa.php
+++ b/languages/messages/MessagesKa.php
@@ -17,6 +17,7 @@
* @author Kaganer
* @author MIKHEIL
* @author Malafaya
+ * @author Nemo bis
* @author Nodar Kherkheulidze
* @author Reedy
* @author Sopho
@@ -198,9 +199,6 @@ $messages = array(
'tog-shownumberswatching' => 'მáƒáƒ™áƒáƒœáƒ¢áƒ áƒáƒšáƒ”ბელ მáƒáƒ›áƒ®áƒ›áƒáƒ áƒ”ბელთრრიცხვის ჩვენებáƒ',
'tog-oldsig' => 'áƒáƒ áƒ¡áƒ”ბული ხელმáƒáƒ¬áƒ”რáƒ:',
'tog-fancysig' => 'სáƒáƒ™áƒ£áƒ—áƒáƒ áƒ˜ ვიკიფáƒáƒ áƒ›áƒáƒ¢áƒ˜áƒáƒœáƒ˜ ხელმáƒáƒ¬áƒ”რრ(áƒáƒ•áƒ¢áƒáƒ›áƒáƒ¢áƒ£áƒ áƒ˜ ბმულის გáƒáƒ áƒ”შე)',
-'tog-externaleditor' => 'გáƒáƒ›áƒáƒ˜áƒ§áƒ”ნეთ გáƒáƒ áƒ” რედáƒáƒ¥áƒ¢áƒáƒ áƒ˜ სტáƒáƒœáƒ“áƒáƒ áƒ¢áƒ£áƒšáƒ˜ ფáƒáƒ áƒ›áƒ˜áƒ— (მხáƒáƒšáƒáƒ“ ექსპერტებისთვის, მáƒáƒ˜áƒ—ხáƒáƒ•áƒ¡ სპეციáƒáƒšáƒ£áƒ  კáƒáƒœáƒ¤áƒ˜áƒ’ურáƒáƒªáƒ˜áƒáƒ¡ თქვენს კáƒáƒ›áƒžáƒ˜áƒ£áƒ¢áƒ”რში. [//www.mediawiki.org/wiki/Manual:External_editors ვრცლáƒáƒ“.])',
-'tog-externaldiff' => 'გáƒáƒ›áƒáƒ˜áƒ§áƒ”ნეთ გáƒáƒ áƒ” გáƒáƒœáƒ¡áƒ®áƒ•áƒáƒ•áƒ”ბრსტáƒáƒœáƒ“áƒáƒ áƒ¢áƒ£áƒšáƒ˜ ფáƒáƒ áƒ›áƒ˜áƒ— (მხáƒáƒšáƒáƒ“ ექსპერტთáƒáƒ—ვის, მáƒáƒ˜áƒ—ხáƒáƒ•áƒ¡ სპეციáƒáƒšáƒ£áƒ  კáƒáƒœáƒ¤áƒ˜áƒ’ურáƒáƒªáƒ˜áƒáƒ¡ თქვენს კáƒáƒ›áƒžáƒ˜áƒ£áƒ¢áƒ”რში. [//www.mediawiki.org/wiki/Manual:External_editors ვრცლáƒáƒ“.])',
-'tog-showjumplinks' => 'დáƒáƒ›áƒ®áƒ›áƒáƒ áƒ” ბმულების „გáƒáƒ“áƒáƒ¡áƒ•áƒšáƒ-კენ“ ჩáƒáƒ áƒ—ვáƒ',
'tog-uselivepreview' => 'გáƒáƒ›áƒáƒ˜áƒ§áƒ”ნეთ სწრáƒáƒ¤áƒ˜ წინáƒáƒ¡áƒ¬áƒáƒ áƒ˜ გáƒáƒ“áƒáƒ®áƒ”დვრ(ექსპერიმენტული)',
'tog-forceeditsummary' => 'გáƒáƒ›áƒáƒ¤áƒ áƒ—ხილე ცáƒáƒ áƒ˜áƒ”ლი რედáƒáƒ¥áƒ¢áƒ˜áƒ áƒ”ბის რეზიუმეს შემთხვევáƒáƒ¨áƒ˜',
'tog-watchlisthideown' => 'დáƒáƒ›áƒáƒšáƒ” ჩემი რედáƒáƒ¥áƒ¢áƒ˜áƒ áƒ”ბრკáƒáƒœáƒ¢áƒ áƒáƒšáƒ˜áƒ¡ სიáƒáƒ¨áƒ˜',
@@ -214,6 +212,8 @@ $messages = array(
'tog-showhiddencats' => 'დáƒáƒ›áƒáƒšáƒ£áƒšáƒ˜ კáƒáƒ¢áƒ”გáƒáƒ áƒ˜áƒ”ბის ჩვენებáƒ',
'tog-noconvertlink' => 'სáƒáƒ—áƒáƒ£áƒ áƒ˜áƒ¡ გáƒáƒ áƒ“áƒáƒ¥áƒ›áƒœáƒ˜áƒ¡ ბმულის გáƒáƒ›áƒáƒ áƒ—ვáƒ',
'tog-norollbackdiff' => 'გáƒáƒ£áƒ¥áƒ›áƒ”ბისáƒáƒ¡ გáƒáƒ›áƒáƒ¢áƒáƒ•áƒ”თ ცვლილებáƒáƒ—რგáƒáƒœáƒ¡áƒ®áƒ•áƒáƒ•áƒ”ბáƒ',
+'tog-useeditwarning' => 'გáƒáƒ›áƒáƒ¤áƒ áƒ—ხილე, რáƒáƒ“ესáƒáƒª დáƒáƒ•áƒ¢áƒáƒ•áƒ”ბ რედáƒáƒ¥áƒ¢áƒ˜áƒ áƒ”ბáƒáƒ“ გვერდს, დáƒáƒ£áƒ›áƒáƒ®áƒ¡áƒáƒ•áƒ áƒ”ბელი ცვლილებებით',
+'tog-prefershttps' => 'უსáƒáƒ¤áƒ áƒ—ხრკáƒáƒ•áƒ¨áƒ˜áƒ áƒ˜áƒ¡ მუდáƒáƒ› გáƒáƒ›áƒáƒ§áƒ”ნებრáƒáƒ•áƒ¢áƒáƒ áƒ˜áƒ–áƒáƒªáƒ˜áƒ˜áƒ¡ შემდეგ',
'underline-always' => 'მუდáƒáƒ›',
'underline-never' => 'áƒáƒ áƒáƒ¡áƒ“რáƒáƒ¡',
@@ -277,6 +277,18 @@ $messages = array(
'oct' => 'áƒáƒ¥áƒ¢',
'nov' => 'ნáƒáƒ”',
'dec' => 'დეკ',
+'january-date' => '$1 იáƒáƒœáƒ•áƒáƒ áƒ˜',
+'february-date' => '$1 თებერვáƒáƒšáƒ˜',
+'march-date' => '$1 მáƒáƒ áƒ¢áƒ˜',
+'april-date' => '$1 áƒáƒžáƒ áƒ˜áƒšáƒ˜',
+'may-date' => '$1 მáƒáƒ˜áƒ¡áƒ˜',
+'june-date' => '$1 ივნისი',
+'july-date' => '$1 ივლისი',
+'august-date' => '$1 áƒáƒ’ვისტáƒ',
+'september-date' => '$1 სექტემბერი',
+'october-date' => '$1 áƒáƒ¥áƒ¢áƒáƒ›áƒ‘ერი',
+'november-date' => '$1 ნáƒáƒ”მბერი',
+'december-date' => '$1 დეკემბერი',
# Categories related messages
'pagecategories' => '{{PLURAL:$1|კáƒáƒ¢áƒ”გáƒáƒ áƒ˜áƒ|კáƒáƒ¢áƒ”გáƒáƒ áƒ˜áƒ”ბი}}',
@@ -298,7 +310,7 @@ $messages = array(
'broken-file-category' => 'გვერდები ფáƒáƒ˜áƒšáƒ”ბის áƒáƒ áƒáƒ¡áƒ¬áƒáƒ áƒ˜ ბმულებით',
'categoryviewer-pagedlinks' => '($1) ($2)',
-'linkprefix' => '/^(.*?)([a-zA-Z\\x80-\\xff]+)$/sD',
+'linkprefix' => '/^((?>.*(?<![a-zA-Z\\x80-\\xff])))(.+)$/sD',
'about' => 'შესáƒáƒ®áƒ”ბ',
'article' => 'სტáƒáƒ¢áƒ˜áƒ',
@@ -361,6 +373,7 @@ $messages = array(
'create-this-page' => 'áƒáƒ› გვერდის შექმნáƒ',
'delete' => 'წáƒáƒ¨áƒšáƒ',
'deletethispage' => 'გვერდის წáƒáƒ¨áƒšáƒ',
+'undeletethispage' => 'áƒáƒ› გვერდის áƒáƒ¦áƒ“გენáƒ',
'undelete_short' => 'გáƒáƒáƒ£áƒ¥áƒ›áƒ” წáƒáƒ¨áƒšáƒ {{PLURAL:$1|ერთი რედáƒáƒ¥áƒ¢áƒ˜áƒ áƒ”ბáƒ|$1 რედáƒáƒ¥áƒ¢áƒ˜áƒ áƒ”ბáƒ}}',
'viewdeleted_short' => '{{PLURAL:$1|წáƒáƒ¨áƒšáƒ˜áƒšáƒ˜ რედáƒáƒ¥áƒ¢áƒ˜áƒ áƒ”ბის|$1 წáƒáƒ¨áƒšáƒ˜áƒšáƒ˜ რედáƒáƒ¥áƒ¢áƒ˜áƒ áƒ”ბების}} ხილვáƒ',
'protect' => 'დáƒáƒ‘ლáƒáƒ™áƒ”',
@@ -404,7 +417,7 @@ $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).
+# 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).
'aboutsite' => '{{SITENAME}}-ის შესáƒáƒ®áƒ”ბ',
'aboutpage' => 'Project:შესáƒáƒ®áƒ”ბ',
'copyright' => 'შინáƒáƒáƒ áƒ¡áƒ˜ წáƒáƒ áƒ›áƒáƒ“გენილირ$1 პირáƒáƒ‘ებით.',
@@ -414,7 +427,6 @@ $1',
'disclaimers' => 'პáƒáƒ¡áƒ£áƒ®áƒ˜áƒ¡áƒ›áƒ’ებლáƒáƒ‘ის მáƒáƒ®áƒ¡áƒœáƒ',
'disclaimerpage' => 'Project:პáƒáƒ¡áƒ£áƒ®áƒ˜áƒ¡áƒ›áƒ’ებლáƒáƒ‘ის უáƒáƒ áƒ§áƒáƒ¤áƒ',
'edithelp' => 'დáƒáƒ®áƒ›áƒáƒ áƒ”ბáƒ',
-'edithelppage' => 'Help:ტექსტის რედáƒáƒ¥áƒ¢áƒ˜áƒ áƒ”ბრ(მáƒáƒ áƒ¢áƒ˜áƒ•áƒ˜)',
'helppage' => 'Help:დáƒáƒ®áƒ›áƒáƒ áƒ”ბáƒ',
'mainpage' => 'მთáƒáƒ•áƒáƒ áƒ˜ გვერდი',
'mainpage-description' => 'მთáƒáƒ•áƒáƒ áƒ˜ გვერდი',
@@ -445,7 +457,6 @@ $1',
'newmessagesdifflinkplural' => 'ბáƒáƒšáƒ {{PLURAL:$1|ცვლილებáƒ|ცვლილებáƒ}}',
'youhavenewmessagesmulti' => 'თქვენ გáƒáƒ¥áƒ•áƒ— áƒáƒ®áƒáƒšáƒ˜ შეტყáƒáƒ‘ინებრ$1-ზე',
'editsection' => 'რედáƒáƒ¥áƒ¢áƒ˜áƒ áƒ”ბáƒ',
-'editsection-brackets' => '[$1]',
'editold' => 'რედáƒáƒ¥áƒ¢áƒ˜áƒ áƒ”ბáƒ',
'viewsourceold' => 'წყáƒáƒ áƒáƒ¡ ჩვენებáƒ',
'editlink' => 'რედáƒáƒ¥áƒ¢áƒ˜áƒ áƒ”ბáƒ',
@@ -497,17 +508,9 @@ $1',
# General errors
'error' => 'შეცდáƒáƒ›áƒ',
'databaseerror' => 'შეცდáƒáƒ›áƒ მáƒáƒœáƒáƒªáƒ”მთრბáƒáƒ–áƒáƒ¨áƒ˜',
-'dberrortext' => 'áƒáƒ¦áƒ›áƒáƒ©áƒ”ნილირსინტáƒáƒ¥áƒ¡áƒ£áƒ áƒ˜ შეცდáƒáƒ›áƒ მáƒáƒœáƒáƒªáƒ”მთრბáƒáƒ–áƒáƒ¡áƒ—áƒáƒœ დáƒáƒ™áƒáƒ•áƒ¨áƒ˜áƒ áƒ”ბისáƒáƒ¡
-შესáƒáƒ«áƒšáƒáƒ ეს áƒáƒ áƒ˜áƒ¡ შეცდáƒáƒ›áƒ პრáƒáƒ’რáƒáƒ›áƒ£áƒš უზრუნველყáƒáƒ¤áƒáƒ¨áƒ˜,
-ბáƒáƒšáƒ დáƒáƒ™áƒáƒ•áƒ¨áƒ˜áƒ áƒ”ბრმáƒáƒœáƒáƒªáƒ”მთრბáƒáƒ–áƒáƒ¡áƒáƒœ
-<blockquote><code>$1</code></blockquote>
-მáƒáƒ®áƒ“რფუნქციიდáƒáƒœ „<code>$2</code>“.
-მáƒáƒœáƒáƒªáƒ”მთრბáƒáƒ–áƒáƒ› დáƒáƒáƒ‘რუნრშეცდáƒáƒ›áƒ „<samp>$3: $4</samp>“.',
-'dberrortextcl' => 'მáƒáƒœáƒáƒªáƒ”მთრბáƒáƒ–áƒáƒ¡áƒ—áƒáƒœ დáƒáƒ™áƒáƒ•áƒ¨áƒ˜áƒ áƒ”ბისáƒáƒ¡ áƒáƒ¦áƒ›áƒáƒ©áƒ”ნილირსინტქსური შეცდáƒáƒ›áƒ.
-სáƒáƒ‘áƒáƒšáƒáƒ დáƒáƒ™áƒáƒ•áƒ¨áƒ˜áƒ áƒ”ბრმáƒáƒ®áƒ“áƒ:
-„$1“
-მáƒáƒ®áƒ“ენილ იქნრფუნქციიდáƒáƒœ „$2“.
-მáƒáƒœáƒáƒªáƒ”მთრბáƒáƒ–áƒáƒ› დáƒáƒáƒ‘რუნრშეცდáƒáƒ›áƒ „$3: $4“.',
+'databaseerror-query' => 'მáƒáƒ—ხáƒáƒ•áƒœáƒ: $1',
+'databaseerror-function' => 'ფუნქციáƒ: $1',
+'databaseerror-error' => 'შეცდáƒáƒ›áƒ: $1',
'laggedslavemode' => 'ყურáƒáƒ“ღებáƒ: გვერდი შესáƒáƒ«áƒšáƒáƒ áƒáƒ  შეიცáƒáƒ•áƒ“ეს ბáƒáƒšáƒ ცვლილებებს.',
'readonly' => 'მáƒáƒœáƒáƒªáƒ”მთრბáƒáƒ–რდáƒáƒ®áƒ£áƒ áƒ£áƒšáƒ˜áƒ',
'enterlockreason' => 'მიუთიეთ ბლáƒáƒ™áƒ˜áƒ áƒ”ბის მიზეზი დრხáƒáƒœáƒ’რძლივáƒáƒ‘ის ვáƒáƒ“áƒ',
@@ -561,12 +564,13 @@ $1',
'editinginterface' => "'''ყურáƒáƒ“ღებáƒ:''' თქვენ რედáƒáƒ¥áƒ¢áƒáƒ áƒáƒ‘თ გვერდს, რáƒáƒ›áƒ”ლიც პრáƒáƒ’რáƒáƒ›áƒ˜áƒ¡ ინტერფეისის ტექსტს შეიცáƒáƒ•áƒ¡.
áƒáƒ› გვერდზე გáƒáƒœáƒ®áƒáƒ áƒªáƒ˜áƒ”ლებული რედáƒáƒ¥áƒ¢áƒ˜áƒ áƒ”ბრგáƒáƒ›áƒáƒ˜áƒ¬áƒ•áƒ”ვს áƒáƒ› ვიკის სხვრმáƒáƒ›áƒ®áƒ›áƒáƒ áƒ”ბელთრსáƒáƒ›áƒ£áƒ¨áƒáƒ ინტერფეისის შეცვლáƒáƒ¡áƒáƒª.
იმისáƒáƒ—ვის, რáƒáƒ› დáƒáƒáƒ›áƒáƒ¢áƒáƒ— áƒáƒœ შეცვáƒáƒšáƒáƒ— თáƒáƒ áƒ’მáƒáƒœáƒ”ბი ყველრვიკიში გთხáƒáƒ•áƒ—, გáƒáƒ›áƒáƒ˜áƒ§áƒ”ნáƒáƒ— მედიáƒáƒ•áƒ˜áƒ™áƒ˜áƒ¡ ლáƒáƒ™áƒáƒšáƒ˜áƒ–áƒáƒªáƒ˜áƒ˜áƒ¡ პრáƒáƒ”ქტი [//translatewiki.net/ translatewiki.net].",
-'sqlhidden' => '(SQL მáƒáƒ—ხáƒáƒ•áƒœáƒ გáƒáƒ£áƒ¥áƒ›áƒ”ბულიáƒ)',
'cascadeprotected' => 'ეს გვერდი რედáƒáƒ¥áƒ¢áƒ˜áƒ áƒ”ბისგáƒáƒœ დáƒáƒªáƒ£áƒšáƒ˜áƒ, რáƒáƒ“გáƒáƒœ იგი ჩáƒáƒ áƒ—ულირშემდეგ {{PLURAL:$1|გვერდში, რáƒáƒ›áƒšáƒ˜áƒ¡ |გვერდებში, რáƒáƒ›áƒ”ლთáƒ}} დáƒáƒ¡áƒáƒªáƒáƒ•áƒáƒ“áƒáƒª ჩáƒáƒ áƒ—ულირპáƒáƒ áƒáƒ›áƒ”ტრი "იერáƒáƒ áƒ¥áƒ˜áƒ£áƒšáƒ˜":
$2',
'namespaceprotected' => "თქვენ áƒáƒ  გáƒáƒ¥áƒ•áƒ— '''$1''' სáƒáƒ®áƒ”ლთრსივრცეში გვერდების რედáƒáƒ¥áƒ¢áƒ˜áƒ áƒ”ბის უფლებáƒ.",
'customcssprotected' => 'თქვენ áƒáƒ  გáƒáƒ¥áƒ•áƒ— áƒáƒ› CSS გვერდის რედáƒáƒ¥áƒ¢áƒ˜áƒ áƒ”ბის უფლებáƒ, ვინáƒáƒ˜áƒ“áƒáƒœ ის სხვრმáƒáƒ›áƒ®áƒ›áƒáƒ áƒ”ბლის პირáƒáƒ“ კáƒáƒœáƒ¤áƒ˜áƒ’ურáƒáƒªáƒ˜áƒáƒ¡ შეიცáƒáƒ•áƒ¡.',
'customjsprotected' => 'თქვენ áƒáƒ  გáƒáƒ¥áƒ•áƒ— áƒáƒ› JavaScript გვერდის რედáƒáƒ¥áƒ¢áƒ˜áƒ áƒ”ბის უფლებáƒ, ვინáƒáƒ˜áƒ“áƒáƒœ ის სხვრმáƒáƒ›áƒ®áƒ›áƒáƒ áƒ”ბლის პირáƒáƒ“ კáƒáƒœáƒ¤áƒ˜áƒ’ურáƒáƒªáƒ˜áƒáƒ¡ შეიცáƒáƒ•áƒ¡.',
+'mycustomcssprotected' => 'თქვენ áƒáƒ  გáƒáƒ¥áƒ•áƒ— áƒáƒ› CSS-გვერდის რედáƒáƒ¥áƒ¢áƒ˜áƒ áƒ”ბის უფლებáƒ.',
+'mycustomjsprotected' => 'თქვენ áƒáƒ  გáƒáƒ¥áƒ•áƒ— áƒáƒ› JavaScript-გვერდის რედáƒáƒ¥áƒ¢áƒ˜áƒ áƒ”ბის უფლებáƒ.',
'ns-specialprotected' => 'გვერდების რედáƒáƒ¥áƒ¢áƒ˜áƒ áƒ”ბრსáƒáƒ®áƒ”ლთრსივრცეში {{ns:special}} შეუძლებელიáƒ.',
'titleprotected' => "შემდეგი გვერდის შექმნრáƒáƒ™áƒ áƒ«áƒáƒšáƒ£áƒšáƒ˜áƒ მáƒáƒ›áƒ®áƒ›áƒáƒ áƒ”ბელ [[User:$1|$1]]-ს მიერ.
მáƒáƒªáƒ”მულირშემდეგი áƒáƒ®áƒ¡áƒœáƒ: „''$2''“.",
@@ -593,10 +597,19 @@ $2',
'welcomecreation-msg' => 'თქვენი áƒáƒœáƒ’áƒáƒ áƒ˜áƒ¨áƒ˜ შექმნილიáƒ.
áƒáƒ  დáƒáƒ’áƒáƒ•áƒ˜áƒ¬áƒ§áƒ“ეთ თქვენი [[Special:Preferences|{{SITENAME}}-ის კáƒáƒœáƒ¤áƒ˜áƒ’ურáƒáƒªáƒ˜áƒ˜áƒ¡]] შეცვლáƒ.',
'yourname' => 'მáƒáƒ›áƒ®áƒ›áƒáƒ áƒ”ბელი:',
+'userlogin-yourname' => 'მáƒáƒ›áƒ®áƒ›áƒáƒ áƒ”ბლის სáƒáƒ®áƒ”ლი',
+'userlogin-yourname-ph' => 'შეიყვáƒáƒœáƒ”თ თქვენი მáƒáƒ›áƒ®áƒ›áƒáƒ áƒ”ბლის სáƒáƒ®áƒ”ლი',
+'createacct-another-username-ph' => 'შეიყვáƒáƒœáƒ”თ მáƒáƒ›áƒ®áƒ›áƒáƒ áƒ”ბლის სáƒáƒ®áƒ”ლი',
'yourpassword' => 'პáƒáƒ áƒáƒšáƒ˜:',
+'userlogin-yourpassword' => 'პáƒáƒ áƒáƒšáƒ˜',
+'userlogin-yourpassword-ph' => 'შეიყვáƒáƒœáƒ”თ თქვენი პáƒáƒ áƒáƒšáƒ˜',
+'createacct-yourpassword-ph' => 'შეიყვáƒáƒœáƒ”თ პáƒáƒ áƒáƒšáƒ˜',
'yourpasswordagain' => 'ხელმეáƒáƒ áƒ”დ შეიყვáƒáƒœáƒ”თ პáƒáƒ áƒáƒšáƒ˜',
+'createacct-yourpasswordagain' => 'დáƒáƒáƒ“áƒáƒ¡áƒ¢áƒ£áƒ áƒ”თ პáƒáƒ áƒáƒšáƒ˜',
+'createacct-yourpasswordagain-ph' => 'ხელმეáƒáƒ áƒ”დ შეიყვáƒáƒœáƒ”თ პáƒáƒ áƒáƒšáƒ˜',
'remembermypassword' => 'დáƒáƒ›áƒ˜áƒ›áƒáƒ®áƒ¡áƒáƒ•áƒ áƒ” áƒáƒ› კáƒáƒ›áƒžáƒ˜áƒ£áƒ¢áƒ”რზე (მáƒáƒ¥áƒ¡áƒ˜áƒ›áƒ£áƒ› $1 {{PLURAL:$1|დღე}})',
-'securelogin-stick-https' => 'გáƒáƒáƒ’რძელეთ კáƒáƒ•áƒ¨áƒ˜áƒ áƒ˜ HTTPS-თáƒáƒœ შესვლის შემდეგ',
+'userlogin-remembermypassword' => 'დáƒáƒ›áƒ˜áƒ›áƒáƒ®áƒ¡áƒáƒ•áƒ áƒ”',
+'userlogin-signwithsecure' => 'უსáƒáƒ¤áƒ áƒ—ხრკáƒáƒ•áƒ¨áƒ˜áƒ áƒ˜áƒ¡ გáƒáƒ›áƒáƒ§áƒ”ნებáƒ',
'yourdomainname' => 'თქვენი დáƒáƒ›áƒ”ნი',
'password-change-forbidden' => 'თქვენ áƒáƒ  შეგიძლიáƒáƒ— áƒáƒ› ვიკიში პáƒáƒ áƒáƒšáƒ˜áƒ¡ შეცვლáƒ.',
'externaldberror' => 'სáƒáƒ’áƒáƒ áƒ”რმáƒáƒœáƒáƒªáƒ”მთრბáƒáƒ–áƒáƒ¨áƒ˜ áƒáƒ£áƒ¢áƒ”ნტიფიკáƒáƒªáƒ˜áƒ˜áƒ¡ შეცდáƒáƒ›áƒáƒ, áƒáƒœ თქვენ áƒáƒ  გáƒáƒ¥áƒ•áƒ— სáƒáƒ™áƒ›áƒáƒ áƒ˜áƒ¡áƒ˜ უფლებები სáƒáƒ’áƒáƒ áƒ”რáƒáƒœáƒ’áƒáƒ áƒ˜áƒ¨áƒ¨áƒ˜ ცვლილებების შესáƒáƒ¢áƒáƒœáƒáƒ“.',
@@ -608,18 +621,40 @@ $2',
'logout' => 'გáƒáƒ¡áƒ•áƒšáƒ',
'userlogout' => 'გáƒáƒ¡áƒ•áƒšáƒ',
'notloggedin' => 'შესული áƒáƒ  ხáƒáƒ áƒ—',
+'userlogin-noaccount' => 'áƒáƒ  გáƒáƒ¥áƒ•áƒ— áƒáƒœáƒ’áƒáƒ áƒ˜áƒ¨áƒ˜?',
+'userlogin-joinproject' => 'შეუერთდით პრáƒáƒ”ქტს {{SITENAME}}',
'nologin' => "ჯერ áƒáƒ  ხáƒáƒ áƒ— რეგისტრირებული? '''$1'''.",
'nologinlink' => 'გáƒáƒ®áƒ¡áƒ”ნით áƒáƒœáƒ’áƒáƒ áƒ˜áƒ¨áƒ˜',
'createaccount' => 'გáƒáƒ®áƒ¡áƒ”ნი áƒáƒœáƒ’áƒáƒ áƒ˜áƒ¨áƒ˜',
'gotaccount' => "უკვე რეგისტრირებული ხáƒáƒ áƒ—? '''$1'''",
'gotaccountlink' => 'შესვლáƒ',
'userlogin-resetlink' => 'áƒáƒ•áƒ¢áƒáƒ áƒ˜áƒ–áƒáƒªáƒ˜áƒ˜áƒ¡ მáƒáƒœáƒáƒªáƒ”მები დáƒáƒ’áƒáƒ•áƒ˜áƒ¬áƒ§áƒ“áƒáƒ—?',
+'userlogin-resetpassword-link' => 'პáƒáƒ áƒáƒšáƒ˜áƒ¡ მáƒáƒªáƒ˜áƒšáƒ”ბáƒ',
+'helplogin-url' => 'Help:შესვლáƒ',
+'userlogin-helplink' => '[[{{MediaWiki:helplogin-url}}|დáƒáƒ®áƒ›áƒáƒ áƒ”ბრსისტემáƒáƒ¨áƒ˜ შესáƒáƒ¡áƒ•áƒšáƒ”ლáƒáƒ“]]',
+'createacct-join' => 'ქვემáƒáƒ— მიუთითეთ ინფáƒáƒ áƒ›áƒáƒªáƒ˜áƒ თქვენ შესáƒáƒ®áƒ”ბ.',
+'createacct-emailrequired' => 'ელ. ფáƒáƒ¡áƒ¢áƒ˜áƒ¡ მისáƒáƒ›áƒáƒ áƒ—ი',
+'createacct-emailoptional' => 'ელ. ფáƒáƒ¡áƒ¢áƒ˜áƒ¡ მისáƒáƒ›áƒáƒ áƒ—ი (áƒáƒ áƒáƒ¡áƒáƒ•áƒáƒšáƒ“ებულáƒ)',
+'createacct-email-ph' => 'შეიყვáƒáƒœáƒ”თ თქვენი ელ. ფáƒáƒ¡áƒ¢áƒ˜áƒ¡ მისáƒáƒ›áƒáƒ áƒ—ი',
+'createacct-another-email-ph' => 'შეიყვáƒáƒœáƒ”თ ელ.ფáƒáƒ¡áƒ¢áƒ˜áƒ¡ მისáƒáƒ›áƒáƒ áƒ—ი',
'createaccountmail' => 'გáƒáƒ›áƒáƒ˜áƒ§áƒ”ნეთ შემთხვევითáƒáƒ‘ის მეთáƒáƒ“ით შერჩეული დრáƒáƒ”ბითი პáƒáƒ áƒáƒšáƒ˜ დრმისი გáƒáƒ’ზáƒáƒ•áƒœáƒ ქვემáƒáƒ— მითითებულ ელ. ფáƒáƒ¡áƒ¢áƒ˜áƒ¡ მისáƒáƒ›áƒáƒ áƒ—ზე:',
+'createacct-realname' => 'ნáƒáƒ›áƒ“ვილი სáƒáƒ®áƒ”ლი (áƒáƒ áƒáƒáƒ£áƒªáƒ˜áƒšáƒ”ბელი)',
'createaccountreason' => 'მიზეზი:',
+'createacct-reason' => 'მიზეზი',
+'createacct-reason-ph' => 'რáƒáƒ¢áƒáƒ› ქმნით áƒáƒ®áƒáƒš áƒáƒœáƒ’áƒáƒ áƒ˜áƒ¨áƒ¡?',
+'createacct-captcha' => 'უსáƒáƒ¤áƒ áƒ—ხáƒáƒ”ბის შემáƒáƒ¬áƒ›áƒ”ბáƒ',
+'createacct-imgcaptcha-ph' => 'შეიყვáƒáƒœáƒ”თ ზემáƒáƒ— მáƒáƒªáƒ”მული ტექსტი',
+'createacct-submit' => 'შექმენით თქვენი áƒáƒœáƒ’áƒáƒ áƒ˜áƒ¨áƒ˜',
+'createacct-another-submit' => 'სხვრáƒáƒœáƒ’áƒáƒ áƒ˜áƒ¨áƒ˜áƒ¡ შექმნáƒ',
+'createacct-benefit-heading' => '{{SITENAME}} შექმნილირთქვენნáƒáƒ˜áƒ áƒ˜ áƒáƒ“áƒáƒ›áƒ˜áƒáƒœáƒ”ბის მიერ.',
+'createacct-benefit-body1' => '{{PLURAL:$1|რედáƒáƒ¥áƒ¢áƒ˜áƒ áƒ”ბáƒ|რედáƒáƒ¥áƒ¢áƒ˜áƒ áƒ”ბáƒ}}',
+'createacct-benefit-body2' => '{{PLURAL:$1|გვერდი|გვერდი}}',
+'createacct-benefit-body3' => 'ბáƒáƒšáƒ {{PLURAL:$1|მáƒáƒ›áƒ®áƒ›áƒáƒ áƒ”ბელი|მáƒáƒ›áƒ®áƒ›áƒáƒ áƒ”ბელი}}',
'badretype' => 'თქვენს მიერ შეყვáƒáƒœáƒ˜áƒšáƒ˜ პáƒáƒ áƒáƒšáƒ”ბი ერთმáƒáƒœáƒ”თს áƒáƒ  ემთხვევáƒ.',
'userexists' => 'ეს სáƒáƒ®áƒ”ლი უკვე გáƒáƒ›áƒáƒ§áƒ”ნებულიáƒ.
გთხáƒáƒ•áƒ—, áƒáƒ˜áƒ áƒ©áƒ˜áƒ”თ სხვáƒ.',
'loginerror' => 'შეცდáƒáƒ›áƒ შესვლáƒáƒ¨áƒ˜',
+'createacct-error' => 'áƒáƒœáƒ’áƒáƒ áƒ˜áƒ¨áƒ˜áƒ¡ შექმნის შეცდáƒáƒ›áƒ',
'createaccounterror' => '$1 áƒáƒœáƒ’áƒáƒ áƒ˜áƒ¨áƒ˜áƒ¡ შექმნრვერ მáƒáƒ®áƒ”რხდáƒ.',
'nocookiesnew' => 'მáƒáƒ›áƒ®áƒ›áƒáƒ áƒ”ბლის ჩáƒáƒœáƒáƒ¬áƒ”რი შექმნილიáƒ, მáƒáƒ’რáƒáƒ› თქვენ áƒáƒ  გáƒáƒ’ივლიáƒáƒ— რეგისტრáƒáƒªáƒ˜áƒ. {{SITENAME}} იყენებს cookies, რáƒáƒ›áƒšáƒ”ბიც თქვენს ბრáƒáƒ£áƒ–ერში გáƒáƒ—იშულიáƒ. გთხáƒáƒ•áƒ—, áƒáƒáƒ›áƒáƒ¥áƒ›áƒ”დáƒáƒ— ისინი დრშემდგáƒáƒ› ხელáƒáƒ®áƒšáƒ გáƒáƒ˜áƒáƒ áƒ”თ რეგისტრáƒáƒªáƒ˜áƒ.',
'nocookieslogin' => '{{SITENAME}} მáƒáƒ›áƒ®áƒ›áƒáƒ áƒ”ბლების შესვლისთვის იყენებს "ქუქის ჩáƒáƒœáƒáƒ¬áƒ”რს". თქვენ იგი გáƒáƒ—იშეთ. გთხáƒáƒ•áƒ—, ჩáƒáƒ áƒ—áƒáƒ— ისინი დრხელმეáƒáƒ áƒ”დ მáƒáƒ¡áƒ˜áƒœáƒ¯áƒáƒ—.',
@@ -700,8 +735,7 @@ $2',
'newpassword' => 'áƒáƒ®áƒáƒšáƒ˜ პáƒáƒ áƒáƒšáƒ˜:',
'retypenew' => 'áƒáƒ®áƒáƒšáƒ˜ პáƒáƒ áƒáƒšáƒ˜ გáƒáƒœáƒ›áƒ”áƒáƒ áƒ”ბით:',
'resetpass_submit' => 'მიუთითეთ პáƒáƒ áƒáƒšáƒ˜ დრდáƒáƒ áƒ”გისტრირდით',
-'resetpass_success' => 'თქვენი პáƒáƒ áƒáƒšáƒ˜ წáƒáƒ áƒ›áƒáƒ¢áƒ”ბით შეიცვáƒáƒšáƒ!
-მიმდინáƒáƒ áƒ”áƒáƒ‘ს სიტემáƒáƒ¨áƒ˜ შესვლáƒ...',
+'changepassword-success' => 'თქვენი პáƒáƒ áƒáƒšáƒ˜ წáƒáƒ áƒ›áƒáƒ¢áƒ”ბით შეიცვáƒáƒšáƒ! áƒáƒ›áƒŸáƒáƒ›áƒáƒ“ რეგისტრირდებით...',
'resetpass_forbidden' => 'პáƒáƒ áƒáƒšáƒ˜áƒ¡ შეცვლრშეუძლებელიáƒ',
'resetpass-no-info' => 'კáƒáƒœáƒ™áƒ áƒ”ტულáƒáƒ“ áƒáƒ› გვერდთáƒáƒœ სáƒáƒ›áƒ£áƒ¨áƒáƒáƒ“ თქვენ უნდრწáƒáƒ áƒáƒ“გინáƒáƒ— თáƒáƒ•áƒ˜ სისტემისáƒáƒ“მი.',
'resetpass-submit-loggedin' => 'პáƒáƒ áƒáƒšáƒ˜áƒ¡ შეცვლáƒ',
@@ -713,10 +747,11 @@ $2',
# Special:PasswordReset
'passwordreset' => 'პáƒáƒ áƒáƒšáƒ˜áƒ¡ áƒáƒ¦áƒ“გენáƒ',
-'passwordreset-text' => 'შეáƒáƒ•áƒ¡áƒ”თ ეს ფáƒáƒ áƒ›áƒ, რáƒáƒ—რკვლáƒáƒ• დáƒáƒáƒ§áƒ”ნáƒáƒ— თქვენი პáƒáƒ áƒáƒšáƒ˜.',
+'passwordreset-text-one' => 'შეáƒáƒ•áƒ¡áƒ”თ ეს ფáƒáƒ áƒ›áƒ, რáƒáƒ—რკვლáƒáƒ• დáƒáƒáƒ§áƒ”ნáƒáƒ— თქვენი პáƒáƒ áƒáƒšáƒ˜.',
+'passwordreset-text-many' => '{{PLURAL:$1|პáƒáƒ áƒáƒšáƒ˜áƒ¡ თáƒáƒ•áƒ˜áƒ“áƒáƒœ დáƒáƒ¡áƒáƒ§áƒ”ნებლáƒáƒ“ შეიყვáƒáƒœáƒ”თ მáƒáƒœáƒáƒªáƒ”მთრერთ-ერთი ნáƒáƒ¬áƒ˜áƒšáƒ˜.}}',
'passwordreset-legend' => 'პáƒáƒ áƒáƒšáƒ˜áƒ¡ áƒáƒ¦áƒ“გენáƒ',
'passwordreset-disabled' => 'áƒáƒ› ვიკიში პáƒáƒ áƒáƒšáƒ˜áƒ¡ კვლáƒáƒ• დáƒáƒ§áƒ”ნების ფუნქცირგáƒáƒ›áƒáƒ áƒ—ულიáƒ.',
-'passwordreset-pretext' => '{{PLURAL:$1||შეიყვáƒáƒœáƒ”თ ქვემáƒáƒ— მáƒáƒªáƒ”მულ მáƒáƒœáƒáƒªáƒ”მთრერთ-ერთი ნáƒáƒ¬áƒ˜áƒšáƒ˜.}}',
+'passwordreset-emaildisabled' => 'áƒáƒ› ვიკიში ელ.ფáƒáƒ¡áƒ¢áƒ˜áƒ¡ ფუნქციები გáƒáƒ›áƒáƒ áƒ—ულიáƒ.',
'passwordreset-username' => 'მáƒáƒ›áƒ®áƒ›áƒáƒ áƒ”ბლის სáƒáƒ®áƒ”ლი:',
'passwordreset-domain' => 'დáƒáƒ›áƒ”ნი:',
'passwordreset-capture' => 'გáƒáƒ›áƒáƒ¡áƒ£áƒšáƒ˜ ელ-ფáƒáƒ¡áƒ¢áƒ˜áƒ¡ ხილვáƒ?',
@@ -749,7 +784,7 @@ $2
დრáƒáƒ”ბითი პáƒáƒ áƒáƒšáƒ˜: $2',
'passwordreset-emailsent' => 'პáƒáƒ áƒáƒšáƒ˜áƒ¡ თáƒáƒ•áƒ˜áƒ“áƒáƒœ დáƒáƒ¡áƒáƒ§áƒ”ნებელი ელ.ფáƒáƒ¡áƒ¢áƒ გáƒáƒ˜áƒ’ზáƒáƒ•áƒœáƒ.',
'passwordreset-emailsent-capture' => 'ქვემáƒáƒ— ნáƒáƒ©áƒ•áƒ”ნები პáƒáƒ áƒáƒšáƒ˜áƒ¡ თáƒáƒ•áƒ˜áƒ“áƒáƒœ დáƒáƒ¡áƒáƒ§áƒ”ნებელი წერილი გáƒáƒ˜áƒ’ზáƒáƒ•áƒœáƒ.',
-'passwordreset-emailerror-capture' => 'ქვემáƒáƒ— მáƒáƒªáƒ”მულირშექმნილი შესáƒáƒ®áƒ¡áƒ”ნებელი წერილი, რáƒáƒ›áƒšáƒ˜áƒ¡ გáƒáƒ’ზáƒáƒ•áƒœáƒáƒª ვერ მáƒáƒ®áƒ”რხდáƒ: $1 გáƒáƒ›áƒ',
+'passwordreset-emailerror-capture' => 'ქვემáƒáƒ— მáƒáƒªáƒ”მულირშექმნილი პáƒáƒ áƒáƒšáƒ˜áƒ¡ დáƒáƒ¡áƒáƒ§áƒ”ნებელი წერილი, რáƒáƒ›áƒšáƒ˜áƒ¡ გáƒáƒ’ზáƒáƒ•áƒœáƒáƒª {{GENDER:$2|მáƒáƒ›áƒ®áƒ›áƒáƒ áƒ”ბელთáƒáƒœ}} ვერ მáƒáƒ®áƒ”რხდáƒ: $1 გáƒáƒ›áƒ',
# Special:ChangeEmail
'changeemail' => 'ელ-ფáƒáƒ¡áƒ¢áƒ˜áƒ¡ მისáƒáƒ›áƒáƒ áƒ—ის შეცვლáƒ',
@@ -763,6 +798,10 @@ $2
'changeemail-submit' => 'ელ-ფáƒáƒ¡áƒ¢áƒ˜áƒ¡ შეცვლáƒ',
'changeemail-cancel' => 'გáƒáƒ£áƒ¥áƒ›áƒ”ბáƒ',
+# Special:ResetTokens
+'resettokens-tokens' => 'ჟეტáƒáƒœáƒ”ბი:',
+'resettokens-token-label' => '$1 (მიმდინáƒáƒ áƒ” მნიშვნელáƒáƒ‘áƒ: $2)',
+
# Edit page toolbar
'bold_sample' => 'მუქი ტექსტი',
'bold_tip' => 'მუქი ტექსტი',
@@ -961,12 +1000,15 @@ $2
შესáƒáƒ«áƒšáƒáƒ, იგი წáƒáƒ˜áƒ¨áƒáƒšáƒ.',
'edit-conflict' => 'რედáƒáƒ¥áƒªáƒ˜áƒ”ბის კáƒáƒœáƒ¤áƒšáƒ˜áƒ¥áƒ¢áƒ˜.',
'edit-no-change' => 'თქვენი შესწáƒáƒ áƒ”ბრáƒáƒ  იქნრშენáƒáƒ®áƒ£áƒšáƒ˜, რáƒáƒ“გáƒáƒœáƒáƒª ტექსტის ცვლილებრáƒáƒ  მáƒáƒ®áƒ“áƒ.',
+'postedit-confirmation' => 'თქვენი რედáƒáƒ¥áƒ¢áƒ˜áƒ áƒ”ბრშენáƒáƒ®áƒ£áƒšáƒ˜áƒ.',
'edit-already-exists' => 'áƒáƒ®áƒáƒšáƒ˜ გვერდის შექმნრáƒáƒ  მáƒáƒ®áƒ”რხდáƒ.
ის უკვე áƒáƒ áƒ¡áƒ”ბáƒáƒ‘ს.',
'defaultmessagetext' => 'შეტყáƒáƒ‘ინების სტáƒáƒœáƒ“áƒáƒ áƒ¢áƒ£áƒšáƒ˜ ტექსტი',
'content-failed-to-parse' => '$2-ის შინáƒáƒáƒ áƒ¡áƒ˜ áƒáƒ  შეესáƒáƒ‘áƒáƒ›áƒ”ბრ$1-ის ტიპს: $3.',
'invalid-content-data' => 'დáƒáƒ£áƒ¨áƒ•áƒ”ბელი მáƒáƒœáƒáƒªáƒ”მები',
'content-not-allowed-here' => '„$1“-ის შინáƒáƒáƒ áƒ¡áƒ˜ დáƒáƒ£áƒ¨áƒ•áƒ”ბელირ[[$2]] გვერდზე',
+'editwarning-warning' => 'სხვრგვერდზე გáƒáƒ“áƒáƒ¡áƒ•áƒšáƒáƒ› შესáƒáƒ«áƒšáƒáƒ გáƒáƒ›áƒáƒ˜áƒ¬áƒ•áƒ˜áƒáƒ¡ ცვლილებების დáƒáƒ™áƒáƒ áƒ’ვáƒ.
+თუკი თქვენ დáƒáƒ áƒ”გისტრირებული ხáƒáƒ áƒ— სისტემáƒáƒ¨áƒ˜, მáƒáƒ¨áƒ˜áƒœ შეგიძლიáƒáƒ— გáƒáƒ›áƒáƒ áƒ—áƒáƒ— ეს გáƒáƒ¤áƒ áƒ—ხილებრთქვენი კáƒáƒœáƒ¤áƒ˜áƒ’ურáƒáƒªáƒ˜áƒ˜áƒ¡ გáƒáƒœáƒ§áƒáƒ¤áƒ˜áƒšáƒ”ბáƒáƒ¨áƒ˜ „რედáƒáƒ¥áƒ¢áƒ˜áƒ áƒ”ბáƒâ€œ .',
# Content models
'content-model-wikitext' => 'ვიკიტექსტი',
@@ -1180,6 +1222,7 @@ $1",
'compareselectedversions' => 'áƒáƒ áƒ©áƒ”ული ვერსიების შედáƒáƒ áƒ”ბáƒ',
'showhideselectedversions' => 'ჩვენებáƒ/დáƒáƒ›áƒáƒšáƒ•áƒ áƒáƒ áƒ©áƒ”ული ვერსიებისáƒ',
'editundo' => 'გáƒáƒ£áƒ¥áƒ›áƒ”ბáƒ',
+'diff-empty' => '(გáƒáƒœáƒ¡áƒ®áƒ•áƒáƒ•áƒ”ბრáƒáƒ  áƒáƒ áƒ˜áƒ¡)',
'diff-multi' => '({{PLURAL:$2|ერთი მáƒáƒ›áƒ®áƒ›áƒáƒ áƒ”ბლის|$2 მáƒáƒ›áƒ®áƒ›áƒáƒ áƒ”ბლების}} {{PLURAL:$1|ერთი შუáƒáƒšáƒ”დური ვერსიáƒ|$1 შუáƒáƒšáƒ”დური ვერსიები}} áƒáƒ  áƒáƒ áƒ˜áƒ¡ ნáƒáƒ©áƒ•áƒ”ნები.)',
'diff-multi-manyusers' => '({{PLURAL:$2|ერთი მáƒáƒ›áƒ®áƒ›áƒáƒ áƒ”ბლის|$2 მáƒáƒ›áƒ®áƒ›áƒáƒ áƒ”ბლების}} {{PLURAL:$1|ერთი შუáƒáƒšáƒ”დური ვერსიáƒ|$1 შუáƒáƒšáƒ”დური ვერსიები}}, რáƒáƒ›áƒšáƒ”ბიც áƒáƒ  áƒáƒ áƒ˜áƒ¡ ნáƒáƒ©áƒ•áƒ”ნები.)',
'difference-missing-revision' => '{{PLURAL:$2|$2 ვერსიáƒ}} áƒáƒ› შედáƒáƒ áƒ”ბისáƒáƒ—ვის ($1) {{PLURAL:$2|ვერ მáƒáƒ˜áƒ«áƒ”ბნáƒ}}.
@@ -1207,7 +1250,6 @@ $1",
'searchmenu-legend' => 'ძიების დáƒáƒ¬áƒ§áƒáƒ‘áƒ:',
'searchmenu-exists' => "'''áƒáƒ› ვიკიპრáƒáƒ”ქტში áƒáƒ áƒ˜áƒ¡ გვერდი „[[:$1]]“'''",
'searchmenu-new' => "'''შექმენით გვერდი „[[:$1]]“ áƒáƒ› ვიკიში!'''",
-'searchhelp-url' => 'Help:დáƒáƒ®áƒ›áƒáƒ áƒ”ბáƒ',
'searchmenu-prefix' => '[[Special:PrefixIndex/$1|áƒáƒ©áƒ•áƒ”ნეთ გვერდები áƒáƒ› პრეფიქსით]]',
'searchprofile-articles' => 'ძირითáƒáƒ“ი გვერდები',
'searchprofile-project' => 'დáƒáƒ®áƒ›áƒáƒ áƒ”ბის დრპრáƒáƒ”ქტის გვერდები',
@@ -1249,15 +1291,7 @@ $1",
'powersearch-togglenone' => 'áƒáƒ áƒáƒ¤áƒ”რი',
'search-external' => 'გáƒáƒ áƒ” ძიებáƒ',
'searchdisabled' => '{{SITENAME}}ში ძებნრგáƒáƒ£áƒ¥áƒ›áƒ”ბულიáƒ. თქვენ შეგიძლიáƒáƒ— დრáƒáƒ˜áƒ¡ შუáƒáƒšáƒ”დით Google-ით ძებნáƒ. მიáƒáƒ¥áƒªáƒ˜áƒ”თ ყურáƒáƒ“ღებáƒ, რáƒáƒ› {{SITENAME}}ში შესáƒáƒ«áƒšáƒ”ბელირმáƒáƒ—ი ინდექსები áƒáƒ¥áƒ¢áƒ£áƒáƒšáƒ£áƒ áƒ˜ áƒáƒ  áƒáƒ áƒ˜áƒ¡.',
-
-# Quickbar
-'qbsettings' => 'სწრáƒáƒ¤áƒ˜ ზáƒáƒšáƒ˜',
-'qbsettings-none' => 'áƒáƒ áƒáƒ¤áƒ”რი',
-'qbsettings-fixedleft' => 'ფიქსირებული მáƒáƒ áƒªáƒ®áƒœáƒ˜áƒ•',
-'qbsettings-fixedright' => 'ფიქსირებული მáƒáƒ áƒ¯áƒ•áƒœáƒ˜áƒ•',
-'qbsettings-floatingleft' => 'მáƒáƒ áƒªáƒ®áƒœáƒ˜áƒ• მცურáƒáƒ•áƒ˜',
-'qbsettings-floatingright' => 'მáƒáƒ áƒ¯áƒ•áƒœáƒ˜áƒ• მცურáƒáƒ•áƒ˜',
-'qbsettings-directionality' => 'ფიქსირებული, დáƒáƒ›áƒáƒ™áƒ˜áƒ“ებული თქვენი ენის წერილáƒáƒ‘ით მიმáƒáƒ áƒ—ულებáƒáƒ–ე',
+'search-error' => 'ძიებისáƒáƒ¡ მáƒáƒ®áƒ“რშეცდáƒáƒ›áƒ: $1',
# Preferences page
'preferences' => 'კáƒáƒœáƒ¤áƒ˜áƒ’ურáƒáƒªáƒ˜áƒ',
@@ -1291,7 +1325,6 @@ $1",
'resetprefs' => 'გáƒáƒ“áƒáƒ¢áƒ•áƒ˜áƒ áƒ—ვáƒ',
'restoreprefs' => 'კáƒáƒœáƒ¤áƒ˜áƒ’ურáƒáƒªáƒ˜áƒ˜áƒ¡ სáƒáƒ¬áƒ§áƒ˜áƒ¡áƒ–ე დáƒáƒ‘რუნებáƒ',
'prefs-editing' => 'რედáƒáƒ¥áƒ¢áƒ˜áƒ áƒ”ბáƒ',
-'prefs-edit-boxsize' => 'რედáƒáƒ¥áƒ¢áƒ˜áƒ áƒ”ბის ფáƒáƒœáƒ¯áƒ áƒ˜áƒ¡ ზáƒáƒ›áƒ.',
'rows' => 'რიგები:',
'columns' => 'სვეტები',
'searchresultshead' => 'ძიებáƒ',
@@ -1302,9 +1335,6 @@ $1",
'recentchangesdays-max' => 'მáƒáƒ¥áƒ¡áƒ˜áƒ›áƒ£áƒ› $1 {{PLURAL:$1|დღე}}',
'recentchangescount' => 'სáƒáƒ©áƒ•áƒ”ნებელი ცვლილებების რáƒáƒáƒ“ენáƒáƒ‘áƒ:',
'prefs-help-recentchangescount' => 'შეიცáƒáƒ•áƒ¡ áƒáƒ®áƒáƒš შესწáƒáƒ áƒ”ბებს, გვერდების ისტáƒáƒ áƒ˜áƒ”ბს, ჟურნáƒáƒšáƒ”ბს.',
-'prefs-help-watchlist-token' => 'áƒáƒ› ველის შევსებრსáƒáƒ˜áƒ“უმლრგáƒáƒ¡áƒáƒ¦áƒ”ბით შექმნის RSS ტრáƒáƒœáƒ¡áƒšáƒáƒªáƒ˜áƒáƒ¡ თქვენი კáƒáƒœáƒ¢áƒ áƒáƒšáƒ˜áƒ¡ სიისთვის.
-ყველáƒ, ვინც იცის გáƒáƒ¡áƒáƒ¦áƒ”ბი, შესძლებს იხილáƒáƒ¡ თქვენი კáƒáƒœáƒ¢áƒ áƒáƒšáƒ˜áƒ¡ სიáƒ. ფრთხილáƒáƒ“ იყáƒáƒ•áƒ˜áƒ— სáƒáƒ˜áƒ“უმლრმნიშვნელáƒáƒ‘ის áƒáƒ áƒ©áƒ”ვისáƒáƒ¡.
-თქვენ შეგიძლიáƒáƒ— გáƒáƒ›áƒáƒ˜áƒ§áƒ”ნáƒáƒ— áƒáƒ¡áƒ”ვე შემთვევითი მნიშვნელáƒáƒ‘áƒ: $1',
'savedprefs' => 'თქვენ მიერ შერჩეული პáƒáƒ áƒáƒ›áƒ”ტრები დáƒáƒ›áƒáƒ®áƒ¡áƒáƒ•áƒ áƒ”ბულიáƒ.',
'timezonelegend' => 'სáƒáƒ¡áƒáƒáƒ—რსáƒáƒ áƒ¢áƒ§áƒ”ლი:',
'localtime' => 'áƒáƒ“გილáƒáƒ‘რივი დრáƒ:',
@@ -1334,7 +1364,6 @@ $1",
'prefs-common-css-js' => 'ზáƒáƒ’áƒáƒ“ი CSS/JS ყველრთემისთვის:',
'prefs-reset-intro' => 'ეს გვერდი შეიძლებრგáƒáƒ›áƒáƒ§áƒ”ნებული იქნეს თქვენი კáƒáƒœáƒ¤áƒ˜áƒ’ურáƒáƒªáƒ˜áƒ˜áƒ¡ შესáƒáƒªáƒ•áƒšáƒ”ლáƒáƒ“ სáƒáƒ¬áƒ§áƒ˜áƒ¡ კáƒáƒœáƒ¤áƒ˜áƒ’ურáƒáƒªáƒ˜áƒáƒ–ე. áƒáƒ› მáƒáƒ¥áƒ›áƒ”დების დáƒáƒ“áƒáƒ¡áƒ¢áƒ£áƒ áƒ”ბის შემთხვევáƒáƒ¨áƒ˜, თქვენ ვეღáƒáƒ  შეძლებთ მის გáƒáƒ£áƒ¥áƒ›áƒ”ბáƒáƒ¡.',
'prefs-emailconfirm-label' => 'ელ-ფáƒáƒ¡áƒ¢áƒ˜áƒ¡ დáƒáƒ“áƒáƒ¡áƒ¢áƒ£áƒ áƒ”ბáƒ:',
-'prefs-textboxsize' => 'რედáƒáƒ¥áƒ¢áƒ˜áƒ áƒ”ბის ფáƒáƒœáƒ¯áƒ áƒ˜áƒ¡ ზáƒáƒ›áƒ',
'youremail' => 'ელექტრáƒáƒœáƒ£áƒšáƒ˜ ფáƒáƒ¡áƒ¢áƒ:',
'username' => '{{GENDER:$1|მáƒáƒ›áƒ®áƒ›áƒáƒ áƒ”ბლის სáƒáƒ®áƒ”ლი}}:',
'uid' => '{{GENDER:$1|მáƒáƒ›áƒ®áƒ›áƒáƒ áƒ”ბლის}} იდენტიფიკáƒáƒ¢áƒáƒ áƒ˜:',
@@ -1368,6 +1397,8 @@ $1",
'prefs-dateformat' => 'თáƒáƒ áƒ˜áƒ¦áƒ˜áƒ¡ ფáƒáƒ áƒ›áƒáƒ¢áƒ˜',
'prefs-timeoffset' => 'სáƒáƒ¡áƒáƒáƒ—რსáƒáƒ áƒ¢áƒ§áƒšáƒ˜áƒ¡ ცვლილებáƒ',
'prefs-advancedediting' => 'მთáƒáƒ•áƒáƒ áƒ˜ პáƒáƒ áƒáƒ›áƒ”ტრები',
+'prefs-editor' => 'რედáƒáƒ¥áƒ¢áƒáƒ áƒ˜',
+'prefs-preview' => 'წინáƒáƒ¡áƒ¬áƒáƒ áƒ˜ გáƒáƒ“áƒáƒ®áƒ”დვáƒ',
'prefs-advancedrc' => 'გáƒáƒ¤áƒáƒ áƒ—áƒáƒ”ბული პáƒáƒ áƒáƒ›áƒ”ტრები',
'prefs-advancedrendering' => 'გáƒáƒ¤áƒáƒ áƒ—áƒáƒ”ბული პáƒáƒ áƒáƒ›áƒ”ტრები',
'prefs-advancedsearchoptions' => 'გáƒáƒ¤áƒáƒ áƒ—áƒáƒ”ბული პáƒáƒ áƒáƒ›áƒ”ტრები',
@@ -1375,7 +1406,9 @@ $1",
'prefs-displayrc' => 'გáƒáƒ›áƒáƒ¡áƒáƒ®áƒ•áƒ˜áƒ¡ კáƒáƒœáƒ¤áƒ˜áƒ’ურáƒáƒªáƒ˜áƒ”ბი',
'prefs-displaysearchoptions' => 'გáƒáƒ›áƒáƒ¡áƒáƒ®áƒ•áƒ˜áƒ¡ კáƒáƒœáƒ¤áƒ˜áƒ’ურáƒáƒªáƒ˜áƒ”ბი',
'prefs-displaywatchlist' => 'გáƒáƒ›áƒáƒ¡áƒáƒ®áƒ•áƒ˜áƒ¡ კáƒáƒœáƒ¤áƒ˜áƒ’ურáƒáƒªáƒ˜áƒ”ბი',
+'prefs-tokenwatchlist' => 'ჟეტáƒáƒœáƒ˜',
'prefs-diffs' => 'სხვáƒáƒáƒ‘რვერსიებს შáƒáƒ áƒ˜áƒ¡',
+'prefs-help-prefershttps' => 'áƒáƒ› კáƒáƒœáƒ¤áƒ˜áƒ’ურáƒáƒªáƒ˜áƒ˜áƒ¡ áƒáƒ áƒ©áƒ”ვრშედეგს გáƒáƒ›áƒáƒ˜áƒ¦áƒ”ბს შემდგáƒáƒ›áƒ˜ áƒáƒ•áƒ¢áƒáƒ áƒ˜áƒ–áƒáƒªáƒ˜áƒ˜áƒ¡ შედმეგ.',
# User preference: email validation using jQuery
'email-address-validity-valid' => 'ელ-ფáƒáƒ¡áƒ¢áƒ˜áƒ¡ მისáƒáƒ›áƒáƒ áƒ—ი სწáƒáƒ áƒáƒ“ გáƒáƒ›áƒáƒ˜áƒ§áƒ£áƒ áƒ”ბáƒ',
@@ -1404,6 +1437,7 @@ $1",
'userrights-changeable-col' => 'ჯგუფები, რáƒáƒ›áƒšáƒ”ბიც შეგიძლიáƒáƒ— შეცვáƒáƒšáƒáƒ—',
'userrights-unchangeable-col' => 'ჯგუფები, რáƒáƒ›áƒšáƒ”ბიც áƒáƒ  შეგიძლიáƒáƒ— შეცვáƒáƒšáƒáƒ—',
'userrights-irreversible-marker' => '$1*',
+'userrights-conflict' => 'მáƒáƒ›áƒ®áƒ›áƒáƒ áƒ”ბელთრუფლებების კáƒáƒœáƒ¤áƒšáƒ˜áƒ¥áƒ¢áƒ˜! გთხáƒáƒ•áƒ— ხელმეáƒáƒ áƒ”დ შეინáƒáƒ®áƒáƒ— თქვენი ცვლილებები.',
# Groups
'group' => 'ჯგუფი:',
@@ -1469,11 +1503,15 @@ $1",
'right-proxyunbannable' => 'პრáƒáƒ¥áƒ¡áƒ˜áƒ¡ áƒáƒ•áƒ¢áƒáƒ‘ლáƒáƒ™áƒ˜áƒ¡ გáƒáƒ“áƒáƒ¡áƒ•áƒšáƒ',
'right-unblockself' => 'სáƒáƒ™áƒ£áƒ—áƒáƒ áƒ˜ თáƒáƒ•áƒ˜áƒ¡ გáƒáƒœáƒ‘ლáƒáƒ™áƒ•áƒ',
'right-protect' => 'გვერდების დáƒáƒªáƒ•áƒ˜áƒ¡ დáƒáƒœáƒ˜áƒ¡ შეცვლრდრდáƒáƒªáƒ£áƒšáƒ˜ გვერდების რედáƒáƒ¥áƒ¢áƒ˜áƒ áƒ”ბáƒ',
-'right-editprotected' => 'დáƒáƒªáƒ£áƒšáƒ˜ გვერდების რედáƒáƒ¥áƒ¢áƒ˜áƒ áƒ”ბრ(იერáƒáƒ áƒ¥áƒ˜áƒ£áƒšáƒ˜ დáƒáƒªáƒ•áƒ˜áƒ¡ გáƒáƒ áƒ”შე)',
+'right-editprotected' => 'გვერდების რედáƒáƒ¥áƒ¢áƒ˜áƒ áƒ”ბრრáƒáƒ›áƒšáƒ”ბიც დáƒáƒªáƒ£áƒšáƒ˜áƒ რáƒáƒ’áƒáƒ áƒª „{{int:protect-level-sysop}}“',
+'right-editsemiprotected' => 'გვერდების რედáƒáƒ¥áƒ¢áƒ˜áƒ áƒ”ბრრáƒáƒ›áƒšáƒ”ბიც დáƒáƒªáƒ£áƒšáƒ˜áƒ რáƒáƒ’áƒáƒ áƒª „{{int:protect-level-autoconfirmed}}“',
'right-editinterface' => 'მáƒáƒ›áƒ®áƒ›áƒáƒ áƒ”ბლის ინტერფეისის შეცვლáƒ',
'right-editusercssjs' => 'სხვრმáƒáƒ›áƒ®áƒ›áƒáƒ áƒ”ბლების CSS- и JS- ფáƒáƒ˜áƒšáƒ”ბის შესწáƒáƒ áƒ”ბáƒ',
'right-editusercss' => 'სხვრმáƒáƒ›áƒ®áƒ›áƒáƒ áƒ”ბლების CSS- ფáƒáƒ˜áƒšáƒ”ბის შესწáƒáƒ áƒ”ბáƒ',
'right-edituserjs' => 'სხვრმáƒáƒ›áƒ®áƒ›áƒáƒ áƒ”ბლების JS- ფáƒáƒ˜áƒšáƒ”ბის შესწáƒáƒ áƒ”ბáƒ',
+'right-editmyusercss' => 'თქვენი სáƒáƒ™áƒ£áƒ—áƒáƒ áƒ˜ CSS-ფáƒáƒ˜áƒšáƒ”ბის რედáƒáƒ¥áƒ¢áƒ˜áƒ áƒ”ბáƒ',
+'right-editmyuserjs' => 'თქვენი სáƒáƒ™áƒ£áƒ—áƒáƒ áƒ˜ JavaScript-ფáƒáƒ˜áƒšáƒ”ბის რედáƒáƒ¥áƒ¢áƒ˜áƒ áƒ”ბáƒ',
+'right-viewmywatchlist' => 'თქვენი კáƒáƒœáƒ¢áƒ áƒáƒšáƒ˜áƒ¡ სიის ხილვáƒ',
'right-rollback' => 'გáƒáƒ áƒ™áƒ•áƒ”ულ გვერდზე ბáƒáƒšáƒ მáƒáƒ›áƒ®áƒ›áƒáƒ áƒ”ბლის რედáƒáƒ¥áƒ¢áƒ˜áƒ áƒ”ბის სწრáƒáƒ¤áƒ˜ გáƒáƒ£áƒ¥áƒ›áƒ”ბáƒ',
'right-markbotedits' => 'გáƒáƒ£áƒ¥áƒ›áƒ”ბული შესწáƒáƒ áƒ”ბების მáƒáƒœáƒ˜áƒ¨áƒ•áƒœáƒ რáƒáƒ’áƒáƒ áƒª ბáƒáƒ¢áƒ˜áƒ¡',
'right-noratelimit' => 'სიჩქáƒáƒ áƒ˜áƒ¡ შეზღუდვის áƒáƒ  áƒáƒ áƒ¡áƒ”ბáƒáƒ‘áƒ',
@@ -1535,9 +1573,15 @@ $1",
'action-userrights-interwiki' => 'მáƒáƒ›áƒ®áƒ›áƒáƒ áƒ”ბლების უფლებების შეცვლრსხვრვიკიებში',
'action-siteadmin' => 'მáƒáƒœáƒáƒªáƒ”მთრბáƒáƒ–ის დáƒáƒ‘ლáƒáƒ™áƒ•áƒ დრგáƒáƒœáƒ‘ლáƒáƒ™áƒ•áƒ',
'action-sendemail' => 'ელ-ფáƒáƒ¡áƒ¢áƒ”ბის გáƒáƒ’ზáƒáƒ•áƒœáƒ',
+'action-editmywatchlist' => 'თქვენი კáƒáƒœáƒ¢áƒ áƒáƒšáƒ˜áƒ¡ სიის რედáƒáƒ¥áƒ¢áƒ˜áƒ áƒ”ბáƒ',
+'action-viewmywatchlist' => 'თქვენი კáƒáƒœáƒ¢áƒ áƒáƒšáƒ˜áƒ¡ სიის ხილვáƒ',
+'action-viewmyprivateinfo' => 'თქვენი პირáƒáƒ“ი ინფáƒáƒ áƒ›áƒáƒªáƒ˜áƒ˜áƒ¡ ხილვáƒ',
+'action-editmyprivateinfo' => 'თქვენი პირáƒáƒ“ი ინფáƒáƒ áƒ›áƒáƒªáƒ˜áƒ˜áƒ¡ რედáƒáƒ¥áƒ¢áƒ˜áƒ áƒ”ბáƒ',
# Recent changes
'nchanges' => '$1 ცვლილებáƒ',
+'enhancedrc-since-last-visit' => '$1 {{PLURAL:$1|ბáƒáƒšáƒ ვიზიტის შემდეგ}}',
+'enhancedrc-history' => 'ისტáƒáƒ áƒ˜áƒ',
'recentchanges' => 'ბáƒáƒšáƒ ცვლილებები',
'recentchanges-legend' => 'ბáƒáƒšáƒ ცვლილებების პáƒáƒ áƒáƒ›áƒ”ტრები',
'recentchanges-summary' => 'უთვáƒáƒšáƒ—ვáƒáƒšáƒ”თ ვიკის ბáƒáƒšáƒ ცვლილებებს áƒáƒ› გვერდზე.',
@@ -1579,7 +1623,6 @@ $1",
'recentchangeslinked-feed' => 'დáƒáƒ™áƒáƒ•áƒ¨áƒ˜áƒ áƒ”ბული ცვლილებები',
'recentchangeslinked-toolbox' => 'დáƒáƒ™áƒáƒ•áƒ¨áƒ˜áƒ áƒ”ბული ცვლილებები',
'recentchangeslinked-title' => '„$1“-თáƒáƒœ დáƒáƒ™áƒáƒ•áƒ¨áƒ˜áƒ áƒ”ბული ცვლილებები',
-'recentchangeslinked-noresult' => 'მითითებულ პერიáƒáƒ“ში ცვლილებები დáƒáƒ™áƒáƒ•áƒ¨áƒ˜áƒ áƒ”ბულ გვერდებზე áƒáƒ  მáƒáƒ›áƒ®áƒ“áƒáƒ áƒ.',
'recentchangeslinked-summary' => "ეს áƒáƒ áƒ˜áƒ¡ მითითებულ გვერდთáƒáƒœ (áƒáƒœ მითითებული კáƒáƒ¢áƒ”გáƒáƒ áƒ˜áƒ˜áƒ¡ წევრებთáƒáƒœ) დáƒáƒ™áƒáƒ•áƒ¨áƒ˜áƒ áƒ”ბულ გვერდებში ბáƒáƒšáƒ დრáƒáƒ¡ გáƒáƒœáƒ®áƒáƒ áƒªáƒ˜áƒ”ლებული ცვლილებების სიáƒ.
გვერდები [[Special:Watchlist|თქვენი კáƒáƒœáƒ¢áƒ áƒáƒšáƒ˜áƒ¡ სიáƒáƒ¨áƒ˜]] გáƒáƒ›áƒáƒ§áƒáƒ¤áƒ˜áƒšáƒ˜áƒ '''სქლáƒáƒ“'''.",
'recentchangeslinked-page' => 'გვერდის დáƒáƒ¡áƒáƒ®áƒ”ლებáƒ:',
@@ -1591,7 +1634,7 @@ $1",
'reuploaddesc' => 'გáƒáƒáƒ£áƒ¥áƒ›áƒ”თ áƒáƒ¢áƒ•áƒ˜áƒ áƒ—ვრდრდáƒáƒ£áƒ‘რუნდით áƒáƒ¢áƒ•áƒ˜áƒ áƒ—ვის ფáƒáƒ áƒ›áƒáƒ¡.',
'upload-tryagain' => 'შეინáƒáƒ®áƒ”თ ფáƒáƒ˜áƒšáƒ˜áƒ¡ შეცვლილი áƒáƒ¦áƒ¬áƒ”რáƒ',
'uploadnologin' => 'რეგისტრáƒáƒªáƒ˜áƒ áƒáƒ  გáƒáƒ¥áƒ•áƒ— გáƒáƒ•áƒšáƒ˜áƒšáƒ˜',
-'uploadnologintext' => 'ფáƒáƒ˜áƒšáƒ˜áƒ¡ áƒáƒ¢áƒ•áƒ˜áƒ áƒ—ვისთვის თქვენ უნდრ[[Special:UserLogin|შეხვიდეთ]].',
+'uploadnologintext' => 'ფáƒáƒ˜áƒšáƒ˜áƒ¡ áƒáƒ¡áƒáƒ¢áƒ•áƒ˜áƒ áƒ—áƒáƒ“ თქვენ უნდრ$1.',
'upload_directory_missing' => 'შესáƒáƒœáƒáƒ®áƒ˜ დირექტáƒáƒ áƒ˜áƒ ($1) áƒáƒ  áƒáƒ áƒ¡áƒ”ბáƒáƒ‘ს დრმისი áƒáƒ¦áƒ“გენრვებ-სერვერის მიერ შეუძლებელიáƒ.',
'upload_directory_read_only' => 'ვებსერვერი ვერ იწერს áƒáƒ¢áƒ•áƒ˜áƒ áƒ—ვის დირექტáƒáƒ áƒ˜áƒáƒ¨áƒ˜ ($1).',
'uploaderror' => 'áƒáƒ¢áƒ•áƒ˜áƒ áƒ—ვის შეცდáƒáƒ›áƒ',
@@ -1803,7 +1846,6 @@ $1',
'http-read-error' => 'HTTP წáƒáƒ™áƒ˜áƒ—ხვის შეცდáƒáƒ›áƒ.',
'http-timed-out' => 'HTTP მáƒáƒ—ხáƒáƒ•áƒœáƒ˜áƒ¡ დრრგáƒáƒ•áƒ˜áƒ“áƒ.',
'http-curl-error' => 'შეცდáƒáƒ›áƒ URL: $1-ის მáƒáƒ—ხáƒáƒ•áƒœáƒ˜áƒ¡áƒáƒ¡',
-'http-host-unreachable' => 'URL მიუწვდáƒáƒ›áƒ”ლიáƒ',
'http-bad-status' => 'HTTP მáƒáƒ—ხáƒáƒ•áƒœáƒ˜áƒ¡áƒáƒ¡ áƒáƒ¦áƒ›áƒáƒ©áƒ”ნილირშეცდáƒáƒ›áƒ - $1 $2',
# Some likely curl errors. More could be added from <http://curl.haxx.se/libcurl/c/libcurl-errors.html>
@@ -1835,6 +1877,10 @@ $1',
'listfiles_size' => 'ზáƒáƒ›áƒ (ბáƒáƒ˜áƒ¢áƒ”ბი)',
'listfiles_description' => 'áƒáƒ¦áƒ¬áƒ”რილáƒáƒ‘áƒ',
'listfiles_count' => 'ვერსიები',
+'listfiles-show-all' => 'სურáƒáƒ—ების ძველი ვერსიების ჩáƒáƒ áƒ—ვáƒ',
+'listfiles-latestversion' => 'მიმდინáƒáƒ áƒ” ვერსიáƒ',
+'listfiles-latestversion-yes' => 'დიáƒáƒ®',
+'listfiles-latestversion-no' => 'áƒáƒ áƒ',
# File description page
'file-anchor-link' => 'ფáƒáƒ˜áƒšáƒ˜',
@@ -1931,6 +1977,9 @@ $1',
'randompage' => 'ნებისმიერი გვერდი',
'randompage-nopages' => '{{PLURAL:$2|სáƒáƒ®áƒ”ლთრშემდეგი სივრცე|სáƒáƒ®áƒ”ლთრშემდეგ სივრცეში}} "$1" áƒáƒ  áƒáƒ áƒ˜áƒ¡ გვერდები.',
+# Random page in category
+'randomincategory-selectcategory-submit' => 'მიდი',
+
# Random redirect
'randomredirect' => 'ნებისმიერი გáƒáƒ“áƒáƒ›áƒ˜áƒ¡áƒáƒ›áƒáƒ áƒ—ებáƒ',
'randomredirect-nopages' => 'სáƒáƒ®áƒ”ლთრსივრცეში „$1“ áƒáƒ  áƒáƒ áƒ˜áƒ¡ გáƒáƒ“áƒáƒ›áƒ˜áƒ¡áƒáƒ›áƒáƒ áƒ—ებები.',
@@ -1956,12 +2005,6 @@ $1',
'statistics-users-active-desc' => 'მáƒáƒ›áƒ®áƒ›áƒáƒ áƒ”ბლები, რáƒáƒ›áƒšáƒ”ბმáƒáƒª გáƒáƒœáƒáƒ®áƒáƒ áƒªáƒ˜áƒ”ლეს ქმედებრ{{PLURAL:$1|ბáƒáƒšáƒ $1 დღის|ბáƒáƒšáƒ $1 დღის}} გáƒáƒœáƒ›áƒáƒ•áƒšáƒáƒ‘áƒáƒ¨áƒ˜',
'statistics-mostpopular' => 'ყველზე ხშირáƒáƒ“ ხილვáƒáƒ“ი გვერდები',
-'disambiguations' => 'გვერდები, რáƒáƒ›áƒ”ლთáƒáƒª áƒáƒ¥áƒ•áƒ— ბმული მრáƒáƒ•áƒáƒšáƒ›áƒœáƒ˜áƒ¨áƒ•áƒœáƒ”ლáƒáƒ•áƒáƒœ გვერდებზე',
-'disambiguationspage' => 'Template:მრáƒáƒ•áƒáƒšáƒ›áƒœáƒ˜áƒ¨áƒ•áƒœáƒ”ლáƒáƒ•áƒáƒœáƒ˜',
-'disambiguations-text' => "შემდეგი გვერდები შეიცáƒáƒ•áƒ”ნ სულ მცირე ერთ ბმულს '''მრáƒáƒ•áƒáƒšáƒ›áƒœáƒ˜áƒ¨áƒ•áƒœáƒ”ლáƒáƒ‘ის გვერდზე'''.
-áƒáƒ›áƒ˜áƒ¡ ნáƒáƒªáƒ•áƒšáƒáƒ“, სáƒáƒ•áƒáƒ áƒáƒ£áƒ“áƒáƒ“, ისისნი უნდრმიუთითებდნენ შესáƒáƒ‘áƒáƒ›áƒ˜áƒ¡ კáƒáƒœáƒ™áƒ áƒ”ტულ სტáƒáƒ¢áƒ˜áƒáƒ–ე.<br />
-გვერდი ითვლებრმრáƒáƒ•áƒáƒ›áƒœáƒ˜áƒ¨áƒ•áƒœáƒ”ლáƒáƒ•áƒœáƒáƒ“, თუ მáƒáƒ¡áƒ¨áƒ˜ გáƒáƒœáƒ—áƒáƒ•áƒ¡áƒ”ბულირთáƒáƒ áƒ’ი, რáƒáƒ›áƒšáƒ˜áƒ¡ სáƒáƒ®áƒ”ლიც მითითებულირგვერდზე [[MediaWiki:Disambiguationspage]].",
-
'pageswithprop' => 'გვერდები გáƒáƒœáƒ¡áƒáƒ–ღვრული თვისებით',
'pageswithprop-legend' => 'გვერდები გáƒáƒœáƒ¡áƒáƒ–ღვრული თვისებით',
'pageswithprop-text' => 'áƒáƒ¥ მáƒáƒªáƒ”მულირგვერდები, რáƒáƒ›áƒ”ლთáƒáƒª ხელით გáƒáƒœáƒ”სáƒáƒ–ღვრáƒáƒ— გáƒáƒ áƒ™áƒ•áƒ”ული თვისებები.',
@@ -2222,10 +2265,9 @@ $1',
'unwatchthispage' => 'შეáƒáƒ©áƒ”რეთ კáƒáƒœáƒ¢áƒ áƒáƒšáƒ˜',
'notanarticle' => 'შიგთáƒáƒ•áƒ¡áƒ˜áƒ¡ გვერდი áƒáƒ  áƒáƒ áƒ˜áƒ¡',
'notvisiblerev' => 'შესწáƒáƒ áƒ”ბრწáƒáƒ¨áƒšáƒ˜áƒšáƒ˜áƒ',
-'watchnochange' => 'áƒáƒ áƒª ერთი თქვენი კáƒáƒœáƒ¢áƒ áƒáƒšáƒ˜áƒ¡ ქვეშ მყáƒáƒ¤áƒ˜ ერთეული áƒáƒ  იქნრრედáƒáƒ¥áƒ¢áƒ˜áƒ áƒ”ბული ნáƒáƒ©áƒ•áƒ”ნებ დრáƒáƒ¨áƒ˜.',
'watchlist-details' => '$1 გვერდირთქვენი კáƒáƒœáƒ¢áƒ áƒáƒšáƒ˜áƒ¡ სიáƒáƒ¨áƒ˜ გáƒáƒœáƒ®áƒ˜áƒšáƒ•áƒ˜áƒ¡ გვერდების ჩáƒáƒ£áƒ—ვლელáƒáƒ“.',
-'wlheader-enotif' => '* ელ. ფáƒáƒ¡áƒ¢áƒ˜áƒ— შეტყáƒáƒ‘ინებრჩáƒáƒ áƒ—ულიáƒ.',
-'wlheader-showupdated' => '* გვერდები, რáƒáƒ›áƒšáƒ”ბშიც შეტáƒáƒœáƒ˜áƒš იქნრცვლილებები თქვენი ბáƒáƒšáƒ ვიზიტის შემდეგ, áƒáƒ¦áƒœáƒ˜áƒ¨áƒœáƒ£áƒšáƒ˜áƒ მუქáƒáƒ“.',
+'wlheader-enotif' => 'ელ.ფáƒáƒ¡áƒ¢áƒ˜áƒ— შეტყáƒáƒ‘ინებრჩáƒáƒ áƒ—ულიáƒ.',
+'wlheader-showupdated' => "თქვენი ბáƒáƒšáƒ ვიზიტის შემდეგ შეცვლილი გვერდები, áƒáƒ¦áƒœáƒ˜áƒ¨áƒœáƒ£áƒšáƒ˜áƒ '''მუქáƒáƒ“'''.",
'watchmethod-recent' => 'მიმდინáƒáƒ áƒ”áƒáƒ‘ს უáƒáƒ®áƒšáƒ”სი შესწáƒáƒ áƒ”ბების შემáƒáƒ¬áƒ›áƒ”ბრკáƒáƒœáƒ¢áƒ áƒáƒšáƒ˜áƒ¡ ქვეშ მყáƒáƒ¤áƒ˜ გვერდების მიხედვით.',
'watchmethod-list' => 'მიმდინáƒáƒ áƒ”áƒáƒ‘ს თქვენი კáƒáƒœáƒ¢áƒ áƒáƒšáƒ˜áƒ¡ ქვეშ მყáƒáƒ¤áƒ˜ გვერდების შემáƒáƒ¬áƒ›áƒ”ბრუáƒáƒ®áƒšáƒ”სი შესწáƒáƒ áƒ”ბების მიხედვით.',
'watchlistcontains' => 'თქვენი კáƒáƒœáƒ¢áƒ áƒáƒšáƒ˜áƒ¡ სირშეიცáƒáƒ•áƒ¡ $1 გვერდს.',
@@ -2632,14 +2674,12 @@ $1',
'ipb_blocked_as_range' => 'შეცდáƒáƒ›áƒ: IP-მისáƒáƒ›áƒáƒ áƒ—ი $1 áƒáƒ  იყრპირდáƒáƒžáƒ˜áƒ  დáƒáƒ‘ლáƒáƒ™áƒ˜áƒšáƒ˜, შესáƒáƒ‘áƒáƒ›áƒ˜áƒ¡áƒáƒ“ ვერ მáƒáƒ®áƒ“ებრმისი გáƒáƒœáƒ‘ლáƒáƒ™áƒ•áƒ.თუმცრიგი ეკუთვნის დიáƒáƒžáƒáƒ–áƒáƒœáƒ¡ $2, რáƒáƒ›áƒšáƒ˜áƒ¡ გáƒáƒœáƒ‘ლáƒáƒ™áƒ•áƒ შესáƒáƒ«áƒšáƒ”ბელიáƒ.',
'ip_range_invalid' => 'áƒáƒ áƒáƒ¡áƒ¬áƒáƒ áƒ˜ IP მისáƒáƒ›áƒáƒ áƒ—ი',
'ip_range_toolarge' => 'დáƒáƒ‘ლáƒáƒ™áƒ•áƒ /$1 დიáƒáƒžáƒáƒ–áƒáƒœáƒ–ე ზემáƒáƒ— áƒáƒ™áƒ áƒ«áƒáƒšáƒ£áƒšáƒ˜áƒ.',
-'blockme' => 'დáƒáƒ›áƒ‘ლáƒáƒ™áƒ”',
'proxyblocker' => 'პრáƒáƒ¥áƒ¡áƒ˜áƒ¡ ბლáƒáƒ™áƒ˜áƒ áƒ”ბáƒ',
-'proxyblocker-disabled' => 'ეს ფუნქცირგáƒáƒ£áƒ¥áƒ›áƒ”ბულიáƒ.',
'proxyblockreason' => 'თქვენი IP მისáƒáƒ›áƒáƒ áƒ—ი დáƒáƒ˜áƒ‘ლáƒáƒ™áƒ, ვინáƒáƒ˜áƒ“áƒáƒœ ის ღირპრáƒáƒ¥áƒ¡áƒ˜áƒ. გთხáƒáƒ•áƒ— დáƒáƒ£áƒ™áƒáƒ•áƒ¨áƒ˜áƒ áƒ“ეთ თქვენ ინტერნეტ პრáƒáƒ•áƒáƒ˜áƒ“ერს áƒáƒœ ტექ. სáƒáƒ›áƒ¡áƒáƒ®áƒ£áƒ áƒ¡ დრáƒáƒªáƒœáƒáƒ‘áƒáƒ— მáƒáƒ— áƒáƒ› სერიáƒáƒ–ული უსáƒáƒ¤áƒ áƒ—ხáƒáƒ”ბის პრáƒáƒ‘ლემის შესáƒáƒ®áƒ”ბ.',
-'proxyblocksuccess' => 'შესრულებულიáƒ.',
'sorbs' => 'DNSBL',
'sorbsreason' => 'თქვენი IP-მისáƒáƒ›áƒáƒ áƒ—ი მიჩნევრღირპრáƒáƒ¥áƒ¡áƒ˜áƒ“ DNSBL-ის თáƒáƒœáƒáƒ®áƒ›áƒáƒ“.',
'sorbs_create_account_reason' => 'თქვენი IP-მისáƒáƒ›áƒáƒ áƒ—ი ითვლებრღირპრáƒáƒ¥áƒ¡áƒ˜áƒ“ DNSBL-ის áƒáƒœáƒáƒ®áƒ›áƒáƒ“. თქვენ ვერ შექმნით áƒáƒœáƒ’áƒáƒ áƒ˜áƒ¨áƒ¡.',
+'xffblockreason' => 'დáƒáƒ˜áƒ‘ლáƒáƒ™áƒ IP-მისáƒáƒ›áƒáƒ áƒ—ი, რáƒáƒ›áƒ”ლიც იმყáƒáƒ¤áƒ”ბáƒáƒ“რX-Forwarded-For-ის სáƒáƒ—áƒáƒ£áƒ áƒ¨áƒ˜ დრრáƒáƒ›áƒ”ლიც გეკუთვნით თქვენ áƒáƒœ თქვენ მიერ გáƒáƒ›áƒáƒ§áƒ”ნებულ პრáƒáƒ¥áƒ¡áƒ˜-სერვერს. დáƒáƒ‘ლáƒáƒ™áƒ•áƒ˜áƒ¡ თáƒáƒ•áƒ“áƒáƒžáƒ˜áƒ áƒ•áƒ”ლი მიზეზი იყáƒ: $1',
'cant-block-while-blocked' => 'თქვენ ვერ დáƒáƒ‘ლáƒáƒ™áƒáƒ•áƒ— სხვრმáƒáƒ›áƒ®áƒ›áƒáƒ áƒ”ბლებს, რáƒáƒ“გáƒáƒœáƒáƒª თáƒáƒ•áƒáƒ“ ხáƒáƒ áƒ— დáƒáƒ‘ლáƒáƒ™áƒ˜áƒšáƒ˜.',
'cant-see-hidden-user' => 'მáƒáƒ›áƒ®áƒ›áƒáƒ áƒ”ბელი, რáƒáƒ›áƒšáƒ˜áƒ¡ დáƒáƒ‘ლáƒáƒ™áƒ•áƒáƒ¡áƒáƒª ცდილáƒáƒ—, უკვე დáƒáƒ‘ლáƒáƒ™áƒ˜áƒšáƒ˜áƒ დრდáƒáƒ›áƒáƒšáƒ£áƒšáƒ˜áƒ. რáƒáƒ“გáƒáƒœáƒáƒª თქვენ áƒáƒ  გáƒáƒ¥áƒ•áƒ— დáƒáƒ›áƒáƒšáƒ£áƒš მáƒáƒ›áƒ®áƒ›áƒáƒ áƒ”ბლებთáƒáƒœ მუშáƒáƒáƒ‘ის ნებáƒáƒ áƒ—ვáƒ, თქვენ ვერ შეცვლით áƒáƒ› ბლáƒáƒ™áƒ¡.',
'ipbblocked' => 'თქვენ ვერ დáƒáƒ‘ლáƒáƒ™áƒáƒ•áƒ— áƒáƒœ მáƒáƒ®áƒ¡áƒœáƒ˜áƒ— ბლáƒáƒ™áƒ¡ სხვრმáƒáƒ›áƒ®áƒ›áƒáƒ áƒ”ბლებს, რáƒáƒ“გáƒáƒœáƒáƒª თáƒáƒ•áƒáƒ“ ხáƒáƒ áƒ— დáƒáƒ‘ლáƒáƒ™áƒ˜áƒšáƒ˜.',
@@ -2797,6 +2837,8 @@ $1',
'thumbnail-more' => 'გáƒáƒ–áƒáƒ áƒ“ე',
'filemissing' => 'ფáƒáƒ˜áƒšáƒ˜ áƒáƒ™áƒšáƒ˜áƒ',
'thumbnail_error' => 'ესკიზის შექმნის შეცდáƒáƒ›áƒ: $1',
+'thumbnail_error_remote' => 'შეცდáƒáƒ›áƒ˜áƒ¡ შეტყáƒáƒ‘ინებრმáƒáƒ›áƒ®áƒ›áƒáƒ áƒ”ბლისáƒáƒ’áƒáƒœ $1:
+$2',
'djvu_page_error' => 'DjVu გვერდის ნáƒáƒ›áƒ”რი',
'djvu_no_xml' => 'შეუძლებელირXML-ის მიღებრDjVu-სთვის',
'thumbnail-temp-create' => 'დრáƒáƒ”ბითი ესკიზის ფáƒáƒ˜áƒšáƒ˜áƒ¡ შექმნრვერ ხერხდებáƒ',
@@ -2941,16 +2983,12 @@ $1',
'tooltip-undo' => 'შეტáƒáƒœáƒ˜áƒšáƒ˜ ცვლილებების გáƒáƒ£áƒ¥áƒ›áƒ”ბრდრწინáƒáƒ¡áƒ¬áƒáƒ  გáƒáƒ“áƒáƒ®áƒ”დვის ჩვენებáƒ, გáƒáƒ£áƒ¥áƒ›áƒ”ბის მიზეზის სქáƒáƒšáƒ˜áƒáƒ¨áƒ˜ ჩáƒáƒ¬áƒ”რáƒáƒ¡áƒ—áƒáƒœ ერთáƒáƒ“.',
'tooltip-preferences-save' => 'შეინáƒáƒ®áƒ”თ კáƒáƒœáƒ¤áƒ˜áƒ’ურáƒáƒªáƒ˜áƒ',
'tooltip-summary' => 'შეიყვáƒáƒœáƒ”თ მáƒáƒ™áƒšáƒ” სქáƒáƒšáƒ˜áƒ',
+'tooltip-iwiki' => '$1 — $2',
# Stylesheets
'common.css' => '/** áƒáƒ¥ ჩáƒáƒ¡áƒ›áƒ£áƒšáƒ˜ CSS გáƒáƒ›áƒáƒ§áƒ”ნებული იქნებრგáƒáƒ¤áƒáƒ áƒ›áƒ”ბის ყველრგáƒáƒ áƒ”კáƒáƒœáƒ–ე */',
-'standard.css' => '/* áƒáƒ¥ ჩáƒáƒ¡áƒ›áƒ£áƒšáƒ˜ CSS გáƒáƒ›áƒáƒ§áƒ”ნებული იქნებრსტáƒáƒœáƒ“áƒáƒ áƒ¢áƒ£áƒšáƒ˜ გáƒáƒ¤áƒáƒ áƒ›áƒ”ბის თემáƒáƒ¨áƒ˜ */',
-'nostalgia.css' => '/* áƒáƒ¥ ჩáƒáƒ¡áƒ›áƒ£áƒšáƒ˜ CSS გáƒáƒ›áƒáƒ§áƒ”ნებული იქნებრნáƒáƒ¡áƒ¢áƒáƒšáƒ’იური გáƒáƒ¤áƒáƒ áƒ›áƒ”ბის თემáƒáƒ¨áƒ˜ */',
'cologneblue.css' => '/* áƒáƒ¥ ჩáƒáƒ¡áƒ›áƒ£áƒšáƒ˜ CSS გáƒáƒ›áƒáƒ§áƒ”ნებული იქნებრკელნის ლურჯი გáƒáƒ¤áƒáƒ áƒ›áƒ”ბის თემáƒáƒ¨áƒ˜ */',
'monobook.css' => '/* áƒáƒ¥ ჩáƒáƒ¡áƒ›áƒ£áƒšáƒ˜ CSS გáƒáƒ•áƒšáƒ”ნáƒáƒ¡ იქáƒáƒœáƒ˜áƒ”ბს Monobook ინტერფეისის მáƒáƒ›áƒ®áƒ›áƒáƒ áƒ”ბლებზე */',
-'myskin.css' => '/* áƒáƒ¥ ჩáƒáƒ¡áƒ›áƒ£áƒšáƒ˜ CSS გáƒáƒ›áƒáƒ§áƒ”ნებული იქნებრჩემი იერსáƒáƒ®áƒ˜áƒ¡ გáƒáƒ¤áƒáƒ áƒ›áƒ”ბის თემáƒáƒ¨áƒ˜ */',
-'chick.css' => '/* áƒáƒ¥ ჩáƒáƒ¡áƒ›áƒ£áƒšáƒ˜ CSS გáƒáƒ›áƒáƒ§áƒ”ნებული იქნებრწიწილის გáƒáƒ¤áƒáƒ áƒ›áƒ”ბის თემáƒáƒ¨áƒ˜ */',
-'simple.css' => '/* áƒáƒ¥ ჩáƒáƒ¡áƒ›áƒ£áƒšáƒ˜ CSS გáƒáƒ›áƒáƒ§áƒ”ნებული იქნებრმáƒáƒ áƒ¢áƒ˜áƒ•áƒ˜ გáƒáƒ¤áƒáƒ áƒ›áƒ”ბის თემáƒáƒ¨áƒ˜ */',
'modern.css' => '/* áƒáƒ¥ ჩáƒáƒ¡áƒ›áƒ£áƒšáƒ˜ CSS გáƒáƒ›áƒáƒ§áƒ”ნებული იქნებრთáƒáƒœáƒáƒ›áƒ”დრáƒáƒ•áƒ” გáƒáƒ¤áƒáƒ áƒ›áƒ”ბის თემáƒáƒ¨áƒ˜ */',
'vector.css' => '/* áƒáƒ¥ ჩáƒáƒ¡áƒ›áƒ£áƒšáƒ˜ CSS გáƒáƒ›áƒáƒ§áƒ”ნებული იქნებრვექტáƒáƒ áƒ£áƒšáƒ˜ გáƒáƒ¤áƒáƒ áƒ›áƒ”ბის თემáƒáƒ¨áƒ˜ */',
'group-autoconfirmed.css' => '/* áƒáƒ¥ გáƒáƒœáƒ—áƒáƒ•áƒ¡áƒ”ბული CSS გáƒáƒ›áƒáƒ§áƒ”ნებული იქნებრმხáƒáƒšáƒáƒ“ áƒáƒ•áƒ¢áƒáƒ›áƒáƒ¢áƒ£áƒ áƒáƒ“ დáƒáƒ“áƒáƒ¡áƒ¢áƒ£áƒ áƒ”ბული მáƒáƒ›áƒ®áƒ›áƒáƒ áƒ”ბლებისáƒáƒ—ვის */',
@@ -3034,13 +3072,8 @@ $1',
'pageinfo-category-files' => 'ფáƒáƒ˜áƒšáƒ”ბის რáƒáƒáƒ“ენáƒáƒ‘áƒ',
# Skin names
-'skinname-standard' => 'კლáƒáƒ¡áƒ˜áƒ™áƒ£áƒ áƒ˜',
-'skinname-nostalgia' => 'ნáƒáƒ¡áƒ¢áƒáƒšáƒ’იáƒ',
'skinname-cologneblue' => 'კელნის ლურჯი',
'skinname-monobook' => 'მáƒáƒœáƒáƒ‘უკი',
-'skinname-myskin' => 'სáƒáƒ™áƒ£áƒ—áƒáƒ áƒ˜',
-'skinname-chick' => 'წიწილáƒ',
-'skinname-simple' => 'მáƒáƒ áƒ¢áƒ˜áƒ•áƒ˜',
'skinname-modern' => 'თáƒáƒœáƒáƒ›áƒ”დრáƒáƒ•áƒ”',
'skinname-vector' => 'ვექტáƒáƒ áƒ£áƒšáƒ˜',
@@ -3125,11 +3158,25 @@ $1',
'minutes' => '$1 წუთის',
'hours' => '$1 სáƒáƒáƒ—ის',
'days' => '$1 დღის',
+'weeks' => '{{PLURAL:$1|$1 კვირáƒ|$1 კვირáƒ}}',
'months' => '{{PLURAL:$1|$1 თვე|$1 თვე}}',
'years' => '{{PLURAL:$1|$1 წელი|$1 წელი}}',
'ago' => '$1 წინ',
'just-now' => 'áƒáƒ®áƒšáƒáƒ®áƒáƒœáƒ¡',
+# Human-readable timestamps
+'hours-ago' => '$1 {{PLURAL:$1|სáƒáƒáƒ—ის|სáƒáƒáƒ—ის}} წინ',
+'minutes-ago' => '$1 {{PLURAL:$1|წუთის|წუთის}} წინ',
+'seconds-ago' => '$1 {{PLURAL:$1|წáƒáƒ›áƒ˜áƒ¡|წáƒáƒ›áƒ˜áƒ¡}} წინ',
+'monday-at' => 'áƒáƒ áƒ¨áƒáƒ‘áƒáƒ—ს $1-ზე',
+'tuesday-at' => 'სáƒáƒ›áƒ¨áƒáƒ‘áƒáƒ—ს $1-ზე',
+'wednesday-at' => 'áƒáƒ—ხშáƒáƒ‘áƒáƒ—ს $1-ზე',
+'thursday-at' => 'ხუთშáƒáƒ‘áƒáƒ—ს $1-ზე',
+'friday-at' => 'პáƒáƒ áƒáƒ¡áƒ™áƒ”ვს $1-ზე',
+'saturday-at' => 'შáƒáƒ‘áƒáƒ—ს $1-ზე',
+'sunday-at' => 'კვირáƒáƒ¡ $1-ზე',
+'yesterday-at' => 'გუშინ $1-ზე',
+
# Bad image list
'bad_image_list' => 'ფáƒáƒ áƒ›áƒáƒ¢áƒ˜ შემდეგიáƒ:
@@ -3160,7 +3207,7 @@ $1',
'metadata-langitem' => "'''$2:''' $1",
'metadata-langitem-default' => '$1',
-# EXIF tags
+# Exif tags
'exif-imagewidth' => 'სიგáƒáƒœáƒ”',
'exif-imagelength' => 'სიმáƒáƒ¦áƒšáƒ”',
'exif-bitspersample' => 'ფერის კáƒáƒ›áƒžáƒáƒœáƒ”ნტთრსიღრმე',
@@ -3353,7 +3400,7 @@ $4, $5, $6 $7
$8',
'exif-subjectnewscode-value' => '$2 ($1)',
-# EXIF attributes
+# Exif attributes
'exif-compression-1' => 'შეუკუმშáƒáƒ•áƒ˜',
'exif-compression-2' => 'CCITT Group 3, ჰáƒáƒ¤áƒ›áƒáƒœáƒ˜áƒ¡ სერიის სიგრძის კáƒáƒ“ირების 1-გáƒáƒœáƒ–áƒáƒ›áƒ˜áƒšáƒ”ბიáƒáƒœáƒ˜ მáƒáƒ“იფიკáƒáƒªáƒ˜áƒ',
'exif-compression-3' => 'CCITT Group 3 ფáƒáƒ¥áƒ¡áƒ˜áƒ¡ კáƒáƒ“ირებáƒ',
@@ -3692,7 +3739,6 @@ $5
'semicolon-separator' => ';&#32;',
'comma-separator' => ',&#32;',
'colon-separator' => ':&#32;',
-'autocomment-prefix' => '-&#32;',
'pipe-separator' => '&#32;|&#32;',
'word-separator' => '&#32;',
'ellipsis' => '...',
@@ -3803,7 +3849,6 @@ $5
'version-other' => 'სხვáƒ',
'version-mediahandlers' => 'მედირდáƒáƒ›áƒ£áƒ¨áƒáƒ•áƒ”ბáƒ',
'version-hooks' => 'ჰუკები',
-'version-extension-functions' => 'გáƒáƒ¤áƒáƒ áƒ—áƒáƒ”ბáƒáƒ—რფუნქციები',
'version-parser-extensiontags' => 'სინტáƒáƒ¥áƒ¡áƒ£áƒ áƒ˜ áƒáƒœáƒáƒšáƒ˜áƒ–áƒáƒ¢áƒáƒ áƒ˜áƒ¡ თეგი',
'version-parser-function-hooks' => 'სინტáƒáƒ¥áƒ¡áƒ£áƒ áƒ˜ áƒáƒœáƒáƒšáƒ˜áƒ–áƒáƒ¢áƒáƒ áƒ˜áƒ¡ ჰუკი',
'version-hook-name' => 'ჰუკის სáƒáƒ®áƒ”ლი',
@@ -3813,6 +3858,7 @@ $5
'version-license' => 'ლიცენზიáƒ',
'version-poweredby-credits' => "ეს ვიკი მუშáƒáƒáƒ‘ს '''[//www.mediawiki.org/ MediaWiki]'''-ს ძრáƒáƒ•áƒ–ე, copyright © 2001-$1 $2.",
'version-poweredby-others' => 'სხვები',
+'version-poweredby-translators' => 'translatewiki.net-ის მთáƒáƒ áƒ’მნელები',
'version-credits-summary' => 'გვინდრმáƒáƒ“ლáƒáƒ‘რგáƒáƒ“áƒáƒ•áƒ£áƒ®áƒáƒ“áƒáƒ— შემდეგ მáƒáƒ›áƒ®áƒ›áƒáƒ áƒ”ბლებს მáƒáƒ—ი წვლილისáƒáƒ—ვის [[Special:Version|მედიáƒáƒ•áƒ˜áƒ™áƒ˜áƒ¡]] გáƒáƒœáƒ•áƒ˜áƒ—áƒáƒ áƒ”ბáƒáƒ¨áƒ˜.',
'version-license-info' => 'MediaWiki áƒáƒ áƒ˜áƒ¡ თáƒáƒ•áƒ˜áƒ¡áƒ£áƒ¤áƒáƒšáƒ˜ პრáƒáƒ’რáƒáƒ›áƒ£áƒšáƒ˜ უზრუნველყáƒáƒ¤áƒ; შეგიძლიáƒáƒ— მისი გáƒáƒ•áƒ áƒªáƒ”ლებრáƒáƒœ/დრმáƒáƒ“იფიცირებრGNU General Public License ლიცენზიის პირáƒáƒ‘ების შესáƒáƒ‘áƒáƒ›áƒ˜áƒ¡áƒáƒ“. რáƒáƒ’áƒáƒ áƒª გáƒáƒ›áƒáƒ¥áƒ•áƒ”ყნებულირთáƒáƒ•áƒ˜áƒ¡áƒ£áƒ¤áƒáƒšáƒ˜ პრáƒáƒ’რáƒáƒ›áƒ£áƒšáƒ˜ უზრუნველყáƒáƒ¤áƒ˜áƒ¡ ფáƒáƒœáƒ“ის მიერ; áƒáƒœ ლიცენზიის მეáƒáƒ áƒ” ვერსიáƒáƒ¨áƒ˜, áƒáƒœ (თქვენი áƒáƒ–რით) უფრრáƒáƒ®áƒáƒšáƒ¨áƒ˜.
@@ -3828,11 +3874,16 @@ MediaWiki ვრცელდებრიმ იმედით, რáƒáƒ› იáƒ
'version-entrypoints-articlepath' => '[https://www.mediawiki.org/wiki/Manual:$wgArticlePath გზრსტáƒáƒ¢áƒ˜áƒ˜áƒ¡áƒáƒ™áƒ”ნ]',
'version-entrypoints-scriptpath' => '[https://www.mediawiki.org/wiki/Manual:$wgScriptPath გზრსკრიპტისáƒáƒ™áƒ”ნ]',
-# Special:FilePath
-'filepath' => 'გზრფáƒáƒ˜áƒšáƒ˜áƒ¡áƒ“áƒáƒ›áƒ˜',
-'filepath-page' => 'ფáƒáƒ˜áƒšáƒ˜:',
-'filepath-submit' => 'წáƒáƒ•áƒ˜áƒ“áƒ',
-'filepath-summary' => 'მáƒáƒªáƒ”მული სპეცგვერდი áƒáƒ‘რუნებს ზუსტ გზáƒáƒ¡ ფáƒáƒ˜áƒšáƒ˜áƒ¡áƒ“áƒáƒ›áƒ˜ იმ სáƒáƒ®áƒ˜áƒ—, რáƒáƒ›áƒšáƒ˜áƒ—áƒáƒª იგი დისკზერშენáƒáƒ®áƒ£áƒšáƒ˜',
+# Special:Redirect
+'redirect' => 'გáƒáƒ“áƒáƒ›áƒ˜áƒ¡áƒáƒ›áƒáƒ áƒ—ებრფáƒáƒ˜áƒšáƒ˜áƒ“áƒáƒœ, მáƒáƒ›áƒ®áƒ›áƒáƒ áƒ”ბლიდáƒáƒœ áƒáƒœ ვერსიის იდენტიფიკáƒáƒ¢áƒáƒ áƒ˜áƒ“áƒáƒœ',
+'redirect-legend' => 'გáƒáƒ“áƒáƒ›áƒ˜áƒ¡áƒáƒ›áƒáƒ áƒ—ებრფáƒáƒ˜áƒšáƒ–ე áƒáƒœ გვერდზე',
+'redirect-submit' => 'მიდი',
+'redirect-lookup' => 'ძიებáƒ:',
+'redirect-value' => 'მნიშვნელáƒáƒ‘áƒ:',
+'redirect-user' => 'მáƒáƒ›áƒ®áƒ›áƒáƒ áƒ”ბლის იდენტიფიკáƒáƒ¢áƒáƒ áƒ˜',
+'redirect-revision' => 'გვერდის ვერსიáƒ',
+'redirect-file' => 'ფáƒáƒ˜áƒšáƒ˜áƒ¡ სáƒáƒ®áƒ”ლი',
+'redirect-not-exists' => 'მნიშვნელáƒáƒ‘რვერ მáƒáƒ˜áƒ«áƒ”ბნáƒ',
# Special:FileDuplicateSearch
'fileduplicatesearch' => 'ერთნáƒáƒ˜áƒ áƒ˜ ფáƒáƒ˜áƒšáƒ”ბის ძიებáƒ',
@@ -3884,7 +3935,10 @@ MediaWiki ვრცელდებრიმ იმედით, რáƒáƒ› იáƒ
'tags-tag' => 'ტეგის სáƒáƒ®áƒ”ლი',
'tags-display-header' => 'რედáƒáƒ¥áƒ¢áƒ˜áƒ áƒ”ბების სიáƒáƒ¨áƒ˜ ცვლილებების წáƒáƒ áƒ›áƒáƒ“გენáƒ',
'tags-description-header' => 'მნიშვნელáƒáƒ‘ის სრული áƒáƒ¦áƒ¬áƒ”რáƒ',
+'tags-active-header' => 'áƒáƒ¥áƒ¢áƒ˜áƒ£áƒ áƒ˜áƒ?',
'tags-hitcount-header' => 'áƒáƒ¦áƒœáƒ˜áƒ¨áƒœáƒ£áƒšáƒ˜ ცვლილებები',
+'tags-active-yes' => 'დიáƒáƒ®',
+'tags-active-no' => 'áƒáƒ áƒ',
'tags-edit' => 'რედáƒáƒ¥áƒ¢áƒ˜áƒ áƒ”ბáƒ',
'tags-hitcount' => '$1 ცვლილებáƒ',
@@ -3905,6 +3959,7 @@ MediaWiki ვრცელდებრიმ იმედით, რáƒáƒ› იáƒ
'dberr-problems' => 'ბáƒáƒ“იში! სáƒáƒ˜áƒ¢áƒ–ე დრáƒáƒ”ბითი ტექნიკური პრáƒáƒ‘ლემებიáƒ',
'dberr-again' => 'ეცáƒáƒ“ეთ რáƒáƒ›áƒ“ენიმე წუთით დáƒáƒªáƒ“რდრáƒáƒ› გვერდის გáƒáƒ“áƒáƒ¢áƒ•áƒ˜áƒ áƒ—ვáƒ',
'dberr-info' => 'ვერ მáƒáƒ®áƒ”რხდრინფáƒáƒ áƒ›áƒáƒªáƒ˜áƒ˜áƒ¡ $1 სერვერთáƒáƒœ დáƒáƒ™áƒáƒ•áƒ¨áƒ˜áƒ áƒ”ბáƒ',
+'dberr-info-hidden' => '(მáƒáƒœáƒáƒªáƒ”მთრბáƒáƒ–ის სერვერთáƒáƒœ დáƒáƒ™áƒáƒ•áƒ¨áƒ˜áƒ áƒ”ბრშეუძლებელიáƒ)',
'dberr-usegoogle' => 'áƒáƒ› დრáƒáƒ¡ კი შეგიძლიáƒáƒ— Google-ით ძიებáƒ',
'dberr-outofdate' => 'გáƒáƒ˜áƒ—ვáƒáƒšáƒ˜áƒ¡áƒ¬áƒ˜áƒœáƒ”თ, რáƒáƒ› თქვენი კáƒáƒœáƒ¢áƒ”ნტის ინდექსები შეიძლებრშეუსáƒáƒ‘áƒáƒ›áƒ იყáƒáƒ¡',
'dberr-cachederror' => 'ეს áƒáƒ áƒ˜áƒ¡ მáƒáƒ—ხáƒáƒ•áƒœáƒ˜áƒšáƒ˜ გვერდის კეშირებული ვერსიáƒ, დრშესáƒáƒ«áƒšáƒ”ბრმáƒáƒ«áƒ•áƒ”ლდáƒ.',
@@ -3920,6 +3975,9 @@ MediaWiki ვრცელდებრიმ იმედით, რáƒáƒ› იáƒ
'htmlform-submit' => 'შენáƒáƒ®áƒ•áƒ',
'htmlform-reset' => 'ცვლილებების გáƒáƒ£áƒ¥áƒ›áƒ”ბáƒ',
'htmlform-selectorother-other' => 'სხვáƒ',
+'htmlform-no' => 'áƒáƒ áƒ',
+'htmlform-yes' => 'დიáƒáƒ®',
+'htmlform-chosen-placeholder' => 'áƒáƒ˜áƒ áƒ©áƒ˜áƒ”თ პáƒáƒ áƒáƒ›áƒ”ტრი',
# SQLite database support
'sqlite-has-fts' => '$1 სრული ტექსტის ძიების მხáƒáƒ áƒ“áƒáƒ­áƒ”რით',
@@ -4037,4 +4095,10 @@ MediaWiki ვრცელდებრიმ იმედით, რáƒáƒ› იáƒ
# Image rotation
'rotate-comment' => 'სურáƒáƒ—ი მáƒáƒ¢áƒ áƒ˜áƒáƒšáƒ”ბულირ$1 {{PLURAL:$1|გრáƒáƒ“უსით|გრáƒáƒ“უსით}} სáƒáƒáƒ—ის ისრის მიმáƒáƒ áƒ—ულებით',
+# Limit report
+'limitreport-cputime-value' => '$1 {{PLURAL:$1|წáƒáƒ›áƒ˜}}',
+'limitreport-walltime-value' => '$1 {{PLURAL:$1|წáƒáƒ›áƒ˜}}',
+'limitreport-postexpandincludesize-value' => '$1/$2 {{PLURAL:$2|ბáƒáƒ˜áƒ¢áƒ˜}}',
+'limitreport-templateargumentsize-value' => '$1/$2 {{PLURAL:$2|ბáƒáƒ˜áƒ¢áƒ˜}}',
+
);
diff --git a/languages/messages/MessagesKaa.php b/languages/messages/MessagesKaa.php
index 37e4005e..3bac5f9b 100644
--- a/languages/messages/MessagesKaa.php
+++ b/languages/messages/MessagesKaa.php
@@ -180,9 +180,6 @@ $messages = array(
'tog-enotifrevealaddr' => "Eskertiw xatlarında e-mail adresimdi ko'rset",
'tog-shownumberswatching' => "Baqlag'an paydalanıwshılar sanın ko'rset",
'tog-fancysig' => 'İmzalardı wikitext dep qabıl etiw (avtomat siltewsiz)',
-'tog-externaleditor' => "Defolt boyınsha sırtqı o'zgertiwshini qollan (tek g'ana ta'jiriybeli paydalanıwshılar ushın, kompyuterin'izde qosımsha sazlawlar qılınıwı kerek. [//www.mediawiki.org/wiki/Manual:External_editors More information.])",
-'tog-externaldiff' => "Defoltta sırtqı parqtı qollan (tek ekspert paydalanıwshılar ushın, kompyuterin'izde arnawlı sazlawlardı talap etedi. [//www.mediawiki.org/wiki/Manual:External_editors More information.])",
-'tog-showjumplinks' => "«O'tip ketiw» siltewlerin qos",
'tog-uselivepreview' => "Janlı ko'rip shıg'ıwdı qollan (JavaScript) (Sınawda)",
'tog-forceeditsummary' => "O'zgertiw juwmag'ı bos qalg'anda mag'an eskert",
'tog-watchlisthideown' => "Baqlaw dizimindegi menin' o'zgertiwlerimdi jasır",
@@ -267,7 +264,7 @@ $messages = array(
'category-file-count-limited' => "Usı kategoriyada to'mendegi {{PLURAL:$1|fayl|$1 fayl}} bar.",
'listingcontinuesabbrev' => 'dawamı',
-'linkprefix' => '/^(.*?)([a-zıA-Zİ\\x80-\\xff]+)$/sDu',
+'linkprefix' => '/^((?>.*(?<![a-zıA-Zİ\\x80-\\xff])))(.+)$/sDu',
'about' => 'Haqqında',
'article' => "Mag'lıwmat beti",
@@ -360,7 +357,7 @@ $messages = array(
'jumptonavigation' => 'navigatsiya',
'jumptosearch' => 'izlew',
-# 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).
+# 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).
'aboutsite' => '{{SITENAME}} haqqında',
'aboutpage' => 'Project:Haqqında',
'copyright' => "Mag'lıwmat $1 boyınsha alıng'an.",
@@ -370,7 +367,6 @@ $messages = array(
'disclaimers' => 'Juwapkershilikten bas tartıw',
'disclaimerpage' => 'Project:Juwapkershilikten bas tartıw',
'edithelp' => "O'zgertiw anıqlaması",
-'edithelppage' => "Help:O'zgertiw",
'helppage' => 'Help:Mazmunı',
'mainpage' => 'Bas bet',
'mainpage-description' => 'Bas bet',
@@ -441,17 +437,6 @@ Arnawlı betlerdin' dizimin [[Special:SpecialPages|{{int:specialpages}}]] betine
# General errors
'error' => "Qa'telik",
'databaseerror' => "Mag'lıwmatlar bazası qa'tesi",
-'dberrortext' => "Mag'lıwmatlar bazası sorawında sintaksis qa'tesi sa'dir boldı.
-Bul bag'darlamada qa'te barlıg'ın bildiriwi mu'mkin.
-Aqırg'ı soralg'an mag'lıwmatlar bazası sorawı:
-<blockquote><tt>\$1</tt></blockquote>
-\"<tt>\$2</tt>\" funktsiyasınan.
-Mag'lıwmatlar bazası qaytarg'an qa'tesi \"<tt>\$3: \$4</tt>\".",
-'dberrortextcl' => 'Mag\'lıwmatlar bazası sorawında sintaksis qa\'tesi sa\'dir boldı.
-Aqırg\'ı soralg\'an mag\'lıwmatlar bazası sorawı:
-"$1"
-funktsiya: "$2".
-Mag\'lıwmatlar bazası qaytarg\'an qa\'tesi "$3: $4".',
'laggedslavemode' => "Esletpe: Bette aqırg'ı jan'alanıwlar bolmawı mu'mkin.",
'readonly' => "Mag'lıwmatlar bazası qulplang'an",
'enterlockreason' => "Qulıplawdın' sebebin ha'mde qansha waqıtqa esaplang'anlıg'ın ko'rsetin'",
@@ -497,7 +482,6 @@ Birneshe minuttan keyin qaytadan ha'reket qılıp ko'rin'.",
'editinginterface' => "'''Esletpe:''' Siz ishinde MediaWiki sistema xabarı bar bolg'an betti o'zgertip atırsız.
Bul bettin' o'zgeriwi basqa paydalanıwshılardın' sırtqı interfeisine ta'sir etedi.
Audarıw ushın, MediaWiki programmasın jersindiriw [//translatewiki.net/wiki/Main_Page?setlang=kaa translatewiki.net proyektisin] qarap shıg'ın'ız.",
-'sqlhidden' => "(SQL sorawı jasırılg'an)",
'namespaceprotected' => "'''$1''' isimler ko'pligindegi betlerdi o'zgertiwge ruxsatın'ız joq.",
'ns-specialprotected' => '"{{ns:special}}:" isimler ko\'pligindegi betler o\'zgertilmeydi',
'titleprotected' => "Bul atamanı jaratıw [[User:$1|$1]] ta'repinen qorg'alg'an.
@@ -600,7 +584,7 @@ Kiriw protsessin juwmaqlaw ushın jan'a parolin'izdi usı jerge kiritin':",
'newpassword' => 'Taza parol:',
'retypenew' => "Taza paroldi qayta kiritin':",
'resetpass_submit' => "Paroldi kirgizin'",
-'resetpass_success' => "Parolin'iz sa'tli o'zgertildi! Endi kirin'...",
+'changepassword-success' => "Parolin'iz sa'tli o'zgertildi! Endi kirin'...",
'resetpass_forbidden' => "Paroller o'zgertile almaydi",
'resetpass-submit-loggedin' => "Paroldi o'zgertiw",
'resetpass-temp-password' => 'Waqtınshalıq parol:',
@@ -827,7 +811,6 @@ Sha'rtli belgiler: (ha'z.) = ha'zirgi nusqasi menen parqı,
'searchmenu-legend' => 'İzlew sazlawları',
'searchmenu-exists' => "'''Bul wikide \"[[:\$1]]\" atamalı bet bar'''",
'searchmenu-new' => "'''Bul wikide \"[[:\$1]]\" betin jaratıw!'''",
-'searchhelp-url' => 'Help:Mazmunı',
'searchmenu-prefix' => "[[Special:PrefixIndex/$1|Usı prefiks penen baslanıwshı betlerdi ko'rset]]",
'searchprofile-articles' => "Mag'lıwmat betleri",
'searchprofile-project' => "Ja'rdem ha'm Proekt betleri",
@@ -863,14 +846,6 @@ Barlıq mag'lıwmat tu'rin (sonın' ishinde sa'wbet betlerdi, shablonlardı h.t.
'powersearch-field' => "İzlenetug'ın so'z (yamasa so'z dizbegi):",
'search-external' => 'Sırtqı izlewshi',
-# Quickbar
-'qbsettings' => 'Navigatsiya paneli',
-'qbsettings-none' => 'Hesh qanday',
-'qbsettings-fixedleft' => 'Shepke bekitilgen',
-'qbsettings-fixedright' => "On'g'a bekitilgen",
-'qbsettings-floatingleft' => 'Shepte jıljıwshı',
-'qbsettings-floatingright' => "On'da jıljıwshı",
-
# Preferences page
'preferences' => 'Sazlawlar',
'mypreferences' => "Menin' sazlawlarım",
@@ -894,7 +869,6 @@ Barlıq mag'lıwmat tu'rin (sonın' ishinde sa'wbet betlerdi, shablonlardı h.t.
'saveprefs' => 'Saqla',
'resetprefs' => "Saqlanbag'an o'zgerislerdi o'shir",
'prefs-editing' => "O'zgertiw",
-'prefs-edit-boxsize' => "O'zgertiw aynasının' o'lshemi.",
'rows' => 'Qatarlar:',
'columns' => "Bag'analar:",
'searchresultshead' => 'Ä°zlew',
@@ -1094,7 +1068,6 @@ Barlıq mag'lıwmat tu'rin (sonın' ishinde sa'wbet betlerdi, shablonlardı h.t.
'recentchangeslinked-feed' => "Baylanıslı o'zgerisler",
'recentchangeslinked-toolbox' => "Baylanıslı o'zgerisler",
'recentchangeslinked-title' => '"$1" ushın baylanıslı o\'zgerisler',
-'recentchangeslinked-noresult' => "Siltelgen betlerde berilgen waqıt dawamında hesh qanday o'zgeris bolmag'an.",
'recentchangeslinked-summary' => "Bul arnawlı bette siltelgen betlerdegi aqırg'ı o'zgerisler dizimi ko'rsetilgen. [[Special:Watchlist|Baqlaw dizimin'izdegi]] betler '''juwan''' ha'ribi menen ko'rsetilgen.",
'recentchangeslinked-page' => 'Bet ataması:',
'recentchangeslinked-to' => "Kerisinshe, berilgen betke silteytug'ın betlerdegi o'zgerislerdi ko'rset",
@@ -1246,9 +1219,6 @@ Barlıq mag'lıwmat tu'rin (sonın' ishinde sa'wbet betlerdi, shablonlardı h.t.
'statistics-users-active' => 'Aktiv paydalanıwshılar',
'statistics-mostpopular' => "En' ko'p ko'rilgen betler",
-'disambiguations' => "Ko'p ma'nisli betler",
-'disambiguationspage' => '{{ns:template}}:disambig',
-
'doubleredirects' => 'Qos burıwshılar',
'double-redirect-fixer' => "Qayta bag'ıtlawshılardı du'zetiwshi",
@@ -1412,7 +1382,7 @@ Eger siz bul betti baqlaw dizimin'izden o'shirmekshi bolsan'ız bettin' joqarg'Ä
'notanarticle' => "Mag'lıwmat beti emes",
'notvisiblerev' => "Nusqa o'shirildi",
'watchlist-details' => "Baqlaw dizimin'izde (sa'wbet betlerin esapqa almag'anda) {{PLURAL:$1|1 bet|$1 bet}} bar.",
-'wlheader-enotif' => "* E-mail arqalı eskertiw qosılg'an.",
+'wlheader-enotif' => "E-mail arqalı eskertiw qosılg'an.",
'watchlistcontains' => "Sizin' baqlaw dizimin'izde {{PLURAL:$1|1 bet|$1 bet}} bar.",
'wlnote' => "To'mende aqırg'ı {{PLURAL:$2|saattag'ı|'''$2''' saattag'ı}} {{PLURAL:$1|aqırg'ı o'zgeris bar|aqırg'ı '''$1''' o'zgeris bar}}.",
'wlshowlast' => "Aqırg'ı $1 saat, $2 ku'n, $3 ko'rset",
@@ -1610,8 +1580,6 @@ Basqa bloklawlar ushın [[Special:BlockList|IP bloklaw dizimin]] ko'rip shıg'ı
'block-log-flags-noemail' => "e-mail bloklang'an",
'ipb_expiry_invalid' => "Ku'shin joytıw waqtı nadurıs.",
'ipb_already_blocked' => '"$1" a\'lle qashan bloklang\'an',
-'proxyblocker-disabled' => "Bul funktsiya o'shirilgen.",
-'proxyblocksuccess' => 'Tamamlandı.',
# Developer tools
'lockdb' => "Mag'lıwmatlar bazasın qulpla",
@@ -1829,7 +1797,7 @@ Eger fayl jaratılg'anınan keyin o'zgertilgen bolsa, geybir parametrleri o'zger
* gpslongitude
* gpsaltitude",
-# EXIF tags
+# Exif tags
'exif-imagewidth' => 'Yeni:',
'exif-imagelength' => "Uzunlıg'ı",
'exif-imagedescription' => "Su'wret ataması",
@@ -1932,9 +1900,6 @@ Bul tastıyıqlaw kodının' pitetug'ın waqtı: $4.",
# Special:Version
'version' => "MediaWikidin' nusqası",
-# Special:FilePath
-'filepath' => 'Fayl jolı',
-
# Special:SpecialPages
'specialpages' => 'Arnawlı betler',
'specialpages-group-users' => "Paydalanıwshılar ha'm olardın' huqıqları",
diff --git a/languages/messages/MessagesKab.php b/languages/messages/MessagesKab.php
index 33a9490a..27bff4d7 100644
--- a/languages/messages/MessagesKab.php
+++ b/languages/messages/MessagesKab.php
@@ -73,9 +73,6 @@ $messages = array(
'tog-shownumberswatching' => 'Ssken geddac yellan n yimseqdacen iɛessasen',
'tog-oldsig' => 'Azmul yellan :',
'tog-fancysig' => 'ǧǧ azmul am yettili (war azday awurman)',
-'tog-externaleditor' => 'Sseqdec ambeddel n berra d ameslugen',
-'tog-externaldiff' => 'Sseqdec ambeddel n berra iwakken ad ẓreɣ imgerraden',
-'tog-showjumplinks' => 'Eǧǧ izdayen "neggez ar"',
'tog-uselivepreview' => 'Sseqdec pre-timeẓriwt taǧiḥbuṭ (JavaScript) (Experimental)',
'tog-forceeditsummary' => 'Ini-iyi-d mi sskecmeɣ agzul amecluc',
'tog-watchlisthideown' => 'Ffer ibeddlen inu seg wumuɣ n uɛessi inu',
@@ -88,6 +85,7 @@ $messages = array(
'tog-diffonly' => 'Ur temliá¸-iyi-d ara ayen yellan seddaw imgerraden',
'tog-showhiddencats' => 'BeqqeḠtaggayin yeffren',
'tog-norollbackdiff' => 'Ur beqqeḠara "diff" ma yella usemmet',
+'tog-useeditwarning' => 'Σeggen iyid mi ara fγaγ seg usebter mebla ma skeslaγ ibeddilen.',
'underline-always' => 'Daymen',
'underline-never' => 'Abaden',
@@ -273,7 +271,7 @@ $1',
'pool-queuefull' => 'Adras n umahil yeÄuá¹›',
'pool-errorunknown' => 'Anezri warisem',
-# 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).
+# 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).
'aboutsite' => 'Awal ɣef {{SITENAME}}',
'aboutpage' => 'Project:Awal ɣef...',
'copyright' => 'TzemreḠad twaliḠayen yella deg $1.',
@@ -283,7 +281,6 @@ $1',
'disclaimers' => 'IÉ£talen',
'disclaimerpage' => 'Project:IÉ£talen',
'edithelp' => 'Tallat deg ubeddel',
-'edithelppage' => 'Help:Abeddel',
'helppage' => 'Help:Agbur',
'mainpage' => 'Asebter amenzawi',
'mainpage-description' => 'Asebter amenzawi',
@@ -356,17 +353,6 @@ $1',
# General errors
'error' => 'Agul',
'databaseerror' => 'Agul n database',
-'dberrortext' => 'Yella ugul n tseddast deg database.
-Waqila yella bug deg software.
-Query n database taneggarut hatt:
-<blockquote><tt>$1</tt></blockquote>
-seg tawuri "<tt>$2</tt>".
-MySQL yerra-d agul "<tt>$3: $4</tt>".',
-'dberrortextcl' => 'Yella ugul n tseddast deg database.
-Query n database taneggarut hatt:
-"$1"
-seg tawuri "$2".
-MySQL yerra-d agul "$3: $4"',
'laggedslavemode' => 'Aɣtal: Ahat asebter ur yesɛi ara akk ibeddlen imaynuten.',
'readonly' => 'Database d tamsekkert',
'enterlockreason' => 'Ini ayɣer tsekkreḠdatabase, ini daɣen melmi ara ad ifukk asekker',
@@ -418,7 +404,6 @@ Query: $2',
'viewyourtext' => 'TzemṛeḠad ẓṛeḠdɣa ad nɣeleḠagbur n "ibeddlen inek/inem" deg usebter agi :',
'protectedinterface' => 'Asebter-agi d amsekker axaá¹­er yettuseqdac i weá¸ris n software.',
'editinginterface' => "'''AÉ£tal:''' Aqla-k tettbeddileḠasebter i yettuseqdac i weá¸ris n software. Tagmett n software i tt-ẓren yimseqdacen wiyaḠad tbeddel akk d ibeddlen inek.",
-'sqlhidden' => '(Query n SQL tettwaffer)',
'cascadeprotected' => 'Asebter-agi yegdel axaṭer yettusekcem deg {{PLURAL:$1|asebter yegdelen agi|isebtar yegdelen agi}} s Taxtiṛit « amesten s uceṛcuṛ » isermeden :
$2',
'namespaceprotected' => "Ur tesɛiḠara turagt iwakken ad beddeleḠisebtar n tallunt n isemawen \"'''\$1'''\".",
@@ -449,7 +434,6 @@ Kra n isebtar zemren ad sskanen belli mazal-ik s yisem n wemseqdac inek armi tem
'yourpassword' => 'Awal n tbaá¸nit',
'yourpasswordagain' => 'Æiwed ssekcem awal n tbaá¸nit',
'remembermypassword' => 'Cfu É£ef wawal n tbaá¸nit inu di uselkim-agi (i afellay n $1 {{PLURAL:$1|ass|ussan}})',
-'securelogin-stick-https' => 'Qqim uqqin s HTTPS sakin tuqqna',
'yourdomainname' => 'Taɣult inek',
'password-change-forbidden' => 'Ur zemreḠara ad beddeleḠawalen n uɛaddi ɣef uwiki agi.',
'externaldberror' => 'Yella ugul aberrani n database neɣ ur tettalaseḠara ad tbeddleḠisem an wemseqdac aberrani inek.',
@@ -542,7 +526,7 @@ Ilaq ad rǧuḠciá¹­aḥ uqbel ad É›erdeḠtikkelt nniá¸en.',
'newpassword' => 'Awal n tbaá¸nit amaynut:',
'retypenew' => 'Æiwed ssekcem n tbaá¸nit amaynut:',
'resetpass_submit' => 'Eg awal n tbaá¸nit u kcem',
-'resetpass_success' => 'Awal n tbaá¸nit yettubeddel! Qrib ad tkecmeá¸...',
+'changepassword-success' => 'Awal n tbaá¸nit yettubeddel! Qrib ad tkecmeá¸...',
'resetpass_forbidden' => 'Ur zemreḠara ad beddeleḠawalen n uɛaddi',
'resetpass-no-info' => 'Ilaq ad qqeneḠiwakken ad ẓṛeḠasebter agi.',
'resetpass-submit-loggedin' => 'Beddel awal n uɛaddi',
@@ -553,10 +537,8 @@ Ahat ilaq ad beddeleḠawal ik/im n uɛaddi naɣ ad ssutereḠawal n uɛaddi a
# Special:PasswordReset
'passwordreset' => 'Awennez tikkelt nniá¸en n awal uÉ›addi',
-'passwordreset-text' => 'ÄŒÄur tiferkit agi iwakken ad eá¹­á¹­feḠtirawt n usmekti deg-es tilÉ£a n umiá¸an inek/inem.',
'passwordreset-legend' => 'Awennez tikkelt nniá¸en n awal uÉ›addi',
'passwordreset-disabled' => 'Awennez n awal uɛaddi yensa deg uwiki agi.',
-'passwordreset-pretext' => '{{PLURAL:$1||Sekcem aferdis n isefka ddaw agi}}',
'passwordreset-username' => 'Isem n useqdac',
'passwordreset-domain' => 'Talɣut :',
'passwordreset-capture' => 'Ẓeṛ tirawt ?',
@@ -1017,7 +999,6 @@ TzemreḠad affeḠtilɣa deg [{{fullurl:{{#Special:Log}}/delete|page={{FULLPA
'searchmenu-legend' => 'Tixtiá¹›iyin n unadi',
'searchmenu-exists' => "'''Yella asebter s isem \"[[:\$1]]\" deg wiki agi.'''",
'searchmenu-new' => "'''Snulfud asebter « [[:$1|$1]] » deg wiki agi !'''",
-'searchhelp-url' => 'Help:Agbur',
'searchmenu-prefix' => '[[Special:PrefixIndex/$1|Nadi isebtar i zwaren s adat agi]]',
'searchprofile-articles' => 'Isebtar n ugbur',
'searchprofile-project' => 'Isebtaren n tallat dɣa n usenfa',
@@ -1060,15 +1041,6 @@ TzemreḠad affeḠtilɣa deg [{{fullurl:{{#Special:Log}}/delete|page={{FULLPA
'search-external' => 'Anadi yeffɣen',
'searchdisabled' => 'Anadi deg {{SITENAME}} yettwakkes. TzemreḠad tnadiḠs Google. Meɛna ur tettuḠara, tasmult n google taqdimt.',
-# Quickbar
-'qbsettings' => 'Tanuga taǧiḥbuṭ',
-'qbsettings-none' => 'Ulac',
-'qbsettings-fixedleft' => 'Aẓelmaá¸',
-'qbsettings-fixedright' => 'Ayeffus',
-'qbsettings-floatingleft' => 'Tufeg aẓelmaá¸',
-'qbsettings-floatingright' => 'Tufeg ayeffus',
-'qbsettings-directionality' => 'Usbiá¸, É£ef wayen n unamud n tira n tutlayt ik/im',
-
# Preferences page
'preferences' => 'Isemyifiyen',
'mypreferences' => 'Isemyifiyen inu',
@@ -1101,7 +1073,6 @@ TzemreḠad affeḠtilɣa deg [{{fullurl:{{#Special:Log}}/delete|page={{FULLPA
'resetprefs' => 'AsfeḠn ibeddilen ur ḥrezen ara',
'restoreprefs' => 'Err akkw azalen s lexá¹£as',
'prefs-editing' => 'Abedddil',
-'prefs-edit-boxsize' => 'Lqedd n usfaylu n ubeddel.',
'rows' => 'Ijerriá¸en:',
'columns' => 'Tigejda:',
'searchresultshead' => 'Anadi',
@@ -1112,9 +1083,6 @@ TzemreḠad affeḠtilɣa deg [{{fullurl:{{#Special:Log}}/delete|page={{FULLPA
'recentchangesdays-max' => 'Afellay $1 {{PLURAL:$1|ass|ussan}}',
'recentchangescount' => 'Amá¸an n ibeddilen i ubeqqeḠs lexá¹£as :',
'prefs-help-recentchangescount' => 'Wagi yesɛa deg-es ibeddilen ineggura, isebtar n umezruy d iɣmisen.',
-'prefs-help-watchlist-token' => 'ÄŒÄuá¹› taÉ£zut agi s azal lbaá¸na dÉ£a asuddem RSS ad yetwarew i umuÉ£ inek/inem n uÉ›assi.
-Akkw amdan yesnen tiddest agi ad yezmer ad i ɣeṛ umuɣ inek/inem n uɛassi, ihi ilaq ad xtiṛeḠazal yegdelen.
-Ha-t-an azal agacuran i tzemreḠad seqdeceḠ: $1',
'savedprefs' => 'Isemyifiyen inek yettusmektan.',
'timezonelegend' => 'Iẓá¸i n ukud :',
'localtime' => 'Asrag adigan :',
@@ -1145,7 +1113,6 @@ Ha-t-an azal agacuran i tzemreḠad seqdeceḠ: $1',
'prefs-reset-intro' => 'TzemreḠad seqdeceḠasebter agi iwakken ad erreḠiɣewwaren inek/inem ar azalen n lexṣas n usmel.
Wagi ur yezmer ara ad yetwekkes.',
'prefs-emailconfirm-label' => 'Aragag n tirawt :',
-'prefs-textboxsize' => 'Tiddi n usfaylu n ubeddel',
'youremail' => 'E-mail *:',
'username' => 'Isem n wemseqdac:',
'uid' => 'Amseqdac ID:',
@@ -1383,7 +1350,6 @@ Ur ilaq ara ad i sɛu ugar n $1 {{PLURAL:$1|asekkil|isekkilen}}.',
'recentchangeslinked-feed' => 'Ibeddlen imaynuten n isebtar myezdin',
'recentchangeslinked-toolbox' => 'Ibeddlen imaynuten n isebtar myezdin',
'recentchangeslinked-title' => 'Tiá¸efri n isebtaren iqqenen ar « $1 »',
-'recentchangeslinked-noresult' => 'Ulac abeddel deg isebtar myezdin deg tawala i textareá¸.',
'recentchangeslinked-summary' => "Asebter uslig agi i sekned ibeddlen imaynuten É£ef isebtaren iqqenen. Isebtaren n [[Special:Watchlist|umuÉ£ n uá¸far]] llan s '''ufuyan'''.",
'recentchangeslinked-page' => 'Isen n usebter :',
'recentchangeslinked-to' => 'BeqqeḠibeddilen n isebtareb i sɛan azday ɣer asebter nni wala anemgal',
@@ -1607,7 +1573,6 @@ I taɣellist tameqqṛant, img_auth.php yensa.',
'http-read-error' => 'Anezri n taɣuri HTTP.',
'http-timed-out' => 'Tuttra HTTP teneffeá¹›.',
'http-curl-error' => 'Anezri deg tiririt n URL : $1',
-'http-host-unreachable' => 'Ulamek an siá¸es URL',
'http-bad-status' => 'Yella ugur deg tuttra HTTP : $1 $2',
# Some likely curl errors. More could be added from <http://curl.haxx.se/libcurl/c/libcurl-errors.html>
@@ -1756,12 +1721,6 @@ Ur tettuḠara ad selkeneḠma ur llan ara izdayen nniá¸en É£er tilÉ£atin uqb
'statistics-users-active-desc' => 'Iseqdacen yesɛan xersum yiwet tigawt seg {{PLURAL:$1|ass agi aneggaru|$1 ussan agi ineggura}}',
'statistics-mostpopular' => 'isebtar mmeẓren aṭṭas',
-'disambiguations' => 'Isebtar yesɛan izdayen ɣer isebtar n tiynisemt',
-'disambiguationspage' => 'Template:Asefham',
-'disambiguations-text' => "Isebtar agi azday ɣer '''asebter n tiynisemt'''.
-Ilaq ad sɛun azday ɣer amagrad amellay.<br />
-Asebter yella d asebter n tiynisemt lukan yetseqdac talɣa i qqenen ar [[MediaWiki:Disambiguationspage]]",
-
'doubleredirects' => 'AsemmimeḠyeá¸ra snat tikwal',
'doubleredirectstext' => 'Mkull ajerriḠyesÉ›a azday É£er asmimeḠamezwaru akk d wis sin, ajerriḠamezwaru n uá¸ris n usebter wis sin daÉ£en, iwumi yefkan asmimeḠṣaḥiḥ i yessefk ad sÉ›an isebtar azday É£ur-s.',
'double-redirect-fixed-move' => 'Alsanamud agi, É£ef ayed asaá¸as [[$1]] yetwebeddel isem, yetawi tura É£er [[$2]].',
@@ -2010,10 +1969,9 @@ Ma tebɣiḠad tekkseḠasebter seg wumuɣ n uɛessi inek, wekki ɣef \"Fakk a
'unwatchthispage' => 'Fakk aɛassi',
'notanarticle' => 'MaÄÄi d amagrad',
'notvisiblerev' => 'Lqem tetwemḥa',
-'watchnochange' => 'Ulaḥedd n yiferdas n wumuÉ£ n uÉ›essi inek ma yettubeddel deg tawala i textareá¸.',
'watchlist-details' => 'ttɛassaɣ {{PLURAL:$1|$1 usebter|$1 n isebtaren}} mebla isebtaren "amyannan".',
-'wlheader-enotif' => '* Yeǧǧa Email n talɣut.',
-'wlheader-showupdated' => "* Isebtar ttubeddlen segwasmi tkecmeḠtikelt taneggarut ttbanen-d s '''uá¸ris aberbuz'''",
+'wlheader-enotif' => 'Yeǧǧa Email n talɣut.',
+'wlheader-showupdated' => "Isebtar ttubeddlen segwasmi tkecmeḠtikelt taneggarut ttbanen-d s '''uá¸ris aberbuz'''",
'watchmethod-recent' => 'yessenqed ibeddlen imaynuten n isebtar i ttɛasseɣ',
'watchmethod-list' => 'yessenqed isebtar i ttɛassaɣ i ibeddlen imaynuten',
'watchlistcontains' => 'Umuɣ n uɛessi inek ɣur-s $1 n {{PLURAL:$1|usebter|isebtar}}.',
@@ -2281,7 +2239,6 @@ Asekcem aneggaru n useklas n ikyafen yella ddaw agi :',
'block-log-flags-anononly' => 'Imseqdacen udrigen kan',
'block-log-flags-nocreate' => 'asnulfu n umiá¸an yessegdel',
'proxyblockreason' => 'Tansa n IP inek teɛkel axaṭer nettat "open proxy". G leɛnayek, meslay akk d provider inek.',
-'proxyblocksuccess' => 'D ayen.',
'sorbsreason' => 'Tansa IP inek/inem tella deg yiwen umuɣ am "open proxy" deg DNSBL yettuseqdac deg {{SITENAME}}.',
'sorbs_create_account_reason' => 'Tansa IP inek/inem tella deg yiwen umuɣ am "open proxy" deg DNSBL yettuseqdac deg {{SITENAME}}.
Ur tezmireḠara ad snulfuḠamiá¸an.',
@@ -2541,6 +2498,19 @@ Lukan a t-tesseqdceḠyezmer ad yexsser aselkim inek/inem.",
'ago' => '$1 aya',
'just-now' => 'Tura kan',
+# Human-readable timestamps
+'hours-ago' => '$1 {{PLURAL:$1|asrag|isragen}} aya',
+'minutes-ago' => '$1 {{PLURAL:$1|tamrect|timercin}} aya',
+'seconds-ago' => '$1 {{PLURAL:$1|tasint|tisinin}} aya',
+'monday-at' => 'Arim af $1',
+'tuesday-at' => 'Aram af $1',
+'wednesday-at' => 'Ahad af $1',
+'thursday-at' => 'Amhad af $1',
+'friday-at' => 'Sem af $1',
+'saturday-at' => 'Sed af $1',
+'sunday-at' => 'Acer af $1',
+'yesterday-at' => 'Iá¸elli af $1',
+
# Bad image list
'bad_image_list' => 'Amasal d-wagi :
@@ -2567,7 +2537,7 @@ Izdayen nniá¸en É£ef yiwen ajerriḠllan d tisuraf, am isebtar É£ef anta tugna
* gpslongitude
* gpsaltitude',
-# EXIF tags
+# Exif tags
'exif-imagewidth' => 'Tehri',
'exif-imagelength' => 'Taɣwzi',
'exif-bitspersample' => 'Ibitten s isger',
@@ -2982,11 +2952,6 @@ G leɛnaya-k sentem belli ṣaḥḥ tebɣiḠad tɛiwedeḠaxlaq n usebter-ag
'version-entrypoints-header-entrypoint' => 'Ired n wekcam',
'version-entrypoints-header-url' => 'Tansa URL',
-# Special:FilePath
-'filepath' => 'Abrid n wadduf ufaylu',
-'filepath-page' => 'Afaylu :',
-'filepath-submit' => 'Ruḥ',
-
# Special:SpecialPages
'specialpages' => 'isebtar usligen',
diff --git a/languages/messages/MessagesKbd_cyrl.php b/languages/messages/MessagesKbd_cyrl.php
index 85b046d3..05dddd7d 100644
--- a/languages/messages/MessagesKbd_cyrl.php
+++ b/languages/messages/MessagesKbd_cyrl.php
@@ -84,9 +84,6 @@ $messages = array(
'tog-shownumberswatching' => 'ÐапÑкӀуÑцӀыр Ñ Ñ‚Ñ…Ñ‹Ð»ÑŠ кӀÑлъыплъыгъуÑÑ…Ñм Ñ…ÑзгъÑхьахÑм Ñ Ð±Ð¶Ñ‹Ð³ÑŠÑÑ€ гъÑлъÑгъуÑн',
'tog-oldsig' => 'Ó€ÑпÑщӀÑдз щыӀÑм и ÑпÑ-еплъ',
'tog-fancysig' => 'Викитхылъ Ó€ÑпÑщӀÑдз Ӏыгъын (Ð°Ð²Ñ‚Ð¾Ð¼Ð°Ñ‚Ð¸ÐºÑ Ñ‚ÐµÑ…ÑŒÑпӀÑншу)',
-'tog-externaleditor' => 'Ð¥Ñмыт редакторыр къÑгъÑÑÑбÑпын (компутырым абым теухуа тегъÑпÑÑ‹Ñ…ÑŒÑ‹Ð³ÑŠÑƒÑ Ñ…ÑƒÑныкъуÑ)',
-'tog-externaldiff' => 'Ð¥Ñмыт программÑÑ€ къÑгъÑÑÑбÑпын зÑгъÑлъытÑн шъхьÑÐºÓ€Ñ (компутырым абым теухуа тегъÑпÑÑ‹Ñ…ÑŒÑ‹Ð³ÑŠÑƒÑ Ñ…ÑƒÑныкъуÑ)',
-'tog-showjumplinks' => 'ДÑÓ€ÑпыкъуÑгъу техьÑÐ¿Ó€Ñ Â«Ñ‚ÐµÑ…ÑŒÑн» Ñ…ÑгъÑнÑн',
'tog-uselivepreview' => 'ЯпÑ-еплъ щӀÑÑ…Ñ‹Ñ€ къÑгъÑÑÑбÑпын (JavaScript хуÑныкъуÑ) (ÑкÑперементалу)',
'tog-forceeditsummary' => 'КъÑӀохун, гъÑÑ‚ÑÑ€ÑзыгъуÑм и тепÑÑлъыхьыпӀÑм зыри имытхамÑ',
'tog-watchlisthideown' => 'КӀÑÐ»ÑŠÑ‹Ð¿Ð»ÑŠÑ‹Ð³ÑŠÑƒÑ Ñ‚Ñ…Ñ‹Ð»ÑŠÑ‹Ð¼ гъÑпшкIуÑн Ñи гъÑÑ‚ÑÑ€ÑзыгъуÑÑ…ÑÑ€',
@@ -284,7 +281,7 @@ $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).
+# 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).
'aboutsite' => '{{grammar:genitive|{{SITENAME}}}} -м теухуауÑ',
'aboutpage' => 'Project:ТеухуауÑ',
'copyright' => 'Мыбы итыр къÑутӀыпщащ зытещӀыхьари: $1.',
@@ -294,7 +291,6 @@ $1',
'disclaimers' => 'ЖÑуап Ӏыгъыныр зыщхьÑщыхын',
'disclaimerpage' => 'Project:ПщÑрылъу къÑмыштÑн',
'edithelp' => 'ГъÑÑ‚ÑÑ€Ñзыным и щӀÑупщӀÑ',
-'edithelppage' => 'Help:ГъÑÑ‚ÑÑ€Ñзыным и дÑIÑпыкъуÑгъу',
'helppage' => 'Help:ДÑÓ€ÑпыкъуÑгъу',
'mainpage' => 'ÐапÑкӀуÑцӀ нÑхъыщхьÑ',
'mainpage-description' => 'ÐапÑкӀуÑцӀ нÑхъыщхьÑ',
@@ -367,17 +363,6 @@ URL щиптхÑм Ñ…ÑукъуÑÐ³ÑŠÑƒÑ Ð±Ñ‹Ñ‰Ó€Ð° хъунщ Ð¸Ñ Ñ‚ÐµÑ…ÑпÓ
# 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' => 'ТеубыдÑгъуÑÑ€ къызхÑÐºÓ€Ð°Ð¼Ñ€Ñ Ð·Ñман зÑрекӀуÑÐºÓ€Ñ‹Ð½ÑƒÐ¼Ñ€Ñ ÐºÑŠÑӀоху.',
@@ -428,7 +413,6 @@ $1',
'editinginterface' => "'''Гу лъытÑ:''' БгъÑÑ‚ÑÑ€Ñз напÑкӀуÑцӀым интерфÑÐ¹Ñ Ñ‚Ñ…Ñ‹Ð»ÑŠ Ñ…Ñтщ, программÑтыгъÑм еуÑ.
И зÑхъуÑкӀыгъуÑм интерфÑйÑым и ÑурÑтым Ñ…ÑуÑну адрей цӀыхухÑÑ‚Ñ…Ñм щхьÑкӀÑ.
ЗÑдзÑкӀыным шъхьÑÐºÓ€Ñ ÐºÑŠÑбгъÑÑÑбÑпыну нÑхъыфӀыр [//translatewiki.net/wiki/Main_Page?setlang=ru translatewiki.net], MediaWiki-м и локализациÑм и проÑктщ.",
-'sqlhidden' => '(SQL щӀÑупщӀÑгъуÑÑ€ гъÑлъÑгъуакъым)',
'cascadeprotected' => 'ЗÑхъуÑкӀыныгъÑм Ñ‰Ñ‹Ñ…ÑŠÑƒÐ¼Ð°ÑƒÑ Ñ‰Ñ‹Ñ‚ напÑкӀуÑцӀыр, Ñ…ÑгъÑÑ…ÑŒÐ°ÑƒÑ Ñ‰Ñ‹Ñ‚ {{PLURAL:$1|ÑÑƒÐ¶ÐºÓ€Ñ Ð½Ð°Ð¿ÑкӀуÑцӀ итым| ÑÑƒÐ¶ÐºÓ€Ñ Ð½Ð°Ð¿ÑкӀуÑцӀ итхÑм}} каÑкад хъумÑныгъÑм:
$2',
'namespaceprotected' => "ÐŸÓ€Ð°Ð»ÑŠÑ ÑƒÐ¸Ó€Ñкъым напÑкӀуÑцӀ '''$1''' Ñ…ÑÑ‚Ñ…ÑÑ€ бгъÑÑ‚ÑÑ€Ñзын.",
@@ -450,7 +434,6 @@ $2',
'yourpassword' => 'ПÑролыр:',
'yourpasswordagain' => 'Иджыри Ð·Ñ Ð¿Ñролыр:',
'remembermypassword' => 'СызÑрихьÑÑ€ компьютерым щыIыгъын (махуÑу $1 {{PLURAL:$1|щIимыгъуу|щIимыгъуу}})',
-'securelogin-stick-https' => 'HTTPS -Ð¼ÐºÓ€Ñ Ð¸Ñ…ÑŒÐ° нÑужми ирилÑжьÑн',
'yourdomainname' => 'Уи доменыр:',
'externaldberror' => 'ЩÑуÑÐ³ÑŠÑƒÑ Ñ…ÑŠÑƒÐ°, Ð°ÑƒÑ‚ÐµÐ½Ñ‚Ð¸Ñ„Ð¸ÐºÐ°Ñ†Ð¸Ñ Ñ‰ÐµÐºÓ€ÑƒÑкӀым Ð¸Ñ Ð°Ð¿Ñ…ÑƒÑдиз Ð¿Ó€Ð°Ð»ÑŠÑ ÑƒÐ¸Ó€Ñƒ щыткъым, уи нÑÐºÑƒÐ³ÑŠÑƒÑ Ð°ÐºÐºÐ°ÑƒÐ½Ñ‚Ñ‹Ñ€ зÑпхъуÑкӀын.',
'login' => 'СиÑтемÑм зыкъегъÑцIыхуын',
@@ -550,7 +533,7 @@ $2',
'newpassword' => 'ПаролыщIÑÑ€:',
'retypenew' => 'ПаролыщIÑÑ€ Ð¸Ð´Ð¶Ñ‹Ñ€Ñ Ð·Ñ Ð¸Ñ‚Ñ…Ñж:',
'resetpass_submit' => 'Паролыр итхи ихьÑ',
-'resetpass_success' => 'Уи паролыр хъуÑжа хъуащ! ИджыпÑту ÑиÑтемÑм йохьÑ...',
+'changepassword-success' => 'Уи паролыр хъуÑжа хъуащ! ИджыпÑту ÑиÑтемÑм йохьÑ...',
'resetpass_forbidden' => 'Паролыр зÑхъуÑкӀа хъунукъым',
'resetpass-no-info' => 'Мы напÑкӀуÑцӀым уелÑжьыным щхьÑÐºÓ€Ñ ÑиÑтемÑм зыкъебгъÑцӀыхун хуÑй.',
'resetpass-submit-loggedin' => 'Паролыр зÑхъуÑкӀын',
@@ -1004,7 +987,6 @@ $1",
'prefs-email' => 'Ð­Ð»ÐµÐºÑ‚Ñ€Ð¾Ð½Ñ Ð¿Ð¾Ñ‡Ñ‚Ñм и опциÑÑ…ÑÑ€',
'prefs-rendering' => 'СурÑÑ‚Ñ‹Ñ€',
'prefs-editing' => 'ГъÑÑ‚ÑÑ€ÑзыгъуÑ',
-'prefs-edit-boxsize' => 'ГъÑÑ‚ÑÑ€ÑзыгъуÑм и нÑкӀубгъум и инагъыр',
'searchresultshead' => 'КъÑгъуÑтын',
# Groups
diff --git a/languages/messages/MessagesKg.php b/languages/messages/MessagesKg.php
index 57caf22a..7c987aee 100644
--- a/languages/messages/MessagesKg.php
+++ b/languages/messages/MessagesKg.php
@@ -11,6 +11,19 @@
* @author לערי ריינה×רט
*/
+$namespaceNames = array(
+ NS_TALK => 'Disolo',
+ NS_USER => 'Kisadi',
+ NS_USER_TALK => 'Disolo_kisadi',
+ NS_PROJECT_TALK => 'Disolo_$1',
+ NS_FILE => 'Fisye',
+ NS_FILE_TALK => 'Disolo_fisye',
+ NS_HELP => 'Lusadisu',
+ NS_HELP_TALK => 'Disolo_lusadisu',
+ NS_CATEGORY => 'Kalasi',
+ NS_CATEGORY_TALK => 'Disolo_kalasi',
+);
+
$messages = array(
'underline-always' => 'Bambala nyonso',
'underline-never' => 'Ata mbala mosi ve',
diff --git a/languages/messages/MessagesKhw.php b/languages/messages/MessagesKhw.php
index b8a1b062..b9c67607 100644
--- a/languages/messages/MessagesKhw.php
+++ b/languages/messages/MessagesKhw.php
@@ -11,7 +11,6 @@
*/
$fallback = 'ur';
-
$rtl = true;
$messages = array(
@@ -45,9 +44,6 @@ $messages = array(
'tog-shownumberswatching' => 'لوڑاک ممبرانن تعدادان پشاؤے',
'tog-oldsig' => 'Ù…ÙˆØ¬ÙˆØ¯Û Ø¯Ø³ØªØ®Ø·Ùˆ نمائش:',
'tog-fancysig' => '(Ø³Ø§Ø¯Û Ø¯Ø³Ø®Ø· بلا خودکار ربط)',
-'tog-externaleditor' => 'ÛÙ…ÛŒØ´Û Ø¨ÛŒØ±ÙˆÙ†ÛŒ تدوین کار استعمال کورے (صرÙÛŒ ماÛرینن بچے، ھمو بچے کمپیوٹرا خاص ترتیبات درکار بونیان)',
-'tog-externaldiff' => 'ÛÙ…ÛŒØ´Û Ø¨ÛŒØ±ÙˆÙ†ÛŒ تدوین کار استعمال کورے (صرÙÛŒ ماÛرینن بچے، ھمو بچے کمپیوٹرا خاص ترتیبات درکار بونیان)',
-'tog-showjumplinks' => 'Ú¾ÛŒÛ ÙˆÙˆØ´Ú©ÛŒ څروٹھاوے',
'tog-uselivepreview' => 'براÛ٠راست نمائش استعمال کورے (JavaScript ضرورت بوی)',
'tog-forceeditsummary' => 'کیاوتکی آوا ترمیمی خلاصو خالی پیڅھیتام تھے متے لو دیت',
'tog-watchlisthideown' => 'زیرÙنظرÙÛØ±Ø³ØªÛ Ù…Û ØªØ±Ù…ÛŒÙ…Ø§ØªÙ† کھوشاوے',
@@ -240,7 +236,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).
+# 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).
'aboutsite' => 'تعار٠{{SITENAME}}',
'aboutpage' => 'Project:کھوار ویکیپیڈیو تعارÙ',
'copyright' => 'تمام مواد $1 ØªØ­ØªÛ Ù…ÛŒØ§Ù†Ø³Ø§Ø± شیر',
@@ -250,7 +246,6 @@ $1',
'disclaimers' => 'اعلانات',
'disclaimerpage' => 'Project:عام کھوار اعلان',
'edithelp' => 'مدد براۓ ترمیم',
-'edithelppage' => 'Help:ترمیم',
'helppage' => 'Help:Ùھرست',
'mainpage' => 'آویلو صÙØ­Û',
'mainpage-description' => 'سرورق',
@@ -278,7 +273,6 @@ $1',
'newmessagesdifflink' => 'تـجـدیـد مـاقـبل آخـراری Ùـرق',
'youhavenewmessagesmulti' => 'Ø¡$1 ØªÛ Ø¨Ú†Û’ نوغ نوغ پیغامات شینی',
'editsection' => 'ترمیم',
-'editsection-brackets' => '[$1]',
'editold' => 'ترمیم',
'viewsourceold' => 'مآخذو لوڑے',
'editlink' => 'تدوین کورے',
@@ -326,17 +320,6 @@ $1 (صÙØ­Û Ù…ÙˆØ¬ÙˆØ¯ نیکی)',
# General errors
'error' => 'Error/خطاء',
'databaseerror' => 'خطائے ڈیٹابیس',
-'dberrortext' => 'ÚˆÛŒÙ¹Ø§Ø¨ÛŒØ³Û Ø§ÛŒ خطائے نحوی واقع بیتی شیر.
-ھمو وجھین مصنع‌لطیÙا چاریو نشاندÛیو Ø§Ù†Ø¯ÛŒØ´Û Ø´ÛŒØ±.
-Ø¢Ú†Ú¾Ùˆ Ø³Ø¹ÛŒâ€ŒØ´Ø¯Û ÚˆÛŒÙ¹Ø§Ø¨ÛŒØ³ÛŒ استÙØ³Ø§Ø±Û Ú¾ÛŒÛ Ø§ÙˆØ´ÙˆÛŒ:
-<blockquote><tt>$1</tt></blockquote>
-Ùعلیتو موژار "<tt>$2</tt>".
-MySQL خطائی جواب پرائے "<tt>$3: $4</tt>".',
-'dberrortextcl' => 'ڈیٹابیسو استÙØ³Ø§Ø±Û Ø§ÛŒ خطائے نحوی واقع بیتی شیر.
-Ø¢Ú†Ú¾Ùˆ Ø³Ø¹ÛŒâ€ŒØ´Ø¯Û ÚˆÛŒÙ¹Ø§Ø¨ÛŒØ³ÛŒ استÙØ³Ø§Ø±Û Ú¾ÛŒÛ Ø§ÙˆØ´ÙˆÛŒ:
-"$1"
-"$2" Ùعلیتو موژار.
-MySQL جواب٠خطاء پرائے "$3: $4"',
'laggedslavemode' => 'Warning: Page may not contain recent updates.
خبردار: منکھن شیر Ú©Û ØµÙØ­Ûا Ù…ÙˆØ¬ÙˆØ¯Û Ø¨ØªØ§Ø±ÛŒØ®Û Ø¬Ø§Øª شامل نو بونی',
'readonly' => 'ڈیٹابیسا قل٠لیگی شیر',
@@ -380,7 +363,6 @@ MySQL جواب٠خطاء پرائے "$3: $4"',
'protectedinterface' => 'Ú¾ÛŒÛ ØµÙØ­Û Ù…ØµÙ†Ø¹â€ŒÙ„Ø·ÛŒÙÙˆ بچے سطح‌البینی متن ÙراÛÙ… کورویان، وا ناجائزاستعمالو سدÙبابو بچے ھمو قل٠لیگینو بیتی شیر',
'editinginterface' => "\"'''خبردار:''' تو ای ھش صÙØ­ÛÙˆ تدوینو کوروسان Ú©Û Ú¾ÛŒÛ Ù…ØµÙ†Ø¹â€ŒÙ„Ø·ÛŒÙÙˆ بچے سطح‌البینی متن ÙراÛÙ… کورویان۔ Ú¾ÛŒÛ ØµÙØ­Ûا کاردو ترمیم، دیگر ممبارانن بچے سطح‌البینو تبدیل کوروی۔
براÛ٠کرم، ØªØ±Ø¬Ù…Û Ú©ÙˆØ±ÛŒÚ©Ùˆ بچے [//translatewiki.net/wiki/Main_Page?setlang=en '''بیٹاویکی'''] (میڈیاویکی مقامیانی منصوبو) استعمال کورے.\",",
-'sqlhidden' => '(SQL استÙØ³Ø§Ø±Û Ú©Ú¾ÙˆØ´Øª)',
'namespaceprotected' => "\"تتے '''\$1''' Ùضائے Ù†Ø§Ù…Û ØµÙحاتن تدوینو کوریکو اÙجازت نیکی.\",",
'ns-specialprotected' => 'خاص صÙحاتن تدوین کوریکو اجازت نیکی',
'titleprotected' => 'Ú¾ÛŒÛ Ø¹Ù†ÙˆØ§Ù†Ùˆ [[User:$1|$1]] تخلیق کوریکاری محÙوظ کوری آسور.
@@ -744,7 +726,6 @@ HTML tags لوڑے.',",
'recentchangeslinked' => 'Ù…ØªØ¹Ù„Ù‚Û ØªØ¨Ø¯ÛŒÙ„ÛŒ',
'recentchangeslinked-toolbox' => 'موقعی تبدیلی',
'recentchangeslinked-title' => 'Ù…ØªØ¹Ù„Ù‚Û ØªØ¨Ø¯ÛŒÙ„ÛŒ "$1"',
-'recentchangeslinked-noresult' => 'Ú¾Ù…ÛŒ صÙحا Ù…ÙˆØ¬ÙˆØ¯Û ÙˆØ®ØªÛ Ú©ÛŒÛ ØªØ¨Ø¯ÛŒÙ„ÛŒ نیکی۔',
'recentchangeslinked-summary' => "Ú¾ÛŒÛ Ú¾ØªÛ’ تبدیلیان لسٹ شیر Ú©Û Ú¾ÛŒØªØ§Ù† Ù¾Ú¾ÙˆÚ© مدا پروشٹی ساوزینو بیتی شینی وا Ú¾Û’ صÙحان سوم Ø¬Ø³ØªÛ Ø®ÙˆØ± Ú©ÛŒÛ ØµÙØ­Û Ú†ÙˆÚ©ÛŒ شینی یا Ú©ÛŒÛ Ø®Ø§Øµ Ø²Ù…Ø±Û Ø¬Ø§ØªÙˆ ممبرانن سوم Ú†ÙˆÚ©ÛŒ شینی<br />
ساوزیرو [[Special:Watchlist|موڑا صÙØ­Û]] '''بولڈ''' شینی",
'recentchangeslinked-page' => 'کھوار ویکیپیڈیو منصوبو صÙحو لوڑے',
@@ -785,8 +766,6 @@ HTML tags لوڑے.',",
# Statistics
'statistics' => 'اعداد و شمار',
-'disambiguationspage' => 'سانچÛ: ڈسایمبگ',
-
# Miscellaneous special pages
'nbytes' => '$1 {{PLURAL:$1|بایٹ|بایٹس}}',
'nmembers' => '$1 {{PLURAL:$1|ممبار|ممباران}}',
@@ -1117,10 +1096,6 @@ HTML tags لوڑے.',",
# Core parser functions
'duplicate-defaultsort' => '\'\'\'خبردار:\'\'\' ÚˆÛŒÙالٹ تاڑٰ(نغڑی) "$2" پروشٹیو ÚˆÛŒÙالٹ تاڑا "$1" لیگی شیر۔',
-# Special:FilePath
-'filepath-page' => 'Ùایل',
-'filepath-submit' => 'Go/بوغے',
-
# Special:SpecialPages
'specialpages' => 'اسپیشل صÙØ­Û',
diff --git a/languages/messages/MessagesKiu.php b/languages/messages/MessagesKiu.php
index 9c378808..8ae5a104 100644
--- a/languages/messages/MessagesKiu.php
+++ b/languages/messages/MessagesKiu.php
@@ -82,9 +82,6 @@ $messages = array(
'tog-shownumberswatching' => 'Amorê karberunê şêrkerdoğu bıasne',
'tog-oldsig' => 'Ä°mza mewcude:',
'tog-fancysig' => 'İmza rê mamelê wikimeqaley bıke (bê girewo otomatik)',
-'tog-externaleditor' => 'Editorê teberi standart bıgurene (teyna serba ekspertuno, komputerê sıma de ayarê xusışiy lazımê. [//www.mediawiki.org/wiki/Manual:External_editors Melumato jêdêr.])',
-'tog-externaldiff' => 'Têversanaene pê programê teberi vıraze (teyna serba ekspertuno, komputerê sıma de ayarê xısuşiy lazımê. [//www.mediawiki.org/wiki/Manual:External_editors Melumato jêdêr.])',
-'tog-showjumplinks' => 'Girê "so"y feal ke',
'tog-uselivepreview' => 'Verqayto cande bıgurene (JavaScript) (hona cerrebnayene dero)',
'tog-forceeditsummary' => 'Mı ke xulasa kerde cı vira, hay be mı ser de',
'tog-watchlisthideown' => 'Vurnayisunê mı lista mına şêrkerdişi de wedare',
@@ -180,7 +177,7 @@ $messages = array(
'noindex-category' => 'Pelê bêendeksıni',
'broken-file-category' => 'Peli be gıreunê dosyeunê sıkıtau',
-'linkprefix' => '/^(.*?)([a-zA-Z\\x80-\\xff]+)$/sD',
+'linkprefix' => '/^((?>.*(?<![a-zA-Z\\x80-\\xff])))(.+)$/sD',
'about' => 'Heqa',
'article' => 'Pela tedeesteyu',
@@ -284,7 +281,7 @@ $1',
'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).
+# 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).
'aboutsite' => 'Heqa {{SITENAME}} de',
'aboutpage' => 'Project:Heqa',
'copyright' => 'Zerrek bınê $1 dero.',
@@ -294,7 +291,6 @@ $1',
'disclaimers' => 'Diwanê mesulêti',
'disclaimerpage' => 'Project:Diwanê mesuliyetê bıngey',
'edithelp' => 'PhoÅŸtdariya vurnaiÅŸi',
-'edithelppage' => 'Help:Pele çıturi vurnina',
'helppage' => 'Help:Tedeestey',
'mainpage' => 'Pela Seri',
'mainpage-description' => 'Pela seri',
@@ -319,7 +315,6 @@ $1',
'newmessagesdifflink' => 'vurnaiso peyên',
'youhavenewmessagesmulti' => '$1 de mesacê sımaê newey estê',
'editsection' => 'bıvurne',
-'editsection-brackets' => '[$1]',
'editold' => 'bıvurne',
'viewsourceold' => 'çımey bıvêne',
'editlink' => 'bıvurne',
@@ -369,18 +364,6 @@ Jü lista pelunê vêrdoğu bınê [[Special:SpecialPages|{{int:specialpages}}]]
# General errors
'error' => 'Xeta',
'databaseerror' => 'Xeta panga daeyu',
-'dberrortext' => 'Jü xeta persê cumla panga daeyu de amê meydan.
-Heni aseno ke na xeta nustene de esta.
-Persê panga daeyuno peyên nia bi:
-<blockquote><tt>$1</tt></blockquote>
-ebe gurê zerrê "<tt>$2</tt>"y ra.
-Panga daeyu xetawa ke asnena "<tt>$3: $4</tt>".',
-'dberrortextcl' => 'Rêza cumleunê panga daeyu de jü xeta amê meydan.
-Heni aseno ke na xeta nustene de esta.
-Persê panga daeyuno peyên nia bi:
-"$1"
-Fonksiyono ke gureniyo "$2".
-Panga daeyu xetawa ke asnena "$3: $4"',
'laggedslavemode' => 'Teme: Beno ke vurnaisê peyêni pele de niyê.',
'readonly' => 'Panga daeyu kılit kerdiya',
'enterlockreason' => 'Serba kılit-kerdişi jü sebeb bıde ke, kılitkerdis texminen key beno ra',
@@ -431,7 +414,6 @@ Kerem kerê, deqêna oncia bıcerrebnê.",
'editinginterface' => "Teme:''' Sıma hawo jü pela ke serba nustê meqalunê caunê bırnau dana, vurnenê.
Vurnaisê na pele karberunê binu rê serpela karberi kena ke bıasno.
Serba çarnaişi, yardımê [//translatewiki.net/wiki/Main_Page?setlang=kiu translatewiki.net]i ra procêdoskerdene rê diqet kerê.",
-'sqlhidden' => '(Persê SQLi nımıteo)',
'cascadeprotected' => 'Na pele esterıtene ra sıtar biya, çıke na zerrê {{PLURAL:$1|pela ke|pelunê ke}} dera/derê be "cascading" opsiyoni kılit biya, $2 de bena ra.',
'namespaceprotected' => "'''$1''' ''namespace'' de desturê sıma be vurnaisê pelu çino.",
'ns-specialprotected' => 'Pelê xususi nêvurrinê.',
@@ -452,7 +434,6 @@ Beno ke taê peli sıma hona cıkote asnenê, hata ke sıma ''browser cache''ê
'yourpassword' => 'Parola:',
'yourpasswordagain' => 'Parola tekrar ke:',
'remembermypassword' => 'Cıkotena mı na komputeri de bia ho viri (seba tewr jêde $1 {{PLURAL:$1|roze|rozu}})',
-'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',
@@ -518,7 +499,7 @@ Kerem ke, oncia bıcerrebne.',
'newpassword' => 'Parola newiye:',
'retypenew' => 'Parola newiye tekrar ke:',
'resetpass_submit' => 'Parola ayar ke u cı kuye',
-'resetpass_success' => 'Parola sıma ebe serkotene vurriye! Nıka hesabê sıma beno ra...',
+'changepassword-success' => 'Parola sıma ebe serkotene vurriye! Nıka hesabê sıma beno ra...',
'resetpass_forbidden' => 'Paroley nêşikinê bıvurniyê',
'resetpass-submit-loggedin' => 'Parola bıvurne',
'resetpass-submit-cancel' => 'Bıtexelne',
@@ -743,7 +724,6 @@ Eke şertê ilawekerdey ke niyê ro, idarekerê bini {{SITENAME}} de nêşikinê
'viewprevnext' => 'Bıvêne ($1 {{int:pipe-separator}} $2) ($3)',
'searchmenu-exists' => "''Ena 'Wikipediya de ser \"[[:\$1]]\" yew pel esto'''",
'searchmenu-new' => "'''Nê wiki de pela \"[[:\$1]]\" baferne!'''",
-'searchhelp-url' => 'Help:Tedeestey',
'searchprofile-articles' => 'Pelê tedeesteu',
'searchprofile-project' => 'Pelê yardımi u procey',
'searchprofile-images' => 'Multimedya',
@@ -782,14 +762,6 @@ Verê cıfeteliyaene de be ilawekerdena verbendê '''all:'''i ra (ebe pelunê hu
Sıma şikinê na sıre ''Google'' de şêr kerê.
Diqet kerê, beno ke tedeestê {{SITENAME}} uza endi rozane niyê.",
-# Quickbar
-'qbsettings' => 'HerbiÅŸiyaena hedefi',
-'qbsettings-none' => 'Qet',
-'qbsettings-fixedleft' => 'Çhep de bestniyo pa',
-'qbsettings-fixedright' => 'Rast de bestniyo pa',
-'qbsettings-floatingleft' => 'Çhepi ser aznino',
-'qbsettings-floatingright' => 'Rasti ser aznino',
-
# Preferences page
'preferences' => 'Tercihi',
'mypreferences' => 'Tercihê mı',
@@ -958,7 +930,6 @@ Kaberê bini ke şıma de kewti irtıbat, adresa e-postey şıma eşkera nêbena
'recentchangeslinked' => 'Ney sero vurnayene',
'recentchangeslinked-toolbox' => 'Ney sero vurnayene',
'recentchangeslinked-title' => 'Heqa "$1"i de vurnais',
-'recentchangeslinked-noresult' => 'Pelanê ke link biye ey vurnayîşî çino.',
'recentchangeslinked-summary' => "Lista cêrêne, pela bêlikerdiye rê (ya ki karberunê kategoriya bêlikerdiye rê) pelunê girêdaoğu de lista de vurnaisê peyênuna.
[[Special:Watchlist|Lista sımawa şêrkedişi de]] peli be nusto '''qolınd''' bêli kerdê.",
'recentchangeslinked-page' => 'Namê pele:',
@@ -1060,8 +1031,6 @@ Cêr [$2 pela arezekerdena dosya de] arezekerdene asnina.',
'statistics-articles' => 'Pelê tedeesteu',
'statistics-pages' => 'Peli',
-'disambiguationspage' => 'Template:vuriyaisê maney',
-
'brokenredirects-edit' => 'bıvurne',
'brokenredirects-delete' => 'bestere',
@@ -1526,7 +1495,7 @@ Eke dosya de peydêna vuriyais biyo ki, beno ke taê melumati gorê vurnaisê ne
* gpslongitude
* gpsaltitude",
-# EXIF tags
+# Exif tags
'exif-imagewidth' => 'Verındêni',
'exif-imagelength' => 'Berzêni',
@@ -1556,10 +1525,6 @@ Eke dosya de peydêna vuriyais biyo ki, beno ke taê melumati gorê vurnaisê ne
# Core parser functions
'duplicate-defaultsort' => '\'\'\'Teme:\'\'\' Tuşê default sort "$2" sero tuşê default sort "$1"î ra şino.',
-# Special:FilePath
-'filepath-page' => 'Dosya:',
-'filepath-submit' => 'So',
-
# Special:FileDuplicateSearch
'fileduplicatesearch-filename' => 'Namê dosya:',
diff --git a/languages/messages/MessagesKk_arab.php b/languages/messages/MessagesKk_arab.php
index 8db1e092..0e985311 100644
--- a/languages/messages/MessagesKk_arab.php
+++ b/languages/messages/MessagesKk_arab.php
@@ -420,9 +420,6 @@ $messages = array(
'tog-enotifrevealaddr' => 'ە-پوشتامنىڭ مەكەنجايىن ەسكەرتۋ حاتتاردا اش',
'tog-shownumberswatching' => 'باقىلاپ تۇرعان قاتىسۋشىلاردىڭ سانىن كورسەت',
'tog-fancysig' => 'قام قولتاڭبا (وزدىكتىك سىلتەمەسىز)',
-'tog-externaleditor' => 'شەتتىك وڭدەۋىشتى ادەپكىدەن قولدان (تەك ساراپشىلار ٴۇشىن, كومپيۋتەرىڭىزدە ارناۋلى باپتالىمدار كەرەك)',
-'tog-externaldiff' => 'شەتتىك ايىرماعىشتى ادەپكىدەن قولدان (تەك ساراپشىلار ٴۇشىن, كومپيۋتەرىڭىزدە ارناۋلى باپتالىمدار كەرەك)',
-'tog-showjumplinks' => '«ٴوتىپ كەتۋ» قاتىناۋ سىلتەمەلەرىن قوس',
'tog-uselivepreview' => 'تۋرا قاراپ شىعۋدى قولدانۋ (JavaScript) (سىناقتاما)',
'tog-forceeditsummary' => 'وڭدەمەنىڭ قىسقاشا مازمۇنداماسى بوس قالعاندا ماعان ەسكەرت',
'tog-watchlisthideown' => 'وڭدەمەلەرىمدى باقىلاۋ تىزىمنەن جاسىر',
@@ -579,7 +576,7 @@ $messages = array(
'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).
+# 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).
'aboutsite' => '{{SITENAME}} تۋرالى',
'aboutpage' => 'Project:جوبا تۋرالى',
'copyright' => 'ماعلۇمات $1 شارتىمەن جەتىمدى.',
@@ -589,7 +586,6 @@ $messages = array(
'disclaimers' => 'جاۋاپكەرشىلىكتەن باس تارتۋ',
'disclaimerpage' => 'Project:جاۋاپكەرشىلىكتەن باس تارتۋ',
'edithelp' => 'وندەۋ انىقتاماسى',
-'edithelppage' => 'Help:وڭدەۋ',
'helppage' => 'Help:مازمۇنى',
'mainpage' => 'باستى بەت',
'mainpage-description' => 'باستى بەت',
@@ -655,17 +651,6 @@ $messages = array(
# General errors
'error' => 'قاتە',
'databaseerror' => 'دەرەكقور قاتەسى',
-'dberrortext' => 'دەرەكقور سۇرانىمىندا سويلەم جۇيەسىنىڭ قاتەسى بولدى.
-بۇل باعدارلامالىق جاساقتاما قاتەسىن بەلگىلەۋى مۇمكىن.
-سوڭعى بولعان دەرەكقور سۇرانىمى:
-<blockquote><tt>$1</tt></blockquote>
-مىنا جەتەدەن «<tt>$2</tt>».
-MySQL قايتارعان قاتەسى «<tt>$3: $4</tt>».',
-'dberrortextcl' => 'دەرەكقور سۇرانىمىندا سويلەم جۇيەسىنىڭ قاتەسى بولدى.
-سوڭعى بولعان دەرەكقور سۇرانىمى:
-«$1»
-مىنا جەتەدەن: «$2».
-MySQL قايتارعان قاتەسى «$3: $4»',
'laggedslavemode' => 'قۇلاقتاندىرۋ: بەتتە جۋىقتاعى جاڭالاۋلار بولماۋى مۇمكىن.',
'readonly' => 'دەرەكقورى قۇلىپتالعان',
'enterlockreason' => 'قۇلىپتاۋ سەبەبىن, قاي ۋاقىتقا دەيىن قۇلىپتالعانىن كىرىستىرىپ, ەنگىزىڭىز',
@@ -713,7 +698,6 @@ MySQL قايتارعان قاتەسى «$3: $4»',
'editinginterface' => "'''قۇلاقتاندىرۋ:''' باعدارلامالىق جاساقتامانىڭ تىلدەسۋ ٴماتىنىن جەتىستىرەتىن بەتىن وڭدەپ جاتىرسىز.
بۇل بەتتىڭ وزگەرتۋى باسقا قاتىسۋشىلارعا پايدالانۋشىلىق تىلدەسۋى قالاي كورىنەتىنە اسەر ەتەدى.
اۋدارمالار ٴۇشىن, MediaWiki باعدارلاماسىن جەرسىندىرۋ [//translatewiki.net/wiki/Main_Page?setlang=kk translatewiki.net جوباسى] ارقىلى قاراپ شەشىڭىز.",
-'sqlhidden' => '(SQL سۇرانىمى جاسىرىلعان)',
'cascadeprotected' => 'بۇل بەت وڭدەۋدەن قورعالعان, سەبەبى بۇل كەلەسى «باۋلى قورعاۋى» قوسىلعان {{PLURAL:$1|بەتتىڭ|بەتتەردىڭ}} كىرىكبەتى:
$2',
'namespaceprotected' => "'''$1''' ەسىم اياسىنداعى بەتتەردى وڭدەۋ ٴۇشىن رۇقساتىڭىز جوق.",
@@ -812,7 +796,7 @@ $2',
'newpassword' => 'جاڭا قۇپىييا ٴسوزىڭىز:',
'retypenew' => 'جاڭا قۇپىييا ٴسوزىڭىزدى قايتالاڭىز:',
'resetpass_submit' => 'قۇپىييا ٴسوزدى قويىڭىز دا كىرىڭىز',
-'resetpass_success' => 'قۇپىييا ٴسوزىڭىز ٴساتتى وزگەرتىلدى! ەندى كىرىڭىز…',
+'changepassword-success' => 'قۇپىييا ٴسوزىڭىز ٴساتتى وزگەرتىلدى! ەندى كىرىڭىز…',
'resetpass_forbidden' => '{{SITENAME}} جوباسىندا قۇپىييا سوزدەر وزگەرتىلمەيدى',
# Edit page toolbar
@@ -1114,7 +1098,6 @@ $3 كەلتىرىلگەن سەبەبى: ''$2''",
'prevn' => 'الدىڭعى {{PLURAL:$1|$1}}',
'nextn' => 'كەلەسى {{PLURAL:$1|$1}}',
'viewprevnext' => 'كورسەتىلۋى: ($1 {{int:pipe-separator}} $2) ($3) جازبا',
-'searchhelp-url' => 'Help:مازمۇنى',
'search-result-size' => '$1 ($2 ٴسوز)',
'search-result-score' => 'اراقاتىناستىلىعى: $1 %',
'search-redirect' => '(ايداعىش $1)',
@@ -1140,14 +1123,6 @@ $3 كەلتىرىلگەن سەبەبى: ''$2''",
ازىرشە Google ارقىلى ىزدەۋگە بولادى.
اڭعارتپا: {{SITENAME}} تورابىنىڭ ماعلۇمات تىزبەلەرى ەسكىرگەن بولۋى مۇمكىن.',
-# Quickbar
-'qbsettings' => 'ٴمازىر',
-'qbsettings-none' => 'ەشقانداي',
-'qbsettings-fixedleft' => 'سولعا بەكىتىلگەن',
-'qbsettings-fixedright' => 'وڭعا بەكىتىلگەن',
-'qbsettings-floatingleft' => 'سولعا قالقىعان',
-'qbsettings-floatingright' => 'وڭعا قالقىعان',
-
# Preferences page
'preferences' => 'باپتالىمدار',
'mypreferences' => 'باپتالىمدارىم',
@@ -1343,7 +1318,6 @@ $3 كەلتىرىلگەن سەبەبى: ''$2''",
'recentchangeslinked-feed' => 'قاتىستى وزگەرىستەر',
'recentchangeslinked-toolbox' => 'قاتىستى وزگەرىستەر',
'recentchangeslinked-title' => '«$1» دەگەنگە قاتىستى وزگەرىستەر',
-'recentchangeslinked-noresult' => 'سىلتەلگەن بەتتەردە كەلتىرىلگەن مەرزىمدە ەشقانداي وزگەرىس بولماعان.',
'recentchangeslinked-summary' => "بۇل تىزىمدە وزىندىك بەتتەن سىلتەلگەن بەتتەردەگى (نە وزىندىك سانات مۇشەلەرىندەگى) ىستەلگەن جۋىقتاعى وزگەرىستەر بەرىلەدى.
[[Special:Watchlist|باقىلاۋ تىزىمىڭىزدەگى]] بەتتەر '''جۋان''' بولىپ بەلگىلەنەدى.",
'recentchangeslinked-page' => 'بەت اتاۋى:',
@@ -1550,12 +1524,6 @@ URL دۇرىس ەكەندىگىن جانە توراپ ىستەپ تۇرعانىÙ
'statistics-header-users' => 'قاتىسۋشى ساناعى',
'statistics-mostpopular' => 'ەڭ كوپ قارالعان بەتتەر',
-'disambiguations' => 'ايرىقتى بەتتەر',
-'disambiguationspage' => '{{ns:template}}:ايرىق',
-'disambiguations-text' => "كەلەسى بەتتەر '''ايرىقتى بەتكە''' سىلتەيدى.
-بۇنىڭ ورنىنا بەلگىلى تاقىرىپقا سىلتەۋى كەرەك.<br />
-ەگەر [[MediaWiki:Disambiguationspage]] تىزىمىندەگى ۇلگى قولدانىلسا, بەت ايرىقتى دەپ سانالادى.",
-
'doubleredirects' => 'شىنجىرلى ايداعىشتار',
'doubleredirectstext' => 'بۇل بەتتە باسقا ايداتۋ بەتتەرگە سىلتەيتىن بەتتەر تىزىمدەلىنەدى. ٴاربىر جولاقتا ٴبىرىنشى جانە ەكىنشى ايداعىشقا سىلتەمەلەر بار, سونىمەن بىرگە ەكىنشى ايداعىش نىساناسى بار, ادەتتە بۇل ٴبىرىنشى ايداعىش باعىتتايتىن «ناقتى» نىسانا بەت اتاۋى بولۋى كەرەك.',
@@ -1730,10 +1698,9 @@ Also see [[Special:WantedCategories|wanted categories]].',
'unwatchthispage' => 'باقىلاۋدى توقتاتۋ',
'notanarticle' => 'ماعلۇمات بەتى ەمەس',
'notvisiblerev' => 'تۇزەتۋ جويىلدى',
-'watchnochange' => 'كورسەتىلگەن مەرزىمدە ەش باقىلانعان دانا وڭدەلگەن جوق.',
'watchlist-details' => 'تالقىلاۋ بەتتەرىن ساناماعاندا $1 بەت باقلانىلادى.',
-'wlheader-enotif' => '* ەسكەرتۋ حات جىبەرۋى قوسىلعان.',
-'wlheader-showupdated' => "* سوڭعى كەلىپ-كەتۋىڭىزدەن بەرى وزگەرتىلگەن بەتتەردى '''جۋان''' قارىپىمەن كورسەت",
+'wlheader-enotif' => 'ەسكەرتۋ حات جىبەرۋى قوسىلعان.',
+'wlheader-showupdated' => "سوڭعى كەلىپ-كەتۋىڭىزدەن بەرى وزگەرتىلگەن بەتتەردى '''جۋان''' قارىپىمەن كورسەت",
'watchmethod-recent' => 'باقىلاۋلى بەتتەر ٴۇشىن جۋىقتاعى وزگەرىستەردى تەكسەرۋ',
'watchmethod-list' => 'جۋىقتاعى وزگەرىستەر ٴۇشىن باقىلاۋلى بەتتەردى تەكسەرۋ',
'watchlistcontains' => 'باقىلاۋ تىزىمىڭىزدە $1 بەت بار.',
@@ -2048,12 +2015,9 @@ $1 بۇعاتتاۋى ٴۇشىن كەلتىرىلگەن سەبەبى: «$2».',
'ipb_blocked_as_range' => 'قاتەلىك: IP $1 تىكەلەي بۇعاتتالماعان جانە بۇعاتتاۋى وشىرىلمەيدى.
بىراق, بۇل بۇعاتتاۋى ٴوشىرىلۋى مۇمكىن $2 اۋقىمى بولىگى بوپ بۇعاتتالعان.',
'ip_range_invalid' => 'IP مەكەنجاي اۋقىمى جارامسىز.',
-'blockme' => 'وزدىكتىك_بۇعاتتاۋ',
'proxyblocker' => 'پروكسىي سەرۆەرلەردى بۇعاتتاۋىش',
-'proxyblocker-disabled' => 'بۇل جەتە وشىرىلگەن.',
'proxyblockreason' => 'IP مەكەنجايىڭىز اشىق پروكسىي سەرۆەرگە جاتاتىندىقتان بۇعاتتالعان.
ىينتەرنەت قىزمەتىن جابدىقتاۋشىڭىزبەن, نە تەحنىيكالىق قولداۋ قىزمەتىمەن قاتىناسىڭىز, جانە ولارعا وسى وتە كۇردەلى قاۋىپسىزدىك شاتاق تۋرالى اقپارات بەرىڭىز.',
-'proxyblocksuccess' => 'ٴبىتتى.',
'sorbsreason' => 'IP مەكەنجايىڭىز {{SITENAME}} تورابىندا قولدانىلعان DNSBL قارا تىزىمىندەگى اشىق پروكسىي-سەرۆەر دەپ تابىلادى.',
'sorbs_create_account_reason' => 'IP مەكەنجايىڭىز {{SITENAME}} تورابىندا قولدانىلعان DNSBL قارا تىزىمىندەگى اشىق پروكسىي-سەرۆەر دەپ تابىلادى.
جاڭا تىركەلگى جاساي المايسىز.',
@@ -2272,24 +2236,14 @@ MediaWiki جۇيەسىنىڭ [[{{#special:Import}}|سىرتتان الۋ بەتÙ
# Stylesheets
'common.css' => '/* مىندا ورنالاستىرىلعان CSS بارلىق مانەرلەردە قولدانىلادى */',
-'standard.css' => '/* مىندا ورنالاستىرىلعان CSS تەك «داعدىلى» (standard) مانەرىن پايدالانۋشىلارىنا ىقپال ەتەدى */',
-'nostalgia.css' => '/* مىندا ورنالاستىرىلعان CSS تەك «اڭساۋ» (nostalgia) مانەرىن پايدالانۋشىلارىنا ىقپال ەتەدى */',
'cologneblue.css' => '/* مىندا ورنالاستىرىلعان CSS تەك «كولن زەڭگىرلىگى» (cologneblue) مانەرىن پايدالانۋشىلارىنا ىقپال ەتەدى skin */',
'monobook.css' => '/* مىندا ورنالاستىرىلعان CSS تەك «دارا كىتاپ» (monobook) مانەرىن پايدالانۋشىلارىنا ىقپال ەتەدى */',
-'myskin.css' => '/* مىندا ورنالاستىرىلعان CSS تەك «ٴوز مانەرىم» (myskin) مانەرىن پايدالانۋشىلارىنا ىقپال ەتەدى */',
-'chick.css' => '/* مىندا ورنالاستىرىلعان CSS تەك «بالاپان» (chick) مانەرىن پايدالانۋشىلارىنا ىقپال ەتەدى */',
-'simple.css' => '/* مىندا ورنالاستىرىلعان CSS تەك «كادىمگى» (simple) مانەرىن پايدالانۋشىلارىنا ىقپال ەتەدى */',
'modern.css' => '/* مىندا ورنالاستىرىلعان CSS تەك «زاماناۋىي» (modern) مانەرىن پايدالانۋشىلارىنا ىقپال ەتەدى */',
# Scripts
'common.js' => '/* مىنداعى ٴارتۇرلى JavaScript كەز كەلگەن بەت قوتارىلعاندا بارلىق پايدالانۋشىلار ٴۇشىن جەگىلەدى. */',
-'standard.js' => '/* مىنداعى JavaScript تەك «داعدىلى» (standard) مانەرىن پايدالانۋشىلار ٴۇشىن جەگىلەدى */',
-'nostalgia.js' => '/* مىنداعى JavaScript تەك «اڭساۋ» (nostalgia) مانەرىن پايدالانۋشىلار ٴۇشىن جەگىلەدى*/',
'cologneblue.js' => '/* مىنداعى JavaScript تەك «كولن زەڭگىرلىگى» (cologneblue) مانەرىن پايدالانۋشىلار ٴۇشىن جەگىلەدى */',
'monobook.js' => '/* مىنداعى JavaScript تەك «دارا كىتاپ» (monobook) مانەرىن پايدالانۋشىلار ٴۇشىن جەگىلەدى */',
-'myskin.js' => '/* مىنداعى JavaScript تەك «ٴوز مانەرىم» (myskin) مانەرىن پايدالانۋشىلار ٴۇشىن جەگىلەدى */',
-'chick.js' => '/* مىنداعى JavaScript تەك «بالاپان» (chick) مانەرىن پايدالانۋشىلار ٴۇشىن جەگىلەدى */',
-'simple.js' => '/* مىنداعى JavaScript تەك «كادىمگى» (simple) مانەرىن پايدالانۋشىلار ٴۇشىن جەگىلەدى */',
'modern.js' => '/* مىنداعى JavaScript تەك «زاماناۋىي» (modern) مانەرىن پايدالانۋشىلار ٴۇشىن جەگىلەدى */',
# Metadata
@@ -2315,13 +2269,8 @@ MediaWiki جۇيەسىنىڭ [[{{#special:Import}}|سىرتتان الۋ بەتÙ
'spam_blanking' => '$1 دەگەنگە سىلتەمەلەرى بار بارلىق تۇزەتۋلەر تازارتىلدى',
# Skin names
-'skinname-standard' => 'داعدىلى (standard)',
-'skinname-nostalgia' => 'اڭساۋ (nostalgia)',
'skinname-cologneblue' => 'كولن زەڭگىرلىگى (cologneblue)',
'skinname-monobook' => 'دارا كىتاپ (monobook)',
-'skinname-myskin' => 'ٴوز مانەرىم (myskin)',
-'skinname-chick' => 'بالاپان (chick)',
-'skinname-simple' => 'كادىمگى (simple)',
'skinname-modern' => 'زاماناۋىي (modern)',
# Patrolling
@@ -2410,7 +2359,7 @@ $1',
* gpslongitude
* gpsaltitude',
-# EXIF tags
+# Exif tags
'exif-imagewidth' => 'ەنى',
'exif-imagelength' => 'بىيىكتىگى',
'exif-bitspersample' => 'قۇراش سايىن بىيت سانى',
@@ -2524,7 +2473,7 @@ $1',
'exif-gpsdatestamp' => 'GPS كۇن-ايى',
'exif-gpsdifferential' => 'GPS سارالانعان دۇرىستاۋ',
-# EXIF attributes
+# Exif attributes
'exif-compression-1' => 'ۇلعايتىلعان',
'exif-unknowndate' => 'بەلگىسىز كۇن-ايى',
@@ -2847,7 +2796,6 @@ $5
'version-other' => 'تاعى باسقالار',
'version-mediahandlers' => 'تاسپا وڭدەتكىشتەرى',
'version-hooks' => 'جەتە تۇزاقتارى',
-'version-extension-functions' => 'كەڭەيتىمدەر جەتەلەرى',
'version-parser-extensiontags' => 'قۇرىلىمدىق تالداتقىش كەڭەيتىمدەرىنىڭ بەلگىلەمەرى',
'version-parser-function-hooks' => 'قۇرىلىمدىق تالداتقىش جەتەلەرىنىڭ تۇزاقتارى',
'version-hook-name' => 'تۇزاق اتاۋى',
@@ -2858,13 +2806,6 @@ $5
'version-software-product' => 'ٴونىم',
'version-software-version' => 'نۇسقاسى',
-# Special:FilePath
-'filepath' => 'Ùايل ورنالاسۋى',
-'filepath-page' => 'Ùايل اتى:',
-'filepath-submit' => 'ورنالاسۋىن تاپ',
-'filepath-summary' => 'بۇل ارنايى بەت Ùايل ورنالاسۋى تولىق جولىن قايتارادى.
-سۋرەتتەر تولىق اجىراتىلىمدىعىمەن كورسەتىلەدى, باسقا Ùايل تۇرلەرىنە قاتىستى باعدارلاماسى تۋرا جەگىلەدى.',
-
# Special:FileDuplicateSearch
'fileduplicatesearch' => 'Ùايل تەلنۇسقالارىن ىزدەۋ',
'fileduplicatesearch-summary' => 'Ùايل حەشى ماعىناسى نەگىزىندە تەلنۇسقالارىن ىزدەۋ.',
diff --git a/languages/messages/MessagesKk_cyrl.php b/languages/messages/MessagesKk_cyrl.php
index cd131d84..81639140 100644
--- a/languages/messages/MessagesKk_cyrl.php
+++ b/languages/messages/MessagesKk_cyrl.php
@@ -14,6 +14,7 @@
* @author Daniyar
* @author GaiJin
* @author Kaztrans
+ * @author Nemo bis
* @author Urhixidur
*/
@@ -390,9 +391,6 @@ $messages = array(
'tog-shownumberswatching' => 'Бақылап тұрған қатыÑушылардың Ñанын көрÑет',
'tog-oldsig' => 'Ðғымдағы қолтаңбаңыз:',
'tog-fancysig' => 'Қолтаңбаны уикимәтін ретінде қараÑтыру (автоматты Ñілтеме қойылмайды)',
-'tog-externaleditor' => 'Шеттік өңдеуішті әдепкіден қолдан (тек Ñарапшылар үшін, компьютеріңізде арнаулы бапталымдар керек)',
-'tog-externaldiff' => 'Шеттік айырмағышты әдепкіден қолдан (тек Ñарапшылар үшін, компьютеріңізде арнаулы бапталымдар керек)',
-'tog-showjumplinks' => '«Өтіп кету» қатынау Ñілтемелерін қоÑ',
'tog-uselivepreview' => 'Тура қарап шығуды қолдану (JavaScript) (Сынақтама)',
'tog-forceeditsummary' => 'Өңдеменің қыÑқаша мазмұндамаÑÑ‹ Ð±Ð¾Ñ Ò›Ð°Ð»Ò“Ð°Ð½Ð´Ð° маған еÑкерт',
'tog-watchlisthideown' => 'Өңдемелерімді бақылау тізімінен жаÑÑ‹Ñ€',
@@ -406,6 +404,7 @@ $messages = array(
'tog-showhiddencats' => 'ЖаÑырын Ñанаттарды көрÑету',
'tog-noconvertlink' => 'Сілтеме атауларын ауыÑтырма',
'tog-norollbackdiff' => 'Шегіндіруден кейін нұÑқалардың айырмашылығын көрÑетпеу',
+'tog-useeditwarning' => 'ӨңдемеÑÑ– Ñақталмаған парақшадан шығар кезде еÑкерту',
'underline-always' => 'Әрқашан',
'underline-never' => 'Ешқашан',
@@ -469,6 +468,18 @@ $messages = array(
'oct' => 'қаз',
'nov' => 'қар',
'dec' => 'жел',
+'january-date' => 'Қаңтар $1',
+'february-date' => 'Ðқпан $1',
+'march-date' => 'Ðаурыз $1',
+'april-date' => 'Сәуір $1',
+'may-date' => 'Мамыр $1',
+'june-date' => 'МауÑым $1',
+'july-date' => 'Шілде $1',
+'august-date' => 'Тамыз $1',
+'september-date' => 'Қыркүйек $1',
+'october-date' => 'Қазан $1',
+'november-date' => 'Қараша $1',
+'december-date' => 'ЖелтоқÑан $1',
# Categories related messages
'pagecategories' => '{{PLURAL:$1|Санат|Санат}}',
@@ -550,6 +561,7 @@ $messages = array(
'create-this-page' => 'ОÑÑ‹ бетті баÑтау',
'delete' => 'Жою',
'deletethispage' => 'Бұл бетті жою',
+'undeletethispage' => 'Жойылған бетті қайтару',
'undelete_short' => '{{PLURAL:$1|өңдеме|$1 өңдеме}} жоюын болдырмау',
'viewdeleted_short' => '{{PLURAL:$1|жойылған өңдеуді|$1 жойылған өңдеулерді }} көру',
'protect' => 'Қорғау',
@@ -593,7 +605,7 @@ $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).
+# 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).
'aboutsite' => '{{SITENAME}} туралы',
'aboutpage' => 'Project:Жоба туралы',
'copyright' => 'Мәлімет $1 шартымен жетімді.',
@@ -603,7 +615,6 @@ $1',
'disclaimers' => 'Жауапкершіліктен Ð±Ð°Ñ Ñ‚Ð°Ñ€Ñ‚Ñƒ',
'disclaimerpage' => 'Project:Жауапкершіліктен Ð±Ð°Ñ Ñ‚Ð°Ñ€Ñ‚Ñƒ',
'edithelp' => 'Өндеу анықтамаÑÑ‹',
-'edithelppage' => 'Help:Өңдеу',
'helppage' => 'Help:Мазмұны',
'mainpage' => 'БаÑÑ‚Ñ‹ бет',
'mainpage-description' => 'БаÑÑ‚Ñ‹ бет',
@@ -681,16 +692,8 @@ $1',
# General errors
'error' => 'Қате',
'databaseerror' => 'Дерекқор қатеÑÑ–',
-'dberrortext' => 'Дерекқорға жаÑалған ÑұраныÑта ÑинтакÑиÑтік қате табылды.
-Бұл бағдарламада қате бар екенін көрÑетуі мүмкін.
-Дерекқорға Ñ‚Ò¯Ñкен Ñоңғы Ñұраным:
- «<tt>$2</tt>» фунциÑÑынан <blockquote><tt>$1</tt></blockquote> шыққан.
-Дерекқор «<tt>$3: $4</tt>» қателігін қайтарды.',
-'dberrortextcl' => 'Дерекқорға жаÑалған Ñұранымда ÑинтакÑиÑтік қате табылды.
-Дерекқорға Ñ‚Ò¯Ñкен Ñоңғы Ñұраным:
-«$1»
-мына «$2» функциÑÑынан болды .
-Дерекқор "$3: $4" қатеÑін қайтарды.',
+'databaseerror-query' => 'Сұрау:$1',
+'databaseerror-error' => 'Қате:$1',
'laggedslavemode' => "'''ЕÑкерту:''' Бетте жуықтағы жаңартулар болмауы мүмкін.",
'readonly' => 'Дерекқоры құлыпталған',
'enterlockreason' => 'Құлыптау Ñебебін, қай уақытқа дейін құлыпталғанын кіріÑтіріп, енгізіңіз.',
@@ -746,12 +749,15 @@ $1',
'editinginterface' => "'''ЕÑкерту:''' Бағдарламалық жаÑақтаманың тілдеÑу мәтінін жетіÑтіретін бетін өңдеп жатырÑыз.
Бұл беттің өзгертуі баÑқа қатыÑушыларға пайдаланушылық тілдеÑуі қалай көрінетіне Ó™Ñер етеді.
Барлық уикилер үшін аудармаларды өзгерту немеÑе қоÑу үшін [//translatewiki.net/ translatewiki.net] МедиаУики жерлеÑтіру жобаÑын пайдаланыңыз.",
-'sqlhidden' => '(SQL Ñұранымы жаÑырылған)',
'cascadeprotected' => 'Бұл бет өңдеуден қорғалған, Ñебебі бұл келеÑÑ– «баулы қорғауы» қоÑылған {{PLURAL:$1|беттің|беттердің}} кірікбеті:
$2',
'namespaceprotected' => "'''$1''' еÑім аÑÑындағы беттерді өңдеу үшін Ñ€Ò±Ò›Ñатыңыз жоқ.",
'customcssprotected' => 'Сіздің бұл CSS-бетті өңдеуге Ñ€Ò±Ò›Ñатыңыз жоқ, Ñебебі мұнда өзге қатыÑушының жеке баптаулары бар.',
'customjsprotected' => 'Сіздің бұл JavaScript бетін өңдеуге Ñ€Ò±Ò›Ñатыңыз жоқ, Ñебебі мұнда өзге қатыÑушының жеке баптаулары бар.',
+'mycustomcssprotected' => 'Сізде CSS бетін өңдеуге Ñ€Ò±Ò›Ñатыңыз жоқ.',
+'mycustomjsprotected' => 'Сізде JavaScript бетін өңдеуге Ñ€Ò±Ò›Ñатыңыз жоқ.',
+'myprivateinfoprotected' => 'Сізде жеке ақпараттарыңызды өңдеу Ñ€Ò±Ò›Ñатыңыз жоқ.',
+'mypreferencesprotected' => 'Сізде баптауларыңызды өңдеуге Ñ€Ò±Ò›Ñатыңыз жоқ.',
'ns-specialprotected' => '{{ns:special}} еÑім аÑÑындағы беттер өңдеуге келмейді.',
'titleprotected' => "Бұл тақырып аты баÑтаудан [[User:$1|$1]] қорғады.
Келтірілген Ñебебі: ''$2''.",
@@ -776,10 +782,19 @@ $2',
'welcomecreation-msg' => 'Сіздің тіркеліміңіз жаÑалынды.
[[Special:Preferences|{{SITENAME}} баптауларыңызды]] өзгертуді ұмытпаңыз.',
'yourname' => 'ҚатыÑушы аты:',
+'userlogin-yourname' => 'ҚатыÑушы еÑіміңіз',
+'userlogin-yourname-ph' => 'ҚатыÑушы еÑіміңізді енгізіңіз',
+'createacct-another-username-ph' => 'ҚатыÑушы еÑіміңізді енгізіңіз',
'yourpassword' => 'ÒšÒ±Ð¿Ð¸Ñ Ñөз:',
+'userlogin-yourpassword' => 'ÒšÒ±Ð¿Ð¸Ñ Ñөз',
+'userlogin-yourpassword-ph' => 'ÒšÒ±Ð¿Ð¸Ñ Ñөздіңізді енгізіңіз',
+'createacct-yourpassword-ph' => 'ÒšÒ±Ð¿Ð¸Ñ Ñөзді енгізу',
'yourpasswordagain' => 'ÒšÒ±Ð¿Ð¸Ñ Ñөзді қайталаңыз:',
+'createacct-yourpasswordagain' => 'ÒšÒ±Ð¿Ð¸Ñ Ñөзді құптаңыз',
+'createacct-yourpasswordagain-ph' => 'ÒšÒ±Ð¿Ð¸Ñ Ñөзіңізді қайтадан енгізіңіз',
'remembermypassword' => 'Тіркелгімді оÑÑ‹ браузерде ұмытпа (ең көбі $1 {{PLURAL:$1|күн|күн}})',
-'securelogin-stick-https' => 'Кіргеннен кейін HTTPS бойынша байланыÑÑ‚Ñ‹ жалғаÑтыру',
+'userlogin-remembermypassword' => 'Мені жүйеде Ñақтап қою',
+'userlogin-signwithsecure' => 'ÒšÒ±Ð¿Ð¸Ñ Ð±Ð°Ð¹Ð»Ð°Ð½Ñ‹Ñуды қолдану',
'yourdomainname' => 'Желі үйшігіңіз:',
'password-change-forbidden' => 'Сіз бұл уикиде Ò›Ò±Ð¿Ð¸Ñ Ñөзіңізді өзгерте алмайÑыз.',
'externaldberror' => 'ОÑÑ‹ арада не шеттік раÑтау дерекқорында қате болды, немеÑе шеттік тіркелгіңізді жаңалау Ñ€Ò±Ò›Ñаты жоқ.',
@@ -791,18 +806,41 @@ $2',
'logout' => 'Шығу',
'userlogout' => 'Шығу',
'notloggedin' => 'КірмегенÑіз',
+'userlogin-noaccount' => 'Тіркелгіңіз жоқ па?',
+'userlogin-joinproject' => '{{SITENAME}} жобаÑына тіркелу',
'nologin' => 'Тіркелгіңіз бар ма? $1.',
'nologinlink' => 'Тіркелгіңізді жаÑаңыз',
'createaccount' => 'Жаңа тіркелгі',
'gotaccount' => "Бұған дейін тіркеліп пе едіңіз? '''$1'''.",
'gotaccountlink' => 'Кіріңіз',
'userlogin-resetlink' => 'ҚатыÑушы атын не Ò›Ò±Ð¿Ð¸Ñ Ñөзді ұмыттыңыз ба?',
+'userlogin-resetpassword-link' => 'ÒšÒ±Ð¿Ð¸Ñ Ñөздіңізді Ñ‹Ñыру',
+'helplogin-url' => 'Help:Тіркелу',
+'userlogin-helplink' => '[[{{MediaWiki:helplogin-url}}|Тіркелуге көмек]]',
+'createacct-join' => 'Төменге өзіңіз туралы ақпарат енгізіңіз.',
+'createacct-another-join' => 'Төменге жаңа тіркелгі туралы ақпарат енгізіңіз.',
+'createacct-emailrequired' => 'Е-пошта мекен-жайы:',
+'createacct-emailoptional' => 'Е-поштаның мекен-жайы (міндетті емеÑ)',
+'createacct-email-ph' => 'Е-пошта мекен-жайыңызды енгізіңіз',
+'createacct-another-email-ph' => 'Е-пошта мекен-жайын енгізіңіз',
'createaccountmail' => 'Уақытша берілген кілтÑөзді пайдаланыңыз және оны көрÑетілген Ñлектрондық поштаға жіберіңіз',
+'createacct-realname' => 'Ðақты атыңыз (ерікті)',
'createaccountreason' => 'Себебі:',
+'createacct-reason' => 'Себебі:',
+'createacct-reason-ph' => 'Ðеге баÑқа тіркегі жаÑамақшыÑыз',
+'createacct-captcha' => 'ҚұпиÑлық текÑеруі',
+'createacct-imgcaptcha-ph' => 'Жоғарғыдағы көріп тұрған мәтінді енгізіңіз',
+'createacct-submit' => 'Тіркелгіңізді жаÑаңыз',
+'createacct-another-submit' => 'БаÑқа тіркелгі жаÑау',
+'createacct-benefit-heading' => '{{SITENAME}} Ñіз ÑиÑқты қызығатын адамдар арқылы жаÑалады.',
+'createacct-benefit-body1' => '{{PLURAL:$1|өңдеме|өңдеме}}',
+'createacct-benefit-body2' => '{{PLURAL:$1|бет|бет}}',
+'createacct-benefit-body3' => 'жуықтағы {{PLURAL:$1|қатыÑушы|қатыÑушы}}',
'badretype' => 'Енгізген Ò›Ò±Ð¿Ð¸Ñ Ñөздеріңіз бір-біріне ÑÓ™Ð¹ÐºÐµÑ ÐµÐ¼ÐµÑ.',
'userexists' => 'Енгізген қатыÑушы атыңыз әлдеқашан пайдалануда.
Өзге атауды таңдаңыз.',
'loginerror' => 'Кіру қатеÑÑ–',
+'createacct-error' => 'Тіркелгі жаÑауада қате кетті',
'createaccounterror' => 'Тіркелгіні жаÑау мүмкін емеÑ: $1',
'nocookiesnew' => 'Жаңа қатыÑушы тіркелгіÑÑ– жаÑалды, бірақ кірмегенÑіз.
ҚатыÑушы кіру үшін {{SITENAME}} торабында «cookie» файлдары қолданылады.
@@ -863,7 +901,7 @@ $2',
Егер бұл тіркелгі қателікпен жаÑалÑа, оÑÑ‹ хабарға елемеуіңіз мүмкін.',
'usernamehasherror' => 'ҚатыÑушы еÑіміне тор белгі нышаны енгізілмейді.',
-'login-throttled' => 'Сіз жүйеге кіру үшін тым көп Ñ‚Ð°Ð»Ð¿Ñ‹Ð½Ñ‹Ñ Ð¶Ð°Ñадыңыз. Өтінемін, қайта ÐºÑ–Ñ€Ð¼ÐµÑ Ð±Ò±Ñ€Ñ‹Ð½ кішкене күте тұрыңыз.',
+'login-throttled' => 'Сіз жүйеге кіру үшін тым көп Ñ‚Ð°Ð»Ð¿Ñ‹Ð½Ñ‹Ñ Ð¶Ð°Ñадыңыз. Өтінемін, қайта ÐºÑ–Ñ€Ð¼ÐµÑ Ð±Ò±Ñ€Ñ‹Ð½ $1 күте тұрыңыз.',
'login-abort-generic' => 'Жүйеге кіру үшін ÑәтÑіз Ñ‚Ð°Ð»Ð¿Ñ‹Ð½Ñ‹Ñ Ð¶Ð°Ñадыңыз.',
'loginlanguagelabel' => 'Тіл: $1',
'suspicious-userlogout' => 'Сіздің жүйеден шығу Ñұранымыңыз қабылданбады, өйткені, бұл жарамÑыз браузер немеÑе кÑштеуші прокÑидің Ñұранымына Ò±Ò›Ñайды.',
@@ -881,7 +919,7 @@ $2',
'newpassword' => 'Жаңа Ò›Ò±Ð¿Ð¸Ñ Ñөзіңіз:',
'retypenew' => 'Жаңа Ò›Ò±Ð¿Ð¸Ñ Ñөзіңізді қайталаңыз:',
'resetpass_submit' => 'ÒšÒ±Ð¿Ð¸Ñ Ñөзді қойыңыз да кіріңіз',
-'resetpass_success' => 'ÒšÒ±Ð¿Ð¸Ñ Ñөзіңіз Ñәтті өзгертілді! Енді кіріңіз…',
+'changepassword-success' => 'ÒšÒ±Ð¿Ð¸Ñ Ñөзіңіз Ñәтті өзгертілді!',
'resetpass_forbidden' => 'ÒšÒ±Ð¿Ð¸Ñ Ñөз өзгертілмейді',
'resetpass-no-info' => 'Бұл бетке тікелей ену үшін, жүйеге кіруіңіз керек.',
'resetpass-submit-loggedin' => 'ÒšÒ±Ð¿Ð¸Ñ Ñөзді өзгерту',
@@ -893,10 +931,11 @@ $2',
# Special:PasswordReset
'passwordreset' => 'ÒšÒ±Ð¿Ð¸Ñ Ñөзді қайтару',
-'passwordreset-text' => 'Сіздің тіркелгіңіздің баптаулары туралы хабарламаларды алу үшін мына пішінді толтырыңыз.',
+'passwordreset-text-one' => 'ÒšÒ±Ð¿Ð¸Ñ Ñөзіңізді түзеу үшін бұл пішінді толтырыңыз.',
+'passwordreset-text-many' => '{{PLURAL:$1|ÒšÒ±Ð¿Ð¸Ñ Ñөзді қайтару үшін жолақтарды толтырыңыз.}}',
'passwordreset-legend' => 'ÒšÒ±Ð¿Ð¸Ñ Ñөзді қайтару',
'passwordreset-disabled' => 'Бұл уикиде Ò›Ò±Ð¿Ð¸Ñ Ñөзді қайтару ажыратылған.',
-'passwordreset-pretext' => '{{PLURAL:$1||Төменде көрÑетілгендердің ішіндегі біреуін жазыңыз}}',
+'passwordreset-emaildisabled' => 'E-mail мүмкіндігі бұл уикиде өшірілген.',
'passwordreset-username' => 'ҚатыÑушы аты:',
'passwordreset-domain' => 'Домен:',
'passwordreset-capture' => 'Келген хатты қарау керек пе?',
@@ -1105,10 +1144,13 @@ IP-мекенжайыңыз бұл беттің түзету тарихында
'edit-gone-missing' => 'Бетті жаңарту мүмкін емеÑ.
Мүмкін, бұл бет жойылған.',
'edit-conflict' => 'Өңдемелер қақтығыÑÑ‹.',
+'postedit-confirmation' => 'Сіздің өңдемеңіз Ñақталды.',
'edit-already-exists' => 'Жаңа бет жаÑау мүмкін емеÑ.
Ол әлдеқашан бар.',
'defaultmessagetext' => 'Әдепкі мәтіні',
'invalid-content-data' => 'ЖарамÑыз дерек мазмұны',
+'editwarning-warning' => 'БаÑқа бетке Ó©Ñ‚Ñеңіз Ñіздің жазған Ñоңғы өңдемелеріңіз жойылуы мүмкін.
+Егер Ñiз жүйеде Ñ‚iркелÑеңiз, онда Ñiз баптауларыңыздағы «{{int:prefs-editing}}» бөлігіне кіріп, бұл еÑкертуді өшіре алаÑыз.',
# Content models
'content-model-wikitext' => 'Уикимәтін',
@@ -1271,6 +1313,7 @@ $1",
'compareselectedversions' => 'Таңдалған нұÑқаларды ÑалыÑтыру',
'showhideselectedversions' => 'Бөлектенген нұÑқаларды көрÑет/жаÑÑ‹Ñ€',
'editundo' => 'жоққа шығару',
+'diff-empty' => '(айырмашылығы жоқ)',
'diff-multi' => '($2 қатыÑушының арадағы $1 түзетуі көрÑетілмеген)',
# Search results
@@ -1293,7 +1336,6 @@ $1",
'searchmenu-legend' => 'Іздеу бапталымдары',
'searchmenu-exists' => "'''Бұл жобада «[[:$1]]» деген бет бар.'''",
'searchmenu-new' => "'''\"[[:\$1]]\" оÑындай атпен бетті баÑтау'''",
-'searchhelp-url' => 'Help:Мазмұны',
'searchprofile-articles' => 'Ðегізгі беттер',
'searchprofile-project' => 'Ðнықтама және жоба беттері',
'searchprofile-images' => 'Мультимедиа',
@@ -1336,14 +1378,6 @@ $1",
Әзірше Google арқылы іздеуге болады.
Ðңғартпа: {{SITENAME}} торабының мағлұмат тізбелері еÑкірген болуы мүмкін.',
-# Quickbar
-'qbsettings' => 'Мәзір',
-'qbsettings-none' => 'Ешқандай',
-'qbsettings-fixedleft' => 'Солға бекітілген',
-'qbsettings-fixedright' => 'Оңға бекітілген',
-'qbsettings-floatingleft' => 'Солға қалқыған',
-'qbsettings-floatingright' => 'Оңға қалқыған',
-
# Preferences page
'preferences' => 'Баптаулар',
'mypreferences' => 'Баптаулар',
@@ -1376,7 +1410,6 @@ $1",
'resetprefs' => 'Сақталмаған өзгеріÑтерді тазарту',
'restoreprefs' => 'Барлығын баÑтапқы баптауларға қайтару',
'prefs-editing' => 'Өңдеу',
-'prefs-edit-boxsize' => 'Өңдеу терезеÑінің өлшемі.',
'rows' => 'Жолдар:',
'columns' => 'Бағандар:',
'searchresultshead' => 'Іздеу',
@@ -1445,6 +1478,8 @@ $1",
'prefs-dateformat' => 'Уақыт пішіні',
'prefs-timeoffset' => 'Уақыт Ñ‹Ò“Ñ‹Ñуы',
'prefs-advancedediting' => 'Ðегізгі параметрлер',
+'prefs-editor' => 'Өңдеуші',
+'prefs-preview' => 'Қарап шығу',
'prefs-advancedrc' => 'Кеңейтілген баптаулар',
'prefs-advancedrendering' => 'Кеңейтілген баптаулар',
'prefs-advancedsearchoptions' => 'Кеңейтілген баптаулар',
@@ -1477,6 +1512,8 @@ $1",
'userrights-notallowed' => 'Сізге қатыÑушы құқықтарын қоÑуға немеÑе алып таÑтауға Ñ€Ò±Ò›Ñат берілмеген.',
'userrights-changeable-col' => 'Өзгерте алатын топтар',
'userrights-unchangeable-col' => 'Өзгерте алмайтын топтар',
+'userrights-conflict' => 'ҚатыÑушы құқықтарының қақтығыÑÑ‹! Өзгертулеріңізді қайта қарап шығыңыз және құптаңыз.',
+'userrights-removed-self' => 'Өзіңіздің құқықтарыңызды Ñәтті алып таÑтадыңыз. As such, you are no longer able to access this page.',
# Groups
'group' => 'Топ:',
@@ -1542,11 +1579,19 @@ $1",
'right-proxyunbannable' => 'ПрокÑи Ñерверлердің өзбұғаттауларын орағыту',
'right-unblockself' => 'Бұғаттаудан шығару',
'right-protect' => 'Қорғау деңгейлерін өзгерту және баулы-қорғаулы беттерді өңдеу',
-'right-editprotected' => 'Қорғалған беттерді өңдеу (баулы қорғауларÑыз)',
+'right-editprotected' => 'Қорғалған беттерді өңдеу "{{int:protect-level-sysop}}"',
+'right-editsemiprotected' => 'Қорғалған беттерді өңдеу "{{int:protect-level-autoconfirmed}}"',
'right-editinterface' => 'ҚатыÑушы тілдеÑіуін өңдеу',
'right-editusercssjs' => 'БаÑқа қатыÑушылардың CSS және JS файлдарын өңдеу',
'right-editusercss' => 'БаÑқа қатыÑушылардың CSS файлдарын өңдеу',
'right-edituserjs' => 'БаÑқа қатыÑушылардың JavaScript файлдарын өңдеу',
+'right-editmyusercss' => 'Өзіңіздің қатыÑушы CSS файлдарыңызды өңдеу',
+'right-editmyuserjs' => 'Өзіңіздің қатыÑушы JavaScript файлдарыңызды өңдеу',
+'right-viewmywatchlist' => 'Бақылау тізіміңізді қарау',
+'right-editmywatchlist' => 'Өзіңіздің баптауларыңызды өңдеу. Note some actions will still add pages even without this right.',
+'right-viewmyprivateinfo' => 'Өзіңіздің жеке деректеріңізді қарау (e.g. email мекен-жай, нақты еÑім)',
+'right-editmyprivateinfo' => 'Өзіңіздің жеке деректеріңізді өңдеу (e.g. email мекен-жай, нақты еÑім)',
+'right-editmyoptions' => 'Баптауларыңызды өңдеу',
'right-rollback' => 'Белгілі бетті өңдеген Ñоңғы қатыÑушының өңдемелерінен жылдам шегіндіру',
'right-markbotedits' => 'Шегіндірлген өңдемелерді боттар өңдемелері деп белгілеу',
'right-noratelimit' => 'ЕÑелік шектелімдері ықпал етпейді',
@@ -1606,12 +1651,17 @@ $1",
'action-userrights-interwiki' => 'БаÑқа уикилердегі қатыÑушылардың құқықтарын өзгерту',
'action-siteadmin' => 'Дерекқорды бұғаттау немеÑе бұғаттан шығару',
'action-sendemail' => 'Ñлектронды хаттарды жіберу',
+'action-editmywatchlist' => 'бақылауыңызды өңдеу',
+'action-viewmywatchlist' => 'бақылау тізіміңізді қарау',
+'action-viewmyprivateinfo' => 'жеке ақпараттарыңызды қарау',
+'action-editmyprivateinfo' => 'жеке ақпараттарыңызды өңдеу',
# Recent changes
'nchanges' => '$1 өзгеріÑ',
'recentchanges' => 'Жуықтағы өзгеріÑтер',
'recentchanges-legend' => 'Жуықтағы өзгеріÑтер баптаулары',
'recentchanges-summary' => 'Бұл бетте оÑÑ‹ уикидегі болған жуықтағы өзгеріÑтер байқалады.',
+'recentchanges-noresult' => 'Бұл талап бойынша көрÑетілген уақыттан бері өзгеріÑтер болған жоқ.',
'recentchanges-feed-description' => 'Бұл арнаменен уикидегі ең Ñоңғы өзгеріÑтер қадағаланады.',
'recentchanges-label-newpage' => 'Бұл өңдеме арқылы жаңа бет баÑталды',
'recentchanges-label-minor' => 'Бұл шағын өңдеме',
@@ -1648,7 +1698,6 @@ $1",
'recentchangeslinked-feed' => 'ҚатыÑÑ‚Ñ‹ өзгеріÑтер',
'recentchangeslinked-toolbox' => 'ҚатыÑÑ‚Ñ‹ өзгеріÑтер',
'recentchangeslinked-title' => '«$1» дегенге қатыÑÑ‚Ñ‹ өзгеріÑтер',
-'recentchangeslinked-noresult' => 'Сілтеген беттерде келтірілген мерзімде ешқандай Ó©Ð·Ð³ÐµÑ€Ñ–Ñ Ð±Ð¾Ð»Ð¼Ð°Ò“Ð°Ð½.',
'recentchangeslinked-summary' => "Бұл тізімде өзіндік бетке Ñілтеген беттердегі (не өзіндік Ñанат мүшелеріндегі) Ñ–Ñтелген жуықтағы өзгеріÑтер беріледі.
[[Special:Watchlist|Бақылау тізіміңіздегі]] беттер '''жуан''' болып белгіленеді.",
'recentchangeslinked-page' => 'Бет атауы:',
@@ -1660,7 +1709,7 @@ $1",
'reuploaddesc' => 'Жүктеу пішініне қайта келу.',
'upload-tryagain' => 'Файл ÑипаттамаÑының өзгеріÑтерін жөнелту',
'uploadnologin' => 'КірмегенÑіз',
-'uploadnologintext' => 'Файлдарды жүктеу үшін [[Special:UserLogin|кіруіңіз]] жөн.',
+'uploadnologintext' => 'Файлдарды $1 жүктеуіңіз керек.',
'upload_directory_missing' => 'Жүктеу қалтаÑÑ‹ ($1) жетіÑпейді және веб-Ñервер жарата алмайды.',
'upload_directory_read_only' => 'Жүктеу қалтаÑына ($1) веб-Ñервер жаза алмайды.',
'uploaderror' => 'Жүктеу қатеÑÑ–',
@@ -1905,6 +1954,12 @@ URL Ð´Ò±Ñ€Ñ‹Ñ ÐµÐºÐµÐ½Ð´Ñ–Ð³Ñ–Ð½ және торап Ñ–Ñтеп тұрғаныÐ
'randompage' => 'КездейÑоқ бет',
'randompage-nopages' => 'Мұнда келеÑÑ– {{PLURAL:$2|еÑім кеңіÑтігі|еÑім кеңіÑтігінде}}: $1 беттер жоқ.',
+# Random page in category
+'randomincategory' => 'Санаттағы кездейÑоқ бет',
+'randomincategory-invalidcategory' => '"$1" жарамды Ñанат аты емеÑ.',
+'randomincategory-nopages' => 'Бұлар [[:Category:$1]] беттері меÑ.',
+'randomincategory-selectcategory-submit' => 'Өту',
+
# Random redirect
'randomredirect' => 'КездейÑоқ айдағыш',
'randomredirect-nopages' => 'Бұл еÑім аÑÑында еш айдағыш жоқ "$1".',
@@ -1930,12 +1985,6 @@ URL Ð´Ò±Ñ€Ñ‹Ñ ÐµÐºÐµÐ½Ð´Ñ–Ð³Ñ–Ð½ және торап Ñ–Ñтеп тұрғаныÐ
'statistics-users-active-desc' => 'Соңғы {{PLURAL:$1|күнде|$1 күнде}} қандай да бір Ñ–Ñ-әрекет жаÑаған қатыÑушылар',
'statistics-mostpopular' => 'Ең көп қаралған беттер',
-'disambiguations' => 'Ðйрықты беттерге Ñілтенген беттер',
-'disambiguationspage' => '{{ns:template}}:Ðйрық',
-'disambiguations-text' => "КелеÑÑ– беттер '''айрықты бетке''' Ñілтейді.
-Бұның орнына белгілі тақырыпқа Ñілтеуі керек.<br />
-Егер [[MediaWiki:Disambiguationspage]] тізіміндегі үлгі қолданылÑа, бет айрықты деп Ñаналады.",
-
'pageswithprop' => 'Беттер бет Ñипатымен',
'pageswithprop-legend' => 'Беттер бет Ñипатымен',
'pageswithprop-prop' => 'Меншік атауы:',
@@ -2171,10 +2220,9 @@ URL Ð´Ò±Ñ€Ñ‹Ñ ÐµÐºÐµÐ½Ð´Ñ–Ð³Ñ–Ð½ және торап Ñ–Ñтеп тұрғаныÐ
'unwatchthispage' => 'Бақылауды тоқтату',
'notanarticle' => 'Мағлұмат беті емеÑ',
'notvisiblerev' => 'Түзету жойылды',
-'watchnochange' => 'КөрÑетілген мерзімде еш бақыланған дана өңделген жоқ.',
'watchlist-details' => 'Тізіміңізде $1 бет бар (талқылау беттері Ñаналмайды).',
-'wlheader-enotif' => '* ЕÑкерту хат жіберуі қоÑылған.',
-'wlheader-showupdated' => "* Соңғы келіп-кетуіңізден бері өзгертілген беттерді '''жуан''' қаріпімен көрÑет",
+'wlheader-enotif' => 'ЕÑкерту хат жіберуі қоÑылған.',
+'wlheader-showupdated' => "Соңғы келіп-кетуіңізден бері өзгертілген беттерді '''жуан''' қаріпімен көрÑет",
'watchmethod-recent' => 'бақылаулы беттер үшін жуықтағы өзгеріÑтерді текÑеру',
'watchmethod-list' => 'жуықтағы өзгеріÑтер үшін бақылаулы беттерді текÑеру',
'watchlistcontains' => 'Бақылау тізіміңізде $1 бет бар.',
@@ -2571,12 +2619,9 @@ $1 бұғаттауы үшін келтірілген Ñебебі: «$2».',
'ipb_blocked_as_range' => 'Қателік: IP $1 тікелей бұғатталмаған және бұғаттауы өшірілмейді.
Бірақ, бұл бұғаттауы өшірілуі мүмкін $2 ауқымы бөлігі боп бұғатталған.',
'ip_range_invalid' => 'IP мекенжай ауқымы жарамÑыз.',
-'blockme' => 'Тіркелгімді бұғатта',
'proxyblocker' => 'ПрокÑи Ñерверлерді бұғаттауыш',
-'proxyblocker-disabled' => 'Бұл жете өшірілген.',
'proxyblockreason' => 'IP мекенжайыңыз ашық прокÑи Ñерверге жататындықтан бұғатталған.
Интернет қызметін жабдықтаушыңызбен, не техникалық қолдау қызметімен қатынаÑыңыз, және оларға оÑÑ‹ оте күрделі қауыпÑіздік шатақ туралы ақпарат беріңіз.',
-'proxyblocksuccess' => 'Орындалды.',
'sorbsreason' => 'IP мекенжайыңыз {{SITENAME}} торабында қолданылған DNSBL қара тізіміндегі ашық прокÑи-Ñервер деп табылады.',
'sorbs_create_account_reason' => 'IP мекенжайыңыз {{SITENAME}} торабында қолданылған DNSBL қара тізіміндегі ашық прокÑи-Ñервер деп табылады.
Жаңа тіркелгі жаÑай алмайÑыз.',
@@ -2719,6 +2764,8 @@ MediaWiki жүйеÑінің [[{{#special:Import}}|Ñырттан алу бетÑ
'thumbnail-more' => 'Үлкейту',
'filemissing' => 'Жоғалған файл',
'thumbnail_error' => 'Ðобай құру қатеÑÑ–: $1',
+'thumbnail_error_remote' => '$1 дегеннен хабарлама қатеÑÑ–:
+$2',
'djvu_page_error' => 'DjVu беті аумақ Ñыртындда',
'djvu_no_xml' => 'DjVu файлы үшін XML келтіруі икемді емеÑ',
'thumbnail_invalid_params' => 'Ðобайдың бапталымдары жарамÑыз',
@@ -2843,24 +2890,14 @@ MediaWiki жүйеÑінің [[{{#special:Import}}|Ñырттан алу бетÑ
# Stylesheets
'common.css' => '/* Мында орналаÑтырылған CSS барлық мәнерлерде қолданылады */',
-'standard.css' => '/* Мында орналаÑтырылған CSS тек «Дағдылы» (standard) мәнерін пайдаланушыларына ықпал етеді */',
-'nostalgia.css' => '/* Мында орналаÑтырылған CSS тек «ÐÒ£Ñау» (nostalgia) мәнерін пайдаланушыларына ықпал етеді */',
'cologneblue.css' => '/* Мында орналаÑтырылған CSS тек «Көлн зеңгірлігі» (cologneblue) мәнерін пайдаланушыларына ықпал етеді skin */',
'monobook.css' => '/* Мында орналаÑтырылған CSS тек «Дара кітап» (monobook) мәнерін пайдаланушыларына ықпал етеді */',
-'myskin.css' => '/* Мында орналаÑтырылған CSS тек «Өз мәнерім» (myskin) мәнерін пайдаланушыларына ықпал етеді */',
-'chick.css' => '/* Мында орналаÑтырылған CSS тек «Балапан» (chick) мәнерін пайдаланушыларына ықпал етеді */',
-'simple.css' => '/* Мында орналаÑтырылған CSS тек «Кәдімгі» (simple) мәнерін пайдаланушыларына ықпал етеді */',
'modern.css' => '/* Мында орналаÑтырылған CSS тек «Заманауи» (modern) мәнерін пайдаланушыларына ықпал етеді */',
# Scripts
'common.js' => '/* Мындағы әртүрлі JavaScript кез келген бет қотарылғанда барлық пайдаланушылар үшін жегіледі. */',
-'standard.js' => '/* Мындағы JavaScript тек «Дағдылы» (standard) мәнерін пайдаланушылар үшін жегіледі */',
-'nostalgia.js' => '/* Мындағы JavaScript тек «ÐÒ£Ñау» (nostalgia) мәнерін пайдаланушылар үшін жегіледі*/',
'cologneblue.js' => '/* Мындағы JavaScript тек «Көлн зеңгірлігі» (cologneblue) мәнерін пайдаланушылар үшін жегіледі */',
'monobook.js' => '/* Мындағы JavaScript тек «Дара кітап» (monobook) мәнерін пайдаланушылар үшін жегіледі */',
-'myskin.js' => '/* Мындағы JavaScript тек «Өз мәнерім» (myskin) мәнерін пайдаланушылар үшін жегіледі */',
-'chick.js' => '/* Мындағы JavaScript тек «Балапан» (chick) мәнерін пайдаланушылар үшін жегіледі */',
-'simple.js' => '/* Мындағы JavaScript тек «Кәдімгі» (simple) мәнерін пайдаланушылар үшін жегіледі */',
'modern.js' => '/* Мындағы JavaScript тек «Заманауи» (modern) мәнерін пайдаланушылар үшін жегіледі */',
# Metadata
@@ -2930,13 +2967,8 @@ MediaWiki жүйеÑінің [[{{#special:Import}}|Ñырттан алу бетÑ
'pageinfo-category-files' => 'Файлдар Ñаны',
# Skin names
-'skinname-standard' => 'Дағдылы (standard)',
-'skinname-nostalgia' => 'ÐÒ£Ñау (nostalgia)',
'skinname-cologneblue' => 'Көк зеңгірлігі (cologneblue)',
'skinname-monobook' => 'Дара кітап (monobook)',
-'skinname-myskin' => 'Өз мәнерім (myskin)',
-'skinname-chick' => 'Балапан (chick)',
-'skinname-simple' => 'Кәдімгі (simple)',
'skinname-modern' => 'Заманауи (modern)',
# Patrolling
@@ -3012,11 +3044,17 @@ $1',
'minutes' => '{{PLURAL:$1|$1 минут|$1 минут}}',
'hours' => '{{PLURAL:$1|$1 Ñағат|$1 Ñағат}}',
'days' => '{{PLURAL:$1|$1 күн|$1 күн}}',
+'weeks' => '{{PLURAL:$1|$1 апта|$1 апта}}',
'months' => '{{PLURAL:$1|$1 ай|$1 ай}}',
'years' => '{{PLURAL:$1|$1 жыл|$1 жыл}}',
'ago' => '$1 бұрын',
'just-now' => 'Дәл қазір',
+# Human-readable timestamps
+'hours-ago' => '$1 {{PLURAL:$1|Ñағат|Ñағат}} бұрын',
+'minutes-ago' => '$1 {{PLURAL:$1|минут|минут}} бұрын',
+'seconds-ago' => '$1 {{PLURAL:$1|Ñекунт|Ñекунт}} бұрын',
+
# Bad image list
'bad_image_list' => 'Пішімі төмендегідей:
@@ -3046,7 +3084,7 @@ $1',
* gpslongitude
* gpsaltitude',
-# EXIF tags
+# Exif tags
'exif-imagewidth' => 'Ені',
'exif-imagelength' => 'Биіктігі',
'exif-bitspersample' => 'Құраш Ñайын бит Ñаны',
@@ -3191,7 +3229,7 @@ $1',
'exif-copyrighted' => 'Ðвторлық құқық күйі:',
'exif-copyrightowner' => 'Ðвторлық құқықтар иеÑÑ–',
-# EXIF attributes
+# Exif attributes
'exif-compression-1' => 'Ұлғайтылған',
'exif-unknowndate' => 'БелгіÑіз күн-айы',
@@ -3568,7 +3606,6 @@ $5
'version-other' => 'Тағы баÑқалар',
'version-mediahandlers' => 'Медиа өңдеткіштері',
'version-hooks' => 'Жете тұзақтары',
-'version-extension-functions' => 'Кеңейтімдер жетелері',
'version-parser-extensiontags' => 'Құрылымдық талдатқыш кеңейтімдерінің белгілемері',
'version-parser-function-hooks' => 'Құрылымдық талдатқыш жетелерінің тұзақтары',
'version-hook-name' => 'Тұзақ атауы',
@@ -3581,12 +3618,15 @@ $5
'version-software-version' => 'ÐÒ±ÑқаÑÑ‹',
'version-entrypoints-header-url' => 'URL',
-# Special:FilePath
-'filepath' => 'Файл орналаÑуы',
-'filepath-page' => 'Файл аты:',
-'filepath-submit' => 'ОрналаÑуын тап',
-'filepath-summary' => 'Бұл арнайы бет файл орналаÑуы толық жолын қайтарады.
-Суреттер толық ажыратылымдығымен көрÑетіледі, баÑқа файл түрлеріне қатыÑÑ‚Ñ‹ бағдарламаÑÑ‹ тура жегіледі.',
+# Special:Redirect
+'redirect-legend' => 'Файл немеÑе бетке айдатулар',
+'redirect-submit' => 'Өту',
+'redirect-lookup' => 'Іздеу:',
+'redirect-value' => 'Мән:',
+'redirect-user' => 'ҚатыÑушы ID',
+'redirect-revision' => 'Бет түзетуі',
+'redirect-file' => 'Файл атауы',
+'redirect-not-exists' => 'Мән табылмады',
# Special:FileDuplicateSearch
'fileduplicatesearch' => 'Файл телнұÑқаларын іздеу',
@@ -3625,11 +3665,14 @@ $5
'tags' => 'Тектерді өзгерту жарамÑыз',
'tag-filter' => '[[Special:Tags|Тег]] ÑүзгіÑÑ–:',
'tag-filter-submit' => 'Сүзгі',
+'tag-list-wrapper' => '([[Special:Tags|{{PLURAL:$1|Тег|Тег}}]]: $2)',
'tags-title' => 'Тегтер',
'tags-tag' => 'Тег атауы',
'tags-display-header' => 'Ó¨Ð·Ð³ÐµÑ€Ñ–Ñ Ñ‚Ñ–Ð·Ñ–Ð¼Ñ–Ð½Ð´ÐµÐ³Ñ– көрініÑÑ–',
'tags-description-header' => 'Толық Ñипаттама мәні',
-'tags-hitcount-header' => 'Телгіленген өзгеріÑтер',
+'tags-active-header' => 'БелÑенді ме?',
+'tags-hitcount-header' => 'Тегтелген өзгеріÑтер',
+'tags-active-yes' => 'Иә',
'tags-edit' => 'өңдеу',
'tags-hitcount' => '$1 {{PLURAL:$1|өзгеріÑ|өзгеріÑ}}',
@@ -3650,6 +3693,8 @@ $5
'htmlform-submit' => 'Жіберу',
'htmlform-reset' => 'ӨзгеріÑтерді болдырмау',
'htmlform-selectorother-other' => 'БаÑқа',
+'htmlform-no' => 'Жоқ',
+'htmlform-yes' => 'Иә',
# New logging system
'logentry-delete-delete' => '$1 $3 деген бетті {{GENDER:$2|жойды}}',
@@ -3667,7 +3712,7 @@ $5
'logentry-move-move_redir' => '$1 $3 бетін $4 деген айдатқыш Ò¯Ñтіне {{GENDER:$2|жылжытты}}',
'logentry-move-move_redir-noredirect' => '$1 $3 бетін $4 деген айдатқыш Ò¯Ñтіне {{GENDER:$2|жылжытты}} (айдатқыш қалдырылмады)',
'logentry-newusers-newusers' => '$1 жаңадан қатыÑушы тіркелгіÑін {{GENDER:$2|жаÑады}}',
-'logentry-newusers-create' => '$1 жаңадан қатыÑушы тіркелгіÑÑ– {{GENDER:$2|жаÑады}}',
+'logentry-newusers-create' => '$1 жаңадан аккаунт тіркеді',
'logentry-newusers-create2' => '$1 $3 деген аккаунт тіркеді',
'logentry-newusers-autocreate' => '$1 қатыÑушы аккаунтын автоматты түрде {{GENDER:$2|тіркеді}}',
'logentry-rights-rights' => '$1 $3 үшін топ мүшелігін $4 дегеннен $5 дегенге {{GENDER:$2|өзгерті}}',
diff --git a/languages/messages/MessagesKk_latn.php b/languages/messages/MessagesKk_latn.php
index 608ad71f..67e7cf74 100644
--- a/languages/messages/MessagesKk_latn.php
+++ b/languages/messages/MessagesKk_latn.php
@@ -383,9 +383,6 @@ $messages = array(
'tog-enotifrevealaddr' => 'E-poştamnıñ mekenjaýın eskertw xattarda aş',
'tog-shownumberswatching' => 'Baqılap turğan qatıswşılardıñ sanın körset',
'tog-fancysig' => 'Qam qoltañba (özdiktik siltemesiz)',
-'tog-externaleditor' => 'Şettik öñdewişti ädepkiden qoldan (tek sarapşılar üşin, komp′ywteriñizde arnawlı baptalımdar kerek)',
-'tog-externaldiff' => 'Şettik aýırmağıştı ädepkiden qoldan (tek sarapşılar üşin, komp′ywteriñizde arnawlı baptalımdar kerek)',
-'tog-showjumplinks' => '«Ötip ketw» qatınaw siltemelerin qos',
'tog-uselivepreview' => 'Twra qarap şığwdı qoldanw (JavaScript) (Sınaqtama)',
'tog-forceeditsummary' => 'Öñdemeniñ qısqaşa mazmundaması bos qalğanda mağan eskert',
'tog-watchlisthideown' => 'Öñdemelerimdi baqılaw tizimnen jasır',
@@ -542,7 +539,7 @@ $messages = array(
'jumptonavigation' => 'ÅŸarlaw',
'jumptosearch' => 'izdew',
-# 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).
+# 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).
'aboutsite' => '{{SITENAME}} twralı',
'aboutpage' => 'Project:Joba twralı',
'copyright' => 'Mağlumat $1 şartımen jetimdi.',
@@ -552,7 +549,6 @@ $messages = array(
'disclaimers' => 'JawapkerÅŸilikten bas tartw',
'disclaimerpage' => 'Project:JawapkerÅŸilikten bas tartw',
'edithelp' => 'Öndew anıqtaması',
-'edithelppage' => 'Help:Öñdew',
'helppage' => 'Help:Mazmunı',
'mainpage' => 'Bastı bet',
'mainpage-description' => 'Bastı bet',
@@ -618,17 +614,6 @@ Jaramdı arnaýı bet tizimin [[{{#special:Specialpages}}|{{int:specialpages}}]]
# General errors
'error' => 'Qate',
'databaseerror' => 'Derekqor qatesi',
-'dberrortext' => 'Derekqor suranımında söýlem jüýesiniñ qatesi boldı.
-Bul bağdarlamalıq jasaqtama qatesin belgilewi mümkin.
-Soñğı bolğan derekqor suranımı:
-<blockquote><tt>$1</tt></blockquote>
-mına jeteden «<tt>$2</tt>».
-MySQL qaýtarğan qatesi «<tt>$3: $4</tt>».',
-'dberrortextcl' => 'Derekqor suranımında söýlem jüýesiniñ qatesi boldı.
-Soñğı bolğan derekqor suranımı:
-«$1»
-mına jeteden: «$2».
-MySQL qaýtarğan qatesi «$3: $4»',
'laggedslavemode' => 'Qulaqtandırw: Bette jwıqtağı jañalawlar bolmawı mümkin.',
'readonly' => 'Derekqorı qulıptalğan',
'enterlockreason' => 'Qulıptaw sebebin, qaý waqıtqa deýin qulıptalğanın kiristirip, engiziñiz',
@@ -676,7 +661,6 @@ Birneşe mïnöttan qaýta baýqap köriñiz.',
'editinginterface' => "'''Qulaqtandırw:''' Bağdarlamalıq jasaqtamanıñ tildesw mätinin jetistiretin betin öñdep jatırsız.
Bul bettiñ özgertwi basqa qatıswşılarğa paýdalanwşılıq tildeswi qalaý körinetine äser etedi.
Awdarmalar üşin, MediaWiki bağdarlamasın jersindirw [//translatewiki.net/wiki/Main_Page?setlang=kk translatewiki.net jobası] arqılı qarap şeşiñiz.",
-'sqlhidden' => '(SQL suranımı jasırılğan)',
'cascadeprotected' => 'Bul bet öñdewden qorğalğan, sebebi bul kelesi «bawlı qorğawı» qosılğan {{PLURAL:$1|bettiñ|betterdiñ}} kirikbeti:
$2',
'namespaceprotected' => "'''$1''' esim ayasındağı betterdi öñdew üşin ruqsatıñız joq.",
@@ -775,7 +759,7 @@ Kirwiñizdi bitirw üşin, jaña qupïya söziñizdi mında engizwiñiz jön:',
'newpassword' => 'Jaña qupïya söziñiz:',
'retypenew' => 'Jaña qupïya söziñizdi qaýtalañız:',
'resetpass_submit' => 'Qupïya sözdi qoýıñız da kiriñiz',
-'resetpass_success' => 'Qupïya söziñiz sätti özgertildi! Endi kiriñiz…',
+'changepassword-success' => 'Qupïya söziñiz sätti özgertildi! Endi kiriñiz…',
'resetpass_forbidden' => '{{SITENAME}} jobasında qupïya sözder özgertilmeýdi',
# Edit page toolbar
@@ -1077,7 +1061,6 @@ Añğartpa: bağıttaw siltemelerin qoldanğanda bul bağan qaýta qoýıladı.'
'prevn' => 'aldıñğı {{PLURAL:$1|$1}}',
'nextn' => 'kelesi {{PLURAL:$1|$1}}',
'viewprevnext' => 'Körsetilwi: ($1 {{int:pipe-separator}} $2) ($3) jazba',
-'searchhelp-url' => 'Help:Mazmunı',
'search-result-size' => '$1 ($2 söz)',
'search-result-score' => 'Araqatınastılığı: $1 %',
'search-redirect' => '(aýdağış $1)',
@@ -1103,14 +1086,6 @@ Añğartpa: bağıttaw siltemelerin qoldanğanda bul bağan qaýta qoýıladı.'
Äzirşe Google arqılı izdewge boladı.
Añğartpa: {{SITENAME}} torabınıñ mağlumat tizbeleri eskirgen bolwı mümkin.',
-# Quickbar
-'qbsettings' => 'Mäzir',
-'qbsettings-none' => 'Eşqandaý',
-'qbsettings-fixedleft' => 'SolÄŸa bekitilgen',
-'qbsettings-fixedright' => 'Oñğa bekitilgen',
-'qbsettings-floatingleft' => 'Solğa qalqığan',
-'qbsettings-floatingright' => 'Oñğa qalqığan',
-
# Preferences page
'preferences' => 'Baptalımdar',
'mypreferences' => 'Baptalımdarım',
@@ -1306,7 +1281,6 @@ Eger bunı jetistirwdi tañdasañız, bul tüzetwiñizdiñ awtorlığın anıqta
'recentchangeslinked-feed' => 'Qatıstı özgerister',
'recentchangeslinked-toolbox' => 'Qatıstı özgerister',
'recentchangeslinked-title' => '«$1» degenge qatıstı özgerister',
-'recentchangeslinked-noresult' => 'Siltegen betterde keltirilgen merzimde eşqandaý özgeris bolmağan.',
'recentchangeslinked-summary' => "Bul tizimde özindik betke siltegen betterdegi (ne özindik sanat müşelerindegi) istelgen jwıqtağı özgerister beriledi.
[[{{#special:Watchlist}}|Baqılaw tizimiñizdegi]] better '''jwan''' bolıp belgilenedi.",
'recentchangeslinked-page' => 'Bet atawı:',
@@ -1513,12 +1487,6 @@ Kirisi: mağlumat_türi/tür_tarawı, mısalı <code>image/jpeg</code>.',
'statistics-header-users' => 'Qatıswşı sanağı',
'statistics-mostpopular' => 'Eñ köp qaralğan better',
-'disambiguations' => 'Aýrıqtı better',
-'disambiguationspage' => '{{ns:template}}:Aýrıq',
-'disambiguations-text' => "Kelesi better '''aýrıqtı betke''' silteýdi.
-Bunıñ ornına belgili taqırıpqa siltewi kerek.<br />
-Eger [[MediaWiki:Disambiguationspage]] tizimindegi ülgi qoldanılsa, bet aýrıqtı dep sanaladı.",
-
'doubleredirects' => 'Şınjırlı aýdağıştar',
'doubleredirectstext' => 'Bul bette basqa aýdatw betterge silteýtin better tizimdelinedi. Ärbir jolaqta birinşi jäne ekinşi aýdağışqa siltemeler bar, sonımen birge ekinşi aýdağış nısanası bar, ädette bul birinşi aýdağış bağıttaýtın «naqtı» nısana bet atawı bolwı kerek.',
@@ -1693,10 +1661,9 @@ Bul bettiñ jäne baýlanıstı talqılaw betiniñ keleşektegi özgeristeri mı
'unwatchthispage' => 'Baqılawdı toqtatw',
'notanarticle' => 'MaÄŸlumat beti emes',
'notvisiblerev' => 'Tüzetw joýıldı',
-'watchnochange' => 'Körsetilgen merzimde eş baqılanğan dana öñdelgen joq.',
'watchlist-details' => 'Talqılaw betterin sanamağanda $1 bet baqlanıladı.',
-'wlheader-enotif' => '* Eskertw xat jiberwi qosılğan.',
-'wlheader-showupdated' => "* Soñğı kelip-ketwiñizden beri özgertilgen betterdi '''jwan''' qaripimen körset",
+'wlheader-enotif' => 'Eskertw xat jiberwi qosılğan.',
+'wlheader-showupdated' => "Soñğı kelip-ketwiñizden beri özgertilgen betterdi '''jwan''' qaripimen körset",
'watchmethod-recent' => 'baqılawlı better üşin jwıqtağı özgeristerdi tekserw',
'watchmethod-list' => 'jwıqtağı özgerister üşin baqılawlı betterdi tekserw',
'watchlistcontains' => 'Baqılaw tizimiñizde $1 bet bar.',
@@ -2011,12 +1978,9 @@ Ağımdağı belsendi tïımdar men buğattawlardı [[{{#special:Ipblocklist}}|I
'ipb_blocked_as_range' => 'Qatelik: IP $1 tikeleý buğattalmağan jäne buğattawı öşirilmeýdi.
Biraq, bul buğattawı öşirilwi mümkin $2 awqımı böligi bop buğattalğan.',
'ip_range_invalid' => 'IP mekenjaý awqımı jaramsız.',
-'blockme' => 'Özdiktik_buğattaw',
'proxyblocker' => 'Proksï serverlerdi buğattawış',
-'proxyblocker-disabled' => 'Bul jete öşirilgen.',
'proxyblockreason' => 'IP mekenjaýıñız aşıq proksï serverge jatatındıqtan buğattalğan.
Ãnternet qızmetin jabdıqtawşıñızben, ne texnïkalıq qoldaw qızmetimen qatınasıñız, jäne olarÄŸa osı ote kürdeli qawıpsizdik ÅŸataq twralı aqparat beriñiz.',
-'proxyblocksuccess' => 'Bitti.',
'sorbsreason' => 'IP mekenjaýıñız {{SITENAME}} torabında qoldanılğan DNSBL qara tizimindegi aşıq proksï-server dep tabıladı.',
'sorbs_create_account_reason' => 'IP mekenjaýıñız {{SITENAME}} torabında qoldanılğan DNSBL qara tizimindegi aşıq proksï-server dep tabıladı.
Jaña tirkelgi jasaý almaýsız.',
@@ -2236,24 +2200,14 @@ Wïkï-aparw üşin sırttan alw barlıq äreketter [[{{#special:Log}}/import|sÄ
# Stylesheets
'common.css' => '/* Mında ornalastırılğan CSS barlıq mänerlerde qoldanıladı */',
-'standard.css' => '/* Mında ornalastırılğan CSS tek «Dağdılı» (standard) mänerin paýdalanwşılarına ıqpal etedi */',
-'nostalgia.css' => '/* Mında ornalastırılğan CSS tek «Añsaw» (nostalgia) mänerin paýdalanwşılarına ıqpal etedi */',
'cologneblue.css' => '/* Mında ornalastırılğan CSS tek «Köln zeñgirligi» (cologneblue) mänerin paýdalanwşılarına ıqpal etedi skin */',
'monobook.css' => '/* Mında ornalastırılğan CSS tek «Dara kitap» (monobook) mänerin paýdalanwşılarına ıqpal etedi */',
-'myskin.css' => '/* Mında ornalastırılğan CSS tek «Öz mänerim» (myskin) mänerin paýdalanwşılarına ıqpal etedi */',
-'chick.css' => '/* Mında ornalastırılğan CSS tek «Balapan» (chick) mänerin paýdalanwşılarına ıqpal etedi */',
-'simple.css' => '/* Mında ornalastırılğan CSS tek «Kädimgi» (simple) mänerin paýdalanwşılarına ıqpal etedi */',
'modern.css' => '/* Mında ornalastırılğan CSS tek «Zamanawï» (modern) mänerin paýdalanwşılarına ıqpal etedi */',
# Scripts
'common.js' => '/* Mındağı ärtürli JavaScript kez kelgen bet qotarılğanda barlıq paýdalanwşılar üşin jegiledi. */',
-'standard.js' => '/* Mındağı JavaScript tek «Dağdılı» (standard) mänerin paýdalanwşılar üşin jegiledi */',
-'nostalgia.js' => '/* Mındağı JavaScript tek «Añsaw» (nostalgia) mänerin paýdalanwşılar üşin jegiledi*/',
'cologneblue.js' => '/* Mındağı JavaScript tek «Köln zeñgirligi» (cologneblue) mänerin paýdalanwşılar üşin jegiledi */',
'monobook.js' => '/* Mındağı JavaScript tek «Dara kitap» (monobook) mänerin paýdalanwşılar üşin jegiledi */',
-'myskin.js' => '/* Mındağı JavaScript tek «Öz mänerim» (myskin) mänerin paýdalanwşılar üşin jegiledi */',
-'chick.js' => '/* Mındağı JavaScript tek «Balapan» (chick) mänerin paýdalanwşılar üşin jegiledi */',
-'simple.js' => '/* Mındağı JavaScript tek «Kädimgi» (simple) mänerin paýdalanwşılar üşin jegiledi */',
'modern.js' => '/* Mındağı JavaScript tek «Zamanawï» (modern) mänerin paýdalanwşılar üşin jegiledi */',
# Metadata
@@ -2279,13 +2233,8 @@ Bunıñ sebebi şettik torap siltemesinen bolwı mümkin.',
'spam_blanking' => '$1 degenge siltemeleri bar barlıq tüzetwler tazartıldı',
# Skin names
-'skinname-standard' => 'Dağdılı (standard)',
-'skinname-nostalgia' => 'Añsaw (nostalgia)',
'skinname-cologneblue' => 'Köln zeñgirligi (cologneblue)',
'skinname-monobook' => 'Dara kitap (monobook)',
-'skinname-myskin' => 'Öz mänerim (myskin)',
-'skinname-chick' => 'Balapan (chick)',
-'skinname-simple' => 'Kädimgi (simple)',
'skinname-modern' => 'Zamanawï (modern)',
# Patrolling
@@ -2373,7 +2322,7 @@ Basqaları ädepkiden jasırıladı.
* gpslongitude
* gpsaltitude',
-# EXIF tags
+# Exif tags
'exif-imagewidth' => 'Eni',
'exif-imagelength' => 'Bïiktigi',
'exif-bitspersample' => 'Quraş saýın bït sanı',
@@ -2487,7 +2436,7 @@ Basqaları ädepkiden jasırıladı.
'exif-gpsdatestamp' => 'GPS kün-aýı',
'exif-gpsdifferential' => 'GPS saralanğan durıstaw',
-# EXIF attributes
+# Exif attributes
'exif-compression-1' => 'Ulğaýtılğan',
'exif-unknowndate' => 'Belgisiz kün-aýı',
@@ -2806,7 +2755,6 @@ Tağı da [[Special:EditWatchlist|qalıpalğan öñdewişti paýdalana]] alasız
'version-other' => 'Tağı basqalar',
'version-mediahandlers' => 'Taspa öñdetkişteri',
'version-hooks' => 'Jete tuzaqtarı',
-'version-extension-functions' => 'Keñeýtimder jeteleri',
'version-parser-extensiontags' => 'Qurılımdıq taldatqış keñeýtimderiniñ belgilemeri',
'version-parser-function-hooks' => 'Qurılımdıq taldatqış jeteleriniñ tuzaqtarı',
'version-hook-name' => 'Tuzaq atawı',
@@ -2817,13 +2765,6 @@ Tağı da [[Special:EditWatchlist|qalıpalğan öñdewişti paýdalana]] alasız
'version-software-product' => 'Önim',
'version-software-version' => 'Nusqası',
-# Special:FilePath
-'filepath' => 'Faýl ornalaswı',
-'filepath-page' => 'Faýl atı:',
-'filepath-submit' => 'Ornalaswın tap',
-'filepath-summary' => 'Bul arnaýı bet faýl ornalaswı tolıq jolın qaýtaradı.
-Swretter tolıq ajıratılımdığımen körsetiledi, basqa faýl türlerine qatıstı bağdarlaması twra jegiledi.',
-
# Special:FileDuplicateSearch
'fileduplicatesearch' => 'Faýl telnusqaların izdew',
'fileduplicatesearch-summary' => 'Faýl xeşi mağınası negizinde telnusqaların izdew.',
diff --git a/languages/messages/MessagesKm.php b/languages/messages/MessagesKm.php
index 77257275..912e9307 100644
--- a/languages/messages/MessagesKm.php
+++ b/languages/messages/MessagesKm.php
@@ -12,6 +12,7 @@
* @author Kaganer
* @author Kiensvay
* @author Lovekhmer
+ * @author Nemo bis
* @author Sovichet
* @author T-Rithy
* @author Thearith
@@ -291,9 +292,6 @@ $messages = array(
'tog-shownumberswatching' => 'បង្ហាញ​ចំនួនអ្នកប្រើប្រាស់​ដែលážáž¶áž˜ážŠáž¶áž“​ទំពáŸážšáž“áŸáŸ‡',
'tog-oldsig' => 'áž ážáŸ’ážáž›áŸážáž¶áž˜áž¶áž“ហើយ៖',
'tog-fancysig' => 'ចុះហážáŸ’ážáž›áŸážáž¶â€‹áž‡áž¶â€‹áž¢ážáŸ’ážáž”ទវិគី​ (ដោយ​គ្មានážáŸ†ážŽáž—្ជាប់​ស្វáŸáž™áž”្រវážáŸ’ážáž·)',
-'tog-externaleditor' => 'ប្រើប្រាស់​ឧបករណáŸâ€‹áž€áŸ‚ប្រែážáž¶áž„ក្រៅ​ážáž¶áž˜áž›áŸ†áž“ាំដើម (សម្រាប់ážáŸ‚អ្នកមានជំនាញប៉ុណ្ណោះនិងážáŸ’រូវការការកំណážáŸ‹áž–ិសáŸážŸáŸ—នៅលើកុំព្យូទáŸážšážšáž”ស់អ្នក។ [//www.mediawiki.org/wiki/Manual:External_editors áž–áŸážáŸŒáž˜áž¶áž“បន្ážáŸ‚ម]។)',
-'tog-externaldiff' => 'ប្រើប្រាស់​ឧបករណáŸâ€‹áž”្រៀបធៀបážáž¶áž„ក្រៅ​ážáž¶áž˜áž›áŸ†áž“ាំដើម (សម្រាប់ážáŸ‚អ្នកមានជំនាញប៉ុណ្ណោះនិងážáŸ’រូវការការកំណážáŸ‹áž–ិសáŸážŸáŸ—នៅលើកុំព្យូទáŸážšážšáž”ស់អ្នក។ [//www.mediawiki.org/wiki/Manual:External_editors áž–áŸážáŸŒáž˜áž¶áž“បន្ážáŸ‚ម]។)',
-'tog-showjumplinks' => 'ប្រើážáŸ†ážŽáž—្ជាប់ "លោážáž‘ៅ"',
'tog-uselivepreview' => 'ប្រើប្រាស់​ការមើលមុនរហáŸážŸ (ស្ážáž·ážáž€áŸ’រោមការពិសោធនáŸáž“ៅឡើយ)',
'tog-forceeditsummary' => 'សូមរំលឹកážáŸ’ញុំ​កាលបើážáŸ’ញុំទុកប្រអប់ចំណារពន្យល់ឱ្យនៅទំនáŸážš',
'tog-watchlisthideown' => 'លាក់​កំណែប្រែ​របស់ážáŸ’ញុំ​ពី​បញ្ជីážáž¶áž˜ážŠáž¶áž“',
@@ -306,6 +304,8 @@ $messages = array(
'tog-diffonly' => 'កុំបង្ហាញážáŸ’លឹមសារទំពáŸážšáž“ៅពីក្រោមážáž¶ážšáž¶áž„ប្រៀបធៀបចំណុចážáž»ážŸáž‚្នា',
'tog-showhiddencats' => 'បង្ហាញចំណាážáŸ‹ážáŸ’នាក់ក្រុមដែលážáŸ’រូវបានលាក់',
'tog-norollbackdiff' => 'បំភ្លáŸáž…​ភាព​ážáž»ážŸâ€‹áž‚្នា​បន្ទាប់​ពី​អនុវážáŸ’ážáž€áž¶ážšâ€‹ážŸáŸ’ដារវិញ',
+'tog-useeditwarning' => 'សូមព្រមាន​ážáŸ’ញុំ​ áž–áŸáž›ážŠáŸ‚áž›ážáŸ’ញុំ​ចាកចáŸáž‰â€‹áž–ី​ទំពáŸážšâ€‹áž€áŸ‚ប្រែដោយមិន​បានរក្សា​ទុកបំលាស់ប្ដូរ​នានា​',
+'tog-prefershttps' => 'ប្រើប្រាស់ការážáž—្ជាប់មានសុវážáŸ’ážáž·áž—ាពជានិច្ចពáŸáž›áž€ážáŸ‹ážˆáŸ’មោះចូល',
'underline-always' => 'ជានិច្ច',
'underline-never' => 'កុំអោយសោះ',
@@ -369,6 +369,18 @@ $messages = array(
'oct' => 'ážáž»áž›áž¶',
'nov' => 'វិច្ឆិកា',
'dec' => 'ធ្នូ',
+'january-date' => '$1 មករា',
+'february-date' => '$1 កុម្ភៈ',
+'march-date' => '$1 មីនា',
+'april-date' => '$1 មáŸážŸáž¶',
+'may-date' => '$1 ឧសភា',
+'june-date' => '$1 មិážáž»áž“ា',
+'july-date' => '$1 កក្កដា',
+'august-date' => '$1 សីហា',
+'september-date' => '$1 កញ្ញា',
+'october-date' => '$1 ážáž»áž›áž¶',
+'november-date' => '$1 វិច្ឆិកា',
+'december-date' => '$1 ធ្នូ',
# Categories related messages
'pagecategories' => '{{PLURAL:$1|ចំណាážáŸ‹ážáŸ’នាក់ក្រុម|ចំណាážáŸ‹ážáŸ’នាក់ក្រុម}}',
@@ -390,7 +402,7 @@ $messages = array(
'broken-file-category' => 'ទំពáŸážšáž‘ាំងឡាយដែលដាច់ážáŸ†ážŽáž—្ជាប់',
'categoryviewer-pagedlinks' => '($1) ($2)',
-'linkprefix' => '/^(.*?)([a-zA-Z\\x80-\\xff]+)$/sD',
+'linkprefix' => '/^((?>.*(?<![a-zA-Z\\x80-\\xff])))(.+)$/sD',
'about' => 'អំពី',
'article' => 'មាážáž·áž€áž¶áž¢ážáŸ’ážáž”áž‘',
@@ -453,6 +465,7 @@ $messages = array(
'create-this-page' => 'បង្កើážáž‘ំពáŸážšáž“áŸáŸ‡',
'delete' => 'លុបចោល',
'deletethispage' => 'លុបទំពáŸážšáž“áŸáŸ‡áž…ោល',
+'undeletethispage' => 'ឈប់លុបទំពáŸážšáž“áŸáŸ‡',
'undelete_short' => 'ឈប់លុប{{PLURAL:$1|កំណែប្រែមួយ|កំណែប្រែចំនួន$1}}វិញ',
'viewdeleted_short' => 'មើល{{PLURAL:$1|កំណែប្រែមួយដែលážáŸ’រូវបានលុបចោល|កំណែប្រែចំនួន $1 ដែលážáŸ’រូវបានលុបចោល}}',
'protect' => 'ការពារ',
@@ -496,7 +509,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).
+# 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).
'aboutsite' => 'អំពី{{SITENAME}}',
'aboutpage' => 'Project:អំពី',
'copyright' => 'រក្សាសិទ្ធិគ្រប់យ៉ាងដោយ$1។',
@@ -506,7 +519,6 @@ $1',
'disclaimers' => 'ការបដិសáŸáž’',
'disclaimerpage' => 'Project:ការបដិសáŸáž’​ទូទៅ',
'edithelp' => 'ជំនួយ​ក្នុងការកែប្រែ',
-'edithelppage' => 'Help:របៀបកែប្រែ',
'helppage' => 'Help:មាážáž·áž€áž¶',
'mainpage' => 'ទំពáŸážšážŠáž¾áž˜',
'mainpage-description' => 'ទំពáŸážšážŠáž¾áž˜',
@@ -539,7 +551,6 @@ $1',
'newmessagesdifflinkplural' => '{{PLURAL:$1|បំលាស់ប្ដូរ|បំលាស់ប្ដូរ}}ចុងក្រោយ',
'youhavenewmessagesmulti' => 'អ្នកមានសារážáŸ’មីៗនៅ $1',
'editsection' => 'កែប្រែ',
-'editsection-brackets' => '[$1]',
'editold' => 'កែប្រែ',
'viewsourceold' => 'មើលកូដ',
'editlink' => 'កែប្រែ',
@@ -644,12 +655,15 @@ $1',
'protectedinterface' => 'ទំពáŸážšáž“áŸáŸ‡áž•áŸ’ដល់នូវអážáŸ’ážáž”ទអន្ážážšáž˜áž»ážážŸáž˜áŸ’រាប់សូហ្វវែរនៅក្នុងវិគីនáŸáŸ‡ áž“áž·áž„ážáŸ’រូវបានចាក់សោដើម្បីចៀសវាងការបំពាន។
ដើម្បីបន្ážáŸ‚មឬផ្លាស់ប្ដូរការបកប្រែសំរាប់វិគីទាំងអស់ សូមប្រើប្រាស់ [//translatewiki.net/ translatewiki.net] ដែលជាគំរោងបកប្រែរបស់MediaWiki។',
'editinginterface' => "'''ប្រយáŸážáŸ’ន៖''' អ្នកកំពុងážáŸ‚កែប្រែទំពáŸážšážŠáŸ‚លបានប្រើប្រាស់​ដើម្បីផ្ដល់ជូនអន្ážážšáž˜áž»ážážŸáž˜áŸ’រាប់សូហ្វវែរ។ បំលាស់ប្ដូរចំពោះទំពáŸážšáž“áŸáŸ‡â€‹áž“ឹងប៉ះពាល់ដល់ទ្រង់ទ្រាយរបស់ទំពáŸážšáž¢áž“្ážážšáž˜áž»ážážŸáŸ†ážšáž¶áž”់អ្នកប្រើប្រាស់​ជាច្រើន ដែលប្រើប្រាស់វិគីនáŸáŸ‡áŸ” ដើម្បីបន្ážáŸ‚មឬផ្លាស់ប្ដូរការបកប្រែ​សំរាប់វិគីទាំងអស់ សូបប្រើប្រាស់ [//translatewiki.net/wiki/Main_Page?setlang=km translatewiki.net] គម្រោង​បកប្រែរបស់មáŸážŒáž¶ážœáž·áž‚ី ។",
-'sqlhidden' => '(ការអង្កáŸáž SQL ážáŸ’រូវបិទបាំង)',
'cascadeprotected' => 'ទំពáŸážšáž“áŸáŸ‡ážáŸ’រូវបានការពារពីការការប្រែដោយសារវាមាន{{PLURAL:$1|ទំពáŸážš, ដែលមាន}} ដែលážáŸ’រូវបានការពារជាមួយជំរើស"ជាបណ្ដាក់"៖
$2',
'namespaceprotected' => "អ្នកមិនមានសិទ្ធិកែប្រែទំពáŸážšáž€áŸ’នុងប្រភáŸáž‘'''$1'''áž‘áŸáŸ”",
'customcssprotected' => 'អ្នកមិនមាន​ការអនុញ្ញាážâ€‹áž€áŸ’នុងការកែប្រែទំពáŸážš CSS áž“áŸáŸ‡áž‘០ព្រោះវាផ្ទុកការកំណážáŸ‹áž•áŸ’ទាល់ážáŸ’លួនផ្សáŸáž„ៗរបស់អ្នកប្រើប្រាស់ម្នាក់ផ្សáŸáž„ទៀážáŸ”',
'customjsprotected' => 'អ្នកមិនមាន​ការអនុញ្ញាážâ€‹áž€áŸ’នុងការកែប្រែទំពáŸážš JavaScript áž“áŸáŸ‡áž‘០ព្រោះវាផ្ទុកការកំណážáŸ‹áž•áŸ’ទាល់ážáŸ’លួនផ្សáŸáž„ៗរបស់អ្នកប្រើប្រាស់ម្នាក់ផ្សáŸáž„ទៀážáŸ”',
+'mycustomcssprotected' => 'អ្នកមិនមាន​ការអនុញ្ញាážâ€‹áž€áŸ’នុងការកែប្រែទំពáŸážš CSS áž“áŸáŸ‡áž‘áŸáŸ”',
+'mycustomjsprotected' => 'អ្នកមិនមាន​ការអនុញ្ញាážâ€‹áž€áŸ’នុងការកែប្រែទំពáŸážš JavaScript áž“áŸáŸ‡áž‘áŸ',
+'myprivateinfoprotected' => 'អ្នកមិនមាន​ការអនុញ្ញាážâ€‹áž€áŸ’នុងការកែប្រែពáŸážáŸŒáž˜áž¶áž“ផ្ទាល់ážáŸ’លួនរបស់អ្នកទáŸáŸ”',
+'mypreferencesprotected' => 'អ្នកមិនមាន​ការអនុញ្ញាážâ€‹áž€áŸ’នុងការកែប្រែចំណង់ចំណូលចិážáŸ’ážážšáž”ស់អ្នកទáŸáŸ”',
'ns-specialprotected' => 'ទំពáŸážšáž–ិសáŸážŸáŸ—មិនអាចកែប្រែបានទáŸáŸ”',
'titleprotected' => "ចំណងជើងនáŸáŸ‡ážáŸ’រូវបានការពារមិនឱ្យបង្កើážâ€‹ážŠáŸ„áž™ [[User:$1|$1]]។
áž áŸážáž»áž•áž›áž›áž¾áž€áž¡áž¾áž„គឺ ''$2''។",
@@ -674,10 +688,19 @@ $2',
'welcomecreation-msg' => 'គណនីរបស់អ្នកážáŸ’រូវបានបង្កើážáž áž¾áž™áŸ”
កុំភ្លáŸáž…ផ្លាស់ប្ដូរ[[Special:Preferences|ចំណង់ចំណូលចិážáŸ’áž{{SITENAME}}]]របស់អ្នក។',
'yourname' => 'អážáŸ’ážáž“ាម៖',
+'userlogin-yourname' => 'អážáŸ’ážáž“ាម',
+'userlogin-yourname-ph' => 'បញ្ចូលអážáŸ’ážáž“ាមរបស់អ្នក',
+'createacct-another-username-ph' => 'បញ្ចូលអážáŸ’ážáž“ាម',
'yourpassword' => 'ពាក្យសម្ងាážáŸ‹áŸ–',
+'userlogin-yourpassword' => 'ពាក្យ​សម្ងាážáŸ‹',
+'userlogin-yourpassword-ph' => 'បញ្ចូលពាក្យសម្ងាážáŸ‹ážšáž”ស់អ្នក',
+'createacct-yourpassword-ph' => 'បញ្ចូលពាក្យសម្ងាážáŸ‹',
'yourpasswordagain' => 'វាយពាក្យសម្ងាážáŸ‹áž˜áŸ’ážáž„ទៀážáŸ–',
+'createacct-yourpasswordagain' => 'អះអាង​ពាក្យ​សម្ងាážáŸ‹',
+'createacct-yourpasswordagain-ph' => 'បញ្ចូលពាក្យសម្ងាážáŸ‹áž˜áŸ’ដងទៀáž',
'remembermypassword' => 'ចងចាំកំណážáŸ‹ážˆáŸ’មោះចូលរបស់ážáŸ’ញុំក្នុងកុំព្យូទáŸážšáž“áŸáŸ‡ (សំរាប់រយៈពáŸáž›áž™áž¼ážšáž”ំផុហ$1 {{PLURAL:$1|ážáŸ’ងៃ|ážáŸ’ងៃ}})',
-'securelogin-stick-https' => 'នៅភ្ជាប់ទៅ HTTPS ដដែលបន្ទាប់ពីចុះឈ្មោះចូលហើយកáŸážŠáŸ„áž™',
+'userlogin-remembermypassword' => 'រក្សាស្ážáž¶áž“ភាពកážáŸ‹ážˆáŸ’មោះចូលរបស់ážáŸ’ញុំ',
+'userlogin-signwithsecure' => 'ប្រើការážáž—្ជាប់មានសុវážáŸ’ážáž·áž—ាព',
'yourdomainname' => 'ដូម៉ែនរបស់អ្នក៖',
'password-change-forbidden' => 'អ្នកមិនអាចផ្លាស់ប្ដូរពាក្យសម្ងាážáŸ‹áž€áŸ’នុងវិគីនáŸáŸ‡áž‘áŸáŸ”',
'externaldberror' => 'មាន​​បញ្ហាក្នុងការ​បញ្ជាក់​ផ្ទៀង​ផ្ទាážáŸ‹â€‹â€‹áž˜áž¼áž›ážŠáŸ’ឋាន​ទិន្ននáŸáž™â€‹ ឬ​អ្នក​មិន​ážáŸ’រូវ​បាន​អនុញ្ញាážâ€‹áž²áŸ’យ​បន្ទាន់​សមáŸáž™â€‹áž‚ណនី​ážáž¶áž„​ក្រៅ​របស់​អ្នក​។​
@@ -690,18 +713,41 @@ $2',
'logout' => 'កážáŸ‹ážˆáŸ’មោះចáŸáž‰',
'userlogout' => 'កážáŸ‹ážˆáŸ’មោះចáŸáž‰',
'notloggedin' => 'មិនទាន់កážáŸ‹ážˆáŸ’មោះចូល',
+'userlogin-noaccount' => 'ážáž¾áž›áŸ„កអ្នក​មិនទាន់មាន​គណនី​សម្រាប់​ប្រើ​ទáŸâ€‹áž¬?',
+'userlogin-joinproject' => 'សូមចូលជាសមាជិក {{SITENAME}}',
'nologin' => "​បើលោកអ្នក​មិនទាន់មាន​គណនី​សម្រាប់​ប្រើ​ទáŸâ€‹ សូម'''$1''' ។",
'nologinlink' => 'បង្កើážáž‚ណនី',
'createaccount' => 'បង្កើážáž‚ណនី',
'gotaccount' => "បើលោកអ្នកមានគណនីសម្រាប់ប្រើហើយ សូម'''$1'''។",
'gotaccountlink' => 'កážáŸ‹ážˆáŸ’មោះចូល',
'userlogin-resetlink' => 'ážáž¾áž¢áŸ’នកភ្លáŸáž…áž–áŸážáŸŒáž˜áž¶áž“លម្អិážážŸáž˜áŸ’រាប់កážáŸ‹ážˆáŸ’មោះចូលហើយ?',
+'userlogin-resetpassword-link' => 'ស្ដារពាក្យសម្ងាážáŸ‹ážšáž”ស់អ្នក',
+'helplogin-url' => 'Help:ការកážáŸ‹ážˆáŸ’មោះចូល',
+'userlogin-helplink' => '[[{{MediaWiki:helplogin-url}}|ជំនួយក្នុងការកážáŸ‹ážˆáŸ’មោះចូល]]',
+'createacct-join' => 'បំពáŸáž‰áž–áŸážáŸŒáž˜áž¶áž“របស់អ្នកážáž¶áž„ក្រោម។',
+'createacct-another-join' => 'បញ្ចូលពáŸážáŸŒáž˜áž¶áž“គណនីážáŸ’មីážáž¶áž„ក្រោម។',
+'createacct-emailrequired' => 'អាសយដ្ឋានអ៊ីមែល',
+'createacct-emailoptional' => 'អាសយដ្ឋានអ៊ីមែល (ដាក់កáŸáž”ានមិនដាក់កáŸáž”ាន)',
+'createacct-email-ph' => 'បញ្ចូលអាសយដ្ឋានអ៊ីមែលរបស់អ្នក',
+'createacct-another-email-ph' => 'បញ្ចូលអាសយដ្ឋានអ៊ីមែល',
'createaccountmail' => 'ប្រើប្រាស់ពាក្យសម្ងាážáŸ‹áž…ៃដន្យបណ្ដោះអាសនុ្ន រួចផ្ញើវាទៅកាន់អាសយដ្ឋានអ៊ីមែលážáž¶áž„ក្រោម',
+'createacct-realname' => 'ឈ្មោះពិហ(ដាក់កáŸáž”ានមិនដាក់កáŸáž”ាន)',
'createaccountreason' => 'មូលហáŸážáž»áŸ–',
+'createacct-reason' => 'មូលហáŸážáž»',
+'createacct-reason-ph' => 'មូលហáŸážáž»ážŠáŸ‚លអ្នកចង់បង្កើážáž‚ណនីមួយទៀáž',
+'createacct-captcha' => 'ážáŸ’ážšáž½ážáž–áž·áž“áž·ážáŸ’យសុវážáŸ’ážáž·áž—ាព',
+'createacct-imgcaptcha-ph' => 'បញ្ចូលឃ្លាដែលអ្នកឃើញážáž¶áž„លើ',
+'createacct-submit' => 'បង្កើážáž‚ណនីរបស់អ្នក',
+'createacct-another-submit' => 'បង្កើážáž‚ណនីមួយទៀáž',
+'createacct-benefit-heading' => '{{SITENAME}} ážáŸ’រូវបង្កើážáž¡áž¾áž„ដោយបុគ្គលស្មáŸáž‚្រចិážáŸ’ážážŠáž¼áž…ជាអ្នកជាដើម។',
+'createacct-benefit-body1' => '{{PLURAL:$1|កំណែ|កំណែ}}',
+'createacct-benefit-body2' => '{{PLURAL:$1|ទំពáŸážš|ទំពáŸážš}}',
+'createacct-benefit-body3' => '{{PLURAL:$1|អ្នករួមចំណែក|អ្នករួមចំណែក}}ážáŸ’មីៗ',
'badretype' => 'ពាក្យសម្ងាážáŸ‹ážŠáŸ‚លអ្នកបានវាយបញ្ចូលនោះ គឺមិនស៊ីគ្នាទáŸáŸ”',
'userexists' => 'អážáŸ’ážáž“ាមដែលអ្នកបានវាយបញ្ចូលមានគáŸáž”្រើហើយ។
សូមជ្រើសរើសអážáŸ’ážáž“ាមផ្សáŸáž„ពីនáŸáŸ‡áŸ”',
'loginerror' => 'កំហុសនៃការកážáŸ‹ážˆáŸ’មោះចូល',
+'createacct-error' => 'បញ្ហាក្នុងការបង្កើážáž‚ណនី',
'createaccounterror' => 'មិនអាចបង្កើážáž‚ណនីបានទáŸáŸ– $1',
'nocookiesnew' => 'គណនីប្រើប្រាស់របស់អ្នកážáŸ’រូវបានបង្កើážáž áž¾áž™ កáŸáž”៉ុន្ážáŸ‚អ្នកមិនទាន់បានកážáŸ‹ážˆáŸ’មោះចូលទáŸáŸ”
@@ -781,9 +827,10 @@ $2',
'usernamehasherror' => 'អážáŸ’ážáž“ាមមិនអាចមានážáž½áž¢áž€áŸ’សរដែលជាសញ្ញាបានទáŸ',
'login-throttled' => 'អ្នកបានកážáŸ‹ážˆáŸ’មោះចូលមិនបានសម្រáŸáž…ច្រើនដងពáŸáž€áž áž¾áž™áŸ”​
-សូមរងចាំមួយរយៈ មុនពáŸáž›ážŸáž¶áž€áž›áŸ’បងម្ដងទៀážáŸ”',
+សូមរងចាំរយៈពáŸáž›$1 មុនពáŸáž›ážŸáž¶áž€áž›áŸ’បងម្ដងទៀážáŸ”',
'login-abort-generic' => 'អ្នកចុះឈ្មោះចូលមិនបានសម្រáŸáž…áž‘áŸáŸ” ការចុះឈ្មោះចូលážáŸ’រូវបានបោះបង់។',
'loginlanguagelabel' => 'ភាសា៖ $1',
+'createacct-another-realname-tip' => 'អ្នកអាចផ្ដល់ឈ្មោះពិážážšáž”ស់អ្នកកáŸáž”ានមិនផ្ដល់កáŸáž”ាន។ បើអ្នកផ្ដល់ឱ្យ វានឹងážáŸ’រូវបានប្រើប្រាស់់ដើម្បីបញ្ជាក់ភាពជាម្ចាស់​លើការរួមចំណែក​នានា​របស់អ្នក។',
# Email sending
'php-mail-error-unknown' => 'កំហុសមិនស្គាល់នៅក្នុងអនុគមន០mail() របស់ PHP',
@@ -801,7 +848,7 @@ $2',
'newpassword' => 'ពាក្យសម្ងាážáŸ‹ážáŸ’មី៖',
'retypenew' => 'សូមវាយពាក្យសម្ងាážáŸ‹ážáŸ’មី​ម្ážáž„ទៀážáŸ–',
'resetpass_submit' => 'ដាក់ប្រើពាក្យសម្ងាážáŸ‹áž“ិង​កážáŸ‹ážˆáŸ’មោះចូល',
-'resetpass_success' => 'ពាក្យសម្ងាážáŸ‹ážšáž”ស់អ្នកážáŸ’រូវបានផ្លាស់ប្ážáž¼ážšáž”ានសំរáŸáž…ហើយ! ឥឡូវនáŸáŸ‡áž€áŸ†áž–ុងកážáŸ‹ážˆáŸ’មោះចូល...',
+'changepassword-success' => 'ពាក្យសម្ងាážáŸ‹ážšáž”ស់អ្នកážáŸ’រូវបានផ្លាស់ប្ážáž¼ážšáž”ានសំរáŸáž…ហើយ!',
'resetpass_forbidden' => 'ពាក្យសម្ងាážáŸ‹áž˜áž·áž“អាចផ្លាស់ប្ážáž¼ážšáž”ានទáŸ',
'resetpass-no-info' => 'អ្នក​ចាំបាច់​ážáŸ’រូវážáŸ‚​កážáŸ‹ážˆáŸ’មោះចូល ដើម្បី​ចូលទៅកាន់​ទំពáŸážšâ€‹áž“áŸáŸ‡â€‹ážŠáŸ„យផ្ទាល់​។',
'resetpass-submit-loggedin' => 'ប្ážáž¼ážšáž–ាក្យសម្ងាážáŸ‹',
@@ -813,10 +860,11 @@ $2',
# Special:PasswordReset
'passwordreset' => 'កំណážáŸ‹â€‹áž–ាក្យសម្ងាážáŸ‹â€‹ážŸáž¶áž¡áž¾áž„វិញ',
-'passwordreset-text' => 'បំពáŸáž‰ážŸáŸ†ážŽáž»áŸ†áž”ែបបទនáŸáŸ‡ážŠáž¾áž˜áŸ’បីស្ដារពាក្យសម្ងាážáŸ‹ážšáž”ស់អ្នក។',
+'passwordreset-text-one' => 'បំពáŸáž‰ážŸáŸ†ážŽáž»áŸ†áž”ែបបទនáŸáŸ‡ážŠáž¾áž˜áŸ’បីស្ដារពាក្យសម្ងាážáŸ‹ážšáž”ស់អ្នក។',
+'passwordreset-text-many' => '{{PLURAL:$1|សូមបំពáŸáž‰áž€áŸ’នុងប្រអប់មួយក្នុងចំណោមប្រអប់ážáž¶áž„ក្រោមដើម្បីកំណážáŸ‹áž–ាក្យសម្ងាážáŸ‹ážšáž”ស់អ្នកឡើងវិញ។}}',
'passwordreset-legend' => 'កំណážáŸ‹â€‹áž–ាក្យសម្ងាážáŸ‹â€‹ážŸáž¶áž¡áž¾áž„វិញ',
'passwordreset-disabled' => 'មុážáž„ារប្ដូរទៅពាក្យសម្ងាážáŸ‹ážŠáž¾áž˜ážáŸ’រូវបានបិទមិនអោយប្រើនៅលើវិគីនáŸáŸ‡áŸ”',
-'passwordreset-pretext' => '{{PLURAL:$1||វាយបញ្ចូលផ្នែកមួយនៃទិន្ននáŸáž™ážáž¶áž„ក្រោម}}',
+'passwordreset-emaildisabled' => 'មុážáž„ារអ៊ីមែលážáŸ’រូវបានបិទមិនអោយប្រើនៅលើវិគីនáŸáŸ‡áŸ”',
'passwordreset-username' => 'អážáŸ’ážáž“ាម៖',
'passwordreset-domain' => 'ដូម៉ែន៖',
'passwordreset-capture' => 'មើលអ៊ីមែលលទ្ធផល?',
@@ -845,7 +893,7 @@ $2
ពាក្យសម្ងាážáŸ‹áž”ណ្ដោះអាសន្ន៖ $2',
'passwordreset-emailsent' => 'អ៊ីមែលស្ដារពាក្យសម្ងាážáŸ‹áž˜áž½áž™ážáŸ’រូវបានផ្ញើទៅហើយ។',
'passwordreset-emailsent-capture' => 'អ៊ីមែលស្ដារពាក្យសម្ងាážáŸ‹áž˜áž½áž™ážŠáž¼áž…បង្ហាញážáž¶áž„ក្រោមážáŸ’រូវបានផ្ញើទៅហើយ។',
-'passwordreset-emailerror-capture' => 'អ៊ីមែលរំលឹកមួយដូចបង្ហាញážáž¶áž„ក្រោមážáŸ’រូវបានបង្កើážáž áž¾áž™ ប៉ុន្ážáŸ‚ការផ្ញើទៅកាន់អ្នកប្រើប្រាស់មិនបានសំរáŸáž…áž‘áŸáŸ– $1',
+'passwordreset-emailerror-capture' => 'អ៊ីមែលស្ដារពាក្យសម្ងាážáŸ‹áž˜áž½áž™ážŠáž¼áž…បង្ហាញážáž¶áž„ក្រោមážáŸ’រូវបានបង្កើážáž áž¾áž™ ប៉ុន្ážáŸ‚ការផ្ញើទៅកាន់ {{GENDER:$2|អ្នកប្រើប្រាស់}}មិនបានសំរáŸáž…áž‘áŸáŸ– $1',
# Special:ChangeEmail
'changeemail' => 'ផ្លាស់ប្ដូរអាសយដ្ឋានអ៊ីមែល',
@@ -1068,12 +1116,15 @@ $2
ទំពáŸážšáž“áŸáŸ‡áž áž¶áž€áŸ‹ážŠáž¼áž…ជាážáŸ’រូវបានលុបចោលហើយ។',
'edit-conflict' => 'កែប្រែ​ភាពឆ្គង​។',
'edit-no-change' => 'ការកែប្រែរបស់អ្នកážáŸ’រូវបានមិនទុកជាការទ០ព្រោះគ្មានការផ្លាស់ប្ដូរណាមួយážáŸ’រូវបានធ្វើនៅលើអážáŸ’ážáž”áž‘áž“áŸáŸ‡áž‘áŸáŸ”',
+'postedit-confirmation' => 'កំណែប្រែរបស់អ្នកážáŸ’រូវបានរក្សាទុកហើយ។',
'edit-already-exists' => 'មិនអាចបង្កើážáž‘ំពáŸážšážáŸ’មីមួយទáŸáŸ”
ទំពáŸážšáž“áŸáŸ‡áž˜áž¶áž“រួចហើយ។',
'defaultmessagetext' => 'អážáŸ’ážáž”ទសារážáž¶áž˜áž›áŸ†áž“ាំដើម',
'invalid-content-data' => 'ážáŸ’លឹមសារទិន្ននáŸáž™áž‚្មានសុពលភាព',
'content-not-allowed-here' => 'មិនអនុញ្ញាážáž·áž¢áŸ„យសរសáŸážšážáŸ’លឹមសារ"$1" នៅលើទំពáŸážš [[$2]] áž‘áŸáŸ”',
+'editwarning-warning' => 'ចាកចáŸáž‰áž–ីទំពáŸážšáž“áŸáŸ‡ នឹងធ្វើឲ្យអ្នកបាážáŸ‹áž”ង់កំណែប្រែដែលអ្នកបានធ្វើ។
+ប្រសិនបើអ្នកបាន​កážáŸ‹ážˆáŸ’មោះចូលរួចហើយ អ្នកអាច​បិទ​បម្រាម​នáŸáŸ‡â€‹áž“ៅ​ក្នុងផ្នែក​ "កែប្រែ" នៃ​ចំណង់ចំណូល​ចិážáŸ’ážâ€‹ážšáž”ស់​អ្នក​។',
# Content models
'content-model-wikitext' => 'អážáŸ’ážáž”ទវិគី',
@@ -1098,6 +1149,7 @@ $2
'undo-failure' => 'កំណែ​មិន​អាច​មិន​ធ្វើ​ឡើង​វិញ​បាន​ទáŸâ€‹ ដោយ​សារ​ការ​ធ្វើ​ឲ្យ​មាន​ជម្លោះ​កំណែ​នៅ​ចន្លោះ​កណ្ដាល​។',
'undo-norev' => 'កំណែ​មិន​អាច​មិន​ធ្វើ​ឡើង​វិញ​បាន​ទáŸâ€‹ ពីព្រោះ​វា​មិន​មាន​ឬ​ážáŸ’រូវ​បាន​លុប​បាážáŸ‹â€‹áž‘ៅ​ហើយ​។',
'undo-summary' => 'មិន​ធ្វើ​វិញ​នូវ​កំណែ​ប្រែ $1 ដោយ​ [[Special:Contributions/$2|$2]] ([[User talk:$2|ការពិភាក្សា​]])',
+'undo-summary-username-hidden' => 'មិន​ធ្វើ​វិញ​នូវ​កំណែ​ប្រែ $1 ដោយអ្នកប្រើប្រាស់លាក់ឈ្មោះ',
# Account creation failure
'cantcreateaccounttitle' => 'មិនអាចបង្កើážáž‚ណនីបានទáŸ',
@@ -1270,6 +1322,7 @@ $1",
'compareselectedversions' => 'ប្រៀបធៀប​កំណែដែលបាន​ជ្រើសយក',
'showhideselectedversions' => 'បង្ហាញ​/លាក់​កំណែប្រែ​ដែលបាន​ជ្រើសយក',
'editundo' => 'មិនធ្វើវិញ',
+'diff-empty' => '(គ្មានភាពážáž»ážŸáž‚្នា)',
'diff-multi' => '({{PLURAL:$1|កំណែប្រែកម្រិážáž”ង្គួរមួយ|កំណែប្រែកម្រិážáž”ង្គួរចំនួន $1}}មិនážáŸ’រូវបានបង្ហាញ)',
'diff-multi-manyusers' => '({{PLURAL:$1|កំណែប្រែកម្រិážáž”ង្គួរមួយ|កំណែប្រែកម្រិážáž”ង្គួរចំនួន $1}}មិនážáŸ’រូវបានបង្ហាញ)',
'difference-missing-revision' => ' {{PLURAL:$2|រកមិនឃើញ|រកមិនឃើញ}}{{PLURAL:$2|កំណែមួយ|កំណែចំនួន $2}} របស់ភាពážáž»ážŸáž‚្នានáŸáŸ‡ ($1) áž‘áŸáŸ”
@@ -1297,7 +1350,6 @@ $1",
'searchmenu-legend' => 'ជម្រើសនានាក្នុងការស្វែងរក',
'searchmenu-exists' => "* ទំពáŸážš '''[[$1]]'''",
'searchmenu-new' => "'''បង្កើážáž‘ំពáŸážš \"[[:\$1]]\" នៅ​លើ​វិគី​នáŸáŸ‡!'''",
-'searchhelp-url' => 'Help:មាážáž·áž€áž¶',
'searchmenu-prefix' => '[[Special:PrefixIndex/$1|រុក​រក​ក្នុង​ទំពáŸážšâ€‹áž“ានា​ជាមួយ​បុព្វបទ​នáŸáŸ‡â€‹]]',
'searchprofile-articles' => 'ទំពáŸážšâ€‹áž˜áž¶ážáž·áž€áž¶',
'searchprofile-project' => 'ជំនួយ និង​ទំពáŸážšâ€‹áž‚ម្រោង',
@@ -1341,15 +1393,7 @@ $1",
'searchdisabled' => 'ឧបករណáŸâ€‹ážŸáŸ’វែងរក​របស់​{{SITENAME}} មិនបានអនុញ្ញាážâ€‹áŸ”
ក្នុង​ពáŸáž›â€‹áž¥áž¡áž¼ážœâ€‹áž“áŸáŸ‡â€‹ អ្នកអាច​ស្វែង​រក​ážáž¶áž˜â€‹ážšáž™áŸˆâ€‹ Google បាន​។
សូមចងចាំ​ážáž¶â€‹ លិបិក្រម​នៃ​មាážáž·áž€áž¶ážšâ€‹ážšáž”ស់​{{SITENAME}} អាចហួស​សមáŸáž™â€‹áŸ”​',
-
-# Quickbar
-'qbsettings' => 'របារទាន់ចិážáŸ’áž',
-'qbsettings-none' => 'áž‘áž‘áŸ',
-'qbsettings-fixedleft' => 'ចុងážáž¶áž„ឆ្វáŸáž„',
-'qbsettings-fixedright' => 'ចុងážáž¶áž„ស្ážáž¶áŸ†',
-'qbsettings-floatingleft' => 'អណ្ážáŸ‚ážáž†áŸ’ážœáŸáž„',
-'qbsettings-floatingright' => 'អណ្ážáŸ‚ážážŸáŸ’ážáž¶áŸ†',
-'qbsettings-directionality' => 'នៅមួយកន្លែង, អាស្រáŸáž™áž›áž¾áž‘ិសដៅសរសáŸážšážšáž”ស់ភាសារបស់អ្នក',
+'search-error' => 'មានបញ្ហាពáŸáž›áž€áŸ†áž–ុងស្វែងរក៖ $1',
# Preferences page
'preferences' => 'ចំណង់ចំណូលចិážáŸ’áž',
@@ -1384,7 +1428,6 @@ $1",
'resetprefs' => 'លុបចោលបន្លាស់ប្ដូរមិនបានរក្សាទុក',
'restoreprefs' => 'ស្ដារ​ការកំណážáŸ‹â€‹áž‘ាំងអស់​ទៅ​លំនាំដើម (គ្រប់ផ្នែកទាំងអស់)',
'prefs-editing' => 'កំណែប្រែ',
-'prefs-edit-boxsize' => 'ទំហំរបស់ផ្ទាំងកែប្រែទំពáŸážšáŸ”',
'rows' => 'ជួរដáŸáž€áŸ–',
'columns' => 'ជួរឈរ៖',
'searchresultshead' => 'ស្វែងរក',
@@ -1395,6 +1438,9 @@ $1",
'recentchangesdays-max' => '(អážáž·áž”រមា $1 {{PLURAL:$1|ážáŸ’ងៃ|ážáŸ’ងៃ}})',
'recentchangescount' => 'ចំនួន​កំណែប្រែ​ដែល​ážáŸ’រូវ​បង្ហាញ​ážáž¶áž˜áž›áŸ†áž“ាំដើម:',
'prefs-help-recentchangescount' => 'រាប់បញ្ចូលទាំងការកែប្រែនាពáŸáž›ážáŸ’មី ប្រវážáŸ’ážáž·áž‘ំពáŸážšáž“ិងកំណážáŸ‹áž áŸážáž»áž“ានា។',
+'prefs-help-watchlist-token2' => 'áž“áŸáŸ‡áž‡áž¶ážŸáŸ„រសម្ងាážáŸ‹ážŸáž˜áŸ’រាប់មើលបញ្ជីážáž¶áž˜ážŠáž¶áž“របស់អ្នកážáž¶áž˜ web feed ។
+អ្នកដែលដឹងសោរសម្ងាážáŸ‹áž“áŸáŸ‡áž“ឹងអាចមើលបញ្ជីážáž¶áž˜ážŠáž¶áž“របស់អ្នក áž áŸážáž»áž“áŸáŸ‡ážŸáž¼áž˜áž€áž»áŸ†áž…ែកចាយអោយគáŸážŠáž¹áž„។
+[[Special:ResetTokens|ចុចទីនáŸáŸ‡áž”ើអ្នកចង់កំណážáŸ‹ážœáž¶áž¡áž¾áž„វិញ]]។',
'savedprefs' => 'ចំណង់ចំណូលចិážáŸ’ážáž“ានារបស់អ្នកážáŸ’រូវបានរក្សាទុកហើយ។',
'timezonelegend' => 'ល្វែង​ម៉ោង:',
'localtime' => 'ម៉ោងក្នុងស្រុក​៖',
@@ -1425,7 +1471,6 @@ $1",
'prefs-reset-intro' => 'អ្នក​អាច​ប្រើ​ទំពáŸážšâ€‹áž“áŸáŸ‡â€‹ážŠáž¾áž˜áŸ’បី​កំណážáŸ‹â€‹áž¡áž¾áž„​វិញ​នូវ​ចំណូល​ចិážáŸ’ážâ€‹ážšáž”ស់​អ្នក​ដូច​លំនាំ​ដើម​របស់​ážáŸ†áž”ន់​វិញ​។
សកម្មភាព​នáŸáŸ‡â€‹áž˜áž·áž“​អាច​ធ្វើ​ឡើង​វិញ​បាន​ទáŸâ€‹áŸ”',
'prefs-emailconfirm-label' => 'បញ្ជាក់ទទួលស្គាល់អ៊ីមែល៖',
-'prefs-textboxsize' => 'ទំហំរបស់ផ្ទាំងកែប្រែទំពáŸážš',
'youremail' => 'អ៊ីមែល៖',
'username' => '{{GENDER:$1|អážáŸ’ážáž“ាម}}៖',
'uid' => 'អážáŸ’ážáž›áŸáž{{GENDER:$1|អ្នកប្រើប្រាស់}}៖',
@@ -1456,6 +1501,8 @@ $1",
'prefs-dateformat' => 'ទំរង់កាលបរិច្ឆáŸáž‘',
'prefs-timeoffset' => 'កែប្រែម៉ោង',
'prefs-advancedediting' => 'ជម្រើសទូទៅ​',
+'prefs-editor' => 'អ្នកកែប្រែ',
+'prefs-preview' => 'មើលជាមុន',
'prefs-advancedrc' => 'ជំរើសážáŸ’នាក់ážáŸ’ពស់',
'prefs-advancedrendering' => 'ជំរើសážáŸ’នាក់ážáŸ’ពស់',
'prefs-advancedsearchoptions' => 'ជំរើសážáŸ’នាក់ážáŸ’ពស់',
@@ -1463,7 +1510,9 @@ $1",
'prefs-displayrc' => 'ជំរើសការបង្ហាញ',
'prefs-displaysearchoptions' => 'ជំរើសការបង្ហាញ',
'prefs-displaywatchlist' => 'ជំរើសការបង្ហាញ',
+'prefs-tokenwatchlist' => 'កូនសោរ',
'prefs-diffs' => 'ភាពážáž»ážŸáž‚្នា',
+'prefs-help-prefershttps' => 'ចំណង់ចំណូលចិážáŸ’ážáž“áŸáŸ‡áž“ឹងមានប្រសិទ្ធិភាពពáŸáž›áž¢áŸ’នកកážáŸ‹ážˆáŸ’មោះចូលលើកក្រោយ។',
# User preference: email validation using jQuery
'email-address-validity-valid' => 'អាសយដ្ឋានអ៊ីមែលហាក់មានសុពលភាព',
@@ -1490,6 +1539,8 @@ $1",
'userrights-notallowed' => 'លោកអ្នកគ្មានការអនុញ្ញាážážŠáž¾áž˜áŸ’បីបន្ážáŸ‚មឬដកសិទ្ធិរបស់អ្នកប្រើប្រាស់ដទៃទáŸáŸ”',
'userrights-changeable-col' => 'ក្រុមនានាដែលអ្នកអាចផ្លាស់ប្ដូរបាន',
'userrights-unchangeable-col' => 'ក្រុមនានាដែលអ្នកមិនអាចផ្លាស់ប្ដូរបាន',
+'userrights-conflict' => 'មានទំនាស់អំពីការកែប្រែសិទ្ធិអ្នកប្រើប្រាស់! សូមážáŸ’ážšáž½ážáž–áž·áž“áž·ážáŸ’យឡើងវិញរួចអះអាងពីការកែប្រែរបស់អ្នក។',
+'userrights-removed-self' => 'អ្នកបានដកសិទ្ធិážáŸ’លួនឯងបានសម្រáŸáž…ហើយ។ áž áŸážáž»áž“áŸáŸ‡ អ្នកមិនអាចចូលមើលទំពáŸážšáž“áŸáŸ‡ážáž‘ៅទៀážáž‘áŸáŸ”',
# Groups
'group' => 'ក្រុម៖',
@@ -1553,11 +1604,18 @@ $1",
'right-proxyunbannable' => 'ពង្វាងការរាំងážáŸ’ទប់ស្វáŸáž™áž”្រវážáŸ’ážáž·ážšáž”ស់ប្រុកស៊ី',
'right-unblockself' => 'ឈប់រាំងážáŸ’ទប់នរណាម្នាក់',
'right-protect' => 'ប្ដូរកម្រិážáž€áž¶ážšáž–ាររួចកែប្រែទំពáŸážšážŠáŸ‚លបានការពារជាážáŸ’នាក់',
-'right-editprotected' => 'កែប្រែទំពáŸážšážŠáŸ‚លបានការពារ (ដោយមិនរំលាយការការពារ)',
+'right-editprotected' => 'កែប្រែទំពáŸážšážŠáŸ‚លបានការពារដោយ "{{int:protect-level-sysop}}"',
+'right-editsemiprotected' => 'កែប្រែទំពáŸážšážŠáŸ‚លបានការពារដោយ "{{int:protect-level-autoconfirmed}}"',
'right-editinterface' => 'កែប្រែអន្ážážšáž˜áž»ážáž¢áŸ’នកប្រើប្រាស់',
'right-editusercssjs' => 'កែប្រែឯកសារ CSS áž“áž·áž„ JS របស់អ្នកប្រើប្រាស់ផ្សáŸáž„ទៀáž',
'right-editusercss' => 'កែប្រែឯកសារ CSS របស់អ្នកប្រើប្រាស់ផ្សáŸáž„ទៀáž',
'right-edituserjs' => 'កែប្រែឯកសារ JavaScript របស់អ្នកប្រើប្រាស់ផ្សáŸáž„ទៀáž',
+'right-editmyusercss' => 'កែប្រែឯកសារ CSS របស់ážáŸ’លួនអ្នកផ្ទាល់',
+'right-editmyuserjs' => 'កែប្រែឯកសារ JavaScript របស់ážáŸ’លួនអ្នកផ្ទាល់',
+'right-viewmywatchlist' => 'មើលបញ្ជីážáž¶áž˜ážŠáž¶áž“របស់អ្នកážáŸ’លួនអ្នកផ្ទាល់',
+'right-viewmyprivateinfo' => 'មើលទិន្នទáŸáž™áž¯áž€áž‡áž“របស់ážáŸ’លួនអ្នកផ្ទាល់ (ឧ៖ អាសយដ្ឋានអ៊ីមែល, ឈ្មោះពិáž)',
+'right-editmyprivateinfo' => 'កែប្រែទិន្នទáŸáž™áž¯áž€áž‡áž“របស់ážáŸ’លួនអ្នកផ្ទាល់ (ឧ៖ អាសយដ្ឋានអ៊ីមែល, ឈ្មោះពិáž)',
+'right-editmyoptions' => 'កែប្រែចំណង់ចំណូលចិážáŸ’ážážšáž”ស់ážáŸ’លួនអ្នកផ្ទាល់',
'right-rollback' => 'ážáŸ’រឡប់យ៉ាងរហáŸážŸáž“ូវកំណែប្រែទំពáŸážšážœáž·ážŸáŸážŸážŽáž¶áž˜áž½áž™â€‹ážŠáŸ‚លធ្វើឡើងដោយ​អ្នកប្រើប្រាស់ចុងក្រោយគáŸáŸ”',
'right-markbotedits' => 'ចំណាំកំណែប្រែážáŸ’រឡប់ឡើងវិញទាំងឡាយážáž¶áž‡áž¶áž€áŸ†ážŽáŸ‚ប្រែដោយរូបយន្áž',
'right-noratelimit' => 'មិនទទួលរងឥទ្ធិពលពីការដាក់កំហិážážŽáž¶áž‘ាំងអស់',
@@ -1619,9 +1677,15 @@ $1",
'action-userrights-interwiki' => 'កែប្រែសិទ្ធិនានារបស់អ្នកប្រើប្រាស់នៅលើវិគីដទៃ',
'action-siteadmin' => 'ចាក់សោឬដោះសោមូលដ្ឋានទិន្ននáŸáž™',
'action-sendemail' => 'ផ្ញើអ៊ីមែល',
+'action-editmywatchlist' => 'កែប្រែបញ្ជីážáž¶áž˜ážŠáž¶áž“របស់អ្នក',
+'action-viewmywatchlist' => 'មើលបញ្ជីážáž¶áž˜ážŠáž¶áž“របស់អ្នក',
+'action-viewmyprivateinfo' => 'មើលពáŸážáŸŒáž˜áž¶áž“ឯកជនរបស់អ្នក',
+'action-editmyprivateinfo' => 'កែប្រែពáŸážáŸŒáž˜áž¶áž“ឯកជនរបស់អ្នក',
# Recent changes
'nchanges' => '$1 {{PLURAL:$1|បន្លាស់ប្ដូរ|បន្លាស់ប្ដូរ}}',
+'enhancedrc-since-last-visit' => '$1 {{PLURAL:$1|áž‚áž·ážážáž¶áŸ†áž„ពីការបើកមើលចុងក្រោយ}}',
+'enhancedrc-history' => 'ប្រវážáŸ’ážáž·',
'recentchanges' => 'បន្លាស់ប្ដូរ​ážáŸ’មីៗ',
'recentchanges-legend' => 'ជម្រើសនានា​ សម្រាប់ការបង្ហាញបន្លាស់ប្ដូរážáŸ’មីៗ',
'recentchanges-summary' => 'ážáž¶áž˜ážŠáž¶áž“រាល់បំលាស់ប្ដូរážáŸ’មីៗបំផុážáž…ំពោះវិគីនៅលើទំពáŸážšáž“áŸáŸ‡áŸ”',
@@ -1662,7 +1726,6 @@ $1",
'recentchangeslinked-feed' => 'បន្លាស់ប្ដូរពាក់ពáŸáž“្ធ',
'recentchangeslinked-toolbox' => 'បន្លាស់ប្ដូរពាក់ពáŸáž“្ធ',
'recentchangeslinked-title' => 'បន្លាស់ប្ដូរ​ពាក់ពáŸáž“្ធនឹង "$1"',
-'recentchangeslinked-noresult' => 'គ្មានបន្លាស់ប្ដូរ​លើទំពáŸážšâ€‹ážŠáŸ‚áž›ážáŸ’រូវបានážáž—្ជាប់ ក្នុងážáŸážšážœáŸáž›áž¶â€‹ážŠáŸ‚áž›ážáŸ’រូវបានផ្ážáž›áŸ‹áž±áŸ’áž™ ។',
'recentchangeslinked-summary' => "áž“áŸáŸ‡áž‡áž¶áž”ញ្ជីបន្លាស់ប្ដូរនានា ដែលážáŸ’រូវបានធ្វើឡើងនៅលើទំពáŸážšáž‘ាំងឡាយ ដែលមានážáŸ†ážŽáž—្ជាប់ពីទំពáŸážšáž€áŸ†ážŽážáŸ‹áž˜áž½áž™(ឬ មានážáŸ†ážŽáž—្ជាប់ទៅទំពáŸážš ដែលមានក្នុងចំណាážáŸ‹ážáŸ’នាក់ក្រុមណាមួយ) នាពáŸáž›ážáŸ’មីៗនáŸáŸ‡ ។ ទំពáŸážšâ€‹áž“ានាក្នុង[[Special:Watchlist|បញ្ជីážáž¶áž˜ážŠáž¶áž“​របស់អ្នក]]ážáŸ’រូវបានសរសáŸážšáž‡áž¶ '''អក្សរដិáž''' ។",
'recentchangeslinked-page' => 'ឈ្មោះទំពáŸážšáŸ–',
'recentchangeslinked-to' => 'បង្ហាញ​បន្លាស់ប្ដូររបស់​ទំពáŸážšážŠáŸ‚ល​មានážáŸ†ážŽáž—្ជាប់នឹង​ទំពáŸážšâ€‹ážŠáŸ‚ល​បាន​ផ្ដល់​ឱ្យ​​វិញ',
@@ -1673,7 +1736,7 @@ $1",
'reuploaddesc' => 'ឈប់ផ្ទុកឡើងរួចážáŸ’រឡប់ទៅបែបបទផ្ទុកឡើងវិញ។',
'upload-tryagain' => 'ដាក់ស្នើការពណ៌នារបស់ឯកសារដែលបានកែរួច',
'uploadnologin' => 'មិនទាន់កážáŸ‹ážˆáŸ’មោះចូលទáŸ',
-'uploadnologintext' => 'អ្នកážáŸ’រូវážáŸ‚ [[Special:UserLogin|កážáŸ‹ážˆáŸ’មោះចូល]] ដើម្បីមានសិទ្ធិផ្ទុកឯកសារទាំងឡាយឡើង។',
+'uploadnologintext' => 'អ្នកážáŸ’រូវážáŸ‚ $1 ដើម្បីផ្ទុកឯកសារឡើង។',
'upload_directory_missing' => 'ážážážŸáŸ†ážšáž¶áž”់ទុកឯកសារផ្ទុកឡើង ($1) បាážáŸ‹ ហើយប្រពáŸáž“្ធបំរើការមិនអាចបង្កើážážœáž¶áž”ានទáŸáŸ”',
'upload_directory_read_only' => 'ប្រពáŸáž“្ធបម្រើការមិនអាចសរសáŸážšáž…ូលទៅក្នុងážážážŸáŸ†ážšáž¶áž”់ទុកឯកសារផ្ទុកឡើង ($1) áž‘áŸáŸ”',
'uploaderror' => 'បញ្ហាក្នុងការផ្ទុកឡើង',
@@ -1862,7 +1925,6 @@ $1',
# HTTP errors
'http-invalid-url' => 'URLមិនážáŸ’រឹមážáŸ’រូវ៖ $1',
-'http-host-unreachable' => 'មិនអាចទៅកាន់URLបានទáŸ',
# Some likely curl errors. More could be added from <http://curl.haxx.se/libcurl/c/libcurl-errors.html>
'upload-curl-error6' => 'មិនអាច ចូលទៅដល់ URL',
@@ -1895,6 +1957,10 @@ $1',
'listfiles_size' => 'ទំហំ',
'listfiles_description' => 'ការពិពណ៌នា',
'listfiles_count' => 'កំណែ',
+'listfiles-show-all' => 'រាប់បញ្ចូលទាំងកំណែចាស់ៗរបស់រូបភាព',
+'listfiles-latestversion' => 'កំណែបច្ចុប្បន្ន',
+'listfiles-latestversion-yes' => 'បាទ / ចាស៎',
+'listfiles-latestversion-no' => 'áž‘áŸ',
# File description page
'file-anchor-link' => 'ឯកសារ',
@@ -1991,6 +2057,13 @@ $1',
'randompage' => 'ទំពáŸážšáž…ៃដន្យ',
'randompage-nopages' => 'គ្មាន​ទំពáŸážšâ€‹ážŽáž¶áž˜áž½áž™â€‹áž€áŸ’នុង​{{PLURAL:$2|លំហឈ្មោះ}}áž“áŸáŸ‡â€‹áž‘áŸáŸ– "$1" ។',
+# Random page in category
+'randomincategory' => 'ទំពáŸážšáž…ៃដន្យក្នុងចំណាážáŸ‹ážáŸ’នាក់ក្រុម',
+'randomincategory-invalidcategory' => '"$1" មិនមែនជាឈ្មោះចំណាážáž€áŸ’រុមážáŸ’រឹមážáŸ’រូវ។',
+'randomincategory-nopages' => 'គ្មានទំពáŸážšážŽáž¶áž˜áž½áž™áž€áŸ’នុងចំណាážáŸ‹ážáŸ’នាក់ក្រុម [[:Category:$1|$1]] áž‘áŸáŸ”',
+'randomincategory-selectcategory' => 'បង្ហាញទំពáŸážšáž…ៃដន្យពីចំណាážáŸ‹ážáŸ’នាក់ក្រុម៖ $1 $2។',
+'randomincategory-selectcategory-submit' => 'ទៅ',
+
# Random redirect
'randomredirect' => 'ទំពáŸážšáž”ញ្ជូនបន្ážáž…ៃដន្យ',
'randomredirect-nopages' => 'គ្មានទំពáŸážšáž”ញ្ជូនបន្ážážŽáž¶áž˜áž½áž™áž“ៅក្នុងប្រភáŸáž‘ "$1" áž‘áŸáŸ”',
@@ -2016,13 +2089,6 @@ $1',
'statistics-users-active-desc' => 'អ្នក​ប្រើប្រាស់​ដែល​បាន​អនុវážáŸ’ážâ€‹ážŸáž€áž˜áŸ’មភាព​ក្នុង​{{PLURAL:$1|ážáŸ’ងៃ​}}ចុង​ក្រោយ​',
'statistics-mostpopular' => 'ទំពáŸážšážŠáŸ‚áž›ážáŸ’រូវបានមើលច្រើនបំផុáž',
-'disambiguations' => 'ទំពáŸážšážŠáŸ‚លភ្ជាប់ទៅទំពáŸážšáž˜áž¶áž“ចំណងជើងស្រដៀងគ្នា',
-'disambiguationspage' => 'Template:ស្រដៀងគ្នា',
-'disambiguations-text' => "ទំពáŸážšáž‘ាំងឡាយážáž¶áž„ក្រោមនáŸáŸ‡áž˜áž·áž“ážáŸ†ážŽáž—្ជាប់យ៉ាងážáž·áž…មួយដែលភ្ជាប់ទៅកាន់'''ទំពáŸážšáž–ាក្យស្រដៀងគ្នា'''។
-
-ទំពáŸážšáž‘ាំងនáŸáŸ‡áž‚ួរážáŸ‚ភ្ជាប់ទៅទំពáŸážšážáŸ’រឹមážáŸ’រូវជាងនáŸáŸ‡ážœáž·áž‰áŸ”<br />
-ទំពáŸážšáž˜áž½áž™ážáŸ’រូវចាážáŸ‹áž‘ុកជាទំពáŸážšáž–ាក្យស្រដៀងគ្នា ប្រសិនបើវាប្រើទំពáŸážšáž‚ំរូដែលភ្ជាប់មកពី[[MediaWiki:Disambiguationspage]]",
-
'doubleredirects' => 'ទំពáŸážšáž”ញ្ជូនបន្ážáž‘្វáŸážŠáž„',
'doubleredirectstext' => 'ទំពáŸážšáž“áŸáŸ‡ážšáž¶áž™ážˆáŸ’មោះទំពáŸážšážŠáŸ‚លបញ្ជូនបន្ážáž‘ៅទំពáŸážšáž”ញ្ជូនបន្ដផ្សáŸáž„ទៀážáŸ”
@@ -2079,6 +2145,7 @@ $1',
'mostrevisions' => 'អážáŸ’ážáž”ទដែលážáŸ’រូវបានកែប្រែច្រើនបំផុáž',
'prefixindex' => 'ទំពáŸážšâ€‹áž‘ាំង​អស់​ជាមួយ​បុព្វបទ',
'prefixindex-namespace' => 'ទំពáŸážšáž‘ាំងអស់ដែលមានបុព្វបទ (លំហឈ្មោះ $1)',
+'prefixindex-strip' => 'កាážáŸ‹áž…ោលបុព្វបទក្នុងបញ្ជី',
'shortpages' => 'ទំពáŸážšážáŸ’លីៗ',
'longpages' => 'ទំពáŸážšážœáŸ‚ងៗ',
'deadendpages' => 'ទំពáŸážšâ€‹áž‘ាល់',
@@ -2268,10 +2335,9 @@ $1',
'unwatchthispage' => 'ឈប់ážáž¶áž˜ážŠáž¶áž“',
'notanarticle' => 'មិនមែនជាទំពáŸážšáž˜áž¶ážáž·áž€áž¶',
'notvisiblerev' => 'ការកែážáž˜áŸ’រូវážáŸ’រូវបានលុបចោល',
-'watchnochange' => 'មិនមានរបស់ដែលអ្នកកំពុងážáž¶áž˜ážŠáž¶áž“ណាមួយážáŸ’រូវបានគáŸáž€áŸ‚ប្រែក្នុងកំលុងពáŸáž›ážŠáž¼áž›ážŠáŸ‚លបានបង្ហាញទáŸáŸ”',
'watchlist-details' => '{{PLURAL:$1|$1 page|ទំពáŸážš $1}}នៅក្នុងបញ្ជីážáž¶áž˜ážŠáž¶áž“របស់អ្នក ដោយមិនរាប់បញ្ចូលទំពáŸážšáž–ិភាក្សា។',
-'wlheader-enotif' => '* អនុញ្ញាážáž±áŸ’យមានការផ្ដល់ដំណឹងážáž¶áž˜ážšáž™áŸˆáž¢áŸŠáž¸áž˜áŸ‚áž›',
-'wlheader-showupdated' => "* ទំពáŸážšážŠáŸ‚áž›ážáŸ’រូវបានផ្លាស់ប្ážáž¼ážšážáž¶áŸ†áž„ពីពáŸáž›áž…ូលមើលចុងក្រោយរបស់អ្នក ážáŸ’រូវបានបង្ហាញជា '''អក្សរដិáž'''",
+'wlheader-enotif' => 'បើកប្រើការផ្ដល់ដំណឹងážáž¶áž˜ážšáž™áŸˆáž¢áŸŠáž¸áž˜áŸ‚ល។',
+'wlheader-showupdated' => "ទំពáŸážšážŠáŸ‚áž›ážáŸ’រូវបានផ្លាស់ប្ážáž¼ážšážáž¶áŸ†áž„ពីពáŸáž›áž…ូលមើលចុងក្រោយរបស់អ្នក ážáŸ’រូវបានបង្ហាញជា '''អក្សរដិáž'''។",
'watchmethod-recent' => 'ឆែកមើលកំណែប្រែážáŸ’មីៗចំពោះទំពáŸážšážáŸ’រូវបានážáž¶áž˜ážŠáž¶áž“',
'watchmethod-list' => 'ឆែកមើលទំពáŸážšážáŸ’រូវបានážáž¶áž˜ážŠáž¶áž“ចំពោះកំណែប្រែážáŸ’មីៗ',
'watchlistcontains' => 'បញ្ជីážáž¶áž˜ážŠáž¶áž“ របស់អ្នក មាន $1 {{PLURAL:$1|ទំពáŸážš|ទំពáŸážš}}។',
@@ -2666,13 +2732,10 @@ $1',
វាប្រហែលជាážáŸ’រូវបានគáŸážŠáž€áž€áž¶ážšáž áž¶áž˜ážƒáž¶ážáŸ‹áž áž¾áž™áŸ”',
'ip_range_invalid' => 'ដែនកំណážáŸ‹ IP គ្មានសុពលភាព។',
-'blockme' => 'ហាមឃាážáŸ‹ážáŸ’ញុំ',
'proxyblocker' => 'កម្ម​វិធី​​រាំង​ផ្ទប់​ប្រូកស៊ី (Proxy)',
-'proxyblocker-disabled' => 'មុážáž„ារនáŸáŸ‡ážáŸ’រូវបានអសកម្ម។',
'proxyblockreason' => 'អាសយដ្ឋាន IP របស់អ្នកážáŸ’រូវបានរាំងážáŸ’ទប់ហើយ ពីព្រោះវាជាប្រុកស៊ី(proxy)ចំហ។
សូមទំនាក់ទំនងអ្នកផ្ដល់សáŸážœáž¶áž¢áŸŠáž¸áž“ធឺណិážáž¬áž¢áŸ’នកបច្ចáŸáž€áž‘áŸážŸážšáž”ស់អ្នក ហើយប្រាប់ពួកគáŸáž–ីបញ្ហាសុវážáŸ’ážáž·áž—ាពដáŸážŸáŸ†ážáž¶áž“់នáŸáŸ‡áŸ”',
-'proxyblocksuccess' => 'រួចរាល់ជាស្ážáž¶áž–រ។',
'sorbsreason' => 'អាសយដ្ឋាន IP របស់អ្នកមានឈ្មោះក្នុងបញ្ជីប្រុកស៊ី(proxy)ចំហ នៅក្នុង DNSBL របស់ {{SITENAME}}។',
'sorbs_create_account_reason' => 'អាសយដ្ឋាន IP របស់អ្នកមានឈ្មោះក្នុងបញ្ជីប្រុកស៊ី(proxy)ចំហ នៅក្នុង DNSBL របស់ {{SITENAME}}។
@@ -2936,13 +2999,8 @@ $1',
# Stylesheets
'common.css' => '/* CSS បានដាក់ទីនáŸáŸ‡áž“ឹងមានអនុភាពលើគ្រប់សំបកទាំងអស់ */',
-'standard.css' => '/* CSS បានដាក់ទីនáŸáŸ‡áž“ឹងមានអនុភាពលើអ្នកប្រើប្រាស់នៃសំបក Standard */',
-'nostalgia.css' => '/* CSS បានដាក់ទីនáŸáŸ‡áž“ឹងមានអនុភាពលើអ្នកប្រើប្រាស់នៃសំបក Nostalgia */',
'cologneblue.css' => '/* CSS បានដាក់ទីនáŸáŸ‡áž“ឹងមានអនុភាពលើអ្នកប្រើប្រាស់នៃសំបក Cologne Blue */',
'monobook.css' => '/* CSS បានដាក់ទីនáŸáŸ‡áž“ឹងមានអនុភាពលើអ្នកប្រើប្រាស់នៃសំបក Monobook */',
-'myskin.css' => '/* CSS បានដាក់ទីនáŸáŸ‡áž“ឹងមានអនុភាពលើអ្នកប្រើប្រាស់នៃសំបក MySkin */',
-'chick.css' => '/* CSS បានដាក់ទីនáŸáŸ‡áž“ឹងមានអនុភាពលើអ្នកប្រើប្រាស់នៃសំបក Chick */',
-'simple.css' => '/* CSS បានដាក់ទីនáŸáŸ‡áž“ឹងមានអនុភាពលើអ្នកប្រើប្រាស់នៃសំបក Simple */',
'modern.css' => '/* CSS បានដាក់ទីនáŸáŸ‡áž“ឹងមានអនុភាពលើអ្នកប្រើប្រាស់នៃសំបក Modern */',
'vector.css' => '/* CSS បានដាក់ទីនáŸáŸ‡áž“ឹងមានអនុភាពលើអ្នកប្រើប្រាស់នៃសំបក Vector */',
@@ -3012,13 +3070,8 @@ $1',
'pageinfo-category-files' => 'ចំនួនឯកសារ',
# Skin names
-'skinname-standard' => 'បុរាណ',
-'skinname-nostalgia' => 'អាឡោះអាលáŸáž™',
'skinname-cologneblue' => 'ទឹកអប់ážáŸ€ážœ',
'skinname-monobook' => 'សៀវភៅឯក',
-'skinname-myskin' => 'សំបកážáŸ’ញុំ',
-'skinname-chick' => 'កូនមាន់',
-'skinname-simple' => 'សាមញ្ញ',
'skinname-modern' => 'ទំនើប',
'skinname-vector' => 'វ៉ិចទáŸážšâ€‹â€‹',
@@ -3091,11 +3144,25 @@ $1',
'minutes' => '{{PLURAL:$1|$1 នាទី|$1 នាទី}}',
'hours' => '{{PLURAL:$1|$1 ម៉ោង|$1 ម៉ោង}}',
'days' => '{{PLURAL:$1|$1 ážáŸ’ងៃ|$1 ážáŸ’ងៃ}}',
+'weeks' => '{{PLURAL: $1|$1 សប្ážáž¶áž áŸ|$1 សប្ážáž¶áž áŸ}}',
'months' => '{{PLURAL:$1|$1 ážáŸ‚|$1 ážáŸ‚}}',
'years' => '{{PLURAL:$1|$1 ឆ្នាំ|$1 ឆ្នាំ}}',
'ago' => '$1 មុន',
'just-now' => 'អំបាញ់មិញនáŸáŸ‡',
+# Human-readable timestamps
+'hours-ago' => '$1 {{PLURAL:$1|ម៉ោង|ម៉ោង}}មុន',
+'minutes-ago' => '$1 {{PLURAL:$1|នាទី|នាទី}}មុន',
+'seconds-ago' => '$1 {{PLURAL:$1|វិនាទី|វិនាទី}}មុន',
+'monday-at' => 'ážáŸ’ងៃចáŸáž“្ទនៅ $1',
+'tuesday-at' => 'ážáŸ’ងៃអង្គារនៅ $1',
+'wednesday-at' => 'ážáŸ’ងៃពុធនៅ $1',
+'thursday-at' => 'ážáŸ’ងៃព្រហស្បážáž·áŸáž“ៅ $1',
+'friday-at' => 'ážáŸ’ងៃសុក្រនៅ $1',
+'saturday-at' => 'ážáŸ’ងៃសៅរáŸáž“ៅ $1',
+'sunday-at' => 'ážáŸ’ងៃអាទិážáŸ’យនៅ $1',
+'yesterday-at' => 'ម្សិលមិញនៅ $1',
+
# Bad image list
'bad_image_list' => 'ទម្រង់ ដូចážáž‘ៅ ៖
@@ -3122,7 +3189,7 @@ $1',
* gpslongitude
* gpsaltitude',
-# EXIF tags
+# Exif tags
'exif-imagewidth' => 'ទទឹង',
'exif-imagelength' => 'កម្ពស់',
'exif-bitspersample' => '',
@@ -3232,7 +3299,7 @@ $1',
'exif-originalimageheight' => 'កំពស់របស់រូបភាពមុនពáŸáž›áž€áž¶ážáŸ‹ážáŸ†ážšáž¹áž˜',
'exif-originalimagewidth' => 'ទទឹងរបស់រូបភាពមុនពáŸáž›áž€áž¶ážáŸ‹ážáŸ†ážšáž¹áž˜',
-# EXIF attributes
+# Exif attributes
'exif-compression-1' => 'លែងបានបង្ហាប់',
'exif-copyrighted-true' => 'រក្សាសិទ្ឋ',
@@ -3568,7 +3635,6 @@ $5
'version-skins' => 'សំបក',
'version-other' => 'ផ្សáŸáž„',
'version-mediahandlers' => 'កម្មវិធី​បើក​មáŸážŒáž¶â€‹ (Media handlers)',
-'version-extension-functions' => 'មុážáž„ារផ្នែកបន្ážáŸ‚ម',
'version-hook-name' => 'ឈ្មោះ​ Hook',
'version-hook-subscribedby' => 'បានជាវ ជាប្រចាំ ដោយ',
'version-version' => '(កំណែ $1)',
@@ -3580,15 +3646,6 @@ $5
'version-software-version' => 'កំណែ',
'version-entrypoints-header-url' => 'URL',
-# Special:FilePath
-'filepath' => 'ផ្លូវនៃឯកសារ',
-'filepath-page' => 'ឯកសារ៖',
-'filepath-submit' => 'ទៅ',
-'filepath-summary' => 'ទំពáŸážšáž–ិសáŸážŸáž“áŸáŸ‡ បង្ហាញផ្លូវពáŸáž‰áž›áŸáž‰ នៃ មួយឯកសារ។
-រូបភាពážáŸ’រូវបានបង្ហាញ ជាភាពម៉ážáŸ‹ážáŸ’ពស់, ប្រភáŸáž‘ឯកសារ ដទៃទៀហធ្វើការដោយផ្ទាល់ ជាមួយ សហកម្មវិធី ។
-
-បញ្ចូល ឈ្មោះឯកសារ ដោយគ្មានការភ្ជាប់ "{{ns:file}}:" នៅពីមុážážœáž¶ ។',
-
# Special:FileDuplicateSearch
'fileduplicatesearch' => 'ស្វែងរកឯកសារដូចគ្នាបáŸáŸ‡áž”áž·áž‘',
'fileduplicatesearch-legend' => 'ស្វែងរកឯកសារដូចគ្នាបáŸáŸ‡áž”áž·áž‘',
@@ -3665,6 +3722,9 @@ $5
'htmlform-submit' => 'ដាក់ស្នើ',
'htmlform-reset' => 'ធ្វើដូចដើមវិញ',
'htmlform-selectorother-other' => 'ផ្សáŸáž„ទៀáž',
+'htmlform-no' => 'áž‘áŸ',
+'htmlform-yes' => 'ព្រម',
+'htmlform-chosen-placeholder' => 'ជ្រើសយកជម្រើសមួយ',
# New logging system
'logentry-delete-delete' => '$1 {{GENDER:$2|បានលុប}} ទំពáŸážš $3 ចោល',
diff --git a/languages/messages/MessagesKn.php b/languages/messages/MessagesKn.php
index bf28cab8..060371e9 100644
--- a/languages/messages/MessagesKn.php
+++ b/languages/messages/MessagesKn.php
@@ -94,9 +94,6 @@ $messages = array(
'tog-shownumberswatching' => 'ಪà³à²Ÿà²µà²¨à³à²¨à³ ವೀಕà³à²·à²¿à²¸à³à²¤à³à²¤à²¿à²°à³à²µ ಸದಸà³à²¯à²° ಸಂಖà³à²¯à³†à²¯à²¨à³à²¨à³ ತೋರಿಸà³',
'tog-oldsig' => 'ಪà³à²°à²¸à³à²¤à³à²¤ ಸಹಿ',
'tog-fancysig' => 'ಸರಳ ಸಹಿಗಳೠ(ಕೊಂಡಿ ಇಲà³à²²à²¦à²¿à²°à³à²µà²‚ತೆ)',
-'tog-externaleditor' => 'ಬಾಹà³à²¯ ಸಂಪಾದನೆ ಸಲಕರಣೆಯನà³à²¨à³ ಯಾವಾಗಲೂ ಉಪಯೋಗಿಸೠ(ಅನà³à²­à²µ ಹೊಂದಿರà³à²µ ಬಳಕೆದಾರರಿಗೆ ಮಾತà³à²°, ನಿಮà³à²® ಗಣಕಯಂತà³à²°à²¦à²²à³à²²à²¿ ವಿಶೇಷ ಬದಲಾವಣೆಗಳೠಬೇಕಾಗà³à²¤à³à²¤à²¦à³†)',
-'tog-externaldiff' => 'ಬಾಹà³à²¯ ಅಂತರದರà³à²¶à²•à²µà²¨à³à²¨à³ ಯಾವಗಲೂ ಉಪಯೋಗಿಸೠ(ಅನà³à²­à²µ ಹೊಂದಿರà³à²µ ಬಳಕೆದಾರರಿಗೆ ಮಾತà³à²°, ನಿಮà³à²® ಗಣಕಯಂತà³à²°à²¦à²²à³à²²à²¿ ವಿಶೇಷ ಬದಲಾವಣೆಗಳೠಬೇಕಾಗà³à²¤à³à²¤à²¦à³†)',
-'tog-showjumplinks' => 'ಶಕà³à²¤à²—ೊಳಿಸಲೠ"ನೆಗೆ ಇಲà³à²²à²¿à²—ೆ" ಲಭà³à²¯à²•à³† ಕೊಡ',
'tog-uselivepreview' => 'ನೇರ ಮà³à²¨à³à²¨à³‹à²Ÿà²µà²¨à³à²¨à³ ಉಪಯೋಗಿಸೠ(JavaScript) (ಪà³à²°à²¾à²¯à³‹à²—ಿಕ)',
'tog-forceeditsummary' => 'ಸಂಪಾದನೆ ಸಾರಾಂಶವನà³à²¨à³ ಖಾಲಿ ಬಿಟà³à²Ÿà²²à³à²²à²¿ ನೆನಪಿಸà³',
'tog-watchlisthideown' => 'ವೀಕà³à²·à²£à²¾ ಪಟà³à²Ÿà²¿à²¯à²²à³à²²à²¿ ನನà³à²¨ ಸಂಪಾದನೆಗಳನà³à²¨à³ ತೋರಿಸಬೇಡ',
@@ -109,6 +106,7 @@ $messages = array(
'tog-diffonly' => 'ವà³à²¯à²¤à³à²¯à²¾à²¸à²—ಳ ಕೆಳಗಿರà³à²µ ಪà³à²Ÿà²¦ ವಿವರಗಳನà³à²¨à³ ತೋರಿಸಬೇಡ',
'tog-showhiddencats' => 'ಅಡಗಿಸಲà³à²ªà²Ÿà³à²Ÿ ವರà³à²—ಗಳನà³à²¨à³ ತೋರಿಸà³',
'tog-norollbackdiff' => 'ತೊಡೆದà³à²¹à²¾à²•à²¿à²¦ ನಂತರ ವà³à²¯à²¤à³à²¯à²¸à²µà²¨à³à²¨à³ ಬಿದà³',
+'tog-useeditwarning' => 'ಸಂಪಾದನೆಯನà³à²¨à³ ಉಳಿಸದೆ ಹೊರಟಲà³à²²à²¿ ನನಗೆ ಎಚà³à²šà²°à²¿à²¸à³',
'underline-always' => 'ಯಾವಾಗಲೂ',
'underline-never' => 'ಎಂದಿಗೂ ಇಲà³à²²',
@@ -172,6 +170,18 @@ $messages = array(
'oct' => 'ಅಕà³à²Ÿà³‹à²¬à²°à³',
'nov' => 'ನವೆಂಬರà³',
'dec' => 'ಡಿಸೆಂಬರà³',
+'january-date' => 'ಜನವರಿ $1',
+'february-date' => 'ಫೆಬà³à²°à³à²µà²°à²¿ $1',
+'march-date' => 'ಮಾರà³à²šà³ $1',
+'april-date' => 'ಎಪà³à²°à²¿à²²à³ $1',
+'may-date' => 'ಮೇ $1',
+'june-date' => 'ಜೂನೠ$1',
+'july-date' => 'ಜà³à²²à³ˆ $1',
+'august-date' => 'ಆಗಸà³à²Ÿà³ $1',
+'september-date' => 'ಸೆಪà³à²Ÿà³†à²‚ಬರೠ$1',
+'october-date' => 'ಅಕà³à²Ÿà³‹à²¬à²°à³ $1',
+'november-date' => 'ನವೆಂಬರೠ$1',
+'december-date' => 'ಡಿಸೆಂಬರೠ$1',
# Categories related messages
'pagecategories' => '{{PLURAL:$1|ವರà³à²—|ವರà³à²—ಗಳà³}}',
@@ -253,6 +263,7 @@ $messages = array(
'create-this-page' => 'ಈ ಪà³à²Ÿà²µà²¨à³à²¨à³ ಸೃಷà³à²Ÿà²¿à²¸à³',
'delete' => 'ಅಳಿಸಿ',
'deletethispage' => 'ಈ ಪà³à²Ÿà²µà²¨à³à²¨à³ ಅಳಿಸಿ',
+'undeletethispage' => 'ಈ ಪà³à²Ÿà²µà²¨à³à²¨à³ ಅಳಿಸà³à²µà²¿à²•à³†à²¯à²¨à³à²¨à³ ರದà³à²¦à³à²®à²¾à²¡à³',
'undelete_short' => '{{PLURAL:$1|ಒಂದೠಸಂಪಾದನೆಯ|$1 ಸಂಪಾದನೆಗಳ}} ಅಳಿಸà³à²µà²¿à²•à³†à²¯à²¨à³à²¨à³ ತೊಡೆದà³à²¹à²¾à²•à³',
'viewdeleted_short' => 'ನೋಟ {{PLURAL:$1|೧ ಅಳಿಸಲà³à²ªà²Ÿà³à²Ÿ ಸಂಪಾದನೆ|$1 ಅಳಿಸಲà³à²ªà²Ÿà³à²Ÿ ಸಂಪಾದನೆಗಳà³}}',
'protect' => 'ಸಂರಕà³à²·à²¿à²¸à³',
@@ -292,7 +303,7 @@ $messages = array(
'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).
+# 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).
'aboutsite' => 'ಕನà³à²¨à²¡ {{SITENAME}} ಬಗà³à²—ೆ',
'aboutpage' => 'Project:ನಮà³à²® ಬಗà³à²—ೆ',
'copyright' => 'ಇದೠಈ ಕಾಪಿರೈಟà³â€Œà²¨à²²à³à²²à²¿ ಲಭà³à²¯à²µà²¿à²¦à³† $1.',
@@ -302,7 +313,6 @@ $messages = array(
'disclaimers' => 'ಅಬಾಧà³à²¯à²¤à³†à²—ಳà³',
'disclaimerpage' => 'Project:ಸಾಮಾನà³à²¯ ಅಬಾಧà³à²¯à²¤à³†à²—ಳà³',
'edithelp' => 'ಸಂಪಾದನೆಗೆ ಸಹಾಯ',
-'edithelppage' => 'Help:ಸಂಪಾದನೆ',
'helppage' => 'Help:ಪರಿವಿಡಿ',
'mainpage' => 'ಮà³à²–à³à²¯ ಪà³à²Ÿ',
'mainpage-description' => 'ಮà³à²–à³à²¯ ಪà³à²Ÿ',
@@ -374,17 +384,6 @@ $messages = array(
# General errors
'error' => 'ದೋಷ',
'databaseerror' => 'ಡೇಟಬೇಸೠದೋಷ',
-'dberrortext' => 'ಒಂದೠಡೇಟಾಬೇಸೠನಿಮà³à²®à²ªà³à²°à²¶à³à²¨à³†à²—ೆ ಸಿಂಟಾಕà³à²¸à³ ತಪà³à²ªà³ ಸಂಭವಿಸಿದೆ
-ಈ ಸಾಫà³à²Ÿà³à²µà³‡à²°à³ ಒಂದೠದೋಷವನà³à²¨à³ ನಿವಾರಿಸಲಾಗಿದೆ ಸೂಚಿಸಬಹà³à²¦à³.
-ಕೊನೆಯ ಪà³à²°à²¯à²¤à³à²¨ ಡೇಟಾಬೇಸೠನಿಮà³à²®à²ªà³à²°à²¶à³à²¨à³†à²—ೆ ಮಾಡಲಾಯಿತà³:
-<blockquote><code>$1</code></blockquote>
-ಕà³à²°à²¿à²¯à³† ಒಳಗಿನಿಂದಲೇ "<code>$2</code>"
-ಡೇಟಾಬೇಸೠದೋಷವನà³à²¨à³ ತಿಳಿಸಿದೆ"<code>$3: $4</code>".',
-'dberrortextcl' => 'ಡೇಟಾಬೇಸೠಪà³à²°à²¶à³à²¨à³†à²¯ ವಿನà³à²¯à²¾à²¸à²¦à²²à³à²²à²¿ ದೋಷ ಉಂಟಾಗಿದೆ.
-ಕೊನೆಯದಾಗಿ ಪà³à²°à²¯à²¤à³à²¨à²¿à²¸à²²à²¾à²¦ ಡೇಟಾಬೇಸೠಪà³à²°à²¶à³à²¨à³†à²¯à³:
-"$1"
-ಇದೠಉಂಟಾಗಿದà³à²¦à³ "$2" function ಒಳಗಿಂದ.
-MySQL ಹಿಂದಿರà³à²—ಿಸಿದ ದೋಷ "$3: $4"',
'laggedslavemode' => 'ಎಚà³à²šà²°: ಪà³à²Ÿà²¦à²²à³à²²à²¿ ಇತà³à²¤à³€à²šà²¿à²¨ ಬದಲಾವಣೆಗಳೠಕಾಣದಿರಬಹà³à²¦à³.',
'readonly' => 'ಡೇಟಬೇಸೠಮà³à²šà³à²šà²²à²¾à²—ಿದೆ',
'enterlockreason' => 'ಡೇಟಬೇಸೠಮà³à²šà³à²šà³à²¤à²¿à²°à³à²µ ಕಾರಣವನà³à²¨à³ ಮತà³à²¤à³ ಮತà³à²¤à³† ಅದನà³à²¨à³ ತೆರೆಯà³à²µ ಅಂದಾಜಿತ ಕಾಲವನà³à²¨à³ ತಿಳಿಸಿ',
@@ -438,6 +437,10 @@ $2',
'namespaceprotected' => "ನಿಮಗೆ '''$1''' ಪà³à²Ÿà²ªà³à²°à²¬à³‡à²§à²•à³à²•à³† ಸೇರಿರà³à²µ ಪà³à²Ÿà²—ಳನà³à²¨à³ ಸಂಪಾದಿಸà³à²µ ಅನà³à²®à²¤à²¿ ಇಲà³à²².",
'customcssprotected' => 'ಈ ಸಿಎಸà³à²Žà²¸à³ ಪà³à²Ÿà²µà²¨à³à²¨à³ ಸಂಪಾದಿಸಲೠಈ ಪà³à²Ÿà²µà³ ಇನà³à²¨à³Šà²¬à³à²¬ ಬಳಕೆದಾರನ ವಯà³à²•à³à²¤à²¿à²• ವà³à²¯à²µà²¸à³à²¥à³†à²¯à²¨à³à²¨à³ ಹೊಂದಿರà³à²µà³à²¦à²°à²¿à²‚ದ ಅನà³à²®à²¤à²¿ ಇಲà³à²²',
'customjsprotected' => 'ಈ ಜಾವಾ ಸà³à²•à³à²°à²¿à²ªà³à²Ÿà³ ಪà³à²Ÿà²µà²¨à³à²¨à³ ಸಂಪಾದಿಸಲೠಈ ಪà³à²Ÿà²µà³ ಇನà³à²¨à³Šà²¬à³à²¬ ಬಳಕೆದಾರನ ವಯà³à²•à³à²¤à²¿à²• ವà³à²¯à²µà²¸à³à²¥à³†à²¯à²¨à³à²¨à³ ಹೊಂದಿರà³à²µà³à²¦à²°à²¿à²‚ದ ಅನà³à²®à²¤à²¿ ಇಲà³à²²',
+'mycustomcssprotected' => 'ಈ ಪà³à²Ÿà²µà²¨à³à²¨à³ ಸಂಪಾದಿಸಲೠನಿಮಗೆ ಅನà³à²®à²¤à²¿ ಇಲà³à²².',
+'mycustomjsprotected' => 'ಈ ಪà³à²Ÿà²µà²¨à³à²¨à³ ಸಂಪಾದಿಸಲೠನಿಮಗೆ ಅನà³à²®à²¤à²¿ ಇಲà³à²².',
+'myprivateinfoprotected' => 'ನಿಮà³à²® ಸೂಕà³à²·à³à²® ವಿಚಾರಗಳನà³à²¨à³ ಸಂಪಾದಿಸಲೠನಿಮಗೆ ಅನà³à²®à²¤à²¿ ಇಲà³à²².',
+'mypreferencesprotected' => 'ನಿಮà³à²® ಆಯà³à²•à³†à²—ಳನà³à²¨à³ ಸಂಪಾದಿಸಲೠನಿಮಗೆ ಅನà³à²®à²¤à²¿ ಇಲà³à²²',
'ns-specialprotected' => 'ವಿಶೇಷ ಪà³à²Ÿà²—ಳನà³à²¨à³ ಸಂಪಾದಿಸಲೠಆಗà³à²µà³à²¦à²¿à²²à³à²².',
'titleprotected' => "ಈ ಹೆಸರಿನ ಪà³à²Ÿà²µà²¨à³à²¨à³ ಸೃಷà³à²Ÿà²¿à²¸à²²à²¾à²—ದಂತೆ [[User:$1|$1]] ಅವರೠಸಂರಕà³à²·à²¿à²¸à²¿à²¦à³à²¦à²¾à²°à³†.
ಸಂರಕà³à²·à²£à³†à²—ೆ ನೀಡಿರà³à²µ ಕಾರಣ: ''$2''.",
@@ -461,10 +464,15 @@ $2',
'welcomeuser' => 'ಸà³à²¸à³à²µà²¾à²—ತ,$1!',
'welcomecreation-msg' => 'ನಿಮà³à²® ಖಾತೆ ತೆರೆಯಲಾಗಿದೆ.ನಿಮà³à²® [[Special:Preferences|{{SITENAME}} preferences]]ಬದಲಾಯಿಸಲೠಮರೆಯಬೇಡಿ.',
'yourname' => 'ನಿಮà³à²® ಬಳಕೆಯ ಹೆಸರà³',
+'userlogin-yourname' => 'ಬಳಕೆದಾರ ಹೆಸರà³',
'yourpassword' => 'ನಿಮà³à²® ಪà³à²°à²µà³‡à²¶à²ªà²¦',
+'userlogin-yourpassword' => 'ಪà³à²°à²µà³‡à²¶à²ªà²¦',
+'userlogin-yourpassword-ph' => 'ನಿಮà³à²® ಪà³à²°à²µà³‡à²¶à²ªà²¦ ನಮೂದಿಸಿ',
+'createacct-yourpassword-ph' => 'ಪà³à²°à²µà³‡à²¶à²ªà²¦ ಒಂದನà³à²¨à³ ನಮೂದಿಸಿ',
'yourpasswordagain' => 'ಪà³à²°à²µà³‡à²¶ ಪದ ಮತà³à²¤à³Šà²®à³à²®à³† ಟೈಪೠಮಾಡಿ',
+'createacct-yourpasswordagain' => 'ಪà³à²°à²µà³‡à²¶à²ªà²¦à²µà²¨à³à²¨à³ ಧೃಡೀಕರಿಸಿ',
+'createacct-yourpasswordagain-ph' => 'ಪà³à²°à²µà³‡à²¶à²ªà²¦à²µà²¨à³à²¨à³ ಮತà³à²¤à³Šà²®à³à²®à³† ನಮೂದಿಸಿ',
'remembermypassword' => 'ಈ ಗಣಕಯಂತà³à²°à²¦à²²à³à²²à²¿ ನನà³à²¨ ಲಾಗಿನೠನೆನಪಿನಲà³à²²à²¿à²Ÿà³à²Ÿà³à²•à³Š (ಗರಿಷà³à²  $1 {{PLURAL:$1|ದಿನದ|ದಿನಗಳ}}ವರೆಗೆ)',
-'securelogin-stick-https' => 'ಲಾಗಿನೠಆದ ಬಳಿಕ HTTPS ನ ಸಂಪರà³à²•à²¦à²²à³à²²à²¿à²°à²¿.',
'yourdomainname' => 'ನಿಮà³à²® ಕà³à²·à³‡à²¤à³à²°:',
'password-change-forbidden' => 'ನೀವೠಈ ವಿಕಿಯಲà³à²²à²¿ ಪà³à²°à²µà³‡à²¶à²ªà²¦à²µà²¨à³à²¨à³ ಬದಲಾಯಿಸಲೠಸಾದà³à²¯à²µà²¿à²²à³à²².',
'login' => 'ಲಾಗೠಇನà³',
@@ -475,14 +483,19 @@ $2',
'logout' => 'ಲಾಗೠಔಟà³',
'userlogout' => 'ಲಾಗೠಔಟà³',
'notloggedin' => 'ಲಾಗಿನೠಆಗಿಲà³à²²',
+'userlogin-noaccount' => 'ಖಾತೆ ಇಲà³à²²à²µà³‡?',
'nologin' => "ಖಾತೆ ಇಲà³à²²à²µà³‡? '''$1'''.",
'nologinlink' => 'ಖಾತೆಯನà³à²¨à³ ಸೃಷà³à²Ÿà²¿à²¸à²¿',
'createaccount' => 'ಹೊಸ ಖಾತೆ ತೆರೆಯಿರಿ',
'gotaccount' => "ಈಗಾಗಲೇ ಖಾತೆಯಿದೆಯೇ? '''$1'''.",
'gotaccountlink' => 'ಲಾಗೠಇನà³',
'userlogin-resetlink' => 'ನಿಮà³à²® ಲಾಗಿನೠವಿವರಗಳನà³à²¨à³ ಮರೆತಿದà³à²¦à³€à²°à²¾?',
+'createacct-join' => 'ನಿಮà³à²® ಮಾಹಿತಿಯನà³à²¨à³ ಕೆಳಗೆ ನಮೂದಿಸಿ',
+'createacct-emailrequired' => 'ಇ-ಮೇಲೠವಿಳಾಸ:',
+'createacct-email-ph' => 'ನಿಮà³à²® ಇ-ಅಂಚೆ ವಿಳಾಸವನà³à²¨à³ ನಮೂದಿಸಿ',
'createaccountmail' => 'ಇ-ಅಂಚೆಯ ಮೂಲಕ',
'createaccountreason' => 'ಕಾರಣ:',
+'createacct-reason' => 'ಕಾರಣ',
'badretype' => 'ನೀವೠಕೊಟà³à²Ÿ ಪà³à²°à²µà³‡à²¶à²ªà²¦à²—ಳೠಬೇರೆಬೇರೆಯಾಗಿವೆ.',
'userexists' => 'ನೀವೠನೀಡಿದ ಸದಸà³à²¯à²° ಹೆಸರೠಆಗಲೆ ಬಳಕೆಯಲà³à²²à²¿à²¦à³†. ದಯವಿಟà³à²Ÿà³ ಬೇರೊಂದೠಹೆಸರನà³à²¨à³ ಆಯà³à²•à³† ಮಾಡಿ.',
'loginerror' => 'ಲಾಗಿನೠದೋಷ',
@@ -547,7 +560,7 @@ $2',
'newpassword' => 'ಹೊಸ ಪà³à²°à²µà³‡à²¶ ಪದ',
'retypenew' => 'ಹೊಸ ಪà³à²°à²µà³‡à²¶à²ªà²¦à²µà²¨à³à²¨à³ ಮತà³à²¤à³† ಟೈಪಿಸà³:',
'resetpass_submit' => 'ಪà³à²°à²µà³‡à²¶ ಪದವನà³à²¨à³ ನಿಶà³à²šà²¯à²¿à²¸à²¿ ಲಾಗೠಇನೠಆಗಿ',
-'resetpass_success' => 'ನಿಮà³à²® ಪà³à²°à²µà³‡à²¶ ಪದವನà³à²¨à³ ಯಶಸà³à²µà²¿à²¯à²¾à²—ಿ ಬದಲಾಯಿಸಲಾಗಿದೆ. ಈಗ ನಿಮà³à²®à²¨à³à²¨à³ ಲಾಗೠಇನೠಮಾಡಲಾಗà³à²¤à³à²¤à²¿à²¦à³†...',
+'changepassword-success' => 'ನಿಮà³à²® ಪà³à²°à²µà³‡à²¶ ಪದವನà³à²¨à³ ಯಶಸà³à²µà²¿à²¯à²¾à²—ಿ ಬದಲಾಯಿಸಲಾಗಿದೆ. ಈಗ ನಿಮà³à²®à²¨à³à²¨à³ ಲಾಗೠಇನೠಮಾಡಲಾಗà³à²¤à³à²¤à²¿à²¦à³†...',
'resetpass_forbidden' => 'ಪà³à²°à²µà³‡à²¶à²ªà²¦à²—ಳನà³à²¨à³ ಬದಲಾಯಿಸà³à²µà²‚ತಿಲà³à²².',
'resetpass-submit-loggedin' => 'ಪà³à²°à²µà³‡à²¶à²ªà²¦ ಬದಲಾಯಿಸà³',
'resetpass-submit-cancel' => 'ರದà³à²¦à³ ಮಾಡà³',
@@ -861,7 +874,6 @@ $2',
'viewprevnext' => 'ವೀಕà³à²·à²¿à²¸à³ ($1 {{int:pipe-separator}} $2) ($3)',
'searchmenu-exists' => "'''\"[[:\$1]]\" ಹೆಸರಿನ ಪà³à²Ÿ ಈ ವಿಕಿಯಲà³à²²à²¿à²¦à³†.'''",
'searchmenu-new' => "'''''[[:$1]]'' ಪà³à²Ÿà²µà²¨à³à²¨à³ ಈ ವಿಕಿಯಲà³à²²à²¿ ಸೃಷà³à²Ÿà²¿à²¸à²¿!'''",
-'searchhelp-url' => 'Help:ಪರಿವಿಡಿ',
'searchprofile-articles' => 'ಲೇಖನ ಪà³à²Ÿ',
'searchprofile-project' => 'ಸಹಾಯ ಮತà³à²¤à³ ಯೋಜನೆ ಪà³à²Ÿà²—ಳà³',
'searchprofile-images' => 'ಬಹà³à²®à²¾à²§à³à²¯à²®',
@@ -902,11 +914,6 @@ $2',
ಈ ವೇಳೆಯಲà³à²²à²¿ ನೀವೠಗೂಗಲೠಉಪಯೋಗಿಸಿ ಹà³à²¡à³à²•à²¾à²Ÿ ನಡೆಸಬಹà³à²¦à³.
ಗಮನಿಸಿ: ಅವರ {{SITENAME}} ಮಾಹಿತಿಯೠಪà³à²°à²¸à²•à³à²¤à²µà²¾à²—ಿಲà³à²²à²¦à²¿à²°à²¬à²¹à³à²¦à³.',
-# Quickbar
-'qbsettings-none' => 'ಯಾವà³à²¦à³‚ ಇಲà³à²²',
-'qbsettings-floatingleft' => 'ಎಡಕà³à²• ತೇಲà³à²¤à³à²¤à²¿à²¦à³†',
-'qbsettings-floatingright' => 'ಬಲಕà³à²•à³† ತೇಲà³à²¤à³à²¤à²¿à²¦à³†',
-
# Preferences page
'preferences' => 'ಪà³à²°à²¾à²¶à²¸à³à²¤à³à²¯à²—ಳà³',
'mypreferences' => 'ಪà³à²°à²¾à²¶à²¸à³à²¤à³à²¯à²—ಳà³',
@@ -1116,7 +1123,6 @@ $2',
'recentchangeslinked-feed' => 'ಸಂಬಂಧಪಟà³à²Ÿ ಬದಲಾವಣೆಗಳà³',
'recentchangeslinked-toolbox' => 'ಸಂಬಂಧಪಟà³à²Ÿ ಬದಲಾವಣೆಗಳà³',
'recentchangeslinked-title' => '"$1" ಪà³à²Ÿà²•à³à²•à³† ಸಂಬಂಧಿಸಿದ ಬದಲಾವಣೆಗಳà³',
-'recentchangeslinked-noresult' => 'ಸೂಚಿತ ಕಾಲದಲà³à²²à²¿ ಸಂಪರà³à²• ಹೊಂದಿರà³à²µ ಪà³à²Ÿà²—ಳಲà³à²²à²¿ ಯಾವ ಬದಲಾವಣೆಗಳೂ ಇಲà³à²².',
'recentchangeslinked-summary' => "ಒಂದೠನಿರà³à²¦à²¿à²·à³à²Ÿ ಪà³à²Ÿà²¦à²¿à²‚ದ (ಅಥವ ನಿರà³à²¦à²¿à²·à³à²Ÿ ವರà³à²—ಕà³à²•à³† ಸೇರಿರà³à²µ ಪà³à²Ÿà²—ಳಿಂದ) ಸಂಪರà³à²• ಹೊಂದಿರà³à²µ ಪà³à²Ÿà²—ಳಲà³à²²à²¿ ಇತà³à²¤à³€à²šà³†à²—ೆ ಮಾಡಲಾಗಿರà³à²µ ಬದಲಾವಣೆಗಳನà³à²¨à³ ಈ ಕೆಳಗೆ ಪಟà³à²Ÿà²¿ ಮಾಡಲಾಗಿದೆ.
[[Special:Watchlist|ನಿಮà³à²® ವೀಕà³à²·à²£à²¾à²ªà²Ÿà³à²Ÿà²¿à²¯à²²à³à²²à²¿]] ಇರà³à²µ ಪà³à²Ÿà²—ಳೠ'''ದಪà³à²ª ಅಕà³à²·à²°'''ಗಳಲà³à²²à²¿ ಇವೆ.",
'recentchangeslinked-page' => 'ಪà³à²Ÿà²¦ ಹೆಸರà³:',
@@ -1330,9 +1336,6 @@ $2',
'statistics-views-total' => 'ಒಟà³à²Ÿà³ ವೀಕà³à²·à²£à³†à²—ಳà³',
'statistics-mostpopular' => 'ಅತà³à²¯à²‚ತ ಹೆಚà³à²šà³ ವೀಕà³à²·à²¿à²¤ ಪà³à²Ÿà²—ಳà³',
-'disambiguations' => 'ದà³à²µà²‚ದà³à²µà²¨à²¿à²µà²¾à²°à²£à²¾ ಪà³à²Ÿà²—ಳà³',
-'disambiguationspage' => 'Template:ದà³à²µà²‚ದà³à²µ ನಿವಾರಣೆ',
-
'doubleredirects' => 'ಮರà³à²•à²³à²¿à²¸à²¿à²¦ ಪà³à²¨à²°à³à²¨à²¿à²°à³à²¦à³‡à²¶à²¨à²—ಳà³',
'brokenredirects' => 'ಮà³à²°à²¿à²¦ ರಿಡೈರೆಕà³à²Ÿà³â€Œà²—ಳà³',
@@ -1496,7 +1499,7 @@ $2',
'unwatchthispage' => 'ವೀಕà³à²·à²£à³† ನಿಲà³à²²à²¿à²¸à³',
'notvisiblerev' => 'ಆವೃತà³à²¤à²¿à²¯à²¨à³à²¨à³ ಅಳಿಸಲಾಗಿದೆ',
'watchlist-details' => 'ಚರà³à²šà³† ಪà³à²Ÿà²—ಳನà³à²¨à³ ಹೊರತà³à²ªà²¡à²¿à²¸à²¿, ನಿಮà³à²® ವೀಕà³à²·à²£à²¾à²ªà²Ÿà³à²Ÿà²¿à²¯à²²à³à²²à²¿ {{PLURAL:$1|$1 ಪà³à²Ÿ ಇದೆ|$1 ಪà³à²Ÿà²—ಳೠಇವೆ}}.',
-'wlheader-showupdated' => "* ನೀವೠಕೊನೆಯ ಬಾರಿ ಭೇಟಿ ನೀಡಿದ ನಂತರ ಬದಲಾವಣೆಗಳೠಆಗಿರà³à²µ ಪà³à²Ÿà²—ಳೠ'''ದಪà³à²ª ಅಕà³à²·à²°à²—ಳಲà³à²²à²¿''' ತೋರಿಸಲಾಗಿದೆ",
+'wlheader-showupdated' => "ನೀವೠಕೊನೆಯ ಬಾರಿ ಭೇಟಿ ನೀಡಿದ ನಂತರ ಬದಲಾವಣೆಗಳೠಆಗಿರà³à²µ ಪà³à²Ÿà²—ಳೠ'''ದಪà³à²ª ಅಕà³à²·à²°à²—ಳಲà³à²²à²¿''' ತೋರಿಸಲಾಗಿದೆ",
'watchmethod-recent' => 'ಇತà³à²¤à³€à²šà²¿à²¨ ಸಂಪಾದನೆಗಳಲà³à²²à²¿ ವೀಕà³à²·à²£à²¾à²ªà²Ÿà³à²Ÿà²¿à²—ೆ ಸೇರà³à²µ ಪà³à²Ÿà²—ಳ ಹà³à²¡à³à²•à³',
'watchmethod-list' => 'ವೀಕà³à²·à²£à²¾à²ªà²Ÿà³à²Ÿà²¿à²—ೆ ಸೇರà³à²µ ಪà³à²Ÿà²—ಳಲà³à²²à²¿ ಇತà³à²¤à³€à²šà²¿à²¨ ಸಂಪಾದನೆಗಳಿಗೆ ಹà³à²¡à³à²•à³',
'watchlistcontains' => 'ನಿಮà³à²® ವೀಕà³à²·à²£à²¾à²ªà²Ÿà³à²Ÿà²¿à²¯à²²à³à²²à²¿ $1 {{PLURAL:$1|ಪà³à²Ÿ|ಪà³à²Ÿà²—ಳà³}} ಇವೆ.',
@@ -1708,8 +1711,6 @@ $2',
'block-log-flags-nocreate' => 'ಖಾತೆ ಸೃಷà³à²Ÿà²¿ ತಡೆಹಿಡಿಯಲಾಗಿದೆ',
'block-log-flags-noemail' => 'ಇ-ಅಂಚೆ ತಡೆಹಿಡಿಯಲಾಗಿದೆ',
'ipb_already_blocked' => '"$1" ಆಗಲೆ ತಡೆ ಹಿಡಿಯಲಾಗಿದೆ',
-'blockme' => 'ನನà³à²¨à²¨à³à²¨à³ ತಡೆಹಿಡಿ',
-'proxyblocksuccess' => 'ಮà³à²—ಿಯಿತà³.',
# Developer tools
'lockdb' => 'ಡೇಟಾಬೇಸೠಅನà³à²¨à³ ಮà³à²šà³à²šà³',
@@ -1953,7 +1954,7 @@ $1',
* gpslongitude
* gpsaltitude',
-# EXIF tags
+# Exif tags
'exif-imagewidth' => 'ಅಗಲ',
'exif-imagelength' => 'ಎತà³à²¤à²°',
'exif-bitspersample' => 'ಪà³à²°à²¤à²¿ ಭಾಗಕà³à²•à²¿à²°à³à²µ ಬಿಟà³â€à²—ಳà³',
@@ -2154,11 +2155,6 @@ $5
'version-software-product' => 'ಉತà³à²ªà²¨à³à²¨',
'version-software-version' => 'ಆವೃತà³à²¤à²¿',
-# Special:FilePath
-'filepath' => 'ಫೈಲಿನ ಮಾರà³à²—',
-'filepath-page' => 'ಫೈಲà³:',
-'filepath-submit' => 'ಹೋಗà³',
-
# Special:FileDuplicateSearch
'fileduplicatesearch' => 'ದà³à²µà²¿à²ªà³à²°à²¤à²¿ ಫೈಲà³à²—ಳಿಗೆ ಹà³à²¡à³à²•à³',
'fileduplicatesearch-legend' => 'ದà³à²µà²¿à²ªà³à²°à²¤à²¿à²¯à²¨à³à²¨à³ ಹà³à²¡à³à²•à³',
diff --git a/languages/messages/MessagesKo.php b/languages/messages/MessagesKo.php
index 5ae43132..7906d144 100644
--- a/languages/messages/MessagesKo.php
+++ b/languages/messages/MessagesKo.php
@@ -81,7 +81,7 @@ $specialPageAliases = array(
'ChangePassword' => array( '비밀번호바꾸기', '비밀번호변경', '비밀단어바꾸기', '비밀단어변경' ),
'ComparePages' => array( '문서비êµ' ),
'Confirmemail' => array( 'ì´ë©”ì¼ì¸ì¦' ),
- 'Contributions' => array( '기여', '기여목ë¡', '사용ìžê¸°ì—¬' ),
+ 'Contributions' => array( '기여', '기여목ë¡' ),
'CreateAccount' => array( '계정만들기', '가입' ),
'Deadendpages' => array( '막다른문서' ),
'DeletedContributions' => array( 'ì‚­ì œëœê¸°ì—¬' ),
@@ -95,14 +95,14 @@ $specialPageAliases = array(
'Filepath' => array( '파ì¼ê²½ë¡œ', '그림경로' ),
'Import' => array( '가져오기' ),
'Invalidateemail' => array( 'ì´ë©”ì¼ì¸ì¦ì·¨ì†Œ', 'ì´ë©”ì¼ì¸ì¦í•´ì œ' ),
- 'JavaScriptTest' => array( 'ìžë°”스í¬ë¦½íŠ¸ì‹œí—˜' ),
- 'BlockList' => array( '차단ëœì‚¬ìš©ìž', '차단목ë¡' ),
+ 'JavaScriptTest' => array( 'ìžë°”스í¬ë¦½íŠ¸ì‹œí—˜', 'ìžë°”스í¬ë¦½íŠ¸í…ŒìŠ¤íŠ¸' ),
+ 'BlockList' => array( '차단ëœì‚¬ìš©ìž', '차단목ë¡', 'IP차단목ë¡' ),
'LinkSearch' => array( 'ë§í¬ì°¾ê¸°', 'ë§í¬ê²€ìƒ‰' ),
'Listadmins' => array( '관리ìž', '관리ìžëª©ë¡' ),
'Listbots' => array( 'ë´‡', '봇목ë¡' ),
'Listfiles' => array( '파ì¼', '그림', '파ì¼ëª©ë¡', '그림목ë¡' ),
'Listgrouprights' => array( '사용ìžê¶Œí•œ', '권한목ë¡' ),
- 'Listredirects' => array( '넘겨주기', '넘겨주기목ë¡' ),
+ 'Listredirects' => array( '넘겨주기목ë¡' ),
'Listusers' => array( '사용ìž', '사용ìžëª©ë¡' ),
'Lockdb' => array( 'DB잠금', 'DB잠그기' ),
'Log' => array( '기ë¡', '로그' ),
@@ -117,13 +117,14 @@ $specialPageAliases = array(
'Mostlinkedcategories' => array( '많ì´ì“°ëŠ”분류' ),
'Mostlinkedtemplates' => array( '많ì´ì“°ëŠ”í‹€' ),
'Mostrevisions' => array( '역사긴문서' ),
- 'Movepage' => array( 'ì´ë™', '문서ì´ë™' ),
+ 'Movepage' => array( '옮기기', '문서옮기기', 'ì´ë™', '문서ì´ë™' ),
'Mycontributions' => array( '내기여', '내기여목ë¡' ),
'Mypage' => array( '내사용ìžë¬¸ì„œ' ),
'Mytalk' => array( '내사용ìží† ë¡ ' ),
'Myuploads' => array( '내가올린파ì¼' ),
'Newimages' => array( '새파ì¼', '새그림' ),
'Newpages' => array( '새문서' ),
+ 'PagesWithProp' => array( 'ì†ì„±ë³„문서' ),
'PasswordReset' => array( '비밀번호재설정', '비밀단어재설정', '비밀번호초기화', '비밀단어초기화' ),
'PermanentLink' => array( '고유ë§í¬', 'ì˜êµ¬ë§í¬' ),
'Popularpages' => array( 'ì¸ê¸°ìžˆëŠ”문서' ),
@@ -135,6 +136,7 @@ $specialPageAliases = array(
'Randomredirect' => array( 'ìž„ì˜ë„˜ê²¨ì£¼ê¸°' ),
'Recentchanges' => array( '최근바뀜' ),
'Recentchangeslinked' => array( 'ë§í¬ìµœê·¼ë°”뀜' ),
+ 'Redirect' => array( '넘겨주기' ),
'Revisiondelete' => array( '특정íŒì‚­ì œ' ),
'Search' => array( '찾기', '검색' ),
'Shortpages' => array( '짧ì€ë¬¸ì„œ' ),
@@ -170,7 +172,7 @@ $specialPageAliases = array(
$magicWords = array(
'redirect' => array( '0', '#넘겨주기', '#REDIRECT' ),
'notoc' => array( '0', '__목차숨김__', '__NOTOC__' ),
- 'nogallery' => array( '0', '__화랑숨김__', '__갤러리숨김__', '__NOGALLERY__' ),
+ 'nogallery' => array( '0', '__갤러리숨김__', '__화랑숨김__', '__NOGALLERY__' ),
'forcetoc' => array( '0', '__목차보임__', '__목차표시__', '__FORCETOC__' ),
'toc' => array( '0', '__목차__', '__TOC__' ),
'noeditsection' => array( '0', '__부분편집숨김__', '__문단편집숨김__', '__단ë½íŽ¸ì§‘숨김__', '__NOEDITSECTION__' ),
@@ -183,7 +185,7 @@ $magicWords = array(
'currentday2' => array( '1', '현재ì¼2', 'CURRENTDAY2' ),
'currentdayname' => array( '1', '현재요ì¼', 'CURRENTDAYNAME' ),
'currentyear' => array( '1', '현재년', 'CURRENTYEAR' ),
- 'currenttime' => array( '1', '현재시분', '현재시ê°', 'CURRENTTIME' ),
+ 'currenttime' => array( '1', '현재시ê°', '현재시분', 'CURRENTTIME' ),
'currenthour' => array( '1', '현재시', 'CURRENTHOUR' ),
'localmonth' => array( '1', '지역월', 'LOCALMONTH', 'LOCALMONTH2' ),
'localmonth1' => array( '1', '지역월1', 'LOCALMONTH1' ),
@@ -216,6 +218,8 @@ $magicWords = array(
'fullpagenamee' => array( '1', '전체문서ì´ë¦„E', 'FULLPAGENAMEE' ),
'subpagename' => array( '1', '하위문서ì´ë¦„', 'SUBPAGENAME' ),
'subpagenamee' => array( '1', '하위문서ì´ë¦„E', 'SUBPAGENAMEE' ),
+ 'rootpagename' => array( '1', '최ìƒìœ„문서ì´ë¦„', 'ROOTPAGENAME' ),
+ 'rootpagenamee' => array( '1', '최ìƒìœ„문서ì´ë¦„E', 'ROOTPAGENAMEE' ),
'basepagename' => array( '1', 'ìƒìœ„문서ì´ë¦„', 'BASEPAGENAME' ),
'basepagenamee' => array( '1', 'ìƒìœ„문서ì´ë¦„E', 'BASEPAGENAMEE' ),
'talkpagename' => array( '1', '토론문서ì´ë¦„', 'TALKPAGENAME' ),
@@ -288,6 +292,8 @@ $magicWords = array(
'uc' => array( '0', '대문ìž:', 'UC:' ),
'raw' => array( '0', 'ì›ë³¸:', 'RAW:' ),
'displaytitle' => array( '1', '제목보ì´ê¸°', '제목표시', 'DISPLAYTITLE' ),
+ 'rawsuffix' => array( '1', 'ì›', 'R' ),
+ 'nocommafysuffix' => array( '0', '구분ìžì—†ìŒ', 'NOSEP' ),
'newsectionlink' => array( '1', '__새글쓰기__', '__NEWSECTIONLINK__' ),
'nonewsectionlink' => array( '1', '__새글쓰기숨기기__', '__NONEWSECTIONLINK__' ),
'currentversion' => array( '1', '현재버전', 'CURRENTVERSION' ),
@@ -375,9 +381,6 @@ $messages = array(
'tog-shownumberswatching' => '주시 ì‚¬ìš©ìž ìˆ˜ 보기',
'tog-oldsig' => '현재 서명:',
'tog-fancysig' => 'ì„œëª…ì„ ìœ„í‚¤í…스트로 취급 (ìžë™ìœ¼ë¡œ ë§í¬ë¥¼ 걸지 ì•ŠìŒ)',
-'tog-externaleditor' => '바깥 편집기를 기본 편집기로 사용 (숙련ìžìš©. ì»´í“¨í„°ì— íŠ¹ë³„í•œ ì„¤ì •ì´ í•„ìš”. [//www.mediawiki.org/wiki/Manual:External_editors ìžì„¸í•œ ì •ë³´ 보기])',
-'tog-externaldiff' => '바깥 ë¹„êµ ë„구를 기본 ë„구로 사용 (숙련ìžìš©. ì»´í“¨í„°ì— íŠ¹ë³„í•œ ì„¤ì •ì´ í•„ìš”. [//www.mediawiki.org/wiki/Manual:External_editors ìžì„¸í•œ 설명 보기])',
-'tog-showjumplinks' => 'ì ‘ê·¼ì„±ì„ ìœ„í•œ "ì´ë™" ë§í¬ 쓰기 (ì¼ë¶€ 스킨ì—서만 ìž‘ë™)',
'tog-uselivepreview' => '실시간 미리 보기 사용하기 (실험 기능)',
'tog-forceeditsummary' => '편집 ìš”ì•½ì„ ì“°ì§€ ì•Šì•˜ì„ ë•Œ 알려주기',
'tog-watchlisthideown' => '주시문서 목ë¡ì—ì„œ ë‚´ íŽ¸ì§‘ì„ ìˆ¨ê¸°ê¸°',
@@ -391,6 +394,8 @@ $messages = array(
'tog-showhiddencats' => 'ìˆ¨ì€ ë¶„ë¥˜ 보기',
'tog-noconvertlink' => 'ë§í¬ 제목 ë³€í™˜ì„ ë¹„í™œì„±í™”',
'tog-norollbackdiff' => 'ë˜ëŒë¦¬ê¸° 후 ì°¨ì´ë¥¼ ë³´ì´ì§€ 않기',
+'tog-useeditwarning' => '바꾼 ë‚´ìš©ì„ ì €ìž¥í•˜ì§€ ì•Šê³  편집 페ì´ì§€ë¥¼ ë²—ì–´ë‚  ë•Œ 알림',
+'tog-prefershttps' => '로그ì¸í•  ë•Œ í•­ìƒ ë³´ì•ˆ ì—°ê²° 사용',
'underline-always' => 'í•­ìƒ',
'underline-never' => '치지 ì•ŠìŒ',
@@ -454,6 +459,18 @@ $messages = array(
'oct' => '10',
'nov' => '11',
'dec' => '12',
+'january-date' => '1ì›” $1ì¼',
+'february-date' => '2ì›” $1ì¼',
+'march-date' => '3ì›” $1ì¼',
+'april-date' => '4ì›” $1ì¼',
+'may-date' => '5ì›” $1ì¼',
+'june-date' => '6ì›” $1ì¼',
+'july-date' => '7ì›” $1ì¼',
+'august-date' => '8ì›” $1ì¼',
+'september-date' => '9ì›” $1ì¼',
+'october-date' => '10ì›” $1ì¼',
+'november-date' => '11ì›” $1ì¼',
+'december-date' => '12ì›” $1ì¼',
# Categories related messages
'pagecategories' => '{{PLURAL:$1|분류}}',
@@ -535,6 +552,7 @@ $messages = array(
'create-this-page' => 'ì´ ë¬¸ì„œ 만들기',
'delete' => '삭제',
'deletethispage' => 'ì´ ë¬¸ì„œ 삭제하기',
+'undeletethispage' => 'ì´ ë¬¸ì„œë¥¼ ë˜ì‚´ë¦¬ê¸°',
'undelete_short' => '{{PLURAL:$1|편집 $1ê°œ}} ë˜ì‚´ë¦¬ê¸°',
'viewdeleted_short' => '{{PLURAL:$1|ì‚­ì œëœ íŽ¸ì§‘ $1ê°œ}} 보기',
'protect' => '보호',
@@ -551,7 +569,7 @@ $messages = array(
'articlepage' => '문서 보기',
'talk' => '토론',
'views' => '보기',
-'toolbox' => 'ë„구모ìŒ',
+'toolbox' => 'ë„구',
'userpage' => 'ì‚¬ìš©ìž ë¬¸ì„œ 보기',
'projectpage' => '프로ì íŠ¸ 문서 보기',
'imagepage' => 'íŒŒì¼ ë¬¸ì„œ 보기',
@@ -578,7 +596,7 @@ $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).
+# 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).
'aboutsite' => '{{SITENAME}} 소개',
'aboutpage' => 'Project:소개',
'copyright' => 'ë‚´ìš©ì€ ë³„ë„ë¡œ 명시하지 ì•Šì„ ê²½ìš° $1ì— ë”°ë¼ ì‚¬ìš©í•  수 있습니다.',
@@ -588,7 +606,6 @@ $1',
'disclaimers' => 'ë©´ì±… ì¡°í•­',
'disclaimerpage' => 'Project:ë©´ì±… ì¡°í•­',
'edithelp' => '편집 ë„움ë§',
-'edithelppage' => 'Help:편집하기',
'helppage' => 'Help:목차',
'mainpage' => '대문',
'mainpage-description' => '대문',
@@ -666,17 +683,12 @@ URLì„ ìž˜ëª» 입력하였거나, ìž˜ëª»ëœ ë§í¬ë¥¼ ë”°ë¼ê°”ì„ ìˆ˜ 있습니
# General errors
'error' => '오류',
'databaseerror' => 'ë°ì´í„°ë² ì´ìŠ¤ 오류',
-'dberrortext' => 'ë°ì´í„°ë² ì´ìŠ¤ 쿼리 구문 오류가 ë°œìƒí–ˆìŠµë‹ˆë‹¤.
-ì†Œí”„íŠ¸ì›¨ì–´ì˜ ë²„ê·¸ê°€ ìžˆì„ ìˆ˜ 있습니다.
-마지막으로 요청한 ë°ì´í„°ë² ì´ìŠ¤ 쿼리는 "<code>$2</code>" 함수ì—ì„œ ì“°ì¸
-<blockquote><code>$1</code></blockquote>
-입니다.
-ë°ì´í„°ë² ì´ìŠ¤ëŠ” "<samp>$3: $4</samp>" 오류를 ì¼ìœ¼ì¼°ìŠµë‹ˆë‹¤.',
-'dberrortextcl' => 'ë°ì´í„°ë² ì´ìŠ¤ 쿼리 구문 오류가 ë°œìƒí–ˆìŠµë‹ˆë‹¤.
-마지막으로 요청한 ë°ì´í„°ë² ì´ìŠ¤ 쿼리는 "$2" 함수ì—ì„œ ì“°ì¸
-"$1"
-입니다.
-ë°ì´í„°ë² ì´ìŠ¤ëŠ” "$3: $4" 오류를 ì¼ìœ¼ì¼°ìŠµë‹ˆë‹¤.',
+'databaseerror-text' => 'ë°ì´í„°ë² ì´ìŠ¤ ì¿¼ë¦¬ì— ì˜¤ë¥˜ê°€ ë°œìƒí–ˆìŠµë‹ˆë‹¤.
+ì†Œí”„íŠ¸ì›¨ì–´ì˜ ë²„ê·¸ê°€ ìžˆì„ ìˆ˜ 있습니다.',
+'databaseerror-textcl' => 'ë°ì´í„°ë² ì´ìŠ¤ ì¿¼ë¦¬ì— ì˜¤ë¥˜ê°€ ë°œìƒí–ˆìŠµë‹ˆë‹¤.',
+'databaseerror-query' => '쿼리: $1',
+'databaseerror-function' => '함수: $1',
+'databaseerror-error' => '오류: $1',
'laggedslavemode' => "'''경고:''' 문서가 ìµœê·¼ì— ë°”ë€ ë‚´ìš©ì´ ì•„ë‹ ìˆ˜ë„ ìžˆìŠµë‹ˆë‹¤.",
'readonly' => 'ë°ì´í„°ë² ì´ìŠ¤ ìž ê¹€',
'enterlockreason' => 'ë°ì´í„°ë² ì´ìŠ¤ë¥¼ 잠그는 ì´ìœ ì™€ 예ìƒë˜ëŠ” ê¸°ê°„ì„ ì ì–´ 주세요.',
@@ -709,6 +721,7 @@ URLì„ ìž˜ëª» 입력하였거나, ìž˜ëª»ëœ ë§í¬ë¥¼ ë”°ë¼ê°”ì„ ìˆ˜ 있습니
'cannotdelete-title' => '"$1" 문서를 삭제할 수 없습니다.',
'delete-hook-aborted' => 'í›…ì— ì˜í•´ 삭제가 중단ë˜ì—ˆìŠµë‹ˆë‹¤.
아무런 ì„¤ëª…ë„ ì£¼ì–´ì§€ì§€ 않았습니다.',
+'no-null-revision' => '"$1" ë¬¸ì„œì— ëŒ€í•œ 새 빈 íŒì„ 만들 수 없습니다',
'badtitle' => 'ìž˜ëª»ëœ ì œëª©',
'badtitletext' => '요청한 문서 ì œëª©ì´ ìž˜ëª»ë˜ì—ˆê±°ë‚˜, 비어있거나, ìž˜ëª»ëœ ì¸í„°ìœ„키 제목으로 ë§í¬í–ˆìŠµë‹ˆë‹¤.
문서 ì œëª©ì— ì‚¬ìš©í•  수 없는 문ìžë¥¼ ì‚¬ìš©í–ˆì„ ìˆ˜ 있습니다.',
@@ -732,12 +745,15 @@ URLì„ ìž˜ëª» 입력하였거나, ìž˜ëª»ëœ ë§í¬ë¥¼ ë”°ë¼ê°”ì„ ìˆ˜ 있습니
'editinginterface' => "'''경고''': 소프트웨어 ì¸í„°íŽ˜ì´ìŠ¤ì— ì“°ì´ëŠ” 문서를 고치고 있습니다.
ì´ ë¬¸ì„œì— ìžˆëŠ” ë‚´ìš©ì„ ë°”ê¾¸ë©´ ì´ ìœ„í‚¤ì— ìžˆëŠ” 모든 사용ìžì—게 ì˜í–¥ì„ ë¼ì¹©ë‹ˆë‹¤.
모든 ìœ„í‚¤ì— ëŒ€í•œ ë²ˆì—­ì„ ì¶”ê°€í•˜ê±°ë‚˜ 바꾸려면 미디어위키 지역화 프로ì íŠ¸ì¸ [//translatewiki.net/wiki/Main_Page?setlang=ko translatewiki.net]ì— ì°¸ì—¬í•˜ì‹œê¸° ë°”ëžë‹ˆë‹¤.",
-'sqlhidden' => '(SQL 쿼리 숨겨ì§)',
'cascadeprotected' => 'ì´ ë¬¸ì„œëŠ” ë‹¤ìŒ "연쇄ì " 보호가 걸린 {{PLURAL:$1|문서}}ì— í¬í•¨ë˜ì–´ 있어 함께 보호ë©ë‹ˆë‹¤:
$2',
'namespaceprotected' => "'''$1''' ì´ë¦„ê³µê°„ì„ íŽ¸ì§‘í•  수 있는 ê¶Œí•œì´ ì—†ìŠµë‹ˆë‹¤.",
'customcssprotected' => '여기ì—는 다른 사용ìžì˜ ê°œì¸ ì„¤ì •ì´ í¬í•¨ë˜ì–´ 있기 ë•Œë¬¸ì— ì´ CSS 문서를 편집할 수 없습니다.',
'customjsprotected' => '여기ì—는 다른 사용ìžì˜ ê°œì¸ ì„¤ì •ì´ í¬í•¨ë˜ì–´ 있기 ë•Œë¬¸ì— ì´ ìžë°”스í¬ë¦½íŠ¸ 문서를 편집할 수 없습니다.',
+'mycustomcssprotected' => 'ì´ CSS 문서를 편집할 ê¶Œí•œì´ ì—†ìŠµë‹ˆë‹¤.',
+'mycustomjsprotected' => 'ì´ ìžë°”스í¬ë¦½íŠ¸ 문서를 편집할 ê¶Œí•œì´ ì—†ìŠµë‹ˆë‹¤.',
+'myprivateinfoprotected' => 'ë‚´ ê°œì¸ ì •ë³´ë¥¼ 편집할 ê¶Œí•œì´ ì—†ìŠµë‹ˆë‹¤.',
+'mypreferencesprotected' => 'ë‚´ 환경 ì„¤ì •ì„ íŽ¸ì§‘í•  ê¶Œí•œì´ ì—†ìŠµë‹ˆë‹¤.',
'ns-specialprotected' => '특수 문서는 편집할 수 없습니다.',
'titleprotected' => '[[User:$1|$1]] 사용ìžê°€ 문서 만들기를 금지했습니다.
ì´ìœ ëŠ” 다ìŒê³¼ 같습니다. "$2"',
@@ -762,10 +778,19 @@ $2',
'welcomecreation-msg' => 'ê³„ì •ì´ ë§Œë“¤ì–´ì¡ŒìŠµë‹ˆë‹¤.
[[Special:Preferences|{{SITENAME}} ì‚¬ìš©ìž í™˜ê²½ 설정]]ì„ ë°”ê¿€ 수 있습니다.',
'yourname' => 'ì‚¬ìš©ìž ì´ë¦„:',
+'userlogin-yourname' => 'ì‚¬ìš©ìž ì´ë¦„',
+'userlogin-yourname-ph' => 'ì‚¬ìš©ìž ì´ë¦„ì„ ìž…ë ¥í•˜ì„¸ìš”',
+'createacct-another-username-ph' => 'ì‚¬ìš©ìž ì´ë¦„ì„ ìž…ë ¥í•˜ì„¸ìš”',
'yourpassword' => '비밀번호:',
+'userlogin-yourpassword' => '비밀번호',
+'userlogin-yourpassword-ph' => '비밀번호를 입력하세요',
+'createacct-yourpassword-ph' => '비밀번호를 입력하세요',
'yourpasswordagain' => '비밀번호 다시 입력:',
+'createacct-yourpasswordagain' => '비밀번호 확ì¸',
+'createacct-yourpasswordagain-ph' => '비밀번호를 다시 입력하세요',
'remembermypassword' => 'ì´ ë¸Œë¼ìš°ì €ì—ì„œ ë¡œê·¸ì¸ ìƒíƒœë¥¼ 저장하기 (최대 $1{{PLURAL:$1|ì¼}})',
-'securelogin-stick-https' => '로그ì¸í•˜ê³  ë‚˜ì„œë„ HTTPS ì—°ê²°ì„ ìœ ì§€í•˜ê¸°',
+'userlogin-remembermypassword' => 'ë¡œê·¸ì¸ ìƒíƒœë¥¼ 유지하기',
+'userlogin-signwithsecure' => '보안 연결 사용',
'yourdomainname' => 'ë„ë©”ì¸ ì´ë¦„:',
'password-change-forbidden' => 'ì´ ìœ„í‚¤ì—ì„œ 비밀번호를 바꿀 수 없습니다.',
'externaldberror' => '바깥 ì¸ì¦ ë°ì´í„°ë² ì´ìŠ¤ì— 오류가 있거나 바깥 ê³„ì •ì„ ìƒˆë¡œ ê³ ì¹  ê¶Œí•œì´ ì—†ìŠµë‹ˆë‹¤.',
@@ -777,18 +802,43 @@ $2',
'logout' => '로그아웃',
'userlogout' => '로그아웃',
'notloggedin' => '로그ì¸í•˜ì§€ ì•ŠìŒ',
+'userlogin-noaccount' => 'ê³„ì •ì´ ì—†ë‚˜ìš”?',
+'userlogin-joinproject' => '{{SITENAME}}ì— ê°€ìž…í•˜ì„¸ìš”',
'nologin' => 'ê³„ì •ì´ ì—†ë‚˜ìš”? $1.',
'nologinlink' => 'ê³„ì •ì„ ë§Œë“¤ê¸°',
'createaccount' => '계정 만들기',
'gotaccount' => 'ê³„ì •ì´ ì´ë¯¸ 있다면, $1.',
'gotaccountlink' => '로그ì¸í•˜ì„¸ìš”',
'userlogin-resetlink' => 'ì‚¬ìš©ìž ì´ë¦„ì´ë‚˜ 비밀번호를 잊으셨나요?',
+'userlogin-resetpassword-link' => '내 비밀번호 재설정',
+'helplogin-url' => 'Help:로그ì¸',
+'userlogin-helplink' => '[[{{MediaWiki:helplogin-url}}|로그ì¸ì— 관한 ë„움ë§]]',
+'userlogin-loggedin' => 'ì´ë¯¸ $1ë¡œ 로그ì¸ë˜ì–´ 있습니다. ì•„ëž˜ì˜ ì–‘ì‹ìœ¼ë¡œ 다른 계정으로 로그ì¸í•˜ì„¸ìš”.',
+'userlogin-createanother' => '다른 계정 만들기',
+'createacct-join' => 'ì•„ëž˜ì— ì •ë³´ë¥¼ 입력하세요.',
+'createacct-another-join' => 'ì•„ëž˜ì— ìƒˆ ê³„ì •ì˜ ì •ë³´ë¥¼ 입력하세요.',
+'createacct-emailrequired' => 'ì´ë©”ì¼ ì£¼ì†Œ',
+'createacct-emailoptional' => 'ì´ë©”ì¼ ì£¼ì†Œ (ì„ íƒ ì‚¬í•­)',
+'createacct-email-ph' => 'ì´ë©”ì¼ ì£¼ì†Œë¥¼ 입력하세요',
+'createacct-another-email-ph' => 'ì´ë©”ì¼ ì£¼ì†Œë¥¼ 입력하세요',
'createaccountmail' => 'ìž„ì‹œ ìž„ì˜ ë¹„ë°€ë²ˆí˜¸ë¥¼ ì´ë©”ì¼ë¡œ 보내기',
+'createacct-realname' => '실명 (ì„ íƒ ì‚¬í•­)',
'createaccountreason' => 'ì´ìœ :',
+'createacct-reason' => 'ì´ìœ ',
+'createacct-reason-ph' => '왜 다른 ê³„ì •ì„ ë§Œë“¤ì–´ì•¼ 합니까',
+'createacct-captcha' => '보안 검사',
+'createacct-imgcaptcha-ph' => 'ìœ„ì— ë³´ì´ëŠ” í…스트를 입력하세요',
+'createacct-submit' => '계정 만들기',
+'createacct-another-submit' => '다른 계정 만들기',
+'createacct-benefit-heading' => '{{SITENAME}}(ì€)는 여러분과 ê°™ì€ ì‚¬ëžŒìœ¼ë¡œ ì´ë£¨ì–´ì§‘니다.',
+'createacct-benefit-body1' => '{{PLURAL:$1|편집 수}}',
+'createacct-benefit-body2' => '{{PLURAL:$1|문서 수}}',
+'createacct-benefit-body3' => '최근 {{PLURAL:$1|기여ìž}}',
'badretype' => '입력한 비밀번호가 ì¼ì¹˜í•˜ì§€ 않습니다.',
'userexists' => '입력하신 ì‚¬ìš©ìž ì´ë¦„ì´ ì´ë¯¸ 등ë¡ë˜ì–´ 있습니다.
다른 ì´ë¦„ì„ ì„ íƒí•˜ì„¸ìš”.',
'loginerror' => 'ë¡œê·¸ì¸ ì˜¤ë¥˜',
+'createacct-error' => '계정 만들기 오류',
'createaccounterror' => 'ê³„ì •ì„ ë§Œë“¤ì§€ 못했습니다: $1',
'nocookiesnew' => 'ì‚¬ìš©ìž ê³„ì •ì„ ë§Œë“¤ì—ˆì§€ë§Œ, ì•„ì§ ë¡œê·¸ì¸í•˜ì§€ 않았습니다.
{{SITENAME}}ì—서는 ë¡œê·¸ì¸ ì •ë³´ë¥¼ 저장하기 위해 쿠키를 사용합니다.
@@ -855,10 +905,12 @@ $2',
실수로 ê³„ì •ì„ ìž˜ëª» 만들었다면 ì´ ë©”ì‹œì§€ëŠ” ë¬´ì‹œí•´ë„ ë©ë‹ˆë‹¤.',
'usernamehasherror' => 'ì‚¬ìš©ìž ì´ë¦„ì—는 í•´ì‹œ 문ìžê°€ 들어갈 수 없습니다',
'login-throttled' => '로그ì¸ì— ì—°ì†ìœ¼ë¡œ 실패하였습니다.
-ìž ì‹œ í›„ì— ë‹¤ì‹œ ì‹œë„하세요.',
+$1 기다렸다가 다시 ì‹œë„하세요.',
'login-abort-generic' => '로그ì¸ì— 실패했습니다 - 중지ë¨',
'loginlanguagelabel' => '언어: $1',
'suspicious-userlogout' => '브ë¼ìš°ì €ì— ì´ìƒì´ 있거나 ìºì‹± 프ë¡ì‹œì—ì„œ ë¡œê·¸ì•„ì›ƒì„ ìš”ì²­í–ˆê¸° ë•Œë¬¸ì— ë¡œê·¸ì•„ì›ƒì´ ê±°ë¶€ë˜ì—ˆìŠµë‹ˆë‹¤.',
+'createacct-another-realname-tip' => 'ì‹¤ëª…ì€ ì„ íƒ ì‚¬í•­ìž…ë‹ˆë‹¤.
+ì‹¤ëª…ì„ ìž…ë ¥í•˜ë©´ 문서 ê¸°ì—¬ì— ì‚¬ìš©ìžì˜ ì´ë¦„ì´ ë“¤ì–´ê°€ê²Œ ë©ë‹ˆë‹¤.',
# Email sending
'php-mail-error-unknown' => 'PHPì˜ mail() 함수ì—ì„œ ì•Œ 수 없는 오류가 ë°œìƒí–ˆìŠµë‹ˆë‹¤.',
@@ -875,8 +927,7 @@ $2',
'newpassword' => '새 비밀번호:',
'retypenew' => '새 비밀번호 재입력:',
'resetpass_submit' => '비밀번호를 설정하고 로그ì¸í•˜ê¸°',
-'resetpass_success' => '비밀번호가 성공ì ìœ¼ë¡œ 바뀌었습니다!
-ì´ì œ 로그ì¸ì„ 합니다...',
+'changepassword-success' => '비밀번호가 성공ì ìœ¼ë¡œ 바뀌었습니다!',
'resetpass_forbidden' => '비밀번호를 바꿀 수 없습니다',
'resetpass-no-info' => 'ì´ íŠ¹ìˆ˜ ë¬¸ì„œì— ì§ì ‘ 접근하려면 반드시 로그ì¸í•´ì•¼ 합니다.',
'resetpass-submit-loggedin' => '비밀번호 바꾸기',
@@ -888,10 +939,11 @@ $2',
# Special:PasswordReset
'passwordreset' => '비밀번호 재설정',
-'passwordreset-text' => '비밀번호를 재설정하려면 ì´ ì–‘ì‹ì„ 작성해주세요.',
+'passwordreset-text-one' => '비밀번호를 재설정하려면 ì´ ì–‘ì‹ì„ 작성해주세요.',
+'passwordreset-text-many' => '{{PLURAL:$1|비밀번호를 재설정하려면 필드 중 하나를 채우세요.}}',
'passwordreset-legend' => '비밀번호 재설정',
'passwordreset-disabled' => 'ì´ ìœ„í‚¤ì—서는 비밀번호를 재설정할 수 없습니다.',
-'passwordreset-pretext' => '{{PLURAL:$1||ì•„ëž˜ì— í•œ 가지 정보를 입력하세요}}',
+'passwordreset-emaildisabled' => 'ì´ ìœ„í‚¤ì—ì„œ ì´ë©”ì¼ ê¸°ëŠ¥ì´ ë¹„í™œì„±í™”ë˜ì–´ 있습니다.',
'passwordreset-username' => 'ì‚¬ìš©ìž ì´ë¦„:',
'passwordreset-domain' => 'ë„ë©”ì¸:',
'passwordreset-capture' => '발송 ê²°ê³¼ ì´ë©”ì¼ì„ 보시겠습니까?',
@@ -920,7 +972,7 @@ $2
임시 비밀번호: $2',
'passwordreset-emailsent' => '비밀번호 재설정 ì´ë©”ì¼ì„ 보냈습니다.',
'passwordreset-emailsent-capture' => '비밀번호 재설정 ì´ë©”ì¼ì´ 발송ë˜ì—ˆìœ¼ë©°, ì•„ëž˜ì— ë‚˜íƒ€ë‚˜ 있습니다.',
-'passwordreset-emailerror-capture' => '비밀번호 재설정 ì´ë©”ì¼ì´ 만들어져 ì•„ëž˜ì— ë‚˜íƒ€ë‚¬ì§€ë§Œ 발송하는 ë°ì—는 실패했습니다: $1',
+'passwordreset-emailerror-capture' => '비밀번호 재설정 ì´ë©”ì¼ì´ ìƒì„±ë˜ì–´ ì•„ëž˜ì— ë³´ì—¬ì ¸ 있지만, {{GENDER:$2|사용ìž}}ì—게 발송하는 ë°ì—는 실패했습니다: $1',
# Special:ChangeEmail
'changeemail' => 'ì´ë©”ì¼ ì£¼ì†Œ 바꾸기',
@@ -934,6 +986,19 @@ $2
'changeemail-submit' => 'ì´ë©”ì¼ ì£¼ì†Œ 바꾸기',
'changeemail-cancel' => '취소',
+# Special:ResetTokens
+'resettokens' => 'í† í° ìž¬ì„¤ì •',
+'resettokens-text' => 'ì—¬ê¸°ì— ë‹¹ì‹ ì˜ ê³„ì •ê³¼ ê´€ë ¨ëœ íŠ¹ì • ê°œì¸ ë°ì´í„°ì— ì ‘ê·¼ì„ í—ˆìš©í•˜ëŠ” 토í°ì„ 재설정합니다.
+
+토í°ì´ 다른 사람ì—게 알려졌거나 ê³„ì •ì´ ì¹¨í•´ë˜ì—ˆì„ 때는 재설정해야 합니다.',
+'resettokens-no-tokens' => '재설정할 토í°ì´ 없습니다.',
+'resettokens-legend' => 'í† í° ìž¬ì„¤ì •',
+'resettokens-tokens' => '토í°:',
+'resettokens-token-label' => '$1 (현재 값: $2)',
+'resettokens-watchlist-token' => '[[Special:Watchlist|주시문서 목ë¡ì— 있는 ë¬¸ì„œì˜ ë°”ë€œ]]ì˜ ì›¹ 피드(Atom/RSS)ì— ëŒ€í•œ 토í°',
+'resettokens-done' => '토í°ì„ 재설정했습니다.',
+'resettokens-resetbutton' => 'ì„ íƒí•œ í† í° ìž¬ì„¤ì •',
+
# Edit page toolbar
'bold_sample' => 'êµµì€ ê¸€ì”¨',
'bold_tip' => 'êµµì€ ê¸€ì”¨',
@@ -1138,12 +1203,15 @@ IP 주소는 여러 사용ìžê°€ 공유할 수 있습니다.
문서가 ì‚­ì œëœ ê²ƒ 같습니다.',
'edit-conflict' => '편집 충ëŒ.',
'edit-no-change' => 'ë¬¸ì„œì— ì–´ë– í•œ ë°”ë€œë„ ì—†ê¸° ë•Œë¬¸ì— íŽ¸ì§‘ì€ ë¬´ì‹œë˜ì—ˆìŠµë‹ˆë‹¤.',
+'postedit-confirmation' => 'íŽ¸ì§‘ì„ ì €ìž¥í–ˆìŠµë‹ˆë‹¤.',
'edit-already-exists' => '새 문서를 만들 수 없습니다.
문서가 ì´ë¯¸ 존재합니다.',
'defaultmessagetext' => '기본 메시지 글',
'content-failed-to-parse' => '$1 모ë¸ì— 대한 $2 ë‚´ìš©ì„ êµ¬ë¬¸ 분ì„하는 ë° ì‹¤íŒ¨í–ˆìŠµë‹ˆë‹¤: $3',
'invalid-content-data' => 'ìž˜ëª»ëœ ë‚´ìš© ë°ì´í„°ìž…니다',
'content-not-allowed-here' => '"$1" ë‚´ìš©ì€ [[$2]] 문서예 허용하지 않습니다',
+'editwarning-warning' => 'ì´ íŽ˜ì´ì§€ì—ì„œ 벗어나면 저장하지 ì•Šì€ ë°”ë€œì´ ëª¨ë‘ ì‚¬ë¼ì§‘니다.
+로그ì¸ì„ 했다면, 환경 ì„¤ì •ì˜ "편집 ìƒìž"ì—ì„œ ì´ ê²½ê³ ë¥¼ ë„우지 ì•Šë„ë¡ ì„¤ì •í•  수 있습니다.',
# Content models
'content-model-wikitext' => '위키í…스트',
@@ -1179,6 +1247,7 @@ $2ê°œ 보다 ì ê²Œ {{PLURAL:$2|ì¨ì•¼}} 하지만 {{PLURAL:$1|ì§€ê¸ˆì€ $1ê°œë¥
'undo-failure' => 'ì¤‘ê°„ì˜ ë‹¤ë¥¸ 편집과 충ëŒí•˜ì—¬ ì´ íŽ¸ì§‘ì„ ë˜ëŒë¦´ 수 없습니다.',
'undo-norev' => '문서가 없거나 ì‚­ì œë˜ì—ˆê¸° ë•Œë¬¸ì— íŽ¸ì§‘ì„ ë˜ëŒë¦´ 수 없습니다.',
'undo-summary' => '[[Special:Contributions/$2|$2]] ([[User talk:$2|토론]])ì˜ $1íŒ íŽ¸ì§‘ì„ ë˜ëŒë¦¼',
+'undo-summary-username-hidden' => '숨겨진 사용ìžê°€ $1 íŒì„ ë˜ëŒë¦¼',
# Account creation failure
'cantcreateaccounttitle' => 'ê³„ì •ì„ ë§Œë“¤ 수 ì—†ìŒ',
@@ -1360,6 +1429,7 @@ $1",
'compareselectedversions' => 'ì„ íƒí•œ íŒì„ 비êµí•˜ê¸°',
'showhideselectedversions' => 'ì„ íƒí•œ íŒì„ ë³´ì´ê¸°/숨기기',
'editundo' => '편집 취소',
+'diff-empty' => '(ì°¨ì´ ì—†ìŒ)',
'diff-multi' => '({{PLURAL:$2|í•œ 사용ìžì˜|ì‚¬ìš©ìž $2명ì˜}} {{PLURAL:$1|ì¤‘ê°„ì˜ íŽ¸ì§‘ $1ê°œ}} 숨겨ì§)',
'diff-multi-manyusers' => '({{PLURAL:$2|í•œ 사용ìžì˜|ì‚¬ìš©ìž $2명 ì´ìƒì˜}} {{PLURAL:$1|ì¤‘ê°„ì˜ íŽ¸ì§‘ $1ê°œ}} 숨겨ì§)',
'difference-missing-revision' => '문서 비êµì—ì„œ {{PLURAL:$2|하나|$2ê°œ}}ì˜ íŒ($1)ì„ ì°¾ì„ ìˆ˜ {{PLURAL:$2|없습니다}}.
@@ -1387,7 +1457,6 @@ $1",
'searchmenu-legend' => '찾기 설정',
'searchmenu-exists' => "'''ì´ ìœ„í‚¤ì— \"[[:\$1]]\"ì˜ ì´ë¦„ì„ ê°€ì§„ 문서가 있습니다.'''",
'searchmenu-new' => "'''ì´ ìœ„í‚¤ì— \"[[:\$1]]\" 문서를 만드세요!'''",
-'searchhelp-url' => 'Help:목차',
'searchmenu-prefix' => '[[Special:PrefixIndex/$1|ì´ ì ‘ë‘ì–´ë¡œ 시작하는 문서 찾기]]',
'searchprofile-articles' => '본문',
'searchprofile-project' => 'ë„ì›€ë§ ë° í”„ë¡œì íŠ¸ 문서',
@@ -1430,15 +1499,7 @@ $1",
'searchdisabled' => '{{SITENAME}} 찾기 ê¸°ëŠ¥ì´ ë¹„í™œì„±í™”ë˜ì–´ 있습니다.
ê¸°ëŠ¥ì´ ìž‘ë™í•˜ì§€ 않는 ë™ì•ˆì—는 구글(Google)ì„ ì´ìš©í•´ ì°¾ì„ ìˆ˜ 있습니다.
검색 ì—”ì§„ì˜ ë‚´ìš©ì€ ìµœì‹ ì´ ì•„ë‹ ìˆ˜ 있다는 ì ì„ 주ì˜í•´ì£¼ì„¸ìš”.',
-
-# Quickbar
-'qbsettings' => '빨리가기 맞춤',
-'qbsettings-none' => 'ì—†ìŒ',
-'qbsettings-fixedleft' => '왼쪽 고정',
-'qbsettings-fixedright' => '오른쪽 고정',
-'qbsettings-floatingleft' => '왼쪽 유ë™',
-'qbsettings-floatingright' => '오른쪽 유ë™',
-'qbsettings-directionality' => 'ì‚¬ìš©ìž ì–¸ì–´ì˜ ë¬¸ìž ìž…ë ¥ ë°©í–¥ì— ë§žì¶”ì–´ ê³ ì •',
+'search-error' => '찾는 ë™ì•ˆ 오류가 ë°œìƒí–ˆìŠµë‹ˆë‹¤: $1',
# Preferences page
'preferences' => 'ì‚¬ìš©ìž í™˜ê²½ 설정',
@@ -1472,7 +1533,6 @@ $1",
'resetprefs' => '저장하지 ì•Šì€ ì„¤ì • ë˜ëŒë¦¬ê¸°',
'restoreprefs' => '(모든 부분ì—ì„œ) ëª¨ë‘ ê¸°ë³¸ 설정으로 ë˜ëŒë¦¬ê¸°',
'prefs-editing' => '편집 ìƒìž',
-'prefs-edit-boxsize' => '편집 ì°½ì˜ í¬ê¸°',
'rows' => '줄 수:',
'columns' => '열 수:',
'searchresultshead' => '찾기',
@@ -1483,9 +1543,9 @@ $1",
'recentchangesdays-max' => '최대 $1{{PLURAL:$1|ì¼}}',
'recentchangescount' => '기본으로 보여줄 편집 수:',
'prefs-help-recentchangescount' => 'ì´ ì„¤ì •ì€ ìµœê·¼ 바뀜, 문서 역사와 기ë¡ì— ì ìš©ë©ë‹ˆë‹¤.',
-'prefs-help-watchlist-token' => 'ì•„ëž˜ì— ë¹„ë°€ ê°’ì„ ë„£ìœ¼ë©´ 주시문서 목ë¡ì— 대한 RSS 피드가 만들어집니다.
-비밀 ê°’ì„ ì•Œê³  있는 사람ì´ë¼ë©´ 누구나 피드를 ì½ì„ 수 있으므로 안전한 ê°’ì„ ìž…ë ¥í•´ì£¼ì„¸ìš”.
-ìž„ì˜ë¡œ 만들어진 ë‹¤ìŒ ê°’ì„ ì‚¬ìš©í•  ìˆ˜ë„ ìžˆìŠµë‹ˆë‹¤: $1',
+'prefs-help-watchlist-token2' => 'ë‚´ 주시문서 목ë¡ì˜ 웹 í”¼ë“œì˜ ë¹„ë°€ 키입니다.
+비밀 키를 알고 있는 ì‚¬ëžŒì€ ë‚´ 주시문서 목ë¡ì„ ì½ì… 수 있으니 비밀 키를 알리지 마세요.
+[[Special:ResetTokens|비밀 키를 재설정해야 한다면 여기를 í´ë¦­í•˜ì„¸ìš”]].',
'savedprefs' => 'ì„¤ì •ì„ ì €ìž¥í–ˆìŠµë‹ˆë‹¤.',
'timezonelegend' => '시간대:',
'localtime' => '현지 ì‹œê°:',
@@ -1516,7 +1576,6 @@ $1",
'prefs-reset-intro' => 'ì´ ì‚¬ì´íŠ¸ì˜ 기본값으로 환경 ì„¤ì •ì„ ìž¬ì„¤ì •í•  수 있습니다.
재설정한 환경 ì„¤ì •ì€ ë˜ëŒë¦´ 수 없습니다.',
'prefs-emailconfirm-label' => 'ì´ë©”ì¼ ì¸ì¦:',
-'prefs-textboxsize' => 'íŽ¸ì§‘ì°½ì˜ í¬ê¸°',
'youremail' => 'ì´ë©”ì¼:',
'username' => '{{GENDER:$1|ì‚¬ìš©ìž ì´ë¦„}}:',
'uid' => '{{GENDER:$1|사용ìž}} ID:',
@@ -1552,6 +1611,8 @@ HTML 태그를 확ì¸í•˜ì„¸ìš”.',
'prefs-dateformat' => '날짜 형ì‹',
'prefs-timeoffset' => '시차 설정',
'prefs-advancedediting' => 'ì¼ë°˜ 설정',
+'prefs-editor' => '편집ìž',
+'prefs-preview' => '미리 보기',
'prefs-advancedrc' => '고급 설정',
'prefs-advancedrendering' => '고급 설정',
'prefs-advancedsearchoptions' => '고급 설정',
@@ -1559,7 +1620,9 @@ HTML 태그를 확ì¸í•˜ì„¸ìš”.',
'prefs-displayrc' => 'ë³´ì´ê¸° 설정',
'prefs-displaysearchoptions' => 'ë³´ì´ê¸° 설정',
'prefs-displaywatchlist' => 'ë³´ì´ê¸° 설정',
+'prefs-tokenwatchlist' => '토í°',
'prefs-diffs' => 'ì°¨ì´',
+'prefs-help-prefershttps' => 'ì´ ì‚¬ìš©ìž í™˜ê²½ ì„¤ì •ì€ ë‹¤ìŒ ë¡œê·¸ì¸ì— ì ìš©ë©ë‹ˆë‹¤.',
# User preference: email validation using jQuery
'email-address-validity-valid' => 'ì´ë©”ì¼ ì£¼ì†Œê°€ 올바른 것으로 보입니다',
@@ -1586,6 +1649,8 @@ HTML 태그를 확ì¸í•˜ì„¸ìš”.',
'userrights-notallowed' => '다른 사용ìžì˜ ê¶Œí•œì„ ì¶”ê°€í•˜ê±°ë‚˜ 제거할 ê¶Œí•œì´ ì—†ìŠµë‹ˆë‹¤.',
'userrights-changeable-col' => '바꿀 수 있는 권한',
'userrights-unchangeable-col' => '바꿀 수 없는 권한',
+'userrights-conflict' => 'ì‚¬ìš©ìž ê¶Œí•œ 바꾸기가 충ëŒí•©ë‹ˆë‹¤! ë°”ë€œì„ ê²€í† í•˜ê³  확ì¸í•˜ì„¸ìš”.',
+'userrights-removed-self' => 'ìžì‹ ì˜ ê¶Œí•œì„ ì„±ê³µì ìœ¼ë¡œ 제거했습니다. ë”°ë¼ì„œ ë” ì´ìƒ ì´ ë¬¸ì„œì— ì ‘ê·¼í•  수 없습니다.',
# Groups
'group' => '그룹:',
@@ -1651,11 +1716,19 @@ HTML 태그를 확ì¸í•˜ì„¸ìš”.',
'right-proxyunbannable' => '프ë¡ì‹œ ìžë™ ì°¨ë‹¨ì„ ì ìš©í•˜ì§€ ì•ŠìŒ',
'right-unblockself' => 'ìžì‹ ì„ 차단 해제하기',
'right-protect' => '보호 수준 바꾸기 ë° ì—°ì‡„ ë³´í˜¸ëœ ë¬¸ì„œ 편집',
-'right-editprotected' => 'ë³´í˜¸ëœ ë¬¸ì„œ 편집 (ì—°ì‡„ì  ë³´í˜¸ 제외)',
+'right-editprotected' => '"{{int:protect-level-sysop}}"ë¡œ ë³´í˜¸ëœ ë¬¸ì„œ 편집',
+'right-editsemiprotected' => '"{{int:protect-level-autoconfirmed}}"ë¡œ ë³´í˜¸ëœ ë¬¸ì„œ 편집',
'right-editinterface' => 'ì‚¬ìš©ìž ì¸í„°íŽ˜ì´ìŠ¤ë¥¼ 편집',
'right-editusercssjs' => '다른 사용ìžì˜ CSS와 ìžë°”스í¬ë¦½íŠ¸ 문서를 편집',
'right-editusercss' => '다른 사용ìžì˜ CSS 문서를 편집',
'right-edituserjs' => '다른 사용ìžì˜ ìžë°”스í¬ë¦½íŠ¸ 문서를 편집',
+'right-editmyusercss' => 'ìžì‹ ì˜ ì‚¬ìš©ìž CSS íŒŒì¼ íŽ¸ì§‘í•˜ê¸°',
+'right-editmyuserjs' => 'ìžì‹ ì˜ ì‚¬ìš©ìž ìžë°”스í¬ë¦½íŠ¸ íŒŒì¼ íŽ¸ì§‘í•˜ê¸°',
+'right-viewmywatchlist' => 'ìžì‹ ì˜ 주시문서 ëª©ë¡ ë³´ê¸°',
+'right-editmywatchlist' => 'ìžì‹ ì˜ 주시문서 목ë¡ì„ 편집합니다. ì´ ê¶Œí•œì´ ì—†ì–´ë„ ë¬¸ì„œë¥¼ 추가할 수 있는 ê¶Œí•œì´ ì´ì™¸ì—ë„ ìžˆìŒì„ 참고하세요.',
+'right-viewmyprivateinfo' => 'ìžì‹ ì˜ ê°œì¸ ë°ì´í„° 보기 (예를 들어 ì´ë©”ì¼ ì£¼ì†Œ, 실명)',
+'right-editmyprivateinfo' => 'ìžì‹ ì˜ ê°œì¸ ë°ì´í„° 편집 (예를 들어 ì´ë©”ì¼ ì£¼ì†Œ, 실명)',
+'right-editmyoptions' => 'ìžì‹ ì˜ 환경 설정 편집',
'right-rollback' => '특정 문서를 편집한 마지막 사용ìžì˜ íŽ¸ì§‘ì„ ì‹ ì†í•˜ê²Œ ë˜ëŒë¦¬ê¸°',
'right-markbotedits' => 'ë˜ëŒë¦¬ê¸°ë¥¼ ë´‡ì˜ íŽ¸ì§‘ìœ¼ë¡œ 취급 가능',
'right-noratelimit' => 'ì†ë„ ì œí•œì— ì˜í–¥ì„ 받지 ì•ŠìŒ',
@@ -1717,12 +1790,19 @@ HTML 태그를 확ì¸í•˜ì„¸ìš”.',
'action-userrights-interwiki' => '다른 ìœ„í‚¤ì˜ ì‚¬ìš©ìž ê¶Œí•œì„ ì¡°ì •',
'action-siteadmin' => 'ë°ì´í„°ë² ì´ìŠ¤ë¥¼ 잠그거나 잠금 해제하기',
'action-sendemail' => 'ì´ë©”ì¼ ë³´ë‚´ê¸°',
+'action-editmywatchlist' => 'ë‚´ 주시문서 ëª©ë¡ íŽ¸ì§‘',
+'action-viewmywatchlist' => 'ë‚´ 주시문서 ëª©ë¡ ë³´ê¸°',
+'action-viewmyprivateinfo' => 'ë‚´ ê°œì¸ ì •ë³´ 보기',
+'action-editmyprivateinfo' => 'ë‚´ ê°œì¸ ì •ë³´ 편집',
# Recent changes
'nchanges' => '$1개 {{PLURAL:$1|바뀜}}',
+'enhancedrc-since-last-visit' => '{{PLURAL:$1|마지막 방문 ì´í›„}} $1ê°œ',
+'enhancedrc-history' => '역사',
'recentchanges' => '최근 바뀜',
'recentchanges-legend' => '최근 바뀜 설정',
'recentchanges-summary' => 'ìœ„í‚¤ì˜ ìµœê·¼ ë°”ë€œì´ ë‚˜ì™€ 있습니다.',
+'recentchanges-noresult' => '지정한 ì¡°ê±´ê³¼ ì¼ì¹˜í•˜ëŠ” 주어진 기간 ë™ì•ˆ ë°”ë€œì´ ì—†ìŠµë‹ˆë‹¤.',
'recentchanges-feed-description' => 'ìœ„í‚¤ì˜ ìµœê·¼ ë°”ë€œì´ ë‚˜ì™€ 있습니다.',
'recentchanges-label-newpage' => '새로운 문서',
'recentchanges-label-minor' => '사소한 편집',
@@ -1759,7 +1839,6 @@ HTML 태그를 확ì¸í•˜ì„¸ìš”.',
'recentchangeslinked-feed' => '가리키는 ê¸€ì˜ ë°”ë€œ',
'recentchangeslinked-toolbox' => '가리키는 ê¸€ì˜ ë°”ë€œ',
'recentchangeslinked-title' => '"$1" ë¬¸ì„œì— ê´€ë ¨ëœ ë¬¸ì„œ 바뀜',
-'recentchangeslinked-noresult' => '주어진 기간 ë™ì•ˆ ì´ ë¬¸ì„œì—ì„œ ë§í¬í•œ ë¬¸ì„œì˜ ë°”ë€œì´ ì—†ìŠµë‹ˆë‹¤.',
'recentchangeslinked-summary' => "여기를 가리키는 문서(ë¶„ë¥˜ì¼ ê²½ìš° ì´ ë¶„ë¥˜ì— í¬í•¨ëœ 문서)ì— ëŒ€í•œ 최근 ë°”ë€œì´ ë‚˜ì™€ 있습니다.
[[Special:Watchlist|주시하는 문서]]는 '''êµµì€''' 글씨로 나타납니다.",
'recentchangeslinked-page' => '문서 ì´ë¦„:',
@@ -1771,7 +1850,7 @@ HTML 태그를 확ì¸í•˜ì„¸ìš”.',
'reuploaddesc' => '올리기를 취소하고 올리기 ì–‘ì‹ìœ¼ë¡œ ëŒì•„가기',
'upload-tryagain' => 'ìˆ˜ì •ëœ íŒŒì¼ ì„¤ëª…ì„ ì €ìž¥',
'uploadnologin' => '로그ì¸í•˜ì§€ ì•ŠìŒ',
-'uploadnologintext' => '파ì¼ì„ 올리려면 [[Special:UserLogin|로그ì¸]]해야 합니다.',
+'uploadnologintext' => '파ì¼ì„ 올리려면 $1해야 합니다.',
'upload_directory_missing' => 'íŒŒì¼ ì˜¬ë¦¬ê¸°ìš© 디렉터리($1)ê°€ 없고 웹 서버가 만들지 못했습니다.',
'upload_directory_read_only' => 'íŒŒì¼ ì €ìž¥ 디렉터리($1)ì— ì“°ê¸° ê¶Œí•œì´ ì—†ìŠµë‹ˆë‹¤.',
'uploaderror' => '올리기 오류',
@@ -2008,7 +2087,6 @@ https://www.mediawiki.org/wiki/Manual:Image_Authorization ì„ ì°¸ê³ í•˜ì‹­ì‹œì˜¤
'http-read-error' => 'HTTP ì½ê¸° 오류입니다.',
'http-timed-out' => 'HTTP 요청 시간 초과입니다.',
'http-curl-error' => 'URL 열기 오류: $1',
-'http-host-unreachable' => 'URLì— ì ‘ê·¼í•˜ì§€ 못했습니다.',
'http-bad-status' => 'HTTP 요청 중 오류 ë°œìƒ: $1 $2',
# Some likely curl errors. More could be added from <http://curl.haxx.se/libcurl/c/libcurl-errors.html>
@@ -2039,6 +2117,10 @@ URLì´ ë§žê³  해당 웹사ì´íŠ¸ê°€ ìž‘ë™í•˜ëŠ”지 확ì¸í•´ì£¼ì„¸ìš”.',
'listfiles_size' => 'í¬ê¸°',
'listfiles_description' => '설명',
'listfiles_count' => '버전',
+'listfiles-show-all' => 'ê·¸ë¦¼ì˜ ê³¼ê±° íŒ í¬í•¨',
+'listfiles-latestversion' => '현재 íŒ',
+'listfiles-latestversion-yes' => '예',
+'listfiles-latestversion-no' => '아니오',
# File description page
'file-anchor-link' => '파ì¼',
@@ -2137,6 +2219,13 @@ URLì´ ë§žê³  해당 웹사ì´íŠ¸ê°€ ìž‘ë™í•˜ëŠ”지 확ì¸í•´ì£¼ì„¸ìš”.',
'randompage' => 'ìž„ì˜ ë¬¸ì„œë¡œ',
'randompage-nopages' => '{{PLURAL:$2|다ìŒ}} ì´ë¦„공간ì—는 문서가 없습니다: $1',
+# Random page in category
+'randomincategory' => 'ë¶„ë¥˜ì— ìžˆëŠ” ìž„ì˜ ë¬¸ì„œ',
+'randomincategory-invalidcategory' => '"$1"(ì€)는 올바른 분류 ì´ë¦„ì´ ì•„ë‹™ë‹ˆë‹¤.',
+'randomincategory-nopages' => '[[:Category:$1]]ì— ë¬¸ì„œê°€ 없습니다.',
+'randomincategory-selectcategory' => '분류ì—ì„œ ìž„ì˜ ë¬¸ì„œ 얻기: $1 $2',
+'randomincategory-selectcategory-submit' => '보기',
+
# Random redirect
'randomredirect' => 'ìž„ì˜ ë„˜ê²¨ì£¼ê¸° 문서로',
'randomredirect-nopages' => '"$1" ì´ë¦„공간ì—ì„œ 해당하는 넘겨주기 문서가 없습니다.',
@@ -2162,17 +2251,13 @@ URLì´ ë§žê³  해당 웹사ì´íŠ¸ê°€ ìž‘ë™í•˜ëŠ”지 확ì¸í•´ì£¼ì„¸ìš”.',
'statistics-users-active-desc' => '최근 {{PLURAL:$1|$1ì¼}} ë™ì•ˆ 활ë™í•œ 사용ìž',
'statistics-mostpopular' => '가장 ë§Žì´ ì½ížŒ 문서',
-'disambiguations' => 'ë™ìŒì´ì˜ 문서를 가리키는 문서 목ë¡',
-'disambiguationspage' => 'Template:ë™ìŒì´ì˜',
-'disambiguations-text' => "ë‹¤ìŒ ë¬¸ì„œëŠ” ì ì–´ë„ 하나 ì´ìƒ '''ë™ìŒì´ì˜ 문서'''를 가리키고 있습니다.
-ê·¸ ë§í¬ëŠ” 다른 ì ì ˆí•œ 문서로 ì—°ê²°í•  필요가 있습니다.<br />
-[[MediaWiki:Disambiguationspage]]ì—ì„œ ë§í¬ëœ í‹€ì„ ì‚¬ìš©í•˜ëŠ” 문서를 ë™ìŒì´ì˜ 문서로 간주합니다.",
-
'pageswithprop' => '문서 ì†ì„±ì´ 있는 문서',
'pageswithprop-legend' => '문서 ì†ì„±ì´ 있는 문서',
'pageswithprop-text' => 'ì´ ë¬¸ì„œëŠ” 특정 문서 ì†ì„±ì„ 사용한 문서를 나타냅니다.',
'pageswithprop-prop' => 'ì†ì„± ì´ë¦„:',
'pageswithprop-submit' => '가기',
+'pageswithprop-prophidden-long' => '숨겨진 긴 í…스트 ì†ì„± ê°’ ($1)',
+'pageswithprop-prophidden-binary' => '숨겨진 ì´ì§„ ì†ì„± ê°’ ($1)',
'doubleredirects' => 'ì´ì¤‘ 넘겨주기 목ë¡',
'doubleredirectstext' => 'ì´ ë¬¸ì„œëŠ” 다른 넘겨주기 문서로 넘겨주고 있는 ë¬¸ì„œì˜ ëª©ë¡ìž…니다.
@@ -2231,6 +2316,7 @@ URLì´ ë§žê³  해당 웹사ì´íŠ¸ê°€ ìž‘ë™í•˜ëŠ”지 확ì¸í•´ì£¼ì„¸ìš”.',
'mostrevisions' => '가장 ë§Žì´ íŽ¸ì§‘ëœ ë¬¸ì„œ 목ë¡',
'prefixindex' => 'ì ‘ë‘ì–´ì— ë”°ë¥¸ 문서 목ë¡',
'prefixindex-namespace' => 'ì ‘ë‘ì–´ê°€ 있는 모든 문서 ($1 ì´ë¦„공간)',
+'prefixindex-strip' => '목ë¡ì—ì„œ ì ‘ë‘ì–´ ìƒëžµ',
'shortpages' => 'ì§§ì€ ë¬¸ì„œ 목ë¡',
'longpages' => '긴 문서 목ë¡',
'deadendpages' => '막다른 문서 목ë¡',
@@ -2246,6 +2332,7 @@ URLì´ ë§žê³  해당 웹사ì´íŠ¸ê°€ ìž‘ë™í•˜ëŠ”지 확ì¸í•´ì£¼ì„¸ìš”.',
'listusers' => 'ì‚¬ìš©ìž ëª©ë¡',
'listusers-editsonly' => '기여가 있는 사용ìžë§Œ 보기',
'listusers-creationsort' => 'ê³„ì •ì„ ë§Œë“  날짜 순으로 ì •ë ¬',
+'listusers-desc' => '내림차순으로 정렬',
'usereditcount' => '{{PLURAL:$1|편집}} $1회',
'usercreated' => '$1 $2ì— ê³„ì • {{GENDER:$3|만들어ì§}}',
'newpages' => '새 문서 목ë¡',
@@ -2425,10 +2512,9 @@ URLì´ ë§žê³  해당 웹사ì´íŠ¸ê°€ ìž‘ë™í•˜ëŠ”지 확ì¸í•´ì£¼ì„¸ìš”.',
'unwatchthispage' => '주시 해제하기',
'notanarticle' => '문서가 아님',
'notvisiblerev' => 'ì´ íŒì€ ì‚­ì œë˜ì—ˆìŠµë‹ˆë‹¤.',
-'watchnochange' => '주어진 기간 ì¤‘ì— ë°”ë€ ì£¼ì‹œë¬¸ì„œê°€ 없습니다.',
'watchlist-details' => 'í† ë¡ ì„ ì œì™¸í•˜ê³  {{PLURAL:$1|문서 $1ê°œ}}를 주시하고 있습니다.',
-'wlheader-enotif' => '* ì´ë©”ì¼ ì•Œë¦¼ ê¸°ëŠ¥ì´ í™œì„±í™”ë˜ì—ˆìŠµë‹ˆë‹¤.',
-'wlheader-showupdated' => "* 마지막으로 방문한 ì´í›„ì— ë°”ë€ ë¬¸ì„œëŠ” '''êµµì€ ê¸€ì”¨'''ë¡œ 보여집니다.",
+'wlheader-enotif' => 'ì´ë©”ì¼ ì•Œë¦¼ ê¸°ëŠ¥ì´ í™œì„±í™”ë˜ì—ˆìŠµë‹ˆë‹¤.',
+'wlheader-showupdated' => "마지막으로 방문한 ì´í›„ì— ë°”ë€ ë¬¸ì„œëŠ” '''êµµì€ ê¸€ì”¨'''ë¡œ 보여집니다.",
'watchmethod-recent' => 'ì£¼ì‹œëœ ë¬¸ì„œë¥¼ 확ì¸í•˜ê³ ìž 최근 íŽ¸ì§‘ì„ í™•ì¸',
'watchmethod-list' => '최근 íŽ¸ì§‘ì„ í™•ì¸í•˜ê³ ìž ì£¼ì‹œëœ ë¬¸ì„œ 확ì¸',
'watchlistcontains' => '{{PLURAL:$1|문서 $1개}}를 주시하고 있습니다.',
@@ -2683,7 +2769,7 @@ $1',
'contributions' => '{{GENDER:$1|사용ìž}} 기여',
'contributions-title' => '$1 사용ìžì˜ 기여 목ë¡',
'mycontris' => '기여 목ë¡',
-'contribsub2' => '$1($2)ì˜ ê¸°ì—¬',
+'contribsub2' => '{{GENDER:$3|$1}}($2)ì˜ ê¸°ì—¬',
'nocontribs' => '지정한 ì¡°ê±´ê³¼ ì¼ì¹˜í•˜ëŠ” ë°”ë€œì„ ì°¾ì„ ìˆ˜ 없습니다.',
'uctop' => '(최신)',
'month' => 'ì›”:',
@@ -2843,15 +2929,13 @@ $1 사용ìžê°€ ì°¨ë‹¨ëœ ì´ìœ ëŠ” 다ìŒê³¼ 같습니다: "$2"',
하지만 $2ë¡œ ê´‘ì—­ 차단ë˜ì—ˆê¸° 때문ì—, ê´‘ì—­ 차단 해제로 ì°¨ë‹¨ì„ í•´ì œí•  수 있습니다.',
'ip_range_invalid' => 'IP 범위가 잘못ë˜ì—ˆìŠµë‹ˆë‹¤.',
'ip_range_toolarge' => '/$1보다 ë„“ì€ ë²”ìœ„ì˜ ê´‘ì—­ ì°¨ë‹¨ì„ í•  수 없습니다.',
-'blockme' => 'ìžê°€ 차단',
'proxyblocker' => '프ë¡ì‹œ 차단',
-'proxyblocker-disabled' => 'ì´ ê¸°ëŠ¥ì€ ë¹„í™œì„±ë˜ì–´ 있습니다.',
'proxyblockreason' => 'ë‹¹ì‹ ì˜ IP 주소는 공개 프ë¡ì‹œë¡œ ë°í˜€ì ¸ ìžë™ìœ¼ë¡œ 차단ë©ë‹ˆë‹¤.
만약 ì¸í„°ë„· ì‚¬ìš©ì— ë¬¸ì œê°€ 있다면 ì¸í„°ë„· 서비스 공급ìžë‚˜ 기술 지ì›íŒ€ì—게 문ì˜í•´ì£¼ì„¸ìš”.',
-'proxyblocksuccess' => '완료.',
'sorbsreason' => 'ë‹¹ì‹ ì˜ IP 주소는 {{SITENAME}}ì—ì„œ 사용하는 DNSBL 공개 프ë¡ì‹œ 목ë¡ì— 들어 있습니다.',
'sorbs_create_account_reason' => 'ë‹¹ì‹ ì˜ IP 주소는 {{SITENAME}}ì—ì„œ 사용하는 DNSBL 공개 프ë¡ì‹œ 목ë¡ì— 들어 있습니다.
ê³„ì •ì„ ë§Œë“¤ 수 없습니다.',
+'xffblockreason' => 'X-Forwarded-For í—¤ë”ì— í˜„ìž¬ 사용하고 있는 프ë¡ì‹œ 서버 중 당신ì´ë‚˜ 해당 IP 주소가 차단ë˜ì—ˆìŠµë‹ˆë‹¤. 차단 ì´ìœ ëŠ” 다ìŒê³¼ 같습니다: $1',
'cant-block-while-blocked' => 'ìžì‹ ì´ 차단ë˜ì–´ 있는 ë™ì•ˆì—는 다른 사용ìžë¥¼ 차단할 수 없습니다.',
'cant-see-hidden-user' => '차단하려 하는 사용ìžëŠ” ì´ë¯¸ 차단ë˜ì—ˆê³  숨김 처리ë˜ì—ˆìŠµë‹ˆë‹¤.
ì‚¬ìš©ìž ìˆ¨ê¸°ê¸° ê¶Œí•œì„ ê°–ê³  있지 않기 때문ì—, ì´ ì‚¬ìš©ìžì˜ 차단 기ë¡ì„ 보거나 차단 ì„¤ì •ì„ ë°”ê¿€ 수 없습니다.',
@@ -3016,6 +3100,8 @@ $1 사용ìžê°€ ì°¨ë‹¨ëœ ì´ìœ ëŠ” 다ìŒê³¼ 같습니다: "$2"',
'thumbnail-more' => '실제 í¬ê¸°ë¡œ',
'filemissing' => 'íŒŒì¼ ì‚¬ë¼ì§',
'thumbnail_error' => '섬네ì¼ì„ 만드는 중 오류 ë°œìƒ: $1',
+'thumbnail_error_remote' => '$1ì—ì„œ 반환한 오류 메시지:
+$2',
'djvu_page_error' => 'DjVu 페ì´ì§€ 범위 벗어남',
'djvu_no_xml' => 'DjVu 파ì¼ì˜ XML 정보를 ì½ì„ 수 ì—†ìŒ',
'thumbnail-temp-create' => 'ìž„ì‹œ ì„¬ë„¤ì¼ íŒŒì¼ì„ 만들 수 없습니다.',
@@ -3166,20 +3252,15 @@ $1 사용ìžê°€ ì°¨ë‹¨ëœ ì´ìœ ëŠ” 다ìŒê³¼ 같습니다: "$2"',
'tooltip-undo' => '"편집 취소" ê¸°ëŠ¥ì„ ì‚¬ìš©í•˜ë©´ ì´ íŽ¸ì§‘ì´ ë˜ëŒë ¤ì§€ê³  ì°¨ì´ ë³´ê¸° ê¸°ëŠ¥ì´ ë¯¸ë¦¬ 보기 형ì‹ìœ¼ë¡œ 나타납니다. 편집 ìš”ì•½ì— ì´ íŽ¸ì§‘ì„ ì™œ ë˜ëŒë¦¬ëŠ”ì§€ì— ëŒ€í•œ ì´ìœ ë¥¼ 쓸 수 있습니다.',
'tooltip-preferences-save' => '환경 설정 저장하기',
'tooltip-summary' => 'ì§§ì€ ìš”ì•½ì„ ì ì–´ì£¼ì„¸ìš”',
+'tooltip-iwiki' => '$2 - $1',
# Stylesheets
'common.css' => '/* ì´ CSS ì„¤ì •ì€ ëª¨ë“  ìŠ¤í‚¨ì— ë™ì¼í•˜ê²Œ ì ìš©ë©ë‹ˆë‹¤ */',
-'standard.css' => '/* ì´ CSS ì„¤ì •ì€ ìŠ¤íƒ ë‹¤ë“œ ìŠ¤í‚¨ì„ ì‚¬ìš©í•˜ëŠ” 사용ìžì—게 ì ìš©ë©ë‹ˆë‹¤ */',
-'nostalgia.css' => '/* ì´ CSS ì„¤ì •ì€ ë…¸ìŠ¤íƒ¤ì§€ì•„ ìŠ¤í‚¨ì„ ì‚¬ìš©í•˜ëŠ” 사용ìžì—게 ì ìš©ë©ë‹ˆë‹¤ */',
'cologneblue.css' => '/* ì´ CSS ì„¤ì •ì€ ì¾°ë¥¸ 블루 ìŠ¤í‚¨ì„ ì‚¬ìš©í•˜ëŠ” 사용ìžì—게 ì ìš©ë©ë‹ˆë‹¤ */',
'monobook.css' => '/* ì´ CSS ì„¤ì •ì€ ëª¨ë…¸ë¶ ìŠ¤í‚¨ì„ ì‚¬ìš©í•˜ëŠ” 사용ìžì—게 ì ìš©ë©ë‹ˆë‹¤ */',
-'myskin.css' => '/* ì´ CSS ì„¤ì •ì€ ë§ˆì´ìŠ¤í‚¨ ìŠ¤í‚¨ì„ ì‚¬ìš©í•˜ëŠ” 사용ìžì—게 ì ìš©ë©ë‹ˆë‹¤ */',
-'chick.css' => '/* ì´ CSS ì„¤ì •ì€ ì¹˜í¬ ìŠ¤í‚¨ì„ ì‚¬ìš©í•˜ëŠ” 사용ìžì—게 ì ìš©ë©ë‹ˆë‹¤ */',
-'simple.css' => '/* ì´ CSS ì„¤ì •ì€ ì‹¬í”Œ ìŠ¤í‚¨ì„ ì‚¬ìš©í•˜ëŠ” 사용ìžì—게 ì ìš©ë©ë‹ˆë‹¤ */',
'modern.css' => '/* ì´ CSS ì„¤ì •ì€ ëª¨ë˜ ìŠ¤í‚¨ì„ ì‚¬ìš©í•˜ëŠ” 사용ìžì—게 ì ìš©ë©ë‹ˆë‹¤ */',
'vector.css' => '/* ì´ CSS ì„¤ì •ì€ ë²¡í„° ìŠ¤í‚¨ì„ ì‚¬ìš©í•˜ëŠ” 사용ìžì—게 ì ìš©ë©ë‹ˆë‹¤ */',
'print.css' => '/* ì´ CSS ì„¤ì •ì€ ì¸ì‡„ 출력 í™”ë©´ì— ì ìš©ë©ë‹ˆë‹¤ */',
-'handheld.css' => '/* ì´ CSS ì„¤ì •ì€ $wgHandheldStyleì— ì„¤ì •í•œ ìŠ¤í‚¨ì„ ê¸°ë°˜ìœ¼ë¡œ í•œ 휴대 ê¸°ê¸°ì— ì ìš©ë©ë‹ˆë‹¤ */',
'noscript.css' => '/* ì´ CSS ì„¤ì •ì€ ìžë°”스í¬ë¦½íŠ¸ë¥¼ 비활성화한 사용ìžì— ì ìš©ë©ë‹ˆë‹¤ */',
'group-autoconfirmed.css' => '/* ì´ CSS ì„¤ì •ì€ ìžë™ ì¸ì¦ëœ 사용ìžì—만 ì ìš©ë©ë‹ˆë‹¤ */',
'group-bot.css' => '/* ì´ CSS ì„¤ì •ì€ ë´‡ì—만 ì ìš©ë©ë‹ˆë‹¤ */',
@@ -3188,13 +3269,8 @@ $1 사용ìžê°€ ì°¨ë‹¨ëœ ì´ìœ ëŠ” 다ìŒê³¼ 같습니다: "$2"',
# Scripts
'common.js' => '/* ì´ ìžë°”스í¬ë¦½íŠ¸ ì„¤ì •ì€ ëª¨ë“  문서, 모든 사용ìžì—게 ì ìš©ë©ë‹ˆë‹¤. */',
-'standard.js' => '/* ì´ ìžë°”스í¬ë¦½íŠ¸ ì„¤ì •ì€ ìŠ¤íƒ ë‹¤ë“œ ìŠ¤í‚¨ì„ ì‚¬ìš©í•˜ëŠ” 사용ìžì—게 ì ìš©ë©ë‹ˆë‹¤ */',
-'nostalgia.js' => '/* ì´ ìžë°”스í¬ë¦½íŠ¸ ì„¤ì •ì€ ë…¸ìŠ¤íƒ¤ì§€ì•„ ìŠ¤í‚¨ì„ ì‚¬ìš©í•˜ëŠ” 사용ìžì—게 ì ìš©ë©ë‹ˆë‹¤ */',
'cologneblue.js' => '/* ì´ ìžë°”스í¬ë¦½íŠ¸ ì„¤ì •ì€ ì¾°ë¥¸ 블루 ìŠ¤í‚¨ì„ ì‚¬ìš©í•˜ëŠ” 사용ìžì—게 ì ìš©ë©ë‹ˆë‹¤ */',
'monobook.js' => '/* ì´ ìžë°”스í¬ë¦½íŠ¸ ì„¤ì •ì€ ëª¨ë…¸ë¶ ìŠ¤í‚¨ì„ ì‚¬ìš©í•˜ëŠ” 사용ìžì—게 ì ìš©ë©ë‹ˆë‹¤ */',
-'myskin.js' => '/* ì´ ìžë°”스í¬ë¦½íŠ¸ ì„¤ì •ì€ ë§ˆì´ìŠ¤í‚¨ ìŠ¤í‚¨ì„ ì‚¬ìš©í•˜ëŠ” 사용ìžì—게 ì ìš©ë©ë‹ˆë‹¤ */',
-'chick.js' => '/* ì´ ìžë°”스í¬ë¦½íŠ¸ ì„¤ì •ì€ ì¹˜í¬ ìŠ¤í‚¨ì„ ì‚¬ìš©í•˜ëŠ” 사용ìžì—게 ì ìš©ë©ë‹ˆë‹¤ */',
-'simple.js' => '/* ì´ ìžë°”스í¬ë¦½íŠ¸ ì„¤ì •ì€ ì‹¬í”Œ ìŠ¤í‚¨ì„ ì‚¬ìš©í•˜ëŠ” 사용ìžì—게 ì ìš©ë©ë‹ˆë‹¤ */',
'modern.js' => '/* ì´ ìžë°”스í¬ë¦½íŠ¸ ì„¤ì •ì€ ëª¨ë˜ ìŠ¤í‚¨ì„ ì‚¬ìš©í•˜ëŠ” 사용ìžì—게 ì ìš©ë©ë‹ˆë‹¤ */',
'vector.js' => '/* ì´ ìžë°”스í¬ë¦½íŠ¸ ì„¤ì •ì€ ë²¡í„° ìŠ¤í‚¨ì„ ì‚¬ìš©í•˜ëŠ” 사용ìžì—게 ì ìš©ë©ë‹ˆë‹¤ */',
'group-autoconfirmed.js' => '/* ì´ ìžë°”스í¬ë¦½íŠ¸ ì„¤ì •ì€ ìžë™ ì¸ì¦ëœ 사용ìžì—만 ì ìš©ë©ë‹ˆë‹¤ */',
@@ -3275,13 +3351,8 @@ $1 사용ìžê°€ ì°¨ë‹¨ëœ ì´ìœ ëŠ” 다ìŒê³¼ 같습니다: "$2"',
'pageinfo-category-files' => 'íŒŒì¼ ìˆ˜',
# Skin names
-'skinname-standard' => 'í´ëž˜ì‹',
-'skinname-nostalgia' => '노스탤지아',
'skinname-cologneblue' => '쾰른 블루',
'skinname-monobook' => '모노ë¶',
-'skinname-myskin' => '마ì´ìŠ¤í‚¨',
-'skinname-chick' => '치í¬',
-'skinname-simple' => '심플',
'skinname-modern' => '모ë˜',
'skinname-vector' => '벡터',
@@ -3360,11 +3431,25 @@ $1',
'minutes' => '$1분',
'hours' => '$1시간',
'days' => '$1ì¼',
+'weeks' => '{{PLURAL:$1|$1주}}',
'months' => '$1달',
'years' => '$1ë…„',
'ago' => '$1 ì „',
'just-now' => '방금',
+# Human-readable timestamps
+'hours-ago' => '$1시간 전',
+'minutes-ago' => '$1분 전',
+'seconds-ago' => '$1ì´ˆ ì „',
+'monday-at' => 'ì›”ìš”ì¼ $1',
+'tuesday-at' => 'í™”ìš”ì¼ $1',
+'wednesday-at' => 'ìˆ˜ìš”ì¼ $1',
+'thursday-at' => 'ëª©ìš”ì¼ $1',
+'friday-at' => 'ê¸ˆìš”ì¼ $1',
+'saturday-at' => 'í† ìš”ì¼ $1',
+'sunday-at' => 'ì¼ìš”ì¼ $1',
+'yesterday-at' => '어제 $1',
+
# Bad image list
'bad_image_list' => '형ì‹ì€ 아래와 같습니다.
@@ -3401,7 +3486,7 @@ Variants for Chinese language
* gpslongitude
* gpsaltitude',
-# EXIF tags
+# Exif tags
'exif-imagewidth' => '너비',
'exif-imagelength' => '높ì´',
'exif-bitspersample' => '픽셀당 비트 수',
@@ -3579,7 +3664,7 @@ Variants for Chinese language
'exif-originalimageheight' => 'ìžë¥´ê¸° ì „ ê·¸ë¦¼ì˜ ì„¸ë¡œ 길ì´',
'exif-originalimagewidth' => 'ìžë¥´ê¸° ì „ ê·¸ë¦¼ì˜ ê°€ë¡œ 길ì´',
-# EXIF attributes
+# Exif attributes
'exif-compression-1' => '압축ë˜ì§€ ì•ŠìŒ',
'exif-compression-2' => 'CCITT 그룹-3 1ì°¨ì› ìˆ˜ì • 허프먼 반복 ê¸¸ì´ ë¶€í˜¸í™”',
'exif-compression-3' => 'CCITT 그룹-3 팩스 ì¸ì½”딩',
@@ -3980,7 +4065,6 @@ $5
'version-other' => '기타',
'version-mediahandlers' => '미디어 핸들러',
'version-hooks' => 'í›…',
-'version-extension-functions' => '확장 함수',
'version-parser-extensiontags' => '파서 확장 태그',
'version-parser-function-hooks' => '파서 함수 훅',
'version-hook-name' => 'í›… ì´ë¦„',
@@ -3989,6 +4073,7 @@ $5
'version-license' => 'ë¼ì´ì„ ìŠ¤',
'version-poweredby-credits' => "ì´ ìœ„í‚¤ëŠ” '''[//www.mediawiki.org/ MediaWiki]'''를 기반으로 ìž‘ë™í•©ë‹ˆë‹¤. Copyright © 2001-$1 $2.",
'version-poweredby-others' => 'ê·¸ 외 다른 개발ìž',
+'version-poweredby-translators' => 'translatewiki.net 번역ìž',
'version-credits-summary' => '[[Special:Version|미디어위키]]ì— ê¸°ì—¬í•œ ë‹¤ìŒ ì‚¬ëžŒí•œí…Œ ê°ì‚¬ë“œë¦½ë‹ˆë‹¤.',
'version-license-info' => "미디어위키는 ìžìœ  소프트웨어입니다. ë‹¹ì‹ ì€ ìžìœ  소프트웨어 ìž¬ë‹¨ì´ ë°œí‘œí•œ GNU ì¼ë°˜ 공중 사용 허가서 버전 2나 ê·¸ ì´í›„ ë²„ì „ì— ë”°ë¼ ì´ íŒŒì¼ì„ 재배í¬í•˜ê±°ë‚˜ 수정할 수 있습니다.
@@ -4004,12 +4089,17 @@ $5
'version-entrypoints-articlepath' => '[https://www.mediawiki.org/wiki/Manual:$wgArticlePath 문서 경로]',
'version-entrypoints-scriptpath' => '[https://www.mediawiki.org/wiki/Manual:$wgScriptPath 스í¬ë¦½íŠ¸ 경로]',
-# Special:FilePath
-'filepath' => 'íŒŒì¼ ê²½ë¡œ',
-'filepath-page' => '파ì¼:',
-'filepath-submit' => '얻기',
-'filepath-summary' => '파ì¼ì˜ 실제 URL 주소를 엽니다.
-그림 파ì¼ì¼ 경우 ì›ë³¸ í•´ìƒë„ì˜ íŒŒì¼ì´ 열립니다. 다른 ì¢…ë¥˜ì˜ íŒŒì¼ì¼ 경우 ê·¸ 파ì¼ì˜ ì¢…ë¥˜ì— ë§žëŠ” í”„ë¡œê·¸ëž¨ì´ ì‹¤í–‰ë©ë‹ˆë‹¤.',
+# Special:Redirect
+'redirect' => '파ì¼, 사용ìžë‚˜ íŒ ID별 넘겨주기',
+'redirect-legend' => '파ì¼ì´ë‚˜ 문서로 넘겨주기',
+'redirect-summary' => 'ì´ íŠ¹ìˆ˜ 문서는 파ì¼(íŒŒì¼ ì´ë¦„ì„ ì§€ì •), 문서(íŒ ID를 지정)나 ì‚¬ìš©ìž ë¬¸ì„œ(ì‚¬ìš©ìž ID를 정수로 지정)ë¡œ 넘겨ì¤ë‹ˆë‹¤.',
+'redirect-submit' => '찾기',
+'redirect-lookup' => 'ì°¾ì„ ì¢…ë¥˜:',
+'redirect-value' => 'ê°’:',
+'redirect-user' => 'ì‚¬ìš©ìž ID',
+'redirect-revision' => '문서 íŒ',
+'redirect-file' => 'íŒŒì¼ ì´ë¦„',
+'redirect-not-exists' => 'ê°’ì„ ì°¾ì„ ìˆ˜ 없습니다',
# Special:FileDuplicateSearch
'fileduplicatesearch' => 'ì¤‘ë³µëœ íŒŒì¼ ì°¾ê¸°',
@@ -4058,12 +4148,16 @@ $5
'tags' => '유효한 편집 태그',
'tag-filter' => '[[Special:Tags|태그]] 필터:',
'tag-filter-submit' => 'í•„í„°',
+'tag-list-wrapper' => '([[Special:Tags|{{PLURAL:$1|태그}}]]: $2)',
'tags-title' => '태그',
'tags-intro' => 'ì´ ë¬¸ì„œëŠ” 소프트웨어ì—ì„œ íŽ¸ì§‘ì— ëŒ€í•´ 표시하는 태그와 ê·¸ ì˜ë¯¸ë¥¼ 설명하는 목ë¡ìž…니다.',
'tags-tag' => '태그 ì´ë¦„',
'tags-display-header' => '바뀜 목ë¡ì˜ 모양',
'tags-description-header' => 'íƒœê·¸ì— ëŒ€í•œ 설명',
+'tags-active-header' => '활성하겠습니까?',
'tags-hitcount-header' => 'íƒœê·¸ëœ ë°”ë€œ',
+'tags-active-yes' => '예',
+'tags-active-no' => '아니오',
'tags-edit' => '편집',
'tags-hitcount' => '$1개 {{PLURAL:$1|바뀜}}',
@@ -4084,6 +4178,7 @@ $5
'dberr-problems' => '죄송합니다! ì´ ì‚¬ì´íŠ¸ì— 기술ì ì¸ 문제가 ë°œìƒí•˜ê³  있습니다.',
'dberr-again' => '잠시 기다리고 나서 다시 불러오세요.',
'dberr-info' => '(ë°ì´í„°ë² ì´ìŠ¤ ì„œë²„ì— ì—°ê²°í•  수 없습니다: $1)',
+'dberr-info-hidden' => '(ë°ì´í„°ë² ì´ìŠ¤ ì„œë²„ì— ì—°ê²°í•  수 없습니다)',
'dberr-usegoogle' => 'ê·¸ ë™ì•ˆ Googleì„ í†µí•´ 검색할 ìˆ˜ë„ ìžˆìŠµë‹ˆë‹¤.',
'dberr-outofdate' => 'ìˆ˜ì§‘ëœ ë‚´ìš©ì€ ì˜¤ëž˜ëœ ê²ƒì¼ ìˆ˜ë„ ìžˆìŒì„ 참고하세요.',
'dberr-cachederror' => '다ìŒì€ 요청한 ë¬¸ì„œì˜ ìºì‹œëœ 복사본ì´ë©°, ìµœì‹ ì´ ì•„ë‹ ìˆ˜ë„ ìžˆìŠµë‹ˆë‹¤.',
@@ -4099,6 +4194,9 @@ $5
'htmlform-submit' => '저장',
'htmlform-reset' => 'ë°”ë€œì„ ë˜ëŒë¦¬ê¸°',
'htmlform-selectorother-other' => '기타',
+'htmlform-no' => '아니오',
+'htmlform-yes' => '예',
+'htmlform-chosen-placeholder' => 'ì„ íƒí•˜ì„¸ìš”',
# SQLite database support
'sqlite-has-fts' => '$1 (본문 전체 찾기)',
@@ -4216,4 +4314,19 @@ $5
# Image rotation
'rotate-comment' => 'ê·¸ë¦¼ì„ ì‹œê³„ 방향으로 $1{{PLURAL:$1|ë„}}ë¡œ 회전함',
+# Limit report
+'limitreport-title' => '파서 프로파ì¼ë§ ë°ì´í„°:',
+'limitreport-cputime' => 'CPU 시간 사용',
+'limitreport-cputime-value' => '$1{{PLURAL:$1|ì´ˆ}}',
+'limitreport-walltime' => '실제 시간 사용',
+'limitreport-walltime-value' => '$1{{PLURAL:$1|ì´ˆ}}',
+'limitreport-ppvisitednodes' => '전처리기가 방문한 노드 수',
+'limitreport-ppgeneratednodes' => '전처리기가 ìƒì„±í•œ 노드 수',
+'limitreport-postexpandincludesize' => '전개한 ë’¤ í¬í•¨ í¬ê¸°',
+'limitreport-postexpandincludesize-value' => '$1/$2 {{PLURAL:$2|ë°”ì´íŠ¸}}',
+'limitreport-templateargumentsize' => 'í‹€ ì¸ìˆ˜ í¬ê¸°',
+'limitreport-templateargumentsize-value' => '$1/$2 {{PLURAL:$2|ë°”ì´íŠ¸}}',
+'limitreport-expansiondepth' => '최대 ì „ê°œ 깊ì´',
+'limitreport-expensivefunctioncount' => '부하 ë†’ì€ íŒŒì„œ 함수 수',
+
);
diff --git a/languages/messages/MessagesKoi.php b/languages/messages/MessagesKoi.php
index 4b61931c..ab8c0d51 100644
--- a/languages/messages/MessagesKoi.php
+++ b/languages/messages/MessagesKoi.php
@@ -145,7 +145,7 @@ $messages = array(
'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).
+# 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).
'aboutsite' => '{{SITENAME}} йылiÑÑŒ',
'aboutpage' => 'Project:ÑÑ‹ йылiÑÑŒ',
'copyright' => 'Ð‘Ñ‹Ð´Ã¶Ñ ÑÑ‚iйö позьö копируйтны $1 Ñьöртi.',
@@ -155,7 +155,6 @@ $messages = array(
'disclaimers' => 'Мийö ÑöÑтöмöÑÑŒ йöз одзын',
'disclaimerpage' => 'Project:Мийö ÑöÑтöмöÑÑŒ йöз одзын',
'edithelp' => 'УджкериÑÑŒ понда отÑöт',
-'edithelppage' => 'Help:УджкериÑÑŒ понда отÑöт',
'helppage' => 'Help:ОтÑöт',
'mainpage' => 'Пондöтчан лиÑтбок',
'mainpage-description' => 'Пондöтчан лиÑтбок',
@@ -737,7 +736,7 @@ $messages = array(
* gpslongitude
* gpsaltitude',
-# EXIF tags
+# Exif tags
'exif-imagewidth' => 'ПаÑьта',
'exif-imagelength' => 'Вылына',
diff --git a/languages/messages/MessagesKrc.php b/languages/messages/MessagesKrc.php
index da54bf13..b886dce4 100644
--- a/languages/messages/MessagesKrc.php
+++ b/languages/messages/MessagesKrc.php
@@ -44,21 +44,65 @@ $specialPageAliases = array(
'Allmessages' => array( 'СиÑтеманы_билдириулери' ),
'Allpages' => array( 'Бютеу_бетле' ),
'Blankpage' => array( 'Бош_бет' ),
- 'Block' => array( 'Блокла' ),
- 'Blockme' => array( 'Мени_блокла' ),
+ 'Block' => array( 'Блок_ÑÑ‚' ),
+ 'Blockme' => array( 'Мени_блок_ÑÑ‚' ),
'Booksources' => array( 'Китабланы_къайнакълары' ),
'BrokenRedirects' => array( 'Джыртылгъан_редиректле' ),
'Categories' => array( 'КатегориÑла' ),
- 'ChangeEmail' => array( 'E-mail_ауушдур' ),
- 'ChangePassword' => array( 'Пароль_ауушдур' ),
+ 'ChangeEmail' => array( 'E-mail’ни_ауушдур' ),
+ 'ChangePassword' => array( 'Паролну_ауушдур' ),
'ComparePages' => array( 'Бетлени_тенглешдириу' ),
- 'Confirmemail' => array( 'E-mail_тюзлюгюн_бегит' ),
+ 'Confirmemail' => array( 'E-mail’ни_тюзлюгюн_бегит' ),
'Contributions' => array( 'Къошум' ),
- 'CreateAccount' => array( 'Тергеу_джазыуну_къура', 'Къошулуучуну_къура', 'ЗарегиÑтрироватьÑÑ' ),
+ 'CreateAccount' => array( 'Тергеу_джазыуну_къура', 'Къошулуучуну_къура', 'РегиÑтрациÑ_ÑÑ‚' ),
'Deadendpages' => array( 'Чыкъмазча_бетле' ),
'DeletedContributions' => array( 'Кетерилген_къошум' ),
'Disambiguations' => array( 'Кёб_магъаналы' ),
'DoubleRedirects' => array( 'Экили_редирект' ),
+ 'EditWatchlist' => array( 'Кёздеги_тизмени_тюрлендир' ),
+ 'Emailuser' => array( 'Къошулуучугъа_джазма', 'Джазма_ий' ),
+ 'Export' => array( 'ЭкÑпорт', 'Къотарыу' ),
+ 'FileDuplicateSearch' => array( 'Файлланы_дубликатларын_излеу' ),
+ 'Filepath' => array( 'Файлгъа_джол' ),
+ 'Import' => array( 'Импорт' ),
+ 'BlockList' => array( 'Блок_Ñтиулени_тизмеÑи', 'Блок_Ñтиуле' ),
+ 'LinkSearch' => array( 'Джибериуле_излеу' ),
+ 'Listadmins' => array( 'ÐдминиÑтраторланы_тизмеÑи' ),
+ 'Listbots' => array( 'Ботланы_тизмеÑи' ),
+ 'Listfiles' => array( 'Файлланы_тизмеÑи', 'Суратланы_тизмеÑи' ),
+ 'Listgrouprights' => array( 'Къошулуучу_къауумланы_хакълары', 'Къауумланы_хакъларыны_тизмеÑи' ),
+ 'Listredirects' => array( 'Редиректлени_тизмеÑи' ),
+ 'Listusers' => array( 'Къошулуучуланы_тизмеÑи' ),
+ 'Lockdb' => array( 'Билгиле_базаны_блок_ÑÑ‚' ),
+ 'Log' => array( 'Журналла', 'Журнал' ),
+ 'Lonelypages' => array( 'ИзолÑциÑ_Ñтилген_бетле' ),
+ 'Longpages' => array( 'Узун_бетле' ),
+ 'MergeHistory' => array( 'Тарихлени_бирикдириу' ),
+ 'MIMEsearch' => array( 'MIME’ге_кёре_излеу' ),
+ 'Mostimages' => array( 'Эм_кёб_хайырланнган_файлла' ),
+ 'Movepage' => array( 'Бетни_атын_тюрлендириу', 'Ðтны_тюрлендириу', 'Ðтны_тюрлендир' ),
+ 'Mycontributions' => array( 'Мени_къошумум' ),
+ 'Mypage' => array( 'Мени_бетим' ),
+ 'Mytalk' => array( 'Мени_Ñюзюуюм' ),
+ 'Myuploads' => array( 'Мени_джюклегенлерим' ),
+ 'Newimages' => array( 'Джангы_файлла' ),
+ 'Newpages' => array( 'Джангы_бетле' ),
+ 'PasswordReset' => array( 'Паролну_ийиу' ),
+ 'PermanentLink' => array( 'Дайым_джибериу' ),
+ 'Popularpages' => array( 'ПопулÑÑ€_бетле' ),
+ 'Preferences' => array( 'Джарашдырыула' ),
+ 'Protectedpages' => array( 'Джакъланнган_бетле' ),
+ 'Protectedtitles' => array( 'Джакъланнган_атла' ),
+ 'Randompage' => array( 'ЭÑде_болмагъан_бет', 'ЭÑде_болмагъан' ),
+ 'Recentchanges' => array( 'ÐÑ…Ñ‹Ñ€_тюрлениуле' ),
+ 'Recentchangeslinked' => array( 'Байламлы_тюрлениуле' ),
+ 'Revisiondelete' => array( 'Кетерилген_тюрлениуле' ),
+ 'Search' => array( 'Излеу' ),
+ 'Shortpages' => array( 'КъыÑха_бетле' ),
+ 'Specialpages' => array( 'Энчи_бетле' ),
+ 'Statistics' => array( 'СтатиÑтика' ),
+ 'Tags' => array( 'Белгиле' ),
+ 'Unblock' => array( 'Блокну_алыу' ),
);
$magicWords = array(
@@ -98,9 +142,6 @@ $messages = array(
'tog-shownumberswatching' => 'Бетни, кёзде тургъан тизмелерине къошханланы Ñанын кёргюз',
'tog-oldsig' => 'БуÑагъатдагъы къол Ñалыннган:',
'tog-fancysig' => 'Къол Ñалыуну Ñнчи вики-текÑти (автомат джибериуÑюз)',
-'tog-externaleditor' => 'Тынгылау бла тыш редакторну хайырландырыу (къуру уÑталагъа, компьютерни Ñнчи джарашдырылыуу керекди; [//www.mediawiki.org/wiki/Manual:External_editors толуракъ])',
-'tog-externaldiff' => 'ВерÑиÑланы тенглешдириучу тыш программа хайырландырыу (къуру уÑталагъа, компьютерни Ñнчи джарашдырылыуу керекди; [//www.mediawiki.org/wiki/Manual:External_editors толуракъ])',
-'tog-showjumplinks' => '«Бар» болушлукъ джибериуню джандыр',
'tog-uselivepreview' => 'Терк ал къарауну хайырландыр (JavaScript, ÑкÑпериментал халда)',
'tog-forceeditsummary' => 'Тюрлендириуню ачыкълау тизгини бош къалÑа, билдир',
'tog-watchlisthideown' => 'Кёзюмде тургъан бетден мени тюрлендириулерими джашыр',
@@ -113,6 +154,7 @@ $messages = array(
'tog-diffonly' => 'ВерÑÐ¸Ñ Ñ‚ÐµÐ½Ð³Ð»ÐµÑˆÐ´Ð¸Ñ€Ð¸ÑƒÐ½ÑŽ тюбю бла бетни ичиндегиÑин кёргюзме',
'tog-showhiddencats' => 'Джашыртын категориÑланы кёргюз',
'tog-norollbackdiff' => 'Къайтарыудан Ñора верÑиÑланы башхалыкъларын кёргюзме',
+'tog-useeditwarning' => 'Тюрлендириулени Ñакълатмай редакторлау бетден кетген Ñагъатымда билдир',
'underline-always' => 'Хаманда',
'underline-never' => 'Бир заманда да',
@@ -176,6 +218,18 @@ $messages = array(
'oct' => 'окт',
'nov' => 'ноÑ',
'dec' => 'дек',
+'january-date' => '$1 Ñнварь',
+'february-date' => '$1 февраль',
+'march-date' => '$1 март',
+'april-date' => '$1 апрель',
+'may-date' => '$1 май',
+'june-date' => '$1 июнь',
+'july-date' => '$1 июль',
+'august-date' => '$1 авгуÑÑ‚',
+'september-date' => '$1 ÑентÑбрь',
+'october-date' => '$1 октÑбрь',
+'november-date' => '$1 ноÑбрь',
+'december-date' => '$1 декабрь',
# Categories related messages
'pagecategories' => '{{PLURAL:$1|КатегориÑ|КатегориÑла}}',
@@ -300,7 +354,7 @@ $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).
+# 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).
'aboutsite' => '{{SITENAME}} Ñайтны ÑŽÑюнден',
'aboutpage' => 'Project:Суратлау',
'copyright' => 'ИчиндегиÑи, $1 лицензиÑгъа кёре бериледи (башха белгиленмеген ÑÑе).',
@@ -310,7 +364,6 @@ $1',
'disclaimers' => 'Джууаблылыкъны унамау',
'disclaimerpage' => 'Project:Джууаблылыкъны унамау',
'edithelp' => 'Тюрлендириуню ÑŽÑюнден болушлукъ',
-'edithelppage' => 'Help:Тюрлендириу',
'helppage' => 'Help:Болушлукъ',
'mainpage' => 'Баш бет',
'mainpage-description' => 'Баш бет',
@@ -387,17 +440,6 @@ $1',
# General errors
'error' => 'Халат',
'databaseerror' => 'Ð˜Ð½Ñ„Ð¾Ñ€Ð¼Ð°Ñ†Ð¸Ñ Ð±Ð°Ð·Ð°Ð´Ð° халат',
-'dberrortext' => 'Ð˜Ð½Ñ„Ð¾Ñ€Ð¼Ð°Ñ†Ð¸Ñ Ð±Ð°Ð·Ð°Ð³ÑŠÐ° джиберилген Ñорууда ÑинтакÑÐ¸Ñ Ñ…Ð°Ð»Ð°Ñ‚ табылды.
-Программада халатны ачыкъларгъа да боллукъду ол.
-Ð˜Ð½Ñ„Ð¾Ñ€Ð¼Ð°Ñ†Ð¸Ñ Ð±Ð°Ð·Ð°Ð³ÑŠÐ° ахыр Ñоруу:
-<blockquote><code>$1</code></blockquote>
-«<code>$2</code>» функциÑÑындан болгъанды.
-База «<samp>$3: $4</samp>» халатны къайтарды.',
-'dberrortextcl' => 'Ð˜Ð½Ñ„Ð¾Ñ€Ð¼Ð°Ñ†Ð¸Ñ Ð±Ð°Ð·Ð°Ð³ÑŠÐ° джиберилген Ñорууда ÑинтакÑÐ¸Ñ Ñ…Ð°Ð»Ð°Ñ‚ табылды.
-Ð˜Ð½Ñ„Ð¾Ñ€Ð¼Ð°Ñ†Ð¸Ñ Ð±Ð°Ð·Ð°Ð³ÑŠÐ° ахыр Ñоруу:
-«$1»
-«$2» функциÑÑындан болгъанды.
-База «$3: $4» халатны къайтарды.',
'laggedslavemode' => 'Ð­Ñ Ð±Ñ‘Ð»ÑŽÐ³ÑŽÐ·! Бу бетге ахыр джангыртыула болмазгъа боллукъдула.',
'readonly' => 'Ð˜Ð½Ñ„Ð¾Ñ€Ð¼Ð°Ñ†Ð¸Ñ Ð±Ð°Ð·Ð° джабыкъды',
'enterlockreason' => 'Блок Ñтилиуню чурумун Ñм заманын белгилегиз.',
@@ -449,7 +491,6 @@ $1',
'protectedinterface' => 'Бу бетде программаны Ð¸Ð½Ñ‚ÐµÑ€Ñ„ÐµÐ¹Ñ Ð±Ð¸Ð»Ð´Ð¸Ñ€Ð¸ÑƒÑŽ барды.
Бютеу викиледе да бу билдириуню кёчюрмеÑин къошар неда тюрлендирир ючюн MediaWiki-ни локализациÑÑыны Ñайты [//translatewiki.net/ translatewiki.net]-ни хайырландырыгъыз.',
'editinginterface' => "'''Ð­Ñ Ð±Ñ‘Ð»:''' Сен ÑиÑтеманы Ð¸Ð½Ñ‚ÐµÑ€Ñ„ÐµÐ¹Ñ Ð±ÐµÑ‚Ð¸Ð½ тюрлендире тураÑа. Бу, викини башха къошулуучуларына да тиерик затды. Кёчюрюр ючюн неда кёчюрмелени тюрлендирир ючюн, MediaWiki-ни Ð»Ð¾ÐºÐ°Ð»Ð¸Ð·Ð°Ñ†Ð¸Ñ Ñтиу проекти [//translatewiki.net/ translatewiki.net]-ни хайырландырыгъыз.",
-'sqlhidden' => '(SQL Ñоруу джашырылыбды)',
'cascadeprotected' => 'Бу бет тюрлениуледен джакъланыбды, ол каÑкадлы джакълау къабыл Ñтилиннген {{PLURAL:$1|бетге|бетлеге}} киргени ючюндю:
$2',
'namespaceprotected' => '«$1» ат аламда бетлени тюрлендирирге Ñркинлигигиз джокъду.',
@@ -480,10 +521,18 @@ $2',
'welcomecreation-msg' => 'Сизни тергеу джазыуугъуз (аккаунтугъуз) къуралды.
{{SITENAME}} Ñайтда [[Special:Preferences|джарашдырыуларыгъызны]] тюрлендирирге унутмагъыз.',
'yourname' => 'Къошулуучуну аты',
+'userlogin-yourname' => 'Тергеу джазыуну аты',
+'userlogin-yourname-ph' => 'Тергеу джазыуунгу атын джаз',
'yourpassword' => 'Паролюгъуз:',
+'userlogin-yourpassword' => 'Пароль',
+'userlogin-yourpassword-ph' => 'Паролунгу джаз',
+'createacct-yourpassword-ph' => 'Пароль джаз',
'yourpasswordagain' => 'Паролну джангыдан джаз:',
+'createacct-yourpasswordagain' => 'Паролну бегит',
+'createacct-yourpasswordagain-ph' => 'Паролну Ñнтда бир кере джаз',
'remembermypassword' => 'Бу компьютерде мени тергеў джазыўуму унутма (Ñм кёб $1 {{PLURAL:$1|кюн|кюн}})',
-'securelogin-stick-https' => 'Чыкъгъандан Ñора да HTTPS бла байламлы къой',
+'userlogin-remembermypassword' => 'СиÑтемада туруу',
+'userlogin-signwithsecure' => 'Джакъланнган байлам',
'yourdomainname' => 'Сизни доменигиз:',
'password-change-forbidden' => 'Бу викиде паролугъузну тюрлендиреллик тюлÑюз.',
'externaldberror' => 'Тыш Ð¸Ð½Ñ„Ð¾Ñ€Ð¼Ð°Ñ†Ð¸Ñ Ð±Ð°Ð·Ð°Ð½Ñ‹ болушлугъу бла аутентификациÑ, халатлы болду, неда тыш аккаунтугъузну тюрлендирирге хакъларагъыз джетмейди.',
@@ -495,18 +544,38 @@ $2',
'logout' => 'Чыгъыу',
'userlogout' => 'Чыгъыу',
'notloggedin' => 'ÐÐ²Ñ‚Ð¾Ñ€Ð¸Ð·Ð°Ñ†Ð¸Ñ Ñ‘Ñ‚Ð¼ÐµÐ³ÐµÐ½Ñиз',
+'userlogin-noaccount' => 'Ðккаунтунг джокъмуду?',
+'userlogin-joinproject' => '{{SITENAME}} Ñайтха къошул',
'nologin' => 'Тергеу джазыуугъуз (аккаунтугъуз) джокъмуду? $1.',
'nologinlink' => 'Тергеу джазыу (аккаунт) къурагъыз',
'createaccount' => 'Джангы къошулуучуну региÑÑ‚Ñ€Ð°Ñ†Ð¸Ñ ÑÑ‚',
'gotaccount' => 'Тергеу джазыуугъуз (аккаунтугъуз) Ñнди бармыды? $1.',
'gotaccountlink' => 'Кириу',
'userlogin-resetlink' => 'Кирир ючюн билгилеригизни унутхан ÑтгенмиÑиз?',
+'userlogin-resetpassword-link' => 'Паролну джибериу',
+'helplogin-url' => 'Help:Кириу',
+'userlogin-helplink' => '[[{{MediaWiki:helplogin-url}}|СиÑтемагъа кириуде болушлукъ]]',
+'createacct-join' => 'Билгилеринги тюбюрекде джаз.',
+'createacct-emailrequired' => 'Электрон почтаны адреÑи',
+'createacct-emailoptional' => 'Электрон почтаны адреÑи (амалÑыз тюлдю)',
+'createacct-email-ph' => 'Электрон почта адреÑигизни джазыгъыз',
'createaccountmail' => 'ЭÑде болмагъанлай Ð³ÐµÐ½ÐµÑ€Ð°Ñ†Ð¸Ñ Ñтилген болджаллы паролну хайырландыр Ñм тюбюрекде берилген Ñлектрон почта адреÑге ий:',
+'createacct-realname' => 'Керти атыгъыз (ажымÑыз керек тюлдю)',
'createaccountreason' => 'Чурум:',
+'createacct-reason' => 'Чурум',
+'createacct-reason-ph' => 'Башха тергеу джазыуну нек къурауÑыз',
+'createacct-captcha' => 'КъоркъууÑузлукъну тинтиу',
+'createacct-imgcaptcha-ph' => 'Башыракъда кёрюннген текÑтни джаз',
+'createacct-submit' => 'Тергеу джазыуну къура',
+'createacct-benefit-heading' => '{{SITENAME}} Ñизнича адамла бла къуралгъанды.',
+'createacct-benefit-body1' => '{{PLURAL:$1|тюрлениу}}',
+'createacct-benefit-body2' => '{{PLURAL:$1|бет}}',
+'createacct-benefit-body3' => 'арт заманда {{PLURAL:$1|къошум Ñтген}}',
'badretype' => 'Джазгъан паролларыгъыз бир-бирине келишмейдиле.',
'userexists' => 'Джазылгъан ат хайырландырылады.
Башха ат Ñайлагъыз.',
'loginerror' => 'Кириу хата',
+'createacct-error' => 'Тергеу джазыу къурауда халат',
'createaccounterror' => 'Быллай тергеу джазыу (аккаунт) къураргъа болмайды: $1',
'nocookiesnew' => 'Къошлуучу региÑтрациÑны ётгенди, алай кирмегенди. {{SITENAME}} къошулуучуланы таныр ючюн «cookies»-ни хайырландырады. Сиз «cookies»-ни Ñркин ÑтмегенÑиз. «Cookies»-ни Ñркин Ñтигиза да, андан Ñора джангы атыгъыз Ñм паролюгъуз бла киригиз.',
'nocookieslogin' => '{{SITENAME}} къошулуучуланы таныр ючюн «cookies»-ни хаырландырады. Сиз аны джукълатыб тураÑыз. «Cookies»-ни Ñркин Ñтигизда джангыдан кёрюгюз.',
@@ -576,7 +645,7 @@ $2',
'newpassword' => 'Джангы пароль:',
'retypenew' => 'Джангы паролну къайтарыгъыз:',
'resetpass_submit' => 'Паролну бегит Ñм кир',
-'resetpass_success' => 'Сизни паролюгъуз тыйыншлы тюрлендирилди! СиÑтемагъа кириу барады…',
+'changepassword-success' => 'Сизни паролюгъуз тыйыншлы тюрлендирилди! СиÑтемагъа кириу барады…',
'resetpass_forbidden' => 'Пароль тюрленирге болмайды',
'resetpass-no-info' => 'Бу бетни кёрюр ючюн Ñиз ÑиÑтемагъа тергеу джазыуугъуз (аккаунтугъуз) бла кирирге керекÑиз.',
'resetpass-submit-loggedin' => 'Паролну тюрлендир',
@@ -588,10 +657,11 @@ $2',
# Special:PasswordReset
'passwordreset' => 'Паролну джибериу',
-'passwordreset-text' => 'Паролугъуз джиберилир ючюн бу форманы толтуругъуз.',
+'passwordreset-text-one' => 'Паролугъуз джиберилир ючюн бу форманы толтуругъуз.',
+'passwordreset-text-many' => '{{PLURAL:$1|Пароль ийилир ючюн билгилени бир бёлюмюн джазыгъыз.}}',
'passwordreset-legend' => 'Паролну атыу',
'passwordreset-disabled' => 'Бу викиде паролла атыу амал джукъланыбды.',
-'passwordreset-pretext' => '{{PLURAL:$1||Тюбюрекде берилген билгиледен бирин джазыгъыз}}',
+'passwordreset-emaildisabled' => 'Бу викиде Ñлектрон почтаны функциÑлары джукъланыбдыла.',
'passwordreset-username' => 'Къошулуучуну аты:',
'passwordreset-domain' => 'Домен:',
'passwordreset-capture' => 'Джазылгъан билдириуню ÑÑебине къара?',
@@ -602,7 +672,7 @@ $2',
Болджаллы пароль: $2',
'passwordreset-emailsent' => 'Пароль бла e-mail ийилди.',
'passwordreset-emailsent-capture' => 'Ийилген пароль ÑÑгертиу e-mail тюбюрекде берилибди.',
-'passwordreset-emailerror-capture' => 'Ийилген ÑÑгертиу e-mail тюбюрекде берилибди, аны ашырыуу джетишимÑиз болду, чурум: $1',
+'passwordreset-emailerror-capture' => 'Пароль ÑÑгертиу e-mail Ð³ÐµÐ½ÐµÑ€Ð°Ñ†Ð¸Ñ Ñтилди (тюбюрекде берилибди), аны {{GENDER:$2|къошулуучугъа}} ашырыу джетишимÑиз болду, чурум: $1',
# Special:ChangeEmail
'changeemail' => 'Электрон почтаны адреÑин ауушдур',
@@ -801,12 +871,15 @@ $2',
Кетерилген болур.',
'edit-conflict' => 'Тюрлендириулени конфликти.',
'edit-no-change' => 'ТекÑтде тюрлениуле ÑÑленмегени ючюн, Ñизни тюрлендириуюгюз къабыл Ñтилмеди.',
+'postedit-confirmation' => 'Тюрлендириуюгюз Ñакъланды.',
'edit-already-exists' => 'Джангы бет къураргъа боллукъ тюлдю.
ÐлайÑызда барды бу атлы бет.',
'defaultmessagetext' => 'Тынгылау бла текÑÑ‚',
'content-failed-to-parse' => '$2 контент $1 типге келишмейди: $3',
'invalid-content-data' => 'Джаламагъан билгиле',
'content-not-allowed-here' => '[[$2]] бетни ичинде "$1" контент джарамайды',
+'editwarning-warning' => 'Башха бетге кёчÑегиз, Ñтген тюрлениулеригиз Ñ‚Ð°Ñ Ð±Ð¾Ð»ÑƒÑ€Ð³ÑŠÐ° боллукъдула.
+СиÑтемада региÑтрациÑны ётген ÑÑегиз, бу билдириуню джарашдырыуларыгъызны «Тюрлендириу» деген бёлюмюнде джукълатыргъа боллукъÑуз.',
# Content models
'content-model-wikitext' => 'вики-текÑÑ‚',
@@ -1048,7 +1121,6 @@ $1",
'searchmenu-legend' => 'Излеуню джарашдырыулары',
'searchmenu-exists' => "'''Бу викиде «[[:$1]]» бет барды'''",
'searchmenu-new' => "'''Бу вики-проектде «[[:$1]]» бетни къура!'''",
-'searchhelp-url' => 'Help:Ичиндегиле',
'searchmenu-prefix' => '[[Special:PrefixIndex/$1|Бу Ð¿Ñ€ÐµÑ„Ð¸ÐºÑ Ð±Ð»Ð° бетни кёргюз]]',
'searchprofile-articles' => 'Баш бетле',
'searchprofile-project' => 'Болушлукъ Ñм проект бетле',
@@ -1089,15 +1161,7 @@ $1",
'powersearch-togglenone' => 'Бири да',
'search-external' => 'Тыш излеу',
'searchdisabled' => '{{SITENAME}} Ñайтда излеу талай заманнга тохтатылгъанды. БуÑагъатда Google бла хайырланыб {{SITENAME}} ичинде излеу Ñтерге боллукъÑуз. Излеу Ñайтлада индекÑлери бир кеÑек ÑÑки болургъа боллугъун унутмагъыз.',
-
-# Quickbar
-'qbsettings' => 'Джюрютюуню панели',
-'qbsettings-none' => 'Кёргюзтме',
-'qbsettings-fixedleft' => 'Солу къатды',
-'qbsettings-fixedright' => 'Онгу къатды',
-'qbsettings-floatingleft' => 'Солгъа джюзеди',
-'qbsettings-floatingright' => 'Оннга джюзеди',
-'qbsettings-directionality' => 'Тилигизни джазмаÑыны онг/Ñол таба джазылгъанына кёре бегитилибди',
+'search-error' => 'Излеуде халат чыкъды: $1',
# Preferences page
'preferences' => 'Джарашдырыула',
@@ -1131,7 +1195,6 @@ $1",
'resetprefs' => 'Тюрлениулени ызына къайтар',
'restoreprefs' => 'Тынгылау бла джарашдырыуланы ызына къайтар',
'prefs-editing' => 'Тюрлендириу',
-'prefs-edit-boxsize' => 'Тюрлениу терезени ёлчеми',
'rows' => 'Тизгинле:',
'columns' => 'Колонкала:',
'searchresultshead' => 'Излеу',
@@ -1142,9 +1205,6 @@ $1",
'recentchangesdays-max' => '(макÑимум $1 {{PLURAL:$1|кюн|кюн}})',
'recentchangescount' => 'Тынгылау бла кёргюзюллюк тюрлениулени Ñаны:',
'prefs-help-recentchangescount' => 'Бу, ахыр тюрлениулени, бетни тарихлерин Ñмда журналланы ичине къошады.',
-'prefs-help-watchlist-token' => 'Бу аланны джашыртын ачхыч бла толтуруу, кёзде тургъан тизмегиз ючюн бир RSS-транÑлÑÑ†Ð¸Ñ ÐºÑŠÑƒÑ€Ð°Ð¹Ð´Ñ‹.
-Бу аландагъы ачхычны билгенле кёзде тургъан тизмегизни окъургъа боллукъду, ол Ñебебден Ñырлы магъана Ñайлагъыз.
-Сакъланмагъанлай Ð³ÐµÐ½ÐµÑ€Ð°Ñ†Ð¸Ñ Ñтилген магъананы хайырландырыргъа боллукъÑуз: $1',
'savedprefs' => 'Джарашдырыуларыгъыз Ñакъландыла.',
'timezonelegend' => 'Заман бел:',
'localtime' => 'Джерли заман:',
@@ -1175,7 +1235,6 @@ $1",
'prefs-reset-intro' => 'Бу бетни джарашдырыуларыгъызны тынгылыау бла Ñалыннган джарашдырыулагъа кёчюрюрге хайырланаллыкъÑыз.
Бу ишлемни къабыл ÑÑ‚Ñегиз, ызына къайтараллыкъ тюлÑюз.',
'prefs-emailconfirm-label' => 'Электрон почтаны бегитиу:',
-'prefs-textboxsize' => 'Тюрлендириу терезени ёлчеми',
'youremail' => 'Электрон почта:',
'username' => '{{GENDER:$1|Къошулуучу ат}}:',
'uid' => '{{GENDER:$1|Къошулуучуну}} коду:',
@@ -1246,6 +1305,7 @@ $1 {{PLURAL:$1|Ñимволдан|Ñимволладан}} кеб болургъ
'userrights-changeable-col' => 'Сиз тюрлендиреллик къауумла',
'userrights-unchangeable-col' => 'Сиз тюрлендирелмезлик къауумла',
'userrights-irreversible-marker' => '$1*',
+'userrights-conflict' => 'Къошулуучу хакъланы конфликти! Тюрлендириуню джангыдан Ñакълатыб кёрюгюз.',
# Groups
'group' => 'Группа:',
@@ -1420,7 +1480,6 @@ $1 {{PLURAL:$1|Ñимволдан|Ñимволладан}} кеб болургъ
'recentchangeslinked-feed' => 'Байламлы тюрлендириуле',
'recentchangeslinked-toolbox' => 'Байламлы тюрлендириуле',
'recentchangeslinked-title' => '$1 бет бла байламлы тюрлендириуле',
-'recentchangeslinked-noresult' => 'Берилген кёзюуню ичинде белгиленнген бетге байламлы башха бетледе тюрлениуле болмагъандыла',
'recentchangeslinked-summary' => "Белгиленнген бет (неда белгиленнген категориÑгъа киргенле) джиберген бетледе джангы тюрлениулени тизмеÑи.
[[Special:Watchlist|Кёзде тургъан тизмеге]] кирген бетле '''чертилибдиле'''.",
'recentchangeslinked-page' => 'Бетни аты:',
@@ -1623,7 +1682,6 @@ CGI тамалында ишлерге Ñмда <code>img_auth</code> бла иш
'http-read-error' => 'HTTP окъууну халаты.',
'http-timed-out' => 'HTTP-Ñорууну Ñакълау заман ётдю.',
'http-curl-error' => 'Бу URL-гъа Ñорууну халаты: $1',
-'http-host-unreachable' => 'URL-ге джетелмеди',
'http-bad-status' => 'HTTP-Ñоруу ишлеген заманында проблема чыкъгъанды: $1 $2',
# Some likely curl errors. More could be added from <http://curl.haxx.se/libcurl/c/libcurl-errors.html>
@@ -1769,12 +1827,6 @@ URL-ни тюз , Ñайтны ачыкъ болгъанына ишекÑиз б
'statistics-users-active-desc' => 'ÐÑ…Ñ‹Ñ€ {{PLURAL:$1|1 кюнде|$1 кюнде}} ишлеме Ñтген къошулуучула',
'statistics-mostpopular' => 'Эм кёб къаралгъан бетле',
-'disambiguations' => 'Ðнгылам айыргъан бетлеге джибериулери болгъан бетле',
-'disambiguationspage' => 'Template:кёб магъаналылыкъ',
-'disambiguations-text' => "Келтирилген бетледе '''кёб магъаналы бетлеге''' Ñм азы бла бир джибериу барды.
-Ðны орнуна ала белгили бир ÑтатьÑгъа джибериу Ñтерге керек болурла.<br />
-[[MediaWiki:Disambiguationspage]] бетде аты Ñалыннган шаблон бар ÑÑе, ол бет кёб магъаналы бетге Ñаналады.",
-
'pageswithprop-submit' => 'Таб',
'doubleredirects' => 'Джибериу болгъан джибериуле',
@@ -2015,10 +2067,9 @@ URL-ни тюз , Ñайтны ачыкъ болгъанына ишекÑиз б
'unwatchthispage' => 'Кёзде тутууну тохтат',
'notanarticle' => 'Ð¡Ñ‚Ð°Ñ‚ÑŒÑ Ñ‚ÑŽÐ»Ð´ÑŽ',
'notvisiblerev' => 'ВерÑÐ¸Ñ ÐºÐµÑ‚ÐµÑ€Ð¸Ð»Ð³ÐµÐ½Ð´Ð¸',
-'watchnochange' => 'Къаралгъан кёзюуде, кёзде тургъан тизмеден бир бет да тюрленмегенди.',
'watchlist-details' => 'Кёзюгюзде тургъан тизмегизде, Ñюзюу бетлери Ñаналмай {{PLURAL:$1|$1 бет|$1 бет}} барды.',
-'wlheader-enotif' => '* Эл. почта бла хапар бериу джандырылыбды.',
-'wlheader-showupdated' => "* ÐÑ…Ñ‹Ñ€ кириуюгюзден Ñора бетни тюрлениулери '''къалын''' джазыу бла кёргюзюлгенди.",
+'wlheader-enotif' => 'Эл. почта бла хапар бериу джандырылыбды.',
+'wlheader-showupdated' => "ÐÑ…Ñ‹Ñ€ кириуюгюзден Ñора бетни тюрлениулери '''къалын''' джазыу бла кёргюзюлгенди.",
'watchmethod-recent' => 'кёзде тургъан бетледе Ñтилген ахыр тюрлениуле кёрюу',
'watchmethod-list' => 'кёзде тургъан бетледе Ñтилген ахыр тюрлениуле кёрюу',
'watchlistcontains' => 'Кёзюгюзде тургъан тизмегизде $1 {{PLURAL:$1|бет|бет}} барды.',
@@ -2387,12 +2438,9 @@ $1',
Ðлай а, бу $2 диапазонну кеÑеги кибик тыйылгъанды, диапазонну блокдан чыгъарыргъа боллукъÑуз.',
'ip_range_invalid' => 'ДжарауÑуз IP диапазон.',
'ip_range_toolarge' => '/$1 кёб диапазонланы блокга Ñалыргъа джарамайды.',
-'blockme' => 'Мени блокга Ñал',
'proxyblocker' => 'ПрокÑилени тыйыу',
-'proxyblocker-disabled' => 'Бу Ñ„ÑƒÐ½ÐºÑ†Ð¸Ñ Ð´Ð¶ÑƒÐºÑŠÐ»Ð°Ñ‚Ñ‹Ð»Ñ‹Ð±Ð´Ñ‹.',
'proxyblockreason' => 'IP-адреÑигиз ачыкъ прокÑи болгъаны ючюн тыйылдыгъыз.
Тилейбиз, кеÑигизни интернет-провайдеригиз бла, неда дагъан болгъан къуллукъла бла байланыб, къоркъууÑузлукъну бу проблемаÑын билдиригиз.',
-'proxyblocksuccess' => 'Тындырылды.',
'sorbsreason' => 'IP-адреÑигиз, {{SITENAME}} Ñайтда хайырланнган DNSBL-де ачыкъ прокÑи кибик Ñаналады.',
'sorbs_create_account_reason' => 'IP-адреÑигиз, translatewiki.net Ñайтда хайырланнган DNSBL-де ачыкъ прокÑи кибик Ñаналады. Тергеу джазыу къураÑллыкъ тюлÑюз.',
'cant-block-while-blocked' => 'Сиз кеÑигиз блокда заманда, башха къошулуучуланы блок Ñтеллик тюлÑюз.',
@@ -2731,13 +2779,8 @@ MediaWiki локализациÑÑына юлюш къошаргъа излей
'pageinfo-protect-cascading-yes' => 'Хоу',
# Skin names
-'skinname-standard' => 'Стандарт',
-'skinname-nostalgia' => 'ÐоÑтальгиÑ',
'skinname-cologneblue' => 'Кёльн такъылыкъ',
'skinname-monobook' => 'Моно-китаб',
-'skinname-myskin' => 'Меники',
-'skinname-chick' => 'Шик',
-'skinname-simple' => 'Бош',
'skinname-modern' => 'БуÑагъатдагъы',
'skinname-vector' => 'Вектор',
@@ -2810,11 +2853,25 @@ $1',
'minutes' => '{{PLURAL:$1|$1 минут|$1 минут}}',
'hours' => '{{PLURAL:$1|$1 Ñагъат|$1 Ñагъат}}',
'days' => '{{PLURAL:$1|$1 кюн|$1 кюн}}',
+'weeks' => '{{PLURAL:$1|ыйыкъ}}',
'months' => '{{PLURAL:$1|ай}}',
'years' => '{{PLURAL:$1|джыл}}',
'ago' => '$1 алгъа',
'just-now' => 'тюз буÑагъатда',
+# Human-readable timestamps
+'hours-ago' => '$1 {{PLURAL:$1|Ñагъат}} мындан алгъа',
+'minutes-ago' => '$1 {{PLURAL:$1|минут}} мындан алгъа',
+'seconds-ago' => '$1 {{PLURAL:$1|Ñекунд}} мындан алгъа',
+'monday-at' => '$1 баш кюн',
+'tuesday-at' => '$1 гюрге кюн',
+'wednesday-at' => '$1 Ð±Ð°Ñ€Ð°Ñ ÐºÑŽÐ½',
+'thursday-at' => '$1 орта кюн',
+'friday-at' => '$1 барым кюн',
+'saturday-at' => '$1 шабат кюн',
+'sunday-at' => '$1 ыйых кюн',
+'yesterday-at' => '$1 тюнене',
+
# Bad image list
'bad_image_list' => 'Формат былай болургъа керекди:
@@ -2842,7 +2899,7 @@ $1',
* gpslongitude
* gpsaltitude',
-# EXIF tags
+# Exif tags
'exif-imagewidth' => 'Кенглик',
'exif-imagelength' => 'Мийиклик',
'exif-bitspersample' => 'БоÑуну теренлиги',
@@ -3004,7 +3061,7 @@ $1',
'exif-organisationinimage' => 'Суратланнган организациÑ',
'exif-personinimage' => 'Суратланнган адам',
-# EXIF attributes
+# Exif attributes
'exif-compression-1' => 'КъыÑдырылмагъан',
'exif-compression-3' => 'CCITT Group 3, Ñ„Ð°ÐºÑ ÐºÐ¾Ð´Ð»Ð°Ñƒ',
'exif-compression-4' => 'CCITT Group 4, Ñ„Ð°ÐºÑ ÐºÐ¾Ð´Ð»Ð°Ñƒ',
@@ -3443,7 +3500,6 @@ $5
'version-other' => 'Башха',
'version-mediahandlers' => 'МедиÑны джарашдырыучула',
'version-hooks' => 'Тутуучула',
-'version-extension-functions' => 'Кенгертиулени функциÑлары',
'version-parser-extensiontags' => 'СинтиакÑÐ¸Ñ Ð°Ð½Ð°Ð»Ð¸Ð·Ð°Ñ‚Ð¾Ñ€Ð½Ñƒ кенгертиулерин теглери',
'version-parser-function-hooks' => 'СинтакÑÐ¸Ñ Ð°Ð½Ð°Ð»Ð¸Ð·Ð°Ñ‚Ð¾Ñ€Ð½Ñƒ функциÑларын тутуучула',
'version-hook-name' => 'Тутуучуну аты',
@@ -3464,13 +3520,6 @@ MediaWiki хайырлы боллукъду деген умут бла джайÑ
'version-entrypoints-header-entrypoint' => 'Кириу нохта',
'version-entrypoints-header-url' => 'URL',
-# Special:FilePath
-'filepath' => 'Файлгъа джол',
-'filepath-page' => 'Файл:',
-'filepath-submit' => 'Кёч',
-'filepath-summary' => 'Бу къуллукъчу бет файл ючюн толу джолну береди.
-Суратла толу резолюциÑлары бла кёргюзюледиле, башха файл типле алагъа джараулу программала бла ачыладыла.',
-
# Special:FileDuplicateSearch
'fileduplicatesearch' => 'Дубликат файлланы изле',
'fileduplicatesearch-summary' => 'Ð¥Ñш-кодлары бла дубликат файланны изле.',
@@ -3557,6 +3606,9 @@ MediaWiki хайырлы боллукъду деген умут бла джайÑ
'htmlform-submit' => 'Джибер',
'htmlform-reset' => 'Тюрлендириулени ызына Ñал',
'htmlform-selectorother-other' => 'Башха',
+'htmlform-no' => 'Огъай',
+'htmlform-yes' => 'Хоу',
+'htmlform-chosen-placeholder' => 'Вариантны Ñайлагъыз',
# SQLite database support
'sqlite-has-fts' => '$1 толу текÑÑ‚ излеуню хайырландыргъан',
diff --git a/languages/messages/MessagesKrj.php b/languages/messages/MessagesKrj.php
index ab7c9c64..19eea208 100644
--- a/languages/messages/MessagesKrj.php
+++ b/languages/messages/MessagesKrj.php
@@ -112,6 +112,7 @@ $messages = array(
'qbbrowse' => 'Bilid',
'qbedit' => 'Iislan',
'qbpageoptions' => 'Dya nga Pahina',
+'qbpageinfo' => 'Konteksto',
'qbspecialpages' => 'Manga espesyal nga pahina',
'faq' => 'FAQ',
'faqpage' => 'Project:FAQ',
@@ -134,7 +135,7 @@ $messages = array(
'delete' => 'Para',
'deletethispage' => 'Paraun ang dya nga Pahina',
'protect' => 'Amlig',
-'protect_change' => 'iislan',
+'protect_change' => 'islan ang proteksyon',
'protectthispage' => 'Amligan ang dya nga pahina',
'unprotect' => 'huksun ang proteksyon',
'unprotectthispage' => 'Huksun ang proteksyon sa dya nga pahina',
@@ -187,7 +188,7 @@ Lantawa sa [[Special:Version|version kang page]].',
# Short words for each namespace, by default used in the namespace tab in monobook
'nstab-main' => 'Pahina',
'nstab-media' => 'Pahina kang Midya',
-'nstab-special' => 'Espesyal nga pahina',
+'nstab-special' => 'Espesyal',
'nstab-project' => 'Pahina kang Proyekto',
'nstab-image' => 'Inayap',
'nstab-mediawiki' => 'Mensahe',
@@ -210,7 +211,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 ''browser'' (kang maximum nga $1 {{PLURAL:$1|ka adlaw|ka mga adlaw}})",
+'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''",
@@ -255,7 +256,7 @@ Lantawa sa [[Special:Version|version kang page]].',
# Special:ListUsers
'listusers-submit' => 'Ipakita',
-# Email user
+# E-mail user
'emailmessage' => 'Mensahe',
# Delete
@@ -267,7 +268,7 @@ Lantawa sa [[Special:Version|version kang page]].',
# Undelete
'undelete-search-submit' => 'Sagap',
-'sp-contributions-talk' => 'wakal',
+'sp-contributions-talk' => 'Wakal',
'sp-contributions-submit' => 'Sagap',
# What links here
diff --git a/languages/messages/MessagesKs.php b/languages/messages/MessagesKs.php
index ea28ef6a..cfd3f02e 100644
--- a/languages/messages/MessagesKs.php
+++ b/languages/messages/MessagesKs.php
@@ -1,5 +1,5 @@
<?php
-/** Kashmiri (कॉशà¥à¤° / کٲشÙر)
+/** Kashmiri (कॉशà¥à¤° - کٲشÙر)
*
* See MessagesQqq.php for message documentation incl. usage of parameters
* To improve a translation please visit http://translatewiki.net
@@ -10,50 +10,3 @@
*/
$fallback = 'ks-arab';
-
-$messages = array(
-# Dates
-'monday' => 'Ú˜Ùنٛدٕروار',
-'february' => 'Ùرؤری',
-'april' => 'اپریٖل',
-'may_long' => 'مٔی',
-'june' => 'جوٗن',
-'august' => 'اَگست',
-'september' => 'سیٚپٹَمبَر',
-'november' => 'نَوَمبَر',
-'december' => 'ڈیٚسَمبَر',
-
-'about' => 'Ù…ÙتعلÙÙ‚',
-
-'help' => 'مَدَت',
-'search' => 'ژھارÙÙ†',
-'searchbutton' => 'ژھارÙÙ†',
-'history_short' => 'توٲریٖخ',
-'talkpagelinktext' => 'بَحَژ',
-'talk' => 'بَحَژ',
-'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}}',
-'mainpage' => 'گَرٕ',
-
-# Short words for each namespace, by default used in the namespace tab in monobook
-'nstab-main' => 'صَÙÛÙ•',
-'nstab-category' => 'زٲژ',
-
-# Edit pages
-'summary' => 'Ø®ÙلاسÛÙ•:',
-
-# Recent changes
-'recentchanges' => 'نَو٠تَبَدیٖلیٖ',
-
-# Upload
-'filedesc' => 'Ø®ÙلاسÛÙ•',
-
-'sp-contributions-talk' => 'بَحَژ',
-'sp-contributions-submit' => 'ژھارÙÙ†',
-
-# Namespace 8 related
-'allmessagesname' => 'ناو',
-
-);
diff --git a/languages/messages/MessagesKs_arab.php b/languages/messages/MessagesKs_arab.php
index 3241a78b..e41f8983 100644
--- a/languages/messages/MessagesKs_arab.php
+++ b/languages/messages/MessagesKs_arab.php
@@ -7,9 +7,7 @@
* @ingroup Language
* @file
*
- * @author Rachitrali
* @author Rk_kaul (on ks.wikipedia.org)
- * @author VibhasKS
*/
$rtl = true;
@@ -55,19 +53,14 @@ $separatorTransformTable = array(
$messages = array(
# Dates
'monday' => 'Ú˜Ùنٛدٕروار',
-'january' => 'جنوری',
'february' => 'Ùرؤری',
-'march' => 'مارچ',
'april' => 'اپریٖل',
'may_long' => 'مٔی',
'june' => 'جوٗن',
-'july' => 'جولائی',
'august' => 'اَگست',
'september' => 'سیٚپٹَمبَر',
-'october' => 'اکتوبر',
'november' => 'نَوَمبَر',
'december' => 'ڈیٚسَمبَر',
-'jan' => 'جنوری',
'about' => 'Ù…ÙتعلÙÙ‚',
@@ -88,7 +81,6 @@ $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).
'aboutsite' => 'Ù…ÙتعلÙÙ‚ {{SITENAME}}',
'mainpage' => 'گَرٕ',
-'mainpage-description' => 'اÛÙ… صَÙÛÙ•',
# Short words for each namespace, by default used in the namespace tab in monobook
'nstab-main' => 'صَÙÛÙ•',
diff --git a/languages/messages/MessagesKs_deva.php b/languages/messages/MessagesKs_deva.php
index c4ae7fcb..0ec0de7a 100644
--- a/languages/messages/MessagesKs_deva.php
+++ b/languages/messages/MessagesKs_deva.php
@@ -8,7 +8,6 @@
* @file
*
* @author Rk_kaul (on ks.wikipedia.org)
- * @author VibhasKS
*/
$namespaceNames = array(
@@ -46,12 +45,6 @@ $digitTransformTable = array(
$messages = array(
'help' => 'मदद',
-# 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' => 'आहम सफ़ा',
-
-'editsectionhint' => '$1 शाबह तर तैयब दीउ',
-'red-link-title' => '$1 (सफ़ा ना आसà¥à¤¨)',
-
# Recent changes
'recentchanges' => 'नवि तबदीली',
diff --git a/languages/messages/MessagesKsh.php b/languages/messages/MessagesKsh.php
index e7e812ec..b9a9ac78 100644
--- a/languages/messages/MessagesKsh.php
+++ b/languages/messages/MessagesKsh.php
@@ -10,6 +10,7 @@
* @author Caesius noh en Idee vum Manes
* @author Geitost
* @author Matma Rex
+ * @author Nemo bis
* @author Purodha
* @author Reedy
* @author Rentenirer
@@ -242,9 +243,6 @@ $messages = array(
'tog-shownumberswatching' => 'Zeich de Aanzahl Metmaacher, die op die Sigg am oppasse sin',
'tog-oldsig' => 'Esu&nbsp;süht&nbsp;Ding „Ongerschreff“&nbsp;us:',
'tog-fancysig' => 'Donn de „Ungerschreff“ als Wiki-Tex behandelle (ohne enne automattesche Lengk)',
-'tog-externaleditor' => 'Nemm jedes Mol en extern Editor-Projramm (Doför bruchs de extra Enstellunge op Dingem Kompjutor. Dat es jet för Fachlück. Doh kanns De [//www.mediawiki.org/wiki/Manual:External_editors mieh drövver lässe])',
-'tog-externaldiff' => 'Nemm jedes Mol en extern Diff-Projramm (Doför bruchs de extra Enstellunge op Dingem Kompjutor. Dat es jet för Fachlück. Doh kanns De [//www.mediawiki.org/wiki/Manual:External_editors mieh drövver lässe])',
-'tog-showjumplinks' => '„Jangk-noh“-Links usjevve, die bei em „Zojang ohne Barrikad“ helfe dun',
'tog-uselivepreview' => 'Vör-Aansesch övver AJAX zeije (noch zem Ußprobeere)',
'tog-forceeditsummary' => 'Froch noh, wann en däm Feld „Koot zosammejefass, Quell“ beim Avspeichere nix dren steiht',
'tog-watchlisthideown' => 'Dun ming eije Änderunge <strong>nit</strong> en minger Oppassliss aanzeije',
@@ -258,6 +256,8 @@ $messages = array(
'tog-showhiddencats' => 'Donn de verstoche Saachjroppe aanzeije',
'tog-noconvertlink' => 'Don de Tittele nit ömwandelle',
'tog-norollbackdiff' => 'Donn noh „{{int:Rollback}}“ de Ungerscheide nit aanzeije',
+'tog-useeditwarning' => 'Donn mesch warne, wann esch vun en Sigg fott jonn, ih dat esch all ming Änderunge avjeschpeischert hann.',
+'tog-prefershttps' => 'Jangk emmer övver en verschlößelte Verbendong bei Enlogge',
'underline-always' => 'jo, ongershtriishe',
'underline-never' => 'nä',
@@ -321,6 +321,18 @@ $messages = array(
'oct' => 'Okt',
'nov' => 'Nov',
'dec' => 'Dez',
+'january-date' => '$1. Jannewaa',
+'february-date' => '$1. Fääbroaa',
+'march-date' => '$1. Määz',
+'april-date' => '$1. Aprell',
+'may-date' => '$1. Mai',
+'june-date' => '$1. Juuni',
+'july-date' => '$1. Juuli',
+'august-date' => '$1. Ojoßß',
+'september-date' => '$1. Säptämber',
+'october-date' => '$1. Oktoober',
+'november-date' => '$1. Novämber',
+'december-date' => '$1. Dezämber',
# Categories related messages
'pagecategories' => '{{PLURAL:$1|Saachjrupp|Saachjruppe}}',
@@ -402,6 +414,7 @@ $messages = array(
'create-this-page' => 'Neu aanläje',
'delete' => 'Fottschmieße',
'deletethispage' => 'De Sigg fottschmieße',
+'undeletethispage' => 'Wider zeröck holle',
'undelete_short' => '{{PLURAL:$1|ein Änderung|$1 Änderunge}} zeröckholle',
'viewdeleted_short' => '{{PLURAL:$1|eijn fottjeschmesse Änderung|$1 fottjeschmesse Änderunge|keij fottjeschmesse Änderunge}} beloore',
'protect' => 'Schötze',
@@ -445,7 +458,7 @@ $1',
'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).
+# 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).
'aboutsite' => 'Övver {{GRAMMAR:Akkusativ|{{ucfirst:{{SITENAME}}}}}}',
'aboutpage' => 'Project:Övver {{GRAMMAR:Akkusativ|{{ucfirst:{{SITENAME}}}}}}',
'copyright' => 'Dä Enhald steiht unger de $1.',
@@ -455,7 +468,6 @@ $1',
'disclaimers' => 'Henwies',
'disclaimerpage' => 'Project:Impressum',
'edithelp' => 'Hölp för et Bearbeide',
-'edithelppage' => 'Help:Hölp',
'helppage' => 'Help:Hölp',
'mainpage' => 'Haupsigg',
'mainpage-description' => 'Haupsigg',
@@ -484,7 +496,6 @@ $1',
'newmessagesdifflinkplural' => '{{PLURAL:$1|läzde Änderong|läzde Änderonge|kein Änderonge}}',
'youhavenewmessagesmulti' => 'Do häs neu Nachrichte op $1',
'editsection' => 'Ändere',
-'editsection-brackets' => '[$1]',
'editold' => 'Heh die Version ändere',
'viewsourceold' => 'Wikitex zeije',
'editlink' => 'ändere',
@@ -534,18 +545,12 @@ Et künnt sesch och öm ene Fäähler en dä Sofware fum Wiki handelle.',
# General errors
'error' => 'Fähler',
'databaseerror' => 'Fähler en de Daatebank',
-'dberrortext' => 'Enne Fähler es opjefalle en dä Süntax vun ennem Befähl för de Daatebangk.
-Dat künnd_enne Fähler em Wikki-Projamm sin.
-De läzde Befähl för de Daatebangk eß jewääse:
-<blockquote><code>$1</code></blockquote>
-uß dä Fongxjohn: „<code>$2</code>“.
-De Daatebangk mälldt dä Fähler: „<code>$3: $4</code>“.',
-'dberrortextcl' => 'En dä Syntax vun enem Befähl för de Daatebank es
-ene Fähler es opjefalle.
-Dä letzte Befähl för de Daatebank es jewäse:
-<blockquote><code>$1</code></blockquote>
-un kohm us däm Projramm singe Funktion: „<code>$2</code>“.
-De Datebank meld dä Fähler: „<code>$3: $4</code>“.',
+'databaseerror-text' => 'Ene Daatebangkfähler es opjetrodde.
+Dat künnt vun enem Fähler em Projramm kumme.',
+'databaseerror-textcl' => 'Ene Fähler es bei der Daatebangk opjetrodde.',
+'databaseerror-query' => 'Opdraach: $1',
+'databaseerror-function' => 'Fonxjuhn: $1',
+'databaseerror-error' => 'Fähler: $1',
'laggedslavemode' => '<strong>Opjepass:</strong> Künnt sin, dat heh nit dä neuste Stand vun dä Sigg aanjezeich weed.',
'readonly' => 'De Daatebank es jesperrt',
'enterlockreason' => 'Jevv aan, woröm un för wie lang dat de Daatebank jesperrt wääde soll',
@@ -613,12 +618,15 @@ Wann De weße wells, wat dä Täx heh bedügg, do häß De en Schangß, dat De o
<code lang="en">//www.mediawiki.org/wiki/Manual:Interface/{{BASEPAGENAMEE}}?setlang=ksh</code>
jet doh drövver fenge kanns, udder op
<code lang="en">//translatewiki.net/wiki/MediaWiki:{{BASEPAGENAMEE}}/qqq?setlang=ksh</code>',
-'sqlhidden' => "(Dä SQL_Befähl du'mer nit zeije)",
'cascadeprotected' => 'Die Sigg es jeschöz, un mer kann se nit ändere. Se es en en Schotz-Kaskad enjebonge, zosamme met dä {{PLURAL:$1|Sigg|Sigge}}:
$2',
'namespaceprotected' => 'Do darfs Sigge em Appachtemang „$1“ nit ändere.',
'customcssprotected' => 'Do darfs di CSS-Sigg heh nit ändere. Se jehööt enem andere Metmacher un es e Stöck funn dämm sing eije Enstellunge.',
'customjsprotected' => 'Do darfs di JavaSkep-Sigg heh nit ändere. Se jehööt enem andere Metmacher un es e Stöck funn dämm sing eije Enstellunge.',
+'mycustomcssprotected' => 'Do häs nit dat Rääsch, he di Sigg med enem <i lang="en" xml:lang="en">CSS</i> ze verändere.',
+'mycustomjsprotected' => 'Do häs nit dat Rääsch, he di Sigg med enem JavaSkrep ze verändere.',
+'myprivateinfoprotected' => 'Do häs nit dat Rääsch, Ding päsöönlesche Aanjaabe ze verändere.',
+'mypreferencesprotected' => 'Do häs nit dat Rääsch, Ding Enschtällonge ze verändere.',
'ns-specialprotected' => '{{int:nstab-special}}e künne mer nit ändere.',
'titleprotected' => "Dä Tittel för en Sigg eß verbodde, fum [[User:$1]], un dr Jrond wohr: ''„$2“''",
'filereadonlyerror' => 'Mer künne di Dattei „$1“ nit ändere, weil dä Dateijebeshtand „$2“ bloß för ze Lässe doh es.
@@ -642,10 +650,19 @@ Künnt sin, dat De de ein udder andere Sigg noch wigger aanjezeich kriß, wie wa
'welcomecreation-msg' => 'Dinge Zohjang es enjerescht.
Wann De wells, künnts De Ding [[Special:Preferences|Enschtällonge aanpaße]].',
'yourname' => 'Metmaacher_Naame:',
+'userlogin-yourname' => 'Der Metmaacher_Name',
+'userlogin-yourname-ph' => 'Donn Dinge Metmaachername aanjevve',
+'createacct-another-username-ph' => 'Jivv ene Metmaacher-Naame aan',
'yourpassword' => 'Paßwoot:',
+'userlogin-yourpassword' => 'Et Paßwoot',
+'userlogin-yourpassword-ph' => 'Donn Ding Paßwood enjävve',
+'createacct-yourpassword-ph' => 'Jivv_e Paßwood_en!',
'yourpasswordagain' => 'Noch ens dat Passwood',
+'createacct-yourpasswordagain' => 'Noch ens dat Paßwoot',
+'createacct-yourpasswordagain-ph' => 'Jivv_et Paßwoot norrens en!',
'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.',
+'userlogin-remembermypassword' => 'Op Duur enlogge',
+'userlogin-signwithsecure' => 'Verschlößeld enlogge',
'yourdomainname' => 'Ding Domain',
'password-change-forbidden' => 'Do kanns en heh däm Wiki kein Paßwööter ändere.',
'externaldberror' => 'Do wor ene Fähler en de externe Daatebank, oder Do darfs Ding extern Daate nit ändere. Dat Aanmelde jingk jedenfalls donevve.',
@@ -657,18 +674,40 @@ Wann De wells, künnts De Ding [[Special:Preferences|Enschtällonge aanpaße]].'
'logout' => 'Ußlogge',
'userlogout' => 'Ußlogge',
'notloggedin' => 'Nit enjelogg',
+'userlogin-noaccount' => 'Do häß noch keine Zohjang?',
+'userlogin-joinproject' => 'Aanmälde zom Metmaache!',
'nologin' => 'Wann de dich noch nit aanjemeldt häs, dann dun dich $1.',
'nologinlink' => 'neu aanmelde',
'createaccount' => 'Aanmelde als ene neue Metmaacher',
'gotaccount' => "Do bes ald aanjemeldt {{GRAMMAR:en|{{SITENAME}}}}? Dann jangk nohm '''$1'''.",
'gotaccountlink' => 'Enlogge',
'userlogin-resetlink' => 'Häß De Ding Daate för et Enlogge verjäße?',
+'userlogin-resetpassword-link' => 'Paßwoot verjäße?',
+'helplogin-url' => 'Help:Övver et Enlogge',
+'userlogin-helplink' => '[[{{MediaWiki:helplogin-url}}|Hölp bem Enlogge]]',
+'createacct-join' => 'Jiv Ding Daate en:',
+'createacct-emailrequired' => 'Ding Addräß för de <i lang="en">e-mail</i>',
+'createacct-emailoptional' => 'Ding Addräß för de <i lang="en">e-mail</i>, kann fott bliive',
+'createacct-email-ph' => 'Jiv Ding Addräß för de <i lang="en">e-mail</i> en!',
+'createacct-another-email-ph' => 'Jivv en Addräß för de <i lang="en" xml:lang="en">e-mail</i> aan',
'createaccountmail' => 'Scheck mer en <i lang="en">e-mail</i> met enem neu ußjedaachte Paßwood op Zick',
+'createacct-realname' => 'Dinge börjerlesche Naame, kam_mer och fott lohße',
'createaccountreason' => 'Jrond:',
+'createacct-reason' => 'Der Jrond udder Aanlaß',
+'createacct-reason-ph' => 'Woröm deihs De noch ene Zohjang aanlääje?',
+'createacct-captcha' => 'Zor Sescherheit',
+'createacct-imgcaptcha-ph' => 'Jiv dä Täx en, dä De heh drövver sühs!',
+'createacct-submit' => 'Lohß Jonn!',
+'createacct-another-submit' => 'Donn jäz enne zohsäjlejje Zohjang aanlääje',
+'createacct-benefit-heading' => '{{ucfirst:{{GRAMMAR:Nominative|{{ucfirst:{{SITENAME}}}}}}}} weed vun Minsche wi Dir jemaat.',
+'createacct-benefit-body1' => '{{PLURAL:$1|Änderong|Änderonge|Änderonge }}',
+'createacct-benefit-body2' => '{{PLURAL:$1|Sigg|Sigge|Sigge }}',
+'createacct-benefit-body3' => '{{PLURAL:$1|aktive Metmaacher}}',
'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 jidd et ald.
Do muss Der ene andere Name usdenke.',
'loginerror' => 'Fähler beim Enlogge',
+'createacct-error' => 'Fähler beim Zohjang-Aanlääje',
'createaccounterror' => 'Kunnt keine Zohjang för der Metmaacher-Name „$1“ aanlääje.',
'nocookiesnew' => 'Dinge neue Metmaacher Name es enjerich, ävver dat automatisch Enlogge wor dann nix.
Schad.
@@ -762,7 +801,7 @@ Wann Dat all böömesch Dörver för Desch sin, da fojeß heh di
e-mail eijfach. Wann De en däm Wikki nit metmaache wells, och.',
'usernamehasherror' => 'En Metmaacher iere Name darf dat Zeijche „#“ nit dren vürkumme.',
'login-throttled' => 'Do häs zo öff, zo vill, un zo lang en de letzde Zick probeet, ennzelogge.
-Waat e Wielsche, ih dat De et widder versöhks.',
+Waad e Wielsche ävver $1, ih dat De et wider versöhks.',
'login-abort-generic' => 'Dat Enlogge hät nit jeflup.',
'loginlanguagelabel' => 'Sproch: $1',
'suspicious-userlogout' => "Do bes '''nit''' ußjelogg.
@@ -782,7 +821,7 @@ Et süht us, wi wann ene kappodde Brauser udder <i lang=\"en\">proxy</i>ẞööv
'newpassword' => 'Et neue Passwood:',
'retypenew' => 'Noch ens dat neue Passwood:',
'resetpass_submit' => 'E neu Zweschepasswood övvermeddele un aanmellde',
-'resetpass_success' => 'Passwood jeändert. Jetz küdd_et Enlogge&nbsp;…',
+'changepassword-success' => 'Passwood jeändert. Jetz küdd_et Enlogge&nbsp;…',
'resetpass_forbidden' => 'E Passwoot kann nit jeändert wääde.',
'resetpass-no-info' => 'Do mööts ad enjelogg sin, öm tiräk op di Sigg jonn ze dörve',
'resetpass-submit-loggedin' => 'Passwood tuusche',
@@ -795,10 +834,9 @@ Do häs Der enzwesche e neu Zweschepaßwood jehollt.',
# Special:PasswordReset
'passwordreset' => 'Et Paßwoot zeröck säze',
-'passwordreset-text' => 'Donn dat Fommulaa heh ußfölle, öm e neu Paßwoot faßzelääje.',
'passwordreset-legend' => 'Et Paßwoot zeröck säze',
'passwordreset-disabled' => 'Et Paßwoot zeröck ze säze es heh em Wiki afjeschalldt.',
-'passwordreset-pretext' => '{{PLURAL:$1||Jiff ein vun dä Saache heh dronger enn|}}',
+'passwordreset-emaildisabled' => 'Heh dat Wiki määt nix met <i lang="en">e-mail</i>!',
'passwordreset-username' => 'Metmaacher Name:',
'passwordreset-domain' => 'Domähn:',
'passwordreset-capture' => 'Wells De di <i lang="en">e-mail</i> beloore?',
@@ -833,7 +871,7 @@ moß De jäz jaa nix donn, un kanns Ding Paßwoot wigger bruche.',
Eijmohl-Paßwoot: $2',
'passwordreset-emailsent' => 'En <i lang="en">e-mail</i> met Aanjaabe zom neue Paßwoot för der Zohjang heh es verscheck.',
'passwordreset-emailsent-capture' => 'En <i lang="en">e-mail</i> met Aanjaabe zom neue Paßwoot för der Zohjang heh es verscheck woode. Heh dronger kanns De se lässe.',
-'passwordreset-emailerror-capture' => 'En <i lang="en">e-mail</i> sullt verscheck wääde. Heh dronger kanns De se lässe. Dat Verschecke hät ävver nit jeflup, wääje: $1.',
+'passwordreset-emailerror-capture' => 'En <i lang="en">e-mail</i> met Aanjaabe zom neue Paßwoot för der Zohjang heh sullt verscheck wääde, ävver dat Verschecke aan {{GENDER:$2|dä|dat|dä Metmaacher|de|dat}} $2 hät nit jeflup: $1',
# Special:ChangeEmail
'changeemail' => 'Donn Ding Address för de <i lang="en">e-mail</i> ändere',
@@ -1096,6 +1134,8 @@ Ene Jrond weße mer nit.',
'content-failed-to-parse' => 'Et wohr nit müjjelesch, dä Enhalld met däm <i lang="en">MIME-Typ</i> $2 för en Dattei met $1 dren ze verwooschte: $3.',
'invalid-content-data' => 'Di Daate en dä Sigg sen onjöltesch.',
'content-not-allowed-here' => 'Ene Enhalld vun dä Zoot „$1“ es op dä Sigg „[[$2]]“ nit zohjelohße.',
+'editwarning-warning' => 'Wann de vun hee dä Sigg fott jeihß, doh künnte all Ding Änderunge aan dä Sigg verschött jonn.
+Do kanns heh di Warnung affschallde, wann de aanjemelldt un enjelogg bes, dann kriß de se nieh mieh wider. Jangk doför en dä Affschnett „{{int:prefs-editing}}“ en Dinge Enshtellunge.',
# Content models
'content-model-wikitext' => 'Wikitäx',
@@ -1335,7 +1375,6 @@ Mieh doh drövver fengk mer em [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAG
'searchmenu-legend' => 'Enschtällonge för et Söhke',
'searchmenu-exists' => "*Sigg '''[[$1]]'''",
'searchmenu-new' => "'''Donn de Sigg „[[:$1|$1]]“ hee em Wiki aanlääje'''",
-'searchhelp-url' => 'Help:Hölp',
'searchmenu-prefix' => '[[Special:PrefixIndex/$1|Zeich all Sigge, di met däm Tex aanfange]]',
'searchprofile-articles' => 'Sigge vum Enhalt',
'searchprofile-project' => 'Hülp- ov Projäk-Sigge',
@@ -1388,15 +1427,7 @@ Sigge us {{GRAMMAR:Dative|{{ucfirst:{{SITENAME}}}}}} finge.
Et es nit jesaht,
dat dänne ehr Daate topaktoell sin,
ävver et es bäßer wi jaa_nix.',
-
-# Quickbar
-'qbsettings' => '„Flöcke Links“',
-'qbsettings-none' => 'Fottlooße, dat well ich nit sinn',
-'qbsettings-fixedleft' => 'Am linke Rand fass aanjepapp',
-'qbsettings-fixedright' => 'Am rächte Rand fass aanjepapp',
-'qbsettings-floatingleft' => 'Am linke Rand am Schwevve',
-'qbsettings-floatingright' => 'Am rächte Rand am Schwevve',
-'qbsettings-directionality' => 'Faß, passend för wi eröm de Schreff för Ding Schprooch jeiht',
+'search-error' => 'An error has occurred while searching: $1',
# Preferences page
'preferences' => 'ming Enstellunge',
@@ -1430,7 +1461,6 @@ dat dänne ehr Daate topaktoell sin,
'resetprefs' => 'Zeröck setze',
'restoreprefs' => 'Donn en alle Afschnedde alles op der Schtandatt retuur schtälle',
'prefs-editing' => 'Beim Bearbeide',
-'prefs-edit-boxsize' => 'Dat Feld zöm Schrieve sull han:',
'rows' => 'Reihe:',
'columns' => 'Spalte:',
'searchresultshead' => 'Beim Söhke',
@@ -1441,9 +1471,6 @@ dat dänne ehr Daate topaktoell sin,
'recentchangesdays-max' => '(Nit mieh wie {{PLURAL:$1|eine Daach|$1 Dääsh|keine Daach}})',
'recentchangescount' => 'Aanzahl Änderunge en de Leß, als Shtandad:',
'prefs-help-recentchangescount' => 'Dat ömfaß de „{{int:recentchanges}}“, de Versione uß de Fojangeheit, un de Logbööcher.',
-'prefs-help-watchlist-token' => 'Wann dat Feld met enem jeheime Schlößel ußjeföllt es, määt et Wiki ene <i lang="en">RSS</i>-Enspeisung en et Näz för Ding Oppaßleß op.
-Wä dä Schlößel weiß, kann ding Oppaßleß lesse. Donn alsu ene seschere un jeheime Wäät doför nämme.
-Ene zohfällesch ußjewörfelte Schlößel, dää De nämme künnß, wöhr: <code>$1</code>',
'savedprefs' => 'Ding Enstellunge sin jetz jesechert.',
'timezonelegend' => 'Ziggzohn:',
'localtime' => 'De Zigg op Dingem Kompjuter:',
@@ -1473,7 +1500,6 @@ Ene zohfällesch ußjewörfelte Schlößel, dää De nämme künnß, wöhr: <cod
'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',
'youremail' => 'E-Mail *',
'username' => '{{GENDER:$1|Metmaacher|MetmaacherÄ—nne|Metmaacher|MetmaacherÄ—nne|Metmaacher}} Name:',
'uid' => '{{GENDER:$1|Metmaacher|MetmaacherÄ—nne|Metmaacher|MetmaacherÄ—nne|Metmaacher}} Nommer:',
@@ -1504,6 +1530,7 @@ Ene zohfällesch ußjewörfelte Schlößel, dää De nämme künnß, wöhr: <cod
'prefs-dateformat' => 'Dem Dattum sing Fommaat',
'prefs-timeoffset' => 'Enshtellunge för de Uhrzigge',
'prefs-advancedediting' => 'Extra Ußwahle',
+'prefs-preview' => 'de Vör-Aansesch',
'prefs-advancedrc' => 'Extra Ußwahle',
'prefs-advancedrendering' => 'Extra Ußwahle',
'prefs-advancedsearchoptions' => 'Extra Ußwahle',
@@ -1539,6 +1566,7 @@ Ene zohfällesch ußjewörfelte Schlößel, dää De nämme künnß, wöhr: <cod
'userrights-changeable-col' => '{{PLURAL:$1:Di Jropp|Jroppe|kein Jropp doh}}, di De ändere kanns',
'userrights-unchangeable-col' => '{{PLURAL:$1:Di Jropp|Jroppe|kein Jropp doh}}, di De nit ändere kanns',
'userrights-irreversible-marker' => '$1 *',
+'userrights-conflict' => 'Ene Andere hät di Rääschde ald verändert. Loor, wad_eruß kohm un versöhg_et norr-ens, wann nüüdesch.',
# Groups
'group' => 'Jrupp:',
@@ -1604,7 +1632,7 @@ Ene zohfällesch ußjewörfelte Schlößel, dää De nämme künnß, wöhr: <cod
'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-editprotected' => 'Sigge ändere, di met „{{int:protect-level-sysop}}“ jezöz sin',
'right-editinterface' => 'Sigge met de Texte ändere, die et Wiki kallt',
'right-editusercssjs' => 'Anderlücks CSS- un JS-Dateie ändere',
'right-editusercss' => 'Anderlücks CSS-Dateie ändere',
@@ -1670,9 +1698,11 @@ Ene zohfällesch ußjewörfelte Schlößel, dää De nämme künnß, wöhr: <cod
'action-userrights-interwiki' => 'dä Metmaacher fun ander Wikis ier Rääschte ze ändere',
'action-siteadmin' => 'de Datebank ze sperre udder widder freizejävve',
'action-sendemail' => '<i lang="en">e-mails</i> ze verschecke',
+'action-editmyprivateinfo' => 'Ding päsöönlesche Aanjaabe ze ändere',
# Recent changes
'nchanges' => '{{PLURAL:$1|Ein Änderong|$1 Änderonge|Kein Änderong}}',
+'enhancedrc-history' => 'Väsjohne',
'recentchanges' => 'Neuste Änderonge',
'recentchanges-legend' => 'Enstellunge',
'recentchanges-summary' => 'Op dä Sigg hee sin de neuste Änderunge am Wiki opjeliss.',
@@ -1713,7 +1743,6 @@ Ene zohfällesch ußjewörfelte Schlößel, dää De nämme künnß, wöhr: <cod
'recentchangeslinked-feed' => 'Änderunge aan Sigge, wo hee drop jelink es',
'recentchangeslinked-toolbox' => 'Änderunge aan Sigge, wo hee drop jelink es',
'recentchangeslinked-title' => 'Änderunge aan Sigge, die vun „$1“ uß verlink sin',
-'recentchangeslinked-noresult' => 'Et woodte kein Änderunge aan verlinkte Sigge jemaat en dä Zick.',
'recentchangeslinked-summary' => "Heh di {{int:nstab-special}} hät en Leß met Änderunge aan Sigge, di vun dä aanjejovve Sigg uß verlink sin.
Bei Saachjruppe sen et de Sigge en dä Saachjrupp.
Sigge uß Dinge [[Special:Watchlist|Opaßleß]] sin '''fett''' jeschrevve.",
@@ -1726,7 +1755,7 @@ Sigge uß Dinge [[Special:Watchlist|Opaßleß]] sin '''fett''' jeschrevve.",
'reuploaddesc' => 'Zeröck noh de Sigg zem Huhlade.',
'upload-tryagain' => 'Donn ene veränderte Täx övver di Dattei loßßschecke',
'uploadnologin' => 'Nit enjelogg',
-'uploadnologintext' => 'Do mööts ald [[Special:UserLogin|enjelogg]] sin, öm Daate huhzelade.',
+'uploadnologintext' => 'Do mööts ald $1 sin, öm Daate huhzelade.',
'upload_directory_missing' => "<b>Doof:</b>
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.',
@@ -1974,7 +2003,6 @@ Dröm es <code lang="en">img_auth.php</code> zor Sisherheit heh affjeschalldt.',
'http-read-error' => 'Et Lässe beim <code lang="en">HTTP</code> es donävve jeange.',
'http-timed-out' => 'Di <code lang="en">HTTP</code>-Aanforderung hät zoh lang jebruch.',
'http-curl-error' => 'Ene Fähler es opjetrodde beim Holle vun däm <code lang="en">URL</code>: $1',
-'http-host-unreachable' => 'Mer sen nit noh dämm <i lang="en">URL</i> dorschjekumme.',
'http-bad-status' => 'Bei dä <code lang="en">HTTP</code>-Aanforderung es e Problem opjetrodde: Fähler&nbsp;$1 — $2',
# Some likely curl errors. More could be added from <http://curl.haxx.se/libcurl/c/libcurl-errors.html>
@@ -2005,6 +2033,10 @@ Velleich probees De et och zo en Zick, wo winnijer loss es.',
'listfiles_size' => 'Byte',
'listfiles_description' => 'Wat en dä Datei dren schtisch',
'listfiles_count' => 'Väsjohne',
+'listfiles-show-all' => 'Ällder Väsjohne vun de Belder med aanzeije',
+'listfiles-latestversion' => 'De neuste Väsjohn',
+'listfiles-latestversion-yes' => 'Joh',
+'listfiles-latestversion-no' => 'Nää',
# File description page
'file-anchor-link' => 'Dattei',
@@ -2108,6 +2140,11 @@ wääde, un luur Der der iehr ander Links aan!',
'randompage' => 'Zofällije Sigg',
'randompage-nopages' => 'En {{PLURAL:$2|dem Appachtemang|dä Appachtemangs|keinem Appachtemang}} „$1“ sin ja kein Sigge dren.',
+# Random page in category
+'randomincategory' => 'En zohfälleje Sigg us ener Saachjropp',
+'randomincategory-nopages' => 'et sinn er kein Sigge en dä Saachjropp [[:Category:$1|$1]] dren.',
+'randomincategory-selectcategory-submit' => 'Lohß Jonn!',
+
# Random redirect
'randomredirect' => 'Zofällije Ömleitung',
'randomredirect-nopages' => 'En däm Appachtemang „$1“ sin ja kein Ömleidunge dren.',
@@ -2134,13 +2171,6 @@ All de Sigge em Wiki, och Klaafsigge, Ömleitunge, un esu jet',
'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.',
'statistics-mostpopular' => 'De miets affjeroofe Sigge',
-'disambiguations' => 'Sigge met Lengks dren op „(Wat ėß dat?)“-Sigge',
-'disambiguationspage' => 'Template:Disambig',
-'disambiguations-text' => 'En dä Sigge onge sin Links dren, di op en „(Watt ėßß datt?)“-Sigg jonn.
-Esu en Links sollte eijentlesch op en Sigg jon, di tirek jemeint es.
-
-Ene Atikel weed als en „(Watt ėßß datt?)“-Sigg jezallt, wann dä en Schablohn opröhf, op di ene Lenk en dä Sigg [[MediaWiki:Disambiguationspage]] dren es.',
-
'pageswithprop' => 'Sigge med en beschtemmpte Eijeschaff',
'pageswithprop-legend' => 'Sigge med en Eijeschaff',
'pageswithprop-text' => 'Heh di Sigg zeisch Sigge, di en beschtemmpte Eijeschaf han',
@@ -2423,10 +2453,9 @@ Wann di Sigg udder ier Klaafsigg verändert weed, kütt dat af jäz heh en di Op
'unwatchthispage' => 'Nit mieh op die Sigg oppasse',
'notanarticle' => 'Keine Atikkel',
'notvisiblerev' => 'Di Version es fottjeschmesse',
-'watchnochange' => 'Keine Atikkel en Dinger Oppassliss es en dä aanjezeichte Zick verändert woode.',
'watchlist-details' => 'Do häs {{PLURAL:$1|<strong>ein</strong> Sigg|<strong>$1</strong> Sigge|<strong>kein</strong> Sigg}} en dä Oppassliss{{PLURAL:$1|, un di Klaafsigg dozo|, un de Klaafsigge dozo|}}.',
-'wlheader-enotif' => '* Et E-mail Schecke es enjeschalt.',
-'wlheader-showupdated' => '* Wann se Einer jeändert hätt, zickdäm De se et letzte Mol aanjeluurt häs, sin die Sigge <strong>extra markeet</strong>.',
+'wlheader-enotif' => 'Et <i lang="en">e-mail</i> Schecke es enjeschalt.',
+'wlheader-showupdated' => 'Wann se Einer jeändert hätt, zickdäm De se et letzte Mol aanjeluurt häs, sin die Sigge <strong>extra markeet</strong>.',
'watchmethod-recent' => 'Ben de letzte Änderunge jäje de Oppassliss am pröfe',
'watchmethod-list' => 'Ben de Oppassliss am pröfe, noh de letzte Änderung',
'watchlistcontains' => 'En dä Oppassliss {{PLURAL:$1|es ein Sigg|sinner <strong>$1</strong> Sigge|sinner <strong>kein</strong> Sigge}}.',
@@ -2671,7 +2700,7 @@ $1',
'contributions' => '{{GENDER:$1|Däm Metmaacher|Däm|Däm Metmaacher|Dä Metmaacherėn|Däm}} $1 {{GENDER:$1|singe|singe|singe|iere|singe}} Beidräch',
'contributions-title' => 'Beidräsch fum $1',
'mycontris' => 'Beidrähch',
-'contribsub2' => 'För dä Metmaacher: $1 ($2)',
+'contribsub2' => 'För {{GENDER:$3|dä|et|dä Metmaacher|de|dat}} $1: $1 ($2)',
'nocontribs' => 'Mer han kein Änderunge jefonge, en de Logböcher, die do passe däte.',
'uctop' => '(Neuste)',
'month' => 'un Moohnt:',
@@ -2831,17 +2860,15 @@ Automattesch jesperrte <i lang="en>IP</i>-Addräße sin nit heh, ävver en de [[
'ipb_blocked_as_range' => 'Dat jeit nit. De IP-Adress „$1“ es nit tirek jesperrt. Se es ävver en däm jesperrte Bereich „$2“ dren. Die Sperr kam_mer ophevve. Donoh kam_mer och kleiner Aandeile fun däm Bereich widder neu sperre. Di Adress alleins kam_mer ävver nit freijevve.',
'ip_range_invalid' => 'Dä Bereich vun IP_Adresse es nit en Oodnung.',
'ip_range_toolarge' => 'Berette övver /$1 ze sperre is nit zohjelohße, bloß kleiner.',
-'blockme' => 'Open_Proxy_Blocker',
'proxyblocker' => 'Open_Proxy_Blocker',
-'proxyblocker-disabled' => 'Di Funxjon es ußjeschalldt.',
'proxyblockreason' => 'Unger Ding IP_Adress läuf ene offe Proxy.
Dröm kanns De heh em Wiki nix maache.
Schwaad met Dingem System-Minsch udder Netzwerk-Techniker udder ISP (<i lang="en">Internet Service Provider</i>)
un verzäll dänne vun däm ärrje Risiko för de Secherheit fun dänne ehr Rääschnere!',
-'proxyblocksuccess' => 'Jedonn.',
'sorbs' => '<i lang="en">DNSBL</i>',
'sorbsreason' => 'Ding IP-Adress weed en de DNSbl als ene offe Proxy jeliss. Schwaad met Dingem System-Minsch oder Netzwerk-Techniker (ISP Internet Service Provider) drüvver, un verzäll dänne vun däm Risiko för ehr Secherheit!',
'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!',
+'xffblockreason' => 'En <i lang="en">IP-</i>Adräs en ener <code lang="en">X-Forwarded-For</i> Koppreih es jeschpächt: Et künnt de Dinge udder enem <i lang="en">proxy server</i> zweschedren sing Adräß sin. Der Jrond för et Schpärre woh orschprönglesch: $1',
'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',
@@ -3012,6 +3039,8 @@ Wenn De jenerell aan [//www.mediawiki.org/wiki/Localisation MediaWiki singe Öve
'thumbnail-more' => 'Jrößer aanzeije',
'filemissing' => 'Datei es nit do',
'thumbnail_error' => 'Ene Fähler es opjetauch beim Maache vun enem Breefmarke/Thumbnail-Beldche: „$1“',
+'thumbnail_error_remote' => 'Ene Fähler es em $1 opjevalle:
+$2',
'djvu_page_error' => 'De DjVu-Sgg es ußerhallef',
'djvu_no_xml' => 'De XML-Date för di DjVu-Datei kunnte mer nit afrofe',
'thumbnail-temp-create' => 'Mer kunnte kein Zweschedattei für Minnibeldscher aanlääje.',
@@ -3163,17 +3192,11 @@ Esu kam_mer noch en Aanmärkong en „{{int:summary}}“ maache.',
# Stylesheets
'common.css' => '/* CSS heh aan dä Stell hät Uswirkunge op all Ovverflääsche */',
-'standard.css' => '/* CSS heh aan dä Stell wirrek nur op de Ovverflääsch „Klassesch“ */',
-'nostalgia.css' => '/* CSS heh aan dä Stell wirrek nur op de Ovverflääsch „Nostaljesch“ */',
'cologneblue.css' => '/* CSS heh aan dä Stell wirrek nur op de Ovverflääsch „Kölsch Blau“ */',
'monobook.css' => '/* CSS heh aan dä Stell wirrek nur op de Ovverflääsch „Monobooch“ */',
-'myskin.css' => '/* CSS heh aan dä Stell wirrek nur op de Ovverflääsch „Ming Skin“ */',
-'chick.css' => '/* CSS heh aan dä Stell wirrek nur op de Ovverflääsch „Höhnsche“ */',
-'simple.css' => '/* CSS heh aan dä Stell wirrek nur op de Ovverflääsch „Eijfach“ */',
'modern.css' => '/* CSS heh aan dä Stell wirrek nur op de Ovverflääsch „Modern“ */',
'vector.css' => '/* CSS heh aan dä Stell wirrek nur op de Ovverflääsch „Vector“ */',
'print.css' => '/* CSS heh aan dä Stell wirrek nur op et Sigge Drökke */',
-'handheld.css' => '/* dat CSS hee wirrek sesch uß op su jeannte Handheld-Apparaate, opjebout op de Ovverflääsch uß $wgHandheldStyle */',
'noscript.css' => '/* Dat CSS heh aan dä Stell krijje nur de Metmaacher met affjeschaldt JavaSkrepp jescheck */',
'group-autoconfirmed.css' => '/* Dat CSS heh aan dä Stell krijje nur de automattesch beshtääteshte Metmacher jescheck */',
'group-bot.css' => '/* Dat CSS heh aan dä Stell krijje nur de Bot-Projrammee jescheck */',
@@ -3182,13 +3205,8 @@ Esu kam_mer noch en Aanmärkong en „{{int:summary}}“ maache.',
# Scripts
'common.js' => '/* Jedes JavaScrip hee kütt för jede Metmaacher in jede Sigg erinn */',
-'standard.js' => '/* De JavaSkrippte fun hee krijje alle Sigge met de Ovverflääsch "Klassesch" jescheck */',
-'nostalgia.js' => '/* De JavaSkrippte fun hee krijje alle Sigge met de Ovverflääsch "Nostaljesch" jescheck */',
'cologneblue.js' => '/* De JavaSkrippte fun hee krijje alle Sigge met de Ovverflääsch "Kölsch Blou" jescheck */',
'monobook.js' => '/* De JavaSkrippte fun hee krijje alle Sigge met de Ovverflääsch "Monnobooch" jescheck */',
-'myskin.js' => '/* De JavaSkrippte fun hee krijje alle Sigge met de Ovverflääsch "Ming Skin" jescheck */',
-'chick.js' => '/* De JavaSkrippte fun hee krijje alle Sigge met de Ovverflääsch "Höhnsche" jescheck */',
-'simple.js' => '/* De JavaSkrippte fun hee krijje alle Sigge met de Ovverflääsch "Eijfach" jescheck */',
'modern.js' => '/* De JavaSkrippte fun hee krijje alle Sigge met de Ovverflääsch "Modern" jescheck */',
'vector.js' => '/* De JavaSkrippte fun hee krijje alle Sigge met de Ovverflääsch "Vector" jescheck */',
'group-autoconfirmed.js' => '/* De JavaSkreppte fun hee krijje bloß de autemattesch beshtääteschte Metmaacher jescheck */',
@@ -3267,13 +3285,8 @@ Esu kam_mer noch en Aanmärkong en „{{int:summary}}“ maache.',
'pageinfo-category-files' => 'De Aanzahl Dateie',
# Skin names
-'skinname-standard' => 'Klassesch',
-'skinname-nostalgia' => 'Nostaljesch',
'skinname-cologneblue' => 'Kölsch Blau',
'skinname-monobook' => 'MonoBoch',
-'skinname-myskin' => 'Ming Skin',
-'skinname-chick' => 'Höhnche',
-'skinname-simple' => 'Eifach',
'skinname-modern' => 'Modern',
'skinname-vector' => 'Vektor',
@@ -3357,11 +3370,25 @@ $1',
'minutes' => '{{PLURAL:$1|eine Menutt|$1 Menutte|keine Menutt}}',
'hours' => '{{PLURAL:$1|ein Schtundt|$1 Schtunde|kein Schtundt}}',
'days' => '{{PLURAL:$1|einem Daach|$1 Dääsch|keinem Daach}}',
+'weeks' => '{{PLURAL:$1|ein Woch|$1 Woche|keine Woch}}',
'months' => '{{PLURAL:$1|Eine&nbsp;Monhnd|$1&nbsp;Mohnde|Keine&nbsp;Monhnd}}',
'years' => '{{PLURAL:$1|Ein&nbsp;Jonhr|$1&nbsp;Johre|Kei&nbsp;Jonhr}}',
'ago' => 'vür $1',
'just-now' => 'jraad äävens',
+# Human-readable timestamps
+'hours-ago' => 'för {{PLURAL:$1|ein Stund|$1 Stunde|keine Stund}}',
+'minutes-ago' => 'för {{PLURAL:$1|eine Menott|$1 Menotte|keine Menott}}',
+'seconds-ago' => 'för {{PLURAL:$1|eine Sekond|$1 Sekonde|keine Sekond}}',
+'monday-at' => 'Läzde Moondaach öm $1 Uhr',
+'tuesday-at' => 'Läzde Dinnsdaach öm $1 Uhr',
+'wednesday-at' => 'Läzde Medwoch öm $1 Uhr',
+'thursday-at' => 'Läzde Donnersdaach öm $1 Uhr',
+'friday-at' => 'Läzde Friidaach öm $1 Uhr',
+'saturday-at' => 'Läzde Samsdaach öm $1 Uhr',
+'sunday-at' => 'Läzde Sundaach öm $1 Uhr',
+'yesterday-at' => 'Jästere öm $1 Uhr',
+
# Bad image list
'bad_image_list' => '<strong>Fomat:</strong>
Nur Reije met ennem * am Aanfang don jet.
@@ -3388,7 +3415,7 @@ Donoh kumme, en däsellve Reih, Links op Sigge wo die Datei trotz dämm jenehm e
* gpslongitude
* gpsaltitude',
-# EXIF tags
+# Exif tags
'exif-imagewidth' => 'Breejd',
'exif-imagelength' => 'Läng',
'exif-bitspersample' => 'Bits per Färvaandeil',
@@ -3567,7 +3594,7 @@ Donoh kumme, en däsellve Reih, Links op Sigge wo die Datei trotz dämm jenehm e
'exif-originalimageheight' => 'De Hühde vum Beld, ih dat es zohjeschnedde wood, en Pixelle',
'exif-originalimagewidth' => 'De Breede vum Beld, ih dat es zohjeschnedde wood, en Pixelle',
-# EXIF attributes
+# Exif attributes
'exif-compression-1' => 'Oohne Kompressjuhn',
'exif-compression-2' => 'Noh de <i lang="en">CCITT</i> ier Jrop 3 kodeet mem eindimänsjonalle aanjepaßte Verfahre noh_m <i lang="en">Huffman</i> singe „Läng vum Rötsch“',
'exif-compression-3' => 'Noh de <i lang="en">CCITT</i> ier Jrop 3 als Fax kodeet',
@@ -3913,7 +3940,6 @@ Wells Do jetz met en neu Version die Sigg widder neu aanläje?',
# Separators for various lists, etc.
'semicolon-separator' => ';',
-'autocomment-prefix' => '-',
'word-separator' => '&#32;',
'ellipsis' => '&nbsp;…',
'parentheses' => '($1)',
@@ -4043,7 +4069,6 @@ Dä Shtanndat-Zoot-Schlößel „$1“ övverschriif dä älldere Zoot-Schlöße
'version-other' => 'Söns',
'version-mediahandlers' => 'Medije-Handler',
'version-hooks' => 'Schnettstelle oder Hooke',
-'version-extension-functions' => 'Funktione för Zosätz',
'version-parser-extensiontags' => 'Erjänzunge zom Parser',
'version-parser-function-hooks' => 'Parserfunktione',
'version-hook-name' => 'De Schnettstelle ier Name',
@@ -4052,6 +4077,7 @@ Dä Shtanndat-Zoot-Schlößel „$1“ övverschriif dä älldere Zoot-Schlöße
'version-license' => 'Lėzänz',
'version-poweredby-credits' => "Dat Wiki heh löp met '''[//www.mediawiki.org/ MediaWiki]''', copyright © 2001–$1 $2.",
'version-poweredby-others' => 'sönß wää',
+'version-poweredby-translators' => 'de Övversäzer em translatewiki.net',
'version-credits-summary' => 'Mer bedanke ons för iehr Beidrähsch zom [[Special:Version|MediaWiki]] bei:',
'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.
@@ -4067,12 +4093,17 @@ Do sullts en [{{SERVER}}{{SCRIPTPATH}}/COPYING Kopie vun dä <i lang="en">GNU Ge
'version-entrypoints-articlepath' => '[https://www.mediawiki.org/wiki/Manual:$wgArticlePath Der Pad noh de Atikele]',
'version-entrypoints-scriptpath' => '[https://www.mediawiki.org/wiki/Manual:$wgScriptPath Der Pad noh de Skrepte]',
-# Special:FilePath
-'filepath' => 'Medije-Dateie med ier URL zëije',
-'filepath-page' => 'Dattëij_Name:',
-'filepath-submit' => 'Lohß Jonn!',
-'filepath-summary' => "Med dä {{int:nstab-special}} hee künnd'Er dä kompläte Paad vun de neuste Version vun ene Datei direk erusfenge.
-Die Datei weed jlich aanjezeig, odder med däm paßende Projramm op jemaat.",
+# Special:Redirect
+'redirect' => 'Ömleite op en Dattei, ene Metmaacher udder de Väsjohn vun ener Sigg',
+'redirect-legend' => 'Ömleide ob_en Dattei udder Sigg',
+'redirect-summary' => 'Heh di {{int:specialpage}} leidt öm ob_en Dattei — doh mößd_Er ene Nahme aanjävve — udder en Sigg — doh mößd_Er en Kännong för en Väsjoh aanjävve — udder en Metmaachersigg — doh mößd_Er enem Metmaacher sing Kännong aanjävve.',
+'redirect-submit' => 'Lohß Jonn!',
+'redirect-lookup' => 'Söhk noh:',
+'redirect-value' => 'Kännong udder Nahme:',
+'redirect-user' => 'Enem Metmaacher sing Kännong',
+'redirect-revision' => 'Ener Sigg ier Väsjohn ier Kännong',
+'redirect-file' => 'Ener Dattei iehre Nahme',
+'redirect-not-exists' => 'Nit jefonge',
# Special:FileDuplicateSearch
'fileduplicatesearch' => 'Sök noh dubbelte Dateie',
@@ -4165,6 +4196,9 @@ die De häs han welle. Se künnt jet ällder un nit mieh aktoäll sin.',
'htmlform-submit' => 'Lohß Jonn!',
'htmlform-reset' => 'Änderunge retuur nämme',
'htmlform-selectorother-other' => 'Annder',
+'htmlform-no' => 'Nää',
+'htmlform-yes' => 'Joh',
+'htmlform-chosen-placeholder' => 'Söhk jäd_uß',
# SQLite database support
'sqlite-has-fts' => 'Version $1 (un kann en janze Täxte söhke)',
@@ -4293,4 +4327,19 @@ Wat De doh enjiß, kütt met Dingem Metmaachername un Dingem Brauser op die Sigg
# Image rotation
'rotate-comment' => 'Dat Beld wood öm {{PLURAL:$1|$1 Jraad}} esu eröm jedrieht, wi der Ohrzeijer leuf.',
+# Limit report
+'limitreport-title' => 'Daate för sijj e Beld vum Paaser ze maache:',
+'limitreport-cputime' => 'verbruch Prozäßorzigg',
+'limitreport-cputime-value' => '{{PLURAL:$1|ein&nbsp;Sekond|$1&nbsp;Sekonde|kein&nbsp;Sekond}}',
+'limitreport-walltime' => 'verbruch äächde Zigg',
+'limitreport-walltime-value' => '{{PLURAL:$1|ein&nbsp;Sekond|$1&nbsp;Sekonde|kein&nbsp;Sekond}}',
+'limitreport-ppvisitednodes-value' => '$1 vun $2',
+'limitreport-ppgeneratednodes-value' => '$1 vun $2',
+'limitreport-postexpandincludesize-value' => '$1 vun $2 Bytes',
+'limitreport-templateargumentsize' => 'Der Ömvang vun de Parrameeterre vun Schablohne',
+'limitreport-templateargumentsize-value' => '$1 vun $2 Bytes',
+'limitreport-expansiondepth-value' => '$1 vun $2',
+'limitreport-expensivefunctioncount' => 'Oproofe vun „düüre“ Fonxjuhne em Paaser',
+'limitreport-expensivefunctioncount-value' => '$1 vun $2',
+
);
diff --git a/languages/messages/MessagesKu_latn.php b/languages/messages/MessagesKu_latn.php
index f34570e4..09da3328 100644
--- a/languages/messages/MessagesKu_latn.php
+++ b/languages/messages/MessagesKu_latn.php
@@ -54,10 +54,16 @@ $namespaceAliases = array(
$separatorTransformTable = array( ',' => '.', '.' => ',' );
$specialPageAliases = array(
+ 'Allmessages' => array( 'Hemû_Peyam' ),
+ 'Allpages' => array( 'Hemû_Rûpel' ),
'Categories' => array( 'Dara_kategoriyan' ),
'DoubleRedirects' => array( 'Redirect\'ên_ducarî' ),
'Export' => array( 'Eksport' ),
+ 'Listadmins' => array( 'Lîsteya_Rêveberan' ),
+ 'Listbots' => array( 'Lîsteya_Botan' ),
'Listusers' => array( 'Lîsteya_bikarhêneran' ),
+ 'Longpages' => array( 'Rûpelên_dirêj' ),
+ 'Newpages' => array( 'Rûpelên_nû' ),
'Randompage' => array( 'Rûpela_tesadufî' ),
'Randomredirect' => array( 'Redirecta_tasadufî' ),
'Recentchanges' => array( 'Guherandinên_dawî' ),
@@ -66,6 +72,7 @@ $specialPageAliases = array(
'Statistics' => array( 'Statîstîk' ),
'Uncategorizedcategories' => array( 'Kategoriyên_bê_kategorî' ),
'Uncategorizedpages' => array( 'Rûpelên_bê_kategorî' ),
+ 'Upload' => array( 'Bar_Bike' ),
'Version' => array( 'Versiyon' ),
'Wantedcategories' => array( 'Kategorîyên_tên_xwestin' ),
'Wantedtemplates' => array( 'Şablonên_tên_xwestin' ),
@@ -131,9 +138,6 @@ $messages = array(
'tog-shownumberswatching' => 'Nîşan bide, çiqas bikarhêner dişopînin',
'tog-oldsig' => 'Pêşdîtina îmzeya heye:',
'tog-fancysig' => 'Di îmzeyê de girêdana otomatîk a bikarhêner betal bike',
-'tog-externaleditor' => 'Edîtorekî derve bike "standard" (ji yên bi ezmûn re, tercîhên taybet di komputerê de hewce ne)',
-'tog-externaldiff' => 'Birnemijekî derve biguherîne "standard" (ji yên bi ezmûn re, tercîhên taybet di komputerê de hewce ne)',
-'tog-showjumplinks' => 'Girêdanên "Here-berve" qebûlbike',
'tog-uselivepreview' => 'Pêşdîtina "zindî" bi kar bîne (JavaScript pêwîst e) (ceribandinî)',
'tog-forceeditsummary' => 'Hinga kurteyeke vala hate tomarkirin min agahdar bike',
'tog-watchlisthideown' => 'Guherandinên min ji lîsteya şopandinê veşêre',
@@ -317,7 +321,7 @@ $messages = array(
'view-pool-error' => 'Bibore, server niha zêde barkirî ne. Gelek bikarhêner niha hewl didin ku vê rûpelê bibînin. Ji kerema xwe kêlîkekê bisekine, berî ku tu dîsa hewl bidî rûpelê bibînî.',
'pool-errorunknown' => 'Çewtiyeke 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).
+# 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).
'aboutsite' => 'Der barê {{SITENAME}} de',
'aboutpage' => 'Project:Der barê',
'copyright' => 'Naverok di $1 de derbasdar e.',
@@ -327,7 +331,6 @@ $messages = array(
'disclaimers' => 'Ferexetname',
'disclaimerpage' => 'Project:Ferexetname',
'edithelp' => 'Alîkariya guherandinê',
-'edithelppage' => 'Help:Çawa rûpelekê biguherînim',
'helppage' => 'Help:Alîkarî',
'mainpage' => 'Destpêk',
'mainpage-description' => 'Destpêk',
@@ -399,11 +402,6 @@ Hemû rûpelên taybet dikarin di [[Special:SpecialPages|lîsteya rûpelên tayb
# General errors
'error' => 'Çewtî',
'databaseerror' => 'Çewtiya bingeha daneyan',
-'dberrortext' => 'Li cem dîtina bingeha daneyan <blockquote><tt>$1</tt></blockquote>
-ji fonksiyonê "<tt>$2</tt>" ye.
-MySQL ev şaşîtî hate dîtin: "<tt>$3: $4</tt>".',
-'dberrortextcl' => 'Li cem dîtina bingeha daneyan "$1 ji fonksiyonê "<tt>$2</tt>" ye.
-MySQL ev şaşîtî hate dîtin: "<tt>$3: $4</tt>".',
'laggedslavemode' => "'''Zanibe:''' Dibe ku di vê rûpelê de rojanekirinên dawî nîn bin.",
'readonly' => 'Bingeha daneyan hatiye girtin',
'enterlockreason' => 'Sedemeke bestinê binivîse, herwiha demeke texmînkirî ji bo vebûna bestinê binivîse!',
@@ -442,7 +440,6 @@ Pirs: $2',
'viewsourcetext' => 'Tu dikarî li çavkaniya vê rûpelê binêrî û wê kopî bikî:',
'protectedinterface' => "Di vê rûpelê da nivîsandin ji bo interface'î zimanan yê vê software'ê ye. Ew tê parstin ji bo vandalîzm li vê derê çênebe.",
'editinginterface' => "'''Hişyarî:''' Tu rûpeleke ku di Wîkîpediya de ji bo sîstemê girîng e diguherînî. Guherandinên di vê rûpelê de wê ji aliyê hemû bikarhêneran ve werin dîtin. Ji bo wergerê ji kerema xwe di [//translatewiki.net/wiki/Main_Page?setlang=ku-latn translatewiki.net] de bixebite, projeya MediaWiki.",
-'sqlhidden' => '(Jêpirskirina SQL hatiye veşartin)',
'cascadeprotected' => 'Ev rûpel hatiye parastin ji ber guherandinê, ji ber ku ev rûpela di {{PLURAL:$1|vê rûpelê|van rûpelan da}} tê bikaranîn:
$2',
'namespaceprotected' => "Destûra te ji bo guhertina vê rûpelê '''$1''' di valahiya nav de nîne.",
@@ -459,9 +456,15 @@ Tu dikarî {{SITENAME}} niha weke bikarhênerekî nediyarkirî bikarbînî, yan
Bila di bîra te de be ku gengaz e hin rûpel mîna ku tu hîn bi navê xwe qeyd kiriyî werin nîşandan, heta ku tu nîşanên çavlêgerandina (browser) xwe jênebî.",
'welcomeuser' => 'Xêr hatî, $1!',
'yourname' => 'Navê bikarhêner:',
+'userlogin-yourname' => 'Navê bikarhêner',
+'userlogin-yourname-ph' => 'Navê xwe yê bikarhêneriyê binivîse',
'yourpassword' => 'Şîfre:',
+'userlogin-yourpassword' => 'Şîfre',
+'userlogin-yourpassword-ph' => 'Şîfreya xwe binivîse',
'yourpasswordagain' => 'Şîfreyê dîsa binivîse:',
'remembermypassword' => 'Şifreya min di her têketina min de bîne bîra xwe (herî zêde $1 {{PLURAL:$1|rojekê|rojan}})',
+'userlogin-remembermypassword' => 'Min têketî bihêle',
+'userlogin-signwithsecure' => 'Girêdana parastî bikarbîne',
'yourdomainname' => 'Domaînê te',
'externaldberror' => 'Çewtiyeke bingeha daneyan heye, an jî destûra te ya rojanekirina hesabê xweyê navxweyî nîne.',
'login' => 'Têkeve',
@@ -472,14 +475,22 @@ Bila di bîra te de be ku gengaz e hin rûpel mîna ku tu hîn bi navê xwe qeyd
'logout' => 'Derkeve',
'userlogout' => 'Derkeve',
'notloggedin' => 'Xwe tomar nekir',
+'userlogin-noaccount' => 'Hesabekî te nîne?',
+'userlogin-joinproject' => 'Tevlî {{SITENAME}} bibe',
'nologin' => 'Hesabê te nîne? $1.',
'nologinlink' => 'Bibe endam',
'createaccount' => 'Hesabê nû çêke',
'gotaccount' => 'Hesabê te heye? $1.',
'gotaccountlink' => 'Têkeve',
'userlogin-resetlink' => 'Te agahiyên hesabê xwe ji bîr kirin?',
+'userlogin-resetpassword-link' => 'Şîfreyê ji nû ve çêke',
+'userlogin-helplink' => '[[{{MediaWiki:helplogin-url}}|Alîkariya têketinê]]',
+'createacct-emailrequired' => 'E-name',
'createaccountmail' => 'Use a temporary random password and send it to the email address specified below',
'createaccountreason' => 'Sedem:',
+'createacct-reason' => 'Sedem',
+'createacct-submit' => 'Hesabê xwe biafirîne',
+'createacct-benefit-body2' => '{{PLURAL:$1|rûpel}}',
'badretype' => 'Her du şîfreyên ku te nivîsîn li hevdu nayên.',
'userexists' => 'Ev navî bikarhênerî berê tê bikaranîn. Xêra xwe navekî din bibe.',
'loginerror' => 'Çewtiya têketinê',
@@ -538,7 +549,7 @@ Ji bo xelaskirina tomarkirinê, divê tu niha şîfreyeke nû binivîsî:',
'newpassword' => 'Şîfreya nû',
'retypenew' => 'Şîfreya nû careke din binîvîse',
'resetpass_submit' => 'Şîfreyê pêkbîne û têkeve',
-'resetpass_success' => 'Şîfreya te hate guherandin! Niha tu tê qeydkirin...',
+'changepassword-success' => 'Şîfreya te hate guherandin! Niha tu tê qeydkirin...',
'resetpass_forbidden' => 'Şîfre nikarin werin guhertin',
'resetpass-submit-loggedin' => 'Şîfre biguherîne',
'resetpass-submit-cancel' => 'Betal bike',
@@ -546,9 +557,8 @@ Ji bo xelaskirina tomarkirinê, divê tu niha şîfreyeke nû binivîsî:',
# Special:PasswordReset
'passwordreset' => 'Şîfreyê nû bike',
-'passwordreset-text' => 'Ji bo ji nû ve sazkirina şîfreyê vê formê dagire.',
+'passwordreset-text-one' => 'Ji bo ji nû ve sazkirina şîfreyê vê formê dagire.',
'passwordreset-legend' => 'Şîfreyê nû bike',
-'passwordreset-pretext' => '{{PLURAL:$1||Agahiyekê ji yên li jêr binivîse}}',
'passwordreset-username' => 'Navê bikarhêner:',
'passwordreset-email' => 'Navnîşana E-nameyê:',
'passwordreset-emailtitle' => 'Hûragahiyên hesab li ser {{SITENAME}}',
@@ -711,6 +721,7 @@ Sedema jêbirina rûpelê bi referansa li jêr hatiye piştrastkirin.',
'log-fulllog' => 'Tevahiya wê bibîne',
'edit-conflict' => 'Têkçûna guherandinan.',
'edit-no-change' => 'Guherandina te nehate hesibandin, ji ber ku guherandinên nivîsê tune bûn.',
+'postedit-confirmation' => 'Guhertina te hate tomarkirin.',
'edit-already-exists' => 'Nikarî rûpeleka nuh çêke.
Ew berê heye.',
@@ -828,7 +839,6 @@ Sedema qedexekirina $3 ev e: ''$2''",
'searchmenu-legend' => 'Vebijartinên lêgerrînê',
'searchmenu-exists' => "'''Rûpeleke bi navê \"[[:\$1]]\" li ser vê wîkiyê heye.'''",
'searchmenu-new' => 'Rûpela "[[:$1]]" çêke!',
-'searchhelp-url' => 'Help:Alîkarî',
'searchprofile-articles' => 'Rûpelên naverokê',
'searchprofile-project' => 'Rûpelên alîkariyê û projeyê',
'searchprofile-images' => 'Multîmedya',
@@ -864,9 +874,6 @@ Sedema qedexekirina $3 ev e: ''$2''",
'searchdisabled' => '<p>Tu dikarî li {{SITENAME}} bi Google an Yahoo! bigere. Têbînî: Dibe ku encamen lêgerîne ne yên herî nû ne.
</p>',
-# Quickbar
-'qbsettings-none' => 'Tune',
-
# Preferences page
'preferences' => 'Tercîhên min',
'mypreferences' => 'Tercihên min',
@@ -1254,9 +1261,6 @@ Agahdariya li ser [$2 rûpela danasîna pelê] li jêr tê nîşandan.',
'statistics-users-active' => 'Bikarhênerên çalak',
'statistics-mostpopular' => 'Rûpelên herî lênerî',
-'disambiguations' => 'Rûpelên girêdayî rûpelên cudakirinê',
-'disambiguationspage' => 'Template:disambig',
-
'doubleredirects' => 'Beralîkirinên ducarî',
'double-redirect-fixed-move' => 'Cihê [[$1]] hatiye guhertin, ew niha beralîkirina [[$2]] ye.',
@@ -1422,10 +1426,9 @@ Gava tu bixwazî wê rûpelê ji nav lîsteya xwe ya şopandinê derbixî, li se
'unwatch' => 'Êdî neşopîne',
'unwatchthispage' => 'Êdî neşopîne',
'notanarticle' => 'Ne gotar e',
-'watchnochange' => 'Ne rûpelek, yê tu dişopînê, hate xeyrandin di vê wextê da, yê tu dixazê bibînê.',
'watchlist-details' => '{{PLURAL:$1|Rûpeleka|$1 rûpel}} li ser lîsteya te ya şopandinê, rûpelên gotûbêjê nayên jimartin.',
-'wlheader-enotif' => '* Agahdariya E-nameyê pêk tê.',
-'wlheader-showupdated' => "* Ev rûpela hatî guhertin dema te lê meyzand bi '''nivîsa stûr''' tê xuyakirin.",
+'wlheader-enotif' => 'Agahdariya E-nameyê pêk tê.',
+'wlheader-showupdated' => "Ev rûpela hatî guhertin dema te lê meyzand bi '''nivîsa stûr''' tê xuyakirin.",
'watchlistcontains' => 'Di lîsteya şopandina te de {{PLURAL:$1|rûpelek heye|$1 rûpel hene}}.',
'wlnote' => "Niha {{PLURAL:$1|xeyrandinê|'''$1''' xeyrandinên}} dawî yê {{PLURAL:$2|seetê|'''$2''' seetên}} dawî {{PLURAL:$1|tê|tên}} dîtin.",
'wlshowlast' => 'Guhertinên berî $1 saetan, $2 rojan, ya $3 nîşan bide',
@@ -1708,8 +1711,6 @@ Sedemekê binivîse!",
'ipb_already_blocked' => '"$1" berê hatîye astengkirin',
'ipb-needreblock' => '$1 berê hatiye astengkirin. Tu dixwazî eyaran biguherînî?',
'ipb_cant_unblock' => "Şaşbûn: ID'ya astengkirinê $1 nehate dîtin. Astengkirinê xwe niha belkî hatîye rakirin.",
-'blockme' => 'Min astengbike',
-'proxyblocksuccess' => 'Çêbû.',
'sorbsreason' => "Adrêsa IP ya te ji DNSBL'a {{SITENAME}} wek proxy'eka vekirî tê naskirin.",
'sorbs_create_account_reason' => "Adrêsa IP ya te ji DNSBL'a {{SITENAME}} wek proxy'eka vekirî tê naskirin. Tu nikarê account'ekê ji xwe ra çêkê.",
@@ -1947,7 +1948,7 @@ Ji ber ku girêdaneke derve di wê rûpelê de heye ev pirsgirêk pêk hat.',
'metadata-expand' => 'Detayên dirêj nîşan bide',
'metadata-collapse' => 'Detayên dirêj veşêre',
-# EXIF tags
+# Exif tags
'exif-imagewidth' => 'Panbûn',
'exif-imagelength' => 'Dirêjbûn',
'exif-jpeginterchangeformatlength' => "Byte'ên daneya JPEG",
@@ -2117,10 +2118,6 @@ Ji kerema xwe zanibe ku tu bi rastî dixwazî vê rûpelê dîsa çêkî.",
'version-software-version' => 'Guherto',
'version-entrypoints-header-url' => 'URL',
-# Special:FilePath
-'filepath-page' => 'Wêne:',
-'filepath-submit' => 'Gotar',
-
# Special:FileDuplicateSearch
'fileduplicatesearch-filename' => 'Navê dosyeyê:',
'fileduplicatesearch-submit' => 'Lê bigere',
diff --git a/languages/messages/MessagesKw.php b/languages/messages/MessagesKw.php
index 7875ba6b..99fa094d 100644
--- a/languages/messages/MessagesKw.php
+++ b/languages/messages/MessagesKw.php
@@ -20,7 +20,7 @@
$namespaceNames = array(
NS_MEDIA => 'Media',
- NS_SPECIAL => 'Arbednek',
+ NS_SPECIAL => 'Arbennek',
NS_TALK => 'Keskows',
NS_USER => 'Devnydhyer',
NS_USER_TALK => 'Keskows_Devnydhyer',
@@ -38,7 +38,7 @@ $namespaceNames = array(
);
$namespaceAliases = array(
- 'Arbennek' => NS_SPECIAL,
+ 'Arbednek' => NS_SPECIAL,
'Cows' => NS_TALK,
'Kescows' => NS_TALK,
'Cows_Devnydhyer' => NS_USER_TALK,
@@ -60,100 +60,100 @@ $namespaceAliases = array(
);
$specialPageAliases = array(
- 'Activeusers' => array( 'DevnydhyoryonBew' ),
+ 'Activeusers' => array( 'DevnydhyoryonByw' ),
'Allmessages' => array( 'OllMessajys' ),
'Allpages' => array( 'OllFolennow' ),
- 'Ancientpages' => array( 'FolennowCoth' ),
+ 'Ancientpages' => array( 'FolennowKoth' ),
'Badtitle' => array( 'TitelDrog' ),
'Blankpage' => array( 'FolenWag' ),
- 'Block' => array( 'Difen' ),
- 'Blockme' => array( 'DifenVy' ),
+ 'Block' => array( 'Difenna' ),
+ 'Blockme' => array( 'GulOwDifen' ),
'Booksources' => array( 'PennfentynyowLyver' ),
- 'BrokenRedirects' => array( 'DaswedyansowTerrys' ),
- 'Categories' => array( 'Classys' ),
+ 'BrokenRedirects' => array( 'DaskedyansowTerrys' ),
+ 'Categories' => array( 'Klassys' ),
'ChangeEmail' => array( 'ChanjyaEbost' ),
'ChangePassword' => array( 'ChanjyaGerTremena' ),
- 'ComparePages' => array( 'KehevelyFolennow' ),
+ 'ComparePages' => array( 'KeheveliFolennow' ),
'Confirmemail' => array( 'AfydhyaEbost' ),
'Contributions' => array( 'Kevrohow' ),
- 'CreateAccount' => array( 'FormyaAcont' ),
+ 'CreateAccount' => array( 'FormyaAkont' ),
'Deadendpages' => array( 'FolennowFordhDhall' ),
'DeletedContributions' => array( 'KevrohowDiles' ),
'Disambiguations' => array( 'Diamstyryansow' ),
'DoubleRedirects' => array( 'DaswedyansowDewblek' ),
- 'EditWatchlist' => array( 'ChanjyaOwRolGolyas' ),
+ 'EditWatchlist' => array( 'ChanjyaOwRolGolya' ),
'Emailuser' => array( 'EbostyaDevnydhyer' ),
- 'Export' => array( 'Esperthy' ),
+ 'Export' => array( 'Esperthi' ),
'Fewestrevisions' => array( 'AnLyhaAmendyansow' ),
- 'Filepath' => array( 'HensAnFolen' ),
- 'Import' => array( 'Ymperthy' ),
+ 'Filepath' => array( 'HynsAnFolen' ),
+ 'Import' => array( 'Ymperthi' ),
'Invalidateemail' => array( 'DigomposaEbost' ),
'JavaScriptTest' => array( 'PrevyansJavaScript' ),
'BlockList' => array( 'RolDhifen' ),
- 'LinkSearch' => array( 'WhilasKevrennow' ),
+ 'LinkSearch' => array( 'HwilasKevrennow' ),
'Listadmins' => array( 'RolyaMenystroryon' ),
'Listbots' => array( 'RolyaBottys' ),
'Listfiles' => array( 'RolyaRestrennow' ),
'Listgrouprights' => array( 'RolyaGwiryowBagas' ),
- 'Listredirects' => array( 'RolyaDaswedyansow' ),
+ 'Listredirects' => array( 'RolyaDaskedyansow' ),
'Listusers' => array( 'RolyaDevnydhyoryon' ),
- 'Lockdb' => array( 'AlwhedhaDB' ),
- 'Log' => array( 'Covnoten', 'Covnotennow' ),
+ 'Lockdb' => array( 'AlhwedhaDB' ),
+ 'Log' => array( 'Kovnoten', 'Kovnotennow' ),
'Lonelypages' => array( 'FolennowDigoweth' ),
'Longpages' => array( 'FolennowHir' ),
- 'MergeHistory' => array( 'IstoryKesunya' ),
- 'MIMEsearch' => array( 'WhilasMIME' ),
- 'Mostcategories' => array( 'AnMoyhaClassys' ),
+ 'MergeHistory' => array( 'IstoriKesunya' ),
+ 'MIMEsearch' => array( 'HwilasMIME' ),
+ 'Mostcategories' => array( 'AnMoyhaKlassys' ),
'Mostimages' => array( 'AnMoyhaRestrennowKevennys' ),
'Mostinterwikis' => array( 'AnMoyhaInterwikis' ),
'Mostlinked' => array( 'AnMoyhaFolennowKevrennys' ),
- 'Mostlinkedcategories' => array( 'AnMoyhaClassysKevrennys' ),
- 'Mostlinkedtemplates' => array( 'AnMoyhaScantlynsKevrennys' ),
+ 'Mostlinkedcategories' => array( 'AnMoyhaKlassysKevrennys' ),
+ 'Mostlinkedtemplates' => array( 'AnMoyhaSkantlynsKevrennys' ),
'Mostrevisions' => array( 'AnMoyhaAmendyansow' ),
'Movepage' => array( 'GwayaFolen' ),
'Mycontributions' => array( 'OwHevrohow' ),
'Mypage' => array( 'OwFolen' ),
- 'Mytalk' => array( 'OwHescows' ),
- 'Myuploads' => array( 'OwUghcargansow' ),
+ 'Mytalk' => array( 'OwHeskows' ),
+ 'Myuploads' => array( 'OwUghkargansow' ),
'Newimages' => array( 'RestrennowNowyth' ),
'Newpages' => array( 'FolennowNowyth' ),
'PasswordReset' => array( 'DassetyaGerTremena' ),
'PermanentLink' => array( 'KevrenFast' ),
'Popularpages' => array( 'FolennowGerysDa' ),
- 'Preferences' => array( 'Dowisyansow' ),
+ 'Preferences' => array( 'Dewisyansow' ),
'Prefixindex' => array( 'MenegvaRagerow' ),
'Protectedpages' => array( 'FolennowDifresys' ),
'Protectedtitles' => array( 'TitlysDifres' ),
'Randompage' => array( 'FolenDreJons' ),
- 'Randomredirect' => array( 'DaswedyansDreJons' ),
+ 'Randomredirect' => array( 'DaskedyansDreJons' ),
'Recentchanges' => array( 'Chanjyow_a-dhiwedhes' ),
'Recentchangeslinked' => array( 'ChanjyowKelmys' ),
'Revisiondelete' => array( 'DileaAmendyans' ),
- 'Search' => array( 'Whilas' ),
- 'Shortpages' => array( 'FolennowCot' ),
+ 'Search' => array( 'Hwilas' ),
+ 'Shortpages' => array( 'FolennowBerr' ),
'Specialpages' => array( 'FolennowArbennek' ),
'Statistics' => array( 'Statystygyon' ),
'Unblock' => array( 'DiswulDifennans' ),
- 'Uncategorizedcategories' => array( 'ClassysHebClass' ),
- 'Uncategorizedimages' => array( 'RestrennowHebClass' ),
- 'Uncategorizedpages' => array( 'FolennowHebClass' ),
- 'Uncategorizedtemplates' => array( 'ScantlynsHebClass' ),
- 'Undelete' => array( 'DiswulDileans' ),
- 'Unlockdb' => array( 'DialwhedhaDB' ),
- 'Unusedcategories' => array( 'ClassysHebDevnydh' ),
+ 'Uncategorizedcategories' => array( 'KlassysHebKlass' ),
+ 'Uncategorizedimages' => array( 'RestrennowHebKlass' ),
+ 'Uncategorizedpages' => array( 'FolennowHebKlass' ),
+ 'Uncategorizedtemplates' => array( 'SkantlynsHebKlass' ),
+ 'Undelete' => array( 'DiswulDilea' ),
+ 'Unlockdb' => array( 'DialhwedhaDB' ),
+ 'Unusedcategories' => array( 'KlassysHebDevnydh' ),
'Unusedimages' => array( 'RestrennowHebDevnydh' ),
- 'Unusedtemplates' => array( 'ScantlynsHebDevnydh' ),
- 'Unwatchedpages' => array( 'FolennowHebAgaHolyas' ),
- 'Upload' => array( 'Ughcarga' ),
- 'Userlogin' => array( 'Omgelmy' ),
- 'Userlogout' => array( 'Digelmy' ),
+ 'Unusedtemplates' => array( 'SkantlynsHebDevnydh' ),
+ 'Unwatchedpages' => array( 'FolennowHebAgaHolya' ),
+ 'Upload' => array( 'Ughkarga' ),
+ 'Userlogin' => array( 'Omgelmi' ),
+ 'Userlogout' => array( 'Digelmi' ),
'Userrights' => array( 'GwiryowDevnydhyer' ),
'Version' => array( 'Versyon' ),
- 'Wantedcategories' => array( 'ClassysWhansus' ),
- 'Wantedfiles' => array( 'RestrennowWhansus' ),
- 'Wantedpages' => array( 'FolennowWhansus' ),
- 'Wantedtemplates' => array( 'ScantlynsWhansus' ),
- 'Watchlist' => array( 'Rol_golyas' ),
+ 'Wantedcategories' => array( 'KlassysHwansus' ),
+ 'Wantedfiles' => array( 'RestrennowHwansus' ),
+ 'Wantedpages' => array( 'FolennowHwansus' ),
+ 'Wantedtemplates' => array( 'SkantlynsHwansus' ),
+ 'Watchlist' => array( 'Rol_golya' ),
'Whatlinkshere' => array( 'OwKevrennaOmma' ),
'Withoutinterwiki' => array( 'HebInterwiki' ),
);
@@ -229,7 +229,6 @@ $messages = array(
'tog-enotifusertalkpages' => 'Danvon ebost dhymm pan vo chanjyes ow folen geskows',
'tog-oldsig' => 'Sinans a-lemmyn:',
'tog-fancysig' => 'Dyghtya an sinans avel wikitekst (heb kevren awtomatek)',
-'tog-showjumplinks' => 'Galosegi kevrennow hedhadowder "lamma dhe"',
'tog-watchlisthideown' => "Kudha ow chanjyow y'n rol wolya",
'tog-watchlisthidebots' => "Kudha chanjyow gans bottow y'n rol wolya",
'tog-watchlisthideminor' => "Kudha chanjyow byhan y'n rol wolya",
@@ -237,6 +236,7 @@ $messages = array(
'tog-watchlisthideanons' => "Kudha chanjyow gans devnydhyoryon heb hanow y'n rol wolya",
'tog-ccmeonemails' => 'Danvon dhymm dasskrif a ebostow a dhanvonav dhe dhevnydhyoryon erel',
'tog-showhiddencats' => 'Diskwedhes klassys kudhys',
+'tog-useeditwarning' => 'Gul ow gwarnya pan gyssiv folen janjya gans chanjyow nag yw gwithys',
'underline-always' => 'Pub prys',
'underline-never' => 'Jammes',
@@ -299,6 +299,18 @@ $messages = array(
'oct' => 'Hed',
'nov' => 'Du',
'dec' => 'Kev',
+'january-date' => '$1 Genver',
+'february-date' => '$1 Hwevrel',
+'march-date' => '$1 Meurth',
+'april-date' => '$1 Ebrel',
+'may-date' => '$1 Me',
+'june-date' => '$1 Metheven',
+'july-date' => '$1 Gortheren',
+'august-date' => '$1 Est',
+'september-date' => '$1 Gwynngala',
+'october-date' => '$1 Hedra',
+'november-date' => '$1 Du',
+'december-date' => '$1 Kevardhu',
# Categories related messages
'pagecategories' => '{{PLURAL:$1|Klass|Klassys}}',
@@ -374,6 +386,7 @@ $messages = array(
'create-this-page' => 'Gwruthyl an folen-ma',
'delete' => 'Dilea',
'deletethispage' => 'Dilea an folen-ma',
+'undeletethispage' => 'Diswul dilea an folen-ma',
'undelete_short' => 'Disdhilea {{PLURAL:$1|unn janj|$1 chanj}}',
'viewdeleted_short' => 'Gweles {{PLURAL:$1|unn janj diles|$1 chanj diles}}',
'protect' => 'Difres',
@@ -414,7 +427,7 @@ Gortewgh pols kyns hwi dhe assaya hedhas an folen-ma arta, mar pleg.
$1',
'pool-errorunknown' => 'Gwall ankoth',
-# 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).
+# 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).
'aboutsite' => 'A-dro dhe {{SITENAME}}',
'aboutpage' => 'Project:Kedhlow',
'copyright' => 'Kavadow yw an dalgh yn-dann $1.',
@@ -424,7 +437,6 @@ $1',
'disclaimers' => 'Avisyansow',
'disclaimerpage' => 'Project:Avisyans ollgemmyn',
'edithelp' => 'Gweres gans chanjya',
-'edithelppage' => 'Help:Chanjya',
'helppage' => 'Help:Gweres',
'mainpage' => 'Dynnargh',
'mainpage-description' => 'Dynnargh',
@@ -496,6 +508,8 @@ $1',
'viewsource-title' => 'Gweles an bennfenten rag $1',
'protectedpagetext' => 'Difresys re beu an folen-ma rag gwitha rag chanjya po gwriansow erel.',
'viewsourcetext' => 'Hwi a yll gweles ha kopia pennfenten an folen-ma:',
+'mycustomcssprotected' => "Ny'gas beus kummyes dhe janjya an folen CSS-ma.",
+'mycustomjsprotected' => "Ny'gas beus kummyes dhe janjya an folen JavaScript-ma.",
'ns-specialprotected' => 'Ny yllir chanjya folennow arbennek.',
'exception-nologin' => 'Nyns owgh omgelmys',
'exception-nologin-text' => 'An folen-ma po an gwrians-ma a wovyn mayth omgelmowgh war an wiki-ma.',
@@ -509,10 +523,18 @@ Notyewgh: Neb folennow a alsa bos diskwedhys kepar del owgh hwath omgelmys, erna
'welcomecreation-msg' => 'Gwruthys re beu agas akont.
Na ankevewgh dhe janjya agas [[Special:Preferences|dewisyansow {{SITENAME}}]].',
'yourname' => 'Hanow devnydhyer:',
+'userlogin-yourname' => 'Hanow devnydhyer',
+'userlogin-yourname-ph' => 'Entrewgh agas hanow devnydhyer',
'yourpassword' => 'Ger tremena:',
+'userlogin-yourpassword' => 'Ger tremena',
+'userlogin-yourpassword-ph' => 'Entrewgh agas ger tremena',
+'createacct-yourpassword-ph' => 'Entrewgh ger tremena',
'yourpasswordagain' => 'Jynnskrifewgh agas ger tremena arta:',
+'createacct-yourpasswordagain' => 'Afydhyewgh an ger tremena',
+'createacct-yourpasswordagain-ph' => 'Entrewgh an ger tremena arta',
'remembermypassword' => "Perthi kov a'm omgelmi war an jynn amontya-ma (rag $1 {{PLURAL:$1|dydh}} dhe'n moyha)",
-'securelogin-stick-https' => 'Gwitha junyes gans HTTPS wosa omgelmi',
+'userlogin-remembermypassword' => "Perthi kov a'm omgelmi",
+'userlogin-signwithsecure' => 'Devnydhya junyans diogel',
'yourdomainname' => 'Agas tiredh:',
'password-change-forbidden' => 'Ny yllir chanjya geryow tremena war an wiki-ma.',
'login' => 'Omgelmi',
@@ -523,18 +545,38 @@ Na ankevewgh dhe janjya agas [[Special:Preferences|dewisyansow {{SITENAME}}]].',
'logout' => 'Digelmi',
'userlogout' => 'Digelmi',
'notloggedin' => 'Digelmys',
+'userlogin-noaccount' => "A ny'gas beus akont?",
+'userlogin-joinproject' => 'Junya {{SITENAME}}',
'nologin' => "A ny'gas beus akont? '''$1'''.",
'nologinlink' => 'Gwruthyl akont',
'createaccount' => 'Gwruthyl akont nowyth',
'gotaccount' => "Eus akont dhywgh seulabrys? '''$1'''.",
'gotaccountlink' => 'Omgelmi',
'userlogin-resetlink' => 'A ankevsowgh hwi agas manylyon omgelmi?',
+'userlogin-resetpassword-link' => 'Dassettya agas ger tremena',
+'helplogin-url' => 'Help:Omgelmi',
+'userlogin-helplink' => '[[{{MediaWiki:helplogin-url}}|Gweres gans omgelmi]]',
+'createacct-join' => 'Entrewgh agas kedhlow a-woles.',
+'createacct-emailrequired' => 'Trigva ebost',
+'createacct-emailoptional' => 'Trigva ebost (a-dhewis)',
+'createacct-email-ph' => 'Entrewgh agas trigva ebost',
'createaccountmail' => "Devnydhya ger tremena chonsus anbarthus hag y dhanvon dhe'n drigva ebost res a-woles",
+'createacct-realname' => 'Hanow gwir (a-dhewis)',
'createaccountreason' => 'Acheson:',
+'createacct-reason' => 'Acheson',
+'createacct-reason-ph' => 'Prag yth esowgh ow kwruthyl akont aral',
+'createacct-captcha' => 'Gwiryans sekerder',
+'createacct-imgcaptcha-ph' => 'Entrewgh an tekst a welowgh a-ugh',
+'createacct-submit' => 'Gwruthyl agas akont',
+'createacct-benefit-heading' => 'Gwrys yw {{SITENAME}} gans tus kepar ha hwi.',
+'createacct-benefit-body1' => '{{PLURAL:$1|janj|chanj}}',
+'createacct-benefit-body2' => '{{PLURAL:$1|folen}}',
+'createacct-benefit-body3' => '{{PLURAL:$1|gevriyas|kevriyas}} a-dhiwedhes',
'badretype' => 'Ny omdhesedh an geryow tremena entrys genowgh.',
'userexists' => 'Y tevnydhir an hanow devnydhyer entrys genowgh seulabrys.
Dewisewgh ken hanow mar pleg.',
'loginerror' => 'Gwall omgelmi',
+'createacct-error' => 'Gwall ow kwruthyl akont',
'createaccounterror' => 'Ny allas gwruthyl an akont: $1',
'nocookiesnew' => "Gwruthys veu an akont, mes nyns owgh omgelmys.
{{SITENAME}} a dhevnydh cookies rag omgelmi devnydhyoryon.
@@ -588,8 +630,8 @@ Rag gorfenna omgelmi, res yw dhywgh settya ger tremena nowyth omma:',
'newpassword' => 'Ger tremena nowyth:',
'retypenew' => 'Jynnscrifewgh an ger tremena nowyth arta:',
'resetpass_submit' => 'Settya an ger tremena hag omgelmi',
-'resetpass_success' => 'Chanjyes re beu agas ger tremena yn soweny!
-Orth agas omgelmy lemmyn...',
+'changepassword-success' => 'Chanjyes re beu agas ger tremena yn sewen!
+Orth agas omgelmi lemmyn...',
'resetpass_forbidden' => 'Ny yllir chanjya geryow tremena',
'resetpass-submit-loggedin' => 'Chanjya an ger tremena',
'resetpass-submit-cancel' => 'Hedhi',
@@ -597,10 +639,10 @@ Orth agas omgelmy lemmyn...',
# Special:PasswordReset
'passwordreset' => 'Dassettya an ger tremena',
-'passwordreset-text' => 'Lenwewgh an furvlen-ma rag dassettya agas ger tremena.',
+'passwordreset-text-one' => 'Lenwewgh an furvlen-ma rag dassettya agas ger tremena.',
+'passwordreset-text-many' => "{{PLURAL:$1|Entrewgh onan a'n tymmyn a dhata a-woles rag dassettya agas ger tremena.}}",
'passwordreset-legend' => 'Dassettya an ger tremena',
'passwordreset-disabled' => 'Dialosegys yw dassettya geryow tremena war an wiki-ma.',
-'passwordreset-pretext' => "{{PLURAL:$1||Entrowgh onen a'n tymmyn a dhata a-woles}}",
'passwordreset-username' => 'Hanow devnydhyer:',
'passwordreset-domain' => 'Tiredh:',
'passwordreset-email' => 'Trigva ebost:',
@@ -687,6 +729,8 @@ Res yw an diwettha kovnoten a-woles rag godhvos:",
'moveddeleted-notice' => 'An folen-ma re beu diles.
Yma kovnoten dhilea ha gwaya an folen res a-woles.',
'log-fulllog' => 'Gweles an govnoten dhien',
+'editwarning-warning' => 'Mar kasowgh an folen-ma, y halser kelli chanjyow gwrys genowgh.
+Mars owgh omgelmys, hwi a yll dialosegi an gwarnyans-ma yn tregh "Chanjya" agas dewisyansow.',
# "Undo" feature
'undo-success' => 'Y hyllir diswul an chanj-ma.
@@ -764,7 +808,6 @@ Alhwedh: '''({{int:cur}})''' = an dyffrans dhyworth an amendyans diwettha, '''({
'searchmenu-legend' => 'Etholyow hwilas',
'searchmenu-exists' => "''Yma folen henwys \"[[:\$1]]\" war an wiki-ma'''",
'searchmenu-new' => "'''Gwruthyl an folen \"[[:\$1]]\" war an wiki-ma!'''",
-'searchhelp-url' => 'Help:Gweres',
'searchprofile-articles' => 'Folennow dalgh',
'searchprofile-project' => 'Folennow gweres ha ragdres',
'searchprofile-images' => 'Liesmedia',
@@ -823,7 +866,6 @@ Assayewgh rag-gorra agas govyn gans ''all:'' rag hwilas yn pub tyller (ynna an f
'resetprefs' => 'Klerhe chanjyow nag yw gwithys',
'restoreprefs' => 'Restorya pub settyans defowt',
'prefs-editing' => 'Chanjya',
-'prefs-edit-boxsize' => 'Myns an fenester janjya.',
'rows' => 'Rewyow:',
'columns' => 'Kolovennow:',
'searchresultshead' => 'Hwilas',
@@ -923,6 +965,7 @@ Ny dhiskwedhir agas trigva ebost pan gestaffo devnydhyoryon erel dhywgh.',
'recentchanges' => 'Chanjyow a-dhiwedhes',
'recentchanges-legend' => 'Etholyow an chanjyow a-dhiwedhes',
'recentchanges-summary' => "Y hyllir helerhi an chanjyow diwettha gwrys dhe'n wiki war an folen-ma.",
+'recentchanges-noresult' => 'Nyns eus chanj vyth dres an termyn res a omdhesedh orth an etholyow-ma.',
'recentchanges-feed-description' => "Y hyllir helerhi an chanjyow diwettha gwrys dhe'n wiki y'n feed-ma.",
'recentchanges-label-newpage' => 'Y feu gwruthys folen nowyth gans an chanj-ma',
'recentchanges-label-minor' => 'Chanj byhan yw hemma',
@@ -952,7 +995,6 @@ Ny dhiskwedhir agas trigva ebost pan gestaffo devnydhyoryon erel dhywgh.',
'recentchangeslinked-feed' => 'Chanjyow kelmys',
'recentchangeslinked-toolbox' => 'Chanjyow kelmys',
'recentchangeslinked-title' => 'Chanjyow kelmys dhe "$1"',
-'recentchangeslinked-noresult' => 'Nyns esa chanj vyth war folennow kevrennys dres an termyn res.',
'recentchangeslinked-summary' => "Homm yw rol a janjyow gwrys a-dhiwedhes dhe folennow yw kevrennys dhyworth folen res (po dhe eseli a glass res).
'''Tew''' yw folennow eus war agas [[Special:Watchlist|rol wolya]].",
'recentchangeslinked-page' => 'Hanow an folen:',
@@ -963,7 +1005,7 @@ Ny dhiskwedhir agas trigva ebost pan gestaffo devnydhyoryon erel dhywgh.',
'uploadbtn' => 'Ughkarga restren',
'reuploaddesc' => "Hedhi ughkarga ha dehweles dhe'n furvlen ughkarga",
'uploadnologin' => 'Digelmys',
-'uploadnologintext' => 'Res yw bos [[Special:UserLogin|omgelmys]] rag ughcarga restrennow.',
+'uploadnologintext' => 'Res yw bos [[Special:UserLogin|omgelmys]] rag ughkarga restrennow.',
'uploaderror' => 'Gwall ughkarga',
'uploadlogpage' => 'Kovnoten ughkarga',
'filename' => 'Hanow an restren',
@@ -1130,6 +1172,7 @@ Diskwedhys a-woles yw an deskrifans war hy [$2 folen dheskrifans] ena.',
'watchthispage' => 'Golya an folen-ma',
'unwatch' => 'Diswolya',
'watchlist-details' => 'Yma {{PLURAL:$1|$1 folen}} war agas rol wolya, marnas folennow keskows.',
+'wlheader-showupdated' => "Yn '''tew''' y tiskwedhir folennow re beu chanjyes a-dhia agas vysytyans diwettha.",
'wlnote' => "A-woles yma an {{PLURAL:$1|chanj diwettha|'''$1''' chanj diwettha}} y'n {{PLURAL:$2|our|'''$2''' our}} diwettha, a-dhia $3, $4.",
'wlshowlast' => 'Diskwedhes an $1 our diwettha, an $2 dydh diwettha, po $3',
'watchlist-options' => 'Etholyow an rol wolya',
@@ -1380,7 +1423,7 @@ Hwi a yll gweles hy fennfenten.',
'metadata-expand' => 'Diskwedhes manylyon ystynnys',
'metadata-collapse' => 'Kudha manylyon ystynnys',
-# EXIF tags
+# Exif tags
'exif-imagewidth' => 'Les',
'exif-imagelength' => 'Uhelder',
'exif-artist' => 'Awtour',
@@ -1463,9 +1506,6 @@ Hwi a yll [[Special:EditWatchlist|devnydhya an janjyel usadow]] ynwedh.',
'version-other' => 'Aral',
'version-version' => '(Versyon $1)',
-# Special:FilePath
-'filepath-page' => 'Restren:',
-
# Special:FileDuplicateSearch
'fileduplicatesearch-filename' => 'Hanow an restren:',
'fileduplicatesearch-submit' => 'Hwilas',
diff --git a/languages/messages/MessagesKy.php b/languages/messages/MessagesKy.php
index 232fd8fd..bac3319a 100644
--- a/languages/messages/MessagesKy.php
+++ b/languages/messages/MessagesKy.php
@@ -15,6 +15,7 @@
* @author Growingup
* @author Kgbek
* @author Muratjumashev
+ * @author Tynchtyk Chorotegin
* @author Ztimur
* @author Викиней
*/
@@ -64,9 +65,6 @@ $messages = array(
'tog-shownumberswatching' => 'Көзөмөлдөп жаткан колдонуучулардын Ñанын көрÑÓ©Ñ‚Ò¯Ò¯',
'tog-oldsig' => 'Учурдагы кол тамга:',
'tog-fancysig' => 'Кол тамгамдын уики-белгиÑи гана (автоматтык шилтемеÑиз)',
-'tog-externaleditor' => 'Тышкы редакторду жарыÑланбаÑча колдонуу (адиÑтер үчүн гана, компьютериңизде өзгөчө ыраÑтоолор керек. [//www.mediawiki.org/wiki/Manual:External_editors кошумча маалымат.])',
-'tog-externaldiff' => 'Салыштыруу үчүн тышкы программаны жарыÑланбаÑча колдонуу (адиÑтер үчүн гана, компьютериңизде өзгөчө ыраÑтоолор керек. [//www.mediawiki.org/wiki/Manual:External_editors кошумча маалымат.])',
-'tog-showjumplinks' => '«өтүү» деген жардамчы шилтемелерди жандыруу',
'tog-uselivepreview' => 'Тез алдын ала көрÑөтүүнү колдонуу (JavaScript талап кылынат) (ÑкÑперименталдык)',
'tog-forceeditsummary' => 'Оңдоо баÑндооÑунун көзөнөгү бош калган кезинде мага ÑÑкертүү',
'tog-watchlisthideown' => 'Көзөмөлдөө тизмеÑинен менин оңдоолорумду жашыруу',
@@ -79,6 +77,7 @@ $messages = array(
'tog-diffonly' => 'Ðйырмаларды Ñалыштыруунун аÑтынан барактын мазмунун көрÑөтпөө',
'tog-showhiddencats' => 'Жашыруун категориÑларды көрÑÓ©Ñ‚Ò¯Ò¯',
'tog-norollbackdiff' => 'Кетенчиктөөнү аткаргандан кийин верÑиÑлардын айырмаÑын көрÑөтпөө',
+'tog-useeditwarning' => 'Барактан өзгөртүүлөрүмдү ÑактабаÑтан чыгып баратканымда ÑÑкертүү',
'underline-always' => 'Дайыма',
'underline-never' => 'Эч качан',
@@ -142,6 +141,9 @@ $messages = array(
'oct' => 'Окт',
'nov' => 'ÐоÑ',
'dec' => 'Дек',
+'january-date' => 'Январь (Үчтүн айы) $1',
+'february-date' => '$1-феврал',
+'march-date' => '$1-март',
# Categories related messages
'pagecategories' => '{{PLURAL:$1|КатегориÑ|КатегориÑлар}}',
@@ -223,6 +225,7 @@ $messages = array(
'create-this-page' => 'Бул баракты түзүү',
'delete' => 'Өчүрүү',
'deletethispage' => 'Бул баракты өчүрүү',
+'undeletethispage' => 'Баракты калыбына келтирүү',
'undelete_short' => '$1 {{PLURAL:$1|оңдоону|$1 оңдоолорду}} калыбына келтирүү',
'viewdeleted_short' => 'Өчүрүлгөн {{PLURAL:$1|оңдоону|$1 оңдоолорду}} көрүү',
'protect' => 'Коргоо',
@@ -266,7 +269,7 @@ $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).
+# 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).
'aboutsite' => '{{SITENAME}} тууралуу',
'aboutpage' => 'Project:Долбоор тууралуу',
'copyright' => '$1 лицензиÑÑына ылайык жеткиликтүү мазмун.',
@@ -276,7 +279,6 @@ $1',
'disclaimers' => 'Жоопкерчиликтен баш тартуу',
'disclaimerpage' => 'Project:Жоопкерчиликтен баш тартуу',
'edithelp' => 'Оңдоп-түзөөгө жардам',
-'edithelppage' => 'Help:Редакторлоо',
'helppage' => 'Help:Мазмуну',
'mainpage' => 'Баш барак',
'mainpage-description' => 'Баш барак',
@@ -344,12 +346,6 @@ $1',
# General errors
'error' => 'Ката',
'databaseerror' => 'Маалымат базаÑынын катаÑÑ‹',
-'dberrortext' => 'Маалымат базаÑынын Ñуроо ÑинтакÑиÑинде ката табылды.
-Бул программалык камÑыздоодо ката бар болгонун билдирет.
-Ðкыркы маалымат базаÑынын ÑурооÑу:
-<blockquote><code>$1</code></blockquote>
-«<code>$2</code>» функциÑÑынан пайда болду.
-Маалымат базаÑÑ‹ «<samp>$3: $4</samp>» катаÑын кайтарды.',
'laggedslavemode' => "'''ЭÑкертүү:''' баракта акыркы жаңыртуулар жок болуп калышы мүмкүн.",
'readonly' => 'Маалымат базаÑÑ‹ бөгөттөлгөн',
'enterlockreason' => 'Бөгөттөөнүн Ñебебин жана мөөнөтүн көрÑөтүңүз',
@@ -384,7 +380,6 @@ $1',
'viewsource-title' => '$1 барагынын баштапкы кодун көрүү',
'actionthrottled' => 'Ðралык боюнча чектөө',
'viewsourcetext' => 'Сиз бул барактын баштапкы кодун көрүп жана көчүрүп алÑаңыз болот:',
-'sqlhidden' => '(SQL Ñуроо жашырылган)',
'ns-specialprotected' => 'Кызматык барактарды оңдоого мүмкүн ÑмеÑ.',
'invalidtitle-unknownnamespace' => 'Туура ÑÐ¼ÐµÑ Ð±Ð°Ñˆ Ñөз',
'exception-nologin' => 'Сиз ÑиÑтемге кирген жокÑуз',
@@ -402,10 +397,18 @@ $1',
'welcomecreation-msg' => 'Сиздин ÑÑеп жазууңуз жаратылды.
{{SITENAME}} Ñайтынын [[Special:Preferences|ыраÑтоолорун]] өзгөртүүнү унутпаңыз.',
'yourname' => 'Колдонуучу аты:',
+'userlogin-yourname' => 'Колдонуучунун аты',
+'userlogin-yourname-ph' => 'Колдонуучу атыңызды териңиз',
'yourpassword' => 'СырÑөз:',
+'userlogin-yourpassword' => 'СырÑөз',
+'userlogin-yourpassword-ph' => 'СырÑөзүңүздү териңиз',
+'createacct-yourpassword-ph' => 'СырÑөздү териңиз',
'yourpasswordagain' => 'СырÑөздү кайра терүү:',
+'createacct-yourpasswordagain' => 'СырÑөздү таÑтыктаңыз',
+'createacct-yourpasswordagain-ph' => 'СырÑөздү кайра киргизиңиз',
'remembermypassword' => 'Бул браузерде колдонуучу атымды ($1 {{PLURAL:$1|күнгө}} чейин Ñактоо)',
-'securelogin-stick-https' => 'Киргенден кийин HTTPS аркылуу туташтырууну улантуу',
+'userlogin-remembermypassword' => 'Мени ÑиÑтемге кирген боюнча калтыр',
+'userlogin-signwithsecure' => 'КоопÑуз байланышты колдонуу',
'yourdomainname' => 'Сиздин домен:',
'password-change-forbidden' => 'Сиз бул уикиден ÑÑ‹Ñ€Ñөзүңүздү өзгөртө албайÑыз.',
'externaldberror' => 'Маалымат базаÑында ката кетти же Ñизге Ñырткы ÑÑебиңизди жаңыртууга урукÑат берилген ÑмеÑ.',
@@ -417,18 +420,38 @@ $1',
'logout' => 'Чыгуу',
'userlogout' => 'Чыгуу',
'notloggedin' => 'Сиз ÑиÑтемге кире ÑлекÑиз',
+'userlogin-noaccount' => 'ЭÑеп жазууңуз жокпу?',
+'userlogin-joinproject' => ' {{SITENAME}} кошулуңуз',
'nologin' => 'Катталган ÑмеÑÑизби? $1.',
'nologinlink' => 'Катталуу',
'createaccount' => 'Катталуу',
'gotaccount' => "КатталганÑызбы? '''$1'''.",
'gotaccountlink' => 'Кирүү',
'userlogin-resetlink' => 'Кирүүчү маалыматарыңызды ÑÑиңизден чыгардыңызбы?',
+'userlogin-resetpassword-link' => 'СырÑөздү алмаштыруу',
+'helplogin-url' => 'Help:ЭÑепке кирүү',
+'userlogin-helplink' => '[[{{MediaWiki:helplogin-url}}|СиÑтемге кирүүгө жардам]]',
+'createacct-join' => 'Маалыматыңызды төмөнгө териңиз.',
+'createacct-emailrequired' => 'Эмейл дарек',
+'createacct-emailoptional' => 'Эмейл дарек (милдеттүү ÑмеÑ)',
+'createacct-email-ph' => 'Эмейл дарегиңизди киргизиңиз',
'createaccountmail' => 'Убактылуу түзүлгөн ÑÑ‹Ñ€Ñөздү колдон жана аны көрÑөтүлгөн Ñмейл дарекке жөнөт',
+'createacct-realname' => 'Чыныгы Ñ‹Ñымы (милдеттүү ÑмеÑ)',
'createaccountreason' => 'Себеби:',
+'createacct-reason' => 'Себеп',
+'createacct-reason-ph' => 'Эмне үчүн башка ÑÑеп жазуу түзүп жатаÑыз',
+'createacct-captcha' => 'КоопÑуздук текшерүүÑÒ¯',
+'createacct-imgcaptcha-ph' => 'Жогорудагы текÑтти териңиз',
+'createacct-submit' => 'Катталыңыз',
+'createacct-benefit-heading' => '{{SITENAME}} Ñиз ÑÑ‹Ñктуу кишилер тарабынан түзүлгөн.',
+'createacct-benefit-body1' => '{{PLURAL:$1|оңдоо|оңдоолор}}',
+'createacct-benefit-body2' => '{{PLURAL:$1|барак|барактар}}',
+'createacct-benefit-body3' => 'акыркы {{PLURAL:$1|Ñалым|Ñалымдар}}',
'badretype' => 'Сиз терген ÑÑ‹Ñ€Ñөздөр дал келишпейт',
'userexists' => 'Сиз тандаган колдонуучу ат бош ÑмеÑ.
Сураныч, башка атты тандаңыз.',
'loginerror' => 'Кирүү катаÑÑ‹',
+'createacct-error' => 'Катталууда ката кетти',
'createaccounterror' => '$1 ÑÑеп жазууÑун түзүү мүмкүн ÑмеÑ',
'nocookiesnew' => 'Колдонуучунун ÑÑеби түзүлгөн, бирок Ñиз аны менен али кире ÑлекÑиз. {{SITENAME}} колдонуучу кирүүÑÒ¯ үчүн куки колдонот. Сиздин кукилер өчүрүлгөн.
Ðларды жандырып, анан жаңы колдонуучу атыңыз жана ÑÑ‹Ñ€Ñөзүңүз менен кириңиз.',
@@ -472,6 +495,7 @@ $1',
'accountcreated' => 'ЭÑеп жазууÑу түзүлдү',
'createaccount-title' => '{{SITENAME}} үчүн ÑÑеп жазууÑун түзүү',
'usernamehasherror' => 'Колдонуучунун атында торчо (#) белгиÑине жол берилбейт',
+'login-throttled' => 'Сиз ÑиÑтемге кирүүгө Ó©Ñ‚Ó© көп аракет кылдыңыз. Сураныч, аракетиңизди бир аз тыныгуудан Ñоң улантыңыз.',
'login-abort-generic' => 'Сиздин кирүүңүз ийгиликÑиз болду - Үзүлдү',
'loginlanguagelabel' => 'Тили: $1',
@@ -485,7 +509,7 @@ $1',
'newpassword' => 'Жаңы ÑÑ‹Ñ€Ñөз:',
'retypenew' => 'Жаңы ÑÑ‹Ñ€Ñөздү кайра териңиз:',
'resetpass_submit' => 'СырÑөздү терип анан кирүү',
-'resetpass_success' => 'Сиздин ÑÑ‹Ñ€Ñөзүңүз ийгиликтүү өзгөртүлдү!
+'changepassword-success' => 'Сиздин ÑÑ‹Ñ€Ñөзүңүз ийгиликтүү өзгөртүлдү!
СиÑтемага кирүү аткарылып жатат...',
'resetpass_forbidden' => 'СырÑөздү өзгөртүүгө мүмкүн ÑмеÑ',
'resetpass-no-info' => 'Бул баракка түз кайрылыш үчүн, Ñиз ÑиÑтемага киришиңиз керек.',
@@ -495,6 +519,7 @@ $1',
# Special:PasswordReset
'passwordreset' => 'СырÑөздү түшүрүү',
+'passwordreset-text-one' => 'СырÑөздү алмаштыруу үчүн бул үлгүнү толтуруңуз.',
'passwordreset-legend' => 'СырÑөздү түшүрүү',
'passwordreset-disabled' => 'Бул уикиде ÑÑ‹Ñ€Ñөздү түшүрүү мүмкүнчүлүгү өчүрүлгөн.',
'passwordreset-username' => 'Колдонуучу аты:',
@@ -506,7 +531,7 @@ $1',
Убактылуу ÑÑ‹Ñ€Ñөз: $2',
'passwordreset-emailsent' => 'СырÑөздү алмаштыруу Ñмейлге жөнөтүлдү.',
'passwordreset-emailsent-capture' => 'Төмөндө көрÑөтүлгөн Ñмейлге ÑÑ‹Ñ€Ñөздү алмаштыруучу кат жөнөтүлдү.',
-'passwordreset-emailerror-capture' => 'Жаратылган ÑÑке Ñалуу каты аÑтында көрÑөтүлүп турат, бирок аны катышуучуга жөнөтүү оңунан чыккан жок: $1',
+'passwordreset-emailerror-capture' => 'Төмөндө көрÑөтүлгөн дарекке ÑÑ‹Ñ€Ñөздү алмаштыруу кат түзүлдү,бирок аны {{GENDER:$2|катышуучуга}} жөнөтүү оңунан чыккан жок: $1',
# Special:ChangeEmail
'changeemail' => 'E-mail даректи өзгөртүү',
@@ -601,6 +626,7 @@ IP дарегиңиз бул барактын оңдоо тарыхына жаз
Маалымат үчүн төмөндө өчүрүүлөрдүн жана өзгөртүүлөрдүн тизмеÑи берилген.',
'log-fulllog' => 'Журналды бүтүн бойдон көрүү',
'edit-conflict' => 'Оңдоолор конфликти',
+'postedit-confirmation' => 'Оңдооңуз Ñакталды',
'edit-already-exists' => 'Жаңы барак түзүү мүмкүн ÑмеÑ. Мындай барак бар',
'defaultmessagetext' => 'ЖарыÑланбаÑча текÑÑ‚',
@@ -718,7 +744,6 @@ IP дарегиңиз бул барактын оңдоо тарыхына жаз
'searchmenu-legend' => 'Издөө опциÑлары',
'searchmenu-exists' => "'''Бул Уикиде \"[[:\$1]]\" деп аталган барак бар.'''",
'searchmenu-new' => "'''Бул Уикиде \"[[:\$1]]\" барагын түз!'''",
-'searchhelp-url' => 'Help:Мазмун',
'searchprofile-articles' => 'Ðегизги барактар',
'searchprofile-project' => 'Жардам жана Долбоор барактары',
'searchprofile-images' => 'Мултимедиа',
@@ -755,14 +780,6 @@ IP дарегиңиз бул барактын оңдоо тарыхына жаз
'powersearch-togglenone' => 'ЭчнерÑе',
'search-external' => 'Тышкы издөө',
-# Quickbar
-'qbsettings' => 'ÐÐ°Ð²Ð¸Ð³Ð°Ñ†Ð¸Ñ Ð¿Ð°Ð½ÐµÐ»Ð¸',
-'qbsettings-none' => 'КөрÑөтпөө',
-'qbsettings-fixedleft' => 'Жылбаган Ñол',
-'qbsettings-fixedright' => 'Жылбаган оң',
-'qbsettings-floatingleft' => 'Оомо Ñол',
-'qbsettings-floatingright' => 'Оомо оң',
-
# Preferences page
'preferences' => 'ЫраÑтоолор',
'mypreferences' => 'ЫраÑтоолор',
@@ -791,7 +808,6 @@ IP дарегиңиз бул барактын оңдоо тарыхына жаз
'resetprefs' => 'Сакталбаган өзгөртүүлөрдү тазалоо',
'restoreprefs' => 'ЖарыÑланбаÑча ыраÑтоолорду калыбына келтирүү',
'prefs-editing' => 'Оңдоп-түзөө',
-'prefs-edit-boxsize' => 'Редакторлоо терезеÑинин өлчөмү.',
'rows' => 'Сап:',
'columns' => 'Тилке:',
'searchresultshead' => 'Издөө',
@@ -819,7 +835,6 @@ IP дарегиңиз бул барактын оңдоо тарыхына жаз
'prefs-custom-css' => 'Өз CSS',
'prefs-custom-js' => 'Өз JavaScript',
'prefs-emailconfirm-label' => 'Эл. почтаны аныктоо:',
-'prefs-textboxsize' => 'Редакторлоо терезеÑинин өлчөмү',
'youremail' => 'Электрондук дарек:',
'username' => '{{GENDER:$1|Колдонуучу аты}}:',
'uid' => '{{GENDER:$1|Колдонуучунун}} коду:',
@@ -957,7 +972,6 @@ HTML-тегдеринин тууралыгын текшериңиз.',
'recentchangeslinked-feed' => 'Тиешелүү өзгөрүүлөр',
'recentchangeslinked-toolbox' => 'Байланыштуу өзгөрүүлөр',
'recentchangeslinked-title' => '"$1" үчүн тийиштүү өзгөртүүлөр',
-'recentchangeslinked-noresult' => 'Берилген мөөнөттө шилтемеленген барактарда өзгөртүү жок.',
'recentchangeslinked-summary' => 'Бул көрÑөтүлгөн (же көрÑөтүлгөн категориÑга кирген) барактан шилтемеленген барактардагы жакын арада жаÑалган өзгөрүүлөрдүн тизмеÑи.
[[Special:Watchlist|Көзөмөл тизмеңиз]]деги барактар калын арип менен белгиленген.',
'recentchangeslinked-page' => 'Барактын аталышы:',
@@ -1077,8 +1091,6 @@ To include a file in a page, use a link in one of the following forms:
'statistics-pages' => 'Барактар',
'statistics-files' => 'Жүктөлгөн файлдар',
-'disambiguationspage' => 'Template:көп маанилүү',
-
'brokenredirects-edit' => 'оңдоо',
'brokenredirects-delete' => 'өчүрүү',
@@ -1297,7 +1309,6 @@ To include a file in a page, use a link in one of the following forms:
'block-log-flags-nocreate' => 'ÑÑеп жазууÑун жаратуу өчүрүлгөн',
'block-log-flags-noemail' => 'кат жөнөтүүгө тыюу Ñалынган',
'block-log-flags-hiddenname' => 'колдонуучу аты жашырылган',
-'blockme' => 'Мени бөгөттө',
'proxyblocker' => 'ПрокÑини блокировкалоо',
# Developer tools
@@ -1536,7 +1547,7 @@ To include a file in a page, use a link in one of the following forms:
* gpslongitude
* gpsaltitude',
-# EXIF tags
+# Exif tags
'exif-imagewidth' => 'ТуураÑÑ‹',
'exif-imagelength' => 'Бийиктиги',
'exif-imagedescription' => 'Сүрөт аты',
@@ -1581,7 +1592,7 @@ To include a file in a page, use a link in one of the following forms:
'exif-intellectualgenre' => 'Объекттин түрү',
'exif-subjectnewscode' => 'Теманын коду',
-# EXIF attributes
+# Exif attributes
'exif-compression-1' => 'КыÑтырылбаган',
'exif-copyrighted-true' => 'Ðвтордук укук менен корголгон',
@@ -1733,11 +1744,6 @@ To include a file in a page, use a link in one of the following forms:
'version-software-version' => 'ВерÑиÑ',
'version-entrypoints-header-url' => 'URL',
-# Special:FilePath
-'filepath' => 'Файл жолу',
-'filepath-page' => 'Файл:',
-'filepath-submit' => 'Өтүү',
-
# Special:FileDuplicateSearch
'fileduplicatesearch-filename' => 'Файл аты:',
'fileduplicatesearch-submit' => 'Издөө',
diff --git a/languages/messages/MessagesLa.php b/languages/messages/MessagesLa.php
index 298cc279..178251ca 100644
--- a/languages/messages/MessagesLa.php
+++ b/languages/messages/MessagesLa.php
@@ -73,91 +73,92 @@ $dateFormats = array(
);
$specialPageAliases = array(
- 'Allmessages' => array( 'Nuntia systematis' ),
- 'Allpages' => array( 'Paginae omnes', 'Omnes paginae' ),
- 'Ancientpages' => array( 'Paginae veterrimae' ),
- 'Blankpage' => array( 'Pagina vacua' ),
- 'Block' => array( 'Usorem obstruere' ),
- 'Blockme' => array( 'Usor obstructus' ),
- 'Booksources' => array( 'Librorum fontes' ),
- 'BrokenRedirects' => array( 'Redirectiones fractae' ),
+ 'Allmessages' => array( 'Nuntia_systematis' ),
+ 'Allpages' => array( 'Paginae_omnes', 'Omnes_paginae' ),
+ 'Ancientpages' => array( 'Paginae_veterrimae' ),
+ 'Blankpage' => array( 'Pagina_vacua' ),
+ 'Block' => array( 'Usorem_obstruere' ),
+ 'Blockme' => array( 'Usor_obstructus' ),
+ 'Booksources' => array( 'Librorum_fontes' ),
+ 'BrokenRedirects' => array( 'Redirectiones_fractae' ),
'Categories' => array( 'Categoriae' ),
- 'ChangePassword' => array( 'Tesseram novam creare' ),
- 'Confirmemail' => array( 'Inscriptionem electronicam confirmare' ),
- 'Contributions' => array( 'Conlationes', 'Conlationes usoris' ),
- 'CreateAccount' => array( 'Rationem creare' ),
- 'Deadendpages' => array( 'Paginae sine nexu' ),
- 'DeletedContributions' => array( 'Conlationes deletae', 'Conlationes usoris deletae' ),
- 'Disambiguations' => array( 'Paginae disambiguationis', 'Disambiguationes' ),
- 'DoubleRedirects' => array( 'Redirectiones duplices' ),
- 'Emailuser' => array( 'Litteras electronicas usori mittere', 'Littera electronica' ),
- 'Export' => array( 'Exportare', 'Paginas exportare' ),
- 'Fewestrevisions' => array( 'Paginae minime mutatae' ),
- 'FileDuplicateSearch' => array( 'Quaerere fasciculos duplices', 'Quaerere imagines duplices' ),
- 'Import' => array( 'Importare', 'Paginas importare' ),
- 'Invalidateemail' => array( 'Adfimationem inscriptionis electronicae abrogare' ),
- 'BlockList' => array( 'Usores obstructi' ),
- 'LinkSearch' => array( 'Quaerere nexus externos' ),
+ 'ChangePassword' => array( 'Tesseram_novam_creare' ),
+ 'Confirmemail' => array( 'Inscriptionem_electronicam_confirmare' ),
+ 'Contributions' => array( 'Conlationes', 'Conlationes_usoris' ),
+ 'CreateAccount' => array( 'Rationem_creare' ),
+ 'Deadendpages' => array( 'Paginae_sine_nexu' ),
+ 'DeletedContributions' => array( 'Conlationes_deletae', 'Conlationes_usoris_deletae' ),
+ 'Disambiguations' => array( 'Paginae_disambiguationis', 'Disambiguationes' ),
+ 'DoubleRedirects' => array( 'Redirectiones_duplices' ),
+ 'Emailuser' => array( 'Litteras_electronicas_usori_mittere', 'Littera_electronica' ),
+ 'Export' => array( 'Exportare', 'Paginas_exportare' ),
+ 'Fewestrevisions' => array( 'Paginae_minime_mutatae' ),
+ 'FileDuplicateSearch' => array( 'Quaerere_fasciculos_duplices', 'Quaerere_imagines_duplices' ),
+ 'Import' => array( 'Importare', 'Paginas_importare' ),
+ 'Invalidateemail' => array( 'Adfimationem_inscriptionis_electronicae_abrogare' ),
+ 'BlockList' => array( 'Usores_obstructi' ),
+ 'LinkSearch' => array( 'Quaerere_nexus_externos' ),
'Listadmins' => array( 'Magistratus' ),
'Listbots' => array( 'Automata' ),
'Listfiles' => array( 'Fasciculi', 'Imagines' ),
- 'Listgrouprights' => array( 'Gregum usorum potestates', 'Iura gregum' ),
+ 'Listgrouprights' => array( 'Gregum_usorum_potestates', 'Iura_gregum' ),
'Listredirects' => array( 'Redirectiones' ),
'Listusers' => array( 'Usores' ),
- 'Lockdb' => array( 'Basem datorum obstruere' ),
+ 'Lockdb' => array( 'Basem_datorum_obstruere' ),
'Log' => array( 'Acta' ),
- 'Lonelypages' => array( 'Paginae non annexae' ),
- 'Longpages' => array( 'Paginae longae' ),
- 'MergeHistory' => array( 'Historias paginarum confundere' ),
- 'MIMEsearch' => array( 'Quaerere per MIME' ),
- 'Mostcategories' => array( 'Paginae plurimis categoriis' ),
- 'Mostimages' => array( 'Fasciculi maxime annexi', 'Imagines maxime annexae' ),
- 'Mostlinked' => array( 'Paginae maxime annexae' ),
- 'Mostlinkedcategories' => array( 'Categoriae maxime annexae' ),
- 'Mostlinkedtemplates' => array( 'Formulae maxime annexae' ),
- 'Mostrevisions' => array( 'Paginae plurimum mutatae' ),
- 'Movepage' => array( 'Paginam movere', 'Movere' ),
- 'Mycontributions' => array( 'Conlationes meae' ),
- 'Mypage' => array( 'Pagina mea' ),
- 'Mytalk' => array( 'Disputatio mea' ),
- 'Newimages' => array( 'Fasciculi novi', 'Imagines novae' ),
- 'Newpages' => array( 'Paginae novae' ),
- 'Popularpages' => array( 'Paginae saepe monstratae' ),
+ 'Lonelypages' => array( 'Paginae_non_annexae' ),
+ 'Longpages' => array( 'Paginae_longae' ),
+ 'MergeHistory' => array( 'Historias_paginarum_confundere' ),
+ 'MIMEsearch' => array( 'Quaerere_per_MIME' ),
+ 'Mostcategories' => array( 'Paginae_plurimis_categoriis' ),
+ 'Mostimages' => array( 'Fasciculi_maxime_annexi', 'Imagines_maxime_annexae' ),
+ 'Mostlinked' => array( 'Paginae_maxime_annexae' ),
+ 'Mostlinkedcategories' => array( 'Categoriae_maxime_annexae' ),
+ 'Mostlinkedtemplates' => array( 'Formulae_maxime_annexae' ),
+ 'Mostrevisions' => array( 'Paginae_plurimum_mutatae' ),
+ 'Movepage' => array( 'Paginam_movere', 'Movere' ),
+ 'Mycontributions' => array( 'Conlationes_meae' ),
+ 'Mypage' => array( 'Pagina_mea' ),
+ 'Mytalk' => array( 'Disputatio_mea' ),
+ 'Newimages' => array( 'Fasciculi_novi', 'Imagines_novae' ),
+ 'Newpages' => array( 'Paginae_novae' ),
+ 'Popularpages' => array( 'Paginae_saepe_monstratae' ),
'Preferences' => array( 'Praeferentiae' ),
- 'Prefixindex' => array( 'Praefixa', 'Quaerere per praefixa' ),
- 'Protectedpages' => array( 'Paginae protectae' ),
- 'Protectedtitles' => array( 'Tituli protecti' ),
- 'Randompage' => array( 'Pagina fortuita' ),
- 'Randomredirect' => array( 'Redirectio fortuita' ),
- 'Recentchanges' => array( 'Nuper mutata', 'Mutationes recentes' ),
- 'Recentchangeslinked' => array( 'Nuper mutata annexorum' ),
- 'Revisiondelete' => array( 'Emendationem delere' ),
+ 'Prefixindex' => array( 'Praefixa', 'Quaerere_per_praefixa' ),
+ 'Protectedpages' => array( 'Paginae_protectae' ),
+ 'Protectedtitles' => array( 'Tituli_protecti' ),
+ 'Randompage' => array( 'Pagina_fortuita' ),
+ 'Randomredirect' => array( 'Redirectio_fortuita' ),
+ 'Recentchanges' => array( 'Nuper_mutata', 'Mutationes_recentes' ),
+ 'Recentchangeslinked' => array( 'Nuper_mutata_annexorum' ),
+ 'Redirect' => array( 'Redirectio' ),
+ 'Revisiondelete' => array( 'Emendationem_delere' ),
'Search' => array( 'Quaerere' ),
- 'Shortpages' => array( 'Paginae breves' ),
- 'Specialpages' => array( 'Paginae speciales' ),
+ 'Shortpages' => array( 'Paginae_breves' ),
+ 'Specialpages' => array( 'Paginae_speciales' ),
'Statistics' => array( 'Census' ),
- 'Uncategorizedcategories' => array( 'Categoriae sine categoriis' ),
- 'Uncategorizedimages' => array( 'Fasciculi sine categoriis', 'Imagines sine categoriis' ),
- 'Uncategorizedpages' => array( 'Paginae sine categoriis' ),
- 'Uncategorizedtemplates' => array( 'Formulae sine categoriis' ),
- 'Undelete' => array( 'Paginam restituere' ),
- 'Unlockdb' => array( 'Basem datorum deobstruere' ),
- 'Unusedcategories' => array( 'Categoriae non in usu', 'Categoriae vacuae' ),
- 'Unusedimages' => array( 'Fasciculi non in usu', 'Imagines non in usu' ),
- 'Unusedtemplates' => array( 'Formulae non in usu' ),
- 'Unwatchedpages' => array( 'Paginae incustoditae' ),
- 'Upload' => array( 'Fasciculos onerare', 'Imagines onerare' ),
- 'Userlogin' => array( 'Conventum aperire' ),
- 'Userlogout' => array( 'Conventum concludere' ),
- 'Userrights' => array( 'Usorum potestates', 'Iura usorum' ),
+ 'Uncategorizedcategories' => array( 'Categoriae_sine_categoriis' ),
+ 'Uncategorizedimages' => array( 'Fasciculi_sine_categoriis', 'Imagines_sine_categoriis' ),
+ 'Uncategorizedpages' => array( 'Paginae_sine_categoriis' ),
+ 'Uncategorizedtemplates' => array( 'Formulae_sine_categoriis' ),
+ 'Undelete' => array( 'Paginam_restituere' ),
+ 'Unlockdb' => array( 'Basem_datorum_deobstruere' ),
+ 'Unusedcategories' => array( 'Categoriae_non_in_usu', 'Categoriae_vacuae' ),
+ 'Unusedimages' => array( 'Fasciculi_non_in_usu', 'Imagines_non_in_usu' ),
+ 'Unusedtemplates' => array( 'Formulae_non_in_usu' ),
+ 'Unwatchedpages' => array( 'Paginae_incustoditae' ),
+ 'Upload' => array( 'Fasciculos_onerare', 'Imagines_onerare' ),
+ 'Userlogin' => array( 'Conventum_aperire' ),
+ 'Userlogout' => array( 'Conventum_concludere' ),
+ 'Userrights' => array( 'Usorum_potestates', 'Iura_usorum' ),
'Version' => array( 'Versio' ),
- 'Wantedcategories' => array( 'Categoriae desideratae' ),
- 'Wantedfiles' => array( 'Fasciculi desiderati', 'Imagines desideratae' ),
- 'Wantedpages' => array( 'Paginae desideratae', 'Nexus fracti' ),
- 'Wantedtemplates' => array( 'Formulae desideratae' ),
- 'Watchlist' => array( 'Paginae custoditae' ),
- 'Whatlinkshere' => array( 'Nexus ad paginam' ),
- 'Withoutinterwiki' => array( 'Paginae sine nexibus ad linguas alias', 'Paginae sine nexibus intervicis' ),
+ 'Wantedcategories' => array( 'Categoriae_desideratae' ),
+ 'Wantedfiles' => array( 'Fasciculi_desiderati', 'Imagines_desideratae' ),
+ 'Wantedpages' => array( 'Paginae_desideratae', 'Nexus_fracti' ),
+ 'Wantedtemplates' => array( 'Formulae_desideratae' ),
+ 'Watchlist' => array( 'Paginae_custoditae' ),
+ 'Whatlinkshere' => array( 'Nexus_ad_paginam' ),
+ 'Withoutinterwiki' => array( 'Paginae_sine_nexibus_ad_linguas_alias', 'Paginae_sine_nexibus_intervicis' ),
);
$messages = array(
@@ -191,9 +192,6 @@ $messages = array(
'tog-shownumberswatching' => 'Numerum usorum custodientium monstrare',
'tog-oldsig' => 'Subscriptio ad tempus adhibita:',
'tog-fancysig' => 'Subscriptio vicitext (sine nexu automatico)',
-'tog-externaleditor' => 'Editore externo semper uti (periti tantum: necesse est organa propria in computatro habere. [//www.mediawiki.org/wiki/Manual:External_editors adiutatum (Anglice)])',
-'tog-externaldiff' => 'Editore dissimilitudinum externo semper uti (periti tantum: necesse est organa propria in computatro habere. [//www.mediawiki.org/wiki/Manual:External_editors adiutatum (Anglice)])',
-'tog-showjumplinks' => 'Sinere nexus ostendi forma "salire ad" monstrata',
'tog-uselivepreview' => 'Praevisum viventem adhibere (experimentalis)',
'tog-forceeditsummary' => 'Si recensionem non summatim descripsero, me roga si continuare velim',
'tog-watchlisthideown' => 'Celare recensiones meas in paginarum custoditarum indice',
@@ -262,6 +260,18 @@ $messages = array(
'oct' => 'Oct',
'nov' => 'Nov',
'dec' => 'Dec',
+'january-date' => '$1 Ianuarii',
+'february-date' => '$1 Februarii',
+'march-date' => '$1 Martii',
+'april-date' => '$1 Aprilis',
+'may-date' => '$1 Maii',
+'june-date' => '$1 Iunii',
+'july-date' => '$1 Iulii',
+'august-date' => '$1 Augusti',
+'september-date' => '$1 Septembris',
+'october-date' => '$1 Octobris',
+'november-date' => '$1 Novembris',
+'december-date' => '$1 Decembris',
# Categories related messages
'pagecategories' => '{{PLURAL:$1|Categoria|Categoriae}}',
@@ -340,6 +350,7 @@ $messages = array(
'create-this-page' => 'Creare hanc paginam',
'delete' => 'Delere',
'deletethispage' => 'Delere hanc paginam',
+'undeletethispage' => 'Hanc paginam restituere',
'undelete_short' => 'Restituere {{PLURAL:$1|unam emendationem|$1 emendationes}}',
'viewdeleted_short' => 'Inspicere {{PLURAL:$1|unam emendationem deletam|$1 emendationes deletas}}',
'protect' => 'Protegere',
@@ -376,7 +387,7 @@ $messages = array(
'jumptosearch' => 'quaerere',
'pool-errorunknown' => 'Error ignotus',
-# 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).
+# 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).
'aboutsite' => 'De {{grammar:ablative|{{SITENAME}}}}',
'aboutpage' => 'Project:De {{GRAMMAR:ablative|{{SITENAME}}}}',
'copyright' => 'Res ad manum sub $1 nisi aliter denuntiatum est.',
@@ -386,7 +397,6 @@ $messages = array(
'disclaimers' => 'Repudiationes',
'disclaimerpage' => 'Project:Repudiationes',
'edithelp' => 'Opes recensendi',
-'edithelppage' => 'Help:De recensendo',
'helppage' => 'Help:Adiutatum',
'mainpage' => 'Pagina prima',
'mainpage-description' => 'Pagina prima',
@@ -460,11 +470,6 @@ Pro indice paginarum specialum validarum, vide [[Special:SpecialPages|{{int:spec
# General errors
'error' => 'Erratum',
'databaseerror' => 'Erratum in basi datorum',
-'dberrortextcl' => 'Erratum syntacticum basis datorum accidit.
-Inquisitio basis datorum ultime apparata erat:
-"$1"
-ex functionis "$2".
-Basis datorum erratum reddidit "$3: $4"',
'readonly' => 'Basis datorum obstructa',
'missingarticle-rev' => '(numerus emendationis: $1)',
'missingarticle-diff' => '(Diss: $1, $2)',
@@ -492,7 +497,6 @@ Inquisitio: $2',
'viewsourcetext' => 'Fontem videas et exscribeas:',
'protectedinterface' => 'Haec pagina dat textum interfaciei pro logiciali, et est protecta ad vandalismum vetandum.',
'editinginterface' => "'''Caveat censor:''' Emendas iam paginam quae textum interfaciei logicialem dat. Mutationes vultum {{grammar:genitive|{{SITENAME}}}} omnibus usoribus afficient. In nuntia MediaWiki vertendo, quaesumus te uti [//translatewiki.net/wiki/Main_Page?setlang=la translatewiki.net].",
-'sqlhidden' => '(inquisitio SQL celata)',
'namespaceprotected' => "Tibi non licet paginas spatii nominalis '''$1''' recensere.",
'ns-specialprotected' => 'Paginae speciales recenseri non possunt.',
'titleprotected' => 'Hic titulus protectus est ab usore [[User:$1|$1]] ne creetur.
@@ -513,8 +517,16 @@ Nota bene paginas fortasse videantur quasi tuum conventum esset apertum, priusqu
'welcomecreation-msg' => 'Ratio tua creata est.
Noli oblivisci [[Special:Preferences|praeferentias]] tuas apud {{grammar:accusative|{{SITENAME}}}} mutare.',
'yourname' => 'Nomen usoris:',
+'userlogin-yourname' => 'Nomen usoris',
+'userlogin-yourname-ph' => 'Nomen usoris tuum inscribe',
+'createacct-another-username-ph' => 'Nomen usoris inscribe',
'yourpassword' => 'Tessera:',
+'userlogin-yourpassword' => 'Tessera',
+'userlogin-yourpassword-ph' => 'Tesseram tuam inscribe',
+'createacct-yourpassword-ph' => 'Tesseram inscribe',
'yourpasswordagain' => 'Tesseram adfirmare:',
+'createacct-yourpasswordagain' => 'Tesseram confirmare',
+'createacct-yourpasswordagain-ph' => 'Tesseram iterum inscribe',
'remembermypassword' => 'Tesseram meam hoc in navigatro inter conventa memento ({{PLURAL:$1|die|diebus}} $1 tenus)',
'yourdomainname' => 'Regnum tuum:',
'login' => 'Conventum aperire',
@@ -525,18 +537,33 @@ Noli oblivisci [[Special:Preferences|praeferentias]] tuas apud {{grammar:accusat
'logout' => 'Conventum concludere',
'userlogout' => 'Conventum concludere',
'notloggedin' => 'Conventum non est apertum',
+'userlogin-noaccount' => 'Num rationem non habes?',
'nologin' => 'Num rationem non habes? $1.',
'nologinlink' => 'Eam crea',
'createaccount' => 'Rationem novam creare',
'gotaccount' => "Habesne iam rationem? '''$1'''.",
'gotaccountlink' => 'Conventum aperi',
'userlogin-resetlink' => 'Num tesserae tuae oblitus es?',
+'helplogin-url' => 'Help:Conventum aperire',
+'createacct-emailrequired' => 'Inscriptio electronica',
+'createacct-emailoptional' => 'Inscriptio electronica (non necesse)',
+'createacct-email-ph' => 'Inscriptionem electronicam tuam inscribe',
+'createacct-another-email-ph' => 'Inscriptionem electronicam inscribe',
'createaccountmail' => 'Use a temporary random password and send it to the email address specified below',
+'createacct-realname' => 'Nomen rectum (non necesse)',
'createaccountreason' => 'Causa:',
+'createacct-reason' => 'Causa',
+'createacct-reason-ph' => 'Cur aliam rationem creas',
+'createacct-imgcaptcha-ph' => 'Textum quem supra vidis inscribe',
+'createacct-submit' => 'Rationem tuam creare',
+'createacct-another-submit' => 'Aliam rationem creare',
+'createacct-benefit-body1' => '{{PLURAL:$1|recensio|recensiones}}',
+'createacct-benefit-body2' => '{{PLURAL:$1|pagina|paginae}}',
'badretype' => 'Tesserae quas scripsisti inter se non congruunt.',
'userexists' => 'Nomen usoris quod selegisti iam est.
Nomen usoris alium selige.',
'loginerror' => 'Error factus est in aperiendo conventum',
+'createacct-error' => 'Error in ratione creanda',
'createaccounterror' => 'Rationem creare non potuit: $1',
'nocookiesnew' => "Ratio usoris creata est, sed conventum non apertum est. {{SITENAME}} ''Cookies'' utitur in usorum conventa aperiendo. Cookies tua debiles sunt. Eis potestatem fac, tum conventum aperi cum nomine usoris tesseraque tua nova.",
'nocookieslogin' => "{{SITENAME}} ''Cookies'' utitur in usorum conventa aperiendo. Cookies tua debiles sunt. Eis potestatem fac, tum conare denuo.",
@@ -584,7 +611,7 @@ Hunc nuntium ignorare potes, si nolis hac ratione uti.',
'newpassword' => 'Tessera nova:',
'retypenew' => 'Adfirmare tesseram novam:',
'resetpass_submit' => 'Tesseram mutare et conventum aperire',
-'resetpass_success' => 'Tessera tua prospere mutata est. Aperiens conventum...',
+'changepassword-success' => 'Tessera tua prospere mutata est.',
'resetpass_forbidden' => 'Tesserae mutari non possunt',
'resetpass-no-info' => 'Necesse est conventum aperire ad hanc paginam adhibendum.',
'resetpass-submit-loggedin' => 'Tesseram mutare',
@@ -840,6 +867,7 @@ Titulus: '''({{int:cur}})''' = dissimilis ab emendatione novissima,
'compareselectedversions' => 'Conferre emendationes selectas',
'showhideselectedversions' => 'Monstrare/celare emendationes selectas',
'editundo' => 'abrogare',
+'diff-empty' => '(Nulla dissimilitudo)',
'diff-multi' => '(Inter has {{PLURAL:$1|una emendatio|$1 emendationes}} ab {{PLURAL:$2|uno usore|$2 usoribus}} {{PLURAL:$1|facta|factae}} non {{PLURAL:$1|videtur|videntur}})',
# Search results
@@ -861,7 +889,6 @@ Titulus: '''({{int:cur}})''' = dissimilis ab emendatione novissima,
'searchmenu-legend' => 'Optiones',
'searchmenu-exists' => "'''Iam est pagina \"[[:\$1]]\"'''",
'searchmenu-new' => "'''Creare paginam \"[[:\$1]]\"'''",
-'searchhelp-url' => 'Help:Adiutatum',
'searchprofile-articles' => 'Paginae contentorum',
'searchprofile-project' => 'Paginae adiutati et incepti',
'searchprofile-images' => 'Multimedia',
@@ -899,14 +926,7 @@ Conare praefixare tua inquisitionem cum ''all:'' ut quaeras contenta omnia (pagi
'powersearch-togglenone' => 'Nullum',
'search-external' => 'Inquisitio externalis',
'searchdisabled' => 'Per {{grammar:accusative|{{SITENAME}}}} ad tempus non potes quaerere. Interea per [http://www.google.com Googlem] quaeras. Nota indices {{grammar:genitive|{{SITENAME}}}} contentorum apud Googlem fortasse antiquiores esse.',
-
-# Quickbar
-'qbsettings' => 'Figuratio claustri celeris',
-'qbsettings-none' => 'Nullus',
-'qbsettings-fixedleft' => 'Constituere a sinistra',
-'qbsettings-fixedright' => 'Constituere a dextra',
-'qbsettings-floatingleft' => 'Innens a sinistra',
-'qbsettings-floatingright' => 'Innens a dextra',
+'search-error' => 'Error in quaerendo: $1',
# Preferences page
'preferences' => 'Praeferentiae',
@@ -935,7 +955,6 @@ Conare praefixare tua inquisitionem cum ''all:'' ut quaeras contenta omnia (pagi
'saveprefs' => 'Servare praeferentias',
'resetprefs' => 'Reddere praeferentias',
'prefs-editing' => 'Mensura capsae verbi',
-'prefs-edit-boxsize' => 'Magnitudo capsae recensionis.',
'rows' => 'Lineae:',
'columns' => 'Columnae:',
'searchresultshead' => 'Figuratio eventorum investigationis',
@@ -968,7 +987,6 @@ Conare praefixare tua inquisitionem cum ''all:'' ut quaeras contenta omnia (pagi
'prefs-custom-css' => 'CSS proprium',
'prefs-custom-js' => 'JS proprium',
'prefs-emailconfirm-label' => 'Adfirmatio inscriptionis electronicae:',
-'prefs-textboxsize' => 'Magnitudo capsae recensionis',
'youremail' => 'Inscriptio electronica:',
'username' => 'Nomen usoris:',
'uid' => 'ID usoris:',
@@ -994,6 +1012,7 @@ Si vis id dare, opera tua tibi ascribentur.',
'prefs-info' => 'Informatio basica',
'prefs-i18n' => 'Internationalizatio',
'prefs-signature' => 'Subscriptio',
+'prefs-preview' => 'Praevisum',
'prefs-advancedwatchlist' => 'Praeferentiae monstrare',
'prefs-displayrc' => 'Praeferentiae vultus',
'prefs-displaysearchoptions' => 'Praeferentiae vultus',
@@ -1113,9 +1132,12 @@ Si vis id dare, opera tua tibi ascribentur.',
'action-userrights' => 'omnes potestates usorum recensere',
'action-userrights-interwiki' => 'potestates usorum aliis in vicis recensere',
'action-siteadmin' => 'basem datorum obstruere vel deobstruere',
+'action-editmywatchlist' => 'Recensere paginas custoditas',
+'action-viewmywatchlist' => 'Spectare paginas custoditas',
# Recent changes
'nchanges' => '$1 {{PLURAL:$1|mutatio|mutationes}}',
+'enhancedrc-history' => 'Historia',
'recentchanges' => 'Nuper mutata',
'recentchanges-legend' => 'Indicis paginarum nuper mutatarum praeferentiae',
'recentchanges-summary' => 'Inspice mutationes recentes huic vici in hac pagina.',
@@ -1160,7 +1182,7 @@ Si vis id dare, opera tua tibi ascribentur.',
'uploadbtn' => 'Fasciculum imponere',
'reuploaddesc' => 'Siste imponere et ad imponendi formam redi',
'uploadnologin' => 'Conventum non est apertum',
-'uploadnologintext' => 'Oportet [[Special:UserLogin|aperire conventum]] ut fasciculos imponas.',
+'uploadnologintext' => 'Necesse est tibi $1 priusquam fasciculos imponas.',
'uploaderror' => 'Imponendi erratum',
'uploadtext' => "Utere formam subter ad fasciculos imponendos.
Ut fasciculos antea impositos videas aut quaeras, adi ad [[Special:FileList|indicem fasciculorum impositorum]]. Fasciculi impositi et deleti quoque in [[Special:Log/upload|notatione fasciculorum impositorum]] notantur.
@@ -1301,6 +1323,9 @@ Fortasse [$2 paginam descriptionis fasciculi] ibi sitam recensere vis.',
'randompage' => 'Pagina fortuita',
'randompage-nopages' => 'Non est ulla pagina {{PLURAL:$2|hoc in spatio nominale|in his spatiis nominalibus}}: $1.',
+# Random page in category
+'randomincategory-selectcategory-submit' => 'Pergere',
+
# Random redirect
'randomredirect' => 'Redirectio fortuita',
'randomredirect-nopages' => 'Non est ulla redirectio in spatio nominali "$1".',
@@ -1325,12 +1350,6 @@ Fortasse [$2 paginam descriptionis fasciculi] ibi sitam recensere vis.',
'statistics-users-active-desc' => 'Usores qui {{PLURAL:$1|proxima die|proximis $1 diebus}} actionem perfecerunt',
'statistics-mostpopular' => 'Paginae plurimum visae',
-'disambiguations' => 'Paginae quae ad paginas discretivas nectunt',
-'disambiguationspage' => 'Template:Discretiva',
-'disambiguations-text' => "Paginae subter ad '''paginam discretivam''' nectunt.
-Eae ad aptas paginas magis nectendae sunt.<br />
-Pagina discretivam esse putatur si formulam adhibet ad quem [[MediaWiki:Disambiguationspage]] nectit.",
-
'pageswithprop-submit' => 'Pergere',
'doubleredirects' => 'Redirectiones duplices',
@@ -1524,7 +1543,6 @@ Mutationes posthac huic paginae et paginae disputationis ibi notabuntur.',
'unwatchthispage' => 'Abrogare custoditum',
'notanarticle' => 'Res non est',
'notvisiblerev' => 'Emendatio deleta est',
-'watchnochange' => 'Nullae paginarum custoditarum tuarum recensitae sunt in hoc tempore.',
'watchlist-details' => '{{PLURAL:$1|$1 pagina|$1 paginae}} in indice paginarum custoditarum tuarum, sine paginis disputationis.',
'watchmethod-recent' => 'recensita recenta quaerens pro pagina custodita',
'watchmethod-list' => 'paginas custoditas quaerens pro recensitis recentibus',
@@ -1815,10 +1833,7 @@ Commodule notatio obstructionum subter datur.',
'ipb_already_blocked' => '"$1" iam obstructus est',
'ipb-needreblock' => '$1 iam obstructus est. Visne obstructionem modificare?',
'ip_range_invalid' => 'Latitudo IP irrita.',
-'blockme' => 'Usor obstructus',
'proxyblocker' => 'Instrumentum obstructionis moderatorum',
-'proxyblocker-disabled' => 'Haec functio prohibita est.',
-'proxyblocksuccess' => 'Factum.',
'cant-block-while-blocked' => 'Dum obstructus es, non potes usores alios obstruere.',
# Developer tools
@@ -2038,7 +2053,6 @@ Paginae nomen petitum "[[:$1]]" iam existit. Vin tu eam delere ut pagina illic m
'pageinfo-toolboxlink' => 'De hac pagina',
# Skin names
-'skinname-standard' => 'Norma',
'skinname-cologneblue' => 'Caerulus Colonia',
# Patrolling
@@ -2086,7 +2100,7 @@ Paginae nomen petitum "[[:$1]]" iam existit. Vin tu eam delere ut pagina illic m
'metadata-expand' => 'Plura ostende',
'metadata-collapse' => 'Partim celare',
-# EXIF tags
+# Exif tags
'exif-imagewidth' => 'Amplitudo',
'exif-imagelength' => 'Altitudo',
'exif-bitspersample' => 'Biti per componentem',
@@ -2160,7 +2174,7 @@ Paginae nomen petitum "[[:$1]]" iam existit. Vin tu eam delere ut pagina illic m
'exif-gpsdifferential' => 'Correctio differentialis GPS',
'exif-source' => 'Fons',
-# EXIF attributes
+# Exif attributes
'exif-compression-1' => 'Incompressus',
'exif-unknowndate' => 'Dies ignota',
@@ -2381,7 +2395,6 @@ Quaesumus, adfirma ut iterum hanc paginam crees.",
'version-variables' => 'Variabilia',
'version-other' => 'Alia',
'version-hooks' => 'Extensiones',
-'version-extension-functions' => 'Functiones extensionum',
'version-parser-function-hooks' => 'Extensiones functionum programmatis analysis lexicalis',
'version-hook-name' => 'Nomen extensionis',
'version-hook-subscribedby' => 'Subscriptum ab',
@@ -2390,11 +2403,6 @@ Quaesumus, adfirma ut iterum hanc paginam crees.",
'version-software-product' => 'Productum',
'version-software-version' => 'Versio',
-# Special:FilePath
-'filepath' => 'Fasciculorum inscriptio',
-'filepath-page' => 'Fasciculus:',
-'filepath-submit' => 'Ire',
-
# Special:FileDuplicateSearch
'fileduplicatesearch-legend' => 'Duplicatum quaerere',
'fileduplicatesearch-filename' => 'Fasciculi nomen:',
diff --git a/languages/messages/MessagesLad.php b/languages/messages/MessagesLad.php
index 71f6e9fc..e33bc4de 100644
--- a/languages/messages/MessagesLad.php
+++ b/languages/messages/MessagesLad.php
@@ -34,8 +34,8 @@ $namespaceNames = array(
NS_TEMPLATE_TALK => 'Diskusyón_de_Xabló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',
+ NS_CATEGORY => 'Kateggoría',
+ NS_CATEGORY_TALK => 'Diskusyón_de_Kateggoría',
);
$namespaceAliases = array(
@@ -66,8 +66,8 @@ $namespaceAliases = array(
'Xabblón' => NS_TEMPLATE,
'Diskusyón_de_Xabblón' => NS_TEMPLATE_TALK,
'Diskussión_de_Ayudo' => NS_HELP_TALK,
- 'Kateggoría' => NS_CATEGORY,
- 'Diskussión_de_Kateggoría' => NS_CATEGORY_TALK,
+ 'Katēggoría' => NS_CATEGORY,
+ 'Diskusyón_de_Katēggoría' => NS_CATEGORY_TALK,
);
// Remove Spanish gender aliases (bug 37090)
@@ -211,9 +211,6 @@ $messages = array(
'tog-shownumberswatching' => 'Àmostrar el kadhar de usadores que están akavidando las hojas',
'tog-oldsig' => 'La firma presente',
'tog-fancysig' => 'Tratar la firma como un vikiteksto (sin un atamiento otomatiko)',
-'tog-externaleditor' => 'Yir usando un ēdditor esterno (es sólo para usadores adelantados; tiene menester de ayares especiales en vuestro contador [//www.mediawiki.org/wiki/Manual:External_editors Para saver más.])',
-'tog-externaldiff' => 'Yir usando un comparador (diff) esterno (sólo es para usadores adelantados; tiene menester de ayares especiales en vuestro contador [//www.mediawiki.org/wiki/Manual:External_editors Para saver más.])',
-'tog-showjumplinks' => 'Aktivar los atamientos de ayudo "{{int:jumpto}}"',
'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',
@@ -402,7 +399,7 @@ $messages = array(
'jumptonavigation' => 'navigación',
'jumptosearch' => 'búsquida',
-# 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).
+# 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).
'aboutsite' => 'Encima de la {{SITENAME}}',
'aboutpage' => 'Project:Encima de',
'copyright' => 'El contenido se puede topar debaxo de la <i>$1</i>',
@@ -412,7 +409,6 @@ $messages = array(
'disclaimers' => 'Refuso de responsabilitá',
'disclaimerpage' => 'Project:Refuso de responsabilitá jeneral',
'edithelp' => '¿Cómo se la troca?',
-'edithelppage' => 'Help:Una hoja, ¿cómodo se la troca?',
'helppage' => 'Help:Contènidos',
'mainpage' => 'La Primera Hoja',
'mainpage-description' => 'La Primera Hoja',
@@ -672,7 +668,6 @@ Leyenda: (act) = diferencias con la versión actual,
'viewprevnext' => 'Ver ($1 {{int:pipe-separator}} $2) ($3).',
'searchmenu-exists' => 'Egziste una oja yamada "[[:$1]]" en esta viki',
'searchmenu-new' => "'''Crîar la hoja «[[:$1]]» en esta viki!'''",
-'searchhelp-url' => 'Help:Ayudo',
'searchprofile-articles' => 'Hojas de contènido',
'searchprofile-project' => 'Hojas de ayudo y hojas de projeto',
'searchprofile-images' => 'Multimedya',
@@ -796,7 +791,6 @@ Las búsquedas producen más o munco a buscar biervos comunes como «la» o «de
'recentchangeslinked-feed' => 'Trocamientos conectados',
'recentchangeslinked-toolbox' => 'Trocamientos relatados',
'recentchangeslinked-title' => 'Los trocamientos relacionados con "$1"',
-'recentchangeslinked-noresult' => 'Sin trokamientos en las ójas atadas en la data demandada',
'recentchangeslinked-summary' => "Esto es la lista de los trocamientos de alcavo de las hojas que relatan á una hoja spēcifik (ou de los miembros de la katēggoría spēcifikada).
Las hojas en tu [[Special:Watchlist|lista de akavidamiento]] son escritas '''con letras grexas'''.",
'recentchangeslinked-page' => 'Nombre de la hoja',
@@ -843,8 +837,6 @@ La descripción en su [$2 hoja de descripción del arxivo] está amostrada debax
# Statistics
'statistics' => 'Estatísticas',
-'disambiguationspage' => 'Template:Aklarasion',
-
# Miscellaneous special pages
'nbytes' => '$1 {{PLURAL:$1|bayt|baytes}}',
'nmembers' => '$1 {{PLURAL:$1|miembro|miembros}}',
@@ -1160,7 +1152,7 @@ Los otros campos se van a guardar por defecto.
* gpslongitude
* gpsaltitude',
-# EXIF tags
+# Exif tags
'exif-filesource' => 'Manadéro de archivo',
'exif-gpstimestamp' => 'Tiémpo GPS (óra atómica)',
'exif-gpsdatestamp' => 'Dáta GPS',
@@ -1241,10 +1233,6 @@ Los otros campos se van a guardar por defecto.
'version-poweredby-others' => 'otros',
'version-software-version' => 'Versión',
-# Special:FilePath
-'filepath-page' => 'Dosya:',
-'filepath-submit' => 'Yir',
-
# Special:FileDuplicateSearch
'fileduplicatesearch-submit' => 'Buscar',
diff --git a/languages/messages/MessagesLb.php b/languages/messages/MessagesLb.php
index 7e8e55ea..3838aaf5 100644
--- a/languages/messages/MessagesLb.php
+++ b/languages/messages/MessagesLb.php
@@ -18,6 +18,7 @@
* @author Robby
* @author Soued031
* @author Urhixidur
+ * @author VT98Fan
* @author Zinneke
* @author לערי ריינה×רט
*/
@@ -118,6 +119,7 @@ $specialPageAliases = array(
'Randomredirect' => array( 'Zoufälleg_Viruleedung' ),
'Recentchanges' => array( 'Rezent_Ännerungen' ),
'Recentchangeslinked' => array( 'Ännerungen_op_verlinkte_Säiten' ),
+ 'Redirect' => array( 'Viruleedung' ),
'Revisiondelete' => array( 'Versioun_läschen' ),
'Search' => array( 'Sichen' ),
'Shortpages' => array( 'Kuerz_Säiten' ),
@@ -213,9 +215,6 @@ $messages = array(
'tog-shownumberswatching' => "D'Zuel vun de Benotzer déi dës Säit iwwerwaache weisen",
'tog-oldsig' => 'Aktuell Ënnerschrëft:',
'tog-fancysig' => 'Ënnerschrëft als Wiki-Text behandelen (Ouni automatesche Link)',
-'tog-externaleditor' => 'Externen Editeur als Standard benotzen (Nëmme fir Experten, et musse speziell Astellungen op ärem Computer gemaach ginn. [//www.mediawiki.org/wiki/Manual:External_editors Méi Informatiounen.])',
-'tog-externaldiff' => 'En Externen Diff-Programm als Standard benotzen (nëmme fir Experten, et musse speziell Astellungen op ärem Computer gemaach ginn. [//www.mediawiki.org/wiki/Manual:External_editors Méi Informatiounen])',
-'tog-showjumplinks' => 'Aktivéiere vun de "Sprang op"-Linken',
'tog-uselivepreview' => 'Live-Preview benotzen (experimentell)',
'tog-forceeditsummary' => 'Warnen, wa beim Späicheren de Resumé feelt',
'tog-watchlisthideown' => 'Meng Ännerungen op menger Iwwerwaachungslëscht verstoppen',
@@ -229,6 +228,8 @@ $messages = array(
'tog-showhiddencats' => 'Verstoppt Kategorië weisen',
'tog-noconvertlink' => 'Ëmwandlung vum Titel desaktivéieren',
'tog-norollbackdiff' => 'Ënnerscheed nom Zrécksetzen ënnerdrécken',
+'tog-useeditwarning' => "Mech warne wann ech d'Ännerung vun enger Säit verloossen, ouni Ännerunge gespäichert ze hunn",
+'tog-prefershttps' => 'Ëmmer eng sécher Verbindung benotze wann ageloggt',
'underline-always' => 'Ëmmer',
'underline-never' => 'Ni',
@@ -292,6 +293,18 @@ $messages = array(
'oct' => 'Okt.',
'nov' => 'Nov.',
'dec' => 'Dez.',
+'january-date' => '$1. Januar',
+'february-date' => '$1. Februar',
+'march-date' => '$1. Mäerz',
+'april-date' => '$1. Abrëll',
+'may-date' => '$1. Mee',
+'june-date' => '$1. Juni',
+'july-date' => '$1. Juli',
+'august-date' => '$1. August',
+'september-date' => '$1. September',
+'october-date' => '$1. Oktober',
+'november-date' => '$1. November',
+'december-date' => '$1. Dezember',
# Categories related messages
'pagecategories' => '{{PLURAL:$1|Kategorie|Kategorien}}',
@@ -373,6 +386,7 @@ $messages = array(
'create-this-page' => 'Dës Säit uleeën',
'delete' => 'Läschen',
'deletethispage' => 'Dës Säit läschen',
+'undeletethispage' => 'Dës Säit restauréieren',
'undelete_short' => '$1 {{PLURAL:$1|Versioun|Versioune}} restauréieren',
'viewdeleted_short' => '{{PLURAL:$1|Eng geläschte Versioun|$1 geläscht Versioune}} weisen',
'protect' => 'Spären',
@@ -389,7 +403,7 @@ $messages = array(
'articlepage' => 'Säit',
'talk' => 'Diskussioun',
'views' => 'Affichagen',
-'toolbox' => 'Geschirkëscht',
+'toolbox' => 'Geschir (Tools)',
'userpage' => 'Benotzersäit',
'projectpage' => 'Meta-Text',
'imagepage' => 'Billersäit kucken',
@@ -416,7 +430,7 @@ $1",
'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).
+# 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).
'aboutsite' => 'Iwwer {{SITENAME}}',
'aboutpage' => 'Project:Iwwer',
'copyright' => 'Den Inhalt ass ënner $1 disponibel wann et net anescht uginn ass.',
@@ -426,7 +440,6 @@ $1",
'disclaimers' => 'Impressum',
'disclaimerpage' => 'Project:Impressum',
'edithelp' => 'Hëllef beim Änneren',
-'edithelppage' => 'Help:Wéi änneren ech eng Säit',
'helppage' => 'Help:Hëllef',
'mainpage' => 'Haaptsäit',
'mainpage-description' => 'Haaptsäit',
@@ -504,17 +517,11 @@ All Spezialsäiten déi et gëtt, sinn op der [[Special:SpecialPages|{{int:speci
# General errors
'error' => 'Feeler',
'databaseerror' => 'Datebank Feeler',
-'dberrortext' => 'En Datebank Syntax Feeler ass opgetrueden.
-Dëst kann op e Feeler an der Software hiweisen.
-De leschte versichten Datebank Query war:
-<blockquote><code>$1</code></blockquote>
-vun der Funktioun "<code>$2</code>".
-D\'Datebank huet de Feeler "<samp>$3: $4</samp>" gemellt.',
-'dberrortextcl' => 'En Datebank Syntax Feeler ass opgetrueden.
-De leschten Datebank Query war:
-"$1"
-vun der Funktioun "$2".
-D\'Datebank huet de Feeler "$3: $4" gemellt.',
+'databaseerror-text' => 'Et ass ee Feeler bäi enger Ufro un Datebank geschitt. Dat deit op e Feeler an der Software.',
+'databaseerror-textcl' => "Et ass e Feeler bäi enger Ufro un d'Datebank geschitt.",
+'databaseerror-query' => 'Ufro: $1',
+'databaseerror-function' => 'Funktioun: $1',
+'databaseerror-error' => 'Feeler: $1',
'laggedslavemode' => "'''Opgepasst:''' Dës Säit ass net onbedéngt um neiste Stand.",
'readonly' => "D'Datebank ass gespaart",
'enterlockreason' => "Gitt w.e.g. e Grond u firwat d'Datebank gespaart ass, a wéi laang dës Spär ongeféier bestoe soll.",
@@ -548,6 +555,7 @@ Et ka sinn datt et scho vun engem Anere geläscht gouf.',
'cannotdelete-title' => 'D\'Säit "$1" kann net geläscht ginn',
'delete-hook-aborted' => "D'Läsche gouf vun enger Schnëttstell (hook) ofgebrach.
Eng Erklärung gouf net ginn.",
+'no-null-revision' => 'Déi nei Nullversioun fir d\'Säit "$1" konnt net ugeluecht ginn',
'badtitle' => 'Schlechten Titel',
'badtitletext' => 'De gewënschten Titel ass net valabel, eidel, oder een net korrekten Interwiki Link.',
'perfcached' => 'Dës Date kommen aus dem Tëschespäicher a si méiglecherweis net aktuell. Maximal {{PLURAL:$1|ee Resultat ass|$1 Resultater sinn}} am Tësche späicher disponibel.',
@@ -569,12 +577,15 @@ Fir Iwwersetzungen fir all Wikien bäizesetzen oder z'änneren gitt w.e.g. op [/
'editinginterface' => "'''Opgepasst:''' Dir sidd am Gaang, eng Säit z'änneren, déi do ass, fir Interface-Text fir d'Software ze liwweren.
Ännerungen op dëser Säit änneren den Interface-Text, jee no Kontext, op allen oder verschiddene Säiten, déi vun alle Benotzer op dëser Wiki gesi ginn.
Fir d'Iwwersetzunge fir all Wikien derbäizesetzen oder z'änneren gitt w.e.g. op [//translatewiki.net translatewiki.net], de MediaWiki-Lokalisatiouns-Projet.",
-'sqlhidden' => '(SQL-Offro verstoppt)',
'cascadeprotected' => 'Dës Säit gouf fir Ännerunge gespaart, well se duerch Cascadeprotectioun vun {{PLURAL:$1|dëser Säit|dëse Säite}} gespaart ass mat der Cascadenoptioun:
$2',
'namespaceprotected' => "Dir hutt net déi néideg Rechter fir d'Säiten am Nummraum '''$1''' ze änneren.",
'customcssprotected' => "Dir hutt net d'Recht dës CSS-Säit z'änneren, well dorop déi perséinlech Astellunge vun engem anere Benotzer gespäichert sinn.",
'customjsprotected' => "Dir hutt net d'Recht dës JavaScript-Säit z'änneren, well dorop déi perséinlech Astellunge vun engem anere Benotzer gespäichert sinn.",
+'mycustomcssprotected' => "Dir hutt net déi néideg Rechter fir dës CSS-Säit z'änneren.",
+'mycustomjsprotected' => "Dir hutt net déi néideg Rechter fir dës JavaScript-Säit z'änneren.",
+'myprivateinfoprotected' => "Dir hutt net d'Recht fir Är privat Informatiounen z'änneren.",
+'mypreferencesprotected' => "Dir hutt net d'Recht fir Är Astellungen z'änneren.",
'ns-specialprotected' => 'Spezialsäite kënnen net verännert ginn.',
'titleprotected' => "Eng Säit mat dësem Numm kann net ugeluecht ginn. Dës Spär gouf vum [[User:$1|$1]] gemaach deen als Grond ''$2'' uginn huet.",
'filereadonlyerror' => 'De Fichier "$1" konnt net geännert ginn well de Repertoire vun de Fichieren "$2" nëmme geliest däerf ginn.
@@ -598,10 +609,19 @@ Opgepasst: Op verschiddene Säite kann et nach sou aus gesinn, wéi wann Dir nac
'welcomecreation-msg' => "Äre Benotzerkont gouf ugeluecht.
Vergiesst net fir Är [[Special:Preferences|{{SITENAME}} Astellungen]] z'änneren",
'yourname' => 'Benotzernumm:',
+'userlogin-yourname' => 'Benotzernumm',
+'userlogin-yourname-ph' => 'Gitt Äre Benotzernumm an',
+'createacct-another-username-ph' => 'De Benotzernumm aginn:',
'yourpassword' => 'Passwuert:',
+'userlogin-yourpassword' => 'Passwuert',
+'userlogin-yourpassword-ph' => 'Gitt Äert Passwuert an',
+'createacct-yourpassword-ph' => 'Gitt e Passwuert an',
'yourpasswordagain' => 'Passwuert nach eemol antippen:',
+'createacct-yourpasswordagain' => 'Passwuert confirméieren',
+'createacct-yourpasswordagain-ph' => 'Passwuert nach eng Kéier aginn',
'remembermypassword' => 'Meng Umeldung op dësem Computer (fir maximal $1 {{PLURAL:$1|Dag|Deeg}}) verhalen',
-'securelogin-stick-https' => 'Nom Umelle mat HTTPS verbonn bleiwen',
+'userlogin-remembermypassword' => 'Mech ageloggt halen',
+'userlogin-signwithsecure' => 'Eng sécher Verbindung benotzen',
'yourdomainname' => 'Ären Domän:',
'password-change-forbidden' => 'Dir däerft op dëser Wiki Passwierder net änneren.',
'externaldberror' => 'Entweder ass e Feeler bei der externer Authentifizéierung geschitt, oder Dir däerft Ären externe Benotzerkont net aktualiséieren.',
@@ -613,18 +633,44 @@ Vergiesst net fir Är [[Special:Preferences|{{SITENAME}} Astellungen]] z'ännere
'logout' => 'Ofmellen',
'userlogout' => 'Ausloggen',
'notloggedin' => 'Net ageloggt',
+'userlogin-noaccount' => 'Hutt Dir kee Benotzerkont?',
+'userlogin-joinproject' => 'Maacht mat bäi {{SITENAME}}',
'nologin' => 'Hutt Dir kee Benotzerkont? $1.',
'nologinlink' => 'Neie Benotzerkont maachen',
'createaccount' => 'Neie Kont opmaachen',
'gotaccount' => "Dir hutt schonn e Benotzerkont? '''$1'''.",
'gotaccountlink' => 'Umellen',
'userlogin-resetlink' => "Hutt Dir d'Detailer vun Ärem Login vergiess?",
+'userlogin-resetpassword-link' => 'Setzt Äert Passwuert zréck',
+'helplogin-url' => 'Help:Aloggen',
+'userlogin-helplink' => '[[{{MediaWiki:helplogin-url}}|Hëllef beim Aloggen]]',
+'userlogin-loggedin' => 'Dir sidd schonn als {{GENDER:$1|$1}} ageloggt.
+Benotzt de Formulaire hei drënner fir Iech als een anere Benotzer anzeloggen.',
+'userlogin-createanother' => 'Maacht een anere Benotzerkont op',
+'createacct-join' => 'Gitt Är Informatioune hei drënner an.',
+'createacct-another-join' => "Gitt d'Informatioune fir den neie Benotzerkont hei drënner an.",
+'createacct-emailrequired' => 'E-Mail-Adress',
+'createacct-emailoptional' => 'E-Mailadress (fakultativ)',
+'createacct-email-ph' => 'Gitt Är E-Mail-Adress an',
+'createacct-another-email-ph' => 'E-Mailadress aginn',
'createaccountmail' => 'En temporäert zoufällegt Passwuert benotzen an et per E-Mail un déi spezifizéiert E-Mailadress schécken',
+'createacct-realname' => 'Richtegen Numm (fakultativ)',
'createaccountreason' => 'Grond:',
+'createacct-reason' => 'Grond',
+'createacct-reason-ph' => 'Fir wat Dir een anere Benotzerkonnt uleet',
+'createacct-captcha' => 'Sécherheets-Check',
+'createacct-imgcaptcha-ph' => 'Gitt den Text an deen Dir hei driwwer gesitt',
+'createacct-submit' => 'Äre Benotzerkont uleeën',
+'createacct-another-submit' => 'Maacht een anere Benotzerkonnt op',
+'createacct-benefit-heading' => '{{SITENAME}} gëtt vu Leit wéi Iech gemaach.',
+'createacct-benefit-body1' => '{{PLURAL:$1|Ännerung|Ännerungen}}',
+'createacct-benefit-body2' => '{{PLURAL:$1|Säit|Säiten}}',
+'createacct-benefit-body3' => 'rezent {{PLURAL:$1|Mataarbechter}}',
'badretype' => 'Är Passwierder stëmmen net iwwereneen.',
'userexists' => 'De Benotzernumm deen agi gouf gëtt scho benotzt.
Sicht Iech een anere Benotzernumm.',
'loginerror' => 'Feeler beim Aloggen',
+'createacct-error' => 'Feeler beim Uleeë vum Benotzerkont',
'createaccounterror' => 'Benotzerkont konnt net opgemaach ginn: $1',
'nocookiesnew' => "De Benotzerkont gouf ugeluecht, awer Dir sidd net ageloggt.
{{SITENAME}} brauch fir dës Funktioun Cookien.
@@ -685,11 +731,14 @@ Dir sollt Iech aloggen an Äert Passwuert elo änneren.
Wann dëse Benotzerkont ongewollt ugeluecht gouf, kënnt Dir dës Noriicht einfach ignoréieren.',
'usernamehasherror' => "Am Benotzernumm däerfe keng ''hash'' Zeeche sinn",
-'login-throttled' => "Dir hutt zevill dacks versicht d'Passwuert vun dësem Benotzerkont anzeginn.
-Waart w.e.g. ier Dir et nach eng Kéier versicht.",
+'login-throttled' => 'Dir hutt zevill dacks versicht Iech anzeloggen.
+Waart w.e.g. $1 ier Dir et nach eng Kéier probéiert.',
'login-abort-generic' => 'Dir sidd net ageloggt - Aloggen ofgebrach',
'loginlanguagelabel' => 'Sprooch: $1',
'suspicious-userlogout' => 'Är Ufro fir Iech auszeloggen gouf refuséiert well et sou ausgesäit wéi wa se vun engem Futtise Browser oder Proxy-Tëschespäicher kënnt.',
+'createacct-another-realname-tip' => "De richtegen Numm ass fakultativ.
+
+Wann Dir en ugitt, gëtt e benotzt fir d'Benotzerattributiounen fir Är Aarbecht zouzeuerdnen.",
# Email sending
'php-mail-error-unknown' => 'Onbekannte Feeler an der PHP-Mail-Funktioun',
@@ -706,7 +755,7 @@ Fir är Umeldung ofzeschléissen, musst Dir elo hei een neit Passwuert uginn:',
'newpassword' => 'Neit Passwuert:',
'retypenew' => 'Neit Passwuert nach eemol antippen:',
'resetpass_submit' => 'Passwuert aginn an aloggen',
-'resetpass_success' => 'Äert Passwuert gouf geännert! Elo gitt Dir ageloggt...',
+'changepassword-success' => 'Äert Passwuert gouf geännert!',
'resetpass_forbidden' => 'Passwierder kënnen net geännert ginn.',
'resetpass-no-info' => 'Dir musst ageloggt sinn, fir direkt op dës Säit ze kommen.',
'resetpass-submit-loggedin' => 'Passwuert änneren',
@@ -718,10 +767,11 @@ Vläicht hutt Dir Äert Passwuert scho geännert oder en neit temporäert Passwu
# Special:PasswordReset
'passwordreset' => 'Passwuert zrécksetzen',
-'passwordreset-text' => 'Fëllt dëse Formulaire aus fir Äert Passwuert zréckzesetzen.',
+'passwordreset-text-one' => 'Fëllt dëse Formulaire aus fir Äert Passwuert zréckzesetzen.',
+'passwordreset-text-many' => '{{PLURAL:$1|Fëllt eent vun de Felder aus fir Äert Passwuert zeréckzesetzen.}}',
'passwordreset-legend' => 'Passwuert zrécksetzen',
'passwordreset-disabled' => "D'Zerécksetze vum Passwuert ass op dëser Wiki ausgeschalt.",
-'passwordreset-pretext' => '{{PLURAL:$1||Gitt eng vun dësen Donnéeën an}}',
+'passwordreset-emaildisabled' => "D'E-Mail-Funktioune goufen op dëser Wiki ausgeschalt.",
'passwordreset-username' => 'Benotzernumm:',
'passwordreset-domain' => 'Domaine:',
'passwordreset-capture' => "D'Mail kucken?",
@@ -746,7 +796,7 @@ Dir sollt Iech aloggen an een neit Passwuert festleeën. Wann een Aneren déi Uf
Temporärt Passwuert: $2',
'passwordreset-emailsent' => "Eng Mail fir d'Passwuert zréckzesetze gouf geschéckt.",
'passwordreset-emailsent-capture' => "Eng Mail fir d'Passwuert zréckzesetze gouf geschéckt, Dir gesitt se hei drënner.",
-'passwordreset-emailerror-capture' => "D'Erënnerungsmail gouf esou geschéckt wéi Dir se hei drënner gesitt, awer de Benotzer konnt se net kréien: $1",
+'passwordreset-emailerror-capture' => "Eng Mail fir d'Passwuert zréckzesetze gouf geschéckt, Dir gesitt se hei drënner, awer de {{GENDER:$2|Benotzer}} konnt se net kréien: $1",
# Special:ChangeEmail
'changeemail' => 'Mailadress änneren',
@@ -760,6 +810,15 @@ Temporärt Passwuert: $2',
'changeemail-submit' => 'Mailadress änneren',
'changeemail-cancel' => 'Ofbriechen',
+# Special:ResetTokens
+'resettokens' => 'Token zrécksetzen',
+'resettokens-no-tokens' => 'Et gëtt keng Tokens fir zréck ze setzen.',
+'resettokens-legend' => 'Token zrécksetzen',
+'resettokens-tokens' => 'Token:',
+'resettokens-token-label' => '$1 (aktuelle Wäert: $2)',
+'resettokens-done' => 'Token zréckgesat.',
+'resettokens-resetbutton' => 'Selectionéiert Tokens zrécksetzen',
+
# Edit page toolbar
'bold_sample' => 'Fettgedréckten Text',
'bold_tip' => 'Fettgedréckten Text',
@@ -957,11 +1016,14 @@ Hei ass den Extrait aus dem Logbuch vum Réckelen a Läsche fir déi Säit.',
Si gouf anscheinend geläscht.",
'edit-conflict' => 'Ännerungskonflikt.',
'edit-no-change' => 'Är ännerung gouf ignoréiert, well Dir näischt um Text geännert hutt.',
+'postedit-confirmation' => 'Är Ännerung gouf gespäichert.',
'edit-already-exists' => 'Déi nei Säit konnt net ugeluecht ginn, well et se scho gëtt.',
'defaultmessagetext' => 'Standardtext',
'content-failed-to-parse' => 'Den $2-Inhalt fir den $1-Modell konnt net geparst ginn: $3',
'invalid-content-data' => 'Donnéeë vum Inhalt sinn net valabel',
'content-not-allowed-here' => '"$1"-Inhalt ass op der Säit [[$2]] net erlaabt',
+'editwarning-warning' => 'Wann Dir dës Säit verloosst kann dat dozou féieren datt Dir all Ännerungen, déi Dir gemaach hutt, verléiert.
+Wann Dir ageloggt sidd, kënnt Dir dës Warnung an der Sektioun "Änneren" vun Ären Astellungen ausschalten.',
# Content models
'content-model-wikitext' => 'Wikitext',
@@ -989,6 +1051,7 @@ Et däerfen net méi wéi $2 {{PLURAL:$2|Ufro|Ufroe}} sinn, aktuell {{PLURAL:$2|
'undo-failure' => "D'Ännerung konnt net réckgängeg gemaach ginn, wëll de betraffenen Abschnitt an der Tëschenzäit geännert gouf.",
'undo-norev' => "D'Ännerung kann net zréckgesat ginn, well et se net gëtt oder well se scho geläscht ass.",
'undo-summary' => 'Ännerung $1 vu(n) [[Special:Contributions/$2|$2]] ([[User talk:$2|Diskussioun]] | [[Special:Contributions/$2|{{MediaWiki:Contribslink}}]]) annulléieren.',
+'undo-summary-username-hidden' => 'Versioun $1 vun engem verstoppte Benotzer zrécksetzen',
# Account creation failure
'cantcreateaccounttitle' => 'Benotzerkont konnt net opgemaach ginn',
@@ -1173,6 +1236,7 @@ Denkt w.e.g drunn datt d'Navigatiounslinken d'Wiel vun de Versiounen nees zréck
'compareselectedversions' => 'Ausgewielte Versioune vergläichen',
'showhideselectedversions' => 'Erausgesicht Versioune weisen/verstoppen',
'editundo' => 'zréck',
+'diff-empty' => '(Keen Ënnerscheed)',
'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)',
'difference-missing-revision' => '{{PLURAL:$2|Eng Versioun|$2 Versioune}} vun dëser Differenz ($1) {{PLURAL:$2|gouf|goufen}} net fonnt.
@@ -1200,7 +1264,6 @@ Detailer fannt Dir am [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}
'searchmenu-legend' => 'Sichoptiounen',
'searchmenu-exists' => "* Säit '''[[$1]]'''",
'searchmenu-new' => "'''Opmaache vun der Säit ''[[:$1|$1]]'' op dëser Wiki!'''",
-'searchhelp-url' => 'Help:Inhalter',
'searchmenu-prefix' => '[[Special:PrefixIndex/$1|All Säite weisen, déi mat dem Begrëff ufänken nodeem Dir sicht]]',
'searchprofile-articles' => 'Säite mat Inhalt',
'searchprofile-project' => 'Hëllef a Projetssäiten',
@@ -1241,15 +1304,7 @@ Detailer fannt Dir am [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}
'powersearch-togglenone' => 'Keen',
'search-external' => 'Extern sichen',
'searchdisabled' => "D'Sichfunktioun op {{SITENAME}} ass ausgeschalt. Dir kënnt iwwerdeems mat Hëllef vu Google sichen. Bedenkt awer, datt deenen hire Sichindex fir {{SITENAME}} eventuell net dem aktuellste Stand entsprecht.",
-
-# Quickbar
-'qbsettings' => 'Geschirläischt',
-'qbsettings-none' => 'Keen',
-'qbsettings-fixedleft' => 'Lénks, fest',
-'qbsettings-fixedright' => 'Riets, fest',
-'qbsettings-floatingleft' => 'schwiewt lenks',
-'qbsettings-floatingright' => 'Schwiewt riets',
-'qbsettings-directionality' => 'Fix, ofhängeg vun der Schreiwrichtung vun Ärer Sprooch',
+'search-error' => 'Beim Sichen ass e Feeler geschitt: $1',
# Preferences page
'preferences' => 'Astellungen',
@@ -1283,7 +1338,6 @@ Detailer fannt Dir am [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}
'resetprefs' => 'Net gespäichert Ännerungen zrécksetzen',
'restoreprefs' => 'All Standardastellungen zrécksetzen (an allen Abschnitter)',
'prefs-editing' => 'Änneren',
-'prefs-edit-boxsize' => 'Gréisst vun der Ännerungsfënster:',
'rows' => 'Zeilen',
'columns' => 'Kolonnen',
'searchresultshead' => 'Sichen',
@@ -1294,9 +1348,7 @@ Detailer fannt Dir am [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}
'recentchangesdays-max' => '(Maximal $1 {{PLURAL:$1|Dag|Deeg}})',
'recentchangescount' => 'Zuel vun den Ännerungen déi als Standard gewise ginn:',
'prefs-help-recentchangescount' => 'Inklusiv Rezent Ännerungen, Versiounshistoriquen a Logbicher.',
-'prefs-help-watchlist-token' => 'Wann Dir dëst Feld mat engem Geheimcode ausfëllt gëtt en RSS-Feed fir Är Iwwerwaachungslëscht generéiert.
-Jiddwereen deen de Geheimcode aus dësem Feld kennt kann Är Iwwerwaachungslëscht liesen, wielt dofir e séchere Wäert.
-Hei ass een zoufälleg generéierte Wäert deen Dir benotze kënnt: $1',
+'prefs-help-watchlist-token2' => 'Dëst ass de geheime Schlëssel fir de Webfeed vun Ärer Iwwerwaachungslëscht. Jiddwereen deen e kennt kann Är Iwwerwaachungslëscht liesen, dofir sollt Dir en net weider ginn. [[Special:ResetTokens|Klickt hei wann Dir en zrécksetze musst]].',
'savedprefs' => 'Är Astellunge goufe gespäichert.',
'timezonelegend' => 'Zäitzon:',
'localtime' => 'Lokalzäit:',
@@ -1327,7 +1379,6 @@ Hei ass een zoufälleg generéierte Wäert deen Dir benotze kënnt: $1',
'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:',
-'prefs-textboxsize' => 'Gréisst vun der Ännerungsfënster',
'youremail' => 'E-Mail-Adress:',
'username' => '{{GENDER:$1|Benotzernumm}}:',
'uid' => '{{GENDER:$1|Benotzer}} ID:',
@@ -1361,6 +1412,8 @@ Dës Informatioun ass ëffentlech.",
'prefs-dateformat' => 'Format vum Datum',
'prefs-timeoffset' => 'Zäitënnerscheed',
'prefs-advancedediting' => 'Allgemeng Optiounen',
+'prefs-editor' => 'Editeur',
+'prefs-preview' => 'Kucken ouni ofzespäicheren',
'prefs-advancedrc' => 'Méi Optiounen',
'prefs-advancedrendering' => 'Méi Optiounen',
'prefs-advancedsearchoptions' => 'Méi Optiounen',
@@ -1369,6 +1422,7 @@ Dës Informatioun ass ëffentlech.",
'prefs-displaysearchoptions' => 'Optioune vum Affichage',
'prefs-displaywatchlist' => 'Optioune vun deem wat gewise gëtt',
'prefs-diffs' => 'Ënnerscheeder',
+'prefs-help-prefershttps' => 'Dës Astellung gëtt déi nächste Kéier wierksam wou Dir Iech ageloggt.',
# User preference: email validation using jQuery
'email-address-validity-valid' => "D'E-Mail-Adress schéngt valabel ze sinn",
@@ -1395,6 +1449,8 @@ Dës Informatioun ass ëffentlech.",
'userrights-notallowed' => 'Dir hutt net déi néideg Rechter fir Rechter vun anere Benotzer derbäizesetzen oder ewechzehuelen.',
'userrights-changeable-col' => 'Gruppen déi Dir ännere kënnt',
'userrights-unchangeable-col' => 'Gruppen déi Dir net ännere kënnt',
+'userrights-conflict' => 'Konflikt bäi de Benotzerrechter! Kuckt Är Ännerunge w.e.g. no a maacht se w.e.g. nach eng Kéier.',
+'userrights-removed-self' => 'Dir hutt Är eege Rechter ewechgeholl. Dofir kënnt Dir net méi op dës Säit zougräifen.',
# Groups
'group' => 'Grupp:',
@@ -1460,11 +1516,19 @@ Dës Informatioun ass ëffentlech.",
'right-proxyunbannable' => 'Automatesche Proxyspären ëmgoen',
'right-unblockself' => 'Seng eege Spär ophiewen',
'right-protect' => 'Protektiounsniveauen änneren a kaskadegespaart Säiten änneren',
-'right-editprotected' => 'Protegéiert Säiten (ouni Kaskadeprotectioun) änneren',
+'right-editprotected' => 'Protegéiert Säiten als "{{int:protect-level-sysop}}" änneren',
+'right-editsemiprotected' => 'Säiten déi als "{{int:protect-level-autoconfirmed}}" gespaart sinn änneren',
'right-editinterface' => 'De Benotzerinterface änneren',
'right-editusercssjs' => 'Anere Benotzer hir CSS a JS Fichieren änneren',
'right-editusercss' => 'Anere Benotzer hir CSS Fichieren änneren',
'right-edituserjs' => 'Anere Benotzer hir JavaScript Fichieren änneren',
+'right-editmyusercss' => 'Är eegen CSS-Fichieren änneren',
+'right-editmyuserjs' => 'Är eege JavaScript-Fichieren änneren',
+'right-viewmywatchlist' => 'Kuckt Är eegen Iwwerwaachungslëscht',
+'right-editmywatchlist' => "Ännert Är eegen Iwwerwaachungslëscht. Denkt drun datt och aner Aktioune Säiten op d'Iwwerwaachungslëscht derbäisetzen.",
+'right-viewmyprivateinfo' => 'Är eege privat Donnéeën (z.Bsp. E-Mail-Adress, richtegen Numm) kucken',
+'right-editmyprivateinfo' => 'Är eege privat Donnéeën (z.Bsp. E-Mail-Adress, richtegen Numm) änneren',
+'right-editmyoptions' => 'Ännert Är eegen Astellungen',
'right-rollback' => "Ännerunge vum läschte Benotzer vun enger spezieller Säit séier z'récksetzen ''(rollback)''",
'right-markbotedits' => 'Annuléiert Ännerungen als Botännerunge weisen',
'right-noratelimit' => 'Net limitéiert duerch Zäitlimitatiounen um Server',
@@ -1526,12 +1590,19 @@ Dës Informatioun ass ëffentlech.",
'action-userrights-interwiki' => "d'Rechter vu Benotzer vun anere Wikien z'änneren",
'action-siteadmin' => "d'Datebank ze spären oder d'Spär opzehiewen",
'action-sendemail' => 'Maile schécken',
+'action-editmywatchlist' => 'ännert Är Iwwerwaachungslëscht',
+'action-viewmywatchlist' => 'kuckt Är Iwwerwaachungslëscht',
+'action-viewmyprivateinfo' => 'Är privat Informatioune kucken',
+'action-editmyprivateinfo' => 'Är privat Informatiounen änneren',
# Recent changes
'nchanges' => '$1 {{PLURAL:$1|Ännerung|Ännerungen}}',
+'enhancedrc-since-last-visit' => '$1 {{PLURAL:$1|zanter dem leschte Passage}}',
+'enhancedrc-history' => 'Versiounen',
'recentchanges' => 'Rezent Ännerungen',
'recentchanges-legend' => 'Optioune vun de rezenten Ännerungen',
'recentchanges-summary' => "Op dëser Säit kënnt Dir déi rezent Ännerungen op '''{{SITENAME}}''' gesinn.",
+'recentchanges-noresult' => 'Keng Ännerunge während der Period déi ugi gouf passen op de Critère.',
'recentchanges-feed-description' => 'Verfollegt mat dësem Feed déi rezent Ännerungen op {{SITENAME}}.',
'recentchanges-label-newpage' => 'Dës Ännerung huet eng nei Säit ugeluecht',
'recentchanges-label-minor' => 'Dëst ass eng kleng Ännerung',
@@ -1569,7 +1640,6 @@ Dës Informatioun ass ëffentlech.",
'recentchangeslinked-feed' => 'Ännerungen op verlinkt Säiten',
'recentchangeslinked-toolbox' => 'Ännerungen op verlinkt Säiten',
'recentchangeslinked-title' => 'Ännerungen a Verbindung mat "$1"',
-'recentchangeslinked-noresult' => 'Am ausgewielten Zäitraum goufen op de verlinkte Säite keng Ännerunge gemaach.',
'recentchangeslinked-summary' => "Dëst ass eng Lëscht mat Ännerunge vu verlinkte Säiten op eng bestëmmte Säit (oder vu Membersäite vun der spezifizéierter Kategorie).
Säite vun [[Special:Watchlist|Ärer Iwwerwaachungslëscht]] si '''fett''' geschriwwen.",
'recentchangeslinked-page' => 'Säitennumm:',
@@ -1581,7 +1651,7 @@ Säite vun [[Special:Watchlist|Ärer Iwwerwaachungslëscht]] si '''fett''' gesch
'reuploaddesc' => 'Eroplueden ofbriechen an zréck op de Formulaire fir Eropzelueden',
'upload-tryagain' => 'Déi geännert Beschreiwung vum Fichier schécken',
'uploadnologin' => 'Net ageloggt',
-'uploadnologintext' => 'Dir musst [[Special:UserLogin|ageloggt sinn]], fir Fichieren eroplueden zu kënnen.',
+'uploadnologintext' => 'Dir musst Iech $1, fir Fichieren eroplueden zu kënnen.',
'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',
@@ -1792,7 +1862,6 @@ Fir eng optimal Sécherheet ass img_auth.php ausgeschalt.",
'http-read-error' => 'HTTP-Feeler beim Liesen.',
'http-timed-out' => 'HTTP-Ufro huet ze laang gebraucht (time out).',
'http-curl-error' => 'Feeler beim Ofruff vun der URL: $1',
-'http-host-unreachable' => "D'URL konnt net erreecht ginn.",
'http-bad-status' => 'Et gouf e Problem bäi der HTTP-Ufro: $1 $2',
# Some likely curl errors. More could be added from <http://curl.haxx.se/libcurl/c/libcurl-errors.html>
@@ -1821,6 +1890,10 @@ Kuckt w.e.g. no op kee Feeler an der URL ass an op de Site och online ass.',
'listfiles_size' => 'Gréisst',
'listfiles_description' => 'Beschreiwung',
'listfiles_count' => 'Versiounen',
+'listfiles-show-all' => 'Al Versioune vu Biller aschléissen',
+'listfiles-latestversion' => 'Aktuell Versioun',
+'listfiles-latestversion-yes' => 'Jo',
+'listfiles-latestversion-no' => 'Neen',
# File description page
'file-anchor-link' => 'Fichier',
@@ -1917,6 +1990,13 @@ Dir musst ëmmer de Medien- a Subtyp aginn: z. Bsp. <code>image/jpeg</code>.",
'randompage' => 'Zoufallssäit',
'randompage-nopages' => 'Et gëtt keng Säiten {{PLURAL:$2|am Nummraum|an den Nummraim}}: $1.',
+# Random page in category
+'randomincategory' => 'Zoufälleg Säit an der Kategorie',
+'randomincategory-invalidcategory' => '"$1" ass kee valabelen Numm fir eng Kategorie.',
+'randomincategory-nopages' => 'Et gëtt keng Säiten an der [[:Category:$1]].',
+'randomincategory-selectcategory' => 'Eng zoufälleg Säit aus der Kategorie: $1 $2 opruffen',
+'randomincategory-selectcategory-submit' => 'Lass',
+
# Random redirect
'randomredirect' => 'Zoufälleg Viruleedung',
'randomredirect-nopages' => 'Am Nummraum $1 gëtt et keng Viruleedungen.',
@@ -1942,17 +2022,12 @@ Dir musst ëmmer de Medien- a Subtyp aginn: z. Bsp. <code>image/jpeg</code>.",
'statistics-users-active-desc' => 'Benotzer déi während {{PLURAL:$1|dem leschten Dag|de leschten $1 Deeg}} eppes gemaach hunn',
'statistics-mostpopular' => 'Am meeschte gekuckte Säiten',
-'disambiguations' => 'Säiten déi op Homonymiesäite linken',
-'disambiguationspage' => 'Template:Homonymie',
-'disambiguations-text' => "Dës Säite ass mat mindestens enger '''Homonymie-Säit''' verlinkt.
-Si sollte am beschten op déi eigentlech gemengte Säit verlinkt sinn.<br />
-Eng Säite gëtt als Homonymie-Säit behandelt, wa si eng Schabloun benotzt déi vu [[MediaWiki:Disambiguationspage]] verlinkt ass.",
-
'pageswithprop' => 'Säite mat enger Säiteneegeschaft',
'pageswithprop-legend' => 'Säite mat enger Säiteneegeschaft',
'pageswithprop-text' => 'Op dëser Säit sti Säiten déi eng speziell Säiteneegeschaft benotzen.',
'pageswithprop-prop' => 'Numm vun der Eegeschaft:',
'pageswithprop-submit' => 'Lass',
+'pageswithprop-prophidden-long' => 'Wäert vun der laanger Texteegeschaft verstoppt ($1)',
'doubleredirects' => 'Duebel Viruleedungen',
'doubleredirectstext' => 'Op dëser Säit stinn déi Säiten déi op aner Viruleedungssäite viruleeden.
@@ -2200,10 +2275,9 @@ All weider Ännerungen op dëser Säit an der associéierter Diskussiounssäit g
'unwatchthispage' => 'Net méi iwwerwaachen',
'notanarticle' => 'Keng Säit',
'notvisiblerev' => 'Versioun gouf geläscht',
-'watchnochange' => 'Keng vun Ären iwwerwaachte Säite gouf während der ugewisener Zäit verännert.',
'watchlist-details' => "{{PLURAL:$1|1 Säit|$1 Säiten}} sinn op ärer Iwwerwaachungsklëscht (d'Diskussiounssäite net matgezielt).",
-'wlheader-enotif' => '* E-Mail-Notifikatioun ass ageschalt.',
-'wlheader-showupdated' => "* Säiten déi zënter Ärer leschter Visite geännert goufe si '''fett''' geschriwwen",
+'wlheader-enotif' => 'E-Mail-Notifikatioun ass ageschalt.',
+'wlheader-showupdated' => "Säiten déi zanter Ärer leschter Visite geännert goufen, si '''fett''' geschriwwen",
'watchmethod-recent' => 'Rezent Ännerunge ginn op iwwerwaacht Säiten iwwerpréift',
'watchmethod-list' => 'Iwwerwaachte Säite ginn op rezent Ännerungen iwwerpréift',
'watchlistcontains' => 'Op ärer Iwwerwaachungslëscht $1 {{PLURAL:$1|steet $1 Säit|stinn $1 Säiten}}.',
@@ -2456,7 +2530,7 @@ $1',
'contributions' => '{{GENDER:$1|Benotzer}}kontributiounen',
'contributions-title' => 'Kontributioune vum $1',
'mycontris' => 'Kontributiounen',
-'contribsub2' => 'Fir $1 ($2)',
+'contribsub2' => "Fir {{GENDER:$3|den $1|d'$1|de Benotzer $1}} ($2)",
'nocontribs' => 'Et goufe keng Ännerunge fonnt, déi dëse Kritèren entspriechen.',
'uctop' => '(aktuell)',
'month' => 'Vum Mount (a virdrun):',
@@ -2611,13 +2685,11 @@ Kuckt d'[[Special:BlockList|Spärlëscht]] fir déi aktuell Spären.",
Si ass awer als Deel vun der Rei $2 gespaart, an dës Spär kann opgehuewe ginn.",
'ip_range_invalid' => 'Ongëltegen IP Block.',
'ip_range_toolarge' => 'Späre vu Beräicher déi méi grouss wéi /$1 si sinn net erlaabt.',
-'blockme' => 'Spär mech',
'proxyblocker' => 'Proxy blocker',
-'proxyblocker-disabled' => 'Dës Funktioun ass ausgeschalt.',
'proxyblockreason' => 'Är IP-Adress gouf gespaart, well si een oppene Proxy ass. Kontaktéiert w.e.g. ären Internet-Provider oder ärs Systemadministrateuren und informéiert si iiwwer dëses méigleche Sécherheetsprobleem.',
-'proxyblocksuccess' => 'Gemaach.',
'sorbsreason' => 'Är IP Adress steet als oppene Proxy an der schwaarzer Lëscht (DNSBL) déi vu {{SITENAME}} benotzt gëtt.',
'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.',
+'xffblockreason' => 'Eng IP-Adress am X-Forwarded-For-Header gouf gespaart, entweder Är oder déi vum Proxyserver deen Dir benotzt. De Grond vun der Spär war: $1',
'cant-block-while-blocked' => 'Dir däerft keng aner Benotzer spären, sou 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',
@@ -2781,6 +2853,8 @@ Besicht w.e.g. [//www.mediawiki.org/wiki/Localisation MediaWiki Localisatioun] a
'thumbnail-more' => 'vergréisseren',
'filemissing' => 'Fichier feelt',
'thumbnail_error' => 'Feeler beim Erstelle vun der Miniatur: $1',
+'thumbnail_error_remote' => 'Feelermessage vum $1:
+$2',
'djvu_page_error' => 'DjVu-Säit baussent dem Säiteberäich',
'djvu_no_xml' => 'Den XML ka fir den DjVu-Fichier net ofgeruff ginn',
'thumbnail-temp-create' => "Den temporäre Fichier fir d'Minitaurbild konnt net ugeluecht ginn",
@@ -2927,21 +3001,16 @@ Späichert en op Ärem Computer of a luet en hei nees erop.',
Erlaabt et e Grond an de Resumé derbäizesetzen.',
'tooltip-preferences-save' => 'Astellunge späicheren',
'tooltip-summary' => 'Gitt e kuerze Resumé an',
+'tooltip-iwiki' => '$1 - $2',
# Stylesheets
'common.css' => "/* Dës CSS huet nëmmen Afloss op de Skin ''Chick'' */",
-'standard.css' => "/* Dës CSS huet nëmmen Afloss op de Skin ''Klassesch'' */",
-'nostalgia.css' => "/* Dës CSS huet nëmmen Afloss op de Skin ''Nostalgie'' */",
'cologneblue.css' => "/* Dës CSS huet nëmmen Afloss op de Skin ''Köln Blo'' */",
'monobook.css' => "/* Dës CSS huet nëmmen Afloss op de Skin ''Monobook'' */",
-'myskin.css' => "/* Dës CSS huet nëmmen Afloss op de Skin ''MySkin'' */",
-'chick.css' => '/* Dës CSS huet nëmmen Afloss op de Skin "Chick" */',
-'simple.css' => "/* Dës CSS huet nëmmen Afloss op de Skin ''Einfach'' */",
'modern.css' => "/* Dës CSS huet nëmmen Afloss op de Skin ''Modern'' */",
# Scripts
'common.js' => '/* All JavaScript hei gëtt fir all Benotzer beim Luede vun all Säit gelueden. */',
-'nostalgia.js' => '/* Dëse JavaScript gëtt geluede fir Nostalgia ze benotzen */',
# Metadata
'notacceptable' => "De Wiki-Server kann d'Donnéeë net an engem Format liwweren déi vun ärem Apparat geliest kënne ginn.",
@@ -3015,13 +3084,8 @@ Dëst wahrscheinlech duerch en externe Link den op der schwaarzer Lëscht (black
'pageinfo-category-files' => 'Zuel vun de Fichieren',
# Skin names
-'skinname-standard' => 'Klassesch',
-'skinname-nostalgia' => 'Nostalgie',
'skinname-cologneblue' => 'Köln Blo',
'skinname-monobook' => 'MonoBook',
-'skinname-myskin' => 'MySkin',
-'skinname-chick' => 'Chick',
-'skinname-simple' => 'Einfach',
'skinname-modern' => 'Modern',
# Patrolling
@@ -3099,11 +3163,25 @@ Duerch d'Opmaache vum Fichier kann Äre System beschiedegt ginn.",
'minutes' => '{{PLURAL:$1|enger Minutt|$1 Minutten}}',
'hours' => '{{PLURAL:$1|enger Stonn|$1 Stonnen}}',
'days' => '{{PLURAL:$1|engem Dag|$1 Deeg}}',
+'weeks' => '{{PLURAL: $1|eng Woch|$1 Wochen}}',
'months' => '{{PLURAL:$1|ee Mount|$1 Méint}}',
'years' => '{{PLURAL:$1|ee Joer|$1 Joer}}',
'ago' => 'viru(n) $1',
'just-now' => 'grad elo',
+# Human-readable timestamps
+'hours-ago' => '{{PLURAL:$1|virun 1 Stonn| viru(n) $1 Stonnen}}',
+'minutes-ago' => '{{PLURAL:$1|virun 1 Minutt| viru(n) $1 Minutten}}',
+'seconds-ago' => '{{PLURAL:$1|virun 1 Sekonn|viru(n) $1 Sekonnen}}',
+'monday-at' => 'Méindes ëm $1',
+'tuesday-at' => 'Dënschdes ëm $1',
+'wednesday-at' => 'Mëttwochs ëm $1',
+'thursday-at' => 'Donneschdes ëm $1',
+'friday-at' => 'Freides ëm $1',
+'saturday-at' => 'Samschdes ëm $1',
+'sunday-at' => 'Sonndes ëm $1',
+'yesterday-at' => 'Gëschter ëm $1',
+
# Bad image list
'bad_image_list' => 'Format:
@@ -3131,7 +3209,7 @@ Déi aner sinn am Standard verstoppt.
* gpslongitude
* gpsaltitude",
-# EXIF tags
+# Exif tags
'exif-imagewidth' => 'Breet',
'exif-imagelength' => 'Längt',
'exif-bitspersample' => 'Bite pro Faarfkomponent',
@@ -3307,7 +3385,7 @@ Déi aner sinn am Standard verstoppt.
'exif-originalimageheight' => 'Héicht vum Bild virum Ofschneiden',
'exif-originalimagewidth' => 'Breet vum Bild virum Ofschneiden',
-# EXIF attributes
+# Exif attributes
'exif-compression-1' => 'Onkompriméiert',
'exif-copyrighted-true' => 'Duerch Copyright geschützt',
@@ -3681,7 +3759,6 @@ Dir kënnt och [[Special:EditWatchlist|de Standard Editeur benotzen]].",
'version-other' => 'Aner',
'version-mediahandlers' => 'Medien-Ënnerstëtzung',
'version-hooks' => 'Klameren',
-'version-extension-functions' => 'Funktioune vun den Erweiderungen',
'version-parser-extensiontags' => "Parser-Erweiderungen ''(Taggen)''",
'version-parser-function-hooks' => 'Parser-Funktiounen',
'version-hook-name' => 'Numm vun der Klamer',
@@ -3690,6 +3767,7 @@ Dir kënnt och [[Special:EditWatchlist|de Standard Editeur benotzen]].",
'version-license' => 'Lizenz',
'version-poweredby-credits' => "Dës Wiki funktionéiert mat '''[//www.mediawiki.org/ MediaWiki]''', Copyright © 2001-$1 $2.",
'version-poweredby-others' => 'anerer',
+'version-poweredby-translators' => 'translatewiki.net Iwwersetzer',
'version-credits-summary' => "Mir soen dëse Persoune 'Merci' fir hir Mataarbecht u [[Special:Version|MediaWiki]].",
'version-license-info' => "MediaWiki ass fräi Software; Dir kënnt se weiderginn an/oder s'änneren ënner de Bedingunge vun der GNU-General Public License sou 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.
@@ -3703,12 +3781,17 @@ Dir misst eng [{{SERVER}}{{SCRIPTPATH}}/COPYING Kopie vun der GNU General Public
'version-entrypoints-header-entrypoint' => 'Agangspunkt',
'version-entrypoints-header-url' => 'URL',
-# Special:FilePath
-'filepath' => 'Pad bei de Fichier',
-'filepath-page' => 'Fichier:',
-'filepath-submit' => 'Lass',
-'filepath-summary' => 'Op dëser Spezialsäit kënnt Dir de komplette Pad vun der aktueller Versioun vun engem Fichier direkt offroen.
-Den ugefrote Fichier gëtt direkt gewise respektiv mat enger verbonner Applikatioun gestart.',
+# Special:Redirect
+'redirect' => 'Viruleedung duerch e Fichier, Benotzer oder Versiouns-ID',
+'redirect-legend' => 'Viruleedung op ee Fichier oder eng Säit',
+'redirect-summary' => 'Dës Spezialsäit ass eng Viruleedung op e Fichier (Fichiersnumm uginn), eng Säit (Versiounsnummer uginn) oder eng Benotzersäit (numeresch Benotzeridentifikatioun uginn).',
+'redirect-submit' => 'Lass',
+'redirect-lookup' => 'Nosichen:',
+'redirect-value' => 'Wäert:',
+'redirect-user' => 'Benotzernummer',
+'redirect-revision' => 'Versioun vun der Säit',
+'redirect-file' => 'Numm vum Fichier',
+'redirect-not-exists' => 'Wäert net fonnt',
# Special:FileDuplicateSearch
'fileduplicatesearch' => 'No duebele Fichiere sichen',
@@ -3758,12 +3841,16 @@ Den ugefrote Fichier gëtt direkt gewise respektiv mat enger verbonner Applikati
'tags' => 'Valabel Ännerungsmarkéierungen',
'tag-filter' => '[[Special:Tags|Markéierungs]]-Filter:',
'tag-filter-submit' => 'Filter',
+'tag-list-wrapper' => '([[Special:Tags|{{PLURAL:$1|Tag|Tags}}]]: $2)',
'tags-title' => 'Markéierungen',
'tags-intro' => 'Op dëser Säit stinn all déi Taggen, déi vun dëser Software fir Ännerungen unzeweise benotzt ginn, an hir Bedeitung.',
'tags-tag' => 'Numm vun der Markéierung',
'tags-display-header' => 'Opzielungen op den Ännerungslëschten',
'tags-description-header' => 'Ganz Beschreiwung vun der Bedeitung',
+'tags-active-header' => 'Aktiv?',
'tags-hitcount-header' => 'Markéiert Ännerungen',
+'tags-active-yes' => 'Jo',
+'tags-active-no' => 'Neen',
'tags-edit' => 'änneren',
'tags-hitcount' => '$1 {{PLURAL:$1|Ännerung|Ännerungen}}',
@@ -3784,6 +3871,7 @@ Den ugefrote Fichier gëtt direkt gewise respektiv mat enger verbonner Applikati
'dberr-problems' => 'Pardon! Dëse Site huet technesch Schwieregkeeten.',
'dberr-again' => 'Versicht e puer Minutten ze waarden an dann nei ze lueden.',
'dberr-info' => '(Den Datebank-Server kann net erreecht ginn: $1)',
+'dberr-info-hidden' => '(Den Datebank-Server kann net erreecht ginn)',
'dberr-usegoogle' => 'An der Tëschenzäit kënnt Dir probéiere mam Google ze sichen.',
'dberr-outofdate' => 'Denkt drunn, datt de Sichindex vun eisen Inhalte méiglecherweis net aktuell ass.',
'dberr-cachederror' => 'Dëst ass eng tëschegespäichert Kopie vun der gefroter Säit, a si kann eventuell net aktuell sinn.',
@@ -3799,6 +3887,9 @@ Den ugefrote Fichier gëtt direkt gewise respektiv mat enger verbonner Applikati
'htmlform-submit' => 'Späicheren',
'htmlform-reset' => 'Ännerungen zrécksetzen',
'htmlform-selectorother-other' => 'Anerer',
+'htmlform-no' => 'Neen',
+'htmlform-yes' => 'Jo',
+'htmlform-chosen-placeholder' => 'Sicht eng Optioun eraus',
# SQLite database support
'sqlite-has-fts' => "$1 ënnerstëtzt d'Volltextsich",
@@ -3916,4 +4007,12 @@ Soss kënnt Dir den einfache Formulär hei drënner benotzen. Är Bemierkung gë
# Image rotation
'rotate-comment' => 'Bild ëm $1 {{PLURAL:$1|Grad}} an der Richtung vun der Auer gedréint',
+# Limit report
+'limitreport-cputime' => 'CPU-Zäit-Notzung',
+'limitreport-cputime-value' => '$1 {{PLURAL:$1|Sekonn|Sekonnen}}',
+'limitreport-walltime' => 'Echtzäitnotzung',
+'limitreport-walltime-value' => '$1 {{PLURAL:$1|Sekonn|Sekonnen}}',
+'limitreport-postexpandincludesize-value' => '$1/$2 {{PLURAL:$2|Byte|Byten}}',
+'limitreport-templateargumentsize-value' => '$1/$2 {{PLURAL:$2|Byte|Byten}}',
+
);
diff --git a/languages/messages/MessagesLbe.php b/languages/messages/MessagesLbe.php
index 544f0260..ae90ef0e 100644
--- a/languages/messages/MessagesLbe.php
+++ b/languages/messages/MessagesLbe.php
@@ -99,7 +99,7 @@ $messages = array(
# Special:Log
'specialloguserlabel' => 'Гьурттучув:',
-# Email user
+# E-mail user
'emailuser' => 'ГьурттучувначӀанÑÑа чагьар',
# Watchlist
diff --git a/languages/messages/MessagesLez.php b/languages/messages/MessagesLez.php
index 94c66fde..df854b83 100644
--- a/languages/messages/MessagesLez.php
+++ b/languages/messages/MessagesLez.php
@@ -23,6 +23,40 @@
$fallback = 'ru';
+$namespaceNames = array(
+ NS_MEDIA => 'Медиа',
+ NS_TALK => 'веревирд_авун',
+ NS_USER => 'Уртах',
+ NS_USER_TALK => 'Уртахдин_веревирд_авун',
+ NS_PROJECT_TALK => '$1_веревирд_авун',
+ NS_FILE => 'Файл',
+ NS_FILE_TALK => 'Файл_веревирд_авун',
+ NS_MEDIAWIKI => 'MediaWiki',
+ NS_MEDIAWIKI_TALK => 'MediaWiki_веревирд_авун',
+ NS_TEMPLATE => 'Шаблон',
+ NS_TEMPLATE_TALK => 'Шаблон_веревирд_авун',
+ NS_CATEGORY => 'КатегориÑ',
+ NS_CATEGORY_TALK => 'КатегориÑ_веревирд_авун',
+);
+
+$namespaceAliases = array(
+ # Russian namespaces
+ 'ОбÑуждение' => NS_TALK,
+ 'УчаÑтник' => NS_USER,
+ 'ОбÑуждение_учаÑтника' => NS_USER_TALK,
+ 'ОбÑуждение_{{GRAMMAR:genitive|$1}}' => NS_PROJECT_TALK,
+ 'ОбÑуждение_файла' => NS_FILE_TALK,
+ 'ОбÑуждение_MediaWiki' => NS_MEDIAWIKI_TALK,
+ 'ОбÑуждение_шаблона' => NS_TEMPLATE_TALK,
+ 'Справка' => NS_HELP,
+ 'ОбÑуждение_Ñправки' => NS_HELP_TALK,
+ 'КатегориÑ' => NS_CATEGORY,
+ 'ОбÑуждение_категории' => NS_CATEGORY_TALK,
+);
+
+// Remove Russian gender aliases
+$namespaceGenderAliases = array();
+
$messages = array(
# User preference toggles
'tog-underline' => 'ЭлÑчӀунрин кӀаникай цӀар чӀугун',
@@ -228,7 +262,7 @@ $messages = array(
'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).
+# 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).
'aboutsite' => ' {{SITENAME}}кай',
'aboutpage' => 'Project:Гьакъиндай',
'copyright' => 'Къене авайбур $1 жугъуриз жеда.',
@@ -238,7 +272,6 @@ $messages = array(
'disclaimers' => 'Жавабдарвал хивÑй акъудун',
'disclaimerpage' => 'Project:Жавабдарвал хивÑй акъудун',
'edithelp' => 'Дуьзар хъувун патал куьмек',
-'edithelppage' => 'Help:Дуьзар хъувун',
'helppage' => 'Help:Къене авайбур',
'mainpage' => 'Кьилин ччин',
'mainpage-description' => 'Кьилин ччин',
@@ -550,7 +583,6 @@ $messages = array(
'searchmenu-legend' => 'Жагъурунин низамарунар',
'searchmenu-exists' => "'''И вики-проектда \"[[:\$1]]\" тlвар алай ччин ава.'''",
'searchmenu-new' => "'''И вики-проектда \"[[:\$1]]\" ччин туькlуьрун !'''",
-'searchhelp-url' => 'Help:КЪене авайбур',
'searchprofile-articles' => 'ÐÑул ччинар',
'searchprofile-project' => 'Куьмек гунин ва проектдин ччинар',
'searchprofile-images' => 'Мультимедиа',
@@ -585,14 +617,6 @@ $messages = array(
'powersearch-toggleall' => 'Вири',
'powersearch-togglenone' => 'Садни',
-# Quickbar
-'qbsettings' => 'КЪекъуьнрин панел',
-'qbsettings-none' => 'Садни',
-'qbsettings-fixedleft' => 'Чапла патахъай юзан тийир',
-'qbsettings-fixedright' => 'ЭрчIи патахъай юзан тийир',
-'qbsettings-floatingleft' => 'Чапла патаз алгъурзава',
-'qbsettings-floatingright' => 'ЭрчIи патаз алгъурзава',
-
# Preferences page
'preferences' => 'Туькlуьрун',
'mypreferences' => 'Зи низамарунар',
@@ -620,7 +644,6 @@ $messages = array(
'resetprefs' => 'Хуьн тавунвай дегишвилер алудун',
'restoreprefs' => 'Ðвайл хьиз кьунвай низамарунар туькIуьр хъувун',
'prefs-editing' => 'Дуьзар хъувун',
-'prefs-edit-boxsize' => 'Дуьзар хъувунин дакIардин кьадар',
'rows' => 'ЦIарар',
'columns' => 'Гулар:',
'searchresultshead' => 'Ðхтармишун',
@@ -750,7 +773,6 @@ $messages = array(
'recentchangeslinked-feed' => 'Галкlанвай дуьзар хъувунар',
'recentchangeslinked-toolbox' => 'Галкlанвай маÑакIавилер',
'recentchangeslinked-title' => '"$1" галаз галкlанавай маÑакIавилер',
-'recentchangeslinked-noresult' => 'Ганвай чlава галкlанавай ччинра Ñа маÑакIавални хьанвайд туш',
'recentchangeslinked-summary' => 'Им къалурай ччиниз (ва Ñ ÐºÑŠÐ°Ð»ÑƒÑ€Ð°Ð¹ категориÑдиз гьатзавай ччинриз) ÑлÑчӀзавай ччинра мукьвара хьайи маÑакӀавилерин ÑиÑгь Ñ. Куь [[Special:Watchlist|вилив хуьнин ÑиÑгь диз]] гьатзавай ччинар ÑцӀу шрифтдал къалурнава.',
'recentchangeslinked-page' => 'Ччинин тlвар:',
'recentchangeslinked-to' => 'ÐкÑина, къалурай ччиниз ÑлÑчlзавай ччинра маÑакIавилер къалура',
@@ -863,8 +885,6 @@ $messages = array(
'statistics-views-total' => 'Вири килигунар',
'statistics-users-active' => 'Ðктив уртахар',
-'disambiguationspage' => 'Template:гзафманавал',
-
'brokenredirects-edit' => 'дегишарун',
'brokenredirects-delete' => 'алудун',
@@ -1228,7 +1248,7 @@ CиÑгьда авай анжах (* лишандихъ галаз ÑгечIза
* gpslongitude
* gpsaltitude',
-# EXIF tags
+# Exif tags
'exif-imagewidth' => 'ГьÑркьуь',
'exif-planarconfiguration' => 'Ганайбур тешкил авун',
'exif-ycbcrsubsampling' => ' Y ва C компонентрин кьадаррин ниÑбет',
diff --git a/languages/messages/MessagesLfn.php b/languages/messages/MessagesLfn.php
index d7138b2f..f0384324 100644
--- a/languages/messages/MessagesLfn.php
+++ b/languages/messages/MessagesLfn.php
@@ -63,7 +63,6 @@ $messages = array(
'tog-enotifrevealaddr' => 'Descovre la me adirije de eposta en postas de nota',
'tog-shownumberswatching' => 'Mostra la numero de usores oservante',
'tog-fancysig' => 'Sinias simple (sin lia automatica)',
-'tog-externaleditor' => 'Usa costumal editadores esterna',
'tog-watchlisthideown' => 'Asconde me editas de la lista de pajes oservada',
'tog-watchlisthidebots' => 'Asconde editas par bot de la lista de pajes oservada',
'tog-watchlisthideminor' => 'Asconde editas minor de la lista de pajes oservada',
@@ -142,7 +141,7 @@ $messages = array(
'cancel' => 'Cansela',
'moredotdotdot' => 'Plu...',
'mypage' => 'Me paje',
-'mytalk' => 'Me discutes',
+'mytalk' => 'Discutes',
'anontalk' => 'Discutes per esta IP',
'navigation' => 'Naviga',
'and' => '&#32;e',
@@ -208,7 +207,7 @@ $messages = array(
'jumptonavigation' => 'naviga',
'jumptosearch' => 'xerca',
-# 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).
+# 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).
'aboutsite' => 'Supra {{SITENAME}}',
'aboutpage' => 'Project:Supra',
'copyrightpage' => '{{ns:project}}:Diretos de autor',
@@ -217,7 +216,6 @@ $messages = array(
'disclaimers' => 'Negas de respondablia',
'disclaimerpage' => 'Project:Nega jeneral de respondablia',
'edithelp' => 'Aida con edita',
-'edithelppage' => 'Help:Edita',
'helppage' => 'Help:Contenis',
'mainpage' => 'Paje Prima',
'mainpage-description' => 'Paje Prima',
@@ -437,7 +435,6 @@ La arcivo de sutraes per esta paje es asi per conveni:",
'prevn' => '{{PLURAL:$1|$1}} presedente',
'nextn' => '{{PLURAL:$1|$1}} seguente',
'viewprevnext' => 'Vide ($1 {{int:pipe-separator}} $2) ($3)',
-'searchhelp-url' => 'Help:Contenis',
'search-result-size' => '$1 ({{PLURAL:$2|1 parola|$2 parolas}})',
'search-section' => '(sesion $1)',
'search-interwiki-default' => 'Resultas de $1:',
@@ -447,7 +444,7 @@ La arcivo de sutraes per esta paje es asi per conveni:",
# Preferences page
'preferences' => 'Preferis',
-'mypreferences' => 'Me preferis',
+'mypreferences' => 'Preferis',
'skin-preview' => 'Previde',
'saveprefs' => 'Fisa',
'rows' => 'Linias:',
@@ -476,6 +473,7 @@ La arcivo de sutraes per esta paje es asi per conveni:",
'gender-female' => 'Fema',
'email' => 'Eposta',
'prefs-help-realname' => 'Tu nom vera no es obligada, ma si tu vole dona tu nom vera, el va es usada per onora tu per tu labora.',
+'prefs-signature' => 'Suscrive',
# User rights
'userrights' => 'Dirije de la diretos de usores',
@@ -521,7 +519,7 @@ La arcivo de sutraes per esta paje es asi per conveni:",
'newpageletter' => 'N',
'boteditletter' => 'b',
'rc_categories_any' => 'Cualce',
-'rc-enhanced-expand' => 'Mostra detalias (JavaScript es nesesada)',
+'rc-enhanced-expand' => 'Mostra detalias',
'rc-enhanced-hide' => 'Asconde detalias',
# Recent changes linked
@@ -529,7 +527,6 @@ La arcivo de sutraes per esta paje es asi per conveni:",
'recentchangeslinked-feed' => 'Cambias relateda',
'recentchangeslinked-toolbox' => 'Cambias relateda',
'recentchangeslinked-title' => 'Cambias relatada a "$1"',
-'recentchangeslinked-noresult' => 'No cambias de pajes liada entre esta periodo.',
'recentchangeslinked-summary' => "Esta lista conteni la cambias plu resente de la pajes liada a otra (o de la membros de un categoria).
Pajes a [[Special:Watchlist|tu lista de pajes oservada]] es en leteras '''forte'''.",
'recentchangeslinked-page' => 'Nom de la paje:',
@@ -558,7 +555,7 @@ Pajes a [[Special:Watchlist|tu lista de pajes oservada]] es en leteras '''forte'
'filehist-dimensions' => 'Mesuras',
'filehist-filesize' => 'Grandia de fix',
'filehist-comment' => 'Comenta',
-'imagelinks' => 'Lias de fix',
+'imagelinks' => 'Usas de fix',
'linkstoimage' => 'Esta {{PLURAL:$1|paje|pajes}} lia a esta fix:',
'nolinkstoimage' => 'Es no pajes ce lia a esta fix.',
'sharedupload' => 'Esta fix es parte de $1 e pote es usada par otra projetas.',
@@ -582,8 +579,6 @@ Pajes a [[Special:Watchlist|tu lista de pajes oservada]] es en leteras '''forte'
# Statistics
'statistics' => 'Statisticas',
-'disambiguations' => 'Pajes desambiguinte',
-
'doubleredirects' => 'Redirijes duple',
'brokenredirects' => 'Redirijes rompeda',
@@ -669,7 +664,7 @@ Also see [[Special:WantedCategories|wanted categories]].',
# Watchlist
'watchlist' => 'Pajes oservada',
-'mywatchlist' => 'Me lista de pajes oservada',
+'mywatchlist' => 'Lista de pajes oservada',
'nowatchlist' => 'Tu ave no cosas en tu lista oservada',
'addedwatchtext' => "La paje \"[[:\$1]]\" ia es juntada a tu [[Special:Watchlist|lista de pajes oservada]].
Cambias future a esta paje e se paje de discutes va es listada ala, e la paje va apera en leteras '''forte''' en la [[Special:RecentChanges|lista de cambias resente]] per es plu fasil oservada.
@@ -930,7 +925,7 @@ Si la fix ia es cambiada de se stato orijinal, alga detalias pote no es clara en
* gpslongitude
* gpsaltitude',
-# EXIF tags
+# Exif tags
'exif-exposuretime-format' => '$1 sec. ($2)',
# External editor support
@@ -954,9 +949,6 @@ Si la fix ia es cambiada de se stato orijinal, alga detalias pote no es clara en
'version' => 'Varia',
'version-version' => '(Varia $1)',
-# Special:FilePath
-'filepath-page' => 'Fix:',
-
# Special:FileDuplicateSearch
'fileduplicatesearch-submit' => 'Xerca',
diff --git a/languages/messages/MessagesLg.php b/languages/messages/MessagesLg.php
index d951f6e5..da02d48a 100644
--- a/languages/messages/MessagesLg.php
+++ b/languages/messages/MessagesLg.php
@@ -41,9 +41,6 @@ $messages = array(
'tog-shownumberswatching' => "Ndaganga obungi bw'abagoberera olupapula",
'tog-oldsig' => 'Omukono gwo kakano:',
'tog-fancysig' => 'Omukono gubemu obubonero bwa ki-wiki (naye nga tegufuuka nyunzi)',
-'tog-externaleditor' => 'Wandikisanga puloguramu eri ku kompyuta yo (kyetaagisa bumanyirivu bungi, kubanga wetaaga okutegeka kompyuta yo mu ngeri ezitali za bulijjo. [//www.mediawiki.org/wiki/Manual:External_editors Okutangaaza okusingawo.])',
-'tog-externaldiff' => "Kozesanga puloguramu ey'oku kompyuta yo okukebera njawulo wakati w'ebiwandike (kyetaagisa bumanyirivu bungi, wetaaga ntegeka ezitali za bulijjo ku kompyuta yo. [//www.mediawiki.org/wiki/Manual:External_editors Okutangaaza okusingawo.])",
-'tog-showjumplinks' => 'Wabeerewo enyunzi eza "Genda ku"',
'tog-uselivepreview' => 'Enkyukakyuka ze nkoze zirabikirewo nga tekyetaagisiza kumala kunyiga ppeesa (kyetaagisa JavaScript)(Kikyagezesebwa)',
'tog-forceeditsummary' => 'ÅŠambaako bwe mba Å‹enda okuleka nga sinnyonyodde bye nkyusizza',
'tog-watchlisthideown' => "Nze bye nkyusizza bireme okulabikira mu lukalala lw'empapula ze ngoberera",
@@ -239,7 +236,7 @@ $1",
'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).
+# 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).
'aboutsite' => 'Okutangaaza ku {{SITENAME}}',
'aboutpage' => 'Project:Okutangaaza ku',
'copyright' => 'Ebiri kuno bifugibwa $1.',
@@ -249,7 +246,6 @@ $1",
'disclaimers' => "Okutangaaza ku kkomo ery'obuvunaaniro bwaffe obw'omu mateeka",
'disclaimerpage' => "Project:Okutangaaza ku kkomo ery'obuvunaaniro bwaffe obw'omu mateeka",
'edithelp' => 'Nyamba',
-'edithelppage' => "Help:Obuyambi ku by'okukyusakyusa",
'helppage' => 'Help:Endagiriro',
'mainpage' => 'Olupapula Olusooka',
'mainpage-description' => 'Olupapula Olusooka',
@@ -321,17 +317,6 @@ Ku lupapula "[[Special:SpecialPages|{{int:specialpages}}]]" kuliko olukalala lw\
# General errors
'error' => 'Kiremya',
'databaseerror' => 'Waliwo kiremya ku ggwanika lya data',
-'dberrortext' => 'Waliwo kiremya avudde ku mpandika y\'ekiragiro ekinoonyeza mu ggwanika lya data.<br />
-Ayinza okuba nga azze lwa nsobi mu sofutiweya wa lyo.<br />
-Ekiragiro ekinoonyeza mu ggwanika lya data ekisembye okuyisibwa kiri:<br />
-<blockquote><tt>$1</tt></blockquote>
-ekisangibwa mu mukolo gwa puloguramu "<tt>$2</tt>".<br />
-Obubaka obuvudde mu ggwanika lya data obufa ku kiremya buli "<tt>$3: $4</tt>".',
-'dberrortextcl' => 'Waliwo kiremya avudde ku mpandika y\'ekiragiro ekinoonyeza mu ggwanika lya data.<br />
-Ekiragiro ekinoonyeza mu ggwanika lya data ekisembye okuyisibwa kiri:<br />
-"$1" <br />
-ekisangibwa mu mukolo gwa mu puloguramu "$2".<br />
-Obubaka obuvudde mu ggwanika lya data obufa ku kiremya buli "$3: $4"',
'laggedslavemode' => "'''Kulabula:''' Olupapula luyinza obutabaamu ebyakalukyusibwamu.",
'readonly' => 'Eggwanika lya data terikkiriza kulikyusamu',
'enterlockreason' => "Wandikawo ensonga esibizza eggwanika lya data, nga olaga ddi lw'olisuubira okusumululwa",
@@ -384,7 +369,6 @@ Lindako eddakiika entonotono oly'oke oddemu okugezako ekikolwa.",
Luliko ebikugizo ebirugaana okwonooebwa.",
'editinginterface' => "'''Kulabula:''' Okyusa olupapula sofutiweya kw'egya ebigambo byayo.
Enkyukakyuka z'okola wano zigyakubaako kye zikola ku ngeri abantu gye bakozesaamu enfo eno.",
-'sqlhidden' => '(Waliwo wo ebya SQL ebibikkidwa)',
'cascadeprotected' => 'Olupapula luno lulandideko ekikugizo ekirugaana okukyusibwako ekisibuka ku {{PLURAL:$1|lunnaalwo luno olulukozesa|zinnalwo zino ezirukozesa}}:<br />
$2',
'namespaceprotected' => "Tolina buyinza bwa kukyusa ku mpapula ez'omu kkuŋaanizo erya '''$1'''.",
@@ -406,7 +390,6 @@ Wekkaanye, empapula ezimu ziyinza okukweyolekera nga bwe zibadde nga oyingidde -
'yourpassword' => 'Ekigambo ekikuumi',
'yourpasswordagain' => 'Ddamu ekigambo ekikuumi',
'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',
@@ -511,7 +494,7 @@ Okuyingirira ddala, wetaaga okuwandika wano ekinaaba ekyama kyo ekya ddala:",
'newpassword' => 'Ekigambo ekikuumi ekipya:',
'retypenew' => 'Ddamu ekikagambo ekikuumi ekipya ekyo:',
'resetpass_submit' => 'Kaza ekyama oyingire',
-'resetpass_success' => 'Ekigambo kyo ekikuumi kikyusidwa!<br />
+'changepassword-success' => 'Ekigambo kyo ekikuumi kikyusidwa!<br />
Kati oyingira...',
'resetpass_forbidden' => 'Tekikkirizibwa okukyusa ebigambo ebikuumi',
'resetpass-no-info' => 'Okukola ku lupapula luno obutereevu, wetaaga okuba nga oyingidde sisitemu.',
@@ -523,10 +506,8 @@ Oyinz'okuba nga wamaze okutegeka ekya ddala ekipya oba nga wakasabayo eky'ekisee
# Special:PasswordReset
'passwordreset' => 'Damu okutegeka ekyama',
-'passwordreset-text' => "Oba oyagala okufuna 'email' ekujjukiza ebikwata ku akawunti yo, jjuza foomu eno.",
'passwordreset-legend' => 'Damu okutegeka ekyama',
'passwordreset-disabled' => "Eby'okuddamu okutegeka ebyama biymirizidwa ku wiki eno.",
-'passwordreset-pretext' => '{{PLURAL:$1||Wandika wo kimu ku ebiri mu lukalala}}',
'passwordreset-username' => "Ery'obwa memba:",
'passwordreset-email' => "Endagiriro eya 'email':",
'passwordreset-emailtitle' => "Ebya akawunti ey'oku {{SITENAME}}",
@@ -750,6 +731,9 @@ Kirabika lwagyibwawo.',
'edit-no-change' => "Sisitemu ekubaze nga atalina ky'agikozeko, olw'okubanga ebiri ku lupapula obirese nga bwe wabisanze.",
'edit-already-exists' => "Olupapula lw'ogeza okukolawo weruli, lwakolebwawo dda.<br />
Tekisobose kuddamu n'ate oulukolawo.",
+'editwarning-warning' => 'Bw\'ova ku lupapula luno kiyinza okuleetera enkyukakyuka z\'olukozeko okuvawo.<br />
+Bw\'oba nga okola oyingidde mu sisitemu, okulabula kuno oyinza okukusirisa nga weyambisa<br />
+ebiri mu kitundu ekya "Kukyusa" eky\'omu "Nteekateeka yange".',
# Parser/template warnings
'expensive-parserfunction-warning' => "'''Kulabula:''' Olupapula luno luliko ebiragiro eby'ekikebera engoberera y'amateeka g'empandika ebizito ebiyitiridde obungi.<br />
@@ -824,7 +808,6 @@ oba ku gano agali ku lupapula luno.<br />
'searchmenu-legend' => 'Kyusamu ennoonya',
'searchmenu-exists' => "'''Olupapula \"[[:\$1]]\" gyeruli ku wiki eno.'''",
'searchmenu-new' => "'''Oba oyagala, olupapula \"[[:\$1]]\" gwe osobola okulukolawo ku wiki eno.'''",
-'searchhelp-url' => 'Help:Endagiriro',
'searchmenu-prefix' => '[[Special:PrefixIndex/$1|Kebera mu mpapula eziriko akatandikwa kano]]',
'searchprofile-articles' => "Empapula ez'ensonga",
'searchprofile-project' => "Empapula eziriko obuyambi n'eza Kawefube",
@@ -937,7 +920,6 @@ W'owandikira by'onoonya bw'osoosawo akagambo ''all:'', okunoonya kubuna Wikipedi
'recentchangeslinked-feed' => 'Ebikyusiddwa ebyekuusa ku lupapula luno',
'recentchangeslinked-toolbox' => 'Ebikyusiddwa ebyekuusa ku lupapula luno',
'recentchangeslinked-title' => 'Enkyukakyuka ezikwatagana ne "$1"',
-'recentchangeslinked-noresult' => 'Empapula eziriko enyunzi tewali lukyuse mu kiseera kino.',
'recentchangeslinked-summary' => "Olulpapula olw'enjawulo luno luliko olukalala lw'ebikyuse ku mpapula eziriko enyunzi ezigguka ku lw'obadde otunuulira. Ebiwandikidwa mu '''nukuta enziggumivu''' biri ku [[Special:Watchlist|mpapula z'ogoberera]].",
'recentchangeslinked-page' => 'Lupapula:',
'recentchangeslinked-to' => "Nonamu eby'empapula ezikuggusa ku luno zokka",
diff --git a/languages/messages/MessagesLi.php b/languages/messages/MessagesLi.php
index 6d074480..44efb2f0 100644
--- a/languages/messages/MessagesLi.php
+++ b/languages/messages/MessagesLi.php
@@ -187,9 +187,6 @@ $messages = array(
'tog-shownumberswatching' => "'t Aantal gebroekers tuine die dees pagina volg",
'tog-oldsig' => 'Bestaonde ongerteikening:',
'tog-fancysig' => 'Es wikiteks behanjele (zonder autematische verwiezing)',
-'tog-externaleditor' => "Sjtanderd 'ne externe teksbewirker gebroeke (inkel veur experts, speciaal instellinge zien nudig. [//www.mediawiki.org/wiki/Manual:External_editors Mie infermasie])",
-'tog-externaldiff' => "Sjtanderd 'n extern vergeliekingsprogramma gebroeke (inkel veur experts, speciaal instellinge zien nudig [//www.mediawiki.org/wiki/Manual:External_editors Mie infermasie])",
-'tog-showjumplinks' => '"gank nao"-toegankelikheidslinks mäögelik make',
'tog-uselivepreview' => '"live veurbesjouwing" gebroeke (vereis JavaScript - experimenteel)',
'tog-forceeditsummary' => "'n Melding gaeve bie 'n laeg samevatting",
'tog-watchlisthideown' => 'Eige bewirkinge verberge op mien volglies',
@@ -202,6 +199,7 @@ $messages = array(
'tog-diffonly' => 'Pagina-inhaud zónger verangeringe neet tuine',
'tog-showhiddencats' => 'Verbórge categorië tuine',
'tog-norollbackdiff' => 'Wieziginge eweglaote nao trökdrieje',
+'tog-useeditwarning' => "Waorssjoew mich es ich 'n bewerkdje pagina die nag neet is opgeslage wil verlaote",
'underline-always' => 'Altied',
'underline-never' => 'Noets',
@@ -387,7 +385,7 @@ $1',
'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).
+# 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).
'aboutsite' => 'Euver {{SITENAME}}',
'aboutpage' => 'Project:Info',
'copyright' => 'De inhawd is besjikbaar ónger de $1.',
@@ -397,7 +395,6 @@ $1',
'disclaimers' => 'Aafwiezinge aansjprakelikheid',
'disclaimerpage' => 'Project:Algemein aafwiezing aansjprakelikheid',
'edithelp' => 'Hulp bie bewirke',
-'edithelppage' => 'Help:Instructies',
'helppage' => 'Help:Help',
'mainpage' => 'Veurblaad',
'mainpage-description' => 'Veurblaad',
@@ -470,17 +467,6 @@ Mäögelik höbs te 'n typefout gemaak in de URL, of 'n verkierde verwiezing gev
# General errors
'error' => 'Fout',
'databaseerror' => 'Databasefout',
-'dberrortext' => 'Bie \'t zeuke is \'n syntaxfout in de database opgetraoje.
-Dit kan zien veroorzaak door \'n fout in de software.
-De lètste zeukpoging in de database waor:
-<blockquote><tt>$1</tt></blockquote>
-vanoet de functie "<tt>$2</tt>".
-Database gaof de foutmelding "<tt>$3: $4</tt>".',
-'dberrortextcl' => 'Dao is \'n syntaxfout opgetreje bie \'t zeuke in de database.
-De lèste opgevraogde zeukactie waor:
-"$1"
-vanoet de functie "$2".
-Database brach fout "$3" nao veure: "$4"',
'laggedslavemode' => 'Waarsjoewing: de pagina kin verauwerd zien.',
'readonly' => 'Database geblokkeerd',
'enterlockreason' => "Gaef 'n rae veur de blokkering en wie lank 't dinkelik zal dore. De ingegaeve rae zal aan de gebroekers getuind waere.",
@@ -532,7 +518,6 @@ Query: $2',
'viewyourtext' => 'Doe kans "dien bewèrkinge" ane brónteks van dees pagina bekieke en euverkopiëre:',
'protectedinterface' => 'Deze pagina bevat teks veur berichte van de software en is beveilig om misbroek te veurkomme.',
'editinginterface' => "'''Waarsjoewing:''' Doe bewirks 'n pagina die gebroek waert door de software. Bewirkinge op dees pagina beïnvlode de gebroekersinterface van jederein. Euverwaeg veur euverzèttinge [//translatewiki.net/wiki/Main_Page?setlang=li translatewiki.net] te gebroeke, 't euverzèttingssprojek veur MediaWiki.",
-'sqlhidden' => '(SQL query verborge)',
'cascadeprotected' => "Deze pagina kin neet bewirk waere, omdet zie is opgenome in de volgende {{PLURAL:$1|pagina|pagina's}} die beveilig {{PLURAL:$1|is|zeen}} mèt de kaskaad-optie:
$2",
'namespaceprotected' => "Doe höbs gein rechte om pagina's in de naamruumde '''$1''' te bewirke.",
@@ -563,7 +548,6 @@ Mäögelik waert nog 'n deil pagina's getuind esofs te nog aangemeld bis pès te
'yourpassword' => 'Die wachwaord',
'yourpasswordagain' => 'Wachwaord opnuuj intype',
'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',
@@ -657,7 +641,7 @@ Doe mós effe wachte ierdets te 't obbenuuts kens perbere.",
'newpassword' => 'Nuuj wachwaord',
'retypenew' => "Veur 't nuuj wachwaord nogins in",
'resetpass_submit' => 'Wachwaord instelle en aanmelje',
-'resetpass_success' => 'Dien wachwaord is verangerd. Bezig mèt aanmelje...',
+'changepassword-success' => 'Dien wachwaord is verangerd. Bezig mèt aanmelje...',
'resetpass_forbidden' => 'Wachwäörd kónne neet verangerd waere',
'resetpass-no-info' => 'Doe moos aangemeld zien ierdets doe dees pagina gebroeke kens.',
'resetpass-submit-loggedin' => 'Wachwaord wiezige',
@@ -668,10 +652,8 @@ Meugelik höbs doe dien wachwaord al gewiezig of 'n nuuj tiedelik wachwaord aang
# Special:PasswordReset
'passwordreset' => 'Wachwaord obbenuuts insjtèlle',
-'passwordreset-text' => "Völ dit form aan zodet weer dich 'ne mail kinne sjikk mit dien gebroekersgegaeves.",
'passwordreset-legend' => 'Wachwaord obbenuuts insjtèlle',
'passwordreset-disabled' => "'t Is hie neet meugelik óm die wachwaord óbbenuits in te sjtelle.",
-'passwordreset-pretext' => '{{PLURAL:$1||Veur ei van de vèljer hieónger in}}',
'passwordreset-username' => 'Gebroekersnaam:',
'passwordreset-domain' => 'Domein:',
'passwordreset-capture' => 'Bekiek de resulterenden e-mail?',
@@ -892,6 +874,8 @@ Ze lik eweggesjaf te zien.',
'edit-already-exists' => 'De pagina is neet aangemaak.
Zie besjteit al.',
'defaultmessagetext' => 'Obligaten teks',
+'editwarning-warning' => "Es se dees pagina verleets verluus se meugelik wieziginge die se haes gemaak.
+Es se bös aangemeld, kins se dees waorsjoewing oetzètten in 't bewerkingstabblaad in dien veurkäöre.",
# Parser/template warnings
'expensive-parserfunction-warning' => "'''Waarschuwing:''' dees pagina gebroek te väöl kosbare parserfuncties.
@@ -1121,7 +1105,6 @@ Wees zeker det deze wieziging de gesjiedenisdoorloupendheid van de pagina zal be
'searchmenu-legend' => 'Zeukopties',
'searchmenu-exists' => "* Pagina '''[[$1]]'''",
'searchmenu-new' => "'''De pagina \"[[:\$1]]\" aanmake op deze wiki'''",
-'searchhelp-url' => 'Help:Help',
'searchmenu-prefix' => '[[Special:PrefixIndex/$1|Paginanaome mit dit veurveugsel weergaeve]]',
'searchprofile-articles' => "Inhaudelike pagina's",
'searchprofile-project' => "Help- en projekpagina's",
@@ -1167,15 +1150,6 @@ Doe kans ouch 'n naamruumde es veurvoegsel gebroeke.",
Zoelang as de servers nog neet sjterk genog zunt kins e zeuke bie Google.
Mèrk op dat hun indexe van {{SITENAME}} content e bietje gedatierd kint zien.',
-# Quickbar
-'qbsettings' => 'Menubalkinsjtèllinge',
-'qbsettings-none' => 'Oetgesjakeld',
-'qbsettings-fixedleft' => 'Links vas',
-'qbsettings-fixedright' => 'Rechts vas',
-'qbsettings-floatingleft' => 'Links zjwevend',
-'qbsettings-floatingright' => 'Rechs zjwevend',
-'qbsettings-directionality' => 'Vas, aafhenkelik vanne sjrifrichting van dien sjpraok',
-
# Preferences page
'preferences' => 'Veurkäöre',
'mypreferences' => 'Mien veurkäöre',
@@ -1208,7 +1182,6 @@ Mèrk op dat hun indexe van {{SITENAME}} content e bietje gedatierd kint zien.',
'resetprefs' => 'Sjtandaardveurkäöre hersjtèlle',
'restoreprefs' => 'Terug nao standaardinstellinge',
'prefs-editing' => 'Aafmeitinge tèksveld',
-'prefs-edit-boxsize' => "Aafmetinge van 't bewirkingsvinster.",
'rows' => 'Regels',
'columns' => 'Kolomme',
'searchresultshead' => 'Insjtèllinge veur zeukresultate',
@@ -1219,9 +1192,6 @@ Mèrk op dat hun indexe van {{SITENAME}} content e bietje gedatierd kint zien.',
'recentchangesdays-max' => '(maximaal $1 {{PLURAL:$1|daag|daag}})',
'recentchangescount' => 'Standerd aantal waer te gaeve bewèrkinge:',
'prefs-help-recentchangescount' => "Dit gelt veur recente wieziginge, paginagesjiedenis en logbookpagina's.",
-'prefs-help-watchlist-token' => 'Door hie ne geheime sleutel in te vulle wurt nen RSS-feed veur dien volglies aangemaak.
-Ederein dae deze sleutel kint kin dien volglies laeze, dus kees ne veilige sleutel.
-Hie volg n willekäörig gegenereerde waerde die se kins gebroeke: $1',
'savedprefs' => 'Dien veurkäöre zint opgesjlage.',
'timezonelegend' => 'Tiedzone:',
'localtime' => 'Plaatselike tied',
@@ -1252,7 +1222,6 @@ Hie volg n willekäörig gegenereerde waerde die se kins gebroeke: $1',
'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:',
-'prefs-textboxsize' => 'Aafmaetinge bewirkingssjerm',
'youremail' => 'Dien e-mailadres',
'username' => 'Gebroekersnaam:',
'uid' => 'Gebroekersnómmer:',
@@ -1492,7 +1461,6 @@ Deze informatie is zichbaar veur angere gebroekers.',
'recentchangeslinked-feed' => 'Volg links',
'recentchangeslinked-toolbox' => 'Volg links',
'recentchangeslinked-title' => 'Verangeringe verwant mit "$1"',
-'recentchangeslinked-noresult' => "d'r Zeen gein bewerkinge in de gegaeve periode gewaes op de pagina's die vanaaf hiej gelink waere.",
'recentchangeslinked-summary' => "Dees speciaal pagina tuint de lètste bewirkinge op pagina's die gelink waere vanaaf deze pagina. Pagina's die op [[Special:Watchlist|dien volglies]] staon waere '''vet''' weergegaeve.",
'recentchangeslinked-page' => 'Paginanaam:',
'recentchangeslinked-to' => "Verangeringe weergaeve nao de gelinkde pagina's",
@@ -1715,7 +1683,6 @@ Om beveiligingsrede is img_auth.php oetgesjakeld.",
'http-read-error' => 'HTTP-laezingsfout.',
'http-timed-out' => 'HTTP-verzeuktimeout',
'http-curl-error' => 'Óphaolingsfout URL: $1',
-'http-host-unreachable' => 'Kòs de URL neet bereike',
'http-bad-status' => "d'r Is e perbleem ópgetraoje bie 't HTTP-verzeuk: $1 $2",
# Some likely curl errors. More could be added from <http://curl.haxx.se/libcurl/c/libcurl-errors.html>
@@ -1860,12 +1827,6 @@ De [$2 pagina mit de besjtandjsbesjrieving] wurt hiejónger weergegaeve.',
'statistics-users-active-desc' => "Gebroekers die in de aafgeloupe {{PLURAL:$1|daag|$1 daag}} 'ne hanjeling höbbe oetgevoerd",
'statistics-mostpopular' => "Meisbekeke pazjena's",
-'disambiguations' => "Links nao verdudelikingspazjena's",
-'disambiguationspage' => 'Template:Verdudeliking',
-'disambiguations-text' => "Hiej onger staon pagina's die verwieze nao 'ne '''redirect'''.
-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' => "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.
@@ -2110,10 +2071,9 @@ Toekomstige verangeringe aan dees pagina en de biebehurende euverlèkpagina weur
'unwatchthispage' => 'Neet mië volge',
'notanarticle' => 'Is gein artikel',
'notvisiblerev' => 'Bewèrking is verwiederd',
-'watchnochange' => 'Gein van dien gevolgde items is aangepas in dees periode.',
'watchlist-details' => "D'r {{PLURAL:$1|sjteit ein pagina|sjtaon $1 pagina's}} op dien volglies mit oetzunjering van de euverlèkpagina's.",
-'wlheader-enotif' => '* Doe wörs per e-mail gewaarsjuwd',
-'wlheader-showupdated' => "* Pazjena's die verangerd zeen saers doe ze veur 't lètste bekeeks sjtaon '''vet'''",
+'wlheader-enotif' => 'Doe wörs per e-mail gewaarsjuwd',
+'wlheader-showupdated' => "Pazjena's die verangerd zeen saers doe ze veur 't lètste bekeeks sjtaon '''vet'''",
'watchmethod-recent' => "Controleer recènte verangere veur gevolgde pazjena's",
'watchmethod-list' => "controlere van gevolgde pazjena's veur recènte verangeringe",
'watchlistcontains' => "Dien volglies bevat $1 {{PLURAL:$1|pazjena|pazjena's}}.",
@@ -2490,11 +2450,8 @@ Wils se de instellinge wiezige?',
'ipb_blocked_as_range' => "Fout: 't IP-adres $1 is neet direct geblokkeerd en de blokkade kan neet opgeheve waere. De blokkade is ongerdeil van de reeks $2, wovan de blokkade waal opgeheve kan waere.",
'ip_range_invalid' => 'Ongeldige IP-reeks',
'ip_range_toolarge' => 'Reeksblokkades groeater es /$1 kènne neet.',
-'blockme' => 'Blokkeer mich',
'proxyblocker' => 'Proxyblokker',
-'proxyblocker-disabled' => 'Deze functie is oetgesjakeld.',
'proxyblockreason' => "Dien IP-adres is geblokkeerd ómdat 't 'n aope proxy is. Contacteer estebleef diene internet service provider of technische óngersjteuning en informeer ze euver dit serjeus veiligheidsprebleem.",
-'proxyblocksuccess' => 'Klaor.',
'sorbsreason' => 'Dien IP-adres is opgenaome in de DNS-blacklist es open proxyserver, dae {{SITENAME}} gebroek.',
'sorbs_create_account_reason' => 'Dien IP-adres is opgenómme in de DNS-blacklist es open proxyserver, dae {{SITENAME}} gebroek. De kèns gein gebroekersaccount aanmake.',
'cant-block-while-blocked' => 'De kins anger gebroekers neet blokkere terwiel se zelf geblokkeerd bös.',
@@ -2830,8 +2787,6 @@ Meistal wörd dit door 'ne zwarte externe link veroorzaak.",
'pageinfo-authors' => 'Aantal versjillende sjrievers',
# Skin names
-'skinname-standard' => 'Standaard',
-'skinname-nostalgia' => 'Nostalgie',
'skinname-cologneblue' => 'Keuls blauw',
# Patrolling
@@ -2930,7 +2885,7 @@ Alle volgende links die op dezelfde regel sjtaon, waere behanjeld es oetzunjerin
* gpslongitude
* gpsaltitude",
-# EXIF tags
+# Exif tags
'exif-imagewidth' => 'Breidte',
'exif-imagelength' => 'Hoogte',
'exif-bitspersample' => 'Bits per componènt',
@@ -3108,7 +3063,7 @@ Alle volgende links die op dezelfde regel sjtaon, waere behanjeld es oetzunjerin
'exif-originalimageheight' => 'Heugdje vanne aafbeilding veur biesnieje',
'exif-originalimagewidth' => 'Brèdje vanne aafbeilding veur biesnieje',
-# EXIF attributes
+# Exif attributes
'exif-compression-1' => 'Óngecómprimeerd',
'exif-compression-2' => 'CCITT Groep 3 1-dimensionale aangepasde "Huffman run length"-codering',
'exif-compression-3' => 'CCITT Groep 3 faxcodering',
@@ -3495,7 +3450,6 @@ De kèns ouch [[Special:EditWatchlist|'t sjtanderd bewirkingssjirm gebroeke]].",
'version-other' => 'Euverige',
'version-mediahandlers' => 'Mediaverwerkers',
'version-hooks' => 'Heuk',
-'version-extension-functions' => 'Oetbreijingsfuncties',
'version-parser-extensiontags' => 'Parseroetbreijingstags',
'version-parser-function-hooks' => 'Parserfunctieheuk',
'version-hook-name' => 'Hooknaam',
@@ -3516,13 +3470,6 @@ Same mit dit programma heurs se 'n [{{SERVER}}{{SCRIPTPATH}}/COPYING kopie van d
'version-entrypoints-header-entrypoint' => 'Ingank',
'version-entrypoints-header-url' => 'URL',
-# Special:FilePath
-'filepath' => 'Bestandjspaad',
-'filepath-page' => 'Bestandj:',
-'filepath-submit' => 'Zeuk',
-'filepath-summary' => "Dees speciaal pazjena guf 't vollejig paad veur 'n bestandj.
-Aafbeildinge waere in häör vollejige resolutie getoeandj. Anger bestandjstypes waere drèk in 't mit 't MIME-type verbónje programma geäöpendj.",
-
# Special:FileDuplicateSearch
'fileduplicatesearch' => 'Zeuk veur döbbelbestaondje bestenj',
'fileduplicatesearch-summary' => 'Zeuk veur döbbel bestaondje bestenj op basis van zien hashwaarde.',
diff --git a/languages/messages/MessagesLij.php b/languages/messages/MessagesLij.php
index 8406aa58..2bd36f89 100644
--- a/languages/messages/MessagesLij.php
+++ b/languages/messages/MessagesLij.php
@@ -155,7 +155,6 @@ $messages = array(
'tog-shownumberswatching' => "Mostra o numero di utenti che tegnan d'oeuggio sta pagina",
'tog-oldsig' => 'Firma attuale:',
'tog-fancysig' => 'Tratta a firma comme wikitesto (sensa un collegamento aotomatico)',
-'tog-showjumplinks' => 'Attiva i collegamenti d\'accescibilitæ "sata a"',
'tog-uselivepreview' => "Doeuvia l'anteprimma in diretta (ghe voeu o JavaScript)(sperimentâ)",
'tog-watchlisthideown' => "Ascondi e mæ modiffiche da-a lista che tegno d'oeuggio",
'tog-watchlisthidebots' => "Ascondi e modiffiche di bot da-a lista che tegno d'oeuggio",
@@ -167,6 +166,7 @@ $messages = array(
'tog-diffonly' => 'No mostrâ o contegnuo da paggina sotta o confronto tra verscioin',
'tog-showhiddencats' => 'Fa vedde e categorîe ascose',
'tog-norollbackdiff' => "Ometti o confronto tra verscioin doppo ch'ho fæto o ripristino",
+'tog-useeditwarning' => "Avertime se lascio 'na paggina de modiffica sens'avei sarvou i cangi",
'underline-always' => 'Sempre',
'underline-never' => 'Mâi',
@@ -225,6 +225,16 @@ $messages = array(
'oct' => 'Öto',
'nov' => 'Nov',
'dec' => 'Dex',
+'january-date' => '$1 zenâ',
+'february-date' => '$1 frevâ',
+'march-date' => '$1 março',
+'april-date' => '$1 arvî',
+'may-date' => '$1 mazzo',
+'june-date' => '$1 zugno',
+'july-date' => '$1 luggio',
+'september-date' => '$1 setenbre',
+'october-date' => '$1 otobre',
+'december-date' => '$1 dexenbre',
# Categories related messages
'pagecategories' => '{{PLURAL:$1|Categorîa|Categorîe}}',
@@ -304,6 +314,7 @@ $messages = array(
'create-this-page' => "Crea 'sta paggina",
'delete' => 'Scancella',
'deletethispage' => "Scassa 'sta paggina",
+'undeletethispage' => 'Recuppera sta paggina',
'undelete_short' => 'Recuppera {{PLURAL:$1|una revixon|$1 revixoin}}',
'protect' => 'Protezi',
'protect_change' => 'cangia',
@@ -344,7 +355,7 @@ Aspeta quarche menuto primma de çercâ torna d'accede a sta pagina.
$1",
'pool-errorunknown' => 'Aro sconosciuo',
-# 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).
+# 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).
'aboutsite' => 'Informaçioìn in sciô {{SITENAME}}',
'aboutpage' => 'Project:Informaçioìn',
'copyright' => 'O contegnûo o se peu trovâ a $1.',
@@ -354,7 +365,6 @@ $1",
'disclaimers' => 'Avertense',
'disclaimerpage' => 'Project:Avertense generâli',
'edithelp' => 'Agiùtto',
-'edithelppage' => 'Help:Modiffica',
'helppage' => 'Help:Contegnûi',
'mainpage' => 'Pàgina prinçipâ',
'mainpage-description' => 'Pagina prinçipâ',
@@ -462,7 +472,11 @@ A raxon a l'è: ''$2''.",
'yourname' => 'Nomme',
'yourpassword' => 'Pòula segretta:',
'yourpasswordagain' => 'Riscrivi a pòula segrétta:',
+'createacct-yourpasswordagain' => 'Conferma a password',
+'createacct-yourpasswordagain-ph' => "Conferma a password un'atra votta",
'remembermypassword' => 'Aregòrda a mæ login in sto navegatô (pe in mascimo de $1 {{PLURAL:$1|giórno|giórni}})',
+'userlogin-remembermypassword' => 'Mantegnime collegou',
+'userlogin-signwithsecure' => 'Adoeuvia una conescion segua',
'yourdomainname' => 'Indirisso do scito:',
'password-change-forbidden' => 'No ti peu cangiâ poula segretta in questa wiki.',
'login' => 'Intra',
@@ -479,12 +493,21 @@ A raxon a l'è: ''$2''.",
'gotaccount' => "Ti ghe l'æ za 'n' utensa? '''$1'''.",
'gotaccountlink' => 'Intra',
'userlogin-resetlink' => "T'æ ascordòu i teu dæti de acesso?",
+'userlogin-resetpassword-link' => 'Reimposta a to password',
+'userlogin-helplink' => '[[{{MediaWiki:helplogin-url}}|Agiutto co-o login]]',
+'createacct-join' => 'Inserisci i to dæti chi sotta.',
'createaccountmail' => "Doeuvia una password temporanea abrettio e mandila a l'adresso de posta elettronica speçificou",
'createaccountreason' => 'Raxon:',
+'createacct-imgcaptcha-ph' => "Scrivi quello che ti veddi de d'ato",
+'createacct-submit' => 'Crea a to utensa',
+'createacct-another-submit' => "Crea un'atra utensa",
+'createacct-benefit-body2' => '{{PLURAL:$1|paggina|paggine}}',
+'createacct-benefit-body3' => '{{PLURAL:$1|contribuiou|contribuioei}}',
'badretype' => "E paròlle d'ordine che t'hæ scrîo son despægie.",
'userexists' => "O nomme ûtente inserîo o l'è za doeuviao.<br />
Çernine 'n âtro.",
'loginerror' => "Errô inte l'accesso",
+'createacct-error' => "Errô inta la creaçion de l'utença",
'createaccounterror' => "Imposcibbile creâ l'account: $1",
'noname' => "O nomme d'ûtente o l'è sballiòu.",
'loginsuccesstitle' => 'Accesso effettuòu',
@@ -535,6 +558,7 @@ Pe abilitâ l'invîo de messaggi e-mail pe quest'accesso, o se deive seguî l'is
'newpassword' => 'Neuva poula segretta',
'retypenew' => "Ripette a nêuva paròlla d'ordine:",
'resetpass_submit' => 'Çerni a poula segretta e intra',
+'changepassword-success' => "O cangio de password o l'é anæto ben!",
'resetpass_forbidden' => "No l'é poscìbile cangiâ e paròlle segrétte",
'resetpass-submit-loggedin' => 'Cangia a password',
'resetpass-submit-cancel' => 'Anulla',
@@ -555,6 +579,9 @@ Poula segretta temporannia: $2',
'changeemail-submit' => 'Cangia e-mail',
'changeemail-cancel' => 'Annulla',
+# Special:ResetTokens
+'resettokens-token-label' => "$1 (oua o l'è: $2)",
+
# Edit page toolbar
'bold_sample' => 'Grascetto',
'bold_tip' => 'Grascetto',
@@ -729,7 +756,6 @@ Legenda: (corr) = differense co-a verscion corrente, (prec) = differense co-a ve
'viewprevnext' => 'Veddi ($1 {{int:pipe-separator}} $2) ($3).',
'searchmenu-exists' => "'''Inte questa wiki gh'è za 'na pàgina co-o nómme \"[[:\$1]]\"'''",
'searchmenu-new' => 'Crea a pagina "[[:$1]]" insce questo scito',
-'searchhelp-url' => 'Help:Contegnûi',
'searchprofile-articles' => 'Pàgina di contegnûi',
'searchprofile-project' => 'Pàgine de agiùtto e relative a-o progetto',
'searchprofile-images' => 'Moltimedia',
@@ -827,7 +853,6 @@ Legenda: (corr) = differense co-a verscion corrente, (prec) = differense co-a ve
'recentchangeslinked-feed' => 'Cangiamenti correlæ',
'recentchangeslinked-toolbox' => 'Cangiaménti corelæ',
'recentchangeslinked-title' => 'Modiffiche correlæ a "$1"',
-'recentchangeslinked-noresult' => 'Nisciûn cangiamento a-e paggine collegæ into periodo speçificòu.',
'recentchangeslinked-summary' => "Sta pàgina a fa védde i cangiaménti ciù reçenti a-e pàgine colegæ a questa.
E pàgine che t'æ in oservaçion inti [[Special:Watchlist|oservæ speciâli]] son in '''grascetto'''.",
'recentchangeslinked-page' => 'Nómme da pàgina:',
@@ -906,9 +931,6 @@ Chì apreuvo ti peu védde a descriçión inta [$2 pàgina de descriçión do fi
# Statistics
'statistics' => 'Statistiche',
-'disambiguations' => 'Paggine de desambiguassion',
-'disambiguationspage' => 'Template:Omonimia',
-
'doubleredirects' => 'Rindirissamenti doggi',
'brokenredirects' => 'Rindirissamenti sballiæ',
@@ -1322,6 +1344,16 @@ Inte 'sti câxi, se o se vêu fâ coscì, o se deive stramûâ ò azzonze manual
'ilsubmit' => 'Çerca',
'bydate' => 'pe dâta',
+# Human-readable timestamps
+'monday-at' => 'Lunesdì a $1',
+'tuesday-at' => 'Matesdì a $1',
+'wednesday-at' => 'Mâcordì a $1',
+'thursday-at' => 'Zoeuggia a $1',
+'friday-at' => 'Venardì a $1',
+'saturday-at' => 'Sabbo a $1',
+'sunday-at' => 'Domenega a $1',
+'yesterday-at' => 'Vei a $1',
+
# Bad image list
'bad_image_list' => "O formato o l'è coscì:
Van conscideræ sôlo e righe che comensan co-o càratere *.
@@ -1348,7 +1380,7 @@ I inganci sucescivi, in scia mæxima riga, van conscideræ comme eceçioìn (pag
* gpslongitude
* gpsaltitude",
-# EXIF tags
+# Exif tags
'exif-datetime' => 'Data e öa do cangiamento do papê',
'exif-artist' => 'Autô',
'exif-copyright' => "Diritti d'autô de",
diff --git a/languages/messages/MessagesLiv.php b/languages/messages/MessagesLiv.php
index e99297ee..3c07476e 100644
--- a/languages/messages/MessagesLiv.php
+++ b/languages/messages/MessagesLiv.php
@@ -137,7 +137,7 @@ $messages = array(
'jumptonavigation' => 'navigīerimiz kast',
'jumptosearch' => 'Vȯtšõgid',
-# 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).
+# 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).
'aboutsite' => 'Iļ {{SITENAME}}',
'aboutpage' => 'Project:Tītõl tieutõkst',
'copyright' => 'AmÄ tekstõ um kÈ­lbatõmist litsents #$1 pierrõ',
@@ -147,7 +147,6 @@ $messages = array(
'disclaimers' => 'Kūondõkst',
'disclaimerpage' => 'Project:Kūondõkst',
'edithelp' => 'RedigÄ«erimiz opÄtõks',
-'edithelppage' => 'Help:RedigÄ«erimiz_opÄtõks',
'helppage' => 'Help:SižÄli',
'mainpage' => 'Eḑḑilēḑ',
'mainpage-description' => 'Eḑḑilēḑ',
@@ -416,7 +415,6 @@ Legend: '''({{int:cur}})''' = vaiţīd līdzinţõmizõks lǟndz redaktsijõks,,
'recentchangeslinked' => 'Sidtõd mõitõkst',
'recentchangeslinked-toolbox' => 'Sidtõd mõitõkst',
'recentchangeslinked-title' => '"$1" sidtõd mõitõkst',
-'recentchangeslinked-noresult' => 'Andtõd Äigal äb Å«o sidtõd lēḑis mõitõkÅ¡i tÄ«edõd.',
'recentchangeslinked-summary' => "Täs um lugdõd andtõd lÄ«edstõ sidtõd (agÄ andtõd kategÅrij) lēḑis tÄ«edõd perrizt mõitõkst. Sin [[Special:Watchlist|iļ-vaņtlimiz.nimkÄ“ra]] lēḑõd Ätõ  ' ' ' razzistiz ' ' ' jeddõ tÅ«odõd.",
'recentchangeslinked-page' => 'LÄ«ed nim:',
'recentchangeslinked-to' => 'NägÅ£ sÄ«e azmõl mõitõkÅ¡i lēḑis, mis sÄ«en lÄ«ed pÇŸlõ sidÄbõd',
@@ -455,8 +453,6 @@ Legend: '''({{int:cur}})''' = vaiţīd līdzinţõmizõks lǟndz redaktsijõks,,
# Statistics
'statistics' => 'Lug tīetõkst',
-'disambiguationspage' => 'Template:JarÄ-seļţimiz-lēḑ',
-
# Miscellaneous special pages
'nbytes' => '$1 {{PLURAL:$1|bait|baitõ}}',
'nmembers' => '$1 {{PLURAL:$1|nõtkõm| nõtkõmḑi}}',
diff --git a/languages/messages/MessagesLmo.php b/languages/messages/MessagesLmo.php
index 2a4768fb..34b6dec5 100644
--- a/languages/messages/MessagesLmo.php
+++ b/languages/messages/MessagesLmo.php
@@ -133,8 +133,6 @@ süi titul dai sezziún (JavaScript)',
'tog-enotifrevealaddr' => "Lassa vedè 'l mè indirizz e-mail int i messagg d'avis",
'tog-oldsig' => 'Anteprima de la firma esistenta:',
'tog-fancysig' => 'Trata la firma cume test wiki (senza nissön ligam utumatich)',
-'tog-externaleditor' => "Dröva semper un prugrama da redatazión estern (dumà per espert, 'l gh'ha de besogn d'impustazión speciaj ins 'l to computer)",
-'tog-externaldiff' => 'Druvá sempar un "diff" estèrnu',
'tog-watchlisthideown' => "Sconda i me mudifich dai pagin che a ten d'ögg",
'tog-watchlisthidebots' => "Sconda i mudifich di bot da i pagin che a ten d'ögg",
'tog-ccmeonemails' => 'Spedissem una copia di messagg spedii a i alter druvadur',
@@ -315,7 +313,7 @@ Per piasè, specia un mument prima de pruà a vardà anmò quela pagina chì.
$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).
+# 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).
'aboutsite' => 'A prupòsit de {{SITENAME}}',
'aboutpage' => 'Project:A pruposit',
'copyright' => "El cuntegnüü a l'è dispunibil sota a una licenza $1.",
@@ -325,7 +323,6 @@ $1",
'disclaimers' => 'Disclaimers',
'disclaimerpage' => 'Project:Avertenz generaj',
'edithelp' => 'Manual de spiegazión',
-'edithelppage' => 'Help:Scriv un articul',
'helppage' => 'Help:Contegnüü',
'mainpage' => 'Pagina principala',
'mainpage-description' => 'Pagina principala',
@@ -609,7 +606,6 @@ Per infurmazion, varda ind el [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGE
'viewprevnext' => 'Vidé ($1 {{int:pipe-separator}} $2) ($3).',
'searchmenu-legend' => 'Upzión de ricerca',
'searchmenu-new' => "'''Trà in pee la pagina \"[[:\$1]]\" ins quel sit chì!'''",
-'searchhelp-url' => 'Help:Contegnüü',
'searchprofile-articles' => 'Paginn de cuntegnüü',
'searchprofile-project' => 'Paginn de jüt e de pruget',
'searchprofile-images' => 'Multimedia',
@@ -866,8 +862,6 @@ La descrizión sura la sua [$2 pagina de descrizión del file] l'è mustrada chÃ
'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ì}}",
-'disambiguations' => 'Pagin da disambiguazziún',
-
'doubleredirects' => 'Redirezziún dópi',
'brokenredirects' => 'Redirezziún interótt',
@@ -963,7 +957,6 @@ i vegnarann segnalaa chichinscì e la pagina la se vedarà cun caràter '''grev'
'watch' => "Tegn d'öcc",
'watchthispage' => "Tegn d'ögg quela pagina chì",
'unwatch' => "Tegn pü d'ögg",
-'watchnochange' => "Nissün cambiament l'è stai faa ins i pàginn che te tegn d'ögg ind 'l períud de temp indicaa.",
'watchlist-details' => '{{PLURAL:$1|$1 pagina|$1 paginn}} tegnüü sot ögg, fö che i paginn de discüssión.',
'wlshowlast' => 'Fa vidé i ültim $1 ur $2 dì $3',
'watchlist-options' => "Upzión lista d'ussevazión",
@@ -1363,9 +1356,6 @@ Te riçevaree un mesacc cun deent un ligamm specjal; ti duvaree clicaa sül liga
# Special:Version
'version' => 'Versiun',
-# Special:FilePath
-'filepath' => 'Percuurz daj archivi',
-
# Special:SpecialPages
'specialpages' => 'Paginn special',
diff --git a/languages/messages/MessagesLn.php b/languages/messages/MessagesLn.php
index 87be9733..e29c4c07 100644
--- a/languages/messages/MessagesLn.php
+++ b/languages/messages/MessagesLn.php
@@ -377,9 +377,6 @@ Ezalí listÉ›Ì ya nkásá gudi bizalí na [[Special:SpecialPages|{{int:special
'powersearch-toggleall' => 'NyÉ”ÌnsÉ”',
'powersearch-togglenone' => 'MÉ”ÌkÉ”Ì tÉ›Ì',
-# Quickbar
-'qbsettings-none' => 'MÉ”ÌkÉ”Ì tÉ›Ì',
-
# Preferences page
'preferences' => 'Malúli',
'mypreferences' => 'Malúli ma ngáí',
@@ -703,7 +700,7 @@ Ezalí listÉ›Ì ya nkásá gudi bizalí na [[Special:SpecialPages|{{int:special
# Special:NewFiles
'ilsubmit' => 'Boluki',
-# EXIF tags
+# Exif tags
'exif-artist' => 'Mokeli',
'exif-subjectdistancerange-2' => 'kokanga view',
diff --git a/languages/messages/MessagesLo.php b/languages/messages/MessagesLo.php
index 7ca5cdea..d7f8a6f3 100644
--- a/languages/messages/MessagesLo.php
+++ b/languages/messages/MessagesLo.php
@@ -122,8 +122,6 @@ $messages = array(
'tog-enotifminoredits' => 'ສົ່ງ ອີເມລ ໃຫ້ຂ້ອຠເວລາມີàºàº²àº™àº”ັດà»àºà»‰à»€àº¥àº±àºàº™à»‰àº­àºàº™àº³',
'tog-enotifrevealaddr' => 'ສະà»àº”ງ ອີເມລ ຂອງຂ້ອຠໃນ àºàº²àº™à»àºˆà»‰àº‡àº§à»ˆàº²àº¡àºµàº‚à»à»‰àº„ວາມອີເມລ',
'tog-shownumberswatching' => 'ສະà»àº”ງ ຈຳນວນຜູ້ໃຊ້ ຕິດຕາມà»à»‰àº²àº™àºµà»‰',
-'tog-externaleditor' => 'ໃຊ້ ເອດິດເຕີທາງນອຠຖ້າບà»à»ˆàº¡àºµàºàº²àº™àº•àº±à»‰àº‡',
-'tog-externaldiff' => 'ໃຊ້ ສ່ວນຕ່າງທາງນອຠຖ້າບà»à»ˆàº¡àºµ àºàº²àº™àºàº³à»œàº»àº”',
'tog-forceeditsummary' => 'ເຕື່ອນຂ້ອຠຖ້າບà»à»ˆà»„ດ້ຂຽນຫàºàº±àº‡à»ƒàºªà»ˆ ຊ່ອງ ສະຫຼຸບàºàº²àº™àº”ັດà»àºà»‰',
'tog-watchlisthideown' => 'ເຊື່ອງ àºàº²àº™àº”ັດà»àºà»‰à»‚ດàºàº‚້ອຠໃນ ລາàºàºàº²àº™àº•àº´àº”ຕາມຂອງຂ້ອàº',
'tog-watchlisthidebots' => 'ເຊື່ອງ àºàº²àº™àº”ັດà»àºà»‰ ໂດຠບອທ໌ ໃນລາàºàºàº²àº™àº•àº´àº”ຕາມຂອງຂ້ອàº',
@@ -269,7 +267,7 @@ $messages = array(
'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).
+# 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).
'aboutsite' => 'àºà»ˆàº½àº§àºàº±àºš{{SITENAME}}',
'aboutpage' => 'Project:àºà»ˆàº½àº§àºàº±àºš',
'copyright' => 'ເນື້ອໃນ ສະໜອງໃຫ້ ພາàºà»ƒàº•à»‰ $1.',
@@ -279,7 +277,6 @@ $messages = array(
'disclaimers' => 'ຂà»à»‰àº›àº°àº•àº´à»€àºªàº”ຄວາມຮັບຜິດຊອບ',
'disclaimerpage' => 'Project:ຂà»à»‰àº›àº°àº•àº´à»€àºªàº”ຄວາມຮັບຜິດຊອບ',
'edithelp' => 'ວິທີດັດà»àºà»‰à»œà»‰àº²',
-'edithelppage' => 'Help:àºàº²àº™àº”ັດà»àºà»‰',
'helppage' => 'Help:ເນື້ອໃນ',
'mainpage' => 'ໜ້າຫຼັàº',
'mainpage-description' => 'ໜ້າຫຼັàº',
@@ -380,7 +377,7 @@ $messages = array(
'newpassword' => 'ລະຫັດຜ່ານໃà»à»ˆ:',
'retypenew' => 'ພິມລະຫັດຜ່ານໃà»à»ˆàº­àºµàº:',
'resetpass_submit' => 'ຕັ້ງລະຫັດຜ່ານ à»àº¥àº° ເຊັນເຂົ້າ',
-'resetpass_success' => 'ສຳເລັດàºàº²àº™àº›à»ˆàº½àº™à»àº›àº‡ ລະຫັດຜ່ານຂອງທ່ານà»àº¥à»‰àº§! ດຽວນີ້ ທ່ານ ເຊັ່ນເຂົ້າ ໃນ ...',
+'changepassword-success' => 'ສຳເລັດàºàº²àº™àº›à»ˆàº½àº™à»àº›àº‡ ລະຫັດຜ່ານຂອງທ່ານà»àº¥à»‰àº§! ດຽວນີ້ ທ່ານ ເຊັ່ນເຂົ້າ ໃນ ...',
# Edit page toolbar
'bold_sample' => 'ໂຕໜັງສືເຂັ້ມ',
@@ -476,7 +473,6 @@ $messages = array(
'prevn' => '{{PLURAL:$1|$1}} àºà»ˆàº­àº™à»œà»‰àº²',
'nextn' => '{{PLURAL:$1|$1}} ຕà»à»ˆà»„ປ',
'viewprevnext' => 'ເບິ່ງ ($1 {{int:pipe-separator}} $2) ($3).',
-'searchhelp-url' => 'Help:ເນື້ອໃນ',
'search-result-size' => '$1 ({{PLURAL:$2|1 ຄຳ|$2 ຄຳ}})',
'search-result-score' => 'ຄວາມàºà»ˆàº½àº§àº‚້ອງ: $1%',
'search-redirect' => '(ໂອນ $1)',
@@ -564,7 +560,6 @@ $messages = array(
'recentchangeslinked-feed' => 'àºàº²àº™àº”ັດà»àºà»‰àº—ີ່àºà»ˆàº½àº§àº‚້ອງ',
'recentchangeslinked-toolbox' => 'àºàº²àº™àº”ັດà»àºà»‰àº—ີ່àºà»ˆàº½àº§àº‚້ອງ',
'recentchangeslinked-title' => 'àºàº²àº™àº›à»ˆàº½àº™à»àº›àº‡àºà»ˆàº½àº§àº‚້ອງàºàº±àºš "$1"',
-'recentchangeslinked-noresult' => 'ບà»à»ˆàº¡àºµàºàº²àº™àº›à»ˆàº½àº™à»àº›àº‡àº¢àº¹à»ˆà»œà»‰àº²àº¥àº´à»‰àº‡àº„໌ໃນໄລàºàº°àº”ັ່ງàºà»ˆàº²àº§.',
# Upload
'upload' => 'ອັບໂຫຼດໄຟລ໌',
@@ -609,11 +604,6 @@ $messages = array(
# Statistics
'statistics' => 'ສະຖິຕິ',
-'disambiguations' => 'ໜ້າà»àºà»‰àº„ວາມàºàº³àºàº§àº¡',
-'disambiguations-text' => "ໜ້າຕà»à»ˆà»„ປນີ້ເຊື່ອມໂàºàº‡à»„ປàºàº±àº‡ '''ໜ້າà»àºà»‰àº„ວາມàºàº³àºàº§àº¡'''&nbsp;
-ຊຶ່ງຄວນດັດà»àºà»‰àº¥àº´àº‡àº„໌ໃຫ້ເຊື່ອມໂàºàº‡à»„ປທີ່ໜ້າອື່ນທີ່ເà»àº²àº°àºªàº»àº¡<br />
-ໜ້າໃດທີ່ຮຽàºà»ƒàºŠà»‰à»àº¡à»ˆà»àºšàºš [[MediaWiki:Disambiguationspage|à»àºà»‰àºàº³àºàº§àº¡]] ໜ້າເຫຼ່ານັ້ນຖຶàºà»€àº›àº±àº™à»œà»‰àº²à»àºà»‰àº„ວາມàºàº³àºàº§àº¡",
-
'doubleredirects' => 'ໂອນໜ້າ 2 ຄັ້ງ',
'brokenredirects' => 'àºàº²àº™à»‚ອນບà»à»ˆàº¡àºµà»œà»‰àº²àº›àº²àºàº—າງ',
@@ -713,8 +703,7 @@ Also see [[Special:WantedCategories|wanted categories]].',
'watch' => 'ຕິດຕາມ',
'watchthispage' => 'ຕິດຕາມໜ້ານີ້',
'unwatch' => 'ເຊົາຕິດຕາມ',
-'watchnochange' => 'ບà»à»ˆàº¡àºµà»œà»‰àº²àº—ີ່ທ່ານຕິດຕາມໃດໆ ຖືàºàº”ັດà»àº›àº‡à»ƒàº™à»„ລàºàº°àºªàº°à»àº”ງຂ້າງເທິງນີ້.',
-'wlheader-showupdated' => "* ບັນດາ ໜ້າ ທີ່ມີàºàº²àº™àº›à»ˆàº½àº™à»àº›àº‡ ຫຼັງຈາàºàº—ີ່ທ່ານ ເຂົ້າຊົມຫຼ້າສຸດ ຈະຖືàºàºªàº°à»àº”ງເປັນ ໂຕໜັງສື '''ເຂັ້ມ'''",
+'wlheader-showupdated' => "ບັນດາ ໜ້າ ທີ່ມີàºàº²àº™àº›à»ˆàº½àº™à»àº›àº‡ ຫຼັງຈາàºàº—ີ່ທ່ານ ເຂົ້າຊົມຫຼ້າສຸດ ຈະຖືàºàºªàº°à»àº”ງເປັນ ໂຕໜັງສື '''ເຂັ້ມ'''",
'wlshowlast' => 'ສະà»àº”ງ $1 ຊົ່ວໂມງຫຼ້າສຸດ $2 ມື້ຫຼ້າສຸດ $3',
# Displayed when you click the "watch" button and it is in the process of watching
@@ -901,7 +890,7 @@ Also see [[Special:WantedCategories|wanted categories]].',
# Metadata
'metadata-expand' => 'ສະà»àº”ງລະອຽດຕື່ມ',
-# EXIF tags
+# Exif tags
'exif-imagewidth' => 'ຄວາມàºà»‰àº§àº²àº‡',
'exif-imagelength' => 'ຄວາມສູງ',
'exif-imagedescription' => 'ຫົວຂà»à»‰àº®àº¹àºš',
@@ -962,9 +951,6 @@ Also see [[Special:WantedCategories|wanted categories]].',
# Special:Version
'version' => 'ສະບັບ',
-# Special:FilePath
-'filepath' => 'ທາງໄປຫາໄຟລ໌',
-
# Special:SpecialPages
'specialpages' => 'ໜ້າພິເສດ',
diff --git a/languages/messages/MessagesLoz.php b/languages/messages/MessagesLoz.php
index 06299138..0fafbb0d 100644
--- a/languages/messages/MessagesLoz.php
+++ b/languages/messages/MessagesLoz.php
@@ -35,9 +35,6 @@ $messages = array(
'tog-enotifrevealaddr' => 'Kamukile zwa adress di meli di xete peson kwa melina notifikasyona',
'tog-shownumberswatching' => 'Kamukile tali di kentezi sebelu',
'tog-fancysig' => "Ro sebu e data (dicon ling'ki auto)",
-'tog-externaleditor' => "Sebelize hloli ye ng'i ektenali dauto",
-'tog-externaldiff' => 'Sebelize petuho ektenali dauto',
-'tog-showjumplinks' => 'Nyembulisize "sinkumukezi" ling\'ki',
'tog-uselivepreview' => 'Sebelize live PendiBe (bulukezi JavaScript) (yem nca)',
'tog-watchlisthideown' => 'Cwankekile zwa afina di zwa mukoloko di kentezi',
'tog-watchlisthidebots' => 'Cwankekile roboti di zwa mukoloko di kentezi',
@@ -181,7 +178,7 @@ $messages = array(
'jumptonavigation' => 'muya',
'jumptosearch' => 'fatukile',
-# 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).
+# 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).
'aboutsite' => "Ngesi ye ng'i atulile {{SITENAME}}",
'aboutpage' => "Project:Ngesi ye ng'i atulile",
'copyright' => 'Bye sa ilonungi di $1.',
@@ -191,7 +188,6 @@ $messages = array(
'disclaimers' => 'Dikulemi',
'disclaimerpage' => 'Project:Dikulemi generali',
'edithelp' => "Hloli ye ng'i",
-'edithelppage' => "Help:Hloli ye ng'i",
'helppage' => 'Help:Buinaneli di petulo',
'mainpage' => 'Petulo yem efro',
'mainpage-description' => 'Petulo yem efro',
@@ -267,7 +263,6 @@ Fung'ksyun: $1<br />
Query: $2",
'viewsource' => "Kamukile ng'i",
'viewsourcetext' => 'A sa kamukile wiki-selt di bye petulo:',
-'sqlhidden' => '(SQL query sa cwankekile)',
# Login and logout pages
'yourname' => 'Sebelu:',
@@ -455,15 +450,11 @@ Informasi: (bye) = petuho a nca selt,
'prevn' => 'kona {{PLURAL:$1|$1}}',
'nextn' => 'lila {{PLURAL:$1|$1}}',
'viewprevnext' => 'Kamukile ($1 {{int:pipe-separator}} $2) ($3)',
-'searchhelp-url' => 'Help:Buinaneli di petulo',
'searchall' => 'xete',
'showingresults' => "Kamukile opi {{PLURAL:$1|'''1''' ekali|'''$1''' ekalina}} di #'''$2'''.",
'showingresultsnum' => "Kamukile {{PLURAL:$3|'''1''' ekali|'''$3''' ekalina}} di #'''$2'''.",
'powersearch' => 'Fatukile',
-# Quickbar
-'qbsettings-none' => 'Ni',
-
# Preferences page
'preferences' => 'Petohoni di sebelu',
'mypreferences' => 'Zwa petohoni di sebelu',
@@ -533,7 +524,6 @@ Informasi: (bye) = petuho a nca selt,
'recentchangeslinked-feed' => 'Petuho adusi',
'recentchangeslinked-toolbox' => 'Petuho adusi',
'recentchangeslinked-title' => 'Petuho dadusi di "$1"',
-'recentchangeslinked-noresult' => "Ni petuhoni kwa ling'ki petulo kwa bye datum.",
'recentchangeslinked-summary' => "Bye petulo zwenti kamukile lapu-kona petuho di petulo sa ling'ki. Petulo di zwa mukoloko di kentezi sa '''ombelu'''.",
# Upload
@@ -611,8 +601,6 @@ di uplodezi media.',
'statistics' => 'Mukoloko di kamukile',
'statistics-header-users' => 'Mukoloko di kamukile di sebelu',
-'disambiguations' => 'Disamebigasina',
-
'doubleredirects' => 'Petulo abezi sa dužemi',
'brokenredirects' => 'Petulo abezi bufosi',
@@ -849,7 +837,6 @@ Petohoni di petulo '''$1''' sa:",
'contribslink' => 'afina',
'blocklogpage' => 'Desu di bolok',
'blocklogentry' => 'sa bolok [[$1]] e simpekile sa $2 $3',
-'proxyblocksuccess' => 'Afi.',
# Move page
'move-page-legend' => 'Nyanganyisize petulo',
@@ -1019,7 +1006,7 @@ Xete ling'ki kwa lina sa konsidisize desepo. Petulo dimedi inlinenikusize.",
* gpslongitude
* gpsaltitude',
-# EXIF tags
+# Exif tags
'exif-imagedescription' => 'Sebu di imegi',
# External editor support
diff --git a/languages/messages/MessagesLt.php b/languages/messages/MessagesLt.php
index bf6f3a3f..c29b9dc6 100644
--- a/languages/messages/MessagesLt.php
+++ b/languages/messages/MessagesLt.php
@@ -216,9 +216,6 @@ $messages = array(
'tog-shownumberswatching' => 'Rodyti stebinÄių naudotojų skaiÄių',
'tog-oldsig' => 'Esamo parašo peržiūra:',
'tog-fancysig' => 'Laikyti parašą vikitekstu (be automatinių nuorodų)',
-'tog-externaleditor' => 'Pagal nutylėjimą naudoti išorinį redaktorių (skirta tik ekspertams, nes reikia atitinkamai paruošti jūsų kompiuterį. [//www.mediawiki.org/wiki/Manual:External_editors More information.])',
-'tog-externaldiff' => 'Pagal nutylėjimą naudoti išorinę skirtumų rodymo programą (tik ekspertams, nes reikia atitinkamai paruošti jūsų kompiuterį. [//www.mediawiki.org/wiki/Manual:External_editors More information.])',
-'tog-showjumplinks' => 'Įjungti „peršokti į“ pasiekiamumo nuorodas',
'tog-uselivepreview' => 'Naudoti tiesioginę peržiūrą (JavaScript) (Eksperimentinis)',
'tog-forceeditsummary' => 'Klausti, kai palieku tuÅ¡ÄiÄ… keitimo komentarÄ…',
'tog-watchlisthideown' => 'Slėpti mano keitimus stebimų sąraše',
@@ -231,6 +228,7 @@ $messages = array(
'tog-diffonly' => 'Nerodyti puslapio turinio po skirtumais',
'tog-showhiddencats' => 'Rodyti paslÄ—ptas kategorijas',
'tog-norollbackdiff' => 'Nepaisyti skirtumo atlikus atmetimÄ…',
+'tog-useeditwarning' => 'Perspėti mane, kai palieku redagavimo puslapį, o jame yra neišsaugotų pakeitimų',
'underline-always' => 'Visada',
'underline-never' => 'Niekada',
@@ -294,6 +292,18 @@ $messages = array(
'oct' => 'spa',
'nov' => 'lap',
'dec' => 'grd',
+'january-date' => 'Sausio $1',
+'february-date' => 'Vasario $1',
+'march-date' => 'Kovo $1',
+'april-date' => 'Balandžio $1',
+'may-date' => 'Gegužės $1',
+'june-date' => 'Birželio $1',
+'july-date' => 'Liepos $1',
+'august-date' => 'RugpjÅ«Äio $1',
+'september-date' => 'RugsÄ—jo $1',
+'october-date' => 'Spalio $1',
+'november-date' => 'LapkriÄio $1',
+'december-date' => 'Gruodžio $1',
# Categories related messages
'pagecategories' => '{{PLURAL:$1|Kategorija|Kategorijos}}',
@@ -375,6 +385,7 @@ $messages = array(
'create-this-page' => 'Sukurti šį puslapį',
'delete' => 'Trinti',
'deletethispage' => 'Ištrinti šį puslapį',
+'undeletethispage' => 'Attrinti šį puslapį',
'undelete_short' => 'Atkurti $1 {{PLURAL:$1:redagavimą|redagavimus|redagavimų}}',
'viewdeleted_short' => 'Peržiūrėti $1 {{PLURAL:$1|ištrintą keitimą|ištrintus keitimus|ištrintų keitimų}}',
'protect' => 'Užrakinti',
@@ -418,7 +429,7 @@ $1',
'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).
+# 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).
'aboutsite' => 'Apie {{SITENAME}}',
'aboutpage' => 'Project:Apie',
'copyright' => 'Turinys pateikiamas pagal $1 licencijÄ….',
@@ -428,7 +439,6 @@ $1',
'disclaimers' => 'AtsakomybÄ—s apribojimas',
'disclaimerpage' => 'Project:AtsakomybÄ—s apribojimas',
'edithelp' => 'Kaip redaguoti',
-'edithelppage' => 'Help:Redagavimas',
'helppage' => 'Help:Turinys',
'mainpage' => 'Pagrindinis puslapis',
'mainpage-description' => 'Pagrindinis puslapis',
@@ -505,17 +515,6 @@ EgzistuojanÄių specialiųjų puslapių sÄ…raÅ¡Ä… galite rasti [[Special:Specia
# General errors
'error' => 'Klaida',
'databaseerror' => 'Duomenų bazės klaida',
-'dberrortext' => 'Neteisinga duomenų bazės užklausos sintaksė.
-Galima klaida programinėje įrangoje.
-Paskutinė mėginta užklausa:
-<blockquote><tt>$1</tt></blockquote>
-iš funkcijos: „<tt>$2</tt>“.
-Duomenų bazė grąžino klaidą „<tt>$3: $4</tt>“.',
-'dberrortextcl' => 'Įvyko duomenų bazės užklausos sintaksės klaida.
-Paskutinė mėginta duomenų bazės užklausa buvo:
-„$1“
-iš funkcijos: „$2“.
-Duomenų bazė grąžino klaidą „$3: $4“',
'laggedslavemode' => 'Dėmesio: Puslapyje gali nesimatyti naujausių pakeitimų.',
'readonly' => 'Duomenų bazė užrakinta',
'enterlockreason' => 'Įveskite užrakinimo priežastį, taip pat datą, kada bus atrakinta',
@@ -569,12 +568,15 @@ Užklausa: $2',
'protectedinterface' => 'Šiame puslapyje yra apsaugotas nuo piktnaudžiavimo programinės įrangos sąsajos tekstas.',
'editinginterface' => "'''Dėmesio:''' Jūs redaguojate puslapį, kuris yra naudojamas programinės įrangos sąsajos tekste. Pakeitimai šiame puslapyje taip pat pakeis naudotojo sąsajos išvaizdą ir kitiems naudotojams šiame wiki.
Jei norite pridėti ir keisti vertimus, siūlome pasinaudoti [//translatewiki.net/wiki/Main_Page?setlang=lt „translatewiki.net“], „MediaWiki“ lokalizacijos projektu.",
-'sqlhidden' => '(SQL užklausa paslėpta)',
'cascadeprotected' => 'Šis puslapis buvo apsaugotas nuo redagavimo, kadangi jis yra įtrauktas į {{PLURAL:$1|šį puslapį, apsaugotą|šiuos puslapius, apsaugotus}} „pakopinės apsaugos“ pasirinktimi:
$2',
'namespaceprotected' => "Jūs neturite teisės redaguoti puslapių '''$1''' srityje.",
'customcssprotected' => 'Jūs neturite teisės keisti šį CSS puslapį, nes jame yra kito naudotojo asmeniniai nustatymai.',
'customjsprotected' => 'Jūs neturite teisės keisti šį JavaScript puslapį, nes jame yra kito naudotojo asmeniniai nustatymai.',
+'mycustomcssprotected' => 'JÅ«s neturite teisÄ—s redaguoti Å¡io CSS puslapio.',
+'mycustomjsprotected' => 'JÅ«s neturite teisÄ—s redaguoti Å¡io JavaScript puslapio.',
+'myprivateinfoprotected' => 'Jūs neturite teisių redaguoti savo asmeninę informaciją.',
+'mypreferencesprotected' => 'Jūs neturite teisių redaguoti jūsų parinktys.',
'ns-specialprotected' => 'Specialieji puslapiai negali būti redaguojami.',
'titleprotected' => "[[User:$1|$1]] apsaugojo šį pavadinimą nuo sukūrimo.
Nurodyta priežastis yra ''$2''.",
@@ -600,10 +602,19 @@ Pastaba: kai kuriuose puslapiuose ir toliau gali rodyti, kad esate prisijungęs
'welcomecreation-msg' => 'Jūsų paskyra buvo sukurta.
Nepamirškite pakeisti savo [[Special:Preferences|{{SITENAME}} nustatymų]].',
'yourname' => 'Naudotojo vardas:',
+'userlogin-yourname' => 'Naudotojo vardas',
+'userlogin-yourname-ph' => 'Įveskite savo naudotojo vardą',
+'createacct-another-username-ph' => 'Įveskite naudotojo vardą',
'yourpassword' => 'Slaptažodis:',
+'userlogin-yourpassword' => 'Slaptažodis',
+'userlogin-yourpassword-ph' => 'Įveskite savo slaptažodį',
+'createacct-yourpassword-ph' => 'Įveskite slaptažodį',
'yourpasswordagain' => 'Pakartokite slaptažodį:',
+'createacct-yourpasswordagain' => 'Patvirtinkite slaptažodį',
+'createacct-yourpasswordagain-ph' => 'Įveskite slaptažodį dar kartą',
'remembermypassword' => 'Prisiminti prisijungimo duomenis šiame kompiuteryje (daugiausiai $1 {{PLURAL:$1|dieną|dienas|dienų}})',
-'securelogin-stick-https' => 'Likite prisijungÄ™ prie HTTPS po prisijungimo',
+'userlogin-remembermypassword' => 'Įsiminti mane',
+'userlogin-signwithsecure' => 'Naudoti saugią jungtį',
'yourdomainname' => 'Jūsų domenas:',
'password-change-forbidden' => 'Jus negalite keisti slaptažodžių šioje wiki.',
'externaldberror' => 'Yra arba išorinė autorizacijos duomenų bazės klaida arba jums neleidžiama atnaujinti jūsų išorinės paskyros.',
@@ -615,18 +626,41 @@ Nepamirškite pakeisti savo [[Special:Preferences|{{SITENAME}} nustatymų]].',
'logout' => 'Atsijungti',
'userlogout' => 'Atsijungti',
'notloggedin' => 'Neprisijungęs',
+'userlogin-noaccount' => 'Neturite paskyros?',
+'userlogin-joinproject' => 'Prisijungti prie {{SITENAME}}',
'nologin' => "Neturite prisijungimo vardo? '''$1'''.",
'nologinlink' => 'Sukurkite paskyrÄ…',
'createaccount' => 'Sukurti paskyrÄ…',
'gotaccount' => "Jau turite paskyrÄ…? '''$1'''.",
'gotaccountlink' => 'Prisijunkite',
'userlogin-resetlink' => 'Pamiršote savo prisijungimo duomenis?',
+'userlogin-resetpassword-link' => 'Nustatykite slaptažodį iš naujo',
+'helplogin-url' => 'Help:Prisijungimas',
+'userlogin-helplink' => '[[{{MediaWiki:helplogin-url}}|Prisijungimo pagalba]]',
+'createacct-join' => 'Įveskite savo informaciją žemiau.',
+'createacct-another-join' => 'Įveskite naujos paskyros informaciją žemiau.',
+'createacct-emailrequired' => 'Elektroninio pašto adresas',
+'createacct-emailoptional' => 'Elektroninio pašto adresas (neprivaloma)',
+'createacct-email-ph' => 'Įveskite savo elektroninio pašto adresą',
+'createacct-another-email-ph' => 'Įveskite elektroninio pašto adresą',
'createaccountmail' => 'Naudokite laikiną atsitiktinį slaptažodį ir nusiųskite jį į elektroninį paštą, nurodytą žemiau.',
+'createacct-realname' => 'Vardas (neprivaloma)',
'createaccountreason' => 'Priežastis:',
+'createacct-reason' => 'Priežastis',
+'createacct-reason-ph' => 'KodÄ—l kuriate kitÄ… paskyrÄ…',
+'createacct-captcha' => 'Saugumo patikrinimas',
+'createacct-imgcaptcha-ph' => 'Ä®veskite tekstÄ…, kurį matote aukÅ¡Äiau',
+'createacct-submit' => 'Sukurkite savo paskyrÄ…',
+'createacct-another-submit' => 'Sukurti kitÄ… paskyrÄ…',
+'createacct-benefit-heading' => '{{SITENAME}} sukurtas žmonių kaip jūs.',
+'createacct-benefit-body1' => '{{PLURAL:$1|keitimas|keitimai|keitimų}}',
+'createacct-benefit-body2' => '{{PLURAL:$1|puslapis|puslapiai}}',
+'createacct-benefit-body3' => 'Neseni {{PLURAL:$1|autorius|autoriai|autorių}}',
'badretype' => 'Įvesti slaptažodžiai nesutampa.',
'userexists' => 'Įvestasis naudotojo vardas jau naudojamas.
Prašome pasirinkti kitą vardą.',
'loginerror' => 'Prisijungimo klaida',
+'createacct-error' => 'Paskyros kūrimo klaida',
'createaccounterror' => 'Nepavyko sukurti paskyros: $1',
'nocookiesnew' => 'Naudotojo paskyra buvo sukurta, bet jūs nesate prisijungęs. {{SITENAME}} naudoja slapukus, kad prijungtų naudotojus. Jūs esate išjungę slapukus. Prašome įjungti juos, tada prisijunkite su savo naujuoju naudotojo vardu ir slaptažodžiu.',
'nocookieslogin' => '{{SITENAME}} naudoja slapukus, kad prijungtų naudotojus. Jūs esate išjungę slapukus. Prašome įjungti juos ir pamėginkite vėl.',
@@ -708,7 +742,7 @@ Palaukite prieš bandant vėl.',
'newpassword' => 'Naujas slaptažodis:',
'retypenew' => 'Pakartokite naują slaptažodį:',
'resetpass_submit' => 'Nustatyti slaptažodį ir prisijungti',
-'resetpass_success' => 'Jūsų slaptažodis pakeistas sėkmingai! Dabar prisijungiama...',
+'changepassword-success' => 'Jūsų slaptažodis pakeistas sėkmingai! Dabar prisijungiama...',
'resetpass_forbidden' => 'Slaptažodžiai negali būti pakeisti',
'resetpass-no-info' => 'Jūs turite būti prisijungęs, kad pasiektumėte puslapį tiesiogiai.',
'resetpass-submit-loggedin' => 'Keisti slaptažodį',
@@ -720,10 +754,11 @@ Jūs galbūt jau sėkmingai pakeitėte savo slaptažodį ar gavote naują laikin
# Special:PasswordReset
'passwordreset' => 'Atstatyti slaptažodį',
-'passwordreset-text' => 'Užpildykite šią formą, norėdami atkurti savo slaptažodį.',
+'passwordreset-text-one' => 'Užpildykite šią formą, norėdami atkurti savo slaptažodį.',
+'passwordreset-text-many' => '{{PLURAL:$1|Užpildykite viena iš laukų slaptažodžio atkurimui.}}',
'passwordreset-legend' => 'Atstatyti slaptažodį',
'passwordreset-disabled' => 'Slaptažodžių atstatymai šiame wikyje išjungti.',
-'passwordreset-pretext' => '{{PLURAL:$1| | Langelyje parašykite vieną duomenų vienetų žemiau}}',
+'passwordreset-emaildisabled' => 'El. pašto funkcijos uždraustos šiame wiki.',
'passwordreset-username' => 'Naudotojo vardas:',
'passwordreset-domain' => 'Domenas:',
'passwordreset-capture' => 'Peržiūrėti galutinį e-mail laišką?',
@@ -946,11 +981,13 @@ Tam nėra paaiškinimo.',
GreiÄiausiai jis yra iÅ¡trintas.',
'edit-conflict' => 'Redagavimo konfliktas.',
'edit-no-change' => 'Jūsų keitimas buvo ignoruotas kadangi nebuvo atlikta jokių teksto pakeitimų.',
+'postedit-confirmation' => 'Jūsų pakeitimas išsaugotas.',
'edit-already-exists' => 'Negalima sukurti naujo puslapio.
Jis jau egzistuoja.',
'defaultmessagetext' => 'Numatytasis pranešimo tekstas',
'invalid-content-data' => 'Neleistinas turinys.',
'content-not-allowed-here' => 'Turinys "$1" puslapyje [[$2]] nÄ—ra leistinas.',
+'editwarning-warning' => 'Palikdamas šį puslapį jūs prarasite visus padarytus pakeitimus.',
# Content models
'content-model-wikitext' => 'wikitekstas',
@@ -1182,7 +1219,6 @@ Prašome patikrinti sąrašus.',
'searchmenu-legend' => 'Paieškos nustatymai',
'searchmenu-exists' => "'''Puslapis pavadinimu „[[$1]]“ šioje wiki'''",
'searchmenu-new' => "'''Sukurti puslapį „[[:$1]]“ šioje wiki!'''",
-'searchhelp-url' => 'Help:Turinys',
'searchmenu-prefix' => '[[Special:PrefixIndex/$1|Ieškoti puslapių su šiuo priešdėliu]]',
'searchprofile-articles' => 'Turinio puslapiai',
'searchprofile-project' => 'Pagalbos ir projekto puslapiai',
@@ -1224,15 +1260,6 @@ Prašome patikrinti sąrašus.',
'search-external' => 'Išorinė paieška',
'searchdisabled' => 'Projekto {{SITENAME}} paieška yra uždrausta. Galite pamėginti ieškoti Google paieškos sistemoje. Paieškos sistemoje projekto {{SITENAME}} duomenys gali būti pasenę.',
-# Quickbar
-'qbsettings' => 'Greitasis pasirinkimas',
-'qbsettings-none' => 'Nerodyti',
-'qbsettings-fixedleft' => 'Fiksuoti kairÄ—je',
-'qbsettings-fixedright' => 'Fiksuoti dešinėje',
-'qbsettings-floatingleft' => 'Plaukiojantis kairÄ—je',
-'qbsettings-floatingright' => 'Plaukiojantis dešinėje',
-'qbsettings-directionality' => 'Pataisyta, priklausomai nuo jūsų rašybos ir kalbos krypties',
-
# Preferences page
'preferences' => 'Nustatymai',
'mypreferences' => 'Nustatymai',
@@ -1265,7 +1292,6 @@ Prašome patikrinti sąrašus.',
'resetprefs' => 'Išvalyti neišsaugotus pakeitimus',
'restoreprefs' => 'Grąžinti visus numatytuosius nustatymus',
'prefs-editing' => 'Redagavimas',
-'prefs-edit-boxsize' => 'Redagavimo lango dydis.',
'rows' => 'EilutÄ—s:',
'columns' => 'Stulpeliai:',
'searchresultshead' => 'Paieškos nustatymai',
@@ -1276,9 +1302,6 @@ Prašome patikrinti sąrašus.',
'recentchangesdays-max' => '(daugiausiai $1 {{PLURAL:$1|diena|dienos|dienų}})',
'recentchangescount' => 'Numatytasis rodomas keitimų skaiÄius:',
'prefs-help-recentchangescount' => 'Į tai įeina naujausi keitimai, puslapių istorijos ir specialiųjų veiksmų sąrašai.',
-'prefs-help-watchlist-token' => 'Įrašius slaptą raktą į šį laukelį, bus sugeneruotas RSS srautas su jūsų stebimųjų sąrašu.
-Bet kas, žinantis šio lauko raktą, galės matyti jūsų stebimų sąrašą, todėl pasirinkite saugią reikšmę.
-Galite panaudoti šią atsitiktinai sugeneruotą reikšmę: $1',
'savedprefs' => 'Nustatymai sėkmingai išsaugoti.',
'timezonelegend' => 'Laiko juosta:',
'localtime' => 'Vietinis laikas:',
@@ -1309,7 +1332,6 @@ Galite panaudoti šią atsitiktinai sugeneruotą reikšmę: $1',
'prefs-reset-intro' => 'Jūs galite pasinaudoti šiuo puslapiu, kad grąžintumėte savo nustatymus į svetainės numatytuosius.
Tai nebeatšaukiama.',
'prefs-emailconfirm-label' => 'El. pašto patvirtinimas:',
-'prefs-textboxsize' => 'Redagavimo lango dydis',
'youremail' => 'El. paštas:',
'username' => '{{GENDER:$1Naudotojo vardas}}:',
'uid' => '{{GENDER:$1|Naudotojo}} ID:',
@@ -1342,6 +1364,8 @@ Jei jūs jį įvesite, jis bus naudojamas pažymėti jūsų darbą.',
'prefs-dateformat' => 'Datos formatas',
'prefs-timeoffset' => 'Laiko skirtumas',
'prefs-advancedediting' => 'Bendras',
+'prefs-editor' => 'Redaktorius',
+'prefs-preview' => 'Peržiūra',
'prefs-advancedrc' => 'Papildomi nustatymai',
'prefs-advancedrendering' => 'Papildomi nustatymai',
'prefs-advancedsearchoptions' => 'Papildomi nustatymai',
@@ -1377,6 +1401,7 @@ teisÄ—s",
'userrights-notallowed' => 'Jūsų paskyra neturi teisių priskirti ar panaikinti naudotojų teises.',
'userrights-changeable-col' => 'GrupÄ—s, kurias galite keisti',
'userrights-unchangeable-col' => 'Grupės, kurių negalite keisti',
+'userrights-conflict' => 'Naudotojo teisių konfliktas! Prašome dar kartą taikyti savo keitimus.',
# Groups
'group' => 'GrupÄ—:',
@@ -1447,6 +1472,10 @@ teisÄ—s",
'right-editusercssjs' => 'Redaguoti kitų naudotojų CSS ir JS failus',
'right-editusercss' => 'Redaguoti kitų naudotojų CSS failus',
'right-edituserjs' => 'Redaguoti kitų naudotojų JS failus',
+'right-editmyusercss' => 'Redaguoti savo vartotojo CSS failus',
+'right-editmyuserjs' => 'Redaguokite savo naudotojo vartotojo JavaScript failus',
+'right-viewmywatchlist' => 'Peržiūrėti savo stebimų sąrašą',
+'right-editmyoptions' => 'Redaguoti savo nuostatas',
'right-rollback' => 'Greitai atmesti paskutinio naudotojo tam tikro puslapio pakeitimus',
'right-markbotedits' => 'Žymėti atmestus keitimus kaip atliktus boto',
'right-noratelimit' => 'Netaikyti greiÄio apribojimų',
@@ -1508,6 +1537,10 @@ teisÄ—s",
'action-userrights-interwiki' => 'keisti naudotojų teises kitose wiki svetainėse',
'action-siteadmin' => 'užrakinti ar atrakinti duomenų bazę',
'action-sendemail' => 'siųsti e-mail laiškus',
+'action-editmywatchlist' => 'redaguoti savo stebėjimų sąrašą',
+'action-viewmywatchlist' => 'rodyti savo stebėjimų sąrašą',
+'action-viewmyprivateinfo' => 'peržiÅ«rÄ—ti jÅ«sų privaÄiÄ… informacijÄ…',
+'action-editmyprivateinfo' => 'redaguoti savo privaÄiÄ… informacijÄ…',
# Recent changes
'nchanges' => '$1 {{PLURAL:$1|pakeitimas|pakeitimai|pakeitimų}}',
@@ -1550,7 +1583,6 @@ teisÄ—s",
'recentchangeslinked-feed' => 'SusijÄ™ keitimai',
'recentchangeslinked-toolbox' => 'SusijÄ™ keitimai',
'recentchangeslinked-title' => 'Su „$1“ susiję keitimai',
-'recentchangeslinked-noresult' => 'Nėra jokių pakeitimų susietuose puslapiuose duotu periodu.',
'recentchangeslinked-summary' => "Tai paskutinių keitimų, atliktų puslapiuose, į kuriuos yra nuoroda iš nurodyto puslapio (arba į nurodytos kategorijos narius), sąrašas.
Puslapiai iš jūsų [[Special:Watchlist|stebimųjų sąrašo]] yra '''paryškinti'''.",
'recentchangeslinked-page' => 'Puslapio pavadinimas:',
@@ -1562,7 +1594,7 @@ Puslapiai iš jūsų [[Special:Watchlist|stebimųjų sąrašo]] yra '''paryškin
'reuploaddesc' => 'Atšaukti įkėlimą ir grįžti į įkėlimo formą.',
'upload-tryagain' => 'Siųsti pakeistą failo aprašymą',
'uploadnologin' => 'Neprisijungęs',
-'uploadnologintext' => 'Norėdami įkelti failą, turite būti [[Special:UserLogin|prisijungęs]].',
+'uploadnologintext' => 'Jūs turite $1, norėdami įkelti failus',
'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',
@@ -1761,7 +1793,6 @@ Dėl saugumo, img_auth.php yra išjungtas.',
'http-read-error' => 'HTTP skaitymo klaida.',
'http-timed-out' => 'HTTP užklausos laikas baigėsi.',
'http-curl-error' => 'Klaida siunÄiantis URL: $1',
-'http-host-unreachable' => 'Nepavyko pasiekti URL.',
'http-bad-status' => 'Iškilo problemų vykdant HTTP užklausą: $1 $2',
# Some likely curl errors. More could be added from <http://curl.haxx.se/libcurl/c/libcurl-errors.html>
@@ -1790,6 +1821,9 @@ Kai sąrašas susiaurinamas pagal naudotoją, rodomi tik tie failai, kurių nauj
'listfiles_size' => 'Dydis',
'listfiles_description' => 'Aprašymas',
'listfiles_count' => 'Versijos',
+'listfiles-latestversion' => 'DabartinÄ— versija',
+'listfiles-latestversion-yes' => 'Taip',
+'listfiles-latestversion-no' => 'Ne',
# File description page
'file-anchor-link' => 'Failas',
@@ -1906,12 +1940,6 @@ Informacija iš [$2 failo aprašymo puslapio] yra pateikiama žemiau.',
'statistics-users-active-desc' => 'Naudotojai, kurie per {{PLURAL:$1|paskutinę dieną|paskutines $1 dienų}} padarė keitimų',
'statistics-mostpopular' => 'Daugiausiai rodyti puslapiai',
-'disambiguations' => 'Puslapiai rodantys į daugiaprasmių žodžių puslapius',
-'disambiguationspage' => 'Template:Daugiareikšmis',
-'disambiguations-text' => "Žemiau išvardinti puslapiai nurodo į '''daugiaprasmių žodžių puslapius'''.
-Nuorodos turėtų būti patikslintos, kad rodytų į konkretų puslapį.<br />
-Puslapis laikomas daugiaprasmiu puslapiu, jei jis naudoja šabloną, kuris yra nurodomas iš [[MediaWiki:Disambiguationspage]].",
-
'pageswithprop' => 'Puslapiai su puslapio atributais',
'pageswithprop-legend' => 'Puslapiai su puslapio atributais',
'pageswithprop-text' => 'Å iame puslapyje pateikiami puslapiai, kurie ypaÄ naudoja puslapio atributus.',
@@ -2165,10 +2193,9 @@ taip pat bus '''paryškinti''' [[Special:RecentChanges|naujausių keitimų sąra
'unwatchthispage' => 'Nustoti stebÄ—ti',
'notanarticle' => 'Ne turinio puslapis',
'notvisiblerev' => 'Versija buvo ištrinta',
-'watchnochange' => 'Pasirinktu laikotarpiu nebuvo redaguotas nei vienas stebimas puslapis.',
'watchlist-details' => 'Stebima {{PLURAL:$1|$1 puslapis|$1 puslapiai|$1 puslapių}} neskaiÄiuojant aptarimų puslapių.',
-'wlheader-enotif' => '* El. pašto priminimai yra įjungti.',
-'wlheader-showupdated' => "* Puslapiai pakeisti nuo tada, kai paskutinį kartą apsilankėte juose, yra pažymėti '''pastorintai'''",
+'wlheader-enotif' => 'El. pašto pranešimai yra įjungti.',
+'wlheader-showupdated' => "Puslapiai pakeisti nuo tada, kai paskutinį kartą apsilankėte juose, yra pažymėti '''pastorintai'''",
'watchmethod-recent' => 'tikrinami naujausi stebimųjų puslapių pakeitimai',
'watchmethod-list' => 'ieškoma naujausių keitimų stebimuose puslapiuose',
'watchlistcontains' => 'Jūsų stebimųjų sąraše yra $1 {{PLURAL:$1|puslapis|puslapiai|puslapių}}.',
@@ -2416,7 +2443,7 @@ $1',
'contributions' => '{{GENDER:$1|Naudotojo}} įndėlis',
'contributions-title' => '{{GENDER:$1|Naudotojo|Naudotojos}} $1 indÄ—lis',
'mycontris' => 'Įnašai',
-'contribsub2' => 'Naudotojo $1 ($2)',
+'contribsub2' => 'DÄ—l {{GENDER:$3|$1}} ($2)',
'nocontribs' => 'Jokie keitimai neatitiko šių kriterijų.',
'uctop' => '(dabartinis)',
'month' => 'Nuo mÄ—nesio (ir anksÄiau):',
@@ -2573,11 +2600,8 @@ Jei norite pamatyti dabar blokuojamus adresus, žiūrėkite [[Special:BlockList|
'ipb_blocked_as_range' => 'Klaida: IP $1 nebuvo užblokuotas tiesiogiai, tad negali bÅ«ti atblokuotas. TaÄiau jis buvo užblokuotas kaip srities $2 dalis, kuri gali bÅ«ti atblokuota.',
'ip_range_invalid' => 'Neleistina IP sritis.',
'ip_range_toolarge' => 'Didesni nei /$1 blokai neleidžiami.',
-'blockme' => 'Užblokuoti mane',
'proxyblocker' => 'Tarpinių serverių („proxy“) blokavimo priemonė',
-'proxyblocker-disabled' => 'Ši funkcija yra išjungta.',
'proxyblockreason' => 'Jūsų IP adresas yra užblokuotas, nes jis yra atvirasis tarpinis serveris. Prašome susisiekti su savo interneto paslaugų tiekėju ar technine pagalba ir praneškite jiems apie šią svarbią saugumo problemą.',
-'proxyblocksuccess' => 'Atlikta.',
'sorbsreason' => 'Jūsų IP adresas yra įtrauktas į atvirųjų tarpinių serverių DNSBL sąrašą, naudojamą šios svetainės.',
'sorbs_create_account_reason' => 'Jūsų IP adresas yra įtrauktas į atvirųjų tarpinių serverių DNSBL sąrašą, naudojamą šios svetainės. Jūs negalite sukurti paskyros',
'cant-block-while-blocked' => 'Jūs negalite blokuoti kitų naudotojų, pats būdamas užblokuotas.',
@@ -2757,6 +2781,7 @@ Aplankykite [//www.mediawiki.org/wiki/Localisation „MediaWiki“ lokaliziciją
'thumbnail-more' => 'Padidinti',
'filemissing' => 'Dingęs failas',
'thumbnail_error' => 'Klaida kuriant sumažintą paveikslėlį: $1',
+'thumbnail_error_remote' => 'Klaidos pranešimas iš $1: $2',
'djvu_page_error' => 'DjVu puslapis nepasiekiamas',
'djvu_no_xml' => 'Nepavyksta gauti XML DjVu failui',
'thumbnail-temp-create' => 'Negalima sukurti laikinos failo miniatiūros',
@@ -2976,13 +3001,8 @@ Leidžia pridėti atmetimo priežastį komentaruose',
'pageinfo-category-files' => 'Failų skaiÄius',
# Skin names
-'skinname-standard' => 'KlasikinÄ—',
-'skinname-nostalgia' => 'Nostalgija',
'skinname-cologneblue' => 'Kelno mÄ—lyna',
'skinname-monobook' => 'MonoBook',
-'skinname-myskin' => 'Mano išvaizda',
-'skinname-chick' => 'Chick',
-'skinname-simple' => 'Paprasta',
'skinname-modern' => 'Moderni',
'skinname-vector' => 'VektorinÄ—',
@@ -3060,11 +3080,25 @@ Jį paleidus jūsų sistema gali būti pažeista.",
'minutes' => '{{PLURAL:$1|$1 minutÄ™|$1 minutes|$1 minuÄių}}',
'hours' => '{{PLURAL:$1|$1 valandą|$1 valandas|$1 valandų}}',
'days' => '{{PLURAL:$1|$1 dieną|$1 dienas|$1 dienų}}',
+'weeks' => '{{PLURAL:$1|$1 savaitÄ—|$1 savaitÄ—s}}',
'months' => '{{PLURAL:$1|$1 mÄ—nuo|$1 mÄ—nesiai}}',
'years' => '{{PLURAL:$1|$1 metai}}',
'ago' => 'prieš $1',
'just-now' => 'tik dabar',
+# Human-readable timestamps
+'hours-ago' => 'prieš $1 {{PLURAL:$1|valandą|valandas|valandų}}',
+'minutes-ago' => 'prieÅ¡ $1 {{PLURAL:$1|minutÄ™|minutes|minuÄių}}',
+'seconds-ago' => 'prieš $1 {{PLURAL:$1|sekundę|sekundes|sekundžių}}',
+'monday-at' => 'Pirmadienį $1',
+'tuesday-at' => 'Antradienį $1',
+'wednesday-at' => 'TreÄiadienį $1',
+'thursday-at' => 'Ketvirtadienį $1',
+'friday-at' => 'Penktadienį $1',
+'saturday-at' => 'Šeštadienį $1',
+'sunday-at' => 'Sekmadienį $1',
+'yesterday-at' => 'Vakar $1',
+
# Bad image list
'bad_image_list' => 'Formatas yra toks:
@@ -3092,7 +3126,7 @@ Visos kitos nuorodos toje paÄioje eilutÄ—je yra laikomos iÅ¡imtimis, t. y. pusl
* gpslongitude
* gpsaltitude',
-# EXIF tags
+# Exif tags
'exif-imagewidth' => 'Plotis',
'exif-imagelength' => 'Aukštis',
'exif-bitspersample' => 'Bitai komponente',
@@ -3270,7 +3304,7 @@ Visos kitos nuorodos toje paÄioje eilutÄ—je yra laikomos iÅ¡imtimis, t. y. pusl
'exif-originalimageheight' => 'Piešinio aukštis prieš apkarpymą',
'exif-originalimagewidth' => 'Piešinio plotis prieš apkarpymą',
-# EXIF attributes
+# Exif attributes
'exif-compression-1' => 'Nesuspausta',
'exif-compression-2' => 'CCITT grupės 3 1-Dimensijos Modifikuotas Hafmano duomenų paleidimo ilgio kodavimas.',
'exif-compression-3' => 'CCITT 3 grupÄ—s fakso kodavimas',
@@ -3668,7 +3702,6 @@ Jūs taip pat galite [[Special:EditWatchlist|naudoti standartinį redaktorių]].
'version-other' => 'Kita',
'version-mediahandlers' => 'DaugialypÄ—s terpÄ—s grotuvai',
'version-hooks' => 'Gaudliai',
-'version-extension-functions' => 'Papildomos funkcijos',
'version-parser-extensiontags' => 'Analizatoriaus papildomosios gairÄ—s',
'version-parser-function-hooks' => 'Analizatoriaus funkciniai gaudliai',
'version-hook-name' => 'Gaudlio pavadinimas',
@@ -3690,12 +3723,16 @@ JÅ«s turÄ—jote gauti [{{SERVER}}{{SCRIPTPATH}}/COPYING GNU General Public Licens
'version-entrypoints-header-entrypoint' => 'Įėjimo taškas',
'version-entrypoints-header-url' => 'URL',
-# Special:FilePath
-'filepath' => 'Failo kelias',
-'filepath-page' => 'Failas:',
-'filepath-submit' => 'Kelias',
-'filepath-summary' => 'Šis specialusis puslapis parašo pilną kelią iki failo.
-Paveikslėliai yra rodomi pilna raiška, kiti failų tipai paleidžiami tiesiogiai su jų susietąja programa.',
+# Special:Redirect
+'redirect' => 'Nukreipkite iš failo, naudotojo arba pakeiskite ID',
+'redirect-legend' => 'Nukreipti į failą ar puslapį',
+'redirect-submit' => 'Eiti',
+'redirect-lookup' => 'Peržvalgos:',
+'redirect-value' => 'VertÄ—:',
+'redirect-user' => 'Naudotojo ID',
+'redirect-revision' => 'Puslapio peržiūra',
+'redirect-file' => 'Failo vardas',
+'redirect-not-exists' => 'VertÄ— nÄ—ra nustatyta',
# Special:FileDuplicateSearch
'fileduplicatesearch' => 'Ieškoti dublikuotų failų',
@@ -3786,6 +3823,9 @@ Paveikslėliai yra rodomi pilna raiška, kiti failų tipai paleidžiami tiesiogi
'htmlform-submit' => 'Siųsti',
'htmlform-reset' => 'Atšaukti pakeitimus',
'htmlform-selectorother-other' => 'Kita',
+'htmlform-no' => 'Ne',
+'htmlform-yes' => 'Taip',
+'htmlform-chosen-placeholder' => 'Pasirinkite parinktį',
# SQLite database support
'sqlite-has-fts' => '$1 su visatekstės paieškos palaikymu',
diff --git a/languages/messages/MessagesLtg.php b/languages/messages/MessagesLtg.php
index 751e7b47..49460daa 100644
--- a/languages/messages/MessagesLtg.php
+++ b/languages/messages/MessagesLtg.php
@@ -105,7 +105,7 @@ $messages = array(
'category-article-count' => '{{PLURAL:$2|ItymÄ kategorejÄ ir vÄ«n dÅ«tuo puslopa.|{{PLURAL:$1|Paruodeita $1 puslopa|Paruodeitys $1 puslopys}} nu $2.}}',
'listingcontinuesabbrev' => '(tuoļuojums)',
-'linkprefix' => '/^(.*?)([a-zA-Z\\x80-\\xff]+)$/sD',
+'linkprefix' => '/^((?>.*(?<![a-zA-Z\\x80-\\xff])))(.+)$/sD',
'about' => 'Aproksts',
'article' => 'Rakstīņs',
@@ -182,7 +182,7 @@ $messages = array(
'jumptonavigation' => 'navigaceja',
'jumptosearch' => 'meklēt',
-# 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).
+# 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).
'aboutsite' => 'Ap {{grammar:akuzativs|{{SITENAME}}}}',
'aboutpage' => 'Project:Ap',
'copyright' => 'Turīņs ir daīmams pa $1.',
@@ -192,7 +192,6 @@ $messages = array(
'disclaimers' => 'Daīšmu nūstatejumi',
'disclaimerpage' => 'Project:Dasaīšonu nūstateišona',
'edithelp' => 'Paleigs',
-'edithelppage' => 'Help:Pataiseišona',
'helppage' => 'Help:Turīņs',
'mainpage' => 'Suoku puslopa',
'mainpage-description' => 'Suoku puslopa',
@@ -211,7 +210,6 @@ $messages = array(
'newmessageslink' => 'jaunus viestejumus',
'newmessagesdifflink' => 'pÄdejÄ pataise',
'editsection' => 'pataiseit',
-'editsection-brackets' => '[$1]',
'editold' => 'pataiseit',
'editlink' => 'pataiseit',
'viewsourcelink' => 'Apsavērt suokūtnejū kodu',
@@ -386,7 +384,6 @@ n = nasvareigs lobuojums.',
'prevn' => 'īprīškejuos {{PLURAL:$1|$1}}',
'nextn' => 'nuokamuos {{PLURAL:$1|$1}}',
'viewprevnext' => 'ApsavÄ“rt ($1 {{int:pipe-separator}} $2) ($3 vÄ«nÄ lopÄ).',
-'searchhelp-url' => 'Help:Turīņs',
'searchprofile-articles' => 'Rakstīņuos',
'search-result-size' => '$1 ({{PLURAL:$2|$2 vuords|$2 vuordi|$2 vuordi}})',
'search-redirect' => '(puoradresiešona nu $1)',
@@ -892,9 +889,6 @@ Puorejī lauki, piec nūklusiejuma, byus nūglobuoti.
'version-software-product' => 'Produkts',
'version-software-version' => 'Verseja',
-# Special:FilePath
-'filepath-page' => 'Fails:',
-
# Special:FileDuplicateSearch
'fileduplicatesearch-filename' => 'Faila pasauka:',
diff --git a/languages/messages/MessagesLus.php b/languages/messages/MessagesLus.php
index f895dfe7..d68ae6c8 100644
--- a/languages/messages/MessagesLus.php
+++ b/languages/messages/MessagesLus.php
@@ -42,9 +42,6 @@ $messages = array(
'tog-shownumberswatching' => 'Ralvèngtu zât tilang rawh',
'tog-oldsig' => 'Khàrna hming hman mék:',
'tog-fancysig' => 'Khàrna hming wikithu angah ngai rawh (zawmna insiam ţül lovin)',
-'tog-externaleditor' => 'Sawi ngai lovin pawnlam siamţhatu hmang rawh (mithiam tan chauh, i khawlthluakneiah setting bîk a ngai. [//www.mediawiki.org/wiki/Manual:External_editors More information.])',
-'tog-externaldiff' => 'Sawi ngai lovin pawnlam diff hmang rawh (mithiam tan chauh, i khawlthluakneiah setting bîk a ngai. [//www.mediawiki.org/wiki/Manual:External_editors More information.])',
-'tog-showjumplinks' => '"Zuan kahlên rawh" tih zawmna awmtir rawh',
'tog-uselivepreview' => 'Endikna nung hmang rawh (JavaScript a ngai) (hei hi chhinna chauh a la ni)',
'tog-forceeditsummary' => 'Siamţhatna ruak ka dahluh palhin min hrilh rawh',
'tog-watchlisthideown' => 'Ka siamţhatho ka ralvènah telh suh',
@@ -57,6 +54,7 @@ $messages = array(
'tog-diffonly' => 'Dnglmn hnuaiah phêk chhúng tilang suh',
'tog-showhiddencats' => 'Pawl thuhrûkho tilang rawh',
'tog-norollbackdiff' => 'Lumlêt hnuah dnglmn kalkan rawh',
+'tog-useeditwarning' => 'Ka phêk siam danglamna ka dahţhat theihnghilh palh chuan min hrilh rawh',
'underline-always' => 'Ziah/ngei ngei',
'underline-never' => 'Ngai lo',
@@ -244,7 +242,7 @@ $1',
'pool-queuefull' => 'Hnathawhna hmun awl a awm tawh lo',
'pool-errorunknown' => 'Kan hriatthiam loh dikhlel a awm tlat',
-# 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).
+# 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).
'aboutsite' => '{{SITENAME}} chungchang',
'aboutpage' => 'Project:Chungchang',
'copyright' => 'A chhung thute hi $1 hmanga lakchhawn phal a ni.',
@@ -254,7 +252,6 @@ $1',
'disclaimers' => 'Intlawhkhalhna',
'disclaimerpage' => 'Project: Intlawhkhalhna Dan',
'edithelp' => 'Siamţhat zirna',
-'edithelppage' => 'Help: Siamţhat dàn',
'helppage' => 'Help: A chhunga thu awmte',
'mainpage' => 'Phekpui',
'mainpage-description' => 'Phekpui',
@@ -332,12 +329,6 @@ Vohbik phekte chu hetah hian a en theih [[Special:SpecialPages|{{int:specialpage
# General errors
'error' => 'Dik lo',
'databaseerror' => 'Database dik loh',
-'dberrortext' => 'Zémpui zawhna tih dik loh a awm palh.
-Kháwlthlûakah hrik a awm tihna a ni mai thei.
-Zémpui zawhna hnuhnüng ber chu:
-<blockquote><tt>$1<tt></blockquote>,
-"<<tt>$2</tt>" tih hnathawh chhúng aṭang.
-Zémpuiin dikhlelhna "<tt>$3: $4</tt>" a rawn khawhkïr.',
'laggedslavemode' => "'''Vaukhanna:''' He phêk hian tun hnaia siam thar a pho lang lo mai thei.",
'readonly' => 'Database kalh a ni',
'enterlockreason' => 'I kalhna chhan leh i hawn leh hun tura i rin sawi rawh',
@@ -381,7 +372,6 @@ Thil zawn: $2',
'viewsourcetext' => 'A hnar i lachhawngin i en thei ang:',
'viewyourtext' => "'''I siamţhatte''' chu he phêkah hian i enin i lachhawng thei ang.",
'protectedinterface' => 'He phêk hian khawlthluak tan hmangtu-ţawng a phuhru a, hman khawloh a nih loh nan venhim hrih a ni. Lehlinna tidanglam tur emaw belh tur chuan [//translatewiki.net/ translatewiki.net], MediaWiki lehzauna hmachhawp hi i hmang dawn nia.',
-'sqlhidden' => '(SQL zawhna thuhrûk hrih a ni)',
'cascadeprotected' => 'He phêk hi siam danglam phal a ni hrih lo, a chhan chu {{PLURAL:$1|he phêk|hêng phêk}}, "a huhova venhim" tih hmanga ven chhunga awm a nih vang a ni:
$2',
'namespaceprotected' => "'''$1''' tih hminghmun chhunga phêkte siamţhat phalna i nei lo.",
@@ -410,7 +400,6 @@ I fangtu cache i thenfai hma chu phêk ţhenkhat intar lang a awm reng mai thei,
'yourpassword' => 'Thurûk:',
'yourpasswordagain' => 'Thurûk ziak nawn leh rawh le:',
'remembermypassword' => 'He ka rangpuifanna hman mék (browser)-ah hian ka luhna (a rei berah ni {{PLURAL:$1||}}$1) min vawnsak rawh, thurûk ziah nawn ngai lo tùrin.',
-'securelogin-stick-https' => 'Luh hnuah HTTPS-ah hian chëng reng rawh.',
'yourdomainname' => 'I ram:',
'password-change-forbidden' => 'Hë wiki-ah hian thurûk i thlâk thei lo.',
'externaldberror' => 'Insawifiahna felfai lo a awm lo a nih loh vëk pawhin i pawnlam siangchan tihdanglam phalsak i ni lo a ni ang.',
@@ -492,7 +481,7 @@ I tum leh hmain nghâk lawk ang che.',
'newpassword' => 'Thurûk thar:',
'retypenew' => 'Thurûk ziak nawn leh rawh le:',
'resetpass_submit' => 'Thurûk siamfel la inziaklût rawh',
-'resetpass_success' => 'I thurûk hlawhtling taka thlâk a ni.
+'changepassword-success' => 'I thurûk hlawhtling taka thlâk a ni.
Kan hruai lût mék a che...',
'resetpass_forbidden' => 'Thurûk thlâk theih a ni lo.',
'resetpass-no-info' => 'He phêk lut mai tùr chuan i inziahluh a ngai.',
@@ -504,7 +493,6 @@ I thurûk i thlâk hlawhtling tawh a nih loh pawhin thurûk lailâwk i dil a ni
# Special:PasswordReset
'passwordreset' => 'Thurûk ziakţha rawh',
-'passwordreset-text' => 'I thurûk thlâk turin ahnuaia lehkha khu dah khat ang che.',
'passwordreset-legend' => 'Thurûk ziakţha rawh',
'passwordreset-username' => 'Hmangtu hming:',
'passwordreset-domain' => 'Huamchin:',
@@ -738,7 +726,6 @@ Lamtawi hmante: '''({{int:cur}})'''= ennawnna thar ber nena danglamna, '''({{int
'searchmenu-legend' => 'Zawn duhthlanna',
'searchmenu-exists' => "'''He wiki-ah hian \"[[:\$1]]\" tia koh phêk a awm.'''",
'searchmenu-new' => "'''[[:$1]] phek hi he wiki-ah hian siam rawh le!'''",
-'searchhelp-url' => 'Help:A chhunga thu awmte',
'searchmenu-prefix' => '[[Special:PrefixIndex/$1|He thuhmabet nei phêkte hi zawng rawh]]',
'searchprofile-articles' => 'A chhunga thu awm',
'searchprofile-project' => 'Å¢anpuina leh hna-hmachhawp phekte',
@@ -779,15 +766,6 @@ Lamtawi hmante: '''({{int:cur}})'''= ennawnna thar ber nena danglamna, '''({{int
Google hmangin i lo zawng hrih thei ang.
{{SITENAME}} chhung zawnawlna hi a hlui lutuk tawh mai thei tih hria ang che.',
-# Quickbar
-'qbsettings' => 'Hmanrawliang',
-'qbsettings-none' => 'Pakhat mah',
-'qbsettings-fixedleft' => 'Veilam',
-'qbsettings-fixedright' => 'Dinglam',
-'qbsettings-floatingleft' => 'Veilama lang',
-'qbsettings-floatingright' => 'Dinglama lang',
-'qbsettings-directionality' => 'Bet, i ţawng inziahdàn hawzawnga zirin',
-
# Preferences page
'preferences' => 'Duhdàn',
'mypreferences' => 'Duhthlanna',
@@ -820,7 +798,6 @@ Google hmangin i lo zawng hrih thei ang.
'resetprefs' => 'Tihdanglamna dahţhat loh tifai rawh',
'restoreprefs' => 'A awmdàn siamsaah dah lêt vek rawh',
'prefs-editing' => 'Siamţhat',
-'prefs-edit-boxsize' => 'Siamţhatna tukverh lenzawng',
'rows' => 'Tlar:',
'columns' => 'Thlur:',
'searchresultshead' => 'Zawnna',
@@ -860,7 +837,6 @@ Google hmangin i lo zawng hrih thei ang.
'prefs-reset-intro' => 'He phêk hi ränghmuna i duhthlansa tihdanglam nan i hmang thei.
A sûtlêt theih loh.',
'prefs-emailconfirm-label' => 'E-chenhmun tihchianna:',
-'prefs-textboxsize' => 'Siamţhatna tukverh lenzawng',
'youremail' => 'E-chenhmun:',
'username' => 'Hmangtu hming:',
'uid' => 'Hmangtu ID',
@@ -1046,7 +1022,6 @@ Hmangtuten e-lehkha an thawn chein i e-chenhmun hrilh an ni chuang lo vang.',
'recentchangeslinked-feed' => 'Tihdanglam anpuite',
'recentchangeslinked-toolbox' => 'Tihdanglam anpuite',
'recentchangeslinked-title' => '"$1" kaihhnawih tihdanglamnate',
-'recentchangeslinked-noresult' => 'I hun thlan chhungah hian a phek zawmpui tihdanglam pakhat mah a awm lo.',
'recentchangeslinked-summary' => "Hei hi phek pakhat (emaw pawl pakhata telte) aţanga zawm chhuah phek-hova tihdanglam thar ziah chhuahna a ni.
[[Special:Watchlist|I ralvèn]] phêkte chu '''hawrawp thau'''-a tihlan a ni.",
'recentchangeslinked-page' => 'Phek hming:',
@@ -1248,9 +1223,6 @@ Taksa sawifiahna hi i siamá¹­ha duh a nih chuan [$2 taksa sawifiahna phêk] aá¹
'statistics-users-active-desc' => 'Ni {{PLURAL:$1|khat|$1}} kaltâ chhunga thiltih nei hmangtuho',
'statistics-mostpopular' => 'Phêk thlir zin deuh deuhte',
-'disambiguations' => 'Thliarfelna phêk zawmtu phêkte',
-'disambiguationspage' => 'Template:thliar',
-
'doubleredirects' => 'Hruailuhna phír',
'double-redirect-fixed-move' => '[[$1]] sawn a ni ta.
[[$2]] lama hruailuhna siam nghâl a ni.',
@@ -1437,7 +1409,6 @@ Hetah hian [[Special:UnusedCategories|pawl hman lohho]] pholan tel a ni lo.
'unwatchthispage' => 'Vil tihtawpna',
'notanarticle' => 'Phêk dikdawh a ni lo.',
'notvisiblerev' => 'Hmangtu dang tihdanglamna thar paihbo a ni.',
-'watchnochange' => 'I hun sawi chhungah khan i ralvèn khawih buai a ni lo.',
'watchlist-details' => 'I ralvèn zing aţanga {{PLURAL:$1| phêk $1 |phêk $1}}, sawihona phêk chhiar lohvin.',
'wlheader-enotif' => '*E-lehkha inhriattirna tihnun a ni.',
'wlheader-showupdated' => "I tlawh hnuhnun ber hnua tihdanglam phêk te chu a '''thau'''va tihlan a ni.",
@@ -1838,7 +1809,7 @@ A bak zawng chu thuhrûk sa vek a ni ang.
* gpslongitude
* gpsaltitude',
-# EXIF tags
+# Exif tags
'exif-imagewidth' => 'Zàuzáwng',
'exif-imagelength' => 'Sànzáwng',
'exif-bitspersample' => 'Péng khata mal(bit) awm zât',
diff --git a/languages/messages/MessagesLv.php b/languages/messages/MessagesLv.php
index 27f68575..87965a98 100644
--- a/languages/messages/MessagesLv.php
+++ b/languages/messages/MessagesLv.php
@@ -83,9 +83,6 @@ $messages = array(
'tog-shownumberswatching' => 'RÄdÄ«t uzraudzÄ«tÄju skaitu',
'tog-oldsig' => 'Pašreizējais paraksts:',
'tog-fancysig' => 'VienkÄrÅ¡s paraksts (bez automÄtiskÄs saites)',
-'tog-externaleditor' => 'PÄ“c noklusÄ“juma izmantot ÄrÄ“ju programmu lapu izmainÄ«Å¡anai (tikai pieredzÄ“juÅ¡iem lietotÄjiem, lai darbotos nepiecieÅ¡ami speciÄli uzstÄdÄ«jumi tavÄ datorÄ sk. [//www.mediawiki.org/wiki/Manual:External_editor Å¡eit])',
-'tog-externaldiff' => 'PÄ“c noklusÄ“juma izmantot ÄrÄ“ju programmu izmaiņu parÄdÄ«Å¡anai (tikai pieredzÄ“juÅ¡iem lietotÄjiem, lai darbotos nepiecieÅ¡ami speciÄli uzstÄdÄ«jumi tavÄ datorÄ sk. [//www.mediawiki.org/wiki/Manual:External_editor Å¡eit])',
-'tog-showjumplinks' => 'RÄdÄ«t pÄrlÄ“kÅ¡anas saites',
'tog-uselivepreview' => "Lietot tÅ«lÄ«tÄ“jo priekÅ¡skatÄ«jumu (izmanto ''JavaScript''; eksperimentÄla iespÄ“ja)",
'tog-forceeditsummary' => 'AtgÄdinÄt man, ja kopsavilkuma ailÄ«te ir tukÅ¡a',
'tog-watchlisthideown' => 'PaslÄ“pt manus labojumus uzraugÄmo lapu sarakstÄ',
@@ -98,6 +95,8 @@ $messages = array(
'tog-diffonly' => 'NerÄdÄ«t lapu saturu zem izmaiņÄm',
'tog-showhiddencats' => 'RÄdÄ«t slÄ“ptÄs kategorijas',
'tog-norollbackdiff' => 'Neņemt vÄ“rÄ atÅ¡Ä·irÄ«bas, veicot atriti',
+'tog-useeditwarning' => 'BrÄ«dinÄt mani, kad es atstÄju lapas rediģēšanu nesaglabÄjot izmaiņas',
+'tog-prefershttps' => 'VienmÄ“r izmantot droÅ¡u savienojumu pÄ“c pieslÄ“gÅ¡anÄs',
'underline-always' => 'vienmēr',
'underline-never' => 'Nekad',
@@ -161,6 +160,18 @@ $messages = array(
'oct' => 'oktobrī,',
'nov' => 'novembrī,',
'dec' => 'decembrī,',
+'january-date' => '$1. janvÄris',
+'february-date' => '$1. februÄris',
+'march-date' => '$1. marts',
+'april-date' => '$1. aprīlis',
+'may-date' => '$1. maijs',
+'june-date' => '$1. jūnijs',
+'july-date' => '$1. jūlijs',
+'august-date' => '$1. augusts',
+'september-date' => '$1. septembris',
+'october-date' => '$1. oktobris',
+'november-date' => '$1. novembris',
+'december-date' => '$1. decembris',
# Categories related messages
'pagecategories' => '{{PLURAL:$1|Kategorija|Kategorijas}}',
@@ -242,6 +253,7 @@ $messages = array(
'create-this-page' => 'Izveidot Å¡o lapu',
'delete' => 'Dzēst',
'deletethispage' => 'Dzēst šo lapu',
+'undeletethispage' => 'Atjaunot Å¡o lapu',
'undelete_short' => 'Atjaunot $1 {{PLURAL:$1|versiju|versijas}}',
'viewdeleted_short' => 'Apskatīt {{PLURAL:$1|vienu dzēstu labojumu|$1 dzēstus labojumus}}',
'protect' => 'AizsargÄt',
@@ -283,7 +295,7 @@ 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).
+# 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).
'aboutsite' => 'Par {{grammar:akuzatīvs|{{SITENAME}}}}',
'aboutpage' => 'Project:Par',
'copyright' => 'Saturs ir pieejams saskaÅ†Ä ar $1, ja vien nav norÄdÄ«ts citÄdi.',
@@ -293,7 +305,6 @@ $1',
'disclaimers' => 'Saistību atrunas',
'disclaimerpage' => 'Project:Saistību atrunas',
'edithelp' => 'Rediģēšanas palīdzība',
-'edithelppage' => 'Help:Rediģēšana',
'helppage' => 'Help:Saturs',
'mainpage' => 'SÄkumlapa',
'mainpage-description' => 'SÄkumlapa',
@@ -367,17 +378,10 @@ Derīgo īpašo lapu saraksts atrodas te: [[Special:SpecialPages|{{int:specialpa
# General errors
'error' => 'Kļūda',
'databaseerror' => 'Datu bÄzes kļūda',
-'dberrortext' => 'KonstatÄ“ta sintakses kļūda datubÄzes pieprasÄ«jumÄ.
-IespÄ“jams, tÄ radusies dēļ kļūdas programmatÅ«rÄ.
-PÄ“dÄ“jais datubÄzes pieprasÄ«jums bija:
-<blockquote><code>$1</code></blockquote>
-no funkcijas "<code>$2</code>".
-DatubÄzes atgrieztais kļūdas paziņojums: "<samp>$3: $4</samp>".',
-'dberrortextcl' => 'DatubÄzes vaicÄjumÄ pieļauta sintakses kļūda.
-Pēdējais priekšraksts:
-"$1"
-palaists funkcijÄ "$2".
-IzdotÄ MySQL kļūda: "$3: $4"',
+'databaseerror-textcl' => 'Datu bÄzes vaicÄjuma kļūda.',
+'databaseerror-query' => 'VaicÄjums: $1',
+'databaseerror-function' => 'Funkcija: $1',
+'databaseerror-error' => 'Kļūda: $1',
'laggedslavemode' => 'UzmanÄ«bu: IespÄ“jams, Å¡ajÄ lapÄ nav redzami nesen izdarÄ«tie papildinÄjumi.',
'readonly' => 'DatubÄze bloÄ·Ä“ta',
'enterlockreason' => 'Ievadiet bloķēšanas iemeslu, ieskaitot aplēses, kad bloķēšana tiks beigta.',
@@ -421,10 +425,13 @@ VaicÄjums: $2',
'viewsourcetext' => 'Tu vari apskatīties un nokopēt šīs lapas vikitekstu:',
'protectedinterface' => 'Å Ä« lapa satur programmatÅ«ras interfeisÄ lietotu tekstu un ir bloÄ·Ä“ta pret izmaiņÄm, lai pasargÄtu no bojÄjumiem.',
'editinginterface' => "'''BrÄ«dinÄjums:''' Tu izmaini lapu, kuras saturu izmanto wiki programmatÅ«ras lietotÄja saskarnÄ“ (''interfeisÄ''). Å Ä«s lapas izmaiņas ietekmÄ“s lietotÄja saskarni citiem lietotÄjiem. PÄ“c modificÄ“Å¡anas, Å¡Ä«s izmaiņas bÅ«tu lietderÄ«gi pievienot arÄ« [//translatewiki.net/wiki/Main_Page?setlang=en translatewiki.net], kas ir MediaWiki lokalizÄ“Å¡anas projekts.",
-'sqlhidden' => '(SQL vaicÄjums paslÄ“pts)',
'namespaceprotected' => "Tev nav atļaujas izmainīt lapas, kas atrodas '''$1''' ''namespacē''.",
'customcssprotected' => 'Jums nav tiesÄ«bu rediģēt Å¡o CSS lapu, jo tÄ satur cita lietotÄja personiskos iestatÄ«jumus.',
'customjsprotected' => 'Jums nav tiesÄ«bu rediģēt Å¡o JavaScript lapu, jo tÄ satur cita lietotÄja personiskos iestatÄ«jumus.',
+'mycustomcssprotected' => 'Jums nav tiesību rediģēt šo CSS lapu.',
+'mycustomjsprotected' => 'Jums nav tiesību rediģēt šo JavaScript lapu.',
+'myprivateinfoprotected' => 'Jums nav tiesÄ«bu rediģēt savu privÄto informÄciju.',
+'mypreferencesprotected' => 'Jums nav tiesību rediģēt savus iestatījumus.',
'ns-specialprotected' => 'Nevar izmainÄ«t Ä«paÅ¡Äs lapas.',
'titleprotected' => "Å Ä« lapa ir aizsargÄta pret izveidoÅ¡anu. To aizsargÄja [[User:$1|$1]].
NorÄdÄ«tais iemesls bija ''$2''.",
@@ -441,10 +448,19 @@ Vari turpinÄt to izmantot anonÄ«mi, vari <span class='plainlinks'>[$1 atgriezti
Å…em vÄ“rÄ, ka arÄ« pÄ“c izieÅ¡anas, dažas lapas var tikt parÄdÄ«tas tÄ, it kÄ tu vÄ“l bÅ«tu iekÅ¡Ä, lÄ«dz tiks iztÄ«rÄ«ta pÄrlÅ«ka keÅ¡atmiņa.",
'welcomeuser' => 'Laipni lūgts, $1!',
'yourname' => 'Tavs lietotÄjvÄrds',
+'userlogin-yourname' => 'LietotÄjvÄrds',
+'userlogin-yourname-ph' => 'Ievadiet savu lietotÄjvÄrdu',
+'createacct-another-username-ph' => 'Ievadiet lietotÄjvÄrdu',
'yourpassword' => 'Tava parole:',
+'userlogin-yourpassword' => 'Parole',
+'userlogin-yourpassword-ph' => 'Ievadiet savu paroli',
+'createacct-yourpassword-ph' => 'Ievadiet paroli',
'yourpasswordagain' => 'AtkÄrto paroli',
+'createacct-yourpasswordagain' => 'Apstipriniet paroli',
+'createacct-yourpasswordagain-ph' => 'VÄ“lreiz ievadiet paroli',
'remembermypassword' => 'AtcerÄ“ties pÄ“c pÄrlÅ«ka aizvÄ“rÅ¡anas (spÄ“kÄ ne vairÄk kÄ $1 {{PLURAL:$1|diena|dienas}}).',
-'securelogin-stick-https' => 'SaglabÄt HTTPS savienojumu pÄ“c pieslÄ“gÅ¡anÄs',
+'userlogin-remembermypassword' => 'Atcerēties mani',
+'userlogin-signwithsecure' => 'Izmantot drošu savienojumu',
'yourdomainname' => 'Tavs domēns',
'password-change-forbidden' => 'Å ajÄ wiki paroles nevar mainÄ«t.',
'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.',
@@ -456,18 +472,39 @@ Vari turpinÄt to izmantot anonÄ«mi, vari <span class='plainlinks'>[$1 atgriezti
'logout' => 'Iziet',
'userlogout' => 'Iziet',
'notloggedin' => 'Neesi iegÄjis',
+'userlogin-joinproject' => 'Pievienojieties {{SITENAME}}',
'nologin' => 'Nav lietotÄjvÄrda? $1.',
'nologinlink' => 'Reģistrējies',
'createaccount' => 'Izveidot jaunu lietotÄju',
'gotaccount' => "Tev jau ir lietotÄjvÄrds? '''$1'''!",
'gotaccountlink' => 'Dodies iekÅ¡Ä',
'userlogin-resetlink' => 'Esat aizmirsis savu pieslÄ“gÅ¡anÄs informÄciju?',
+'userlogin-helplink' => '[[{{MediaWiki:helplogin-url}}|Palīdzība ar pieslēgšanos]]',
+'userlogin-createanother' => 'Izveidot citu kontu',
+'createacct-join' => 'Ievadiet savu informÄciju zemÄk.',
+'createacct-another-join' => 'Ievadiet jaunÄ konta informÄciju zemÄk.',
+'createacct-emailrequired' => 'E-pasta adrese',
+'createacct-emailoptional' => 'E-pasta adrese (nav obligÄta)',
+'createacct-email-ph' => 'Ievadiet savu e-pasta adresi',
+'createacct-another-email-ph' => 'Ievadiet e-pasta adresi',
'createaccountmail' => 'Izmantot nejauÅ¡i Ä£enerÄ“tu pagaidu paroli un nosÅ«tÄ«t to uz norÄdÄ«to e-pasta adresi',
+'createacct-realname' => 'Īstais vÄrds (nav obligÄts)',
'createaccountreason' => 'Iemesls:',
+'createacct-reason' => 'Iemesls',
+'createacct-reason-ph' => 'KÄpÄ“c jÅ«s veidojat citu kontu',
+'createacct-captcha' => 'DroÅ¡Ä«bas pÄrbaude',
+'createacct-imgcaptcha-ph' => 'Ievadiet tekstu, kuru jÅ«s redzat augstÄk',
+'createacct-submit' => 'Izveidot savu kontu',
+'createacct-another-submit' => 'Izveidot citu lietotÄja kontu',
+'createacct-benefit-heading' => '{{SITENAME}} darbojas ar tÄdu cilvÄ“ku kÄ jÅ«s ieguldÄ«jumu.',
+'createacct-benefit-body1' => '{{PLURAL:$1|labojums|labojumi}}',
+'createacct-benefit-body2' => '{{PLURAL:$1|lapa|lapas}}',
+'createacct-benefit-body3' => '{{PLURAL:$1|nesens dalībnieks|neseni dalībnieki}}',
'badretype' => 'Tevis ievadÄ«tÄs paroles nesakrÄ«t.',
'userexists' => 'IevadÄ«tais lietotÄjvÄrds jau ir aizņemts.
LÅ«dzu, izvÄ“lieties citu vÄrdu.',
'loginerror' => 'Neveiksmīga ieiešana',
+'createacct-error' => 'Konta izveides kļūda',
'createaccounterror' => 'NeizdevÄs izveidot kontu: $1',
'nocookiesnew' => 'LietotÄjvÄrds tika izveidots, bet tu neesi iegÄjis iekÅ¡Ä. {{SITENAME}} izmanto sÄ«kdatnes (<i>cookies</i>), lai lietotÄji varÄ“tu tajÄ ieiet. Tavs pÄrlÅ«ks nepieņem tÄs. LÅ«dzu, atļauj to pieņemÅ¡anu un tad nÄc iekÅ¡Ä ar savu lietotÄjvÄrdu un paroli.',
'nocookieslogin' => '{{SITENAME}} izmanto sÄ«kdatnes (<i>cookies</i>), lai lietotÄji varÄ“tu ieiet tajÄ. Diemžēl tavs pÄrlÅ«ks tos nepieņem. LÅ«dzu, atļauj to pieņemÅ¡anu un mÄ“Ä£ini vÄ“lreiz.',
@@ -514,8 +551,8 @@ TÄdēļ Å¡obrÄ«d no Å¡Ä«s IP adreses vairs nevar izveidot jaunus kontus.',
'accountcreatedtext' => 'LietotÄja konts priekÅ¡ $1 tika izveidots.',
'createaccount-title' => 'LietotÄja konta izveidoÅ¡ana {{grammar:lokatÄ«vs|{{SITENAME}}}}',
'usernamehasherror' => 'LietotÄjvÄrds nevar saturÄ“t hash simbolus',
-'login-throttled' => 'Tu esi veicis pÄrÄk daudz ieieÅ¡anas mÄ“Ä£inÄjumus.
-Lūdzu uzgaidi pirms mēģini vēlreiz.',
+'login-throttled' => 'JÅ«s esat veicis pÄrÄk daudz pieslÄ“gÅ¡anÄs mÄ“Ä£inÄjumus.
+Lūdzu, uzgaidiet $1 pirms mēģiniet vēlreiz.',
'login-abort-generic' => 'JÅ«su pieteikÅ¡anÄs bija neveiksmÄ«ga — DarbÄ«ba pÄrtraukta',
'loginlanguagelabel' => 'Valoda: $1',
@@ -529,8 +566,7 @@ Lūdzu uzgaidi pirms mēģini vēlreiz.',
'newpassword' => 'JaunÄ parole',
'retypenew' => 'AtkÄrto jauno paroli',
'resetpass_submit' => 'UzstÄdÄ«t paroli un ieiet',
-'resetpass_success' => 'Parole nomainīta veiksmīgi!
-Notiek ieiešana...',
+'changepassword-success' => 'Jūsu parole tika nomainīta veiksmīgi!',
'resetpass_forbidden' => 'Paroles nav iespējams nomainīt',
'resetpass-no-info' => 'Jums ir nepieciešams ieiet, lai tūlīt piekļūtu šai lapai.',
'resetpass-submit-loggedin' => 'Mainīt paroli',
@@ -542,6 +578,7 @@ Tu jau esi veiksmīgi nomainījis savu galveno paroli, vai arī esi pieprasījis
# Special:PasswordReset
'passwordreset' => 'Paroles atiestatīšana',
+'passwordreset-text-one' => 'Aizpildiet šo veidlapu, lai atiestatītu savu paroli.',
'passwordreset-legend' => 'Atiestatīt paroli',
'passwordreset-disabled' => 'Paroles atiestates Å¡ajÄ viki ir atspÄ“jotas.',
'passwordreset-username' => 'LietotÄjvÄrds:',
@@ -565,6 +602,9 @@ Pagaidu parole: $2',
'changeemail-submit' => 'Mainīt e-pastu',
'changeemail-cancel' => 'Atcelt',
+# Special:ResetTokens
+'resettokens-token-label' => '$1 (šībrīža vērtība: $2)',
+
# Edit page toolbar
'bold_sample' => 'Teksts treknrakstÄ',
'bold_tip' => 'Teksts treknrakstÄ',
@@ -756,11 +796,14 @@ Netika sniegts paskaidrojums.',
IzskatÄs, ka lapa ir dzÄ“sta.',
'edit-conflict' => 'Labošanas konflikts.',
'edit-no-change' => 'Tavs labojums tika ignorÄ“ts, jo tekstÄ netika izdarÄ«tas izmaiņas.',
+'postedit-confirmation' => 'JÅ«su labojums tika saglabÄts.',
'edit-already-exists' => 'Nevar izveidot jaunu lapu.
TÄ jau eksistÄ“.',
'defaultmessagetext' => 'Noklusētais ziņojuma teksts',
'invalid-content-data' => 'Nederīgi satura dati',
'content-not-allowed-here' => '"$1" saturs nav atļauts lapÄ [[$2]]',
+'editwarning-warning' => 'AtstÄjot Å¡o lapu tu zaudÄ“si izdarÄ«tÄs izmaiņas.
+Ja esi pieteicies, jÅ«s vari atspÄ“jot Å¡o brÄ«dinÄjumu savÄs izvÄ“lÄ“s sadaÄ¼Ä "rediģēšana"',
# Content models
'content-model-wikitext' => 'vikiteksts',
@@ -914,6 +957,7 @@ $1",
'compareselectedversions' => 'SalÄ«dzinÄt izvÄ“lÄ“tÄs versijas',
'showhideselectedversions' => 'RÄdÄ«t/slÄ“pt izvÄ“lÄ“tÄs versijas',
'editundo' => 'atcelt',
+'diff-empty' => '(Nav atšķirību)',
'diff-multi' => '({{PLURAL:$1|Viena starpversija|$1 starpversijas}} no {{PLURAL:$2|viena lietotÄja|$2 lietotÄjiem}} nav parÄdÄ«ta)',
# Search results
@@ -936,7 +980,6 @@ $1",
'searchmenu-legend' => 'Meklēšanas iespējas',
'searchmenu-exists' => "'''Å ajÄ projektÄ ir raksts ar nosaukumu \"[[:\$1]]\"'''",
'searchmenu-new' => "'''Izveido rakstu \"[[:\$1]]\" Å¡ajÄ projektÄ!'''",
-'searchhelp-url' => 'Help:Saturs',
'searchprofile-articles' => 'Rakstos',
'searchprofile-project' => 'PalÄ«dzÄ«bas un projektu lapÄs',
'searchprofile-images' => 'Multivides failos',
@@ -979,13 +1022,6 @@ $1",
PagaidÄm vari meklÄ“t, izmantojot Google vai Yahoo.
Å…em vÄ“rÄ, ka meklÄ“tÄju indeksÄ“tais {{grammar:Ä£enitÄ«vs|{{SITENAME}}}} saturs var bÅ«t novecojis.',
-# Quickbar
-'qbsettings' => 'RÄ«ku joslas stÄvoklis',
-'qbsettings-fixedleft' => 'Fiksēts pa kreisi',
-'qbsettings-fixedright' => 'Fiksēts pa labi',
-'qbsettings-floatingleft' => 'Peldošs pa kreisi',
-'qbsettings-floatingright' => 'Peldošs pa labi',
-
# Preferences page
'preferences' => 'Izvēles',
'mypreferences' => 'Izvēles',
@@ -1018,7 +1054,6 @@ PagaidÄm vari meklÄ“t, izmantojot Google vai Yahoo.
'resetprefs' => 'Atcelt nesaglabÄtÄs izmaiņas',
'restoreprefs' => 'Atjaunot noklusÄ“tos uzstÄdÄ«jumus',
'prefs-editing' => 'Rediģēšana',
-'prefs-edit-boxsize' => 'Labošanas loga izmērs.',
'rows' => 'Rindiņu skaits:',
'columns' => 'Simbolu skaits rindiņÄ:',
'searchresultshead' => 'Meklēšana',
@@ -1028,9 +1063,6 @@ PagaidÄm vari meklÄ“t, izmantojot Google vai Yahoo.
'recentchangesdays-max' => 'Ne vairÄk kÄ $1 {{PLURAL:$1|diena|dienas}}',
'recentchangescount' => 'Izmaiņu skaits, kuru rÄda pÄ“c noklusÄ“juma:',
'prefs-help-recentchangescount' => 'Å is parametrs attiecas uz pÄ“dÄ“jo izmaiņu un hronoloÄ£ijas lapÄm, kÄ arÄ« uz sistÄ“mas žurnÄliem',
-'prefs-help-watchlist-token' => 'Å ajÄ laukÄ tu vari ievadÄ«t slepenu kodu, lai izveidotu RSS barotni savam uzraugÄmo lapu sarakstam.
-IzvÄ“lies droÅ¡u kodu, jo katrs, kam ir zinÄms Å¡is kods, varÄ“s redzÄ“t tavu uzraugÄmo lapu sarakstu.
-Ja vēlies, tu vari izmantot šo nejauši uzģenerēto kodu: $1',
'savedprefs' => 'JÅ«su izvÄ“les ir saglabÄtas.',
'timezonelegend' => 'Laika josla:',
'localtime' => 'Vietējais laiks:',
@@ -1059,7 +1091,6 @@ Ja vēlies, tu vari izmantot šo nejauši uzģenerēto kodu: $1',
'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:',
'username' => '{{GENDER:$1|LietotÄjvÄrds}}:',
'uid' => '{{GENDER:$1|LietotÄja|LietotÄjas}} ID:',
@@ -1091,6 +1122,8 @@ Ja tu izvÄ“lies to norÄdÄ«t, tas tiks izmantots, lai identificÄ“tu tavu darbu (
'prefs-dateformat' => 'Datuma formÄts',
'prefs-timeoffset' => 'Laika nobīde',
'prefs-advancedediting' => 'VispÄrÄ«gi uzstÄdÄ«jumi',
+'prefs-editor' => 'Redaktors',
+'prefs-preview' => 'Priekšskatījums',
'prefs-advancedrc' => 'Papildus uzstÄdÄ«jumi',
'prefs-advancedrendering' => 'Papildus uzstÄdÄ«jumi',
'prefs-advancedsearchoptions' => 'Papildus uzstÄdÄ«jumi',
@@ -1249,9 +1282,11 @@ Ja tu izvÄ“lies to norÄdÄ«t, tas tiks izmantots, lai identificÄ“tu tavu darbu (
# Recent changes
'nchanges' => '$1 {{PLURAL:$1|izmaiņa|izmaiņas}}',
+'enhancedrc-history' => 'vēsture',
'recentchanges' => 'PÄ“dÄ“jÄs izmaiņas',
'recentchanges-legend' => 'Pēdējo izmaiņu iespējas',
'recentchanges-summary' => 'Å ajÄ lapÄ ir uzskaitÄ«tas pÄ“dÄ“jÄs izdarÄ«tÄs izmaiņas.',
+'recentchanges-noresult' => 'NorÄdÄ«tajÄ periodÄ Å¡iem kritÄ“rijiem neatbilst neviena izmaiņa.',
'recentchanges-feed-description' => 'Sekojiet lÄ«dzi jaunÄkajÄm izmaiņÄm vikijÄ izmantojot Å¡o barotni.',
'recentchanges-label-newpage' => 'Å Ä« ir jaunizveidota lapa',
'recentchanges-label-minor' => 'Šī ir maznozīmīga izmaiņa',
@@ -1287,7 +1322,6 @@ Ja tu izvÄ“lies to norÄdÄ«t, tas tiks izmantots, lai identificÄ“tu tavu darbu (
'recentchangeslinked-feed' => 'SaistÄ«tÄs izmaiņas',
'recentchangeslinked-toolbox' => 'SaistÄ«tÄs izmaiņas',
'recentchangeslinked-title' => 'Izmaiņas, kas saistītas ar "$1"',
-'recentchangeslinked-noresult' => 'NorÄdÄ«tajÄ laika periodÄ saistÄ«tajÄs lapÄs izmaiņu nebija.',
'recentchangeslinked-summary' => "Å iet ir nesen izdarÄ«tÄs izmaiņas lapÄs, uz kurÄm ir saites no norÄdÄ«tÄs lapas (vai norÄdÄ«tajÄ kategorijÄ ietilpstoÅ¡Äs lapas).
Lapas, kas ir tavÄ [[Special:Watchlist|uzraugÄmo rakstu sarakstÄ]] ir '''treknas'''.",
'recentchangeslinked-page' => 'Lapas nosaukums:',
@@ -1473,7 +1507,6 @@ Atļauta ir tikai failu piekļuve.',
'http-invalid-url' => 'Nederīgs URL: $1',
'http-read-error' => 'HTTP nolasīšanas kļūda.',
'http-timed-out' => 'HTTP pieprasÄ«jumam ir iestÄjies noilgums.',
-'http-host-unreachable' => 'URL nevarēja sasniegt.',
# Some likely curl errors. More could be added from <http://curl.haxx.se/libcurl/c/libcurl-errors.html>
'upload-curl-error6' => 'URL nevarēja sasniegt',
@@ -1498,6 +1531,10 @@ Atļauta ir tikai failu piekļuve.',
'listfiles_size' => 'Izmērs',
'listfiles_description' => 'Apraksts',
'listfiles_count' => 'Versijas',
+'listfiles-show-all' => 'Iekļaut attÄ“lus vecÄs versijas',
+'listfiles-latestversion' => 'PaÅ¡reizÄ“jÄ versija',
+'listfiles-latestversion-yes' => 'JÄ',
+'listfiles-latestversion-no' => 'NÄ“',
# File description page
'file-anchor-link' => 'Attēls',
@@ -1582,6 +1619,11 @@ Apraksts ir [$2 faila apraksta lapÄ], kas ir parÄdÄ«ta zemÄk.',
# Random page
'randompage' => 'Nejauša lapa',
+# Random page in category
+'randomincategory' => 'NejauÅ¡a lapa kategorijÄ',
+'randomincategory-invalidcategory' => '"$1" nav derīgs kategorijas nosaukums.',
+'randomincategory-selectcategory-submit' => 'Aiziet',
+
# Random redirect
'randomredirect' => 'NejauÅ¡a pÄradresÄcijas lapa',
@@ -1605,12 +1647,6 @@ Apraksts ir [$2 faila apraksta lapÄ], kas ir parÄdÄ«ta zemÄk.',
'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}}',
'statistics-mostpopular' => 'VisvairÄk skatÄ«tÄs lapas',
-'disambiguations' => 'Lapas, kuras norÄda uz nozÄ«mju atdalÄ«Å¡anas lapÄm',
-'disambiguationspage' => 'Template:Disambig',
-'disambiguations-text' => "Å eit esoÅ¡ajÄs lapÄs ir saite uz '''nozÄ«mju atdalÄ«Å¡anas lapu'''.
-Å Ä«s saites vajadzÄ“tu izlabot, lai tÄs vestu tieÅ¡i uz attiecÄ«go lapu.<br />
-Lapu uzskata par nozÄ«mju atdalÄ«Å¡anas lapu, ja tÄ satur veidni, uz kuru ir saite no [[MediaWiki:Disambiguationspage]].",
-
'pageswithprop-submit' => 'Aiziet',
'doubleredirects' => 'DivkÄrÅ¡as pÄradresÄcijas lapas',
@@ -1833,10 +1869,9 @@ Ja vÄ“lÄk pÄrdomÄsi un nevÄ“lÄ“sies vairs uzraudzÄ«t Å¡o lapu, klikÅ¡Ä·ini uz
'unwatchthispage' => 'PÄrtraukt uzraudzÄ«Å¡anu',
'notanarticle' => 'Nav satura lapa',
'notvisiblerev' => 'Cita lietotÄja pÄ“dÄ“jÄ versija ir izdzÄ“sta',
-'watchnochange' => 'Neviena no tevis uzraudzÄ«tajÄm lapÄm nav mainÄ«ta parÄdÄ«tajÄ laika posmÄ.',
'watchlist-details' => '(Tu uzraugi $1 {{PLURAL:$1|lapu|lapas}}, neieskaitot diskusiju lapas.)',
'wlheader-enotif' => 'E-pasta paziņojumi ir ieslēgti.',
-'wlheader-showupdated' => "* Lapas, kuras ir tikuÅ¡as izmainÄ«tas, kopÅ¡ tu tÄs pÄ“dÄ“joreiz apskatÄ«jies, te rÄdÄs ar '''pustrekniem''' burtiem",
+'wlheader-showupdated' => "Lapas, kuras ir tikuÅ¡as izmainÄ«tas, kopÅ¡ tu tÄs pÄ“dÄ“joreiz apskatÄ«jies, te rÄdÄs ar '''pustrekniem''' burtiem",
'watchlistcontains' => 'TavÄ uzraugÄmo lapu sarakstÄ ir $1 {{PLURAL:$1|lapa|lapas}}.',
'iteminvalidname' => "Problēma ar '$1' vienību, nederīgs nosaukums...",
'wlshowlast' => 'ParÄdÄ«t izmaiņas pÄ“dÄ“jo $1 stundu laikÄ vai $2 dienu laikÄ, vai arÄ« $3.',
@@ -1904,10 +1939,12 @@ PapildinformÄcija:
'deletecomment' => 'Iemesls:',
'deleteotherreason' => 'Cits/papildu iemesls:',
'deletereasonotherlist' => 'Cits iemesls',
-'deletereason-dropdown' => '*Izplatīti dzēšanas iemesli
-** Autora pieprsījums
+'deletereason-dropdown' => '* Izplatīti dzēšanas iemesli
+** Spams
+** VandÄlisms
** AutortiesÄ«bu pÄrkÄpums
-** VandÄlisms',
+** Autora pieprasījums
+** NederÄ«ga pÄradresÄcija',
'delete-edit-reasonlist' => 'Izmainīt dzēšanas iemeslus',
'delete-toobig' => 'Å ai lapai ir liela izmaiņu hronoloÄ£ija, vairÄk nekÄ $1 {{PLURAL:$1|versija|versijas}}.
Å Ädu lapu dzÄ“Å¡ana ir atslÄ“gta, lai novÄ“rstu nejauÅ¡us traucÄ“jumus {{grammar:lokatÄ«vs|{{SITENAME}}}}.',
@@ -2044,6 +2081,7 @@ $1',
# Namespace form on various pages
'namespace' => 'VÄrdtelpa:',
'invert' => 'Izvēlēties pretēji',
+'namespace_association' => 'SaistÄ«tÄ vÄrdtelpa',
'blanknamespace' => '(Pamatlapa)',
# Contributions
@@ -2196,10 +2234,7 @@ Tas, iespējams, jau ir atbloķēts.',
'ipb_blocked_as_range' => 'Kļūda: IP $1 nav bloÄ·Ä“ta tieÅ¡i, tÄpÄ“c to nevar atbloÄ·Ä“t.
TÄ ir bloÄ·Ä“ta kÄ daļa no IP adreÅ¡u diapazona $2, kuru var atbloÄ·Ä“t.',
'ip_range_invalid' => 'Nederīgs IP diapazons',
-'blockme' => 'BloÄ·Ä“t mani',
'proxyblocker' => 'Starpniekservera bloÄ·Ä“tÄjs',
-'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',
@@ -2601,11 +2636,12 @@ PÄrÄ“jie lauki, pÄ“c noklusÄ“juma, bÅ«s paslÄ“pti.
* gpslongitude
* gpsaltitude',
-# EXIF tags
+# Exif tags
'exif-imagewidth' => 'platums',
'exif-imagelength' => 'augstums',
'exif-bitspersample' => 'biti komponentē',
'exif-compression' => 'Saspiešanas veids',
+'exif-photometricinterpretation' => 'Pikseļu sastÄvs',
'exif-orientation' => 'OrientÄcija',
'exif-samplesperpixel' => 'Komponentu skaits',
'exif-planarconfiguration' => 'Datu izkÄrtojums',
@@ -2732,7 +2768,7 @@ PÄrÄ“jie lauki, pÄ“c noklusÄ“juma, bÅ«s paslÄ“pti.
'exif-organisationinimage' => 'AttÄ“lotÄ organizÄcija',
'exif-personinimage' => 'AttÄ“lotÄ persona',
-# EXIF attributes
+# Exif attributes
'exif-compression-1' => 'Nekompresēts',
'exif-copyrighted-true' => 'Ar autortiesÄ«bÄm',
@@ -3039,16 +3075,18 @@ Var arī lietot [[Special:EditWatchlist|standarta izmainīšanas lapu]].',
'version-license' => 'Licence',
'version-poweredby-credits' => "Šis viki darbojas ar '''[//www.mediawiki.org/ MediaWiki]''' programmatūru, autortiesības © 2001-$1 $2.",
'version-poweredby-others' => 'citi',
+'version-poweredby-translators' => 'translatewiki.net tulkotÄji',
'version-credits-summary' => 'MÄ“s vÄ“lÄ“tos izteikt atzinÄ«bu Å¡Ä«m personÄm par viņu ieguldÄ«jumu [[Special:Version|MediaWiki]].',
'version-software' => 'InstalÄ“tÄ programmatÅ«ra',
'version-software-product' => 'Produkts',
'version-software-version' => 'Versija',
'version-entrypoints-header-url' => 'URL',
-# Special:FilePath
-'filepath' => 'Failu adreses',
-'filepath-page' => 'Fails:',
-'filepath-submit' => 'Atrast',
+# Special:Redirect
+'redirect-value' => 'Vērtība:',
+'redirect-user' => 'LietotÄja ID',
+'redirect-file' => 'Faila nosaukums',
+'redirect-not-exists' => 'Vērtība nav atrasta',
# Special:FileDuplicateSearch
'fileduplicatesearch' => 'Meklēt failu kopijas',
@@ -3087,12 +3125,16 @@ Var arī lietot [[Special:EditWatchlist|standarta izmainīšanas lapu]].',
'tags' => 'Derīgas izmaiņu iezīmes',
'tag-filter' => '[[Special:Tags|Iezīmju]] filtrs:',
'tag-filter-submit' => 'Filtrs',
+'tag-list-wrapper' => '([[Special:Tags|{{PLURAL:$1|Iezīme|Iezīmes}}]]: $2)',
'tags-title' => 'Iezīmes',
'tags-intro' => 'Å ajÄ lapÄ uzskaitÄ«tas iezÄ«mes, ar kurÄm programmatÅ«ra var atzÄ«mÄ“t labojumus, un to nozÄ«me.',
'tags-tag' => 'Iezīmes nosaukums',
'tags-display-header' => 'Izmainīto sarakstu izskats',
'tags-description-header' => 'Nozīmes pilns apraksts',
+'tags-active-header' => 'Aktīvs?',
'tags-hitcount-header' => 'IezÄ«mÄ“tÄs izmaiņas',
+'tags-active-yes' => 'JÄ',
+'tags-active-no' => 'NÄ“',
'tags-edit' => 'labot',
'tags-hitcount' => '$1 {{PLURAL:$1|izmaiņa|izmaiņas}}',
@@ -3114,6 +3156,7 @@ Var arī lietot [[Special:EditWatchlist|standarta izmainīšanas lapu]].',
Å ai vietnei ir raduÅ¡Äs tehniskas problÄ“mas.',
'dberr-again' => 'Uzgaidiet dažas minÅ«tes un pÄrlÄdÄ“jiet Å¡o lapu.',
'dberr-info' => '(Nevar sazinÄties ar datubÄzes serveri: $1)',
+'dberr-info-hidden' => '(Nevar sazinÄties ar datubÄzes serveri)',
'dberr-usegoogle' => 'Pa to laiku Jūs varat izmantot Google meklēšanu.',
'dberr-outofdate' => 'Å…emiet vÄ“rÄ, ka mÅ«su satura indeksÄcija var bÅ«t novecojusi.',
'dberr-cachederror' => 'Å Ä« ir lapas agrÄk saglabÄtÄ kopija, tÄ var nebÅ«t atjauninÄta.',
@@ -3129,6 +3172,9 @@ Var arī lietot [[Special:EditWatchlist|standarta izmainīšanas lapu]].',
'htmlform-submit' => 'Iesniegt',
'htmlform-reset' => 'Atcelt izmaiņas',
'htmlform-selectorother-other' => 'Citi',
+'htmlform-no' => 'NÄ“',
+'htmlform-yes' => 'JÄ',
+'htmlform-chosen-placeholder' => 'Izvēlieties iespēju',
# SQLite database support
'sqlite-has-fts' => '$1 ar pilnteksta meklēšanas atbalstu',
@@ -3187,4 +3233,10 @@ Var arī lietot [[Special:EditWatchlist|standarta izmainīšanas lapu]].',
'api-error-unknownerror' => 'NezinÄma kļūda: "$1"',
'api-error-uploaddisabled' => 'AugÅ¡upielÄde Å¡ajÄ wiki ir atslÄ“gta.',
+# Limit report
+'limitreport-title' => 'ParsÄ“tÄja profilÄ“Å¡anas dati:',
+'limitreport-postexpandincludesize-value' => '$1/$2 baiti',
+'limitreport-templateargumentsize' => 'Veidnes argumenta izmērs',
+'limitreport-templateargumentsize-value' => '$1/$2 {{PLURAL:$2|baits|baiti}}',
+
);
diff --git a/languages/messages/MessagesLzh.php b/languages/messages/MessagesLzh.php
index 30c67603..c57b0a5b 100644
--- a/languages/messages/MessagesLzh.php
+++ b/languages/messages/MessagesLzh.php
@@ -180,9 +180,6 @@ $messages = array(
'tog-shownumberswatching' => '放哨有',
'tog-oldsig' => '覽原署å:',
'tog-fancysig' => '署以本碼待之(å…自連)',
-'tog-externaleditor' => '它器修文(高人用,需設之。[//www.mediawiki.org/wiki/Manual:External_editors 閱。])',
-'tog-externaldiff' => '它器修異(高人用,需設之。[//www.mediawiki.org/wiki/Manual:External_editors 閱。])',
-'tog-showjumplinks' => 'éˆå¾€å­—',
'tog-uselivepreview' => 'å³è¦½åšé®®ï¼ˆJavaScript)',
'tog-forceeditsummary' => 'æ¼æ¦‚醒之',
'tog-watchlisthideown' => 'ä¸å“¨å·±æ–‡',
@@ -196,6 +193,7 @@ $messages = array(
'tog-showhiddencats' => '示隱類',
'tog-noconvertlink' => 'éžè½‰éµé¡Œ',
'tog-norollbackdiff' => '轉後略異',
+'tog-useeditwarning' => '離而未存,示å¾',
'underline-always' => 'æ†',
'underline-never' => '絕',
@@ -259,6 +257,18 @@ $messages = array(
'oct' => 'å月',
'nov' => 'å一月',
'dec' => 'å二月',
+'january-date' => '正月 $1',
+'february-date' => '二月$1日',
+'march-date' => '三月$1日',
+'april-date' => '四月$1日',
+'may-date' => '五月$1日',
+'june-date' => '六月$1日',
+'july-date' => '七月$1日',
+'august-date' => '八月$1日',
+'september-date' => 'ä¹æœˆ$1æ—¥',
+'october-date' => 'å月$1æ—¥',
+'november-date' => 'å一月$1æ—¥',
+'december-date' => 'å二月$1æ—¥',
# Categories related messages
'pagecategories' => '$1é¡ž',
@@ -340,6 +350,7 @@ $messages = array(
'create-this-page' => 'ç«‹',
'delete' => '刪',
'deletethispage' => '刪',
+'undeletethispage' => 'å刪此é ',
'undelete_short' => '還$1已刪',
'viewdeleted_short' => '察$1已刪',
'protect' => 'ç·˜',
@@ -383,7 +394,7 @@ $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).
+# 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).
'aboutsite' => 'è¿°{{SITENAME}}',
'aboutpage' => 'Project:è¿°',
'copyright' => '文奉$1行。',
@@ -393,7 +404,6 @@ $1',
'disclaimers' => 'å…責宣',
'disclaimerpage' => 'Project:å…責宣',
'edithelp' => '助纂塾',
-'edithelppage' => 'Help:纂',
'helppage' => 'Help:目錄',
'mainpage' => 'å·é¦–',
'mainpage-description' => 'å·é¦–',
@@ -467,15 +477,6 @@ $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' => '何以鎖之?何日啟之?',
@@ -517,7 +518,6 @@ $1',
'viewsourcetext' => '爾å¯è¦–åŠè¤‡ä¹‹æœ¬é ä¹‹åŽŸå§‹ç¢¼ã€‚',
'protectedinterface' => 'æ­¤é å¸ç‰ˆï¼ŒéŒ®ä¹‹ä»¥é æ¿«ã€‚',
'editinginterface' => "'''警示:'''æ­¤é å¸ç‰ˆï¼Œä¸€é«®ç‰½èº«ï¼Œæƒ æ…Žä¹‹ã€‚如譯之,å¯æ…®[//translatewiki.net/wiki/Main_Page?setlang=zh-hant translatewiki.net]也,為MediaWiki軟件本地化之計劃也。",
-'sqlhidden' => '(SQL隱然)',
'cascadeprotected' => 'æ­¤é "è¿­ç·˜"矣。$1é ç‰½é€£å¦‚下:
$2',
'namespaceprotected' => "å­æ¬Šæœªé€®ï¼ŒèŽ«èƒ½çº‚'''$1'''。",
@@ -541,10 +541,19 @@ $2',
請更簿註乎[[Special:Preferences|此]]。',
'yourname' => 'å',
+'userlogin-yourname' => 'ç°¿å',
+'userlogin-yourname-ph' => '輸簿å',
+'createacct-another-username-ph' => '輸簿å',
'yourpassword' => '符節',
+'userlogin-yourpassword' => '符節',
+'userlogin-yourpassword-ph' => '輸å­ç¬¦ç¯€',
+'createacct-yourpassword-ph' => '輸一符節',
'yourpasswordagain' => '復核節',
+'createacct-yourpasswordagain' => '訂å­ç¬¦ç¯€',
+'createacct-yourpasswordagain-ph' => '復輸符節',
'remembermypassword' => 'å¾ä¹‹ç°¿é€šè¶Šï¼ˆé”至$1日)',
-'securelogin-stick-https' => '登後ä»ä»¥HTTPS通接',
+'userlogin-remembermypassword' => '記å¾',
+'userlogin-signwithsecure' => '以安全伺æœç™»ç°¿',
'yourdomainname' => 'å­ä¹‹ç¶²åŸŸ',
'password-change-forbidden' => '符節ä¸èƒ½æ”¹ä¹Žæ­¤ç¶­åŸºä¹Ÿã€‚',
'externaldberror' => 'èªåº«ä¹‹éŒ¯æˆ–ç¦æ›´çˆ¾ä¹‹å¤–簿。',
@@ -556,17 +565,35 @@ $2',
'logout' => '去簿',
'userlogout' => '去簿',
'notloggedin' => '尚未登簿',
+'userlogin-noaccount' => '無簿乎?',
+'userlogin-joinproject' => 'å…¥{{SITENAME}}',
'nologin' => '無簿乎?往$1。',
'nologinlink' => '增簿',
'createaccount' => '增簿',
'gotaccount' => '有簿矣哉?往$1。',
'gotaccountlink' => '登簿',
'userlogin-resetlink' => 'å›å¿˜ç™»ç°¿æ‰€éœ€çˆ¾ï¼Ÿ',
+'userlogin-resetpassword-link' => '輸å­ç¬¦ç¯€',
+'helplogin-url' => 'Help:登簿',
+'createacct-emailrequired' => '電郵',
+'createacct-emailoptional' => '電郵 (å¯é¸ï¼‰',
'createaccountmail' => 'åŒéƒµ',
+'createacct-realname' => '實å(é¸ï¼‰',
'createaccountreason' => '因:',
+'createacct-reason' => '因:',
+'createacct-reason-ph' => '何為å­å¦ç«‹ä¸€ç°¿ä¹Žï¼Ÿ',
+'createacct-captcha' => '安檢',
+'createacct-imgcaptcha-ph' => '輸上之文字',
+'createacct-submit' => '增簿',
+'createacct-another-submit' => 'å†ç«‹ä¸€ç°¿',
+'createacct-benefit-heading' => 'å¾ç­‰ç«‹{{SITENAME}}者,或黔首,或專戶。',
+'createacct-benefit-body1' => '纂',
+'createacct-benefit-body2' => 'é ',
+'createacct-benefit-body3' => '是月纂者',
'badretype' => '符節ä¸åˆä¹Ÿã€‚',
'userexists' => 'ç°¿å存矣,惠更之。',
'loginerror' => '登簿誤然',
+'createacct-error' => '建簿未æˆ',
'createaccounterror' => '無增簿:$1',
'nocookiesnew' => '{{SITENAME}}簿增而未登,惠准cookies後å†ç™»ä¹‹ã€‚',
'nocookieslogin' => '登簿{{SITENAME}}須cookies,惠准之後登。',
@@ -632,7 +659,7 @@ $2',
'newpassword' => '新符節:',
'retypenew' => 'é‡å¯Ÿæ–°ç¬¦ç¯€ï¼š',
'resetpass_submit' => '設符å†ç™»',
-'resetpass_success' => '爾之符節已改ï¼
+'changepassword-success' => '爾之符節已改ï¼
ç¾ç™»ç°¿ä¸­...',
'resetpass_forbidden' => '無改符節',
'resetpass-no-info' => '爾須登簿後方進此é ã€‚',
@@ -645,6 +672,7 @@ $2',
# Special:PasswordReset
'passwordreset' => 'é‡è¨­ç¬¦ç¯€',
+'passwordreset-text-one' => '慾更符節,填此佇列',
'passwordreset-legend' => 'é‡è¨­ç¬¦ç¯€',
'passwordreset-username' => 'ç°¿å:',
'passwordreset-domain' => '域:',
@@ -807,6 +835,7 @@ $2',
刪之也。',
'edit-conflict' => '纂çªã€‚',
'edit-no-change' => '爾之纂已略,由字無改也。',
+'postedit-confirmation' => 'æ±ä¹‹çº‚å·²æˆ',
'edit-already-exists' => 'ä¸å»ºæ–°é ã€‚
已存也。',
'defaultmessagetext' => '慣話文',
@@ -1020,7 +1049,6 @@ $1",
'searchmenu-legend' => 'å°‹é¸',
'searchmenu-exists' => "'''在此wiki中有é ç‚º\"[[:\$1]]\"。'''",
'searchmenu-new' => "'''在此wiki上建é \"[[:\$1]]\"ï¼'''",
-'searchhelp-url' => 'Help:目錄',
'searchmenu-prefix' => '[[Special:PrefixIndex/$1|查此首之é ]]',
'searchprofile-articles' => '容',
'searchprofile-project' => '助題',
@@ -1062,9 +1090,6 @@ $1",
'search-external' => '外尋',
'searchdisabled' => '{{SITENAME}}因性能而åœç”¨ä¹‹ã€‚å¯Gooogle查之,乃之éŽæ™‚也。',
-# Quickbar
-'qbsettings-none' => 'ç„¡',
-
# Preferences page
'preferences' => '簿註',
'mypreferences' => '簿註',
@@ -1092,7 +1117,6 @@ $1",
'resetprefs' => '棄',
'restoreprefs' => 'é‡ä¿®',
'prefs-editing' => '在修',
-'prefs-edit-boxsize' => '修框尺',
'rows' => '行:',
'columns' => '列:',
'searchresultshead' => 'å°‹',
@@ -1103,9 +1127,6 @@ $1",
'recentchangesdays-max' => '最大有$1',
'recentchangescount' => '修著凡幾︰',
'prefs-help-recentchangescount' => 'å«è¿‘易ã€å²èˆ‡èªŒã€‚',
-'prefs-help-watchlist-token' => '添匙åƒçˆ¾ä¹‹RSS哨。
-且人知匙,å¯é–±çŸ£ä¹‹ï¼Œæ“‡å…¨ä¹‹å€¼ä¹Ÿã€‚
-ä»»æˆä¹‹å€¼ï¼Œçˆ¾å¯é¸ä¹‹ï¼š$1',
'savedprefs' => '簿註書矣',
'timezonelegend' => '時å€ï¼š',
'localtime' => '本地時:',
@@ -1135,7 +1156,6 @@ $1",
'prefs-common-css-js' => 'å…±CSS/JavaScriptæ–¼é¢ç‰ˆï¼š',
'prefs-reset-intro' => '爾用é é‡è¨­è‡³é ä¹‹è¨­ã€‚無修之也。',
'prefs-emailconfirm-label' => '確郵:',
-'prefs-textboxsize' => '纂框é‡',
'youremail' => '郵:',
'username' => 'ç°¿å:',
'uid' => '編號︰',
@@ -1164,6 +1184,8 @@ $1",
'prefs-dateformat' => '日格',
'prefs-timeoffset' => 'å時',
'prefs-advancedediting' => '進',
+'prefs-editor' => '纂者',
+'prefs-preview' => 'è‰è¦½',
'prefs-advancedrc' => '進',
'prefs-advancedrendering' => '進',
'prefs-advancedsearchoptions' => '進',
@@ -1366,7 +1388,6 @@ $1",
'recentchangeslinked-feed' => 'æ´å¼•',
'recentchangeslinked-toolbox' => 'æ´å¼•',
'recentchangeslinked-title' => '「$1ã€æ´å¼•è¿‘易',
-'recentchangeslinked-noresult' => 'é™æœŸå…§ç„¡è¿‘易。',
'recentchangeslinked-summary' => "此奇é ä¹ƒåˆ—''ç”±''é æ´ä¹‹è¿‘易(或å°é¡žä¹‹å“¡ï¼‰ã€‚
有[[Special:Watchlist|爾有哨]]者'''粗體'''。",
'recentchangeslinked-page' => 'é å:',
@@ -1510,7 +1531,6 @@ $1',
'http-read-error' => 'HTTP讀錯。',
'http-timed-out' => 'HTTP求之éŽæ™‚也。',
'http-curl-error' => 'å–網å€ç¾éŒ¯ä¹‹ï¼š$1',
-'http-host-unreachable' => 'ç„¡é”網å€ä¹‹ã€‚',
'http-bad-status' => 'HTTP求時ç¾å•ï¼š$1 $2',
# Some likely curl errors. More could be added from <http://curl.haxx.se/libcurl/c/libcurl-errors.html>
@@ -1652,10 +1672,6 @@ $1',
'statistics-users-active-desc' => 'æ—©$1æ—¥å‰æ›´å‹•ä¹‹ç°¿',
'statistics-mostpopular' => '燴炙',
-'disambiguations' => '釋義',
-'disambiguationspage' => 'Template:弭誤解',
-'disambiguations-text' => 'é ä¸‹å¼•[[MediaWiki:Disambiguationspage]]模,求釋義,宜正題之。',
-
'doubleredirects' => '窮渡',
'doubleredirectstext' => 'é ä¸‹çª®æ¸¡ï¼Œè¿­åˆ—以示。首尾宿åˆï¼Œå®œæ­£æ¸¡ä¹‹ã€‚
<del>劃</del>已解之。',
@@ -1869,7 +1885,6 @@ $1',
'unwatchthispage' => '撤此哨',
'notanarticle' => 'æ­¤é éžæ–‡',
'notvisiblerev' => '上中異簿之審已刪矣',
-'watchnochange' => '皆無易也',
'watchlist-details' => '哨上有$1,ä¸å«è­°è«–。',
'wlheader-enotif' => '*准報信。',
'wlheader-showupdated' => "*易者'''粗體'''。",
@@ -2197,9 +2212,7 @@ $1',
'ipb_blocked_as_range' => '錯:該IP $1 ç„¡ç›´ç¦ä¹Ÿï¼Œç„¡èµ¦ä¹‹ã€‚唯它在 $2 之範ç¦å…§ï¼Œå…¶ç¯„å¯èµ¦ä¹‹ã€‚',
'ip_range_invalid' => 'IPå€åœä¸æ ¼',
'ip_range_toolarge' => '大於 /$1 之ç¦æ®µä¹ƒç„¡å®¹ä¹Ÿã€‚',
-'blockme' => '自ç¦',
'proxyblocker' => 'ç¦Proxy',
-'proxyblocksuccess' => 'æˆçŸ£ã€‚',
'cant-block-while-blocked' => '爾然被ç¦ï¼Œå‹¿æ–½æ–¼äººã€‚',
'cant-see-hidden-user' => 'ç°¿ç¦æˆ–è—矣。
爾無è—之權,無視纂ç¦ä¹Ÿã€‚',
@@ -2448,27 +2461,16 @@ $1',
# Stylesheets
'common.css' => '/* 此之 CSS 用於全é¢ä¹Ÿ */',
-'standard.css' => '/* 此之 CSS 用於經典é¢ä¹‹ç°¿ä¹Ÿ */',
-'nostalgia.css' => '/* 此之 CSS 用於懷å¤é¢ä¹‹ç°¿ä¹Ÿ */',
'cologneblue.css' => '/* 此之 CSS 用於馨è—é¢ä¹‹ç°¿ä¹Ÿ */',
'monobook.css' => '/* 此之 CSS 用於單書é¢ä¹‹ç°¿ä¹Ÿ */',
-'myskin.css' => '/* 此之 CSS 用於å¾é¢¨é¢ä¹‹ç°¿ä¹Ÿ */',
-'chick.css' => '/* 此之 CSS 用於窈窕é¢ä¹‹ç°¿ä¹Ÿ */',
-'simple.css' => '/* 此之 CSS 用於簡明é¢ä¹‹ç°¿ä¹Ÿ */',
'modern.css' => '/* 此之 CSS 用於時髦é¢ä¹‹ç°¿ä¹Ÿ */',
'vector.css' => '/* 此之 CSS 用於動力é¢ä¹‹ç°¿ä¹Ÿ */',
'print.css' => '/* 此之 CSS 用於å°ä¹‹å‡ºåŠ›ä¹Ÿ */',
-'handheld.css' => '/* 此之 CSS 用於 $wgHandheldStyle 之手置é¢ä¹Ÿ */',
# Scripts
'common.js' => '/* 此之JavaScript將載於全簿之é ã€‚ */',
-'standard.js' => '/* 此之JavaScript將載於用經典é¢ä¹‹ç°¿ */',
-'nostalgia.js' => '/* 此之JavaScript將載於用懷å¤é¢ä¹‹ç°¿ */',
'cologneblue.js' => '/* 此之JavaScript將載於用馨è—é¢ä¹‹ç°¿ */',
'monobook.js' => '/* 此之JavaScript將載於用單書é¢ä¹‹ç°¿ */',
-'myskin.js' => '/* 此之JavaScript將載於用å¾é¢¨é¢ä¹‹ç°¿ */',
-'chick.js' => '/* 此之JavaScript將載於用窈窕é¢ä¹‹ç°¿ */',
-'simple.js' => '/* 此之JavaScript將載於用簡明é¢ä¹‹ç°¿ */',
'modern.js' => '/* 此之JavaScript將載於用時髦é¢ä¹‹ç°¿ */',
'vector.js' => '/* 此之JavaScript將載於用動力é¢ä¹‹ç°¿ */',
@@ -2494,13 +2496,8 @@ $1',
'spam_blanking' => '審皆éˆ$1,é‚令白é ã€‚',
# Skin names
-'skinname-standard' => '經典',
-'skinname-nostalgia' => '懷å¤',
'skinname-cologneblue' => '馨è—',
'skinname-monobook' => '單書',
-'skinname-myskin' => 'å¾é¢¨',
-'skinname-chick' => '窈窕',
-'skinname-simple' => '簡明',
'skinname-modern' => '時髦',
'skinname-vector' => '動力',
@@ -2592,7 +2589,7 @@ $1',
* gpslongitude
* gpsaltitude',
-# EXIF tags
+# Exif tags
'exif-imagewidth' => '寬',
'exif-imagelength' => 'é•·',
'exif-photometricinterpretation' => 'åƒç´ æ§‹æˆ',
@@ -2786,7 +2783,6 @@ $5
'version-other' => 'ä»–',
'version-mediahandlers' => '媒處',
'version-hooks' => '鈎',
-'version-extension-functions' => '展函',
'version-parser-extensiontags' => '語展標',
'version-parser-function-hooks' => '語函鈎',
'version-hook-name' => '鈎å',
@@ -2804,12 +2800,6 @@ MediaWiki乃為用之發,無擔之責也;亦無售目之默擔也。åƒGNUé€
'version-software-product' => 'å“',
'version-software-version' => '版',
-# Special:FilePath
-'filepath' => '檔路',
-'filepath-page' => '檔å:',
-'filepath-submit' => 'å¾€',
-'filepath-summary' => '此奇é å–一檔之整路。圖以全解åƒç¤ºä¹‹ï¼Œä»–檔會以有關之程å¼å•Ÿå‹•ä¹Ÿã€‚',
-
# Special:FileDuplicateSearch
'fileduplicatesearch' => '擇é‡æª”',
'fileduplicatesearch-summary' => '以é‡æª”之切去查é‡ä¹Ÿã€‚',
diff --git a/languages/messages/MessagesMai.php b/languages/messages/MessagesMai.php
index 8d4ceaaf..70e2146c 100644
--- a/languages/messages/MessagesMai.php
+++ b/languages/messages/MessagesMai.php
@@ -58,9 +58,6 @@ $messages = array(
'tog-shownumberswatching' => 'धà¥à¤¯à¤¾à¤¨ राखैबला पà¥à¤°à¤¯à¥‹à¤•à¥à¤¤à¤¾à¤• संखà¥à¤¯à¤¾',
'tog-oldsig' => 'अखà¥à¤¨à¤•à¤¾ दसà¥à¤–त',
'tog-fancysig' => 'हसà¥à¤¤à¤¾à¤•à¥à¤·à¤°à¤•à¥‡à¤‚ विकिटेकà¥à¤¸à¤Ÿà¤• रूपमे देखू (सà¥à¤µà¤šà¤¾à¤²à¤¿à¤¤ शà¥à¤°à¥ƒà¤‚खला हीन)',
-'tog-externaleditor' => "↓पूरà¥à¤µà¤¨à¤¿à¤°à¥à¤§à¤¾à¤°à¤¿à¤¤ रूपेठबाहà¥à¤¯ समà¥à¤ªà¤¾à¤¦à¤• क' उपयोग करू (केवल विशेषजà¥à¤žà¤¸à¤­à¤• लेल, à¤à¤•à¤°à¤¾ लेल संगणक पर विशेष सेटिंग चाही। [//www.mediawiki.org/wiki/Manual:External_editors आओर जानकारी।])",
-'tog-externaldiff' => 'पà¥à¤°à¤¾à¤¨ संसà¥à¤•à¤°à¤£à¤®à¥‡ अंतर देखेबाक हेतॠपूरà¥à¤µà¤¨à¤¿à¤µà¤¿à¤·à¥à¤Ÿ रूपमे बाहरक परिवरà¥à¤¤à¤¨à¤• पà¥à¤°à¤¯à¥‹à¤— करू',
-'tog-showjumplinks' => 'करू "तड़पान" भेटैबला लिंक सभ',
'tog-uselivepreview' => 'करू चल पूरà¥à¤µà¤¾à¤µà¤²à¥‹à¤•à¤¨ (जावासà¥à¤•à¥à¤°à¤¿à¤ªà¥à¤Ÿ चाही) (पà¥à¤°à¤¾à¤¯à¥‹à¤—िक)',
'tog-forceeditsummary' => 'हमरा सचेत करू जखन हम खाली समà¥à¤ªà¤¾à¤¦à¤® सारांशमे जाइ',
'tog-watchlisthideown' => 'हमर साकांकà¥à¤· सूचीसठहमर समà¥à¤ªà¤¾à¤¦à¤¨ नà¥à¤•à¤¾à¤‰',
@@ -257,7 +254,7 @@ $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).
+# 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).
'aboutsite' => 'विषयमे {{SITENAME}}',
'aboutpage' => 'Project:विवरण',
'copyright' => '$1क अंतरà¥à¤—त विषय सूची उपलबà¥à¤§ अछि',
@@ -267,7 +264,6 @@ $1',
'disclaimers' => 'अनाधिकार घोषणा',
'disclaimerpage' => 'Project:अनाधिकार घोषणा',
'edithelp' => 'संपादन सहयोग',
-'edithelppage' => 'Help:संपादन',
'helppage' => 'Help: विषय सूची',
'mainpage' => 'समà¥à¤®à¥à¤– पनà¥à¤¨à¤¾',
'mainpage-description' => 'समà¥à¤®à¥à¤– पृषà¥à¤ ',
@@ -294,7 +290,6 @@ $1',
'newmessagesdifflink' => 'अनà¥à¤¤à¤¿à¤® परिवरà¥à¤¤à¤¨',
'youhavenewmessagesmulti' => '$1 पर अहाठलेल नव सनà¥à¤¦à¥‡à¤¶ अछि',
'editsection' => 'संपादन करू',
-'editsection-brackets' => '[$1]',
'editold' => 'समà¥à¤ªà¤¾à¤¦à¤¿à¤¤ करू',
'viewsourceold' => 'जड़ि देखू',
'editlink' => 'समà¥à¤ªà¤¾à¤¦à¤¨ करू',
@@ -345,17 +340,6 @@ $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' => 'पà¥à¤°à¤¤à¤¿à¤¬à¤¨à¥à¤§ लेल कारण बताउ, संगमे à¤à¤•à¤Ÿà¤¾ अंदाज सेहो बताउ जे कखन ई पà¥à¤°à¤¤à¤¿à¤¬à¤¨à¥à¤§ हटाà¤à¤² जाà¤à¤¤à¥¤',
@@ -405,7 +389,6 @@ $1',
'editinginterface' => "'''चेतौनी''' अहाठà¤à¤•à¤Ÿà¤¾ à¤à¤¹à¥‡à¤¨ पनà¥à¤¨à¤¾à¤• समà¥à¤ªà¤¾à¤¦à¤¨ कऽ रहल छी जे तंतà¥à¤°à¤¾à¤‚शक मधà¥à¤¯à¤¸à¥à¤¥ पनà¥à¤¨à¤¾à¤•à¥‡à¤ पाठ देबा लेल पà¥à¤°à¤¯à¥‹à¤— भऽ रहल अछि।
ठपनà¥à¤¨à¤¾à¤®à¥‡ परिवरà¥à¤¤à¤¨ दोसर पà¥à¤°à¤¯à¥‹à¤•à¥à¤¤à¤¾ लेल पà¥à¤°à¤¯à¥‹à¤•à¥à¤¤à¤¾ मधà¥à¤¯à¤¸à¥à¤¥à¤• रूपमे परिवरà¥à¤¤à¤¨ करत।
अनà¥à¤µà¤¾à¤¦ लेल [//translatewiki.net/wiki/Main_Page?setlang=en translatewiki.net] जाउ, मीडियाविकी सà¥à¤¥à¤¾à¤¨à¥€à¤¯à¤•à¤°à¤£ परियोजनापर।",
-'sqlhidden' => '(नà¥à¤•à¤¾à¤à¤² à¤à¤¸.कà¥à¤¯à¥‚.à¤à¤². अभà¥à¤¯à¤°à¥à¤¥à¤¨à¤¾)',
'cascadeprotected' => 'ठपनà¥à¤¨à¤¾à¤• समà¥à¤ªà¤¾à¤¦à¤¨ समà¥à¤­à¤µ नै अछि, कारण ई ठमे समà¥à¤®à¤¿à¤²à¤¿à¤¤ अछि, {{PLURAL:$1|पनà¥à¤¨à¤¾, जे अछि|पनà¥à¤¨à¤¾, से सभ अछि}} सà¥à¤°à¤•à¥à¤·à¤¿à¤¤ अछि "तराउपड़ी" विकलà¥à¤ª खोललाक बाद:
$2',
'namespaceprotected' => "अहाà¤à¤•à¥‡à¤ '''$1''' नाम-पेटारमे समà¥à¤ªà¤¾à¤¦à¤¨à¤• अनà¥à¤®à¤¤à¤¿ नै अछि।",
@@ -429,7 +412,6 @@ $2',
'yourpassword' => 'कूटशबà¥à¤¦:',
'yourpasswordagain' => 'कूटशबà¥à¤¦ फेरसठटाइप करू:',
'remembermypassword' => 'हमर समà¥à¤ªà¥à¤°à¤µà¥‡à¤¶ ठगवेषकपर मोन राखू (बेशीसठबेशी $1 {{PLURAL:$1|दिन|दिन}})',
-'securelogin-stick-https' => 'समà¥à¤ªà¥à¤°à¤µà¥‡à¤¶à¤• बाद à¤à¤š.टी.टी.पी.à¤à¤¸.क लागिमे रहू',
'yourdomainname' => 'अहाà¤à¤• पà¥à¤°à¤­à¤¾à¤µà¤•à¥à¤·à¥‡à¤¤à¥à¤°:',
'externaldberror' => 'खाहे सतà¥à¤¯à¤¾à¤ªà¤¨ दतांश भà¥à¤°à¤® छल वा अहाठअपन बाहà¥à¤¯ खाताकेठअदà¥à¤¯à¤¤à¤¨ करबामे असमरà¥à¤¥ छी।',
'login' => 'समà¥à¤ªà¥à¤°à¤µà¥‡à¤¶',
@@ -529,7 +511,7 @@ $2',
'newpassword' => 'नव कूटशबà¥à¤¦',
'retypenew' => 'नव कूटशबà¥à¤¦ फेरसठटंकित करू',
'resetpass_submit' => 'कूटशबà¥à¤¦ बनाउ आ समà¥à¤ªà¥à¤°à¤µà¥‡à¤¶ करू',
-'resetpass_success' => 'अहाà¤à¤• कूटशबà¥à¤¦ सफलतासठबदलि देल गेल!
+'changepassword-success' => 'अहाà¤à¤• कूटशबà¥à¤¦ सफलतासठबदलि देल गेल!
आब अहाà¤à¤•à¥‡à¤ समà¥à¤ªà¥à¤°à¤µà¥‡à¤¶à¤¿à¤¤ कऽ रहल छी...',
'resetpass_forbidden' => 'कूटशबà¥à¤¦ सभ नै बदलल जा सकैà¤à¥¤',
'resetpass-no-info' => 'अहाà¤à¤•à¥‡à¤ ठपनà¥à¤¨à¤¾à¤•à¥‡à¤ पढ़बाले समà¥à¤ªà¥à¤°à¤µà¥‡à¤¶à¤¿à¤¤ हà¥à¤…ठपड़त।',
@@ -541,10 +523,8 @@ $2',
# Special:PasswordReset
'passwordreset' => 'कूटशबà¥à¤¦ फेरसठबनाउ',
-'passwordreset-text' => 'ई-पतà¥à¤° दà¥à¤µà¤¾à¤°à¤¾ अपन खाता विवरणक सà¥à¤®à¤°à¤£ पà¥à¤°à¤¾à¤ªà¥à¤¤ करबा लेल ठफॉरà¥à¤®à¤•à¥‡à¤ भरू।',
'passwordreset-legend' => 'कूटशबà¥à¤¦ फेरसठबनाउ',
'passwordreset-disabled' => 'कूटशबà¥à¤¦ फेरसठबनाà¤à¤¬ ठविकीपर अकà¥à¤·à¤® कà¤à¤² अछि।',
-'passwordreset-pretext' => '{{PLURAL:$1||नीचाà¤à¤• दतà¥à¤¤à¤¾à¤‚शक à¤à¤•à¤Ÿà¤¾ भागक पà¥à¤°à¤µà¤¿à¤·à¥à¤Ÿà¤¿ करू}}',
'passwordreset-username' => 'पà¥à¤°à¤¯à¥‹à¤•à¥à¤¤à¤¾à¤¨à¤¾à¤®',
'passwordreset-domain' => 'कà¥à¤·à¥‡à¤¤à¥à¤°:',
'passwordreset-capture' => 'परिणाम ई-पतà¥à¤° देखू?',
@@ -994,7 +974,6 @@ $3 दà¥à¤µà¤¾à¤°à¤¾ देल कारण अछि ''$2''",
'searchmenu-legend' => 'खोज विकलà¥à¤ª',
'searchmenu-exists' => "'''ठविकीपर à¤à¤•à¤Ÿà¤¾ पनà¥à¤¨à¤¾ अछि \"[[:\$1]]\" नामसà¤à¥¤'''",
'searchmenu-new' => "''' पनà¥à¤¨à¤¾ निरà¥à¤®à¤¾à¤£ \"[[:\$1]]\" ठविकीपर !'''",
-'searchhelp-url' => 'Help: विषय सूची',
'searchmenu-prefix' => '[[Special:PrefixIndex/$1|ठउपसरà¥à¤—क पनà¥à¤¨à¤¾ सभकेठदेखू]]',
'searchprofile-articles' => 'अनà¥à¤•à¥à¤°à¤® पनà¥à¤¨à¤¾ सभ',
'searchprofile-project' => 'सहायता आ परियोजना पनà¥à¤¨à¤¾ सभ',
@@ -1039,15 +1018,6 @@ $3 दà¥à¤µà¤¾à¤°à¤¾ देल कारण अछि ''$2''",
अहाà¤à¤• गूगलक माधà¥à¤¯à¤®à¤¸à¤ ठबीच ताकि सकै छी।
मोन राखू जे तकर विवरणी {{अनà¥à¤¤à¤°à¥à¤œà¤¾à¤²}} सामिगà¥à¤°à¥€ समयातीत भऽ सकैà¤à¥¤',
-# Quickbar
-'qbsettings' => 'तà¥à¤µà¤°à¤¿à¤¤ दृशà¥à¤¯',
-'qbsettings-none' => 'कोनो नै',
-'qbsettings-fixedleft' => 'वाम कात सटल',
-'qbsettings-fixedright' => 'दहिन दिस सटल',
-'qbsettings-floatingleft' => 'वाम कात घà¥à¤®à¥ˆà¤¤',
-'qbsettings-floatingright' => 'दहिन कात घà¥à¤®à¥ˆà¤¤',
-'qbsettings-directionality' => 'कीलित, अहाà¤à¤• भाषाक लिपि दिशा-निरà¥à¤¦à¥‡à¤¶à¤ªà¤° आधारित',
-
# Preferences page
'preferences' => 'विकलà¥à¤ª',
'mypreferences' => 'खासमखास',
@@ -1079,7 +1049,6 @@ $3 दà¥à¤µà¤¾à¤°à¤¾ देल कारण अछि ''$2''",
'resetprefs' => 'बिन सà¥à¤°à¤•à¥à¤·à¤¿à¤¤à¤•à¥‡à¤ हटाउ',
'restoreprefs' => 'सभटा पूरà¥à¤µà¤¨à¤¿à¤°à¥à¤§à¤¾à¤°à¤¿à¤¤ चयनकेठफेरसठआनू',
'prefs-editing' => 'समà¥à¤ªà¤¾à¤¦à¤¨ कऽ रहल छी',
-'prefs-edit-boxsize' => 'समà¥à¤ªà¤¾à¤¦à¤¨ खिड़कीक आकार',
'rows' => 'पाà¤à¤¤à¥€ सभ',
'columns' => 'सà¥à¤¤à¤®à¥à¤­ सभ',
'searchresultshead' => 'ताकू',
@@ -1090,9 +1059,6 @@ $3 दà¥à¤µà¤¾à¤°à¤¾ देल कारण अछि ''$2''",
'recentchangesdays-max' => 'बेसीसठबेसी $1 {{PLURAL:$1|दिन|दिन}}',
'recentchangescount' => 'पूरà¥à¤µà¤¨à¤¿à¤°à¥à¤§à¤¾à¤°à¤¿à¤¤ रूपेठà¤à¤¤à¥‡à¤• समà¥à¤ªà¤¾à¤¦à¤¨ देखाà¤à¤² गेल:',
'prefs-help-recentchangescount' => 'ठमे समà¥à¤®à¤¿à¤²à¤¿à¤¤ अछि आइ-कालà¥à¤¹à¤¿à¤• परिवरà¥à¤¤à¤¨, पनà¥à¤¨à¤¾à¤• इतिहास आ वृतà¥à¤¤à¤²à¥‡à¤–',
-'prefs-help-watchlist-token' => 'ठकà¥à¤·à¥‡à¤¤à¥à¤°à¤®à¥‡ à¤à¤•à¤Ÿà¤¾ गà¥à¤ªà¥à¤¤ चाभीसठभरलापर अहाà¤à¤• साकांकà¥à¤· सूची लेल à¤à¤•à¤Ÿà¤¾ आर.à¤à¤¸.à¤à¤¸.फीडक निरà¥à¤®à¤¾à¤£ हà¤à¤¤à¥¤
-जकरा लग ठकà¥à¤·à¥‡à¤¤à¥à¤°à¤• ई चाभी छै ओ अहाà¤à¤• साकांकà¥à¤· सूचीकेठपढ़ि सकता, से à¤à¤•à¤Ÿà¤¾ सà¥à¤°à¤•à¥à¤·à¤¿à¤¤ मान चà¥à¤¨à¥‚।
-à¤à¤¤à¤ à¤à¤•à¤Ÿà¤¾ अनियत रूपेठउतà¥à¤ªà¤¾à¤¦à¤¿à¤¤ मान अछि जकर अहाठपà¥à¤°à¤¯à¥‹à¤— कऽ सकै छी: $1',
'savedprefs' => 'अहाà¤à¤• पसिनà¥à¤¨ सà¥à¤°à¤•à¥à¤·à¤¿à¤¤ कà¤à¤² गेल',
'timezonelegend' => 'समय कà¥à¤·à¥‡à¤¤à¥à¤°',
'localtime' => 'सà¥à¤¥à¤¾à¤¨à¥€à¤¯ समà¤:',
@@ -1123,7 +1089,6 @@ $3 दà¥à¤µà¤¾à¤°à¤¾ देल कारण अछि ''$2''",
'prefs-reset-intro' => 'अहाठठपनà¥à¤¨à¤¾à¤• पà¥à¤°à¤¯à¥‹à¤— अपन विकलà¥à¤ªà¤•à¥‡à¤ पूरà¥à¤µà¤¨à¤¿à¤µà¤¿à¤·à¥à¤Ÿ रूपेठजाल पà¥à¤¨à¤°à¥à¤¨à¤¿à¤§à¤¾à¤°à¤¿à¤¤ करबा लेल कऽ सकै छी।
ई बदलल नै जा सकैà¤à¥¤',
'prefs-emailconfirm-label' => 'ई-पतà¥à¤° पà¥à¤·à¥à¤Ÿà¤¿:',
-'prefs-textboxsize' => 'समà¥à¤ªà¤¾à¤¦à¤¨ खिड़कीक आकार',
'youremail' => 'ई-पतà¥à¤°:',
'username' => 'पà¥à¤°à¤¯à¥‹à¤•à¥à¤¤à¤¾à¤¨à¤¾à¤®:',
'uid' => 'पà¥à¤°à¤¯à¥‹à¤•à¥à¤¤à¤¾à¤• पहिचान:',
@@ -1367,7 +1332,6 @@ $3 दà¥à¤µà¤¾à¤°à¤¾ देल कारण अछि ''$2''",
'recentchangeslinked-feed' => 'संबंधित परिवरà¥à¤¤à¥à¤¤à¤¨',
'recentchangeslinked-toolbox' => 'संबंधित परिवरà¥à¤¤à¥à¤¤à¤¨',
'recentchangeslinked-title' => '"$1" मे भेल परिवरà¥à¤¤à¤¨',
-'recentchangeslinked-noresult' => 'ठकालमे लागिबला पनà¥à¤¨à¤¾ सभमे कोनो परिवरà¥à¤¤à¤¨ नै भेल।',
'recentchangeslinked-summary' => "ई विशेष पनà¥à¤¨à¤¾à¤¸à¤ समà¥à¤¬à¤¦à¥à¤§ पनà¥à¤¨à¤¾ सभमे (आकि कोनो विशेष वरà¥à¤—क समूहमे) भेल परिवरà¥à¤¤à¤¨à¤• सूची छी ।
[[Special:Watchlist|your watchlist]] पर पनà¥à¤¨à¤¾à¤¸à¤­ '''गाढ़''' अछि।",
'recentchangeslinked-page' => 'पनà¥à¤¨à¤¾à¤• नाम',
@@ -1555,7 +1519,6 @@ $1',
'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>
@@ -1704,12 +1667,6 @@ $1',
'statistics-users-active-desc' => 'पà¥à¤°à¤¯à¥‹à¤•à¥à¤¤à¤¾ जे अनà¥à¤¤à¤¿à¤® {{PLURAL:$1|दिन|$1 दिन}} मे कोनो काज केने छथि',
'statistics-mostpopular' => 'सभसठबेसी देखल गेल पनà¥à¤¨à¤¾',
-'disambiguations' => 'सà¥à¤ªà¤·à¥à¤Ÿ पनà¥à¤¨à¤¾à¤¸à¤ लागिबला पनà¥à¤¨à¤¾',
-'disambiguationspage' => 'नमूना: निवारण',
-'disambiguations-text' => "ई सभ पनà¥à¤¨à¤¾ '''सà¥à¤ªà¤·à¥à¤Ÿ कà¤à¤²''' सठलागिमे अछि।
-ओ सभ à¤à¤•à¤° बदला उचित वारà¥à¤¤à¤¾à¤ªà¤° लागि करथि।<br />
-[[MediaWiki:Disambiguationspage]] सठलागिमे जठनमूनाक पà¥à¤°à¤¯à¥‹à¤— करैत अछि तखने ओ '''सà¥à¤ªà¤·à¥à¤Ÿ कà¤à¤²''' पनà¥à¤¨à¤¾ कहाà¤à¤¤à¥¤",
-
'doubleredirects' => 'दà¥à¤µà¤¿à¤¤à¥€à¤¯à¤• लागिबला बदलेन',
'doubleredirectstext' => 'ई पनà¥à¤¨à¤¾ ओइ पनà¥à¤¨à¤¾ सभक संकलन छी जे बदलेन करैठदोसर बदलेनबला पनà¥à¤¨à¤¾à¤¸à¤à¥¤
पà¥à¤°à¤¤à¥à¤¯à¥‡à¤• पाà¤à¤¤à¥€ पहिल आ दोसर बदलेनक लागि रखने अछि आ संगे दोसर बदलेनक लकà¥à¤·à¥à¤¯ सेहो, जे वासà¥à¤¤à¤µà¤®à¥‡ "वासà¥à¤¤à¤µ" लकà¥à¤·à¥à¤¯ पनà¥à¤¨à¤¾ अछि, जकरापर पहिल बदलेनकेठजेबाक चाही।
@@ -1944,10 +1901,9 @@ $1',
'unwatchthispage' => 'देखनाइ छोड़ू',
'notanarticle' => 'कोनो विषय सूची नै',
'notvisiblerev' => 'कोनो दोसर पà¥à¤°à¤¯à¥‹à¤•à¥à¤¤à¤¾ दà¥à¤µà¤¾à¤°à¤¾ कà¤à¤² अनà¥à¤¤à¤¿à¤® परिवरà¥à¤¤à¤¨ मेटा देल गेल',
-'watchnochange' => 'अहाà¤à¤• साकांकà¥à¤· सूचीमे सठकोनोमे ठअवधिमे समà¥à¤ªà¤¾à¤¦à¤¨ नै कà¤à¤² गेल।',
'watchlist-details' => '{{PLURAL:$1|$1 पनà¥à¤¨à¤¾|$1 पनà¥à¤¨à¤¾ सभ}} अहाà¤à¤• साकांकà¥à¤·à¤¸à¥‚चीमे, चौबटिया पनà¥à¤¨à¤¾ नै गानल गेल।',
-'wlheader-enotif' => '* ई-पतà¥à¤° सूचना लागू अछि।',
-'wlheader-showupdated' => "* पनà¥à¤¨à¤¾ सभ जे अहाà¤à¤• à¤à¤¤à¤ अनà¥à¤¤à¤¿à¤® बेर अà¤à¤²à¤¾à¤• बाद बदलल अछि तकर सूची देल अछि '''गाढ़''' मे",
+'wlheader-enotif' => 'ई-पतà¥à¤° सूचना लागू अछि।',
+'wlheader-showupdated' => "पनà¥à¤¨à¤¾ सभ जे अहाà¤à¤• à¤à¤¤à¤ अनà¥à¤¤à¤¿à¤® बेर अà¤à¤²à¤¾à¤• बाद बदलल अछि तकर सूची देल अछि '''गाढ़''' मे",
'watchmethod-recent' => 'साकांकà¥à¤· सूचीक हालक समà¥à¤ªà¤¾à¤¦à¤¨ जाà¤à¤šà¤¿ रहल छी',
'watchmethod-list' => 'साकांकà¥à¤·-सूचीक हालक समà¥à¤ªà¤¾à¤¦à¤¨à¤•à¥‡à¤ देखि रहल छी',
'watchlistcontains' => 'अहाà¤à¤• साकांकà¥à¤·-सूचीमे अछि $1 {{PLURAL:$1|पनà¥à¤¨à¤¾|पनà¥à¤¨à¤¾}}।',
@@ -2344,12 +2300,9 @@ $1 à¤à¤•à¤° पà¥à¤°à¤¤à¤¿à¤¬à¤¨à¥à¤§à¤• कारण अछि : "$2"',
ई, मà¥à¤¦à¤¾, कà¥à¤·à¥‡à¤¤à¥à¤° $2 क अनà¥à¤¦à¤° पà¥à¤°à¤¤à¤¿à¤¬à¤¨à¥à¤§à¤¿à¤¤ अछि, जे अपà¥à¤°à¤¤à¤¿à¤¬à¤¨à¥à¤§à¤¿à¤¤ कà¤à¤² जा सकैà¤à¥¤',
'ip_range_invalid' => 'अमानà¥à¤¯ अनिकेत कà¥à¤·à¥‡à¤¤à¥à¤°à¥¤',
'ip_range_toolarge' => 'समूह खणà¥à¤¡ पैघ अछि /$1 सभकेठअनà¥à¤®à¤¤à¤¿ नै छै।',
-'blockme' => 'हमरा पà¥à¤°à¤¤à¤¿à¤¬à¤¨à¥à¤§à¤¿à¤¤ करू',
'proxyblocker' => 'दोसराइत पà¥à¤°à¤¤à¤¿à¤¬à¤¨à¥à¤§à¤•',
-'proxyblocker-disabled' => 'ई पà¥à¤°à¤•à¤¾à¤°à¥à¤¯ पà¥à¤°à¤¤à¤¿à¤¬à¤¨à¥à¤§à¤¿à¤¤ अछि।',
'proxyblockreason' => 'अहाà¤à¤• अनिकेत पता पà¥à¤°à¤¤à¤¿à¤¬à¤¨à¥à¤§à¤¿à¤¤ भेल अछि कारण ई सोà¤à¥‡-सोठदोसराइत अछि।
अहाठअपन अनà¥à¤¤à¤°à¥à¤œà¤¾à¤² सेवा दाता वा तकनीकी सहायकसठसमà¥à¤ªà¤°à¥à¤• करू आ ठगमà¥à¤­à¥€à¤° सà¥à¤°à¤•à¥à¤·à¤¾ समसà¥à¤¯à¤¾à¤• सूचना दिअ।',
-'proxyblocksuccess' => 'भेल।',
'sorbsreason' => 'अहाà¤à¤• अनिकेत सूचित अछि सोà¤à¥‡-सोठदोसराइतक रूपमे {{जालसà¥à¤¥à¤²}} क डी.à¤à¤¨.à¤à¤¸.बी.à¤à¤².मे।',
'sorbs_create_account_reason' => 'अहाà¤à¤• अनिकेत à¤à¤¤à¤ सूचित अछि खà¥à¤œà¤² दोसराइत सन डी.à¤à¤¨.बी.à¤à¤¸.à¤à¤². मे जे पà¥à¤°à¤¯à¥‹à¤— कà¤à¤² जाइठ{{अनà¥à¤¤à¤°à¥à¤œà¤¾à¤²}} दà¥à¤µà¤¾à¤°à¤¾à¥¤',
'cant-block-while-blocked' => 'अहाठजाधरि सà¥à¤µà¤¯à¤‚ पà¥à¤°à¤¤à¤¿à¤¬à¤¨à¥à¤§à¤¿à¤¤ छी दोसराकेठपà¥à¤°à¤¤à¤¿à¤¬à¤¨à¥à¤§à¤¿à¤¤ नै कऽ सकै छी।',
@@ -2680,9 +2633,6 @@ $1 à¤à¤•à¤° पà¥à¤°à¤¤à¤¿à¤¬à¤¨à¥à¤§à¤• कारण अछि : "$2"',
'pageinfo-authors' => 'भिनà¥à¤¨ लेखक संखà¥à¤¯à¤¾',
# Skin names
-'skinname-standard' => 'पà¥à¤°à¤¾à¤šà¥€à¤¨',
-'skinname-nostalgia' => 'गामसठपà¥à¤°à¥‡à¤®',
-'skinname-simple' => 'साधारण',
'skinname-modern' => 'आधà¥à¤¨à¤¿à¤•',
'skinname-vector' => 'सदिश',
@@ -2805,7 +2755,7 @@ Variants for Chinese language
'metadata-langitem' => "'''$2:''' $1",
'metadata-langitem-default' => '$1',
-# EXIF tags
+# Exif tags
'exif-imagewidth' => 'चौड़ाई',
'exif-imagelength' => 'ऊà¤à¤š',
'exif-bitspersample' => 'पà¥à¤°à¤¤à¤¿ भाग अषà¥à¤Ÿà¤•',
@@ -2984,7 +2934,7 @@ Variants for Chinese language
'exif-originalimageheight' => 'काटहि सें पहिने तसà¥à¤µà¥€à¤°à¤• ऊà¤à¤šà¤¾à¤ˆ',
'exif-originalimagewidth' => 'काटहि सें पहिने तसà¥à¤µà¥€à¤°à¤• चौड़ाई',
-# EXIF attributes
+# Exif attributes
'exif-compression-1' => 'असमà¥à¤ªà¥€à¤¡à¤¿à¤¤',
'exif-compression-2' => 'सी.सी.आइ.टी.टी. वरà¥à¤— ३ १ - बीम संशोधित हफमैन कूट सोठलमà¥à¤¬à¤¾à¤‡',
'exif-compression-3' => 'सी.सी.आइ.टी.टी. वरà¥à¤— ३ फैकà¥à¤¸ संकूट',
@@ -3377,7 +3327,6 @@ $5
'version-other' => 'आन',
'version-mediahandlers' => 'मीडिया संचालक',
'version-hooks' => 'हूक',
-'version-extension-functions' => 'पà¥à¤°à¤•à¤¾à¤°à¥à¤¯ बढ़ाउ',
'version-parser-extensiontags' => 'विभाजन बढल चेनà¥à¤¹',
'version-parser-function-hooks' => 'विभाजक पà¥à¤°à¤•à¤¾à¤°à¥à¤¯ खà¥à¤Ÿà¥à¤Ÿà¥€',
'version-hook-name' => 'खà¥à¤Ÿà¥à¤Ÿà¥€à¤• नाम',
@@ -3395,13 +3344,6 @@ $5
'version-software-product' => 'उतà¥à¤ªà¤¾à¤¦',
'version-software-version' => 'संसà¥à¤•à¤°à¤£',
-# Special:FilePath
-'filepath' => 'संचिकाक रसà¥à¤¤à¤¾',
-'filepath-page' => 'संचिका',
-'filepath-submit' => 'जाऊ',
-'filepath-summary' => 'ई विशेष पनà¥à¤¨à¤¾ संचिकाक पूरà¥à¤£ रसà¥à¤¤à¤¾ देखबैत अछि।
-चितà¥à¤° सभ पूरà¥à¤£ आकारमे देखाà¤à¤² जाइत अछि, दोसर संचिका पà¥à¤°à¤•à¤¾à¤° चालित होइठसोà¤à¥‡ समà¥à¤¬à¤¨à¥à¤§à¤¿à¤¤ संविधि दà¥à¤µà¤¾à¤°à¤¾à¥¤',
-
# Special:FileDuplicateSearch
'fileduplicatesearch' => 'दà¥à¤µà¤¿à¤¤à¥€à¤¯à¤• संचिका ताकू',
'fileduplicatesearch-summary' => 'हैश मानक आधारपर दà¥à¤µà¤¿à¤¤à¥€à¤¯à¤• संचिका ताकू।',
diff --git a/languages/messages/MessagesMap_bms.php b/languages/messages/MessagesMap_bms.php
index 57216cea..d128bd8c 100644
--- a/languages/messages/MessagesMap_bms.php
+++ b/languages/messages/MessagesMap_bms.php
@@ -46,9 +46,6 @@ $messages = array(
'tog-shownumberswatching' => 'Tidhokna jumlah pangawas',
'tog-oldsig' => 'Tapak asma sekiye:',
'tog-fancysig' => 'Tapak asma dianggep dadi teks wiki (ora nganggo pranala otomatis)',
-'tog-externaleditor' => 'Gunakna editor eksternal sekang gawan (kanggo sing ahli thok, merlokna setelan kusus neng komputeré rika. [//www.mediawiki.org/wiki/Manual:External_editors Informasi selengkapé.])',
-'tog-externaldiff' => 'Gunakna diff eksternal sekang gawan (kanggo sing ahli thok, merlokna setèlan kusus nang komputeré rika. [//www.mediawiki.org/wiki/Manual:External_editors Informasi selengkapé.])',
-'tog-showjumplinks' => 'Aktifna pranala pitulung "mlumpat maring"',
'tog-uselivepreview' => 'Gunakna pratayang langsung (mbutuhna JavaScript) (egin jajalan)',
'tog-forceeditsummary' => 'Emutna inyong anggere durung ngisi kotak ringkesan suntingan',
'tog-watchlisthideown' => 'Umpetna suntingane inyong sekang daftar pangawasan',
@@ -61,6 +58,7 @@ $messages = array(
'tog-diffonly' => 'Aja tidokna isi kaca nang ngisor bedane suntingan',
'tog-showhiddencats' => 'Tidokna kategori sing diumpetna',
'tog-norollbackdiff' => 'Lirwakna perbedaan seuwise nglakokna pambalikan',
+'tog-prefershttps' => 'Gunakna koneksi aman terus angger mlebu log',
'underline-always' => 'Saben',
'underline-never' => 'Ora tau',
@@ -124,6 +122,18 @@ $messages = array(
'oct' => 'Okt',
'nov' => 'Nov',
'dec' => 'Des',
+'january-date' => ' $1 Januari',
+'february-date' => ' $1 Februari',
+'march-date' => ' $1 Maret',
+'april-date' => ' $1 April',
+'may-date' => '$1 Mei',
+'june-date' => ' $1 Juni',
+'july-date' => ' $1 Juli',
+'august-date' => ' $1 Agustus',
+'september-date' => '$1 September',
+'october-date' => ' $1 Oktober',
+'november-date' => '$1 November',
+'december-date' => '$1 Desember',
# Categories related messages
'pagecategories' => '{{PLURAL:$1|Kategori|Kategori}}',
@@ -205,6 +215,7 @@ $messages = array(
'create-this-page' => 'Gawe kaca kiye',
'delete' => 'Busek',
'deletethispage' => 'Busak kaca kiye',
+'undeletethispage' => 'Batalna pembusekan kaca kiye',
'undelete_short' => 'Batalna pambusakan $1 {{PLURAL:$1|suntingan|suntingan}}',
'viewdeleted_short' => 'Deleng {{PLURAL:$1|siji suntingan|$1 suntingan}} sing wis dibusak',
'protect' => 'Direksa',
@@ -248,7 +259,7 @@ $1',
'pool-queuefull' => 'Kumpulan antriane kebak',
'pool-errorunknown' => 'Kesalahan sing ora dingerteni sebabe',
-# 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).
+# 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).
'aboutsite' => 'Prakara {{SITENAME}}',
'aboutpage' => 'Project:Prakara',
'copyright' => 'Kabeh teks ana miturut $1.',
@@ -258,7 +269,6 @@ $1',
'disclaimers' => 'Pamaidonan',
'disclaimerpage' => 'Project:Panyangkalan umum',
'edithelp' => 'Pitulung panyuntingan',
-'edithelppage' => 'Help:Panyuntingan',
'helppage' => 'Help:Isi',
'mainpage' => 'Kaca Utama',
'mainpage-description' => 'Kaca Utama',
@@ -336,17 +346,6 @@ Daftar kaca astamiwa sing sah teyeng dideleng nang [[Special:SpecialPages|{{int:
# General errors
'error' => 'Kasalahan',
'databaseerror' => 'Kasalahan basis data',
-'dberrortext' => 'Ana kesalahan sintaks nang penjalukan basis data.
-Kesalahan kiye ndeyan nandakna nek ana \'\'bug\'\' nang piranti alus.
-Penjalukan basis data sing pungkasan yakuwe:
-<blockquote><code>$1</code></blockquote>
-sekang jerone fungsi "<code>$2</code>".
-Basis data ngasilna kesalahan "<samp>$3: $4</samp>".',
-'dberrortextcl' => 'Ana kesalahan sintaks nang penjalukan basis data.
-Penjalukan basis data sing pungkasan yakuwe:
-"$1"
-sekang jroning fungsi "$2".
-Basis data ngasilna kasalahan "$3: $4"',
'laggedslavemode' => "'''Pènget:''' Kaca kiye mbokmenawa isiné dudu pangowahan pungkasan.",
'readonly' => 'Basis data dikunci',
'enterlockreason' => 'Lebokna alesan panguncèn, kalebu uga prakiran kapan kunci bakal dibuka',
@@ -382,6 +381,7 @@ Kiye ndeyane anu wis dibusek nang wong sejen.',
'cannotdelete-title' => 'Ora teyeng mbusek kaca "$1".',
'delete-hook-aborted' => 'Pembusekan dibatalna neng kait parser.
Kuwe ora ana alesane.',
+'no-null-revision' => 'Ora teyeng nggawe versi null anyar kanggo kaca "$1"',
'badtitle' => 'Judul ora sah',
'badtitletext' => 'Judul kaca sing dijaluk ora sah, kosong, utawa salah nyambungna judul antar-basa utawa antarwiki.
Kiya ndeyane ana siji utawa lewih karakter sing ora teyeng digunakna nang judul.',
@@ -405,12 +405,15 @@ Kanggo nambaih utawa ngowaih terjemahan nang kabeh wiki, monggo gunakna [//trans
'editinginterface' => "'''Pènget:''' Rika nyunting kaca sing dienggo nyedyakna tèks antarmuka kanggo piranti alus.
Pangowahan kaca kiye bakal awèh pangaruh maring tampilan antarmuka panganggo duweke panganggo sejen nang wiki kiye.
Angger arep nambaih utawa ngowaih terjemahan, monggo gunakna [//translatewiki.net/translatewiki.net], proyèk lokalisasi MediaWiki.",
-'sqlhidden' => '(Penjalukan SQL diumpetna)',
'cascadeprotected' => 'Kaca kiye wis direksa sekang penyuntingan jalaran melu mlebu nang {{PLURAL:$1|kaca|kaca-kaca}} nang ngisor kiye sing wis direksa nganggo opsi "runtun":
$2',
'namespaceprotected' => "Rika ora duwe hak akses kanggo nyunting kaca nang bilik jeneng '''$1'''.",
'customcssprotected' => 'Rika ora duwe izin nggo nyunting kaca CSS kiye, jalaran isine pengaturan pribadine panganggo sejen.',
'customjsprotected' => 'Rika ora duwe izin nggo nyunting kaca JavaScript kiye, jalaran isine pengaturan pribadine panganggo sejen.',
+'mycustomcssprotected' => 'Rika ora duwe hak akses kanggo ngowaih kaca CSS kiye.',
+'mycustomjsprotected' => 'Rika ora duwe idin kanggo ngowaih kaca JavaScript kiye.',
+'myprivateinfoprotected' => 'Rika ora duwe idin kanggo ngowaih informasi pribadine Rika.',
+'mypreferencesprotected' => 'Rika ora duwe idin kanggo ngowaih preferensine rika.',
'ns-specialprotected' => 'Kaca astaiwa ora teyeng disunting.',
'titleprotected' => 'Judul kiye wis direksa ora olih digawe nang [[User:$1|$1]].
Alesane yakuwe "\'\'$2\'\'".',
@@ -433,10 +436,19 @@ Digatekna ya, cokan ana kaca sing esih terus nidokna nek rika esih mlebu log nga
'welcomecreation-msg' => 'Akune Rika uwis digawe.
Aja kelalen ngowaih [[Special:Preferences|preferensi {{SITENAME}}]] Rika.',
'yourname' => 'Jeneng panganggo:',
+'userlogin-yourname' => 'Jenengpanganggo',
+'userlogin-yourname-ph' => 'Lebokna jenengpanganggone Rika',
+'createacct-another-username-ph' => 'Lebokna jeneng panganggo',
'yourpassword' => 'Tembung sandhi:',
+'userlogin-yourpassword' => 'Tembung sandhi',
+'userlogin-yourpassword-ph' => 'Lebokna tembung sandhine Rika',
+'createacct-yourpassword-ph' => 'Lebokna tembung sandhi',
'yourpasswordagain' => 'Balèni tembung sandhi:',
+'createacct-yourpasswordagain' => 'Konfirmasi tembung sandhi',
+'createacct-yourpasswordagain-ph' => 'Lebokna tembung sandhi maning',
'remembermypassword' => 'Emutna data login-ne inyong nang peramban kiye (kanggo paling suwe $1 {{PLURAL:$1|dina|dina}})',
-'securelogin-stick-https' => 'Tetep kahubung maring HTTPS seuwise mlebu log',
+'userlogin-remembermypassword' => 'Jorna ben Inyong tetep mlebu log',
+'userlogin-signwithsecure' => 'Gunakna koneksi aman',
'yourdomainname' => 'Domain Rika:',
'password-change-forbidden' => 'Rika ora teyeng ngowaih tembung sandhi nang wiki kiye.',
'externaldberror' => 'Ana kesalahan otentikasi basis data utawa Rika ora olih nglakokna pemutakhiran maring akun eksternale Rika.',
@@ -448,18 +460,41 @@ Aja kelalen ngowaih [[Special:Preferences|preferensi {{SITENAME}}]] Rika.',
'logout' => 'Metu Log',
'userlogout' => 'Metu Log',
'notloggedin' => 'Durung mlebu log',
+'userlogin-noaccount' => 'Durung duwe akun?',
+'userlogin-joinproject' => 'Melu {{SITENAME}}',
'nologin' => 'Durung duwe akun? $1.',
'nologinlink' => 'Gawe akun anyar',
'createaccount' => 'Gawe akun anyar',
'gotaccount' => 'Wis duwe akun? $1.',
'gotaccountlink' => 'Mlebu log',
'userlogin-resetlink' => 'Apa Rika kelalen info detil nggo mlebune?',
+'userlogin-resetpassword-link' => 'Setel maning tembung sandhine Rika',
+'helplogin-url' => 'Pitulung:Mlebu log',
+'userlogin-helplink' => '[[{{MediaWiki:helplogin-url}}|Pitulung mlebu log]]',
+'createacct-join' => 'Lebokna informasine Rika nang ngisor kiye.',
+'createacct-another-join' => 'Lebokna informasi akun anyar nang ngisor kiye.',
+'createacct-emailrequired' => 'Alamat imel',
+'createacct-emailoptional' => 'Alamat imel (ora kudu)',
+'createacct-email-ph' => 'Lebokna alamat imele Rika',
+'createacct-another-email-ph' => 'Lebokna alamat imel',
'createaccountmail' => 'Gunakna tembung sandhi acak sementara lan kirimna maring alamat imel',
+'createacct-realname' => 'Jeneng asli (ora kudu)',
'createaccountreason' => 'Alesan:',
+'createacct-reason' => 'Alesan',
+'createacct-reason-ph' => 'Kenangapa Rika nggawe akun sejen',
+'createacct-captcha' => 'Priksa keamanan',
+'createacct-imgcaptcha-ph' => 'Lebokna teks sing keton nang dhuwur',
+'createacct-submit' => 'Gawe akune Rika',
+'createacct-another-submit' => 'Gawe akun liyane',
+'createacct-benefit-heading' => '{{SITENAME}} kuwe digawe nang wong kaya Rika.',
+'createacct-benefit-body1' => '{{PLURAL:$1|suntingan|suntingan}}',
+'createacct-benefit-body2' => '{{PLURAL:$1|kaca|kaca}}',
+'createacct-benefit-body3' => '{{PLURAL:$1|kontributor|kontributor}} anyaran',
'badretype' => 'Tembung sandhi sing Rika lebokna ora gathuk.',
'userexists' => 'Jeneng panganggo sing dilebokna uwis ana sing nganggo.
Monggo pilih jeneng liyane.',
'loginerror' => 'Kasalahan mlebu log',
+'createacct-error' => 'Gole gawe akun gagal',
'createaccounterror' => 'Ora teyeng gawe akun:$1',
'nocookiesnew' => "Akunpanganggo wis digawe, tapi Rika durung mlebu log.
{{SITENAME}} nggunakna ''cookies'' kanggo log panganggo.
@@ -528,10 +563,12 @@ Rika mendingan mlebu log disit lan ganti tembung sandine sekiye.
Rika teyeng nglirwakna pesen kiye anggere akun kiye kuwe jebule anu salah gawe.',
'usernamehasherror' => 'Jeneng panganggo ora teyeng nganggo tanda pager',
'login-throttled' => 'Rika wis kakehan gole njajal mlebu log.
-Tulung ngenteni sedela sedurunge njajal maning.',
+Tulung ngenteni $1 sedurunge njajal maning.',
'login-abort-generic' => 'Proses mlebu log Rika ora gagal - Dibatalna',
'loginlanguagelabel' => 'Basa: $1',
'suspicious-userlogout' => "Panjalukan Rika nggo metu log ditolak jalarak ketone dikirim nang panjlajah sing rusak utawa proksi panyinggah (''caching proxy'').",
+'createacct-another-realname-tip' => "'''Jeneng asli''' kuwe ora kudu.
+Angger Rika milih arep ngaweh, kiye bakal digunakna nggo aweh atribut maring kasil kerjaane Rika.",
# Email sending
'php-mail-error-unknown' => 'Kasalahan sing ora genah nang fungsi mail() PHP.',
@@ -547,8 +584,7 @@ Nggo nerusna, Rika kudu nglebokna tembung sandhi anyar nang kene:',
'newpassword' => 'Tembung sandi anyar:',
'retypenew' => 'Ketik maning tembung sandhi:',
'resetpass_submit' => 'Nata tembung sandhi lan mlebu log',
-'resetpass_success' => 'Tembung sandhi Rika wis sukses diowahi!
-Sekiye mroses Rika mlebu log...',
+'changepassword-success' => 'Tembung sandhi Rika wis sukses diowahi!',
'resetpass_forbidden' => 'Tembung sandhi ora teyeng diganti',
'resetpass-no-info' => 'Rika kudu mlebu log kanggo ngakses kaca kiye sacara langsung.',
'resetpass-submit-loggedin' => 'Ganti tembung sandhi',
@@ -560,10 +596,11 @@ Rika ndeyan uwis kasil ngganti tembung sandhine Rika utawa wis njaluk tembung s
# Special:PasswordReset
'passwordreset' => "Tembung sandhi di-''reset''",
-'passwordreset-text' => 'Lengkapi formulir kiye ben nampa imel ngelingna detil akune Rika.',
+'passwordreset-text-one' => 'Kumpliti formulir kiye kanggo nyetel maning tembung sandhine Rika.',
+'passwordreset-text-many' => '{{PLURAL:$1|Isi salah siji kotak kanggo nyetel maning tembung sandhine Rika.}}',
'passwordreset-legend' => "Tembung sandhi di-''reset''",
'passwordreset-disabled' => "''Reset'' tembung sandhi wis dipateni nang wiki kiye.",
-'passwordreset-pretext' => '{{PLURAL:$1||Lebokna salah siji data nang ngisor kiye}}',
+'passwordreset-emaildisabled' => 'Fitur imel wis dinonaktifna nang wiki kiye.',
'passwordreset-username' => 'Jeneng panganggo:',
'passwordreset-domain' => 'Domain:',
'passwordreset-capture' => 'Deleng imel hasile?',
@@ -574,7 +611,7 @@ Rika ndeyan uwis kasil ngganti tembung sandhine Rika utawa wis njaluk tembung s
Tembung sandhi sauntara: $2',
'passwordreset-emailsent' => 'Imel nggo nyetel maning tembung sandhi uwis dikirim.',
'passwordreset-emailsent-capture' => 'Imel kanggo nyetel maning tembung sandhi uwis dikirim, kaya sing ditidokna nang ngisor kiye.',
-'passwordreset-emailerror-capture' => 'Imel nggo ngelingna uwis digawe, kaya sing ditidokna nang ngisor kiye, ningen ora teyeng dikirim maring panganggo: $1',
+'passwordreset-emailerror-capture' => 'Imel nggo nyetel maning tembung sandhi uwis digawe, kaya sing ditidokna nang ngisor kiye, ningen gole ngirim maring {{GENDER:$2|panganggo}} ora teyeng: $1',
# Special:ChangeEmail
'changeemail' => 'Ganti alamat imel',
@@ -588,6 +625,13 @@ Tembung sandhi sauntara: $2',
'changeemail-submit' => 'Ganti imel',
'changeemail-cancel' => 'Ora sida',
+# Special:ResetTokens
+'resettokens-no-tokens' => 'Ora ana token sing arep disetel maning.',
+'resettokens-legend' => 'Nyetel maning token',
+'resettokens-token-label' => '$1 (biji sekiye:$2)',
+'resettokens-done' => 'Token wis disetel maning.',
+'resettokens-resetbutton' => 'Nyetel maning token sing dipilih',
+
# Edit page toolbar
'bold_sample' => 'Tèks kiye bakal dicithak kandel',
'bold_tip' => 'Cithak kandel',
@@ -886,7 +930,6 @@ Gatèkna, angger nganggo pranala navigasi kuwe bakalan nge-reset kolom kiye.',
'searchmenu-legend' => 'Pilihan panggoletan',
'searchmenu-exists' => "''' Ana kaca nganggo jeneng \"[[:\$1]]\" nang wiki kiye.'''",
'searchmenu-new' => "'''Gawe kaca \"[[:\$1]]\" nang wiki kiye!'''",
-'searchhelp-url' => 'Help:Isi',
'searchmenu-prefix' => '[[Special:PrefixIndex/$1|Deleng daftar kaca sing nganggo tembung-wiwitan kiye]]',
'searchprofile-articles' => 'Isine kaca',
'searchprofile-project' => 'Kaca pitulung lan proyèk',
@@ -931,15 +974,6 @@ Jajal aweh awalan ''all:'' kanggo nggolèti kabèh isi (kalebu kaca dhiskusi, ci
Rika teyeng nggoleti nganggo Google disit.
Ningen Rika kudu eling nek indeks Google kanggo {{SITENAME}} bisa baen isine anu sing lawas lan durung dianyari.',
-# Quickbar
-'qbsettings' => 'Pangaturan bar pintas',
-'qbsettings-none' => 'Ora ana',
-'qbsettings-fixedleft' => 'Tetep sisih kiwa',
-'qbsettings-fixedright' => 'Tetep sisih tengen',
-'qbsettings-floatingleft' => 'Ngambang sisih kiwa',
-'qbsettings-floatingright' => 'Ngambang sisih tengen',
-'qbsettings-directionality' => 'Tetep, ngetutna maring bentuk skrip sekang basane Rika',
-
# Preferences page
'preferences' => 'Preferensi',
'mypreferences' => 'Preferensi',
@@ -971,7 +1005,6 @@ Ningen Rika kudu eling nek indeks Google kanggo {{SITENAME}} bisa baen isine anu
'resetprefs' => 'Bersihna owah-owahan sing ora disimpen',
'restoreprefs' => 'Balekna kabeh setelan gawane',
'prefs-editing' => 'Panyuntingan',
-'prefs-edit-boxsize' => 'Ukuran kotak panyuntingan.',
'rows' => 'Baris:',
'searchresultshead' => 'Goleti',
'resultsperpage' => 'Hasil saben kaca:',
@@ -981,9 +1014,6 @@ Ningen Rika kudu eling nek indeks Google kanggo {{SITENAME}} bisa baen isine anu
'recentchangesdays-max' => 'Maksimum $1 {{PLURAL:$1|dina|dina}}',
'recentchangescount' => 'Standar jumlah suntingan sing ditampilna:',
'prefs-help-recentchangescount' => 'Kiye klebu owahan anyar, sajarah kaca, lan log.',
-'prefs-help-watchlist-token' => 'Ngisi kotak kiye ngannggo tembung wadi (PIN) bakal ngasilna sindikasi RSS kanggo daftar pantauane Rika.
-Sapa baen sing weruh PIN kiye bakal teyeng maca daftar pantauane Rika, mulane kuwe pilih sing aman.
-Kiye PIN acak sing teyeng digunakna Rika: $1',
'savedprefs' => 'Preferensine Rika wis disimpen.',
'timezonelegend' => 'Zona wektu:',
'localtime' => 'Wektu lokal:',
@@ -1014,7 +1044,6 @@ Kiye PIN acak sing teyeng digunakna Rika: $1',
'prefs-reset-intro' => 'Rika teyeng nggunakna kaca kiye nggo mbalekna preferensi-ne Rika balik maring setelan baku situs.
Pambalikan kiye ora teyeng dibatalna.',
'prefs-emailconfirm-label' => 'Konfirmasi imel:',
-'prefs-textboxsize' => 'Ukuran kotak suntingan',
'youremail' => 'Imel:',
'username' => 'Jeneng panganggo:',
'uid' => 'ID panganggo:',
@@ -1237,7 +1266,6 @@ Aja kuatir, alamat imele Rika ora ditidokna dong pangganggo sejen ngontak Rika.'
'recentchangeslinked-feed' => 'Pengobahan terkait',
'recentchangeslinked-toolbox' => 'Pengobahan terkait',
'recentchangeslinked-title' => 'Owah-owahan sing ana gandhèngané karo "$1"',
-'recentchangeslinked-noresult' => 'Ora ana owah-owahan nang kaca-kaca kagandhèng kiye salawasé periode sing wis ditemtokaké.',
'recentchangeslinked-summary' => "Kaca astamiwa kiye isine daftar owahan anyar sekang kaca-kaca sing kagandheng karo kaca terkait (utawa anggota sawijining kategori) .
Kaca-kaca sing mlebu [[Special:Watchlist|pangawasane Rika]] ditandani ''kandel''.",
'recentchangeslinked-page' => 'Jeneng kaca:',
@@ -1344,13 +1372,6 @@ Deskripsi sekang [$2 kaca deskripsine] ditidokna nang ngisor kiye.',
'statistics-users-active-desc' => 'Panganggo sing nglakokna aktivitas nang {{PLURAL:$1|dina|$1 dina}} pungkasan',
'statistics-mostpopular' => 'Kaca sing paling akèh dideleng',
-'disambiguations' => 'Kaca sing nggandeng maring kaca disambiguasi',
-'disambiguationspage' => 'Template:Disambig',
-'disambiguations-text' => "Kaca-kaca kiye nduwe pranala maring '''kaca disambiguasi'''.
-Kaca-kaca kuwe kudune nggandeng maring topik sing bener/pas.<br />
-Sawijining kaca bakal dianggep dadi kaca disambiguasi angger nggunakna cithakan sing nggandeng maring
-[[MediaWiki:Disambiguationspage]]",
-
'doubleredirects' => 'Pangalihan dobel',
'doubleredirectstext' => 'Kaca kiye muat daftar kaca sing dialihna maring kaca pangalihan liyane.
Saben barise nduwe pranala maring pangalihan pertama lan kepindho, lan tujuan sekang pengalihan kepindho sing biasane kuwe kaca tujuan sing "sebenere", sing kudune dadi tujuane kaca pangalihan pertama.
@@ -1776,7 +1797,7 @@ Sing liyane bakal diumpetna sacara ''default''.
* gpslongitude
* gpsaltitude",
-# EXIF tags
+# Exif tags
'exif-lightsource' => 'Sumber cahya',
'exif-meteringmode-6' => 'Sebagiyan',
@@ -1815,9 +1836,6 @@ Sing liyane bakal diumpetna sacara ''default''.
# Core parser functions
'duplicate-defaultsort' => "'''Pènget:''' Kunci baku sing nggo ngurutna (''Default sort key'') yakuwe \"\$2\" wis nggantèkna kunci baku sing nggo ngurutna sedurungé \"\$1\".",
-# Special:FilePath
-'filepath-submit' => 'Golèti',
-
# Special:SpecialPages
'specialpages' => 'Kaca-kaca khusus',
diff --git a/languages/messages/MessagesMdf.php b/languages/messages/MessagesMdf.php
index e96b2558..746a2e1f 100644
--- a/languages/messages/MessagesMdf.php
+++ b/languages/messages/MessagesMdf.php
@@ -173,9 +173,6 @@ $messages = array(
'tog-shownumberswatching' => 'ÐÑÑ„Ñ‚ÐµÐ¼Ñ Ð¼ÑŠÐ·Ñра ÑувÑида конат арафтозь лопать ÑÑÑŒ мельгеваномазоÑÑ‚',
'tog-oldsig' => 'ÐфкукÑонь кÑдьтÑшкÑ',
'tog-fancysig' => 'КÑдьтÑшкÑÑ‚ улихть викитекÑÑ‚Ð¾ÐºÑ (ÑÑлек тиеви ÑюлмафкÑфтома)',
-'tog-externaleditor' => 'ÐÐ¾Ð»Ð´Ð°Ð¼Ñ Ñ‚ÐµÐ²Ñ ÑƒÑˆÐµÑˆÐ¸Ñ€ÐµÐ½ÑŒ петнить мъзÑÑ€Ñ Ð¸Ð»ÑÐºÑ Ð¸Ð·ÑŒ мÑрьгов (аньцек тевонь Ñодайхненди, ÑÑÑ Ð¼ÐµÑ ÑÑ€Ñвихть башка кÑдьёнкÑÑ‚-арафнемат Ñодама машинаÑа [//www.mediawiki.org/wiki/Manual:External_editors ÑÑда тов.])',
-'tog-externaldiff' => 'ÐÐ¾Ð»Ð´Ð°Ð¼Ñ Ñ‚ÐµÐ²Ñ ÑƒÑˆÐµÑˆÐ¸Ñ€ÐµÐ½ÑŒ програм верзиень вакÑÑ Ð¿ÑƒÑ‚Ð¾Ð¼Ð°Ð½ÐºÑа мъзÑÑ€Ñ Ð¸Ð»ÑÐºÑ Ð¸Ð·ÑŒ мÑрьгов (аньцек тевонь Ñодайхненди, ÑÑÑ Ð¼ÐµÑ ÑÑ€Ñвихть башка кÑдьёнкÑÑ‚-арафнемат Ñодама машинаÑа[//www.mediawiki.org/wiki/Manual:External_editors ÑÑда тов.])',
-'tog-showjumplinks' => 'ÐœÑÑ€ÑŒÐ³Ð¾Ð¼Ñ "юпадемÑ" Ñатовома ÑюлмафкÑтненди',
'tog-uselivepreview' => 'МакÑÐ¾Ð¼Ñ ÑÑ€Ñй ваÑень нÑфтемаÑÑŒ (JavaScript) (Варжамань)',
'tog-forceeditsummary' => 'ÐÑÑ„Ñ‚ÐµÐ¼Ñ Ð¼Ð¾Ð½Ð´Ð¸Ð½Ðµ мезе ÑÑ‘Ñ€Ð¼Ð°Ð´Ð¾Ð¼Ñ ÑˆÐ°Ð²Ð° петнема Ð²Ð°Ð»ÑŒÐ¼Ð°Ñ ÑувамÑта',
'tog-watchlisthideown' => 'КÑÑˆÐµÐ¼Ñ Ð¼Ð¾Ð½ÑŒ петнематне ванома лопаÑта',
@@ -372,7 +369,7 @@ $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).
+# 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).
'aboutsite' => '{{SITENAME}} колга',
'aboutpage' => 'Project:Колга',
'copyright' => 'СёрматфÑÑŒ ули кода Ð¼ÑƒÐ¼Ñ $1-Ñа.',
@@ -382,7 +379,6 @@ $1',
'disclaimers' => 'Видешинь корхтаматне',
'disclaimerpage' => 'Project:ÐŸÑ€Ñ Ð²Ð¸Ð´ÐµÑˆÐ¸Ð½ÑŒ корхнема',
'edithelp' => 'Петнемань лезкÑ',
-'edithelppage' => 'Help:Петнема',
'helppage' => 'Help:Лопань потмоц',
'mainpage' => 'ÐŸÑ€Ñ Ð»Ð¾Ð¿Ð°',
'mainpage-description' => 'ÐŸÑ€Ñ Ð»Ð¾Ð¿Ð°',
@@ -459,17 +455,6 @@ $1',
# General errors
'error' => 'ЭльбÑтькÑ',
'databaseerror' => 'Датабаза ÑльбÑтькÑ',
-'dberrortext' => 'Содамошинь паргань вешендембачк лиÑÑÑŒ ÑинтакÑонь ÑльбÑтькÑ.
-ТÑ, улема, програмгÑрькÑонь Ñи.
-Мекольце Ñодамошинь паргань вешема:
-<blockquote><code>$1</code></blockquote>
-функциеÑта "<code>$2</code>".
-Содамошинь паргаÑÑŒ пачфтеÑÑŒ ÑльбÑÑ‚ÑŒÐºÑ "<samp>$3: $4</samp>".',
-'dberrortextcl' => 'Датабазонь вешендембачк лиÑÑÑŒ ÑÐ¸Ð½Ñ‚Ð°ÐºÑ ÑльбÑтькÑ.
-Мекольце датабазонь вешендема ульÑÑŒ:
-"$1"
-функциеÑта "$2".
-ДатабазаÑÑŒ мърдафтозе ÑльбÑтькÑÑ‚ÑŒ "$3: $4"',
'laggedslavemode' => 'Шарфтк мÑльце: Ð¢Ñ Ð»Ð¾Ð¿Ð°ÑÑŒ, улема, ÑирелгодÑÑŒ.',
'readonly' => 'ДатабазаÑÑŒ пÑкÑтаф',
'enterlockreason' => 'Сёрматк Ñ‚Ñзк пÑкÑтама туфтал тонь арьÑемацень мархта Ñли нÑÑ„Ñ‚Ñ‚ÑŒ Ñ‚ÑÑа мъзÑрда ули кода пÑкÑтамать валхтомÑ.',
@@ -521,7 +506,6 @@ $1',
'protectedinterface' => 'Ð¢Ñ Ð»Ð¾Ð¿Ð°Ñ‚ÑŒ ÑÑа Ð¸Ð½Ñ‚ÐµÑ€Ñ„ÐµÐ¹Ñ Ñ‚ÐµÐºÑÑ‚ÑÑŒ Ñ‚Ñ Ð²Ð¸ÐºÐ¸Ñ‚ÑŒ програмгÑркÑти, Ñон аралаф кальдÑв тиемада.
Вики ётафтоматнень поладоманди полафнемандивок Ñувак [//translatewiki.net/ translatewiki.net], MediaWiki локализациень проектти.',
'editinginterface' => "'''Инголи кардама:''' Тон петнеÑак лопать конань ÑÑа ащи Ð¸Ð½Ñ‚ÐµÑ€Ñ„ÐµÐ¹Ñ Ñ‚ÐµÐºÑÑ‚ програмкÑрькÑонди. Петнематне полафтÑазь Ñонь ванфоц, кода Ñон нÑеви Ð¸Ð»Ñ Ñ‚Ð¸Ð¸Ñ…Ð½ÐµÐ½Ð´Ð¸. Вики ётафтоматнень поладоманди, полафтомандивок Ñувак [//translatewiki.net/ translatewiki.net] MediaWiki локализациень проектти.",
-'sqlhidden' => '(SQL Ð²ÐµÑˆÑ„ÐºÑ ÐºÑшф)',
'cascadeprotected' => 'Ð¢Ñ Ð»Ð¾Ð¿Ð°Ñ‚ÑŒ аралазь петнемада ÑÑÑ Ð¼ÐµÑ Ñон Ñувафни {{PLURAL:$1|Ñай лопаÑ, кона путфоль|Ñай лопаÑ, конат путфольхть}} каÑкад араламаÑ:
$2',
'namespaceprotected' => "Тондейть аф мÑрьгови Ð¿ÐµÑ‚Ð½ÐµÐ¼Ñ Ð»Ð¾Ð¿Ð°Ñ‚Ð½Ðµ '''$1''' лепнень мархта.",
@@ -552,7 +536,6 @@ $2',
'yourpassword' => 'Сувама валце:',
'yourpasswordagain' => 'Сёрматк Ñувама валце омбоцекÑ:',
'remembermypassword' => 'Ð’Ð°Ð½Ñ„Ñ‚Ð¾Ð¼Ñ Ð¼Ð¾Ð½ÑŒ Ñувама лемозе Ñ‚Ñ Ñодам машинаÑа (макÑимум $1 {{PLURAL:$1|шиÑ|шиÑ}})',
-'securelogin-stick-https' => 'ÐšÐ°Ð´Ð¾Ð²Ð¾Ð¼Ñ ÑÐ¾Ñ‚Ñ„Ð¾ÐºÑ HTTPS вельде Ñувамада меле',
'yourdomainname' => 'Тонь доменце:',
'password-change-forbidden' => 'Сувама валхне Ñ‚Ñ Ð²Ð¸ÐºÐ¸Ñ‚ÑŒ ÑÑа аф полафтовихть',
'externaldberror' => 'ЛиÑÑÑŒ ÑльбÑÑ‚ÑŒÐºÑ ÑƒÑˆÐµÑˆÐ¸Ñ€ÐµÐ½ÑŒ датабазонь вельде кемокÑтакшнембачк Ñли тондейть аф мÑрьгови Ð¿Ð¾Ð»Ð°Ñ„Ð½ÐµÐ¼Ñ Ñ‚Ð¾Ð½ÑŒ ушеширень Ñёрматфтомацень.',
@@ -645,7 +628,7 @@ $2',
'newpassword' => 'Од Ñувама вал:',
'retypenew' => 'Сёрматк од Ñувама вал омбоцекÑ:',
'resetpass_submit' => 'Ðрафтк Ñувама валть Ñди Ñувак',
-'resetpass_success' => 'Тонь Ñувама валцень полафнемаÑÑŒ ётаÑÑŒ лац! Тонь ÑувафттÑдÑзь ÑиÑтемÑ...',
+'changepassword-success' => 'Тонь Ñувама валцень полафнемаÑÑŒ ётаÑÑŒ лац! Тонь ÑувафттÑдÑзь ÑиÑтемÑ...',
'resetpass_forbidden' => 'Сувама валхнень Ð¿Ð¾Ð»Ð°Ñ„Ñ‚Ð¾Ð¼Ñ Ð°Ñˆ кода',
'resetpass-no-info' => 'Тондейть ÑÑ€Ñви ÑÑ‘Ñ€Ð¼Ð°Ñ‚Ñ„Ñ‚Ð¾Ð¼Ñ Ñ‚Ñ Ð»Ð¾Ð¿Ð°Ñ Ð²Ð¸Ð´ÐµÑта Ñуваманди.',
'resetpass-submit-loggedin' => 'ÐŸÐ¾Ð»Ð°Ñ„Ñ‚Ð¾Ð¼Ñ Ñувама валцень',
@@ -656,10 +639,8 @@ $2',
# Special:PasswordReset
'passwordreset' => 'ÐŸÐ¾Ð»Ð°Ñ„Ñ‚Ð¾Ð¼Ñ Ñувама валцень',
-'passwordreset-text' => 'ЭрÑви пÑÑˆÐºÐ¾Ð´ÐµÐ¼Ñ Ñ‚Ñ Ñ„Ð¾Ñ€Ð¼Ð°Ñ‚ÑŒ е-Ñёрма Ñёрматфтомацень колга ÑÑвоманди.',
'passwordreset-legend' => 'ÐŸÐ¾Ð»Ð°Ñ„Ñ‚Ð¾Ð¼Ñ Ñувама валцень',
'passwordreset-disabled' => 'Сувама валÑÑŒ аф полафтови Ñ‚Ñ Ð²Ð¸ÐºÐ¸Ñ‚ÑŒ ÑÑа.',
-'passwordreset-pretext' => '{{PLURAL:$1||ТÑштьк Ñодама пÑлькÑнень Ñзда Ñ„ÐºÑ Ð°Ð»Ñƒ}}',
'passwordreset-username' => 'Тиить лемоц',
'passwordreset-domain' => 'Домен:',
'passwordreset-capture' => 'Ð’Ð°Ð½Ð¾Ð¼Ñ Ð¼ÐµÐºÐ¾Ð»ÑŒÑ†Ðµ е-Ñёрма?',
@@ -1001,7 +982,6 @@ $3 макÑÑÑŒ туфталÑÑŒ - ''$2''",
'searchmenu-legend' => 'Вешендема арафнематне',
'searchmenu-exists' => "'''Ð¢Ñ Ð’Ð¸ÐºÐ¸Ñа ули лопаÑÑŒ \"[[:\$1]]\" лем мархта'''",
'searchmenu-new' => "'''Ð£ÑˆÐµÐ´Ð¾Ð¼Ñ Ð»Ð¾Ð¿Ð°ÑÑŒ \"[[:\$1]]\" Ñ‚Ñ Ð’Ð¸ÐºÐ¸Ñа!'''",
-'searchhelp-url' => 'Help:Лопань потмоц',
'searchmenu-prefix' => '[[Special:PrefixIndex/$1|ÐœÑƒÐ¼Ñ Ð»Ð¾Ð¿Ð°Ñ‚ Ñ‚Ñ Ð²Ð°Ð»Ñ‹Ð½Ð³Ð¾Ð»ÑŒÐºÑÑÑŒ мархта]]',
'searchprofile-articles' => 'Потмонь лопат',
'searchprofile-project' => 'Ð›ÐµÐ·ÐºÑ Ñди проектонь лопат',
@@ -1042,14 +1022,6 @@ $3 макÑÑÑŒ туфталÑÑŒ - ''$2''",
'search-external' => 'Ушеширень вешендема',
'searchdisabled' => '{{SITENAME}}-Ñа Ñ‚Ñни вешендемаÑÑŒ аш. Ули кода Ð²ÐµÑˆÐµÐ½Ð´ÐµÐ¼Ñ Google Ñли Ð¸Ð»Ñ Ð²ÐµÑˆÐµÐ½Ð´ÐµÐ¼Ð°Ð½ÑŒ интернет програпнень вельде. Шарфтк мÑльце тоÑтонь {{SITENAME}}-нь потмонц верзиец, улема, ÑирелгодÑÑŒ.',
-# Quickbar
-'qbsettings' => 'Ðавигациень ÑедÑфкÑ',
-'qbsettings-none' => 'ÐÑ„ нÑфтемÑ',
-'qbsettings-fixedleft' => 'Кержи шири киртьф',
-'qbsettings-fixedright' => 'Види шири киртьф',
-'qbsettings-floatingleft' => 'Кержи ширеÑа уенди',
-'qbsettings-floatingright' => 'Виде ширеÑа уенди',
-
# Preferences page
'preferences' => 'Ðрафнематне',
'mypreferences' => 'Монь латцемане',
@@ -1074,7 +1046,6 @@ $3 макÑÑÑŒ туфталÑÑŒ - ''$2''",
'resetprefs' => 'Ð’Ð°Ð»Ñ…Ñ‚Ð¾Ð¼Ñ Ð°Ð¿Ð°Ðº ванфтт полафнематнень',
'restoreprefs' => 'ÐœÑŠÑ€Ð´Ð°Ñ„Ñ‚Ð¾Ð¼Ñ Ð²Ð°Ñень латцематне',
'prefs-editing' => 'Петнема',
-'prefs-edit-boxsize' => 'Петнема вальмоть келец.',
'rows' => 'Луфт (Ñтрокат):',
'columns' => 'Орват (ÑтолбанÑÑ‚):',
'searchresultshead' => 'Вешендема',
@@ -1307,7 +1278,6 @@ $3 макÑÑÑŒ туфталÑÑŒ - ''$2''",
'recentchangeslinked-feed' => 'Сюлмаф полафнематне',
'recentchangeslinked-toolbox' => 'Сюлмаф полафнематне',
'recentchangeslinked-title' => 'Полафнемат Ñюлмафт "$1" мархта',
-'recentchangeslinked-noresult' => 'Сюлмаф лопава Ñ‚Ñ Ð¿Ð¸Ð½Ð³Ñта полафнемат ашельхть.',
'recentchangeslinked-summary' => "Ð¢Ñ Ð±Ð°ÑˆÐºÐ° Ð»Ð¾Ð¿Ð°Ñ Ñувафнезь мекольце полафнемат Ñюлмаф лопава. Тонь ванома ÑёрмалувомаÑтонь лопатне Ñ‚Ñштезь '''ÑчкÑта'''.",
'recentchangeslinked-page' => 'Лопать лемоц:',
'recentchangeslinked-to' => 'ÐÑÑ„Ñ‚ÐµÐ¼Ñ Ð¿Ð¾Ð»Ð°Ñ„Ñ‚Ð¾Ð¼Ð°Ñ‚Ð½Ðµ лопатнень ÑÑа Ñотфт Ñ‚Ñ Ð»Ð¾Ð¿Ð°Ñ‚ÑŒ мархта',
@@ -1527,10 +1497,6 @@ $3 макÑÑÑŒ туфталÑÑŒ - ''$2''",
'statistics-users-active-desc' => 'Тиихне конатне тиÑÑ‚ÑŒ мезеге ётай {{PLURAL:$1|шинÑ|$1 шиÑта}}',
'statistics-mostpopular' => 'СидеÑта ÑувÑеви лопат',
-'disambiguations' => 'Лама ÑмузьÑа лопат',
-'disambiguationspage' => 'Template:лама ÑмуÑÑ‚ÑŒ',
-'disambiguations-text' => "ÐÑ Ð»Ð¾Ð¿Ð°Ñ‚Ð½Ðµ Ñюлмафт '''лама Ñмузень лопа''' мархта. СиньдееÑÑ‚ ÑÑ€Ñвихть ÑÑŽÐ»Ð¼Ð°Ð¼Ñ Ð¸Ð»Ñ Ð±Ð°ÑˆÐºÐ° ÑёрмафкÑнень мархта.<br />ЛопаÑÑŒ лувови лама ÑÐ¼ÑƒÐ·ÐµÐ½Ð½ÐµÐºÑ Ð¼ÑŠÐ·Ñрда Ñон Ñюлмаф [[MediaWiki:Disambiguationspage]] ÐºÐµÐ¿Ð¾Ñ‚ÑŒÐºÑ Ð¼Ð°Ñ€Ñ…Ñ‚Ð°.",
-
'doubleredirects' => 'Кафонзаф умборондафтфкÑне',
'doubleredirectstext' => 'Ð¢Ñ Ð»Ð¾Ð¿Ð°Ð½ÑŒ лувомаÑа нÑфтевихть умборондафтфкÑне Ñюлмафт Ð¸Ð»Ñ ÑƒÐ¼Ð±Ð¾Ñ€Ð¾Ð½Ð´Ð°Ñ„Ñ‚Ñ„ÐºÑнень мархта. Эрь луфкÑÑа (ÑтрокаÑа) улихть ваÑенце ди омбоце умборондафтфкÑнень ÑюлмафкÑÑна, Ñ‚ÑÑа тага ули омбоце умборондафтфкÑонь ваÑенце кикÑонцты ÑюлмафкÑÑÑŒ, тоÑа ули нÑфтемаÑÑŒ лопань лемонц Ð»Ð°Ð½Ð³Ñ ÐºÐ¾Ð½Ð°Ð½ÑŒ мархта ÑÑ€Ñволь ваÑенце умборондафтфкÑÑ‚ÑŒ ÑюлмафтомÑ.
<del>Ð¢ÑƒÑ€ÐºÑ ÐºÐ¸ÐºÑ Ð¼Ð°Ñ€Ñ…Ñ‚Ð°</del> Ñ‚ÑшкÑне латцефольхть.',
@@ -1730,10 +1696,9 @@ $3 макÑÑÑŒ туфталÑÑŒ - ''$2''",
'unwatchthispage' => 'Ð›Ð¾Ñ‚ÐºÐ°Ð¼Ñ Ð¼ÐµÐ»ÑŒÐ³Ðµ ваномать',
'notanarticle' => 'ÐÑ„ Ñёрмапотмонь лопа',
'notvisiblerev' => 'ВерзиеÑÑŒ нардафоль',
-'watchnochange' => 'Мезеге изь полафтов тонь мельгеванома лувомаÑтот Ñ‚Ñ Ð¿Ð¸Ð½Ð³ÐµÑ‘Ñ‚ÐºÑа.',
'watchlist-details' => '{{PLURAL:$1|$1 лопа|$1 лопат}} мельгеваномацень ала корхнема лопат аф лувомок.',
-'wlheader-enotif' => '* Электрононь Ñёрма вельде пачфнема нолдаф тевÑ.',
-'wlheader-showupdated' => "* Лопат конань полафтозь тонь мекольце ÑувÑемадот меле нÑфтевÑÑ‚ÑŒ '''Ñчке Ñ‚ÑшкÑа'''.",
+'wlheader-enotif' => 'Электрононь Ñёрма вельде пачфнема нолдаф тевÑ.',
+'wlheader-showupdated' => "Лопат конань полафтозь тонь мекольце ÑувÑемадот меле нÑфтевÑÑ‚ÑŒ '''Ñчке Ñ‚ÑшкÑа'''.",
'watchmethod-recent' => 'мельге ванома ала лопатнень корÑÑ Ð¼ÐµÐºÐ¾Ð»ÑŒÑ†Ðµ петнематнень ванондома',
'watchmethod-list' => 'мекольце петнематнень корÑÑ Ð¼ÐµÐ»ÑŒÐ³Ðµ ванома ала лопат ванондома',
'watchlistcontains' => 'Тонь мельгеваномаÑот $1 {{PLURAL:$1|лопа|лопат}}.',
@@ -2064,12 +2029,9 @@ $1',
'ipb_blocked_as_range' => 'ЭльбÑтькÑ: IP $1 аф кардаф видеÑта ди Ñоннеда аш кода кардафкÑÑÑŒ валхтомÑ.
Сон, интай улема, кардафоль кода $2-нь потмонц пакшец, конань Ñзда ули кода кардафкÑонь валхтомÑ.',
'ip_range_invalid' => 'ÐÑ„ кондÑÑти IP потмоц.',
-'blockme' => 'Кардамань монь',
'proxyblocker' => 'Ðтка Ñкаень Ñёлгома',
-'proxyblocker-disabled' => 'Ð¢Ñ Ñ„ÑƒÐ½ÐºÑ†Ð¸ÐµÑÑŒ аф тиеви.',
'proxyblockreason' => 'Тонь IP Ð°Ð´Ñ€ÐµÑ Ð¿ÑкÑтафоль Ñонь панжада прокÑи-Ñерверонь Ñзда.
Тондейть ÑÑ€Ñви ÑÐ¾Ñ‚Ð¾Ð¼Ñ Ñ‚Ð¾Ð½ÑŒ интернет ладÑйть Ñли текникань нежедемать мархта ди Ð¿Ð°Ñ‡Ñ„Ñ‚ÐµÐ¼Ñ Ñ‚Ñ Ð¿Ñ€Ñбалать колга.',
-'proxyblocksuccess' => 'Тиф.',
'sorbsreason' => 'Тонь IP адреÑце лувови панжада ётка Ñкай ÑÐµÑ€Ð²ÐµÑ€Ð¾Ð½Ð½ÐµÐºÑ DNSBL-Ñа, конаÑÑŒ нолдаф Ñ‚ÐµÐ²Ñ {{SITENAME}}Ñа.',
'sorbs_create_account_reason' => 'Тонь IP адреÑце лувови панжада ётка Ñкань ÑÐµÑ€Ð²ÐµÑ€Ð¾Ð½Ð½ÐµÐºÑ DNSBL-Ñа конаÑÑŒ нолнезь Ñ‚ÐµÐ²Ñ {{SITENAME}}Ñа.
Тондейть аш кода Ñёрматфтомать тиемÑ',
@@ -2426,7 +2388,7 @@ $1',
* gpslongitude
* gpsaltitude',
-# EXIF tags
+# Exif tags
'exif-imagewidth' => 'Келец',
'exif-imagelength' => 'Серец',
'exif-bitspersample' => 'Битт Ñ„ÐºÑ ÐºÐ¾Ð¼Ð¿Ð¾Ð½ÐµÐ½Ñ‚Ñ',
@@ -2540,7 +2502,7 @@ $1',
'exif-gpsdatestamp' => 'GPS ши',
'exif-gpsdifferential' => 'GPS диференциень петнема',
-# EXIF attributes
+# Exif attributes
'exif-compression-1' => 'ÐÑ„ компрезиÑÑ„',
'exif-unknowndate' => 'ÐÑ„ Ñодаф шиÑÑŒ',
@@ -2821,7 +2783,6 @@ $5
'version-other' => 'ИлÑ',
'version-mediahandlers' => 'Медиа файлхнень ладÑмат',
'version-hooks' => 'КÑрьмодихне',
-'version-extension-functions' => 'Келептема функциенза',
'version-parser-extensiontags' => 'Ðнализаторонь келептема кодонза',
'version-parser-function-hooks' => 'СинтакÑонь анализаторть функциензон кÑрьмодихне',
'version-hook-name' => 'КÑрьмодинь лемоц',
@@ -2832,13 +2793,6 @@ $5
'version-software-product' => 'ÐолдафкÑ',
'version-software-version' => 'Верзие',
-# Special:FilePath
-'filepath' => 'Файлти Ñн',
-'filepath-page' => 'Файл:',
-'filepath-submit' => 'Ян',
-'filepath-summary' => 'Ð¢Ñ Ð±Ð°ÑˆÐºÐ° тевонь лопаÑÑŒ нÑфнеÑÑ‹ Ñембе Ñнць файлти.
-ÐрхтофкÑне нÑфневихть Ñембе Ñинь кувалмоÑоÑÑ‚, Ð¸Ð»Ñ Ñ„Ð°Ð¹Ð»Ð¾Ð½ÑŒ ÑортÑна нолдавихть видеÑта програпнень вельде конат Ñотфт мархтоÑÑ‚.',
-
# Special:FileDuplicateSearch
'fileduplicatesearch' => 'Ð’ÐµÑˆÐµÐ½Ð´ÐµÐ¼Ñ ÐºÐ°Ñ„Ð¾Ð½Ð·Ð°Ñ„ файлхне',
'fileduplicatesearch-summary' => 'Ð’ÐµÑˆÐµÐ½Ð´ÐµÐ¼Ñ ÐºÐ°Ñ„Ð¾Ð½Ð·Ð°Ñ„ файлхнень Ñ…Ñш-кодонь Ð»ÑƒÐ²ÐºÑ ÐºÐ¾Ñ€ÑÑ.',
diff --git a/languages/messages/MessagesMg.php b/languages/messages/MessagesMg.php
index c8d353cc..a5ae666f 100644
--- a/languages/messages/MessagesMg.php
+++ b/languages/messages/MessagesMg.php
@@ -247,9 +247,6 @@ $messages = array(
'tog-shownumberswatching' => "Asehoy ny isan'ny mpikambana manara-maso ny pejy",
'tog-oldsig' => "Topi-mason'ny sonia :",
'tog-fancysig' => 'Sonia tsotra (tsy misy rohy)',
-'tog-externaleditor' => "Hampiasa mpanova soratra ivelany (ho an'ny mpikambana havanana ihany, mila fampifanarahana manokana eo amin'ny mpikajinao [//www.mediawiki.org/wiki/Manual:External_editors Fampahalalana fanampiny.])",
-'tog-externaldiff' => "Hampiasa mpampitaha ivelany (ho an'ny mpikambana havanana ihany, mila fampifanarahana manokana eo amin'ny mpikajinao [//www.mediawiki.org/wiki/Manual:External_editors Fampahalalana fanampiny.])",
-'tog-showjumplinks' => 'Ampiasao ny rohy "handeha eto"',
'tog-uselivepreview' => 'Hampiasa ny topi-maso malakay (andramana)',
'tog-forceeditsummary' => 'Teneno ahy ra tsy nametraka ny ambangovangony',
'tog-watchlisthideown' => "Tsy ampiseho anatin'ny pejy fanaraha-maso ny zavatra nosoratako",
@@ -262,6 +259,8 @@ $messages = array(
'tog-diffonly' => "Aza ampiseho ny voatonin'ny pejy eo amban'ny diff",
'tog-showhiddencats' => 'Asehoy ny sokajy misitrika',
'tog-norollbackdiff' => 'Aza aseho ny diff rehefa avy namafa fanàvana iray',
+'tog-useeditwarning' => 'Ampitandremo aho raha miala sady mamela pejy ovaiko nefa tsy notahiriziko',
+'tog-prefershttps' => 'Fanohizana azo antoka foana no ampaisaina rehefa tafiditra',
'underline-always' => 'Foana foana',
'underline-never' => 'Tsy tsipihina mihitsy',
@@ -325,6 +324,18 @@ $messages = array(
'oct' => 'Okt',
'nov' => 'Nov',
'dec' => 'Des',
+'january-date' => '$1 Janoary',
+'february-date' => '$1 Febroary',
+'march-date' => '$1 Martsa',
+'april-date' => '$1 Aprily',
+'may-date' => '$1 Mey',
+'june-date' => '$1 Jiona',
+'july-date' => '$1 Jolay',
+'august-date' => '$1 Aogositra',
+'september-date' => '$1 Septambra',
+'october-date' => '$1 Oktobra',
+'november-date' => '$1 Novambra',
+'december-date' => '$1 Desambra',
# Categories related messages
'pagecategories' => '{{PLURAL:$1|Sokajy|Sokajy}}',
@@ -406,6 +417,7 @@ $messages = array(
'create-this-page' => 'Forony ity pejy ity',
'delete' => 'Hamafa',
'deletethispage' => 'Fafao ity pejy ity',
+'undeletethispage' => 'Hamerina ity pejy ity',
'undelete_short' => 'Famerenana fanovana {{PLURAL:$1|$1|$1}}',
'viewdeleted_short' => 'Hijery fanovana voafafa {{PLURAL:$1|tokana|$1}}',
'protect' => 'Hiaro',
@@ -449,7 +461,7 @@ $1',
'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).
+# 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).
'aboutsite' => 'Mombamomba ny {{SITENAME}}',
'aboutpage' => 'Project:Mombamomba',
'copyright' => 'Ny lisansa $1 no mamehy ny fampiasana ity voatoatiny ity.',
@@ -459,7 +471,6 @@ $1',
'disclaimers' => 'Fampitandremana',
'disclaimerpage' => 'Project:General disclaimer',
'edithelp' => 'Fanoroana',
-'edithelppage' => 'Help:Endritsoratra',
'helppage' => 'Help:Fanoroana',
'mainpage' => 'Fandraisana',
'mainpage-description' => 'Fandraisana',
@@ -534,16 +545,12 @@ Mitaky version $1-n'i MediaWiki",
# General errors
'error' => 'Tsy mety',
'databaseerror' => "Tsy fetezana eo amin'ny toby",
-'dberrortext' => "Nitranga ny hadisoana ara-pirafi-kataka (syntax error).
-Mety noho ny tsifandehanan'ny rindrankajy tsara izany.
-<blockquote><code>$1</code></blockquote>
-avy amin'ny tao « <code>$2</code> ».
-ary « <samp>$3 : $4</samp> » no hadisoana naverinn'ny banky angona.",
-'dberrortextcl' => "Ao amin'ny fangatahana tao amin'ny banky angona dia misy tsi-fetezana ara-pehezanteny.
-Ny fangatahana farany nalefa dia :
-« $1 »
-tao amin'ny asa « $2 ».
-Ny banky angona dia namerina ny tsi-fetezana « $3 : $4 »",
+'databaseerror-text' => "Nisy hadisoana banky angona nitranga.
+Mety maneho baogy ao amin'ny rindrankajy izany.",
+'databaseerror-textcl' => 'Nisy hadisoana banky angona nitranga.',
+'databaseerror-query' => 'Hataka: $1',
+'databaseerror-function' => 'Lefa: $1',
+'databaseerror-error' => 'Hadisoana: $1',
'laggedslavemode' => 'Fampitandremana: Mety ho tsy nisy fanovana vao haingana angamba io pejy io',
'readonly' => 'Mihidy ny banky angona',
'enterlockreason' => 'Manomeza antony hanidiana ny pejy, ahitana ny fotoana tokony hamahana izay fihidiana izay',
@@ -579,6 +586,7 @@ Mety efa nataon'ny hafa angamba ny famafàna.",
'cannotdelete-title' => 'Tsy afaka mamafa ny pejy "$1"',
'delete-hook-aborted' => "Famafana nofoanan'ny itatra.
Tsy nanome fanazavana.",
+'no-null-revision' => 'Tsy nahaforona famerenana poaka aty ho an\'ny pejy "$1"',
'badtitle' => 'Tsy mety ny lohateny',
'badtitletext' => "Tsy mety io anaram-pejy nangatahinao io na tsy misy n'inon'inona na rohy dikan-teny vahiny misy diso tsipelina.",
'perfcached' => "Ao amin'ny voatakona ireo data manaraka ireo ary mety tsy voavao. $1{{PLURAL:}} ihany no isan'ireo zavatra voatahiry ao amin'ny voatakona",
@@ -602,13 +610,16 @@ Andramo indray afaka minitra vitsivitsy.",
Hisy fiantraikany amin'ny fisehon'ny tranonkala amin'ny mpampiasa rehetra eto amin'ity wiki ity ny fanovana.
Raha hanampy dikanteny izay tokony hihatra amin'ny wiki rehetra, ampiaao ny tranonkala [//translatewiki.net/ translatewiki.net translatewiki.net], ny tetikasa fandikana an'i MediaWiki.",
-'sqlhidden' => '(nafenina ny requête SQL)',
'cascadeprotected' => 'Ankehitriny dia voaaro ity pejy ity satria misy pejy voaaro {{PLURAL:$1||$1}}1 mampiasa ity pejy ity. Io pejy io dia mampiasa ny fiarovana "en cascade" :
$2',
'namespaceprotected' => "Tsy manana alalàna manova ny toeran'anarana « '''$1''' » ianao.",
'customcssprotected' => "Tsy afaka manova ity pejy CSS ity ianao satria misy ny safidy manokan'ny mpikambana hafa.",
'customjsprotected' => "Tsy afaka manova ity pejy JavaScript ity inaao satria misy ny safidin'ny mpikambana hafa.",
+'mycustomcssprotected' => 'Tsy manana ny alalana ahafahana manova ity pejy CSS ity ianao.',
+'mycustomjsprotected' => 'Tsy manana ny alalana ahafahana manova ity pejy JavaScript ity ianao.',
+'myprivateinfoprotected' => 'Tsy manana alalana ahafahana manova ny fampahalalana tsy sarababem-bahoakanao ianao.',
+'mypreferencesprotected' => 'Tsy manana alalana ahafahana manova ny safidinao ianao.',
'ns-specialprotected' => "Tsy afaka ovaina ny pejy anatin'ny toeran'anarana « {{ns:special}} » .",
'titleprotected' => "Voaaron'i [[User:$1|$1]] ity lohateny ity mba tsy hamorona pejy mitondra ity anarana ity.
Ny antony napetraka dia : « ''$2'' ».",
@@ -633,10 +644,19 @@ Fantaro fa mety mbola misy ireo pejy milaza anao fa mbola tafiditra raha tsy nam
'welcomecreation-msg' => "Noforonina ny aontinao.
Aza adin ny manova ny [[Special:Preferences|safidinao ro amin'i{{SITENAME}}]].",
'yourname' => 'Solonanarana',
+'userlogin-yourname' => 'Anaram-pikambana',
+'userlogin-yourname-ph' => 'Atsofohy ny anaram-pikambanao',
+'createacct-another-username-ph' => 'Atsofohy ny anaram-pikambana',
'yourpassword' => 'Tenimiafina',
+'userlogin-yourpassword' => 'Tenimiafina',
+'userlogin-yourpassword-ph' => 'Atsofohy ny tenimiafinao',
+'createacct-yourpassword-ph' => 'Manatsofoha tenimiafina',
'yourpasswordagain' => 'Avereno ampidirina eto ny tenimiafina',
+'createacct-yourpasswordagain' => 'Hamarino ny tenimiafinao',
+'createacct-yourpasswordagain-ph' => 'Mbola ampidiro fanindroany ny tenimiafinao',
'remembermypassword' => '{{PLURAL:}}Tadidio ny tenimiafiko (mandritry ny $1 andro fara-fahabetsany)',
-'securelogin-stick-https' => "Mijanona tafiditra amin'i HTTPS rehefa tafiditra",
+'userlogin-remembermypassword' => 'Tadidio aho',
+'userlogin-signwithsecure' => "Fidirana amin'ny alalan'ny fanohizana azo antoka",
'yourdomainname' => 'faritra (domaine) misy anao',
'password-change-forbidden' => "Tsy afaka manova ny tenimiafina ianao eto amin'ity wiki ity.",
'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.",
@@ -649,18 +669,41 @@ Mila manaiky cookies ianao raha te hiditra amin'ny {{SITENAME}}.",
'logout' => 'Hiala',
'userlogout' => 'Hiala',
'notloggedin' => 'Tsy tafiditra',
+'userlogin-noaccount' => 'Tsy manana kaonty?',
+'userlogin-joinproject' => "Midira ho mpikamban'i {{SITENAME}}",
'nologin' => "Tsy manana solonanarana? '''$1'''.",
'nologinlink' => 'Manokafa kaonty',
'createaccount' => 'Hamorona kaonty',
'gotaccount' => "Efa manana kaonty? '''$1'''.",
'gotaccountlink' => 'Midira',
'userlogin-resetlink' => "Adinonavo ve ny antsipihan'ny fidiranao ?",
+'userlogin-resetpassword-link' => 'Hamerina ny tenimiafinao',
+'helplogin-url' => 'Help:Fidirana',
+'userlogin-helplink' => '[[{{MediaWiki:helplogin-url}}|Fanoroana mikasika ny fidirana]]',
+'createacct-join' => 'Atsofohy eo ambany ny fampahalalana momba anao.',
+'createacct-another-join' => "Atsofohy eo ambany ny fampahalalana vaovaon'ny kaonty",
+'createacct-emailrequired' => 'Adiresy mailaka :',
+'createacct-emailoptional' => 'Adiresy mailaka (azo tsy atao) :',
+'createacct-email-ph' => 'Atsofohy ny adiresy mailakao',
+'createacct-another-email-ph' => 'Atsofohy ny adiresy mailaka',
'createaccountmail' => "Hampiasa tenimiafina vonjimaika ary handefa azy eo amin'ny adiresy mailaka voalaza",
+'createacct-realname' => 'Tena anarana (azo tsy atao)',
'createaccountreason' => 'Antony :',
+'createacct-reason' => 'Antony',
+'createacct-reason-ph' => 'Inona ny antony hamoronanao kaonty hafa',
+'createacct-captcha' => 'Fitsapana ny antoka',
+'createacct-imgcaptcha-ph' => 'Atsofohy ny teny hitanao eo ambony',
+'createacct-submit' => 'Hamorona ny kaontinao',
+'createacct-another-submit' => 'Hamorona kaonty vaovao',
+'createacct-benefit-heading' => "Olona tahaka ianao no manoratra eo amin'i {{SITENAME}}",
+'createacct-benefit-body1' => 'fanovana{{PLURAL:$1}}',
+'createacct-benefit-body2' => 'pejy{{PLURAL:$1}}',
+'createacct-benefit-body3' => 'mpandray anjara vao haingana{{PLURAL:$1}}',
'badretype' => 'Tsy mitovy ny tenimiafina nampidirinao.',
'userexists' => 'Efa miasa io anaram-pikambana natsofokao io.
Anarana hafa safidiana.',
'loginerror' => "Tsy fetezana teo amin'ny fidirana",
+'createacct-error' => 'Hadisoana tam-pamoronana ny kaonty',
'createaccounterror' => 'Tsy afaka mamorona kaonty : $1',
'nocookiesnew' => "Voasikatra ny kaontim-pikambana, fa tsy tafiditra amin'ny kaontinao ianao.
Mampiasa cookies ny {{SITENAME}} ho an'ny fidirana amin'ny kaonty.
@@ -723,11 +766,14 @@ Tokony miditra na manokatra kaonty ianao, ary ovay ny tenimiafinao dien-izao.
Aza mijery ity hafatra ity ianao raha voaforona an-tsifetezana ilay kaonty io.",
'usernamehasherror' => 'Ny anaram-pikambana dia tsy afaka manana soratra fanaovana hash.',
-'login-throttled' => "Im-betsaka loatra ianao no nanandrana tenimiafina teo amin'io kaonty io.
-Andraso kely ary andramo indray.",
+'login-throttled' => "Betsaka loatra ny andram-pidirana nataonao.
+
+Andraso $1 alohan'ny mamerina.",
'login-abort-generic' => 'Tsy nahomby ny fanandramanao niditra',
'loginlanguagelabel' => 'fiteny : $1',
'suspicious-userlogout' => "Ny fangataham-pialanao dia tsy nekena satria ohatry ny nalfan'ny mpizahan-tsehatra simba izy na kasy ny proxy.",
+'createacct-another-realname-tip' => "Azo tsy atsofoka ny tena anarana.
+Raha misafidy ny hanome azy ianao, ho ampiasaina amin'ny fanehoana ny anjara asan'ilay mpikambana ilay izy.",
# Email sending
'php-mail-error-unknown' => "Hadisoana tsy fantatra tao amin'ny tao mial() an'i PHP.",
@@ -742,7 +788,7 @@ Andraso kely ary andramo indray.",
'newpassword' => 'Tenimiafina vaovao:',
'retypenew' => 'Avereno ampidirina ny tenimiafina vaovao:',
'resetpass_submit' => 'Ovay ny tenimiafina ary midira',
-'resetpass_success' => 'Voasolo soa aman-tsara ny tenimiafinao ! Mampiditranao izao ankehitriny...',
+'changepassword-success' => 'Voaova soa aman-tsara ny tenimiafinao!',
'resetpass_forbidden' => 'Tsy afaka ovaina ny tenimiafina',
'resetpass-no-info' => "Tsy maintsy tafiditra ao amin'ny kaontinao ianao vao afaka mijery ity pejy ity.",
'resetpass-submit-loggedin' => 'Ovay ny tenimiafina',
@@ -754,10 +800,11 @@ Mety efa nanova tenimiafina na nanontany tenimiafina miserana angamba ianao.',
# Special:PasswordReset
'passwordreset' => 'Famafana ary famerenana ny tenimiafina',
-'passwordreset-text' => 'Fenoy ity fôrmiolera ity mba hamerenana ny tenimiafinao.',
+'passwordreset-text-one' => 'Fenoy ity fôrmiolera ity mba hamerenana ny tenimiafinao',
+'passwordreset-text-many' => "Fenoy ny iray amin'ireo saha ireo mba hamerenana ny tenimiafinao{{PLURAL:$1}}",
'passwordreset-legend' => 'Famafana ary famerenana ny tenimiafina',
'passwordreset-disabled' => "Tsy nalefa ny fanovana tenimiafina adino eto amin'ity wiki ity.",
-'passwordreset-pretext' => '{{PLURAL:$1}}Mampidira singa data eo ambany',
+'passwordreset-emaildisabled' => "Tsy avela ny fampiasana mailaka eto amin'ity wiki ity.",
'passwordreset-username' => 'Anaram-pikambana :',
'passwordreset-domain' => 'Vala (domain) :',
'passwordreset-capture' => 'Hijery ny imailaka vokany ?',
@@ -779,7 +826,7 @@ Hitsahatra afaka {{PLURAL:$5|iray|$5}} andro {{PLURAL:$3|io|ireo}} tenimiafina {
Tenimiafina miserana : $2',
'passwordreset-emailsent' => 'Lasa ny mailaka famerenana tenimiafina.',
'passwordreset-emailsent-capture' => 'Lasa ilay mailaka famerenana tenimiafina, izay aseho eo ambany.',
-'passwordreset-emailerror-capture' => "Voaforona ilay imailaka fitadidiana, izay aseho eo ambany, fa tsy nahomby anefa ny fandefasana azy any amin'ny mpikambana : $1",
+'passwordreset-emailerror-capture' => "Nosoratana ilay mailaka famerenana tenimiafina, izay aseho eo ambany, fa tsy tafalefa tany amin'ilay mpikambana ilay izy : $1{{GENDER:$2}}",
# Special:ChangeEmail
'changeemail' => 'Hanova ny adiresy imailaka',
@@ -793,6 +840,17 @@ Tenimiafina miserana : $2',
'changeemail-submit' => 'Hanova ny adiresy imailaka',
'changeemail-cancel' => 'Adinoy',
+# Special:ResetTokens
+'resettokens' => 'Hamerina ny token',
+'resettokens-text' => "Azonao averina eto ny token izay hahafahana mitsidika ny fampahalalana tsy sarababem-bahoaka ao amin'ny kaontinao. Tokony ataonao izany raha voazara tsy fanahy iniana na raha nisy nangalatra ny kaontinao.",
+'resettokens-no-tokens' => 'Tsy misy token ho averina',
+'resettokens-legend' => 'Famerenana ny token',
+'resettokens-tokens' => 'Token:',
+'resettokens-token-label' => '$1 (sanda ankehitriny: $2)',
+'resettokens-watchlist-token' => "Token ho an'ny fahna web (Atom/RSS) ho an'ny [[Special:Watchlist|fanovana ny pejy ao amin'ny lisitry ny pejy arahanao]]",
+'resettokens-done' => 'Natao reset ny token',
+'resettokens-resetbutton' => 'Hanao reset ny token voafidy',
+
# Edit page toolbar
'bold_sample' => 'Soratra matavy',
'bold_tip' => 'Soratra matavy',
@@ -987,12 +1045,15 @@ Tsy nanome antony',
Mety voafafa angamba izy.',
'edit-conflict' => 'Adi-panovàna.',
'edit-no-change' => "Tsy norarahian'ny rindrankajy ny fanovanao satria tsy nanova ny lahatsoratra ianao.",
+'postedit-confirmation' => 'Voatahiry ny fanovanao.',
'edit-already-exists' => 'Tsy afaka amboarina ilay pejy vaovao.
Efa misy izy.',
'defaultmessagetext' => 'Hafatra raha tsy misy',
'content-failed-to-parse' => "Tsy naha-parse ny votoatin'i $2 ho an'ny modely $1 : $3",
'invalid-content-data' => "Data anaty votoatiny tsy miady amin'ny fepetra",
'content-not-allowed-here' => "Votoatiny ''$1'' voarara eo amin'ny pejy [[$2]]",
+'editwarning-warning' => "Mety hahavery ny fanovana nataonao ny fialanao amin'ity pejy ity.
+Raha tafiditra ianao dia azonao esorina ity fampitandremana ity ao amin'ny fizarana \"Fanovàna\" ao amin'ny safidinao",
# Content models
'content-model-wikitext' => 'wiki-soratra',
@@ -1026,6 +1087,7 @@ Ao aorian'ny fivelarana, mety namoaka valy lava loatra angamba izy, ary tsy namp
'undo-failure' => "Tsy afaka esorina io fanovàna io : mety tsy miraikitra amin'ny fanovàna misy eo ampivoaniny ra esorina",
'undo-norev' => 'Tsy afaka nesorina ilay fanovàna satria tsy misy na efa voafafa izy.',
'undo-summary' => "Niala ny fanovàna $1 nataon'i [[Special:Contributions/$2|$2]] ([[User talk:$2|resaho]])",
+'undo-summary-username-hidden' => 'Namafa ny famerenana $1 nataom-pikambana afenina',
# Account creation failure
'cantcreateaccounttitle' => 'Tsy afaka manokatra kaonty ianao.',
@@ -1207,6 +1269,7 @@ $3 santiôna{{PLURAL:}} natsonika tamin'ny [[:$2]]",
'compareselectedversions' => 'Ampitahao ireo version voafidy',
'showhideselectedversions' => 'Aseho/asitrika ireo ny santiôna nofidiana',
'editundo' => 'esory',
+'diff-empty' => '(Tsy misy mahasamihafa)',
'diff-multi' => "({{PLURAL:$1|Famerenana tokana|Famerenana $1}} nataon'ny {{PLURAL:$2|mpikambana iray|mpikambana $2}} tsy miseho)",
'diff-multi-manyusers' => "Tsy naseho ny antiôna $1{{PLURAL:}} nataon'ny mpikambana $2.",
@@ -1230,7 +1293,6 @@ $3 santiôna{{PLURAL:}} natsonika tamin'ny [[:$2]]",
'searchmenu-legend' => 'Safidy mikasika ny fitadiavana',
'searchmenu-exists' => "'''Misy pejy mitondra anarana « [[:$1]] » eto amin'ity wiki ity'''",
'searchmenu-new' => "'''Hanamboatra ny pejy « [[:$1|$1]] » eto amin'ity wiki ity !'''",
-'searchhelp-url' => 'Help:Fanoroana',
'searchmenu-prefix' => "[[Special:PrefixIndex/$1|Hitady pejy manomboka amin'io tovona io]]",
'searchprofile-articles' => 'Pejy misy votoatiny',
'searchprofile-project' => 'Pejy fanampiana sy pejy tetikasa',
@@ -1274,15 +1336,7 @@ ihany no miseho amin'ny vokatry ny karoka).",
'powersearch-togglenone' => 'Tsy misy',
'search-external' => 'Hikaroka any ivelany',
'searchdisabled' => "Tsy nalefa ny karoka eto amin'i {{SITENAME}}. Afaka mampiasa an'i Google aloha ianao mandra-paha. Nefa fantaro fa mety ho efa lany daty ny valiny omeny.",
-
-# Quickbar
-'qbsettings' => 'Tsipika fiasàna',
-'qbsettings-none' => 'Tsy misy',
-'qbsettings-fixedleft' => 'Ankavia',
-'qbsettings-fixedright' => 'Ankavanana',
-'qbsettings-floatingleft' => 'Mitsingevaheva any ankavanana',
-'qbsettings-floatingright' => 'Mitsigevaheva any ankavanana',
-'qbsettings-directionality' => "Tsy mihetsika, arakaraky ny fizotran'ny soratra amin'ny teninao (avy any havanana miankavia, na avy any havia miankavanana)",
+'search-error' => 'Hadisoana nitranga tam-pikarohana: $1',
# Preferences page
'preferences' => 'Ny momba anao',
@@ -1316,7 +1370,6 @@ ihany no miseho amin'ny vokatry ny karoka).",
'resetprefs' => 'Avereno',
'restoreprefs' => "Hamerina ny safidy taloha (amin'ny fizarana rehetra)",
'prefs-editing' => 'Fanovana',
-'prefs-edit-boxsize' => "Haben'ny varavarankelim-panovàna",
'rows' => 'Filaharana :',
'columns' => 'Tsanganana/Tioba :',
'searchresultshead' => 'Fikarohana',
@@ -1327,10 +1380,6 @@ ihany no miseho amin'ny vokatry ny karoka).",
'recentchangesdays-max' => '($1 andro{{PLURAL:$1||}} fara-faha betsany)',
'recentchangescount' => "Isan'ny fanovana haseho (tsipalotra) :",
'prefs-help-recentchangescount' => 'Misy ny fanovana farany, ny tantaram-pejy ary ny laogy',
-'prefs-help-watchlist-token' => "Ny famenoana ity fampidiran-teny ity amina soramiafina iray dia hamoaka topaka RSS ho an'ny pejy arahinao.
-Afaka mamaky ny lisitry ny pejy arahinao izay olona mahalala io soramiafina io, mifidiana sanda sarotra hita ianao noho izany.
-Ity misy soramiafina navoaka amin'ny fomba kisendra afaka ampiasainao :
-$1",
'savedprefs' => 'Voatahiry ny mombamomba anao.',
'timezonelegend' => "Faritr'ora :",
'localtime' => 'Ora an-toerana',
@@ -1361,7 +1410,6 @@ Fenoy araka ny datin'ny solosainan'ny mpitsidika",
'prefs-common-css-js' => "JavaScript ary CSS zaraina ho an'ny fiankanjoana rehetra:",
'prefs-reset-intro' => "Azonao ampiasaina ity pejy ity mba hamerina ny safidinao amin'izay safidy tsipalotr'ilay sehatra. Tsy azo averina io.",
'prefs-emailconfirm-label' => 'Famarinana ny imailaka :',
-'prefs-textboxsize' => "Hangezan'ny varavarankely fanovana",
'youremail' => 'Imailaka:',
'username' => '{{GENDER:$1}}Anaram-pikambana :',
'uid' => '{{GENDER:$1}}mpikambana :',
@@ -1393,6 +1441,8 @@ Tsy haseho ny adiresy imailakao rehefa manoratra any aminao ny mpikambana hafa."
'prefs-dateformat' => 'Endriky ny daty',
'prefs-timeoffset' => 'Elanelana ora',
'prefs-advancedediting' => 'Antsipirihan-tsafidy',
+'prefs-editor' => 'Mpanova',
+'prefs-preview' => 'Topi-maso',
'prefs-advancedrc' => 'Antsipirihan-tsafidy',
'prefs-advancedrendering' => 'Antsipirihan-tsafidy',
'prefs-advancedsearchoptions' => 'Antsipirihan-tsafidy',
@@ -1400,7 +1450,9 @@ Tsy haseho ny adiresy imailakao rehefa manoratra any aminao ny mpikambana hafa."
'prefs-displayrc' => 'safidim-tseho',
'prefs-displaysearchoptions' => 'Safidin-tseho',
'prefs-displaywatchlist' => 'Safidin-tseho',
+'prefs-tokenwatchlist' => 'Token',
'prefs-diffs' => 'Diff',
+'prefs-help-prefershttps' => "Hihatra amin'ny fidiranao manaraka ity safidy ity.",
# User preference: email validation using jQuery
'email-address-validity-valid' => 'Adiresy imailaka mameno fepetra',
@@ -1427,6 +1479,8 @@ Tsy haseho ny adiresy imailakao rehefa manoratra any aminao ny mpikambana hafa."
'userrights-notallowed' => 'Tsy manana alalana ny manova na manampy zom-pikambana ianao.',
'userrights-changeable-col' => 'Ny gropy azonao ovaina',
'userrights-unchangeable-col' => 'Ny gropy tsy azonao ovaina',
+'userrights-conflict' => 'Fifandonana fanovana zom-pikambana! Avereno vakiana ary marino ny fanovanao.',
+'userrights-removed-self' => "Afakao soa aman-tsara ny zonao. Noho izany, tsy afaka mijery amin'ilay pejy intsony ianao.",
# Groups
'group' => 'Gropy :',
@@ -1492,11 +1546,19 @@ Tsy haseho ny adiresy imailakao rehefa manoratra any aminao ny mpikambana hafa."
'right-proxyunbannable' => "Tsy voakasiky ny fanakana mande hoazy avy amin'ny proxy",
'right-unblockself' => "Manala ny hidin'ny tena",
'right-protect' => "Manova ny lenta fiarovan'ny pejy sy manova ny pejy voaaro miriana",
-'right-editprotected' => 'Manova ny pejy voaaro (tsy misy fiarovana en cascade)',
+'right-editprotected' => 'Manova pejy voaaro (tsy misy fiarovana en cascade)',
+'right-editsemiprotected' => 'Hanova ny pejy narovna ho "{{int:protect-level-autoconfirmed}}"',
'right-editinterface' => 'Manova ny interface ny mpikambana',
'right-editusercssjs' => 'Manova ny rakitra CSS sy JS ny mpikambana hafa',
'right-editusercss' => 'Manova ny rakitra CSS ny mpikambana hafa',
'right-edituserjs' => "Manova ny rakitra JS an'ny mpikambana hafa",
+'right-editmyusercss' => 'Manova ny rakitra CSS-nao',
+'right-editmyuserjs' => 'Manova ny rakitra JavaScript-nao',
+'right-viewmywatchlist' => 'Mijery ny pejy arahanao',
+'right-editmywatchlist' => 'Manova ny lisitry ny pejy arahanao. Fantaro koa fa hanampy pejy ny tao sasany na dia tsy manana ity zo ity aza.',
+'right-viewmyprivateinfo' => 'Mijery ny fampahalalana tsy sarababem-bahoakanao (oh. adiresy mailaka, tena anarana)',
+'right-editmyprivateinfo' => 'Manova ny fampahalalana momba anao (oh. mailaka, tena anarana)',
+'right-editmyoptions' => 'Manova ny safidinao',
'right-rollback' => "Mamafa haingankaingana ny fanovan'ny mpandray anjara farany amina pejy manokana",
'right-markbotedits' => "Manamarika ny fanovana voafafa hoatry ny nataon'ny rôbô.",
'right-noratelimit' => 'Tsy voafetra ny isa',
@@ -1558,12 +1620,19 @@ Tsy haseho ny adiresy imailakao rehefa manoratra any aminao ny mpikambana hafa."
'action-userrights-interwiki' => "hanova ny fahefan'ny mpikambana any amin'ny wiki hafa",
'action-siteadmin' => 'Manidy sy manokatra ny banky angona',
'action-sendemail' => 'handefa imailaka',
+'action-editmywatchlist' => 'Manova ny lisitry ny pejy arahana',
+'action-viewmywatchlist' => 'Mijery ny pejy arahanao',
+'action-viewmyprivateinfo' => 'Mijery ny fampahalalana tsy sarababem-bahoakanao',
+'action-editmyprivateinfo' => 'Mijery ny fampahalalana sarababem-bahoakanao',
# Recent changes
'nchanges' => '{{PLURAL:$1|fanovana|fanovana}} $1',
+'enhancedrc-since-last-visit' => '$1 ({{PLURAL:$1|hatry ny famangiana farany}})',
+'enhancedrc-history' => 'tantara',
'recentchanges' => 'Fanovana farany',
'recentchanges-legend' => 'Safidy ny fanovàna farany',
'recentchanges-summary' => "Jereo eto amin'ity pejy ity izay vao niova vao haingana teto amin'ity wiki ity.",
+'recentchanges-noresult' => "Tsy misy fanovana miady amin'ny fepe-potoana napetraka.",
'recentchanges-feed-description' => "Arao ny fanovàna farany amin'ity wiki ity anaty topa",
'recentchanges-label-newpage' => 'Namorona pejy vaovao io fanovana io',
'recentchanges-label-minor' => 'Kely fotsiny ity fanovana ity',
@@ -1600,7 +1669,6 @@ Tsy haseho ny adiresy imailakao rehefa manoratra any aminao ny mpikambana hafa."
'recentchangeslinked-feed' => 'Novaina',
'recentchangeslinked-toolbox' => 'Novaina',
'recentchangeslinked-title' => "Fanaraha-maso ny pejy miarak'amin'ny « $1 »",
-'recentchangeslinked-noresult' => "Tsy nisy fanovana teo amin'ny pejy voarohy mandritry ny fotoana voafidy.",
'recentchangeslinked-summary' => "Mampiseho ny fanovàna vao haingana ity pejy manokana ity. Voasoratra amin'ny '''sora-matavy''' ny lohaten'ny [[Special:Watchlist|pejy arahinao-maso]].",
'recentchangeslinked-page' => 'anaram-pejy :',
'recentchangeslinked-to' => "Ampisehoy ny fanovàn'ny pejy misy rohy makany amin'ny pejy fa tsy atao mivadika",
@@ -1611,7 +1679,7 @@ Tsy haseho ny adiresy imailakao rehefa manoratra any aminao ny mpikambana hafa."
'reuploaddesc' => "Miverena any amin'ny fisy fandefasan-drakitra.",
'upload-tryagain' => "Hanfefa ny fanoritan'ny rakitra novaina",
'uploadnologin' => 'Tsy niditra',
-'uploadnologintext' => 'Mila [[Special:UserLogin|misoratra anarana]] aloha vao afaka mandefa rakitra.',
+'uploadnologintext' => 'Mila $1 ianao vao afaka mandefa rakitra.',
'upload_directory_missing' => "Ny petra-drakitra ampidiran-drakitra ($1) dia tsy misy ary tsy afaka namboarin'ny lohamilin-tranonkala.",
'upload_directory_read_only' => "Ny répertoire ($1) handraisana ny rakitra alefan'ny mpikambana dia tsy afaka anoratana.",
'uploaderror' => 'Nisy tsy fetezana ny fandefasana rakitra',
@@ -1819,7 +1887,6 @@ ity wiki ity dia no-regler-na ho sarababem-bahoaka.",
'http-read-error' => "Tsy fetezana momban'ny famakiana HTTP.",
'http-timed-out' => 'Ny fangatahana HTTP dia efa lany daty.',
'http-curl-error' => 'Tsi-fetezana teo am-pangalana ny URL : $1',
-'http-host-unreachable' => 'URL tsy afaka andehanana',
'http-bad-status' => 'Nisy tsi-fetezana teo ampandefasana ny hataka HTTP: $1 $2',
# Some likely curl errors. More could be added from <http://curl.haxx.se/libcurl/c/libcurl-errors.html>
@@ -1848,6 +1915,8 @@ Rehefa sivanin'ny mpikambana iray izy ity, ny rakitra izay ahitana santiôna vao
'listfiles_size' => 'Habe',
'listfiles_description' => 'Visavisa',
'listfiles_count' => 'Version',
+'listfiles-latestversion-yes' => 'Eny',
+'listfiles-latestversion-no' => 'Tsia',
# File description page
'file-anchor-link' => 'Rakitra',
@@ -1935,6 +2004,13 @@ Aza manadino manamarina raha tsy misy rohy makany amin'ny endrika hafa alohan'ny
'randompage' => 'Takelaka kisendra',
'randompage-nopages' => "Tsy misy pejy ao amin'ny anaran-tsehatra {{PLURAL:$2}} : $1.",
+# Random page in category
+'randomincategory' => "Pejy kisendra ao amin'ny sokajy",
+'randomincategory-invalidcategory' => 'Tsy anaran-tsokajy azo raisina "$1"',
+'randomincategory-nopages' => "Tsy misy pejy ao amin'i [[:Category:$1]]",
+'randomincategory-selectcategory' => "Haka pejy kisendra ao amin'ny sokajy: $1 $2",
+'randomincategory-selectcategory-submit' => 'Alefa',
+
# Random redirect
'randomredirect' => 'Pejy fihodinana kisendra',
'randomredirect-nopages' => "Tsy misy pejy fihodinana eo amin'ny anaran-tsehatra «$1»",
@@ -1959,14 +2035,13 @@ Aza manadino manamarina raha tsy misy rohy makany amin'ny endrika hafa alohan'ny
'statistics-users-active-desc' => "Mpikambana nanao zavatra teto tanatin'ny $1 andro{{PLURAL:}}.",
'statistics-mostpopular' => 'Pejy voatsidika',
-'disambiguations' => 'Pejy misy rohy amina pejy fanalana ny fisalasalana',
-'disambiguationspage' => 'Template:homonimia',
-
'pageswithprop' => 'Pejy misy toe-pejy',
'pageswithprop-legend' => 'Pejy misy toe-pejy',
'pageswithprop-text' => 'Manalisitra ny pejy mampiasa toe-pejy manokana ity',
'pageswithprop-prop' => "Anaran'ilay tondro",
'pageswithprop-submit' => 'Alefa',
+'pageswithprop-prophidden-long' => 'Sandan-toe-dahatsoratra lava miafina ($1)',
+'pageswithprop-prophidden-binary' => 'sandan-toetra roa fototra miafina ($1)',
'doubleredirects' => 'Fihodinana roa',
'double-redirect-fixed-move' => "Ity fihodinana ity, nanana ny tanjona [[$1]] novaina anarana, dia mitondra mankany amin'ny [[$2]].",
@@ -2204,10 +2279,9 @@ na tsy maniry handray imailaka avy amin'ny mpikambana hafa izy.",
'unwatchthispage' => 'Aza arahana intsony',
'notanarticle' => 'Tsy votoatim-pejy ity pejy ity',
'notvisiblerev' => 'Voafafa ilay santiôna',
-'watchnochange' => 'Tsy niova nandritra ny fe-potoana miseho ny zavatra arahanao',
'watchlist-details' => "Pejy $1{{PLURAL:}} ao amin'ny lisitry ny pejy arahanao, tsy isaina ny pejin-dresaka.",
-'wlheader-enotif' => "* Mandeha ny fampilazana amin'ny alalan'ny imailaka.",
-'wlheader-showupdated' => "* <b>Voasorabaventy</b> ny pejy niova taorian'ny famangianao farany.",
+'wlheader-enotif' => "Alefa ny fampilazana amin'ny mailaka.",
+'wlheader-showupdated' => "Aseho '''sorabaventy''' ny pejy niova taorian'ny famangianao azy farany.",
'watchmethod-recent' => 'fanamarinana ny fanovana farany hahitana pejy arahana',
'watchmethod-list' => 'fanamarinana ny pejy arahana ahitana fanovana farany',
'watchlistcontains' => "Ao amin'ny pejy arahanao dia ahitana pejy $1{{PLURAL:}}.",
@@ -2445,7 +2519,7 @@ $1',
'contributions' => "Fandraisan'anjaran'ny mpikambana{{GENDER:$1}}",
'contributions-title' => "Fandraisan'anjaran'i $1",
'mycontris' => "Fandraisan'anjara",
-'contribsub2' => "ho an'ny $1 ($2)",
+'contribsub2' => "Ho an'ny $1 ($2)",
'nocontribs' => "Tsy misy fanovana mifanaraka amin'ireo critères ireo.",
'uctop' => '(ankehitriny)',
'month' => "Tamin'ny volana (sy teo aloha) :",
@@ -2599,11 +2673,8 @@ Mety efa natao angamba ny fanalana sakana.',
Ao amin'ny laharana $2 izay afaka alàna sakana anefa izy io.",
'ip_range_invalid' => 'Tsy mety io IP io.',
'ip_range_toolarge' => 'Ny fanidiana laharana IP ngeza nohonny /$1 dia tsy azo atao.',
-'blockme' => 'Sakano ahy',
'proxyblocker' => 'Mpisakana proxy',
-'proxyblocker-disabled' => 'Tsy mandeha io asa io.',
'proxyblockreason' => "Voasakana ny adiresy IP-nao satria adiresy proxy malalaka izy io. Azafady mba lazao amin'ny mpanome internet anao io olana io.",
-'proxyblocksuccess' => 'Vita.',
'sorbsreason' => "Voasokokajin'ny DNSBL ho ao anatin'ny proxy midanadana ny adiresy IP-nao.",
'sorbs_create_account_reason' => "Voasokajy ho isan'ny proxy midanadana ao amin'ny DNSBL ny adiresy IP-nao. Ireo IP ireo dia ahiana ho fitaovana azon'ny mpandefa spam ampiasaina. Tsy afaka manokatra kaonty ianao.",
'cant-block-while-blocked' => 'Tsy azo sakananao ny mpikambana hafa raha mbola voasakana ianao.',
@@ -2765,6 +2836,8 @@ Andana vangio ny [//www.mediawiki.org/wiki/Localisation Fandikana an'i Mediawiki
'thumbnail-more' => 'Angedazina',
'filemissing' => 'Tsy hita ny rakitra',
'thumbnail_error' => 'Tsy fetezana eo am-panamboarana ilay saritapaka : $1',
+'thumbnail_error_remote' => "Hafa-kadisoana avy amin'i $1:
+$2",
'djvu_page_error' => "Pejy DjVu any ivelan'ny fetra",
'djvu_no_xml' => "Tsy afaka alaina ny XML ho an'ny rakitra DjVu",
'thumbnail-temp-create' => 'Tsy afaka namorona ilay thumbnail miserana',
@@ -3041,6 +3114,19 @@ Raha alefanao ilay izy, mety ho simban'io renifango io ny solosainao.",
'ago' => '$1 lasa izay',
'just-now' => 'vao izao',
+# Human-readable timestamps
+'hours-ago' => '$1 ora lasa{{PLURAL:$1}}',
+'minutes-ago' => '$1{{PLURAL:$1}} minitra lasa',
+'seconds-ago' => '$1 segondra lasa{{PLURAL:$1}}',
+'monday-at' => "Alatsinainy tamin'ny $1",
+'tuesday-at' => "Talata tamin'ny $1",
+'wednesday-at' => "Alarobia tamin'ny $1",
+'thursday-at' => "Alakamisy tamin'ny $1",
+'friday-at' => "Zoma tamin'ny $1",
+'saturday-at' => "Sabotsy tamin'ny $1",
+'sunday-at' => "Alahady tamin'ny $1",
+'yesterday-at' => "Omaly tamin'ny $1",
+
# Bad image list
'bad_image_list' => "Ity ny andrefiny :
@@ -3068,7 +3154,7 @@ Tokony sary tsy misy na sary tsy izy ny rohy voalohany anaty andalana iray .
* gpslongitude
* gpsaltitude",
-# EXIF tags
+# Exif tags
'exif-imagewidth' => 'Halalaka',
'exif-imagelength' => 'Haavo',
'exif-bitspersample' => 'Bit isaky ny singa',
@@ -3372,13 +3458,6 @@ Andramo ny topi-maso tsotra',
'version-software-product' => 'Vokatra',
'version-software-version' => 'Santiôna',
-# Special:FilePath
-'filepath' => "Lalan'ny drakitra",
-'filepath-page' => 'Rakitra',
-'filepath-submit' => 'Handeha',
-'filepath-summary' => "Mamerina ny lalam-pandehanana any amin'ilay rakitra ity pejy ity.
-Aseho amin'ny tena habeny ny sary aseho, ny hafa dia alefa miaraka amin'ny rindrankajy miaraka aminy avy hatrany.",
-
# Special:FileDuplicateSearch
'fileduplicatesearch' => 'Hitady rakitra mitovy endrika',
'fileduplicatesearch-legend' => 'Hitady mitovy endrika',
diff --git a/languages/messages/MessagesMhr.php b/languages/messages/MessagesMhr.php
index 45f2bc82..5952fe52 100644
--- a/languages/messages/MessagesMhr.php
+++ b/languages/messages/MessagesMhr.php
@@ -22,8 +22,8 @@ $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_TEMPLATE => 'Кышкар',
@@ -53,6 +53,8 @@ $namespaceAliases = array(
'ОбÑуждение_категории' => NS_CATEGORY_TALK,
// Namspace changes
+ 'Пайдаланышын_каҥашымаш' => NS_USER_TALK,
+ '$1ын_каҥашымаш' => NS_PROJECT_TALK,
'Файлын_каҥашымаш' => NS_FILE_TALK,
'Ямдылык' => NS_TEMPLATE,
'Ямдылык_шотышто_каҥашымаш' => NS_TEMPLATE_TALK,
@@ -65,6 +67,12 @@ $namespaceAliases = array(
$namespaceGenderAliases = array();
$specialPageAliases = array(
+ 'Blankpage' => array( 'ПуÑта_лаштык' ),
+ 'BrokenRedirects' => array( 'Кӱрылтшӧ__веÑ_вере_колтымаш-влак' ),
+ 'Categories' => array( 'Категорий-влак' ),
+ 'ComparePages' => array( 'Лаштык-влакым_тергымаш' ),
+ 'Emailuser' => array( 'Пайдаланышылан_Ñерышым_колташ' ),
+ 'Longpages' => array( 'Кужу_лаштык-влак' ),
'Preferences' => array( 'Келыштарымаш' ),
'Recentchanges' => array( 'Пытартыш_тӧрлатымаш-влак' ),
'Search' => array( 'Кычалмаш' ),
@@ -81,6 +89,7 @@ $magicWords = array(
'img_top' => array( '1', 'кӱшычын', 'Ñверху', 'top' ),
'img_middle' => array( '1', 'покшелне', 'поÑередине', 'middle' ),
'img_bottom' => array( '1', 'ӱлычын', 'Ñнизу', 'bottom' ),
+ 'sitename' => array( '1', 'СÐЙТЛӰМ', 'ÐÐЗВÐÐИЕ_СÐЙТÐ', 'SITENAME' ),
);
$messages = array(
@@ -107,7 +116,6 @@ $messages = array(
'tog-enotifwatchlistpages' => 'Мыйын ÑÑкерыме лӱмер гыч лаштыкыште тӧрлатымыш нерген Ñлектрон почто гоч шижтараш',
'tog-enotifusertalkpages' => 'Мыйын каҥашымаш лаштыкыште тӧрлатымыш нерген Ñлектрон почто гоч шижтараш',
'tog-oldsig' => 'КызытÑе кидпале',
-'tog-showjumplinks' => '"КуÑнаш …" ешартыш кылверым чӱкташ',
'tog-watchlisthideown' => 'ЭÑкерыме лӱмер гыч мыйын тӧрлатымашым кораҥдаш',
'tog-watchlisthidebots' => 'ЭÑкерыме лӱмер гыч бот-влакын тӧрлатымашыштым кораҥдаш',
'tog-watchlisthideminor' => 'ЭÑкерыме лӱмер гыч изи тӧрлатымаш-влакым кораҥдаш',
@@ -267,7 +275,7 @@ $messages = array(
'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).
+# 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).
'aboutsite' => '{{SITENAME}} нерген',
'aboutpage' => 'Project:Ðерген',
'copyright' => 'Лаштыкыште возымо $1 йӧн дене почмо.',
@@ -277,7 +285,6 @@ $messages = array(
'disclaimers' => 'Вуйшиймаш деч кораҥмаш',
'disclaimerpage' => 'Project:Вуйшиймаш деч кораҥмаш',
'edithelp' => 'Тӧрлатымаш полыш',
-'edithelppage' => 'Help:Тӧрлымаш',
'helppage' => 'Help:Полшык',
'mainpage' => 'Тӱҥ лаштык',
'mainpage-description' => 'Тӱҥ лаштык',
@@ -524,7 +531,6 @@ $messages = array(
'shown-title' => 'Лаштыкыште $1 {{PLURAL:$1|возымаш|возымашым}} ончыкташ',
'viewprevnext' => 'Ончал ($1 {{int:pipe-separator}} $2) ($3)',
'searchmenu-new' => "'''Тиде вики-проектыште «[[:$1]]» лӱман лаштыкым ышташ!'''",
-'searchhelp-url' => 'Help:Вуйлымаш',
'searchprofile-articles' => 'Возымо лаштык-влак',
'searchprofile-project' => 'Полыш да проект лаштык',
'searchprofile-images' => 'Мультимедий',
@@ -666,7 +672,6 @@ $messages = array(
'recentchangeslinked-feed' => 'Ваш кылдалтше тӧрлатымаш-влак',
'recentchangeslinked-toolbox' => 'Ваш кылдалтше тӧрлатымаш-влак',
'recentchangeslinked-title' => '"$1" лаштык дене кылдалтше тӧрлатымаш-влак',
-'recentchangeslinked-noresult' => 'Ончыктымо пагытыште кылдалтше лаштыклаште вашталтыш лийын огыл.',
'recentchangeslinked-summary' => "Это ÑпиÑок недавних изменений в Ñтраницах, на которые ÑÑылаетÑÑ ÑƒÐºÐ°Ð·Ð°Ð½Ð½Ð°Ñ Ñтраница (или входÑщих в указанную категорию).
Страницы, входÑщие в [[Special:Watchlist|ваш ÑпиÑок наблюдениÑ]] '''выделены'''.",
'recentchangeslinked-page' => 'Лаштыкын лӱмжӧ:',
@@ -1123,9 +1128,6 @@ $messages = array(
# Special:Version
'version-specialpages' => 'Лӱмын ыштыме лаштык-влак',
-# Special:FilePath
-'filepath-page' => 'Файл:',
-
# Special:FileDuplicateSearch
'fileduplicatesearch-submit' => 'Кычалаш',
diff --git a/languages/messages/MessagesMin.php b/languages/messages/MessagesMin.php
index bab40709..13541664 100644
--- a/languages/messages/MessagesMin.php
+++ b/languages/messages/MessagesMin.php
@@ -19,8 +19,96 @@
$fallback = 'id';
$namespaceNames = array(
+ NS_MEDIA => 'Media',
+ NS_SPECIAL => 'Istimewa',
+ NS_TALK => 'Maota',
+ NS_USER => 'Pangguno',
+ NS_USER_TALK => 'Rundiang_Pangguno',
+ NS_PROJECT_TALK => 'Rundiang_$1',
NS_FILE => 'Berkas',
+ NS_FILE_TALK => 'Rundiang_Berkas',
+ NS_MEDIAWIKI => 'MediaWiki',
+ NS_MEDIAWIKI_TALK => 'Rundiang_MediaWiki',
NS_TEMPLATE => 'Templat',
+ NS_TEMPLATE_TALK => 'Rundiang_Templat',
+ NS_HELP => 'Bantuan',
+ NS_HELP_TALK => 'Rundiang_Bantuan',
+ NS_CATEGORY => 'Kategori',
+ NS_CATEGORY_TALK => 'Rundiang_Kategori',
+);
+
+$namespaceAliases = array(
+ # Indonesian namespaces
+ '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,
+);
+
+$specialPageAliases = array(
+ 'Activeusers' => array( 'PanggunoAktip', 'Pangguno_aktip' ),
+ 'Allmessages' => array( 'PasanSistim', 'Pasan_sistem' ),
+ 'Allpages' => array( 'DaptaLaman', 'Dapta_laman' ),
+ 'Ancientpages' => array( 'LamanLamo', 'Laman_lamo' ),
+ 'Badtitle' => array( 'JudulBuruak', 'Judul_indak_rancak' ),
+ 'Blankpage' => array( 'LamanKosong', 'Laman_kosong' ),
+ 'Block' => array( 'Blokir', 'IPkanaiBlok', 'PanggunoTablokir' ),
+ 'Blockme' => array( 'BlokDen', 'BlokirAmbo' ),
+ 'Booksources' => array( 'SumberBuku', 'Sumber_buku' ),
+ 'BrokenRedirects' => array( 'PangaliahanRusak', 'Pangaliahan_rusak' ),
+ 'Categories' => array( 'Kategori' ),
+ 'ChangeEmail' => array( 'GantiSurel', 'Ganti_surel' ),
+ 'ChangePassword' => array( 'GantiSandi', 'TukaSandi', 'TukaKatoSandi' ),
+ 'ComparePages' => array( 'BandiangkanLaman', 'Bandiangkan_laman' ),
+ 'Confirmemail' => array( 'PastikanSurel', 'Pastikan_surel' ),
+ 'Contributions' => array( 'SuntiangPangguno', 'Suntiangan_pangguno' ),
+ 'CreateAccount' => array( 'BuekAkun', 'Buek_akun' ),
+ 'Deadendpages' => array( 'LamanBuntu', 'Laman_buntu' ),
+ 'DeletedContributions' => array( 'SuntiangDihapuih', 'Suntiangan_kanai_hapuih' ),
+ 'Disambiguations' => array( 'SamoArti', 'Samo_arti' ),
+ 'EditWatchlist' => array( 'SuntiangDaptaPantau', 'Suntiang_dapta_pantau' ),
+ 'Emailuser' => array( 'SurelPangguno', 'Surel_pangguno' ),
+ 'Export' => array( 'Ekspor' ),
+ 'Fewestrevisions' => array( 'ParubahanTasaketek', 'Parubahan_tasaketek' ),
+ 'FileDuplicateSearch' => array( 'CariBerkasDuplikat', 'Cari_berkas_duplikat' ),
+ 'Filepath' => array( 'LokasiBerkas', 'Lokasi_berkas' ),
+ 'Import' => array( 'Impor' ),
+ 'Invalidateemail' => array( 'BatalSurel', 'Batalkan_surel' ),
+ 'JavaScriptTest' => array( 'TesSkripJava', 'Tes_skrip_Java' ),
+ 'BlockList' => array( 'DaptaBlokir', 'Dapta_pemblokiran', 'Dapta_IP_diblok' ),
+ 'LinkSearch' => array( 'CariTautan', 'Cari_tautan' ),
+ 'Listadmins' => array( 'DaptaPanguruih' ),
+ 'Listfiles' => array( 'DaptaBerkas', 'DaptaGamba' ),
+ 'Listgrouprights' => array( 'DaptaHakKalompok', 'HakKalompokPangguno' ),
+ 'Listredirects' => array( 'DaptaPangaliahan', 'Dapta_pangaliahan' ),
+ 'Listusers' => array( 'DaptaPangguno', 'Dapta_pangguno' ),
+ 'Lockdb' => array( 'KunciBD', 'Kunci_basisdata' ),
+ 'Log' => array( 'Catatan' ),
+ 'Lonelypages' => array( 'LamanYatim', 'Laman_indak_batuan' ),
+ 'Longpages' => array( 'LamanPanjang', 'Laman_panjang' ),
+ 'MergeHistory' => array( 'SajarahPanggabuangan', 'Sajarah_panggabuangan' ),
+ 'MIMEsearch' => array( 'CariMIME', 'PancarianMIME' ),
+ 'Mostcategories' => array( 'KategoriTabanyak', 'Kategori_tabanyak' ),
+ 'Mostimages' => array( 'BerkasAcokDipakai', 'BerkasTabanyak', 'GambaTabanyak' ),
+ 'Mostinterwikis' => array( 'InterwikiAcokDipakai' ),
+ 'Mostlinked' => array( 'LamanTautanTabanyak', 'TautanTabanyak' ),
+ 'Mostlinkedcategories' => array( 'KategoriBatauikTabanyak', 'KategoriAcokTapakai' ),
+ 'Mostlinkedtemplates' => array( 'TemplatTautanTabanyak', 'TemplatAcokDipakai' ),
+ 'Mostrevisions' => array( 'ParubahanTabanyak' ),
+ 'Movepage' => array( 'PindahLaman', 'Pindahkan_laman' ),
+ 'Mycontributions' => array( 'SuntianganAmbo', 'Suntiangan_ambo' ),
+ 'Mypage' => array( 'LamanDenai', 'Laman_denai' ),
+ 'Mytalk' => array( 'DiskusiAmbo' ),
);
$messages = array(
@@ -54,9 +142,6 @@ $messages = array(
'tog-shownumberswatching' => 'Tunjuakan jumlah pamantau',
'tog-oldsig' => 'Tando tangan kini:',
'tog-fancysig' => 'Jadikan tando tangan manjadi teks wiki (indak jo tautan otomatis)',
-'tog-externaleditor' => 'Gunokan editor dari lua sacaro bawaan (untuak nan ahli sajo, butuah pangaturan khusus di komputer Sanak [//www.mediawiki.org/wiki/Manual:External_editors Informasi labiah lanjuik.])',
-'tog-externaldiff' => 'Gunokan diff eksternal sacaro bawaan (untuak nan ahli sajo, kabutuahan pangaturan khusus pado komputer Sanak [//www.mediawiki.org/wiki/Manual:External_editors Informasi labiah lanjuik.].)',
-'tog-showjumplinks' => 'Aktifkan pautan bantuan "langsuang ka"',
'tog-uselivepreview' => 'Gunoan pratonton langsuang (paralu JavaScript) (uji-cubo)',
'tog-forceeditsummary' => 'Ingekan ambo bilo kotak ikhtisar suntiangan kosong',
'tog-watchlisthideown' => 'Suruakan suntiangan surang pado daftar pantau',
@@ -69,6 +154,7 @@ $messages = array(
'tog-diffonly' => 'Jan tampilan isi laman di bawah pabedoan suntiangan',
'tog-showhiddencats' => 'Tunjuakan kategori tasuruak',
'tog-norollbackdiff' => 'Jan tampilan pabedoan sasudah malakukan pangambalian',
+'tog-useeditwarning' => 'Ingekan denai kok denai maninggakan laman suntiang sabalun manyimpan parubahan',
'underline-always' => 'Taruih',
'underline-never' => 'Indak pernah',
@@ -132,6 +218,18 @@ $messages = array(
'oct' => 'Okt',
'nov' => 'Nop',
'dec' => 'Des',
+'january-date' => '$1 Januari',
+'february-date' => '$1 Pebruari',
+'march-date' => '$1 Maret',
+'april-date' => '$1 April',
+'may-date' => '$1 Mai',
+'june-date' => '$1 Juni',
+'july-date' => '$1 Juli',
+'august-date' => '$1 Agustus',
+'september-date' => '$1 September',
+'october-date' => '$1 Oktober',
+'november-date' => '$1 Nopember',
+'december-date' => '$1 Desember',
# Categories related messages
'pagecategories' => '{{PLURAL:$1|Kategori}}',
@@ -256,7 +354,7 @@ $1',
'pool-queuefull' => 'Antrian panuah',
'pool-errorunknown' => 'Kasalahan indak jaleh',
-# 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).
+# 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).
'aboutsite' => 'Tantang {{SITENAME}}',
'aboutpage' => 'Project:Tantang_{{SITENAME}}',
'copyright' => 'Isi tasadio dalam $1',
@@ -266,7 +364,6 @@ $1',
'disclaimers' => 'Sanggahan umum',
'disclaimerpage' => 'Project:Sanggahan umum',
'edithelp' => 'Bantuan suntiangan',
-'edithelppage' => 'Help:Panyuntiangan',
'helppage' => 'Help:Isi',
'mainpage' => 'Palanta',
'mainpage-description' => 'Palanta',
@@ -344,17 +441,6 @@ Daftar laman istimewa nan sah dapek dicaliak di [[Special:SpecialPages|{{int:spe
# General errors
'error' => 'Kasalahan',
'databaseerror' => 'Kasalahan basis data',
-'dberrortext' => 'Kasalahan sintaks pado pamintaan basis data lah tajadi.
-Iko mungkin manandokan adonyo bug pado parangkek lunak.
-Pamintaan basis data nan tarakhir adalah:
-<blockquote><code>$1</code></blockquote>
-dari dalam fungsi "<code>$2</code>".
-Basis data manghasilkan kasalahan "<samp>$3: $4</samp>".',
-'dberrortextcl' => 'Ado kasalahan sintaks pado pamintaan basis data.
-Pamintaan basis data nan terakhir adalah:
-"$1"
-dari dalam fungsi "$2".
-Basis data manghasilkan kasalahan "$3: $4".',
'laggedslavemode' => 'Paringatan: Laman mungkin indak barisi parubahan tabaru.',
'readonly' => 'Basis data dikunci',
'enterlockreason' => 'Masuakkan alasan panguncian, tamasuak pakiraan bilo kunci akan dibuka',
@@ -404,7 +490,6 @@ Untuak manambah atau maubah tajamahan di kasado wiki, harap gunoan [//translatew
'editinginterface' => "'''Paringatan:''' Sanak manyuntiang laman nan digunoan untuak manyadiokan teks antarmuko untuak parangkaik lunak.
Parubahan teks ko akan mampangaruhi tampilan pado antarmuko pangguno untuak pangguno lain.
Untuak tajamahan, harap gunoan [//translatewiki.net/wiki/Main_Page?setlang=min translatewiki.net], proyek palokalan MediaWiki.",
-'sqlhidden' => '(Pamintaan SQL disuruakan)',
'cascadeprotected' => 'Laman iko alah dilindungi dari panyuntiangan karano disartokan di {{PLURAL:$1|laman}} barikuik nan alah dilindungi jo opsi "runtun":
$2',
'namespaceprotected' => "Sanak indak mampunyoi hak akses untuak manyuntiang laman di ruang namo '''$1'''.",
@@ -434,10 +519,18 @@ Parhatian bahawa bara laman mungkin masih taruih manunjukkan bahawa Sanak masih
'welcomeuser' => 'Salamaik datang, $1!',
'welcomecreation-msg' => 'Akun Sanak alah dibuek. Jan lupo maubah [[Special:Preferences|pangaturan {{SITENAME}}]] Sanak.',
'yourname' => 'Namo pangguno:',
+'userlogin-yourname' => 'Namo pangguno',
+'userlogin-yourname-ph' => 'Masuakan namo pangguno',
'yourpassword' => 'Kato sandi:',
+'userlogin-yourpassword' => 'Kato sandi',
+'userlogin-yourpassword-ph' => 'Masuakan kato sandi',
+'createacct-yourpassword-ph' => 'Masuakan kato sandi',
'yourpasswordagain' => 'Ulang baliak kato sandi:',
+'createacct-yourpasswordagain' => 'Konfirmasi kato sandi',
+'createacct-yourpasswordagain-ph' => 'Masuakan lai kato sandi',
'remembermypassword' => 'Ingek log masuak denai di paramban ko (salamo $1 {{PLURAL:$1|hari}})',
-'securelogin-stick-https' => 'Tetap tahubuang ka HTTPS sasudah masuk log',
+'userlogin-remembermypassword' => 'Biakan ambo tetap masuak',
+'userlogin-signwithsecure' => 'Gunoan server aman',
'yourdomainname' => 'Domain Sanak:',
'password-change-forbidden' => 'Sanak indak dapek maubah kato sandi di wiki ko.',
'externaldberror' => 'Alah tajadi kasalahan otentikasi basis data eksternal atau Sanak indak diizinan malakuan pabaruan tahadok akun eksternal Sanak.',
@@ -449,18 +542,38 @@ Parhatian bahawa bara laman mungkin masih taruih manunjukkan bahawa Sanak masih
'logout' => 'Kalua log',
'userlogout' => 'Kalua log',
'notloggedin' => 'Alun masuak log',
+'userlogin-noaccount' => 'Alun ado akun?',
+'userlogin-joinproject' => 'Join {{SITENAME}}',
'nologin' => "Alun ado akun? '''$1'''.",
'nologinlink' => 'Buek akun baru',
'createaccount' => 'Buek akun',
'gotaccount' => "Alah tadaftar sabagai pangguno? '''$1'''.",
'gotaccountlink' => 'Masuak log',
'userlogin-resetlink' => 'Lupo rincian info masuak Sanak?',
+'userlogin-resetpassword-link' => 'Buek ulang kato sandi',
+'helplogin-url' => 'Help:Masuak log',
+'userlogin-helplink' => '[[{{MediaWiki:helplogin-url}}|Bantuan untuak masuak log]]',
+'createacct-join' => 'Masuakan informasi Sanak di bawah ko.',
+'createacct-emailrequired' => 'Alamaik surel',
+'createacct-emailoptional' => 'Alamaik surel (opsional)',
+'createacct-email-ph' => 'Masuakan alamaik surel Sanak',
'createaccountmail' => 'Pakai kato sandi sumbarang samantaro, lalu kirim ka alamaik surel nan di bawah ko',
+'createacct-realname' => 'Namo asli (opsional)',
'createaccountreason' => 'Alasan:',
+'createacct-reason' => 'Alasan',
+'createacct-reason-ph' => 'Manga Sanak mambuek akun lain',
+'createacct-captcha' => 'Pamarisoan kaamanan',
+'createacct-imgcaptcha-ph' => 'Masuakan teks nan Sanak caliak di ateh',
+'createacct-submit' => 'Buek akun Sanak',
+'createacct-benefit-heading' => '{{SITENAME}} dibuek dek urang-urang saroman Sanak.',
+'createacct-benefit-body1' => '{{PLURAL:$1|suntiangan}}',
+'createacct-benefit-body2' => '{{PLURAL:$1|laman}}',
+'createacct-benefit-body3' => '{{PLURAL:$1|panyuntiang}} tarakhia',
'badretype' => 'Kato sandi nan Sanak masuakan salah.',
'userexists' => 'Namo pangguno nan dipiliah alah tapakai.
Piliah namo nan lain.',
'loginerror' => 'Kasalahan masuak log',
+'createacct-error' => 'Pambuatan akun gagal',
'createaccounterror' => 'Indak dapek mambuek akun: $1',
'nocookiesnew' => 'Akun pangguno alah dibuek, tapi Sanak alun masuak log.
{{SITENAME}} manggunokan cookies untuak log pangguno.
@@ -537,7 +650,7 @@ Tunggulah sabanta sabalun mancubo baliak.',
'newpassword' => 'Kato sandi baharu:',
'retypenew' => 'Ketik ulang kato sandi baharu:',
'resetpass_submit' => 'Atua kato sandi dan masuak log',
-'resetpass_success' => 'Kato sandi Sanak alah berhasil dituka!
+'changepassword-success' => 'Kato sandi Sanak alah berhasil dituka!
Kini mamproses masuak log Sanak...',
'resetpass_forbidden' => 'Kato sandi indak dapek dituka',
'resetpass-no-info' => 'Sanak harus masuak log untuak mangakses laman iko sacara langsuang.',
@@ -550,10 +663,11 @@ Sanak mungkin alah berhasil mangganti kato sandi Sanak atau alah maminto kato sa
# Special:PasswordReset
'passwordreset' => 'Setel ulang kato sandi',
-'passwordreset-text' => 'Isi formulir ko untuak maubah kato sandi.',
+'passwordreset-text-one' => 'Lengkapkan formulir ko untuak manuka baliak kato sandi Sanak.',
+'passwordreset-text-many' => '{{PLURAL:$1|Masuakan data di bawah ko untuak manuka baliak kato sandi Sanak.}}',
'passwordreset-legend' => 'Tuka baliak kato sandi',
'passwordreset-disabled' => 'Pangubahan kato sandi alah dimatian di wiki iko.',
-'passwordreset-pretext' => '{{PLURAL:$1||Masuakan salah satu data di bawah ko}}',
+'passwordreset-emaildisabled' => 'Fitur surel alah dimatian pado wiki iko.',
'passwordreset-username' => 'Namo pangguno:',
'passwordreset-domain' => 'Domain:',
'passwordreset-capture' => 'Caliak kaputusannyo?',
@@ -577,7 +691,7 @@ Sanak harus masuak dan mamiliah sandi baru. Jikok urang lain mambuek pamintaan k
Sandi samantaro: $2',
'passwordreset-emailsent' => 'Surel parubahan kato sandi alah dikirim.',
'passwordreset-emailsent-capture' => 'Surel parubahan kato sandi alah dikirim, nan nampak di bawah ko.',
-'passwordreset-emailerror-capture' => 'Surel pangingek nan ditampilkan di bawah alah dibuek, tapi pengirimannyo ka pangguno $1, gagal.',
+'passwordreset-emailerror-capture' => 'Surel parubahan kato sandi nan ditampilan di bawah, alah dibuek, tapi pangirimannyo ka {{GENDER:$2|pangguno}} gagal: $1',
# Special:ChangeEmail
'changeemail' => 'Tuka alamaik surel.',
@@ -793,6 +907,7 @@ Nyo alah ado.',
'content-failed-to-parse' => 'Gagal manjabarkan konten $2 untuak model $1: $3',
'invalid-content-data' => 'Data kanduangan indak valid.',
'content-not-allowed-here' => 'Konten "$1" indak diizinan di laman [[$2]]',
+'editwarning-warning' => 'Maninggakan laman ko dapek maakibaikan parubahan nan dibuek hilang. Jikok Sanak lah masuak log, dapek mamatian pasan ko malalui bagian "Panyuntiangan" pado laman pangaturan.',
# Content models
'content-model-wikitext' => 'Teks wiki',
@@ -994,7 +1109,6 @@ $1",
'searchmenu-legend' => 'Atua pancarian',
'searchmenu-exists' => "'''Ado laman nan banamo \"[[:\$1]]\" pado wiki ko.'''",
'searchmenu-new' => "'''Buek laman \"[[:\$1]]\" di wiki ko!'''",
-'searchhelp-url' => 'Help:Isi',
'searchmenu-prefix' => '[[Special:PrefixIndex/$1|Cari laman jo awalan ko]]',
'searchprofile-articles' => 'Laman isi',
'searchprofile-project' => 'Laman Bantuan jo Proyek',
@@ -1039,15 +1153,6 @@ Cubo awali pamintaan Sanak tu jo ''sadonyo:'' untuak mancari kasado kandungan (t
Sanak samantaro dapek mancari lewaik Google.
Ingek indeks Google untuak {{SITENAME}} mungkin lah kadaluarsa.',
-# Quickbar
-'qbsettings' => 'Bar pinteh',
-'qbsettings-none' => 'Indak ado',
-'qbsettings-fixedleft' => 'Rato kiri',
-'qbsettings-fixedright' => 'Rato kanan',
-'qbsettings-floatingleft' => 'Mangambang di kiri',
-'qbsettings-floatingright' => 'Mangambang di kanan',
-'qbsettings-directionality' => 'Tetap, tagantuang pado skrip bahaso Sanak',
-
# Preferences page
'preferences' => 'Pangaturan',
'mypreferences' => 'Pangaturan',
@@ -1080,7 +1185,6 @@ Ingek indeks Google untuak {{SITENAME}} mungkin lah kadaluarsa.',
'resetprefs' => 'Batalan parubahan',
'restoreprefs' => 'Baliakan ka setelan awal',
'prefs-editing' => 'Panyuntiangan',
-'prefs-edit-boxsize' => 'Ukuran kotak panyuntiangan.',
'rows' => 'Barih:',
'columns' => 'Kolom:',
'searchresultshead' => 'Cari',
@@ -1091,8 +1195,6 @@ Ingek indeks Google untuak {{SITENAME}} mungkin lah kadaluarsa.',
'recentchangesdays-max' => 'Maksimum $1 {{PLURAL:$1|hari}}',
'recentchangescount' => 'Jumlah suntiangan nan ditunjuakan:',
'prefs-help-recentchangescount' => 'Iko untuak parubahan tabaru, riwayaik laman nan lalu, sarato log.',
-'prefs-help-watchlist-token' => 'Mangisi kotak ko jo kunci rasio (PIN) akan manghasilkan sindikasi RSS untuak daftar pantau Sanak. Sia juo nan tau jo kunci ko dapek mambaco daftar pantau Sanak, jadi hati-hatilah mamiliah nilainyo.
-Barikuik ko nilai acak nan dapek Sanak gunoan: $1',
'savedprefs' => 'Pangaturan lah tasimpan',
'timezonelegend' => 'Zona wakatu:',
'localtime' => 'Wakatu satampaik:',
@@ -1123,7 +1225,6 @@ Barikuik ko nilai acak nan dapek Sanak gunoan: $1',
'prefs-reset-intro' => 'Angku dapek manggunokan laman ko untuak mangambalikan pangaturan ka setelan baku situs ko.
Pangambalian pangaturan indak dapek dibatalan.',
'prefs-emailconfirm-label' => 'Surel konfirmasi:',
-'prefs-textboxsize' => 'Ukuran kotak suntiang',
'youremail' => 'Surel:',
'username' => '{{GENDER:$1|Namo pangguno}}:',
'uid' => 'ID {{GENDER:$1|pangguno}}:',
@@ -1306,7 +1407,6 @@ Alamaik surel Sanak indakkan tau dek urang nan manghubuangi sanak tu.',
'recentchangeslinked' => 'Parubahan takaik',
'recentchangeslinked-toolbox' => 'Parubahan takaik',
'recentchangeslinked-title' => 'Parubahan nan takaik jo "$1"',
-'recentchangeslinked-noresult' => 'Indak ado parubahan pado laman nan tapauik salamo periode nan ditantuan',
'recentchangeslinked-summary' => "Iko daftar parubahan tarakhia pado laman nan tahubuang dari laman tatantu (atau anggota dari kategori tatantu).
Laman pado [[Special:Watchlist|daftar pantauan Sanak]] ditandoi jo '''cetak taba'''.",
'recentchangeslinked-page' => 'Namo laman:',
@@ -1318,7 +1418,7 @@ Laman pado [[Special:Watchlist|daftar pantauan Sanak]] ditandoi jo '''cetak taba
'reuploaddesc' => 'Batal dan baliak ka formulir pamuatan',
'upload-tryagain' => 'Kirim parubahan katarangan berkas',
'uploadnologin' => 'Alun masuak log',
-'uploadnologintext' => 'Sanak musti [[Special:UserLogin|masuak log]] untuak dapek mamuek berkas.',
+'uploadnologintext' => 'Sanak musti $1 untuak dapek mamuek berkas.',
'upload_directory_missing' => 'Direktori pamuatan ($1) indak basobok dan indak dapek dibuek dek server web.',
'upload_directory_read_only' => 'Direktori pamuatan ($1) indak dapek ditulih jo server web.',
'uploaderror' => 'Kasalahan pamuatan',
@@ -1490,12 +1590,6 @@ Pariso dulu "pautan baliak" ka templat tasabuik sabalun manghapuihnyo.',
'statistics-users-active-desc' => 'Pangguno nan aktip dalam {{PLURAL:$1|$1 ari}} tarakhia.',
'statistics-mostpopular' => 'Laman nan paliang banyak ditampilkan',
-'disambiguations' => 'Laman nan tahubuang ka laman disambiguasi',
-'disambiguationspage' => 'Template:Disambig',
-'disambiguations-text' => "Laman-laman barikuik punyo pautan ka '''laman disambiguasi'''.
-Laman tasabuik saharuihnyo bapauik ka topik-topik nan sasuai.<br />
-Laman nan dianggap sabagai laman disambiguasi jikok laman tasabuik manggunoan templat nan tahubuang ka [[MediaWiki:Disambiguationspage]].",
-
'pageswithprop' => 'Laman jo laman properti',
'pageswithprop-legend' => 'Laman jo laman properti',
'pageswithprop-text' => 'Laman ko barisi daftar laman nan manggunoan properti laman tatantu.',
@@ -1692,6 +1786,7 @@ Parubahan laman ko tamasuak laman rundiangnyo akan ditampilan disinan.',
'unwatch' => 'Batal pantau',
'unwatchthispage' => 'Batal pantau laman ko',
'watchlist-details' => '{{PLURAL:$1|$1 laman}} dalam daftar pantau Sanak, indak tamasuak laman rundiangnyo.',
+'wlheader-showupdated' => "Laman nan alah barubah sajak kunjuangan tarakhia Sanak ditunjuakan jo '''hurup taba'''",
'wlnote' => "Di bawah ko ado $1 {{PLURAL:$1|parubahan}} dalam {{PLURAL:$2|'''$2''' jam}} iko, sampai tanggal $3, pukua $4.",
'wlshowlast' => 'Tunjuakan $1 jam parubahan dalam $2 hari tarakhia $3',
'watchlist-options' => 'Piliahan daftar pantau',
@@ -1963,9 +2058,7 @@ Caliak [[Special:BlockList|daftar sakek]] untuak kasado pangguno nan kini kanai
'ipb_already_blocked' => '"$1" alah disakek',
'ipb-needreblock' => '$1 alah tasakek. Apo nio diubah pangaturannyo?',
'ipb-otherblocks-header' => '{{PLURAL:$1|Sakek}} lain',
-'blockme' => 'Sakek denai',
'proxyblocker' => 'Sakek proksi',
-'proxyblocker-disabled' => 'Fungsi ko dimatian',
# Developer tools
'lockdb' => 'Kunci basis data',
@@ -2208,13 +2301,8 @@ Sanak hanyo buliah mancaliak sumbernyo sajo',
'pageinfo-category-files' => 'Jumlah berkas',
# Skin names
-'skinname-standard' => 'Klasik',
-'skinname-nostalgia' => 'Nostalgia',
'skinname-cologneblue' => 'Biru Köln',
'skinname-monobook' => 'MonoBook',
-'skinname-myskin' => 'MySkin',
-'skinname-chick' => 'Chick',
-'skinname-simple' => 'Sadarano',
'skinname-modern' => 'Moderen',
'skinname-vector' => 'Vektor',
@@ -2277,11 +2365,25 @@ Sanak hanyo buliah mancaliak sumbernyo sajo',
'minutes' => '{{PLURAL:$1|1 minik|$1 minik}}',
'hours' => '{{PLURAL:$1|1 jam|$1 jam}}',
'days' => '{{PLURAL:$1|1 ari|$1 ari}}',
+'weeks' => '{{PLURAL:$1|1 pakan|$1 pakan}}',
'months' => '{{PLURAL:$1|1 bulan|$1 bulan}}',
'years' => '{{PLURAL:$1|1 taun|$1 taun}}',
'ago' => '$1 nan lalu',
'just-now' => 'sabanta ko',
+# Human-readable timestamps
+'hours-ago' => '{{PLURAL:$1|1 jam|$1 jam}} nan lalu',
+'minutes-ago' => '{{PLURAL:$1|1 minik|$1 minik}} nan lalu',
+'seconds-ago' => '{{PLURAL:$1|1 datiak|$1 datiak}} nan lalu',
+'monday-at' => 'Sinayan pukua $1',
+'tuesday-at' => 'Salasa pukua $1',
+'wednesday-at' => "Raba'a pukua $1",
+'thursday-at' => 'Kamih pukua $1',
+'friday-at' => 'Jumaik pukua $1',
+'saturday-at' => 'Satu pukua $1',
+'sunday-at' => 'Akaik pukua $1',
+'yesterday-at' => 'Kapatang pukua $1',
+
# Bad image list
'bad_image_list' => 'Formatnyo adolah sabagai barikuik:
@@ -2339,7 +2441,7 @@ Nan lainnyo akan tasuruak sacaro baku.
* gpslongitude
* gpsaltitude',
-# EXIF tags
+# Exif tags
'exif-imagewidth' => 'Leba',
'exif-imagelength' => 'Tinggi',
'exif-bitspersample' => 'Bita per komponen',
@@ -2439,11 +2541,6 @@ Sanak mustilah alah manarimo [{{SERVER}}{{SCRIPTPATH}}/COPYING salinan Lisensi P
'version-entrypoints-articlepath' => '[https://www.mediawiki.org/wiki/Manual:$wgArticlePath Artikel path]',
'version-entrypoints-scriptpath' => '[https://www.mediawiki.org/wiki/Manual:$wgScriptPath Skrip path]',
-# Special:FilePath
-'filepath' => 'Lokasi berkas',
-'filepath-page' => 'Berkas:',
-'filepath-submit' => 'Cari',
-
# Special:FileDuplicateSearch
'fileduplicatesearch' => 'Pancarian berkas duplikat',
'fileduplicatesearch-summary' => 'Pancarian berkas duplikat badasaran nilai hash-nyo.',
diff --git a/languages/messages/MessagesMk.php b/languages/messages/MessagesMk.php
index 8b69362e..754fcf88 100644
--- a/languages/messages/MessagesMk.php
+++ b/languages/messages/MessagesMk.php
@@ -151,6 +151,7 @@ $specialPageAliases = array(
'Myuploads' => array( 'МоиПодигања' ),
'Newimages' => array( 'ÐовиСлики', 'ÐовиПодатотеки' ),
'Newpages' => array( 'ÐовиСтраници' ),
+ 'PagesWithProp' => array( 'СтранициСоСвојÑтво' ),
'PasswordReset' => array( 'ПроменаÐаЛозинка' ),
'PermanentLink' => array( 'ПоÑтојанаВрÑка' ),
'Popularpages' => array( 'ПопуларниСтраници' ),
@@ -162,6 +163,7 @@ $specialPageAliases = array(
'Randomredirect' => array( 'СлучајноПренаÑочување' ),
'Recentchanges' => array( 'СкорешниПромени' ),
'Recentchangeslinked' => array( 'ПоврзаниПромени' ),
+ 'Redirect' => array( 'ПренаÑочување' ),
'Revisiondelete' => array( 'БришењеРевизија' ),
'Search' => array( 'Барај' ),
'Shortpages' => array( 'КраткиСтраници' ),
@@ -179,7 +181,7 @@ $specialPageAliases = array(
'Unusedimages' => array( 'ÐеиÑкориÑтениСлики', 'ÐеиÑкориÑтениПодатотеки' ),
'Unusedtemplates' => array( 'ÐеиÑкориÑтениШаблони' ),
'Unwatchedpages' => array( 'ÐенабљудуваниСтраници' ),
- 'Upload' => array( 'Подигање', 'Подигања' ),
+ 'Upload' => array( 'Подигање' ),
'UploadStash' => array( 'СкриениПодигања' ),
'Userlogin' => array( 'Ðајавување' ),
'Userlogout' => array( 'Одјавување' ),
@@ -236,7 +238,7 @@ $magicWords = array(
'talkspace' => array( '1', 'РÐЗГОВОРПРОСТОР', 'TALKSPACE' ),
'fullpagename' => array( '1', 'ЦЕЛОСÐОИМЕÐÐСТРÐÐИЦÐ', 'FULLPAGENAME' ),
'subpagename' => array( '1', 'ПОТСТРÐÐИЦÐ', 'SUBPAGENAME' ),
- 'basepagename' => array( '1', 'ИМЕÐÐОСÐОВÐÐСТРÐÐИЦÐ', 'BASEPAGENAME' ),
+ 'basepagename' => array( '1', 'ОСÐОВÐÐСТРÐÐИЦÐ', 'BASEPAGENAME' ),
'talkpagename' => array( '1', 'СТРÐÐИЦÐЗÐРÐЗГОВОР', 'TALKPAGENAME' ),
'subjectpagename' => array( '1', 'ИМЕÐÐСТÐТИЈÐ', 'SUBJECTPAGENAME', 'ARTICLEPAGENAME' ),
'msg' => array( '0', 'ПОР:', 'MSG:' ),
@@ -303,6 +305,7 @@ $magicWords = array(
'raw' => array( '0', 'СИРОВО:', 'RAW:' ),
'displaytitle' => array( '1', 'ПРИКÐЖИÐÐСЛОВ', 'DISPLAYTITLE' ),
'rawsuffix' => array( '1', 'П', 'R' ),
+ 'nocommafysuffix' => array( '0', 'БЕЗПОДЕЛ', 'NOSEP' ),
'newsectionlink' => array( '1', '__ВРСКÐÐОВПОДÐÐСЛОВ__', '__NEWSECTIONLINK__' ),
'nonewsectionlink' => array( '1', '__БЕЗВРСКÐÐОВПОДÐÐСЛОВ__', '__NONEWSECTIONLINK__' ),
'currentversion' => array( '1', 'ТЕКОВÐÐВЕРЗИЈÐ', 'CURRENTVERSION' ),
@@ -376,9 +379,6 @@ $messages = array(
'tog-shownumberswatching' => 'Прикажи го бројот на кориÑници кои набљудуваат',
'tog-oldsig' => 'ПоÑтоечки потпиÑ:',
'tog-fancysig' => 'Сметај го потпиÑот за викитекÑÑ‚ (без автоматÑка врÑка)',
-'tog-externaleditor' => 'По оÑновно кориÑти надворешен уредувач (Ñамо за Ñтручњаци, потребно е поÑебно нагодување на Ñметачот. [//www.mediawiki.org/wiki/Manual:External_editors?uselang=mk Повеќе информации.])',
-'tog-externaldiff' => 'По оÑновно кориÑти надворешен програм за Ñпоредување верзии (Ñамо за Ñтручњаци, потребно е Ñпецијално нагодување на Ñметачот. [//www.mediawiki.org/wiki/Manual:External_editors?uselang=mk Повеќе информации.])',
-'tog-showjumplinks' => 'Овозможи врÑки на приÑтапноÑÑ‚ „Ñкокни на“',
'tog-uselivepreview' => 'КориÑти преглед во живо (екÑпериментално)',
'tog-forceeditsummary' => 'ИзвеÑти ме кога нема Ð¾Ð¿Ð¸Ñ Ð½Ð° промените',
'tog-watchlisthideown' => 'Скриј мои уредувања од ÑпиÑокот на набљудувања',
@@ -392,6 +392,8 @@ $messages = array(
'tog-showhiddencats' => 'Прикажи Ñкриени категории',
'tog-noconvertlink' => 'Оневозможи претворање на наÑлов на врÑка',
'tog-norollbackdiff' => 'ИзоÑтави ја разликата по извршено отповикување',
+'tog-useeditwarning' => 'Предупреди ме кога Ñакам да напуштам Ñтраница за уредување без да ги имам зачувано промените',
+'tog-prefershttps' => 'Секогаш најавувај ме преку безбедна врÑка',
'underline-always' => 'Секогаш',
'underline-never' => 'Ðикогаш',
@@ -455,6 +457,18 @@ $messages = array(
'oct' => 'окт',
'nov' => 'ное',
'dec' => 'дек',
+'january-date' => '$1 јануари',
+'february-date' => '$1 февруари',
+'march-date' => '$1 март',
+'april-date' => '$1 април',
+'may-date' => '$1 мај',
+'june-date' => '$1 јуни',
+'july-date' => '$1 јули',
+'august-date' => '$1 авгуÑÑ‚',
+'september-date' => '$1 Ñептември',
+'october-date' => '$1 октомври',
+'november-date' => '$1 ноември',
+'december-date' => '$1 декември',
# Categories related messages
'pagecategories' => '{{PLURAL:$1|Категорија|Категории}}',
@@ -475,7 +489,7 @@ $messages = array(
'noindex-category' => 'ÐеиндекÑирани Ñтраници',
'broken-file-category' => 'Страници Ñо прекинати врÑки до податотеки',
-'linkprefix' => '/^(.*?)([a-zA-Z\\x80-\\xff]+)$/sD',
+'linkprefix' => '/^((?>.*(?<![a-zA-Z\\x80-\\xff])))(.+)$/sD',
'about' => 'За {{SITENAME}}',
'article' => 'Статија',
@@ -538,6 +552,7 @@ $messages = array(
'create-this-page' => 'Создај ја оваа Ñтраница',
'delete' => 'Избриши',
'deletethispage' => 'Избриши ја оваа Ñтраница',
+'undeletethispage' => 'обнови ја оваа Ñтраница',
'undelete_short' => 'Врати {{PLURAL:$1|едно уредување|$1 уредувања}}',
'viewdeleted_short' => 'Преглед на {{PLURAL:$1|едно избришано уредување|$1 избришани уредувања}}',
'protect' => 'Заштити',
@@ -581,7 +596,7 @@ $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).
+# 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).
'aboutsite' => 'За {{SITENAME}}',
'aboutpage' => 'Project:За {{SITENAME}}',
'copyright' => 'Содржината е доÑтапна под уÑловите на $1 оÑвен ако не е поинаку наведено.',
@@ -591,7 +606,6 @@ $1',
'disclaimers' => 'УÑлови на употреба',
'disclaimerpage' => 'Project:УÑлови на употреба',
'edithelp' => 'Помош за уредување',
-'edithelppage' => 'Help:Уредување',
'helppage' => 'Help:Содржина',
'mainpage' => 'Главна Ñтраница',
'mainpage-description' => 'Главна Ñтраница',
@@ -622,7 +636,6 @@ $1',
'newmessagesdifflinkplural' => '{{PLURAL:$1|поÑледна промена|поÑледни промени}}',
'youhavenewmessagesmulti' => 'Имате нови пораки на $1',
'editsection' => 'уреди',
-'editsection-brackets' => '[$1]',
'editold' => 'уреди',
'viewsourceold' => 'преглед на кодот',
'editlink' => 'уреди',
@@ -674,17 +687,12 @@ $1',
# General errors
'error' => 'Грешка',
'databaseerror' => 'Грешка во базата',
-'dberrortext' => 'СинтакÑна грешка во барањето до базата.
-Ова може да значи грешка во програмÑката опрема.
-ПоÑледното барање до базата беше:
-<blockquote><code>$1</code></blockquote>
-од функцијата „<code>$2</code>“.
-Базата ја даде грешката „<samp>$3: $4</samp>“.',
-'dberrortextcl' => 'Грешка во барањето до базата.
-ПоÑледното барање до базата беше:
-„$1“
-од функцијата „$2“.
-Вратена е Ñледната грешка „$3: $4“.',
+'databaseerror-text' => 'Се појави грешка во барањето од базата.
+Ова може да значи програмÑка грешка (бубачка).',
+'databaseerror-textcl' => 'Се појави грешка во барањето до базата.',
+'databaseerror-query' => 'Барање: $1',
+'databaseerror-function' => 'Функција: $1',
+'databaseerror-error' => 'Грешка: $1',
'laggedslavemode' => 'Предупредување: Страницата може да не ги Ñодржи Ñкорешните поднови.',
'readonly' => 'Базата е заклучена',
'enterlockreason' => 'ВнеÑете причина за заклучувањето, вклучувајќи и приближно време на отклучување',
@@ -716,6 +724,7 @@ $1',
'cannotdelete-title' => 'Ðе можам да ја избришам Ñтраницата „$1“',
'delete-hook-aborted' => 'Бришењето е прекинато Ñо кука.
Ðе е дадено никакво образложение.',
+'no-null-revision' => 'Ðе можев да направам нова ништовна ревизија на Ñтраницата „$1“',
'badtitle' => 'ÐеиÑправен наÑлов',
'badtitletext' => 'Бараниот наÑлов е грешен, празен или неиÑправно поврзан меѓујазичен или меѓувики наÑлов.
Може да Ñодржи недопуштени знаци.',
@@ -739,12 +748,15 @@ $1',
'editinginterface' => "'''Предупредување:''' Уредувате Ñтраница која е дел од кориÑничкиот поÑредник на програмот МедијаВики.
Промените на оваа Ñтраница ќе предизвикаат промени во кориÑничкиот поÑредник кај другите кориÑници на ова вики.
За да додадете или измените превод на Ñите викија, појдете на [//translatewiki.net/wiki/Main_Page?setlang=mk translatewiki.net] - проектот за локализација на МедијаВики.",
-'sqlhidden' => '(Барањето до SQL е Ñкриено)',
'cascadeprotected' => 'Оваа Ñтраница е заштитена од уредувања бидејќи е вклучена во {{PLURAL:$1|Ñледнава Ñтраница, којашто е заштитена|Ñледниве Ñтраници, коишто Ñе заштитени}} Ñо можноÑта „каÑкадна заштита“:
$2',
'namespaceprotected' => "Ðемате дозвола за уредување Ñтраници во именÑкиот проÑтор '''$1'''.",
'customcssprotected' => 'Ðемате дозвола да ја менувате оваа Ñтраница Ñо CSS бидејќи Ñодржи туѓи лични нагодувања.',
'customjsprotected' => 'Ðемате дозвола да ја менувате оваа Ñтраница Ñо JavaScript бидејќи Ñодржи туѓи лични нагодувања.',
+'mycustomcssprotected' => 'Ðемате дозвола да ја уредувате оваа каÑкадна ÑтилÑка Ñтраница (CSS).',
+'mycustomjsprotected' => 'Ðемате дозвола да ја уредувате оваа Ñтраница Ñо JavaScript.',
+'myprivateinfoprotected' => 'Ðемате дозвола да ги уредувате вашите приватни информации.',
+'mypreferencesprotected' => 'Ðемате дозвола да ги уредувате вашите нагодувања.',
'ns-specialprotected' => 'Специјални Ñтраници не може да Ñе уредуваат.',
'titleprotected' => "Овој наÑлов од Ñтрана на [[User:$1|$1]] е заштитен и не може да Ñе Ñоздаде.
Причината за тоа е: ''$2''.",
@@ -769,10 +781,19 @@ $2',
'welcomecreation-msg' => 'Вашата кориÑничка Ñметка е Ñоздадена.
Ðе заборавајте да ги измените вашите [[Special:Preferences|{{SITENAME}} нагодувања]].',
'yourname' => 'КориÑничко име:',
+'userlogin-yourname' => 'КориÑничко име',
+'userlogin-yourname-ph' => 'ВнеÑете кориÑничко име',
+'createacct-another-username-ph' => 'ВнеÑете кориÑничко име',
'yourpassword' => 'Лозинка:',
+'userlogin-yourpassword' => 'Лозинка',
+'userlogin-yourpassword-ph' => 'ВнеÑете лозинка',
+'createacct-yourpassword-ph' => 'ВнеÑете лозинка',
'yourpasswordagain' => 'Повторете ја лозинката:',
+'createacct-yourpasswordagain' => 'Потврда на лозинката',
+'createacct-yourpasswordagain-ph' => 'Повторно внеÑете ја лозинката',
'remembermypassword' => 'Запомни ме на овој Ñметач (највеќе $1 {{PLURAL:$1|ден|дена}})',
-'securelogin-stick-https' => 'ОÑтанете поврзани Ñо HTTPS по одјавата',
+'userlogin-remembermypassword' => 'Запомни ме',
+'userlogin-signwithsecure' => 'КориÑти безбеден опÑлужувач',
'yourdomainname' => 'Вашиот домен:',
'password-change-forbidden' => 'Ðе можете да ја менувате лозинката на ова вики.',
'externaldberror' => 'ÐаÑтана грешка при надворешното најавување на базата или пак немате дозвола да ја подновите вашата надворешна Ñметка.',
@@ -784,18 +805,44 @@ $2',
'logout' => 'Одјава',
'userlogout' => 'Одјава',
'notloggedin' => 'Ðе Ñте најавени',
+'userlogin-noaccount' => 'Ðемате Ñметка?',
+'userlogin-joinproject' => 'Зачленете Ñе на {{SITENAME}}',
'nologin' => "Ðемате кориÑничка Ñметка? '''$1'''.",
'nologinlink' => 'Ðаправете нова кориÑничка Ñметка',
'createaccount' => 'Ðаправи Ñметка',
'gotaccount' => "Веќе имате кориÑничка Ñметка? '''$1'''.",
'gotaccountlink' => 'Ðајавете Ñе',
'userlogin-resetlink' => 'Си ги заборавивте податоците за најава?',
+'userlogin-resetpassword-link' => 'Смени лозинка',
+'helplogin-url' => 'Help:Ðајава',
+'userlogin-helplink' => '[[{{MediaWiki:helplogin-url}}|Помош Ñо најавата]]',
+'userlogin-loggedin' => 'Веќе Ñте најавени како {{GENDER:$1|$1}}.
+Со образецот подолу можете да Ñе најавите како друг кориÑник.',
+'userlogin-createanother' => 'Ðаправи нова Ñметка',
+'createacct-join' => 'ВнеÑете ваши информации',
+'createacct-another-join' => 'Подолу внеÑете податоци за Ñметката',
+'createacct-emailrequired' => 'Е-пошта',
+'createacct-emailoptional' => 'Е-пошта (незадолжително)',
+'createacct-email-ph' => 'ВнеÑете е-пошта',
+'createacct-another-email-ph' => 'ВнеÑете е-пошта',
'createaccountmail' => 'Дај привремена произволна лозинка и иÑпрати ја на укажаната адреÑа',
+'createacct-realname' => 'ВиÑтинÑко име (незадолжително)',
'createaccountreason' => 'Причина:',
+'createacct-reason' => 'Причина',
+'createacct-reason-ph' => 'Зошто правите друга Ñметка',
+'createacct-captcha' => 'БезбедноÑна проверка',
+'createacct-imgcaptcha-ph' => 'ВнеÑете го гореприкажаниот текÑÑ‚',
+'createacct-submit' => 'Ðаправи ја',
+'createacct-another-submit' => 'Создајте друга Ñметка',
+'createacct-benefit-heading' => '{{SITENAME}} е дело на луѓе како ваÑ.',
+'createacct-benefit-body1' => '{{PLURAL:$1|уредување|уредувања}}',
+'createacct-benefit-body2' => '{{PLURAL:$1|Ñтраница|Ñтраници}}',
+'createacct-benefit-body3' => '{{PLURAL:$1|Ñкорешен учеÑник|Ñкорешни учеÑници}}',
'badretype' => 'ВнеÑените лозинки не Ñе Ñовпаѓаат.',
'userexists' => 'КориÑничкото име што го внеÑовте е зафатено.
Изберете друго име.',
'loginerror' => 'Грешка при најавувањето',
+'createacct-error' => 'Грешка во Ñоздавањето на Ñметката',
'createaccounterror' => 'Ðе можам да ја Ñоздадам Ñметката: $1',
'nocookiesnew' => 'КориÑничката Ñметка е Ñоздадена, но не Ñте најавени.
{{SITENAME}} кориÑти колачиња за најавување на кориÑници.
@@ -859,11 +906,13 @@ $2',
Можете да ја занемарите оваа порака ако Ñметката била направена по грешка.',
'usernamehasherror' => 'КориÑничкото име не може да Ñодржи тараба',
-'login-throttled' => 'Скоро имате направено повеќе обиди за најавување.
-Почекајте малку пред да Ñе обидете повторно.',
+'login-throttled' => 'Имате премногу обиди за најава за кратко време.
+Почекајте $1 пред да Ñе обидете повторно.',
'login-abort-generic' => 'Ðајавата е неуÑпешна - Прекинато',
'loginlanguagelabel' => 'Јазик: $1',
'suspicious-userlogout' => 'Вашето барање за одјава е одбиено бидејќи Ñе чини дека е иÑпратено од раÑипан прелиÑтувач или кеширачки заÑтапник (proxy).',
+'createacct-another-realname-tip' => 'ВиÑтинÑкото име е незадолжително.
+Доколку изберете да го внеÑете, тоа може да Ñе иÑкориÑти за оддавање на заÑлуги за Вашата работа.',
# Email sending
'php-mail-error-unknown' => 'Ðепозната грешка во функцијата mail() на PHP',
@@ -880,8 +929,7 @@ $2',
'newpassword' => 'Ðова лозинка:',
'retypenew' => 'Повторете ја новата лозинка:',
'resetpass_submit' => 'ПоÑтавете лозинка и најавете Ñе',
-'resetpass_success' => 'Вашата лозинка е уÑпешно Ñменета!
-Сега ве најавувам...',
+'changepassword-success' => 'Вашата лозинка е уÑпешно Ñменета!',
'resetpass_forbidden' => 'Лозинките не може да Ñе менуваат',
'resetpass-no-info' => 'Мора да Ñте најавени ако Ñакате да имате директен приÑтап до оваа Ñтраница.',
'resetpass-submit-loggedin' => 'Смени лозинка',
@@ -893,10 +941,11 @@ $2',
# Special:PasswordReset
'passwordreset' => 'Менување на лозинка',
-'passwordreset-text' => 'Пополнете го образецов за да ја измените лозинката.',
+'passwordreset-text-one' => 'Пополнете го образецов за да ја измените лозинката.',
+'passwordreset-text-many' => '{{PLURAL:$1|Пополнете едно од полињата за да ја Ñмените лозинката.}}',
'passwordreset-legend' => 'Ðова лозинка',
'passwordreset-disabled' => 'Ðа ова вики е оневозможено задавање на нова лозинка.',
-'passwordreset-pretext' => '{{PLURAL:$1||Подолу внеÑете еден податок}}',
+'passwordreset-emaildisabled' => 'МожноÑтите за е-пошта Ñе иÑклучени на ова вики',
'passwordreset-username' => 'КориÑничко име:',
'passwordreset-domain' => 'Домен:',
'passwordreset-capture' => 'Да ја прикажам пораката?',
@@ -926,7 +975,7 @@ $2
Привремена лозинка: $2',
'passwordreset-emailsent' => 'ИÑпратено е пиÑмо за измена на лозинката.',
'passwordreset-emailsent-capture' => 'ИÑпратено е пиÑмо за измена на лозинката (прикажано подолу).',
-'passwordreset-emailerror-capture' => 'Создадено е пиÑмо за измена на лозинката (прикажано подолу), но не уÑпеав да го иÑпратам на кориÑникот: $1',
+'passwordreset-emailerror-capture' => 'Создадено е пиÑмо за измена на лозинката (прикажано подолу), но не уÑпеав да го иÑпратам на {{GENDER:$2|кориÑникот}}: $1',
# Special:ChangeEmail
'changeemail' => 'Смени е-пошта',
@@ -940,6 +989,19 @@ $2
'changeemail-submit' => 'Смени е-пошта',
'changeemail-cancel' => 'Откажи',
+# Special:ResetTokens
+'resettokens' => 'Врати одново шифри',
+'resettokens-text' => 'Можете шифрите да ги вратите одново што овозможува приÑтап до извеÑни приватни податоци што Ñе однеÑуваат на вашата овдешна Ñметка.
+
+Ова треба да Ñе направи ако по грешка Ñте Ñподелиле нешто Ñо некого или ако Ñметката ви е изложена на опаÑноÑÑ‚.',
+'resettokens-no-tokens' => 'Ðема шифри за враќање.',
+'resettokens-legend' => 'Враќање одново на шифри',
+'resettokens-tokens' => 'Шифри:',
+'resettokens-token-label' => '$1 (тековна вредноÑÑ‚: $2)',
+'resettokens-watchlist-token' => 'Шифра за каналот (Atom/RSS) на [[Special:Watchlist|измени во набљудуваните Ñтраници]]',
+'resettokens-done' => 'Шифрата е вратена одново.',
+'resettokens-resetbutton' => 'Врати избрани шифри',
+
# Edit page toolbar
'bold_sample' => 'Задебелен текÑÑ‚',
'bold_tip' => 'Задебелен текÑÑ‚',
@@ -1143,12 +1205,15 @@ $2
Веројатно е избришана.',
'edit-conflict' => 'СпротиÑтавеноÑÑ‚ во уредувањето.',
'edit-no-change' => 'Вашите уредувања беа игнорирани, бидејќи не Ñе направени промени врз текÑтот.',
+'postedit-confirmation' => 'Вашето уредување е зачувано.',
'edit-already-exists' => 'Ðе може да Ñе Ñоздаде нова Ñтраница.
ИÑтата веќе поÑтои.',
'defaultmessagetext' => 'ТекÑÑ‚ на пораката по оÑновно',
'content-failed-to-parse' => 'Ðе уÑпеав да ја предадам Ñодржината од типот $2 за моделот $1: $3',
'invalid-content-data' => 'Ðеважечки податоци од Ñодржината',
'content-not-allowed-here' => 'Содржините од моделот „$1“ не Ñе допуштени на Ñтраницата [[$2]]',
+'editwarning-warning' => 'Ðко ја напуштите Ñтраницата ќе ги изгубите Ñите промени кои Ñте ги направиле.
+Ðко Ñте најавени, можете да го иÑклучите ова предупредување во одделот „Уредување“ во вашите нагодувања.',
# Content models
'content-model-wikitext' => 'викитекÑÑ‚',
@@ -1184,6 +1249,7 @@ $2
'undo-failure' => 'Уредувањето не можеше да Ñе откаже заради меѓувремени ÑпротиÑтавени уредувања.',
'undo-norev' => 'Измената не можеше да биде вратена бидејќи не поÑтои или била избришана.',
'undo-summary' => 'Откажано уредувањето $1 на уредникот [[Special:Contributions/$2|$2]] ([[User talk:$2|разговор]])',
+'undo-summary-username-hidden' => 'Поништи ја ревизијата $1 на Ñкриен кориÑник',
# Account creation failure
'cantcreateaccounttitle' => 'Ðе може да Ñе Ñоздаде кориÑничка Ñметка',
@@ -1360,6 +1426,7 @@ $1",
'compareselectedversions' => 'Спореди избрани ревизии',
'showhideselectedversions' => 'Прикажи/Ñкриј избрани ревизии',
'editundo' => 'откажи',
+'diff-empty' => '(нема разлика)',
'diff-multi' => '({{PLURAL:$1|Ðе е прикажана една меѓувремена ревизија|Ðе Ñе прикажани $1 меѓувремени ревизии}} од {{PLURAL:$2|еден кориÑник|$2 кориÑници}})',
'diff-multi-manyusers' => '({{PLURAL:$1|Ðе е прикажана една меѓувремена ревизија направена|Ðе Ñе прикажани $1 меѓувремени ревизии направени}} од повеќе од $2 {{PLURAL:$2|кориÑник|кориÑници}})',
'difference-missing-revision' => 'Ðе пронајдов {{PLURAL:$2|една ревизија|$2 ревизии}} од оваа разлика ($1).
@@ -1387,7 +1454,6 @@ $1",
'searchmenu-legend' => 'Ðагодувања на пребарувањето',
'searchmenu-exists' => "'''Ðа ова вики има Ñтраница Ñо наÑлов „[[:$1]]“'''",
'searchmenu-new' => "Создајте ја Ñтраницата „[[:$1]]“ на ова вики!'''",
-'searchhelp-url' => 'Help:Содржина',
'searchmenu-prefix' => '[[Special:PrefixIndex/$1|ПрелиÑтување на Ñтраници Ñо оваа претÑтавка]]',
'searchprofile-articles' => 'Статии',
'searchprofile-project' => 'Помош и проектни Ñтраници',
@@ -1431,15 +1497,7 @@ $1",
'searchdisabled' => '{{SITENAME}} пребарувањето е оневозможено.
Во меѓувреме, можете да пребарувате преку Google.
Да напоменеме дека нивното индекÑирање на {{SITENAME}} Ñодржините може да биде заÑтарено.',
-
-# Quickbar
-'qbsettings' => 'Лента за брз избор',
-'qbsettings-none' => 'Без мени',
-'qbsettings-fixedleft' => 'Ðеподвижна лево',
-'qbsettings-fixedright' => 'Ðеподвижна деÑно',
-'qbsettings-floatingleft' => 'Променлива лево',
-'qbsettings-floatingright' => 'Променлива деÑно',
-'qbsettings-directionality' => 'Ðепроменливо зададен, во завиÑноÑÑ‚ од наÑоката на пишување на вашиот јазик',
+'search-error' => 'Се појави грешка при пребарувањето: $1',
# Preferences page
'preferences' => 'Ðагодувања',
@@ -1473,7 +1531,6 @@ $1",
'resetprefs' => 'Избриши незачувани измени',
'restoreprefs' => 'Врати Ñè по оÑновно (во Ñите делови)',
'prefs-editing' => 'Уредување',
-'prefs-edit-boxsize' => 'Големина на прозорецот за уредување.',
'rows' => 'Редови:',
'columns' => 'Колони:',
'searchresultshead' => 'Пребарување',
@@ -1484,9 +1541,9 @@ $1",
'recentchangesdays-max' => '(највеќе $1 {{PLURAL:$1|ден|дена}})',
'recentchangescount' => 'Број на уредувања кои ќе Ñе прикажуваат по оÑновно:',
'prefs-help-recentchangescount' => 'Подразбира Ñкорешни промени, иÑтории на Ñтраници и дневници.',
-'prefs-help-watchlist-token' => 'Со внеÑување на тајниот клуч во полево ќе Ñоздадете RSS емитување за вашиот ÑпиÑок на набљудувања.
-Секој што го знае клучот во полево ќе може да го чита вашиот ÑпиÑок на набљудувања, па затоа изберете некоја безбедна вредноÑÑ‚.
-Еве една Ñлучајно-Ñоздадена вредноÑÑ‚ што можете да ја кориÑтите: $1',
+'prefs-help-watchlist-token2' => 'Ова е тајна шифра за вашиот канализиран ÑпиÑок на набљудувања.
+Секој што ја знае ќе може да ја чита, па затоа ви препорачуваме да не ја кажувате никому.
+[[Special:ResetTokens|СтиÑнете тука ако треба да зададете нова]].',
'savedprefs' => 'Вашите нагодувања Ñе зачувани.',
'timezonelegend' => 'ЧаÑовен појаÑ:',
'localtime' => 'Локално време:',
@@ -1516,7 +1573,6 @@ $1",
'prefs-common-css-js' => 'Заеднички CSS/JS за Ñите изгледи:',
'prefs-reset-intro' => 'Може да ја кориÑтите оваа Ñтраница за враќање на вашите нагодувања на оÑновно-зададените нагодувања на викито. Ова дејÑтво е неповратно.',
'prefs-emailconfirm-label' => 'Потврда на е-пошта:',
-'prefs-textboxsize' => 'Големина на полето за уредување',
'youremail' => 'Е-пошта:',
'username' => '{{GENDER:$1|КориÑничко име}}:',
'uid' => '{{GENDER:$1|КориÑнички бр.}}:',
@@ -1551,6 +1607,8 @@ $1",
'prefs-dateformat' => 'Формат на датумот',
'prefs-timeoffset' => 'ВременÑко отÑтапување',
'prefs-advancedediting' => 'Општи можноÑти',
+'prefs-editor' => 'Уредник',
+'prefs-preview' => 'Преглед',
'prefs-advancedrc' => 'Ðапредни нагодувања',
'prefs-advancedrendering' => 'Ðапредни нагодувања',
'prefs-advancedsearchoptions' => 'Ðапредни нагодувања',
@@ -1558,7 +1616,9 @@ $1",
'prefs-displayrc' => 'Ðагодувања на приказот',
'prefs-displaysearchoptions' => 'Ðагодувања на приказот',
'prefs-displaywatchlist' => 'Ðагодувања на приказот',
+'prefs-tokenwatchlist' => 'Шифра',
'prefs-diffs' => 'Разлики',
+'prefs-help-prefershttps' => 'ПоÑтавката ќе Ñе примени Ñледниот пат кога ќе Ñе најавите.',
# User preference: email validation using jQuery
'email-address-validity-valid' => 'ИÑправно',
@@ -1586,6 +1646,8 @@ $1",
'userrights-changeable-col' => 'Групи кои може да ги промените',
'userrights-unchangeable-col' => 'Групи кои не може да ги промените',
'userrights-irreversible-marker' => '$1*',
+'userrights-conflict' => 'СпротиÑтавеноÑÑ‚ во измените на кориÑничките права. Прегледајте ги и потврдете ги.',
+'userrights-removed-self' => 'УÑпешно ги отÑтранивте вашите права. Затоа, повеќе немате приÑтап на Ñтраницава.',
# Groups
'group' => 'Група:',
@@ -1651,11 +1713,19 @@ $1",
'right-proxyunbannable' => 'Заобиколување на автоматÑки блокирања на заÑтапници',
'right-unblockself' => 'СопÑтвено одблокирање',
'right-protect' => 'Менување на Ñтепени на заштита и уредување на каÑкадно заштитени Ñтраници',
-'right-editprotected' => 'Уредување на заштитени Ñтраници (без каÑкадна заштита)',
+'right-editprotected' => 'Уредување на Ñтраници заштитени како „{{int:protect-level-sysop}}“',
+'right-editsemiprotected' => 'Уредување на Ñтраници заштитени како „{{int:protect-level-autoconfirmed}}“',
'right-editinterface' => 'Уредување на кориÑнички поÑредник',
'right-editusercssjs' => 'Уредување на CSS и JS податотеки на други кориÑници',
'right-editusercss' => 'Уредување на CSS податотеки на други кориÑници',
'right-edituserjs' => 'Уредување на JS податотеки на други кориÑници',
+'right-editmyusercss' => 'Уредување на ÑопÑтвени кориÑнички каÑкадни ÑтилÑки податотеки (CSS)',
+'right-editmyuserjs' => 'Уредување на ÑопÑтвени кориÑнички податотеки Ñо JavaScript',
+'right-viewmywatchlist' => 'Преглед на вашиот ÑпиÑок на набљудувања',
+'right-editmywatchlist' => 'Уредување на вашиот ÑпиÑок на набљудувања. ИзвеÑни дејÑтва Ñепак ќе Ñтаваат Ñтраници во ÑпиÑокот и без да го имате ова право.',
+'right-viewmyprivateinfo' => 'Преглед на ÑопÑтвените приватни податоци (на пр. е-пошта, виÑтинÑко име и презиме)',
+'right-editmyprivateinfo' => 'Уредување на ÑопÑтвените приватни податоци (на пр. е-пошта, виÑтинÑко име и презиме)',
+'right-editmyoptions' => 'Уредување на вашите нагодувања',
'right-rollback' => 'Брзо отповикување на уредувањата на поÑледниот кориÑник што уредувал одредена Ñтраница',
'right-markbotedits' => 'Означување на вратени уредувања како ботовÑки уредувања',
'right-noratelimit' => 'Без временÑки ограничувања на уредување',
@@ -1717,12 +1787,19 @@ $1",
'action-userrights-interwiki' => 'уредување на кориÑнички права на кориÑници на други викија',
'action-siteadmin' => 'заклучување или отклучување на базата на податоци',
'action-sendemail' => 'иÑпраќање на е-пошта',
+'action-editmywatchlist' => 'уредување на вашиот ÑпиÑок на набљудувања',
+'action-viewmywatchlist' => 'преглед на вашиот ÑпиÑок на набљудувања',
+'action-viewmyprivateinfo' => 'преглед на вашите приватни податоци',
+'action-editmyprivateinfo' => 'уредување на вашите приватни податоци',
# Recent changes
'nchanges' => '$1 {{PLURAL:$1|промена|промени}}',
+'enhancedrc-since-last-visit' => '$1 {{PLURAL:$1|од поÑледната поÑаета}}',
+'enhancedrc-history' => 'иÑторија',
'recentchanges' => 'Скорешни промени',
'recentchanges-legend' => 'Ðагодувања за Ñкорешни промени',
'recentchanges-summary' => 'Ðа оваа Ñтраница ги Ñледите Ñкорешните промени на викито.',
+'recentchanges-noresult' => 'Ðема промени од дадениот период што одговараат на бараното.',
'recentchanges-feed-description' => 'Следење на најÑкорешните промени на викито во овие емитувања.',
'recentchanges-label-newpage' => 'Ова уредување Ñоздаде нова Ñтраница',
'recentchanges-label-minor' => 'Ова е Ñитна промена',
@@ -1760,7 +1837,6 @@ $1",
'recentchangeslinked-feed' => 'Поврзани промени',
'recentchangeslinked-toolbox' => 'Поврзани промени',
'recentchangeslinked-title' => 'Промени поврзани Ñо „$1“',
-'recentchangeslinked-noresult' => 'Ðема промени на поврзаните Ñтраници во зададениот период.',
'recentchangeslinked-summary' => "Ова е ÑпиÑок на промени направени на Ñтраниците поврзани преку назначената Ñтраница (или до членови на назначената категорија).
Страниците на [[Special:Watchlist|вашиот ÑпиÑок на набљудувања]] Ñе прикажани '''задебелено'''.",
'recentchangeslinked-page' => 'Име на Ñтраницата:',
@@ -1772,7 +1848,7 @@ $1",
'reuploaddesc' => 'Прекини и назад кон образецот за подигање',
'upload-tryagain' => 'ПоднеÑи изменет Ð¾Ð¿Ð¸Ñ Ð½Ð° податотеката',
'uploadnologin' => 'Ðе Ñте најавени',
-'uploadnologintext' => 'Морате да [[Special:UserLogin|Ñе најавите]] за да можете да подигате податотеки.',
+'uploadnologintext' => 'Мора да Ñте $1 за да можете да подигате.',
'upload_directory_missing' => 'Папката за подигање на Ñлики ($1) не поÑтои и не може да биде Ñоздадена од опÑлужувачот.',
'upload_directory_read_only' => 'ОпÑлужувачот не може да запишува во именикот за подигање ($1).',
'uploaderror' => 'Грешка во подигањето',
@@ -2005,7 +2081,6 @@ $1',
'http-read-error' => 'Грешка при читањето на HTTP.',
'http-timed-out' => 'HTTP-барањето иÑтече.',
'http-curl-error' => 'Грешка при добивањето на URL: $1',
-'http-host-unreachable' => 'Ðе можев да приÑтапам до URL-адреÑата',
'http-bad-status' => 'Се појави проблем во текот на обработката на HTTP-барањето: $1 $2',
# Some likely curl errors. More could be added from <http://curl.haxx.se/libcurl/c/libcurl-errors.html>
@@ -2036,6 +2111,10 @@ $1',
'listfiles_size' => 'Големина',
'listfiles_description' => 'ОпиÑ',
'listfiles_count' => 'Верзии',
+'listfiles-show-all' => 'Давај и Ñтари верзии на Ñликите',
+'listfiles-latestversion' => 'Тековна верзија',
+'listfiles-latestversion-yes' => 'Да',
+'listfiles-latestversion-no' => 'Ðе',
# File description page
'file-anchor-link' => 'Податотека',
@@ -2134,6 +2213,13 @@ $1',
'randompage' => 'Случајна Ñтраница',
'randompage-nopages' => 'Ðема Ñтраници во {{PLURAL:$2|Ñледниот именÑки проÑтор|Ñледниве именÑки проÑтори}}: $1.',
+# Random page in category
+'randomincategory' => 'Случајна Ñтраница во категоријата',
+'randomincategory-invalidcategory' => '„$1“ не претÑтавува важечка категорија.',
+'randomincategory-nopages' => 'Ðема Ñтраници во [[:Category:$1]].',
+'randomincategory-selectcategory' => 'Дај Ñлучајна Ñтраница од категоријата: $1 $2.',
+'randomincategory-selectcategory-submit' => 'Оди',
+
# Random redirect
'randomredirect' => 'Случајно пренаÑочување',
'randomredirect-nopages' => 'Ðема пренаÑочувања во именÑкиот проÑтор „$1“.',
@@ -2159,17 +2245,13 @@ $1',
'statistics-users-active-desc' => 'КориÑници кои имаат извршено некое дејÑтво {{PLURAL:$1|претходниот ден|во претходните $1 дена}}',
'statistics-mostpopular' => 'ÐајпоÑетувани Ñтраници',
-'disambiguations' => 'Страници што водат до појаÑнителни Ñтраници',
-'disambiguationspage' => 'Template:ПојаÑнување',
-'disambiguations-text' => "Следните Ñтраници имаат барем по една врÑка што води до '''појаÑнителна Ñтраница'''.
-ÐамеÑто тоа, може да имаат врÑка до поÑоодветна Ñтраница.<br />
-Една Ñтраница Ñе Ñмета за појаÑнителна ако го кориÑти шаблонот што води од [[MediaWiki:Disambiguationspage]]",
-
'pageswithprop' => 'Страници Ñо ÑвојÑтво',
'pageswithprop-legend' => 'Страници Ñо ÑвојÑтво',
'pageswithprop-text' => 'Ðа Ñтраницава Ñе наведени Ñтраници што кориÑтат дадено ÑвојÑтво.',
'pageswithprop-prop' => 'Име на ÑвојÑтвото:',
'pageswithprop-submit' => 'Оди',
+'pageswithprop-prophidden-long' => 'долгата вредноÑÑ‚ на текÑтуалното ÑвојÑтво е Ñкриена ($1)',
+'pageswithprop-prophidden-binary' => 'бинарната вредноÑÑ‚ на ÑвојÑтвото за долгиот текÑÑ‚ е Ñкриена ($1)',
'doubleredirects' => 'Двојни пренаÑочувања',
'doubleredirectstext' => 'Оваа Ñтраница ги прикажува пренаÑочувачките Ñтраници до други пренаÑочувачки Ñтраници.
@@ -2228,6 +2310,7 @@ $1',
'mostrevisions' => 'Статии Ñо најмногу верзии',
'prefixindex' => 'Сите Ñтраници (Ñо претÑтавка)',
'prefixindex-namespace' => 'Сите Ñтраници Ñо Ð¿Ñ€ÐµÑ„Ð¸ÐºÑ (именÑки проÑтор $1)',
+'prefixindex-strip' => 'ОтÑтрани ја претÑтавката во ÑпиÑокот',
'shortpages' => 'Кратки Ñтраници',
'longpages' => 'Долги Ñтраници',
'deadendpages' => 'ЌорÑокак Ñтраници',
@@ -2243,6 +2326,7 @@ $1',
'listusers' => 'СпиÑок на кориÑници',
'listusers-editsonly' => 'Прикажи Ñамо кориÑници кои уредувале',
'listusers-creationsort' => 'Подреди по датум на Ñоздавање',
+'listusers-desc' => 'Подреди по надолен редоÑлед',
'usereditcount' => '$1 {{PLURAL:$1|уредување|уредувања}}',
'usercreated' => '{{GENDER:$3|Создадена}} на $1 во $2 ч.',
'newpages' => 'Ðови Ñтраници',
@@ -2421,10 +2505,9 @@ $1',
'unwatchthispage' => 'ПреÑтани набљудување',
'notanarticle' => 'Ðе е Ñтатија',
'notvisiblerev' => 'Ревизијата била избришана',
-'watchnochange' => 'Ðиту едно од вашите набљудувања не било уредувано во прикажаниот период.',
'watchlist-details' => '{{PLURAL:$1|$1 Ñтраница|$1 Ñтраници}} во вашиот ÑпиÑок на набљудувања, не броејќи ги Ñтраниците за разговор.',
-'wlheader-enotif' => '* ИзвеÑтување по е-пошта е овозможено.',
-'wlheader-showupdated' => "* Страници кои Ñе променети од вашата поÑледна поÑета Ñе прикажани Ñо '''задебелени''' букви",
+'wlheader-enotif' => 'ИзвеÑтувањето по е-пошта е вклучено.',
+'wlheader-showupdated' => "Страниците што Ñе изменети од вашата поÑледна поÑета Ñе прикажани Ñо '''задебелени''' букви",
'watchmethod-recent' => 'Проверка на Ñкорешните уредувања на набљудуваните Ñтраници',
'watchmethod-list' => 'Проверерка на набљудуваните Ñтраници во Ñкорешните уредувања',
'watchlistcontains' => 'Вашиот ÑпиÑок на набљудувања Ñодржи $1 {{PLURAL:$1|Ñтраница|Ñтраници}}.',
@@ -2682,7 +2765,7 @@ $1',
'contributions' => '{{GENDER:$1|КориÑнички}} придонеÑи',
'contributions-title' => 'ПридонеÑи на кориÑникот $1',
'mycontris' => 'придонеÑи',
-'contribsub2' => 'За $1 ($2)',
+'contribsub2' => 'За {{GENDER:$3|$1}} ($2)',
'nocontribs' => 'Ðе Ñе пронајдени промени што одговараат на овој критериум.',
'uctop' => '(тековно)',
'month' => 'Од меÑец (и порано):',
@@ -2841,16 +2924,14 @@ $1',
Таа е блокирана како дел од блокот адреÑи $2, кој не може да Ñе деблокира.',
'ip_range_invalid' => 'Ðеважечки IP дијапазон на адреÑи.',
'ip_range_toolarge' => 'Ðе Ñе дозволени опÑежни блокирања поголеми од /$1.',
-'blockme' => 'Блокирај ме',
'proxyblocker' => 'Блокер на заÑтапници (proxy)',
-'proxyblocker-disabled' => 'Оваа функција е оневозможена.',
'proxyblockreason' => 'Вашата IP-адреÑа е блокирана бидејќи претÑтавува отворен заÑтапник (proxy).
Ве молиме контактирајте Ñо вашиот доÑтавувач на Интернет уÑлуги или техничката поддршка и информирајте ги за овој Ñериозен безбедноÑен проблем.',
-'proxyblocksuccess' => 'Готово.',
'sorbs' => 'DNSBL',
'sorbsreason' => 'Вашата IP-адреÑа е запишана како отворен заÑтапник (proxy) во DNSBL кој го кориÑти {{SITENAME}}..',
'sorbs_create_account_reason' => 'Вашата IP-адреÑа е наведена како отворен заÑтапникот (proxy) во DNSBL кориÑтена од {{SITENAME}}.
Ðе можете да Ñоздадете кориÑничка Ñметка.',
+'xffblockreason' => 'Блокирана е IP-адреÑа приÑутна во заглавието X-Forwarded-For, која е ваша или на заÑтапничкиот опÑлужувач што го кориÑтите. Ðаведеното образложение глаÑи: $1',
'cant-block-while-blocked' => 'Ðе можете да блокирате други кориÑници додека и вие Ñамите Ñте блокирани.',
'cant-see-hidden-user' => 'КориÑникот кој Ñе обидувате да го блокирате е веќе блокиран и Ñокриен. Бидејќи вие немате права за Ñокривање на кориÑник, не можете да ги видите или уредувате кориÑничките блокирања.',
'ipbblocked' => 'Ðе можете да блокирате или одблокирате други кориÑници бидејќи и Ñамите Ñте блокирани',
@@ -3015,6 +3096,8 @@ $1',
'thumbnail-more' => 'Зголеми',
'filemissing' => 'ÐедоÑтаÑува податотека',
'thumbnail_error' => 'Грешка при Ñоздавање на минијатурата: $1',
+'thumbnail_error_remote' => '$1 пријавува грешка:
+$2',
'djvu_page_error' => 'ÐедоÑтапна DjVu Ñтраница',
'djvu_no_xml' => 'Ðе е можно да Ñе излачи XML за DjVu податотеки',
'thumbnail-temp-create' => 'Ðе можам да Ñоздадам привремена податотека на минијатурата',
@@ -3163,20 +3246,15 @@ $1',
'tooltip-undo' => '„Откажи“ го поништува ова уредување и ве ноÑи на уредувањето во режим на преглед. Дава можноÑÑ‚ за наведување на причина во опиÑот.',
'tooltip-preferences-save' => 'Зачувај',
'tooltip-summary' => 'ВнеÑете краток опиÑ',
+'tooltip-iwiki' => '$1 — $2',
# Stylesheets
'common.css' => '/* Тука поÑтавениот CSS ќе Ñе применува врз Ñите рува */',
-'standard.css' => '/* Тука поÑтавениот CSS ќе Ñе применува врз кориÑниците на рувото „Стандардно“ */',
-'nostalgia.css' => '/* Тука поÑтавениот CSS ќе Ñе применува врз кориÑниците на рувото „ÐоÑталгија“ */',
'cologneblue.css' => '/* Тука поÑтавениот CSS ќе Ñе применува врз кориÑниците што го избрале рувото „КелнÑко Ñино“ */',
'monobook.css' => '/* Тука поÑтавениот CSS ќе Ñе применува врз кориÑниците на рувото „Монобук“ */',
-'myskin.css' => '/* Тука поÑтавениот CSS Ñе однеÑува на кориÑниците на рувото „Мое руво“ */',
-'chick.css' => '/* Тука поÑтавениот CSS Ñе однеÑува на кориÑниците на рувото „Шик“ */',
-'simple.css' => '/* Тука поÑтавениот CSS Ñе однеÑува на кориÑниците на рувото „ПроÑто“ */',
'modern.css' => '/* Тука поÑтавениот CSS Ñе однеÑува на кориÑниците на рувото „Современо“ */',
'vector.css' => '/* Тука поÑтавениот CSS Ñе однеÑува на кориÑниците на рувото „ВекторÑко“ */',
'print.css' => '/* Тука поÑтавениот CSS ќе Ñе применува во верзијата за печатење */',
-'handheld.css' => '/* Тука поÑтавениот CSS ќе Ñе применува во рачните уреди Ñо руво прилагодено во $wgHandheldStyle */',
'noscript.css' => '/* Тука поÑтавениот CSS Ñе однеÑува на кориÑниците што имаат оневозможено JavaScript */',
'group-autoconfirmed.css' => '/* Тука поÑтавениот CSS ќе Ñе применува Ñамо на автопотврдените кориÑници */',
'group-bot.css' => '/* Тука поÑтавениот CSS ќе Ñе применува Ñамо врз ботовите */',
@@ -3185,13 +3263,8 @@ $1',
# Scripts
'common.js' => '/* Тука поÑтавениот JavaScript ќе им Ñе вчитува на Ñите кориÑници при отворањето на Ñекоја Ñтраница. */',
-'standard.js' => '/* Тука поÑтавениот JavaScript ќе им Ñе вчитува на кориÑниците што го кориÑтат Ñтандардното руво */',
-'nostalgia.js' => '/* Тука поÑтавениот JavaScript ќе им Ñе вчитува на кориÑниците што го кориÑтат рувото „ÐоÑталгија“ */',
'cologneblue.js' => '/* Тука поÑтавениот JavaScript ќе им Ñе вчитува на кориÑниците што го кориÑтат рувото „КелнÑко Ñино“ */',
'monobook.js' => '/* Тука поÑтавениот JavaScript ќе им Ñе вчитува на кориÑниците што го кориÑтат рувото „Монобук“ */',
-'myskin.js' => '/* Тука поÑтавениот JavaScript ќе им Ñе вчитува на кориÑниците што кориÑтат „Мое руво“ */',
-'chick.js' => '/* Тука поÑтавениот JavaScript ќе им Ñе вчитува на кориÑниците што го кориÑтат рувото „Шик“ */',
-'simple.js' => '/* Тука поÑтавениот JavaScript ќе им Ñе вчитува на кориÑниците што го кориÑтат рувото „ПроÑто“ */',
'modern.js' => '/* Било која Јава Ñкрипта поÑтавена овде ќе биде вчитана за Ñите кориÑници што го кориÑтат рувото Современо */',
'vector.js' => '/* Тука поÑтавениот JavaScript ќе им Ñе вчитува на кориÑниците што го кориÑтат рувото „ВекторÑко“ */',
'group-autoconfirmed.js' => '/* Тука поÑтавениот JavaScript ќе им Ñе вчитува Ñамо на автопотврдените кориÑници */',
@@ -3272,13 +3345,8 @@ $1',
'pageinfo-category-files' => 'Број на податотеки',
# Skin names
-'skinname-standard' => 'КлаÑично',
-'skinname-nostalgia' => 'ÐоÑталгија',
'skinname-cologneblue' => 'КелнÑко Ñино',
'skinname-monobook' => 'Монобук',
-'skinname-myskin' => 'Мое руво',
-'skinname-chick' => 'Шик',
-'skinname-simple' => 'ПроÑто',
'skinname-modern' => 'Современо',
'skinname-vector' => 'ВекторÑко',
@@ -3363,11 +3431,25 @@ $1',
'minutes' => '{{PLURAL:$1|$1 минута|$1 минути}}',
'hours' => '{{PLURAL:$1|$1 чаÑ|$1 чаÑа}}',
'days' => '{{PLURAL:$1|$1 ден|$1 дена}}',
+'weeks' => '{{PLURAL:$1|$1 недела|$1 недели}}',
'months' => '{{PLURAL:$1|$1 меÑец|$1 меÑеци}}',
'years' => '{{PLURAL:$1|$1 година|$1 години}}',
'ago' => 'пред $1',
'just-now' => 'Штотуку',
+# Human-readable timestamps
+'hours-ago' => 'пред $1 {{PLURAL:$1|чаÑ|чаÑа}}',
+'minutes-ago' => 'пред $1 {{PLURAL:$1|минута|минути}}',
+'seconds-ago' => 'пред $1 {{PLURAL:$1|Ñекунда|Ñекунди}}',
+'monday-at' => 'понеделникот во $1',
+'tuesday-at' => 'вторникот во $1',
+'wednesday-at' => 'Ñредата во $1',
+'thursday-at' => 'четвртокот во $1',
+'friday-at' => 'петокот во $1',
+'saturday-at' => 'Ñаботата во $1',
+'sunday-at' => 'неделата во $1',
+'yesterday-at' => 'вчера во $1',
+
# Bad image list
'bad_image_list' => 'Форматот е Ñледниот:
@@ -3439,7 +3521,7 @@ Variants for Chinese language
* gpslongitude
* gpsaltitude',
-# EXIF tags
+# Exif tags
'exif-imagewidth' => 'Ширина',
'exif-imagelength' => 'ВиÑина',
'exif-bitspersample' => 'Длабочина на бојата',
@@ -3619,7 +3701,7 @@ Variants for Chinese language
'exif-originalimageheight' => 'ВиÑина на Ñликата пред каÑтрењето',
'exif-originalimagewidth' => 'Ширина на Ñликата пред каÑтрењето',
-# EXIF attributes
+# Exif attributes
'exif-compression-1' => 'Ðенабиена',
'exif-compression-2' => 'CCITT Група 3 1 — Димензионално изменето Хафманово шифрирање по должина на низите',
'exif-compression-3' => 'CCITT Група 3 — ФакÑ-шифрирање',
@@ -4116,7 +4198,6 @@ $5
'version-other' => 'Друго',
'version-mediahandlers' => 'Ракувачи Ñо мултимедијални Ñодржини',
'version-hooks' => 'Куки',
-'version-extension-functions' => 'Функции на додатоците',
'version-parser-extensiontags' => 'Ознаки за парÑерÑки додатоци',
'version-parser-function-hooks' => 'Куки на парÑерÑките функции',
'version-hook-name' => 'Име на кука',
@@ -4126,6 +4207,7 @@ $5
'version-license' => 'Лиценца',
'version-poweredby-credits' => "Ова вики работи на '''[//www.mediawiki.org/ МедијаВики]''', авторÑки права © 2001-$1 $2.",
'version-poweredby-others' => 'други',
+'version-poweredby-translators' => 'преведувачи на translatewiki.net',
'version-credits-summary' => 'Би Ñакале да им Ñе заблагодариме на Ñледниве лица за нивните придонеÑи кон [[Special:Version|МедијаВики]].',
'version-license-info' => 'МедијаВики е Ñлободна програмÑка опрема; можете да ја редиÑтрибуирате и/или менувате под уÑловите на ГÐУ-овата општа јавна лиценца на Фондацијата за Ñлободна програмÑка опрема; или верзија 2 на Лиценцата, или некоја понова верзија (по ваш избор).
@@ -4141,12 +4223,17 @@ $5
'version-entrypoints-articlepath' => '[https://www.mediawiki.org/wiki/Manual:$wgArticlePath?uselang=mk Статија]',
'version-entrypoints-scriptpath' => '[https://www.mediawiki.org/wiki/Manual:$wgScriptPath?uselang=mk Скрипта]',
-# Special:FilePath
-'filepath' => 'Патека до податотека',
-'filepath-page' => 'Податотека:',
-'filepath-submit' => 'Патека',
-'filepath-summary' => 'Оваа Ñпецијална Ñтраница го враќа целоÑниот пат на податотеката.
-Сликите Ñе прикажани во изворна големина, другите типови на податотеки Ñе отвораат Ñо Ñоодветните програми, директно.',
+# Special:Redirect
+'redirect' => 'ПренаÑочување по податотека, кориÑник или назнака на ревизија',
+'redirect-legend' => 'ПренаÑочување кон податотека или Ñтраница',
+'redirect-summary' => 'Оваа Ñпецијална Ñтраница пренаÑочува кон податотека (Ñе задава името), Ñтраница (Ñе задава назнаката на ревизијата) или кориÑничка Ñтранца (Ñе задава бројчената назнака на кориÑникот).',
+'redirect-submit' => 'Оди',
+'redirect-lookup' => 'Пребарај:',
+'redirect-value' => 'ВредноÑÑ‚:',
+'redirect-user' => 'КориÑничка назнака',
+'redirect-revision' => 'Ревизија на Ñтраницата',
+'redirect-file' => 'Име на податотека',
+'redirect-not-exists' => 'ВредноÑта не е најдена',
# Special:FileDuplicateSearch
'fileduplicatesearch' => 'Барање на дуплирани податотеки',
@@ -4195,12 +4282,16 @@ $5
'tags' => 'Важечки ознаки за менување',
'tag-filter' => '[[Special:Tags|Филтер за ознаки]]:',
'tag-filter-submit' => 'Филтер',
+'tag-list-wrapper' => '([[Special:Tags|{{PLURAL:$1|Ознака|Ознаки}}]]: $2)',
'tags-title' => 'Ознаки',
'tags-intro' => 'Ðа оваа Ñтраница е даден ÑпиÑок на ознаки Ñо кои програмÑката опрема може да ги означи измените и нивното значење.',
'tags-tag' => 'Име на ознака',
'tags-display-header' => 'Изглед во ÑпиÑоците на промени',
'tags-description-header' => 'ЦелоÑен Ð¾Ð¿Ð¸Ñ Ð½Ð° значењето',
+'tags-active-header' => 'Ðктивно?',
'tags-hitcount-header' => 'Означени промени',
+'tags-active-yes' => 'Да',
+'tags-active-no' => 'Ðе',
'tags-edit' => 'уреди',
'tags-hitcount' => '$1 {{PLURAL:$1|промена|промени}}',
@@ -4221,6 +4312,7 @@ $5
'dberr-problems' => 'Жалиме! Ова мрежно меÑто Ñе Ñоочува Ñо технички потешкотии.',
'dberr-again' => 'Почекајте неколку минути и обидете Ñе повторно.',
'dberr-info' => '(Ðе може да Ñе добие опÑлужувачот на базата на податоци: $1)',
+'dberr-info-hidden' => '(Ðе може да Ñе добие опÑлужувачот на базата на податоци)',
'dberr-usegoogle' => 'Во меѓувреме можете да Ñе обидете да пребарувате Ñо Google.',
'dberr-outofdate' => 'Да напоменеме дека нивните индекÑи на нашата Ñодржина можат да бидат заÑтарени.',
'dberr-cachederror' => 'Следнава Ñодржина е кеширана копија на бараната Ñтраница, која може да е заÑтарена.',
@@ -4236,6 +4328,9 @@ $5
'htmlform-submit' => 'ПоднеÑи',
'htmlform-reset' => 'Откажи промени',
'htmlform-selectorother-other' => 'Друго',
+'htmlform-no' => 'Ðе',
+'htmlform-yes' => 'Да',
+'htmlform-chosen-placeholder' => 'Одберете можноÑÑ‚',
# SQLite database support
'sqlite-has-fts' => '$1 Ñо поддршка за пребарување по цели текÑтови',
@@ -4353,4 +4448,19 @@ $5
# Image rotation
'rotate-comment' => 'Сликата е завртена за $1 {{PLURAL:$1|Ñтепен|Ñтепени}} вдеÑно',
+# Limit report
+'limitreport-title' => 'Профилни парÑерÑки податоци:',
+'limitreport-cputime' => 'Употреба на обработувачко време',
+'limitreport-cputime-value' => '$1 {{PLURAL:$1|Ñекунда|Ñекунди}}',
+'limitreport-walltime' => 'Употреба на виÑтинÑко време',
+'limitreport-walltime-value' => '$1 {{PLURAL:$1|Ñекунда|Ñекунди}}',
+'limitreport-ppvisitednodes' => 'Бр. на пројдени јазли од предобработувачот',
+'limitreport-ppgeneratednodes' => 'Бр. на Ñоздадени јазли од предобработувачот',
+'limitreport-postexpandincludesize' => 'Големина на вклученото по проширувањето',
+'limitreport-postexpandincludesize-value' => '$1/$2 {{PLURAL:$2|бајт|бајти}}',
+'limitreport-templateargumentsize' => 'Големина на аргументот во шаблонот',
+'limitreport-templateargumentsize-value' => '$1/$2 {{PLURAL:$2|бајт|бајти}}',
+'limitreport-expansiondepth' => 'Ðајголема длабочина на проширувањето',
+'limitreport-expensivefunctioncount' => 'Бр. на Ñложени парÑерÑки функции',
+
);
diff --git a/languages/messages/MessagesMl.php b/languages/messages/MessagesMl.php
index b80bf70c..d7f57b19 100644
--- a/languages/messages/MessagesMl.php
+++ b/languages/messages/MessagesMl.php
@@ -19,8 +19,10 @@
* @author Krenair
* @author Manjith Joseph <manjithkaini@gmail.com>
* @author Naveen Sankar
+ * @author Nemo bis
* @author Praveen Prakash <me.praveen@gmail.com>
* @author Praveenp
+ * @author Raghith
* @author Sadik Khalid
* @author Sadik Khalid <sadik.khalid@gmail.com>
* @author Santhosh.thottingal
@@ -139,6 +141,7 @@ $specialPageAliases = array(
'Myuploads' => array( 'ഞാൻഅപàµâ€Œà´²àµ‹à´¡àµâ€Œà´šàµ†à´¯àµà´¤à´µ' ),
'Newimages' => array( 'à´ªàµà´¤à´¿à´¯_à´ªàµà´°à´®à´¾à´£à´™àµà´™àµ¾', 'à´ªàµà´¤à´¿à´¯_à´šà´¿à´¤àµà´°à´™àµà´™àµ¾' ),
'Newpages' => array( 'à´ªàµà´¤à´¿à´¯_താളàµà´•àµ¾' ),
+ 'PagesWithProp' => array( 'താളàµà´•à´³àµà´Ÿàµ†à´‰à´³àµà´³à´Ÿà´•àµà´•à´ªàµà´°à´¤àµà´¯àµ‡à´•à´¤à´•àµ¾' ),
'PasswordReset' => array( 'രഹസàµà´¯à´µà´¾à´•àµà´•àµâ€Œâ€Œà´ªàµà´¨à´•àµà´°à´®àµ€à´•à´°à´£à´‚' ),
'PermanentLink' => array( 'à´¸àµà´¥à´¿à´°à´‚à´•à´£àµà´£à´¿' ),
'Popularpages' => array( 'ജനപàµà´°à´¿à´¯à´¤à´¾à´³àµà´•àµ¾' ),
@@ -318,6 +321,7 @@ $magicWords = array(
'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' ),
'formatdate' => array( '0', 'ദിനരേഖീകരണരീതി', 'ദിവസരേഖീകരണരീതി', 'formatdate', 'dateformat' ),
@@ -332,6 +336,8 @@ $magicWords = array(
'pagesincategory_files' => array( '0', 'à´ªàµà´°à´®à´¾à´£à´™àµà´™àµ¾', 'files' ),
);
+$linkTrail = "/^([a-z\x{0D02}-\x{0D7F}]+)(.*)$/sDu";
+
$digitGroupingPattern = "##,##,###";
$messages = array(
@@ -365,9 +371,6 @@ $messages = array(
'tog-shownumberswatching' => 'à´¶àµà´°à´¦àµà´§à´¿à´•àµà´•àµà´¨àµà´¨ ഉപയോകàµà´¤à´¾à´•àµà´•à´³àµà´Ÿàµ† à´Žà´£àµà´£à´‚ കാണികàµà´•àµà´•',
'tog-oldsig' => 'നിലവിലàµà´³àµà´³ à´’à´ªàµà´ªàµ:',
'tog-fancysig' => 'à´’à´ªàµà´ªàµ ഒരൠവികàµà´•à´¿ à´Žà´´àµà´¤àµà´¤à´¾à´¯à´¿ പരിഗണികàµà´•àµà´• (à´•à´£àµà´£à´¿ à´¸àµà´µà´¯à´‚ ചേർകàµà´•àµ‡à´£àµà´Ÿà´¤à´¿à´²àµà´²)',
-'tog-externaleditor' => 'à´¸àµà´µà´¤àµ‡ ബാഹàµà´¯ à´Žà´¡à´¿à´±àµà´±àµ¼ ഉപയോഗികàµà´•àµà´• (വിദഗàµà´¦àµà´§ ഉപയോകàµà´¤à´¾à´•àµà´•àµ¾à´•àµà´•àµ മാതàµà´°à´‚, താങàµà´•à´³àµà´Ÿàµ† à´•à´®àµà´ªàµà´¯àµ‚à´Ÿàµà´Ÿà´±à´¿àµ½ à´ªàµà´°à´¤àµà´¯àµ‡à´• സജàµà´œàµ€à´•à´°à´£à´™àµà´™àµ¾ ആവശàµà´¯à´®à´¾à´£àµ. [//www.mediawiki.org/wiki/Manual:External_editors കൂടàµà´¤àµ½ വിവരങàµà´™àµ¾.])',
-'tog-externaldiff' => 'à´µàµà´¯à´¤àµà´¯à´¾à´¸à´‚ അറിയാൻ à´¸àµà´µà´¤àµ‡ ബാഹàµà´¯ ഉപകരണങàµà´™àµ¾ ഉപയോഗികàµà´•àµà´• (വിദഗàµà´¦àµà´§ ഉപയോകàµà´¤à´¾à´•àµà´•àµ¾à´•àµà´•àµ മാതàµà´°à´‚, താങàµà´•à´³àµà´Ÿàµ† à´•à´®àµà´ªàµà´¯àµ‚à´Ÿàµà´Ÿà´±à´¿àµ½ à´ªàµà´°à´¤àµà´¯àµ‡à´• സജàµà´œàµ€à´•à´°à´£à´™àµà´™àµ¾ ആവശàµà´¯à´®à´¾à´£àµ. [//www.mediawiki.org/wiki/Manual:External_editors കൂടàµà´¤àµ½ വിവരങàµà´™àµ¾.])',
-'tog-showjumplinks' => '"പോവàµà´•" à´—à´®àµà´¯à´¤ à´•à´£àµà´£à´¿à´•àµ¾ à´ªàµà´°à´¾à´ªàµà´¤à´®à´¾à´•àµà´•àµà´•',
'tog-uselivepreview' => 'തതàµà´¸à´®à´¯ à´ªàµà´°à´¿à´µàµà´¯àµ‚ ഉപയോഗപàµà´ªàµ†à´Ÿàµà´¤àµà´¤àµà´• (പരീകàµà´·à´£à´¾à´Ÿà´¿à´¸àµà´¥à´¾à´¨à´‚)',
'tog-forceeditsummary' => 'തിരàµà´¤àµà´¤à´²àµà´•à´³àµà´Ÿàµ† à´šàµà´°àµà´•àµà´•à´‚ നൽകിയിലàµà´²àµ†à´™àµà´•à´¿àµ½ à´Žà´¨àµà´¨àµ† ഓർമàµà´®à´¿à´ªàµà´ªà´¿à´•àµà´•àµà´•',
'tog-watchlisthideown' => 'ഞാൻ à´¶àµà´°à´¦àµà´§à´¿à´•àµà´•àµà´¨àµà´¨ താളàµà´•à´³àµà´Ÿàµ† പടàµà´Ÿà´¿à´•à´¯à´¿àµ½à´¨à´¿à´¨àµà´¨àµ à´Žà´¨àµà´±àµ† തിരàµà´¤àµà´¤à´²àµà´•àµ¾ മറയàµà´•àµà´•àµà´•',
@@ -380,6 +383,8 @@ $messages = array(
'tog-diffonly' => 'à´°à´£àµà´Ÿàµ പതിപàµà´ªàµà´•àµ¾ തമàµà´®à´¿à´²àµà´³àµà´³ à´µàµà´¯à´¤àµà´¯à´¾à´¸à´¤àµà´¤à´¿à´¨àµ താഴെ താളിനàµà´±àµ† ഉളàµà´³à´Ÿà´•àµà´•à´‚ കാണികàµà´•à´°àµà´¤àµ.',
'tog-showhiddencats' => 'മറഞàµà´žà´¿à´°à´¿à´•àµà´•àµà´¨àµà´¨ വർഗàµà´—à´™àµà´™à´³àµ† കാണികàµà´•àµà´•',
'tog-norollbackdiff' => 'റോൾബാകàµà´•à´¿à´¨àµ ശേഷം à´µàµà´¯à´¤àµà´¯à´¾à´¸à´‚ കാണികàµà´•à´¾à´¤à´¿à´°à´¿à´•àµà´•àµà´•',
+'tog-useeditwarning' => 'സേവൠചെയàµà´¯à´¾à´¤àµà´¤ മാറàµà´±à´™àµà´™à´³àµ‹à´Ÿàµ കൂടിയ തിരàµà´¤àµà´¤àµ½ താളിൽ നിനàµà´¨àµà´‚ പോകàµà´®àµà´ªàµ‹àµ¾ à´Žà´¨àµà´¨àµ† അറിയികàµà´•àµà´•',
+'tog-prefershttps' => 'à´ªàµà´°à´µàµ‡à´¶à´¿à´šàµà´šà´¿à´°à´¿à´•àµà´•àµà´®àµà´ªàµ‹àµ¾ à´Žà´ªàµà´ªàµ‹à´´àµà´‚ à´¸àµà´°à´•àµà´·à´¿à´¤à´®à´¾à´¯ കണൿഷൻ ഉപയോഗികàµà´•àµà´•',
'underline-always' => 'à´Žà´²àµà´²à´¾à´¯àµà´ªàµà´ªàµ‹à´´àµà´‚',
'underline-never' => 'à´’à´°à´¿à´•àµà´•à´²àµà´‚ à´…à´°àµà´¤àµ',
@@ -443,6 +448,18 @@ $messages = array(
'oct' => 'à´’à´•àµà´Ÿàµ‹.',
'nov' => 'നവം.',
'dec' => 'ഡിസം.',
+'january-date' => 'ജനàµà´µà´°à´¿ $1',
+'february-date' => 'ഫെബàµà´°àµà´µà´°à´¿ $1',
+'march-date' => 'മാർചàµà´šàµ $1',
+'april-date' => 'à´à´ªàµà´°à´¿àµ½ $1',
+'may-date' => 'മെയൠ$1',
+'june-date' => 'ജൂൺ $1',
+'july-date' => 'ജൂലൈ $1',
+'august-date' => 'à´“à´—à´¸àµà´±àµà´±àµ $1',
+'september-date' => 'സെപàµà´±àµà´±à´‚ബർ $1',
+'october-date' => 'à´’à´•àµà´Ÿàµ‹à´¬àµ¼ $1',
+'november-date' => 'നവംബർ $1',
+'december-date' => 'ഡിസംബർ $1',
# Categories related messages
'pagecategories' => '{{PLURAL:$1|വർഗàµà´—à´‚|വർഗàµà´—à´™àµà´™àµ¾}}',
@@ -524,6 +541,7 @@ $messages = array(
'create-this-page' => 'à´ˆ താൾ സൃഷàµà´Ÿà´¿à´•àµà´•àµà´•',
'delete' => 'മായàµà´•àµà´•àµà´•',
'deletethispage' => 'à´ˆ താൾ നീകàµà´•à´‚ ചെയàµà´¯àµà´•',
+'undeletethispage' => 'à´ˆ താൾ à´ªàµà´¨à´ƒà´¸àµà´¥à´¾à´ªà´¿à´•àµà´•àµà´•',
'undelete_short' => '{{PLURAL:$1|ഒരൠതിരàµà´¤àµà´¤àµ½|$1 തിരàµà´¤àµà´¤à´²àµà´•àµ¾}} à´ªàµà´¨à´ƒà´¸àµà´¥à´¾à´ªà´¿à´•àµà´•àµà´•',
'viewdeleted_short' => '{{PLURAL:$1|മായàµà´•àµà´•à´ªàµà´ªàµ†à´Ÿàµà´Ÿ ഒരൠതിരàµà´¤àµà´¤àµ½|മായàµà´•àµà´•à´ªàµà´ªàµ†à´Ÿàµà´Ÿ $1 തിരàµà´¤àµà´¤à´²àµà´•àµ¾}} കാണàµà´•',
'protect' => 'സം‌രകàµà´·à´¿à´•àµà´•àµà´•',
@@ -567,7 +585,7 @@ $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).
+# 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).
'aboutsite' => '{{SITENAME}} സം‌രംഭതàµà´¤àµ†à´•àµà´•àµà´±à´¿à´šàµà´šàµ',
'aboutpage' => 'Project:വിവരണം',
'copyright' => 'à´ªàµà´°à´¤àµà´¯àµ‡à´•à´‚ പറയാതàµà´¤ പകàµà´·à´‚ ഉളàµà´³à´Ÿà´•àµà´•à´‚ $1 à´ªàµà´°à´•à´¾à´°à´‚ ലഭàµà´¯à´‚.',
@@ -577,7 +595,6 @@ $1',
'disclaimers' => 'നിരാകരണങàµà´™àµ¾',
'disclaimerpage' => 'Project:പൊതàµà´¨à´¿à´°à´¾à´•à´°à´£à´‚',
'edithelp' => 'തിരàµà´¤àµà´¤àµ½ സഹായി',
-'edithelppage' => 'Help:തിരàµà´¤àµà´¤àµ½ വഴികാടàµà´Ÿà´¿',
'helppage' => 'Help:ഉളàµà´³à´Ÿà´•àµà´•à´‚',
'mainpage' => 'à´ªàµà´°à´§à´¾à´¨ താൾ',
'mainpage-description' => 'à´ªàµà´°à´§à´¾à´¨ താൾ',
@@ -655,17 +672,12 @@ $1',
# General errors
'error' => 'പിഴവàµ',
'databaseerror' => 'ഡാറàµà´±à´¾à´¬àµ‡à´¸àµ പിഴവàµ',
-'dberrortext' => 'ഒരൠവിവരശേഖര à´…à´¨àµà´µàµ‡à´·à´£à´¤àµà´¤à´¿à´¨àµà´±àµ† ഉപയോഗകàµà´°à´®à´¤àµà´¤à´¿àµ½ പിഴവൠസംഭവിചàµà´šà´¿à´°à´¿à´•àµà´•àµà´¨àµà´¨àµ.
-ഇതൠചിലപàµà´ªàµ‹àµ¾ സോഫàµà´±àµà´±àµâ€Œà´µàµ†à´¯àµ¼ ബഗàµà´—ിനെ സൂചിപàµà´ªà´¿à´•àµà´•àµà´¨àµà´¨à´¤à´¾à´µà´¾à´‚.
-അവസാനം à´¶àµà´°à´®à´¿à´šàµà´š വിവരശേഖര à´…à´¨àµà´µàµ‡à´·à´£à´‚ താഴെ കൊടàµà´•àµà´•àµà´¨àµà´¨àµ:
-<blockquote><code>$1</code></blockquote>
-"<code>$2</code>" à´Žà´¨àµà´¨ നിർദàµà´¦àµ‡à´¶à´¤àµà´¤à´¿à´¨à´•à´¤àµà´¤àµ നിനàµà´¨àµà´‚.
-വിവരശേഖരതàµà´¤à´¿àµ½ നിനàµà´¨àµà´‚ ലഭിചàµà´š പിഴവൠ"<tt>$3: $4</tt>".',
-'dberrortextcl' => 'വിവരശേഖര à´…à´¨àµà´µàµ‡à´·à´£ ഘടനയിൽ ഒരൠപിഴവൠസംഭവിചàµà´šà´¿à´°à´¿à´•àµà´•àµà´¨àµà´¨àµ.
-അവസാനം à´¶àµà´°à´®à´¿à´šàµà´š വിവരശേഖര à´…à´¨àµà´µàµ‡à´·à´£à´‚ താഴെ കൊടàµà´•àµà´•àµà´¨àµà´¨àµ:
-"$1"
-"$2" à´Žà´¨àµà´¨ നിർദàµà´¦àµ‡à´¶à´¤àµà´¤à´¿à´¨à´•à´¤àµà´¤àµ നിനàµà´¨àµà´‚ .
-വിവരശേഖരതàµà´¤à´¿àµ½ നിനàµà´¨àµà´‚ ലഭിചàµà´š പിഴവൠ"$3: $4"',
+'databaseerror-text' => 'ഡേറàµà´±à´¾à´¬àµ‡à´¸àµ à´•àµà´µà´±à´¿ പിഴവൠസംഭവിചàµà´šà´¿à´°à´¿à´•àµà´•àµà´¨àµà´¨àµ.
+ഇതിനർതàµà´¥à´‚ സോഫàµà´±àµà´±àµâ€Œà´µàµ‡à´±à´¿àµ½ ബഗൠഉണàµà´Ÿàµ†à´¨àµà´¨à´¾à´£àµ.',
+'databaseerror-textcl' => 'ഒരൠഡേറàµà´±à´¾à´¬àµ‡à´¸àµ à´•àµà´µà´±à´¿ പിഴവൠസംഭവിചàµà´šà´¿à´°à´¿à´•àµà´•àµà´¨àµà´¨àµ.',
+'databaseerror-query' => 'à´•àµà´µà´±à´¿: $1',
+'databaseerror-function' => 'à´«à´™àµà´·àµ»: $1',
+'databaseerror-error' => 'പിഴവàµ: $1',
'laggedslavemode' => 'à´®àµà´¨àµà´¨à´±à´¿à´¯à´¿à´ªàµà´ªàµ: താളിൽ à´…à´Ÿàµà´¤àµà´¤à´•à´¾à´²à´¤àµà´¤àµ വരàµà´¤àµà´¤à´¿à´¯ à´ªàµà´¤àµà´•àµà´•à´²àµà´•àµ¾ ഉണàµà´Ÿà´¾à´µà´£à´®àµ†à´¨àµà´¨à´¿à´²àµà´².',
'readonly' => 'ഡാറàµà´±à´¾à´¬àµ‡à´¸àµ ബനàµà´§à´¿à´šàµà´šà´¿à´°à´¿à´•àµà´•àµà´¨àµà´¨àµ',
'enterlockreason' => 'ഡാറàµà´±à´¾à´¬àµ‡à´¸àµ ബനàµà´§à´¿à´•àµà´•àµà´µà´¾à´¨àµà´³àµà´³ കാരണം സൂചിപàµà´ªà´¿à´•àµà´•àµà´•. അതോടൊപàµà´ªà´‚ à´Žà´ªàµà´ªàµ‹à´´à´¾à´£àµâ€Œ ബനàµà´§à´¨à´‚ à´…à´´à´¿à´•àµà´•àµà´µà´¾àµ» ഉദàµà´¦àµ‡à´¶à´¿à´•àµà´•àµà´¨àµà´¨à´¤àµ†à´¨àµà´¨àµà´‚ രേഖപàµà´ªàµ†à´Ÿàµà´¤àµà´¤àµà´•.',
@@ -699,6 +711,7 @@ $1',
'cannotdelete-title' => '"$1" à´Žà´¨àµà´¨ താൾ മായàµà´•àµà´•à´¾àµ» കഴിയിലàµà´²',
'delete-hook-aborted' => 'മായàµà´•àµà´•àµ½ കൊളàµà´¤àµà´¤à´¿à´¨à´¾àµ½ റദàµà´¦à´¾à´•àµà´•à´¿à´¯à´¿à´°à´¿à´•àµà´•àµà´¨àµà´¨àµ.
വിശദീകരണമൊനàµà´¨àµà´‚ നൽകിയിടàµà´Ÿà´¿à´²àµà´².',
+'no-null-revision' => '"$1" à´Žà´¨àµà´¨ താളിനൠപàµà´¤à´¿à´¯ ശൂനàµà´¯à´®à´¾à´¯ മാറàµà´±à´®àµà´³àµà´³ നാൾപàµà´ªà´¤à´¿à´ªàµà´ªàµ സൃഷàµà´Ÿà´¿à´•àµà´•à´¾àµ» à´•à´´à´¿à´žàµà´žà´¿à´²àµà´²',
'badtitle' => 'അസാധàµà´µà´¾à´¯ തലകàµà´•àµ†à´Ÿàµà´Ÿàµ',
'badtitletext' => 'താങàµà´•àµ¾ ആവശàµà´¯à´ªàµà´ªàµ†à´Ÿàµà´Ÿ തലകàµà´•àµ†à´Ÿàµà´Ÿàµà´³àµà´³ ഒരൠതാൾ നിലവിലിലàµà´². ഇതൠതെറàµà´±à´¾à´¯à´¿ à´…à´¨àµà´¤àµ¼à´­à´¾à´·à´¾/à´…à´¨àµà´¤àµ¼à´µà´¿à´•àµà´•à´¿ à´•à´£àµà´£à´¿ ചെയàµà´¯à´ªàµà´ªàµ†à´Ÿàµà´Ÿà´¤àµ മൂലമോ, തലകàµà´•àµ†à´Ÿàµà´Ÿà´¿àµ½ ഉപയോഗികàµà´•à´°àµà´¤à´¾à´¤àµà´¤ à´…à´•àµà´·à´°à´°àµ‚പങàµà´™àµ¾ ഉപയോഗിചàµà´šà´¤àµ മൂലമോ സംഭവിചàµà´šà´¤à´¾à´¯à´¿à´°à´¿à´•àµà´•à´¾à´‚.',
'perfcached' => 'താഴെ കൊടàµà´¤àµà´¤à´¿à´°à´¿à´•àµà´•àµà´¨àµà´¨ വിവരം ശേഖരിചàµà´šàµ വെചàµà´šà´¿à´°à´¿à´•àµà´•àµà´¨àµà´¨à´¤à´¾à´£àµ, à´…à´¤àµà´•àµŠà´£àµà´Ÿàµ ചിലപàµà´ªàµ‹àµ¾ à´ªàµà´¤à´¿à´¯à´¤à´¾à´¯à´¿à´°à´¿à´•àµà´•à´£à´®àµ†à´¨àµà´¨à´¿à´²àµà´². പരമാവധി {{PLURAL:$1|ഒരൠഫലം|$1 ഫലങàµà´™àµ¾}} ശേഖരിചàµà´šàµà´µàµ†à´šàµà´šà´¿à´°à´¿à´•àµà´•àµà´¨àµà´¨à´µà´¯à´¿àµ½ ഉണàµà´Ÿàµ.',
@@ -718,12 +731,15 @@ $1',
'editinginterface' => "'''à´®àµà´¨àµà´¨à´±à´¿à´¯à´¿à´ªàµà´ªàµ:''' സോഫàµà´±àµà´±àµâ€Œà´µàµ†à´¯à´±à´¿àµ½ സമàµà´ªàµ¼à´•àµà´•à´®àµà´–à´‚ നിലനിർതàµà´¤àµà´¨àµà´¨ താളാണൠതാങàµà´•àµ¾ തിരàµà´¤àµà´¤àµà´µà´¾àµ» പോകàµà´¨àµà´¨à´¤àµ.
à´ˆ താളിൽ താങàµà´•àµ¾ വരàµà´¤àµà´¤àµà´¨àµà´¨ മാറàµà´±à´™àµà´™àµ¾ ഉപയോകàµà´¤à´¾à´•àµà´•àµ¾ വികàµà´•à´¿ കാണàµà´¨àµà´¨ വിധതàµà´¤àµ† മാറàµà´±à´¿à´®à´±à´¿à´šàµà´šàµ‡à´•àµà´•à´¾à´‚.
മീഡിയവികàµà´•à´¿ സനàµà´¦àµ‡à´¶à´™àµà´™à´³àµà´Ÿàµ† പരിഭാഷകൾ കൂടàµà´Ÿà´¿à´šàµà´šàµ‡àµ¼à´•àµà´•à´¾à´¨àµà´‚ മാറàµà´±à´‚വരàµà´¤àµà´¤à´¾à´¨àµà´‚ മീഡിയവികàµà´•à´¿ സനàµà´¦àµ‡à´¶à´™àµà´™à´³àµà´Ÿàµ† à´ªàµà´°à´¾à´¦àµ‡à´¶à´¿à´•à´µà´¤àµà´•à´°à´£ പദàµà´§à´¤à´¿à´¯à´¾à´¯ [//translatewiki.net/ translatewiki.net] ഉപയോഗികàµà´•àµà´µà´¾àµ» താലàµà´ªà´°àµà´¯à´ªàµà´ªàµ†à´Ÿàµà´¨àµà´¨àµ.",
-'sqlhidden' => '(à´Žà´¸àµ.à´•àµà´¯àµ.എൽ. à´•àµà´µà´±à´¿ മറചàµà´šà´¿à´°à´¿à´•àµà´•àµà´¨àµà´¨àµ)',
'cascadeprotected' => 'നിർà´à´°à´¿à´¤ (cascading) സൗകരàµà´¯à´‚ ഉപയോഗിചàµà´šàµ തിരàµà´¤àµà´¤àµ½ നടതàµà´¤àµà´¨àµà´¨à´¤à´¿à´¨àµ സം‌രകàµà´·à´£à´‚ à´àµ¼à´ªàµà´ªàµ†à´Ÿàµà´¤àµà´¤à´¿à´¯à´¿à´Ÿàµà´Ÿàµà´³àµà´³ {{PLURAL:$1|താഴെ കൊടàµà´¤àµà´¤à´¿à´Ÿàµà´Ÿàµà´³àµà´³ താളിനàµà´±àµ†|താഴെ കൊടàµà´¤àµà´¤à´¿à´Ÿàµà´Ÿàµà´³àµà´³ താളàµà´•à´³àµà´Ÿàµ†}} ഭാഗമാണàµâ€Œ à´ˆ താൾ. അതിനാൽ à´ˆ താൾ തിരàµà´¤àµà´¤àµà´µà´¾àµ» സാധികàµà´•à´¿à´²àµà´²:
$2',
'namespaceprotected' => "'''$1''' നാമമേഖലയിലàµà´³àµà´³ താളàµà´•àµ¾ തിരàµà´¤àµà´¤à´¾àµ» താങàµà´•àµ¾à´•àµà´•àµ à´…à´¨àµà´µà´¾à´¦à´®à´¿à´²àµà´².",
'customcssprotected' => 'à´ˆ സി.à´Žà´¸àµ.à´Žà´¸àµ. താളിൽ മറàµà´±àµŠà´°àµ ഉപയോകàµà´¤à´¾à´µà´¿à´¨àµà´±àµ† à´¸àµà´µà´•à´¾à´°àµà´¯à´¸à´œàµà´œàµ€à´•à´°à´£à´™àµà´™àµ¾ ഉൾകàµà´•àµŠà´³àµà´³àµà´¨àµà´¨àµ, അതിനാൽ താങàµà´•àµ¾à´•àµà´•àµ à´ˆ താൾ തിരàµà´¤àµà´¤à´¾àµ» à´…à´¨àµà´µà´¾à´¦à´®à´¿à´²àµà´².',
'customjsprotected' => 'à´ˆ ജാവാസàµà´•àµà´°à´¿à´ªàµà´±àµà´±àµ താളിൽ മറàµà´±àµŠà´°àµ ഉപയോകàµà´¤à´¾à´µà´¿à´¨àµà´±àµ† à´¸àµà´µà´•à´¾à´°àµà´¯à´¸à´œàµà´œàµ€à´•à´°à´£à´™àµà´™àµ¾ ഉൾകàµà´•àµŠà´³àµà´³àµà´¨àµà´¨àµ, അതിനാൽ താങàµà´•àµ¾à´•àµà´•àµ à´ˆ താൾ തിരàµà´¤àµà´¤à´¾àµ» à´…à´¨àµà´µà´¾à´¦à´®à´¿à´²àµà´².',
+'mycustomcssprotected' => 'à´ˆ സി.à´Žà´¸àµ.à´Žà´¸àµ. താൾ തിരàµà´¤àµà´¤à´¾à´¨àµà´³àµà´³ à´…à´¨àµà´®à´¤à´¿ താങàµà´•àµ¾à´•àµà´•à´¿à´²àµà´².',
+'mycustomjsprotected' => 'à´ˆ ജാവാസàµà´•àµà´°à´¿à´ªàµà´±àµà´±àµ താൾ തിരàµà´¤àµà´¤à´¾à´¨àµà´³àµà´³ à´…à´¨àµà´®à´¤à´¿ താങàµà´•àµ¾à´•àµà´•à´¿à´²àµà´².',
+'myprivateinfoprotected' => 'താങàµà´•àµ¾à´•àµà´•àµ à´¸àµà´µà´¨àµà´¤à´‚ à´¸àµà´µà´•à´¾à´°àµà´¯à´µà´¿à´µà´°à´™àµà´™àµ¾ തിരàµà´¤àµà´¤àµà´µà´¾à´¨àµà´³àµà´³ à´…à´¨àµà´®à´¤à´¿à´¯à´¿à´²àµà´².',
+'mypreferencesprotected' => 'താങàµà´•àµ¾à´•àµà´•àµ à´¸àµà´µà´¨àµà´¤à´‚ à´•àµà´°à´®àµ€à´•à´°à´£à´™àµà´™àµ¾ തിരàµà´¤àµà´¤àµà´µà´¾à´¨àµà´³àµà´³ à´…à´¨àµà´®à´¤à´¿à´¯à´¿à´²àµà´².',
'ns-specialprotected' => 'à´ªàµà´°à´¤àµà´¯àµ‡à´•à´‚ à´Žà´¨àµà´¨ നാമമേഖലയിൽ വരàµà´¨àµà´¨ താളàµà´•àµ¾ തിരàµà´¤àµà´¤à´¾à´¨à´¾à´µàµà´¨àµà´¨à´µà´¯à´²àµà´².',
'titleprotected' => "[[User:$1|$1]] à´Žà´¨àµà´¨ ഉപയോകàµà´¤à´¾à´µàµ à´ˆ താൾ ഉണàµà´Ÿà´¾à´•àµà´•àµà´¨àµà´¨à´¤àµ നിരോധിചàµà´šà´¿à´°à´¿à´•àµà´•àµà´¨àµà´¨àµ.
''$2'' à´Žà´¨àµà´¨à´¤à´¾à´£àµ അതിനൠകാണിചàµà´šà´¿à´Ÿàµà´Ÿàµà´³àµà´³ കാരണം.",
@@ -748,10 +764,19 @@ $2',
'welcomecreation-msg' => 'താങàµà´•à´³àµà´Ÿàµ† à´…à´‚à´—à´¤àµà´µà´‚ സൃഷàµà´Ÿà´¿à´•àµà´•à´ªàµà´ªàµ†à´Ÿàµà´Ÿà´¿à´°à´¿à´•àµà´•àµà´¨àµà´¨àµ.
താങàµà´•à´³àµà´Ÿàµ† [[Special:Preferences|{{SITENAME}} à´•àµà´°à´®àµ€à´•à´°à´£à´™àµà´™à´³à´¿àµ½]] മാറàµà´±à´‚ വരàµà´¤àµà´¤à´¾àµ» മറകàµà´•à´°àµà´¤àµ.',
'yourname' => 'ഉപയോകàµà´¤àµƒà´¨à´¾à´®à´‚:',
+'userlogin-yourname' => 'ഉപയോകàµà´¤àµƒà´¨à´¾à´®à´‚',
+'userlogin-yourname-ph' => 'താങàµà´•à´³àµà´Ÿàµ† ഉപയോകàµà´¤àµƒà´¨à´¾à´®à´‚ നൽകàµà´•',
+'createacct-another-username-ph' => 'ഉപയോകàµà´¤àµƒà´¨à´¾à´®à´‚ നൽകàµà´•',
'yourpassword' => 'രഹസàµà´¯à´µà´¾à´•àµà´•àµ:',
+'userlogin-yourpassword' => 'രഹസàµà´¯à´µà´¾à´•àµà´•àµ',
+'userlogin-yourpassword-ph' => 'താങàµà´•à´³àµà´Ÿàµ† രഹസàµà´¯à´µà´¾à´•àµà´•àµ നൽകàµà´•',
+'createacct-yourpassword-ph' => 'ഒരൠരഹസàµà´¯à´µà´¾à´•àµà´•àµ നൽകàµà´•',
'yourpasswordagain' => 'രഹസàµà´¯à´µà´¾à´•àµà´•àµ à´’à´°à´¿à´•àµà´•àµ½à´•àµà´•àµ‚à´Ÿà´¿:',
+'createacct-yourpasswordagain' => 'രഹസàµà´¯à´µà´¾à´•àµà´•àµ à´¸àµà´¥à´¿à´°àµ€à´•à´°à´¿à´•àµà´•àµà´•',
+'createacct-yourpasswordagain-ph' => 'രഹസàµà´¯à´µà´¾à´•àµà´•àµ വീണàµà´Ÿàµà´‚ നൽകàµà´•',
'remembermypassword' => 'à´Žà´¨àµà´±àµ† à´ªàµà´°à´µàµ‡à´¶à´¨à´‚ à´ˆ à´¬àµà´°àµ—സറിൽ ({{PLURAL:$1|ഒരൠദിവസം|$1 ദിവസം}}) ഓർതàµà´¤àµà´µàµ†à´•àµà´•àµà´•',
-'securelogin-stick-https' => 'à´ªàµà´°à´µàµ‡à´¶à´¨à´¤àµà´¤à´¿à´¨àµ ശേഷവàµà´‚ à´Žà´šàµà´šàµ.à´±àµà´±à´¿.à´±àµà´±à´¿.പി.à´Žà´¸àµ. തനàµà´¨àµ† ഉപയോഗികàµà´•àµà´•',
+'userlogin-remembermypassword' => 'ഞാൻ à´ªàµà´°à´µàµ‡à´¶à´¿à´šàµà´šà´¤à´¾à´¯à´¿ തനàµà´¨àµ† നിലനിർതàµà´¤àµà´•',
+'userlogin-signwithsecure' => 'à´¸àµà´°à´•àµà´·à´¿à´¤ കണകàµà´·àµ» ഉപയോഗികàµà´•àµà´•',
'yourdomainname' => 'താങàµà´•à´³àµà´Ÿàµ† ഡൊമെയിൻ:',
'password-change-forbidden' => 'à´ˆ വികàµà´•à´¿à´¯à´¿àµ½ രഹസàµà´¯à´µà´¾à´•àµà´•àµà´•àµ¾ മാറàµà´±à´¾à´¨à´¾à´µà´¿à´²àµà´².',
'externaldberror' => 'à´’à´¨àµà´¨àµà´•à´¿àµ½ ഡേറàµà´±à´¾à´¬àµ‡à´¸àµ സാധൂകരണതàµà´¤à´¿àµ½ à´ªàµà´°à´¶àµà´¨à´‚ ഉണàµà´Ÿà´¾à´¯à´¿à´°àµà´¨àµà´¨àµ à´…à´²àµà´²àµ†à´™àµà´•à´¿àµ½ നവീകരികàµà´•àµà´µà´¾àµ» താങàµà´•à´³àµà´Ÿàµ† ബാഹàµà´¯ à´…à´‚à´—à´¤àµà´µà´‚ താങàµà´•à´³àµ† à´…à´¨àµà´µà´¦à´¿à´•àµà´•àµà´¨àµà´¨à´¿à´²àµà´².',
@@ -763,18 +788,44 @@ $2',
'logout' => 'ലോഗൗടàµà´Ÿàµ',
'userlogout' => 'ലോഗൗടàµà´Ÿàµ',
'notloggedin' => 'à´ªàµà´°à´µàµ‡à´¶à´¿à´šàµà´šà´¿à´Ÿàµà´Ÿà´¿à´²àµà´²',
+'userlogin-noaccount' => 'à´…à´‚à´—à´¤àµà´µà´®à´¿à´²àµà´²àµ‡?',
+'userlogin-joinproject' => '{{SITENAME}} സം‌രംഭതàµà´¤à´¿àµ½ ചേരàµà´•',
'nologin' => "à´…à´‚à´—à´¤àµà´µà´®à´¿à´²àµà´²àµ‡? '''$1'''.",
'nologinlink' => 'à´’à´°à´‚à´—à´¤àµà´µà´®àµ†à´Ÿàµà´•àµà´•àµà´•',
'createaccount' => 'à´…à´‚à´—à´¤àµà´µà´®àµ†à´Ÿàµà´•àµà´•àµà´•',
'gotaccount' => "താങàµà´•àµ¾à´•àµà´•àµ à´…à´‚à´—à´¤àµà´µà´®àµà´£àµà´Ÿàµ‹? '''$1'''.",
'gotaccountlink' => 'à´ªàµà´°à´µàµ‡à´¶à´¿à´•àµà´•àµà´•',
'userlogin-resetlink' => 'താങàµà´•à´³àµà´Ÿàµ† ലോഗിൻ വിവരങàµà´™àµ¾ മറനàµà´¨àµ പോയോ?',
+'userlogin-resetpassword-link' => 'താങàµà´•à´³àµà´Ÿàµ† രഹസàµà´¯à´µà´¾à´•àµà´•àµ à´ªàµà´¨à´ƒà´¸à´œàµà´œàµ€à´•à´°à´¿à´•àµà´•àµà´•',
+'helplogin-url' => 'Help:à´ªàµà´°à´µàµ‡à´¶à´¨à´‚',
+'userlogin-helplink' => '[[{{MediaWiki:helplogin-url}}|à´ªàµà´°à´µàµ‡à´¶à´¨ സഹായം]]',
+'userlogin-loggedin' => 'താങàµà´•àµ¾ ഇപàµà´ªàµ‹àµ¾ തനàµà´¨àµ† {{GENDER:$1|$1}} ആയി à´ªàµà´°à´µàµ‡à´¶à´¿à´šàµà´šà´¿à´°à´¿à´•àµà´•àµà´¨àµà´¨àµ.
+താഴെ ഉളàµà´³ ഫോം ഉപയോഗിചàµà´šàµ മറàµà´±àµŠà´°àµ ഉപയോകàµà´¤à´¾à´µà´¾à´¯à´¿ à´ªàµà´°à´µàµ‡à´¶à´¿à´•àµà´•à´¾à´µàµà´¨àµà´¨à´¤à´¾à´£àµ.',
+'userlogin-createanother' => 'മറàµà´±àµŠà´°àµ à´…à´‚à´—à´¤àµà´µà´®àµ†à´Ÿàµà´•àµà´•àµà´•',
+'createacct-join' => 'താങàµà´•à´³àµ†à´ªàµà´ªà´±àµà´±à´¿à´¯àµà´³àµà´³ വിവരങàµà´™àµ¾ താഴെ നൽകàµà´•.',
+'createacct-another-join' => 'à´ªàµà´¤à´¿à´¯ à´…à´‚à´—à´¤àµà´µà´¤àµà´¤à´¿à´¨àµà´±àµ† വിവരങàµà´™àµ¾ താഴെ നൽകàµà´•.',
+'createacct-emailrequired' => 'ഇമെയിൽ വിലാസം',
+'createacct-emailoptional' => 'ഇമെയിൽ വിലാസം (നിർബനàµà´§à´®à´¿à´²àµà´²)',
+'createacct-email-ph' => 'താങàµà´•à´³àµà´Ÿàµ† ഇമെയിൽ വിലാസം നൽകàµà´•',
+'createacct-another-email-ph' => 'ഇമെയിൽ വിലാസം നൽകàµà´•',
'createaccountmail' => 'തൽകàµà´•à´¾à´²à´‚ à´•àµà´°à´®à´°à´¹à´¿à´¤à´®à´¾à´¯à´¿ സൃഷàµà´Ÿà´¿à´šàµà´š ഒരൠരഹസàµà´¯à´µà´¾à´•àµà´•àµ ഉപയോഗികàµà´•àµà´•à´¯àµà´‚ അതൠതനàµà´¨à´¿à´°à´¿à´•àµà´•àµà´¨àµà´¨ ഇമെയിൽ വിലാസതàµà´¤à´¿à´²àµ‡à´•àµà´•à´¯à´•àµà´•àµà´•à´¯àµà´‚ ചെയàµà´¯àµà´•',
+'createacct-realname' => 'ശരിയായ പേരൠ(നിർബനàµà´§à´®à´¿à´²àµà´²)',
'createaccountreason' => 'കാരണം:',
+'createacct-reason' => 'കാരണം',
+'createacct-reason-ph' => 'താങàµà´•àµ¾ à´Žà´¨àµà´¤àµà´•àµŠà´£àµà´Ÿà´¾à´£àµ മറàµà´±àµŠà´°àµ à´…à´‚à´—à´¤àµà´µà´‚ à´Žà´Ÿàµà´•àµà´•àµà´¨àµà´¨à´¤àµ',
+'createacct-captcha' => 'à´¸àµà´°à´•àµà´·à´¾ പരിശോധന',
+'createacct-imgcaptcha-ph' => 'à´®àµà´•à´³à´¿àµ½ കാണàµà´¨àµà´¨ à´Žà´´àµà´¤àµà´¤àµ ഇവിടെ നൽകàµà´•',
+'createacct-submit' => 'താങàµà´•à´³àµà´Ÿàµ† à´…à´‚à´—à´¤àµà´µà´‚ സൃഷàµà´Ÿà´¿à´•àµà´•àµà´•',
+'createacct-another-submit' => 'മറàµà´±àµŠà´°àµ à´…à´‚à´—à´¤àµà´µà´®àµ†à´Ÿàµà´•àµà´•àµà´•',
+'createacct-benefit-heading' => 'താങàµà´•à´³àµ†à´ªàµà´ªàµ‹à´²àµ†à´¯àµà´³àµà´³à´µà´°à´¾à´£àµ {{SITENAME}} പടàµà´¤àµà´¤àµà´¯àµ¼à´¤àµà´¤à´¿à´¯à´¿à´°à´¿à´•àµà´•àµà´¨àµà´¨à´¤àµ.',
+'createacct-benefit-body1' => '{{PLURAL:$1|തിരàµà´¤àµà´¤àµ|തിരàµà´¤àµà´¤àµà´•àµ¾}}',
+'createacct-benefit-body2' => '{{PLURAL:$1|താൾ|താളàµà´•àµ¾}}',
+'createacct-benefit-body3' => 'സമീപകാലതàµà´¤àµ സംഭാവന {{PLURAL:$1|ചെയàµà´¤à´¯à´¾àµ¾|ചെയàµà´¤à´µàµ¼}}',
'badretype' => 'താങàµà´•àµ¾ നൽകിയ രഹസàµà´¯à´µà´¾à´•àµà´•àµà´•àµ¾ സമമലàµà´².',
'userexists' => 'നൽകിയ ഉപയോകàµà´¤àµƒà´¨à´¾à´®à´‚ à´®àµà´®àµà´ªàµ‡ നിലവിലàµà´£àµà´Ÿàµ.
ദയവായി മറàµà´±àµŠà´°àµ ഉപയോകàµà´¤àµƒà´¨à´¾à´®à´‚ തിരഞàµà´žàµ†à´Ÿàµà´•àµà´•àµà´•.',
'loginerror' => 'à´ªàµà´°à´µàµ‡à´¶à´¨à´‚ സാധിചàµà´šà´¿à´²àµà´²',
+'createacct-error' => 'à´…à´‚à´—à´¤àµà´µà´¸àµƒà´·àµà´Ÿà´¿à´•àµà´•à´¿à´Ÿàµ† പിഴവàµà´£àµà´Ÿà´¾à´¯à´¿',
'createaccounterror' => 'à´…à´‚à´—à´¤àµà´µà´®àµ†à´Ÿàµà´•àµà´•à´¾àµ» à´•à´´à´¿à´žàµà´žà´¿à´²àµà´²:$1',
'nocookiesnew' => 'ഉപയോകàµà´¤àµƒà´…à´‚à´—à´¤àµà´µà´‚ ഉണàµà´Ÿà´¾à´•àµà´•à´¿à´¯à´¿à´°à´¿à´•àµà´•àµà´¨àµà´¨àµ. പകàµà´·àµ† താങàµà´•àµ¾ ലോഗിൻ ചെയàµà´¤à´¿à´Ÿàµà´Ÿà´¿à´²àµà´². {{SITENAME}} സംരംഭതàµà´¤à´¿àµ½ ലോഗിൻ ചെയàµà´¯àµà´µà´¾àµ» à´•àµà´•àµà´•à´¿à´•àµ¾ സജàµà´œà´®à´¾à´•àµà´•à´¿à´¯à´¿à´°à´¿à´•àµà´•à´£à´‚. താങàµà´•à´³àµà´Ÿàµ† à´•à´®àµà´ªàµà´¯àµ‚à´Ÿàµà´Ÿà´±à´¿àµ½ നിലവിൽ à´•àµà´•àµà´•à´¿à´•àµ¾ ഡിസേബിൾ ചെയàµà´¤à´¿à´°à´¿à´•àµà´•àµà´¨àµà´¨àµ. അതൠഎനേബിൾ ചെയàµà´¤àµ താങàµà´•à´³àµà´Ÿàµ† ഉപയോകàµà´¤àµƒà´¨à´¾à´®à´µàµà´‚ രഹസàµà´¯à´µà´¾à´•àµà´•àµà´‚ ഉപയോഗിചàµà´šàµ ലോഗിൻ ചെയàµà´¯àµ‚.',
'nocookieslogin' => '{{SITENAME}} സംരംഭതàµà´¤à´¿àµ½ ലോഗിൻ ചെയàµà´¯àµà´µà´¾àµ» à´•àµà´•àµà´•à´¿à´•àµ¾ സജàµà´œà´®à´¾à´•àµà´•à´¿à´¯à´¿à´°à´¿à´•àµà´•à´£à´‚. പകàµà´·àµ† താങàµà´•àµ¾ à´•àµà´•àµà´•à´¿à´•àµ¾ സജàµà´œà´®à´¾à´•àµà´•à´¿à´¯à´¿à´Ÿàµà´Ÿà´¿à´²àµà´². à´•àµà´•àµà´•à´¿à´•àµ¾ സജàµà´œà´®à´¾à´•àµà´•à´¿à´¯à´¤à´¿à´¨àµ ശേഷം വീണàµà´Ÿàµà´‚ ലോഗിൻ ചെയàµà´¯à´¾àµ» à´¶àµà´°à´®à´¿à´•àµà´•àµ‚.',
@@ -825,10 +876,13 @@ $2',
à´…à´‚à´—à´¤àµà´µà´‚ അബദàµà´§à´µà´¶à´¾àµ½ ഉണàµà´Ÿà´¾à´•àµà´•à´¿à´¯à´¤à´¾à´£àµ†à´™àµà´•à´¿àµ½ താങàµà´•àµ¾à´•àµà´•àµ à´ˆ സനàµà´¦àµ‡à´¶à´‚ നിരാകരികàµà´•à´¾à´µàµà´¨àµà´¨à´¤à´¾à´£àµâ€Œ.',
'usernamehasherror' => 'ഉപയോകàµà´¤àµƒà´¨à´¾à´®à´¤àµà´¤à´¿àµ½ ഹാഷൠലിപികൾ ഉൾപàµà´ªàµ†à´Ÿàµà´¤àµà´¤à´°àµà´¤àµ',
'login-throttled' => 'താങàµà´•àµ¾ നിരവധി à´ªàµà´°à´¾à´µà´¶àµà´¯à´‚ ലോഗിൻ ചെയàµà´¯à´¾àµ» à´¶àµà´°à´®à´¿à´šàµà´šà´¿à´°à´¿à´•àµà´•àµà´¨àµà´¨àµ.
-à´ªàµà´¤à´¿à´¯à´¤à´¾à´¯à´¿ à´¶àµà´°à´®à´¿à´•àµà´•àµà´¨àµà´¨à´¤à´¿à´¨àµ à´®àµà´®àµà´ªàµ ദയവായി കാതàµà´¤à´¿à´°à´¿à´•àµà´•àµà´•.',
+à´ªàµà´¤à´¿à´¯à´¤à´¾à´¯à´¿ à´¶àµà´°à´®à´¿à´•àµà´•àµà´¨àµà´¨à´¤à´¿à´¨àµ à´®àµà´®àµà´ªàµ $1 ദയവായി കാതàµà´¤à´¿à´°à´¿à´•àµà´•àµà´•.',
'login-abort-generic' => 'താങàµà´•à´³àµà´Ÿàµ† à´ªàµà´°à´µàµ‡à´¶à´¿à´•àµà´•àµ½ പരാജയപàµà´ªàµ†à´Ÿàµà´Ÿàµ - റദàµà´¦à´¾à´•àµà´•à´ªàµà´ªàµ†à´Ÿàµà´Ÿà´¿à´°à´¿à´•àµà´•àµà´¨àµà´¨àµ',
'loginlanguagelabel' => 'ഭാഷ: $1',
'suspicious-userlogout' => 'ലോഗൗടàµà´Ÿàµ ചെയàµà´¯à´¾à´¨àµà´³àµà´³ താങàµà´•à´³àµà´Ÿàµ† à´…à´­àµà´¯àµ¼à´¤àµà´¥à´¨ നിരസിചàµà´šà´¿à´°à´¿à´•àµà´•àµà´¨àµà´¨àµ, കാരണം അതൠതകർനàµà´¨ à´¬àµà´°àµ—സറിൽ നിനàµà´¨àµ‹ കാഷിങൠപàµà´°àµ‹à´•àµà´¸à´¿à´¯à´¿àµ½ നിനàµà´¨àµ‹ ഉണàµà´Ÿà´¾à´¯à´¤àµà´ªàµ‹à´²àµ† à´…à´¨àµà´­à´µà´ªàµà´ªàµ†à´Ÿàµà´¨àµà´¨àµ.',
+'createacct-another-realname-tip' => 'താങàµà´•à´³àµà´Ÿàµ† യഥാർതàµà´¥ പേരàµâ€Œ നൽകണമെനàµà´¨àµ നിർബനàµà´§à´®à´¿à´²àµà´².
+
+à´Žà´™àµà´•à´¿à´²àµà´‚ à´…à´™àµà´™à´¨àµ† ചെയàµà´¤à´¾àµ½, ഉപയോകàµà´¤à´¾à´•àµà´•àµ¾à´•àµà´•àµ അവരരവരàµà´Ÿàµ† പേരിൽ തനàµà´¨àµ† തങàµà´™à´³àµà´Ÿàµ† സൃഷàµà´Ÿà´¿à´•àµà´•àµ à´•à´Ÿà´ªàµà´ªà´¾à´Ÿàµ ലഭികàµà´•àµà´¨àµà´¨à´¤à´¾à´£àµ.',
# Email sending
'php-mail-error-unknown' => 'പി.à´Žà´šàµà´šàµ.പി.à´¯àµà´Ÿàµ† main() à´«à´™àµà´·à´¨à´¿àµ½ അപരിചിതമായ പിഴവàµ',
@@ -844,7 +898,7 @@ $2',
'newpassword' => 'à´ªàµà´¤à´¿à´¯ രഹസàµà´¯à´µà´¾à´•àµà´•àµ:',
'retypenew' => 'à´ªàµà´¤à´¿à´¯ രഹസàµà´¯à´µà´¾à´•àµà´•àµ ഉറപàµà´ªà´¿à´•àµà´•àµà´•:',
'resetpass_submit' => 'രഹസàµà´¯à´µà´¾à´•àµà´•àµ സജàµà´œàµ€à´•à´°à´¿à´šàµà´šà´¶àµ‡à´·à´‚ ലോഗിൻ ചെയàµà´¯àµà´•',
-'resetpass_success' => 'താങàµà´•à´³àµà´Ÿàµ† രഹസàµà´¯à´µà´¾à´•àµà´•àµ വിജയകരമായി മാറàµà´±à´¿à´¯à´¿à´°à´¿à´•àµà´•àµà´¨àµà´¨àµ! ഇപàµà´ªàµ‹àµ¾ താങàµà´•à´³àµ† സംരംഭതàµà´¤à´¿à´²àµ‡à´•àµà´•àµ ആനയികàµà´•àµà´¨àµà´¨àµ...',
+'changepassword-success' => 'താങàµà´•à´³àµà´Ÿàµ† രഹസàµà´¯à´µà´¾à´•àµà´•àµ വിജയകരമായി മാറàµà´±à´¿à´¯à´¿à´°à´¿à´•àµà´•àµà´¨àµà´¨àµ!',
'resetpass_forbidden' => 'രഹസàµà´¯à´µà´¾à´•àµà´•àµà´•àµ¾ മാറàµà´±àµà´¨àµà´¨à´¤àµ à´…à´¨àµà´µà´¦à´¿à´•àµà´•àµà´¨àµà´¨à´¿à´²àµà´²',
'resetpass-no-info' => 'à´ˆ താൾ നേരിടàµà´Ÿàµ കാണàµà´¨àµà´¨à´¤à´¿à´¨àµ താങàµà´•àµ¾ ലോഗിൻ ചെയàµà´¤à´¿à´°à´¿à´•àµà´•à´£à´‚.',
'resetpass-submit-loggedin' => 'രഹസàµà´¯à´µà´¾à´•àµà´•àµ മാറàµà´±àµà´•',
@@ -856,10 +910,11 @@ $2',
# Special:PasswordReset
'passwordreset' => 'രഹസàµà´¯à´µà´¾à´•àµà´•àµ à´ªàµà´¨à´ƒà´•àµà´°à´®àµ€à´•à´°à´¿à´•àµà´•àµà´•',
-'passwordreset-text' => 'രഹസàµà´¯à´µà´¾à´•àµà´•àµ à´ªàµà´¨àµ¼à´¸à´œàµà´œàµ€à´•à´°à´¿à´•àµà´•à´¾à´¨à´¾à´¯à´¿ à´ˆ ഫോം പൂരിപàµà´ªà´¿à´•àµà´•àµà´•.',
+'passwordreset-text-one' => 'രഹസàµà´¯à´µà´¾à´•àµà´•àµ à´ªàµà´¨àµ¼à´¸à´œàµà´œàµ€à´•à´°à´¿à´•àµà´•à´¾à´¨à´¾à´¯à´¿ à´ˆ ഫോം പൂരിപàµà´ªà´¿à´•àµà´•àµà´•.',
+'passwordreset-text-many' => '{{PLURAL:$1|താങàµà´•à´³àµà´Ÿàµ† രഹസàµà´¯à´µà´¾à´•àµà´•àµ à´ªàµà´¨à´¸à´œàµà´œàµ€à´•à´°à´¿à´•àµà´•à´¾àµ» ഒരൠഫോം പൂരിപàµà´ªà´¿à´šàµà´šàµ നൽകàµà´•.}}',
'passwordreset-legend' => 'രഹസàµà´¯à´µà´¾à´•àµà´•àµ à´ªàµà´¨à´ƒà´•àµà´°à´®àµ€à´•à´°à´¿à´•àµà´•àµà´•',
'passwordreset-disabled' => 'à´ˆ വികàµà´•à´¿à´¯à´¿àµ½ രഹസàµà´¯à´µà´¾à´•àµà´•àµ à´ªàµà´¨à´ƒà´•àµà´°à´®àµ€à´•à´°à´¿à´•àµà´•à´²àµà´•àµ¾ à´ªàµà´°à´µàµ¼à´¤àµà´¤à´°à´¹à´¿à´¤à´®à´¾à´•àµà´•à´¿à´¯à´¿à´°à´¿à´•àµà´•àµà´•à´¯à´¾à´£àµ.',
-'passwordreset-pretext' => '{{PLURAL:$1||താഴെ ഒരൠവിവരശകലം നൽകàµà´•}}',
+'passwordreset-emaildisabled' => 'à´ˆ വികàµà´•à´¿à´¯à´¿àµ½ ഇമെയിൽ സൗകരàµà´¯à´™àµà´™àµ¾ à´ªàµà´°à´µàµ¼à´¤àµà´¤à´¨à´°à´¹à´¿à´¤à´®à´¾à´•àµà´•à´¿à´¯à´¿à´°à´¿à´•àµà´•àµà´¨àµà´¨àµ.',
'passwordreset-username' => 'ഉപയോകàµà´¤àµƒà´¨à´¾à´®à´‚:',
'passwordreset-domain' => 'ഡൊമൈൻ:',
'passwordreset-capture' => 'ഫലമായàµà´£àµà´Ÿà´¾à´•àµà´¨àµà´¨ ഇമെയിൽ കാണണോ?',
@@ -884,7 +939,7 @@ $2
താതàµà´•à´¾à´²à´¿à´• രഹസàµà´¯à´µà´¾à´•àµà´•àµ: $2',
'passwordreset-emailsent' => 'ഒരൠരഹസàµà´¯à´µà´¾à´•àµà´•àµ à´ªàµà´¨àµ¼à´¸à´œàµà´œàµ€à´•à´°à´£ ഇമെയിൽ അയചàµà´šà´¿à´Ÿàµà´Ÿàµà´£àµà´Ÿàµ.',
'passwordreset-emailsent-capture' => 'രഹസàµà´¯à´µà´¾à´•àµà´•àµ à´ªàµà´¨àµ¼à´¸à´œàµà´œàµ€à´•à´°à´£ ഇമെയിൽ അയചàµà´šà´¿à´Ÿàµà´Ÿàµà´£àµà´Ÿàµ, അതൠതാഴെകàµà´•àµŠà´Ÿàµà´•àµà´•àµà´¨àµà´¨àµ.',
-'passwordreset-emailerror-capture' => 'താഴെകàµà´•àµŠà´Ÿàµà´¤àµà´¤à´¿à´°à´¿à´•àµà´•àµà´¨àµà´¨, ഓർമàµà´®à´ªàµà´ªàµ†à´Ÿàµà´¤àµà´¤àµ½ ഇമെയിൽ സൃഷàµà´Ÿà´¿à´šàµà´šàµ, പകàµà´·àµ‡ ഉപയോകàµà´¤à´¾à´µà´¿à´¨àµ അയയàµà´•àµà´•à´¾àµ» à´•à´´à´¿à´žàµà´žà´¿à´²àµà´²: $1',
+'passwordreset-emailerror-capture' => 'താഴെകàµà´•àµŠà´Ÿàµà´¤àµà´¤à´¿à´°à´¿à´•àµà´•àµà´¨àµà´¨, രഹസàµà´¯à´µà´¾à´•àµà´•àµ à´ªàµà´¨àµ¼à´¸à´œàµà´œàµ€à´•à´°à´£ ഇമെയിൽ സൃഷàµà´Ÿà´¿à´•àµà´•à´¾à´¨à´¾à´¯àµ†à´™àµà´•à´¿à´²àµà´‚, അതൠ{{GENDER:$2|ഉപയോകàµà´¤à´¾à´µà´¿à´¨àµ}} അയയàµà´•àµà´•àµà´¨àµà´¨à´¤àµ പരാജയപàµà´ªàµ†à´Ÿàµà´Ÿàµ: $1',
# Special:ChangeEmail
'changeemail' => 'ഇമെയിൽ വിലാസതàµà´¤à´¿àµ½ മാറàµà´±à´‚വരàµà´¤àµà´¤àµà´•',
@@ -898,6 +953,19 @@ $2
'changeemail-submit' => 'ഇമെയിലിൽ മാറàµà´±à´‚വരàµà´¤àµà´¤àµà´•',
'changeemail-cancel' => 'റദàµà´¦à´¾à´•àµà´•àµà´•',
+# Special:ResetTokens
+'resettokens' => 'ചീടàµà´Ÿàµà´•àµ¾ à´ªàµà´¨à´ƒà´¸à´œàµà´œàµ€à´•à´°à´¿à´•àµà´•àµà´•',
+'resettokens-text' => 'താങàµà´•à´³àµà´Ÿàµ† à´…à´‚à´—à´¤àµà´µà´µàµà´®à´¾à´¯à´¿ ബനàµà´§à´ªàµà´ªàµ†à´Ÿàµà´Ÿàµà´³àµà´³ à´šà´¿à´² à´¸àµà´µà´•à´¾à´°àµà´¯à´µà´¿à´µà´°à´™àµà´™à´³à´¿à´²àµ‡à´¯àµà´•àµà´•àµ ഇവിടെ ലഭàµà´¯à´¤ സാദàµà´§àµà´¯à´®à´¾à´•àµà´•àµà´¨àµà´¨ ചീടàµà´Ÿàµà´•àµ¾ താങàµà´•àµ¾à´•àµà´•àµ à´ªàµà´¨à´ƒà´¸à´œàµà´œàµ€à´•à´°à´¿à´•àµà´•à´¾à´µàµà´¨àµà´¨à´¤à´¾à´£àµ.
+
+താങàµà´•à´³àµà´Ÿàµ† à´…à´‚à´—à´¤àµà´µà´µà´¿à´µà´°à´™àµà´™àµ¾ മറàµà´±à´¾àµ¼à´•àµà´•àµ†à´™àµà´•à´¿à´²àµà´‚ അറിയാതെ കൈമാറിയിടàµà´Ÿàµà´£àµà´Ÿàµ†à´™àµà´•à´¿à´²àµ‹ താങàµà´•à´³àµà´Ÿàµ† à´…à´‚à´—à´¤àµà´µà´‚ അപഹരികàµà´•à´ªàµà´ªàµ†à´Ÿàµà´Ÿàµà´µàµ†à´™àµà´•à´¿à´²àµ‹ താങàµà´•à´³à´¿à´¤àµ ചെയàµà´¯àµ‡à´£àµà´Ÿà´¤à´¾à´£àµ.',
+'resettokens-no-tokens' => 'ചീടàµà´Ÿàµà´•à´³àµŠà´¨àµà´¨àµà´‚ à´ªàµà´¨à´ƒà´¸à´œàµà´œàµ€à´•à´°à´¿à´•àµà´•à´¾à´¨à´¿à´²àµà´².',
+'resettokens-legend' => 'ചീടàµà´Ÿàµà´•àµ¾ à´ªàµà´¨à´ƒà´¸à´œàµà´œàµ€à´•à´°à´¿à´•àµà´•àµà´•',
+'resettokens-tokens' => 'ചീടàµà´Ÿàµà´•àµ¾:',
+'resettokens-token-label' => '$1 (ഇപàµà´ªàµ‹à´´à´¤àµà´¤àµ† വില: $2)',
+'resettokens-watchlist-token' => ' [[Special:Watchlist|താങàµà´•àµ¾ à´¶àµà´°à´¦àµà´§à´¿à´•àµà´•àµà´¨àµà´¨ താളàµà´•à´³à´¿à´²àµà´£àµà´Ÿà´¾à´•àµà´¨àµà´¨ മാറàµà´±à´™àµà´™à´³àµà´Ÿàµ†]] വെബൠഫീഡൠ(ആറàµà´±à´‚/ആർ.à´Žà´¸àµ.à´Žà´¸àµ.) ചീടàµà´Ÿàµ',
+'resettokens-done' => 'ചീടàµà´Ÿàµà´•àµ¾ à´ªàµà´¨à´ƒà´¸à´œàµà´œàµ€à´•à´°à´¿à´•àµà´•à´ªàµà´ªàµ†à´Ÿàµà´Ÿàµ.',
+'resettokens-resetbutton' => 'തിരഞàµà´žàµ†à´Ÿàµà´¤àµà´¤ ചീടàµà´Ÿàµà´•àµ¾ à´ªàµà´¨à´ƒà´¸à´œàµà´œàµ€à´•à´°à´¿à´•àµà´•àµà´•',
+
# Edit page toolbar
'bold_sample' => 'à´•à´Ÿàµà´ªàµà´ªà´¿à´šàµà´š à´Žà´´àµà´¤àµà´¤àµ',
'bold_tip' => 'à´•à´Ÿàµà´ªàµà´ªà´¿à´šàµà´šàµ†à´´àµà´¤àµà´µà´¾àµ»',
@@ -1079,12 +1147,15 @@ $1 ആണൠഈ തടയൽ നടതàµà´¤à´¿à´¯à´¤àµ. ''$2'' à´Žà´¨àµà´¨à´
ഇതൠമായàµà´•àµà´•à´ªàµà´ªàµ†à´Ÿàµà´Ÿà´¤à´¾à´¯à´¿ കാണàµà´¨àµà´¨àµ.',
'edit-conflict' => 'തിരàµà´¤àµà´¤àµ½ സമരസപàµà´ªàµ†à´Ÿà´¾à´¯àµà´•.',
'edit-no-change' => 'ഇപàµà´ªàµ‹à´´àµà´³àµà´³ à´¸àµà´¥à´¿à´¤à´¿à´¯à´¿àµ½ നിനàµà´¨àµ യാതൊരൠമാറàµà´±à´µàµà´‚ ഇലàµà´²à´¾à´¤àµà´¤à´¤à´¿à´¨à´¾àµ½ താങàµà´•à´³àµà´Ÿàµ† തിരàµà´¤àµà´¤à´²àµà´•àµ¾ തിരസàµà´•à´°à´¿à´•àµà´•à´ªàµà´ªàµ†à´Ÿàµà´Ÿà´¿à´°à´¿à´•àµà´•àµà´¨àµà´¨àµ.',
+'postedit-confirmation' => 'താങàµà´•à´³àµà´Ÿàµ† തിരàµà´¤àµà´¤àµ സേവൠചെയàµà´¤à´¿à´°à´¿à´•àµà´•àµà´¨àµà´¨àµ.',
'edit-already-exists' => 'à´ªàµà´¤à´¿à´¯ താൾ സൃഷàµà´Ÿà´¿à´•àµà´•à´¾àµ» à´•à´´à´¿à´žàµà´žà´¿à´²àµà´².
താൾ ഇപàµà´ªàµ‹àµ¾ തനàµà´¨àµ† നിലവിലàµà´£àµà´Ÿàµ.',
'defaultmessagetext' => 'à´¸àµà´µà´¤àµ‡à´¯àµà´³àµà´³ സനàµà´¦àµ‡à´¶ à´Žà´´àµà´¤àµà´¤àµ',
'content-failed-to-parse' => '$2 ഉളàµà´³à´Ÿà´•àµà´•à´‚ $1 മാതൃകയിൽ പാഴàµà´¸àµ ചെയàµà´¯àµ½ പരാജയപàµà´ªàµ†à´Ÿàµà´Ÿàµ: $3',
'invalid-content-data' => 'അസാധàµà´µà´¾à´¯ ഉളàµà´³à´Ÿà´•àµà´• ഡേറàµà´±',
'content-not-allowed-here' => '"$1" ഉളàµà´³à´Ÿà´•àµà´•à´‚ [[$2]] താളിൽ à´…à´¨àµà´µà´¦à´¿à´•àµà´•àµà´¨àµà´¨à´¿à´²àµà´²',
+'editwarning-warning' => 'à´ˆ താളിൽ നിനàµà´¨àµà´‚ പോകàµà´¨àµà´¨à´¤àµ താങàµà´•àµ¾ വരàµà´¤àµà´¤à´¿à´¯ മാറàµà´±à´™àµà´™àµ¾ നഷàµà´Ÿà´ªàµà´ªàµ†à´Ÿà´¾àµ» ഇടയാകàµà´•àµà´‚.
+താങàµà´•àµ¾ ലോഗിൻ ചെയàµà´¤à´¿à´Ÿàµà´Ÿàµà´£àµà´Ÿàµ†à´™àµà´•à´¿àµ½, താങàµà´•à´³àµà´Ÿàµ† à´•àµà´°à´®àµ€à´•à´°à´£à´™àµà´™à´³à´¿àµ½ "തിരàµà´¤àµà´¤àµ½" à´Žà´¨àµà´¨ ഭാഗതàµà´¤àµ ചെനàµà´¨àµ à´ˆ അറിയിപàµà´ªàµ à´ªàµà´°à´¦àµ¼à´¶à´¿à´ªàµà´ªà´¿à´•àµà´•àµà´¨àµà´¨à´¤àµ ഒഴിവാകàµà´•à´¾à´µàµà´¨àµà´¨à´¤à´¾à´£àµ.',
# Content models
'content-model-wikitext' => 'വികàµà´•à´¿à´Žà´´àµà´¤àµà´¤àµ',
@@ -1119,6 +1190,7 @@ $1 ആണൠഈ തടയൽ നടതàµà´¤à´¿à´¯à´¤àµ. ''$2'' à´Žà´¨àµà´¨à´
'undo-failure' => 'ഇടയàµà´•àµà´•àµà´³àµà´³ തിരàµà´¤àµà´¤à´²àµà´•àµ¾ തമàµà´®à´¿àµ½ സമരസപàµà´ªàµ†à´Ÿà´¾à´¤àµà´¤à´¤àµ കാരണം à´ˆ തിരàµà´¤àµà´¤àµ½ തിരസàµà´•àµà´•à´°à´¿à´•àµà´•àµà´µà´¾à´¨à´¾à´µà´¿à´²àµà´².',
'undo-norev' => 'à´ˆ തിരàµà´¤àµà´¤àµ½ നിലവിലിലàµà´²à´¾à´¤àµà´¤à´¤à´¿à´¨à´¾à´²àµ‹ മായàµà´•àµà´•à´ªàµà´ªàµ†à´Ÿàµà´Ÿà´¤à´¿à´¨à´¾à´²àµ‹ പൂർവസàµà´¥à´¿à´¤à´¿à´¯à´¿à´²à´¾à´•àµà´•àµà´µà´¾àµ» സാധികàµà´•àµà´•à´¯à´¿à´²àµà´².',
'undo-summary' => '[[Special:Contributions/$2|$2]] ([[User talk:$2|സംവാദം]]) ചെയàµà´¤ നാൾപàµà´ªà´¤à´¿à´ªàµà´ªàµ $1 നീകàµà´•à´‚ ചെയàµà´¯àµà´¨àµà´¨àµ',
+'undo-summary-username-hidden' => 'മറയàµà´•àµà´•à´ªàµà´ªàµ†à´Ÿàµà´Ÿ ഉപയോകàµà´¤à´¾à´µàµ ചെയàµà´¤ നാൾപàµà´ªà´¤à´¿à´ªàµà´ªàµ $1 തിരസàµà´•à´°à´¿à´•àµà´•àµà´•',
# Account creation failure
'cantcreateaccounttitle' => 'à´…à´‚à´—à´¤àµà´µà´‚ സൃഷàµà´Ÿà´¿à´•àµà´•à´¾àµ» സാധിചàµà´šà´¿à´²àµà´²',
@@ -1301,6 +1373,7 @@ $1",
'compareselectedversions' => 'തിരഞàµà´žàµ†à´Ÿàµà´¤àµà´¤ പതിപàµà´ªàµà´•àµ¾ തമàµà´®à´¿à´²àµà´³àµà´³ à´µàµà´¯à´¤àµà´¯à´¾à´¸à´‚ കാണàµà´•',
'showhideselectedversions' => 'തിരഞàµà´žàµ†à´Ÿàµà´¤àµà´¤ മാറàµà´±à´™àµà´™àµ¾ à´ªàµà´°à´¦àµ¼à´¶à´¿à´ªàµà´ªà´¿à´•àµà´•àµà´•/മറയàµà´•àµà´•àµà´•',
'editundo' => 'മാറàµà´±à´‚ തിരസàµà´•àµà´•à´°à´¿à´•àµà´•àµà´•',
+'diff-empty' => '(à´µàµà´¯à´¤àµà´¯à´¾à´¸à´‚ ഇലàµà´²)',
'diff-multi' => '(ഇടയàµà´•àµà´•àµ {{PLURAL:$2|ഒരൠഉപയോകàµà´¤à´¾à´µàµ|$2 ഉപയോകàµà´¤à´¾à´•àµà´•àµ¾}} ചെയàµà´¤ {{PLURAL:$1|ഒരൠപതിപàµà´ªàµ|$1 പതിപàµà´ªàµà´•àµ¾}} à´ªàµà´°à´¦àµ¼à´¶à´¿à´ªàµà´ªà´¿à´•àµà´•àµà´¨àµà´¨à´¿à´²àµà´².)',
'diff-multi-manyusers' => '(ഇടയàµà´•àµà´•àµ {{PLURAL:$2|à´’à´¨àµà´¨à´¿à´²à´§à´¿à´•à´‚|$2 à´Žà´£àµà´£à´¤àµà´¤à´¿à´²à´§à´¿à´•à´‚}} ഉപയോകàµà´¤à´¾à´•àµà´•àµ¾ ചെയàµà´¤à´¿à´Ÿàµà´Ÿàµà´³àµà´³ {{PLURAL:$1|ഒരൠപതിപàµà´ªàµ|$1 പതിപàµà´ªàµà´•àµ¾}} à´ªàµà´°à´¦àµ¼à´¶à´¿à´ªàµà´ªà´¿à´•àµà´•àµà´¨àµà´¨à´¿à´²àµà´².)',
'difference-missing-revision' => 'à´ˆ à´µàµà´¯à´¤àµà´¯à´¾à´¸à´¤àµà´¤à´¿àµ½ ($1) {{PLURAL:$2|ഒരൠനാൾപàµà´ªà´¤à´¿à´ªàµà´ªàµ|$2 നാൾപàµà´ªà´¤à´¿à´ªàµà´ªàµà´•àµ¾}} കാണാനായിലàµà´².
@@ -1328,7 +1401,6 @@ $1",
'searchmenu-legend' => 'തിരചàµà´šà´¿àµ½ ഉപാധികൾ',
'searchmenu-exists' => "'''\"[[:\$1]]\" à´Žà´¨àµà´¨ തലകàµà´•àµ†à´Ÿàµà´Ÿà´¿àµ½ ഒരൠതാൾ à´ˆ വികàµà´•à´¿à´¯à´¿àµ½ നിലവിലàµà´£àµà´Ÿàµ'''",
'searchmenu-new' => "'''à´ˆ വികàµà´•à´¿à´¯à´¿àµ½ \"[[:\$1]]\" താൾ നിർമàµà´®à´¿à´•àµà´•àµà´•!'''",
-'searchhelp-url' => 'Help:ഉളàµà´³à´Ÿà´•àµà´•à´‚',
'searchmenu-prefix' => '[[Special:PrefixIndex/$1|à´ˆ പൂർവàµà´µà´ªà´¦à´™àµà´™à´³àµà´³àµà´³ താളàµà´•àµ¾ à´¬àµà´°àµ—സൠചെയàµà´¯àµà´•]]',
'searchprofile-articles' => 'ലേഖനങàµà´™à´³à´¿àµ½',
'searchprofile-project' => 'സഹായം, പദàµà´§à´¤à´¿ താളàµà´•à´³à´¿àµ½',
@@ -1369,15 +1441,7 @@ $1",
'powersearch-togglenone' => 'à´’à´¨àµà´¨àµà´‚വേണàµà´Ÿ',
'search-external' => 'ബാഹàµà´¯ à´…à´¨àµà´µàµ‡à´·à´£à´‚',
'searchdisabled' => '{{SITENAME}} സം‌രംഭതàµà´¤à´¿àµ½ തിരചàµà´šà´¿àµ½ à´¦àµàµ¼à´¬à´²à´ªàµà´ªàµ†à´Ÿàµà´¤àµà´¤à´¿à´¯à´¿à´°à´¿à´•àµà´•àµà´¨àµà´¨àµ. താങàµà´•àµ¾à´•àµà´•àµ ഗൂഗിൾ ഉപയോഗിചàµà´šàµ തതàµà´•à´¾à´²à´‚ തിരചàµà´šà´¿àµ½ നടതàµà´¤à´¾à´µàµà´¨àµà´¨à´¤à´¾à´£àµâ€Œ. പകàµà´·àµ† ഗൂഗിളിൽ {{SITENAME}} സം‌രംഭതàµà´¤à´¿à´¨àµà´±àµ† സൂചിക കാലഹരണപàµà´ªàµ†à´Ÿàµà´Ÿà´¤à´¾à´¯à´¿à´°à´¿à´•àµà´•à´¾àµ» സാദàµà´§àµà´¯à´¤à´¯àµà´£àµà´Ÿàµ.',
-
-# Quickbar
-'qbsettings' => 'à´¦àµà´°àµà´¤ സൗകരàµà´¯à´‚',
-'qbsettings-none' => 'à´’à´¨àµà´¨àµà´®à´¿à´²àµà´²',
-'qbsettings-fixedleft' => 'à´¸àµà´¥à´¿à´°à´®à´¾à´¯ ഇടതàµ',
-'qbsettings-fixedright' => 'à´¸àµà´¥à´¿à´°à´®à´¾à´¯ വലതàµ',
-'qbsettings-floatingleft' => 'ഇടതàµà´¤àµ‡à´¯àµà´•àµà´•àµ à´’à´´àµà´•à´¿ നിൽകàµà´•àµà´•',
-'qbsettings-floatingright' => 'വലതàµà´¤àµ‡à´¯àµà´•àµà´•àµ à´’à´´àµà´•à´¿ നിൽകàµà´•àµà´•',
-'qbsettings-directionality' => 'താങàµà´•à´³àµà´Ÿàµ† ഭാഷയàµà´Ÿàµ† ലിപിയിൽ à´Žà´´àµà´¤àµà´¤àµà´¨àµà´¨ ദിശയനàµà´¸à´°à´¿à´šàµà´šàµ ശരിയാകàµà´•à´¿à´¯à´¿à´°à´¿à´•àµà´•àµà´¨àµà´¨àµ',
+'search-error' => 'തിരയàµà´¨àµà´¨à´¤à´¿à´¨à´¿à´Ÿàµ† ഒരൠപിഴവàµà´£àµà´Ÿà´¾à´¯à´¿: $1',
# Preferences page
'preferences' => 'à´•àµà´°à´®àµ€à´•à´°à´£à´™àµà´™àµ¾',
@@ -1411,7 +1475,6 @@ $1",
'resetprefs' => 'സേവൠചെയàµà´¤à´¿à´Ÿàµà´Ÿà´¿à´²àµà´²à´¾à´¤àµà´¤ മാറàµà´±à´™àµà´™àµ¾ à´ªàµà´¨à´ƒà´•àµà´°à´®àµ€à´•à´°à´¿à´•àµà´•àµà´•',
'restoreprefs' => 'à´¸àµà´µà´¤àµ‡à´¯àµà´³àµà´³ à´•àµà´°à´®àµ€à´•à´°à´£à´™àµà´™àµ¾ à´ªàµà´¨à´ƒà´¸àµà´¥à´¾à´ªà´¿à´•àµà´•àµà´• (à´Žà´²àµà´²à´¾ ഭാഗങàµà´™à´³à´¿à´²àµ‡à´¯àµà´‚)',
'prefs-editing' => 'തിരàµà´¤àµà´¤àµ½',
-'prefs-edit-boxsize' => 'തിരàµà´¤àµà´¤àµ½ ജാലകതàµà´¤à´¿à´¨àµà´±àµ† വലിപàµà´ªà´‚',
'rows' => 'വരി:',
'columns' => 'നിര:',
'searchresultshead' => 'തിരയൂ',
@@ -1422,9 +1485,9 @@ $1",
'recentchangesdays-max' => 'പരമാവധി {{PLURAL:$1|ഒരൠദിവസം|$1 ദിവസങàµà´™àµ¾}}',
'recentchangescount' => 'à´¸àµà´µà´¤àµ‡ à´ªàµà´°à´¦àµ¼à´¶à´¿à´ªàµà´ªà´¿à´•àµà´•àµ‡à´£àµà´Ÿ തിരàµà´¤àµà´¤à´²àµà´•à´³àµà´Ÿàµ† à´Žà´£àµà´£à´‚:',
'prefs-help-recentchangescount' => 'à´ªàµà´¤à´¿à´¯ മാറàµà´±à´™àµà´™àµ¾, താളിനàµà´±àµ† നാൾവഴികൾ, രേഖകൾ à´Žà´¨àµà´¨à´¿à´µà´•àµà´•àµà´‚ ഇതൠബാധകമാണàµ.',
-'prefs-help-watchlist-token' => 'à´ˆ പെടàµà´Ÿà´¿à´¯à´¿àµ½ ഒരൠരഹസàµà´¯à´µà´¾à´•àµà´•àµ ഉപയോഗിചàµà´šà´¾àµ½ താങàµà´•àµ¾ à´¶àµà´°à´¦àµà´§à´¿à´•àµà´•àµà´¨àµà´¨ താളàµà´•à´³àµà´Ÿàµ† പടàµà´Ÿà´¿à´•à´¯àµà´•àµà´•àµà´³àµà´³ ആർ.à´Žà´¸àµ.à´Žà´¸àµ. ഫീഡൠഉണàµà´Ÿà´¾à´•àµà´•àµà´¨àµà´¨à´¤à´¾à´£àµ.
-à´ˆ രഹസàµà´¯à´µà´¾à´•àµà´•àµ അറിയാവàµà´¨àµà´¨ ആർകàµà´•àµà´‚ താങàµà´•àµ¾ à´¶àµà´°à´¦àµà´§à´¿à´•àµà´•àµà´¨àµà´¨ താളàµà´•à´³àµà´Ÿàµ† പടàµà´Ÿà´¿à´• വായികàµà´•à´¾à´µàµà´¨àµà´¨à´¤à´¾à´£àµ. à´…à´¤àµà´•àµŠà´£àµà´Ÿàµ à´¸àµà´°à´•àµà´·à´¿à´¤à´®à´¾à´¯ à´’à´¨àµà´¨àµ തിരഞàµà´žàµ†à´Ÿàµà´•àµà´•àµà´•.
-ഇവിടെ താങàµà´•àµ¾à´•àµà´•àµà´ªà´¯àµ‹à´—à´¿à´•àµà´•à´¾à´µàµà´¨àµà´¨ à´•àµà´°à´®à´°à´¹à´¿à´¤à´®à´¾à´¯à´¿ സൃഷàµà´Ÿà´¿à´šàµà´š ഒരെണàµà´£à´‚ കൊടàµà´¤àµà´¤à´¿à´°à´¿à´•àµà´•àµà´¨àµà´¨àµ: $1',
+'prefs-help-watchlist-token2' => 'ഇതൠതാങàµà´•àµ¾ à´¶àµà´°à´¦àµà´§à´¿à´•àµà´•àµà´¨àµà´¨à´µà´¯àµà´Ÿàµ† പടàµà´Ÿà´¿à´•à´¯àµà´Ÿàµ† വെബàµâ€Œà´«àµ€à´¡à´¿à´¨àµà´³àµà´³ രഹസàµà´¯à´šà´¾à´µà´¿à´¯à´¾à´£àµ.
+ഇതൠഅറിയാവàµà´¨àµà´¨à´µàµ¼à´•àµà´•àµ താങàµà´•àµ¾ à´¶àµà´°à´¦àµà´§à´¿à´•àµà´•àµà´¨àµà´¨à´µà´¯àµ†à´¨àµà´¤à´¾à´£àµ†à´¨àµà´¨àµ വായികàµà´•à´¾à´¨à´¾à´µàµà´®àµ†à´¨àµà´¨à´¤à´¿à´¨à´¾àµ½, പങàµà´•àµ വെയàµà´•àµà´•à´¾à´¤à´¿à´°à´¿à´•àµà´•àµà´•.
+[[Special:ResetTokens|ഇതൠപàµà´¨à´¸à´œàµà´œàµ€à´•à´°à´¿à´•àµà´•à´£à´®àµ†à´™àµà´•à´¿àµ½ ഇവിടെ ഞെകàµà´•àµà´•]].',
'savedprefs' => 'താങàµà´•à´³àµà´Ÿàµ† à´•àµà´°à´®àµ€à´•à´°à´£à´™àµà´™àµ¾ കാതàµà´¤àµà´¸àµ‚à´•àµà´·à´¿à´šàµà´šà´¿à´°à´¿à´•àµà´•àµà´¨àµà´¨àµ.',
'timezonelegend' => 'സമയ മേഖല:',
'localtime' => 'à´ªàµà´°à´¾à´¦àµ‡à´¶à´¿à´• സമയം:',
@@ -1455,7 +1518,6 @@ $1",
'prefs-reset-intro' => 'സൈറàµà´±à´¿àµ½ à´¸àµà´µà´¤àµ‡à´¯àµà´£àµà´Ÿà´¾à´µàµ‡à´£àµà´Ÿ à´•àµà´°à´®àµ€à´•à´°à´£à´™àµà´™àµ¾ à´ªàµà´¨à´ƒà´•àµà´°à´®àµ€à´•à´°à´¿à´•àµà´•à´¾àµ» താങàµà´•àµ¾à´•àµà´•àµ à´ˆ താൾ ഉപയോഗികàµà´•à´¾à´µàµà´¨àµà´¨à´¤à´¾à´£àµ.
ഇതൠതിരിചàµà´šàµ ചെയàµà´¯à´¾àµ» സാദàµà´§àµà´¯à´®à´²àµà´².',
'prefs-emailconfirm-label' => 'ഇമെയിൽ à´¸àµà´¥à´¿à´°àµ€à´•à´°à´£à´‚:',
-'prefs-textboxsize' => 'തിരàµà´¤àµà´¤à´¾à´¨àµà´³àµà´³ ജാലകതàµà´¤à´¿à´¨àµà´±àµ† വലിപàµà´ªà´‚',
'youremail' => 'ഇമെയിൽ:',
'username' => '{{GENDER:$1|ഉപയോകàµà´¤àµƒà´¨à´¾à´®à´‚}}:',
'uid' => '{{GENDER:$1|ഉപയോകàµà´¤àµƒ}} à´.à´¡à´¿.:',
@@ -1488,6 +1550,8 @@ $1",
'prefs-dateformat' => 'ദിന ലേഖന രീതി',
'prefs-timeoffset' => 'സമയ à´µàµà´¯à´¤àµà´¯à´¾à´¸à´‚',
'prefs-advancedediting' => 'പൊതàµà´µà´¾à´¯à´¿à´Ÿàµà´Ÿàµà´³àµà´³ à´à´šàµà´›à´¿à´•à´™àµà´™àµ¾',
+'prefs-editor' => 'à´Žà´¡à´¿à´±àµà´±àµ¼',
+'prefs-preview' => 'à´Žà´™àµà´™à´¨àµ†à´¯àµà´£àµà´Ÿàµ†à´¨àµà´¨àµ കാണൽ',
'prefs-advancedrc' => 'വിപàµà´²à´®à´¾à´¯ ഉപാധികൾ',
'prefs-advancedrendering' => 'വിപàµà´²à´®à´¾à´¯ ഉപാധികൾ',
'prefs-advancedsearchoptions' => 'വിപàµà´²à´®à´¾à´¯ ഉപാധികൾ',
@@ -1495,7 +1559,9 @@ $1",
'prefs-displayrc' => 'à´ªàµà´°à´¦àµ¼à´¶à´¨ à´à´šàµà´›à´¿à´•à´™àµà´™àµ¾',
'prefs-displaysearchoptions' => 'à´ªàµà´°à´¦àµ¼à´¶à´¨ à´à´šàµà´›à´¿à´•à´™àµà´™àµ¾',
'prefs-displaywatchlist' => 'à´ªàµà´°à´¦àµ¼à´¶à´¨ à´à´šàµà´›à´¿à´•à´™àµà´™àµ¾',
+'prefs-tokenwatchlist' => 'ചീടàµà´Ÿàµ',
'prefs-diffs' => 'à´µàµà´¯à´¤àµà´¯à´¾à´¸à´™àµà´™àµ¾',
+'prefs-help-prefershttps' => 'താങàµà´•àµ¾ à´…à´Ÿàµà´¤àµà´¤ à´ªàµà´°à´¾à´µà´¶àµà´¯à´‚ à´ªàµà´°à´µàµ‡à´¶à´¿à´•àµà´•àµà´®àµà´ªàµ‹àµ¾ ഇവ ഫലതàµà´¤à´¿àµ½ വരàµà´¨àµà´¨à´¤à´¾à´£àµ.',
# User preference: email validation using jQuery
'email-address-validity-valid' => 'സാധàµà´¤à´¯àµà´³àµà´³à´¤àµ†à´¨àµà´¨àµ തോനàµà´¨àµà´¨àµà´¨àµ',
@@ -1522,6 +1588,8 @@ $1",
'userrights-notallowed' => 'ഉപയോകàµà´¤à´¾à´•àµà´•àµ¾à´•àµà´•àµ അവകാശങàµà´™àµ¾ കൊടàµà´•àµà´•à´¾à´¨àµà´‚ à´Žà´Ÿàµà´¤àµà´¤àµà´•à´³à´¯à´¾à´¨àµà´®àµà´³àµà´³ à´…à´¨àµà´®à´¤à´¿ താങàµà´•àµ¾à´•àµà´•à´¿à´²àµà´².',
'userrights-changeable-col' => 'താങàµà´•àµ¾à´•àµà´•àµ മാറàµà´±à´¾à´µàµà´¨àµà´¨ സംഘങàµà´™àµ¾',
'userrights-unchangeable-col' => 'താങàµà´•àµ¾à´•àµà´•àµ മാറàµà´±à´¾à´¨à´¾à´µà´¾à´¤àµà´¤ സംഘങàµà´™àµ¾',
+'userrights-conflict' => 'ഉപയോകàµà´¤àµƒ അവകാശങàµà´™à´³àµà´Ÿàµ† മാറàµà´±à´‚ സമരസപàµà´ªàµ†à´Ÿà´¾à´¯àµà´•à´¯àµà´£àµà´Ÿà´¾à´¯à´¿! ദയവായി താങàµà´•à´³àµà´Ÿàµ† മാറàµà´±à´™àµà´™àµ¾ വീണàµà´Ÿàµà´‚ സംശോധനം ചെയàµà´¤àµ à´¸àµà´¥à´¿à´°àµ€à´•à´°à´¿à´šàµà´šàµ നടപàµà´ªà´¿à´²à´¾à´•àµà´•àµà´•.',
+'userrights-removed-self' => 'താങàµà´•àµ¾ à´¸àµà´µà´¨àµà´¤à´‚ അവകാശങàµà´™àµ¾ à´¸àµà´µà´¯à´‚ ഒഴിവാകàµà´•à´¿à´¯à´¿à´°à´¿à´•àµà´•àµà´¨àµà´¨àµ. അതിനാൽ à´ˆ താൾ ഇനി താങàµà´•àµ¾à´•àµà´•àµ ലഭàµà´¯à´®à´¾à´¯à´¿à´°à´¿à´•àµà´•à´¿à´²àµà´².',
# Groups
'group' => 'സംഘം:',
@@ -1588,11 +1656,19 @@ $1",
'right-proxyunbannable' => 'à´ªàµà´°àµ‹à´•àµà´¸à´¿à´•à´³àµ† à´¸àµà´µà´¤àµ‡ തടയàµà´¨àµà´¨à´¤àµ ബാധകമലàµà´²à´¾à´¤à´¿à´°à´¿à´•àµà´•àµà´•',
'right-unblockself' => 'à´¸àµà´µà´¯à´‚ തടയൽ നീകàµà´•àµà´•',
'right-protect' => 'സംരകàµà´·à´£ മാനതàµà´¤à´¿àµ½ മാറàµà´±à´‚ വരàµà´¤àµà´¤àµà´•, നിർà´à´°à´¿à´¤ മാർഗàµà´—à´¤àµà´¤à´¿àµ½ സംരകàµà´·à´¿à´•àµà´•à´ªàµà´ªàµ†à´Ÿàµà´Ÿà´¿à´°à´¿à´•àµà´•àµà´¨àµà´¨ താളàµà´•àµ¾ തിരàµà´¤àµà´¤àµà´•',
-'right-editprotected' => 'സംരകàµà´·à´¿à´¤ താളàµà´•àµ¾ തിരàµà´¤àµà´¤àµà´• (നിർà´à´°à´¿à´¤ സംരകàµà´·à´£à´‚ à´…à´²àµà´²à´¾à´¤àµà´¤à´¤àµ)',
+'right-editprotected' => '"{{int:protect-level-sysop}}" à´Žà´¨àµà´¨àµ അടയാളപàµà´ªàµ†à´Ÿàµà´¤àµà´¤à´¿ സംരകàµà´·à´¿à´šàµà´šà´¿à´Ÿàµà´Ÿàµà´³àµà´³ താളàµà´•àµ¾ തിരàµà´¤àµà´¤àµà´•',
+'right-editsemiprotected' => '"{{int:protect-level-autoconfirmed}}" à´Žà´¨àµà´¨à´Ÿà´¯à´¾à´³à´ªàµà´ªàµ†à´Ÿàµà´¤àµà´¤à´¿ സംരകàµà´·à´¿à´šàµà´šà´¿à´Ÿàµà´Ÿàµà´³àµà´³ താളàµà´•àµ¾ തിരàµà´¤àµà´¤àµà´•',
'right-editinterface' => 'ഉപയോകàµà´¤àµƒ സമàµà´ªàµ¼à´•àµà´•à´®àµà´–à´¤àµà´¤à´¿àµ½ മാറàµà´±à´‚ വരàµà´¤àµà´¤àµà´•',
'right-editusercssjs' => 'മറàµà´±àµ ഉപയോകàµà´¤à´¾à´•àµà´•à´³àµà´Ÿàµ† CSS, JS à´ªàµà´°à´®à´¾à´£à´™àµà´™àµ¾ തിരàµà´¤àµà´¤àµà´•',
'right-editusercss' => 'മറàµà´±àµ ഉപയോകàµà´¤à´¾à´•àµà´•à´³àµà´Ÿàµ† CSS à´ªàµà´°à´®à´¾à´£à´™àµà´™àµ¾ തിരàµà´¤àµà´¤àµà´•',
'right-edituserjs' => 'മറàµà´±àµ ഉപയോകàµà´¤à´¾à´•àµà´•à´³àµà´Ÿàµ† JS à´ªàµà´°à´®à´¾à´£à´™àµà´™àµ¾ തിരàµà´¤àµà´¤àµà´•',
+'right-editmyusercss' => 'താങàµà´•à´³àµà´Ÿàµ† à´¸àµà´µà´¨àµà´¤à´‚ ഉപയോകàµà´¤àµƒ സി.à´Žà´¸àµ.à´Žà´¸àµ. à´ªàµà´°à´®à´¾à´£à´™àµà´™àµ¾ തിരàµà´¤àµà´¤àµà´•',
+'right-editmyuserjs' => 'താങàµà´•à´³àµà´Ÿàµ† à´¸àµà´µà´¨àµà´¤à´‚ ഉപയോകàµà´¤àµƒ ജാവാസàµà´•àµà´°à´¿à´ªàµà´±àµà´±àµ à´ªàµà´°à´®à´¾à´£à´™àµà´™àµ¾ തിരàµà´¤àµà´¤àµà´•',
+'right-viewmywatchlist' => 'താങàµà´•à´³àµà´Ÿàµ† à´¶àµà´°à´¦àµà´§à´¿à´•àµà´•àµà´¨àµà´¨à´µà´¯àµà´Ÿàµ† പടàµà´Ÿà´¿à´• à´¸àµà´µà´¯à´‚ കാണàµà´•',
+'right-editmywatchlist' => 'താങàµà´•àµ¾ à´¶àµà´°à´¦àµà´§à´¿à´•àµà´•àµà´¨àµà´¨à´µà´¯àµà´Ÿàµ† പടàµà´Ÿà´¿à´• à´¸àµà´µà´¯à´‚ തിരàµà´¤àµà´¤àµà´•. à´ˆ അവകാശമിലàµà´²à´¾à´¤àµ†à´¤à´¨àµà´¨àµ† à´šà´¿à´² à´ªàµà´°à´µàµƒà´¤àµà´¤à´¿à´•àµ¾ താളàµà´•àµ¾ കൂടàµà´Ÿà´¿à´šàµà´šàµ‡àµ¼à´•àµà´•àµà´®àµ†à´¨àµà´¨àµ അറിഞàµà´žà´¿à´°à´¿à´•àµà´•àµà´•.',
+'right-viewmyprivateinfo' => 'താങàµà´•à´³àµà´Ÿàµ† à´¸àµà´µà´•à´¾à´°àµà´¯à´µà´¿à´µà´°à´™àµà´™àµ¾ കാണàµà´• (ഉദാ: ഇമെയിൽ വിലാസം, യഥാർതàµà´¥à´¨à´¾à´®à´‚)',
+'right-editmyprivateinfo' => 'താങàµà´•à´³àµà´Ÿàµ† à´¸àµà´µà´•à´¾à´°àµà´¯à´µà´¿à´µà´°à´™àµà´™àµ¾ തിരàµà´¤àµà´¤àµà´• (ഉദാ: ഇമെയിൽ വിലാസം, യഥാർതàµà´¥à´¨à´¾à´®à´‚)',
+'right-editmyoptions' => 'താങàµà´•à´³àµà´Ÿàµ† à´¸àµà´µà´¨àµà´¤à´‚ à´•àµà´°à´®àµ€à´•à´°à´£à´™àµà´™àµ¾ തിരàµà´¤àµà´¤àµà´•',
'right-rollback' => 'ഒരൠപàµà´°à´¤àµà´¯àµ‡à´• താളിൽ അവസാനം തിരàµà´¤àµà´¤àµ½ നടതàµà´¤à´¿à´¯ ഉപയോകàµà´¤à´¾à´µà´¿à´¨àµà´±àµ† തിരàµà´¤àµà´¤àµ½ പെടàµà´Ÿàµ†à´¨àµà´¨àµ ഒഴിവാകàµà´•àµà´•',
'right-markbotedits' => 'à´®àµàµ»à´ªàµà´°à´¾à´ªà´¨à´‚ നടതàµà´¤à´¿à´¯ തിരàµà´¤àµà´¤à´²àµà´•àµ¾ യാനàµà´¤àµà´°à´¿à´• തിരàµà´¤àµà´¤à´²àµà´•à´³à´¾à´¯à´¿ അടയാളപàµà´ªàµ†à´Ÿàµà´¤àµà´¤àµà´•',
'right-noratelimit' => 'à´ªàµà´°à´µàµ¼à´¤àµà´¤à´¨à´™àµà´™àµ¾à´•àµà´•àµ പരിധികൾ ബാധകമലàµà´²',
@@ -1654,12 +1730,19 @@ $1",
'action-userrights-interwiki' => 'മറàµà´±àµ വികàµà´•à´¿à´•à´³à´¿àµ½ നിനàµà´¨àµà´³àµà´³ ഉപയോകàµà´¤à´¾à´•àµà´•à´³àµà´Ÿàµ† ഉപയോകàµà´¤àµƒ അവകാശങàµà´™àµ¾ തിരàµà´¤àµà´¤àµà´•',
'action-siteadmin' => 'ഡേറàµà´±à´¾à´¬àµ‡à´¸àµ à´¤àµà´±à´•àµà´•àµà´• à´…à´²àµà´²àµ†à´™àµà´•à´¿àµ½ പൂടàµà´Ÿàµà´•',
'action-sendemail' => 'ഇമെയിലàµà´•àµ¾ അയയàµà´•àµà´•àµà´•',
+'action-editmywatchlist' => 'താങàµà´•àµ¾ à´¶àµà´°à´¦àµà´§à´¿à´•àµà´•àµà´¨àµà´¨à´µà´¯àµà´Ÿàµ† പടàµà´Ÿà´¿à´• തിരàµà´¤àµà´¤àµà´•',
+'action-viewmywatchlist' => 'താങàµà´•àµ¾ à´¶àµà´°à´¦àµà´§à´¿à´•àµà´•àµà´¨àµà´¨à´µà´¯àµà´Ÿàµ† പടàµà´Ÿà´¿à´• കാണàµà´•',
+'action-viewmyprivateinfo' => 'താങàµà´•à´³àµà´Ÿàµ† à´¸àµà´µà´•à´¾à´°àµà´¯à´µà´¿à´µà´°à´™àµà´™àµ¾ കാണàµà´•',
+'action-editmyprivateinfo' => 'താങàµà´•à´³àµà´Ÿàµ† à´¸àµà´µà´•à´¾à´°àµà´¯à´µà´¿à´µà´°à´™àµà´™àµ¾ തിരàµà´¤àµà´¤àµà´•',
# Recent changes
'nchanges' => '{{PLURAL:$1|ഒരൠമാറàµà´±à´‚|$1 മാറàµà´±à´™àµà´™àµ¾}}',
+'enhancedrc-since-last-visit' => 'à´•à´´à´¿à´žàµà´ž സനàµà´¦àµ¼à´¶à´¨à´¤àµà´¤à´¿à´¨àµ ശേഷം {{PLURAL:$1|ഒരെണàµà´£à´‚|$1 à´Žà´£àµà´£à´‚}}.',
+'enhancedrc-history' => 'നാൾവഴി',
'recentchanges' => 'സമീപകാല മാറàµà´±à´™àµà´™àµ¾',
'recentchanges-legend' => 'സമീപകാല മാറàµà´±à´™àµà´™à´³àµà´Ÿàµ† à´•àµà´°à´®àµ€à´•à´°à´£à´‚',
'recentchanges-summary' => '{{SITENAME}} സംരംഭതàµà´¤à´¿à´²àµ† à´à´±àµà´±à´µàµà´‚ à´ªàµà´¤à´¿à´¯ മാറàµà´±à´™àµà´™àµ¾ ഇവിടെ കാണാം.',
+'recentchanges-noresult' => 'തനàµà´¨à´¿à´°à´¿à´•àµà´•àµà´¨àµà´¨ സമയതàµà´¤à´¿à´¨àµà´³àµà´³à´¿àµ½ ഇതàµà´®à´¾à´¯à´¿ പൊരàµà´¤àµà´¤à´ªàµà´ªàµ†à´Ÿàµà´¨àµà´¨ മാറàµà´±à´™àµà´™àµ¾ à´’à´¨àµà´¨àµà´®à´¿à´²àµà´².',
'recentchanges-feed-description' => 'à´ˆ ഫീഡൠഉപയോഗിചàµà´šàµ വികàµà´•à´¿à´¯à´¿à´²àµ† à´ªàµà´¤à´¿à´¯ മാറàµà´±à´™àµà´™àµ¾ നിരീകàµà´·à´¿à´•àµà´•àµà´•.',
'recentchanges-label-newpage' => 'ഒരൠപàµà´¤à´¿à´¯ താൾ സൃഷàµà´Ÿà´¿à´šàµà´šà´¿à´°à´¿à´•àµà´•àµà´¨àµà´¨àµ',
'recentchanges-label-minor' => 'ഇതൊരൠചെറിയ തിരàµà´¤àµà´¤à´¾à´£àµ',
@@ -1696,7 +1779,6 @@ $1",
'recentchangeslinked-feed' => 'à´…à´¨àµà´¬à´¨àµà´§ മാറàµà´±à´™àµà´™àµ¾',
'recentchangeslinked-toolbox' => 'à´…à´¨àµà´¬à´¨àµà´§ മാറàµà´±à´™àµà´™àµ¾',
'recentchangeslinked-title' => '$1 à´Žà´¨àµà´¨ താളàµà´®à´¾à´¯à´¿ ബനàµà´§à´ªàµà´ªàµ†à´Ÿàµà´Ÿ മാറàµà´±à´™àµà´™àµ¾',
-'recentchangeslinked-noresult' => 'à´ˆ താളിലേയàµà´•àµà´•àµ à´•à´£àµà´£à´¿à´•à´³àµà´³àµà´³ മറàµà´±àµ താളàµà´•àµ¾à´•àµà´•àµ ഇവിടെ സൂചിപàµà´ªà´¿à´•àµà´•à´ªàµà´ªàµ†à´Ÿàµà´Ÿ സമയതàµà´¤àµ മാറàµà´±à´™àµà´™à´³àµŠà´¨àµà´¨àµà´‚ സം‌ഭവിചàµà´šà´¿à´Ÿàµà´Ÿà´¿à´²àµà´².',
'recentchangeslinked-summary' => "ഒരൠപàµà´°à´¤àµà´¯àµ‡à´• താളിൽ നിനàµà´¨àµ à´•à´£àµà´£à´¿ ചേർകàµà´•à´ªàµà´ªàµ†à´Ÿàµà´Ÿà´¿à´Ÿàµà´Ÿàµà´³àµà´³ താളàµà´•à´³à´¿àµ½ അവസാനമായി വരàµà´¤àµà´¤à´¿à´¯ മാറàµà´±à´™àµà´™à´³àµà´Ÿàµ† പടàµà´Ÿà´¿à´• താഴെ à´ªàµà´°à´¦àµ¼à´¶à´¿à´ªàµà´ªà´¿à´šàµà´šà´¿à´°à´¿à´•àµà´•àµà´¨àµà´¨àµ. à´ˆ പടàµà´Ÿà´¿à´•à´¯à´¿àµ½ പെടàµà´¨àµà´¨ [[Special:Watchlist|താങàµà´•àµ¾ à´¶àµà´°à´¦àµà´§à´¿à´•àµà´•àµà´¨àµà´¨ താളàµà´•àµ¾]] '''à´•à´Ÿàµà´ªàµà´ªà´¿à´šàµà´šàµ''' കാണിചàµà´šà´¿à´°à´¿à´•àµà´•àµà´¨àµà´¨àµ.",
'recentchangeslinked-page' => 'താളിനàµà´±àµ† പേരàµ:',
'recentchangeslinked-to' => 'തനàµà´¨à´¿à´°à´¿à´•àµà´•àµà´¨àµà´¨ താളിലെ മാറàµà´±à´™àµà´™àµ¾à´•àµà´•àµ പകരം ബനàµà´§à´ªàµà´ªàµ†à´Ÿàµà´Ÿ താളàµà´•à´³à´¿à´²àµ† മാറàµà´±à´™àµà´™àµ¾ കാണികàµà´•àµà´•',
@@ -1707,7 +1789,7 @@ $1",
'reuploaddesc' => 'വീണàµà´Ÿàµà´‚ à´…à´ªàµâ€Œà´²àµ‹à´¡àµ ചെയàµà´¤àµ നോകàµà´•à´¾à´¨à´¾à´¯à´¿ തിരിചàµà´šàµ പോവàµà´•.',
'upload-tryagain' => 'à´ªàµà´¤àµà´•àµà´•à´¿à´¯ à´ªàµà´°à´®à´¾à´£ വിവരണങàµà´™àµ¾ സമർപàµà´ªà´¿à´•àµà´•àµà´•',
'uploadnologin' => 'ലോഗിൻ ചെയàµà´¤à´¿à´Ÿàµà´Ÿà´¿à´²àµà´²',
-'uploadnologintext' => 'à´ªàµà´°à´®à´¾à´£à´™àµà´™àµ¾ à´…à´ªàµâ€Œà´²àµ‹à´¡àµ ചെയàµà´¯à´¾àµ» താങàµà´•àµ¾ [[Special:UserLogin|ലോഗിൻ]] ചെയàµà´¤à´¿à´°à´¿à´•àµà´•à´£à´‚',
+'uploadnologintext' => 'à´ªàµà´°à´®à´¾à´£à´™àµà´™àµ¾ à´…à´ªàµâ€Œà´²àµ‹à´¡àµ ചെയàµà´¯àµà´¨àµà´¨à´¤à´¿à´¨àµ à´®àµà´®àµà´ªàµ, താങàµà´•àµ¾ $1.',
'upload_directory_missing' => 'à´…à´ªàµâ€Œâ€Œà´²àµ‹à´¡àµ ഡയറകàµà´Ÿà´±à´¿ ($1) ലഭàµà´¯à´®à´²àµà´², അതൠസൃഷàµà´Ÿà´¿à´•àµà´•à´¾àµ» വെബàµâ€Œâ€Œà´¸àµ†àµ¼à´µà´±à´¿à´¨àµ സാധികàµà´•à´¿à´²àµà´².',
'upload_directory_read_only' => 'വെബൠസെർവറിനൠഅപàµâ€Œà´²àµ‹à´¡àµ ഡയറകàµà´Ÿà´±à´¿à´¯à´¿à´²àµ‡à´•àµà´•àµ ($1) à´Žà´´àµà´¤à´¾àµ» à´•à´´à´¿à´žàµà´žà´¿à´²àµà´².',
'uploaderror' => 'à´…à´ªàµâ€Œà´²àµ‹à´¡àµ പിഴവàµ',
@@ -1922,7 +2004,6 @@ https://www.mediawiki.org/wiki/Manual:Image_Authorization കാണàµà´•.',
'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>
@@ -1952,6 +2033,10 @@ https://www.mediawiki.org/wiki/Manual:Image_Authorization കാണàµà´•.',
'listfiles_size' => 'വലിപàµà´ªà´‚',
'listfiles_description' => 'വിവരണം',
'listfiles_count' => 'പതിപàµà´ªàµà´•àµ¾',
+'listfiles-show-all' => 'à´šà´¿à´¤àµà´°à´¤àµà´¤à´¿à´¨àµà´±àµ† പഴയ പതിപàµà´ªàµà´•à´³àµà´‚ ഉൾപàµà´ªàµ†à´Ÿàµà´¤àµà´¤àµà´•',
+'listfiles-latestversion' => 'ഇപàµà´ªàµ‹à´´à´¤àµà´¤àµ† പതിപàµà´ªàµ',
+'listfiles-latestversion-yes' => 'ശരി',
+'listfiles-latestversion-no' => 'വേണàµà´Ÿ',
# File description page
'file-anchor-link' => 'à´ªàµà´°à´®à´¾à´£à´‚',
@@ -2050,6 +2135,13 @@ https://www.mediawiki.org/wiki/Manual:Image_Authorization കാണàµà´•.',
'randompage' => 'à´à´¤àµ†à´™àµà´•à´¿à´²àµà´‚ താൾ',
'randompage-nopages' => 'ഇനി കൊടàµà´¤àµà´¤à´¿à´°à´¿à´•àµà´•àµà´¨àµà´¨ {{PLURAL:$2|നാമമേഖലയിൽ|നാമമേഖലകളിൽ}} താളàµà´•àµ¾ à´’à´¨àµà´¨àµà´®à´¿à´²àµà´²: $1.',
+# Random page in category
+'randomincategory' => 'വർഗàµà´—à´¤àµà´¤à´¿àµ½ നിനàµà´¨àµ à´•àµà´°à´®à´°à´¹à´¿à´¤à´®à´¾à´¯à´¿ à´Žà´Ÿàµà´•àµà´•àµà´¨àµà´¨ താൾ',
+'randomincategory-invalidcategory' => '"$1" സാധàµà´¤à´¯àµà´³àµà´³ വർഗàµà´—à´¤àµà´¤à´¿à´¨àµà´±àµ† പേരലàµà´².',
+'randomincategory-nopages' => '[[:Category:$1|വർഗàµà´—à´‚:$1]] à´Žà´¨àµà´¨à´¤à´¿àµ½ താളàµà´•à´³àµŠà´¨àµà´¨àµà´®à´¿à´²àµà´².',
+'randomincategory-selectcategory' => 'à´ˆ വർഗàµà´—à´¤àµà´¤à´¿àµ½ നിനàµà´¨àµà´‚ à´à´¤àµ†à´™àµà´•à´¿à´²àµà´‚ താൾ à´Žà´Ÿàµà´•àµà´•àµà´•: $1 $2.',
+'randomincategory-selectcategory-submit' => 'പോകൂ',
+
# Random redirect
'randomredirect' => 'à´•àµà´°à´®à´°à´¹à´¿à´¤à´®à´¾à´¯ തിരിചàµà´šàµà´µà´¿à´Ÿàµ½',
'randomredirect-nopages' => '"$1" à´Žà´¨àµà´¨ നാമമേഖലയിൽ തിരിചàµà´šàµà´µà´¿à´Ÿàµ½ താളàµà´•à´³àµŠà´¨àµà´¨àµà´®à´¿à´²àµà´².',
@@ -2075,11 +2167,6 @@ https://www.mediawiki.org/wiki/Manual:Image_Authorization കാണàµà´•.',
'statistics-users-active-desc' => 'à´•à´´à´¿à´žàµà´ž {{PLURAL:$1|ദിവസം|$1 ദിവസങàµà´™àµ¾à´•àµà´•àµà´³àµà´³à´¿àµ½}} à´ªàµà´°à´µàµ¼à´¤àµà´¤à´¿à´šàµà´šà´¿à´Ÿàµà´Ÿàµà´³àµà´³ ഉപയോകàµà´¤à´¾à´•àµà´•àµ¾',
'statistics-mostpopular' => 'à´à´±àµà´±à´µàµà´®à´§à´¿à´•à´‚ സനàµà´¦àµ¼à´¶à´¿à´•àµà´•à´ªàµà´ªàµ†à´Ÿàµà´Ÿ താളàµà´•àµ¾',
-'disambiguations' => 'വിവകàµà´·à´¿à´¤ താളàµà´•à´³à´¿à´²àµ‡à´¯àµà´•àµà´•àµ à´•à´£àµà´£à´¿à´šàµ‡àµ¼à´¤àµà´¤à´¿à´°à´¿à´•àµà´•àµà´¨àµà´¨ താളàµà´•àµ¾',
-'disambiguationspage' => 'Template:വിവകàµà´·à´•àµ¾',
-'disambiguations-text' => "താഴെകàµà´•àµŠà´Ÿàµà´¤àµà´¤à´¿à´°à´¿à´•àµà´•àµà´¨àµà´¨ താളàµà´•à´³à´¿àµ½ '''വിവകàµà´·à´¿à´¤à´™àµà´™àµ¾ താളിലേയàµà´•àµà´•àµ''' à´•àµà´±à´žàµà´žà´¤àµ ഒരൠകണàµà´£à´¿à´¯àµà´£àµà´Ÿàµ. à´…à´µ à´…à´¨àµà´¯àµ‹à´œàµà´¯à´®à´¾à´¯ താളിലേയàµà´•àµà´•àµ à´•à´£àµà´£à´¿à´šàµ‡àµ¼à´•àµà´•à´ªàµà´ªàµ†à´Ÿàµ‡à´£àµà´Ÿà´¤à´¾à´µà´¾à´‚. <br />
-[[MediaWiki:Disambiguationspage]] à´Žà´¨àµà´¨ താളിൽ à´•à´£àµà´£à´¿ ചേർതàµà´¤à´¿à´Ÿàµà´Ÿàµà´³àµà´³ ഫലകം ഉപയോഗികàµà´•àµà´¨àµà´¨ താളàµà´•à´³àµ† വിവകàµà´·à´¿à´¤à´™àµà´™àµ¾ താളായി കണകàµà´•à´¾à´•àµà´•àµà´¨àµà´¨àµ.",
-
'pageswithprop' => 'താളിനàµà´±àµ† സവിശേഷതകളàµà´³àµà´³ താളàµà´•àµ¾',
'pageswithprop-legend' => 'ഒരൠതാൾ സവിശേഷതയàµà´³àµà´³ താളàµà´•àµ¾',
'pageswithprop-submit' => 'പോകൂ',
@@ -2140,6 +2227,7 @@ https://www.mediawiki.org/wiki/Manual:Image_Authorization കാണàµà´•.',
'mostrevisions' => 'à´à´±àµà´±à´µàµà´®à´§à´¿à´•à´‚ തിരàµà´¤àµà´¤à´ªàµà´ªàµ†à´Ÿàµà´Ÿ താളàµà´•àµ¾',
'prefixindex' => 'പൂർവàµà´µà´ªà´¦à´¤àµà´¤àµ‹à´Ÿàµ കൂടിയ à´Žà´²àµà´²à´¾ താളàµà´•à´³àµà´‚',
'prefixindex-namespace' => 'പൂർവàµà´µà´ªà´¦à´®àµà´³àµà´³ à´Žà´²àµà´²à´¾ താളàµà´•à´³àµà´‚ (നാമമേഖല $1)',
+'prefixindex-strip' => 'പടàµà´Ÿà´¿à´•à´¯à´¿àµ½ നിനàµà´¨àµ പൂർവàµà´µà´ªà´¦à´‚ ഒഴിവാകàµà´•àµà´•',
'shortpages' => 'വിവരം à´à´±àµà´±à´µàµà´‚ à´•àµà´±à´µàµà´³àµà´³ താളàµà´•àµ¾',
'longpages' => 'വലിയ താളàµà´•à´³àµà´Ÿàµ† പടàµà´Ÿà´¿à´•',
'deadendpages' => 'à´…à´¨àµà´¤àµ¼ വികàµà´•à´¿ à´•à´£àµà´£à´¿à´¯à´¾àµ½ ബനàµà´§à´¿à´ªàµà´ªà´¿à´•àµà´•à´ªàµà´ªàµ†à´Ÿà´¾à´¤àµà´¤ താളàµà´•àµ¾',
@@ -2155,6 +2243,7 @@ https://www.mediawiki.org/wiki/Manual:Image_Authorization കാണàµà´•.',
'listusers' => 'ഉപയോകàµà´¤à´¾à´•àµà´•à´³àµà´Ÿàµ† പടàµà´Ÿà´¿à´•',
'listusers-editsonly' => 'തിരàµà´¤àµà´¤à´²àµà´•àµ¾ ചെയàµà´¤à´¿à´Ÿàµà´Ÿàµà´³àµà´³ ഉപയോകàµà´¤à´¾à´•àµà´•à´³àµ† മാതàµà´°à´‚ കാണികàµà´•àµà´•',
'listusers-creationsort' => 'സൃഷàµà´Ÿà´¿à´•àµà´•à´ªàµà´ªàµ†à´Ÿàµà´Ÿ തീയതി à´…à´¨àµà´¸à´°à´¿à´šàµà´šàµ à´•àµà´°à´®àµ€à´•à´°à´¿à´•àµà´•àµà´•',
+'listusers-desc' => 'അവരോഹണകàµà´°à´®à´¤àµà´¤à´¿àµ½ ആകàµà´•àµà´•',
'usereditcount' => '{{PLURAL:$1|ഒരൠതിരàµà´¤àµà´¤àµ½|$1 തിരàµà´¤àµà´¤à´²àµà´•àµ¾}}',
'usercreated' => '$1 $2-നൠ{{GENDER:$3|സൃഷàµà´Ÿà´¿à´šàµà´šà´¤àµ}}',
'newpages' => 'à´ªàµà´¤à´¿à´¯ താളàµà´•àµ¾',
@@ -2331,10 +2420,9 @@ https://www.mediawiki.org/wiki/Manual:Image_Authorization കാണàµà´•.',
'unwatchthispage' => 'à´¶àµà´°à´¦àµà´§à´¿à´•àµà´•àµà´¨àµà´¨à´¤àµ അവസാനിപàµà´ªà´¿à´•àµà´•àµà´•',
'notanarticle' => 'ലേഖന താൾ à´…à´²àµà´²',
'notvisiblerev' => 'മറàµà´±àµŠà´°àµ ഉപയോകàµà´¤à´¾à´µàµ സൃഷàµà´Ÿà´¿à´šàµà´š അവസാനതàµà´¤àµ† നാൾപàµà´ªà´¤à´¿à´ªàµà´ªàµ മായàµà´šàµà´šà´¿à´°à´¿à´•àµà´•àµà´¨àµà´¨àµ',
-'watchnochange' => 'താങàµà´•àµ¾ à´¶àµà´°à´¦àµà´§à´¿à´•àµà´•àµà´¨àµà´¨ താളàµà´•àµ¾ à´’à´¨àµà´¨àµà´‚ തനàµà´¨àµ† ഇകàµà´•à´¾à´²à´¯à´³à´µà´¿àµ½ തിരàµà´¤àµà´¤à´ªàµà´ªàµ†à´Ÿàµà´Ÿà´¿à´Ÿàµà´Ÿà´¿à´²àµà´².',
'watchlist-details' => 'സം‌വാദം താളàµà´•àµ¾ ഉൾപàµà´ªàµ†à´Ÿàµà´¤àµà´¤à´¾à´¤àµ† {{PLURAL:$1|ഒരൠതാൾ|$1 താളàµà´•àµ¾}} താങàµà´•àµ¾ à´¶àµà´°à´¦àµà´§à´¿à´•àµà´•àµà´¨àµà´¨à´µà´¯àµà´Ÿàµ† പടàµà´Ÿà´¿à´•à´¯à´¿à´²àµà´£àµà´Ÿàµ.',
-'wlheader-enotif' => '* ഇമെയിൽ വിജàµà´žà´¾à´ªà´¨à´‚ സാദàµà´§àµà´¯à´®à´¾à´•àµà´•à´¿à´¯à´¿à´°à´¿à´•àµà´•àµà´¨àµà´¨àµ.',
-'wlheader-showupdated' => "* താങàµà´•à´³àµà´Ÿàµ† അവസാന സനàµà´¦àµ¼à´¶à´¨à´¤àµà´¤à´¿à´¨àµ ശേഷം തിരàµà´¤àµà´¤à´ªàµà´ªàµ†à´Ÿàµà´Ÿ താളàµà´•àµ¾ '''à´•à´Ÿàµà´ªàµà´ªà´¿à´šàµà´šàµ''' കാണിചàµà´šà´¿à´°à´¿à´•àµà´•àµà´¨àµà´¨àµ",
+'wlheader-enotif' => 'ഇമെയിൽ അറിയിപàµà´ªàµà´•àµ¾ സജàµà´œà´®à´¾à´•àµà´•à´¿à´¯à´¿à´°à´¿à´•àµà´•àµà´¨àµà´¨àµ.',
+'wlheader-showupdated' => "താങàµà´•à´³àµà´Ÿàµ† അവസാന സനàµà´¦àµ¼à´¶à´¨à´¤àµà´¤à´¿à´¨àµ ശേഷം മാറàµà´±à´‚ വനàµà´¨ താളàµà´•àµ¾ '''à´•à´Ÿàµà´ªàµà´ªà´¿à´šàµà´šàµ''' കാണിചàµà´šà´¿à´°à´¿à´•àµà´•àµà´¨àµà´¨àµ",
'watchmethod-recent' => 'à´¶àµà´°à´¦àµà´§à´¿à´•àµà´•àµà´¨àµà´¨ താളàµà´•àµ¾à´•àµà´•àµà´µàµ‡à´£àµà´Ÿà´¿ à´ªàµà´¤à´¿à´¯ മാറàµà´±à´™àµà´™àµ¾ പരിശോധികàµà´•àµà´¨àµà´¨àµ',
'watchmethod-list' => 'à´¶àµà´°à´¦àµà´§à´¿à´•àµà´•àµà´¨àµà´¨ താളàµà´•à´³à´¿à´²àµ† à´ªàµà´¤à´¿à´¯ മാറàµà´±à´™àµà´™àµ¾ പരിശോധികàµà´•àµà´¨àµà´¨àµ',
'watchlistcontains' => 'താങàµà´•àµ¾ {{PLURAL:$1|താൾ|താളàµà´•àµ¾}} à´¶àµà´°à´¦àµà´§à´¿à´•àµà´•àµà´¨àµà´¨àµà´£àµà´Ÿàµ.',
@@ -2582,7 +2670,7 @@ $1',
'contributions' => '{{GENDER:$1|ഉപയോകàµà´¤à´¾à´µà´¿à´¨àµà´±àµ†}} സംഭാവനകൾ',
'contributions-title' => '$1 à´Žà´¨àµà´¨ ഉപയോകàµà´¤à´¾à´µà´¿à´¨àµà´±àµ† സംഭാവനകൾ',
'mycontris' => 'സംഭാവനകൾ',
-'contribsub2' => '$1 à´Žà´¨àµà´¨ ഉപയോകàµà´¤à´¾à´µà´¿à´¨àµà´±àµ† $2.',
+'contribsub2' => 'ഉപയോകàµà´¤à´¾à´µàµ {{GENDER:$3|$1}} ($2)',
'nocontribs' => 'à´ˆ മാനദണàµà´¡à´™àµà´™à´³àµà´®à´¾à´¯à´¿ യോജികàµà´•àµà´¨àµà´¨ മാറàµà´±à´™àµà´™àµ¾ à´’à´¨àµà´¨àµà´‚ à´•à´£àµà´Ÿà´¿à´²àµà´².',
'uctop' => '(നിലവിലàµà´³àµà´³à´¤àµ)',
'month' => 'മാസം:',
@@ -2737,13 +2825,11 @@ $1',
'ipb_blocked_as_range' => 'പിഴവàµ: $1 à´Žà´¨àµà´¨ à´.പി.യെ നേരിടàµà´Ÿà´²àµà´² തടഞàµà´žà´¿à´Ÿàµà´Ÿàµà´³àµà´³à´¤àµ. അതിനാൽ തടയൽ നീകàµà´•à´‚ ചെയàµà´¯àµà´µà´¾àµ» സാദàµà´§àµà´¯à´®à´²àµà´². അതിനെ $2à´¨àµà´±àµ† ഭാഗമായàµà´³àµà´³ റേഞàµà´šà´¿àµ½ ആണàµâ€Œ തടഞàµà´žà´¿à´Ÿàµà´Ÿàµà´³àµà´³à´¤àµ. അതൠഒഴിവാകàµà´•à´¾à´µàµà´¨àµà´¨à´¤à´¾à´£àµ.',
'ip_range_invalid' => 'അസാധàµà´µà´¾à´¯ à´.പി. റേഞàµà´šàµ.',
'ip_range_toolarge' => 'പരിധി നിശàµà´šà´¯à´¿à´šàµà´šàµà´³àµà´³ തടയലàµà´•àµ¾ /$1 à´Žà´¨àµà´¨à´¤à´¿à´²àµà´‚ കൂടàµà´¤à´²à´¾à´•à´¾àµ» à´…à´¨àµà´µà´¦à´¿à´•àµà´•àµà´¨àµà´¨à´¿à´²àµà´².',
-'blockme' => 'à´Žà´¨àµà´¨àµ† തടയàµà´•',
'proxyblocker' => 'à´ªàµà´°àµ‹à´•àµà´¸à´¿ തടയൽ',
-'proxyblocker-disabled' => 'à´ˆ à´ªàµà´°à´•àµà´°à´¿à´¯ സജàµà´œà´®à´¾à´•àµà´•à´¿à´¯à´¿à´Ÿàµà´Ÿà´¿à´²àµà´².',
'proxyblockreason' => 'à´“à´ªàµà´ªàµº à´ªàµà´°àµ‹à´•àµà´¸à´¿ ആയതിനാൽ താങàµà´•à´³àµà´Ÿàµ† à´.പി. വിലാസതàµà´¤àµ† തടഞàµà´žà´¿à´°à´¿à´•àµà´•àµà´¨àµà´¨àµ. ഇതൠഎനàµà´¤àµ†à´™àµà´•à´¿à´²àµà´‚ പിഴവൠമൂലം സംഭവിചàµà´šà´¤à´¾à´£àµ†à´™àµà´•à´¿àµ½ താങàµà´•à´³àµà´Ÿàµ† ഇനàµà´±àµ¼à´¨àµ†à´±àµà´±àµ സേവന ദാതാവിനെ സമീപിചàµà´šàµ à´ˆ à´¸àµà´°à´•àµà´·à´¾ à´ªàµà´°à´¶àµà´¨à´¤àµà´¤àµ† à´•àµà´±à´¿à´šàµà´šàµ ബോധിപàµà´ªà´¿à´•àµà´•àµà´•.',
-'proxyblocksuccess' => 'ചെയàµà´¤àµ à´•à´´à´¿à´žàµà´žàµ.',
'sorbsreason' => '{{SITENAME}} ഉപയോഗികàµà´•àµà´¨àµà´¨ DNSBL ൽ താങàµà´•à´³àµà´Ÿàµ† à´.പി. വിലാസം ഒരൠഓപàµà´ªàµº à´ªàµà´°àµ‹à´•àµà´¸à´¿à´¯à´¾à´¯à´¾à´£àµ രേഖപàµà´ªàµ†à´Ÿàµà´¤àµà´¤à´¿à´Ÿàµà´Ÿàµà´³àµà´³à´¤àµ.',
'sorbs_create_account_reason' => '{{SITENAME}} ഉപയോഗികàµà´•àµà´¨àµà´¨ DNSBL ൽ താങàµà´•à´³àµà´Ÿàµ† à´.പി. വിലാസം ഒരൠഓപàµà´ªàµº à´ªàµà´°àµ‹à´•àµà´¸à´¿à´¯à´¾à´¯à´¾à´£àµ രേഖപàµà´ªàµ†à´Ÿàµà´¤àµà´¤à´¿à´Ÿàµà´Ÿàµà´³àµà´³à´¤àµ. താങàµà´•àµ¾à´•àµà´•àµ à´…à´‚à´—à´¤àµà´µà´®àµ†à´Ÿàµà´•àµà´•à´¾àµ» സാദàµà´§àµà´¯à´®à´²àµà´².',
+'xffblockreason' => 'à´Žà´•àµà´¸àµ-ഫോർവേഡഡàµ-ഫോർ ഹെഡറിലെ ഒരൠà´.പി. വിലാസം, താങàµà´•à´³àµà´Ÿàµ‡à´¤àµ‹ താങàµà´•àµ¾ ഉപയോഗികàµà´•àµà´¨àµà´¨ à´ªàµà´°àµ‹à´•àµà´¸à´¿ സെർവറിലേതോ ആകാം, തടയപàµà´ªàµ†à´Ÿàµà´Ÿà´¿à´°à´¿à´•àµà´•àµà´¨àµà´¨à´¤à´¾à´£àµ. തടയലിനàµà´±àµ† കാരണം: $1',
'cant-block-while-blocked' => 'താങàµà´•àµ¾ തടയപàµà´ªàµ†à´Ÿàµà´Ÿà´¿à´°à´¿à´•àµà´•àµà´®àµà´ªàµ‹àµ¾ മറàµà´±àµà´ªà´¯àµ‹à´•àµà´¤à´¾à´•àµà´•à´³àµ† തടയാൻ താങàµà´•àµ¾à´•àµà´•àµ സാധികàµà´•à´¿à´²àµà´².',
'cant-see-hidden-user' => 'താങàµà´•àµ¾ തടയാൻ à´¶àµà´°à´®à´¿à´•àµà´•àµà´¨àµà´¨ ഉപയോകàµà´¤à´¾à´µàµ à´®àµà´®àµà´ªàµ‡ തടയപàµà´ªàµ†à´Ÿàµà´•à´¯àµà´‚ മറയàµà´•àµà´•à´ªàµà´ªàµ†à´Ÿàµà´•à´¯àµà´‚ ചെയàµà´¯à´ªàµà´ªàµ†à´Ÿàµà´Ÿà´¤à´¾à´£àµ. താങàµà´•àµ¾à´•àµà´•àµ ഉപയോകàµà´¤à´¾à´µà´¿à´¨àµ† മറയàµà´•àµà´•à´¾à´¨àµà´³àµà´³ അവകാശം ഇലàµà´²àµ†à´™àµà´•à´¿àµ½, ഉപയോകàµà´¤à´¾à´µà´¿à´¨àµ†à´¤à´¿à´°àµ† ഉളàµà´³ തടയൽ കാണാനോ തിരàµà´¤àµà´¤à´¾à´¨àµ‹ à´•à´´à´¿à´¯àµà´¨àµà´¨à´¤à´²àµà´².',
'ipbblocked' => 'മറàµà´±àµà´³àµà´³à´µà´°àµ† തടയാനോ അവരàµà´Ÿàµ† തടയൽ നീകàµà´•à´¾à´¨àµ‹ താങàµà´•àµ¾à´•àµà´•àµ കഴിയിലàµà´². കാരണം താങàµà´•àµ¾ തനàµà´¨àµ† തടയപàµà´ªàµ†à´Ÿàµà´Ÿà´¿à´°à´¿à´•àµà´•àµà´•à´¯à´¾à´£àµ',
@@ -2910,6 +2996,7 @@ $1',
'thumbnail-more' => 'വലàµà´¤à´¾à´•àµà´•à´¿ കാണികàµà´•àµà´•',
'filemissing' => 'à´ªàµà´°à´®à´¾à´£à´‚ നഷàµà´Ÿà´®à´¾à´¯à´¿à´°à´¿à´•àµà´•àµà´¨àµà´¨àµ',
'thumbnail_error' => 'ലഘàµà´šà´¿à´¤àµà´°à´‚ സൃഷàµà´Ÿà´¿à´•àµà´•àµà´¨àµà´¨à´¤à´¿àµ½ പിഴവàµ: $1',
+'thumbnail_error_remote' => '$1 സംരംഭതàµà´¤à´¿àµ½ നിനàµà´¨àµà´³àµà´³ പിഴവൠസനàµà´¦àµ‡à´¶à´‚: $2',
'djvu_page_error' => 'DjVu താൾ പരിധിയàµà´•àµà´•àµ à´ªàµà´±à´¤àµà´¤à´¾à´£àµ',
'djvu_no_xml' => 'DjVu à´ªàµà´°à´®à´¾à´£à´¤àµà´¤à´¿à´¨àµ വേണàµà´Ÿà´¿ XML ശേഖരികàµà´•àµà´µà´¾àµ» പറàµà´±à´¿à´¯à´¿à´²àµà´²',
'thumbnail-temp-create' => 'താതàµà´•à´¾à´²à´¿à´• ലഘàµà´šà´¿à´¤àµà´° à´ªàµà´°à´®à´¾à´£à´‚ സൃഷàµà´Ÿà´¿à´•àµà´•à´¾à´¨à´¾à´¯à´¿à´²àµà´²',
@@ -3060,11 +3147,7 @@ $1',
# Stylesheets
'common.css' => '/* ഇവിടെ നൽകàµà´¨àµà´¨ സി.à´Žà´¸àµ.à´Žà´¸àµ. à´Žà´²àµà´²à´¾ ദൃശàµà´¯à´°àµ‚പങàµà´™àµ¾à´•àµà´•àµà´‚ ബാധകമായിരികàµà´•àµà´‚ */',
-'standard.css' => '/* ഇവിടെ നൽകàµà´¨àµà´¨ സി.à´Žà´¸àµ.à´Žà´¸àµ. സാർവതàµà´°à´¿à´•à´‚ ദൃശàµà´¯à´°àµ‚പം ഉപയോഗികàµà´•àµà´¨àµà´¨à´µàµ¼à´•àµà´•àµ ബാധകമായിരികàµà´•àµà´‚ */',
-'nostalgia.css' => '/* ഇവിടെ നൽകàµà´¨àµà´¨ സി.à´Žà´¸àµ.à´Žà´¸àµ. ഗൃഹാതàµà´°à´¤àµà´µà´‚ ദൃശàµà´¯à´°àµ‚പം ഉപയോഗികàµà´•àµà´¨àµà´¨à´µàµ¼à´•àµà´•àµ ബാധകമായിരികàµà´•àµà´‚ */',
'monobook.css' => '/* ഇവിടെ നൽകàµà´¨àµà´¨ സി.à´Žà´¸àµ.à´Žà´¸àµ. മോണോബàµà´•àµà´•àµ ദൃശàµà´¯à´°àµ‚പം ഉപയോഗികàµà´•àµà´¨àµà´¨à´µàµ¼à´•àµà´•àµ ബാധകമായിരികàµà´•àµà´‚ */',
-'myskin.css' => '/* ഇവിടെ നൽകàµà´¨àµà´¨ സി.à´Žà´¸àµ.à´Žà´¸àµ. à´Žà´¨àµà´±à´¿à´·àµà´Ÿà´‚ ദൃശàµà´¯à´°àµ‚പം ഉപയോഗികàµà´•àµà´¨àµà´¨à´µàµ¼à´•àµà´•àµ ബാധകമായിരികàµà´•àµà´‚ */',
-'chick.css' => '/* ഇവിടെ നൽകàµà´¨àµà´¨ സി.à´Žà´¸àµ.à´Žà´¸àµ. à´¸àµà´¨àµà´¦à´°à´¿ ദൃശàµà´¯à´°àµ‚പം ഉപയോഗികàµà´•àµà´¨àµà´¨à´µàµ¼à´•àµà´•àµ ബാധകമായിരികàµà´•àµà´‚ */',
'modern.css' => '/* ഇവിടെ നൽകàµà´¨àµà´¨ സി.à´Žà´¸àµ.à´Žà´¸àµ. നവീനം ദൃശàµà´¯à´°àµ‚പം ഉപയോഗികàµà´•àµà´¨àµà´¨à´µàµ¼à´•àµà´•àµ ബാധകമായിരികàµà´•àµà´‚ */',
'vector.css' => '/* ഇവിടെ നൽകàµà´¨àµà´¨ സി.à´Žà´¸àµ.à´Žà´¸àµ. വെകàµà´±àµà´±àµ¼ ദൃശàµà´¯à´°àµ‚പതàµà´¤à´¿à´¨àµ ബാധകമായിരികàµà´•àµà´‚*/',
'noscript.css' => '/* ഇവിടെ നൽകàµà´¨àµà´¨ സി.à´Žà´¸àµ.à´Žà´¸àµ., ജാവാസàµà´•àµà´°à´¿à´ªàµà´±àµà´±àµ സജàµà´œà´®à´¾à´•àµà´•à´¿à´¯à´¿à´Ÿàµà´Ÿà´¿à´²àµà´²à´¾à´¤àµà´¤ ഉപയോകàµà´¤à´¾à´•àµà´•àµ¾à´•àµà´•àµ ബാധകമായിരികàµà´•àµà´‚ */',
@@ -3155,13 +3238,8 @@ $1',
'pageinfo-category-files' => 'à´ªàµà´°à´®à´¾à´£à´™àµà´™à´³àµà´Ÿàµ† à´Žà´£àµà´£à´‚',
# Skin names
-'skinname-standard' => 'സാർവതàµà´°à´¿à´•à´‚',
-'skinname-nostalgia' => 'ഗൃഹാതàµà´°à´¤àµà´µà´‚',
'skinname-cologneblue' => 'à´•àµà´²àµ‹àµº നീല',
'skinname-monobook' => 'മോണോബàµà´•àµà´•àµ',
-'skinname-myskin' => 'à´Žà´¨àµà´±à´¿à´·àµà´Ÿà´‚',
-'skinname-chick' => 'à´¸àµà´¨àµà´¦à´°à´¿',
-'skinname-simple' => 'ലളിതം',
'skinname-modern' => 'നവീനം',
'skinname-vector' => 'വെകàµà´±àµà´±àµ¼',
@@ -3243,11 +3321,25 @@ $1',
'minutes' => '{{PLURAL:$1|ഒരൠമിനിറàµà´±àµ|$1 മിനിറàµà´±àµ}}',
'hours' => '{{PLURAL:$1|ഒരൠമണികàµà´•àµ‚ർ|$1 മണികàµà´•àµ‚ർ}}',
'days' => '{{PLURAL:$1|ഒരൠദിവസം|$1 ദിവസം}}',
+'weeks' => '{{PLURAL:$1|ഒരാഴàµà´šàµà´š|$1 ആഴàµà´šàµà´š}}',
'months' => '{{PLURAL:$1|ഒരൠമാസം|$1 മാസം}}',
'years' => '{{PLURAL:$1|ഒരൠവർഷം|$1 വർഷം}}',
'ago' => '$1 à´®àµà´®àµà´ªàµ',
'just-now' => 'ഇപàµà´ªàµ‹àµ¾',
+# Human-readable timestamps
+'hours-ago' => '{{PLURAL:$1|ഒരൠമണികàµà´•àµ‚ർ|$1 മണികàµà´•àµ‚ർ}} à´®àµàµ»à´ªàµ',
+'minutes-ago' => '{{PLURAL:$1|ഒരൠമിനിറàµà´±àµ|$1 മിനിറàµà´±àµ}} à´®àµàµ»à´ªàµ',
+'seconds-ago' => '{{PLURAL:$1|ഒരൠസെകàµà´•à´¨àµà´±àµ|$1 സെകàµà´•à´¨àµà´±àµ}} à´®àµàµ»à´ªàµ',
+'monday-at' => 'തിങàµà´•à´³à´¾à´´àµà´šàµà´š $1-à´¨àµàµ',
+'tuesday-at' => 'ചൊവàµà´µà´¾à´´àµà´šàµà´š $1-à´¨àµàµ',
+'wednesday-at' => 'à´¬àµà´§à´¨à´¾à´´àµà´šàµà´š $1-à´¨àµàµ',
+'thursday-at' => 'à´µàµà´¯à´¾à´´à´¾à´´àµà´šàµà´š $1-à´¨àµàµ',
+'friday-at' => 'വെളàµà´³à´¿à´¯à´¾à´´àµà´šàµà´š $1-à´¨àµàµ',
+'saturday-at' => 'ശനിയാഴàµà´šàµà´š $1-à´¨àµàµ',
+'sunday-at' => 'ഞായറാഴàµà´šàµà´š $1-à´¨àµàµ',
+'yesterday-at' => 'ഇനàµà´¨à´²àµ† $1-à´¨àµàµ',
+
# Bad image list
'bad_image_list' => 'à´Žà´´àµà´¤àµà´¤àµ രീതി താഴെ കൊടàµà´¤àµà´¤à´¿à´°à´¿à´•àµà´•àµà´¨àµà´¨àµ:
@@ -3274,7 +3366,7 @@ $1',
* gpslongitude
* gpsaltitude',
-# EXIF tags
+# Exif tags
'exif-imagewidth' => 'വീതി',
'exif-imagelength' => 'ഉയരം',
'exif-bitspersample' => 'ഓരോ ഘടകതàµà´¤à´¿à´²àµà´®àµà´³àµà´³ ബിറàµà´±àµà´•àµ¾',
@@ -3448,7 +3540,7 @@ $1',
'exif-originalimageheight' => 'വെടàµà´Ÿà´¿à´¯àµ†à´Ÿàµà´•àµà´•àµà´¨àµà´¨à´¤à´¿à´¨àµ à´®àµà´®àµà´ªàµ à´šà´¿à´¤àµà´°à´¤àµà´¤à´¿à´¨àµà´±àµ† ഉയരം',
'exif-originalimagewidth' => 'വെടàµà´Ÿà´¿à´¯àµ†à´Ÿàµà´•àµà´•àµà´¨àµà´¨à´¤à´¿à´¨àµ à´®àµà´®àµà´ªàµ à´šà´¿à´¤àµà´°à´¤àµà´¤à´¿à´¨àµà´±àµ† വീതി',
-# EXIF attributes
+# Exif attributes
'exif-compression-1' => 'à´šàµà´°àµà´•àµà´•à´¾à´¤àµà´¤à´¤àµ',
'exif-compression-5' => 'എൽ.സെഡàµ.à´¡à´¬àµà´²àµà´¯àµ.',
'exif-compression-6' => 'ജെപിഇജി (പഴയതàµ)',
@@ -3843,7 +3935,6 @@ $5
'version-other' => 'മറàµà´±àµà´³àµà´³à´µ',
'version-mediahandlers' => 'മീഡിയ കൈകാരàµà´¯àµ‹à´ªà´•à´°à´£à´™àµà´™àµ¾',
'version-hooks' => 'കൊളàµà´¤àµà´¤àµà´•àµ¾',
-'version-extension-functions' => 'à´…à´¨àµà´¬à´¨àµà´§à´™àµà´™à´³àµà´Ÿàµ† കർതàµà´¤à´µàµà´¯à´™àµà´™àµ¾',
'version-parser-extensiontags' => 'പാഴàµâ€Œà´¸àµ¼ à´…à´¨àµà´¬à´¨àµà´§ à´±àµà´±à´¾à´—àµà´•àµ¾',
'version-parser-function-hooks' => 'പാഴàµâ€Œà´¸àµ¼ à´«à´™àµà´·àµ» കൊളàµà´¤àµà´¤àµà´•àµ¾',
'version-hook-name' => 'കൊളàµà´¤àµà´¤à´¿à´¨àµà´±àµ† പേരàµ',
@@ -3852,6 +3943,7 @@ $5
'version-license' => 'à´…à´¨àµà´®à´¤à´¿',
'version-poweredby-credits' => "à´ˆ വികàµà´•à´¿ à´ªàµà´°à´µàµ¼à´¤àµà´¤à´¿à´•àµà´•à´¾àµ» '''[//www.mediawiki.org/ മീഡിയവികàµà´•à´¿]''' ഉപയോഗികàµà´•àµà´¨àµà´¨àµ. പകർപàµà´ªà´µà´•à´¾à´¶à´‚ © 2001-$1 $2.",
'version-poweredby-others' => 'മറàµà´±àµà´³àµà´³à´µàµ¼',
+'version-poweredby-translators' => 'പരിഭാഷാവികàµà´•à´¿à´¯à´¿à´²àµ† പരിഭാഷകർ',
'version-credits-summary' => '[[Special:Version|മീഡിയവികàµà´•à´¿à´¯àµà´•àµà´•àµ]] നൽകിയ സംഭാവനകളàµà´Ÿàµ† പേരിൽ താഴെകàµà´•àµŠà´Ÿàµà´•àµà´•àµà´¨àµà´¨à´µàµ¼à´•àµà´•àµ à´žà´™àµà´™àµ¾ നനàµà´¦à´¿ പറയàµà´¨àµà´¨àµ.',
'version-license-info' => 'മീഡിയവികàµà´•à´¿ ഒരൠസàµà´µà´¤à´¨àµà´¤àµà´° സോഫàµà´±àµà´±àµâ€Œà´µàµ‡à´±à´¾à´£àµ; à´¸àµà´µà´¤à´¨àµà´¤àµà´° സോഫàµà´±àµà´±àµâ€Œà´µàµ‡àµ¼ ഫൗണàµà´Ÿàµ‡à´·àµ» à´ªàµà´°à´¸à´¿à´¦àµà´§àµ€à´•à´°à´¿à´šàµà´šà´¿à´Ÿàµà´Ÿàµà´³àµà´³ à´—àµà´¨àµ സാർവàµà´µà´œà´¨à´¿à´• à´…à´¨àµà´µà´¾à´¦à´ªà´¤àµà´°à´¤àµà´¤à´¿à´¨àµà´±àµ† പതിപàµà´ªàµ 2 à´ªàµà´°à´•à´¾à´°à´®àµ‹, à´…à´²àµà´²àµ†à´™àµà´•à´¿àµ½ (താങàµà´•à´³àµà´Ÿàµ† ഇചàµà´›à´¾à´¨àµà´¸à´°à´£à´‚) പിനàµà´¨àµ€à´Ÿàµ à´ªàµà´°à´¸à´¿à´¦àµà´§àµ€à´•à´°à´¿à´šàµà´š à´à´¤àµ†à´™àµà´•à´¿à´²àµà´‚ പതിപàµà´ªàµ à´ªàµà´°à´•à´¾à´°à´®àµ‹ താങàµà´•àµ¾à´•àµà´•à´¿à´¤àµ à´ªàµà´¨àµ¼à´µà´¿à´¤à´°à´£à´‚ ചെയàµà´¯à´¾à´¨àµà´‚ à´’à´ªàµà´ªà´‚/à´…à´²àµà´²àµ†à´™àµà´•à´¿àµ½ മാറàµà´±à´™àµà´™àµ¾ വരàµà´¤àµà´¤à´¾à´¨àµà´‚ സാധികàµà´•àµà´¨àµà´¨à´¤à´¾à´£àµ.
@@ -3867,12 +3959,17 @@ $5
'version-entrypoints-articlepath' => '[https://www.mediawiki.org/wiki/Manual:$wgArticlePath ലേഖന പഥം]',
'version-entrypoints-scriptpath' => '[https://www.mediawiki.org/wiki/Manual:$wgScriptPath à´¸àµà´•àµà´°à´¿à´ªàµà´±àµà´±àµ പഥം]',
-# Special:FilePath
-'filepath' => 'à´ªàµà´°à´®à´¾à´£à´¤àµà´¤à´¿à´²àµ‡à´•àµà´•àµà´³àµà´³ വിലാസം',
-'filepath-page' => 'à´ªàµà´°à´®à´¾à´£à´‚:',
-'filepath-submit' => 'പോകൂ',
-'filepath-summary' => 'à´ˆ à´ªàµà´°à´¤àµà´¯àµ‡à´• താൾ ഒരൠപàµà´°à´®à´¾à´£à´¤àµà´¤à´¿à´¨àµà´±àµ† പൂർണàµà´£ വിലാസം à´ªàµà´°à´¦àµ¼à´¶à´¿à´ªàµà´ªà´¿à´•àµà´•àµà´¨àµà´¨àµ.
-à´šà´¿à´¤àµà´°à´™àµà´™àµ¾ പൂർണàµà´£ റെസലൂഷനോടൠകൂടി à´ªàµà´°à´¦àµ¼à´¶à´¿à´ªàµà´ªà´¿à´šàµà´šà´¿à´°à´¿à´•àµà´•àµà´¨àµà´¨àµ. മറàµà´±àµà´³àµà´³ à´ªàµà´°à´®à´¾à´£ തരങàµà´™àµ¾ അതതൠപàµà´°àµ‹à´—àµà´°à´¾à´®à´¿àµ½ നേരിടàµà´Ÿàµ à´¤àµà´±à´•àµà´•à´¾à´µàµà´¨àµà´¨à´¤à´¾à´£àµâ€Œ.',
+# Special:Redirect
+'redirect' => 'à´ªàµà´°à´®à´¾à´£à´¤àµà´¤à´¾àµ½, ഉപയോകàµà´¤à´¾à´µà´¿à´¨à´¾àµ½ അഥവാ നാൾപàµà´ªà´¤à´¿à´ªàµà´ªàµ à´.à´¡à´¿. ചെയàµà´¯àµà´¨àµà´¨ തിരിചàµà´šàµà´µà´¿à´Ÿàµ½',
+'redirect-legend' => 'ഒരൠപàµà´°à´®à´¾à´£à´¤àµà´¤à´¿à´²àµ‹à´Ÿàµà´Ÿàµ‹ താളിലോടàµà´Ÿàµ‹ ഉളàµà´³ തിരിചàµà´šàµà´µà´¿à´Ÿàµ½',
+'redirect-summary' => 'à´ˆ à´ªàµà´°à´¤àµà´¯àµ‡à´• താൾ ഒരൠപàµà´°à´®à´¾à´£à´¤àµà´¤à´¿à´²àµ‡à´¯àµà´•àµà´•àµ‹ (à´ªàµà´°à´®à´¾à´£à´¤àµà´¤à´¿à´¨àµà´±àµ† പേരൠതനàµà´¨à´¿à´Ÿàµà´Ÿàµà´£àµà´Ÿàµ), ഒരൠതാളിലേയàµà´•àµà´•àµ‹ (നാൾപàµà´ªà´¤à´¿à´ªàµà´ªà´¿à´¨àµà´±àµ† à´à´¡à´¿ തനàµà´¨à´¿à´Ÿàµà´Ÿàµà´£àµà´Ÿàµ), à´…à´²àµà´²àµ†à´™àµà´•à´¿àµ½ ഒരൠഉപയോകàµà´¤àµƒà´¤à´¾à´³à´¿à´²àµ‡à´¯àµà´•àµà´•àµ‹ (ഉപയോകàµà´¤à´¾à´µà´¿à´¨àµà´±àµ† സംഖàµà´¯à´¾ à´.à´¡à´¿. തനàµà´¨à´¿à´Ÿàµà´Ÿàµà´£àµà´Ÿàµ) തിരിചàµà´šàµà´µà´¿à´Ÿàµà´¨àµà´¨àµ.',
+'redirect-submit' => 'പോകൂ',
+'redirect-lookup' => 'തേടàµà´•:',
+'redirect-value' => 'വില:',
+'redirect-user' => 'ഉപയോകàµà´¤àµƒ à´.à´¡à´¿.',
+'redirect-revision' => 'താളിനàµà´±àµ† നാൾപàµà´ªà´¤à´¿à´ªàµà´ªàµ',
+'redirect-file' => 'à´ªàµà´°à´®à´¾à´£à´¤àµà´¤à´¿à´¨àµà´±àµ† പേരàµ',
+'redirect-not-exists' => 'വില à´•à´£àµà´Ÿàµ†à´¤àµà´¤à´¾àµ» à´•à´´à´¿à´žàµà´žà´¿à´²àµà´²',
# Special:FileDuplicateSearch
'fileduplicatesearch' => 'ഒരേ à´ªàµà´°à´®à´¾à´£à´¤àµà´¤à´¿à´¨àµà´±àµ† പലപകർപàµà´ªàµà´•à´³àµà´£àµà´Ÿàµ‹à´¯àµ†à´¨àµà´¨àµ തിരയàµà´•',
@@ -3922,12 +4019,16 @@ $5
'tags' => 'സാധàµà´µà´¾à´¯ മാറàµà´±à´™àµà´™à´³àµà´Ÿàµ† à´…à´¨àµà´¬à´¨àµà´§à´™àµà´™àµ¾',
'tag-filter' => '[[Special:Tags|à´…à´¨àµà´¬à´¨àµà´§à´™àµà´™à´³àµà´Ÿàµ†]] à´…à´°à´¿à´ªàµà´ª:',
'tag-filter-submit' => 'à´…à´°à´¿à´ªàµà´ª',
+'tag-list-wrapper' => '([[Special:Tags|{{PLURAL:$1|à´±àµà´±à´¾à´—àµ|à´±àµà´±à´¾à´—àµà´•àµ¾}}]]: $2)',
'tags-title' => 'à´…à´¨àµà´¬à´¨àµà´§à´™àµà´™àµ¾',
'tags-intro' => 'സോഫàµà´±àµà´±àµâ€Œà´µàµ†à´¯àµ¼ അടയാളപàµà´ªàµ†à´Ÿàµà´¤àµà´¤à´¿à´¯ തിരàµà´¤àµà´¤àµà´•à´³àµà´Ÿàµ† à´…à´¨àµà´¬à´¨àµà´§à´™àµà´™à´³àµà´‚, അവയàµà´Ÿàµ† അർതàµà´¥à´µàµà´‚ à´ˆ താളിൽ à´ªàµà´°à´¦àµ¼à´¶à´¿à´ªàµà´ªà´¿à´•àµà´•àµà´¨àµà´¨àµ.',
'tags-tag' => 'à´±àµà´±à´¾à´—à´¿à´¨àµà´±àµ† പേരàµâ€Œ',
'tags-display-header' => 'മാറàµà´±à´™àµà´™à´³àµà´Ÿàµ† പടàµà´Ÿà´¿à´•à´•à´³à´¿à´²àµ† രൂപം',
'tags-description-header' => 'അർതàµà´¥à´¤àµà´¤à´¿à´¨àµà´±àµ† പൂർണàµà´£ വിവരണം',
+'tags-active-header' => 'സീജീവമാണോ?',
'tags-hitcount-header' => 'à´…à´¨àµà´¬à´¨àµà´§à´®àµà´³àµà´³ മാറàµà´±à´™àµà´™àµ¾',
+'tags-active-yes' => 'അതെ',
+'tags-active-no' => 'à´…à´²àµà´²',
'tags-edit' => 'തിരàµà´¤àµà´¤àµà´•',
'tags-hitcount' => '{{PLURAL:$1|ഒരൠമാറàµà´±à´‚|$1 മാറàµà´±à´™àµà´™àµ¾}}',
@@ -3948,6 +4049,7 @@ $5
'dberr-problems' => 'à´•àµà´·à´®à´¿à´•àµà´•à´£à´‚! à´ˆ സൈറàµà´±à´¿àµ½ സാങàµà´•àµ‡à´¤à´¿à´• തകരാറàµà´•àµ¾ à´…à´¨àµà´­à´µà´ªàµà´ªàµ†à´Ÿàµà´¨àµà´¨àµà´£àµà´Ÿàµ.',
'dberr-again' => 'à´•àµà´±à´šàµà´šàµ മിനിടàµà´Ÿàµà´•àµ¾ കാതàµà´¤à´¿à´°àµà´¨àµà´¨àµ വീണàµà´Ÿàµà´‚ à´¤àµà´±à´•àµà´•àµà´µà´¾àµ» à´¶àµà´°à´®à´¿à´•àµà´•àµà´•.',
'dberr-info' => '(വിവരശേഖര സെർവറàµà´®à´¾à´¯à´¿ ബനàµà´§à´ªàµà´ªàµ†à´Ÿà´¾àµ» പറàµà´±à´¿à´¯à´¿à´²àµà´²: $1)',
+'dberr-info-hidden' => '(ഡേറàµà´±à´¾à´¬àµ‡à´¸àµ സെർവറàµà´®à´¾à´¯à´¿ ബനàµà´§à´ªàµà´ªàµ†à´Ÿà´°àµà´¤àµ)',
'dberr-usegoogle' => 'അതേസമയം താങàµà´•àµ¾à´•àµà´•àµ ഗൂഗിൾ വഴി തിരയàµà´µà´¾àµ» à´¶àµà´°à´®à´¿à´•àµà´•à´¾à´µàµà´¨àµà´¨à´¤à´¾à´£àµ.',
'dberr-outofdate' => 'അവരàµà´Ÿàµ† പകàµà´•à´²àµà´³àµà´³ നമàµà´®àµà´Ÿàµ† ഉളàµà´³à´Ÿà´•àµà´•à´¤àµà´¤à´¿à´¨àµà´±àµ† സൂചികകൾ കാലഹരണപàµà´ªàµ†à´Ÿàµà´Ÿà´¤à´¾à´•à´¾à´®àµ†à´¨àµà´¨àµ ഓർകàµà´•àµà´•.',
'dberr-cachederror' => 'ആവശàµà´¯à´ªàµà´ªàµ†à´Ÿàµà´Ÿ താളിനàµà´±àµ† കാഷൠചെയàµà´¯à´ªàµà´ªàµ†à´Ÿàµà´Ÿ പകർപàµà´ªà´¾à´£à´¿à´¤àµ, ഇതൠഇപàµà´ªàµ‹à´´àµà´³àµà´³à´¤à´¾à´•à´£à´®àµ†à´¨àµà´¨à´¿à´²àµà´².',
@@ -3963,6 +4065,9 @@ $5
'htmlform-submit' => 'സമർപàµà´ªà´¿à´•àµà´•àµà´•',
'htmlform-reset' => 'മാറàµà´±à´™àµà´™àµ¾ വേണàµà´Ÿ',
'htmlform-selectorother-other' => 'മറàµà´±àµà´³àµà´³à´µ',
+'htmlform-no' => 'ഇലàµà´²',
+'htmlform-yes' => 'ശരി',
+'htmlform-chosen-placeholder' => 'ഒരൠà´à´šàµà´›à´¿à´•à´‚ തിരഞàµà´žàµ†à´Ÿàµà´•àµà´•àµà´•',
# SQLite database support
'sqlite-has-fts' => 'പൂർണàµà´£-à´Žà´´àµà´¤àµà´¤àµ തിരചàµà´šà´¿àµ½ പിനàµà´¤àµà´£à´¯àµà´³àµà´³ $1',
@@ -4080,4 +4185,19 @@ $5
# Image rotation
'rotate-comment' => 'à´šà´¿à´¤àµà´°à´‚ à´ªàµà´°à´¦à´•àµà´·à´¿à´£à´¦à´¿à´¶à´¯à´¿àµ½ {{PLURAL:$1|ഒരൠഡിഗàµà´°à´¿|$1 à´¡à´¿à´—àµà´°à´¿}} തിരിചàµà´šàµ',
+# Limit report
+'limitreport-title' => 'പാഴàµà´¸àµ¼ à´ªàµà´°àµŠà´«àµˆà´²à´¿à´™à´¿à´¨àµà´±àµ† വിവരങàµà´™àµ¾:',
+'limitreport-cputime' => 'സി.പി.à´¯àµ. സമയ ഉപയോഗം',
+'limitreport-cputime-value' => '{{PLURAL:$1|ഒരൠസെകàµà´•à´¨àµà´±àµ|$1 സെകàµà´•à´¨àµà´±àµ}}',
+'limitreport-walltime' => 'യഥാർതàµà´¥ സമയ ഉപയോഗം',
+'limitreport-walltime-value' => '{{PLURAL:$1|ഒരൠസെകàµà´•à´¨àµà´±àµ|$1 സെകàµà´•à´¨àµà´±àµ}}',
+'limitreport-ppvisitednodes' => 'à´ªàµà´°àµ€à´ªàµà´°àµ‹à´¸à´¸àµ¼ സനàµà´¦àµ¼à´¶à´¿à´šàµà´š നോഡിനàµà´±àµ† à´Žà´£àµà´£à´‚',
+'limitreport-ppgeneratednodes' => 'à´ªàµà´°àµ€à´ªàµà´°àµ‹à´¸àµ¼ സൃഷàµà´Ÿà´¿à´šàµà´š നോഡിനàµà´±àµ† à´Žà´£àµà´£à´‚',
+'limitreport-postexpandincludesize' => 'വികസിപàµà´ªà´¿à´šàµà´šà´¤à´¿à´¨àµ ശേഷമàµà´³àµà´³ ഉൾപàµà´ªàµ†à´Ÿàµà´¤àµà´¤àµ½ വലിപàµà´ªà´‚',
+'limitreport-postexpandincludesize-value' => '$1/$2 {{PLURAL:$2|ബൈറàµà´±àµ |ബൈറàµà´±àµà´•àµ¾}}',
+'limitreport-templateargumentsize' => 'ഫലകതàµà´¤à´¿à´²àµ† à´šà´°à´™àµà´™àµ¾à´•àµà´•à´¨àµà´µà´¦à´¿à´šàµà´šà´¿à´°à´¿à´•àµà´•àµà´¨àµà´¨ വലിപàµà´ªà´‚',
+'limitreport-templateargumentsize-value' => '$1/$2 {{PLURAL:$2|ബൈറàµà´±àµ |ബൈറàµà´±àµà´•àµ¾}}',
+'limitreport-expansiondepth' => 'വികസിപàµà´ªà´¿à´•àµà´•à´¾à´¨à´¾à´µàµà´¨àµà´¨ ഉയർനàµà´¨ പരിധി',
+'limitreport-expensivefunctioncount' => 'à´µàµà´¯à´¯à´®àµ‡à´±à´¿à´¯ പാഴàµà´¸àµ¼ à´«à´™àµà´·àµ» à´Žà´£àµà´£à´‚',
+
);
diff --git a/languages/messages/MessagesMn.php b/languages/messages/MessagesMn.php
index 7eb7dd49..04734d64 100644
--- a/languages/messages/MessagesMn.php
+++ b/languages/messages/MessagesMn.php
@@ -72,9 +72,6 @@ $messages = array(
'tog-shownumberswatching' => 'Харж буй Ñ…ÑÑ€ÑглÑгчдийн тоог үзүүлÑÑ…',
'tog-oldsig' => 'Одоогийн гарын Ò¯ÑÑг:',
'tog-fancysig' => 'Түүхий гарын Ò¯ÑÑг (автомат холбооÑгүй)',
-'tog-externaleditor' => 'ҮндÑÑн горимд нÑмÑлт заÑварлах багаж Ñ…ÑÑ€ÑглÑх(ÑкÑпертүүдÑд зориулагдÑан, таны компьютерт туÑгай тохиргоо шаардлагатай)',
-'tog-externaldiff' => 'ҮндÑÑн горим гадаад харьцуулагч программ ашиглах (ÑкÑпертүүдÑд зориулав, таны компьютерт туÑгай тохиргоо шаардлагатай)',
-'tog-showjumplinks' => '"Шууд очих" Ñ…Ñлбар линкүүдийг ажиллагаатай болгох',
'tog-uselivepreview' => 'Шууд байдлаар урьдчилж харах (ЖаваСкрипт) (Туршилт)',
'tog-forceeditsummary' => 'Товч агуулгын талбарыг хооÑон үлдÑÑÑ…Ñд надад мÑдÑгдÑÑ…',
'tog-watchlisthideown' => 'Ð¥Ñнах жагÑÐ°Ð°Ð»Ñ‚Ð°Ð°Ñ Ð¼Ð¸Ð½Ð¸Ð¹ заÑваруудыг нуух',
@@ -273,7 +270,7 @@ $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).
+# 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).
'aboutsite' => '{{SITENAME}}-н тухай',
'aboutpage' => 'Project:Тухай',
'copyright' => 'Ðгуулгыг $1-н хувьд Ñ…ÑÑ€ÑглÑÑ… боломжтой.',
@@ -283,7 +280,6 @@ $1',
'disclaimers' => 'Татгалзлууд',
'disclaimerpage' => 'Project:Ерөнхий татгалзал',
'edithelp' => 'ЗаÑвар хийх тухай туÑламж',
-'edithelppage' => 'Help:ЗаÑварлах',
'helppage' => 'Help:Ðгуулга',
'mainpage' => 'Ðүүр хуудаÑ',
'mainpage-description' => 'Ðүүр хуудаÑ',
@@ -362,17 +358,6 @@ $1',
# General errors
'error' => 'Aлдаа',
'databaseerror' => 'Өгөгдлийн Ñангийн алдаа',
-'dberrortext' => 'Өгөгдлийн Ñан дахь хайлтанд ÑинтакÑийн алдаа гарлаа.
-Ð­Ð½Ñ Ð½ÑŒ програм хангамжид алдаа байгааг харуулж байж болзошгүй.
-Хамгийн Ñүүлд гүйцÑтгÑÑÑн өгөгдлийн Ñан дахь хайлт нь:
-"<tt>$2</tt>" функц доторх
-<blockquote><tt>$1</tt></blockquote> байна.
-Өгөгдлийн Ñан нь "<tt>$3: $4</tt>" гÑÑÑн алдааг буцаав.',
-'dberrortextcl' => 'Өгөгдлийн Ñан дахь хайлтанд ÑинтакÑийн алдаа гарлаа.
-Хамгийн Ñүүлд гүйцÑтгÑÑÑн мÑдÑÑллийн бааз дахь хайлт нь
-"$2" функц доторх:
-"$1" байна.
-Өгөгдлийн Ñан нь "$3: $4" алдааг буцаав',
'laggedslavemode' => 'Ðнхаар: Ð­Ð½Ñ Ñ…ÑƒÑƒÐ´Ð°Ñ Ð½ÑŒ хамгийн Ñүүлийн өөрчлөлтүүдийг хамруулаагүй байж болно.',
'readonly' => 'ÐœÑдÑÑллийн Ñан түгжигдÑÑн байна',
'enterlockreason' => 'Түгжих болÑон шалтгаан болон Ñ…ÑзÑÑ ÑƒÐ³ түгжÑÑ Ð½ÑŒ тайлагдах тухай оруулна уу.',
@@ -425,7 +410,6 @@ $1',
'editinginterface' => "'''Ðнхаар''': Та программын харагдах байдалд ашиглагддаг текÑтийг агуулÑан хуудÑыг заÑварлах гÑж байна.
Ð­Ð½Ñ Ñ…ÑƒÑƒÐ´Ñанд өөрчлөлт оруулÑнаар буÑад Ñ…ÑÑ€ÑглÑгчдийн программын харагдах байдалд нөлөөлөх болно.
Орчуулга хийх гÑж байгаа бол МедиаВикигийн орчуулгын Ñ‚Ó©Ñөл болох, [//translatewiki.net/wiki/Main_Page?setlang=mn Бетавики]-г Ñ…ÑÑ€ÑглÑхийг Ñанал болгож байна.",
-'sqlhidden' => '(SQL илÑрц харагдахгүй байна)',
'cascadeprotected' => 'Ð­Ð½Ñ Ñ…ÑƒÑƒÐ´Ð°Ñ Ð½ÑŒ давхар хамгаалалттай дараах {{PLURAL:$1|хуудÑанд|хуудÑуудад}} орÑон тул заÑÐ²Ð°Ñ€Ð»Ð°Ð³Ð´Ð°Ñ…Ð°Ð°Ñ Ñ…Ð°Ð¼Ð³Ð°Ð°Ð»Ð°Ð³Ð´Ñан байна:
$2',
'namespaceprotected' => "Таньд '''$1''' нÑрний зай дахь хуудÑуудыг заÑварлах зөвшөөрөл байхгүй байна.",
@@ -459,7 +443,6 @@ $2',
'yourpassword' => 'Ðууц үг:',
'yourpasswordagain' => 'Ðууц үгÑÑ Ð´Ð°Ñ…Ð¸Ð½ оруулах:',
'remembermypassword' => 'Ð­Ð½Ñ ÐºÐ¾Ð¼Ð¿ÑŒÑŽÑ‚ÐµÑ€ дÑÑрх миний нÑвтрÑлтийг Ñана (хамгийн дÑÑд талдаа $1 {{PLURAL:$1|өдрийн|өдрийн}} туршид)',
-'securelogin-stick-https' => 'ÐÑвтÑÑ€Ñний дараа HTTPS -д нÑвтÑÑ€ÑÑн Ñ…ÑвÑÑÑ€ байх',
'yourdomainname' => 'Таны домÑйн:',
'password-change-forbidden' => 'Та ÑÐ½Ñ Ð²Ð¸ÐºÐ¸ дÑÑрх нууц үгÑÑ Ñольж болохгүй.',
'externaldberror' => 'ÐÑг бол гадны баталгаажуулах мÑдÑÑллийн Ñангийн алдаа гарÑан, ÑÑвÑл та өөрийн гадны бүртгÑлÑÑ ÑˆÐ¸Ð½ÑчлÑÑ… Ñрхгүй байна.',
@@ -564,7 +547,7 @@ $2',
'newpassword' => 'Ð¨Ð¸Ð½Ñ Ð½ÑƒÑƒÑ† үг:',
'retypenew' => 'Ð¨Ð¸Ð½Ñ Ð½ÑƒÑƒÑ† үгÑÑ Ð´Ð°Ñ…Ð¸Ð½ оруулах:',
'resetpass_submit' => 'Ðууц үгÑÑ Ñ‚Ð¾Ð³Ñ‚Ð¾Ð¾Ð¶ нÑвтрÑÑ…',
-'resetpass_success' => 'Таны нууц үг амжилттай Ñолигдлоо! Та одоо нÑвтÑрч байна...',
+'changepassword-success' => 'Таны нууц үг амжилттай Ñолигдлоо! Та одоо нÑвтÑрч байна...',
'resetpass_forbidden' => 'Ðууц үг өөрчлөх боломжгүй',
'resetpass-no-info' => 'Ð­Ð½Ñ Ñ…ÑƒÑƒÐ´Ñыг шууд үзÑхийн тулд нÑвтÑрч орÑон байх шаардлагатай.',
'resetpass-submit-loggedin' => 'Ðууц үгÑÑ Ñолих',
@@ -575,10 +558,8 @@ $2',
# Special:PasswordReset
'passwordreset' => 'Ðууц үгийг ÑÑргÑÑÑ…',
-'passwordreset-text' => 'ЭнÑÑ…Ò¯Ò¯ маÑгтыг бөглөж Ñ…ÑÑ€ÑглÑгчийн мÑдÑÑллÑÑ Ð°Ð²Ð°Ð°Ñ€Ð°Ð¹.',
'passwordreset-legend' => 'Ðууц үгÑÑ ÑÑргÑÑÑ…',
'passwordreset-disabled' => 'Ð­Ð½Ñ Ð²Ð¸ÐºÐ¸-д нууц үгийг ÑÑргÑÑÑ… боломжгүй байна.',
-'passwordreset-pretext' => '{{PLURAL:$1||Доорх өгөгдлийн аль нÑг Ñ…ÑÑгийг оруулна уу}}',
'passwordreset-username' => 'Ð¥ÑÑ€ÑглÑгчийн нÑÑ€:',
'passwordreset-domain' => 'Домайн:',
'passwordreset-capture' => 'Цахим шуудангийн нууц үг ÑÑргÑÑÑ… шууданг үзÑÑ…',
@@ -1052,7 +1033,6 @@ $1",
'searchmenu-legend' => 'Хайх Ñонголтууд',
'searchmenu-exists' => "'''Ð­Ð½Ñ Ð²Ð¸ÐºÐ¸Ð´ \"[[:\$1]]\" гÑÑÑн Ñ…ÑƒÑƒÐ´Ð°Ñ Ð±Ð°Ð¹Ð½Ð°'''",
'searchmenu-new' => "'''Ð­Ð½Ñ Ð²Ð¸ÐºÐ¸Ð´ \"[[:\$1]]\" гÑÑÑн хуудÑыг Ò¯Ò¯ÑгÑÑ…!'''",
-'searchhelp-url' => 'Help:Ðгуулга',
'searchmenu-prefix' => '[[Special:PrefixIndex/$1|Ð­Ð½Ñ ÑƒÐ³Ñ‚Ð²Ð°Ñ€Ñ‚Ð°Ð¹ хуудÑуудыг гүйлгÑж харах]]',
'searchprofile-articles' => 'Ðгуулгын хуудÑууд',
'searchprofile-project' => 'ТуÑламжийн болон Ñ‚Ó©Ñлийн хуудÑууд',
@@ -1097,15 +1077,6 @@ $1",
Та одоохондоо Google-г ашиглан хайх боломжтой.
Ðнхааруулж Ñ…ÑлÑÑ…Ñд, Ñ‚Ñдний {{SITENAME}}-н агуулгын индекÑүүд хоцрогдÑон байж магадгүй.',
-# Quickbar
-'qbsettings' => 'Шуурхай тавцан',
-'qbsettings-none' => 'Байхгүй',
-'qbsettings-fixedleft' => 'Зүүн талд бÑхжүүлÑÑн',
-'qbsettings-fixedright' => 'Баруун талд бÑхжүүлÑÑн',
-'qbsettings-floatingleft' => 'Зүүн талд хөвÑөн',
-'qbsettings-floatingright' => 'Баруун талд хөвÑөн',
-'qbsettings-directionality' => 'Тухай Ñ…Ñлний Ð±Ð°Ñ€Ð¸Ð»Ð°Ð°Ñ Ñ…Ð°Ð¼Ð°Ð°Ñ€Ñ‡ Ñ…ÑлбÑрийг бий болгох',
-
# Preferences page
'preferences' => 'Ð¥ÑÑ€ÑглÑгчийн тохиргоо',
'mypreferences' => 'Миний тохиргоо',
@@ -1138,7 +1109,6 @@ $1",
'resetprefs' => 'Хадгалаагүй өөрчлөлтүүдийг арилгах',
'restoreprefs' => 'Бүх тохиргоог анхны байдалд оруулах',
'prefs-editing' => 'ЗаÑварлах',
-'prefs-edit-boxsize' => 'ЗаÑварлах цонхны Ñ…ÑмжÑÑ.',
'rows' => 'Мөр:',
'columns' => 'Багана:',
'searchresultshead' => 'Хайлт',
@@ -1149,9 +1119,6 @@ $1",
'recentchangesdays-max' => 'Хамгийн ихдÑÑ $1 өдөр',
'recentchangescount' => 'ҮзүүлÑÑ… заÑварын тоо (анхны байдалд):',
'prefs-help-recentchangescount' => 'Энд Ñүүлийн өөрчлөлтүүд, хуудаÑны түүхүүд, логууд орно.',
-'prefs-help-watchlist-token' => 'ЭнÑÑ…Ò¯Ò¯ талбарыг нууц түлхүүртÑйгÑÑÑ€ бөглөвөл таны Ñ…Ñнаж буй хуудÑуудын жагÑаалтаар RSS фийд Ò¯Ò¯ÑгÑгдÑнÑ.
-Ð¢ÑƒÑ Ñ‚Ò¯Ð»Ñ…Ò¯Ò¯Ñ€Ð¸Ð¹Ð³ мÑдÑÑн хүн бүр таны Ñ…Ñнаж буй хуудÑуудын жагÑаалтыг харах боломжтой тул чанартай утга Ñонгоорой.
-Таны Ñ…ÑÑ€ÑглÑж болох ÑанамÑаргүй утга: $1',
'savedprefs' => 'Таны тохиргоо хадгалагдлаа.',
'timezonelegend' => 'Цагийн бүÑ:',
'localtime' => 'Орон нутгийн цаг:',
@@ -1182,7 +1149,6 @@ $1",
'prefs-reset-intro' => 'Та ÑÐ½Ñ Ñ…ÑƒÑƒÐ´Ñыг ашиглан өөрийн тохиргоог Ñайтын анхны тохиргооо руу шилжүүлÑÑ… боломжтой.
Ð­Ð½Ñ Ò¯Ð¹Ð»Ð´Ð»Ð¸Ð¹Ð³ буцаах боломжгүй.',
'prefs-emailconfirm-label' => 'ÐœÑйлийн баталгаажуулалт:',
-'prefs-textboxsize' => 'ЗаÑварлах талбарын Ñ…ÑмжÑÑ',
'youremail' => 'ÐœÑйл хаÑг:',
'username' => '{{GENDER:$1|Ð¥ÑÑ€ÑглÑгчийн нÑÑ€}}:',
'uid' => '{{GENDER:$1|Ð¥ÑÑ€ÑглÑгчийн}} ID:',
@@ -1421,7 +1387,6 @@ $1 Ñ‚ÑмдÑгтÑÑÑ Ð±Ð¾Ð³Ð¸Ð½Ð¾ байх Ñ‘Ñтой.',
'recentchangeslinked-feed' => 'Холбогдох өөрчлөлтүүд',
'recentchangeslinked-toolbox' => 'Холбогдох өөрчлөлтүүд',
'recentchangeslinked-title' => '"$1"-тай холбоотой заÑварууд',
-'recentchangeslinked-noresult' => 'ӨгөгдÑөн хугацаанд холбогдÑон хуудÑууд дÑÑÑ€ заÑвар хийгдÑÑгүй байна.',
'recentchangeslinked-summary' => "Ð­Ð½Ñ Ñ…ÑƒÑƒÐ´Ð°Ñ Ð±Ð¾Ð» тодорхой хуудаÑÐ½Ð°Ð°Ñ ï¼ˆÑÑвÑл тодорхой ангиллын доторх хуудÑууд) холбогдÑон хуудÑуудад хийгдÑÑн өөрчлөлтийн жагÑаалт юм.
Таны [[Special:Watchlist|Ñ…Ñнах жагÑаалтанд]] буй хуудÑууд '''тодруулагдÑан''' байгаа.",
'recentchangeslinked-page' => 'ХуудаÑны нÑÑ€:',
@@ -1659,7 +1624,6 @@ https://www.mediawiki.org/wiki/Manual:Image_Authorization -г харна уу.',
'http-read-error' => 'HTTP-г унших алдаа.',
'http-timed-out' => 'HTTP Ñ…Ò¯ÑÑлтийн хугацаа дууÑав.',
'http-curl-error' => 'Дараах URL-г авчрахад алдаа гарав: $1',
-'http-host-unreachable' => 'URL-д хүрч чадÑангүй.',
'http-bad-status' => 'HTTP хандалтын үед аÑуудал Ò¯Ò¯ÑÑв: $1 $2',
# Some likely curl errors. More could be added from <http://curl.haxx.se/libcurl/c/libcurl-errors.html>
@@ -1805,12 +1769,6 @@ URL нь зөв болон Ñайт ажиллагаатай байгаа ÑÑÑ
'statistics-users-active-desc' => 'Сүүлийн {{PLURAL:$1|өдөрт|$1 өдөрт}} үйлдÑл хийÑÑн Ñ…ÑÑ€ÑглÑгчид',
'statistics-mostpopular' => 'Хамгийн олон удаа үзÑÑн хуудÑууд',
-'disambiguations' => 'Ó¨Ó©Ñ€ агуулгатай хуудÑуудтай холбоотой хуудÑууд',
-'disambiguationspage' => 'Template:Салаа утгатай',
-'disambiguations-text' => "Дараах хуудÑууд '''Ñалаа утгатай үгнүүдийн хуудаÑ''' руу холбогдоно.
-ТÑдгÑÑÑ€ нь зөв ÑÑдÑв руу холбогдох Ñ‘Ñтой.<br />
-[[MediaWiki:Disambiguationspage]]-Ñ Ñ…Ð¾Ð»Ð±Ð¾Ð³Ð´Ñон загвар Ñ…ÑÑ€ÑглÑж байвал Ñ…ÑƒÑƒÐ´Ð°Ñ Ð½ÑŒ Ñалаа утгатай үгнүүдийн Ñ…ÑƒÑƒÐ´Ð°Ñ Ð³Ñж тооцогдоно.",
-
'doubleredirects' => 'Давхар чиглүүлÑгчүүд',
'doubleredirectstext' => 'Ð­Ð½Ñ Ñ…ÑƒÑƒÐ´Ñанд Ó©Ó©Ñ€ хуудÑуудыг давхар зааÑан хуудÑуудыг жагÑааÑан байна
Мөр Ñ‚ÑƒÑ Ð±Ò¯Ñ€ нь Ñхний зааÑан болон түүний дараах зааÑан хуудÑуудыг жагÑаан бичÑÑний Ñацуу уг хоёр хуудÑын ÑцÑийн чиглүүлÑÑн "жинхÑнÑ" хуудÑыг үзүүлÑÑн байна.',
@@ -2045,10 +2003,9 @@ URL нь зөв болон Ñайт ажиллагаатай байгаа ÑÑÑ
'unwatchthispage' => 'Ð¥Ñнахаа зогÑоох',
'notanarticle' => 'Ðгуулгагүй хуудаÑ',
'notvisiblerev' => 'ЗаÑвар уÑтгагдлаа',
-'watchnochange' => 'ДурьдагдÑан хугацаанд таны Ñ…Ñнаж буй хуудÑуудад өөрчлөлт ороогүй байна.',
'watchlist-details' => 'Ð¥Ñналтын жагÑаалтад {{PLURAL:$1|$1 хуудаÑ|$1 хуудаÑнууд}} байна.',
-'wlheader-enotif' => '* И-мÑйл мÑдÑгдÑл хүчинтÑй боллоо.',
-'wlheader-showupdated' => "* Таны хамгийн Ñүүлд айлчилÑÐ½Ð°Ð°Ñ Ñ…Ð¾Ð¹Ñˆ өөрчлөгдÑөн хуудÑууд '''тодоор''' бичигдÑÑн байгаа",
+'wlheader-enotif' => 'И-мÑйл мÑдÑгдÑл хүчинтÑй боллоо.',
+'wlheader-showupdated' => "Таны хамгийн Ñүүлд айлчилÑÐ½Ð°Ð°Ñ Ñ…Ð¾Ð¹Ñˆ өөрчлөгдÑөн хуудÑууд '''тодоор''' бичигдÑÑн байгаа",
'watchmethod-recent' => 'Ñ…Ñналтад буй хуудÑуудад ÑˆÐ¸Ð½Ñ Ó©Ó©Ñ€Ñ‡Ð»Ó©Ð»Ñ‚ орÑон ÑÑÑхийг шалгаж байна',
'watchmethod-list' => 'Ñ…Ñналтад буй хуудÑуудад ÑаÑхан өөрчлөлт орÑон ÑÑÑхийг шалгаж байна',
'watchlistcontains' => 'Таны Ñ…Ñнах жагÑаалтанд $1 Ñ…ÑƒÑƒÐ´Ð°Ñ Ð±Ð°Ð¹Ð½Ð°.',
@@ -2441,12 +2398,9 @@ $1',
Харин ÑÐ½Ñ Ð½ÑŒ $2 Ñ…ÑÑгийн Ñ…ÑÑÑг болж түгжигдÑÑн байгаа бөгөөд үүнийг тайлах боломжтой.',
'ip_range_invalid' => 'Хүчингүй IP-н хүрÑÑ.',
'ip_range_toolarge' => '/$1-Ñ Ñ‚Ð¾Ð¼ Ñ…ÑмжÑÑÑ‚Ñй түгжÑÑ Ð½ÑŒ хориотой.',
-'blockme' => 'Ðамайг түгж',
'proxyblocker' => 'Түгжигч прокÑи',
-'proxyblocker-disabled' => 'Ð­Ð½Ñ Ñ„ÑƒÐ½ÐºÑ†Ð¸Ð¹Ð³ хааÑан байна.',
'proxyblockreason' => 'Таны IP хаÑг нь чөлөөт прокÑи ÑƒÑ‡Ñ€Ð°Ð°Ñ Ñ‚Ò¯Ð³Ð¶Ð¸Ð³Ð´ÑÑн байна.
Та өөрийн ISP-Ñ‚ÑйгÑÑ Ñ…Ð¾Ð»Ð±Ð¾Ð¾ барьж техникийн зөвлөгөө авч ÑÐ½Ñ Ð°Ñуудлынхаа тухай Ñ…ÑÐ»Ð½Ñ Ò¯Ò¯.',
-'proxyblocksuccess' => 'ГүйцÑтгÑÑÑн.',
'sorbsreason' => '{{SITENAME}}-н Ñ…ÑÑ€ÑглÑдÑг DNSBL-д таны IP хаÑгийг чөлөөт прокÑи Ñ…ÑмÑÑн тодорхойлÑон байна.',
'sorbs_create_account_reason' => '{{SITENAME}}-н Ñ…ÑÑ€ÑглÑдÑг DNSBL-д таны IP хаÑгийг чөлөөт прокÑи гÑж Ñ‚ÑмдÑглÑÑÑн байна.
Та бүртгÑл Ò¯Ò¯ÑгÑÑ… боломжгүй.',
@@ -2886,7 +2840,7 @@ $1',
* gpslongitude
* gpsaltitude',
-# EXIF tags
+# Exif tags
'exif-imagewidth' => 'Өргөн',
'exif-imagelength' => 'Өндөр',
'exif-bitspersample' => 'БүрÑлдÑхүүн Ñ…ÑÑÑг бүр дÑÑ… бит',
@@ -3040,7 +2994,7 @@ $1',
'exif-giffilecomment' => 'GIF файлын Ñ‚ÑмдÑглÑгÑÑ',
'exif-intellectualgenre' => 'Зүйлийн төрөл',
-# EXIF attributes
+# Exif attributes
'exif-compression-1' => 'Шахагдаагүй',
'exif-unknowndate' => 'ÐœÑдÑгдÑхгүй огноо',
@@ -3366,7 +3320,6 @@ $5
'version-other' => 'БуÑад',
'version-mediahandlers' => 'Медиа боловÑруулагч',
'version-hooks' => 'Гогцоо',
-'version-extension-functions' => 'Өргөтгөлүүдийн функцууд',
'version-parser-extensiontags' => 'ПарÑер нÑмÑлт тагууд',
'version-parser-function-hooks' => 'ПарÑер функцийн тагууд',
'version-hook-name' => 'Хүүкийн нÑÑ€',
@@ -3379,13 +3332,6 @@ $5
'version-software-product' => 'БүтÑÑгдÑхүүн',
'version-software-version' => 'Хувилбар',
-# Special:FilePath
-'filepath' => 'Файлын зам',
-'filepath-page' => 'Файл:',
-'filepath-submit' => 'Явах',
-'filepath-summary' => 'ЭнÑÑ…Ò¯Ò¯ туÑгай Ñ…ÑƒÑƒÐ´Ð°Ñ Ð½ÑŒ файлын бүтÑн замыг дуудна.
-Зургууд нь бүтÑн Ñ…ÑмжÑÑгÑÑÑ€ÑÑ Ð³Ð°Ñ€Ð°Ñ… ба буÑад файлын төрлүүд нь тохирох програмаараа шууд нÑÑгдÑнÑ.',
-
# Special:FileDuplicateSearch
'fileduplicatesearch' => 'ДавхардÑан файлуудыг хайх',
'fileduplicatesearch-summary' => 'Ð¥Ñш кодыг ашиглан давхардÑан файлуудын хайна.',
diff --git a/languages/messages/MessagesMr.php b/languages/messages/MessagesMr.php
index 200fd84b..b59092be 100644
--- a/languages/messages/MessagesMr.php
+++ b/languages/messages/MessagesMr.php
@@ -354,9 +354,6 @@ $messages = array(
'tog-shownumberswatching' => 'पहारा देणाऱà¥à¤¯à¤¾ सदसà¥à¤¯à¤¾à¤‚चा आकडा दाखवा',
'tog-oldsig' => 'सधà¥à¤¯à¤¾à¤šà¥€ सही:',
'tog-fancysig' => 'सही विकिसंजà¥à¤žà¤¾ मà¥à¤¹à¤£à¥‚न वापरा (आपोआप दà¥à¤µà¥à¤¯à¤¾à¤¶à¤¿à¤µà¤¾à¤¯)',
-'tog-externaleditor' => 'कायम बाहà¥à¤¯ संपादक वापरा (फकà¥à¤¤ पà¥à¤°à¤¶à¤¿à¤•à¥à¤·à¤¿à¤¤ सदसà¥à¤¯à¤¾à¤‚साठीच, संगणकावर विशेष पà¥à¤°à¤£à¤¾à¤²à¥€ लागते) ([//www.mediawiki.org/wiki/Manual:External_editors अधिक माहिती])',
-'tog-externaldiff' => 'इतिहास पानावर निवडलेलà¥à¤¯à¤¾ आवृतà¥à¤¤à¥à¤¯à¤¾à¤‚मधील बदल दाखविणà¥à¤¯à¤¾à¤¸à¤¾à¤ à¥€ बाहà¥à¤¯ पà¥à¤°à¤£à¤¾à¤²à¥€ वापरा (फकà¥à¤¤ पà¥à¤°à¤¶à¤¿à¤•à¥à¤·à¤¿à¤¤ सदसà¥à¤¯à¤¾à¤‚साठीच, संगणकावर विशेष पà¥à¤°à¤£à¤¾à¤²à¥€ लागते) ([//www.mediawiki.org/wiki/Manual:External_editors अधिक माहिती])',
-'tog-showjumplinks' => '"कडे जा" सà¥à¤—म दà¥à¤µà¥‡, उपलबà¥à¤§ करा.',
'tog-uselivepreview' => 'संपादन करता करताच à¤à¤²à¤• दाखवा (पà¥à¤°à¤¯à¥‹à¤—कà¥à¤·à¤®)',
'tog-forceeditsummary' => 'जर ’बदलांचा आढावा’ दिला नसेल तर मला सूचित करा',
'tog-watchlisthideown' => 'पहाऱà¥à¤¯à¤¾à¤šà¥à¤¯à¤¾ सूचीतून माà¤à¥‡ बदल लपवा',
@@ -369,6 +366,8 @@ $messages = array(
'tog-diffonly' => 'निवडलेलà¥à¤¯à¤¾ आवृतà¥à¤¤à¥à¤¯à¤¾à¤‚मधील बदल दाखवताना जà¥à¤¨à¥€ आवृतà¥à¤¤à¥€ दाखवू नका.',
'tog-showhiddencats' => 'लपविलेले वरà¥à¤— दाखवा',
'tog-norollbackdiff' => 'दà¥à¤°à¥à¤¤à¤®à¤¾à¤˜à¤¾à¤° घेतलà¥à¤¯à¤¾à¤¸ बदल वगळा',
+'tog-useeditwarning' => 'जर मी संपादित करीत असलेलà¥à¤¯à¤¾ पानावरील माà¤à¥‡ संपादिलेले बदल जतन न केलà¥à¤¯à¤¾à¤¸ मला इशारा दà¥à¤¯à¤¾',
+'tog-prefershttps' => 'सनोंद पà¥à¤°à¤µà¥‡à¤¶à¤¤à¤¾à¤‚ना पà¥à¤°à¤¤à¥à¤¯à¥‡à¤• वेळी सà¥à¤°à¤•à¥à¤·à¤¿à¤¤ अनà¥à¤¬à¤‚ध वापरा',
'underline-always' => 'नेहमी',
'underline-never' => 'कधीच नाही',
@@ -432,6 +431,18 @@ $messages = array(
'oct' => 'ऑकà¥à¤Ÿà¥‹.',
'nov' => 'नोवà¥à¤¹à¥‡à¤‚.',
'dec' => 'डिसें.',
+'january-date' => 'जानेवारी $1',
+'february-date' => 'फेबà¥à¤°à¥à¤µà¤¾à¤°à¥€ $1',
+'march-date' => 'मारà¥à¤š $1',
+'april-date' => 'à¤à¤ªà¥à¤°à¤¿à¤² $1',
+'may-date' => 'मे $1',
+'june-date' => 'जून $1',
+'july-date' => 'जà¥à¤²à¥ˆ $1',
+'august-date' => 'ऑगसà¥à¤Ÿ $1',
+'september-date' => 'सपà¥à¤Ÿà¥‡à¤‚बर $1',
+'october-date' => 'ऑकà¥à¤Ÿà¥‹à¤¬à¤° $1',
+'november-date' => 'नोवà¥à¤¹à¥‡à¤‚बर $1',
+'december-date' => 'डिसेंबर $1',
# Categories related messages
'pagecategories' => '{{PLURAL:$1|वरà¥à¤—}}',
@@ -513,6 +524,7 @@ $messages = array(
'create-this-page' => 'हे पान तयार करा',
'delete' => 'वगळा',
'deletethispage' => 'हे पान काढून टाका',
+'undeletethispage' => 'गाळलेला लेख पà¥à¤°à¥à¤µà¤µà¤¤à¥ करा',
'undelete_short' => 'पà¥à¤¨à¤°à¥à¤¸à¥à¤¥à¤¾à¤ªà¤¨ {{PLURAL:$1|à¤à¤• संपादन|$1 संपादने}}',
'viewdeleted_short' => '{{PLURAL:$1|à¤à¤• वगळलेले संपादन|$1 वगळलेली संपादने}} पहा.',
'protect' => 'सà¥à¤°à¤•à¥à¤·à¤¿à¤¤ करा',
@@ -529,7 +541,7 @@ $messages = array(
'articlepage' => 'लेख पृषà¥à¤ ',
'talk' => 'चरà¥à¤šà¤¾',
'views' => 'दृषà¥à¤¯à¥‡',
-'toolbox' => 'साधनपेटी',
+'toolbox' => 'साधने',
'userpage' => 'सदसà¥à¤¯ पृषà¥à¤ ',
'projectpage' => 'पà¥à¤°à¤•à¤²à¥à¤ª पान पहा',
'imagepage' => 'संचिका पृषà¥à¤  पहा',
@@ -553,7 +565,7 @@ $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).
+# 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).
'aboutsite' => '{{SITENAME}}बदà¥à¤¦à¤²',
'aboutpage' => 'Project:माहितीपृषà¥à¤ ',
'copyright' => 'येथील मजकूर $1चà¥à¤¯à¤¾ अंतरà¥à¤—त उपलबà¥à¤§ आहे जोपरà¥à¤¯à¤‚त इतर नोंदी केलेलà¥à¤¯à¤¾ नाहीत.',
@@ -563,7 +575,6 @@ $1',
'disclaimers' => 'उतà¥à¤¤à¤°à¤¦à¤¾à¤¯à¤¿à¤¤à¥à¤µà¤¾à¤¸ नकार',
'disclaimerpage' => 'Project: सरà¥à¤µà¤¸à¤¾à¤§à¤¾à¤°à¤£ उतà¥à¤¤à¤°à¤¦à¤¾à¤¯à¤•à¤¤à¥à¤µà¤¾à¤¸ नकार',
'edithelp' => 'संपादन साहायà¥à¤¯',
-'edithelppage' => 'Help:संपादन',
'helppage' => 'Help:आशय',
'mainpage' => 'मà¥à¤–पृषà¥à¤ ',
'mainpage-description' => 'मà¥à¤–पृषà¥à¤ ',
@@ -643,16 +654,12 @@ $1',
# General errors
'error' => 'तà¥à¤°à¥à¤Ÿà¥€',
'databaseerror' => 'माहितीसंगà¥à¤°à¤¹à¤¾à¤¤à¥€à¤² तà¥à¤°à¥à¤Ÿà¥€',
-'dberrortext' => 'à¤à¤• विदा पृचà¥à¤›à¤¾à¤°à¤šà¤¨à¤¾ तà¥à¤°à¥à¤Ÿà¥€ घडली आहे.
-ही बाब संचेतनात (सॉफà¥à¤Ÿà¤µà¥‡à¤…रमधà¥à¤¯à¥‡) कà¥à¤·à¤¿à¤¤à¤¿à¤œà¤¨à¥à¤¤à¥ असणà¥à¤¯à¤¾à¤šà¥€ शकà¥à¤¯à¤¤à¤¾ निरà¥à¤¦à¥‡à¤¶à¤¿à¤¤ करते.
-"<tt>$2</tt>" या कारà¥à¤¯à¤¾à¤¤à¥‚न निघालेली शेवटची विदापृचà¥à¤›à¤¾ पà¥à¤¢à¥€à¤² पà¥à¤°à¤®à¤¾à¤£à¥‡ होती:
-<blockquote><tt>$1</tt></blockquote>
-मायà¤à¤¸à¤•à¥à¤¯à¥à¤à¤²à¤¨à¥‡ "<tt>$3: $4</tt>" ही तà¥à¤°à¥à¤Ÿà¥€ दिलेली आहे.',
-'dberrortextcl' => 'चà¥à¤•à¥€à¤šà¥à¤¯à¤¾ पà¥à¤°à¤¶à¥à¤¨à¤²à¥‡à¤–नामà¥à¤³à¥‡ माहितीसंगà¥à¤°à¤¹ तà¥à¤°à¥à¤Ÿà¥€.
-शेवटची माहितीसंगà¥à¤°à¤¹à¤¾à¤²à¤¾ पाठविलेला पà¥à¤°à¤¶à¥à¤¨ होता:
-"$1"
-"$2" या कारà¥à¤¯à¤•à¥ƒà¤¤à¥€à¤®à¤§à¥‚न .
-MySQL returned error "$3: $4".',
+'databaseerror-text' => 'विदागार पृचà¥à¤›à¤¾ तà¥à¤°à¥‚टी घडलेली आहे.
+ते संचेतनात गणकदोष असणà¥à¤¯à¤¾à¤šà¥€ शकà¥à¤¯à¤¤à¤¾ निरà¥à¤¦à¥‡à¤¶à¤¿à¤¤ करते.',
+'databaseerror-textcl' => 'विदागार पृचà¥à¤›à¤¾ तà¥à¤°à¥‚टी घडलेली आहे.',
+'databaseerror-query' => 'पृचà¥à¤›à¤¾:$1',
+'databaseerror-function' => 'कà¥à¤°à¤¿à¤¯à¤¾: $1',
+'databaseerror-error' => 'तà¥à¤°à¥à¤Ÿà¥€: $1',
'laggedslavemode' => "'''सà¥à¤šà¤¨à¤¾:''' पानावर अदà¥à¤¯à¤¯à¤¾à¤µà¤¤ बदल नसतील.",
'readonly' => 'विदागारास (डाटाबेस) ताळे आहे.',
'enterlockreason' => 'विदागारास ताळे ठोकणà¥à¤¯à¤¾à¤šà¥‡ कारण, ताळे उघडले जाणà¥à¤¯à¤¾à¤šà¥à¤¯à¤¾ अदमासे कालावधीसहीत दà¥à¤¯à¤¾.',
@@ -685,6 +692,7 @@ MySQL returned error "$3: $4".',
'cannotdelete-title' => '$1 ला वगळू शकत नाही',
'delete-hook-aborted' => 'खोडणà¥à¤¯à¤¾à¤šà¥€ कà¥à¤°à¤¿à¤¯à¤¾ मधेच थांबविणà¥à¤¯à¤¾à¤¤ येत आहे.
कोणतेही कारण देणà¥à¤¯à¤¾à¤¤ आले नाही',
+'no-null-revision' => '"$1" या पानाची नविन रिकà¥à¤¤ आवृतà¥à¤¤à¥€ निरà¥à¤®à¤¿à¤¤à¤¾ आली नाही.',
'badtitle' => 'खराब शीरà¥à¤·à¤•',
'badtitletext' => 'आपण विनंती केलेले पानाचे शीरà¥à¤·à¤• अयोगà¥à¤¯, रिकामे अथवा चà¥à¤•à¤¿à¤¨à¥‡ जोडलेले आंतर-भाषिय किंवा आंतर-विकि शीरà¥à¤·à¤• आहे. तà¥à¤¯à¤¾à¤¤,शीरà¥à¤·à¤•à¤¾à¤¸ अयोगà¥à¤¯ अशी à¤à¤• किंवा अधिक चिनà¥à¤¹à¥‡ आहेत.',
'perfcached' => 'खालील माहिती सयीमधील (कॅशे) असलà¥à¤¯à¤¾à¤®à¥à¤³à¥‡ ती अदà¥à¤¯à¤¯à¤¾à¤µà¤¤à¥ नाही.जासà¥à¤¤à¥€à¤¤à¤œà¤¾à¤¸à¥à¤¤ {{PLURAL:$1|à¤à¤• पà¥à¤°à¤¤à¤¿à¤«à¤³ |$1 पà¥à¤°à¤¤à¤¿à¤«à¤³à¥‡ }} सयीमधà¥à¤¯à¥‡ असतात.',
@@ -704,12 +712,15 @@ MySQL returned error "$3: $4".',
सरà¥à¤µ विकिंवर, अनà¥à¤µà¤¾à¤¦ जोडणà¥à¤¯à¤¾à¤•à¤°à¤¤à¤¾ किंवा बदलणà¥à¤¯à¤¾à¤•à¤°à¤¤à¤¾ अथवा शà¥à¤¦à¥à¤§à¤²à¥‡à¤–न चिकितà¥à¤¸à¥‡à¤•à¤°à¥€à¤¤à¤¾ , कृपया [//translatewiki.net/ translatewiki.net], या मिडियाविकि सà¥à¤¥à¤¾à¤¨à¤¿à¤•à¥€à¤•à¤°à¤£ पà¥à¤°à¤•à¤²à¥à¤ªà¤¾à¤µà¤° जा.',
'editinginterface' => "'''सावधान:''' तà¥à¤®à¥à¤¹à¥€ संचेतनाचे (सॉफà¥à¤Ÿà¤µà¥‡à¤…र) संपरà¥à¤• माधà¥à¤¯à¤® मजकूर असलेले पान संपादित करित आहात. या पानावरील बदल या विकिवरील इतर सदसà¥à¤¯à¤¾à¤‚चà¥à¤¯à¤¾ सदसà¥à¤¯ संपरà¥à¤• माधà¥à¤¯à¤®à¤¾à¤šà¥‡ सà¥à¤µà¤°à¥‚प बदलू शकते.सरà¥à¤µ विकिंवरील भाषांतरासाठी कृपया मिडीयाविकि सà¥à¤¥à¤¾à¤¨à¤¿à¤•à¥€à¤•à¤°à¤£ पà¥à¤°à¤•à¤²à¥à¤ªà¤¾à¤šà¥à¤¯à¤¾ [//translatewiki.net/ translatewiki.net]या सà¥à¤µà¤¿à¤§à¥‡à¤šà¤¾ वापर करा.",
-'sqlhidden' => 'छूपी à¤à¤¸à¥à¤•à¥à¤¯à¥‚à¤à¤² पृचà¥à¤›à¤¾ (à¤à¤¸à¤•à¥à¤¯à¥‚à¤à¤² कà¥à¤µà¥‡à¤°à¥€ हिडन)',
'cascadeprotected' => 'हे पान संपादनांपासून सà¥à¤°à¤•à¥à¤·à¤¿à¤¤ केलà¥à¤¯à¤¾ गेले आहे, कारण ते खालील {{PLURAL:$1|पानात|पानांमधà¥à¤¯à¥‡}} अंतरà¥à¤­à¥‚त केलेले आहे,{{PLURAL:$1|जे पान|जी पाने }} निपतन परà¥à¤¯à¤¾à¤¯ सà¥à¤°à¥ केलà¥à¤¯à¤¾à¤®à¥à¤³à¥‡ सà¥à¤°à¤•à¥à¤·à¤¿à¤¤ आहेत:
$2',
'namespaceprotected' => "'''$1''' नामविशà¥à¤µà¤¾à¤¤à¥€à¤² पाने संपादणà¥à¤¯à¤¾à¤šà¥€ आपणांस परवानगी नाही.",
'customcssprotected' => 'या पानावर इतर सदसà¥à¤¯à¤¾à¤šà¥€ वैयकà¥à¤¤à¤¿à¤• मांडणी असलà¥à¤¯à¤¾à¤®à¥à¤³à¥‡, तà¥à¤®à¥à¤¹à¤¾à¤²à¤¾ हे सीà¤à¤¸à¤à¤¸ पान संपादित करणà¥à¤¯à¤¾à¤šà¥€ परवानगी नाही.',
'customjsprotected' => "या पानावर इतर सदसà¥à¤¯à¤¾à¤šà¥€ वैयकà¥à¤¤à¤¿à¤• मांडणी असलà¥à¤¯à¤¾à¤®à¥à¤³à¥‡, तà¥à¤®à¥à¤¹à¤¾à¤²à¤¾ हे 'जावासà¥à¤•à¥à¤°à¤¿à¤ªà¥à¤Ÿ' पान संपादित करणà¥à¤¯à¤¾à¤šà¥€ परवानगी नाही.",
+'mycustomcssprotected' => 'या सीà¤à¤¸à¤à¤¸ (CSS) पानावरील मजकूर बदलणà¥à¤¯à¤¾à¤šà¥€ आपणास परवानगी नाही.',
+'mycustomjsprotected' => 'या जावासà¥à¤•à¥à¤°à¤¿à¤ªà¥à¤Ÿ पानावर संपादन करणà¥à¤¯à¤¾à¤šà¥€ आपणास परवानगी नाही.',
+'myprivateinfoprotected' => 'आपणास आपली वैयकà¥à¤¤à¤¿à¤• माहिती बदलणà¥à¤¯à¤¾à¤šà¥€ परवानगी नाही.',
+'mypreferencesprotected' => 'आपणास आपला पसंतीकà¥à¤°à¤® बदलणà¥à¤¯à¤¾à¤šà¥€ परवानगी नाही.',
'ns-specialprotected' => 'विशेष पाने संपादित करता येत नाहीत.',
'titleprotected' => 'या शीरà¥à¤·à¤•à¤¾à¤šà¥‡ पान सदसà¥à¤¯ [[User:$1|$1]]ने निरà¥à¤®à¤¿à¤¤à¥€à¤ªà¤¾à¤¸à¥‚न सà¥à¤°à¤•à¥à¤·à¤¿à¤¤ केलेले आहे.तà¥à¤¯à¤¾à¤¨à¥‡ याचे ""$2"" हे कारण नमूद केलेले आहे.',
'filereadonlyerror' => '"$1" ला सà¥à¤§à¤¾à¤° अशकà¥à¤¯ आहे कारण संचिकाभांडार "$2" हे \'फकà¥à¤¤ वाचा\'(रीड ओनà¥à¤²à¥€) या शà¥à¤°à¥‡à¤£à¥€à¤¤à¤š आहे.
@@ -734,10 +745,19 @@ $2',
'welcomecreation-msg' => 'तà¥à¤®à¤šà¥‡ खाते उघडणà¥à¤¯à¤¾à¤¤ आले आहे.
आपला [[Special:Preferences|{{SITENAME}} पसंतीकà¥à¤°à¤®]] बदलणà¥à¤¯à¤¾à¤¸ विसरू नका.',
'yourname' => 'सदसà¥à¤¯à¤¨à¤¾à¤®:',
+'userlogin-yourname' => 'सदसà¥à¤¯à¤¨à¤¾à¤®',
+'userlogin-yourname-ph' => 'आपले सदसà¥à¤¯à¤¨à¤¾à¤µ टाका',
+'createacct-another-username-ph' => 'सदसà¥à¤¯à¤¨à¤¾à¤µ टाका',
'yourpassword' => 'तà¥à¤®à¤šà¤¾ परवलीचा शबà¥à¤¦:',
+'userlogin-yourpassword' => 'परवलीचा शबà¥à¤¦(पासवरà¥à¤¡)',
+'userlogin-yourpassword-ph' => 'आपला परवलीचा शबà¥à¤¦ टाका',
+'createacct-yourpassword-ph' => 'परवलीचा शबà¥à¤¦ टाका',
'yourpasswordagain' => 'तà¥à¤®à¤šà¤¾ परवलीचा शबà¥à¤¦ पà¥à¤¨à¥à¤¹à¤¾ टंका:',
+'createacct-yourpasswordagain' => 'परवलीचà¥à¤¯à¤¾ शबà¥à¤¦à¤¾à¤šà¥€ निशà¥à¤šà¤¿à¤¤à¥€ करा',
+'createacct-yourpasswordagain-ph' => 'पà¥à¤¨à¥à¤¹à¤¾ परवलीचा शबà¥à¤¦ टाका',
'remembermypassword' => 'माà¤à¤¾ सनोंदपà¥à¤°à¤µà¥‡à¤¶ (लॉग-ईन) या नà¥à¤¯à¤¾à¤¹à¤¾à¤³à¤•à¤¾à¤µà¤° लकà¥à¤·à¤¾à¤¤ ठेवा (जासà¥à¤¤à¥€à¤¤ जासà¥à¤¤ $1 {{PLURAL:$1|दिवसासाठी|दिवसांसाठी}})',
-'securelogin-stick-https' => "सनोंद-पà¥à¤°à¤µà¥‡à¤¶à¤¾à¤¨à¤‚तर 'à¤à¤šà¤Ÿà¥€à¤Ÿà¥€à¤ªà¥€à¤à¤¸'शी जà¥à¤³à¤²à¥‡à¤²à¥‡ रहा",
+'userlogin-remembermypassword' => 'मला नोंदीकृतच(लॉगà¥à¤¡-ईन) ठेवा',
+'userlogin-signwithsecure' => 'सà¥à¤°à¤•à¥à¤·à¤¿à¤¤ अनà¥à¤¬à¤‚ध(सेकà¥à¤¯à¥à¤…र कनेकà¥à¤¶à¤¨) वापरा',
'yourdomainname' => 'तà¥à¤®à¤šà¥‡ कà¥à¤·à¥‡à¤¤à¥à¤° (डोमेन) :',
'password-change-forbidden' => 'तà¥à¤®à¥à¤¹à¥€ या विकिवर तà¥à¤®à¤šà¤¾ परवलीचा शबà¥à¤¦ बदलू शकत नाही.',
'externaldberror' => 'विदागार ’खातरजमा’ (पà¥à¤°à¤®à¤¾à¤£à¤¿à¤¤à¥€à¤•à¤°à¤£) तà¥à¤°à¥à¤Ÿà¥€ होती अथवा तà¥à¤®à¥à¤¹à¤¾à¤²à¤¾ तà¥à¤®à¤šà¥‡ बाहà¥à¤¯ खाते अदà¥à¤¯à¤¯à¤¾à¤µà¤¤ करणà¥à¤¯à¤¾à¤šà¥€ परवानगी नाही.',
@@ -749,18 +769,43 @@ $2',
'logout' => 'सनोंद-निरà¥à¤—म',
'userlogout' => 'सनोंद-निरà¥à¤—म',
'notloggedin' => 'आपण सनोंद-पà¥à¤°à¤µà¥‡à¤¶à¤¿à¤¤ नाहीत',
+'userlogin-noaccount' => 'आपले खाते नाही?',
+'userlogin-joinproject' => '{{SITENAME}}मधà¥à¤¯à¥‡ सहभागी वà¥à¤¹à¤¾',
'nologin' => 'आपले सदसà¥à¤¯à¤–ाते नाही काय? $1.',
'nologinlink' => 'सदसà¥à¤¯à¤–ाते तयार करा',
'createaccount' => 'नवीन खाते तयार करा',
'gotaccount' => 'पूरà¥à¤µà¥€à¤šà¥‡ खाते आहे? $1.',
'gotaccountlink' => 'सनोंद-पà¥à¤°à¤µà¥‡à¤¶ करा',
'userlogin-resetlink' => 'सनोंद-पà¥à¤°à¤µà¥‡à¤¶ तपशील विसरला असाल तर येथे टिचकी मारा.',
+'userlogin-resetpassword-link' => 'परवलीचा शबà¥à¤¦ पà¥à¤¨à¥à¤¹à¤¾ जà¥à¤³à¤µà¤¾ (रिसेट)',
+'helplogin-url' => 'Help:सनोंद पà¥à¤°à¤µà¥‡à¤¶à¤¾à¤¸à¤¾à¤ à¥€(लॉगिंग-ईन)',
+'userlogin-helplink' => '[[{{MediaWiki:helplogin-url}}|सनोंद-पà¥à¤°à¤µà¥‡à¤¶à¤¾à¤¸à¤¾à¤ à¥€(लॉग-ईन) सहायà¥à¤¯]]',
+'userlogin-loggedin' => 'आपण पà¥à¤°à¥à¤µà¥€à¤š {{GENDER:$1|$1}} मà¥à¤¹à¤£à¥‚न सनोंद पà¥à¤°à¤µà¥‡à¤¶à¤¿à¤¤ आहात.वेगळà¥à¤¯à¤¾ सदसà¥à¤¯à¤¨à¤¾à¤µà¤¾à¤¨à¥‡ सनोंद पà¥à¤°à¤µà¥‡à¤¶à¤¾à¤¸à¤¾à¤ à¥€ खालील आवेदन वापरा.',
+'userlogin-createanother' => 'दà¥à¤¸à¤°à¥‡ नवीन खाते तयार करा',
+'createacct-join' => 'खाली आपली माहिती भरा',
+'createacct-another-join' => 'नविन खातà¥à¤¯à¤¾à¤¬à¤¾à¤¬à¤¤à¤šà¥€ माहिती येथे खाली टाका.',
+'createacct-emailrequired' => 'विपतà¥à¤° पतà¥à¤¤à¤¾(ई-मेल)',
+'createacct-emailoptional' => 'विपतà¥à¤° पतà¥à¤¤à¤¾(ई-मेल)(à¤à¤šà¥à¤›à¤¿à¤•)',
+'createacct-email-ph' => 'आपला विपतà¥à¤° पतà¥à¤¤à¤¾(ई-मेल) टाका',
+'createacct-another-email-ph' => 'आपला विपतà¥à¤°à¤ªà¤¤à¥à¤¤à¤¾ (ई-मेल) टाका',
'createaccountmail' => 'तातà¥à¤ªà¥à¤°à¤¤à¤¾ अनियत (रॅनà¥à¤¡à¤®) परवलीचा शबà¥à¤¦ तयार करून तो खाली नमूद विपतà¥à¤°à¤ªà¤¤à¥à¤¤à¥à¤¯à¤¾à¤µà¤° पाठवा',
+'createacct-realname' => 'खरे नाव (à¤à¤šà¥à¤›à¤¿à¤•)',
'createaccountreason' => 'कारण:',
+'createacct-reason' => 'कारण',
+'createacct-reason-ph' => 'आपण दà¥à¤¸à¤°à¥‡ खाते कां बनवीत आहात',
+'createacct-captcha' => 'सà¥à¤°à¤•à¥à¤·à¤¾ तपासणी',
+'createacct-imgcaptcha-ph' => 'वर दिसत असलेला मजकूर येथे टाका',
+'createacct-submit' => 'आपले खाते निरà¥à¤®à¤¾à¤£ करा',
+'createacct-another-submit' => 'दà¥à¤¸à¤°à¥‡ नवीन खाते तयार करा',
+'createacct-benefit-heading' => '{{SITENAME}} हे आपलà¥à¤¯à¤¾à¤¸à¤¾à¤°à¤–à¥à¤¯à¤¾à¤š लोकांनी बनविलेले आहे.',
+'createacct-benefit-body1' => '{{PLURAL:$1|edit|संपादने}}',
+'createacct-benefit-body2' => '{{PLURAL:$1|लेख}}',
+'createacct-benefit-body3' => 'अलीकडील {{PLURAL:$1|योगदानकरà¥à¤¤à¤¾|योगदानकरà¥à¤¤à¥‡}}',
'badretype' => 'आपण टाकलेला परवलीचा शबà¥à¤¦ जà¥à¤³à¤¤ नाही.',
'userexists' => 'आपण टाकलेले सदसà¥à¤¯à¤¨à¤¾à¤® पूरà¥à¤µà¥€à¤š वापरात आहे.
कृपया वेगळे सदसà¥à¤¯à¤¨à¤¾à¤® निवडा.',
'loginerror' => 'सनोंद-पà¥à¤°à¤µà¥‡à¤¶à¤¾à¤¤ चूक à¤à¤¾à¤²à¥€ आहे',
+'createacct-error' => 'खाते तयार करणà¥à¤¯à¤¾à¤¤ चà¥à¤•à¥€',
'createaccounterror' => 'हे खाते तयार करता येऊ शकले नाही:$1',
'nocookiesnew' => 'सदसà¥à¤¯ खाते तयार à¤à¤¾à¤²à¥‡ ,पण तà¥à¤®à¥à¤¹à¥€ सनोंद-पà¥à¤°à¤µà¥‡à¤¶à¤¿à¤¤(लॉगà¥à¤¡à¤ˆà¤¨) नाहीत.{{SITENAME}} सदसà¥à¤¯à¤¾à¤‚ना सनोंद-पà¥à¤°à¤µà¥‡à¤¶ देतांना तà¥à¤¯à¤¾à¤‚चे सà¥à¤®à¥ƒà¤¤à¤¿à¤¶à¥‡à¤· (कà¥à¤•à¤¿à¤œ) वापरते.तà¥à¤®à¥à¤¹à¥€ सà¥à¤®à¥ƒà¤¤à¤¿à¤¶à¥‡à¤· सà¥à¤µà¤¿à¤§à¤¾ अनà¥à¤ªà¤²à¤¬à¥à¤§ ठेवली आहे.ती कृपया उपलबà¥à¤§ करा,आणि नंतर तà¥à¤®à¤šà¥à¤¯à¤¾ नवीन सदसà¥à¤¯ नावाने आणि परवलीने दाखल वà¥à¤¹à¤¾.',
'nocookieslogin' => '{{SITENAME}} सदसà¥à¤¯à¤¾à¤‚ना सनोंद-पà¥à¤°à¤µà¥‡à¤¶ देतांना, तà¥à¤¯à¤¾à¤‚चà¥à¤¯à¤¾ सà¥à¤®à¥ƒà¤¤à¤¿à¤¶à¥‡à¤· (cookies) वापरते.तà¥à¤®à¥à¤¹à¥€ सà¥à¤®à¥ƒà¤¤à¤¿à¤¶à¥‡à¤· सà¥à¤µà¤¿à¤§à¤¾ अनà¥à¤ªà¤²à¤¬à¥à¤§ ठेवली आहे.सà¥à¤®à¥ƒà¤¤à¥€à¤¶à¥‡à¤· सà¥à¤µà¤¿à¤§à¤¾ कृपया उपलबà¥à¤§ करा आणि सनोंद-पà¥à¤°à¤µà¥‡à¤¶à¤¾à¤¸à¤¾à¤ à¥€ पà¥à¤¨à¥à¤¹à¤¾ पà¥à¤°à¤¯à¤¤à¥à¤¨ करा.',
@@ -810,11 +855,13 @@ $2',
जर ही खातेनोंदणी चà¥à¤•à¤¿à¤¨à¥‡ à¤à¤¾à¤²à¥€ असेल तर, तà¥à¤®à¥à¤¹à¥€ या संदेशाकडे दà¥à¤°à¥à¤²à¤•à¥à¤· करू शकता.',
'usernamehasherror' => 'सदसà¥à¤¯à¤¨à¤¾à¤®à¤¾à¤¤ "हॅश" वरà¥à¤£ असू शकत नाहीत.',
-'login-throttled' => 'तà¥à¤®à¥à¤¹à¥€ पà¥à¤°à¤µà¥‡à¤¶ करणà¥à¤¯à¤¾à¤¸à¤¾à¤ à¥€ खूप पà¥à¤°à¤¯à¤¤à¥à¤¨ केले आहेत.
-कृपया पà¥à¤¨à¥à¤¹à¤¾ पà¥à¤°à¤¯à¤¤à¥à¤¨ करणà¥à¤¯à¤¾à¤†à¤§à¥€ थांबा',
+'login-throttled' => 'तà¥à¤®à¥à¤¹à¥€ नà¥à¤•à¤¤à¥‡à¤š सनोंद- पà¥à¤°à¤µà¥‡à¤¶à¤¾à¤¸à¤¾à¤ à¥€ अनेकानेक पà¥à¤°à¤¯à¤¤à¥à¤¨ केले आहेत.
+कृपया, पà¥à¤¨à¥à¤¹à¤¾ पà¥à¤°à¤¯à¤¤à¥à¤¨ करणà¥à¤¯à¤¾à¤†à¤§à¥€ $1 थोडी उसंत घà¥à¤¯à¤¾.',
'login-abort-generic' => 'तà¥à¤®à¤šà¤¾ पà¥à¤°à¤µà¥‡à¤¶ अयशसà¥à¤µà¥€ होऊन रदà¥à¤¦ à¤à¤¾à¤²à¤¾.',
'loginlanguagelabel' => 'भाषा: $1',
'suspicious-userlogout' => 'तà¥à¤®à¤šà¥à¤¯à¤¾ सनोंद-निरà¥à¤—मनास नकार दिलà¥à¤¯à¤¾ गेला कारण असे दिसते की ती विनंती अन-अनà¥à¤¬à¤‚धित(डिसकनेकà¥à¤Ÿà¥‡à¤¡) नà¥à¤¯à¤¾à¤¹à¤¾à¤³à¤•à¤¾à¤¦à¥à¤µà¤¾à¤°à¥‡ पाठवलà¥à¤¯à¤¾ गेली.',
+'createacct-another-realname-tip' => 'आपले खरे नाव टाकणे वैकलà¥à¤ªà¤¿à¤• आहे.
+जर आपण ते दà¥à¤¯à¤¾à¤¯à¤šà¥‡ ठरविले तर,ते आपलà¥à¤¯à¤¾ कामाचा मूळ सà¥à¤°à¥‹à¤¤ मà¥à¤£à¥‚न देणà¥à¤¯à¤¾à¤¸ वापरले जाईल.',
# Email sending
'php-mail-error-unknown' => 'पीà¤à¤šà¤ªà¥€à¤šà¥à¤¯à¤¾ विपतà¥à¤°() परà¥à¤¯à¤¾à¤¯à¤¾à¤¤ अजà¥à¤žà¤¾à¤¤ चूक',
@@ -830,7 +877,7 @@ $2',
'newpassword' => 'नवीन परवलीचा शबà¥à¤¦:',
'retypenew' => 'पà¥à¤¨à¥à¤¹à¤¾ à¤à¤•à¤¦à¤¾ परवलीचा शबà¥à¤¦ टंका:',
'resetpass_submit' => 'परवलीचा शबà¥à¤¦ टाका आणि सनोंद-पà¥à¤°à¤µà¥‡à¤¶ करा',
-'resetpass_success' => 'तà¥à¤®à¤šà¤¾ परवलीचा शबà¥à¤¦ बदललेला आहे! आता तà¥à¤®à¤šà¤¾ पà¥à¤°à¤µà¥‡à¤¶ करित आहोत...',
+'changepassword-success' => 'तà¥à¤®à¤šà¤¾ परवलीचा शबà¥à¤¦ यशसà¥à¤µà¥€à¤°à¤¿à¤¤à¥à¤¯à¤¾ बदललेला आहे!',
'resetpass_forbidden' => 'परवलीचे शबà¥à¤¦ बदलता येत नाहीत.',
'resetpass-no-info' => 'या पानामधà¥à¤¯à¥‡ थेट जाणà¥à¤¯à¤¾à¤¸à¤¾à¤ à¥€ तà¥à¤®à¥à¤¹à¤¾à¤¸ सनोंद-पà¥à¤°à¤µà¥‡à¤¶à¤¿à¤¤ असावयास हवे.',
'resetpass-submit-loggedin' => 'परवलीचा शबà¥à¤¦ बदला',
@@ -842,10 +889,11 @@ $2',
# Special:PasswordReset
'passwordreset' => 'परवलीचा शबà¥à¤¦ पूरà¥à¤µà¤µà¤¤ करा',
-'passwordreset-text' => 'आपला परवलीचा शबà¥à¤¦ पà¥à¤¨à¤°à¥à¤¸à¥à¤¥à¤¾à¤ªà¤¿à¤¤ करणà¥à¤¯à¤¾à¤¸à¤¾à¤ à¥€ हे आवेदन भरा.',
+'passwordreset-text-one' => 'आपला परवलीचा शबà¥à¤¦ बदलणà¥à¤¯à¤¾à¤¸ हे आवेदन भरा.',
+'passwordreset-text-many' => '{{PLURAL:$1|आपला परवलीचा शबà¥à¤¦ पà¥à¤¨à¤°à¥à¤¸à¥à¤¥à¤¾à¤ªà¤¿à¤¤ करणà¥à¤¯à¤¾à¤¸ कोणताही à¤à¤• तà¥à¤•à¤¡à¤¾ वापरा.}}',
'passwordreset-legend' => 'परवलीचा शबà¥à¤¦ पूरà¥à¤µà¤µà¤¤ करा',
'passwordreset-disabled' => 'या विकिवर परवलीचा शबà¥à¤¦ पà¥à¤¨à¤°à¥à¤¸à¥à¤¥à¤¾à¤ªà¤¿à¤¤ करता येत नाही.',
-'passwordreset-pretext' => '{{PLURAL:$1||खालील माहितीचà¥à¤¯à¤¾ भागांपैकी à¤à¤• भाग लिहा}}',
+'passwordreset-emaildisabled' => "या विकिवर विपतà¥à¤° पाठविणे 'अशकà¥à¤¯' करणà¥à¤¯à¤¾à¤¤ आलेले आहे.",
'passwordreset-username' => 'सदसà¥à¤¯à¤¨à¤¾à¤µ:',
'passwordreset-domain' => 'डोमेन',
'passwordreset-capture' => 'ईमेल कशी असेल ते बघायचेय ?',
@@ -866,7 +914,7 @@ $2',
असà¥à¤¥à¤¾à¤¯à¥€ परवलीचा शबà¥à¤¦: $2',
'passwordreset-emailsent' => "'परवलीचा शबà¥à¤¦' पà¥à¤¨à¤°à¥à¤¸à¥à¤¥à¤¾à¤ªà¤¨à¥‡à¤¬à¤¾à¤¬à¤¤ à¤à¤• विपतà¥à¤° पाठवणà¥à¤¯à¤¾à¤¤ आले आहे.",
'passwordreset-emailsent-capture' => "'परवलीचा शबà¥à¤¦' पà¥à¤¨à¤°à¥à¤¸à¥à¤¥à¤¾à¤ªà¤¨à¥‡à¤¬à¤¾à¤¬à¤¤ à¤à¤• विपतà¥à¤° पाठवणà¥à¤¯à¤¾à¤¤ आले आहे जे खाली दरà¥à¤¶à¤µà¤¿à¤£à¥à¤¯à¤¾à¤¤ आले आहे.",
-'passwordreset-emailerror-capture' => 'आठवणीकरता खाली दाखवलà¥à¤¯à¤¾à¤¨à¥à¤¸à¤¾à¤° ईमेल तयार केला होता, पण पà¥à¤°à¤¯à¥‹à¤—करता $1 ला पाठवता आला नाही',
+'passwordreset-emailerror-capture' => "'परवलीचा शबà¥à¤¦' पà¥à¤¨à¤°à¥à¤¸à¥à¤¥à¤¾à¤ªà¤¨à¥‡à¤¬à¤¾à¤¬à¤¤ à¤à¤• विपतà¥à¤° निरà¥à¤®à¤¾à¤£ करणà¥à¤¯à¤¾à¤¤ आले, जे खाली दरà¥à¤¶à¤µà¤¿à¤£à¥à¤¯à¤¾à¤¤ आले आहे.परंतà¥,{{GENDER:$2|सदसà¥à¤¯}}ला पाठविणे असफल à¤à¤¾à¤²à¥‡: $1",
# Special:ChangeEmail
'changeemail' => 'ई-मेल पतà¥à¤¤à¤¾ बदला',
@@ -880,6 +928,18 @@ $2',
'changeemail-submit' => 'ईमेल बदला',
'changeemail-cancel' => 'रदà¥à¤¦ करा',
+# Special:ResetTokens
+'resettokens' => 'ओळखचिनà¥à¤¹(टोकन) पà¥à¤¨à¤°à¥à¤¸à¥à¤¥à¤¾à¤ªà¤¿à¤¤ करा',
+'resettokens-text' => 'येथे आपलà¥à¤¯à¤¾ खातà¥à¤¯à¤¾à¤¤ असलेला वà¥à¤¯à¤•à¥à¤¤à¤¿à¤—त मजकूरापरà¥à¤¯à¤‚त पोचणà¥à¤¯à¤¾à¤¸à¤¾à¤ à¥€ आपण ओळखचिनà¥à¤¹(टोकन) पà¥à¤¨à¤°à¥à¤¸à¥à¤¥à¤¾à¤ªà¤¿à¤¤ करू शकता.
+आपण जर तो अपघाताने कोणासमवेत सहभागीला असेल किंवा आपले खातà¥à¤¯à¤¾à¤šà¥€ आपण तडजोड केली असलà¥à¤¯à¤¾à¤¸, हे करावयास हवे.',
+'resettokens-no-tokens' => 'पà¥à¤¨à¤°à¥à¤¸à¥à¤¥à¤¾à¤ªà¤¿à¤¤ करणà¥à¤¯à¤¾à¤¸à¤¾à¤ à¥€ कोणतीही ओळखचिनà¥à¤¹à¥‡ नाहीत.',
+'resettokens-legend' => 'ओळखचिनà¥à¤¹(टोकन) पà¥à¤¨à¤°à¥à¤¸à¥à¤¥à¤¾à¤ªà¤¿à¤¤ करा',
+'resettokens-tokens' => 'ओळखचिनà¥à¤¹à¥‡:',
+'resettokens-token-label' => '$1 (सदà¥à¤¯ मà¥à¤²à¥à¤¯: $2)',
+'resettokens-watchlist-token' => '[[Special:Watchlist|आपलà¥à¤¯à¤¾ निरीकà¥à¤·à¤£à¤¸à¥‚चीतील पानांमधील बदलाचा]] वेब रसद बिलà¥à¤²à¤¾ (ॲटम/आरà¤à¤¸à¤à¤¸)',
+'resettokens-done' => 'ओळखचिनà¥à¤¹à¥‡ पà¥à¤¨à¤°à¥à¤¸à¥à¤¥à¤¾à¤ªà¤¨.',
+'resettokens-resetbutton' => 'निवडलेली ओळखचिनà¥à¤¹à¥‡ पà¥à¤¨à¤°à¥à¤¸à¥à¤¥à¤¾à¤ªà¤¿à¤¤ करा',
+
# Edit page toolbar
'bold_sample' => 'ठळक मजकूर',
'bold_tip' => 'ठळक मजकूर',
@@ -1057,12 +1117,15 @@ $2',
'edit-gone-missing' => 'नविन पृषà¥à¤  अदà¥à¤¯à¤¤à¤¨ करता आले नाही. ते वगळले असणà¥à¤¯à¤¾à¤šà¥€ शकà¥à¤¯à¤¤à¤¾ आहे.',
'edit-conflict' => 'वादगà¥à¤°à¤¸à¥à¤¤ संपादन',
'edit-no-change' => 'तà¥à¤®à¤šà¥‡ संपादन दà¥à¤°à¥à¤²à¤•à¥à¤·à¤¿à¤¤ करणà¥à¤¯à¤¾à¤¤ आले आहे, कारण मजकूरात काहीही बदल à¤à¤¾à¤²à¥‡à¤²à¤¾ नाही.',
+'postedit-confirmation' => 'आपले संपादन जतन करणà¥à¤¯à¤¾à¤¤ आले आहे.',
'edit-already-exists' => 'नवीन पान तयार करता येऊ शकले नाही.
या नावाचे पान पूरà¥à¤µà¥€à¤š असà¥à¤¤à¤¿à¤¤à¥à¤µà¤¾à¤¤ आहे.',
'defaultmessagetext' => 'अविचल संदेश मजकूर',
'content-failed-to-parse' => '$2 चा आशय(कंटेंट) $1 साठी पारà¥à¤¸ करणà¥à¤¯à¤¾à¤¤ असफलता - नमà¥à¤¨à¤¾: $3',
'invalid-content-data' => 'अवैध माहिती',
'content-not-allowed-here' => '"$1" हा आशय [[$2]] लेखावर टाकणà¥à¤¯à¤¾à¤šà¥€ अनà¥à¤®à¤¤à¥€ नाही.',
+'editwarning-warning' => "या पानावरà¥à¤¨ दà¥à¤¸à¤°à¥â€à¤¯à¤¾ पानावर गेलà¥à¤¯à¤¾à¤¸, तà¥à¤®à¥à¤¹à¥€ येथे केलेले बदल जतन होणार नाहीत.
+जर आपण सनोंद-पà¥à¤°à¤µà¥‡à¤¶à¤¿à¤¤ असाल तर, ही सूचना घालवणà¥à¤¯à¤¾à¤¸à¤¾à¤ à¥€ ''माà¤à¥à¤¯à¤¾ पसंती'' मधील संपादनपसंतीत बदल करा.",
# Content models
'content-model-wikitext' => 'विकिमजकूर',
@@ -1097,6 +1160,7 @@ $2',
'undo-failure' => 'विसंवादी आंतरवरà¥à¤¤à¥€ संपादने à¤à¤¾à¤²à¥à¤¯à¤¾à¤®à¥à¤³à¥‡ आपण हे संपादन परतवू शकत नाही.',
'undo-norev' => 'हे संपादन परतविता आलेले नाही कारण ते अगोदरच उलटविलेले किंवा वगळलेले आहे.',
'undo-summary' => '[[Special:Contributions/$2|$2]] ([[User talk:$2|चरà¥à¤šà¤¾]])यांची आवृतà¥à¤¤à¥€ $1 परतवली.',
+'undo-summary-username-hidden' => 'अजà¥à¤žà¤¾à¤¤ सदसà¥à¤¯à¤¾à¤šà¥€ $1 आवृतà¥à¤¤à¥€ परतवा',
# Account creation failure
'cantcreateaccounttitle' => 'खाते उघडू शकत नाही',
@@ -1276,6 +1340,7 @@ $1",
'compareselectedversions' => 'निवडलेलà¥à¤¯à¤¾ आवृतà¥à¤¤à¥à¤¯à¤¾à¤‚ची तà¥à¤²à¤¨à¤¾ करा',
'showhideselectedversions' => 'निवडलेलà¥à¤¯à¤¾ आवृतà¥à¤¤à¥à¤¯à¤¾ दाखवा / लपवा',
'editundo' => 'उलटवा',
+'diff-empty' => '(काही फरक नाही)',
'diff-multi' => '{{PLURAL:$2|सदसà¥à¤¯à¤¾à¤šà¥€|$2 सदसà¥à¤¯à¤¾à¤‚चà¥à¤¯à¤¾}} ({{PLURAL:$1|आंतरवरà¥à¤¤à¥€ आवृतà¥à¤¤à¥€|$1 आंतरवरà¥à¤¤à¥€ आवृतà¥à¤¤à¥à¤¯à¤¾}} दाखवलà¥à¤¯à¤¾ नाहीत)',
'diff-multi-manyusers' => '{{PLURAL:$2|सदसà¥à¤¯à¤¾à¤šà¥€|$2 सदसà¥à¤¯à¤¾à¤‚चà¥à¤¯à¤¾}} ({{PLURAL:$1|आवृतà¥à¤¤à¥€|$1 आवृतà¥à¤¤à¥à¤¯à¤¾}} दाखवलà¥à¤¯à¤¾ नाहीत)',
'difference-missing-revision' => 'या लेखाचे/ची ($1) हे {{PLURAL:$2|संसà¥à¤•à¤°à¤£|$2 संसà¥à¤•à¤°à¤£à¥‡}} {{PLURAL:$2|सापडले नाही|सापडली नाहीत}}.वगळलà¥à¤¯à¤¾ गेलेलà¥à¤¯à¤¾ लेखपानाचà¥à¤¯à¤¾ जà¥à¤¨à¥à¤¯à¤¾ इतिहास-दà¥à¤µà¥à¤¯à¤¾à¤šà¥‡ अनà¥à¤¸à¤°à¤£ केलà¥à¤¯à¤¾à¤®à¥à¤³à¥‡, शकà¥à¤¯à¤¤à¥‹à¤µà¤°,असे घडॠशकते.याबाबत अधिक तपशील [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} वगळलेलà¥à¤¯à¤¾ नोंदी] येथे बघता येईल.',
@@ -1300,7 +1365,6 @@ $1",
'searchmenu-legend' => 'विकलà¥à¤ª शोधा',
'searchmenu-exists' => "'''या विकिवर \"[[:\$1]]\" या नावाचे पान आहे.'''",
'searchmenu-new' => "'''या विकिवर \"[[:\$1]]\" हे पान तयार करा!'''",
-'searchhelp-url' => 'Help:साहायà¥à¤¯ पृषà¥à¤ ',
'searchmenu-prefix' => '[[Special:PrefixIndex/$1|या उपसरà¥à¤—ानिशी असलेली पाने नà¥à¤¯à¤¾à¤¹à¤¾à¤³à¤¾]]',
'searchprofile-articles' => 'आशय-पाने',
'searchprofile-project' => 'साहायà¥à¤¯ व पà¥à¤°à¤•à¤²à¥à¤ª पाने',
@@ -1341,15 +1405,7 @@ $1",
'powersearch-togglenone' => 'काहीही नाही',
'search-external' => 'बाहà¥à¤¯ शोध',
'searchdisabled' => '{{SITENAME}} शोध अनà¥à¤ªà¤²à¤¬à¥à¤§ केला आहे.तो परà¥à¤¯à¤‚त गूगलवरून शोध घà¥à¤¯à¤¾.{{SITENAME}}चà¥à¤¯à¤¾ मजकà¥à¤°à¤¾à¤šà¥€ तà¥à¤¯à¤¾à¤‚ची सूचिबदà¥à¤§à¤¤à¤¾ शिळी असणà¥à¤¯à¤¾à¤šà¥€ शकà¥à¤¯à¤¤à¤¾ असू शकते हे लकà¥à¤·à¤¾à¤¤ घà¥à¤¯à¤¾.',
-
-# Quickbar
-'qbsettings' => 'शीघà¥à¤°à¤ªà¤Ÿ',
-'qbsettings-none' => 'नाही',
-'qbsettings-fixedleft' => 'सà¥à¤¥à¤¿à¤° डावे',
-'qbsettings-fixedright' => 'सà¥à¤¥à¤¿à¤° ऊजवे',
-'qbsettings-floatingleft' => 'तरंगते डावे',
-'qbsettings-floatingright' => 'तरंगते ऊजवे',
-'qbsettings-directionality' => 'तà¥à¤®à¤šà¥à¤¯à¤¾ भाशा ची पदà¥à¤§à¤¤ दिशातà¥à¤®à¤• असली पाहिजे.',
+'search-error' => 'शोध घेतांना घडलेली तà¥à¤°à¥‚टी:$1',
# Preferences page
'preferences' => 'माà¤à¥à¤¯à¤¾ पसंती',
@@ -1383,7 +1439,6 @@ $1",
'resetprefs' => 'न जतन केलेले बदल रदà¥à¤¦ करा',
'restoreprefs' => 'सरà¥à¤µ डिफॉलà¥à¤Ÿ मांडणी पूरà¥à¤µà¤µà¤¤ करा (सरà¥à¤µ विभागात)',
'prefs-editing' => 'संपादन',
-'prefs-edit-boxsize' => 'संपादन खिडकीचा आकार',
'rows' => 'ओळी:',
'columns' => 'सà¥à¤¤à¤‚भ:',
'searchresultshead' => 'शोध',
@@ -1394,9 +1449,7 @@ $1",
'recentchangesdays-max' => 'जासà¥à¤¤à¥€à¤¤à¤œà¤¾à¤¸à¥à¤¤ $1 {{PLURAL:$1|दिवस|दिवस}}',
'recentchangescount' => 'अलीकडील बदल, इतिहास व नोंद पानांमधà¥à¤¯à¥‡ दाखवायाचà¥à¤¯à¤¾ संपादनांची संखà¥à¤¯à¤¾:',
'prefs-help-recentchangescount' => 'यात नà¥à¤•à¤¤à¥‡à¤š à¤à¤¾à¤²à¥‡à¤²à¥‡ बदल, पानांचे इतिहास व यादà¥à¤¯à¤¾ या गोषà¥à¤Ÿà¥€ असतात.',
-'prefs-help-watchlist-token' => 'या कà¥à¤·à¥‡à¤¤à¥à¤°à¤¤ गà¥à¤ªà¤¿à¤¤ किलà¥à¤²à¥€ पà¥à¤°à¤¦à¤¾à¤¨ केलà¥à¤¯à¤¸ तà¥à¤®à¤šà¥à¤¯à¤¾ निरीकà¥à¤·à¤£à¤¯à¤¾à¤¦à¥€à¤¸à¤¾à¤ à¥€ à¤à¤• आरà¤à¤¸à¤à¤¸ फीड उतà¥à¤ªà¤¨à¥à¤¨ होईल.
-कोणीही जà¥à¤¯à¤¾à¤²à¤¾ या कà¥à¤·à¥‡à¤¤à¥à¤°à¤¾à¤¤à¥€à¤² किलà¥à¤²à¥€ माहीत असेल तà¥à¤®à¤šà¥€ निरीकà¥à¤·à¤£à¤¯à¤¾à¤¦à¥€ वाचू शकतो, तà¥à¤¯à¤®à¥à¤³à¥‡ कोणतीही सà¥à¤°à¤•à¥à¤·à¤¿à¤¤ किलà¥à¤²à¥€ निवडा.
-येथे à¤à¤• यंतà¥à¤°à¤œà¤¨à¤¿à¤¤ किलà¥à¤²à¥€ दिलेली आहे गरज असलà¥à¤¯à¤¸ तà¥à¤®à¥à¤¹à¥€ ती वपरॠशकता: $1',
+'prefs-help-watchlist-token2' => "ही आपलà¥à¤¯à¤¾ निरिकà¥à¤·à¤£à¤¸à¥‚चीचà¥à¤¯à¤¾ 'वेब फिड'ची गà¥à¤ªà¥à¤¤ चाबी आहे.जà¥à¤¯à¤¾ कोणास तà¥à¤¯à¤¾à¤šà¥€ माहिती होईल तो आपली निरिकà¥à¤·à¤£à¤¸à¥‚ची बघू शकेल,मà¥à¤¹à¤£à¥à¤¨ कोणास यात सहभागी करून घेउ नका.[[Special:ResetTokens|पà¥à¤¨à¤°à¥à¤¸à¥à¤¥à¤¾à¤ªà¤¨à¤¾à¤šà¥€ आपणास गरज असलà¥à¤¯à¤¾à¤¸ येथे टिचकी दà¥à¤¯à¤¾]].",
'savedprefs' => 'तà¥à¤®à¤šà¥à¤¯à¤¾ पसंती जतन केलà¥à¤¯à¤¾ आहेत.',
'timezonelegend' => 'वेळकà¥à¤·à¥‡à¤¤à¥à¤°',
'localtime' => 'सà¥à¤¥à¤¾à¤¨à¤¿à¤• वेळ:',
@@ -1426,7 +1479,6 @@ $1",
'prefs-common-css-js' => 'मिळून वापरलेले सरà¥à¤µ तà¥à¤µà¤šà¤¾à¤‚साठींचे सीà¤à¤¸à¤à¤¸ / जावासà¥à¤•à¥à¤°à¤¿à¤ªà¥à¤Ÿ:',
'prefs-reset-intro' => 'आपन दà¥à¤¦à¥€à¤²à¥‡à¤²à¥‡ सरà¥à¤µ पà¥à¤°à¥€à¤«à¥à¤°à¥à¤¨à¥à¤¸à¥‡à¤¸à¥ वपरà¥à¤¨à¥à¤¯à¤¾à¤¸à¤¥à¤¿ तà¥à¤®à¥à¤¹à¥€ हे पेजॠवापरू शकता.',
'prefs-emailconfirm-label' => 'विपतà¥à¤° निशà¥à¤šà¤¿à¤¤à¥€à¤•à¤°à¤£:',
-'prefs-textboxsize' => 'संपादन खिडकीचा आकार',
'youremail' => 'विपतà¥à¤°:',
'username' => '{{GENDER:$1|सदसà¥à¤¯à¤¨à¤¾à¤®}}:',
'uid' => '{{GENDER:$1|सदसà¥à¤¯}}खाते:',
@@ -1457,6 +1509,8 @@ $1",
'prefs-dateformat' => 'तारीख रचना',
'prefs-timeoffset' => 'वेळ बरोबरी',
'prefs-advancedediting' => 'सरà¥à¤µà¤¸à¤¾à¤®à¤¾à¤¨à¥à¤¯ परà¥à¤¯à¤¾à¤¯',
+'prefs-editor' => 'संपादक',
+'prefs-preview' => 'à¤à¤²à¤•',
'prefs-advancedrc' => 'पà¥à¤°à¤—त परà¥à¤¯à¤¾à¤¯',
'prefs-advancedrendering' => 'पà¥à¤°à¤—त परà¥à¤¯à¤¾à¤¯',
'prefs-advancedsearchoptions' => 'पà¥à¤°à¤—त परà¥à¤¯à¤¾à¤¯',
@@ -1464,7 +1518,9 @@ $1",
'prefs-displayrc' => 'दरà¥à¤¶à¤¨ परà¥à¤¯à¤¾à¤¯',
'prefs-displaysearchoptions' => 'दरà¥à¤¶à¤¨ परà¥à¤¯à¤¾à¤¯',
'prefs-displaywatchlist' => 'दरà¥à¤¶à¤¨ परà¥à¤¯à¤¾à¤¯',
+'prefs-tokenwatchlist' => 'ओळखचिनà¥à¤¹',
'prefs-diffs' => 'फरक',
+'prefs-help-prefershttps' => 'हा पसंतीकà¥à¤°à¤® आपलà¥à¤¯à¤¾ पà¥à¤¢à¥€à¤² सनोंद पà¥à¤°à¤µà¥‡à¤¶à¤¾à¤¨à¤‚तर कारà¥à¤¯à¤¾à¤¨à¥à¤µà¤¿à¤¤ होईल.',
# User preference: email validation using jQuery
'email-address-validity-valid' => 'विपतà¥à¤°à¤ªà¤¤à¥à¤¤à¤¾ वैध दिसत आहे',
@@ -1491,6 +1547,8 @@ $1",
'userrights-notallowed' => 'तà¥à¤®à¤šà¥à¤¯à¤¾ सदसà¥à¤¯ खातà¥à¤¯à¤¾à¤¸, सदसà¥à¤¯ अधिकारांची निशà¥à¤šà¤¿à¤¤à¥€ करणà¥à¤¯à¤¾à¤šà¥€ परवानगी नाही.',
'userrights-changeable-col' => 'गट जे तà¥à¤®à¥à¤¹à¥€ बदलू शकता',
'userrights-unchangeable-col' => 'गट जे तà¥à¤®à¥à¤¹à¥€ बदलू शकत नाही',
+'userrights-conflict' => 'बदलाबाबत सदसà¥à¤¯-हकà¥à¤• विसंवाद !कृपया आपले बदल पà¥à¤¨à¥à¤¹à¤¾ पà¥à¤¨à¤°à¤¾à¤µà¤²à¥‹à¤•à¤¿à¤¤ व नकà¥à¤•à¥€ करा.',
+'userrights-removed-self' => 'आपण आपले हकà¥à¤• यशसà¥à¤µà¥€à¤°à¤¿à¤¤à¥à¤¯à¤¾ काढलेत.मà¥à¤¹à¤£à¥à¤¨, या पानात आपण दाखल होऊ शकणार नाही.',
# Groups
'group' => 'गट:',
@@ -1556,11 +1614,19 @@ $1",
'right-proxyunbannable' => 'पà¥à¤°à¥‰à¤•à¥à¤¸à¥€ असताना बà¥à¤²à¥‰à¤•à¥à¤¸ कडे दà¥à¤°à¥à¤²à¤•à¥à¤· करा',
'right-unblockself' => 'कोणà¥à¤¯à¤¾-à¤à¤•à¤¾à¤¸ अपà¥à¤°à¤¤à¤¿à¤¬à¤‚धित करा',
'right-protect' => 'सà¥à¤°à¤•à¥à¤·à¤¾ पातळी बदलवा व निपात-पà¥à¤°à¤¤à¤¿à¤¬à¤‚धित पानांचे संपादन करा',
-'right-editprotected' => 'सà¥à¤°à¤•à¥à¤·à¤¿à¤¤ पाने संपादा',
+'right-editprotected' => ' "{{int:protect-level-sysop}}"मà¥à¤¹à¤£à¥‚न नमà¥à¤¦ केलेली सà¥à¤°à¤•à¥à¤·à¤¿à¤¤ पाने संपादा',
+'right-editsemiprotected' => '"{{int:protect-level-autoconfirmed}}" मà¥à¤¹à¤£à¥‚न नमà¥à¤¦ केलेली सà¥à¤°à¤•à¥à¤·à¤¿à¤¤ पाने संपादा',
'right-editinterface' => 'सदसà¥à¤¯ पसंती बदला',
'right-editusercssjs' => 'इतर सदसà¥à¤¯à¤¾à¤‚चà¥à¤¯à¤¾ CSS व JS संचिका संपादित करा',
'right-editusercss' => 'इतर सदसà¥à¤¯à¤¾à¤‚चà¥à¤¯à¤¾ CSS संचिका संपादित करा',
'right-edituserjs' => 'इतर सदसà¥à¤¯à¤¾à¤‚चà¥à¤¯à¤¾ JS संचिका संपादित करा',
+'right-editmyusercss' => "सà¥à¤µà¤¤:चà¥à¤¯à¤¾ सदसà¥à¤¯à¤¨à¤¾à¤®à¤¾à¤šà¥à¤¯à¤¾ 'सीà¤à¤¸à¤à¤¸' संचिका संपादा",
+'right-editmyuserjs' => "सà¥à¤µà¤¤:चà¥à¤¯à¤¾ सदसà¥à¤¯à¤¨à¤¾à¤®à¤¾à¤šà¥à¤¯à¤¾ 'जावासà¥à¤•à¥à¤°à¤¿à¤ªà¥à¤Ÿ' संचिका संपादा",
+'right-viewmywatchlist' => 'सà¥à¤µà¤¤:ची निरीकà¥à¤·à¤£à¤¸à¥‚ची बघा',
+'right-editmywatchlist' => 'सà¥à¤µà¤¤:ची निरीकà¥à¤·à¤£à¤¸à¥‚ची संपादा.नोंद घà¥à¤¯à¤¾ कि काही कà¥à¤°à¤¿à¤¯à¤¾ या अधिकाराशिवायच पाने जोडतील.',
+'right-viewmyprivateinfo' => 'आपली सà¥à¤µà¤¤:ची वैयकà¥à¤¤à¤¿à¤• माहिती बघा (उदा.विपतà¥à¤°à¤ªà¤¤à¥à¤¤à¤¾, खरे नाव)',
+'right-editmyprivateinfo' => 'आपली सà¥à¤µà¤¤:ची वैयकà¥à¤¤à¤¿à¤• माहिती संपादा (उदा.विपतà¥à¤°à¤ªà¤¤à¥à¤¤à¤¾, खरे नाव)',
+'right-editmyoptions' => "आपलà¥à¤¯à¤¾ सà¥à¤µà¤¤:चा 'पसंतीकà¥à¤°à¤®' संपादा",
'right-rollback' => 'या आधीचà¥à¤¯à¤¾ सदसà¥à¤¯à¤¾à¤šà¥‡ नà¥à¤•à¤¤à¥‡à¤š संपादन केलेले à¤à¤–ादे विशिषà¥à¤Ÿ पानाचे बदल लवकर आधीचà¥à¤¯ सà¥à¤¥à¤¿à¤¤à¥€à¤¤ नà¥à¤¯à¤¾',
'right-markbotedits' => 'निवडलेली संपादने सांगकामà¥à¤¯à¤¾à¤‚ची मà¥à¤¹à¤£à¥‚न जतन करा',
'right-noratelimit' => 'रेट लिमिटà¥à¤¸ चा परिणाम होत नाही.',
@@ -1612,8 +1678,8 @@ $1",
'action-block' => 'या सदसà¥à¤¯à¤¾à¤¸ संपादन करणà¥à¤¯à¤¾à¤ªà¤¾à¤¸à¥‚न पà¥à¤°à¤¤à¤¿à¤¬à¤‚धित करा',
'action-protect' => 'या पानाचा सà¥à¤°à¤•à¥à¤·à¤¾à¤¸à¥à¤¤à¤° बदला',
'action-rollback' => 'या आधीचà¥à¤¯à¤¾ सदसà¥à¤¯à¤¾à¤¨à¥‡ नà¥à¤•à¤¤à¥‡à¤š संपादन केलेले à¤à¤–ादे विशिषà¥à¤Ÿ पानाचे बदल लवकर पूरà¥à¤µà¤¸à¥à¤¥à¤¿à¤¤à¥€à¤¤ नà¥à¤¯à¤¾',
-'action-import' => 'दà¥à¤¸à¤±à¥à¤¯à¤¾ विकीवरà¥à¤¨ हे पान आयात करा',
-'action-importupload' => 'अपभारीत संचिकेतून पान आयात करा',
+'action-import' => 'दà¥à¤¸à¤±à¥à¤¯à¤¾ विकीवरà¥à¤¨ पाने आयात करा',
+'action-importupload' => 'अपभारीत संचिकेतून पाने आयात करा',
'action-patrol' => "इतरांची संपादनांवर 'पहारा दिला' मà¥à¤¹à¤£à¥‚न खूण करा",
'action-autopatrol' => 'आपलà¥à¤¯à¤¾ संपादनांवर पहारा दिलà¥à¤¯à¤¾à¤šà¥€ खूण करा',
'action-unwatchedpages' => 'पहारा न दिलेलà¥à¤¯à¤¾ पानांची यादी पहा',
@@ -1622,12 +1688,19 @@ $1",
'action-userrights-interwiki' => 'इतर विकिंवरचà¥à¤¯à¤¾ सदसà¥à¤¯à¤¾à¤‚चे अधिकार संपादित करा',
'action-siteadmin' => 'माहितीसाठà¥à¤¯à¤¾à¤²à¤¾ कà¥à¤²à¥‚प लावा अथवा काढा',
'action-sendemail' => 'विपतà¥à¤°à¥‡ (ई-मेलà¥à¤¸) पाठवा.',
+'action-editmywatchlist' => "'माà¤à¥€ निरीकà¥à¤·à¤£à¤¸à¥‚ची' संपादा",
+'action-viewmywatchlist' => "'माà¤à¥€ निरीकà¥à¤·à¤£à¤¸à¥‚ची' बघा",
+'action-viewmyprivateinfo' => 'आपली वैयकà¥à¤¤à¤¿à¤• माहिती बघा',
+'action-editmyprivateinfo' => 'आपली वैयकà¥à¤¤à¤¿à¤• माहिती संपादा',
# Recent changes
'nchanges' => '$1 {{PLURAL:$1|बदल}}',
+'enhancedrc-since-last-visit' => '$1 {{PLURAL:$1|मागील भेटीनंतर}}',
+'enhancedrc-history' => 'इतिहास',
'recentchanges' => 'अलीकडील बदल',
'recentchanges-legend' => 'अलीकडील बदलाà¤à¤µà¤œà¥€ परà¥à¤¯à¤¾à¤¯',
'recentchanges-summary' => 'या विकिवर à¤à¤¾à¤²à¥‡à¤²à¥à¤¯à¤¾ सरà¥à¤µà¤¾à¤¤ अलीकडील बदलांचा या पानावर मागोवा घà¥à¤¯à¤¾.',
+'recentchanges-noresult' => 'नमà¥à¤¦ कालावधीतील कोणतेही बदला या निकषांशी जà¥à¤³à¤¤ नाहीत.',
'recentchanges-feed-description' => 'या रसदीत,या विकिवर à¤à¤¾à¤²à¥‡à¤²à¥à¤¯à¤¾ सरà¥à¤µà¤¾à¤¤ अलीकडील बदलांचा मागोवा घà¥à¤¯à¤¾.',
'recentchanges-label-newpage' => 'या संपादनाने नवीन पान तयार à¤à¤¾à¤²à¥‡',
'recentchanges-label-minor' => 'हे à¤à¤• किरकोळ संपादन आहे',
@@ -1664,7 +1737,6 @@ $1",
'recentchangeslinked-feed' => 'या पृषà¥à¤ à¤¾à¤¸à¤‚बंधीचे बदल',
'recentchangeslinked-toolbox' => 'या पृषà¥à¤ à¤¾à¤¸à¤‚बंधीचे बदल',
'recentchangeslinked-title' => '"$1" चà¥à¤¯à¤¾ संदरà¥à¤­à¤¾à¤¤à¥€à¤² बदल',
-'recentchangeslinked-noresult' => 'जोडलेलà¥à¤¯à¤¾ पानांमधà¥à¤¯à¥‡ दिलेलà¥à¤¯à¤¾ कालावधीत काहीही बदल à¤à¤¾à¤²à¥‡à¤²à¥‡ नाहीत.',
'recentchangeslinked-summary' => "हे पृषà¥à¤  à¤à¤–ादà¥à¤¯à¤¾ विशिषà¥à¤Ÿ पानाशी (किंवा à¤à¤–ादà¥à¤¯à¤¾ विशिषà¥à¤Ÿ वरà¥à¤—ात असणाऱà¥à¤¯à¤¾ पानांशी) जोडलेलà¥à¤¯à¤¾ पानांवरील बदल दरà¥à¤¶à¤µà¤¤à¥‡.
तà¥à¤®à¤šà¥à¤¯à¤¾ [[Special:Watchlist|नितà¥à¤¯ पहाणà¥à¤¯à¤¾à¤šà¥à¤¯à¤¾ सूचीमधील]] ही पाने '''ठळक''' दिसतील.",
'recentchangeslinked-page' => 'पृषà¥à¤  नाव:',
@@ -1676,7 +1748,7 @@ $1",
'reuploaddesc' => 'अपभारण रदà¥à¤¦ करà¥à¤¨ ,अपभारणाचà¥à¤¯à¤¾ अरà¥à¤œà¤¾à¤•à¤¡à¥‡ परत जा',
'upload-tryagain' => 'बदललेले संचिका वरà¥à¤£à¤¨ पाठवा',
'uploadnologin' => 'सनोंद-पà¥à¤°à¤µà¥‡à¤¶à¤¿à¤¤ नाही',
-'uploadnologintext' => 'संचिका चढविणà¥à¤¯à¤¾à¤¸à¤¾à¤ à¥€ तà¥à¤®à¥à¤¹à¤¾à¤²à¤¾ [[Special:UserLogin|पà¥à¤°à¤µà¥‡à¤¶]] करावा लागेल.',
+'uploadnologintext' => 'संचिका चढविणà¥à¤¯à¤¾à¤¸à¤¾à¤ à¥€ तà¥à¤®à¥à¤¹à¤¾à¤²à¤¾ $1 करावा लागेल.',
'upload_directory_missing' => 'अपलोड डिरेकà¥à¤Ÿà¤°à¥€ ($1) सापडली नाही तसेच वेबसरà¥à¤µà¥à¤¹à¤° ती तयार करू शकलेला नाही.',
'upload_directory_read_only' => '$1 या डिरेकà¥à¤Ÿà¤°à¥€ मधà¥à¤¯à¥‡ सरà¥à¤µà¥à¤¹à¤° लिहू शकत नाही.',
'uploaderror' => 'अपभारणात चूक',
@@ -1880,7 +1952,6 @@ https://www.mediawiki.org/wiki/Manual:Image_Authorization कृपया हे
'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>
@@ -1908,6 +1979,10 @@ https://www.mediawiki.org/wiki/Manual:Image_Authorization कृपया हे
'listfiles_size' => 'आकार (बाईटà¥à¤¸)',
'listfiles_description' => 'वरà¥à¤£à¤¨',
'listfiles_count' => 'आवृतà¥à¤¤à¥à¤¯à¤¾',
+'listfiles-show-all' => 'या चितà¥à¤°à¤¾à¤šà¥à¤¯à¤¾ जूनà¥à¤¯à¤¾ आवृतà¥à¤¤à¥à¤¯à¤¾ अंतरà¥à¤­à¥‚त करा.',
+'listfiles-latestversion' => 'सधà¥à¤¯à¤¾à¤šà¥€ आवृतà¥à¤¤à¥€',
+'listfiles-latestversion-yes' => 'हो',
+'listfiles-latestversion-no' => 'नाही',
# File description page
'file-anchor-link' => 'संचिका',
@@ -2001,6 +2076,13 @@ Input:contenttype/subtype, e.g. <code>image/jpeg</code>.',
'randompage' => 'अविशिषà¥à¤Ÿ लेख',
'randompage-nopages' => 'पà¥à¤¢à¥€à¤² {{PLURAL:$2|नामविशà¥à¤µà¤¾à¤¤|नामविशà¥à¤µà¤¾à¤‚त}} कोणतीही पाने नाहीत: $1.',
+# Random page in category
+'randomincategory' => 'वरà¥à¤—ातील अनियत पान',
+'randomincategory-invalidcategory' => '"$1" हे अधिकृत वरà¥à¤—ाचे नाव नाही.',
+'randomincategory-nopages' => '[[:Category:$1]] यात काहीच पाने नाहीत.',
+'randomincategory-selectcategory' => 'वरà¥à¤—: $1 $2 मधून अनियत पान उपलबà¥à¤§ करा.',
+'randomincategory-selectcategory-submit' => 'जा',
+
# Random redirect
'randomredirect' => 'अविशिषà¥à¤Ÿ पà¥à¤¨à¤°à¥à¤¨à¤¿à¤°à¥à¤¦à¥‡à¤¶à¤¨',
'randomredirect-nopages' => '$1 या नामविशà¥à¤µà¤¾à¤¤ कोणतीही पà¥à¤°à¥à¤¨à¤¨à¤¿à¤°à¥à¤¦à¥‡à¤¶à¤¨à¥‡ नाहीत.',
@@ -2026,16 +2108,13 @@ Input:contenttype/subtype, e.g. <code>image/jpeg</code>.',
'statistics-users-active-desc' => '{{PLURAL:$1|शेवटचà¥à¤¯à¤¾ दिवसात|शेवटचà¥à¤¯à¤¾ $1 दिवसांत}} à¤à¤•à¤¤à¤°à¥€ संपादन केलेले सदसà¥à¤¯',
'statistics-mostpopular' => 'सरà¥à¤µà¤¾à¤§à¤¿à¤• बघितली जाणारी पाने',
-'disambiguations' => 'नि:संदिगà¥à¤§à¤•à¤°à¤£ पृषà¥à¤ à¥‡',
-'disambiguationspage' => 'Template:नि:संदिगà¥à¤§à¥€à¤•à¤°à¤£',
-'disambiguations-text' => "निमà¥à¤¨à¤²à¤¿à¤–ीत पानांस, तà¥à¤¯à¤¾à¤‚ना '''नि:संदिगà¥à¤§à¤¿à¤•à¤°à¤£ पृषà¥à¤ à¤¾à¤¸''' जोडणारा किमान à¤à¤• दà¥à¤µà¤¾ आहे.
-à¤à¤µà¤œà¥€, ती सà¥à¤¯à¥‹à¤—à¥à¤¯ विषयाशी जोडली जावयास हवीत.<br /> जर à¤à¤–ादे पान [[MediaWiki:Disambiguationspage]]पासून जोडलेला साचा वापरत असेल तर तà¥à¤¯à¤¾ पानास, '''नि:संदिगà¥à¤§à¤¿à¤•à¤°à¤£ पृषà¥à¤ ''' असे गृहीत धरले जाते.",
-
'pageswithprop' => "'पृषà¥à¤  गà¥à¤£à¤§à¤°à¥à¤®' असणारी पाने",
'pageswithprop-legend' => 'पृषà¥à¤  गà¥à¤£à¤§à¤°à¥à¤® असणारी पाने',
'pageswithprop-text' => "या पानावर अशà¥à¤¯à¤¾ पानांची यादी आहे जे à¤à¤• विशिषà¥à¤Ÿ 'पृषà¥à¤  गà¥à¤£à¤§à¤°à¥à¤®' वापरतात.",
'pageswithprop-prop' => 'गà¥à¤£à¤§à¤°à¥à¤®à¤¾à¤šà¥‡ नाव:',
'pageswithprop-submit' => 'चला',
+'pageswithprop-prophidden-long' => 'मोठà¥à¤¯à¤¾ मजकूराचà¥à¤¯à¤¾ गà¥à¤£à¤§à¤°à¥à¤®à¤¾à¤šà¥€ किंमत लपविलेली आहे ($1)',
+'pageswithprop-prophidden-binary' => 'बायनरी गà¥à¤£à¤§à¤°à¥à¤®à¤¾à¤šà¥€ किंमत लपविलेली आहे ($1)',
'doubleredirects' => 'दà¥à¤¹à¥‡à¤°à¥€-पà¥à¤¨à¤°à¥à¤¨à¤¿à¤°à¥à¤¦à¥‡à¤¶à¤¨à¥‡',
'doubleredirectstext' => 'हे पान अशा पानांची सूची पà¥à¤°à¤µà¤¤à¥‡ की जी पà¥à¤°à¥à¤¨à¤¨à¤¿à¤°à¥à¤¦à¥‡à¤¶à¥€à¤¤ पाने दà¥à¤¸à¤±à¥à¤¯à¤¾ पà¥à¤°à¥à¤¨à¤¨à¤¿à¤°à¥à¤¦à¥‡à¤¶à¥€à¤¤ पानाकडे निरà¥à¤¦à¥‡à¤¶à¤¿à¤¤ à¤à¤¾à¤²à¥€ आहेत.पà¥à¤°à¤¤à¥à¤¯à¥‡à¤• ओळीत पहिलà¥à¤¯à¤¾ आणि दà¥à¤¸à¤±à¥à¤¯à¤¾ पà¥à¤°à¥à¤¨à¤¨à¤¿à¤°à¥à¤¦à¥‡à¤¶à¤¨à¤¾à¤¸ दà¥à¤µà¤¾ दिला आहे सोबतच दà¥à¤¸à¤°à¥‡ पà¥à¤°à¥à¤¨à¤¨à¤¿à¤°à¥à¤¦à¥‡à¤¶à¤¨ जà¥à¤¯à¤¾ पानाकडे पोहचते ते पण दिले आहे, जे की बरोबर असणà¥à¤¯à¤¾à¤šà¥€ शकà¥à¤¯à¤¤à¤¾ आहे ,ते वसà¥à¤¤à¥à¤¤à¤ƒ पहिलà¥à¤¯à¤¾ पानापासूनचेही पà¥à¤°à¥à¤¨à¤¨à¤¿à¤°à¥à¤¦à¥‡à¤¶à¤¨ असावयास हवे.',
@@ -2092,6 +2171,7 @@ Input:contenttype/subtype, e.g. <code>image/jpeg</code>.',
'mostrevisions' => 'सरà¥à¤µà¤¾à¤§à¤¿à¤• बदललेले लेख',
'prefixindex' => 'उपसरà¥à¤— असणाऱà¥à¤¯à¤¾ लेखांची यादी',
'prefixindex-namespace' => '($1 नामविशà¥à¤µ) हा उपसरà¥à¤— असणारी सरà¥à¤µ पाने',
+'prefixindex-strip' => 'यादीतील उपसरà¥à¤— काढा',
'shortpages' => 'छोटी पाने',
'longpages' => 'मोठी पाने',
'deadendpages' => 'टोकाची पाने',
@@ -2107,6 +2187,7 @@ Input:contenttype/subtype, e.g. <code>image/jpeg</code>.',
'listusers' => 'सदसà¥à¤¯à¤¾à¤‚ची यादी',
'listusers-editsonly' => 'फकà¥à¤¤ संपादनांसहित सदसà¥à¤¯ दाखवा',
'listusers-creationsort' => 'निरà¥à¤®à¤¿à¤¤à¥€à¤šà¥à¤¯à¤¾ तारखेपà¥à¤°à¤®à¤¾à¤£à¥‡ लावा',
+'listusers-desc' => 'उतरतà¥à¤¯à¤¾ कà¥à¤°à¤®à¤¾à¤¨à¥‡ निवडा',
'usereditcount' => '$1 {{PLURAL:$1|संपादन|संपादने}}',
'usercreated' => 'दि. $1 ला, $2 वाजता, सदसà¥à¤¯ खाते{{GENDER:$3|दà¥à¤µà¤¾à¤°à¥‡ बनविलà¥à¤¯à¤¾ गेले}}',
'newpages' => 'नवीन पाने',
@@ -2281,10 +2362,9 @@ Input:contenttype/subtype, e.g. <code>image/jpeg</code>.',
'unwatchthispage' => 'पहारा काढून टाका',
'notanarticle' => 'मजकà¥à¤° विरहित पान',
'notvisiblerev' => 'आवृतà¥à¤¤à¥€ वगळणà¥à¤¯à¤¾à¤¤ आलेली आहे',
-'watchnochange' => 'पà¥à¤°à¤¦à¤°à¥à¤¶à¤¿à¤¤ कालावधीत, तà¥à¤®à¥à¤¹à¥€ नितà¥à¤¯ पहाणà¥à¤¯à¤¾à¤¸à¤¾à¤ à¥€ ठेवलेली कोणतीही बाब संपादित à¤à¤¾à¤²à¥€ नाही.',
'watchlist-details' => 'पहाऱà¥à¤¯à¤¾à¤šà¥à¤¯à¤¾ सूचीमधील {{PLURAL:$1|$1 पान|$1 पाने}}, यात चरà¥à¤šà¤¾ पाने मोजलेली नाहीत.',
-'wlheader-enotif' => '* विपतà¥à¤° सूचना सà¥à¤µà¤¿à¤§à¤¾ उपलबà¥à¤§ केली.',
-'wlheader-showupdated' => "* तà¥à¤®à¥à¤¹à¥€ पानांस दिलेलà¥à¤¯à¤¾ शेवटचà¥à¤¯à¤¾ भेटी पासून बदललेली पाने '''ठळक''' दाखवली आहेत.",
+'wlheader-enotif' => 'विपतà¥à¤° अधिसूचना सà¥à¤µà¤¿à¤§à¤¾ शकà¥à¤¯ केली.',
+'wlheader-showupdated' => "ती पाने, जी आपण दिलेलà¥à¤¯à¤¾ शेवटचà¥à¤¯à¤¾ भेटीनंतर बदललेली आहेत, '''ठळक''' दाखवली आहेत.",
'watchmethod-recent' => 'पहाऱà¥à¤¯à¤¾à¤¤à¥€à¤² पानांकरिता अलीकडील बदलांचा तपास',
'watchmethod-list' => 'अलीकडील बदलांकरिता पहाऱà¥à¤¯à¤¾à¤¤à¥€à¤² पानांचा तपास',
'watchlistcontains' => 'तà¥à¤®à¤šà¤¾ $1 {{PLURAL:$1|पानावर|पानांवर}} पहारा आहे.',
@@ -2366,9 +2446,11 @@ $UNWATCHURL
'deleteotherreason' => 'दà¥à¤¸à¤°à¥‡/अतिरिकà¥à¤¤ कारण:',
'deletereasonotherlist' => 'दà¥à¤¸à¤°à¥‡ कारण',
'deletereason-dropdown' => '* वगळणà¥à¤¯à¤¾à¤šà¥€ सामानà¥à¤¯ कारणे
-** लेखकाची(लेखिकेची) विनंती
+** सà¥à¤ªà¥…म
+** उतà¥à¤ªà¤¾à¤¤
** पà¥à¤°à¤¤à¤¾à¤§à¤¿à¤•à¤¾à¤° उलà¥à¤²à¤‚घन
-** उतà¥à¤ªà¤¾à¤¤',
+** लेखकाची(लेखिकेची) विनंती
+** तà¥à¤Ÿà¤•à¥€ पà¥à¤¨à¤°à¥à¤¨à¤¿à¤°à¥à¤¦à¥‡à¤¶à¤¨à¥‡',
'delete-edit-reasonlist' => 'वगळणà¥à¤¯à¤¾à¤šà¥€ कारणे संपादित करा',
'delete-toobig' => 'या पानाला खूप मोठी इतिहास यादी आहे, तसेच हे पान $1 {{PLURAL:$1|पेकà¥à¤·à¤¾|पेकà¥à¤·à¤¾}}पेकà¥à¤·à¤¾ जासà¥à¤¤ वेळा बदलणà¥à¤¯à¤¾à¤¤ आलेले आहे. अशी पाने वगळणे हे {{SITENAME}} ला धोकादायक ठरू नये मà¥à¤¹à¤£à¥‚न शकà¥à¤¯ केलेले नाही.',
'delete-warning-toobig' => 'या पानाला खूप मोठी इतिहास यादी आहे, तसेच हे पान $1 {{PLURAL:$1|पेकà¥à¤·à¤¾|पेकà¥à¤·à¤¾}} पेकà¥à¤·à¤¾ जासà¥à¤¤ वेळा बदलणà¥à¤¯à¤¾à¤¤ आलेले आहे.
@@ -2388,7 +2470,7 @@ $UNWATCHURL
शेवटचे संपादन [[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]] यांचà¥à¤¯à¤¾ आवृतà¥à¤¤à¥€à¤•à¤¡à¥‡ पूरà¥à¤µà¤ªà¤¦à¤¾à¤¸ नेले.',
-'revertpage-nouser' => '(सदसà¥à¤¯à¤¨à¤¾à¤® लपवले) यांनी केलेले बदल उलटवून [[User:$1|$1]] यांचà¥à¤¯à¤¾ आवृतà¥à¤¤à¥€à¤ªà¥à¤°à¤®à¤¾à¤£à¥‡ पूरà¥à¤µà¤µà¤¤ केले.',
+'revertpage-nouser' => 'लपविलेलà¥à¤¯à¤¾ सदसà¥à¤¯à¤¾à¤šà¥€ संपादने उलटवून {{GENDER:$1|[[सदसà¥à¤¯:$1|$1]]}} यांचà¥à¤¯à¤¾ आवृतà¥à¤¤à¥€à¤ªà¥à¤°à¤®à¤¾à¤£à¥‡ पूरà¥à¤µà¤µà¤¤ केले.',
'rollback-success' => '$1 ने उलटवलेली संपादने;$2 चà¥à¤¯à¤¾ आवृतà¥à¤¤à¥€à¤¸ परत नेली.',
# Edit tokens
@@ -2520,7 +2602,7 @@ $1',
'contributions' => '{{GENDER:$1|सदसà¥à¤¯}} योगदान',
'contributions-title' => '$1 साठी सदसà¥à¤¯-योगदान',
'mycontris' => 'योगदान',
-'contribsub2' => '$1 ($2) साठी',
+'contribsub2' => '{{GENDER:$3|$1}} ($2) साठी',
'nocontribs' => 'या मानदंडाशी जà¥à¤³à¤£à¤¾à¤°à¥‡ बदल सापडले नाहीत.',
'uctop' => '(सदà¥à¤¯)',
'month' => 'या महिनà¥à¤¯à¤¾à¤ªà¤¾à¤¸à¥‚न (आणि पूरà¥à¤µà¥€à¤šà¥‡):',
@@ -2676,13 +2758,11 @@ $1',
'ipb_blocked_as_range' => 'तà¥à¤°à¥‚टी:अंकपतà¥à¤¤à¤¾ IP $1 हा पà¥à¤°à¤¤à¥à¤¯à¤•à¥à¤·à¤ªà¤£à¥‡ पà¥à¤°à¤¤à¤¿à¤¬à¤‚धित केलेला नाही आणि अपà¥à¤°à¤¤à¤¿à¤¬à¤‚धीत करता येत नाही.तो,अरà¥à¤¥à¤¾à¤¤,$2पलà¥à¤²à¥à¤¯à¤¾à¤šà¤¾ भाग मà¥à¤¹à¤¾à¤£à¥‚न तो पà¥à¤°à¤¤à¤¿à¤¬à¤‚धित केलेला आहे,जो की अपà¥à¤°à¤¤à¤¿à¤¬à¤‚धीत करता येत नाही.',
'ip_range_invalid' => 'अंकपतà¥à¤¤à¤¾ अयोगà¥à¤¯ टपà¥à¤ªà¥à¤¯à¤¾à¤¤.',
'ip_range_toolarge' => '/$1 पेकà¥à¤·à¤¾ मोठà¥à¤¯à¤¾ Range पà¥à¤°à¤¤à¤¿à¤¬à¤‚धनाची परवानगी नाहॠare not allowed.',
-'blockme' => 'मला पà¥à¤°à¤¤à¤¿à¤¬à¤‚धित करा',
'proxyblocker' => 'पà¥à¤°à¤¾à¤¤à¤¿à¤¨à¤¿à¤§à¥€(पà¥à¤°à¥‰à¤•à¥à¤à¥€)पà¥à¤°à¤¤à¤¿à¤¬à¤‚धक',
-'proxyblocker-disabled' => 'हे कारà¥à¤¯ अवरूदà¥à¤§ केले आहे.',
'proxyblockreason' => 'तà¥à¤®à¤šà¤¾ अंकपतà¥à¤¤à¤¾ पà¥à¤°à¤¤à¤¿à¤¬à¤‚धित केला आहे कारण तो उघड-उघड पà¥à¤°à¤¤à¤¿à¤¨à¤¿à¤§à¥€ आहे.कृपया तà¥à¤®à¤šà¥à¤¯à¤¾ आंतरजाल सेवा दातà¥à¤¯à¤¾à¤¸ किंवा तंतà¥à¤°à¤œà¥à¤žà¤¾à¤¸ पाचारण संपरà¥à¤• करा आणि तà¥à¤¯à¤¾à¤‚चे या गंभीर सà¥à¤°à¤•à¥à¤·à¤¾à¤ªà¥à¤°à¤¶à¥à¤¨à¤¾ कडे लकà¥à¤· वेधा.',
-'proxyblocksuccess' => 'à¤à¤¾à¤²à¥‡.',
'sorbsreason' => '{{SITENAME}}ने वापरलेलà¥à¤¯à¤¾ DNSBL मधà¥à¤¯à¥‡ तà¥à¤®à¤šà¥à¤¯à¤¾ अंकपतà¥à¤¤à¥à¤¯à¤¾à¤šà¥€ नोंद उघड-उघड पà¥à¤°à¤¤à¤¿à¤¨à¤¿à¤§à¥€ मà¥à¤¹à¤£à¥‚न सूचित केली आहे.',
'sorbs_create_account_reason' => '{{SITENAME}}चà¥à¤¯à¤¾ DNSBLने तà¥à¤®à¤šà¤¾ अंकपतà¥à¤¤à¤¾ उघड-उघड पà¥à¤°à¤¤à¤¿à¤¨à¤¿à¤§à¥€ मà¥à¤¹à¤£à¥‚न सूचित केला आहे.तà¥à¤®à¥à¤¹à¥€ खाते उघडू शकत नाही',
+'xffblockreason' => '(X-Forwarded-For header) मधील अंकपतà¥à¤¤à¤¾,आपला किंवा आपण वापरत असलेलà¥à¤¯à¤¾ सरà¥à¤µà¥à¤¹à¤°à¤šà¤¾,पà¥à¤°à¤¤à¤¿à¤¬à¤‚धित केलà¥à¤¯à¤¾ गेला आहे.पà¥à¤°à¤¤à¤¿à¤¬à¤‚धित करणà¥à¤¯à¤¾à¤šà¥‡ मà¥à¤³ कारण होते:$1',
'cant-block-while-blocked' => 'तà¥à¤®à¥à¤¹à¥€ सà¥à¤µà¤¤à¤ƒ पà¥à¤°à¤¤à¤¿à¤¬à¤‚धित असताना इतरांना पà¥à¤°à¤¤à¤¿à¤¬à¤‚धित करू शकत नाही.',
'cant-see-hidden-user' => 'तà¥à¤®à¥à¤¹à¥€ पà¥à¤°à¤¤à¤¿à¤¬à¥à¤‚धकरणà¥à¤¯à¤¾à¤šà¤¾ पà¥à¤°à¤¯à¤¤à¥à¤¨ करत असलेले सदसà¥à¤¯ खाते आधीपासूनच पà¥à¤°à¤¤à¤¿à¤¬à¤‚धित आणि लपविले गेले आहे.
तà¥à¤®à¤šà¥à¤¯à¤¾à¤•à¤¡à¥‡ सदसà¥à¤¯ लपविणà¥à¤¯à¤¾à¤šà¥‡ अधिकार नसलà¥à¤¯à¤¾à¤®à¥à¤³à¥‡ , तà¥à¤®à¥à¤¹à¥€ सदसà¥à¤¯ पà¥à¤°à¤¤à¤¿à¤¬à¤‚धन पाहू अथवा संपादित करू शकत नाही',
@@ -2846,6 +2926,7 @@ $1',
'thumbnail-more' => 'मोठे करा',
'filemissing' => 'संचिका असà¥à¤¤à¤¿à¤¤à¥à¤µà¤¾à¤¤ नाही',
'thumbnail_error' => 'नखà¥à¤²à¥‡ निरà¥à¤®à¤¾à¤£à¤¾à¤¤ तà¥à¤°à¥‚टी: $1',
+'thumbnail_error_remote' => '$1 कडून तà¥à¤°à¥à¤Ÿà¥€-संदेश:$2',
'djvu_page_error' => 'टपà¥à¤ªà¥à¤¯à¤¾à¤šà¥à¤¯à¤¾ बाहेरचे DjVu पान',
'djvu_no_xml' => 'DjVu संचिकेकरिता XML ओढणà¥à¤¯à¤¾à¤¤ असमरà¥à¤¥',
'thumbnail-temp-create' => 'तातà¥à¤ªà¥à¤°à¤¤à¥€ इवलीशी संचिका बनविता आली नाही',
@@ -3066,13 +3147,8 @@ $1',
'pageinfo-category-files' => 'संचिकांची संखà¥à¤¯à¤¾',
# Skin names
-'skinname-standard' => 'अभिजात',
-'skinname-nostalgia' => 'रमà¥à¤¯',
'skinname-cologneblue' => 'सà¥à¤°à¥‡à¤–नीळी',
'skinname-monobook' => 'मोनोबà¥à¤•',
-'skinname-myskin' => 'माà¤à¥€à¤•à¤¾à¤‚ती',
-'skinname-chick' => 'मसà¥à¤¤',
-'skinname-simple' => 'साधी',
'skinname-modern' => 'आधà¥à¤¨à¤¿à¤•',
'skinname-vector' => 'सदिश',
@@ -3154,11 +3230,25 @@ $1',
'minutes' => '{{PLURAL:$1|$1 मिनिट|$1 मिनिट}}',
'hours' => '{{PLURAL:$1|$1 तास|$1 तास}}',
'days' => '{{PLURAL:$1|$1 दिवस|$1 दिवस}}',
+'weeks' => '{{PLURAL:$1|$1 आठवडा|$1 आठवडे}}',
'months' => '{{PLURAL:$1|$1 महिना|$1 महिने}}',
'years' => '{{PLURAL:$1|$1 वरà¥à¤·|$1 वरà¥à¤·à¥‡}}',
'ago' => '$1 पूरà¥à¤µà¥€',
'just-now' => 'लगेच',
+# Human-readable timestamps
+'hours-ago' => '$1 {{PLURAL:$1|तास}} पूरà¥à¤µà¥€',
+'minutes-ago' => '$1 {{PLURAL:$1|मिनिट|मिनिटे}} पूरà¥à¤µà¥€',
+'seconds-ago' => '$1 {{PLURAL:$1|सेकंद|सेकंदां}}पूरà¥à¤µà¥€',
+'monday-at' => 'सोमवारी $1 वर',
+'tuesday-at' => 'मंगळवारी $1 वर',
+'wednesday-at' => 'बà¥à¤§à¤µà¤¾à¤°à¥€ $1 वर',
+'thursday-at' => 'गà¥à¤°à¥à¤µà¤¾à¤°à¥€ $1 वर',
+'friday-at' => 'शà¥à¤•à¥à¤°à¤µà¤¾à¤°à¥€ $1 वर',
+'saturday-at' => 'शनिवारी $1 वर',
+'sunday-at' => 'रविवारी $1 वर',
+'yesterday-at' => 'काल $1 वर',
+
# Bad image list
'bad_image_list' => 'रूपरेषा खालीलपà¥à¤°à¤®à¤¾à¤£à¥‡ आहे:
@@ -3185,7 +3275,7 @@ $1',
* gpslongitude
* gpsaltitude',
-# EXIF tags
+# Exif tags
'exif-imagewidth' => 'रूंदी',
'exif-imagelength' => 'उंची',
'exif-bitspersample' => 'पà¥à¤°à¤¤à¥€ घटक बीटà¥à¤¸',
@@ -3364,7 +3454,7 @@ $1',
'exif-originalimageheight' => 'चितà¥à¤°à¤¾à¤šà¤¾ आकार बदलणà¥à¤¯à¤¾à¤ªà¥à¤°à¥à¤µà¥€à¤šà¥€ उंची',
'exif-originalimagewidth' => 'छाचाचितà¥à¤°à¤¾à¤šà¤¾ आकार बदलणà¥à¤¯à¤¾à¤ªà¥à¤°à¥à¤µà¥€à¤šà¥€ रूंदी',
-# EXIF attributes
+# Exif attributes
'exif-compression-1' => 'अनाकà¥à¤‚चीत',
'exif-compression-2' => 'CCITT गट३ १-Dimensional Modified Huffman run length encoding',
'exif-compression-3' => 'CCITT Group 3 फॅकà¥à¤¸ संकेतन',
@@ -3748,7 +3838,6 @@ $5
'version-other' => 'इतर',
'version-mediahandlers' => 'मिडिया हॅंडलर',
'version-hooks' => 'अंकà¥à¤¶',
-'version-extension-functions' => 'अतिविसà¥à¤¤à¤¾à¤°(à¤à¤•à¥à¤¸à¥à¤Ÿà¥‡à¤‚शन) कारà¥à¤¯à¥‡',
'version-parser-extensiontags' => 'पृथकक विसà¥à¤¤à¤¾à¤°à¥€à¤¤ खूणा',
'version-parser-function-hooks' => 'पृथकक कारà¥à¤¯ अंकà¥à¤¶',
'version-hook-name' => 'अंकà¥à¤¶ नाव',
@@ -3757,6 +3846,7 @@ $5
'version-license' => 'परवाना',
'version-poweredby-credits' => "हा विकी '''[//www.mediawiki.org/ मीडियाविकी]'''दà¥à¤µà¤¾à¤°à¥‡ संचालित आहे, पà¥à¤°à¤¤à¤¾à¤§à¤¿à¤•à¤¾à¤°à¤¿à¤¤ © २००१-$1 $2.",
'version-poweredby-others' => 'इतर',
+'version-poweredby-translators' => 'टà¥à¤°à¤¾à¤‚सलेटविकि.नेट वरील भाषांतरकार',
'version-credits-summary' => 'आमà¥à¤¹à¥€ खालील वà¥à¤¯à¤•à¥à¤¤à¥€à¤‚ना, [[Special:Version|मिडियाविकि]]वर तà¥à¤¯à¤¾à¤‚नी दिलेलà¥à¤¯à¤¾ योगदानामà¥à¤³à¥‡, मानà¥à¤¯à¤¤à¤¾ देऊ ईचà¥à¤›à¤¿à¤¤à¥‹.',
'version-license-info' => 'मिडियाविकि हे मà¥à¤•à¥à¤¤ संगणक पà¥à¤°à¤£à¤¾à¤²à¥€ विकि पॅकेज आहे.Free Software Foundation पà¥à¤°à¤•à¤¾à¤¶à¤¿à¤¤ GNU General Public परवानà¥à¤¯à¤¾à¤šà¥à¤¯à¤¾ अटीस अनà¥à¤¸à¤°à¥‚न तà¥à¤®à¥à¤¹à¥€ तà¥à¤¯à¤¾à¤¤ बदल आणि/अथवा तà¥à¤¯à¤¾à¤šà¥‡ पà¥à¤°à¥à¤¨à¤µà¤¿à¤¤à¤°à¤£ करू शकता.
@@ -3770,12 +3860,17 @@ $5
'version-entrypoints-header-entrypoint' => 'आत येणà¥à¤¯à¤¾à¤šà¤¾ मारà¥à¤—',
'version-entrypoints-header-url' => 'यू॰आर॰à¤à¤²',
-# Special:FilePath
-'filepath' => 'संचिका मारà¥à¤—',
-'filepath-page' => 'संचिका:',
-'filepath-submit' => 'चला',
-'filepath-summary' => 'हे विशेष पान संचिकेचा संपूरà¥à¤£ मारà¥à¤— कळवते.
-चितà¥à¤°à¥‡ संपूरà¥à¤£ रिà¤à¥‹à¤²à¥à¤¯à¥à¤¶à¤¨ मधà¥à¤¯à¥‡ दाखवली आहेत,इतर संचिका पà¥à¤°à¤•à¤¾à¤° तà¥à¤¯à¤¾à¤‚चà¥à¤¯à¤¾ संबधित पà¥à¤°à¥‹à¤—à¥à¤°à¤¾à¤®à¤¨à¥‡ पà¥à¤°à¤¤à¥à¤¯à¤•à¥à¤· सà¥à¤°à¥‚ होतात.',
+# Special:Redirect
+'redirect' => 'संचिका,सदसà¥à¤¯ किंवा आवृतà¥à¤¤à¥€ या ओळखणीनà¥à¤¸à¤¾à¤° पà¥à¤¨à¤°à¥à¤¨à¤¿à¤°à¥à¤¦à¥‡à¤¶à¤¨',
+'redirect-legend' => 'संचिका अथवा पानास पà¥à¤¨à¤°à¥à¤¨à¤¿à¤°à¥à¤¦à¥‡à¤¶à¤¨',
+'redirect-summary' => 'हे विशेष पान à¤à¤• संचिकेस पà¥à¤¨à¤°à¥à¤¨à¤¿à¤°à¥à¤¦à¥‡à¤¶à¤¿à¤¤ करते(दिलेले संचिकानाम),à¤à¤• पान(दिलेली आवृतà¥à¤¤à¥€ ओळà¥à¤–ण) किंवा à¤à¤• सदसà¥à¤¯à¤ªà¤¾à¤¨(दिलेला सदसà¥à¤¯ अंक).',
+'redirect-submit' => 'जा',
+'redirect-lookup' => 'बघा:',
+'redirect-value' => 'मà¥à¤²à¥à¤¯:',
+'redirect-user' => 'सदसà¥à¤¯à¤¨à¤¾à¤®',
+'redirect-revision' => 'पानाची आवृतà¥à¤¤à¥€',
+'redirect-file' => 'संचिकानाम',
+'redirect-not-exists' => '(योगà¥à¤¯)मà¥à¤²à¥à¤¯ (वà¥à¤¹à¥…लà¥à¤¯à¥) सापडले नाही',
# Special:FileDuplicateSearch
'fileduplicatesearch' => 'जà¥à¤³à¥à¤¯à¤¾ संचिका शोधा',
@@ -3821,12 +3916,16 @@ $5
'tags' => 'मानà¥à¤¯ बदल खà¥à¤£à¤¾',
'tag-filter' => '[[Special:Tags|खूणपताका]] गाळक:',
'tag-filter-submit' => 'गाळक',
+'tag-list-wrapper' => '([[Special:Tags|{{PLURAL:$1|खूणपताका}}]]: $2)',
'tags-title' => 'खà¥à¤£à¤¾',
'tags-intro' => 'पà¥à¤°à¤£à¤¾à¤²à¥€à¤¤à¥‚न विशिषà¥à¤Ÿ संपादनांचà¥à¤¯à¤¾ अरà¥à¤¥à¤¾à¤¸à¤¹à¤¿à¤¤ खà¥à¤£à¤¾à¤‚ची यादी नमूद करणारे पान',
'tags-tag' => 'खूण नाव',
'tags-display-header' => 'बदल सà¥à¤šà¥€à¤µà¤° कसे दिसेल',
'tags-description-header' => 'अरà¥à¤¥à¤¾à¤šà¥€ पूरà¥à¤£ माहिती',
+'tags-active-header' => 'सकà¥à¤°à¤¿à¤¯?',
'tags-hitcount-header' => 'खà¥à¤£à¤¾ केलेले बदल',
+'tags-active-yes' => 'होय',
+'tags-active-no' => 'नाही',
'tags-edit' => 'संपादन करा',
'tags-hitcount' => '$1 {{PLURAL:$1|बदल|बदल}}',
@@ -3847,6 +3946,7 @@ $5
'dberr-problems' => 'माफ करा, हे संकेतसà¥à¤¥à¤³ सधà¥à¤¯à¤¾ तांतà¥à¤°à¤¿à¤• अडचणींना सामोरे जात आहे.',
'dberr-again' => 'थोडा वेळ थांबून पà¥à¤¨à¥à¤¹à¤¾ पहा.',
'dberr-info' => '( विदादाताशी संपरà¥à¤• साधणà¥à¤¯à¤¾à¤¤ असमरà¥à¤¥ : $1)',
+'dberr-info-hidden' => '( विदादातà¥à¤¯à¤¾à¤¶à¥€ संपरà¥à¤• साधणà¥à¤¯à¤¾à¤¤ असमरà¥à¤¥)',
'dberr-usegoogle' => 'तोपरà¥à¤¯à¤‚त गूगलवर शोधून पहा',
'dberr-outofdate' => 'लकà¥à¤·à¤¾à¤¤ घà¥à¤¯à¤¾, आमचà¥à¤¯à¤¾ मजकà¥à¤°à¤¾à¤¬à¤¾à¤¬à¤¤ तà¥à¤¯à¤¾à¤‚ची सूची कालबाहà¥à¤¯ असू शकते',
'dberr-cachederror' => 'ही मागवलेलà¥à¤¯à¤¾ पानाची सयीतील पà¥à¤°à¤¤ आहे, ती अदà¥à¤¯à¤¯à¤¾à¤µà¤¤ नसणà¥à¤¯à¤¾à¤šà¥€ शकà¥à¤¯à¤¤à¤¾ आहे.',
@@ -3862,6 +3962,9 @@ $5
'htmlform-submit' => 'पाठवा',
'htmlform-reset' => 'बदल उलटवा',
'htmlform-selectorother-other' => 'इतर',
+'htmlform-no' => 'नाही',
+'htmlform-yes' => 'होय',
+'htmlform-chosen-placeholder' => 'परà¥à¤¯à¤¾à¤¯ निवडा',
# SQLite database support
'sqlite-has-fts' => 'पूरà¥à¤£-मजकूर शोध समरà¥à¤¥à¤¨à¤¾à¤¸à¤¹à¤¿à¤¤ $1',
@@ -3978,4 +4081,11 @@ $5
# Image rotation
'rotate-comment' => '$1 ने चितà¥à¤° {{PLURAL:$1|डिगà¥à¤°à¥€|डिगà¥à¤°à¥€à¤œ}}ने घडà¥à¤¯à¤¾à¤³à¥à¤¯à¤¾à¤šà¥‡ दिशेने फिरविले',
+# Limit report
+'limitreport-cputime' => 'CPU वापराचा वेळ',
+'limitreport-cputime-value' => '$1 {{PLURAL:$1|सेकंद}}',
+'limitreport-walltime-value' => '$1 {{PLURAL:$1|सेकंद}}',
+'limitreport-postexpandincludesize-value' => '$1/$2 {{PLURAL:$2|बाइट|बाइटà¥à¤¸}}',
+'limitreport-templateargumentsize-value' => '$1/$2 {{PLURAL:$2|बाइट|बाइटà¥à¤¸}}',
+
);
diff --git a/languages/messages/MessagesMrj.php b/languages/messages/MessagesMrj.php
index d5d0ae6f..503dca4a 100644
--- a/languages/messages/MessagesMrj.php
+++ b/languages/messages/MessagesMrj.php
@@ -75,8 +75,6 @@ $messages = array(
'tog-shownumberswatching' => 'МанÑрын ӹлӹштӓшӹм вӓнгӹмӹ ÑпиÑокышкышты пыртенӹт, анжыкташ',
'tog-oldsig' => 'Ылшы Ñирӹмӹ подпиÑьӹм анзыцок анжен лӓктӓш',
'tog-fancysig' => 'Вики-пӓлӹкӹн ӹшке подпиÑьшӹ (автоматичеÑкий ажедмӓш гӹц паÑна)',
-'tog-externaleditor' => 'Тӱнӹш тӧрлӹшӹм кычылташ (компьютерӹн йори наÑтройкыжы келеш)',
-'tog-externaldiff' => 'Вариантвлӓн тӓнгӓштӓрӹмӹ годым тӱнӹш программым кычылташ (компьютерӹн йори наÑтройкыжы келеш)',
'tog-showjumplinks' => '«ванжаш» палшышы ажедмӓшвлӓм чӱктӓш',
'tog-uselivepreview' => 'ТекÑтӹм пӹÑӹн анзыц анжен лӓкмӹм кычылташ (ÑкÑперимент Ñемӹнь JavaScript)',
'tog-forceeditsummary' => 'Мам тӧрлӹмӹ тӹ «нырын» охыр ылмыжы гишӓн пӓлдӹртӓш',
diff --git a/languages/messages/MessagesMs.php b/languages/messages/MessagesMs.php
index 5ccaff25..3774bd6f 100644
--- a/languages/messages/MessagesMs.php
+++ b/languages/messages/MessagesMs.php
@@ -85,6 +85,7 @@ $magicWords = array(
'pagenamee' => array( '1', 'NAMALAMANE', 'PAGENAMEE' ),
'namespace' => array( '1', 'RUANGNAMA', 'NAMESPACE' ),
'namespacee' => array( '1', 'RUANGNAMAE', 'NAMESPACEE' ),
+ 'namespacenumber' => array( '1', 'NOMBORRUANGNAMA', 'NAMESPACENUMBER' ),
'talkspace' => array( '1', 'RUANGBINCANG', 'TALKSPACE' ),
'talkspacee' => array( '1', 'RUANGBINCANGE', 'TALKSPACEE' ),
'fullpagename' => array( '1', 'NAMALAMANPENUH', 'FULLPAGENAME' ),
@@ -95,9 +96,11 @@ $magicWords = array(
'img_left' => array( '1', 'kanan', 'left' ),
'img_none' => array( '1', 'tiada', 'none' ),
'img_center' => array( '1', 'tengah', 'center', 'centre' ),
+ 'img_border' => array( '1', 'bingkai', 'border' ),
'sitename' => array( '1', 'NAMATAPAK', 'SITENAME' ),
'ns' => array( '0', 'RN:', 'NS:' ),
'nse' => array( '0', 'RNE:', 'NSE:' ),
+ 'gender' => array( '0', 'JANTINA:', 'GENDER:' ),
'currentweek' => array( '1', 'MINGGUSEMASA', 'CURRENTWEEK' ),
);
@@ -112,13 +115,15 @@ $specialPageAliases = array(
'Booksources' => array( 'Sumber_buku' ),
'BrokenRedirects' => array( 'Lencongan_rosak', 'Pelencongan_rosak' ),
'Categories' => array( 'Kategori' ),
+ 'ChangeEmail' => array( 'Tukar_e-mel' ),
'ChangePassword' => array( 'Lupa_kata_laluan' ),
+ 'ComparePages' => array( 'Banding_laman' ),
'Confirmemail' => array( 'Sahkan_e-mel' ),
'Contributions' => array( 'Sumbangan' ),
'CreateAccount' => array( 'Buka_akaun' ),
'Deadendpages' => array( 'Laman_buntu' ),
'DeletedContributions' => array( 'Sumbangan_dihapuskan' ),
- 'Disambiguations' => array( 'Penyahtaksaan' ),
+ 'Disambiguations' => array( 'Penyahtaksaan', 'Nyahkekaburan' ),
'DoubleRedirects' => array( 'Lencongan_berganda', 'Pelencongan_berganda' ),
'Emailuser' => array( 'E-mel_pengguna' ),
'Export' => array( 'Eksport' ),
@@ -149,6 +154,7 @@ $specialPageAliases = array(
'Mycontributions' => array( 'Sumbangan_saya' ),
'Mypage' => array( 'Laman_saya' ),
'Mytalk' => array( 'Perbincangan_saya' ),
+ 'Myuploads' => array( 'Muat_naik_saya' ),
'Newimages' => array( 'Imej_baru' ),
'Newpages' => array( 'Laman_baru' ),
'Popularpages' => array( 'Laman_popular' ),
@@ -166,6 +172,7 @@ $specialPageAliases = array(
'Specialpages' => array( 'Laman_khas' ),
'Statistics' => array( 'Statistik' ),
'Tags' => array( 'Label' ),
+ 'Unblock' => array( 'Nyahsekat' ),
'Uncategorizedcategories' => array( 'Kategori_tanpa_kategori' ),
'Uncategorizedimages' => array( 'Imej_tanpa_kategori' ),
'Uncategorizedpages' => array( 'Laman_tanpa_kategori' ),
@@ -221,9 +228,6 @@ $messages = array(
'tog-shownumberswatching' => 'Tunjukkan bilangan pemantau',
'tog-oldsig' => 'Tanda tangan yang sedia ada:',
'tog-fancysig' => 'Anggap tandatangan sebagai teks wiki (tanpa pautan automatik)',
-'tog-externaleditor' => 'Utamakan penyunting luar (hanya untuk pakar, perlu tetapan khas pada komputer anda. [//www.mediawiki.org/wiki/Manual:External_editors Maklumat lanjut.])',
-'tog-externaldiff' => 'Utamakan pembeza luar (hanya untuk pakar, perlu tetapan khas pada komputer anda. [//www.mediawiki.org/wiki/Manual:External_editors Maklumat lanjut.])',
-'tog-showjumplinks' => 'Bolehkan pautan ketercapaian "lompat ke"',
'tog-uselivepreview' => 'Gunakan pralihat langsung (dalam percubaan)',
'tog-forceeditsummary' => 'Tanya saya jika ringkasan suntingan kosong',
'tog-watchlisthideown' => 'Sembunyikan suntingan saya daripada senarai pantau',
@@ -237,6 +241,8 @@ $messages = array(
'tog-showhiddencats' => 'Tunjukkan kategori tersembunyi',
'tog-noconvertlink' => 'Lumpuhkan penukaran tajuk pautan',
'tog-norollbackdiff' => 'Abaikan perbezaan selepas melakukan pengunduran suntingan.',
+'tog-useeditwarning' => 'Beri saya amaran apabila saya meninggalkan sesebuah laman penyuntingan tanpa menyimpan perubahan.',
+'tog-prefershttps' => 'Sentiasa gunakan sambungan terlindung apabila log masuk',
'underline-always' => 'Sentiasa',
'underline-never' => 'Jangan',
@@ -300,6 +306,18 @@ $messages = array(
'oct' => 'Okt',
'nov' => 'Nov',
'dec' => 'Dis',
+'january-date' => '$1 Januari',
+'february-date' => '$1 Februari',
+'march-date' => '$1 Mac',
+'april-date' => '$1 April',
+'may-date' => '$1 Mei',
+'june-date' => '$1 Jun',
+'july-date' => '$1 Julai',
+'august-date' => '$1 Ogos',
+'september-date' => '$1 September',
+'october-date' => '$1 Oktober',
+'november-date' => '$1 November',
+'december-date' => '$1 Disember',
# Categories related messages
'pagecategories' => '{{PLURAL:$1|Kategori|Kategori}}',
@@ -320,7 +338,7 @@ $messages = array(
'noindex-category' => 'Laman tak diindeks',
'broken-file-category' => 'Laman yang ada pautan fail yang terputus',
-'linkprefix' => '/^(.*?)([a-zA-Z\\x80-\\xff]+)$/sD',
+'linkprefix' => '/^((?>.*(?<![a-zA-Z\\x80-\\xff])))(.+)$/sD',
'about' => 'Perihal',
'article' => 'Laman kandungan',
@@ -383,6 +401,7 @@ $messages = array(
'create-this-page' => 'Cipta laman ini',
'delete' => 'Hapuskan',
'deletethispage' => 'Hapuskan laman ini',
+'undeletethispage' => 'Nyahhapuskan halaman ini',
'undelete_short' => 'Nyahhapus {{PLURAL:$1|satu suntingan|$1 suntingan}}',
'viewdeleted_short' => 'Papar {{PLURAL:$1|satu|$1}} suntingan dihapuskan',
'protect' => 'Lindung',
@@ -426,7 +445,7 @@ $1',
'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).
+# 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).
'aboutsite' => 'Perihal {{SITENAME}}',
'aboutpage' => 'Project:Perihal',
'copyright' => 'Kandungan disediakan di bawah $1 melainkan dinyatakan sebaliknya.',
@@ -436,7 +455,6 @@ $1',
'disclaimers' => 'Penolak tuntutan',
'disclaimerpage' => 'Project:Penolak tuntutan umum',
'edithelp' => 'Bantuan menyunting',
-'edithelppage' => 'Help:Menyunting',
'helppage' => 'Help:Kandungan',
'mainpage' => 'Laman Utama',
'mainpage-description' => 'Laman utama',
@@ -466,7 +484,6 @@ $1',
'newmessagesdifflinkplural' => '{{PLURAL:$1|perubahan|perubahan-perubahan}} terkini',
'youhavenewmessagesmulti' => 'Anda telah menerima pesanan baru pada $1',
'editsection' => 'sunting',
-'editsection-brackets' => '[$1]',
'editold' => 'sunting',
'viewsourceold' => 'lihat sumber',
'editlink' => 'sunting',
@@ -516,17 +533,12 @@ Senarai laman khas yang sah boleh dilihat di [[Special:SpecialPages]].',
# General errors
'error' => 'Ralat',
'databaseerror' => 'Ralat pangkalan data',
-'dberrortext' => 'Terjadinya ralat sintaks pertanyaan pangkalan data.
-Ini mungkin menandakan adanya pepijat dalam perisian ini.
-Pertanyaan pangkalan data terakhir yang dicuba ialah:
-<blockquote><code>$1</code></blockquote>
-daripada dalam fungsi "<samp>$2</samp>".
-Pangkalan data memulangkan ralat "<samp>$3: $4</samp>".',
-'dberrortextcl' => 'Terdapat ralat sintaks pertanyaan pangkalan data.
-Pertanyaan terakhir ialah:
-"$1"
-daripada fungsi "$2".
-Pangkalan data memulangkan ralat "$3: $4".',
+'databaseerror-text' => 'Ralat pertanyaan pangkalan data telah terjadi.
+Ini mungkin menandakan pepijat dalam perisian.',
+'databaseerror-textcl' => 'Ralat pertanyaan pangkalan data telah terjadi.',
+'databaseerror-query' => 'Pertanyaan: $1',
+'databaseerror-function' => 'Fungsi: $1',
+'databaseerror-error' => 'Ralat: $1',
'laggedslavemode' => 'Amaran: Laman ini mungkin bukan yang terkini.',
'readonly' => 'Pangkalan data dikunci',
'enterlockreason' => 'Sila nyatakan sebab penguncian dan jangkaan
@@ -561,6 +573,7 @@ Ia mungkin telah pun dihapuskan oleh orang lain.',
'cannotdelete-title' => 'Laman "$1" tidak dapat dihapuskan',
'delete-hook-aborted' => 'Penghapusan dibatalkan oleh penyangkuk.
Tiada sebab diberikan.',
+'no-null-revision' => 'Semakan nol baru untuk "$1" tidak dapat diwujudkan',
'badtitle' => 'Tajuk tidak sah',
'badtitletext' => 'Tajuk laman yang diminta tidak sah, kosong, ataupun tajuk antara bahasa atau tajuk antara wiki yang salah dipaut. Ia mungkin mengandungi aksara yang tidak dibenarkan.',
'perfcached' => 'Data yang berikut disimpan dalam cache dan mungkin tidak terkemas kini. Semaksimum {{PLURAL:$1|satu hasil|$1 hasil}} terdapat dalam cache.',
@@ -581,11 +594,14 @@ Pertanyaan: $2',
Untuk menambah atau menyunting terjemahan untuk semua wiki, sila gunakan projek penyetempatan MediaWiki, [//translatewiki.net/ translatewiki.net].',
'editinginterface' => "'''Amaran:''' Anda sedang menyunting laman yang digunakan untuk menghasilkan teks antara muka bagi perisian ini. Sebarang perubahan terhadap laman ini akan menjejaskan rupa antara muka bagi pengguna-pengguna lain di wiki ini.
Untuk menambah atau menyunting terjemahan untuk semua wiki, sila gunakan projek penyetempatan MediaWiki, [//translatewiki.net/ translatewiki.net].",
-'sqlhidden' => '(Pertanyaan SQL disorokkan)',
'cascadeprotected' => 'Laman ini telah dilindungi daripada penyuntingan oleh pengguna selain penyelia, kerana ia termasuk dalam {{PLURAL:$1|laman|laman-laman}} berikut, yang dilindungi dengan secara "melata": $2',
'namespaceprotected' => "Anda tidak mempunyai keizinan untuk menyunting laman dalam ruang nama '''$1'''.",
'customcssprotected' => 'Anda tidak dibenarkan menyunting laman JavaScript ini kerana ia mengandungi tetapan peribadi pengguna lain.',
'customjsprotected' => 'Anda tidak dibenarkan menyunting laman JavaScript ini kerana ia mengandungi tetapan peribadi pengguna lain.',
+'mycustomcssprotected' => 'Anda tiada kebenaran untuk menyunting halaman CSS ini.',
+'mycustomjsprotected' => 'Anda tiada kebenaran untuk menyunting halaman JavaScript ini.',
+'myprivateinfoprotected' => 'Anda tidak mempunyai kebenaran untuk menyunting maklumat peribadi anda.',
+'mypreferencesprotected' => 'Anda tidak mempunyai kebenaran untuk menyunting tetapan keutamaan anda.',
'ns-specialprotected' => 'Laman khas tidak boleh disunting.',
'titleprotected' => "Tajuk ini telah dilindungi oleh [[User:$1|$1]] daripada dicipta. Sebab yang diberikan ialah ''$2''.",
'filereadonlyerror' => 'Fail "$1" tidak dapat diubah suai kerana repositori fail "$2" berada dalam ragam baca sahaja.
@@ -609,10 +625,19 @@ Sila ingat bahawa sesetengah halaman mungkin masih dipaparkan seolah-olah anda m
'welcomecreation-msg' => 'Akaun anda telah dibuka.
Jangan lupa untuk mengubah [[Special:Preferences|keutamaan anda di {{SITENAME}}]].',
'yourname' => 'Nama pengguna:',
+'userlogin-yourname' => 'Nama pengguna',
+'userlogin-yourname-ph' => 'Masukkan nama pengguna anda',
+'createacct-another-username-ph' => 'Masukkan nama pengguna',
'yourpassword' => 'Kata laluan:',
+'userlogin-yourpassword' => 'Kata laluan',
+'userlogin-yourpassword-ph' => 'Masukkan kata laluan anda',
+'createacct-yourpassword-ph' => 'Isikan kata laluan',
'yourpasswordagain' => 'Ulangi kata laluan:',
+'createacct-yourpasswordagain' => 'Sahkan kata laluan',
+'createacct-yourpasswordagain-ph' => 'Isikan kata laluan semula',
'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',
+'userlogin-remembermypassword' => 'Biar saya kekal log masuk',
+'userlogin-signwithsecure' => 'Gunakan sambungan terlindung',
'yourdomainname' => 'Domain anda:',
'password-change-forbidden' => 'Anda tidak dapat mengubah kata laluan di wiki ini.',
'externaldberror' => 'Berlaku ralat pangkalan data bagi pengesahan luar atau anda tidak dibenarkan mengemaskinikan akaun luar anda.',
@@ -624,18 +649,41 @@ Jangan lupa untuk mengubah [[Special:Preferences|keutamaan anda di {{SITENAME}}]
'logout' => 'Log keluar',
'userlogout' => 'Log keluar',
'notloggedin' => 'Belum log masuk',
+'userlogin-noaccount' => 'Belum buka akaun?',
+'userlogin-joinproject' => 'Sertai {{SITENAME}}',
'nologin' => "Belum mempunyai akaun? '''$1'''.",
'nologinlink' => 'Buka akaun baru',
'createaccount' => 'Buka akaun',
'gotaccount' => "Sudah mempunyai akaun? '''$1'''.",
'gotaccountlink' => 'Log masuk',
'userlogin-resetlink' => 'Lupa nama pengguna/kata laluan anda?',
+'userlogin-resetpassword-link' => 'Reset kata laluan anda',
+'helplogin-url' => 'Help:Log masuk',
+'userlogin-helplink' => '[[{{MediaWiki:helplogin-url}}|Bantuan untuk log masuk]]',
+'createacct-join' => 'Isikan keterangan anda di bawah.',
+'createacct-another-join' => 'Masukkan maklumat akaun baru di bawah.',
+'createacct-emailrequired' => 'Alamat e-mel',
+'createacct-emailoptional' => 'Alamat e-mel (pilihan)',
+'createacct-email-ph' => 'Isikan alamt e-mel anda',
+'createacct-another-email-ph' => 'Masukkan alamat e-mel',
'createaccountmail' => 'Gunakan kata laluan rawak yang sementara dan hantarnya ke alamat e-mel yang dinyatakan',
+'createacct-realname' => 'Nama sebenar (pilihan)',
'createaccountreason' => 'Sebab:',
+'createacct-reason' => 'Sebab',
+'createacct-reason-ph' => 'Mengapa anda membuka satu lagi akaun',
+'createacct-captcha' => 'Pemeriksaan sekuriti',
+'createacct-imgcaptcha-ph' => 'Isikan teks yang anda lihat di atas',
+'createacct-submit' => 'Wujudkan akaun anda',
+'createacct-another-submit' => 'Buka akaun baru',
+'createacct-benefit-heading' => '{{SITENAME}} dijayakan oleh orang ramai seperti anda.',
+'createacct-benefit-body1' => '{{PLURAL:$1|suntingan}}',
+'createacct-benefit-body2' => '{{PLURAL:$1|halaman}}',
+'createacct-benefit-body3' => '{{PLURAL:$1|penyumbang}} terkini',
'badretype' => 'Sila ulangi kata laluan dengan betul.',
'userexists' => 'Nama pengguna yang diisikan telah pun digunakan.
Sila pilih nama yang lain.',
'loginerror' => 'Ralat log masuk',
+'createacct-error' => 'Ralat pembukaan akaun',
'createaccounterror' => 'Tidak dapat mencipta akaun: $1',
'nocookiesnew' => 'Akaun anda telah dibuka, tetapi anda belum log masuk. {{SITENAME}} menggunakan kuki untuk mencatat status log masuk pengguna. Sila aktifkan sokongan kuki pada pelayar anda, kemudian log masuk dengan nama pengguna dan kata laluan baru anda.',
'nocookieslogin' => "{{SITENAME}} menggunakan ''cookies'' untuk mencatat status log masuk pengguna. Sila aktifkan sokongan ''cookies'' pada pelayar anda dan cuba lagi.",
@@ -692,10 +740,12 @@ Anda boleh log masuk dan tukar kata laluan anda sekarang.
Sila abaikan mesej ini jika anda tidak meminta untuk membuka akaun tersebut.',
'usernamehasherror' => 'Nama pengguna tidak boleh memiliki aksara cincangan',
'login-throttled' => 'Anda telah mencuba log masuk berulang kali.
-Sila tunggu sebentar dan cuba lagi.',
+Sila tunggu $1 dan cuba lagi.',
'login-abort-generic' => 'Log masuk anda tidak berjaya, dan terpaksa dibatalkan',
'loginlanguagelabel' => 'Bahasa: $1',
'suspicious-userlogout' => 'Permintaan anda untuk log keluar ditolak kerana ia kelihatan seperti dihantar oleh pelayar rosak atau proksi pengagregatan.',
+'createacct-another-realname-tip' => 'Nama sebenar adalah tidak wajib.
+Jika anda memilih untuk menyatakannya, ini akan digunakan untuk memberikan atribusi kepada pengguna atas sumbangan mereka.',
# Email sending
'php-mail-error-unknown' => 'Ralat tak diketahui dalam fungsi mail() PHP',
@@ -711,8 +761,7 @@ Sila tunggu sebentar dan cuba lagi.',
'newpassword' => 'Kata laluan baru:',
'retypenew' => 'Ulangi kata laluan baru:',
'resetpass_submit' => 'Tetapkan kata laluan dan log masuk',
-'resetpass_success' => 'Kata laluan anda telah berjaya ditukar!
-Anda sedang dilog masuk...',
+'changepassword-success' => 'Kata laluan anda berjaya ditukar!',
'resetpass_forbidden' => 'Kata laluan tidak boleh ditukar',
'resetpass-no-info' => 'Anda hendaklah log masuk terlebih dahulu untuk mencapai laman ini secara terus.',
'resetpass-submit-loggedin' => 'Tukar kata laluan',
@@ -724,10 +773,11 @@ Anda mungkin telah pun berjaya menukar kata laluan anda atau meminta kata laluan
# Special:PasswordReset
'passwordreset' => 'Set semula kata laluan',
-'passwordreset-text' => 'Lengkapkan borang ini untuk mengeset semula kata laluan.',
+'passwordreset-text-one' => 'Lengkapkan borang ini untuk mengeset semula kata laluan anda.',
+'passwordreset-text-many' => '{{PLURAL:$1|Isi salah satu ruangan untuk mengeset semula kata laluan anda.}}',
'passwordreset-legend' => 'Set semula kata laluan',
'passwordreset-disabled' => 'Ciri set semula kata laluan telah dimatikan di wiki ini.',
-'passwordreset-pretext' => '{{PLURAL:$1||Isikan data di bawah}}',
+'passwordreset-emaildisabled' => 'Ciri-ciri e-mel telah dipadamkan di wiki ini.',
'passwordreset-username' => 'Nama pengguna:',
'passwordreset-domain' => 'Domain:',
'passwordreset-capture' => 'Lihat e-mel yang terhasil?',
@@ -750,7 +800,7 @@ $2
Kata laluan sementara: $2',
'passwordreset-emailsent' => 'E-mel set semula kata laluan telah dihantar.',
'passwordreset-emailsent-capture' => 'E-mel set semula kata laluan telah dihantar, seperti yang dipaparkan di bawah.',
-'passwordreset-emailerror-capture' => 'E-mel peringatan (seperti di bawah) telah dihasilkan tetapi tidak dapat dihantar kepada pengguna: $1',
+'passwordreset-emailerror-capture' => 'E-mel set semula kata laluan telah dihasilkan, seperti yang dipaparkan di bawah, tetapi tidak berjaya dihantar kepada {{GENDER:$2|pengguna}} berkenaan: $1',
# Special:ChangeEmail
'changeemail' => 'Tukar alamat e-mel',
@@ -764,6 +814,19 @@ Kata laluan sementara: $2',
'changeemail-submit' => 'Tukar E-mel',
'changeemail-cancel' => 'Batalkan',
+# Special:ResetTokens
+'resettokens' => 'Set semula token',
+'resettokens-text' => 'Anda boleh mengeset semula token yang membolehkan akses kepada data peribadi tertentu yang berkaitan dengan akaun anda di sini.
+
+Anda harus melakukannya jika anda tanpa sengaja mengongsinya dengan sesiapa ataupun akaun anda telah dikompromi.',
+'resettokens-no-tokens' => 'Tiada token untuk diset semula.',
+'resettokens-legend' => 'Set semula token',
+'resettokens-tokens' => 'Token:',
+'resettokens-token-label' => '$1 (nilai semasa: $2)',
+'resettokens-watchlist-token' => 'Token untuk suapan sesawang (Atom/RSS) bagi [[Special:Watchlist|perubahan pada halaman dalam senarai pantau anda]]',
+'resettokens-done' => 'Token diset semula.',
+'resettokens-resetbutton' => 'Set semula token terpilih',
+
# Edit page toolbar
'bold_sample' => 'Teks tebal',
'bold_tip' => 'Teks tebal',
@@ -954,11 +1017,14 @@ Log penghapusan bagi laman ini dilampirkan di bawah untuk rujukan.',
'edit-gone-missing' => 'Laman tersebut telah dihapuskan dan tidak dapat dikemaskinikan.',
'edit-conflict' => 'Percanggahan penyuntingan.',
'edit-no-change' => 'Suntingan anda diabaikan kerana tiada perubahan dibuat pada teks tersebut.',
+'postedit-confirmation' => 'Suntingan anda telah disimpan.',
'edit-already-exists' => 'Tidak dapat mencipta laman baru kerana ia telah wujud.',
'defaultmessagetext' => 'Teks mesej asal',
'content-failed-to-parse' => 'Kandungan $2 tidak dapat dihuraikan untuk model $1: $3',
'invalid-content-data' => 'Data kandungan tidak sah',
'content-not-allowed-here' => 'Kandungan "$1" tidak dibenarkan di halaman [[$2]]',
+'editwarning-warning' => 'Meninggalkan laman ini mungkin akan menyebabkan sebarang perubahan yang telah anda lakukan hilang.
+Jika anda sudah log masuk, anda boleh melumpuhkan amaran ini di bahagian "Menyunting" dalam keutamaan anda.',
# Content models
'content-model-wikitext' => 'wikiteks',
@@ -993,6 +1059,7 @@ Argumen-argumen ini telah ditinggalkan.',
'undo-failure' => 'Suntingan tersebut tidak boleh dibatalkan kerana terdapat suntingan pertengahan yang bercanggah.',
'undo-norev' => 'Suntingan tersebut tidak boleh dibatalkan kerana tidak wujud atau telah dihapuskan.',
'undo-summary' => 'Membatalkan semakan $1 oleh [[Special:Contributions/$2|$2]] ([[User talk:$2|Perbincangan]])',
+'undo-summary-username-hidden' => 'Buat asal semakan $1 oleh pengguna tersembunyi',
# Account creation failure
'cantcreateaccounttitle' => 'Akaun tidak dapat dibuka',
@@ -1174,6 +1241,7 @@ Sila pastikan bahawa perubahan ini akan mengekalkan kesinambungan sejarah laman.
'compareselectedversions' => 'Bandingkan versi-versi yang dipilih',
'showhideselectedversions' => 'Tunjukkan/sorokkan versi yang dipilih',
'editundo' => 'batal',
+'diff-empty' => '(Tiada perbezaan)',
'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)',
'difference-missing-revision' => '{{PLURAL:$2|Satu semakan|$2 semakan}} bagi perbezaan ini ($1) tidak ditemui.
@@ -1201,7 +1269,6 @@ Butirannya boleh didapati di [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGEN
'searchmenu-legend' => 'Pilihan carian',
'searchmenu-exists' => "* Laman '''[[$1]]'''",
'searchmenu-new' => "'''Cipta laman \"[[:\$1]]\" di wiki ini!'''",
-'searchhelp-url' => 'Help:Kandungan',
'searchmenu-prefix' => '[[Special:PrefixIndex/$1|Senarai laman dengan awalan ini]]',
'searchprofile-articles' => 'Laman kandungan',
'searchprofile-project' => 'Laman bantuan dan projek',
@@ -1243,15 +1310,7 @@ Cuba berikan awalan ''all:'' untuk mencari semua kandungan (termasuk laman perbi
'powersearch-togglenone' => 'Tiada',
'search-external' => 'Carian luar',
'searchdisabled' => 'Ciri pencarian dalam {{SITENAME}} dimatikan. Anda boleh mencari melalui Google. Sila ambil perhatian bahawa indeks dalam Google mungkin bukan yang terkini.',
-
-# Quickbar
-'qbsettings' => 'Bar pantas',
-'qbsettings-none' => 'Tiada',
-'qbsettings-fixedleft' => 'Tetap sebelah kiri',
-'qbsettings-fixedright' => 'Tetap sebelah kanan',
-'qbsettings-floatingleft' => 'Berubah-ubah sebelah kiri',
-'qbsettings-floatingright' => 'Berubah-ubah sebelah kanan',
-'qbsettings-directionality' => 'Tetap, bergantung pada kearahan tulisan bahasa anda',
+'search-error' => 'Berlakunya ralat ketika mencari: $1',
# Preferences page
'preferences' => 'Keutamaan',
@@ -1285,7 +1344,6 @@ Cuba berikan awalan ''all:'' untuk mencari semua kandungan (termasuk laman perbi
'resetprefs' => 'Set semula',
'restoreprefs' => 'Pulihkan semua tetapan asali (dalam semua bahagian)',
'prefs-editing' => 'Menyunting',
-'prefs-edit-boxsize' => 'Saiz kotak sunting.',
'rows' => 'Baris:',
'columns' => 'Lajur:',
'searchresultshead' => 'Cari',
@@ -1296,9 +1354,9 @@ Cuba berikan awalan ''all:'' untuk mencari semua kandungan (termasuk laman perbi
'recentchangesdays-max' => '(had $1 hari)',
'recentchangescount' => 'Bilangan suntingan yang dipaparkan mengikut tetapan asali:',
'prefs-help-recentchangescount' => 'Ini termasuklah perubahan terkini, sejarah laman dan log.',
-'prefs-help-watchlist-token' => 'Mengisi medan ini dengan kunci rahsia akan menghasilkan suapan RSS untuk senarai pantau anda.
-Sesiapa yang mengetahui kunci dalam medan ini akan dapat membaca senarai pantau anda, jadi pilihlah nilai selamat.
-Di sini ada nilai yang dihasilkan secara rawak yang boleh anda guna: $1',
+'prefs-help-watchlist-token2' => 'Inilah kunci rahsia kepada suapan web senarai pantau anda.
+Sesiapa yang mengetahuinya akan boleh membaca senarai pantau anda, jadi jangan kongsinya.
+[[Special:ResetTokens|Klik di sini jika anda perlu mengesetnya semula]].',
'savedprefs' => 'Keutamaan anda disimpan.',
'timezonelegend' => 'Zon waktu:',
'localtime' => 'Waktu tempatan:',
@@ -1329,7 +1387,6 @@ Di sini ada nilai yang dihasilkan secara rawak yang boleh anda guna: $1',
'prefs-reset-intro' => 'Anda boleh menggunakan laman ini untuk menetapkan semula keutamaan anda kepada tetapan asali.
Tindakan ini tidak boleh dibatalkan.',
'prefs-emailconfirm-label' => 'Pengesahan e-mel:',
-'prefs-textboxsize' => 'Saiz tetingkap penyuntingan',
'youremail' => 'E-mel:',
'username' => '{{GENDER:$1|Nama pengguna}}:',
'uid' => 'ID {{GENDER:$1|Pengguna}}:',
@@ -1361,6 +1418,8 @@ Tindakan ini tidak boleh dibatalkan.',
'prefs-dateformat' => 'Format tarikh',
'prefs-timeoffset' => 'Imbangan masa',
'prefs-advancedediting' => 'Pilihan am',
+'prefs-editor' => 'Penyunting',
+'prefs-preview' => 'Pralihat',
'prefs-advancedrc' => 'Pilihan lanjutan',
'prefs-advancedrendering' => 'Pilihan lanjutan',
'prefs-advancedsearchoptions' => 'Pilihan lanjutan',
@@ -1369,6 +1428,7 @@ Tindakan ini tidak boleh dibatalkan.',
'prefs-displaysearchoptions' => 'Pilihan paparan',
'prefs-displaywatchlist' => 'Pilihan paparan',
'prefs-diffs' => 'Beza',
+'prefs-help-prefershttps' => 'Keutamaan inu akan berkuatkuasa pada lain kali anda log masuk.',
# User preference: email validation using jQuery
'email-address-validity-valid' => 'Alamat e-mel adalah sah',
@@ -1396,6 +1456,8 @@ Tindakan ini tidak boleh dibatalkan.',
'userrights-changeable-col' => 'Kumpulan yang anda boleh ubah',
'userrights-unchangeable-col' => 'Kumpulan yang anda tak boleh ubah',
'userrights-irreversible-marker' => '$1*',
+'userrights-conflict' => 'Percanggahan perubahan hak pengguna! Sila semak dan sahkan perubahan anda.',
+'userrights-removed-self' => 'Anda telah berjaya menggugurkan hak-hak sendiri. Oleh yang demikian, anda tidak boleh mengakses halaman ini lagi.',
# Groups
'group' => 'Kumpulan:',
@@ -1461,11 +1523,19 @@ Tindakan ini tidak boleh dibatalkan.',
'right-proxyunbannable' => 'Melangkau sekatan proksi automatik',
'right-unblockself' => 'Menyahsekat diri sendiri',
'right-protect' => 'Mengubah tahap perlindungan serta menyunting halaman yang dilindungi lata',
-'right-editprotected' => 'Menyunting laman yang dilindungi (tanpa perlindungan melata)',
+'right-editprotected' => 'Menyunting halaman-halaman yang dilindungi sebagai "{{int:protect-level-sysop}}"',
+'right-editsemiprotected' => 'Menyunting halaman-halaman yang dilindungi sebagai "{{int:protect-level-autoconfirmed}}"',
'right-editinterface' => 'Menyunting antara muka pengguna',
'right-editusercssjs' => 'Menyunting fail CSS dan JavaScript pengguna lain',
'right-editusercss' => 'Menyunting fail CSS pengguna lain',
'right-edituserjs' => 'Menyunting fail JavaScript pengguna lain',
+'right-editmyusercss' => 'Menyunting fail CSS pengguna sendiri',
+'right-editmyuserjs' => 'Menyunting fail JavaScript pengguna sendiri',
+'right-viewmywatchlist' => 'Melihat senarai pantau sendiri',
+'right-editmywatchlist' => 'Menyunting senarai pantau sendiri. Perhatian: sesetengah tindakan masih akan dapat menambah halaman walaupun tanpa hak ini.',
+'right-viewmyprivateinfo' => 'Melihat data peribadi sendiri (cth. alamat e-mel, nama sebenar)',
+'right-editmyprivateinfo' => 'Menyunting data peribadi sendiri (cth. alamat e-mel, nama sebenar)',
+'right-editmyoptions' => 'Menyunting keutamaan sendiri',
'right-rollback' => 'Mengundurkan suntigan terakhir bagi laman tertentu',
'right-markbotedits' => 'Menanda suntingan yang diundurkan sebagai suntingan bot',
'right-noratelimit' => 'Tidak dikenakan had kadar penyuntingan',
@@ -1527,12 +1597,19 @@ Tindakan ini tidak boleh dibatalkan.',
'action-userrights-interwiki' => 'mengubah hak pengguna dari wiki lain',
'action-siteadmin' => 'mengunci atau membuka kunci pangkalan data wiki ini',
'action-sendemail' => 'menghantar e-mel',
+'action-editmywatchlist' => 'menyunting senarai pantau sendiri',
+'action-viewmywatchlist' => 'melihat senarai pantau sendiri',
+'action-viewmyprivateinfo' => 'melihat maklumat peribadi sendiri',
+'action-editmyprivateinfo' => 'menyunting maklumat peribadi sendiri',
# Recent changes
'nchanges' => '$1 perubahan',
+'enhancedrc-since-last-visit' => '$1 {{PLURAL:$1|sejak lawatan terakhir}}',
+'enhancedrc-history' => 'sejarah',
'recentchanges' => 'Perubahan terkini',
'recentchanges-legend' => 'Pilihan perubahan terkini',
'recentchanges-summary' => 'Jejaki perubahan terkini dalam {{SITENAME}} pada laman ini.',
+'recentchanges-noresult' => 'Tiada perubahan dalam tempoh yang diberikan sepadan dengan kriteria ini.',
'recentchanges-feed-description' => 'Jejaki perubahan terkini dalam {{SITENAME}} pada suapan ini.',
'recentchanges-label-newpage' => 'Suntingan ini mencipta laman baru',
'recentchanges-label-minor' => 'Ini ialah suntingan kecil',
@@ -1571,7 +1648,6 @@ Tindakan ini tidak boleh dibatalkan.',
'recentchangeslinked-feed' => 'Perubahan berkaitan',
'recentchangeslinked-toolbox' => 'Perubahan berkaitan',
'recentchangeslinked-title' => 'Perubahan berkaitan dengan $1',
-'recentchangeslinked-noresult' => 'Tiada perubahan pada semua laman yang dipaut dalam tempoh yang diberikan.',
'recentchangeslinked-summary' => "Laman khas ini menyenaraikan perubahan terkini bagi laman-laman yang dipaut. Laman-laman yang terdapat dalam senarai pantau anda ditandakan dengan '''teks tebal'''.",
'recentchangeslinked-page' => 'Nama laman:',
'recentchangeslinked-to' => 'Paparkan perubahan pada laman yang mengandungi pautan ke laman yang diberikan',
@@ -1582,8 +1658,7 @@ Tindakan ini tidak boleh dibatalkan.',
'reuploaddesc' => 'Kembali ke borang muat naik',
'upload-tryagain' => 'Serahkan keterangan fail yang telah diubah',
'uploadnologin' => 'Belum log masuk',
-'uploadnologintext' => 'Anda perlu [[Special:UserLogin|log masuk]]
-terlebih dahulu untuk memuat naik fail.',
+'uploadnologintext' => 'Anda mesti $1 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',
@@ -1802,7 +1877,6 @@ Untuk keselamatan optimum, img_auth.php telah dilumpuhkan.',
'http-read-error' => 'Ralat baca HTTP.',
'http-timed-out' => 'Permintaan HTTP melebihi waktu tamat.',
'http-curl-error' => 'Ralat mendapatkan URL: $1',
-'http-host-unreachable' => 'URL tidak dapat dicapai.',
'http-bad-status' => 'Berlaku masalah ketika permintaan HTTP: $1 $2',
# Some likely curl errors. More could be added from <http://curl.haxx.se/libcurl/c/libcurl-errors.html>
@@ -1830,6 +1904,10 @@ Untuk keselamatan optimum, img_auth.php telah dilumpuhkan.',
'listfiles_size' => 'Saiz',
'listfiles_description' => 'Keterangan',
'listfiles_count' => 'Versi',
+'listfiles-show-all' => 'Masukkan versi lama imej',
+'listfiles-latestversion' => 'Versi semasa',
+'listfiles-latestversion-yes' => 'Ya',
+'listfiles-latestversion-no' => 'Tidak',
# File description page
'file-anchor-link' => 'Fail',
@@ -1927,6 +2005,13 @@ Mungkin anda ingin menyunting keterangan pada [$2 laman penerangan failnya] di s
'randompage' => 'Laman rawak',
'randompage-nopages' => 'Tiada laman dalam {{PLURAL:$2|ruang|ruang-ruang}} nama berikut: $1.',
+# Random page in category
+'randomincategory' => 'Halaman pilihan rawak dalam kategori',
+'randomincategory-invalidcategory' => '"$1" bukan nama kategori yang sah.',
+'randomincategory-nopages' => 'Tiada halaman di [[:Category:$1]].',
+'randomincategory-selectcategory' => 'Dapatkan halaman pilihan rawak dari kategori: $1 $2.',
+'randomincategory-selectcategory-submit' => 'Pergi',
+
# Random redirect
'randomredirect' => 'Lencongan rawak',
'randomredirect-nopages' => 'Tiada lencongan dalam ruang nama "$1".',
@@ -1952,17 +2037,13 @@ Mungkin anda ingin menyunting keterangan pada [$2 laman penerangan failnya] di s
'statistics-users-active-desc' => 'Pengguna yang aktif sejak {{PLURAL:$1|semalam|$1 hari lalu}}',
'statistics-mostpopular' => 'Laman dilihat terbanyak',
-'disambiguations' => 'Laman-laman yang berpaut dengan laman penyahkekaburan',
-'disambiguationspage' => 'Template:disambig',
-'disambiguations-text' => "Laman-laman berikut mengandungi sekurang-kurangnya satu pautan ke '''laman penyahkekaburan'''.
-Pautan ini sepatutnya ditujukan ke topik yang sepatutnya.<br />
-Sesebuah laman dianggap sebagai laman penyahkekaburan jika ia menggunakan templat yang dipaut dari [[MediaWiki:Disambiguationspage]]",
-
'pageswithprop' => 'Halaman dengan sifat halaman',
'pageswithprop-legend' => 'Halaman dengan sifat halaman',
'pageswithprop-text' => 'Halaman ini menyenaraikan halaman-halaman yang menggunakan sifat halaman yang tertentu.',
'pageswithprop-prop' => 'Nama sifat:',
'pageswithprop-submit' => 'Pergi',
+'pageswithprop-prophidden-long' => 'nilai sifat teks panjang tersorok ($1)',
+'pageswithprop-prophidden-binary' => 'nilai sifat binari tersorok ($1)',
'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.
@@ -2019,6 +2100,7 @@ Masukan yang <del>dipotong</del> telah diselesaikan.',
'mostrevisions' => 'Rencana dengan semakan terbanyak',
'prefixindex' => 'Indeks awalan',
'prefixindex-namespace' => 'Semua laman dengan awalan (ruang nama $1)',
+'prefixindex-strip' => 'Gugurkan awalan dalam senarai',
'shortpages' => 'Laman pendek',
'longpages' => 'Laman panjang',
'deadendpages' => 'Laman buntu',
@@ -2034,6 +2116,7 @@ Masukan yang <del>dipotong</del> telah diselesaikan.',
'listusers' => 'Senarai pengguna',
'listusers-editsonly' => 'Hanya papar pengguna yang telah membuat suntingan',
'listusers-creationsort' => 'Susun mengikut tarikh penciptaan',
+'listusers-desc' => 'Susun dalam turutan menurun',
'usereditcount' => '$1 suntingan',
'usercreated' => '{{GENDER:$3|Dibuat}} pada $1, $2',
'newpages' => 'Laman baru',
@@ -2213,10 +2296,9 @@ Perubahan-perubahan pada halaman ini dan halaman perbualannya pada masa akan dat
'unwatchthispage' => 'Berhenti memantau',
'notanarticle' => 'Bukan laman kandungan',
'notvisiblerev' => 'Semakan ini telah dihapuskan',
-'watchnochange' => 'Tiada perubahan pada laman-laman yang dipantau dalam tempoh yang ditunjukkan.',
'watchlist-details' => '$1 laman dipantau (tidak termasuk laman perbincangan).',
-'wlheader-enotif' => '* Pemberitahuan melalui e-mel diaktifkan.',
-'wlheader-showupdated' => "* Laman-laman yang telah diubah sejak kunjungan terakhir anda dipaparkan dalam '''teks tebal'''",
+'wlheader-enotif' => 'Pemberitahuan melalui e-mel dibolehkan.',
+'wlheader-showupdated' => "Laman-laman yang telah diubah sejak kunjungan terakhir anda dipaparkan dalam '''teks tebal'''.",
'watchmethod-recent' => 'menyemak laman yang dipantau dalam suntingan-suntingan terkini',
'watchmethod-list' => 'menyemak suntingan terkini pada laman-laman yang dipantau',
'watchlistcontains' => 'Terdapat $1 laman dalam senarai pantau anda.',
@@ -2617,14 +2699,12 @@ Sila lihat juga [[Special:BlockList|senarai sekatan]] untuk senarai larangan dan
'ipb_blocked_as_range' => 'Ralat: IP $1 tidak boleh dinyahsekat kerana ia tidak disekat secara langsung. Sebaliknya, ia disekat kerana merupakan sebahagian daripada sekatan julat $2, yang mana boleh dinyahsekat.',
'ip_range_invalid' => 'Julat IP tidak sah.',
'ip_range_toolarge' => 'Sekatan julat yang lebih luas daripada /$1 adalah tidak dibenarkan.',
-'blockme' => 'Sekat saya',
'proxyblocker' => 'Penyekat proksi',
-'proxyblocker-disabled' => 'Fungsi ini dimatikan.',
'proxyblockreason' => 'Alamat IP anda telah disekat kerana ia merupakan proksi terbuka.
Sila hubungi penyedia perkhidmatan Internet anda atau pihak sokongan teknikal dan beritahu mereka mengenai masalah keselamatan yang berat ini.',
-'proxyblocksuccess' => 'Berjaya.',
'sorbsreason' => 'Alamat IP anda telah disenaraikan sebagai proksi terbuka dalam DNSBL yang digunakan oleh {{SITENAME}}.',
'sorbs_create_account_reason' => 'Alamat IP anda telah disenaraikan sebagai proksi terbuka dalam DNSBL yang digunakan oleh {{SITENAME}}. Oleh itu, anda tidak dibenarkan membuka akaun baru.',
+'xffblockreason' => 'Alamat IP yang terdapat dalam pengepala X-Forwarded-For, sama ada milik anda ataupun pelayan proksi yang anda gunakan, telah disekat. Sebab asal sekatan adalah: $1',
'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.',
@@ -2793,6 +2873,7 @@ Sila lawat [//www.mediawiki.org/wiki/Localisation Penyetempatan MediaWiki] dan [
'thumbnail-more' => 'Besarkan',
'filemissing' => 'Fail hilang',
'thumbnail_error' => 'Berlaku ralat ketika mencipta gambar kenit: $1',
+'thumbnail_error_remote' => 'Mesej ralat dari $1: $2',
'djvu_page_error' => 'Laman DjVu di luar julat',
'djvu_no_xml' => 'Gagal mendapatkan data XML bagi fail DjVu',
'thumbnail-temp-create' => 'Fail gambar kenit sementara tidak dapat dibuat',
@@ -2941,19 +3022,11 @@ Simpan dalam komputer anda dan muat naiknya di sini.',
# Stylesheets
'common.css' => '/* CSS yang terletak di sini akan digunakan pada semua kulit */',
-'standard.css' => '/* CSS yang terletak di sini akan mempengaruhi pengguna kulit Klasik */',
-'nostalgia.css' => '/* CSS yang terletak di sini akan mempengaruhi pengguna kulit Nostalgia */',
'cologneblue.css' => '/* CSS yang terletak di sini akan mempengaruhi pengguna kulit Cologne Blue */',
'monobook.css' => '/* CSS yang terletak di sini akan mempengaruhi pengguna kulit Monobook */',
-'myskin.css' => '/* CSS yang terletak di sini akan mempengaruhi pengguna kulit MySkin */',
-'chick.css' => '/* CSS yang terletak di sini akan mempengaruhi pengguna kulit Chick */',
-'simple.css' => '/* CSS yang terletak di sini akan mempengaruhi pengguna kulit Ringkas */',
'modern.css' => '/* CSS yang terletak di sini akan mempengaruhi pengguna kulit Moden */',
'vector.css' => '/* CSS yang terletak di sini akan mempengaruhi pengguna kulit Vector */',
-# Scripts
-'nostalgia.js' => '/* Sebarang unsur JavaScript di sini akan dimuatkan untuk pengguna yang memakaikan kulit Nostalgia */',
-
# Metadata
'notacceptable' => 'Pelayan wiki ini tidak mampu menyediakan data dalam format yang boleh dibaca oleh pelanggan anda.',
@@ -3025,13 +3098,8 @@ Simpan dalam komputer anda dan muat naiknya di sini.',
'pageinfo-category-files' => 'Bilangan fail',
# Skin names
-'skinname-standard' => 'Klasik',
-'skinname-nostalgia' => 'Nostalgia',
'skinname-cologneblue' => 'Cologne Blue',
'skinname-monobook' => 'MonoBook',
-'skinname-myskin' => 'MySkin',
-'skinname-chick' => 'Chick',
-'skinname-simple' => 'Ringkas',
'skinname-modern' => 'Moden',
'skinname-vector' => 'Vector',
@@ -3114,11 +3182,25 @@ Dengan menjalankannya, komputer anda mungkin akan terjejas.",
'minutes' => '$1 minit',
'hours' => '$1 jam',
'days' => '$1 hari',
+'weeks' => '$1 minggu',
'months' => '$1 bulan',
'years' => '$1 tahun',
'ago' => '$1 yang lalu',
'just-now' => 'tadi',
+# Human-readable timestamps
+'hours-ago' => '$1 jam yang lalu',
+'minutes-ago' => '$1 minit yang lalu',
+'seconds-ago' => '$1 saat yang lalu',
+'monday-at' => 'Isnin $1',
+'tuesday-at' => 'Selasa $1',
+'wednesday-at' => 'Rabu $1',
+'thursday-at' => 'Khamis $1',
+'friday-at' => 'Jumaat $1',
+'saturday-at' => 'Sabtu $1',
+'sunday-at' => 'Ahad $1',
+'yesterday-at' => 'Semalam $1',
+
# Bad image list
'bad_image_list' => 'Berikut adalah format yang digunakan:
@@ -3146,7 +3228,7 @@ Ruangan-ruangan yang lain pula akan disembunyikan pada asali.
* gpslongitude
* gpsaltitude',
-# EXIF tags
+# Exif tags
'exif-imagewidth' => 'Lebar',
'exif-imagelength' => 'Tinggi',
'exif-bitspersample' => 'Bit sekomponen',
@@ -3324,7 +3406,7 @@ Ruangan-ruangan yang lain pula akan disembunyikan pada asali.
'exif-originalimageheight' => 'Ketinggian imej sebelum dipangkas',
'exif-originalimagewidth' => 'Lebar imej sebelum dipangkas',
-# EXIF attributes
+# Exif attributes
'exif-compression-1' => 'Tak termampat',
'exif-compression-2' => 'Pengekodan panjang jalan Huffman Terubahsuai 1-Dimensi Kumpulan 3 CCITT',
'exif-compression-3' => 'Pengekodan faks Kumpulan 3 CCITT',
@@ -3722,7 +3804,6 @@ Anda juga boleh [[Special:EditWatchlist|menggunakan penyunting piawai]].',
'version-other' => 'Lain-lain',
'version-mediahandlers' => 'Pengelola media',
'version-hooks' => 'Penyangkuk',
-'version-extension-functions' => 'Fungsi penyambung',
'version-parser-extensiontags' => 'Tag penyambung penghurai',
'version-parser-function-hooks' => 'Penyangkuk fungsi penghurai',
'version-hook-name' => 'Nama penyangkuk',
@@ -3731,6 +3812,7 @@ Anda juga boleh [[Special:EditWatchlist|menggunakan penyunting piawai]].',
'version-license' => 'Lesen',
'version-poweredby-credits' => "Wiki ini dikuasakan oleh '''[//www.mediawiki.org/ MediaWiki]''', hak cipta © 2001-$1 $2.",
'version-poweredby-others' => 'penyumbang-penyumbang lain',
+'version-poweredby-translators' => 'para penterjemah translatewiki.net',
'version-credits-summary' => 'Kami ingin mengucapkan sekalung budi kepada mereka yang berikut atas sumbangan mereka keada [[Special:Version|MediaWiki]].',
'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.
@@ -3746,12 +3828,17 @@ Anda patut telah menerima [{{SERVER}}{{SCRIPTPATH}}/COPYING sebuah salinan bagi
'version-entrypoints-articlepath' => '[https://www.mediawiki.org/wiki/Manual:$wgArticlePath Laluan rencana]',
'version-entrypoints-scriptpath' => '[https://www.mediawiki.org/wiki/Manual:$wgScriptPath Laluan skrip]',
-# Special:FilePath
-'filepath' => 'Laluan fail',
-'filepath-page' => 'Fail:',
-'filepath-submit' => 'Pergi',
-'filepath-summary' => 'Laman khas ini mengembalikan laluan penuh bagi sesebuah fail.
-Imej ditunjuk dalam leraian penuh, jenis fail yang lain dibuka dengan atur cara yang berkenaan secara terus.',
+# Special:Redirect
+'redirect' => 'Lencongkan mengikut fail, ID pengguna atau ID semakan',
+'redirect-legend' => 'Lencongkan ke fail atau halaman',
+'redirect-summary' => 'Halaman khas ini melencong kepada fail (dengan nama fail), halaman (dengan ID semakan) atau halaman pengguna (dengan ID pengguna berangka).',
+'redirect-submit' => 'Pergi',
+'redirect-lookup' => 'Cari:',
+'redirect-value' => 'Nilai:',
+'redirect-user' => 'ID Pengguna',
+'redirect-revision' => 'Semakan halaman',
+'redirect-file' => 'Nama fail',
+'redirect-not-exists' => 'Nilai tidak dijumpai',
# Special:FileDuplicateSearch
'fileduplicatesearch' => 'Cari fail serupa',
@@ -3801,6 +3888,7 @@ Imej ditunjuk dalam leraian penuh, jenis fail yang lain dibuka dengan atur cara
'tags' => 'Label perubahan yang sah',
'tag-filter' => 'Tapis [[Special:Tags|label]]:',
'tag-filter-submit' => 'Tapis',
+'tag-list-wrapper' => '([[Special:Tags|{{PLURAL:$1|Teg}}]]: $2)',
'tags-title' => 'Label',
'tags-intro' => 'Yang berikut ialah senarai label yang digunakan untuk menanda suntingan, berserta maknanya.',
'tags-tag' => 'Nama label',
@@ -3827,6 +3915,7 @@ Imej ditunjuk dalam leraian penuh, jenis fail yang lain dibuka dengan atur cara
'dberr-problems' => 'Harap maaf. Tapak web ini dilanda masalah teknikal.',
'dberr-again' => 'Cuba tunggu selama beberapa minit dan muat semula.',
'dberr-info' => '(Tidak dapat menghubungi pelayan pangkalan data: $1)',
+'dberr-info-hidden' => '(Pelayan pangkalan data tidak dapat dihubungi)',
'dberr-usegoogle' => 'Buat masa ini, anda boleh cuba mencari melalui Google.',
'dberr-outofdate' => 'Sila ambil perhatian bahawa indeks mereka bagi kandungan kami mungkin sudah ketinggalan zaman.',
'dberr-cachederror' => 'Yang berikut ialah salinan bagi laman yang diminta yang diambil daripada cache, dan mungkin bukan yang terkini.',
@@ -3842,6 +3931,9 @@ Imej ditunjuk dalam leraian penuh, jenis fail yang lain dibuka dengan atur cara
'htmlform-submit' => 'Hantar',
'htmlform-reset' => 'Undur perubahan',
'htmlform-selectorother-other' => 'Lain-lain',
+'htmlform-no' => 'Tidak',
+'htmlform-yes' => 'Ya',
+'htmlform-chosen-placeholder' => 'Pilih satu pilihan',
# SQLite database support
'sqlite-has-fts' => '$1 dengan sokongan carian teks penuh',
@@ -3959,4 +4051,19 @@ Ataupun, anda boleh menggunakan borang yang mudah di bawah. Ulasan anda akan dic
# Image rotation
'rotate-comment' => 'Imej diputar sebanyak $1 {{PLURAL:$1|darjah|darjah}} mengikut arah jam',
+# Limit report
+'limitreport-title' => 'Data pemprofilan penghurai:',
+'limitreport-cputime' => 'Penggunaan masa CPU',
+'limitreport-cputime-value' => '$1 saat',
+'limitreport-walltime' => 'Penggunaan masa nyata',
+'limitreport-walltime-value' => '$1 saat',
+'limitreport-ppvisitednodes' => 'Kiraan nod kunjungan pempraproses',
+'limitreport-ppgeneratednodes' => 'Kiraan nod hasilan pempraproses',
+'limitreport-postexpandincludesize' => 'Saiz selepas peluasan',
+'limitreport-postexpandincludesize-value' => '$1/$2 {{PLURAL:$2|bait}}',
+'limitreport-templateargumentsize' => 'Saiz parameter templat',
+'limitreport-templateargumentsize-value' => '$1/$2 {{PLURAL:$2|bait}}',
+'limitreport-expansiondepth' => 'Kedalaman peluasan terjauh',
+'limitreport-expensivefunctioncount' => 'Kiraan fungsi penghurai muatan tinggi',
+
);
diff --git a/languages/messages/MessagesMt.php b/languages/messages/MessagesMt.php
index 7478ac75..f1d67a78 100644
--- a/languages/messages/MessagesMt.php
+++ b/languages/messages/MessagesMt.php
@@ -302,9 +302,6 @@ $messages = array(
'tog-shownumberswatching' => "Uri n-numru ta' utenti li qegħdin isegwu din il-paġna",
'tog-oldsig' => 'Firma attwali:',
'tog-fancysig' => 'Interpreta l-firma bħala test tal-wiki (mingħajr ħolqa awtomatika)',
-'tog-externaleditor' => 'Uża awtomatikament editur estern (għal utenti esperti biss, hemm bżonn preferenzi speċjali fuq il-komputer tiegħek. [//www.mediawiki.org/wiki/Manual:External_editors Iktar informazzjoni.])',
-'tog-externaldiff' => 'Uża awtomatikament diff estern (għal utenti esperti biss, hemm bżonn preferenzi speċjali fuq il-komputer tiegħek. [//www.mediawiki.org/wiki/Manual:External_editors Iktar informazzjoni.])',
-'tog-showjumplinks' => 'Attiva l-ħoloq aċċessibbli "aqbeż għal"',
'tog-uselivepreview' => "Attiva l-funzjoni ''Live preview'' (bżonn tal-JavaScript; sperimentali)",
'tog-forceeditsummary' => 'Nebbaħni meta ndaħħal taqsira tal-modifika vojta',
'tog-watchlisthideown' => "Aħbi l-modifiki tiegħi mil-lista ta' osservazzjoni",
@@ -317,6 +314,8 @@ $messages = array(
'tog-diffonly' => 'Turiex kontenut tal-paġni wara li tkun għamilt paragun bejn il-verżjonijiet',
'tog-showhiddencats' => 'Uri kategoriji moħbija',
'tog-norollbackdiff' => "Turix il-paragun bejn il-verżjonijiet wara li tkun effettwajt ir-''rollback''",
+'tog-useeditwarning' => "Avżani kull meta nħalli paġna ta' modifika b'modifiki li għadhom ma ġewx salvati",
+'tog-prefershttps' => 'Dejjem uża l-konnessjoni sigura meta tidħol fil-kont',
'underline-always' => 'Dejjem',
'underline-never' => 'Qatt',
@@ -380,6 +379,18 @@ $messages = array(
'oct' => 'Ott',
'nov' => 'Nov',
'dec' => 'Diċ',
+'january-date' => "$1 ta' Jannar",
+'february-date' => "$1 ta' Frar",
+'march-date' => "$1 ta' Marzu",
+'april-date' => "$1 ta' April",
+'may-date' => "$1 ta' Mejju",
+'june-date' => "$1 ta' Ä unju",
+'july-date' => "$1 ta' Lulju",
+'august-date' => "$1 ta' Awwissu",
+'september-date' => "$1 ta' Settembru",
+'october-date' => "$1 ta' Ottubru",
+'november-date' => "$1 ta' Novembru",
+'december-date' => "$1 ta' Diċembru",
# Categories related messages
'pagecategories' => '{{PLURAL:$1|Kategorija|Kategoriji}}',
@@ -400,7 +411,7 @@ $messages = array(
'noindex-category' => 'Paġni mhux indiċizzati',
'broken-file-category' => "Paġni b'ħoloq lejn fajls miksura",
-'linkprefix' => '/^(.*?)([a-żA-Ż\\x80-\\xff]+)$/sD',
+'linkprefix' => '/^((?>.*(?<![a-żA-Ż\\x80-\\xff])))(.+)$/sD',
'about' => 'Dwar',
'article' => 'artiklu',
@@ -463,6 +474,7 @@ $messages = array(
'create-this-page' => 'Oħloq din il-paġna',
'delete' => 'Ħassar',
'deletethispage' => 'Ħassar din il-paġna',
+'undeletethispage' => 'irkupra din il-paġna',
'undelete_short' => 'Irkupra {{PLURAL:$1|modifika waħda|$1 modifiki}}',
'viewdeleted_short' => 'Ara {{PLURAL:$1|modifika mħassra|$1 modifiki mħassra}}',
'protect' => 'Ipproteġi',
@@ -505,7 +517,7 @@ $1",
'pool-queuefull' => "Il-kju tal-''pool'' hi mimlija",
'pool-errorunknown' => 'Problema mhux magħrufa',
-# 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).
+# 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).
'aboutsite' => 'Dwar {{SITENAME}}',
'aboutpage' => 'Project:Dwar',
'copyright' => 'Kontenut aċċessibli taħt $1.',
@@ -515,7 +527,6 @@ $1",
'disclaimers' => 'Ċaħdiet',
'disclaimerpage' => 'Project:Ċaħda ġenerali',
'edithelp' => 'Gwida',
-'edithelppage' => 'Help:Kif Timmodifika',
'helppage' => 'Help:Kontenut',
'mainpage' => 'Il-Paġna prinċipali',
'mainpage-description' => 'Il-Paġna prinċipali',
@@ -591,17 +602,6 @@ Lista ta' paġni speċjali validi tinsab hawn [[Special:SpecialPages|{{int:speci
# General errors
'error' => 'Problema',
'databaseerror' => 'Problema fid-database',
-'dberrortext' => 'Kien hemm żball fis-sintassi ta\' rikjesta tad-databażi.
-Dan jista\' jindika li hemm problema fis-softwer.
-L-aħħar attentat ta\' rikjesta tad-databażi kienet:
-<blockquote><tt>$1</tt></blockquote>
-mill-funzjoni ta\' "<tt>$2</tt>".
-Id-databażi tat problema ta\' "<tt>$3: $4</tt>".',
-'dberrortextcl' => 'Kien hemm żball fis-sintassi ta\' rikjesta tad-databażi.
-L-aħħar attentat ta\' rikjesta tad-databażi kienet:
-"$1"
-mill-funzjoni "$2".
-Id-databażi tat il-problema segwenti "$3: $4"',
'laggedslavemode' => "Twissija: Il-Paġna jista' ma jkollhiex l-affarijiet aġġornati.",
'readonly' => 'Database magħluq',
'enterlockreason' => "Daħħal raġuni għala qiegħed tagħlqu, inkludi l-istima ta' meta l-għeluq se tieħu effett",
@@ -650,7 +650,6 @@ Jekk jogħġbok erġa' prova fi ftit minuti oħra.",
'viewyourtext' => "Tista' tara u tikkopja s-sors tal-'''modifiki tiegħek''' fuq din il-paġna:",
'protectedinterface' => 'Din il-paġna għanda element li tagħmel parti mill-interfaċċa tal-utent tas-software, u għaldaqstant ġiet protetta sabiex ma jkunx hemm abbuż.',
'editinginterface' => "'''Avviż:''' Qiegħed tagħmel modifiki lejn paġna li qegħdha tintuża biex tipprovdi interfaċċa għall-messaġġi tas-software. Kull modifika f'din il-paġna se taffetwa l-apparenza tal-faċċata tal-utenti kollha. Għat-traduzzjonijiet, ikkunsidra l-possibilità li tuża' [//translatewiki.net/wiki/Main_Page?setlang=mt translatewiki.net], il-proġett MediaWiki għal-lokalizzazzjoni.",
-'sqlhidden' => '(SQL rikjesta moħbija)',
'cascadeprotected' => 'Din il-paġna ġiet protetta mill-modifiki, minħabba li tinkludi {{PLURAL:$1|paġni, li huwa|paġni, li huma}} protetti bil-preferenza tal-"kaskata" mixewla:
$2',
'namespaceprotected' => "Inti m'għandhekx il-permess li timodifika paġni fin-''namespace'' '''$1''.",
@@ -671,10 +670,17 @@ Ir-raġuni li ġiet mogħtija kienet ''$2''.",
Tista' tkompli tuża' {{SITENAME}} bħala utent anonimu, jew tista' terġa <span class='plainlinks'>[$1 tidħol]</span> bħala l-istess utent jew wieħed differenti.
Kun af li ċerti paġni jistgħu jkomplu jidhru bħallikieku l-illogjar 'l barra mill-kont qatt ma seħħ, sakemm ma tħassarx il-cache tal-browser.",
'yourname' => 'Isem tal-utent:',
+'userlogin-yourname' => 'Isem tal-utent',
+'userlogin-yourname-ph' => 'Daħħal l-isem tal-utent tiegħek',
'yourpassword' => 'Password:',
+'userlogin-yourpassword' => 'Password',
+'userlogin-yourpassword-ph' => 'Daħħal il-password tiegħek',
'yourpasswordagain' => "Erġa' ikteb il-password:",
+'createacct-yourpasswordagain' => 'Ikkonferma l-password',
+'createacct-yourpasswordagain-ph' => "Erġa' daħħal il-password",
'remembermypassword' => "Ftakar il-login tiegħi fuq dan il-kompjuter (għal massimu ta' {{PLURAL:$1|ġurnata|$1 ġurnata}})",
-'securelogin-stick-https' => "Ibqa' konness fuq l-HTTPS wara l-login",
+'userlogin-remembermypassword' => 'Żommni fil-kont',
+'userlogin-signwithsecure' => 'Uża konnessjoni sigura',
'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',
@@ -685,17 +691,37 @@ Kun af li ċerti paġni jistgħu jkomplu jidhru bħallikieku l-illogjar 'l barra
'logout' => 'Oħroġ',
'userlogout' => 'oħroġ',
'notloggedin' => 'Għadek ma dħaltx ġewwa',
+'userlogin-noaccount' => "M'għandekx kont?",
+'userlogin-joinproject' => 'Irreġistra fuq {{SITENAME}}',
'nologin' => "Għad m'għandekx kont? '''$1'''.",
'nologinlink' => 'Oħloq kont',
'createaccount' => 'Oħloq kont',
'gotaccount' => "Diġa għandhek kont? '''$1'''.",
'gotaccountlink' => 'Idħol',
'userlogin-resetlink' => 'Insejt kif tidħol fil-kont tiegħek?',
+'userlogin-resetpassword-link' => 'Irrisettja l-password',
+'helplogin-url' => 'Help:Kif tirreġistra',
+'userlogin-helplink' => '[[{{MediaWiki:helplogin-url}}|Għajnuna kif tillogja]]',
+'createacct-join' => 'Daħħal l-informazzjoni tiegħek hawn taħt.',
+'createacct-emailrequired' => 'Indirizz elettroniku',
+'createacct-emailoptional' => 'Indirizz elettroniku (fakultattiv)',
+'createacct-email-ph' => 'Daħħal l-indirizz elettroniku tiegħek',
'createaccountmail' => 'Uża password każwali temporanja u ibgħatha fuq l-indirizz elettroniku mniżżel hawn taħt',
+'createacct-realname' => 'Isem proprju (fakultattiv)',
'createaccountreason' => 'Raġuni:',
+'createacct-reason' => 'Raġuni',
+'createacct-reason-ph' => 'Għala qiegħed toħloq kont ġdid',
+'createacct-captcha' => 'Kontroll tas-sigurtà',
+'createacct-imgcaptcha-ph' => 'Daħħal it-test li qed tara hawn fuq',
+'createacct-submit' => 'Oħloq il-kont',
+'createacct-benefit-heading' => '{{SITENAME}} hi magħmula minn persuni bħalek.',
+'createacct-benefit-body1' => '{{PLURAL:$1|modifika|modifiki}}',
+'createacct-benefit-body2' => 'paġna',
+'createacct-benefit-body3' => '{{PLURAL:$1|kontributur|kontributuri}} riċenti',
'badretype' => 'Il-passwords li daħħalt ma jaqblux.',
'userexists' => 'L-isem tal-utent li daħħalt diġà meħud. Jekk jogħġbok, agħżel isem differenti.',
'loginerror' => 'Problemi fil-login',
+'createacct-error' => 'Problema fil-ħolqien tal-kont',
'createaccounterror' => 'Il-kont ma jistax jinħoloq: $1',
'nocookiesnew' => "Il-Kont tal-utent għal l-aċċess ġie maħluq, però ma kienx possibli li tagħmel aċċess għal {{SITENAME}} għax il-''cookies'' huma disattivati. Erġa' prova l-aċċess bl-isem tal-utent u l-password wara li tkun attivajt il-''cookies'' tal-''browser''.",
'nocookieslogin' => "L-aċċess għal {{SITENAME}} jagħmel użu minn ''cookies'', li bħalissa huma disattivati. Jekk jogħġbok erġa' prova idħol wara li tkun attivajt il-''cookies'' fil-browser.",
@@ -771,7 +797,7 @@ Biex tkompli l-aÄ‹Ä‹ess tal-kont tiegħek huwa neÄ‹essarju li toħloq password Ä
'newpassword' => 'Password Ä¡dida:',
'retypenew' => "Erġa' ikteb il-password il-ġdida:",
'resetpass_submit' => 'Issettja l-password u idħol fis-sit',
-'resetpass_success' => 'Il-password ġie modifikat. Aċċess fil-proċess...',
+'changepassword-success' => 'Il-password ġie modifikat. Aċċess fil-proċess...',
'resetpass_forbidden' => 'Mhuwiex possibbli li timmodifika l-passwords',
'resetpass-no-info' => 'Trid tkun effetwajt il-login qabel ma taċċessa direttament din il-paġna.',
'resetpass-submit-loggedin' => 'Biddel il-password',
@@ -782,10 +808,9 @@ Jista' jkun li int diġà biddilt il-password, jew għamilt rikjesta għal passw
# Special:PasswordReset
'passwordreset' => 'Irrisettja l-password',
-'passwordreset-text' => 'Imla din il-formola sabiex tirċievi notifikazzjoni permezz tal-posta elettronika tad-dettalji tal-kont tiegħek.',
+'passwordreset-text-one' => 'Imla din il-formola sabiex tirrisettja l-password.',
'passwordreset-legend' => 'Irrisettja l-password',
'passwordreset-disabled' => 'L-irrisettjar tal-password fuq din il-wiki ġie diżattivat.',
-'passwordreset-pretext' => "{{PLURAL:$1||Daħħal wieħed mill-biċċiet ta' informazzjoni t'hawn taħt}}",
'passwordreset-username' => 'Isem tal-utent:',
'passwordreset-domain' => 'Dominju:',
'passwordreset-capture' => 'Ara l-kontenut tal-messaġġ?',
@@ -1015,8 +1040,10 @@ Ma ngħatat l-ebda spjegazzjoni.",
Jidher li din ġiet imħassra.',
'edit-conflict' => 'Kunflitt tal-editjar.',
'edit-no-change' => 'Il-modifika li għamilt ġiet injorata, minħabba li ebda bidla ma saret lejn it-test.',
+'postedit-confirmation' => 'Il-modifika tiegħek ġiet salvata.',
'edit-already-exists' => 'Ma tistax tinħoloq din il-paġna.
Din teżisti diġà.',
+'editwarning-warning' => 'Jekk tħalli din il-paġna jista\' jwassal sabiex titlef kwalunkwe tibdil li tkun għamilt. Jekk int tinsab fil-kont tiegħek, tista\' tneħħi dan l-avviż fis-sezzjoni "Modifiki" tal-preferenzi tiegħek.',
# Content models
'content-model-wikitext' => 'test tal-wiki',
@@ -1243,7 +1270,6 @@ Nota li l-użu tal-links tan-navigazzjoni jagħmel reset tal-kolonna.",
'searchmenu-legend' => 'Preferenzi għat-tfittxija',
'searchmenu-exists' => "'''Hemm paġna bl-isem ta' \"[[:\$1]]\" fuq din il-wiki'''",
'searchmenu-new' => "'''Oħloq il-paġna \"[[:\$1]]\" fuq din il-wiki!'''",
-'searchhelp-url' => 'Help:Kontenut',
'searchmenu-prefix' => "[[Special:PrefixIndex/$1|Uri l-paġni b'dan il-prefiss]]",
'searchprofile-articles' => "Paġni ta' kontenut",
'searchprofile-project' => "Paġni ta' għajnuna u ta' proġett",
@@ -1288,15 +1314,6 @@ Ipprova għamel prefiss għall-inkjesta tiegħek ma' ''all:'' sabiex tfittex il-
Sadanittant, tista' tipprova tfittex bil-Google.
Innota però li l-werreja tal-kontenut ta' {{SITENAME}} f'dawn is-siti, jistgħu ma jkunux aġġornati.",
-# Quickbar
-'qbsettings' => "''Quickbar''",
-'qbsettings-none' => 'Xejn',
-'qbsettings-fixedleft' => 'Mehmuż fix-xellug',
-'qbsettings-fixedright' => 'Mehmuż fil-lemin',
-'qbsettings-floatingleft' => "''Floating'' lejn ix-xellug",
-'qbsettings-floatingright' => "''Floating'' lejn il-lemin",
-'qbsettings-directionality' => 'Fiss, skont id-direzzjoni tat-test fil-lingwa tiegħek',
-
# Preferences page
'preferences' => 'Preferenzi',
'mypreferences' => 'Preferenzi',
@@ -1328,7 +1345,6 @@ Innota però li l-werreja tal-kontenut ta' {{SITENAME}} f'dawn is-siti, jistgħu
'resetprefs' => 'Neħħi modifiki mhux salvati',
'restoreprefs' => 'Irkupra l-impostazzjonijiet awtomatiċi',
'prefs-editing' => 'Modifiki',
-'prefs-edit-boxsize' => 'Daqs tat-tieqa tal-immodifikar.',
'rows' => 'Fillieri:',
'columns' => 'Kolonni:',
'searchresultshead' => 'Fittex',
@@ -1339,9 +1355,6 @@ Innota però li l-werreja tal-kontenut ta' {{SITENAME}} f'dawn is-siti, jistgħu
'recentchangesdays-max' => "(massimu ta' $1 {{PLURAL:$1|Ä¡urnata|Ä¡urnata}})",
'recentchangescount' => "Numru ta' fillieri fit-tibdil riċenti:",
'prefs-help-recentchangescount' => 'Din tinkludi tibdil riċenti, kronoloġiji u reġistri.',
-'prefs-help-watchlist-token' => "Billi timla din il-kaxxa b'ċavetta sigrieta se tiġi ġenerata feed RSS għal-lista ta' osservazzjonijiet tiegħek.
-Kull minn jaf din iċ-ċavetta f'din il-kaxxa jkun jista' jaqra l-lista ta' osservazzjonijiet tiegħek, għalhekk għażel waħda sigura.
-Hawnhekk hawn valur iġġenerat b'mod każwali li inti tista' tuża: $1",
'savedprefs' => 'Il-preferenzi tiegħek ġew salvati.',
'timezonelegend' => 'Żona tal-ħin:',
'localtime' => 'Ħin lokali:',
@@ -1371,7 +1384,6 @@ Hawnhekk hawn valur iġġenerat b'mod każwali li inti tista' tuża: $1",
'prefs-common-css-js' => 'CSS/JS maqsum għal kull aspett grafiku:',
'prefs-reset-intro' => "Inti tista' tuża' din il-paġna sabiex terġa' tbiddel il-preferenzi tiegħek għal dawk li ngħatawlek fil-bidu. Din l-operazzjoni hija definittiva u ma tistax tiġi mħassra.",
'prefs-emailconfirm-label' => 'Konferma tal-ittra-e:',
-'prefs-textboxsize' => 'Daqs tat-tieqa tal-modifika',
'youremail' => 'E-mail:',
'username' => '{{GENDER:$1|Isem tal-utent}}:',
'uid' => '{{GENDER:$1|ID tal-utent}}:',
@@ -1402,6 +1414,8 @@ Hawnhekk hawn valur iġġenerat b'mod każwali li inti tista' tuża: $1",
'prefs-dateformat' => 'Format tad-data',
'prefs-timeoffset' => 'Differenza fis-sigħat',
'prefs-advancedediting' => 'Opzjonijiet avvanzati',
+'prefs-editor' => 'Editur',
+'prefs-preview' => 'Dehra proviżorja',
'prefs-advancedrc' => 'Opzjonijiet avvanzati',
'prefs-advancedrendering' => 'Opzjonijiet avvanzati',
'prefs-advancedsearchoptions' => 'Opzjonijiet avvanzati',
@@ -1608,7 +1622,6 @@ Hawnhekk hawn valur iġġenerat b'mod każwali li inti tista' tuża: $1",
'recentchangeslinked-feed' => 'Tibdil relatat',
'recentchangeslinked-toolbox' => 'Tibdil relatat',
'recentchangeslinked-title' => 'Modifiki relatati ma\' "$1"',
-'recentchangeslinked-noresult' => 'L-ebda modifika ma saret fuq il-paġni relatati waqt il-perjodu speċifikat.',
'recentchangeslinked-summary' => "Din hija lista ta' bidliet li saru riċentament fuq paġni marbuta minn paġna speċifika (jew lejn membri ta' kategorija speċifika). Il-paġni fuq il-[[Special:Watchlist|lista ta' osservazzjoni]] tiegħek huma mmarkati b''''tipa ħoxna'''.",
'recentchangeslinked-page' => 'Isem tal-paġna:',
'recentchangeslinked-to' => "Minflok, uri t-tibdiliet fil-paġni llinkjati ma' dik speċifikata",
@@ -1806,7 +1819,6 @@ Għal sigurtà ottimali, img_auth.php hija diżattivata.",
'http-read-error' => 'Żball fil-qari HTTP.',
'http-timed-out' => 'Rikjesta HTTP skaduta.',
'http-curl-error' => 'Żball fil-kisba tal-URL: $1',
-'http-host-unreachable' => 'Il-URL ma setgħetx tintlaħaq.',
'http-bad-status' => 'Kien hemm problema matul ir-rikjesta HTTP: $1 $2',
# Some likely curl errors. More could be added from <http://curl.haxx.se/libcurl/c/libcurl-errors.html>
@@ -1955,12 +1967,6 @@ Daħħal: tip/sottotip, eż. <code>image/jpeg</code>.",
'statistics-users-active-desc' => 'Utenti li wettqu azzjoni fl-aħħar {{PLURAL:$1|ġurnata|$1 ġurnata}}',
'statistics-mostpopular' => 'Il-paġni l-aktar miżjura',
-'disambiguations' => "Paġni li jorbtu lejn paġni ta' diżambigwazzjoni",
-'disambiguationspage' => 'Template:diżambig',
-'disambiguations-text' => "Il-paġni segwenti għandhom minn tal-inqas ħolqa waħda lejn '''paġna ta' diżambigwazzjoni'''.
-Dawn probabbilment għandhom jippuntaw lejn l-paġna t-tajba minflok.<br />
-Paġna tiġi stmata bħala paġna ta' diżambigwazzjoni jekk tuża' mudell fil-lista li tinsab fuq [[MediaWiki:Disambiguationspage]].",
-
'pageswithprop' => "Paġni bi proprjetà ta' paġna",
'pageswithprop-legend' => "Paġni bi proprjetà ta' paġna",
'pageswithprop-text' => "Din il-paġna telenka paġni li jużaw proprjetà ta' paġna partikulari.",
@@ -2211,10 +2217,9 @@ Kwalunkwe modifika li ssir fil-futur, kemm fuq din il-paġna u fil-paġna ta\' d
'unwatchthispage' => 'Ieqaf osserva',
'notanarticle' => 'Din il-paġna mhux artiklu',
'notvisiblerev' => 'Ir-reviżjoni tħassret',
-'watchnochange' => 'L-ebda waħda mill-paġni osservati tiegħek ma ġiet modifikata fil-ħin stipulat.',
'watchlist-details' => "Il-lista ta' osservazzjoni fiha {{PLURAL:$1|paġna waħda (u l-paġna ta' diskussjoni tagħha)|$1 paġni (u l-paġni ta' diskussjoni tagħhom)}}.",
-'wlheader-enotif' => '* In-notifikazzjoni bl-użu tal-posta elettronika hija attivata.',
-'wlheader-showupdated' => "* Il-paġni li ġew editjati wara l-aħħar żjara tiegħek qed jiġu murija b'tipa '''ħoxna'''",
+'wlheader-enotif' => 'In-notifikazzjoni bl-użu tal-posta elettronika hija attivata.',
+'wlheader-showupdated' => "Il-paġni li ġew editjati wara l-aħħar żjara tiegħek qed jiġu murija b'tipa '''ħoxna'''",
'watchmethod-recent' => "Kontroll ta' modifiki riċenti għall-osservati speċjali.",
'watchmethod-list' => 'Kontroll tal-osservati speċjali għal modifiki riċenti',
'watchlistcontains' => "Il-lista ta' osservazzjoni fiha {{PLURAL:$1|paġna|$1 paġni}}.",
@@ -2603,11 +2608,8 @@ Ara l-[[Special:BlockList|lista tal-blokki]] sabiex tara l-blokki attivi.',
'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 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.',
@@ -2902,24 +2904,14 @@ Kull azzjonijiet ta' importazzjoni tal-transwiki jiġu reġistrati fil-[[Special
# Stylesheets
'common.css' => '/* CSS li tpoġġa hawnhekk irrid jiġi applikat fl-iskins kollha */',
-'standard.css' => '/* CSS li tpoġġa hawnhekk se jaffetwa l-utenti li jagħmlu użu mill-iskin Standard */',
-'nostalgia.css' => '/* CSS li tpoġġa hawnhekk se jaffetwa l-utenti li jagħmlu użu mill-aspett grafiku Nostalgia */',
'cologneblue.css' => '/* CSS li tpoġġa hawnhekk se jaffetwa dawk l-utenti li jagħmlu użu mill-aspett grafiku Cologne Blue */',
'monobook.css' => "/* CSS li tpoġġa hawnhekk se jaffetwa dawk l-utenti li jagħmlu użu mill-iskin ''Monobook'' */",
-'myskin.css' => "/* CSS li tpoġġa hawnhekk se jaffetwa dawk l-utenti li jagħmlu użu mill-iskin ''L-Iskin tiegħi'' */",
-'chick.css' => '/* CSS li tpoġġa hawnhekk se jaffetwa dawk l-utenti li jagħmlu użu mill-aspett grafiku Ckick */',
-'simple.css' => '/* CSS li tpoġġa hawnhekk se jaffetwa dawk l-utenti li jagħmlu użu mill-aspett grafiku Simple */',
'modern.css' => '/* CSS li tpoġġa hawnhekk se jaffetwa dawk l-utenti li jagħmlu użu mill-aspett grafiku Modern */',
# Scripts
'common.js' => "/* Kull ''JavaScript'' hawnhekk jiġi mniżżel għal kull utent f'kull tniżżil ta' paġna. */",
-'standard.js' => "/* Kull ''JavaScript'' hawnhekk jiġi mniżżel għal dawk l-utenti li qegħdin jagħmlu użu mill-iskin ''Standard'' */",
-'nostalgia.js' => "/* Kull ''JavaScript'' hawnhekk jiġi mniżżel għal dawk l-utenti li qegħdin jagħmlu użu mill-iskin ''Nostalgia'' */",
'cologneblue.js' => "/* Kull ''JavaScript'' hawnhekk jiġi mniżżel għal dawk l-utenti li qegħdin jagħmlu użu mill-iskin ''Cologne Blue'' */",
'monobook.js' => "/* Kull ''JavaScript'' hawnhekk jiġi mniżżel għal dawk l-utenti li qegħdin jagħmlu użu mill-iskin ''Monobook'' */",
-'myskin.js' => "/* Kull ''JavaScript'' hawnhekk jiġi mniżżel għal dawk l-utenti li qegħdin jagħmlu użu mill-iskin ''MySkin'' */",
-'chick.js' => "/* Kull ''JavaScript'' hawnhekk jiġi mniżżel għal dawk l-utenti li qegħdin jagħmlu użu mill-iskin ''Chick'' */",
-'simple.js' => "/* Kull ''JavaScript'' hawnhekk jiġi mniżżel għal dawk l-utenti li qegħdin jagħmlu użu mill-iskin ''Simple'' */",
'modern.js' => "/* Kull ''JavaScript'' hawnhekk jiġi mniżżel għal dawk l-utenti li qegħdin jagħmlu użu mill-iskin ''Modern''*/",
# Metadata
@@ -2985,13 +2977,8 @@ Kull azzjonijiet ta' importazzjoni tal-transwiki jiġu reġistrati fil-[[Special
'pageinfo-protect-cascading-from' => 'Protezzjoni li tintiret minn',
# Skin names
-'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',
# Patrolling
@@ -3096,7 +3083,7 @@ Oħrajn jiġu moħbija kif inhu definit oriġinarjament.
* gpslongitude
* gpsaltitude",
-# EXIF tags
+# Exif tags
'exif-imagewidth' => "Wisa'",
'exif-imagelength' => 'Għoli',
'exif-bitspersample' => 'Bits għal kull komponent',
@@ -3274,7 +3261,7 @@ Oħrajn jiġu moħbija kif inhu definit oriġinarjament.
'exif-originalimageheight' => 'Għoli tal-istampa qabel ma ġiet maqtugħa',
'exif-originalimagewidth' => "Wisa' tal-istampa qabel ma ġiet maqtugħa",
-# EXIF attributes
+# Exif attributes
'exif-compression-1' => 'L-Ebda',
'exif-copyrighted-true' => 'Protetta bil-copyright',
@@ -3574,7 +3561,6 @@ Jekk jogħġbok konferma jekk vera trid terġa' toħloq din il-paġna.",
# Separators for various lists, etc.
'semicolon-separator' => ';',
-'autocomment-prefix' => '-',
# Multipage image navigation
'imgmultipageprev' => "↠il-paġna ta' qabel",
@@ -3674,7 +3660,6 @@ Inti tista' wkoll tuża' l-[[Special:EditWatchlist|editur bl-interfaċċa standa
'version-other' => 'Oħrajn',
'version-mediahandlers' => 'Imradd tal-medja',
'version-hooks' => 'Hook',
-'version-extension-functions' => 'Funzjonijiet tal-estensjoni',
'version-parser-extensiontags' => "Tikketti magħrufa mill-''parser'' introdotti minn estensjonijiet",
'version-parser-function-hooks' => "''Hooks'' għal funzjonijiet tal-''parser''",
'version-hook-name' => 'Isem tal-hook',
@@ -3695,12 +3680,8 @@ Flimkien ma' dan il-programm suppost kellek tirċievi [{{SERVER}}{{SCRIPTPATH}}/
'version-entrypoints-header-entrypoint' => "Punt ta' dħul",
'version-entrypoints-header-url' => 'URL',
-# Special:FilePath
-'filepath' => 'Post tal-fajl',
-'filepath-page' => 'Fajl:',
-'filepath-submit' => 'Mur',
-'filepath-summary' => "Din il-paġna speċjali tagħti lura l-indirizz komplet tal-posta għal fajl.
-Stampi huwa mogħrija b'risoluzzjoni sħiħa, tipi tal-fajl oħrajn jibdew bil-program assoċjat magħhom direttament.",
+# Special:Redirect
+'redirect-submit' => 'Mur',
# Special:FileDuplicateSearch
'fileduplicatesearch' => 'Fittex fajls duplikati',
diff --git a/languages/messages/MessagesMwl.php b/languages/messages/MessagesMwl.php
index a0f38323..3fe13d1c 100644
--- a/languages/messages/MessagesMwl.php
+++ b/languages/messages/MessagesMwl.php
@@ -107,9 +107,6 @@ $messages = array(
'tog-enotifrevealaddr' => 'Rebelar l miu andereço de correio eiletrónico nas noteficaçones',
'tog-shownumberswatching' => "Amostrar l númaro d'outelizadores a begiar",
'tog-fancysig' => 'Tratar assinatura cumo wikitesto (sin lhigaçon outomática)',
-'tog-externaleditor' => 'Por oumisson, outelizar un eiditor sterno (solo para outelizadores abançados, eisige cunfiguraçones adecionales ne l tou cumputador)',
-'tog-externaldiff' => 'Por oumisson, outelizar defrenças sternas (solo para outelizadores abançados, eisige cunfiguraçones adicionales ne l tou cumputador)',
-'tog-showjumplinks' => 'Posseblitar lhigaçones d\'acessibelidade "{{ant:jumpto}}"',
'tog-uselivepreview' => "Ousar l'antebison an tiempo rial (JavaScrit) (Spurmental)",
'tog-forceeditsummary' => 'Abisar-me al antroduzir un sumairo bazio',
'tog-watchlisthideown' => 'Scunder las mies eidiçones al lhistar mudanças a las páiginas begiadas',
@@ -265,7 +262,7 @@ $messages = array(
'jumptonavigation' => 'nabegaçon',
'jumptosearch' => 'percura',
-# 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).
+# 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).
'aboutsite' => 'Subre {{SITENAME}}',
'aboutpage' => 'Project:Subre',
'copyright' => 'Cuntenido çponible subre la lhicença $1.',
@@ -275,7 +272,6 @@ $messages = array(
'disclaimers' => 'Abiso de Cuntenido',
'disclaimerpage' => 'Project:Abiso giral',
'edithelp' => 'Ajuda de eidiçon',
-'edithelppage' => 'Help:Eiditar',
'helppage' => 'Help:Cuntenidos',
'mainpage' => 'Páigina Percipal',
'mainpage-description' => 'Páigina Percipal',
@@ -555,7 +551,6 @@ Legenda: (atu) = defrénças de la berson atual,
'prevn' => 'anteriores {{PLURAL:$1|$1}}',
'nextn' => 'próssimos {{PLURAL:$1|$1}}',
'viewprevnext' => 'Ber ($1 {{int:pipe-separator}} $2) ($3)',
-'searchhelp-url' => 'Help:Conteúdos',
'searchprofile-images' => 'Multimédia',
'searchprofile-everything' => 'Todo',
'searchprofile-advanced' => 'Abançado',
@@ -685,7 +680,6 @@ Causo l çponiblizes, este será outelizado pa te dar crédito pul tou trabalho.
'recentchangeslinked-feed' => 'Alterações relacionadas',
'recentchangeslinked-toolbox' => 'Alterações relacionadas',
'recentchangeslinked-title' => 'Altaraçones que ténen a ber cun "$1"',
-'recentchangeslinked-noresult' => 'Nun houbo alteraçones an páiginas relacionadas ne l anterbalo de tiempo.',
'recentchangeslinked-summary' => "Esta páigina special amostra las redadeiras altaraçones de páiginas que téngan ua lhigaçon a outra (ó de nembros dua catadorie speceficada).
Páiginas que steian ne ls [[Special:Watchlist|tous begiados]] son amostradas an '''negrito'''.",
'recentchangeslinked-page' => 'Nome de la páigina:',
@@ -770,8 +764,6 @@ Páiginas que steian ne ls [[Special:Watchlist|tous begiados]] son amostradas an
'statistics-views-total' => 'Total de bejitas',
'statistics-users-active' => 'Outelizadores atibos',
-'disambiguations' => 'Páigina de zambiguaçon',
-
'doubleredirects' => 'Ancaminamientos duplos',
'brokenredirects' => 'Ancaminamientos scachados',
@@ -1087,13 +1079,8 @@ Por fabor, scuolhe outro nome.',
Premite ajuntar la rezon de la eidiçon ne l sumário.',
# Skin names
-'skinname-standard' => 'Clássico',
-'skinname-nostalgia' => 'Suidade',
'skinname-cologneblue' => 'Azul',
'skinname-monobook' => 'Lhibro',
-'skinname-myskin' => 'Piel',
-'skinname-chick' => 'Cipe-Çape',
-'skinname-simple' => 'Simpre',
'skinname-modern' => 'Moderno',
# Browsing diffs
@@ -1138,7 +1125,7 @@ Causo l fexeiro tenga sido demudado a partir de l sou stado oureginal, alguns de
* gpslongitude
* gpsaltitude',
-# EXIF tags
+# Exif tags
'exif-imagewidth' => 'Ancho',
'exif-imagelength' => 'Altura',
'exif-imagedescription' => 'Títalo de la eimaige',
@@ -1213,11 +1200,6 @@ Causo l fexeiro tenga sido demudado a partir de l sou stado oureginal, alguns de
'version-software-product' => 'Perduto',
'version-software-version' => 'Berson',
-# Special:FilePath
-'filepath' => 'Camino de l fexeiro',
-'filepath-page' => 'Fexeiro',
-'filepath-submit' => 'Camino',
-
# Special:FileDuplicateSearch
'fileduplicatesearch-filename' => 'Nome de l fexeiro',
'fileduplicatesearch-submit' => 'Percurar',
diff --git a/languages/messages/MessagesMy.php b/languages/messages/MessagesMy.php
index bbfd1b84..4edacf7e 100644
--- a/languages/messages/MessagesMy.php
+++ b/languages/messages/MessagesMy.php
@@ -100,6 +100,7 @@ $messages = array(
'tog-ccmeonemails' => 'ကျွန်ုပ် အá€á€¼á€¬á€¸á€¡á€žá€¯á€¶á€¸á€•á€¼á€¯á€žá€°á€™á€»á€¬á€¸á€‘ံပို့သော အီးမေးမိá€á€¹á€á€°á€€á€­á€¯ ကျွန်ုပ်ထံ ပြန်ပို့ရန်',
'tog-diffonly' => 'ကွဲပြားမှုများအောက်ရှိ စာမျက်နှာá€á€½á€„်ပါá€á€„်သည်များကို မပြပါနှင့်',
'tog-showhiddencats' => 'á€á€¾á€€á€ºá€‘ားသော ကá€á€¹á€á€™á€»á€¬á€¸á€€á€­á€¯ ပြရန်',
+'tog-useeditwarning' => 'မသိမ်းရသေးသော ပြောင်းလဲမှုများ နှင့် á€á€Šá€ºá€¸á€–ြá€á€ºá€†á€²á€…ာမျက်နှာမှ ထွက်သွားလျှင် သá€á€­á€•á€±á€¸á€•á€«',
'underline-always' => 'အမြဲ',
'underline-never' => 'ဘယ်သောအá€á€«á€™á€»á€¾',
@@ -163,6 +164,18 @@ $messages = array(
'oct' => 'အောက်',
'nov' => 'နို',
'dec' => 'ဒီ',
+'january-date' => 'ဇန်နá€á€«á€›á€® $1',
+'february-date' => 'ဖေဖော်á€á€«á€›á€® $1',
+'march-date' => 'မá€á€º $1',
+'april-date' => 'ဧပြီ $1',
+'may-date' => 'မေ $1',
+'june-date' => 'ဂျွန် $1',
+'july-date' => 'ဂျူလိုင် $1',
+'august-date' => 'ဩဂုá€á€º $1',
+'september-date' => 'စက်á€á€„်ဘာ $1',
+'october-date' => 'အောက်á€á€­á€¯á€˜á€¬ $1',
+'november-date' => 'နိုá€á€„်ဘာ $1',
+'december-date' => 'ဒီဇင်ဘာ $1',
# Categories related messages
'pagecategories' => '{{PLURAL:$1|ကá€á€¹á€|ကá€á€¹á€}}',
@@ -284,7 +297,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).
+# 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).
'aboutsite' => '{{SITENAME}} အကြောင်း',
'aboutpage' => 'Project: အကြောင်းအရာ',
'copyright' => '$1 အောက်á€á€½á€„် ဤအကြောင်းအရာကို ရရှိနိုင်သည်á‹',
@@ -294,7 +307,6 @@ $1',
'disclaimers' => 'သá€á€­á€•á€¼á€¯á€…ရာများ',
'disclaimerpage' => 'Project: အထွေထွေ သá€á€­á€•á€¼á€¯á€–ွယ်',
'edithelp' => 'ပြင်​ဆင်​ရန် အ​ကူ​အ​ညီ​',
-'edithelppage' => 'Help: á€á€Šá€ºá€¸á€–ြá€á€ºá€á€¼á€„်း',
'helppage' => 'Help: မာá€á€­á€€á€¬',
'mainpage' => 'ဗဟိုစာမျက်နှာ',
'mainpage-description' => 'ဗ​ဟို​စာ​မျက်​နှာ​',
@@ -453,7 +465,7 @@ $1',
'newpassword' => 'စကားá€á€¾á€€á€º အသစ် -',
'retypenew' => 'စကားá€á€¾á€€á€º အသစ်ကို ထပ်ရိုက်ပါ -',
'resetpass_submit' => 'စကားá€á€¾á€€á€ºá€€á€­á€¯ သá€á€ºá€™á€¾á€á€ºá€•á€¼á€®á€¸á€”ောက် Log in á€á€„်ရန်',
-'resetpass_success' => 'သင့်စကားá€á€¾á€€á€ºá€€á€­á€¯ အောင်မြင်စွာ ပြောင်းလဲပြီးပါပြီዠအá€á€¯ Log in á€á€„်နေပါပြီ...',
+'changepassword-success' => 'သင့်စကားá€á€¾á€€á€ºá€€á€­á€¯ အောင်မြင်စွာ ပြောင်းလဲပြီးပါပြီዠအá€á€¯ Log in á€á€„်နေပါပြီ...',
'resetpass_forbidden' => 'စကားá€á€¾á€€á€º ပြောင်းမရနိုင်ပါ',
'resetpass-no-info' => 'ဤစာမျက်နှာကို á€á€­á€¯á€€á€ºá€›á€­á€¯á€€á€ºá€¡á€žá€¯á€¶á€¸á€•á€¼á€¯á€”ိုင်ရန်အá€á€½á€€á€º Log in á€á€„်ထားရပါမည်á‹',
'resetpass-submit-loggedin' => 'စကားá€á€¾á€€á€ºá€•á€¼á€±á€¬á€„်းရန်',
@@ -677,7 +689,6 @@ Legend: '''({{int:cur}})''' = နောက်ဆုံးမူနှင့် á
'searchmenu-legend' => 'ရှာဖွေရန် ရွေးá€á€»á€šá€ºá€™á€¾á€¯',
'searchmenu-exists' => "'''ဤá€á€®á€€á€®á€á€½á€„် \"[[:\$1]]\" အမည်နှင့် စာမျက်နှာá€á€…်á€á€¯á€›á€¾á€­á€žá€Šá€ºá‹'''",
'searchmenu-new' => "'''ဤá€á€®á€€á€®á€á€½á€„် \"[[:\$1]]\" အမည်နှင့် စာမျက်နှာကို ဖန်á€á€®á€¸á€•á€«á‹'''",
-'searchhelp-url' => 'Help: မာá€á€­á€€á€¬',
'searchprofile-articles' => 'မာá€á€­á€€á€¬á€…ာမျက်နှာများ',
'searchprofile-project' => 'အကူအညီနှင့် ပရောဂျက်စာမျက်နှာများ',
'searchprofile-images' => 'မာလá€á€®á€™á€®á€’ီယာ',
@@ -720,13 +731,6 @@ Try prefixing your query with ''all:'' to search all content (including talk pag
'powersearch-togglenone' => 'အမည်ညွှန်းမရှိ',
'search-external' => 'အပြင်á€á€½á€„် ရှာရန်',
-# Quickbar
-'qbsettings-none' => 'အမည်ညွှန်းမရှိ',
-'qbsettings-fixedleft' => 'ဘယ်ဘက်ကို အသေထားရန်',
-'qbsettings-fixedright' => 'ညာဘက်ကို အသေထားရန်',
-'qbsettings-floatingleft' => 'ဘယ်ဘက်ကို အရှင်ထားရန်',
-'qbsettings-floatingright' => 'ညာဘက်ကို အရှင်ထားရန်',
-
# Preferences page
'preferences' => '​ရွေး​á€á€»á€šá€ºâ€‹á€…​ရာ​များ​',
'mypreferences' => '​ရွေး​á€á€»á€šá€ºâ€‹á€…​ရာ​များ​',
@@ -753,7 +757,6 @@ Try prefixing your query with ''all:'' to search all content (including talk pag
'resetprefs' => 'မသိမ်းရသေးသော အပြောင်းအလဲများကို ရှင်းလင်းရန်',
'restoreprefs' => 'မူလဆက်á€á€„်များသို့ အားလုံး ပြန်ပြောင်းရန်',
'prefs-editing' => 'á€á€Šá€ºá€¸á€–ြá€á€ºá€á€¼á€„်း',
-'prefs-edit-boxsize' => 'á€á€Šá€ºá€¸á€–ြá€á€ºá€žá€Šá€·á€º သေá€á€¹á€á€¬á€¡á€›á€½á€šá€ºá€¡á€…ားá‹',
'rows' => 'အလျားလိုက်á€á€”်း -',
'columns' => 'ဒေါင်လိုက်á€á€”်း -',
'searchresultshead' => 'ရှာ​ဖွေ​ရန်​',
@@ -789,7 +792,6 @@ Try prefixing your query with ''all:'' to search all content (including talk pag
'prefs-custom-css' => 'စိá€á€ºá€€á€¼á€­á€¯á€€á€º CSS',
'prefs-custom-js' => 'စိá€á€ºá€€á€¼á€­á€¯á€€á€º Javascript',
'prefs-emailconfirm-label' => 'အီးမေးအá€á€Šá€ºá€•á€¼á€¯á€›á€”်',
-'prefs-textboxsize' => 'á€á€Šá€ºá€¸á€–ြá€á€ºá€™á€¾á€¯á€á€„်းဒိုးáအရွယ်အစား',
'youremail' => 'အီး​မေး -',
'username' => 'အသုံးပြုသူအမည် -',
'uid' => 'အသုံးပြုသူ ​ID -',
@@ -979,7 +981,6 @@ Your e-mail address is not revealed when other users contact you.
'recentchangeslinked-feed' => 'ဆက်စပ်သော ​အ​ပြောင်း​အ​လဲ​များ​',
'recentchangeslinked-toolbox' => 'ဆက်​စပ်​သော​အ​ပြောင်း​အ​လဲ​များ​',
'recentchangeslinked-title' => '"$1" နှင့် ဆက်စပ်သော အပြောင်းအလဲများ',
-'recentchangeslinked-noresult' => 'ပေးထားသော အá€á€»á€­á€”်အá€á€½á€„်း လင့်á€á€»á€­á€á€ºá€‘ားသော စာမျက်နှာများá€á€½á€„် အပြောင်းအလဲမရှိပါá‹',
'recentchangeslinked-summary' => 'ဤသည်မှာ သီးသန့်ပြထားသော စာမျက်နှာ (သို့ သီးသန့်ကá€á€¹á€á€™á€»á€¬á€¸) မှ ညွှန်းထားသော စာမျက်နှာများá လá€á€ºá€á€œá€±á€¬ ပြောင်းလဲမှုများá စာရင်းဖြစ်သည်ዠ[[Special:Watchlist|စောင့်ကြည့်စာရင်း]] မှ စာမျက်နှာများကို စာလုံးမည်းဖြင့် ပြထားသည်á‹',
'recentchangeslinked-page' => 'စာမျက်နှာ အမည် -',
'recentchangeslinked-to' => 'ပေးထားသော စာမျက်နှာများအစား လင့်များနှင့် ဆက်စပ်နေသာ စာမျက်နှာများá အပြောင်းအလဲများကို ပြရန်',
@@ -1053,7 +1054,6 @@ Your e-mail address is not revealed when other users contact you.
# HTTP errors
'http-invalid-url' => 'á€á€›á€¬á€¸á€™á€á€„်သော URL လင့် - $1',
-'http-host-unreachable' => 'URL လင့်သို့ သွားမရပါá‹',
# Some likely curl errors. More could be added from <http://curl.haxx.se/libcurl/c/libcurl-errors.html>
'upload-curl-error6' => 'URL လင့်သို့ သွားမရပါ',
@@ -1165,8 +1165,6 @@ Your e-mail address is not revealed when other users contact you.
'statistics-users-active' => 'လက်ရှိလုပ်ကိုင်နေသော အသုံးပြုသူများ',
'statistics-mostpopular' => 'အများဆုံးကြည့်သော စာမျက်နှာများ',
-'disambiguationspage' => 'Template:သံá€á€°á€€á€¼á€±á€¬á€„်းကွဲများ',
-
'doubleredirects' => 'နှစ်ဆင့်ပြန် ပြန်ညွှန်းများ',
'double-redirect-fixed-move' => '[[$1]] ကို ရွှေ့ပြောင်းပြီးဖြစ်သည်ዠယá€á€¯á€¡á€á€« [[$2]] သို့ ပြန်ညွှန်းထားသည်á‹',
@@ -1511,8 +1509,6 @@ Your e-mail address is not revealed when other users contact you.
'block-log-flags-hiddenname' => 'အသုံးပြုသူအမည် á€á€¾á€€á€ºá€‘ားသည်',
'ipb_expiry_invalid' => 'သက်á€á€™á€ºá€¸á€€á€¯á€”်လွန်မည့် အá€á€»á€­á€”်သည် á€á€›á€¬á€¸á€™á€á€„်ပါá‹',
'ipb_already_blocked' => '"$1" ကို အစကá€á€Šá€ºá€¸á€€ ပိá€á€ºá€‘ားသည်',
-'blockme' => 'ကျွန်ုပ်ကို ပိá€á€ºá€›á€”်',
-'proxyblocksuccess' => 'ပြီးပါပြီá‹',
# Move page
'move-page' => '$1 ကို ရွှေ့ရန်',
@@ -1717,7 +1713,7 @@ Your e-mail address is not revealed when other users contact you.
* gpslongitude
* gpsaltitude',
-# EXIF tags
+# Exif tags
'exif-imagewidth' => 'အကျယ်',
'exif-imagelength' => 'အမြင့်',
'exif-bitspersample' => 'အစိá€á€ºá€¡á€•á€­á€¯á€„်းá€á€…်á€á€¯á€á€½á€„်ပါá€á€„်သော အပိုင်းငယ်များ',
@@ -1847,11 +1843,6 @@ Your e-mail address is not revealed when other users contact you.
'version-software-product' => 'ထုá€á€ºá€€á€¯á€”်',
'version-software-version' => 'ဗားရှင်း',
-# Special:FilePath
-'filepath' => 'ဖိုင်လမ်းကြောင်း',
-'filepath-page' => 'ဖိုင်:',
-'filepath-submit' => 'သွား',
-
# Special:FileDuplicateSearch
'fileduplicatesearch' => 'နှစ်á€á€¯á€‘ပ်နေသောဖိုင်များကို ရှာရန်',
'fileduplicatesearch-legend' => 'နှစ်á€á€¯á€‘ပ်နေသည်ကို ရှာရန်',
diff --git a/languages/messages/MessagesMyv.php b/languages/messages/MessagesMyv.php
index ea9c1e88..e24ad45a 100644
--- a/languages/messages/MessagesMyv.php
+++ b/languages/messages/MessagesMyv.php
@@ -216,9 +216,6 @@ $messages = array(
'tog-shownumberswatching' => 'ÐÐµÐ²Ñ‚ÐµÐ¼Ñ Ð·Ñро теицÑтнеде, конат аравтызь лопанть ÑÑеÑÑ‚ ванома лемриÑьментень',
'tog-oldsig' => 'Ð£Ð»Ð¸ÐºÑ ÐºÐµÐ´ÑŒÐ¿ÑƒÑ‚Ð¾Ð²ÐºÑоÑÑŒ:',
'tog-fancysig' => 'ЛемпутовкÑоÑÑŒ прок викитекÑÑ‚ (ÑонÑÑŒ Ñ‚ÐµÐµÐ²Ð¸Ñ†Ñ Ñюлмавома певтеме)',
-'tog-externaleditor' => 'ÐÐ¾Ð»Ð´Ð°Ð¼Ñ Ñ‚ÐµÐ²Ñ ÑƒÑˆÐ¾Ñ‘Ð½Ð¾Ð½ÑŒ витнемканть, зÑÑ€Ñ Ð»Ð¸ÑÐºÑ Ð°Ð¿Ð°Ðº аравто (анÑÑк тевень Ñодыйтненень, арÑий машинаÑот ÑÑ€Ñвить башка ёнкÑÑ‚-аравтомат [//www.mediawiki.org/wiki/Manual:External_editors подробнее])',
-'tog-externaldiff' => 'ÐÐ¾Ð»Ð´Ð°Ð¼Ñ Ñ‚ÐµÐ²Ñ ÑƒÑˆÐ¾Ñ‘Ð½Ð¾Ð½ÑŒ diff, зÑÑ€Ñ Ð»Ð¸ÑÐºÑ Ð°Ð¿Ð°Ðº аравто (анÑÑк тевень Ñодыйтненень, арÑий машинаÑот ÑÑ€Ñвить башка ёнкÑÑ‚-аравтомат [//www.mediawiki.org/wiki/Manual:External_editors подробнее])',
-'tog-showjumplinks' => 'ÐœÐµÑ€ÐµÐ¼Ñ "тёкадемÑ" малаÑпонгомань ÑюлмавомапетнеÑ',
'tog-uselivepreview' => 'МакÑÐ¾Ð¼Ñ ÑÑ€Ñй ваÑнÑнь Ð½ÐµÐ²Ñ‚ÐµÐ²ÐºÑ (JavaScript) (Варчамонь)',
'tog-forceeditsummary' => 'Ðевтик монень, мезе ÑÑ‘Ñ€Ð¼Ð°Ð´Ð¾Ð¼Ñ Ð²Ð¸Ñ‚Ð½ÐµÐ¼Ð°Ð´Ð¾-петнемадо ёвтамонь вальминентень',
'tog-watchlisthideown' => 'Кекшить монь теевть витневкÑтнÑнь ванома лемриÑьменть ÑйÑÑ‚Ñ',
@@ -406,7 +403,7 @@ $messages = array(
'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).
+# 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).
'aboutsite' => '{{SITENAME}} ланга',
'aboutpage' => 'Project:ЭÑÑ‚ÑдензÑ',
'copyright' => '$1-Ñто муÑÑ‚ мезе теÑÑ.',
@@ -416,7 +413,6 @@ $messages = array(
'disclaimers' => 'Видечинь кортамотне',
'disclaimerpage' => 'Project:Видечинь прÑÐºÑ ÐºÐ¾Ñ€Ñ‚Ð½ÐµÐ¼Ð°',
'edithelp' => 'Витнемань-петнемань лезкÑ',
-'edithelppage' => 'Help:Витнема-петнема',
'helppage' => 'Help:ЛопаÑÑŒ мезе кирди',
'mainpage' => 'ПрÑкÑлопа',
'mainpage-description' => 'ПрÑкÑлопа',
@@ -514,7 +510,6 @@ $messages = array(
'actionthrottled' => 'Тев тееманть куроккÑÑ‡Ð¸Ð·Ñ ÐºÐ¸Ñ€Ñ‚Ñзь',
'protectedpagetext' => 'Те лопаÑÑŒ панжома ÑкшÑÑ, илÑзо понго витнемÑ-Ð¿ÐµÑ‚Ð½ÐµÐ¼Ñ Ñли Ð»Ð¸Ñ Ñ‚ÐµÐ²Ñ.',
'viewsourcetext' => 'Те лопанть лиÑьмапрÑÑÑŒ маштови ваномÑкак, лангÑтонзо ÑÐ°ÐµÐ¼Ñ ÐºÐ¾Ð¿Ð¸ÑÑк:',
-'sqlhidden' => '(SQL вешнемаÑÑŒ кекшезь)',
'namespaceprotected' => "'''$1''' лемпотмоÑонть араÑÑŒ видечить витнемÑ-Ð¿ÐµÑ‚Ð½ÐµÐ¼Ñ Ð»Ð¾Ð¿Ð°Ñ‚Ð½ÐµÑÑ.",
'ns-specialprotected' => '{{ns:special}} лем марто лопатне а витневить-петневить.',
'titleprotected' => "Те конÑкÑонть ванÑтызе [[ТеицÑ:$1|$1]], киÑк илÑÑÑо тее.
@@ -531,7 +526,6 @@ $messages = array(
'yourpassword' => 'Салава валот:',
'yourpasswordagain' => 'Омбоцеде Ñёрмадык кирдицÑнь леметь:',
'remembermypassword' => 'ЛедÑÑ‚ÐµÐ¼Ñ Ñовамом те бравзерÑÑнть (Ñех кувать $1 {{PLURAL:$1|чи|чить}})',
-'securelogin-stick-https' => 'ÐšÐ¸Ñ€Ð´ÐµÐ¼Ñ "HTTPS" ÑÑŽÐ»Ð¼Ð°Ð²ÐºÑ Ñовамодо мейлеÑк',
'yourdomainname' => 'ЭÑеть доменÑÑ‚ÑŒ:',
'password-change-forbidden' => 'Те викиÑÑнть а полавтÑак Ñалававалот.',
'login' => 'Совамо',
@@ -606,7 +600,7 @@ $messages = array(
'newpassword' => 'Од Ñовамо валот:',
'retypenew' => 'Сёрмадык омбоцеде Ñовамо валот:',
'resetpass_submit' => 'Тештик Ñовамо валот ды Ñовак',
-'resetpass_success' => 'Совамо валот полавтовÑÑŒ теть! Совавтыть ÑйÑÑÑ‚ÑŒ ÑиÑтемаÑ...',
+'changepassword-success' => 'Совамо валот полавтовÑÑŒ теть! Совавтыть ÑйÑÑÑ‚ÑŒ ÑиÑтемаÑ...',
'resetpass_forbidden' => 'Совамо Ð²Ð°Ð»Ñ‚Ð½Ñ Ð° полавтовить',
'resetpass-submit-loggedin' => 'ÐŸÐ¾Ð»Ð°Ð²Ñ‚Ð¾Ð¼Ñ Ñовамо валот',
'resetpass-submit-cancel' => 'Ð¡Ð°ÐµÐ¼Ñ Ð¼ÐµÐºÐµÐ²',
@@ -855,7 +849,6 @@ IP-тешкÑÑ‚ÑÑ‚ÑŒ — $3, ÑÐ°Ð¹Ð¼Ð°Ñ Ñовавтоманть ID-ÑÑŒ —
'searchmenu-legend' => 'Вешнемань аравтомкат',
'searchmenu-exists' => "'''Те викиÑÑнть ули \"[[\$1]]\" лем марто лопа'''",
'searchmenu-new' => "'''Шкик \"[[:\$1]]\" лопанть те викиÑÑнть!'''",
-'searchhelp-url' => 'Help:ЛопаÑÑŒ мезе кирди',
'searchprofile-articles' => 'ÐŸÐ¾Ñ‚Ð¼Ð¾ÐºÑ Ð»Ð¾Ð¿Ð°Ñ‚',
'searchprofile-project' => 'Ð›ÐµÐ·ÐºÑ Ð´Ñ‹ Ð¿Ñ€Ð¾ÐµÐºÑ‚Ñ‚Ñ Ð»Ð¾Ð¿Ð°Ñ‚',
'searchprofile-images' => 'МультимедиÑ',
@@ -892,14 +885,6 @@ IP-тешкÑÑ‚ÑÑ‚ÑŒ — $3, ÑÐ°Ð¹Ð¼Ð°Ñ Ñовавтоманть ID-ÑÑŒ —
'powersearch-togglenone' => 'ÐраÑÑŒ мезе невтемÑ',
'search-external' => 'Ушо йондонь вешнема',
-# Quickbar
-'qbsettings' => 'ÐавигациÑнь лазнÑ',
-'qbsettings-none' => 'ÐраÑÑŒ мезе невтемÑ',
-'qbsettings-fixedleft' => 'Керш ёндо кирдезь',
-'qbsettings-fixedright' => 'Вить ёндо кирдезь',
-'qbsettings-floatingleft' => 'Керш ёнга уи',
-'qbsettings-floatingright' => 'Вить ёнга уи',
-
# Preferences page
'preferences' => 'Ðравтомат',
'mypreferences' => 'Ðравтомат',
@@ -929,7 +914,6 @@ IP-тешкÑÑ‚ÑÑ‚ÑŒ — $3, ÑÐ°Ð¹Ð¼Ð°Ñ Ñовавтоманть ID-ÑÑŒ —
'resetprefs' => 'ÐÐ°Ñ€Ð´Ð°Ð¼Ñ Ð°Ð¿Ð°Ðº ванÑто полавтнемат',
'restoreprefs' => 'ВелÑÐ²Ñ‚Ð¾Ð¼Ñ Ð¼ÐµÐºÐµÐ² веÑе ÑƒÑˆÐ¾Ð´ÐºÑ Ð»Ð°Ð´Ñематнень',
'prefs-editing' => 'Витнема-петнема',
-'prefs-edit-boxsize' => 'Витнема-петнема вальманть ÑÑрензÑ-келензÑ.',
'rows' => 'ВалчилькÑÑ‚Ð½Ñ (Ñтрокатне):',
'columns' => 'Палманть:',
'searchresultshead' => 'Вешнема',
@@ -958,7 +942,6 @@ IP-тешкÑÑ‚ÑÑ‚ÑŒ — $3, ÑÐ°Ð¹Ð¼Ð°Ñ Ñовавтоманть ID-ÑÑŒ —
'prefs-namespaces' => 'Лем потмот',
'default' => 'зÑрдо лиÑÐºÑ Ð°Ð¿Ð°Ðº йовта',
'prefs-files' => 'Файлат',
-'prefs-textboxsize' => 'Витнемань-петнемань вальманть покшолмазо',
'youremail' => 'Е-Ñёрма:',
'username' => 'ТеицÑнь леметь:',
'uid' => 'ТеицÑнь ID:',
@@ -1117,7 +1100,6 @@ IP-тешкÑÑ‚ÑÑ‚ÑŒ — $3, ÑÐ°Ð¹Ð¼Ð°Ñ Ñовавтоманть ID-ÑÑŒ —
'recentchangeslinked-feed' => 'Сюлмавозь лиÑкÑтоматне',
'recentchangeslinked-toolbox' => 'Сюлмавозь лиÑкÑтоматне',
'recentchangeslinked-title' => 'Полавтнемат-лиÑкÑтомтомат конат кандовить теватезÑнь "$1"',
-'recentchangeslinked-noresult' => 'МакÑозь шкаÑтонть кодаткак полавтовомат Ñюлмавозь лопатнеÑÑ Ð°Ñ€Ð°Ñельть.',
'recentchangeslinked-summary' => "ТеÑÑ Ð¼Ð°ÐºÑозь меельÑе шкань витнемат-петнемат, конат теезельть башка макÑозь лопа вельде (Ñли категориÑÑ ÑÐ¾Ð²Ð°Ð²Ñ‚Ð¾Ð²Ð¸Ñ†Ñ Ñ‚ÐµÐ²Ð½ÐµÑ). Ванома лопаÑот лопатне макÑозь '''ÑчкÑÑ‚Ñ Ñ‚ÐµÑˆÑ‚ÐµÐ·ÑŒ'''",
'recentchangeslinked-page' => 'Лопанть лемезÑ:',
'recentchangeslinked-to' => 'Тень Ñ‚Ð°Ñ€ÐºÐ°Ñ Ð½ÐµÐ²Ñ‚Ð¸Ñ‚ÑŒ те лопанть марто Ñюлмазь лопатнеÑÑ Ð¿Ð¾Ð»Ð°Ð²Ñ‚Ð½ÐµÐ¼Ð°Ñ‚Ð½ÐµÐ½ÑŒ',
@@ -1294,9 +1276,6 @@ IP-тешкÑÑ‚ÑÑ‚ÑŒ — $3, ÑÐ°Ð¹Ð¼Ð°Ñ Ñовавтоманть ID-ÑÑŒ —
'statistics-users-active' => 'ЧиÑÑ‚Ñ Ð»Ð¸Ñийть-Ñовийть',
'statistics-mostpopular' => 'ВеÑемеде ÑеедьÑÑ‚Ñ Ð²Ð°Ð½Ð¾Ð·ÑŒ лопат',
-'disambiguations' => 'Лопат, конатне Ñюлмазь чарькодевтемань ламо терминÑнь лопаÑ',
-'disambiguationspage' => 'Template:ÑмуÑтень корÑÑ Ñвома',
-
'doubleredirects' => 'КавкÑÑ‚ÑŒ ютавтозь',
'double-redirect-fixer' => 'ÐŸÐµÑ‡Ñ‚ÐµÐ²Ñ‚ÐµÐ¼Ñ Ð²Ð¸Ñ‚Ð½ÐµÐ¼Ð°-петнема пель',
@@ -1659,8 +1638,6 @@ IP-тешкÑÑ‚ÑÑ‚ÑŒ — $3, ÑÐ°Ð¹Ð¼Ð°Ñ Ñовавтоманть ID-ÑÑŒ —
'block-log-flags-noemail' => 'е-Ñёрма озавтозь ÑаймеÑ',
'block-log-flags-hiddenname' => 'лиÑиенть-Ñовиенть Ð»ÐµÐ¼ÐµÐ·Ñ ÐºÐµÐºÑˆÐµÐ·ÑŒ',
'ipb_already_blocked' => '"$1" уш ÑÐ°Ð¹Ð¼Ð°Ñ Ñаезь',
-'blockme' => 'Озавтомак ÑаймеÑ',
-'proxyblocksuccess' => 'ОзавтовÑÑŒ.',
# Developer tools
'lockdb' => 'Ð¡Ñ‘Ð»Ð³Ð¾Ð¼Ñ Ð´Ð°Ñ‚Ð°Ð±Ð°Ð·Ð°Ð½Ñ‚ÑŒ',
@@ -1856,10 +1833,6 @@ IP-тешкÑÑ‚ÑÑ‚ÑŒ — $3, ÑÐ°Ð¹Ð¼Ð°Ñ Ñовавтоманть ID-ÑÑŒ —
'pageinfo-authors' => 'ВеÑÐµÐ¼ÐµÐ·Ñ Ð·Ñро авторонзо',
# Skin names
-'skinname-standard' => 'КлаÑÑикань',
-'skinname-nostalgia' => 'ОдПингеньМазы',
-'skinname-myskin' => 'ЭÑьМелемКорÑÑ',
-'skinname-simple' => 'Шожда',
'skinname-modern' => 'ÐееньШкань',
# Patrolling
@@ -1928,7 +1901,7 @@ IP-тешкÑÑ‚ÑÑ‚ÑŒ — $3, ÑÐ°Ð¹Ð¼Ð°Ñ Ñовавтоманть ID-ÑÑŒ —
* gpslongitude
* gpsaltitude',
-# EXIF tags
+# Exif tags
'exif-imagewidth' => 'Келе',
'exif-imagelength' => 'СÑрь',
'exif-bitspersample' => 'Эрьва ÐºÐ¾Ð¼Ð¿Ð¾Ð½ÐµÐ½Ñ‚Ñ Ð·Ñро битт',
@@ -1980,7 +1953,7 @@ IP-тешкÑÑ‚ÑÑ‚ÑŒ — $3, ÑÐ°Ð¹Ð¼Ð°Ñ Ñовавтоманть ID-ÑÑŒ —
'exif-languagecode' => 'Кель',
'exif-iimcategory' => 'ЯвовкÑ',
-# EXIF attributes
+# Exif attributes
'exif-compression-1' => 'Ðпак Ñювордо',
'exif-unknowndate' => 'Ðпак Ñодань чи',
@@ -2188,11 +2161,6 @@ IP-тешкÑÑ‚ÑÑ‚ÑŒ — $3, ÑÐ°Ð¹Ð¼Ð°Ñ Ñовавтоманть ID-ÑÑŒ —
'version-software-product' => 'ШкавкÑ-нолдавкÑ',
'version-software-version' => 'ВерзиÑ',
-# Special:FilePath
-'filepath' => 'Ð¤Ð°Ð¹Ð»Ð°Ñ ÑннÑ',
-'filepath-page' => 'ФайлаÑÑŒ:',
-'filepath-submit' => 'Ютак',
-
# Special:FileDuplicateSearch
'fileduplicatesearch' => 'ВешнÑÐ¼Ñ ÐºÐ°Ð²Ñ‚Ð°Ñьке файлат',
'fileduplicatesearch-legend' => 'ВешнÑÐ¼Ñ ÐºÐ°Ð²Ñ‚Ð°Ñьке',
diff --git a/languages/messages/MessagesMzn.php b/languages/messages/MessagesMzn.php
index 339f1777..c9032565 100644
--- a/languages/messages/MessagesMzn.php
+++ b/languages/messages/MessagesMzn.php
@@ -156,9 +156,6 @@ $messages = array(
'tog-shownumberswatching' => 'دمبالکرون٠سÙراق هدائن',
'tog-oldsig' => 'پیش نیمایش ایمضای موجود:',
'tog-fancysig' => 'ایمضا ره ویکی متن نظر بیرین (بدون لینک هایتن)',
-'tog-externaleditor' => 'به شیکل پیش Ùرض خارجی ویرایشگرون جه ایستیÙاده بواشه',
-'tog-externaldiff' => 'ایستیÙاده از تÙاوت‌گیر جه (diff) خارجی به‌طور پیش‌Ùرض.',
-'tog-showjumplinks' => 'Ùعال هکردن بپرسنی پیوندون مندرجات Ùهرست دله',
'tog-uselivepreview' => 'ایستیÙاده از پیش نیمایش زنده (جاوا اسکریپ) (جدیده)',
'tog-forceeditsummary' => 'زمونی که خولاصه دچی‌ین ره ننویشتمه مه ره بائو',
'tog-watchlisthideown' => 'دپوشنی‌ین کارای من پیگریای ÙÙهرست دله',
@@ -351,7 +348,7 @@ $2، $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).
+# 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).
'aboutsite' => '{{SITENAME}} درباره',
'aboutpage' => 'Project:درباره',
'copyright' => 'این صÙحه ره بَنوشته‌ئون $1 زیر Ø´Ùمه دسـت دَرنه.',
@@ -361,7 +358,6 @@ $2، $1',
'disclaimers' => 'تکذیب‌نومه‌ئون',
'disclaimerpage' => 'Project:تکذیب‌نومه',
'edithelp' => 'دچی‌ین رانما',
-'edithelppage' => 'Help:دَچی‌ین',
'helppage' => 'Help:راهنما',
'mainpage' => 'گت صÙحه',
'mainpage-description' => 'گت صÙحه',
@@ -439,19 +435,6 @@ $2، $1',
# General errors
'error' => 'Ø®Ùطا',
'databaseerror' => 'خطای داده‌ئون پایگا',
-'dberrortext' => 'اشکال نحوی بخاستن دله برسنی‌یه بیّه به پایگاه داده.
-دلیل این مشکل بتونده ایرادی نرم‌اÙزار دله بائه.
-آخرین بخاسته‌یی که پایگاه وسّه برسنی‌بیَ‌بی‌یه اینتا بی‌یه:
-<blockquote style="direction:ltr;"><tt>$1</tt></blockquote>
-این بخاسته درون عملگر «<span class="ltr"><tt>$2</tt></span>» جه برسنی بیّه.
-پایگاه داده این خطا ره بردگاردنی‌یه:
-<div class="ltr"><tt>$3: $4</tt></div>',
-'dberrortextcl' => 'اشکال نحوی در درخواست Ùرستاده شده به پایگاه داده رخ داد.
-آخرین درخواست Ú©Ù‡ برای پایگاه داده Ùرستاد شد این بود:
-<div class="ltr">$1</div>
-این درخواست از درون عملگر «<span class="ltr">$2</span>» Ùرستاده شد.
-پایگاه داده این خطا را بازگرداند:
-<div class="ltr">$3: $4</div>',
'laggedslavemode' => "'''هشدار:''' صÙحه ممکن هسته Ú©Ù‡ جدید Ùبه‌روزرسانی‌ئون ره شامل نواشه.",
'readonly' => 'پایگاه داده زلÙÙ† بزه‎بیّه',
'enterlockreason' => 'دلیلی زلÙین بزوئن وسّه بارین، Ú©Ù‡ حاوی تقریبی از زمونی بائه Ú©Ù‡ زلÙین بَیته وانه',
@@ -501,14 +484,12 @@ $2، $1',
'viewsourcetext' => 'بتونّی متن مبدأ این صÙحه ره هارشین یا ونجه نسخه بَیرین:',
'viewyourtext' => "بتونّی '''شه بنویشته چیون''' مبدأ ره این صÙحه دله هارشین Ùˆ Ú©Ù¾ÛŒ هاکنین:",
'protectedinterface' => 'این صÙحه ارائه‌دهندهٔ متنی واسط کارور این نرم‌اÙزار هسته Ùˆ به منظور پیشگیری از خرابکاری زلÙین بزه‌بیّه.',
-'sqlhidden' => '(دستور اس‌کیوال دپوشنی‌یه بیّه)',
# Login and logout pages
'yourname' => 'شمه کاروری‌نوم:',
'yourpassword' => 'شمه پسورد',
'yourpasswordagain' => 'پسورد ره دÙباره بنویس',
'remembermypassword' => 'مه رمز ره (تا حداکثر $1 {{PLURAL:$1|روز|روز}}) این مرورگر سر یاد نکان',
-'securelogin-stick-https' => 'HTTPS دله بموئن په، متصل بموند',
'yourdomainname' => 'شمه کاروری نوم',
'login' => 'دله بوردن',
'nav-login-createaccount' => 'دله بوردن / عضو بیّن',
@@ -791,8 +772,6 @@ $2، $1',
# Statistics
'statistics' => 'آمار',
-'disambiguations' => 'گجگجی‌بَیری صÙحه‌ئون',
-
# Miscellaneous special pages
'nbytes' => '$1 {{PLURAL:$1|بایت|بایت}}',
'specialpage-empty' => 'این صÙحه دله Ù‡Ú†Ù‘ÛŒ دَنی‌یه',
@@ -850,7 +829,6 @@ $2، $1',
'watchthispage' => 'این صÙحه ره دÙمبال هاکارد‌ن',
'unwatch' => 'ده‌مـبـال نـه‌کـارده‌ن',
'unwatchthispage' => 'دیگه این صÙحه ره دمبال نکاردن',
-'watchnochange' => 'هیچ‌کادوم از چیزایی Ú©Ù‡ Ø´Ùما دمبال کانـّی Ú†Ù† وقته عوض نینه.',
'watchlist-details' => 'بدون حیساب Ú¯Ù¾ ولگ‌ئون، {{PLURAL:$1|$1 صÙحه|$1 صÙحه}} شمه دمبال‌هاکردنی‌ئون میون قرار {{PLURAL:$1|دارنه|دانه}}.',
'wlheader-enotif' => '*تونی ایمیل جه مطلع بواشین.',
'wlheader-showupdated' => "*صÙحه‌ئونی Ú©Ù‡ بعد از آخرین سربزوئنتون عوض بینه '''پر رنگ''' نشون هدائه بیّه.",
@@ -1033,12 +1011,12 @@ $2، $1',
# Video information, used by Language::formatTimePeriod() to format lengths in the above messages
'video-dims' => '$1, $2×$3',
-# EXIF tags
+# Exif tags
'exif-gpsareainformation' => 'جی پی اس ناحیه نوم',
'exif-gpsdatestamp' => 'جی پی اس روز',
'exif-gpsdifferential' => 'جی پی اس په‌چه‌ک درس هأکه‌ردن',
-# EXIF attributes
+# Exif attributes
'exif-compression-1' => 'Ùه‌شورده نئی',
'exif-unknowndate' => 'نه‌شناسی روز',
diff --git a/languages/messages/MessagesNa.php b/languages/messages/MessagesNa.php
index 8493fa19..c0296523 100644
--- a/languages/messages/MessagesNa.php
+++ b/languages/messages/MessagesNa.php
@@ -97,7 +97,7 @@ $messages = array(
# Special:AllPages
'allpagessubmit' => 'nuwa ko',
-# Email user
+# E-mail user
'emailuser' => 'Emaileiy amune',
'emailfrom' => 'Atsiu',
'emailto' => 'Animwen',
diff --git a/languages/messages/MessagesNah.php b/languages/messages/MessagesNah.php
index ee320b78..a9224e77 100644
--- a/languages/messages/MessagesNah.php
+++ b/languages/messages/MessagesNah.php
@@ -277,7 +277,7 @@ $messages = array(
'jumptonavigation' => 'nènemòwalistli',
'jumptosearch' => 'tlatēmoliztli',
-# 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).
+# 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).
'aboutsite' => 'Ītechcopa {{SITENAME}}',
'aboutpage' => 'Project:Ītechcopa',
'copyright' => 'TlahcuilÅltzin cah yÅllÅxoxouhqui Ä«pan $1',
@@ -286,7 +286,6 @@ $messages = array(
'currentevents-url' => 'Project:Ä€xcÄncÄyÅtl',
'disclaimers' => 'NahuatÄ«llahtÅl',
'edithelp' => 'Tlapatlaliztechcopa tēpalēhuiliztli',
-'edithelppage' => 'Help:¿QuÄ“n motlahcuiloa cÄ“ zÄzanilli?',
'helppage' => 'Help:Tlapiyaliztli',
'mainpage' => 'Achkàuhìxtlapalli',
'mainpage-description' => 'Achkàuhìxtlapalli',
@@ -367,7 +366,6 @@ Hueliz quimpiya tlahtÅl tlein ahmo mohuelÄ«tih motequitiltia tÅcÄpan.',
'viewsource' => 'TiquittÄz tlahtÅlcaquiliztilÅni',
'actionthrottled' => 'TlachÄ«hualiztli Åmotzacuili',
'viewsourcetext' => 'TihuelÄ«ti tiquitta auh ticcopÄ«na inÄ«n zÄzanilli Ä«tlahtÅlcaquiliztilÅni:',
-'sqlhidden' => '(TlatÄ“moliztli SQL omotlÄti)',
'namespaceprotected' => "Ahmo tiquihuelÄ«ti tiquimpatla zÄzaniltin Ä«pan '''$1'''.",
'ns-specialprotected' => 'In nònkuâkìskàtlaìxtlapaltìn awel ìmpan nemàtilòs mokinyèktlàlis.',
'titleprotected' => "InÄ«n zÄzanilli ÅmoquÄ«xti ic tlachÄ«hualiztli ic [[User:$1|$1]].
@@ -432,7 +430,7 @@ Occeppa xicalaqui niman ticmatīz.',
'newpassword' => 'YancuÄ«c motlahtÅlichtacayo:',
'retypenew' => 'Occeppa xiquihcuiloa yancuÄ«c motlahtÅlichtacayo:',
'resetpass_submit' => 'XicpatlÄz motlahtÅlichtacÄyo auh xicalaquÄ«z',
-'resetpass_success' => '¡Cualli Åmopatlac motlahtÅlichtacÄyo! Ä€xcÄn ticalaquicah...',
+'changepassword-success' => '¡Cualli Åmopatlac motlahtÅlichtacÄyo! Ä€xcÄn ticalaquicah...',
'resetpass_forbidden' => 'TlahtÅlichtacayÅtl ahmo mohuelÄ«tih mopatlah',
'resetpass-submit-loggedin' => 'TicpatlÄz motlahtÅlichtacÄyo',
'resetpass-submit-cancel' => 'TiccuepÄz',
@@ -601,7 +599,6 @@ Hueliz Åmopolo huiqui nozo Åmozacac.
'viewprevnext' => 'Xiquintta ($1 {{int:pipe-separator}} $2) ($3).',
'searchmenu-exists' => "'''Ye ia zÄzanilli Ä«tÅca \"[[\$1]]\" inÄ«n huiquipan'''",
'searchmenu-new' => "'''TihuelÄ«ti ticchÄ«huÄz zÄzanilli Ä«tÅca \"[[:\$1]]\" inÄ«n huiquipan'''",
-'searchhelp-url' => 'Help:Tlapiyaliztli',
'searchprofile-articles' => 'Tlapiyaliztli zÄzanilli',
'searchprofile-project' => 'TÄ“palÄ“huiliztli Ä«huÄn Ä«xiptlahtli Ämatl',
'searchprofile-images' => 'Nepapan media',
@@ -629,9 +626,6 @@ Hueliz Åmopolo huiqui nozo Åmozacac.
'powersearch-togglenone' => 'Ahtlein',
'search-external' => 'TlatÄ“motiliztli calÄmpa',
-# Quickbar
-'qbsettings-none' => 'Ahtlein',
-
# Preferences page
'preferences' => 'Tlaēlēhuiliztli',
'mypreferences' => 'Notlaēlēhuiliz',
@@ -908,9 +902,6 @@ TimitztlÄtlauhtiah, xitlahcuiloa occÄ“ tÅcÄitl.',
'statistics-files' => 'TlahcuilÅlli Åmoquetz',
'statistics-views-peredit' => 'Tlahpololiztli ic tlapatlaliztli',
-'disambiguations' => 'Ä€matl tlein motzonhuiliah Ä«ca tlahtÅlmelÄhuacÄtlÄliztli Ämatl',
-'disambiguationspage' => 'Template:TlahtÅlmelÄhuacÄtlÄlÄ«liztli',
-
'doubleredirects' => 'ÅŒntetl tlacuepaliztli',
'brokenredirects' => 'Tzomoc tlacuepaliztli',
@@ -1182,8 +1173,6 @@ Xiquitta $2 ic yancuīc tlapololiztli.',
'change-blocklink' => 'Ticpatlaz tlatzacualli',
'contribslink' => 'tlapatlaliztli',
'blocklogpage' => 'TlatequitiltilÄ«lli Åmotzacuili',
-'blockme' => 'Timitzcuilīz',
-'proxyblocksuccess' => 'Ōmochīuh.',
# Move page
'move-page' => 'TiczacÄz $1',
@@ -1345,7 +1334,7 @@ Hueliz cah inÄ«n huÄ“yi tlapatlaliztli. TimitztlÄtlauhtia ticmatÄ«z cuallÅtl a
'metadata-expand' => 'TiquittÄz tlanÅnÅtzaliztli huehca Åmpa',
'metadata-collapse' => 'TictlÄtÄ«z tlanÅnÅtzaliztli huehca Åmpa',
-# EXIF tags
+# Exif tags
'exif-photometricinterpretation' => 'Pixel tlachīhualiztli',
'exif-imagedescription' => 'Īxiptli Ä«tÅcÄ',
'exif-software' => 'Software ÅmotÄ“quitilti',
@@ -1475,10 +1464,6 @@ Niman tihuelÄ«ti [[Special:UserLogin|timocalaqui]] auh ticpactiÄz huiquitica.',
'version-version' => '(MachiyÅtzin $1)',
'version-software-version' => 'MachiyÅtzin',
-# Special:FilePath
-'filepath-page' => 'TlahcuilÅlli:',
-'filepath-submit' => 'YÄuh',
-
# Special:FileDuplicateSearch
'fileduplicatesearch-filename' => 'TlahcuilÅlli Ä«tÅcÄ:',
'fileduplicatesearch-submit' => 'TlatÄ“mÅz',
diff --git a/languages/messages/MessagesNan.php b/languages/messages/MessagesNan.php
index 3cd3f448..a9eba0c8 100644
--- a/languages/messages/MessagesNan.php
+++ b/languages/messages/MessagesNan.php
@@ -54,9 +54,6 @@ $messages = array(
'tog-shownumberswatching' => 'Hián-sÄ« tng leh khoà⿠ê iÅng-chiá sò͘-boÌk',
'tog-oldsig' => 'Chit-má ê chhiam-miâ:',
'tog-fancysig' => 'Chhiam-miâ mài chò liân-kiat',
-'tog-externaleditor' => 'IÅng gÅa-pÅ· pian-chiÌp-khì',
-'tog-externaldiff' => 'IÅng gÅa-pÅ· diff',
-'tog-showjumplinks' => 'HÅ͘ "thiàu khì" chit ê liân-chiap Ä“-sái',
'tog-uselivepreview' => 'Ä’ng sui khoàâ¿-mÄi (ài Å« JavaScript) (chhì-giÄm--ê)',
'tog-forceeditsummary' => 'Pian-chiÌp khài-iàu bô thi⿠ê sî-chÅ«n, kÄ goá thê-chhéâ¿',
'tog-watchlisthideown' => 'Kàm-sÄ«-toaâ¿ bián hián-sÄ« goá ê pian-chiÌp',
@@ -254,7 +251,7 @@ $1',
'pool-queuefull' => 'TÅ«i-liaÌt pâi moá ah',
'pool-errorunknown' => 'MÌ„-chai siá⿠chhò-gÅ͘',
-# 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).
+# 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).
'aboutsite' => 'hían-sī',
'aboutpage' => 'Project:koan-hē',
'copyright' => 'TÄ« $1 tiâu-kiÄâ¿ chi hÄ khó sú-iÅng loÄ“-iông',
@@ -264,7 +261,6 @@ $1',
'disclaimers' => 'Bô-hū-chek seng-bêng',
'disclaimerpage' => 'Project:It-poa⿠ê seng-bêng',
'edithelp' => 'Ãn-choá⿠siu-kái',
-'edithelppage' => 'Help:Pian-chiÌp',
'helppage' => 'Help:BoÌk-lioÌk',
'mainpage' => 'Thâu-iaÌh',
'mainpage-description' => 'Thâu-iaÌh',
@@ -338,12 +334,6 @@ Che mÄ khó-lêng sÄ« {{SITENAME}} só͘ sú-iÅng ê nÅ„g-thé chhut bÅ«n-tê.
# General errors
'error' => 'Chhò-gÅ·',
'databaseerror' => 'Chu-liÄu-khò· chhò-gÅ·',
-'dberrortext' => 'Chu-liÄu-khò͘ hoat-seng cha-sûn ê gí-hoat chhò-ngÅ͘.
-Che khó-lêng sÄ« nÅ„g-thé ê chhò-ngÅ͘.
-Téng chiÌt ê cha-sûn sÄ« :
-<blockquote><tt>$1</tt></blockquote>
-tī hâm-sò͘ "<tt>$2</tt>".
-Chu-liÄu-khò͘ thoân hoê ê chhò-ngÅ͘ "<tt>$3: $4</tt>".',
'readonly' => 'Chu-liÄu-khò· só tiâu leh',
'enterlockreason' => 'Phah beh hong-só ê lí-iû, pau-koah ko͘-kè siáâ¿-miÌh sî-chÅ«n Ä“ kái-tû hong-só.',
'readonlytext' => 'Chu-liÄu-khò· hiÄn-chú-sî só tiâu leh, bô khai-hòng hÅ· lâng siu-kái. Che tÄi-khài sÄ« in-Å«i teh pÄn î-siu khang-khòe, oân-sêng liáu-Äu èng-tong tÅ Ä“ hôe-hoÌk chèng-siông. HÅ«-chek ê hêng-chèng jîn-oân lâu chit-ê soat-bêng: $1',
@@ -383,7 +373,6 @@ Chhiá⿠tÄ« kúi hun-cheng hÄu chiah koh chhì.',
'viewsourcetext' => 'Lí Ä“-sái khoà⿠iaÌh khó͘-pih chit iaÌh ê goân-sú loÄ“-iông:',
'protectedinterface' => 'Chit iaÌh thê-kiong nÅ„g-thé kài-bÄ«n Ä“ng ê bûn-jÄ«. Ūi beh Ä«-hông lâng chau-that, só͘-í Å« siÅ« tioÌh pó-hÅ͘.',
'editinginterface' => "'''Sè-jÄ«:''' Lí tng teh siu-kái 1 bÄ«n thê-kiong nÅ„g-thé kài-bÄ«n bûn-jÄ« ê iaÌh. JÄ«n-hô kái-piàn to Ä“ éng-hióng tioÌh kî-thaâ¿ iÅng-chiá ê sú-iÅng kài-bÄ«n.",
-'sqlhidden' => '(Tshàng SQL tsa-sûn)',
'cascadeprotected' => 'Chit-ê iaÌh í-keng hông pó-hÅ͘ bÄ“ kái tit. In-Å«i i tÄ« Ä“-bÄ«n {{PLURAL:$1|ê|ê}} liân-só pó-hÅ͘ lÄi-té:
$2',
'namespaceprotected' => "Lí bô khoân-lÄ« kái '''$1''' miâ-khong-kan ê iaÌh",
@@ -398,7 +387,9 @@ Lí Ä“-sái mài kì-miâ kè-siok sú-iÅng {{SITENAME}}, mÄ Ä“-sái iÅng kÄ
Chhiaâ¿ chù-ì: Å«-kóa iaÌh Å« khó-lêng khoàâ¿-tioÌh bÄ“-su lí iû-goân teng-jiÌp tiong; che chi-iàu pià⿠tiÄu lí ê browser ê cache chiÅ« Ä“ chèng-siông.",
'welcomeuser' => 'Hoan-gêng, $1!',
'yourname' => 'Lí ê iÅng-chiá miâ-chheng:',
+'userlogin-yourname' => 'IÅng-chiá miâ-chheng',
'yourpassword' => 'Lí ê biÌt-bé:',
+'userlogin-yourpassword' => '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) (for a maximum of $1 {{PLURAL:$1|day|days}})',
'login' => 'Teng-jiÌp',
@@ -592,7 +583,6 @@ Lí ê kái-piàn tÄ« Ä“-kha ê bûn-jÄ«-keh. Lí su-iàu chiÅng lí chò ê kÃ
'nextn' => 'Äu {{PLURAL:$1|$1}} hÄng',
'shown-title' => 'Múi iaÌh hián-sÄ« $1 {{PLURAL:$1|kiat-kó|kiat-kó}}',
'viewprevnext' => 'Khoà⿠($1 {{int:pipe-separator}} $2) ($3)',
-'searchhelp-url' => 'Help:BoÌk-lioÌk',
'searchprofile-articles' => 'LoÄ“-iông iaÌh',
'searchprofile-images' => 'To-mûi-thé',
'searchprofile-everything' => 'Só͘-ū ê',
@@ -607,9 +597,6 @@ Lí ê kái-piàn tÄ« Ä“-kha ê bûn-jÄ«-keh. Lí su-iàu chiÅng lí chò ê kÃ
'powersearch' => 'Kiám-sek',
'powersearch-legend' => 'Kiám-sek',
-# Quickbar
-'qbsettings' => 'Quickbar ê siat-tēng',
-
# Preferences page
'preferences' => 'Siat-tēng',
'mypreferences' => 'Góa ê siat-tēng',
@@ -685,7 +672,6 @@ TÄ« pat-lâng liân-loÌk lí ê sî-chÅ«n bÄ“ kÄ e-mail tsÅ«-tsí siá chhut--
'recentchangeslinked' => 'Siong-koan ê kái-piàn',
'recentchangeslinked-feed' => 'Siong-koan ê kái-piàn',
'recentchangeslinked-toolbox' => 'Siong-koan ê kái-piàn',
-'recentchangeslinked-noresult' => 'Lí chí-tÄ“ng ê tiâu-kiaâ¿ lÄi-té chhÅe bô jÄ«n-hô kái-piàn.',
'recentchangeslinked-page' => 'IaÌh ê miâ:',
# Upload
@@ -760,12 +746,6 @@ TÄ« pat-lâng liân-loÌk lí ê sî-chÅ«n bÄ“ kÄ e-mail tsÅ«-tsí siá chhut--
'statistics' => 'Thóng-kè',
'statistics-header-users' => 'IÅng-chiá thóng-kè sò·-baÌk',
-'disambiguations' => 'Khu-piaÌt-iaÌh',
-'disambiguationspage' => 'Template:disambig
-Template:KhPI
-Template:Khu-piaÌt-iah
-Template:Khu-piaÌt-iaÌh',
-
'doubleredirects' => 'Siang-thâu choán-iaÌh',
'brokenredirects' => 'Choán-iaÌh kò·-chiòng',
@@ -878,7 +858,6 @@ Also see [[Special:WantedCategories|wanted categories]].',
'watchthispage' => 'Kàm-sÄ« chit iaÌh',
'unwatch' => 'Mài kàm-sī',
'unwatchthispage' => 'Mài koh kàm-sī',
-'watchnochange' => 'Lí kàm-sÄ« ê hÄng-boÌk tÄ« hián-sÄ« ê sî-kî í-lÄi lóng bô siu-kái kòe.',
'watchlist-details' => 'Kàm-sÄ«-toaâ¿ Å« {{PLURAL:$1|$1 iaÌh|$1 iaÌh}}, thó-lÅ«n-iaÌh bô sǹg chÄi-lÄi.',
'watchmethod-recent' => 'tng teh kíam-cha choè-kÄ«n ê siu-kái, khoà⿠ū kàm-sÄ« ê iaÌh bô',
'watchmethod-list' => 'tng teh kiám-cha kàm-sÄ« ê iaÌh khoà⿠chòe-kÄ«n Å« siu-kái bô',
@@ -1187,9 +1166,6 @@ Chit tiuâ¿ phoe ê khak-jÄ«n-bé Ä“ chÅ«-tÅng tÄ« $4 kòe-kî.',
# Special:Version
'version' => 'Pán-pún',
-# Special:FilePath
-'filepath' => 'Tóng-àn ê soàâ¿-lÅ·',
-
# Special:SpecialPages
'specialpages' => 'TeÌk-sû-iaÌh',
diff --git a/languages/messages/MessagesNap.php b/languages/messages/MessagesNap.php
index 5d158373..042cd499 100644
--- a/languages/messages/MessagesNap.php
+++ b/languages/messages/MessagesNap.php
@@ -124,6 +124,18 @@ $messages = array(
'oct' => 'ott',
'nov' => 'nuv',
'dec' => 'dic',
+'january-date' => '$1 jennaro',
+'february-date' => '$1 frevaro',
+'march-date' => '$1 màrzo',
+'april-date' => '$1 abbrile',
+'may-date' => '$1 majo',
+'june-date' => '$1 giùgno',
+'july-date' => '$1 luglio',
+'august-date' => '$1 aùsto',
+'september-date' => '$1 settembre',
+'october-date' => '$1 ottovre',
+'november-date' => '$1 nuvembre',
+'december-date' => '$1 dicembre',
# Categories related messages
'pagecategories' => '{{PLURAL:$1|Categurìa|Categurìe}}',
@@ -198,6 +210,7 @@ $messages = array(
'create-this-page' => 'Cria sta paggena',
'delete' => 'Scancèlla',
'deletethispage' => 'Scancèlla chésta paggena',
+'undeletethispage' => 'Ripristina chista paggena',
'protect' => 'Prutegge',
'protect_change' => 'càgna',
'protectthispage' => 'Ferma chesta paggena',
@@ -232,7 +245,7 @@ $messages = array(
'jumptosearch' => 'truova',
'pool-errorunknown' => 'Errore scanusciuto',
-# 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).
+# 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).
'aboutsite' => "'Nfrummazione ncòpp'a {{SITENAME}}",
'aboutpage' => "Project:'Nfrummazione",
'copyright' => "Cuntenuti suggietti a licienza 'e uso $1.",
@@ -242,7 +255,6 @@ $messages = array(
'disclaimers' => 'Avvertimiènte',
'disclaimerpage' => 'Project:Avvertimiènte generale',
'edithelp' => 'Guida',
-'edithelppage' => 'Help:Càgna',
'helppage' => 'Help:Ajùto',
'mainpage' => 'Paggena prencepale',
'mainpage-description' => 'Paggena prencepale',
@@ -305,9 +317,18 @@ $messages = array(
Putite cuntinuà a ausà {{SITENAME}} comme n'utente senza nomme, o si nò putite trasì n'ata vota, cu 'o stesso nomme o cu n'ato nomme.",
'welcomeuser' => 'Bemmenuto, $1!',
'yourname' => 'Nomme utente',
+'userlogin-yourname' => 'Nomme utente',
+'userlogin-yourname-ph' => "'Nserisce 'o tujo nomme utente",
+'createacct-another-username-ph' => "'Nserisce 'o nomme utente",
'yourpassword' => 'Password:',
+'userlogin-yourpassword' => 'Password',
+'userlogin-yourpassword-ph' => "'Nserisce 'a toja password",
+'createacct-yourpassword-ph' => "'Nserisce 'na password",
'yourpasswordagain' => "Ripete 'a password:",
+'createacct-yourpasswordagain' => 'Cunferma password',
+'createacct-yourpasswordagain-ph' => "'Nserisce 'e novo 'a password",
'remembermypassword' => 'Allicuordate d"a password (for a maximum of $1 {{PLURAL:$1|day|days}})',
+'userlogin-remembermypassword' => 'Mantienime cullegato',
'yourdomainname' => "Spiecà 'o dumminio",
'login' => 'Tràse',
'nav-login-createaccount' => "Tràse o cria n'acciesso novo",
@@ -316,6 +337,7 @@ Putite cuntinuà a ausà {{SITENAME}} comme n'utente senza nomme, o si nò putit
'logout' => 'Jèsce',
'userlogout' => 'Jèsce',
'notloggedin' => 'Acciesso nun affettuato',
+'userlogin-noaccount' => "Nun haje ancora n'acciesso?",
'nologin' => "Nun haje ancora n'acciesso? '''$1'''.",
'nologinlink' => 'Crialo mmo',
'createaccount' => 'Cria nu cunto novo',
@@ -323,6 +345,12 @@ Putite cuntinuà a ausà {{SITENAME}} comme n'utente senza nomme, o si nò putit
'gotaccountlink' => 'Tràse',
'userlogin-resetlink' => "Haje dimenticato 'e toje date 'e acciesso?",
'createaccountreason' => 'Mutivo:',
+'createacct-reason' => 'Mutivo',
+'createacct-submit' => "Cria 'a toja utenza",
+'createacct-another-submit' => "Cria 'n atro account",
+'createacct-benefit-heading' => "{{SITENAME}} è fatta 'e perzone comme te.",
+'createacct-benefit-body1' => '{{PLURAL:$1|càgnamiento|càgnamiente}}',
+'createacct-benefit-body2' => '{{PLURAL:$1|paggena|paggene}}',
'loginerror' => "Probblema 'e accièsso",
'loginsuccesstitle' => 'Acciesso affettuato',
'loginsuccess' => "'''Si stato cunnesso ô server 'e {{SITENAME}} cu 'o nomme utente 'e \"\$1\".'''",
@@ -426,7 +454,6 @@ Putite cuntinuà a ausà {{SITENAME}} comme n'utente senza nomme, o si nò putit
'shown-title' => "Fa vere {{PLURAL:$1|'nu risultato|$1 risultate}} ppe paggena",
'viewprevnext' => 'Vere($1 {{int:pipe-separator}} $2) ($3).',
'searchmenu-new' => "'''Cria a paggena \"[[:\$1]]\" ncopp'â chisto wiki!'''",
-'searchhelp-url' => 'Help:Ajùto',
'searchprofile-articles' => "Paggene 'e contenute",
'searchprofile-project' => "Paggene 'e ajùto e relative 'o prugietto",
'searchprofile-images' => 'Multimedia',
@@ -524,8 +551,6 @@ Putite cuntinuà a ausà {{SITENAME}} comme n'utente senza nomme, o si nò putit
# Statistics
'statistics' => 'Statistiche',
-'disambiguations' => "Paggene 'e disambigua",
-
'doubleredirects' => 'Redirect duppie',
# Miscellaneous special pages
@@ -613,6 +638,7 @@ Also see [[Special:WantedCategories|wanted categories]].",
# Contributions
'contributions' => 'Contribbute {{GENDER:$1|utente}}',
'mycontris' => "'E ffatiche d''e mmeje",
+'contribsub2' => 'Ppe $1 ($2)',
'uctop' => '(attuale)',
'month' => 'D"o mese (e primma):',
'year' => "'E ll'anno (e primma):",
diff --git a/languages/messages/MessagesNb.php b/languages/messages/MessagesNb.php
index 2e6f3be5..1df949ae 100644
--- a/languages/messages/MessagesNb.php
+++ b/languages/messages/MessagesNb.php
@@ -347,9 +347,6 @@ $messages = array(
'tog-shownumberswatching' => 'Vis antall brukere som overvåker',
'tog-oldsig' => 'Nåværende signatur:',
'tog-fancysig' => 'Behandle signaturen som wikitekst (uten automatisk lenke)',
-'tog-externaleditor' => 'Bruk ekstern behandler som standard (kun for viderekomne brukere, krever spesielle innstillinger på din datamaskin. [//www.mediawiki.org/wiki/Manual:External_editors Mer informasjon.])',
-'tog-externaldiff' => 'Bruk ekstern differanse som standard (kun for viderekomne brukere, krever spesielle innstillinger på din datamaskin. [//www.mediawiki.org/wiki/Manual:External_editors Mer informasjon.])',
-'tog-showjumplinks' => 'Slå på «gå til»-lenker',
'tog-uselivepreview' => 'Bruk levende forhåndsvisning (eksperimentell JavaScript)',
'tog-forceeditsummary' => 'Advar meg når jeg ikke gir noen redigeringsforklaring',
'tog-watchlisthideown' => 'Skjul mine endringer fra overvåkningslisten',
@@ -362,6 +359,8 @@ $messages = array(
'tog-diffonly' => 'Ikke vis sideinnhold under differ',
'tog-showhiddencats' => 'Vis skjulte kategorier',
'tog-norollbackdiff' => 'Ikke vis diff etter tilbakestilling',
+'tog-useeditwarning' => 'Si ifra dersom jeg forlater en side uten å lagre den.',
+'tog-prefershttps' => 'Bruk alltid en trygg forbindelse når du er innlogget',
'underline-always' => 'Alltid',
'underline-never' => 'Aldri',
@@ -425,6 +424,18 @@ $messages = array(
'oct' => 'okt.',
'nov' => 'nov.',
'dec' => 'des.',
+'january-date' => '$1. januar',
+'february-date' => '$1. februar',
+'march-date' => '$1. mars',
+'april-date' => '$1. april',
+'may-date' => '$1. mai',
+'june-date' => '$1. juni',
+'july-date' => '$1. juli',
+'august-date' => '$1. august',
+'september-date' => '$1. september',
+'october-date' => '$1. oktober',
+'november-date' => '$1. november',
+'december-date' => '$1. desember',
# Categories related messages
'pagecategories' => '{{PLURAL:$1|Kategori|Kategorier}}',
@@ -506,6 +517,7 @@ $messages = array(
'create-this-page' => 'Opprett denne siden',
'delete' => 'Slett',
'deletethispage' => 'Slett denne siden',
+'undeletethispage' => 'Legg tilbake siden',
'undelete_short' => 'Gjenopprett {{PLURAL:$1|én revisjon|$1 revisjoner}}',
'viewdeleted_short' => 'Vis {{PLURAL:$1|én slettet redigering|$1 slettede redigeringer}}',
'protect' => 'Beskytt',
@@ -549,7 +561,7 @@ $1',
'pool-queuefull' => 'Prosesskø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).
+# 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).
'aboutsite' => 'Om {{SITENAME}}',
'aboutpage' => 'Project:Om',
'copyright' => 'Innholdet er tilgjengelig under $1.',
@@ -559,7 +571,6 @@ $1',
'disclaimers' => 'Forbehold',
'disclaimerpage' => 'Project:Generelle forbehold',
'edithelp' => 'Redigeringshjelp',
-'edithelppage' => 'Help:Redigering',
'helppage' => 'Help:Innhold',
'mainpage' => 'Hovedside',
'mainpage-description' => 'Hovedside',
@@ -636,17 +647,6 @@ En liste over gyldige spesialsider finnes på [[Special:SpecialPages|{{int:speci
# General errors
'error' => 'Feil',
'databaseerror' => 'Databasefeil',
-'dberrortext' => 'Det har oppstått en syntaksfeil i en databaseforespørsel.
-Dette kan tyde på en feil i programvaren.
-Forrige databaseforespørsel var:
-<blockquote><tt>$1</tt></blockquote>
-fra funksjonen «<tt>$2</tt>».
-Databasen returnerte feilen «<tt>$3: $4</tt>».',
-'dberrortextcl' => 'Det oppsto en syntaksfeil i en databaseforespørsel.
-Forrige databaseforespørsel var:
-«$1»
-fra funksjonen «$2».
-Databasen returnerte feilen «$3: $4».',
'laggedslavemode' => 'Advarsel: Dette kan være en eldre versjon av siden.',
'readonly' => 'Databasen er skrivebeskyttet',
'enterlockreason' => 'Skriv en begrunnelse for skrivebeskyttelsen, inkludert et estimat for når den blir opphevet',
@@ -680,6 +680,7 @@ Den kan ha blitt slettet av noen andre.',
'cannotdelete-title' => 'Kan ikke slette siden «$1»',
'delete-hook-aborted' => 'Sletting avbrutt av en funksjon.
Den ga ingen forklaring.',
+'no-null-revision' => 'Det ble ikke laget en null-endring av side "$1"',
'badtitle' => 'Ugyldig tittel',
'badtitletext' => 'Den ønskede tittelen var ugyldig, tom eller feilaktig lenket fra en annen wiki.
Den inneholder kanskje ett eller flere tegn som ikke kan brukes i titler.',
@@ -700,12 +701,15 @@ Spørring: $2',
'editinginterface' => "'''Advarsel:''' Du redigerer en side som brukes for å fremskaffe grensesnittekst for programvaren.
Endringer av denne siden vil påvirke hvordan grensesnittet vil se ut for andre brukere.
For oversettelser er det best om du bruker [//translatewiki.net/wiki/Main_Page?setlang=nb translatewiki.net], prosjektet for oversettelse av MediaWiki.",
-'sqlhidden' => '(SQL-spørring skjult)',
'cascadeprotected' => 'Denne siden er låst for redigering fordi den inkluderes på følgende sider som har dypbeskyttelse slått på:<!--{{PLURAL:$1}}-->
$2',
'namespaceprotected' => "Du har ikke tillatelse til å redigere sider i navnerommet '''$1'''.",
'customcssprotected' => 'Du har ikke tillatelse til å redigere denne CSS-siden fordi den inneholder en annen brukers personlige innstillinger.',
'customjsprotected' => 'Du har ikke tillatelse til å redigere denne JavaScript-siden fordi den inneholder en annen brukers personlige innstillinger.',
+'mycustomcssprotected' => 'Du har ikke rettigheter til å redigere denne CSS-siden.',
+'mycustomjsprotected' => 'Du har ikke rettigheter til å redigere denne Javascript-siden.',
+'myprivateinfoprotected' => 'Du har ikke tillatelse til å redigere den private informasjonen din.',
+'mypreferencesprotected' => 'Du har ikke tillatelse til å redigere innstillingene dine.',
'ns-specialprotected' => 'Spesialsider kan ikke redigeres.',
'titleprotected' => "Denne tittelen har blitt låst for oppretting av [[User:$1|$1]].
Den angitte grunnen er «''$2''».",
@@ -730,10 +734,19 @@ Vær oppmerksom på at noen sider kan fortsette å dukke opp som om du fortsatt
'welcomecreation-msg' => 'Kontoen din har blitt opprettet.
Ikke glem å endre [[Special:Preferences|innstillingene dine]] på {{SITENAME}}.',
'yourname' => 'Brukernavn:',
+'userlogin-yourname' => 'Brukernavn',
+'userlogin-yourname-ph' => 'Skriv inn brukernavnet ditt',
+'createacct-another-username-ph' => 'Skriv inn brukernavnet',
'yourpassword' => 'Passord:',
+'userlogin-yourpassword' => 'Passord',
+'userlogin-yourpassword-ph' => 'Skriv inn passordet ditt',
+'createacct-yourpassword-ph' => 'Skriv inn et passord',
'yourpasswordagain' => 'Gjenta passord',
+'createacct-yourpasswordagain' => 'Bekreft passord',
+'createacct-yourpasswordagain-ph' => 'Skriv inn passordet igjen',
'remembermypassword' => 'Husk meg på denne datamaskinen (i maks $1 {{PLURAL:$1|dag|dager}})',
-'securelogin-stick-https' => 'Vær fortsatt koblet til HTTPS etter innlogging',
+'userlogin-remembermypassword' => 'Hold meg innlogget',
+'userlogin-signwithsecure' => 'Logg inn med sikker tjener',
'yourdomainname' => 'Ditt domene',
'password-change-forbidden' => 'Du kan ikke endre passord på denne wikien.',
'externaldberror' => 'Det var en ekstern autentifiseringsfeil, eller du kan ikke oppdatere din eksterne konto.',
@@ -745,18 +758,41 @@ Ikke glem å endre [[Special:Preferences|innstillingene dine]] på {{SITENAME}}.
'logout' => 'Logg ut',
'userlogout' => 'Logg ut',
'notloggedin' => 'Ikke logget inn',
+'userlogin-noaccount' => 'Ingen konto?',
+'userlogin-joinproject' => 'Bli med på {{SITENAME}}',
'nologin' => 'Har du ingen konto? $1.',
'nologinlink' => 'Opprett en konto',
'createaccount' => 'Opprett konto',
'gotaccount' => 'Har du allerede en konto? $1.',
'gotaccountlink' => 'Logg inn',
'userlogin-resetlink' => 'Har du glemt påloggingsdetaljene dine?',
+'userlogin-resetpassword-link' => 'Tilbakestill passordet ditt',
+'helplogin-url' => 'Help:Innlogging',
+'userlogin-helplink' => '[[{{MediaWiki:helplogin-url}}|Hjelp med innlogging]]',
+'createacct-join' => 'Skriv inn informasjonen din under.',
+'createacct-another-join' => 'Legg inn den nye kontoens informasjon under.',
+'createacct-emailrequired' => 'E-postadresse',
+'createacct-emailoptional' => 'E-postadresse (valgfritt)',
+'createacct-email-ph' => 'Skriv inn e-postadressen din',
+'createacct-another-email-ph' => 'Skriv inn epostadressen',
'createaccountmail' => 'Bruk et midlertidig, tilfeldig passord, og send det til angitt e-postadresse',
+'createacct-realname' => 'Virkelig navn (valgfritt)',
'createaccountreason' => 'Ã…rsak:',
+'createacct-reason' => 'Ã…rsak',
+'createacct-reason-ph' => 'Hvorfor lager du en annen bruker',
+'createacct-captcha' => 'Sikkerhetssjekk',
+'createacct-imgcaptcha-ph' => 'Skriv inn teksten du ser ovenfor',
+'createacct-submit' => 'Opprett konto',
+'createacct-another-submit' => 'Lag ny konto',
+'createacct-benefit-heading' => '{{SITENAME}} er laget av folk som deg.',
+'createacct-benefit-body1' => '{{PLURAL:$1|redigering|redigeringer}}',
+'createacct-benefit-body2' => '{{PLURAL:$1|side|sider}}',
+'createacct-benefit-body3' => '{{PLURAL:$1|aktiv bidragsyter|aktive bidragsytere}}',
'badretype' => 'Passordene samsvarte ikke.',
'userexists' => 'Brukernavnet er allerede i bruk.
Velg et annet brukernavn.',
'loginerror' => 'Innloggingsfeil',
+'createacct-error' => 'Feil med kontoppretting',
'createaccounterror' => 'Kunne ikke opprette konto: $1',
'nocookiesnew' => 'Din brukerkonto er nå opprettet, men du har ikke logget på. {{SITENAME}} bruker informasjonskapsler («cookies») for å logge brukere på og du har slått dem av. Slå dem på for å kunne logge på med ditt nye brukernavn og passord.',
'nocookieslogin' => '{{SITENAME}} bruker informasjonskapsler («cookies») for å logge brukere på og du har slått dem av. Slå dem på og prøv igjen.',
@@ -812,10 +848,13 @@ Skriv inn en fungerende e-postadresse eller tøm feltet.',
Du kan ignorere denne beskjeden dersom kontoen ble opprettet ved en feil.',
'usernamehasherror' => 'Brukernavn kan ikke inneholde nummertegn.',
-'login-throttled' => 'Du har prøvd å logge inn med denne kontoen for mange ganger. Vent før du prøver igjen.',
+'login-throttled' => 'Du har nylig prøvd for mange ganger å logge inn.
+Vær vennlig å vente $1 før du prøver igjen.',
'login-abort-generic' => 'Innleggingen ble avbrutt.',
'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.',
+'createacct-another-realname-tip' => 'Det er frivillig å oppgi ditt egentlige navn.
+Hvis du velger å oppgi det, vil det blir anvendt for å gi deg som bruker anerkjennelse',
# Email sending
'php-mail-error-unknown' => 'Ukjent feil i PHPs mail()-funksjon',
@@ -831,8 +870,7 @@ Du kan ignorere denne beskjeden dersom kontoen ble opprettet ved en feil.',
'newpassword' => 'Nytt passord:',
'retypenew' => 'Gjenta nytt passord:',
'resetpass_submit' => 'Angi passord og logg inn',
-'resetpass_success' => 'Passordet ditt er blitt endret!
-Du blir nå logget inn...',
+'changepassword-success' => 'Passordet ditt ble korrekt endret!',
'resetpass_forbidden' => 'Passord kan ikke endres',
'resetpass-no-info' => 'Du må være logget inn for å gå til denne siden direkte',
'resetpass-submit-loggedin' => 'Endre passord',
@@ -844,10 +882,11 @@ Du kan ha allerede byttet passordet, eller bedt om et nytt midlertidig passord.'
# Special:PasswordReset
'passwordreset' => 'Passordresetting',
-'passwordreset-text' => 'Fyll ut dette skjemaet for å tilbakestille passordet ditt.',
+'passwordreset-text-one' => 'Fyll ut skjemaet for å tilbakestille passordet',
+'passwordreset-text-many' => '{{PLURAL:$1|Fyll inn et av datafeltene for å tilbakestille passordet ditt.}}',
'passwordreset-legend' => 'Nullstill passord',
'passwordreset-disabled' => 'Nullstilling av passord er deaktivert på denne wikien.',
-'passwordreset-pretext' => '{{PLURAL:$1||Skriv inn en av datadelene nedenfor}}',
+'passwordreset-emaildisabled' => 'E-posttjenester er slått av på denne wikien.',
'passwordreset-username' => 'Brukernavn:',
'passwordreset-domain' => 'Domene:',
'passwordreset-capture' => 'Vise resulterende e-post?',
@@ -878,7 +917,7 @@ passord.',
Midlertidig passord: $2',
'passwordreset-emailsent' => 'En passordtilbakestillingslenke har blitt sendt per e-post.',
'passwordreset-emailsent-capture' => 'Passordtilbakestillingseposten vist under har blitt sendt ut.',
-'passwordreset-emailerror-capture' => 'E-posten, som du ser under, ble forsøkt sendt til brukeren, men dette mislyktes: $1',
+'passwordreset-emailerror-capture' => 'En passordtilbakestillingsepost ble laget, men det lyktes ikke å sende denne til {{GENDER:$2|brukeren}}: $1',
# Special:ChangeEmail
'changeemail' => 'Endre e-postadresse',
@@ -892,6 +931,19 @@ Midlertidig passord: $2',
'changeemail-submit' => 'Endre e-post',
'changeemail-cancel' => 'Avbryt',
+# Special:ResetTokens
+'resettokens' => 'Nullstill merker',
+'resettokens-text' => 'Du kan nullstille nøklene som gir adgang til visse private data knyttet til din konto.
+
+Og du burde gjøre det hvis du har avslørt nøklene for noen.',
+'resettokens-no-tokens' => 'Det finnes ingen merker å nullstille.',
+'resettokens-legend' => 'Nullstill merker',
+'resettokens-tokens' => 'Merker:',
+'resettokens-token-label' => '$1 (aktuell verdi: $2)',
+'resettokens-watchlist-token' => 'Webmatenøkkel for overvåkningslisten',
+'resettokens-done' => 'Nullstilling av merker.',
+'resettokens-resetbutton' => 'Nullstill valgte merker',
+
# Edit page toolbar
'bold_sample' => 'Fet tekst',
'bold_tip' => 'Fet tekst',
@@ -1089,11 +1141,13 @@ Slette- og flytteloggen vises nedenfor.',
'edit-gone-missing' => 'Kunne ikke oppdatere siden fordi den har blitt slettet.',
'edit-conflict' => 'Redigeringskonflikt.',
'edit-no-change' => 'Redigeringen din ble ignorert fordi det ikke var noen endringer.',
+'postedit-confirmation' => 'Redigeringen din ble lagret.',
'edit-already-exists' => 'Kunne ikke opprette ny side fordi den finnes fra før.',
'defaultmessagetext' => 'Standard meldingstekst',
'content-failed-to-parse' => 'Klarte ikke å tolke innholdet $2 for innholdsmodellen $1: $3',
'invalid-content-data' => 'Ugyldig innhold',
'content-not-allowed-here' => 'Innholdsmodellen «$1» er ikke tillatt på siden [[$2]]',
+'editwarning-warning' => 'Ved å forlate siden kan du miste alle endringer du har utført. Om du er logget inn kan du slå av denne advarselen under «Redigering»-seksjonen i innstillingene.',
# Content models
'content-model-wikitext' => 'WikiTekst',
@@ -1128,6 +1182,7 @@ Disse parameterne har blitt utelatt.',
'undo-failure' => 'Redigeringen kunne ikke omgjøres på grunn av konflikterende etterfølgende redigeringer.',
'undo-norev' => 'Redigeringen kunne ikke fjernes fordi den ikke eksisterer eller ble slettet',
'undo-summary' => 'Fjerner revisjon $1 av [[Special:Contributions/$2|$2]] ([[User talk:$2|diskusjon]])',
+'undo-summary-username-hidden' => 'Fjern revisjon $1 av en skjult bruker',
# Account creation failure
'cantcreateaccounttitle' => 'Kan ikke opprette konto',
@@ -1306,6 +1361,7 @@ Forsikre deg om at denne endringen vil opprettholde historisk sidekontinuitet.',
'compareselectedversions' => 'Sammenlign valgte revisjoner',
'showhideselectedversions' => 'Vis/skjul valgte versjoner',
'editundo' => 'fjern',
+'diff-empty' => '(Ingen forskjell)',
'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)',
'difference-missing-revision' => '{{PLURAL:$2|En revisjon|$2 revisjoner}} av denne forskjellen ($1) {{PLURAL:$2|ble|ble}} ikke funnet.
@@ -1333,7 +1389,6 @@ Detaljer kan finnes i [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}
'searchmenu-legend' => 'Søkeinnstillinger',
'searchmenu-exists' => "* Siden '''[[$1]]'''",
'searchmenu-new' => "'''Opprett siden ''[[:$1]]'' på denne wikien.'''",
-'searchhelp-url' => 'Help:Hjelp',
'searchmenu-prefix' => '[[Special:PrefixIndex/$1|Vis alle sider som begynner med dette]]',
'searchprofile-articles' => 'Innholdssider',
'searchprofile-project' => 'Hjelp- og prosjektsider',
@@ -1375,15 +1430,7 @@ For å søke i alle, bruk prefikset ''all:'' (inkluderer diskusjonssider, maler,
'powersearch-togglenone' => 'Ingen',
'search-external' => 'Eksternt søk',
'searchdisabled' => 'Søkefunksjonen er slått av. Du kan søke via Google i mellomtiden. Merk at Googles indeksering av {{SITENAME}} muligens er utdatert.',
-
-# Quickbar
-'qbsettings' => 'Brukerinnstillinger for hurtigmeny.',
-'qbsettings-none' => 'Ingen',
-'qbsettings-fixedleft' => 'Fast venstre',
-'qbsettings-fixedright' => 'Fast høyre',
-'qbsettings-floatingleft' => 'Flytende venstre',
-'qbsettings-floatingright' => 'Flytende til høyre',
-'qbsettings-directionality' => '"Låst", f. eks. i posisjon "låst til venstre eller til høyre". For venstre-mot-høyre-språk vil hurtigvelgeren være satt til venstre, for høyre-mot-venstre-språk til høyre.',
+'search-error' => 'En feil oppsto under søk: $1',
# Preferences page
'preferences' => 'Innstillinger',
@@ -1417,7 +1464,6 @@ For å søke i alle, bruk prefikset ''all:'' (inkluderer diskusjonssider, maler,
'resetprefs' => 'Tilbakestill ulagrede endringer',
'restoreprefs' => 'Tilbakestill til standardinnstillinger overalt',
'prefs-editing' => 'Redigering',
-'prefs-edit-boxsize' => 'Størrelse på redigeringsvinduet.',
'rows' => 'Rader:',
'columns' => 'Kolonner',
'searchresultshead' => 'Søk',
@@ -1428,9 +1474,9 @@ For å søke i alle, bruk prefikset ''all:'' (inkluderer diskusjonssider, maler,
'recentchangesdays-max' => 'Maks $1 {{PLURAL:$1|dag|dager}}',
'recentchangescount' => 'Antall redigeringer som skal vises som standard:',
'prefs-help-recentchangescount' => 'Dette inkluderer nylige endringer, sidehistorikk og logger.',
-'prefs-help-watchlist-token' => 'Om du fyller ut dette feltet med et hemmelig tall, vil det lages en RSS-liste for overvåkningslisten din.
-Alle som vet det rette tallet vil være i stand til å lese overvåkningslisten din, så velg en sikker verdi.
-Her er et tilfeldig tall du kan bruke: $1',
+'prefs-help-watchlist-token2' => 'Dette er den hemmelige nøkkelen til webmatingen for din overvåkningsliste.
+Enhver som kjenner nøkkelen vil kunne lese din overvåkningsliste, så ikke vis den til andre.
+[[Special:ResetTokens|Klikk her om du trenger å nullstille nøkkelen]].',
'savedprefs' => 'Innstillingene ble lagret.',
'timezonelegend' => 'Tidssone:',
'localtime' => 'Lokaltid:',
@@ -1461,7 +1507,6 @@ Her er et tilfeldig tall du kan bruke: $1',
'prefs-reset-intro' => 'Du kan bruke denne siden til å tilbakestille innstillingene dine til standardinnstillingene.
Dette kan ikke tilbakestilles.',
'prefs-emailconfirm-label' => 'E-postbekreftelse:',
-'prefs-textboxsize' => 'Størrelse på redigeringsvindu',
'youremail' => 'E-post:',
'username' => '{{GENDER:$1|Brukernavn}}:',
'uid' => '{{GENDER:$1|Bruker-ID}}:',
@@ -1494,6 +1539,8 @@ Informasjonen vil være offentlig.',
'prefs-dateformat' => 'Datoformat',
'prefs-timeoffset' => 'Tidsforskyvning',
'prefs-advancedediting' => 'Generelle valg',
+'prefs-editor' => 'Tekstbehandling',
+'prefs-preview' => 'Forhåndsvisning',
'prefs-advancedrc' => 'Avanserte alternativ',
'prefs-advancedrendering' => 'Avanserte alternativer',
'prefs-advancedsearchoptions' => 'Avanserte alternativer',
@@ -1501,6 +1548,7 @@ Informasjonen vil være offentlig.',
'prefs-displayrc' => 'Visningsalternativer',
'prefs-displaysearchoptions' => 'Visningsalternativer',
'prefs-displaywatchlist' => 'Visningsalternativer',
+'prefs-tokenwatchlist' => 'Merke',
'prefs-diffs' => 'Forskjeller',
# User preference: email validation using jQuery
@@ -1529,6 +1577,8 @@ Informasjonen vil være offentlig.',
'userrights-changeable-col' => 'Grupper du kan endre',
'userrights-unchangeable-col' => 'Grupper du ikke kan endre',
'userrights-irreversible-marker' => '$1 *',
+'userrights-conflict' => 'En konflikt med endringen av brukerrettigheter! Vær vennlig å sjekke og på nytt bekrefte endringene dine.',
+'userrights-removed-self' => 'Du har fjernet dine egne rettigheter. Du har derfor ikke lengere adgang til denne siden.',
# Groups
'group' => 'Gruppe:',
@@ -1594,11 +1644,19 @@ Informasjonen vil være offentlig.',
'right-proxyunbannable' => 'Kan redigere fra blokkerte proxyer',
'right-unblockself' => 'Fjerne blokkering av seg selv',
'right-protect' => 'Endre beskyttelsesnivåer og redigere beskyttete sider',
-'right-editprotected' => 'Redigere beskyttede sider',
+'right-editprotected' => 'Redigere beskyttede sider som «{{int:protect-level-sysop}}»',
+'right-editsemiprotected' => 'Redigere beskyttede sider som «{{int:protect-level-autoconfirmed}}»',
'right-editinterface' => 'Redigere brukergrensesnittet',
'right-editusercssjs' => 'Redigere andre brukeres CSS- og JS-filer',
'right-editusercss' => 'Redigere andre brukeres CSS-filer',
'right-edituserjs' => 'Redigere andre brukeres JS-filer',
+'right-editmyusercss' => 'Rediger dine egne CSS-filer',
+'right-editmyuserjs' => 'Rediger dine egne Javascript-filer',
+'right-viewmywatchlist' => 'Vis din egen overvåkningsliste',
+'right-editmywatchlist' => 'Redigere din egen overvåkningsliste. Legg merke til at noen aksjoner fortsatt vil legge til sider uten denne rettigheten.',
+'right-viewmyprivateinfo' => 'Vise dine egne private data (f.eks. epostadresse og virkelig navn)',
+'right-editmyprivateinfo' => 'Redigere dine egne private data (f.eks. epostadresse og virkelig navn)',
+'right-editmyoptions' => 'Redigere dine egne innstillinger',
'right-rollback' => 'Raskt tilbakestille den siste brukeren som har redigert en gitt side',
'right-markbotedits' => 'Markere tilbakestillinger som robotredigeringer',
'right-noratelimit' => 'PÃ¥virkes ikke av hastighetsgrenser',
@@ -1660,12 +1718,19 @@ Informasjonen vil være offentlig.',
'action-userrights-interwiki' => 'endre brukerrettigheter for brukere på andre wikier',
'action-siteadmin' => 'låse eller låse opp databasen',
'action-sendemail' => 'sende e-poster',
+'action-editmywatchlist' => 'redigere din overvåkningsliste',
+'action-viewmywatchlist' => 'Vis din overvåkningsliste',
+'action-viewmyprivateinfo' => 'vise din private informasjon',
+'action-editmyprivateinfo' => 'rediger din private informasjon',
# Recent changes
'nchanges' => '$1 {{PLURAL:$1|endring|endringer}}',
+'enhancedrc-since-last-visit' => '$1 {{PLURAL:$1|siden forrige besøk}}',
+'enhancedrc-history' => 'historikk',
'recentchanges' => 'Siste endringer',
'recentchanges-legend' => 'Alternativer for siste endringer',
'recentchanges-summary' => 'PÃ¥ denne siden vises de siste endringene i wikien.',
+'recentchanges-noresult' => 'Ingen endringer i perioden passer med kriteriene.',
'recentchanges-feed-description' => 'Følg med på siste endringer i denne wikien med denne matingen.',
'recentchanges-label-newpage' => 'Denne redigeringen opprettet en ny side',
'recentchanges-label-minor' => 'Dette er en mindre endring',
@@ -1702,7 +1767,6 @@ Informasjonen vil være offentlig.',
'recentchangeslinked-feed' => 'Relaterte endringer',
'recentchangeslinked-toolbox' => 'Relaterte endringer',
'recentchangeslinked-title' => 'Endringer relatert til «$1»',
-'recentchangeslinked-noresult' => 'Ingen endringer på lenkede sider i den gitte perioden.',
'recentchangeslinked-summary' => "Dette er en liste over de siste endringene på sidene lenket fra en spesifisert side (eller til meldlemmer av en spesifisert kategori).
Sider på [[Special:Watchlist|overvåkningslisten din]] er i '''fet skrift'''.",
'recentchangeslinked-page' => 'Sidenavn:',
@@ -1714,7 +1778,7 @@ Sider på [[Special:Watchlist|overvåkningslisten din]] er i '''fet skrift'''.",
'reuploaddesc' => 'Avbryt opplasting og gå tilbake til opplastingsskjemaet',
'upload-tryagain' => 'Send inn endret filbeskrivelse',
'uploadnologin' => 'Ikke logget inn',
-'uploadnologintext' => 'Du må være [[Special:UserLogin|logget inn]] for å kunne laste opp filer.',
+'uploadnologintext' => 'Du må $1 for å laste opp filer.',
'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',
@@ -1939,7 +2003,6 @@ For best mulig sikkerhet er img_auth.php slått av.',
'http-read-error' => 'HTTP-lesefeil.',
'http-timed-out' => 'Tidsavbrudd på HTTP-forespørsel.',
'http-curl-error' => 'Feil under henting av adresse: $1',
-'http-host-unreachable' => 'Kunne ikke nå adressen.',
'http-bad-status' => 'Det var et problem under HTTP-forespørselen: $1 $2',
# Some likely curl errors. More could be added from <http://curl.haxx.se/libcurl/c/libcurl-errors.html>
@@ -1967,6 +2030,10 @@ For best mulig sikkerhet er img_auth.php slått av.',
'listfiles_size' => 'Størrelse (bytes)',
'listfiles_description' => 'Beskrivelse',
'listfiles_count' => 'Versjoner',
+'listfiles-show-all' => 'Inkluderer gamle versjoner av bilder',
+'listfiles-latestversion' => 'Gjeldende versjon',
+'listfiles-latestversion-yes' => 'Ja',
+'listfiles-latestversion-no' => 'Nei',
# File description page
'file-anchor-link' => 'Fil',
@@ -2061,6 +2128,13 @@ Kanskje du vil redigere beskrivelsen på dens [$2 filbeskrivelsesside].',
'randompage' => 'Tilfeldig side',
'randompage-nopages' => 'Det er ingen sider i {{PLURAL:$2|det følgende navnrommet|de følgende navnrommene}}: $1.',
+# Random page in category
+'randomincategory' => 'Tilfeldig side innenfor kategorien',
+'randomincategory-invalidcategory' => '«$1» er ikke et gyldig kategorinavn.',
+'randomincategory-nopages' => 'Det finnes ingen sider i [[:Kategori:$1]]-kategorien.',
+'randomincategory-selectcategory' => 'Hent en tilfeldig side fra kategori: $1 $2.',
+'randomincategory-selectcategory-submit' => 'Start',
+
# Random redirect
'randomredirect' => 'Tilfeldig omdirigering',
'randomredirect-nopages' => 'Det er ingen omdirigeringer i navnerommet $1.',
@@ -2086,17 +2160,13 @@ Kanskje du vil redigere beskrivelsen på dens [$2 filbeskrivelsesside].',
'statistics-users-active-desc' => 'Brukere som har utført handlinger {{PLURAL:$1|det siste døgnet|de siste $1 dagene}}',
'statistics-mostpopular' => 'Mest viste sider',
-'disambiguations' => 'Sider som lenker til artikler med flertydige titler',
-'disambiguationspage' => 'Template:Peker',
-'disambiguations-text' => "Følgende sider lenker til en '''pekerside'''.
-De burde i stedet lenke til en passende innholdsside.<br />
-En side anses om en pekerside om den inneholder en mal som det lenkes til fra [[MediaWiki:Disambiguationspage]].",
-
'pageswithprop' => 'Sider med sideverdi',
'pageswithprop-legend' => 'Sider med en sideverdi',
'pageswithprop-text' => 'Denne siden lister opp sider som bruker en viss sideverdi.',
'pageswithprop-prop' => 'Verdinavn:',
'pageswithprop-submit' => 'GÃ¥',
+'pageswithprop-prophidden-long' => 'skjult verdi for egenskap langtekst ($1)',
+'pageswithprop-prophidden-binary' => 'skjult verdi for binæregenskap ($1)',
'doubleredirects' => 'Doble omdirigeringer',
'doubleredirectstext' => 'Denne siden lister opp de sidene som er omdirigeringer til andre omdirigeringssider.
@@ -2154,6 +2224,7 @@ Hver rad inneholder lenker til første og andre omdirigering, samt målet for de
'mostrevisions' => 'Artikler med flest revisjoner',
'prefixindex' => 'Alle sider med prefiks',
'prefixindex-namespace' => 'All sider med prefiks ($1 navnerom)',
+'prefixindex-strip' => 'Fjern prefiks fra listen',
'shortpages' => 'Korte sider',
'longpages' => 'Lange sider',
'deadendpages' => 'Blindveisider',
@@ -2345,10 +2416,9 @@ Fremtidige endringer til denne siden og den tilhørende diskusjonssiden blir lis
'unwatchthispage' => 'Fjerner overvåkning',
'notanarticle' => 'Ikke en artikkel',
'notvisiblerev' => 'Revisjonen er slettet',
-'watchnochange' => 'Ingen av sidene i overvåkningslisten er endret i den valgte perioden.',
'watchlist-details' => '{{PLURAL:$1|Én side|$1 sider}} på din overvåkningsliste, teller ikke diskusjonssider.',
-'wlheader-enotif' => '* E-postnotifikasjon er slått på.',
-'wlheader-showupdated' => "* Sider som har blitt forandret siden du sist besøkte dem vises i '''fet tekst'''",
+'wlheader-enotif' => 'E-postvarsling er slått på.',
+'wlheader-showupdated' => "Sider som har blitt forandret siden du sist besøkte dem vises i '''fet tekst'''",
'watchmethod-recent' => 'sjekker siste endringer for sider i overvåkningslisten',
'watchmethod-list' => 'sjekker siste endringer for sider i overvåkningslisten',
'watchlistcontains' => 'Overvåkningslisten inneholder $1 {{PLURAL:$1|side|sider}}.',
@@ -2740,13 +2810,11 @@ Skjulingsloggen vises nedenfor.',
'ipb_blocked_as_range' => 'Feil: IP-en $1 er ikke blokkert direkte, og kan ikke avblokkeres. Den er imidlertid blokkert som del av blokkeringa av IP-rangen $2, som kan avblokkeres.',
'ip_range_invalid' => 'Ugyldig IP-rad.',
'ip_range_toolarge' => 'Blokkering av IP-serier større enn /$1 er ikke tillatt.',
-'blockme' => 'Blokker meg',
'proxyblocker' => 'Proxyblokker',
-'proxyblocker-disabled' => 'Denne funksjonen er slått av.',
'proxyblockreason' => 'IP-adressen din ble blokkert fordi den er en åpen proxy. Kontakt internettleverandøren din eller teknisk støtte og informer dem om dette alvorlige sikkerhetsproblemet.',
-'proxyblocksuccess' => 'Utført.',
'sorbsreason' => 'Din IP-adresse angis som en åpen proxy i DNSBL-en brukt av {{SITENAME}}.',
'sorbs_create_account_reason' => 'Din IP-adresse angis som en åpen proxy i DNSBL-en brukt av {{SITENAME}}. Du kan ikke opprette en konto',
+'xffblockreason' => 'En IP-adresse som er tilstede i X-Forwarded-For-headeren, enten din eller en som tilhører en proxyserver du bruker, har blitt blokkert. Den opprinnelige blokkeringsgrunnen var: $1',
'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',
@@ -2913,6 +2981,8 @@ Besøk [//translatewiki.net translatewiki.net] om du ønsker å bidra med overse
'thumbnail-more' => 'Forstørr',
'filemissing' => 'Filen mangler',
'thumbnail_error' => 'Feil under oppretting av miniatyrbilde: $1',
+'thumbnail_error_remote' => 'Feilmelding fra $1:
+$2',
'djvu_page_error' => 'DjVu-side ute av rekkevidde',
'djvu_no_xml' => 'Klarte ikke å hente XML for DjVu-fil',
'thumbnail-temp-create' => 'Kan ikke opprette midlertidig miniatyrbildefil',
@@ -3060,24 +3130,14 @@ Du kan se på kildeteksten',
# Stylesheets
'common.css' => '/* CSS plassert i denne fila vil gjelde for alle utseender. */',
-'standard.css' => '/* CSS i denne fila vil gjelde alle som bruker drakta Standard */',
-'nostalgia.css' => '/* CSS i denne fila vil gjelde alle som bruker drakta Nostalgia */',
'cologneblue.css' => '/* CSS i denne fila vil gjelde alle som bruker drakta Kølnerblå */',
'monobook.css' => '/* CSS i denne fila vil gjelde alle som bruker drakta Monobook */',
-'myskin.css' => '/* CSS i denne fila vil gjelde alle som bruker drakta MySkin */',
-'chick.css' => '/* CSS i denne fila vil gjelde alle som bruker drakta Chick */',
-'simple.css' => '/* CSS i denne fila vil gjelde alle som bruker drakta Simple */',
'modern.css' => '/* CSS i denne fila vil gjelde alle som bruker drakta Modern */',
# Scripts
'common.js' => '/* Javascript i denne fila vil gjelde for alle drakter. */',
-'standard.js' => '/* Javascript i denne fila vil gjelde for brukere av drakta Standard */',
-'nostalgia.js' => '/* Javascript i denne fila vil gjelde for brukere av drakta Nostalgia */',
'cologneblue.js' => '/* Javascript i denne fila vil gjelde for brukere av drakta Kølnerblå */',
'monobook.js' => '/* Javascript i denne fila vil gjelde for brukere av drakta Monobook */',
-'myskin.js' => '/* Javascript i denne fila vil gjelde for brukere av drakta MySkin */',
-'chick.js' => '/* Javascript i denne fila vil gjelde for brukere av drakta Chick */',
-'simple.js' => '/* Javascript i denne fila vil gjelde for brukere av drakta Simple */',
'modern.js' => '/* Javascript i denne fila vil gjelde for brukere av drakta Modern */',
# Metadata
@@ -3152,12 +3212,8 @@ Dette er sannsynligvis forårsaket av en lenke til et svartelistet eksternt nett
'pageinfo-category-files' => 'Antall filer',
# Skin names
-'skinname-standard' => 'Standard',
-'skinname-nostalgia' => 'Nostalgi',
'skinname-cologneblue' => 'Kølnerblå',
'skinname-monobook' => 'Monobook',
-'skinname-myskin' => 'Eget utseende',
-'skinname-simple' => 'Enkel',
'skinname-modern' => 'Moderne',
# Patrolling
@@ -3236,11 +3292,25 @@ Ved å åpne den kan systemet ditt kompromitteres.",
'minutes' => '{{PLURAL:$1|$1 minutt|$1 minutter}}',
'hours' => '{{PLURAL:$1|$1 time|$1 timer}}',
'days' => '{{PLURAL:$1|$1 dag|$1 dager}}',
+'weeks' => '{{PLURAL:$1|$1 uke|$1 uker}}',
'months' => '{{PLURAL:$1|$1 måned|$1 måneder}}',
'years' => '{{PLURAL:$1|$1 år}}',
'ago' => '$1 siden',
'just-now' => 'nettopp',
+# Human-readable timestamps
+'hours-ago' => '$1 {{PLURAL:$1|time|timer}} siden',
+'minutes-ago' => '$1 {{PLURAL:$1|minutt|minutter}} siden',
+'seconds-ago' => '$1 {{PLURAL:$1|sekund|sekunder}} siden',
+'monday-at' => 'Mandag kl. $1',
+'tuesday-at' => 'Tirsdag kl. $1',
+'wednesday-at' => 'Onsdag kl. $1',
+'thursday-at' => 'Torsdag kl. $1',
+'friday-at' => 'Fredag kl. $1',
+'saturday-at' => 'Lørdag kl. $1',
+'sunday-at' => 'Søndag kl. $1',
+'yesterday-at' => 'I går kl. $1',
+
# Bad image list
'bad_image_list' => 'Formatet er som følger:
@@ -3270,7 +3340,7 @@ Andre vil skjules som standard.
* gpslongitude
* gpsaltitude',
-# EXIF tags
+# Exif tags
'exif-imagewidth' => 'Bredde',
'exif-imagelength' => 'Høyde',
'exif-bitspersample' => 'Bits per komponent',
@@ -3448,7 +3518,7 @@ Andre vil skjules som standard.
'exif-originalimageheight' => 'Høyde på bildet før det ble beskåret',
'exif-originalimagewidth' => 'Bredde på bildet før det ble beskåret',
-# EXIF attributes
+# Exif attributes
'exif-compression-1' => 'Ukomprimert',
'exif-compression-2' => 'CCITT Gruppe 3 1-dimensjonal modifisert Huffman-kjørelengdekoding',
'exif-compression-3' => 'CCITT Gruppe 3 faks-koding',
@@ -3860,7 +3930,6 @@ Du kan også [[Special:EditWatchlist|bruke standardverktøyet]].',
'version-other' => 'Annet',
'version-mediahandlers' => 'Mediahåndterere',
'version-hooks' => 'Haker',
-'version-extension-functions' => 'Tilleggsfunksjoner',
'version-parser-extensiontags' => 'Tilleggstagger',
'version-parser-function-hooks' => 'Parserfunksjoner',
'version-hook-name' => 'Navn',
@@ -3869,6 +3938,7 @@ Du kan også [[Special:EditWatchlist|bruke standardverktøyet]].',
'version-license' => 'Lisens',
'version-poweredby-credits' => "Denne wikien er drevet av '''[//www.mediawiki.org/ MediaWiki]''', copyright © 2001-$1 $2.",
'version-poweredby-others' => 'andre',
+'version-poweredby-translators' => 'translatewiki.net-oversettere',
'version-credits-summary' => 'Vi ønsker å takke følgende personer for deres bidrag til [[Special:Version|MediaWiki]].',
'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.
@@ -3882,12 +3952,17 @@ Du skal ha mottatt [{{SERVER}}{{SCRIPTPATH}}/COPYING en kopi av GNU General Publ
'version-entrypoints-header-entrypoint' => 'Inngangspunkt',
'version-entrypoints-header-url' => 'URL',
-# Special:FilePath
-'filepath' => 'Filsti',
-'filepath-page' => 'Fil:',
-'filepath-submit' => 'GÃ¥',
-'filepath-summary' => 'Denne spesialsiden returnerer den fullstendige stien for en fil.
-Bilder vises med full oppløsning, mens andre filtyper startes direkte gjennom sine tilknyttede programmer.',
+# Special:Redirect
+'redirect' => 'Omdiriger via filnavn, bruker, eller versjonsid',
+'redirect-legend' => 'Omdiriger til en fil eller side',
+'redirect-summary' => 'Denne spesialsiden omdirigerer til en fil (hvis den gis et filnavn), en side (hvis den gis et versjonsnummer), eller en brukerside (hvis den gis en nummerisk brukerid).',
+'redirect-submit' => 'GÃ¥',
+'redirect-lookup' => 'Oppslag:',
+'redirect-value' => 'Verdi:',
+'redirect-user' => 'Bruker-ID',
+'redirect-revision' => 'Sideversjon',
+'redirect-file' => 'Filnavn',
+'redirect-not-exists' => 'Verdi er ikke funnet',
# Special:FileDuplicateSearch
'fileduplicatesearch' => 'Søk etter duplikatfiler',
@@ -3937,6 +4012,7 @@ Bilder vises med full oppløsning, mens andre filtyper startes direkte gjennom s
'tags' => 'Gyldige endringstagger',
'tag-filter' => 'Filter for [[Special:Tags|tagger]]:',
'tag-filter-submit' => 'Filtrer',
+'tag-list-wrapper' => '([[Special:Tags|{{PLURAL:$1|Tagg|Tagger}}]]: $2)',
'tags-title' => 'Tagger',
'tags-intro' => 'Denne siden lister opp taggene programvaren kan merke en endring med, og hva de betyr.',
'tags-tag' => 'Taggnavn',
@@ -3978,6 +4054,9 @@ Bilder vises med full oppløsning, mens andre filtyper startes direkte gjennom s
'htmlform-submit' => 'Lagre',
'htmlform-reset' => 'Omgjør endringer',
'htmlform-selectorother-other' => 'Andre',
+'htmlform-no' => 'Nei',
+'htmlform-yes' => 'Ja',
+'htmlform-chosen-placeholder' => 'Velg et alternativ',
# SQLite database support
'sqlite-has-fts' => '$1 med støtte for fulltekstsøk',
@@ -4095,4 +4174,18 @@ Om det ikke er tilfellet, kan du bruke det enkle skjemaet som du finner under. K
# Image rotation
'rotate-comment' => 'Bildet snudd $1{{PLURAL:°}} med klokka',
+# Limit report
+'limitreport-title' => 'Parser-profildata:',
+'limitreport-cputime' => 'CPU-tidsbruk',
+'limitreport-cputime-value' => '$1 {{PLURAL:$1|sekund|sekunder}}',
+'limitreport-walltime' => 'Faktisk tidsbruk',
+'limitreport-walltime-value' => '$1 {{PLURAL:$1|sekund|sekunder}}',
+'limitreport-ppvisitednodes' => 'Nodebesøkstelling for preprosessor',
+'limitreport-ppgeneratednodes' => 'Preprosessor-generert nodetall',
+'limitreport-postexpandincludesize-value' => '$1/$2 byte',
+'limitreport-templateargumentsize' => 'Malargument-størrelse',
+'limitreport-templateargumentsize-value' => '$1/$2 byte',
+'limitreport-expansiondepth' => 'Største ekspansjonsdybde',
+'limitreport-expensivefunctioncount' => 'Antall kostbare parserfunksjoner',
+
);
diff --git a/languages/messages/MessagesNds.php b/languages/messages/MessagesNds.php
index 4fc3a615..21595511 100644
--- a/languages/messages/MessagesNds.php
+++ b/languages/messages/MessagesNds.php
@@ -246,9 +246,6 @@ $messages = array(
'tog-shownumberswatching' => 'Wies de Tall vun Brukers, de op disse Siet oppasst',
'tog-oldsig' => 'Gellen Ãœnnerschrift',
'tog-fancysig' => 'Signatur as Wikitext behanneln (ahn automaatsch Lenk)',
-'tog-externaleditor' => 'Extern Editor as Standard bruken (Blots för Lüüd, de sik dormit utkennt. Dor mutt noch mehr op dien Reekner instellt warrn, dat dat geiht. [//www.mediawiki.org/wiki/Manual:External_editors Wiedere Informatschonen hierto.])',
-'tog-externaldiff' => 'Extern Warktüüch to’n Wiesen vun Ünnerscheden as Standard bruken (Blots för Lüüd, de sik dormit utkennt. Dor mutt noch mehr op dien Reekner instellt warrn, dat dat geiht. [//www.mediawiki.org/wiki/Manual:External_editors Wiedere Informatschonen hierto.])',
-'tog-showjumplinks' => '„Wesseln-na“-Lenken tolaten',
'tog-uselivepreview' => 'Live-Vörschau bruken (JavaScript) (Experimental)',
'tog-forceeditsummary' => 'Segg mi bescheid, wenn ik keen Tosamenfaten geven heff, wat ik allens ännert heff',
'tog-watchlisthideown' => 'Ännern vun mi sülvs op de Oppasslist nich wiesen',
@@ -447,7 +444,7 @@ $1",
'pool-queuefull' => 'Pooltöövslang is vull',
'pool-errorunknown' => 'Unbekannten 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).
+# 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).
'aboutsite' => 'Över {{SITENAME}}',
'aboutpage' => 'Project:Över_{{SITENAME}}',
'copyright' => 'Inholt is verfögbor ünner de $1.',
@@ -457,7 +454,6 @@ $1",
'disclaimers' => 'Impressum',
'disclaimerpage' => 'Project:Impressum',
'edithelp' => 'Bearbeidenshülp',
-'edithelppage' => 'Help:Ännern',
'helppage' => 'Help:Hülp',
'mainpage' => 'Hööftsiet',
'mainpage-description' => 'Hööftsiet',
@@ -530,17 +526,6 @@ En List vun de Spezialsieden gifft dat ünner [[Special:SpecialPages|{{int:speci
# General errors
'error' => 'Fehler',
'databaseerror' => 'Fehler in de Datenbank',
-'dberrortext' => 'Dor weer en Syntaxfehler in de Datenbankaffraag.
-De Grund kann en Programmeerfehler ween
-De letzte Datenbankaffraag weer:
-
-<blockquote><tt>$1</tt></blockquote>
-
-ut de Funkschoon <tt>$2</tt>.
-MySQL mell den Fehler <tt>$3: $4</tt>.',
-'dberrortextcl' => 'Dor weer en Syntaxfehler in de Datenbankaffraag.
-De letzte Datenbankaffraag weer: $1 ut de Funkschoon <tt>$2</tt>.
-MySQL mell den Fehler: <tt>$3: $4</tt>.',
'laggedslavemode' => 'Wohrschau: Disse Siet is villicht nich mehr op den ne’esten Stand.',
'readonly' => 'Datenbank is sparrt',
'enterlockreason' => 'Giff den Grund an, worüm de Datenbank sparrt warrn schall un taxeer, wo lang de Sparr duert',
@@ -589,7 +574,6 @@ Query: $2',
'editinginterface' => "'''Wohrschau:''' Disse Siet bargt Text, de vun de MediaWiki-Software för ehr Böverflach bruukt warrt.
Wat du hier ännerst, warkt sik op dat kumplette Wiki ut.
Wenn du Text översetten wist, de betherto noch gornich översett is, denn maak dat opbest op [//translatewiki.net/wiki/Main_Page?setlang=nds translatewiki.net], dat Översett-Projekt vun MediaWiki.",
-'sqlhidden' => '(SQL-Affraag versteken)',
'cascadeprotected' => 'Disse Siet is sperrt un kann nich ännert warrn. Dat kummt dorvun dat se in disse {{PLURAL:$1|Siet|Sieden}} inbunnen is, de över Kaskadensperr schuult {{PLURAL:$1|is|sünd}}:
$2',
'namespaceprotected' => "Du hest keen Rechten, Sieden in’n Naamruum '''$1''' to ännern.",
@@ -699,7 +683,7 @@ Tööv en Stoot, ehrdat du dat noch wedder versöchst.',
'newpassword' => 'Nee Passwoort',
'retypenew' => 'Nee Passwoort (nochmal)',
'resetpass_submit' => 'Passwoort instellen un inloggen',
-'resetpass_success' => 'Dien Passwoort is mit Spood ännert worrn. Warrst nu anmellt …',
+'changepassword-success' => 'Dien Passwoort is mit Spood ännert worrn. Warrst nu anmellt …',
'resetpass_forbidden' => 'Passwöör köönt nich ännert warrn.',
'resetpass-no-info' => 'Du musst anmellt wesen, dat du disse Sied direkt opropen kannst.',
'resetpass-submit-loggedin' => 'Passwoord ännern',
@@ -1087,7 +1071,6 @@ Seh to, dat de Versionsgeschicht vun’n Artikel vun de Historie her bi de Reeg
'searchmenu-legend' => 'Söökoptionen',
'searchmenu-exists' => "* Sied '''[[$1]]'''",
'searchmenu-new' => "'''Stell de Sied „[[:$1]]“ in dit Wiki nee op!'''",
-'searchhelp-url' => 'Help:Hülp',
'searchmenu-prefix' => '[[Special:PrefixIndex/$1|Wies Sieden, de mit disse Bookstaven anfangt]]',
'searchprofile-articles' => 'Inholdsieden',
'searchprofile-project' => 'Hülp- un Projektsieden',
@@ -1131,14 +1114,6 @@ Du kannst dat Woord ''all:'' vör dien Söökwoord setten, dat all Naamrüüm (o
'searchdisabled' => '<p>De Vulltextsöök is wegen Överlast en Stoot deaktiveert. In disse Tied kannst du disse Google-Söök verwennen,
de aver nich jümmer den aktuellsten Stand weerspegelt.<p>',
-# Quickbar
-'qbsettings' => 'Siedenliest',
-'qbsettings-none' => 'Keen',
-'qbsettings-fixedleft' => 'Links, fast',
-'qbsettings-fixedright' => 'Rechts, fast',
-'qbsettings-floatingleft' => 'Links, sweven',
-'qbsettings-floatingright' => 'Rechts, sweven',
-
# Preferences page
'preferences' => 'Instellen',
'mypreferences' => 'För mi Instellen',
@@ -1166,7 +1141,6 @@ de aver nich jümmer den aktuellsten Stand weerspegelt.<p>',
'resetprefs' => 'Trüchsetten',
'restoreprefs' => 'All Standardinstellungen wedderhalen',
'prefs-editing' => 'Grött vun’t Textfeld',
-'prefs-edit-boxsize' => 'Grött vun dat Finster för Ännern.',
'rows' => 'Regen',
'columns' => 'Spalten',
'searchresultshead' => 'Söökresultaten',
@@ -1177,9 +1151,6 @@ de aver nich jümmer den aktuellsten Stand weerspegelt.<p>',
'recentchangesdays-max' => '(Maximal $1 {{PLURAL:$1|Dag|Daag}})',
'recentchangescount' => 'Antall Ännern, de wiest warrt:',
'prefs-help-recentchangescount' => 'Dor höört de Ne’esten Ännern, Versionsgeschichten un Logböker to.',
-'prefs-help-watchlist-token' => 'Wenn du in dit Feld in gehemen Slötel ingiffst, denn warrt för dien Oppasslist en RSS-Feed opstellt.
-Elkeen, de den Slötel kennt, kann denn dien Oppasslist ankieken. Söök di also en good Slötel ut.
-Hier is en Tofalls-Slötel, den du bruken kannst: $1',
'savedprefs' => 'Allens spiekert.',
'timezonelegend' => 'Tiedrebeed:',
'localtime' => 'Oortstied:',
@@ -1210,7 +1181,6 @@ Hier is en Tofalls-Slötel, den du bruken kannst: $1',
'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:',
-'prefs-textboxsize' => 'Grött vun dat Änner-Finster',
'youremail' => 'Dien E-Mail (kene Plicht) *',
'username' => 'Brukernaam:',
'uid' => 'Bruker-ID:',
@@ -1435,7 +1405,6 @@ Dat kann nich wedder ungeschehn maakt warrn.',
'recentchangeslinked-feed' => 'Ännern an lenkte Sieden',
'recentchangeslinked-toolbox' => 'Ännern an lenkte Sieden',
'recentchangeslinked-title' => 'Ännern an Sieden, de vun „$1“ ut lenkt sünd',
-'recentchangeslinked-noresult' => 'In disse Tiet hett nüms de lenkten Sieden ännert.',
'recentchangeslinked-summary' => "Disse List wiest de letzten Ännern an de Sieden, de vun en bestimmte Siet ut verlenkt oder in en bestimmte Kategorie in sünd. Sieden, de op diene [[Special:Watchlist|Oppasslist]] staht, sünd '''fett''' schreven.",
'recentchangeslinked-page' => 'Siet:',
'recentchangeslinked-to' => 'Wies Ännern op Sieden, de hierher wiest',
@@ -1664,10 +1633,6 @@ Denk dor an, natokieken, wat nich noch annere Sieden na de Vörlagen wiest, ehrd
'statistics-users-active-desc' => 'Brukers, de {{PLURAL:$1|in de vergahn 24 Stünnen|in de vergahn $1 Daag}} wat daan hebbt',
'statistics-mostpopular' => 'opmehrst ankekene Sieden',
-'disambiguations' => 'Mehrdüdige Begrepen',
-'disambiguationspage' => 'Template:Mehrdüdig_Begreep',
-'disambiguations-text' => 'Disse Sieden wist na Sieden för mehrdüdige Begrepen. Se schöölt lever op de Sieden wiesen, de egentlich meent sünd.<br />Ene Siet warrt as Siet för en mehrdüdigen Begreep ansehn, wenn [[MediaWiki:Disambiguationspage]] na ehr wiest.<br />Lenken ut annere Naamrüüm sünd nich mit in de List.',
-
'pageswithprop-submit' => 'Los',
'doubleredirects' => 'Dubbelte Wiederleiden',
@@ -1893,10 +1858,9 @@ Mehr Informatschonen över enkelte Rechten staht ünner [[{{MediaWiki:Listgroupr
'unwatchthispage' => 'Nich mehr oppassen',
'notanarticle' => 'Keen Artikel',
'notvisiblerev' => 'Version wegsmeten',
-'watchnochange' => 'Kene Siet op dien Oppasslist is in den wiesten Tietruum ännert worrn.',
'watchlist-details' => '{{PLURAL:$1|Ene Siet is|$1 Sieden sünd}} op dien Oppasslist (ahn Diskuschoonssieden).',
'wlheader-enotif' => 'Benarichtigen per E-Mail is anstellt.',
-'wlheader-showupdated' => "* Sieden, de siet dien letzten Besöök ännert worrn sünd, warrt '''fett''' wiest.",
+'wlheader-showupdated' => "Sieden, de siet dien letzten Besöök ännert worrn sünd, warrt '''fett''' wiest.",
'watchmethod-recent' => 'letzte Ännern no Oppasslist pröven',
'watchmethod-list' => 'Oppasslist na letzte Ännern nakieken',
'watchlistcontains' => 'Diene Oppasslist bargt {{PLURAL:$1|ene Siet|$1 Sieden}}.',
@@ -2230,12 +2194,9 @@ Kiek [[Special:BlockList|IP-Blocklist]] för en List vun den blockten Brukern.',
'ipb_cant_unblock' => 'Fehler: Block-ID $1 nich funnen. De Sperr is villicht al wedder ophoven.',
'ipb_blocked_as_range' => 'Fehler: De IP-Adress $1 is as Deel vun de IP-Reeg $2 indirekt sperrt worrn. De Sperr trüchnehmen för $1 alleen geiht nich.',
'ip_range_invalid' => 'Ungüllig IP-Addressrebeet.',
-'blockme' => 'Sperr mi',
'proxyblocker' => 'Proxyblocker',
-'proxyblocker-disabled' => 'Disse Funkschoon is afstellt.',
'proxyblockreason' => 'Dien IP-Adress is blockt, vun wegen dat se en apenen Proxy is.
Kontakteer dien Provider oder diene Systemtechnik un informeer se över dat möögliche Sekerheitsproblem.',
-'proxyblocksuccess' => 'Trech.',
'sorbsreason' => 'Diene IP-Adress steiht in de DNSBL vun {{SITENAME}} as apen PROXY.',
'sorbs_create_account_reason' => 'Diene IP-Adress steiht in de DNSBL vun {{SITENAME}} as apen PROXY. Du kannst keen Brukerkonto nee opstellen.',
'cant-block-while-blocked' => 'Du kannst kene annern Brukers sperren, wenn du sülvst sperrt büst.',
@@ -2528,10 +2489,7 @@ All Transwiki-Import-Akschonen staht later ok in dat [[Special:Log/import|Import
'pageinfo-category-subcats' => 'TAll vun Ãœnnerkategorien',
# Skin names
-'skinname-standard' => 'Klassik',
-'skinname-nostalgia' => 'Nostalgie',
'skinname-cologneblue' => 'Kölsch Blau',
-'skinname-chick' => 'Küken',
# Patrolling
'markaspatrolleddiff' => 'As nakeken marken',
@@ -2620,7 +2578,7 @@ Wiedere warrt standardmatig nich anwiest:
* gpslongitude
* gpsaltitude',
-# EXIF tags
+# Exif tags
'exif-imagewidth' => 'Breed',
'exif-imagelength' => 'Hööchd',
'exif-bitspersample' => 'Bits je Farvkomponent',
@@ -2738,7 +2696,7 @@ Wiedere warrt standardmatig nich anwiest:
'exif-languagecode' => 'Spraak',
'exif-iimcategory' => 'Kategorie',
-# EXIF attributes
+# Exif attributes
'exif-compression-1' => 'Unkomprimeert',
'exif-unknowndate' => 'Unbekannt Datum',
@@ -3038,7 +2996,6 @@ Du kannst ok de [[Special:EditWatchlist|normale Sied to’n Ännern]] bruken.',
'version-other' => 'Annern Kraam',
'version-mediahandlers' => 'Medien-Handlers',
'version-hooks' => 'Hooks',
-'version-extension-functions' => 'Extension-Funkschonen',
'version-parser-extensiontags' => "Parser-Extensions ''(Tags)''",
'version-parser-function-hooks' => 'Parser-Funkschonen',
'version-hook-name' => 'Hook-Naam',
@@ -3052,14 +3009,6 @@ Du kannst ok de [[Special:EditWatchlist|normale Sied to’n Ännern]] bruken.',
'version-software-version' => 'Version',
'version-entrypoints-header-url' => 'URL',
-# Special:FilePath
-'filepath' => 'Dateipadd',
-'filepath-page' => 'Datei:',
-'filepath-submit' => 'Los',
-'filepath-summary' => 'Disse Spezialsiet gifft den kumpletten Padd för ene Datei trüch. Biller warrt in vull Oplösen wiest, annere Datein warrt glieks mit dat Programm opropen, dat för de Soort Datein instellt is.
-
-Geev den Dateinaam ahn den Tosatz „{{ns:file}}:“ an.',
-
# Special:FileDuplicateSearch
'fileduplicatesearch' => 'Söök na Datein, de jüst gliek sünd',
'fileduplicatesearch-summary' => 'Söök na Datein, de na jemehr Hash-Tallen jüst gliek sünd.',
diff --git a/languages/messages/MessagesNds_nl.php b/languages/messages/MessagesNds_nl.php
index 9b349d47..707bcb35 100644
--- a/languages/messages/MessagesNds_nl.php
+++ b/languages/messages/MessagesNds_nl.php
@@ -147,7 +147,7 @@ $magicWords = array(
'img_middle' => array( '1', 'midden', 'middle' ),
'img_bottom' => array( '1', 'benejen', 'beneden', 'bottom' ),
'img_text_bottom' => array( '1', 'tekste-benejen', 'tekst-beneden', 'text-bottom' ),
- 'img_link' => array( '1', 'verwiezing=$1', 'verwijzing=$1', 'link=$1' ),
+ 'img_link' => array( '1', 'verwiezing=$1', 'verwijzing=$1', 'koppeling=$1', 'link=$1' ),
'sitename' => array( '1', 'WEBSTEENAAM', 'SITENAAM', 'SITENAME' ),
'ns' => array( '0', 'NR:', 'NS:' ),
'localurl' => array( '0', 'LOKALEURL', 'LOCALURL:' ),
@@ -180,7 +180,7 @@ $magicWords = array(
'raw' => array( '0', 'RAUW:', 'RUW:', 'RAW:' ),
'displaytitle' => array( '1', 'TEUNTITEL', 'TOONTITEL', 'TITELTONEN', 'WEERGEGEVENTITEL', 'DISPLAYTITLE' ),
'newsectionlink' => array( '1', '__NIEJESECTIEVERWIEZING__', '__NIEUWESECTIELINK__', '__NIEUWESECTIEKOPPELING__', '__NEWSECTIONLINK__' ),
- 'nonewsectionlink' => array( '1', '__GIENNIEJKOPJENVERWIEZING__', '__GEENNIEUWKOPJEVERWIJZING__', '__GEENNIEUWESECTIELINK__', '__NONEWSECTIONLINK__' ),
+ 'nonewsectionlink' => array( '1', '__GIENNIEJKOPJENVERWIEZING__', '__GEENNIEUWKOPJEVERWIJZING__', '__GEENNIEUWESECTIELINK__', '__GEENNIEUWKOPJEKOPPELING__', '__NONEWSECTIONLINK__' ),
'currentversion' => array( '1', 'DISSEVERSIE', 'HUIDIGEVERSIE', 'CURRENTVERSION' ),
'urlencode' => array( '0', 'URLKODEREN', 'URLCODEREN', 'CODEERURL', 'URLENCODE:' ),
'anchorencode' => array( '0', 'ANKERKODEREN', 'ANKERCODEREN', 'CODEERANKER', 'ANCHORENCODE' ),
@@ -337,9 +337,6 @@ $messages = array(
'tog-shownumberswatching' => 't Antal gebrukers bekieken die disse zied volgt',
'tog-oldsig' => 'Bestaonde haandtekening:',
'tog-fancysig' => 'Ondertekening zien as wikitekste (zonder automatiese verwiezing)',
-'tog-externaleditor' => 'Standard n externe tekstbewarker gebruken (allinnig veur gevorderden - veur disse funksie bin spesiale instellingen neudig. [//www.mediawiki.org/wiki/Manual:External_editors Meer informasie]).',
-'tog-externaldiff' => 'Standard n extern vergeliekingsprogramma gebruken (allinnig veur gevorderden - veur disse funksie bin spesiale instellingen neudig. [//www.mediawiki.org/wiki/Manual:External_editors Meer informasie]).',
-'tog-showjumplinks' => '"Gao naor"-verwiezingen toelaoten',
'tog-uselivepreview' => 'Gebruuk "rechtstreeks naokieken" (experimenteel)',
'tog-forceeditsummary' => 'Geef n melding bie n lege samenvatting',
'tog-watchlisthideown' => 'Verbarg mien eigen bewarkingen',
@@ -353,6 +350,8 @@ $messages = array(
'tog-showhiddencats' => 'Laot verbörgen kategorieën zien',
'tog-noconvertlink' => 'Ziednaamkonversie uutschakelen',
'tog-norollbackdiff' => 'Wiezigingen vortlaoten nao t weerummedreien',
+'tog-useeditwarning' => "Waorschuw mien a'k n bewörken zied aof wil sluten die nog niet op-esleugen is",
+'tog-prefershttps' => "Altied n beveiligde verbiending gebruken a'j an-emeld bin",
'underline-always' => 'Altied',
'underline-never' => 'Nooit',
@@ -416,6 +415,18 @@ $messages = array(
'oct' => 'okt',
'nov' => 'nov',
'dec' => 'des',
+'january-date' => '$1 jannewaori',
+'february-date' => '$1 febrewaori',
+'march-date' => '$1 meert',
+'april-date' => '$1 april',
+'may-date' => '$1 mei',
+'june-date' => '$1 juni',
+'july-date' => '$1 juli',
+'august-date' => '$1 augustus',
+'september-date' => '$1 september',
+'october-date' => '$1 oktober',
+'november-date' => '$1 november',
+'december-date' => '$1 desember',
# Categories related messages
'pagecategories' => '{{PLURAL:$1|Kategorie|Kategorieën}}',
@@ -497,6 +508,7 @@ $messages = array(
'create-this-page' => 'Disse zied anmaken',
'delete' => 'Vortdoon',
'deletethispage' => 'Disse zied vortdoon',
+'undeletethispage' => 'Zied weerummeplaotsen',
'undelete_short' => '$1 {{PLURAL:$1|versie|versies}} weerummeplaotsen',
'viewdeleted_short' => '{{PLURAL:$1|Eén versie die vortedaon is|$1 versies die vortedaon bin}} bekieken',
'protect' => 'Beveiligen',
@@ -540,7 +552,7 @@ $1",
'pool-queuefull' => 'De wachtrie 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).
+# 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).
'aboutsite' => 'Over {{SITENAME}}',
'aboutpage' => 'Project:Info',
'copyright' => 'De inhoud is beschikbaor onder de $1 as der niks aanders an-egeven is.',
@@ -550,7 +562,6 @@ $1",
'disclaimers' => 'Veurbehold',
'disclaimerpage' => 'Project:Veurbehoud',
'edithelp' => 'Hulpe mit bewarken',
-'edithelppage' => 'Help:Uutleg',
'helppage' => 'Help:Inhoud',
'mainpage' => 'Veurblad',
'mainpage-description' => 'Veurblad',
@@ -627,19 +638,12 @@ n Lieste mit bestaonde spesiale ziejen ku'j vienen op [[Special:SpecialPages|{{i
# General errors
'error' => 'Foutmelding',
'databaseerror' => 'Fout in de databanke',
-'dberrortext' => 'Bie t zeuken is n syntaxisfout in de databanke op-etrejen.
-De oorzake hiervan kan dujen op n fout in de programmatuur.
-Der is n syntaxisfout in t databankeverzeuk op-etrejen.
-t Kan ween dat der n fout in de programmatuur zit.
-De leste zeukpoging in de databanke was:
-<blockquote><code>$1</code></blockquote>
-vanuut de funksie "<code>$2</code>".
-De databanke gaf de volgende foutmelding "<samp>$3: $4</samp>".',
-'dberrortextcl' => 'Der is n syntaxisfout in t databankeverzeuk op-etrejen.
-t Leste veurzeuk an de databanke was:
-"$1"
-vanuut de funksie "$2"
-De databanke gaf de volgende foutmelding: "$3: $4"',
+'databaseerror-text' => 'Der is wat mis egaon bie n databankzeukopdrachte.
+Dit kan betekenen dat der n fout in de programmtuur zit.',
+'databaseerror-textcl' => 'Der is wat mis egaon bie n databankzeukopdrachte.',
+'databaseerror-query' => 'Zeukopdrachte: $1',
+'databaseerror-function' => 'Funksie: $1',
+'databaseerror-error' => 'Fout: $1',
'laggedslavemode' => '<strong>Waorschuwing:</strong> t is meugelik dat leste wiezigingen in de tekste van dit artikel nog niet verwarkt bin.',
'readonly' => 'De databanke is beveiligd',
'enterlockreason' => 'Waorumme en veur hoe lange is t eblokkeerd?',
@@ -671,6 +675,7 @@ t Kan ween dat n aander t al vortedaon hef.',
'cannotdelete-title' => 'Zied "$1" kan niet vortedaon wörden',
'delete-hook-aborted' => 't Vortdoon wörden in t wiere eschopt deur n MediaWiki-programmatuuruutbreiding.
Der is gien veerdere informasie beschikbaor.',
+'no-null-revision' => 'Kon gien lege nieje versie maken veur de zied "$1"',
'badtitle' => 'Ongeldige naam',
'badtitletext' => 'De naam van de op-evreugen zied is niet geldig, leeg, of n interwiki-verwiezing naor n onbekende of ongeldige wiki.',
'perfcached' => 'Disse gegevens koemen uut t tussengeheugen en bin misschien niet aktueel. Der {{PLURAL:$1|is hooguut een resultaot|bin hooguut $1 resultaoten}} beschikbaor in t tussengeheugen.',
@@ -689,12 +694,15 @@ Zeukopdrachte: $2',
'protectedinterface' => "Op disse zied steet tekste die gebruukt wörden veur systeemteksten van disse wiki. Allinnig beheerders kunnen disse zied bewarken.
Um vertalingen veur alle wiki's derbie te zetten of te wiezigen, gebruuk [//translatewiki.net/ translatewiki.net], t vertaalprojekt veur MediaWiki.",
'editinginterface' => "'''Waorschuwing:''' je bewarken n zied die gebruukt wörden deur de programmatuur. Wa'j hier wiezigen, is van invleud op de hele wiki. Um vertalingen derbie te zetten of te wiezigen veur alle wiki's, gebruuk [//translatewiki.net/wiki/Main_Page?setlang=nds-nl translatewiki.net], t vertalingsprojekt veur MediaWiki.",
-'sqlhidden' => '(SQL-zeukopdrachte verbörgen)',
'cascadeprotected' => 'Disse zied is beveiligd umdat t veurkömp in de volgende {{PLURAL:$1|zied|ziejen}}, die beveiligd {{PLURAL:$1|is|bin}} mit de "kaskade"-opsie:
$2',
'namespaceprotected' => "Je maggen gien ziejen in de '''$1'''-naamruumte bewarken.",
'customcssprotected' => 'Je kunnen disse CSS-zied niet bewarken, umdat der persoonlike instellingen van n aandere gebruker in staon.',
'customjsprotected' => 'Je kunnen disse JavaScript-zied niet bewarken, umdat der persoonlike instellingen van n aandere gebruker in staon.',
+'mycustomcssprotected' => 'Je hebben gien toestemming um disse CSS-zied te bewarken.',
+'mycustomjsprotected' => 'Je hebben gien rechten um disse JavaScript-zied te bewarken.',
+'myprivateinfoprotected' => 'Je hebben gien rechten um joew priveegegevens an te passen.',
+'mypreferencesprotected' => 'Je hebben gien rechten um joew veurkeuren an te passen.',
'ns-specialprotected' => 'Spesiale ziejen kunnen niet bewarkt wörden.',
'titleprotected' => "t Anmaken van disse zied is beveiligd deur [[User:$1|$1]].
De op-egeven reden is ''$2''.",
@@ -719,10 +727,19 @@ t Kan ween dat der wat ziejen bin die weeregeven wörden as of je an-emeld bin t
'welcomecreation-msg' => 'Joew gebruker is an-emaakt.
Vergeet niet joew [[Special:Preferences|veurkeuren veur {{SITENAME}}]] an te passen.',
'yourname' => 'Gebrukersnaam',
+'userlogin-yourname' => 'Gebrukersnaam',
+'userlogin-yourname-ph' => 'Geef joew gebrukersnaam op',
+'createacct-another-username-ph' => 'Vul de gebrukersnaam in',
'yourpassword' => 'Wachtwoord',
+'userlogin-yourpassword' => 'Wachtwoord',
+'userlogin-yourpassword-ph' => 'Geef joew wachtwoord op',
+'createacct-yourpassword-ph' => 'Geef n wachtwoord op',
'yourpasswordagain' => 'Opniej invoeren',
+'createacct-yourpasswordagain' => 'Wachtwoord bevestigen',
+'createacct-yourpasswordagain-ph' => 'Geef t wachtwoord opniej op',
'remembermypassword' => 'Vanzelf anmelden (hooguut $1 {{PLURAL:$1|dag|dagen}})',
-'securelogin-stick-https' => "Verbunnen blieven via HTTPS naoda'j an-emeld bin",
+'userlogin-remembermypassword' => 'Vanzelf anmelden',
+'userlogin-signwithsecure' => 'Beveiligde verbiending gebruken',
'yourdomainname' => 'Joew domein',
'password-change-forbidden' => 'Je kunnen joew wachtwoord niet wiezigen op disse wiki.',
'externaldberror' => 'Der gung iets fout bie de externe authentisering, of je maggen je gebrukersprofiel niet bewarken.',
@@ -734,18 +751,44 @@ Vergeet niet joew [[Special:Preferences|veurkeuren veur {{SITENAME}}]] an te pas
'logout' => 'Aofmelden',
'userlogout' => 'Aofmelden',
'notloggedin' => 'Niet an-emeld',
+'userlogin-noaccount' => "He'j nog gien gebrukersnaam?",
+'userlogin-joinproject' => 'Wörd lid van {{SITENAME}}',
'nologin' => "He'j nog gien gebrukersnaam? $1.",
'nologinlink' => 'Maak n gebrukersprofiel an',
'createaccount' => 'Inschrieven',
'gotaccount' => "Stao'j al in-eschreven? '''$1'''.",
'gotaccountlink' => 'Anmelden',
'userlogin-resetlink' => "Bi'j de anmeldgegevens kwiet?",
+'userlogin-resetpassword-link' => 'Joew wachtwoord opniej instellen',
+'helplogin-url' => 'Help:Anmelden',
+'userlogin-helplink' => '[[{{MediaWiki:helplogin-url}}|Hulpe bie t anmelden]]',
+'userlogin-loggedin' => 'Je bin al an-emeld as {{GENDER:$1|$1}}.
+Gebruuk t onderstaonde formulier um an te melden as n aandere gebruker.',
+'userlogin-createanother' => 'n Aandere gebrukerskonto anmaken',
+'createacct-join' => 'Geef joew gegevens hieronder op.',
+'createacct-another-join' => 'Vul hieronder de informasie van de nieje gebruker in.',
+'createacct-emailrequired' => 'Netpostadres',
+'createacct-emailoptional' => 'Netpostadres (niet verplicht)',
+'createacct-email-ph' => 'Geef joew netpostadres op',
+'createacct-another-email-ph' => 'Vul joew netpostadres in',
'createaccountmail' => 'Gebruuk n tiejelik wachtwoord dat joe netzelde is en stuur t naor t op-egeven netpostadres',
+'createacct-realname' => 'Echte naam (niet verplicht)',
'createaccountreason' => 'Reden:',
+'createacct-reason' => 'Reden',
+'createacct-reason-ph' => 'Waorumme je n aandere gebrukerskonto anmaken',
+'createacct-captcha' => 'Veiligheidskontraole',
+'createacct-imgcaptcha-ph' => "Voer de tekste in die'j hierboven zien",
+'createacct-submit' => 'Gebrukerskonto anmaken',
+'createacct-another-submit' => 'n Aandere gebrukerskonto anmaken',
+'createacct-benefit-heading' => '{{SITENAME}} wörden emaakt deur meensen zo as jie.',
+'createacct-benefit-body1' => 'bewarking{{PLURAL:$1||en}}',
+'createacct-benefit-body2' => '{{PLURAL:$1|zied|ziejen}}',
+'createacct-benefit-body3' => 'aktieve {{PLURAL:$1|biedrager|biedragers}}',
'badretype' => "De wachtwoorden die'j in-etikt hebben bin niet liek alleens.",
'userexists' => 'Disse gebrukersnaam is al gebruuk.
Kies n aandere naam.',
'loginerror' => 'Anmeldingsfout',
+'createacct-error' => 'Fout bie t anmaken van n gebruker',
'createaccounterror' => 'Kon de gebrukersnaam niet anmaken: $1',
'nocookiesnew' => 'De gebrukersnaam is an-emaakt, mer je bin niet an-emeld.
{{SITENAME}} gebruuk scheumbestaanden (cookies) um gebrukers an te melden.
@@ -806,10 +849,12 @@ Meld je eigen noen an en wiezig t wachtwoord.
Negeer dit bericht as disse gebruker zonder joew toestemming an-emaakt is.',
'usernamehasherror' => "In n gebrukersnaam ma'j gien hekjen gebruken.",
'login-throttled' => "Je hebben lestens te vake eprobeerd um an te melden mit n verkeerd wachtwoord.
-Je mutten effen wachten veurda'j t opniej proberen kunnen.",
+Je mutten effen $1 wachten veurda'j t opniej proberen.",
'login-abort-generic' => 'Je bin niet an-emeld. De procedure is aofebreuken.',
'loginlanguagelabel' => 'Taal: $1',
'suspicious-userlogout' => 'Joew verzeuk um of te melden is aofewezen umdat t dernaor uutziet dat t verstuurd is deur n kepotte webkieker of tussenopslagbuffer',
+'createacct-another-realname-tip' => "Joew echte naam opgeven is niet verplicht.
+A'j t invullen, dan zu'w t gebruken um erkenning te geven veur joew warkzaamhejen.",
# Email sending
'php-mail-error-unknown' => 'Der was n onbekende fout mit de mail()-funksie van PHP',
@@ -825,8 +870,7 @@ Je mutten effen wachten veurda'j t opniej proberen kunnen.",
'newpassword' => 'Niej wachtwoord',
'retypenew' => 'Niej wachtwoord (opniej)',
'resetpass_submit' => 'Voer t wachtwoord in en meld je an',
-'resetpass_success' => 'Joew wachtwoord is ewiezigd!
-Je wörden noen an-emeld...',
+'changepassword-success' => 'Joew wachtwoord is ewiezigd!',
'resetpass_forbidden' => 'Wachtwoorden kunnen niet ewiezigd wörden',
'resetpass-no-info' => "Je mutten an-emeld ween veurda'j disse zied gebruken kunnen.",
'resetpass-submit-loggedin' => 'Wachtwoord wiezigen',
@@ -838,10 +882,11 @@ Misschien he'j t wachtwoord al ewiezigd of n niej veurlopig wachtwoord an-evreug
# Special:PasswordReset
'passwordreset' => 'Wachtwoord opniej instellen',
-'passwordreset-text' => 'Vul dit formulier in um joew wachtwoord opniej in te stellen.',
+'passwordreset-text-one' => 'Vul dit formulier in um joew wachtwoord opniej in te stellen.',
+'passwordreset-text-many' => '{{PLURAL:$1|Vul een van de gegevensvelden in um joew wachtwoord opniej in te stellen.}}',
'passwordreset-legend' => 'Wachtwoord opniej instellen',
'passwordreset-disabled' => 'Je kunnen op disse wiki joew wachtwoord niet opniej instellen.',
-'passwordreset-pretext' => '{{PLURAL:$1||Voer één van de onderstaonde velden in}}',
+'passwordreset-emaildisabled' => 'Netpostmeugelikhejen bin uutezet op disse wiki.',
'passwordreset-username' => 'Gebruker:',
'passwordreset-domain' => 'Domein:',
'passwordreset-capture' => 'De resulterende netpost bekieken?',
@@ -866,7 +911,7 @@ Meld je eigen noen an en wiezig t wachtwoord. A'j dit verzeuk niet zelf edaon he
Tiedelik wachtwoord: $2',
'passwordreset-emailsent' => 'Der is n bericht verstuurd um t wachtwoord opniej in te stellen.',
'passwordreset-emailsent-capture' => "Der is n bericht verstuurd um joew wachtwoord opniej in te stellen. Dit ku'j hieronder lezen.",
-'passwordreset-emailerror-capture' => "Der is n bericht veur t opniej instellen van joew wachtwoord an-emaakt, dit ku'j hieronder lezen. t Versturen naor de gebruker is mislokt um de volgende reden: $1",
+'passwordreset-emailerror-capture' => "Der is n bericht veur t opniej opstellen van joew wachwoord an-emaakt, dit ku'j hieronder lezen. t Versturen naor de {{GENDER:$2|gebruker}} is mislokt um de volgende reden: $1",
# Special:ChangeEmail
'changeemail' => 'Wiezig netpostadres',
@@ -880,6 +925,19 @@ Tiedelik wachtwoord: $2',
'changeemail-submit' => 'Netpostadres wiezigen',
'changeemail-cancel' => 'Aofbreken',
+# Special:ResetTokens
+'resettokens' => 'Tokens ongedaonmaken',
+'resettokens-text' => "Je kunnen hier tokens opniej instellen die toegang geven tot bepaolde persoonlike gegevens die ekoppeld bin an joew gebruker.
+
+Do dit a'j ze per ongelok mit ene edeeld hebben of as onbevoegden toegang ekregen hebben tot joew gebruker.",
+'resettokens-no-tokens' => 'Der bin gien tokens um ongedaon te maken.',
+'resettokens-legend' => 'Tokens ongedaonmaken',
+'resettokens-tokens' => 'Tokens:',
+'resettokens-token-label' => '$1 (aktuele weerde: $2)',
+'resettokens-watchlist-token' => 'Token veur webvoer (Atom/RSS) van [[Special:Watchlist|wiezigingen van ziejen die joew volglieste staon]]',
+'resettokens-done' => 'Tokens ongedaonmaken.',
+'resettokens-resetbutton' => 'Ekeuzen tokens ongedaonmaken',
+
# Edit page toolbar
'bold_sample' => 'Vet-edrokten tekste',
'bold_tip' => 'Vet-edrokten tekste',
@@ -1074,12 +1132,15 @@ Der is gien reden op-egeven.',
t Schient dat t vortedaon is.',
'edit-conflict' => 'Tegelieke bewörken.',
'edit-no-change' => 'Joew bewarking is enegeerd, umdat der gien wieziging an de tekste edaon is.',
+'postedit-confirmation' => 'Joew bewarking is op-esleugen',
'edit-already-exists' => 'De zied kon niet an-emaakt wörden.
t Besteet al.',
'defaultmessagetext' => 'Standardtekste',
'content-failed-to-parse' => 'Kon de inhoud van t MIME-type $2 veur t model $1 niet verwarken: $3.',
'invalid-content-data' => 'Ongeldige inhoudsgegevens',
'content-not-allowed-here' => 'De inhoud "$1" is niet toe-estaan op de zied [[$2]].',
+'editwarning-warning' => "A'j disse zied verlaoten dan bi'j de wieziging die'j emaakt hebben waorschienlik kwiet.
+A'j an-emeld bin, dan ku'j disse waorschuwing uutzetten in t tabblad \"Bewarkingsveld\" in joew veurkeuren.",
# Content models
'content-model-wikitext' => 'wikitekste',
@@ -1113,6 +1174,7 @@ Sommigen mallen wörden niet in-evoegd.',
'undo-failure' => 'De wieziging kon niet weerummedreid wörden umdat t ondertussen awweer ewiezigd is.',
'undo-norev' => 'De bewarking kon niet weerummedreid wörden, umdat t niet besteet of vortedaon is.',
'undo-summary' => 'Versie $1 van [[Special:Contributions/$2|$2]] ([[User talk:$2|overleg]]) weerummedreid.',
+'undo-summary-username-hidden' => 'Versie $1 deur n verbörgen gebruker weerummedreid',
# Account creation failure
'cantcreateaccounttitle' => 'Anmaken van n gebrukersprofiel is niet meugelik',
@@ -1287,6 +1349,7 @@ In de [[Special:BlockList|blokkeerlieste]] bin de blokkeringen, die noen van toe
'compareselectedversions' => 'Vergeliek de ekeuzen versies',
'showhideselectedversions' => 'Ekeuzen versies bekieken/verbargen',
'editundo' => 'weerummedreien',
+'diff-empty' => '(Gien verschil)',
'diff-multi' => '(Hier {{PLURAL:$1|zit nog 1 versie|zitten nog $1 versies}} van {{PLURAL:$2|1 gebruker|$2 gebrukers}} tussen die der niet bie staon.)',
'diff-multi-manyusers' => '($1 tussenliggende {{PLURAL:$1|versie|versies}} deur meer as $2 {{PLURAL:$2|gebruker|gebrukers}} niet weeregeven)',
'difference-missing-revision' => "{{PLURAL:$2|Eén versie|$2 versies}} van disse verschillen ($1) {{PLURAL:$2|is|bin}} niet evunnen.
@@ -1314,7 +1377,6 @@ Waorschienlik ku'j der meer gegevens over vienen in t [{{fullurl:{{#Special:Log}
'searchmenu-legend' => 'Zeukopsies',
'searchmenu-exists' => "'''Der is n zied mit de naam \"[[:\$1]]\" op disse wiki.'''",
'searchmenu-new' => "'''De zied \"[[:\$1]]\" op disse wiki anmaken!'''",
-'searchhelp-url' => 'Help:Inhold',
'searchmenu-prefix' => '[[Special:PrefixIndex/$1|Ziednamen mit dit veurvoegsel laoten zien]]',
'searchprofile-articles' => 'Artikels',
'searchprofile-project' => 'Hulp- en projektziejen',
@@ -1355,15 +1417,7 @@ Waorschienlik ku'j der meer gegevens over vienen in t [{{fullurl:{{#Special:Log}
'powersearch-togglenone' => 'Gien',
'search-external' => 'Extern zeuken',
'searchdisabled' => 'Zeuken in {{SITENAME}} is niet meugelik. Je kunnen gebruukmaken van Google. De gegevens over {{SITENAME}} bin misschien niet bie-ewörken.',
-
-# Quickbar
-'qbsettings' => 'Lieste mit ziejen',
-'qbsettings-none' => 'Gien',
-'qbsettings-fixedleft' => 'Links, vaste',
-'qbsettings-fixedright' => 'Rechts, vaste',
-'qbsettings-floatingleft' => 'Links, zweven',
-'qbsettings-floatingright' => 'Rechts, zweven',
-'qbsettings-directionality' => 'Vaste, aofhankelik van de schriefrichtige van joew taal',
+'search-error' => 'Der is wat mis-egaon bie t zeuken: $1',
# Preferences page
'preferences' => 'Veurkeuren',
@@ -1397,7 +1451,6 @@ Waorschienlik ku'j der meer gegevens over vienen in t [{{fullurl:{{#Special:Log}
'resetprefs' => 'Standardveurkeuren herstellen',
'restoreprefs' => 'Alle standardinstellingen weerummezetten (veur alle seksies)',
'prefs-editing' => 'Bewarkingsveld',
-'prefs-edit-boxsize' => 'Aofmetingen van t bewarkingsvienster.',
'rows' => 'Regels',
'columns' => 'Kolommen',
'searchresultshead' => 'Zeukresultaoten',
@@ -1408,9 +1461,9 @@ Waorschienlik ku'j der meer gegevens over vienen in t [{{fullurl:{{#Special:Log}
'recentchangesdays-max' => '(hooguut $1 {{PLURAL:$1|dag|dagen}})',
'recentchangescount' => 'Standard antal bewarkingen um te laoten zien:',
'prefs-help-recentchangescount' => 'Dit geldt veur leste wiezigingen, ziedgeschiedenisse en logboekziejen',
-'prefs-help-watchlist-token' => "A'j in dit veld n geheime kode invullen, dan maakt t RSS-voer an veur joew volglieste.
-Iederene die disse kode weet kan joew volglieste bekieken, kies dus n veilige kode.
-Je kunnen oek disse egenereren standardkode gebruken: $1",
+'prefs-help-watchlist-token2' => "Dit is de geheime sleutel veur de webvoer van joew volglieste.
+Iederene die t token kent, kan joew volglieste bekieken, dus deel dit token niet.
+Je kunnen de [[Special:ResetTokens|tokens opniej instellen]] a'j dat willen.",
'savedprefs' => 'Veurkeuren bin op-esleugen.',
'timezonelegend' => 'Tiedzone:',
'localtime' => 'Plaotselike tied:',
@@ -1441,7 +1494,6 @@ Je kunnen oek disse egenereren standardkode gebruken: $1",
'prefs-reset-intro' => 'Je kunnen disse zied gebruken um joew veurkeuren naor de standardinstellingen weerumme te zetten.
Disse haandeling kan niet ongedaonemaakt wörden.',
'prefs-emailconfirm-label' => 'Netpostbevestiging:',
-'prefs-textboxsize' => 'Aofmetingen bewarkingsscharm',
'youremail' => 'Netpostadres (niet verplicht) *',
'username' => '{{GENDER:$1|Gebrukersnaam}}:',
'uid' => '{{GENDER:$1|Gebrukersnummer}}:',
@@ -1475,6 +1527,8 @@ Disse informasie is zichtbaor veur aandere gebrukers.',
'prefs-dateformat' => 'Daotumopmaak:',
'prefs-timeoffset' => 'Tiedsverschil',
'prefs-advancedediting' => 'Algemene opsies',
+'prefs-editor' => 'Bewarkingsprogramma',
+'prefs-preview' => 'Naokieken',
'prefs-advancedrc' => 'Aandere instellingen',
'prefs-advancedrendering' => 'Aandere instellingen',
'prefs-advancedsearchoptions' => 'Aandere instellingen',
@@ -1482,7 +1536,9 @@ Disse informasie is zichtbaor veur aandere gebrukers.',
'prefs-displayrc' => 'Weergave-instellingen',
'prefs-displaysearchoptions' => 'Weergave-instellingen',
'prefs-displaywatchlist' => 'Weergave-instellingen',
+'prefs-tokenwatchlist' => 'Token',
'prefs-diffs' => 'Verschillen',
+'prefs-help-prefershttps' => "Disse veurkeur wörden toe-epast a'j je eigen de volgende keer anmelden.",
# User preference: email validation using jQuery
'email-address-validity-valid' => 'Geldig netpostadres',
@@ -1509,6 +1565,8 @@ Disse informasie is zichtbaor veur aandere gebrukers.',
'userrights-notallowed' => 'Je hebben gien rechten um gebrukersrechten toe te kunnen wiezen of in te trekken.',
'userrights-changeable-col' => "Groepen die'j beheren kunnen",
'userrights-unchangeable-col' => "Groepen die'j niet beheren kunnen",
+'userrights-conflict' => 'Konflikt bie t wiezigen van gebrukersrechten! Kiek joew wiezigingen nao en bevestig t.',
+'userrights-removed-self' => 'Je hebben joew eigen bevoegdhejen in-etrökken. Je kunnen disse zied niet meer gebruken.',
# Groups
'group' => 'Groep:',
@@ -1574,11 +1632,19 @@ Disse informasie is zichtbaor veur aandere gebrukers.',
'right-proxyunbannable' => "Blokkeringen veur proxy's gelden niet",
'right-unblockself' => 'Eigen gebruker deblokkeren',
'right-protect' => "Beveiligingsnivo's wiezigen",
-'right-editprotected' => 'Beveiligden ziejen bewarken',
+'right-editprotected' => 'Ziejen bewarken die beveiligd bin as "{{int:protect-level-sysop}}"',
+'right-editsemiprotected' => 'Ziejen bewarken die beveiligd bin as "{{int:protect-level-autoconfirmed}}"',
'right-editinterface' => 'Systeemteksten bewarken',
'right-editusercssjs' => 'De CSS- en JS-bestaanden van aandere gebrukers bewarken',
'right-editusercss' => 'De CSS-bestaanden van aandere gebrukers bewarken',
'right-edituserjs' => 'De JS-bestaanden van aandere gebrukers bewarken',
+'right-editmyusercss' => 'Joew eigen CSS-ziejen bewarken',
+'right-editmyuserjs' => 'Joew eigen JavaScript-ziejen bewarken',
+'right-viewmywatchlist' => 'Joew eigen volglieste bekieken',
+'right-editmywatchlist' => 'Joew eigen volglieste bewarken. Via sommige haandelingen kunnen nog altied ziejen derbie ezet wörden, zelfs zonder disse bevoegdheid',
+'right-viewmyprivateinfo' => 'Joew eigen priveegegevens bekieken (bieveurbeeld netpostadres, echte naam)',
+'right-editmyprivateinfo' => 'Joew eigen priveegegevens bewarken (bieveurbeeld netpostadres, echte naam)',
+'right-editmyoptions' => 'Joew eigen veurkeuren bewarken',
'right-rollback' => 'Gauw de leste bewarking(en) van n gebruker an n zied weerummedreien',
'right-markbotedits' => 'Weerummedreien bewarkingen markeren as botbewarkingen',
'right-noratelimit' => 'Hef gien tiedsaofhankelike beparkingen',
@@ -1640,12 +1706,19 @@ Disse informasie is zichtbaor veur aandere gebrukers.',
'action-userrights-interwiki' => "de rechten van gebrukers op aandere wiki's bewarken",
'action-siteadmin' => 'de databanke blokkeren of vriegeven',
'action-sendemail' => 'netpostberichten versturen',
+'action-editmywatchlist' => 'joew eigen volglieste bewarken',
+'action-viewmywatchlist' => 'joew eigen volglieste bekieken',
+'action-viewmyprivateinfo' => 'joew eigen priveegegevens bekieken',
+'action-editmyprivateinfo' => 'joew eigen priveegegevens bewarken',
# Recent changes
'nchanges' => '$1 {{PLURAL:$1|wieziging|wiezigingen}}',
+'enhancedrc-since-last-visit' => '$1 {{PLURAL:$1|sinds joew leste bezeuk}}',
+'enhancedrc-history' => 'geschiedenisse',
'recentchanges' => 'Leste wiezigingen',
'recentchanges-legend' => 'Opsies veur leste wiezigingen',
'recentchanges-summary' => "Op disse zied ku'j de leste wiezigingen van disse wiki bekieken.",
+'recentchanges-noresult' => 'Der waren in disse periode gien wiezigingen die an de kriteria voldoon.',
'recentchanges-feed-description' => 'Zeuk naor de alderleste wiezingen op disse wiki in disse voer.',
'recentchanges-label-newpage' => 'Mit disse bewarking is n nieje zied an-emaakt',
'recentchanges-label-minor' => 'Dit is n kleine wieziging',
@@ -1683,7 +1756,6 @@ Disse informasie is zichtbaor veur aandere gebrukers.',
'recentchangeslinked-feed' => 'Volg verwiezigingen',
'recentchangeslinked-toolbox' => 'Volg verwiezigingen',
'recentchangeslinked-title' => 'Wiezigingen verwaant an $1',
-'recentchangeslinked-noresult' => 'Gien wiezigingen of zied waornaor verwezen wörden in disse periode.',
'recentchangeslinked-summary' => "Op disse spesiale zied steet n lieste mit de leste wieziginen op ziejen waornaor verwezen wörden. Ziejen op [[Special:Watchlist|joew volglieste]] staon '''vet-edrokt'''.",
'recentchangeslinked-page' => 'Ziednaam:',
'recentchangeslinked-to' => 'Bekiek wiezigingen op ziejen mit verwiezingen naor disse zied',
@@ -1694,7 +1766,7 @@ Disse informasie is zichtbaor veur aandere gebrukers.',
'reuploaddesc' => 'Weerumme naor de opstuurzied',
'upload-tryagain' => 'Bestaandsbeschrieving biewarken',
'uploadnologin' => 'Niet an-emeld',
-'uploadnologintext' => 'Je mutten [[Special:UserLogin|an-emeld]] ween um bestaanden toe te kunnen voegen.',
+'uploadnologintext' => 'Je mutten $1 ween um bestaanden op te kunnen sturen.',
'upload_directory_missing' => 'De inlaojmap veur bestaanden ($1) is vort en kon niet an-emaakt wörden deur de webserver.',
'upload_directory_read_only' => "Op t moment ku'j gien bestaanden opsturen vanwegen techniese problemen ($1).",
'uploaderror' => 'Fout bie t inlaojen van t bestaand',
@@ -1910,7 +1982,6 @@ Um beveiligingsredens is img_auth.php uutezet.',
'http-read-error' => 'Fout bie t lezen van HTTP',
'http-timed-out' => 'Tiedsoverschriejing bie t HTTP-verzeuk',
'http-curl-error' => 'Fout bie t ophaolen van t webadres: $1',
-'http-host-unreachable' => 'Kon webadres niet bereiken.',
'http-bad-status' => 'Der is n probleem mit t HTTP-verzeuk: $1 $2',
# Some likely curl errors. More could be added from <http://curl.haxx.se/libcurl/c/libcurl-errors.html>
@@ -1938,6 +2009,10 @@ Um beveiligingsredens is img_auth.php uutezet.',
'listfiles_size' => 'Grootte (bytes)',
'listfiles_description' => 'Beschrieving',
'listfiles_count' => 'Versies',
+'listfiles-show-all' => 'Ouwe versies van aofbeeldingen opnemen',
+'listfiles-latestversion' => 'Aktuele versie',
+'listfiles-latestversion-yes' => 'Ja',
+'listfiles-latestversion-no' => 'Nee',
# File description page
'file-anchor-link' => 'Bestaand',
@@ -2031,6 +2106,13 @@ Vergeet niet de verwiezingen nao te kieken veurda\'j de mal vortdoon.',
'randompage' => 'Netzelde welk artikel',
'randompage-nopages' => 'Der staon gien ziejen in de {{PLURAL:$2|naamruumte|naamruumtes}}: $1.',
+# Random page in category
+'randomincategory' => 'Netzelde welke zied in n kategorie',
+'randomincategory-invalidcategory' => '"$1" is gien geldige kategorienaam.',
+'randomincategory-nopages' => 'Der bin gien ziejen in [[:Category:$1]].',
+'randomincategory-selectcategory' => 'Netzelde welke zied uut de kategorie: $1 $2',
+'randomincategory-selectcategory-submit' => 'Laot kulen',
+
# Random redirect
'randomredirect' => 'Netzelde welke deurverwiezing',
'randomredirect-nopages' => 'Der staon gien deurverwiezingen in de naamruumte "$1".',
@@ -2056,17 +2138,13 @@ Vergeet niet de verwiezingen nao te kieken veurda\'j de mal vortdoon.',
'statistics-users-active-desc' => 'Gebrukers die de veurbieje {{PLURAL:$1|dag|$1 dagen}} n haandeling uutevoerd hebben',
'statistics-mostpopular' => 'Meestbekeken ziejen',
-'disambiguations' => 'Ziejen die verwiezen naor deurverwiesziejen',
-'disambiguationspage' => 'Template:Dv',
-'disambiguations-text' => "Hieronder staon ziejen mit tenminsten één verwiezing naor n '''deurverwieszied'''.
-Feitelik mutten ze rechtstreeks verwiezen naor t juuste onderwarp.<br />
-Ziejen wörden ezien as n deurverwieszied, as de mal gebruukt wörden die vermeld steet op [[MediaWiki:Disambiguationspage]].",
-
'pageswithprop' => 'Ziejen mit n ziedeigenschap',
'pageswithprop-legend' => 'Ziejen mit n zied-eigenschap',
'pageswithprop-text' => 'Op disse zied staon ziejen mit n bepaolde ziedeigenschap.',
'pageswithprop-prop' => 'Naam van de eigenschap:',
'pageswithprop-submit' => 'Zeuk',
+'pageswithprop-prophidden-long' => 'lange teksteigenschapsweerde verbörgen ($1)',
+'pageswithprop-prophidden-binary' => 'binaere eigenschapsweerde verbörgen ($1)',
'doubleredirects' => 'Dubbele deurverwiezingen',
'doubleredirectstext' => 'Op disse lieste staon alle ziejen die deurverwiezen naor aandere deurverwiezingen.
@@ -2124,6 +2202,7 @@ Meestentieds is leste zied de gewunste doelzied, waor oek de eerste zied heer zo
'mostrevisions' => 'Artikels mit de meeste bewarkingen',
'prefixindex' => 'Alle ziejen op veurvoegsel',
'prefixindex-namespace' => 'Alle ziejen mit t veurvoegsel (naamruumte $1)',
+'prefixindex-strip' => 'Veurvoegsel in lieste vortdoon',
'shortpages' => 'Korte artikels',
'longpages' => 'Lange artikels',
'deadendpages' => 'Ziejen zonder verwiezingen',
@@ -2139,6 +2218,7 @@ Meestentieds is leste zied de gewunste doelzied, waor oek de eerste zied heer zo
'listusers' => 'Gebrukerslieste',
'listusers-editsonly' => 'Allinnig gebrukers mit bewarkingen laoten zien',
'listusers-creationsort' => 'Sorteren op inschriefdaotum',
+'listusers-desc' => 'Sorteren in aoflopende volgorde',
'usereditcount' => '$1 {{PLURAL:$1|bewarking|bewarkingen}}',
'usercreated' => '{{GENDER:$3|Eregistreerd}} op $1 um $2',
'newpages' => 'Nieje artikels',
@@ -2319,10 +2399,9 @@ Toekomstige wiezigingen op disse zied en de overlegzied zullen hier vermeld wör
'unwatchthispage' => 'Niet volgen',
'notanarticle' => 'Gien artikel',
'notvisiblerev' => 'Bewarking is vortedaon',
-'watchnochange' => 'Gien van de ziejen op joew volglieste is in disse periode ewiezigd',
'watchlist-details' => 'Der {{PLURAL:$1|steet één zied|staon $1 ziejen}} op joew volglieste, zonder de overlegziejen mee-erekend.',
'wlheader-enotif' => 'Je kriegen bericht per netpost',
-'wlheader-showupdated' => "* Ziejen die sinds joew leste bezeuk bie-ewörken bin, staon '''vet-edrokt'''.",
+'wlheader-showupdated' => "Ziejen die sinds joew leste bezeuk bie-ewörken bin, staon '''vet-edrokt'''.",
'watchmethod-recent' => "leste wiezigingen an t naokieken op ziejen die'j volgen",
'watchmethod-list' => 'Kik joew nao volglieste veur de leste wiezigingen',
'watchlistcontains' => 'Der {{PLURAL:$1|steet 1 zied|staon $1 ziejen}} op joew volglieste.',
@@ -2566,7 +2645,7 @@ $1',
'contributions' => '{{GENDER:$1|Biedragen van disse gebruker}}',
'contributions-title' => 'Biedragen van $1',
'mycontris' => 'Mien biedragen',
-'contribsub2' => 'Veur $1 ($2)',
+'contribsub2' => 'Veur {{GENDER:$3|$1}} ($2)',
'nocontribs' => 'Gien wiezigingen evunnen die an de estelde criteria voldoon.',
'uctop' => '(leste wieziging)',
'month' => 'Maond:',
@@ -2723,14 +2802,12 @@ Wi'j de instellingen wiezigen?",
De blokkering is onderdeel van de reeks $2, waorvan de blokkering wel op-eheven kan wörden.',
'ip_range_invalid' => 'Ongeldige IP-reeks',
'ip_range_toolarge' => 'Groeps-IP-adressen die groter bin as /$1, bin niet toe-estaon.',
-'blockme' => 'Mien blokkeren',
'proxyblocker' => 'Proxyblokker',
-'proxyblocker-disabled' => 'Disse funksie is uutezet.',
'proxyblockreason' => "Dit is n automatiese preventieve blokkering umda'j gebruukmaken van n open proxyserver.",
-'proxyblocksuccess' => 'Suksesvol.',
'sorbsreason' => "Joew IP-adres is op-eneumen as open proxyserver in de zwarte lieste van DNS die'w veur {{SITENAME}} gebruken.",
'sorbs_create_account_reason' => "Joew IP-adres is op-eneumen as open proxyserver in de zwarte lieste van DNS, die'w veur {{SITENAME}} gebruken.
Je kunnen gien gebrukerszied anmaken.",
+'xffblockreason' => "n IP-adres dat jie gebruken is eblokkeerd. Dit steet in de kop 'X-Forwarded-For'. De oorspronkelike reden veur de blokkerings is: $1",
'cant-block-while-blocked' => "Je kunnen aandere gebrukers niet blokkeren a'j zelf oek eblokkeerd bin.",
'cant-see-hidden-user' => "De gebruker die'j proberen te blokkeren is al eblokkeerd en verbörgen.
Umda'j gien rech hebben um gebrukers te verbargen, ku'j de blokkering van de gebruker niet bekieken of bewarken.",
@@ -2889,6 +2966,8 @@ Kiek oek effen bie [//www.mediawiki.org/wiki/Localisation MediaWiki-lokalisasie]
'thumbnail-more' => 'vergroten',
'filemissing' => 'Bestaand ontbrik',
'thumbnail_error' => 'Fout bie t laojen van de miniatuuraofbeelding: $1',
+'thumbnail_error_remote' => 'Foutmelding van $1:
+$2',
'djvu_page_error' => 'DjVu-zied buten bereik',
'djvu_no_xml' => 'Kon de XML-gegevens veur t DjVu-bestaand niet oproepen',
'thumbnail-temp-create' => 'Kon gien tiedelik miniatuurbestaand anmaken.',
@@ -3038,6 +3117,7 @@ De tiedelike map is niet anwezig.',
Iej könt in de bewearkingssamenvatting n reden opgeven.',
'tooltip-preferences-save' => 'Vuurkeuren opsloan',
'tooltip-summary' => 'Voer ne korte samenvatting in',
+'tooltip-iwiki' => '$1 – $2',
# Metadata
'notacceptable' => 'De wikiserver kan de gegevens niet leveren in n vorm die joew kliënt kan lezen.',
@@ -3111,13 +3191,8 @@ Meestentieds kömp dit deur n uutgaonde verwiezing die op de zwarte lieste steet
'pageinfo-category-files' => 'Antal bestaanden',
# Skin names
-'skinname-standard' => 'Klassiek',
-'skinname-nostalgia' => 'Nostalgie',
'skinname-cologneblue' => 'Keuls blauw',
'skinname-monobook' => 'Monobook',
-'skinname-myskin' => 'MienSkin',
-'skinname-chick' => 'Deftig',
-'skinname-simple' => 'Eenvoudig',
'skinname-modern' => 'Niejmoeds',
# Patrolling
@@ -3195,11 +3270,25 @@ $1',
'minutes' => '{{PLURAL:$1|$1 minuut|$1 minuten}}',
'hours' => '{{PLURAL:$1|$1 ure|$1 uren}}',
'days' => '{{PLURAL:$1|$1 dag|$1 dagen}}',
+'weeks' => '{{PLURAL: $1|één weke|$1 weken}}',
'months' => '{{PLURAL:$1|een maond|$1 maonden}}',
'years' => '{{PLURAL:$1|één jaor|$1 jaor}}',
'ago' => '$1 eleen',
'just-now' => 'onderlest',
+# Human-readable timestamps
+'hours-ago' => '$1 {{PLURAL:$1|uur}} elejen',
+'minutes-ago' => '$1 {{PLURAL:$1|minuut|minuten}} elejen',
+'seconds-ago' => '$1 {{PLURAL:$1|sekonde|sekonden}} elejen',
+'monday-at' => 'Maondag um $1',
+'tuesday-at' => 'Diensdag um $1',
+'wednesday-at' => 'Woonsdag um $1',
+'thursday-at' => 'Donderdag um $1',
+'friday-at' => 'Vriedag um $1',
+'saturday-at' => 'Zaoterdag um $1',
+'sunday-at' => 'Zundag um $1',
+'yesterday-at' => 'Gisteren um $1',
+
# Bad image list
'bad_image_list' => 'De opmaak is as volgt:
@@ -3228,7 +3317,7 @@ Aandere velden wörden verbörgen.
* gpslongitude
* gpsaltitude',
-# EXIF tags
+# Exif tags
'exif-imagewidth' => 'Wiedte',
'exif-imagelength' => 'Heugte',
'exif-bitspersample' => 'Bits per komponent',
@@ -3406,7 +3495,7 @@ Aandere velden wörden verbörgen.
'exif-originalimageheight' => 'Heugte van de aofbeelding veur biesniejen',
'exif-originalimagewidth' => 'Breedte van de aofbeelding veur biesniejen',
-# EXIF attributes
+# Exif attributes
'exif-compression-1' => 'Niet ekomprimeerd',
'exif-compression-2' => 'CCITT-groep 3 1-dimensionale an-epasten "Huffman run length"-kodering',
'exif-compression-3' => 'CCITT-groep 3 faxcodering',
@@ -3793,7 +3882,6 @@ Je kunnen oek [[Special:EditWatchlist|t standardbewarkingsscharm gebruken]].',
'version-other' => 'Overige',
'version-mediahandlers' => 'Mediaverwarkers',
'version-hooks' => 'Hoeken',
-'version-extension-functions' => 'Uutbreidingsfunksies',
'version-parser-extensiontags' => 'Parseruutbreidingsplaotjes',
'version-parser-function-hooks' => 'Parserfunksiehoeken',
'version-hook-name' => 'Hooknaam',
@@ -3802,6 +3890,7 @@ Je kunnen oek [[Special:EditWatchlist|t standardbewarkingsscharm gebruken]].',
'version-license' => 'Lisensie',
'version-poweredby-credits' => "Disse wiki wörden an-estuurd deur '''[//www.mediawiki.org/ MediaWiki]''', auteursrecht © 2001-$1 $2.",
'version-poweredby-others' => 'aanderen',
+'version-poweredby-translators' => 'vertalers van translatewiki.net',
'version-credits-summary' => 'Wulen erkennen grege de volgende personen veur der biedrage an [[Special:Version|MediaWiki]].',
'version-license-info' => 'MediaWiki is vrieje programmatuur; je kunnen MediaWiki verspreien en/of anpassen onder de veurweerden van de GNU General Public License zo as epubliceerd deur de Free Software Foundation; of versie 2 van de Lisensie, of - naor eigen wuns - n laotere versie.
@@ -3815,13 +3904,17 @@ Samen mit dit programma heur je n [{{SERVER}}{{SCRIPTPATH}}/COPYING kopie van de
'version-entrypoints-header-entrypoint' => 'Ingang',
'version-entrypoints-header-url' => 'Webadres',
-# Special:FilePath
-'filepath' => 'Bestaandslokasie',
-'filepath-page' => 'Bestaand:',
-'filepath-submit' => 'Zeuken',
-'filepath-summary' => 'Disse spesiale zied gif t hele pad veur n bestaand.
-Aofbeeldingen wörden in resolusie helemaole weeregeven.
-Aandere bestaandstypen wörden gelieke in t mit t MIME-type verbunnen programma opend.',
+# Special:Redirect
+'redirect' => 'Deurverwiezen op bestaandsnaam, gebrukersnummer of versienummer',
+'redirect-legend' => 'Deurverwiezen naor n bestaand of zied',
+'redirect-summary' => 'Disse spesiale zied verwis deur naor n bestaand (as n bestaandsnaam op-egeven wörden), n zied (as n versienummer op-egeven wörden) of n gebrukerszied (as t gebrukersnummer op-egeven wörden).',
+'redirect-submit' => 'Zeuk',
+'redirect-lookup' => 'Opzeuken:',
+'redirect-value' => 'Weerde:',
+'redirect-user' => 'Gebrukersnummer',
+'redirect-revision' => 'Ziedversie',
+'redirect-file' => 'Bestaandsnaam',
+'redirect-not-exists' => 'Weerde niet evunnen',
# Special:FileDuplicateSearch
'fileduplicatesearch' => 'Dubbele bestaanden zeuken',
@@ -3871,12 +3964,16 @@ Aandere bestaandstypen wörden gelieke in t mit t MIME-type verbunnen programma
'tags' => 'Geldige wiezigingsetiketten',
'tag-filter' => '[[Special:Tags|Etiketfilter]]:',
'tag-filter-submit' => 'Filtreren',
+'tag-list-wrapper' => '([[Special:Tags|Etiket{{PLURAL:$1||ten}}]]: $2)',
'tags-title' => 'Etiket',
'tags-intro' => 'Op disse zied staon de etiketten waormee de programmatuur elke bewarking kan markeren, en de betekenisse dervan.',
'tags-tag' => 'Etiketnaam',
'tags-display-header' => 'Weergave in wiezigingsliesten',
'tags-description-header' => 'Beschrieving van de betekenisse',
+'tags-active-header' => 'Aktief?',
'tags-hitcount-header' => 'Bewarkingen mit etiket',
+'tags-active-yes' => 'Ja',
+'tags-active-no' => 'Nee',
'tags-edit' => 'bewarking',
'tags-hitcount' => '$1 {{PLURAL:$1|wieziging|wiezigingen}}',
@@ -3897,6 +3994,7 @@ Aandere bestaandstypen wörden gelieke in t mit t MIME-type verbunnen programma
'dberr-problems' => 't Spiet ons, mer disse webstee hef op t moment wat techniese problemen.',
'dberr-again' => 'Wach n paor minuten en probeer t daornao opniej.',
'dberr-info' => '(Kan gien verbiending maken mit de databankeserver: $1)',
+'dberr-info-hidden' => '(Kan gien verbiending maken mit de databankserver)',
'dberr-usegoogle' => "Misschien ku'j ondertussen zeuken via Google.",
'dberr-outofdate' => 'Let op: indexen die zee hebben van onze ziejen bin misschien niet aktueel.',
'dberr-cachederror' => 'Disse zied is n kopie uut t tussengeheugen en is misschien niet aktueel.',
@@ -3912,6 +4010,9 @@ Aandere bestaandstypen wörden gelieke in t mit t MIME-type verbunnen programma
'htmlform-submit' => 'Opslaon',
'htmlform-reset' => 'Wiezigingen ongedaonmaken',
'htmlform-selectorother-other' => 'Aanders',
+'htmlform-no' => 'Nee',
+'htmlform-yes' => 'Ja',
+'htmlform-chosen-placeholder' => 'Kies n opsie',
# SQLite database support
'sqlite-has-fts' => 'Versie $1 mit ondersteuning veur "full-text" zeuken',
@@ -4029,4 +4130,19 @@ Aanders ku\'j oek t eenvoudige formulier hieronder gebruken. Joew kommentaar zal
# Image rotation
'rotate-comment' => 'Aofbeelding is $1 {{PLURAL:$1|graod|graojen}} mit de klokke mee edreid',
+# Limit report
+'limitreport-title' => 'Parser-profieldata:',
+'limitreport-cputime' => 'Tiedsgebruuk van de prosessor',
+'limitreport-cputime-value' => '$1 {{PLURAL:$1|sekonde|sekonden}}',
+'limitreport-walltime' => 'Reëel tiedsgebruuk',
+'limitreport-walltime-value' => '$1 {{PLURAL:$1|sekonde|sekonden}}',
+'limitreport-ppvisitednodes' => 'Antal verbiendingsknopen bezöcht tiejens de veurverwarking:',
+'limitreport-ppgeneratednodes' => 'Antal verbiedingsknopen an-emaakt tiejens de veurverwarking:',
+'limitreport-postexpandincludesize' => 'Inklusiegrootte nao uutbreien',
+'limitreport-postexpandincludesize-value' => '$1/$2 {{PLURAL:$2|byte|bytes}}',
+'limitreport-templateargumentsize' => 'Grootte van malparameters',
+'limitreport-templateargumentsize-value' => '$1/$2 {{PLURAL:$2|byte|bytes}}',
+'limitreport-expansiondepth' => 'Hoogste uutbreidingsdiepte',
+'limitreport-expensivefunctioncount' => 'Antal kostbaore parserfunksies',
+
);
diff --git a/languages/messages/MessagesNe.php b/languages/messages/MessagesNe.php
index 38dad29e..b96da5ac 100644
--- a/languages/messages/MessagesNe.php
+++ b/languages/messages/MessagesNe.php
@@ -83,9 +83,6 @@ $messages = array(
'tog-shownumberswatching' => 'निगरानी गरिरहेका पà¥à¤°à¤¯à¥‹à¤—करà¥à¤¤à¤¾à¤¹à¤°à¥à¤•à¥‹ संखà¥à¤¯à¤¾ देखाउने',
'tog-oldsig' => 'वरà¥à¤¤à¤®à¤¾à¤¨ हसà¥à¤¤à¤¾à¤•à¥à¤·à¤°:',
'tog-fancysig' => 'मेरो दसà¥à¤¤à¤–तलाई विकि पाठको रà¥à¤ªà¤®à¤¾ लिने(सà¥à¤µà¤¤ समà¥à¤µà¤¨à¥à¤§ बिना)',
-'tog-externaleditor' => 'पूरà¥à¤µà¤¨à¤¿à¤°à¥à¤§à¤¾à¤°à¤¿à¤¤ रà¥à¤ªà¤®à¤¾ बाहà¥à¤¯ समà¥à¤ªà¤¾à¤¦à¤• पà¥à¤°à¤¯à¥‹à¤— गरà¥à¤¨à¥à¤¹à¥‹à¤¸à¥ (विजà¥à¤žà¤¹à¤°à¥à¤•à¥‹ लागि मातà¥à¤°, तपाईको कमà¥à¤ªà¥à¤¯à¥à¤Ÿà¤°à¤®à¤¾ विशेष अनà¥à¤•à¥à¤²à¤¤à¤¾ आवशà¥à¤¯à¤• हà¥à¤¨à¥à¤› [//www.mediawiki.org/wiki/Manual:External_editors More information.])',
-'tog-externaldiff' => 'पूरà¥à¤µà¤¨à¤¿à¤°à¥à¤§à¤¾à¤°à¤¿à¤¤ रà¥à¤ªà¤®à¤¾ बाहà¥à¤¯ diff पà¥à¤°à¤¯à¥‹à¤— गरà¥à¤¨à¥à¤¹à¥‹à¤¸ (विजà¥à¤ž पà¥à¤°à¤¯à¥‹à¤—करà¥à¤¤à¤¾à¤¹à¤°à¥à¤•à¥‹ लागि मातà¥à¤°, तपाईंको कमà¥à¤ªà¥à¤¯à¥à¤Ÿà¤°à¤®à¤¾ विशेष अनà¥à¤•à¥à¤²à¤¤à¤¾ आवशà¥à¤¯à¤• हà¥à¤¨à¥à¤› [//www.mediawiki.org/wiki/Manual:External_editors More information.])',
-'tog-showjumplinks' => '"जाने" पहà¥à¤à¤š समà¥à¤µà¤¨à¥à¤§ सकà¥à¤°à¤¿à¤¯ पारà¥à¤¨à¥‡',
'tog-uselivepreview' => 'पà¥à¤°à¤¤à¥à¤¯à¤•à¥à¤· पूरà¥à¤µà¤°à¥à¤ª पà¥à¤°à¤¯à¥‹à¤— गरà¥à¤¨à¥à¤¹à¥‹à¤¸à¥ (पà¥à¤°à¤¯à¥‹à¤—ातà¥à¤®à¤•)',
'tog-forceeditsummary' => 'खाली समà¥à¤ªà¤¾à¤¦à¤¨ सार पà¥à¤°à¤µà¤¿à¤·à¥à¤Ÿà¤¿ गरेमा मलाई सोधà¥à¤¨à¥‡',
'tog-watchlisthideown' => 'मेरा समà¥à¤ªà¤¾à¤¦à¤¨à¤¹à¤°à¥‚ निगनारी सूचीबाट लà¥à¤•à¤¾à¤‰à¤¨à¥‡',
@@ -99,6 +96,8 @@ $messages = array(
'tog-showhiddencats' => 'लà¥à¤•à¤¾à¤‡à¤à¤•à¥‹ पà¥à¤°à¤•à¤¾à¤°à¤¹à¤°à¥ देखाउने',
'tog-noconvertlink' => 'समà¥à¤¬à¤¨à¥à¤§ शीरà¥à¤·à¤• रà¥à¤ªà¤¾à¤¨à¥à¤¤à¤°à¤£ निसà¥à¤•à¥à¤°à¤¿à¤¯ पारà¥à¤¨à¥‡',
'tog-norollbackdiff' => 'पूरà¥à¤µà¤¸à¥à¤¥à¤¿à¤¤à¤¿à¤®à¤¾ फरà¥à¤•à¤¾à¤à¤ªà¤›à¤¿ diff हटाउने',
+'tog-useeditwarning' => 'समà¥à¤ªà¤¾à¤¦à¤¨à¤¹à¤°à¥‚ सङà¥à¤—à¥à¤°à¤¹ गरिनसकेको अवसà¥à¤¥à¤¾à¤®à¤¾ अरà¥à¤•à¥‹ पृषà¥à¤ à¤®à¤¾ जान खोजà¥à¤¦à¤¾ चेतावनी देखाउने',
+'tog-prefershttps' => 'पà¥à¤°à¤µà¥‡à¤¶ गरà¥à¤¦à¤¾ जहिले पनि सà¥à¤°à¤•à¥à¤·à¤¿à¤¤ जडान पà¥à¤°à¤¯à¥‹à¤— गरà¥à¤¨à¥‡',
'underline-always' => 'सधैà¤',
'underline-never' => 'कहिलà¥à¤¯à¥ˆ',
@@ -162,6 +161,18 @@ $messages = array(
'oct' => 'अकà¥à¤Ÿà¥‹à¤¬à¤°',
'nov' => 'नोभेमà¥à¤¬à¤°',
'dec' => 'डिसेमà¥à¤¬à¤°',
+'january-date' => 'जनवरी $1',
+'february-date' => 'फेबà¥à¤°à¥à¤…री $1',
+'march-date' => 'मारà¥à¤š $1',
+'april-date' => 'अपà¥à¤°à¤¿à¤² $1',
+'may-date' => 'मे $1',
+'june-date' => 'जà¥à¤¨ $1',
+'july-date' => 'जà¥à¤²à¤¾à¤ˆ $1',
+'august-date' => 'अगसà¥à¤Ÿ $1',
+'september-date' => 'सेपà¥à¤Ÿà¥‡à¤®à¥à¤¬à¤° $1',
+'october-date' => 'अकà¥à¤Ÿà¥‹à¤¬à¤° $1',
+'november-date' => 'नोभेमà¥à¤¬à¤° $1',
+'december-date' => 'डिसेमà¥à¤¬à¤° $1',
# Categories related messages
'pagecategories' => '{{PLURAL:$1|शà¥à¤°à¥‡à¤£à¥€|शà¥à¤°à¥‡à¤£à¥€à¤¹à¤°à¥}}',
@@ -182,7 +193,7 @@ $messages = array(
'noindex-category' => 'कà¥à¤°à¤®à¤¾à¤‚कन नगरिà¤à¤•à¤¾ पृषà¥à¤ à¤¹à¤°à¥',
'broken-file-category' => 'टà¥à¤Ÿà¥‡à¤•à¥‹ फाइल लिंकसितको पृषà¥à¤ ',
-'linkprefix' => '/^(.*?)([a-zA-Z\\x80-\\xff]+)$/sD',
+'linkprefix' => '/^((?>.*(?<![a-zA-Z\\x80-\\xff])))(.+)$/sD',
'about' => 'बारेमा',
'article' => 'सामागà¥à¤°à¥€ पृषà¥à¤ ',
@@ -245,6 +256,7 @@ $messages = array(
'create-this-page' => 'यो पृषà¥à¤  बनाउने',
'delete' => 'मेटà¥à¤¨à¥‡',
'deletethispage' => 'यो पृषà¥à¤  हटाउनà¥à¤¹à¥‹à¤¸à¥',
+'undeletethispage' => 'मेटेको पृषà¥à¤  फिरà¥à¤¤à¤¾à¤—रà¥à¤¨à¥‡',
'undelete_short' => '{{PLURAL:$1|à¤à¤‰à¤Ÿà¤¾ मेटिà¤à¤•à¥‹ समà¥à¤ªà¤¾à¤¦à¤¨|$1 मेटिà¤à¤•à¤¾ समà¥à¤ªà¤¾à¤¦à¤¨à¤¹à¤°à¥}} फरà¥à¤•à¤¾à¤‰à¤¨à¥‡',
'viewdeleted_short' => '{{PLURAL:$1|मेटिà¤à¤•à¥‹ समà¥à¤ªà¤¾à¤¦à¤¨ |$1 मेटिà¤à¤•à¤¾ समà¥à¤ªà¤¾à¤¦à¤¨à¤¹à¤°à¥‚}}',
'protect' => 'सà¥à¤°à¤•à¥à¤·à¤¿à¤¤ राखà¥à¤¨à¥à¤¹à¥‹à¤¸à¥',
@@ -261,7 +273,7 @@ $messages = array(
'articlepage' => 'कनà¥à¤Ÿà¥‡à¤¨à¥à¤Ÿ पृषà¥à¤  हेरà¥à¤¨à¥à¤¹à¥‹à¤¸à¥',
'talk' => 'वारà¥à¤¤à¤¾à¤²à¤¾à¤ª',
'views' => 'अवलोकनहरू',
-'toolbox' => 'औजारबटà¥à¤Ÿà¤¾',
+'toolbox' => 'औजारहरू',
'userpage' => 'पà¥à¤°à¤¯à¥‹à¤—करà¥à¤¤à¤¾ पृषà¥à¤  हेरà¥à¤¨à¥‡',
'projectpage' => 'पà¥à¤°à¥‹à¤œà¥‡à¤•à¥à¤Ÿ पृषà¥à¤  हेरà¥à¤¨à¥‡',
'imagepage' => 'फाइल पृषà¥à¤  हेरà¥à¤¨à¥à¤¹à¥‹à¤¸à¥',
@@ -288,7 +300,7 @@ $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).
+# 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).
'aboutsite' => '{{SITENAME}}को बारेमा',
'aboutpage' => 'Project:बारेमा',
'copyright' => 'सामागà¥à¤°à¥€ $1 अनà¥à¤¸à¤¾à¤° उपलबà¥à¤§ छ, खà¥à¤²à¤¾à¤‡à¤à¤•à¥‹ अवसà¥à¤¥à¤¾ बाहेकको हकमा ।',
@@ -298,7 +310,6 @@ $1',
'disclaimers' => 'असà¥à¤µà¤¿à¤•à¤¾à¤°à¥‹à¤•à¥à¤¤à¤¿à¤¹à¤°à¥',
'disclaimerpage' => 'Project:सामानà¥à¤¯ असà¥à¤µà¥€à¤•à¤¾à¤°à¥‹à¤•à¥à¤¤à¤¿',
'edithelp' => 'समà¥à¤ªà¤¾à¤¦à¤¨ सहायता',
-'edithelppage' => 'Help:समà¥à¤ªà¤¾à¤¦à¤¨',
'helppage' => 'Help:विषयवसà¥à¤¤à¥à¤¹à¤°à¥‚',
'mainpage' => 'मà¥à¤–à¥à¤¯ पृषà¥à¤ ',
'mainpage-description' => 'मà¥à¤–à¥à¤¯ पृषà¥à¤ ',
@@ -325,9 +336,11 @@ $1',
'newmessageslink' => 'नयाठसनà¥à¤¦à¥‡à¤¶à¤¹à¤°à¥‚',
'newmessagesdifflink' => 'आखिरी परिवरà¥à¤¤à¤¨',
'youhavenewmessagesfromusers' => 'तपाईंको लागि {{PLURAL:$3|पà¥à¤°à¤¯à¥‹à¤—करà¥à¤¤à¤¾|$3 पà¥à¤°à¤¯à¥‹à¤—करà¥à¤¤à¤¾à¤¹à¤°à¥}} ($2) बाट $1',
+'youhavenewmessagesmanyusers' => 'तपाईà¤à¤²à¤¾à¤ˆ धेरै पà¥à¤°à¤¯à¥‹à¤—करà¥à¤¤à¤¾à¤¹à¤°à¥‚($2) बाट $1 छ ।',
+'newmessageslinkplural' => '{{PLURAL:$1|नयाठसनà¥à¤¦à¥‡à¤¶|नयाठसनà¥à¤¦à¥‡à¤¶à¤¹à¤°à¥‚}}',
+'newmessagesdifflinkplural' => 'अनà¥à¤¤à¤¿à¤® {{PLURAL:$1|समà¥à¤ªà¤¾à¤¦à¤¨|समà¥à¤ªà¤¾à¤¦à¤¨à¤¹à¤°à¥‚}}',
'youhavenewmessagesmulti' => 'तपाईंको लागि $1 मा नयाठसनà¥à¤¦à¥‡à¤¶à¤¹à¤°à¥‚ छनà¥',
'editsection' => 'समà¥à¤ªà¤¾à¤¦à¤¨',
-'editsection-brackets' => '[$1]',
'editold' => 'समà¥à¤ªà¤¾à¤¦à¤¨ गरà¥à¤¨à¥‡',
'viewsourceold' => 'सà¥à¤°à¥‹à¤¤ हेरà¥à¤¨à¥à¤¹à¥‹à¤¸à¥',
'editlink' => 'समà¥à¤ªà¤¾à¤¦à¤¨',
@@ -379,15 +392,12 @@ $1',
# General errors
'error' => 'तà¥à¤°à¥à¤Ÿà¤¿',
'databaseerror' => 'डेटावेस तà¥à¤°à¥à¤Ÿà¤¿',
-'dberrortext' => 'डेटाबेस कà¥à¤µà¥‡à¤°à¥€ सूतà¥à¤° तà¥à¤°à¥à¤Ÿà¥€ भà¤à¤•à¥‹ छ ।
-यसले सफà¥à¤Ÿà¤µà¥‡à¤¯à¤°à¤®à¤¾ बग रहेको देखाउन सकà¥à¤¦à¤› ।
-डेटावेसमा पछिलà¥à¤²à¥‹ पटक पà¥à¤°à¤¯à¤¾à¤¸ गरिà¤à¤•à¥‹ कà¥à¤µà¥‡à¤°à¥€:
-<blockquote><tt>$1</tt></blockquote>
- "<tt>$2</tt>" फङà¥à¤¸à¤¨ बाट बोलाइà¤à¤•à¥‹
-थियो "<tt>$3: $4</tt>" डेटावेस तà¥à¤°à¥à¤Ÿà¤¿ उतà¥à¤ªà¤¨à¥à¤¨ ।',
-'dberrortextcl' => 'डेटाबेस कà¥à¤µà¥‡à¤°à¥€ वाकà¥à¤¯à¤µà¤¿à¤¨à¥à¤¯à¤¾à¤¸ तà¥à¤°à¥à¤Ÿà¤¿ भयो।
-"$2" कारà¥à¤¯ भितà¥à¤°à¤¬à¤¾à¤Ÿ "$1" अनà¥à¤¤à¤¿à¤® पà¥à¤°à¤¯à¤¾à¤¸ गरिà¤à¤•à¥‹ डेटाबेस कà¥à¤µà¥‡à¤°à¥€ थियो।
-डेटाबेसले दिà¤à¤•à¥‹ तà¥à¤°à¥à¤Ÿà¤¿ "$3: $4"',
+'databaseerror-text' => 'डेटाबेस कà¥à¤µà¥‡à¤°à¥€à¤®à¤¾ खराबी देखा परà¥â€Œà¤¯à¥‹ ।
+यसले सफà¥à¤Ÿà¤µà¥‡à¤¯à¤°à¤®à¤¾ तà¥à¤°à¥à¤Ÿà¥€ रहेको इङà¥à¤—ित गरà¥à¤¨ सकà¥à¤› ।',
+'databaseerror-textcl' => 'डेटावेस कà¥à¤µà¥‡à¤°à¥€à¤®à¤¾ खराबी देखियो ।',
+'databaseerror-query' => 'कà¥à¤µà¥‡à¤°à¥€: $1',
+'databaseerror-function' => 'फङà¥à¤¸à¤¨ : $1',
+'databaseerror-error' => 'खराबी: $1',
'laggedslavemode' => "'''चेतावनी:''' पृषà¥à¤ à¤®à¤¾ हालका अदà¥à¤¯à¤¤à¤¨à¤¹à¤°à¥ नहà¥à¤¨à¤¸à¤•à¥à¤›à¤¨à¥ ।",
'readonly' => 'डेटाबेस बनà¥à¤¦ गरिà¤à¤•à¥‹ छ',
'enterlockreason' => 'तालà¥à¤šà¤¾ मारà¥à¤¨à¥à¤•à¥‹ कारण दिनà¥à¤¹à¥‹à¤¸à¥, साथै तालà¥à¤šà¤¾ हटाउने समयको अवधि अनà¥à¤®à¤¾à¤¨ लगाउनà¥à¤¹à¥‹à¤¸à¥à¥¤',
@@ -418,6 +428,8 @@ $1',
'cannotdelete' => '"$1" पृषà¥à¤  वा फ़ाइल मेटà¥à¤¨à¤¸à¤•à¤¿à¤à¤¨à¥¤
यो अघिबाट नैं मेटिà¤à¤•à¥‹ हà¥à¤¨à¥à¤ªà¤°à¥à¤›à¥¤',
'cannotdelete-title' => 'पृषà¥à¤  "$1" लाई मेटà¥à¤¨ सकिà¤à¤¨',
+'delete-hook-aborted' => 'हà¥à¤•à¤²à¥‡ समà¥à¤ªà¤¾à¤¦à¤¨à¤•à¤¾à¤°à¥à¤¯ बनà¥à¤¦ गरिदियो ।
+कà¥à¤¨à¥ˆ कारण दिइà¤à¤¨ ।',
'badtitle' => 'गलत शीरà¥à¤·à¤•',
'badtitletext' => 'अनà¥à¤°à¥‹à¤§ गरेको पृषà¥à¤  शीरà¥à¤·à¤• अमानà¥à¤¯, खाली वा गलत रà¥à¤ªà¤®à¤¾ अनà¥à¤¤à¤° भाषा वा अनà¥à¤¤à¤° विकी समà¥à¤¬à¤¨à¥à¤§ गरिà¤à¤•à¥‹ थियो। यसमा शीरà¥à¤·à¤•à¤®à¤¾ पà¥à¤°à¤¯à¥‹à¤— गरà¥à¤¨ नमिलà¥à¤¨à¥‡ à¤à¤• वा बढी अकà¥à¤·à¤°à¤¹à¤°à¥‚ रहेका हà¥à¤¨à¤¸à¤•à¥à¤›à¤¨à¥ ।',
'perfcached' => 'तलको डाटाहरॠकà¥à¤¯à¤¾à¤šà¤®à¤¾ रहेका कà¥à¤°à¤¾à¤¹à¤°à¥ हà¥à¤¨à¥à¥¤ अपटà¥à¤¡à¥‡à¤Ÿ नहà¥à¤¨à¤ªà¤¨à¤¿ सकà¥à¤›à¤¨à¥à¥¤à¤…धिकतम {{PLURAL:$1|नतिजा|$1 नतिजाहरू}} कà¥à¤¯à¤¾à¤¸à¤®à¤¾ उपलबà¥à¤§ छ।',
@@ -432,14 +444,14 @@ $1',
'actionthrottled' => 'कारà¥à¤¯ रोकियो',
'actionthrottledtext' => 'सà¥à¤ªà¤¾à¤®à¤¬à¤¾à¤Ÿ बचà¥à¤¨à¥‡ तरिकाको रà¥à¤ªà¤®à¤¾ , तपाईà¤à¤²à¤¾à¤ˆ यो कारà¥à¤¯ थोरै समयमा धेरै पटक गरà¥à¤¨à¤¬à¤¾à¤Ÿ सिमित गरिà¤à¤•à¥‹ छ, र तपाईले आफà¥à¤¨à¥‹ सिमा पार गरिसकà¥à¤¨à¥ भयो ।
कृपया केही मिनेटहरॠपछि पà¥à¤¨: पà¥à¤°à¤¯à¤¾à¤¸ गरà¥à¤¨à¥à¤¹à¥‹à¤¸à¥ ।',
-'protectedpagetext' => 'यो पृषà¥à¤  समà¥à¤ªà¤¾à¤¦à¤¨ हà¥à¤¨à¤¬à¤¾à¤Ÿ बचाउन समà¥à¤ªà¤¾à¤¦à¤¨à¤®à¤¾ रोक लगाइà¤à¤•à¥‹ छ।',
+'protectedpagetext' => 'यो पृषà¥à¤  समà¥à¤ªà¤¾à¤¦à¤¨ हà¥à¤¨à¤¬à¤¾à¤Ÿ बचाउन समà¥à¤ªà¤¾à¤¦à¤¨à¤®à¤¾ तथा अनà¥à¤¯à¤•à¤¾à¤°à¥à¤¯à¤®à¤¾ रोक लगाइà¤à¤•à¥‹ छ।',
'viewsourcetext' => 'तपाईà¤à¤²à¥‡ यस पृषà¥à¤ à¤•à¥‹ सà¥à¤°à¥‹à¤¤ हेरà¥à¤¨ र पà¥à¤°à¤¤à¤¿à¤²à¤¿à¤ªà¥€ गरà¥à¤¨ सकà¥à¤¨à¥à¤¹à¥à¤¨à¥à¤› ।',
'viewyourtext' => "यस पृषà¥à¤ à¤®à¤¾ रहेका '''तपाईà¤à¤•à¤¾ समà¥à¤ªà¤¾à¤¦à¤¨à¤¹à¤°à¥''' हेरà¥à¤¨ या पà¥à¤°à¤¤à¤¿à¤²à¤¿à¤ªà¥€ गरà¥à¤¨ सकà¥à¤¨à¥à¤¹à¥à¤¨à¥à¤› :",
-'protectedinterface' => 'यो पृषà¥à¤ à¤²à¥‡ सफà¥à¤Ÿà¤µà¥‡à¤¯à¤°à¤•à¥‹ लागि अनà¥à¤¤à¤°à¤®à¥‹à¤¹à¤¡à¤¾ पाठ पà¥à¤°à¤¦à¤¾à¤¨ गरà¥à¤¦à¤› , र यसलाई दà¥à¤°à¥à¤ªà¤¯à¥‹à¤— हà¥à¤¨à¤¬à¤¾à¤Ÿ बचाउन तालà¥à¤šà¤¾ मारिà¤à¤•à¥‹ छ।',
+'protectedinterface' => 'यो पृषà¥à¤ à¤²à¥‡ सफà¥à¤Ÿà¤µà¥‡à¤¯à¤°à¤•à¥‹ लागि अनà¥à¤¤à¤°à¤®à¥‹à¤¹à¤¡à¤¾ पाठ पà¥à¤°à¤¦à¤¾à¤¨ गरà¥à¤¦à¤› , र यसलाई दà¥à¤°à¥à¤ªà¤¯à¥‹à¤— हà¥à¤¨à¤¬à¤¾à¤Ÿ बचाउन सà¥à¤°à¤•à¥à¤·à¤¾ पà¥à¤°à¤¾à¤¦à¤¨ गरिà¤à¤•à¥‹ छ।
+समà¥à¤ªà¥‚रà¥à¤£ विकिहरूका लागि अनà¥à¤µà¤¾à¤¦à¤®à¤¾ परिवरà¥à¤¤à¤¨ गरà¥à¤¨à¤•à¥‹ लागि [//translatewiki.net/ translatewiki.net], पà¥à¤°à¤¯à¥‹à¤— गरà¥à¤¨à¥à¤¹à¥‹à¤¸à¥ , मिडियाविकि सà¥à¤¥à¤¾à¤¨à¤¿à¤¯à¤•à¤°à¤£ परियोजना ।',
'editinginterface' => "'''चेतावनी:''' तपाईं यसà¥à¤¤à¥‹ पृषà¥à¤ à¤²à¤¾à¤ˆ समà¥à¤ªà¤¾à¤¦à¤¨ गरà¥à¤¨à¥à¤¹à¥à¤à¤¦à¥ˆà¤›, जसले सफà¥à¤Ÿà¤µà¥‡à¤¯à¤°à¤•à¥‹ लागि अनà¥à¤¤à¤°à¤®à¥‹à¤¹à¥‹à¤¡à¤¼à¤¾ (interface) पाठ पà¥à¤°à¤¦à¤¾à¤¨ गरà¥à¤¦à¤›à¥¤
यसको परिवरà¥à¤¤à¤¨à¤²à¥‡ यस विकिमा अरॠपà¥à¤°à¤¯à¥‹à¤—करà¥à¤¤à¤¾à¤•à¥‹ अनà¥à¤¤à¤°à¤®à¥‹à¤¹à¥‹à¤¡à¤¼à¤¾à¤•à¥‹ पà¥à¤°à¤¦à¤°à¥à¤¶à¤¨à¤®à¤¾ पà¥à¤°à¤­à¤¾à¤µ पारà¥à¤›à¥¤
सबै विकिका निमà¥à¤¤à¤¿ अनà¥à¤µà¤¾à¤¦ जोडà¥à¤¨ अथवा परिबरà¥à¤¤à¤¨ गरà¥à¤¨ कृपया यहाठजानà¥à¤¹à¥‹à¤¸à¥ [//translatewiki.net/ translatewiki.net], मीडियाविकि सà¥à¤¥à¤¾à¤¨à¥€à¤¯à¤•à¤°à¤£ पारियोजना।",
-'sqlhidden' => '(SQL कà¥à¤µà¥‡à¤°à¥€ लà¥à¤•à¤¾à¤à¤•à¥‹)',
'cascadeprotected' => 'यो पृषà¥à¤  समà¥à¤ªà¤¾à¤¦à¤¨ गरà¥à¤¨à¤¬à¤¾à¤Ÿ सà¥à¤°à¤•à¥à¤·à¤¿à¤¤ गरिà¤à¤•à¥‹à¤› किनभनें {{PLURAL:$1|पृषà¥à¤  |पृषà¥à¤ à¤¹à¤°à¥}}मा सà¥à¤°à¤•à¥à¤·à¤¿à¤¤ गरà¥à¤¨à¥à¤•à¤¾ साथै पà¥à¤°à¤ªà¤¾à¤¤ ("cascading") विकलà¥à¤ª खà¥à¤²à¥à¤²à¤¾ राखिà¤à¤•à¥‹à¤›:
$2',
'namespaceprotected' => " '''$1''' नेमसà¥à¤ªà¥‡à¤¸à¤®à¤¾ रहेका पृषà¥à¤ à¤¹à¤°à¥ समà¥à¤ªà¤¾à¤¦à¤¨ गरà¥à¤¨à¥‡ अनà¥à¤®à¤¤à¤¿ यहाà¤à¤²à¤¾à¤ˆ छैन ।",
@@ -448,9 +460,9 @@ $2',
'ns-specialprotected' => 'विशेष पृषà¥à¤  समà¥à¤ªà¤¾à¤¦à¤¨ गरà¥à¤¨ सकिदैन ।',
'titleprotected' => ' [[User:$1|$1]]दà¥à¤µà¤¾à¤°à¤¾ यो शीरà¥à¤·à¤• निरà¥à¤®à¤¾à¤£à¤¹à¥à¤¨à¤¬à¤¾à¤Ÿ जोगाइà¤à¤•à¥‹ छ।
कारण "\'\'$2\'\'" हो ।',
-'filereadonlyerror' => 'फाइल "$1" लाई परिवरà¥à¤¤à¤¨ गरà¥à¤¨ सकिंदैन किन भनें फाइल भणà¥à¤¡à¤¾à¤° "$2" केवल पढà¥à¤¨à¥‡ सà¥à¤¥à¤¿à¤¤à¤¿ (read-only mode)मा छ।
+'filereadonlyerror' => 'फाइल "$1" लाई परिवरà¥à¤¤à¤¨ गरà¥à¤¨ सकिà¤à¤¦à¥ˆà¤¨ किन भने फाइल भणà¥à¤¡à¤¾à¤° "$2" केवल पढà¥à¤¨à¥‡ सà¥à¤¥à¤¿à¤¤à¤¿ (read-only mode)मा छ।
-कारण यो दिà¤à¤•à¥‹à¤›: "\'\'$3\'\'"।',
+यसलाई सà¥à¤°à¤•à¥à¤·à¤¿à¤¤ गरà¥à¤¨à¥‡ पà¥à¤°à¤µà¤¨à¥à¤§à¤•à¤²à¥‡ यो कारण दिà¤à¤•à¤¾à¤›à¤¨à¥ : \'\'$3\'\'।',
'exception-nologin' => 'पà¥à¤°à¤µà¥‡à¤¶ (लग ईन) नगरिà¤à¤•à¥‹',
# Virus scanner
@@ -460,15 +472,25 @@ $2',
# Login and logout pages
'logouttext' => "'''तपाईं अहिले बाहिर निसà¥à¤•à¤¨à¥ भà¤à¤•à¥‹ छ।'''
-तपाईंले नाम/खाताविनै पनि {{SITENAME}}मा पà¥à¤°à¤¯à¥‹à¤— गरà¥à¤¨ सकà¥à¤¨à¥à¤¹à¥à¤¨à¥à¤›, अथवा अघिकै वा अरà¥à¤•à¥ˆ कà¥à¤¨à¥ˆ नामको खाताबाट <span class='plainlinks'>[$1 फेरि पà¥à¤°à¤µà¥‡à¤¶ गरà¥à¤¨]</span> पनि सकà¥à¤¨à¥à¤¹à¥à¤¨à¥à¤›à¥¤
-याद राखà¥à¤¨à¥à¤¹à¥‹à¤¸à¥ तपाईंले बà¥à¤°à¤¾à¤‰à¤œà¤°à¤•à¥‹ सà¥à¤®à¤°à¤£ भणà¥à¤¡à¤¾à¤° खालि नगरà¥à¤¦à¤¾à¤¸à¤®à¥à¤® कà¥à¤¨à¥ˆ पृषà¥à¤ à¤¹à¤°à¥‚मा तपाईं अà¤à¥ˆ पà¥à¤°à¤µà¥‡à¤¶ गरिराखेको देखाउन सकà¥à¤›à¥¤",
+
+याद राखà¥à¤¨à¥à¤¹à¥‹à¤¸à¥ तपाईंले बà¥à¤°à¤¾à¤‰à¤œà¤°à¤•à¥‹ कà¥à¤¯à¤¾à¤¶ खालि नगरà¥à¤¦à¤¾à¤¸à¤®à¥à¤® कà¥à¤¨à¥ˆ पृषà¥à¤ à¤¹à¤°à¥‚मा तपाईं अà¤à¥ˆ पà¥à¤°à¤µà¥‡à¤¶ गरिराखेको देखाउन सकà¥à¤›à¥¤",
'welcomeuser' => '$1जी सà¥à¤µà¤¾à¤—त छ!',
'yourname' => 'पà¥à¤°à¤¯à¥‹à¤—करà¥à¤¤à¤¾ नाम:',
+'userlogin-yourname' => 'पà¥à¤°à¤¯à¥‹à¤—करà¥à¤¤à¤¾ नाम',
+'userlogin-yourname-ph' => 'तपाईà¤à¤•à¥‹ पà¥à¤°à¤¯à¥‹à¤—करà¥à¤¤à¤¾à¤¨à¤¾à¤® लेखà¥à¤¨à¥à¤¹à¥‹à¤¸à¥',
+'createacct-another-username-ph' => 'पà¥à¤°à¤¯à¥‹à¤—करà¥à¤¤à¤¾à¤¨à¤¾à¤® लेखà¥à¤¨à¥à¤¹à¥‹à¤¸à¥',
'yourpassword' => 'पासवरà¥à¤¡',
+'userlogin-yourpassword' => 'पासवरà¥à¤¡',
+'userlogin-yourpassword-ph' => 'तपाईà¤à¤•à¥‹ पासवरà¥à¤¡ लेखà¥à¤¨à¥à¤¹à¥‹à¤¸à¥',
+'createacct-yourpassword-ph' => 'पासवरà¥à¤¡ लेखà¥à¤¨à¥à¤¹à¥‹à¤¸à¥',
'yourpasswordagain' => 'पासवरà¥à¤¡ फेरि टाईप गरà¥à¤¨à¥à¤¹à¥‹à¤¸à¥',
+'createacct-yourpasswordagain' => 'पासवरà¥à¤¡ निशà¥à¤šà¤¿à¤¤ गरà¥à¤¨à¥à¤¹à¥‹à¤¸à¥',
+'createacct-yourpasswordagain-ph' => 'फेरि पासवरà¥à¤¡ लेखà¥à¤¨à¥à¤¹à¥‹à¤¸à¥',
'remembermypassword' => 'यो कमà¥à¤ªà¥à¤¯à¥à¤Ÿà¤°à¤®à¤¾ मेरो पà¥à¤°à¤µà¥‡à¤¶ याद गर । (धेरैमा $1 {{PLURAL:$1|दिन|दिनहरà¥}})',
-'securelogin-stick-https' => 'पà¥à¤°à¤µà¥‡à¤¶ गरेपछि HTTPS सित जोड़िà¤à¤° बसà¥à¤¨à¥‡',
+'userlogin-remembermypassword' => 'मलाई पà¥à¤°à¤µà¥‡à¤¶ गराइराखà¥à¤¨à¥‡',
+'userlogin-signwithsecure' => 'सà¥à¤•à¥à¤·à¤¿à¤¤ जडान पà¥à¤°à¤¯à¥‹à¤— गरà¥à¤¨à¥‡',
'yourdomainname' => 'तपाईंको जà¥à¤žà¤¾à¤¨à¤•à¥à¤·à¥‡à¤¤à¥à¤°(डोमेन)',
+'password-change-forbidden' => 'यो विकिमा पासवरà¥à¤¡ परिवरà¥à¤¤à¤¨ गरà¥à¤¨ सकà¥à¤¨à¥à¤¹à¥à¤¨à¥à¤¨ ।',
'externaldberror' => 'यहाठपà¥à¤°à¤®à¤¾à¤£à¤¿à¤•à¤°à¤£ डेटाबेस तà¥à¤°à¥à¤Ÿà¤¿ भयो या त तपाईंलाई आफà¥à¤¨à¥‹ बाहिरी खाता अदà¥à¤¯à¤¤à¤¨ गरà¥à¤¨à¥‡ अनà¥à¤®à¤¤à¤¿ छैन।',
'login' => 'पà¥à¤°à¤µà¥‡à¤¶',
'nav-login-createaccount' => 'पà¥à¤°à¤µà¥‡à¤¶ गरà¥à¤¨à¥‡/नयाठखाता बनाउने',
@@ -478,14 +500,33 @@ $2',
'logout' => 'निरà¥à¤—मन',
'userlogout' => 'निरà¥à¤—मन (लग आउउ)',
'notloggedin' => 'पà¥à¤°à¤µà¥‡à¤¶ (लग ईन) नगरिà¤à¤•à¥‹',
+'userlogin-noaccount' => 'के खाता छैन ?',
+'userlogin-joinproject' => '{{SITENAME}} मा खाता खोलà¥à¤¨à¥à¤¹à¥‹à¤¸à¥ ।',
'nologin' => 'तपाईको खाता छैन? $1 ।',
'nologinlink' => 'नयाठखाता खोलà¥à¤¨à¥à¤¹à¥‹à¤¸à¥',
'createaccount' => 'खाता खोलà¥à¤¨à¥à¤¹à¥‹à¤¸à¥',
'gotaccount' => "के तपाईà¤à¤¸à¤à¤— पहिले देखि नै खाता छ ? '''$1''' ।",
'gotaccountlink' => 'लग इन',
'userlogin-resetlink' => 'पà¥à¤°à¤µà¥‡à¤¶ समà¥à¤¬à¤¨à¥à¤§à¥€ विवरणहरॠबिरà¥à¤¸à¤¨à¥ भयो?',
-'createaccountmail' => 'इ-मेलबाट',
+'userlogin-resetpassword-link' => 'पासवरà¥à¤¡ परिवरà¥à¤¤à¤¨ गरà¥à¤¨à¥à¤¹à¥‹à¤¸à¥',
+'userlogin-createanother' => 'अरà¥à¤•à¥‹ खाता खोलà¥à¤¨à¥à¤¹à¥‹à¤¸à¥',
+'createacct-join' => 'तपाईà¤à¤•à¤¾ जानकारीहरू तल थपà¥à¤¨à¥à¤¹à¥‹à¤¸à¥ ।',
+'createacct-another-join' => 'नयाठखाताको जानकारी तल थपà¥à¤¨à¥à¤¹à¥‹à¤¸ ।',
+'createacct-emailrequired' => 'इमेल ठेगाना',
+'createacct-emailoptional' => 'इमेल ठेगाना (à¤à¤šà¥à¤›à¤¿à¤•)',
+'createacct-email-ph' => 'तपाईà¤à¤•à¥‹ इमेल ठेगाना भरà¥à¤¨à¥à¤¹à¥‹à¤¸à¥',
+'createacct-another-email-ph' => 'इमेल ठेगाना भरà¥à¤¨à¥à¤¹à¥‹à¤¸à¥',
+'createaccountmail' => 'कà¥à¤¨à¥ˆ असà¥à¤¥à¤¾à¤ˆ र शà¥à¤°à¤¿à¤œà¤¿à¤¤ पासवरà¥à¤¡ पà¥à¤°à¤¯à¥‹à¤— गरà¥à¤¨à¥‡ र खà¥à¤²à¤¾à¤ˆà¤à¤•à¥‹ इमेलमा पठाउने',
+'createacct-realname' => 'वासà¥à¤¤à¤µà¤¿à¤• नाम(à¤à¤šà¥à¤›à¤¿à¤•)',
'createaccountreason' => 'कारण :',
+'createacct-reason' => 'कारण',
+'createacct-reason-ph' => 'किन नयाठखाता खोलिरहनॠभà¤à¤•à¥‹ हो ?',
+'createacct-captcha' => 'सà¥à¤°à¤•à¥à¤·à¤¾ जाà¤à¤š',
+'createacct-imgcaptcha-ph' => 'माथि देखिठअनà¥à¤¸à¤¾à¤°à¤•à¥‹ पाठ भरà¥à¤¨à¥à¤¹à¥‹à¤¸à¥',
+'createacct-submit' => 'तपाईà¤à¤•à¥‹ खाता सिरà¥à¤œà¤¨à¤¾ गरà¥à¤¨à¥à¤¹à¥‹à¤¸',
+'createacct-another-submit' => 'अरà¥à¤•à¥‹ खाता सिरà¥à¤œà¤¨à¤¾ गरà¥à¤¨à¥à¤¹à¥‹à¤¸à¥',
+'createacct-benefit-heading' => '{{SITENAME}} तपाईठजसà¥à¤¤à¥ˆ मानिसहरूदà¥à¤µà¤¾à¤°à¤¾ सिरà¥à¤œà¤¨à¤¾ गरिà¤à¤•à¥‹ हो ।',
+'createacct-benefit-body1' => '{{PLURAL:$1|समà¥à¤ªà¤¾à¤¦à¤¨|समà¥à¤ªà¤¾à¤¦à¤¨à¤¹à¤°à¥‚}}',
'badretype' => 'तपाईंले दिनà¥à¤­à¤à¤•à¥‹ पासवरà¥à¤¡ मिलà¥à¤¦à¥ˆà¤¨à¥¤',
'userexists' => 'तपाईले पà¥à¤°à¤µà¤¿à¤·à¥à¤Ÿ गरà¥à¤¨à¥à¤­à¤à¤•à¥‹ पà¥à¤°à¤¯à¥‹à¤—करà¥à¤¤à¤¾à¤•à¥‹ नाम पहिले देखिनै पà¥à¤°à¤¯à¥‹à¤—मा छ ।
कृपया फरक नाम छानà¥à¤¨à¥à¤¹à¥‹à¤¸à¥ ।',
@@ -542,12 +583,11 @@ $2',
'cannotchangeemail' => 'यस विकिमा तपाईको खातासà¤à¤— समà¥à¤¬à¤¨à¥à¤§à¤¿à¤¤ इमेल ठेगाना परिवरà¥à¤¤à¤¨ गरà¥à¤¨ सकिनà¥à¤¨ ।',
'emaildisabled' => 'यो साइटले इमेलहरॠपठाउन सकà¥à¤¤à¥ˆà¤¨à¥¤',
'accountcreated' => 'खाता खोलियो',
-'accountcreatedtext' => '$1 कोलागि पà¥à¤°à¤¯à¥‹à¤—करà¥à¤¤à¤¾ खाता खोलियो।',
+'accountcreatedtext' => '[[{{ns:User}}:$1|$1]] ([[{{ns:User talk}}:$1|वारà¥à¤¤à¤¾]])$1 पà¥à¤°à¤¯à¥‹à¤—करà¥à¤¤à¤¾à¤•à¥‹ लागि खाता खोलिà¤à¤•à¥‹ छ ।',
'createaccount-title' => '{{SITENAME}}कोलागि खाता खोलà¥à¤¨à¥‡ काम',
'createaccount-text' => 'कसैले तपाईको इमेल ठेगानालाई {{SITENAME}} ($4) मा "$2" नामको खाता बनाà¤à¤•à¥‹ छ, जसको पासवरà¥à¤¡ "$3" छ।',
'usernamehasherror' => 'पà¥à¤°à¤¯à¥‹à¤—करà¥à¤¤à¤¾à¤¨à¤¾à¤®à¤®à¤¾ हà¥à¤¯à¤¾à¤¸ अकà¥à¤·à¤°à¤¹à¤°à¥ राखà¥à¤¨ मिलà¥à¤¦à¥ˆà¤¨à¥¤',
-'login-throttled' => 'तपाईंले भरà¥à¤–रै धेरै पलà¥à¤Ÿ पà¥à¤°à¤µà¥‡à¤¶à¤•à¥‹ निमà¥à¤¤à¤¿ पà¥à¤°à¤¯à¤¾à¤¸ गरà¥à¤¨à¥à¤­à¤¯à¥‹à¥¤
-कृपया परà¥à¤–ेर केही समयपछि मातà¥à¤° पà¥à¤°à¤¯à¤¾à¤¸ गरà¥à¤¨à¥à¤¹à¥‹à¤¸à¥à¥¤',
+'login-throttled' => 'तपाईंले भरà¥à¤–रै धेरै पलà¥à¤Ÿ पà¥à¤°à¤µà¥‡à¤¶à¤•à¥‹ निमà¥à¤¤à¤¿ पà¥à¤°à¤¯à¤¾à¤¸ गरà¥à¤¨à¥à¤­à¤à¤•à¥‹ छ ,कृपया $1 परà¥à¤–ेर मातà¥à¤° पà¥à¤°à¤¯à¤¾à¤¸ गरà¥à¤¨à¥à¤¹à¥‹à¤¸à¥à¥¤',
'login-abort-generic' => 'तपाईंको पà¥à¤°à¤µà¥‡à¤¶ असफल भयो - छोड़ियो',
'loginlanguagelabel' => 'भाषा: $1',
'suspicious-userlogout' => 'तपाईंको निरà¥à¤—मन अनà¥à¤°à¥‹à¤§ असà¥à¤µà¤¿à¤•à¤¾à¤° गरिनà¥à¤› किन कि यो खराब बà¥à¤°à¤¾à¤‰à¤œà¤° वा कà¥à¤¯à¤¾à¤¸à¤¿à¤™ पà¥à¤°à¥‹à¤•à¥à¤¸à¤¿à¤²à¥‡ पठाà¤à¤•à¥‹ जसà¥à¤¤à¥‹ देखिनà¥à¤›à¥¤',
@@ -566,7 +606,7 @@ $2',
'newpassword' => 'नयाठपासवरà¥à¤¡:',
'retypenew' => 'पà¥à¤°à¤µà¥‡à¤¶ शवà¥à¤¦ पà¥à¤¨: दिनà¥à¤¹à¥‹à¤¸à¥ :',
'resetpass_submit' => 'पासवरà¥à¤¡ वà¥à¤¯à¤µà¤¸à¥à¤¥à¤¿à¤¤ गरी र पà¥à¤°à¤µà¥‡à¤¶à¤—रà¥à¤¨à¥‡',
-'resetpass_success' => 'तपाईà¤à¤•à¥‹ पà¥à¤°à¤µà¥‡à¤¶à¤¶à¤µà¥à¤¦ सफलतापूरà¥à¤µà¤• परिवरà¥à¤¤à¤¨ भयो ! तपाईलाई पà¥à¤°à¤µà¥‡à¤¶ गराइà¤à¤¦à¥ˆà¤› ...',
+'changepassword-success' => 'तपाईà¤à¤•à¥‹ पासवरà¥à¤¡ सफलतापूरà¥à¤µà¤• परिवरà¥à¤¤à¤¨ भयो !',
'resetpass_forbidden' => 'पà¥à¤°à¤µà¥‡à¤¶à¤¶à¤µà¥à¤¦ परिवरà¥à¤¤à¤¨ गरà¥à¤¨ मिलà¥à¤¦à¥ˆà¤¨',
'resetpass-no-info' => 'यो पृषà¥à¤  सिधै हेरà¥à¤¨à¤•à¥‹ लागि तपाईà¤à¤²à¥‡ पà¥à¤°à¤µà¥‡à¤¶ गरà¥à¤¨à¥à¤ªà¤°à¥à¤› ।',
'resetpass-submit-loggedin' => 'पà¥à¤°à¤µà¥‡à¤¶à¤¶à¤µà¥à¤¦ परिवरà¥à¤¤à¤¨ गरà¥à¤¨à¥‡',
@@ -577,10 +617,8 @@ $2',
# Special:PasswordReset
'passwordreset' => 'पà¥à¤°à¤µà¥‡à¤¶à¤¶à¤µà¥à¤¦ पà¥à¤¨à¤ƒ तय गरà¥à¤¨à¥‡',
-'passwordreset-text' => 'तपाईंको खाता-विवरणको इमेल अनà¥à¤¸à¥à¤®à¤¾à¤°à¤• पà¥à¤°à¤¾à¤ªà¥à¤¤ गरà¥à¤¨ यो फारम पूरा गरà¥à¤¨à¥à¤¹à¥‹à¤¸à¥à¥¤',
'passwordreset-legend' => 'पà¥à¤°à¤µà¥‡à¤¶à¤¶à¤µà¥à¤¦ पà¥à¤¨à¤ƒ तय गरà¥à¤¨à¥‡',
'passwordreset-disabled' => 'पà¥à¤°à¤µà¥‡à¤¶ शवà¥à¤¦ पà¥à¤¨à¤ƒ निरà¥à¤§à¤¾à¤°à¤£ गरà¥à¤¨à¥‡ वà¥à¤¯à¤µà¤¸à¥à¤¥à¤¾ यस विकिमा निसà¥à¤•à¥à¤°à¤¿à¤¯ पारिà¤à¤•à¥‹ छ।',
-'passwordreset-pretext' => '{{PLURAL:$1||तल दिà¤à¤•à¤¾ आà¤à¤•à¤¡à¤¼à¤¾à¤•à¤¾ टà¥à¤•à¥à¤°à¤¾ मधà¥à¤¯à¥‡ à¤à¤‰à¤Ÿà¤¾ पà¥à¤°à¤µà¤¿à¤·à¥à¤Ÿ गरà¥à¤¨à¥à¤¹à¥‹à¤¸à¥}}',
'passwordreset-username' => 'पà¥à¤°à¤¯à¥‹à¤—करà¥à¤¤à¤¾-नाम:',
'passwordreset-domain' => 'डोमेन',
'passwordreset-capture' => 'निसà¥à¤•à¤¨à¥‡ इमेलको नमà¥à¤¨à¤¾ हेरà¥à¤¨à¥‡ ?',
@@ -601,8 +639,8 @@ $2
तपाईंले पà¥à¤°à¤µà¥‡à¤¶ गरेर अहिले नैं नयाठपासवरà¥à¤¡ चà¥à¤¨à¥à¤¨à¥à¤¹à¥‹à¤¸à¥à¥¤ यदि अरॠकसैले अनà¥à¤°à¥‹à¤§ गरेको भठअथवा यदि तपाईंलाई मूल पासवरà¥à¤¡ याद भठअनि यसलाई परिवरà¥à¤¤à¤¨ गरà¥à¤¨ चाहनॠहà¥à¤¨à¥à¤¨ भनें, तपाईंले यस सनà¥à¤¦à¥‡à¤¶à¤²à¤¾à¤ˆ अनदेखा गरà¥à¤¨à¥à¤¹à¥‹à¤¸à¥ र पà¥à¤°à¤¾à¤¨à¥ˆ पासवरà¥à¤¡à¤²à¤¾à¤ˆ चालू राखà¥à¤¨à¥à¤¹à¥‹à¤¸à¥à¥¤',
'passwordreset-emailelement' => 'पà¥à¤°à¤¯à¥‹à¤—करà¥à¤¤à¤¾à¤•à¥‹ नाम: $1
असà¥à¤¥à¤¾à¤ˆ पासवरà¥à¤¡: $2',
-'passwordreset-emailsent' => 'à¤à¤‰à¤Ÿà¤¾ अनà¥à¤¸à¥à¤®à¤¾à¤°à¤• इमेल पठाइयो।',
-'passwordreset-emailsent-capture' => 'अनà¥à¤¸à¥à¤®à¤¾à¤°à¤• इमेल पठाइयो, जो तल देखाइà¤à¤•à¥‹à¤›à¥¤',
+'passwordreset-emailsent' => 'पासवरà¥à¤¡ परिवरà¥à¤¤à¤¨à¤•à¥‹ लागि इमेल पठाइà¤à¤•à¥‹ छ।',
+'passwordreset-emailsent-capture' => 'पासवरà¥à¤¡ परिवरà¥à¤¤à¤¨à¤•à¥‹ लागि इमेल पठाइयो, जà¥à¤¨ तल देखाइà¤à¤•à¥‹à¤›à¥¤',
# Special:ChangeEmail
'changeemail' => 'इमेल ठेगाना परिवरà¥à¤¤à¤¨ गरà¥à¤¨à¥à¤¹à¥‹à¤¸',
@@ -859,8 +897,8 @@ $2
लिजेंड: (चालू): '''({{int:cur}})''' = अवतरणको बीचमा अंतर, '''({{int:last}})''' = पहिलाका अवतरणको बीचमा अंतर, '''{{int:minoreditletter}}''' = सानो परिवरà¥à¤¤à¤¨à¥¤",
'history-fieldset-title' => 'इतिहासको विचरण गरà¥à¤¨à¥‡',
'history-show-deleted' => 'मेटिà¤à¤•à¤¾ मातà¥à¤°',
-'histfirst' => 'पहिलो',
-'histlast' => 'अनà¥à¤¤à¤¿à¤®',
+'histfirst' => 'पà¥à¤°à¤¾à¤¨à¥‹',
+'histlast' => 'नयाà¤',
'historysize' => '({{PLURAL:$1|१ बाइट |$1 बाइटहरà¥}})',
'historyempty' => '(खाली)',
@@ -1022,7 +1060,6 @@ $1",
'searchmenu-legend' => 'खोज विकलà¥à¤ª',
'searchmenu-exists' => "''' \"[[:\$1]]\" नाम गरेको पृषà¥à¤  यो विकीमा रहेको छ'''",
'searchmenu-new' => "'''यस विकिमा \"[[:\$1]]\" शीरà¥à¤·à¤• भà¤à¤•à¥‹ पृषà¥à¤  बनाउनà¥à¤¹à¥‹à¤¸à¥ !'''",
-'searchhelp-url' => 'Help:सामगà¥à¤°à¥€',
'searchmenu-prefix' => '[[Special:PrefixIndex/$1|पृषà¥à¤ à¤¹à¤°à¥ पà¥à¤°à¤¿à¤«à¤¿à¤•à¥à¤¸à¤²à¥‡ हेरà¥à¤¨à¥à¤¹à¥‹à¤¸à¥ ]]',
'searchprofile-articles' => 'सामगà¥à¤°à¥€ पृषà¥à¤ à¤¹à¤°à¥',
'searchprofile-project' => 'सहायता र आयोजना पृषà¥à¤ à¤¹à¤°à¥',
@@ -1044,7 +1081,7 @@ $1",
'search-interwiki-default' => '$1 नतिजाहरà¥:',
'search-interwiki-more' => '(अà¤à¥ˆ)',
'search-relatedarticle' => 'समà¥à¤¬à¤¨à¥à¤§à¤¿à¤¤',
-'mwsuggest-disable' => 'AJAX सà¥à¤à¤¾à¤µ निसà¥à¤•à¥à¤°à¤¿à¤¯ पारà¥à¤¨à¥à¤¹à¥‹à¤¸à¥',
+'mwsuggest-disable' => 'खोज सà¥à¤à¤¾à¤µà¤¹à¤°à¥ अकà¥à¤·à¤® पारà¥à¤¨à¥‡',
'searcheverything-enable' => 'सबै नेमसà¥à¤ªà¥‡à¤¸à¥‡à¤œà¤¹à¤°à¥à¤®à¤¾ खोजà¥à¤¨à¥à¤¹à¥‹à¤¸à¥',
'searchrelated' => 'समà¥à¤¬à¤¨à¥à¤§à¤¿à¤¤',
'searchall' => 'सबै',
@@ -1067,15 +1104,6 @@ $1",
हाललाई तपाईले गूगलदà¥à¤µà¤¾à¤°à¤¾ खोजà¥à¤¨ सकà¥à¤¨à¥à¤¹à¥à¤¨à¥à¤› ।
याद गरà¥à¤¨à¥à¤¹à¥‹à¤¸à¥ उनीहरà¥à¤•à¥‹ {{SITENAME}}को सूची सामगà¥à¤°à¥€ पà¥à¤°à¤¾à¤¨à¥‹ भà¤à¤•à¥‹ हà¥à¤¨à¤¸à¤•à¥à¤› ।',
-# Quickbar
-'qbsettings' => 'कà¥à¤µà¤¿à¤•à¤¬à¤¾à¤°',
-'qbsettings-none' => 'कà¥à¤¨à¥ˆà¤ªà¤¨à¤¿ होइन',
-'qbsettings-fixedleft' => 'देबà¥à¤°à¥‡ निशà¥à¤šà¤¿à¤¤ गरिà¤à¤•à¥‹',
-'qbsettings-fixedright' => 'दाहिने निशà¥à¤šà¤¿à¤¤ गरिà¤à¤•à¥‹',
-'qbsettings-floatingleft' => 'देबà¥à¤°à¥‡ तैरने',
-'qbsettings-floatingright' => 'दाहिने तैरने',
-'qbsettings-directionality' => 'तपाईको भाषाको लेखाइ दिशाको आधारमा मिलान गरिà¤à¤•à¥‹ छ',
-
# Preferences page
'preferences' => 'रोजाईहरू',
'mypreferences' => 'पà¥à¤°à¤¾à¤¥à¤®à¤¿à¤•à¤¤à¤¾à¤¹à¤°à¥',
@@ -1105,9 +1133,8 @@ $1",
'prefs-rendering' => 'सà¥à¤µà¤°à¥à¤ª',
'saveprefs' => 'संगà¥à¤°à¤¹',
'resetprefs' => 'संगà¥à¤°à¤¹ नगरिà¤à¤•à¤¾ परिवरà¥à¤¤à¤¨à¤¹à¤°à¥ सफागरà¥à¤¨à¥‡',
-'restoreprefs' => 'सबै पूरà¥à¤µà¤¨à¤¿à¤°à¥à¤§à¤¾à¤°à¤¿à¤¤ सà¥à¤¥à¤¿à¤¤à¥€ कायम गरà¥à¤¨à¥‡',
+'restoreprefs' => 'सबै पूरà¥à¤µà¤¨à¤¿à¤°à¥à¤§à¤¾à¤°à¤¿à¤¤ सà¥à¤¥à¤¿à¤¤à¥€ कायम गरà¥à¤¨à¥‡(सबै खणà¥à¤¡à¤¹à¤°à¥‚मा)',
'prefs-editing' => 'समà¥à¤ªà¤¾à¤¦à¤¨',
-'prefs-edit-boxsize' => 'समà¥à¤ªà¤¾à¤¦à¤¨ à¤à¥à¤¯à¤¾à¤²à¤•à¥‹ आकार',
'rows' => 'हरफहरॠ:',
'columns' => 'सà¥à¤¤à¤®à¥à¤­à¤¹à¤°à¥ :',
'searchresultshead' => 'खोज',
@@ -1118,9 +1145,6 @@ $1",
'recentchangesdays-max' => 'अधिकतम $1 {{PLURAL:$1|दिन|दिन}}',
'recentchangescount' => 'पूरà¥à¤µ निरà¥à¤§à¤¾à¤°à¤¿à¤¤à¤°à¥à¤ªà¤®à¤¾ देखाउनà¥à¤ªà¤°à¥à¤¨à¥‡ समà¥à¤ªà¤¾à¤¦à¤¨à¤¹à¤°à¥‚ :',
'prefs-help-recentchangescount' => 'यसमा हालका परिà¥à¤µà¤°à¥à¤¤à¤¨à¤¹à¤°à¥ , पृषà¥à¤  इतिहासहरॠ, र लग समाविषà¥à¤  छनॠ।',
-'prefs-help-watchlist-token' => 'यो फिलà¥à¤¡à¤®à¤¾ गोपà¥à¤¯ संकेत राखà¥à¤¨à¤¾à¤²à¥‡ तपाईà¤à¤•à¥‹ निगरानीसूचीको RSS फिड सृजन हà¥à¤¨à¥‡ छ ।
-संकेत थाहा पाउने जो कसैले तपाईको निगरानी सूची पढà¥à¤¨ सकà¥à¤¨à¥‡ भà¤à¤•à¥‹à¤²à¥‡ , सà¥à¤°à¤•à¥à¤·à¤¿à¤¤ मान छानà¥à¤¨à¥à¤¹à¥‹à¤²à¤¾ ।
-यहाठजथाभावीरà¥à¤ªà¤®à¤¾-सृजना गरिà¤à¤•à¥‹ तपाईले पà¥à¤°à¤¯à¥‹à¤— गरà¥à¤¨à¥‡ सकà¥à¤¨à¥à¤¹à¥à¤¨à¥‡ मान छ : $1',
'savedprefs' => 'तपाईंका अभिरà¥à¤šà¤¿à¤¹à¤°à¥‚ सङà¥à¤—à¥à¤°à¤¹à¤¿à¤¤ भयो।',
'timezonelegend' => 'समय कà¥à¤·à¥‡à¤¤à¥à¤° :',
'localtime' => 'सà¥à¤¥à¤¾à¤¨à¤¿à¤¯ समय:',
@@ -1151,11 +1175,10 @@ $1",
'prefs-reset-intro' => 'तपाईले यो पृषà¥à¤  आफà¥à¤¨à¥‹ अभिरà¥à¤šà¥€à¤¹à¤°à¥‚ साइट पूरà¥à¤µà¤¾à¤µà¤¸à¥à¤¥à¤¾à¤®à¤¾ फरà¥à¤•à¤¾à¤‰à¤¨ पà¥à¤°à¤¯à¥‹à¤— गरà¥à¤¨ सकà¥à¤¨à¥à¤¹à¥à¤¨à¥à¤› ।
यो रदà¥à¤¦ गरà¥à¤¨ सकà¥à¤¨à¥à¤¹à¥à¤¨à¥à¤› ।',
'prefs-emailconfirm-label' => 'इ-मेल à¤à¤•à¤¿à¤¨ पà¥à¤°à¤•à¥à¤°à¤¿à¤¯à¤¾ :',
-'prefs-textboxsize' => 'समà¥à¤ªà¤¾à¤¦à¤¨ विनà¥à¤¡à¥‹à¤•à¥‹ आकार',
'youremail' => 'ईमेल',
'username' => '{{GENDER:$1|पà¥à¤°à¤¯à¥‹à¤—करà¥à¤¤à¤¾ नाम}}:',
-'uid' => 'पà¥à¤°à¥‹à¤—करà¥à¤¤à¤¾ आइडी:',
-'prefs-memberingroups' => 'निमà¥à¤¨ {{PLURAL:$1|समूह | समूहहरू}}को सदसà¥à¤¯ :',
+'uid' => '{{GENDER:$1|पà¥à¤°à¤¯à¥‹à¤—करà¥à¤¤à¤¾}} ID:',
+'prefs-memberingroups' => 'निमà¥à¤¨ {{PLURAL:$1|समूह | समूहहरू}}को {{GENDER:$2|सदसà¥à¤¯}} :',
'prefs-memberingroups-type' => '$1',
'prefs-registration' => 'दरà¥à¤¤à¤¾ समय:',
'prefs-registration-date-time' => '$1',
@@ -1168,10 +1191,10 @@ $1",
HTML टà¥à¤¯à¤¾à¤—हरॠजाà¤à¤šà¥à¤¨à¥à¤¹à¥‹à¤¸à¥ ।',
'badsiglength' => 'तपाईको दसà¥à¤¤à¤–त धेरै लामो छ।
यो $1 {{PLURAL:$1|अकà¥à¤·à¤°|अकà¥à¤·à¤°à¤¹à¤°à¥‚}} भनà¥à¤¦à¤¾ लामो हà¥à¤¨à¥ हà¥à¤à¤¦à¥ˆà¤¨ ।',
-'yourgender' => 'लिङà¥à¤—:',
-'gender-unknown' => 'नखà¥à¤²à¥‡à¤•à¥‹',
-'gender-male' => 'पà¥à¤°à¥‚ष',
-'gender-female' => 'महिला',
+'yourgender' => 'कसरी वताउन चाहनà¥à¤¹à¥à¤¨à¥à¤› ?',
+'gender-unknown' => 'म खà¥à¤²à¤¾à¤‰à¤¨ चाहनà¥à¤¨',
+'gender-male' => 'उसले विकि पृषà¥à¤ à¤¹à¤°à¥‚ समà¥à¤ªà¤¾à¤¦à¤¨ गरà¥à¤›',
+'gender-female' => 'उनले विकि पृषà¥à¤  समà¥à¤ªà¤¾à¤¦à¤¨ गरà¥à¤›à¤¿à¤¨',
'prefs-help-gender' => 'वैकलà¥à¤ªà¤¿à¤•: सफà¥à¤Ÿà¤µà¥‡à¤¯à¤°à¤²à¥‡ लिङगानà¥à¤¸à¤¾à¤° समà¥à¤¬à¥‹à¤§à¤¨ गरà¥à¤¨à¤•à¥‹ लागि पà¥à¤°à¤¯à¥‹à¤— गरिनà¥à¤› ।
यो जानकारी सारà¥à¤µà¤œà¤¨à¤¿à¤• हà¥à¤¨à¥‡à¤› ।',
'email' => 'ईमेल',
@@ -1185,7 +1208,7 @@ HTML टà¥à¤¯à¤¾à¤—हरॠजाà¤à¤šà¥à¤¨à¥à¤¹à¥‹à¤¸à¥ ।',
'prefs-signature' => 'हसà¥à¤¤à¤¾à¤•à¥à¤·à¤°',
'prefs-dateformat' => 'मिति ढाà¤à¤šà¤¾',
'prefs-timeoffset' => 'समय अफसेट',
-'prefs-advancedediting' => 'सामानà¥à¤¯',
+'prefs-advancedediting' => 'सामानà¥à¤¯ विकलà¥à¤ªà¤¹à¤°à¥‚',
'prefs-advancedrc' => 'उनà¥à¤¨à¤¤ विकलà¥à¤ªà¤¹à¤°à¥‚',
'prefs-advancedrendering' => 'उनà¥à¤¨à¤¤ विकलà¥à¤ªà¤¹à¤°à¥',
'prefs-advancedsearchoptions' => 'उनà¥à¤¨à¤¤ विकलà¥à¤ªà¤¹à¤°à¥‚',
@@ -1284,7 +1307,7 @@ HTML टà¥à¤¯à¤¾à¤—हरॠजाà¤à¤šà¥à¤¨à¥à¤¹à¥‹à¤¸à¥ ।',
'right-proxyunbannable' => 'पà¥à¤°à¥‹à¤•à¥à¤¸à¤¿à¤•à¥‹ सà¥à¤µà¤¤: रोक कटेर जाने',
'right-unblockself' => 'तिनीहरॠआफैंलाई खà¥à¤²à¥à¤²à¤¾ गरà¥à¤›à¤¨à¥',
'right-protect' => 'सà¥à¤°à¤•à¥à¤·à¤¾ सà¥à¤¤à¤° परिवरà¥à¤¤à¤¨ गरà¥à¤¨à¥‡ र जोगाइà¤à¤•à¤¾ पृषà¥à¤ à¤¹à¤°à¥ समà¥à¤ªà¤¾à¤¦à¤¨ गरà¥à¤¨à¥‡',
-'right-editprotected' => 'जोगाइà¤à¤•à¤¾ पृषà¥à¤ à¤¹à¤°à¥ समà¥à¤ªà¤¾à¤¦à¤¨ गरà¥à¤¨à¥‡(कà¥à¤¯à¤¾à¤¸à¤•à¥‡à¤¡à¤¿à¤™à¥à¤— सà¥à¤°à¤•à¥à¤·à¤¾ नभà¤à¤•à¤¾)',
+'right-editprotected' => '"{{int:protect-level-sysop}}" को हैसियतले सà¥à¤°à¤•à¥à¤·à¤¿à¤¤ पृषà¥à¤ à¤¹à¤°à¥ समà¥à¤ªà¤¾à¤¦à¤¨ गरà¥à¤¨à¥‡',
'right-editinterface' => 'पà¥à¤°à¤¯à¥‹à¤—करà¥à¤¤à¤¾ अनà¥à¤¤à¤°à¤®à¥‹à¤¹à¤¡à¤¾ समà¥à¤ªà¤¾à¤¦à¤¨ गरà¥à¤¨à¥‡',
'right-editusercssjs' => 'पà¥à¤°à¤¯à¥‹à¤—करà¥à¤¤à¤¾à¤•à¥‹ CSS र JS फाइलहरॠसमà¥à¤ªà¤¾à¤¦à¤¨ गरà¥à¤¨à¥‡',
'right-editusercss' => 'पà¥à¤°à¤¯à¥‹à¤—करà¥à¤¤à¤¾à¤•à¥‹ CSS फाइलहरॠसमà¥à¤ªà¤¾à¤¦à¤¨ गरà¥à¤¨à¥‡',
@@ -1392,7 +1415,6 @@ HTML टà¥à¤¯à¤¾à¤—हरॠजाà¤à¤šà¥à¤¨à¥à¤¹à¥‹à¤¸à¥ ।',
'recentchangeslinked-feed' => 'संबनà¥à¤§à¤¿à¤¤ परिवरà¥à¤¤à¤¨à¤¹à¤°à¥',
'recentchangeslinked-toolbox' => 'संबनà¥à¤§à¤¿à¤¤ परिवरà¥à¤¤à¤¨à¤¹à¤°à¥',
'recentchangeslinked-title' => '"$1"समà¥à¤µà¤¨à¥à¤§à¤¿à¤¤ परिवरà¥à¤¤à¤¨à¤¸à¤à¤—',
-'recentchangeslinked-noresult' => 'जोडिà¤à¤•à¤¾ पृषà¥à¤ à¤¹à¤°à¥à¤®à¤¾ दिइà¤à¤•à¥‹ समयावधीमा कà¥à¤¨à¥ˆ पनि परिवरà¥à¤¤à¤¨ भà¤à¤•à¥‹ छैन ।',
'recentchangeslinked-summary' => "यो सूची निरà¥à¤¦à¤¿à¤·à¥à¤Ÿ पृषà¥à¤  (वा निरà¥à¤¦à¤¿à¤·à¥à¤Ÿ शà¥à¤°à¥‡à¤£à¥€)सित जोड़िà¤à¤•à¤¾ भरà¥à¤–रै परिवरà¥à¤¤à¤¨ भà¤à¤•à¤¾ पृषà¥à¤ à¤•à¥‹ हो। [[Special:Watchlist|तपाईà¤à¤•à¥‹ निगरानी सूची]]का पृषà¥à¤ à¤¹à¤°à¥ '''गाढा अकà¥à¤·à¤°à¤®à¤¾''' छनà¥à¥¤",
'recentchangeslinked-page' => 'पृषà¥à¤  नाम:',
'recentchangeslinked-to' => 'यसको सटà¥à¤Ÿà¤¾ यो पृषà¥à¤ à¤¸à¤à¤— जोडिà¤à¤•à¤¾ पृषà¥à¤ à¤¹à¤°à¥à¤•à¥‹ परिवरà¥à¤¤à¤¨ देखाउने',
@@ -1403,7 +1425,7 @@ HTML टà¥à¤¯à¤¾à¤—हरॠजाà¤à¤šà¥à¤¨à¥à¤¹à¥‹à¤¸à¥ ।',
'reuploaddesc' => 'उरà¥à¤§à¥à¤µà¤­à¤°à¤£ रदà¥à¤¦ गरà¥à¤¨à¥‡ र उरà¥à¤§à¥à¤µà¤­à¤°à¤£ फारमतिर जाने',
'upload-tryagain' => 'संशोधित फाइल विवरण बà¥à¤à¤¾à¤‰à¤¨à¥‡',
'uploadnologin' => 'पà¥à¤°à¤µà¥‡à¤¶ (लग ईन) नगरिà¤à¤•à¥‹',
-'uploadnologintext' => 'फाइल उरà¥à¤§à¥à¤µà¤­à¤°à¤£ गरà¥à¤¨ तपाईंले [[Special:UserLogin|पà¥à¤°à¤µà¥‡à¤¶]] गरà¥à¤¨à¥à¤ªà¤°à¥à¤›à¥¤',
+'uploadnologintext' => 'फाइल उरà¥à¤§à¥à¤µà¤­à¤°à¤£ गरà¥à¤¨ तपाईंले $1 गरà¥à¤¨à¥à¤ªà¤°à¥à¤›à¥¤',
'upload_directory_missing' => 'उरà¥à¤§à¥à¤µà¤­à¤°à¤£ डाइरेकà¥à¤Ÿà¤°à¥€ ($1) हराइरहेको छ र वेवसरà¥à¤­à¤°à¤²à¥‡ नयाठडाइरेकà¥à¤Ÿà¤°à¥€ निरà¥à¤®à¤¾à¤£à¤—रà¥à¤¨ असमरà¥à¤¥ भयो ।',
'upload_directory_read_only' => 'उरà¥à¤§à¥à¤µ भरण डाइरेकà¥à¤Ÿà¤°à¥€ ($1) वेवसरà¥à¤­à¤° दà¥à¤µà¤¾à¤°à¤¾ लेखà¥à¤¯ छैन ।',
'uploaderror' => 'उरà¥à¤§à¥à¤µà¤­à¤°à¤£ तà¥à¤°à¥à¤Ÿà¤¿',
@@ -1546,7 +1568,6 @@ $1',
'http-read-error' => 'HTTP बà¥à¤à¤¾à¤‡à¤®à¤¾ तà¥à¤°à¥à¤Ÿà¤¿à¥¤',
'http-timed-out' => 'HTTP माà¤à¤—िà¤à¤•à¥‹ समय सकियो।',
'http-curl-error' => 'URL $1 लिनमा तà¥à¤°à¥à¤Ÿà¤¿',
-'http-host-unreachable' => 'URL मा पà¥à¤—à¥à¤¨ सकिà¤à¤¨à¥¤',
# Some likely curl errors. More could be added from <http://curl.haxx.se/libcurl/c/libcurl-errors.html>
'upload-curl-error6' => 'URLमा पà¥à¤—à¥à¤¨ सकिà¤à¤¨',
@@ -1665,9 +1686,6 @@ $1',
'statistics-users-active-desc' => 'पà¥à¤°à¤¯à¥‹à¤—करà¥à¤¤à¤¾à¤¹à¤°à¥ जो{{PLURAL:$1|बितेको à¤à¤• दिन|बितेका $1 दिनहरà¥}}देखि जो सकà¥à¤°à¤¿à¤¯ छनà¥',
'statistics-mostpopular' => 'सबैभनà¥à¤¦à¤¾ धेरै हेरिà¤à¤•à¥‹ पृषà¥à¤ à¤¹à¤°à¥',
-'disambiguations' => 'सà¥à¤ªà¤·à¥à¤Ÿà¤¿à¤•à¤°à¤£ पृषà¥à¤ à¤®à¤¾ जोडिà¤à¤•à¤¾ पृषà¥à¤ à¤¹à¤°à¥',
-'disambiguationspage' => 'Template:बहà¥à¤µà¤¿à¤•à¤²à¥à¤ª',
-
'doubleredirects' => 'दोहोरो अनà¥à¤ªà¥à¤°à¥‡à¤·à¤£',
'double-redirect-fixed-move' => '[[$1]] सारिà¤à¤•à¥‹ छ।
यसले [[$2]] तिर अनà¥à¤ªà¥à¤°à¥‡à¤·à¤¿à¤¤ गरà¥à¤¦à¤›à¥¤',
@@ -1884,10 +1902,9 @@ $1',
'unwatchthispage' => 'निगरानीबाट हटाउने',
'notanarticle' => 'सामागà¥à¤°à¥€ सहितको पेज हैन',
'notvisiblerev' => 'पूरà¥à¤µà¤¾à¤µà¤²à¥‹à¤•à¤¨ हटाइयो',
-'watchnochange' => 'दिइà¤à¤•à¥‹ समय अवधीभितà¥à¤° निगरानी सà¥à¤šà¥€à¤®à¤¾ रहेका कà¥à¤¨à¥ˆ पनि सामागà¥à¤°à¥€ समà¥à¤ªà¤¾à¤¦à¤¨ भà¤à¤•à¥‹ छैनन ।',
'watchlist-details' => 'तपाईको निगरानी सूचीमा रहेका{{PLURAL:$1|$1 पृषà¥à¤ |$1 पृषà¥à¤ à¤¹à¤°à¥}}वारà¥à¤¤à¤¾à¤²à¤¾à¤ªà¤®à¤¾ पृषà¥à¤ à¤®à¤¾ गनिà¤à¤•à¤¾ छैननॠ।',
-'wlheader-enotif' => '* ईमेलदà¥à¤µà¤¾à¤°à¤¾ जानकारी गराउने तरिका सकà¥à¤°à¤¿à¤¯ गरियो ।',
-'wlheader-showupdated' => "* तपाइले पछिलà¥à¤²à¥‹ पलà¥à¤Ÿ भà¥à¤°à¤®à¤£ गरेपछि परिवरà¥à¤¤à¤¨ भà¤à¤•à¤¾ पृषà¥à¤ à¤¹à¤°à¥‚लाई '''गाढा''' गरेर देखाइà¤à¤•à¥‹ छ ।",
+'wlheader-enotif' => 'ईमेलदà¥à¤µà¤¾à¤°à¤¾ जानकारी गराउने तरिका सकà¥à¤°à¤¿à¤¯ गरियो ।',
+'wlheader-showupdated' => "तपाइले पछिलà¥à¤²à¥‹ पलà¥à¤Ÿ भà¥à¤°à¤®à¤£ गरेपछि परिवरà¥à¤¤à¤¨ भà¤à¤•à¤¾ पृषà¥à¤ à¤¹à¤°à¥‚लाई '''गाढा''' गरेर देखाइà¤à¤•à¥‹ छ ।",
'watchmethod-recent' => 'निगरानी सà¥à¤šà¥€à¤®à¤¾ रहेका पृषà¥à¤ à¤®à¤¾ गरिà¤à¤•à¤¾ समà¥à¤ªà¤¾à¤¦à¤¨à¤¹à¤°à¥ जाà¤à¤šà¥à¤¦à¥ˆ',
'watchmethod-list' => 'समà¥à¤ªà¤¦à¤¾à¤¨ गरिà¤à¤•à¤¾ निगरानी सà¥à¤šà¥€à¤®à¤¾ रहेका पृषà¥à¤ à¤¹à¤°à¥à¤•à¥‹ समà¥à¤ªà¤¾à¤¦à¤¨ जाà¤à¤šà¥à¤¦à¥ˆ',
'watchlistcontains' => 'तपाईको निगरानी सà¥à¤šà¥€à¤®à¤¾ $1 {{PLURAL:$1|पृषà¥à¤ |पृषà¥à¤ à¤¹à¤°à¥}}रहेका छनॠ।',
@@ -2266,12 +2283,9 @@ $1को बनà¥à¤¦à¥‡à¤œà¤•à¥‹ कारण : "$2" हो',
यो à¤à¤• रेनà¥à¤œ रोक $2, को अनà¥à¤¤à¤°à¥à¤—त रहेको छ जसलाई रोक खोलà¥à¤¨ मिलà¥à¤› ।',
'ip_range_invalid' => 'IP कà¥à¤·à¥‡à¤¤à¥à¤° अमानà¥à¤¯ ।',
'ip_range_toolarge' => ' /$1 भनà¥à¤¦à¤¾ ठूलो रेनà¥à¤œ रोक लगाउन पाइदैन ।.',
-'blockme' => 'मलाई निषेध गरà¥à¤¨à¥‡',
'proxyblocker' => 'पà¥à¤°à¥‹à¤•à¥à¤¸à¥€ निषेध गरà¥à¤¨à¥‡',
-'proxyblocker-disabled' => 'यो कारà¥à¤¯ निषà¥à¤•à¥ƒà¤¯ पारिà¤à¤•à¥‹ छ।',
'proxyblockreason' => 'तपाईको IP ठेगानामा रोक लगाइà¤à¤•à¥‹ छ किनकी यो खà¥à¤²à¤¾ पà¥à¤°à¥‹à¤•à¥à¤¸à¥€ हो ।
कृपया तपाईको इनà¥à¤Ÿà¤°à¤¨à¥‡à¤Ÿ सेवा पà¥à¤°à¤¦à¤¾à¤¯à¤• या पà¥à¤°à¤¾à¤µà¤¿à¤§à¤¿à¤• सहायतालाई समà¥à¤ªà¤°à¥à¤• गरी यस सà¥à¤°à¤•à¥à¤·à¤¾ समसà¥à¤¯à¤¾à¤•à¥‹ बारेमा जानकारी गराउनà¥à¤¹à¥‹à¤¸à¥ ।',
-'proxyblocksuccess' => 'सकियो.',
'sorbs' => 'DNSBL',
'sorbsreason' => 'तपाईको IP ठेगाना खà¥à¤²à¥à¤²à¤¾ पà¥à¤°à¥‹à¤•à¥à¤¸à¥€à¤•à¥‹ रà¥à¤ªà¤®à¤¾ DNSBL मा सà¥à¤šà¥€à¤•à¤°à¤£ गरिà¤à¤•à¥‹ छ यसलाई{{SITENAME}}ले पà¥à¤°à¤¯à¥‹à¤—मा लà¥à¤¯à¤¾à¤à¤•à¥‹ छ।',
'sorbs_create_account_reason' => 'तपाईको IP ठेगाना खà¥à¤²à¥à¤²à¤¾ पà¥à¤°à¥‹à¤•à¥à¤¸à¥€à¤•à¥‹ रà¥à¤ªà¤®à¤¾ DNSBL मा सà¥à¤šà¥€à¤•à¤°à¤£ गरिà¤à¤•à¥‹ छ यसलाई{{SITENAME}}ले पà¥à¤°à¤¯à¥‹à¤—मा लà¥à¤¯à¤¾à¤à¤•à¥‹ छ।
@@ -2520,17 +2534,11 @@ $1को बनà¥à¤¦à¥‡à¤œà¤•à¥‹ कारण : "$2" हो',
# Stylesheets
'common.css' => '/* यहाठराखिà¤à¤•à¤¾ CSS सबै खोलहरà¥à¤®à¤¾ लागॠहà¥à¤¨à¥‡à¤›à¤¨à¥ */',
-'standard.css' => '/* यहाठराखिà¤à¤•à¤¾ CSS हरà¥à¤²à¥‡ सà¥à¤¤à¤°à¥€à¤¯ खोल पà¥à¤°à¤¯à¥‹à¤— गरà¥à¤¨à¥‡ पà¥à¤°à¤¯à¥‹à¤—करà¥à¤¤à¤¾à¤¹à¤°à¥à¤²à¤¾à¤ˆ पà¥à¤°à¤­à¤¾à¤µà¤¿à¤¤ पारà¥à¤› */',
-'nostalgia.css' => '/* यहाठराखिà¤à¤•à¥‹ CSS ले नसà¥à¤Ÿà¤¾à¤²à¥à¤œà¤¿à¤¯à¤¾ सà¥à¤•à¤¿à¤¨à¤•à¥‹ पà¥à¤°à¤¯à¥‹à¤—करà¥à¤¤à¤¾à¤¹à¤°à¥à¤²à¤¾à¤ˆ पà¥à¤°à¤­à¤¾à¤µà¤¿à¤¤ गरà¥à¤¨à¥‡ छ */',
'cologneblue.css' => '/* यहाठराखिà¤à¤•à¥‹ CSS ले कोलोगà¥à¤¨à¥‡ बà¥à¤²à¥ सà¥à¤•à¤¿à¤¨à¤•à¥‹ पà¥à¤°à¤¯à¥‹à¤—करà¥à¤¤à¤¾à¤¹à¤°à¥à¤²à¤¾à¤ˆ पà¥à¤°à¤­à¤¾à¤µà¤¿à¤¤ गरà¥à¤¨à¥‡ छ */',
'monobook.css' => '/* यहाठराखिà¤à¤•à¥‹ CSS ले मोनोबà¥à¤• सà¥à¤•à¤¿à¤¨à¤•à¥‹ पà¥à¤°à¤¯à¥‹à¤—करà¥à¤¤à¤¾à¤¹à¤°à¥à¤²à¤¾à¤ˆ पà¥à¤°à¤­à¤¾à¤µà¤¿à¤¤ गरà¥à¤¨à¥‡ छ */',
-'myskin.css' => '/* यहाठराखिà¤à¤•à¥‹ CSS ले माइसà¥à¤•à¤¿à¤¨ सà¥à¤•à¤¿à¤¨à¤•à¥‹ पà¥à¤°à¤¯à¥‹à¤—करà¥à¤¤à¤¾à¤¹à¤°à¥à¤²à¤¾à¤ˆ पà¥à¤°à¤­à¤¾à¤µà¤¿à¤¤ गरà¥à¤¨à¥‡ छ */',
-'chick.css' => '/* यहाठराखिà¤à¤•à¥‹ CSS ले चिक सà¥à¤•à¤¿à¤¨à¤•à¥‹ पà¥à¤°à¤¯à¥‹à¤—करà¥à¤¤à¤¾à¤¹à¤°à¥à¤²à¤¾à¤ˆ पà¥à¤°à¤­à¤¾à¤µà¤¿à¤¤ गरà¥à¤¨à¥‡ छ */',
-'simple.css' => '/* यहाठराखिà¤à¤•à¥‹ CSS ले सिमà¥à¤ªà¤² सà¥à¤•à¤¿à¤¨à¤•à¥‹ पà¥à¤°à¤¯à¥‹à¤—करà¥à¤¤à¤¾à¤¹à¤°à¥à¤²à¤¾à¤ˆ पà¥à¤°à¤­à¤¾à¤µà¤¿à¤¤ गरà¥à¤¨à¥‡ छ */',
'modern.css' => '/* यहाठराखिà¤à¤•à¥‹ CSS ले मोनोबà¥à¤• मोडरà¥à¤¨ पà¥à¤°à¤¯à¥‹à¤—करà¥à¤¤à¤¾à¤¹à¤°à¥à¤²à¤¾à¤ˆ पà¥à¤°à¤­à¤¾à¤µà¤¿à¤¤ गरà¥à¤¨à¥‡ छ */',
'vector.css' => '/* यहाठराखिà¤à¤•à¥‹ CSS ले भेकà¥à¤Ÿà¤° सà¥à¤•à¤¿à¤¨à¤•à¥‹ पà¥à¤°à¤¯à¥‹à¤—करà¥à¤¤à¤¾à¤¹à¤°à¥à¤²à¤¾à¤ˆ पà¥à¤°à¤­à¤¾à¤µà¤¿à¤¤ गरà¥à¤¨à¥‡ छ */',
'print.css' => '/* यहाठराखिà¤à¤•à¥‹ CSS मà¥à¤¦à¥à¤°à¤£ नतिजालाई पà¥à¤°à¤­à¤¾à¤µà¤¿à¤¤ गरà¥à¤› */',
-'handheld.css' => '/* यहाठराखिà¤à¤•à¥‹ CSS ले हाते मेसिनहरà¥(मोबाईल) सà¥à¤•à¤¿à¤¨à¤²à¤¾à¤ˆ पà¥à¤°à¤­à¤¾à¤µà¤¿à¤¤ गरà¥à¤› जà¥à¤¨ $wgHandheldStyle मा निरà¥à¤§à¤¾à¤°à¤£ गरिà¤à¤•à¥‹ छ */',
# Metadata
'notacceptable' => 'विकि सरà¥à¤­à¤° तपाइको कà¥à¤²à¤¾à¤‡à¤¨à¥à¤Ÿà¤²à¤¾à¤‡ जà¥à¤¨ पà¥à¤°à¤•à¤¾à¤°à¤•à¥‹ डाटा चाहिनà¥à¤› तà¥à¤¯à¤¸ पà¥à¤°à¤•à¤¾à¤°à¤²à¥‡ दिन सकà¥à¤¦à¥ˆà¤¨à¥¤',
@@ -2565,13 +2573,8 @@ $1को बनà¥à¤¦à¥‡à¤œà¤•à¥‹ कारण : "$2" हो',
'pageinfo-authors' => 'फरक समà¥à¤ªà¤¾à¤¦à¤•à¤°à¥à¤•à¥‹ संखà¥à¤¯à¤¾',
# Skin names
-'skinname-standard' => 'कà¥à¤²à¤¾à¤¸à¤¿à¤•',
-'skinname-nostalgia' => 'नोसà¥à¤Ÿà¤¾à¤²à¥à¤œà¤¿à¤¯à¤¾',
'skinname-cologneblue' => 'कोलोगà¥à¤¨à¥‡ निलो',
'skinname-monobook' => 'मोनोबà¥à¤•',
-'skinname-myskin' => 'माइसà¥à¤•à¤¿à¤¨',
-'skinname-chick' => 'चिक',
-'skinname-simple' => 'सिमà¥à¤ªà¤²',
'skinname-modern' => 'मोडरà¥à¤¨',
'skinname-vector' => 'भेकà¥à¤Ÿà¤°',
@@ -2676,7 +2679,7 @@ Others will be hidden by default.
* gpslongitude
* gpsaltitude',
-# EXIF tags
+# Exif tags
'exif-imagewidth' => 'चौडाइ',
'exif-imagelength' => 'उचाई',
'exif-bitspersample' => 'घटक पà¥à¤°à¤¤à¤¿ बिटà¥à¤¸',
@@ -2850,7 +2853,7 @@ $4, $5, $6 $7
$8',
'exif-subjectnewscode-value' => '$2 ($1)',
-# EXIF attributes
+# Exif attributes
'exif-compression-1' => 'नखादिà¤à¤•à¥‹(कमà¥à¤ªà¥à¤°à¥‡à¤¸ नगरिà¤à¤•à¥‹)',
'exif-compression-2' => 'CCITT समूह 3 1-Dimensional Modified Huffman संचालन इनà¥à¤•à¥‹à¤¡à¤¿à¤™à¥à¤—',
'exif-compression-3' => 'CCITT Group 3 फà¥à¤¯à¤¾à¤•à¥à¤¸ इनà¥à¤•à¥‹à¤¡à¤¿à¤™à¥à¤—',
@@ -3162,7 +3165,6 @@ $5
'semicolon-separator' => ';&#32;',
'comma-separator' => ',&#32;',
'colon-separator' => ':&#32;',
-'autocomment-prefix' => '-&#32;',
'pipe-separator' => '&#32;•&#32;',
'word-separator' => '&#32;',
'ellipsis' => '...',
@@ -3309,7 +3311,6 @@ $5
'version-other' => 'अनà¥à¤¯',
'version-mediahandlers' => 'मिडिया हà¥à¤¯à¤¾à¤¨à¥à¤¡à¤²à¤°à¤¹à¤°à¥‚',
'version-hooks' => 'अंकà¥à¤¶à¤¹à¤°à¥',
-'version-extension-functions' => 'अतिरिकà¥à¤¤ पà¥à¤°à¤•à¤¾à¤°à¥à¤¯',
'version-parser-extensiontags' => 'पारà¥à¤¸à¤° विसà¥à¤¤à¤¾à¤° टà¥à¤¯à¤¾à¤—हरà¥',
'version-parser-function-hooks' => 'पारà¥à¤¸à¤° फङà¥à¤¸à¤¨ हà¥à¤•',
'version-hook-name' => 'हà¥à¤• नाम',
@@ -3323,15 +3324,6 @@ $5
'version-software-product' => 'उतà¥à¤ªà¤¾à¤¦à¤¨',
'version-software-version' => 'संसà¥à¤•à¤°à¤£',
-# Special:FilePath
-'filepath' => 'फाइल मारà¥à¤—:',
-'filepath-page' => 'फाइल',
-'filepath-submit' => 'जाने',
-'filepath-summary' => 'यस पृषà¥à¤ à¤²à¥‡ फाइको पूरा बाटो(पाथ) दिनà¥à¤› ।
-तसà¥à¤µà¤¿à¤°à¤¹à¥ पूरा रिजोलà¥à¤¯à¥à¤¶à¤¨à¤®à¤¾ देखाइनà¥à¤› अरॠफाइहरॠनिका समà¥à¤¬à¤¨à¥à¤§à¤¿à¤¤ अनà¥à¤ªà¥à¤°à¤¯à¥‹à¤—हरà¥à¤¸à¤à¤— खोलिनà¥à¤›à¤¨ ।
-
- "{{ns:file}}:" पà¥à¤°à¤¿à¤«à¤¿à¤•à¥à¤¸(पूरà¥à¤µà¤¸à¤°à¥à¤—) बिना फाइल नाम पà¥à¤°à¤µà¤¿à¤·à¥à¤Ÿ गरà¥à¤¨à¥à¤¹à¥‹à¤¸à¥ । .',
-
# Special:FileDuplicateSearch
'fileduplicatesearch' => 'नकà¥à¤•à¤² फाइल खोजà¥à¤¨à¥‡',
'fileduplicatesearch-summary' => 'हà¥à¤¯à¤¾à¤¸ मानको आधारमा दà¥à¤°à¥à¤¸à¥à¤¤ नकà¥à¤•à¤² फाइहरॠखोजà¥à¤¨à¥‡ ।',
diff --git a/languages/messages/MessagesNew.php b/languages/messages/MessagesNew.php
index 0c1e4790..939f0361 100644
--- a/languages/messages/MessagesNew.php
+++ b/languages/messages/MessagesNew.php
@@ -69,8 +69,6 @@ $messages = array(
'tog-enotifrevealaddr' => 'जिगॠइ-मेल थायà¥â€Œà¤¬à¤¾à¤¯à¥â€Œ नोटिफिकेसन इ-मेलयॠकà¥à¤¯à¤¨à¤¾à¤¦à¤¿à¤¸à¤',
'tog-shownumberswatching' => 'सà¥à¤µà¤¯à¤¾à¤šà¥à¤µà¤‚पिं छà¥à¤¯à¤²à¤¾à¤®à¤¿à¤¤à¥‡à¤—ॠलà¥à¤¯à¤¾à¤–ठकà¥à¤¯à¤¨à¤¾à¤¦à¤¿à¤¸à¤',
'tog-fancysig' => 'कचà¥à¤šà¤¾ हसà¥à¤¤à¤¾à¤•à¥à¤·à¤° (अटोमà¥à¤¯à¤¾à¤Ÿà¤¿à¤• लिङà¥à¤• मदेःकः)',
-'tog-externaleditor' => 'डिफलà¥à¤Ÿà¤‚ à¤à¤•à¥à¤¸à¥à¤Ÿà¤°à¥à¤¨à¤² à¤à¤¡à¤¿à¤Ÿà¤° छà¥à¤¯à¤²à¤¾à¤¦à¤¿à¤¸à¤ (à¤à¤•à¥à¤¸à¥à¤ªà¤°à¥à¤Ÿà¤¤à¥‡à¤—ॠनिंतिं जकà¥à¤•, छिगॠकमà¥à¤ªà¥à¤¯à¥à¤Ÿà¤°à¤¯à¥ विषेश सेटिङ माः)',
-'tog-externaldiff' => 'à¤à¤•à¥à¤¸à¥à¤Ÿà¤°à¥à¤¨à¤² डिफॠ(diff) डिफलà¥à¤Ÿà¤‚ छà¥à¤¯à¤²à¤¾à¤¦à¤¿à¤¸à¤ (à¤à¤•à¥à¤¸à¥à¤ªà¤°à¥à¤Ÿà¤¤à¥‡à¤—ॠनिंतिं जकà¥à¤•, छिगॠकमà¥à¤ªà¥à¤¯à¥à¤Ÿà¤°à¤¯à¥ विषेश सेटिङ माः)',
'tog-showjumplinks' => '"जमà¥à¤ª टà¥" à¤à¤¸à¤¿à¤¸à¤¿à¤¬à¤¿à¤²à¤¿à¤Ÿà¥€ लिङà¥à¤• इनेबल यानादिसà¤',
'tog-uselivepreview' => 'लाइभ पà¥à¤°à¤¿à¤­à¥à¤¯à¥ (जाभासà¥à¤•à¥à¤°à¤¿à¤ªà¥à¤Ÿ) इनेबल यानादिसठ(परिकà¥à¤·à¤£à¤•à¤¾à¤²)',
'tog-forceeditsummary' => 'समà¥à¤ªà¤¾à¤¦à¤¨ सार खालि तà¥à¤µà¤¤à¤¿à¤¬à¤¿à¤²à¥‡ जित सशंकित यानादिसà¤',
@@ -485,13 +483,8 @@ MySQL नं इरर "<tt>$3: $4</tt>" कà¥à¤¯à¤‚गॠदà¥à¥¤',
# Stylesheets
'common.css' => '/* थन तःगॠCSS सकल सà¥à¤•à¤¿à¤¨à¤¯à¥ छà¥à¤¯à¥â€Œà¤²à¤¿à¤—ॠजà¥à¤‡ */',
-'standard.css' => '/* थन तःगॠCSS नं सà¥à¤Ÿà¥à¤¯à¤¾à¤£à¥à¤¡à¤°à¥à¤¡ सà¥à¤•à¤¿à¤¨à¤¯à¤¾ छà¥à¤¯à¥â€Œà¤²à¤¾à¤®à¤¿à¤¤à¥‡à¤¤ पà¥à¤°à¤­à¤¾à¤µà¤¿à¤¤ याइ */',
-'nostalgia.css' => '/* थन तःगॠCSS नं नोसà¥à¤Ÿà¥à¤¯à¤¾à¤²à¥à¤œà¤¿à¤¯à¤¾ सà¥à¤•à¤¿à¤¨à¤¯à¤¾ छà¥à¤¯à¥â€Œà¤²à¤¾à¤®à¤¿à¤¤à¥‡à¤¤ असर याइ */',
'cologneblue.css' => '/* थन तःगॠCSS नं कोलोन बà¥à¤²à¥ सà¥à¤•à¤¿à¤¨à¤¯à¤¾ छà¥à¤¯à¥â€Œà¤²à¤¾à¤®à¤¿à¤¤à¥‡à¤¤ असर याइ */',
'monobook.css' => '/* थन तःगॠCSS नं मोनोबà¥à¤• सà¥à¤•à¤¿à¤¨à¤¯à¤¾ छà¥à¤¯à¥â€Œà¤²à¤¾à¤®à¤¿à¤¤à¥‡à¤¤ असर याइ */',
-'myskin.css' => '/* थन तःगॠCSS नं माइसà¥à¤•à¤¿à¤¨ सà¥à¤•à¤¿à¤¨à¤¯à¤¾ छà¥à¤¯à¥â€Œà¤²à¤¾à¤®à¤¿à¤¤à¥‡à¤¤ असर याइ */',
-'chick.css' => '/* थन तःगॠCSS नं चिक सà¥à¤•à¤¿à¤¨à¤¯à¤¾ छà¥à¤¯à¥â€Œà¤²à¤¾à¤®à¤¿à¤¤à¥‡à¤¤ असर याइ */',
-'simple.css' => '/* थन तःगॠCSS नं सिमà¥à¤ªà¤² सà¥à¤•à¤¿à¤¨à¤¯à¤¾ छà¥à¤¯à¥â€Œà¤²à¤¾à¤®à¤¿à¤¤à¥‡à¤¤ असर याइ */',
'modern.css' => '/* थन तःगॠCSS नं मोडरà¥à¤¨ सà¥à¤•à¤¿à¤¨à¤¯à¤¾ छà¥à¤¯à¥â€Œà¤²à¤¾à¤®à¤¿à¤¤à¥‡à¤¤ असर याइ */',
'print.css' => '/* थन तःगॠCSS नं पà¥à¤°à¤¿à¤¨à¥à¤Ÿ आउटपà¥à¤Ÿà¤¯à¤¾à¤¤ असर याइ */',
'handheld.css' => '/* थन तःगॠCSS नं $wgHandheldStyle आधारित हà¥à¤¯à¤¾à¤£à¥à¤¡à¤¹à¥‡à¤²à¥à¤¡ यनà¥à¤¤à¥à¤°à¤¯à¤¾à¤¤ असर याइ */',
@@ -499,7 +492,7 @@ MySQL नं इरर "<tt>$3: $4</tt>" कà¥à¤¯à¤‚गॠदà¥à¥¤',
# Attribution
'others' => 'मेमेगà¥',
-# EXIF tags
+# Exif tags
'exif-imagewidth' => 'बà¥à¤¯à¤¾à¤ƒ',
'exif-imagelength' => 'जाः',
'exif-imagedescription' => 'किपाया नां',
diff --git a/languages/messages/MessagesNiu.php b/languages/messages/MessagesNiu.php
index eaa2d499..bc490677 100644
--- a/languages/messages/MessagesNiu.php
+++ b/languages/messages/MessagesNiu.php
@@ -102,6 +102,9 @@ $messages = array(
'viewsource' => 'Kitekite ke mouaga',
# Login and logout pages
+'welcomecreation' => '== Fakalofa atu, kua fiafia ke hu mai $1 ==
+Kua talaga e haau a poko.
+Ua nimo ke hiki e haau tau [[Special:Preferences|manako {{SITENAME}}]].',
'yourname' => 'Matahigoa he tagata:',
'yourpassword' => 'Kupu fufu:',
'yourpasswordagain' => 'Liu lolomi e kupu fufu:',
diff --git a/languages/messages/MessagesNl.php b/languages/messages/MessagesNl.php
index de731733..ae86c2f1 100644
--- a/languages/messages/MessagesNl.php
+++ b/languages/messages/MessagesNl.php
@@ -10,6 +10,7 @@
* @author Annabel
* @author AvatarTeam
* @author B4bol4t
+ * @author Basvb
* @author DasRakel
* @author Effeietsanders
* @author Erwin
@@ -21,6 +22,7 @@
* @author GerardM
* @author Hamaryns
* @author HanV
+ * @author Hansmuller
* @author Jens Liebenau
* @author JurgenNL
* @author Kaganer
@@ -48,6 +50,8 @@
* @author Trijnstel
* @author Troefkaart
* @author Tvdm
+ * @author User555
+ * @author WTM
* @author Wiki13
* @author Wikiklaas
* @author Wolf Lambert
@@ -152,6 +156,8 @@ $magicWords = array(
'fullpagenamee' => array( '1', 'VOLLEDIGEPAGINANAAME', 'FULLPAGENAMEE' ),
'subpagename' => array( '1', 'DEELPAGINANAAM', 'SUBPAGENAME' ),
'subpagenamee' => array( '1', 'DEELPAGINANAAME', 'SUBPAGENAMEE' ),
+ 'rootpagename' => array( '1', 'ROOTPAGINANAAM', 'ROOTPAGENAME' ),
+ 'rootpagenamee' => array( '1', 'ROOTPAGINANAAME', 'ROOTPAGENAMEE' ),
'basepagename' => array( '1', 'BASISPAGINANAAM', 'BASEPAGENAME' ),
'basepagenamee' => array( '1', 'BASISPAGINANAAME', 'BASEPAGENAMEE' ),
'talkpagename' => array( '1', 'OVERLEGPAGINANAAM', 'TALKPAGENAME' ),
@@ -218,6 +224,7 @@ $magicWords = array(
'raw' => array( '0', 'RAUW:', 'RUW:', 'RAW:' ),
'displaytitle' => array( '1', 'WEERGEGEVENTITEL', 'TOONTITEL', 'DISPLAYTITLE' ),
'rawsuffix' => array( '1', 'V', 'R' ),
+ 'nocommafysuffix' => array( '0', 'GEENSCHEIDINGSTEKEN', 'NOSEP' ),
'newsectionlink' => array( '1', '__NIEUWESECTIELINK__', '__NIEUWESECTIEKOPPELING__', '__NEWSECTIONLINK__' ),
'nonewsectionlink' => array( '1', '__GEENNIEUWKOPJEKOPPELING__', '__GEENNIEUWESECTIELINK__', '__GEENNIEUWKOPJEVERWIJZING__', '__NONEWSECTIONLINK__' ),
'currentversion' => array( '1', 'HUIDIGEVERSIE', 'CURRENTVERSION' ),
@@ -276,7 +283,7 @@ $specialPageAliases = array(
'CreateAccount' => array( 'GebruikerAanmaken' ),
'Deadendpages' => array( 'VerwijslozePaginas', 'VerwijslozePagina’s', 'VerwijslozePagina\'s' ),
'DeletedContributions' => array( 'VerwijderdeBijdragen' ),
- 'Disambiguations' => array( 'Doorverwijspagina\'s', 'Doorverwijspaginas' ),
+ 'Disambiguations' => array( 'Doorverwijzingen' ),
'DoubleRedirects' => array( 'DubbeleDoorverwijzingen' ),
'EditWatchlist' => array( 'VolglijstBewerken' ),
'Emailuser' => array( 'GebruikerE-mailen', 'E-mailGebruiker' ),
@@ -314,6 +321,7 @@ $specialPageAliases = array(
'Myuploads' => array( 'MijnUploads' ),
'Newimages' => array( 'NieuweBestanden', 'NieuweAfbeeldingen' ),
'Newpages' => array( 'NieuwePaginas', 'NieuwePagina’s', 'NieuwePagina\'s' ),
+ 'PagesWithProp' => array( 'PaginasMetEigenschap', 'Pagina\'sMetEigenschap' ),
'PasswordReset' => array( 'WachtwoordOpnieuwInstellen' ),
'PermanentLink' => array( 'PermanenteVerwijzing' ),
'Popularpages' => array( 'PopulairePaginas', 'PopulairePagina’s', 'PopulairePagina\'s' ),
@@ -325,6 +333,7 @@ $specialPageAliases = array(
'Randomredirect' => array( 'WillekeurigeDoorverwijzing' ),
'Recentchanges' => array( 'RecenteWijzigingen' ),
'Recentchangeslinked' => array( 'RecenteWijzigingenGelinkt', 'VerwanteWijzigingen' ),
+ 'Redirect' => array( 'Doorverwijzen' ),
'Revisiondelete' => array( 'VersieVerwijderen', 'HerzieningVerwijderen', 'RevisieVerwijderen' ),
'Search' => array( 'Zoeken' ),
'Shortpages' => array( 'KortePaginas', 'KortePagina’s', 'KortePagina\'s' ),
@@ -390,9 +399,6 @@ $messages = array(
'tog-shownumberswatching' => 'Het aantal gebruikers weergeven dat deze pagina volgt',
'tog-oldsig' => 'Bestaande ondertekening:',
'tog-fancysig' => 'Als wikitekst behandelen (zonder automatische koppeling)',
-'tog-externaleditor' => 'Standaard een externe tekstbewerker gebruiken (alleen voor experts - voor deze functie zijn speciale instellingen nodig. [//www.mediawiki.org/wiki/Manual:External_editors Meer informatie]).',
-'tog-externaldiff' => 'Standaard een extern vergelijkingsprogramma gebruiken (alleen voor experts - voor deze functie zijn speciale instellingen nodig. [//www.mediawiki.org/wiki/Manual:External_editors Meer informatie]).',
-'tog-showjumplinks' => '"ga naar"-toegankelijkheidskoppelingen inschakelen',
'tog-uselivepreview' => '"Live voorvertoning" gebruiken (experimenteel)',
'tog-forceeditsummary' => 'Een melding geven bij een lege bewerkingssamenvatting',
'tog-watchlisthideown' => 'Eigen bewerkingen op mijn volglijst verbergen',
@@ -406,6 +412,8 @@ $messages = array(
'tog-showhiddencats' => 'Verborgen categorieën weergeven',
'tog-noconvertlink' => 'Paginanaamconversie uitschakelen',
'tog-norollbackdiff' => 'Wijzigingen weglaten na terugdraaien',
+'tog-useeditwarning' => 'U waarschuwen als u een bewerkte pagina die nog niet is opgeslagen wil verlaten',
+'tog-prefershttps' => 'Altijd een beveiligde verbinding gebruiken wanneer u bent aangemeld',
'underline-always' => 'Altijd',
'underline-never' => 'Nooit',
@@ -469,6 +477,18 @@ $messages = array(
'oct' => 'okt',
'nov' => 'nov',
'dec' => 'dec',
+'january-date' => '$1 januari',
+'february-date' => '$1 februari',
+'march-date' => '$1 maart',
+'april-date' => '$1 april',
+'may-date' => '$1 mei',
+'june-date' => '$1 juni',
+'july-date' => '$1 juli',
+'august-date' => '$1 augustus',
+'september-date' => '$1 september',
+'october-date' => '$1 oktober',
+'november-date' => '$1 november',
+'december-date' => '$1 december',
# Categories related messages
'pagecategories' => '{{PLURAL:$1|Categorie|Categorieën}}',
@@ -550,6 +570,7 @@ $messages = array(
'create-this-page' => 'Deze pagina aanmaken',
'delete' => 'Verwijderen',
'deletethispage' => 'Deze pagina verwijderen',
+'undeletethispage' => 'Pagina terugplaatsen',
'undelete_short' => '$1 {{PLURAL:$1|bewerking|bewerkingen}} terugplaatsen',
'viewdeleted_short' => '{{PLURAL: $1|Eén geschrapte bewerking |$1 geschrapte bewerkingen}} bekijken',
'protect' => 'Beveiligen',
@@ -593,7 +614,7 @@ $1',
'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).
+# 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).
'aboutsite' => 'Over {{SITENAME}}',
'aboutpage' => 'Project:Info',
'copyright' => 'De inhoud is beschikbaar onder de $1 tenzij anders aangegeven.',
@@ -603,7 +624,6 @@ $1',
'disclaimers' => 'Voorbehoud',
'disclaimerpage' => 'Project:Algemeen voorbehoud',
'edithelp' => 'Hulp bij bewerken',
-'edithelppage' => 'Help:Bewerken',
'helppage' => 'Help:Inhoud',
'mainpage' => 'Hoofdpagina',
'mainpage-description' => 'Hoofdpagina',
@@ -681,17 +701,12 @@ Een lijst met bestaande speciale pagina’s staat op [[Special:SpecialPages|{{in
# General errors
'error' => 'Fout',
'databaseerror' => 'Databasefout',
-'dberrortext' => 'Er is een syntaxisfout in het databaseverzoek opgetreden.
-Mogelijk zit er een fout in de software.
-Het laatste verzoek aan de database was:
-<blockquote><code>$1</code></blockquote>
-vanuit de functie "<code>$2</code>".
-De database gaf de volgende foutmelding "<samp>$3: $4</samp>".',
-'dberrortextcl' => 'Er is een syntaxisfout in het databaseverzoek opgetreden.
-Het laatste verzoek aan de database was:
-"$1"
-vanuit de functie "$2".
-De database gaf de volgende foutmelding: "$3: $4"',
+'databaseerror-text' => 'Er is een databasefout opgetreden.
+Dit kan duiden op een fout in de software.',
+'databaseerror-textcl' => 'Er is een databasefout opgetreden.',
+'databaseerror-query' => 'Zoekopdracht: $1',
+'databaseerror-function' => 'Functie: $1',
+'databaseerror-error' => 'Fout: $1',
'laggedslavemode' => "'''Waarschuwing:''' in deze pagina zijn recente wijzigingen mogelijk nog niet verwerkt.",
'readonly' => 'Database geblokkeerd',
'enterlockreason' => 'Geef een reden op voor de blokkade en geef op wanneer die waarschijnlijk wordt opgeheven',
@@ -725,6 +740,7 @@ Mogelijk is deze al door iemand anders verwijderd.',
'cannotdelete-title' => 'Pagina "$1" kan niet verwijderd worden',
'delete-hook-aborted' => 'Het verwijderen is afgebroken door een hook.
Er is geen toelichting beschikbaar.',
+'no-null-revision' => 'Het was niet mogelijk een lege nieuwe versie te maken voor de pagina "$1"',
'badtitle' => 'Ongeldige paginanaam',
'badtitletext' => 'De naam van de opgegeven pagina was ongeldig, leeg of bevatte een verkeerde intertaal- of interwikikoppeling.
Wellicht bevat de paginanaam niet toegestane tekens.',
@@ -749,12 +765,15 @@ Gebruik [//translatewiki.net/ translatewiki.net], het vertaalproject voor MediaW
'editinginterface' => "'''Waarschuwing:''' u bewerkt een pagina die interfacetekst voor de software bevat.
Bewerkingen op deze pagina beïnvloeden de gebruikersinterface van iedereen op deze wiki.
Gebruik [//translatewiki.net/ translatewiki.net], het vertaalproject voor MediaWiki, om vertalingen toe te voegen of te wijzigen voor alle wiki's.",
-'sqlhidden' => '(SQL-zoekopdracht verborgen)',
'cascadeprotected' => "Deze pagina kan niet bewerkt worden, omdat die is opgenomen in de volgende {{PLURAL:$1|pagina|pagina's}} die beveiligd {{PLURAL:$1|is|zijn}} met de cascade-optie:
$2",
'namespaceprotected' => "U hebt geen rechten om pagina's in de naamruimte '''$1''' te bewerken.",
'customcssprotected' => 'U kunt deze CSS-pagina niet bewerken, omdat die persoonlijke instellingen van een andere gebruiker bevat.',
'customjsprotected' => 'U kunt deze JavaScriptpagina niet bewerken, omdat die persoonlijke instellingen van een andere gebruiker bevat.',
+'mycustomcssprotected' => 'U hebt geen rechten om deze CSS-pagina te bewerken.',
+'mycustomjsprotected' => 'U hebt geen rechten om deze JavaScriptpagina te bewerken.',
+'myprivateinfoprotected' => 'U hebt geen rechten om uw privégegevens te bewerken.',
+'mypreferencesprotected' => 'U hebt geen rechten om uw voorkeuren aan te passen.',
'ns-specialprotected' => 'Pagina\'s in de naamruimte "{{ns:special}}" kunnen niet bewerkt worden.',
'titleprotected' => "Het aanmaken van deze pagina is beveiligd door [[User:$1|$1]].
De gegeven reden is ''$2''.",
@@ -779,10 +798,19 @@ Sommige pagina's kunnen blijven weergegeven alsof u nog aangemeld bent, totdat u
'welcomecreation-msg' => 'Uw gebruiker is aangemaakt.
Vergeet niet uw [[Special:Preferences|voorkeuren voor {{SITENAME}}]] aan te passen.',
'yourname' => 'Gebruikersnaam:',
+'userlogin-yourname' => 'Gebruikersnaam',
+'userlogin-yourname-ph' => 'Geef uw gebruikersnaam op',
+'createacct-another-username-ph' => 'Geef de gebruikersnaam op',
'yourpassword' => 'Wachtwoord:',
+'userlogin-yourpassword' => 'Wachtwoord',
+'userlogin-yourpassword-ph' => 'Geef uw wachtwoord op',
+'createacct-yourpassword-ph' => 'Geef een wachtwoord op',
'yourpasswordagain' => 'Geef uw wachtwoord opnieuw in:',
+'createacct-yourpasswordagain' => 'Bevestig wachtwoord',
+'createacct-yourpasswordagain-ph' => 'Geef het wachtwoord opnieuw op',
'remembermypassword' => 'Aanmeldgegevens onthouden (maximaal $1 {{PLURAL:$1|dag|dagen}})',
-'securelogin-stick-https' => 'Verbonden blijven via HTTPS na aanmelden',
+'userlogin-remembermypassword' => 'Aangemeld blijven',
+'userlogin-signwithsecure' => 'Beveiligde verbinding gebruiken',
'yourdomainname' => 'Uw domein:',
'password-change-forbidden' => 'U kunt uw wachtwoord niet wijzigen in deze wiki.',
'externaldberror' => 'Er is een fout opgetreden bij het aanmelden bij de database of u hebt geen toestemming uw externe gebruiker bij te werken.',
@@ -794,18 +822,44 @@ Vergeet niet uw [[Special:Preferences|voorkeuren voor {{SITENAME}}]] aan te pass
'logout' => 'Afmelden',
'userlogout' => 'Afmelden',
'notloggedin' => 'Niet aangemeld',
+'userlogin-noaccount' => 'Hebt u geen geregistreerde gebruiker?',
+'userlogin-joinproject' => 'Word lid van {{SITENAME}}',
'nologin' => 'Nog geen gebruikersnaam? $1.',
'nologinlink' => 'Registreren',
'createaccount' => 'Registreren',
'gotaccount' => 'Hebt u al een gebruikersnaam? $1.',
'gotaccountlink' => 'Aanmelden',
'userlogin-resetlink' => 'Bent u uw aanmeldgegevens vergeten?',
+'userlogin-resetpassword-link' => 'Uw wachtwoord opnieuw instellen',
+'helplogin-url' => 'Help:Aanmelden',
+'userlogin-helplink' => '[[{{MediaWiki:helplogin-url}}|Hulp bij aanmelden]]',
+'userlogin-loggedin' => 'U bent al aangemeld als {{GENDER:$1|$1}}.
+Gebruik het onderstaande formulier om aan te melden als een andere gebruiker.',
+'userlogin-createanother' => 'Nog een gebruiker aanmaken',
+'createacct-join' => 'Geef uw gegevens hieronder op.',
+'createacct-another-join' => 'Geef hieronder de informatie voor de nieuwe gebruiker op.',
+'createacct-emailrequired' => 'E-mailadres',
+'createacct-emailoptional' => 'E-mailadres (optioneel)',
+'createacct-email-ph' => 'Geef uw e-mailadres op',
+'createacct-another-email-ph' => 'Geef een e-mailadres op',
'createaccountmail' => 'Gebruik een tijdelijk willekeurig wachtwoord en stuur het naar het opgegeven e-mailadres',
+'createacct-realname' => 'Echte naam (optioneel)',
'createaccountreason' => 'Reden:',
+'createacct-reason' => 'Reden',
+'createacct-reason-ph' => 'Waarom u een andere gebruiker aanmaakt',
+'createacct-captcha' => 'Veiligheidscontrole',
+'createacct-imgcaptcha-ph' => 'Geef de tekst in die u hierboven ziet',
+'createacct-submit' => 'Gebruiker aanmaken',
+'createacct-another-submit' => 'Nog een gebruiker aanmaken',
+'createacct-benefit-heading' => '{{SITENAME}} wordt gemaakt door mensen zoals u.',
+'createacct-benefit-body1' => 'bewerking{{PLURAL:$1||en}}',
+'createacct-benefit-body2' => "pagina{{PLURAL:$1||'s}}",
+'createacct-benefit-body3' => 'recente bijdrager{{PLURAL:$1||s}}',
'badretype' => 'De ingevoerde wachtwoorden verschillen van elkaar.',
'userexists' => 'De gekozen gebruikersnaam is al in gebruik.
Kies een andere naam.',
'loginerror' => 'Aanmeldfout',
+'createacct-error' => 'Fout tijdens aanmaken gebruiker',
'createaccounterror' => 'Het was niet mogelijk de gebruiker aan te maken: $1',
'nocookiesnew' => 'De gebruiker is geregistreerd, maar niet aangemeld.
{{SITENAME}} gebruikt cookies voor het aanmelden van gebruikers.
@@ -877,11 +931,13 @@ Meld u aan en wijzig uw wachtwoord.
Negeer dit bericht als deze gebruiker zonder uw medeweten is aangemaakt.',
'usernamehasherror' => 'Een gebruikersnaam mag het teken hekje ("#") niet bevatten.',
-'login-throttled' => 'U hebt recentelijk te vaak geprobeerd aan te melden met een onjuist wachtwoord.
-Wacht even voordat u het opnieuw probeert.',
+'login-throttled' => 'U heeft recentelijk te veel mislukte aanmeldpogingen gedaan.
+Wacht alstublieft $1 voordat u het opnieuw probeert.',
'login-abort-generic' => 'U bent niet aangemeld. De procedure is afgebroken.',
'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.',
+'createacct-another-realname-tip' => 'Echte naam is optioneel.
+Als u deze opgeeft, wordt deze naam gebruikt worden om u erkenning te geven voor uw werk.',
# Email sending
'php-mail-error-unknown' => 'Er is een onbekende fout opgetreden in de mail()-functie van PHP',
@@ -898,8 +954,7 @@ Voer een nieuw wachtwoord in om het aanmelden te voltooien:',
'newpassword' => 'Nieuw wachtwoord:',
'retypenew' => 'Herhaling nieuwe wachtwoord:',
'resetpass_submit' => 'Wachtwoord instellen en aanmelden',
-'resetpass_success' => 'Uw wachtwoord is gewijzigd.
-U wordt nu aangemeld...',
+'changepassword-success' => 'Uw wachtwoord is gewijzigd.',
'resetpass_forbidden' => 'Wachtwoorden kunnen niet gewijzigd worden',
'resetpass-no-info' => 'U dient aangemeld zijn voordat u deze pagina kunt gebruiken.',
'resetpass-submit-loggedin' => 'Wachtwoord wijzigen',
@@ -911,10 +966,11 @@ Mogelijk hebt u uw wachtwoord al gewijzigd of een nieuw tijdelijk wachtwoord aan
# Special:PasswordReset
'passwordreset' => 'Wachtwoord opnieuw instellen',
-'passwordreset-text' => 'Vul dit formulier in om uw wachtwoord opnieuw in te stellen.',
+'passwordreset-text-one' => 'Vul dit formulier in om uw wachtwoord opnieuw in te stellen.',
+'passwordreset-text-many' => '{{PLURAL:$1|Vul een van de gegevensvelden in om uw wachtwoord opnieuw in te stellen.}}',
'passwordreset-legend' => 'Wachtwoord opnieuw instellen',
'passwordreset-disabled' => 'Het is in deze wiki niet mogelijk uw wachtwoord opnieuw in te stellen.',
-'passwordreset-pretext' => '{{PLURAL:$1||Voer één van de onderstaande velden in}}',
+'passwordreset-emaildisabled' => 'E-mailmogelijkheden zijn uitgeschakeld op deze wiki.',
'passwordreset-username' => 'Gebruiker:',
'passwordreset-domain' => 'Domein:',
'passwordreset-capture' => 'De resulterende e-mail bekijken?',
@@ -936,7 +992,7 @@ Meld u aan en wijzig het wachtwoord nu. Als u dit verzoek niet zelf heeft gedaan
Tijdelijk wachtwoord: $2',
'passwordreset-emailsent' => 'Er is een e-mail voor het opnieuw instellen van een wachtwoord verzonden.',
'passwordreset-emailsent-capture' => 'Er is een e-mail voor het opnieuw instellen van een wachtwoord verzonden. Deze wordt hieronder weergegeven.',
-'passwordreset-emailerror-capture' => 'Er is een e-mail voor het opnieuw instellen van een wachtwoord aangemaakt. Deze wordt hieronder weergegeven. Het verzenden naar de gebruiker is mislukt om de volgende reden: $1',
+'passwordreset-emailerror-capture' => 'Er is een e-mail voor het opnieuw instellen van een wachtwoord aangemaakt. Deze wordt hieronder weergegeven. Het verzenden naar de {{GENDER:$2|gebruiker}} is mislukt om de volgende reden: $1',
# Special:ChangeEmail
'changeemail' => 'E-mailadres wijzigen',
@@ -950,6 +1006,19 @@ Tijdelijk wachtwoord: $2',
'changeemail-submit' => 'E-mailadres wijzigen',
'changeemail-cancel' => 'Annuleren',
+# Special:ResetTokens
+'resettokens' => 'Tokens opnieuw instellen',
+'resettokens-text' => 'U kunt hier tokens opnieuw instellen die toegang tot bepaalde persoonlijke gegevens die zijn gekoppeld aan uw gebruiker.
+
+Doe dit als u ze per ongeluk met iemand hebt gedeeld of als uw onbevoegden toegang hebben gekregen tot uw gebruiker.',
+'resettokens-no-tokens' => 'Er zijn geen tokens om opnieuw in te stellen.',
+'resettokens-legend' => 'Tokens opnieuw instellen',
+'resettokens-tokens' => 'Tokens:',
+'resettokens-token-label' => '$1 (huidige waarde: $2)',
+'resettokens-watchlist-token' => 'Token voor webfeed van [[Special:Watchlist|uw volglijst]] (Atom/RSS)',
+'resettokens-done' => 'De tokens zijn opnieuw ingesteld.',
+'resettokens-resetbutton' => 'Geselecteerde tokens opnieuw instellen',
+
# Edit page toolbar
'bold_sample' => 'Vetgedrukte tekst',
'bold_tip' => 'Vet',
@@ -1157,12 +1226,15 @@ Er is geen toelichting beschikbaar.',
Deze lijkt verwijderd te zijn.',
'edit-conflict' => 'Bewerkingsconflict.',
'edit-no-change' => 'Uw bewerking is genegeerd, omdat er geen wijziging aan de tekst is gemaakt.',
+'postedit-confirmation' => 'Uw bewerking is opgeslagen',
'edit-already-exists' => 'De pagina is niet aangemaakt.
Deze bestaat al.',
'defaultmessagetext' => 'Standaardinhoud',
'content-failed-to-parse' => 'Het was niet mogelijk de inhoud van het MIME-type $2 voor het model $1 te verwerken: $3.',
'invalid-content-data' => 'Ongeldige inhoudsgegevens',
'content-not-allowed-here' => 'De inhoud "$1" is niet toegestaan op pagina [[$2]].',
+'editwarning-warning' => 'Als u deze pagina verlaat verliest u mogelijk wijzigingen die u hebt gemaakt.
+Als u bent aangemeld, kunt u deze waarschuwing uitschakelen in het tabblad "{{int:prefs-editing}}" in uw voorkeuren.',
# Content models
'content-model-wikitext' => 'wikitekst',
@@ -1199,6 +1271,7 @@ Controleer voor het opslaan of het resultaat gewenst is.',
'undo-failure' => 'De wijziging kan niet ongedaan gemaakt worden vanwege andere strijdige wijzigingen.',
'undo-norev' => 'De bewerking kon niet ongedaan gemaakt worden, omdat die niet bestaat of is verwijderd.',
'undo-summary' => 'Versie $1 van [[Special:Contributions/$2|$2]] ([[User talk:$2|overleg]]) ongedaan gemaakt',
+'undo-summary-username-hidden' => 'Versie $1 door een verborgen gebruiker ongedaan gemaakt',
# Account creation failure
'cantcreateaccounttitle' => 'Registreren is mislukt.',
@@ -1379,6 +1452,7 @@ Let op dat het gebruiken van de navigatiekoppelingen deze kolom opnieuw instelt.
'compareselectedversions' => 'Geselecteerde versies vergelijken',
'showhideselectedversions' => 'Geselecteerde versies weergeven/verbergen',
'editundo' => 'ongedaan maken',
+'diff-empty' => '(geen verschil)',
'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 {{PLURAL:$1|versie|versies}} door meer dan $2 {{PLURAL:$2|gebruiker|gebruikers}} worden niet weergegeven)',
'difference-missing-revision' => '{{PLURAL:$2|Eén versie|$2 versies}} van deze verschillen ($1) {{PLURAL:$2|is|zijn}} niet aangetroffen.
@@ -1407,7 +1481,6 @@ Probeer een andere zoekopdracht.',
'searchmenu-legend' => 'Zoekopties',
'searchmenu-exists' => "* Pagina '''[[$1]]'''",
'searchmenu-new' => "'''De pagina \"[[:\$1]]\" aanmaken op deze wiki.'''",
-'searchhelp-url' => 'Help:Inhoud',
'searchmenu-prefix' => '[[Special:PrefixIndex/$1|Paginanamen met dit voorvoegsel weergeven]]',
'searchprofile-articles' => "Inhoudelijke pagina's",
'searchprofile-project' => "Hulp- en projectpagina's",
@@ -1452,15 +1525,7 @@ U kunt ook een naamruimte als voorvoegsel gebruiken.",
'searchdisabled' => 'Zoeken in {{SITENAME}} is niet mogelijk.
U kunt gebruik maken van Google.
De gegevens over {{SITENAME}} zijn mogelijk niet bijgewerkt.',
-
-# Quickbar
-'qbsettings' => 'Menubalk',
-'qbsettings-none' => 'Uitgeschakeld',
-'qbsettings-fixedleft' => 'Links vast',
-'qbsettings-fixedright' => 'Rechts vast',
-'qbsettings-floatingleft' => 'Links zwevend',
-'qbsettings-floatingright' => 'Rechts zwevend',
-'qbsettings-directionality' => 'Vast, afhankelijk van de schrijfrichting van uw taal',
+'search-error' => 'Er is een fout opgetreden tijdens het zoeken: $1',
# Preferences page
'preferences' => 'Voorkeuren',
@@ -1494,7 +1559,6 @@ De gegevens over {{SITENAME}} zijn mogelijk niet bijgewerkt.',
'resetprefs' => 'Niet opgeslagen wijzigingen herstellen',
'restoreprefs' => 'Voorkeuren herstellen (voor alle instellingen)',
'prefs-editing' => 'Bewerken',
-'prefs-edit-boxsize' => 'Afmetingen van het bewerkingsvenster.',
'rows' => 'Regels:',
'columns' => 'Kolommen:',
'searchresultshead' => 'Zoekresultaten',
@@ -1505,9 +1569,9 @@ De gegevens over {{SITENAME}} zijn mogelijk niet bijgewerkt.',
'recentchangesdays-max' => '(maximaal $1 {{PLURAL:$1|dag|dagen}})',
'recentchangescount' => 'Standaard aantal weer te geven bewerkingen:',
'prefs-help-recentchangescount' => "Dit geldt voor recente wijzigingen, paginageschiedenis en logboekpagina's.",
-'prefs-help-watchlist-token' => 'Door hier een geheime sleutel in te vullen wordt een RSS-feed voor uw volglijst aangemaakt.
-Iedereen die deze sleutel kent, kan uw volglijst lezen. Kies dus een veilige sleutel.
-Hier volgt een willekeurig gegenereerde waarde die u kunt gebruiken: $1',
+'prefs-help-watchlist-token2' => 'Dit is de geheime sleutel voor de webfeed van uw volglijst.
+Iedereen die het token kent, kan uw volglijst bekijken, dus deel dit token niet.
+U kunt de [[Special:ResetTokens|tokens opnieuw instellen]] als u dat wilt.',
'savedprefs' => 'Uw voorkeuren zijn opgeslagen.',
'timezonelegend' => 'Tijdzone:',
'localtime' => 'Plaatselijke tijd:',
@@ -1538,7 +1602,6 @@ Hier volgt een willekeurig gegenereerde waarde die u kunt gebruiken: $1',
'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:',
-'prefs-textboxsize' => 'Afmetingen bewerkingsscherm',
'youremail' => 'Uw e-mailadres:',
'username' => '{{GENDER:$1|Gebruikersnaam}}:',
'uid' => '{{GENDER:$1|Gebruikersnummer}}:',
@@ -1574,7 +1637,9 @@ Als u deze opgeeft, kan deze naam gebruikt worden om u erkenning te geven voor u
'prefs-signature' => 'Ondertekening',
'prefs-dateformat' => 'Datumopmaak:',
'prefs-timeoffset' => 'Tijdverschil',
-'prefs-advancedediting' => 'Algemene opties',
+'prefs-advancedediting' => 'Algemene instellingen',
+'prefs-editor' => 'Tekstverwerker',
+'prefs-preview' => 'Voorvertoning',
'prefs-advancedrc' => 'Gevorderde instellingen',
'prefs-advancedrendering' => 'Gevorderde instellingen',
'prefs-advancedsearchoptions' => 'Gevorderde instellingen',
@@ -1582,7 +1647,9 @@ Als u deze opgeeft, kan deze naam gebruikt worden om u erkenning te geven voor u
'prefs-displayrc' => 'Weergaveopties',
'prefs-displaysearchoptions' => 'Weergaveopties',
'prefs-displaywatchlist' => 'Weergaveopties',
+'prefs-tokenwatchlist' => 'Token',
'prefs-diffs' => 'Verschillen',
+'prefs-help-prefershttps' => 'Deze voorkeur wordt toegepast bij de volgende keer aanmelden.',
# User preference: email validation using jQuery
'email-address-validity-valid' => 'Het e-mailadres lijkt geldig',
@@ -1609,6 +1676,8 @@ Als u deze opgeeft, kan deze naam gebruikt worden om u erkenning te geven voor u
'userrights-notallowed' => 'U bent niet gemachtigd om gebruikersrechten toe te voegen of te verwijderen.',
'userrights-changeable-col' => 'Groepen die u kunt beheren',
'userrights-unchangeable-col' => 'Groepen die u niet kunt beheren',
+'userrights-conflict' => 'Er is een probleem opgetreden tijdens het instellen van de gebruikersrechten! Controleer en bevestig uw wijzigingen.',
+'userrights-removed-self' => 'U hebt uw eigen bevoegdheden ingetrokken. U kunt deze pagina niet langer raadplegen.',
# Groups
'group' => 'Groep:',
@@ -1674,11 +1743,19 @@ Als u deze opgeeft, kan deze naam gebruikt worden om u erkenning te geven voor u
'right-proxyunbannable' => "Blokkades voor proxy's gelden niet",
'right-unblockself' => 'Eigen gebruiker deblokkeren',
'right-protect' => 'Beveiligingsniveaus wijzigen',
-'right-editprotected' => "Beveiligde pagina's bewerken",
+'right-editprotected' => 'Pagina\'s bewerken die beveiligd zijn als "{{int:protect-level-sysop}}"',
+'right-editsemiprotected' => 'Pagina\'s bewerken die beveiligd zijn als "{{int:protect-level-autoconfirmed}}"',
'right-editinterface' => 'De gebruikersinterface bewerken',
'right-editusercssjs' => 'De CSS- en JS-bestanden van andere gebruikers bewerken',
'right-editusercss' => 'De CSS-bestanden van andere gebruikers bewerken',
'right-edituserjs' => 'De JavaScriptbestanden van andere gebruikers bewerken',
+'right-editmyusercss' => "Uw eigen CSS-pagina's bewerken",
+'right-editmyuserjs' => "Uw eigen JavaScriptpagina's bewerken",
+'right-viewmywatchlist' => 'Uw eigen volglijst bekijken',
+'right-editmywatchlist' => "Uw eigen volglijst bewerken. Via sommige handelingen kunnen nog steeds pagina's toegevoegd worden, zelfs zonder deze bevoegdheid",
+'right-viewmyprivateinfo' => 'Uw eigen privégegevens bekijken (bijvoorbeeld e-mailadres, echte naam)',
+'right-editmyprivateinfo' => 'Uw eigen privégegevens bewerken (bijvoorbeeld e-mailadres, echte naam)',
+'right-editmyoptions' => 'Uw eigen voorkeuren bewerken',
'right-rollback' => 'Snel de laatste bewerking(en) van een gebruiker van een pagina terugdraaien',
'right-markbotedits' => 'Teruggedraaide bewerkingen markeren als botbewerkingen',
'right-noratelimit' => 'Tijdsafhankelijke beperkingen negeren',
@@ -1740,12 +1817,19 @@ Als u deze opgeeft, kan deze naam gebruikt worden om u erkenning te geven voor u
'action-userrights-interwiki' => "gebruikersrechten van gebruikers van andere wiki's te bewerken",
'action-siteadmin' => 'de database af te sluiten of open te stellen',
'action-sendemail' => 'e-mails te verzenden',
+'action-editmywatchlist' => 'uw eigen volglijst te bewerken',
+'action-viewmywatchlist' => 'uw eigen volglijst te bekijken',
+'action-viewmyprivateinfo' => 'uw eigen privégegevens te bekijken',
+'action-editmyprivateinfo' => 'uw eigen privégegevens te bewerken',
# Recent changes
'nchanges' => '$1 {{PLURAL:$1|bewerking|bewerkingen}}',
+'enhancedrc-since-last-visit' => '$1 {{PLURAL:$1|sinds uw laatste bezoek}}',
+'enhancedrc-history' => 'geschiedenis',
'recentchanges' => 'Recente wijzigingen',
'recentchanges-legend' => 'Opties voor recente wijzigingen',
'recentchanges-summary' => 'Op deze pagina kunt u de recentste wijzigingen in deze wiki bekijken.',
+'recentchanges-noresult' => 'Er zijn in deze periode geen wijzigingen gemaakt die aan de criteria voldoen.',
'recentchanges-feed-description' => 'Met deze feed kunt u de recentste wijzigingen in deze wiki bekijken.',
'recentchanges-label-newpage' => 'Met deze bewerking is een nieuwe pagina aangemaakt',
'recentchanges-label-minor' => 'Dit is een kleine bewerking',
@@ -1782,7 +1866,6 @@ Als u deze opgeeft, kan deze naam gebruikt worden om u erkenning te geven voor u
'recentchangeslinked-feed' => 'Verwante wijzigingen',
'recentchangeslinked-toolbox' => 'Verwante wijzigingen',
'recentchangeslinked-title' => 'Wijzigingen verwant aan "$1"',
-'recentchangeslinked-noresult' => "Er zijn in de opgegeven periode geen bewerkingen geweest op de pagina's waarheen vanaf hier verwezen wordt.",
'recentchangeslinked-summary' => "Deze speciale pagina geeft de laatste bewerkingen weer op pagina's waarheen verwezen wordt vanaf een opgegeven pagina of op pagina's in een opgegeven categorie.
Pagina's die op [[Special:Watchlist|uw volglijst]] staan worden '''vet''' weergegeven.",
'recentchangeslinked-page' => 'Paginanaam:',
@@ -1794,7 +1877,7 @@ Pagina's die op [[Special:Watchlist|uw volglijst]] staan worden '''vet''' weerge
'reuploaddesc' => 'Upload annuleren en terugkeren naar het uploadformulier',
'upload-tryagain' => 'Bestandsbeschrijving bijwerken',
'uploadnologin' => 'Niet aangemeld',
-'uploadnologintext' => 'U moet [[Special:UserLogin|aangemeld]] zijn om bestanden te kunnen uploaden.',
+'uploadnologintext' => 'U moet $1 om bestanden te kunnen 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',
@@ -2035,7 +2118,6 @@ Om beveiligingsreden is img_auth.php uitgeschakeld.',
'http-read-error' => 'Fout bij het lezen van HTTP.',
'http-timed-out' => 'Timeout bij het HTTP-verzoek.',
'http-curl-error' => 'Fout bij het ophalen van URL: $1',
-'http-host-unreachable' => 'De URL is niet bereikbaar.',
'http-bad-status' => 'Er is een probleem opgetreden bij het HTTP-verzoek: $1 $2',
# Some likely curl errors. More could be added from <http://curl.haxx.se/libcurl/c/libcurl-errors.html>
@@ -2066,6 +2148,10 @@ U kunt het misschien proberen als het minder druk is.',
'listfiles_size' => 'Grootte',
'listfiles_description' => 'Beschrijving',
'listfiles_count' => 'Versies',
+'listfiles-show-all' => 'Oude versies van afbeeldingen opnemen',
+'listfiles-latestversion' => 'Huidige versie',
+'listfiles-latestversion-yes' => 'Ja',
+'listfiles-latestversion-no' => 'Nee',
# File description page
'file-anchor-link' => 'Bestand',
@@ -2164,6 +2250,13 @@ Vergeet niet de "Koppelingen naar deze pagina" te controleren alvorens dit sjabl
'randompage' => 'Willekeurige pagina',
'randompage-nopages' => "Er zijn geen pagina's in de volgende {{PLURAL:$2|naamruimte|naamruimten}}: $1.",
+# Random page in category
+'randomincategory' => 'Willekeurige pagina in de categorie',
+'randomincategory-invalidcategory' => '"$1" is geen geldige categorienaam.',
+'randomincategory-nopages' => "Er zijn geen pagina's in de categorie [[:Category:$1|$1]].",
+'randomincategory-selectcategory' => 'Geef een willekeurige pagina uit de categorie $1 weer. $2',
+'randomincategory-selectcategory-submit' => 'OK',
+
# Random redirect
'randomredirect' => 'Willekeurige doorverwijzing',
'randomredirect-nopages' => 'Er zijn geen doorverwijzingen in de naamruimte "$1".',
@@ -2189,17 +2282,13 @@ Vergeet niet de "Koppelingen naar deze pagina" te controleren alvorens dit sjabl
'statistics-users-active-desc' => 'Gebruikers die in de afgelopen {{PLURAL:$1|dag|$1 dagen}} een handeling hebben uitgevoerd',
'statistics-mostpopular' => "Meest bekeken pagina's",
-'disambiguations' => "Pagina's die verwijzen naar doorverwijspagina's",
-'disambiguationspage' => 'Template:Doorverwijspagina',
-'disambiguations-text' => "Hieronder staan pagina's met tenminste één koppeling naar een '''doorverwijspagina'''.
-Deze horen waarschijnlijk direct naar een meer toepasselijke pagina te verwijzen.<br />
-Een pagina wordt gezien als doorverwijspagina als er een sjabloon op staat dat opgenomen is op [[MediaWiki:Disambiguationspage]].",
-
'pageswithprop' => "Pagina's met een pagina-eigenschap",
'pageswithprop-legend' => "Pagina's met een pagina-eigenschap",
'pageswithprop-text' => "Op deze pagina worden pagina's weergegeven met een bepaalde pagina-eigenschap.",
'pageswithprop-prop' => 'Naam van de eigenschap:',
'pageswithprop-submit' => 'OK',
+'pageswithprop-prophidden-long' => 'lange teksteigenschapswaarde verborgen ($1)',
+'pageswithprop-prophidden-binary' => 'binaire eigenschapswaarde verborgen ($1)',
'doubleredirects' => 'Dubbele doorverwijzingen',
'doubleredirectstext' => "Deze lijst bevat pagina's die doorverwijzen naar andere doorverwijspagina's.
@@ -2259,6 +2348,7 @@ De pagina's zijn ook niet als sjabloon opgenomen.",
'mostrevisions' => "Pagina's met de meeste bewerkingen",
'prefixindex' => "Alle pagina's op voorvoegsel",
'prefixindex-namespace' => "Alle pagina's met het voorvoegsel (naamruimte $1)",
+'prefixindex-strip' => 'Voorvoegsel in lijst verwijderen',
'shortpages' => "Korte pagina's",
'longpages' => "Lange pagina's",
'deadendpages' => "Pagina's zonder koppelingen",
@@ -2274,6 +2364,7 @@ De pagina's zijn ook niet als sjabloon opgenomen.",
'listusers' => 'Gebruikerslijst',
'listusers-editsonly' => 'Alleen gebruikers met bewerkingen weergeven',
'listusers-creationsort' => 'Sorteren op registratiedatum',
+'listusers-desc' => 'Sorteren in aflopende volgorde',
'usereditcount' => '$1 {{PLURAL:$1|bewerking|bewerkingen}}',
'usercreated' => '{{GENDER:$3|Geregistreerd}} op $1 om $2',
'newpages' => "Nieuwe pagina's",
@@ -2454,10 +2545,9 @@ Toekomstige bewerkingen van deze pagina en de bijbehorende overlegpagina worden
'unwatchthispage' => 'Niet meer volgen',
'notanarticle' => 'Is geen pagina',
'notvisiblerev' => 'De laatste versie van een andere gebruiker is verwijderd',
-'watchnochange' => "Geen van de pagina's op uw volglijst is in deze periode bewerkt.",
'watchlist-details' => "Er {{PLURAL:$1|staat één pagina|staan $1 pagina's}} op uw volglijst, exclusief overlegpagina's.",
-'wlheader-enotif' => '* U wordt per e-mail gewaarschuwd.',
-'wlheader-showupdated' => "* Pagina's die zijn bewerkt sinds uw laatste bezoek worden '''vet''' weergegeven.",
+'wlheader-enotif' => 'U wordt per e-mail gewaarschuwd.',
+'wlheader-showupdated' => "Pagina's die zijn bewerkt sinds uw laatste bezoek worden '''vet''' weergegeven.",
'watchmethod-recent' => "controleer recente wijzigingen op pagina's op volglijst",
'watchmethod-list' => "controleer pagina's op volglijst op wijzigingen",
'watchlistcontains' => "Er {{PLURAL:$1|staat één pagina|staan $1 pagina's}} op uw volglijst.",
@@ -2711,7 +2801,7 @@ $1',
'contributions' => '{{GENDER:$1|Gebruikersbijdragen}}',
'contributions-title' => 'Bijdragen van $1',
'mycontris' => 'Bijdragen',
-'contribsub2' => 'Voor $1 ($2)',
+'contribsub2' => 'Voor {{GENDER:$3|$1}} ($2)',
'nocontribs' => 'Geen wijzigingen gevonden die aan de gestelde criteria voldoen.',
'uctop' => '(laatste wijziging)',
'month' => 'Van maand (en eerder):',
@@ -2871,15 +2961,13 @@ Misschien is de blokkade al opgeheven.',
De blokkade is onderdeel van de reeks $2, waarvan de blokkade wel opgeheven kan worden.',
'ip_range_invalid' => 'Ongeldige IP-reeks.',
'ip_range_toolarge' => 'Reeksblokkades groter dan /$1 zijn niet toegestaan.',
-'blockme' => 'Mij blokkeren',
'proxyblocker' => 'Proxyblocker',
-'proxyblocker-disabled' => 'Deze functie is uitgeschakeld.',
'proxyblockreason' => 'Uw IP-adres is geblokkeerd, omdat u gebruik maakt van een open proxyserver.
Neem contact op met uw internetprovider of uw helpdesk en stel die op de hoogte van dit ernstige beveiligingsprobleem.',
-'proxyblocksuccess' => 'Afgerond.',
'sorbsreason' => 'Uw IP-adres staat bekend als open proxyserver in de DNS-blacklist die {{SITENAME}} gebruikt.',
'sorbs_create_account_reason' => 'Uw IP-adres staat bekend als open proxyserver in de DNS-blacklist die {{SITENAME}} gebruikt.
U kunt geen gebruiker registreren.',
+'xffblockreason' => 'Een IP-adres dat u gebruikt is geblokkeerd. Dit staat de X-Forwarded-For van de header. De oorspronkelijke blokkadereden is: $1',
'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.',
@@ -3046,6 +3134,8 @@ Ga naar [//www.mediawiki.org/wiki/Localisation MediaWiki-lokalisatie] en [//tran
'thumbnail-more' => 'Vergroten',
'filemissing' => 'Bestand is zoek',
'thumbnail_error' => 'Fout bij het aanmaken van de miniatuurafbeelding: $1',
+'thumbnail_error_remote' => 'Foutmelding van $1:
+$2',
'djvu_page_error' => 'DjVu-pagina buiten bereik',
'djvu_no_xml' => 'De XML voor het DjVu-bestand kon niet opgehaald worden',
'thumbnail-temp-create' => 'Het was niet mogelijk een tijdelijk miniatuurbestand aan te maken.',
@@ -3195,20 +3285,15 @@ U kunt wel de broncode bekijken.',
'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',
+'tooltip-iwiki' => '$1 – $2',
# Stylesheets
'common.css' => '/** CSS die hier wordt geplaatst heeft invloed op alle skins */',
-'standard.css' => '/* CSS die hier wordt geplaatst heeft alleen invloed op de skin Standard */',
-'nostalgia.css' => '/* CSS die hier wordt geplaatst heeft alleen invloed op de skin Nostalgie */',
'cologneblue.css' => '/* CSS die hier wordt geplaatst heeft alleen invloed op de skin Keuls blauw */',
'monobook.css' => '/* CSS die hier wordt geplaatst heeft alleen invloed op de skin Monobook */',
-'myskin.css' => '/* CSS die hier wordt geplaatst heeft alleen invloed op de skin MijnSkin */',
-'chick.css' => '/* CSS die hier wordt geplaatst heeft alleen invloed op de skin Chick */',
-'simple.css' => '/* CSS die hier wordt geplaatst heeft alleen invloed op de skin Eenvoudig */',
'modern.css' => '/* CSS die hier wordt geplaatst heeft alleen invloed op de skin Modern */',
'vector.css' => '/* CSS die hier wordt geplaatst heeft alleen invloed op de skin Vector */',
'print.css' => '/* CSS die hier wordt geplaatst heeft alleen invloed op de printuitvoer */',
-'handheld.css' => '/* CSS die hier wordt geplaatst heeft alleen invloed op handheldapparaten gebaseerd op de skin die is ingesteld in $wgHandheldStyle */',
'noscript.css' => '/ * CSS die hier wordt geplaatst heeft invloed voor gebruikers die JavaScript hebben uitgeschakeld * /',
'group-autoconfirmed.css' => '/* CSS die hier wordt geplaatst heeft alleen invloed op automatisch bevestigde gebruikers */',
'group-bot.css' => '/* CSS die hier wordt geplaatst heeft alleen invloed op robots */',
@@ -3217,13 +3302,8 @@ U kunt wel de broncode bekijken.',
# Scripts
'common.js' => "/* JavaScript die hier wordt geplaatst heeft invloed op alle pagina's voor alle gebruikers */",
-'standard.js' => '/* JavaScript die hier wordt geplaatst heeft alleen invloed op gebruikers die de skin Standaard gebruiken */',
-'nostalgia.js' => '/* JavaScript die hier wordt geplaatst heeft alleen invloed op gebruikers die de skin Nostalgie gebruiken */',
'cologneblue.js' => '/* JavaScript die hier wordt geplaatst heeft alleen invloed op gebruikers die de skin Keuls blauw gebruiken */',
'monobook.js' => '/* JavaScript die hier wordt geplaatst heeft alleen invloed op gebruikers die de skin Monobook gebruiken */',
-'myskin.js' => '/* JavaScript die hier wordt geplaatst heeft alleen invloed op gebruikers die de skin MijnSkin gebruiken */',
-'chick.js' => '/* JavaScript die hier wordt geplaatst heeft alleen invloed op gebruikers die de skin Chick gebruiken */',
-'simple.js' => '/* JavaScript die hier wordt geplaatst heeft alleen invloed op gebruikers die de skin Eenvoudig gebruiken */',
'modern.js' => '/* JavaScript die hier wordt geplaatst heeft alleen invloed op gebruikers die de skin Modern gebruiken */',
'vector.js' => '/* JavaScript die hier wordt geplaatst heeft alleen invloed op gebruikers die de skin Vector gebruiken */',
'group-autoconfirmed.js' => '/* JavaScript die hier wordt geplaatst heeft alleen invloed op automatisch bevestigde gebruikers */',
@@ -3303,13 +3383,8 @@ Meestal wordt dit door een externe koppeling op een zwarte lijst veroorzaakt.',
'pageinfo-category-files' => 'Aantal bestanden',
# Skin names
-'skinname-standard' => 'Klassiek',
-'skinname-nostalgia' => 'Nostalgie',
'skinname-cologneblue' => 'Keuls blauw',
'skinname-monobook' => 'Monobook',
-'skinname-myskin' => 'MijnSkin',
-'skinname-chick' => 'Chick',
-'skinname-simple' => 'Eenvoudig',
'skinname-modern' => 'Modern',
'skinname-vector' => 'Vector',
@@ -3389,11 +3464,25 @@ $1',
'minutes' => '{{PLURAL:$1|$1 minuut|$1 minuten}}',
'hours' => '{{PLURAL:$1|$1 uur|$1 uur}}',
'days' => '{{PLURAL:$1|$1 dag|$1 dagen}}',
+'weeks' => '{{PLURAL: $1|één week|$1 weken}}',
'months' => '{{PLURAL:$1|één maand|$1 maanden}}',
'years' => '{{PLURAL:$1|één jaar|$1 jaar}}',
'ago' => '$1 geleden',
'just-now' => 'Daarnet',
+# Human-readable timestamps
+'hours-ago' => '$1 {{PLURAL:$1|uur}} geleden',
+'minutes-ago' => '$1 {{PLURAL:$1|minuut|minuten}} geleden',
+'seconds-ago' => '$1 {{PLURAL:$1|seconde|seconden}} geleden',
+'monday-at' => 'Maandag om $1',
+'tuesday-at' => 'Dinsdag om $1',
+'wednesday-at' => 'Woensdag om $1',
+'thursday-at' => 'Donderdag om $1',
+'friday-at' => 'Vrijdag om $1',
+'saturday-at' => 'Zaterdag om $1',
+'sunday-at' => 'Zondag om $1',
+'yesterday-at' => 'Gisteren om $1',
+
# Bad image list
'bad_image_list' => "De opmaak is als volgt:
@@ -3423,7 +3512,7 @@ Andere velden worden verborgen.
* gpslongitude
* gpsaltitude',
-# EXIF tags
+# Exif tags
'exif-imagewidth' => 'Breedte',
'exif-imagelength' => 'Hoogte',
'exif-bitspersample' => 'Bits per component',
@@ -3601,7 +3690,7 @@ Andere velden worden verborgen.
'exif-originalimageheight' => 'Hoogte van de afbeelding voor bijsnijden',
'exif-originalimagewidth' => 'Breedte van de afbeelding voor bijsnijden',
-# EXIF attributes
+# Exif attributes
'exif-compression-1' => 'Ongecomprimeerd',
'exif-compression-2' => 'CCITT Groep 3 1-dimensionale aangepaste "Huffman run length"-codering',
'exif-compression-3' => 'CCITT Groep 3 faxcodering',
@@ -4011,7 +4100,6 @@ U kunt ook [[Special:EditWatchlist|het standaard bewerkingsscherm gebruiken]].',
'version-other' => 'Overige',
'version-mediahandlers' => 'Mediaverwerkers',
'version-hooks' => 'Hooks',
-'version-extension-functions' => 'Uitbreidingsfuncties',
'version-parser-extensiontags' => 'Parseruitbreidingstags',
'version-parser-function-hooks' => 'Parserfunctiehooks',
'version-hook-name' => 'Hooknaam',
@@ -4020,6 +4108,7 @@ U kunt ook [[Special:EditWatchlist|het standaard bewerkingsscherm gebruiken]].',
'version-license' => 'Licentie',
'version-poweredby-credits' => "Deze wiki wordt aangedreven door '''[//www.mediawiki.org/ MediaWiki]''', copyright © 2001-$1 $2.",
'version-poweredby-others' => 'anderen',
+'version-poweredby-translators' => 'translatewiki.net-vertalers',
'version-credits-summary' => 'We erkennen graag de volgende personen voor hun bijdrage aan [[Special:Version|MediaWiki]].',
'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.
@@ -4035,13 +4124,17 @@ Samen met dit programma hoort u een [{{SERVER}}{{SCRIPTPATH}}/COPYING kopie van
'version-entrypoints-articlepath' => '[https://www.mediawiki.org/wiki/Manual:$wgArticlePath Article path]',
'version-entrypoints-scriptpath' => '[https://www.mediawiki.org/wiki/Manual:$wgScriptPath Script path]',
-# Special:FilePath
-'filepath' => 'Bestandslocatie',
-'filepath-page' => 'Bestand:',
-'filepath-submit' => 'OK',
-'filepath-summary' => 'Deze speciale pagina geeft het volledige pad voor een bestand.
-Afbeeldingen worden in hun volledige resolutie weergegeven.
-Andere bestandstypen worden direct in het met het MIME-type verbonden programma geopend.',
+# Special:Redirect
+'redirect' => 'Doorverwijzen op bestandsnaam, gebruikersnummer of versienummer',
+'redirect-legend' => 'Doorverwijzen naar een bestand of pagina',
+'redirect-summary' => 'Deze speciale pagina verwijst door naar een bestand (als een bestandsnaam wordt opgegeven), een pagina (als een versienummer wordt opgegeven) of een gebruikerspagina (als een gebruikersnummer wordt opgegeven).',
+'redirect-submit' => 'OK',
+'redirect-lookup' => 'Opzoeken:',
+'redirect-value' => 'Waarde:',
+'redirect-user' => 'Gebruikersnummer',
+'redirect-revision' => 'Paginaversie',
+'redirect-file' => 'Bestandsnaam',
+'redirect-not-exists' => 'Waarde niet gevonden',
# Special:FileDuplicateSearch
'fileduplicatesearch' => 'Duplicaatbestanden zoeken',
@@ -4091,12 +4184,16 @@ Andere bestandstypen worden direct in het met het MIME-type verbonden programma
'tags' => 'Geldige wijzigingslabels',
'tag-filter' => '[[Special:Tags|Labelfilter]]:',
'tag-filter-submit' => 'Filteren',
+'tag-list-wrapper' => '([[Special:Tags|Label{{PLURAL:$1||s}}]]: $2)',
'tags-title' => 'Labels',
'tags-intro' => 'Op deze pagina staan de labels waarmee de software iedere bewerking kan markeren, en hun betekenis.',
'tags-tag' => 'Labelnaam',
'tags-display-header' => 'Weergave in wijzigingslijsten',
'tags-description-header' => 'Volledige beschrijving van betekenis',
+'tags-active-header' => 'Actief?',
'tags-hitcount-header' => 'Gelabelde bewerkingen',
+'tags-active-yes' => 'Ja',
+'tags-active-no' => 'Nee',
'tags-edit' => 'bewerken',
'tags-hitcount' => '$1 {{PLURAL:$1|wijziging|wijzigingen}}',
@@ -4117,6 +4214,7 @@ Andere bestandstypen worden direct in het met het MIME-type verbonden programma
'dberr-problems' => 'Onze excuses. Deze site ondervindt op het moment technische problemen.',
'dberr-again' => 'Wacht een aantal minuten en probeer het daarna opnieuw.',
'dberr-info' => '(Kan geen verbinding maken met de databaseserver: $1)',
+'dberr-info-hidden' => '(Kan geen verbinding maken met de databaseserver)',
'dberr-usegoogle' => 'Wellicht kunt u in de tussentijd zoeken via Google.',
'dberr-outofdate' => "Let op: hun indexen van onze pagina's zijn wellicht niet recent.",
'dberr-cachederror' => 'Deze pagina is een kopie uit de cache en is wellicht niet de meest recente versie.',
@@ -4132,6 +4230,9 @@ Andere bestandstypen worden direct in het met het MIME-type verbonden programma
'htmlform-submit' => 'Opslaan',
'htmlform-reset' => 'Wijzigingen ongedaan maken',
'htmlform-selectorother-other' => 'Anders',
+'htmlform-no' => 'Nee',
+'htmlform-yes' => 'Ja',
+'htmlform-chosen-placeholder' => 'Selecteer een optie',
# SQLite database support
'sqlite-has-fts' => 'Versie $1 met ondersteuning voor "full-text" zoeken',
@@ -4249,4 +4350,19 @@ Anders kunt u ook het eenvoudige formulier hieronder gebruiken. Uw reactie wordt
# Image rotation
'rotate-comment' => 'Afbeelding gedraaid, $1 {{PLURAL:$1|graad|graden}} met de klok mee',
+# Limit report
+'limitreport-title' => 'Prestatiegegevens van de parser:',
+'limitreport-cputime' => 'Tijdsgebruik van CPU',
+'limitreport-cputime-value' => '$1 {{PLURAL:$1|seconde|seconden}}',
+'limitreport-walltime' => 'Reëel tijdgebruik',
+'limitreport-walltime-value' => '$1 {{PLURAL:$1|seconde|seconden}}',
+'limitreport-ppvisitednodes' => 'Aantal nodes bekeken tijdens de voorverwerking:',
+'limitreport-ppgeneratednodes' => 'Aantal nodes aangemaakt tijdens de voorverwerking:',
+'limitreport-postexpandincludesize' => 'Inclusiegrootte na uitbreiden',
+'limitreport-postexpandincludesize-value' => '$1/$2 {{PLURAL:$2|byte|bytes}}',
+'limitreport-templateargumentsize' => 'Grootte sjabloonparameters',
+'limitreport-templateargumentsize-value' => '$1 / $2 {{PLURAL:$2|byte|bytes}}',
+'limitreport-expansiondepth' => 'Hoogste uitbreidingsdiepte',
+'limitreport-expensivefunctioncount' => 'Aantal kostbare parserfuncties',
+
);
diff --git a/languages/messages/MessagesNl_informal.php b/languages/messages/MessagesNl_informal.php
index cd813fea..f52c86b8 100644
--- a/languages/messages/MessagesNl_informal.php
+++ b/languages/messages/MessagesNl_informal.php
@@ -15,22 +15,20 @@
$fallback = 'nl';
$messages = array(
-'view-pool-error' => 'De servers zijn op het moment helaas overbelast.
+'view-pool-error' => 'Sorry, de servers zijn op het moment overbelast.
Te veel gebruikers proberen deze pagina te bekijken.
-Wacht even voordat je opnieuw toegang probeert te krijgen tot deze pagina.
+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).',
-'youhavenewmessagesfromusers' => 'Je hebt $1 van {{PLURAL:$3|een andere gebruiker|$3 gebruikers}} ($2).',
-'youhavenewmessagesmanyusers' => 'Je hebt $1 van een groot aantal gebruikers ($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 koppeling gevolgd.
+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>
@@ -39,48 +37,41 @@ Een lijst met bestaande speciale pagina’s staat op [[Special:SpecialPages|spec
# 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 koppeling naar het verschil tussen twee versies van een pagina volgt of een versie opvraagt die is verwijderd.
+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|beheerder]] van {{SITENAME}} en vermeld daarbij de URL van deze pagina.',
+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:',
-'viewyourtext' => "Je kunt '''uw bewerkingen''' aan de brontekst van deze pagina bekijken en kopiëren:",
-'editinginterface' => "'''Waarschuwing:''' je bewerkt een pagina die interfacetekst voor de software bevat.
-Bewerkingen op deze pagina beïnvloeden de gebruikersinterface van iedereen op deze wiki.
-Gebruik [//translatewiki.net/ translatewiki.net], het vertaalproject voor MediaWiki, om vertalingen toe te voegen of te wijzigen voor alle wiki's.",
+'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 [//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.",
-'customcssprotected' => 'Je kunt deze CSS-pagina niet bewerken, omdat die persoonlijke instellingen van een andere gebruiker bevat.',
-'customjsprotected' => 'Je kunt deze JavaScriptpagina niet bewerken, omdat die persoonlijke instellingen van een andere gebruiker bevat.',
-'exception-nologin-text' => 'Om deze pagina te bekijken of deze handeling uit te kunnen voeren moet je aangemeld zijn bij deze wiki.',
# Login and logout pages
'logouttext' => "'''Je bent nu afgemeld.'''
-Je kunt {{SITENAME}} nu anoniem gebruiken of weer <span class='plainlinks'>[$1 aanmelden]</span> als dezelfde of een andere gebruiker.
+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-msg' => 'Je gebruiker is aangemaakt.
+'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:',
-'password-change-forbidden' => 'Je kunt je wachtwoord niet wijzigen in deze wiki.',
-'externaldberror' => 'Er is een fout opgetreden bij het aanmelden bij de database of je hebt geen toestemming je externe gebruiker bij te werken.',
+'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'''.",
-'userlogin-resetlink' => 'Ben je je aanmeldgegevens vergeten?',
-'nocookiesnew' => 'De gebruiker is geregistreerd, maar jij bent niet aangemeld.
+'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.',
-'nocookiesfornew' => 'De gebruiker is niet gemaakt omdat de bron niet bevestigd kon worden.
-Zorg ervoor dat je cookies hebt ingeschakeld, herlaad deze pagina en probeer het opnieuw.',
'noname' => 'Je hebt geen geldige gebruikersnaam opgegeven.',
'loginsuccess' => "'''Je bent nu aangemeld bij {{SITENAME}} als \"\$1\".'''",
-'nouserspecified' => 'Geef een gebruikersnaam op.',
+'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}}
@@ -100,10 +91,10 @@ Om misbruik te voorkomen is het niet mogelijk om een nieuw wachtwoord aan te vra
'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 al $1 gebruiker{{PLURAL:$1||s}} geregistreerd, wat het maximale aantal in deze periode is.
-Daarom kan je vanaf je IP-adres op dit moment geen nieuwe gebruikers registreren.',
+'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 niet bevestigd.
+'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',
@@ -114,7 +105,6 @@ 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.',
-'login-abort-generic' => 'Je bent niet aangemeld. De procedure is afgebroken.',
'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.',
# Change password dialog
@@ -122,33 +112,10 @@ Wacht even voordat je het opnieuw probeert.',
Voer een nieuw wachtwoord in om het aanmelden te voltooien:',
'resetpass_success' => 'Je wachtwoord is gewijzigd.
Bezig met aanmelden…',
-'resetpass-no-info' => 'Je moet aangemeld zijn voordat je deze pagina kunt gebruiken.',
+'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.',
-# Special:PasswordReset
-'passwordreset-text' => 'Vul dit formulier in zodat we ujeeen e-mail kunnen sturen met je gebruikersgegevens.',
-'passwordreset-capture-help' => 'Als je dit vakje aanvinkt, wordt de e-mail (met het tijdelijke wachtwoord) naar de gebruiker verzonden en ook aan jou weergegeven.',
-'passwordreset-emailtext-ip' => 'Iemand, waarschijnlijk jij, heeft vanaf het IP-adres $1 je gebruikersgegevens voor {{SITENAME}} ($4) opgevraagd.
-De volgende {{PLURAL:$3|gebruiker is|gebruikers zijn}} gekoppeld aan dit e-mailadres:
-
-$2
-
-{{PLURAL:$3|Dit tijdelijke wachtwoord vervalt|Deze tijdelijke wachtwoorden vervallen}} over {{PLURAL:$5|een dag|$5 dagen}}.
-Meld je aan en wijzig het wachtwoord nu. Als je dit verzoek niet zelf hebt gedaan, of als je het oorspronkelijke wachtwoord nog kent en het niet wilt wijzigen, negeer dit bericht dan en blijf je oude wachtwoord gebruiken.',
-'passwordreset-emailtext-user' => 'Gebruiker $1 op de site {{SITENAME}} heeft je gebruikersgegevens voor {{SITENAME}} ($4) opgevraagd.
-De volgende {{PLURAL:$3|gebruiker is|gebruikers zijn}} gekoppeld aan dit e-mailadres:
-
-$2
-
-{{PLURAL:$3|Dit tijdelijke wachtwoord vervalt|Deze tijdelijke wachtwoorden vervallen}} over {{PLURAL:$5|een dag|$5 dagen}}.
-Meld je aan en wijzig het wachtwoord nu. Als je dit verzoek niet zelf hebt gedaan, of als je het oorspronkelijke wachtwoord nog kent en het niet wilt wijzigen, negeer dit bericht dan en blijf je oude wachtwoord gebruiken.',
-
-# Special:ChangeEmail
-'changeemail-text' => 'Vul dit formulier in om je e-mailadres te wijzigen. Je moet je wachtwoord invoeren om deze wijziging te bevestigen.',
-'changeemail-no-info' => 'Je moet aangemeld zijn om rechtstreeks toegang te hebben tot deze pagina.',
-'changeemail-password' => 'Jouw wachtwoord voor {{SITENAME}}:',
-
# Edit page toolbar
'sig_tip' => 'Je handtekening met datum en tijd',
@@ -157,9 +124,9 @@ Meld je aan en wijzig het wachtwoord nu. Als je dit verzoek niet zelf hebt gedaa
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' => "'''Let op:''' je hebt geen samenvatting opgegeven voor je bewerking.
+'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 reactie hieronder.',
+'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.\'\'\'
@@ -172,7 +139,7 @@ De opgegeven reden is \'\'$2\'\'.
* 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 je [[Special:Preferences|voorkeuren]] en het gebruik van deze functie niet geblokkeerd is.
+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.
@@ -192,14 +159,14 @@ Je huidige IP-adres is $3 en het blokkadenummer is #$5.
Vermeld alle bovenstaande gegevens als je ergens op deze blokkade reageert.',
'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 je [[Special:Preferences|voorkeuren]].',
+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 geen gebruikersnaam heeft of deze niet gebruikt.
+'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.
@@ -208,24 +175,23 @@ Als je dat wilt voorkomen, [[Special:UserLogin/signup|registreer je]] of [[Speci
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>, maar je mag de pagina niet aanmaken.',
-'userpage-userdoesnotexist' => 'Je bewerkt een gebruikerspagina van een gebruiker die niet bestaat (gebruiker "$1").
+<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 "<nowiki>$1</nowiki>").
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.
* '''Firefox / Safari:''' houd ''Shift'' ingedrukt terwijl je op ''Vernieuwen'' klikt of druk op ''Ctrl-F5'' of ''Ctrl-R'' (''⌘-Shift-R'' op een Mac)
* '''Google Chrome:''' druk op ''Ctrl-Shift-R'' (''⌘-Shift-R'' op een Mac)
* '''Internet Explorer:''' houd ''Ctrl'' ingedrukt terwijl je op ''Vernieuwen'' klikt of druk op ''Ctrl-F5''
* '''Opera:''' leeg je cache in ''Extra → Voorkeuren''",
-'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.",
+'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 uiterlijk \"\$1\".
-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!",
+'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.
@@ -236,32 +202,32 @@ Als het dan nog niet lukt, [[Special:UserLogout|meld jezelf dan af]] en weer aan
'''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.'''
+'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.",
-'edit_form_incomplete' => "'''Sommige onderdelen van het bewerkingsformulier hebben de server niet bereikt. Controleer of je bewerkingen intact zijn en probeer het opnieuw.'''",
+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 tekens 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 verloren die na deze versie zijn gemaakt.",
-'copyrightwarning' => "Let op: 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 />
+'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 daarvoor toestemming hebt!'''",
+'''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 {{PLURAL:$1|één kilobyte|$1 kilobyte}} groot, wat groter is dan het maximum van {{PLURAL:$2|één kilobyte|$2 kilobyte}}.'''
-Opslaan is niet mogelijk.",
-'readonlywarning' => "'''Waarschuwing: je kunt deze bewerking nu niet opslaan omdat de database is geblokkeerd voor bewerkingen wegens onderhoudswerkzaamheden.'''
-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.
+'''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.
@@ -276,58 +242,57 @@ Voor je gemak staan hieronder het verwijderingslogboek en het hernoemingslogboek
'edit-no-change' => 'Je bewerking is genegeerd, omdat er geen wijziging aan de tekst is gemaakt.',
# Revision deletion
-'rev-deleted-text-unhide' => "Deze paginaversie is '''verwijderd'''.
-Er kunnen details te vinden zijn in het [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} verwijderingslogboek].
-Als je wilt kan je [$1 deze versie bekijken].",
+'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'''.
-Er kunnen details te vinden zijn in het [{{fullurl:{{#Special:Log}}/suppress|page={{FULLPAGENAMEE}}}} logboek onderdrukte versies].
-Als je wilt kan je [$1 deze versie bekijken].",
-'rev-deleted-text-view' => "Deze paginaversie is '''verwijderd'''.
-Je kunt deze bekijken; er kunnen details te vinden zijn in het [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} verwijderingslogboek].",
+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'''.
-Je kunt deze bekijken; er kunnen details te vinden zijn in het [{{fullurl:{{#Special:Log}}/suppress|page={{FULLPAGENAMEE}}}} logboek onderdrukte versies].",
+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'''.
-Er kunnen details te vinden zijn in het [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} verwijderingslogboek].
-Als je wilt kan je [$1 de verschillen bekijken].",
+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'''.
-Er kunnen details te vinden zijn in het [{{fullurl:{{#Special:Log}}/suppress|page={{FULLPAGENAMEE}}}} verbergingslogboek].
-Als je wilt kan je [$1 deze versie bekijken].",
+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 versies voor de verschillen die je hebt opgevraagd, is '''verwijderd'''.
Jij kunt 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 u hebt opgevraagd, is '''onderdrukt'''.
-Je kunt deze verschillen bekijken. Er kunnen details te vinden zijn in het [{{fullurl:{{#Special:Log}}/suppress|page={{FULLPAGENAMEE}}}} verbergingslogboek].",
-'revdelete-nooldid-text' => 'Je hebt geen doelversie(s) voor deze handeling opgegeven, de opgegeven versie bestaat niet of je probeert de laatste versie te verbergen.',
+'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 opgegeven logboekregel bestaat niet.',
-'revdelete-show-file-confirm' => 'Weet je zeker dat je de verwijderde versie van het bestand "<nowiki>$1</nowiki>" van $2 om $3 wilt bekijken?',
+'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 tijdens het weergeven van het object van $1 om $2: dit object is gemarkeerd als "beschermd".
+'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 tijdens het wijzigen van het object van $1 om $2: dit object is gemarkeerd als "beschermd".
+'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 tijdens 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.',
+'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 kan je versies van de geschiedenis van een bronpagina naar een nieuwere pagina samenvoegen.
+'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 hebt gezocht naar \'\'\'[[:$1]]\'\'\' ([[Special:Prefixindex/$1|pagina\'s die beginnen met "$1"]] {{int:pipe-separator}}[[Special:WhatLinksHere/$1|pagina\'s die verwijzen naar "$1"]])',
+'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' => "'''Let op''': standaard worden niet alle naamruimten doorzocht.
-Als je in je zoekopdracht als voorvoegsel \"''all:''\" gebruikt, worden alle pagina's doorzocht (inclusief overlegpagina's, sjablonen, enzovoort).
+'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.',
-# Quickbar
-'qbsettings-directionality' => 'Vast, afhankelijk van de schrijfrichting van jouw taal',
-
# 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.
@@ -336,16 +301,14 @@ 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' => 'E-mailadres:',
-'prefs-help-variant' => "Jouw voorkeursvariant of -spelling om de inhoudspagina's van deze wiki in weer te geven.",
+'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' => 'Je ondertekening is te lang.
-Deze moet minder dan $1 {{PLURAL:$1|teken|tekens}} bevatten.',
-'prefs-help-realname' => 'Echte naam is optioneel.
-Als je deze opgeeft, kan deze naam gebruikt worden om je erkenning te geven voor je werk.',
-'prefs-help-email' => 'E-mailadres is optioneel, maar maakt het mogelijk om jou je wachtwoord te e-mailen als je het bent vergeten.',
-'prefs-help-email-others' => 'Je kunt ook anderen in staat stellen per e-mail contact met je op te nemen via een koppeling op uw gebruikers- en overlegpagina zonder dat je je identiteit prijsgeeft.',
+'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.
@@ -353,20 +316,20 @@ Als je deze opgeeft, kan deze naam gebruikt worden om je erkenning te geven voor
* 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 [[Special:UserLogin|aangemeld]] zijn met een gebruiker met de juiste rechten om gebruikersrechten toe te wijzen.',
-'userrights-notallowed' => 'Je hebt geen rechten om gebruikersrechten toe te voegen of te verwijderen.',
+'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 opgegeven pagina of op pagina's in een opgegeven categorie.
-Pagina's die op [[Special:Watchlist|uw volglijst]] staan worden '''vet''' weergegeven.",
+'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 uitbreiding.',
+'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.',
@@ -374,9 +337,8 @@ Ga na of je dit bestand werkelijk bedoelde te uploaden.',
Controleer <strong>[[:$1]]</strong> als je niet zeker weet of je het huidige bestand wilt overschrijven.
[[$1|thumb]]',
'filepageexists' => 'De beschrijvingspagina voor dit bestand bestaat al op <strong>[[:$1]]</strong>, maar er bestaat geen bestand met deze naam.
-De samenvatting die je hebt opgegeven verschijnt niet op de beschrijvingspagina.
-Bewerk de pagina handmatig om je beschrijving daar weer te geven.
-[[$1|miniatuur]]',
+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 <strong>$1</strong>.
Het lijkt een verkleinde afbeelding te zijn ''(miniatuurafbeelding)''.
Als je deze afbeelding in volledige resolutie hebt, upload die afbeelding dan.
@@ -384,7 +346,7 @@ 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 gedeelde bestanden.
+'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.
@@ -401,12 +363,9 @@ $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.',
-# Special:UploadStash
-'uploadstash-badtoken' => 'Het uitvoeren van de handeling is mislukt. Dit komt mogelijk doordat je bewerkingsreferenties zijn verlopen. Probeer het opnieuw.',
-
# img_auth script messages
'img-auth-nopathinfo' => 'PATH_INFO mist.
-Je server is niet ingesteld om deze gegevens door te geven.
+Je server is niet ingesteld om deze informatie door te geven.
Misschien gebruikt deze CGI, en dan wordt img_auth niet ondersteund.
Zie https://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.',
@@ -421,12 +380,7 @@ Je kunt het misschien proberen als het minder druk is.',
'upload_source_file' => '(een bestand op je computer)',
# File description page
-'sharedupload-desc-edit' => 'Dit bestand komt van $1 en kan ook in andere projecten gebruikt worden.
-Je kunt de [$2 pagina met de bestandsbeschrijving] daar bewerken.',
-'sharedupload-desc-create' => 'Dit bestand komt van $1 en kan ook in andere projecten gebruikt worden.
-Je kunt de beschrijving bewerken op de [$2 pagina met de bestandsbeschrijving].',
'filepage-nofile-link' => 'Er bestaat geen bestand met deze naam, maar je kunt het [$1 uploaden].',
-'upload-disallowed-here' => 'Je kunt dit bestand niet overschrijven.',
# File reversion
'filerevert-intro' => "Je bent '''[[Media:$1|$1]]''' aan het terugdraaien tot de [$4 versie op $2, $3].",
@@ -436,7 +390,7 @@ Je kunt de beschrijving bewerken op de [$2 pagina met de bestandsbeschrijving].'
'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 je deze handeling wilt uitvoeren.',
+'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
@@ -446,13 +400,9 @@ Je kunt de beschrijving bewerken op de [$2 pagina met de bestandsbeschrijving].'
'alllogstext' => 'Dit is het gecombineerde logboek van {{SITENAME}}.
Je kunt ook kiezen voor specifieke logboeken en filteren op gebruiker (hoofdlettergevoelig) en paginanaam (hoofdlettergevoelig).',
-# SpecialCachedPage
-'cachedspecial-viewing-cached-ttl' => 'Je bekijkt een cacheversie van deze pagina, die maximaal $1 oud is.',
-'cachedspecial-viewing-cached-ts' => 'Je bekijkt een cacheversie van deze pagina, die mogelijk niet volledig is bijgewerkt.',
-
-# Email user
+# 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 kan je een e-mail aan {{GENDER:$1|deze gebruiker}} verzenden.
+'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',
@@ -463,43 +413,39 @@ De ontvanger kan dus direct naar je reageren.',
'nowatchlist' => 'Je volglijst is leeg.',
'watchlistanontext' => 'Om je volglijst te bekijken of te bewerken moet je je $1.',
'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 daar weergegeven.',
+'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 één pagina|staan $1 pagina's}} op je volglijst.",
-
-# Displayed when you click the "watch" button and it is in the process of watching
-'watcherrortext' => 'Er is een fout opgetreden tijdens het wijzigen van je volglijstinstellingen voor "$1".',
+'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' => 'Hoi $WATCHINGUSERNAME,
+'enotif_body' => 'Beste $WATCHINGUSERNAME,
-$PAGEINTRO $NEWPAGE
+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-mailadres: $PAGEEDITOR_EMAIL
+E-mail: $PAGEEDITOR_EMAIL
Wiki: $PAGEEDITOR_WIKI
-Tenzij je deze pagina bezoekt, komen er geen verdere berichten. Op je volglijst kan je voor alle gevolgde pagina\'s de waarschuwingsinstellingen opschonen.
+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.
+ Groet van je {{SITENAME}} waarschuwingssysteem.
--
-Je kunt je e-mailinstellingen wijzigen op:
-{{canonicalurl:{{#special:Preferences}}}}
-
Je kunt je volglijstinstellingen wijzigen op:
{{canonicalurl:Special:Watchlist/edit}}
-Je kunt de pagina van je volglijst verwijderen via de volgende koppeling:
+Je kunt de pagina van uw volglijst verwijderen via de volgende verwijzing:
$UNWATCHURL
-Terugkoppeling en verdere assistentie:
+Feedback en andere assistentie:
{{canonicalurl:{{MediaWiki:Helppage}}}}',
# Delete
@@ -524,62 +470,50 @@ Dit zijn de huidige instellingen voor de pagina '''$1''':",
'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 koppeling 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 wilt bekijken?',
+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-blockingself' => 'Je staat op het punt jezelf te blokkeren. Weet je zeker dat je dat wilt doen?',
-'ipb-confirmhideuser' => 'Je staat op het punt een verborgen gebruiker te blokkeren. Hiervoor worden gebruikersnamen in alle lijsten en logboekregels verborgen. Weet je het zeker?',
'ipb-needreblock' => '$1 is al geblokkeerd.
Wil je de instellingen wijzigen?',
-'unblock-hideuser' => 'Je kunt deze gebruiker niet deblokkeeren, omdat de gebruikersnaam is verborgen.',
'proxyblockreason' => 'Dit is een automatische preventieve blokkade, omdat je gebruik maakt van een open proxyserver.
-Neem contact op met je internetprovider of je helpdesk en stel die op de hoogte van dit ernstige beveiligingsprobleem.',
+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.',
+'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 kan je een pagina hernoemen.
+'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.
-* Koppelingen naar de oude pagina worden niet aangepast.
+* Verwijzingen naar de oude pagina worden niet aangepast.
* De pagina's die doorverwijzen naar de oorspronkelijke paginanaam worden automatisch bijgewerkt.
-Als je dit niet wilt, controleer dan of er geen [[Special:DoubleRedirects|dubbele]] of [[Special:BrokenRedirects|onjuiste doorverwijzingen]] zijn ontstaan.
+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!'''
+'''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.",
-'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.
-Je kunt dus een pagina die per ongeluk is hernoemd terug hernoemen en je kunt een bestaande pagina niet overschrijven.
-
-'''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.
-
-In die gevallen moet je de pagina handmatig hernoemen of samenvoegen.",
+* 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.',
@@ -598,17 +532,14 @@ Dit exportbestand is daarna te importeren in een andere MediaWiki via de [[Speci
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 kan je ook een koppeling gebruiken, bijvoorbeeld [[{{#Special:Export}}/{{MediaWiki:Mainpage}}]] voor de pagina "[[{{MediaWiki:Mainpage}}]]".',
+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 [//www.mediawiki.org/wiki/Localisation MediaWiki-lokalisatie] en [//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 computer op, en voeg die daarna hier toe.',
-'import-error-edit' => 'De pagina "$1" is niet geïmporteerd omdat je niet de rechten hebt om die te bewerken.',
-'import-error-create' => 'De pagina "$1" is niet geïmporteerd omdat je niet de rechten hebt om die aan te maken.',
+'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',
@@ -624,7 +555,6 @@ Gebruik de voorbeeldweergaveknop alvorens te bewaren.',
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-preview' => 'Een voorvertoning maken. Gebruik dit voordat je opslaat!',
'tooltip-watch' => 'Deze pagina aan je volglijst toevoegen',
# Metadata
@@ -632,7 +562,7 @@ Je kunt wel de broncode bekijken.',
# Spam protection
'spamprotectiontext' => 'De pagina die je wilde opslaan is geblokkeerd door het spamfilter.
-Meestal wordt dit door een externe koppeling op een zwarte lijst veroorzaakt.',
+Meestal wordt dit door een externe verwijzing op een zwarte lijst veroorzaakt.',
# Patrolling
'markedaspatrollederror-noautopatrol' => 'Je kunt je eigen wijzigingen niet als gecontroleerd markeren.',
@@ -640,12 +570,12 @@ Meestal wordt dit door een externe koppeling op een zwarte lijst veroorzaakt.',
# Media information
'mediawarning' => "'''Waarschuwing''': dit bestandstype bevat mogelijk programmacode die je systeem schade kan berokkenen.",
-# Email address confirmation
-'confirmemail_noemail' => 'Je hebt geen geldig e-mailadres opgegeven in je [[Special:Preferences|gebruikersvoorkeuren]].',
+# 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 koppeling met een code.
-Open die koppeling om je e-mailadres te bevestigen.',
+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.
@@ -662,11 +592,11 @@ Je kunt jezelf nu [[Special:UserLogin|aanmelden]] en {{SITENAME}} gebruiken.',
'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 koppeling in je webbrowser om te bevestigen dat je deze gebruiker bent en om de e-mailmogelijkheden op {{SITENAME}} te activeren:
+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 koppeling om de bevestiging van je e-mailadres te annuleren:
+Als je jezelf *niet* hebt aangemeld, volg dan de volgende verwijzing om de bevestiging van je e-mailadres te annuleren:
$5
@@ -674,23 +604,11 @@ 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 koppeling in je webbrowser om te bevestigen dat je deze gebruiker bent en om de e-mailmogelijkheden op {{SITENAME}} opnieuw te activeren:
+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 koppeling om de bevestiging van je e-mailadres te annuleren:
-
-$5
-
-De bevestigingscode vervalt op $4.',
-'confirmemail_body_set' => 'Iemand, waarschijnlijk jij, met het IP-adres $1,
-heeft het het e-mailadres voor gebruiker "$2" op {{SITENAME}} ingesteld op dit e-mailadres.
-
-Open de volgende koppeling in je webbrowser om te bevestigen dat jij deze gebruiker bent en om de e-mailmogelijkheden op {{SITENAME}} opnieuw te activeren:
-
-$3
-
-Als jij deze wijziging *niet* hebt gemaakt, volg dan de volgende koppeling om de bevestiging van uw e-mailadres te annuleren:
+Als je jezelf *niet* hebt aangemeld, volg dan de volgende verwijzing om de bevestiging van je e-mailadres te annuleren:
$5
@@ -701,12 +619,6 @@ De bevestigingscode vervalt op $4.',
'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.",
-'confirmrecreate-noreason' => 'Nadat je begonnen bent met je wijziging heeft [[User:$1|$1]] ([[User talk:$1|overleg]]) deze pagina verwijderd.
-Bevestig dat je de pagina opnieuw wilt aanmaken.',
-
-# action=watch/unwatch
-'confirm-watch-top' => 'Deze pagina toevoegen aan je volglijst?',
-'confirm-unwatch-top' => 'Deze pagina verwijderen uit je volglijst?',
# Watchlist editor
'watchlistedit-numitems' => 'Je volglijst bevat {{PLURAL:$1|1 pagina|$1 pagina’s}}, zonder overlegpagina’s.',
@@ -714,13 +626,13 @@ Bevestig dat je de pagina opnieuw wilt aanmaken.',
'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:EditWatchlist/raw|ruwe lijst bewerken]].',
-'watchlistedit-normal-done' => 'Er {{PLURAL:$1|is één pagina|zijn $1 pagina’s}} verwijderd van je volglijst:',
+'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:EditWatchlist|het standaard bewerkingsscherm gebruiken]].',
-'watchlistedit-raw-done' => 'Je volglijst is bijgewerkt.',
+'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.
@@ -729,29 +641,10 @@ MediaWiki wordt verspreid in de hoop dat het nuttig is, maar ZONDER ENIGE GARANT
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 [//www.gnu.org/licenses/old-licenses/gpl-2.0.html lees de licentie online].',
-# Special:ComparePages
-'compare-title-not-exists' => 'De titel die je hebt opgegeven bestaat niet.',
-'compare-revision-not-exists' => 'De versie die je hebt opgegeven bestaat niet.',
-
# 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.',
-# Feedback
-'feedback-bugornote' => 'Als je zover bent om een technisch probleem in detail te beschrijven, [$1 rapporteer dan een bug].
-Anders kan je ook het eenvoudige formulier hieronder gebruiken.
-Je reactie wordt dan toegevoegd aan de pagina "[$3 $2]", samen met je gebruikersnaam en de browser die je gebruikt.',
-'feedback-thanks' => 'Bedankt! Je terugkoppeling is op de pagina "[$2 $1]" geplaatst.',
-
-# API errors
-'api-error-badaccess-groups' => 'Je mag geen bestanden uploaden in deze wiki.',
-'api-error-empty-file' => 'Het bestand dat je hebt geüpload is leeg.',
-'api-error-file-too-large' => 'Het bestand dat je hebt geüpload is te groot.',
-'api-error-hookaborted' => 'De wijziging die je probeert te maken is afgebroken door een uitbreiding.',
-'api-error-internal-error' => 'Interne fout: er is iets misgegaan tijdens het verwerken van je upload door de wiki.',
-'api-error-mustbeloggedin' => 'Je moet aangemeld zijn om bestanden te kunnen uploaden.',
-'api-error-unknown-error' => 'Interne fout: er is iets misgegaan tijdens het uploaden van je bestand.',
-
);
diff --git a/languages/messages/MessagesNn.php b/languages/messages/MessagesNn.php
index 1a40c83d..f9ffcdac 100644
--- a/languages/messages/MessagesNn.php
+++ b/languages/messages/MessagesNn.php
@@ -144,7 +144,7 @@ $magicWords = array(
'img_framed' => array( '1', 'ramme', 'ramma', 'framed', 'enframed', 'frame' ),
'img_frameless' => array( '1', 'rammelaus', 'frameless' ),
'img_page' => array( '1', 'side=$1', 'side_$1', 'page=$1', 'page $1' ),
- 'img_link' => array( '1', 'lenkje=$1', 'lenkja=$1', 'link=$1' ),
+ 'img_link' => array( '1', 'lenkje=$1', 'lenke=$1', 'link=$1' ),
'sitename' => array( '1', 'NETTSTADNAMN', 'SITENAME' ),
'ns' => array( '0', 'NR:', 'NS:' ),
'localurl' => array( '0', 'LOKALLENKJE:', 'LOKALLENKE:', 'LOCALURL:' ),
@@ -180,6 +180,7 @@ $magicWords = array(
'numberofadmins' => array( '1', 'ADMINTAL', 'ADMINISTRATORTAL', 'NUMBEROFADMINS' ),
'formatnum' => array( '0', 'FORMATTAL', 'FORMATNUM' ),
'special' => array( '0', 'spesial', 'special' ),
+ 'defaultsort' => array( '1', 'STANDARDSORTERING', 'SORTERINGSNYKEL', 'SORTERINGSNØKKEL', 'DEFAULTSORT:', 'DEFAULTSORTKEY:', 'DEFAULTCATEGORYSORT:' ),
'filepath' => array( '0', 'FILSTIG', 'FILEPATH:' ),
'tag' => array( '0', 'merke', 'tag' ),
'hiddencat' => array( '1', '__GØYMDKAT__', '__LØYNDKAT__', '__HIDDENCAT__' ),
@@ -214,15 +215,18 @@ $namespaceNames = array(
);
$specialPageAliases = array(
+ 'Activeusers' => array( 'Verksame_brukarar', 'Aktive_brukarar' ),
'Allmessages' => array( 'Alle_systemmeldingar' ),
'Allpages' => array( 'Alle_sider' ),
'Ancientpages' => array( 'Gamle_sider' ),
+ 'Badtitle' => array( 'DÃ¥rleg_tittel' ),
'Blankpage' => array( 'Tom_side' ),
'Block' => array( 'Blokker' ),
'Blockme' => array( 'Blokker_meg' ),
'Booksources' => array( 'Bokkjelder' ),
'BrokenRedirects' => array( 'Blindvegsomdirigeringar' ),
'Categories' => array( 'Kategoriar' ),
+ 'ChangeEmail' => array( 'Endra_e-post', 'Endre_e-post' ),
'ChangePassword' => array( 'Nullstill_passord' ),
'Confirmemail' => array( 'Stadfest_e-postadresse' ),
'Contributions' => array( 'Bidrag' ),
@@ -231,6 +235,7 @@ $specialPageAliases = array(
'DeletedContributions' => array( 'Sletta_brukarbidrag' ),
'Disambiguations' => array( 'Fleirtydingssider' ),
'DoubleRedirects' => array( 'Doble_omdirigeringar' ),
+ 'EditWatchlist' => array( 'Endra_overvakingsliste', 'Endre_overvakingsliste' ),
'Emailuser' => array( 'E-post' ),
'Export' => array( 'Eksport' ),
'Fewestrevisions' => array( 'Færrast_endringar' ),
@@ -241,7 +246,7 @@ $specialPageAliases = array(
'BlockList' => array( 'Blokkeringsliste' ),
'LinkSearch' => array( 'Lenkjesøk' ),
'Listadmins' => array( 'Administratorliste', 'Administratorar' ),
- 'Listbots' => array( 'Bottliste', 'Bottar' ),
+ 'Listbots' => array( 'Bottliste', 'Bottar', 'Robotliste', 'Robotar' ),
'Listfiles' => array( 'Filliste' ),
'Listgrouprights' => array( 'Grupperettar' ),
'Listredirects' => array( 'Omdirigeringsliste' ),
@@ -254,7 +259,7 @@ $specialPageAliases = array(
'MIMEsearch' => array( 'MIME-søk' ),
'Mostcategories' => array( 'Flest_kategoriar' ),
'Mostimages' => array( 'Mest_brukte_filer' ),
- 'Mostlinked' => array( 'Mest_lenka_sider' ),
+ 'Mostlinked' => array( 'Mest_lenka_sider', 'Mest_lenkja_sider' ),
'Mostlinkedcategories' => array( 'Mest_brukte_kategoriar' ),
'Mostlinkedtemplates' => array( 'Mest_brukte_malar' ),
'Mostrevisions' => array( 'Flest_endringar' ),
@@ -265,7 +270,7 @@ $specialPageAliases = array(
'Myuploads' => array( 'Opplastingane_mine' ),
'Newimages' => array( 'Nye_filer' ),
'Newpages' => array( 'Nye_sider' ),
- 'PermanentLink' => array( 'Permanent_lenkje' ),
+ 'PermanentLink' => array( 'Permanent_lenkje', 'Permanent_lenke' ),
'Popularpages' => array( 'Populære_sider' ),
'Preferences' => array( 'Innstillingar' ),
'Prefixindex' => array( 'Prefiksindeks' ),
@@ -273,12 +278,12 @@ $specialPageAliases = array(
'Protectedtitles' => array( 'Verna_sidenamn' ),
'Randompage' => array( 'Tilfeldig_side' ),
'Randomredirect' => array( 'Tilfeldig_omdirigering' ),
- 'Recentchanges' => array( 'Siste_endringar' ),
+ 'Recentchanges' => array( 'Siste_endringar', 'Siste_endringane' ),
'Recentchangeslinked' => array( 'Relaterte_endringar' ),
'Revisiondelete' => array( 'Versjonssletting' ),
'Search' => array( 'Søk' ),
- 'Shortpages' => array( 'Korte_sider' ),
- 'Specialpages' => array( 'Spesialsider' ),
+ 'Shortpages' => array( 'Korte_sider', 'Stutte_sider' ),
+ 'Specialpages' => array( 'Spesialsider', 'Særsider' ),
'Statistics' => array( 'Statistikk' ),
'Tags' => array( 'Merke' ),
'Uncategorizedcategories' => array( 'Ukategoriserte_kategoriar' ),
@@ -342,10 +347,6 @@ $messages = array(
'tog-shownumberswatching' => 'Vis kor mange som overvakar sida',
'tog-oldsig' => 'Noverande signatur:',
'tog-fancysig' => 'Handsam signaturar som wikitekst (utan automatisk lenking)',
-'tog-externaleditor' => 'Bruk eit eksternt handsamingsprogram som standard (berre for vidarekomne, krev eit spesielt oppsett på maskina di. [//www.mediawiki.org/wiki/Manual:External_editors Meir informasjon.])',
-'tog-externaldiff' => 'Bruk eit eksternt skilnadprogram som standard (berre for vidarekomne, krev eit spesielt oppsett på maskina di.
-[//www.mediawiki.org/wiki/Manual:External_editors Meir informasjon.])',
-'tog-showjumplinks' => 'Slå på «gå til»-lenkjer',
'tog-uselivepreview' => 'Bruk levande førehandsvising (eksperimentelt JavaScript)',
'tog-forceeditsummary' => 'Spør meg når eg ikkje har skrive noko i endringssamandraget',
'tog-watchlisthideown' => 'Gøym endringane mine i overvakingslista',
@@ -359,6 +360,8 @@ $messages = array(
'tog-showhiddencats' => 'Vis gøymde kategoriar',
'tog-noconvertlink' => 'Slå av konvertering av sidetitlar',
'tog-norollbackdiff' => 'Ikkje vis skilnad etter attenderulling',
+'tog-useeditwarning' => 'Gje ei åtvaring om eg går ut av ei redigeringsside og ikkje alle endringar er lagra',
+'tog-prefershttps' => 'Alltid bruk ei trygg kopling når du er innlogga',
'underline-always' => 'Alltid',
'underline-never' => 'Aldri',
@@ -422,6 +425,18 @@ $messages = array(
'oct' => 'okt',
'nov' => 'nov',
'dec' => 'des',
+'january-date' => '$1. januar',
+'february-date' => '$1. februar',
+'march-date' => '$1. mars',
+'april-date' => '$1. april',
+'may-date' => '$1. mai',
+'june-date' => '$1. juni',
+'july-date' => '$1. juli',
+'august-date' => '$1. august',
+'september-date' => '$1. september',
+'october-date' => '$1. oktober',
+'november-date' => '$1. november',
+'december-date' => '$1. desember',
# Categories related messages
'pagecategories' => '{{PLURAL:$1|Kategori|Kategoriar}}',
@@ -442,7 +457,7 @@ $messages = array(
'noindex-category' => 'Ikkje-indekserte sider',
'broken-file-category' => 'Sider med brotne fillenkjer',
-'linkprefix' => '/^(.*?)([a-zA-Z\\x80-\\xff]+)$/sD',
+'linkprefix' => '/^((?>.*(?<![a-zA-Z\\x80-\\xff])))(.+)$/sD',
'about' => 'Om',
'article' => 'Innhaldsside',
@@ -505,6 +520,7 @@ $messages = array(
'create-this-page' => 'Opprett sida',
'delete' => 'Slett',
'deletethispage' => 'Slett denne sida',
+'undeletethispage' => 'Attopprett sida',
'undelete_short' => 'Attopprett {{PLURAL:$1|éin versjon|$1 versjonar}}',
'viewdeleted_short' => 'Vis {{PLURAL:$1|éin sletta versjon|$1 sletta versjonar}}',
'protect' => 'Vern',
@@ -548,7 +564,7 @@ $1',
'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).
+# 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).
'aboutsite' => 'Om {{SITENAME}}',
'aboutpage' => 'Project:Om',
'copyright' => 'Innhaldet er utgjeve under $1.',
@@ -558,7 +574,6 @@ $1',
'disclaimers' => 'Atterhald',
'disclaimerpage' => 'Project:Atterhald',
'edithelp' => 'Endringshjelp',
-'edithelppage' => 'Help:Endring',
'helppage' => 'Help:Innhald',
'mainpage' => 'Hovudside',
'mainpage-description' => 'Hovudside',
@@ -633,10 +648,6 @@ Dette kan òg skuldast ein feil i programvara som er nytta av {{SITENAME}}.',
# General errors
'error' => 'Feil',
'databaseerror' => 'Databasefeil',
-'dberrortext' => 'Det oppstod ein syntaksfeil i ein databaseførespurnad. Dette kan tyda på feil i programvara. Siste førespurnaden til databasen var: <blockquote><code>$1</code></blockquote> frå funksjonen «<code>$2</code>». Databasen returnerte feilen «<samp>$3: $4</samp>».',
-'dberrortextcl' => 'Det oppstod ein syntaksfeil i databaseførespurnaden.
-Den sist prøvde førespurnaden var: «$1» frå funksjonen «$2».
-Databasen returnerte feilen «$3: $4».',
'laggedslavemode' => 'Ã…tvaring: Det er mogleg at sida ikkje er heilt oppdatert.',
'readonly' => 'Databasen er skriveverna',
'enterlockreason' => 'Skriv ein grunn for vernet, inkludert eit overslag for kva tid det vil bli oppheva',
@@ -688,12 +699,15 @@ For å leggja til eller endra omsetjingar for alle wikiar, gjer vel å nytta [//
'editinginterface' => "'''Åtvaring:''' Du endrar på ei side som inneheld tekst nytta av brukargrensesnittet for programvara.
Endringar på denne sida påverkar utsjånaden til brukargrensesnittet for dei andre brukarane av wikien.
For å leggja til eller endra omsetjingar, gjer vel å nytta [//translatewiki.net/wiki/Main_Page?setlang=nn translatewiki.net], prosjektet for lokalisering av MediaWiki.",
-'sqlhidden' => '(SQL-førespurnaden er gøymd)',
'cascadeprotected' => 'Denne sida er verna mot endring fordi ho er inkludert i {{PLURAL:$1|den opplista sida|dei opplista sidene}} som har djupvern slått på:
$2',
'namespaceprotected' => "Du har ikkje tilgang til å endre sidene i '''$1'''-namnerommet.",
'customcssprotected' => '↓Du har ikkje tilgang til å endre denne sida, fordi ho inneheld ein annan brukar sine personlege innstillingar.',
'customjsprotected' => '↓Du har ikkje tilgang til å endra denne JavaScript-sida fordi ho inneheld ein annen brukar sine personlege innstillingar.',
+'mycustomcssprotected' => 'Du har ikkje løyve til å endra denne CSS-sida.',
+'mycustomjsprotected' => 'Du har ikkje løyve til å endra denne JavaScript-sida.',
+'myprivateinfoprotected' => 'Du har ikkje løyve til endra den private informasjonen din.',
+'mypreferencesprotected' => 'Du har ikkje løyve til å endra innstillingane dine.',
'ns-specialprotected' => 'Sider i {{ns:special}}-namnerommet kan ikkje endrast.',
'titleprotected' => "Denne sidetittelen er verna mot oppretting av [[User:$1|$1]].
Grunnen som er gjeven er: ''$2''.",
@@ -719,10 +733,19 @@ Ver merksam på at nokre sider framleis kan visast fram som om du er innlogga fr
'welcomecreation-msg' => 'Brukarkontoen din er oppretta.
Gløym ikkje å endra [[Special:Preferences|innstillingane dine for {{SITENAME}}]].',
'yourname' => 'Brukarnamn:',
+'userlogin-yourname' => 'Brukarnamn',
+'userlogin-yourname-ph' => 'Skriv inn brukarnamnet ditt',
+'createacct-another-username-ph' => 'Skriv inn brukarnamnet',
'yourpassword' => 'Passord:',
+'userlogin-yourpassword' => 'Passord',
+'userlogin-yourpassword-ph' => 'Skriv inn passordet ditt',
+'createacct-yourpassword-ph' => 'Skriv inn eit passord',
'yourpasswordagain' => 'Skriv opp att passordet',
+'createacct-yourpasswordagain' => 'Stadfest passord',
+'createacct-yourpasswordagain-ph' => 'Skriv inn passordet på nytt',
'remembermypassword' => 'Hugs innlogginga mi på denne datamaskinen (høgst {{PLURAL:$1|éin dag|$1 dagar}})',
-'securelogin-stick-https' => 'Fortset HTTPS-tilkopling etter innlogging.',
+'userlogin-remembermypassword' => 'Hald meg innlogga',
+'userlogin-signwithsecure' => 'Nytt trygg kopling',
'yourdomainname' => 'Domenet ditt',
'password-change-forbidden' => 'Du kan ikkje endra passord på denne wikien.',
'externaldberror' => 'Det var anten ein ekstern databasefeil i tilgjengekontrollen, eller du har ikkje løyve til å oppdatere den eksterne kontoen din.',
@@ -734,17 +757,40 @@ Gløym ikkje å endra [[Special:Preferences|innstillingane dine for {{SITENAME}}
'logout' => 'Logg ut',
'userlogout' => 'Logg ut',
'notloggedin' => 'Ikkje innlogga',
+'userlogin-noaccount' => 'Har du ingen konto?',
+'userlogin-joinproject' => 'Vert med på {{SITENAME}}',
'nologin' => 'Har du ingen brukarkonto? $1.',
'nologinlink' => 'Registrer deg',
'createaccount' => 'Opprett ny konto',
'gotaccount' => "Har du ein brukarkonto? '''$1'''.",
'gotaccountlink' => 'Logg inn',
'userlogin-resetlink' => 'Har du gløymd påloggingsopplysingane dine?',
+'userlogin-resetpassword-link' => 'Attendestill passordet ditt',
+'helplogin-url' => 'Help:Innlogging',
+'userlogin-helplink' => '[[{{MediaWiki:helplogin-url}}|Hjelp med innlogging]]',
+'createacct-join' => 'Skriv inn informasjonen din under.',
+'createacct-another-join' => 'Skriv inn informasjonen til den nye kontoen under',
+'createacct-emailrequired' => 'E-postadresse:',
+'createacct-emailoptional' => 'E-postadresse (valfritt)',
+'createacct-email-ph' => 'Skriv inn e-postadressa di',
+'createacct-another-email-ph' => 'Skriv inn e-postadresse',
'createaccountmail' => 'Bruk eit mellombels tilfeldig passord og send det til e-postadressa som er oppgjeven under',
+'createacct-realname' => 'Sant namn (valfritt)',
'createaccountreason' => 'Ã…rsak:',
+'createacct-reason' => 'Ã…rsak',
+'createacct-reason-ph' => 'Kvifor du lagar ein ny konto',
+'createacct-captcha' => 'Tryggingssjekk',
+'createacct-imgcaptcha-ph' => 'Skriv inn teksten du ser over',
+'createacct-submit' => 'Opprett kontoen din',
+'createacct-another-submit' => 'Opprett ein konto til',
+'createacct-benefit-heading' => '{{SITENAME}} er laga av folk som deg.',
+'createacct-benefit-body1' => '{{PLURAL:$1|éi endring|$1 endringar}}',
+'createacct-benefit-body2' => '{{PLURAL:$1|éi side|$1 sider}}',
+'createacct-benefit-body3' => '{{PLURAL:$1|nyleg bidragsytar|nylege bidragsytarar}}',
'badretype' => 'Passorda du skreiv inn er ikkje like.',
'userexists' => 'Brukarnamnet er alt i bruk. Vel eit anna brukarnamn.',
'loginerror' => 'Innloggingsfeil',
+'createacct-error' => 'Kontoopprettingsfeil',
'createaccounterror' => 'Kunne ikkje oppretta kontoen: $1',
'nocookiesnew' => 'Brukarkontoen vart oppretta, men du er ikkje innlogga. {{SITENAME}} bruker informasjonskapslar for å logge inn brukarar,
nettlesaren din er innstilt for ikkje å godta desse. Etter at du har endra innstillingane slik at nettlesaren godtek informasjonskapslar, kan du logge inn med det nye brukarnamnet og passordet ditt.',
@@ -814,7 +860,7 @@ Du kan sjå bort frå denne meldinga dersom kontoen vart oppretta med eit uhell.
'newpassword' => 'Nytt passord',
'retypenew' => 'Nytt passord om att',
'resetpass_submit' => 'Oppgje passord og logg inn',
-'resetpass_success' => 'Passordet ditt er no nullstilt! Loggar inn...',
+'changepassword-success' => 'Passordet ditt er no nullstilt! Loggar inn...',
'resetpass_forbidden' => 'Passord kan ikkje endrast',
'resetpass-no-info' => 'Du må vera innlogga for å få direktetilgang til denne sida.',
'resetpass-submit-loggedin' => 'Endra passord',
@@ -826,10 +872,10 @@ Du kan allereie ha byta passordet, eller ha bede om å få eit nytt mellombels p
# Special:PasswordReset
'passwordreset' => 'Attendestilling av passord',
-'passwordreset-text' => 'Fyll ut dette skjemaet for å attendestilla passordet ditt.',
+'passwordreset-text-one' => 'Fyll ut dette skjemaet for å attendestilla passordet ditt.',
'passwordreset-legend' => '↓Nullstill passordet',
'passwordreset-disabled' => '↓Tilbakestilling av passord er ikkje aktivert på denne wikien',
-'passwordreset-pretext' => '↓{{PLURAL:$1||Tast inn ein av datadelane nedanfor}}',
+'passwordreset-emaildisabled' => 'E-postfunksjonen er slegen av på wikien.',
'passwordreset-username' => 'Brukarnamn:',
'passwordreset-domain' => 'Domene:',
'passwordreset-capture' => 'Vis resulterande epost',
@@ -1052,11 +1098,14 @@ Sletteloggen for sida finn du her:",
Det ser ut til at ho er sletta.',
'edit-conflict' => 'Endringskonflikt.',
'edit-no-change' => 'Redigeringa di vart ignorert fordi det ikkje vart gjort endringar i teksten.',
+'postedit-confirmation' => 'Endringa di vart lagra.',
'edit-already-exists' => 'Kunne ikkje opprette ny side fordi ho alt eksisterer.',
'defaultmessagetext' => 'Standard meldingstekst',
'content-failed-to-parse' => 'Klarte ikkje å tolke innhaldet «$2» for innhaldsmodellen «$1»: $3',
'invalid-content-data' => 'Ugyldig innhald',
'content-not-allowed-here' => 'Innhaldsmodellen «$1» er ikkje tillaten på sida [[$2]]',
+'editwarning-warning' => 'Ved å forlata denne sida kan du mista alle endringane du måtte ha gjort.
+Er du innlogga kan denne åtvaringa slåast av under bolken «Endring» i innstillingane dine.',
# Content models
'content-model-wikitext' => 'WikiTekst',
@@ -1266,6 +1315,7 @@ Pass på at den nye sida også har innhald frå den innfletta sida.',
'compareselectedversions' => 'Samanlikn valde versjonar',
'showhideselectedversions' => 'Vis/løyn valde versjonar',
'editundo' => 'angre',
+'diff-empty' => '(Ingen skilnad)',
'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}})',
'difference-missing-revision' => '{{PLURAL:$2|Éin versjon|$2 versjonar}} av skilnaden ($1) vart ikkje {{PLURAL:$2|funnen|funne}}.
@@ -1293,7 +1343,6 @@ Detaljar kan ein finna i [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE
'searchmenu-legend' => 'Søkjeval',
'searchmenu-exists' => "* Sida '''[[$1]]'''",
'searchmenu-new' => "'''Opprett sida «[[:$1|$1]]» på denne wikien.'''",
-'searchhelp-url' => 'Help:Innhald',
'searchmenu-prefix' => '[[Special:PrefixIndex/$1|Sjå gjennom alle sider med denne forstavinga]]',
'searchprofile-articles' => 'Innhaldssider',
'searchprofile-project' => 'Hjelp- og prosjektsider',
@@ -1337,15 +1386,7 @@ For å søkja i alle, bruk prefikset ''all:'' (det inkluderer diskusjonssider, m
'searchdisabled' => 'Søkjefunksjonen på {{SITENAME}} er slått av akkurat no.
I mellomtida kan du søkje gjennom Google.
Ver merksam på at registra deira kan vera utdaterte.',
-
-# Quickbar
-'qbsettings' => 'Snøggmeny',
-'qbsettings-none' => 'Ingen',
-'qbsettings-fixedleft' => 'Venstre',
-'qbsettings-fixedright' => 'Høgre',
-'qbsettings-floatingleft' => 'Flytande venstre',
-'qbsettings-floatingright' => 'Flytande høgre',
-'qbsettings-directionality' => 'Fast, avhengig av kva retning språket ditt vert lese',
+'search-error' => 'Det oppstod ein feil under søket: $1',
# Preferences page
'preferences' => 'Innstillingar',
@@ -1379,7 +1420,6 @@ Ver merksam på at registra deira kan vera utdaterte.',
'resetprefs' => 'Rull attende',
'restoreprefs' => 'Hent attende alle standardinnstillingane',
'prefs-editing' => 'Endring',
-'prefs-edit-boxsize' => 'Storleiken på redigeringsvindauget.',
'rows' => 'Rekkjer',
'columns' => 'Kolonnar',
'searchresultshead' => 'Søk',
@@ -1390,9 +1430,6 @@ Ver merksam på at registra deira kan vera utdaterte.',
'recentchangesdays-max' => '(høgst $1 {{PLURAL:$1|dag|dagar}})',
'recentchangescount' => 'Tal på endringar som viser som standard:',
'prefs-help-recentchangescount' => 'Dette inkluderer nylege endringar, sidehistorikk og loggar.',
-'prefs-help-watchlist-token' => 'Om du fyller ut dette feltet med eit hemmeleg tal, vil det opprettast ei RSS opplisting for overvakingslista di.
-Alle som veit det rette talet vil vera i stand til å lesa overvakingslista di, så vél gjerne ein trygg verdi.
-Her er det framlegg til eit tal som kan nyttast, tilfelleleg henta fram: $1',
'savedprefs' => 'Brukarinnstillingane er lagra.',
'timezonelegend' => 'Tidssone:',
'localtime' => 'Lokaltid:',
@@ -1423,7 +1460,6 @@ Her er det framlegg til eit tal som kan nyttast, tilfelleleg henta fram: $1',
'prefs-reset-intro' => 'Du kan nytta denne sida til å tilbakestilla innstillingane dine til standardinnstillingane.
Dette kan ikkje tilbakestillast.',
'prefs-emailconfirm-label' => 'Stadfesting av e-post:',
-'prefs-textboxsize' => 'Storleiken til redigeringsvindauga',
'youremail' => 'E-post:',
'username' => '{{GENDER:$1|Brukarnamn}}:',
'uid' => '{{GENDER:$1|Brukar-ID}}:',
@@ -1455,6 +1491,8 @@ Denne informasjonen vil vera offentleg.',
'prefs-dateformat' => 'Datoformat',
'prefs-timeoffset' => 'Tidforskuving',
'prefs-advancedediting' => 'Ã…lmenne val',
+'prefs-editor' => 'Teksthandsamar',
+'prefs-preview' => 'Førehandsvising',
'prefs-advancedrc' => 'Avanserte val',
'prefs-advancedrendering' => 'Avanserte val',
'prefs-advancedsearchoptions' => 'Avanserte val',
@@ -1559,6 +1597,10 @@ Denne informasjonen vil vera offentleg.',
'right-editusercssjs' => 'Endre andre brukarar sine CSS- og JS-filer',
'right-editusercss' => 'Endre andre brukarar sine CSS-filer',
'right-edituserjs' => 'Endre andre brukarar sine JS-filer',
+'right-editmyusercss' => 'Endra eigne CSS-filer',
+'right-editmyuserjs' => 'Endra eigne JavaScript-filer',
+'right-viewmywatchlist' => 'Sjå eiga overvakingsliste',
+'right-editmywatchlist' => 'Endra eiga overvakingsliste. Merk at somme handlingane framleis vil leggja til sider utan denne retten.',
'right-rollback' => 'Snøgt rulla attende endringane til den siste brukaren som endra ei viss side',
'right-markbotedits' => 'Markere tilbakerullingar som robotendringar',
'right-noratelimit' => 'Vert ikkje påverka av snøggleiksgrenser',
@@ -1620,12 +1662,15 @@ Denne informasjonen vil vera offentleg.',
'action-userrights-interwiki' => 'endre brukarrettar for brukarar på andre wikiar',
'action-siteadmin' => 'låse eller låse opp databasen',
'action-sendemail' => 'senda e-postar',
+'action-editmywatchlist' => 'endra overvakingslista di',
+'action-viewmywatchlist' => 'sjå overvakingslista di',
# Recent changes
'nchanges' => '{{PLURAL:$1|Éi endring|$1 endringar}}',
'recentchanges' => 'Siste endringar',
'recentchanges-legend' => 'Alternativ for siste endringar',
'recentchanges-summary' => 'PÃ¥ denne sida ser du dei sist endra sidene i {{SITENAME}}.',
+'recentchanges-noresult' => 'Ingen endringar i den gjevne perioden passar med kriteria.',
'recentchanges-feed-description' => 'Fylg med på dei siste endringane på denne wikien med dette abonnementet.',
'recentchanges-label-newpage' => 'Endringa oppretta ei ny side',
'recentchanges-label-minor' => 'Endringa er småplukk',
@@ -1662,7 +1707,6 @@ Denne informasjonen vil vera offentleg.',
'recentchangeslinked-feed' => 'Relaterte endringar',
'recentchangeslinked-toolbox' => 'Relaterte endringar',
'recentchangeslinked-title' => 'Endringar relaterte til «$1»',
-'recentchangeslinked-noresult' => 'Det er ikkje gjort endringar på sidene som var lenkja hit i den oppgjevne perioden.',
'recentchangeslinked-summary' => "Dette er ei liste over nylege endringar som er gjorde på sider som vert lenkja til frå ei oppgjeven side (eller på medlemer av ein oppgjeven kategori). Sider på [[Special:Watchlist|overvakingslista di]] er '''utheva'''.",
'recentchangeslinked-page' => 'Sidenamn:',
'recentchangeslinked-to' => 'Vis endringar på sider som lenkjer til den gitte sida i staden',
@@ -1673,7 +1717,7 @@ Denne informasjonen vil vera offentleg.',
'reuploaddesc' => 'Attende til opplastingsskjemaet.',
'upload-tryagain' => 'Send inn endra filskildring',
'uploadnologin' => 'Ikkje innlogga',
-'uploadnologintext' => 'Du lyt vera [[Special:UserLogin|innlogga]] for å kunna laste opp filer.',
+'uploadnologintext' => 'Du lyt $1 for å kunna laste opp filer.',
'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',
@@ -1894,7 +1938,6 @@ For best tryggleik, er img_auth.php sett ut av funksjon.',
'http-read-error' => 'HTTP-lesefeil.',
'http-timed-out' => 'Tidsavbrot på HTTP-førespurnad.',
'http-curl-error' => 'Feil under henting av nettadressa: $1',
-'http-host-unreachable' => 'Kunne ikkje nå nettadressa',
'http-bad-status' => 'Det var eit problem under HTTP-førespurnaden: $1 $2',
# Some likely curl errors. More could be added from <http://curl.haxx.se/libcurl/c/libcurl-errors.html>
@@ -2042,12 +2085,6 @@ Du vil kan henda endra skildringa på [$2 filskildringssida] hennar der.',
'statistics-users-active-desc' => 'Brukarar som har utført handlingar {{PLURAL:$1|i dag|dei siste $1 dagane}}',
'statistics-mostpopular' => 'Mest viste sider',
-'disambiguations' => 'Sider som lenkjer til fleirtydingssider',
-'disambiguationspage' => 'Template:Fleirtyding',
-'disambiguations-text' => "Dei fylgjande sidene inneheld minst éi lenkje til ei '''fleirtydingsside'''.
-Dei bør kan henda lenkja til ei meir passande side i staden.<br />
-Ei side vert handsama som ei fleirtydingsside om ho nyttar ein mal som er lenkja til frå [[MediaWiki:Disambiguationspage]].",
-
'pageswithprop' => 'Sider med ein sideeigenskap',
'pageswithprop-legend' => 'Sider med ein sideeigenskap',
'pageswithprop-text' => 'Denne sida listar opp sider som nyttar ein viss sideeigenskap.',
@@ -2295,10 +2332,9 @@ E-postadressa du har sett i [[Special:Preferences|innstillingane dine]] vil dukk
'unwatchthispage' => 'Fjern overvaking',
'notanarticle' => 'Ikkje innhaldsside',
'notvisiblerev' => 'Sideversjonen er sletta',
-'watchnochange' => 'Ingen av sidene i overvakingslista er endra i den valde perioden.',
'watchlist-details' => '{{PLURAL:$1|Éi side|$1 sider}} er overvaka, utanom diskusjonssider.',
-'wlheader-enotif' => '* Funksjonen for endringsmeldingar per e-post er på.',
-'wlheader-showupdated' => "* Sider som har vorte endra sidan du sist såg på dei er '''utheva'''",
+'wlheader-enotif' => 'Funksjonen for endringsmeldingar per e-post er på.',
+'wlheader-showupdated' => "Sider som har vorte endra sidan du sist såg på dei er '''utheva'''",
'watchmethod-recent' => 'sjekkar siste endringar for dei overvaka sidene',
'watchmethod-list' => 'sjekkar om dei overvaka sidene har blitt endra i det siste',
'watchlistcontains' => 'Overvakingslista di inneheld {{PLURAL:$1|éi side|$1 sider}}.',
@@ -2685,13 +2721,11 @@ IP-adresser som blir automatisk blokkerte er ikkje lista her. Sjå [[Special:Blo
'ipb_blocked_as_range' => 'Feil: IP-en $1 er ikkje direkte blokkert og kan ikkje opphevast. Adressa er blokkert som ein del av blokkeringa av IP-intervallet $2. Denne blokkeringa kan opphevast.',
'ip_range_invalid' => 'Ugyldig IP-adresseserie.',
'ip_range_toolarge' => 'Blokkering av IP-seriar større enn /$1 er ikkje tillate.',
-'blockme' => 'Blokker meg',
'proxyblocker' => 'Proxy-blokkerar',
-'proxyblocker-disabled' => 'Denne funksjonen er slått av.',
'proxyblockreason' => 'Du er blokkert frå å endre fordi IP-adressa di tilhøyrer ein open mellomtenar (proxy). Du bør kontakte internettleverandøren din eller kundesørvis og gje dei beskjed, ettersom dette er eit alvorleg sikkerheitsproblem.',
-'proxyblocksuccess' => 'Utført.',
'sorbsreason' => 'IP-adressa di er lista som ein open mellomtenar i DNSBL.',
'sorbs_create_account_reason' => 'IP-adressa di er lista som ein open mellomtenar i DNSBL, og difor får du ikkje registrert deg.',
+'xffblockreason' => 'Ei IP-adresse i X-Forwarded-For-tittelen, anten di eller den som høyrer til ein proksytenar du nyttar, er blokkert. Den opphavlege blokkeringsgrunnen var: $1',
'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',
@@ -2992,26 +3026,15 @@ Vitja [//www.mediawiki.org/wiki/Localisation MediaWiki Localisation] og [//trans
# Stylesheets
'common.css' => '/* CSS plassert i denne fila vil gjelde for alle utsjånader. */',
-'standard.css' => '/* CSS i denne fila vil gjelde alle som nyttar drakta Standard */',
-'nostalgia.css' => '/* CSS i denne fila vil gjelde alle som nyttar drakta Nostalgia */',
'cologneblue.css' => '/* CSS i denne fila vil gjelde alle som nyttar drakta Kølnerblå */',
'monobook.css' => '/* CSS-tekst som vert plassert her, endrar utsjånaden til sidedrakta Monobook */',
-'myskin.css' => '/* CSS i denne fila vil gjelde alle som nyttar drakta MySkin */',
-'chick.css' => '/* CSS i denne fila vil gjelde alle som nyttar drakta Chick */',
-'simple.css' => '/* CSS i denne fila vil gjelde alle som nyttar drakta Simple */',
'modern.css' => '/* CSS i denne fila vil gjelde alle som nyttar drakta Modern */',
'print.css' => '/* CSS i denne fila vil påverke utskriftsversjonen */',
-'handheld.css' => '/* CSS i denne fila vil gjelde alle handheldte innretnigar konfigurert i $wgHandheldStyle */',
# Scripts
'common.js' => '/* Javascript i denne fila vil gjelde for alle drakter. */',
-'standard.js' => '/* Javascript i denne fila vil gjelde for brukarar av drakta Standard */',
-'nostalgia.js' => '/* Javascript i denne fila vil gjelde for brukarar av drakta Nostalgia */',
'cologneblue.js' => '/* Javascript i denne fila vil gjelde for brukarar av drakta Kølnerblå */',
'monobook.js' => '/* Javascript i denne fila vil gjelde for brukarar av drakta Monobook */',
-'myskin.js' => '* Javascript i denne fila vil gjelde for brukarar av drakta MySkin */',
-'chick.js' => '* Javascript i denne fila vil gjelde for brukarar av drakta Chick */',
-'simple.js' => '* Javascript i denne fila vil gjelde for brukarar av drakta Simple */',
'modern.js' => '* Javascript i denne fila vil gjelde for brukarar av drakta Modern */',
# Metadata
@@ -3085,13 +3108,8 @@ Vitja [//www.mediawiki.org/wiki/Localisation MediaWiki Localisation] og [//trans
'pageinfo-category-files' => 'Tal filer',
# Skin names
-'skinname-standard' => 'Klassisk',
-'skinname-nostalgia' => 'Nostalgi',
'skinname-cologneblue' => 'Kölnerblå',
'skinname-monobook' => 'MonoBook',
-'skinname-myskin' => 'MiDrakt',
-'skinname-chick' => 'Chick',
-'skinname-simple' => 'Enkel',
'skinname-modern' => 'Moderne',
# Patrolling
@@ -3168,11 +3186,25 @@ $1',
'minutes' => '{{PLURAL:$1|$1 minutt|$1 minutt}}',
'hours' => '{{PLURAL:$1|$1 time|$1 timar}}',
'days' => '{{PLURAL:$1|$1 dag|$1 dagar}}',
+'weeks' => '{{PLURAL:$1|$1 veke|$1 veker}}',
'months' => '{{PLURAL:$1|éin månad|$1 månader}}',
'years' => '{{PLURAL:$1|éitt år|$1 år}}',
'ago' => '$1 sidan',
'just-now' => 'akkurat no',
+# Human-readable timestamps
+'hours-ago' => '$1 {{PLURAL:$1|time|timar}} sidan',
+'minutes-ago' => '$1 {{PLURAL:$1|minutt}} sidan',
+'seconds-ago' => '$1 {{PLURAL:$1|sekund}} sidan',
+'monday-at' => 'MÃ¥ndag kl. $1',
+'tuesday-at' => 'Tysdag kl. $1',
+'wednesday-at' => 'Onsdag kl. $1',
+'thursday-at' => 'Torsdag kl. $1',
+'friday-at' => 'Fredag kl. $1',
+'saturday-at' => 'Laurdag kl. $1',
+'sunday-at' => 'Sundag kl. $1',
+'yesterday-at' => 'I går kl. $1',
+
# Bad image list
'bad_image_list' => 'Formatet er slik:
@@ -3202,7 +3234,7 @@ Andre er gøymde som standard.
* gpslongitude
* gpsaltitude',
-# EXIF tags
+# Exif tags
'exif-imagewidth' => 'Breidd',
'exif-imagelength' => 'Høgd',
'exif-bitspersample' => 'Bitar per komponent',
@@ -3380,7 +3412,7 @@ Andre er gøymde som standard.
'exif-originalimageheight' => 'Høgda på biletet før det vart beskåren',
'exif-originalimagewidth' => 'Bredda på biletet før det vart beskåren',
-# EXIF attributes
+# Exif attributes
'exif-compression-1' => 'Ukomprimert',
'exif-compression-2' => 'CCITT Gruppe 3 1-dimensjonal modifisert Huffman-kjøyrelengdekoding',
'exif-compression-3' => 'CCITT Gruppe 3 faks-koding',
@@ -3767,7 +3799,6 @@ Du kan òg [[Special:EditWatchlist|nytte standardverktøyet]].',
'version-other' => 'Anna',
'version-mediahandlers' => 'Mediahandsamarar',
'version-hooks' => 'Tilleggsuttrykk',
-'version-extension-functions' => 'Utvidingsfunksjonar',
'version-parser-extensiontags' => 'Parserutvidingsmerke',
'version-parser-function-hooks' => 'Parserfunksjonstillegg',
'version-hook-name' => 'Namn på tillegg',
@@ -3776,6 +3807,7 @@ Du kan òg [[Special:EditWatchlist|nytte standardverktøyet]].',
'version-license' => 'Lisens',
'version-poweredby-credits' => "Denne wikien er driven av '''[//www.mediawiki.org/ MediaWiki]''', copyright © 2001-$1 $2.",
'version-poweredby-others' => 'andre',
+'version-poweredby-translators' => 'translatewiki.net-omsetjarar',
'version-credits-summary' => 'Me ynskjer godskriva desse personane for tilskotet deira til [[Special:Version|MediaWiki]].',
'version-license-info' => 'MediaWiki er fri programvare; du kan redistribuera det og/eller modifisera det under krava i GNU General Public License som publisert av Free Software Foundation; anten versjon 2 av lisensen, eller (om du ynskjer det) ein kvar seinare versjon.
@@ -3789,12 +3821,17 @@ Du skal ha motteke [{{SERVER}}{{SCRIPTPATH}}/COPYING ein kopi av GNU General Pub
'version-entrypoints-header-entrypoint' => 'Inngangspunkt',
'version-entrypoints-header-url' => 'URL',
-# Special:FilePath
-'filepath' => 'Filsti',
-'filepath-page' => 'Fil:',
-'filepath-submit' => 'GÃ¥',
-'filepath-summary' => 'Denne spesialsida svarar med den fullstendige stigen til ei fil.
-Bilete vert viste i full oppløysing, andre filtypar vert starta direkte i dei tilknytte programma sine.',
+# Special:Redirect
+'redirect' => 'Omdiriger etter filnamn, brukar- eller versjons-ID',
+'redirect-legend' => 'Omdiriger til ei fil eller ei side',
+'redirect-summary' => 'Denne spesialsida omdirigerer til ei fil (med eit filnamn), ei side (med ein versjons-ID) eller ei brukarside (med eit brukartal).',
+'redirect-submit' => 'GÃ¥',
+'redirect-lookup' => 'Sjå etter:',
+'redirect-value' => 'Verdi',
+'redirect-user' => 'Brukar-ID',
+'redirect-revision' => 'Sideversjon',
+'redirect-file' => 'Filnamn',
+'redirect-not-exists' => 'Fann ikkje verdi',
# Special:FileDuplicateSearch
'fileduplicatesearch' => 'Søk etter duplikatfiler',
@@ -3843,12 +3880,16 @@ Bilete vert viste i full oppløysing, andre filtypar vert starta direkte i dei t
'tags' => 'Gyldige endringsmerke',
'tag-filter' => '[[Special:Tags|Merke]]filter:',
'tag-filter-submit' => 'Filtrer',
+'tag-list-wrapper' => '([[Special:Tags|{{PLURAL:$1|Merke}}]]: $2)',
'tags-title' => 'Merke',
'tags-intro' => 'Denne sida listar opp merka som programvara kan merkja ei endring med, og kva desse tyder.',
'tags-tag' => 'Merkenamn',
'tags-display-header' => 'Utsjånad på endringslister',
'tags-description-header' => 'Tyding',
+'tags-active-header' => 'Verksamt?',
'tags-hitcount-header' => 'Merkte endringar',
+'tags-active-yes' => 'Ja',
+'tags-active-no' => 'Nei',
'tags-edit' => 'endra',
'tags-hitcount' => '{{PLURAL:$1|éi endring|$1 endringar}}',
@@ -3884,6 +3925,9 @@ Bilete vert viste i full oppløysing, andre filtypar vert starta direkte i dei t
'htmlform-submit' => 'Lagre',
'htmlform-reset' => 'Gjer om endringar',
'htmlform-selectorother-other' => 'Andre',
+'htmlform-no' => 'Nei',
+'htmlform-yes' => 'Ja',
+'htmlform-chosen-placeholder' => 'Vel ein',
# SQLite database support
'sqlite-has-fts' => '$1 med støtte for fulltekstsøk',
@@ -4001,4 +4045,16 @@ Om ikkje kan du nytta det enkle skjemaet under. Merknaden din vert lagd til på
# Image rotation
'rotate-comment' => 'Biletet vart dreitt $1{{PLURAL:$1|°}} med klokka',
+# Limit report
+'limitreport-title' => 'Profildata for analysatoren:',
+'limitreport-cputime' => 'CPU-tidsbruk',
+'limitreport-cputime-value' => '{{PLURAL:$1|eitt sekund|$1 sekund}}',
+'limitreport-walltime-value' => '{{PLURAL:$1|eitt sekund|$1 sekund}}',
+'limitreport-ppvisitednodes' => 'Tal på knutepunktsvitjingar av førhandsamar',
+'limitreport-postexpandincludesize-value' => '$1/$2 byte',
+'limitreport-templateargumentsize' => 'Storleik på malargument',
+'limitreport-templateargumentsize-value' => '$1/$2 byte',
+'limitreport-expansiondepth' => 'Største utvidingsdjupna',
+'limitreport-expensivefunctioncount' => 'Tal på dyre analysefunksjonar',
+
);
diff --git a/languages/messages/MessagesNov.php b/languages/messages/MessagesNov.php
index b00d31cf..bfee3ab4 100644
--- a/languages/messages/MessagesNov.php
+++ b/languages/messages/MessagesNov.php
@@ -429,7 +429,7 @@ Si vu voli plu tardim ekarta li pagine fro vun observa-liste, klikta \"Desobserv
'ilsubmit' => 'Sercha',
'bydate' => 'segun date',
-# EXIF tags
+# Exif tags
'exif-imagewidth' => 'Larjeso',
'exif-imagelength' => 'Alteso',
'exif-imagedescription' => 'Title de imaje',
diff --git a/languages/messages/MessagesNso.php b/languages/messages/MessagesNso.php
index eed1ac13..99cea760 100644
--- a/languages/messages/MessagesNso.php
+++ b/languages/messages/MessagesNso.php
@@ -66,7 +66,6 @@ $messages = array(
'tog-enotifrevealaddr' => 'Bonagatša email atrese go temošo tša poso',
'tog-shownumberswatching' => 'Laetša palo bašomiši bao ba tlhapetšego',
'tog-fancysig' => 'Tsaeno ya gose fihliwe',
-'tog-externaleditor' => 'Šomiša sengwadi sa kantle (bašumiši bao banalego botsibi fela. [//www.mediawiki.org/wiki/Manual:External_editors More information.])',
'tog-forceeditsummary' => 'Ntaetše ge kesa tsenye mongwalo go kakaretšo ya dithetogo',
'tog-watchlisthideown' => 'Fihla diphetogo tšeo di direlego ke nna go lenano la ditlhapetšo.',
'tog-watchlisthideminor' => 'Fihla diphetogo tše nyenyane tšeo di direlego ke nna go lenano la ditlhapetšo',
@@ -226,7 +225,7 @@ $messages = array(
'jumptosearch' => 'fetleka',
'pool-errorunknown' => 'Phošo yago setsebege',
-# 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).
+# 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).
'aboutsite' => 'Mabapi le {{SITENAME}}',
'aboutpage' => 'Project:Mabapi',
'copyright' => 'Mateng a hwetšagala tlase ga $1.',
@@ -236,7 +235,6 @@ $messages = array(
'disclaimers' => 'Hlapa-matsogo',
'disclaimerpage' => 'Project:Hlapa-Matsogo',
'edithelp' => 'Thušo ya go fetola',
-'edithelppage' => 'Help:Fetola',
'helppage' => 'Help:Mateng',
'mainpage' => 'Letlakala la Pele',
'mainpage-description' => 'Letlakala la Pele',
@@ -385,7 +383,7 @@ Ga wa dumelwa go tlhoma tše dingwe.',
'oldpassword' => 'Ditlhaka-tša-siphiri tša kgale:',
'newpassword' => 'Ditlhaka-tša-siphiri tše mpsha:',
'retypenew' => 'Tlanya ditlhaka tše mphsa tša siphiri gape:',
-'resetpass_success' => 'Ditlhaka tša siphiri di fetotšwe ka katlego! Bjale o kgona go tsena...',
+'changepassword-success' => 'Ditlhaka tša siphiri di fetotšwe ka katlego! Bjale o kgona go tsena...',
# Edit page toolbar
'bold_sample' => "Mongwalo wa '''Bold'''",
@@ -563,7 +561,6 @@ fetola tshenolo',
'viewprevnext' => 'Lebelela ($1 {{int:pipe-separator}} $2) ($3)',
'searchmenu-exists' => "'''Go ena le letlaka la leina la \"[[:\$1]]\" go wiki ye.'''",
'searchmenu-new' => "'''Hlola letlakala \"[[:\$1]]\" go wiki ye!'''",
-'searchhelp-url' => 'Help:Mateng',
'searchprofile-articles' => 'Matlakala a diteng',
'searchprofile-project' => 'Thušo le matlaka a diprojeke',
'searchprofile-images' => 'Diphatlalatši tša "multi"',
@@ -692,7 +689,6 @@ Ga re fane ka e-poso ya gago go bašumiši ba bangwe ge ba polela le wena ka yon
'recentchangeslinked-feed' => 'Diphetogo tša go tswalana',
'recentchangeslinked-toolbox' => 'Diphetogo tša go tswalana',
'recentchangeslinked-title' => 'Diphetogo tša go tswalana le "$1"',
-'recentchangeslinked-noresult' => 'Gago na diphetogo go matlakala a hlomaganya ka sebaka/sekga seo o se kgethilego.',
'recentchangeslinked-summary' => "Letlakala le le laetša diphetogo tša bjale matlakaleng a go hlomaganya.
Matlakala ago ba [[Special:Watchlist|lenanong la gago la matlakala ditlhapetšo]] a '''ngwadilwe ka bogolo'''.",
'recentchangeslinked-page' => 'Leina la letlakala:',
@@ -780,9 +776,6 @@ Matlakala ago ba [[Special:Watchlist|lenanong la gago la matlakala ditlhapetšo]
'statistics' => 'Dipalopalo',
'statistics-header-users' => 'Dipalopalo tša mošomiši',
-'disambiguations' => "Matlakala a ''Disambiguation''",
-'disambiguationspage' => 'Template:"disambig"',
-
'doubleredirects' => "Di''redirect'' goya go ''redirect''",
'brokenredirects' => "''redirect'' tša go robega",
@@ -1035,7 +1028,6 @@ Seemo sa go lota ga letlakala '''$1''':",
'unblocklogentry' => 'Gago thibelo $1',
'block-log-flags-nocreate' => 'Go hloma tšhupaleloko gago dumelege',
'block-log-flags-noemail' => 'e-mail e thibilwe',
-'proxyblocksuccess' => 'Phetilwe.',
# Move page
'move-page-legend' => 'Huduša letlakala',
@@ -1209,7 +1201,7 @@ letlakala la seswantšho ge tafola ya metadata e bulwa. Tše dingwe tša di ''fi
* gpslongitude
* gpsaltitude",
-# EXIF tags
+# Exif tags
'exif-imagewidth' => 'Bophara',
'exif-imagelength' => 'Botelele',
'exif-artist' => 'Mongwadi',
diff --git a/languages/messages/MessagesNv.php b/languages/messages/MessagesNv.php
index 0c3f0405..5a17c910 100644
--- a/languages/messages/MessagesNv.php
+++ b/languages/messages/MessagesNv.php
@@ -279,7 +279,7 @@ $3',
# Special:LinkSearch
'linksearch' => 'linksígíí tłʼóoʼdi siʼánígíí',
-# Email user
+# E-mail user
'emailuser' => 'E-mail bichʼįʼ áshłééh nisin',
# Watchlist
diff --git a/languages/messages/MessagesNy.php b/languages/messages/MessagesNy.php
index 866851c6..7f1793e3 100644
--- a/languages/messages/MessagesNy.php
+++ b/languages/messages/MessagesNy.php
@@ -11,16 +11,16 @@
*/
$messages = array(
-'help' => 'Chithandizo',
-'search' => 'Fufuzani',
-'searchbutton' => 'Fufuzani',
+'help' => 'Chithandizo',
+'search' => 'Fufuzani',
+'searchbutton' => 'Fufuzani',
'searcharticle' => 'Pitani',
-'toolbox' => 'zida',
+'toolbox' => 'zida',
# 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' => 'Tsamba Lalikulu',
+'mainpage' => 'Tsamba Lalikulu',
'mainpage-description' => 'Tsamba Lalikulu',
-'portal' => 'Tsamba la anthu wonse',
+'portal' => 'Tsamba la anthu wonse',
'youhavenewmessagesmulti' => 'Muli ndi mauthenga atsopano ku $1',
diff --git a/languages/messages/MessagesOc.php b/languages/messages/MessagesOc.php
index 6cdef6c4..34503b09 100644
--- a/languages/messages/MessagesOc.php
+++ b/languages/messages/MessagesOc.php
@@ -14,6 +14,7 @@
* @author Jfblanc
* @author Kaganer
* @author McDutchie
+ * @author Nemo bis
* @author Spacebirdy
* @author Горан Ðнђелковић
* @author לערי ריינה×רט
@@ -321,9 +322,6 @@ $messages = array(
'tog-shownumberswatching' => "Afichar lo nombre d'utilizaires que seguisson aquesta pagina",
'tog-oldsig' => 'Apercebut de la signatura existenta :',
'tog-fancysig' => 'Tractar la signatura coma de wikitèxte (sens ligam automatic)',
-'tog-externaleditor' => 'Utilizar un editor extèrne per defaut (pels utilizaires avançats, necessita una configuracion especiala sus vòstre ordinator)',
-'tog-externaldiff' => "Utilizar un comparador extèrne per defaut (pels utilizaires avançats, necessita una configuracion especiala sus vòstre ordenador, [//www.mediawiki.org/wiki/Manual:External_editors/fr mai d'informacions]).",
-'tog-showjumplinks' => 'Activar los ligams « navigacion » e « recèrca » en naut de pagina (aparéncias Myskin e autres)',
'tog-uselivepreview' => 'Utilizar l’apercebut rapid (experimental)',
'tog-forceeditsummary' => "M'avertir quand ai pas completat lo contengut de la bóstia de comentaris",
'tog-watchlisthideown' => 'Amagar mas pròprias modificacions dins la lista de seguiment',
@@ -337,6 +335,8 @@ $messages = array(
'tog-showhiddencats' => 'Afichar las categorias amagadas',
'tog-noconvertlink' => 'Desactivar la conversion dels títols',
'tog-norollbackdiff' => 'Ometre lo diff aprèp l’utilizacion d’un revert',
+'tog-useeditwarning' => 'M’avisar quand quiti una pagina de modificacion sens publicar los cambiaments',
+'tog-prefershttps' => 'Utilizar totjorn una connexion securizada en essent connectat',
'underline-always' => 'Totjorn',
'underline-never' => 'Pas jamai',
@@ -400,6 +400,18 @@ $messages = array(
'oct' => "d'oct",
'nov' => 'de nov',
'dec' => 'de dec',
+'january-date' => '$1 genièr',
+'february-date' => '$1 febrièr',
+'march-date' => '$1 març',
+'april-date' => '$1 abril',
+'may-date' => '$1 mai',
+'june-date' => '$1 junh',
+'july-date' => '$1 julhet',
+'august-date' => '$1 agost',
+'september-date' => '$1 setembre',
+'october-date' => '$1 octobre',
+'november-date' => '$1 novembre',
+'december-date' => '$1 decembre',
# Categories related messages
'pagecategories' => '{{PLURAL:$1|Categoria|Categorias}}',
@@ -481,6 +493,7 @@ $messages = array(
'create-this-page' => 'Crear aquesta pagina',
'delete' => 'Suprimir',
'deletethispage' => 'Suprimir aquesta pagina',
+'undeletethispage' => "Anullar la supression d'aquesta pagina",
'undelete_short' => 'Restablir {{PLURAL:$1|1 modificacion| $1 modificacions}}',
'viewdeleted_short' => 'Veire {{PLURAL:$1|una edicion escafada|$1 edicions escafadas}}',
'protect' => 'Protegir',
@@ -524,7 +537,7 @@ $1",
'pool-queuefull' => 'La fila de trabalh es plena',
'pool-errorunknown' => 'Error desconeguda',
-# 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).
+# 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).
'aboutsite' => 'A prepaus de {{SITENAME}}',
'aboutpage' => 'Project:A prepaus',
'copyright' => 'Lo contengut es disponible segon los tèrmes de la licéncia $1.',
@@ -534,7 +547,6 @@ $1",
'disclaimers' => 'Avertiments',
'disclaimerpage' => 'Project:Avertiments generals',
'edithelp' => 'Ajuda',
-'edithelppage' => 'Help:Cossí modificar una pagina',
'helppage' => 'Help:Acuèlh',
'mainpage' => 'Acuèlh',
'mainpage-description' => 'Acuèlh',
@@ -611,17 +623,9 @@ Una lista de las paginas especialas pòt èsser trobada sus [[Special:SpecialPag
# General errors
'error' => 'Error',
'databaseerror' => 'Error de la banca de donadas',
-'dberrortext' => "Una error de sintaxi de la requèsta dins la banca de donadas s'es producha.
-Aquò pòt indicar una error dins lo logicial.
-La darrièra requèsta tractada per la banca de donadas èra :
-<blockquote><tt>$1</tt></blockquote>
-dempuèi la foncion « <tt>$2</tt> ».
-La banca de donadas a renviat l’error « <tt>$3 : $4</tt> ».",
-'dberrortextcl' => 'Una requèsta dins la banca de donadas compòrta una error de sintaxi.
-La darrièra requèsta emesa èra :
-« $1 »
-dins la foncion « $2 ».
-La banca de donadas a renviat l’error « $3 : $4 ».',
+'databaseerror-query' => 'Requèsta : $1',
+'databaseerror-function' => 'Foncion : $1',
+'databaseerror-error' => 'Error : $1',
'laggedslavemode' => 'Atencion : Aquesta pagina pòt conténer pas totes los darrièrs cambiaments efectuats.',
'readonly' => 'Mesas a jorn blocadas sus la banca de donadas',
'enterlockreason' => 'Indicatz la rason del blocatge, e mai una estimacion de sa durada',
@@ -655,6 +659,7 @@ Benlèu la supression ja es estada efectuada per qualqu’un mai.',
'cannotdelete-title' => 'Impossible de suprimir la pagina "$1"',
'delete-hook-aborted' => "Supression anullada per una extension.
Cap d'explicacion es pas estada provesida.",
+'no-null-revision' => 'Impossible de crear una novèla revision voida per la pagina « $1 »',
'badtitle' => 'Títol marrit',
'badtitletext' => 'Lo títol de la pagina demandada es invalid, void o s’agís d’un títol interlenga o interprojècte mal ligat. Benlèu conten un o maites caractèrs que pòdon pas èsser utilizats dins los títols.',
'perfcached' => "Las donadas seguendas son en escondedor e benlèu, son pas a jorn. Un maximum de {{PLURAL:$1|un resultat|$1 resultats}} es disponible dins l'escondedor.",
@@ -673,12 +678,15 @@ Requèsta : $2',
'protectedinterface' => 'Aquesta pagina provesís de tèxte d’interfàcia pel logicial susaqueste wiki, e es protegida per evitar los abuses.
Per apondre o modificar de traduccions sus totes los wikis, utilizatz [//translatewiki.net/ translatewiki.net], lo projècte de localizacion de MediaWiki.',
'editinginterface' => "'''Atencion :''' sètz a mand de modificar una pagina utilizada per crear lo tèxte de l’interfàcia del logicial. Los cambiaments sus aquesta pagina se repercutaràn sus l'aparéncia de l'interfàcia d'utilizaire pels autres utilizaires d'aqueste wiki. Per apondre o modificar de traduccions per totes los wikis, utilizatz [//translatewiki.net/translatewiki.net], lo projècte MediaWiki d'internacionalizacion dels messatges .",
-'sqlhidden' => '(Requèsta SQL amagada)',
'cascadeprotected' => "Aquesta pagina es actualament protegida perque es inclusa dins {{PLURAL:$1|la pagina seguenta|las paginas seguentas}}, {{PLURAL:$1|qu'es estada protegida|que son estadas protegidas}} amb l’opcion « proteccion en cascada » activada :
$2",
'namespaceprotected' => "Avètz pas la permission de modificar las paginas de l’espaci de noms « '''$1''' ».",
'customcssprotected' => "Avètz pas la permission d'editar aquesta pagina CSS perque conten de preferéncias d’autres utilizaires.",
'customjsprotected' => "Avètz pas la permission d'editar aquesta pagina JavaScript perque conten de preferéncias d’autres utilizaires.",
+'mycustomcssprotected' => 'Avètz pas lo drech de modificar aquesta pagina CSS.',
+'mycustomjsprotected' => 'Avètz pas lo drech de modificar aquesta pagina JavaScript.',
+'myprivateinfoprotected' => 'Avètz pas los dreches per modificar vòstras informacions personalas.',
+'mypreferencesprotected' => 'Avètz pas los dreches per modificar vòstras preferéncias.',
'ns-specialprotected' => 'Las paginas dins l’espaci de noms « {{ns:special}} » pòdon pas èsser modificadas',
'titleprotected' => "Aqueste títol es estat protegit a la creacion per [[User:$1|$1]].
Lo motiu avançat es « ''$2'' ».",
@@ -703,10 +711,19 @@ Notatz que d'unas paginas pòdon èsser encara afichadas coma s'eratz encara con
'welcomecreation-msg' => "Vòstre compte d'utilizaire es estat creat.
Doblidetz pas de modificar [[Special:Preferences|vòstras preferéncias per {{SITENAME}}]].",
'yourname' => "Nom d'utilizaire :",
+'userlogin-yourname' => "Nom d'utilizaire",
+'userlogin-yourname-ph' => "Picatz vòstre nom d'utilizaire",
+'createacct-another-username-ph' => "Picar lo nom d'utilizaire",
'yourpassword' => 'Vòstre senhal :',
+'userlogin-yourpassword' => 'Senhal',
+'userlogin-yourpassword-ph' => 'Picatz vòstre senhal',
+'createacct-yourpassword-ph' => 'Picatz un senhal',
'yourpasswordagain' => 'Confirmar lo senhal :',
+'createacct-yourpasswordagain' => 'Confirmatz lo senhal',
+'createacct-yourpasswordagain-ph' => 'Entratz lo senhal tornarmai',
'remembermypassword' => 'Me reconnectar automaticament a las visitas venentas (al maximum $1 {{PLURAL:$1|jorn|jorns}})',
-'securelogin-stick-https' => 'Demorar connectat en HTTPS aprèp la connexion',
+'userlogin-remembermypassword' => 'Gardar ma sesilha activa',
+'userlogin-signwithsecure' => 'Utilizar una connexion securizada',
'yourdomainname' => 'Vòstre domeni',
'password-change-forbidden' => 'Podètz pas modificar los senhals sus aqueste wiki.',
'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.',
@@ -718,18 +735,41 @@ Doblidetz pas de modificar [[Special:Preferences|vòstras preferéncias per {{SI
'logout' => 'Se desconnectar',
'userlogout' => 'Desconnexion',
'notloggedin' => 'Vos sètz pas identificat(ada)',
+'userlogin-noaccount' => 'Avètz pas de compte ?',
+'userlogin-joinproject' => 'Rejonhètz {{SITENAME}}',
'nologin' => "Avètz pas un compte ? '''$1'''.",
'nologinlink' => 'Creatz un compte',
'createaccount' => 'Crear un compte novèl',
'gotaccount' => "Ja avètz un compte ? '''$1'''.",
'gotaccountlink' => 'Identificatz-vos',
'userlogin-resetlink' => 'Avètz doblidat vòstres detalhs de connexion ?',
+'userlogin-resetpassword-link' => 'Reïnicializar lo senhal',
+'helplogin-url' => 'Help:Connexion',
+'userlogin-helplink' => '[[{{MediaWiki:helplogin-url}}|Ajuda a la connexion]]',
+'createacct-join' => 'Entratz vòstras informacions çaijós.',
+'createacct-another-join' => 'Picar las informacions del novèl compte çaijós.',
+'createacct-emailrequired' => 'Adreça electronica',
+'createacct-emailoptional' => 'Adreça de corrièr electronic (facultativa)',
+'createacct-email-ph' => 'Entratz vòstra adreça de corrièr electronic',
+'createacct-another-email-ph' => "Picar l'adreça de corrièr electronic",
'createaccountmail' => 'Utilizar un senhal aleatòri temporari e lo mandar a l’adreça de corrièl especificada',
+'createacct-realname' => 'Nom vertadièr (facultatiu)',
'createaccountreason' => 'Motiu :',
+'createacct-reason' => 'Motiu',
+'createacct-reason-ph' => 'Perqué creatz un autre compte',
+'createacct-captcha' => 'Contraròtle de seguretat',
+'createacct-imgcaptcha-ph' => 'Entratz lo tèxte que vesètz çaisús',
+'createacct-submit' => 'Creatz vòstre compte',
+'createacct-another-submit' => 'Crear un autre compte',
+'createacct-benefit-heading' => '{{SITENAME}} es escrich per de monde coma vos.',
+'createacct-benefit-body1' => '{{PLURAL:$1|cambiament|cambiaments}}',
+'createacct-benefit-body2' => '{{PLURAL:$1|pagina|paginas}}',
+'createacct-benefit-body3' => '{{PLURAL:$1|contributor recent|contributors recents}}',
'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.",
'loginerror' => "Error d'identificacion",
+'createacct-error' => 'Error al moment de la creacion del compte',
'createaccounterror' => 'Impossible de crear lo compte : $1',
'nocookiesnew' => "Lo compte d'utilizaire es estat creat, mas sètz pas connectat. {{SITENAME}} utiliza de cookies per la connexion mas los avètz desactivats. Activatz-los e reconnectatz-vos amb lo meteis nom e lo meteis senhal.",
'nocookieslogin' => '{{SITENAME}} utiliza de cookies per la connexion mas avètz los cookies desactivats. Activatz-los e reconnectatz-vos.',
@@ -786,11 +826,13 @@ Picatz una adreça plan formatada o daissatz aqueste camp void.",
Ignoratz aqueste messatge se aqueste compte es estat creat per error.",
'usernamehasherror' => "Lo nom d'utilizaire pòt pas conténer de caractèrs de hachage",
-'login-throttled' => 'Avètz ensajat tròp de temptativas de connexion darrièrament.
-Esperatz abans d’ensajar tornamai.',
+'login-throttled' => 'Avètz ensajat un tròp grand nombre de connexions darrièrament.
+Esperatz $1 abans d’ensajar tornarmai.',
'login-abort-generic' => 'Vòstra temptativa de connexion a fracassat',
'loginlanguagelabel' => 'Lenga: $1',
'suspicious-userlogout' => 'Vòstra demanda de desconnexion es estada refusada perque sembla qu’es estada mandada per un navigador copat o la mesa en escondedor d’un proxy.',
+'createacct-another-realname-tip' => 'Lo nom vertadièr es opcional.
+Se decidissètz de lo provesir, serà utilizat per atribuir a l’utilizaire sos trabalhs.',
# Email sending
'php-mail-error-unknown' => 'Error desconeguda dins la foncion mail() de PHP.',
@@ -806,8 +848,7 @@ Esperatz abans d’ensajar tornamai.',
'newpassword' => 'Senhal novèl :',
'retypenew' => 'Confirmar lo senhal novèl :',
'resetpass_submit' => 'Cambiar lo senhal e s’enregistrar',
-'resetpass_success' => 'Vòstre senhal es estat modificat corrèctament  !
-Ara, anatz èsser connectat…',
+'changepassword-success' => 'Vòstre senhal es estat cambiat amb succès !',
'resetpass_forbidden' => 'Los senhals pòdon pas èsser cambiats',
'resetpass-no-info' => 'Vos cal èsser connectat per aver accès a aquesta pagina.',
'resetpass-submit-loggedin' => 'Modificar lo senhal',
@@ -819,10 +860,11 @@ Benlèu ja avètz modificat vòstre senhal o demandat un senhal temporari novèl
# Special:PasswordReset
'passwordreset' => 'Remesa a zèro del senhal',
-'passwordreset-text' => 'Emplenatz aqueste formulari per reïnicializar vòstre senhal.',
+'passwordreset-text-one' => 'Emplenatz aqueste formulari per reïnicializar vòstre senhal.',
+'passwordreset-text-many' => "{{PLURAL:$1|Completatz un d'aqueles camps per reïnicializar vòstre senhal.}}",
'passwordreset-legend' => 'Reïnicializar lo senhal',
'passwordreset-disabled' => 'La reïnicializacion dels senhals es estada desactivada sus aqueste wiki.',
-'passwordreset-pretext' => '{{PLURAL:$1||Entratz un element de donadas çaijós}}',
+'passwordreset-emaildisabled' => 'Las foncionalitats e-mail son estadas desactivadas sus aqueste wiki.',
'passwordreset-username' => "Nom d'utilizaire :",
'passwordreset-domain' => 'Domeni:',
'passwordreset-capture' => 'Veire lo corrièl resultant ?',
@@ -843,7 +885,7 @@ $2
Senhal temporari: $2',
'passwordreset-emailsent' => 'Un corrièr electronic de reïnicializacion de senhal es estat mandat.',
'passwordreset-emailsent-capture' => "Un corrièr electronic de reïnicializacion senhal es estat mandat, qu'es afichat çaijós.",
-'passwordreset-emailerror-capture' => "Un corrièr electronic de reïnicializacion es estat generat, qu'es afichat çaijós, mas lo mandadís a l'utilizaire a fracassat : $1",
+'passwordreset-emailerror-capture' => "Un corrièr electronic de reïnicializacion de senhal es estat generat, qu'es afichat çaijós, mas lo mandadís a l'{{GENDER:$2|utilizaire}} a fracassat : $1",
# Special:ChangeEmail
'changeemail' => "Cambiar l'adreça electronica:",
@@ -857,6 +899,19 @@ Senhal temporari: $2',
'changeemail-submit' => "Cambiar l'adreça electronica:",
'changeemail-cancel' => 'Anullar',
+# Special:ResetTokens
+'resettokens' => 'Reïnicializar los getons',
+'resettokens-text' => "Aici, podètz reïnicializar los getons que permeton d’accedir a d'unas donadas privadas associadas a vòstre compte.
+
+Lo vos caldriá far se las avètz partejats accidentalament amb qualqu'un o se vòstre compte es estat compromés.",
+'resettokens-no-tokens' => 'I a pas cap de geton de reïnicializar.',
+'resettokens-legend' => 'Reïnicializar los getons',
+'resettokens-tokens' => 'Getons :',
+'resettokens-token-label' => '$1 (valor actuala : $2)',
+'resettokens-watchlist-token' => 'Geton pel flux (Atom/RSS) web de [[Special:Watchlist|modificacions de paginas de vòstra lista de seguiment]]',
+'resettokens-done' => 'Getons reïnicializats.',
+'resettokens-resetbutton' => 'Reïnicializar los getons seleccionats',
+
# Edit page toolbar
'bold_sample' => 'Tèxte en gras',
'bold_tip' => 'Tèxte en gras',
@@ -1043,12 +1098,14 @@ Cap d'explicacion pas balhada.",
Sembla que siá estada suprimida.',
'edit-conflict' => 'Modificar lo conflicte.',
'edit-no-change' => 'Vòstra modificacion es estada ignorada perque cap de cambiament es pas estat fach dins lo tèxte.',
+'postedit-confirmation' => 'Vòstra modificacion es estada salvada.',
'edit-already-exists' => 'La pagina novèla a pogut èsser creada .
Existís ja.',
'defaultmessagetext' => 'Messatge per defaut',
'content-failed-to-parse' => "Fracàs de l'analisi del contengut de $2 pel modèl $1: $3",
'invalid-content-data' => 'Donadas del contengut invalidas',
'content-not-allowed-here' => 'Lo contengut "$1" es pas autorizat sus la pagina [[$2]]',
+'editwarning-warning' => "Quitar aquesta pagina vos farà pèrdre totas las modificacions qu'avètz fachas. Se sètz connectat amb vòstre compte, podètz levar aqueste avertiment dins la seccion « Modificacion » de vòstras preferéncias.",
# Content models
'content-model-wikitext' => 'wikitèxte',
@@ -1082,6 +1139,7 @@ D'unas inclusions seràn pas efectuadas.",
'undo-failure' => 'Aquesta modificacion a pas pogut èsser desfacha a causa de conflictes amb de modificacions intermediàrias.',
'undo-norev' => 'La modificacion a pas pogut èsser desfacha perque siá es inexistenta siá es estada suprimida.',
'undo-summary' => 'Anullacion de las modificacions $1 de [[Special:Contributions/$2|$2]] ([[User talk:$2|discutir]] | [[Special:Contributions/$2|{{MediaWiki:Contribslink}}]])',
+'undo-summary-username-hidden' => 'Anullar la revision $1 per un utilizaire amagat',
# Account creation failure
'cantcreateaccounttitle' => 'Podètz pas crear de compte.',
@@ -1259,6 +1317,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-empty' => '(Pas cap de diferéncia)',
'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}})',
'diff-multi-manyusers' => '({{PLURAL:$1|Una revision intermediària amagada|$1 revisions intermediàrias amagadas}}) per ({{PLURAL:$2|un utilizaire pas afichada|$2 utilizaires pas afichadas}})',
'difference-missing-revision' => "{{PLURAL:$2|Una revision|$2 revisions}} d'aquesta diferéncia ($1) {{PLURAL:$2|es pas estada trobada|son pas estadas trobadas}}.
@@ -1286,7 +1345,6 @@ Podètz trobar de detalhs dins lo [{{fullurl:{{#Special:Log}}/delete|page={{FULL
'searchmenu-legend' => 'Opcions de recèrca',
'searchmenu-exists' => "* Pagina '''[[$1]]'''",
'searchmenu-new' => "'''Crear la pagina ''[[:$1|$1]]'' sus aqueste wiki !'''",
-'searchhelp-url' => 'Help:Acuèlh',
'searchmenu-prefix' => '[[Special:PrefixIndex/$1|Recercar las paginas amb aqueste prefix]]',
'searchprofile-articles' => 'Paginas de contengut',
'searchprofile-project' => "Paginas d'ajuda e del projècte",
@@ -1330,15 +1388,7 @@ Ensajatz en utilizant lo prefix ''all:'' per recercar tot lo contengut (tot incl
'searchdisabled' => 'La recèrca sus {{SITENAME}} es desactivada.
En esperant la reactivacion, podètz efectuar una recèrca via Google.
Atencion, lor indexacion de contengut {{SITENAME}} benlèu es pas a jorn.',
-
-# Quickbar
-'qbsettings' => "Barra d'aisinas",
-'qbsettings-none' => 'Pas cap',
-'qbsettings-fixedleft' => 'Esquèrra',
-'qbsettings-fixedright' => 'Drecha',
-'qbsettings-floatingleft' => 'Flotanta a esquèrra',
-'qbsettings-floatingright' => 'Flotanta a drecha',
-'qbsettings-directionality' => "Fixat, en foncion de la directivitat d'escritura de vòstra lenga",
+'search-error' => "Una error s'es producha en recercant : $1",
# Preferences page
'preferences' => 'Preferéncias',
@@ -1372,7 +1422,6 @@ Atencion, lor indexacion de contengut {{SITENAME}} benlèu es pas a jorn.',
'resetprefs' => 'Restablir las preferéncias',
'restoreprefs' => 'Restablir totes los paramètres per defaut (dins totas las seccions)',
'prefs-editing' => 'Fenèstra de modificacion',
-'prefs-edit-boxsize' => 'Talha de la fenèstra de modificacion.',
'rows' => 'Rengadas :',
'columns' => 'Colomnas :',
'searchresultshead' => 'Recèrca',
@@ -1383,9 +1432,6 @@ Atencion, lor indexacion de contengut {{SITENAME}} benlèu es pas a jorn.',
'recentchangesdays-max' => '(maximum $1 {{PLURAL:$1|jorn|jorns}})',
'recentchangescount' => "Nombre de modificacions d'afichar per defaut :",
'prefs-help-recentchangescount' => 'Aquò inclutz las modificacions recentas, las paginas d’istorics e los jornals.',
-'prefs-help-watchlist-token' => 'Emplenar aquò amb una valor secreta generarà un flux RSS per vòstra lista de seguiment.
-Tota persona que coneis aqueste geton poirà legir vòstra lista de seguiment, causissètz doncas una valor securizada.
-Vaquí una valor generada aleatòriament que podètz utilizar : $1',
'savedprefs' => 'Las preferéncias son estadas salvadas.',
'timezonelegend' => 'Fus orari :',
'localtime' => 'Ora locala :',
@@ -1415,7 +1461,6 @@ Vaquí una valor generada aleatòriament que podètz utilizar : $1',
'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',
'youremail' => 'Adreça de corrièr electronic :',
'username' => "{{GENDER:$1|Nom d'utilizaire|Nom d'utilizaira}}:",
'uid' => "Numèro d'{{GENDER:$1|utilizaire|utilizaira}}:",
@@ -1449,6 +1494,8 @@ Tanben podètz causir de permetre a d’autres de vos contactar per vòstra pagi
'prefs-dateformat' => 'Format de las datas',
'prefs-timeoffset' => 'Descalatge orari',
'prefs-advancedediting' => 'Opcions generalas',
+'prefs-editor' => 'Editor',
+'prefs-preview' => 'Apercebut',
'prefs-advancedrc' => 'Opcions avançadas',
'prefs-advancedrendering' => 'Opcions avançadas',
'prefs-advancedsearchoptions' => 'Opcions avançadas',
@@ -1456,6 +1503,7 @@ Tanben podètz causir de permetre a d’autres de vos contactar per vòstra pagi
'prefs-displayrc' => "Opcions d'afichatge",
'prefs-displaysearchoptions' => "Opcions d'afichatge",
'prefs-displaywatchlist' => "Opcions d'afichatge",
+'prefs-tokenwatchlist' => 'Geton',
'prefs-diffs' => 'Diferéncias',
# User preference: email validation using jQuery
@@ -1548,11 +1596,18 @@ Tanben podètz causir de permetre a d’autres de vos contactar per vòstra pagi
'right-proxyunbannable' => 'Èsser pas afectat pels blocatges automatics de servidors mandataris',
'right-unblockself' => 'Se desblocar se-meteis',
'right-protect' => 'Modificar los nivèls de proteccion e modificar las paginas protegidas en cascada',
-'right-editprotected' => 'Modificar las paginas protegidas (sens proteccion en cascada)',
+'right-editprotected' => 'Modificar las paginas protegidas amb « {{int:protect-level-sysop}} »',
+'right-editsemiprotected' => 'Modificar las paginas protegidas amb « {{int:protect-level-autoconfirmed}} »',
'right-editinterface' => "Modificar l'interfàcia d'utilizaire",
'right-editusercssjs' => "Modificar los fichièrs CSS e JS d'autres utilizaires",
'right-editusercss' => "Modificar los fichièrs CSS d'autres utilizaires",
'right-edituserjs' => "Modificar los fichièrs JS d'autres utilizaires",
+'right-editmyusercss' => 'Modificar vòstres pròpris fichièrs CSS utilizaire',
+'right-editmyuserjs' => 'Modificar vòstres pròpris fichièrs JavaScript utilizaire',
+'right-viewmywatchlist' => 'Afichar vòstra pròpria lista de seguiment',
+'right-viewmyprivateinfo' => 'Veire vòstras donadas personalas (exemple adreça, nom vertadièr)',
+'right-editmyprivateinfo' => 'Modificar vòstras donadas personalas (exemple adreça, nom vertadièr)',
+'right-editmyoptions' => 'Modificar vòstras preferéncias',
'right-rollback' => "Revocacion rapida del darrièr utilizaire qu'a modificat una pagina particulara",
'right-markbotedits' => 'Marcar los cambiaments revocats coma de cambiaments que son estats fachs per de robòts',
'right-noratelimit' => 'Pas afectat pels limits de taus',
@@ -1614,9 +1669,15 @@ Tanben podètz causir de permetre a d’autres de vos contactar per vòstra pagi
'action-userrights-interwiki' => 'modificar los dreches d’utilizaire e los sus d’autres wikis',
'action-siteadmin' => 'varrolhar o desvarrolhar la banca de donadas',
'action-sendemail' => 'mandar corrièrs electronics',
+'action-editmywatchlist' => 'modificar vòstra lista de seguiment',
+'action-viewmywatchlist' => 'afichar vòstra pròpria lista de seguiment',
+'action-viewmyprivateinfo' => 'veire vòstras informacions personalas',
+'action-editmyprivateinfo' => 'modificar vòstras informacions personalas',
# Recent changes
'nchanges' => '$1 {{PLURAL:$1|cambiament|cambiaments}}',
+'enhancedrc-since-last-visit' => '$1 {{PLURAL:$1|dempuèi la darrièra visita}}',
+'enhancedrc-history' => 'istoric',
'recentchanges' => 'Darrièrs cambiaments',
'recentchanges-legend' => 'Opcions dels darrièrs cambiaments',
'recentchanges-summary' => 'Vaquí sus aquesta pagina, los darrièrs cambiaments de {{SITENAME}}.',
@@ -1656,7 +1717,6 @@ Tanben podètz causir de permetre a d’autres de vos contactar per vòstra pagi
'recentchangeslinked-feed' => 'Seguit dels ligams',
'recentchangeslinked-toolbox' => 'Seguit dels ligams',
'recentchangeslinked-title' => 'Seguit dels ligams associats a "$1"',
-'recentchangeslinked-noresult' => 'Cap de cambiament sus las paginas ligadas pendent lo periòde causit.',
'recentchangeslinked-summary' => "Aquesta pagina especiala fa veire los darrièrs cambiaments sus las paginas que son ligadas. Las paginas de [[Special:Watchlist|vòstra lista de seguimznt]] son '''en gras'''.",
'recentchangeslinked-page' => 'Nom de la pagina :',
'recentchangeslinked-to' => 'Afichar los cambiaments cap a las paginas ligadas al luòc de la pagina donada',
@@ -1667,8 +1727,7 @@ Tanben podètz causir de permetre a d’autres de vos contactar per vòstra pagi
'reuploaddesc' => 'Anullar lo cargament e tornar al formulari.',
'upload-tryagain' => 'Mandar la descripcion del fichièr modificada',
'uploadnologin' => 'Vos sètz pas identificat(ada)',
-'uploadnologintext' => 'Vos cal èsser [[Special:UserLogin|connectat(ada)]]
-per copiar de fichièrs sul servidor.',
+'uploadnologintext' => 'Vos cal $1 per importar de fichièrs.',
'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',
@@ -1888,7 +1947,6 @@ Per una seguretat optimala, img_auth.php es desactivat.",
'http-read-error' => 'HTTP Error de lectura.',
'http-timed-out' => 'HTTP request timed out.',
'http-curl-error' => "Error al moment de la recuperacion de l'URL : $1",
-'http-host-unreachable' => "Impossible d'aténher l'URL",
'http-bad-status' => 'I a agut un problèma al moment de la requèsta HTTP : $1 $2',
# Some likely curl errors. More could be added from <http://curl.haxx.se/libcurl/c/libcurl-errors.html>
@@ -1916,6 +1974,10 @@ Per una seguretat optimala, img_auth.php es desactivat.",
'listfiles_size' => 'Talha (en octets)',
'listfiles_description' => 'Descripcion',
'listfiles_count' => 'Versions',
+'listfiles-show-all' => 'Inclure las ancianas versions dels imatges',
+'listfiles-latestversion' => 'Version actuala',
+'listfiles-latestversion-yes' => 'Ã’c',
+'listfiles-latestversion-no' => 'Non',
# File description page
'file-anchor-link' => 'Fichièr',
@@ -2005,6 +2067,13 @@ Doblidetz pas de verificar se i a pas d’autre ligam cap als modèls abans de l
'randompage' => "Una pagina a l'azard",
'randompage-nopages' => "I a pas cap de pagina dins {{PLURAL:$2|l'espaci de nom|los espacis de noms}} : $1.",
+# Random page in category
+'randomincategory' => "Pagina a l'azard dins la categoria",
+'randomincategory-invalidcategory' => '« $1 » es pas un nom de categoria valid.',
+'randomincategory-nopages' => 'I a pas cap de pagina dins [[:Category:$1]].',
+'randomincategory-selectcategory' => "Prene una pagina a l'azard dins la categoria : $1 $2.",
+'randomincategory-selectcategory-submit' => 'Anar',
+
# Random redirect
'randomredirect' => "Una pagina de redireccion a l'azard",
'randomredirect-nopages' => "I a pas cap de redireccion dins l'espaci de nom « $1 ».",
@@ -2029,16 +2098,12 @@ Doblidetz pas de verificar se i a pas d’autre ligam cap als modèls abans de l
'statistics-users-active-desc' => "Utilizaires qu'an fach al mens una accion durant {{PLURAL:$1|lo darrièr jorn|los $1 darrièrs jorns}}",
'statistics-mostpopular' => 'Paginas mai consultadas',
-'disambiguations' => "Paginas qu'an de ligams cap a de paginas d'omonimia",
-'disambiguationspage' => 'Template:Omonimia',
-'disambiguations-text' => "Las paginas seguentas compòrtan al mens un ligam cap a una '''pagina d’omonimia'''.
-Deurián puslèu puntar cap al bon article.<br />
-Una pagina es considerada coma una pagina d’omonimia s'utiliza un modèl qu'es ligat a partir de [[MediaWiki:Disambiguationspage]]",
-
'pageswithprop' => 'Paginas amb una proprietat de pagina',
'pageswithprop-legend' => 'Paginas amb una proprietat de pagina',
'pageswithprop-prop' => 'Nom de la proprietat :',
'pageswithprop-submit' => 'Anar',
+'pageswithprop-prophidden-long' => 'valor de proprietat de tèxte long amagada ($1)',
+'pageswithprop-prophidden-binary' => 'valor de proprietat binària amagada ($1)',
'doubleredirects' => 'Redireccions doblas',
'doubleredirectstext' => 'Vaquí una lista de las paginas que redirigisson cap a de paginas que son elas-meteissas de paginas de redireccion.
@@ -2094,6 +2159,7 @@ Las entradas <del>barradas</del> son estadas resolgudas.',
'mostrevisions' => 'Articles mai modificats',
'prefixindex' => 'Totas las paginas que començan per…',
'prefixindex-namespace' => 'Totas las paginas amb prefix (espaci de noms $1)',
+'prefixindex-strip' => 'Levar lo prefix dins la lista',
'shortpages' => 'Paginas brèvas',
'longpages' => 'Paginas longas',
'deadendpages' => "Paginas sul camin d'enlòc",
@@ -2285,10 +2351,9 @@ per modificar vòstra lista de seguiment.',
'unwatchthispage' => 'Arrestar de seguir',
'notanarticle' => "Pas cap d'article",
'notvisiblerev' => 'Version suprimida',
-'watchnochange' => 'Cap de las paginas que seguissètz son pas estadas modificadas pendent lo periòde afichat.',
'watchlist-details' => 'I a {{PLURAL:$1|pagina|paginas}} dins vòstra lista de seguiment, sens comptar las paginas de discussion.',
-'wlheader-enotif' => '* La notificacion per corrièr electronic es activada.',
-'wlheader-showupdated' => '* Las paginas que son estadas modificadas dempuèi vòstra darrièra visita son mostradas en <b>gras</b>',
+'wlheader-enotif' => 'La notificacion per corrièr electronic es activada.',
+'wlheader-showupdated' => "Las paginas que son estadas modificadas dempuèi vòstra darrièra visita son afichadas en '''gras'''.",
'watchmethod-recent' => 'verificacion dels darrièrs cambiaments de las paginas seguidas',
'watchmethod-list' => 'verificacion de las paginas seguidas per de modificacions recentas',
'watchlistcontains' => 'Vòstra lista de seguiment conten $1 {{PLURAL:$1|pagina|paginas}}.',
@@ -2680,11 +2745,8 @@ Consultatz la [[Special:BlockList|lista dels utilizaires blocats]] per veire los
'ipb_blocked_as_range' => "Error : L'adreça IP $1 es pas estada blocada dirèctament e doncas pòt pas èsser deblocada. Çaquelà, es estada blocada per la plaja $2 la quala pòt èsser deblocada.",
'ip_range_invalid' => 'Plaja IP incorrècta.',
'ip_range_toolarge' => 'Los blocatges de plajas mai grandas que /$1 son pas autorizadas.',
-'blockme' => 'Blocatz-me',
'proxyblocker' => 'Blocaire de mandatari (proxy)',
-'proxyblocker-disabled' => 'Aquesta foncion es desactivada.',
'proxyblockreason' => "Vòstra ip es estada blocada perque s’agís d’un proxy dobèrt. Mercé de contactar vòstre fornidor d’accès internet o vòstre supòrt tecnic e de l’informar d'aqueste problèma de seguretat.",
-'proxyblocksuccess' => 'Acabat.',
'sorbsreason' => 'Vòstra adreça IP es listada en tant que mandatari (proxy) dobèrt DNSBL per {{SITENAME}}.',
'sorbs_create_account_reason' => 'Vòstra adreça IP es listada en tant que mandatari (proxy) dobèrt DNSBL per {{SITENAME}}.
Podètz pas crear un compte',
@@ -2832,6 +2894,8 @@ Visitatz la [//www.mediawiki.org/wiki/Localisation Localizacion MediaWiki] e [//
'thumbnail-more' => 'Agrandir',
'filemissing' => 'Fichièr absent',
'thumbnail_error' => 'Error al moment de la creacion de la miniatura : $1',
+'thumbnail_error_remote' => "Messatge d'error de $1 :
+$2",
'djvu_page_error' => 'Pagina DjVu fòra limits',
'djvu_no_xml' => "Impossible d’obténer l'XML pel fichièr DjVu",
'thumbnail_invalid_params' => 'Paramètres de la miniatura invalids',
@@ -2969,27 +3033,16 @@ Salvatz-lo sus vòstre disc dur puèi importatz-lo aicí.",
# Stylesheets
'common.css' => '/** Lo CSS plaçat aicí serà aplicat a totas las aparéncias. */',
-'standard.css' => '/* Lo CSS plaçat aicí afectarà los utilizaires de l’abilhatge Estandard. */',
-'nostalgia.css' => '/* Lo CSS plaçat aicí afectarà los utilizaires de l’abilhatge Nostalgia. */',
'cologneblue.css' => '/* Lo CSS plaçat aicí afectarà los utilizaires de l’abilhatge Cologne Blue */',
'monobook.css' => '/* Lo CSS plaçat aicí afectarà los utilizaires del skin Monobook */',
-'myskin.css' => '/* Lo CSS plaçat aicí afectarà los utilizaires de l’abilhatge MySkin */',
-'chick.css' => '/* Lo CSS plaçat aicí afectarà los utilizaires de l’abilhatge Chick */',
-'simple.css' => '/* Lo CSS plaçat aicí afectarà los utilizaires de l’abilhatge Simple */',
'modern.css' => '/* Lo CSS plaçat aicí afectarà los utilizaires de l’abilhatge Modern */',
'vector.css' => '/* Lo CSS plaçat aicí afectarà los utilizaires de l’abilhatge Vector */',
'print.css' => '/* Lo CSS plaçat aicí afectarà las impressions */',
-'handheld.css' => '/* Lo CSS plaçat aicí afectarà los aparelhs mobils en foncion de l\'abilhatge configurat $wgHandheldStyle */',
# Scripts
'common.js' => '/* Tot JavaScript serà cargat amb cada pagina accedida per un utilizaire quin que siá. */',
-'standard.js' => '/* Tot JavaScript aicí serà cargat amb las paginas accedidas pels utilizaires de l’abilhatge Standard unicament. */',
-'nostalgia.js' => '/* Tot JavaScript aicí serà cargat amb las paginas accedidas pels utilizaires de l’abilhatge Nostalgia unicament. */',
'cologneblue.js' => '/* Tot JavaScript aicí serà cargat amb las paginas accedidas pels utilizaires de l’abilhatge Cologne Blue unicament. */',
'monobook.js' => '/* Tot JavaScript aicí serà cargat amb las paginas accedidas pels utilizaires de l’abilhatge MonoBook unicament. */',
-'myskin.js' => '/* Tot JavaScript aicí serà cargat amb las paginas accedidas pels utilizaires de l’abilhatge MySkin unicament. */',
-'chick.js' => '/* Tot JavaScript aicí serà cargat amb las paginas accedidas pels utilizaires de l’abilhatge Chick unicament. */',
-'simple.js' => '/* Tot JavaScript aicí serà cargat amb las paginas accedidas pels utilizaires de l’abilhatge Simple unicament. */',
'modern.js' => '/* Tot JavaScript aicí serà cargat amb las paginas accedidas pels utilizaires de l’abilhatge Modern unicament. */',
'vector.js' => '/* Tot JavaScript aicí serà cargat amb las paginas accedidas pels utilizaires de l’abilhatge Vector unicament. */',
@@ -3064,13 +3117,8 @@ Aquò es probablament causat per un ligam sus lista negra que punta cap a un sit
'pageinfo-category-files' => 'Nombre de fichièrs',
# Skin names
-'skinname-standard' => 'Estandard',
-'skinname-nostalgia' => 'Nostalgia',
'skinname-cologneblue' => 'Colonha Blau',
'skinname-monobook' => 'Monobook',
-'skinname-myskin' => 'Mon interfàcia',
-'skinname-chick' => 'Poleton',
-'skinname-simple' => 'Simple',
'skinname-modern' => 'Modèrne',
# Patrolling
@@ -3145,11 +3193,25 @@ Se l'executatz, vòstre sistèma pòt èsser compromés.",
'minutes' => '{{PLURAL:$1|$1 minuta|$1 minutas}}',
'hours' => '{{PLURAL:$1|$1 ora|$1 oras}}',
'days' => '{{PLURAL:$1|$1 jorn|$1 jorns}}',
+'weeks' => '{{PLURAL:$1|$1 setmana|$1 setmanas}}',
'months' => '{{PLURAL:$1|$1 mes|$1 meses}}',
'years' => '{{PLURAL:$1|$1 an|$1 ans}}',
'ago' => 'I a $1',
'just-now' => 'sulpic',
+# Human-readable timestamps
+'hours-ago' => 'i a $1 {{PLURAL:$1|ora|oras}}',
+'minutes-ago' => 'i a $1 {{PLURAL:$1|minuta|minutas}}',
+'seconds-ago' => 'i a $1 {{PLURAL:$1|segonda|segondas}}',
+'monday-at' => 'Diluns a $1',
+'tuesday-at' => 'Dimars a $1',
+'wednesday-at' => 'Dimècres a $1',
+'thursday-at' => 'Dijòus a $1',
+'friday-at' => 'Divendres a $1',
+'saturday-at' => 'Dissabte a $1',
+'sunday-at' => 'Dimenge a $1',
+'yesterday-at' => 'Ièr a $1',
+
# Bad image list
'bad_image_list' => "Lo format es lo seguent :
@@ -3182,7 +3244,7 @@ Los autres ligams sus la meteissa linha son considerats coma d'excepcions, per e
* gpslongitude
* gpsaltitude',
-# EXIF tags
+# Exif tags
'exif-imagewidth' => 'Largor',
'exif-imagelength' => 'Nautor',
'exif-bitspersample' => 'Bits per compausanta',
@@ -3360,7 +3422,7 @@ Los autres ligams sus la meteissa linha son considerats coma d'excepcions, per e
'exif-originalimageheight' => "Nautor de l'imatge abans d'èsser requadrada",
'exif-originalimagewidth' => "Largor de l'imatge abans d'èsser requadrada",
-# EXIF attributes
+# Exif attributes
'exif-compression-1' => 'Sens compression',
'exif-compression-2' => "CCITT Grop 3 Longor de l'encodatge Huffman modificat de dimension 1",
'exif-compression-3' => 'CCITT Grop 3 encodatge del fax',
@@ -3670,7 +3732,6 @@ Confirmatz que desiratz tornar crear aqueste article.",
# Separators for various lists, etc.
'colon-separator' => '&nbsp;:&#32;',
-'autocomment-prefix' => '-',
# Multipage image navigation
'imgmultipageprev' => '↠pagina precedenta',
@@ -3754,7 +3815,6 @@ Ensajatz la previsualizacion normala.',
'version-other' => 'Divèrs',
'version-mediahandlers' => 'Supòrts mèdia',
'version-hooks' => 'Croquets',
-'version-extension-functions' => 'Foncions de las extensions',
'version-parser-extensiontags' => 'Balisas suplementàrias del parser',
'version-parser-function-hooks' => 'Croquets de las foncions del parser',
'version-hook-name' => 'Nom del croquet',
@@ -3763,6 +3823,7 @@ Ensajatz la previsualizacion normala.',
'version-license' => 'Licéncia',
'version-poweredby-credits' => "Aqueste wiki fonciona gràcias a '''[//www.mediawiki.org/ MediaWiki]''', copyright © 2001-$1 $2.",
'version-poweredby-others' => 'autres',
+'version-poweredby-translators' => 'traductors de translatewiki.net',
'version-software' => 'Logicial installat',
'version-software-product' => 'Produch',
'version-software-version' => 'Version',
@@ -3770,12 +3831,16 @@ Ensajatz la previsualizacion normala.',
'version-entrypoints-header-entrypoint' => "Punt d'entrada",
'version-entrypoints-header-url' => 'URL',
-# Special:FilePath
-'filepath' => "Camin d'accès d'un fichièr",
-'filepath-page' => 'Fichièr :',
-'filepath-submit' => 'Validar',
-'filepath-summary' => "Aquesta pagina especiala retorna lo camin d'accès complet d’un fichièr.
-Los imatges son afichats en nauta resolucion, los fichièrs àudio e vidèo son cargats e aviats dirèctament amb lor programa associat.",
+# Special:Redirect
+'redirect' => 'Redirigit per fichièr, utilizaire, o ID de revision',
+'redirect-legend' => 'Redirigir cap a una pagina o un fichièr',
+'redirect-submit' => 'Validar',
+'redirect-lookup' => 'Recèrca :',
+'redirect-value' => 'Valor :',
+'redirect-user' => "ID de l'utilizaire",
+'redirect-revision' => 'Revision de la pagina',
+'redirect-file' => 'Nom del fichièr',
+'redirect-not-exists' => 'Valor pas trobada',
# Special:FileDuplicateSearch
'fileduplicatesearch' => 'Recèrca dels fichièrs en doble',
@@ -3825,6 +3890,7 @@ Los imatges son afichats en nauta resolucion, los fichièrs àudio e vidèo son
'tags' => 'Balisas de las modificacions validas',
'tag-filter' => 'Filtrar las [[Special:Tags|balisas]] :',
'tag-filter-submit' => 'Filtrar',
+'tag-list-wrapper' => '([[Special:Tags|{{PLURAL:$1|Balisa|Balisas}}]] : $2)',
'tags-title' => 'Balisas',
'tags-intro' => 'Aquesta pagina lista las balisas que lo logicial pòt utilizar per marcar una modificacion, e lor significacion.',
'tags-tag' => 'Nom de la balisa',
@@ -3866,6 +3932,9 @@ Los imatges son afichats en nauta resolucion, los fichièrs àudio e vidèo son
'htmlform-submit' => 'Sometre',
'htmlform-reset' => 'Desfar las modificacions',
'htmlform-selectorother-other' => 'Autre',
+'htmlform-no' => 'Non',
+'htmlform-yes' => 'Ã’c',
+'htmlform-chosen-placeholder' => 'Causir una opcion',
# SQLite database support
'sqlite-has-fts' => '$1 amb recèrca en tèxte integral suportada',
@@ -3961,4 +4030,19 @@ Los imatges son afichats en nauta resolucion, los fichièrs àudio e vidèo son
# Image rotation
'rotate-comment' => "Imatge pivotat de $1 {{PLURAL:$1|gras|grases}} dins lo sens de las agulhas d'una mòstra",
+# Limit report
+'limitreport-title' => 'Donadas d’optimizacion de l’analisador :',
+'limitreport-cputime' => 'Temps CPU d’utilizacion',
+'limitreport-cputime-value' => '$1 {{PLURAL:$1|segonda|segondas}}',
+'limitreport-walltime' => 'Temps real d’utilizacion',
+'limitreport-walltime-value' => '$1 {{PLURAL:$1|segonda|segondas}}',
+'limitreport-ppvisitednodes' => 'Nombre de nosèls de preprocessor visitats',
+'limitreport-ppgeneratednodes' => 'Nombre de nosèls de preprocessor generats',
+'limitreport-postexpandincludesize' => 'Talha d’inclusion aprèp espandiment',
+'limitreport-postexpandincludesize-value' => '$1/$2 octets',
+'limitreport-templateargumentsize' => 'Talha de l’argument del modèl',
+'limitreport-templateargumentsize-value' => '$1/$2 octets',
+'limitreport-expansiondepth' => 'Mai granda prigondor d’espandiment',
+'limitreport-expensivefunctioncount' => 'Nombre de foncions d’analisi costosas',
+
);
diff --git a/languages/messages/MessagesOr.php b/languages/messages/MessagesOr.php
index 89f2fac5..6ab6ef98 100644
--- a/languages/messages/MessagesOr.php
+++ b/languages/messages/MessagesOr.php
@@ -34,6 +34,8 @@ $digitTransformTable = array(
'9' => 'à­¯', # &#x0b6f;
);
+$linkTrail = "/^([a-z\x{0B00}-\x{0B7F}]+)(.*)$/sDu";
+
/** namespace translations from translatewiki.net
* @author Shijualex
* @author Psubhashish
@@ -287,9 +289,6 @@ $messages = array(
'tog-shownumberswatching' => 'ଦେଖà­à¬¥à¬¿à¬¬à¬¾ ବà­à­Ÿà¬¬à¬¹à¬¾à¬°à¬•à¬¾à¬°à­€à¬™à­à¬• ସଂଖà­à­Ÿà¬¾ ଦେଖାନà­à¬¤à­',
'tog-oldsig' => 'à¬à¬¬à­‡à¬•à¬¾à¬° ଦସà­à¬¤à¬–ତ:',
'tog-fancysig' => 'ଦସà­à¬¤à¬–ତକୠଉଇକିଟେକà­à¬¸à¬Ÿ ଭାବରେ ଗଣିବେ (ଆପେଆପେ ଥିବା ଲିଙà­à¬• ବିନା)',
-'tog-externaleditor' => 'ବାହାର ସମà­à¬ªà¬¾à¬¦à¬•à¬Ÿà¬¿ ଆପଣାଛାà¬à¬ ବà­à­Ÿà¬¬à¬¹à¬¾à¬° କରିବେ (କେବଳ ପଟୠସଭà­à­Ÿà¬™à­à¬• ପାଇà¬, à¬à¬¥à¬¿ ନିମନà­à¬¤à­‡ ଆପଣଙà­à¬• କମà­à¬ªà­à¬Ÿà¬°à¬°à­‡ ବିଶେଷ ସଜାଣି ଲୋଡ଼ା । [//www.mediawiki.org/wiki/Manual:External_editors ଅଧିକ ସୂଚନା])',
-'tog-externaldiff' => 'ବାହାର ବାଛିବା (external diff) ଆପଣାଛାà¬à¬ ବà­à­Ÿà¬¬à¬¹à¬¾à¬° କରିବେ (କେବଳ ପଟୠସଭà­à­Ÿà¬™à­à¬• ପାଇà¬, à¬à¬¥à¬¿ ନିମନà­à¬¤à­‡ ଆପଣଙà­à¬• କମà­à¬ªà­à¬Ÿà¬°à¬°à­‡ ବିଶେଷ ସଜାଣି ଲୋଡ଼ା । [//www.mediawiki.org/wiki/Manual:External_editors ଅଧିକ ସୂଚନା])',
-'tog-showjumplinks' => '"ଡେଇà¬à¬¯à¬¿à¬¬à­‡" ଲିଙà­à¬•à¬¸à¬¬à­à¬•à­ ସଚଳ କରିବେ',
'tog-uselivepreview' => 'ସାଥେ ସାଥେ ଚାଲିଥିବା ଦେଖଣା ବà­à­Ÿà¬¬à¬¹à¬¾à¬° କରିବେ (ଜାଭାସà­à¬•à­à¬°à¬¿à¬ªà­à¬Ÿ ଲୋଡ଼ା)',
'tog-forceeditsummary' => 'ଖାଲି ସମà­à¬ªà¬¾à¬¦à¬¨à¬¾ ସାରକଥାକୠଯିବା ବେଳେ ମୋତେ ଜଣାଇବେ',
'tog-watchlisthideown' => 'ମୋ ଦେଖଣା ତାଲିକାରେ ମୋ ନିଜର ସମà­à¬ªà¬¾à¬¦à¬¨à¬¾à¬—à­à¬¡à¬¼à¬¿à¬• ଲà­à¬šà¬¾à¬‡à¬¬à­‡',
@@ -302,6 +301,7 @@ $messages = array(
'tog-diffonly' => 'ତà­à¬³à¬¨à¬¾ ତଳେ ପୃଷà­à¬ à¬¾à¬° ଭିତର ଭାଗ ଦେଖାନà­à¬¤à­ ନାହିà¬',
'tog-showhiddencats' => 'ଲà­à¬šà¬¾à¬¯à¬¾à¬‡à¬¥à¬¿à¬¬à¬¾ ଶà­à¬°à­‡à¬£à­€à¬—à­à¬¡à¬¼à¬¿à¬• ଦେଖାଇବେ',
'tog-norollbackdiff' => 'ରୋଲବà­à­Ÿà¬¾à¬• କଲାପରେ ତà­à¬³à¬¨à¬¾ ଦେଖାନà­à¬¤à­ ନାହିà¬',
+'tog-useeditwarning' => 'ଯେତେବେଳେ ମà­à¬ ଗୋଟିଠସାଇତାଯାଇନଥିବା ପୃଷà­à¬ à¬¾à¬•à­ ବନà­à¬¦ କରିଦିଠମୋତେ ଚେତାବନୀ ଦେବେ',
'underline-always' => 'ସବà­à¬¬à­‡à¬³à­‡',
'underline-never' => 'କେବେନà­à¬¹à­‡à¬',
@@ -365,6 +365,18 @@ $messages = array(
'oct' => 'ଅକà­à¬Ÿà­‹à¬¬à¬°',
'nov' => 'ନଭେମà­à¬¬à¬°',
'dec' => 'ଡିସେମà­à¬¬à¬°',
+'january-date' => '$1 ଜାନà­à¬†à¬°à­€',
+'february-date' => '$1 ଫେବୃଆରୀ',
+'march-date' => '$1 ମାରà­à¬šà­à¬š',
+'april-date' => '$1 ଅପà­à¬°à­‡à¬²',
+'may-date' => '$1 ମଇ',
+'june-date' => '$1 ଜà­à¬¨',
+'july-date' => '$1 ଜà­à¬²à¬¾à¬‡',
+'august-date' => '$1 ଅଗଷà­à¬Ÿ',
+'september-date' => '$1 ସେପà­à¬Ÿà­‡à¬®à­à¬¬à¬°',
+'october-date' => '$1 ଅକà­à¬Ÿà­‹à¬¬à¬°',
+'november-date' => '$1 ନଭେମà­à¬¬à¬°',
+'december-date' => '$1 ଡିସେମà­à¬¬à¬°',
# Categories related messages
'pagecategories' => '{{PLURAL:$1|ଶà­à¬°à­‡à¬£à­€|ଶà­à¬°à­‡à¬£à­€à¬¸à¬®à­‚ହ}}',
@@ -488,7 +500,7 @@ $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).
+# 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).
'aboutsite' => '{{SITENAME}} ବାବଦରେ',
'aboutpage' => 'Project:ବାବଦରେ',
'copyright' => '$1 ରେ ସରà­à¬¬à¬¸à­à¬µà¬¤à­à¬µ ସଂରକà­à¬·à¬¿à¬¤',
@@ -498,7 +510,6 @@ $1',
'disclaimers' => 'ଆମେ ଦାୟୀ ନୋହà­à¬',
'disclaimerpage' => 'Project:ଆମେ ଦାୟୀ ନୋହà­à¬',
'edithelp' => 'ଲେଖା ସାହାଯà­à­Ÿ',
-'edithelppage' => 'Help:ବଦଳାଇବା',
'helppage' => 'Help:ସୂଚୀ',
'mainpage' => 'ପà­à¬°à¬§à¬¾à¬¨ ପୃଷà­à¬ à¬¾',
'mainpage-description' => 'ପà­à¬°à¬§à¬¾à¬¨ ପୃଷà­à¬ à¬¾',
@@ -576,16 +587,6 @@ $1',
# General errors
'error' => 'ଭà­à¬²',
'databaseerror' => 'ଡାଟାବେସରେ ଭà­à¬²',
-'dberrortext' => 'à¬à¬¹à¬¾ à¬à¬¹à¬¿ ସଫà­à¬Ÿà­±à­‡à¬°à¬°à­‡ ଭà­à¬²à¬Ÿà¬¿à¬à¬•à­ ମଧà­à­Ÿ ସୂଚାଇପାରେ ।
-ଶେଷଥର ଖୋଜାଯାଇଥିବା ଡାଟାବେସ ପà­à¬°à¬¶à­à¬¨à¬Ÿà¬¿ ଥିଲା:
-<blockquote><code>$1</code></blockquote>
- ଯାହାକି "<code>$2</code>"ରୠଥିଲା
-ଡାଟାବେସରେ ହୋଇଥିବା ଭà­à¬² ହେଉଛି "<samp>$3: $4</samp>"।',
-'dberrortextcl' => 'ଡାଟାବେସ ପà­à¬°à¬¶à­à¬¨ ଖୋଜା ଭà­à¬²à¬Ÿà¬¿à¬ ହୋଇଅଛି ।
-ଶେଷ ଖୋଜା ଡାଟାବେସ ପà­à¬°à¬¶à­à¬¨à¬Ÿà¬¿ ଥିଲା:
-"$1"
-ଯାହା "$2" ଭିତରୠନିଆଯାଇଥିଲା ।
-ଡାଟାବେସ ଫେରନà­à¬¤à¬¾ ଭà­à¬² "$3: $4"',
'laggedslavemode' => "'''ଜାଣିରଖନà­à¬¤à­:''' ପୃଷà­à¬ à¬¾à¬Ÿà¬¿à¬°à­‡ ବୋଧ ହà­à¬ ନଗଦ ବଦଳ ନ ଥାଇପାରେ ।",
'readonly' => 'ଡାଟାବେସଟିରେ ତାଲା ପଡ଼ିଅଛି',
'enterlockreason' => 'କେତେ ଦିନ ଭିତରେ à¬à¬¹à¬¾ ଖୋଲାଯିବ ତାହାର ଅଟକଳ ସହିତ କଞà­à¬šà¬¿ ପଡ଼ିବାର କାରଣ ଦିଅନà­à¬¤à­',
@@ -640,7 +641,6 @@ $1',
'editinginterface' => "'''ଚେତାବନୀ:''' ଆପଣ ସଫà­à¬Ÿà­±à­‡à¬°à¬° ଇଣà­à¬Ÿà¬°à¬«à­‡à¬¸ ଲେଖା ଯୋଗାଇବା ନିମନà­à¬¤à­‡ ବà­à­Ÿà¬¬à¬¹à¬¾à¬° କରାଯାଉଥିବା à¬à¬• ପୃଷà­à¬ à¬¾à¬° ସମà­à¬ªà¬¾à¬¦à¬¨à¬¾ କରà­à¬…ଛନà­à¬¤à¬¿ ।
à¬à¬¹à¬¿ ଉଇକିପୃଷà­à¬ à¬¾à¬° କିଛି ବି ବଦଳ ବାକି ସଭà­à­Ÿà¬®à¬¾à¬¨à¬™à­à¬• ଇଣà­à¬Ÿà¬°à¬«à­‡à¬¸à¬° ଦେଖଣାକୠପà­à¬°à¬­à¬¾à¬¬à¬¿à¬¤ କରିବ ।
ସମସà­à¬¤ ଉଇକିର ଅନà­à¬¬à¬¾à¬¦ ନିମନà­à¬¤à­‡, ଦୟାକରି ମିଡ଼ିଆଉଇକିର ସà­à¬¥à¬¾à¬¨à­€à­Ÿà¬•à¬°à¬£ ପà­à¬°à¬•à¬³à­à¬ª [//translatewiki.net/wiki/Main_Page?setlang=en translatewiki.net] ବà­à­Ÿà¬¬à¬¹à¬¾à¬° କରନà­à¬¤à­ ।",
-'sqlhidden' => '(SQL ପà­à¬°à¬¶à­à¬¨ ଲà­à¬šà¬¾à¬¯à¬¾à¬‡à¬…ଛି)',
'cascadeprotected' => 'à¬à¬¹à¬¿ ପୃଷà­à¬ à¬¾ ସମà­à¬ªà¬¾à¬¦à¬¨à¬¾ କରିବାରୠକିଳାଯାଇଅଛି, କାରଣ à¬à¬¥à¬¿à¬°à­‡ ତଳଲିଖିତ {{PLURAL:$1|ପୃଷà­à¬ à¬¾à¬Ÿà¬¿à¬ ଅଛି|ଟି ପୃଷà­à¬ à¬¾ ଅଛି}} ଯାହା "କà­à­Ÿà¬¾à¬¸à¬•à­‡à¬¡à¬¼ କରା" ସà­à¬¬à¬¿à¬§à¬¾ ଦେଇ କିଳାଯାଇଅଛି ।:
$2',
'namespaceprotected' => "ଆପଣଙà­à¬•à­ à¬à¬¹à¬¿ '''$1''' ନେମସà­à¬ªà­‡à¬¸ ଥିବା ପୃଷà­à¬ à¬¾à¬°à­‡ ସମà­à¬ªà¬¾à¬¦à¬¨à¬¾ କରିବା ନିମନà­à¬¤à­‡ ଅନà­à¬®à¬¤à¬¿ ମିଳିନାହିଠ।",
@@ -671,10 +671,19 @@ $2',
'welcomecreation-msg' => 'ଆପଣଙà­à¬• ଖାତାଟି ଖୋଲାଗଲା
ନିଜର [[Special:Preferences|{{SITENAME}} ପସନà­à¬¦à¬¸à¬¬à­à¬•à­]] ବଦଳାଇବାକୠଭà­à¬²à¬¿à¬¬à­‡ ନାହିଠ।',
'yourname' => 'ବà­à­Ÿà¬¬à¬¹à¬¾à¬°à¬•à¬¾à¬°à­€à¬™à­à¬• ନାମ:',
+'userlogin-yourname' => 'ବà­à­Ÿà¬¬à¬¹à¬¾à¬°à¬•à¬¾à¬°à­€à¬™à­à¬• ନାମ',
+'userlogin-yourname-ph' => 'ଆପଣଙà­à¬• ଇଉଜର ନାମ ଟାଇପ କରନà­à¬¤à­',
+'createacct-another-username-ph' => 'ଆପଣଙà­à¬• ଇଉଜର ନାମ ଟାଇପ କରନà­à¬¤à­',
'yourpassword' => 'ପାସୱାରà­à¬¡à¬¼',
+'userlogin-yourpassword' => 'ପାସୱାରà­à¬¡à¬¼',
+'userlogin-yourpassword-ph' => 'ଆପଣଙà­à¬• ପାସୱାରà­à¬¡à¬¼ ନିବେଶ କରନà­à¬¤à­',
+'createacct-yourpassword-ph' => 'ପାସୱରà­à¬¡à¬¼ ନିବେଶ କରନà­à¬¤à­',
'yourpasswordagain' => 'ପାସୱାରà­à¬¡à¬¼ ଆଉଥରେ:',
+'createacct-yourpasswordagain' => 'ପାସୱରà­à¬¡à¬¼ ନିଶà­à¬šà¬¿à¬¤ କରିବେ',
+'createacct-yourpasswordagain-ph' => 'ପà­à¬£à¬¿ ପାସୱରà­à¬¡à¬¼ ନିବେଶ କରନà­à¬¤à­',
'remembermypassword' => 'à¬à¬¹à¬¿ ବà­à¬°à¬¾à¬‰à¬œà¬°à¬°à­‡ (ସବà­à¬ à­ ଅଧିକ ହେଲେ $1 {{PLURAL:$1|day|ଦିନ}}) ପାଇଠମୋ ଲଗଇନ ମନେ ରଖିଥିବେ',
-'securelogin-stick-https' => 'ଲଗ ଇନ କଲାପରେ HTTPS ସହ ଯୋଡ଼ି ହୋଇ ରହନà­à¬¤à­',
+'userlogin-remembermypassword' => 'ମୋତେ ଲଗ-ଇନ କରି ରଖିଥାନà­à¬¤à­',
+'userlogin-signwithsecure' => 'ନିରାପଦ କନେକସନ ବà­à­Ÿà¬¬â€Œà¬¹à¬¾à¬° କରନà­à¬¤à­',
'yourdomainname' => 'ଆପଣଙà­à¬• ଡୋମେନ:',
'password-change-forbidden' => 'ଆପଣ à¬à¬¹à¬¿ ଉଇକିରେ ପାସୱାରà­à¬¡ ବଦଳାଇ ପାରିବେ ନାହିଠ।',
'externaldberror' => 'ବୋଧ ହà­à¬ ଚିହà­à¬¨à¬Ÿ ଡାଟାବେସ ଭà­à¬²à¬Ÿà¬¿à¬ ହୋଇଥିଲା ବା ଆପଣଙà­à¬•à­ ନିଜର ବାହାର ଖାତା ଅପଡେଟ କରିବା ନିମନà­à¬¤à­‡ ଅନà­à¬®à¬¤à¬¿ ମିଳିନାହିଠ।',
@@ -686,14 +695,31 @@ $2',
'logout' => 'ଲଗଆଉଟ',
'userlogout' => 'ଲଗ ଆଉଟ',
'notloggedin' => 'ଲଗ‌‌ ଇନ କରିନାହାନà­à¬¤à¬¿',
+'userlogin-noaccount' => 'ଖାତାଟିଠନାହି�',
+'userlogin-joinproject' => '{{SITENAME}}ରେ ଯୋଗଦିଅନà­à¬¤à­',
'nologin' => 'ଖାତାଟିଠନାହି� $1।',
'nologinlink' => 'ନୂଆ ଖାତାଟିଠଖୋଲନà­à¬¤à­',
'createaccount' => 'ନୂଆ ଖାତାଟିଠଖୋଲନà­à¬¤à­',
'gotaccount' => 'ଆଗରୠଖାତାଟିଠଅଛି କି? $1.',
'gotaccountlink' => 'ଲଗ ଇନ (Log in)',
'userlogin-resetlink' => 'ଲଗଇନ ତଥà­à­Ÿ ସବୠଭà­à¬²à¬¿à¬—େଲେକି?',
+'userlogin-resetpassword-link' => 'ପାସୱାରà­à¬¡à¬¼ ରିସେଟ କରନà­à¬¤à­',
+'helplogin-url' => 'Help:Logging_in',
+'userlogin-helplink' => '[[{{MediaWiki:helplogin-url}}|ଲଗ-ଇନ କରିବାରେ ସ‌ହ‌ଯୋଗ]]',
+'createacct-emailrequired' => 'ଇମେଲ ଠିକଣା',
+'createacct-emailoptional' => 'ଇମେଲ ଠିକଣା (ଇଚà­à¬›à¬¾à¬§à­€à¬¨)',
+'createacct-email-ph' => 'ଆପଣଙà­à¬• ଇମେଲ ଠିକଣା ନିବେଶ କରନà­à¬¤à­',
+'createacct-another-email-ph' => 'ଆପଣଙà­à¬• ଇ-ମେଲ ଠିକଣା ଦିଅନà­à¬¤à­',
'createaccountmail' => 'à¬à¬• ଅସà­à¬¥à¬¾à­Ÿà­€ ପାସୱାରà­à¬¡à¬¼ ବà­à­Ÿà¬¬à¬¹à¬¾à¬° କରନà­à¬¤à­ à¬à¬¬à¬‚ à¬à¬¹à¬¾à¬•à­ ତଳେ ଦିଆଯାଇଥିବା ଇ-ମେଲ ଠିକଣାକୠପଠେଇ ଦିଅନà­à¬¤à­',
+'createacct-realname' => 'ପà­à¬°à¬•à­ƒà¬¤ ନାମ (ଇଚà­à¬›à¬¾à¬§à­€à¬¨)',
'createaccountreason' => 'କାରଣ:',
+'createacct-reason' => 'କାରଣ',
+'createacct-reason-ph' => 'ଆପଣ ଅନà­à­Ÿà¬à¬• ଖାତା କାହିà¬à¬•à¬¿ ତିଆରି କରà­à¬›à¬¨à­à¬¤à¬¿',
+'createacct-imgcaptcha-ph' => 'ଉପରେ ଲେଖାଥିବା ଲେଖାଟି ଲେଖନà­à¬¤à­',
+'createacct-submit' => 'ନିଜର ନୂଆ ଖାତାଟିଠଖୋଲନà­à¬¤à­',
+'createacct-another-submit' => 'ଆଉ à¬à¬• ଖାତା ଖୋଲନà­à¬¤à­',
+'createacct-benefit-heading' => '{{SITENAME}} ଆପଣଙà­à¬• ଭଳି ଲୋକମାନଙà­à¬• ଦà­à­±à¬¾à¬°à¬¾ ଗଢ଼ା ।',
+'createacct-benefit-body1' => '{{PLURAL:$1|ସମà­à¬ªà¬¾à¬¦à¬¨à¬¾|ସମà­à¬ªà¬¾à¬¦à¬¨à¬¾à¬®à¬¾à¬¨}}',
'badretype' => 'ଆପଣ ଦେଇଥିବା ପାସବାରà­à¬¡à¬¼à¬Ÿà¬¿ ମେଳଖାଉନାହିଠ।',
'userexists' => 'ଆପଣ ଦେଇଥିବା ଇଉଜର ନାମ ଆଗରୠଅଛି ।
ଦୟାକରି ଅଲଗା ନାମଟିଠବାଛନà­à¬¤à­ ।',
@@ -784,7 +810,7 @@ continue using your old password.',
'newpassword' => 'ନୂଆ ପାସୱାରà­à¬¡à¬¼:',
'retypenew' => 'ପାସୱାରà­à¬¡à¬¼ ଆଉଥରେ ଦିଅନà­à¬¤à­:',
'resetpass_submit' => 'ପାସୱାରà­à¬¡à¬¼à¬Ÿà¬¿à¬ ଦେଇ ଲଗ ଇନ କରନà­à¬¤à­',
-'resetpass_success' => 'ଆପଣଙà­à¬• ପାସୱାରà­à¬¡à¬¼à¬Ÿà¬¿ ବଦଳାଇ ଦିଆଗଲା !
+'changepassword-success' => 'ଆପଣଙà­à¬• ପାସୱାରà­à¬¡à¬¼à¬Ÿà¬¿ ବଦଳାଇ ଦିଆଗଲା !
à¬à¬¬à­‡ ଲଗ ଇନ କରà­à¬…ଛà­à¬...',
'resetpass_forbidden' => 'ପାସୱାରà­à¬¡à¬¼à¬®à¬¾à¬¨ ବଦଳା ଯାଇପାରିବ ନାହିà¬',
'resetpass-no-info' => 'à¬à¬¹à¬¿ ପୃଷà­à¬ à¬¾à¬Ÿà¬¿à¬•à­ ସିଧା ଖୋଲିବା ନିମନà­à¬¤à­‡ ଆପଣଙà­à¬•à­ ଲଗ ଇନ କରିବାକୠପଡ଼ିବ ।',
@@ -796,10 +822,9 @@ continue using your old password.',
# Special:PasswordReset
'passwordreset' => 'ପାସୱାରà­à¬¡à¬¼ ପà­à¬¨à¬¸à­à¬¥à¬¾à¬ªà¬¨ କରନà­à¬¤à­',
-'passwordreset-text' => 'ନିଜ ପାସୱାରà­à¬¡à¬¼à¬•à­ ପà­à¬¨à¬ƒà¬¸à­à¬¥à¬¾à¬ªà¬¨ କରିବା ପାଇଠà¬à¬¹à¬¿ ଆବେଦନ ପତà­à¬°à¬Ÿà¬¿ ପୂରଣ କରନà­à¬¤à­ ।',
'passwordreset-legend' => 'ପାସୱାରà­à¬¡à¬¼ ପà­à¬¨à¬¸à­à¬¥à¬¾à¬ªà¬¨ କରନà­à¬¤à­',
'passwordreset-disabled' => 'ପାସୱାରà­à¬¡à¬¼à¬•à­ ପà­à¬°à¬¾à¬ªà­à¬°à¬¿ ମୂଳକୠଫେରାଇବା à¬à¬¹à¬¿ ଉଇକିରେ ଅଚଳ କରାଯାଇଅଛି ।',
-'passwordreset-pretext' => '{{PLURAL:$1||ତଳେ ଥିବା ତଥà­à­Ÿà¬¸à¬®à­‚ହରୠକୌଣସି ଗୋଟିଠଦିଅନà­à¬¤à­}}',
+'passwordreset-emaildisabled' => 'à¬à¬¹à¬¿ ଉଇକିରେ ଇମେଲ ସà­à¬¬à¬¿à¬§à¬¾ ଅଚଳ କରାଯାଇଅଛି ।',
'passwordreset-username' => 'ବà­à­Ÿà¬¬à¬¹à¬¾à¬°à¬•à¬¾à¬°à­€à¬™à­à¬• ନାମ:',
'passwordreset-domain' => 'ଡୋମେନ:',
'passwordreset-capture' => 'ଯାଉଥିବା ଇ-ମେଲଟି ଦେଖିବେ?',
@@ -1048,12 +1073,15 @@ $1 ଦà­à¬µà¬¾à¬°à¬¾ ପà­à¬°à¬¤à¬¿à¬°à­‹à¬§ କରାଯାଇଛି
à¬à¬¹à¬¾à¬•à­ ଲିଭାଇ ଦିଆଗଲା ପରି ମନେ ହେଉଛି ।',
'edit-conflict' => 'ବଦଳାଇବା ଦà­à¬µà¬¨à­à¬¦.',
'edit-no-change' => 'ଆପଣଙà­à¬• ସମà­à¬ªà¬¾à¬¦à¬¨à¬¾à¬•à­ ଅଣଦେଖା କରାଗଲା, କାରଣ ଲେଖାରେ କିଛି ବି ବଦଳ କରାଯାଇନଥିଲା ।',
+'postedit-confirmation' => 'ଆପଣଙà­à¬• ବଦଳ ସାଇତା ଗଲା ।',
'edit-already-exists' => 'ନୂଆ ପୃଷà­à¬ à¬¾à¬Ÿà¬¿à¬ ତିଆରି କରିପାରିଲà­à¬ ନାହିଠ।
à¬à¬¹à¬¾ ଆଗରୠଅଛି ।',
'defaultmessagetext' => 'ଡିଫଲà­à¬Ÿ ମେସେଜ ଲେଖାଗà­à¬¡à¬¿à¬•',
'content-failed-to-parse' => '$1 ପà­à¬°à¬•à¬¾à¬° ପାଇଠ$2 ଲେଖାକୠବରà­à¬£à­à¬£à¬¨à¬¾ କରିପାରିଲା ନାହିà¬: $3',
'invalid-content-data' => 'ଅବୈଧ ଆଧାର ତଥà­à­Ÿ',
'content-not-allowed-here' => '"$1" ବିଷୟଗà­à¬¡à¬¿à¬• [[$2]]ପୃଷà­à¬ à¬¾à¬°à­‡ ରହିପାରିବ ନାହିà¬',
+'editwarning-warning' => 'à¬à¬¹à¬¿ ପୃଷà­à¬ à¬¾à¬•à­ ଛାଡ଼ି ଚାଲିଗଲେ ହà­à¬ ତ ଆପଣ କରିଥିବା କିଛି ସମà­à¬ªà¬¾à¬¦à¬¨à¬¾ ହରାଇ ପାରନà­à¬¤à¬¿ ।
+ଯଦି ଆପଣ ଲଗ ଇନ କରିଥାନà­à¬¤à¬¿ ତେବେ ଆପଣଙà­à¬• ପସନà­à¬¦à¬° "ସମà­à¬ªà¬¾à¬¦à¬¨à¬¾" ଭାଗରେ à¬à¬¹à¬¿ ଚେତାବନୀଟିକୠଅଚଳ କରିପାରିବେ ।',
# Content models
'content-model-wikitext' => 'ଉଇକିଟେକà­à¬¸à¬Ÿ',
@@ -1296,7 +1324,6 @@ $1",
'searchmenu-legend' => 'ଖୋଜିବା ବିକଳà­à¬ª',
'searchmenu-exists' => "'''à¬à¬¹à¬¿ ଉଇକିରେ \"[[:\$1]]\" ନାଆà¬à¬°à­‡ ପୃଷà­à¬ à¬¾à¬Ÿà¬¿à¬ ଅଛି ।'''",
'searchmenu-new' => "'''à¬à¬¹à¬¿ ପà­à¬°à¬¸à¬™à­à¬—ଟି ଆଗରୠନାହିà¬, ତେଣୠ''[[:$1]]'' ନାମରେ ପà­à¬°à¬¸à¬™à­à¬—ଟିଠà¬à¬ à¬¾à¬°à­‡ ଗଢ଼ନà­à¬¤à­!'''",
-'searchhelp-url' => 'Help:ସୂଚୀ',
'searchmenu-prefix' => '[[Special:PrefixIndex/$1|à¬à¬¹à¬¿ ନାମ ଆଗରୠଥିବା ପୃଷà­à¬ à¬¾à¬¸à¬¬à­ ଖୋଜିବେ]]',
'searchprofile-articles' => 'ସୂଚୀ ପୃଷà­à¬ à¬¾',
'searchprofile-project' => 'ସାହାଯà­à­Ÿ ଓ ପà­à¬°à¬•à¬³à­à¬ª ପୃଷà­à¬ à¬¾',
@@ -1341,15 +1368,6 @@ $1",
ଆପଣ à¬à¬¹à¬¿ ଭିତରେ ଗà­à¬—ଲ ଦେଖିପାରନà­à¬¤à¬¿ ।
ଜାଣିରଖନà­à¬¤à­ ଯେ {{SITENAME}}ର ବିଷୟ ସୂଚି ପà­à¬°à¬¾à¬¤à¬¨ ହୋଇଥାଇପାରେ ।',
-# Quickbar
-'qbsettings' => 'ସହଳ ପଟି (Quickbar)',
-'qbsettings-none' => 'କିଛି ନାହିà¬',
-'qbsettings-fixedleft' => 'ବାମକୠଥୟ କରାଗଲା',
-'qbsettings-fixedright' => 'ଡାହାଣକୠଥୟ କରାଗଲା',
-'qbsettings-floatingleft' => 'ବାମରେ ଭାସନà­à¬¤à¬¾',
-'qbsettings-floatingright' => 'ଡାହାଣରେ ଭାସନà­à¬¤à¬¾',
-'qbsettings-directionality' => 'ଆପଣଙà­à¬• ଭାଷାର ବାମ-ଡାହାଣ ଲିଖନ ଶୈଳୀ ଅନà­à¬¸à¬¾à¬°à­‡ ସଜାଡ଼ି ଦିଆଗଲା',
-
# Preferences page
'preferences' => 'ପସନà­à¬¦',
'mypreferences' => 'ପସନà­à¬¦',
@@ -1382,7 +1400,6 @@ $1",
'resetprefs' => 'ସାଇତା ହୋଇନଥିବା ବଦଳ ଲିଭାଇଦେବେ',
'restoreprefs' => 'ଆପେଆପେ ଥିବା ମୂଳ ସଜାଣିକୠଫେରିଯିବେ',
'prefs-editing' => 'ସମà­à¬ªà¬¾à¬¦à¬¨à¬¾',
-'prefs-edit-boxsize' => 'ସମà­à¬ªà¬¾à¬¦à¬¨à¬¾ ଘରର ଆକାର ।',
'rows' => 'ଧାଡ଼ି:',
'columns' => 'ସà­à¬¤à¬®à­à¬­à¬¸à¬¬à­:',
'searchresultshead' => 'ଖୋଜିବା',
@@ -1393,9 +1410,6 @@ $1",
'recentchangesdays-max' => 'ସବà­à¬ à¬¾à¬°à­ ଅଧିକ ହେଲେ $1 {{PLURAL:$1|ଦିନ|ଦିନ}}',
'recentchangescount' => 'ଆପେଆପେ ଦେଖାଯାଉଥିବା ବଦଳର ସଂଖà­à­Ÿà¬¾:',
'prefs-help-recentchangescount' => 'à¬à¬¥à¬¿à¬°à­‡ ନଗଦ ବଦଳ, ପୃଷà­à¬ à¬¾à¬° ଇତିହାସ ଓ ଲଗ ଇତିହାସ ରହିଅଛି ।',
-'prefs-help-watchlist-token' => 'à¬à¬¹à¬¿ ଘରେ à¬à¬• ଗୋପନ ଲେଖା ଦେଲେ RSS ଫିଡ଼ଟିଠଆପଣଙà­à¬• ଦେଖଣାତାଲିକାରେ ତିଆରିବ ।
-ଗୋପନ ଲେଖା ଜାଣିଥିବା କେହି ବି à¬à¬¹à¬¿ ଘରେ ଆପଣଙà­à¬• ଦେଖଣାତାଲିକା ଦେଖିପାରିବ, ତେଣୠà¬à¬• ସà­à¬°à¬•à­à¬·à¬¿à¬¤ ନାମ ଦିଅନà­à¬¤à­ ।
-à¬à¬ à¬¾à¬°à­‡ à¬à¬• ଇଆଡୠସିଆଡୠନାମ ଆପଣଙà­à¬• ଜାଣିବା ପାଇଠଦିଆଗଲା: $1',
'savedprefs' => 'ଆପଣଙà­à¬• ପସନà­à¬¦à¬¸à¬¬à­ ସାଇତାଗଲା ।',
'timezonelegend' => 'ସମୟ ମଣà­à¬¡à¬³:',
'localtime' => 'ସà­à¬¥à¬¾à¬¨à­€à­Ÿ ସମୟ:',
@@ -1426,7 +1440,6 @@ $1",
'prefs-reset-intro' => 'ଆପଣ à¬à¬¹à¬¿ ପୃଷà­à¬ à¬¾à¬Ÿà¬¿ ବà­à­Ÿà¬¬à¬¹à¬¾à¬° କରି ଆପଣା ପସନà­à¬¦à¬¸à¬¬à­à¬•à­ ସାଇଟର ଆରମà­à¬­à¬°à­‡ ଥିବା ସଜାଣିକୠଲେଉଟାଇଦେଇପାରିବେ ।
à¬à¬¹à¬¾à¬•à­ ପଛକୠଫେରାଯାଇପାରିବ ନାହିà¬',
'prefs-emailconfirm-label' => 'ଇ-ମେଲ ସଜାଣି:',
-'prefs-textboxsize' => 'ସମà­à¬ªà¬¾à¬¦à¬¨à¬¾ ଘରର ଆକାର',
'youremail' => 'ଇ-ମେଲ:',
'username' => '{{GENDER:$1|Username}}:',
'uid' => '{{GENDER:$1|User}} ID:',
@@ -1461,6 +1474,8 @@ HTML ଟାଗ ପରଖିନିଅନà­à¬¤à­ ।',
'prefs-dateformat' => 'ତାରିଖ ସଜାଣି',
'prefs-timeoffset' => 'ସମୟ ଆରମà­à¬­',
'prefs-advancedediting' => 'ସାଧାରଣ ବିକଳà­à¬ª',
+'prefs-editor' => 'ସମà­à¬ªà¬¾à¬¦à¬•',
+'prefs-preview' => 'ଦେଖଣା',
'prefs-advancedrc' => 'ଉନà­à¬¨à¬¤ ବିକଳà­à¬ªà¬¸à¬®à­‚ହ',
'prefs-advancedrendering' => 'ଉନà­à¬¨à¬¤ ବିକଳà­à¬ªà¬¸à¬®à­‚ହ',
'prefs-advancedsearchoptions' => 'ଉନà­à¬¨à¬¤ ବିକଳà­à¬ªà¬¸à¬®à­‚ହ',
@@ -1468,7 +1483,9 @@ HTML ଟାଗ ପରଖିନିଅନà­à¬¤à­ ।',
'prefs-displayrc' => 'ଦେଖଣା ବିକଳà­à¬ª',
'prefs-displaysearchoptions' => 'ଦେଖଣା ବିକଳà­à¬ª',
'prefs-displaywatchlist' => 'ଦେଖଣା ବିକଳà­à¬ª',
+'prefs-tokenwatchlist' => 'ଟୋକନà­â€Œ',
'prefs-diffs' => 'ତଫାତସବà­',
+'prefs-help-prefershttps' => 'à¬à¬¹à¬¿ ପସନà­à¬¦ ଆପଣଙà­à¬• ଲଗà­à¬‡à¬¨à­ କରିବାପରେ କାରà­à¬¯à­à­Ÿà¬•à­à¬·à¬® ହେବ ।',
# User preference: email validation using jQuery
'email-address-validity-valid' => 'ଇ-ମେଲ ଠିକଣା ବୈଧ ଭଳି ଲାଗà­à¬…ଛି',
@@ -1668,7 +1685,6 @@ HTML ଟାଗ ପରଖିନିଅନà­à¬¤à­ ।',
'recentchangeslinked-feed' => 'ଯୋଡ଼ାଥିବା ବଦଳ',
'recentchangeslinked-toolbox' => 'ଯୋଡ଼ାଥିବା ବଦଳ',
'recentchangeslinked-title' => '"$1" ସାà¬à¬—ରେ ଜୋଡ଼ାଥିବା ବଦଳ',
-'recentchangeslinked-noresult' => 'ଯୋଡ଼ାଯାଇଥିବା ପୃଷà­à¬ à¬¾ ସବà­à¬°à­‡ à¬à¬‡ ସମୟସୀମା ଭିତରେ କିଛି ବଦଳାଯାଇନାହିଠ।',
'recentchangeslinked-summary' => "à¬à¬‡à¬Ÿà¬¿ କିଛିସମୟ ଆଗରୠନିରà­à¬¦à­à¬¦à¬¿à¬·à­à¬Ÿ ପୃଷà­à¬ à¬¾à¬°à­ ଲିଙà­à¬• ହୋଇଥିବା ଆଉ ବଦଳାଯାଇଥିବା (ଅବା ଗୋଟିଠନିରà­à¬¦à­à¬¦à¬¿à¬·à­à¬Ÿ ଶà­à¬°à­‡à¬£à­€à¬°) ପୃଷà­à¬ à¬¾à¬¸à¬¬à­à¬° ତାଲିକା । [[Special:Watchlist|ମୋର ଦେଖାତାଲିକା]]ର ପୃଷà­à¬ à¬¾ ସବୠ'''ବୋଲଡ଼'''।",
'recentchangeslinked-page' => 'ଫରଦର ନାଆà¬',
'recentchangeslinked-to' => 'ଦିଆଯାଇଥିବା ଫରଦରେ ଯୋଡ଼ା ବାକି ଫରଦମାନଙà­à¬•à¬° ବଦଳ ସବୠଦେଖାନà­à¬¤à­ ।',
@@ -1904,7 +1920,6 @@ https://www.mediawiki.org/wiki/Manual:Image_Authorization ଦେଖନà­à¬¤à­
'http-read-error' => 'HTTP ପଢ଼ିବା ଭà­à¬² ।',
'http-timed-out' => 'HTTP ଅନà­à¬°à­‹à¬§ ମିଆଦ ପà­à¬°à¬¿à¬—ଲା ।',
'http-curl-error' => '$1 URL କୠପାଇବାରେ ବିଫଳ',
-'http-host-unreachable' => 'URLଟି ପାଇଲୠନାହିଠ।',
'http-bad-status' => 'HTTP ଅନà­à¬°à­‹à¬§ ବେଳେ କିଛି ଅସà­à¬¬à¬¿à¬§à¬¾ ହେଲା : $1 $2',
# Some likely curl errors. More could be added from <http://curl.haxx.se/libcurl/c/libcurl-errors.html>
@@ -2057,12 +2072,6 @@ URLଟି ଠିକ ଅଚିକି କି ନାଠଓ ସାଇଟଟି ସà
'statistics-users-active-desc' => 'ବିଗତ {{PLURAL:$1|ଦିନରେ|$1 ଦିନରେ}} କିଛି କାମ କରିଥିବା ସଭà­à­Ÿà¬—ଣ',
'statistics-mostpopular' => 'ସବà­à¬ à¬¾à¬°à­ ଅଧିକ ଦେଖାଯାଇଥିବା ପୃଷà­à¬ à¬¾',
-'disambiguations' => 'ବହà­à¬¬à¬¿à¬•à¬³à­à¬ª ପୃଷà­à¬ à¬¾à¬®à¬¾à¬¨à¬™à­à¬• ସହ ଯୋଡ଼ା ପୃଷà­à¬ à¬¾',
-'disambiguationspage' => 'Template:ବହà­à¬¬à¬¿à¬•à¬³à­à¬ª',
-'disambiguations-text' => "ତଳେ ଥିବା ପୃଷà­à¬ à¬¾à¬—à­à¬¡à¬¿à¬• ଅତିକମରେ ଗୋଟେ ଗୋଟେ '''ବହà­à¬¬à¬¿à¬•à¬³à­à¬ª ପୃଷà­à¬ à¬¾'''କୠଯୋଡ଼ିଥାନà­à¬¤à¬¿ ।
-ସେସବୠଅଧିକ ଉପଯà­à¬•à­à¬¤ ପà­à¬°à¬¸à¬™à­à¬— ସହ ଯୋଡ଼ାହେବା ଉଚିତ ।<br />
-[[MediaWiki:Disambiguationspage]] ସହ ଯୋଡ଼ାଥିବା ଛାଞà­à¬š ବà­à­Ÿà¬¬à¬¹à¬¾à¬° କରà­à¬¥à¬¿à¬²à­‡ ପୃଷà­à¬ à¬¾à¬Ÿà¬¿à¬à¬•à­ ବହà­à¬¬à¬¿à¬•à¬³à­à¬ª ପୃଷà­à¬ à¬¾ ବୋଲି କà­à¬¹à¬¾à¬¯à¬¾à¬",
-
'pageswithprop-submit' => 'ଯିବା',
'doubleredirects' => 'ଯୋଡ଼ା ପà­à¬¨à¬ªà­à¬°à­‡à¬°à¬£',
@@ -2313,10 +2322,9 @@ URLଟି ଠିକ ଅଚିକି କି ନାଠଓ ସାଇଟଟି ସà
'unwatchthispage' => 'ଦେଖନà­à¬¤à­ ନାହିà¬',
'notanarticle' => 'ବିଷୟବସà­à¬¤à­à¬° ପୃଷà­à¬ à¬¾à¬Ÿà¬¿à¬ ନà­à¬¹à­‡à¬',
'notvisiblerev' => 'ଜଣେ ଅଲଗା ବà­à­Ÿà¬¬à¬¹à¬¾à¬°à¬•à¬¾à¬°à­€à¬™à­à¬• ଦେଇ କରାଯାଇଥିବା ସେଶ ସଂସà­à¬•à¬°à¬£à¬Ÿà¬¿ ଲିଭାଇଦିଆଗଲା ।',
-'watchnochange' => 'ଆପଣଙà­à¬• ଦେଇ ଦେଖାଯାଇଥିବା ସମୟ ସୀମା ଭିତରେ କୌଣସିଟି ପୃଷà­à¬ à¬¾à¬° ବଦଳ କରାଯାଇନାହିଠ।',
'watchlist-details' => 'ଆପଣଙà­à¬• ଦେଖଣା ତାଲିକାରେ ଆଲୋଚନା ପୃଷà­à¬ à¬¾à¬•à­ ଛାଡ଼ି {{PLURAL:$1|$1 ଟି ପୃଷà­à¬ à¬¾|$1 ଟି ପୃଷà­à¬ à¬¾}} ଅଛି ।',
-'wlheader-enotif' => '* ଇ-ମେଲ ସୂଚନାକୠସଚଳ କରାଗଲା ।',
-'wlheader-showupdated' => "* ଆପଣ ଶେଷଥର ଦେଖିଥିବା ପୃଷà­à¬ à¬¾à¬—à­à¬¡à¬¼à¬¿à¬• '''ମୋଟା ଅକà­à¬·à¬°'''ରେ ଦେଖାଯାଇଅଛି ।",
+'wlheader-enotif' => 'ଇମେଲ ସୂଚନା ସଚଳ କରାଗଲା ।',
+'wlheader-showupdated' => "ଆପଣ ଶେଷଥର ଦେଖିଥିବା ପୃଷà­à¬ à¬¾à¬—à­à¬¡à¬¼à¬¿à¬• '''ମୋଟା ଅକà­à¬·à¬°'''ରେ ଦେଖାଯାଉଅଛି ।",
'watchmethod-recent' => 'à¬à¬¡à¬–ାଯାଇଥିବା ପୃଷà­à¬ à¬¾à¬° ନଗଦ ବଦଳ ପରଖà­à¬›à­à¬',
'watchmethod-list' => 'ନଗଦ ବଦଳ ନିମନà­à¬¤à­‡ ଦେଖାଯାଇଥିବା ପୃଷà­à¬ à¬¾à¬®à¬¾à¬¨ ପରଖà­à¬›à­à¬',
'watchlistcontains' => 'ଆପଣଙà­à¬• ଦେଖଣାତାଲିକାରେ $1 {{PLURAL:$1|ଗୋଟି ପୃଷà­à¬ à¬¾|ଗୋଟି ପୃଷà­à¬ à¬¾}} ରହିଅଛି ।',
@@ -2724,12 +2732,9 @@ $1ର ଅଟକ ପାଇଠଦିଆଯାଇଥିବା କାରଣଟି à
à¬à¬¹à¬¾, $2 ଭିତରେ ଥିବାରୠତାହାକୠଅଟକରୠଛାଡ଼ କରାଯାଇପାରିବ ନାହିଠ।',
'ip_range_invalid' => 'ଅଚଳ IP ସୀମା ।',
'ip_range_toolarge' => '/$1 ଠାରୠବଡ଼ ସୀମା ଅଟକ ଅନà­à¬®à­‹à¬¦à¬¿à¬¤ ନà­à¬¹à­‡à¬ ।',
-'blockme' => 'ମୋତେ ଅଟକାଇବେ',
'proxyblocker' => 'ପà­à¬°à¬•à­à¬¸à¬¿ ଅଟକ',
-'proxyblocker-disabled' => 'à¬à¬¹à¬¿ କାମଟି ଅଚଳ କରାଯାଇଅଛି ।',
'proxyblockreason' => 'à¬à¬• ଖୋଲା ପà­à¬°à¬•à­à¬¸à¬¿ ହୋଇଥିବାରୠଆପଣଙà­à¬• IP ଠିକଣାଟିକୠଅଟକାଇଦିଆଗଲା ।
ଦୟାକରି ଆପଣଙà­à¬• ଇଣà­à¬Ÿà¬°à¬¨à­‡à¬Ÿ ସେବାପà­à¬°à¬¦à¬¾à¬¨à¬•à¬¾à¬°à­€, କାରିଗରି ସହଯୋଗ କିମà­à¬¬à¬¾ ସଙà­à¬—ଠନ ସହିତ କଥା ହୋଇ à¬à¬¹à¬¿ ବିରାଟ ଅସà­à¬¬à¬¿à¬§à¬¾ ବାବଦରେ ବତାଇଦିଅନà­à¬¤à­ ।',
-'proxyblocksuccess' => 'ଶେଷ ହେଲା ।',
'sorbsreason' => '{{SITENAME}} ଦେଇ ଆପଣଙà­à¬• IP ଠିକଣାଟି DNSBL ଭିତରେ à¬à¬• ଖୋଲା ପà­à¬°à¬•à­à¬¸à¬¿ ଭାବରେ ନଥିଭà­à¬•à­à¬¤ ହୋଇଅଛି ।',
'sorbs_create_account_reason' => '{{SITENAME}} ଦେଇ ଆପଣଙà­à¬• IP ଠିକଣାଟି DNSBL ଭିତରେ à¬à¬• ଖୋଲା ପà­à¬°à¬•à­à¬¸à¬¿ ଭାବରେ ନଥିଭà­à¬•à­à¬¤ ହୋଇଅଛି ।
ଆପଣ ନୂଆ ଖାତାଟିଠଖୋଲି ପାରିବେ ନାହିà¬',
@@ -3202,6 +3207,11 @@ $1',
'ago' => '$1 ଆଗରà­',
'just-now' => 'à¬à¬¬à­‡ à¬à¬¬à­‡',
+# Human-readable timestamps
+'hours-ago' => '$1 {{PLURAL:$1|ଘଣà­à¬Ÿà¬¾}} ଆଗରà­',
+'minutes-ago' => '$1 {{PLURAL:$1|ମିନିଟ|ମିନିଟ}} ଆଗରà­',
+'seconds-ago' => '$1 {{PLURAL:$1|ସେକେଣà­à¬¡|ସେକେଣà­à¬¡}} ଆଗରà­',
+
# Bad image list
'bad_image_list' => 'ଗଢ଼ଣଟି à¬à¬®à¬¿à¬¤à¬¿ ହେବ:
@@ -3230,7 +3240,7 @@ $1',
* gpslongitude
* gpsaltitude',
-# EXIF tags
+# Exif tags
'exif-imagewidth' => 'ଓସାର',
'exif-imagelength' => 'ଉଚà­à¬šà¬¤à¬¾',
'exif-bitspersample' => 'ଉପାଦାନ ପà­à¬°à¬¤à¬¿ ବିଟ',
@@ -3408,7 +3418,7 @@ $1',
'exif-originalimageheight' => 'ଛୋଟ କରାଯିବ ଆଗରୠଛବିର ଉଚà­à¬šà¬¤à¬¾',
'exif-originalimagewidth' => 'ଛୋଟ କରାଯିବ ଆଗରୠଛବିର ଓସାର',
-# EXIF attributes
+# Exif attributes
'exif-compression-1' => 'ଅସମà­à¬ªà¬¾à¬¦à¬¿à¬¤',
'exif-compression-2' => 'CCITT ଗୋଠ à­© à­§-ବିମିୟ ବଦଳାଯାଇଥିବା ହଫମାନ ରନ ଲମà­à¬¬ à¬à¬¨à¬•à­‹à¬¡à¬¼à¬¿à¬™à­à¬—',
'exif-compression-3' => 'CCITT ଗୋଠ à­© ଫାକà­à¬¸ à¬à¬¨à¬•à­‹à¬¡à¬¼à¬¿à¬™à­à¬—',
@@ -3799,7 +3809,6 @@ $5
'version-other' => 'ବାକି',
'version-mediahandlers' => 'ମିଡ଼ିଆ ହà­à­Ÿà¬¾à¬£à­à¬¡à¬²à¬°',
'version-hooks' => 'ହà­à¬•',
-'version-extension-functions' => 'à¬à¬•à­à¬¸à¬Ÿà­‡à¬¨à¬¸à¬¨ କାମସବà­',
'version-parser-extensiontags' => 'ପାରà­à¬¸à¬° à¬à¬•à­à¬¸à¬Ÿà­‡à¬¨à¬¸à¬¨ ଚିହà­à¬¨',
'version-parser-function-hooks' => 'ପାରà­à¬¸à¬° କାମ ହà­à¬•',
'version-hook-name' => 'ହà­à¬• ନାମ',
@@ -3821,13 +3830,6 @@ MediaWiki ଉପଯୋଗୀ ହେବା ଲକà­à¬·à¬°à­‡ ବଣà­à¬Ÿà¬¾à¬¯à
'version-entrypoints-header-entrypoint' => 'ପà­à¬°à¬¬à­‡à¬¶ ବିନà­à¬¦à­',
'version-entrypoints-header-url' => 'ଇଉଆରà¬à¬²',
-# Special:FilePath
-'filepath' => 'ଫାଇଲ ପଥ',
-'filepath-page' => 'ଫାଇଲ:',
-'filepath-submit' => 'ଯିବା',
-'filepath-summary' => 'à¬à¬¹à¬¿ ବିଶେଷ ପୃଷà­à¬ à¬¾ à¬à¬• ଫାଇଲର ପà­à¬°à¬¾ ପଥ ଦେଖାଇଦିଠ।
-ଛବିସବୠପà­à¬°à¬¾ ରେଜୋଲà­à¬¸à¬¨à¬°à­‡ ଦେଖାଇଦିଆଯାà¬, ବାକି ଫାଇଲସବୠସେମାନଙà­à¬• ସହଯୋଗୀ ପà­à¬°à¬—ାମ ମାନଙà­à¬• ଦେଇ ଆରମà­à¬­ ହୋଇଥାନà­à¬¤à¬¿ ।',
-
# Special:FileDuplicateSearch
'fileduplicatesearch' => 'à¬à¬¹à¬¾à¬° ନକଲ ପୃଷà­à¬ à¬¾ ଖୋଜିବେ ।',
'fileduplicatesearch-summary' => 'ହାସୠମୂଲà­à­Ÿà¬•à­ ନେଇ ଦà­à¬‡à¬¥à¬° ଥିବା ଫାଇଲ ଖୋଜନà­à¬¤à­ ।',
@@ -3916,6 +3918,8 @@ MediaWiki ଉପଯୋଗୀ ହେବା ଲକà­à¬·à¬°à­‡ ବଣà­à¬Ÿà¬¾à¬¯à
'htmlform-submit' => 'ଦାଖଲକରିବା',
'htmlform-reset' => 'କରାଯାଇଥିବା ବଦଳ ପଛକୠଫେରାଇବେ',
'htmlform-selectorother-other' => 'ବାକି',
+'htmlform-no' => 'ନାହିà¬',
+'htmlform-yes' => 'ହà¬',
# SQLite database support
'sqlite-has-fts' => 'ପà­à¬°à¬¾ ଟେକà­à¬¸à­à¬Ÿ ଖୋଜା ସହଯୋଗ ସହିତ $1',
diff --git a/languages/messages/MessagesOs.php b/languages/messages/MessagesOs.php
index 788eef84..c14f4d6d 100644
--- a/languages/messages/MessagesOs.php
+++ b/languages/messages/MessagesOs.php
@@ -216,9 +216,6 @@ $messages = array(
'tog-shownumberswatching' => 'Цал архайæджы фарÑмæ Ñæ цæÑÑ‚ дарынц, уый равдиÑ',
'tog-oldsig' => 'Ðыры къухæрфыÑÑ‚:',
'tog-fancysig' => 'Сæвæрын къухæрфыÑÑ‚ викитекÑтæй (æнæ хæдæвзæргæ æрвитæнæй)',
-'tog-externaleditor' => 'Ðрхайын æддаг ивæнæй (æрмæÑÑ‚ ÑкÑперттæн, домы Ñæрмагонд æвæрдтытæ компьютерыл. [//www.mediawiki.org/wiki/Manual:External_editors Лæмбынæг.])',
-'tog-externaldiff' => 'Ðрхайын æндæр иртаÑæнæй (æрмæÑÑ‚ ÑкÑперттæн, домы Ñæрмагонд æвæрдтытæ компьютерыл. [//www.mediawiki.org/wiki/Manual:External_editors Лæмбынæг.])',
-'tog-showjumplinks' => 'Тагъд æрвитæнтæй пайда кæн',
'tog-uselivepreview' => 'Ðрхайын тагъд разбакаÑтæй (домы JavaScript) (ÑкÑперименталон)',
'tog-forceeditsummary' => 'ФæдзæхÑæд иу мæ, кæд ивды афыÑÑ‚ афтид уа',
'tog-watchlisthideown' => 'ÐйÑын мæ ивдтытæ цæÑтдардæй',
@@ -231,6 +228,7 @@ $messages = array(
'tog-diffonly' => 'Ма Ã¦Ð²Ð´Ð¸Ñ Ñ„Ð°Ñ€ÑÑ‹ Ð¼Ð¸Ð´Ð¸Ñ Ð¸Ñ€Ñ‚Ð°Ñæны бынмæ',
'tog-showhiddencats' => 'ÆмбæхÑÑ‚ категоритæ æвдиÑ',
'tog-norollbackdiff' => 'Рауадзын иртаÑæн раздæхты фæÑтæ',
+'tog-useeditwarning' => 'Зæгъæт-иу мын ÑиÑтемæ, æнæ æвæрд архайдимæ ивыны фарÑ-иу куы æхкæнон',
'underline-always' => 'Ðлкуыдæр',
'underline-never' => 'Ðикуы',
@@ -418,7 +416,7 @@ $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).
+# 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).
'aboutsite' => '{{grammar:genitive|{{SITENAME}}}} тыххæй',
'aboutpage' => 'Project:ÐÑ„Ñ‹ÑÑ‚',
'copyright' => 'ÐœÐ¸Ð´Ð¸Ñ Ñƒ гом {{grammar:allative|$1}} гæÑгæ.',
@@ -428,7 +426,6 @@ $1',
'disclaimers' => 'Бæрн',
'disclaimerpage' => 'Project:Бæрн',
'edithelp' => 'Ивынæн æххуыÑ',
-'edithelppage' => 'Help:Ивын',
'helppage' => 'Help:МидиÑ',
'mainpage' => 'Сæйраг фарÑ',
'mainpage-description' => 'Сæйраг фарÑ',
@@ -507,17 +504,6 @@ $1',
# General errors
'error' => 'Рæдыд',
'databaseerror' => 'Рарддоны рæдыд',
-'dberrortext' => 'Рарддонмæ домæны ÑинтакÑиÑÑ‹ Ñ€Ð°Ð·Ñ‹Ð½Ð´Ð¸Ñ Ñ€Ã¦Ð´Ñ‹Ð´.
-Уый гæнæн Ð¸Ñ Ð½Ñ‹Ñан кæны рæдыд Ñофты куыÑÑ‚Ñ‹.
-ФæÑтаг домæн рарддонмæ уыдиÑ:
-<blockquote><code>$1</code></blockquote>
-ÑÃ¦Ð²Ð·Ã¦Ñ€Ð´Ð¸Ñ "<code>$2</code>" функцийæ.
-Рарддон раздæхта ахæм рæдыд: "<samp>$3: $4</samp>".',
-'dberrortextcl' => 'Рарддонмæ домæны ÑинтакÑиÑÑ‹ Ñ€Ð°Ð·Ñ‹Ð½Ð´Ð¸Ñ Ñ€Ã¦Ð´Ñ‹Ð´.
-ФæÑтаг домæн рарддонмæ уыдиÑ:
-"$1"
-ÑÃ¦Ð²Ð·Ã¦Ñ€Ð´Ð¸Ñ "$2" функцийæ.
-Рарддон раздæхта ахæм рæдыд: "$3: $4"',
'laggedslavemode' => "'''Сындæг:''' ФарÑÑ‹ гæнæн Ð¸Ñ Ð½Ã¦Ð¹ фæÑтаг нæуæггæндтæ.",
'readonly' => 'Рарддон æхгæд у',
'enterlockreason' => 'ÐÑ‹Ñ„Ñ„Ñ‹ÑÑ Ã¦Ñ…Ð³Ã¦Ð½Ñ‹Ð½Ñ‹ бындур æмæ йæ æмгъуыд',
@@ -574,7 +560,6 @@ $1',
'editinginterface' => "'''Сындæг:''' Ды Ð¸Ð²Ñ‹Ñ Ð°Ñ…Ã¦Ð¼ фарÑ, кæм Ð¸Ñ Ñофты интерфейÑÑ‹ текÑÑ‚.
Ðцы фарÑÑ‹ фæивд фæзындзæн ацы викийы алы архайæджы интерфейÑыл дæр.
Ðлы викийы тæлмæцтæ ивынæн, дæ хорзæхæй, архай [//translatewiki.net/ translatewiki.net-æй], кæцы у MediaWiki-йы локализацигæнæн проект.",
-'sqlhidden' => '(SQL домæн æмбæхÑÑ‚ у)',
'cascadeprotected' => 'Ðцы Ñ„Ð°Ñ€Ñ Ð¸Ð²Ñ‹Ð½Ã¦Ð¹ æхгæд у уымæн æмæ у æфтыд бындæр цы "каÑкадон" хъахъхъонд {{PLURAL:$1|Ñ„Ð°Ñ€Ñ Ð¸Ñ, уырдæм|фæрÑтæ ÑÑ‚Ñ‹, уыдонмæ}}:
$2',
'namespaceprotected' => "Дæуæн нæй бар ивын фæрÑтæ '''$1''' номдоны.",
@@ -605,10 +590,18 @@ $2',
'welcomecreation-msg' => 'Дæ аккаунт арæзт æрцыдиÑ.
Ма дæ ферох уæт æркæÑын дæ [[Special:Preferences|{{grammar:genitive|{{SITENAME}}}} уагæвæрдтæм]].',
'yourname' => 'ФæÑномыг:',
+'userlogin-yourname' => 'ФæÑномыг',
+'userlogin-yourname-ph' => 'БафыÑÑ Ð´Ã¦ фæÑномыг',
'yourpassword' => 'Пароль:',
+'userlogin-yourpassword' => 'Пароль',
+'userlogin-yourpassword-ph' => 'БафыÑÑ Ð´Ã¦ пароль',
+'createacct-yourpassword-ph' => 'БафыÑÑ Ð¿Ð°Ñ€Ð¾Ð»ÑŒ',
'yourpasswordagain' => 'Пароль ногæй бафыÑÑ:',
+'createacct-yourpasswordagain' => 'Сбæлвырд кæн пароль',
+'createacct-yourpasswordagain-ph' => 'Пароль ногæй бафыÑÑ',
'remembermypassword' => 'Бахъуыды мæ кæнæд ацы браузеры (макÑимум $1 {{PLURAL:$1|бонмæ}})',
-'securelogin-stick-https' => 'Дарддæр дæр HTTPS-Ñ‹ уылты, бахизыны фæÑтæ',
+'userlogin-remembermypassword' => 'СиÑтемæйы мæ дар',
+'userlogin-signwithsecure' => 'Ã†Ð´Ð°Ñ Ð±Ð°Ñтдзинадæй',
'yourdomainname' => 'Дæ домен:',
'password-change-forbidden' => 'Дæ бон нæу пароль фæивын ацы викийы.',
'externaldberror' => 'Кæнæ аутентификацийы рарддоны рæдыд æрцыдиÑ, кæнæ та дæуæн нæй бар Ñнæуæг кæнын дæ æддаг аккаунт.',
@@ -620,18 +613,38 @@ $2',
'logout' => 'Рахизын',
'userlogout' => 'Рахизын',
'notloggedin' => 'СиÑтемæмæ хызт нæ дæ',
+'userlogin-noaccount' => 'Ðæй дын аккаунт?',
+'userlogin-joinproject' => 'Баиу у {{grammar:comitative|{{SITENAME}}}}',
'nologin' => 'РегиÑтрацигонд нæма дæ? $1.',
'nologinlink' => 'РегиÑтраци',
'createaccount' => 'РегиÑтраци кæнын',
'gotaccount' => 'РегиÑтрацигонд дæ? $1.',
'gotaccountlink' => 'Бахизын',
'userlogin-resetlink' => 'Ферох дæ ÑÑ‚Ñ‹ дæ бахизæнтæ?',
+'userlogin-resetpassword-link' => 'Дæ пароль ногæй Ñæвæр',
+'helplogin-url' => 'Help:Бахизын',
+'userlogin-helplink' => '[[{{MediaWiki:helplogin-url}}|Бахизынæн æххуыÑ]]',
+'createacct-join' => 'Дæ информаци дæлдæр бафыÑÑ.',
+'createacct-emailrequired' => 'Электрон поÑÑ‚Ñ‹ адриÑ',
+'createacct-emailoptional' => 'Электрон поÑÑ‚Ñ‹ Ð°Ð´Ñ€Ð¸Ñ (фæндон)',
+'createacct-email-ph' => 'БафыÑÑ Ð´Ã¦ Ñлектрон поÑÑ‚Ñ‹ адриÑ',
'createaccountmail' => 'РæÑтæгмæ пароль халæй иÑÑ‚ æрцæуæт æмæ бындæр цы Ñлектрон поÑÑ‚ иÑ, уырдæм æрвыÑÑ‚ æрцæуæт',
+'createacct-realname' => 'Æцæг ном (фæндон)',
'createaccountreason' => 'Бындур:',
+'createacct-reason' => 'Бындур',
+'createacct-reason-ph' => 'Цæмæн Ð°Ñ€Ð°Ð·Ñ‹Ñ Ã¦Ð½Ð´Ã¦Ñ€ аккаунт?',
+'createacct-captcha' => 'ÆдаÑдзинад бæлвырдгæнæн',
+'createacct-imgcaptcha-ph' => 'Уæлдæр цы текÑÑ‚ уыныÑ, уый бафыÑÑ',
+'createacct-submit' => 'Сараз дæ аккаунт',
+'createacct-benefit-heading' => '{{SITENAME}} Ñарæзтой дæ хуызæн адæм.',
+'createacct-benefit-body1' => '{{PLURAL:$1|ивд|ивды}}',
+'createacct-benefit-body2' => '{{PLURAL:$1|фарÑ|фарÑÑ‹}}',
+'createacct-benefit-body3' => 'фæÑтаг {{PLURAL:$1|архайæг|архайæджы}}',
'badretype' => 'Цы паролтæ бафыÑтай, уыдон æмхуызæн не ÑÑ‚Ñ‹.',
'userexists' => 'Уыцы фæÑномыг нæвдæлон у.
Дæ хорзæхæй, равзар æндæр.',
'loginerror' => 'Бахизыны рæдыд',
+'createacct-error' => 'Ðккаунт аразыны рæдыд',
'createaccounterror' => 'Ðæ Ñ€Ð°ÑƒÐ°Ð´Ð¸Ñ Ð°ÐºÐºÐ°ÑƒÐ½Ñ‚ Ñаразын: $1',
'nocookiesnew' => 'Ðккаунт арæзт æрцыдиÑ, фæлæ ды нырмæ нæ дæ хызт мидæмæ.
{{SITENAME}} архайы cookies-æй цæмæй архайджыты æвзара.
@@ -714,7 +727,7 @@ $2',
'newpassword' => 'Ðæуæг пароль:',
'retypenew' => 'Ðог пароль ногæй бафыÑÑ:',
'resetpass_submit' => 'Пароль Ñæвæрын æмæ ÑиÑтемæмæ бахизын',
-'resetpass_success' => 'Дæ пароль ивд æрцыд!
+'changepassword-success' => 'Дæ пароль ивд æрцыд!
ÐÑ‹Ñ€ ды Ñ…Ð¸Ð·Ñ‹Ñ ÑиÑтемæмæ...',
'resetpass_forbidden' => 'Паролæн баивæн нæй',
'resetpass-no-info' => 'Ды хъуамæ ÑиÑтемæмæ хызт уай, цæмæй ацы фарÑмæ комкоммæ бавналай.',
@@ -727,10 +740,9 @@ $2',
# Special:PasswordReset
'passwordreset' => 'Пароль раппарæн',
-'passwordreset-text' => 'Байдзаг кæн ацы формæ, цæмæй райÑай дæ пароль ногæй Ñæвæрай.',
'passwordreset-legend' => 'Пароль раппарын',
'passwordreset-disabled' => 'Парол фæлварын ацы викийы хицæн у.',
-'passwordreset-pretext' => '{{PLURAL:$1||Дæлдæр цы рардты хæйттæ иÑ, уыдонæй иу бафыÑÑ}}',
+'passwordreset-emaildisabled' => 'Электрон поÑÑ‚ ацы викийы хицæн у.',
'passwordreset-username' => 'ФæÑномыг:',
'passwordreset-domain' => 'Домен:',
'passwordreset-capture' => 'Цы e-mail рауадиÑ, уый æвдыÑÑ‚ æрцæуæт?',
@@ -753,7 +765,7 @@ $2
РæÑтæгмæ пароль: $2',
'passwordreset-emailsent' => 'Ðог пароль Ñæвæрыны Ñ„Ñ‹Ñтæг æрвыÑÑ‚ æрцыд.',
'passwordreset-emailsent-capture' => 'Ðог пароль Ñæвæрыны Ñ„Ñ‹Ñтæг æрвыÑÑ‚ æрцыд æмæ бындæр æвдыÑÑ‚ у.',
-'passwordreset-emailerror-capture' => 'Æрхъуыдыгæнæн e-mail арæзт æрцыд æмæ бындæр æвдыÑÑ‚ у. Фæлæ йæ арвитын нæ бантыÑтиÑ: $1',
+'passwordreset-emailerror-capture' => 'Ðог пароль Ñæвæрыны Ñ„Ñ‹Ñтæг арæзт æрцыд æмæ бындæр æвдыÑÑ‚ у. Фæлæ йæ {{grammar:allative|{{GENDER:$2|user}}}} арвитын нæ бантыÑтиÑ: $1',
# Special:ChangeEmail
'changeemail' => 'E-mail Ð°Ð´Ñ€Ð¸Ñ Ñ„Ã¦Ð¸Ð²Ñ‹Ð½',
@@ -1028,7 +1040,6 @@ ASCII ныÑæнттæм чи нæ хауы, уыдон ивыны бынаты
'viewprevnext' => 'КæÑын ($1 {{int:pipe-separator}} $2) ($3)',
'searchmenu-exists' => "'''Ðцы викийы Ð¸Ñ Ñ„Ð°Ñ€Ñ \"[[:\$1]]\" номимæ.'''",
'searchmenu-new' => "'''Сараз Ñ„Ð°Ñ€Ñ \"[[:\$1]]\" ацы викийы!'''",
-'searchhelp-url' => 'Help:МидиÑ',
'searchprofile-articles' => 'МидиÑÑ‹ фæрÑтæ',
'searchprofile-project' => 'Ã†Ñ…Ñ…ÑƒÑ‹Ñ Ã¦Ð¼Ã¦ Проекты фæрÑтæ',
'searchprofile-images' => 'Мультимеди',
@@ -1058,13 +1069,6 @@ ASCII ныÑæнттæм чи нæ хауы, уыдон ивыны бынаты
'powersearch-field' => 'Ðгуырд',
'powersearch-toggleall' => 'Иууылдæр',
-# Quickbar
-'qbsettings' => 'Ðавигацион таг',
-'qbsettings-none' => 'Ма равдиÑ',
-'qbsettings-fixedleft' => 'Галиуырдыгæй',
-'qbsettings-fixedright' => 'Рахизырдыгæй',
-'qbsettings-floatingleft' => 'Рахизырдыгæй ленккæнгæ',
-
# Preferences page
'preferences' => 'Уагæвæрдтæ',
'mypreferences' => 'Уагæвæрдтæ',
@@ -1234,7 +1238,6 @@ $3',
'recentchangeslinked-feed' => 'БаÑÑ‚ ивдтытæ',
'recentchangeslinked-toolbox' => 'БаÑÑ‚ ивдтытæ',
'recentchangeslinked-title' => '"{{grammar:comitative|$1}}" баÑÑ‚ ивдтытæ',
-'recentchangeslinked-noresult' => 'Ðæй баÑÑ‚ фæрÑÑ‚Ñ‹ ивдтытæ амынд рæÑтæджы',
'recentchangeslinked-summary' => "Ðдон ÑÑ‚Ñ‹ фæÑтаг рæÑтæджы ивдтытæ ахæм уацты, кæдонмæ æрвиты амынд Ñ„Ð°Ñ€Ñ (кæнæ амынд категорийы уæнгтæ). [[Special:Watchlist|Дæ цæÑтдард фæрÑтæ]] ÑÑ‚Ñ‹ '''бæзджынæй''' ныÑангонд.",
'recentchangeslinked-page' => 'ФарÑÑ‹ ном:',
'recentchangeslinked-to' => 'Уый бæÑÑ‚Ñ‹ равдиÑæт амынд фарÑмæ æрвитгæ фæрÑÑ‚Ñ‹ ивдтытæ',
@@ -1322,8 +1325,6 @@ $3',
'statistics-header-hooks' => 'Æндæр ÑтатиÑтикæтæ',
'statistics-articles' => 'МидиÑÑ‹ фæрÑтæ',
-'disambiguationspage' => 'Template:бирæныÑанон',
-
'double-redirect-fixer' => 'РарвыÑÑ‚ раÑтгæнæн',
'brokenredirects-edit' => 'ивын',
@@ -1427,7 +1428,6 @@ $3',
'watch' => 'ЦæÑÑ‚ æрдарын',
'watchthispage' => 'ЦæÑÑ‚ дарын ацы фарÑмæ',
'unwatch' => 'Ðал дарын цæÑÑ‚',
-'watchnochange' => 'Дæ цæÑтдард уацтæй иу дæр ивд не ’рцыдиÑ.',
'watchlist-details' => '{{PLURAL:$1|$1 фарÑмæ|$1 фарÑмæ}} дæ цæÑÑ‚ дарыÑ, тæрхоны фæрÑтæ нæ нымайгæйæ.',
'watchlistcontains' => 'Дæ цæÑÑ‚ $1 {{PLURAL:$1|фарÑмæ|фарÑмæ}} дарыÑ.',
'wlnote' => "Дæлæ афæÑтаг '''$2 Ñахаты дæргъы''' цы $1 {{PLURAL:$1|ивддзинад|ивддзинады}} æрцыди.",
@@ -1657,12 +1657,8 @@ $3',
'spamprotectiontitle' => 'Спамы ныхмæ фильтр',
# Skin names
-'skinname-standard' => 'Стандартон',
-'skinname-nostalgia' => 'Æнкъард',
'skinname-cologneblue' => 'Кёльны æрхæндæг',
'skinname-monobook' => 'Моно-чиныг',
-'skinname-myskin' => 'Мæхи',
-'skinname-chick' => 'Карк',
# Browsing diffs
'previousdiff' => '↠Зæронддæр ивд',
@@ -1711,7 +1707,7 @@ $3',
* gpslongitude
* gpsaltitude',
-# EXIF tags
+# Exif tags
'exif-imagewidth' => 'Уæрх',
'exif-imagelength' => 'Бæрзæнд',
'exif-artist' => 'Ðвтор',
@@ -1797,11 +1793,6 @@ $3',
'version-poweredby-others' => 'æндæртæ',
'version-software-version' => 'ВерÑи',
-# Special:FilePath
-'filepath' => 'Файлмæ фæт',
-'filepath-page' => 'Файл:',
-'filepath-submit' => 'Бацæуын',
-
# Special:FileDuplicateSearch
'fileduplicatesearch-filename' => 'Файлы ном:',
'fileduplicatesearch-submit' => 'Ðгурын',
diff --git a/languages/messages/MessagesPa.php b/languages/messages/MessagesPa.php
index 343574c3..c3b48e16 100644
--- a/languages/messages/MessagesPa.php
+++ b/languages/messages/MessagesPa.php
@@ -61,13 +61,13 @@ $namespaceAliases = array(
);
$specialPageAliases = array(
- 'Activeusers' => array( 'ਸਰਗਰਮ_ਮੈਂਬਰ' ),
+ 'Activeusers' => array( 'ਸਰਗਰਮ_ਵਰਤੋਂਕਾਰ' ),
'Allmessages' => array( 'ਸਾਰੇ_ਸਨੇਹੇ' ),
'Allpages' => array( 'ਸਾਰੇ_ਪੰਨੇ' ),
'Ancientpages' => array( 'ਪà©à¨°à¨¾à¨£à©‡_ਪੰਨੇ' ),
- 'Badtitle' => array( 'ਖਰਾਬ_ਸਿਰਲੇਖ' ),
- 'Blankpage' => array( 'ਖਾਲੀ_ਪੰਨਾ' ),
- 'Block' => array( 'ਪਾਬੰਦੀ_ਲਾਓ', 'IP_’ਤੇ_ਪਾਬੰਦੀ_ਲਾਓ', 'ਮੈਂਬਰ_’ਤੇ_ਪਾਬੰਦੀ_ਲਾਓ' ),
+ 'Badtitle' => array( 'ਖ਼ਰਾਬ_ਸਿਰਲੇਖ' ),
+ 'Blankpage' => array( 'ਖ਼ਾਲੀ_ਪੰਨਾ' ),
+ 'Block' => array( 'ਪਾਬੰਦੀ_ਲਾਓ', 'IP_’ਤੇ_ਪਾਬੰਦੀ_ਲਾਓ', 'ਵਰਤੋਂਕਾਰ_’ਤੇ_ਪਾਬੰਦੀ_ਲਾਓ' ),
'Blockme' => array( 'ਮੇਰੇ_’ਤੇ_ਪਾਬੰਦੀ_ਲਾਓ' ),
'Booksources' => array( 'ਕਿਤਾਬ_ਸਰੋਤ' ),
'BrokenRedirects' => array( 'ਟà©à©±à¨Ÿà©‡_ਰੀਡਿਰੈਕਟ' ),
@@ -83,7 +83,7 @@ $specialPageAliases = array(
'Disambiguations' => array( 'ਗà©à©°à¨à¨²à¨–ੋਲà©à¨¹' ),
'DoubleRedirects' => array( 'ਦੂਹਰੇ_ਰੀਡਿਰੈਕਟ' ),
'EditWatchlist' => array( 'ਨਿਗਰਾਨੀ-ਲਿਸਟ_ਸੋਧੋ' ),
- 'Emailuser' => array( 'ਮੈਂਬਰ_ਨੂੰ_ਈ-ਮੇਲ_ਕਰੋ' ),
+ 'Emailuser' => array( 'ਵਰਤੋਂਕਾਰ_ਨੂੰ_ਈ-ਮੇਲ_ਕਰੋ' ),
'Export' => array( 'ਨਿਰਯਾਤ' ),
'Fewestrevisions' => array( 'ਸਭ_ਤੋਂ_ਘੱਟ_ਰੀਵਿਜ਼ਨਾਂ' ),
'FileDuplicateSearch' => array( 'ਨਕਲੀ_ਫ਼ਾਈਲ_ਖੋਜੋ' ),
@@ -133,14 +133,14 @@ $specialPageAliases = array(
'Revisiondelete' => array( 'ਰੀਵਿਜਨ_ਮਿਟਾਓ' ),
'Search' => array( 'ਖੋਜੋ' ),
'Shortpages' => array( 'ਛੋਟੇ_ਪੰਨੇ' ),
- 'Specialpages' => array( 'ਖਾਸ_ਪੰਨੇ' ),
+ 'Specialpages' => array( 'ਖ਼ਾਸ_ਪੰਨੇ' ),
'Statistics' => array( 'ਅੰਕੜੇ' ),
'Tags' => array( 'ਟੈਗ' ),
'Unblock' => array( 'ਪਾਬੰਦੀ_ਹਟਾਓ' ),
'Uncategorizedcategories' => array( 'ਸ਼à©à¨°à©‡à¨£à©€à¨¹à©€à¨£_ਸ਼à©à¨°à©‡à¨£à©€à¨†à¨‚' ),
'Uncategorizedimages' => array( 'ਸ਼à©à¨°à©‡à¨£à©€à¨¹à©€à¨£_ਫ਼ਾਈਲਾਂ' ),
'Uncategorizedpages' => array( 'ਸ਼à©à¨°à©‡à¨£à©€à¨¹à©€à¨£_ਪੰਨੇ' ),
- 'Uncategorizedtemplates' => array( 'ਸ਼à©à¨°à©‡à¨£à©€à¨¹à©€à¨£_ਸਾਂਚੇ' ),
+ 'Uncategorizedtemplates' => array( 'ਸ਼à©à¨°à©‡à¨£à©€à¨¹à©€à¨£_ਫਰਮੇ' ),
'Undelete' => array( 'ਅਣ-ਹਟਾਓਣ' ),
'Unlockdb' => array( 'ਡੈਟਾਬੇਸ_ਖੋਲà©à¨¹à©‹' ),
'Unusedcategories' => array( 'ਅਣਵਰਤੀਆਂ_ਸ਼à©à¨°à©‡à¨£à©€à¨†à¨‚' ),
@@ -148,9 +148,9 @@ $specialPageAliases = array(
'Unusedtemplates' => array( 'ਅਣਵਰਤੇ_ਫਰਮੇ' ),
'Unwatchedpages' => array( 'ਬੇ-ਨਿਗਰਾਨ_ਪੰਨੇ' ),
'Upload' => array( 'ਅੱਪਲੋਡ' ),
- 'Userlogin' => array( 'ਮੈਂਬਰ_ਲਾਗਇਨ' ),
- 'Userlogout' => array( 'ਮੈਂਬਰ_ਲਾਗਆਊਟ' ),
- 'Userrights' => array( 'ਮੈਂਬਰ_ਹੱਕ', 'ਪà©à¨°à¨¬à©°à¨§à¨•_ਬਣਾਓ', 'ਬੋਟ_ਬਣਾਓ' ),
+ 'Userlogin' => array( 'ਵਰਤੋਂਕਾਰ_ਲਾਗਇਨ' ),
+ 'Userlogout' => array( 'ਵਰਤੋਂਕਾਰ_ਲਾਗਆਊਟ' ),
+ 'Userrights' => array( 'ਵਰਤੋਂਕਾਰ_ਹੱਕ', 'ਪà©à¨°à¨¬à©°à¨§à¨•_ਬਣਾਓ', 'ਬੋਟ_ਬਣਾਓ' ),
'Version' => array( 'ਰੂਪ' ),
'Wantedcategories' => array( 'ਚਾਹੀਦੀਆਂ_ਸ਼à©à¨°à©‡à¨£à©€à¨†à¨‚' ),
'Wantedfiles' => array( 'ਚਾਹੀਦੀਆਂ_ਫ਼ਾਈਲਾਂ' ),
@@ -218,16 +218,6 @@ $messages = array(
'tog-shownumberswatching' => 'ਨਜ਼ਰ ਰੱਖ ਰਹੇ ਵਰਤੋਂਕਾਰਾਂ ਦੀ ਗਿਣਤੀ ਵਖਾਓ',
'tog-oldsig' => 'ਮੌਜੂਦਾ ਦਸਤਖ਼ਤ:',
'tog-fancysig' => 'ਦਸਤਖ਼ਤ ਨੂੰ ਬਤੌਰ ਵਿਕੀਲਿਖਤ ਮੰਨੋ (ਬਿਨਾਂ ਆਟੋਮੈਟਿਕ ਲਿੰਕ)',
-'tog-externaleditor' => 'ਪਹਿਲਾਂ ਤੋਂ ਹੀ ਬਾਹਰੀ ਸੋਧਕ ਵਰਤੋ (ਸਿਰਫ਼ ਮਾਹਿਰਾਂ ਲਈ ਹੈ, ਤà©à¨¹à¨¾à¨¡à©‡ ਕੰਪਿਊਟਰ ਤੇ ਖ਼ਾਸ ਸੈਟਿੰਗਾਂ ਲੋੜੀਂਦੀਆਂ ਹਨ। [//
-www.mediawiki.org/wiki/
-Manual:External_editors More
-information.])',
-'tog-externaldiff' => 'ਪਹਿਲਾਂ ਤੋਂ ਹੀ ਬਾਹਰੀ ਫ਼ਰਕ ਵਰਤੋ (ਸਿਰਫ਼
-ਮਾਹਿਰਾਂ ਲਈ ਹੈ, ਤà©à¨¹à¨¾à¨¡à©‡ ਕੰਪਿਊਟਰ ਤੇ ਖ਼ਾਸ
-ਸੈਟਿੰਗਾਂ ਲੋੜੀਂਦੀਆਂ ਹਨ। [//
-www.mediawiki.org/wiki/
-Manual:External_editors ਹੋਰ ਜਾਣਕਾਰੀ।])',
-'tog-showjumplinks' => '"ਇਸ ’ਤੇ ਜਾਓ" ਅਸੈਸਬਿਲਟੀ ਲਿੰਕ ਚਾਲੂ ਕਰੋ',
'tog-uselivepreview' => 'ਸਿੱਧੀ à¨à¨²à¨• ਵਰਤੋ (ਤਜਰਬੇ-ਅਧੀਨ)',
'tog-forceeditsummary' => 'ਜਦੋਂ ਮੈਂ ਖ਼ਾਲੀ ਸੋਧ ਸਾਰ ਦੇਵਾਂ ਤਾਂ ਮੈਨੂੰ ਆਗਾਹ ਕਰੋ',
'tog-watchlisthideown' => 'ਨਿਗਰਾਨੀ-ਲਿਸਟ ਵਿੱਚੋਂ ਮੇਰੀਆਂ ਸੋਧਾਂ ਲà©à¨•à¨¾à¨“',
@@ -240,6 +230,7 @@ Manual:External_editors ਹੋਰ ਜਾਣਕਾਰੀ।])',
'tog-diffonly' => 'ਫ਼ਰਕ ਤੋਂ ਹੇਠ ਸਫ਼ੇ ਦੀ ਸਮੱਗਰੀ ਨਾ ਵਖਾਓ',
'tog-showhiddencats' => 'ਲà©à¨•à¨µà©€à¨†à¨‚ ਸ਼à©à¨°à©‡à¨£à©€à¨†à¨‚ ਵਖਾਓ',
'tog-norollbackdiff' => '"ਵਾਪਸ ਮੋੜੋ" ਅਮਲ ਵਿਚ ਲਿਆਣ ਮਗਰੋਂ ਫ਼ਰਕ ਨਾ ਵਖਾਓ',
+'tog-useeditwarning' => 'ਜਦੋਂ ਮੈਂ ਅਣ-ਸਾਂਭੀਆਂ ਸੋਧਾਂ ਵਾਲਾ ਸਫ਼ਾ ਛੱਡਾਂ ਤਾਂ ਮੈਨੂੰ ਖ਼ਬਰ ਦਿਉ',
'underline-always' => 'ਹਮੇਸ਼ਾਂ',
'underline-never' => 'ਕਦੇ ਨਹੀਂ',
@@ -303,6 +294,18 @@ Manual:External_editors ਹੋਰ ਜਾਣਕਾਰੀ।])',
'oct' => 'ਅਕ',
'nov' => 'ਨਵ',
'dec' => 'ਦਸ',
+'january-date' => '$1 ਜਨਵਰੀ',
+'february-date' => '$1 ਫ਼ਰਵਰੀ',
+'march-date' => '$1 ਮਾਰਚ',
+'april-date' => '$1 ਅਪà©à¨°à©ˆà¨²',
+'may-date' => '$1 ਮਈ',
+'june-date' => '$1 ਜੂਨ',
+'july-date' => '$1 ਜà©à¨²à¨¾à¨ˆ',
+'august-date' => '$1 ਅਗਸਤ',
+'september-date' => '$1 ਸਤੰਬਰ',
+'october-date' => '$1 ਅਕਤੂਬਰ',
+'november-date' => '$1 ਨਵੰਬਰ',
+'december-date' => '$1 ਦਸੰਬਰ',
# Categories related messages
'pagecategories' => '{{PLURAL:$1|ਸ਼à©à¨°à©‡à¨£à©€|ਸ਼à©à¨°à©‡à¨£à©€à¨†à¨‚}}',
@@ -384,6 +387,7 @@ Manual:External_editors ਹੋਰ ਜਾਣਕਾਰੀ।])',
'create-this-page' => 'ਇਹ ਸਫ਼ਾ ਬਣਾਓ',
'delete' => 'ਹਟਾਓ',
'deletethispage' => 'ਇਹ ਸਫ਼ਾ ਹਟਾਓ',
+'undeletethispage' => 'ਇਹ ਸਫ਼ਾ ਅਣ-ਮਿਟਿਆ ਕਰੋ',
'undelete_short' => '{{PLURAL:$1|ਇੱਕ ਸੋਧ|$1 ਸੋਧਾਂ}} ਹਟਾਉਣਾ-ਵਾਪਸ',
'viewdeleted_short' => '{{PLURAL:$1|ਹਟਾਈ ਸੋਧ|$1 ਹਟਾਈਆਂ ਸੋਧਾਂ}} ਵੇਖੋ',
'protect' => 'ਸà©à¨°à©±à¨–ਿਆ',
@@ -426,7 +430,7 @@ $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).
+# 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).
'aboutsite' => '{{SITENAME}} ਬਾਰੇ',
'aboutpage' => 'Project:ਬਾਰੇ',
'copyright' => 'ਸਮੱਗਰੀ $1 ਹੇਠ ਉਪਲੱਬਧ ਹੈ।',
@@ -436,7 +440,6 @@ $1',
'disclaimers' => 'ਦਾਅਵੇ',
'disclaimerpage' => 'Project:ਆਮ ਦਾਅਵੇ',
'edithelp' => 'ਸੋਧ ਸਬੰਧੀ ਮਦਦ',
-'edithelppage' => 'Help:ਸੋਧ',
'helppage' => 'Help:ਸਮੱਗਰੀ',
'mainpage' => 'ਮà©à©±à¨– ਸਫ਼ਾ',
'mainpage-description' => 'ਮà©à©±à¨– ਸਫ਼ਾ',
@@ -513,15 +516,6 @@ $1',
# General errors
'error' => 'ਗ਼ਲਤੀ',
'databaseerror' => 'ਡਾਟਾਬੇਸ ਗਲਤੀ',
-'dberrortext' => 'ਡਾਟਾਬੇਸ ਪà©à©à¨›-ਗਿੱਛ ਦੀਆਂ ਹਿਦਾਇਤਾਂ ਵਿਚ ਦੋਸ਼ ਆਇਆ ਹੈ।
-ਹੋ ਸਕਦਾ ਹੈ ਇਹ ਦੋਸ਼ ਸਾਫ਼ਟਵੇਅਰ ਦਾ ਹੋਵੇ।
-ਡਾਟਾਬੇਸ ਪà©à¨›-ਗਿੱਛ ਦੀ ਆਖ਼ਰੀ ਕੋਸ਼ਿਸ਼ ਸੀ:
-<blockquote><code>$1</code></blockquote>
-"<code>$2</code>" ਫੰਕਸ਼ਨ ਵਿੱਚੋਂ।
-ਡਾਟਾਬੇਸ ਨੇ "<samp>$3: $4</samp>" ਦੋਸ਼ ਕੱਢਿਆ।',
-'dberrortextcl' => 'ਡੈਟਾਬੇਸ ਪà©à©±à¨›à¨—ਿੱਛ ਵਿਚ ਹਿਦਾਇਤ ਗਲਤੀ ਮਿਲੀ ਹੈ।
-ਫੰਕਸ਼ਨ "$2" ਤੋਂ ਪਿਛਲੀ ਡਾਟਬਾਸ ਪà©à©±à¨› ਗਿੱਛ ਸੀ: "$1".
-ਡੈਟਾਬੇਸ ਨੇ ਇਹ ਗਲਤੀ "$3:$4" ਦਿੱਤੀ',
'laggedslavemode' => "'''ਖ਼ਬਰਦਾਰ:''' ਹੋ ਸਕਦਾ ਹੈ ਸਫ਼ੇ ਵਿਚ ਤਾਜ਼ਾ ਤਬਦੀਲੀਆਂ ਸ਼ਾਮਲ ਨਾ ਹੋਣ।",
'readonly' => 'ਡਾਟਾਬੇਸ ਨੂੰ ਤਾਲ਼ਾ ਲੱਗਿਆ ਹੋਇਆ ਹੈ',
'enterlockreason' => 'ਤਾਲਾ-ਬੰਦੀ ਲਈ ਕਾਰਨ ਦਾਖ਼ਲ ਕਰੋ, ਨਾਲ਼ ਹੀ ਤਾਲਾ-ਬੰਦੀ ਦੇ ਰਿਲੀਜ਼ ਹੋਣ ਦਾ ਅੰਦਾਜ਼ਨ ਵਕਤ',
@@ -572,12 +566,15 @@ $1',
ਸਾਰੇ ਵਿਕੀਆਂ ਲਈ ਅਨà©à¨µà¨¾à¨¦ ਜੋੜਨ ਜਾਂ ਬਦਲਣ ਲਈ [//translatewiki.net/ translatewiki.net], ਮੀਡੀਆਵਿਕੀ ਸਥਾਨੀਕਰਨ ਪà©à¨°à©‹à¨œà©ˆà¨•à¨Ÿ ਦੀ ਵਰਤੋਂ ਕਰੋ ਜੀ।',
'editinginterface' => "'''ਚਿਤਾਵਨੀ''' ਤà©à¨¸à©€à¨‚ à¨à¨¸à©‡ ਸਫ਼ੇ ਨੂੰ ਬਦਲ ਰਹੇ ਹੋ ਜੋ ਸਾਫ਼ਟਵੇਅਰ ਇੰਟਰਫ਼ੇਸ ਦੇ ਮੂਲ ਪਾਠ ਲਈ ਵਰਤਿਆ ਗਿਆ ਹੈ।
ਇਸ ਸਫ਼ੇ ਵਿਚਲੀ ਤਬਦੀਲੀ ਦੂਜੇ ਵਰਤੋਂਕਾਰਾਂ ਲਈ ਵਰਤੇ ਜਾਣ ਵਾਲੇ ਇੰਟਰਫ਼ੇਸ ਦੀ ਸ਼ਕਲ ’ਤੇ ਅਸਰ ਪਾ ਦੇਵੇਗੀ। ਉਲਥਾ ਕਰਨ ਲਈ ਕਿਰਪਾ ਕਰਕੇ [//translatewiki.net/wiki/Main_Page?setlang=pa ਟà©à¨°à¨¾à¨‚ਸਲੇਟਵਿਕੀ.ਨੈਟ] ਦੀ ਵਰਤੋਂ ਕਰੋ, ਇਹ ਮੀਡੀਆਵਿਕੀ ਦੀ ਸਥਾਨੀਕਰਨ ਪà©à¨°à©‹à¨œà©ˆà¨•à¨Ÿ ਹੈ।",
-'sqlhidden' => '(SQL ਪà©à¨›-ਗਿੱਛ ਲà©à¨•à©€ ਹੋਈ ਹੈ)',
'cascadeprotected' => 'ਇਹ ਸਫ਼ਾ ਸà©à¨°à©±à¨–ਿਅਤ ਹੈ, ਕਿਉਂਕਿ ਇਹ ਹੇਠ ਲਿਖੇ {{PLURAL:$1|ਸਫ਼ੇ|ਸਫ਼ਿਆਂ}} ਦੀ ਸà©à¨°à©±à¨–ਿਆ-ਪੌੜੀ ਵਿੱਚ ਸ਼ਾਮਲ ਹੈ:
$2',
'namespaceprotected' => "ਤà©à¨¹à¨¾à¨¨à©‚à©° '''$1''' ਥਾਂ-ਨਾਮ ਵਾਲ਼ੇ ਸਫ਼ਿਆਂ ਵਿਚ ਫੇਰ-ਬਦਲ ਕਰਨ ਦੀ ਇਜਾਜ਼ਤ ਨਹੀਂ ਹੈ।",
'customcssprotected' => 'ਤà©à¨¹à¨¾à¨¨à©‚à©° ਇਸ CSS ਸਫ਼ੇ ਵਿਚ ਸੋਧ ਕਰਨ ਦੀ ਇਜਾਜ਼ਤ ਨਹੀਂ ਹੈ ਕਿਉਂਕਿ ਇਸ ਵਿਚ ਕਿਸੇ ਹੋਰ ਮੈਂਬਰ ਦੀਆਂ ਨਿੱਜੀ ਸੈਟਿੰਗਾਂ ਹਨ।',
'customjsprotected' => 'ਤà©à¨¹à¨¾à¨¨à©‚à©° ਇਸ CSS ਸਫ਼ੇ ਵਿਚ ਸੋਧ ਕਰਨ ਦੀ ਇਜਾਜ਼ਤ ਨਹੀਂ ਹੈ ਕਿਉਂਕਿ ਇਸ ਵਿਚ ਕਿਸੇ ਹੋਰ ਮੈਂਬਰ ਦੀਆਂ ਨਿੱਜੀ ਸੈਟਿੰਗਾਂ ਹਨ।',
+'mycustomcssprotected' => 'ਤà©à¨¹à¨¾à¨¨à©‚à©° ਇਸ CSS ਸਫ਼ੇ ਵਿੱਚ ਸੋਧ ਕਰਨ ਦੀ ਇਜਾਜ਼ਤ ਨਹੀਂ ਹੈ।',
+'mycustomjsprotected' => 'ਤà©à¨¹à¨¾à¨¨à©‚à©° ਇਸ ਜਾਵਾਸਕਰਿਪਟ ਸਫ਼ੇ ਵਿੱਚ ਸੋਧ ਕਰਨ ਦੀ ਇਜਾਜ਼ਤ ਨਹੀਂ ਹੈ।',
+'myprivateinfoprotected' => 'ਤà©à¨¹à¨¾à¨¨à©‚à©° ਆਪਣੀ ਨਿੱਜੀ ਜਾਣਕਾਰੀ ਵਿੱਚ ਸੋਧ ਕਰਨ ਦੀ ਇਜਾਜ਼ਤ ਨਹੀਂ ਹੈ।',
+'mypreferencesprotected' => 'ਤà©à¨¹à¨¾à¨¨à©‚à©° ਆਪਣੀਆਂ ਪਸੰਦਾਂ ਵਿੱਚ ਸੋਧ ਕਰਨ ਦੀ ਇਜਾਜ਼ਤ ਨਹੀਂ ਹੈ।',
'ns-specialprotected' => 'ਖ਼ਾਸ ਸਫ਼ਿਆਂ ’ਚ ਫੇਰ-ਬਦਲ ਨਹੀਂ ਹੋ ਸਕਦੇ।',
'titleprotected' => 'ਇਹ ਸਿਰਲੇਖ [[User:$1|$1]] ਵੱਲੋਂ ਸà©à¨°à©±à¨–ਿਅਤ ਕੀਤਾ ਗਿਆ ਹੈ ਅਤੇ ਵਰਤਿਆ ਨਹੀਂ ਜਾ ਸਕਦਾ। ਦਿੱਤਾ ਹੋਇਆ ਕਾਰਨ ਹੈ, "\'\'$2\'\'"।',
'filereadonlyerror' => '"$1" ਫ਼ਾਈਲ ਵਿੱਚ ਤਬਦੀਲੀ ਨਹੀਂ ਹੋ ਰਹੀ ਕਿਉਂਕਿ ਫ਼ਾਈਲ ਭੰਡਾਰ "$2" ਸਿਰਫ਼ ਪੜà©à¨¹à¨¨à¨¯à©‹à¨— ਰੂਪ ਵਿਚ ਹੈ।
@@ -601,10 +598,19 @@ $2',
'welcomeuser' => '$1 ਜੀ ਆਇਆਂ ਨੂੰ!',
'welcomecreation-msg' => 'ਤà©à¨¹à¨¾à¨¡à¨¾ ਖਾਤਾ ਬਣ ਚà©à©±à¨•à¨¾ ਹੈ। ਆਪਣੀਆਂ [[Special:Preferences|{{SITENAME}} ਪਸੰਦ]] ਬਦਲਣੀ ਨਾ ਭà©à©±à¨²à©‹à¥¤',
'yourname' => 'ਵਰਤੋਂਕਾਰ-ਨਾਂ:',
+'userlogin-yourname' => 'ਯੂਜ਼ਰ-ਨਾਂ',
+'userlogin-yourname-ph' => 'ਆਪਣਾ ਯੂਜ਼ਰ-ਨਾਂ ਭਰੋ',
+'createacct-another-username-ph' => 'ਯੂਜ਼ਰ ਨਾਂ ਦਿਓ',
'yourpassword' => 'ਪਾਸਵਰਡ:',
+'userlogin-yourpassword' => 'ਪਾਸਵਰਡ',
+'userlogin-yourpassword-ph' => 'ਆਪਣਾ ਪਾਸਵਰਡ ਦਿਉ',
+'createacct-yourpassword-ph' => 'ਪਾਸਵਰਡ ਦਿਉ',
'yourpasswordagain' => 'ਪਾਸਵਰਡ ਮà©à©œ ਲਿਖੋ:',
+'createacct-yourpasswordagain' => 'ਪਾਸਵਰਡ ਪà©à¨¸à¨¼à¨Ÿà©€',
+'createacct-yourpasswordagain-ph' => 'ਪਾਸਵਰਡ ਫੇਰ ਦਿਉ',
'remembermypassword' => 'ਇਸ ਕੰਪਿਊਟਰ ’ਤੇ ਮੇਰਾ ਦਾਖ਼ਲਾ ਯਾਦ ਰੱਖੋ (ਵੱਧ ਤੋਂ ਵੱਧ $1 {{PLURAL:$1|ਦਿਨ|ਦਿਨਾਂ}} ਲਈ)',
-'securelogin-stick-https' => 'ਦਾਖ਼ਲ ਕਰਨ ਮਗਰੋਂ HTTPS ਨਾਲ ਜà©à©œà©‡ ਰਹੋ',
+'userlogin-remembermypassword' => 'ਮੈਨੂੰ ਲਾਗਇਨ ਰੱਖੋ',
+'userlogin-signwithsecure' => 'ਸà©à¨°à©±à¨–ਿਅਤ ਕà©à¨¨à©ˆà¨•à¨¸à¨¼à¨¨ ਰੱਖੋ',
'yourdomainname' => 'ਤà©à¨¹à¨¾à¨¡à¨¾ ਡੋਮੇਨ:',
'password-change-forbidden' => 'ਇਸ ਵਿਕੀ ਤੇ ਤà©à¨¸à©€à¨‚ ਪਾਸਵਰਡ ਨਹੀਂ ਬਦਲ ਸਕਦੇ।',
'externaldberror' => 'ਜਾਂ ਤਾਂ ਪà©à¨°à¨®à¨¾à¨£à¨•à©€ ਡਾਟਾਬੇਸ ਦੋਸ਼ ਆਇਆ ਹੈ ਜਾਂ ਤà©à¨¹à¨¾à¨¨à©‚à©° ਆਪਣੇ ਬਾਹਰੀ ਖਾਤੇ ਨੂੰ ਅੱਪਡੇਟ ਕਰਨ ਦੀ ਇਜਾਜ਼ਤ ਨਹੀਂ ਹੈ।',
@@ -616,17 +622,40 @@ $2',
'logout' => 'ਲਾਗ ਆਉਟ',
'userlogout' => 'ਲਾਗ ਆਉਟ',
'notloggedin' => 'ਲਾਗਇਨ ਨਹੀਂ ਹੋ',
+'userlogin-noaccount' => 'ਖਾਤਾ ਨਹੀਂ ਹੈ?',
+'userlogin-joinproject' => '{{SITENAME}} ਦਾ ਹਿੱਸਾ ਬਣੋ',
'nologin' => 'ਖਾਤਾ ਨਹੀਂ ਹੈ? $1।',
'nologinlink' => 'ਖਾਤਾ ਬਣਾਓ',
'createaccount' => 'ਖਾਤਾ ਬਣਾਓ',
'gotaccount' => 'ਖਾਤਾ ਪਹਿਲਾਂ ਹੀ ਹੈ? $1',
'gotaccountlink' => 'ਲਾਗਇਨ',
'userlogin-resetlink' => 'ਆਪਣੀ ਲਾਗਇਨ ਜਾਣਕਾਰੀ ਭà©à©±à¨² ਗਠਹੋ?',
+'userlogin-resetpassword-link' => 'ਆਪਣਾ ਪਾਸਵਰਡ ਫੇਰ ਬਣਾਓ',
+'helplogin-url' => 'Help: ਲਾਗਇਨ ਕਰਨਾ',
+'userlogin-helplink' => '[[{{MediaWiki:helplogin-url}}|ਲਾਗਇਨ ਹੋਣ ਲਈ ਮੱਦਦ]]',
+'createacct-join' => 'ਆਪਣੀ ਜਾਣਕਾਰੀ ਹੇਠਾਂ ਦਿਉ।',
+'createacct-another-join' => 'ਆਪਣੇ ਅਕਾਊਂਟ ਦੀ ਜਾਣਕਾਰੀ ਹੇਠਾਂ ਦਿਉ।',
+'createacct-emailrequired' => 'ਈਮੇਲ ਪਤਾ',
+'createacct-emailoptional' => 'ਈਮੇਲ ਪਤਾ (ਚੋਣਵਾਂ)',
+'createacct-email-ph' => 'ਆਪਣਾ ਈਮੇਲ ਪਤਾ ਦਿਉ',
+'createacct-another-email-ph' => 'ਆਪਣਾ ਈਮੇਲ à¨à¨¡à¨°à©ˆà¨¸ ਦਿਓ',
'createaccountmail' => 'ਆਰਜ਼ੀ ਰਲ਼ਵਾਂ ਪਾਸਵਰਡ ਵਰਤੋਂ ਅਤੇ ਇਸ ਨੂੰ ਖਾਸ ਈਮੇਲ ਪਤੇ ਉੱਤੇ ਭੇਜ ਦਿਉ',
+'createacct-realname' => 'ਅਸਲੀ ਨਾਂ (ਚੋਣਵਾਂ)',
'createaccountreason' => 'ਕਾਰਨ:',
+'createacct-reason' => 'ਕਾਰਨ',
+'createacct-reason-ph' => 'ਤà©à¨¸à©€à¨‚ ਹੋਰ ਖਾਤਾ ਕਿਉਂ ਬਣਾ ਰਹੇ ਹੋ',
+'createacct-captcha' => 'ਸà©à¨°à©±à¨–ਿਆ ਜਾਂਚ',
+'createacct-imgcaptcha-ph' => 'ਉੱਤੇ ਵੇਖਾਈ ਦੇ ਰਿਹਾ ਸ਼ਬਦ ਦਿਉ',
+'createacct-submit' => 'ਆਪਣਾ ਖਾਤਾ ਬਣਾਓ',
+'createacct-another-submit' => 'ਹੋਰ ਖਾਤਾ ਬਣਾਓ',
+'createacct-benefit-heading' => '{{SITENAME}} ਨੂੰ ਤà©à¨¹à¨¾à¨¡à©‡ ਵਰਗੇ ਲੋਕਾਂ ਵਲੋਂ ਹੀ ਬਣਾਇਆ ਗਿਆ ਹੈ।',
+'createacct-benefit-body1' => '{{PLURAL:$1|ਸੋਧ|ਸੋਧਾਂ}}',
+'createacct-benefit-body2' => '{{PLURAL:$1|ਸਫ਼ਾ|ਸਫ਼ੇ}}',
+'createacct-benefit-body3' => 'ਹਾਲੀਆ {{PLURAL:$1|ਯੋਗਦਾਨੀ}}',
'badretype' => 'ਤà©à¨¹à¨¾à¨¡à©‡ ਵਲੋਂ ਦਿੱਤੇ ਪਾਸਵਰਡ ਮਿਲਦੇ ਨਹੀਂ ਹਨ।',
'userexists' => 'ਯੂਜ਼ਰ-ਨਾਂ ਪਹਿਲਾਂ ਹੀ ਮੌਜੂਦ ਹੈ। ਵੱਖਰਾ ਨਾਂ ਚà©à¨£à©‹ ਜੀ।',
'loginerror' => 'ਲਾਗਇਨ ਗਲਤੀ',
+'createacct-error' => 'ਖਾਤਾ ਬਣਾਉਣ ਵਿਚ ਗਲਤੀ',
'createaccounterror' => 'ਖਾਤਾ ਬਣਾਇਆ ਨਹੀਂ ਜਾ ਸਕਿਆ: $1',
'nocookiesnew' => 'ਯੂਜ਼ਰ ਅਕਾਊਂਟ ਬਣਾਇਆ ਗਿਆ ਹੈ, ਪਰ ਤà©à¨¸à©€à¨‚ ਲਾਗਇਨ ਨਹੀਂ ਕੀਤਾ ਹੈ।{{SITENAME}} uses cookies to log in users. You have cookies disabled. Please enable them, then log in with your new username and password.',
'nocookieslogin' => '{{SITENAME}} ਯੂਜ਼ਰਾਂ ਨੂੰ ਲਾਗਇਨ ਕਰਨ ਲਈ ਕੂਕੀਜ਼ ਵਰਤਦੀ ਹੈ। ਤà©à¨¹à¨¾à¨¡à©‡ ਕੂਕੀਜ਼ ਆਯੋਗ ਕੀਤੇ ਹੋਠਹਨ। ਉਨà©à¨¹à¨¾à¨‚ ਨੂੰ ਯੋਗ ਕਰਕੇ ਮà©à©œ ਟਰਾਈ ਕਰੋ।',
@@ -682,7 +711,7 @@ $2',
ਜੇ ਇਹ ਖਾਤਾ ਗ਼ਲਤੀ ਨਾਲ਼ ਬਣ ਗਿਆ ਹੈ ਤਾਂ ਤà©à¨¸à©€à¨‚ ਇਸ ਸà©à¨¨à©‡à¨¹à©‡ ਨੂੰ ਨਜ਼ਰਅੰਦਾਜ਼ ਕਰ ਸਕਦੇ ਹੋ।',
'usernamehasherror' => 'ਵਰਤੋਂਕਾਰ ਦੇ ਨਾਂ ਵਿਚ ਹੈਸ਼ ਅੱਖਰ ਨਹੀਂ ਹੋ ਸਕਦੇ',
'login-throttled' => 'ਤà©à¨¸à©€à¨‚ ਬਹà©à¨¤ ਸਾਰੀਆਂ ਤਾਜ਼ਾ ਲਾਗਇਨ ਕੋਸ਼ਿਸ਼ਾਂ ਕੀਤੀਆਂ ਹਨ।
-ਮਿਹਰਬਾਨੀ ਕਰਕੇ ਦà©à¨¬à¨¾à¨°à¨¾ ਕੋਸ਼ਿਸ਼ ਕਰਨ ਤੋਂ ਪਹਿਲਾਂ ਥੋੜੀ ਉਡੀਕ ਕਰੋ।',
+ਫੇਰ ਕੋਸ਼ਿਸ਼ ਕਰਨ ਤੋਂ ਪਹਿਲਾਂ ਥੋੜà©à¨¹à©€ ਉਡੀਕ ਕਰੋ ਜੀ।',
'login-abort-generic' => 'ਤà©à¨¹à¨¾à¨¡à¨¾ ਦਾਖ਼ਲਾ ਨਾਕਾਮ ਸੀ - ਅਧੂਰਾ ਛੱਡਿਆ',
'loginlanguagelabel' => 'ਭਾਸ਼ਾ: $1',
'suspicious-userlogout' => 'ਤà©à¨¹à¨¾à¨¡à©€ ਵਿਦਾਇਗੀ ਦੀ ਬੇਨਤੀ ਨਕਾਰ ਦਿੱਤੀ ਗਈ ਕਿਉਂਕਿ ਲੱਗਦਾ ਹੈ ਕਿ ਇਹ ਕਿਸੇ ਟà©à©±à¨Ÿà©‡ ਹੋਠਬਰਾਊਜ਼ਰ ਜਾਂ ਕੈਸ਼ ਹੋਈ ਪà©à¨°à¨¾à¨•à¨¸à©€ ਤੋਂ ਭੇਜੀ ਗਈ ਸੀ।',
@@ -700,7 +729,7 @@ $2',
'newpassword' => 'ਨਵਾਂ ਪਾਸਵਰਡ:',
'retypenew' => 'ਨਵਾਂ ਪਾਸਵਰਡ ਮà©à©œ-ਲਿਖੋ:',
'resetpass_submit' => 'ਪਾਸਵਰਡ ਸੈੱਟ ਕਰੋ ਅਤੇ ਲਾਗਇਨ ਕਰੋ',
-'resetpass_success' => 'ਤà©à¨¹à¨¾à¨¡à¨¾ ਪਾਸਵਰਡ ਠੀਕ ਤਰਾਂ ਬਦਲਿਆ ਗਿਆ ਹੈ! ਹà©à¨£ ਤà©à¨¸à©€à¨‚ ਲਾਗਇਨ ਕਰ ਸਕਦੇ ਹੋ...',
+'changepassword-success' => 'ਤà©à¨¹à¨¾à¨¡à¨¾ ਪਾਸਵਰਡ ਠੀਕ ਤਰà©à¨¹à¨¾à¨‚ ਬਦਲਿਆ ਜਾ ਚà©à©±à¨•à¨¾ ਹੈ!',
'resetpass_forbidden' => 'ਪਾਸਵਰਡ ਬਦਲਿਆ ਨਹੀਂ ਜਾ ਸਕਦਾ',
'resetpass-no-info' => 'ਇਸ ਸਫ਼ੇ ਨੂੰ ਸਿੱਧੇ ਹੀ ਵੇਖਣ ਲਈ ਤà©à¨¹à¨¾à¨¨à©‚à©° ਲਾਗਇਨ ਕਰਨਾ ਪਵੇਗਾ।',
'resetpass-submit-loggedin' => 'ਪਾਸਵਰਡ ਬਦਲੋ',
@@ -712,10 +741,11 @@ $2',
# Special:PasswordReset
'passwordreset' => 'ਪਾਸਵਰਡ ਮà©à©œ-ਸੈੱਟ ਕਰੋ',
-'passwordreset-text' => 'ਆਪਣਾ ਪਾਸਵਰਡ ਮà©à©œ-ਸੈੱਟ ਕਰਨ ਲਈ ਇਹ ਫਾਰਮ ਪੂਰਾ ਕਰੋ।',
+'passwordreset-text-one' => 'ਪਾਸਵਰਡ ਦà©à¨¬à¨¾à¨°à¨¾ ਬਣਾਉਣ ਲਈ ਇਹ ਫ਼ਾਰਮ ਭਰੋ।',
+'passwordreset-text-many' => '{{PLURAL:$1|ਆਪਣਾ ਪਾਸਵਰਡ ਮà©à©œ ਬਣਾਉਣ ਲਈ ਕੋਈ ਇੱਕ ਥਾਂ ਭਰੋ।}}',
'passwordreset-legend' => 'ਪਾਸਵਰਡ ਮà©à©œ-ਸੈੱਟ ਕਰੋ',
'passwordreset-disabled' => 'ਇਸ ਵਿਕੀ ਤੇ ਪਾਸਵਰਡ ਰੀਸੈੱਟ ਬੰਦ ਕੀਤੇ ਗਠਹਨ।',
-'passwordreset-pretext' => '{{PLURAL:$1||ਹੇਠਾਂ ਸਮੱਗਰੀ ਦੀ ਕੋਈ ਇੱਕ ਵਸਤੂ ਭਰੋ}}',
+'passwordreset-emaildisabled' => 'ਇਹ ਵਿਕਿ ਉੱਤੇ ਈਮੇਲ ਫੀਚਰ ਬੰਦ ਕੀਤਾ ਹੋਇਆ ਹੈ।',
'passwordreset-username' => 'ਯੂਜ਼ਰ-ਨਾਂ:',
'passwordreset-domain' => 'ਡੋਮੇਨ:',
'passwordreset-capture' => 'ਨਤੀਜੇ ਵਜੋਂ ਬਣਦੀ ਈਮੇਲ ਵੇਖੋ?',
@@ -747,6 +777,9 @@ $2
'changeemail-submit' => 'ਈ-ਮੇਲ ਬਦਲੋ',
'changeemail-cancel' => 'ਰੱਦ ਕਰੋ',
+# Special:ResetTokens
+'resettokens' => 'ਟੋਕਨ ਮà©à©œ-ਸੈੱਟ ਕਰੋ',
+
# Edit page toolbar
'bold_sample' => 'ਗੂੜੀ ਲਿਖਤ',
'bold_tip' => 'ਗੂੜੇ ਅੱਖਰ',
@@ -889,11 +922,13 @@ $1 ਲà©à¨•à¨µà©€à¨†à¨‚ ਸ਼à©à¨°à©‡à¨£à©€à¨†à¨‚}} ਦਾ ਮੈਂਬਰ à¨
ਜਾਪਦਾ ਹੈ ਕਿ ਇਹ ਹਟਾਇਆ ਜਾ ਚà©à©±à¨•à¨¾ ਹੈ।',
'edit-conflict' => 'ਸੋਧ ਤਕਰਾਰ',
'edit-no-change' => 'ਤà©à¨¹à¨¾à¨¡à©€ ਸੋਧ ਨਜ਼ਰਅੰਦਾਜ਼ ਕਰ ਦਿੱਤੀ ਗਈ ਹੈ ਕਿਉਂਕਿ ਲਿਖਤ ਵਿਚ ਕੋਈ ਤਬਦੀਲੀ ਨਹੀਂ ਕੀਤੀ ਗਈ।',
+'postedit-confirmation' => 'ਤà©à¨¹à¨¾à¨¡à©€ ਸੋਧ ਸਾਂਭੀ ਗਈ ਹੈ।',
'edit-already-exists' => 'ਨਵਾਂ ਸਫ਼ਾ ਨਹੀਂ ਬਣਾਇਆ ਜਾ ਸਕਿਆ।
ਇਹ ਪਹਿਲਾਂ ਹੀ ਮੌਜੂਦ ਹੈ।',
'defaultmessagetext' => 'ਮੂਲ ਸੰਦੇਸ਼ ਲਿਖਤ',
'invalid-content-data' => 'ਗ਼ਲਤ ਸਮੱਗਰੀ',
'content-not-allowed-here' => '"$1" ਸਮੱਗਰੀ ਨੂੰ [[$2]] ਉੱਤੇ ਇਜਾਜ਼ਤ ਨਹੀਂ ਹੈ',
+'editwarning-warning' => 'ਇਹ ਸਫ਼ਾ ਛੱਡਣ ਕਰਕੇ ਤà©à¨¹à¨¾à¨¡à©‡ ਵੱਲੋਂ ਕੀਤੀਆਂ ਸੋਧਾਂ ਗà©à©°à¨® ਹੋ ਸਕਦੀਆਂ ਹਨ। ਜੇਕਰ ਤà©à¨¸à©€à¨‚ ਦਾਖ਼ਲਾ ਲਿਆ ਹੋਇਆ ਹੈ ਤਾਂ ਤà©à¨¸à©€à¨‚ ਇਸ ਚਿਤਾਵਨੀ ਨੂੰ ਆਪਣੀਆਂ ਪਸੰਦਾਂ ਦੇ "ਸੰਪਾਦਨ" ਭਾਗ ਵਿਚ ਜਾ ਕੇ ਬੰਦ ਕਰ ਸਕਦੇ ਹੋ।',
# Content models
'content-model-wikitext' => 'ਵਿਕੀਲਿਖਤ',
@@ -914,6 +949,7 @@ $1 ਲà©à¨•à¨µà©€à¨†à¨‚ ਸ਼à©à¨°à©‡à¨£à©€à¨†à¨‚}} ਦਾ ਮੈਂਬਰ à¨
ਮਿਹਰਬਾਨੀ ਕਰਕੇ ਇਹ ਤਸਦੀਕ ਕਰਨ ਲਈ ਹੇਠਲੀ ਤà©à¨²à¨¨à¨¾ ਜਾਂਚੋ ਕਿ ਇਹ ਓਹੀ ਹੈ ਜੋ ਤà©à¨¸à©€à¨‚ ਕਰਨਾ ਚਾਹà©à©°à¨¦à©‡ ਹੋ ਅਤੇ ਫਿਰ ਸੋਧ ਨਕਾਰਨ ਲਈ ਤਬਦੀਲੀਆਂ ਸਾਂਭ ਦਿਓ।',
'undo-norev' => 'ਸੋਧ ਨਕਾਰੀ ਨਹੀਂ ਜਾ ਸਕਦੀ ਕਿਉਂਕਿ ਇਹ ਮੌਜੂਦ ਨਹੀਂ ਜਾਂ ਮਿਟਾ ਦਿੱਤੀ ਗਈ ਹੈ।',
'undo-summary' => '[[Special:Contributions/$2|$2]] ([[User talk:$2|ਗੱਲ-ਬਾਤ]]) ਦੀ ਸੋਧ $1 ਨਕਾਰੀ',
+'undo-summary-username-hidden' => 'ਗà©à¨ªà¨¤ ਵਰਤੋਂਕਾਰ ਵੱਲੋਂ ਕੀਤੀ $1 ਸੋਧ ਰੱਦ ਕਰੋ',
# Account creation failure
'cantcreateaccounttitle' => 'ਖਾਤਾ ਬਣਾਇਆ ਨਹੀਂ ਜਾ ਸਕਦਾ',
@@ -1074,7 +1110,6 @@ page={{FULLPAGENAMEE}}}} ਜ਼ਬਤੀ ਦੇ ਚਿੱਠੇ] ਵਿਚ ਵà©
'searchmenu-legend' => 'ਖੋਜ-ਸਬੰਧੀ ਚੋਣਾਂ',
'searchmenu-exists' => "'''ਇਸ ਵਿਕੀ ’ਤੇ \"[[:\$1]]\" ਨਾਮ ਦਾ ਸਫਾ ਹੈ।'''",
'searchmenu-new' => "'''ਇਸ ਵਿਕੀ ’ਤੇ \"[[:\$1]]\" ਸਫ਼ਾ ਬਣਾਓ!'''",
-'searchhelp-url' => 'Help:ਸਮੱਗਰੀ',
'searchmenu-prefix' => '[[Special:PrefixIndex/$1|ਇਸ ਅਗੇਤਰ ਵਾਲ਼ੇ ਸਫ਼ੇ ਵੇਖੋ]]',
'searchprofile-articles' => 'ਸਮੱਗਰੀ ਸਫ਼ੇ',
'searchprofile-project' => 'ਮਦਦ ਤੇ ਪਰੋਜੈਕਟ ਸਫ਼ੇ',
@@ -1115,15 +1150,7 @@ $3|'''1''' ਨਤੀਜਾ|'''$3''' ਨਤੀਜੇ}} ਵਖਾਓ।",
'powersearch-toggleall' => 'ਸਭ',
'powersearch-togglenone' => 'ਕੋਈ ਨਹੀਂ',
'search-external' => 'ਬਾਹਰੀ ਖੋਜ',
-
-# Quickbar
-'qbsettings' => 'ਤà©à¨°à©°à¨¤ ਬਾਰ',
-'qbsettings-none' => 'ਕੋਈ ਨਹੀਂ',
-'qbsettings-fixedleft' => 'ਖੱਬੇ ਪਾਸੇ ਮੜà©à¨¹à¨¿à¨†',
-'qbsettings-fixedright' => 'ਸੱਜੇ ਪਾਸੇ ਮੜà©à¨¹à¨¿à¨†',
-'qbsettings-floatingleft' => 'ਖੱਬੇ ਪਾਸੇ ਤੈਰਦਾ',
-'qbsettings-floatingright' => 'ਸੱਜੇ ਪਾਸੇ ਤੈਰਦਾ',
-'qbsettings-directionality' => 'ਤà©à¨¹à¨¾à¨¡à©€ ਭਾਸ਼ਾ ਦੀ ਲਿਪੀ ਦਿਸ਼ਾ ਮà©à¨¤à¨¾à¨¬à¨• ਮੜà©à¨¹à¨¿à¨† ਗਿਆ',
+'search-error' => 'ਖੋਜ ਕਰਦੇ ਵਕਤ ਇੱਕ ਦੋਸ਼ ਮਿਲਿਆ:$1',
# Preferences page
'preferences' => 'ਪਸੰਦਾਂ',
@@ -1157,7 +1184,6 @@ $3|'''1''' ਨਤੀਜਾ|'''$3''' ਨਤੀਜੇ}} ਵਖਾਓ।",
'resetprefs' => 'ਅਣ-ਸਾਂਭੀਆਂ ਤਬਦੀਲੀਆਂ ਸਾਫ਼ ਕਰੋ',
'restoreprefs' => 'ਸਭ ਮੂਲ ਸੈਟਿੰਗਾਂ ਮੋੜ ਲਿਆਓ',
'prefs-editing' => 'ਸੋਧ ਜਾਰੀ',
-'prefs-edit-boxsize' => 'ਸੋਧ ਖਿੜਕੀ ਦਾ ਅਕਾਰ',
'rows' => 'ਕਤਾਰਾਂ:',
'columns' => 'ਕਾਲਮ:',
'searchresultshead' => 'ਖੋਜ',
@@ -1195,7 +1221,6 @@ $3|'''1''' ਨਤੀਜਾ|'''$3''' ਨਤੀਜੇ}} ਵਖਾਓ।",
'prefs-custom-js' => 'ਰਿਵਾਇਤੀ ਜਾਵਾਸਕਰਿਪਟ',
'prefs-common-css-js' => 'ਸਾਰੀਆਂ ਸਕਿਨਾਂ ਲਈ ਸਾਂà¨à¨¾ CSS/ਜਾਵਾਸਕਰਿਪਟ:',
'prefs-emailconfirm-label' => 'ਈ-ਮੇਲ ਪà©à¨¸à¨¼à¨Ÿà©€:',
-'prefs-textboxsize' => 'ਸੋਧ ਖਿੜਕੀ ਦਾ ਅਕਾਰ',
'youremail' => 'ਈ-ਮੇਲ:',
'username' => '{{GENDER:$1|ਯੂਜ਼ਰਨਾਂ}}:',
'uid' => '{{GENDER:$1|User}} ਆਈਡੀ:',
@@ -1225,6 +1250,8 @@ HTML ਟੈਗ ਚੈੱਕ ਕਰੋ।',
'prefs-dateformat' => 'ਮਿਤੀ ਦਾ ਅੰਦਾਜ਼',
'prefs-timeoffset' => 'ਸਮੇਂ ਦਾ ਆਫ਼ਸੈੱਟ',
'prefs-advancedediting' => 'ਆਮ ਚੋਣਾਂ',
+'prefs-editor' => 'ਸੰਪਾਦਕ',
+'prefs-preview' => 'à¨à¨²à¨•',
'prefs-advancedrc' => 'ਤਕਨੀਕੀ ਚੋਣਾਂ',
'prefs-advancedrendering' => 'ਤਕਨੀਕੀ ਚੋਣਾਂ',
'prefs-advancedsearchoptions' => 'ਤਕਨੀਕੀ ਚੋਣਾਂ',
@@ -1299,6 +1326,11 @@ HTML ਟੈਗ ਚੈੱਕ ਕਰੋ।',
'right-editinterface' => 'ਵਰਤੋਂਕਾਰ ਇੰਟਰਫ਼ੇਸ ਸੋਧੋ',
'right-editusercss' => 'ਹੋਰ ਵਰਤੋਂਕਾਰਾਂ ਦੀਆਂ CSS ਫ਼ਾਈਲਾਂ ਸੋਧਣ',
'right-edituserjs' => 'ਹੋਰ ਵਰਤੋਂਕਾਰਾਂ ਦੀਆਂ ਜਾਵਾਸਕਰਿਪਟ ਫ਼ਾਈਲਾਂ ਸੋਧਣ',
+'right-editmyusercss' => 'ਆਪਣੀਆਂ ਵਰਤੋਂਕਾਰ CSS ਫ਼ਾਈਲਾਂ ਸੋਧੋ',
+'right-editmyuserjs' => 'ਆਪਣੀਆਂ ਵਰਤੋਂਕਾਰ ਜਾਵਾਸਕਰਿਪਟ ਫ਼ਾਈਲਾਂ ਸੋਧੋ',
+'right-viewmywatchlist' => 'ਆਪਣੀ ਨਿਗਰਾਨੀ-ਲਿਸਟ ਵੇਖੋ',
+'right-editmywatchlist' => 'ਆਪਣੀ ਨਿਗਰਾਨੀ-ਲਿਸਟ ਸੋਧੋ। ਧਿਆਨ ਦਿਓ ਕਿ ਕà©à¨ ਸਫ਼ੇ ਇਸ ਹੱਕ ਤੋਂ ਬਿਨਾਂ ਵੀ ਜà©à©œà¨¨à¨—ੇ।',
+'right-editmyoptions' => 'ਆਪਣੀਆਂ ਪਸੰਦਾਂ ਸੋਧੋ',
'right-unwatchedpages' => 'ਨਜ਼ਰ ਨਾ ਰੱਖੇ ਜਾ ਰਹੇ ਸਫ਼ਿਆਂ ਦੀ ਲਿਸਟ ਵੇਖਣੀ',
'right-mergehistory' => 'ਸਫ਼ਿਆਂ ਦੇ ਅਤੀਤਾਂ ਨੂੰ ਰਲ਼ਾਉਣਾ',
'right-userrights' => 'ਸਾਰੇ ਵਰਤੋਂਕਾਰਾਂ ਦੇ ਹੱਕ ਬਦਲਣੇ',
@@ -1347,6 +1379,10 @@ HTML ਟੈਗ ਚੈੱਕ ਕਰੋ।',
'action-userrights-interwiki' => 'ਦੂਜੇ ਵਿਕੀਆਂ ਦੇ ਵਰਤੋਂਕਾਰਾਂ ਦੇ ਵਰਤੋਂਕਾਰ-ਹੱਕ ਸੋਧਣ',
'action-siteadmin' => 'ਡਾਟਾਬੇਸ ਨੂੰ ਤਾਲਾ ਲਾਓ ਜਾਂ ਖੋਲà©à¨¹à©‹',
'action-sendemail' => 'ਈ-ਮੇਲਾਂ ਭੇਜੋ',
+'action-editmywatchlist' => 'ਆਪਣੀ ਨਿਗਰਾਨੀ-ਲਿਸਟ ਸੋਧੋ',
+'action-viewmywatchlist' => 'ਆਪਣੀ ਨਿਗਰਾਨੀ-ਲਿਸਟ ਵੇਖੋ',
+'action-viewmyprivateinfo' => 'ਆਪਣੀ ਨਿੱਜੀ ਜਾਣਕਾਰੀ ਵੇਖੋ',
+'action-editmyprivateinfo' => 'ਆਪਣੀ ਨਿੱਜੀ ਜਾਣਕਾਰੀ ਸੋਧੋ',
# Recent changes
'nchanges' => '$1 {{PLURAL:$1|ਤਬਦੀਲੀ|ਤਬਦੀਲੀਆਂ}}',
@@ -1387,7 +1423,6 @@ HTML ਟੈਗ ਚੈੱਕ ਕਰੋ।',
'recentchangeslinked-feed' => 'ਸਬੰਧਤ ਤਬਦੀਲੀਆਂ',
'recentchangeslinked-toolbox' => 'ਸਬੰਧਤ ਤਬਦੀਲੀਆਂ',
'recentchangeslinked-title' => '"$1" ਨਾਲ ਸਬੰਧਤ ਤਬਦੀਲੀਆਂ',
-'recentchangeslinked-noresult' => 'ਜà©à©œà©‡ ਪੰਨਿਆਂ ’ਤੇ, ਦਿੱਤੇ ਸਮੇਂ ’ਚ ਕੋਈ ਬਦਲਾਵ ਨਹੀਂ ਹੋਈ।',
'recentchangeslinked-summary' => 'ਇਹ ਕਿਸੇ ਖ਼ਾਸ ਸਫ਼ੇ ਤੋਂ ਲਿੰਕ ਕੀਤੇ ਸਫ਼ਿਆਂ (ਜਾਂ ਕਿਸੇ ਖ਼ਾਸ ਸ਼à©à¨°à©‡à¨£à©€ ਦੇ ਮੈਂਬਰਾਂ) ਵਿੱਚ ਹੋਈਆਂ ਤਾਜ਼ਾ ਤਬਦੀਲੀਆਂ ਦੀ ਲਿਸਟ ਹੈ। [[Special:Watchlist|ਤà©à¨¹à¨¾à¨¡à©€ ਨਿਗਰਾਨੀ-ਲਿਸਟ]] ਵਿੱਚ ਮੌਜੂਦ ਸਫ਼ੇ ਮੋਟੇ ਅੱਖਰਾਂ ਵਿੱਚ ਵਖਾਈ ਦੇਣਗੇ।',
'recentchangeslinked-page' => 'ਸਫ਼ੇ ਦਾ ਨਾਂ:',
'recentchangeslinked-to' => 'ਇਹਦੇ ਬਦਲੇ ਇਸ ਸਫ਼ੇ ਨਾਲ ਜà©à©œà©‡ ਸਫ਼ਿਆਂ ਵਿੱਚ ਹੋਈਆਂ ਤਬਦੀਲੀਆਂ ਵਿਖਾਓ',
@@ -1398,8 +1433,7 @@ HTML ਟੈਗ ਚੈੱਕ ਕਰੋ।',
'reuploaddesc' => 'ਅੱਪਲੋਡ ਫਾਰਮ ਉੱਤੇ ਜਾਓ।',
'upload-tryagain' => 'ਬਦਲਿਆ ਹੋਇਆ ਫ਼ਾਈਲ ਵੇਰਵਾ ਪੇਸ਼ ਕਰੋ',
'uploadnologin' => 'ਦਾਖ਼ਲ ਨਹੀਂ ਹੋ',
-'uploadnologintext' => 'ਤà©à¨¹à¨¾à¨¨à©‚à©°[[Special:UserLogin|logged in] ਕਰਨਾ ਪਵੇਗਾ]
-to upload files.',
+'uploadnologintext' => 'ਫ਼ਾਈਲਾਂ ਅੱਪਲੋਡ ਕਰਨ ਲਈ ਤà©à¨¹à¨¾à¨¨à©‚à©° $1 ਕਰਨਾ ਪਵੇਗਾ।',
'uploaderror' => 'ਅੱਪਲੋਡ ਗਲਤੀ',
'upload-recreate-warning' => "'''ਖ਼ਬਰਦਾਰ: ਇਸ ਨਾਮ ਦੀ ਫ਼ਾਈਲ ਮਿਟਾਈ ਜਾਂ ਹੋਰ ਨਾਮ ਤੇ ਭੇਜੀ ਜਾ ਚà©à©±à¨•à©€ ਹੈ।'''
ਮਿਟਾਉਣ ਅਤੇ ਭੇਜੇ ਜਾਣ ਦਾ ਚਿੱਠਾ ਸਹੂਲਤ ਲਈ ਇੱਥੇ ਦਿੱਤਾ ਗਿਆ ਹੈ:",
@@ -1604,9 +1638,6 @@ to upload files.',
'statistics-users-active-desc' => 'ਮੈਂਬਰ, ਜਿੰਨà©à¨¹à¨¾ ਨੇ ਆਖ਼ਰੀ {{PLURAL:$1|ਦਿਨ|$1 ਦਿਨਾਂ}} ਵਿਚ ਕੋਈ ਕੰਮ ਕੀਤਾ ਹੈ।',
'statistics-mostpopular' => 'ਸਭ ਤੋਂ ਵੱਧ ਵੇਖੇ ਸਫ਼ੇ',
-'disambiguations' => 'ਗà©à©°à¨à¨²-ਖੋਲà©à¨¹ ਸਫ਼ਿਆਂ ਨਾਲ਼ ਜà©à©œà¨¦à©‡ ਸਫ਼ੇ',
-'disambiguationspage' => 'Template:ਗà©à©°à¨à¨² ਖੋਲà©à¨¹',
-
'pageswithprop-submit' => 'ਜਾਉ',
'doubleredirects' => 'ਦੋਹਰੇ ਰੀਡਿਰੈਕਟ',
@@ -1801,7 +1832,6 @@ to upload files.',
'unwatchthispage' => 'ਨਜ਼ਰ ਰੱਖਣੀ ਬੰਦ ਕਰੋ',
'notanarticle' => 'ਕੋਈ ਸਮੱਗਰੀ ਸਫ਼ਾ ਨਹੀਂ ਹੈ',
'notvisiblerev' => 'ਇੱਕ ਵੱਖਰੇ ਮੈਂਬਰ ਦੀ ਬਣਾਈ ਆਖ਼ਰੀ ਰੀਵਿਜ਼ਨ ਮਿਟਾਈ ਜਾ ਚà©à©±à¨•à©€ ਹੈ',
-'watchnochange' => 'ਵਖਾਠਜਾ ਰਹੇ ਸਮੇਂ ਅੰਦਰ ਤà©à¨¹à¨¾à¨¡à©€ ਨਿਗਰਾਨੀ-ਲਿਸਟ ਵਿਚਲਾ ਕੋਈ ਵੀ ਸਫ਼ਾ ਸੋਧਿਆ ਨਹੀਂ ਗਿਆ।',
'watchlist-details' => 'ਗੱਲ-ਬਾਤ ਸਫ਼ੇ ਨਾ ਗਿਣਦੇ ਹੋà¨, ਤà©à¨¹à¨¾à¨¡à©€ ਨਿਗਰਾਨੀ-ਸੂਚੀ ਵਿਚ{{PLURAL:$1|$1 ਸਫ਼ਾ ਹੈ|$1 ਸਫ਼ੇ ਹਨ}}।',
'watchlistcontains' => 'ਤà©à¨¹à¨¾à¨¡à©€ ਨਿਗਰਾਨੀ-ਲਿਸਟ ਵਿਚ $1 {{PLURAL:$1|ਸਫ਼ਾ ਹੈ|ਸਫ਼ੇ ਹਨ}}।',
'wlnote' => "$3, $4 ਮà©à¨¤à¨¾à¨¬à¨• ਆਖ਼ਰੀ {{PLURAL:$2|ਘੰਟੇ|'''$2''' ਘੰਟਿਆਂ}} ਵਿਚ {{PLURAL:
@@ -2051,8 +2081,6 @@ $1|ਤਬਦੀਲੀ ਹੋਈ|'''$1''' ਤਬਦੀਲੀਆਂ ਹੋਈਆà¨
'ipb-otherblocks-header' => 'ਹੋਰ {{PLURAL:$1|ਪਾਬੰਦੀ|ਪਾਬੰਦੀਆਂ}}',
'unblock-hideuser' => 'ਤà©à¨¸à©€à¨‚ ਇਸ ਮੈਂਬਰ ’ਤੇ ਪਾਬੰਦੀ ਨਹੀਂ ਲਾ ਸਕਦੇ ਕਿਉਂਕਿ ਇਸਦਾ ਮੈਂਬਰ-ਨਾਂ ਲà©à¨•à¨¾à¨‡à¨† ਹੋਇਆ ਹੈ।',
'ipb_cant_unblock' => 'ਗ਼ਲਤੀ: ਪਾਬੰਦੀ ਪਤਾ $1 ਨਹੀਂ ਲੱਭਿਆ। ਸ਼ਾਇਦ ਇਹ ਪਹਿਲਾਂ ਹੀ ਪਾਬੰਦੀ-ਮà©à¨•à¨¤ ਹੋ ਚà©à©±à¨•à¨¾ ਹੈ।',
-'blockme' => 'ਮੇਰੇ ’ਤੇ ਪਾਬੰਦੀ ਲਾਓ',
-'proxyblocksuccess' => 'ਪੂਰਾ ਹੋਇਆ',
'cant-block-while-blocked' => 'ਤà©à¨¸à©€à¨‚ ਦੂਜੇ ਮੈਂਬਰਾਂ ’ਤੇ ਪਾਬੰਦੀ ਨਹੀਂ ਲਾ ਸਕਦੇ ਜਦੋਂ ਤà©à¨¸à©€à¨‚ ਖ਼à©à¨¦ ਪਾਬੰਦੀਸ਼à©à¨¦à¨¾ ਹੋ।',
'ipbblocked' => 'ਤà©à¨¸à©€à¨‚ ਦੂਜੇ ਮੈਂਬਰਾਂ ਨੂੰ ਪਾਬੰਦੀਸ਼à©à¨¦à¨¾ ਜਾਂ ਪਾਬੰਦੀ-ਮà©à¨•à¨¤ ਨਹੀਂ ਕਰ ਸਕਦੇ ਕਿਉਂਕਿ ਤà©à¨¸à©€à¨‚ ਖ਼à©à¨¦ ਪਾਬੰਦੀਸ਼à©à¨¦à¨¾ ਹੋ',
'ipbnounblockself' => 'ਤà©à¨¹à¨¾à¨¨à©‚à©° ਖ਼à©à¨¦ ਨੂੰ ਪਾਬੰਦੀ-ਮà©à¨•à¨¤ ਕਰਨ ਦੀ ਇਜਾਜ਼ਤ ਨਹੀਂ ਹੈ',
@@ -2249,11 +2277,7 @@ $1|ਤਬਦੀਲੀ ਹੋਈ|'''$1''' ਤਬਦੀਲੀਆਂ ਹੋਈਆà¨
'pageinfo-category-files' => 'ਫ਼ਾਈਲਾਂ ਦੀ ਗਿਣਤੀ',
# Skin names
-'skinname-standard' => 'ਕਲਾਸਿਕ',
'skinname-monobook' => 'ਮੋਨੋਬà©à©±à¨•',
-'skinname-myskin' => 'ਮੇਰੀਸਕਿਨ',
-'skinname-chick' => 'ਚੀਚਕ',
-'skinname-simple' => 'ਸੈਂਪਲ',
# Browsing diffs
'previousdiff' => '↠ਪà©à¨°à¨¾à¨£à©€ ਤਬਦੀਲੀ',
@@ -2280,11 +2304,25 @@ $1|ਤਬਦੀਲੀ ਹੋਈ|'''$1''' ਤਬਦੀਲੀਆਂ ਹੋਈਆà¨
'minutes' => '{{PLURAL:$1|$1 ਮਿੰਟ}}',
'hours' => '{{PLURAL:$1|$1 ਘੰਟਾ|$1 ਘੰਟੇ}}',
'days' => '{{PLURAL:$1|$1 ਦਿਨ}}',
+'weeks' => '{{PLURAL:$1|$1 ਹਫ਼ਤਾ|$1 ਹਫ਼ਤੇ}}',
'months' => '{{PLURAL:$1|$1 ਮਹੀਨਾ|$1 ਮਹੀਨੇ}}',
'years' => '{{PLURAL:$1|$1 ਵਰà©à¨¹à¨¾|$1 ਵਰà©à¨¹à©‡}}',
'ago' => '$1 ਪਹਿਲਾਂ',
'just-now' => 'ਹà©à¨£à©‡',
+# Human-readable timestamps
+'hours-ago' => '$1 {{PLURAL:$1|ਘੰਟਾ|ਘੰਟੇ}} ਪਹਿਲਾਂ',
+'minutes-ago' => '$1 {{PLURAL:$1|ਮਿੰਟ}} ਪਹਿਲਾਂ',
+'seconds-ago' => '$1 {{PLURAL:$1|ਸਕਿੰਟ}} ਪਹਿਲਾਂ',
+'monday-at' => 'ਸੋਮਵਾਰ ਨੂੰ $1 ਵਜੇ',
+'tuesday-at' => 'ਮੰਗਲਵਾਰ ਨੂੰ $1 ਵਜੇ',
+'wednesday-at' => 'ਬà©à©±à¨§à¨µà¨¾à¨° ਨੂੰ $1 ਵਜੇ',
+'thursday-at' => 'ਵੀਰਵਾਰ ਨੂੰ $1 ਵਜੇ',
+'friday-at' => 'ਸ਼à©à©±à¨•à¨°à¨µà¨¾à¨° ਨੂੰ $1 ਵਜੇ',
+'saturday-at' => 'ਸ਼ਨਿੱਚਰਵਾਰ ਨੂੰ $1 ਵਜੇ',
+'sunday-at' => 'à¨à¨¤à¨µà¨¾à¨° ਨੂੰ $1 ਵਜੇ',
+'yesterday-at' => 'ਕੱਲà©à¨¹ $1 ਵਜੇ',
+
# Bad image list
'bad_image_list' => 'ਤਰਤੀਬ ਇਸ ਤਰਾਂ ਹੈ:
ਸਿਰਫ਼ ਸੂਚੀ ਵਿਚਲੀਆਂ ਚੀਜ਼ਾਂ (* ਨਾਲ ਸ਼à©à¨°à©‚ ਹੋਣ ਵਾਲੀਆਂ ਕਤਾਰਾਂ) ’ਤੇ ਹੀ ਗ਼ੌਰ ਕੀਤਾ ਜਾਵੇਗਾ।
@@ -2297,7 +2335,7 @@ $1|ਤਬਦੀਲੀ ਹੋਈ|'''$1''' ਤਬਦੀਲੀਆਂ ਹੋਈਆà¨
'metadata-collapse' => 'ਵਾਧੂ ਦਾ ਬਿਓਰਾ ਲà©à¨•à¨¾à¨“',
'metadata-fields' => 'ਇਸ ਸà©à¨¨à©‡à¨¹à©‡ ਵਿੱਚ ਸੂਚੀਬੱਧ ਖੇਤਰ ਚਿੱਤਰ ਪੰਨੇ ’ਚ ਸ਼ਾਮਲ ਕੀਤੇ ਜਾਣਗੇ ਜੋ ਉਦੋਂ ਦਿੱਸਦੇ ਹਨ ਜਦੋ ਮੈਟਾਡੈਟਾ ਖਾਕਾ ਬੰਦ ਹੋਵੇ। ਬਾਕੀ ਉਂਞ ਹੀ ਲà©à¨•à©‡ ਹੋਣਗੇ।',
-# EXIF tags
+# Exif tags
'exif-imagewidth' => 'ਚੌੜਾਈ',
'exif-imagelength' => 'ਉਚਾਈ',
'exif-samplesperpixel' => 'ਭਾਗਾਂ ਦੀ ਗਿਣਤੀ',
@@ -2608,10 +2646,15 @@ $1|ਤਬਦੀਲੀ ਹੋਈ|'''$1''' ਤਬਦੀਲੀਆਂ ਹੋਈਆà¨
'version-entrypoints-header-entrypoint' => 'ਦਾਖ਼ਲਾ ਬਿੰਦੂ',
'version-entrypoints-header-url' => 'ਯੂ.ਆਰ.à¨à©±à¨²',
-# Special:FilePath
-'filepath' => 'ਫ਼ਾਈਲ ਦਾ ਰਾਹ',
-'filepath-page' => 'ਫ਼ਾਈਲ:',
-'filepath-submit' => 'ਜਾਓ',
+# Special:Redirect
+'redirect-legend' => 'ਕਿਸੇ ਸਫ਼ੇ ਜਾਂ ਫ਼ਾਈਲ ਵੱਲ ਰੀਡਾਇਰੈਕਟ ਕਰੋ',
+'redirect-submit' => 'ਜਾਓ',
+'redirect-lookup' => 'ਲੱਭੋ:',
+'redirect-value' => 'ਮà©à©±à¨²:',
+'redirect-user' => 'ਵਰਤੋਂਕਾਰ ਦੀ ਆਈ.ਡੀ.',
+'redirect-revision' => 'ਸਫ਼ੇ ਦੀ ਦà©à¨¹à¨°à¨¾à¨ˆ',
+'redirect-file' => 'ਫ਼ਾਈਲ ਦਾ ਨਾਂ',
+'redirect-not-exists' => 'ਮà©à©±à¨² ਲੱਭਿਆ ਨਹੀਂ',
# Special:FileDuplicateSearch
'fileduplicatesearch' => 'ਨਕਲੀ ਫ਼ਾਈਲਾਂ ਲਈ ਖੋਜ ਕਰੋ',
@@ -2652,6 +2695,7 @@ $1|ਤਬਦੀਲੀ ਹੋਈ|'''$1''' ਤਬਦੀਲੀਆਂ ਹੋਈਆà¨
# Special:Tags
'tag-filter' => '[[Special:Tags|ਟੈਗ]] ਫਿਲਟਰ:',
'tag-filter-submit' => 'ਛਾਨਣੀ',
+'tag-list-wrapper' => '([[Special:Tags|{{PLURAL:$1|ਟੈਗ}}]]: $2)',
'tags-title' => 'ਟੈਗ',
'tags-tag' => 'ਟੈਗ ਦਾ ਨਾਮ',
'tags-description-header' => 'ਅਰਥ ਦਾ ਪੂਰਾ ਬਿਓਰਾ',
@@ -2685,6 +2729,9 @@ $1|ਤਬਦੀਲੀ ਹੋਈ|'''$1''' ਤਬਦੀਲੀਆਂ ਹੋਈਆà¨
'htmlform-submit' => 'ਭੇਜੋ',
'htmlform-reset' => 'ਤਬਦੀਲੀਆਂ ਵਾਪਸ ਕਰੋ',
'htmlform-selectorother-other' => 'ਹੋਰ',
+'htmlform-no' => 'ਨਹੀਂ',
+'htmlform-yes' => 'ਹਾਂ',
+'htmlform-chosen-placeholder' => 'ਕੋਈ ਚੋਣ ਚà©à¨£à©‹',
# New logging system
'logentry-delete-delete' => '$1 ਨੇ ਸਫ਼ਾ $3 ਮਿਟਾਇਆ',
diff --git a/languages/messages/MessagesPag.php b/languages/messages/MessagesPag.php
index c986956e..7e4e2a53 100644
--- a/languages/messages/MessagesPag.php
+++ b/languages/messages/MessagesPag.php
@@ -241,7 +241,7 @@ San ipropromisam met ya insulat mo yan dili o kinopyam ya manlapo ed sakey ya pu
'linksearch-pat' => 'Anapen so pattern:',
'linksearch-ok' => 'Anapen',
-# Email user
+# E-mail user
'emailuser' => 'E-mail so ayan user',
'emailfrom' => 'Manlapud',
'emailto' => 'Para ed',
@@ -262,8 +262,9 @@ No labay mon ekalen may bolong diad listaan na babantayan, tapik mo labat so \"e
# Displayed when you click the "watch" button and it is in the process of watching
'watching' => 'Babantayan...',
-'created' => 'agawa',
+'enotif_newpagetext' => 'Balo yan bolong.',
'changed' => 'asalatan',
+'created' => 'agawa',
# Delete
'deletepage' => 'Buralen so bolong',
@@ -362,7 +363,7 @@ Pinengneng so $2 para ed listaan na saray abural ran balo.',
'namespacesall' => 'amin',
'monthsall' => 'amin',
-# Email address confirmation
+# E-mail address confirmation
'confirmemail' => 'Kumpirmaen so E-mail address',
'confirmemail_sent' => 'Empawet so confirmation e-mail.',
'confirmemail_needlogin' => 'Nakaukulan mo ya $1 umpian nakompirma so email address mo.',
diff --git a/languages/messages/MessagesPam.php b/languages/messages/MessagesPam.php
index 634fa9a5..0788b053 100644
--- a/languages/messages/MessagesPam.php
+++ b/languages/messages/MessagesPam.php
@@ -46,9 +46,6 @@ Pabusten ing pamanaliling dake kapamilatan [alilan] ning suglung',
'tog-shownumberswatching' => 'Ipakit la reng bilang da reng magbanteng talagamit',
'tog-oldsig' => 'I-preview ya ing salukuyan a pirma',
'tog-fancysig' => 'Ituring yang wikitext ing pirma (alang automatic link o tambing a suglung)',
-'tog-externaleditor' => 'Gumamit a pangkilual a editor kapamilatan ning kabud',
-'tog-externaldiff' => 'Tambing kang gumamit aliwa (diff) ibat a panglual',
-'tog-showjumplinks' => 'Salangian la reng suglung a pampabilis (accessibility links) a "luksu king" (jump to)',
'tog-uselivepreview' => 'Gumamit kang live preview (JavaScript) (Experimental)',
'tog-forceeditsummary' => 'Pabaluan mu ku ustung magpalub a blankung edit',
'tog-watchlisthideown' => 'Isalikut mo reng alili kareng babanten',
@@ -224,7 +221,7 @@ Pabusten ing pamanaliling dake kapamilatan [alilan] ning suglung',
'jumptonavigation' => 'pamaglibut',
'jumptosearch' => 'paintunan',
-# 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).
+# 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).
'aboutsite' => 'Tungkul {{SITENAME}}',
'aboutpage' => 'Project:tungkul',
'copyright' => 'Mipaintulutan ing laman na niti lalam ning $1.',
@@ -234,7 +231,6 @@ Pabusten ing pamanaliling dake kapamilatan [alilan] ning suglung',
'disclaimers' => 'Pamananggi',
'disclaimerpage' => 'Project:Pangkabilugan a pamananggi',
'edithelp' => 'Saup pamanalili',
-'edithelppage' => 'Help:Pamag-edit',
'helppage' => 'Help:Kalamnan',
'mainpage' => 'Pun Bulung',
'mainpage-description' => 'Pun Bulung',
@@ -301,17 +297,6 @@ Ating tala da reng bulung a makabukud king [[Special:SpecialPages|{{int:specialp
# General errors
'error' => 'Mali',
'databaseerror' => 'Pamagkamali king database (simpanan)',
-'dberrortext' => 'Ating migkamali king database query syntax.
-Mapaliaring ating bug king software.
-Ing tauling mesubuk a kutang king database (database query) yapin iti:
-<blockquote><tt>$1</tt></blockquote>
-from within function "<tt>$2</tt>".
-MySQL returned error "<tt>$3: $4</tt>".',
-'dberrortextcl' => 'Mika pamagkamali king syntax ning pamangutang king database (database query).
-Ing tauling kutang king database yapin iti:
-"$1"
-manibat king kilub ning function "$2".
-Ini ing pamagkamaling linto king MySQL - "$3: $4"',
'laggedslavemode' => 'Kapiadian: Mapaliaring ala lu king bulung deng pekatauling mibayu.',
'readonly' => 'Makasara ya ing database',
'enterlockreason' => 'Ibie me ing sangkan ning pamaniara, pati ing tantia nung kapilan ya milako iti',
@@ -356,7 +341,6 @@ Pakisubukan mung pasibayu kaibat ning mapilang minutu.',
'viewsourcetext' => 'Malyari meng lon at kopian ing pikuanan (source) ning bulung a ini:',
'protectedinterface' => 'Maki interface text ya para king software ing bulung a iti. Makasara ya ba yang e mayabusu.',
'editinginterface' => "'''Babala:''' Babie yang interface text para king software ing bulung a i-edit mu. Makayapektu la king itsura ning user interface para kareng aliwang gagamit deng pamagbayu keti. Malyari lang munta king [//translatewiki.net/wiki/Main_Page?setlang=en translatewiki.net] deng bisang sumaup king pamaglikas.",
-'sqlhidden' => '(makasalikut ya ing SQL query)',
'cascadeprotected' => 'Makaprotekta ya king pamag-edit ing bulung a ini uling kayabe ya king makatuking {{PLURAL:$1|bulung, a|bulung, a}} a maki proteksiun uling makasalangi ya ing "tuki-tuki" o "cascading" option:
$2',
'namespaceprotected' => "Ala kang paintulut a mag-edit bulung king pirinan lagyung (namespace a) '''$1'''.",
@@ -454,7 +438,7 @@ Bang mayari ing kekang pamag-login, kailangan mung mangibiling bayung password k
'newpassword' => 'Bayung password:',
'retypenew' => 'Sulat meng pasibayu ing bayung password:',
'resetpass_submit' => 'Mangibili kang password at maglogin ka',
-'resetpass_success' => 'Melaus ing pamanalili mung password! Ngeni mila-login naka...',
+'changepassword-success' => 'Melaus ing pamanalili mung password! Ngeni mila-login naka...',
'resetpass_forbidden' => 'E la malyaring alilan deng password keng wiking ini',
# Edit page toolbar
@@ -765,7 +749,6 @@ Tutuking $1 {{PLURAL:$1|result|results}}',
'viewprevnext' => 'Lon ($1 {{int:pipe-separator}} $2) ($3)',
'searchmenu-exists' => "'''Atin bulung a mikilagiung \"[[:\$1]]\" keng wiking ini.'''",
'searchmenu-new' => "↓'''Maglalang kang bulung \"[[:\$1]] keng wiking ini!'''",
-'searchhelp-url' => 'Help:Kalamnan',
'searchprofile-articles' => '↓Kalamnan bulung',
'searchprofile-project' => '↓Saup ampong bulung proyectu',
'searchprofile-images' => '↓Dakalmedia',
@@ -798,13 +781,6 @@ Tutuking $1 {{PLURAL:$1|result|results}}',
Samantala, maliari kang maintun kapamilatan ning Google.
Pakitandanan mung maliaring e no makapanaun deng karelang index king kalamnan ning {{SITENAME}}.',
-# Quickbar
-'qbsettings-none' => 'Ala',
-'qbsettings-fixedleft' => 'Makapirmi ya ing kaili',
-'qbsettings-fixedright' => 'Makapirmi ya ing wanan',
-'qbsettings-floatingleft' => 'Kikimut ya ing kaili',
-'qbsettings-floatingright' => 'Kikimut ya ing wanan',
-
# Preferences page
'preferences' => 'Pinili',
'mypreferences' => '↓Deng pinili ku',
@@ -996,7 +972,6 @@ Nung ibie me, magamit ya bang kilalanan ing kekang ambag.',
'recentchangeslinked-feed' => 'Miyalilan a makaugne',
'recentchangeslinked-toolbox' => 'Miyalilan a makaugne',
'recentchangeslinked-title' => 'Deng miyalilan a maki kaugnayan king "$1"',
-'recentchangeslinked-noresult' => 'Alang miyalilan kareng bulung a pakasuglung ketang mebanggit a panaun.',
'recentchangeslinked-summary' => "↓Makalista la king bulung a iti deng tauling mengayalilan kareng
bulung a makasuglung ketang partikular a bulung. '''Makapal la pangasulat''' deng bulung
king kekang watchlist (tala da reng babanten).",
@@ -1197,13 +1172,6 @@ Isulat (input): contenttype/subtype, alimbawa <code>image/jpeg</code>.',
'statistics-header-users' => 'Talagamit statistics',
'statistics-mostpopular' => 'Bulung a pekamaralas dang linawe',
-'disambiguations' => 'Bulung a pamipalino',
-'disambiguationspage' => 'Template:pamipalino',
-'disambiguations-text' => "Makasuglung la king '''bulung pamipalino''' (disambiguation page) deng makatuking bulung.
-Ing dapat, keta lang makatud a paksa makasuglung.<br />
-Tuturing yang bulung pamipalino ing metung a bulung nung gagamit yang modelung (template) makasuglung manibat king
-[[MediaWiki:Disambiguationspage]]",
-
'doubleredirects' => 'Dobling pamanaliling direksiun',
'doubleredirectstext' => 'Pakalista la king bulung a ini deng bulung a makayalis direksiun (redirect) kareng aliwang bulung pamanalis direksiun. Atin yang suglung ing balang dane (row) king mumuna ampong kaduang pamanalis direksiun, ampo king tuturu (target) ning kaduang pamanalis direksiun, a keraklan ya ing "tagana" o "tutung" bulung a tuturu, nung nu ya dapat tambing makaturu ing mumunang pamanalis direksiun.',
@@ -1372,10 +1340,9 @@ click me ing \"Tuknangan ing pamagbante\" (Unwatch) king gilid na ning bulung.",
'unwatchthispage' => 'Tuknang kang magbante',
'notanarticle' => 'E ya bulung ding kalamnan (content page)',
'notvisiblerev' => 'Mebura ya itang mibayu (revision)',
-'watchnochange' => 'Alang me-edit kareng kekang babanten ketang panaun a makabili keti.',
'watchlist-details' => "{{PLURAL:$1|$1 bulung|$1 bulung}} king kekang watchlist, e la kayabe deng ''talk pages''.",
-'wlheader-enotif' => '* Makasalangi (enabled) ing pamipabalu kapamilatan ning e-mail.',
-'wlheader-showupdated' => "* '''Makapal''' la pangasulat deng bulung a miyalilan manibat aniang tauli mu lang pintalan.",
+'wlheader-enotif' => 'Makasalangi (enabled) ing pamipabalu kapamilatan ning e-mail.',
+'wlheader-showupdated' => "'''Makapal''' la pangasulat deng bulung a miyalilan manibat aniang tauli mu lang pintalan.",
'watchmethod-recent' => 'sisimen/susurian la reng bayung mengayalili para kareng bulung a babanten',
'watchmethod-list' => 'susurian la reng bulung a babanten para kareng bayung mengayalili',
'watchlistcontains' => 'Atin yang $1 {{PLURAL:$1|a bulung|bulung}} ing kekang tala ring babanten (watchlist).',
@@ -1688,12 +1655,9 @@ Lon me ing [[Special:BlockList|IP block list]] para king tala da reng kasalungsu
'ipb_blocked_as_range' => 'Mali: E diretsung makasabat ing IP $1, at e maliaring ilako pangasabat.
Pero makasabat ya antimong kayabe king range $2, a maliaring ilako pangasabat.',
'ip_range_invalid' => 'E matatanggap a IP range.',
-'blockme' => 'Sabatan muku',
'proxyblocker' => 'Maniabat a proxy',
-'proxyblocker-disabled' => 'Makapatda (disabled) ya ing gamit (function) a ini.',
'proxyblockreason' => 'Mesabat ya ing kekang IP address uling metung yang open proxy.
Pakiyaus me ing kekang Internet service provider o tech support at pabaluan me kaniting mabayat a prublema king seguridad.',
-'proxyblocksuccess' => 'Merapat na.',
'sorbsreason' => 'Makalista ya ing kekang IP address antimong open proxy king DNSBL a gagamitan ning {{SITENAME}}.',
'sorbs_create_account_reason' => 'Makalista yang open proxy king DNSBL a gagamitan ning {{SITENAME}} ing kekang IP address.
E ka maliaring maglalang account.',
@@ -2016,7 +1980,7 @@ Detang aliwa tambing (by default) lang makasalikut.
* gpslongitude
* gpsaltitude',
-# EXIF tags
+# Exif tags
'exif-imagewidth' => 'Lapad',
'exif-imagelength' => 'Katas',
'exif-bitspersample' => 'Bit balang dake (component)',
@@ -2110,7 +2074,7 @@ Detang aliwa tambing (by default) lang makasalikut.
'exif-source' => 'Pikuanan',
'exif-cameraownername' => 'Mikibandi keng paglitratu',
-# EXIF attributes
+# Exif attributes
'exif-compression-1' => 'E makapitpit (uncompressed)',
'exif-unknowndate' => 'E makabili ing petsa',
@@ -2322,11 +2286,6 @@ Mayari/mapasu ya ining confirmation code keng $4.',
'version-software-product' => 'Produktu',
'version-software-version' => 'Bersion',
-# Special:FilePath
-'filepath' => 'Dalan ning simpan (file path)',
-'filepath-page' => 'Simpan (file):',
-'filepath-submit' => 'Dalan',
-
# Special:FileDuplicateSearch
'fileduplicatesearch' => 'Maintun simpan (file) a kapareu',
'fileduplicatesearch-legend' => 'Maintun kapareu',
diff --git a/languages/messages/MessagesPap.php b/languages/messages/MessagesPap.php
index 2c6f751c..45b2e9d1 100644
--- a/languages/messages/MessagesPap.php
+++ b/languages/messages/MessagesPap.php
@@ -164,6 +164,9 @@ Bo por haña un lista di tur [[Special:SpecialPages|{{int:specialpages}}]].',
'viewsource' => 'Wak fuente',
# Login and logout pages
+'welcomecreation' => '== Bon bini, $1! ==
+Bo kuenta ta trahá.
+No lubidá di kambia bo [[Special:Preferences|{{SITENAME}} preferensianan]].',
'yourname' => 'Nòmber di uzadó',
'yourpassword' => 'Kontraseña',
'yourpasswordagain' => 'Hinka kontraseña atrobe',
@@ -275,7 +278,7 @@ Bo por skohe un tipo di registro tambe, òf filtrá e bista ku un nòmber di uza
[[Special:UnusedCategories|Unused categories]] are not shown here.
Also see [[Special:WantedCategories|wanted categories]].',
-# Email user
+# E-mail user
'emailuser' => 'Manda e-mail pa e uzadó aki',
'emailpage' => 'Manda e-mail',
'emailpagetext' => 'E formulario aki lo manda un e-mail pa e uzadò aki.
@@ -306,8 +309,8 @@ Si despues bo ke kita e página for di bo lista di observashon, primi \"Stop di
'watchlistcontains' => 'Bo lista di observashon tin $1 {{PLURAL:$1|página|páginanan}}.',
'wlshowlast' => 'Mustra último $1 oranan $2 dianan $3',
-'created' => 'trahá',
'changed' => 'kambiá',
+'created' => 'trahá',
# Delete
'confirm' => 'Konfirmá',
@@ -367,7 +370,7 @@ Por fabor skohe un otro título.',
'watchlistall2' => 'tur',
'namespacesall' => 'tur',
-# Email address confirmation
+# E-mail address confirmation
'confirmemail' => 'Konfirmá e-mail adrès',
'confirmemail_text' => 'Bo mester validá bo e-mail adrès pa uza funkshonnan di e-mail.
Primi e boton abou pa manda un e-mail di konfirmashon pa bo e-mail adrès.
diff --git a/languages/messages/MessagesPcd.php b/languages/messages/MessagesPcd.php
index 46dc98f9..a7a62e82 100644
--- a/languages/messages/MessagesPcd.php
+++ b/languages/messages/MessagesPcd.php
@@ -218,7 +218,7 @@ $messages = array(
'jumptonavigation' => 'navigachon',
'jumptosearch' => 'tracher',
-# 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).
+# 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).
'aboutsite' => 'à pérpos éd {{SITENAME}}',
'aboutpage' => 'Project:à pérpos',
'copyright' => "Ch'contnu, il est disponipe dsou $1.",
@@ -228,7 +228,6 @@ $messages = array(
'disclaimers' => 'Démintis',
'disclaimerpage' => 'Project:Déminti général',
'edithelp' => 'Éditer el aiyude',
-'edithelppage' => 'Help:Édichion',
'helppage' => 'Help:Étnus',
'mainpage' => 'Moaite Pache',
'mainpage-description' => 'Moaite Pache',
@@ -307,7 +306,6 @@ Si s'n'est poin ch'cas-lo, pététe éq ch'est un bogue din ch'businkillache. <b
'viewsource' => "Vir l'source",
'viewsource-title' => "Vir l'source éd $1",
'protectedpagetext' => "L'pache-lo ale o té garantie pou impétcher chés canjemints.",
-'sqlhidden' => "(l'édminde SQL est muchée)",
'ns-specialprotected' => "Ches paches éspéchiales, is n'peute poin éte éditées.",
# Virus scanner
@@ -318,7 +316,6 @@ Si s'n'est poin ch'cas-lo, pététe éq ch'est un bogue din ch'businkillache. <b
'yourpassword' => "Mot d'passe:",
'yourpasswordagain' => "Intrer à nouvieu ch'mot d'passe:",
'remembermypassword' => "Intrer oùtonmatiquemint l'prochaine fouos (pour un maximum éd $1 {{PLURAL:$1|jour|jours}})",
-'securelogin-stick-https' => "Réster connécté in HTTPS apré l'connécsion",
'yourdomainname' => 'Vote donmène:',
'login' => 'Intrer',
'nav-login-createaccount' => 'Intrer / créer vote conpte',
@@ -616,7 +613,6 @@ Ale doét mie éte pu longue éq $1 {{PLURAL:$1|caracter|caractéres}}.',
'recentchangeslinked' => 'Darins canjemints érliés',
'recentchangeslinked-toolbox' => 'Suivi des paches loïées',
'recentchangeslinked-title' => 'Cangemints à pérpos éd "$1"',
-'recentchangeslinked-noresult' => "I n’y a poin d' modificacion des paches loïées pindant l'période couésie.",
'recentchangeslinked-summary' => "Ch'est eune lisse d'chés darins canjemints su chés paches qu'ont un loïen aveuc l'pache-lo. Chés paches din vote [[Special:Watchlist|''lisse à suire'']] il sont in '''cros'''.",
'recentchangeslinked-page' => 'Nom del pache:',
'recentchangeslinked-to' => "Vir putot chés canjemints d'chés paches aveuc un loïen su l'pache-lo",
@@ -677,9 +673,6 @@ Vir l'pache [$2 édseur Commons].",
'statistics' => 'Éstatistikes',
'statistics-users' => '[[Special:ListUsers|Uzeus]] inrégistrés',
-'disambiguations' => 'Paches aveuc des loïens vers des paches du meume nom',
-'disambiguationspage' => 'Template:Omonymie',
-
'doubleredirects' => 'Doubes érdireccions',
'brokenredirects' => 'Érdireccions bérzillées',
@@ -1059,9 +1052,6 @@ Chés eutes cans is s'ront muchés pèr défeut.
# Special:Version
'version-specialpages' => 'Paches éspéchiales',
-# Special:FilePath
-'filepath-page' => 'Fichié :',
-
# Special:FileDuplicateSearch
'fileduplicatesearch' => 'Dénicher chés doublons',
diff --git a/languages/messages/MessagesPdc.php b/languages/messages/MessagesPdc.php
index 0e2c307b..4d12a588 100644
--- a/languages/messages/MessagesPdc.php
+++ b/languages/messages/MessagesPdc.php
@@ -209,7 +209,7 @@ $messages = array(
'jumptonavigation' => 'Faahre-Gnepp',
'jumptosearch' => 'guck uff',
-# 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).
+# 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).
'aboutsite' => 'Iwwer {{SITENAME}}',
'aboutpage' => 'Project:Iwwer_{{SITENAME}}',
'copyright' => 'Was do drin schdeht iss unner $1 verfiechbar',
@@ -217,7 +217,6 @@ $messages = array(
'disclaimers' => 'Impressum',
'disclaimerpage' => 'Project:Impressum',
'edithelp' => 'Hilf zum Ennere',
-'edithelppage' => 'Help:Tscheensche',
'helppage' => 'Help:Hilf',
'mainpage' => 'Haaptblatt',
'mainpage-description' => 'Haaptblatt',
@@ -399,7 +398,6 @@ Paesswatt fer nau: $2',
'nextn' => 'neegschte {{PLURAL:$1|$1}}',
'viewprevnext' => 'Zeige ($1 {{int:pipe-separator}} $2) ($3)',
'searchmenu-new' => "'''Schtaert des Blatt „[[:$1|$1]]“ uf dem Wiki.'''",
-'searchhelp-url' => 'Help:Hilf',
'searchprofile-everything' => 'Abaddiche',
'searchprofile-articles-tooltip' => 'Uffgucke in $1',
'searchprofile-project-tooltip' => 'Uffgucke in $1',
@@ -420,9 +418,6 @@ Paesswatt fer nau: $2',
'powersearch-togglenone' => 'Ken',
'search-external' => 'Guck im Gewebb',
-# Quickbar
-'qbsettings-none' => 'Ken',
-
# Preferences page
'preferences' => 'Paerseenlich Profil',
'mypreferences' => 'Uffschtellinge',
@@ -795,7 +790,6 @@ Guck $2 fer e Lischt vun de letscht Leschunge.',
'infiniteblock' => 'fer immer',
'blocklink' => 'Aabinne',
'contribslink' => 'Ardickele',
-'proxyblocksuccess' => 'Geduh.',
# Move page
'move-page' => '„$1“ ziehe',
@@ -906,7 +900,7 @@ Guck $2 fer e Lischt vun de letscht Leschunge.',
# Metadata
'metadata' => 'Metadaade',
-# EXIF tags
+# Exif tags
'exif-imagelength' => 'Leng',
'exif-software' => 'Geyuust Software',
'exif-usercomment' => 'Anmaerrickinge vun Yuuser',
@@ -976,11 +970,6 @@ Guck $2 fer e Lischt vun de letscht Leschunge.',
'version-poweredby-others' => 'annere',
'version-software-version' => 'Version',
-# Special:FilePath
-'filepath' => 'Feilpaad',
-'filepath-page' => 'Feil:',
-'filepath-submit' => 'Geh',
-
# Special:FileDuplicateSearch
'fileduplicatesearch-filename' => 'Feilnaame:',
'fileduplicatesearch-submit' => 'Uffgucke',
diff --git a/languages/messages/MessagesPdt.php b/languages/messages/MessagesPdt.php
index aa4e5f95..013c8184 100644
--- a/languages/messages/MessagesPdt.php
+++ b/languages/messages/MessagesPdt.php
@@ -547,25 +547,15 @@ Dee Grunt es: "$2"',
# Stylesheets
'common.css' => '/* CSS opp dise Sted woat opp aula Skins wirtje */',
-'standard.css' => '/* CSS opp dise Sted wirtjt opp dem Standard-Skin */',
-'nostalgia.css' => '/* CSS opp dise Sted wirtjt opp daut Nostalgia-Skin */',
'cologneblue.css' => '/* CSS opp dise Sted wirtjt opp daut Keloonsch-Blau-Skin */',
'monobook.css' => '/* CSS opp dise Sted wirtjt opp daut Monobook-Skin */',
-'myskin.css' => '/* CSS opp dise Sted wirtjt opp daut MySkin-Skin */',
-'chick.css' => '/* CSS opp dise Sted wirtjt opp daut Chick-Skin */',
-'simple.css' => '/* CSS opp dise Sted wirtjt opp daut Simple-Skin */',
'modern.css' => '/* CSS opp dise Sted wirtjt opp daut Modern-Skin */',
'print.css' => '/* CSS opp dise Sted woat daut Utkome vom Dretje aundasch moake */',
# Scripts
'common.js' => '/* Daut neachste JavaScript woat fe aula Brucka jelode. */',
-'standard.js' => '/* Daut neachste JavaScript woat fe Brucka mett Standard-Skin jelode. */',
-'nostalgia.js' => '/* Daut neachste JavaScript woat fe Brucka mett Nostalgie-Skin jelode. */',
'cologneblue.js' => '/* Daut neachste JavaScript woat fe Brucka mett Keloonsch-Blau-Skin jelode */',
'monobook.js' => '/* Daut neachste JavaScript woat fe Brucka mett Monobook-Skin jelode */',
-'myskin.js' => '/* Daut neachste JavaScript woat fe Brucka mett MySkin-Skin jelode */',
-'chick.js' => '/* Daut neachste JavaScript woat fe Brucka mett Chick-Skin jelode */',
-'simple.js' => '/* Daut neachste JavaScript woat fe Brucka mett Eenfach-Skin jelode */',
'modern.js' => '/* Daut neachste JavaScript woat fe Brucka mett Modern-Skin jelode. */',
# Metadata
diff --git a/languages/messages/MessagesPfl.php b/languages/messages/MessagesPfl.php
index 4e2ac399..9d774d02 100644
--- a/languages/messages/MessagesPfl.php
+++ b/languages/messages/MessagesPfl.php
@@ -21,8 +21,8 @@ $namespaceNames = array(
NS_MEDIA => 'Medium',
NS_SPECIAL => 'Schbezial',
NS_TALK => 'Babble',
- NS_USER => 'Benudzer',
- NS_USER_TALK => 'Benudzer_Dischbediere',
+ NS_USER => 'Middawaida',
+ NS_USER_TALK => 'Middawaida_Dischbediere',
NS_PROJECT_TALK => '$1_Dischbediere',
NS_FILE => 'Dadai',
NS_FILE_TALK => 'Dadai_Dischbediere',
@@ -32,27 +32,31 @@ $namespaceNames = array(
NS_TEMPLATE_TALK => 'Vorlach_Dischbediere',
NS_HELP => 'Hilf',
NS_HELP_TALK => 'Hilf_Dischbediere',
- NS_CATEGORY => 'Kadegorie',
- NS_CATEGORY_TALK => 'Kadegorie_Dischbediere',
+ NS_CATEGORY => 'Sachgrubb',
+ NS_CATEGORY_TALK => 'Sachgrubb_Dischbediere',
);
$namespaceAliases = array(
# German namespaces
- 'Medium' => NS_MEDIA,
- 'Spezial' => NS_SPECIAL,
- 'Diskussion' => NS_TALK,
- 'Benutzer' => NS_USER,
- 'Benutzer_Diskussion' => NS_USER_TALK,
- '$1_Diskussion' => NS_PROJECT_TALK,
- 'Datei' => NS_FILE,
- 'Datei_Diskussion' => NS_FILE_TALK,
- 'MediaWiki_Diskussion' => NS_MEDIAWIKI_TALK,
- 'Vorlage' => NS_TEMPLATE,
- 'Vorlage_Diskussion' => NS_TEMPLATE_TALK,
- 'Hilfe' => NS_HELP,
- 'Hilfe_Diskussion' => NS_HELP_TALK,
- 'Kategorie' => NS_CATEGORY,
- 'Kategorie_Diskussion' => NS_CATEGORY_TALK,
+ 'Medium' => NS_MEDIA,
+ 'Spezial' => NS_SPECIAL,
+ 'Diskussion' => NS_TALK,
+ 'Benutzer' => NS_USER,
+ 'Benutzer_Diskussion' => NS_USER_TALK,
+ 'Benudzer' => NS_USER,
+ 'Benudzer_Dischbediere' => NS_USER_TALK,
+ '$1_Diskussion' => NS_PROJECT_TALK,
+ 'Datei' => NS_FILE,
+ 'Datei_Diskussion' => NS_FILE_TALK,
+ 'MediaWiki_Diskussion' => NS_MEDIAWIKI_TALK,
+ 'Vorlage' => NS_TEMPLATE,
+ 'Vorlage_Diskussion' => NS_TEMPLATE_TALK,
+ 'Hilfe' => NS_HELP,
+ 'Hilfe_Diskussion' => NS_HELP_TALK,
+ 'Kategorie' => NS_CATEGORY,
+ 'Kategorie_Diskussion' => NS_CATEGORY_TALK,
+ 'Kadegorie' => NS_CATEGORY,
+ 'Kadegorie_Dischbediere' => NS_CATEGORY_TALK,
);
$messages = array(
@@ -65,7 +69,6 @@ $messages = array(
'tog-previewontop' => 'Vorbligg owwahalwb vum Beaawaidungsfenschda zaische',
'tog-previewonfirst' => 'Zaischen Vorbligg baim erschdemol Schaffe',
'tog-oldsig' => 'Voahonneni Unnaschfrid',
-'tog-showjumplinks' => 'Schdellde "Hubs uff"-Lingg',
'tog-uselivepreview' => 'Uuvazeschada Vorbligg (bneedischd JavaScript) (vasugswais)',
'tog-showhiddencats' => 'Zaisch vaschdeglde Grubbe',
@@ -240,7 +243,7 @@ Waad ä bissl un brobieas nomol.
$1',
'pool-errorunknown' => 'Ubkonnde Irrdumm',
-# 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).
+# 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).
'aboutsite' => 'Iwwa {{SITENAME}}',
'aboutpage' => 'Project:Iwwa',
'copyright' => 'Was do drin schded isch unna $1 vafieschba.',
@@ -250,7 +253,6 @@ $1',
'disclaimers' => 'Hafdungsausschluß',
'disclaimerpage' => 'Project:Impressum',
'edithelp' => 'Unaschdizung fas Beawaide',
-'edithelppage' => 'Help:Ännere',
'helppage' => 'Help:Inhald',
'mainpage' => 'Schdadsaid',
'mainpage-description' => 'Schdadsaid',
@@ -599,9 +601,6 @@ Ealaidarung: '''({{int:cur}})''' = Unnaschied zu jezd,
'powersearch-toggleall' => 'Alli',
'powersearch-togglenone' => 'Kään',
-# Quickbar
-'qbsettings-none' => 'Kään',
-
# Preferences page
'preferences' => 'Obzione',
'mypreferences' => 'Oischdellunge',
@@ -723,7 +722,6 @@ Doi Address werd ned gzaischd, wõnse midda babbln.',
'recentchangeslinked-feed' => 'Ännarunge on valinggde Saide',
'recentchangeslinked-toolbox' => 'Ännarunge uff verlingde Saide',
'recentchangeslinked-title' => 'Ännarunge õn Saide, wu „$1“ druff verlinggd',
-'recentchangeslinked-noresult' => 'Do isch nix gännad worre inde Zaid.',
'recentchangeslinked-summary' => "Die Lischd zaischd ledschdi Ännarunge, vunna bschdimmde Said, wu do valinggd isch (odda ä Midglied vunna bschdimmde Sachgrubb isch).
Saide uff [[Special:Watchlist|Doina Beowachdungslischd]] sinn '''fedd'''.",
'recentchangeslinked-page' => 'Saide:',
@@ -793,8 +791,6 @@ Saide uff [[Special:Watchlist|Doina Beowachdungslischd]] sinn '''fedd'''.",
'statistics' => 'Schdadischdigge',
'statistics-pages' => 'Saide',
-'disambiguationspage' => 'Template:Vadaidlischung',
-
'brokenredirects-edit' => 'beawaide',
'brokenredirects-delete' => 'lesche',
@@ -964,7 +960,7 @@ Der Schutzstatus vun derre Said kannscht ännere, awwer des hot kää Aifluss uf
'contributions' => '{{GENDER:$1|Wassa gemachd hodd}}',
'contributions-title' => 'Middawaidabaidräsch vun $1',
'mycontris' => 'Baidräsch',
-'contribsub2' => 'Fer $1 ($2)',
+'contribsub2' => 'Fa $1 ($2)',
'uctop' => '(geschewedisch)',
'month' => 'än Monad (un frieja):',
'year' => 'Abm Johr (un frieja):',
@@ -1177,7 +1173,7 @@ Wonn die Dadai vaännad worre isch, donn konns soi, daß zusedzlischi Õgawe fa
* gpslongitude
* gpsaltitude',
-# EXIF tags
+# Exif tags
'exif-iimcategory' => 'Sachgrubb',
'exif-iimsupplementalcategory' => 'Ergenzndi Sachgrubbe',
diff --git a/languages/messages/MessagesPi.php b/languages/messages/MessagesPi.php
index f77b1118..1c2b21f4 100644
--- a/languages/messages/MessagesPi.php
+++ b/languages/messages/MessagesPi.php
@@ -1,5 +1,5 @@
<?php
-/** Pali (पालि)
+/** Pali (पािऴ)
*
* See MessagesQqq.php for message documentation incl. usage of parameters
* To improve a translation please visit http://translatewiki.net
@@ -8,7 +8,6 @@
* @file
*
* @author Eukesh (on pi.wikipedia.org)
- * @author Hemant wikikosh1
* @author Vibhijain
*/
@@ -46,102 +45,40 @@ $digitTransformTable = array(
$messages = array(
# Dates
-'january' => 'जà¥à¤¯à¤¾à¤¨à¥à¤µà¤°à¥€',
-'february' => 'फ़रवरी',
-'march' => 'मारà¥à¤š',
-'april' => 'अपà¥à¤°à¥ˆà¤²',
-'may_long' => 'मई',
-'june' => 'जून',
-'july' => 'जà¥à¤²à¤¾à¤ˆ',
-'august' => 'अगसà¥à¤¤',
+'january' => 'जà¥à¤¯à¤¾à¤¨à¥à¤µà¤°à¥€',
+'february' => 'फ़रवरी',
+'march' => 'मारà¥à¤š',
+'april' => 'अपà¥à¤°à¥ˆà¤²',
+'may_long' => 'मई',
+'june' => 'जून',
+'july' => 'जà¥à¤²à¤¾à¤ˆ',
+'august' => 'अगसà¥à¤¤',
'september' => 'सेपà¥à¤Ÿà¥‡à¤®à¥à¤¬à¤°',
-'october' => 'ओकà¥à¤Ÿà¥‹à¤¬à¤°',
-'november' => 'नवमà¥à¤¬à¤°',
-'december' => 'दिसमà¥à¤¬à¤°',
+'october' => 'ओकà¥à¤Ÿà¥‹à¤¬à¤°',
+'november' => 'नवमà¥à¤¬à¤°',
+'december' => 'दिसमà¥à¤¬à¤°',
'article' => 'लेख पतà¥à¤¤',
-# Vector skin
-'vector-view-create' => 'रचेतà¥',
-
-'help' => 'सहायता',
-'search' => 'अनà¥à¤µà¥‡à¤¸à¤¨à¤¾',
-'searchbutton' => 'खोज',
+'searchbutton' => 'खोज',
'searcharticle' => 'गचà¥à¤›à¤¾à¤®à¤¿',
-'create' => 'रचेतà¥',
-'talkpagelinktext' => 'समà¥à¤­à¤¾à¤¸à¤¨à¤‚',
-'talk' => 'समà¥à¤­à¤¾à¤¸à¤¨à¤‚',
# 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}} इचà¥à¤šà¤¸à¥à¤¸ विसये',
-'disclaimers' => 'पचà¥à¤šà¤¾à¤•à¥à¤–ानं',
-'mainpage' => 'पमà¥à¤– पतà¥à¤¤',
+'mainpage' => 'पमà¥à¤– पतà¥à¤¤',
'mainpage-description' => 'पमà¥à¤– पतà¥à¤¤',
-'portal' => 'समà¥à¤¦à¤¾à¤¯à¤¦à¥à¤µà¤¾à¤°à¤‚',
-'portal-url' => 'Project:समà¥à¤¦à¤¾à¤¯à¤¦à¥à¤µà¤¾à¤°à¤‚',
-'privacy' => 'गोपनीयता-नीति',
-
-'editsection' => 'समà¥à¤ªà¤¾à¤¦à¥‡à¤¤à¥',
-'editsectionhint' => 'à¤à¤¤à¤‚ विभागं समà¥à¤ªà¤¾à¤¦à¥‡à¤¤à¥',
-'red-link-title' => '$1 (पिटà¥à¤ à¤‚ न वतà¥à¤¤à¤¤à¤¿)',
-
-# Short words for each namespace, by default used in the namespace tab in monobook
-'nstab-main' => 'पिटà¥à¤ à¤‚',
-
-# Parser/template warnings
-'post-expand-template-inclusion-warning' => "'''पबोधो:''' फलकानं योजनसà¥à¤¸ आकारो अतिविसालो वतà¥à¤¤à¤¤à¤¿à¥¤
-कानिचन फलकानि योजेतà¥à¤‚ न सकà¥à¤•à¤¨à¥à¤¤à¤¿ ।",
-
-# History pages
-'currentrev-asof' => 'वतà¥à¤¤à¤®à¤¾à¤¨à¤¾ आवà¥à¤¤à¥à¤¤à¤¿ $1 इति समये',
-'previousrevision' => '↓↠पà¥à¤°à¤¾à¤¤à¤¨à¤‚ अवतरणं',
-
-# Search results
-'searchmenu-new' => 'असà¥à¤®à¤¿à¤‚ विकियं "[[:$1]]" इति पिटà¥à¤ à¤‚ रचेतà¥à¥¤',
-'search-result-size' => '$1 ({{PLURAL:$2|1 सदà¥à¤¦à¥‹|$2 सदà¥à¤¦à¤¾}})',
-
-# Recent changes
-'recentchanges' => 'सजà¥à¤œà¥‹à¤œà¤¾à¤¤à¤¾à¤¨à¤¿ परिवतà¥à¤¤à¤¨à¤¾à¤¨à¤¿',
-'hide' => 'गोपेतà¥',
-'show' => 'दसà¥à¤¸à¥‡à¤¤à¥',
-
-# Random page
-'randompage' => 'यदिचà¥à¤›à¤•à¤ªà¤¿à¤Ÿà¥à¤ à¤‚',
-
-# Miscellaneous special pages
-'nbytes' => '$1 {{PLURAL:$1|बाइटं|बाइटानि}}',
# Book sources
'booksources-go' => 'गचà¥à¤›à¤¾à¤®à¤¿',
# Special:AllPages
-'allarticles' => 'सबà¥à¤¬ लेखा',
+'allarticles' => 'सबà¥à¤¬ लेखा',
'allpagessubmit' => 'गचà¥à¤›à¤¾à¤®à¤¿',
-# Block/unblock
-'contribslink' => 'योगदानानि',
-
-# Export
-'export' => 'पिटà¥à¤ à¤¾à¤¨à¤‚ नियà¥à¤¯à¤¾à¤¤à¤‚ करोतà¥',
-
# Namespace 8 related
'allmessagesname' => 'नाम',
-# Tooltip help for the actions
-'tooltip-ca-talk' => 'पिटà¥à¤ à¤¨à¥à¤¤à¤—à¥à¤—तविसये समà¥à¤­à¤¾à¤¸à¤¨à¤‚',
-'tooltip-ca-move' => 'इदं पिटà¥à¤ à¤‚ चालेतà¥',
-'tooltip-ca-watch' => 'इदं पिटà¥à¤ à¤‚ भवतो अवेकà¥à¤–णसूचियं योजेतà¥',
-'tooltip-search' => '{{SITENAME}} इचà¥à¤šà¥‡à¤¤à¥à¤¥ अनà¥à¤µà¤¿à¤¸à¥à¤¸à¤¤à¥',
-'tooltip-search-fulltext' => 'à¤à¤¤à¤‚ वचनं पिटà¥à¤ à¥‡à¤¸à¥ अनà¥à¤µà¤¿à¤¸à¥à¤¸à¤¤à¥',
-'tooltip-p-logo' => 'मà¥à¤–पिटà¥à¤ à¤‚ गचà¥à¤›à¤¤à¥',
-'tooltip-n-recentchanges' => 'सजà¥à¤œà¥‹à¤œà¤¾à¤¤à¤¾à¤¨à¤‚ परिवतà¥à¤¤à¤¨à¤¾à¤¨à¤‚ सूची',
-'tooltip-n-randompage' => 'यदिचà¥à¤›à¤•à¤‚ पिटà¥à¤ à¤‚ गचà¥à¤›à¤¤à¥',
-'tooltip-n-help' => 'अनà¥à¤µà¥‡à¤¸à¤¨à¤ à¤¾à¤¨à¤‚',
-'tooltip-t-specialpages' => 'सबà¥à¤¬à¥‡à¤¸à¤‚ पमà¥à¤–ानं पिटà¥à¤ à¤¾à¤¨à¤‚ सूची',
-'tooltip-summary' => 'संखितà¥à¤¤à¤‚ सारंसं योजेतà¥',
-
# EXIF tags
-'exif-gpslatitude' => 'अकà¥à¤·à¤¾à¤‚श',
+'exif-gpslatitude' => 'अकà¥à¤·à¤¾à¤‚श',
'exif-gpslongitude' => 'देशानà¥à¤¤à¤°',
'exif-sensingmethod-1' => 'अपरिभाषित',
diff --git a/languages/messages/MessagesPl.php b/languages/messages/MessagesPl.php
index 6839c7cf..289e770b 100644
--- a/languages/messages/MessagesPl.php
+++ b/languages/messages/MessagesPl.php
@@ -97,15 +97,21 @@ $namespaceGenderAliases = array(
$dateFormats = array(
'mdy time' => 'H:i',
'mdy date' => 'M j, Y',
+ 'mdy monthonly' => 'F Y',
'mdy both' => 'H:i, M j, Y',
+ 'mdy pretty' => 'j xg',
'dmy time' => 'H:i',
'dmy date' => 'j M Y',
+ 'dmy monthonly' => 'F Y',
'dmy both' => 'H:i, j M Y',
+ 'dmy pretty' => 'j xg',
'ymd time' => 'H:i',
'ymd date' => 'Y M j',
+ 'ymd monthonly' => 'Y F',
'ymd both' => 'H:i, Y M j',
+ 'ymd pretty' => 'j xg',
);
$fallback8bitEncoding = 'iso-8859-2';
@@ -333,9 +339,6 @@ $messages = array(
'tog-shownumberswatching' => 'Pokaż liczbę użytkowników obserwujących stronę',
'tog-oldsig' => 'Twój obecny podpis',
'tog-fancysig' => 'Traktuj podpis jako wikikod (nie linkuj automatycznie całości)',
-'tog-externaleditor' => 'Domyślnie używaj zewnętrznego edytora (tylko dla zaawansowanych użytkowników; wymaga odpowiedniego skonfigurowania komputera)',
-'tog-externaldiff' => 'Domyślnie używaj zewnętrznego programu pokazującego zmiany (tylko dla zaawansowanych użytkowników; wymaga odpowiedniego skonfigurowania komputera)',
-'tog-showjumplinks' => 'WÅ‚Ä…cz odnoÅ›niki „skocz doâ€',
'tog-uselivepreview' => 'Używaj dynamicznego podglądu (eksperymentalny)',
'tog-forceeditsummary' => 'Informuj o niewypełnieniu opisu zmian',
'tog-watchlisthideown' => 'Ukryj moje edycje na liście obserwowanych',
@@ -349,6 +352,8 @@ $messages = array(
'tog-showhiddencats' => 'Pokazuj ukryte kategorie',
'tog-noconvertlink' => 'Wyłącz konwersję tytułów w linkach',
'tog-norollbackdiff' => 'PomiÅ„ pokazywanie zmian po użyciu funkcji „cofnijâ€',
+'tog-useeditwarning' => 'Ostrzegaj mnie, gdy opuszczam stronÄ™ edycji bez zapisania zmian',
+'tog-prefershttps' => 'Zawsze używaj bezpiecznego połączenia po zalogowaniu',
'underline-always' => 'zawsze',
'underline-never' => 'nigdy',
@@ -412,6 +417,18 @@ $messages = array(
'oct' => 'paź',
'nov' => 'lis',
'dec' => 'gru',
+'january-date' => '$1 stycznia',
+'february-date' => '$1 lutego',
+'march-date' => '$1 marca',
+'april-date' => '$1 kwietnia',
+'may-date' => '$1 maja',
+'june-date' => '$1 czerwca',
+'july-date' => '$1 lipca',
+'august-date' => '$1 sierpnia',
+'september-date' => '$1 września',
+'october-date' => '$1 października',
+'november-date' => '$1 listopada',
+'december-date' => '$1 grudnia',
# Categories related messages
'pagecategories' => '{{PLURAL:$1|Kategoria|Kategorie}}',
@@ -493,6 +510,7 @@ $messages = array(
'create-this-page' => 'Utwórz tę stronę',
'delete' => 'Usuń',
'deletethispage' => 'Usuń tę stronę',
+'undeletethispage' => 'Przywróć tę stronę',
'undelete_short' => 'odtwórz {{PLURAL:$1|1 wersję|$1 wersje|$1 wersji}}',
'viewdeleted_short' => 'Podgląd {{PLURAL:$1|usuniętej|$1 usuniętych}} wersji',
'protect' => 'Zabezpiecz',
@@ -536,7 +554,7 @@ $1',
'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).
+# 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).
'aboutsite' => 'O {{GRAMMAR:MS.lp|{{SITENAME}}}}',
'aboutpage' => 'Project:O {{GRAMMAR:MS.lp|{{SITENAME}}}}',
'copyright' => 'Treść udostępniana na licencji $1, jeśli nie podano inaczej.',
@@ -546,7 +564,6 @@ $1',
'disclaimers' => 'Informacje prawne',
'disclaimerpage' => 'Project:Informacje prawne',
'edithelp' => 'Pomoc w edycji',
-'edithelppage' => 'Help:Jak edytować stronę',
'helppage' => 'Help:Spis treści',
'mainpage' => 'Strona główna',
'mainpage-description' => 'Strona główna',
@@ -624,17 +641,12 @@ Listę dostępnych stron specjalnych znajdziesz [[Special:SpecialPages|tutaj]].'
# General errors
'error' => 'BÅ‚Ä…d',
'databaseerror' => 'BÅ‚Ä…d bazy danych',
-'dberrortext' => 'Wystąpił błąd składni w zapytaniu do bazy danych.
-Może to oznaczać błąd w oprogramowaniu.
-Ostatnie, nieudane zapytanie to:
-<blockquote><code>$1</code></blockquote>
-wysÅ‚ane przez funkcjÄ™ „<code>$2</code>â€.
-Baza danych zgÅ‚osiÅ‚a bÅ‚Ä…d „<samp>$3: $4</samp>â€.',
-'dberrortextcl' => 'Wystąpił błąd składni w zapytaniu do bazy danych.
-Ostatnie, nieudane zapytanie to:
-„$1â€
-wywoÅ‚ane zostaÅ‚o przez funkcjÄ™ „$2â€.
-Baza danych zgÅ‚osiÅ‚a bÅ‚Ä…d „$3: $4â€',
+'databaseerror-text' => 'Wystąpił błąd podczas wykonywania zapytania do bazy danych.
+Może to wskazywać na błąd w oprogramowaniu.',
+'databaseerror-textcl' => 'Wystąpił błąd podczas wykonywania zapytania do bazy danych.',
+'databaseerror-query' => 'Zapytanie: $1',
+'databaseerror-function' => 'Funkcja: $1',
+'databaseerror-error' => 'BÅ‚Ä…d: $1',
'laggedslavemode' => 'Uwaga! Ta strona może nie zawierać najnowszych aktualizacji.',
'readonly' => 'Baza danych jest zablokowana',
'enterlockreason' => 'Podaj powód zablokowania bazy oraz szacunkowy termin jej odblokowania',
@@ -668,6 +680,7 @@ Możliwe, że zostały już usunięte przez kogoś innego.',
'cannotdelete-title' => 'Nie można usunąć strony „$1â€.',
'delete-hook-aborted' => 'Usuwanie przerwane przez hak.
Przyczyna nieokreślona.',
+'no-null-revision' => 'Nie można utworzyć zerowej wersji strony "$1"',
'badtitle' => 'Niepoprawny tytuł',
'badtitletext' => 'Podano niepoprawny tytuł strony. Prawdopodobnie jest pusty lub zawiera znaki, których użycie jest zabronione.',
'perfcached' => 'Poniższe dane są kopią z pamięci podręcznej i mogą być nieaktualne. Maksymalnie {{PLURAL:$1|jeden wynik jest|$1 wyniki są|$1 wyników jest}} w pamięci podręcznej.',
@@ -688,12 +701,15 @@ By dodać lub zmienić tłumaczenia wszystkich serwisów wiki, użyj [//translat
'editinginterface' => "'''Ostrzeżenie:''' Edytujesz stronę, która zawiera tekst interfejsu oprogramowania.
Zmiany na tej stronie zmienią wygląd interfejsu dla innych użytkowników tej wiki.
By dodać lub zmienić tłumaczenia wszystkich wiki, użyj [//translatewiki.net/wiki/Main_Page?setlang=pl translatewiki.net], specjalizowany projekt lokalizacji oprogramowania MediaWiki.",
-'sqlhidden' => '(ukryto zapytanie SQL)',
'cascadeprotected' => 'Ta strona została zabezpieczona przed edycją, ponieważ jest ona zawarta na {{PLURAL:$1|następującej stronie, która została zabezpieczona|następujących stronach, które zostały zabezpieczone}} z włączoną opcją dziedziczenia:
$2',
'namespaceprotected' => "Nie masz uprawnień do edytowania stron w przestrzeni nazw '''$1'''.",
'customcssprotected' => 'Nie jesteś uprawniony do edytowania tej strony CSS, ponieważ zawiera ona ustawienia osobiste innego użytkownika.',
'customjsprotected' => 'Nie jesteś uprawniony do edytowania tej strony JavaScript, ponieważ zawiera ona ustawienia osobiste innego użytkownika.',
+'mycustomcssprotected' => 'Nie masz uprawnień do edytowania tej strony CSS.',
+'mycustomjsprotected' => 'Nie masz uprawnień do edytowania tej strony JavaScript.',
+'myprivateinfoprotected' => 'Nie masz uprawnień do edytowania swoich prywatnych danych.',
+'mypreferencesprotected' => 'Nie masz uprawnień do edytowania swoich preferencji.',
'ns-specialprotected' => 'Stron specjalnych nie można edytować.',
'titleprotected' => "Utworzenie strony o tej nazwie zostało zablokowane przez [[User:$1|$1]].
Uzasadnienie blokady: ''$2''.",
@@ -718,10 +734,19 @@ Zauważ, że do momentu wyczyszczenia pamięci podręcznej przeglądarki niektó
'welcomecreation-msg' => 'Twoje konto zostało utworzone.
Nie zapomnij dostosować [[Special:Preferences|preferencji]].',
'yourname' => 'Nazwa {{GENDER:|użytkownika|użytkowniczki}}',
+'userlogin-yourname' => 'Nazwa użytkownika',
+'userlogin-yourname-ph' => 'Wprowadź swoją nazwę użytkownika',
+'createacct-another-username-ph' => 'Wprowadź nazwę użytkownika',
'yourpassword' => 'Hasło',
+'userlogin-yourpassword' => 'Hasło',
+'userlogin-yourpassword-ph' => 'Wpisz swoje hasło',
+'createacct-yourpassword-ph' => 'Wprowadź hasło',
'yourpasswordagain' => 'Powtórz hasło',
+'createacct-yourpasswordagain' => 'Potwierdź hasło',
+'createacct-yourpasswordagain-ph' => 'Wprowadź hasło jeszcze raz',
'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',
+'userlogin-remembermypassword' => 'Nie wylogowuj mnie',
+'userlogin-signwithsecure' => 'Użyj bezpiecznego połączenia',
'yourdomainname' => 'Twoja domena',
'password-change-forbidden' => 'Nie można zmieniać haseł na tej wiki.',
'externaldberror' => 'Wystąpił błąd zewnętrznej bazy autentyfikacyjnej lub nie posiadasz uprawnień koniecznych do aktualizacji zewnętrznego konta.',
@@ -733,18 +758,41 @@ Nie zapomnij dostosować [[Special:Preferences|preferencji]].',
'logout' => 'Wyloguj',
'userlogout' => 'Wyloguj',
'notloggedin' => 'Nie jesteÅ› zalogowany',
+'userlogin-noaccount' => 'Nie masz konta?',
+'userlogin-joinproject' => 'Dołącz do {{GRAMMAR:D.lp|{{SITENAME}}}}',
'nologin' => 'Nie masz konta? $1.',
'nologinlink' => 'Zarejestruj siÄ™',
'createaccount' => 'Załóż nowe konto',
'gotaccount' => "Masz już konto? '''$1'''.",
'gotaccountlink' => 'Zaloguj siÄ™',
'userlogin-resetlink' => 'Zapomniałeś danych do zalogowania się?',
+'userlogin-resetpassword-link' => 'Nie pamiętasz hasła?',
+'helplogin-url' => 'Help:Logowanie',
+'userlogin-helplink' => '[[{{MediaWiki:helplogin-url}}|Pomoc z logowaniem]]',
+'createacct-join' => 'Wpisz poniżej swoje dane.',
+'createacct-another-join' => 'Wprowadź szczegóły nowego konta poniżej.',
+'createacct-emailrequired' => 'Adres eâ€mail',
+'createacct-emailoptional' => 'Adres e-mail (opcjonalnie)',
+'createacct-email-ph' => 'Wpisz swój adres e-mail',
+'createacct-another-email-ph' => 'Podaj adres e-mail',
'createaccountmail' => 'Użyj tymczasowego hasła wygenerowanego losowo i wyślij je na podany adres e-mail',
+'createacct-realname' => 'Prawdziwe imiÄ™ i nazwisko (opcjonalnie)',
'createaccountreason' => 'Powód',
+'createacct-reason' => 'Powód',
+'createacct-reason-ph' => 'Dlaczego zakładasz kolejne konto',
+'createacct-captcha' => 'Kontrola bezpieczeństwa',
+'createacct-imgcaptcha-ph' => 'Wpisz tekst widoczny powyżej',
+'createacct-submit' => 'Utwórz konto',
+'createacct-another-submit' => 'Utwórz kolejne konto',
+'createacct-benefit-heading' => '{{grammar:B.lp|{{SITENAME}}}} tworzÄ… ludzie tacy jak Ty.',
+'createacct-benefit-body1' => '{{PLURAL:$1|edycja|edycje|edycji}}',
+'createacct-benefit-body2' => '{{PLURAL:$1|strona|strony|stron}}',
+'createacct-benefit-body3' => '{{PLURAL:$1|użytkownik|użytkowników}} w ostatnim czasie',
'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.',
'loginerror' => 'BÅ‚Ä…d logowania',
+'createacct-error' => 'BÅ‚Ä…d tworzenia konta',
'createaccounterror' => 'Nie można utworzyć konta $1',
'nocookiesnew' => 'Konto użytkownika zostało utworzone, ale nie jesteś zalogowany.
{{SITENAME}} używa ciasteczek do przechowywania informacji o zalogowaniu się.
@@ -809,10 +857,12 @@ Zaloguj się teraz i je zmień.
Możesz zignorować tę wiadomość, jeśli konto zostało utworzone przez pomyłkę.',
'usernamehasherror' => 'Nazwa użytkownika nie może zawierać znaków kratki „#â€',
'login-throttled' => 'Zbyt wiele razy próbowałeś zalogować się na to konto.
-Odczekaj chwilę zanim ponowisz próbę.',
+Odczekaj $1 zanim ponowisz próbę.',
'login-abort-generic' => 'Logowanie nieudane – przerwano',
'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.',
+'createacct-another-realname-tip' => 'Wpisanie imienia i nazwiska nie jest obowiÄ…zkowe.
+Jeśli zdecydujesz się je podać, zostaną użyte, by udokumentować Twoje autorstwo.',
# Email sending
'php-mail-error-unknown' => 'Wystąpił nieznany błąd w funkcji PHP mail()',
@@ -829,8 +879,7 @@ Aby zakończyć proces logowania, musisz ustawić nowe hasło:',
'newpassword' => 'Nowe hasło',
'retypenew' => 'Powtórz nowe hasło',
'resetpass_submit' => 'Ustaw hasło i zaloguj się',
-'resetpass_success' => 'Hasło zostało pomyślnie zmienione!
-Zaraz zostanesz zalogowany ...',
+'changepassword-success' => 'Twoje hasło zostało pomyślnie zmienione!',
'resetpass_forbidden' => 'Hasła nie mogą zostać zmienione',
'resetpass-no-info' => 'Musisz być zalogowany, by uzyskać bezpośredni dostęp do tej strony.',
'resetpass-submit-loggedin' => 'Zmień hasło',
@@ -842,10 +891,11 @@ Być może wÅ‚aÅ›nie zmieniÅ‚{{GENDER:|eÅ›|aÅ›|eÅ›(â€aÅ›)}} swoje hasÅ‚o lub po
# Special:PasswordReset
'passwordreset' => 'Wyczyść hasło',
-'passwordreset-text' => 'Wypełnij formularz, aby zresetować swoje hasło.',
+'passwordreset-text-one' => 'Wypełnij ten formularz, aby zresetować hasło.',
+'passwordreset-text-many' => '{{PLURAL:$1|Wypełnij jedno z poniższych pól, aby zresetować hasło.}}',
'passwordreset-legend' => 'Zresetuj hasło',
'passwordreset-disabled' => 'Na tej wiki wyłączono możliwość resetowania haseł.',
-'passwordreset-pretext' => '{{PLURAL:$1||Wprowadź jedną z danych poniżej}}',
+'passwordreset-emaildisabled' => 'Wysyłanie emaili zostało wyłączone na tej wiki',
'passwordreset-username' => 'Nazwa użytkownika:',
'passwordreset-domain' => 'Domena',
'passwordreset-capture' => 'Czy pokazywać treść wiadomoÅ›ci eâ€mail?',
@@ -868,7 +918,7 @@ Powinieneś zalogować się i zmienić hasło na nowe. Jeśli to ktoś inny popr
Tymczasowe hasło – $2',
'passwordreset-emailsent' => 'Eâ€mail pozwalajÄ…cy na zresetowanie hasÅ‚a zostaÅ‚ wysÅ‚any.',
'passwordreset-emailsent-capture' => 'WyÅ›wietlony poniżej eâ€mail pozwalajÄ…cy na zresetowanie hasÅ‚a zostaÅ‚ wysÅ‚any.',
-'passwordreset-emailerror-capture' => 'Poniżej wyÅ›wietlony eâ€mail z przypomnieniem zostaÅ‚ wygenerowany, ale nie udaÅ‚o siÄ™ wysÅ‚ać go do użytkownika: $1',
+'passwordreset-emailerror-capture' => 'Poniżej wyÅ›wietlony eâ€mail pozwalajÄ…cy na zresetowanie hasÅ‚a zostaÅ‚ wygenerowany, ale nie udaÅ‚o siÄ™ wysÅ‚ać go do {{GENDER:$2|użytkownika|użytkowniczki}}: $1',
# Special:ChangeEmail
'changeemail' => 'Zmiana adresu eâ€mail',
@@ -882,6 +932,19 @@ Tymczasowe hasło – $2',
'changeemail-submit' => 'Zapisz nowy',
'changeemail-cancel' => 'Anuluj',
+# Special:ResetTokens
+'resettokens' => 'Resetuj tokeny',
+'resettokens-text' => 'Na tej stronie możesz zresetować tokeny, które umożliwiają dostęp do pewnych prywatnych danych związanych z Twoim kontem.
+
+Należy to zrobić, jeśli ktoś je poznał lub zdobył hasło do Twojego konta.',
+'resettokens-no-tokens' => 'Brak tokenów do zresetowania.',
+'resettokens-legend' => 'Resetuj tokeny',
+'resettokens-tokens' => 'Tokeny:',
+'resettokens-token-label' => '$1 (obecna wartość: $2)',
+'resettokens-watchlist-token' => 'Token kanału internetowego (Atom/RSS) zmian w [[Special:Watchlist|obserwowanych stronach]]',
+'resettokens-done' => 'Tokeny zresetowane.',
+'resettokens-resetbutton' => 'Zresetuj wybrane tokeny',
+
# Edit page toolbar
'bold_sample' => 'Tekst tłustą czcionką',
'bold_tip' => 'Tekst tłustą czcionką',
@@ -1084,12 +1147,15 @@ Wystąpił z nieokreślonej przyczyny.',
Zdaje się, że została skasowana.',
'edit-conflict' => 'Konflikt edycji.',
'edit-no-change' => 'Twoja edycja zostaÅ‚a zignorowana, ponieważ nie zmieniÅ‚{{GENDER:|eÅ›|aÅ›|eÅ›(â€aÅ›)}} niczego w tekÅ›cie.',
+'postedit-confirmation' => 'Twoja edycja została zapisana.',
'edit-already-exists' => 'Nie udało się stworzyć nowej strony.
Strona już istnieje.',
'defaultmessagetext' => 'Domyślny tekst komunikatu',
'content-failed-to-parse' => 'Format zawartości typu $2 (dla modelu: $1) nieprawidłowy: $3',
'invalid-content-data' => 'Zawartość strony zawiera nieprawidłowe dane',
'content-not-allowed-here' => 'Zawartość tego typu ($1) nie jest dozwolona na stronie [[$2]]',
+'editwarning-warning' => 'Opuszczenie tej strony może spowodować utratę wprowadzonych przez Ciebie zmian.
+Jeśli jesteś zalogowany możesz wyłączyć wyświetlanie tego ostrzeżenia w zakładce Edycja w swoich preferencjach.',
# Content models
'content-model-wikitext' => 'wikitekst',
@@ -1124,6 +1190,7 @@ Argument ten będzie pominięty.',
'undo-failure' => 'Edycja nie może zostać wycofana z powodu konfliktu z wersjami pośrednimi.',
'undo-norev' => 'Edycja nie może być cofnięta, ponieważ nie istnieje lub została usunięta.',
'undo-summary' => 'Anulowanie wersji $1 autora [[Special:Contributions/$2|$2]] ([[User talk:$2|dyskusja]])',
+'undo-summary-username-hidden' => 'Anulowanie wersji $1 autorstwa ukrytego użytkownika',
# Account creation failure
'cantcreateaccounttitle' => 'Nie można utworzyć konta',
@@ -1303,6 +1370,7 @@ Użycie linków nawigacyjnych kasuje wybór w kolumnie.',
'compareselectedversions' => 'porównaj wybrane wersje',
'showhideselectedversions' => 'Pokaż lub ukryj zaznaczone wersje',
'editundo' => 'anuluj edycjÄ™',
+'diff-empty' => '(Brak różnic)',
'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}})',
'difference-missing-revision' => '{{PLURAL:$2|Wersja|$2 wersje|$2 wersji}} #$1 strony "{{PAGENAME}}" nie {{PLURAL:$2|została znaleziona|zostały znalezione|zostało znalezionych}}.
@@ -1329,7 +1397,6 @@ Zazwyczaj jest to spowodowane przestarzałym linkiem do usuniętej strony. Powó
'searchmenu-legend' => 'Opcje wyszukiwania',
'searchmenu-exists' => "* Strona '''[[$1]]'''",
'searchmenu-new' => "'''Utwórz stronę „[[:$1|$1]]†na tej wiki.'''",
-'searchhelp-url' => 'Help:Spis treści',
'searchmenu-prefix' => '[[Special:PrefixIndex/$1|PrzeglÄ…daj strony zaczynajÄ…ce siÄ™ od tego przedrostka]]',
'searchprofile-articles' => 'Strony',
'searchprofile-project' => 'Strony pomocy i projektu',
@@ -1372,15 +1439,7 @@ Zazwyczaj jest to spowodowane przestarzałym linkiem do usuniętej strony. Powó
'searchdisabled' => 'Wyszukiwanie w {{GRAMMAR:MS.lp|{{SITENAME}}}} zostało wyłączone.
W międzyczasie możesz skorzystać z wyszukiwania Google.
Jednak informacje o treści {{GRAMMAR:D.lp|{{SITENAME}}}} mogą być w Google nieaktualne.',
-
-# Quickbar
-'qbsettings' => 'Pasek szybkiego dostępu',
-'qbsettings-none' => 'Brak',
-'qbsettings-fixedleft' => 'Stały, z lewej',
-'qbsettings-fixedright' => 'Stały, z prawej',
-'qbsettings-floatingleft' => 'UnoszÄ…cy siÄ™, z lewej',
-'qbsettings-floatingright' => 'UnoszÄ…cy siÄ™, z prawej',
-'qbsettings-directionality' => 'Ustawione na stałe, zgodnie z kierunkiem zapisywania w wybranym języku',
+'search-error' => 'Wystąpił błąd podczas wyszukiwania:$1',
# Preferences page
'preferences' => 'Preferencje',
@@ -1414,7 +1473,6 @@ Jednak informacje o treści {{GRAMMAR:D.lp|{{SITENAME}}}} mogą być w Google ni
'resetprefs' => 'Cofnij niezapisane zmiany',
'restoreprefs' => 'Przywróć wszystkie domyślne preferencje (we wszystkich sekcjach)',
'prefs-editing' => 'Edycja',
-'prefs-edit-boxsize' => 'Rozmiar okna edycji.',
'rows' => 'Wiersze',
'columns' => 'Kolumny',
'searchresultshead' => 'Wyszukiwanie',
@@ -1425,9 +1483,9 @@ Jednak informacje o treści {{GRAMMAR:D.lp|{{SITENAME}}}} mogą być w Google ni
'recentchangesdays-max' => '(maksymalnie $1 {{PLURAL:$1|dzień|dni}})',
'recentchangescount' => 'Domyślna liczba wyświetlanych edycji',
'prefs-help-recentchangescount' => 'Uwzględnia ostatnie zmiany, historię stron i rejestry.',
-'prefs-help-watchlist-token' => 'Wypełnianie tego pola tajnym kluczem spowoduje wygenerowanie RSS dla Twojej listy obserwowanych.
-Każdy znający ten klucz będzie mógł zobaczyć listę obserwowanych, należy więc wybrać bezpieczną wartość.
-Wygenerowany losowo klucz, którego możesz użyć to $1',
+'prefs-help-watchlist-token2' => 'To jest tajny klucz umożliwiający dostęp do kanału internetowego zmian w obserwowanych przez ciebie stronach.
+Każdy, kto go zna, będzie mógł je zobaczyć, więc zachowaj go dla siebie.
+[[Special:ResetTokens|Kliknij tu, jeśli musisz go zresetować]].',
'savedprefs' => 'Twoje preferencje zostały zapisane.',
'timezonelegend' => 'Strefa czasowa',
'localtime' => 'Czas lokalny',
@@ -1458,7 +1516,6 @@ Wygenerowany losowo klucz, którego możesz użyć to $1',
'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',
-'prefs-textboxsize' => 'Rozmiar okna edycji',
'youremail' => 'Twój adres eâ€mail',
'username' => '{{GENDER:$1|Nazwa użytkownika}}:',
'uid' => '{{GENDER:$1|Identyfikator użytkownika}}:',
@@ -1490,6 +1547,8 @@ Jeśli zdecydujesz się je podać, zostaną użyte, by udokumentować Twoje auto
'prefs-dateformat' => 'Format daty',
'prefs-timeoffset' => 'Różnica czasu',
'prefs-advancedediting' => 'Opcje ogólne',
+'prefs-editor' => 'Edytor',
+'prefs-preview' => 'PodglÄ…d',
'prefs-advancedrc' => 'Zaawansowane',
'prefs-advancedrendering' => 'Zaawansowane',
'prefs-advancedsearchoptions' => 'Zaawansowane',
@@ -1497,7 +1556,9 @@ Jeśli zdecydujesz się je podać, zostaną użyte, by udokumentować Twoje auto
'prefs-displayrc' => 'Opcje wyświetlania',
'prefs-displaysearchoptions' => 'Opcje wyświetlania',
'prefs-displaywatchlist' => 'Opcje wyświetlania',
+'prefs-tokenwatchlist' => 'Token',
'prefs-diffs' => 'Zmiany',
+'prefs-help-prefershttps' => 'Ta opcja zacznie działać przy twoim następnym zalogowaniu.',
# User preference: email validation using jQuery
'email-address-validity-valid' => 'Wygląda na prawidłowy',
@@ -1524,6 +1585,8 @@ Jeśli zdecydujesz się je podać, zostaną użyte, by udokumentować Twoje auto
'userrights-notallowed' => 'Nie jesteś upoważniony do nadawania i odbierania uprawnień użytkownikom.',
'userrights-changeable-col' => 'Grupy, które możesz wybrać',
'userrights-unchangeable-col' => 'Grupy, których nie możesz wybrać',
+'userrights-conflict' => 'Konflikt zmiany uprawnień użytkownika! Proszę sprawdzić i potwierdzić swoje zmiany.',
+'userrights-removed-self' => 'Pomyślnie odebrałeś sobie uprawnienia. W związku z tym nie masz już dostępu do tej strony.',
# Groups
'group' => 'Grupa',
@@ -1589,11 +1652,19 @@ Jeśli zdecydujesz się je podać, zostaną użyte, by udokumentować Twoje auto
'right-proxyunbannable' => 'Obejście automatycznych blokad proxy',
'right-unblockself' => 'Odblokowanie samego siebie',
'right-protect' => 'Zmiana stopnia zabezpieczenia i dostęp do edycji stron zabezpieczonych kaskadowo',
-'right-editprotected' => 'Dostęp do edycji zabezpieczonych stron (bez zabezpieczenia dziedziczonego)',
+'right-editprotected' => 'Edycja stron zabezpieczonych na poziomie „{{int:protect-level-sysop}}â€',
+'right-editsemiprotected' => 'Edycja stron zabezpieczonych na poziomie „{{int:protect-level-autoconfirmed}}â€',
'right-editinterface' => 'Edycja interfejsu użytkownika',
'right-editusercssjs' => 'Edycja plików CSS i JS innych użytkowników',
'right-editusercss' => 'Edycja plików CSS innych użytkowników',
'right-edituserjs' => 'Edycja plików JS innych użytkowników',
+'right-editmyusercss' => 'Edytuj własne pliki CSS',
+'right-editmyuserjs' => 'Edytuj własne pliki JavaScript',
+'right-viewmywatchlist' => 'PodglÄ…d swojej listy obserwowanych stron',
+'right-editmywatchlist' => 'Edycja swojej listy obserwowanych stron. Niektóre akcje mogą dodawać strony do obserwowanych bez tego uprawnienia.',
+'right-viewmyprivateinfo' => 'PodglÄ…d swoich prywatnych danych (np. adres e-mail, prawdziwe imiÄ™ i nazwisko)',
+'right-editmyprivateinfo' => 'Edycja swoich prywatnych danych (np. adres e-mail, prawdziwe imiÄ™ i nazwisko)',
+'right-editmyoptions' => 'Edycja swoich preferencji',
'right-rollback' => 'Szybkie wycofanie zmian wprowadzonych przez użytkownika, który jako ostatni edytował jakąś stronę',
'right-markbotedits' => 'Oznaczanie rewertu jako edycji bota',
'right-noratelimit' => 'Brak ograniczeń przepustowości',
@@ -1655,12 +1726,19 @@ Jeśli zdecydujesz się je podać, zostaną użyte, by udokumentować Twoje auto
'action-userrights-interwiki' => 'edytowania uprawnień użytkowników na innych witrynach wiki',
'action-siteadmin' => 'blokowania i odblokowywania bazy danych',
'action-sendemail' => 'wysyłania e-maili',
+'action-editmywatchlist' => 'edycji swojej listy obserwowanych stron',
+'action-viewmywatchlist' => 'zobaczenia swojej listy obserwowanych stron',
+'action-viewmyprivateinfo' => 'zobaczenia swoich prywatnych danych',
+'action-editmyprivateinfo' => 'edycji swoich prywatnych danych',
# Recent changes
'nchanges' => '$1 {{PLURAL:$1|zmiana|zmiany|zmian}}',
+'enhancedrc-since-last-visit' => '$1 {{PLURAL:$1|od ostatniej wizyty}}',
+'enhancedrc-history' => 'historia',
'recentchanges' => 'Ostatnie zmiany',
'recentchanges-legend' => 'Opcje ostatnich zmian',
'recentchanges-summary' => 'Ta strona przedstawia historiÄ™ ostatnich zmian w tej wiki.',
+'recentchanges-noresult' => 'Brak zmian w wybranym okresie spełniających twoje kryteria.',
'recentchanges-feed-description' => 'Obserwuj najświeższe zmiany w tej wiki.',
'recentchanges-label-newpage' => 'W tej edycji utworzono nowÄ… stronÄ™',
'recentchanges-label-minor' => 'To jest drobna zmiana',
@@ -1697,7 +1775,6 @@ Jeśli zdecydujesz się je podać, zostaną użyte, by udokumentować Twoje auto
'recentchangeslinked-feed' => 'Zmiany w linkowanych',
'recentchangeslinked-toolbox' => 'Zmiany w linkowanych',
'recentchangeslinked-title' => 'Zmiany w linkowanych z „$1â€',
-'recentchangeslinked-noresult' => 'Nie było żadnych zmian na (zależnie od ustawień) linkowanych lub linkujących stronach w wybranym okresie.',
'recentchangeslinked-summary' => "Poniżej znajduje się lista ostatnich zmian na stronach linkowanych z podanej strony (lub we wszystkich stronach należących do podanej kategorii).
Strony z [[Special:Watchlist|listy obserwowanych]] są '''wytłuszczone'''.",
'recentchangeslinked-page' => 'Tytuł strony',
@@ -1709,7 +1786,7 @@ Strony z [[Special:Watchlist|listy obserwowanych]] są '''wytłuszczone'''.",
'reuploaddesc' => 'Przerwij wysyłanie i wróć do formularza wysyłki',
'upload-tryagain' => 'Zapisz zmieniony opis pliku',
'uploadnologin' => 'Nie jesteÅ› zalogowany',
-'uploadnologintext' => 'Musisz się [[Special:UserLogin|zalogować]] przed przesłaniem plików.',
+'uploadnologintext' => 'Musisz $1 przed przesłaniem plików.',
'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',
@@ -1941,7 +2018,6 @@ Ponieważ ta wiki została skonfigurowana jako publiczna dla zapewnienia optymal
'http-read-error' => 'BÅ‚Ä…d odczytu HTTP.',
'http-timed-out' => 'Przekroczony czas żądania HTTP.',
'http-curl-error' => 'BÅ‚Ä…d pobierania z adresu $1',
-'http-host-unreachable' => 'Adres jest nieosiÄ…galny.',
'http-bad-status' => 'Wystąpił problem z realizacją żądania HTTP $1 $2',
# Some likely curl errors. More could be added from <http://curl.haxx.se/libcurl/c/libcurl-errors.html>
@@ -1971,6 +2047,10 @@ Możesz także spróbować w czasie mniejszego obciążenia serwera.',
'listfiles_size' => 'Wielkość',
'listfiles_description' => 'Opis',
'listfiles_count' => 'Wersje',
+'listfiles-show-all' => 'Uwzględnij starsze wersje zdjęć',
+'listfiles-latestversion' => 'Aktualna wersja',
+'listfiles-latestversion-yes' => 'Tak',
+'listfiles-latestversion-no' => 'Nie',
# File description page
'file-anchor-link' => 'Plik',
@@ -2068,6 +2148,13 @@ Sprawdź inne linki do szablonów, zanim usuniesz tę stronę.',
'randompage' => 'Losowa strona',
'randompage-nopages' => 'Brak stron w {{PLURAL:$2|przestrzeni nazw|przestrzeniach nazw:}} $1.',
+# Random page in category
+'randomincategory' => 'Losowa strona w kategorii',
+'randomincategory-invalidcategory' => '"$1" nie jest prawidłową nazwą kategorii.',
+'randomincategory-nopages' => 'Nie ma żadnych stron w [[:Category:$1]].',
+'randomincategory-selectcategory' => 'Pobierz losowÄ… stronÄ™ z kategorii: $1 $2.',
+'randomincategory-selectcategory-submit' => 'Dalej',
+
# Random redirect
'randomredirect' => 'Losowe przekierowanie',
'randomredirect-nopages' => 'Brak jakichkolwiek przekierowaÅ„ w przestrzeni nazw „$1â€.',
@@ -2093,17 +2180,13 @@ Sprawdź inne linki do szablonów, zanim usuniesz tę stronę.',
'statistics-users-active-desc' => 'Użytkownicy, którzy byli aktywni w ciągu {{PLURAL:$1|ostatniego dnia|ostatnich $1 dni}}',
'statistics-mostpopular' => 'Najczęściej odwiedzane strony',
-'disambiguations' => 'Strony linkujÄ…ce do stron ujednoznaczniajÄ…cych',
-'disambiguationspage' => 'Template:disambig',
-'disambiguations-text' => "Poniższe strony odwołują się do '''stron ujednoznaczniających''',
-a powinny odwoływać się bezpośrednio do stron treści.<br />
-Strona uznawana jest za ujednoznaczniającą, jeśli zawiera szablon linkowany przez stronę [[MediaWiki:Disambiguationspage]]",
-
'pageswithprop' => 'Strony z właściwościami',
'pageswithprop-legend' => 'Strony z właściwościami',
'pageswithprop-text' => 'Ta strona zawiera listę stron korzystających z właściwości.',
'pageswithprop-prop' => 'Nazwa właściwości:',
'pageswithprop-submit' => 'Pokaż',
+'pageswithprop-prophidden-long' => 'długa wartość własności ukryta ($1)',
+'pageswithprop-prophidden-binary' => 'binarna wartość własności ukryta ($1)',
'doubleredirects' => 'Podwójne przekierowania',
'doubleredirectstext' => 'Lista zawiera strony z przekierowaniami do stron, które przekierowują do innej strony.
@@ -2161,6 +2244,7 @@ Każdy wiersz zawiera linki do pierwszego i drugiego przekierowania oraz link, d
'mostrevisions' => 'Strony o największej liczbie wersji',
'prefixindex' => 'Wszystkie strony o prefiksie',
'prefixindex-namespace' => 'Wszystkie strony z prefiksem (przestrzeń nazw $1)',
+'prefixindex-strip' => 'Ukryj prefiks na liście wyników',
'shortpages' => 'Najkrótsze strony',
'longpages' => 'Najdłuższe strony',
'deadendpages' => 'Strony bez linków wewnętrznych',
@@ -2176,6 +2260,7 @@ Każdy wiersz zawiera linki do pierwszego i drugiego przekierowania oraz link, d
'listusers' => 'Lista użytkowników',
'listusers-editsonly' => 'Pokaż tylko użytkowników z edycjami',
'listusers-creationsort' => 'Sortuj według daty utworzenia',
+'listusers-desc' => 'Sortuj w kolejności malejącej',
'usereditcount' => '$1 {{PLURAL:$1|edycja|edycje|edycji}}',
'usercreated' => '{{GENDER:$3|Utworzył|Utworzyła|Utworzone}} $1 o $2',
'newpages' => 'Nowe strony',
@@ -2352,10 +2437,9 @@ Każda zmiana treści tej strony lub związanej z nią strony dyskusji zostanie
'unwatchthispage' => 'Nie obserwuj',
'notanarticle' => 'To nie jest artykuł',
'notvisiblerev' => 'Wersja została usunięta',
-'watchnochange' => 'Żadna z obserwowanych stron nie była edytowana w podanym okresie.',
'watchlist-details' => 'Lista obserwowanych przez Ciebie stron zawiera {{PLURAL:$1|$1 pozycjÄ™|$1 pozycje|$1 pozycji}}, nie liczÄ…c stron dyskusji.',
-'wlheader-enotif' => '* WysyÅ‚anie powiadomieÅ„ na adres eâ€mail jest wÅ‚Ä…czone.',
-'wlheader-showupdated' => "* '''Wytłuszczone''' zostały strony, które zostały zmodyfikowane od Twojej ostatniej na nich wizyty.",
+'wlheader-enotif' => 'WysyÅ‚anie powiadomieÅ„ na adres eâ€mail jest wÅ‚Ä…czone.',
+'wlheader-showupdated' => "'''Wytłuszczone''' zostały strony, które zostały zmodyfikowane od Twojej ostatniej wizyty na nich.",
'watchmethod-recent' => 'poszukiwanie ostatnich zmian wśród obserwowanych stron',
'watchmethod-list' => 'poszukiwanie obserwowanych stron wśród ostatnich zmian',
'watchlistcontains' => 'Na liście obserwowanych przez Ciebie stron {{PLURAL:$1|znajduje się 1 pozycja|znajdują się $1 pozycje|znajduje się $1 pozycji}}.',
@@ -2603,7 +2687,7 @@ $1',
'contributions' => 'Wkład {{GENDER:$1|użytkownika|użytkowniczki}}',
'contributions-title' => 'Wkład {{GENDER:$1|użytkownika|użytkowniczki}} $1',
'mycontris' => 'Edycje',
-'contribsub2' => 'Dla użytkownika $1 ($2)',
+'contribsub2' => 'Dla {{GENDER:$3|użytkownika|użytkowniczki}} $1 ($2)',
'nocontribs' => 'Brak zmian odpowiadajÄ…cych tym kryteriom.',
'uctop' => '(ostatnia)',
'month' => 'Do miesiąca (włącznie)',
@@ -2761,15 +2845,13 @@ By przejrzeć listę obecnie aktywnych blokad, przejdź na stronę [[Special:Blo
Należy on do zablokowanego zakresu adresów $2. Odblokować można tylko cały zakres.',
'ip_range_invalid' => 'Niepoprawny zakres adresów IP.',
'ip_range_toolarge' => 'Zakresy IP większe niż /$1 są niedozwolone.',
-'blockme' => 'Zablokuj mnie',
'proxyblocker' => 'Blokowanie proxy',
-'proxyblocker-disabled' => 'Ta funkcja jest wyłączona.',
'proxyblockreason' => 'Twój adres IP został zablokowany, ponieważ jest to adres otwartego proxy.
O tym poważnym problemie dotyczącym bezpieczeństwa należy poinformować dostawcę Internetu lub pomoc techniczną.',
-'proxyblocksuccess' => 'Wykonano.',
'sorbsreason' => 'Twój adres IP znajduje się na liście serwerów open proxy w DNSBL, używanej przez {{GRAMMAR:B.lp|{{SITENAME}}}}.',
'sorbs_create_account_reason' => 'Twój adres IP znajduje się na liście serwerów open proxy w DNSBL, używanej przez {{GRAMMAR:B.lp|{{SITENAME}}}}.
Nie możesz utworzyć konta',
+'xffblockreason' => 'Adres IP obecny w nagłówku X-Forwarded-For – twój lub serwera proxy, z którego korzystasz – został zablokowany. Powód blokady to: $1',
'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',
@@ -2933,6 +3015,8 @@ Odwiedź [//www.mediawiki.org/wiki/Localisation Tłumaczenie MediaWiki] oraz [//
'thumbnail-more' => 'Powiększ',
'filemissing' => 'Brak pliku',
'thumbnail_error' => 'BÅ‚Ä…d przy generowaniu miniatury $1',
+'thumbnail_error_remote' => 'Komunikat o błędzie z {{grammar:2sg|$1}}:
+$2',
'djvu_page_error' => 'Strona DjVu poza zakresem',
'djvu_no_xml' => 'Nie można pobrać danych w formacie XML dla pliku DjVu',
'thumbnail-temp-create' => 'Nie można utworzyć pliku tymczasowego miniatury',
@@ -3083,17 +3167,11 @@ Pozwala na wpisanie powodu w opisie zmian.',
# Stylesheets
'common.css' => '/* Umieszczony tutaj kod CSS zostanie zastosowany we wszystkich skórkach */',
-'standard.css' => '/* Umieszczony tutaj kod CSS wpłynie na wygląd skórki Standardowa */',
-'nostalgia.css' => '/* Umieszczony tutaj kod CSS wpłynie na wygląd skórki Tęsknota */',
'cologneblue.css' => '/* Umieszczony tutaj kod CSS wpłynie na wygląd skórki Błękit */',
'monobook.css' => '/* Umieszczony tutaj kod CSS wpłynie na wygląd skórki Książka */',
-'myskin.css' => '/* Umieszczony tutaj kod CSS wpłynie na wygląd skórki Moja skórka */',
-'chick.css' => '/* Umieszczony tutaj kod CSS wpłynie na wygląd skórki Kurczaczek */',
-'simple.css' => '/* Umieszczony tutaj kod CSS wpłynie na wygląd skórki Prosta */',
'modern.css' => '/* Umieszczony tutaj kod CSS wpłynie na wygląd skórki Nowoczesna */',
'vector.css' => '/* Umieszczony tutaj kod CSS wpłynie na wygląd skórki Wektor */',
'print.css' => '/* Umieszczony tutaj kod CSS wpłynie na wygląd wydruku */',
-'handheld.css' => '/* Umieszczony tutaj kod CSS wpłynie na wygląd na urządzeniach kieszonkowych skórki ustawionej w zmiennej $wgHandheldStyle */',
'noscript.css' => '/* Umieszczony tu arkusz stylów CSS będzie wykorzystywany dla użytkowników z wyłączoną obsługą JavaScript */',
'group-autoconfirmed.css' => '/* CSS tutaj umieszczony będzie dotyczyć tylko automatycznie zatwierdzonych użytkowników */',
'group-bot.css' => '/* CSS tutaj umieszczony będzie obowiązywał tylko dla botów */',
@@ -3102,13 +3180,8 @@ Pozwala na wpisanie powodu w opisie zmian.',
# Scripts
'common.js' => '/* Umieszczony tutaj kod JavaScript zostanie załadowany przez każdego użytkownika, podczas każdego ładowania strony. */',
-'standard.js' => '/* Umieszczony tutaj kod JavaScript zostanie załadowany wyłącznie przez użytkowników korzystających ze skórki Standardowa */',
-'nostalgia.js' => '/* Umieszczony tutaj kod JavaScript zostanie załadowany wyłącznie przez użytkowników korzystających ze skórki Tęsknota */',
'cologneblue.js' => '/* Umieszczony tutaj kod JavaScript zostanie załadowany wyłącznie przez użytkowników korzystających ze skórki Błękit */',
'monobook.js' => '/* Umieszczony tutaj kod JavaScript zostanie załadowany wyłącznie przez użytkowników korzystających ze skórki Książka */',
-'myskin.js' => '/* Umieszczony tutaj kod JavaScript zostanie załadowany wyłącznie przez użytkowników korzystających ze skórki Moja skórka */',
-'chick.js' => '/* Umieszczony tutaj kod JavaScript zostanie załadowany wyłącznie przez użytkowników korzystających ze skórki Kurczaczek */',
-'simple.js' => '/* Umieszczony tutaj kod JavaScript zostanie załadowany wyłącznie przez użytkowników korzystających ze skórki Prosta */',
'modern.js' => '/* Umieszczony tutaj kod JavaScript zostanie załadowany wyłącznie przez użytkowników korzystających ze skórki Nowoczesna */',
'vector.js' => '/* Umieszczony tutaj kod JavaScript zostanie załadowany wyłącznie przez użytkowników korzystających ze skórki Wektor */',
@@ -3184,13 +3257,8 @@ Najprawdopodobniej zostało to spowodowane przez link do zewnętrznej strony int
'pageinfo-category-files' => 'Liczba plików',
# Skin names
-'skinname-standard' => 'Standardowa',
-'skinname-nostalgia' => 'Tęsknota',
'skinname-cologneblue' => 'Błękit',
'skinname-monobook' => 'Książka',
-'skinname-myskin' => 'Moja skórka',
-'skinname-chick' => 'Kurczaczek',
-'skinname-simple' => 'Prosta',
'skinname-modern' => 'Nowoczesna',
'skinname-vector' => 'Wektor',
@@ -3272,11 +3340,25 @@ Jeśli go otworzysz, możesz zarazić swój system.",
'minutes' => '{{PLURAL:$1|$1 minuta|$1 minuty|$1 minut}}',
'hours' => '{{PLURAL:$1|$1 godzina|$1 godziny|$1 godzin}}',
'days' => '{{PLURAL:$1|$1 dzień|$1 dni}}',
+'weeks' => '{{PLURAL:$1|$1 tydzień|$1 tygodnie|$1 tygodni}}',
'months' => '{{PLURAL:$1|$1 miesiąc|$1 miesiące|$1 miesięcy}}',
'years' => '{{PLURAL:$1|$1 rok|$1 lata|$1 lat}}',
'ago' => '$1 temu',
'just-now' => 'przed chwilÄ…',
+# Human-readable timestamps
+'hours-ago' => '{{PLURAL:$1|przed godzinÄ…|$1 godziny temu|$1 godzin temu}}',
+'minutes-ago' => '{{PLURAL:$1|przed minutÄ…|$1 minuty temu|$1 minut temu}}',
+'seconds-ago' => '{{PLURAL:$1|przed sekundÄ…|$1 sekundy temu|$1 sekund temu}}',
+'monday-at' => 'poniedziałek, $1',
+'tuesday-at' => 'wtorek, $1',
+'wednesday-at' => 'środa, $1',
+'thursday-at' => 'czwartek, $1',
+'friday-at' => 'piÄ…tek, $1',
+'saturday-at' => 'sobota, $1',
+'sunday-at' => 'niedziela, $1',
+'yesterday-at' => 'wczoraj, $1',
+
# Bad image list
'bad_image_list' => 'Dane należy wprowadzić w formacie:
@@ -3306,7 +3388,7 @@ Pozostałe pola zostaną domyślnie ukryte.
* gpslongitude
* gpsaltitude',
-# EXIF tags
+# Exif tags
'exif-imagewidth' => 'Szerokość',
'exif-imagelength' => 'Wysokość',
'exif-bitspersample' => 'Bitów na próbkę',
@@ -3486,7 +3568,7 @@ Pozostałe pola zostaną domyślnie ukryte.
'exif-originalimageheight' => 'Wysokość obrazu zanim został przycięty',
'exif-originalimagewidth' => 'Szerokość obrazu zanim został przycięty',
-# EXIF attributes
+# Exif attributes
'exif-compression-1' => 'nieskompresowany',
'exif-compression-2' => 'CCITT Grupa 3 Jednowymiarowe zmodyfikowane kodowanie długości algorytmem Huffmana',
'exif-compression-3' => 'CCITT Grupa 3 kodowanie faksowe',
@@ -3806,7 +3888,6 @@ Czy na pewno chcesz ją ponownie utworzyć?",
'confirm-unwatch-top' => 'Usunąć tę stronę z listy obserwowanych?',
# Separators for various lists, etc.
-'autocomment-prefix' => '–&#32;',
'percent' => '$1&#160;%',
# Multipage image navigation
@@ -3932,7 +4013,6 @@ Możesz także użyć [[Special:EditWatchlist|standardowego edytora obserwowanyc
'version-other' => 'Pozostałe',
'version-mediahandlers' => 'Wtyczki obsługi mediów',
'version-hooks' => 'Haki (ang. hooks)',
-'version-extension-functions' => 'Funkcje rozszerzeń',
'version-parser-extensiontags' => 'Znaczniki rozszerzeń dla analizatora składni',
'version-parser-function-hooks' => 'Funkcje haków analizatora składni (ang. parser function hooks)',
'version-hook-name' => 'Nazwa haka (ang. hook name)',
@@ -3941,6 +4021,7 @@ Możesz także użyć [[Special:EditWatchlist|standardowego edytora obserwowanyc
'version-license' => 'Licencja',
'version-poweredby-credits' => "Ta wiki korzysta z oprogramowania '''[//www.mediawiki.org/ MediaWiki]''', copyright © 2001â€$1 $2.",
'version-poweredby-others' => 'inni',
+'version-poweredby-translators' => 'tłumacze translatewiki.net',
'version-credits-summary' => 'Następujące osoby wniosły istotny wkład w rozwój oprogramowania [[Special:Version|MediaWiki]].',
'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.
@@ -3954,12 +4035,17 @@ Powinieneś otrzymać [{{SERVER}}{{SCRIPTPATH}}/COPYING kopię licencji GNU Gene
'version-entrypoints-header-entrypoint' => 'Punkt wejścia',
'version-entrypoints-header-url' => 'URL',
-# Special:FilePath
-'filepath' => 'Ścieżka do pliku',
-'filepath-page' => 'Plik',
-'filepath-submit' => 'Przejdź',
-'filepath-summary' => 'Ta strona specjalna zwraca pełną ścieżkę do pliku.
-Grafiki są pokazywane w pełnej rozdzielczości. Inne typy plików są otwierane w skojarzonym z nimi programie.',
+# Special:Redirect
+'redirect' => 'Przekierowanie według pliku, użytkownika albo identyfikatora wersji',
+'redirect-legend' => 'Przekieruj do pliku lub strony',
+'redirect-summary' => 'Ta strona specjalna przekierowuje do pliku (wg nazwy pliku), do strony (wg numeru wersji) albo do strony użytkownika (wg liczbowego identyfikatora użytkownika)',
+'redirect-submit' => 'Przejdź',
+'redirect-lookup' => 'Wyszukaj:',
+'redirect-value' => 'Wartość:',
+'redirect-user' => 'ID użytkownika',
+'redirect-revision' => 'Wersja strony',
+'redirect-file' => 'Nazwa pliku',
+'redirect-not-exists' => 'Nie znaleziono wartości',
# Special:FileDuplicateSearch
'fileduplicatesearch' => 'Szukaj duplikatów pliku',
@@ -4008,12 +4094,16 @@ Grafiki są pokazywane w pełnej rozdzielczości. Inne typy plików są otwieran
'tags' => 'Sprawdź zmiany w oparciu o wzorce tekstu',
'tag-filter' => 'Filtr [[Special:Tags|wzorców tekstu]]',
'tag-filter-submit' => 'Filtr',
+'tag-list-wrapper' => '([[Special:Tags|{{PLURAL:$1|Znacznik|Znaczniki}}]]: $2)',
'tags-title' => 'Znaczniki',
'tags-intro' => 'Na tej stronie znajduje się lista wzorców tekstu, dla których oprogramowanie może oznaczyć edycje, dodatkowo wskazując ich znaczenie.',
'tags-tag' => 'Nazwa znacznika',
'tags-display-header' => 'WystÄ…pienia na listach zmian',
'tags-description-header' => 'Pełny opis znaczenia',
+'tags-active-header' => 'Aktywny?',
'tags-hitcount-header' => 'Oznaczone zmiany',
+'tags-active-yes' => 'Tak',
+'tags-active-no' => 'Nie',
'tags-edit' => 'edytuj',
'tags-hitcount' => '$1 {{PLURAL:$1|zmiana|zmiany|zmian}}',
@@ -4034,6 +4124,7 @@ Grafiki są pokazywane w pełnej rozdzielczości. Inne typy plików są otwieran
'dberr-problems' => 'Przepraszamy! Witryna ma problemy techniczne.',
'dberr-again' => 'Spróbuj przeładować stronę za kilka minut.',
'dberr-info' => '(Brak komunikacji z serwerem bazy danych – $1)',
+'dberr-info-hidden' => '(Nie można skontaktować się z serwerem bazy danych)',
'dberr-usegoogle' => 'Możesz spróbować wyszukać w międzyczasie za pomocą Google.',
'dberr-outofdate' => 'Uwaga – indeksy zawartości serwisu mogą być nieaktualne.',
'dberr-cachederror' => 'Strona została pobrana z pamięci podręcznej i może być nieaktualna.',
@@ -4049,6 +4140,9 @@ Grafiki są pokazywane w pełnej rozdzielczości. Inne typy plików są otwieran
'htmlform-submit' => 'Zapisz',
'htmlform-reset' => 'Cofnij zmiany',
'htmlform-selectorother-other' => 'Inne',
+'htmlform-no' => 'Nie',
+'htmlform-yes' => 'Tak',
+'htmlform-chosen-placeholder' => 'Wybierz opcjÄ™',
# SQLite database support
'sqlite-has-fts' => '$1 z obsługą pełnotekstowego wyszukiwania',
@@ -4166,4 +4260,19 @@ W przeciwnym wypadku można użyć prostego formularza poniżej. Komentarz zosta
# Image rotation
'rotate-comment' => 'Obraz został odwrócony o $1 {{PLURAL:$1|stopień|stopnie|stopni}} (w kierunku zgodnym z ruchem wskazówek zegara)',
+# Limit report
+'limitreport-title' => 'Dane profilowania parsera:',
+'limitreport-cputime' => 'Czas pracy (CPU)',
+'limitreport-cputime-value' => '$1 {{PLURAL:$1|sekunda|sekund}}',
+'limitreport-walltime' => 'Czas pracy (faktyczny)',
+'limitreport-walltime-value' => '$1 {{PLURAL:$1|sekunda|sekund}}',
+'limitreport-ppvisitednodes' => 'Liczba odwiedzonych węzłów preprocesora',
+'limitreport-ppgeneratednodes' => 'Liczba wygenerowanych węzłów preprocesora',
+'limitreport-postexpandincludesize' => 'Rozmiar dołączonych elementów po ekspansji',
+'limitreport-postexpandincludesize-value' => '$1/$2 {{PLURAL:$2|bajt|bajty|bajtów}}',
+'limitreport-templateargumentsize' => 'Rozmiar argumentów szablonów',
+'limitreport-templateargumentsize-value' => '$1/$2 {{PLURAL:$2|bajt|bajty|bajtów}}',
+'limitreport-expansiondepth' => 'Największa głębokość ekspansji',
+'limitreport-expensivefunctioncount' => 'Liczba wywołań kosztownych funkcji parsera',
+
);
diff --git a/languages/messages/MessagesPms.php b/languages/messages/MessagesPms.php
index 744db426..c9bce10f 100644
--- a/languages/messages/MessagesPms.php
+++ b/languages/messages/MessagesPms.php
@@ -72,9 +72,6 @@ $messages = array(
'tog-shownumberswatching' => "Smon-e ël nùmer d'utent che as ten-o la pàgina sot-euj",
'tog-oldsig' => 'Firma esistenta:',
'tog-fancysig' => "Traté la firma com dël test wiki (sensa n'anliura automàtica)",
-'tog-externaleditor' => "Dovré coma stàndard n'editor estern (mach për espert, a-i é dabzògn d'ampostassion speciaj dzora a sò ordinator. [//www.mediawiki.org/wiki/Manual:External_editors Për savèjne ëd pi.])",
-'tog-externaldiff' => "Dovré për stàndard un programa comparator estern (mach për espert, a-i é dabzògn d'ampostassion speciaj ansima a sò ordinator [//www.mediawiki.org/wiki/Manual:External_editors Për savèjne ëd pi.])",
-'tog-showjumplinks' => "Dovré j'anliure d'acessibilità dla sòrt «Andé a»",
'tog-uselivepreview' => "Dovré la fonsion ''Preuva dal viv'' (sperimental)",
'tog-forceeditsummary' => "Ciamé conferma se ël resumé dla modìfica a l'é veujd",
'tog-watchlisthideown' => 'Stërmé mie modìfiche ant la ròba che im ten-o sot-euj',
@@ -88,6 +85,8 @@ $messages = array(
'tog-showhiddencats' => 'Smon-e le categorìe stërmà',
'tog-noconvertlink' => "Disativé la conversion dij tìtoj ant j'anliure",
'tog-norollbackdiff' => "Fé nen vëdde le diferense apress d'avèj ripristinà",
+'tog-useeditwarning' => 'Aviseme quand che i chito na pàgina ëd modìfiche con dle modìfiche nen salvà',
+'tog-prefershttps' => "Dovré sempe na conession sigura pr'ësté andrinta al sistema",
'underline-always' => 'Sempe',
'underline-never' => 'Mai',
@@ -151,6 +150,18 @@ $messages = array(
'oct' => 'otó',
'nov' => 'nov',
'dec' => 'dzè',
+'january-date' => '$1 gené',
+'february-date' => '$1 fërvé',
+'march-date' => '$1 mars',
+'april-date' => '$1 avril',
+'may-date' => '$1 maj',
+'june-date' => '$1 giugn',
+'july-date' => '$1 luj',
+'august-date' => '$1 ost',
+'september-date' => '$1 stèmber',
+'october-date' => '$1 otóber',
+'november-date' => '$1 novèmber',
+'december-date' => '$1 dzèmber',
# Categories related messages
'pagecategories' => '{{PLURAL:$1|Categorìa|Categorìe}}',
@@ -232,6 +243,7 @@ $messages = array(
'create-this-page' => 'Creé sta pàgina',
'delete' => 'Scancelé',
'deletethispage' => 'Scancelé sa pàgina',
+'undeletethispage' => 'Arcuperé sta pàgina',
'undelete_short' => 'Arcuperé {{PLURAL:$1|na modìfica|$1 modìfiche}}',
'viewdeleted_short' => 'Vardé {{PLURAL:$1|na modìfica scancelà|$1 modìfiche scancelà}}',
'protect' => 'Protege',
@@ -248,7 +260,7 @@ $messages = array(
'articlepage' => 'Vëdde la pàgina ëd contnù',
'talk' => 'Discussion',
'views' => 'Vìsite',
-'toolbox' => "Bòita dj'utiss",
+'toolbox' => 'Utiss',
'userpage' => 'Che a varda la pàgina Utent',
'projectpage' => 'Che a varda la pàgina ëd proget',
'imagepage' => "Vëdde la pàgina dl'archivi",
@@ -275,7 +287,7 @@ $1",
'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).
+# 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).
'aboutsite' => 'A propòsit ëd {{SITENAME}}',
'aboutpage' => 'Project:A propòsit',
'copyright' => "Ël contnù a resta disponìbil sota $1 gavà ch'a sia marcà an n'àutra manera.",
@@ -285,7 +297,6 @@ $1",
'disclaimers' => 'Avertense',
'disclaimerpage' => 'Project:Avertense generaj',
'edithelp' => 'Agiut a la modìfica',
-'edithelppage' => "Help:Coma scrive n'artìcol",
'helppage' => 'Help:Contnù',
'mainpage' => 'Intrada',
'mainpage-description' => 'Intrada',
@@ -362,17 +373,11 @@ Na lista dle pàgine speciaj bon-e a peul esse trovà ambelessì [[Special:Speci
# General errors
'error' => 'Eror',
'databaseerror' => 'Eror ant la base ëd dat',
-'dberrortext' => "A l'é capitaje n'eror ëd sintassi ant la domanda mandà a la base dij dat.
-Sòn a peul vorèj dì n'eror ant ël programa.
-L'ùltima arcesta mandà a la base dij dat a l'é stàita:
-<blockquote><code>$1</code></blockquote>
-da 'nt la funsion «<code>$2</code>».
-La base dij dat a l'ha dàit n'eror «<samp>$3: $4</samp>».",
-'dberrortextcl' => "A-i é staje n'eror ant la sintassi d'anterogassion dla base ëd dat.
-L'ùltima anterogassion a l'é stàita:
-«$1»
-da andrinta a la funsion «$2».
-La base ëd dat a l'ha dane l'eror «$3: $4»",
+'databaseerror-text' => "A l'é rivaje n'eror d'arcesta ëd base ëd dàit. Sòn a podrìa ven-e da 'n givo ant ël programa.",
+'databaseerror-textcl' => "A l'é rivaje n'eror d'arcesta ëd base ëd dàit.",
+'databaseerror-query' => 'Arcesta: $1',
+'databaseerror-function' => 'Fonsion: $1',
+'databaseerror-error' => 'Eror: $1',
'laggedslavemode' => "'''Avis:''' la pàgina a podrìa ëdcò nen mostré le modìfiche pi recente.",
'readonly' => 'Acess a la base ëd dat sërà për chèich temp.',
'enterlockreason' => 'Che a buta na rason për ël blocagi, con andrinta data e ora ëd quand che a stima che a sarà gavà.',
@@ -406,6 +411,7 @@ Peul desse ch'a l'é già stàit ëscancelà da cheidun d'àutr.",
'cannotdelete-title' => 'As peul pa scancelesse la pàgina «$1»',
'delete-hook-aborted' => "Scancelassion anulà da n'estension.
A l'ha smonù gnun-e spiegassion.",
+'no-null-revision' => 'Impossìbil creé na neuva revision veuida për la pàgina « $1 »',
'badtitle' => 'Tìtol nen giust',
'badtitletext' => "Ël tìtol ëd la pàgina che a l'ha ciamà a l'era nen giust, veuid, o un tìtol nen lijà ëd fasson giusta antra le lenghe o antra le wiki. A podrìa conten-e un o pi caràter ch'a peulo nen esse dovrà ant ij tìtoj.",
'perfcached' => "Ij dat sì-dapress a sòn ëstàit memorisà an local e a peulo esse nen agiornà. Al pi {{PLURAL:$1|n'arzultà a l'é disponìbil|$1 arzultà a son disponìbij}} ant la memòria local.",
@@ -426,11 +432,14 @@ Për gionté o modifiché dle tradussion për tute le wiki, për piasì ch'a deu
'editinginterface' => "'''Dossman!''' A l'é dapress ch'a modìfica na pàgina ch'as deuvra për generé ël test dl'antërfacia dël programa.
Le modìfiche a sta pàgina a toco l'aparensa ëd l'antërfacia utent a tuti j'utent dzora a sta wiki.
Për gionté o cangé dle tradussion për tute le wiki, për piasì ch'a deuvra [//translatewiki.net/translatewiki.net], ël proget ëd localisassion ëd MediaWiki.",
-'sqlhidden' => "(l'anterogassion SQL a l'é stërmà)",
'cascadeprotected' => 'Ant sta pàgina-sì as peulo pa fé ëd modìfiche, përché a-i intra ant {{PLURAL:$1|la pàgina|le pàgine}} butà sot a protession con la fonsion «a tombé» viscà ansima a: $2',
'namespaceprotected' => "A l'ha nen ël përmess dë feje dle modìfiche a le pàgine dlë spassi nominal '''$1'''.",
'customcssprotected' => "Ch'a varda ch'a l'ha pa ël përmess ëd modifiché sta pàgina ëd CSS, për via ch'a l'ha andrinta ij gust ëd n'àutr utent.",
'customjsprotected' => "Ch'a varda ch'a l'ha pa ël përmess ëd modifiché sta pàgina ëd JavaScript, për via ch'a l'ha andrinta ij gust ëd n'àutr utent.",
+'mycustomcssprotected' => "A l'ha pa ël përmess ëd modifiché costa pàgina CSS.",
+'mycustomjsprotected' => "A l'ha pa ël përmess ëd modifiché costa pàgina JavaScript.",
+'myprivateinfoprotected' => "A l'ha pa ël përmess ëd modifiché soe anformassion privà.",
+'mypreferencesprotected' => "A l'ha pa ël përmess ëd modifiché ij sò gust.",
'ns-specialprotected' => 'As peulo nen modifichesse le pàgine speciaj.',
'titleprotected' => "La creassion ëd pàgine con ës tìtol-sì a l'é stàita proibìa da [[User:$1|$1]].
Coma rason a l'ha butà: «''$2''».",
@@ -455,10 +464,19 @@ Ch'a nòta che chèiche pàgine a peulo continué a esse visualisà com s'a fuss
'welcomecreation-msg' => "Sò cont a l'é stàit creà.
Che a dësmentia pa ëd cambié ij [[Special:Preferences|sò gust për {{SITENAME}}]].",
'yourname' => 'Stranòm:',
+'userlogin-yourname' => 'Stranòm',
+'userlogin-yourname-ph' => "Ch'a buta sò stranòm",
+'createacct-another-username-ph' => 'Buté lë stranòm',
'yourpassword' => 'Soa ciav:',
+'userlogin-yourpassword' => 'Ciav',
+'userlogin-yourpassword-ph' => "Ch'a buta soa ciav",
+'createacct-yourpassword-ph' => "Ch'a buta na ciav",
'yourpasswordagain' => 'Che a bata torna soa ciav:',
+'createacct-yourpasswordagain' => "Ch'a confirma la ciav",
+'createacct-yourpasswordagain-ph' => "Ch'a buta torna la ciav",
'remembermypassword' => "Visesse ëd mia ciav ansima a 's navigador (për al pi $1 {{PLURAL:$1|di}})",
-'securelogin-stick-https' => "Resté colegà an HTTPS apress d'esse intrà ant ël sistema",
+'userlogin-remembermypassword' => 'Ten-me andrinta al sistema',
+'userlogin-signwithsecure' => 'Dovré na conession sigura',
'yourdomainname' => 'Sò domini:',
'password-change-forbidden' => 'A peul pa modifiché le ciav dzora a costa wiki.',
'externaldberror' => "Ò che a l'é rivaje n'eror con la base ëd dàit d'autenticassion esterna, ò pura a l'é chiel che a l'é nen autorisà a agiornesse sò cont estern.",
@@ -470,18 +488,44 @@ Che a dësmentia pa ëd cambié ij [[Special:Preferences|sò gust për {{SITENAM
'logout' => "Seurte da 'nt ël sistema",
'userlogout' => 'Dësconession',
'notloggedin' => 'Nen rintrà ant ël sistema',
+'userlogin-noaccount' => 'Ha-lo nen un cont?',
+'userlogin-joinproject' => "Ch'as gionza a {{SITENAME}}",
'nologin' => 'Ha-lo ancó nen un cont? $1.',
'nologinlink' => 'Creé un cont',
'createaccount' => 'Creé un cont',
'gotaccount' => 'Ha-lo già un sò cont? $1.',
'gotaccountlink' => "Ch'a rintra ant ël sistema",
'userlogin-resetlink' => "A l'ha dësmentià ij sò detaj për intré ant ël sistema?",
+'userlogin-resetpassword-link' => 'Riamposté la ciav',
+'helplogin-url' => 'Help:Conession',
+'userlogin-helplink' => '[[{{MediaWiki:helplogin-url}}|Agiut con la conession]]',
+'userlogin-loggedin' => "A l'é già rintrà an ël sistema tanme {{GENDER:$1|$1}}.
+Ch'a deuvra ël formolari sì-sota për rintré coma n'àutr n'utent.",
+'userlogin-createanother' => "Creé n'àutr cont",
+'createacct-join' => "Ch'a anserissa soe anformassion sì-sota.",
+'createacct-another-join' => "Anserì j'anformassion dël cont neuv sì-sota.",
+'createacct-emailrequired' => 'Adrëssa ëd pòsta eletrònica',
+'createacct-emailoptional' => 'Adrëssa ëd pòsta eletrònica (opsional)',
+'createacct-email-ph' => "Ch'a buta soa adrëssa ëd pòsta eletrònica",
+'createacct-another-email-ph' => "Buté l'adrëssa ëd pòsta eletrònica",
'createaccountmail' => "Dovré na ciav temporania d'ancàpit e mandela a l'adrëssa ëd pòsta eletrònica spessificà",
+'createacct-realname' => 'Nòm ver (opsional)',
'createaccountreason' => 'Rason:',
+'createacct-reason' => 'Rason',
+'createacct-reason-ph' => "Përchè a crea n'àutr cont",
+'createacct-captcha' => 'Contròl ëd sigurëssa',
+'createacct-imgcaptcha-ph' => "Ch'a anserissa ël test ch'a s-ciàira sì-dzora",
+'createacct-submit' => "Ch'a crea sò cont",
+'createacct-another-submit' => "Creé n'àutr cont",
+'createacct-benefit-heading' => "{{SITENAME}} a l'é fàit da 'd gent coma chiel.",
+'createacct-benefit-body1' => '{{PLURAL:$1|modìfica|modìfiche}}',
+'createacct-benefit-body2' => '{{PLURAL:$1|pàgina|pàgine}}',
+'createacct-benefit-body3' => '{{PLURAL:$1|contributor}} recent',
'badretype' => "Le doe ciav che a l'ha scrivù a resto diferente antra 'd lor.",
'userexists' => "Lë stranòm anserì a l'é già dovrà.
Për piasì ch'a serna në stranòm diferent.",
'loginerror' => 'Eror ën rintrand ant ël sistema',
+'createacct-error' => 'Eror durant la creassion dël cont',
'createaccounterror' => "A l'é nen podusse creé ël cont: $1",
'nocookiesnew' => "Sò cont a l'é duvèrt, ma chiel a l'ha nen podù rintré ant ël sistema.
{{SITENAME}} a deuvra ij bëscotin për fé rintré la gent ant sò sistema. Belavans chiel a l'ha pa ij bëscotin abilità.
@@ -541,11 +585,13 @@ Për piasì che a buta n'adrëssa scrita giusta ò che a lassa ël camp veujd.",
Se sòn a l'é rivà për eror, a peul lassé perde e fé gnente sensa problema.",
'usernamehasherror' => "Lë stranòm d'utent a peul pa conten-e dij caràter ciapulà",
-'login-throttled' => "It l'has fàit tròpi tentativ recent d'intré.
-Për piasì speta prima ëd prové torna.",
+'login-throttled' => "A l'ha fàit tròpi tentativ recent d'intré ant ël sistema.
+Për piasì, ch'a speta $1 prima ëd prové torna.",
'login-abort-generic' => "Sò tentitiv d'intré ant ël sistema a l'é falì - Abortì",
'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 rot o da l'archiviassion an local d'un prëstanòm.",
+'createacct-another-realname-tip' => "Ël nòm ver a l'é opsional.
+S'a decid ëd butelo, a sarà dovrà për dé a l'utent ël mérit ëd sò travaj.",
# Email sending
'php-mail-error-unknown' => 'Eror pa conossù ant la funsion mail() ëd PHP.',
@@ -561,7 +607,7 @@ Për piasì speta prima ëd prové torna.",
'newpassword' => 'Neuva ciav:',
'retypenew' => 'Che a scriva torna soa neuva ciav:',
'resetpass_submit' => 'Argistré la ciav e rintré ant ël sistema',
-'resetpass_success' => "Soa ciav a l'é stàita registrà sensa problema. I soma dapress a rintré ant ël sistema...",
+'changepassword-success' => "Soa ciav a l'é stàita modificà sensa problema!",
'resetpass_forbidden' => 'Le ciav as peulo pa cambiesse',
'resetpass-no-info' => 'A dev esse rintrà ant ël sustema për acede diretament a sta pàgina.',
'resetpass-submit-loggedin' => "Cangé 'd ciav",
@@ -573,10 +619,11 @@ Peul desse ch'a l'ha già cambià la ciav o a l'ha ciamà na neuva ciav provisò
# Special:PasswordReset
'passwordreset' => 'Ri-inissialisassion ëd la ciav',
-'passwordreset-text' => "Ch'a completa 's formolari për reimposté soa ciav.",
+'passwordreset-text-one' => "Ch'a completa 's formolari për reimposté soa ciav.",
+'passwordreset-text-many' => "{{PLURAL:$1|Ch'a compila un dij camp për riamposté soa ciav.}}",
'passwordreset-legend' => 'Riampostassion ëd la ciav',
'passwordreset-disabled' => "La reinissialisassion ëd le ciav a l'é stàita disabilità su sta wiki.",
-'passwordreset-pretext' => "{{PLURAL:$1||Ch'a anserissa un dij tòch ëd dat sì-sota}}",
+'passwordreset-emaildisabled' => 'Le fonsionalità ëd pòsta eletrònica a son ëstàite disativà su sta wiki.',
'passwordreset-username' => 'Stranòm:',
'passwordreset-domain' => 'Domini:',
'passwordreset-capture' => 'Vëdde ël mëssagi arzultant?',
@@ -600,7 +647,7 @@ A dovrìa intré ant ël sistema e serne na ciav neuva adess. Se quaidun d'àutr
Ciav provisòria: $2',
'passwordreset-emailsent' => "Un mëssagi ëd riampostassion ëd la ciav a l'é stàit spedì.",
'passwordreset-emailsent-capture' => "Un mëssagi ëd riampostassion ëd la ciav a l'é stàit mandà, e a l'é mostrà sì-sota.",
-'passwordreset-emailerror-capture' => "Un mëssagi ëd pro-memòria a l'é stàit generà, e a l'é smonù sì-sota, ma la spedission a l'utent a l'é falìa: $1",
+'passwordreset-emailerror-capture' => "Un mëssagi ëd riampostassion ëd la ciav a l'é stàit generà, e a l'é smonù sì-sota, ma la spedission a {{GENDER:$2|l'utent}} a l'é falìa: $1",
# Special:ChangeEmail
'changeemail' => "Cangé l'adrëssa ëd pòsta eletrònica",
@@ -614,6 +661,19 @@ Ciav provisòria: $2',
'changeemail-submit' => "Cangé l'adrëssa ëd pòsta eletrònica",
'changeemail-cancel' => 'Anulé',
+# Special:ResetTokens
+'resettokens' => 'Riamposté ij geton',
+'resettokens-text' => "Ambelessì a peul riamposté ij geton ch'a permëtto d'acede a chèich dàit privà associà a sò cont.
+
+A dovrìa felo si për asar chiel a l'ha partagiaje con cheidun o si sò cont a l'é stàit compromëttù.",
+'resettokens-no-tokens' => 'A-i é gnun geton da riamposté.',
+'resettokens-legend' => 'Riamposté ij geton.',
+'resettokens-tokens' => 'Geton:',
+'resettokens-token-label' => '$1 (valor atual: $2)',
+'resettokens-watchlist-token' => "Geton për ël fluss an sl'aragnà (Atom/RSS) ëd [[Special:Watchlist|modìfiche a le pàgine che as ten sot-euj]]",
+'resettokens-done' => 'Geton riampostà.',
+'resettokens-resetbutton' => 'Riamposté ij geton selessionà',
+
# Edit page toolbar
'bold_sample' => 'Test an grassèt',
'bold_tip' => 'Test an grassèt',
@@ -777,19 +837,19 @@ L'aministrator che a l'ha fàit ël blocagi a l'ha dàit costa spiegassion: $1",
L'ùltima vos dël registr a l'é smonùa sì-sota për arferiment:",
'semiprotectedpagewarning' => "'''Nòta:''' Costa pàgina-sì a l'é stàita blocà an manera che mach j'utent registrà a peulo modifichela.
L'ùltima vos dël registr a l'é smonùa sì-sota për arferiment:",
-'cascadeprotectedwarning' => "'''Tension:''' sta pàgina-sì a l'é stàita blocà an manera che mach j'utent con la qualìfica da aministrator a peulo modifichela, për via che {{PLURAL:\$1|a l'é proteta|a-i intra ant le pàgine protete}} col sistema \"a cascada\":",
+'cascadeprotectedwarning' => "'''Tension:''' Sta pàgina a l'é stàita blocà an manera che mach j'utent con la qualìfica da aministrator a peulo modifichela, për via che a l'é comprèisa an {{PLURAL:$1|costa pàgina-sì|an coste pàgine-sì}} ch'a l'han ël sistema ëd protession a cascada:",
'titleprotectedwarning' => "'''Avis: sta pàgina-sì a l'é stàita blocà an manera che a-i é dabzògn ëd [[Special:ListGroupRights|drit specìfich]] për creela.'''
L'ùltima vos dël registr a l'é smonùa sì-sota për arferiment:",
-'templatesused' => '{{PLURAL:$1|Stamp|Stamp}} dovrà dzora a sta pàgina-sì:',
-'templatesusedpreview' => '{{PLURAL:$1|Stamp|Stamp}} dovrà ant sta preuva-sì:',
-'templatesusedsection' => '{{PLURAL:$1|Stamp|Stamp}} dovrà ant sta session-sì:',
+'templatesused' => '{{PLURAL:$1|Stamp}} dovrà da costa pàgina-sì:',
+'templatesusedpreview' => '{{PLURAL:$1|Stamp}} dovrà an costa preuva:',
+'templatesusedsection' => '{{PLURAL:$1|Stamp}} dovrà an costa session-sì:',
'template-protected' => '(protet)',
'template-semiprotected' => '(mes-protet)',
'hiddencategories' => 'Sta pàgina-sì a fa part ëd {{PLURAL:$1|na categorìa|$1 categorìe}} stërmà:',
-'edittools' => "<!-- Test ch'a së s-ciàira sot a ij mòduj ëd mòdifica e 'd càrich d'archivi. -->",
-'nocreatetext' => "Cost sit-sì a l'ha limità la possibilità ëd creé dle pàgine neuve.
+'edittools' => "<!-- Test ch'a së s-ciàira sot a ij mòduj ëd modìfica e 'd carie d'archivi. -->",
+'nocreatetext' => "{{SITENAME}} a l'ha limità la possibilità ëd creé dle pàgine neuve.
A peul torné andaré e modifiché na pàgina che a-i é già, ò pura [[Special:UserLogin|rintré ant ël sistema ò deurb-se un cont]].",
-'nocreate-loggedin' => "A l'ha pa ij përmess për creé dle pàgine neuve.",
+'nocreate-loggedin' => "A l'ha pa ël përmess ëd creé dle pàgine neuve.",
'sectioneditnotsupported-title' => "La modìfica dla session a l'é nen prevëdùa",
'sectioneditnotsupported-text' => "La modìfica dla session a l'é nen prevëdùa an costa pàgina ëd modìfica.",
'permissionserrors' => 'Eror ant ij përmess',
@@ -808,12 +868,15 @@ A-i é pa gnun-e spiegassion.",
A smija che a sia stàita scancelà.',
'edit-conflict' => "Conflit d'edission.",
'edit-no-change' => "Toa modìfica a l'é stàita ignorà, përchè a l'é pa stàit fàit gnun cambiament al test.",
+'postedit-confirmation' => "Soa modìfica a l'é stàita salvà!",
'edit-already-exists' => 'As peul nen creesse la pàgina.
A esist già.',
'defaultmessagetext' => "Test che a-i sarìa se a-i fusso pa 'd modìfiche",
'content-failed-to-parse' => "Faliment ëd l'anàlisi dël contnù ëd $2 për ël model $1: $3",
'invalid-content-data' => 'Dat dël contnù pa bon',
'content-not-allowed-here' => "Ël contnù «$1» a l'é nen autorisà an sla pàgina [[$2]]",
+'editwarning-warning' => "Chité sta pàgina-sì a peul feje perde tute le modìfiche ch'a l'ha fàit.
+S'a l'é rintrà ant ël sistema, a peul disabilité st'avis ant la session «Modìfiche» dij sò gust.",
# Content models
'content-model-wikitext' => 'test wiki',
@@ -848,6 +911,7 @@ Costi paràmeter a son stàit lassà fòra.",
'undo-failure' => "Sta modìfica a l'é nen podusse scancelé për via che a-i son dle contradission antra version antrames.",
'undo-norev' => "La modìfica a peul nen esse anulà përchè a esist pa o a l'é stàita anulà.",
'undo-summary' => 'Gavà la revision $1 fàita da [[Special:Contributions/$2|$2]] ([[User talk:$2|Ciaciarade]])',
+'undo-summary-username-hidden' => "Anulé la revision $1 ëd n'utent ëstërmà",
# Account creation failure
'cantcreateaccounttitle' => "As peul pa registresse d'utent",
@@ -1026,6 +1090,7 @@ Ch'a varda mach che a-i ven-a nen fòra un rabel ant la continuità stòrica.",
'compareselectedversions' => 'Paragon-a le version selessionà',
'showhideselectedversions' => 'Smon-e/stërmé le version selessionà',
'editundo' => "buta 'me ch'a l'era",
+'diff-empty' => '(Gnun-a diferensa)',
'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à)",
'difference-missing-revision' => "{{PLURAL:$2|Na revision|$2 revision}} dë sta diferensa ($1) a {{PLURAL:$2|l'é pa stàita|son pa stàite}} trovà.
@@ -1054,7 +1119,6 @@ Sòn a l'é normalment causà da l'andèje dapress a na veja liura stòrica a na
'searchmenu-legend' => "Opsion d'arserca",
'searchmenu-exists' => "'''A-i é na pàgina ciamà \"[[:\$1]]\" dzora a costa wiki'''",
'searchmenu-new' => "'''Creé la pàgina «[[:$1]]» ansima a sta wiki-sì!'''",
-'searchhelp-url' => 'Help:Contnù',
'searchmenu-prefix' => '[[Special:PrefixIndex/$1|Visualisé le pàgine con sto prefiss-sì]]',
'searchprofile-articles' => 'Pàgine ëd contnù',
'searchprofile-project' => "Pàgine d'agiut e ëd proget",
@@ -1096,15 +1160,7 @@ Ch'a preuva a gionté dnans a soa arserca ël prefiss ''all:'' për sërché an
'powersearch-togglenone' => 'Gnun',
'search-external' => 'Arserca esterna',
'searchdisabled' => "L'arserca anterna ëd {{SITENAME}} a l'é nen abilità; për adess a peul prové a dovré un motor d'arserca estern coma Google. (Però che a ten-a da ment che ij contnù ëd {{SITENAME}} listà ant ij motor pùblich a podrìo ëdcò esse nen d'autut agiornà)",
-
-# Quickbar
-'qbsettings' => 'Regolassion dla bara dij menù',
-'qbsettings-none' => 'Gnun',
-'qbsettings-fixedleft' => 'Fissà a la man ësnista',
-'qbsettings-fixedright' => 'Fissà a la man drita',
-'qbsettings-floatingleft' => 'Flotant a la man ësnista',
-'qbsettings-floatingright' => 'Flotant a la man drita',
-'qbsettings-directionality' => 'A pòst, an dipendensa dla diressionalità dë scritura ëd soa lenga',
+'search-error' => "A l'é rivaje n'eror durant l'arserca: $1",
# Preferences page
'preferences' => 'Mè gust',
@@ -1138,7 +1194,6 @@ Ch'a preuva a gionté dnans a soa arserca ël prefiss ''all:'' për sërché an
'resetprefs' => 'Buté torna ij "mè gust" coma a-i ero al prinsipi',
'restoreprefs' => "Buté torna j'ampostassion dë stàndard (an tute le session)",
'prefs-editing' => 'Quàder ëd modìfica dël test',
-'prefs-edit-boxsize' => 'Dimension ëd la fnesta ëd modìfica.',
'rows' => 'Righe:',
'columns' => 'Colòne:',
'searchresultshead' => "Specifiché soe preferense d'arserca",
@@ -1149,9 +1204,9 @@ Ch'a preuva a gionté dnans a soa arserca ël prefiss ''all:'' për sërché an
'recentchangesdays-max' => '(al pì $1 {{PLURAL:$1|di|di}})',
'recentchangescount' => 'Nùmer ëd modìfiche da smon-e për stàndard:',
'prefs-help-recentchangescount' => "Sòn a comprend j'ùltime modìfiche, le stòrie dle pàgine e ij registr.",
-'prefs-help-watchlist-token' => "An ampinend sto camp-sì con na ciav segreta as genererà un fluss RSS për la ròba che as ten sot euj.
-Chicassìa che a conossa la ciav an sto camp-sì a podrà lese la ròba ch'a ten sot euj, parèj ch'a serna un valor sigur.
-Ambelessì a-i é un valor generà a asar che a peul dovré: $1",
+'prefs-help-watchlist-token2' => "Costa a l'é la ciav segreta dël fluss an sl'Aragnà dla lista ëd lòn ch'as ten sot-euj.
+Qualsëssìa përson-a ch'a la conòssa a podrà lese la lista ëd lòn che chiel a ten sot-euj, ch'a-j la mostra donca a gnun.
+[[Special:ResetTokens|Ch'a sgnaca ambelessì s'a l'ha damanca d'ampostela torna]].",
'savedprefs' => 'Ij sò gust a son ëstàit salvà.',
'timezonelegend' => 'Fus orari:',
'localtime' => 'Ora local:',
@@ -1182,7 +1237,6 @@ Ambelessì a-i é un valor generà a asar che a peul dovré: $1",
'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:",
-'prefs-textboxsize' => 'Dimension ëd la fnestra ëd modìfica',
'youremail' => 'Soa adrëssa ëd pòsta eletrònica:',
'username' => '{{GENDER:$1|Stranòm}}:',
'uid' => "Identificativ dl'{{GENDER:$1|utent}}:",
@@ -1217,6 +1271,8 @@ Costa anformassion a sarà pùblica.",
'prefs-dateformat' => 'Formà dla data',
'prefs-timeoffset' => "Diferensa d'ora",
'prefs-advancedediting' => 'Opsion generaj',
+'prefs-editor' => 'Redator',
+'prefs-preview' => 'Preuva',
'prefs-advancedrc' => 'Opsion avansà',
'prefs-advancedrendering' => 'Opsion avansà',
'prefs-advancedsearchoptions' => 'Opsion avansà',
@@ -1224,7 +1280,9 @@ Costa anformassion a sarà pùblica.",
'prefs-displayrc' => 'Opsion ëd visualisassion',
'prefs-displaysearchoptions' => 'Opsion ëd visualisassion',
'prefs-displaywatchlist' => 'Opsion ëd visualisassion',
+'prefs-tokenwatchlist' => 'Geton',
'prefs-diffs' => 'Diferense',
+'prefs-help-prefershttps' => 'Costa preferensa a ancaminrà a marcé a soa pròssima conession.',
# User preference: email validation using jQuery
'email-address-validity-valid' => 'A smija bon',
@@ -1252,6 +1310,8 @@ Costa anformassion a sarà pùblica.",
'userrights-changeable-col' => "Partìe ch'a peul cambié",
'userrights-unchangeable-col' => "Partìe ch'a peul pa cambié",
'userrights-irreversible-marker' => '$1*',
+'userrights-conflict' => "Conflit ëd modìfica ëd drit utent! Për piasì, ch'a lesa torna e ch'a confirma soe modìfiche.",
+'userrights-removed-self' => "A l'ha gavà për da bin ij sò drit. Parèj a peul pa pi acede a costa pàgina.",
# Groups
'group' => 'Partìa:',
@@ -1317,11 +1377,19 @@ Costa anformassion a sarà pùblica.",
'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 an cascada',
-'right-editprotected' => 'Modifiché le pàgine protegiùe (sensa protession a cascada)',
+'right-editprotected' => 'Modifiché le pàgine protegiùe con «{{int:protect-level-sysop}}»',
+'right-editsemiprotected' => 'Modifiché le pàgine protegiùe con «{{int:protect-level-autoconfirmed}}»',
'right-editinterface' => "Modifiché l'antërfacia utent",
'right-editusercssjs' => "Modifiché j'archivi CSS e JavaScript d'àutri utent",
'right-editusercss' => "Modifiché j'archivi CSS d'àutri utent",
'right-edituserjs' => "Modifiché j'archivi JavaScript d'àutri utent",
+'right-editmyusercss' => 'Modifiché ij sò archivi CSS utent',
+'right-editmyuserjs' => 'Modifiché ij sò archivi JavaScript utent',
+'right-viewmywatchlist' => "Vëdde la lista ëd lòn ch'as ten sot-euj",
+'right-editmywatchlist' => "Modifiché la lista ëd lòn ch'as ten sot-euj. Ch'a nòta che chèiche assion a giontran ancora dle pàgine sensa 's drit.",
+'right-viewmyprivateinfo' => "Vëdde ij sò dàit përsonaj (pr'esempi adrëssa ëd pòsta eletrònica, nòm ver)",
+'right-editmyprivateinfo' => "Modifiché ij sò dàit privà (pr'esempi adrëssa ëd pòsta eletrònica, nòm ver)",
+'right-editmyoptions' => 'Modifiché ij sò gust',
'right-rollback' => "Gavé an pressa le modìfiche ëd l'ùltim utent che a l'ha modificà na pàgina particolar",
'right-markbotedits' => "Marché le modìfiche tirà andré com modìfiche d'un trigomiro",
'right-noratelimit' => "Nen esse tocà dal lìmit d'assion",
@@ -1383,12 +1451,19 @@ Costa anformassion a sarà pùblica.",
'action-userrights-interwiki' => "modifiché ij drit ëd j'utent ansima a d'àutre wiki",
'action-siteadmin' => 'bloché o dësbloché la base ëd dàit',
'action-sendemail' => 'mandé dij mëssage an pòsta eletrònica',
+'action-editmywatchlist' => "modifiché la lista ëd la ròba ch'as ten sot-euj",
+'action-viewmywatchlist' => "vëdde la lista ëd la ròba ch'as ten sot-euj",
+'action-viewmyprivateinfo' => 'vëdde soe anformassion përsonaj',
+'action-editmyprivateinfo' => 'modifiché soe anformassion përsonaj',
# Recent changes
'nchanges' => '$1 {{PLURAL:$1|modìfica|modìfiche}}',
+'enhancedrc-since-last-visit' => "$1 {{PLURAL:$1|da l'ùltima visita}}",
+'enhancedrc-history' => 'stòria',
'recentchanges' => 'Ùltime modìfiche',
'recentchanges-legend' => "Opsion dj'ùltime modìfiche",
'recentchanges-summary' => 'An costa pàgina as ten cont dle modìfiche pì recente a la wiki.',
+'recentchanges-noresult' => 'Gnun-e modìfiche corëspondente a costi criteri ant ël perìod dàit.',
'recentchanges-feed-description' => 'Trassé le modìfiche dla wiki pì davzin-e ant ël temp an cost fluss.',
'recentchanges-label-newpage' => "Sta modìfica-sì a l'ha creà na neuva pàgina",
'recentchanges-label-minor' => "Costa a l'é na modìfica cita",
@@ -1425,7 +1500,6 @@ Costa anformassion a sarà pùblica.",
'recentchangeslinked-feed' => 'Modìfiche colegà',
'recentchangeslinked-toolbox' => 'Modìfiche colegà',
'recentchangeslinked-title' => 'Modìfiche ch\'a-i intro con "$1"',
-'recentchangeslinked-noresult' => "Ant ël moment dont ës parla a-i é pa staie gnun-a modìfica a le pàgine con dj'anliure ch'a men-o ambelessì.",
'recentchangeslinked-summary' => "Costa a l'é na lista ëd modìfiche fàite da pòch a pàgine colegà a cola spessificà (o a mèmber ëd na categorìa spessificà).
Le pàgine dzora a [[Special:Watchlist|la lista ëd lòn ch'as ten sot-euj]] a resto marcà an '''grassèt'''.",
'recentchangeslinked-page' => 'Nòm ëd la pàgina:',
@@ -1437,7 +1511,7 @@ Le pàgine dzora a [[Special:Watchlist|la lista ëd lòn ch'as ten sot-euj]] a r
'reuploaddesc' => "Chité e torné al formolari për carié dj'archivi",
'upload-tryagain' => "Mandé la descrission ëd l'archivi modificà",
'uploadnologin' => 'Nen rintrà ant ël sistema',
-'uploadnologintext' => "A dev [[Special:UserLogin|rintré ant ël sistema]] për podèj carié dj'archivi.",
+'uploadnologintext' => "A dev $1 për podèj carié dj'archivi.",
'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',
@@ -1668,7 +1742,6 @@ Për na sicurëssa otimal, img_auth.php a l'é disabilità.",
'http-read-error' => 'Eror ëd letura HTTP.',
'http-timed-out' => "L'arcesta HTTP a l'ha finì sò temp.",
'http-curl-error' => "Eror an sërcand d'arcuperé l'adrëssa dl'aragnà: $1.",
-'http-host-unreachable' => "L'anliura a rispond pa.",
'http-bad-status' => "A l'é staje un problema durant l'arcesta HTTP: $1 $2",
# Some likely curl errors. More could be added from <http://curl.haxx.se/libcurl/c/libcurl-errors.html>
@@ -1696,6 +1769,10 @@ Për na sicurëssa otimal, img_auth.php a l'é disabilità.",
'listfiles_size' => 'Amzura an otet',
'listfiles_description' => 'Descrission',
'listfiles_count' => 'Version',
+'listfiles-show-all' => 'Anclude le veje version ëd le plance',
+'listfiles-latestversion' => 'Version corenta',
+'listfiles-latestversion-yes' => 'É',
+'listfiles-latestversion-no' => 'Nò',
# File description page
'file-anchor-link' => 'Archivi',
@@ -1792,6 +1869,13 @@ Ch'as visa ëd controlé che në stamp a-j serva nen a dj'àutri stamp anans che
'randompage' => 'Na pàgina qualsëssìa',
'randompage-nopages' => 'A-i é pa gnun-a pàgina ant {{PLURAL:$2|lë spassi nominal|jë spassi nominaj}}: lë spassi nominal "$1"',
+# Random page in category
+'randomincategory' => "Pàgina a l'ancàpit ant la categorìa",
+'randomincategory-invalidcategory' => "«$1» a l'é pa un nòm ëd categorìa bon.",
+'randomincategory-nopages' => 'A-i é gnun-e pàgine ant la categorìa [[:Category:$1|$1]].',
+'randomincategory-selectcategory' => "Pijé na pàgina a l'ancàpit da 'nt la categorìa: $1 $2.",
+'randomincategory-selectcategory-submit' => 'Andé',
+
# Random redirect
'randomredirect' => 'Na ridiression qualsëssìa',
'randomredirect-nopages' => 'A-i é pa gnun-a ridiression ant lë spassi nominal "$1".',
@@ -1817,17 +1901,13 @@ Ch'as visa ëd controlé che në stamp a-j serva nen a dj'àutri stamp anans che
'statistics-users-active-desc' => "Utent che a l'han fàit n'assion ant {{PLURAL:$1|l'ùltim di|j'ùltim $1 di}}",
'statistics-mostpopular' => "Pàgine ch'a 'ncontro dë pì",
-'disambiguations' => "Pàgine ch'a men-o vers dle pàgine d'omonimìe",
-'disambiguationspage' => "Template:Gestion dj'omonimìe",
-'disambiguations-text' => "Ste pàgine-sì a men-o a na '''pàgina ëd gestion dj'omònim'''.
-Mach che a dovrìo ëmné bele drit a n'artìcol.<br />
-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]]",
-
'pageswithprop' => 'Pàgine con na propietà ëd pàgina',
'pageswithprop-legend' => 'Pàgine con na propietà ëd pàgina',
'pageswithprop-text' => "Costa pàgina a lista le pàgine ch'a deuvro na propietà 'd pàgina particolar.",
'pageswithprop-prop' => 'Nòm ëd la propietà:',
'pageswithprop-submit' => 'Andé',
+'pageswithprop-prophidden-long' => 'valor ëd propietà ëd test longh stërmà ($1)',
+'pageswithprop-prophidden-binary' => 'valor ëd propietà binaria stërmà ($1)',
'doubleredirects' => 'Ridiression dobie',
'doubleredirectstext' => "Sta pàgina-sì a a lista dle pàgine ch'a armando a d'àutre pàgine ëd ridiression.
@@ -1886,6 +1966,7 @@ Adess a l'é na ridiression a [[$2]].",
'mostrevisions' => 'Artìcoj pì modificà',
'prefixindex' => "Tute le pàgine ch'a ancamin-o con",
'prefixindex-namespace' => 'Tute le pàgine con prefiss ($1 spassi nominal)',
+'prefixindex-strip' => 'Gavé ël prefiss da la lista',
'shortpages' => 'Pàgine curte',
'longpages' => 'Pàgine longhe',
'deadendpages' => 'Pàgine che a men-o da gnun-a part',
@@ -1901,6 +1982,7 @@ Adess a l'é na ridiression a [[$2]].",
'listusers' => "Lista dj'utent",
'listusers-editsonly' => "Mostré mach j'utent ch'a l'han fàit dle modìfiche",
'listusers-creationsort' => 'Ordiné për data ëd creassion',
+'listusers-desc' => 'Ordiné an órdin calant',
'usereditcount' => '$1 {{PLURAL:$1|modìfica|modìfiche}}',
'usercreated' => '{{GENDER:$3|Creà}} ël $1 a $2',
'newpages' => 'Pàgine neuve',
@@ -2079,10 +2161,9 @@ Le modìfiche che a-i saran ant costa pàgina-sì e ant soa pàgina ëd discussi
'unwatchthispage' => 'Chité-lì ëd ten-e sossì sot-euj',
'notanarticle' => "Sòn a l'é pa n'artìcol",
'notvisiblerev' => "La revision a l'é stàita scancelà",
-'watchnochange' => "Gnun-a dle ròbe che as ten sot-euj a l'é staita modificà ant ël periòd ësmonù.",
'watchlist-details' => "A l'é dëmentrè ch'as ten sot-euj {{PLURAL:$1|$1 pàgina|$1 pàgine}}, nen contand cole ëd discussion.",
-'wlheader-enotif' => '* Le notìfiche për pòsta eletrònica a son abilità.',
-'wlheader-showupdated' => "* Cole pàgine che a son ëstàite modificà da quand che a l'é passaje ansima l'ùltima vira a resto marcà an '''grassèt'''",
+'wlheader-enotif' => "La notìfica për pòsta eletrònica a l'é abilità.",
+'wlheader-showupdated' => "Le pàgine che a son ëstàite modificà da quand che a l'é passaje ansima l'ùltima vira a resto marcà an '''grassèt'''",
'watchmethod-recent' => "contròl a j'ùltime modìfiche fàite a le pàgine che as ten sot-euj",
'watchmethod-list' => 'contròl ëd le pàgine che as ten sot-euj për vëdde se a-i sio staje dle modìfiche recente',
'watchlistcontains' => "Soa lista dla ròba ch'as ten sot-euj a l'ha andrinta {{PLURAL:$1|na pàgina|$1 pàgine}}.",
@@ -2330,7 +2411,7 @@ $1",
'contributions' => "Contribussion dë st'{{GENDER:$1|utent}}-sì",
'contributions-title' => 'Contribussion ëd $1',
'mycontris' => 'Contribussion',
-'contribsub2' => 'Për $1 ($2)',
+'contribsub2' => 'Për {{GENDER:$3|$1}} ($2)',
'nocontribs' => "A l'é pa trovasse gnun-a modìfica che a fussa conforma a costi criteri-sì",
'uctop' => '(corenta)',
'month' => 'Mèis:',
@@ -2487,14 +2568,12 @@ coj che sio ij blocagi ativ al dì d'ancheuj.",
'ipb_blocked_as_range' => "Eror: L'adrëssa IP $1 a l'ha gnun blocagi diret ansima e donca a peul pa esse dësblocà. A resta blocà mach për via ch'a l'é ciapà andrinta al ragg $2, e lolì as peul pa dësblochesse.",
'ip_range_invalid' => 'Nùmer IP nen bon.',
'ip_range_toolarge' => "Ij blocagi d'antërvaj pi gròss che /$1 a son pa përmëttù.",
-'blockme' => 'Blòch-me',
'proxyblocker' => "Blocador dj'arpetitor",
-'proxyblocker-disabled' => "Sta funsion-sì a l'é pa abilità.",
'proxyblockreason' => "Soa adrëssa IP a l'é stàita blocà përchè a l'é cola ëd n'arpetitor duvèrt.
Për piasì che a contata sò fornitor ëd conession e che a lo anforma. As trata d'un problema ëd sigurëssa motobin serios.",
-'proxyblocksuccess' => 'Bele fàit.',
'sorbsreason' => "Soa adrëssa IP a l'é listà coma arpetitor duvert (open proxy) ansima al DNSBL dovrà da {{SITENAME}}.",
'sorbs_create_account_reason' => "Soa adrëssa IP a l'é listà coma arpetitor duvèrt (open proxy) ansima al DNSBL dovrà da {{SITENAME}}. A peul nen creésse un cont.",
+'xffblockreason' => "N'adrëssa IP ant l'antestassion X-Forwarded-For, la soa o cola d'un servent fantasma che chiel a deuvra, a l'é stàita blocà. La rason dël blocagi inissial a l'era: $1",
'cant-block-while-blocked' => "A peul pa bloché d'àutri utent antramentre che chiel a l'é blocà.",
'cant-see-hidden-user' => "L'utent ch'a l'é an camin ch'a preuva a bloché a l'é già stàit blocà e stërmà. Da già ch'a l'ha pa ël drit hideuser, a peul pa vëdde o modifiché ël blocagi ëd cost utent.",
'ipbblocked' => "A peul pa bloché o dësbloché d'àutri utent, përchè a l'é blocà chiel-midem",
@@ -2662,6 +2741,8 @@ Për piasì, ch'a vìsita la [//www.mediawiki.org/wiki/Localisation Localisassio
'thumbnail-more' => 'Slarghé',
'filemissing' => 'Archivi che a manca',
'thumbnail_error' => 'Eror antramentr che as fasìa la figurin-a: $1',
+'thumbnail_error_remote' => "Mëssagi d'eror ëd $1:
+$2",
'djvu_page_error' => 'Pàgina DjVu fòra dij lìmit',
'djvu_no_xml' => "As rièss pa a carié l'XML për l'archivi DjVu",
'thumbnail-temp-create' => "Pa bon a creé l'archivi ëd miniadura temporania",
@@ -2965,11 +3046,24 @@ An fasend-lo marcé ansima a sò ordinator chiel a podrìa porteje ëd dann a sÃ
'minutes' => '{{PLURAL:$1|$1 minuta|$1 minute}}',
'hours' => '{{PLURAL:$1|$1 ora|$1 ore}}',
'days' => '{{PLURAL:$1|$1 di|$1 di}}',
+'weeks' => '{{PLURAL:$1|$1 sman-a|$1 sman-e}}',
'months' => '{{PLURAL:$1|$1 mèis}}',
'years' => '{{PLURAL:$1|$1 ann|$1 agn}}',
'ago' => '$1 fa',
'just-now' => 'pròpi adess',
+# Human-readable timestamps
+'minutes-ago' => '$1 {{PLURAL:$1|minuta|minute}} fa',
+'seconds-ago' => '$1 {{PLURAL:$1second}} fa',
+'monday-at' => 'Lùn-es a $1',
+'tuesday-at' => 'Màrtes a $1',
+'wednesday-at' => 'Merco a $1',
+'thursday-at' => 'Giòbia a $1',
+'friday-at' => 'Vënner a $1',
+'saturday-at' => 'Saba a $1',
+'sunday-at' => 'Dùminica a $1',
+'yesterday-at' => 'Jer a $1',
+
# Bad image list
'bad_image_list' => "La forma a l'é costa-sì:
@@ -2997,7 +3091,7 @@ J'àutri a saran stërmà coma stàndard.
* gpslongitude
* gpsaltitude",
-# EXIF tags
+# Exif tags
'exif-imagewidth' => 'Larghëssa',
'exif-imagelength' => 'Autëssa',
'exif-bitspersample' => 'Bit për campion',
@@ -3175,7 +3269,7 @@ J'àutri a saran stërmà coma stàndard.
'exif-originalimageheight' => "Autëssa dla figura prima ch'a fussa ritajà",
'exif-originalimagewidth' => "Larghëssa dla figura prima ch'a fussa ritajà",
-# EXIF attributes
+# Exif attributes
'exif-compression-1' => 'Nen comprimù',
'exif-compression-2' => "CCITT Partìa 3 longheur dla codìfica d'esecussion dla codìfica Huffman modificà ëd dimension 1",
'exif-compression-3' => 'CCITT Partìa 3 codìfica dël fax',
@@ -3595,7 +3689,6 @@ As peul ëdcò [[Special:EditWatchlist|dovré l'editor sòlit]].",
'version-other' => 'Àutr',
'version-mediahandlers' => 'Gestor multimojen',
'version-hooks' => 'Gancio',
-'version-extension-functions' => "Fonsion dj'estension",
'version-parser-extensiontags' => "Tichëtte dj'estension conossùe dal dëscompositor",
'version-parser-function-hooks' => 'Gancio për le fonsion dël dëscompositor',
'version-hook-name' => 'Nòm dël gancio',
@@ -3604,6 +3697,7 @@ As peul ëdcò [[Special:EditWatchlist|dovré l'editor sòlit]].",
'version-license' => 'Licensa',
'version-poweredby-credits' => "Costa wiki-sì a marcia mersì a '''[//www.mediawiki.org/ MediaWiki]''', licensa © 2001-$1 $2.",
'version-poweredby-others' => 'àutri',
+'version-poweredby-translators' => 'tradutor ëd translatewiki.net',
'version-credits-summary' => 'I tnoma a aringrassié le përson-e sì-dapress për soa contribussion a [[Special:Version|MediaWiki]].',
'version-license-info' => "MediaWiki a l'é un programa lìber; a peul passelo an gir 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.
@@ -3618,12 +3712,17 @@ A dovrìa avèj arseivù [{{SERVER}}{{SCRIPTPATH}}/COPYING na còpia dla Licensa
'version-entrypoints-header-url' => "Adrëssa an sl'aragnà",
'version-entrypoints-articlepath' => '[https://www.mediawiki.org/wiki/Manual:$wgArticlePath Senté d\'artìcol]',
-# Special:FilePath
-'filepath' => "Përcors d'archivi",
-'filepath-page' => 'Archivi:',
-'filepath-submit' => 'Përcors',
-'filepath-summary' => "Sta pàgina special-sì a la smon ël përcors complet për n'archivi.
-Le figure a së smon-o a amzura pijn-a, j'àotre sòrt d'archivi a ven-o fàite parte diretament da sò programa a pòsta.",
+# Special:Redirect
+'redirect' => 'Ridirigiù da archivi, utent o ID ëd revision',
+'redirect-legend' => "Ridirige a n'archivi o na pàgina",
+'redirect-summary' => "Costa pàgina special a ponta a n'archivi (dàit un nòm d'archivi), na pàgina (dàita n'ID a la revision) o na pàgina d'utent (dàit n'identificativ numérich a l'utent).",
+'redirect-submit' => 'Andé',
+'redirect-lookup' => 'Arserca:',
+'redirect-value' => 'Valor:',
+'redirect-user' => "ID dl'utent",
+'redirect-revision' => 'Revision ëd la pàgina',
+'redirect-file' => "Nòm ëd l'archivi",
+'redirect-not-exists' => 'Valor nen trovà',
# Special:FileDuplicateSearch
'fileduplicatesearch' => "Arsërca dj'archivi dobi",
@@ -3673,12 +3772,16 @@ Le figure a së smon-o a amzura pijn-a, j'àotre sòrt d'archivi a ven-o fàite
'tags' => 'Tichëtte ëd le modìfiche vàlide',
'tag-filter' => 'Filtror ëd le [[Special:Tags|tichëtte]]:',
'tag-filter-submit' => 'Filtror',
+'tag-list-wrapper' => '([[Special:Tags|{{PLURAL:$1|Tichëtta|Tichëtte}}]]: $2)',
'tags-title' => 'Tichëtte',
'tags-intro' => 'Costa pàgina a lista le tichëtte che ël programa a peul dovré për marché na modìfica, e sò significà.',
'tags-tag' => 'Nòm ëd la tichëtta',
'tags-display-header' => 'Aparensa ant la lista dle modìfiche',
'tags-description-header' => 'Descrission completa dël significà',
+'tags-active-header' => 'Ativ?',
'tags-hitcount-header' => 'Modìfiche con tichëtta',
+'tags-active-yes' => 'Bò',
+'tags-active-no' => 'Nò',
'tags-edit' => 'modifiché',
'tags-hitcount' => '$1 {{PLURAL:$1|cambiament|cambiament}}',
@@ -3699,6 +3802,7 @@ Le figure a së smon-o a amzura pijn-a, j'àotre sòrt d'archivi a ven-o fàite
'dberr-problems' => "An dëspias! Ës sit a l'ha dle dificoltà técniche.",
'dberr-again' => "Ch'a speta chèiche minute e ch'a preuva torna a carié.",
'dberr-info' => '(Conession al servent ëd base ëd dàit impossìbil: $1)',
+'dberr-info-hidden' => '(Conession al servent ëd base ëd dàit impossìbil)',
'dberr-usegoogle' => 'Antratant a peul prové a sërché con Google.',
'dberr-outofdate' => "Ch'a ten-a da ment che soe indesassion dij nòstri contnù a podrìo esse nen agiornà.",
'dberr-cachederror' => "Costa-sì a l'é na còpia an memòria local ëd la pàgina ciamà, e a peul esse nen agiornà.",
@@ -3714,6 +3818,9 @@ Le figure a së smon-o a amzura pijn-a, j'àotre sòrt d'archivi a ven-o fàite
'htmlform-submit' => 'Mandé',
'htmlform-reset' => 'Gavé le modìfiche',
'htmlform-selectorother-other' => 'Àutr',
+'htmlform-no' => 'Nò',
+'htmlform-yes' => 'É',
+'htmlform-chosen-placeholder' => "Serne n'opsion",
# SQLite database support
'sqlite-has-fts' => '$1 con arserca an test pien mantnùa',
@@ -3831,4 +3938,19 @@ Dësnò, a peul dovré ël formolari semplificà sì-sota. Sò coment a sarà gi
# Image rotation
'rotate-comment' => 'Plancià virà ëd $1 {{PLURAL:$1|gre}} an sens orari',
+# Limit report
+'limitreport-title' => "Dàit d'otimisassion ëd l'analisator:",
+'limitreport-cputime' => "Temp CPU d'utilisassion",
+'limitreport-cputime-value' => '$1 {{PLURAL:$1|second}}',
+'limitreport-walltime' => "Temp real d'utilisassion",
+'limitreport-walltime-value' => '$1 {{PLURAL:$1|second}}',
+'limitreport-ppvisitednodes' => 'Cont dij neu ëd prepocessor visità',
+'limitreport-ppgeneratednodes' => 'Cont dij neu ëd preprocessor generà',
+'limitreport-postexpandincludesize' => "Taja d'anclusion dòp espansion",
+'limitreport-postexpandincludesize-value' => '$1/$2 {{PLURAL:$2|byte|bytes}}',
+'limitreport-templateargumentsize' => "Taja dl'argoment ëd lë stamp",
+'limitreport-templateargumentsize-value' => '$1/$2 {{PLURAL:$2|byte|bytes}}',
+'limitreport-expansiondepth' => "Pi granda përfondità d'espansion",
+'limitreport-expensivefunctioncount' => "Cont ëd le fonsion d'anàlisi care",
+
);
diff --git a/languages/messages/MessagesPnb.php b/languages/messages/MessagesPnb.php
index 03399229..5af5a560 100644
--- a/languages/messages/MessagesPnb.php
+++ b/languages/messages/MessagesPnb.php
@@ -51,10 +51,6 @@ $messages = array(
'tog-shownumberswatching' => 'ویکھن آلے لوکاں دی گنتی وکھاؤ۔',
'tog-oldsig' => 'ÛÙ† والے دسخط:',
'tog-fancysig' => 'دستخط نوں وکی ٹیکسڈ ونگوں؎ ورتو(without an automatic link)',
-'tog-externaleditor' => 'ÛÙ…ÛŒØ´Û Ø¨Ø§Ø±Ù„Ø§ Ù„Ú©Ú¾Ù† والا ورتو (ماÛر لوکاں واسطے، اس واسطے تواڑے کمپیوٹر تے خاص تبدیلیاں چائیدیاں نیں۔ [//www.mediawiki.org/wiki/Manual:External_editors مزید معلومات.])',
-'tog-externaldiff' => '
-ÛÙ…ÛŒØ´Û Ø¨Ø§Ø±Ù„Ø§ تبدیلی کرن والا ورتو (ماÛر لوکاں واسطے، اس واسطے تواڑے کمپیوٹر تے خاص تبدیلیاں چائیدیاں نیں۔ [//www.mediawiki.org/wiki/Manual:External_editors مزید معلومات۔])',
-'tog-showjumplinks' => '"ایدر چلو" نوں رلن والے جوڑان نال جوڑو',
'tog-uselivepreview' => 'لائیو پریویو ورتو',
'tog-forceeditsummary' => 'مینون اوسے ویلے دسو جدوں خالی سمری تے آؤ۔',
'tog-watchlisthideown' => 'میری اپنی لکھائی نوں اکھ تھلیوں لکاؤ',
@@ -67,6 +63,7 @@ $messages = array(
'tog-diffonly' => 'تبدیلی توں Ø¹Ù„Ø§ÙˆÛ ØµÙØ­Û Ù†Ø§ وکھاؤ',
'tog-showhiddencats' => 'لکیاں کیٹاگریاں وکھاؤ',
'tog-norollbackdiff' => 'صÙØ­Û’ دی واپسی تے تبدیلی Ú©Úˆ دو',
+'tog-useeditwarning' => 'جدوں میں کوئی صÙØ­Û ØªØ¨Ø¯ÛŒÙ„ÛŒ کر Ú©Û’ بچاۓ بغیر Ú†Ú¾ÚˆÙ† لگاں تے منوں دس دیو',
'underline-always' => 'ÛمیشÛ',
'underline-never' => 'کدی وی نئیں',
@@ -249,7 +246,7 @@ $messages = array(
'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).
+# 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).
'aboutsite' => 'بارے چ {{SITENAME}}',
'aboutpage' => 'Project:بارے وچ',
'copyright' => 'مال $1 دے تھلے ÛÛ’ گا اے۔',
@@ -259,7 +256,6 @@ $messages = array(
'disclaimers' => 'منکرنا',
'disclaimerpage' => 'Project:عام منکرنا',
'edithelp' => 'لکھن وچ مدد',
-'edithelppage' => 'Help:لکھنا',
'helppage' => 'Help:لسٹ',
'mainpage' => 'Ù¾Ûلا صÙÛ',
'mainpage-description' => 'Ù¾Ûلا صÙÛ',
@@ -333,17 +329,6 @@ $messages = array(
# 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' => 'تالا لان دی ÙˆØ¬Û Ø¯Ø³Ùˆ تے Ø§Û ÙˆÛŒ دسو جے کدوں تالا Ú©Ú¾Ù„Û’ گا',
@@ -392,7 +377,6 @@ $messages = array(
'viewyourtext' => 'تسیں آپنی تبدیلیاں دا Ø°Ø±ÛŒØ¹Û Ø§ÛŒØ³ صÙÛ’ تے ویکھ تے کاپی کرسکدے او۔',
'protectedinterface' => 'اے صÙØ­Û’ ساÙٹویئر نوں ورتن دی تھاں دیندا اے تے ایدے غلط ورتن نوں روکن واسطے اینوں بچایا Ûویا اے۔',
'editinginterface' => "'''خبردار:''' تسیں اک ایسا صÙÛ Ø¨Ø¯Ù„ رۓ او جیÛڑا Ù…Ú©Ú¾ÛŒ صÙÛ’ دے سوÙٹویر نوں لکھت دیندا اے۔ ایس صÙÛ’ ج تبدیلی ورتنن والیاں دے Ù…Ú©Ú¾ÛŒ صÙÛ’ دے وکھالے نوں بدل دے گی۔ بولی وٹاندرے لئی، Ù…Ûربانی کرکے میڈیاوکی بولی ویونت [//translatewiki.net/wiki/Main_Page?setlang=en translatewiki.net] ول ویکھو۔",
-'sqlhidden' => '(SQL کھوج چھپائی Ûوئي اے)',
'cascadeprotected' => "ایس صÙÛ’ نوں تبدیلی توں بچایا گیا اے، کیوں جے Ø§ÛŒÛ ØªÚ¾Ù„Û’ دتے Ú¯Û“ {{PLURAL:$1|صÙÛ|صÙÛ’}} Ú† Ûیگا اے تے اینوں ''کیسکیڈنگ'' چنوتی نال بچایا گیا اے:
$2",
@@ -417,7 +401,6 @@ Note that some pages may continue to be displayed as if you were still logged in
'yourpassword' => 'کنجی:',
'yourpasswordagain' => 'کنجی Ø¯ÙˆØ¨Ø§Ø±Û Ù„Ú©Ú¾Ùˆ:',
'remembermypassword' => 'اس براؤزر تے میرا ورتن ناں یاد رکھو ($1 {{PLURAL:$1|دن|دناں}} واسطے)',
-'securelogin-stick-https' => 'لاک ان Ûون دے مگروں HTTPS نال جڑے روو۔',
'yourdomainname' => 'تواڈا علاقÛ:',
'externaldberror' => 'ڈیٹابیس Ú† توانوں Ù¾Ûچاننے Ú† کوئی Ù…Ø³Ø¦Ù„Û Ûویا اے یا Ùیر تسی اپنا بارلا کھاتا نئیں بدل سکدے۔',
'login' => 'اندر آؤ جی',
@@ -516,7 +499,7 @@ Note that some pages may continue to be displayed as if you were still logged in
'newpassword' => 'نوی کنجی:',
'retypenew' => 'نئی کنجی Ø¯ÙˆØ¨Ø§Ø±Û Ù„Ú©Ú¾Ùˆ:',
'resetpass_submit' => 'کنجی رکھو تے لاگ ان ÛÙˆ جاو',
-'resetpass_success' => 'تھواڈی کنجی بدلی جاچکی اے!
+'changepassword-success' => 'تھواڈی کنجی بدلی جاچکی اے!
تسی لاگ ان Ûورۓ او۔۔۔۔۔۔',
'resetpass_forbidden' => 'کنجی بدلی نئیں جاسکدی',
'resetpass-no-info' => 'تسی لاگ ان ÛÙˆÚ©Û’ ای اس صÙØ­Û’ نوں ویکھ سکدے او۔',
@@ -528,10 +511,8 @@ Note that some pages may continue to be displayed as if you were still logged in
# Special:PasswordReset
'passwordreset' => 'کنجی واپس لیاؤ',
-'passwordreset-text' => 'اے Ùارم مکمل کرکے اپنے کھاتے دی معلومات اپنے ای-میل تے منگوالو۔',
'passwordreset-legend' => 'کنجی واپس لیاؤ',
'passwordreset-disabled' => 'اس وکی تے کنجی واپس نئیں لیائی جاسکدی۔',
-'passwordreset-pretext' => '{{PLURAL:$1||تھلے دتے ÛÙˆÛ“ ڈیٹا Ú†ÙˆÚº اک ایتھے دیو}}',
'passwordreset-username' => 'ورتن ناں:',
'passwordreset-domain' => 'ڈومین',
'passwordreset-capture' => 'آن والی ای-میل ویکھو؟',
@@ -757,6 +738,8 @@ Custom .css تے .js pages use a lowercase title, e.g. {{ns:user}}:Foo/vector.cs
'edit-no-change' => 'تواڈی تبدیلی ول کوئی ØªÙˆØ¬Û Ù†Ø¦ÛŒÚºØŒ کیوں جے لکھت Ú† کوئی تبدیلی نئیں۔',
'edit-already-exists' => 'نواں صÙÛ Ù†Ø¦ÛŒÚº بن سکدا۔
Ø§ÛŒÛ Ù¾ÛÙ„Û’ ای Ûیگا اے۔',
+'editwarning-warning' => 'اے صÙÛ’ توں جان تے ÛÙˆ سکدا Ø§ÙˆÛ Ø³Ø§Ø±ÛŒØ§Úº تبدیلیاں Ù…Ú© جان جیÛڑیاں تساں بناياں نیں۔
+اگر تسیں لاکان او، تسیں ایڈیٹنگ سیکشن چ اپنی پسنداں چ ایس خبرداری نوں پعلے ناں۔',
# Parser/template warnings
'expensive-parserfunction-warning' => "'''خبردار:''' ایس صÙÛ’ تے چوکھیاں ساریاں پارسر کلز نیں۔
@@ -976,7 +959,6 @@ $1",
'searchmenu-legend' => 'چنوتیاں کھوجو',
'searchmenu-exists' => "'''ایس ÙˆÚ©ÛŒ تے \"[[:\$1]]\" ناں دا صÙÛ ÛÛ’Û”.'''",
'searchmenu-new' => "'''ایس وکی تے \"[[:\$1]]\" بناؤ'''",
-'searchhelp-url' => 'Help:ÙÛرست',
'searchmenu-prefix' => '[[Special:PrefixIndex/$1|ایس پریÙکس نال صÙÛ’ کھوجو]]',
'searchprofile-articles' => 'لسٹ صÙÛ’',
'searchprofile-project' => 'مدد تے ویونت صÙÛ’',
@@ -1021,15 +1003,6 @@ $1",
تسیں گوگل تے کھوج کرو۔
اے Ú¯Ù„ یاد رکھنا جے انڈیکس {{SITENAME}} دے پرانے Ûون۔',
-# Quickbar
-'qbsettings' => 'کوئکبار',
-'qbsettings-none' => 'کوئی نئیں',
-'qbsettings-fixedleft' => 'Ùکسڈ کھبے',
-'qbsettings-fixedright' => 'Ùکسڈ سجے',
-'qbsettings-floatingleft' => 'Ûلدا کھبے',
-'qbsettings-floatingright' => 'Ûلدا سجے',
-'qbsettings-directionality' => '!!!!Ùکسڈ، تھاڈی بولی تے لپی نال',
-
# Preferences page
'preferences' => 'تانگاں',
'mypreferences' => 'میریاں تانگاں',
@@ -1061,7 +1034,6 @@ $1",
'resetprefs' => 'ناں بچائیاں Ûویاں تبدیلیاں مکاؤ',
'restoreprefs' => 'ÚˆÛŒÙالٹ سیٹنگز Ø¯ÙˆØ¨Ø§Ø±Û Ù„ÛŒØ§Ø¤',
'prefs-editing' => 'لکھائی',
-'prefs-edit-boxsize' => 'تبدیلی کرن والی ونڈو دا ناپ',
'rows' => 'قطار:',
'columns' => 'کالم:',
'searchresultshead' => 'کھوج',
@@ -1072,8 +1044,6 @@ $1",
'recentchangesdays-max' => 'میکسیمم $1 {{PLURAL:$1|دن|دن}}',
'recentchangescount' => 'ÚˆÛŒÙالٹ Ú† تبدیلیاں دی گنتی:',
'prefs-help-recentchangescount' => 'ÛÙ† دیاں تبدیلیاں صÙیاں دے رکارڈ تے لاگاں Ûیگیاں نیں۔',
-'prefs-help-watchlist-token' => 'ایس Ùیلڈ نوں پعرنا اک Ù„Ú©ÛŒ کنجی نال تواڈی اکھ تھلے رکھی لسٹ لئی اک آر ایس ایس Ùیڈ بناۓ گا۔ کوئی ÙˆÛŒ ایس Ùیلڈ Ú† جیÛڑا کنجی جاندا اے تواڈی اکھ تھلے رکھی لسٹ نوں Ù¾Ú‘Ú¾ Ù„Û’ گا، ایس لئی اک پکا نمبر چنو۔
-ایتھے اک الٹا پلٹا نمبر دتا گیا اے جینوں تسیں ورت سکدے او: $1',
'savedprefs' => 'تواڈیاں تانگاں بچا لئیاں گئیاں نیں۔',
'timezonelegend' => 'ویلے دا علاقÛ',
'localtime' => 'مقامی ویلا:',
@@ -1105,7 +1075,6 @@ $1",
اے واپس نئیں Ûوسکدا۔',
'prefs-emailconfirm-label' => 'ای-میل Ú©Ù†Ùرمیشن:',
-'prefs-textboxsize' => 'تبدیلی کرن والی ونڈو دا ناپ',
'youremail' => 'ای میل:',
'username' => 'ورتن آلے دا ناں:',
'uid' => 'ورتن والے دی آئی ڈی',
@@ -1346,7 +1315,6 @@ $1",
'recentchangeslinked-feed' => 'ملدیاں جلدیاں تبدیلیاں',
'recentchangeslinked-toolbox' => 'ملدیاں جلدیاں تبدیلیاں',
'recentchangeslinked-title' => '"$1" نال تعلق آلیاں تبدیلیاں',
-'recentchangeslinked-noresult' => 'جڑیاں صÙحیاں Ú† دتے ÛÙˆÛ“ ویلے Ú† کوئی تبدیلیاں Ù†Ûیں۔',
'recentchangeslinked-summary' => "اے اوناں تبدیلیاں دی لسٹ اے جیڑیاں تھوڑا چر Ù¾Ûلاں بنائیاں گئیاں اوناں صÙحیاں تے جیڑے خاص صÙØ­Û’ تے جڑدے Ù†Û’ یا کسی خاص کیٹاگری دے ممبراں نوں۔<br />
تواڈی [[Special:Watchlist|اکھ تھلے صÙØ­Û’]] '''موٹے''' نیں۔",
'recentchangeslinked-page' => 'صÙÛ’ دا ناں:',
@@ -1573,7 +1541,6 @@ $1",
'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>
@@ -1720,12 +1687,6 @@ $1",
'statistics-users-active-desc' => 'ورتنوالے جناں نیں پچھلے {{PLURAL:$1|دن|$1 دناں}} چ کم کیتا اے۔',
'statistics-mostpopular' => 'سب توں بوتے ویکھے Ú¯Û“ صÙÛ’',
-'disambiguations' => 'Ø§ÙˆÛ ØµÙÛ’ جیÛÚ‘Û’ گنجل کھول صÙیاں نال جڑدے نیں۔',
-'disambiguationspage' => 'سانچÛ: ڈسایمبگ',
-'disambiguations-text' => "تھلے دتے Ú¯Û“ صÙیاں دا اک '''گنجل کھول''' نال جوڑ اے۔
-ایدے بجاۓ ایدا جوڑ کسے ٹھیک سرناویں نال جوڑو<br />
-اک صÙÛ Ú¯Ù†Ø¬Ù„ کھول صÙÛ’ لئی منیا جائیگا اگر اے اک ٹمپلیٹ ورتدا جیدا جوڑ [[MediaWiki:Disambiguationspage]] نال Ûووے۔",
-
'doubleredirects' => 'دوÛری ریڈیرکٹس',
'doubleredirectstext' => 'ایس صÙÛ’ تے اوناں صÙیاں دی لسٹ اے جیÛÚ‘Û’ ریڈائرکٹ کردے نیں دوجے ریڈائرکٹ صÙیاں ول۔
Ûر قطار Ú† جوڑ نیں Ù¾ÛÙ„Û’ تے دوجے ریڈائرکٹ نال ØŒ نال دوجے دیڑائرکٹ ول دا تارگٹ نیں جیÛڑا Ú©Û’ ٹھیک تارگٹ صÙÛ Ûوندا اے جیÛڑا Ú©Û Ù¾ÛÙ„Û’ ریڈائرکٹ نوں Ø§Ø´Ø§Ø±Û Ú©Ø±Ù†Ø§ چائیدا اے۔
@@ -1964,10 +1925,9 @@ $1",
'unwatchthispage' => 'اکھ رکھنا چھڈو',
'notanarticle' => 'Ù„Ú©Ú¾Ù† صÙÛ Ù†Ø¦ÛŒÚºÛ”',
'notvisiblerev' => 'آخری ریوین کسے Ûور ورتن والے دی مٹادتی گئی اے۔',
-'watchnochange' => 'دسے گۓ ویلے چ تھواڈیاں ویکھیاںشیواں نئیں بدلیاں گیاں۔',
'watchlist-details' => '{{PLURAL:$1|$1 صÙØ­Û|$1 صÙØ­Û}} تواڈی اکھ تھلے گلاں باتاں شامل Ù†Ûیں۔',
'wlheader-enotif' => 'ای-میل نوٹیÙیکیشن قابل',
-'wlheader-showupdated' => '* صÙÛ’ جیÛÚ‘Û’ بدلے Ú©Û“ تھواڈے آخری وار آن مکرون اونان نوں موٹا کرکے دسیا گیا اے۔',
+'wlheader-showupdated' => ' صÙÛ’ جیÛÚ‘Û’ بدلے Ú©Û“ تھواڈے آخری وار آن مکرون اونان نوں موٹا کرکے دسیا گیا اے۔',
'watchmethod-recent' => 'نیڑے Ûویاں تبدیلیاں چائیدے صÙیاں دیاں ویکھے جان والے صÙیاں لئی۔',
'watchmethod-list' => 'ویکھے Ú©Û’ صÙÛ’ نیڑے Ûون والیاں تبدیلیاں دی پڑتال',
'watchlistcontains' => 'تھواڈی اکھ تھلے رکھی لسٹ Ú† $1 {{PLURAL:$1|صÙÛ|صÙÛ’}} نیں۔',
@@ -2370,12 +2330,9 @@ $1',
اینوں $2 دی رینج چ روکیا گیا، جینوں کھولیا جاسکدا اے۔',
'ip_range_invalid' => 'ناں منی جان والی آئی پی رینج۔',
'ip_range_toolarge' => 'رینج روکاں /$1 توں وڈیاں دی اجازت نئیں۔',
-'blockme' => 'مینوں روکو',
'proxyblocker' => 'دوروں روکن والا',
-'proxyblocker-disabled' => 'اس کم نوں روک دتا گیا اے۔',
'proxyblockreason' => 'تواڈا آئی Ù¾ÛŒ Ù¾ØªÛ ØªÛ’ روک لگادتی گئی جے کیوں جے اے اک کھلا پراکسی اے۔
Ù…Ûربانی کرکے اپنے انٹرنٹ سروس دین والے نال یا تکنیکی مدد دین والے نال تے اوناں ایس بچاؤ خطرے بارے دسو۔',
-'proxyblocksuccess' => 'Ûوگیا۔',
'sorbsreason' => 'تیرا آئی Ù¾ÛŒ Ù¾ØªÛ Ø§Ú© Ú©Ú¾Ù„ÛŒ پراکسی وانگوں دتا گیا اے ÚˆÛŒ این ایس بی ایل Ú† {{سائیٹناں}} Ù†Û’Û”',
'sorbs_create_account_reason' => 'تواڈا Ù¾ØªÛ Ø§Ú© کھلا پراکسی لسٹ Ú† اے ÚˆÛŒ این ایس بی ایل نال {{سائیٹناں}} Ú†Û”
تسیں اک Ú©Ú¾Ø§ØªÛ Ù†Ø¦ÛŒÚº کھول سکدے۔',
@@ -2812,7 +2769,7 @@ $1',
* gpslongitude
* gpsaltitude',
-# EXIF tags
+# Exif tags
'exif-imagewidth' => 'چوڑائی',
'exif-imagelength' => 'اچائی',
'exif-bitspersample' => 'اک کمپوننٹ وچ بٹ',
@@ -2990,7 +2947,7 @@ $1',
'exif-originalimageheight' => 'مورت دی اچائی کٹن توں Ù¾ÛÙ„Û’',
'exif-originalimagewidth' => 'مورت دی چوڑائی کٹن توں Ù¾ÛÙ„Û’',
-# EXIF attributes
+# Exif attributes
'exif-compression-1' => 'کھولی گئی',
'exif-compression-2' => 'سی سی آئی Ù¹ÛŒ Ù¹ÛŒ گروپ 3 1-ڈائمینشنل موڈیÙائیڈ ÛÙمین رن ÙÙ„ لنتھ انکوڈنگ',
'exif-compression-3' => 'سی سی آئی Ù¹ÛŒ Ù¹ÛŒ گروپ 3 Ùیکس اینکوڈنگ',
@@ -3380,7 +3337,6 @@ $5
'version-other' => 'دوجے',
'version-mediahandlers' => 'میڈیا Ûینڈلرز',
'version-hooks' => 'Ûکز',
-'version-extension-functions' => 'ایکسٹنشن Ùنکشن',
'version-parser-extensiontags' => 'پاسر ایکسٹنشن ٹیگز',
'version-parser-function-hooks' => 'پاسر Ùنکشن Ûکز',
'version-hook-name' => 'ÛÚ© ناں',
@@ -3399,13 +3355,6 @@ the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
'version-software-product' => 'پراڈکٹ',
'version-software-version' => 'ورژن',
-# Special:FilePath
-'filepath' => 'Ùائل راÛ',
-'filepath-page' => 'Ùائل:',
-'filepath-submit' => 'چلو',
-'filepath-summary' => 'اے خاص صÙÛاک Ùائل دا پورا Ø±Ø§Û Ø¯Ø³Ø¯Ø§ اے۔
-مورتاں پورے ریزولوشن Ú† دسیاں گیاں نئیں، دوجیاں Ùائل ٹائپ نوں نوں اوناں دے رلدے پروکراماں نال ٹوریا گیا اے۔',
-
# Special:FileDuplicateSearch
'fileduplicatesearch' => 'دوÛری Ùائلاں دی کھوج کرو',
'fileduplicatesearch-summary' => 'دوÛریاں Ùائلاں دی کھوج Ûیش ویلیو تے اے۔',
diff --git a/languages/messages/MessagesPnt.php b/languages/messages/MessagesPnt.php
index 84691d93..ad44e5a5 100644
--- a/languages/messages/MessagesPnt.php
+++ b/languages/messages/MessagesPnt.php
@@ -233,7 +233,7 @@ $messages = array(
'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).
+# 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).
'aboutsite' => 'ΠεÏί {{SITENAME}}',
'aboutpage' => 'Project:Σχετικά',
'copyright' => 'Το πεÏιεχόμενον εν άμον ντο λεει η $1.',
@@ -243,7 +243,6 @@ $messages = array(
'disclaimers' => 'ΙμπÏέσουμ',
'disclaimerpage' => 'Project:ΙμπÏέσουμ',
'edithelp' => "Βοήθεια για τ' αλλαγμαν",
-'edithelppage' => 'Help:Άλλαγμαν',
'helppage' => 'Help:ΠεÏιεχόμενα',
'mainpage' => 'ΑÏχικόν σελίδα',
'mainpage-description' => 'ΑÏχικόν σελίδα',
@@ -413,7 +412,7 @@ $messages = array(
'newpassword' => 'ΚαινοÏÏεον σημάδιν:',
'retypenew' => 'ΓÏάψον ξαν το νέον σημάδιν:',
'resetpass_submit' => 'ΟÏίστεν το σημάδιν κι ελάτεν απές',
-'resetpass_success' => 'Το σημάδιν ελλάεν!
+'changepassword-success' => 'Το σημάδιν ελλάεν!
ΑτώÏα συνδέουμε σας...',
'resetpass_forbidden' => "Τα σημάδια για να εμπάτεν 'κ εποÏοÏν ν'αλλάζνε",
'resetpass-no-info' => "ΕπÏέπ να ελάτεν απές για ν'ελέπετε αοÏτον τη σελίδαν κιάλλο τογÏία.",
@@ -593,7 +592,6 @@ $messages = array(
'prevn' => '{{PLURAL:$1|$1}} Ï€Ïοηγουμένων',
'nextn' => '{{PLURAL:$1|$1}} επομένων',
'viewprevnext' => 'ΤέÏεν ($1 {{int:pipe-separator}} $2) ($3)',
-'searchhelp-url' => 'Help:ΠεÏιεχόμενα',
'searchprofile-images' => 'Πολυμέσα',
'searchprofile-everything' => 'Όλεα',
'search-result-size' => '$1 ({{PLURAL:$2|1 λέξη|$2 λέξεις}})',
@@ -614,9 +612,6 @@ $messages = array(
'powersearch-togglenone' => 'Τιδέν',
'search-external' => 'ΕÏÏον σα εξ μεÏέαν',
-# Quickbar
-'qbsettings-none' => 'Τιδέν',
-
# Preferences page
'preferences' => 'Αγαπεμένα',
'mypreferences' => "Τ' εμά τ' αγαπεμένα",
@@ -750,7 +745,6 @@ $messages = array(
'recentchangeslinked-feed' => 'Σχετικά αλλαγάς',
'recentchangeslinked-toolbox' => 'Σχετικά αλλαγάς',
'recentchangeslinked-title' => 'Αλλαγάς τη "$1"',
-'recentchangeslinked-noresult' => "Σ' αβοÏτα τα σελίδας 'κ εγένταν αλλαγάς.",
'recentchangeslinked-summary' => "ΑβοÏτος εν κατάλογον με Ï„' υστεÏνά Ï„' αλλαγάς σελιδίων με σÏνδεσμον ασ' έναν συγκεκÏιμένον σελίδαν (για σε σελίδας συγκεκÏιμένου κατηγοÏίας).
Τα σελίδας σον [[Special:Watchlist|κατάλογον ωÏιαγματί]] είν' '''σκηÏά'''.",
'recentchangeslinked-page' => 'Όνεμαν σελίδας:',
@@ -852,8 +846,6 @@ $messages = array(
'statistics' => 'Στατιστικήν',
'statistics-pages' => 'Σελίδας',
-'disambiguations' => 'Σελίδας εξηγησίων',
-
'doubleredirects' => 'ΠεÏισσά διπλά συνδέσμ',
'brokenredirects' => 'Τσακωμένα διπλά συνδέσμ',
@@ -1110,8 +1102,6 @@ $messages = array(
'blocklogentry' => 'εσπάλισεν [[$1]] για $2 $3',
'unblocklogentry' => 'άνοιγμαν ασπαλιγματί τη $1',
'block-log-flags-nocreate' => "ποίσιμον λογαÏίας 'κ ίνεται",
-'blockme' => 'Ασπάλισον με',
-'proxyblocksuccess' => 'Εγέντον.',
# Developer tools
'lockdb' => 'Ασπάλιγμαν βάσης δογμενίων',
@@ -1306,7 +1296,7 @@ $messages = array(
* gpslongitude
* gpsaltitude",
-# EXIF tags
+# Exif tags
'exif-imagewidth' => 'Πλάτος',
'exif-imagelength' => 'Ύψηλος',
'exif-bitspersample' => 'Bits ανά στοιχείο',
@@ -1408,10 +1398,6 @@ $messages = array(
'version-software' => "Λογισμικόν ντ'εθέκεν",
'version-software-version' => 'Έκδοση',
-# Special:FilePath
-'filepath-page' => 'ΑÏχείον:',
-'filepath-submit' => 'Δέβα',
-
# Special:FileDuplicateSearch
'fileduplicatesearch-filename' => 'Όνεμα αÏχείου:',
'fileduplicatesearch-submit' => 'ΕÏÏον',
diff --git a/languages/messages/MessagesPrg.php b/languages/messages/MessagesPrg.php
index 20ec925d..ebbde804 100644
--- a/languages/messages/MessagesPrg.php
+++ b/languages/messages/MessagesPrg.php
@@ -43,9 +43,6 @@ $messages = array(
'tog-shownumberswatching' => 'Waidinnais gīrbin stēisan nadirīntin tērpautajan',
'tog-oldsig' => 'TwÄjs tÄ“ntiskas papeisÄsenis',
'tog-fancysig' => 'Laikais papeisÄsenin per wikitekstan (Å¡lÄit autÅmatiskan sÄ“isnan)',
-'tog-externaleditor' => 'Auprestaminai tÄ“rpaus izwinaÄ«nan editÅran (tÄ“r per ekspertans, izkÄ«nina speciÄlins ensadÄ«nsenins en kÅmputeÅ—u)',
-'tog-externaldiff' => 'Auprestaminai tÄ“rpaus izwinaÄ«nan prÅgraman waidinÄntin Å¡laitÄ«ntans (tÄ“r per ekspertans, izkÄ«nina speciÄlins ensadÄ«nsenins en kÅmputeÅ—u)',
-'tog-showjumplinks' => 'EnklaÅ«jais autengÄ«nsenins "sÄkais en"',
'tog-uselivepreview' => 'TÄ“rpaus dinÄmiskan pirmÄdiran (JavaScript) (eksperimentÄlin)',
'tog-forceeditsummary' => 'PawakÄ“is mi nierpilninsenin stesse ebpeisÄsenin stÄ“isan kitawÄ«dinsnan',
'tog-watchlisthideown' => 'Kliptinais majjans redigīsenins en listei stēisan nadirītan',
@@ -225,7 +222,7 @@ PÄusai en kategÅrijai "$1"',
'jumptonavigation' => 'nawigaciÅni',
'jumptosearch' => 'laukīsna',
-# 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).
+# 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).
'aboutsite' => 'Ezze {{SITENAME}}',
'aboutpage' => 'Project:Ezze',
'copyright' => 'Ēnturs preiēiminan pa $1 licēncin.',
@@ -235,7 +232,6 @@ PÄusai en kategÅrijai "$1"',
'disclaimers' => 'EtrÄwingiskwas arÄikinsenei',
'disclaimerpage' => 'Project:EtrÄwingiskwas arÄikinsenei',
'edithelp' => 'Redigīsnas pagalba',
-'edithelppage' => 'Help:Redigīsna',
'helppage' => 'Help:Ä’nturs',
'mainpage' => 'Galwas pÄusan',
'mainpage-description' => 'Galwas pÄusan',
@@ -304,18 +300,6 @@ Listi stÄ“isan preiÄ“iminan speciÄlin pÄusan aupalla si [[Special:SpecialPages
# General errors
'error' => 'BlÄnda',
'databaseerror' => 'DÄtanbazis blÄnda',
-'dberrortext' => 'SÄ«ntaksis blÄnda tikka en prasÄ«seņu stessei dÄtanbazin.
-Sta mazzi bÅ«twei blÄnda en prÅgramijai.
-Panzdaums, niizpalts prasīsenis ast:
-<blockquote><tt>$1</tt></blockquote>
-tengÄ«ntan pra funkciÅnin „<tt>$2</tt>â€.
-DÄtanbazi etwÄrtai wartinna blÄndan "<tt>$3: $4</tt>".',
-'dberrortextcl' => 'SÄ«ntaksis blÄnda tikka en prasÄ«seņu stessei dÄtanbazin.
-Panzdaums, niizpalts prasīsenis ast:
-"$1"
-<blockquote><tt>$1</tt></blockquote>
-izwakÄ«tan iz funkciÅnin „$2â€.
-DÄtanbazi etwÄrtai wartinna blÄndan "$3: $4".',
'laggedslavemode' => 'NÅda: Å in pÄusan mazzi ni turritun Ä“n sen ukanÄunaisins ernaunÄ«nsenins.',
'readonly' => 'DÄtanbazi ast auklaÅ«tan',
'enterlockreason' => 'DÄis brewÄ«nslin stesse dÄtanbazis auklaÅ«senin be enkaÄ«nintan etklaÅ«senes kÄ“rdan',
@@ -359,7 +343,6 @@ Prasīsenis: $2',
'editinginterface' => "'''Ä’mpirsergÄ«senis:''' Tu redigijja pÄusan, kawÄ«dan turri en sen prÅgraminin interfÄcas tekstan.
KitawÄ«dinsnas en Å¡ismu pÄusan wÄ«rst kitawÄ«dinuÅ¡as interfÄcas pawÄ«dan per kittans tÄ“rpautajans.
Per tulkausnans, madli endirÄ“is tÄ“rpautun [//translatewiki.net/wiki/Main_Page?setlang=prg translatewiki.net], - MediaWiki tulkausnan prÅjaktan.",
-'sqlhidden' => '(SQL prasīsenis kliptintan)',
'cascadeprotected' => 'Å in pÄusan ast pakÅ«nstan ezze redigÄ«snan, beggi ast ebÄ«mtan en {{PLURAL:$1|ripÄ«ntsmu pÄusan, kawÄ«dan|ripÄ«ntimans pÄusans, kawÄ«dai}} turri mazÄ«ngiskwan "pakÅ«nsnas weldÄ«snan" enklaÅ«tan:
$2',
'namespaceprotected' => "TÅ« ni assei preiwÄ“rptan, kÄi redigÄ«lai pÄusans en '''$1''' tÄ«telin plattibei.",
@@ -469,7 +452,7 @@ GÄ“ideis biskin, pirzdau tu wÄ«rst bandÄwuns etkÅ«mps.',
'newpassword' => 'NÄuns kliptaswÄ«rds',
'retypenew' => 'Ä€ntrinais nÄunan kliptaswÄ«rdan',
'resetpass_submit' => 'Ensadinnais kliptaswīrdan be enjaīs',
-'resetpass_success' => 'TwÄjs kliptaswÄ«rds pastÄi izpalewÄ«ngi kitawÄ«dintan! EneisnÄ wÄ“raui...',
+'changepassword-success' => 'TwÄjs kliptaswÄ«rds pastÄi izpalewÄ«ngi kitawÄ«dintan! EneisnÄ wÄ“raui...',
'resetpass_forbidden' => 'Kliptaswīrdai ni mazzi būtwei kitawīdintan',
'resetpass-no-info' => 'TÅ« turri bÅ«twei engÅ«bun, kÄi turÄ«lai entikriskan preiÄ“isenin prei Å¡in pÄusan.',
'resetpass-submit-loggedin' => 'Kitawīdinais kliptaswīrdan',
@@ -801,7 +784,6 @@ NawigaciÅnis autengÄ«senin terpausnÄ naikinna etrÄ«nksenin en kÅlunei.',
'searchmenu-legend' => 'Laukīsnas mazīngiskwas',
'searchmenu-exists' => "'''Ast pÄusan \"[[:\$1]]\" en Å¡issei wikkin''",
'searchmenu-new' => "'''TeÄ«keis pÄusan \"[[:\$1|\$1]]\" en Å¡issei wikki!'''",
-'searchhelp-url' => 'Help:Ä’nturs',
'searchmenu-prefix' => '[[Special:PrefixIndex/$1|PradirÄ“is pÄusans sen Å¡in prefiksan]]',
'searchprofile-project' => 'Pagalbas be prÅjaktas pÄusai',
'searchprofile-everything' => 'Wiss',
@@ -841,14 +823,6 @@ Bandais pagaÅ«tun laukÄ«tan frÄzin sen prefiksan \"all:\", kÄi pralaukÄ«lai pa
En šissei kērdan tu mazzi laukītun sen Google.
PamÄ“nais, kÄi tenÄ“isan indicai mazzi ni bÅ«twei aktuÄlin.',
-# Quickbar
-'qbsettings' => 'Dīwas preiēisenes sawinzli',
-'qbsettings-none' => 'NisatausnÄ',
-'qbsettings-fixedleft' => 'PreidrÅ«ktintan prei kÄirai',
-'qbsettings-fixedright' => 'Preidrūktintan prei tikrai',
-'qbsettings-floatingleft' => 'PlÅ«jants prei kÄirai',
-'qbsettings-floatingright' => 'Plūjants prei tikrai',
-
# Preferences page
'preferences' => 'Pirminiskwas',
'mypreferences' => 'Majjas pirminiskwas',
@@ -873,7 +847,6 @@ PamÄ“nais, kÄi tenÄ“isan indicai mazzi ni bÅ«twei aktuÄlin.',
'saveprefs' => 'EnpeisÄis',
'resetprefs' => 'Ausadinnais nienpeisÄtans kitawÄ«dinsnans',
'restoreprefs' => 'EtwÄrtai wartinnais wissans auprestaminans pirminiskwans',
-'prefs-edit-boxsize' => 'Redigīsnas langstas debban.',
'rows' => 'RÄ«ndas:',
'columns' => 'KÅlunis:',
'searchresultshead' => 'Laukīs',
@@ -908,7 +881,6 @@ PamÄ“nais, kÄi tenÄ“isan indicai mazzi ni bÅ«twei aktuÄlin.',
'prefs-custom-css' => 'swÄjs CSS',
'prefs-custom-js' => 'swÄjs JavaScript',
'prefs-emailconfirm-label' => 'E-mailas padruktinsna:',
-'prefs-textboxsize' => 'Redigīsnas langstas debban',
'youremail' => 'TwajÄ e-mail adressi:',
'username' => 'TÄ“rpautajas pabilisnÄ:',
'uid' => 'TÄ“rpautajas ID:',
@@ -1120,7 +1092,6 @@ TÅ« mazzi dÄ«gi etrÄ«nktun dÄtun kitÄ“imans drÄugautwei sen tin pra tÄ“rpautaj
# Recent changes linked
'recentchangeslinked' => 'Kitawīdinsnas en preiristamans',
'recentchangeslinked-title' => 'KitawÄ«dinsnas en pÄusamans, prei kawÄ«dans "$1" autenginna',
-'recentchangeslinked-noresult' => 'Ni bÄ“i niaÄ«nas kitawÄ«dinsnas en preiristamans anga autenginantimmans pÄusans en etrÄ«nktan kÄ“rdasetrapan.',
'recentchangeslinked-summary' => 'Zemmais ast listi stÄ“isan panzdauman kitawÄ«dinsnan en pÄusamans prei kawÄ«dans autenginna dÄtan pÄusan (anga en wisÄ“imans pÄusans perlÄnkintimans prei dÄtan kategÅrijan).
PÄusai iz [[Special:Watchlist|nadirÄ«tan listin]] ast pastarÄ«ntan.',
'recentchangeslinked-page' => 'PÄusas tÄ«tels',
@@ -1371,12 +1342,6 @@ TÄ“rpausna: Ä“nturas_tÄ«ps/pÅtips, perw. <code>image/jpeg</code>.',
'statistics-users-active-desc' => 'Tērpautajai sēntei aktīwai en {{PLURAL:$1|panzdauman dēinan|panzdaumans dēinans}}',
'statistics-mostpopular' => 'Ukadeznimai kÄimalukitai pÄusai',
-'disambiguations' => 'Ainapreslinsnas pÄusai',
-'disambiguationspage' => 'Template:Ainapreslinsna',
-'disambiguations-text' => "ZemmaiÅ¡ai pÄusai autenginna prei '''ainapreslinsnas pÄusan'''.
-TenÄ“imans prawerru autengÄ«ntun entikriskai prei pÄusas Ä“nturan. </br>
-PÄusan ast laikÄtan per ainapreslinsnan pÄusan ik tennan tÄ“rpaui Å¡ablÅnin prei kawÄ«dan autenginna [[MediaWiki:Disambiguationspage]]",
-
'doubleredirects' => 'Dwigubbai 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.
@@ -1585,10 +1550,9 @@ EraÄ«na Å¡isse pÄusas Ä“nturas kitawÄ«dinsna anga diskusiÅnis pÄusas sÄ“itan
'unwatchthispage' => 'Wanginnais nadirītun',
'notanarticle' => 'Sta ni ast artīkels',
'notvisiblerev' => 'WersiÅni pastÄi Äupausintan',
-'watchnochange' => 'NiaÄ«nan iz nadirÄ«tans pÄusans ni bÄ“i redigÄ«tan en padÄtan kÄ“rdasetrapan.',
'watchlist-details' => 'Ast {{PLURAL:$1|$1 pÄusan|$1 pÄusai}} en twajjai listin stÄ“isan nadirÄ«tan, ni gÄ«rbawintei diskusiÅnis pÄusans.',
-'wlheader-enotif' => '* E-mail pawakīsenei ast enklaūtan.',
-'wlheader-showupdated' => "* PastÄi '''pastarÄ«ntan''' pÄusai, kawÄ«dai bÄ“i kitawÄ«dintan ezze Twajjai panzdauman tenÄ“isan kÄimalukisnan..",
+'wlheader-enotif' => 'E-mail pawakīsenei ast enklaūtan.',
+'wlheader-showupdated' => "PastÄi '''pastarÄ«ntan''' pÄusai, kawÄ«dai bÄ“i kitawÄ«dintan ezze Twajjai panzdauman tenÄ“isan kÄimalukisnan..",
'watchmethod-recent' => 'IzbandasnÄ stÄ“isan panzdauman kitawÄ«disnan sirzdau nadirÄ«tans pÄusans',
'watchmethod-list' => 'IzbandasnÄ stÄ“isan nadirÄ«tan pÄusan laukÄ«ntei panzdaumans kitawÄ«disnans',
'watchlistcontains' => 'En twajjai listin stÄ“isan nadirÄ«tan ast $1 {{PLURAL:$1|pÄusan|pÄusai}}.',
@@ -1891,10 +1855,7 @@ JaÄ«s en [[Special:BlockList|IP blÅkisenin listin]] ki widÄlai wissans tÄ“nti
Sta ast, Å¡lÄit, blÅkitan kÄigi delÄ«ks stesse $2 ebÄ«mtan, kawÄ«dan mazzi bÅ«twei etblÅkitan.',
'ip_range_invalid' => 'NitikrÅmiskas IP ebÄ«mtan.',
'ip_range_toolarge' => 'EbÄ«mtas blÅkisenei mÅ«iseisan nikÄi /$1 ni ast preiÄ“minan.',
-'blockme' => 'BlÅkis min',
'proxyblocker' => 'Proxy blÅkisna',
-'proxyblocker-disabled' => 'Å Ä« funkciÅni ast izklaÅ«tan.',
-'proxyblocksuccess' => 'Segītan.',
'sorbsreason' => 'TwajÄ IP adressi ast en listei stÄ“isan open proxy sÄ“rwerin en DBSBL, tÄ“rpautan pra {{SITENAME}}.',
'sorbs_create_account_reason' => 'TwajÄ IP adressi ast en listei stÄ“isan open proxy sÄ“rwerin en DBSBL, tÄ“rpautan pra {{SITENAME}}.
Tū ni mazzi teīktun rekkenan',
@@ -2254,7 +2215,7 @@ KitÄi wÄ«rst bÅ«wusis kliptan auprestaminai.
* gpslongitude
* gpsaltitude',
-# EXIF tags
+# Exif tags
'exif-imagewidth' => 'Plattu',
'exif-imagelength' => 'AÅ«ktan',
'exif-bitspersample' => 'Bittai per izimlin',
@@ -2355,7 +2316,7 @@ KitÄi wÄ«rst bÅ«wusis kliptan auprestaminai.
'exif-gpsareainformation' => 'GPS areÄlas pabilisnÄ',
'exif-gpsdatestamp' => 'GPS dÄtan',
-# EXIF attributes
+# Exif attributes
'exif-compression-1' => 'NikÅmpresitan',
'exif-unknowndate' => 'NiwaÄ«stan dÄtan',
@@ -2614,7 +2575,6 @@ Tu mazzi dÄ«gi [[Special:EditWatchlist|tÄ“rpautun stÄndardiskan editÅran]].',
'version-variables' => 'WariÄblis',
'version-other' => 'KitÄi',
'version-hooks' => 'Ä€nsai',
-'version-extension-functions' => 'Plattinsenes funkciÅnis',
'version-parser-extensiontags' => 'Parseras plattinsenes zentlitajai',
'version-parser-function-hooks' => 'Parseras funkciÅnis Änsai',
'version-hook-name' => 'Ä€nsas pabilisnÄ',
@@ -2623,15 +2583,6 @@ Tu mazzi dÄ«gi [[Special:EditWatchlist|tÄ“rpautun stÄndardiskan editÅran]].',
'version-software' => 'InstalÄ«tas prÅgraminis',
'version-software-version' => 'WersiÅni',
-# Special:FilePath
-'filepath' => 'Lunki en zūrbrukin',
-'filepath-page' => 'ZÅ«rbrukis:',
-'filepath-submit' => 'Lunki',
-'filepath-summary' => 'Å in speciÄlin pÄusan wartinna pastippan lunkin prei zÅ«rbrukin.
-Bildei ast waÄ«dintan en pilnan rezÅluciÅnin, kitÄi zÅ«rbrukin tÄ«pai ast etwertan en prÅgramu preiristasmu prei tennans.
-
-EnpeisÄis zÅ«rbrukes pabilÄ«snan Å¡lÄit "{{ns:file}}:" prefiksan.',
-
# Special:FileDuplicateSearch
'fileduplicatesearch' => 'Laukīs dwigubbintans zūrbrukins',
'fileduplicatesearch-summary' => 'LaukÄ«s dwigubbintans zÅ«rbrukins pa tenÄ“isan kÅntrÅlingin summin.',
diff --git a/languages/messages/MessagesPs.php b/languages/messages/MessagesPs.php
index f3dea787..60bef838 100644
--- a/languages/messages/MessagesPs.php
+++ b/languages/messages/MessagesPs.php
@@ -188,7 +188,6 @@ $messages = array(
'tog-shownumberswatching' => 'د کتونکو کارنانو شمÛر ښکاره کول',
'tog-oldsig' => 'اوسنی لاسليک:',
'tog-fancysig' => 'لاسليک د ويکي متن په توگه په پام Ú©Û Ù†ÙŠÙˆÙ„ (د خپلکاره تړن د تړلو پرته)',
-'tog-showjumplinks' => 'د "ورټوپ Ú©Ú“Ù‡" د آسانتياوو ØªÚ“Ù†Û Ú†Ø§Ø±Ù†ÙˆÙ„',
'tog-uselivepreview' => 'Ú˜ÙˆÙ†Ø¯Û Ù…Ø®Ù„ÙŠØ¯Ù†Ù‡ کارول (آزمÛښتي)',
'tog-forceeditsummary' => 'د يوه تش سمون لنډيز په ورکولو سره Ø¯Û Ø®Ø¨Ø± راکړل شي',
'tog-watchlisthideown' => 'په کتنلړ Ú©Û Ø²Ù…Ø§ Ø³Ù…ÙˆÙ†Û Ù¾Ù¼ÙˆÙ„',
@@ -201,6 +200,8 @@ $messages = array(
'tog-diffonly' => 'د توپيرونو نه Ù„Ø§Ù†Ø¯Û Ø¯ مخ Ù…ÛÙ†Úپانگه پټول',
'tog-showhiddencats' => 'Ù¾Ù¼Û ÙˆÛØ´Ù†ÙŠØ²Û ÚšÚ©Ø§Ø±Ù‡ کول',
'tog-norollbackdiff' => 'پرشاتمبولو وروسته توپيرونه نه ښودل',
+'tog-useeditwarning' => 'کله Ú†Û ÙŠÙˆ سمون مخ څخه د بدلونونو د خوندي کولو پرته ÙˆÚÙ… خبر Ø¯Û Ø´Ù…',
+'tog-prefershttps' => 'د ننوتلو پر مهال تل يوه خوندي اړيکتيا کارول',
'underline-always' => 'تل',
'underline-never' => 'Ù‡Ûڅکله',
@@ -264,6 +265,18 @@ $messages = array(
'oct' => 'اکتوبر',
'nov' => 'نومبر',
'dec' => 'ډيسمبر',
+'january-date' => 'جنوري $1',
+'february-date' => 'ÙÛبروري $1',
+'march-date' => 'مارچ $1',
+'april-date' => 'اپريل $1',
+'may-date' => 'Ù…Û $1',
+'june-date' => 'جون $1',
+'july-date' => 'جولای $1',
+'august-date' => 'اگست $1',
+'september-date' => 'سÛپتمبر $1',
+'october-date' => 'اکتوبر $1',
+'november-date' => 'نومبر $1',
+'december-date' => 'دÛسمبر $1',
# Categories related messages
'pagecategories' => '{{PLURAL:$1|ÙˆÛشنيزه|ÙˆÛشنيزÛ}}',
@@ -345,6 +358,7 @@ $messages = array(
'create-this-page' => 'همدا مخ ليکل',
'delete' => 'ړنگول',
'deletethispage' => 'دا مخ ړنگول',
+'undeletethispage' => 'دا مخ ناړنگول',
'undelete_short' => '{{PLURAL:$1|يو سمون|$1 سمونÛ}} ناړنگول',
'viewdeleted_short' => '{{PLURAL:$1|يو ړنگ شوی سمون|$1 ړنگ شوي سمونونه}} کتل',
'protect' => 'ژغورل',
@@ -387,7 +401,7 @@ $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).
+# 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).
'aboutsite' => 'د {{SITENAME}} په اړه',
'aboutpage' => 'Project:په اړه',
'copyright' => 'دا Ù…ÛÙ†Úپانگه د $1 له Ù…Ø®Û Ø³ØªØ§Ø³Û Ù„Ø§Ø³Ø±Ø³ÙŠ ته پرته ده، خو هغه Ú…Ù‡ Ú†Û Ù¾Ù‡ Ø®Ù„Ø§Ù ÙŠÛ ÙˆÙŠÙŠÙ„ شوي.',
@@ -397,7 +411,6 @@ $1',
'disclaimers' => 'ردادعاليکونه',
'disclaimerpage' => 'Project:ټولگړی ردادعاليک',
'edithelp' => 'د لارښود سمون',
-'edithelppage' => 'Help:سمونه',
'helppage' => 'Help:نيوليک',
'mainpage' => 'لومړی مخ',
'mainpage-description' => 'لومړی مخ',
@@ -518,10 +531,13 @@ $1',
'editinginterface' => "'''گواښنه:''' تاسو په يوه Ø¯Ø§Ø³Û Ù…Ø® Ú©Û Ø¨Ø¯Ù„ÙˆÙ† راولی کوم Ú†Û Ø¯ ÙŠÙˆÛ Ù¾ÙˆØ³ØªÚ©Ø§Ù„ÛŒ د ليدنمخ متن په توگه کارÛÚ–ÙŠ.
په Ù‡Ù…Ø¯Û Ù…Ø® Ú©Û Ø¨Ø¯Ù„ÙˆÙ† راوستل به د نورو کارنانو د ليدنمخ بڼه اغÛزمنه Ú©Ú“ÙŠ.
د Ú˜Ø¨Ø§Ú“Û Ø¯ ورگډولو او بدلون لپاره، مهرباني ÙˆÚ©Ú“ÛŒ د [//translatewiki.net/wiki/Main_Page?setlang=en translatewiki.net]ØŒ ÙˆÛبÚÙŠ ته ولاړ Ø´ÛŒ. دا ÙˆÛبÚÛŒ د ميډياويکي د Úايتابه پروژه ده.",
-'sqlhidden' => '(د SQL پوښتن پټ دی)',
'namespaceprotected' => "ØªØ§Ø³Û Ø¯ '''$1''' په نوم-تشيال Ú©Û Ø¯ مخونو د سمولو اجازه نه لرÛ.",
'customcssprotected' => 'ØªØ§Ø³Û Ø¯ Ø¯Û CSS مخ د سمولو اجازه نه لرÛØŒ دا ÚÚ©Ù‡ Ú†Û Ø¯Ø§ مخ د بل کارن شخصي Ø§Ù…Ø³ØªÙ†Û Ù„Ø±ÙŠ.',
'customjsprotected' => 'ØªØ§Ø³Û Ø¯ Ø¯Û Ø¬Ø§ÙˆØ§Ø³Ú©Ø±Ûپټ مخ د سمولو اجازه نه لرÛØŒ دا ÚÚ©Ù‡ Ú†Û Ø¯Ø§ مخ د بل کارن شخصي Ø§Ù…Ø³ØªÙ†Û Ù„Ø±ÙŠ.',
+'mycustomcssprotected' => 'ØªØ§Ø³Û Ø¯ Ø¯Û CSS مخ د سمولو اجازه نلرÛ.',
+'mycustomjsprotected' => 'ØªØ§Ø³Û Ø¯ Ø¯Û Ø¬Ø§ÙˆØ§ سكريپټ مخ د سمولو اجازه نلرÛ.',
+'myprivateinfoprotected' => 'ØªØ§Ø³Û Ø¯ Ø¯Û Ø´Ø®ØµÙŠ مالوماتو د سمولو اجازه نلرÛ.',
+'mypreferencesprotected' => 'ØªØ§Ø³Û Ø¯ خپلو غوره توبونو د سمولو اجازه نلرÛ.',
'ns-specialprotected' => 'Úانگړي مخونو Ú©Û Ø³Ù…ÙˆÙ† او بدلون نه Ø´ÛŒ راوستلای.',
'titleprotected' => 'د [[User:$1|$1]] لخوا د Ø¯Û Ø³Ø±Ù„ÙŠÚ© د جوړÛدلو مخنيوی شوی.
او د Ø¯Û Ú©Ú“Ù†Û Ø³Ø¨Ø¨ "\'\'$2\'\'" ورکړ شوی.',
@@ -540,10 +556,19 @@ $1',
'welcomecreation-msg' => 'گڼون مو جوړ شو.
د [[Special:Preferences|{{SITENAME}} غوره توبونه]] بدلول مو مه Ù‡ÛروÛ.',
'yourname' => 'کارن-نوم:',
+'userlogin-yourname' => 'کارن-نوم',
+'userlogin-yourname-ph' => 'کارن-نوم مو وليکÛ',
+'createacct-another-username-ph' => 'كارن نوم مو وركړÛ',
'yourpassword' => 'پټنوم:',
+'userlogin-yourpassword' => 'پټنوم',
+'userlogin-yourpassword-ph' => 'پټنوم مو وليکÛ',
+'createacct-yourpassword-ph' => 'پټنوم مو وټاپÛ',
'yourpasswordagain' => 'پټنوم بيا وليکه',
+'createacct-yourpasswordagain' => 'پټنوم مو تاييد Ú©Ú“Û',
+'createacct-yourpasswordagain-ph' => 'پټنوم مو بيا وټاپÛ',
'remembermypassword' => 'زما پټنوم په Ø¯Û Ú©Ù…Ù¾ÙŠÙˆÙ¼Ø± (تر $1 {{PLURAL:$1|ورÚÛ|ورÚÙˆ}}) په ياد وساته!',
-'securelogin-stick-https' => 'وروسته د ننوتلو HTTPS سره تړلی Ù¾Ø§ØªÛ Ú©Ûدل',
+'userlogin-remembermypassword' => 'غونډال Ú©Û Ù…Û Ù†Ù†ÙˆØªÙ„ÛŒ وساته',
+'userlogin-signwithsecure' => 'خوندي اړيکتيا کارول',
'yourdomainname' => 'Ø³ØªØ§Ø³Û Ø´Ù¾ÙˆÙ„:',
'password-change-forbidden' => 'ØªØ§Ø³Û Ù¾Ù‡ Ø¯Û ÙˆÙŠÚ©ÙŠ Ø¨Ø§Ù†Ø¯Û Ø®Ù¾Ù„ پټنوم نه Ø´ÛŒ بدلولی.',
'login' => 'ننوتل',
@@ -554,18 +579,38 @@ $1',
'logout' => 'وتل',
'userlogout' => 'وتل',
'notloggedin' => 'غونډال Ú©Û Ù†Ù‡ ياست ننوتي',
+'userlogin-noaccount' => 'گڼون نه لرÛØŸ',
+'userlogin-joinproject' => 'د {{SITENAME}} سره يوÚای شه',
'nologin' => 'کارن-نوم نه لرÛØŸ $1.',
'nologinlink' => 'يو گڼون جوړول',
'createaccount' => 'گڼون جوړول',
'gotaccount' => 'آيا وار Ø¯Ù…Ø®Û ÙŠÙˆ گڼون لری؟ $1.',
'gotaccountlink' => 'ننوتل',
'userlogin-resetlink' => 'د ننوتلو مالومات مو Ù‡Ûر شوي؟',
+'userlogin-resetpassword-link' => 'پټنوم مو بياپرÚايول',
+'createacct-join' => 'خپل مالومات Ù„Ø§Ù†Ø¯Û ÙˆØ±Ú©Ú“Û',
+'createacct-emailrequired' => 'برÛښليک پته',
+'createacct-emailoptional' => 'برÛښليک پته (اختياري)',
+'createacct-email-ph' => 'برÛښليک پته مو وټاپÛ',
+'createacct-another-email-ph' => 'برÛښليک پته مو ورکړÛ',
'createaccountmail' => 'يو لنډمهاله ناټاکلی پټنوم کارول او په Ù„Ø§Ù†Ø¯Û ÙˆØ±Ú©Ú“Ù„ Ø´ÙˆÛ Ø¨Ø±Ûښليک پته Ú©Û ÙˆØ±Ù„ÛÚ–Ù„',
+'createacct-realname' => 'آر نوم (اختياري)',
'createaccountreason' => 'سبب:',
+'createacct-reason' => 'سبب',
+'createacct-reason-ph' => 'ÙˆÙ„Û ØªØ§Ø³Û Ø¨Ù„ گڼون جوړول غوااړÛ',
+'createacct-captcha' => 'امنيتي تدبير',
+'createacct-imgcaptcha-ph' => 'پورته ØªØ§Ø³Û ØªÙ‡ ښکاره شوی متن وټاپÛ',
+'createacct-submit' => 'گڼون مو جوړ Ú©Ú“Û',
+'createacct-another-submit' => 'بل گڼون جوړول',
+'createacct-benefit-heading' => '{{SITENAME}} Ø³ØªØ§Ø³Û Ù¾Ù‡ شان خلکو لخوا جوړ شوی.',
+'createacct-benefit-body1' => '{{PLURAL:$1|سمون|سمونونه}}',
+'createacct-benefit-body2' => '{{PLURAL:$1|مخ|مخونه}}',
+'createacct-benefit-body3' => '{{PLURAL:$1|وروستنی ونډه وال|وروستني ونډه وال}}',
'badretype' => 'دا پټنوم Ú†Û ØªØ§Ø³Û Ù„ÙŠÚ©Ù„ÛŒ د مخکني پټنوم سره ورته نه دی.',
'userexists' => 'کوم کارن نوم Ú†Û ØªØ§Ø³Û ÙˆØ±Ú©Ú“ÛŒ هغه بل چا کارولی.
لطÙاً يو بل نوم وټاکÛ.',
'loginerror' => 'د Ù†Ù†ÙˆØªÙ†Û Ø³ØªÙˆÙ†Ø²Ù‡',
+'createacct-error' => 'د گڼون جوړÛØ¯Ù†Û Ø³ØªÙˆÙ†Ø²Ù‡',
'createaccounterror' => 'گڼون مو جوړ نه شو: $1',
'nocookiesnew' => 'Ø³ØªØ§Ø³Û Ú¯Ú¼ÙˆÙ† جوړ شو، خو ØªØ§Ø³Û Ù„Ø§ غونډال ته نه ياست ورننوتلي.
{{SITENAME}} Ú©Û Ø¯ ننوتلو لپاره کوکيز کارÛÚ–ÙŠ.
@@ -638,7 +683,7 @@ $1',
'newpassword' => 'نوی پټنوم:',
'retypenew' => 'نوی پټنوم بيا وليکه:',
'resetpass_submit' => 'پټنوم مو ÙˆÙ¼Ø§Ú©Û Ø§Ùˆ بيا غونډال ته ورننوÚÛ',
-'resetpass_success' => 'Ø³ØªØ§Ø³Û Ù¾Ù¼Ù†ÙˆÙ… په برياليتوب سره بدل شو!
+'changepassword-success' => 'Ø³ØªØ§Ø³Û Ù¾Ù¼Ù†ÙˆÙ… په برياليتوب سره بدل شو!
اوس غونډال Ú©Û Ø¯ ورننوتلو په حال Ú©Û ÙŠÙˆ ...',
'resetpass_forbidden' => 'پټنومونه مو نه شي بدلÛدلای',
'resetpass-no-info' => 'Ø¯Û Ù…Ø® ته د لاسرسي لپاره بايد غونډال Ú©Û ÙˆØ±Ù†Ù†ÙˆÚÛ.',
@@ -649,10 +694,8 @@ $1',
# Special:PasswordReset
'passwordreset' => 'پټنوم بياپرÚايول',
-'passwordreset-text' => 'د برÛښليک د بياپرÚای Ú©ÛØ¯Ù†Û Ù„Ù¾Ø§Ø±Ù‡ دا Ùورمه Ú‰Ú©Ù‡ Ú©Ú“Û.',
'passwordreset-legend' => 'پټنوم بياپرÚايول',
'passwordreset-disabled' => 'په Ø¯Û ÙˆÙŠÚ©ÙŠ پټنوم بياپرÚای کولو کړنه ناچارنه شوÛ.',
-'passwordreset-pretext' => '{{PLURAL:$1||د Ù„Ø§Ù†Ø¯Û Ø§ÙˆÙ…ØªÙˆÚ© يوه برخه مالومات وليکÛ}}',
'passwordreset-username' => 'کارن-نوم:',
'passwordreset-domain' => 'شپول:',
'passwordreset-capture' => 'د Ù¾Ø§ÙŠÙ„Û Ø¨Ø±Ûښليک کتل غواړÛØŸ',
@@ -821,6 +864,7 @@ $1',
Ø¯Ø§Ø³Û ÚšÚ©Ø§Ø±ÙŠ Ú†Û Ø¯Ø§ مخ Ú“Ù†Ú¯ شوی.',
'edit-conflict' => 'د سمولو خنډ',
'edit-no-change' => 'Ø³ØªØ§Ø³Û Ø³Ù…ÙˆÙ† بابÛزه ÙˆÚ«Ú¼Ù„ شو، دا ÚÚ©Ù‡ Ú†Û ØªØ§Ø³Û Ù¾Ù‡ متن Ú©Û Ú©ÙˆÙ… بدلون نه دی راوستلی.',
+'postedit-confirmation' => 'Ø³ØªØ§Ø³Û Ø³Ù…ÙˆÙ† خوندي شو.',
'edit-already-exists' => 'په Ø¯Û Ù†ÙˆÙ… يو نوی مخ جوړ نه شو.
Ù¾Ø¯Û Ù†ÙˆÙ… د پخوا نه يو مخ شته.',
'defaultmessagetext' => 'تلواليزه پيغام متن',
@@ -933,6 +977,7 @@ $1',
'compareselectedversions' => 'Ù¼Ø§Ú©Ù„Û Ø¨Ú¼Û Ø³Ø±Ù‡ پرتلل',
'showhideselectedversions' => 'Ù¼Ø§Ú©Ù„Û Ø¨Ú¼Û ÚšÚ©Ø§Ø±Ù‡ کول/پټول',
'editundo' => 'ناکړ',
+'diff-empty' => '(Ø¨Û ØªÙˆÙ¾ÙŠØ±Ù‡)',
'diff-multi' => ' د ({{PLURAL:$2| يو کارن|$2 کارنانو}} لخوا {{PLURAL:$1|يوه منÚÚ«Ú“Û Ø¨Ú¼Ù‡|$1 منÚÚ«Ú“Û Ø¨Ú¼Û}}د نه ده ښکاره شوÛ)',
# Search results
@@ -954,7 +999,6 @@ $1',
'searchmenu-legend' => 'د پلټلو خوښنÛ',
'searchmenu-exists' => "'''په Ø¯Û ÙˆÙŠÚ©ÙŠ يو مخ د \"[[:\$1]]\" په نامه دی'''",
'searchmenu-new' => "'''په Ø¯Û ÙˆÙŠÚ©ÙŠ د \"[[:\$1]]\" مخ جوړول!'''",
-'searchhelp-url' => 'Help:لړليک',
'searchprofile-articles' => 'Ù…ÛÙ†Úپانگيز مخونه',
'searchprofile-project' => 'د لارښود او Ù¾Ø±ÙˆÚ˜Û Ù…Ø®ÙˆÙ†Ù‡',
'searchprofile-images' => 'گڼرسنÛ',
@@ -994,14 +1038,6 @@ $1',
'powersearch-togglenone' => 'Ù‡ÛÚ…',
'search-external' => 'Ø¨Ø§Ù†Ø¯Ù†Û Ù¾Ù„Ù¼Ù†Ù‡',
-# Quickbar
-'qbsettings' => 'چټک پټه',
-'qbsettings-none' => 'Ù‡ÛÚ…',
-'qbsettings-fixedleft' => 'ثابته کيڼ',
-'qbsettings-fixedright' => 'ثابته ښي',
-'qbsettings-floatingleft' => 'کيڼه لامبا',
-'qbsettings-floatingright' => 'ښي لامبا',
-
# Preferences page
'preferences' => 'غوره توبونه',
'mypreferences' => 'غوره توبونه',
@@ -1032,7 +1068,6 @@ $1',
'resetprefs' => 'بيا سمول',
'restoreprefs' => 'Ù¼ÙˆÙ„Û ØªÙ„ÙˆØ§Ù„ÙŠØ²Û Ø§Ù…Ø³ØªÙ†Û Ù¾Ø±Úای کول',
'prefs-editing' => 'سمÛØ¯Ù†Û Ú©Û Ø¯ÛŒ',
-'prefs-edit-boxsize' => 'د سمون Ú©Ú“Ú©Û Ú©Ú†Ù‡.',
'rows' => 'ليکÛ:',
'columns' => 'ستنÛ:',
'searchresultshead' => 'پلټل',
@@ -1070,7 +1105,6 @@ $1',
'prefs-custom-js' => 'Úاني جاواسکرÛپټ',
'prefs-common-css-js' => 'د ټولو پوښونو لپاره د CSS/جاواسکرÛپټ دوتنه:',
'prefs-emailconfirm-label' => 'د برÛښليک باورتيا:',
-'prefs-textboxsize' => 'د سمون Ú©Ú“Ú©Û Ú©Ú†Ù‡',
'youremail' => 'برÛښليک *',
'username' => '{{GENDER:$1|کارن نوم}}:',
'uid' => '{{GENDER:$1|کارن}} Ù¾Ûژندنه:',
@@ -1097,6 +1131,8 @@ $1',
'prefs-dateformat' => 'د Ù†ÛÙ¼Û Ø¨Ú¼Ù‡',
'prefs-timeoffset' => 'د وخت واټن',
'prefs-advancedediting' => 'ټولگړی',
+'prefs-editor' => 'سمونگر',
+'prefs-preview' => 'مخليدنه',
'prefs-advancedrc' => 'Ù¾Ø±Ù…Ø®ØªÙ„Ù„Û Ø®ÙˆÚšÙ†Û',
'prefs-advancedrendering' => 'Ù¾Ø±Ù…Ø®ØªÙ„Ù„Û Ø®ÙˆÚšÙ†Û',
'prefs-advancedsearchoptions' => 'Ù¾Ø±Ù…Ø®ØªÙ„Ù„Û Ø®ÙˆÚšÙ†Û',
@@ -1257,7 +1293,6 @@ $1',
'recentchangeslinked-feed' => 'اړونده بدلونونه',
'recentchangeslinked-toolbox' => 'اړونده بدلونونه',
'recentchangeslinked-title' => '"$1" ته اړونده بدلونونه',
-'recentchangeslinked-noresult' => 'په Ø¯Û Ù…ÙˆØ¯Ù‡ØŒ په تړل شويو مخونو Ú©Û Ù‡ÛÚ… کوم بدلونونه نه دي راپÛÚš شوي.',
'recentchangeslinked-summary' => "دا د هغه بدلونونو لړليک دی Ú†Û ÙˆØ±ÙˆØ³ØªÛ ÚÙ„ په تړن لرونکيو مخونو Ú©Û Ø¯ يوه Úانگړي مخ (او يا هم د ÙŠÙˆÛ ÚØ§Ù†Ú¯Ú“Û ÙˆÛØ´Ù†ÙŠØ²Û ØºÚ“Ùˆ) نه رامÛÙ†Ú ØªÙ‡ شوي.
[[Special:Watchlist|Ø³ØªØ§Ø³Û Ø¯ کتنلړ]] مخونه په '''زغرد ليک''' Ú©Û ÚšÚ©Ø§Ø±ÙŠ.",
'recentchangeslinked-page' => 'د مخ نوم:',
@@ -1269,7 +1304,7 @@ $1',
'reuploaddesc' => 'پورته Ú©Ûدنه ناگارل او بÛرته د پورته Ú©ÛØ¯Ù†Û ÙÙˆØ±Ù…Û ØªÙ‡ ورگرÚÛدل',
'upload-tryagain' => 'د بدلون Ù…ÙˆÙ†Ø¯Ù„Û Ø¯ÙˆØªÙ†Û Ú…Ø±Ú¯Ù†Ø¯ÙˆÙ†Û Ø³Ù¾Ø§Ø±Ù„',
'uploadnologin' => 'غونډال Ú©Û Ù†Ù‡ ياست ننوتي',
-'uploadnologintext' => 'Ø¯Ø¯Û Ù„Ù¾Ø§Ø±Ù‡ Ú†Û Ø¯ÙˆØªÙ†Û Ù¾ÙˆØ±ØªÙ‡ کړای Ø´ÛØŒ نو لومړی غونډال Ú©Û [[Special:UserLogin|ورننوÚÛ]].',
+'uploadnologintext' => 'د Ø¯ÙˆØªÙ†Û Ù¾ÙˆØ±ØªÙ‡ کولو لپاره بايد $1',
'uploaderror' => 'د پورته کولو ستونزه',
'uploadtext' => "د Ø¯ÙˆØªÙ†Û Ø¯ پورته Ú©Ûدو لپاره لاندينی چوکاټ وکاروÛ.
Ú©Ù‡ Ú†Ûرته د پخونيو پورته شويو دوتنو کتل او پلټل ØºÙˆØ§Ú“Û Ù†Ùˆ [[Special:FileList|د پورته شويو دوتنو لړليک]] ته ورشÛØŒ [[Special:Log/upload|د (بيا) پورته شويو دوتنو يادښتونه]] او [[Special:Log/delete|د Ú“Ù†Ú¯Ûدو يادښتونه]] هم کتلای Ø´ÛŒ.
@@ -1471,9 +1506,6 @@ $1',
'statistics-users-active-desc' => 'هغه کارنان Ú†Û Ù¾Ù‡ {{PLURAL:$1|ÙˆØ±ÙˆØ³ØªÛ ÙˆØ±Ú|وروستيو $1 ورÚÙˆ}} Ú©Û Ùعاله ونډه لرلÛ',
'statistics-mostpopular' => 'Ú‰Ûر کتل شوي مخونه',
-'disambiguations' => 'د مبهمو مخونو سره تړلي مخونه',
-'disambiguationspage' => 'Template:ناجوت',
-
'pageswithprop-submit' => 'ورÚÙ‡',
'doubleredirects' => 'دوه Úلي ورگرÚÛدنÛ',
@@ -1682,7 +1714,7 @@ $1',
'notanarticle' => 'يو منÚپانګيز مخ نه دی',
'watchlist-details' => 'Ø³ØªØ§Ø³Û Ú©ØªÙ†Ù„Ú“ Ú©Û {{PLURAL:$1|$1 مخ دی|$1 مخونه دي}}ØŒ د خبرو اترو مخونه مو Ù¾Ú©Û Ù†Ù‡ دي شمÛرلي.',
'wlheader-enotif' => 'د برÛښليک له Ù„Ø§Ø±Û Ø®Ø¨Ø±ÙˆÙ„ چارن شوی.*',
-'wlheader-showupdated' => "* هغه مخونه Ú†Û ÙˆØ±ÙˆØ³ØªÛŒ ÚÙ„ ستاسو د کتلو نه وروسته بدلون موندلی په '''روڼ''' ليک Ù†ÚšÙ‡ شوي.",
+'wlheader-showupdated' => "هغه مخونه Ú†Û ÙˆØ±ÙˆØ³ØªÛŒ ÚÙ„ ستاسو د کتلو نه وروسته بدلون موندلی په '''روڼ''' ليک Ù†ÚšÙ‡ شوي.",
'watchlistcontains' => 'Ø³ØªØ§Ø³Û Ú©ØªÙ†Ù„Ú“ $1 {{PLURAL:$1|مخ|مخونه}} لري.',
'iteminvalidname' => "د '$1' توکي سره ستونزه، ناسم نوم ...",
'wlnote' => "دلته Ù„Ø§Ù†Ø¯Û {{PLURAL:$1|وروستی بدلون دی|وروستي '''$1''' بدلونونه دي}} Ú†Û Ù¾Ù‡ {{PLURAL:$2|تÛر ساعت|تÛرو '''$2''' ساعتونو}} Ú©Û ØªØ± $3 Ù†ÛÙ¼Û Ø§Ùˆ $4 بجو Ù¾ÛÚš شوي.",
@@ -1970,8 +2002,6 @@ $UNWATCHURL نه ليدنه ÙˆÚ©Ú“Û
'ipb-needreblock' => 'پر $1 د پخوا نه بنديز Ù„Ú¯Ûدلی.
آيا ØªØ§Ø³Û Ø¯ امستنو بدلول غواړÛØŸ',
'ipb-otherblocks-header' => '{{PLURAL:$1|بل بنديز|نور بنديزونه}}',
-'blockme' => 'پر ما بنديز لگول',
-'proxyblocksuccess' => 'ترسره شو.',
# Developer tools
'lockdb' => 'توکبنسټ تړل',
@@ -2158,11 +2188,9 @@ $UNWATCHURL نه ليدنه ÙˆÚ©Ú“Û
'tooltip-summary' => 'يو لنډ لنډيز کښل',
# Stylesheets
-'nostalgia.css' => '/* د CSS هره بڼه Ú†Û Ø¯Ù„ØªÙ‡ Úای پر Úای Ú©ÛÚ–ÙŠ هغه به د نوستالجيا د پوښ ټولو کارنانو لپاره کار کوي */',
'vector.css' => '/* د CSS هره بڼه Ú†Û Ø¯Ù„ØªÙ‡ Úای پر Úای Ú©ÛÚ–ÙŠ هغه به د ÙˆÛکټور د پوښ ټولو کارنانو لپاره کار کوي */',
# Scripts
-'nostalgia.js' => '/* د جاوا هر يو سکرÛپټ Ú†Û Ø¯Ù„ØªÙ‡ Úای پر Úای Ú©ÛÚ–ÙŠ هغه به د نوستالجيا د پوښ ټولو کارنانو لپاره کار کوي */',
'vector.js' => '/* د جاوا هر يو سکرÛپټ Ú†Û Ø¯Ù„ØªÙ‡ Úای پر Úای Ú©ÛÚ–ÙŠ هغه به د ÙˆÛکټور د پوښ ټولو کارنانو لپاره کار کوي */',
# Attribution
@@ -2204,13 +2232,8 @@ $UNWATCHURL نه ليدنه ÙˆÚ©Ú“Û
'pageinfo-category-files' => 'د دوتنو شمÛر',
# Skin names
-'skinname-standard' => 'کلاسيک',
-'skinname-nostalgia' => 'نوستالژي',
'skinname-cologneblue' => 'شين کلون',
'skinname-monobook' => 'مونوبوک',
-'skinname-myskin' => 'زمابڼه',
-'skinname-chick' => 'شيک',
-'skinname-simple' => 'ساده',
'skinname-modern' => 'نوی',
'skinname-vector' => 'ÙˆÛکټور',
@@ -2292,7 +2315,7 @@ $1',
* gpslongitude
* gpsaltitude',
-# EXIF tags
+# Exif tags
'exif-imagewidth' => 'سوروالی',
'exif-imagelength' => 'لوړوالی',
'exif-datetime' => 'د Ø¯ÙˆØªÙ†Û Ø¯ بدلون وخت او Ù†Ûټه',
@@ -2631,10 +2654,6 @@ $5
'version-software-product' => 'اÛبره',
'version-software-version' => 'بڼه',
-# Special:FilePath
-'filepath-page' => 'دوتنه:',
-'filepath-submit' => 'ورÚÙ‡',
-
# Special:FileDuplicateSearch
'fileduplicatesearch' => 'د دوه گونو دوتنو پلټنه',
'fileduplicatesearch-legend' => 'د دوه گونو دوتنو پلټنه',
@@ -2680,6 +2699,9 @@ $5
'tag-filter-submit' => 'چاڼگر',
'tags-display-header' => 'د بدلون په لړليکونو Ú©Û ÚšÚ©Ø§Ø±Ûدنه',
'tags-description-header' => 'د مانا بشپړه څرگندونه',
+'tags-active-header' => 'Ùعال؟',
+'tags-active-yes' => 'هو',
+'tags-active-no' => 'نه',
'tags-edit' => 'سمول',
'tags-hitcount' => '$1 {{PLURAL:$1|بدلون|بدلونونه}}',
@@ -2708,6 +2730,8 @@ $5
'htmlform-submit' => 'سپارل',
'htmlform-reset' => 'بدلونونه ناکړل',
'htmlform-selectorother-other' => 'بل',
+'htmlform-no' => 'نه',
+'htmlform-yes' => 'هو',
# New logging system
'logentry-delete-delete' => '$1 د $3 مخ {{GENDER:$2|ړنگ کړ}}',
diff --git a/languages/messages/MessagesPt.php b/languages/messages/MessagesPt.php
index d82a2f70..9a6ff9e8 100644
--- a/languages/messages/MessagesPt.php
+++ b/languages/messages/MessagesPt.php
@@ -9,9 +9,11 @@
*
* @author Alchimista
* @author Andresilvazito
+ * @author Cainamarques
* @author Capmo
* @author Crazymadlover
* @author Daemorris
+ * @author DanielTom
* @author Dannyps
* @author Dicionarista
* @author Francisco Leandro
@@ -37,6 +39,7 @@
* @author McDutchie
* @author MetalBrasil
* @author Minh Nguyen
+ * @author Nemo bis
* @author Nuno Tavares
* @author OTAVIO1981
* @author Opraco
@@ -346,9 +349,6 @@ $messages = array(
'tog-shownumberswatching' => 'Mostrar o número de utilizadores a vigiar',
'tog-oldsig' => 'Assinatura existente:',
'tog-fancysig' => 'Tratar assinatura como texto wiki (sem link automático)',
-'tog-externaleditor' => 'Por omissão, utilizar um editor externo (só para utilizadores avançados, exige configurações adicionais no seu computador. [//www.mediawiki.org/wiki/Manual:External_editors Mais informações.])',
-'tog-externaldiff' => 'Por omissão, utilizar diferenças externas (só para utilizadores avançados, exige configurações adicionais no seu computador. [//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 (experimental)',
'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',
@@ -362,6 +362,8 @@ $messages = array(
'tog-showhiddencats' => 'Mostrar categorias ocultas',
'tog-noconvertlink' => 'Impossibilitar a conversão dos títulos de links',
'tog-norollbackdiff' => 'Omitir diferenças depois de reverter edições em bloco',
+'tog-useeditwarning' => 'Avisar-me ao abandonar uma página editada sem gravar as alterações.',
+'tog-prefershttps' => 'Sempre utilizar uma conexão segura ao iniciar sessão',
'underline-always' => 'Sempre',
'underline-never' => 'Nunca',
@@ -425,6 +427,18 @@ $messages = array(
'oct' => 'Out.',
'nov' => 'Nov.',
'dec' => 'Dez.',
+'january-date' => '$1 de Janeiro',
+'february-date' => '$1 de Fevereiro',
+'march-date' => '$1 de Março',
+'april-date' => '$1 de Abril',
+'may-date' => '$1 de Maio',
+'june-date' => '$1 de Junho',
+'july-date' => '$1 de Julho',
+'august-date' => '$1 de Agosto',
+'september-date' => '$1 de Setembro',
+'october-date' => '$1 de Outubro',
+'november-date' => '$1 de Novembro',
+'december-date' => '$1 de Dezembro',
# Categories related messages
'pagecategories' => '{{PLURAL:$1|Categoria|Categorias}}',
@@ -506,6 +520,7 @@ $messages = array(
'create-this-page' => 'Criar esta página',
'delete' => 'Eliminar',
'deletethispage' => 'Eliminar esta página',
+'undeletethispage' => 'Restaurar esta página',
'undelete_short' => 'Restaurar {{PLURAL:$1|uma edição|$1 edições}}',
'viewdeleted_short' => 'Ver {{PLURAL:$1|uma edição eliminada|$1 edições eliminadas}}',
'protect' => 'Proteger',
@@ -549,7 +564,7 @@ $1',
'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).
+# 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).
'aboutsite' => 'Sobre a {{SITENAME}}',
'aboutpage' => 'Project:Sobre',
'copyright' => 'Conteúdo disponibilizado nos termos da $1, salvo indicação em contrário.',
@@ -559,7 +574,6 @@ $1',
'disclaimers' => 'Exoneração de responsabilidade',
'disclaimerpage' => 'Project:Aviso_geral',
'edithelp' => 'Ajuda de edição',
-'edithelppage' => 'Help:Editar',
'helppage' => 'Help:Conteúdos',
'mainpage' => 'Página principal',
'mainpage-description' => 'Página principal',
@@ -637,17 +651,11 @@ Encontra uma lista das páginas especiais válidas em [[Special:SpecialPages|{{i
# General errors
'error' => 'Erro',
'databaseerror' => 'Erro na base de dados',
-'dberrortext' => 'Ocorreu um erro sintáctico na pesquisa à base de dados.
-Isto poderá indicar um defeito no software.
-A última pesquisa executada na base de dados foi:
-<blockquote><code>$1</code></blockquote>
-na função "<code>$2</code>".
-A base de dados devolveu o erro "<samp>$3: $4</samp>".',
-'dberrortextcl' => 'Ocorreu um erro sintáctico na pesquisa à base de dados.
-A última tentativa de consulta à base de dados foi:
-"$1"
-na função "$2".
-A base de dados devolveu o erro "$3: $4"',
+'databaseerror-text' => 'Ocorreu um erro na consulta à base de dados.
+Isto pode indicar um defeito no programa.',
+'databaseerror-textcl' => 'Ocorreu um erro na consulta à base de dados.',
+'databaseerror-query' => 'Consulta:$1',
+'databaseerror-error' => 'Erro: $1',
'laggedslavemode' => "'''Aviso:''' A página pode não conter as atualizações mais recentes.",
'readonly' => 'Base de dados bloqueada (limitada a leituras)',
'enterlockreason' => 'Introduza um motivo para bloquear, incluindo uma estimativa de quando será desbloqueada',
@@ -681,6 +689,7 @@ Pode já ter sido eliminado por outro utilizador.',
'cannotdelete-title' => 'Não é possível eliminar a página "$1"',
'delete-hook-aborted' => 'A eliminação foi cancelada por um "hook".
Não foi dada nenhuma explicação.',
+'no-null-revision' => 'Não foi possível criar uma nova revisão nula para a página "$1"',
'badtitle' => 'Título inválido',
'badtitletext' => 'O título de página solicitado era inválido, vazio, ou um link interlínguas ou interwikis incorrecto.
Talvez contenha um ou mais caracteres que não podem ser usados em títulos.',
@@ -700,12 +709,15 @@ Consulta: $2',
'viewyourtext' => "Pode ver e copiar o código-fonte das '''suas edições''' desta página:",
'protectedinterface' => 'Esta página fornece o texto da interface ao software, e está protegida para prevenir abusos.',
'editinginterface' => "'''Aviso:''' Está a editar uma página usada para fornecer texto de interface ao software. Alterações a esta página afetarão a aparência da interface de utilizador para os outros utilizadores. Para traduções, considere utilizar a [//translatewiki.net/wiki/Main_Page?setlang=pt translatewiki.net], um projeto destinado à tradução do MediaWiki.",
-'sqlhidden' => '(Consulta SQL em segundo-plano)',
'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 proteção "em cascata" ativada):
$2',
'namespaceprotected' => "Não possui permissão para editar páginas no espaço nominal '''$1'''.",
'customcssprotected' => 'Não tem permissões para editar esta página de CSS porque ela contém as configurações pessoais de outro utilizador.',
'customjsprotected' => 'Não tem permissões para editar esta página de JavaScript porque ela contém as configurações pessoais de outro utilizador.',
+'mycustomcssprotected' => 'Não tem permissão para editar esta página de CSS.',
+'mycustomjsprotected' => 'Não tem permissão para editar esta página de JavaScript.',
+'myprivateinfoprotected' => 'Você não tem permissão para editar sua informação privada.',
+'mypreferencesprotected' => 'Você não tem permissão para editar as suas preferências.',
'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\'\'".',
@@ -730,10 +742,19 @@ Tenha em atenção que algumas páginas poderão continuar a ser apresentadas co
'welcomecreation-msg' => 'A sua conta foi criada.
Não se esqueça de personalizar as suas [[Special:Preferences|preferências]].',
'yourname' => 'Nome de utilizador:',
+'userlogin-yourname' => 'Nome de utilizador(a):',
+'userlogin-yourname-ph' => 'Digite seu nome de utilizador(a)',
+'createacct-another-username-ph' => 'Digite o nome de utilizador',
'yourpassword' => 'Palavra-chave:',
+'userlogin-yourpassword' => 'Palavra-chave',
+'userlogin-yourpassword-ph' => 'Digite sua palavra-chave',
+'createacct-yourpassword-ph' => 'Digite uma palavra-chave',
'yourpasswordagain' => 'Repita a palavra-chave:',
+'createacct-yourpasswordagain' => 'Confirme a palavra-chave',
+'createacct-yourpasswordagain-ph' => 'Digite a palavra-chave novamente',
'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',
+'userlogin-remembermypassword' => 'Manter-me autenticado',
+'userlogin-signwithsecure' => 'Use uma ligação segura',
'yourdomainname' => 'O seu domínio:',
'password-change-forbidden' => 'Não pode alterar senhas nesta wiki.',
'externaldberror' => 'Ocorreu um erro externo à base de dados durante a autenticação ou não lhe é permitido atualizar a sua conta externa.',
@@ -745,18 +766,44 @@ Não se esqueça de personalizar as suas [[Special:Preferences|preferências]].'
'logout' => 'Sair',
'userlogout' => 'Sair',
'notloggedin' => 'Não autenticado',
+'userlogin-noaccount' => 'Não tem uma conta?',
+'userlogin-joinproject' => 'Junte-se ao projeto {{SITENAME}}',
'nologin' => 'Não possui uma conta? $1.',
'nologinlink' => 'Criar uma conta',
'createaccount' => 'Criar conta',
'gotaccount' => "Já possui uma conta? '''$1'''.",
'gotaccountlink' => 'Autentique-se',
'userlogin-resetlink' => 'Esqueceu-se do seu nome de utilizador ou da palavra-chave?',
+'userlogin-resetpassword-link' => 'Recuperar palavra-chave',
+'helplogin-url' => 'Help:Autenticação',
+'userlogin-helplink' => '[[{{MediaWiki:helplogin-url}}|Ajuda a fazer login]]',
+'userlogin-loggedin' => 'Já está {{GENDER:$1|autenticado|autenticada|autenticado}} com o nome $1.
+Use o formulário abaixo para iniciar uma sessão com outro nome.',
+'userlogin-createanother' => 'Criar outra conta',
+'createacct-join' => 'Insira a sua informação abaixo.',
+'createacct-another-join' => 'Digite a informação da nova conta abaixo.',
+'createacct-emailrequired' => 'Endereço de email',
+'createacct-emailoptional' => 'Endereço de email (opcional)',
+'createacct-email-ph' => 'Digite seu endereço de email',
+'createacct-another-email-ph' => 'Digite o endereço de e-mail',
'createaccountmail' => 'Usar uma palavra passe aleatória e temporária e enviar para o endereço de correio eletrónico especificado',
+'createacct-realname' => 'Nome verdadeiro (opcional)',
'createaccountreason' => 'Motivo:',
+'createacct-reason' => 'Razão',
+'createacct-reason-ph' => 'Porque está a criar outra conta',
+'createacct-captcha' => 'Verificar segurança',
+'createacct-imgcaptcha-ph' => 'Digite o texto que vê acima',
+'createacct-submit' => 'Crie a sua conta',
+'createacct-another-submit' => 'Criar uma outra conta',
+'createacct-benefit-heading' => '{{SITENAME}} é feito por pessoas como você.',
+'createacct-benefit-body1' => '{{PLURAL:$1|edição|edições}}',
+'createacct-benefit-body2' => '{{PLURAL:$1|página|páginas}}',
+'createacct-benefit-body3' => '{{PLURAL:$1|contribuidor|contribuidores}} recentes',
'badretype' => 'As palavras-chave que introduziu não são iguais.',
'userexists' => 'O nome de utilizador introduzido já existe.
Por favor escolha um nome diferente.',
'loginerror' => 'Erro de autenticação',
+'createacct-error' => 'Erro na criação da conta',
'createaccounterror' => 'Não foi possível criar a conta: $1',
'nocookiesnew' => "A conta de utilizador foi criada, mas neste momento não está autenticado.
A {{SITENAME}} utiliza ''cookies'' para autenticar os utilizadores.
@@ -818,11 +865,13 @@ Deve agora autenticar-se e alterar a sua palavra-chave.
Se a conta foi criada por engano, pode ignorar esta mensagem.',
'usernamehasherror' => 'O nome de utilizador não pode conter o símbolo de cardinal (#).',
-'login-throttled' => 'Realizou demasiadas tentativas de autenticação com esta conta.
-Aguarde antes de tentar novamente, por favor.',
+'login-throttled' => 'Você realizou demasiadas tentativas de autenticação com esta conta.
+Aguarde $1 antes de tentar novamente, por favor.',
'login-abort-generic' => 'A sua autenticação não teve êxito - Cancelada',
'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.',
+'createacct-another-realname-tip' => 'O fornecimento do nome verdadeiro é opcional.
+Se optar por revelá-lo, ele será utilizado para atribuir-lhe crédito pelo seu trabalho.',
# Email sending
'php-mail-error-unknown' => 'Erro desconhecido na função mail() do PHP',
@@ -839,7 +888,7 @@ Para prosseguir, será necessário definir uma nova palavra-chave.',
'newpassword' => 'Palavra-chave nova:',
'retypenew' => 'Repita a palavra-chave nova:',
'resetpass_submit' => 'Definir palavra-chave e entrar',
-'resetpass_success' => 'A sua palavra-chave foi alterada! Autenticação em curso...',
+'changepassword-success' => 'A sua palavra-chave foi alterada com êxito!',
'resetpass_forbidden' => 'Não é possível alterar palavras-chave',
'resetpass-no-info' => 'Precisa estar autenticado para aceder diretamente a esta página.',
'resetpass-submit-loggedin' => 'Alterar palavra-chave',
@@ -851,10 +900,11 @@ Pode ter já alterado com sucesso a sua palavra-chave ou solicitado uma nova pal
# Special:PasswordReset
'passwordreset' => 'Repor palavra-chave',
-'passwordreset-text' => 'Preencha este formulário para repor a sua palavra-passe.',
+'passwordreset-text-one' => 'Preencha este formulário para repor a sua palavra-passe.',
+'passwordreset-text-many' => '{{PLURAL:$1|Preencha um dos campos para redefinir sua senha.}}',
'passwordreset-legend' => 'Reiniciar a palavra-chave',
'passwordreset-disabled' => 'O reinício da palavra-chave foi impossibilitado nesta wiki.',
-'passwordreset-pretext' => '{{PLURAL:$1||Introduza um dos dados abaixo}}',
+'passwordreset-emaildisabled' => 'Recursos de e-mail foram desativados neste wiki.',
'passwordreset-username' => 'Nome de utilizador:',
'passwordreset-domain' => 'Domínio:',
'passwordreset-capture' => 'Ver o email resultante?',
@@ -877,7 +927,7 @@ Deve autenticar-se e escolher uma palavra-passe nova agora. Se outra pessoa fez
Palavra-chave temporária: $2',
'passwordreset-emailsent' => 'Foi enviado um correio eletrónico para recuperação da palavra-passe.',
'passwordreset-emailsent-capture' => 'Foi enviado um e-mail de recuperação da palavra-passe, que é mostrado abaixo.',
-'passwordreset-emailerror-capture' => 'Foi gerado o lembrete de e-mail mostrado abaixo, contudo falhou o envio para o utilizador: $1',
+'passwordreset-emailerror-capture' => 'Foi gerado o e-mail de reposição de palavra-passe mostrado abaixo, contudo falhou o seu envio para {{GENDER:$2|o utilizador|a utilizadora}}: $1',
# Special:ChangeEmail
'changeemail' => 'Alterar o endereço de correio electrónico',
@@ -891,6 +941,19 @@ Palavra-chave temporária: $2',
'changeemail-submit' => 'Alterar correio electrónico',
'changeemail-cancel' => 'Cancelar',
+# Special:ResetTokens
+'resettokens' => 'Redefinir chaves',
+'resettokens-text' => 'Pode redefinir as chaves de acesso a certos dados privados associados à sua conta aqui.
+
+Deve fazê-lo se as divulgou acidentalmente a alguém ou se a sua conta tiver sido comprometida.',
+'resettokens-no-tokens' => 'Não há chaves para redefinir.',
+'resettokens-legend' => 'Redefinir chaves',
+'resettokens-tokens' => 'Chaves:',
+'resettokens-token-label' => '$1 (valor actual: $2)',
+'resettokens-watchlist-token' => "Chave para o ''feed'' Atom/RSS de [[Special:Watchlist|mudanças às páginas vigiadas]]",
+'resettokens-done' => 'As chaves foram redefinidas.',
+'resettokens-resetbutton' => 'Redefinir chaves selecionadas',
+
# Edit page toolbar
'bold_sample' => 'Texto a negrito',
'bold_tip' => 'Texto a negrito',
@@ -1099,12 +1162,15 @@ Não foi dada nenhuma explicação.',
Ela parece ter sido eliminada.',
'edit-conflict' => 'Conflito de edição.',
'edit-no-change' => 'A sua edição foi ignorada, uma vez que o texto não sofreu alterações.',
+'postedit-confirmation' => 'A sua edição foi gravada.',
'edit-already-exists' => 'Não foi possível criar uma página nova.
Ela já existia.',
'defaultmessagetext' => 'Texto da mensagem padrão',
'content-failed-to-parse' => 'Falha ao analisar conteúdo $2 para modelo $1:$3',
'invalid-content-data' => 'Dados de conteúdo inválidos',
'content-not-allowed-here' => 'Conteúdo do tipo "$1" não é permitido na página [[$2]]',
+'editwarning-warning' => 'Sair desta página fará com que você perca quaisquer alterações feitas por você.
+Se você se autenticou, pode desabilitar este aviso na seção "Edição" das suas preferências.',
# Content models
'content-model-wikitext' => 'wikitexto',
@@ -1140,6 +1206,7 @@ Depois grave as alterações, para finalizar e desfazer a edição.',
'undo-failure' => 'Não foi possível desfazer a edição por conflito com alterações intermédias.',
'undo-norev' => 'Não foi possível desfazer a edição porque ela não existe ou foi apagada.',
'undo-summary' => 'Desfeita a edição $1 de [[Special:Contributions/$2|$2]] ([[User talk:$2|Discussão]])',
+'undo-summary-username-hidden' => 'Desfazer a revisão $1 por um usuário oculto',
# Account creation failure
'cantcreateaccounttitle' => 'Não é possível criar uma conta',
@@ -1324,6 +1391,7 @@ Note que, se usar os links de navegação, os botões de opção voltarão aos v
'compareselectedversions' => 'Comparar as versões selecionadas',
'showhideselectedversions' => 'Mostrar/ocultar versões selecionadas',
'editundo' => 'desfazer',
+'diff-empty' => '(Sem diferenças)',
'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}})',
'difference-missing-revision' => '{{PLURAL:$2|Uma revisão|$2 revisões}} desta diferença ($1) não {{PLURAL:$2|foi encontrada|foram encontradas}}.
@@ -1351,7 +1419,6 @@ Os detalhes podem ser encontrados no [{{fullurl:{{#Special:Log}}/delete|page={{F
'searchmenu-legend' => 'Opções de pesquisa',
'searchmenu-exists' => "'''Há uma página com o nome \"[[:\$1]]\" nesta wiki'''",
'searchmenu-new' => "'''Crie a página \"[[:\$1]]\" nesta wiki!'''",
-'searchhelp-url' => 'Help:Conteúdos',
'searchmenu-prefix' => '[[Special:PrefixIndex/$1|Navegar as páginas com este prefixo]]',
'searchprofile-articles' => 'Páginas de conteúdo',
'searchprofile-project' => 'Páginas de ajuda e de projeto',
@@ -1395,15 +1462,7 @@ Tente usar o prefixo ''all:'' para pesquisar todo o conteúdo (incluindo página
'searchdisabled' => 'Foi impossibilitada a realização de pesquisas na {{SITENAME}}.
Entretanto, pode realizar pesquisas através do Google.
Note, no entanto, que a indexação da {{SITENAME}} neste motor de busca pode estar desatualizada.',
-
-# Quickbar
-'qbsettings' => 'Barra Rápida',
-'qbsettings-none' => 'Nenhuma',
-'qbsettings-fixedleft' => 'Fixa à esquerda',
-'qbsettings-fixedright' => 'Fixa à direita',
-'qbsettings-floatingleft' => 'Flutuante à esquerda',
-'qbsettings-floatingright' => 'Flutuante à direita',
-'qbsettings-directionality' => 'Fixa, conforme a direccionalidade da escrita na sua língua',
+'search-error' => 'Um erro ocorreu enquanto se efectuava a busca: $1',
# Preferences page
'preferences' => 'Preferências',
@@ -1437,7 +1496,6 @@ Note, no entanto, que a indexação da {{SITENAME}} neste motor de busca pode es
'resetprefs' => 'Eliminar as alterações que não foram gravadas',
'restoreprefs' => 'Repor todas as configurações padrão (em todas as secções)',
'prefs-editing' => 'Edição',
-'prefs-edit-boxsize' => 'Dimensões da janela de edição.',
'rows' => 'Linhas:',
'columns' => 'Colunas:',
'searchresultshead' => 'Pesquisar',
@@ -1448,9 +1506,9 @@ Note, no entanto, que a indexação da {{SITENAME}} neste motor de busca pode es
'recentchangesdays-max' => 'Máximo: $1 {{PLURAL:$1|dia|dias}}',
'recentchangescount' => 'Número de edições a apresentar por omissão:',
'prefs-help-recentchangescount' => 'Inclui mudanças recentes, histórico de páginas e registos.',
-'prefs-help-watchlist-token' => "Preencher este campo com uma chave secreta gera um ''feed'' RSS para a sua lista de páginas vigiadas.
-Qualquer pessoa que conheça esta chave será capaz de ler a sua lista de páginas vigiadas, por isso escolha um valor seguro.
-Eis um valor gerado aleatoriamente, que pode usar: $1",
+'prefs-help-watchlist-token2' => "Esta é a chave secreta para o ''feed'' RSS da sua lista de páginas vigiadas.
+Qualquer pessoa que conheça a chave será capaz de ler a sua lista de páginas vigiadas, por isso não a divulgue.
+[[Special:ResetTokens|Clique aqui para redefini-la]].",
'savedprefs' => 'As suas preferências foram gravadas.',
'timezonelegend' => 'Fuso horário:',
'localtime' => 'Hora local:',
@@ -1482,7 +1540,6 @@ Eis um valor gerado aleatoriamente, que pode usar: $1",
As suas preferências serão modificadas para os valores predefinidos do site.
Esta operação não pode ser desfeita.',
'prefs-emailconfirm-label' => 'Confirmação do endereço:',
-'prefs-textboxsize' => 'Tamanho da janela de edição',
'youremail' => 'Correio electrónico:',
'username' => 'Nome de {{GENDER:$1|utilizador|utilizadora}}:',
'uid' => 'Identificação de {{GENDER:$1|utilizador|utilizadora}}:',
@@ -1516,6 +1573,7 @@ Se optar por revelá-lo, ele será utilizado para atribuir-lhe crédito pelo seu
'prefs-dateformat' => 'Formato de data',
'prefs-timeoffset' => 'Desvio horário',
'prefs-advancedediting' => 'Opções gerais',
+'prefs-preview' => 'Antevisão',
'prefs-advancedrc' => 'Opções avançadas',
'prefs-advancedrendering' => 'Opções avançadas',
'prefs-advancedsearchoptions' => 'Opções avançadas',
@@ -1523,6 +1581,7 @@ Se optar por revelá-lo, ele será utilizado para atribuir-lhe crédito pelo seu
'prefs-displayrc' => 'Opções de visionamento',
'prefs-displaysearchoptions' => 'Opções de apresentação',
'prefs-displaywatchlist' => 'Opções de apresentação',
+'prefs-tokenwatchlist' => 'Chave',
'prefs-diffs' => 'Diferenças',
# User preference: email validation using jQuery
@@ -1550,6 +1609,8 @@ Se optar por revelá-lo, ele será utilizado para atribuir-lhe crédito pelo seu
'userrights-notallowed' => 'A sua conta não tem permissão para adicionar ou remover privilégios a utilizadores.',
'userrights-changeable-col' => 'Grupos que pode alterar',
'userrights-unchangeable-col' => 'Grupos que não pode alterar',
+'userrights-conflict' => 'Conflito com os privilégios dos utilizadores! Por favor, aplique as suas mudanças novamente.',
+'userrights-removed-self' => 'Você removeu com sucesso os seus privilégios. Como resultado disso, já não consegue aceder a esta página.',
# Groups
'group' => 'Grupo:',
@@ -1615,11 +1676,13 @@ Se optar por revelá-lo, ele será utilizado para atribuir-lhe crédito pelo seu
'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 em cascata',
-'right-editprotected' => 'Editar páginas protegidas (sem protecção em cascata)',
+'right-editprotected' => 'Editar páginas protegidas como "{{int:protect-level-sysop}}"',
'right-editinterface' => 'Editar a interface de utilizador',
'right-editusercssjs' => 'Editar os ficheiros CSS e JS de outros utilizadores',
'right-editusercss' => 'Editar os ficheiros CSS de outros utilizadores',
'right-edituserjs' => 'Editar os ficheiros JS de outros utilizadores',
+'right-editmyusercss' => 'Editar os seus próprios ficheiros CSS de utilizador',
+'right-editmyuserjs' => 'Editar os seus próprios ficheiros JavaScript de utilizador',
'right-rollback' => 'Reverter rapidamente as edições do último utilizador que editou uma página em particular',
'right-markbotedits' => 'Marcar edições revertidas como edições de bot',
'right-noratelimit' => 'Não ser afetado pelos limites de velocidade de operação',
@@ -1687,6 +1750,7 @@ Se optar por revelá-lo, ele será utilizado para atribuir-lhe crédito pelo seu
'recentchanges' => 'Mudanças recentes',
'recentchanges-legend' => 'Opções das mudanças recentes',
'recentchanges-summary' => 'Acompanhe nesta página as mudanças mais recentes da wiki.',
+'recentchanges-noresult' => 'Nenhuma alteração correspondente a esses critérios foi realizada durante o período selecionado.',
'recentchanges-feed-description' => "Acompanhe neste ''feed'' as mudanças mais recentes da wiki.",
'recentchanges-label-newpage' => 'Esta edição criou uma página nova',
'recentchanges-label-minor' => 'Esta é uma edição menor',
@@ -1723,7 +1787,6 @@ Se optar por revelá-lo, ele será utilizado para atribuir-lhe crédito pelo seu
'recentchangeslinked-feed' => 'Alterações relacionadas',
'recentchangeslinked-toolbox' => 'Alterações relacionadas',
'recentchangeslinked-title' => 'Alterações relacionadas com "$1"',
-'recentchangeslinked-noresult' => 'Nenhuma mudança nas páginas relacionadas durante o período.',
'recentchangeslinked-summary' => "Lista das mudanças recentes a todas as páginas para as quais a página fornecida contém links (ou de todas as que pertencem à categoria fornecida).
As suas [[Special:Watchlist|páginas vigiadas]] aparecem a '''negrito'''.",
'recentchangeslinked-page' => 'Nome da página:',
@@ -1735,7 +1798,7 @@ As suas [[Special:Watchlist|páginas vigiadas]] aparecem a '''negrito'''.",
'reuploaddesc' => 'Cancelar o envio e voltar ao formulário de carregamento',
'upload-tryagain' => 'Submeta a descrição do ficheiro modificado',
'uploadnologin' => 'Não autenticado',
-'uploadnologintext' => 'Tem de estar [[Special:UserLogin|autenticado]] para enviar ficheiros.',
+'uploadnologintext' => 'Tem de $1 para enviar ficheiros.',
'upload_directory_missing' => 'O diretó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 diretório de carregamento de ficheiros ($1).',
'uploaderror' => 'Erro ao carregar',
@@ -1971,7 +2034,6 @@ Para optimizar a segurança, o img_auth.php está impossibilitado de executar.',
'http-read-error' => 'Erro de leitura HTTP.',
'http-timed-out' => 'O pedido HTTP expirou.',
'http-curl-error' => 'Ocorreu um erro ao aceder à URL: $1',
-'http-host-unreachable' => 'Não foi possível aceder à URL',
'http-bad-status' => 'Ocorreu um problema durante o pedido HTTP: $1 $2',
# Some likely curl errors. More could be added from <http://curl.haxx.se/libcurl/c/libcurl-errors.html>
@@ -2000,6 +2062,8 @@ Verifique se o endereço está correto e o site disponível, por favor.',
'listfiles_size' => 'Tamanho',
'listfiles_description' => 'Descrição',
'listfiles_count' => 'Versões',
+'listfiles-show-all' => 'Incluir versões antigas de imagens',
+'listfiles-latestversion-no' => 'Não',
# File description page
'file-anchor-link' => 'Ficheiro',
@@ -2094,6 +2158,10 @@ Talvez queira editar a descrição na [$2 página original de descrição do fic
'randompage' => 'Página aleatória',
'randompage-nopages' => 'Não há páginas {{PLURAL:$2|no seguinte espaço nominal|nos seguintes espaços nominais}}: $1.',
+# Random page in category
+'randomincategory-nopages' => 'Não há páginas na categoria [[:Category:$1|$1]].',
+'randomincategory-selectcategory-submit' => 'Ir',
+
# Random redirect
'randomredirect' => 'Redirecionamento aleatório',
'randomredirect-nopages' => 'Não há redirecionamentos no espaço nominal "$1".',
@@ -2119,17 +2187,13 @@ Talvez queira editar a descrição na [$2 página original de descrição do fic
'statistics-users-active-desc' => 'Utilizadores que efectuaram uma operação {{PLURAL:$1|no último dia|nos últimos $1 dias}}',
'statistics-mostpopular' => 'Páginas mais vistas',
-'disambiguations' => 'Páginas com ligações para páginas de desambiguação',
-'disambiguationspage' => 'Template:disambig',
-'disambiguations-text' => "As páginas abaixo contêm pelo menos um link para uma '''página de desambiguação'''.
-Estes links deviam ser desambiguados, apontando-os para uma página mais apropriada.<br />
-Considera-se que uma página é de desambiguação se nela for utilizada uma predefinição que esteja definida em [[MediaWiki:Disambiguationspage]].",
-
'pageswithprop' => 'Páginas com uma propriedade',
'pageswithprop-legend' => 'Páginas com uma propriedade',
'pageswithprop-text' => 'Esta página lista páginas que usam uma propriedade em particular.',
'pageswithprop-prop' => 'Nome da propriedade:',
'pageswithprop-submit' => 'Avançar',
+'pageswithprop-prophidden-long' => 'foi ocultado o valor da propriedade por ser um texto muito longo ($1 kilobytes)',
+'pageswithprop-prophidden-binary' => 'foi ocultado o valor da propriedade por ser binário ($1 kilobytes)',
'doubleredirects' => 'Redirecionamentos duplos',
'doubleredirectstext' => 'Esta página lista todas as páginas que redirecionam para outras páginas de redirecionamento.
@@ -2188,6 +2252,7 @@ Agora redirecciona para [[$2]].',
'mostrevisions' => 'Páginas com mais revisões',
'prefixindex' => 'Todas as páginas iniciadas por',
'prefixindex-namespace' => 'Todas as páginas com prefixo (espaço nominal $1)',
+'prefixindex-strip' => 'Remover prefixo',
'shortpages' => 'Páginas curtas',
'longpages' => 'Páginas longas',
'deadendpages' => 'Páginas sem saída',
@@ -2380,10 +2445,9 @@ Modificações futuras desta página e da respetiva página de discussão serão
'unwatchthispage' => 'Parar de vigiar esta página',
'notanarticle' => 'Não é uma página de conteúdo',
'notvisiblerev' => 'Edição eliminada',
-'watchnochange' => 'Nenhuma das páginas vigiadas foi editada no período apresentado.',
'watchlist-details' => '{{PLURAL:$1|Existe $1 página|Existem $1 páginas}} na sua lista de páginas vigiadas, excluindo páginas de discussão.',
-'wlheader-enotif' => '* A notificação por correio electrónico está activada.',
-'wlheader-showupdated' => "* As páginas modificadas desde a última vez que as visitou aparecem destacadas a '''negrito'''",
+'wlheader-enotif' => 'A notificação por correio electrónico está activa.',
+'wlheader-showupdated' => "As páginas modificadas desde a última vez que as visitou aparecem destacadas a '''negrito'''.",
'watchmethod-recent' => 'a procurar páginas vigiadas nas mudanças recentes',
'watchmethod-list' => 'a procurar mudanças recentes nas páginas vigiadas',
'watchlistcontains' => 'A sua lista de páginas vigiadas contém $1 {{PLURAL:$1|página|páginas}}.',
@@ -2634,7 +2698,7 @@ $1',
'contributions' => 'Contribuições {{GENDER:$1|do utilizador|da utilizadora}}',
'contributions-title' => 'Contribuições {{GENDER:$1|do utilizador|da utilizadora}} $1',
'mycontris' => 'Contribuições',
-'contribsub2' => 'Para $1 ($2)',
+'contribsub2' => 'Para {{GENDER:$3|$1}} ($2)',
'nocontribs' => 'Não foram encontradas alterações com este critério.',
'uctop' => '(atual)',
'month' => 'Até o mês:',
@@ -2790,14 +2854,12 @@ Consulte a [[Special:BlockList|lista de bloqueios]] para obter a lista de bloque
'ipb_blocked_as_range' => 'Erro: O IP $1 não se encontra bloqueado de forma direta e não pode ser desbloqueado deste modo. No entanto, está bloqueado como parte da gama $2, a qual pode ser desbloqueada.',
'ip_range_invalid' => 'Gama de IPs inválida.',
'ip_range_toolarge' => 'Não são permitidas gamas de IPs maiores do que /$1.',
-'blockme' => 'Bloquear-me',
'proxyblocker' => 'Bloqueador de proxies',
-'proxyblocker-disabled' => 'Esta função foi impossibilitada.',
'proxyblockreason' => "O seu endereço IP foi bloqueado por ser um ''proxy'' público.
Contacte o seu fornecedor de internet ou o serviço de apoio técnico e informe-os deste grave problema de segurança, por favor.",
-'proxyblocksuccess' => 'Feito.',
'sorbsreason' => "O seu endereço IP encontra-se listado como ''proxy'' aberto na DNSBL utilizada pela {{SITENAME}}.",
'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",
+'xffblockreason' => 'Um endereço IP presente no cabeçalho X-Forwarded-For, seja seu ou de um servidor de proxy que estiver a usar, foi bloqueado. A razão do bloqueio original foi: $1',
'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 tem o privilégio para ocultar utilizadores ''(hideuser)'', não pode ver ou editar o bloqueio deste utilizador.",
@@ -2961,6 +3023,8 @@ Se deseja colaborar na localização genérica do MediaWiki, visite [//www.media
'thumbnail-more' => 'Ampliar',
'filemissing' => 'Ficheiro não encontrado',
'thumbnail_error' => 'Erro ao criar miniatura: $1',
+'thumbnail_error_remote' => 'Mensagem de erro de $1 :
+$2',
'djvu_page_error' => 'página DjVu inacessível',
'djvu_no_xml' => 'Não foi possível aceder ao XML para o ficheiro DjVU',
'thumbnail-temp-create' => 'Não foi possível criar o ficheiro temporário da miniatura',
@@ -3114,27 +3178,16 @@ Permite colocar uma justificação no resumo da edição.',
# Stylesheets
'common.css' => '/* Código CSS colocado aqui será aplicado a todos os temas */',
-'standard.css' => '/* Código CSS colocado aqui afectará os utilizadores do tema Clássico */',
-'nostalgia.css' => '/* Código CSS colocado aqui afectará os utilizadores do tema Nostalgia */',
'cologneblue.css' => '/* Código CSS colocado aqui afectará os utilizadores do tema Azul colonial */',
'monobook.css' => '/* Código CSS colocado aqui afectará os utilizadores do tema Monobook */',
-'myskin.css' => '/* Código CSS colocado aqui afectará os utilizadores do tema MySkin */',
-'chick.css' => '/* Código CSS colocado aqui afectará os utilizadores do tema Chique */',
-'simple.css' => '/* Código CSS colocado aqui afectará os utilizadores do tema Simples */',
'modern.css' => '/* Código CSS colocado aqui afectará os utilizadores do tema Moderno */',
'vector.css' => '/* Código CSS colocado aqui afectará os utilizadores do tema Vector */',
'print.css' => '/* Código CSS colocado aqui afectará as impressões */',
-'handheld.css' => '/* Código CSS colocado aqui afectará dispositivos móveis baseados no tema configurado em $wgHandheldStyle */',
# Scripts
'common.js' => '/* Código Javascript colocado aqui será carregado para todos os utilizadores em cada carregamento de página */',
-'standard.js' => '/* Código Javascript colocado aqui será carregado para utilizadores do tema Clássico */',
-'nostalgia.js' => '/* Código Javascript colocado aqui será carregado para utilizadores do tema Nostalgia */',
'cologneblue.js' => '/* Código Javascript colocado aqui será carregado para utilizadores do tema Azul colonial */',
'monobook.js' => '/* Código Javascript colocado aqui será carregado para utilizadores do tema Monobook */',
-'myskin.js' => '/* Código Javascript colocado aqui será carregado para utilizadores do tema MySkin */',
-'chick.js' => '/* Código Javascript colocado aqui será carregado para utilizadores do tema Chick */',
-'simple.js' => '/* Código Javascript colocado aqui será carregado para utilizadores do tema Simples */',
'modern.js' => '/* Código Javascript colocado aqui será carregado para utilizadores do tema Moderno */',
'vector.js' => '/* Código Javascript colocado aqui será carregado para utilizadores do tema Vector */',
@@ -3210,13 +3263,8 @@ Este bloqueio foi provavelmente causado por um link para um site externo que con
'pageinfo-category-files' => 'Número de ficheiros',
# Skin names
-'skinname-standard' => 'Clássico',
-'skinname-nostalgia' => 'Nostalgia',
'skinname-cologneblue' => 'Azul colonial',
'skinname-monobook' => 'MonoBook',
-'skinname-myskin' => 'MySkin',
-'skinname-chick' => 'Chique',
-'skinname-simple' => 'Simples',
'skinname-modern' => 'Moderno',
'skinname-vector' => 'Vector',
@@ -3295,11 +3343,25 @@ Executá-lo poderá comprometer a segurança do seu sistema.",
'minutes' => '{{PLURAL:$1|um minuto|$1 minutos}}',
'hours' => '{{PLURAL:$1|uma hora|$1 horas}}',
'days' => '{{PLURAL:$1|um dia|$1 dias}}',
+'weeks' => '{{PLURAL:$1|$1 semana|$1 semanas}}',
'months' => '{{PLURAL:$1|1 mês|$1 meses}}',
'years' => '{{PLURAL:$1|1 ano|$1 anos}}',
'ago' => '$1 atrás',
'just-now' => 'agora mesmo',
+# Human-readable timestamps
+'hours-ago' => 'há $1 {{PLURAL:$1|hora|horas}}',
+'minutes-ago' => 'há $1 {{PLURAL:$1|minuto|minutos}}',
+'seconds-ago' => 'há $1 {{PLURAL:$1|segundo|segundos}}',
+'monday-at' => 'Segunda-feira às $1',
+'tuesday-at' => 'Terça-feira às $1',
+'wednesday-at' => 'Quarta-feira às $1',
+'thursday-at' => 'Quinta-feira às $1',
+'friday-at' => 'Sexta-feira às $1',
+'saturday-at' => 'Sábado às $1',
+'sunday-at' => 'Domingo às $1',
+'yesterday-at' => 'Ontem às $1',
+
# Bad image list
'bad_image_list' => 'O formato é o seguinte:
@@ -3328,7 +3390,7 @@ Caso o ficheiro tenha sido modificado a partir do seu estado original, alguns de
* gpslongitude
* gpsaltitude',
-# EXIF tags
+# Exif tags
'exif-imagewidth' => 'Largura',
'exif-imagelength' => 'Altura',
'exif-bitspersample' => 'Bits por componente',
@@ -3506,7 +3568,7 @@ Caso o ficheiro tenha sido modificado a partir do seu estado original, alguns de
'exif-originalimageheight' => 'Altura da imagem antes de ser cortada',
'exif-originalimagewidth' => 'Largura da imagem antes de ser cortada',
-# EXIF attributes
+# Exif attributes
'exif-compression-1' => 'Descomprimido',
'exif-compression-2' => 'CCITT Grupo 3 1-D Codificação Unidimensional Huffman Modificado e Run Length Encoding',
'exif-compression-3' => 'CCITT Grupo 3 codificação de fax',
@@ -3906,7 +3968,6 @@ Também pode [[Special:EditWatchlist|editar a lista da maneira convencional]].',
'version-other' => 'Diversos',
'version-mediahandlers' => 'Leitura e tratamento de multimédia',
'version-hooks' => 'Hooks',
-'version-extension-functions' => 'Funções de extensão',
'version-parser-extensiontags' => 'Extensões do analisador sintático',
'version-parser-function-hooks' => "''Hooks'' das funções do analisador sintático",
'version-hook-name' => 'Nome do hook',
@@ -3928,12 +3989,17 @@ Em conjunto com este programa deve ter recebido [{{SERVER}}{{SCRIPTPATH}}/COPYIN
'version-entrypoints-header-entrypoint' => 'Ponto de entrada',
'version-entrypoints-header-url' => 'URL',
-# Special:FilePath
-'filepath' => 'Endereço de ficheiro',
-'filepath-page' => 'Ficheiro:',
-'filepath-submit' => 'Ir',
-'filepath-summary' => 'Esta página especial retorna o endereço completo de um ficheiro.
-Imagens serão apresentadas pelo browser na resolução máxima; ficheiros de outro tipo serão abertos pelo browser diretamente no programa que lhes está associado no seu computador.',
+# Special:Redirect
+'redirect' => 'Redirecionar pelo ID do ficheiro, utilizador ou revisão',
+'redirect-legend' => 'Redirecionar para um ficheiro ou página',
+'redirect-summary' => 'Esta página especial redireciona a um ficheiro (dado o nome do ficheiro), a uma página (dado um ID de revisão) ou a uma página de utilizador (dado o ID do utilizador).',
+'redirect-submit' => 'Ir',
+'redirect-lookup' => 'Pesquisa:',
+'redirect-value' => 'Valor:',
+'redirect-user' => 'Identificador do utilizador',
+'redirect-revision' => 'Revisão da página',
+'redirect-file' => 'Nome do ficheiro',
+'redirect-not-exists' => 'Valor não encontrado',
# Special:FileDuplicateSearch
'fileduplicatesearch' => 'Ficheiros duplicados',
@@ -3982,11 +4048,13 @@ Imagens serão apresentadas pelo browser na resolução máxima; ficheiros de ou
'tags' => 'Etiquetas de modificação válidas',
'tag-filter' => 'Filtro de [[Special:Tags|etiquetas]]:',
'tag-filter-submit' => 'Filtrar',
+'tag-list-wrapper' => '([[Special:Tags|{{PLURAL:$1|Etiqueta|Etiquetas}}]]: $2)',
'tags-title' => 'Etiquetas',
'tags-intro' => 'Esta página lista as etiquetas com que o software poderá marcar uma edição, e o seu significado.',
'tags-tag' => 'Nome da etiqueta',
'tags-display-header' => 'Aparência nas listas de modificações',
'tags-description-header' => 'Descrição completa do significado',
+'tags-active-header' => 'Ativa?',
'tags-hitcount-header' => 'Modificações etiquetadas',
'tags-edit' => 'editar',
'tags-hitcount' => '$1 {{PLURAL:$1|modificação|modificações}}',
@@ -4023,6 +4091,9 @@ Imagens serão apresentadas pelo browser na resolução máxima; ficheiros de ou
'htmlform-submit' => 'Enviar',
'htmlform-reset' => 'Desfazer alterações',
'htmlform-selectorother-other' => 'Outros',
+'htmlform-no' => 'Não',
+'htmlform-yes' => 'Sim',
+'htmlform-chosen-placeholder' => 'Selecione uma opção',
# SQLite database support
'sqlite-has-fts' => '$1 com suporte de pesquisa de texto completo',
@@ -4140,4 +4211,10 @@ Caso contrário, pode facilmente usar o formulário abaixo. O seu comentário se
# Image rotation
'rotate-comment' => 'Imagem rodada em $1 {{PLURAL:$1|grau|graus}} no sentido dos ponteiros do relógio',
+# Limit report
+'limitreport-cputime-value' => '$1 {{PLURAL:$1|segundo|segundos}}',
+'limitreport-postexpandincludesize-value' => '$1/$2 {{PLURAL:$2|byte|bytes}}',
+'limitreport-templateargumentsize' => 'Tamanho dos argumentos da predefinição',
+'limitreport-templateargumentsize-value' => '$1/$2 {{PLURAL:$2|byte|bytes}}',
+
);
diff --git a/languages/messages/MessagesPt_br.php b/languages/messages/MessagesPt_br.php
index 776227fa..d60517ae 100644
--- a/languages/messages/MessagesPt_br.php
+++ b/languages/messages/MessagesPt_br.php
@@ -45,9 +45,11 @@
* @author Luckas Blade
* @author Malafaya
* @author ManoDbo
+ * @author Matheus Sousa L.T
* @author McDutchie
* @author MetalBrasil
* @author MisterSanderson
+ * @author Nemo bis
* @author OTAVIO1981
* @author Opraco
* @author Pedroca cerebral
@@ -55,6 +57,7 @@
* @author Rafael Vargas
* @author Raylton P. Sousa
* @author Rodrigo Calanca Nishino
+ * @author Rodrigo Padula
* @author Sir Lestaty de Lioncourt
* @author Teles
* @author TheGabrielZaum
@@ -353,9 +356,6 @@ $messages = array(
'tog-shownumberswatching' => 'Mostrar o número de usuários que estão vigiando',
'tog-oldsig' => 'Assinatura existente:',
'tog-fancysig' => 'Tratar assinatura como wikitexto (sem link automático)',
-'tog-externaleditor' => 'Utilizar editor externo por padrão (apenas para usuários avançados; requer configurações adicionais em seu computador. [//www.mediawiki.org/wiki/Manual:External_editors Mais informações.])',
-'tog-externaldiff' => 'Utilizar comparador de versões externo por padrão (apenas para usuários avançados; requer configurações adicionais em seu computador. [//www.mediawiki.org/wiki/Manual:External_editors Mais informações.])',
-'tog-showjumplinks' => 'Ativar links de acessibilidade "ir para"',
'tog-uselivepreview' => 'Utilizar pré-visualização em tempo real (experimental)',
'tog-forceeditsummary' => 'Avisar-me ao introduzir um sumário de edição vazio',
'tog-watchlisthideown' => 'Ocultar as minhas edições da lista de páginas vigiadas',
@@ -369,6 +369,8 @@ $messages = array(
'tog-showhiddencats' => 'Exibir categorias ocultas',
'tog-noconvertlink' => 'Desabilitar conversão de títulos de links',
'tog-norollbackdiff' => 'Omitir diferenças após desfazer edições em bloco',
+'tog-useeditwarning' => 'Avisar-me quando eu deixar uma janela de edição sem ter salvo as alterações',
+'tog-prefershttps' => 'Usar sempre uma conexão segura quando estiver conectado',
'underline-always' => 'Sempre',
'underline-never' => 'Nunca',
@@ -432,6 +434,18 @@ $messages = array(
'oct' => 'out',
'nov' => 'nov',
'dec' => 'dez',
+'january-date' => '$1 de janeiro',
+'february-date' => '$1 de fevereiro',
+'march-date' => '$1 de março',
+'april-date' => '$1 de abril',
+'may-date' => '$1 de maio',
+'june-date' => '$1 de junho',
+'july-date' => '$1 de julho',
+'august-date' => '$1 de agosto',
+'september-date' => '$1 de setembro',
+'october-date' => '$1 de outubro',
+'november-date' => '$1 de novembro',
+'december-date' => '$1 de dezembro',
# Categories related messages
'pagecategories' => '{{PLURAL:$1|Categoria|Categorias}}',
@@ -513,6 +527,7 @@ $messages = array(
'create-this-page' => 'Iniciar esta página',
'delete' => 'Eliminar',
'deletethispage' => 'Eliminar esta página',
+'undeletethispage' => 'Restaure esta página',
'undelete_short' => 'Restaurar {{PLURAL:$1|uma edição|$1 edições}}',
'viewdeleted_short' => 'Ver {{PLURAL:$1|uma edição eliminada|$1 edições eliminadas}}',
'protect' => 'Proteger',
@@ -556,7 +571,7 @@ $1',
'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).
+# 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).
'aboutsite' => 'Sobre {{SITENAME}}',
'aboutpage' => 'Project:Sobre',
'copyright' => 'Conteúdo disponível sob $1, salvo indicação em contrário.',
@@ -566,7 +581,6 @@ $1',
'disclaimers' => 'Exoneração de responsabilidade',
'disclaimerpage' => 'Project:Aviso_geral',
'edithelp' => 'Ajuda de edição',
-'edithelppage' => 'Help:Editar',
'helppage' => 'Help:Conteúdos',
'mainpage' => 'Página principal',
'mainpage-description' => 'Página principal',
@@ -644,17 +658,12 @@ Uma lista de páginas especiais válidas poderá ser encontrada em [[Special:Spe
# General errors
'error' => 'Erro',
'databaseerror' => 'Erro no banco de dados',
-'dberrortext' => 'Ocorreu um erro de sintaxe na busca no banco de dados.
-Isto pode indicar um bug no software.
-A última tentativa de busca no banco de dados foi:
-<blockquote><code>$1</code></blockquote>
-na função "<code>$2</code>".
-O banco de dados retornou o erro "<samp>$3: $4</samp>".',
-'dberrortextcl' => 'Ocorreu um erro de sintaxe de busca no banco de dados.
-A última tentativa de busca no banco de dados foi:
-"$1"
-na função "$2".
-O banco de dados retornou o erro "$3: $4".',
+'databaseerror-text' => 'Houve um erro na consulta ao banco de dados.
+Isto pode indicar um bug no software.',
+'databaseerror-textcl' => 'Houve um erro na consulta ao banco de dados.',
+'databaseerror-query' => 'Consulta: $1',
+'databaseerror-function' => 'Função: $1',
+'databaseerror-error' => 'Erro: $1',
'laggedslavemode' => 'Aviso: a página poderá não conter atualizações recentes.',
'readonly' => 'Banco de dados disponível no modo "somente leitura"',
'enterlockreason' => 'Entre com um motivo para trancá-lo, incluindo uma estimativa de quando poderá novamente ser destrancado',
@@ -688,6 +697,7 @@ Anote a URL e reporte o ocorrido a um [[Special:ListUsers/sysop|administrador]].
'cannotdelete-title' => 'Não é possível excluir a página " $1 "',
'delete-hook-aborted' => 'A eliminação foi cancelada por um "hook".
Não foi dada nenhuma explicação.',
+'no-null-revision' => 'Não foi possível criar nova revisão nula para a página "$1"',
'badtitle' => 'Título inválido',
'badtitletext' => 'O título de página solicitado era inválido, vazio, ou um link interlínguas ou interwikis incorreto.
Talvez contenha um ou mais caracteres que não podem ser usados em títulos.',
@@ -711,12 +721,15 @@ Para adicionar ou alterar traduções em todos os wikis, utilize o [//translatew
'editinginterface' => "'''Aviso:''' Você se encontra prestes a editar uma página que é utilizada para fornecer texto de interface ao software.
Alterações nesta página irão afetar a aparência da interface de usuário para outros usuários deste wiki.
Para alterar ou adicionar traduções, considere utilizar a [//translatewiki.net/wiki/Main_Page?setlang=pt-br translatewiki.net], um projeto destinado para a tradução do MediaWiki.",
-'sqlhidden' => '(Consulta SQL em segundo-plano)',
'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 "proteção progressiva" ativada):
$2',
'namespaceprotected' => "Você não possui permissão para editar páginas no espaço nominal '''$1'''.",
'customcssprotected' => 'Você não tem permissão para editar esta página CSS, porque ele contém configurações pessoais de outro usuário.',
'customjsprotected' => 'Você não tem permissão para editar esta página de JavaScript, porque ele contém configurações pessoais de outro usuário.',
+'mycustomcssprotected' => 'Você não tem permissão para editar esta página CSS',
+'mycustomjsprotected' => 'Você não tem permissão para editar esta página JavaScript',
+'myprivateinfoprotected' => 'Você não tem permissão para editar suas informações privadas.',
+'mypreferencesprotected' => 'Você não tem permissão para editar suas preferências.',
'ns-specialprotected' => 'Não é possível editar páginas especiais',
'titleprotected' => "Este título foi protegido, para que não seja criado.
Quem o protegeu foi [[User:$1|$1]], com a justificativa: ''$2''.",
@@ -741,10 +754,19 @@ Note que algumas páginas podem continuar sendo exibidas como se você ainda est
'welcomecreation-msg' => 'A sua conta foi criada.
Não se esqueça de personalizar as suas [[Special:Preferences|preferências no wiki {{SITENAME}}]].',
'yourname' => 'Nome de usuário:',
+'userlogin-yourname' => 'Nome de usuário',
+'userlogin-yourname-ph' => 'Escreva seu nome de usuário',
+'createacct-another-username-ph' => 'Forneça o nome de usuário',
'yourpassword' => 'Senha:',
+'userlogin-yourpassword' => 'Senha',
+'userlogin-yourpassword-ph' => 'Digite sua senha',
+'createacct-yourpassword-ph' => 'Digite uma senha',
'yourpasswordagain' => 'Redigite sua senha',
+'createacct-yourpasswordagain' => 'Confirmar senha',
+'createacct-yourpasswordagain-ph' => 'Digite a senha novamente',
'remembermypassword' => 'Lembrar meu login neste navegador (por no máximo $1 {{PLURAL:$1|dia|dias}})',
-'securelogin-stick-https' => 'Permanecer conectado ao HTTPS após a autenticação',
+'userlogin-remembermypassword' => 'Mantenha-me conectado',
+'userlogin-signwithsecure' => 'Use a conexão segura',
'yourdomainname' => 'Seu domínio:',
'password-change-forbidden' => 'Você não pode alterar senhas nessa wiki.',
'externaldberror' => 'Ocorreu ou um erro no banco de dados durante a autenticação ou não lhe é permitido atualizar a sua conta externa.',
@@ -756,18 +778,43 @@ Não se esqueça de personalizar as suas [[Special:Preferences|preferências no
'logout' => 'Sair',
'userlogout' => 'Sair',
'notloggedin' => 'Não autenticado',
+'userlogin-noaccount' => 'Não possui uma conta?',
+'userlogin-joinproject' => 'Junte-se ao projeto {{SITENAME}}',
'nologin' => 'Não possui uma conta? $1.',
'nologinlink' => 'Criar uma conta',
'createaccount' => 'Criar conta',
'gotaccount' => "Já possui uma conta? '''$1'''.",
'gotaccountlink' => 'Autenticar-se',
'userlogin-resetlink' => 'Esqueceu-se do seu nome de usuário ou da senha?',
+'userlogin-resetpassword-link' => 'Troque sua senha',
+'helplogin-url' => 'Help:Iniciar sessão',
+'userlogin-helplink' => '[[{{MediaWiki:helplogin-url}}|Ajuda para iniciar sessão]]',
+'userlogin-loggedin' => 'Você já está conectado como {{GENDER:$1|$1}}.
+Use o formulário abaixo para iniciar sessão como outro usuário.',
+'createacct-join' => 'Insira suas informações abaixo.',
+'createacct-another-join' => 'Preeencha as informações para a nova conta',
+'createacct-emailrequired' => 'Endereço de e-mail',
+'createacct-emailoptional' => 'Endereço de e-mail (opcional)',
+'createacct-email-ph' => 'Confirme seu endereço de e-mail',
+'createacct-another-email-ph' => 'Forneça o endereço de e-mail',
'createaccountmail' => 'Usar uma senha aleatória e temporária que será enviada ao endereço de e-mail especificado a seguir',
+'createacct-realname' => 'Nome real (opcional)',
'createaccountreason' => 'Motivo:',
+'createacct-reason' => 'Motivo',
+'createacct-reason-ph' => 'Por que você está criando outra conta',
+'createacct-captcha' => 'Verificação de segurança',
+'createacct-imgcaptcha-ph' => 'Digite o texto acima',
+'createacct-submit' => 'Crie sua conta',
+'createacct-another-submit' => 'Criar outra conta',
+'createacct-benefit-heading' => '{{SITENAME}} é feita por pessoas como você.',
+'createacct-benefit-body1' => '{{PLURAL:$1|edição|edições}}',
+'createacct-benefit-body2' => '{{PLURAL:$1|página|páginas}}',
+'createacct-benefit-body3' => '{{PLURAL:$1|contribuidor|contribuidores}} recentes',
'badretype' => 'As senhas que você digitou não são iguais.',
'userexists' => 'O nome de usuário fornecido já está em uso.
Escolha um nome diferente.',
'loginerror' => 'Erro de autenticação',
+'createacct-error' => 'Erro ao criar a conta',
'createaccounterror' => 'Não foi possível criar a conta: $1',
'nocookiesnew' => "A conta do usuário foi criada, mas você não foi autenticado.
{{SITENAME}} utiliza ''cookies'' para autenticar os usuários.
@@ -824,11 +871,13 @@ Você deve se autenticar e alterar sua senha.
Ignore esta mensagem caso a conta tenha sido criada por engano.',
'usernamehasherror' => 'Nome de usuário não pode conter o símbolo de cardinal (#).',
-'login-throttled' => 'Você fez tentativas demais de se autenticar com esta conta recentemente.
-Por favor aguarde antes de tentar novamente.',
+'login-throttled' => 'Você recentemente tentou iniciar sessão muitas vezes.
+Por favor aguarde $1 antes de tentar novamente.',
'login-abort-generic' => 'A sua autenticação não teve êxito - Abortada',
'loginlanguagelabel' => 'Idioma: $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.',
+'createacct-another-realname-tip' => 'O nome verdadeiro é opcional.
+Se você optar por fornecê-lo, este nome será utilizado para dar ao usuário a atribuição de seu trabalho.',
# Email sending
'php-mail-error-unknown' => 'Erro desconhecido na função mail() do PHP',
@@ -844,8 +893,7 @@ Por favor aguarde antes de tentar novamente.',
'newpassword' => 'Nova senha',
'retypenew' => 'Reintroduza a nova senha',
'resetpass_submit' => 'Definir senha e entrar',
-'resetpass_success' => 'Sua senha foi alterada com sucesso!
-Conectando-o...',
+'changepassword-success' => 'Sua senha foi alterada com sucesso!',
'resetpass_forbidden' => 'As senhas não podem ser alteradas',
'resetpass-no-info' => 'Você precisa estar autenticado para acessar esta página diretamente.',
'resetpass-submit-loggedin' => 'Alterar senha',
@@ -857,10 +905,11 @@ Você pode já ter alterado com sucesso a sua senha, ou solicitado uma nova senh
# Special:PasswordReset
'passwordreset' => 'Redefinir senha',
-'passwordreset-text' => 'Preencha este formulário para recuperar os dados da sua conta pelo e-mail.',
+'passwordreset-text-one' => 'Complete este formulário para trocar sua senha.',
+'passwordreset-text-many' => '{{PLURAL:$1|Preencha um dos campos para trocar sua senha.}}',
'passwordreset-legend' => 'Reiniciar a senha',
'passwordreset-disabled' => 'Redefinições de senha foram desabilitadas nesta wiki.',
-'passwordreset-pretext' => '{{PLURAL:$1||Introduza um dos dados abaixo}}',
+'passwordreset-emaildisabled' => 'Os recursos de e-mail foram desativados nesta wiki.',
'passwordreset-username' => 'Nome de usuário:',
'passwordreset-domain' => 'Domínio:',
'passwordreset-capture' => 'Ver o e-mail resultante?',
@@ -887,7 +936,7 @@ $2
Senha temporária: $2',
'passwordreset-emailsent' => 'Foi enviado um e-mail de lembrete.',
'passwordreset-emailsent-capture' => 'Foi enviado um e-mail de lembrete, que é mostrado abaixo.',
-'passwordreset-emailerror-capture' => 'Foi gerado o lembrete de e-mail mostrado abaixo, contudo falhou o envio para o usuário: $1',
+'passwordreset-emailerror-capture' => 'Foi gerado um e-mail de recuperação da senha, conforme mostrado abaixo, mas o envio {{GENDER:$2|ao usuário|à usuária}} falhou. $1',
# Special:ChangeEmail
'changeemail' => 'Alterar o endereço de e-mail',
@@ -901,6 +950,18 @@ Senha temporária: $2',
'changeemail-submit' => 'Alterar e-mail',
'changeemail-cancel' => 'Cancelar',
+# Special:ResetTokens
+'resettokens' => 'Reiniciar os tokens',
+'resettokens-text' => 'Você pode reiniciar os tokens, que permitem o acesso a certos dados privados associados à sua conta, aqui.
+
+Você só deve reiniciá-los se compartilhou-os com alguém ou se a sua conta foi comprometida.',
+'resettokens-no-tokens' => 'Não existem tokens para reiniciar.',
+'resettokens-legend' => 'Reiniciar tokens',
+'resettokens-token-label' => '$1 (valor atual: $2)',
+'resettokens-watchlist-token' => 'Tokens para o feed da web (Atom/RSS) das [[Special:Watchlist|mudanças de páginas em sua lista de páginas vigiadas]]',
+'resettokens-done' => 'Tokens reiniciados.',
+'resettokens-resetbutton' => 'Reiniciar tokens selecionados',
+
# Edit page toolbar
'bold_sample' => 'Texto em negrito',
'bold_tip' => 'Texto em negrito',
@@ -1101,12 +1162,15 @@ Ele não deu nenhuma explicação.",
Ela parece ter sido eliminada.',
'edit-conflict' => 'Conflito de edição.',
'edit-no-change' => 'A sua edição foi ignorada, uma vez que o texto não sofreu alterações.',
+'postedit-confirmation' => 'Sua edição foi salva',
'edit-already-exists' => 'Não foi possível criar uma nova página.
Ela já existia.',
'defaultmessagetext' => 'Texto da mensagem padrão',
'content-failed-to-parse' => 'Falha ao analisar o conteúdo $2 para o modelo $1: $3',
'invalid-content-data' => 'Dados de conteúdo inválidos',
'content-not-allowed-here' => 'Conteúdo do tipo "$1" não é permitido na página [[$2]]',
+'editwarning-warning' => 'Abandonar esta página pode fazer com que você perca todas as alterações que fez.
+Se você estiver autenticado, você pode desabilitar este aviso na seção "Edição" de suas preferências.',
# Content models
'content-model-wikitext' => 'wikitexto',
@@ -1141,6 +1205,7 @@ Estes argumentos foram omitidos.',
'undo-failure' => 'A edição não pôde ser desfeita devido a alterações intermediárias conflitantes.',
'undo-norev' => 'A edição não pôde ser desfeita porque não existe ou foi apagada.',
'undo-summary' => 'Desfeita a edição $1 de [[Special:Contributions/$2|$2]] ([[User talk:$2|Discussão]])',
+'undo-summary-username-hidden' => 'Desfazer a revisão $1 de um usuário oculto',
# Account creation failure
'cantcreateaccounttitle' => 'Não é possível criar uma conta',
@@ -1319,6 +1384,7 @@ Certifique-se de que tal alteração manterá a continuidade das ações.',
'compareselectedversions' => 'Comparar as versões selecionadas',
'showhideselectedversions' => 'Exibir/ocultar edições selecionadas',
'editundo' => 'desfazer',
+'diff-empty' => '(Sem diferença)',
'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}})',
'difference-missing-revision' => '{{PLURAL:$2|Uma revisão|$2 revisões}} desta diferença ($1) não {{PLURAL:$2|foi encontrada|foram encontradas}}.
@@ -1346,7 +1412,6 @@ Os detalhes podem ser encontrados no [{{fullurl:{{#Special:Log}}/delete|page={{F
'searchmenu-legend' => 'Opções de pesquisa',
'searchmenu-exists' => "'''Há uma página com o nome \"[[:\$1]]\" nesta wiki'''",
'searchmenu-new' => "'''Criar a página \"[[:\$1|\$1]]\" nesta wiki!'''",
-'searchhelp-url' => 'Help:Conteúdos',
'searchmenu-prefix' => '[[Special:PrefixIndex/$1|Navegue pelas páginas com este prefixo]]',
'searchprofile-articles' => 'Páginas de conteúdo',
'searchprofile-project' => 'Ajuda e páginas de projeto',
@@ -1390,15 +1455,7 @@ Tente utilizar o prefixo ''all:'' em sua busca, para pesquisar por todos os cont
'searchdisabled' => 'A busca em {{SITENAME}} se encontra desativada.
Você poderá pesquisar através do Google enquanto isso.
Note que os índices do sistema de busca externo poderão conter referências desatualizadas a {{SITENAME}}.',
-
-# Quickbar
-'qbsettings' => 'Configurações da Barra Rápida',
-'qbsettings-none' => 'Nenhuma',
-'qbsettings-fixedleft' => 'Fixo à esquerda',
-'qbsettings-fixedright' => 'Fixo à direita',
-'qbsettings-floatingleft' => 'Flutuando à esquerda',
-'qbsettings-floatingright' => 'Flutuando à direita',
-'qbsettings-directionality' => 'Fixado, dependendo da direcionalidade do seu alfabeto e da sua língua',
+'search-error' => 'Ocorreu um erro ao buscar por: $1',
# Preferences page
'preferences' => 'Preferências',
@@ -1432,7 +1489,6 @@ Note que os índices do sistema de busca externo poderão conter referências de
'resetprefs' => 'Eliminar as alterações não-salvas',
'restoreprefs' => 'Restaurar todas as configurações padrão (em todas as seções)',
'prefs-editing' => 'Opções de edição',
-'prefs-edit-boxsize' => 'Tamanho da janela de edição.',
'rows' => 'Linhas:',
'columns' => 'Colunas:',
'searchresultshead' => 'Pesquisar',
@@ -1443,9 +1499,9 @@ Note que os índices do sistema de busca externo poderão conter referências de
'recentchangesdays-max' => '(máximo: $1 {{PLURAL:$1|dia|dias}})',
'recentchangescount' => 'Número de edições a serem exibidas por padrão:',
'prefs-help-recentchangescount' => 'Isto inclui mudanças recentes, histórico de páginas e registros.',
-'prefs-help-watchlist-token' => "O preenchimento deste campo com uma senha secreta irá gerar um ''feed'' RSS para a sua lista de páginas vigiadas.
-Qualquer um que conheça a senha deste campo será capaz de ler sua lista de páginas vigiadas, então escolha um valor seguro.
-Eis um valor gerado aleatoriamente que você pode usar: $1",
+'prefs-help-watchlist-token2' => 'Esta é a senha secreta para o feed da Web com sua lista de tokens vigiados.
+Qualquer pessoa que descobrir esta senha será capaz de ler sua lista, então não a compartilhe.
+[[Special:ResetTokens|Clique aqui para redefini-la]].',
'savedprefs' => 'As suas preferências foram salvas.',
'timezonelegend' => 'Fuso horário:',
'localtime' => 'Horário local:',
@@ -1476,7 +1532,6 @@ Eis um valor gerado aleatoriamente que você pode usar: $1",
'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:',
-'prefs-textboxsize' => 'Tamanho da janela de edição',
'youremail' => 'Seu e-mail:',
'username' => 'Nome de {{GENDER:$1|usuário|usuária}}:',
'uid' => 'ID de {{GENDER:$1|usuário|usuária}}:',
@@ -1510,6 +1565,7 @@ Caso decida fornecê-lo, este será utilizado para dar-lhe crédito pelo seu tra
'prefs-dateformat' => 'Formato de data',
'prefs-timeoffset' => 'Desvio horário',
'prefs-advancedediting' => 'Opções gerais',
+'prefs-preview' => 'Pré-visualizar',
'prefs-advancedrc' => 'Opções avançadas',
'prefs-advancedrendering' => 'Opções avançadas',
'prefs-advancedsearchoptions' => 'Opções avançadas',
@@ -1517,7 +1573,9 @@ Caso decida fornecê-lo, este será utilizado para dar-lhe crédito pelo seu tra
'prefs-displayrc' => 'Opções de exibição',
'prefs-displaysearchoptions' => 'Opções de exibição',
'prefs-displaywatchlist' => 'Opções de exibição',
+'prefs-tokenwatchlist' => 'Senha',
'prefs-diffs' => 'Diferenças',
+'prefs-help-prefershttps' => 'Esta preferência terá efeito no seu próximo início de sessão.',
# User preference: email validation using jQuery
'email-address-validity-valid' => 'Parece válido',
@@ -1544,6 +1602,8 @@ Caso decida fornecê-lo, este será utilizado para dar-lhe crédito pelo seu tra
'userrights-notallowed' => 'Você não tem permissão para adicionar ou remover privilégios a usuários.',
'userrights-changeable-col' => 'Grupos que pode alterar',
'userrights-unchangeable-col' => 'Grupos que não pode alterar',
+'userrights-conflict' => 'Há um comflito de permissões de usuário! Por favor, revise e confirme as alterações novamente.',
+'userrights-removed-self' => 'Você removeu com sucesso seus direitos de usuário. Como tal, você agora está impossibilitado de acessar esta página.',
# Groups
'group' => 'Grupo:',
@@ -1609,11 +1669,19 @@ Caso decida fornecê-lo, este será utilizado para dar-lhe crédito pelo seu tra
'right-proxyunbannable' => 'Contornar bloqueios automáticos de proxies',
'right-unblockself' => 'Desbloquear a si mesmo',
'right-protect' => 'Mudar níveis de proteção e editar páginas protegidas em cascata',
-'right-editprotected' => 'Editar páginas protegidas (sem proteção em cascata)',
+'right-editprotected' => 'Editar páginas protegidas como "{{int:protect-level-sysop}}"',
+'right-editsemiprotected' => 'Editar páginas protegidas como "{{int:protect-level-autoconfirmed}}"',
'right-editinterface' => 'Editar a interface de usuário',
'right-editusercssjs' => 'Editar os arquivos CSS e JS de outros usuários',
'right-editusercss' => 'Editar os arquivos CSS de outros usuários',
'right-edituserjs' => 'Editar os arquivos JS de outros usuários',
+'right-editmyusercss' => 'Edite seu próprio arquivo CSS de usuário',
+'right-editmyuserjs' => 'Edite seu próprio arquivo JavaScript de usuário',
+'right-viewmywatchlist' => 'Ver sua lista de vigiados',
+'right-editmywatchlist' => 'Editar sua lista de vigiados. Observe que algumas ações seguirão adicionando páginas, mesmo sem este direito.',
+'right-viewmyprivateinfo' => 'Ver seus próprios dados privados (por exemplo: endereço de e-mail, nome real)',
+'right-editmyprivateinfo' => 'Editar seus próprios dados privados (exemplo: endereço de e-mail, nome real)',
+'right-editmyoptions' => 'Modifique suas preferências.',
'right-rollback' => 'Reverter rapidamente o último usuário que editou uma página em particular',
'right-markbotedits' => 'Marcar edições revertidas como edições de bot',
'right-noratelimit' => 'Não afetado pelos limites de velocidade de operação',
@@ -1675,12 +1743,19 @@ Caso decida fornecê-lo, este será utilizado para dar-lhe crédito pelo seu tra
'action-userrights-interwiki' => 'editar privilégios de usuários de outros wikis',
'action-siteadmin' => 'bloquear ou desbloquear o banco de dados',
'action-sendemail' => 'enviar e-mails',
+'action-editmywatchlist' => 'modifique sua lista de páginas vigiadas',
+'action-viewmywatchlist' => 'veja sua lista de páginas vigiadas',
+'action-viewmyprivateinfo' => 'veja suas informações privadas',
+'action-editmyprivateinfo' => 'modifique suas informações privadas',
# Recent changes
'nchanges' => '$1 {{PLURAL:$1|alteração|alterações}}',
+'enhancedrc-since-last-visit' => '$1 {{PLURAL:$1|desde a última visita}}',
+'enhancedrc-history' => 'histórico',
'recentchanges' => 'Mudanças recentes',
'recentchanges-legend' => 'Opções das mudanças recentes',
'recentchanges-summary' => 'Acompanhe nesta página as mudanças mais recentes deste wiki.',
+'recentchanges-noresult' => 'Nenhuma alteração correspondente a esses critérios foi realizada durante o período selecionado.',
'recentchanges-feed-description' => 'Acompanhe neste feed as mudanças mais recentes do wiki.',
'recentchanges-label-newpage' => 'Esta edição criou uma nova página',
'recentchanges-label-minor' => 'Esta é uma edição menor',
@@ -1717,7 +1792,6 @@ Caso decida fornecê-lo, este será utilizado para dar-lhe crédito pelo seu tra
'recentchangeslinked-feed' => 'Alterações relacionadas',
'recentchangeslinked-toolbox' => 'Alterações relacionadas',
'recentchangeslinked-title' => 'Alterações relacionadas com "$1"',
-'recentchangeslinked-noresult' => 'Nenhuma mudança nas páginas relacionadas durante o período.',
'recentchangeslinked-summary' => "Esta página lista alterações feitas recentemente em páginas com links a uma em específico (ou de membros de uma categoria especificada).
Páginas de sua [[Special:Watchlist|lista de páginas vigiadas]] são exibidas em '''negrito'''.",
'recentchangeslinked-page' => 'Nome da página:',
@@ -1729,7 +1803,7 @@ Páginas de sua [[Special:Watchlist|lista de páginas vigiadas]] são exibidas e
'reuploaddesc' => 'Cancelar o envio e retornar ao formulário de upload',
'upload-tryagain' => 'Enviar descrição de arquivo modificada',
'uploadnologin' => 'Não autenticado',
-'uploadnologintext' => 'É necessário estar [[Special:UserLogin|autenticado]] para enviar arquivos.',
+'uploadnologintext' => 'Você precisa $1 para enviar arquivos.',
'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 upload ($1) não tem permissões de escrita para o servidor.',
'uploaderror' => 'Erro ao enviar arquivo',
@@ -1969,7 +2043,6 @@ Para melhor segurança, o img_auth.php está desativado.',
'http-read-error' => 'Erro de leitura HTTP.',
'http-timed-out' => 'Esgotado o tempo de espera da requisição HTTP.',
'http-curl-error' => 'Erro ao requisitar a URL: $1',
-'http-host-unreachable' => 'Não foi possível atingir a URL.',
'http-bad-status' => 'Ocorreu um problema durante a requisição HTTP: $1 $2',
# Some likely curl errors. More could be added from <http://curl.haxx.se/libcurl/c/libcurl-errors.html>
@@ -1997,6 +2070,10 @@ Para melhor segurança, o img_auth.php está desativado.',
'listfiles_size' => 'Tamanho',
'listfiles_description' => 'Descrição',
'listfiles_count' => 'Versões',
+'listfiles-show-all' => 'Incluir versões antigas das imagens',
+'listfiles-latestversion' => 'Versão atual',
+'listfiles-latestversion-yes' => 'Sim',
+'listfiles-latestversion-no' => 'Não',
# File description page
'file-anchor-link' => 'Arquivo',
@@ -2092,6 +2169,13 @@ Talvez você deseje editar a descrição na sua [$2 página de descrição de ar
'randompage' => 'Página aleatória',
'randompage-nopages' => 'Não há páginas {{PLURAL:$2|no seguinte espaço nominal|nos seguintes espaços nominais}}: $1.',
+# Random page in category
+'randomincategory' => 'Página aleatória na categoria',
+'randomincategory-invalidcategory' => '"$1" não é um nome de categoria válido.',
+'randomincategory-nopages' => 'Não há paginas em [[:Category:$1]].',
+'randomincategory-selectcategory' => 'Obter página aleatória da categoria: $1 $2.',
+'randomincategory-selectcategory-submit' => 'Avançar',
+
# Random redirect
'randomredirect' => 'Redirecionamento aleatório',
'randomredirect-nopages' => 'Não há redirecionamentos no espaço nominal "$1".',
@@ -2117,12 +2201,6 @@ Talvez você deseje editar a descrição na sua [$2 página de descrição de ar
'statistics-users-active-desc' => 'Usuários que efetuaram uma ação {{PLURAL:$1|no último dia|nos últimos $1 dias}}',
'statistics-mostpopular' => 'Páginas mais visitadas',
-'disambiguations' => 'Páginas com links para páginas de desambiguação',
-'disambiguationspage' => 'Template:disambig',
-'disambiguations-text' => "As páginas a seguir possuem pelo menos um link para uma '''página de desambiguação'''.
-Talvez fosse melhor que possuissem links para uma página mais específica.</br>
-Uma página é considerada como de desambiguação se utilizar uma predefinição que esteja definida em [[MediaWiki:Disambiguationspage]].",
-
'pageswithprop' => 'Páginas com uma propriedade de página',
'pageswithprop-legend' => 'Páginas com uma propriedade de página',
'pageswithprop-text' => 'Esta página lista as páginas que usam uma determinada propriedade de página.',
@@ -2185,6 +2263,7 @@ Entradas <del>riscadas</del> foram resolvidas.',
'mostrevisions' => 'Páginas de conteúdo com mais revisões',
'prefixindex' => 'Todas as páginas com prefixo',
'prefixindex-namespace' => 'Todas as páginas com prefixo (espaço nominal $1)',
+'prefixindex-strip' => 'Remover prefixo',
'shortpages' => 'Páginas curtas',
'longpages' => 'Páginas longas',
'deadendpages' => 'Páginas sem saída',
@@ -2200,6 +2279,7 @@ Entradas <del>riscadas</del> foram resolvidas.',
'listusers' => 'Lista de usuários',
'listusers-editsonly' => 'Mostrar apenas usuários com edições',
'listusers-creationsort' => 'Ordenar por data de criação',
+'listusers-desc' => 'Listar em ordem decrescente',
'usereditcount' => '$1 {{PLURAL:$1|edição|edições}}',
'usercreated' => '{{GENDER:$3|Criado|Criada}} em $1 às $2',
'newpages' => 'Páginas novas',
@@ -2376,10 +2456,9 @@ Futuras modificações em tal página e páginas de discussão relacionadas serÃ
'unwatchthispage' => 'Parar de vigiar esta página',
'notanarticle' => 'Não é uma página de conteúdo',
'notvisiblerev' => 'Edição eliminada',
-'watchnochange' => 'Nenhuma das páginas vigiadas foi editada no período exibido.',
'watchlist-details' => '{{PLURAL:$1|$1 página|$1 páginas}} na sua lista de páginas vigiadas, excluindo páginas de discussão.',
-'wlheader-enotif' => '* A notificação por email encontra-se ativada.',
-'wlheader-showupdated' => "* As páginas modificadas desde a sua última visita são mostradas em '''negrito'''",
+'wlheader-enotif' => 'A notificação por email encontra-se ativada.',
+'wlheader-showupdated' => "Páginas modificadas desde a sua última visita são mostradas em '''negrito'''",
'watchmethod-recent' => 'verificando edições recentes para as páginas vigiadas',
'watchmethod-list' => 'verificando páginas vigiadas para edições recentes',
'watchlistcontains' => 'Sua lista de páginas vigiadas contém $1 {{PLURAL:$1|página|páginas}}.',
@@ -2628,7 +2707,7 @@ $1',
'contributions' => 'Contribuições {{GENDER:$1|do usuário|da usuária}}',
'contributions-title' => 'Contribuições {{GENDER:$1|do usuário|da usuária}} $1',
'mycontris' => 'Contribuições',
-'contribsub2' => 'Para $1 ($2)',
+'contribsub2' => 'Para {{GENDER:$3|$1}} ($2)',
'nocontribs' => 'Não foram encontradas mudanças com este critério.',
'uctop' => '(atual)',
'month' => 'Mês (inclusive anteriores):',
@@ -2783,13 +2862,11 @@ Consulte a [[Special:BlockList|lista de bloqueios]] para obter a lista de bloque
'ipb_blocked_as_range' => 'Erro: O IP $1 não se encontra bloqueado de forma direta, não podendo ser desbloqueado deste modo. Se encontra bloqueado como parte do "range" $2, o qual pode ser desbloqueado.',
'ip_range_invalid' => 'Gama de IPs inválida.',
'ip_range_toolarge' => 'Intervalos de bloqueio maiores do que /$1 não são permitidos',
-'blockme' => 'Bloquear-me',
'proxyblocker' => 'Bloqueador de proxy',
-'proxyblocker-disabled' => 'Esta função está desabilitada.',
'proxyblockreason' => 'O seu endereço de IP foi bloqueado por ser um proxy público. Por favor contacte o seu fornecedor do serviço de Internet ou o apoio técnico e informe-os deste problema de segurança grave.',
-'proxyblocksuccess' => 'Concluído.',
'sorbsreason' => 'O seu endereço IP encontra-se listado como proxy aberto pela DNSBL utilizada por {{SITENAME}}.',
'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',
+'xffblockreason' => 'Um endereço IP presente no cabeçalho X-Forwarded-For, seu ou do servidor proxy que está usando, foi bloqueado. O motivo original do bloqueio foi: $1',
'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',
@@ -2951,6 +3028,7 @@ Acesse [//www.mediawiki.org/wiki/Localisation MediaWiki Localisation] e [//trans
'thumbnail-more' => 'Ampliar',
'filemissing' => 'arquivo não encontrado',
'thumbnail_error' => 'Erro ao criar miniatura: $1',
+'thumbnail_error_remote' => 'Mensagem de erro para $1, $2',
'djvu_page_error' => 'página DjVu inacessível',
'djvu_no_xml' => 'Não foi possível acessar o XML do arquivo DjVU',
'thumbnail-temp-create' => 'Não foi possível criar o arquivo temporário de miniatura',
@@ -3101,18 +3179,12 @@ Permite colocar uma justificativa no sumário da edição.',
# Stylesheets
'common.css' => '/** o código CSS colocado aqui será aplicado a todos os temas */',
-'nostalgia.css' => '/* O CSS colocado aqui terá efeito nos usuários do tema Nostalgia */',
'monobook.css' => '/* o código CSS colocado aqui terá efeito nos usuários do tema Monobook */',
# Scripts
'common.js' => '/* Códigos JavaScript aqui colocados serão carregados por todos aqueles que acessarem alguma página deste wiki */',
-'standard.js' => '/* Qualquer JavaScript aqui colocado afetará os usuários do skin Clássico */',
-'nostalgia.js' => '/* Qualquer JavaScript aqui colocado afetará os usuários do skin Nostalgia */',
'cologneblue.js' => '/* Qualquer JavaScript aqui colocado afetará os usuários do skin Azul colonial */',
'monobook.js' => '/* Qualquer JavaScript aqui colocado afetará os usuários do skin MonoBook */',
-'myskin.js' => '/* Qualquer JavaScript aqui colocado afetará os usuários do skin MySkin */',
-'chick.js' => '/* Qualquer JavaScript aqui colocado afetará os usuários do skin Chique */',
-'simple.js' => '/* Qualquer JavaScript aqui colocado afetará os usuários do skin Simples */',
'modern.js' => '/* Qualquer JavaScript aqui colocado afetará os usuários do skin Moderno */',
'vector.js' => '/* Qualquer JavaScript aqui colocado afetará os usuários do skin Vector */',
@@ -3188,13 +3260,8 @@ Tal bloqueio foi provavelmente causado por uma ligação para um ''website'' ext
'pageinfo-category-files' => 'Número de arquivos',
# Skin names
-'skinname-standard' => 'Clássico',
-'skinname-nostalgia' => 'Nostalgia',
'skinname-cologneblue' => 'Azul colonial',
'skinname-monobook' => 'MonoBook',
-'skinname-myskin' => 'MySkin',
-'skinname-chick' => 'Chique',
-'skinname-simple' => 'Simples',
'skinname-modern' => 'Moderno',
# Patrolling
@@ -3272,11 +3339,25 @@ Executá-lo poderá comprometer a segurança do seu sistema.",
'minutes' => '{{PLURAL:$1|um minuto|$1 minutos}}',
'hours' => '{{PLURAL:$1|uma hora|$1 horas}}',
'days' => '{{PLURAL:$1|um dia|$1 dias}}',
+'weeks' => '{{PLURAL:$1|$1 semana|$1 semanas}}',
'months' => '{{PLURAL:$1|$1 mês|$1 meses}}',
'years' => '{{PLURAL:$1|$1 ano|$1 anos}}',
'ago' => '$1 atrás',
'just-now' => 'agora mesmo',
+# Human-readable timestamps
+'hours-ago' => '$1 {{PLURAL:$1|hora|horas}} atrás',
+'minutes-ago' => '$1 {{PLURAL:$1|minuto|minutos}} atrás',
+'seconds-ago' => '$1 {{PLURAL:$1|segundo|segundos}} atrás',
+'monday-at' => 'Segunda-feira às $1',
+'tuesday-at' => 'Terça-feira às $1',
+'wednesday-at' => 'Quarta-feira às $1',
+'thursday-at' => 'Quinta-feira às $1',
+'friday-at' => 'Sexta-feira às $1',
+'saturday-at' => 'Sábado às $1',
+'sunday-at' => 'Domingo às $1',
+'yesterday-at' => 'Ontem às $1',
+
# Bad image list
'bad_image_list' => 'O formato é o seguinte:
@@ -3306,7 +3387,7 @@ Por padrão, outros campos estarão ocultos.
* gpslongitude
* gpsaltitude',
-# EXIF tags
+# Exif tags
'exif-imagewidth' => 'Largura',
'exif-imagelength' => 'Altura',
'exif-bitspersample' => 'Bits por componente',
@@ -3484,7 +3565,7 @@ Por padrão, outros campos estarão ocultos.
'exif-originalimageheight' => 'Altura da imagem antes de ser cortada',
'exif-originalimagewidth' => 'Largura da imagem antes de ser cortada',
-# EXIF attributes
+# Exif attributes
'exif-compression-1' => 'Sem compressão',
'exif-compression-2' => 'CCITT Grupo 3 Codificação run length de Huffman modificado unidimensional',
'exif-compression-3' => 'CCITT Grupo 3 codificação de fax',
@@ -3880,7 +3961,6 @@ Você também pode [[Special:EditWatchlist|editar a lista da maneira convenciona
'version-other' => 'Diversos',
'version-mediahandlers' => 'Executores de média',
'version-hooks' => 'Hooks',
-'version-extension-functions' => 'Funções de extensão',
'version-parser-extensiontags' => 'Etiquetas de extensões de tipo "parser"',
'version-parser-function-hooks' => 'Funções "hooks" de "parser"',
'version-hook-name' => 'Nome do hook',
@@ -3889,6 +3969,7 @@ Você também pode [[Special:EditWatchlist|editar a lista da maneira convenciona
'version-license' => 'Licença',
'version-poweredby-credits' => "Este é um wiki '''[//www.mediawiki.org/ MediaWiki]''', copyright © 2001-$1 $2.",
'version-poweredby-others' => 'outros',
+'version-poweredby-translators' => 'tradutores da translatewiki.net',
'version-credits-summary' => 'Gostaríamos de agradecer às seguintes pessoas por suas contribuições no [[Special:Version|MediaWiki]]',
'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.
@@ -3902,12 +3983,17 @@ Em conjunto com este programa deve ter recebido [{{SERVER}}{{SCRIPTPATH}}/COPYIN
'version-entrypoints-header-entrypoint' => 'Ponto de entrada',
'version-entrypoints-header-url' => 'URL',
-# Special:FilePath
-'filepath' => 'Diretório do arquivo',
-'filepath-page' => 'arquivo:',
-'filepath-submit' => 'Ir',
-'filepath-summary' => 'Esta página especial retorna o endereço completo de um arquivo.
-As imagens serão exibidas em sua resolução máxima, outros tipos de arquivos serão abertos diretamente pelos programas associados.',
+# Special:Redirect
+'redirect' => 'Redirecionar por arquivo, usuário ou ID de revisão',
+'redirect-legend' => 'Redirecionar para um arquivo ou página',
+'redirect-summary' => 'Esta página especial redireciona a um arquivo (dado o nome do arquivo), a uma página (dado um ID de revisão) ou a uma página de usuário (dado o ID do usuário).',
+'redirect-submit' => 'Ir',
+'redirect-lookup' => 'Buscar',
+'redirect-value' => 'Valor:',
+'redirect-user' => 'ID do usuário',
+'redirect-revision' => 'Revisão da página',
+'redirect-file' => 'Nome do arquivo',
+'redirect-not-exists' => 'Valor não encontrado',
# Special:FileDuplicateSearch
'fileduplicatesearch' => 'Procurar por arquivos duplicados',
@@ -3956,12 +4042,16 @@ As imagens serão exibidas em sua resolução máxima, outros tipos de arquivos
'tags' => 'Etiquetas de modificação válidas',
'tag-filter' => 'Filtrar [[Special:Tags|etiquetas]]:',
'tag-filter-submit' => 'Filtrar',
+'tag-list-wrapper' => '([[Special:Tags|{{PLURAL:$1|Etiqueta|Etiquetas}}]]: $2)',
'tags-title' => 'Etiquetas',
'tags-intro' => 'Esta página lista as etiquetas com que o software poderá marcar uma edição, e o seu significado.',
'tags-tag' => 'Nome da etiqueta',
'tags-display-header' => 'Aparência nas listas de modificações',
'tags-description-header' => 'Descrição completa do significado',
+'tags-active-header' => 'Ativo?',
'tags-hitcount-header' => 'Modificações etiquetadas',
+'tags-active-yes' => 'Sim',
+'tags-active-no' => 'Não',
'tags-edit' => 'editar',
'tags-hitcount' => '$1 {{PLURAL:$1|modificação|modificações}}',
@@ -3982,6 +4072,7 @@ As imagens serão exibidas em sua resolução máxima, outros tipos de arquivos
'dberr-problems' => 'Desculpe! Este sítio está passando por dificuldades técnicas.',
'dberr-again' => 'Experimente esperar alguns minutos e atualizar.',
'dberr-info' => '(Não foi possível contactar o servidor de base de dados: $1)',
+'dberr-info-hidden' => '(Não foi possível contatar o banco de dados do servidor)',
'dberr-usegoogle' => 'Você pode tentar pesquisar no Google entretanto.',
'dberr-outofdate' => 'Note que os seus índices relativos ao nosso conteúdo podem estar desatualizados.',
'dberr-cachederror' => 'A seguinte página é uma cópia em cache da página pedida e pode não ser atual.',
@@ -3997,6 +4088,9 @@ As imagens serão exibidas em sua resolução máxima, outros tipos de arquivos
'htmlform-submit' => 'Enviar',
'htmlform-reset' => 'Desfazer alterações',
'htmlform-selectorother-other' => 'Outros',
+'htmlform-no' => 'Não',
+'htmlform-yes' => 'Sim',
+'htmlform-chosen-placeholder' => 'Selecione uma opção',
# SQLite database support
'sqlite-has-fts' => '$1 com suporte de pesquisa de texto completo',
@@ -4114,4 +4208,19 @@ Caso contrário, você poderá usar o formulário simplificado a seguir. Seu com
# Image rotation
'rotate-comment' => 'Imagem girada por $1 {{PLURAL:$1|grau|graus}} no sentido horário',
+# Limit report
+'limitreport-title' => 'Analisador de dados de perfis:',
+'limitreport-cputime' => 'Tempo de uso da CPU',
+'limitreport-cputime-value' => '$1 {{PLURAL:$1|segundo|segundos}}',
+'limitreport-walltime' => 'Tempo de uso real',
+'limitreport-walltime-value' => '$1 {{PLURAL:$1|segundo|segundos}}',
+'limitreport-ppvisitednodes' => 'Número de nós visitados pelo pré-processador',
+'limitreport-ppgeneratednodes' => 'Número de nós gerados pelo pré-processador',
+'limitreport-postexpandincludesize' => 'Tamanho de inclusão pós-expansão',
+'limitreport-postexpandincludesize-value' => '$1/$2 {{PLURAL:$2|byte|bytes}}',
+'limitreport-templateargumentsize' => 'Argumento do tamanho da predefinição',
+'limitreport-templateargumentsize-value' => '$1/$2 {{PLURAL:$2|byte|bytes}}',
+'limitreport-expansiondepth' => 'Máxima profundidade de expansão',
+'limitreport-expensivefunctioncount' => 'Conta da função expansiva do analizador',
+
);
diff --git a/languages/messages/MessagesQqq.php b/languages/messages/MessagesQqq.php
index 11c24617..cdb8a914 100644
--- a/languages/messages/MessagesQqq.php
+++ b/languages/messages/MessagesQqq.php
@@ -8,6 +8,7 @@
* @file
*
* @author *Surak*
+ * @author 127.0.0.1
* @author Abanima
* @author Ahonc
* @author Aleator
@@ -34,6 +35,7 @@
* @author Dalibor Bosits
* @author Darth Kule
* @author Deadelf
+ * @author Dekel E
* @author Dsvyas
* @author Emilkris33
* @author Erwin
@@ -81,6 +83,7 @@
* @author Mido
* @author Mihai
* @author Minh Nguyen
+ * @author Moha
* @author Mormegil
* @author Mpradeep
* @author Murma174
@@ -114,6 +117,7 @@
* @author SPQRobin
* @author Sanbec
* @author Sborsody
+ * @author Se4598
* @author Seb35
* @author Sherbrooke
* @author Shirayuki
@@ -146,6 +150,7 @@
* @author Yyy
* @author Žekřil71pl
* @author פוילישער
+ * @author គីមស៊្រុន
* @author ì•„ë¼
*/
@@ -195,9 +200,6 @@ Is only shown if {{msg-mw|tog-enotifusertalkpages}} or/and {{msg-mw|tog-enotifwa
'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. {{Gender}}',
'tog-oldsig' => 'Used in [[Special:Preferences]], tab User profile. {{Gender}}',
'tog-fancysig' => 'In user preferences under the signature box. {{Gender}}',
-'tog-externaleditor' => "[[Special:Preferences]], tab 'Edit'. Offers user to use an external editor by default. {{Gender}}",
-'tog-externaldiff' => "[[Special:Preferences]], tab 'Edit'. Offers user to use an external diff program by default. {{Gender}}",
-'tog-showjumplinks' => 'Toggle option used in [[Special:Preferences]]. The "jump to" part should be the same with {{msg-mw|jumpto}} (or you can use <nowiki>{{int:jumpto}}</nowiki>). These links are shown in some of the older skins as "jump to: navigation, search" but they are hidden by default (you can enable them with this option). {{Gender}}',
'tog-uselivepreview' => '{{Gender}}
Toggle option used in [[Special:Preferences]].
@@ -217,6 +219,8 @@ Live preview is an experimental feature (unavailable by default) to use edit pre
''(the message is considered optional because it is only used in wikis with language variants)''",
'tog-norollbackdiff' => "Option in [[Special:Preferences]], 'Misc' tab. Only shown for users with the rollback right. By default a diff is shown below the return screen of a rollback. Checking this preference toggle will suppress that. {{Gender}}
{{Identical|Rollback}}",
+'tog-useeditwarning' => 'Used as label for the checkbox in [[Special:Preferences#mw-prefsection-editing|Special:Preferences]].',
+'tog-prefershttps' => 'Toggle option used in [[Special:Preferences]] that indicates if the user wants to use a secure connection when logged in',
'underline-always' => 'Used in [[Special:Preferences#mw-prefsection-rendering|Preferences]].
@@ -348,6 +352,18 @@ One of the set: {{msg-mw|Jan}}, {{msg-mw|Feb}}, {{msg-mw|Mar}}, {{msg-mw|Apr}},
'dec' => 'Abbreviation of December, the twelfth month of the Gregorian calendar
One of the set: {{msg-mw|Jan}}, {{msg-mw|Feb}}, {{msg-mw|Mar}}, {{msg-mw|Apr}}, {{msg-mw|May}}, {{msg-mw|Jun}}, {{msg-mw|Jul}}, {{msg-mw|Aug}}, {{msg-mw|Sep}}, {{msg-mw|Oct}}, {{msg-mw|Nov}}, {{msg-mw|Dec}}.',
+'january-date' => 'A date in the Gregorian month of January. $1 is the numerical date, for example "23".',
+'february-date' => 'A date in the Gregorian month of February. $1 is the numerical date, for example "23".',
+'march-date' => 'A date in the Gregorian month of March. $1 is the numerical date, for example "23".',
+'april-date' => 'A date in the Gregorian month of April. $1 is the numerical date, for example "23".',
+'may-date' => 'A date in the Gregorian month of May. $1 is the numerical date, for example "23". The month name is not abbreviated.',
+'june-date' => 'A date in the Gregorian month of June. $1 is the numerical date, for example "23".',
+'july-date' => 'A date in the Gregorian month of July. $1 is the numerical date, for example "23".',
+'august-date' => 'A date in the Gregorian month of August. $1 is the numerical date, for example "23".',
+'september-date' => 'A date in the Gregorian month of September. $1 is the numerical date, for example "23".',
+'october-date' => 'A date in the Gregorian month of October. $1 is the numerical date, for example "23".',
+'november-date' => 'A date in the Gregorian month of November. $1 is the numerical date, for example "23".',
+'december-date' => 'A date in the Gregorian month of December. $1 is the numerical date, for example "23".',
# Categories related messages
'pagecategories' => 'Used in the categories section of pages.
@@ -585,6 +601,7 @@ See also:
{{Identical|Delete}}',
'deletethispage' => 'In the Cologne Blue skin this is the text for link to delete the page in admin view, at the bottom of the page.
{{Identical|Delete this page}}',
+'undeletethispage' => 'In the Cologne Blue skin this is the text for link to undelete the page in admin view, at the bottom of the page.',
'undelete_short' => "It is tab label. It's really can be named ''nstab-undelete''. Parameters:
* $1 - number of edits",
'viewdeleted_short' => 'Tab label for the undelete button when the user has permission to view the deleted history but not undelete.
@@ -683,7 +700,7 @@ For explanation of 'lock' see [[w:Lock_(computer_science)|wikipedia]].",
'pool-errorunknown' => 'Part of {{msg-mw|view-pool-error}}.
{{Identical|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).
+# 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).
'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}}.
[[mw:Manual:Interface/Aboutsite|MediaWiki manual]].
@@ -719,8 +736,6 @@ See also:
'disclaimerpage' => '{{doc-important|Do not change the <code>Project:</code> part.}}
Used as page for that contains the site disclaimer. Used at the bottom of every page on the wiki. Example: [[{{MediaWiki:Disclaimerpage}}|{{MediaWiki:Disclaimers}}]].',
'edithelp' => 'This is the text that appears on the editing help link that is near the bottom of the editing page',
-'edithelppage' => 'The help page displayed when a user clicks on editing help link which is present on the right of Show changes button.
-{{doc-important|Do not change the "<tt>Help:</tt>" part.}}',
'helppage' => '{{doc-important|Do not change the <code>Help:</code> part.}}
The link destination used by default in the sidebar, and in {{msg-mw|Noarticletext}}.
{{Identical|HelpContent}}',
@@ -862,7 +877,6 @@ Parameters:
'editsection' => 'Display name of link to edit a section on a content page. Example: [{{MediaWiki:Editsection}}].
{{Identical|Edit}}',
-'editsection-brackets' => '{{optional}}',
'editold' => '{{Identical|Edit}}',
'viewsourceold' => '{{Identical|View source}}',
'editlink' => 'Text of the edit link shown next to every (editable) template in the list of used templates below the edit window. See also {{msg-mw|Viewsourcelink}}.
@@ -1039,16 +1053,23 @@ The title of this error is the message {{msg-mw|Nosuchspecialpage}}.',
# General errors
'error' => '{{Identical|Error}}',
'databaseerror' => 'Used as title of error message {{msg-mw|Databaseerrortext}}.',
-'dberrortext' => 'Parameters:
-* $1 - The last SQL command/query
-* $2 - SQL function name
-* $3 - Error number
-* $4 - Error description',
-'dberrortextcl' => 'Parameters:
-* $1 - The last SQL command/query
-* $2 - SQL function name
-* $3 - Error number
-* $4 - Error description',
+'databaseerror-text' => 'A list of technical details might (or might not) follow, depending on server configuration. Do not use wiki markup.
+
+See also:
+* {{msg-mw|Databaseerror-textcl}} - abridged form',
+'databaseerror-textcl' => 'Abridged form of {{msg-mw|databaseerror-text}}, suitable for use in command-line scripts run by the server administrator. Do not use wiki markup.',
+'databaseerror-query' => 'Identifies, in the list of technical details, the [[wikipedia:SQL|SQL]] statement that failed.
+Parameters:
+* $1 - SQL statement (shown within a box)
+{{Identical|Query}}',
+'databaseerror-function' => 'Identifies, in the list of technical details, the function that tried to execute the database query.
+Parameters:
+* $1 - Name of function
+{{Identical|Function}}',
+'databaseerror-error' => 'Identifies, in the list of technical details, the error message the database server returned.
+Parameters:
+* $1 - Error message from the database server, probably in English
+{{Identical|Error}}',
'laggedslavemode' => 'Used as warning when getting the timestamp of the latest version, if in LaggedSlaveMode.',
'readonly' => 'Used as title of error message when database is locked.',
'enterlockreason' => 'For developers when locking the database',
@@ -1115,6 +1136,14 @@ See also:
'cannotdelete-title' => 'Title of error page when the user cannot delete a page. Parameters:
* $1 - the page name',
'delete-hook-aborted' => 'Error message shown when an extension hook prevents a page deletion, but does not provide an error message.',
+'no-null-revision' => 'Error message shown when no null revision could be created to reflect a protection level change.
+
+About "null revision":
+* Create a new null-revision for insertion into a page\'s history. This will not re-save the text, but simply refer to the text from the previous version.
+* Such revisions can for instance identify page rename operations and other such meta-modifications.
+
+Parameters:
+* $1 - page title',
'badtitle' => 'The page title when a user requested a page with invalid page name. The content will be {{msg-mw|badtitletext}}.',
'badtitletext' => 'The message shown when a user requested a page with invalid page name. The page title will be {{msg-mw|badtitle}}.
@@ -1161,7 +1190,6 @@ See also {{msg-mw|editinginterface}}.',
'editinginterface' => 'A message shown when editing pages in the namespace MediaWiki:.
See also {{msg-mw|protectedinterface}}.',
-'sqlhidden' => 'This message indicates the SQL is hidden for security reasons.',
'cascadeprotected' => 'Parameters:
* $1 - number of cascade-protected pages, used for PLURAL
* $2 - list of cascade-protected pages',
@@ -1169,6 +1197,10 @@ See also {{msg-mw|protectedinterface}}.',
* $1 - namespace name',
'customcssprotected' => 'Used as error message.',
'customjsprotected' => 'Used as error message.',
+'mycustomcssprotected' => 'Used as error message.',
+'mycustomjsprotected' => 'Used as error message.',
+'myprivateinfoprotected' => 'Used as error message.',
+'mypreferencesprotected' => 'Used as error message.',
'ns-specialprotected' => 'Error message displayed when trying to edit a page in the Special namespace',
'titleprotected' => 'Used as error message. Parameters:
* $1 - username; GENDER supported
@@ -1214,14 +1246,45 @@ Parameters:
Replaces welcomecreation in 1.21wmf5, see [[bugzilla:42215]]',
'yourname' => 'Since 1.22 no longer used in core, but used by some extensions.
{{Identical|Username}}',
+'userlogin-yourname' => "In user login & create account forms, label for username field.
+{{doc-important|<nowiki>{{</nowiki>[[Gender|GENDER]]<nowiki>}}</nowiki> is '''NOT''' supported.}}
+
+See examples: [[Special:UserLogin]] and [{{canonicalurl:Special:UserLogin|type=signup}} Special:UserLogin?type=signup]
+{{Identical|Username}}",
+'userlogin-yourname-ph' => 'Placeholder text in login & create account form field.
+
+See example: [[Special:UserLogin]] and [{{canonicalurl:Special:UserLogin|type=signup}} Special:UserLogin?type=signup]',
+'createacct-another-username-ph' => 'Placeholder text in create account form field when one user creates an account for another.',
'yourpassword' => 'In user preferences
{{Identical|Password}}',
+'userlogin-yourpassword' => 'In login & create account forms, label for password field.
+
+See examples: [[Special:UserLogin]] and [{{canonicalurl:Special:UserLogin|type=signup}} Special:UserLogin?type=signup]
+{{Identical|Password}}',
+'userlogin-yourpassword-ph' => 'Placeholder text in login form for password field.
+
+See examples: [[Special:UserLogin]] and [{{canonicalurl:Special:UserLogin|type=signup}} Special:UserLogin?type=signup]
+{{Identical|Enter password}}',
+'createacct-yourpassword-ph' => 'Placeholder text in create account form for password field.
+
+See example: [{{canonicalurl:Special:UserLogin|type=signup}} Special:UserLogin?type=signup]
+{{Identical|Enter password}}',
'yourpasswordagain' => 'Since 1.22 no longer used in core, but may be used by some extensions. DEPRECATED',
+'createacct-yourpasswordagain' => 'In create account form, label for field to re-enter password
+
+See example: [{{canonicalurl:Special:UserLogin|type=signup}} Special:UserLogin?type=signup]
+{{Identical|Confirm password}}',
+'createacct-yourpasswordagain-ph' => 'Placeholder text in create account form for re-enter password field.
+
+See example: [{{canonicalurl:Special:UserLogin|type=signup}} Special:UserLogin?type=signup]',
'remembermypassword' => 'Used as checkbox label in [[Special:UserLogin]]. Parameters:
* $1 - number of days
{{Identical|Remember my login on this computer}}',
-'securelogin-stick-https' => 'Used as label for checkbox.',
+'userlogin-remembermypassword' => 'The text for a check box in [[Special:UserLogin]].',
+'userlogin-signwithsecure' => 'Text of link to HTTPS login form.
+
+See example: [[Special:UserLogin]]',
'yourdomainname' => 'Used as label for listbox.',
'password-change-forbidden' => 'Error message shown when an external authentication source does not allow the password to be changed.',
'externaldberror' => 'This message is thrown when a valid attempt to change the wiki password for a user fails because of a database error or an error from an external system.',
@@ -1254,6 +1317,11 @@ See also:
'notloggedin' => 'This message is displayed in the standard skin when not logged in. The message is placed above the login link in the top right corner of pages.
{{Identical|Not logged in}}',
+'userlogin-noaccount' => 'In the [[Special:Userlogin]] form, this is the text prior to button inviting user to join project.
+{{Identical|Do not have an account}}',
+'userlogin-joinproject' => 'Text of button inviting user to create an account.
+
+See example: [[Special:UserLogin]]',
'nologin' => 'Since 1.22 no longer used in core, but may be used by some extensions. DEPRECATED. Parameters:
* $1 - a link to the account creation form, and the text of it is {{msg-mw|Nologinlink}}
{{Identical|Do not have an account}}',
@@ -1269,16 +1337,110 @@ It is also used on the submit button in the form/special page where you register
'gotaccountlink' => 'Since 1.22 no longer used in core, but may be used by some extensions. DEPRECATED.
{{Identical|Log in}}',
'userlogin-resetlink' => 'Since 1.22 no longer used in core, but may be used by some extensions. DEPRECATED.',
+'userlogin-resetpassword-link' => 'Used as link text on login form.
+
+The link points to the local [[Special:PasswordReset]].
+
+See example: [[Special:UserLogin]]
+
+userlogin-resetpassword-link may have to be shorter than the old {{msg-mw|userlogin-resetlink}}',
+'helplogin-url' => '{{doc-important|Do not translate the namespace name <code>Help</code>.}}
+Used as name of the page that provides information about logging into the wiki.
+
+Used as a link target in the message {{msg-mw|Userlogin-helplink}}.',
+'userlogin-helplink' => '{{doc-important|Do not change <code><nowiki>{{MediaWiki:helplogin-url}}</nowiki></code>.}}
+Wikitext linking to login help.
+
+See example: [[Special:UserLogin]]
+
+See also:
+* {{msg-mw|Helplogin-url}}',
+'userlogin-loggedin' => 'Used as warning on [[Special:UserLogin]] when the current user is already logged in.
+
+Followed by the Login form.
+
+See example: [[Special:UserLogin]].
+
+Parameters:
+* $1 - user name (used for display and for gender support)',
+'userlogin-createanother' => 'Used as label for the button on [[Special:UserLogin]] shown when the current user is already logged in.
+{{Identical|Create another account}}',
+'createacct-join' => 'Subheading of vertical-layout create account form encouraging user to join the wiki.
+
+See example: [{{canonicalurl:Special:UserLogin|type=signup}} Special:UserLogin?type=signup]',
+'createacct-another-join' => 'Subheading of create account form when one user creates an account for another.',
+'createacct-emailrequired' => 'Label in create account form for email field when it is required.
+
+See also:
+* {{msg-mw|Createacct-emailoptional}}
+{{Identical|E-mail address}}',
+'createacct-emailoptional' => 'Label in vertical-layout create account form for email field when it is optional.
+
+See example: [{{canonicalurl:Special:UserLogin|type=signup}} Special:UserLogin?type=signup]
+
+See also:
+* {{msg-mw|Createacct-emailrequired}}',
+'createacct-email-ph' => 'Placeholder in vertical-layout create account form for email field.
+
+See example: [{{canonicalurl:Special:UserLogin|type=signup}} Special:UserLogin?type=signup]',
+'createacct-another-email-ph' => 'Placeholder in create account form for email field when one user creates an account for another.',
'createaccountmail' => 'The label for the checkbox for creating a new account and sending the new password to the specified email address directly, as used on [[Special:UserLogin/signup]] when one user creates an account for another (if creating accounts by email is allowed).
See example: [{{canonicalurl:Special:UserLogin|type=signup}} Special:UserLogin?type=signup]',
+'createacct-realname' => 'In vertical-layout create account form, label for field to enter optional real name.',
'createaccountreason' => 'Since 1.22 no longer used in core, but may be used by some extensions. DEPRECATED
{{Identical|Reason}}',
+'createacct-reason' => 'In create account form, label for field to enter reason to create an account when already logged-in.
+
+See example: [{{canonicalurl:Special:UserLogin|type=signup}} Special:UserLogin?type=signup]
+{{Identical|Reason}}',
+'createacct-reason-ph' => 'Placeholder in vertical-layout create account form for reason field.
+
+See example: [{{canonicalurl:Special:UserLogin|type=signup}} Special:UserLogin?type=signup]',
+'createacct-captcha' => 'Label in vertical-layout create account form for CAPTCHA input field when repositioned by JavaScript.',
+'createacct-imgcaptcha-ph' => 'Placehodler text in vertical-layout create account form for image CAPTCHA input field when repositioned by JavaScript.',
+'createacct-submit' => 'Submit button on vertical-layout create account form.
+
+See example: [{{canonicalurl:Special:UserLogin|type=signup}} Special:UserLogin?type=signup]',
+'createacct-another-submit' => 'Submit button of [[Special:UserLogin/signup]] ([[Special:CreateAccount]]) when accessed by a registered user.
+
+The original means "create an account in addition to the one you already have"; sometimes, but not always, it means you are going to "Create the account on behalf of somebody else" or "Create account for another".
+{{Identical|Create another account}}',
+'createacct-benefit-heading' => 'In vertical-layout create account form, the heading for the section describing the benefits of creating an account. See example: [{{canonicalurl:Special:UserLogin|type=signup}} Special:UserLogin?type=signup]
+
+If in your language you need to know the gender of the name for the wiki (which is the subject of the English sentence), please adapt the sentence as much as you need for your translation to fit.',
+'createacct-benefit-body1' => 'In vertical-layout create account form, the text for the first benefit.
+
+Preceded by the message {{msg-mw|Createacct-benefit-head1}} (number of edits).
+
+See example: [{{canonicalurl:Special:UserLogin|type=signup}} Special:UserLogin?type=signup]
+
+Parameters:
+* $1 - number of edits
+{{Identical|Edit}}',
+'createacct-benefit-body2' => 'In vertical-layout create account form, the text for the second benefit.
+
+Preceded by the message {{msg-mw|Createacct-benefit-head2}} (number of pages).
+
+See example: [{{canonicalurl:Special:UserLogin|type=signup}} Special:UserLogin?type=signup]
+
+Parameters:
+* $1 - number of pages
+{{Identical|Page}}',
+'createacct-benefit-body3' => 'In vertical-layout create account form, the text for the third benefit.
+
+Preceded by the message {{msg-mw|Createacct-benefit-head3}} (number of contributors).
+
+See example: [{{canonicalurl:Special:UserLogin|type=signup}} Special:UserLogin?type=signup]
+
+Parameters:
+* $1 - number of contributors (users)',
'badretype' => 'Used as error message when the new password and its retype do not match.',
'userexists' => 'Used as error message in creating a user account.',
'loginerror' => 'Used as title of error message.
{{Identical|Login error}}',
+'createacct-error' => 'Used as heading for the error message.',
'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.",
@@ -1389,12 +1551,32 @@ Parameters:
* $3 - a password (randomly generated)
* $4 - a URL to the wiki ('<' + server name + script name + '>')
* $5 - (Unused) number of days to password expiry date",
-'login-throttled' => 'Error message shown at [[Special:UserLogin]] after 5 wrong passwords. The hardcoded waiting time is 300 seconds.',
+'login-throttled' => 'Error message shown at [[Special:UserLogin]] after the user has tried to login with incorrect password too many times; also used by [[Special:ChangeEmail]] and [[Special:ChangePassword]].
+
+The user has to wait a certain time before trying to log in again.
+
+Parameters:
+* $1 - the time to wait before the next login attempt. Automatically formatted using the following duration messages:
+** {{msg-mw|Duration-millennia}}
+** {{msg-mw|Duration-centuries}}
+** {{msg-mw|Duration-decades}}
+** {{msg-mw|Duration-years}}
+** {{msg-mw|Duration-weeks}}
+** {{msg-mw|Duration-days}}
+** {{msg-mw|Duration-hours}}
+** {{msg-mw|Duration-minutes}}
+** {{msg-mw|Duration-seconds}}
+
+This is a protection against robots trying to find the password by trying lots of them.
+The number of attempts and waiting time are configured via [[mw:Manual:$wgPasswordAttemptThrottle|$wgPasswordAttemptThrottle]].',
'login-abort-generic' => 'The generic unsuccessful login message is used unless otherwise specified by hook writers',
'loginlanguagelabel' => 'Used on [[Special:UserLogin]] if $wgLoginLanguageSelector is true. Parameters:
* $1 - a pipe-separated list built from the names that appear in the message {{msg-mw|Loginlanguagelinks}}.
{{Identical|Language}}',
'suspicious-userlogout' => 'Used when the logout request looks suspicious, in Special:UserLogout.',
+'createacct-another-realname-tip' => "{{doc-singularthey}}
+Used on the account creation form when creating another user's account. Similar to {{msg-mw|prefs-help-realname}}.
+{{Identical|Real name attribution}}",
# Email sending
'php-mail-error-unknown' => 'Used as error message when <code>mail()</code> returned empty error message.',
@@ -1414,7 +1596,7 @@ Parameters:
'newpassword' => '{{Identical|New password}}',
'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_success' => 'Used in [[Special:ChangePassword]].',
+'changepassword-success' => 'Used in [[Special:ChangePassword]].',
'resetpass_forbidden' => "Used as error message in changing password. Maybe the external auth plugin won't allow local password changes.",
'resetpass-no-info' => 'Error message for [[Special:ChangePassword]].',
'resetpass-submit-loggedin' => 'Button on [[Special:ResetPass]] to submit new password.
@@ -1429,12 +1611,18 @@ Parameters:
# Special:PasswordReset
'passwordreset' => 'Title of [[Special:PasswordReset]].
{{Identical|Reset password}}',
-'passwordreset-text' => 'Text on [[Special:PasswordReset]]',
+'passwordreset-text-one' => 'Text on [[Special:PasswordReset]] that appears when there is only one way of resetting the password.
+
+{{msg-mw|Passwordreset-text-many}} will be used, when there are multiple ways of resetting the password.',
+'passwordreset-text-many' => 'Text on [[Special:PasswordReset]] that appears when there are multiple ways of resetting the password.
+
+Parameters:
+* $1 - the number of password reset routes
+
+{{msg-mw|Passwordreset-text-one}} will be used, when there is only one way of resetting the password.',
'passwordreset-legend' => '{{Identical|Reset password}}',
'passwordreset-disabled' => 'Used as error message in changing password.',
-'passwordreset-pretext' => 'These instructions are shown on the password reset dialogue, which can, in principle, take the user\'s email address as well as, or instead of, their username. This text displays above one or more fields, at least one of which needs to be completed, and the message does not know which routes are available, so it needs to refer to some vague noun rather than specifically "username".
-"One of the pieces of data" means "an info"/"a datum" (probably to be translatea with a singular noun in your language if available). Parameters:
-* $1 is the number of password reset routes. This is never 1, but always two or more. Thus, the first plural option is empty in English.',
+'passwordreset-emaildisabled' => "Used as error message in changing password when site's email feature is disabled.",
'passwordreset-username' => '{{Identical|Username}}',
'passwordreset-domain' => 'A domain like used in Domain Name System (DNS) or more specifically like a domain component in the Lightweight Directory Access Protocol (LDAP)',
'passwordreset-capture' => 'Label for checkbox asking the user whether they want to see the contents of the password reset email (only shown if they have the <code>passwordreset</code> permission).',
@@ -1470,8 +1658,9 @@ See also:
See also:
* {{msg-mw|Passwordreset-emailsent}}
* {{msg-mw|Passwordreset-emailerror-capture}}',
-'passwordreset-emailerror-capture' => 'Error message displayed in [[Special:PasswordReset]] when sending an e-mail fails. Parameters:
-* $1 - the name of a user who was supposed to get the e-mail
+'passwordreset-emailerror-capture' => 'Error message displayed in [[Special:PasswordReset]] when sending an email fails. Parameters:
+* $1 - error message
+* $2 - username, used for GENDER
See also:
* {{msg-mw|Passwordreset-emailsent}}
* {{msg-mw|Passwordreset-emailsent-capture}}',
@@ -1492,6 +1681,23 @@ See also:
{{Identical|Cancel}}',
+# Special:ResetTokens
+'resettokens' => '{{doc-special|ResetTokens}}
+In this case "token" may be translated as "key", or similar.
+{{Identical|Reset token}}',
+'resettokens-text' => 'Text on [[Special:ResetTokens]].',
+'resettokens-no-tokens' => 'Additional text on [[Special:ResetTokens]] if the user has no tokens.',
+'resettokens-legend' => 'Form legend on [[Special:ResetTokens]].
+{{Identical|Reset token}}',
+'resettokens-tokens' => 'Form label on [[Special:ResetTokens]].
+{{Identical|Token}}',
+'resettokens-token-label' => 'Label for each checkbox on [[Special:ResetTokens]]. Parameters:
+* $1 - short information about the token (for example {{msg-mw|resettokens-watchlist-token}})
+* $2 - its current value',
+'resettokens-watchlist-token' => 'Label for watchlist token checkbox on [[Special:ResetTokens]] (see {{msg-mw|prefs-watchlist-token}} at [[Special:Preferences#mw-prefsection-watchlist]]).',
+'resettokens-done' => 'Message shown on [[Special:ResetTokens]] after the tokens have been reset successfully.',
+'resettokens-resetbutton' => 'Form submit button on [[Special:ResetTokens]].',
+
# Edit page toolbar
'bold_sample' => 'This is the sample text that you get when you press the first button on the left on the edit toolbar.
@@ -1881,6 +2087,11 @@ See also:
* {{msg-mw|edit-gone-missing}}
* {{msg-mw|edit-conflict}}
* {{msg-mw|edit-already-exists}}',
+'postedit-confirmation' => '{{gender}}
+Confirmation message that is displayed upon successful edit.
+
+Parameters:
+* $1 - (Optional) the current user, for GENDER support',
'edit-already-exists' => 'Used as error message.
See also:
@@ -1903,6 +2114,9 @@ Parameters:
'content-not-allowed-here' => 'Error message indicating that the desired content model is not supported in given localtion.
* $1 - the human readable name of the content model: {{msg-mw|Content-model-wikitext}}, {{msg-mw|Content-model-javascript}}, {{msg-mw|Content-model-css}} or {{msg-mw|Content-model-text}}
* $2 - the title of the page in question',
+'editwarning-warning' => "{{doc-important|Do ''not'' use <nowiki>{{int:prefs-editing}}</nowiki> for \"Editing\". It is forbidden in this message, see [[mwr:68405]].}}
+
+but you can see the text of that button here: {{msg-mw|Prefs-editing}}",
# Content models
'content-model-wikitext' => 'Name for the wikitext content model, used when decribing what type of content a page contains.
@@ -2021,6 +2235,12 @@ See also:
* $1 - revision ID
* $2 - username
{{Identical|Undo}}',
+'undo-summary-username-hidden' => 'Edit summary for an undo action where the username of the old revision is hidden.
+
+Parameters:
+* $1 - the revision ID being undone
+See also:
+* {{msg-mw|Undo-summary}}',
# Account creation failure
'cantcreateaccounttitle' => 'Used as title of the error message {{msg-mw|Cantcreateaccount-text}}.',
@@ -2507,6 +2727,7 @@ See also:
This message has sometimes a tooltip {{msg-mw|tooltip-undo}}
{{Identical|Undo}}',
+'diff-empty' => 'This message appears instead of a "diff" when comparing two revisions that are identical.',
'diff-multi' => "This message appears in the revision history of a page when comparing two versions which aren't consecutive.
Parameters:
@@ -2600,9 +2821,6 @@ Parameters:
Parameters:
* $1 - page title',
-'searchhelp-url' => 'Description: The URL of the search help page.
-{{doc-important|Do not change the "<tt>Help:</tt>" part.}}
-{{Identical|HelpContent}}',
'searchmenu-prefix' => '{{doc-important|Do not translate "Special:PrefixIndex"}}
Parameters:
* $1 - prefix string',
@@ -2730,15 +2948,8 @@ See also:
In this sentence, "their indexes" refers to "Google\'s indexes".
Shown on [[Special:Search]] when the internal search is disabled.',
-
-# Quickbar
-'qbsettings' => 'The title of the section in [[Special:Preferences]], only shown when using the skins "Standard/Classic" or "Cologne Blue". The quicbar is the same as the sidebar.',
-'qbsettings-none' => '{{Identical|None}}',
-'qbsettings-fixedleft' => 'Position of the quickbar (sidebar). Used in the preferences.',
-'qbsettings-fixedright' => 'Position of the quickbar (sidebar). Used in the preferences.',
-'qbsettings-floatingleft' => 'Position of the quickbar (sidebar). Used in the preferences.',
-'qbsettings-floatingright' => 'Position of the quickbar (sidebar). Used in the preferences.',
-'qbsettings-directionality' => '"Fixed", as in the position "fixed left or right". For left-to-right languages, the quickbar will be positioned at the left, for right-to-left languages at the right.',
+'search-error' => 'Shown when an error has occurred when performing a search
+* $1 is the localized error that was returned',
# Preferences page
'preferences' => 'Title of the [[Special:Preferences]] page.
@@ -2818,7 +3029,6 @@ Also used as label for the Submit button in [[Special:Preferences/reset]].',
'prefs-editing' => 'Title of a tab in [[Special:Preferences]].
When changing this message, please also update {{msg-mw|vector-editwarning-warning}} which references to this message.
{{Identical|Editing}}',
-'prefs-edit-boxsize' => 'Used on [[Special:Preferences]].',
'rows' => 'Used on [[Special:Preferences]], "Editing" section in the "Size of editing window" fieldset.
{{Identical|Row}}',
'columns' => 'Used on [[Special:Preferences]], "Editing" section in the "Size of editing window" fieldset',
@@ -2836,7 +3046,7 @@ See also:
* {{msg-mw|Prefs-watchlist-days-max}}',
'recentchangescount' => 'Used in [[Special:Preferences]], tab "Recent changes".',
'prefs-help-recentchangescount' => 'Used in [[Special:Preferences]], tab "Recent changes".',
-'prefs-help-watchlist-token' => 'Used in [[Special:Preferences]], tab Watchlist.',
+'prefs-help-watchlist-token2' => 'Used in [[Special:Preferences]], tab Watchlist. (Formerly in {{msg-mw|prefs-help-watchlist-token}}.)',
'savedprefs' => 'This message appears after saving changes to your user preferences.',
'timezonelegend' => '{{Identical|Time zone}}',
'localtime' => 'Used as label in [[Special:Preferences#mw-prefsection-datetime|preferences]].',
@@ -2884,7 +3094,6 @@ Parameters:
'prefs-common-css-js' => 'Used as label in [[Special:Preferences#mw-prefsection-rendering|preferences]], tab "Appearance", section "Skin".',
'prefs-reset-intro' => 'Used in [[Special:Preferences/reset]].',
'prefs-emailconfirm-label' => 'Sub-heading in [[Special:Preferences]] > {{int:prefs-personal}} > {{int:email}}.',
-'prefs-textboxsize' => "Header for the box specifying the size of the editing window, displayed on the 'editing' tab of the [[Special:Preferences|user preferences]] special page.",
'youremail' => 'Label of the e-mail text box of the "E-mail options" section of [[Special:Preferences]].
Also used on create account form.
@@ -2986,6 +3195,11 @@ See also:
'prefs-timeoffset' => 'Used in [[Special:Preferences]], tab "Date and time".',
'prefs-advancedediting' => 'Used in [[Special:Preferences]], tab "Editing".
This used to say "Advanced options", the key name is a left over from that.',
+'prefs-editor' => 'Used in [[Special:Preferences]], tab "Editing" ({{int:prefs-editing}}).
+
+{{Identical|Editor}}',
+'prefs-preview' => 'Used in [[Special:Preferences]], tab "Editing".
+{{Identical|Preview}}',
'prefs-advancedrc' => 'Used in [[Special:Preferences]], tab "Recent changes".
{{Identical|Advanced options}}',
'prefs-advancedrendering' => 'Used in [[Special:Preferences]], tab "Appearence".
@@ -3008,7 +3222,15 @@ Used in [[Special:Preferences]], tab "Search options". The display options refer
Used in [[Special:Preferences]], tab "Watchlist". The display options refer to:
* {{msg-mw|Prefs-watchlist-days}}
* {{msg-mw|Prefs-watchlist-edits}}',
+'prefs-tokenwatchlist' => 'Section heading.
+Used in [[Special:Preferences]], tab "Watchlist".
+{{Identical|Token}}',
'prefs-diffs' => 'Used in [[Special:Preferences]], tab "Misc".',
+'prefs-help-prefershttps' => 'Used as help text for the checkbox in [[Special:Preferences]].
+
+The checkbox has the label {{msg-mw|Tog-prefershttps}}.
+
+See example: [[mw:Special:Preferences]].',
# User preference: email validation using jQuery
'email-address-validity-valid' => 'Used as hint for {{msg-mw|changeemail-newemail}} field in [[Special:ChangeEmail]], when the provided E-mail address is valid.',
@@ -3077,6 +3299,8 @@ Parameters:
'userrights-irreversible-marker' => '{{optional}}
Parameters:
* $1 - group member',
+'userrights-conflict' => "Shown on [[Special:UserRights]] if the target's rights have been changed since the form was loaded.",
+'userrights-removed-self' => 'Shown on [[Special:UserRights]] in a green box after the user removed its own rights to access that page.',
# Groups
'group' => '{{Identical|Group}}',
@@ -3226,7 +3450,16 @@ This user automatically bypasses IP blocks, auto-blocks and range blocks - so I
'right-proxyunbannable' => '{{doc-right|proxyunbannable}}',
'right-unblockself' => '{{doc-right|unblockself}}',
'right-protect' => '{{doc-right|protect}}',
-'right-editprotected' => '{{doc-right|editprotected}}',
+'right-editprotected' => '{{doc-right|editprotected}}
+Refers to {{msg-mw|Protect-level-sysop}}.
+
+See also:
+* {{msg-mw|Right-editsemiprotected}}',
+'right-editsemiprotected' => '{{doc-right|editsemiprotected}}
+Refers to {{msg-mw|Protect-level-autoconfirmed}}.
+
+See also:
+* {{msg-mw|Right-editprotected}}',
'right-editinterface' => '{{doc-right|editinterface}}',
'right-editusercssjs' => '{{doc-right|editusercssjs}}',
'right-editusercss' => '{{doc-right|editusercss}}
@@ -3235,6 +3468,17 @@ See also:
'right-edituserjs' => '{{doc-right|edituserjs}}
See also:
* {{msg-mw|Right-editmyuserjs}}',
+'right-editmyusercss' => '{{doc-right|editmyusercss}}
+See also:
+* {{msg-mw|Right-editusercss}}',
+'right-editmyuserjs' => '{{doc-right|editmyuserjs}}
+See also:
+* {{msg-mw|Right-edituserjs}}',
+'right-viewmywatchlist' => '{{doc-right|viewmywatchlist}}',
+'right-editmywatchlist' => '{{doc-right|editmywatchlist}}',
+'right-viewmyprivateinfo' => '{{doc-right|viewmyprivateinfo}}',
+'right-editmyprivateinfo' => '{{doc-right|editmyprivateinfo}}',
+'right-editmyoptions' => '{{doc-right|editmyoptions}}',
'right-rollback' => '{{doc-right|rollback}}
{{Identical|Rollback}}',
'right-markbotedits' => '{{doc-right|markbotedits}}
@@ -3309,6 +3553,12 @@ This action allows editing of all of the "user rights", not just the rights of t
'action-userrights-interwiki' => '{{Doc-action|userrights-interwiki}}',
'action-siteadmin' => '{{Doc-action|siteadmin}}',
'action-sendemail' => '{{doc-action|sendemail}}',
+'action-editmywatchlist' => '{{doc-action|editmywatchlist}}
+{{Identical|Edit your watchlist}}',
+'action-viewmywatchlist' => '{{doc-action|viewmywatchlist}}
+{{Identical|View your watchlist}}',
+'action-viewmyprivateinfo' => '{{doc-action|viewmyprivateinfo}}',
+'action-editmyprivateinfo' => '{{doc-action|editmyprivateinfo}}',
# Recent changes
'nchanges' => 'Appears on enhanced watchlist and recent changes when page has more than one change on given date, linking to a diff of the changes.
@@ -3316,6 +3566,17 @@ This action allows editing of all of the "user rights", not just the rights of t
Parameters:
* $1 - the number of changes on that day (2 or more)
Three messages are shown side-by-side: ({{msg-mw|Nchanges}} | {{msg-mw|Enhancedrc-since-last-visit}} | {{msg-mw|Enhancedrc-history}}).',
+'enhancedrc-since-last-visit' => "Appears on enhanced watchlist and recent changes when page has more than one change on given date and at least one that the user hasn't seen yet, linking to a diff of the unviewed changes.
+
+Parameters:
+* $1 - the number of unviewed changes (1 or more)
+Three messages are shown side-by-side: ({{msg-mw|nchanges}} | {{msg-mw|enhancedrc-since-last-visit}} | {{msg-mw|enhancedrc-history}}).",
+'enhancedrc-history' => 'Appears on enhanced watchlist and recent changes when page has more than one change on given date, linking to its history.
+
+This is the same as {{msg-mw|hist}}, but not abbreviated.
+
+Three messages are shown side-by-side: ({{msg-mw|nchanges}} | {{msg-mw|enhancedrc-since-last-visit}} | {{msg-mw|enhancedrc-history}}).
+{{Identical|History}}',
'recentchanges' => 'The text of the link in sidebar going to the special page [[Special:RecentChanges]]. Also the page title of that special page.
See also:
@@ -3325,6 +3586,7 @@ See also:
{{Identical|Recent changes}}',
'recentchanges-legend' => 'Legend of the fieldset of [[Special:RecentChanges]]',
'recentchanges-summary' => 'Summary of [[Special:RecentChanges]].',
+'recentchanges-noresult' => 'Used in [[Special:RecentChanges]], [[Special:RecentChangesLinked]], and [[Special:Watchlist]] when there are no changes to be shown.',
'recentchanges-feed-description' => 'Used in feed of RecentChanges. See example [{{canonicalurl:Special:RecentChanges|feed=atom}} feed].',
'recentchanges-label-newpage' => 'Tooltip for {{msg-mw|newpageletter}}',
'recentchanges-label-minor' => 'Tooltip for {{msg-mw|minoreditletter}}',
@@ -3447,7 +3709,6 @@ This message is followed by {{msg-mw|Recentchangeslinked-feed}}.
Parameters:
* \$1 - the name of the page for which related changes are shown",
-'recentchangeslinked-noresult' => 'Used in [[Special:RecentChangesLinked]], when there are no changes.',
'recentchangeslinked-summary' => 'Summary of [[Special:RecentChangesLinked]].',
'recentchangeslinked-page' => '{{Identical|Page name}}',
'recentchangeslinked-to' => 'Checkbox in [[Special:RecentChangesLinked]].',
@@ -3480,8 +3741,12 @@ See also:
* {{msg-mw|reuploaddesc|button text}}',
'uploadnologin' => 'Used as title of the error message {{msg-mw|Uploadnologintext}}.
{{Identical|Not logged in}}',
-'uploadnologintext' => 'Used as error message. The title for this message is {{msg-mw|Uploadnologin}}.
+'uploadnologintext' => 'Used as error message.
+
+The title for this message is {{msg-mw|Uploadnologin}}.
+Parameters:
+* $1 - link text {{msg-mw|Loginreqlink}}. The link points to [[Special:UserLogin]].
See also:
* {{msg-mw|Whitelistedittext}}
* {{msg-mw|Nocreatetext}}
@@ -4127,12 +4392,6 @@ See also:
Known messages are:
* {{msg-mw|http-host-unreachable}}
* {{msg-mw|http-timed-out}}',
-'http-host-unreachable' => 'Used as error message when executing HTTP request.
-
-See also:
-* {{msg-mw|Http-request-error}}
-* {{msg-mw|Http-read-error}}
-* {{msg-mw|Http-timed-out|28}}',
'http-bad-status' => 'Parameters:
* $1 - an HTTP error code (e.g. 404)
* $2 - the HTTP error message (e.g. File Not Found)',
@@ -4196,6 +4455,24 @@ See also:
{{Identical|Description}}',
'listfiles_count' => 'One of the table column headers in [[Special:Listfiles]] denoting the amount of saved versions of that file.
{{Identical|Version}}',
+'listfiles-show-all' => 'Used as checkbox label in [[Special:ListFiles]].',
+'listfiles-latestversion' => 'Used as label for the field.
+
+This probably means "The latest version".
+
+Followed by any one of the following messages:
+* {{msg-mw|Listfiles-latestversion-yes}}
+* {{msg-mw|Listfiles-latestversion-no}}',
+'listfiles-latestversion-yes' => 'Used as value for the field which has the label {{msg-mw|Listfiles-latestversion}}.
+
+See also:
+* {{msg-mw|Listfiles-latestversion-no}}
+{{Identical|Yes}}',
+'listfiles-latestversion-no' => 'Used as value for the field which has the label {{msg-mw|Listfiles-latestversion}}.
+
+See also:
+* {{msg-mw|Listfiles-latestversion-yes}}
+{{Identical|No}}',
# File description page
'file-anchor-link' => '{{Identical|File}}',
@@ -4455,6 +4732,28 @@ See also:
See also:
* {{msg-mw|Randomredirect-nopages}}',
+# Random page in category
+'randomincategory' => '{{doc-special|RandomInCategory}}',
+'randomincategory-invalidcategory' => 'Message shown if an invalid category is specified.
+
+Parameters:
+* $1 - the invalid category name given
+
+(Note, if the category is simply empty, but could possibly exist, {{msg-mw|randomincategory-nopages}} is shown instead)',
+'randomincategory-nopages' => 'Message shown from [[Special:RandomInCategory]] if the category is empty.
+
+Parameters:
+* $1 - the category name (without the namespace prefix)',
+'randomincategory-selectcategory' => 'Shown on [[Special:RandomInCategory]] if no category is selected.
+
+Displays a form allowing the user to input a category name.
+
+Parameters:
+* $1 - the text field input box
+* $2 - the go button which has the label {{msg-mw|randomincategory-selectcategory-submit}}.',
+'randomincategory-selectcategory-submit' => 'Used as label for the Submit button which is used as <code>$2</code> in {{msg-mw|Randomincategory-selectcategory}}.
+{{Identical|Go}}',
+
# Random redirect
'randomredirect' => '{{doc-special|RandomRedirect}}',
'randomredirect-nopages' => 'Parameters:
@@ -4495,16 +4794,6 @@ Used in [[Special:Statistics]].',
* \$1 - Value of <code>\$wgRCMaxAge</code> in days",
'statistics-mostpopular' => 'Used in [[Special:Statistics]]',
-'disambiguations' => '{{doc-special|Disambiguations}}',
-'disambiguationspage' => 'This message is the name of the template used for marking disambiguation pages. It is used by [[Special:Disambiguations]] to find all pages which link to disambiguation pages.
-
-{{doc-important|Don\'t translate the "Template:" part!}}
-{{Identical|Template:disambig}}',
-'disambiguations-text' => '{{doc-important|Do not change the link "<code><nowiki>[[MediaWiki:Disambiguationspage]]</nowiki></code>", even because it is listed as problematic. Be sure the "D" is in uppercase, so not "d".}}
-This block of text is shown on [[:Special:Disambiguations]].
-
-\'\'\'Background information:\'\'\' Beyond telling about links going to disambiguation pages, that they are generally bad, it should explain which pages in the article namespace are seen as disambiguations: [[MediaWiki:Disambiguationspage]] usually holds a list of disambiguation templates of the local wiki. Pages linking to one of them (by transclusion) will count as disambiguation pages. Pages linking to these disambiguation pages, instead to the disambiguated article itself, are listed on [[:Special:Disambiguations]].',
-
'pageswithprop' => '{{doc-special|PagesWithProp}}
{{Identical|Page with page property}}',
'pageswithprop-legend' => 'Legend for the input form on [[Special:PagesWithProp]].
@@ -4514,6 +4803,18 @@ This block of text is shown on [[:Special:Disambiguations]].
{{Identical|Property name}}',
'pageswithprop-submit' => 'Label for the submit button on [[Special:PagesWithProp]].
{{Identical|Go}}',
+'pageswithprop-prophidden-long' => 'Information shown on [[Special:PagesWithProp]] when property value is longer than 1 kilobyte.
+
+Parameters:
+* $1 - size of property value in kilobytes
+See also:
+* {{msg-mw|pageswithprop-prophidden-binary}}',
+'pageswithprop-prophidden-binary' => 'Information shown on [[Special:PagesWithProp]] when property value contains binary data.
+
+Parameters:
+* $1 - size of property value in kilobytes
+See also:
+* {{msg-mw|pageswithprop-prophidden-long}}',
'doubleredirects' => '{{doc-special|DoubleRedirects}}',
'doubleredirectstext' => 'Shown on top of [[Special:Doubleredirects]]',
@@ -4619,6 +4920,11 @@ Parameters:
'prefixindex' => '{{doc-special|PrefixIndex}}
When the user limits the list to a certain namespace, {{msg-mw|allinnamespace}} is used instead.',
'prefixindex-namespace' => 'The page title of [[Special:PrefixIndex]] limited to a specific namespace. Similar to {{msg-mw|allinnamespace}}. $1 is the name of the namespace',
+'prefixindex-strip' => 'Label for a checkbox. If the checkbox is checked, the prefix searched will be removed from the title displayed in the list. Used in [[Special:PrefixIndex]].
+
+See the following search results:
+* [{{canonicalurl:Special:PrefixIndex|prefix=Doc&namespace=10}} Special:PrefixIndex?prefix=Doc&namespace=10] (prefix NOT stripped)
+* [{{canonicalurl:Special:PrefixIndex|prefix=Doc&namespace=10&stripprefix=1}} Special:PrefixIndex?prefix=Doc&namespace=10&stripprefix=1] (prefix stripped)',
'shortpages' => '{{doc-special|ShortPages}}',
'longpages' => '{{doc-special|LongPages}}',
'deadendpages' => '{{doc-special|DeadendPages}}',
@@ -4634,6 +4940,7 @@ When the user limits the list to a certain namespace, {{msg-mw|allinnamespace}}
'listusers' => '{{doc-special|ListUsers}}',
'listusers-editsonly' => 'Option in [[Special:ListUsers]].',
'listusers-creationsort' => 'Option in [[Special:ListUsers]].',
+'listusers-desc' => 'Used as label for the checkbox.',
'usereditcount' => 'Shown behind every username on [[Special:ListUsers]]. Parameters:
* $1 - number of edits',
'usercreated' => 'Used in [[Special:ListUsers]]. Parameters:
@@ -5078,7 +5385,6 @@ Possible alternatives to the word 'content' are 'subject matter' or 'wiki subjec
See also:
* {{msg-mw|Cantrollback}}',
-'watchnochange' => 'Used in [[Special:Watchlist]] if there is nothing to show.',
'watchlist-details' => 'Message on [[Special:Watchlist]]. Parameters:
* $1 - number of pages in your watchlist
This is paired with the message {{msg-mw|Nowatchlist}} which appears instead of Watchlist-details when $1 is 0.
@@ -5087,13 +5393,12 @@ See also:
* {{msg-mw|Wlheader-enotif|watchlist header}}
* {{msg-mw|enotif reset|Submit button text}}
* {{msg-mw|Watchlistcontains}}',
-'wlheader-enotif' => 'Used in [[Special:Watchlist]].
+'wlheader-enotif' => 'Message at the top of [[Special:Watchlist]], after {{msg-mw|watchlist-details}}. Has to be a full sentence.
See also:
* {{msg-mw|Watchlist-options|fieldset}}
-* {{msg-mw|Watchlist-details|watchlist header}}
* {{msg-mw|enotif reset|Submit button text}}',
-'wlheader-showupdated' => 'This message shows up near top of users watchlist page.',
+'wlheader-showupdated' => 'Message at the top of [[Special:Watchlist]], after {{msg-mw|watchlist-details}}. Has to be a full sentence.',
'watchmethod-recent' => 'See also:
* {{msg-mw|Watchmethod-list}}',
'watchmethod-list' => 'See also:
@@ -5745,6 +6050,7 @@ See also:
'contribsub2' => 'Contributions for "user" (links). Parameters:
* $1 is an IP address or a username, with a link which points to the user page (if registered user).
* $2 is list of tool links. The list contains a link which has text {{msg-mw|Sp-contributions-talk}}.
+* $3 is a plain text username used for GENDER.
{{Identical|For $1}}',
'nocontribs' => 'Used in [[Special:Contributions]] and [[Special:DeletedContributions]].
@@ -6312,33 +6618,18 @@ See also:
* {{msg-mw|Range block disabled}}
* {{msg-mw|Ip range invalid}}
* {{msg-mw|Ip range toolarge}}',
-'blockme' => '{{doc-special|BlockMe|unlisted=1}}
-This feature is disabled by default.',
'proxyblocker' => 'Used in [[Special:BlockMe]].
See also:
* {{msg-mw|proxyblocker-disabled}}
* {{msg-mw|proxyblockreason}}
* {{msg-mw|proxyblocksuccess}}',
-'proxyblocker-disabled' => 'Used in [[Special:BlockMe]].
-
-See also:
-* {{msg-mw|proxyblocker}}
-* {{msg-mw|proxyblockreason}}
-* {{msg-mw|proxyblocksuccess}}',
'proxyblockreason' => 'Used as explanation of the reason in [[Special:BlockMe]].
See also:
* {{msg-mw|proxyblocker-disabled}}
* {{msg-mw|proxyblocker}}
* {{msg-mw|proxyblocksuccess}}',
-'proxyblocksuccess' => 'Used in [[Special:BlockMe]].
-
-See also:
-* {{msg-mw|proxyblocker-disabled}}
-* {{msg-mw|proxyblocker}}
-* {{msg-mw|proxyblockreason}}
-{{Identical|Done}}',
'sorbs' => '{{optional}}',
'sorbsreason' => 'See also:
* {{msg-mw|Sorbsreason}}
@@ -6348,6 +6639,8 @@ See also:
See also:
* {{msg-mw|Sorbsreason}}
* {{msg-mw|Sorbs create account_reason}}',
+'xffblockreason' => "This text is shown to the user as a block reason and describes that the user is being blocked because an IP in the X-Forwarded-For header (which lists the user's IP as well as all IPs of the transparent proxy servers they went through) sent when they loaded the page has been blocked:
+* $1 is the original block reason for the IP address matched in the X-Forwarded-For header",
'cant-see-hidden-user' => 'Used as (red) error message on [[Special:Block]] when you try to change (as sysop without 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 <code>unblockself</code> right tries to unblock themself.',
@@ -6863,6 +7156,11 @@ The reason $1 is one of the following messages:
* {{msg-mw|Djvu page error}}
* {{msg-mw|Svg-long-error}}
* other custom string',
+'thumbnail_error_remote' => 'Message shown in a thumbnail frame when creation of the thumbnail fails.
+
+Parameters:
+* $1 - the name of the shared repository, see {{msg-mw|Sharedupload}}
+* $2 - the reason, see {{msg-mw|Thumbnail error}}',
'djvu_page_error' => 'Used as error message.
See also:
@@ -7542,23 +7840,19 @@ See also:
* {{msg-mw|Summary}}
* {{msg-mw|Accesskey-summary}}
* {{msg-mw|Tooltip-summary}}',
+'interlanguage-link-title' => 'Format of a sidebar interwiki link tooltip. Parameters:
+* $1 - page name in the target wiki
+* $2 - target wiki language autonym',
# Stylesheets
'common.css' => '{{optional}}
CSS applied to all users.',
-'standard.css' => '{{optional}}',
-'nostalgia.css' => 'CSS file for the nostalgia skin',
'cologneblue.css' => '{{optional}}',
'monobook.css' => '{{optional}}
CSS applied to users using Monobook skin.',
-'myskin.css' => '{{optional}}',
-'chick.css' => '{{optional}}',
-'simple.css' => '{{optional}}',
'modern.css' => '{{optional}}',
'vector.css' => '{{optional}}',
'print.css' => '{{optional}}',
-'handheld.css' => '{{optional}}
-Style that can be applied on [[w:handheld devices|handheld devices]] (e.g. mobile phones), <code>$wgHandheldStyle</code> is an optional configuration variable which specifies a style sheet file for handheld devices.',
'noscript.css' => '{{optional}}',
'group-autoconfirmed.css' => '{{doc-group|autoconfirmed|css}}',
'group-bot.css' => '{{doc-group|bot|css}}',
@@ -7568,14 +7862,9 @@ Style that can be applied on [[w:handheld devices|handheld devices]] (e.g. mobil
# Scripts
'common.js' => '{{optional}}
JS for all users.',
-'standard.js' => '{{optional}}',
-'nostalgia.js' => 'JS file for the nostalgia skin',
'cologneblue.js' => '{{optional}}',
'monobook.js' => '{{optional}}
JS for users using Monobook skin.',
-'myskin.js' => '{{optional}}',
-'chick.js' => '{{optional}}',
-'simple.js' => '{{optional}}',
'modern.js' => '{{optional}}',
'vector.js' => '{{optional}}',
'group-autoconfirmed.js' => '{{doc-group|autoconfirmed|js}}',
@@ -7798,14 +8087,8 @@ See also:
* {{msg-mw|Pageinfo-category-subcats}}',
# Skin names
-'skinname-standard' => '{{optional}}
-{{Identical|Classic}}',
-'skinname-nostalgia' => 'Name of Nostalgia skin',
'skinname-cologneblue' => '{{optional}}',
'skinname-monobook' => '{{optional}}',
-'skinname-myskin' => '{{optional}}',
-'skinname-chick' => '{{optional}}',
-'skinname-simple' => '{{optional}}',
'skinname-modern' => '{{optional}}',
'skinname-vector' => '{{optional}}',
@@ -8054,6 +8337,8 @@ See also {{msg-mw|hours-abbrev}}, {{msg-mw|hours-ago}}.',
See also {{msg-mw|Days-abbrev}}
{{Identical|Day}}',
+'weeks' => 'Full word for "weeks". Parameters:
+* $1 is the number of weeks',
'months' => 'Full word for "months". $1 is the number of months.',
'years' => 'Full word for "years".
@@ -8064,6 +8349,60 @@ Parameters:
{{Identical|Ago}}',
'just-now' => 'Phrase for indicating something happened just now.',
+# Human-readable timestamps
+'hours-ago' => 'Phrase for indicating that something occurred a certain number of hours ago.
+
+Parameters:
+* $1 - number of hours',
+'minutes-ago' => 'Phrase for indicating that something occurred a certain number of minutes ago.
+
+Parameters:
+* $1 - number of minutes',
+'seconds-ago' => 'Phrase for indicating that something occurred a certain number of seconds ago.
+
+Parameters:
+* $1 - number of seconds',
+'monday-at' => 'Phrase for indicating that something occurred at a particular time on the most recent Monday.
+
+Parameters:
+* $1 - the time (localized)
+{{Related|Day-at}}',
+'tuesday-at' => 'Phrase for indicating that something occurred at a particular time on the most recent Tuesday.
+
+Parameters:
+* $1 - the time (localized)
+{{Related|Day-at}}',
+'wednesday-at' => 'Phrase for indicating that something occurred at a particular time on the most recent Wednesday.
+
+Parameters:
+* $1 - the time (localized)
+{{Related|Day-at}}',
+'thursday-at' => 'Phrase for indicating that something occurred at a particular time on the most recent Thursday.
+
+Parameters:
+* $1 - the time (localized)
+{{Related|Day-at}}',
+'friday-at' => 'Phrase for indicating that something occurred at a particular time on the most recent Friday.
+
+Parameters:
+* $1 - the time (localized)
+{{Related|Day-at}}',
+'saturday-at' => 'Phrase for indicating that something occurred at a particular time on the most recent Saturday.
+
+Parameters:
+* $1 - the time (localized)
+{{Related|Day-at}}',
+'sunday-at' => 'Phrase for indicating that something occurred at a particular time on the most recent Sunday.
+
+Parameters:
+* $1 - the time (localized)
+{{Related|Day-at}}',
+'yesterday-at' => 'Phrase for indicating that something occurred at a particular time yesterday.
+
+Parameters:
+* $1 - the time (localized)
+{{Related|Day-at}}',
+
# Bad image list
'bad_image_list' => '箇æ¡ä¿¡æ¯åªå‡ºçŽ°åœ¨å¼•å¯¼ç®¡ç†å‘˜ç”¨æ­£ç¡®ä¸ªæ ¼å¼åŠ é“¾æŽ¥ã€‚弗会徕Mediawiki别è¡å¤„出现。',
@@ -8175,7 +8514,7 @@ Parameters:
'metadata-langitem-default' => '{{optional}}
Similar to "metadata-langitem" but for the case where a multilingual property has a default specified that does not specify what language the default is in. $1 is the value of the property.',
-# EXIF tags
+# Exif tags
'exif-imagewidth' => 'Exif is a format for storing metadata in image files. See this [[w:Exchangeable_image_file_format|Wikipedia article]] and the example at the bottom of [[commons: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].
{{Identical|Width}}',
'exif-imagelength' => 'Exif is a format for storing metadata in image files. See this [[w:Exchangeable_image_file_format|Wikipedia article]] and the example at the bottom of [[commons: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].
@@ -8628,7 +8967,7 @@ Parameters:
* $1 - numeric IPTC subject news code (one of http://cv.iptc.org/newscodes/subjectcode )
* $2 - one of 17 broad categories that the code falls into. For example any code starting with 15 has the contents of {{msg-mw|Exif-iimcategory-spo}} for $2.',
-# EXIF attributes
+# Exif attributes
'exif-compression-1' => '{{Related|Exif-compression}}',
'exif-compression-2' => '{{Related|Exif-compression}}',
'exif-compression-3' => '{{Related|Exif-compression}}',
@@ -9196,7 +9535,6 @@ px is the abbreviation for "pixel".',
'comma-separator' => '{{optional}}',
'colon-separator' => "{{optional}}
Change it only if your language uses another character for ':' or it needs an extra space before the colon.",
-'autocomment-prefix' => '{{optional}}',
'pipe-separator' => '{{optional}}',
'word-separator' => '{{optional}}
This is a string which is (usually) put between words of the language. It is used, e.g. when messages are concatenated (appended to each other). Note that you must express a space as html entity &amp;#32; because the editing and updating process strips leading and trailing spaces from messages.
@@ -9552,7 +9890,6 @@ This message is followed by the list of SPAM prevention extensions.',
'version-mediahandlers' => 'Used in [[Special:Version]]. It is the title of a section for media handler extensions (e.g. [[mw:Extension:OggHandler]]).
There are no such extensions here, so look at [[wikipedia:Special:Version]] for an example.',
'version-hooks' => 'Shown in [[Special:Version]]',
-'version-extension-functions' => 'Shown in [[Special:Version]]',
'version-parser-extensiontags' => 'Part of [[Special:Version]].
This message is followed by the list of parser extension tags like <code><nowiki><charinsert></nowiki></code>, <code><nowiki><coordinates></nowiki></code>, etc.',
'version-parser-function-hooks' => 'Shown in [[Special:Version]]',
@@ -9574,6 +9911,11 @@ Used in [[Special:Version]], preceeding the Subversion revision numbers of the e
* $1 - the current year
* $2 - a list of selected MediaWiki authors',
'version-poweredby-others' => "Used at the end of {{msg-mw|version-poweredby-credits}} on [[Special:Version]]. First, there's a long list of selected MediaWiki authors, then a comma and then this translation, which is supposed to credit the many other people than developer helping with MediaWiki.",
+'version-poweredby-translators' => 'Used as label for a link to [[Translating:MediaWiki/Credits]].
+
+Preceded by {{msg-mw|version-poweredby-others}} and {{msg-mw|and}}.
+
+Used at the end of {{msg-mw|version-poweredby-credits}} on [[Special:Version]].',
'version-credits-summary' => 'Summary of the [[Special:Version/Credits]] sub page, which lists all developers etc. who contributed to MediaWiki. Shown at the top.',
'version-license-info' => '[[wikipedia:GNU GPL|GNU GPL]] notice shown at [[Special:Version]]. See //www.gnu.org/licenses/old-licenses/gpl-2.0-translations.html for available translations.',
'version-software' => 'Message shown on [[Special:Version]].
@@ -9590,14 +9932,29 @@ A short description of the article path entry point. Links to the mediawiki.org
'version-entrypoints-scriptpath' => '{{Optional}}
A short description of the script path entry point. Links to the mediawiki.org documentation page for $wgScriptPath.',
-# Special:FilePath
-'filepath' => 'Legend of fieldset around input box in [[Special:FilePath]].',
-'filepath-page' => 'Shown next to input box in [[Special:FilePath]]
-
-{{Identical|File}}',
-'filepath-submit' => 'Button label in [[Special:FilePath]].
+# Special:Redirect
+'redirect' => "{{doc-special|Redirect}}
+This means \"Redirect by file'''name''', user '''ID''', or revision ID\".",
+'redirect-legend' => 'Legend of fieldset around input box in [[Special:Redirect]]',
+'redirect-summary' => 'Shown at top of [[Special:Redirect]]',
+'redirect-submit' => 'Button label in [[Special:Redirect]].
{{Identical|Go}}',
-'filepath-summary' => 'Shown in [[Special:FilePath]]',
+'redirect-lookup' => 'First field label in [[Special:Redirect]].
+
+Followed by the select box which has the following options:
+* {{msg-mw|Redirect-user}}
+* {{msg-mw|Redirect-revision}}
+* {{msg-mw|Redirect-file}}',
+'redirect-value' => 'Second field label in [[Special:Redirect]]
+{{Identical|Value}}',
+'redirect-user' => 'Description of lookup type for [[Special:Redirect]].
+{{Identical|User ID}}',
+'redirect-revision' => "Description of lookup type for [[Special:Redirect]].
+
+This means \"Page revision '''ID'''\".",
+'redirect-file' => 'Description of lookup type for [[Special:Redirect]].
+{{Identical|Filename}}',
+'redirect-not-exists' => 'Used as error message in [[Special:Redirect]]',
# Special:FileDuplicateSearch
'fileduplicatesearch' => 'Name of special page [[Special:FileDuplicateSearch]].',
@@ -9673,12 +10030,33 @@ It appears that the word 'valid' describes 'tags', not 'change'. It also appears
'tag-filter-submit' => 'Caption of the submit button displayed next to the tag filter on lists of changes (e.g. [[Special:Log]], [[Special:Contributions]], [[Special:Newpages]], [[Special:Recentchanges]], [[Special:Recentchangeslinked]], page histories)
{{Identical|Filter}}',
+'tag-list-wrapper' => 'Wrapper for the list of tags shown on recent changes, watchlists, history pages and diffs.
+
+Parameters:
+* $1 - number of distinct tags for given edit
+* $2 - comma-separated list of tags for given edit',
'tags-title' => 'The title of [[Special:Tags]]',
'tags-intro' => 'Explanation on top of [[Special:Tags]]. For more information on tags see [[mw:Manual:Tags|MediaWiki]].',
'tags-tag' => 'Caption of a column in [[Special:Tags]]. For more information on tags see [[mw:Manual:Tags|MediaWiki]].',
'tags-display-header' => 'Caption of a column in [[Special:Tags]]. For more information on tags see [[mw:Manual:Tags|MediaWiki]].',
'tags-description-header' => 'Caption of a column in [[Special:Tags]]. For more information on tags see [[mw:Manual:Tags|MediaWiki]].',
+'tags-active-header' => 'Caption of a column in [[Special:Tags]]. Values are "Yes" or "No" to indicate if a tag that was ever used is current still registered.
+
+See example: [[mw:Special:Tags]].
+
+For more information on tags see [[mw:Manual:Tags|MediaWiki]].
+{{Identical|Active}}',
'tags-hitcount-header' => 'Caption of a column in [[Special:Tags]]. For more information on tags see [[mw:Manual:Tags|MediaWiki]].',
+'tags-active-yes' => 'Table cell contents if given tag is "active".
+
+See also:
+* {{msg-mw|Tags-active-no}}
+{{Identical|Yes}}',
+'tags-active-no' => 'Table cell contents if given tag is not "active".
+
+See also:
+* {{msg-mw|Tags-active-yes}}
+{{Identical|No}}',
'tags-edit' => 'Used on [[Special:Tags]]. Verb. Used as display text on a link to create/edit a description.
{{Identical|Edit}}',
'tags-hitcount' => 'Shown in the "{{msg-mw|Tags-hitcount-header}}" column in [[Special:Tags]]. For more information on tags see [[mw:Manual:Tags|MediaWiki]].
@@ -9710,6 +10088,10 @@ Parameters:
* $1 - database server name
See also:
* {{msg-mw|Dberr-info-hidden}} - hides database server name',
+'dberr-info-hidden' => 'This message does not allow any wiki nor html markup.
+
+See also:
+* {{msg-mw|Dberr-info}} - shows database server name',
'dberr-usegoogle' => 'This message does not allow any wiki nor html markup.',
'dberr-outofdate' => "{{doc-singularthey}}
In this sentence, '''their''' indexes refers to '''Google's''' indexes. This message does not allow any wiki nor html markup.",
@@ -9783,6 +10165,11 @@ See also:
* stub threshold (appearance tab)
{{Identical|Other}}',
+'htmlform-no' => 'Used in form, such as with radio buttons, for generic yes / no questions.
+{{Identical|No}}',
+'htmlform-yes' => 'Used in form, such as with radio buttons, for generic yes / no questions.
+{{Identical|Yes}}',
+'htmlform-chosen-placeholder' => 'Used as initial placeholder text in select multiple "chosen" input boxes',
# SQLite database support
'sqlite-has-fts' => 'Shown on [[Special:Version]].
@@ -10056,4 +10443,59 @@ Parameters:
'rotate-comment' => 'Edit summary for the act of rotating an image. Parameters:
* $1 - degrees to rotate image clockwise',
+# Limit report
+'limitreport-title' => 'Title for the preview limit report table.',
+'limitreport-cputime' => 'Label for the "CPU time usage" row in the limit report table.
+
+See also:
+* {{msg-mw|Limitreport-walltime}}',
+'limitreport-cputime-value' => 'Format for the "CPU time usage" value in the limit report table. Parameters:
+* $1 - the time usage in seconds
+{{Identical|Second}}',
+'limitreport-walltime' => 'Label for the "Real time usage" row in the limit report table.
+
+See also:
+* {{msg-mw|Limitreport-cputime}}',
+'limitreport-walltime-value' => 'Format for the "Real time usage" value in the limit report table. Parameters:
+* $1 - the time usage in seconds
+{{Identical|Second}}',
+'limitreport-ppvisitednodes' => 'Label for the "Preprocessor visited node count" row in the limit report table',
+'limitreport-ppvisitednodes-value' => '{{optional}}
+Format for the "Preprocessor visited node count" row in the limit report table.
+
+Parameters:
+* $1 - the usage
+* $2 - the maximum',
+'limitreport-ppgeneratednodes' => 'Label for the "Preprocessor generated node count" row in the limit report table',
+'limitreport-ppgeneratednodes-value' => '{{optional}}
+Format for the "Preprocessor generated node count" row in the limit report table.
+
+Parameters:
+* $1 - the usage
+* $2 - the maximum',
+'limitreport-postexpandincludesize' => 'Label for the "Post-expand include size" row in the limit report table',
+'limitreport-postexpandincludesize-value' => 'Format for the "Post-expand include size" row in the limit report table. Parameters:
+* $1 - the usage (in bytes)
+* $2 - the maximum (in bytes)',
+'limitreport-templateargumentsize' => 'Label for the "Template argument size" row in the limit report table',
+'limitreport-templateargumentsize-value' => 'Format for the "Template argument size" row in the limit report table.
+
+Parameters:
+* $1 - the usage (in bytes)
+* $2 - the maximum (in bytes)',
+'limitreport-expansiondepth' => 'Label for the "Highest expansion depth" row in the limit report table',
+'limitreport-expansiondepth-value' => '{{optional}}
+Format for the "Highest expansion depth" row in the limit report table.
+
+Parameters:
+* $1 - the depth
+* $2 - the maximum',
+'limitreport-expensivefunctioncount' => 'Label for the "Expensive parser function count" row in the limit report table',
+'limitreport-expensivefunctioncount-value' => '{{optional}}
+Format for the "Expensive parser function count" row in the limit report table.
+
+Parameters:
+* $1 - the usage
+* $2 - the maximum',
+
);
diff --git a/languages/messages/MessagesQu.php b/languages/messages/MessagesQu.php
index f5a570da..c03c5bf8 100644
--- a/languages/messages/MessagesQu.php
+++ b/languages/messages/MessagesQu.php
@@ -272,12 +272,12 @@ $messages = array(
'tog-hidepatrolled' => "Patrullasqa llamk'apusqakunata ñaqha hukchasqapi pakay",
'tog-newpageshidepatrolled' => "Patrullasqa llamk'apusqakunata musuq p'anqakunapi pakay",
'tog-extendwatchlist' => "Watiqana sutisuyuta tukuy rurachinalla hukchaykunaman mast'ay, ama lliwmanta aswan ñaqhallachu",
-'tog-usenewrc' => "Huñu hukchasqakuna p'anqallakama ñaqha hukchasqakunapi watiqasqakunapipas (JavaScript nisqallawanmi llamk'an)",
+'tog-usenewrc' => "Huñu hukchasqakuna p'anqallakama ñaqha hukchasqakunapi watiqasqakunapipas",
'tog-numberheadings' => "Uma siq'ikunata kikinmanta yupay",
'tog-showtoolbar' => "Llamk'apuna sillwita rikuchiy",
-'tog-editondblclick' => "P'anqakunata llamk'apuy iskaylla ñit'iywan (JavaScript)",
+'tog-editondblclick' => "P'anqakunata llamk'apuy iskaylla ñit'iywan",
'tog-editsection' => "Rakirilla llamk'apuyta saqillay [qillqay] t'inkiwan",
-'tog-editsectiononrightclick' => "Rakirilla llamk'apuyta saqillay paña butunta rakirip sutinpi ñit'ispa (JavaScript)",
+'tog-editsectiononrightclick' => "Rakirilla llamk'apuyta saqillay paña butunta rakirip sutinpi ñit'ispa",
'tog-showtoc' => "Yuyarina wachuchasqata rikuchiy (kimsamanta aswan uma siq'iyuq p'anqakunapaq)",
'tog-rememberpassword' => "Ruraqpa sutiyta yaykuna rimaytapas yuyaykuy kay llika wamp'unapi ({{PLURAL:$1|huk p'unchawkama|$1 p'unchawkama}})",
'tog-watchcreations' => "Qallarisqay p'anqakunata churkusqay willañiqikunatapas watiqay",
@@ -295,10 +295,7 @@ $messages = array(
'tog-shownumberswatching' => "Rikuchiy hayk'a watiqaq ruraqkuna",
'tog-oldsig' => "Kachkaqña silq'uy:",
'tog-fancysig' => "Silq'uyta wiki qillqa hinata llamk'achiy (mana kikinmanta t'inkichaq silq'uy)",
-'tog-externaleditor' => "Kikinmanta hawa llamk'apunata llamk'achiy (kamayuqkunallapaq, antañiqiqniykipi sapaq allinkachinakuna kananmi. [//www.mediawiki.org/wiki/Manual:External_editors Astawan ñawiriy.])",
-'tog-externaldiff' => "Kikinmanta hawa ''diff'' (wakin kay) nisqata llamk'achiy (kamayuqkunallapaq, antañiqiqniykipi sapaq allinkachinakuna kananmi. [//www.mediawiki.org/wiki/Manual:External_editors Astawan ñawiriy.])",
-'tog-showjumplinks' => "«Chayman phinkiy» aypanalla t'inkikunata saqillay",
-'tog-uselivepreview' => "''Live preview'' nisqa ñawpaq qhawayta llamk'achiy (JavaScript) (llamiy aknaraq)",
+'tog-uselivepreview' => "''Live preview'' nisqa ñawpaq qhawayta llamk'achiy (llamiy aknaraq)",
'tog-forceeditsummary' => "Ch'usaq llamk'apuy waqaychasqa kachkaptinqa ch'itiyay.",
'tog-watchlisthideown' => "Watiqasqaykunapiqa ñuqap llamk'apusqaykunata pakay",
'tog-watchlisthidebots' => "Watiqasqaykunapiqa rurana antachakunap llamk'apusqankunata pakay",
@@ -311,6 +308,8 @@ $messages = array(
'tog-showhiddencats' => 'Pakasqa katiguriyakunata rikuchiy',
'tog-noconvertlink' => "T'inki suti t'ikrayman ama niy",
'tog-norollbackdiff' => 'Ruraqpa hukchasqankunata kutichispa ama wakin kayta willaychu',
+'tog-useeditwarning' => "Yuyampaway p'anqata saqiptiy manaraq rurarqusqay hukchasqakunata waqaychaspay.",
+'tog-prefershttps' => "Yaykurqaspaqa hayk'appas takyasqa t'inkiwan llamk'ay",
'underline-always' => "Hayk'appas",
'underline-never' => "Mana hayk'appas",
@@ -374,6 +373,18 @@ $messages = array(
'oct' => 'ukt',
'nov' => 'nuw',
'dec' => 'dis',
+'january-date' => '$1 ñiqin inirupi',
+'february-date' => '$1 ñiqin phiwrirupi',
+'march-date' => '$1 ñiqin marsupi',
+'april-date' => '$1 ñiqin awrilpi',
+'may-date' => '$1 ñiqin mayukillapi',
+'june-date' => '$1 ñiqin hunyupi',
+'july-date' => '$1 ñiqin hulyupi',
+'august-date' => '$1 ñiqin awustupi',
+'september-date' => '$1 ñiqin sitimripi',
+'october-date' => '$1 ñiqin uktuwripi',
+'november-date' => '$1 ñiqin nuwimripi',
+'december-date' => '$1 ñiqin disimripi',
# Categories related messages
'pagecategories' => '{{PLURAL:$1|Katiguriya|Katiguriyakuna}}',
@@ -399,7 +410,7 @@ $messages = array(
'newwindow' => '(Musuq wintanam kichakun)',
'cancel' => 'Ama niy',
'moredotdotdot' => 'Aswan...',
-'morenotlisted' => 'Aswanqa sutisuyupi manam kanchu...',
+'morenotlisted' => "Kay sutisuyuqa manaraqmi hunt'asqachu.",
'mypage' => "P'anqay",
'mytalk' => 'Rimachinay',
'anontalk' => 'Kay IP huchhapaq rimanakuy',
@@ -455,6 +466,7 @@ $messages = array(
'create-this-page' => "Kay p'anqata kamariy",
'delete' => 'Qulluy',
'deletethispage' => "Kay p'anqata qulluy",
+'undeletethispage' => "Kay p'anqata qullusqamanta paqarichiy",
'undelete_short' => "Paqarichiy {{PLURAL:$1|huk llamk'apusqa|$1 llamk'apusqa}}",
'viewdeleted_short' => '{{PLURAL:$1|qullusqa hukchasqa|$1 qullusqa hukchasqa}} qhaway',
'protect' => 'Amachay',
@@ -498,17 +510,16 @@ $1",
'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).
+# 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).
'aboutsite' => '{{SITENAME}}manta',
'aboutpage' => 'Project:{{SITENAME}}manta',
-'copyright' => "Ch'aqtasqakunataqa llamk'achinkiman <i>$1</i> nisqap ruraq hayñinkama",
+'copyright' => "Samiqwanqa llamk'ankiman $1 nisqa ruraq hayñikama, mana wakin hina willaptinqa.",
'copyrightpage' => '{{ns:project}}:Ruraqpa hayñin',
'currentevents' => 'Kunan pacha',
'currentevents-url' => 'Project:Kunan pacha',
'disclaimers' => 'Chiqakunamanta rikuchiy',
'disclaimerpage' => 'Project:Sapsilla saywachasqa paqtachiy',
'edithelp' => "Llamk'ana yanapay",
-'edithelppage' => 'Help:Qillqa yanapay',
'helppage' => 'Help:Yanapana',
'mainpage' => "Qhapaq p'anqa",
'mainpage-description' => "Qhapaq p'anqa",
@@ -585,17 +596,6 @@ Allin sapaq p'anqakunataqa tarinki [[Special:SpecialPages|Sapaq p'anqakuna]] nis
# General errors
'error' => 'Pantasqa',
'databaseerror' => 'Willañiqintin pantasqa',
-'dberrortext' => 'Willañiqimanta mañakuptiyki sintaksis pantasqam tukurqan.
-Llamp\'u kaq wakichipi pantasqachá.
-Qayna willañiqimanta mañakusqaqa karqan kaypacham:
-<blockquote><code>$1</code></blockquote>
-kay ruraypim: "<code>$2</code>".
-Willañiqintinpa kutichisqan pantasqaqa karqan "<samp>$3: $4</samp>".',
-'dberrortextcl' => 'Willañiqimanta mañakuptiyki sintaksis pantasqam tukurqan.
-Qayna willañiqimanta mañakusqaqa karqan kaymi:
-"$1"
-kay ruraymantam: "$2".
-MySQL-pa kutichisqan pantasqaqa karqan "$3: $4".',
'laggedslavemode' => "'''Paqtataq''': Kay p'anqapiqa manaraqchá kachkanchu aswan qayna musuqchasqakuna.",
'readonly' => "Willañiqintinqa hark'asqam",
'enterlockreason' => "Qillqamuy imarayku hark'asqa karqan, hayk'appas manañachá hark'asqachu kanqa",
@@ -649,12 +649,13 @@ Tukuy wikikunapi uyapuraman t'ikrasqakunata yapayta icha hukchayta munaspaykiqa,
'editinginterface' => "'''Paqtataq:''' Llamp'u kaqpaq uyapura qillqakuna ruranapaq p'anqatam llamk'apuchkanki.
Hukchaptiykiqa, chay uyapurap rikch'ayninqa hukyanqa kay wikipi huk ruraqkunapaqpas.
Uyapuraman t'ikrasqakunata yapayta icha hukchayta munaspaykiqa, [//translatewiki.net/wiki/Main_Page?setlang=qu translatewiki.net] nisqa MediaWiki t'ikrana ruraykamay llika tiyaypi ruranaykimanta hamut'ariy.",
-'sqlhidden' => '(SQL tapunaqa pakasqam)',
'cascadeprotected' => "Kay p'anqaqa amachasqam kachkan, ''phaqcha'' nisqa kamachiwan amachasqa kay {{PLURAL:$1|p'anqapi|p'anqakunapi}} ch'aqtasqa kaspanmi:
$2",
'namespaceprotected' => "'''$1''' nisqa suti k'ititaqa llamk'apuyta manam saqillasunkichu.",
'customcssprotected' => "Manam saqillasunkichu kay CSS p'anqata llamk'apuyta, huk ruraqpa kikin tiyachisqankunayuq kaptinmi.",
'customjsprotected' => "Manam saqillasunkichu kay JavaScript p'anqata llamk'apuyta, huk ruraqpa kikin tiyachisqankunayuq kaptinmi.",
+'mycustomcssprotected' => "Kay CSS p'anqataqa manam llamk'apuyta atinkichu.",
+'mycustomjsprotected' => "Kay JavaScript p'anqataqa manam llamk'apuyta atinkichu.",
'ns-specialprotected' => "{{ns:special}} suti k'itipi p'anqakunaqa manam llamk'apunallachu.",
'titleprotected' => "Kay p'anqa sutitaqa [[User:$1|$1]] sutiyuq ruraq kamariymanta hark'arqanmi, kayraykum nispa: ''$2''.",
'filereadonlyerror' => 'Manam atinichu "$1" sutiyuq willañiqita hukchayta, "$2" sutiyuq willañiqi churamuna ñawirillanapaq kachkaptinmi.
@@ -673,15 +674,23 @@ Amachaq kamachiqqa kayrayku amachani nispa nirqanmi: "$3".',
# Login and logout pages
'logouttext' => "'''Llamk'apuy tiyayniykiqa puchukasqañam.'''
-Sutinnaq kaspaykipas {{SITENAME}}pi wamp'uytam atinki. Mana hinataq munaspaykiqa, <span class='plainlinks'>[$1 musuqmanta yaykuy]</span> ñawpaq icha huk sutiwan. Huk p'anqakunaqa kaqllam rikch'akunqa, ''cache'' nisqa pakasqa hallch'ata mana ch'usaqchaptiykiqa.",
+Huk p'anqakunaqa kaqllam rikch'akunqa, ''cache'' nisqa pakasqa hallch'ata mana ch'usaqchaptiykiqa.",
'welcomeuser' => 'Allinmi hamusqayki, $1!',
'welcomecreation-msg' => 'Rakiqunaykiqa kamarisqañam.
Ama qunqaychu [[Special:Preferences|{{SITENAME}} allinkachinaykikunata]] hukchayta.',
'yourname' => 'Ruraq sutiyki:',
+'userlogin-yourname' => 'Ruraqpa sutin',
+'userlogin-yourname-ph' => 'Ruraqpa sutiykita yaykuchiy',
'yourpassword' => 'Yaykuna rimayki',
+'userlogin-yourpassword' => 'Yaykuna rima',
+'userlogin-yourpassword-ph' => 'Yaykuna rimaykita yaykuchiy',
+'createacct-yourpassword-ph' => 'Yaykuna rimata yaykuchiy',
'yourpasswordagain' => 'Yaykuna rimaykita kutipayay',
+'createacct-yourpasswordagain' => 'Yaykuna rimata takyachiy',
+'createacct-yourpasswordagain-ph' => 'Yaykuna rimata musuqmanta yaykuchiy',
'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",
+'userlogin-remembermypassword' => 'Yaykusqa kakunaytam munani',
+'userlogin-signwithsecure' => "Amachasqa t'inkinakusqata llamk'achiy",
'yourdomainname' => 'Duminyuykip sutin',
'password-change-forbidden' => 'Kay wikipi yaykuna rimataqa manam hukchayta atinkichu.',
'externaldberror' => 'Hawa yaykuna pantasqam karqan, ichataq manam saqillasunkichu hawa rakiqunaykita musuqchayta.',
@@ -693,18 +702,38 @@ Ama qunqaychu [[Special:Preferences|{{SITENAME}} allinkachinaykikunata]] hukchay
'logout' => 'Lluqsiy',
'userlogout' => 'Lluqsiy',
'notloggedin' => 'Manam yaykurqankichu',
+'userlogin-noaccount' => 'Rakiqunaykiri manachu kanchu?',
+'userlogin-joinproject' => '{{SITENAME}}man yaykuy',
'nologin' => "Manaraqchu rakiqunaykichu kachkan? '''$1'''.",
'nologinlink' => 'Kichariy',
'createaccount' => 'Musuq rakiqunata kichariy',
'gotaccount' => "Rakiqunaykiñachu kachkan? '''$1'''.",
'gotaccountlink' => 'Rakiqunaykita willaway',
'userlogin-resetlink' => 'Yaykuna willayniykikunatari qunqarqankichu?',
-'createaccountmail' => "Kikinmanta tukusqa mit'alla yaykuna rimata llamk'achispa kay qatiqpi kaq e-chaski imamaytaman kachay",
+'userlogin-resetpassword-link' => 'Yaykuna rimaykita kutichiy',
+'helplogin-url' => 'Help:Yaykuy',
+'userlogin-helplink' => '[[{{MediaWiki:helplogin-url}}|Yaykunapaq yanapa]]',
+'createacct-join' => 'Kay qatiqpi willaykita yaykuchiy.',
+'createacct-emailrequired' => 'E-chaski imamayta',
+'createacct-emailoptional' => 'E-chaski imamayta (munaspayki)',
+'createacct-email-ph' => 'E-chaski imamaytaykita yaykuchiy',
+'createaccountmail' => "Kikinmanta tukusqa mit'alla yaykuna rimata llamk'achispa akllasqa e-chaski imamaytaman kachay",
+'createacct-realname' => 'Chiqap suti (munaspayki)',
'createaccountreason' => 'Kayrayku:',
+'createacct-reason' => 'Kayrayku',
+'createacct-reason-ph' => 'Imaraykutaq huk rakiqunata kamarichkanki',
+'createacct-captcha' => 'Amachana llanchiy',
+'createacct-imgcaptcha-ph' => 'Hanaqpi rikusqayki qillqata yaykuchiy',
+'createacct-submit' => 'Rakiqunaykita kamariy',
+'createacct-benefit-heading' => '{{SITENAME}}taqa qam hina runakunam ruran.',
+'createacct-benefit-body1' => "{{PLURAL:$1|llamk'apusqa|llamk'apusqakuna}}",
+'createacct-benefit-body2' => "{{PLURAL:$1|p'anqa|p'anqakuna}}",
+'createacct-benefit-body3' => "{{PLURAL:$1|llamk'apuq|llamk'apuqkuna}}",
'badretype' => 'Qusqayki yaykuna rimakunaqa manam kaqllachu.',
'userexists' => 'Munasqayki ruraqpa sutiykiqa kachkanñam.
Ama hina kaspa, huk ruraqpa sutiykita akllay.',
'loginerror' => "Pantasqa llamk'apuy tiyaypa qallarisqan",
+'createacct-error' => 'Rakiquna kamariy pantasqa',
'createaccounterror' => 'Manam atinichu rakiqunata kamariyta: $1',
'nocookiesnew' => "Ruraqpa rakiqunaykiqa kichasqañam, ichataq manaraqmi yaykurqankichu. {{SITENAME}}qa <em>kuki</em> nisqakunatam llamk'achin ruraqkunata kikinyachinapaq. Antañiqiqniykipiqa manam <em>kuki</em> nisqakuna atinchu. Ama hina kaspa, atichispa huk kutita yaykuykachay.",
'nocookieslogin' => "{{SITENAME}} <em>kuki</em> nisqakunata llamk'achin ruraqkunata kikinyachinapaq. Antañiqiqniykipiqa manam <em>kuki</em> nisqakuna atinchu. Ama hina kaspa, atichispa huk kutita ruraykachay.",
@@ -755,7 +784,7 @@ Ama hina kaspa, chaskispaykiqa ruraqpa sutiykita nispa musuqmanta yaykuy.',
Kay willay pantasqa kaptinqa, qhawarparillay.',
'usernamehasherror' => 'Ruraqpa sutinqa ama iskaychakana (<nowiki>#</nowiki>) sananchayuqchu kachun',
-'login-throttled' => 'Nisyu kutitachá kay rakiqunapaq yaykuna rimawan ñaqha yaykuykachanki. Ama hina kaspa, suyariy manaraq musuqmanta yaykuykachaspa.',
+'login-throttled' => 'Nisyu kutitachá kay rakiqunapaq yaykuna rimawan ñaqha yaykuykachanki. Ama hina kaspa, $1 suyariy manaraq musuqmanta yaykuykachaspa.',
'login-abort-generic' => 'Yaykuykachaspayki manam ayparqankichu - Allqasqa',
'loginlanguagelabel' => 'Rimay: $1',
'suspicious-userlogout' => "Lluqsiy mañakuyniykiqa mananchasqam karqan, waqllisqa wamp'unamanta icha pakaq proksimanta kachasqa kaspanchá.",
@@ -774,7 +803,7 @@ Kay willay pantasqa kaptinqa, qhawarparillay.',
'newpassword' => 'Musuq yaykuna rima:',
'retypenew' => 'Musuq yaykuna rimaykita takyachiy:',
'resetpass_submit' => 'Yaykuna rimata hukchaspa yaykuy',
-'resetpass_success' => 'Yaykuna rimaykiqa hukchasqañam. Yaykamuchkankim...',
+'changepassword-success' => 'Yaykuna rimaykiqa aypalla hukchasqañam.',
'resetpass_forbidden' => 'Manam saqillanchu yaykuna rimata hukchayta',
'resetpass-no-info' => "Yaykunaykim tiyan kay p'anqata chiqalla aypanaykipaq.",
'resetpass-submit-loggedin' => 'Yaykuna rimata hukchay',
@@ -786,10 +815,11 @@ Yaykuna rimaykitaqa aypalla hukcharqunkiñachá icha huk mit'alla yaykuna rimata
# Special:PasswordReset
'passwordreset' => 'Yaykuna rimata kutichiy',
-'passwordreset-text' => "Kay hunt'ana p'anqata hunt'ay, yaykuna rimaykita kutichinaykipaq.",
+'passwordreset-text-one' => "Kay hunt'ana p'anqata hunt'ay, yaykuna rimaykita kutichinaykipaq.",
+'passwordreset-text-many' => "{{PLURAL:$1|Kay k'itichakunamanta hukta hunt'achiy, yaykuna rimaykita kutichinaykipaq.}}",
'passwordreset-legend' => 'Yaykuna rimata kutichiy',
'passwordreset-disabled' => 'Kay wikipiqa yaykuna rimata manam kutichiyta atinkichu.',
-'passwordreset-pretext' => '{{PLURAL:$1||Qatiqpi kaq willa rakikunamanta huktam yaykuchiy}}',
+'passwordreset-emaildisabled' => "Kay wikipiqa e-chaski llamk'anakunaman ama nisqam.",
'passwordreset-username' => 'Ruraqpa sutin:',
'passwordreset-domain' => 'Duminyu:',
'passwordreset-capture' => 'Llalliwaq e-chaskita qhawayta munankichu?',
@@ -820,7 +850,7 @@ kay willayta mana qhawaspa mana imatapas ruraspa ñawpaq yaykuna rimaykiwanmi ll
Mit'alla yaykuna rima: $2",
'passwordreset-emailsent' => 'Yaykuna rimata kutichina e-chaskiqa kachasqañam.',
'passwordreset-emailsent-capture' => 'Yaykuna rimata kutichina e-chaskiqa kachasqañam, kay qatiqpi rikunki.',
-'passwordreset-emailerror-capture' => 'Yuyachina e-chaskiqa rurasqa karqan, imatachus kay qatiqpi rikunki, ichataq kachasqa kaptin pantasqam tukurqan: $1',
+'passwordreset-emailerror-capture' => '{{GENDER:$2|}}Yaykuna rimata kutichina e-chaskiqa rurasqa karqan, imatachus kay qatiqpi rikunki, ichataq kachasqa kaptin pantasqam tukurqan: $1',
# Special:ChangeEmail
'changeemail' => 'E-chaski imamaytata wakinchay',
@@ -906,7 +936,7 @@ Astasqachá icha qullusqachá qhawachkaptiyki.',
'accmailtitle' => 'Yaykuna rimaqa kachasqañam.',
'accmailtext' => "Kikinmanta kamarisqa [[User talk:$1|$1]]-paq yaykuna rimaqa $2-manmi kachasqaña.
-Yaykurqaspaqa ''[[Special:ChangePassword|yaykuna rima hukchana]]'' p'anqapi kay musuq rakiqunapaq yaykuna rimata hukchaytam atinki.",
+Yaykurqaspaqa ''[[Special:ChangePassword|yaykuna rima hukchana]]'' p'anqapi kay yaykuna rimata hukchaytam atinki.",
'newarticle' => '(Musuq)',
'newarticletext' => "Manaraq kachkaq p'anqatam llamk'apuchkanki. Musuq p'anqata kamariyta munaspaykiqa, qillqarillay. Astawan ñawiriyta munaspaykiqa, [[{{MediaWiki:Helppage}}|yanapana p'anqata]] qhaway. Mana munaspaykitaq, ñawpaq p'anqaman ripuy.",
'anontalkpagetext' => "---- ''Kayqa huk sutinnaq icha mana sutinta llamk'achiq ruraqpa rimanakuyninmi. IP huchhantam hallch'asunchik payta sutinchanapaq. Achka ruraqkunam huklla IP huchhanta llamk'achiyta atin. Sutinnaq ruraq kaspaykiqa, mana qampa rurasqaykimanta willamusqakunata rikuspaykiqa, ama hina kaspa [[Special:UserLogin/signup|rakiqunaykita kamariy]] icha [[Special:UserLogin|yaykuy]] huk sutinnaq ruraqkunawan ama pantasqa kanaykipaq.''",
@@ -998,7 +1028,7 @@ Hallch'api qhipaq kaq yaykuchisqataqa kay qatiqpim rikunki willasunaykipaq:",
'nocreate-loggedin' => "Manam saqillasunkichu musuq p'anqakunata kamariyta.",
'sectioneditnotsupported-title' => "Raki allichayqa manam q'imisqachu",
'sectioneditnotsupported-text' => "Raki allichayqa kay p'anqapi manam q'imisqachu.",
-'permissionserrors' => 'Saqillay pantasqakuna',
+'permissionserrors' => 'Saqillay pantasqa',
'permissionserrorstext' => 'Manam saqillasunkichu, {{PLURAL:$1|kayraykum|kayraykum}}:',
'permissionserrorstext-withaction' => 'Manam saqillasunkichu $2-ta, {{PLURAL:$1|kayraykum|kayraykum}}:',
'recreate-moveddeleted-warn' => "'''Paqtataq: Ñawpaqta qullusqaña p'anqatam musuqmanta kamarichkanki.'''
@@ -1014,12 +1044,15 @@ Manam nirqanchu imarayku.",
Qullusqachá.",
'edit-conflict' => "Tuylla llamk'apuymanta sasachakuy.",
'edit-no-change' => "Manapuni hukchaptiykim, llamk'apusqayki manam hallch'asqachu.",
+'postedit-confirmation' => "Llamk'apusqaykiqa waqaychasqañam.",
'edit-already-exists' => "Manam atinichu musuq p'anqata kamariyta.
Kachkañam.",
'defaultmessagetext' => 'Ñawpaq qillqa',
'content-failed-to-parse' => "Manam atinichu $2 samiqta $1 kikinchapaq t'ikrayta: $3",
'invalid-content-data' => 'Samiqmanta willaykunaqa manam allinchu',
'content-not-allowed-here' => '"$1" nisqa samiqqa [[$2]] sutiyuq p\'anqapi manam saqillasqachu',
+'editwarning-warning' => "Kay p'anqata saqispaykiqa lliw rurarqusqayki hukchasqakunatachá chinkachiykiman.
+Yaykusqa kaspaykiqa, kay yuyampayta hark'ayta atinki allinkachinaykikunapi \"Llamk'apusqa\" rakipi.",
# Content models
'content-model-wikitext' => 'wiki qillqa',
@@ -1080,8 +1113,8 @@ $3-qa nirqan kayraykum: ''$2''",
(ñawpaq) = ñawpaq kachkasqanwan huk kaykuna, a = aslla hukchasqa",
'history-fieldset-title' => 'Wiñay kawsaypi maskay',
'history-show-deleted' => 'Qullusqalla',
-'histfirst' => 'Ñawpaqkuna',
-'histlast' => 'Qhipaqkuna',
+'histfirst' => 'ñawpaqkuna',
+'histlast' => 'qhipaqkuna',
'historysize' => '({{PLURAL:$1|1 byte|$1 byte}})',
'historyempty' => "(ch'usaq)",
@@ -1258,7 +1291,6 @@ Imaymanata [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} qulluy ha
'searchmenu-legend' => 'Maskaypaq akllanakuna',
'searchmenu-exists' => "'''Kay wikipiqa «[[$1]]» sutiyuq p'anqam kachkan'''",
'searchmenu-new' => "'''Kay wikipi \"[[:\$1]]\" sutiyuq p'anqata kamariy!'''",
-'searchhelp-url' => 'Help:Yanapana',
'searchmenu-prefix' => "[[Special:PrefixIndex/$1|Kay ñawpa k'askaqchayuq huk p'anqakunata maskay]]",
'searchprofile-articles' => "Samiq p'anqakuna",
'searchprofile-project' => "Yanapanapaq ruraykamaypaqpas p'anqakuna",
@@ -1299,15 +1331,7 @@ Imaymanata [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} qulluy ha
'powersearch-togglenone' => 'Mana imapas',
'search-external' => 'Hawapi maskay',
'searchdisabled' => "{{SITENAME}} nisqapi maskaymanqa ama nisqam. Hinachkaptinqa, maskariy google nisqawan icha huk hawa maskanakunawan, ichataq yuyariy, {{SITENAME}}manta hallch'asqankunaqa manañachá musuqllachu.",
-
-# Quickbar
-'qbsettings' => 'Utqaytawna ("Quickbar") allinkachinakuna',
-'qbsettings-none' => 'Mana imapas',
-'qbsettings-fixedleft' => "Lluq'iman watay",
-'qbsettings-fixedright' => 'Pañaman watay',
-'qbsettings-floatingleft' => "Lluq'iman tuytuy",
-'qbsettings-floatingright' => 'Pañaman tuytuy',
-'qbsettings-directionality' => 'Watasqa, rimayniykip qillqa puririyninmanta wachariq',
+'search-error' => 'Maskaypiqa pantasqam tukurqan: $1',
# Preferences page
'preferences' => 'Allinkachinakuna',
@@ -1339,9 +1363,8 @@ Imaymanata [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} qulluy ha
'prefs-rendering' => "Rikch'akuynin",
'saveprefs' => 'Allinkachinakunata waqaychay',
'resetprefs' => 'Mana waqaychasqa hukchasqakunaman ama niy',
-'restoreprefs' => 'Tukuy kikinmanta allinkachinakunata kutichimuy',
+'restoreprefs' => 'Tukuy kikinmanta allinkachinakunata kutichimuy (tukuy rakirikunapi)',
'prefs-editing' => "Llamk'apusqa",
-'prefs-edit-boxsize' => "Llamk'apuna wintanap chhikan.",
'rows' => 'Sinrukuna:',
'columns' => 'Wachukuna:',
'searchresultshead' => 'Maskay',
@@ -1352,8 +1375,6 @@ Imaymanata [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} qulluy ha
'recentchangesdays-max' => "(ama $1-manta aswan {{PLURAL:$1|p'unchaw|p'unchaw}} kachunchu)",
'recentchangescount' => 'Rikuchina hukchasqakunap yupaynin, kikinmanta:',
'prefs-help-recentchangescount' => "Kaypiqa ñaqha hukchasqakunam, p'anqap wiñay kawsayninkunam, hallch'akunapas.",
-'prefs-help-watchlist-token' => "Kay k'itichata pakasqa llawiwan hunt'aspaykiqa, watiqasqaykikunapaq RSS mikhuchinatam kamarinki.
-Pi kay k'itichapi llawiykita riqsiqpas watiqasqaykikunata ñawiriytam atinqa. Chayrayku takyaq chanita akllay. Kaypiqa kikinmanta kamarisqa akllanallayki chanitam rikunki: $1",
'savedprefs' => "Allinkachinaykikunaqa hallch'asqañam.",
'timezonelegend' => "Pacha t'urpi:",
'localtime' => 'Tiyaylla pacha:',
@@ -1384,7 +1405,6 @@ Pi kay k'itichapi llawiykita riqsiqpas watiqasqaykikunata ñawiriytam atinqa. Ch
'prefs-reset-intro' => "Kay p'anqataqa llamk'achiyta atinki allinkachinaykikunata kikinmanta kasqaman kutichinaykipaq.
Chaytataq manam kutichiyta atinkichu.",
'prefs-emailconfirm-label' => 'E-chaskita takyachiy:',
-'prefs-textboxsize' => "Llamk'apuna wintanap chhikan kaynin",
'youremail' => 'E-chaski imamaytayki',
'username' => '{{GENDER:$1|Ruraqpa sutin}}:',
'uid' => '{{GENDER:$1|Ruraqpa}} ID-nin:',
@@ -1399,11 +1419,11 @@ Chaytataq manam kutichiyta atinkichu.",
'badsig' => "Chawa silq'usqaykiqa manam allinchu; HTML sananchakunata llanchiy.",
'badsiglength' => 'Chutu sutiykiqa nisyu sunim.
$1 {{PLURAL:$1|sanampamanta|sanampakunamanta}} aswan pisi kananmi.',
-'yourgender' => 'Qhari icha warmi:',
-'gender-unknown' => 'Mana riqsisqa',
-'gender-male' => 'Qhari',
-'gender-female' => 'Warmi',
-'prefs-help-gender' => "Munaspaykiqa: llamp'u kaqpa allinlla warmi icha qhari nispa napaykusunaykipaq. Kay willayqa sapsim kanqa.",
+'yourgender' => 'Ima hina nisunkikutaq munanki?',
+'gender-unknown' => 'Manam willayta munanichu',
+'gender-male' => "Qharim wikita llamk'apun",
+'gender-female' => "Warmim wikita llamk'apun",
+'prefs-help-gender' => "Munaspaykiqa: llamp'u kaqpa allinlla warmi icha qhari nispa napaykusunaykipaq huk runakunaman willananpaqpas. Kay willayqa sapsim kanqa.",
'email' => 'E-chaski',
'prefs-help-realname' => "* Chiqap sutiyki (munaspaqa): quwaptiykiqa, llamk'apusqaykikunam paywan sananchasqa kanqa.",
'prefs-help-email' => 'E-chaskita munaspayki akllayta atinki. Arí nispaykiqa, yaykuna rimata qunqaspayki musuq yaykuna rimata e-chaski imamaytaykiman kachachikamuyta atinki.',
@@ -1414,7 +1434,7 @@ $1 {{PLURAL:$1|sanampamanta|sanampakunamanta}} aswan pisi kananmi.',
'prefs-signature' => "Silq'uy",
'prefs-dateformat' => "P'unchaw rikch'ay",
'prefs-timeoffset' => 'Pacha wakinyay',
-'prefs-advancedediting' => 'Ñawparikusqa akllanakuna',
+'prefs-advancedediting' => 'Sapsi akllanakuna',
'prefs-advancedrc' => 'Ñawparikusqa akllanakuna',
'prefs-advancedrendering' => 'Ñawparikusqa akllanakuna',
'prefs-advancedsearchoptions' => 'Ñawparikusqa akllanakuna',
@@ -1449,6 +1469,7 @@ $1 {{PLURAL:$1|sanampamanta|sanampakunamanta}} aswan pisi kananmi.',
'userrights-notallowed' => 'Qampa rakiqunaykiwanqa manam ruraqkunap hayñinkunata yapayta icha qichuyta atinkichu.',
'userrights-changeable-col' => 'Hukchanayki huñukuna',
'userrights-unchangeable-col' => 'Mana hukchanayki huñukuna',
+'userrights-conflict' => 'Ruraqpa hayñin hukchay tupanakuymi. Ama hina kaspa, hukchasqaykikunata musuqmanta quy.',
# Groups
'group' => 'Huñu:',
@@ -1492,7 +1513,7 @@ $1 {{PLURAL:$1|sanampamanta|sanampakunamanta}} aswan pisi kananmi.',
'right-reupload-shared' => 'Rakinakusqa midya waqaychanallapi kaq willañiqikunata huknachay',
'right-upload_by_url' => 'URL tiyaymanta willañiqita churkuy',
'right-purge' => "''Cache'' nisqa pakasqa hallch'ata ch'usaqchay mana takyachina p'anqawan",
-'right-autoconfirmed' => "Kuskan amachasqa p'anqakunata llamk'apuy",
+'right-autoconfirmed' => 'IP-pi tiksisqa achura saywakunapa manam saywachasqan kanqachu',
'right-bot' => 'Rurana antachap ruraykachasqanta hina hatalliy',
'right-nominornewtalk' => 'Kikinpa rimachinanpi uchuylla hukchasqakunata "musuq willaykuna" nisqapi mana rikuy',
'right-apihighlimits' => "API maskanakunapi aswan hanaq saywakunata llamk'achiy",
@@ -1513,12 +1534,14 @@ $1 {{PLURAL:$1|sanampamanta|sanampakunamanta}} aswan pisi kananmi.',
'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-protect' => "Amachasqa kachkayta hukchay, ch'aqtasqa amachasqa p'anqakunata llamk'apuy",
+'right-editprotected' => 'Amachasqa p\'anqakunata "{{int:protect-level-sysop}}" hina llamk\'apuy',
'right-editinterface' => "Ruraqpaq uyapurata llamk'apuy",
'right-editusercssjs' => "Huk ruraqkunap CSS, JS willañiqinkunata llamk'apuy",
'right-editusercss' => "Huk ruraqkunap CSS willañiqinkunata llamk'apuy",
'right-edituserjs' => "Huk ruraqkunap JS willañiqinkunata llamk'apuy",
+'right-editmyusercss' => "Kikiykip ruraqpaq CSS willañiqiykikunata llamk'apuy",
+'right-editmyuserjs' => "Kikiykip ruraqpaq JavaScript willañiqiykikunata llamk'apuy",
'right-rollback' => "Huk p'anqapi qhipaq llamk'apuqpa hukchasqankunata utqaylla kutichiy",
'right-markbotedits' => "Kutichisqa llamk'apusqakunata rurana antachap llamk'apusqankunata hina sananchay",
'right-noratelimit' => 'Achura saywakunap manam chayachisqanchu',
@@ -1570,8 +1593,8 @@ $1 {{PLURAL:$1|sanampamanta|sanampakunamanta}} aswan pisi kananmi.',
'action-block' => "kay ruraqta llamk'apuymanta hark'ay",
'action-protect' => "kay p'anqapaq amachana kamachisqakunata hukchay",
'action-rollback' => "huk p'anqapi qhipaq llamk'apuqpa hukchasqankunata utqaylla kutichiy",
-'action-import' => "kay p'anqata hawa wikimanta chaskimuy",
-'action-importupload' => "kay p'anqata willañiqi churkusqamanta chaskimuy",
+'action-import' => "p'anqakunata hawa wikimanta chaskimuy",
+'action-importupload' => "p'anqakunata willañiqi churkusqamanta chaskimuy",
'action-patrol' => "huk ruraqpa llamk'apusqanta patrullasqa nispa sananchay",
'action-autopatrol' => "kikiykip llamk'apusqaykita patrullasqa nispa sananchakuy",
'action-unwatchedpages' => "mana watiqasqa p'anqa sutisuyuta qhaway",
@@ -1613,7 +1636,7 @@ $1 {{PLURAL:$1|sanampamanta|sanampakunamanta}} aswan pisi kananmi.',
'rc_categories_any' => 'Imallapas',
'rc-change-size-new' => '$1 {{PLURAL:$1|byte|byte}} hukchasqa kaptinña',
'newsectionsummary' => 'Musuq raki: /* $1 */',
-'rc-enhanced-expand' => 'Imaymanachakunata rikuchiy (JavaScript kananmi)',
+'rc-enhanced-expand' => 'Imaymanachakunata rikuchiy',
'rc-enhanced-hide' => 'Imaymanachakunata pakay',
'rc-old-title' => 'ñawpaqta "$1" sutiwan kamarisqa',
@@ -1622,7 +1645,6 @@ $1 {{PLURAL:$1|sanampamanta|sanampakunamanta}} aswan pisi kananmi.',
'recentchangeslinked-feed' => "T'inkisqapi hukchasqakuna",
'recentchangeslinked-toolbox' => "T'inkisqapi hukchasqakuna",
'recentchangeslinked-title' => '"$1"-wan t\'inkisqa hukchasqa',
-'recentchangeslinked-noresult' => "Nisqa mit'apiqa manam hukchasqa t'inkimuqkuna kanchu.",
'recentchangeslinked-summary' => "Kay sapaq p'anqaqa t'inkisqa p'anqakunapi ñaqha hukchasqakunatam rikuchin. Watiqasqayki p'anqakunaqa '''yanasapa qillqasqam'''.",
'recentchangeslinked-page' => "P'anqap sutin:",
'recentchangeslinked-to' => "Qusqa p'anqaman t'inkimuq p'anqakunapi hukchasqakunata rikuchiy chay ranti",
@@ -1633,7 +1655,7 @@ $1 {{PLURAL:$1|sanampamanta|sanampakunamanta}} aswan pisi kananmi.',
'reuploaddesc' => "Churkuna hunt'ana p'anqaman kutimuy.",
'upload-tryagain' => 'Hukchasqa willañiqimanta willaykunata kachay',
'uploadnologin' => 'Manaraqmi yaykurqunkichu',
-'uploadnologintext' => '[[Special:UserLogin|Yaykunaykim]] tiyan willañiqikunata churkunaykipaq.',
+'uploadnologintext' => '$1 tiyan willañiqikunata churkunaykipaq.',
'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',
@@ -1836,7 +1858,6 @@ Lliwmanta aswan alliku kanapaqqa, img_auth.php manam atinchu.',
'http-read-error' => 'HTTP ñawiriy pantasqa.',
'http-timed-out' => "HTTP mañakuypa mit'anqa lluqsikusqañam.",
'http-curl-error' => 'URL apamuypi pantasqa: $1',
-'http-host-unreachable' => 'Manam aypanichu URL-ta.',
'http-bad-status' => 'HTTP mañakuypi sasachakuymi tukukurqan: $1 $2',
# Some likely curl errors. More could be added from <http://curl.haxx.se/libcurl/c/libcurl-errors.html>
@@ -1853,8 +1874,7 @@ Lliwmanta aswan alliku kanapaqqa, img_auth.php manam atinchu.',
'upload_source_file' => ' (antañiqiqniykipi willañiqi)',
# Special:ListFiles
-'listfiles-summary' => "Kay sapaq p'anqapiqa tukuy churkusqa willañiqikunatam rikunki.
-Ruraqkama ch'illchispaykiqa, chay ruraq qhipaq churkuq kaptillan willañiqikunatam sutisuyup patanpi rikunki.",
+'listfiles-summary' => "Kay sapaq p'anqapiqa tukuy churkusqa willañiqikunatam rikunki.",
'listfiles_search_for' => 'Rikchap sutinta maskay:',
'imgfile' => 'willañiqi',
'listfiles' => 'Rikchakuna',
@@ -1984,12 +2004,6 @@ Ama hina kaspa, [$2 willañiqi ch'uyanchana p'anqata] qhaway astawan willachikun
'statistics-users-active-desc' => "Ñaqha {{PLURAL:$1|p'unchawpi|$1 p'unchawkunapi}} llamk'apuq ruraqkuna",
'statistics-mostpopular' => "Lliwmanta astawan rikusqa p'anqakuna",
-'disambiguations' => "Sut'ichana qillqakunaman t'inkimuq p'anqakuna",
-'disambiguationspage' => "Template:Sut'ichana qillqa",
-'disambiguations-text' => "Kay qatiq p'anqakunam t'inkimun '''sut'ichana qillqa''' nisqaman.
-Chay rantiqa chiqap, hukchanasqa p'anqamanmi t'inkichun.<br />
-P'anqa [[MediaWiki:Disambiguationspage]] plantillayuq kaspaqa sut'ichana qillqam kanqa.",
-
'pageswithprop' => "Kaqninniyuq p'anqakuna",
'pageswithprop-legend' => "Kaqninniyuq p'anqakuna",
'pageswithprop-text' => "Kay p'anqapiqa sapaq kaqninniyuq p'anqakunatam sutisuyupi rikunki.",
@@ -2170,7 +2184,8 @@ Q\'imichisqa tantari {{PLURAL:$2|qillqa|qillqakuna}}: <code>$1</code> (mana mayq
'listgrouprights' => 'Ruraq huñup hayñinkuna',
'listgrouprights-summary' => "Kay qatiq sutisuyupiqa kay wikipi sut'ichasqa ruraq huñukunatam, kikinpa chayamuna hayñinkunatawan rikunki.
Chay kikinkunap hayñinkunamanta astawan ñawirinaykipaqqa [[{{MediaWiki:Listgrouprights-helppage}}|kaypi qhaway]].",
-'listgrouprights-key' => '* <span class="listgrouprights-granted">Qusqa hayñi</span>
+'listgrouprights-key' => 'T\'iktuna:
+* <span class="listgrouprights-granted">Qusqa hayñi</span>
* <span class="listgrouprights-revoked">Qichusqa hayñi</span>',
'listgrouprights-group' => 'Huñu',
'listgrouprights-rights' => 'Hayñikuna',
@@ -2240,10 +2255,9 @@ Qampa [[Special:Preferences|allinkachinaykikunapi]] qillqakamachisqayki imamayta
'unwatchthispage' => 'Amaña watiqaychu',
'notanarticle' => 'Manam qillqachu',
'notvisiblerev' => 'Musuqchasqaqa qullusqam',
-'watchnochange' => "Manam ima watiqasqayki qillqapas llamk'apusqachu karqan rikuchisqa mit'api.",
'watchlist-details' => "Watiqana sutisuyuykipiqa {{PLURAL:$1|huk p'anqam|$1 p'anqakunam}}, rimanakuna p'anqakunata mana yupaspa.",
-'wlheader-enotif' => '* E-chaskimanta musyachinaman arí nisqañam.',
-'wlheader-showupdated' => "* Qayna watukamusqaykimantapacha hukchasqa p'anqakunataqa '''yanasapa''' nisqapim rikunki.",
+'wlheader-enotif' => 'E-chaskimanta musyachinaman arí nisqañam.',
+'wlheader-showupdated' => "Qayna watukamusqaykimantapacha hukchasqa p'anqakunataqa '''yanasapa''' nisqapim rikunki.",
'watchmethod-recent' => "watiqasqayki p'anqakunapaq ñaqha hukchasqakunata llanchispa",
'watchmethod-list' => "watiqasqayki p'anqakunata ñaqha hukchasqakunapaq llanchispa",
'watchlistcontains' => "Watiqana sutisuyuykipiqa $1 {{PLURAL:$1|p'anqam|p'anqakunam}} kachkan.",
@@ -2326,9 +2340,11 @@ $2 nisqa p\'anqata qhaway ñaqha qullusqakunata rikunaykipaq.',
'deleteotherreason' => 'Huk rayku:',
'deletereasonotherlist' => 'Huk rayku',
'deletereason-dropdown' => "*Qulluypaq sapsi raykukuna
-** Kikin kamariqpa mañakusqan
+** Spam nisqa millay rurasqa
+** Wandaluchasqa
** Ruraqpa hayñinta k'irisqa
-** Wandaluchasqa",
+** Kikin kamariqpa mañakusqan
+** P'itisqa pusapuna",
'delete-edit-reasonlist' => "Qullusqapaq raykukunata llamk'apuy",
'delete-toobig' => "Kay p'anqaqa ancha wiñay kawsaysapa, $1-manta aswan {{PLURAL:$1|musuqchasqayuq|musuqchasqayuq}}. Kay hina p'anqakunata qulluyqa saywachasqam, {{SITENAME}}ta mana waqllinapaq.",
'delete-warning-toobig' => "Kay p'anqaqa ancha wiñay kawsaysapa, $1-manta aswan {{PLURAL:$1|musuqchasqayuq|musuqchasqayuq}}. Kay hina p'anqata qulluspaykiqa, {{SITENAME}}ta waqllinkimanchá. Kay ruraymanta anchata yuyaychakuspa hamut'ay.",
@@ -2346,7 +2362,7 @@ $2 nisqa p\'anqata qhaway ñaqha qullusqakunata rikunaykipaq.',
Qhipaq kaq llamk'apusqaqa [[User:$3|$3]]-pa ([[User talk:$3|rimanakuy]]{{int:pipe-separator}}[[Special:Contributions/$3|{{int:contribslink}}]]) rurasqanmi.",
'editcomment' => "Llamk'apusqakunamanta pisichasqaqa kay hinam: \"''\$1''\".",
'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",
+'revertpage-nouser' => "Ruraqpa hukchasqankunaqa (sutinqa qichusqam) kutichisqañam {{GENDER:$1|[[User:$1|$1]]}}-pa ñawpaq llamk'apusqanta paqarichispa",
'rollback-success' => "$1-pa hukchasqankunaqa kutichisqañam $2-pa ñawpaq llamk'apusqanta paqarichispa.",
# Edit tokens
@@ -2480,7 +2496,7 @@ $1',
'contributions' => "{{GENDER:$1|Ruraqpa}} llamk'apusqankuna",
'contributions-title' => "$1 sutiyuq ruraqpa llamk'apusqankuna",
'mycontris' => "Llamk'apusqaykuna",
-'contribsub2' => '$1 ($2)',
+'contribsub2' => '{{GENDER:$3|$1}}paq ($2)',
'nocontribs' => 'Manam kay hina hukchasqakuna kanchu.',
'uctop' => '(qhipaq hukchasqa)',
'month' => 'Kay killamanta (ñawpaqmantapas):',
@@ -2631,11 +2647,8 @@ Willariy imaraykum hark'anki (ahinataq: sapaq wandaluchasqa p'anqakunamanta will
'ipb_blocked_as_range' => "Pantasqa: IP $1 huchhaqa manam chiqallachu hark'asqa kaptinmi manam paskanallachu. Chaywanpas, $2 patayayku kaspataq hark'asqam kachkan. Chay patayaykuqa hark'asqamanta paskanallam.",
'ip_range_invalid' => "IP huchha k'itiqa manam chanichkanchu.",
'ip_range_toolarge' => "/$1-manta aswan hatun k'iti hark'aykunaqa manam saqillasqachu.",
-'blockme' => "Hark'away",
'proxyblocker' => "Proxy hark'aq",
-'proxyblocker-disabled' => 'Kay ruranamanqa ama nisqam.',
'proxyblockreason' => "IP huchhaykiqa hark'asqam kichasqa proxy kaptinmi. Ama hina kaspa, internet mink'aqniykiman icha allwiya yanapaqniykiman kay hatun qasi sasachakuymanta willay.",
-'proxyblocksuccess' => 'Rurasqañam.',
'sorbsreason' => 'IP huchhaykiqa kichasqa proxy nispa {{SITENAME}}pi DNSBL nisqapi qillqasqam.',
'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.",
@@ -2792,6 +2805,7 @@ Ama hina kaspa, [//www.mediawiki.org/wiki/Localisation MediaWiki Localisation] n
'thumbnail-more' => 'Hatunchay',
'filemissing' => 'Manam willañiqi kachkanchu',
'thumbnail_error' => 'Manam atinichu rikchachata kamayta: $1',
+'thumbnail_error_remote' => '$1 nisqamanta pantasqa willasqa: $2',
'djvu_page_error' => "DjVu nisqa p'anqaqa nisyum",
'djvu_no_xml' => 'Manam atinichu XML-ta apamuy DjVu willañiqipaq',
'thumbnail-temp-create' => "Manam atinichu mit'alla rikch'acha willañiqita kamariyta.",
@@ -2939,26 +2953,15 @@ Tukuy hawa wikimanta chaskisqakunaqa [[Special:Log/import|hawamanta chaskiy hall
# Stylesheets
'common.css' => "/* Churamusqa CSS chantakunaqa tukuy qarakunapim llamk'anqa */",
-'standard.css' => "/* Churamusqa CSS chantakunaqa ''Standard skin'' nisqa qarata llamk'achiq ruraqkunapaq llamk'anqa */",
-'nostalgia.css' => "/* Churamusqa CSS chantakunaqa ''Nostalgia skin'' nisqa qarata llamk'achiq ruraqkunapaq llamk'anqa */",
'cologneblue.css' => "/* Churamusqa CSS chantakunaqa ''Cologne Blue skin'' nisqa qarata llamk'achiq ruraqkunapaq llamk'anqa */",
'monobook.css' => '/* Kayman churasqa CSS nisqaqa Monobook qaratam hukchanqa tukuy internet tiyanapaq */',
-'myskin.css' => "/* Churamusqa CSS chantakunaqa ''MySkin'' nisqa qarata llamk'achiq ruraqkunapaq llamk'anqa */",
-'chick.css' => "/* Churamusqa CSS chantakunaqa ''Chick skin'' nisqa qarata llamk'achiq ruraqkunapaq llamk'anqa */",
-'simple.css' => "/* Churamusqa CSS chantakunaqa ''Simple skin'' nisqa qarata llamk'achiq ruraqkunapaq llamk'anqa */",
'modern.css' => "/* Churamusqa CSS chantakunaqa ''Modern skin'' nisqa qarata llamk'achiq ruraqkunapaq llamk'anqa */",
'print.css' => "/* Churamusqa CSS chantakunaqa ch'ipachinap rikch'akuynintam hukchanqa */",
-'handheld.css' => "/* Churamusqa CSS chantakunaqa makiwan hap'isqa qarapi tiksisqa \$wgHandheldStyle nisqapi allichasqa antakunap llamk'aynintam hukchanqa */",
# Scripts
'common.js' => "/* Ima kaypi kaq JavaScript qillqapas tukuy ruraqkunapaq tukuy p'anqakunap tukuy chaqnankunapi chaqnamusqa kanqa. */",
-'standard.js' => "/* Ima kaypi qillqamusqa JavaScript nisqa wakichi qillqapas ''Standard skin'' nisqa sapsi qarata llamk'achiq ruraqkunapaq chaqnasqa kanqa */",
-'nostalgia.js' => "/* Ima kaypi qillqamusqa JavaScript nisqa wakichi qillqapas ''Nostalgia skin'' nisqa qarata llamk'achiq ruraqkunapaq chaqnasqa kanqa */",
'cologneblue.js' => "/* Ima kaypi qillqamusqa JavaScript nisqa wakichi qillqapas ''Cologne Blue skin'' nisqa qarata llamk'achiq ruraqkunapaq chaqnasqa kanqa */",
'monobook.js' => "/* Ima kaypi qillqamusqa JavaScript nisqa wakichi qillqapas MonoBook nisqata llamk'achiq ruraqkunapaq chaqnasqa kanqa */",
-'myskin.js' => "/* Ima kaypi qillqamusqa JavaScript nisqa wakichi qillqapas ''MySkin'' nisqa qarata llamk'achiq ruraqkunapaq chaqnasqa kanqa */",
-'chick.js' => "/* Ima kaypi qillqamusqa JavaScript nisqa wakichi qillqapas ''Chick skin'' nisqa qarata llamk'achiq ruraqkunapaq chaqnasqa kanqa */",
-'simple.js' => "/* Ima kaypi qillqamusqa JavaScript nisqa wakichi qillqapas ''Simple skin'' nisqa qarata llamk'achiq ruraqkunapaq chaqnasqa kanqa */",
'modern.js' => "/* Ima kaypi qillqamusqa JavaScript nisqa wakichi qillqapas ''Modern skin'' nisqa qarata llamk'achiq ruraqkunapaq chaqnasqa kanqa */",
# Metadata
@@ -2997,13 +3000,13 @@ Tukuy hawa wikimanta chaskisqakunaqa [[Special:Log/import|hawamanta chaskiy hall
'pageinfo-length' => "P'anqap chhikan (byte)",
'pageinfo-article-id' => "P'anqap ID-nin",
'pageinfo-language' => "P'anqap rimaynin",
-'pageinfo-robot-policy' => 'Maskana kuyuchinap kachkaynin',
-'pageinfo-robot-index' => 'Maskana yuyarinapaqpas',
-'pageinfo-robot-noindex' => 'Mana maskana yuyarinapaq',
+'pageinfo-robot-policy' => 'Maskana kuyuchinam yuyarinachan',
+'pageinfo-robot-index' => 'Saqillasqa',
+'pageinfo-robot-noindex' => 'Mana saqillasqa',
'pageinfo-views' => "Hayk'a qhawaykuna",
'pageinfo-watchers' => "P'anqata hayk'a watiqaqkuna",
'pageinfo-few-watchers' => '$1-manta aswan pisi {{PLURAL:$1|qhawaq|qhawaqkuna}}',
-'pageinfo-redirects-name' => "Kay p'anqaman pusampuqkuna",
+'pageinfo-redirects-name' => "Kay p'anqaman hayk'a pusampuqkuna",
'pageinfo-subpages-name' => "Kay p'anqap urin p'anqankuna",
'pageinfo-subpages-value' => '$1 ($2 {{PLURAL:$2|pusapuna|pusapunakuna}}; $3 {{PLURAL:$3|mana pusapuna|mana pusapunakuna}})',
'pageinfo-firstuser' => "P'anqap kamariqnin",
@@ -3106,11 +3109,25 @@ Payta rurachiyqa antañiqiqniykita llikaykitapas waqllinqachá.",
'minutes' => '{{PLURAL:$1|huk minutu|$1 minutu}}',
'hours' => '{{PLURAL:$1|huk ura|$1 ura}}',
'days' => "{{PLURAL:$1|huk p'unchaw|$1 p'unchaw}}",
+'weeks' => '{{PLURAL:$1|huk simana|$1 simana}}',
'months' => '{{PLURAL:$1|huk killa|$1 killa}}',
'years' => '{{PLURAL:$1|huk wata|$1 wata}}',
'ago' => '$1 ñaqha',
'just-now' => 'kunallan',
+# Human-readable timestamps
+'hours-ago' => '$1 {{PLURAL:$1|ura|urakuna}} ñaqha',
+'minutes-ago' => '$1 {{PLURAL:$1|minutu|minutukuna}} ñaqha',
+'seconds-ago' => '$1 {{PLURAL:$1|sikundu|sikundukuna}} ñaqha',
+'monday-at' => 'Killachaw $1 pachapi',
+'tuesday-at' => 'Atipachaw $1 pachapi',
+'wednesday-at' => 'Quyllurchaw $1 pachapi',
+'thursday-at' => 'Illapachaw $1 pachapi',
+'friday-at' => "Ch'askachaw $1 pachapi",
+'saturday-at' => "K'uychichaw $1 pachapi",
+'sunday-at' => 'Intichaw $1 pachapi',
+'yesterday-at' => "Qayna p'unchaw $1 pachapi",
+
# Bad image list
'bad_image_list' => "Chantaqa kay hinam:
@@ -3137,7 +3154,7 @@ Kikin siq'ipi ima qatiq t'inkillapas sapaqllatam hamut'arisqa, ahinataq siq'ipi
* gpslongitude
* gpsaltitude",
-# EXIF tags
+# Exif tags
'exif-imagewidth' => 'Suni kay',
'exif-imagelength' => 'Hanaq kay',
'exif-bitspersample' => 'Bitkuna ñawpariqninman',
@@ -3315,14 +3332,14 @@ Kikin siq'ipi ima qatiq t'inkillapas sapaqllatam hamut'arisqa, ahinataq siq'ipi
'exif-originalimageheight' => "Manaraq rutusqa rikch'ap hanaq kaynin",
'exif-originalimagewidth' => "Manaraq rutusqa rikch'ap suni kaynin",
-# EXIF attributes
+# Exif attributes
'exif-compression-1' => "Mana mat'isqa",
'exif-compression-2' => 'CCITT Huñu 3 1-tupu wakinchasqa Huffman purina suni llawiy',
'exif-compression-3' => 'CCITT Huñu 3 tilifaks llawiy',
'exif-compression-4' => 'CCITT Huñu 4 tilifaks llawiy',
'exif-copyrighted-true' => 'Iskaychay hayñi kan',
-'exif-copyrighted-false' => 'Sapsi kapuy',
+'exif-copyrighted-false' => "Ruraqpa iskaychay hayñin kachkayqa mana sut'ichasqachu",
'exif-unknowndate' => "Mana riqsisqa p'unchaw",
@@ -3580,7 +3597,7 @@ 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:
+Kay rakiquna chiqapta qamman kapuptinqa, kay t\'inkita qatiy {{SITENAME}}pi e-chaski ruranaykita takyachinaykipaq:
$3
@@ -3693,7 +3710,6 @@ Sapsilla ñawpaq qhawariyta tukuykachay.',
'version-other' => 'Wakin',
'version-mediahandlers' => "Midya llamk'apuq",
'version-hooks' => "Ch'iwinakuna",
-'version-extension-functions' => "Mast'arina ruranakuna",
'version-parser-extensiontags' => "T'ikrana mast'arina ruranakuna",
'version-parser-function-hooks' => "T'ikrana rurana ch'iwinakuna",
'version-hook-name' => "Ch'iwinap sutin",
@@ -3715,12 +3731,16 @@ MediaWikitaqa mast'ariyku runakunata yanapanapaqmi, ichataq MANAM FIYAKUYTA ATIY
'version-entrypoints-header-entrypoint' => "Yaykuna t'uksi",
'version-entrypoints-header-url' => 'URL tiyay',
-# Special:FilePath
-'filepath' => 'Willañiqi ñan',
-'filepath-page' => 'Willañiqi:',
-'filepath-submit' => 'Riy',
-'filepath-summary' => "Kay sapaq p'anqaqa willañiqipaq tukuy ñannintam kutichin.
-Rikchakunatataq hunt'a ch'irkukupim rikunki. Huk willañiqi llayakunaqa tantapusqa wakichiwanmi chiqalla kicharikun.",
+# Special:Redirect
+'redirect' => 'Willañiqikama, ruraqkama icha musuqchay ID-kama pusapuy',
+'redirect-legend' => "Willañiqiman icha p'anqaman pusapuy",
+'redirect-submit' => 'Riy',
+'redirect-lookup' => 'Maskay:',
+'redirect-value' => 'Chani:',
+'redirect-user' => 'Ruraqpa kikin kaynin',
+'redirect-revision' => "P'anqamanta musuqchasqa",
+'redirect-file' => 'Willañiqip sutin',
+'redirect-not-exists' => 'Chaniqa manam tarisqachu',
# Special:FileDuplicateSearch
'fileduplicatesearch' => 'Iskaychasqa willañiqikunata maskay',
@@ -3810,6 +3830,9 @@ Rikchakunatataq hunt'a ch'irkukupim rikunki. Huk willañiqi llayakunaqa tantapus
'htmlform-submit' => 'Kachay',
'htmlform-reset' => 'Hukchasqakunata kutichiy',
'htmlform-selectorother-other' => 'Wakin',
+'htmlform-no' => 'Mana',
+'htmlform-yes' => 'Arí',
+'htmlform-chosen-placeholder' => 'Akllanata akllay',
# SQLite database support
'sqlite-has-fts' => "$1 hunt'a qillqa maskana yanapawan",
diff --git a/languages/messages/MessagesQug.php b/languages/messages/MessagesQug.php
index 0544c246..47e5546a 100644
--- a/languages/messages/MessagesQug.php
+++ b/languages/messages/MessagesQug.php
@@ -63,7 +63,6 @@ $messages = array(
'tog-shownumberswatching' => 'Mashna rurakkunaka chay pankata rikukuncha rikuchina',
'tog-oldsig' => 'Kunan pachapak aspina:',
'tog-fancysig' => 'aspinata Wiki-killkay shina rikuchina (mana ñapash tinkita churashpa)',
-'tog-showjumplinks' => '"chayman kallpana" tinkikunata sakina',
'tog-forceeditsummary' => 'Mana uchilla willayta churashpa killkakpi willaway',
'tog-watchlisthideown' => 'Rikushka pankakunapak mushuk killkaykunapi, ñukapak killkaykunata mana rikuchina',
'tog-watchlisthidebots' => 'Rikushka pankakunapak mushuk killkaykunapi, antawakunapak killkaykunata mana rikuchina',
@@ -249,7 +248,7 @@ $1',
'pool-queuefull' => 'Lankankapak suyana uku ña huntashkami',
'pool-errorunknown' => 'Na riksishka pantay',
-# 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).
+# 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).
'aboutsite' => '{{SITENAME}}manta',
'aboutpage' => 'Project:{{SITENAME}}manta',
'copyright' => 'Kay panka hawapi, $1 killkakunapak hayñikunaka tiyanmi',
@@ -259,7 +258,6 @@ $1',
'disclaimers' => 'Kamachikmanta willaykuna',
'disclaimerpage' => 'Project:Kamachikmanta kapak willaykuna',
'edithelp' => 'Llankanapaa yanapa',
-'edithelppage' => 'Help:Imashina killkankapa yanapana ?',
'helppage' => 'Help:Yanapa',
'mainpage' => 'Kapak Panka',
'mainpage-description' => 'Kapak panka',
@@ -569,7 +567,6 @@ Shuk rurakkunaka kikinpa e-chaski ''dirección''ta mana yachankachu.",
'recentchangeslinked' => 'Shukchishka mushuk killkaykuna',
'recentchangeslinked-toolbox' => 'Tinkishka mushuk killkaykuna',
'recentchangeslinked-title' => '"$1"-wan tinkishka mushuk killkaykuna',
-'recentchangeslinked-noresult' => 'Tinkishka pankakunaka kay akllashka pachipi mana kutin killkashkachu karka.',
'recentchangeslinked-summary' => "Kay pankaka tukuy shuk pankamanta pushashka pankakunapi (icha tukuy shuk ayllupi tiyak pankakunapi) mushuk killkaykunata rikuchiy. Kikinka shuk pankata [[Special:Watchlist|rikukpika]], chay pankapi mushuk killkaykunata '''yanachishkami''' kanka.",
'recentchangeslinked-page' => 'Pankapa shuti',
'recentchangeslinked-to' => 'Ama pankata rikuchina, ranti tukuy kay pankaman tinkiyuk pankakunapi mushuk killkaykunatalla rikuchina',
@@ -607,8 +604,6 @@ Shuk rurakkunaka kikinpa e-chaski ''dirección''ta mana yachankachu.",
# Statistics
'statistics' => 'Kay wikimanta yupaykuna',
-'disambiguationspage' => 'Template:Alli killkata akllankapak yanapa',
-
# Miscellaneous special pages
'nbytes' => '$1 {{PLURAL:$1|byte|byte}}',
'nmembers' => '$1 {{PLURAL:$1|panka|pankakuna}}',
diff --git a/languages/messages/MessagesRgn.php b/languages/messages/MessagesRgn.php
index 354c9842..d7c6e0c4 100644
--- a/languages/messages/MessagesRgn.php
+++ b/languages/messages/MessagesRgn.php
@@ -44,8 +44,6 @@ $messages = array(
'tog-shownumberswatching' => "Fam' avdè e' nòmar d'j utent ch'j tèn sta pàgina sot occ",
'tog-oldsig' => 'Anteprèma dla fírma bona',
'tog-fancysig' => "Tràta la firma cumpagna e' test int'la wiki (senza nissön ligam automatich)",
-'tog-externaleditor' => "Drova sempar un prugràma d'scritura esteran (editor testuale)",
-'tog-externaldiff' => 'Drova sempar un prugràma comparator esteran (sol par j utent espert)',
'tog-showjumplinks' => "Fa' funzionè j leghèm d'acesibilitè tipo \"Va' a\"",
'tog-uselivepreview' => 'Drova la funziòn "Anteprèma dal viv" (u j vo Javascript; sperimentêl)',
'tog-forceeditsummary' => "Dam la vos quènd l'ugèt dla mudèfica l'è vut",
diff --git a/languages/messages/MessagesRm.php b/languages/messages/MessagesRm.php
index 9fe45233..f944b968 100644
--- a/languages/messages/MessagesRm.php
+++ b/languages/messages/MessagesRm.php
@@ -72,9 +72,6 @@ $messages = array(
'tog-shownumberswatching' => "Mussar il dumber d'utilisaders che obervan questa pagina",
'tog-oldsig' => 'Signatura actuala:',
'tog-fancysig' => "Suttascripziun senza link automatic tar la pagina da l'utilisader.",
-'tog-externaleditor' => 'Utilisar sco standard in editur extern (be per experts, basegna ina configuraziun speziala da des computer. [//www.mediawiki.org/wiki/Manual:External_editors Dapli infurmaziuns.])',
-'tog-externaldiff' => 'Utilisar sco standard in program extern per visualisar differenzas tranter versiuns (be per experts, basegna ina configuraziun speziala da des computer. [//www.mediawiki.org/wiki/Manual:External_editors Dapli infurmaziuns.])',
-'tog-showjumplinks' => 'Activar las colliaziuns "seglir a"',
'tog-uselivepreview' => 'Utilisar la prevista dinamica (basegna JavaScript) (experiment!)',
'tog-forceeditsummary' => 'Avertir durant memoriar sche la resumaziun manca',
'tog-watchlisthideown' => "Zuppentar mias modificaziuns en la glista d'observaziun",
@@ -273,7 +270,7 @@ $1',
'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).
+# 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).
'aboutsite' => 'Davart {{SITENAME}}',
'aboutpage' => 'Project:Davart',
'copyright' => 'Cuntegn disponibel sut $1.',
@@ -283,7 +280,6 @@ $1',
'disclaimers' => 'Impressum',
'disclaimerpage' => 'Project:Impressum',
'edithelp' => 'Agid per modifitgar',
-'edithelppage' => 'Help:Prims pass',
'helppage' => 'Help:Cuntegn',
'mainpage' => 'Pagina principala',
'mainpage-description' => 'Pagina principala',
@@ -362,17 +358,6 @@ Ina glista da las paginas spezialas existentas chattais vus sut [[Special:Specia
# General errors
'error' => 'Errur',
'databaseerror' => 'Sbagl da la datoteca',
-'dberrortext' => 'In sbagl da la sintaxa da la dumonda a la banca da datas è capità.
-Quai po esser in sbagl en la software.
-L\'ultima dumonda per la banca da datas era:
-<blockquote><code>$1</code></blockquote>
-ord la funcziun "<code>$2</code>".
-La banca da datas ha rapportà l\'errur "<samp>$3: $4</samp>".',
-'dberrortextcl' => 'In sbagl da la sintaxa da la dumonda a la banca da datas è capità.
-L\'ultima dumonda per la banca da datas era:
-"$1"
-ord la funcziun "$2".
-La banca da datas ha rapportà l\'errur "$3: $4"',
'laggedslavemode' => 'Attenziun: La pagina mussada na cuntign eventualmain betg anc las ultimas midadas.',
'readonly' => 'Banca da datas bloccada',
'enterlockreason' => 'Inditgescha ina raschun per la bloccada da la banca da datas ed il temp cura che ti quintas che la bloccada po vegnir annullada',
@@ -428,7 +413,6 @@ Emprova danovamain en in per minutas.',
'editinginterface' => "'''Attenziun:''' Questa pagina cuntegna text che vegn duvra en la interfatscha da questa software.
Midadas influenzeschan directamain l'interfatscha per tut ils utilisaders sin questa vichi.
Sche ti vuls far translaziuns u correcturas per tut las vichis, lura utilisescha [//translatewiki.net/ translatewiki.net], il project per translatar MediaWiki.",
-'sqlhidden' => '(Zuppentà la dumonda da SQL)',
'cascadeprotected' => "Questa pagina è protegida da modificaziuns perquai ch'ella è integrada en suandanta{{PLURAL:$1| pagina, ch'è protegida|s paginas, ch'èn protegidas}} entras l'opziun «protecziun ertada»:
$2",
'namespaceprotected' => "Ti n'has betg la lubientscha da modifitgar paginas dal tip da pagina '''$1'''.",
@@ -461,7 +445,6 @@ N'emblida betg da midar tias [[Special:Preferences|{{SITENAME}} preferenzas]].",
'yourpassword' => 'pled-clav',
'yourpasswordagain' => 'repeter 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',
'password-change-forbidden' => 'Ti na pos betg midar pleds-clav sin quest vichi.',
'externaldberror' => "U ch'i è capità ina errur cun l'autentificaziun externa u che ti na dastgas betg actualisar tes conto extern.",
@@ -562,7 +545,7 @@ Per finir da t'annunziar stos ti definir qua in nov pled-clav:",
'newpassword' => 'pled-clav nov:',
'retypenew' => 'repeter pled-clav nov:',
'resetpass_submit' => "Definir il pled clav e m'annunziar",
-'resetpass_success' => 'Tes pled-clav è vegnì midà cun success.
+'changepassword-success' => 'Tes pled-clav è vegnì midà cun success.
Ti vegns annunzià…',
'resetpass_forbidden' => 'Il pled-clav na po betg vegnir midà',
'resetpass-no-info' => "Ti stos t'annunziar per acceder directamain questa pagina.",
@@ -574,10 +557,8 @@ Eventualmain has ti gia midà cun success tes pled-clav u dumandà per in nov pl
# Special:PasswordReset
'passwordreset' => 'Redefinir il pled-clav',
-'passwordreset-text' => "Emplenescha quest formular per retschaiver in e-mail che cuntegna ils detagls per acceder tes conto d'utilisader.",
'passwordreset-legend' => 'Redefinir il pled-clav',
'passwordreset-disabled' => 'La pussaivladad da redefinir il pled-clav è vegnida deactivada sin questa wiki.',
-'passwordreset-pretext' => '{{PLURAL:$1||Endatescha in dals tocs da data sutvart}}',
'passwordreset-username' => "Num d'utilisader:",
'passwordreset-domain' => 'Domain:',
'passwordreset-capture' => "Mussar l'e-mail che resultescha?",
@@ -1068,7 +1049,6 @@ Detagls pon vegnir chattads en il [{{fullurl:{{#Special:Log}}/delete|page={{FULL
'searchmenu-legend' => 'Opziuns da tschertgar',
'searchmenu-exists' => "'''Igl exista ina pagina cun il num \"[[:\$1]] sin questa vichi\"'''",
'searchmenu-new' => "'''Crear la pagina \"[[:\$1]]\" sin questa vichi!'''",
-'searchhelp-url' => 'Help:Cuntegn',
'searchmenu-prefix' => '[[Special:PrefixIndex/$1|Mussar tut las paginas cun quest prefix]]',
'searchprofile-articles' => 'Paginas da cuntegn',
'searchprofile-project' => 'Agid e paginas dal project',
@@ -1113,15 +1093,6 @@ Scriva il prefix ''all:'' avant il term che ti vuls tschertgar, per tschertgar e
Ti pos tschertgar en il fratemp cun Google.
Considerescha che lur index da {{SITENAME}} po cuntegnair datas ch'èn betg pli actualas.",
-# Quickbar
-'qbsettings' => 'Glista laterala',
-'qbsettings-none' => 'Nagins',
-'qbsettings-fixedleft' => 'Sanester, fixà',
-'qbsettings-fixedright' => 'Dretg, fixà',
-'qbsettings-floatingleft' => 'Sanester, flottand',
-'qbsettings-floatingright' => 'Dretg, flottand',
-'qbsettings-directionality' => 'Fixà, dependent da la direcziun da scriver da tia lingua',
-
# Preferences page
'preferences' => 'Preferenzas',
'mypreferences' => 'Preferenzas',
@@ -1154,7 +1125,6 @@ Considerescha che lur index da {{SITENAME}} po cuntegnair datas ch'èn betg pli
'resetprefs' => 'remetter las preferenzas (reset)',
'restoreprefs' => 'Restituir tut las preferenzas da standard',
'prefs-editing' => 'Modifitgar',
-'prefs-edit-boxsize' => 'Grondezza da la fanestra da modifitgar',
'rows' => 'Lingias:',
'columns' => 'Colonnas:',
'searchresultshead' => 'Tschertga',
@@ -1165,9 +1135,6 @@ Considerescha che lur index da {{SITENAME}} po cuntegnair datas ch'èn betg pli
'recentchangesdays-max' => 'Maximalmain $1 {{PLURAL:$1|di|dis}}',
'recentchangescount' => 'Dumber da modificaziuns che duai vegnir mussà sco standard:',
'prefs-help-recentchangescount' => 'Quai cumpiglia las ultimas midadas, la cronologia da paginas ed ils protocols.',
-'prefs-help-watchlist-token' => "Emplenir quest champ cun ina clav secreta vegn a generar in feed RSS per tia glista d'observaziun.
-Mintgin che enconuscha questa clav vegn ad esser abel da leger tia glista d'observaziun, tscherna pia ina clav segira.
-Qua è ina valur casuali che ti pos utilisar: $1",
'savedprefs' => 'Tias preferenzas èn vegnidas memorisadas.',
'timezonelegend' => "Zona d'urari:",
'localtime' => 'Temp local:',
@@ -1198,7 +1165,6 @@ Qua è ina valur casuali che ti pos utilisar: $1",
'prefs-reset-intro' => 'Ti pos utilisar questa pagina per restituir las valurs da standard da questa pagina per tias preferenzas.
Questa operaziun na po betg vegnir revocada.',
'prefs-emailconfirm-label' => 'Confirmaziun per e-mail:',
-'prefs-textboxsize' => 'Grondezza da la fanestra da modifitgar',
'youremail' => 'Adressa dad e-mail:',
'username' => "{{GENDER:$1|Num d'utilisader|Num da l'utilisadra}}:",
'uid' => "ID da l'{{GENDER:$1|utilisader|utilisadra}}:",
@@ -1439,7 +1405,6 @@ Tia adressa dad e-mail na vegn betg mussada sche auters utilisaders ta contactes
'recentchangeslinked-feed' => 'midadas sin paginas colliadas',
'recentchangeslinked-toolbox' => 'midadas sin paginas colliadas',
'recentchangeslinked-title' => 'Midadas en artitgels ch\'èn colliads cun "$1"',
-'recentchangeslinked-noresult' => 'Naginas midadas sin artitgels collads durant la perioda endatada.',
'recentchangeslinked-summary' => "Quest è ina glista da las midadas ch'èn vegnidas fatgas da curt en artitgels ch'èn colliads cun ina pagina specifica (ni en commembers d'ina categoria specifica).
Paginas sin [[Special:Watchlist|tia glista d'observaziun]] èn '''grassas'''.",
'recentchangeslinked-page' => 'Num da la pagina:',
@@ -1672,7 +1637,6 @@ Per cuntanscher segirezza opgimala è img_auth.php deactivà.",
'http-read-error' => 'Sbagl da leger HTTP.',
'http-timed-out' => 'Surpassà il temp durant la dumonda HTTP.',
'http-curl-error' => "Errur cun recuperar l'URL: $1",
-'http-host-unreachable' => "Impussibel da cuntanscher l'URL.",
'http-bad-status' => 'Durant la dumonda HTTP è ina errur capitada: $1 $2',
# Some likely curl errors. More could be added from <http://curl.haxx.se/libcurl/c/libcurl-errors.html>
@@ -1825,12 +1789,6 @@ Betg emblida da controllar sche autras colliaziuns mainan als models avant ch'al
'statistics-users-active-desc' => "Utilisaders che han fatg almain ina acziun {{PLURAL:$1|l'ultim di|ils ultims $1 dis}}",
'statistics-mostpopular' => 'Paginas visitadas il pli savens',
-'disambiguations' => 'Paginas cun colliaziuns sin paginas per la decleraziun da noziuns',
-'disambiguationspage' => 'Template:disambiguiziun',
-'disambiguations-text' => "Las suandantas paginas cuntegnan almain ina colliaziun ad ina '''pagina per la decleraziun da noziuns'''.
-Eventualmain duessan ellas plitost esser cun il dretg artitgel.
-Ina pagina vegn tractada sco pagina per la decleraziun da noziuns sch'ella cuntegna almain in dals models enumerads sin [[MediaWiki:Disambiguationspage]].",
-
'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à.
@@ -2079,10 +2037,9 @@ Midadas futuras vid questa pagina e la pagina da discussiun appertegnenta vegnan
'unwatchthispage' => 'Betg pli observar',
'notanarticle' => "Quai n'è betg ina pagina da cuntegn",
'notvisiblerev' => "L'ultima versiun d'in auter utilisader è vegnida stizzada",
-'watchnochange' => 'Nagin dals artitgels che ti observeschas è vegnì midà durant la perioda da temp inditgada.',
'watchlist-details' => "{{PLURAL:$1|Ina pagina|$1 paginas}} èn sin tia glista d'observaziun (senza dumbrar las paginas da discussiun).",
-'wlheader-enotif' => "* Il servetsch d'infurmaziun per e-mail è activà.",
-'wlheader-showupdated' => "* Artitgels ch'èn vegnids midads suenter che ti has vis els la davosa giada èn mussads '''grass'''",
+'wlheader-enotif' => "Il servetsch d'infurmaziun per e-mail è activà.",
+'wlheader-showupdated' => "Artitgels ch'èn vegnids midads suenter che ti has vis els la davosa giada èn mussads '''grass'''",
'watchmethod-recent' => "intercurir las davosas midadas per la glista d'observaziun",
'watchmethod-list' => 'intercurir las paginas observadas davart novas midadas',
'watchlistcontains' => "Tia glista d'observaziun cuntegna $1 {{PLURAL:$1|pagina|paginas}}.",
@@ -2495,12 +2452,9 @@ Eventualmain è ella gia vegnida annulada.",
Ella e bloccada en la zona d'adressas IP $2 che po vegnir debloccà.",
'ip_range_invalid' => "Zona d'adressas IP nunvalida.",
'ip_range_toolarge' => "Zonas da bloccadas pli grondas che /$1 n'èn betg lubidas.",
-'blockme' => 'Bloccar mai',
'proxyblocker' => 'Bloccar proxys',
-'proxyblocker-disabled' => 'Questa funcziun è deactivada.',
'proxyblockreason' => "Tia adressa IP è vegnida bloccada perquai ch'ella è in proxy avert.
Contactescha tes provider dals survetschs d'internet u ils administraturs dal sistem ed als infurmescha davart quest problem da segirezza pussaivel.",
-'proxyblocksuccess' => 'Terminà.',
'sorbsreason' => 'Tia adressa IP fa part da la glista da proxys averts da DNSBL che vegn utilisada da {{SITENAME}}.',
'sorbs_create_account_reason' => "Tia adressa IP fa part da la glista da proxys averts da DNSBL che vegn utilisada da {{SITENAME}}.
Ti na pos betg crear in conto d'utilisader.",
@@ -2998,7 +2952,7 @@ Sche la datoteca è vegnida midada dal status original èn tscherts detagls even
* gpslongitude
* gpsaltitude",
-# EXIF tags
+# Exif tags
'exif-imagewidth' => 'Ladezza',
'exif-imagelength' => 'Autezza',
'exif-bitspersample' => 'Bits per cumponenta da colur',
@@ -3176,7 +3130,7 @@ Sche la datoteca è vegnida midada dal status original èn tscherts detagls even
'exif-originalimageheight' => 'Autezza avant tagliar',
'exif-originalimagewidth' => 'Ladezza avant tagliar',
-# EXIF attributes
+# Exif attributes
'exif-compression-1' => 'Betg cumprimà',
'exif-compression-2' => 'GGITT gruppa 3 codaziun da lunghezza currenta Hufman modifitgada en 1 dimensiun',
'exif-compression-3' => 'CCITT gruppa 3 codaziun da fax',
@@ -3570,7 +3524,6 @@ Ti pos era utilisar [[Special:EditWatchlist|la pagina da standard]].',
'version-other' => 'Auter',
'version-mediahandlers' => 'Manipulaturs da meds',
'version-hooks' => 'Hooks',
-'version-extension-functions' => 'Funcziuns dad extensiuns',
'version-parser-extensiontags' => 'Tags che extendan il parser',
'version-parser-function-hooks' => 'Hooks per funcziuns dal parser',
'version-hook-name' => 'Num dal hook',
@@ -3592,15 +3545,6 @@ Ti duessas avair retschavì [{{SERVER}}{{SCRIPTPATH}}/COPYING ina copia da la GN
'version-entrypoints-header-entrypoint' => "Punct d'entrada",
'version-entrypoints-header-url' => 'URL',
-# Special:FilePath
-'filepath' => 'Percurs da la datoteca',
-'filepath-page' => 'Datoteca:',
-'filepath-submit' => 'Dai',
-'filepath-summary' => 'Questa pagina speciala inditgescha l\'adressa cumpletta per ina datoteca.
-Maletgs vegnan mussads en resoluziun cumpletta, auters tips da datoteca vegnan averts directamain cun lur program assozià.
-
-Endatescha il num da datoteca senza il prefix "{{ns:file}}:".',
-
# Special:FileDuplicateSearch
'fileduplicatesearch' => 'Tschertgar datotecas dublas',
'fileduplicatesearch-summary' => 'Tschertgar datotecas dublas a basa da valurs da hash.',
diff --git a/languages/messages/MessagesRo.php b/languages/messages/MessagesRo.php
index 2eb7e599..2304fb67 100644
--- a/languages/messages/MessagesRo.php
+++ b/languages/messages/MessagesRo.php
@@ -328,9 +328,6 @@ $messages = array(
'tog-shownumberswatching' => 'Arată numărul utilizatorilor care urmăresc',
'tog-oldsig' => 'Semnătură actuală:',
'tog-fancysig' => 'Tratează semnătura ca wikitext (fără o legătură automată)',
-'tog-externaleditor' => 'Utilizează, în mod implicit, un editor extern (Doar pentru experți; necesită setări speciale pe calculatorul dumneavoastră. [//www.mediawiki.org/wiki/Manual:External_editors Mai multe informații.])',
-'tog-externaldiff' => 'Utilizează, în mod implicit, un program extern pentru diferențele între versiuni (Doar pentru experți; necesită setări speciale pe calculatorul dumneavoastră. [//www.mediawiki.org/wiki/Manual:External_editors Mai multe informații.])',
-'tog-showjumplinks' => 'Activează legăturile de accesibilitate „sari laâ€',
'tog-uselivepreview' => 'Folosește previzualizarea în timp real (experimental)',
'tog-forceeditsummary' => 'Avertizează-mă când uit să descriu modificările',
'tog-watchlisthideown' => 'Ascunde modificările mele la lista mea de urmărire',
@@ -344,6 +341,8 @@ $messages = array(
'tog-showhiddencats' => 'Arată categoriile ascunse',
'tog-noconvertlink' => 'Dezactivează conversia titlurilor',
'tog-norollbackdiff' => 'Nu arăta diferența după efectuarea unei reveniri',
+'tog-useeditwarning' => 'Avertizează-mă când părăsesc o pagină fără a salva modificările',
+'tog-prefershttps' => 'Utilizează întotdeauna o conexiune securizată când sunt autentificat(ă)',
'underline-always' => 'ÃŽntotdeauna',
'underline-never' => 'Niciodată',
@@ -407,6 +406,18 @@ $messages = array(
'oct' => 'oct',
'nov' => 'nov',
'dec' => 'dec',
+'january-date' => '$1 ianuarie',
+'february-date' => '$1 februarie',
+'march-date' => '$1 martie',
+'april-date' => '$1 aprilie',
+'may-date' => '$1 mai',
+'june-date' => '$1 iunie',
+'july-date' => '$1 iulie',
+'august-date' => '$1 august',
+'september-date' => '$1 septembrie',
+'october-date' => '$1 octombrie',
+'november-date' => '$1 noiembrie',
+'december-date' => '$1 decembrie',
# Categories related messages
'pagecategories' => '{{PLURAL:$1|Categorie|Categorii}}',
@@ -427,7 +438,7 @@ $messages = array(
'noindex-category' => 'Pagini neindexate',
'broken-file-category' => 'Pagini cu legături invalide către fișiere',
-'linkprefix' => '/^(.*?)([a-zA-Z\\x80-\\xff]+)$/sD',
+'linkprefix' => '/^((?>.*(?<![a-zA-Z\\x80-\\xff])))(.+)$/sD',
'about' => 'Despre',
'article' => 'Articol',
@@ -490,6 +501,7 @@ $messages = array(
'create-this-page' => 'Creați această pagină',
'delete' => 'Ștergere',
'deletethispage' => 'Șterge pagina',
+'undeletethispage' => 'Recuperează această pagină',
'undelete_short' => 'Recuperarea {{PLURAL:$1|unei modificări|a $1 modificări|a $1 de modificări}}',
'viewdeleted_short' => 'Vedeți {{PLURAL:$1|o modificare ștearsă|$1 (de) modificări șterse}}',
'protect' => 'Protejare',
@@ -506,7 +518,7 @@ $messages = array(
'articlepage' => 'Vedeți articolul',
'talk' => 'Discuție',
'views' => 'Vizualizări',
-'toolbox' => 'Trusa de unelte',
+'toolbox' => 'Unelte',
'userpage' => 'Vizualizați pagina utilizatorului',
'projectpage' => 'Vizualizați pagina proiectului',
'imagepage' => 'Vizualizați pagina fișierului',
@@ -533,7 +545,7 @@ $1',
'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).
+# 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).
'aboutsite' => 'Despre {{SITENAME}}',
'aboutpage' => 'Project:Despre',
'copyright' => 'Conținutul este disponibil sub $1, exceptând cazurile în care se specifică altfel.',
@@ -543,7 +555,6 @@ $1',
'disclaimers' => 'Termeni',
'disclaimerpage' => 'Project:Termeni',
'edithelp' => 'Ajutor pentru modificare',
-'edithelppage' => 'Help:Cum să modifici o pagină',
'helppage' => 'Help:Ajutor',
'mainpage' => 'Pagina principală',
'mainpage-description' => 'Pagina principală',
@@ -620,17 +631,12 @@ O listă cu paginile speciale valide se poate găsi la [[Special:SpecialPages|{{
# General errors
'error' => 'Eroare',
'databaseerror' => 'Eroare la baza de date',
-'dberrortext' => 'A apărut o eroare în sintaxa interogării bazei de date.
-Acest lucru poate indica o problemă în program.
-Ultima interogare trimisă către baza de date a fost:
-<blockquote><code>$1</code></blockquote>
-din cadrul funcÈ›iei „<code>$2</code>â€.
-Baza de date a returnat eroarea „<samp>$3: $4</samp>â€.',
-'dberrortextcl' => 'A apărut o eroare de sintaxă în interogare.
-Ultima interogare încercată a fost:
-„$1â€
-din funcÈ›ia „$2â€.
-Baza de date a returnat eroarea „$3: $4â€',
+'databaseerror-text' => 'A apărut o eroare la interogarea bazei de date.
+Acest lucru poate însemna o problemă de software.',
+'databaseerror-textcl' => 'A apărut o eroare la interogarea bazei de date.',
+'databaseerror-query' => 'Interogare: $1',
+'databaseerror-function' => 'Funcție: $1',
+'databaseerror-error' => 'Eroare: $1',
'laggedslavemode' => 'Atenție: S-ar putea ca pagina să nu conțină ultimele actualizări.',
'readonly' => 'Baza de date este blocată la scriere',
'enterlockreason' => 'Precizează motivul pentru blocare, incluzând o estimare a termenului de deblocare a bazei de date',
@@ -664,6 +670,7 @@ S-ar putea ca acesta să fi fost deja șters de altcineva.',
'cannotdelete-title' => 'Imposibil de È™ters pagina „$1â€',
'delete-hook-aborted' => 'Ștergerea a fost abandonată din cauza unui hook.
Nicio explicație furnizată.',
+'no-null-revision' => 'Nu s-a putut crea o nouă versiune nulă pentru pagina „$1â€',
'badtitle' => 'Titlu incorect',
'badtitletext' => 'Titlul paginii căutate este incorect, gol sau este o legătură interlinguală sau interwiki incorectă.
Poate conține unul sau mai multe caractere ce nu pot fi folosite în titluri.',
@@ -686,12 +693,15 @@ Pentru a adăuga sau modifica traduceri corespunzătoare tuturor wikiurilor, uti
'editinginterface' => "'''Avertizare''': Modificați o pagină care este folosită pentru a furniza textul interfeței software.
Modificările aduse acestei pagini vor afecta aspectul interfeței pentru alți utilizatori ai acestui wiki.
Pentru a adăuga sau modifica traduceri corespunzătoare tuturor wikiurilor, utilizați [//translatewiki.net/ translatewiki.net], proiectul MediaWiki de localizare.",
-'sqlhidden' => '(interogare SQL ascunsă)',
'cascadeprotected' => 'Această pagină a fost protejată la scriere deoarece este inclusă în {{PLURAL:$1|următoarea pagină|următoarele pagini}}, care {{PLURAL:$1|este protejată|sunt protejate}} în cascadă:
$2',
'namespaceprotected' => "Nu aveți permisiunea de a modifica pagini din spațiul de nume '''$1'''.",
'customcssprotected' => 'Nu aveți permisiunea de a modifica această pagină CSS, deoarece conține setările personale ale altui utilizator.',
'customjsprotected' => 'Nu aveți permisiunea de a modifica această pagină JavaScript, deoarece conține setările personale ale altui utilizator.',
+'mycustomcssprotected' => 'Nu aveți permisiunea să modificați această pagină CSS.',
+'mycustomjsprotected' => 'Nu aveți permisiunea să modificați această pagină JavaScript.',
+'myprivateinfoprotected' => 'Nu aveți permisiunea să vă modificați informațiile personale.',
+'mypreferencesprotected' => 'Nu aveți permisiunea să vă modificați preferințele.',
'ns-specialprotected' => 'Paginile din spațiul de nume {{ns:special}} nu pot fi editate.',
'titleprotected' => "Acest titlu a fos protejat la creare de [[User:$1|$1]].
Motivul invocat este ''$2''.",
@@ -716,10 +726,19 @@ Administratorul care a efectuat blocarea a furnizat explicaÈ›ia: „$3â€.',
'welcomecreation-msg' => 'Contul dumneavoastră a fost creat.
Nu uitați să vă modificați [[Special:Preferences|preferințele]] pentru {{SITENAME}}.',
'yourname' => 'Nume de utilizator:',
+'userlogin-yourname' => 'Nume de utilizator',
+'userlogin-yourname-ph' => 'Introduceți numele de utilizator',
+'createacct-another-username-ph' => 'Introduceți numele de utilizator',
'yourpassword' => 'Parolă:',
+'userlogin-yourpassword' => 'Parolă',
+'userlogin-yourpassword-ph' => 'Introduceți parola',
+'createacct-yourpassword-ph' => 'Introduceți o parolă',
'yourpasswordagain' => 'Repetați parola:',
+'createacct-yourpasswordagain' => 'Confirmare parolă',
+'createacct-yourpasswordagain-ph' => 'Introduceți parola din nou',
'remembermypassword' => 'Autentificare automată de la acest calculator (expiră după {{PLURAL:$1|24 de ore|$1 zile|$1 de zile}})',
-'securelogin-stick-https' => 'Rămâi conectat la HTTPS după autentificare',
+'userlogin-remembermypassword' => 'Păstrează-mă autentificat',
+'userlogin-signwithsecure' => 'Utilizează conexiunea securizată',
'yourdomainname' => 'Domeniul dumneavoastră:',
'password-change-forbidden' => 'Nu puteți schimba parole pe acest wiki.',
'externaldberror' => 'A fost fie o eroare de bază de date pentru o autentificare extenă sau nu aveți permisiunea să actualizați contul extern.',
@@ -731,18 +750,44 @@ Nu uitați să vă modificați [[Special:Preferences|preferințele]] pentru {{SI
'logout' => 'ÃŽnchidere sesiune',
'userlogout' => 'ÃŽnchide sesiunea',
'notloggedin' => 'Nu sunteți autentificat',
+'userlogin-noaccount' => 'Nu aveți cont încă?',
+'userlogin-joinproject' => 'Înscrieți-vă la {{SITENAME}}',
'nologin' => 'Nu aveți cont încă? $1.',
'nologinlink' => 'Creați-vă un cont de utilizator acum',
'createaccount' => 'Creare cont',
'gotaccount' => "Aveți deja un cont de utilizator? '''$1'''.",
'gotaccountlink' => 'Autentificați-vă',
'userlogin-resetlink' => 'Ați uitat datele de autentificare?',
+'userlogin-resetpassword-link' => 'Resetare parolă',
+'helplogin-url' => 'Help:Autentificare',
+'userlogin-helplink' => '[[{{MediaWiki:helplogin-url}}|Ajutor la autentificare]]',
+'userlogin-loggedin' => 'Sunteți deja {{GENDER:$1|autentificat|autentificată}} ca {{GENDER:$1|$1}}.
+Utilizați formularul de mai jos pentru a vă autentifica cu alt nume de utilizator.',
+'userlogin-createanother' => 'Creează un alt cont',
+'createacct-join' => 'Introduceți-vă informațiile mai jos.',
+'createacct-another-join' => 'Introduceți, mai jos, informațiile noului cont.',
+'createacct-emailrequired' => 'Adresă de e-mail',
+'createacct-emailoptional' => 'Adresă de e-mail (opțională)',
+'createacct-email-ph' => 'Introduceți adresa dumnevoastră de e-mail',
+'createacct-another-email-ph' => 'Introduceți adresa de e-mail',
'createaccountmail' => 'Utilizează o parolă temporară aleasă la întâmplare și o trimite la adresa de e-mail indicată',
+'createacct-realname' => 'Nume real (opțional)',
'createaccountreason' => 'Motiv:',
+'createacct-reason' => 'Motiv',
+'createacct-reason-ph' => 'De ce creați un alt cont',
+'createacct-captcha' => 'Verificare de securitate',
+'createacct-imgcaptcha-ph' => 'Introduceți textul pe care îl vedeți deasupra',
+'createacct-submit' => 'Creați-vă contul',
+'createacct-another-submit' => 'Creează un alt cont',
+'createacct-benefit-heading' => '{{SITENAME}} este un proiect clădit de oameni ca dumneavoastră.',
+'createacct-benefit-body1' => '{{PLURAL:$1|modificare|modificări|de modificări}}',
+'createacct-benefit-body2' => '{{PLURAL:$1|pagină|pagini|de pagini}}',
+'createacct-benefit-body3' => '{{PLURAL:$1|contribuitor recent|contribuitori recenți|de contribuitori recenți}}',
'badretype' => 'Parolele pe care le-ați introdus diferă.',
'userexists' => 'Numele de utilizator pe care l-ați introdus este deja folosit.
Vă rugăm să alegeți un alt nume.',
'loginerror' => 'Eroare de autentificare',
+'createacct-error' => 'Eroare la crearea contului',
'createaccounterror' => 'Nu pot crea contul: $1',
'nocookiesnew' => 'Contul a fost creat, dar nu sunteți autentificat{{GENDER:||ă|}}. {{SITENAME}} folosește module cookie pentru a reține utilizatorii autentificați. Navigatorul dumneavoastră are aceste module cookie dezactivate. Vă rugăm să le activați și să vă reautentificați folosind noul nume de utilizator și noua parolă.',
'nocookieslogin' => '{{SITENAME}} folosește module cookie pentru a autentifica utilizatorii. Browser-ul dvs. are cookie-urile dezactivate. Vă rugăm să le activați și să incercați din nou.',
@@ -797,11 +842,13 @@ Este de dorit să vă autentificați și să schimbați parola cât mai repede.
Ignorați acest mesaj dacă crearea contului s-a produs în urma unei greșeli.',
'usernamehasherror' => 'Numele de utilizator nu poate conține caractere diez (#)',
-'login-throttled' => 'Ați avut prea multe încercări de a vă autentifica.
-Vă rugăm să așteptați până să mai încercați.',
+'login-throttled' => 'Ați avut prea multe încercări recente de a vă autentifica.
+Vă rugăm să așteptați $1 până să reîncercați.',
'login-abort-generic' => 'Procesul de autentificare a eșuat și a fost abandonat',
'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.',
+'createacct-another-realname-tip' => 'Numele real este opțional.
+Dacă decideți furnizarea sa, acesta va fi folosit pentru a atribui utilizatorului munca sa.',
# Email sending
'php-mail-error-unknown' => 'Eroare necunoscută în funcția PHP mail()',
@@ -817,7 +864,7 @@ Vă rugăm să așteptați până să mai încercați.',
'newpassword' => 'Parola nouă:',
'retypenew' => 'Reintroduceți noua parolă:',
'resetpass_submit' => 'Setează parola și autentifică',
-'resetpass_success' => 'Parola a fost schimbată cu succes! Autentificare în curs...',
+'changepassword-success' => 'Parola dumneavoastră a fost schimbată cu succes!',
'resetpass_forbidden' => 'Parolele nu pot fi schimbate.',
'resetpass-no-info' => 'Trebuie să fiți autentificat pentru a accesa această pagină direct.',
'resetpass-submit-loggedin' => 'Modifică parola',
@@ -829,10 +876,11 @@ Este posibil să fi reușit deja schimbarea parolei sau să fi cerut o parolă t
# Special:PasswordReset
'passwordreset' => 'Resetare parolă',
-'passwordreset-text' => 'Completați acest formular pentru a vă reseta parola.',
+'passwordreset-text-one' => 'Completați acest formular pentru a vă reseta parola.',
+'passwordreset-text-many' => '{{PLURAL:$1|Completați unul din câmpuri pentru a vă reseta parola.}}',
'passwordreset-legend' => 'Resetare parolă',
'passwordreset-disabled' => 'Resetarea parolei a fost dezactivată pe acest wiki.',
-'passwordreset-pretext' => '{{PLURAL:$1| | Introduceți mai jos o parte din informații}}',
+'passwordreset-emaildisabled' => 'Funcțiile de e-mail au fost dezactivate de pe acest wiki.',
'passwordreset-username' => 'Nume de utilizator:',
'passwordreset-domain' => 'Domeniu:',
'passwordreset-capture' => 'Vizualizați e-mailul rezultat?',
@@ -859,7 +907,7 @@ Ar trebui să vă autentificați și să alegeți acum o nouă parolă. Dacă al
Parolă temporară: $2',
'passwordreset-emailsent' => 'A fost trimis un e-mail de resetare a parolei.',
'passwordreset-emailsent-capture' => 'Un mesaj de resetare a parolei a fost trimis, fiind afișat mai jos.',
-'passwordreset-emailerror-capture' => 'Un mesaj de resetare a parolei a fost generat (fiind afișat mai jos), dar trimiterea sa către utilizator a eșuat: $1',
+'passwordreset-emailerror-capture' => 'Un mesaj de resetare a parolei a fost generat (fiind afișat mai jos), dar trimiterea sa către {{GENDER:$2|utilizator}} a eșuat: $1',
# Special:ChangeEmail
'changeemail' => 'Modificare adresă de e-mail',
@@ -873,6 +921,19 @@ Parolă temporară: $2',
'changeemail-submit' => 'Modifică adresa de e-mail',
'changeemail-cancel' => 'Revocare',
+# Special:ResetTokens
+'resettokens' => 'Resetare jetoane',
+'resettokens-text' => 'Puteți reseta, aici, jetoanele care permit accesul la anumite date asociate contului dumneavoastră.
+
+Ar trebui să faceți acest lucru numai dacă le-ați partajat accidental cu altcineva ori contul dumneavoastră a fost compromis.',
+'resettokens-no-tokens' => 'Nu există jetoane de resetat.',
+'resettokens-legend' => 'Resetare jetoane',
+'resettokens-tokens' => 'Jetoane:',
+'resettokens-token-label' => '$1 (valoare actuală: $2)',
+'resettokens-watchlist-token' => 'Jeton pentru fluxul web (Atom/RSS) al [[Special:Watchlist|modificărilor aduse paginilor pe care le urmăriți]]',
+'resettokens-done' => 'Jetoane resetate.',
+'resettokens-resetbutton' => 'Resetează jetoanele selectate',
+
# Edit page toolbar
'bold_sample' => 'Text aldin',
'bold_tip' => 'Text aldin',
@@ -1072,12 +1133,15 @@ Nicio explicație furnizată.',
Se pare că a fost ștearsă.',
'edit-conflict' => 'Conflict de modificare.',
'edit-no-change' => 'Modificarea dvs. a fost ignorată deoarece nu s-a efectuat nicio schimbare.',
+'postedit-confirmation' => 'Modificarea dumneavoastră a fost salvată.',
'edit-already-exists' => 'Pagina nouă nu a putut fi creată.
Ea există deja.',
'defaultmessagetext' => 'Textul implicit',
'content-failed-to-parse' => 'Nu s-a putut analiza conținutul de tip $2 pentru modelul $1: $3',
'invalid-content-data' => 'Date de conținut invalide',
'content-not-allowed-here' => 'Conținutul de tip „$1†nu este permis pe pagina [[$2]]',
+'editwarning-warning' => 'Părăsind această pagină, există riscul pierderii modificărilor efectuate.
+Dacă sunteți autentificat, puteți dezactiva această avertizare în secțiunea „Modificare†a preferințelor dumneavoastră.',
# Content models
'content-model-wikitext' => 'wikitext',
@@ -1112,6 +1176,7 @@ Acsete argumente au fost omise.',
'undo-failure' => 'Modificarea nu poate fi reversibilă datorită conflictului de modificări intermediare.',
'undo-norev' => 'Modificarea nu poate fi reversibilă pentru că nu există sau pentru că a fost ștearsă.',
'undo-summary' => 'Anularea modificării $1 făcute de [[Special:Contributions/$2|$2]] ([[User talk:$2|Discuție]])',
+'undo-summary-username-hidden' => 'Anularea versiunii $1 a unui utilizator ascuns',
# Account creation failure
'cantcreateaccounttitle' => 'Crearea contului nu poate fi realizată',
@@ -1290,6 +1355,7 @@ Folosirea linkurilor de navigare va reseta această coloană.',
'compareselectedversions' => 'Compară versiunile marcate',
'showhideselectedversions' => 'Șterge/recuperează versiunile marcate',
'editundo' => 'anulare',
+'diff-empty' => '(Nicio diferență)',
'diff-multi' => '(Nu {{PLURAL:$1|s-a afișat o versiune intermediară efectuată|s-au afișat $1 versiuni intermediare efectuate|s-au afișat $1 de versiuni intermediare efectuate}} de {{PLURAL:$2|un utilizator|$2 utilizatori|$2 de utilizatori}})',
'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}})',
'difference-missing-revision' => '{{PLURAL:$2|O versiune a|$2 versiuni ale|$2 de versiuni ale}} acestei diferențe ($1) nu {{PLURAL:$2|a fost găsită|au fost găsite}}.
@@ -1317,7 +1383,6 @@ Detalii se pot găsi în [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE
'searchmenu-legend' => 'Opțiuni căutare',
'searchmenu-exists' => "'''Există o pagină cu titlul „[[:$1]]'†pe acest site.'''",
'searchmenu-new' => "'''Creați pagina „[[:$1]]†pe acest wiki!'''",
-'searchhelp-url' => 'Help:Ajutor',
'searchmenu-prefix' => '[[Special:PrefixIndex/$1|Răsfoiește paginile cu acest prefix]]',
'searchprofile-articles' => 'Pagini cu conținut',
'searchprofile-project' => 'Pagini din spațiile Proiect și Ajutor',
@@ -1359,15 +1424,7 @@ Detalii se pot găsi în [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE
'powersearch-togglenone' => 'Nimic',
'search-external' => 'Căutare externă',
'searchdisabled' => '<p>Ne pare rău! Căutarea după text a fost dezactivată temporar, din motive de performanță. Între timp puteți folosi căutarea prin Google mai jos, însă aceasta poate să dea rezultate învechite.</p>',
-
-# Quickbar
-'qbsettings' => 'Setări pentru bara rapidă',
-'qbsettings-none' => 'Fără',
-'qbsettings-fixedleft' => 'Fixă, în stânga',
-'qbsettings-fixedright' => 'Fixă, în dreapta',
-'qbsettings-floatingleft' => 'Liberă',
-'qbsettings-floatingright' => 'Plutire la dreapta',
-'qbsettings-directionality' => 'Fixat, în funcție de direcția în care se face scrierea în limba dumneavoastră',
+'search-error' => 'A apărut o eroare în timpul căutării: $1',
# Preferences page
'preferences' => 'Preferințe',
@@ -1401,7 +1458,6 @@ Detalii se pot găsi în [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE
'resetprefs' => 'Resetează preferințele',
'restoreprefs' => 'Restaurează toate valorile implicite (în toate secțiunile)',
'prefs-editing' => 'Modificare',
-'prefs-edit-boxsize' => 'Mărimea ferestrei de modificare.',
'rows' => 'Rânduri:',
'columns' => 'Coloane:',
'searchresultshead' => 'Parametri căutare',
@@ -1412,9 +1468,9 @@ Detalii se pot găsi în [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE
'recentchangesdays-max' => '(maxim {{PLURAL:$1|o zi|$1 zile}})',
'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ă.
-Aici se află o combinație generată aleator pe care o puteți folosi: $1',
+'prefs-help-watchlist-token2' => 'Aceasta este cheia secretă pentru fluxul web al listei dumneavoastră de pagini urmărite.
+Oricine o cunoaște vă va putea citi lista de pagini urmărite, așa că n-o partajați cu nimeni.
+[[Special:ResetTokens|Faceți clic aici dacă doriți să o resetați]].',
'savedprefs' => 'Preferințele dumneavoastră au fost salvate.',
'timezonelegend' => 'Fus orar:',
'localtime' => 'Ora locală:',
@@ -1445,7 +1501,6 @@ Aici se află o combinație generată aleator pe care o puteți folosi: $1',
'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:',
-'prefs-textboxsize' => 'Mărime căsuță de modificare',
'youremail' => 'Adresă de e-mail:',
'username' => '{{GENDER:$1|Nume de utilizator}}:',
'uid' => 'ID {{GENDER:$1|utilizator|utilizatoare}}:',
@@ -1479,6 +1534,8 @@ Dacă decideți furnizarea sa, acesta va fi folosit pentru a vă atribui munca.'
'prefs-dateformat' => 'Format dată',
'prefs-timeoffset' => 'Decalaj orar',
'prefs-advancedediting' => 'Opțiuni generale',
+'prefs-editor' => 'Editor',
+'prefs-preview' => 'Previzualizare',
'prefs-advancedrc' => 'Opțiuni avansate',
'prefs-advancedrendering' => 'Opțiuni avansate',
'prefs-advancedsearchoptions' => 'Opțiuni avansate',
@@ -1486,7 +1543,9 @@ Dacă decideți furnizarea sa, acesta va fi folosit pentru a vă atribui munca.'
'prefs-displayrc' => 'Opțiuni de afișare',
'prefs-displaysearchoptions' => 'Opțiuni de afișare',
'prefs-displaywatchlist' => 'Opțiuni de afișare',
+'prefs-tokenwatchlist' => 'Jeton',
'prefs-diffs' => 'Diferențe',
+'prefs-help-prefershttps' => 'Această preferință va avea efect la următoarea autentificare.',
# User preference: email validation using jQuery
'email-address-validity-valid' => 'Adresa de e-mail pare validă',
@@ -1513,6 +1572,8 @@ Dacă decideți furnizarea sa, acesta va fi folosit pentru a vă atribui munca.'
'userrights-notallowed' => 'Nu aveți permisiunea de a acorda sau elimina drepturi utilizatorilor.',
'userrights-changeable-col' => 'Grupuri pe care le puteți schimba',
'userrights-unchangeable-col' => 'Grupuri pe care nu le puteți schimba',
+'userrights-conflict' => 'Conflict al schimbării drepturilor de utilizator! Reverificați și confirmați-vă modificările.',
+'userrights-removed-self' => 'V-ați eliminat cu succes propriile drepturi. Ca urmare, nu mai puteți accesa această pagină.',
# Groups
'group' => 'Grup:',
@@ -1578,11 +1639,19 @@ Dacă decideți furnizarea sa, acesta va fi folosit pentru a vă atribui munca.'
'right-proxyunbannable' => 'Trece peste blocarea automată a proxy-urilor',
'right-unblockself' => 'Se deblochează singur',
'right-protect' => 'Schimbă nivelurile de protejare și modifică pagini protejate în cascadă',
-'right-editprotected' => 'Modificare pagini protejate (fără protejare în cascadă)',
+'right-editprotected' => 'Modifică pagini protejate ca „{{int:protect-level-sysop}}â€',
+'right-editsemiprotected' => 'Modifică pagini protejate ca „{{int:protect-level-autoconfirmed}}â€',
'right-editinterface' => 'Modificare interfața cu utilizatorul',
'right-editusercssjs' => 'Modifică fișierele CSS și JS ale altor utilizatori',
'right-editusercss' => 'Modifică fișierele CSS ale altor utilizatori',
'right-edituserjs' => 'Modifică fișierele JS ale altor utilizatori',
+'right-editmyusercss' => 'Modificați-vă propriile fișiere CSS',
+'right-editmyuserjs' => 'Modificați-vă propriile fișiere JavaScript',
+'right-viewmywatchlist' => 'Vizualizați propria listă de pagini urmărite',
+'right-editmywatchlist' => 'Modificați propria listă de pagini urmărite. Rețineți că anumite acțiuni vor adăuga pagini chiar și fără acest drept.',
+'right-viewmyprivateinfo' => 'Vizualizați-vă datele private (de ex. adresa de e-mail, numele real)',
+'right-editmyprivateinfo' => 'Modificați-vă datele private (de ex. adresa de e-mail, numele real)',
+'right-editmyoptions' => 'Modificați-vă preferințele',
'right-rollback' => 'Revocă rapid modificările ultimului utilizator care a modificat o pagină particulară',
'right-markbotedits' => 'Marchează revenirea ca modificare efectuată de robot',
'right-noratelimit' => 'Neafectat de limitele raportului',
@@ -1644,12 +1713,19 @@ Dacă decideți furnizarea sa, acesta va fi folosit pentru a vă atribui munca.'
'action-userrights-interwiki' => 'modificați permisiunile utilizatorilor de pe alte wiki',
'action-siteadmin' => 'blocați sau deblocați baza de date',
'action-sendemail' => 'trimite e-mailuri',
+'action-editmywatchlist' => 'vă modificați lista de pagini urmărite',
+'action-viewmywatchlist' => 'vă vizualizați lista de pagini urmărite',
+'action-viewmyprivateinfo' => 'vă vizualizați informațiile personale',
+'action-editmyprivateinfo' => 'să vă modificați informațiile personale',
# Recent changes
'nchanges' => '$1 {{PLURAL:$1|modificare|modificări|de modificări}}',
+'enhancedrc-since-last-visit' => '$1 {{PLURAL:$1|de la ultima vizită}}',
+'enhancedrc-history' => 'istoric',
'recentchanges' => 'Schimbări recente',
'recentchanges-legend' => 'Opțiuni schimbări recente',
'recentchanges-summary' => 'Urmăriți cele mai recente modificări din wiki pe această pagină.',
+'recentchanges-noresult' => 'Nicio modificare din intervalul specificat nu corespunde acestor criterii.',
'recentchanges-feed-description' => 'Urmărește cele mai recente schimbări folosind acest flux.',
'recentchanges-label-newpage' => 'Această modificare a creat o pagină nouă',
'recentchanges-label-minor' => 'Aceasta este o modificare minoră',
@@ -1689,7 +1765,6 @@ $3',
'recentchangeslinked-feed' => 'Modificări corelate',
'recentchangeslinked-toolbox' => 'Modificări corelate',
'recentchangeslinked-title' => 'Modificări legate de „$1â€',
-'recentchangeslinked-noresult' => 'Nici o schimbare la paginile legate în perioada dată.',
'recentchangeslinked-summary' => "Aceasta este o listă a schimbărilor efectuate recent asupra paginilor cu legături de la o anumită pagină (sau asupra membrilor unei anumite categorii).
Paginile pe care le [[Special:Watchlist|urmăriți]] apar în '''aldine'''.",
'recentchangeslinked-page' => 'Numele paginii:',
@@ -1701,7 +1776,7 @@ Paginile pe care le [[Special:Watchlist|urmăriți]] apar în '''aldine'''.",
'reuploaddesc' => 'Revocare încărcare și întoarcere la formularul de trimitere.',
'upload-tryagain' => 'Trimiteți descrierea fișierului modificată',
'uploadnologin' => 'Nu sunteți autentificat',
-'uploadnologintext' => 'Trebuie să fiți [[Special:UserLogin|autentificat]] pentru a putea trimite fișiere.',
+'uploadnologintext' => 'Trebuie să vă $1 pentru a încărca fișiere.',
'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',
@@ -1914,7 +1989,6 @@ Pentru securitate optimă, img_auth.php este dezactivat.',
'http-read-error' => 'S-a produs o eroare în timpul citirii HTTP.',
'http-timed-out' => 'Cererea HTTP a expirat.',
'http-curl-error' => 'Eroare la preluarea adresei URL: $1',
-'http-host-unreachable' => 'Adresa URL nu a putut fi accesată.',
'http-bad-status' => 'A apărut o problemă în timpul solicitării HTTP: $1 $2',
# Some likely curl errors. More could be added from <http://curl.haxx.se/libcurl/c/libcurl-errors.html>
@@ -1945,6 +2019,10 @@ Poate doriți să încercați la o oră mai puțin ocupată.',
'listfiles_size' => 'Mărime (octeți)',
'listfiles_description' => 'Descriere',
'listfiles_count' => 'Versiuni',
+'listfiles-show-all' => 'Include versiunile vechi ale imaginilor',
+'listfiles-latestversion' => 'Versiunea curentă',
+'listfiles-latestversion-yes' => 'Da',
+'listfiles-latestversion-no' => 'Nu',
# File description page
'file-anchor-link' => 'Fișier',
@@ -2052,6 +2130,13 @@ Lista tipurilor MIME recunoscute de MediaWiki poate fi găsită la [http://svn.w
'randompage' => 'Pagină aleatorie',
'randompage-nopages' => 'Nu există pagini în {{PLURAL:$2|spațiul|spațiile}} de nume: $1.',
+# Random page in category
+'randomincategory' => 'Pagină aleatorie din categorie',
+'randomincategory-invalidcategory' => '„$1†nu este un nume de categorie valid.',
+'randomincategory-nopages' => 'Nu există pagini în [[:Category:$1]].',
+'randomincategory-selectcategory' => 'Obțineți, aleatoriu, o pagină din categoria: $1 $2.',
+'randomincategory-selectcategory-submit' => 'Du-te',
+
# Random redirect
'randomredirect' => 'Redirecționare aleatorie',
'randomredirect-nopages' => 'Nu există redirecționări în spațiul de nume "$1".',
@@ -2077,17 +2162,13 @@ Lista tipurilor MIME recunoscute de MediaWiki poate fi găsită la [http://svn.w
'statistics-users-active-desc' => 'Utilizatori care au efectuat o acțiune în {{PLURAL:$1|ultima zi|ultimele $1 zile}}',
'statistics-mostpopular' => 'Paginile cele mai vizualizate',
-'disambiguations' => 'Pagini care trimit către pagini de dezambiguizare',
-'disambiguationspage' => 'Template:Dezambiguizare',
-'disambiguations-text' => "Paginile următoare conțin cel puțin o legătură către o '''pagină de dezambiguizare'''.
-Acestea ar trebui să conțină legături către un articol mai potrivit.<br />
-O pagină este considerată o pagină de dezambiguizare dacă folosește formate care apar la [[MediaWiki:Disambiguationspage]].",
-
'pageswithprop' => 'Pagini cu o proprietate de pagină',
'pageswithprop-legend' => 'Pagini cu o proprietate de pagină',
'pageswithprop-text' => 'Această pagină listează paginile care utilizează o anumită proprietate de pagină.',
'pageswithprop-prop' => 'Numele proprietății:',
'pageswithprop-submit' => 'Du-te',
+'pageswithprop-prophidden-long' => 'valoarea proprietății de text lung ascunsă ($1)',
+'pageswithprop-prophidden-binary' => 'valoarea proprietății binare ascunsă ($1)',
'doubleredirects' => 'Redirecționări duble',
'doubleredirectstext' => 'Această listă conține pagini care redirecționează la alte pagini de redirecționare.
@@ -2145,6 +2226,7 @@ Intrările <del>tăiate</del> au fost rezolvate.',
'mostrevisions' => 'Articole cu cele mai multe revizuiri',
'prefixindex' => 'Toate paginile cu prefix',
'prefixindex-namespace' => 'Toate paginile cu prefix (spațiul de nume $1)',
+'prefixindex-strip' => 'Înlătură prefixul din cadrul listei',
'shortpages' => 'Pagini scurte',
'longpages' => 'Pagini lungi',
'deadendpages' => 'Pagini fără legături',
@@ -2160,6 +2242,7 @@ Intrările <del>tăiate</del> au fost rezolvate.',
'listusers' => 'Listă utilizatori',
'listusers-editsonly' => 'Arată doar utilizatorii cu modificări',
'listusers-creationsort' => 'Sortează după data creării',
+'listusers-desc' => 'Sortează descrescător',
'usereditcount' => '$1 {{PLURAL:$1|editare|editări}}',
'usercreated' => '{{GENDER:$3|Creat}} în $1 la $2',
'newpages' => 'Pagini noi',
@@ -2336,10 +2419,9 @@ Modificările viitoare efectuate asupra acestei pagini dar și asupra paginii de
'unwatchthispage' => 'Nu mai urmări',
'notanarticle' => 'Nu este un articol',
'notvisiblerev' => 'Versiunea a fost ștearsă',
-'watchnochange' => 'Nici una dintre paginile pe care le urmăriți nu a fost modificată în perioada de timp afișată.',
'watchlist-details' => '{{PLURAL:$1|O pagină|$1 pagini urmărite|$1 de pagini urmărite}}, excluzând paginile de discuție.',
-'wlheader-enotif' => '*Notificarea prin e-mail este activată.',
-'wlheader-showupdated' => "* Paginile care au fost modificate după ultima dumneavoastră vizită sunt afișate '''îngroșat'''.",
+'wlheader-enotif' => 'Notificarea prin e-mail este activată.',
+'wlheader-showupdated' => "Paginile care au fost modificate ulterior accesării lor ultima dată de către dumneavoastră sunt '''îngroșate'''.",
'watchmethod-recent' => 'căutarea schimbărilor recente pentru paginile urmărite',
'watchmethod-list' => 'căutarea paginilor urmărite pentru schimbări recente',
'watchlistcontains' => 'Lista de pagini urmărite conține $1 {{PLURAL:$1|element|elemente|de elemente}}.',
@@ -2585,7 +2667,7 @@ $1',
'contributions' => 'Contribuții {{GENDER:$1|utilizator}}',
'contributions-title' => 'Contribuțiile utilizatorului $1',
'mycontris' => 'Contribuții',
-'contribsub2' => 'Pentru $1 ($2)',
+'contribsub2' => 'Pentru {{GENDER:$3|$1}} ($2)',
'nocontribs' => 'Nu a fost găsită nici o modificare care să satisfacă acest criteriu.',
'uctop' => '(actuală)',
'month' => 'Din luna (și dinainte):',
@@ -2742,15 +2824,13 @@ Jurnalul suprimărilor este indicat mai jos:',
Face parte din area de blocare $2, care nu poate fi deblocată.',
'ip_range_invalid' => 'Serie IP invalidă.',
'ip_range_toolarge' => 'Blocările mai mari de /$1 nu sunt permise.',
-'blockme' => 'Blochează-mă',
'proxyblocker' => 'Blocaj de proxy',
-'proxyblocker-disabled' => 'Această funcție este dezactivată.',
'proxyblockreason' => 'Adresa dumneavoastră IP a fost blocată pentru că este un proxy deschis.
Vă rugăm să vă contactați furnizorul de servicii Internet sau tehnicienii IT și să-i informați asupra acestei probleme serioase de securitate.',
-'proxyblocksuccess' => 'Realizat.',
'sorbsreason' => 'Adresa dumneavoastră IP este listată ca un proxy deschis în DNSBL.',
'sorbs_create_account_reason' => 'Adresa dumneavoastră IP este listată ca un proxy deschis în lista neagră DNS.
Nu vă puteți crea un cont',
+'xffblockreason' => 'O adresă IP prezentă în antetul X-Forwarded-For — fie a dumneavoastră, fie a serverului proxy pe care îl folosiți — a fost blocată. Motivul original al blocării a fost: $1',
'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.',
@@ -2919,6 +2999,8 @@ Vă rugăm să vizitați [//www.mediawiki.org/wiki/Localisation MediaWiki Locali
'thumbnail-more' => 'Extindere',
'filemissing' => 'Fișier lipsă',
'thumbnail_error' => 'Eroare la generarea previzualizării: $1',
+'thumbnail_error_remote' => 'Mesaj de eroare de la $1:
+$2',
'djvu_page_error' => 'Numărul paginii DjVu eronat',
'djvu_no_xml' => 'Imposibil de obținut XML-ul pentru fișierul DjVu',
'thumbnail-temp-create' => 'Imposibil de creat miniatura temporară',
@@ -3066,16 +3148,12 @@ Un dosar temporar lipsește.',
Permite adăugarea unui motiv în descrierea modificărilor',
'tooltip-preferences-save' => 'Salvează preferințele',
'tooltip-summary' => 'Descrieți pe scurt modificarea',
+'tooltip-iwiki' => '$1 – $2',
# Stylesheets
'common.css' => '/** CSS plasate aici vor fi aplicate tuturor aparițiilor */',
-'standard.css' => '/* CSS plasate aici vor afecta utilizatorii stilului Standard */',
-'nostalgia.css' => '/* CSS plasate aici vor afecta utilizatorii stilului Nostalgia */',
'cologneblue.css' => '/* CSS plasate aici vor afecta utilizatorii stilului Cologne Blue */',
'monobook.css' => '/* modificați acest fișier pentru a adapta înfățișarea monobook-ului pentru tot situl*/',
-'myskin.css' => '/* CSS plasate aici vor afecta utilizatorii stilului MySkin */',
-'chick.css' => '/* CSS plasate aici vor afecta utilizatorii stilului Chick */',
-'simple.css' => '/* CSS plasate aici vor afecta utilizatorii stilului Simple */',
'modern.css' => '/* CSS plasate aici vor afecta utilizatorii stilului Modern */',
'vector.css' => '/* CSS plasate aici vor afecta utilizatorii stilului Vector */',
'print.css' => '/* CSS plasate aici vor afecta modul în care paginile vor fi imprimate */',
@@ -3151,13 +3229,8 @@ Permite adăugarea unui motiv în descrierea modificărilor',
'pageinfo-category-files' => 'Număr de fișiere',
# Skin names
-'skinname-standard' => 'Clasic',
-'skinname-nostalgia' => 'Nostalgie',
'skinname-cologneblue' => 'Albastru de Cologne',
'skinname-monobook' => 'Monobook',
-'skinname-myskin' => 'StilulMeu',
-'skinname-chick' => 'Șic',
-'skinname-simple' => 'Simplu',
'skinname-modern' => 'Modern',
'skinname-vector' => 'Vector',
@@ -3237,11 +3310,25 @@ Executându-l, sistemul dvs. poate fi compromis.",
'minutes' => '{{PLURAL:$1|un minut|$1 minute|$1 de minute}}',
'hours' => '{{PLURAL:$1|o oră|$1 ore|$1 de ore}}',
'days' => '{{PLURAL:$1|o zi|$1 zile|$1 de zile}}',
+'weeks' => '{{PLURAL:$1|$1 săptămână|$1 săptămâni|$1 de săptămâni}}',
'months' => '{{PLURAL:$1|$1 lună|$1 luni|$1 de luni}}',
'years' => '{{PLURAL:$1|$1 an|$1 ani|$1 de ani}}',
'ago' => '$1 în urmă',
'just-now' => 'Chiar acum',
+# Human-readable timestamps
+'hours-ago' => 'acum $1 {{PLURAL:$1|oră|ore|de ore}}',
+'minutes-ago' => 'acum $1 {{PLURAL:$1|minut|minute|de minute}}',
+'seconds-ago' => 'acum {{PLURAL:$1|o secundă|$1 secunde|$1 de secunde}}',
+'monday-at' => 'Luni, la $1',
+'tuesday-at' => 'Marți, la $1',
+'wednesday-at' => 'Miercuri, la $1',
+'thursday-at' => 'Joi,la $1',
+'friday-at' => 'Vineri, la $1',
+'saturday-at' => 'Sâmbătă, la $1',
+'sunday-at' => 'Duminică, la $1',
+'yesterday-at' => 'Ieri, la $1',
+
# Bad image list
'bad_image_list' => 'Formatul este următorul:
@@ -3273,7 +3360,7 @@ Altele vor fi ascunse implicit.
* gpslongitude
* gpsaltitude',
-# EXIF tags
+# Exif tags
'exif-imagewidth' => 'Lățime',
'exif-imagelength' => 'Înălțime',
'exif-bitspersample' => 'Biți pe componentă',
@@ -3451,7 +3538,7 @@ Altele vor fi ascunse implicit.
'exif-originalimageheight' => 'Înălțimea imaginii înainte de trunchiere',
'exif-originalimagewidth' => 'Lățimea imaginii înainte de trunchiere',
-# EXIF attributes
+# Exif attributes
'exif-compression-1' => 'Necomprimată',
'exif-compression-2' => 'CCITT Grupa 3 Lungimea codificării Huffman modificată de dimensiune 1',
'exif-compression-3' => 'CCITT Grupa 3 codificare fax',
@@ -3835,7 +3922,6 @@ Puteți folosi în schimb [[Special:EditWatchlist|editorul standard]].',
'version-other' => 'Altele',
'version-mediahandlers' => 'Suport media',
'version-hooks' => 'Hook-uri',
-'version-extension-functions' => 'Funcțiile extensiilor',
'version-parser-extensiontags' => 'Taguri extensie parser',
'version-parser-function-hooks' => 'Hook-uri funcții parser',
'version-hook-name' => 'Nume hook',
@@ -3844,6 +3930,7 @@ Puteți folosi în schimb [[Special:EditWatchlist|editorul standard]].',
'version-license' => 'Licență',
'version-poweredby-credits' => "Acest wiki este dezvoltat de '''[//www.mediawiki.org/ MediaWiki]''', drepturi de autor © 2001-$1 $2.",
'version-poweredby-others' => 'alții',
+'version-poweredby-translators' => 'traducătorii de la translatewiki.net',
'version-credits-summary' => 'Am dori să amintim următoarele persoane pentru contribuțiile aduse proiectului [[Special:Version|MediaWiki]].',
'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ă.
@@ -3857,12 +3944,17 @@ MediaWiki este distribuit în speranța că va fi folositor, dar FĂRĂ VREO GAR
'version-entrypoints-header-entrypoint' => 'Punct de intrare',
'version-entrypoints-header-url' => 'URL',
-# Special:FilePath
-'filepath' => 'Cale fișier',
-'filepath-page' => 'Fișier:',
-'filepath-submit' => 'Du-te',
-'filepath-summary' => 'Această pagină specială recreează calea completă a fișierului.
-Imaginile sunt afișate la rezoluția lor maximă, în timp ce alte tipuri de fișiere vor porni direct în programele asociate.',
+# Special:Redirect
+'redirect' => 'Redirecționare după fișier, utilizator sau ID-ul versiunii',
+'redirect-legend' => 'Redirecționare către un fișier sau o pagină',
+'redirect-summary' => 'Această pagină specială vă redirecționează către un fișier (dat fiind un nume de fișier), o pagină (dat fiind ID-ul unei versiuni) sau o pagină de utilizator (dat fiind un ID numeric al utilizatorului).',
+'redirect-submit' => 'Du-te',
+'redirect-lookup' => 'Căutare:',
+'redirect-value' => 'Valoare:',
+'redirect-user' => 'ID utilizator',
+'redirect-revision' => 'Versiune de pagină',
+'redirect-file' => 'Nume de fișier',
+'redirect-not-exists' => 'Valoarea nu a fot găsită',
# Special:FileDuplicateSearch
'fileduplicatesearch' => 'Căutare fișiere duplicate',
@@ -3912,12 +4004,16 @@ Imaginile sunt afișate la rezoluția lor maximă, în timp ce alte tipuri de fi
'tags' => 'Etichete valabile pentru marcarea modificărilor',
'tag-filter' => 'Filtru pentru [[Special:Tags|etichete]]:',
'tag-filter-submit' => 'Filtru',
+'tag-list-wrapper' => '([[Special:Tags|{{PLURAL:$1|Etichetă|Etichete}}]]: $2)',
'tags-title' => 'Etichete',
'tags-intro' => 'Această pagină afișează etichetele, inclusiv semnificația lor, pe care software-ul le poate folosi la marcarea modificărilor.',
'tags-tag' => 'Numele etichetei',
'tags-display-header' => 'Apariția în listele cu schimbări',
'tags-description-header' => 'Descrierea completă a sensului',
+'tags-active-header' => 'Activă?',
'tags-hitcount-header' => 'Modificări etichetate',
+'tags-active-yes' => 'Da',
+'tags-active-no' => 'Nu',
'tags-edit' => 'modificare',
'tags-hitcount' => '$1 {{PLURAL:$1|modificare|modificări}}',
@@ -3938,6 +4034,7 @@ Imaginile sunt afișate la rezoluția lor maximă, în timp ce alte tipuri de fi
'dberr-problems' => 'Ne cerem scuze! Acest site întâmpină dificultăți tehnice.',
'dberr-again' => 'Așteptați câteva minute și încercați din nou.',
'dberr-info' => '(Nu se poate contacta serverul bazei de date: $1)',
+'dberr-info-hidden' => '(Nu se poate contacta serverul bazei de date)',
'dberr-usegoogle' => 'Între timp puteți efectua căutarea folosind Google.',
'dberr-outofdate' => 'De reținut că indexarea conținutului nostru de către ei poate să nu fie actualizată.',
'dberr-cachederror' => 'Următoarea pagină este o copie în cache a paginii cerute, care s-ar putea să nu fie actualizată.',
@@ -3953,6 +4050,9 @@ Imaginile sunt afișate la rezoluția lor maximă, în timp ce alte tipuri de fi
'htmlform-submit' => 'Trimite',
'htmlform-reset' => 'Anulează modificările',
'htmlform-selectorother-other' => 'Altul',
+'htmlform-no' => 'Nu',
+'htmlform-yes' => 'Da',
+'htmlform-chosen-placeholder' => 'Alegeți o opțiune',
# SQLite database support
'sqlite-has-fts' => '$1 cu suport de căutare în tot textul',
@@ -4070,4 +4170,19 @@ Imaginile sunt afișate la rezoluția lor maximă, în timp ce alte tipuri de fi
# Image rotation
'rotate-comment' => 'Imagine rotită în sensul acelor de ceasornic cu $1 {{PLURAL:$1|grad|grade|de grade}}',
+# Limit report
+'limitreport-title' => 'Date de optimizare a analizorului:',
+'limitreport-cputime' => 'Timp de utilizare CPU',
+'limitreport-cputime-value' => '$1 {{PLURAL:$1|secundă|secunde|de secunde}}',
+'limitreport-walltime' => 'Timp real de utilizare',
+'limitreport-walltime-value' => '$1 {{PLURAL:$1|secundă|secunde|de secunde}}',
+'limitreport-ppvisitednodes' => 'Număr de noduri de preprocesor vizitate',
+'limitreport-ppgeneratednodes' => 'Număr de noduri de preprocesor generate',
+'limitreport-postexpandincludesize' => 'Mărimea includerii post-expansiune',
+'limitreport-postexpandincludesize-value' => '$1/$2 {{PLURAL:$2|octet|octeți|de octeți}}',
+'limitreport-templateargumentsize' => 'Mărimea argumentului formatului',
+'limitreport-templateargumentsize-value' => '$1/$2 {{PLURAL:$2|octet|octeți|de octeți}}',
+'limitreport-expansiondepth' => 'Cea mai mare profunzime a expansiunii',
+'limitreport-expensivefunctioncount' => 'Număr de funcții de analiză costisitoare',
+
);
diff --git a/languages/messages/MessagesRoa_tara.php b/languages/messages/MessagesRoa_tara.php
index 910a7940..425d0e1f 100644
--- a/languages/messages/MessagesRoa_tara.php
+++ b/languages/messages/MessagesRoa_tara.php
@@ -54,11 +54,6 @@ $messages = array(
'tog-shownumberswatching' => "Fa vedè 'u numere de le utinde ca uardene",
'tog-oldsig' => 'Firme esistende:',
'tog-fancysig' => "Firma grezze cumme a 'nu teste de Uicchi (senza collegamende automatiche)",
-'tog-externaleditor' => "Ause n'editore esterne pe default (sulamende pe l'esperte, abbesogne de 'na configurazione speciele sus a 'u combiuter tune. <br />
-[//www.mediawiki.org/wiki/Manual:External_editors Pe cchiù 'mbormaziune.])",
-'tog-externaldiff' => "Ause 'na differenze esterne pe default (sulamende pe l'esperte, abbesogne de 'na configuraziona speciele sus a 'u computer tune. <br />
-[//www.mediawiki.org/wiki/Manual:External_editors More information.])",
-'tog-showjumplinks' => 'Abbilite "zumbe a" pe scè sus a le collegaminde',
'tog-uselivepreview' => "Ause l'andeprime da 'u vive (Sperimendale)",
'tog-forceeditsummary' => "Ciércame conferme quanne stoche a 'nzerische 'nu riepighe vianghe",
'tog-watchlisthideown' => "Scunne le cangiaminde mije da l'elenghe de le pàggene condrollate",
@@ -72,6 +67,8 @@ $messages = array(
'tog-showhiddencats' => 'Fa vedè le categorije scunnute',
'tog-noconvertlink' => "Disabbilite 'a conversione d'u titele de collegamende",
'tog-norollbackdiff' => "Non sce penzanne a le differenze apprisse l'esecuzione de 'nu rollback",
+'tog-useeditwarning' => "Avvisave quanne jie lasse 'na pàgene cangiate senze ca agghie sarvate le cangiaminde",
+'tog-prefershttps' => "Ause sembre 'na connessione secure quanne trase",
'underline-always' => 'Sembre',
'underline-never' => 'Maje',
@@ -135,6 +132,18 @@ $messages = array(
'oct' => 'Ott',
'nov' => 'Nov',
'dec' => 'Dec',
+'january-date' => 'Scennare $1',
+'february-date' => 'Febbrare $1',
+'march-date' => 'Màrze $1',
+'april-date' => 'Abbrile $1',
+'may-date' => 'Màsce $1',
+'june-date' => 'Sciugne $1',
+'july-date' => 'Luglie $1',
+'august-date' => 'Aguste $1',
+'september-date' => 'Settemmre $1',
+'october-date' => 'Ottommre $1',
+'november-date' => 'Novemmre $1',
+'december-date' => 'Decemmre $1',
# Categories related messages
'pagecategories' => '{{PLURAL:$1|Categorije|Categorije}}',
@@ -156,7 +165,7 @@ $messages = array(
'broken-file-category' => 'Pàggene cu collegaminde a le file scuasciate',
'categoryviewer-pagedlinks' => '($1) ($2)',
-'linkprefix' => '/^(.*?)([a-zA-Z\\x80-\\xff]+)$/sD',
+'linkprefix' => '/^((?>.*(?<![a-zA-Z\\x80-\\xff])))(.+)$/sD',
'about' => 'Sus a',
'article' => 'Pàgene de le condenute',
@@ -219,6 +228,7 @@ $messages = array(
'create-this-page' => "Ccreje 'a pàgene",
'delete' => 'Scangìlle',
'deletethispage' => 'Scangille sta pàgene',
+'undeletethispage' => 'Repristine sta pàgene',
'undelete_short' => "Annulle {{PLURAL:$1|'nu camgiamende|$1 cangiaminde}}",
'viewdeleted_short' => "Vide {{PLURAL:$1|'nu cangiamende scangellate|$1 cangiaminde scangellate}}",
'protect' => 'Prutette',
@@ -262,7 +272,7 @@ $1",
'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).
+# 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).
'aboutsite' => 'Sus a {{SITENAME}}',
'aboutpage' => 'Project:Sus a',
'copyright' => "'U condenute jè disponibile sotte a $1.",
@@ -272,7 +282,6 @@ $1",
'disclaimers' => 'No ne sacce ninde',
'disclaimerpage' => 'Project:Scareca uarrile',
'edithelp' => "Cangianne l'ajute",
-'edithelppage' => 'Help:Cangiaminde',
'helppage' => 'Help:Condenute',
'mainpage' => 'Pàgene Prengepàle',
'mainpage-description' => 'Pàgene Prengepàle',
@@ -304,7 +313,6 @@ Vide [[Special:Version|Versione d'a pàgene]].",
'newmessagesdifflinkplural' => 'urteme {{PLURAL:$1|cangiamende|cangiaminde}}',
'youhavenewmessagesmulti' => "T'onne arrevete mèssagge nueve sus 'a $1",
'editsection' => 'cange',
-'editsection-brackets' => '[$1]',
'editold' => 'cange',
'viewsourceold' => 'vide sorgende',
'editlink' => 'cange',
@@ -356,17 +364,12 @@ Pe 'na liste de le pàggene speciele cirche aqquà [[Special:SpecialPages|{{int:
# General errors
'error' => 'Errore',
'databaseerror' => "Errore de l'archivije",
-'dberrortext' => "Ha assute n'errore de sindassi de 'na inderrogazione sus a 'u database.
-Quiste pò indicà 'nu bochere jndr'à 'u software.
-L'urteme tendative de inderrogazione sus a 'u database ha state:
-<blockquote><code>\$1</code></blockquote>
-cu 'a funzione \"<code>\$2</code>\".
-'U database ha returnate l'errore \"<samp>\$3: \$4</samp>\".",
-'dberrortextcl' => 'A assute \'n\'errore de sindasse sus a \'n\'inderrogazione d\'u database.
-L\'urteme tendative de inderrogazione sus a \'u database ha state:
-"$1"
-ausanne \'a funzione "$2".
-\'U database ha returnate l\'errore "$3: $4"',
+'databaseerror-text' => "Ha assute 'n'errore sus a 'n'inderrogazione d'u database.
+Quiste pò significaà ca ste 'nu bochere jndr'à 'u softuer.",
+'databaseerror-textcl' => "Ha assute 'n'errore sus a 'n'inderrogazione d'u database.",
+'databaseerror-query' => 'Inderrogazione: $1',
+'databaseerror-function' => 'Funzione: $1',
+'databaseerror-error' => 'Errore: $1',
'laggedslavemode' => "Attenzione: 'A pàgene no ge tène cangiaminde recente.",
'readonly' => 'Archivie blocchete',
'enterlockreason' => "Mitte 'na raggione p'u blocche, 'ncludenne 'na stime de quanne 'u blocche avène luate.",
@@ -400,6 +403,7 @@ Pò essere ca ggià ha state scangellete da quacche otre.',
'cannotdelete-title' => 'Non ge puè scangellà \'a pàgene "$1"',
'delete-hook-aborted' => "Cangiamende annullete da 'nu ''hook''.
Non g'à date nisciune mutive.",
+'no-null-revision' => 'Non ge se pò ccrejà \'na revisiona nove vacande pa pàgene "$1"',
'badtitle' => 'Titele sbagliete',
'badtitletext' => "'A pàgene ca è cerchete tène 'nu titele errete, vacande, o jè 'nu collegamende inter-lènghe o inter-uicchi errete.
Pò essere ca tène une o cchiù carattere ca non ge ponne essere ausete jndr'à le titele.",
@@ -423,12 +427,15 @@ Pe aggiungere o cangià le traduziune pe tutte le uicchi, pe piacere ause [//tra
'editinginterface' => "'''Fà attenziò:''' Tu ste cange 'na pàgene ca jè ausate pe dà 'n'inderfacce de teste p'u software.
Le cangiaminde de sta pàgene vonne a mettene mane sus a l'inderfacce utende pe l'otre utinde de sta Uicchi.
Pe aggiungere o cangià le traduziune, pe piacere vide ce ause [//translatewiki.net/ translatewiki.net], 'u pruggette de localizzazione de MediaUicchi.",
-'sqlhidden' => '(query SQL ascunnute)',
'cascadeprotected' => 'Sta pàgene ha state prutette da le cangiaminde, purcè jè ingluse jndr\'à {{PLURAL:$1|seguende pàgene, ca jè|le seguende pàggene, ca sonde}} prutette cu l\'opzione "a caschete":
$2',
'namespaceprotected' => "Non ge tine 'u permesse pe cangià pàggene d'u neimspeise '''$1'''.",
'customcssprotected' => "Non ge tine 'u permesse pe cangià sta pàgene de CSS, purcè tène otre configurazione personale.",
'customjsprotected' => "Non ge tine 'u permesse pe cangià sta pàgene de Javascript, purcè tène otre configurazione personale.",
+'mycustomcssprotected' => 'Non ge tìne le permesse pe cangià sta pàgene CSS',
+'mycustomjsprotected' => 'Non ge tìne le permesse pe cangià sta pàgene JavaScript',
+'myprivateinfoprotected' => "Non ge tìne le permesse pe cangià le 'mbormaziune private tune.",
+'mypreferencesprotected' => 'Non ge tìne le permesse pe cangià le preferenze tune.',
'ns-specialprotected' => 'Le pàgene speciale no ponne essere cangete.',
'titleprotected' => "Stu titele ha state prutette da 'a ccreazione da [[User:$1|$1]].
'U mutive jè ''$2''.",
@@ -453,10 +460,19 @@ Note Bbuene ca certe pàggene ponne condinuà a essere viste cumme ce tu ste ang
'welcomecreation-msg' => "'U cunde tue ha state ccrejete.
No te sce scurdanne de cangià le [[Special:Preferences|{{SITENAME}} preferenze tue]].",
'yourname' => 'Nome utende:',
+'userlogin-yourname' => 'Nome utende',
+'userlogin-yourname-ph' => "Mitte 'u nome utende tune",
+'createacct-another-username-ph' => "Mitte 'u nome utende",
'yourpassword' => 'Passuord:',
+'userlogin-yourpassword' => 'Passuord',
+'userlogin-yourpassword-ph' => "Mitte 'a passuord toje",
+'createacct-yourpassword-ph' => "Mitte 'na passuord",
'yourpasswordagain' => "Scrive 'a passuord notra vote:",
+'createacct-yourpasswordagain' => "Conferme 'a passuord",
+'createacct-yourpasswordagain-ph' => "Mitte arrete 'a passuord",
'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",
+'userlogin-remembermypassword' => 'Arrecuèrdeme',
+'userlogin-signwithsecure' => "Ause 'na connessione secure",
'yourdomainname' => "'U nome d'u dominie tue:",
'password-change-forbidden' => 'Non ge puè cangià le passuord sus a sta uicchi.',
'externaldberror' => "Vide bbuene, o stè 'n'errore de autendicazione a 'u database oppure tu non ge puè aggiorna 'u cunde tue esterne.",
@@ -468,18 +484,41 @@ No te sce scurdanne de cangià le [[Special:Preferences|{{SITENAME}} preferenze
'logout' => 'Isse',
'userlogout' => 'Isse',
'notloggedin' => 'Non ge sì colleghete',
+'userlogin-noaccount' => "Non ge tìne 'nu cunde?",
+'userlogin-joinproject' => "Tràse jndr'à {{SITENAME}}",
'nologin' => "Non ge tine n'utenze? '''$1'''.",
'nologinlink' => "Ccreje 'nu cunde utende",
'createaccount' => "Ccreje 'nu cunde",
'gotaccount' => "Tine già 'nu cunde? '''$1'''.",
'gotaccountlink' => 'Tràse',
'userlogin-resetlink' => "T'è scurdate le dettaglie pe trasè?",
+'userlogin-resetpassword-link' => "Azzere 'a passuord toje",
+'helplogin-url' => 'Help:Trasenne',
+'userlogin-helplink' => "[[{{MediaWiki:helplogin-url}}|Aijute cu 'a trasute]]",
+'createacct-join' => "Mitte le 'mbormaziune tune aqquà sotte.",
+'createacct-another-join' => "Mitte le 'mbormaziune d'u cunde nuève aqquà sotte.",
+'createacct-emailrequired' => 'Indirizze email',
+'createacct-emailoptional' => 'Indirizze email (opzionale)',
+'createacct-email-ph' => "Mitte l'indirizze email tune",
+'createacct-another-email-ph' => "Mitte l'indirizze email",
'createaccountmail' => "Ause 'na passuord temboranèe a uecchije e mannale a l'indirizze email specificate",
+'createacct-realname' => 'Nome vere (opzionale)',
'createaccountreason' => 'Mutive:',
+'createacct-reason' => 'Mutive',
+'createacct-reason-ph' => "Purcé tu ste ccreje 'n'otre cunde utende?",
+'createacct-captcha' => 'Verifiche de securezze',
+'createacct-imgcaptcha-ph' => "Mitte 'u teste tune aqquà sus",
+'createacct-submit' => "Ccreje 'u cunde utende tune",
+'createacct-another-submit' => "Ccreje 'n'otre cunde",
+'createacct-benefit-heading' => '{{SITENAME}} jè fatte da crestiane cumme a te.',
+'createacct-benefit-body1' => '{{PLURAL:$1|cangiamende|cangiaminde}}',
+'createacct-benefit-body2' => '{{PLURAL:$1|pàgene|pàggene}}',
+'createacct-benefit-body3' => '{{PLURAL:$1|condrebbutore}} recende',
'badretype' => 'Le passuord ca è scritte non ge sonde uguale.',
'userexists' => "'U nome de l'utende ca è scritte jè già ausate.
Pe piacere scacchiane n'otre.",
'loginerror' => 'Errore de collegamende',
+'createacct-error' => "Errore sus 'a ccrejazione d'u cunde",
'createaccounterror' => "Non ge puè ccrejà 'u cunde utende: $1",
'nocookiesnew' => "'U cunde utende ha state ccrejete ma angore non g'è trasute jndr'à {{SITENAME}}.
@@ -547,11 +586,13 @@ Tu, mò, t\'avisse a collegà e cangià \'a password toje.
Tu puè pure cacà stu messagge, ce stu cunde utende ha state ccrejete pe errore.',
'usernamehasherror' => "'U nome utende non ge pò tenè carattere hash",
-'login-throttled' => "Urtemamende tu è pruvate troppe vote a trasè jndr'à Uicchipèdie
-Pe piacere vide c'aspitte 'nu picche de timbe apprime de pruvà 'n'otra vote.",
+'login-throttled' => "Urtemamende tu è pruvate troppe vote a trasè jndr'à Uicchipèdie.
+Pe piacere vide c'aspitte $1 apprime de pruvà 'n'otra vote.",
'login-abort-generic' => "Non g'è riuscite a trasè - Annullate",
'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.",
+'createacct-another-realname-tip' => "'U nome vere jè facoltative.
+Ce tu scacchie de metterle, quiste avène ausate pe dà 'u giuste merite a 'a fatìe de l'utende.",
# Email sending
'php-mail-error-unknown' => "Errore scanusciute jndr'à funzione PHP mail()",
@@ -568,8 +609,7 @@ Pe spiccià 'a procedure de collegamende, tu a 'mbostà 'na password nove aqquà
'newpassword' => 'Nova passuord:',
'retypenew' => "Scrive n'otra vota 'a passuord nova:",
'resetpass_submit' => "'Mboste 'a passuord e colleghete",
-'resetpass_success' => "'A passuord toje ha state cangiate!
-Mò puè trasè...",
+'changepassword-success' => "'A password toje ha state cangiate!",
'resetpass_forbidden' => 'Le Password non ge ponne cangià',
'resetpass-no-info' => 'Tu a essere colleghete pe accedere a sta pàgene direttamende.',
'resetpass-submit-loggedin' => "Cange 'a password",
@@ -581,10 +621,11 @@ Pò essere ca tu è già cangete 'a password toje o è richieste una temboranea
# Special:PasswordReset
'passwordreset' => "Azzere 'a passuord",
-'passwordreset-text' => "Comblete stu module pe ricevere 'na mail de promemorie de le dettaglie d'u cunde tune.",
+'passwordreset-text-one' => "Comblete stu module pe azzerà 'a passuord toje.",
+'passwordreset-text-many' => "{{PLURAL:$1|Inghie une de le cambe de date pe azzerà 'a passuord toje.}}",
'passwordreset-legend' => "Azzere 'a passuord",
'passwordreset-disabled' => "'U reset de le passuord ha state desabbilitate sus a sta uicchi.",
-'passwordreset-pretext' => '{{PLURAL:$1||Mitte une de le stuèzze de le date aqquà sotte}}',
+'passwordreset-emaildisabled' => "Le funziune de l'email onne state disabbilitate sus a sta uicchi.",
'passwordreset-username' => 'Nome utende:',
'passwordreset-domain' => 'Dominie:',
'passwordreset-capture' => "Vide 'a mail resultande?",
@@ -608,7 +649,7 @@ Tu avissa trasè e scacchià 'na passuord nova. Ce quacchedun'otre ha fatte sta
Passuord temboranèe: $2',
'passwordreset-emailsent' => "'N'e-mail pe arrecurdarte ha state mannate.",
'passwordreset-emailsent-capture' => "'Na e-mail pe azzeramende d'a passuord ha state mannate, ca jè fatte vedè aqquà sotte.",
-'passwordreset-emailerror-capture' => "'Na e-mail de azzeramende d'a passuord ha state generate, ca jè fatte vedè aqquà sotte, ma 'u 'nvie a l'utende ha fallite: $1",
+'passwordreset-emailerror-capture' => "'Na e-mail de azzeramende d'a passuord ha state generate, ca jè fatte vedè aqquà sotte, ma 'u 'nvie a {{GENDER:$2|l'utende}} ha fallite: $1",
# Special:ChangeEmail
'changeemail' => "Cange 'u 'ndirizze e-mail",
@@ -622,6 +663,19 @@ Passuord temboranèe: $2',
'changeemail-submit' => 'Cange e-mail',
'changeemail-cancel' => 'Annulle',
+# Special:ResetTokens
+'resettokens' => 'Azzere le gettone',
+'resettokens-text' => "Tu puè azzerà le gettone le quale te donne l'accesse a certe date private collegate cu 'u cunde tune aqquà.
+
+Tu avissa farle ce pe sbaglie l'è condivise cu otre o ce 'u cunde tune ha state combromesse.",
+'resettokens-no-tokens' => 'Non ge stonne gettone de azzerà.',
+'resettokens-legend' => 'Azzere le gettone',
+'resettokens-tokens' => 'Gettone:',
+'resettokens-token-label' => '$1 (valore de mò: $2)',
+'resettokens-watchlist-token' => 'Gettone pu feed web (Atom/RSS) de [[Special:Watchlist|le cangiaminde de le pàggene condrollate]]',
+'resettokens-done' => 'Gettone azzerate.',
+'resettokens-resetbutton' => 'Azzere le gettone scacchiate',
+
# Edit page toolbar
'bold_sample' => 'Teste grascette',
'bold_tip' => 'Teste grascette',
@@ -831,11 +885,14 @@ Non g'à date nisciune mutive.",
Pare proprie ca l'onne scangellete.",
'edit-conflict' => 'conflitte de cangiaminde.',
'edit-no-change' => "'U cangiamende ca p fatte, avène scettate purcè 'u teste non g'à cangete manghe de 'na virgola.",
+'postedit-confirmation' => "'U cangiamende tune ha state reggistrate.",
'edit-already-exists' => "Non ge puè ccrejà 'na pàgene nove purcè esiste già!",
'defaultmessagetext' => 'Messàgge de teste de base',
'content-failed-to-parse' => "L'analise d'u condenute $2 pu modelle $1 ha fallite: $3",
'invalid-content-data' => "Condenute d'u date invalide",
'content-not-allowed-here' => '"$1" condenute non g\'è permesse sus \'a pàgene [[$2]]',
+'editwarning-warning' => 'Assenne da sta pàgene tu puè perdè tutte le date ca è cangiate.
+Ce tu è trasute, tu puè disabbilità st\'avvertimende jndr\'à sezione "Cangiaminde..." de le preferenze tune.',
# Content models
'content-model-wikitext' => 'Uicchiteste',
@@ -871,6 +928,7 @@ Pe piacere verifichesce 'u combronde sotte pe condrollà ca quiste ca tu vuè cc
'undo-failure' => "'U cangiamende non ge pò essere annullete purcè stè 'nu conflitte de cangiaminde indermedije.",
'undo-norev' => "'U cangiamende non ge pò essere annullete purcè non g'esiste o a state scangellete.",
'undo-summary' => "Repristine 'a revisione $1 da [[Special:Contributions/$2|$2]] ([[User talk:$2|'Ngazzaminde]])",
+'undo-summary-username-hidden' => "Annulle 'a revisione $1 da 'n'utende scunnute",
# Account creation failure
'cantcreateaccounttitle' => "Non ge puè ccrejà 'nu cunde utende",
@@ -1054,6 +1112,7 @@ Vide Bbuene ca ausanne le collegaminde de navigazzione sta culonne avène azzera
'compareselectedversions' => 'Combronde le versiune selezionete',
'showhideselectedversions' => 'Fà vedè/scunne le revisiune selezionate',
'editundo' => 'annulle',
+'diff-empty' => '(Nisciuna differenze)',
'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}})",
'difference-missing-revision' => "{{PLURAL:$2|'Na revisione|$2 revisiune}} de sta differenze ($1) {{PLURAL:$2|non g'onne|non g'onne}} state acchiate.
@@ -1081,7 +1140,6 @@ Le dettaglie le puè acchià jndr'à l'[{{fullurl:{{#Special:Log}}/delete|page={
'searchmenu-legend' => 'Opzione de ricerche',
'searchmenu-exists' => "'''Stè 'na pàgene nnumenete \"[[\$1]]\" sus 'a sta Uicchipèdie'''",
'searchmenu-new' => "'''[[:\$1|Ccreje]] 'a pàgene \"[[:\$1|\$1]]\" sus 'a sta Uicchipèdie!'''",
-'searchhelp-url' => 'Help:Condenute',
'searchmenu-prefix' => '[[Special:PrefixIndex/$1|Sfogghije le pàggene cu stu prefisse]]',
'searchprofile-articles' => 'Vôsce',
'searchprofile-project' => 'Pàggene de ajiute e de pruggette',
@@ -1125,15 +1183,7 @@ Prueve mettènne nnande a l'inderrogaziona toje 'u prefisse '''all:''' pe cercà
'searchdisabled' => "'A ricerche sus a {{SITENAME}} ha state disabbilitete.
Tu puè cercà ausanne Google.
Però fa attenzione purcè l'indice lore sus a {{SITENAME}} ponne condenè pàggene ca non ge sonde aggiornate.",
-
-# Quickbar
-'qbsettings' => 'Barra veloce',
-'qbsettings-none' => 'Ninde',
-'qbsettings-fixedleft' => 'Fissete a sinistre (Fixed left)',
-'qbsettings-fixedright' => 'Fissete a destre (Fixed right)',
-'qbsettings-floatingleft' => 'Volanne a sinistre (Floating left)',
-'qbsettings-floatingright' => 'Volanne a destre (Floating right)',
-'qbsettings-directionality' => "Corrette, depende da 'a direzionalità d'u script tune e da 'a lènga toje",
+'search-error' => "S'ha verificate 'n'errore mendre ste cercave: $1",
# Preferences page
'preferences' => 'Me piece accussì',
@@ -1167,7 +1217,6 @@ Però fa attenzione purcè l'indice lore sus a {{SITENAME}} ponne condenè pàgg
'resetprefs' => "Pulizze le cangiaminde ca non g'è reggistrete",
'restoreprefs' => "Repristine tutte le 'mbostaziune origgenale",
'prefs-editing' => 'Stoche a cange',
-'prefs-edit-boxsize' => "Dimenzione d'a pàgene de cangiamende.",
'rows' => 'Righe:',
'columns' => 'Culonne:',
'searchresultshead' => 'Cirche',
@@ -1178,9 +1227,9 @@ Però fa attenzione purcè l'indice lore sus a {{SITENAME}} ponne condenè pàgg
'recentchangesdays-max' => '(massime $1 {{PLURAL:$1|sciurne|sciurne}})',
'recentchangescount' => 'Numere de cangiaminde da fà vedè pe default:',
'prefs-help-recentchangescount' => "Quiste 'nglude le urteme cangiaminde, le storie de le pàggene e le archivije.",
-'prefs-help-watchlist-token' => "Anghienne stu cambe cu le chiave segrete avène generate 'nu RSS feed pa liste de le pàggene condrollate.<br />
-Ogneune ca canosce 'a chiave de stu cambe se pò leggere 'a liste de le pàggene condrollate tue, accussì scacchie 'nu valore secure.<br />
-Aqquà ste 'nu valore generate a uecchije ca tu puè ausà: $1",
+'prefs-help-watchlist-token2' => "Queste jè 'a chiave segrete a le feed d'u web de l'elenghe de le pàggene condrollate tune.
+Cengate vò ccu canosce ce pò leggere l'elenghe de le pàggene condrollate tune, accussì non g'ù pò condividere.
+[[Special:ResetTokens|Cazze aqquà ce tìne abbesogne de azzerarle]].",
'savedprefs' => 'Le preferenze tue onne state aggiornete.',
'timezonelegend' => "Orarie d'a zone:",
'localtime' => 'Orarie lochele:',
@@ -1211,7 +1260,6 @@ Aqquà ste 'nu valore generate a uecchije ca tu puè ausà: $1",
'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:",
-'prefs-textboxsize' => "Dimenzione d'a finestre de le cangiaminde",
'youremail' => 'Poste:',
'username' => "{{GENDER:$1|Nome de l'utende}}:",
'uid' => '{{GENDER:$1|ID Utende}}:',
@@ -1246,6 +1294,8 @@ Ce tu 'u mitte, a fatje ca è fatte t'avène ricanusciute.",
'prefs-dateformat' => "Formate d'a data",
'prefs-timeoffset' => "Differenze d'orarie",
'prefs-advancedediting' => 'Opziune avanzate',
+'prefs-editor' => 'Cangiatore',
+'prefs-preview' => 'Andeprime',
'prefs-advancedrc' => 'Opzione avanzate',
'prefs-advancedrendering' => 'Opzione avanzate',
'prefs-advancedsearchoptions' => 'Opzione avanzate',
@@ -1253,7 +1303,9 @@ Ce tu 'u mitte, a fatje ca è fatte t'avène ricanusciute.",
'prefs-displayrc' => "Fà vedè l'opzione",
'prefs-displaysearchoptions' => "Fà vedè l'opzione",
'prefs-displaywatchlist' => "Fà vedè l'opzione",
+'prefs-tokenwatchlist' => 'Gettone',
'prefs-diffs' => 'Diff',
+'prefs-help-prefershttps' => 'Sta preferenze pigghie effette sulamende quanne tràse arrete.',
# User preference: email validation using jQuery
'email-address-validity-valid' => "L'indirizze e-mail pare valide",
@@ -1281,6 +1333,8 @@ Ce tu 'u mitte, a fatje ca è fatte t'avène ricanusciute.",
'userrights-changeable-col' => 'Gruppe ca tu puè cangià',
'userrights-unchangeable-col' => 'Gruppe ca tu non ge puè cangià',
'userrights-irreversible-marker' => '$1*',
+'userrights-conflict' => 'Conflitte sus a le cangiaminde de le deritte utende! Pe piacere revide e conferme le cangiaminde tune.',
+'userrights-removed-self' => "T'è luate le deritte tune. Mò non ge puè cchiù trasè jndr'à sta pàgene.",
# Groups
'group' => 'Gruppe:',
@@ -1347,10 +1401,18 @@ Ce tu 'u mitte, a fatje ca è fatte t'avène ricanusciute.",
'right-unblockself' => 'Sbluecche da sule',
'right-protect' => 'Cange le levèlle de protezione e cange le pàggene prutette',
'right-editprotected' => 'Cange le pàggene prutette (senza protezzione a cascata)',
+'right-editsemiprotected' => 'Cange le pàggene prutette cumme a "{{int:protect-level-autoconfirmed}}"',
'right-editinterface' => "Cange l'inderfacce utende",
'right-editusercssjs' => "Cange 'u CSS e 'u JS de l'otre utinde",
'right-editusercss' => "Cange 'u CSS de l'otre utinde",
'right-edituserjs' => "Cange 'u JS de l'otre utinde",
+'right-editmyusercss' => 'Cange le file tune de CSS',
+'right-editmyuserjs' => 'Cange le file tune de JavaScript',
+'right-viewmywatchlist' => "'Ndruche le pàggene condrollate tune",
+'right-editmywatchlist' => 'Cange le pàggene condrollate tune. Vide bbuene ca certe aziune vonne a aggiungere pàggene pure ca non ge stonne le deritte.',
+'right-viewmyprivateinfo' => "'Ndruche le date private tune (p.e. indirizze email, nome vere)",
+'right-editmyprivateinfo' => 'Cange le date private tune (p.e. indirizze email, nome vere)',
+'right-editmyoptions' => 'Cange le preferenze tune',
'right-rollback' => "Annulle velocemende le cangiaminde de l'urteme utende ca ha cangiate 'na pàgena particolare",
'right-markbotedits' => 'Marche le cangiaminde annullate cumme cangiaminde de bot',
'right-noratelimit' => "Non g'à state tuccate da le limite de le pundegge",
@@ -1412,12 +1474,19 @@ Ce tu 'u mitte, a fatje ca è fatte t'avène ricanusciute.",
'action-userrights-interwiki' => "cange le deritte de l'utende de l'utinde de le otre Uicchi",
'action-siteadmin' => "blocche o sblocche 'u database",
'action-sendemail' => 'manne e-mail',
+'action-editmywatchlist' => 'cange le pàggene condrollate tune',
+'action-viewmywatchlist' => "'ndruche le pàggene condrollate tune",
+'action-viewmyprivateinfo' => "'ndruche le 'mbormaziune private tune",
+'action-editmyprivateinfo' => "cange le 'mbormaziune private tune",
# Recent changes
'nchanges' => '$1 {{PLURAL:$1|cangiaminde|cangiaminde}}',
+'enhancedrc-since-last-visit' => "$1 {{PLURAL:$1|da l'urtema visite}}",
+'enhancedrc-history' => 'cunde',
'recentchanges' => 'Cangiaminde recende',
'recentchanges-legend' => 'Opzione pe le cangiaminde recende',
'recentchanges-summary' => 'Tracce le cchiù recednde cangiaminde de Uicchi sus a sta pàgene.',
+'recentchanges-noresult' => "Nisciune cangiamende duranne 'u periode ca ste soddisfe stu criterie.",
'recentchanges-feed-description' => "Tracce le urteme cangiaminde sus 'a sta Uicchipedie jndr'à quiste feed.",
'recentchanges-label-newpage' => "Stu cangiamende ha ccrejate 'na pàgena nove",
'recentchanges-label-minor' => "Quiste ète 'nu cangiamende stuèdeche",
@@ -1456,7 +1525,6 @@ Ce tu 'u mitte, a fatje ca è fatte t'avène ricanusciute.",
'recentchangeslinked-feed' => 'Cangiaminde culleghete',
'recentchangeslinked-toolbox' => 'Cangiaminde culleghete',
'recentchangeslinked-title' => 'Cangiaminde culleghete a "$1"',
-'recentchangeslinked-noresult' => "Non g'onne state fatte cangiaminde sus 'a sta pàgene jndr'à 'u periede selezionete.",
'recentchangeslinked-summary' => "Queste jè 'a liste de le cangiaminde fatte de recende a le pàggene culleghete da ' na pàgene specifiche (o a le membre de 'na specifiche categorije).
Pàggene sus 'a [[Special:Watchlist|le Pàggene condrollete]] sonde in '''grascette'''.",
'recentchangeslinked-page' => "Nome d'a vôsce:",
@@ -1468,7 +1536,7 @@ Pàggene sus 'a [[Special:Watchlist|le Pàggene condrollete]] sonde in '''grasce
'reuploaddesc' => "Scangille 'u carecamende e tuerne a 'a schermete de le carecaminde",
'upload-tryagain' => "Conferme 'u cangiamende d'a descrizione d'u file",
'uploadnologin' => 'non ge sinde colleghete',
-'uploadnologintext' => 'Tu a essere [[Special:UserLogin|colleghete]] pe carecà le file.',
+'uploadnologintext' => 'Tu a essere $1 pe carecà le file.',
'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',
@@ -1703,7 +1771,6 @@ Pe 'na securezze a uerre proprie, img_auth.php jè disabbilitate.",
'http-read-error' => "Errore jndr'à letture de l' HTTP",
'http-timed-out' => 'Richieste HTTP fore timbe.',
'http-curl-error' => "Errore analizzanne l'URL: $1",
-'http-host-unreachable' => "Non ge riesche a raggiungere l'URL",
'http-bad-status' => "Ha state 'nu probbleme duranne 'a richieste HTTP: $1, $2",
# Some likely curl errors. More could be added from <http://curl.haxx.se/libcurl/c/libcurl-errors.html>
@@ -1735,6 +1802,10 @@ Quanne jè filtrate da l'utende, sulamende le file addò quidde utende ave carec
'listfiles_size' => 'Dimenzione',
'listfiles_description' => 'Descrizione',
'listfiles_count' => 'Versiune',
+'listfiles-show-all' => "'Nglude le versiune vicchie de le immaggine",
+'listfiles-latestversion' => 'Versione de mò',
+'listfiles-latestversion-yes' => 'Sìne',
+'listfiles-latestversion-no' => 'None',
# File description page
'file-anchor-link' => 'File',
@@ -1833,6 +1904,13 @@ Arrecuèrdete de condrollà pe otre collegaminde a le template apprime de scange
'randompage' => 'Pàgene a uecchie',
'randompage-nopages' => "Non ge stonne pàggene jndr'à {{PLURAL:$2|'u seguende namespace|le seguende namespace}}: $1.",
+# Random page in category
+'randomincategory' => "Pàggene a uecchije jndr'à categorije",
+'randomincategory-invalidcategory' => '"$1" non g\'è \'nu nome d\'a categorije valide.',
+'randomincategory-nopages' => "Non ge stonne pàggene jndr'à [[:Category:$1]].",
+'randomincategory-selectcategory' => "Pigghie pàggene a uecchije da 'a categorije: $1 $2.",
+'randomincategory-selectcategory-submit' => 'Véje',
+
# Random redirect
'randomredirect' => 'Redirezionamende a uecchie',
'randomredirect-nopages' => 'Non ge stonne redirezionaminde jndr\'à \'u namespace "$1".',
@@ -1858,17 +1936,13 @@ Arrecuèrdete de condrollà pe otre collegaminde a le template apprime de scange
'statistics-users-active-desc' => "Sonde l'utinde ca onne fatte quacchecose jndr'à l'urteme {{PLURAL:$1|giurne|$1 giurne}}",
'statistics-mostpopular' => 'Pàggene cchiù visitete',
-'disambiguations' => 'Pàggene collegate a le pàggene de disambiguazione',
-'disambiguationspage' => 'Template:disambigue',
-'disambiguations-text' => "Le pàggene seguende appondene a 'na '''pàgene de disambiguazione'''.
-'Nvece avessere appondà a 'a temateca appropriate.<br />
-'Na pàgene jè trattate cumme pàgene de disambiguazione ce tu ause 'nu template ca è appundate da [[MediaWiki:Disambiguationspage]]",
-
'pageswithprop' => "Pàggene cu 'na probbietà d'a pàgene",
'pageswithprop-legend' => "Pàggene cu 'na probbietà d'a pàgene",
'pageswithprop-text' => "Sta pàgene elenghe le pàggene ca ausane 'na particolare probbietà d'a pàgene.",
'pageswithprop-prop' => "Nome d'a probbietà:",
'pageswithprop-submit' => 'Véje',
+'pageswithprop-prophidden-long' => "valore d'a probbietà d'u teste lunghe scunnute ($1)",
+'pageswithprop-prophidden-binary' => 'valore probbietà binarie scunnute ($1)',
'doubleredirects' => 'Ridirezionaminde a doppie',
'doubleredirectstext' => "Sta pàgene elenghe le pàggene ca se ridirezionane sus a otre pàggene de ridirezionaminde.
@@ -1927,6 +2001,7 @@ Mò s'avène redirette a [[$2]].",
'mostrevisions' => 'Pàggene cchiù cangete',
'prefixindex' => "Tutte le pàggene cu 'u prefisse",
'prefixindex-namespace' => "Tutte le pàggene cu 'u prefisse ($1 namespace)",
+'prefixindex-strip' => "Strisce d'u prefisse jndr'à l'elenghe",
'shortpages' => 'Pàggene corte',
'longpages' => 'Pàggene longhe',
'deadendpages' => 'Pàggene senza collegamende',
@@ -2122,7 +2197,6 @@ Le cangiaminde future a sta pàgene e 'a pàgene de le 'ngazzaminde associete le
'unwatchthispage' => "No condrollà cchiù 'a pàgene",
'notanarticle' => "Non g'è 'na vosce",
'notvisiblerev' => "'A revisione ha state scangellete",
-'watchnochange' => "Niscune de le vôsce condrollete onne state cangete jndr'à 'u periode visualizzate.",
'watchlist-details' => "{{PLURAL:$1|$1 pàgene|$1 pàggene}} jndr'à liste de le pàggene condrollete, scartanne le pàggene de le 'ngazzaminde.",
'wlheader-enotif' => '* Notifiche pe email abbilitate.',
'wlheader-showupdated' => "* Le pàggene ca onne state cangiate da l'urtema visite avènene fatte vedè in '''grascette'''",
@@ -2541,16 +2615,14 @@ Pò essere ca ha state già sbloccate.",
Jidde ha state bloccate cumme parte de l'indervalle $2, ca pò essere sbloccate.",
'ip_range_invalid' => "L'indervalle de l'IP non g'è valide.",
'ip_range_toolarge' => 'Le indervalle de le blocche cchiù larie de /$1 non ge sonde permesse.',
-'blockme' => 'Bloccheme',
'proxyblocker' => 'Bloccaore de proxy',
-'proxyblocker-disabled' => "'A funzione ha state disabbilitete.",
'proxyblockreason' => "L'indirizze IP tue ha state bloccate purcè jè 'nu proxy apirte.
Pe piacere condatte 'u provider de Indernette tue o 'u supporte tecniche e 'mbormescele de stu serie probbleme de securezze.",
-'proxyblocksuccess' => 'Spicciete.',
'sorbs' => 'DNSBL',
'sorbsreason' => "L'indirizze IP tue jè elegate cumme a 'nu proxy apirte jndr'à DNSBL ausate da {{SITENAME}}.",
'sorbs_create_account_reason' => "L'indirizze IP tue jè elegate cumme a 'nu proxy apirte jndr'à DNSBL ausate da {{SITENAME}}.
Tu nonge puè ccrejà 'nu cunde utende",
+'xffblockreason' => "'N'indirizze IP presende jndr'à testate X-Forwarded-For, tutte e doje le tune o 'nu server proxy ca ste ause, onne state bloccate. 'U mutive d'u blocche origgenale ere: $1",
'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',
@@ -2717,6 +2789,8 @@ Pe piacere vè vide [//www.mediawiki.org/wiki/Localisation Localizzazione de Med
'thumbnail-more' => 'Allarije',
'filemissing' => 'File perdute',
'thumbnail_error' => "Errore ccrejanne l'andeprime picenne: $1",
+'thumbnail_error_remote' => "Messàgge d'errore da $1:
+$2",
'djvu_page_error' => 'Pàgene DjVu fore da le limite',
'djvu_no_xml' => "Non ge riesche a esaminà l'XML d'u file DjVu",
'thumbnail-temp-create' => "Non ge se pò ccrejà 'na miniature temboranèe d'u file",
@@ -2871,17 +2945,11 @@ Permette de aggiungere 'nu mutive jndr'à 'u riepileghe",
# Stylesheets
'common.css' => "/* 'U CSS ca se iacchie aqquà avène applicate a tutte le masckere */",
-'standard.css' => "/* 'U CSS ca se iacchie aqquà 'u 'ndrucane le utinde d'a masckere Standard */",
-'nostalgia.css' => "/* 'U CSS ca se iacchie aqquà 'u 'ndrucane le utinde d'a masckere Nostalgie */",
'cologneblue.css' => "/* 'U CSS ca se iacchie aqquà 'u 'ndrucane le utinde d'a masckere Blu Cologne */",
'monobook.css' => "/* 'U CSS ca se iacchie aqquà 'u 'ndrucane le utinde d'a masckere Monobook */",
-'myskin.css' => "/* 'U CSS ca se iacchie aqquà 'u 'ndrucane le utinde d'a masckere Personalizzate */",
-'chick.css' => "/* 'U CSS ca se iacchie aqquà 'u 'ndrucane le utinde d'a masckere Purecine */",
-'simple.css' => "/* 'U CSS ca se iacchie aqquà 'u 'ndrucane le utinde d'a masckere Semblice */",
'modern.css' => "/* 'U CSS ca se iacchie aqquà 'u 'ndrucane le utinde d'a masckere Moderne */",
'vector.css' => "/* 'U CSS ca se iacchie aqquà 'u 'ndrucane le utinde d'a masckere Vettore */",
'print.css' => "/* 'U CSS ca se iacchie aqquà avène applicate a 'u resultate d'a stambe */",
-'handheld.css' => "/* 'U CSS ca se iacchie aqquà l'ausane le dispositive de gestione manuale basate sus a masckere configurate in \$wgHandheldStyle */",
'noscript.css' => "/* 'U CSS ca se iacchie aqquà l'ausane le utinde cu 'u Javascript disabbilitate */",
'group-autoconfirmed.css' => "/* 'U CSS ca se iacchie aqquà ave effettue seulamende sus a le utinde autoconfirmatarie */",
'group-bot.css' => "/* 'U CSS ca se iacchie aqquà ave effettue seulamende sus a le bot */",
@@ -2890,12 +2958,8 @@ Permette de aggiungere 'nu mutive jndr'à 'u riepileghe",
# Scripts
'common.js' => '/* Ogne JavaScript aqquà avène carecate pe tutte le utinde sus a ogne pàgene carecate. */',
-'standard.js' => "/* Ogne JavaScript aqquà avène carecate pe le utinde ca ausane 'a masckere Standard */",
-'nostalgia.js' => "/* Ogne JavaScript aqquà avène carecate pe le utinde ca ausane 'a masckere Nostalgie */",
'cologneblue.js' => "/* Ogne JavaScript aqquà avène carecate pe le utinde ca ausane 'a masckere Blu Cologne */",
'monobook.js' => "/* Ogne JavaScript aqquà avène carecate pe le utinde ca ausane 'a masckere MonoBook */",
-'myskin.js' => "/* Ogne JavaScript aqquà avène carecate pe le utinde ca ausane 'a masckere Personalizzate */",
-'chick.js' => "/* Ogne JavaScript aqquà avène carecate pe le utinde ca ausane 'a masckere Purecine */",
'modern.js' => "/* Ogne JavaScript aqquà avène carecate pe le utinde ca ausane 'a masckere Moderne */",
'vector.js' => "/* Ogne JavaScript aqquà avène carecate pe le utinde ca ausane 'a masckere Vettore */",
'group-autoconfirmed.js' => '/* Ogne JavaScript aqquà avène carecate pe le utinde autoconfirmatarie */',
@@ -2976,13 +3040,8 @@ Stu fatte ha state causate da 'nu collegamende a 'nu site esterne ca appartene a
'pageinfo-category-files' => 'Numere de file',
# Skin names
-'skinname-standard' => 'Classeche',
-'skinname-nostalgia' => 'Nostalgie',
'skinname-cologneblue' => 'Blu Cologne',
'skinname-monobook' => 'MonoBook',
-'skinname-myskin' => 'Personalizzate',
-'skinname-chick' => 'Purecine',
-'skinname-simple' => 'Semblice',
'skinname-modern' => 'Moderne',
'skinname-vector' => 'Vettore',
@@ -3067,11 +3126,25 @@ Ce l'esegue sus a 'u sisteme tue pò essere ca se combromette.",
'minutes' => '{{PLURAL:$1|$1 minute|$1 minute}}',
'hours' => '{{PLURAL: $1|$1ore|$1 ore}}',
'days' => '{{PLURAL: $1|$1 sciurne|$1 sciurne}}',
+'weeks' => '{{PLURAL:$1|$1 sumàne}}',
'months' => '{{PLURAL:$1|$1 mese|$1 mise}}',
'years' => '{{PLURAL:$1|$1 anne}}',
'ago' => '$1 fà',
'just-now' => 'mò mò',
+# Human-readable timestamps
+'hours-ago' => '$1 {{PLURAL:$1|ore}} fà',
+'minutes-ago' => '$1 {{PLURAL:$1|minute}} fà',
+'seconds-ago' => '$1 {{PLURAL:$1|seconde}} fà',
+'monday-at' => 'Lunedìe a le $1',
+'tuesday-at' => 'Martedìe a le $1',
+'wednesday-at' => 'Mercrudìe a le $1',
+'thursday-at' => 'Sciuvedìe a le $1',
+'friday-at' => 'Venerdìe a le $1',
+'saturday-at' => 'Sabbète a le $1',
+'sunday-at' => 'Dumeneche a le $1',
+'yesterday-at' => 'Aijere a le $1',
+
# Bad image list
'bad_image_list' => "'U formete jè 'u seguende:
@@ -3156,7 +3229,7 @@ Otre avènene scunnute pe defolt.
'metadata-langitem' => "'''$2:''' $1",
'metadata-langitem-default' => '$1',
-# EXIF tags
+# Exif tags
'exif-imagewidth' => 'Larghezze',
'exif-imagelength' => 'Altezze',
'exif-bitspersample' => 'Bit pe combonende',
@@ -3349,7 +3422,7 @@ $4, $5, $6 $7
$8',
'exif-subjectnewscode-value' => '$2 ($1)',
-# EXIF attributes
+# Exif attributes
'exif-compression-1' => 'No combresse',
'exif-compression-2' => "Gruppe CCITT 3 Decodifeche de Esecuzione d'a lunghezze 1-Dimenzionale Cangiate de Huffman",
'exif-compression-3' => "Gruppe CCITT 3 de decodifeche d'u fax",
@@ -3691,7 +3764,6 @@ Pe piacere conferme ca tu vuè avveramende reccrejà sta pàgene.",
'semicolon-separator' => ';&#32;',
'comma-separator' => ',&#32;',
'colon-separator' => ':&#32;',
-'autocomment-prefix' => '-&#32;',
'pipe-separator' => '&#32;•&#32;',
'word-separator' => '&#32;',
'ellipsis' => '...',
@@ -3861,7 +3933,6 @@ Tu puè pure [[Special:EditWatchlist|ausà 'u cangiatore standàrd]].",
'version-other' => 'Otre',
'version-mediahandlers' => 'Gestore de le Media',
'version-hooks' => 'Hook',
-'version-extension-functions' => 'Funziune estese',
'version-parser-extensiontags' => "Tag pe l'estenziune de l'analizzatore",
'version-parser-function-hooks' => "Funziune hook de l'analizzatore",
'version-hook-name' => "Nome de l'hook",
@@ -3871,6 +3942,7 @@ Tu puè pure [[Special:EditWatchlist|ausà 'u cangiatore standàrd]].",
'version-license' => 'Licenze',
'version-poweredby-credits' => "Sta Uicchi jè fatte da '''[//www.mediawiki.org/ MediaWiki]''', copyright © 2001-$1 $2.",
'version-poweredby-others' => 'otre',
+'version-poweredby-translators' => 'tradutture de translatewiki.net',
'version-credits-summary' => 'Nuje vulesseme acchià le persone seguende pe le lore condrebbute a [[Special:Version|MediaUicchi]].',
'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.
@@ -3884,12 +3956,17 @@ Avisse avè ricevute [{{SERVER}}{{SCRIPTPATH}}/COPYING 'na copie d'a GNU (Licenz
'version-entrypoints-header-entrypoint' => "Punde d'ingresse",
'version-entrypoints-header-url' => 'URL',
-# Special:FilePath
-'filepath' => "Percorse d'u fail",
-'filepath-page' => 'File:',
-'filepath-submit' => 'Véje',
-'filepath-summary' => "Sta pàgena speciale retorne 'u percorse comblete pe 'nu file.<br />
-Le immaggine sonde fatte vedè jndr'à resoluziona megghie, otre tipe de file rechiamane 'u lore programme associate direttamende.",
+# Special:Redirect
+'redirect' => "Redirette da 'u file, utende o ID d'a revisione",
+'redirect-legend' => "Redirette a 'nu file o 'na pàgene",
+'redirect-summary' => "Sta pàgena speciale redirezione a 'nu file (date 'u nome d'u file), 'na pàgene (fate 'n'ID de revisione), o 'na pàgene utende (date 'n'ID numeriche de l'utende).",
+'redirect-submit' => 'Véje',
+'redirect-lookup' => 'Mappature:',
+'redirect-value' => 'Valore:',
+'redirect-user' => "ID de l'utende",
+'redirect-revision' => "Revisione d'a pàgene",
+'redirect-file' => "Nome d'u file",
+'redirect-not-exists' => 'Valore non acchiate',
# Special:FileDuplicateSearch
'fileduplicatesearch' => 'Cirche pe le file duplichete',
@@ -3939,6 +4016,7 @@ Le immaggine sonde fatte vedè jndr'à resoluziona megghie, otre tipe de file re
'tags' => 'Cangiaminde de le tag valide',
'tag-filter' => 'Filtre de le [[Special:Tags|tag]]:',
'tag-filter-submit' => 'Filtre',
+'tag-list-wrapper' => '([[Special:Tags|{{PLURAL:$1|Tag}}]]: $2)',
'tags-title' => 'Tag',
'tags-intro' => "Sta pàgene elenghe le tag ca 'u software pò marcà cu 'nu cangiamende e 'u lore significate.",
'tags-tag' => "Nome d'u tag",
@@ -3965,6 +4043,7 @@ Le immaggine sonde fatte vedè jndr'à resoluziona megghie, otre tipe de file re
'dberr-problems' => "Simw spiacende! Stu site stè 'ngondre de le diffcoltà tecniche.",
'dberr-again' => 'Aspitte quacche minute e pò recareche.',
'dberr-info' => "(Non ge riuscime a condattà 'u server d'u database: $1)",
+'dberr-info-hidden' => "(Non ge pozze condattà 'u server d'u database)",
'dberr-usegoogle' => 'Pu mumende tu puè pruvà a cercà cu Google.',
'dberr-outofdate' => 'Vide ca le indice lore de le condenute nuèstre ponne essere non aggiornate.',
'dberr-cachederror' => "Queste jè 'na copie ''cache'' d'a pàgene ca è cercate e allore non g'à puè cangià.",
@@ -3980,6 +4059,9 @@ Le immaggine sonde fatte vedè jndr'à resoluziona megghie, otre tipe de file re
'htmlform-submit' => 'Conferme',
'htmlform-reset' => 'Annulle le cangiaminde',
'htmlform-selectorother-other' => 'Otre',
+'htmlform-no' => 'None',
+'htmlform-yes' => 'Sìne',
+'htmlform-chosen-placeholder' => "Scacchie 'n'opzione",
# SQLite database support
'sqlite-has-fts' => "$1 cu 'u supporte d'a ricerche full-text",
@@ -4097,4 +4179,19 @@ Ce nò, tu puè ausà 'u module facile aqquà sotte. 'U commende tune avène agg
# Image rotation
'rotate-comment' => 'Immaggine rotate de $1 {{PLURAL:$1|grade}} in sienze orarie',
+# Limit report
+'limitreport-title' => "Analizzatore de le date d'a profilazione:",
+'limitreport-cputime' => "Tiembe de ause d'a CPU",
+'limitreport-cputime-value' => '$1 {{PLURAL:$1|seconde}}',
+'limitreport-walltime' => 'Tiembe de ause in dirette',
+'limitreport-walltime-value' => '$1 {{PLURAL:$1|seconde}}',
+'limitreport-ppvisitednodes' => "Preprocessore d'u cunde de le node 'ndrucate",
+'limitreport-ppgeneratednodes' => "Preprocessore d'u cunde de le node generate",
+'limitreport-postexpandincludesize' => "Espanzione de apprisse ca 'nglude 'a dimenzione",
+'limitreport-postexpandincludesize-value' => '$1/$2 {{PLURAL:$2|byte}}',
+'limitreport-templateargumentsize' => "Dimenzione de le argomende d'u template",
+'limitreport-templateargumentsize-value' => '$1/$2 {{PLURAL:$2|byte}}',
+'limitreport-expansiondepth' => 'Espanzione massime de profonnetà',
+'limitreport-expensivefunctioncount' => "Analizzatore d'u cunde d'a funzione ca coste assaije",
+
);
diff --git a/languages/messages/MessagesRu.php b/languages/messages/MessagesRu.php
index d768cdea..a595abe6 100644
--- a/languages/messages/MessagesRu.php
+++ b/languages/messages/MessagesRu.php
@@ -15,11 +15,14 @@
* @author AlexSm
* @author Alexander Sigachov (alexander.sigachov@gmail.com)
* @author Alexandr Efremov
+ * @author Altai uul
+ * @author Am81
* @author Amikeco
* @author Amire80
* @author Anonim.one
* @author Askarmuk
* @author Assele
+ * @author BellaIlabekyan
* @author Biathlon
* @author Bouron
* @author Chilin
@@ -30,6 +33,7 @@
* @author Daniyar
* @author Dim Grits
* @author Don Alessandro
+ * @author Ekulikovdo
* @author Eleferen
* @author Erdemaslancan
* @author EugeneZelenko
@@ -61,6 +65,8 @@
* @author KorneySan
* @author Kv75
* @author Lockal
+ * @author Lord Dimetr
+ * @author Lunacy1911
* @author Matma Rex
* @author MaxBioHazard
* @author MaxSem
@@ -75,6 +81,7 @@
* @author Sagan
* @author Shirayuki
* @author Sk
+ * @author Soul Train
* @author Spider
* @author Sunpriat
* @author TarzanASG
@@ -87,6 +94,7 @@
* @author ГуÑейн
* @author ОйЛ
* @author Умар
+ * @author Чаховіч УладзіÑлаў
* @author לערי ריינה×רט
* @author გიáƒáƒ áƒ’იმელáƒ
*/
@@ -124,16 +132,17 @@ $specialPageAliases = array(
'Activeusers' => array( 'Ðктивные_учаÑтники' ),
'Allmessages' => array( 'СиÑтемные_ÑообщениÑ' ),
'Allpages' => array( 'Ð’Ñе_Ñтраницы' ),
+ 'Badtitle' => array( 'ÐедопуÑтимое_название' ),
'Blankpage' => array( 'ПуÑтаÑ_Ñтраница' ),
'Block' => array( 'Заблокировать' ),
'Blockme' => array( 'Заблокируй_менÑ' ),
'Booksources' => array( 'ИÑточники_книг' ),
'BrokenRedirects' => array( 'Разорванные_перенаправлениÑ' ),
'Categories' => array( 'Категории' ),
- 'ChangeEmail' => array( 'Сменить_e-mail' ),
+ 'ChangeEmail' => array( 'Сменить_e-mail', 'Сменить_почту' ),
'ChangePassword' => array( 'Сменить_пароль' ),
'ComparePages' => array( 'Сравнение_Ñтраниц' ),
- 'Confirmemail' => array( 'Подтвердить_e-mail' ),
+ 'Confirmemail' => array( 'Подтвердить_e-mail', 'Подтвердить_почту' ),
'Contributions' => array( 'Вклад' ),
'CreateAccount' => array( 'Создать_учётную_запиÑÑŒ', 'Создать_пользователÑ', 'ЗарегиÑтрироватьÑÑ' ),
'Deadendpages' => array( 'Тупиковые_Ñтраницы' ),
@@ -143,9 +152,12 @@ $specialPageAliases = array(
'EditWatchlist' => array( 'Править_ÑпиÑок_наблюдениÑ' ),
'Emailuser' => array( 'ПиÑьмо_учаÑтнику', 'Отправить_пиÑьмо' ),
'Export' => array( 'ЭкÑпорт', 'Выгрузка' ),
+ 'Fewestrevisions' => array( 'Редко_редактируемые' ),
'FileDuplicateSearch' => array( 'ПоиÑк_дубликатов_файлов' ),
'Filepath' => array( 'Путь_к_файлу' ),
'Import' => array( 'Импорт' ),
+ 'Invalidateemail' => array( 'Отменить_подтверждение_адреÑа' ),
+ 'JavaScriptTest' => array( 'ТеÑтирование_JavaScript' ),
'BlockList' => array( 'СпиÑок_блокировок', 'Блокировки' ),
'LinkSearch' => array( 'ПоиÑк_ÑÑылок' ),
'Listadmins' => array( 'СпиÑок_админиÑтраторов' ),
@@ -160,7 +172,13 @@ $specialPageAliases = array(
'Longpages' => array( 'Длинные_Ñтраницы' ),
'MergeHistory' => array( 'Объединение_иÑторий' ),
'MIMEsearch' => array( 'ПоиÑк_по_MIME' ),
+ 'Mostcategories' => array( 'Самые_категоризованные' ),
'Mostimages' => array( 'Самые_иÑпользуемые_файлы' ),
+ 'Mostinterwikis' => array( 'Ðаибольшее_количеÑтво_интервики-ÑÑылок' ),
+ 'Mostlinked' => array( 'Самые_иÑпользуемые_Ñтраницы' ),
+ 'Mostlinkedcategories' => array( 'Самые_иÑпользуемые_категории' ),
+ 'Mostlinkedtemplates' => array( 'Самые_иÑпользуемые_шаблоны' ),
+ 'Mostrevisions' => array( 'Ðаибольшее_количеÑтво_верÑий' ),
'Movepage' => array( 'Переименовать_Ñтраницу', 'Переименование', 'Переименовать' ),
'Mycontributions' => array( 'Мой_вклад' ),
'Mypage' => array( 'МоÑ_Ñтраница' ),
@@ -172,9 +190,11 @@ $specialPageAliases = array(
'PermanentLink' => array( 'ПоÑтоÑннаÑ_ÑÑылка' ),
'Popularpages' => array( 'ПопулÑрные_Ñтраницы' ),
'Preferences' => array( 'ÐаÑтройки' ),
+ 'Prefixindex' => array( 'Указатель_по_началу_названиÑ' ),
'Protectedpages' => array( 'Защищённые_Ñтраницы' ),
'Protectedtitles' => array( 'Защищённые_названиÑ' ),
'Randompage' => array( 'СлучайнаÑ_Ñтраница', 'СлучайнаÑ' ),
+ 'Randomredirect' => array( 'Случайное_перенаправление' ),
'Recentchanges' => array( 'Свежие_правки' ),
'Recentchangeslinked' => array( 'СвÑзанные_правки' ),
'Revisiondelete' => array( 'Удаление_правки' ),
@@ -189,6 +209,7 @@ $specialPageAliases = array(
'Uncategorizedpages' => array( 'Ðекатегоризованные_Ñтраницы' ),
'Uncategorizedtemplates' => array( 'Ðекатегоризованные_шаблоны' ),
'Undelete' => array( 'ВоÑÑтановить', 'ВоÑÑтановление' ),
+ 'Unlockdb' => array( 'Разблокировка_БД' ),
'Unusedcategories' => array( 'ÐеиÑпользуемые_категории' ),
'Unusedimages' => array( 'ÐеиÑпользуемые_файлы' ),
'Unusedtemplates' => array( 'ÐеиÑпользуемые_шаблоны' ),
@@ -247,6 +268,7 @@ $magicWords = array(
'pagenamee' => array( '1', 'ÐÐЗВÐÐИЕ_СТРÐÐИЦЫ_2', 'PAGENAMEE' ),
'namespace' => array( '1', 'ПРОСТРÐÐСТВО_ИМÐÐ', 'NAMESPACE' ),
'namespacee' => array( '1', 'ПРОСТРÐÐСТВО_ИМÐÐ_2', 'NAMESPACEE' ),
+ 'namespacenumber' => array( '1', 'ÐОМЕР_ПРОСТРÐÐСТВÐ_ИМÐÐ', 'NAMESPACENUMBER' ),
'talkspace' => array( '1', 'ПРОСТРÐÐСТВО_ОБСУЖДЕÐИЙ', 'TALKSPACE' ),
'talkspacee' => array( '1', 'ПРОСТРÐÐСТВО_ОБСУЖДЕÐИЙ_2', 'TALKSPACEE' ),
'subjectspace' => array( '1', 'ПРОСТРÐÐСТВО_СТÐТЕЙ', 'SUBJECTSPACE', 'ARTICLESPACE' ),
@@ -294,6 +316,7 @@ $magicWords = array(
'localurl' => array( '0', 'ЛОКÐЛЬÐЫЙ_ÐДРЕС:', 'LOCALURL:' ),
'localurle' => array( '0', 'ЛОКÐЛЬÐЫЙ_ÐДРЕС_2:', 'LOCALURLE:' ),
'articlepath' => array( '0', 'ПУТЬ_К_СТÐТЬЕ', 'ARTICLEPATH' ),
+ 'pageid' => array( '0', 'ИДЕÐТИФИКÐТОР_СТРÐÐИЦЫ', 'PAGEID' ),
'server' => array( '0', 'СЕРВЕР', 'SERVER' ),
'servername' => array( '0', 'ÐÐЗВÐÐИЕ_СЕРВЕРÐ', 'SERVERNAME' ),
'scriptpath' => array( '0', 'ПУТЬ_К_СКРИПТУ', 'SCRIPTPATH' ),
@@ -355,6 +378,10 @@ $magicWords = array(
'url_path' => array( '0', 'ПУТЬ', 'PATH' ),
'url_wiki' => array( '0', 'ВИКИ', 'WIKI' ),
'url_query' => array( '0', 'ЗÐПРОС', 'QUERY' ),
+ 'pagesincategory_all' => array( '0', 'вÑе', 'all' ),
+ 'pagesincategory_pages' => array( '0', 'Ñтраницы', 'pages' ),
+ 'pagesincategory_subcats' => array( '0', 'подкатегории', 'subcats' ),
+ 'pagesincategory_files' => array( '0', 'файлы', 'files' ),
);
@@ -441,9 +468,6 @@ $messages = array(
'tog-shownumberswatching' => 'Показывать чиÑло учаÑтников, включивших Ñтраницу в Ñвой ÑпиÑок наблюдениÑ',
'tog-oldsig' => 'Ð¢ÐµÐºÑƒÑ‰Ð°Ñ Ð¿Ð¾Ð´Ð¿Ð¸ÑÑŒ:',
'tog-fancysig' => 'СобÑÑ‚Ð²ÐµÐ½Ð½Ð°Ñ Ð²Ð¸ÐºÐ¸-разметка подпиÑи (без автоматичеÑкой ÑÑылки)',
-'tog-externaleditor' => 'ИÑпользовать по умолчанию внешний редактор (только Ð´Ð»Ñ ÑпециалиÑтов, необходима оÑÐ¾Ð±Ð°Ñ Ð½Ð°Ñтройка компьютера; [//www.mediawiki.org/wiki/Manual:External_editors подробнее])',
-'tog-externaldiff' => 'ИÑпользовать по умолчанию внешнюю программу ÑÑ€Ð°Ð²Ð½ÐµÐ½Ð¸Ñ (только Ð´Ð»Ñ ÑпециалиÑтов, необходима оÑÐ¾Ð±Ð°Ñ Ð½Ð°Ñтройка компьютера; [//www.mediawiki.org/wiki/Manual:External_editors подробнее])',
-'tog-showjumplinks' => 'Включить вÑпомогательные ÑÑылки «перейти к»',
'tog-uselivepreview' => 'ИÑпользовать быÑтрый предварительный проÑмотр (ÑкÑпериментально)',
'tog-forceeditsummary' => 'Предупреждать, когда не заполнено поле опиÑÐ°Ð½Ð¸Ñ Ð¿Ñ€Ð°Ð²ÐºÐ¸',
'tog-watchlisthideown' => 'Скрывать мои правки из ÑпиÑка наблюдениÑ',
@@ -457,6 +481,8 @@ $messages = array(
'tog-showhiddencats' => 'Показывать Ñкрытые категории',
'tog-noconvertlink' => 'Отключить ÑÑылку на преобразование заголовка',
'tog-norollbackdiff' => 'Ðе показывать разницу верÑий поÑле Ð²Ñ‹Ð¿Ð¾Ð»Ð½ÐµÐ½Ð¸Ñ Ð¾Ñ‚ÐºÐ°Ñ‚Ð°',
+'tog-useeditwarning' => 'Предупреждать, когда Ñ Ð¿Ð¾ÐºÐ¸Ð´Ð°ÑŽ Ñтраницу Ñ Ð½ÐµÑохранёнными изменениÑми',
+'tog-prefershttps' => 'Ð’Ñегда иÑпользовать защищённое Ñоединение поÑле предÑÑ‚Ð°Ð²Ð»ÐµÐ½Ð¸Ñ ÑиÑтеме',
'underline-always' => 'Ð’Ñегда',
'underline-never' => 'Ðикогда',
@@ -520,6 +546,18 @@ $messages = array(
'oct' => 'окт',
'nov' => 'ноÑ',
'dec' => 'дек',
+'january-date' => 'Январь $1',
+'february-date' => 'Февраль $1',
+'march-date' => 'Март $1',
+'april-date' => 'Ðпрель $1',
+'may-date' => 'Май $1',
+'june-date' => 'Июнь $1',
+'july-date' => 'Июль $1',
+'august-date' => 'ÐвгуÑÑ‚ $1',
+'september-date' => 'СентÑбрь $1',
+'october-date' => 'ОктÑбрь $1',
+'november-date' => 'ÐоÑбрь $1',
+'december-date' => 'Декабрь $1',
# Categories related messages
'pagecategories' => '{{PLURAL:$1|КатегориÑ|Категории}}',
@@ -601,6 +639,7 @@ $messages = array(
'create-this-page' => 'Создать Ñту Ñтраницу',
'delete' => 'Удалить',
'deletethispage' => 'Удалить Ñту Ñтраницу',
+'undeletethispage' => 'ВоÑÑтановить Ñту Ñтраницу',
'undelete_short' => 'ВоÑÑтановить $1 {{PLURAL:$1|правку|правки|правок}}',
'viewdeleted_short' => 'ПроÑмотр $1 {{PLURAL:$1|удалённой правки|удалённых правок|удалённых правок}}',
'protect' => 'Защитить',
@@ -644,7 +683,7 @@ $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).
+# 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).
'aboutsite' => 'ОпиÑание {{grammar:genitive|{{SITENAME}}}}',
'aboutpage' => 'Project:ОпиÑание',
'copyright' => 'Содержимое доÑтупно по лицензии $1 (еÑли не указано иное).',
@@ -654,7 +693,6 @@ $1',
'disclaimers' => 'Отказ от ответÑтвенноÑти',
'disclaimerpage' => 'Project:Отказ от ответÑтвенноÑти',
'edithelp' => 'Справка по редактированию',
-'edithelppage' => 'Help:Как править Ñтатьи',
'helppage' => 'Help:Содержание',
'mainpage' => 'Ð—Ð°Ð³Ð»Ð°Ð²Ð½Ð°Ñ Ñтраница',
'mainpage-description' => 'Ð—Ð°Ð³Ð»Ð°Ð²Ð½Ð°Ñ Ñтраница',
@@ -732,17 +770,12 @@ $1',
# General errors
'error' => 'Ошибка',
'databaseerror' => 'Ошибка базы данных',
-'dberrortext' => 'Обнаружена ошибка ÑинтакÑиÑа запроÑа к базе данных.
-Это может означать ошибку в программном обеÑпечении.
-ПоÑледний Ð·Ð°Ð¿Ñ€Ð¾Ñ Ðº базе данных:
-: <code>$1</code>
-произошёл из функции «<code>$2</code>».
-База данных возвратила ошибку «<code>$3: $4</code>».',
-'dberrortextcl' => 'Обнаружена ошибка ÑинтакÑиÑа запроÑа к базе данных.
-ПоÑледний Ð·Ð°Ð¿Ñ€Ð¾Ñ Ðº базе данных:
-: «<code>$1</code>»
-произошёл из функции «<code>$2</code>».
-База данных возвратила ошибку «<code>$3: $4</code>».',
+'databaseerror-text' => 'Произошла ошибка в базе данных.
+Это может указывать на ошибку в программном обеÑпечении.',
+'databaseerror-textcl' => 'Произошла ошибка в базе данных.',
+'databaseerror-query' => 'ЗапроÑ: $1',
+'databaseerror-function' => 'ФункциÑ: $1',
+'databaseerror-error' => 'Ошибка: $1',
'laggedslavemode' => 'Внимание: Ñтраница может не Ñодержать поÑледних обновлений.',
'readonly' => 'ЗапиÑÑŒ в базу данных заблокирована',
'enterlockreason' => 'Укажите причину и намеченный Ñрок блокировки.',
@@ -775,6 +808,7 @@ $1',
'cannotdelete-title' => 'ÐÐµÐ»ÑŒÐ·Ñ ÑƒÐ´Ð°Ð»Ð¸Ñ‚ÑŒ Ñтраницу «$1»',
'delete-hook-aborted' => 'Правка отменена процедурой-перехватчиком.
Дополнительных поÑÑнений не приведено.',
+'no-null-revision' => 'Ðе удалоÑÑŒ Ñоздать новую нулевую правку Ð´Ð»Ñ Ñтраницы «$1»',
'badtitle' => 'ÐедопуÑтимое название',
'badtitletext' => 'Запрашиваемое название Ñтраницы неправильно, пуÑто, либо неверно указано межъÑзыковое или интервики название. Возможно, в названии иÑпользуютÑÑ Ð½ÐµÐ´Ð¾Ð¿ÑƒÑтимые Ñимволы.',
'perfcached' => 'Следующие данные взÑÑ‚Ñ‹ из кÑша и могут не учитывать поÑледних изменений. Ð’ кÑше хранитÑÑ Ð½Ðµ более $1 {{PLURAL:$1|запиÑи|запиÑей|запиÑей}}.',
@@ -796,12 +830,15 @@ $1',
'editinginterface' => "'''Внимание:''' Ð’Ñ‹ редактируете Ñтраницу, Ñодержащую текÑÑ‚ интерфейÑа программного обеÑпечениÑ.
Её изменение повлиÑет на внешний вид интерфейÑа Ð´Ð»Ñ Ð´Ñ€ÑƒÐ³Ð¸Ñ… пользователей Ñтой вики.
Чтобы добавить или изменить перевод Ñтого ÑообщениÑ, пожалуйÑта, иÑпользуйте Ñайт локализации MediaWiki [//translatewiki.net/ translatewiki.net].",
-'sqlhidden' => '(SQL Ð·Ð°Ð¿Ñ€Ð¾Ñ Ñкрыт)',
'cascadeprotected' => 'Страница защищена от изменений, поÑкольку она включена в {{PLURAL:$1|Ñледующую Ñтраницу, Ð´Ð»Ñ ÐºÐ¾Ñ‚Ð¾Ñ€Ð¾Ð¹|Ñледующие Ñтраницы, Ð´Ð»Ñ ÐºÐ¾Ñ‚Ð¾Ñ€Ñ‹Ñ…}} включена каÑÐºÐ°Ð´Ð½Ð°Ñ Ð·Ð°Ñ‰Ð¸Ñ‚Ð°:
$2',
'namespaceprotected' => 'У Ð²Ð°Ñ Ð½ÐµÑ‚ Ñ€Ð°Ð·Ñ€ÐµÑˆÐµÐ½Ð¸Ñ Ñ€ÐµÐ´Ð°ÐºÑ‚Ð¸Ñ€Ð¾Ð²Ð°Ñ‚ÑŒ Ñтраницы в проÑтранÑтве имён «$1».',
'customcssprotected' => 'У Ð²Ð°Ñ Ð½ÐµÑ‚ Ñ€Ð°Ð·Ñ€ÐµÑˆÐµÐ½Ð¸Ñ Ñ€ÐµÐ´Ð°ÐºÑ‚Ð¸Ñ€Ð¾Ð²Ð°Ñ‚ÑŒ Ñту CSS-Ñтраницу, так как она Ñодержит личные наÑтройки другого учаÑтника.',
'customjsprotected' => 'У Ð²Ð°Ñ Ð½ÐµÑ‚ Ñ€Ð°Ð·Ñ€ÐµÑˆÐµÐ½Ð¸Ñ Ñ€ÐµÐ´Ð°ÐºÑ‚Ð¸Ñ€Ð¾Ð²Ð°Ñ‚ÑŒ Ñту JavaScript-Ñтраницу, так как она Ñодержит личные наÑтройки другого учаÑтника.',
+'mycustomcssprotected' => 'У Ð²Ð°Ñ Ð½ÐµÑ‚ прав Ð´Ð»Ñ Ñ€ÐµÐ´Ð°ÐºÑ‚Ð¸Ñ€Ð¾Ð²Ð°Ð½Ð¸Ñ Ñтого CSS Ñтраницы.',
+'mycustomjsprotected' => 'У Ð²Ð°Ñ Ð½ÐµÑ‚ прав Ð´Ð»Ñ Ñ€ÐµÐ´Ð°ÐºÑ‚Ð¸Ñ€Ð¾Ð²Ð°Ð½Ð¸Ñ JavaScript на Ñтранице.',
+'myprivateinfoprotected' => 'У Ð²Ð°Ñ Ð½ÐµÑ‚ Ñ€Ð°Ð·Ñ€ÐµÑˆÐµÐ½Ð¸Ñ Ð½Ð° изменение вашей личной информации',
+'mypreferencesprotected' => 'У Ð²Ð°Ñ Ð½ÐµÑ‚ прав Ð´Ð»Ñ Ñ€ÐµÐ´Ð°ÐºÑ‚Ð¸Ñ€Ð¾Ð²Ð°Ð½Ð¸Ñ Ð²Ð°ÑˆÐ¸Ñ… наÑтроек.',
'ns-specialprotected' => 'Страницы проÑтранÑтва имён «{{ns:special}}» не могут правитьÑÑ.',
'titleprotected' => "Создание Ñтраницы Ñ Ñ‚Ð°ÐºÐ¸Ð¼ заголовком было запрещено учаÑтником [[УчаÑтник:$1|$1]].
Указана ÑÐ»ÐµÐ´ÑƒÑŽÑ‰Ð°Ñ Ð¿Ñ€Ð¸Ñ‡Ð¸Ð½Ð°: ''$2''.",
@@ -826,10 +863,19 @@ $2',
'welcomecreation-msg' => 'Ваша ÑƒÑ‡Ñ‘Ñ‚Ð½Ð°Ñ Ð·Ð°Ð¿Ð¸ÑÑŒ Ñоздана.
Ðе забудьте провеÑти [[Special:Preferences|перÑональную наÑтройку]] Ñайта {{SITENAME}}.',
'yourname' => 'Ð˜Ð¼Ñ ÑƒÑ‡Ñ‘Ñ‚Ð½Ð¾Ð¹ запиÑи:',
+'userlogin-yourname' => 'Ð˜Ð¼Ñ ÑƒÑ‡Ñ‘Ñ‚Ð½Ð¾Ð¹ запиÑи',
+'userlogin-yourname-ph' => 'Введите Ð¸Ð¼Ñ Ð²Ð°ÑˆÐµÐ¹ учётной запиÑи',
+'createacct-another-username-ph' => 'Введите Ð¸Ð¼Ñ Ð²Ð°ÑˆÐµÐ¹ учётной запиÑи',
'yourpassword' => 'Пароль:',
+'userlogin-yourpassword' => 'Пароль',
+'userlogin-yourpassword-ph' => 'Введите Ñвой пароль',
+'createacct-yourpassword-ph' => 'Введите пароль',
'yourpasswordagain' => 'Повторный набор паролÑ:',
+'createacct-yourpasswordagain' => 'Подтвердите пароль',
+'createacct-yourpasswordagain-ph' => 'Введите пароль еще раз',
'remembermypassword' => 'Помнить мою учётную запиÑÑŒ на Ñтом компьютере (не более $1 {{PLURAL:$1|днÑ|дней|дней}})',
-'securelogin-stick-https' => 'Продолжить подключение по HTTPS поÑле входа',
+'userlogin-remembermypassword' => 'ОÑтаватьÑÑ Ð² ÑиÑтеме',
+'userlogin-signwithsecure' => 'Защищённое Ñоединение',
'yourdomainname' => 'Ваш домен:',
'password-change-forbidden' => 'Ð’Ñ‹ не можете изменить пароль в Ñтой вики.',
'externaldberror' => 'Произошла ошибка при аутентификации Ñ Ð¿Ð¾Ð¼Ð¾Ñ‰ÑŒÑŽ внешней базы данных или у Ð²Ð°Ñ Ð½ÐµÐ´Ð¾Ñтаточно прав Ð´Ð»Ñ Ð²Ð½ÐµÑÐµÐ½Ð¸Ñ Ð¸Ð·Ð¼ÐµÐ½ÐµÐ½Ð¸Ð¹ в Ñвою внешнюю учётную запиÑÑŒ.',
@@ -841,18 +887,44 @@ $2',
'logout' => 'Завершение ÑеанÑа',
'userlogout' => 'Завершение ÑеанÑа',
'notloggedin' => 'Ð’Ñ‹ не предÑтавилиÑÑŒ ÑиÑтеме',
+'userlogin-noaccount' => 'Ðет учетной запиÑи?',
+'userlogin-joinproject' => 'ПриÑоединитьÑÑ Ðº проекту',
'nologin' => 'Ðет учётной запиÑи? $1.',
'nologinlink' => 'Создать учётную запиÑÑŒ',
'createaccount' => 'Создать учётную запиÑÑŒ',
'gotaccount' => "Ð’Ñ‹ уже зарегиÑтрированы? '''$1'''.",
'gotaccountlink' => 'ПредÑтавьтеÑÑŒ',
'userlogin-resetlink' => 'Забыли данные Ð´Ð»Ñ Ð²Ñ…Ð¾Ð´Ð°?',
+'userlogin-resetpassword-link' => 'Ð¡Ð±Ñ€Ð¾Ñ Ð¿Ð°Ñ€Ð¾Ð»Ñ',
+'helplogin-url' => 'Help:ПредÑтавление ÑиÑтеме',
+'userlogin-helplink' => '[[{{MediaWiki:helplogin-url}}|Помощь Ñо входом в ÑиÑтему]]',
+'userlogin-loggedin' => 'Вы уже вошли как {{GENDER:$1|$1}}.
+ИÑпользуйте форму ниже, чтобы войти под другим пользователем.',
+'userlogin-createanother' => 'Создать другую учётную запиÑÑŒ',
+'createacct-join' => 'Введите Ñвои данные ниже.',
+'createacct-another-join' => 'Введите данные новой учётной запиÑи ниже.',
+'createacct-emailrequired' => 'ÐÐ´Ñ€ÐµÑ Ñлектронной почты',
+'createacct-emailoptional' => 'ÐÐ´Ñ€ÐµÑ Ñлектронной почты (необÑзательно)',
+'createacct-email-ph' => 'Введите Ñвой Ð°Ð´Ñ€ÐµÑ Ñлектронной почты',
+'createacct-another-email-ph' => 'Введите Ð°Ð´Ñ€ÐµÑ Ñлектронной почты',
'createaccountmail' => 'ИÑпользовать Ñгенерированный Ñлучайным образом временный пароль и выÑлать мне его на указанный Ð°Ð´Ñ€ÐµÑ Ñлектронной почты',
+'createacct-realname' => 'ÐаÑтоÑщее Ð¸Ð¼Ñ (необÑзательно)',
'createaccountreason' => 'Причина:',
+'createacct-reason' => 'Причина',
+'createacct-reason-ph' => 'Зачем вы Ñоздаёте другую учетную запиÑÑŒ',
+'createacct-captcha' => 'Проверка безопаÑноÑти',
+'createacct-imgcaptcha-ph' => 'Введите текÑÑ‚, который вы видите выше',
+'createacct-submit' => 'Создать учётную запиÑÑŒ',
+'createacct-another-submit' => 'Создать ещё одну учётную запиÑÑŒ',
+'createacct-benefit-heading' => '{{SITENAME}} Ñоздана такими же людьми, как вы.',
+'createacct-benefit-body1' => '{{PLURAL:$1|правка|правки|правок}}',
+'createacct-benefit-body2' => '{{PLURAL:$1|ÑтатьÑ|Ñтатьи|Ñтатей}}',
+'createacct-benefit-body3' => '{{PLURAL:$1|учаÑтник|учаÑтника|учаÑтников}} за поÑледнее времÑ',
'badretype' => 'Введённые вами пароли не Ñовпадают.',
'userexists' => 'Введённое Ð¸Ð¼Ñ ÑƒÑ‡Ð°Ñтника уже иÑпользуетÑÑ.
ПожалуйÑта, выберите другое имÑ.',
'loginerror' => 'Ошибка Ð¾Ð¿Ð¾Ð·Ð½Ð°Ð²Ð°Ð½Ð¸Ñ ÑƒÑ‡Ð°Ñтника',
+'createacct-error' => 'Ошибка ÑÐ¾Ð·Ð´Ð°Ð½Ð¸Ñ ÑƒÑ‡Ñ‘Ñ‚Ð½Ð¾Ð¹ запиÑи',
'createaccounterror' => 'Ðевозможно Ñоздать учётную запиÑÑŒ: $1',
'nocookiesnew' => 'УчаÑтник зарегиÑтрирован, но не предÑтавлен. {{SITENAME}} иÑпользует «cookies» Ð´Ð»Ñ Ð¿Ñ€ÐµÐ´ÑÑ‚Ð°Ð²Ð»ÐµÐ½Ð¸Ñ ÑƒÑ‡Ð°Ñтников. У Ð²Ð°Ñ Â«cookies» запрещены. ПожалуйÑта, разрешите их, а затем предÑтавьтеÑÑŒ Ñо Ñвоиим новым именем учаÑтника и паролем.',
'nocookieslogin' => '{{SITENAME}} иÑпользует «cookies» Ð´Ð»Ñ Ð¿Ñ€ÐµÐ´ÑÑ‚Ð°Ð²Ð»ÐµÐ½Ð¸Ñ ÑƒÑ‡Ð°Ñтников. Ð’Ñ‹ их отключили. ПожалуйÑта, включите их и попробуйте Ñнова.',
@@ -914,10 +986,12 @@ $2',
Проигнорируйте данное Ñообщение, еÑли ÑƒÑ‡Ñ‘Ñ‚Ð½Ð°Ñ Ð·Ð°Ð¿Ð¸ÑÑŒ была Ñоздана по ошибке.',
'usernamehasherror' => 'Ð˜Ð¼Ñ ÑƒÑ‡Ð°Ñтника не может Ñодержать Ñимвол «решётки»',
'login-throttled' => 'Ð’Ñ‹ Ñделали Ñлишком много попыток предÑтавитьÑÑ ÑиÑтеме.
-ПожалуйÑта, подождите перед тем, как попробовать Ñнова.',
+ПожалуйÑта, подождите $1 перед тем, как попробовать Ñнова.',
'login-abort-generic' => 'ÐÐµÑƒÐ´Ð°Ñ‡Ð½Ð°Ñ Ð¿Ð¾Ð¿Ñ‹Ñ‚ÐºÐ° предÑтавитьÑÑ ÑиÑтеме',
'loginlanguagelabel' => 'Язык: $1',
'suspicious-userlogout' => 'Ваш Ð·Ð°Ð¿Ñ€Ð¾Ñ Ð½Ð° завершение ÑеанÑа отклонён, так как он похож на запроÑ, отправленный некорректным браузером или кÑширующим прокÑи.',
+'createacct-another-realname-tip' => 'ÐаÑтоÑщее Ð¸Ð¼Ñ (необÑзательное поле).
+ЕÑли вы укажете его, то оно будет иÑпользовано Ð´Ð»Ñ Ñ‚Ð¾Ð³Ð¾, чтобы показать, кем была внеÑена правка Ñтраницы.',
# Email sending
'php-mail-error-unknown' => 'ÐеизвеÑÑ‚Ð½Ð°Ñ Ð¾ÑˆÐ¸Ð±ÐºÐ° в PHP-функции mail()',
@@ -933,8 +1007,7 @@ $2',
'newpassword' => 'Ðовый пароль:',
'retypenew' => 'Повторите ввод нового паролÑ:',
'resetpass_submit' => 'УÑтановить пароль и предÑтавитьÑÑ',
-'resetpass_success' => 'Ваш пароль был уÑпешно изменён!
-ПроизводитÑÑ Ð²Ñ…Ð¾Ð´ в ÑиÑтему…',
+'changepassword-success' => 'Ваш пароль был уÑпешно изменён!',
'resetpass_forbidden' => 'Пароль не может быть изменён',
'resetpass-no-info' => 'Чтобы обращатьÑÑ Ð½ÐµÐ¿Ð¾ÑредÑтвенно к Ñтой Ñтранице, вам Ñледует предÑтавитьÑÑ ÑиÑтеме.',
'resetpass-submit-loggedin' => 'Изменить пароль',
@@ -946,10 +1019,11 @@ $2',
# Special:PasswordReset
'passwordreset' => 'Ð¡Ð±Ñ€Ð¾Ñ Ð¿Ð°Ñ€Ð¾Ð»Ñ',
-'passwordreset-text' => 'Чтобы ÑброÑить Ñвой пароль, заполните Ñту форму.',
+'passwordreset-text-one' => 'Заполните Ñту форму, чтобы ÑброÑить Ñвой пароль.',
+'passwordreset-text-many' => '{{PLURAL:$1|Заполните одно из полей Ð´Ð»Ñ ÑброÑа паролÑ.}}',
'passwordreset-legend' => 'СброÑить пароль',
'passwordreset-disabled' => 'СброÑÑ‹ Ð¿Ð°Ñ€Ð¾Ð»Ñ Ð¾Ñ‚ÐºÐ»ÑŽÑ‡ÐµÐ½Ñ‹ на Ñтой вики.',
-'passwordreset-pretext' => '{{PLURAL:$1||Введите одну из чаÑтей данных, показанных ниже}}',
+'passwordreset-emaildisabled' => 'Функции Ñлектронной почты отключены в Ñтой вики.',
'passwordreset-username' => 'Ð˜Ð¼Ñ ÑƒÑ‡Ð°Ñтника:',
'passwordreset-domain' => 'Домен:',
'passwordreset-capture' => 'ПроÑмотреть получившееÑÑ Ð¿Ð¸Ñьмо?',
@@ -978,7 +1052,7 @@ $2
Временный пароль: $2',
'passwordreset-emailsent' => 'Отправлено Ñлектронное пиÑьмо Ñ Ð¸Ð½Ñ„Ð¾Ñ€Ð¼Ð°Ñ†Ð¸ÐµÐ¹ о ÑброÑе паролÑ.',
'passwordreset-emailsent-capture' => 'Отправлено Ñлектронное пиÑьмо Ñ Ð¸Ð½Ñ„Ð¾Ñ€Ð¼Ð°Ñ†Ð¸ÐµÐ¹ о ÑброÑе паролÑ, текÑÑ‚ которого можно увидеть ниже.',
-'passwordreset-emailerror-capture' => 'Ðиже приведено Ñозданное пиÑьмо-напоминание, его отправка не удалаÑÑŒ по причине: $1',
+'passwordreset-emailerror-capture' => 'Было Ñоздано Ñлектронное пиÑьмо Ñ Ð¸Ð½Ñ„Ð¾Ñ€Ð¼Ð°Ñ†Ð¸ÐµÐ¹ о ÑброÑе паролÑ, текÑÑ‚ которого можно увидеть ниже, однако его не удалоÑÑŒ отправить {{GENDER:$2|учаÑтнику|учаÑтнице}} по Ñледующей причине: $1',
# Special:ChangeEmail
'changeemail' => 'Изменить Ð°Ð´Ñ€ÐµÑ Ñлектронной почты',
@@ -992,6 +1066,19 @@ $2
'changeemail-submit' => 'Изменить адреÑ',
'changeemail-cancel' => 'Отмена',
+# Special:ResetTokens
+'resettokens' => 'СброÑить токены',
+'resettokens-text' => 'Ð’Ñ‹ можете ÑброÑить токены, которые позволÑÑŽÑ‚ иметь доÑтуп к некоторым личным данным, которые ÑвÑзаны Ñ Ð²Ð°ÑˆÐµÐ¹ учётной запиÑью.
+
+Вам необходимо Ñделать Ñто, еÑли вы Ñлучайно поделилÑÑ Ð¸Ð¼Ð¸ Ñ ÐºÐµÐ¼-то, или еÑли ваш аккаунт был взломан.',
+'resettokens-no-tokens' => 'Ðет токенов Ð´Ð»Ñ ÑброÑа.',
+'resettokens-legend' => 'СброÑить токены',
+'resettokens-tokens' => 'Токены:',
+'resettokens-token-label' => '$1 (текущее значение: $2)',
+'resettokens-watchlist-token' => 'Токен Ð´Ð»Ñ Ð²ÐµÐ±-канала (Atom/RSS) [[Special:Watchlist|изменений Ñтраниц в вашем ÑпиÑке наблюдениÑ]]',
+'resettokens-done' => 'Токены Ñброшены.',
+'resettokens-resetbutton' => 'СброÑить выбранные токены',
+
# Edit page toolbar
'bold_sample' => 'Полужирное начертание',
'bold_tip' => 'Полужирное начертание',
@@ -1193,12 +1280,15 @@ $2
ВероÑтно, она была удалена.',
'edit-conflict' => 'Конфликт редактированиÑ.',
'edit-no-change' => 'Ваша правка была отклонена, так как в текÑте не было Ñделано изменений.',
+'postedit-confirmation' => 'Ваша правка Ñохранена.',
'edit-already-exists' => 'Ðевозможно Ñоздать новую Ñтраницу.
Она уже ÑущеÑтвует.',
'defaultmessagetext' => 'ТекÑÑ‚ по умолчанию',
'content-failed-to-parse' => 'Содержимое $2 не ÑоответÑтвует типу $1: $3.',
'invalid-content-data' => 'ÐедопуÑтимые данные',
'content-not-allowed-here' => 'Содержимое "$1" недопуÑтимо на Ñтранице [[$2]]',
+'editwarning-warning' => 'Переход на другую Ñтраницу может привеÑти к потере Ñделанных вами изменений.
+ЕÑли вы зарегиÑтрированы в ÑиÑтеме, то вы можете отключить Ñто предупреждение в разделе «Редактирование» ваших наÑтроек.',
# Content models
'content-model-wikitext' => 'вики-текÑÑ‚',
@@ -1233,6 +1323,7 @@ $2
'undo-failure' => 'Правка не может быть отменена из-за неÑовмеÑтимоÑти промежуточных изменений.',
'undo-norev' => 'Правка не может быть отменена, так как её не ÑущеÑтвует или она была удалена.',
'undo-summary' => 'Отмена правки $1, Ñделанной {{GENDER:$2|учаÑтником|учаÑтницей}} [[Special:Contributions/$2|$2]] ([[User talk:$2|обÑ.]])',
+'undo-summary-username-hidden' => 'Отмена правки $1, Ñделанной учаÑтником, чьё Ð¸Ð¼Ñ Ñкрыто',
# Account creation failure
'cantcreateaccounttitle' => 'Ðевозможно Ñоздать учётную запиÑÑŒ',
@@ -1412,6 +1503,7 @@ $1",
'compareselectedversions' => 'Сравнить выбранные верÑии',
'showhideselectedversions' => 'Показать/Ñкрыть выбранные верÑии',
'editundo' => 'отменить',
+'diff-empty' => '(нет различий)',
'diff-multi' => '({{PLURAL:$1|не показана $1 Ð¿Ñ€Ð¾Ð¼ÐµÐ¶ÑƒÑ‚Ð¾Ñ‡Ð½Ð°Ñ Ð²ÐµÑ€ÑиÑ|не показаны $1 промежуточные верÑии|не показаны $1 промежуточных верÑий}} {{PLURAL:$2|$2 учаÑтника|$2 учаÑтников}})',
'diff-multi-manyusers' => '(не {{PLURAL:$1|показана $1 Ð¿Ñ€Ð¾Ð¼ÐµÐ¶ÑƒÑ‚Ð¾Ñ‡Ð½Ð°Ñ Ð²ÐµÑ€ÑиÑ|показаны $1 промежуточные верÑии|показаны $1 промежуточных верÑий}}, Ñделанные более чем $2 {{PLURAL:$2|учаÑтником|учаÑтниками}})',
'difference-missing-revision' => '{{PLURAL:$2|$2 верÑиÑ|$2 верÑии|$2 верÑий}} Ð´Ð»Ñ Ñтого ÑÑ€Ð°Ð²Ð½ÐµÐ½Ð¸Ñ ($1) {{PLURAL:$2|не обнаружена|не обнаружены}}.
@@ -1439,7 +1531,6 @@ $1",
'searchmenu-legend' => 'ÐаÑтройки поиÑка',
'searchmenu-exists' => "'''Ð’ Ñтой вики еÑÑ‚ÑŒ Ñтраница «[[:$1]]»'''",
'searchmenu-new' => "'''Создать Ñтраницу «[[:$1]]» в Ñтом вики-проекте!'''",
-'searchhelp-url' => 'Help:Содержание',
'searchmenu-prefix' => '[[Special:PrefixIndex/$1|Показать Ñтраницы Ñ Ñтим префикÑом]]',
'searchprofile-articles' => 'ОÑновные Ñтраницы',
'searchprofile-project' => 'Страницы Ñправки и проекта',
@@ -1480,15 +1571,7 @@ $1",
'powersearch-togglenone' => 'Ðичего',
'search-external' => 'Внешний поиÑк',
'searchdisabled' => 'Извините, но вÑтроенный полнотекÑтовый поиÑк выключен. Ð’Ñ‹ можете воÑпользоватьÑÑ Ð¿Ð¾Ð¸Ñком по Ñайту через поиÑковые ÑиÑтемы общего назначениÑ, однако имейте в виду, что ÐºÐ¾Ð¿Ð¸Ñ Ñайта в их кÑше может быть неÑколько уÑтаревшей.',
-
-# Quickbar
-'qbsettings' => 'Панель навигации',
-'qbsettings-none' => 'Ðе показывать',
-'qbsettings-fixedleft' => 'ÐÐµÐ¿Ð¾Ð´Ð²Ð¸Ð¶Ð½Ð°Ñ Ñлева',
-'qbsettings-fixedright' => 'ÐÐµÐ¿Ð¾Ð´Ð²Ð¸Ð¶Ð½Ð°Ñ Ñправа',
-'qbsettings-floatingleft' => 'ÐŸÐ»Ð°Ð²Ð°ÑŽÑ‰Ð°Ñ Ñлева',
-'qbsettings-floatingright' => 'ÐŸÐ»Ð°Ð²Ð°ÑŽÑ‰Ð°Ñ Ñправа',
-'qbsettings-directionality' => 'ЗакреплённаÑ, в завиÑимоÑти от Ð½Ð°Ð¿Ñ€Ð°Ð²Ð»ÐµÐ½Ð¸Ñ Ð¿Ð¸ÑьменноÑти вашего Ñзыка',
+'search-error' => 'Произошла ошибка при поиÑке: $1',
# Preferences page
'preferences' => 'ÐаÑтройки',
@@ -1522,7 +1605,6 @@ $1",
'resetprefs' => 'СброÑить',
'restoreprefs' => 'ВоÑÑтановить наÑтройки по умолчанию',
'prefs-editing' => 'Редактирование',
-'prefs-edit-boxsize' => 'Размер окна редактированиÑ.',
'rows' => 'Строк:',
'columns' => 'Столбцов:',
'searchresultshead' => 'ПоиÑк',
@@ -1533,9 +1615,8 @@ $1",
'recentchangesdays-max' => '(не более $1 {{PLURAL:$1|днÑ|дней|дней}})',
'recentchangescount' => 'КоличеÑтво правок, отображаемое по умолчанию:',
'prefs-help-recentchangescount' => 'Включает Ñвежие правки, иÑтории Ñтраниц, журналы.',
-'prefs-help-watchlist-token' => 'Заполнение Ñтого Ð¿Ð¾Ð»Ñ Ñекретным ключом будет Ñоздавать RSS-транÑлÑцию Ð´Ð»Ñ Ð²Ð°ÑˆÐµÐ³Ð¾ ÑпиÑка наблюдений.
-Каждый, кто знает ключ в Ñтом поле, Ñможет читать ваш ÑпиÑок наблюдениÑ, поÑтому выбирайте Ñекретное значение.
-Ð’Ñ‹ можете иÑпользовать Ñгенерированное Ñлучайным образом значение: $1',
+'prefs-help-watchlist-token2' => 'Это Ñекретный ключ Ð´Ð»Ñ Ð²ÐµÐ±-канала вашего ÑпиÑка наблюдений.
+Любой, кто знает его, Ñможет читать ваш ÑпиÑок наблюдениÑ, поÑтому не Ñообщайте его другим. [[Special:ResetTokens|Ðажмите здеÑÑŒ, еÑли вам нужно ÑброÑить его]].',
'savedprefs' => 'Ваши наÑтройки Ñохранены.',
'timezonelegend' => 'ЧаÑовой поÑÑ:',
'localtime' => 'МеÑтное времÑ:',
@@ -1566,7 +1647,6 @@ $1",
'prefs-reset-intro' => 'Эта Ñтраница может быть иÑпользована Ð´Ð»Ñ ÑброÑа ваших наÑтроек на наÑтройки по умолчанию.
Подтвердив данное дейÑтвие, вы не Ñможете его отменить.',
'prefs-emailconfirm-label' => 'Подтверждение Ñлектронной почты:',
-'prefs-textboxsize' => 'Размер окна редактированиÑ',
'youremail' => 'Ð­Ð»ÐµÐºÑ‚Ñ€Ð¾Ð½Ð½Ð°Ñ Ð¿Ð¾Ñ‡Ñ‚Ð°:',
'username' => '{{GENDER:$1|Ð˜Ð¼Ñ ÑƒÑ‡Ð°Ñтника|Ð˜Ð¼Ñ ÑƒÑ‡Ð°Ñтницы}}:',
'uid' => 'Код {{GENDER:$1|учаÑтника|учаÑтницы}}:',
@@ -1600,6 +1680,8 @@ $1",
'prefs-dateformat' => 'Формат даты',
'prefs-timeoffset' => 'Смещение поÑÑного времени',
'prefs-advancedediting' => 'Общие параметры',
+'prefs-editor' => 'редактор',
+'prefs-preview' => 'предварительный проÑмотр',
'prefs-advancedrc' => 'РаÑширенные наÑтройки',
'prefs-advancedrendering' => 'РаÑширенные наÑтройки',
'prefs-advancedsearchoptions' => 'РаÑширенные наÑтройки',
@@ -1607,7 +1689,9 @@ $1",
'prefs-displayrc' => 'ÐаÑтройки отображениÑ',
'prefs-displaysearchoptions' => 'ÐаÑтройки отображениÑ',
'prefs-displaywatchlist' => 'ÐаÑтройки отображениÑ',
+'prefs-tokenwatchlist' => 'Токен',
'prefs-diffs' => 'Разница верÑий',
+'prefs-help-prefershttps' => 'Эта наÑтройка будет применена поÑле Ñледующего предÑÑ‚Ð°Ð²Ð»ÐµÐ½Ð¸Ñ ÑиÑтеме.',
# User preference: email validation using jQuery
'email-address-validity-valid' => 'ВыглÑдит корректно',
@@ -1634,6 +1718,8 @@ $1",
'userrights-notallowed' => 'У Ð²Ð°Ñ Ð½ÐµÑ‚ Ñ€Ð°Ð·Ñ€ÐµÑˆÐµÐ½Ð¸Ñ Ð´Ð¾Ð±Ð°Ð²Ð»ÑÑ‚ÑŒ и удалÑÑ‚ÑŒ права учаÑтников.',
'userrights-changeable-col' => 'Группы, которые вы можете изменÑÑ‚ÑŒ',
'userrights-unchangeable-col' => 'Группы, которые вы не можете изменÑÑ‚ÑŒ',
+'userrights-conflict' => 'Конфликт Ð¸Ð·Ð¼ÐµÐ½ÐµÐ½Ð¸Ñ Ð¿Ñ€Ð°Ð² учаÑтника! ПожалуйÑта, проверьте и примените Ð¸Ð·Ð¼ÐµÐ½ÐµÐ½Ð¸Ñ Ð·Ð°Ð½Ð¾Ð²Ð¾.',
+'userrights-removed-self' => 'Ð’Ñ‹ уÑпешно удалили ÑобÑтвенные права. Таким образом, вы больше не Ñможете получить доÑтуп к Ñтой Ñтранице.',
# Groups
'group' => 'Группа:',
@@ -1699,11 +1785,19 @@ $1",
'right-proxyunbannable' => 'обход автоматичеÑкой блокировки прокÑи',
'right-unblockself' => 'Разблокировать ÑебÑ',
'right-protect' => 'Изменение ÑƒÑ€Ð¾Ð²Ð½Ñ Ð·Ð°Ñ‰Ð¸Ñ‚Ñ‹ Ñтраниц и правка каÑкадно защищённых Ñтраниц',
-'right-editprotected' => 'Редактировать защищённые Ñтраницы (без каÑкадной защиты)',
+'right-editprotected' => 'Правка Ñтраниц, защищённых как «{{int:protect-level-sysop}}»',
+'right-editsemiprotected' => 'Правка Ñтраниц, защищённых как «{{int:protect-level-autoconfirmed}}»',
'right-editinterface' => 'изменение пользовательÑкого интерфейÑа',
'right-editusercssjs' => 'правка CSS- и JS-файлов других учаÑтников',
'right-editusercss' => 'правка CSS-файлов других учаÑтников',
'right-edituserjs' => 'правка JavaScript-файлов других учаÑтников',
+'right-editmyusercss' => 'Редактирование файлов CSS пользователÑ',
+'right-editmyuserjs' => 'Редактировать Ñвои пользовательÑкие JavaScript-файлы',
+'right-viewmywatchlist' => 'ПоÑмотреть Ñвой ÑпиÑок наблюдениÑ',
+'right-editmywatchlist' => 'Редактировать Ñвой ÑпиÑок наблюдениÑ. Обратите внимание, что некоторые дейÑÑ‚Ð²Ð¸Ñ Ð±ÑƒÐ´ÑƒÑ‚ добавлÑÑ‚ÑŒ Ñтраницы даже без такого права.',
+'right-viewmyprivateinfo' => 'ПроÑмотр ÑобÑтвенных личных данных (например, Ð°Ð´Ñ€ÐµÑ Ñлектронной почты, наÑтоÑщее имÑ)',
+'right-editmyprivateinfo' => 'Правка ÑобÑтвенных личных данных (например, Ð°Ð´Ñ€ÐµÑ Ñлектронной почты, наÑтоÑщее имÑ)',
+'right-editmyoptions' => 'Редактировать ÑобÑтвенные предпочтениÑ',
'right-rollback' => 'быÑтрый откат правок поÑледнего учаÑтника на определенной Ñтранице',
'right-markbotedits' => 'отметка откатываемых правок как правок бота',
'right-noratelimit' => 'нет ограничений по ÑкороÑти',
@@ -1765,12 +1859,19 @@ $1",
'action-userrights-interwiki' => 'изменение прав учаÑтников в других вики',
'action-siteadmin' => 'блокировка и разблокировка базы данных',
'action-sendemail' => 'отправка Ñлектронных пиÑем',
+'action-editmywatchlist' => 'редактирование вашего ÑпиÑка наблюдениÑ',
+'action-viewmywatchlist' => 'проÑмотр вашего ÑпиÑка наблюдениÑ',
+'action-viewmyprivateinfo' => 'проÑмотр вашей чаÑтной информации',
+'action-editmyprivateinfo' => 'редактирование вашей чаÑтной информации',
# Recent changes
'nchanges' => '$1 {{PLURAL:$1|изменение|изменениÑ|изменений}}',
+'enhancedrc-since-last-visit' => '$1 Ñ Ð¿Ð¾Ñледнего поÑещениÑ',
+'enhancedrc-history' => 'иÑториÑ',
'recentchanges' => 'Свежие правки',
'recentchanges-legend' => 'ÐаÑтройки Ñвежих правок',
'recentchanges-summary' => 'Ðиже в хронологичеÑком порÑдке перечиÑлены поÑледние Ð¸Ð·Ð¼ÐµÐ½ÐµÐ½Ð¸Ñ Ð½Ð° Ñтраницах {{grammar:genitive|{{SITENAME}}}}.',
+'recentchanges-noresult' => 'Изменений в указанный период, ÑоответÑтвующих указанным уÑловиÑм, нет.',
'recentchanges-feed-description' => 'ОтÑлеживать в Ñтом потоке поÑледние Ð¸Ð·Ð¼ÐµÐ½ÐµÐ½Ð¸Ñ Ð² вики.',
'recentchanges-label-newpage' => 'Этой правкой была Ñоздана Ð½Ð¾Ð²Ð°Ñ Ñтраница.',
'recentchanges-label-minor' => 'Это незначительное изменение',
@@ -1808,7 +1909,6 @@ $1",
'recentchangeslinked-feed' => 'СвÑзанные правки',
'recentchangeslinked-toolbox' => 'СвÑзанные правки',
'recentchangeslinked-title' => 'СвÑзанные правки Ð´Ð»Ñ Â«$1»',
-'recentchangeslinked-noresult' => 'Ðа ÑвÑзанных Ñтраницах не было изменений за указанный период.',
'recentchangeslinked-summary' => "Это ÑпиÑок недавних изменений в Ñтраницах, на которые ÑÑылаетÑÑ ÑƒÐºÐ°Ð·Ð°Ð½Ð½Ð°Ñ Ñтраница (или входÑщих в указанную категорию).
Страницы, входÑщие в [[Special:Watchlist|ваш ÑпиÑок наблюдениÑ]] '''выделены'''.",
'recentchangeslinked-page' => 'Ðазвание Ñтраницы:',
@@ -1820,7 +1920,7 @@ $1",
'reuploaddesc' => 'ВернутьÑÑ Ðº форме загрузки',
'upload-tryagain' => 'Отправить изменённое опиÑание файла',
'uploadnologin' => 'Ð’Ñ‹ не предÑтавилиÑÑŒ ÑиÑтеме',
-'uploadnologintext' => 'Ð’Ñ‹ должны [[Special:UserLogin|предÑтавитьÑÑ ÑиÑтеме]], чтобы иметь возможноÑÑ‚ÑŒ загружать файлы.',
+'uploadnologintext' => 'Ð’Ñ‹ должны $1, чтобы загружать файлы на Ñервер.',
'upload_directory_missing' => 'Ð”Ð¸Ñ€ÐµÐºÑ‚Ð¾Ñ€Ð¸Ñ Ð´Ð»Ñ Ð·Ð°Ð³Ñ€ÑƒÐ·Ð¾Ðº ($1) отÑутÑтвует и не может быть Ñоздана веб-Ñервером.',
'upload_directory_read_only' => 'Веб-Ñервер не имеет прав запиÑи в папку ($1), в которой предполагаетÑÑ Ñ…Ñ€Ð°Ð½Ð¸Ñ‚ÑŒ загружаемые файлы.',
'uploaderror' => 'Ошибка загрузки файла',
@@ -2045,7 +2145,6 @@ $1',
'http-read-error' => 'Ошибка Ñ‡Ñ‚ÐµÐ½Ð¸Ñ HTTP.',
'http-timed-out' => 'ИÑтекло Ð²Ñ€ÐµÐ¼Ñ Ð¾Ð¶Ð¸Ð´Ð°Ð½Ð¸Ñ HTTP-запроÑа.',
'http-curl-error' => 'Ошибка Ð¾Ð±Ñ€Ð°Ñ‰ÐµÐ½Ð¸Ñ Ðº URL: $1',
-'http-host-unreachable' => 'Ðевозможно обратитьÑÑ Ð¿Ð¾ указанному URL.',
'http-bad-status' => 'Во Ð²Ñ€ÐµÐ¼Ñ Ð¾Ð±Ñ€Ð°Ð±Ð¾Ñ‚ÐºÐ¸ HTTP-запроÑа обнаружена проблема: $1 $2',
# Some likely curl errors. More could be added from <http://curl.haxx.se/libcurl/c/libcurl-errors.html>
@@ -2073,6 +2172,10 @@ $1',
'listfiles_size' => 'Размер',
'listfiles_description' => 'ОпиÑание',
'listfiles_count' => 'ВерÑий',
+'listfiles-show-all' => 'Включить Ñтарые верÑии изображений',
+'listfiles-latestversion' => 'Ð¢ÐµÐºÑƒÑ‰Ð°Ñ Ð²ÐµÑ€ÑиÑ',
+'listfiles-latestversion-yes' => 'Да',
+'listfiles-latestversion-no' => 'Ðет',
# File description page
'file-anchor-link' => 'Файл',
@@ -2169,6 +2272,13 @@ $1',
'randompage' => 'Ð¡Ð»ÑƒÑ‡Ð°Ð¹Ð½Ð°Ñ ÑтатьÑ',
'randompage-nopages' => 'Ð’ {{PLURAL:$2|Ñледующем проÑтранÑтве имён отÑутÑтвуют Ñтраницы|Ñледующих проÑтранÑтвах имён нет Ñтраниц}}: $1.',
+# Random page in category
+'randomincategory' => 'Ð¡Ð»ÑƒÑ‡Ð°Ð¹Ð½Ð°Ñ Ñтраница в категории',
+'randomincategory-invalidcategory' => 'Категории «$1» не ÑущеÑтвует.',
+'randomincategory-nopages' => 'Ðет Ñтраниц в категории [[:Category:$1]].',
+'randomincategory-selectcategory' => 'Перейти на Ñлучайную Ñтраницу из категории: $1 $2.',
+'randomincategory-selectcategory-submit' => 'Перейти',
+
# Random redirect
'randomredirect' => 'Случайное перенаправление',
'randomredirect-nopages' => 'ПроÑтранÑтво имён «$1» не Ñодержит перенаправлений.',
@@ -2194,17 +2304,13 @@ $1',
'statistics-users-active-desc' => 'УчаÑтники, Ñовершившие какое-либо дейÑтвие за {{PLURAL:$1|поÑледний $1 день|поÑледние $1 днÑ|поÑледние $1 дней}}',
'statistics-mostpopular' => 'Ðаиболее чаÑто проÑматриваемые Ñтраницы',
-'disambiguations' => 'Страницы, ÑÑылающиеÑÑ Ð½Ð° Ñтраницы Ñ€Ð°Ð·Ñ€ÐµÑˆÐµÐ½Ð¸Ñ Ð½ÐµÐ¾Ð´Ð½Ð¾Ð·Ð½Ð°Ñ‡Ð½Ð¾Ñти',
-'disambiguationspage' => 'Template:ÐеоднозначноÑÑ‚ÑŒ',
-'disambiguations-text' => "Следующие Ñтраницы Ñодержат по меньшей мере одну ÑÑылку на '''многозначную Ñтраницу'''.
-ВмеÑто Ñтого они, вероÑтно, должны указывать на ÑоответÑтвующую конкретную Ñтраницу.<br />
-Страница ÑчитаетÑÑ Ð¼Ð½Ð¾Ð³Ð¾Ð·Ð½Ð°Ñ‡Ð½Ð¾Ð¹, еÑли на ней размещён шаблон, Ð¸Ð¼Ñ ÐºÐ¾Ñ‚Ð¾Ñ€Ð¾Ð³Ð¾ указано на Ñтранице [[MediaWiki:Disambiguationspage]].",
-
'pageswithprop' => 'Страницы Ñ Ð¿ÐµÑ€ÐµÐ¾Ð¿Ñ€ÐµÐ´ÐµÐ»Ñ‘Ð½Ð½Ñ‹Ð¼Ð¸ ÑвойÑтвами',
'pageswithprop-legend' => 'Страницы Ñ Ð¿ÐµÑ€ÐµÐ¾Ð¿Ñ€ÐµÐ´ÐµÐ»Ñ‘Ð½Ð½Ñ‹Ð¼Ð¸ ÑвойÑтвами',
'pageswithprop-text' => 'ЗдеÑÑŒ перечиÑлены Ñтраницы, у которых были вручную переопределены отдельные ÑвойÑтва.',
'pageswithprop-prop' => 'Ðазвание ÑвойÑтва:',
'pageswithprop-submit' => 'Ðайти',
+'pageswithprop-prophidden-long' => 'длинное значение текÑтового ÑвойÑтва Ñкрыто ($1)',
+'pageswithprop-prophidden-binary' => 'значение двоичного ÑвойÑтва Ñкрыто ($1)',
'doubleredirects' => 'Двойные перенаправлениÑ',
'doubleredirectstext' => 'Ðа Ñтой Ñтранице предÑтавлен ÑпиÑок перенаправлений на другие перенаправлениÑ.
@@ -2262,6 +2368,7 @@ $1',
'mostrevisions' => 'Ðаиболее чаÑто редактировавшиеÑÑ Ñтраницы',
'prefixindex' => 'Указатель по началу названий Ñтраниц',
'prefixindex-namespace' => 'Указатель по началу Ñтраниц (проÑтранÑтво имён «{{ns:$1}}»)',
+'prefixindex-strip' => 'Скрыть Ð¿Ñ€ÐµÑ„Ð¸ÐºÑ Ð² ÑпиÑке результатов',
'shortpages' => 'Короткие Ñтраницы',
'longpages' => 'Длинные Ñтраницы',
'deadendpages' => 'Тупиковые Ñтраницы',
@@ -2277,6 +2384,7 @@ $1',
'listusers' => 'СпиÑок учаÑтников',
'listusers-editsonly' => 'Показать только тех учаÑтников, кто Ñделал Ñ…Ð¾Ñ‚Ñ Ð±Ñ‹ одну правку',
'listusers-creationsort' => 'УпорÑдочить по дате ÑозданиÑ',
+'listusers-desc' => 'Сортировать по убыванию',
'usereditcount' => '$1 {{PLURAL:$1|правка|правки|правок}}',
'usercreated' => '{{GENDER:$3|зарегиÑтрировалÑÑ|зарегиÑтрировалаÑÑŒ}} $1 в $2',
'newpages' => 'Ðовые Ñтраницы',
@@ -2456,10 +2564,9 @@ $1',
'unwatchthispage' => 'Прекратить наблюдение',
'notanarticle' => 'Ðе ÑтатьÑ',
'notvisiblerev' => 'ВерÑÐ¸Ñ Ð±Ñ‹Ð»Ð° удалена',
-'watchnochange' => 'За Ñтот период ни одна Ñтраница из ÑпиÑка Ð½Ð°Ð±Ð»ÑŽÐ´ÐµÐ½Ð¸Ñ Ð½Ðµ менÑлаÑÑŒ.',
'watchlist-details' => 'Ð’ вашем ÑпиÑке Ð½Ð°Ð±Ð»ÑŽÐ´ÐµÐ½Ð¸Ñ $1 {{PLURAL:$1|Ñтраница|Ñтраницы|Ñтраниц}}, не ÑÑ‡Ð¸Ñ‚Ð°Ñ Ñтраниц обÑуждениÑ.',
-'wlheader-enotif' => '* Уведомление по Ñл. почте включено.',
-'wlheader-showupdated' => "* Страницы, изменившиеÑÑ Ñ Ð²Ð°ÑˆÐµÐ³Ð¾ поÑледнего их поÑещениÑ, выделены '''жирным''' шрифтом.",
+'wlheader-enotif' => 'Ð£Ð²ÐµÐ´Ð¾Ð¼Ð»ÐµÐ½Ð¸Ñ Ð¿Ð¾ Ñл. почте включены.',
+'wlheader-showupdated' => "Страницы, изменившиеÑÑ Ñ Ð²Ð°ÑˆÐµÐ³Ð¾ поÑледнего их поÑещениÑ, выделены '''жирным''' шрифтом.",
'watchmethod-recent' => 'проÑмотр поÑледних изменений Ð´Ð»Ñ Ð½Ð°Ð±Ð»ÑŽÐ´Ð°ÐµÐ¼Ñ‹Ñ… Ñтраниц',
'watchmethod-list' => 'проÑмотр наблюдаемых Ñтраниц Ð´Ð»Ñ Ð¿Ð¾Ñледних изменений',
'watchlistcontains' => 'Ваш ÑпиÑок Ð½Ð°Ð±Ð»ÑŽÐ´ÐµÐ½Ð¸Ñ Ñодержит $1 {{PLURAL:$1|Ñтраница|Ñтраницы|Ñтраниц}}.',
@@ -2706,7 +2813,7 @@ $1',
'contributions' => 'Вклад {{GENDER:$1|учаÑтника|учаÑтницы}}',
'contributions-title' => 'Вклад {{GENDER:$1|учаÑтника|учаÑтницы}} $1',
'mycontris' => 'Вклад',
-'contribsub2' => 'Ð”Ð»Ñ $1 ($2)',
+'contribsub2' => 'Вклад {{GENDER:$3|$1}} ($2)',
'nocontribs' => 'Изменений, ÑоответÑтвующих заданным уÑловиÑм, найдено не было.',
'uctop' => '(текущаÑ)',
'month' => 'С меÑÑца (и ранее):',
@@ -2860,13 +2967,11 @@ $1',
'ipb_blocked_as_range' => 'Ошибка: IP-Ð°Ð´Ñ€ÐµÑ $1 был заблокирован не напрÑмую и не может быть разблокирован. Однако, он принадлежит к заблокированному диапазону $2, который можно разблокировать.',
'ip_range_invalid' => 'ÐедопуÑтимый диапазон IP-адреÑов.',
'ip_range_toolarge' => 'Блокировки диапазонов Ñвыше /$1 запрещены.',
-'blockme' => 'Заблокируй менÑ',
'proxyblocker' => 'Блокировка прокÑи',
-'proxyblocker-disabled' => 'Ð¤ÑƒÐ½ÐºÑ†Ð¸Ñ Ð¾Ñ‚ÐºÐ»ÑŽÑ‡ÐµÐ½Ð°.',
'proxyblockreason' => 'Ваш IP-Ð°Ð´Ñ€ÐµÑ Ð·Ð°Ð±Ð»Ð¾ÐºÐ¸Ñ€Ð¾Ð²Ð°Ð½ потому, что Ñто открытый прокÑи-Ñервер. ПожалуйÑта, ÑвÑжитеÑÑŒ Ñо Ñвоиим интернет-провайдером или Ñлужбой поддержки, и Ñообщите им об Ñтой Ñерьёзной проблеме безопаÑноÑти.',
-'proxyblocksuccess' => 'Выполнено.',
'sorbsreason' => 'Ваш IP-Ð°Ð´Ñ€ÐµÑ Ñ‡Ð¸ÑлитÑÑ ÐºÐ°Ðº открытый прокÑи в DNSBL.',
'sorbs_create_account_reason' => 'Ваш IP-Ð°Ð´Ñ€ÐµÑ Ñ‡Ð¸ÑлитÑÑ ÐºÐ°Ðº открытый прокÑи в DNSBL. Ð’Ñ‹ не можете Ñоздать учётную запиÑÑŒ.',
+'xffblockreason' => 'Был заблокирован IP-адреÑ, приÑутÑтвующий в заголовке X-Forwarded-For и принадлежащий либо вам, либо иÑпользуемому вами прокÑи-Ñерверу. ÐŸÐµÑ€Ð²Ð¾Ð½Ð°Ñ‡Ð°Ð»ÑŒÐ½Ð°Ñ Ð¿Ñ€Ð¸Ñ‡Ð¸Ð½Ð° блокировки была Ñледующей: $1',
'cant-block-while-blocked' => 'Ð’Ñ‹ не можете блокировать других учаÑтников, пока вы Ñами заблокированы.',
'cant-see-hidden-user' => 'УчаÑтник, которого вы пытаетеÑÑŒ заблокировать, уже заблокирован и Ñкрыт. ПоÑкольку у Ð²Ð°Ñ Ð½ÐµÑ‚ Ñ€Ð°Ð·Ñ€ÐµÑˆÐµÐ½Ð¸Ñ Ð½Ð° работу по Ñокрытию учаÑтников, вы не можете проÑмотреть или изменить данную блокировку.',
'ipbblocked' => 'Ð’Ñ‹ не можете блокировать или разблокировать других учаÑтников, так как вы Ñами заблокированы',
@@ -3034,6 +3139,8 @@ $1',
'thumbnail-more' => 'Увеличить',
'filemissing' => 'Файл не найден',
'thumbnail_error' => 'Ошибка ÑÐ¾Ð·Ð´Ð°Ð½Ð¸Ñ Ð¼Ð¸Ð½Ð¸Ð°Ñ‚ÑŽÑ€Ñ‹: $1',
+'thumbnail_error_remote' => 'Сообщение об ошибке от $1:
+$2',
'djvu_page_error' => 'Ðомер Ñтраницы DjVu вне доÑÑгаемоÑти',
'djvu_no_xml' => 'Ðевозможно получить XML Ð´Ð»Ñ DjVu',
'thumbnail-temp-create' => 'Ðе удаётÑÑ Ñоздать временный файл ÑÑкиза',
@@ -3178,20 +3285,15 @@ $1',
'tooltip-undo' => 'Убрать внеÑённую правку и показать предпроÑмотр, Ñ Ð²Ð¾Ð·Ð¼Ð¾Ð¶Ð½Ð¾Ñтью указать причину отмены',
'tooltip-preferences-save' => 'Сохранить наÑтройки',
'tooltip-summary' => 'Введите краткое опиÑание',
+'tooltip-iwiki' => '$1 — $2',
# Stylesheets
'common.css' => '/* Размещённый здеÑÑŒ CSS будет применÑÑ‚ÑŒÑÑ ÐºÐ¾ вÑем темам Ð¾Ñ„Ð¾Ñ€Ð¼Ð»ÐµÐ½Ð¸Ñ */',
-'standard.css' => '/* Размещённый здеÑÑŒ CSS будет применÑÑ‚ÑŒÑÑ Ðº теме Ð¾Ñ„Ð¾Ñ€Ð¼Ð»ÐµÐ½Ð¸Ñ Standard */',
-'nostalgia.css' => '/* Размещённый здеÑÑŒ CSS будет применÑÑ‚ÑŒÑÑ Ðº теме Ð¾Ñ„Ð¾Ñ€Ð¼Ð»ÐµÐ½Ð¸Ñ Nostalgia */',
'cologneblue.css' => '/* Размещённый здеÑÑŒ CSS будет применÑÑ‚ÑŒÑÑ Ðº теме Ð¾Ñ„Ð¾Ñ€Ð¼Ð»ÐµÐ½Ð¸Ñ Cologne Blue */',
'monobook.css' => '/* Размещённый здеÑÑŒ CSS будет применÑÑ‚ÑŒÑÑ Ðº теме Ð¾Ñ„Ð¾Ñ€Ð¼Ð»ÐµÐ½Ð¸Ñ Monobook */',
-'myskin.css' => '/* Размещённый здеÑÑŒ CSS будет применÑÑ‚ÑŒÑÑ Ðº теме Ð¾Ñ„Ð¾Ñ€Ð¼Ð»ÐµÐ½Ð¸Ñ MySkin */',
-'chick.css' => '/* Размещённый здеÑÑŒ CSS будет применÑÑ‚ÑŒÑÑ Ðº теме Ð¾Ñ„Ð¾Ñ€Ð¼Ð»ÐµÐ½Ð¸Ñ Chick */',
-'simple.css' => '/* Размещённый здеÑÑŒ CSS будет применÑÑ‚ÑŒÑÑ Ðº теме Ð¾Ñ„Ð¾Ñ€Ð¼Ð»ÐµÐ½Ð¸Ñ Simple */',
'modern.css' => '/* Размещённый здеÑÑŒ CSS будет применÑÑ‚ÑŒÑÑ Ðº теме Ð¾Ñ„Ð¾Ñ€Ð¼Ð»ÐµÐ½Ð¸Ñ Modern */',
'vector.css' => '/* Размещённый здеÑÑŒ CSS будет применÑÑ‚ÑŒÑÑ Ðº векторной теме Ð¾Ñ„Ð¾Ñ€Ð¼Ð»ÐµÐ½Ð¸Ñ */',
'print.css' => '/* Размещённый здеÑÑŒ CSS будет применÑÑ‚ÑŒÑÑ Ðº верÑии Ð´Ð»Ñ Ð¿ÐµÑ‡Ð°Ñ‚Ð¸ */',
-'handheld.css' => '/* Размещённый здеÑÑŒ CSS-код будет применÑÑ‚ÑŒÑÑ Ð´Ð»Ñ Ð¼Ð¾Ð±Ð¸Ð»ÑŒÐ½Ñ‹Ñ… уÑтройÑтв, иÑпользующих тему оформлениÑ, указанную в $wgHandheldStyle */',
'noscript.css' => '/* Размещённый здеÑÑŒ CSS будет применÑÑ‚ÑŒÑÑ Ð´Ð»Ñ ÑƒÑ‡Ð°Ñтников Ñ Ð¾Ñ‚ÐºÐ»ÑŽÑ‡ÐµÐ½Ð½Ñ‹Ð¼ JavaScript */',
'group-autoconfirmed.css' => '/* Размещённый здеÑÑŒ CSS будет применÑÑ‚ÑŒÑÑ Ð´Ð»Ñ Ð°Ð²Ñ‚Ð¾Ð¿Ð¾Ð´Ñ‚Ð²ÐµÑ€Ð¶Ð´Ñ‘Ð½Ð½Ñ‹Ñ… учаÑтников */',
'group-bot.css' => '/* Размещённый здеÑÑŒ CSS будет применÑÑ‚ÑŒÑÑ Ñ‚Ð¾Ð»ÑŒÐºÐ¾ Ð´Ð»Ñ Ð±Ð¾Ñ‚Ð¾Ð² */',
@@ -3200,13 +3302,8 @@ $1',
# Scripts
'common.js' => '/* Размещённый здеÑÑŒ код JavaScript будет загружатьÑÑ Ð¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ñ‚ÐµÐ»Ñм при обращении к каждой Ñтранице */',
-'standard.js' => '/* Размещённый здеÑÑŒ код JavaScript будет загружатьÑÑ Ð¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ñ‚ÐµÐ»Ñм, иÑпользующим тему Ð¾Ñ„Ð¾Ñ€Ð¼Ð»ÐµÐ½Ð¸Ñ Standard */',
-'nostalgia.js' => '/* Размещённый здеÑÑŒ код JavaScript будет загружатьÑÑ Ð¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ñ‚ÐµÐ»Ñм, иÑпользующим тему Ð¾Ñ„Ð¾Ñ€Ð¼Ð»ÐµÐ½Ð¸Ñ Nostalgia */',
'cologneblue.js' => '/* Размещённый здеÑÑŒ код JavaScript будет загружатьÑÑ Ð¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ñ‚ÐµÐ»Ñм, иÑпользующим тему Ð¾Ñ„Ð¾Ñ€Ð¼Ð»ÐµÐ½Ð¸Ñ Cologne Blue */',
'monobook.js' => '/* Размещённый здеÑÑŒ код JavaScript будет загружатьÑÑ Ð¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ñ‚ÐµÐ»Ñм, иÑпользующим тему Ð¾Ñ„Ð¾Ñ€Ð¼Ð»ÐµÐ½Ð¸Ñ MonoBook */',
-'myskin.js' => '/* Размещённый здеÑÑŒ код JavaScript будет загружатьÑÑ Ð¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ñ‚ÐµÐ»Ñм, иÑпользующим тему Ð¾Ñ„Ð¾Ñ€Ð¼Ð»ÐµÐ½Ð¸Ñ MySkin */',
-'chick.js' => '/* Размещённый здеÑÑŒ код JavaScript будет загружатьÑÑ Ð¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ñ‚ÐµÐ»Ñм, иÑпользующим тему Ð¾Ñ„Ð¾Ñ€Ð¼Ð»ÐµÐ½Ð¸Ñ Chick */',
-'simple.js' => '/* Размещённый здеÑÑŒ код JavaScript будет загружатьÑÑ Ð¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ñ‚ÐµÐ»Ñм, иÑпользующим тему Ð¾Ñ„Ð¾Ñ€Ð¼Ð»ÐµÐ½Ð¸Ñ Simple */',
'modern.js' => '/* Размещённый здеÑÑŒ код JavaScript будет загружатьÑÑ Ð¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ñ‚ÐµÐ»Ñм, иÑпользующим тему Ð¾Ñ„Ð¾Ñ€Ð¼Ð»ÐµÐ½Ð¸Ñ Modern */',
'vector.js' => '/* Размещённый здеÑÑŒ код JavaScript будет загружатьÑÑ Ð¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ñ‚ÐµÐ»Ñм, иÑпользующим тему Ð¾Ñ„Ð¾Ñ€Ð¼Ð»ÐµÐ½Ð¸Ñ Vector */',
'group-autoconfirmed.js' => '/* Размещённый здеÑÑŒ код JavaScript будет загружатьÑÑ Ñ‚Ð¾Ð»ÑŒÐºÐ¾ учаÑтникам, имеющим ÑÑ‚Ð°Ñ‚ÑƒÑ Ð°Ð²Ñ‚Ð¾Ð¿Ð¾Ð´Ñ‚Ð²ÐµÑ€Ð¶Ð´Ñ‘Ð½Ð½Ñ‹Ñ… (autoconfirmed) */',
@@ -3288,12 +3385,7 @@ The wiki server can't provide data in a format your client can read.",
'pageinfo-category-files' => 'КоличеÑтво файлов',
# Skin names
-'skinname-standard' => 'КлаÑÑичеÑкое',
-'skinname-nostalgia' => 'ÐоÑтальгиÑ',
'skinname-cologneblue' => 'КёльнÑÐºÐ°Ñ Ñ‚Ð¾Ñка',
-'skinname-myskin' => 'Своё',
-'skinname-chick' => 'Цыпа',
-'skinname-simple' => 'ПроÑтое',
'skinname-modern' => 'Современное',
'skinname-vector' => 'Векторное',
@@ -3378,11 +3470,25 @@ $1',
'minutes' => '{{PLURAL:$1|$1 минута|$1 минуты|$1 минут}}',
'hours' => '{{PLURAL:$1|$1 чаÑ|$1 чаÑа|$1 чаÑов}}',
'days' => '{{PLURAL:$1|$1 день|$1 днÑ|$1 дней}}',
+'weeks' => '{{PLURAL:$1|$1 неделÑ|$1 недели|$1 недель}}',
'months' => '{{PLURAL:$1|$1 меÑÑц|$1 меÑÑца|$1 меÑÑцев}}',
'years' => '{{PLURAL:$1|$1 год|$1 года|$1 лет}}',
'ago' => '$1 назад',
'just-now' => 'только что',
+# Human-readable timestamps
+'hours-ago' => '$1 {{PLURAL:$1|чаÑ|чаÑа|чаÑов}} назад',
+'minutes-ago' => '$1 {{PLURAL:$1|минуту|минуты|минут}} назад',
+'seconds-ago' => '$1 {{PLURAL:$1|Ñекунду|Ñекунды|Ñекунд}} назад',
+'monday-at' => 'в понедельник в $1',
+'tuesday-at' => 'во вторник в $1',
+'wednesday-at' => 'в Ñреду в $1',
+'thursday-at' => 'в четверг в $1',
+'friday-at' => 'в пÑтницу в $1',
+'saturday-at' => 'в Ñубботу в $1',
+'sunday-at' => 'в воÑкреÑенье в $1',
+'yesterday-at' => 'Вчера в $1',
+
# Bad image list
'bad_image_list' => 'Формат должен быть Ñледующим:
@@ -3410,7 +3516,7 @@ $1',
* gpslongitude
* gpsaltitude',
-# EXIF tags
+# Exif tags
'exif-imagewidth' => 'Ширина',
'exif-imagelength' => 'Ð’Ñ‹Ñота',
'exif-bitspersample' => 'Глубина цвета',
@@ -3589,7 +3695,7 @@ $1',
'exif-originalimageheight' => 'Ð’Ñ‹Ñота Ð¸Ð·Ð¾Ð±Ñ€Ð°Ð¶ÐµÐ½Ð¸Ñ Ð´Ð¾ кадрированиÑ',
'exif-originalimagewidth' => 'Ширина Ð¸Ð·Ð¾Ð±Ñ€Ð°Ð¶ÐµÐ½Ð¸Ñ Ð´Ð¾ кадрированиÑ',
-# EXIF attributes
+# Exif attributes
'exif-compression-1' => 'ÐеÑжатый',
'exif-compression-2' => 'CCITT Group 3, 1-Ð¼ÐµÑ€Ð½Ð°Ñ Ð¼Ð¾Ð´Ð¸Ñ„Ð¸ÐºÐ°Ñ†Ð¸Ñ ÐºÐ¾Ð´Ð¸Ñ€Ð¾Ð²Ð°Ð½Ð¸Ñ Ð´Ð»Ð¸Ð½ Ñерий Хаффмана',
'exif-compression-3' => 'CCITT Group 3, факÑовое кодирование',
@@ -4065,7 +4171,6 @@ $5
'version-other' => 'Иное',
'version-mediahandlers' => 'Обработчики медиа',
'version-hooks' => 'Перехватчики',
-'version-extension-functions' => 'Функции раÑширений',
'version-parser-extensiontags' => 'Теги раÑширений ÑинтакÑичеÑкого анализатора',
'version-parser-function-hooks' => 'Перехватчики функций ÑинтакÑичеÑкого анализатора',
'version-hook-name' => 'Ð˜Ð¼Ñ Ð¿ÐµÑ€ÐµÑ…Ð²Ð°Ñ‚Ñ‡Ð¸ÐºÐ°',
@@ -4074,6 +4179,7 @@ $5
'version-license' => 'ЛицензиÑ',
'version-poweredby-credits' => "Эта вики работает на движке '''[//www.mediawiki.org/ MediaWiki]''', copyright © 2001-$1 $2.",
'version-poweredby-others' => 'другие',
+'version-poweredby-translators' => 'переводчики translatewiki.net',
'version-credits-summary' => 'Хотим поблагодарить Ñледующих учаÑтников за их вклад в развитие [[Special:Version|MediaWiki]].',
'version-license-info' => 'MediaWiki ÑвлÑетÑÑ Ñвободным программным обеÑпечением, которое вы можете раÑпроÑтранÑÑ‚ÑŒ и/или изменÑÑ‚ÑŒ в ÑоответÑтвии Ñ ÑƒÑловиÑми лицензии GNU General Public License, опубликованной фондом Ñвободного программного обеÑпечениÑ; второй верÑии, либо любой более поздней верÑии.
@@ -4089,12 +4195,17 @@ MediaWiki раÑпроÑтранÑетÑÑ Ð² надежде, что она бу
'version-entrypoints-articlepath' => '[https://www.mediawiki.org/wiki/Manual:$wgArticlePath Путь к Ñтатье]',
'version-entrypoints-scriptpath' => '[https://www.mediawiki.org/wiki/Manual:$wgScriptPath Путь к Ñкрипту]',
-# Special:FilePath
-'filepath' => 'Путь к файлу',
-'filepath-page' => 'Файл:',
-'filepath-submit' => 'Перейти',
-'filepath-summary' => 'Ð”Ð°Ð½Ð½Ð°Ñ ÑÐ»ÑƒÐ¶ÐµÐ±Ð½Ð°Ñ Ñтраница возвращает полный путь к файлу.
-Ð˜Ð·Ð¾Ð±Ñ€Ð°Ð¶ÐµÐ½Ð¸Ñ Ð¿Ð¾ÐºÐ°Ð·Ñ‹Ð²Ð°ÑŽÑ‚ÑÑ Ð² полном разрешении, другие типы файлов открываютÑÑ Ð½Ð°Ð¿Ñ€Ñмую в ÑвÑзанных Ñ Ð½Ð¸Ð¼Ð¸ программах.',
+# Special:Redirect
+'redirect' => 'Перенаправление Ñ Ñ„Ð°Ð¹Ð»Ð°, учаÑтника или идентификатора верÑии',
+'redirect-legend' => 'Перенаправление на файл или Ñтраницу',
+'redirect-summary' => 'Эта ÑÐ¿ÐµÑ†Ð¸Ð°Ð»ÑŒÐ½Ð°Ñ Ñтраница перенаправлÑет на файл (Ñ Ð¸Ð¼ÐµÐ½Ð¸ файла), Ñтраницу (Ñ Ð¸Ð´ÐµÐ½Ñ‚Ð¸Ñ„Ð¸ÐºÐ°Ñ‚Ð¾Ñ€Ð° верÑии) или Ñтраницу учаÑтника (Ñ Ñ‡Ð¸Ñлового идентификатора учаÑтника).',
+'redirect-submit' => 'Перейти',
+'redirect-lookup' => 'ПоиÑк:',
+'redirect-value' => 'Значение:',
+'redirect-user' => 'Идентификатор учаÑтника',
+'redirect-revision' => 'ВерÑÐ¸Ñ Ñтраницы',
+'redirect-file' => 'Ðазвание файла',
+'redirect-not-exists' => 'Значение не найдено',
# Special:FileDuplicateSearch
'fileduplicatesearch' => 'ПоиÑк одинаковых файлов',
@@ -4144,12 +4255,16 @@ MediaWiki раÑпроÑтранÑетÑÑ Ð² надежде, что она бу
'tags' => 'ДейÑтвующие метки изменений',
'tag-filter' => 'Фильтр [[Special:Tags|меток]]:',
'tag-filter-submit' => 'Отфильтровать',
+'tag-list-wrapper' => '([[Special:Tags|{{PLURAL:$1|Метка|Метки}}]]: $2)',
'tags-title' => 'Метки',
'tags-intro' => 'Ðа Ñтой Ñтранице приведён ÑпиÑок меток, которыми программное обеÑпечение отмечает правки, а также Ð·Ð½Ð°Ñ‡ÐµÐ½Ð¸Ñ Ñтих меток.',
'tags-tag' => 'Ð˜Ð¼Ñ Ð¼ÐµÑ‚ÐºÐ¸',
'tags-display-header' => 'Отображение в ÑпиÑках изменений',
'tags-description-header' => 'Полное опиÑание значениÑ',
+'tags-active-header' => 'Ðктивна?',
'tags-hitcount-header' => 'Отмеченные правки',
+'tags-active-yes' => 'Да',
+'tags-active-no' => 'Ðет',
'tags-edit' => 'править',
'tags-hitcount' => '$1 {{PLURAL:$1|изменение|изменениÑ|изменений}}',
@@ -4170,6 +4285,7 @@ MediaWiki раÑпроÑтранÑетÑÑ Ð² надежде, что она бу
'dberr-problems' => 'Извините! Ðа данном Ñайте возникли техничеÑкие трудноÑти.',
'dberr-again' => 'Попробуйте обновить Ñтраницу через неÑколько минут.',
'dberr-info' => '(невозможно ÑоединитьÑÑ Ñ Ñервером баз данных: $1)',
+'dberr-info-hidden' => '(Ðевозможно ÑоединитьÑÑ Ñ Ñервером баз данных)',
'dberr-usegoogle' => 'Пока вы можете попробовать поиÑкать Ñ Ð¿Ð¾Ð¼Ð¾Ñ‰ÑŒÑŽ Google.',
'dberr-outofdate' => 'Ðо имейте в виду, что его Ð¸Ð½Ð´ÐµÐºÑ Ð¼Ð¾Ð¶ÐµÑ‚ оказатьÑÑ ÑƒÑтаревшим.',
'dberr-cachederror' => 'Ðиже предÑтавлена закÑÑˆÐ¸Ñ€Ð¾Ð²Ð°Ð½Ð½Ð°Ñ Ð²ÐµÑ€ÑÐ¸Ñ Ð·Ð°Ð¿Ñ€Ð°ÑˆÐ¸Ð²Ð°ÐµÐ¼Ð¾Ð¹ Ñтраницы, возможно, она не отражает поÑледних изменений.',
@@ -4185,6 +4301,9 @@ MediaWiki раÑпроÑтранÑетÑÑ Ð² надежде, что она бу
'htmlform-submit' => 'Отправить',
'htmlform-reset' => 'Отменить изменениÑ',
'htmlform-selectorother-other' => 'Иное',
+'htmlform-no' => 'Ðет',
+'htmlform-yes' => 'Да',
+'htmlform-chosen-placeholder' => 'Выберите вариант',
# SQLite database support
'sqlite-has-fts' => '$1 Ñ Ð¿Ð¾Ð´Ð´ÐµÑ€Ð¶ÐºÐ¾Ð¹ полнотекÑтового поиÑка',
@@ -4302,4 +4421,19 @@ MediaWiki раÑпроÑтранÑетÑÑ Ð² надежде, что она бу
# Image rotation
'rotate-comment' => 'Изображение повёрнуто на $1 градуÑ{{PLURAL:$1||а|ов}} по чаÑовой Ñтрелке',
+# Limit report
+'limitreport-title' => 'Данные анализатора:',
+'limitreport-cputime' => 'ИÑпользование времени процеÑÑора',
+'limitreport-cputime-value' => '$1 {{PLURAL:$1|Ñекунда|Ñекунды|Ñекунд}}',
+'limitreport-walltime' => 'ИÑпользование в режиме реального времени',
+'limitreport-walltime-value' => '$1 {{PLURAL:$1|Ñекунда|Ñекунды|Ñекунд}}',
+'limitreport-ppvisitednodes' => 'КоличеÑтво узлов, поÑещённых препроцеÑÑором',
+'limitreport-ppgeneratednodes' => 'КоличеÑтво Ñгенерированных препроцеÑÑором узлов',
+'limitreport-postexpandincludesize' => 'Размер раÑкрытых включений',
+'limitreport-postexpandincludesize-value' => '$1/$2 {{PLURAL:$2|байт|байта|байтов}}',
+'limitreport-templateargumentsize' => 'Размер аргумента шаблона',
+'limitreport-templateargumentsize-value' => '$1/$2 {{PLURAL:$2|байт|байта|байтов}}',
+'limitreport-expansiondepth' => 'ÐÐ°Ð¸Ð±Ð¾Ð»ÑŒÑˆÐ°Ñ Ð³Ð»ÑƒÐ±Ð¸Ð½Ð° раÑширениÑ',
+'limitreport-expensivefunctioncount' => 'КоличеÑтво «дорогих» функций анализатора',
+
);
diff --git a/languages/messages/MessagesRue.php b/languages/messages/MessagesRue.php
index 64d33e1f..a82354e0 100644
--- a/languages/messages/MessagesRue.php
+++ b/languages/messages/MessagesRue.php
@@ -148,9 +148,6 @@ $messages = array(
'tog-shownumberswatching' => 'Вказати кілько хоÑнователїв придало Ñторінку до Ñвого ÑпиÑку Ñлїдованых',
'tog-oldsig' => 'ІÑнуючій підпиÑ:',
'tog-fancysig' => 'ХоÑновати про Ð¿Ñ–Ð´Ð¿Ð¸Ñ Ð²Ñ–ÐºÑ–Ñ‚ÐµÐºÑÑ‚ (без автоматічного одказу)',
-'tog-externaleditor' => 'Імпліцітно хоÑновати екÑтерный едітор (лем про ÑкуÑеных, выжадує шпеціалне Ð½Ð°ÑˆÑ‚ÐµÐ»Ñ‘Ð²Ð°Ð½Ñ ÐºÐ¾Ð¼Ð¿ÑŽÑ‚ÐµÑ€Ð°; [//www.mediawiki.org/wiki/Manual:External_editors далшы інформації])',
-'tog-externaldiff' => 'Імпліцітно хоÑновати проґрам про Ð¿Ð¾Ñ€Ñ–Ð²Ð½Ð°Ð²Ð°Ð½Ñ (лем про ÑкуÑеных, выжадує шпеціалне Ð½Ð°ÑˆÑ‚ÐµÐ»Ñ‘Ð²Ð°Ð½Ñ ÐºÐ¾Ð¼Ð¿ÑŽÑ‚ÐµÑ€Ð°; [//www.mediawiki.org/wiki/Manual:External_editors далшы інформації])',
-'tog-showjumplinks' => 'Ðктівізовати помічны одказы "перейти дo"',
'tog-uselivepreview' => 'ХоÑновати швыдкый наглÑд (екÑперіментално)',
'tog-forceeditsummary' => 'Упозорнити нÑ, кідь не Ñ” выповнене Ð·Ð³Ð¾Ñ€Ð½ÑƒÑ‚Ñ ÐµÐ´Ñ–Ñ‚Ð¾Ð²Ð°Ð½Ñ',
'tog-watchlisthideown' => 'Сховати мої ÐµÐ´Ñ–Ñ‚Ð¾Ð²Ð°Ð½Ñ Ð½Ð° ÑпиÑку Ñлїдованых Ñторінок',
@@ -163,6 +160,8 @@ $messages = array(
'tog-diffonly' => 'Ðе вказовати обÑÑг Ñторінкы під роздїлом верзій',
'tog-showhiddencats' => 'Вказати Ñхованы катеґорії',
'tog-norollbackdiff' => 'По вернутю зміны не вказовати Ð¿Ð¾Ñ€Ñ–Ð²Ð½Ð°Ð½Ñ Ñ€Ð¾Ð·Ð´Ñ—Ð»Ñ–Ð²',
+'tog-useeditwarning' => 'Упозорнити нÑ, кідь буду опущати Ñторінку без ÑƒÐ»Ð¾Ð¶Ñ–Ð½Ñ Ð·Ð¼Ñ–Ð½',
+'tog-prefershttps' => 'По приголошіню вÑе хоÑновате беÑпечне ÑпоїнÑ',
'underline-always' => 'Ð’Ñе',
'underline-never' => 'Ðїґда',
@@ -226,6 +225,18 @@ $messages = array(
'oct' => 'окт',
'nov' => 'нов',
'dec' => 'дец',
+'january-date' => '$1. Ñнуара',
+'february-date' => '$1. фебруара',
+'march-date' => '$1. марца',
+'april-date' => '$1. апрілÑ',
+'may-date' => '$1. маÑ',
+'june-date' => '$1. юна',
+'july-date' => '$1. юла',
+'august-date' => '$1. авґуÑта',
+'september-date' => '$1. Ñептембра',
+'october-date' => '$1. октобра',
+'november-date' => '$1. новембра',
+'december-date' => '$1. децембра',
# Categories related messages
'pagecategories' => '{{PLURAL:$1|КатеґоріÑ|Катеґорії}}',
@@ -307,6 +318,7 @@ $messages = array(
'create-this-page' => 'Створити тоту Ñторінку',
'delete' => 'Вымазати',
'deletethispage' => 'Змазати тоту Ñторінку',
+'undeletethispage' => 'Обновити тоту Ñторінку',
'undelete_short' => 'Обновити $1 {{PLURAL:$1|верзію|верзії|верзії}}',
'viewdeleted_short' => 'Видїти {{PLURAL:$1|змазанов едітаціёв|$1 змазаны едітації|$1 змазаных едітацій}}',
'protect' => 'Ð’Ñокотити',
@@ -350,7 +362,7 @@ $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).
+# 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).
'aboutsite' => 'О&nbsp;{{grammar:genitive|{{SITENAME}}}}',
'aboutpage' => 'Project:{{SITENAME}}',
'copyright' => 'ОбÑÑг Ñ” доÑтупный з $1.',
@@ -360,7 +372,6 @@ $1',
'disclaimers' => 'Ð’Ñ‹Ð»ÑƒÑ‡Ñ–Ð½Ñ Ð¾Ð´Ð¿Ð¾Ð²Ñ–Ð´Ð½Ð¾Ñти',
'disclaimerpage' => 'Project:Ð’Ñ‹Ð»ÑƒÑ‡Ñ–Ð½Ñ Ð¾Ð´Ð¿Ð¾Ð²Ñ–Ð´Ð½Ð¾Ñти',
'edithelp' => 'Поміч едітованÑ',
-'edithelppage' => 'Help:ЕдітованÑ',
'helppage' => 'Help:ОбÑÑг',
'mainpage' => 'Головна Ñторінка',
'mainpage-description' => 'Головна Ñторінка',
@@ -437,17 +448,12 @@ $1',
# General errors
'error' => 'Хыба',
'databaseerror' => 'Датабазова хыба',
-'dberrortext' => 'Ðайджена Ñінтактічна хыба в запроÑÑ— до датабазы.
-Тото може вказовати на хыбу в проґрамовім забеÑпечіню.
-ПоÑлїднїй Ð·Ð°Ð¿Ñ€Ð¾Ñ Ð´Ð¾ датабазы:
-<blockquote><code>$1</code></blockquote>
-з функції "<code>$2</code>".
-Датабаза вернула хыбу "<samp>$3: $4</samp>".',
-'dberrortextcl' => 'Ðайджена Ñінтактічна хыба в запроÑÑ— до датабазы.
-ПоÑлїднїй Ð·Ð°Ð¿Ñ€Ð¾Ñ Ð´Ð¾ датабазы:
-«$1»
-з функції «$2».
-Датабаза вернула хыбу «$3: $4».',
+'databaseerror-text' => 'При запытї до датабазы ÑÑ Ñ‚Ñ€Ð°Ñ„Ñ–Ð»Ð° хыба.
+Тото може вказовати на хыбу в проґрамовім забеÑпечіню.',
+'databaseerror-textcl' => 'При запытї до датабазы ÑÑ Ñ‚Ñ€Ð°Ñ„Ñ–Ð»Ð° хыба.',
+'databaseerror-query' => 'Запыт: $1',
+'databaseerror-function' => 'ФункціÑ: $1',
+'databaseerror-error' => 'Хыба: $1',
'laggedslavemode' => 'Увага: Сторінка не муÑить быти актуална',
'readonly' => 'Датабаза є замкнута',
'enterlockreason' => 'Удайте причіну Ð·Ð°Ð¼ÐºÐ½ÑƒÑ‚Ñ Ñ– приближный термін одомкнутÑ',
@@ -480,6 +486,7 @@ $1',
Може уж быв(а) змазаный(а) дакым іншым.',
'cannotdelete-title' => 'Ðе годен змазати Ñторінку "$1"',
'delete-hook-aborted' => 'Ð•Ð´Ñ–Ñ‚Ð¾Ð²Ð°Ð½Ñ Ð±Ñ‹Ð»Ð¾ Ñторноване процедуров пунктом Ð¿Ñ€Ð¸Ð¿Ð¾Ñ‘Ð²Ð°Ð½Ñ Ð±ÐµÐ· близшого поÑÑнїнÑ.',
+'no-null-revision' => 'Ðе годен Ñтворити нову нулову ревізію Ñторінкы "$1"',
'badtitle' => 'ÐеприпуÑтна назва',
'badtitletext' => 'Пожадована назва Ñторінкы неправилна, порожнÑ, або неправилно одказована Ñк міджі-Ñзычного ці міджі-вікі назва.
Може ÑÑ Ñ…Ð¾Ñнують Ñімболы, котры не можуть быти хоÑнованы в назвах.',
@@ -501,12 +508,15 @@ $1',
'editinginterface' => "'''Позірь:''' Едітуєте Ñторінку,котра Ñ” чаÑтинов текÑтового інтерфейÑу.
Зміны той Ñторінкы выкличуть зміну інтерфейÑу про іншых хоÑнователїв той вікі.
Додати ці змінити переклады на вшыткых вікі проÑиме хоÑнуйте [//translatewiki.net/wiki/Main_Page?setlang=uk translatewiki.net] — проєкт, што ÑÑ Ð·Ð°Ð½Ð¸Ð¼Ð°Ñ‚ÑŒ локалізаціов MediaWiki.",
-'sqlhidden' => '(SQL Ð·Ð°Ð¿Ñ€Ð¾Ñ Ñкрытый)',
'cascadeprotected' => 'Сторінка Ñ” замнкута, бо Ñ” вложена до {{PLURAL:$1|наÑлїдуючой Ñторінкы замкнуты|наÑлїдуючіх Ñторінок замнкнутых|наÑлїдуючіх Ñторінок замнкнутых}} каÑкадовым замком:
$2',
'namespaceprotected' => 'Ðе маєте права едітовати Ñторінкы в проÑторї назв «$1».',
'customcssprotected' => 'Ðе маєте права едітовати тоту Ñторінку з CSS, бо обÑÑгує перÑоналны наÑтавлїна іншого хоÑнователÑ.',
'customjsprotected' => 'Ðе маєте права едітовати тоту Ñторінку з JavaScript-ом, бо обÑÑгує перÑоналны наÑтавлїна іншого хоÑнователÑ.',
+'mycustomcssprotected' => 'Ðе мате права на управы той CSS Ñторінкы.',
+'mycustomjsprotected' => 'Ðе мате права на ÐµÐ´Ñ–Ñ‚Ð¾Ð²Ð°Ð½Ñ Ñ‚Ð¾Ð¹ JavaScript Ñторінкы.',
+'myprivateinfoprotected' => 'Ðе мате Ð´Ð¾Ð·Ð²Ð¾Ð»Ñ—Ð½Ñ Ð¼Ñ–Ð½Ð¸Ñ‚Ð¸ Ñвої пріватны інформації.',
+'mypreferencesprotected' => 'Ðе мате Ð´Ð¾Ð·Ð²Ð¾Ð»Ñ—Ð½Ñ Ð¼Ñ–Ð½Ð¸Ñ‚Ð¸ Ñвої наÑтавлїнÑ.',
'ns-specialprotected' => 'Шпеціалны Ñторінкы не Ñ” можне едітовати.',
'titleprotected' => "Ð¡Ñ‚Ð²Ð¾Ñ€Ñ—Ð½Ñ Ñторінкы з таков назвов было заборонене хоÑнователём [[User:$1|$1]] з причінов: ''$2''.",
'filereadonlyerror' => "Ðе годно змінити файл „$1“, бо архів файлів „$2“ Ñ” теперь лем на чітанÑ.
@@ -530,10 +540,19 @@ $2',
'welcomecreation-msg' => 'Ваше конто было вытворене.
Ðе забудьте змінити Ñвої [[Special:Preferences|наÑÑ‚Ð°Ð²Ð»Ñ—Ð½Ñ {{grammar:2sg|{{SITENAME}}}}]].',
'yourname' => 'Ð†Ð¼Ñ Ñ…Ð¾ÑнователÑ:',
+'userlogin-yourname' => 'Ð†Ð¼Ñ Ñ…Ð¾ÑнователÑ',
+'userlogin-yourname-ph' => 'Уведьте ваше Ñ–Ð¼Ñ Ñ…Ð¾ÑнователÑ',
+'createacct-another-username-ph' => 'Уведьте Ñ–Ð¼Ñ Ñ…Ð¾ÑнователÑ',
'yourpassword' => 'ГеÑло:',
+'userlogin-yourpassword' => 'ГеÑло',
+'userlogin-yourpassword-ph' => 'Уведьте ваше геÑло',
+'createacct-yourpassword-ph' => 'Уведьте ваше геÑло',
'yourpasswordagain' => 'ПовторÑйте геÑло:',
+'createacct-yourpasswordagain' => 'Потвердьте геÑло',
+'createacct-yourpasswordagain-ph' => 'Уведьте геÑло знову',
'remembermypassword' => 'ЗапамнÑтати моє Ð¿Ñ€Ð¸Ð³Ð¾Ð»Ð¾ÑˆÑ–Ð½Ñ Ð½Ð° тім компютерї (макÑімално $1 {{PLURAL:$1|день|днів}})',
-'securelogin-stick-https' => 'ОÑтаньте припоєны через HTTPS по приголошіню',
+'userlogin-remembermypassword' => 'ПриголоÑити Ð½Ñ Ð½Ð° довго',
+'userlogin-signwithsecure' => 'ХоÑновати забеÑпечене ÑпоїнÑ',
'yourdomainname' => 'Ваша домена:',
'password-change-forbidden' => 'Ðа тій вікі не можете мінити геÑла.',
'externaldberror' => 'Ðбо ÑÑ Ñтала хыба екÑтерной автентіфікачной датабазы, або не маєте дозволено мінити Ñвоє екÑтерне конто.',
@@ -545,18 +564,41 @@ $2',
'logout' => 'ОдголоÑити',
'userlogout' => 'ОдголошінÑ',
'notloggedin' => 'Ðе Ñьте приголошеный(а)',
+'userlogin-noaccount' => 'Ðе мате конто?',
+'userlogin-joinproject' => 'Придайте ÑÑ {{grammar:3sg|{{SITENAME}}}}',
'nologin' => "До теперь не маєте конто? '''$1'''.",
'nologinlink' => 'Створити конто',
'createaccount' => 'Вытворити конто',
'gotaccount' => "Уж Ñьте реґіÑтрованы? '''$1'''.",
'gotaccountlink' => 'ПриголошінÑ',
'userlogin-resetlink' => 'Забыли Ñьте вашы даны на приголошінÑ?',
+'userlogin-resetpassword-link' => 'РеÑетовати ваше геÑло',
+'helplogin-url' => 'Help:ПриголошінÑ',
+'userlogin-helplink' => '[[{{MediaWiki:helplogin-url}}|Поміч з приголошованём]]',
+'createacct-join' => 'Ðиже уведьте вашы інформації',
+'createacct-another-join' => 'Ðиже уведьте інформації нового конта',
+'createacct-emailrequired' => 'ÐдреÑа електронічной пошты',
+'createacct-emailoptional' => 'ÐдреÑа електронічной пошты (не обовÑзково)',
+'createacct-email-ph' => 'Уведьте вашу адреÑу електронічной пошты',
+'createacct-another-email-ph' => 'Уведьте адреÑу електронічной пошты',
'createaccountmail' => 'СхоÑновати дочаÑне геÑло та загнати го на вказану адреÑу електронічной пошты',
+'createacct-realname' => 'Правдиве Ñ–Ð¼Ñ (не обовÑзково)',
'createaccountreason' => 'Причіна:',
+'createacct-reason' => 'Прічіна',
+'createacct-reason-ph' => 'Чом Ñобі робите друге конто',
+'createacct-captcha' => 'Перевірка беÑпекы',
+'createacct-imgcaptcha-ph' => 'Опиште текÑÑ‚ што видите выÑше',
+'createacct-submit' => 'Створити конто',
+'createacct-another-submit' => 'Створити інше конто',
+'createacct-benefit-heading' => '{{grammar:4sg|{{SITENAME}}}} творÑÑ‚ÑŒ люде Ñк вы.',
+'createacct-benefit-body1' => '{{PLURAL:$1|едітованÑ|едітованÑ|едітовань}}',
+'createacct-benefit-body2' => '{{PLURAL:$1|Ñторінка|Ñторінкы|Ñторінок}}',
+'createacct-benefit-body3' => '{{PLURAL:$1|недавный приÑпіватель|недавны приÑпівателї|недавных приÑпівателїв}}',
'badretype' => 'Вами напиÑаны геÑла не ÑуглаÑÑÑ‚ÑŒ.',
'userexists' => 'Уведжене Ñ–Ð¼Ñ Ñ…Ð¾ÑÐ½Ð¾Ð²Ð°Ñ‚ÐµÐ»Ñ ÑÑ ÑƒÐ¶ хоÑнує.
ПроÑиме, выберьте інше імÑ.',
'loginerror' => 'Хыба при приголошованю',
+'createacct-error' => 'Хыба ÑÑ‚Ð²Ð¾Ñ€Ñ—Ð½Ñ ÐºÐ¾Ð½Ñ‚Ð°',
'createaccounterror' => 'Ðе вдало ÑÑ Ñтворити конто хоÑнователÑ: $1',
'nocookiesnew' => 'Конто хоÑÐ½Ð¾Ð²Ð°Ñ‚ÐµÐ»Ñ Ð±Ñ‹Ð»Ð¾ Ñтворене, але не Ñьте приголошены.
{{SITENAME}} хоÑнує cookies про Ð¿Ñ€Ð¸Ð³Ð¾Ð»Ð¾ÑˆÑ–Ð½Ñ Ð°Ð»Ðµ вы маєте cookies выпнуты .
@@ -614,10 +656,12 @@ $2',
Іґноруйте дане повідомлїнÑ, кідь конто было Ñтворено помылково.',
'usernamehasherror' => 'Мено хоÑÐ½Ð¾Ð²Ð°Ñ‚ÐµÐ»Ñ Ð½Ðµ Ñміє обÑÑговати Ñімбол мережка (#)',
'login-throttled' => 'Зробили Ñьте дуже много Ñпроб о приголошінÑ.
-ПроÑиме ВаÑ, почекайте перед далшов Ñпробов.',
+ПроÑиме ВаÑ, почекайте $1 перед далшов Ñпробов.',
'login-abort-generic' => 'Ðе вдало ÑÑ Ð²Ð¾Ð¹Ñ‚Ð¸ до ÑÑ–Ñтемы.',
'loginlanguagelabel' => 'Язык: $1',
'suspicious-userlogout' => 'Ваша пожадавка на Ð¾Ð´Ð³Ð¾Ð»Ð¾ÑˆÑ–Ð½Ñ Ð±Ñ‹Ð»Ð° одвергнута, бо вызерає то так, же была поÑлана розбитым переглÑдачом або кешуючім прокÑÑ–-Ñервером.',
+'createacct-another-realname-tip' => 'Правдиве Ñ–Ð¼Ñ Ñ” волительне.
+Кідь вы зволите го додати, тото буде пак хоÑноване на Ð´Ð¾Ð´Ð°Ð½Ñ ÑƒÑ‡Ð°Ñтникового попиÑу про ёго роботу.',
# Email sending
'php-mail-error-unknown' => 'Ðезнама хыба у PHP mail() функції',
@@ -632,8 +676,7 @@ $2',
'newpassword' => 'Ðове геÑло:',
'retypenew' => 'Ðапиште знову нове геÑло:',
'resetpass_submit' => 'ÐаÑтавити геÑло Ñ– приголоÑити ÑÑ',
-'resetpass_success' => 'Ваше геÑло было уÑпішно змінене!
-Такой входиме...',
+'changepassword-success' => 'Ваше геÑло было уÑпішно змінено!',
'resetpass_forbidden' => 'ГеÑла не Ñ” можне змінити',
'resetpass-no-info' => 'Ку тій Ñторінцї мають прÑмый приÑтуп лем приголошены хоÑнователї.',
'resetpass-submit-loggedin' => 'Змінити геÑло',
@@ -645,10 +688,11 @@ $2',
# Special:PasswordReset
'passwordreset' => 'РеÑет геÑла',
-'passwordreset-text' => 'Выпиште тот формуларь, жебы ÑÑ Ð²Ð°Ð¼ могло обновити геÑло',
+'passwordreset-text-one' => 'Выпиште тот формуларь, жебы Ñьте могли здобыти нове геÑло',
+'passwordreset-text-many' => '{{PLURAL:$1|Ðа Ð·Ð´Ð¾Ð±Ñ‹Ñ‚Ñ Ð½Ð¾Ð²Ð¾Ð³Ð¾ геÑла доповньте єдно з даных.}}',
'passwordreset-legend' => 'Знову наÑтавити геÑло',
'passwordreset-disabled' => 'ЗновунаÑÑ‚Ð°Ð²Ð»Ñ—Ð½Ñ Ð³ÐµÑла Ñ” на тій вікі заказане',
-'passwordreset-pretext' => '{{PLURAL:$1||Задайте єден з дат ниже}}',
+'passwordreset-emaildisabled' => 'Функції електронічной пошты были выпнуы на тій вікі.',
'passwordreset-username' => 'Мено хоÑнователÑ:',
'passwordreset-domain' => 'Домена:',
'passwordreset-capture' => 'ПоÑмотрити выÑлїдный імейл?',
@@ -674,7 +718,7 @@ $2
ДочаÑне геÑло: $2',
'passwordreset-emailsent' => 'Імейл з геÑлом быв поÑланый.',
'passwordreset-emailsent-capture' => 'Быв выґенерованый імейл з геÑлом, што Ñ” вказаный ниже.',
-'passwordreset-emailerror-capture' => 'Быв выґенерованый припоминаючій імейл, котрый Ñ” указаный ниже, але одоÑлати хоÑнователёви ÑÑ Ð³Ð¾ не вдало: $1',
+'passwordreset-emailerror-capture' => 'Быв выґенерованый імейл з геÑлом, котрый Ñ” указаный ниже, але ÑÑ Ð³Ð¾ не вдало загнати {{GENDER:$2|хоÑнователёви|хоÑновательцї}}: $1',
# Special:ChangeEmail
'changeemail' => 'Зміна імейловой адреÑÑ‹',
@@ -688,6 +732,19 @@ $2
'changeemail-submit' => 'Змінити імейл',
'changeemail-cancel' => 'Сторно',
+# Special:ResetTokens
+'resettokens' => 'Ð ÐµÑ–Ð½Ñ–Ñ†Ñ–Ð°Ð»Ñ–Ð·Ð°Ñ†Ñ–Ñ ÐºÐ»Ñ–Ñ‡Ñ–Ð²',
+'resettokens-text' => 'Ðа тій Ñторінцї можете реініціалізовати клічі, Ñкы уможнюють приÑтуп к даÑкым пріватным даным звÑзаным з вашым контом.
+
+{{GENDER:|Мав|Мала|Мали}} бы Ñьте то учінити тогды, колы Ñьте помылково дакому {{GENDER:|прозрадив|прозрадила|прозрадили}}, або ваше конто было зрушене.',
+'resettokens-no-tokens' => 'Ðе Ñ” ниÑкых клічів на реініціалізацію.',
+'resettokens-legend' => 'Ð ÐµÑ–Ð½Ñ–Ñ†Ñ–Ð°Ð»Ñ–Ð·Ð°Ñ†Ñ–Ñ ÐºÐ»Ñ–Ñ‡Ñ–Ð²',
+'resettokens-tokens' => 'Клічі:',
+'resettokens-token-label' => '$1 (актуалне значінÑ: $2)',
+'resettokens-watchlist-token' => 'Кліч до вебового канала (Atom/RSS) [[Special:Watchlist|змін Ñлїдованых Ñторінок]]',
+'resettokens-done' => 'Клічі были реініціалізованы.',
+'resettokens-resetbutton' => 'Реініціалізовати зволены клічі',
+
# Edit page toolbar
'bold_sample' => 'ТовÑтый текÑÑ‚',
'bold_tip' => 'Шырокый текÑÑ‚',
@@ -873,11 +930,14 @@ $2
ÐÑÑ– была змазана.',
'edit-conflict' => 'Конфлікт едітованÑ.',
'edit-no-change' => 'Ваша ÐµÐ´Ñ–Ñ‚Ð°Ñ†Ñ–Ñ Ð±Ñ‹Ð»Ð° іґнорована, бо ÑÑ Ð½Ðµ зробила жадна зміна текÑту.',
+'postedit-confirmation' => 'Ваше ÐµÐ´Ñ–Ñ‚Ð¾Ð²Ð°Ð½Ñ Ð±Ñ‹Ð»Ð¾ уложене.',
'edit-already-exists' => 'Ðе вдало ÑÑ Ñтворити нову Ñторінку, бо она уж Ñ–Ñнує.',
'defaultmessagetext' => 'ПреднаÑтавленый текÑÑ‚ повідомлїнÑ',
'content-failed-to-parse' => 'Ðе вдало ÑÑ Ð¿Ñ€Ð¾Ð°Ð½Ð°Ð»Ñ–Ð·Ð¾Ð²Ð°Ñ‚Ð¸ $2 Ñк тіп $1: $3',
'invalid-content-data' => 'ÐеприпуÑтны даны',
'content-not-allowed-here' => 'ОбÑÑг «$1» недозволеный на Ñторінцї [[$2]]',
+'editwarning-warning' => 'Зохаблїнём той Ñтрінкы ÑÑ Ð¼Ð¾Ð¶ÑƒÑ‚ÑŒ вшыткы учінены зміны Ñтратити.
+Кідь Ñьте приголошеный, можете тото Ð²Ð°Ñ€Ð¾Ð²Ð°Ð½Ñ Ð²Ñ‹Ð¿Ð½ÑƒÑ‚Ð¸ на картї „ЕдітованÑ“ в хоÑновательÑкім інтерфейÑÑ—.',
# Content models
'content-model-wikitext' => 'вікітекÑÑ‚',
@@ -912,6 +972,7 @@ $2
'undo-failure' => 'Ð•Ð´Ñ–Ñ‚Ð¾Ð²Ð°Ð½Ñ Ð½Ðµ могло быти зрушене про конфлікт міджілеглых змін.',
'undo-norev' => 'Тото ÐµÐ´Ñ–Ñ‚Ð¾Ð²Ð°Ð½Ñ Ð½Ðµ можете вернути назад, бо не екзіÑтує або было змазане.',
'undo-summary' => 'Зрушена Ð²ÐµÑ€Ð·Ñ–Ñ $1 од хоÑÐ½Ð¾Ð²Ð°Ñ‚ÐµÐ»Ñ [[Special:Contributions/$2|$2]] ([[User talk:$2|діÑкузіÑ]])',
+'undo-summary-username-hidden' => 'Зрушыти ревізію $1 Ñкрытого хоÑнователÑ',
# Account creation failure
'cantcreateaccounttitle' => 'Ðе Ñ” можне вытворити конто',
@@ -1090,6 +1151,7 @@ $1",
'compareselectedversions' => 'Порівнати выбраны верзії',
'showhideselectedversions' => 'Вказати/Ñкрыти выбраны ревізії',
'editundo' => 'вернути назад',
+'diff-empty' => '(Ðе Ñ” роздїлне)',
'diff-multi' => '({{PLURAL:$1|Ðе Ñ” зображена єдна міджілегла верзіÑ|Ðе Ñуть зображены $1 міджілеглы верзії|Ðе Ñ” зображено $1 міджілеглых верзій}} од {{PLURAL:$2|1 хоÑнователÑ|$2 хоÑнователїв}} .)',
'diff-multi-manyusers' => '(Ðе Ñ” зображено $1 міджілеглых верзій од веце Ñк $2 {{PLURAL:$2|хоÑнователÑ|хоÑнователїв}}.)',
'difference-missing-revision' => '{{PLURAL:$2|Єдна з ревізій|$2 ревізії|$2 ревізій}} к пожадованому порівнаню ($1) {{PLURAL:$2|не Ñ”|не Ñуть|не Ñ”}}.
@@ -1117,7 +1179,6 @@ $1",
'searchmenu-legend' => 'Параметры глÑданÑ',
'searchmenu-exists' => "'''У тій вікі Ñ” Ñторінка з назвов «[[:$1]]»'''",
'searchmenu-new' => "'''Створити Ñторінку «[[:$1]]» у тій вікі!'''",
-'searchhelp-url' => 'Help:ОбÑÑг',
'searchmenu-prefix' => '[[Special:PrefixIndex/$1|Вказати Ñторінкы з тым префікÑом]]',
'searchprofile-articles' => 'Статї',
'searchprofile-project' => 'Сторінкы помочі і проєкту',
@@ -1159,15 +1220,7 @@ $1",
'powersearch-togglenone' => 'Жадный',
'search-external' => 'ЕкÑтерне глÑданÑ',
'searchdisabled' => '<p>Перебачте. ПовнотекÑтове глÑÐ´Ð°Ð½Ñ Ñ” дочаÑно недоÑтупне. Ð—Ð°Ñ‚Ð»Ñ Ð¼Ð¾Ð¶ÐµÑ‚Ðµ Ñпробовати глÑÐ´Ð°Ð½Ñ Google; Ñ” але можне, же ёго резултаты не муÑÑÑ‚ÑŒ быти актуалны.</p>',
-
-# Quickbar
-'qbsettings' => 'Панел навіґації',
-'qbsettings-none' => 'Жадный',
-'qbsettings-fixedleft' => 'Лежыть влїво',
-'qbsettings-fixedright' => 'Лежыть вправо',
-'qbsettings-floatingleft' => 'Плаваюча влїво',
-'qbsettings-floatingright' => 'Плаваюча вправо',
-'qbsettings-directionality' => 'Певный, в залежноÑти на напрÑми вашого пиÑьма',
+'search-error' => 'Як ÑÑ Ð³Ð»Ñдало трафіла ÑÑ Ñ…Ñ‹Ð±Ð°: $1',
# Preferences page
'preferences' => 'ÐаÑтавлїнÑ',
@@ -1201,7 +1254,6 @@ $1",
'resetprefs' => 'Вернути неуложены зміны',
'restoreprefs' => 'Обновити вшыткы штандартны наÑÑ‚Ð°Ð²Ð»Ñ—Ð½Ñ (у вшыткых ÑекціÑÑ…)',
'prefs-editing' => 'ЕдітованÑ',
-'prefs-edit-boxsize' => 'Розмір окна едітованÑ:',
'rows' => 'РÑдкы:',
'columns' => 'Колонкы:',
'searchresultshead' => 'ГлÑданÑ',
@@ -1212,9 +1264,8 @@ $1",
'recentchangesdays-max' => '(макÑімум $1 {{PLURAL:$1|день|днї|днїв}})',
'recentchangescount' => 'ЧіÑло імпліцітно зображованых едітовань:',
'prefs-help-recentchangescount' => 'Тыкать ÑÑ Ð¿Ð¾Ñлїднїх змін, Ñ–Ñторії Ñторінок Ñ– протоколовачіх запиÑів.',
-'prefs-help-watchlist-token' => 'Кідь до того Ð¿Ð¾Ð»Ñ Ð²Ñ‹Ð¿Ð¾Ð²Ð½Ð¸Ñ‚Ðµ тайный ключ, буде Ñтвореный RSS канал вашых Ñлїдованых Ñторінок.
-Хоцьхто хто знає тот ключ, пак буде мочі ваш ÑпиÑок Ñлїдованых Ñторінок чітати, та же не забывайте на беÑпечноÑÑ‚ÑŒ.
-Можете ÑхоÑновати тото трафунково выґенероване значінÑ: $1',
+'prefs-help-watchlist-token2' => 'ГевÑе Ñ” тайный кліч до вебового порталу вашых Ñлїдованых Ñторінок. Хоцьхто, хто тот кліч буде мав, буде міг ваш ÑпиÑок Ñлїдованых Ñторінок чітати, та же го никому не давайте.
+[[Special:ResetTokens|Кликнутём гев го можете реініціалізовати.]]',
'savedprefs' => 'Ваше наÑÑ‚Ð°Ð²Ð»Ñ—Ð½Ñ Ð±Ñ‹Ð»Ð¾ уложене.',
'timezonelegend' => 'ЧаÑова зона:',
'localtime' => 'МіÑтный чаÑ:',
@@ -1245,7 +1296,6 @@ $1",
'prefs-reset-intro' => 'Помочов той Ñторінкы можете вшыткы наÑÑ‚Ð°Ð²Ð»Ñ—Ð½Ñ Ð²ÐµÑ€Ð½ÑƒÑ‚Ð¸ на імпліцітны годноты.
Тоту операцію не годен вернути назад.',
'prefs-emailconfirm-label' => 'ÐŸÐ¾Ñ‚Ð²ÐµÑ€Ð´Ð¶Ñ–Ð½Ñ ÐµÐ»ÐµÐºÑ‚Ñ€Ð¾Ð½Ñ–Ñ‡Ð½Ð¾Ð¹ пошты:',
-'prefs-textboxsize' => 'Розмір окна едітованÑ',
'youremail' => 'ÐдреÑа електронічной пошты:',
'username' => '{{GENDER:$1|Ð†Ð¼Ñ Ñ…Ð¾ÑнователÑ}}:',
'uid' => 'Ідентіфікатор {{GENDER:$1|хоÑнователÑ}}:',
@@ -1279,6 +1329,8 @@ $1",
'prefs-dateformat' => 'Формат датуму',
'prefs-timeoffset' => 'ЧаÑовый поÑун',
'prefs-advancedediting' => 'Общі параметры',
+'prefs-editor' => 'Едітор',
+'prefs-preview' => 'ÐаглÑд',
'prefs-advancedrc' => 'РоÑшырены можноÑти',
'prefs-advancedrendering' => 'Розшырены можноÑти',
'prefs-advancedsearchoptions' => 'Розшырены можноÑти',
@@ -1286,7 +1338,9 @@ $1",
'prefs-displayrc' => 'ÐаÑÑ‚Ð°Ð²Ð»Ñ—Ð½Ñ Ð²Ð·Ð³Ð»Ñду',
'prefs-displaysearchoptions' => 'ÐаÑÑ‚Ð°Ð²Ð»Ñ—Ð½Ñ Ð²Ð·Ð³Ð»Ñду',
'prefs-displaywatchlist' => 'ÐаÑÑ‚Ð°Ð²Ð»Ñ—Ð½Ñ Ð²Ð·Ð³Ð»Ñду',
+'prefs-tokenwatchlist' => 'Кліч',
'prefs-diffs' => 'ÐŸÐ¾Ñ€Ñ–Ð²Ð½Ð°Ð½Ñ Ð²ÐµÑ€Ð·Ñ–Ñ—',
+'prefs-help-prefershttps' => 'Тот параметер набуде чінноÑти по вашім далшім входї до ÑÑ–Ñтемы.',
# User preference: email validation using jQuery
'email-address-validity-valid' => 'ÐдреÑа ел. пошты вызерать быти правилна',
@@ -1313,6 +1367,8 @@ $1",
'userrights-notallowed' => 'Ð’Ñ‹ не мате права придати або одÑтранити хоÑновательÑкы права.',
'userrights-changeable-col' => 'Òрупы, котры можете змінити',
'userrights-unchangeable-col' => 'Òрупы, котры не можете змінити',
+'userrights-conflict' => 'Конфлікт змін прав хоÑнователїв! ПроÑиме, перевірьте зміны Ñ– потвердьте Ñ—Ñ….',
+'userrights-removed-self' => 'Ð’Ñ‹ уÑпішно позбавили ÑÑ Ð²Ð»Ð°Ñтных прав. Зато уж веце не мате приÑтуп до той Ñторінкы.',
# Groups
'group' => 'Òрупа:',
@@ -1379,11 +1435,19 @@ $1",
'right-proxyunbannable' => 'ÐžÐ±Ñ…Ð¾Ð´Ð¶Ñ–Ð½Ñ Ð°Ð²Ñ‚Ð¾Ð¼Ð°Ñ‚Ñ–Ñ‡Ð½Ð¾Ð³Ð¾ Ð±Ð»Ð¾ÐºÐ¾Ð²Ð°Ð½Ñ Ð¿Ñ€Ð¾ÐºÑÑ– Ñерверів',
'right-unblockself' => 'Одблоковати Ñамого Ñебе',
'right-protect' => 'Зміна ровни замків Ñ– ÐµÐ´Ñ–Ñ‚Ð¾Ð²Ð°Ð½Ñ ÐºÐ°Ñкадово замкнутых Ñторінок',
-'right-editprotected' => 'Ð•Ð´Ñ–Ñ‚Ð¾Ð²Ð°Ð½Ñ Ð·Ð°Ð¼ÐºÐ½ÑƒÑ‚Ñ‹Ñ… Ñторінок (без каÑкадового замку)',
+'right-editprotected' => 'Ð•Ð´Ñ–Ñ‚Ð¾Ð²Ð°Ð½Ñ Ñторінок замкнутых на „{{int:protect-level-sysop}}“',
+'right-editsemiprotected' => 'Ð•Ð´Ñ–Ñ‚Ð¾Ð²Ð°Ð½Ñ Ñторінок замкнутых на „{{int:protect-level-autoconfirmed}}“',
'right-editinterface' => 'Ð•Ð´Ñ–Ñ‚Ð¾Ð²Ð°Ð½Ñ Ñ–Ð½Ñ‚ÐµÑ€Ñ„ÐµÐ¹Ñу хоÑнователÑ',
'right-editusercssjs' => 'Ð•Ð´Ñ–Ñ‚Ð¾Ð²Ð°Ð½Ñ CSS Ñ– JS файлів іншых хоÑнователїв',
'right-editusercss' => 'Ð•Ð´Ñ–Ñ‚Ð¾Ð²Ð°Ð½Ñ CSS файлів іншых хоÑнователїв',
'right-edituserjs' => 'Ð•Ð´Ñ–Ñ‚Ð¾Ð²Ð°Ð½Ñ JS файлів іншых хоÑнователїв',
+'right-editmyusercss' => 'Едітовати вашы влаÑтны хоÑновательÑкы CSS файлы.',
+'right-editmyuserjs' => 'Едітовати вашы влаÑтны хоÑновательÑкы JavaScript файлы',
+'right-viewmywatchlist' => 'ÐŸÐµÑ€ÐµÐ·ÐµÑ€Ð°Ð½Ñ Ð²Ð»Ð°Ñтного ÑпиÑку Ñлїдованых Ñторінок',
+'right-editmywatchlist' => 'Ð•Ð´Ñ–Ñ‚Ð¾Ð²Ð°Ð½Ñ Ð²Ð»Ð°Ñтного ÑпиÑку Ñлїдованых Ñторінок. УÑвідомте Ñобі, же дакотры дїї будуть до нёго придавати Ñторінкы Ñ– без такого права.',
+'right-viewmyprivateinfo' => 'ÐŸÐµÑ€ÐµÐ·ÐµÑ€Ð°Ð½Ñ Ð²Ð»Ð°Ñтных пріватных даных (напр. імейлова адреÑа, правдиве імÑ)',
+'right-editmyprivateinfo' => 'Зміна вашых пріватных даных (напр. імейлова адреÑа, правдиве імÑ)',
+'right-editmyoptions' => 'Зміна вашых хоÑновательÑкых наÑтавлїнь',
'right-rollback' => 'Швыдкый реверт управ поÑлїднёго хоÑÐ½Ð¾Ð²Ð°Ñ‚ÐµÐ»Ñ ÐµÐ´Ñ–Ñ‚ÑƒÑŽÑ‡Ð¾Ð³Ð¾ дану Ñторінку',
'right-markbotedits' => 'ÐžÐ·Ð½Ð°Ñ‡Ð¾Ð²Ð°Ð½Ñ Ñ€ÐµÐ²ÐµÑ€Ñ‚Ñ–Ð² Ñк ÐµÐ´Ñ–Ñ‚Ð¾Ð²Ð°Ð½Ñ Ñ€Ð¾Ð±Ð¾Ñ‚Ð°',
'right-noratelimit' => 'Ðе має Ð¾Ð±Ð¼ÐµÐ´Ð¶Ñ–Ð½Ñ Ð² швыдкоÑти',
@@ -1445,12 +1509,18 @@ $1",
'action-userrights-interwiki' => 'зміна прав хоÑнователїв на іншых вікі',
'action-siteadmin' => 'замыкати або одомыкати датабазу',
'action-sendemail' => 'поÑылати імейлы',
+'action-editmywatchlist' => 'едітовати ваш ÑпиÑок Ñлїдованых Ñторінок',
+'action-viewmywatchlist' => 'перезерати ваш ÑпиÑок Ñлїдованых Ñторінок',
+'action-viewmyprivateinfo' => 'перезерати вашы пріватны даны',
+'action-editmyprivateinfo' => 'едітовати вашы пріватны інформації',
# Recent changes
'nchanges' => '$1 {{PLURAL:$1|зміна|зміны|змін}}',
+'enhancedrc-since-last-visit' => '$1 {{PLURAL:$1|од оÑтатнёй навщівы}}',
'recentchanges' => 'ПоÑлїднї зміны',
'recentchanges-legend' => 'МожноÑти поÑлїднїх змін',
'recentchanges-summary' => 'Слїдуйте поÑлїднї зміны на {{grammar:genitive|{{SITENAME}}}} на тій Ñторінцї.',
+'recentchanges-noresult' => 'Ð’ данім періодї, не было ниÑкых змін, штобы одповідали тым крітеріÑм.',
'recentchanges-feed-description' => 'Ðа тотїм каналу Ñлїдуєте поÑлїднї зміны на {{grammar:6sg|{{SITENAME}}}}.',
'recentchanges-label-newpage' => 'Тым едітованём была Ñтворена нова Ñторінка',
'recentchanges-label-minor' => 'Тото є мала зміна',
@@ -1487,7 +1557,6 @@ $1",
'recentchangeslinked-feed' => 'ПовÑзаны зміны',
'recentchangeslinked-toolbox' => 'ПовÑзаны зміны',
'recentchangeslinked-title' => 'Зміны звÑзаны з «$1»',
-'recentchangeslinked-noresult' => 'Ð’ зазначенім чаÑÑ— не были жадны зміны на одказованых Ñторінках.',
'recentchangeslinked-summary' => "Тото Ñ” ÑпиÑок недавных змін на Ñторінках на котры одказує задана Ñторінка (або котры належать до той катеґорії).
Сторінкы з [[Special:Watchlist|вашого ÑпиÑку Ñлїдованых]] Ñуть вызначены '''тучно'''.",
'recentchangeslinked-page' => 'Ðазва Ñторінкы:',
@@ -1499,7 +1568,7 @@ $1",
'reuploaddesc' => 'Зрушыти Ð»Ð°Ð´Ð¾Ð²Ð°Ð½Ñ Ð° вернути ÑÑ Ð´Ð¾ формы наладовованÑ',
'upload-tryagain' => 'Уложыти зміненый Ð¿Ð¾Ð¿Ð¸Ñ Ñ„Ð°Ð¹Ð»Ñƒ',
'uploadnologin' => 'Ðе Ñьте приголошеный(а)',
-'uploadnologintext' => 'Жебы наладовати файл, муÑите ÑÑ [[Special:UserLogin|приголоÑити]].',
+'uploadnologintext' => 'Про Ð½Ð°Ð»Ð°Ð´Ð¾Ð²Ð°Ð½Ñ Ñ„Ð°Ð¹Ð»Ñƒ ÑÑ Ð¼ÑƒÑите $1.',
'upload_directory_missing' => 'ÐдреÑарь про Ð½Ð°Ð»Ð°Ð´Ð¾Ð²Ð¾Ð²Ð°Ð½Ñ Ñ„Ð°Ð¹Ð»Ñ–Ð² ($1) хыбить тай вебовый Ñервер го не годен Ñтворити.',
'upload_directory_read_only' => 'До адреÑÐ°Ñ€Ñ Ð½Ð°Ð»Ð°Ð´Ð¾Ð²Ð°Ð½Ñ‹Ñ… файлів ($1) не мать вебовый Ñервер права запиÑу.',
'uploaderror' => 'Під Ñ‡Ð°Ñ Ð»Ð°Ð´Ð¾Ð²Ð°Ð½Ñ ÑÑ Ð¿Ñ€Ð¸Ñ‚Ñ€Ð°Ñ„Ð¸Ð»Ð° хыба',
@@ -1705,7 +1774,6 @@ $1',
'http-read-error' => 'Хыба Ñ‡Ñ–Ñ‚Ð°Ð½Ñ HTTP.',
'http-timed-out' => 'Ð§Ð°Ñ Ð¿Ñ€Ð¾ HTTP пожадавкы уплинув.',
'http-curl-error' => 'Хыба при чітаню з URL: $1',
-'http-host-unreachable' => 'Ðе вдало ÑÑ Ð´Ð¾ÑÑгнути URL.',
'http-bad-status' => 'Під Ñ‡Ð°Ñ HTTP пожадавкы притрафив ÑÑ Ð¿Ñ€Ð¾Ð±Ð»ÐµÐ¼: $1 $2',
# Some likely curl errors. More could be added from <http://curl.haxx.se/libcurl/c/libcurl-errors.html>
@@ -1733,6 +1801,10 @@ $1',
'listfiles_size' => 'Розмір (в байтах)',
'listfiles_description' => 'ОпиÑ',
'listfiles_count' => 'Верзії',
+'listfiles-show-all' => 'Включати Ñтары верзії образчіків',
+'listfiles-latestversion' => 'Ðктуална верзіÑ',
+'listfiles-latestversion-yes' => 'Гей',
+'listfiles-latestversion-no' => 'ÐÑ—',
# File description page
'file-anchor-link' => 'Файл',
@@ -1828,6 +1900,12 @@ $1',
'randompage' => 'Трафункова ÑтатÑ',
'randompage-nopages' => 'Ðе Ñ” Ñторінок в {{PLURAL:$2|проÑторі назв|проÑторах назв}} $1.',
+# Random page in category
+'randomincategory' => 'Трафункова Ñторінка в катеґорії',
+'randomincategory-invalidcategory' => '" $1 " не є платна назва катеґорії.',
+'randomincategory-nopages' => 'Ð’ [[:Category:$1|катеґорії $1]] не Ñуть ниÑкы Ñторінкы.',
+'randomincategory-selectcategory' => 'ДіÑтати трафункову Ñторінку з катеґорії: $1 $2.',
+
# Random redirect
'randomredirect' => 'Трафункове напрÑмлїнÑ',
'randomredirect-nopages' => 'ПроÑтор назв „$1“ не обÑÑгує жадны напрÑмлїнÑ.',
@@ -1853,17 +1931,13 @@ $1',
'statistics-users-active-desc' => 'ХоÑнователї, котры в {{plural:$1|минулого днÑ|минулых $1 днїв}} провели даÑку операцію',
'statistics-mostpopular' => 'Ðайчітанїшы Ñторінкы',
-'disambiguations' => 'Сторінкы одказуючі на богатозначны Ñтатї',
-'disambiguationspage' => 'Template:disambig',
-'disambiguations-text' => "Слїдуючі Ñторінкы включають найменше єден одказ на '''чеперушку'''.
-ÐÑÑ– наміÑто того мали бы одказовати на конкретнїшу Ñторінку.<br />
-Сторінка Ñ” тримана за чеперушку, кідь хоÑнує дакотру із шаблон одказованых на [[MediaWiki:Disambiguationspage]].",
-
'pageswithprop' => 'Сторінкы з влаÑтноÑÑ‚Ñми',
'pageswithprop-legend' => 'Сторінкы з влаÑтноÑтёв',
'pageswithprop-text' => 'Тота Ñторінка обÑÑгує ÑпиÑок Ñторінкы, што хоÑнують вызначену влаÑтноÑÑ‚ÑŒ Ñторінкы.',
'pageswithprop-prop' => 'Ðазва влаÑтноÑти:',
'pageswithprop-submit' => 'Выконати',
+'pageswithprop-prophidden-long' => 'довге Ð·Ð½Ð°Ñ‡Ñ–Ð½Ñ Ñ‚ÐµÐºÑтовой влаÑтноÑти Ñховане ($1)',
+'pageswithprop-prophidden-binary' => 'Ð·Ð½Ð°Ñ‡Ñ–Ð½Ñ Ð±Ñ–Ð½Ð°Ñ€Ð½Ð¾Ð¹ влаÑтноÑти Ñ” Ñховане ($1)',
'doubleredirects' => 'Двоїты напрÑмлїнÑ',
'doubleredirectstext' => 'Ðа тій Ñторінцї Ñ” ÑпиÑок напрÑмлїн ведучіх на далшы напрÑмлїнÑ.
@@ -1921,6 +1995,7 @@ $1',
'mostrevisions' => 'Сторінкы з найвеце ревізіÑми',
'prefixindex' => 'Вшыткы Ñторінкы з початком назв',
'prefixindex-namespace' => 'Вшыткы Ñторінкы з префікÑом (проÑтор назв $1)',
+'prefixindex-strip' => 'ОдÑїчі початок назвы в ÑпиÑку',
'shortpages' => 'Курты Ñтатї',
'longpages' => 'Ðайдовшы Ñтатті',
'deadendpages' => 'Слїпы Ñторінкы',
@@ -2113,7 +2188,6 @@ $1',
'unwatchthispage' => 'Ðе Ñлїдовати Ñторінку',
'notanarticle' => 'Тото не Ñ” ÑтатÑ',
'notvisiblerev' => 'Ð’ÐµÑ€Ð·Ñ–Ñ Ð±Ñ‹Ð»Ð° змазана',
-'watchnochange' => 'Жадна із Ñлїдованых положок не была едітована в чаÑÑ—, котрый Ñ” указаный.',
'watchlist-details' => '{{PLURAL:$1|Єдна Ñлїдована Ñторінка|Ñлїдованы Ñторінкы|Ñлїдованых Ñторінок}} (не рахувчі діÑкузны Ñторінкы).',
'wlheader-enotif' => 'Ð£Ð¿Ð¾Ð·Ð¾Ñ€Ð½Ñ—Ð½Ñ ÐµÐ». поштов Ñ” запнуте.',
'wlheader-showupdated' => "Сторінкы, котры ÑÑ Ð·Ð¼Ñ–Ð½Ð¸Ð»Ð¸ од вашой поÑлїднёй навщівы Ñуть вказаны '''грубо'''",
@@ -2512,14 +2586,12 @@ $1',
'ipb_blocked_as_range' => 'Хыба: IP-адреÑа $1 не Ñ” блокована прÑмо а так єй не Ñ” можне одблоковати. Є чаÑтёв заблокованого роÑÑÑгу $2, котрый може быти одблокованый.',
'ip_range_invalid' => 'Ðеплатный IP роÑÑÑг.',
'ip_range_toolarge' => 'Ð‘Ð»Ð¾ÐºÐ¾Ð²Ð°Ð½Ñ Ñ€Ð¾ÑÑÑгів векшых Ñк /$1 не Ñ” дозволене.',
-'blockme' => 'Заблокуй нÑ',
'proxyblocker' => 'Ð‘Ð»Ð¾ÐºÐ¾Ð²Ð°Ð½Ñ Ð¿Ñ€Ð¾ÐºÑÑ–',
-'proxyblocker-disabled' => 'Тота Ñ„ÑƒÐ½Ñ†Ñ–Ñ Ñ” выпнута.',
'proxyblockreason' => 'Ваша IP-адреÑа была заблокована, зато же фунґує Ñк отвореный прокÑÑ– Ñервер.
Контактуйте Ñвого Інтернет-провайдера або технічну підпору Ñ– інформуйте Ñ—Ñ… о тім Ñерьёзнім беÑпечноÑтнім проблемі.',
-'proxyblocksuccess' => 'Готово.',
'sorbsreason' => 'Ваша IP-адреÑа Ñ” веджена Ñк отвореный прокÑÑ– в DNSBL.',
'sorbs_create_account_reason' => 'Ваша IP-адреÑа Ñ” веджена Ñк одкрытый прокÑÑ– в DNSBL. З той адреÑÑ‹ Ñобі не можете Ñтворити конто.',
+'xffblockreason' => 'IP адреÑа напиÑана в голові X-Forwarded-For, ці уж ваша, або прокÑÑ– Ñервера, што хоÑнуєете, была заблокована. Оріґінална прічіна того блокованÑ: $1',
'cant-block-while-blocked' => 'Ðе можете блоковати іншых хоÑнователїв, кідь Ñьте Ñам заблокованый(а).',
'cant-see-hidden-user' => 'ХоÑнователь, котрого хочете заблоковати, уж быв заблокованый Ñ– Ñхованый. Кідьже не маєте права hideuser, не можете Ñобі наÑÑ‚Ð°Ð²Ð»Ñ—Ð½Ñ Ð±Ð»Ð¾ÐºÐ¾Ð²Ð°Ð½Ñ Ñ‚Ð¾Ð³Ð¾ хоÑÐ½Ð¾Ð²Ð°Ñ‚ÐµÐ»Ñ Ð¿Ð¾Ñмотрити ани го змінити.',
'ipbblocked' => 'Ðе можете блоковати або одблоковати іншых хоÑнователїв, {{GENDER:|Ñам|Ñама|Ñам}} Ñьте {{GENDER:|заблокованый|заблокована|заблокованый}}',
@@ -2681,6 +2753,8 @@ $1',
'thumbnail-more' => 'Звекшыти',
'filemissing' => 'Файл хыбить',
'thumbnail_error' => 'Хыба ÑÑ‚Ð²Ð¾Ñ€Ñ—Ð½Ñ Ð½Ð°Ð³Ð»Ñду: $1',
+'thumbnail_error_remote' => 'Хыбове Ð³Ð¾Ð»Ð¾ÑˆÑ–Ð½Ñ Ð· {{grammar:2sg|$1}}:
+$2',
'djvu_page_error' => 'Сторінка DjVu мімо роÑÑÑг',
'djvu_no_xml' => 'Ð¡Ñ‚Ð²Ð¾Ñ€Ñ—Ð½Ñ XML про файл DjVu ÑÑ Ð½Ðµ вдало.',
'thumbnail-temp-create' => 'ДочаÑный файл наглÑду негодно было Ñтворити',
@@ -2971,11 +3045,25 @@ $1',
'minutes' => '{{PLURAL:$1|$1 минута|$1 минуты|$1 минут}}',
'hours' => '{{PLURAL:$1|$1 година|$1 годины|$1 годин}}',
'days' => '{{PLURAL:$1|$1 день|$1 днї|$1 днїв}}',
+'weeks' => '{{PLURAL:$1|$1 тыждень|$1 тыжднї|$1 тыжднїв}}',
'months' => '{{PLURAL:$1|$1 міÑÑць|$1 міÑÑцї|$1 міÑÑцїв}}',
'years' => '{{PLURAL:$1|$1 рік|$1 рокы|$1 років}}',
'ago' => '$1 тому',
'just-now' => 'акурат теперь',
+# Human-readable timestamps
+'hours-ago' => 'перед $1 {{PLURAL:$1|годинов|годинами}}',
+'minutes-ago' => '$1 {{PLURAL:$1|минуту|минуты|минут}} тому',
+'seconds-ago' => '$1 {{PLURAL:$1|Ñекунду|Ñекунды|Ñекунд}} тому',
+'monday-at' => 'В понедїлёк о $1',
+'tuesday-at' => 'У вівторок о $1',
+'wednesday-at' => 'Ð’ Ñереду о $1',
+'thursday-at' => 'В четверь о $1',
+'friday-at' => 'Ð’ пÑтніцю о $1',
+'saturday-at' => 'Ð’ Ñуботу о $1',
+'sunday-at' => 'В недїлю о $1',
+'yesterday-at' => 'Вчера о $1',
+
# Bad image list
'bad_image_list' => 'Формат має быти наÑтупным:
@@ -3005,7 +3093,7 @@ $1',
* gpslongitude
* gpsaltitude',
-# EXIF tags
+# Exif tags
'exif-imagewidth' => 'Шырька',
'exif-imagelength' => 'Вышка',
'exif-bitspersample' => 'Глубка фарбы',
@@ -3183,7 +3271,7 @@ $1',
'exif-originalimageheight' => 'Вышка образчіка перед орїзанём',
'exif-originalimagewidth' => 'Шырка образчіка перед орїзанём',
-# EXIF attributes
+# Exif attributes
'exif-compression-1' => 'ÐеÑтиÑнутый',
'exif-compression-2' => '1-дімензіоналне Гуффманове ÐºÐ¾Ð´Ð¾Ð²Ð°Ð½Ñ Ð´Ð¾Ð²Ð¶ÐºÑ‹ бігу CCITT Group 3',
'exif-compression-3' => 'ÐšÐ¾Ð´Ð¾Ð²Ð°Ð½Ñ Ñ„Ð°ÐºÑів CCITT Group 3',
@@ -3568,7 +3656,6 @@ $5
'version-other' => 'Інше',
'version-mediahandlers' => 'ОбÑлуга медії',
'version-hooks' => 'Припойны пункты',
-'version-extension-functions' => 'Функції розшыринÑ',
'version-parser-extensiontags' => 'Приданы Ñінтактічны значкы',
'version-parser-function-hooks' => 'Функціа парÑера',
'version-hook-name' => 'Ðазва припойного пункту',
@@ -3577,6 +3664,7 @@ $5
'version-license' => 'ЛіценціÑ',
'version-poweredby-credits' => "Тота вікі біжыть на '''[//www.mediawiki.org/ MediaWiki]''', copyright © 2001–$1 $2.",
'version-poweredby-others' => 'іншы',
+'version-poweredby-translators' => 'перекладателї на translatewiki.net',
'version-credits-summary' => 'Слїдуючім людÑм бы Ñьме радо подÑковали за Ñ—Ñ… приÑпівкы [[Special:Version|MediaWiki]].',
'version-license-info' => 'MediaWiki Ñ” Ñлободный Ñофтвер; можете го шырити або управлÑти в згодї з уÑловіÑми GNU General Public License, выдаваной Free Software Foundation; будь Ð²ÐµÑ€Ð·Ñ–Ñ 2 той ліценції або (Ñк уважыте) будьÑка пізнїша верзіÑ.
@@ -3590,11 +3678,17 @@ MediaWiki Ñ” діÑтрібуована в надїї, же буде хоÑноÐ
'version-entrypoints-header-entrypoint' => 'Ð’Ñтупный пункт',
'version-entrypoints-header-url' => 'URL',
-# Special:FilePath
-'filepath' => 'Стежка ку файлу',
-'filepath-page' => 'Файл:',
-'filepath-submit' => 'Выконати',
-'filepath-summary' => 'Тота шпеціална Ñторінка вертать повну Ñтежку к файлу. Образкы ÑÑ Ð·Ð¾Ð±Ñ€Ð°Ð·ÑÑ‚ÑŒ в повнім розлишіню, іншы тіпы файлів ÑÑ Ð¾Ñ‚Ð²Ð¾Ñ€ÑÑ‚ÑŒ в аÑоціованых проґрамах.',
+# Special:Redirect
+'redirect' => 'ÐапрÑÐ¼Ð»Ñ—Ð½Ñ Ð·Ð° файлом, хоÑнователÑм або ID ревізії',
+'redirect-legend' => 'ÐапрÑмити на файл або Ñторінку',
+'redirect-summary' => 'Тота шпеціална Ñторінка напрÑмує на файл (по назві), Ñторінку (по ID ревізії) або хоÑÐ½Ð¾Ð²Ð°Ñ‚ÐµÐ»Ñ (по чіÑелнім хоÑнователёвім ID).',
+'redirect-submit' => 'Перейти',
+'redirect-lookup' => 'Ðайти:',
+'redirect-value' => 'ЗначінÑ',
+'redirect-user' => 'ID хоÑнователÑ',
+'redirect-revision' => 'Ð ÐµÐ²Ñ–Ð·Ñ–Ñ Ñторінкы',
+'redirect-file' => 'Ðазва файлу',
+'redirect-not-exists' => 'Ð—Ð½Ð°Ñ‡Ñ–Ð½Ñ ÑÑ Ð½Ðµ нашло',
# Special:FileDuplicateSearch
'fileduplicatesearch' => 'ГлÑÐ´Ð°Ð½Ñ Ð´ÑƒÐ¿Ð»Ñ–ÐºÐ°Ñ‚Ð½Ñ‹Ñ… файлів',
@@ -3644,6 +3738,7 @@ MediaWiki Ñ” діÑтрібуована в надїї, же буде хоÑноÐ
'tags' => 'Платны значкы про зміны',
'tag-filter' => 'Філтер [[Special:Tags|значок]]:',
'tag-filter-submit' => 'Філтровати',
+'tag-list-wrapper' => '([[Special:Tags|{{PLURAL:$1|Значка|Значкы}}]]: $2)',
'tags-title' => 'Значкы',
'tags-intro' => 'Тота Ñторінка обÑÑгує ÑпиÑок значок, котрыма може Ñофтвер означовати єднотливы ÐµÐ´Ñ–Ñ‚Ð¾Ð²Ð°Ð½Ñ Ñ– Ñ—Ñ… значінÑ.',
'tags-tag' => 'Ðазва значкы',
@@ -3670,6 +3765,7 @@ MediaWiki Ñ” діÑтрібуована в надїї, же буде хоÑноÐ
'dberr-problems' => 'Перебачте! Тот Ñервер має теперь технічны проблемы.',
'dberr-again' => 'Спробуйте обновити Ñторінку за пару мінут.',
'dberr-info' => '(не годен навÑзати ÑÐ¿Ð¾Ñ—Ð½Ñ Ð· датабазовым Ñервером: $1)',
+'dberr-info-hidden' => '(Ðе годен навÑзати ÑÐ¿Ð¾Ñ—Ð½Ñ Ð· датабазовым Ñервером)',
'dberr-usegoogle' => 'Можете Ñпробовати поглÑдати за допомогов Google.',
'dberr-outofdate' => 'Майте на увазї, же ёго індекÑÑ‹ можуть быти заÑтарілыма.',
'dberr-cachederror' => 'ÐаÑлїдуюча Ñторінка Ñ” ÐºÐ¾Ð¿Ñ–Ñ Ð· кеш Ñ– не муÑить быти актуалне.',
@@ -3685,6 +3781,9 @@ MediaWiki Ñ” діÑтрібуована в надїї, же буде хоÑноÐ
'htmlform-submit' => 'ОдоÑлати',
'htmlform-reset' => 'Вернути зміны',
'htmlform-selectorother-other' => 'Інше',
+'htmlform-no' => 'ÐÑ”',
+'htmlform-yes' => 'Гей',
+'htmlform-chosen-placeholder' => 'Звольте параметер',
# SQLite database support
'sqlite-has-fts' => '$1 з підпоров повнотекÑтового глÑданÑ',
@@ -3802,4 +3901,17 @@ MediaWiki Ñ” діÑтрібуована в надїї, же буде хоÑноÐ
# Image rotation
'rotate-comment' => 'Образчік обернутый о $1 {{PLURAL:$1|ґрадуÑ|ґрадуÑів}} за цайґером',
+# Limit report
+'limitreport-title' => 'Дата Ð¿Ñ€Ð¾Ñ„Ñ–Ð»Ð¾Ð²Ð°Ð½Ñ Ð¿Ð°Ñ€Ñера:',
+'limitreport-cputime' => 'Ð§Ð°Ñ Ñ…Ð¾ÑÐ½Ð¾Ð²Ð°Ð½Ñ CPU',
+'limitreport-cputime-value' => '$1 {{PLURAL:$1|Ñекунда|Ñекунды|Ñекунд}}',
+'limitreport-walltime' => 'ХоÑÐ½Ð¾Ð²Ð°Ð½Ñ Ñ€ÐµÐ°Ð»Ð½Ð¾Ð³Ð¾ чаÑу',
+'limitreport-walltime-value' => '$1 {{PLURAL:$1|Ñекунда|Ñекунды|Ñекунд}}',
+'limitreport-ppvisitednodes' => 'ЧіÑло ґузів навщівленых препроцеÑором',
+'limitreport-ppgeneratednodes' => 'ЧіÑло ґузів выґенерованых препроцеÑором',
+'limitreport-postexpandincludesize' => 'Розмір по включіню до роÑшырїнÑ',
+'limitreport-templateargumentsize' => 'Розмір арґументів шаблоны',
+'limitreport-expansiondepth' => 'ÐайвыÑша глубка роÑшырїнÑ',
+'limitreport-expensivefunctioncount' => 'ЧіÑло дорогой функції аналізатора',
+
);
diff --git a/languages/messages/MessagesRup.php b/languages/messages/MessagesRup.php
index 2d43144b..f19be29c 100644
--- a/languages/messages/MessagesRup.php
+++ b/languages/messages/MessagesRup.php
@@ -7,7 +7,6 @@
* @ingroup Language
* @file
*
- * @author D'AroemenenZullenNiVergaan
* @author Dumitrachi T. Fundu
* @author Hakka
*/
@@ -21,18 +20,18 @@ $messages = array(
'thursday' => 'Gioia',
'friday' => 'Vinirã',
'saturday' => 'Sãmbãtã',
-'january' => 'yinar',
-'february' => 'șcurtu',
-'march' => 'marțu',
-'april' => 'aprir',
-'may_long' => 'maiu',
-'june' => 'cirișar',
-'july' => 'alunar',
-'august' => 'avgustu',
-'september' => 'yizmăciun',
-'october' => 'xumedru',
-'november' => 'brumar',
-'december' => 'andreu',
+'january' => 'Yinar',
+'february' => 'Shcurtu',
+'march' => 'Martsu',
+'april' => 'Aprir',
+'may_long' => 'Mailu',
+'june' => 'Cirishar',
+'july' => 'Alunar',
+'august' => 'Avgustu',
+'september' => 'Yizmaciunjle',
+'october' => 'Xumedru',
+'november' => 'Brumar',
+'december' => 'Andreulu',
'january-gen' => 'Yinar',
'february-gen' => 'Shcurtu',
'march-gen' => 'Martsu',
@@ -45,92 +44,58 @@ $messages = array(
'october-gen' => 'Xumedru',
'november-gen' => 'Brumar',
'december-gen' => 'Andreulu',
-'jan' => 'yinar',
-'feb' => 'șcurtu',
-'mar' => 'marțu',
-'apr' => 'aprir',
-'may' => 'maiu',
-'jun' => 'cirișar',
-'jul' => 'alunar',
-'aug' => 'avgustu',
-'sep' => 'yizmăciun',
-'oct' => 'xumedru',
-'nov' => 'brumar',
-'dec' => 'andreu',
-
-# Categories related messages
-'pagecategories' => '{{PLURAL:$1|Categorie|Categorii}}',
-'category_header' => 'Frândzâ ti categoria "$1"',
-'hidden-categories' => '{{PLURAL:$1|Categorie ascumsâ|Categorii ascumsi}}',
'article' => 'Articlu',
'cancel' => 'Alasã',
'mytalk' => 'Zburare-a mea',
-'navigation' => 'Navigație',
+'navigation' => 'Navigatsia',
# Cologne Blue skin
'qbedit' => 'Alãxiri',
'qbspecialpages' => 'Frãndzã spetsiale',
-# Vector skin
-'vector-view-history' => 'Vedz istoric',
-'namespaces' => 'Spațiu di numi',
-'variants' => 'Variante',
-
-'tagline' => 'Ditu {{SITENAME}}',
'help' => 'Agiutor',
-'search' => 'Câftare',
+'search' => 'Caftã',
'searchbutton' => 'Caftã',
'go' => 'Du-vã',
'searcharticle' => 'Du-vã',
-'history_short' => 'Istoric',
+'history_short' => 'Istoria',
'printableversion' => 'Verzia ti tipuseare',
-'permalink' => 'Legătură permanentă',
-'edit' => 'Alâxire',
+'permalink' => 'Ligãtura permanentã',
+'edit' => 'Alãxiri',
'delete' => 'Ashcirdzire',
'protect' => 'Apurã',
-'newpage' => 'Frândzâ nauă',
-'talkpagelinktext' => 'Zburari',
'talk' => 'Discusiur',
-'views' => 'Videri',
'toolbox' => 'Cutia di hãlate',
'otherlanguages' => 'Pi alte limbe',
'jumptonavigation' => 'Navigatsia',
-'jumptosearch' => 'Câftare',
+'jumptosearch' => 'Caftã',
# 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' => 'Tu {{SITENAME}}',
'currentevents' => 'Evenimente di tora',
'disclaimers' => 'Nipricunuschire',
'edithelp' => 'Agiutor ti alãxire',
-'helppage' => 'Help:Conținut',
-'mainpage' => 'Prota frândză',
+'mainpage' => 'Prota frãndzã',
'mainpage-description' => 'Prota frãndzã',
-'portal' => 'Portal-a comunitatiľei',
-'portal-url' => 'Project:Portal-a comunitatiľei',
-'privacy' => 'Politică di confidențialitate',
+'portal' => 'Portal-a comunitatiljei',
'newmessageslink' => 'dimãndare nao',
'youhavenewmessagesmulti' => 'Avets nãi dimãndãri pi $1',
-'editsection' => 'alâxire',
-'editold' => 'Alâxiri',
-'viewsourceold' => 'videari izvor',
-'viewsourcelink' => 'videari izvor',
-'editsectionhint' => 'Alâxire parti: $1',
-'site-atom-feed' => '$1 Atom feed',
-'red-link-title' => '$1 (frândza nu easti)',
+'editsection' => 'Alãxiri',
+'editold' => 'Alãxiri',
# Short words for each namespace, by default used in the namespace tab in monobook
'nstab-main' => 'Articlu',
'nstab-user' => 'Frãndza-a ufilizitirolui',
-'nstab-special' => 'Frândzâ specială',
-'nstab-template' => 'Format',
-'nstab-category' => 'Categorie',
+'nstab-template' => 'Shablon',
# General errors
'viewsource' => 'Videts-u fãntãnã',
# Login and logout pages
+'welcomecreation' => '== Ghine vinish, $1 ==
+
+Isape a vostrã ira adratã. Nu agãrshits s-le alãxits alidzerle-a vostre ti {{SITENAME}}.',
'yourname' => 'Numa di ufilizitor:',
'yourpassword' => 'Cljao:',
'yourpasswordagain' => 'Bãgats-u cljao iara:',
@@ -152,19 +117,7 @@ $messages = array(
'showdiff' => 'Spuni le-alãxirle',
'loginreqlink' => 'Ligats-vã',
-# Diffs
-'lineno' => 'Linia $1:',
-'editundo' => 'arisire',
-
# Search results
-'searchresults' => 'Rezultate di câftare',
-'searchresults-title' => 'Rezultate di câftare ti "$1"',
-'shown-title' => 'Vedz $1 {{PLURAL:$1|rezultat|rezultate}} pi frândză',
-'searchprofile-everything' => 'Tuti',
-'searchprofile-project-tooltip' => 'Câftare ti $1',
-'search-result-size' => '$1 ({{PLURAL:$2|1 zbor|$2 zboarâ}})',
-'search-section' => '(partea $1)',
-'searchall' => 'tuti',
'powersearch' => 'Caftã',
# Preferences page
@@ -176,15 +129,12 @@ $messages = array(
'username' => 'Numa di ufilizitor:',
# Recent changes
-'recentchanges' => 'Alâxiri',
-'diff' => 'dif',
-'hist' => 'ist',
-'show' => 'Vedz',
+'recentchanges' => 'Alãxiri',
# Recent changes linked
'recentchangeslinked' => 'Alãxiri ligate',
'recentchangeslinked-feed' => 'Alãxiri ligate',
-'recentchangeslinked-toolbox' => 'Alâxiri ligate',
+'recentchangeslinked-toolbox' => 'Alãxiri ligate',
# Upload
'upload' => 'Pitritsets file',
@@ -193,17 +143,13 @@ $messages = array(
'filedesc' => 'Rezime',
'watchthisupload' => 'Mutrits-u frãndzã aistã',
-# File description page
-'file-anchor-link' => 'Fișier',
-
# Random page
-'randompage' => 'Frândză di nipandică',
+'randompage' => 'Frãndzã di nipandicã',
'brokenredirects-edit' => 'Alãxiri',
'brokenredirects-delete' => 'Ashcirdzire',
# Miscellaneous special pages
-'nbytes' => '$1 {{PLURAL:$1|octet|octeți}}',
'newpages-username' => 'Numa di ufilizitor:',
'move' => 'Tradzets',
'movethispage' => 'Tradzets-u frãndza aistã',
@@ -232,9 +178,6 @@ $messages = array(
# Undelete
'undelete-search-submit' => 'Caftã',
-# Namespace form on various pages
-'blanknamespace' => '(Prota)',
-
# Contributions
'contributions' => 'Ufilizitor:Contributsiur',
'mycontris' => 'Contributsiile-a meale',
@@ -243,12 +186,10 @@ $messages = array(
# What links here
'whatlinkshere' => 'Tsi s-leadze cu aistu',
-'whatlinkshere-page' => 'Frândză:',
# Block/unblock
'ipbreason' => 'Itia:',
'ipblocklist-submit' => 'Caftã',
-'contribslink' => 'contribuții',
# Move page
'move-page-legend' => 'Tradzets-u frãndzã',
@@ -264,11 +205,7 @@ $messages = array(
# Tooltip help for the actions
'tooltip-pt-preferences' => 'Alidzerle-a meale',
'tooltip-pt-logout' => 'Disligats-vã',
-'tooltip-search' => 'Câftare tru {{SITENAME}}',
'tooltip-p-logo' => 'Prota frãndzã',
-'tooltip-n-mainpage' => 'Vedz prota frândză',
-'tooltip-t-specialpages' => 'Unâ listâ di tuti frândzele',
-'tooltip-ca-nstab-category' => 'Vedz frândza di categorie',
# Special:NewFiles
'ilsubmit' => 'Caftã',
@@ -280,6 +217,6 @@ $messages = array(
'table_pager_limit_submit' => 'Du-vã',
# Special:SpecialPages
-'specialpages' => 'Frândzâ speciale',
+'specialpages' => 'Frãndzã spetsiale',
);
diff --git a/languages/messages/MessagesSa.php b/languages/messages/MessagesSa.php
index 18dda21d..15635a1d 100644
--- a/languages/messages/MessagesSa.php
+++ b/languages/messages/MessagesSa.php
@@ -172,7 +172,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__' ),
@@ -308,9 +308,6 @@ $messages = array(
'tog-shownumberswatching' => 'निरीकà¥à¤·à¤®à¤¾à¤£à¤¾à¤¨à¤¾à¤‚ योजकानां संखà¥à¤¯à¤¾ दरà¥à¤¶à¥à¤¯à¤¤à¤¾à¤®à¥',
'tog-oldsig' => 'विदà¥à¤¯à¤®à¤¾à¤¨à¤‚ हसà¥à¤¤à¤¾à¤™à¥à¤•à¤¨à¤®à¥:',
'tog-fancysig' => 'हसà¥à¤¤à¤¾à¤•à¥à¤·à¤°à¤¾à¤£à¤¿ विकिपाठवतॠसनà¥à¤¤à¥ (सà¥à¤µà¤šà¤¾à¤²à¤¿à¤¤-संबंधनेभà¥à¤¯à¤ƒ रहितानि)।',
-'tog-externaleditor' => 'Use external editor by default (for experts only, needs special settings on your computer. [//www.mediawiki.org/wiki/Manual:External_editors More information.])',
-'tog-externaldiff' => 'अकथिते (बाइ डिफालà¥à¤Ÿà¥ इति), बाहà¥à¤¯ अंतरकà¥à¤°à¤®à¤¾à¤¦à¥‡à¤¶à¤‚ पà¥à¤°à¤¯à¥‹à¤œà¤¯à¤¤à¥ (केवलेभà¥à¤¯à¤ƒ निपà¥à¤£à¥‡à¤­à¥à¤¯à¤ƒ, भवतः संगणके विशेषाः नà¥à¤¯à¤¾à¤¸à¤¾à¤ƒ आवशà¥à¤¯à¤•à¤¾à¤ƒ)।',
-'tog-showjumplinks' => '"इतà¥à¤¯à¥‡à¤¤à¤¤à¥ पà¥à¤°à¤¤à¤¿ कूरà¥à¤¦à¤¯à¤¤à¥" इति संबंधनानि समरà¥à¤¥à¤¯à¤¤à¥à¥¤',
'tog-uselivepreview' => 'संपादनेन सहैव पà¥à¤°à¤¾à¤—à¥à¤¦à¥ƒà¤¶à¥à¤¯à¤‚ दरà¥à¤¶à¤¯à¤¤à¥ (जावालिपिः अपेकà¥à¤·à¥à¤¯à¤¤à¥‡) (पà¥à¤°à¤¯à¥‹à¤—ातà¥à¤®à¤•à¤®à¥)।',
'tog-forceeditsummary' => 'समà¥à¤ªà¤¾à¤¦à¤¨à¤¸à¤¾à¤°à¤¾à¤‚शः न ददामि चेतॠतदा मां जà¥à¤žà¤¾à¤ªà¤¯à¤¤à¥à¥¤',
'tog-watchlisthideown' => 'मम समà¥à¤ªà¤¾à¤¦à¤¨à¤¾à¤¨à¤¿ अवेकà¥à¤·à¤£à¤¸à¥‚चà¥à¤¯à¤¾à¤ƒ गोपà¥à¤¯à¤¨à¥à¤¤à¤¾à¤®à¥à¥¤',
@@ -323,6 +320,7 @@ $messages = array(
'tog-diffonly' => 'आवृतà¥à¤¤à¤¿à¤¸à¥ अंतरं दरà¥à¤¶à¤¯à¤¨à¥ पà¥à¤°à¤¾à¤¤à¤¨à¤¾à¤ƒ आवृतà¥à¤¤à¤¯à¤ƒ मा दरà¥à¤¶à¤¯à¤¤à¥à¥¤',
'tog-showhiddencats' => 'निगूढाः वरà¥à¤—ाः दरà¥à¤¶à¥à¤¯à¤¨à¥à¤¤à¤¾à¤®à¥',
'tog-norollbackdiff' => 'पूरà¥à¤£à¤ªà¥à¤°à¤¤à¤¿à¤—मने कृते मा दरà¥à¤¶à¤¯à¤¤à¥ तदॠअंतरमà¥à¥¤',
+'tog-useeditwarning' => 'समà¥à¤ªà¤¾à¤¦à¤¨à¤¾à¤¨à¤¨à¥à¤¤à¤°à¤‚ रकà¥à¤·à¤£à¥‡à¤¨ विना पृषà¥à¤ à¤¤à¥à¤¯à¤¾à¤—ावसरे सà¥à¤®à¤¾à¤°à¥à¤¯à¤¤à¤¾à¤®à¥',
'underline-always' => 'सरà¥à¤µà¤¦à¤¾',
'underline-never' => 'कदापि न',
@@ -509,7 +507,7 @@ $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).
+# 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).
'aboutsite' => '{{SITENAME}} इतà¥à¤¯à¤¸à¥à¤¯ विषये',
'aboutpage' => 'Project:à¤à¤¤à¤¦à¥à¤µà¤¿à¤·à¤¯à¤•à¤®à¥',
'copyright' => 'असà¥à¤¯ घटकानि $1 इतà¥à¤¯à¤¸à¥à¤¯à¤¾à¤¨à¥à¤¤à¤°à¥à¤—तानि उपलबà¥à¤§à¤¾à¤¨à¤¿à¥¤',
@@ -519,7 +517,6 @@ $1',
'disclaimers' => 'पà¥à¤°à¤¤à¥à¤¯à¤¾à¤–à¥à¤¯à¤¾à¤¨à¤®à¥',
'disclaimerpage' => 'Project:साधारणं पà¥à¤°à¤¤à¥à¤¯à¤¾à¤–à¥à¤¯à¤¾à¤¨à¤®à¥',
'edithelp' => 'समà¥à¤ªà¤¾à¤¦à¤¨à¤¾à¤°à¥à¤¥à¤‚ सहायà¥à¤¯à¤®à¥',
-'edithelppage' => 'Help:समà¥à¤ªà¤¾à¤¦à¤¨à¤®à¥',
'helppage' => 'Help:आनà¥à¤¤à¤°à¥à¤¯à¤®à¥',
'mainpage' => 'मà¥à¤–à¥à¤¯à¤ªà¥ƒà¤·à¥à¤ à¤®à¥',
'mainpage-description' => 'मà¥à¤–à¥à¤¯à¤ªà¥ƒà¤·à¥à¤ à¤®à¥',
@@ -596,17 +593,6 @@ $1',
# General errors
'error' => 'दोषः',
'databaseerror' => 'दतà¥à¤¤à¤¾à¤§à¤¾à¤°à¥‡ दोषः',
-'dberrortext' => 'समंकाधार पृचà¥à¤›à¤¾à¤¯à¤¾à¤‚ वाकà¥à¤¯à¤°à¤šà¤¨à¤¾à¤¤à¥à¤°à¥à¤Ÿà¤¿à¤°à¥‡à¤•à¤¾ अभवतà¥à¥¤
-अनेन असà¥à¤®à¤¾à¤•à¤‚ तनà¥à¤¤à¥à¤°à¤¾à¤‚शे तà¥à¤°à¥à¤Ÿà¤¿à¤°à¤ªà¤¿ निरà¥à¤¦à¤¿à¤·à¥à¤Ÿà¤¾ सà¥à¤¯à¤¾à¤¤à¥à¥¤
-अनà¥à¤¤à¤¿à¤®à¤¾ चेषà¥à¤Ÿà¤¿à¤¤à¤¾ समंकाधार-पृचà¥à¤›à¤¾ आसीतà¥:
-<blockquote><code>$1</code></blockquote>
- "<code>$2</code>" इतà¥à¤¯à¤¸à¥à¤®à¤¾à¤¤à¥ फलनातà¥à¥¤
-समंकाधारे तà¥à¤°à¥à¤Ÿà¤¿à¤°à¤¾à¤¸à¥€à¤¤à¥: "<samp>$3: $4</samp>" इति।',
-'dberrortextcl' => 'समंकाधार पृचà¥à¤›à¤¾à¤¯à¤¾à¤‚ वाकà¥à¤¯à¤°à¤šà¤¨à¤¾ तà¥à¤°à¥à¤Ÿà¤¿à¤°à¥‡à¤•à¤¾ अभवतà¥à¥¤
-अनà¥à¤¤à¤¿à¤®à¤¾ चेषà¥à¤Ÿà¤¿à¤¤à¤¾ समंकाधार पृचà¥à¤›à¤¾ आसीतॠ:
-"$1"
-"$2" इति फलनातà¥à¥¤
-समंकाधारे "$3:$4" इति तà¥à¤°à¥à¤Ÿà¤¿à¤°à¥à¤œà¤¾à¤¤à¤¾à¥¤',
'laggedslavemode' => 'पà¥à¤°à¤¾à¤•à¥à¤ªà¥à¤°à¤¬à¥‹à¤§à¤¨à¤®à¥:असà¥à¤®à¤¿à¤¨à¥ पृषà¥à¤ à¥‡ सदà¥à¤¯à¥‹à¤œà¤¾à¤¤à¤¾à¤¨à¤¿ परिशोधनानि न सà¥à¤¯à¥à¤ƒ ।',
'readonly' => 'दतà¥à¤¤à¤§à¤¾à¤°à¤ƒ कीलितः',
'enterlockreason' => 'तनà¥à¤¤à¥à¤°à¤¿à¤¤à¥€à¤•à¤°à¤£à¤¸à¥à¤¯ कारणं ददातà¥, अपि च आकलितं ददातॠयतॠतनà¥à¤¤à¥à¤°à¤£à¤‚ कदा उदà¥à¤˜à¤¾à¤Ÿà¥à¤¯à¤¿à¤·à¥à¤¯à¤¤à¥‡à¥¤',
@@ -655,7 +641,6 @@ $1',
'viewyourtext' => "भवानॠअसà¥à¤¯ पृषà¥à¤ à¤¸à¥à¤¯ सà¥à¤°à¥‹à¤¤à¤¸à¤¿ '''भवतः समà¥à¤ªà¤¾à¤¦à¤¨à¤¾à¤¨à¤¿''' दà¥à¤°à¤·à¥à¤Ÿà¥à¤‚ पà¥à¤°à¤¤à¤¿à¤²à¤¿à¤ªà¤¿à¤‚ करà¥à¤¤à¥à¤‚ च अरà¥à¤¹à¤¤à¤¿ ।",
'protectedinterface' => 'इदं पृषà¥à¤ à¤‚ तंतà¥à¤°à¤¾à¤‚शाय अनà¥à¤¤à¤°à¤¾à¤«à¤²à¤•à¤‚ ददाति, तथा च दà¥à¤°à¥à¤ªà¤¯à¥‹à¤—ातॠवारणाय सà¥à¤°à¤•à¥à¤·à¤¿à¤¤à¤®à¤¸à¥à¤¤à¤¿ ।',
'editinginterface' => "'''अवधीयतामà¥''' तनà¥à¤¤à¥à¤°à¤¾à¤‚शसà¥à¤¯ विनà¥à¤¯à¤¾à¤¸à¤‚ यतॠपृषà¥à¤ à¤‚ रचयति तदॠभवानॠअधà¥à¤¨à¤¾ समà¥à¤ªà¤¾à¤¦à¤¯à¤¤à¤¿ । अतà¥à¤° कृतानि परिवरà¥à¤¤à¤¨à¤¾à¤¨à¤¿ अनà¥à¤¯à¥‡à¤·à¤¾à¤®à¥ उपयोकà¥à¤¤à¥„णां पृषà¥à¤ à¤µà¤¿à¤¨à¥à¤¯à¤¾à¤¸à¤®à¤ªà¤¿ परिवरà¥à¤¤à¤¯à¤¨à¥à¤¤à¤¿ । अनà¥à¤µà¤¾à¤¦à¤¾à¤°à¥à¤¥à¤®à¥ [//translatewiki.net/wiki/Main_Page?setlang=sa translatewiki.net] सà¥à¤¥à¤¾à¤¨à¥€à¤¯à¤¤à¤¾à¤¨à¤¯à¤¨à¤ªà¤°à¤¿à¤¯à¥‹à¤œà¤¨à¤¾à¤¯à¤¾à¤ƒ उपयोगः कà¥à¤°à¤¿à¤¯à¤¤à¤¾à¤®à¥ ।",
-'sqlhidden' => '(निगूढा à¤à¤¸à¤•à¥à¤¯à¥‚à¤à¤²à¥- पृचà¥à¤›à¤¾)',
'cascadeprotected' => 'इदं पृषà¥à¤ à¤‚ संपादनातॠसà¥à¤°à¤•à¥à¤·à¤¿à¤¤à¤®à¤¸à¥à¤¤à¤¿, यतः इदं अधोलिखितानां {{PLURAL:$1| पृषà¥à¤ à¤¸à¥à¤¯|पृषà¥à¤ à¤¾à¤£à¤¾à¤‚}} सà¥à¤°à¤•à¥à¤·à¤¾-सोपाने समाहितं वरà¥à¤¤à¤¤à¥‡à¥¤
$2',
'namespaceprotected' => 'भवानॠ"$1" इति नामाकाशे विदà¥à¤¯à¤®à¤¾à¤¨à¤¾à¤¨à¥ पृषà¥à¤ à¤¾à¤¨à¥ परिवरà¥à¤¤à¤¿à¤¤à¥à¤‚ अनà¥à¤®à¤¤à¤¿à¤‚ न धारयति।',
@@ -684,10 +669,15 @@ $2',
'welcomecreation-msg' => 'भवतः लेखा रचिताऽसà¥à¤¤à¤¿à¥¤
सà¥à¤µà¤•à¥€à¤¯à¤¾à¤¨à¤¾à¤‚ [[Special:Preferences|{{SITENAME}} इषà¥à¤Ÿà¤¤à¤®à¤¾à¤¨à¤¾à¤‚]]. निगदनं मा विसà¥à¤®à¤°à¥à¤¯à¤¤à¤¾à¤®à¥à¥¤',
'yourname' => 'योजकनामनà¥:',
+'userlogin-yourname' => 'पà¥à¤°à¤¯à¥‹à¤•à¥à¤¤à¥à¤ƒ नाम',
+'userlogin-yourname-ph' => 'सà¥à¤µà¤•à¥€à¤¯à¤‚ पà¥à¤°à¤¯à¥‹à¤•à¥à¤¤à¥ƒà¤¨à¤¾à¤® दीयतामà¥',
'yourpassword' => 'कूटशबà¥à¤¦à¤ƒ',
+'userlogin-yourpassword-ph' => 'सà¥à¤µà¤•à¥€à¤¯à¤‚ कूटशबà¥à¤¦à¤‚ दीयतामà¥',
+'createacct-yourpassword-ph' => 'कूटशबà¥à¤¦à¤ƒ पà¥à¤°à¤µà¤¿à¤¶à¥à¤¯à¤¤à¤¾à¤®à¥',
'yourpasswordagain' => 'कूटशबà¥à¤¦à¤ƒ पà¥à¤¨à¤ƒ लिखà¥à¤¯à¤¤à¤¾à¤®à¥ ।',
+'createacct-yourpasswordagain-ph' => 'कूटशबà¥à¤¦à¤ƒ पà¥à¤¨à¤ƒ पà¥à¤°à¤µà¤¿à¤¶à¥à¤¯à¤¤à¤¾à¤®à¥',
'remembermypassword' => 'असà¥à¤®à¤¿à¤¨à¥ सङà¥à¤—णके मम पà¥à¤°à¤µà¥‡à¤¶à¤ƒ सà¥à¤®à¤°à¥à¤¯à¤¤à¤¾à¤®à¥ (अधिकतममॠ$1 {{PLURAL:$1|दिनमà¥|दिनानि}})',
-'securelogin-stick-https' => 'पà¥à¤°à¤µà¥‡à¤¶à¥‹à¤ªà¤°à¤¾à¤¨à¥à¤¤à¤‚ à¤à¤šà¤Ÿà¥€à¤Ÿà¥€à¤ªà¥€à¤à¤¸(HTTPS) इतà¥à¤¯à¤¨à¥‡à¤¨ सह संबदà¥à¤§à¤ƒ तिषà¥à¤ à¤¤à¥à¥¤',
+'userlogin-remembermypassword' => 'अहं पà¥à¤°à¤µà¤¿à¤·à¥à¤Ÿà¤®à¥‡à¤µ तिषà¥à¤ à¥‡à¤¯à¤®à¥',
'yourdomainname' => 'भवतः पà¥à¤°à¤•à¥à¤·à¥‡à¤¤à¥à¤°à¤®à¥:',
'password-change-forbidden' => 'असà¥à¤¯à¤¾à¤‚ विकà¥à¤¯à¤¾à¤‚ निकà¥à¤žà¥à¤šà¤‚ परिवरà¥à¤¤à¤¯à¤¿à¤¤à¥à¤‚ न शकà¥à¤¨à¥‹à¤¤à¤¿ ।',
'externaldberror' => 'ततà¥à¤° पà¥à¤°à¤®à¤¾à¤£à¥€à¤•à¤°à¤£ समंकाधारे तà¥à¤°à¥à¤Ÿà¤¿à¤°à¥à¤œà¤¾à¤¤à¤¾, अथवा भवानॠसà¥à¤µà¤•à¥€à¤¯à¤¾à¤‚ बाहà¥à¤¯-लेखां अदà¥à¤¯à¤¤à¤¨à¥€à¤•à¤°à¥à¤¤à¥à¤‚ अनà¥à¤®à¤¤à¤¿à¤‚ न धारयति।',
@@ -699,14 +689,19 @@ $2',
'logout' => 'निरà¥à¤—मनमà¥',
'userlogout' => 'निरà¥à¤—मनमà¥',
'notloggedin' => 'नैव पà¥à¤°à¤µà¤¿à¤·à¥à¤Ÿà¤ƒ',
+'userlogin-noaccount' => 'सदसà¥à¤¯à¤¤à¤¾ नासà¥à¤¤à¤¿ किमà¥?',
'nologin' => 'पूरà¥à¤µà¤®à¥‡à¤µ योजकः नासà¥à¤¤à¤¿ किमॠ? $1।',
'nologinlink' => 'सदसà¥à¤¯à¤¤à¤¾ पà¥à¤°à¤¾à¤ªà¥à¤¯à¤¤à¤¾à¤®à¥',
'createaccount' => 'सदसà¥à¤¯à¤¤à¤¾ पà¥à¤°à¤¾à¤ªà¥à¤¯à¤¤à¤¾à¤®à¥',
'gotaccount' => 'पूरà¥à¤µà¤®à¥‡à¤µ योजकः असà¥à¤¤à¤¿ किमॠ? $1।',
'gotaccountlink' => 'पà¥à¤°à¤µà¤¿à¤¶à¥à¤¯à¤¤à¤¾à¤®à¥',
'userlogin-resetlink' => 'पà¥à¤°à¤µà¥‡à¤¶à¤µà¤¿à¤µà¤°à¤£à¤¾à¤¨à¤¿ विसà¥à¤®à¥ƒà¤¤à¤¾à¤¨à¤¿ किमॠ?',
+'userlogin-helplink' => '[[{{MediaWiki:helplogin-url}}|पà¥à¤°à¤µà¥‡à¤¶à¤¨à¤¾à¤°à¥à¤¥à¤‚ सहायता]]',
+'createacct-join' => 'सà¥à¤µà¤•à¥€à¤¯à¤¾ सूचना अधसà¥à¤¤à¤¾à¤¤à¥ पà¥à¤°à¤µà¥‡à¤¶à¥à¤¯à¤¤à¤¾à¤®à¥à¥¤',
'createaccountmail' => 'ईपतà¥à¤°à¤¦à¥à¤µà¤¾à¤°à¤¾',
'createaccountreason' => 'कारणमà¥',
+'createacct-reason' => 'कारणमà¥',
+'createacct-reason-ph' => 'भवानॠअनà¥à¤¯à¤¾à¤‚ लेखां किमरà¥à¤¥à¤‚ रचितà¥à¤®à¤¿à¤šà¥à¤›à¤¸à¤¿?',
'badretype' => 'भवता पà¥à¤°à¤¦à¤¤à¥à¤¤à¥‡ कूटशबà¥à¤¦à¥‡ न खलॠसमाने सà¥à¤¤à¤ƒà¥¤ कृपया पà¥à¤¨à¤ƒ लिखतà¥à¥¤',
'userexists' => 'भवतः पà¥à¤°à¤¦à¤¤à¥à¤¤à¤ƒ पà¥à¤°à¤¯à¥‹à¤•à¥à¤¤à¥ƒà¤¨à¤¾à¤® अनà¥à¤¯à¥‡à¤¨ पà¥à¤°à¤¯à¥à¤œà¥à¤¯à¤®à¤¾à¤¨à¤®à¥ असà¥à¤¤à¤¿à¥¤ कृपया अनà¥à¤¯à¤¦à¥‡à¤•à¤‚ पà¥à¤°à¤¯à¥‹à¤•à¥à¤¤à¥ƒà¤¨à¤¾à¤® चिनोतà¥à¥¤',
'loginerror' => 'पà¥à¤°à¤µà¥‡à¤¶à¤¨à¥‡ पà¥à¤°à¤®à¤¾à¤¦à¤ƒ',
@@ -798,7 +793,7 @@ You may ignore this message, if this account was created in error.',
'newpassword' => 'नूतनः कूटशबà¥à¤¦à¤ƒ',
'retypenew' => 'नूतनः कूटशबà¥à¤¦à¤ƒ पà¥à¤¨à¤ƒ लिखà¥à¤¯à¤¤à¤¾à¤®à¥:',
'resetpass_submit' => 'कूटशबà¥à¤¦à¤ƒ योजà¥à¤¯à¤¤à¤¾à¤‚ पà¥à¤°à¤µà¤¿à¤¶à¥à¤¯à¤¤à¤¾à¤‚ च',
-'resetpass_success' => 'भवतः कूटशबà¥à¤¦à¤ƒ सफलतया परिवरà¥à¤¤à¤¿à¤¤à¤ƒ!
+'changepassword-success' => 'भवतः कूटशबà¥à¤¦à¤ƒ सफलतया परिवरà¥à¤¤à¤¿à¤¤à¤ƒ!
अधà¥à¤¨à¤¾ भवानॠपà¥à¤°à¤µà¥‡à¤¶à¥à¤¯à¤¤à¥‡ ...',
'resetpass_forbidden' => 'कूटशबà¥à¤¦à¤¾à¤ƒ परिवरà¥à¤¤à¤¯à¤¿à¤¤à¥à¤‚ न शकà¥à¤¯à¤¨à¥à¤¤à¥‡',
'resetpass-no-info' => 'भवता à¤à¤¤à¤¤à¥à¤ªà¥ƒà¤·à¥à¤ à¤‚ पà¥à¤°à¤¤à¥à¤¯à¤•à¥à¤·à¤¤à¤¯à¤¾ समà¥à¤ªà¥à¤°à¤¾à¤ªà¥à¤¤à¥à¤‚ पà¥à¤°à¤µà¥‡à¤¶à¤ƒ अवशà¥à¤¯à¤®à¥‡à¤µ करà¥à¤¤à¥à¤¤à¤µà¥à¤¯à¤ƒà¥¤',
@@ -810,10 +805,8 @@ You may ignore this message, if this account was created in error.',
# Special:PasswordReset
'passwordreset' => 'कूटशबà¥à¤¦ पà¥à¤¨à¤ƒà¤¸à¥à¤¥à¤¾à¤ªà¤¨à¤®à¥',
-'passwordreset-text' => 'भवतः सदसà¥à¤¯à¤¤à¤¾à¤µà¤¿à¤µà¤°à¤£à¤¾à¤¨à¤¿ ईपतà¥à¤°à¤¦à¥à¤µà¤¾à¤°à¤¾ पà¥à¤°à¤¾à¤ªà¥à¤¤à¥à¤®à¥ इदं पà¥à¤°à¤ªà¤¤à¥à¤°à¤‚ पूरà¥à¤¯à¤¤à¤¾à¤®à¥ ।',
'passwordreset-legend' => 'कूटशबà¥à¤¦ पà¥à¤¨à¤ƒà¤¸à¥à¤¥à¤¾à¤ªà¤¨à¤®à¥',
'passwordreset-disabled' => 'असà¥à¤®à¤¿à¤¨à¥ विकà¥à¤¯à¤¾à¤‚ कूटशबà¥à¤¦ पà¥à¤¨à¤ƒà¤¸à¥à¤¥à¤¾à¤ªà¤¨à¤‚ असमरà¥à¤¥à¥€à¤•à¥ƒà¤¤à¤®à¤¸à¥à¤¤à¤¿à¥¤',
-'passwordreset-pretext' => '{{PLURAL:$1| |समंकेषॠà¤à¤•à¤®à¥ अधसà¥à¤¯à¤¾à¤¤à¥ पà¥à¤°à¤µà¤¿à¤·à¥à¤Ÿà¥€à¤•à¤°à¥‹à¤¤à¥à¥¤}}',
'passwordreset-username' => 'योजकनामनà¥:',
'passwordreset-domain' => 'कà¥à¤·à¥‡à¤¤à¥à¤°à¤®à¥:',
'passwordreset-capture' => 'फलितरूपमॠईपतà¥à¤°à¤‚ किं दृशà¥à¤¯à¤¤à¥‡ ?',
@@ -1039,6 +1032,8 @@ $2
'defaultmessagetext' => 'सनà¥à¤¦à¥‡à¤¶à¤ªà¤¾à¤ à¤‚ सà¥à¤¥à¤¿à¤°à¤¯à¤¤à¥ ।',
'invalid-content-data' => 'अमानà¥à¤¯à¤ƒ सामगà¥à¤°à¥€à¤¦à¤¤à¥à¤¤à¤¾à¤‚शः',
'content-not-allowed-here' => '[[$2]] इति पृषà¥à¤ à¥‡ "$1" सामगà¥à¤°à¥€ अनà¥à¤®à¤¤à¤¾ नासà¥à¤¤à¤¿à¥¤',
+'editwarning-warning' => 'असà¥à¤®à¤¾à¤¤à¥ पृषà¥à¤ à¤¾à¤¤à¥ गमनेन अतà¥à¤° भवता कृतानि परिवरà¥à¤¤à¤¨à¤¾à¤¨à¤¿ निषà¥à¤«à¤²à¤¾à¤¨à¤¿ भवेयà¥à¤ƒ ।
+भवता यदि पà¥à¤°à¤µà¤¿à¤·à¥à¤Ÿà¤‚ तरà¥à¤¹à¤¿ मम इषà¥à¤Ÿà¤¤à¤®à¤¾à¤¨à¤¿ इतà¥à¤¯à¤¤à¥à¤° असà¥à¤®à¤¿à¤¨à¥ विभागे समà¥à¤ªà¤¾à¤¦à¤¨à¥‡à¤¨ à¤à¤·à¤ƒ पà¥à¤°à¤¬à¥‹à¤§à¤ƒ यथा न आगचà¥à¤›à¥‡à¤¤à¥ तथा करà¥à¤¤à¥à¤‚ शकà¥à¤¯à¤¤à¥‡ ।',
# Content models
'content-model-wikitext' => 'विकिपाठः',
@@ -1260,7 +1255,6 @@ You can still [$1 view this revision]",
'searchmenu-legend' => 'अनà¥à¤µà¥‡à¤·à¤£à¤¸à¥à¤¯ विकलà¥à¤ªà¤¾à¤ƒ ।',
'searchmenu-exists' => 'असà¥à¤®à¤¿à¤¨à¥ विकिमधà¥à¤¯à¥‡ "[[:$1]]"नामकं पृषà¥à¤ à¤‚ विदà¥à¤¯à¤¤à¥‡à¥¤',
'searchmenu-new' => "'''असà¥à¤¯à¤¾à¤‚ विकà¥à¤¯à¤¾à¤‚ \"[[:\$1]]\" इति पृषà¥à¤ à¤‚ सृजà¥à¤¯à¤¤à¤¾à¤®à¥!'''",
-'searchhelp-url' => 'Help: साहायà¥à¤¯à¤®à¥ : आधेयाः ।',
'searchmenu-prefix' => '[[Special:PrefixIndex/$1|à¤à¤¤à¤¦à¥à¤ªà¤¸à¤°à¥à¤—यà¥à¤•à¥à¤¤à¤ªà¥à¤Ÿà¤‚ पशà¥à¤¯à¤¤à¥ ]]',
'searchprofile-articles' => 'आनà¥à¤¤à¤°à¥à¤¯à¤®à¥',
'searchprofile-project' => 'सहायता पà¥à¤°à¤•à¤²à¥à¤ªà¤ªà¥ƒà¤·à¥à¤ à¤¾à¤¨à¤¿ च',
@@ -1306,15 +1300,6 @@ You can still [$1 view this revision]",
अशà¥à¤®à¤¿à¤¨à¥ समये भवानॠगूगल माधà¥à¤¯à¤®à¥‡à¤¨ अनà¥à¤µà¥‡à¤·à¤£à¤‚ करà¥à¤¤à¥à¤‚ शकà¥à¤¨à¥‹à¤¤à¤¿
सà¥à¤®à¤°à¤¯à¤¤à¥ यतॠ{{SITENAME}} इति सà¥à¤¥à¤²à¤¸à¥à¤¯ कà¥à¤°à¤®à¤¾à¤™à¥à¤•à¤¾ नैव अदà¥à¤¯à¤¾à¤¤à¤¨à¤¾ इति सोचà¥à¤¯à¤¤à¥‡à¥¤',
-# Quickbar
-'qbsettings' => 'शीघà¥à¤°à¤ªà¤Ÿ',
-'qbsettings-none' => 'नासà¥à¤¤à¤¿',
-'qbsettings-fixedleft' => 'बामे सà¥à¤¥à¤¾à¤ªà¤¿à¤¤à¤ƒ',
-'qbsettings-fixedright' => 'दकà¥à¤·à¤¿à¤£à¥‡ सà¥à¤¥à¤¾à¤ªà¤¿à¤¤à¤ƒ',
-'qbsettings-floatingleft' => 'वामपà¥à¤²à¤µà¤¨à¤®à¥ ।',
-'qbsettings-floatingright' => 'दकà¥à¤·à¤¿à¤£à¥‡ पà¥à¤²à¤µà¤¨à¤®à¥ ।',
-'qbsettings-directionality' => 'निशà¥à¤šà¤¿à¤¤à¤®à¥ । ते भाषालिपà¥à¤¯à¤¾à¤ƒ दिशातà¥à¤®à¤•à¤¤à¤¾à¤¨à¥à¤¸à¤¾à¤°à¤‚ भवति ।',
-
# Preferences page
'preferences' => 'इषà¥à¤Ÿà¤¤à¤®à¤¾à¤¨à¤¿',
'mypreferences' => 'मम इषà¥à¤Ÿà¤¤à¤®à¤¾à¤¨à¤¿',
@@ -1347,7 +1332,6 @@ You can still [$1 view this revision]",
'resetprefs' => 'असंरकà¥à¤·à¤¿à¤¤à¤¾à¤¨à¤¿ परिवरà¥à¤¤à¤¨à¤¾à¤¨à¤¿ विलà¥à¤ªà¥à¤¯à¤¨à¥à¤¤à¤¾à¤®à¥',
'restoreprefs' => 'समगà¥à¤°à¤¾à¤ƒ वà¥à¤¯à¤µà¤¸à¥à¤¥à¤¾à¤¦à¤¯ वà¥à¤¯à¤µà¤¸à¥à¤¥à¤¾à¤¨à¥à¤¸à¤¾à¤°à¤‚ पà¥à¤¨à¤ƒ संरकà¥à¤·à¥à¤¯à¤¤à¤¾à¤®à¥',
'prefs-editing' => 'समà¥à¤ªà¤¾à¤¦à¤¨à¤®à¥',
-'prefs-edit-boxsize' => 'समà¥à¤ªà¤¾à¤¦à¤¨à¤•à¥‹à¤·à¥à¤ à¤¸à¥à¤¯ आकारः ।',
'rows' => 'पंकà¥à¤¤à¤¿',
'columns' => 'अध: पंकà¥à¤¤à¥à¤¯à¤¾à¤ƒ',
'searchresultshead' => 'अनà¥à¤µà¥‡à¤·à¤£à¤®à¥',
@@ -1358,7 +1342,6 @@ You can still [$1 view this revision]",
'recentchangesdays-max' => 'अधिकतम $1 {{PLURAL:$1|दिवसः|दिवसानि}}',
'recentchangescount' => 'समà¥à¤ªà¤¾à¤¦à¤¨ संखà¥à¤¯à¤•à¤¾à¤¨à¤¿ वà¥à¤¯à¤µà¤¸à¥à¤¥à¤¾à¤¨à¥à¤¸à¤¾à¤°à¥‡à¤£ दृशà¥à¤¯à¤¤à¥:',
'prefs-help-recentchangescount' => 'अतà¥à¤° सदà¥à¤¯à¤ƒ परिवरà¥à¤¤à¤¨à¤¾à¤¨à¤¿, पà¥à¤Ÿà¥‡à¤¤à¤¿à¤¹à¤¾à¤¸à¤¾à¤ƒ, पà¥à¤°à¤µà¥‡à¤¶à¤¾à¤ƒ च अनà¥à¤¤à¤°à¥à¤—ताः ।',
-'prefs-help-watchlist-token' => 'अतà¥à¤° रहसà¥à¤¯à¤•à¥à¤žà¥à¤šà¤¿à¤•à¤¯à¤¾ पूरणेन भवतः नीरीकà¥à¤·à¤¾à¤µà¤²à¥à¤¯à¤¾à¤‚ RSS पूरितं भवति । रहसà¥à¤¯à¤•à¥à¤žà¥à¤šà¤¿à¤•à¤¾à¤‚ यः जानाति तेन भवतः निरीकà¥à¤·à¤¾à¤µà¤²à¥€ दृषà¥à¤Ÿà¥à¤‚ शकà¥à¤¯à¤¤à¥‡ । अतः कृपया सà¥à¤°à¤•à¥à¤·à¤®à¥Œà¤²à¥à¤¯à¤‚ चिनोतॠ। अतà¥à¤° यादृचà¥à¤›à¤¯à¤¾ निरà¥à¤®à¤¿à¤¤à¤‚ मौलà¥à¤¯à¤‚ भवानॠ$1 दà¥à¤µà¤¾à¤°à¤¾ पशà¥à¤¯à¤¤à¤¿ ।',
'savedprefs' => 'आदà¥à¤¯à¤¤à¤¾à¤ƒ संरकà¥à¤·à¤¿à¤¤à¤¾à¤ƒ ।',
'timezonelegend' => 'समय मणà¥à¤¡à¤²:',
'localtime' => 'सà¥à¤¥à¤¾à¤¨à¥€à¤¯ समय:',
@@ -1388,7 +1371,6 @@ You can still [$1 view this revision]",
'prefs-common-css-js' => 'सरà¥à¤µà¤¾à¤µà¤°à¤£à¤¾à¤¨à¤¾à¤‚ कृते विभकà¥à¤¤ सि.à¤à¤¸à¥.à¤à¤¸à¥./ जावालिपिः ।',
'prefs-reset-intro' => 'आदà¥à¤¯à¤¤à¤¾à¤¨à¤¾à¤‚ पà¥à¤¨à¤°à¥à¤¨à¤¿à¤¦à¥‡à¤¶à¤¾à¤°à¥à¤¥à¤®à¥ à¤à¤¤à¤¤à¥à¤ªà¥à¤Ÿà¤®à¥ उपयोकà¥à¤¤à¥à¤‚ शकोति । à¤à¤¤à¤¤à¥ अकृतं न भवति ।',
'prefs-emailconfirm-label' => 'विदà¥à¤¯à¥à¤¨à¥à¤®à¤¾à¤¨à¤¸à¤™à¥à¤•à¥‡à¤¤à¤¸à¥à¤¯ दृढीकरणमॠ।',
-'prefs-textboxsize' => 'समà¥à¤ªà¤¾à¤¦à¤¨à¤•à¥‹à¤·à¥à¤ à¤¸à¥à¤¯ आकारः ।',
'youremail' => 'ईपतà¥à¤°à¤¸à¤™à¥à¤•à¥‡à¤¤à¤ƒ',
'username' => 'योजकनामनà¥:',
'uid' => 'पà¥à¤°à¤¯à¥‹à¤•à¥à¤¤à¥ƒ-कà¥à¤°à¤®à¤¾à¤‚कः :',
@@ -1629,7 +1611,6 @@ You can still [$1 view this revision]",
'recentchangeslinked-feed' => 'पृषà¥à¤ -समà¥à¤¬à¤¨à¥à¤§à¤¿à¤¤à¤¾à¤¨à¤¿ परिवरà¥à¤¤à¤¨à¤¾à¤¨à¤¿',
'recentchangeslinked-toolbox' => 'पृषà¥à¤ à¤¸à¤®à¥à¤¬à¤¦à¥à¤§à¤¾à¤¨à¤¿ परिवरà¥à¤¤à¤¨à¤¾à¤¨à¤¿',
'recentchangeslinked-title' => '"$1" इतà¥à¤¯à¤¸à¥à¤®à¤¿à¤¨à¥ जातानि परिवरà¥à¤¤à¤¨à¤¾à¤¨à¤¿',
-'recentchangeslinked-noresult' => 'निरà¥à¤¦à¤¿à¤·à¥à¤Ÿà¥‡ अवधौ समà¥à¤¬à¤¦à¥à¤§à¥‡ पृषà¥à¤ à¥‡ कोपि परिवरà¥à¤¤à¤¨à¤‚ न जातमॠ।',
'recentchangeslinked-summary' => "à¤à¤·à¤¾ विशेषपृषà¥à¤ à¤¸à¤®à¥à¤¬à¤¦à¥à¤§à¥‡à¤·à¥ पॄषà¥à¤ à¥‡à¤·à¥ अथवा वरà¥à¤—विशेषे अनà¥à¤¤à¤°à¥à¤­à¥‚तेषॠपृषà¥à¤ à¥‡à¤·à¥ सदà¥à¤¯à¥‹à¤œà¤¾à¤¤à¤¾à¤¨à¤¾à¤‚ परिवरà¥à¤¤à¤¨à¤¾à¤¨à¤¾à¤®à¥ आवलिः।
[[Special:Watchlist|भवतः अवेकà¥à¤·à¤£à¤¸à¥‚चà¥à¤¯à¤¾à¤‚]] विदà¥à¤¯à¤®à¤¾à¤¨à¤¾à¤¨à¤¿ पृषà¥à¤ à¤¾à¤¨à¤¿ '''सà¥à¤¥à¥‚लाकà¥à¤·à¤°à¥ˆà¤ƒ''' दरà¥à¤¶à¤¿à¤¤à¤¾à¤¨à¤¿à¥¤",
@@ -1856,7 +1837,6 @@ See https://www.mediawiki.org/wiki/Manual:Image_Authorization.',
'http-read-error' => 'HTTP पठनदोषः।',
'http-timed-out' => 'HTTP अभà¥à¤¯à¤°à¥à¤¥à¤¨à¤‚ कालातीतमॠ।',
'http-curl-error' => 'दोषाहरणसà¥à¤¯ URL: $1',
-'http-host-unreachable' => 'URL पà¥à¤°à¤¾à¤ªà¥à¤¤à¥à¤‚ न शकà¥à¤¯à¤¤à¥‡ ।',
'http-bad-status' => 'HTTP : $1 $2अभà¥à¤¯à¤°à¥à¤¥à¤¨à¥‡ समसà¥à¤¯à¤¾ आसीतॠ।',
# Some likely curl errors. More could be added from <http://curl.haxx.se/libcurl/c/libcurl-errors.html>
@@ -2009,12 +1989,6 @@ See https://www.mediawiki.org/wiki/Manual:Image_Authorization.',
'statistics-users-active-desc' => 'गतेषॠ{{PLURAL:$1|day|$1 दिनेषà¥}} सकà¥à¤°à¤¿à¤¯à¤¾à¤ƒ योजकाः ।',
'statistics-mostpopular' => 'अतà¥à¤¯à¤µà¤²à¥‹à¤•à¤¿à¤¤à¤ªà¥à¤Ÿà¤¾à¤¨à¤¿ ।',
-'disambiguations' => 'दà¥à¤µà¥ˆà¤§à¥€à¤­à¤¾à¤µà¤°à¤¹à¤¿à¤¤à¤ªà¥à¤Ÿà¤¾à¤¨à¤¾à¤®à¥ अनà¥à¤¬à¤¨à¥à¤§à¤¿à¤¤à¤ªà¥à¤Ÿà¤¾à¤¨à¤¿ ।',
-'disambiguationspage' => 'Template:असनà¥à¤¦à¤¿à¤—à¥à¤§à¤®à¥',
-'disambiguations-text' => 'अधो निदेशितपà¥à¤Ÿà¤¾à¤¨à¤¿ असनà¥à¤§à¤¿à¤—à¥à¤§à¤ªà¥à¤Ÿà¥‡à¤¨ अनà¥à¤¬à¤¨à¥à¤§à¤¿à¤¤à¤¾à¤¨à¤¿ ।
-à¤à¤¤à¤¾à¤¨à¤¿ यथारà¥à¤¥à¤µà¤¿à¤·à¥ˆà¤ƒ योजनीयानि । <br />
-यदि कोऽपि पà¥à¤Ÿà¥‡à¤¨ पà¥à¤°à¤•à¥ƒà¤¤à¤¿à¤‚ पà¥à¤°à¤¯à¥‹à¤œà¤¯à¤¤à¤¿ यः [[MediaWiki:Disambiguationspage]] इतà¥à¤¯à¤¨à¥‡à¤¨ अनà¥à¤¬à¤¦à¥à¤§à¤ƒ ससनà¥à¤¦à¤¿à¤—à¥à¤§à¤ªà¥à¤Ÿà¤®à¥ इति उचà¥à¤¯à¤¤à¥‡ ।',
-
'pageswithprop' => 'पà¥à¤°à¤—à¥à¤£à¤µà¤¿à¤¶à¥‡à¤·à¤¯à¥à¤¤à¤¾à¤¨à¤¿ पृषà¥à¤ à¤¾à¤¨à¤¿',
'pageswithprop-legend' => 'पà¥à¤°à¤—à¥à¤£à¤µà¤¿à¤¶à¥‡à¤·à¤¯à¥à¤¤à¤¾à¤¨à¤¿ पृषà¥à¤ à¤¾à¤¨à¤¿',
@@ -2264,10 +2238,9 @@ See https://www.mediawiki.org/wiki/Manual:Image_Authorization.',
'unwatchthispage' => 'अवलोकनेन अलमॠ।',
'notanarticle' => 'न आधेयं पà¥à¤Ÿà¤®à¥ ।',
'notvisiblerev' => 'अनà¥à¤¯à¤¯à¥‹à¤œà¤•à¥‡à¤¨ कृतमॠअवतरणमॠअपमरà¥à¤œà¤¿à¤¤à¤®à¥ ।',
-'watchnochange' => 'दरà¥à¤¶à¤¿à¤¤à¤¾à¤µà¤§à¥Œ अवलोकितपदारà¥à¤¥à¤¾à¤ƒ न समà¥à¤ªà¤¾à¤¦à¤¿à¤¤à¤¾à¤ƒ ।',
'watchlist-details' => '{{PLURAL:$1|$1 पृषà¥à¤ à¤‚|$1 पृषà¥à¤ à¤¾à¤¨à¤¿}} भवतः अवेकà¥à¤·à¤£à¤¸à¥‚चà¥à¤¯à¤¾à¤‚ सनà¥à¤¤à¤¿, समà¥à¤­à¤¾à¤·à¤£à¤ªà¥ƒà¤·à¥à¤ à¤¾à¤¨à¤¿ नातà¥à¤° गणितानि।',
-'wlheader-enotif' => '* विदà¥à¤¯à¥à¤¨à¥à¤®à¤¾à¤¨à¤ªà¤¤à¥à¤°à¤¸à¥à¤¯ सूचनाः सकà¥à¤°à¤¿à¤¯à¤¾à¤ƒ ।',
-'wlheader-showupdated' => '* भवतः सनà¥à¤¦à¤°à¥à¤¶à¤¨à¤¸à¥à¤¯ पशà¥à¤šà¤¾à¤¤à¥ परिवरà¥à¤¤à¤¿à¤¤à¤¾à¤¨à¤¿ पà¥à¤Ÿà¤¾à¤¨à¤¿ सà¥à¤¥à¥‚लाकà¥à¤·à¤°à¥ˆà¤ƒ निरà¥à¤¦à¤¿à¤·à¥à¤Ÿà¤¾à¤¨à¤¿ ।',
+'wlheader-enotif' => 'विदà¥à¤¯à¥à¤¨à¥à¤®à¤¾à¤¨à¤ªà¤¤à¥à¤°à¤¸à¥à¤¯ सूचनाः सकà¥à¤°à¤¿à¤¯à¤¾à¤ƒ ।',
+'wlheader-showupdated' => 'भवतः सनà¥à¤¦à¤°à¥à¤¶à¤¨à¤¸à¥à¤¯ पशà¥à¤šà¤¾à¤¤à¥ परिवरà¥à¤¤à¤¿à¤¤à¤¾à¤¨à¤¿ पà¥à¤Ÿà¤¾à¤¨à¤¿ सà¥à¤¥à¥‚लाकà¥à¤·à¤°à¥ˆà¤ƒ निरà¥à¤¦à¤¿à¤·à¥à¤Ÿà¤¾à¤¨à¤¿ ।',
'watchmethod-recent' => 'अवलोकितपà¥à¤Ÿà¤¾à¤¨à¤¾à¤‚ सदà¥à¤¯à¤ƒ समà¥à¤ªà¤¾à¤¦à¤¨à¤¸à¥à¤¯ परीकà¥à¤·à¤£à¤®à¥ ।',
'watchmethod-list' => 'सदà¥à¤¯à¤ƒ समà¥à¤ªà¤¾à¤¦à¤¨à¤¾à¤°à¥à¤¥à¤®à¥ अवलोकितपà¥à¤Ÿà¤¾à¤¨à¤¾à¤‚ परीकà¥à¤·à¤£à¤®à¥ ।',
'watchlistcontains' => 'भवतः अवलोकनावली $1 यà¥à¤•à¥à¤¤à¤¾à¤¸à¥à¤¤à¤¿ ।{{PLURAL:$1|page|pages}}.',
@@ -2666,12 +2639,9 @@ $1 इतà¥à¤¯à¤¸à¥à¤¯ अवरोधसà¥à¤¯ कारणं तॠ"$2" à¤
$2 इति पà¥à¤°à¤•à¤¾à¤°à¤¸à¥à¤¯ अवरोधं करà¥à¤¤à¥à¤‚ शकà¥à¤¯à¤¤à¥‡ यतॠअनवरोधमिचà¥à¤›à¤¤à¤¿ ।',
'ip_range_invalid' => 'अमानà¥à¤¯à¤ƒ à¤à¤ªà¤¿à¤ªà¥à¤°à¤•à¤¾à¤°à¤ƒ',
'ip_range_toolarge' => '/$1 तः अधिकं वृहतà¥à¤ªà¥à¤°à¤•à¤¾à¤°à¤•à¤ƒ अवरोधः नानà¥à¤®à¤¤à¤ƒ ।',
-'blockme' => 'मामॠअवरà¥à¤£à¤¦à¥à¤§à¥ ।',
'proxyblocker' => 'पà¥à¤°à¤¤à¤¿à¤¹à¤¸à¥à¤¤à¤•à¤ƒ अवरोधकः ।',
-'proxyblocker-disabled' => 'अयं कारà¥à¤¯à¤•à¤²à¤¾à¤ªà¤ƒ निषà¥à¤•à¥à¤°à¤¿à¤¯à¤ƒ ।',
'proxyblockreason' => 'भवतः à¤à¤ªà¤¿ सङà¥à¤•à¥‡à¤¤à¤ƒ अवरà¥à¤¦à¥à¤§à¤ƒ यतः अयं कशà¥à¤šà¤¨ मà¥à¤•à¥à¤¤à¤ªà¥à¤°à¤¤à¤¿à¤¹à¤¸à¥à¤¤à¤•à¤ƒ ।
अनà¥à¤¤à¤°à¥à¤œà¤¾à¤²à¤¸à¥‡à¤µà¤¾à¤¦à¤¾à¤¯à¤•à¤‚ समà¥à¤ªà¤°à¥à¤•à¤¯à¤¤à¥ गभीरायाः सà¥à¤°à¤•à¥à¤·à¤¾à¤¸à¤®à¤¸à¥à¤¯à¤¾à¤¯à¤¾à¤ƒ विषये सूचयतॠच',
-'proxyblocksuccess' => 'समापित ।',
'sorbsreason' => 'DNSBL उपयोगः {{SITENAME}} कृतसà¥à¤¯ भवतः à¤à¤ªà¤¿à¤¸à¤™à¥à¤•à¥‡à¤¤à¤ƒ मà¥à¤•à¥à¤¤à¤ªà¥à¤°à¤¤à¤¿à¤¹à¤¸à¥à¤¤à¤•à¤ƒ इति आवलीगतः',
'sorbs_create_account_reason' => 'DNSBL उपयà¥à¤•à¥à¤¤à¤ƒ {{SITENAME}} अतः भवतः à¤à¤ªà¤¿à¤¸à¤™à¥à¤•à¥‡à¤¤à¤ƒ अवरà¥à¤¦à¥à¤§à¤ƒ यतः अयं मà¥à¤•à¥à¤¤à¤ªà¥à¤°à¤¤à¤¿à¤¹à¤¸à¥à¤¤à¤•à¤ƒ इति आवलीगतः । अतः भवानॠयोजकसà¥à¤¥à¤¾à¤¨à¤‚ निरà¥à¤®à¤¾à¤¤à¥à¤‚ न शकà¥à¤¨à¥‹à¤¤à¤¿ ।',
'cant-block-while-blocked' => 'अनà¥à¤¯à¤¯à¥‹à¤œà¤•à¤¾à¤¨à¥ अवरोदà¥à¤§à¥à¤‚ भवानॠनैव शकà¥à¤¨à¥‹à¤¤à¤¿ यतः भवानॠअवरà¥à¤¦à¥à¤§à¤ƒ ।',
@@ -3050,12 +3020,8 @@ $2 इति पà¥à¤°à¤•à¤¾à¤°à¤¸à¥à¤¯ अवरोधं करà¥à¤¤à¥à¤‚ à
'pageinfo-category-files' => 'सञà¥à¤šà¤¿à¤•à¤¾à¤¨à¤¾à¤‚ सङà¥à¤–à¥à¤¯à¤¾',
# Skin names
-'skinname-standard' => 'पूरà¥à¤µ',
-'skinname-nostalgia' => 'पà¥à¤°à¤¾à¤£',
'skinname-cologneblue' => 'नील',
'skinname-monobook' => 'पà¥à¤¸à¥à¤¤à¤•',
-'skinname-myskin' => 'मे चरà¥à¤®à¤¨à¥',
-'skinname-chick' => 'Chick',
# Patrolling
'markaspatrolleddiff' => 'आरकà¥à¤·à¤¿à¤¤à¤®à¤¿à¤¤à¤¿ अङà¥à¤•à¤¯à¤¤à¥ ।',
@@ -3164,7 +3130,7 @@ $2 इति पà¥à¤°à¤•à¤¾à¤°à¤¸à¥à¤¯ अवरोधं करà¥à¤¤à¥à¤‚ à
* gpslongitude
* gpsaltitude',
-# EXIF tags
+# Exif tags
'exif-imagewidth' => 'विसà¥à¤¤à¤¾à¤°à¤ƒ',
'exif-imagelength' => 'औनà¥à¤¨à¤¤à¥à¤¯à¤®à¥',
'exif-bitspersample' => 'पà¥à¤°à¤¤à¥à¤¯à¥‡à¤•à¤‚ भागसà¥à¤¯ अंशः ।',
@@ -3342,7 +3308,7 @@ $2 इति पà¥à¤°à¤•à¤¾à¤°à¤¸à¥à¤¯ अवरोधं करà¥à¤¤à¥à¤‚ à
'exif-originalimageheight' => 'करà¥à¤¤à¤¨à¤¾à¤¤à¥à¤ªà¥‚रव चितà¥à¤°à¤¸à¥à¤¯ औनà¥à¤¨à¤¤à¥à¤¯à¤®à¥ ।',
'exif-originalimagewidth' => 'करà¥à¤¤à¤¨à¤¾à¤¤à¥ पूरà¥à¤µà¤‚ चितà¥à¤°à¤¸à¥à¤¯ वà¥à¤¯à¤¾à¤¸à¤ƒ ।',
-# EXIF attributes
+# Exif attributes
'exif-compression-1' => 'असङà¥à¤•à¥‹à¤šà¤¿à¤¤à¤®à¥ ।',
'exif-compression-2' => 'CCITT समूहः 3 1- Dimensional Modified Huffman run length encoding',
'exif-compression-3' => 'CCITT समूह ३ फेकà¥à¤¸ सङà¥à¤•à¥‡à¤¤à¥€à¤•à¤°à¤£à¤®à¥ ।',
@@ -3726,7 +3692,6 @@ $5
'version-other' => 'अनà¥à¤¯à¤¤à¥',
'version-mediahandlers' => 'माधà¥à¤¯à¤¨à¤¿à¤°à¥à¤µà¤¾à¤¹à¤•à¤¾à¤ƒ ।',
'version-hooks' => 'आलमà¥à¤¬à¤¾à¤ƒ ।',
-'version-extension-functions' => 'विसà¥à¤¤à¤°à¤£à¤¸à¥à¤¯ कारà¥à¤¯à¤•à¤²à¤¾à¤ªà¤¾à¤ƒ ।',
'version-parser-extensiontags' => 'विनà¥à¤¯à¤¾à¤¸à¤µà¤¿à¤¸à¥à¤¤à¤¾à¤°à¤£à¤¸à¥à¤¯ सूतà¥à¤°à¤®à¥ ।',
'version-parser-function-hooks' => 'विनà¥à¤¯à¤¾à¤¸à¤•à¤²à¤¾à¤ªà¤¸à¥à¤¯ आलमà¥à¤¬à¤¾à¤ƒ ।',
'version-hook-name' => 'आलमà¥à¤¬à¤¸à¥à¤¯ नाम ।',
@@ -3748,13 +3713,6 @@ $5
'version-entrypoints-header-entrypoint' => 'पà¥à¤°à¤µà¥‡à¤¶à¤¬à¤¿à¤¨à¥à¤¦à¥à¤ƒ ।',
'version-entrypoints-header-url' => 'URL',
-# Special:FilePath
-'filepath' => 'सञà¥à¤šà¤¿à¤•à¤¾à¤ªà¤¥à¤ƒ ।',
-'filepath-page' => 'सञà¥à¤šà¤¿à¤•à¤¾:',
-'filepath-submit' => 'गमà¥à¤¯à¤¤à¤¾à¤®à¥',
-'filepath-summary' => 'à¤à¤¤à¤¦à¥à¤µà¤¿à¤¶à¥‡à¤·à¤ªà¥à¤Ÿà¤‚ सञà¥à¤šà¤¿à¤•à¤¾à¤¯à¤¾à¤ƒ पूरà¥à¤£à¤ªà¤¥à¤‚ पà¥à¤°à¤¦à¤°à¥à¤¶à¤¯à¤¤à¤¿ ।
-चितà¥à¤°à¤¾à¤£à¤¿ परिपूरà¥à¤£à¤¸à¤¤à¥à¤µà¤¯à¥à¤¤à¤¾à¤¨à¤¿ दरà¥à¤¶à¤¿à¤¤à¤¾à¤¨à¤¿ । अनà¥à¤¯à¤¸à¤žà¥à¤šà¤¿à¤•à¤¾à¤­à¥‡à¤¦à¤¾à¤ƒ समà¥à¤¬à¤¦à¥à¤§à¤•à¤¾à¤°à¥à¤¯à¤•à¤²à¤¾à¤ªà¥ˆà¤ƒ पà¥à¤°à¤¤à¥à¤¯à¤•à¥à¤·à¤‚ आरबà¥à¤§à¤¾à¤ƒ ।',
-
# Special:FileDuplicateSearch
'fileduplicatesearch' => 'पà¥à¤°à¤¤à¤¿à¤•à¥ƒà¤¤à¤¿à¤¸à¤žà¥à¤šà¤¿à¤•à¤¾à¤°à¥à¤¥à¤®à¥ अनà¥à¤µà¤¿à¤·à¤¤à¥ ।',
'fileduplicatesearch-summary' => 'समà¥à¤®à¤¿à¤¶à¥à¤°à¤®à¥Œà¤²à¥à¤¯à¤¾à¤®à¥‚लयà¥à¤¤à¤°à¥à¤¥à¤‚ पà¥à¤°à¤¤à¤¿à¤•à¥ƒà¤¤à¤¿à¤¸à¤žà¥à¤šà¤¿à¤•à¤¾à¤°à¥à¤¥à¤®à¥ अनà¥à¤µà¤¿à¤·à¤¤à¥ ।',
diff --git a/languages/messages/MessagesSah.php b/languages/messages/MessagesSah.php
index 5697cda0..ebc7d1c2 100644
--- a/languages/messages/MessagesSah.php
+++ b/languages/messages/MessagesSah.php
@@ -13,6 +13,7 @@
* @author HalanTul
* @author Kaganer
* @author Meno25
+ * @author Nemo bis
* @author Urhixidur
*/
@@ -73,9 +74,6 @@ $messages = array(
'tog-shownumberswatching' => 'СирÑйи кÑÑ‚ÑÑн көрөр дьон ахÑаанын көрдөр',
'tog-oldsig' => 'Баар илии баттааһын:',
'tog-fancysig' => 'БÑÐ¹Ñ Ð¸Ð»Ð¸Ð¸ баттааһына (ыйынньыга Ñуох)',
-'tog-externaleditor' => 'Ðтын ÑтиллибÑÑ‚ÑÒ•Ð¸Ð½Ñ Ñ‚Ð°Ñ ÑÑ€ÑдÑÑктÑри туһан (билÑÑ€ дьоҥҥо аналлаах, Ñиһилии [//www.mediawiki.org/wiki/Manual:External_editors манна] көр)',
-'tog-externaldiff' => 'Ðтын ÑтиллибÑÑ‚ÑÒ•Ð¸Ð½Ñ Ð±Ð°Ñ€Ñ‹Ð»Ð»Ð°Ñ€Ñ‹ Ñ‚Ñҥниир Ñ‚Ð°Ñ Ð¿Ñ€Ð¾Ð³Ñ€Ð°Ð¼Ð¼Ð°Ð½Ñ‹ туһан (билÑÑ€ дьоҥҥо аналлаах, Ñиһилии [//www.mediawiki.org/wiki/Manual:External_editors манна] көр)',
-'tog-showjumplinks' => '"Манна бар" ыйынньыктары көрдөр',
'tog-uselivepreview' => 'Хайдах буолуохтааҕын тутатына ÑÑ€Ð´Ñ ÐºÓ©Ñ€Ò¯Ò¯ (тургутуу быһыытынан)',
'tog-forceeditsummary' => 'Тугу уларыппытым туһунан Ñуруйбатахпына ÑÑÑ€ÑÑ‚',
'tog-watchlisthideown' => 'КÑÑ‚ÑÑн көрүү иÑпииһÑгÑÑ€ бÑйÑм уларытыыларбын көрдөрүмÑ',
@@ -88,6 +86,8 @@ $messages = array(
'tog-diffonly' => 'Икки барылы Ñ‚ÑÒ¥Ð½Ð¸Ð¸Ñ€Ð³Ñ ÑирÑй иһин көрдөрүмÑ',
'tog-showhiddencats' => 'КиÑÑ‚Ñммит категориÑлары көрдөр',
'tog-norollbackdiff' => 'Төннөрүү кÑнниттÑн барыллар уратыларын көрдөрүмÑ',
+'tog-useeditwarning' => 'ЭрÑдÑÑкÑийÑлиир ÑирÑйтÑн уларытыыларбын бигÑргÑппÑÐºÐºÑ Ñ‚Ð°Ñ…Ñаары гыннахпына ÑÑÑ€ÑÑ‚ÑÑÑ€',
+'tog-prefershttps' => 'Манна киирÑÑ€Ð³Ñ ÐºÑƒÑ€ÑƒÑƒÐº көмүÑкÑллÑÑÑ… холбонууну туттарга',
'underline-always' => 'Куруук',
'underline-never' => 'Ðннынан тардыма',
@@ -151,6 +151,18 @@ $messages = array(
'oct' => 'Ðлт',
'nov' => 'СÑÑ‚',
'dec' => 'ÐÑ…Ñ',
+'january-date' => 'ТохÑунньу $1',
+'february-date' => 'Олунньу $1',
+'march-date' => 'Кулун тутар $1',
+'april-date' => 'ÐœÑƒÑƒÑ ÑƒÑтар $1',
+'may-date' => 'Ыам ыйын $1',
+'june-date' => 'БÑÑ Ñ‹Ð¹Ñ‹Ð½ $1',
+'july-date' => 'От ыйын $1',
+'august-date' => 'Ðтырдьах ыйын $1',
+'september-date' => 'Балаҕан ыйын $1',
+'october-date' => 'Ðлтынньы $1',
+'november-date' => 'СÑтинньи $1',
+'december-date' => 'ÐÑ…Ñынньы $1',
# Categories related messages
'pagecategories' => '{{PLURAL:$1|КатегориÑ|КатегориÑлар}}',
@@ -232,6 +244,7 @@ $messages = array(
'create-this-page' => 'Бу ÑирÑйи ай',
'delete' => 'Соттор',
'deletethispage' => 'Бу ÑирÑйи Ñоттор',
+'undeletethispage' => 'Бу ÑирÑйи Ñөргүт (төннөр)',
'undelete_short' => 'Төттөрү аҕал {{PLURAL:$1|биир уларытыыны|$1 уларытыылары}}',
'viewdeleted_short' => '{{PLURAL:$1|Соҕотох Ñотторуллубут көннөрүүнү|$1 Ñотторуллубут көннөрүүнү}} көрүү',
'protect' => 'Уларыппат гын',
@@ -275,7 +288,7 @@ $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).
+# 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).
'aboutsite' => '{{SITENAME}} туһунан',
'aboutpage' => 'Project:туһунан',
'copyright' => 'Маны туһанары $1 көҥүллүүр.',
@@ -285,7 +298,6 @@ $1',
'disclaimers' => 'Бүк охÑунуу',
'disclaimerpage' => 'Project:Бүк охÑунуу',
'edithelp' => 'Уларытааччыларга көмө',
-'edithelppage' => 'Help:Уларытарга көмө',
'helppage' => 'Help:Көмө',
'mainpage' => 'Сүрүн ÑирÑй',
'mainpage-description' => 'Сүрүн ÑирÑй',
@@ -360,17 +372,11 @@ $1',
# General errors
'error' => 'ÐлҕаÑ',
'databaseerror' => 'Билии олоҕор Ñыыһа',
-'dberrortext' => 'Билии олоҕор ыйытык ÑинтакÑииһа Ñыыһалаах Ñбит.
-Ол бырагырааммаҕар баар Ñыыһаттан буолуон Ñөп.
-Билии олоҕор бүтÑһик ыйытык маннык:
-: <code>$1</code>
-(бу пуунÑуйаттан тахÑыбыт «<code>$2</code>»).
-Билии олоҕо Ñыыһаны көрдөрдө «<code>$3: $4</code>».',
-'dberrortextcl' => 'Билии олоҕор ыйытык ÑинтакÑииһын Ñыыһата таҕыÑта.
-Билии олоҕор бүтÑһик ыйытык:
-"$1"
-"$2" пуунÑуйаттан тахÑыбыт.
-Билии олоҕо маннык Ñыыһаны көрдөрдө "$3: $4"',
+'databaseerror-text' => 'Билии олоҕор Ð°Ð»Ò•Ð°Ñ Ñ‚Ð°Ò•Ñ‹Ñта.
+Бырагыраамма алҕаһа буолуон Ñөп.',
+'databaseerror-textcl' => 'Билии олоҕор Ð°Ð»Ò•Ð°Ñ Ñ‚Ð°Ò•Ñ‹Ñта.',
+'databaseerror-query' => 'Ыйытык: $1',
+'databaseerror-error' => 'ÐлҕаÑ: $1',
'laggedslavemode' => 'Болҕой: Бу ÑирÑй бүтÑһик уларытыылара Ñуох буолуон Ñөп',
'readonly' => 'Билии олоҕун уларытар бобуллубут',
'enterlockreason' => 'Уларытыыны бобуу төрүөтүн уонна төһө өр бобулларын ый.',
@@ -423,12 +429,15 @@ $1',
'editinginterface' => "'''Болҕой:''' Быраҕыраамма Ñ‚Ð°Ñ ÐºÓ©Ñтүүтүн (интерфейÑын) хааччыйар тиÑкиһи уларытаары гынан ÑÑ€Ñҕин.
Бу ÑирÑйи уларыттаххына атын кыттааччылар көрөллөрүгÑÑ€ бырагыраамма көÑÑ‚Ò¯Ò¯Ñ‚Ñ ÑƒÐ»Ð°Ñ€Ñ‹Ð¹Ñ‹Ð°.
Тылбааһын уларытыаххын ÑбÑÑ‚ÑÑ€ ÑбиÑххин баҕарар буоллаххына Медиавики бырайыактарын тылбааÑÑ‚Ñ‹Ñ‹Ñ€ ÑÐ¸Ñ€Ð³Ñ ÐºÐ¸Ð¸Ñ€ [//translatewiki.net/ translatewiki.net].",
-'sqlhidden' => '(SQL ыйытык киÑÑ‚Ñммит)',
'cascadeprotected' => 'Бу ÑирÑй уларыйар кыаҕа Ñуох, тоҕо диÑÑ‚ÑÑ…Ñ…Ñ ÑƒÐ»Ð°Ñ€Ñ‹Ð¹Ð°Ñ€Ð° бобуллубут (каÑкаднай көмүÑкÑл холбоммут) {{PLURAL:$1|ÑирÑй бөлөҕөр|ÑирÑйдÑÑ€ бөлөхтөрүгÑÑ€}} киирÑÑ€:
$2',
'namespaceprotected' => "Эн '''$1''' аат ÑйгÑтигÑÑ€ киирÑÑ€ ÑирÑйдÑри уларытар кыаҕыҥ Ñуох.",
'customcssprotected' => 'Эн бу CSS-ÑирÑйи уларытар кыаҕыҥ Ñуох, тоҕо диÑÑ‚ÑÑ…Ñ…Ñ Ð¾Ð½Ñ‚ÑƒÒ¥ атын киһи Ñ‚ÑƒÑ Ð±ÑйÑтин туруорууларын таарыйар.',
'customjsprotected' => 'Эн бу JavaScript-ÑирÑйи уларытар кыаҕыҥ Ñуох, тоҕо диÑÑ‚ÑÑ…Ñ…Ñ Ð¾Ð½Ñ‚ÑƒÒ¥ атын киһи Ñ‚ÑƒÑ Ð±ÑйÑтин туруорууларын таарыйар.',
+'mycustomcssprotected' => 'CSS-ÑирÑйи уларытар кыаҕыҥ Ñуох Ñбит.',
+'mycustomjsprotected' => 'СирÑÐ¹Ð³Ñ JavaScript уларытар кыаҕыҥ Ñуох Ñбит.',
+'myprivateinfoprotected' => 'БÑйÑÒ¥ туÑкунан информациÑны уларытар кыаҕыҥ Ñуох Ñбит.',
+'mypreferencesprotected' => 'БÑйÑÒ¥ туруорууларгын уларытар кыаҕыҥ Ñуох Ñбит.',
'ns-specialprotected' => '{{ns:special}} ааттаах ÑирÑйдÑÑ€ уларытыллыбаттар.',
'titleprotected' => "Бу Ð±Ð°Ñ Ñ‚Ñ‹Ð» оҥоһулларын [[User:$1|$1]] боппут.
Ð¢Ó©Ñ€Ò¯Ó©Ñ‚Ñ - ''$2''",
@@ -453,10 +462,19 @@ $2',
'welcomecreation-msg' => 'Ðатыҥ бÑлиÑÑ‚ÑннÑ.
{{SITENAME}} Ñитим-ÑÐ¸Ñ€Ð³Ñ Ò¯Ð»ÑÐ»Ð¸Ð¸Ñ€Ð³Ñ Ñ‚Ð°Ð±Ñ‹Ð³Ð°Ñтаах буоллун диÑн [[Special:Preferences|Ñ‚ÑƒÑ Ñ‚ÑƒÑ€ÑƒÐ¾Ñ€ÑƒÑƒÐ»Ð°Ñ€Ð³Ñ‹Ð½]] уларытыаххын Ñөп.',
'yourname' => 'Кыттааччы аатыҥ:',
+'userlogin-yourname' => 'БÑлиÑ-аат',
+'userlogin-yourname-ph' => 'БÑлиÑ-ааккын киллÑÑ€',
+'createacct-another-username-ph' => 'Ðаккын Ñуруй',
'yourpassword' => 'Киирии тыла:',
+'userlogin-yourpassword' => 'Киирии тыл',
+'userlogin-yourpassword-ph' => 'Киирии тылгын Ñуруй',
+'createacct-yourpassword-ph' => 'Киирии тылгын Ñуруй',
'yourpasswordagain' => 'Киирии тылгын хатылаа:',
+'createacct-yourpasswordagain' => 'Киирии тылгын бигÑргÑÑ‚',
+'createacct-yourpasswordagain-ph' => 'Киирии тылгын хатылаа',
'remembermypassword' => 'Миигин бу көмпүүтÑÑ€Ð³Ñ ÑигÑÑ ($1 {{PLURAL:$1|күн|күнтÑн ордуга Ñуох}})',
-'securelogin-stick-https' => 'КиирÑн баран HTTPS нөҥүө холбонууну Ñалгыырга',
+'userlogin-remembermypassword' => 'ТиһиликтÑн тахÑыма',
+'userlogin-signwithsecure' => 'Ð‘Ð¸Ð³Ñ Ñ…Ð¾Ð»Ð±Ð¾Ð½ÑƒÑƒ',
'yourdomainname' => 'Эн дөмүөнүҥ:',
'password-change-forbidden' => 'Бу Ð±Ð¸Ð¸ÐºÐ¸Ð³Ñ ÐºÐ¸Ð¸Ñ€Ð¸Ð¸ тылы уоарытар табыллыбат.',
'externaldberror' => 'Ð¢Ð°Ñ ÐºÐ¸Ð¸Ñ€Ð¸Ð¸ билиитин олоҕун Ñыыһата буолла, ÑбÑÑ‚ÑÑ€ Ñ‚Ð°Ñ ÐºÐ¸Ð¸Ñ€Ð¸Ð¸ билииҥ олоҕун Ñаҥардар кыаҕыҥ Ñуох.',
@@ -468,18 +486,41 @@ $2',
'logout' => 'ТахÑÑ‹Ñ‹',
'userlogout' => 'ТахÑÑ‹Ñ‹',
'notloggedin' => 'Ðаккын ÑппÑтиҥ',
+'userlogin-noaccount' => 'БÑлиÑÑ‚ÑÐ½Ñ Ð¸Ð»Ð¸ÐºÐºÐ¸Ð½ дуо?',
+'userlogin-joinproject' => '{{SITENAME}} Ñитим-ÑÐ¸Ñ€Ð³Ñ ÐºÐ¸Ð¸Ñ€Ð¸Ð¸',
'nologin' => "БÑлиÑÑ‚ÑÐ½Ñ Ð¸Ð»Ð¸ÐºÐºÐ¸Ð½ дуо? '''$1'''.",
'nologinlink' => 'БÑлиÑÑ‚Ñнии',
'createaccount' => 'БÑлиÑÑ‚Ñнии',
'gotaccount' => "БÑлиÑÑ‚Ñммитиҥ дуо? '''$1'''.",
'gotaccountlink' => 'Ðатыҥ',
'userlogin-resetlink' => 'КиирÑÑ€ тылгын умнубуккун дуо?',
+'userlogin-resetpassword-link' => 'Киирии тылы уларытыы',
+'helplogin-url' => 'Help:БÑлиÑ-ааты киллÑрии',
+'userlogin-helplink' => '[[{{MediaWiki:helplogin-url}}|БÑлиÑÑ‚ÑÐ½Ð¸Ð¸Ð³Ñ ÐºÓ©Ð¼Ó©]]',
+'createacct-join' => 'Ðллара Ñуруй.',
+'createacct-another-join' => 'Саҥа бÑлиÑ-аат туһунан аллара Ñуруй.',
+'createacct-emailrequired' => 'Email аадырыÑ',
+'createacct-emailoptional' => 'Email Ð°Ð°Ð´Ñ‹Ñ€Ñ‹Ñ (булгуччута Ñуох)',
+'createacct-email-ph' => 'Эл аадырыÑкын Ñуруй',
+'createacct-another-email-ph' => 'Эл. почтаҕын киллÑÑ€',
'createaccountmail' => 'БыÑтах киирии тылы туһаныы уонна ону ыйыллыбыт аадырыÑка Ñ‹Ñ‹Ñ‚Ñ‹Ñ‹',
+'createacct-realname' => 'ДьиҥнÑÑÑ… аатыҥ (булгуччута Ñуох)',
'createaccountreason' => 'ТөрүөтÑ:',
+'createacct-reason' => 'ТөрүөтÑ',
+'createacct-reason-ph' => 'Саҥа аатынан тоҕо киирÑҕиний',
+'createacct-captcha' => 'Куттал Ñуох буолуутун тургутуу',
+'createacct-imgcaptcha-ph' => 'Ò®Ó©Ò»Ñ ÐºÓ©ÑÑ‚Ó©Ñ€Ò¯ хатылаа',
+'createacct-submit' => 'БÑлиÑÑ‚Ñнии',
+'createacct-another-submit' => 'Ðтын аатынан бÑлиÑÑ‚Ñн',
+'createacct-benefit-heading' => '{{SITENAME}} Ñитим-Ñири Ñн курдук дьон оҥороллор.',
+'createacct-benefit-body1' => '{{PLURAL:$1|уларытыы|уларытыы}}',
+'createacct-benefit-body2' => '{{PLURAL:$1|ÑирÑй|ÑирÑй}}',
+'createacct-benefit-body3' => 'кÑнники {{PLURAL:$1|кыттааччы|кыттааччы}}',
'badretype' => 'Киирии тылларыҥ Ñөп түбÑÑпÑтилÑÑ€.',
'userexists' => 'Суруйбут аатыҥ бÑлиÑÑ€ баар.
Бука диÑн, атын аатта тал.',
'loginerror' => 'Ðаккын ÑиÑтема билбÑÑ‚Ñ',
+'createacct-error' => 'БÑлиÑÑ‚Ñнии кÑмигÑÑ€ Ð°Ð»Ò•Ð°Ñ Ñ‚Ð°Ò•Ñ‹Ñта',
'createaccounterror' => 'Саҥа аат бÑлиÑтиир кыах Ñуох: $1',
'nocookiesnew' => 'Маннык ааттаах кыттааччы баар буолла гынан баран, ÑиÑтиÑмÑÒ•Ñ ÐºÐ¸Ð¸Ñ€Ñ Ð¸Ð»Ð¸Ðº. {{SITENAME}} «cookies» туттар, оттон Ñн көмпүүтÑргÑÑ€ ону туһанар бобуллубут. Бука диÑн «cookies» холбоо, онтон Ó©ÑÑÓ© киирÑн көр.',
'nocookieslogin' => '{{SITENAME}} дьону билÑÑ€Ð³Ñ Â«cookies» туттар. Эн көмпүүтÑргÑÑ€ «cookies» бобуллубут. Ону холбоон баран Ó©ÑÑÓ© киирÑн көр.',
@@ -539,11 +580,13 @@ $2',
Саҥа аат Ñыыһа оҥоһуллубут буоллаҕына тугу да гыныа Ñуоххун Ñөп.',
'usernamehasherror' => 'Ðакка ÑÑ€ÑһиÑÐºÐºÑ Ð±ÑлиÑтин туттар Ñатаммат',
-'login-throttled' => 'Ðаһаа ÑлбÑхтик бÑйÑÒ¥ ааккын билиһиннÑÑ€Ñ Ñатаатыҥ.
-Бука диÑн кыратык тохтуу Ñ‚Ò¯Ò»Ñн баран Ó©ÑÑÓ© боруобалаа.',
+'login-throttled' => 'Ðаккын аһара ÑлбÑхтик билиһиннÑÑ€Ñ Ñатаатыҥ.
+Бука диÑн $1 буолан баран Ó©ÑÑÓ© киирÑн көрөөр.',
'login-abort-generic' => 'Бу аатынан Ñатаан киирбÑтиҥ - быÑтан хаалла',
'loginlanguagelabel' => 'Омугун тыла: $1',
'suspicious-userlogout' => 'СеанÑÑ‹ түмүктүүр ыйытыгыҥ ылыныллыбата, тоҕо диÑÑ‚ÑÑ…Ñ…Ñ Ð±Ñ€Ð°ÑƒÐ·ÐµÑ€ ÑбÑÑ‚ÑÑ€ кÑÑштыыр прокÑи Ð°Ð»Ò•Ð°Ñ Ñ‹Ñ‹Ð¿Ð¿Ñ‹Ñ‚ ыйытыктарыгар майгынныыр.',
+'createacct-another-realname-tip' => 'ДьиҥнÑÑÑ… аатыҥ булгуччута Ñуох.
+Ыйдаххына уларыппыт ÑирÑйиҥ уÑтуоруйатыгар көÑÑ‚Ó©Ñ€ буолуоҕа.',
# Email sending
'php-mail-error-unknown' => 'mail() PHP-функциÑтыгар туох ÑÑ€Ñ Ð°Ð»Ò•Ð°Ñ Ñ‚Ð°Ñ…Ñыбыт',
@@ -559,8 +602,7 @@ $2',
'newpassword' => 'Саҥа киирии тыл:',
'retypenew' => 'Саҥа киирии тылы хатылаа:',
'resetpass_submit' => 'Киирии тылы уларыт уонна киир',
-'resetpass_success' => 'Your password has been changed successfully! Now logging you in...
-Киирии тылыҥ ÑÑ‚ÑÒ¥Ò¥Ñ ÑƒÐ»Ð°Ñ€Ñ‹Ð¹Ð´Ð°. Сотору кÑминÑн киириÑÒ¥...',
+'changepassword-success' => 'Киирии тылыҥ ÑÑ‚ÑÒ¥Ò¥Ñ ÑƒÐ»Ð°Ñ€Ñ‹Ð¹Ð´Ð°!',
'resetpass_forbidden' => 'Киирии тылы уларытар Ñатаммат',
'resetpass-no-info' => 'Ðаккын билиһиннÑрдÑÑ…Ñ…Ð¸Ð½Ñ ÑÑ€Ñ Ð±Ñƒ ÑирÑÐ¹Ð³Ñ Ð±Ñ‹Ò»Ð° тиийиÑххин Ñөп.',
'resetpass-submit-loggedin' => 'Киирии тылы уларытыы',
@@ -572,10 +614,11 @@ $2',
# Special:PasswordReset
'passwordreset' => 'Киирии тылы Ñаҥаттан',
-'passwordreset-text' => 'Урукку киирии тылы уларытарга бу форманы толор.',
+'passwordreset-text-one' => 'Урукку киирии тылы уларытарга бу форманы толор.',
+'passwordreset-text-many' => '{{PLURAL:$1|Киирии тылы уларытарга түннүктÑртÑн биирдÑÑÑ‚Ñрин толор.}}',
'passwordreset-legend' => 'Киирии тылы Ñаҥаттан',
'passwordreset-disabled' => 'Бу Ð±Ð¸Ð¸ÐºÐ¸Ð³Ñ ÐºÐ¸Ð¸Ñ€Ð¸Ð¸ тылы Ñаҥардыы бобуллубут.',
-'passwordreset-pretext' => '{{PLURAL:$1||Ðллара көÑÑ‚Ó©Ñ€ дааннайдартан биирин талан Ñуруй}}',
+'passwordreset-emaildisabled' => 'Бу Ð±Ð¸Ð¸ÐºÐ¸Ð³Ñ Ñл. почтаны туттуу араарыллыбыт',
'passwordreset-username' => 'Кыттааччы:',
'passwordreset-domain' => 'Домен:',
'passwordreset-capture' => 'Суруллубут Ñуругу көрөҕүн дуо?',
@@ -606,7 +649,7 @@ $2
БыÑтах киирии тыл: $2',
'passwordreset-emailsent' => 'Киирии тылы уларытар туһунан Ñурук барда.',
'passwordreset-emailsent-capture' => 'Киирии тылы уларытар туһунан Ñурук аллара ÑÐ¼Ð¸Ñ ÐºÓ©Ñ€Ð´Ó©Ñ€Ò¯Ð»Ò¯Ð½Ð½Ñ.',
-'passwordreset-emailerror-capture' => 'Манна Ñанатар Ñурук көрдөрүлүннÑ, бу Ñ‚Ó©Ñ€Ò¯Ó©Ñ‚Ñ‚Ñн Ñатаан барбата: $1',
+'passwordreset-emailerror-capture' => 'Манна киирии тылы уларытар туһунан Ñурук көрдөрүлүннÑ. Ол ÑÑ€Ñн Ñурук бу Ñ‚Ó©Ñ€Ò¯Ó©Ñ‚Ñ‚Ñн $2 кыттааччыга Ñатаан барбата: $1',
# Special:ChangeEmail
'changeemail' => 'Ðаадырыһын уларыт',
@@ -620,6 +663,11 @@ $2
'changeemail-submit' => 'Ðадырыһы уларыт',
'changeemail-cancel' => 'Тохтот',
+# Special:ResetTokens
+'resettokens' => 'Токеннары бырах',
+'resettokens-legend' => 'Токеннары бырах',
+'resettokens-tokens' => 'Токеннар:',
+
# Edit page toolbar
'bold_sample' => 'Модьу бичик',
'bold_tip' => 'Модьу бичик',
@@ -815,12 +863,15 @@ IP-аадырыһа ÑÑ€Ñ ÐºÓ©ÑÑ‚Ó©Ñ€.
Ðрааһа Ñотуллубут быһыылаах.',
'edit-conflict' => 'КөннөрүүлÑÑ€ утарÑыылара.',
'edit-no-change' => 'Эн көннөрүүҥ киирбÑÑ‚Ñ, тоҕо диÑÑ‚ÑÑ…Ñ…Ñ Ñ‚ÑƒÐ³Ñƒ да уларыппатаххын.',
+'postedit-confirmation' => 'Көннөрүүҥ бигÑргÑннÑ.',
'edit-already-exists' => 'Саҥа ÑирÑйи оҥорор табыллыбат.
Маннык ÑирÑй баар Ñбит.',
'defaultmessagetext' => 'ТуÑпа ÑтиллибÑÑ‚ÑÒ•Ð¸Ð½Ñ Ñуруллар тиÑкиÑ',
'content-failed-to-parse' => '$2 иһинÑÑÒ•Ð¸Ñ‚Ñ $1 көрүҥÑÑ€ Ñөп түбÑÑпÑÑ‚: $3.',
'invalid-content-data' => 'ÐлҕаÑтаах дааннайдар',
'content-not-allowed-here' => '[[$2]] ÑирÑÐ¹Ð³Ñ "$1" туттуллуо Ñуохтаах',
+'editwarning-warning' => 'Ðтын ÑирÑÐ¹Ð³Ñ ÐºÓ©ÑÑ‚Ó©Ñ…Ñ…Ò¯Ð½Ñ Ð±Ð¸Ð»Ð¸Ð³Ð¸Ð½ оҥорбут уларытыыҥ барыта ÑүтÑн хаалыаҕа.
+БÑлиÑÑ‚Ñммит буоллаххына, бу ÑÑÑ€Ñтиини туруорууларыҥ «Уларытыы» Ñалаатыгар араарар кыахтааххын.',
# Content models
'content-model-wikitext' => 'биики-тиÑкиÑ',
@@ -855,6 +906,7 @@ IP-аадырыһа ÑÑ€Ñ ÐºÓ©ÑÑ‚Ó©Ñ€.
'undo-failure' => 'Уларытыы төннөр кыаҕа Ñуох. Ыккардынааҕы көннөрүүлÑÑ€ бÑÐ¹Ñ Ð±ÑйÑлÑригÑÑ€ Ñөп түбÑÑпÑÑ‚Ñ‚ÑÑ€.',
'undo-norev' => 'Бу көннөрүү Ñотуллар кыаҕа Ñуох, тоҕо диÑÑ‚ÑÑ…Ñ…Ñ Ð¾Ð½Ñ‡Ñƒ Ñуох ÑбÑÑ‚ÑÑ€ номнуо Ñотуллубут.',
'undo-summary' => '[[Special:Contributions/$2|$2]] кыттааччы ([[User talk:$2|ырытыы]] | [[Special:Contributions/$2|{{MediaWiki:Contribslink}}]]) $1 нүөмÑрдÑÑÑ… уларытыытын Ñотон оннугар Ñ‚Ò¯Ò»ÑÑ€ÑргÑ.',
+'undo-summary-username-hidden' => 'КиÑÑ‚Ñммит кыттааччы $1 уларытыытын төннөр',
# Account creation failure
'cantcreateaccounttitle' => 'Саҥа ааты киллÑÑ€ÑÑ€ Ñатаммат',
@@ -1036,6 +1088,7 @@ $1",
'compareselectedversions' => 'Талыллыбыт торумнары Ñ‚ÑҥнÑÑ',
'showhideselectedversions' => 'Талыллыбыт барыллары көрдөр/киÑÑ‚ÑÑ',
'editundo' => 'төнүн',
+'diff-empty' => '(уратыта Ñуох)',
'diff-multi' => '({{PLURAL:$2|$2 кыттааччы|$2 ахÑааннаах кыттааччы}} {{PLURAL:$1|$1 ыккардынааҕы барыла көрдөрүллүбÑÑ‚Ñ|$1 ахÑааннаах ыккардынааҕы барыла көрдөрүллүбÑÑ‚Ñ|$1.}})',
'diff-multi-manyusers' => '(Кырата {{PLURAL:$2|$1 кыттааччы|$2 ахÑааннаах кыттааччы}} оҥорбут {{PLURAL:$1|ыккардынааҕы $1 барыла|ыккардынааҕы $1 барыллара}} көрдөрүллүбÑÑ‚Ñ)',
'difference-missing-revision' => '$2 барыл бу Ñ‚ÑҥнÑÑÒ»Ð¸Ò¥Ò¥Ñ ($1) көÑтүбÑÑ‚Ñ.
@@ -1063,7 +1116,6 @@ $1",
'searchmenu-legend' => 'Көрдөөһүн туруоруулара',
'searchmenu-exists' => "'''Бу Ð±Ð¸Ð¸ÐºÐ¸Ð³Ñ Ð±Ñƒ ÑирÑй маннык ааттаах \"[[\$1]]\"'''",
'searchmenu-new' => "'''Бу Ð±Ð¸Ð¸ÐºÐ¸Ð³Ñ \"[[:\$1]]\" ÑирÑйи айарга!'''",
-'searchhelp-url' => 'Help:Көмө',
'searchmenu-prefix' => '[[Special:PrefixIndex/$1|Маннык префикÑтаах ÑирÑйдÑри көрөргө]]',
'searchprofile-articles' => 'ЫÑтатыйалар иÑÑ‚ÑÑ€Ñ',
'searchprofile-project' => 'Көмө уонна Бырайыак ÑирÑйдÑÑ€Ñ',
@@ -1104,15 +1156,7 @@ $1",
'powersearch-togglenone' => 'БÑлиÑÑ‚ÑÑмÑ',
'search-external' => 'ТаÑтан көрдөөһүн',
'searchdisabled' => '{{SITENAME}} көрдүүр Ñ‚ÑÑ€Ð¸Ð»Ñ Ð°Ñ€Ð°Ð°Ñ€Ñ‹Ð»Ð»Ñ‹Ð±Ñ‹Ñ‚. Ðтын көрдүүр ÑиÑтемаларынан наадыйар ÑирÑйдÑргитин көрдөтүөххүтүн Ñөп. Ол гынан баран поиÑковик кÑÑһигÑÑ€ баар торум ÑргÑрбит буолуон Ñөп.',
-
-# Quickbar
-'qbsettings' => 'ÐÐ°Ð²Ð¸Ð³Ð°Ñ†Ð¸Ñ Ð¿Ð°Ð½ÐµÐ»Ð°',
-'qbsettings-none' => 'КөрдөрүмÑ',
-'qbsettings-fixedleft' => 'Ð¥Ð°Ò¥Ð°Ñ Ó©Ñ‚Ñ‚Ó© хамÑаабат',
-'qbsettings-fixedright' => 'Уҥа Ó©Ñ‚Ñ‚Ó© хамÑаабат',
-'qbsettings-floatingleft' => 'Ð¥Ð°Ò¥Ð°Ñ Ó©Ñ‚Ñ‚Ó© уÑтаҥныыр',
-'qbsettings-floatingright' => 'Уҥа Ó©Ñ‚Ñ‚Ó© уÑтаҥныыр',
-'qbsettings-directionality' => 'Туттарыллыбыт, тылыҥ Ñуругун-бичигин хайыÑхатыттан тутулуктаах',
+'search-error' => 'Көрдүүр кÑÐ¼Ò¥Ñ Ð°Ð»Ò•Ð°Ñ Ñ‚Ð°Ò•Ñ‹Ñта: $1',
# Preferences page
'preferences' => 'Уларытыылар',
@@ -1146,7 +1190,6 @@ $1",
'resetprefs' => 'БигÑргÑтиллибÑÑ‚ÑÑ… уларыйыылары Ñот',
'restoreprefs' => 'Туруоруулары Ñаҥаттан (Ñалааларга барыларыгар)',
'prefs-editing' => 'Уларытыы',
-'prefs-edit-boxsize' => 'ЭрÑдÑÑкÑийÑлиир түннүк улахана.',
'rows' => 'Строкаалара:',
'columns' => 'Колонкалара:',
'searchresultshead' => 'Көрдөөһүн түмүгÑ',
@@ -1157,9 +1200,6 @@ $1",
'recentchangesdays-max' => '(улааппыта $1 күн)',
'recentchangescount' => 'Саҥа уларытыылар көрдөрүллÑÑ€ ахÑааннара:',
'prefs-help-recentchangescount' => 'Бу Ñаҥа көннөрүүлÑри, ÑирÑй уÑтуоруйаларын уонна Ñурунааллары көрдөрөр.',
-'prefs-help-watchlist-token' => 'Бу Ñ‚Ò¯Ð½Ð½Ò¯ÐºÐºÑ ÐºÐ¸ÑÑ‚ÑлÑÒ¥ күлүүһү Ñуруйдаххына Ñн кÑÑ‚ÑÑн көрүүҥ тиһигин RSS-транÑлÑциÑта оҥоһуллуо.
-Бу күлүүһү билÑÑ€ ханнык баҕарар киһи Ñн кÑÑ‚ÑÑн көрөр тиһиккин көрүөн Ñөп, онон дьон дөбөҥнүк билбÑÑ‚ киÑÑ‚ÑлÑÒ¥ күлүүÑÑ‚Ñрин Ñуруй.
-Ылбычча айыллыбыт күлүүһү туттуоххун Ñөп: $1',
'savedprefs' => 'Эн туруорууларыҥ олохтоннулар.',
'timezonelegend' => 'Олохтоох кÑм:',
'localtime' => 'Олохтоох кÑмим:',
@@ -1190,7 +1230,6 @@ $1",
'prefs-reset-intro' => 'Бу ÑирÑй көмөтүнÑн туруорууларгын Ñаҥаттан туруорар турукка төннөрүөххүн Ñөп.
Маны бигÑргÑÑ‚Ñ‚ÑÑ…Ñ…Ð¸Ð½Ñ Ð±Ð¸Ð»Ð¸Ð³Ð¸Ð½ баар туруоруулары дÑÐ±Ð¸Ð³Ð¸Ñ ÑөргүппÑккин.',
'prefs-emailconfirm-label' => 'Эл. почтаны бигÑргÑтии:',
-'prefs-textboxsize' => 'ЭрÑдÑÑкиÑÑйлиир түннүк улахана',
'youremail' => 'E-mail-Ñ‹Ò¥:',
'username' => '{{GENDER:$1|БÑлиÑÑ‚Ñммит аатыҥ}}:',
'uid' => '{{GENDER:$1|Кыттааччы}} ID-та:',
@@ -1222,6 +1261,8 @@ $1 {{PLURAL:$1|бÑлиÑÑ‚Ñ‚Ñн|бÑлиÑÑ‚Ñ‚Ñн (буукубаттан)}}
'prefs-dateformat' => 'Күн-дьыл ÐºÓ©Ñ€Ò¯Ò¥Ñ (формаата)',
'prefs-timeoffset' => 'КÑм уратыта',
'prefs-advancedediting' => 'Сүрүн туруоруулар',
+'prefs-editor' => 'ЭрÑдÑÑктÑÑ€',
+'prefs-preview' => 'Инники көрүү',
'prefs-advancedrc' => 'ДириҥÑтиллибит туруоруулар',
'prefs-advancedrendering' => 'ДириҥÑтиллибит туруоруулар',
'prefs-advancedsearchoptions' => 'ДириҥÑтиллибит туруоруулар',
@@ -1230,6 +1271,7 @@ $1 {{PLURAL:$1|бÑлиÑÑ‚Ñ‚Ñн|бÑлиÑÑ‚Ñ‚Ñн (буукубаттан)}}
'prefs-displaysearchoptions' => 'КөÑтүүтүн туруоруулара',
'prefs-displaywatchlist' => 'КөÑтүүтүн туруоруулара',
'prefs-diffs' => 'Уратылара',
+'prefs-help-prefershttps' => 'ÐныгыÑкы киириигÑÑ€ үлÑлиир буолуо.',
# User preference: email validation using jQuery
'email-address-validity-valid' => 'Сөп курдук көÑÑ‚Ó©Ñ€',
@@ -1256,6 +1298,8 @@ $1 {{PLURAL:$1|бÑлиÑÑ‚Ñ‚Ñн|бÑлиÑÑ‚Ñ‚Ñн (буукубаттан)}}
'userrights-notallowed' => 'Ðтын кыттааччы быраабын ÑбÑÑ€ уонна уларытар кыаҕыҥ Ñуох Ñбит.',
'userrights-changeable-col' => 'Эн уларытар кыахтаах бөлөхтөрүҥ',
'userrights-unchangeable-col' => 'Бу бөлөхтөрү уларытар кыаҕыҥ Ñуох',
+'userrights-conflict' => 'Кыттааччы быраабын быһаарарга Ð°Ð»Ò•Ð°Ñ Ñ‚Ð°Ò•Ñ‹Ñта! Хатылаан көр.',
+'userrights-removed-self' => 'БÑйÑÒ¥ кыаххын Ñарбынныҥ. Онон бу ÑирÑÐ¹Ð³Ñ ÐºÐ¸Ð¸Ñ€ÑÑ€ кыаҕыҥ Ñуох буолла.',
# Groups
'group' => 'Бөлөх:',
@@ -1321,11 +1365,19 @@ $1 {{PLURAL:$1|бÑлиÑÑ‚Ñ‚Ñн|бÑлиÑÑ‚Ñ‚Ñн (буукубаттан)}}
'right-proxyunbannable' => 'ПрокÑи аптааматынан хааччахтааһынын тумнуу',
'right-unblockself' => 'Хааччаҕы бÑÐ¹Ñ ÑƒÑтуута',
'right-protect' => 'СирÑйдÑÑ€ көмүÑкÑллÑрин таһымын уонна каÑкаадынан көмүÑкÑммит ÑирÑйдÑри уларытыы',
-'right-editprotected' => 'КөмүÑкÑллÑÑÑ… ÑирÑйдÑри уларытыыы (каÑкаднай көмүÑкÑллÑÑ€Ñ Ñуох буоллаҕына)',
+'right-editprotected' => 'Уларытыллар ÑирÑйдÑÑ€ "{{int:protect-level-sysop}}" таһымынан көмүÑкÑммиттÑÑ€',
+'right-editsemiprotected' => 'Уларытыллар ÑирÑйдÑÑ€ "{{int:protect-level-autoconfirmed}}" таһымынан көмүÑкÑммиттÑÑ€',
'right-editinterface' => 'Кыттааччы интерфейÑын уларытыы',
'right-editusercssjs' => 'Ðтын кыттааччылар CSS- и JS-билÑлÑрин уларытыы',
'right-editusercss' => 'Ðтын кыттааччылар CSS-билÑлÑрин уларытыы',
'right-edituserjs' => 'Ðтын кыттааччылар JS-билÑлÑрин уларытыы',
+'right-editmyusercss' => 'Кыттааччы CSS-билÑтин уларытыы',
+'right-editmyuserjs' => 'БÑÐ¹Ñ JavaScript-билÑлÑрин уларытыы',
+'right-viewmywatchlist' => 'БÑÐ¹Ñ ÐºÑтиир тиһигин көрүү',
+'right-editmywatchlist' => 'БÑÐ¹Ñ ÐºÑтиир тиһигин уларытыы. Болҕой, Ñорох дьайыыларыҥ бу быраабы биÑрбÑÑ‚Ñҕиҥ да иһин ÑирÑйдÑри Ñ‚Ð¸Ò»Ð¸ÐºÐºÑ ÑбиÑÑ…Ñ‚Ñрин Ñөп.',
+'right-viewmyprivateinfo' => 'БÑйÑÒ¥ туÑкунан (холобур, Ñл. почтаҥ, дьиҥнÑÑÑ… аатыҥ)',
+'right-editmyprivateinfo' => 'БÑйÑÒ¥ Ñ‚ÑƒÑ Ð´Ð°Ð°Ð½Ð½Ð°Ð¹Ð´Ð°Ð½Ð½Ð°Ñ€Ð³Ñ‹Ð½ уларыт (холобур, Ñл. почтаҕын, дьиҥнÑÑÑ… ааккын)',
+'right-editmyoptions' => 'БÑÐ¹Ñ Ñ‚ÑƒÑ€ÑƒÐ¾Ñ€ÑƒÑƒÐ»Ð°Ñ€Ñ‹Ð½ уларытыы',
'right-rollback' => 'Кыттааччы оҥорбут көннөрүүлÑрин талыллыбыт биир ÑирÑÐ¹Ð³Ñ Ñуох гыныы',
'right-markbotedits' => 'ТөннөрүллÑÑ€ көннөрүүлÑри робот уларытыытын курдук бÑлиÑÑ‚ÑÑһин',
'right-noratelimit' => 'Ðуорманнан хааччахтааһын Ñуох',
@@ -1387,12 +1439,18 @@ $1 {{PLURAL:$1|бÑлиÑÑ‚Ñ‚Ñн|бÑлиÑÑ‚Ñ‚Ñн (буукубаттан)}}
'action-userrights-interwiki' => 'атын Ð±Ð¸Ð¸ÐºÐ¸Ð³Ñ ÐºÑ‹Ñ‚Ñ‚Ñ‹Ñ‹ бырааптарын уларытыы',
'action-siteadmin' => 'Ð±Ð¸Ð»Ñ Ð¾Ð»Ð¾Ò•ÑƒÐ½ хааччахтааһын уонна хааччахтааһынын уÑтуу',
'action-sendemail' => 'Ñурук Ñ‹Ñ‹Ñ‚Ñ‹Ñ‹',
+'action-editmywatchlist' => 'кÑтиир тиһиккин уларыт',
+'action-viewmywatchlist' => 'кÑтиир тиһиккин көрүү',
+'action-viewmyprivateinfo' => 'бÑйÑÒ¥ туÑкунан көрүү',
+'action-editmyprivateinfo' => 'бÑйÑÒ¥ туÑкунан Ñуруллубуту уларыт',
# Recent changes
'nchanges' => '$1 {{PLURAL:$1|уларытыы|уларытыылар}}',
+'enhancedrc-history' => 'уÑтуоруйата',
'recentchanges' => 'КÑнники уларытыылар',
'recentchanges-legend' => 'КÑлиҥҥи уларытыылар хайдах көÑтөллөрүн туруоруу',
'recentchanges-summary' => 'Манна хаһан оҥоһуллубуттарынан Ñааһыланан {{SITENAME}} кÑнники уларыытыылара көÑтөллөр.',
+'recentchanges-noresult' => 'Этиллибит уларытыылар Ñппит кÑмҥÑÑ€ оҥоһуллубатахтар.',
'recentchanges-feed-description' => 'Бу ботуокка биики бүтÑһик уларыйыыларын кÑтииргÑ.',
'recentchanges-label-newpage' => 'Бу уларытыы түмүгÑÑ€ Ñаҥа ÑирÑй айыллыбыт.',
'recentchanges-label-minor' => 'Бу улахан Ñуолтата Ñуох уларытыы',
@@ -1429,7 +1487,6 @@ $1 {{PLURAL:$1|бÑлиÑÑ‚Ñ‚Ñн|бÑлиÑÑ‚Ñ‚Ñн (буукубаттан)}}
'recentchangeslinked-feed' => 'СигÑнÑÑ€ уларытыылар',
'recentchangeslinked-toolbox' => 'СигÑнÑÑ€ уларытыылар',
'recentchangeslinked-title' => '"$1" кытта ÑибÑÑÑÑ‚ÑÑÑ… уларытыылар',
-'recentchangeslinked-noresult' => 'СигÑммит ÑирÑйдÑÑ€Ð³Ñ Ñтиллибит кÑÐ¼Ò¥Ñ ÑƒÐ»Ð°Ñ€Ñ‹Ñ‚Ñ‹Ñ‹Ð»Ð°Ñ€ оҥоһуллубатылар.',
'recentchangeslinked-summary' => "Бу анал ÑирÑÐ¹Ð³Ñ ÑигÑнÑÑ€ ÑирÑйдÑÑ€ бүтÑһик уларыйыылара көһүннүлÑÑ€. [[Special:Watchlist|КÑÑ‚ÑнÑÑ€ ÑирÑйдÑÑ€]] '''модьу бичигинÑн''' бÑлиÑÑ‚ÑннилÑÑ€.",
'recentchangeslinked-page' => 'СирÑй аата:',
'recentchangeslinked-to' => 'Төттөрүтүн, ыйыллыбыт ÑирÑÐ¹Ð³Ñ ÑигÑнÑÑ€ ÑирÑйдÑри көрдөр',
@@ -1440,7 +1497,7 @@ $1 {{PLURAL:$1|бÑлиÑÑ‚Ñ‚Ñн|бÑлиÑÑ‚Ñ‚Ñн (буукубаттан)}}
'reuploaddesc' => 'Тохтот уонна киллÑрии форматыгар төнүн',
'upload-tryagain' => 'Ð‘Ð¸Ð»Ñ Ñ‚ÑƒÒ»ÑƒÐ½Ð°Ð½ Ñурук уларытыытын Ñ‹Ñ‹Ñ‚',
'uploadnologin' => 'Ð‘Ð¸Ð¸ÐºÐ¸Ð³Ñ Ð°Ð°ÐºÐºÑ‹Ð½ билиһиннÑрбÑтиҥ',
-'uploadnologintext' => 'БилÑлÑри киллÑÑ€ÑÑ€Ð³Ñ Ð¼Ð°Ð½Ð½Ð° [[Special:UserLogin|бÑлиÑÑ‚ÑниÑÑ…Ñ…Ñ]] наада',
+'uploadnologintext' => 'БилÑлÑри киллÑÑ€ÑÑ€Ð³Ñ $1 наада',
'upload_directory_missing' => 'Суруйуу паапката ($1) Ñуох, ону ааһан ÑиÑрбÑÑ€ ону бÑйÑÑ‚Ñ Ð¾Ò¥Ð¾Ñ€Ð¾Ñ€ кыаҕа Ñуох.',
'upload_directory_read_only' => '($1) директориÑҕа ÑиÑрбÑÑ€ билÑни Ñуруйар кыаҕа Ñуох.',
'uploaderror' => 'Ð‘Ð¸Ð»Ñ Ñуруллубата',
@@ -1668,7 +1725,6 @@ $1',
'http-read-error' => 'HTTP ааҕыытын алҕаһа.',
'http-timed-out' => 'HTTP-көрдөбүл толоруллуохтаах болдьоҕо ааÑта.',
'http-curl-error' => 'URL-га тахÑÑ‹Ñ‹ алҕаһа: $1',
-'http-host-unreachable' => 'URL-га тахÑÑ‹Ñ‹ Ñатаммата.',
'http-bad-status' => 'HTTP-ыйытыгы көрүү кÑмигÑÑ€ туох ÑÑ€Ñ Ñатаммата: $1 $2',
# Some likely curl errors. More could be added from <http://curl.haxx.se/libcurl/c/libcurl-errors.html>
@@ -1696,6 +1752,9 @@ $1',
'listfiles_size' => 'КÑÑмÑйÑ',
'listfiles_description' => 'Быһаарыыта',
'listfiles_count' => 'Барыллар',
+'listfiles-latestversion' => 'Билиҥҥи барыла',
+'listfiles-latestversion-yes' => 'Сөп',
+'listfiles-latestversion-no' => 'Суох',
# File description page
'file-anchor-link' => 'БилÑ',
@@ -1791,6 +1850,13 @@ $1',
'randompage' => 'ТүбÑÑÐ¿Ð¸Ñ‡Ñ‡Ñ ÑирÑй',
'randompage-nopages' => 'Бу {{PLURAL:$2|аат дала кураана|аат далларыгар ÑирÑйдÑÑ€ Ñуохтар}}: $1.',
+# Random page in category
+'randomincategory' => 'ÐšÐ°Ñ‚ÐµÐ³Ð¾Ñ€Ð¸Ñ Ñ‚Ò¯Ð±ÑÑÐ¿Ð¸Ñ‡Ñ‡Ñ Ñ‹Ñтатыйата',
+'randomincategory-invalidcategory' => '"$1" диÑн ÐºÐ°Ñ‚ÐµÐ³Ð¾Ñ€Ð¸Ñ Ñуох Ñбит.',
+'randomincategory-nopages' => 'Бу категориÑҕа [[:Category:$1]] киирÑÑ€ Ñ‹Ñтатыйалар Ñуохтар.',
+'randomincategory-selectcategory' => 'ÐšÐ°Ñ‚ÐµÐ³Ð¾Ñ€Ð¸Ñ Ñ‚Ò¯Ð±ÑÑÐ¿Ð¸Ñ‡Ñ‡Ñ ÑирÑйигÑÑ€ көÑ: $1 $2.',
+'randomincategory-selectcategory-submit' => 'КөÑ',
+
# Random redirect
'randomredirect' => 'ТүбÑÑÐ¿Ð¸Ñ‡Ñ‡Ñ ÑƒÑ‚Ð°Ð°Ñ€Ñ‹Ñ‹',
'randomredirect-nopages' => 'Бу аат далыгар($1) көһөрөр ыйынньыктар Ñуохтар.',
@@ -1816,17 +1882,13 @@ $1',
'statistics-users-active-desc' => 'ÐаÑпыт {{PLURAL:$1|биир хонук иһигÑÑ€|$1 хонукка}} тугу ÑÐ¼Ñ Ð¾Ò¥Ð¾Ñ€Ð±ÑƒÑ‚ кыттааччылар',
'statistics-mostpopular' => 'Саамай ÑлбÑхтик көрүллÑÑ€ Ñ‹Ñтатыйалар',
-'disambiguations' => 'ЭлбÑÑ… Ñуолталаах өйдөбүллÑÑ€Ð³Ñ ÑигÑнÑÑ€ ÑирÑйдÑÑ€',
-'disambiguationspage' => 'Template:ÑлбÑÑ… Ñуолталаах өйдөбүллÑÑ€',
-'disambiguations-text' => "Маннык ÑирÑйдÑÑ€ '''Ñ…Ð°Ñ Ð´Ð° Ñуолталаах ÑирÑйгÑ''' ÑигÑнÑллÑÑ€.
-Ол оннугар ханнык ÑÑ€Ñ Ñ‡Ð¾Ð¿Ñ‡Ñƒ ÑирÑÐ¹Ð³Ñ ÑигÑниÑÑ…Ñ‚ÑÑÑ…Ñ‚ÑÑ€.<br />
-Быһаарыы: [[MediaWiki:Disambiguationspage]] халыып баар ÑирÑйдÑÑ€Ñ Ñ…Ð°Ñ Ð´Ð° Ñуолталаах ÑирÑй ахÑааныгар киирÑллÑÑ€.",
-
'pageswithprop' => 'ЭрдÑÑ‚Ñ‚Ñн туруоруулаах ÑирÑйдÑÑ€',
'pageswithprop-legend' => 'Уларытыллыбыт туруоруулаах ÑирÑйдÑÑ€',
'pageswithprop-text' => 'Манна Ñорох туруоруулара уларытыллыбыт ÑирÑйдÑÑ€ көÑтүбүттÑÑ€.',
'pageswithprop-prop' => 'Туруоруу аата:',
'pageswithprop-submit' => 'Толор',
+'pageswithprop-prophidden-long' => 'уһун тиÑÐºÐ¸Ñ ÐºÐ¸ÑÑ‚Ñммит ($1)',
+'pageswithprop-prophidden-binary' => 'бинаар Ñуолта киÑÑ‚Ñммит ($1)',
'doubleredirects' => 'Ð¥Ð¾Ñ ÐºÓ©Ò»Ó©Ñ€Ó©Ó©Ò»Ò¯Ð½',
'doubleredirectstext' => 'Бу ÑирÑÐ¹Ð³Ñ Ð°Ñ‚Ñ‹Ð½ ÑÐ¸Ñ€Ð³Ñ ÑƒÑ‚Ð°Ð°Ñ€Ð°Ñ€ Ñ…Ð¾Ñ ÑƒÑ‚Ð°Ð°Ñ€Ñ‹Ñ‹Ð»Ð°Ñ€ тиһиктÑÑ€Ñ ÐºÓ©ÑÑ‚Ó©Ñ€.
@@ -1884,6 +1946,7 @@ $1',
'mostrevisions' => 'Саамай ÑлбÑхтик уларытыллыбыт Ñ‹Ñтатыйалар',
'prefixindex' => 'Мантан Ñаҕаланар (префикÑтаах) ÑирÑйдÑÑ€ барыта',
'prefixindex-namespace' => 'СирÑй Ñаҕаланыытынан наардаан көрдөрүү ($1 аат далыгар)',
+'prefixindex-strip' => 'Түмүк тиһигÑÑ€ префикÑÑ‹ көрдөрүмÑ',
'shortpages' => 'ÐšÑ‹Ð»Ð³Ð°Ñ Ñ‹Ñтатыйалар',
'longpages' => 'Уһун Ñ‹Ñтатыйалар',
'deadendpages' => 'Dead-end (БүтÑй) ÑирÑйдÑÑ€',
@@ -2075,10 +2138,9 @@ $1',
'unwatchthispage' => 'КÑтиири тохтот',
'notanarticle' => 'Бу Ñ‹Ñтатыйа буолбатах',
'notvisiblerev' => 'Торум Ñотуллубут',
-'watchnochange' => 'КÑтиир ÑирÑйдÑргиттÑн Ñтиллибит кÑÐ¼Ò¥Ñ Ð±Ð¸Ð¸Ñ€ да уларыйбатах.',
'watchlist-details' => '{{PLURAL:$1|$1 ÑирÑйи кÑтиигин|$1 ÑирÑй кÑÑ‚ÑÐ±Ð¸Ð»Ð³Ñ Ñылдьар}}, ырытыы ÑирÑйдÑрин аахпатахха.',
-'wlheader-enotif' => '* Ñл. почтанан биллÑрии холбоммут.',
-'wlheader-showupdated' => "* БүтÑһик киириигит кÑÐ½Ð½Ñ ÑƒÐ»Ð°Ñ€Ñ‹Ð¹Ð±Ñ‹Ñ‚ ÑирÑйдÑÑ€ '''модьу''' бичигинÑн бÑлиÑÑ‚ÑннилÑÑ€",
+'wlheader-enotif' => 'Эл. почтанан биллÑрии холбоммут.',
+'wlheader-showupdated' => "БүтÑһик киирииҥ кÑÐ½Ð½Ñ ÑƒÐ»Ð°Ñ€Ñ‹Ð¹Ð±Ñ‹Ñ‚ ÑирÑйдÑÑ€ '''модьу''' бичигинÑн бÑлиÑÑ‚ÑннилÑÑ€.",
'watchmethod-recent' => 'кÑÑ‚ÑÑн көрүү бүтÑһик уларыйыыларын көрүү',
'watchmethod-list' => 'кÑÑ‚ÑÑһин бүтÑһик уларыйыылара',
'watchlistcontains' => '$1 ÑирÑйи кÑÑ‚ÑÑн көрөҕүн.',
@@ -2481,13 +2543,11 @@ $1',
'ipb_blocked_as_range' => 'Сыыһа: $1 IP-та чопчу бобуллубатах (не блокирован), онон аһыллар кыаҕа Ñуох. Ол гынан баран IP бу $2 диапазон Ñорҕотун быһыытынан бобуллубут, ону арыйыахха (бобуутун уÑтуохха) Ñөп.',
'ip_range_invalid' => 'IP-лар диапазоннара Ñатаммат.',
'ip_range_toolarge' => 'Мантан /$1 Ò¯Ó©Ò»Ñ Ð´Ð¸Ð°Ð¿Ð°Ð·Ð¾Ð½Ð½Ð°Ñ€Ñ‹ хааччахтыыр Ñатаммат.',
-'blockme' => 'Миигин боп (блокируйдаа)',
'proxyblocker' => 'ПрокÑи бобуллуута',
-'proxyblocker-disabled' => 'Бу дьайыы араарыллыбыт.',
'proxyblockreason' => 'Эн IP-Ò¥ Ð°Ò»Ð°Ò•Ð°Ñ Ð¿Ñ€Ð¾ÐºÑи Ñбит, онон бобулунна. Интернет-провайдергын ÑбÑÑ‚ÑÑ€ техничеÑкÑй ÑулууÑпаны кытта ÑибÑÑÑÑ‚ÑÒ»Ñн кутталлаах Ñуол баарын биллÑÑ€.',
-'proxyblocksuccess' => 'Сатанна.',
'sorbsreason' => 'Эн IP-Ò¥ {{SITENAME}} Ñаайт DNSBL-гар Ð°Ò»Ð°Ò•Ð°Ñ Ð¿Ñ€Ð¾ÐºÑи быһыытынан Ñылдьар.',
'sorbs_create_account_reason' => 'Эн IP-Ò¥ {{SITENAME}} Ñаайт DNSBL-гар Ð°Ò»Ð°Ò•Ð°Ñ Ð¿Ñ€Ð¾ÐºÑи быһыытынан Ñылдьар. Саҥаттан бÑлиÑÑ‚ÑнÑÑ€ кыаҕыҥ Ñуох.',
+'xffblockreason' => 'X-Forwarded-For баһыгар баар IP-Ð°Ð°Ð´Ñ‹Ñ€Ñ‹Ñ Ð±Ð¾Ð±ÑƒÐ»Ð»ÑƒÐ±ÑƒÑ‚. Бу IP ЭйиÑÐ½Ñ ÑбÑÑ‚ÑÑ€ туһанар прокÑиҥ гиÑÐ½Ñ Ð±ÑƒÐ¾Ð»ÑƒÐ¾Ð½ Ñөп. Бобуу Ñ‚Ó©Ñ€Ò¯Ó©Ñ‚Ñ Ð¼Ð°Ð½Ð½Ñ‹Ðº Ñбит: $1',
'cant-block-while-blocked' => 'БÑйÑÒ¥ хааччахтаммыт кÑмҥÑÑ€ атын кыттааччылары хааччахтыыр кыаҕыҥ Ñуох.',
'cant-see-hidden-user' => 'Эн хааччахтаары гыммыт кыттааччыҥ урут хааччахтаммыт уонна киÑÑ‚Ñммит Ñбит. Кыттааччылары киÑтиир кыаҕыҥ Ñуох буолан ол туһунан Ñуругу көрөр да уларытар да быраабыҥ Ñуох.',
'ipbblocked' => 'Ðтын кыттааччылары хааччахтыыр да, хааччахтарын да уÑтар кыаҕыҥ Ñуох, тоҕо диÑÑ‚ÑÑ…Ñ…Ñ Ð±ÑйÑÒ¥ хааччахтааххын',
@@ -2656,6 +2716,8 @@ $1',
'thumbnail-more' => 'Улаатыннар',
'filemissing' => 'Ð‘Ð¸Ð»Ñ ÐºÓ©ÑтүбÑÑ‚Ñ',
'thumbnail_error' => 'Кыра ойууну оҥоруу Ñатаммата: $1',
+'thumbnail_error_remote' => '$1 Ð°Ð»Ò•Ð°Ñ Ñ‚ÑƒÒ»ÑƒÐ½Ð°Ð½ биллÑрдÑ:
+$2',
'djvu_page_error' => 'DjVu ÑирÑй тиһик таһыгар Ñбит',
'djvu_no_xml' => 'DjVu билÑтигÑÑ€ аналлаах XML кыайан ылыллыбата',
'thumbnail-temp-create' => 'ЭÑкииз быÑтах билÑтин оҥорор табыллыбата',
@@ -2882,11 +2944,6 @@ $1',
'pageinfo-category-files' => 'Ð‘Ð¸Ð»Ñ Ð°Ñ…Ñаана',
# Skin names
-'skinname-standard' => 'КлаÑÑика',
-'skinname-nostalgia' => 'Мунчаарыы',
-'skinname-myskin' => 'МиÑнÑ',
-'skinname-chick' => 'ЧуппууÑка',
-'skinname-simple' => 'Судургу',
'skinname-modern' => 'Билиҥҥи',
# Patrolling
@@ -2967,11 +3024,25 @@ $1',
'minutes' => '{{PLURAL:$1|$1 мүнүүтÑ|$1 мүнүүтÑ}}',
'hours' => '{{PLURAL:$1|$1 чааÑ|$1 чааÑ}}',
'days' => '{{PLURAL:$1|$1 күн|$1 күн}}',
+'weeks' => '$1 нÑдиÑлÑ',
'months' => '$1 ый',
'years' => '$1 Ñыл',
'ago' => '$1 ынараа өттүгÑÑ€',
'just-now' => 'Ñибилигин',
+# Human-readable timestamps
+'hours-ago' => '$1 Ñ‡Ð°Ð°Ñ Ñ‹Ð½Ð°Ñ€Ð°Ð° өттүгÑÑ€',
+'minutes-ago' => '$1 Ð¼Ò¯Ð½Ò¯Ò¯Ñ‚Ñ Ñ‹Ð½Ð°Ñ€Ð°Ð° өттүгÑÑ€',
+'seconds-ago' => '$1 ÑÓ©ÐºÒ¯Ò¯Ð½Ð´Ñ Ñ‹Ð½Ð°Ñ€Ð°Ð° өттүгÑÑ€',
+'monday-at' => 'БÑнидиÑнньиккÑ, баччаҕа: $1',
+'tuesday-at' => 'оптуорунньукка, баччаҕа: $1',
+'wednesday-at' => 'ÑÑÑ€ÑдÑÒ•Ñ, баччаҕа: $1',
+'thursday-at' => 'чÑппиÑргÑ, баччаҕа: $1',
+'friday-at' => 'бÑÑтинÑÑÒ•Ñ, баччаҕа: $1',
+'saturday-at' => 'Ñубуотаҕа, баччаҕа: $1',
+'sunday-at' => 'өрөбүлгÑ, баччаҕа: $1',
+'yesterday-at' => 'БÑÒ•ÑÒ»ÑÑ, баччаҕа: $1',
+
# Bad image list
'bad_image_list' => 'Формаата маннык буолуохтаах:
@@ -2997,7 +3068,7 @@ $1',
* gpslongitude
* gpsaltitude',
-# EXIF tags
+# Exif tags
'exif-imagewidth' => 'КÑтитÑ',
'exif-imagelength' => 'ҮрдүгÑ',
'exif-bitspersample' => 'Глубина цвета',
@@ -3176,7 +3247,7 @@ $1',
'exif-originalimageheight' => 'Ойуу быһылла илигинÑÑҕи үрдүгÑ',
'exif-originalimagewidth' => 'Ойуу быһылла илигинÑÑҕи кÑтитÑ',
-# EXIF attributes
+# Exif attributes
'exif-compression-1' => 'Хам тутуллубатах',
'exif-compression-2' => 'CCITT Group 3, 1-Ð¼ÐµÑ€Ð½Ð°Ñ Ð¼Ð¾Ð´Ð¸Ñ„Ð¸ÐºÐ°Ñ†Ð¸Ñ ÐºÐ¾Ð´Ð¸Ñ€Ð¾Ð²Ð°Ð½Ð¸Ñ Ð´Ð»Ð¸Ð½ Ñерий Хаффмана',
'exif-compression-3' => 'CCITT Group 3, Ñ„Ð°ÐºÑ ÐºÑƒÐ¾Ð´Ñ‚Ð°Ð°Ò»Ñ‹Ð½Ð°',
@@ -3567,7 +3638,6 @@ $5
'version-other' => 'Ðтын',
'version-mediahandlers' => 'Медиа уларытааччылар',
'version-hooks' => 'Перехватчиктар',
-'version-extension-functions' => 'РаÑширениÑлар функциÑлара',
'version-parser-extensiontags' => 'СинтакÑииһы анаалыÑÑ‚Ñ‹Ñ‹Ñ€ Ñ‚Ñрил раÑширениÑтын тиÑктÑÑ€Ñ',
'version-parser-function-hooks' => 'СинтакÑииһы анаалыÑÑ‚Ñ‹Ñ‹Ñ€ Ñ‚Ñрил функциÑтын перехватчиктара',
'version-hook-name' => 'Перехватчик аата',
@@ -3576,6 +3646,7 @@ $5
'version-license' => 'ЛиÑÑиÑнзийÑ',
'version-poweredby-credits' => "Бу биики бу движокка олоҕурар '''[//www.mediawiki.org/ MediaWiki]''', copyright © 2001-$1 $2.",
'version-poweredby-others' => 'атыттар',
+'version-poweredby-translators' => 'translatewiki.net тылбааÑчыттара',
'version-credits-summary' => '[[Special:Version|MediaWiki]] Ñайдыытыгар үлÑлÑрин иһин манна ахтыллыбыт дьоҥҥо махтанабыт.',
'version-license-info' => 'MediaWiki көҥүл тарҕанар бырагырааммаларга киирÑÑ€, кинини көмпүүтÑÑ€ Ð°Ò»Ð°Ò•Ð°Ñ Ð±Ñ‹Ñ€Ð°Ð³Ñ‹Ñ€Ð°Ð°Ð¼Ð¼Ð°Ð»Ð°Ñ€Ñ‹Ð½ пуондатын GNU General Public License уÑулуобуйатынан көҥүл тарҕатаргыт уонна/ÑбÑÑ‚ÑÑ€ уларытаргыт көҥүллÑнÑÑ€; Ð¸ÐºÐºÐ¸Ñ ÑбÑÑ‚ÑÑ€ онтон хойукку ханнык баҕарар барылыттан Ñаҕалаан.
@@ -3589,12 +3660,16 @@ MediaWiki туһалаах буоллун диÑн тарҕатыллар, ол
'version-entrypoints-header-entrypoint' => 'Киирии ÑирÑ',
'version-entrypoints-header-url' => 'URL',
-# Special:FilePath
-'filepath' => 'Ð‘Ð¸Ð»Ñ Ñуола',
-'filepath-page' => 'БилÑ:',
-'filepath-submit' => 'КөÑ',
-'filepath-summary' => 'Бу аналлаах ÑирÑй Ð±Ð¸Ð»Ñ Ñ…Ð°Ð½Ð½Ð° Ñытарын толору көрдөрөр.
-Ойуулар толору көрдөрүллÑллÑÑ€, атын билÑлÑÑ€ ÑитимнÑÑÑ… бырагырааммаларыгар тута арыллаллар.',
+# Special:Redirect
+'redirect' => 'БилÑÑ‚Ñ‚Ñн, кыттааччыттан ÑбÑÑ‚ÑÑ€ барыл идентификаторыттан утаарыы',
+'redirect-legend' => 'БилÑÒ•Ñ ÑбÑÑ‚ÑÑ€ ÑирÑÐ¹Ð³Ñ ÑƒÑ‚Ð°Ð°Ñ€Ñ‹Ñ‹',
+'redirect-submit' => 'Толор',
+'redirect-lookup' => 'Көрдөт:',
+'redirect-value' => 'Суолтата:',
+'redirect-user' => 'Кыттааччы нүөмÑÑ€Ñ',
+'redirect-revision' => 'СирÑй барыла',
+'redirect-file' => 'Ð‘Ð¸Ð»Ñ Ð°Ð°Ñ‚Ð°',
+'redirect-not-exists' => 'Суолта көÑтүбÑÑ‚Ñ',
# Special:FileDuplicateSearch
'fileduplicatesearch' => 'Ð¥Ð¾Ñ Ð±Ð¸Ð»ÑлÑри көрдөөһүн',
@@ -3644,6 +3719,7 @@ MediaWiki туһалаах буоллун диÑн тарҕатыллар, ол
'tags' => 'Билигин туттуллар уларытыы бÑлиÑлÑÑ€Ñ',
'tag-filter' => '[[Special:Tags|БÑлиÑлÑÑ€]] фильтрдара:',
'tag-filter-submit' => 'Фильтр',
+'tag-list-wrapper' => '([[Special:Tags|{{PLURAL:$1|ТиÑк|ТиÑктÑÑ€}}]]: $2)',
'tags-title' => 'БÑлиÑлÑÑ€ (тиÑктÑÑ€)',
'tags-intro' => 'Бу ÑирÑÐ¹Ð³Ñ Ð±Ñ‹Ñ€Ð°Ð³Ñ‹Ñ€Ð°Ð°Ð¼Ð¼Ð° уларытыылары бÑлиÑтиир анал бÑлиÑлÑрин (тиÑктÑрин) тиһиктÑÑ€Ñ ÑƒÐ¾Ð½Ð½Ð° ол бÑлиÑлÑÑ€ Ñуолталара көÑÑ‚Ó©Ñ€.',
'tags-tag' => 'БÑÐ»Ð¸Ñ (тиÑк) аата',
@@ -3685,6 +3761,9 @@ MediaWiki туһалаах буоллун диÑн тарҕатыллар, ол
'htmlform-submit' => 'Ыыт',
'htmlform-reset' => 'Уларытыыны төннөр',
'htmlform-selectorother-other' => 'Ðтын',
+'htmlform-no' => 'Суох',
+'htmlform-yes' => 'Сөп',
+'htmlform-chosen-placeholder' => 'Барылы тал',
# SQLite database support
'sqlite-has-fts' => '$1 толору тиÑкиÑÑ‚ÑÑÑ… көрдөөһүнү өйүүр',
diff --git a/languages/messages/MessagesSat.php b/languages/messages/MessagesSat.php
index 9a45a39e..0b18a5c5 100644
--- a/languages/messages/MessagesSat.php
+++ b/languages/messages/MessagesSat.php
@@ -50,9 +50,6 @@ $messages = array(
'tog-shownumberswatching' => 'Ńelok laṛcaṛkoaḱ songkha uduḱme',
'tog-oldsig' => 'Menaḱ signạtar',
'tog-fancysig' => 'Signạcar do wikiṭesk hisạbte moneyemẽ (jahan acte hoyoḱ joṛao bạgikate)',
-'tog-externaleditor' => 'Etohoṕre bahre reaḱ sompadonićaḱ beohar hoyoḱma (khali sẽṛa beoharić lạgitÌte, kompeuá¹­are asokae seá¹­ing jạruá¹›a. [//www.mediawiki.org/wiki/manual:External_editors More information.])',
-'tog-externaldiff' => 'Etohoṕre bahre reaḱ sompadonićaḱ beohar hoyoḱma (khali sẽṛa beoharić lạgitÌte, kompeuá¹­are asokae seá¹­ing jạruá¹›a. [//www.mediawiki.org/wiki/manual:External_editors More information.])',
-'tog-showjumplinks' => '"Calaḱmẽ" beohar joṛao ehop hoyoḱma',
'tog-uselivepreview' => 'JewetÌ Å„eloḱ beoharme (JavaScript jaruá¹› menaḱa)',
'tog-forceeditsummary' => 'Khạli sompadon guá¹­katha em oktere iÅ„ baá¸ae ocoyiÅ„ hoyoḱma',
'tog-watchlisthideown' => 'Ńeloḱ talikare ińaḱ joṛao kamiko danaṅme',
@@ -249,7 +246,7 @@ $1',
'pool-queuefull' => 'Pul reaḱ sakam perećena',
'pool-errorunknown' => 'BaÅ„ baá¸ayaḱ bhul',
-# All link text and link target definitions of links into project namespace that get used by other message strings, with the exception of user group pages (see grouppage) and the disambiguation template definition (see disambiguations).
+# 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).
'aboutsite' => 'baboÌ tre',
'aboutpage' => 'Project: BaboÌ t',
'copyright' => '$1 re bhitrire ńamoḱa.',
@@ -259,7 +256,6 @@ $1',
'disclaimers' => 'Dạbi bạnuḱko',
'disclaimerpage' => 'Project: Sadharon á¸iskleimarko(General disclaimer)',
'edithelp' => 'Tońge goṛo',
-'edithelppage' => 'Help:SoÌ mpadoÌ n',
'helppage' => 'Help: Bhitri renaḱ',
'mainpage' => 'Mukhiạ Sakam',
'mainpage-description' => 'Mukhiạ sakam',
@@ -332,17 +328,6 @@ Noa do noṅkanaḱ menkana je {{SITENAME}} sayeṭre beoharen sofṭower re mit
# General errors
'error' => 'bhul',
'databaseerror' => 'Ḍaṭabase vul',
-'dberrortext' => 'Database query syntexre vul hoeakana.
-Sofṭoyerre jahan bag karonte noa do hoe daṛeyaḱa.
-Joto khon mucạtÌ database query do tahẽkana noá¹…ka:
-<blockquote><tt>$1</tt><blockquote>
-"<tt>$2</tt>" bhitrire tahẽna.
-Database okaṭaḱ vule em akada:"<tt>$3: $4</tt>".',
-'dberrortextcl' => 'Ḍaṭabes query sintxexṭre vul hoeakana.
-MucạtÌ á¸aá¹­abes query do tahẽkana:
-"$1"
-"$2" faṅson reaḱ bhitri khon.
-Ḍatabes okaṭaḱ vule kulakaḱ: "$3: $4:',
'laggedslavemode' => "'''Sontoroḱme:''' sakamre do nahaḱ nãwãnaḱko paseć bạnuḱa.",
'readonly' => 'Ḍaṭabes do talagea',
'enterlockreason' => 'Cạbie reaḱ karon do cetÌkana ma lạimẽ, Saõte tinre tala cạbim jhija ona okte hõ lạimẽ',
@@ -385,7 +370,6 @@ Query: $2',
'viewsourcetext' => 'Noa sakam do am ńel ar ńamoḱaḱ ṭhạiem kopi hatao daṛeaḱa:',
'viewyourtext' => "Am do '''Amaḱ sompadon''' noa sakam ńel arem kopi hatao daṛeaḱa:",
'protectedinterface' => 'Noa sakam reaḱ babotko do wiki sofá¹­oyer reaḱ mitÌá¹­en iná¹­arfes khobore ema, onate noa do rukhiyạ doho hoeakana.',
-'sqlhidden' => '(SQL query do ukure menaḱa)',
'cascadeprotected' => 'Noa sakam do sompadon khon rukhiyạre menaḱa, karon sakam do latar reaḱ {{PLURAL:$1 gan sakam reaḱ gan sakam reaḱ}} bhitrire, oka sakam do (cascading) te rukhiyạ menaḱa:
$2',
'namespaceprotected' => "Amaḱ do sakamko joá¹›ao lạgitÌte ạidạri banuḱ tama '''$1''' Å„utumjayga.",
@@ -400,10 +384,10 @@ $2',
'welcomeuser' => 'Johar',
'welcomecreation-msg' => 'Amaḱ ekaunṭ do̠ jhićena. Amaḱ pạsindko bodol alom hiṛińa.',
'yourname' => 'Beoboharicaḱ ńutum',
+'userlogin-yourname-ph' => 'Amaḱ beohar ńutum emme.',
'yourpassword' => 'Uku namber',
'yourpasswordagain' => 'Arhõ oku namber olme',
'remembermypassword' => 'Mitṭen khon bạṛti khata reaḱ cạbi disạ dohoḱma (Jạsti $1 {{PLURAL:$1 din reaḱ din reaḱ}} lạgit)',
-'securelogin-stick-https' => 'Bhitri bolo kate HTTPS re soṅge tãhenme',
'yourdomainname' => 'Amaḱ á¸omen:',
'externaldberror' => 'Hoe daá¹›eyaḱa jahan bahre reaḱ jacaeaḱ á¸aá¹­abes vul hoeakana se amaḱ bahre reaḱ ekauná¹­ do nahaḱ halot aguire ạidạri bạnuḱa.',
'login' => "bolok' duar",
@@ -484,7 +468,7 @@ Arhõ kurumuṭue lahare dayakate thoṛagan tạṅgiemẽ.',
'newpassword' => 'Nãwã oku nomber',
'retypenew' => 'Doá¹›hate oku namber olme',
'resetpass_submit' => 'Oku namber joá¹›ao ar bhitri bolok',
-'resetpass_success' => 'Amaḱ oku namber do napayte bodolena!
+'changepassword-success' => 'Amaḱ oku namber do napayte bodolena!
Nitoḱ do am bhitritem boloḱkana...',
'resetpass_forbidden' => 'Oku namber do baá¹… bodoloklena',
'resetpass-no-info' => 'Noa sakam sojhete laá¹›caá¹› lạgitÌte am do bhitri boloḱ hoyoḱtama.',
@@ -494,10 +478,8 @@ Nitoḱ do am bhitritem boloḱkana...',
# Special:PasswordReset
'passwordreset' => 'Nãwãte oku nambar emme',
-'passwordreset-text' => 'Amaḱ ekauná¹­ reaḱ purapuri thuti e-mail hotete Å„am lạgitÌte latar reaḱ forom purạomẽ.',
'passwordreset-legend' => 'Nãwãte oku nambar emme',
'passwordreset-disabled' => 'Noa wikire amaḱ uku nambar nãwãte em lạgit subita do bando gea.',
-'passwordreset-pretext' => '{{PLURAL:$1 latar re menaḱ á¸aá¹­ako khon mitÌá¹­en emmẽ}}',
'passwordreset-username' => 'Beoharicaḱ ńutum:',
'passwordreset-domain' => 'Ḍomen:',
'passwordreset-capture' => 'Sendra fol reaḱ e-mail ńelmẽ?',
@@ -713,7 +695,6 @@ Unuduḱ: '''({{int:cur}})''' = nahaḱ nãwã aroeko saõte tulạo, '''({{int:
'viewprevnext' => 'Ńelme ($1 {{int:pipe-separator}} $2) ($3)',
'searchmenu-exists' => "'''Noa wiki re do \"[[:\$1]] ńutum sakam menaḱa",
'searchmenu-new' => 'wiki re [[:$1]]nãwã sakam tear',
-'searchhelp-url' => 'Help: Goṛawaḱ',
'searchprofile-articles' => 'Menaḱaḱ sakamko',
'searchprofile-project' => 'GoÌ á¹›o ar Project sakam',
'searchprofile-images' => 'Multimedia',
@@ -740,9 +721,6 @@ Unuduḱ: '''({{int:cur}})''' = nahaḱ nãwã aroeko saõte tulạo, '''({{int:
'powersearch-toggleall' => 'Sanamaḱ',
'powersearch-togglenone' => 'Okaṭaḱ hõ baṅ',
-# Quickbar
-'qbsettings-none' => 'Okaṭaḱ hõ baṅ',
-
# Preferences page
'preferences' => 'Pạsindko',
'mypreferences' => 'Iñaḱ pạsindko',
@@ -838,7 +816,6 @@ Amaḱ e-mail ṭhikạna do bań cabaḱa tinre onko do ko beohara',
'recentchangeslinked' => 'Sãotenaḱ bodolko',
'recentchangeslinked-toolbox' => 'Noá¹›joá¹› palaá¹­ko',
'recentchangeslinked-title' => 'Bodolaḱko do "$1" sãote joṛao geya',
-'recentchangeslinked-noresult' => 'Joṛao sakam re emoḱ oktere jahanaḱ bodolko bạnuḱa.',
'recentchangeslinked-summary' => "Noa do ona tạlika kana oka do nebetarge bodol hoyakan oka do asokayte hatao akan sakam khon.
[[Special:Watchlist|your watchlist]] renaḱ sakamko do '''bold''' .",
@@ -896,8 +873,6 @@ Noa reaḱ pasnao katha [$2 rẽt pasnao sakam] latare emena',
'statistics' => 'Halot',
'statistics-pages' => 'Sakamko',
-'disambiguationspage' => 'sujhi',
-
# Miscellaneous special pages
'nbytes' => '$1 {{PLURAL:$1|baiá¹­|baiá¹­}}',
'nmembers' => '$1 {{PLURAL:$1 Gaõtaren Gaõtarenko}}',
@@ -1060,8 +1035,6 @@ Noa reaḱ pasnao katha [$2 rẽt pasnao sakam] latare emena',
'block-log-flags-nocreate' => 'Ekauná¹­ benao do bondogeya',
'block-log-flags-noemail' => 'E-mail do esetgea',
'block-log-flags-hiddenname' => 'Beoharićaḱ ńutum do ukugea',
-'blockme' => 'Esedińmẽ',
-'proxyblocksuccess' => 'Hoena',
# Move page
'movepagebtn' => 'Sakam ocogmẽ, Sakam kulmẽ',
@@ -1181,7 +1154,7 @@ f nombor
isospeeddratings
jeleń',
-# EXIF tags
+# Exif tags
'exif-imagewidth' => 'Ganá¸e',
'exif-imagelength' => 'Usul',
'exif-datetime' => 'Rẽt bodol reaḱ tạrikh ar okte',
diff --git a/languages/messages/MessagesSc.php b/languages/messages/MessagesSc.php
index 7f5ef9c5..705e4170 100644
--- a/languages/messages/MessagesSc.php
+++ b/languages/messages/MessagesSc.php
@@ -177,7 +177,7 @@ $messages = array(
'index-category' => 'Pàginas indicizadas',
'noindex-category' => 'Pàginas no indicitzadas',
-'linkprefix' => '/^(.*?)([a-zA-Z\\x80-\\xff]+)$/sD',
+'linkprefix' => '/^((?>.*(?<![a-zA-Z\\x80-\\xff])))(.+)$/sD',
'about' => 'A propòsitu de',
'article' => 'Artìculu',
@@ -270,7 +270,7 @@ $messages = array(
'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).
+# 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).
'aboutsite' => 'A propòsitu de {{SITENAME}}',
'aboutpage' => 'Project:Informatziones',
'copyright' => 'Cuntènnidu a suta licèntzia $1.',
@@ -280,7 +280,6 @@ $messages = array(
'disclaimers' => 'Abbertimentos',
'disclaimerpage' => 'Project:Abbertimentos generales',
'edithelp' => "Agiudu pro s'acontzu o sa scritura",
-'edithelppage' => 'Help:Acontzare',
'helppage' => 'Help:Agiudu',
'mainpage' => 'Pàgina Base',
'mainpage-description' => 'Pàgina Base',
@@ -300,7 +299,6 @@ $messages = array(
'newmessagesdifflink' => 'ùrtima mudàntzia',
'youhavenewmessagesmulti' => 'Tenes messàgios noos in $1',
'editsection' => 'acontza',
-'editsection-brackets' => '[$1]',
'editold' => 'acontza',
'viewsourceold' => 'càstia mitza',
'editlink' => 'acontza',
@@ -346,12 +344,6 @@ Una lista de pàginas ispetziales bàlidas d'agatas in [[Special:SpecialPages|{{
# General errors
'error' => 'Faddina',
'databaseerror' => 'Faddina de su database',
-'dberrortext' => 'Faddina de sintassi in sa pregunta fata a su database.
-Custu podet indicare unu sbàlliu de su software.
-S\'ùrtima consulta imbiada a su database est istada:
-<blockquote><tt>$1</tt></blockquote>
-aintru de sa funtzione "<tt>$2</tt>".
-Su database at torradu custa faddina "<tt>$3: $4</tt>".',
'readonly' => 'Database bloccadu',
'enterlockreason' => 'Inserta su motivu de su bloccu, ispetzifichende su momentu probabile chi su bloccu at a acabai',
'readonlytext' => "In custu momentu su database est bloccadu dae aciunturas e àteras modificas, probabilmente pro ordinaria manutentzione a su database, a pustis de custas at a èssere normale torra.
@@ -380,7 +372,6 @@ Podet èsser stadu burradu dae calicunu àteru.',
'badtitletext' => "Su tìtulu de sa pàgina ch'as pediu est bùidu, isballiau, o iscritu in is cullegamentus inter-wiki in manera non currègia o cun caràteres no amìtius.",
'viewsource' => 'Càstia mitza',
'actionthrottled' => 'Atzione rimandada',
-'sqlhidden' => '(Consulta SQL cuada)',
'namespaceprotected' => "Non tenes su permissu de acontzare is pàginas in su nùmene-lugu '''$1'''.",
'ns-specialprotected' => 'Is pàginas ispetziales non podent èssere acontzadas.',
@@ -631,7 +622,6 @@ Cosas de ammentare: '''({{int:cur}})''' = diferèntzias cun sa versione currente
'shown-title' => 'Ammustra $1 {{PLURAL:$1|resurtadu|resurtados}} pro pàgina',
'viewprevnext' => 'Càstia ($1 {{int:pipe-separator}} $2) ($3).',
'searchmenu-legend' => 'Possibilidades de chirca',
-'searchhelp-url' => 'Help:Agiudu',
'searchprofile-everything' => 'Totu',
'searchprofile-advanced' => 'Avantzada',
'searchprofile-articles-tooltip' => 'Chirca in $1',
@@ -660,14 +650,6 @@ Prova a seberare ''totu:'' pro chircare in totu su cuntènnidu (inclùdidas pàg
'powersearch-toggleall' => 'Totu',
'powersearch-togglenone' => 'Nudda',
-# Quickbar
-'qbsettings' => 'Settaggio della barra menu',
-'qbsettings-none' => 'Nessuno',
-'qbsettings-fixedleft' => 'Fisso a sinistra',
-'qbsettings-fixedright' => 'Fisso a destra',
-'qbsettings-floatingleft' => 'Fluttuante a sinistra',
-'qbsettings-floatingright' => 'Fluttuante a destra',
-
# Preferences page
'preferences' => 'Preferèntzias',
'mypreferences' => 'Preferèntzias meas',
@@ -925,8 +907,6 @@ Càstia sa [[Special:NewFiles|galleria de files nous]] pro una presentada prus b
'statistics-header-users' => 'Statìsticas subra is usuàrios',
'statistics-pages' => 'Pàginas',
-'disambiguationspage' => 'Template:Disambìgua',
-
'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.
@@ -1228,8 +1208,6 @@ Abbàida sa [[Special:BlockList|lista de IP bloccados]] pro bìder sas bloccadur
'blocklogentry' => 'bloccau [[$1]] pro unu tempu de $2 $3',
'unblocklogentry' => 'at sbloccau $1',
'block-log-flags-nocreate' => 'creatzione account bloccada',
-'blockme' => 'Blocca·mi',
-'proxyblocksuccess' => 'Fatu.',
'sorbs' => 'DNSBL',
# Developer tools
@@ -1428,14 +1406,14 @@ Is acàpius chi sighint in sa matessi lìnia sunt cunsideraus comente eccetzione
* gpslongitude
* gpsaltitude",
-# EXIF tags
+# Exif tags
'exif-artist' => 'Autore',
'exif-exposuretime-format' => '$1 s ($2)',
'exif-fnumber-format' => 'f/$1',
'exif-flash' => 'Flash',
'exif-focallength-format' => '$1 mm',
-# EXIF attributes
+# Exif attributes
'exif-compression-6' => 'JPEG',
'exif-photometricinterpretation-2' => 'RGB',
@@ -1483,7 +1461,6 @@ Is acàpius chi sighint in sa matessi lìnia sunt cunsideraus comente eccetzione
'semicolon-separator' => ';&#32;',
'comma-separator' => ',&#32;',
'colon-separator' => ':&#32;',
-'autocomment-prefix' => '-&#32;',
'word-separator' => '&#32;',
'ellipsis' => '…',
'percent' => '$1%',
@@ -1531,10 +1508,6 @@ Is acàpius chi sighint in sa matessi lìnia sunt cunsideraus comente eccetzione
'version-license' => 'Licèntzia',
'version-software-version' => 'Versione',
-# Special:FilePath
-'filepath-page' => 'Nùmene de su file:',
-'filepath-submit' => 'Bae',
-
# Special:FileDuplicateSearch
'fileduplicatesearch-submit' => 'Chirca',
diff --git a/languages/messages/MessagesScn.php b/languages/messages/MessagesScn.php
index 9ca19e3c..4a257c8d 100644
--- a/languages/messages/MessagesScn.php
+++ b/languages/messages/MessagesScn.php
@@ -182,9 +182,6 @@ $messages = array(
'tog-shownumberswatching' => 'Ammustra lu nùmmiru di utenti ca sèquinu la pàggina',
'tog-oldsig' => 'Firma attuali:',
'tog-fancysig' => 'Interpitra li cumanna wiki nâ firma (senza liami automaticu)',
-'tog-externaleditor' => 'Usa di default nu editor esternu (sulu pi li esperti, abbisognanu mpustazzioni particulari pô tò computer. [//www.mediawiki.org/wiki/Manual:External_editors More information.])',
-'tog-externaldiff' => "Usa di default un prugramma di diff sternu (sulu pi utilizzatura sperti, addumanna l'usu di mpustazzioni particulari supra lu sò computer. [//www.mediawiki.org/wiki/Manual:External_editors Pi cchiossai nfurmazzioni.])",
-'tog-showjumplinks' => "Attiva li culligamenti accissìbbili 'và a'",
'tog-uselivepreview' => "Attiva la funzioni ''Live preview'' (richiedi JavaScript; spirimintali)",
'tog-forceeditsummary' => "Chiedi cunferma siddu l'uggettu dû canciamentu è vacanti",
'tog-watchlisthideown' => "Ammuccia li mè canciamenti nta l'ossirvati spiciali",
@@ -197,6 +194,8 @@ $messages = array(
'tog-diffonly' => "Nun visualizzari lu cuntinutu dâ pàggina quannu s'esequi na ''diff'' tra dui virsioni",
'tog-showhiddencats' => 'Ammustra li catigurìi ammucciati.',
'tog-norollbackdiff' => "Umettiri li ''diff'' doppu aviri fattu nu ''rollback''",
+'tog-useeditwarning' => 'Avvisa quannu si lasaa na paggina di canci cu canci nu sarbati',
+'tog-prefershttps' => 'Usa sempri na cunnissioni sicura quannu trasi',
'underline-always' => 'sempri',
'underline-never' => 'mai',
@@ -260,6 +259,18 @@ $messages = array(
'oct' => 'utt',
'nov' => 'nuv',
'dec' => 'Dic',
+'january-date' => '$1 jinnaru',
+'february-date' => '$1 frivaru',
+'march-date' => '$1 di marzu',
+'april-date' => '$1 di aprili',
+'may-date' => '$1 di maiu',
+'june-date' => '$1 di giugnu',
+'july-date' => '$1 di giugnettu',
+'august-date' => '$1 di austu',
+'september-date' => '$1 di sittèmmiru',
+'october-date' => '$1 di uttùviru',
+'november-date' => '$1 di nuvèmmiru',
+'december-date' => '$1 di dicèmmiru',
# Categories related messages
'pagecategories' => '{{PLURAL:$1|Catigurìa|Catigurìi}}',
@@ -341,6 +352,7 @@ $messages = array(
'create-this-page' => 'Crea sta pàggina',
'delete' => 'elìmina',
'deletethispage' => 'Elìmina sta pàggina',
+'undeletethispage' => 'Annulla la scancillazzioni di sta pàggina',
'undelete_short' => 'Ricùpira {{PLURAL:$1|na rivisioni|$1 rivisioni}}',
'viewdeleted_short' => 'Talìa {{PLURAL:$1|nu canciamentu scancillatu|$1 canciamenti scancillati}}',
'protect' => 'Pruteggi',
@@ -382,7 +394,7 @@ $1",
'pool-queuefull' => 'La cuda dû pool è china',
'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).
+# 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).
'aboutsite' => 'Àutri nfurmazzioni supra {{SITENAME}}',
'aboutpage' => 'Project:Àutri nformazzioni',
'copyright' => 'Lu cuntinutu è utilizzàbbili secunnu la $1.',
@@ -392,7 +404,6 @@ $1",
'disclaimers' => 'Avvirtenzi',
'disclaimerpage' => 'Project:Avvirtenzi ginirali',
'edithelp' => 'Guida',
-'edithelppage' => 'Help:Canciamentu',
'helppage' => 'Help:Cuntinuti',
'mainpage' => 'Pàggina principali',
'mainpage-description' => 'Pàggina principali',
@@ -469,17 +480,6 @@ L'alencu dî pàggini spiciali vàlidi s'attrova 'n [[Special:SpecialPages|Alenc
# General errors
'error' => 'Erruri',
'databaseerror' => 'Erruri dû database',
-'dberrortext' => 'Erruri di sintassi ntâ richiesta nultrata a lu databbasi.
-Chistu putissi innicari la prisenza d\'un bug ntô software.
-L\'ùrtima query mannata a lu database fu:
-<blockquote><tt>$1</tt></blockquote>
-richiamata dâ funzioni "<tt>$2</tt>".
-Lu databbasi desi l\'erruri "<tt>$3: $4</tt>".',
-'dberrortextcl' => 'Erruri di sintassi ntâ richiesta nultrata a lu database.
-L\'ùrtima query mannata a lu database hà stata:
-"$1"
-richiamata dâ funzioni "$2".
-MySQL hà ristituitu lu siquenti erruri "$3: $4".',
'laggedslavemode' => "Accura: La pàggina putissi nun ripurtari l'aggiurnamenti cchiù ricenti.",
'readonly' => 'Database bluccatu',
'enterlockreason' => "Ìnnica lu mutivu dû bloccu, spicificannu lu mumentu 'n cui è prisumìbbili ca veni rimossu.",
@@ -527,7 +527,6 @@ Query: $2',
'viewyourtext' => "È pussibbili visualizzarei cupiari lu còdici surgenti dî '''tò canciamenti''' nti sta pàggina:",
'protectedinterface' => "Sta pàggina cunteni un elementu ca fà parti dâ nterfaccia utenti dû software eggh'è prutetta p'evitari pussìbbili abbusi. Pi jùnciri o canciari li traduzzioni pi tutti li wiki usari [//translatewiki.net/translatewiki.net] lu pruggettu di lucalizzazzioni di Mediawiki.",
'editinginterface' => "'''Accura:''' Lu testu di sta pàggina fà parti dî interfaccia utenti dû situ. Tutti li canciamenti appurtati a sta pàggina si riflèttinu supra li missaggi visualizzati pi tutti l'utenti. Pi li traduzioni, cunsidira â pussibilità di usari [//translatewiki.net/wiki/Main_Page?setlang=scn translatewiki.net], u prugettu di localizzazioni MediaWiki.",
-'sqlhidden' => '(la query SQL hà statu ammucciata)',
'cascadeprotected' => 'Supra sta pàggina nun è pussìbbili effittuari canciamenti pirchì veni nclusa nt{{PLURAL:$1|â pàggina siquenti, ca fu prutetta|ê pàggini siquenti, ca foru prutetti}} silizziunannu la prutizzioni "ricursiva":
$2',
'namespaceprotected' => "Nun hai lu pirmissu pi canciari li pàggini ntô namespace '''$1'''.",
@@ -551,10 +550,18 @@ Accura chi quarchi pàggina pò cuntinuari a èssiri ammustrata comu si nun avis
'welcomeuser' => 'Bommegna, $1!',
'welcomecreation-msg' => 'Lu cuntu fu criatu. Nun ascurdàriti di pirsunalizzari li prifirenzi pi {{SITENAME}}',
'yourname' => "Lu tò nomu d'utenti (''user name'')",
+'userlogin-yourname' => 'Nomu utenti',
+'userlogin-yourname-ph' => 'Nzirìsci lu tò nomu utenti',
'yourpassword' => "La tò ''password''",
+'userlogin-yourpassword' => 'Password',
+'userlogin-yourpassword-ph' => 'Nzirisci la tò password',
+'createacct-yourpassword-ph' => 'Nzirisci na password',
'yourpasswordagain' => "Scrivi la password n'àutra vota",
+'createacct-yourpasswordagain' => 'Cunfirma la password',
+'createacct-yourpasswordagain-ph' => 'Nzirisci la password attorna',
'remembermypassword' => 'Arricorda la password supra stu computer (pi ô massimu $1 {{PLURAL:$1|jornu|jorna}})',
-'securelogin-stick-https' => 'Resta cunnittutu cu HTTPS doppu la trasuta',
+'userlogin-remembermypassword' => 'Mantènimi culligatu',
+'userlogin-signwithsecure' => 'Usa na cunnissioni sicura',
'yourdomainname' => 'Lu tò dominiu',
'password-change-forbidden' => 'Nun putiti canciari la password nti sta wiki',
'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.",
@@ -566,14 +573,32 @@ Accura chi quarchi pàggina pò cuntinuari a èssiri ammustrata comu si nun avis
'logout' => 'Nesci',
'userlogout' => 'Nesci',
'notloggedin' => "Nun v'aviti riggistratu",
+'userlogin-noaccount' => "Nun ci l'hai nu cuntu?",
+'userlogin-joinproject' => 'Scrìviti a {{SITENAME}}',
'nologin' => "Nun nn'aviti nu cuntu pi ccà? '''$1'''.",
'nologinlink' => 'Criati nu cuntu sùbbitu',
'createaccount' => 'Criati un cuntu novu',
'gotaccount' => "Hai già nu cuntu? '''$1'''.",
'gotaccountlink' => 'Trasi',
'userlogin-resetlink' => "T'ascurdasti li dittagli pâ trasuta?",
+'userlogin-resetpassword-link' => 'Reinizzializza la tò password',
+'helplogin-url' => 'Help:Cunnissioni',
+'userlogin-helplink' => '[[{{MediaWiki:helplogin-url}}|Aiutu câ fasi di login]]',
+'createacct-join' => 'Nzirisci li tò nfurnazzioni ccà',
+'createacct-emailrequired' => 'Nnirizzu e-mail',
+'createacct-emailoptional' => 'Nnirizzu e-mail (facurtativu)',
+'createacct-email-ph' => 'Nzirisci lu tò nnirizzu e-mail',
'createaccountmail' => 'Utilizzari na password timpurania casuali e mannàrila ô nnirizzu e-mail spicificatu ccàssutta',
+'createacct-realname' => 'Nomu riali (facurtativu)',
'createaccountreason' => 'Mutivu:',
+'createacct-reason' => 'Mutivu',
+'createacct-reason-ph' => "Pirchì stai criannu n'àutru cuntu?",
+'createacct-captcha' => 'Cuntrollu di sicurezza',
+'createacct-imgcaptcha-ph' => 'Nzirìsci lu testu ca vidi ccassupra',
+'createacct-submit' => 'Crèa nu cuntu',
+'createacct-benefit-heading' => '{{SITENAME}} è fatta di pirsunu comu a tìa.',
+'createacct-benefit-body1' => '{{PLURAL:$1|cuntribbutu|cuntribbuti}}',
+'createacct-benefit-body2' => '{{PLURAL:$1|pàggina|pàggini}}',
'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",
@@ -636,7 +661,7 @@ Aspetta tanticchia prima di pruvari n'àutra vota.",
'newpassword' => 'Password nova:',
'retypenew' => "Scrivi n'àutra vota la password",
'resetpass_submit' => 'Mposta la password e accedi',
-'resetpass_success' => "Lu canciu password hà statu effittuatu cu successu! Ora stai effittuannu l'accessu...",
+'changepassword-success' => "Lu canciu password hà statu effittuatu cu successu! Ora stai effittuannu l'accessu...",
'resetpass_forbidden' => 'Li password nun ponnu èssiri canciati sùpira sta wiki',
'resetpass-no-info' => 'Pi tràsiri nta sta pàggina hà èssiri riggistratu',
'resetpass-submit-loggedin' => 'Cancia la password',
@@ -647,6 +672,7 @@ Pò èssiri ca ggià canciasti cu successu la tò password o c'addumannasti na n
# Special:PasswordReset
'passwordreset' => 'Resetta la password',
+'passwordreset-text-one' => 'Jinchi stu mòdulu pi reimpostari la password',
# Special:ChangeEmail
'changeemail-submit' => 'Cancia e-mail',
@@ -814,6 +840,7 @@ Nun desi nudda spiecazzioni.",
Pari ca fu scancillata.',
'edit-conflict' => 'Cunflittu di edizzioni.',
'edit-no-change' => 'La mudifica fu ignurata pirchì nu foru appurtati canci ntô testu.',
+'postedit-confirmation' => 'Lu canciamentu fu sarbatu.',
'edit-already-exists' => 'Mpussìbbili criari na nova pàggina.
Esisti ggià.',
@@ -1010,7 +1037,6 @@ S'havi accirtari ca la cuntinuità storica di la pàggina nun veni altirata.",
'searchmenu-legend' => 'Opzioni di circata',
'searchmenu-exists' => "* Pàggina '''[[$1]]'''",
'searchmenu-new' => "'''Crea la pàggina \"[[:\$1]]\" supra sta wiki!'''",
-'searchhelp-url' => 'Help:Cuntinuti',
'searchmenu-prefix' => '[[Special:PrefixIndex/$1|Visualizza li pàggini cu stu prifissu]]',
'searchprofile-articles' => 'Pàggini di cuntinutu',
'searchprofile-project' => "Pàggini d'ajutu e dô pruggettu",
@@ -1052,14 +1078,6 @@ S'havi accirtari ca la cuntinuità storica di la pàggina nun veni altirata.",
'search-external' => 'Ricerca sterna',
'searchdisabled' => 'La circata nterna di {{SITENAME}} hà statu disabbilitata. Nta stu mentri, poi usari la circata supra Google o supra àutri muturi di circata. Accura ca li sò ìnnici dê cuntinuti di {{SITENAME}} ponnu nun èssiri aggiurnati.',
-# Quickbar
-'qbsettings' => 'Pusizzioni QuickBar',
-'qbsettings-none' => 'Nuddu',
-'qbsettings-fixedleft' => 'Fissu a manu manca',
-'qbsettings-fixedright' => 'Fissu a manu dritta',
-'qbsettings-floatingleft' => 'Fluttuanti a manu manca',
-'qbsettings-floatingright' => 'Fluttuanti a manu dritta',
-
# Preferences page
'preferences' => 'prifirenzi',
'mypreferences' => 'Li mè prifirenzi',
@@ -1089,7 +1107,6 @@ S'havi accirtari ca la cuntinuità storica di la pàggina nun veni altirata.",
'resetprefs' => 'Annulla',
'restoreprefs' => 'Ripristina li mpustazzioni di default',
'prefs-editing' => 'Cancia',
-'prefs-edit-boxsize' => 'Diminzioni dâ finestra di mudìfica.',
'rows' => 'Righi:',
'columns' => 'Culonni:',
'searchresultshead' => 'Circata',
@@ -1100,7 +1117,6 @@ S'havi accirtari ca la cuntinuità storica di la pàggina nun veni altirata.",
'recentchangesdays-max' => '(màssimu $1 {{PLURAL:$1|jornu|jorna}})',
'recentchangescount' => 'Nùmmiru di canciamenti da ammustrari di default:',
'prefs-help-recentchangescount' => 'Ciò includi li canciamenti ricenti, storii e riggistri.',
-'prefs-help-watchlist-token' => "Cumpilannu stu campu cu na chiavi sigreta sarà giniratu nu feed RSS pi propri ossirvati spiciali. Chiunqui sa sta chiavi ni stu campu putrà leggiri li osservati speciali, quindi assicurati di nsiriri nu valori sicuru. Ccà c'è nu valori ginirato casualmenti ca si pò usari: $1",
'savedprefs' => 'Li tò prifirenzi foru sarvati.',
'timezonelegend' => 'Fusu orariu:',
'localtime' => 'Uràriu lucali',
@@ -1130,7 +1146,6 @@ S'havi accirtari ca la cuntinuità storica di la pàggina nun veni altirata.",
'prefs-reset-intro' => "È pussibili usari sta pàggina pi reimpustari li propri prifirenzi a chiddi pridifiniti dô situ.
L'operazioni nun pò èssiri annullata.",
'prefs-emailconfirm-label' => 'Conferma dâ e-mail:',
-'prefs-textboxsize' => 'Diminsioni dâ casedda di canciamentu',
'youremail' => 'Lu tò nnirizzu email:',
'username' => "Nomu d'utenti:",
'uid' => 'ID utenti:',
@@ -1350,7 +1365,6 @@ L'operazioni nun pò èssiri annullata.",
'recentchangeslinked-feed' => 'Canciamenti culligati',
'recentchangeslinked-toolbox' => 'Canciamenti culligati',
'recentchangeslinked-title' => 'Canciamenti culligati a "$1"',
-'recentchangeslinked-noresult' => 'Nuddu canciamentu ê pàggini culligati ntô pirìudu spicificatu.',
'recentchangeslinked-summary' => "Chista pàggina spiciali ammustra li canciamenti cchiù ricenti ê pàggini culligati a chidda spicificata. Li pàggini taliati ni la tou [[Special:Watchlist|lista taliata]] sunu evidenziati 'n '''grassettu'''.",
'recentchangeslinked-page' => 'Nnomu dâ pàggina:',
'recentchangeslinked-to' => 'Vidi sulu li canciamenti ê pàggini culligati a chidda spicificata',
@@ -1596,11 +1610,6 @@ Appressu veni ammustrata la discrizioni prisenti nâ [$2 paggina di discrizzioni
'statistics-users-active-desc' => "Utilizzatura chi fìciru n'azzioni {{PLURAL:$1|ni l'ultimu ionnu|nî l'ultimi $1 ionna}}",
'statistics-mostpopular' => 'Pàggini cchiù visitati',
-'disambiguations' => 'Pàggini cu liami ambìgui',
-'disambiguationspage' => 'Template:Disambigua',
-'disambiguations-text' => "Li pàggini ntâ lista ca sequi cuntèninu dî culligamenti a '''pàggini di disambiguazzioni''' e nun a l'argumentu cui avìssiru a fari rifirimentu.<br />
-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.
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.
@@ -1812,10 +1821,9 @@ Protucolli suppurtati: <code>$1</code>',
'unwatchthispage' => 'Smetti di sèquiri',
'notanarticle' => "Nun è n'artìculu",
'notvisiblerev' => 'La revisioni fu cancillata',
-'watchnochange' => 'Nudda dî pàggini ossirvati hà statu canciata ntô pirìudu cunzidiratu.',
'watchlist-details' => 'La lista dê pàggini taliati cunteni {{PLURAL:$1|na pàggina (cu la rispittiva pàggina di discussioni)|$1 pàggini (cu li rispittivi pàggini di discussioni)}}.',
-'wlheader-enotif' => '* La nutìfica via e-mail è attivata.',
-'wlheader-showupdated' => "* Li pàggini ca hannu statu canciati dâ tò ùrtima vìsita sunnu evidinziati 'n '''grassettu'''",
+'wlheader-enotif' => 'La nutìfica via e-mail è attivata.',
+'wlheader-showupdated' => "Li pàggini ca hannu statu canciati dâ tò ùrtima vìsita sunnu evidinziati 'n '''grassettu'''",
'watchmethod-recent' => "cuntrollu dî canciamenti ricenti pi l'ossirvati spiciali",
'watchmethod-list' => "cuntrollu di l'ossirvati spiciali pi canciamenti ricenti",
'watchlistcontains' => 'La tò lista di ossirvati spiciali cunteni {{PLURAL:$1|na pàggina|$1 pàggini}}.',
@@ -2137,11 +2145,8 @@ Pi maggiuri nfurmazzioni, talìa la [[Special:BlockList|lista di l'IP bluccati]]
'ipb_cant_unblock' => 'Erruri: Mpussìbbili attruvari lu bloccu cu ID $1. Putissi aviri già statu sbluccatu.',
'ipb_blocked_as_range' => 'Sbagghiu: Lu ndirizzu IP $1 nun è suggettu a bloccu ndividuali e non pò èssiri sbloccatu. Lu bloccu è attivu mmeci a liveddu dû ntirvallu $2, ca pò èssiri sbluccatu.',
'ip_range_invalid' => 'Ntervallu di ndirizzi IP nun vàlidu.',
-'blockme' => 'Blocca a mia',
'proxyblocker' => 'Blocca proxy',
-'proxyblocker-disabled' => 'Sta funzioni nun è attiva.',
'proxyblockreason' => "Lu tò ndirizzu IP hà statu bluccatu pirchì è un open proxy. Pi favuri cuntatta lu tò furnituri d'accessu a Internet o lu supportu tècnicu e nfòrmali di stu gravi prubbrema di sicurizza.",
-'proxyblocksuccess' => 'Esiquitu.',
'sorbsreason' => 'Lu tò ndirizzu IP è alincatu comu proxy apertu ntâ lista DNSBL.',
'sorbs_create_account_reason' => 'Lu tò ndirizzu IP è alincatu comu open proxy ntâ DNSBL. Nun poi criari un utenti.',
'cant-block-while-blocked' => 'Nun putiti bluccari àutri utenti ntô mentri ca vui stissi siti bluccati.',
@@ -2430,13 +2435,8 @@ Visita [//www.mediawiki.org/wiki/Localisation MediaWiki Localisation] e [//trans
'pageinfo-toolboxlink' => 'Nfurmazzioni ncapu la pàggina',
# Skin names
-'skinname-standard' => 'Classicu',
-'skinname-nostalgia' => 'Nustargìa',
'skinname-cologneblue' => 'Cologne Blu',
'skinname-monobook' => 'MonoBook',
-'skinname-myskin' => 'MySkin',
-'skinname-chick' => 'Chick',
-'skinname-simple' => 'Sìmprici',
'skinname-modern' => 'Mudernu',
# Patrolling
@@ -2521,7 +2521,7 @@ Li lijami succissivi, supra la stissa riga, sunnu cunzidirati comu eccizzioni (p
* gpslongitude
* gpsaltitude",
-# EXIF tags
+# Exif tags
'exif-imagewidth' => 'Larghizza',
'exif-imagelength' => 'Autizza',
'exif-bitspersample' => 'Bit pi campiuni',
@@ -2635,7 +2635,7 @@ Li lijami succissivi, supra la stissa riga, sunnu cunzidirati comu eccizzioni (p
'exif-gpsdatestamp' => 'Data GPS',
'exif-gpsdifferential' => 'Currezzioni diffirinziali GPS',
-# EXIF attributes
+# Exif attributes
'exif-compression-1' => 'Nuddu',
'exif-unknowndate' => 'Data scanusciuta',
@@ -2917,7 +2917,6 @@ Stu còdici di cunferma scadi automaticamenti a li $4.',
'version-other' => 'Àutru',
'version-mediahandlers' => 'Gistori di cuntinuti multimediali',
'version-hooks' => 'Hook',
-'version-extension-functions' => 'Funzioni ntrudotti di estenzioni',
'version-parser-extensiontags' => 'Tag canusciuti dô parser ntrudotti di estenzioni',
'version-parser-function-hooks' => 'Hook pi funzioni dû parser',
'version-hook-name' => "Nomu di l'hook",
@@ -2928,14 +2927,6 @@ Stu còdici di cunferma scadi automaticamenti a li $4.',
'version-software-product' => 'Prodottu',
'version-software-version' => 'Virsioni',
-# Special:FilePath
-'filepath' => 'Pircorsu di nu file',
-'filepath-page' => 'Nnomu dô file:',
-'filepath-submit' => 'Pircorsu',
-'filepath-summary' => 'Sta pàggina spiciali rimanna arredi lu traggittu cumpretu di nu file. Li mmàggini sù ammustrati cu la cchiù àuta risoluzzioni dispunìbbili, pi l\'àutri tipi di file parti direttamenti lu prugramma assuciatu.
-
-Mèttiri lu nomu dû file senza lu prifissu "{{ns:file}}:"',
-
# Special:FileDuplicateSearch
'fileduplicatesearch' => 'Circata dê file duppiuni',
'fileduplicatesearch-summary' => "Circata di pussìbbili dupppiuni dû file 'n basi ô valuri di ''hash''.",
@@ -3011,6 +3002,7 @@ Mèttiri lu nomu dû file senza lu prifissu "{{ns:file}}:"',
'htmlform-submit' => 'Mànna',
'htmlform-reset' => 'Annulla li canciamenti',
'htmlform-selectorother-other' => 'Àutru',
+'htmlform-chosen-placeholder' => 'Silizziona na opzioni',
# New logging system
'logentry-delete-delete' => '$1 cancillau la pàggina $3',
diff --git a/languages/messages/MessagesSco.php b/languages/messages/MessagesSco.php
index 0e7fe6e7..736c64fe 100644
--- a/languages/messages/MessagesSco.php
+++ b/languages/messages/MessagesSco.php
@@ -52,9 +52,6 @@ $messages = array(
'tog-enotifrevealaddr' => 'Shaw ma email address in notification mails',
'tog-shownumberswatching' => 'Shaw the nummer o watching uisers',
'tog-fancysig' => 'Raw seignaturs (athoot automatic airtin)',
-'tog-externaleditor' => 'Uise external editor bi defaut',
-'tog-externaldiff' => 'Uise external diff bi defaut',
-'tog-showjumplinks' => 'Enable "loup til" accessibility airtins',
'tog-uselivepreview' => 'Uise leeve preview (JavaScript) (Prattik)',
'tog-forceeditsummary' => 'Gie me a jottin when A dinnae put in a edit summary',
'tog-watchlisthideown' => 'Hide yer ain edits frae yer watchleet',
@@ -233,7 +230,7 @@ $messages = array(
'jumptonavigation' => 'navigation',
'jumptosearch' => 'rake',
-# 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).
+# 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).
'aboutsite' => 'Aboot {{SITENAME}}',
'aboutpage' => 'Project:Aboot',
'copyright' => 'Aa text is available unner $1',
@@ -243,7 +240,6 @@ $messages = array(
'disclaimers' => 'Disclamation',
'disclaimerpage' => 'Project:General_disclamation',
'edithelp' => 'Editin help',
-'edithelppage' => 'Help:Editin',
'helppage' => 'Help:Contents',
'mainpage' => 'Main Page',
'mainpage-description' => 'Main Page',
@@ -312,8 +308,6 @@ A leet o valid byordinar pages can be funnd at [[Special:SpecialPages|{{int:spec
# General errors
'error' => 'Error',
'databaseerror' => 'Database error',
-'dberrortext' => 'A database query syntax error haes occurt. This micht indicate a bug in the saftware. The last attemptit database query wis: <blockquote><tt>$1</tt></blockquote> frae athin function "<tt>$2</tt>". Database returned error "<tt>$3: $4</tt>".',
-'dberrortextcl' => 'A database query syntax error haes occurt. The last attemptit database query wis: "$1" frae athin function "$2". Database returned error "$3: $4".',
'laggedslavemode' => 'Warning: Page micht nae contain recent updates',
'readonly' => 'Database lockit',
'enterlockreason' => "Enter a raeson for the lock, includin an estimate o whan the lock'll be lowsed",
@@ -359,7 +353,6 @@ Aks: $2',
'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 [//translatewiki.net/wiki/Main_Page?setlang=en translatewiki.net], the MediaWiki localisation project.",
-'sqlhidden' => '(SQL query hidden)',
'cascadeprotected' => 'This page haes been protectit fra editin, acause it is includit in the followin {{PLURAL:$1|page|pages}}, that are protectit wi the "cascading" option turnit on:
$2',
'namespaceprotected' => "Ye dinna hae permeession tae edit pages in the '''$1''' namespace.",
@@ -454,7 +447,7 @@ Ye dinna hae tae heed this message, if this accoont wis creatit by mistak.',
'oldpassword' => 'Auld password',
'newpassword' => 'New passwaird:',
'resetpass_submit' => 'Mak passwaird an log in',
-'resetpass_success' => 'Yer passwaird chynge wis braw! Nou loggin ye in...',
+'changepassword-success' => 'Yer passwaird chynge wis braw! Nou loggin ye in...',
'resetpass_forbidden' => 'Passwords canna be chynged',
'resetpass-no-info' => 'Ye maun be loggit in tae access this page directly.',
'resetpass-submit-loggedin' => 'Chynge passwaird',
@@ -709,7 +702,6 @@ there micht be parteeculars in the [{{fullurl:{{#Special:Log}}/suppress|page={{F
'viewprevnext' => 'View ($1 {{int:pipe-separator}} $2) ($3)',
'searchmenu-exists' => "'''There is a page named \"[[:\$1]]\" oan this wiki.'''",
'searchmenu-new' => "'''Mak the page \"[[:\$1]]\" on this wiki!'''",
-'searchhelp-url' => 'Help:Contents',
'searchprofile-articles' => 'Content pages',
'searchprofile-project' => 'Help and Project pages',
'searchprofile-images' => 'Multimedia',
@@ -739,9 +731,6 @@ there micht be parteeculars in the [{{fullurl:{{#Special:Log}}/suppress|page={{F
'powersearch-toggleall' => 'Aw',
'searchdisabled' => 'Rakin throu {{SITENAME}} is disabled for performance raesons. Ye can rake via Google juist nou. Mynd that thair indexes o {{SITENAME}} content micht be oot o date.',
-# Quickbar
-'qbsettings-none' => 'Nane',
-
# Preferences page
'mypreferences' => 'Ma preferences',
'prefsnologin' => 'No loggit in',
@@ -855,7 +844,6 @@ Yer e-mail address insae revealed whin ither uisers contact ye.",
'recentchangeslinked-feed' => 'Relatit chynges',
'recentchangeslinked-toolbox' => 'Relatit chynges',
'recentchangeslinked-title' => 'Changes related to "$1"',
-'recentchangeslinked-noresult' => "Na changes oan linked pages during th' given period.",
'recentchangeslinked-summary' => "This is a leet o' changes made recently tae pages linked frae a specified page (or tae members o' a specified category).
Pages on [[Special:Watchlist|your watchleet]] are '''bold'''.",
'recentchangeslinked-page' => 'Page name:',
@@ -959,8 +947,6 @@ Th' description oan tis [$2 file description page] thare is shown below.",
'statistics-header-hooks' => 'Ither statistics',
'statistics-pages' => 'Pages',
-'disambiguationspage' => 'Template:disambig',
-
'doubleredirects' => 'Dooble reguidals',
'doubleredirectstext' => 'Ilka raw hauds airtins tae the first an saicont reguidal, as weel as the first line o the saicont reguidal text, for usual giein the "rael" tairget page, that the first reguidal shuid pynt til.',
@@ -1081,7 +1067,6 @@ Also see [[Special:WantedCategories|wanted categories]].',
'watchthispage' => 'Leuk ower this page',
'unwatch' => 'Unwatch',
'notanarticle' => 'No a content page',
-'watchnochange' => 'Nane o yer watched items were edited in the time period displayed.',
'watchlist-details' => "{{PLURAL:$1|$1 page|$1 pages}} on yer watchleet, nae countin' collogue pages.",
'watchlistcontains' => 'Yer watchleet contains $1 {{PLURAL:$1|page|pages}}.',
'iteminvalidname' => "Trouble wi eitem '$1', invalid name...",
@@ -1245,7 +1230,6 @@ tae an afore-blockit IP address or uisername.',
'block-log-flags-nocreate' => 'accoont-makkin blockit',
'range_block_disabled' => 'The administrator abeility tae mak range blocks is disabled.',
'proxyblockreason' => 'Yer IP address haes been blockit sith it is an open proxy. Please contact yer Internet service provider or tech support an inform them o this serious security problem.',
-'proxyblocksuccess' => 'Duin',
'sorbsreason' => 'Yer IP address is leetit as an open proxy in the DNSBL.',
'sorbs_create_account_reason' => 'Yer IP address is leetit as an open proxy in the DNSBL. Ye canna mak an accoont',
@@ -1452,7 +1436,7 @@ If th' file haes bin modified frae tis original state, some details kin nae full
* gpslongitude
* gpsaltitude",
-# EXIF tags
+# Exif tags
'exif-copyright' => 'Copyricht hauder',
'exif-colorspace' => 'Colour space',
'exif-componentsconfiguration' => 'Meanin o ilka component',
@@ -1535,9 +1519,6 @@ Please confirm that ye really want tae recreate this airticle.",
# Core parser functions
'duplicate-defaultsort' => '\'\'\'Wairnin:\'\'\' Default sort key "$2" overrides earlier default sort key "$1".',
-# Special:FilePath
-'filepath-page' => 'File:',
-
# Special:FileDuplicateSearch
'fileduplicatesearch-filename' => 'Filename:',
'fileduplicatesearch-submit' => 'Rake',
diff --git a/languages/messages/MessagesSd.php b/languages/messages/MessagesSd.php
index 1e83fcaa..3e8bbae9 100644
--- a/languages/messages/MessagesSd.php
+++ b/languages/messages/MessagesSd.php
@@ -311,7 +311,7 @@ $messages = array(
'protectedpage' => 'تحÙظيل صÙحو',
'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).
+# 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).
'aboutsite' => '{{SITENAME}} بابت',
'aboutpage' => 'Project:بابت',
'copyright' => 'سمورو مواد $1 تحت ميسر ڪجي ٿو',
@@ -321,7 +321,6 @@ $messages = array(
'disclaimers' => 'غيرجوابداريناما',
'disclaimerpage' => 'Project:عام غيرجوابدارينامو',
'edithelp' => 'مدد براء٠ترميم',
-'edithelppage' => 'Help:سنوارڻ',
'helppage' => 'Help:Ùهرست',
'mainpage' => 'Ù…ÙÚ© صÙحو',
'mainpage-description' => 'Ù…ÙÚ© صÙحو',
@@ -524,7 +523,6 @@ You cannot use the 'e-mail this user' feature unless a valid e-mail address is s
'prevn' => 'پويان {{PLURAL:$1|$1}}',
'nextn' => 'اڳيان {{PLURAL:$1|$1}}',
'viewprevnext' => 'Úسو ($1 {{int:pipe-separator}} $2) ($3)',
-'searchhelp-url' => 'Help:Ùهرست',
'powersearch' => 'Ù†Ùيس ڳولا',
'powersearch-redir' => 'چورڻن جي Ùهرست Úيکاريو',
@@ -584,7 +582,6 @@ $1 {{PLURAL:$1|اکر|اکرن}} کان ننÚÙŠ هوڻ گھرجي.',
'recentchangeslinked-feed' => 'لاڳاپيل تبديليون',
'recentchangeslinked-toolbox' => 'لاڳاپيل تبديليون',
'recentchangeslinked-title' => '"$1" سان لاڳاپيل تبديليون',
-'recentchangeslinked-noresult' => 'ڄاڻايل مدي دوران Ú³Ù†Úيل صÙحن Û¾ ڪا به تبديلي ناهي ٿي.',
# Upload
'upload' => 'Ùائيل چاڙهيو',
@@ -629,8 +626,6 @@ $1 {{PLURAL:$1|اکر|اکرن}} کان ننÚÙŠ هوڻ گھرجي.',
# Statistics
'statistics' => 'انگ اکر',
-'disambiguations' => 'سلجھائپ صÙحا',
-
'doubleredirects' => 'ٻٽا چورڻا',
'brokenredirects' => 'ٽٽل چورڻا',
@@ -912,7 +907,7 @@ $1 {{PLURAL:$1|اکر|اکرن}} کان ننÚÙŠ هوڻ گھرجي.',
'metadata-expand' => 'توسيعي تÙصيل Úيکاريو',
'metadata-collapse' => 'توسيعي تÙصيل لڪايو',
-# EXIF tags
+# Exif tags
'exif-imagewidth' => 'ويڪر',
'exif-imagelength' => 'اوچائي',
'exif-bitspersample' => 'ٻٽڻيون ÙÙŠ جÙز',
diff --git a/languages/messages/MessagesSdc.php b/languages/messages/MessagesSdc.php
index e09bb1f6..2c4cb3b2 100644
--- a/languages/messages/MessagesSdc.php
+++ b/languages/messages/MessagesSdc.php
@@ -133,9 +133,6 @@ $messages = array(
'tog-enotifrevealaddr' => "Rivera lu me' indirizzu di postha erettrònica i' l'imbasciaddi d'avvisu",
'tog-shownumberswatching' => "Musthra lu nùmaru d'utenti ch'àni la pàgina abbaidadda",
'tog-fancysig' => "Interpreta i cumandi wiki i' la fimma (chena cullegaumentu otomatiggu)",
-'tog-externaleditor' => 'Impustha cumenti pridifiniddu un cumponidori di testhi esthernu',
-'tog-externaldiff' => 'Impustha cumenti pridifiniddu un prugramma di diff esthernu',
-'tog-showjumplinks' => "Attiba li cullegamenti atzessibili 'vai a'",
'tog-uselivepreview' => "Attiba la funzioni ''Live preview'' (dumanda JavaScript; ippirimintari)",
'tog-forceeditsummary' => "Dumanda cunfèimma si l'oggettu di la mudìfigga è bioddu",
'tog-watchlisthideown' => "Cua li me' mudìfigghi i' l'abbaidaddi ippiziari",
@@ -296,7 +293,7 @@ $messages = array(
'jumptonavigation' => 'nabiggazioni',
'jumptosearch' => 'zercha',
-# 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).
+# 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).
'aboutsite' => 'Infuimmazioni in {{SITENAME}}',
'aboutpage' => 'Project:Infuimmazioni',
'copyright' => "Cuntinuddi suggetti a licèntzia d'usu $1.",
@@ -306,7 +303,6 @@ $messages = array(
'disclaimers' => 'Avvirthènzi',
'disclaimerpage' => 'Project:Avvirthènzi ginarari',
'edithelp' => 'Ghia',
-'edithelppage' => 'Help:Mudìfigga',
'helppage' => 'Help:Indizi',
'mainpage' => 'Pàgina prinzipari',
'mainpage-description' => 'Pàgina prinzipari',
@@ -370,17 +366,6 @@ $messages = array(
# General errors
'error' => 'Errori',
'databaseerror' => 'Errori di la bancadati',
-'dberrortext' => 'Errori di sintassi i\' la prigonta inviadda a la bancadati.
-Lu chi pudaria indicà la prisènzia d\'un bacu i\' lu software.
-L\'ulthima interrogazioni inviadda a la bancadati è isthadda:
-<blockquote><tt>$1</tt></blockquote>
-riciamadda da la funzioni "<tt>$2</tt>".
-MySQL à turraddu lu sighenti errori "<tt>$3: $4</tt>".',
-'dberrortextcl' => 'Errori di sintassi i\' la prigonta inviadda a la bancadati.
-L\'ulthima interrogazioni inviadda a la bancadati è isthadda:
-"$1"
-riciamadda da la funzioni "$2".
-MySQL à turraddu lu sighenti errori "$3: $4".',
'laggedslavemode' => "Attinzioni: la pàgina pudia no cuntinì l'aggiornamenti più rizzenti.",
'readonly' => 'Bancadati broccadda',
'enterlockreason' => 'Indica lu mutibu di lu broccu, ippizzifichendi candu po’ assé chi venghia buggaddu.',
@@ -423,7 +408,6 @@ Interrogazioni: $2",
'viewsourcetext' => 'È pussìbiri visuarizzà e cupià lu còdizi di chistha pàgina:',
'protectedinterface' => "Chistha pàgina cunteni un'erementu chi fazzi parthi di l'interfàccia utenti di lu software; è dunca prutiggidda pa evità pussìbiri abusi.",
'editinginterface' => "'''Attinzioni:''' Lu testhu di chistha pàgina fazzi parthi di l'interfàccia utenti di lu situ. Tutti li mudìfigghi arriggaddi a chistha pàgina si rifrèttini i' l'imbasciaddi visuarizzaddi pa tutti l'utenti. Pa li traduzioni, pa piazeri utirizà [//translatewiki.net/wiki/Main_Page?setlang=sdc translatewiki.net], lu prugettu di lucarizazioni MediaWiki.",
-'sqlhidden' => "(l'interrogazioni SQL è isthadda cuadda)",
'cascadeprotected' => 'In chistha pàgina nò è pussìbiri effettuà mudìfigghi parchí è isthadda incrusa {{PLURAL:$1|i la sighenti pàgina indicadda, ch\'è isthadda prutiggidda|i li sighenti pàgini indicaddi, chi so isthaddi prutiggiddi}} chirriendi la prutizioni "ricussiba":
$2',
'namespaceprotected' => "Nò si diponi di li pimmissi nezzessàri pa mudifiggà li pagini di lu tipu di pagina '''$1'''.",
@@ -512,7 +496,7 @@ Pa cumprità la registhrazioni è nezzessàriu impusthà una noba paràura d'ór
'newpassword' => "Noba paràura d'órdhini:",
'retypenew' => "Turra a ischribì la noba paràura d'órdhini:",
'resetpass_submit' => "Impustha la paràura d'órdhini e intra",
-'resetpass_success' => "La paràura d'órdhini tóia è isthadda mudìfiggadda. Abà sei intrendi...",
+'changepassword-success' => "La paràura d'órdhini tóia è isthadda mudìfiggadda. Abà sei intrendi...",
'resetpass_forbidden' => "No è pussìbiri mudifiggà li paràuri d'órdhini in {{SITENAME}}.",
# Edit page toolbar
@@ -776,7 +760,6 @@ Cunsulthà lu [{{fullurl:{{#Special:Log}}/suppress|page={{FULLPAGENAMEE}}}} rigi
'nextn' => 'sighenti {{PLURAL:$1|$1}}',
'viewprevnext' => 'Vèdi ($1 {{int:pipe-separator}} $2) ($3).',
'searchmenu-legend' => 'Opzioni di zercha',
-'searchhelp-url' => 'Help:Indizi',
'searchprofile-everything' => 'Tuttu',
'search-result-size' => '$1 ({{PLURAL:$2|una paraura|$2 parauri}})',
'search-redirect' => '(rinviu $1)',
@@ -800,14 +783,6 @@ Cunsulthà lu [{{fullurl:{{#Special:Log}}/suppress|page={{FULLPAGENAMEE}}}} rigi
'powersearch-togglenone' => 'Nisciunu',
'searchdisabled' => 'Abà no pói zirchà in {{SITENAME}}; proba cun Google o sìmiri, ma ammèntaddi chi li cuntinuddi di {{SITENAME}} poni assé no aggiornaddi.',
-# Quickbar
-'qbsettings' => 'Prifirenzi di lu menù',
-'qbsettings-none' => 'Nisciunu',
-'qbsettings-fixedleft' => 'Fissu a manca',
-'qbsettings-fixedright' => 'Fissu a drestha',
-'qbsettings-floatingleft' => 'Galliggianti a manca',
-'qbsettings-floatingright' => 'Galliggianti a drestha',
-
# Preferences page
'preferences' => 'Prifirenzi',
'mypreferences' => "Li me' prifirenzi",
@@ -951,7 +926,6 @@ Cunsulthà lu [{{fullurl:{{#Special:Log}}/suppress|page={{FULLPAGENAMEE}}}} rigi
'recentchangeslinked-feed' => 'Mudìfigghi curriraddi',
'recentchangeslinked-toolbox' => 'Mudìfigghi curriraddi',
'recentchangeslinked-title' => 'Mudìfigghi curriraddi a "$1"',
-'recentchangeslinked-noresult' => "Nisciuna mudìfigga a li pàgini curriraddi i' lu perìodu sciubaraddu.",
'recentchangeslinked-summary' => "Chistha pàgina ippiziari musthra li mudìfigghi più rizzenti a li pàgini curriraddi a chidda sciubaradda (o a li membri di un'ippizzifica categuria). Li [[Special:Watchlist|pàgini abbaidaddi]] so evidenziaddi in '''grasseddu'''.",
'recentchangeslinked-page' => 'Innòmmu di la pàgina:',
'recentchangeslinked-to' => 'Musthra soru li mudifigghi a li pagini curriraddi a chidda isciubaradda',
@@ -1128,10 +1102,6 @@ Si si diponi di l'immàgina i' la risoruzioni originari, pa piazeri carriggalla.
'statistics-pages' => 'Pagini',
'statistics-mostpopular' => 'Pàgini più visitaddi',
-'disambiguations' => 'Pàgini cu lu matessi innòmmu',
-'disambiguationspage' => 'Template:Matessi innòmmu',
-'disambiguations-text' => "Li pàgini i' la sighenti listha cuntènani cullegamenti a '''pàgini cu' lu matessi innòmmu''' e nò a la rasgiòni a chi dubaristhia fà rifirimentu.<br />So cunsidaraddi pàgini cu lu matessi innòmmu tutti chissi chi cuntènini li mudelli erencaddi in [[MediaWiki:Disambiguationspage]].",
-
'doubleredirects' => 'Rinvii doppi',
'doubleredirectstext' => 'Inogghi v\'è una listha di li pàgini chi puntani a pàgini di rinviu. Ogna riga cunteni i cullegamenti a lu primmu e sigundu rinviu, cumenti a la disthinazioni di lu sigundu rinviu, che noimmaimmenti è la pàgina "curretta" a la quari dubia puntà puru lu primmu rinviu.',
@@ -1283,10 +1253,9 @@ Si daboi s'à gana d'eliminà la pàgina da la listha di l'abbaidaddi ippiziarii
'unwatchthispage' => 'Zissa di sighì',
'notanarticle' => 'Chistha pàgina nò è una bozi',
'notvisiblerev' => 'La ribisioni è isthadda canzilladda',
-'watchnochange' => "Nisciuna di li pàgini abbaidaddi è isthadda mudìfiggadda i' lu perìodu cunsidaraddu.",
'watchlist-details' => "La listha di l'abbaidaddi ippiziari cunteni {{PLURAL:$1|una pagina (e la rippettiba pagina di dischussioni)|$1 pagini (e li rippettibi pagini di dischussioni)}}.",
-'wlheader-enotif' => '* La nutìfica via postha erettrònica è attiba.',
-'wlheader-showupdated' => "* Li pàgini chi so isthaddi mudìfiggaddi daboi l'ulthima vìsita so evidenziaddi in '''grasseddu'''",
+'wlheader-enotif' => 'La nutìfica via postha erettrònica è attiba.',
+'wlheader-showupdated' => "Li pàgini chi so isthaddi mudìfiggaddi daboi l'ulthima vìsita so evidenziaddi in '''grasseddu'''",
'watchmethod-recent' => "cuntrollu di li mudìfigghi rizzenti pa l'abbaidaddi ippiziari",
'watchmethod-list' => "cuntrollu di l'abbaidaddi ippiziari pa mudìfigghi rizzenti",
'watchlistcontains' => "La listha di l'abbaidaddi ippiziari cunteni {{PLURAL:$1|una pàgina|$1 pàgini}}.",
@@ -1544,11 +1513,8 @@ $1",
'ipb_cant_unblock' => 'Errori: Impussìbiri acciappà lu broccu cun ID $1. Lu broccu pudia assé già isthaddu buggaddu.',
'ipb_blocked_as_range' => "Errori: L'indirizzu IP $1 nò è broccaddu individuaimmenti e nò pó assé ibbruccaddu. Lu broccu è inveci attibu a libellu di l'intervallu $2, chi pó assé ibbruccaddu.",
'ip_range_invalid' => "Intervallu d'indirizzi ip nò vàriddu.",
-'blockme' => 'Broccami',
'proxyblocker' => 'Broccu di li proxy abbérthi',
-'proxyblocker-disabled' => 'Chistha funzioni nò è attiba.',
'proxyblockreason' => "Chisth'indirizzu IP è isthaddu broccaddu parchí risultha assé un proxy abbérthu. Pa piazeri cuntattà lu propriu frunidori di sivvìzi pa la reti pa infuimmalli di chisthu grabi probrema di sigguriddai.",
-'proxyblocksuccess' => 'Broggu eseguiddu.',
'sorbsreason' => "Chisth'indirizzu IP è erencaddu cumenti proxy abbérthu i' la listha-niedda DNSBL utirizadda da {{SITENAME}}.",
'sorbs_create_account_reason' => "Nò è pussìbiri crià nobi registhrazioni da chisthu indirizzu IP parchí è erencaddu cumenti proxy abbérthu i' la listha-niedda DNSBL utirizadda da {{SITENAME}}.",
@@ -1841,7 +1807,7 @@ So cunsidaraddi soru l'erenchi puntaddi (righi ch'ischumenzani cu' lu caràtteri
* gpslongitude
* gpsaltitude",
-# EXIF tags
+# Exif tags
'exif-imagewidth' => 'Larghèzia',
'exif-imagelength' => 'Althèzia',
'exif-bitspersample' => 'Bit pa campioni',
@@ -2017,11 +1983,6 @@ Pa piazeri, cunfèimma chi vòi ricrià avveru chistha pàgina.",
'version-other' => 'Althru',
'version-software-version' => 'Versioni',
-# Special:FilePath
-'filepath' => "Parchossu d'un file",
-'filepath-page' => 'Innommu di lu file:',
-'filepath-submit' => 'Parchossu',
-
# Special:FileDuplicateSearch
'fileduplicatesearch-legend' => "Zercha d'un dupricaddu",
'fileduplicatesearch-filename' => 'Innòommu di lu file:',
diff --git a/languages/messages/MessagesSe.php b/languages/messages/MessagesSe.php
index 9565ae27..32339884 100644
--- a/languages/messages/MessagesSe.php
+++ b/languages/messages/MessagesSe.php
@@ -52,12 +52,13 @@ $specialPageAliases = array(
'Block' => array( 'Hehtte', 'Hehtte_geavaheaddji', 'Hehtte_IP' ),
'Blockme' => array( 'Hehtte_mu' ),
'Booksources' => array( 'Girjegáldut' ),
- 'BrokenRedirects' => array( 'Feaillalaš_stivremat', 'Feaillalaš_ođđasitstivremat' ),
+ 'BrokenRedirects' => array( 'Boatkanan_stivremat', 'Boatkanan_ođđasitstivremat' ),
'Categories' => array( 'Kategoriijat' ),
+ 'ChangeEmail' => array( 'Rievdat_E-poastta' ),
'ComparePages' => array( 'Veardit_siidduid' ),
'Confirmemail' => array( 'Sihkaraste_e-poastta' ),
'Contributions' => array( 'Rievdadusat' ),
- 'CreateAccount' => array( 'Ráhkat_dovddaldaga' ),
+ 'CreateAccount' => array( 'Ráhkat_dovddaldaga', 'Ráhkat_konttu' ),
'DeletedContributions' => array( 'Sihkkojuvvon_rievdadusat' ),
'Disambiguations' => array( 'Liŋkkat_dárkonsiidduide' ),
'DoubleRedirects' => array( 'Guoktegeardásaš_ođđasitstivremat' ),
@@ -69,7 +70,7 @@ $specialPageAliases = array(
'Listadmins' => array( 'Administráhtorlistu', 'Listu_administráhtoriin' ),
'Listbots' => array( 'Bohttalistu', 'Listu_bohtain' ),
'Listfiles' => array( 'Fiilalogahallan' ),
- 'Listgrouprights' => array( 'Listu_joavkkuid_vuoigavuođain' ),
+ 'Listgrouprights' => array( 'Listu_joavkkuid_vuoigatvuođain' ),
'Listredirects' => array( 'Stivrenlistu', 'Listu_stivremiin', 'Listu_ođđasitstivremiin' ),
'Listusers' => array( 'Geavaheaddjelistu', 'Listu_geavaheddjiin' ),
'Log' => array( 'Loggat', 'Logga' ),
@@ -95,10 +96,10 @@ $specialPageAliases = array(
'Specialpages' => array( 'Erenoamáš_siiddut', 'Doaibmasiiddut' ),
'Statistics' => array( 'Statistihkat' ),
'Unblock' => array( 'Sihko_hehttema' ),
- 'Uncategorizedcategories' => array( 'Kategoriserekeahtes_kategoriijat' ),
- 'Uncategorizedimages' => array( 'Kategoriserekeahtes_govat', 'Kategoriserekeahtes_fiillat' ),
- 'Uncategorizedpages' => array( 'Kategoriserekeahtes_siiddut' ),
- 'Uncategorizedtemplates' => array( 'Kategoriserekeahtes_mállet' ),
+ 'Uncategorizedcategories' => array( 'Klassifiserekeahtes_kategoriijat' ),
+ 'Uncategorizedimages' => array( 'Klassifiserekeahtes_fiillat', 'Klassifiserekeahtes_govat' ),
+ 'Uncategorizedpages' => array( 'Klassifiserekeahtes_siiddut' ),
+ 'Uncategorizedtemplates' => array( 'Klassifiserekeahtes_mállet' ),
'Undelete' => array( 'Máhccat' ),
'Unusedcategories' => array( 'Geavatkeahtes_kategoriijat' ),
'Unusedimages' => array( 'Geavatkeahtes_govat', 'Geavatkeahtes_fiillat' ),
@@ -119,7 +120,22 @@ $specialPageAliases = array(
$magicWords = array(
'redirect' => array( '0', '#STIVREN', '#OÄÄASITSTIVREN', '#REDIRECT' ),
- 'numberofarticles' => array( '1', 'ARTIHKKALIIDMEARRI', 'NUMBEROFARTICLES' ),
+ 'notoc' => array( '0', '__IISISDOALLU__', '__IISIS__', '__NOTOC__' ),
+ 'nogallery' => array( '0', '__IIGALLERIIJA__', '__NOGALLERY__' ),
+ 'toc' => array( '0', '__SISDOALLU__', ' __SIS__', '__TOC__' ),
+ 'noeditsection' => array( '0', '__IIRIEVDADITOASI__', '__NOEDITSECTION__' ),
+ 'numberofarticles' => array( '1', 'ARTIHKKALIIDMEARRI', ' ARTIHKALMEARRI', 'NUMBEROFARTICLES' ),
+ 'numberoffiles' => array( '1', 'FIILLAIDMEARRI', 'FIILAMEARRI', ' GOVAIDMEARRI', ' GOVVAMEARRI', 'NUMBEROFFILES' ),
+ 'numberofusers' => array( '1', 'GEAVAHEDDJIIDMEARRI', ' GEAVAHEADDJIMEARRI', ' GEAVAHEADDJEMEARRI', 'NUMBEROFUSERS' ),
+ 'numberofactiveusers' => array( '1', 'AKTIIVAGEAVAHEDDJIIDMEARRI', ' AKTIIVAGEAVAHEADDJIMEARRI', ' AKTIIVAGEAVAHEADDJEMEARRI', 'NUMBEROFACTIVEUSERS' ),
+ 'numberofedits' => array( '1', 'RIEVDADUSAIDMEARRI', ' RIEVDADUSMEARRI', 'NUMBEROFEDITS' ),
+ 'subst' => array( '0', 'LIIBME:', 'SUBST:' ),
+ 'img_thumbnail' => array( '1', 'mini', 'thumbnail', 'thumb' ),
+ 'img_manualthumb' => array( '1', 'mini=$1', 'thumbnail=$1', 'thumb=$1' ),
+ 'img_right' => array( '1', 'olgeš', 'right' ),
+ 'img_left' => array( '1', 'gurut', 'left' ),
+ 'img_center' => array( '1', 'gasku', 'center', 'centre' ),
+ 'img_link' => array( '1', 'liŋka=$1', 'link=$1' ),
);
$separatorTransformTable = array( ',' => "\xc2\xa0", '.' => ',' );
@@ -306,7 +322,7 @@ $messages = array(
'jumptonavigation' => 'navigašuvdnii',
'jumptosearch' => 'ohcamii',
-# 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).
+# 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).
'aboutsite' => '{{SITENAME}} birra',
'aboutpage' => 'Project:Dieđut',
'copyright' => 'Sisdoalu sáhttá geavahit liseanssain $1.',
@@ -315,7 +331,6 @@ $messages = array(
'disclaimers' => 'Friijavuohta vástideamis',
'disclaimerpage' => 'Project:Friijavuohta vástideamis',
'edithelp' => 'Rievdadanrávvagat',
-'edithelppage' => 'Help:Mo rievdadit siidduid',
'helppage' => 'Help:Sisdoallu',
'mainpage' => 'Váldosiidu',
'mainpage-description' => 'Váldosiidu',
@@ -382,7 +397,6 @@ $messages = array(
'viewsource' => 'GeahÄa gáldu',
'protectedpagetext' => 'Dát siidu lea suodjaluvvon rievdadusain.',
'viewsourcetext' => 'Sáhtát geahÄat ja kopieret dán siiddu gáldokoda:',
-'sqlhidden' => '(SQL-jearahallan lea Äihkojuvvon)',
# Login and logout pages
'logouttext' => "'''Don leat dál loggen olggos {{GRAMMAR:elative|{{SITENAME}}}}s.'''
@@ -447,7 +461,7 @@ Sáhtát joatkit {{GRAMMAR:genitive|{{SITENAME}}}} geavaheami anonyman dahje log
'newpassword' => 'Ođđa suollemassátni',
'retypenew' => 'Ođđa suollemassátni ođđasit',
'resetpass_submit' => 'Čále suollemassáni ja ÄálligoaÄ‘e sisa',
-'resetpass_success' => 'Suollemassáni rievdadeapmim lihkosmuvai.',
+'changepassword-success' => 'Suollemassáni rievdadeapmim lihkosmuvai.',
'resetpass_forbidden' => 'Suollemassániid rievdan ii lihkosmuva dán wikis.',
'resetpass-submit-loggedin' => 'Molsso suollemassáni',
@@ -603,7 +617,6 @@ Eará bajasdoallit sáhtet lohkat Äihkojuvvon sisdoalu ja máhcahit dan.",
$1 {{int:pipe-separator}} $2',
'searchmenu-new' => "'''Ãlggat siiddu ''[[:$1]]'' dán Wikipediai'''",
-'searchhelp-url' => 'Help:Rávvagat',
'searchprofile-articles' => 'Sisdoallosiiddut',
'searchprofile-project' => 'Veahkke- ja prošeaktasiiddut',
'searchprofile-everything' => 'Buot',
@@ -617,13 +630,6 @@ $1 {{int:pipe-separator}} $2',
'powersearch-toggleall' => 'Buot',
'powersearch-togglenone' => 'Ii mihkkege',
-# Quickbar
-'qbsettings-none' => 'Ii maidige',
-'qbsettings-fixedleft' => 'Teaksta mielde, gurut',
-'qbsettings-fixedright' => 'Teaksta mielde, olgeš',
-'qbsettings-floatingleft' => 'Biso gurutbealde',
-'qbsettings-floatingright' => 'Biso olgesbealde',
-
# Preferences page
'preferences' => 'Ãsahusat',
'mypreferences' => 'Ãsahusat',
@@ -884,8 +890,6 @@ $1 {{int:pipe-separator}} $2',
'statistics-users-active-desc' => 'Geavaheaddjit, geat leat bargan juoidá maŋimus {{PLURAL:$1|beaivvi|$1 beaivvi}} áigge.',
'statistics-mostpopular' => 'Eanemusta gehÄojuvvon siiddut',
-'disambiguations' => 'Liŋkkat dárkonsiidduide',
-
'doubleredirects' => 'Guovttegeardán ođđasitstivremat',
'brokenredirects' => 'Bieđganan ođđasitstivremat',
@@ -1030,10 +1034,9 @@ Also see [[Special:WantedCategories|wanted categories]].',
'unwatch' => 'Heaite Äuovvumis',
'unwatchthispage' => 'Heaite Äuovvumis',
'notanarticle' => 'Ii leat siidu',
-'watchnochange' => 'Válljejuvvon áigodagas oktage du Äuovvunlisttui gullevaÅ¡ siidu leat rievdaduvvon.',
'watchlist-details' => 'Du Äuovvunlisttus {{PLURAL:$1|lea $1 siidu|leat $1 siiddu}}. Lohkui eai leat váldojuvvon ságastallansiidduid.',
-'wlheader-enotif' => '* E-poastaalmmuhusat leat anus.',
-'wlheader-showupdated' => "* Siiddut, mat leat rievdaduvvon du maŋimus geavahangearddi maŋŋá leat merkojuvvon '''buoiddes teavsttain'''",
+'wlheader-enotif' => 'E-poastaalmmuhusat leat anus.',
+'wlheader-showupdated' => "Siiddut, mat leat rievdaduvvon du maŋimus geavahangearddi maŋŋá leat merkojuvvon '''buoiddes teavsttain'''",
'watchmethod-recent' => 'dárkistuvvo varas rievdadusat Äuovvunlisttu siidduide',
'watchmethod-list' => 'dárkistuvvo Äuovvunlisttu siidduid varas rievdadusat',
'watchlistcontains' => 'Du Äuovvunlisttus {{PLURAL:$1|lea okta siidu|leat $1 siiddu}}.',
@@ -1211,7 +1214,6 @@ Siiddus $2 lea listu maŋimus sihkomiin.',
'blocklink' => 'hehtte',
'contribslink' => 'rievdadusat',
'blocklogentry' => 'esttii geavaheaddji dahje IP-Äujuhusa [[$1]], eastima bistin lea $2 $3',
-'proxyblocksuccess' => 'Gárvvis.',
# Developer tools
'lockdb' => 'Gidde diehtovuođu',
@@ -1351,7 +1353,7 @@ Siiddus $2 lea listu maŋimus sihkomiin.',
'metadata-expand' => 'Čájet buot sisdoallogovvádusaid',
'metadata-collapse' => 'Čájet beare dehaleamos sisdoallogovvádusaid',
-# EXIF tags
+# Exif tags
'exif-imagewidth' => 'Viidodat',
'exif-imagelength' => 'Allodat',
'exif-bitspersample' => 'Bihtá komponeanttas',
diff --git a/languages/messages/MessagesSei.php b/languages/messages/MessagesSei.php
index 8d3ebd65..e1d8e0d1 100644
--- a/languages/messages/MessagesSei.php
+++ b/languages/messages/MessagesSei.php
@@ -42,9 +42,6 @@ $messages = array(
'tog-enotifrevealaddr' => 'Xuniim henadressade e-iitom notificacionde e-iitóm',
'tog-shownumberswatching' => 'Cohuatlöx caitóm cáminotómde numberam',
'tog-fancysig' => 'Signaturenám brazzinám (sans linkám automaticám)',
-'tog-externaleditor' => 'Usadad ticpatlöx externöx auto',
-'tog-externaldiff' => 'Usadad diff extern auto',
-'tog-showjumplinks' => 'Záj "jumpöx" accessibilitiit linkám',
'tog-uselivepreview' => 'Usadad cuáxiit live (JavaScript) (Experimentam)',
'tog-forceeditsummary' => 'Ixuniimticpatlöx he jan nenenterom abvuatlde ticpatlöx',
'tog-watchlisthideown' => 'Cíiitám he ticpatlöxde listade cáminot zo',
@@ -190,7 +187,7 @@ $messages = array(
'jumptonavigation' => 'navigacion',
'jumptosearch' => 'Yahöx',
-# 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).
+# 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).
'aboutsite' => '{{SITENAME}} mii',
'aboutpage' => 'Project:Miilà',
'copyright' => 'Contentua coitáamb $1 tan.',
@@ -200,7 +197,6 @@ $messages = array(
'disclaimers' => 'Isój cacóomx',
'disclaimerpage' => 'Project:Isoj cacóomx geniiraloj',
'edithelp' => 'Help ticpatlöx',
-'edithelppage' => 'Help:Ticpatlöx',
'helppage' => 'Help:Caálixötöj',
'mainpage' => 'Caálixötöj',
'mainpage-description' => 'Caálixötöj',
@@ -262,17 +258,6 @@ Meccan páhina extrava valide pac [[Special:SpecialPages]] iti.',
# General errors
'error' => 'Römj',
'databaseerror' => 'Römjde database',
-'dberrortext' => 'Römjde syntaxde database query coccebj icmaaniit.
-Jan pos-coccebj bug zo software zo iti.
-Hunattemptöx database query coccebjöx:
-<blockquote><tt>$1</tt></blockquote>
-funccion xi "<tt>$2</tt>".
-MySQL returnöx römj iti "<tt>$3: $4</tt>".',
-'dberrortextcl' => 'Römjde syntaxde database query coccebj icmaaniit.
-Hunattemptöx database query coccebjöx:
-"$1"
-funccion xi "$2".
-MySQL returnöx römj iti "$3: $4"',
'laggedslavemode' => 'Attencion: Páhina necoccebj updatenám cmaa.',
'readonly' => 'Database protectáme',
'enterlockreason' => 'Enterom raede lockom zo, includom estimacionde janxepe lockom zo releasom',
@@ -308,7 +293,6 @@ Query: $2',
'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 [//translatewiki.net/wiki/Main_Page?setlang=en translatewiki.net], the MediaWiki localisation project.",
-'sqlhidden' => '(SQL querynam cíiitámöx)',
'cascadeprotected' => 'Jan páhina coccebj protectöxde ticpatlöx, zo coccebj cascadande jan {{PLURAL:$1|páhina|páhinám}}, jan coccebj protëctox cascadanöx opcion zo mii:
$2',
'namespaceprotected' => "Me necoccebj permiccion ticpatlöx páhinám '''$1''' ipartuatl zo iti.",
@@ -386,7 +370,7 @@ confirmom account zo coccebj de'me.",
'newpassword' => 'Hunquimx canj:',
'retypenew' => 'Vanhunquimx canj:',
'resetpass_submit' => 'Vanquimx canj ö caápo',
-'resetpass_success' => 'Me quimx canj coccebj quiixde success! Caápo cmaa...',
+'changepassword-success' => 'Me quimx canj coccebj quiixde success! Caápo cmaa...',
'resetpass_forbidden' => 'Quimx cánj nereset jan wiki iti',
# Edit page toolbar
@@ -579,13 +563,8 @@ Informacion: (curt) = quiíxde vercion currentua,
'prevn' => 'jan {{PLURAL:$1|$1}}',
'nextn' => 'hun {{PLURAL:$1|$1}}',
'viewprevnext' => 'Cohuatlöx ($1 {{int:pipe-separator}} $2) ($3)',
-'searchhelp-url' => 'Help:Caálixötöj',
'powersearch' => 'Yahöx',
-# Quickbar
-'qbsettings' => 'Zuónaát',
-'qbsettings-none' => 'Nepartám',
-
# Preferences page
'preferences' => 'Quáatlaác',
'mypreferences' => 'Hequáatlaác',
@@ -1023,7 +1002,7 @@ iitom e-iitomde diijömde caitóm.',
'ilsubmit' => 'Yahöx',
'bydate' => 'de datum',
-# EXIF tags
+# Exif tags
'exif-fnumber' => 'F Numberam',
'exif-gpslatitude' => 'Latitudam',
'exif-gpslongitude' => 'Longitudam',
diff --git a/languages/messages/MessagesSg.php b/languages/messages/MessagesSg.php
index c8f15a86..a0cff5af 100644
--- a/languages/messages/MessagesSg.php
+++ b/languages/messages/MessagesSg.php
@@ -137,6 +137,7 @@ $messages = array(
'qbbrowse' => 'Hasa',
'qbedit' => 'Sepe',
'qbpageoptions' => 'Lêmbëtï sô',
+'qbpageinfo' => 'Ndongoro',
'qbmyoptions' => 'Âlêmbëtï tî mbï',
'qbspecialpages' => 'Âlêmbëtï ndê',
'faq' => 'Âhûnda',
diff --git a/languages/messages/MessagesSgs.php b/languages/messages/MessagesSgs.php
index 0411b80c..95e53d89 100644
--- a/languages/messages/MessagesSgs.php
+++ b/languages/messages/MessagesSgs.php
@@ -87,9 +87,6 @@ $messages = array(
'tog-shownumberswatching' => 'Ruodītė keravuojantiu nauduotuoju skatliu',
'tog-oldsig' => 'Esams parašos:',
'tog-fancysig' => 'ParaÅ¡os kÄp wiki tekstos (ba autuomatÄ—niu nÅ«ruodu)',
-'tog-externaleditor' => 'Vagol nutÄ«liejÄ—ma nauduotÄ— Ä—Å¡uorini radaktuoriu (tÄ—ktÄs specam, rÄ“k specÄ“liÅ« nustatÄ«mu kompioteriÅ. [//www.mediawiki.org/wiki/Manual:External_editors Daugiau infuormacÄ—jÄ—s.])',
-'tog-externaldiff' => 'PalÄ“ nutÄ«liejÄ—ma nauduotÄ— Ä—Å¡uorinÄ— skÄ—rtomu ruodÄ«ma pruograma (tÄ—ktÄs specam, rÄ“k specÄ“liÅ« nustatÄ«mu kompioteriÅ. [//www.mediawiki.org/wiki/Manual:External_editors Daugiau infuormacÄ—jÄ—s.])',
-'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šė',
@@ -281,7 +278,7 @@ Prašuom palaukat ė mieginkat i ton poslapi patekt vieliau.
$1',
'pool-errorunknown' => 'Nežėnuoma 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).
+# 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).
'aboutsite' => 'Aple {{SITENAME}}',
'aboutpage' => 'Project:Aple',
'copyright' => 'Turinīs pateikts so $1 licencėjė.',
@@ -291,7 +288,6 @@ $1',
'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',
@@ -385,7 +381,6 @@ Ožklausėms: $2',
'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Ä— [//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ė.',
@@ -473,7 +468,7 @@ nebus siontamas ni vÄ—inam žemiau Ä—Å¡vardÄ—ntam puoslaugiÅ.',
'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...',
+'changepassword-success' => 'Tamstas slaptažuodis pakeists siekmÄ—ngÄ! Daba prÄ—sÄ—jongiama...',
'resetpass-temp-password' => 'Laikėns slaptažuodis:',
# Edit page toolbar
@@ -725,7 +720,6 @@ Kėtė admėnėstratuorē šėtom pruojekte vėsdar galės pasėiktė pasliepta
'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' => 'Pagelbas ė pruojekta poslapē',
@@ -762,10 +756,6 @@ Kėtė admėnėstratuorē šėtom pruojekte vėsdar galės pasėiktė pasliepta
'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Ä',
@@ -790,7 +780,6 @@ Kėtė admėnėstratuorē šėtom pruojekte vėsdar galės pasėiktė pasliepta
'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Ä',
@@ -928,7 +917,6 @@ Ana gal sodarÄ«tÄ— ne daugiau kÄp $1 {{PLURAL:$1|sÄ—mbuolis|sÄ—mbuolÄ“|sÄ—mbuol
'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',
@@ -1102,9 +1090,6 @@ Infuormacėjė ėš [$2 faila aprašīma poslapė] īr pateikta žemiau.',
'statistics-users-active' => 'Aktīviu nauduotuoju',
'statistics-mostpopular' => 'Daugiausē ruodītė poslapē',
-'disambiguations' => 'Daugiareikšmiu žuodiu poslapē',
-'disambiguationspage' => 'Template:Tor daug reikšmiū',
-
'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]]',
@@ -1268,10 +1253,9 @@ Jēgo bikumet ožsėnuorietomiet liautėis keravuotė straipsnė, spauskat \"neb
'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Ä'''",
+'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}}.',
@@ -1548,7 +1532,6 @@ onkstiau ožbluokoutam IP adresÅ a nauduotuojÅ.',
'ipb_expiry_invalid' => 'GaliuojÄ—ma Äiesos nelaistÄ—ns.',
'ipb_already_blocked' => '„$1“ jau ožblokouts',
'ipb-needreblock' => '$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
@@ -1773,7 +1756,7 @@ Vėsas kėtas nūoruodas tuo patiuo eilotie īr laikomas ėšėmtim, tas rēšk
* gpslongitude
* gpsaltitude',
-# EXIF tags
+# Exif tags
'exif-imagewidth' => 'Platoms',
'exif-imagelength' => 'Aukštoms',
'exif-orientation' => 'Pasokims',
@@ -1908,10 +1891,6 @@ Tamsta tēpuogi galėt [[Special:EditWatchlist/raw|redagoutė grīnaji keravuoja
'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',
diff --git a/languages/messages/MessagesSh.php b/languages/messages/MessagesSh.php
index 2b8efea8..5bafdd5b 100644
--- a/languages/messages/MessagesSh.php
+++ b/languages/messages/MessagesSh.php
@@ -8,6 +8,7 @@
* @file
*
* @author Kaganer
+ * @author Nemo bis
* @author OC Ripper
* @author לערי ריינה×רט
*/
@@ -237,9 +238,6 @@ $messages = array(
'tog-shownumberswatching' => 'Prikaži broj korisnika koji prate',
'tog-oldsig' => 'Postojeći potpis:',
'tog-fancysig' => 'Smatraj potpis kao wikitekst (bez automatskog linka)',
-'tog-externaleditor' => 'Redovno koristite eksterni editor (samo za naprednije korisnike, potrebne su posebne postavke na vaÅ¡em raÄunaru)',
-'tog-externaldiff' => 'Redovno koristi vanjski (diff) program za prikaz razlika (samo za naprednije korisnike, potrebne posebne postavke na vaÅ¡em raÄunaru [//www.mediawiki.org/wiki/Manual:External_editors ViÅ¡e informacija.])',
-'tog-showjumplinks' => 'Omogući opciju "skoÄi na" linkove',
'tog-uselivepreview' => 'Koristite pretpregled uživo (potreban JavaScript) (eksperimentalno)',
'tog-forceeditsummary' => 'Opomeni me pri unosu praznog sažetka',
'tog-watchlisthideown' => 'Sakrij moje izmjene sa spiska praćenih Älanaka',
@@ -252,6 +250,7 @@ $messages = array(
'tog-diffonly' => 'Ne prikazuj sadržaj stranice ispod prikaza razlika',
'tog-showhiddencats' => 'Prikaži skrivene kategorije',
'tog-norollbackdiff' => 'Nakon povrata zanemari prikaz razlika',
+'tog-useeditwarning' => 'Upozori me kad napuštam stranicu za uređivanje bez snimanja izmjena',
'underline-always' => 'Uvijek',
'underline-never' => 'Nikad',
@@ -315,6 +314,18 @@ $messages = array(
'oct' => 'okt',
'nov' => 'nov',
'dec' => 'dec',
+'january-date' => '$1. januar',
+'february-date' => '$1. februar',
+'march-date' => '$1. mart',
+'april-date' => '$1. april',
+'may-date' => '$1. maj',
+'june-date' => '$1. jun',
+'july-date' => '$1. jul',
+'august-date' => '$1. august',
+'september-date' => '$1. septembar',
+'october-date' => '$1. oktobar',
+'november-date' => '$1. novembar',
+'december-date' => '$1. decembar',
# Categories related messages
'pagecategories' => '{{PLURAL:$1|Kategorija|Kategorije}}',
@@ -396,6 +407,7 @@ $messages = array(
'create-this-page' => 'Stvori ovu stranicu',
'delete' => 'Obriši',
'deletethispage' => 'Obriši ovu stranicu',
+'undeletethispage' => 'Vrati ovu stranicu',
'undelete_short' => 'Vrati obrisanih {{PLURAL:$1|$1 izmjenu|$1 izmjene|$1 izmjena}}',
'viewdeleted_short' => 'Pogledaj {{PLURAL:$1|jednu obrisanu izmjenu|$1 obrisane izmjene|$1 obrisanih izmjena}}',
'protect' => 'Zaštiti',
@@ -439,7 +451,7 @@ $1',
'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).
+# 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).
'aboutsite' => 'O projektu {{SITENAME}}',
'aboutpage' => 'Project:O_projektu_{{SITENAME}}',
'copyright' => 'Sadržaj je dostupan pod $1.',
@@ -449,7 +461,6 @@ $1',
'disclaimers' => 'Odricanje odgovornosti',
'disclaimerpage' => 'Project:Uslovi korištenja, pravne napomene i odricanje odgovornosti',
'edithelp' => 'Pomoć pri uređivanju',
-'edithelppage' => 'Help:Uređivanje',
'helppage' => 'Help:Sadržaj',
'mainpage' => 'Glavna strana',
'mainpage-description' => 'Glavna strana',
@@ -526,17 +537,6 @@ Lista valjanih posebnih stranica se može naći na [[Special:SpecialPages|{{int:
# General errors
'error' => 'Greška',
'databaseerror' => 'Greška u bazi podataka',
-'dberrortext' => 'DoÅ¡lo je do sintaktiÄke greÅ¡ke u bazi.
-Možda se radi o grešci u softveru.
-Posljednji pokušaj upita je glasio:
-<blockquote><code>$1</code></blockquote>
-unutar funkcije „<code>$2</code>“.
-Baza podataka je prijavila grešku „<samp>$3: $4</samp>“.',
-'dberrortextcl' => 'Desila se sintaksna greška upita baze.
-Posljednji pokušani upit je bio:
-"$1"
-iz funkcije "$2".
-MySQL je vratio grešku "$3: $4".',
'laggedslavemode' => "'''Upozorenje''': Stranica ne mora sadržavati posljednja ažuriranja.",
'readonly' => 'Baza podataka je zakljuÄana',
'enterlockreason' => 'Unesite razlog za zakljuÄavanje, ukljuÄujući procjenu vremena otkljuÄavanja',
@@ -591,12 +591,15 @@ Pretraga: $2',
'editinginterface' => "'''Upozorenje:''' Mijenjate stranicu koja se koristi za tekst interfejsa za softver.
Promjene na ovoj stranici će izazvati promjene korisniÄkog interfejsa za druge korisnike na ovoj wiki.
Za prijevode, molimo Vas koristite [//translatewiki.net/wiki/Main_Page?setlang=bs translatewiki.net], projekt lokalizacije MediaWiki.",
-'sqlhidden' => '(SQL pretraga sakrivena)',
'cascadeprotected' => 'Ova stranica je zaÅ¡tićena od ureÄ‘ivanja, jer je ukljuÄena u {{PLURAL:$1|stranicu zaÅ¡tićenu|stranice zaÅ¡tićene}} od ureÄ‘ivanja sa ukljuÄenom kaskadnom opcijom:
$2',
'namespaceprotected' => "Nemate dozvolu uređivati stranice imenskog prostora '''$1'''.",
'customcssprotected' => 'Nemate dozvolu za mijenjanje ove CSS stranice jer sadrži osobne postavke nekog drugog korisnika.',
'customjsprotected' => 'Nemate dozvolu za mijenjanje ove JavaScript stranice jer sadrži osobne postavke nekog drugog korisnika.',
+'mycustomcssprotected' => 'Nemate ovlasti za uređivanje ove CSS stranice.',
+'mycustomjsprotected' => 'Nemate dozvolu da uređujete ovu stranicu sa JavaScriptom.',
+'myprivateinfoprotected' => 'Nemate dozvolu da uređujete svoje privatne informacije.',
+'mypreferencesprotected' => 'Nemate dozvolu da uređujete svoje postavke.',
'ns-specialprotected' => 'Posebne stranice se ne mogu uređivati.',
'titleprotected' => 'Naslov stranice je zaštićen od postavljanja od strane korisnika [[User:$1|$1]].
Kao razlog je naveden "\'\'$2\'\'".',
@@ -622,10 +625,19 @@ Obratite pažnju da neke stranice mogu nastaviti da se prikazuju kao da ste još
'welcomecreation-msg' => 'VaÅ¡ korisniÄki raÄun je napravljen.
Ne zaboravite izmijeniti vlastite [[Special:Preferences|{{SITENAME}} postavke]].',
'yourname' => 'KorisniÄko ime:',
+'userlogin-yourname' => 'KorisniÄko ime',
+'userlogin-yourname-ph' => 'Unesite svoje korisniÄko ime',
+'createacct-another-username-ph' => 'Unesi korisniÄko ime',
'yourpassword' => 'Lozinka/zaporka:',
+'userlogin-yourpassword' => 'Lozinka/zaporka',
+'userlogin-yourpassword-ph' => 'Unesite svoju lozinku/zaporku',
+'createacct-yourpassword-ph' => 'Unesite lozinku/zaporku',
'yourpasswordagain' => 'Ponovno utipkajte lozinku/zaporku:',
+'createacct-yourpasswordagain' => 'Potvrdite lozinku/zaporku',
+'createacct-yourpasswordagain-ph' => 'Unesite lozinku/zaporku ponovno',
'remembermypassword' => 'Upamti moju lozinku na ovom kompjuteru (za maksimum od $1 {{PLURAL:$1|dan|dana}})',
-'securelogin-stick-https' => 'Ostanite povezani na HTTPS nakon prijave',
+'userlogin-remembermypassword' => 'Držite me ulogiranog/u',
+'userlogin-signwithsecure' => 'Koristite sigurnu vezu',
'yourdomainname' => 'Vaš domen:',
'password-change-forbidden' => 'Ne možete da promenite lozinku na ovom vikiju.',
'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.',
@@ -637,18 +649,41 @@ Ne zaboravite izmijeniti vlastite [[Special:Preferences|{{SITENAME}} postavke]].
'logout' => 'Odjavi me',
'userlogout' => 'Odjava',
'notloggedin' => 'Niste prijavljeni',
+'userlogin-noaccount' => 'Nemate raÄun?',
+'userlogin-joinproject' => 'Pridružite se {{SITENAME}}',
'nologin' => "Nemate korisniÄko ime? '''$1'''.",
'nologinlink' => 'Otvorite raÄun',
'createaccount' => 'Napravi korisniÄki raÄun',
'gotaccount' => "Imate raÄun? '''$1'''.",
'gotaccountlink' => 'Prijavi se',
'userlogin-resetlink' => 'Zaboravili ste detalje vaše prijave?',
+'userlogin-resetpassword-link' => 'Resetirajte svoju lozinku/zaporku',
+'helplogin-url' => 'Help:Logiranje',
+'userlogin-helplink' => '[[{{MediaWiki:helplogin-url}}|Pomoć pri logiranju]]',
+'createacct-join' => 'Unesite svoje informacije ispod',
+'createacct-another-join' => 'Dolje unesite informacije o novom raÄunu.',
+'createacct-emailrequired' => 'E-mail adresa',
+'createacct-emailoptional' => 'E-mail adresa (opcionalno)',
+'createacct-email-ph' => 'Unesite svoju E-mail adresu',
+'createacct-another-email-ph' => 'Postavite E-mail adresu',
'createaccountmail' => 'Koristite privremenu sluÄajno stvorenu lozinku i poÅ¡aljite na dolje specificiranu e-mail adresu',
+'createacct-realname' => 'Stvarno ime (opcionalno)',
'createaccountreason' => 'Razlog:',
+'createacct-reason' => 'Razlog',
+'createacct-reason-ph' => 'ZaÅ¡to stvarate novi raÄun',
+'createacct-captcha' => 'Sigurnosna provjera',
+'createacct-imgcaptcha-ph' => 'Unesite tekst koji vidite iznad',
+'createacct-submit' => 'Stvorite svoj raÄun',
+'createacct-another-submit' => 'Stvorite novi raÄun',
+'createacct-benefit-heading' => '{{SITENAME}} se stvara od ljudi poput vas.',
+'createacct-benefit-body1' => '$1 {{PLURAL:$1|izmjena|izmjene}}',
+'createacct-benefit-body2' => '$1 {{PLURAL:$1|stranica|stranice|stranica}}',
+'createacct-benefit-body3' => 'nedavni {{PLURAL:$1|donator|donatora}}',
'badretype' => 'Lozinke koje ste unijeli se ne poklapaju.',
'userexists' => 'Uneseno korisniÄko ime već je u upotrebi.
Unesite neko drugo ime.',
'loginerror' => 'Greška pri prijavljivanju',
+'createacct-error' => 'PogreÅ¡ka u stvaranju raÄuna',
'createaccounterror' => 'Ne može se napraviti raÄun: $1',
'nocookiesnew' => "KorisniÄki nalog je napravljen, ali niste prijavljeni.
{{SITENAME}} koristi kolaÄiće (''cookies'') da bi se korisnici prijavili.
@@ -731,7 +766,7 @@ Da biste završili prijavu, morate unijeti novu šifru ovdje:',
'newpassword' => 'Nova Å¡ifra:',
'retypenew' => 'Ukucajte ponovo novu Å¡ifru:',
'resetpass_submit' => 'Odredi lozinku i prijavi se',
-'resetpass_success' => 'Vaša šifra je uspiješno promjenjena! Prijava u toku...',
+'changepassword-success' => 'Vaša šifra je uspiješno promjenjena! Prijava u toku...',
'resetpass_forbidden' => 'Å ifre ne mogu biti promjenjene',
'resetpass-no-info' => 'Morate biti prijavljeni da bi ste pristupili ovoj stranici direktno.',
'resetpass-submit-loggedin' => 'Promijeni lozinku',
@@ -743,10 +778,11 @@ Možda ste već uspješno promijenili Vašu lozinku ili ste tražili novu privre
# Special:PasswordReset
'passwordreset' => 'Ponovno postavi lozinku',
-'passwordreset-text' => 'Dovršite ovaj obrazac kako biste resetirali svoju lozinku/zaporku.',
+'passwordreset-text-one' => 'Dovršite ovaj obrazac kako biste resetirali svoju lozinku/zaporku.',
+'passwordreset-text-many' => '{{PLURAL:$1|Ispunite jedno od polja kako bi ste resetirali svoju lozinku/zaporku.}}',
'passwordreset-legend' => 'Ponovno postavi lozinku',
'passwordreset-disabled' => 'Ponovno postavljanje lozinke je onemogućeno na ovom wikiju.',
-'passwordreset-pretext' => '{{PLURAL:$1||Unesite jedan dio podataka ispod}}',
+'passwordreset-emaildisabled' => 'Postavke E-maila su deaktivirane na ovoj wiki.',
'passwordreset-username' => 'KorisniÄko ime:',
'passwordreset-domain' => 'Domena:',
'passwordreset-capture' => 'Pogledati krajnji e-mail?',
@@ -775,7 +811,7 @@ možete zanemariti ovu poruku i nastaviti koristiti staru lozinku.',
Privremena Å¡ifra: $2',
'passwordreset-emailsent' => 'E-mail za resetiranje lozinke/zaporke je poslan.',
'passwordreset-emailsent-capture' => 'E-mail za resetiranje lozinke/zaporke je poslan (prikazan dolje).',
-'passwordreset-emailerror-capture' => 'E-mail s podsjetnikom, prikazan dolje, je poslan, ali slanje korisniku nije uspjelo: $1',
+'passwordreset-emailerror-capture' => 'E-mail za resetiranje lozinke/zaporke, prikazan dolje, je poslan, ali slanje {{GENDER:$2|korisniku|korisnici|korisniku}} nije uspjelo: $1',
# Special:ChangeEmail
'changeemail' => 'Promijeni e-mail adresu',
@@ -992,12 +1028,15 @@ Nije ponuđeno nikakvo objašnjenje.',
Izgleda da je obrisana.',
'edit-conflict' => 'Sukob izmjena.',
'edit-no-change' => 'Vaša izmjena je ignorirana, jer nije bilo promjena teksta stranice.',
+'postedit-confirmation' => 'Vaša izmjena je snimljena.',
'edit-already-exists' => 'Stranica nije mogla biti kreirana.
Izgleda da već postoji.',
'defaultmessagetext' => 'UobiÄajeni tekst poruke',
'content-failed-to-parse' => 'Ne mogu da raÅ¡Älanim sadržaj tipa $2 za model $1: $3',
'invalid-content-data' => 'Neispravni podaci sadržaja',
'content-not-allowed-here' => 'Sadržaj modela „$1“ nije dozvoljen na stranici [[$2]]',
+'editwarning-warning' => 'NapuÅ¡tanje ove stranice može dovesti do gubitka svih promjena koje ste naÄinili.
+Ako ste prijavljeni, možete iskljuÄiti ovo upozorenje u sekciji "UreÄ‘ivanje" vaÅ¡ih postavki.',
# Content models
'content-model-wikitext' => 'wikitekst',
@@ -1033,6 +1072,7 @@ Molimo da provjerite usporedbu ispod da budete sigurni da to želite uÄiniti, a
'undo-failure' => 'Izmjene se ne mogu vratiti zbog konflikta sa izmjenama u međuvremenu.',
'undo-norev' => 'Izmjena se ne može vratiti jer ne postoji ranija ili je obrisana.',
'undo-summary' => 'Vraćena izmjena $1 [[Special:Contributions/$2|korisnika $2]] ([[User talk:$2|razgovor]])',
+'undo-summary-username-hidden' => 'Poništi izmjenu $1 od skrivenog korisnika',
# Account creation failure
'cantcreateaccounttitle' => 'Nije moguće napraviti korisniÄki raÄun',
@@ -1214,6 +1254,7 @@ Korištenje navigacionih linkova će resetovati ovaj stupac.',
'compareselectedversions' => 'Uporedite oznaÄene verzije',
'showhideselectedversions' => 'Pokaži/sakrij odabrane verzije',
'editundo' => 'ukloni ovu izmjenu',
+'diff-empty' => '(nema razlike)',
'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}}',
'difference-missing-revision' => 'Ne mogu da pronađem {{PLURAL:$2|jednu izmenu|$2 izmene|$2 izmena}} od ove razlike ($1).
@@ -1241,7 +1282,6 @@ Više informacija možete pronaći u [{{fullurl:{{#Special:Log}}/delete|page={{F
'searchmenu-legend' => 'Opcije pretrage',
'searchmenu-exists' => "'''Postoji stranica pod nazivom \"[[:\$1]]\" na ovoj wiki'''",
'searchmenu-new' => "'''Napravi stranicu \"[[:\$1|\$1]]\" na ovoj wiki!'''",
-'searchhelp-url' => 'Help:Sadržaj',
'searchmenu-prefix' => '[[Special:PrefixIndex/$1|Pregledaj stranice sa ovim prefiksom]]',
'searchprofile-articles' => 'Stranice sadržaja',
'searchprofile-project' => 'Stranice pomoći i projekta',
@@ -1285,15 +1325,7 @@ Pokušajte u svoju pretragu staviti ''all:'' da se pretražuje cjelokupan sadrž
'searchdisabled' => 'Pretraga teksta na ovoj Wiki je trenutno onemogućena.
U međuvremenu možete pretraživati preko Googlea.
Uzmite u obzir da njegovi indeksi za ovu Wiki ne moraju biti ažurirani.',
-
-# Quickbar
-'qbsettings' => 'Podešavanja brze palete',
-'qbsettings-none' => 'Nikakva',
-'qbsettings-fixedleft' => 'Fiksirana lijevo',
-'qbsettings-fixedright' => 'Fiksirana desno',
-'qbsettings-floatingleft' => 'Plutajuća lijevo',
-'qbsettings-floatingright' => 'Plutajuća desno',
-'qbsettings-directionality' => 'Fiksno, ovisno o smjeru pisma Vašeg jezika',
+'search-error' => 'Dogodila se pogreška prilikom pretraživanja: $1',
# Preferences page
'preferences' => 'Postavke',
@@ -1327,7 +1359,6 @@ Uzmite u obzir da njegovi indeksi za ovu Wiki ne moraju biti ažurirani.',
'resetprefs' => 'Poništi nesnimljene promjene postavki',
'restoreprefs' => 'Vrati sve pretpostavljene postavke',
'prefs-editing' => 'Uređivanje',
-'prefs-edit-boxsize' => 'VeliÄina prozora za ureÄ‘ivanje.',
'rows' => 'Redova:',
'columns' => 'Kolona:',
'searchresultshead' => 'Postavke rezultata pretrage',
@@ -1338,9 +1369,6 @@ Uzmite u obzir da njegovi indeksi za ovu Wiki ne moraju biti ažurirani.',
'recentchangesdays-max' => '(najviše $1 {{PLURAL:$1|dan|dana}})',
'recentchangescount' => 'Broj uređivanja za prikaz po pretpostavkama:',
'prefs-help-recentchangescount' => 'Ovo ukljuÄuje nedavne izmjene, historije stranice i registre.',
-'prefs-help-watchlist-token' => 'Popunjavanjem ovog polja tajnim kljuÄem će generisati RSS feed za VaÅ¡ spisak praćenja.
-Svako ko zna kljuÄ u ovom polju će biti u mogućnosti da proÄita VaÅ¡ spisak praćenja, tako da trebate izabrati sigurnu vrijednost.
-Ovdje su navedene neke nasumiÄno odabrane vrijednosti koje možete koristiti: $1',
'savedprefs' => 'Vaša postavke su snimljene.',
'timezonelegend' => 'Vremenska zona:',
'localtime' => 'Lokalno vrijeme:',
@@ -1371,7 +1399,6 @@ Ovdje su navedene neke nasumiÄno odabrane vrijednosti koje možete koristiti: $
'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:',
-'prefs-textboxsize' => 'VeliÄina prozora za ureÄ‘ivanje',
'youremail' => 'E-mail:',
'username' => 'Ime {{GENDER:$1|korisnika|korisnice}}:',
'uid' => '{{GENDER:$1|KorisniÄki}} ID:',
@@ -1405,6 +1432,8 @@ Ako izaberete da date ime, biće korišteno za pripisivanje Vašeg rada.',
'prefs-dateformat' => 'Format datuma',
'prefs-timeoffset' => 'Vremenska razlika',
'prefs-advancedediting' => 'Općenito',
+'prefs-editor' => 'UreÄ‘ivaÄ',
+'prefs-preview' => 'Pretpregled',
'prefs-advancedrc' => 'Napredne opcije',
'prefs-advancedrendering' => 'Napredne opcije',
'prefs-advancedsearchoptions' => 'Napredne opcije',
@@ -1439,6 +1468,8 @@ Ako izaberete da date ime, biće korišteno za pripisivanje Vašeg rada.',
'userrights-notallowed' => 'VaÅ¡ raÄun Vam ne daje dozvolu da postavljate i uklanjate korisniÄka prava.',
'userrights-changeable-col' => 'Grupe koje možete mijenjati',
'userrights-unchangeable-col' => 'Grupe koje ne možete mijenjati',
+'userrights-conflict' => 'Sukob u korisniÄkim pravima! Molimo poÅ¡aljite VaÅ¡e promjene ponovno.',
+'userrights-removed-self' => 'Uspješno ste uklonili vlastite prava. Zbog toga više niste u stanju pristupiti ovoj stranici.',
# Groups
'group' => 'Grupa:',
@@ -1504,11 +1535,19 @@ Ako izaberete da date ime, biće korišteno za pripisivanje Vašeg rada.',
'right-proxyunbannable' => 'Zaobilaženje automatskih blokada proxy-ja',
'right-unblockself' => 'Deblokiranje samog sebe',
'right-protect' => 'Promjena nivoa zaštite i uređivanje kaskadno zaštićenih stranica',
-'right-editprotected' => 'Uređivanje zaštićenih stranica (bez povezanih zaštita)',
+'right-editprotected' => 'Uređivanje stranice zaštićenih kao "{{int:protect-level-sysop}}"',
+'right-editsemiprotected' => 'Uređivanje stranica zaštićenih kao "{{int:protect-level-autoconfirmed}}"',
'right-editinterface' => 'UreÄ‘ivanje korisniÄkog interfejsa',
'right-editusercssjs' => 'Uređivanje CSS i JS datoteka drugih korisnika',
'right-editusercss' => 'Uređivanje CSS datoteka drugih korisnika',
'right-edituserjs' => 'Uređivanje Javascript datoteka drugih korisnika',
+'right-editmyusercss' => 'Uredite svoje vlastite CSS datoteke',
+'right-editmyuserjs' => 'Uredite vlastite korisniÄke JavaScript datoteke',
+'right-viewmywatchlist' => 'Pregled vlastitog popisa praćenih stranica',
+'right-editmywatchlist' => 'Uredite vlastiti spisak praćenja. Obratite pažnju da će neke akcije dodati stranice Äak bez ovog prava.',
+'right-viewmyprivateinfo' => 'Vidite svoje privatne podatke (npr. adresu e-pošte, stvarno ime)',
+'right-editmyprivateinfo' => 'Uredite svoje privatne podatke (npr. adresa e-pošte, stvarno ime)',
+'right-editmyoptions' => 'Uredite svoje postavke',
'right-rollback' => 'Brzo vraćanje izmjena na zadnjeg korisnika koji je uređivao određenu stranicu',
'right-markbotedits' => 'OznaÄavanje vraćenih izmjena kao izmjene bota',
'right-noratelimit' => 'Izbjegavanje ograniÄenja uzrokovanih brzinom',
@@ -1570,12 +1609,17 @@ Ako izaberete da date ime, biće korišteno za pripisivanje Vašeg rada.',
'action-userrights-interwiki' => 'ureÄ‘ivanje korisniÄkih prava na drugim wikijima',
'action-siteadmin' => 'zakljuÄavanje i otkljuÄavanje baze podataka',
'action-sendemail' => 'pošalji e-poštu',
+'action-editmywatchlist' => 'uredite svoj spisak praćenja',
+'action-viewmywatchlist' => 'pogledajte svoj spisak praćenja',
+'action-viewmyprivateinfo' => 'pogledajte svoje privatne informacije',
+'action-editmyprivateinfo' => 'uredite svoje privatne informacije',
# Recent changes
'nchanges' => '$1 {{PLURAL:$1|izmjena|izmjene|izmjena}}',
'recentchanges' => 'Nedavne izmjene',
'recentchanges-legend' => 'Postavke za Nedavne promjene',
'recentchanges-summary' => 'Na ovoj stranici možete pratiti nedavne izmjene.',
+'recentchanges-noresult' => 'Bez promjena tokom cijelog perioda koji ispunjava ove kriterije.',
'recentchanges-feed-description' => 'Praćenje nedavnih izmjena na ovom wikiju u ovom feedu.',
'recentchanges-label-newpage' => 'Ovom izmjenom je stvorena nova stranica',
'recentchanges-label-minor' => 'Ovo je manja izmjena',
@@ -1612,7 +1656,6 @@ Ako izaberete da date ime, biće korišteno za pripisivanje Vašeg rada.',
'recentchangeslinked-feed' => 'Srodne izmjene',
'recentchangeslinked-toolbox' => 'Srodne izmjene',
'recentchangeslinked-title' => 'Srodne promjene sa "$1"',
-'recentchangeslinked-noresult' => 'Nema izmjena na povezanim stranicama u zadanom periodu.',
'recentchangeslinked-summary' => "Ova posebna stranica prikazuje promjene na povezanim stranicama.
Stranice koje su na vašem [[Special:Watchlist|spisku praćenja]] su '''podebljane'''.",
'recentchangeslinked-page' => 'Naslov stranice:',
@@ -1624,7 +1667,7 @@ Stranice koje su na vašem [[Special:Watchlist|spisku praćenja]] su '''podeblja
'reuploaddesc' => 'Vratite se na upitnik za slanje',
'upload-tryagain' => 'Pošaljite izmijenjeni opis datoteke',
'uploadnologin' => 'Niste prijavljeni',
-'uploadnologintext' => 'Morate biti [[Special:UserLogin|prijavljeni]] da bi ste slali datoteke.',
+'uploadnologintext' => 'Morate biti $1 da bi ste slali datoteke.',
'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',
@@ -1844,7 +1887,6 @@ Za optimalnu sigurnost, img_auth.php je onemogućena.',
'http-read-error' => 'GreÅ¡ka pri Äitanju HTTP.',
'http-timed-out' => 'Istekao HTTP zahtjev.',
'http-curl-error' => 'Greška pri otvaranju URLa: $1',
-'http-host-unreachable' => 'Ovaj URL nije bilo moguće otvoriti',
'http-bad-status' => 'Nastao je problem tokom HTTP zahtjeva: $1 $2',
# Some likely curl errors. More could be added from <http://curl.haxx.se/libcurl/c/libcurl-errors.html>
@@ -1997,12 +2039,6 @@ Prije brisanja provjerite da li druge stranice vode na te Å¡ablone.',
'statistics-users-active-desc' => 'Korisnici koju su izvršili akciju u toku {{PLURAL:$1|zadnjeg dana|zadnja $1 dana|zadnjih $1 dana}}',
'statistics-mostpopular' => 'Najviše pregledane stranice',
-'disambiguations' => 'Stranice do viÅ¡eznaÄnih odrednica',
-'disambiguationspage' => 'Template:ViÅ¡eznaÄna odrednica',
-'disambiguations-text' => "Slijedeće stranice su povezane sa '''stranicom za razvrstavanje'''.
-One se možda moraju povezati sa konkretnim Älankom.<br />
-Stranica se smatra stranicom za razvrstavanje, ukoliko koristi Å¡ablon koji je povezan sa spiskom [[MediaWiki:Disambiguationspage|stranica za razvrstavanje]]",
-
'pageswithprop' => 'Stranice sa svojstvom stranice',
'pageswithprop-legend' => 'Stranice sa svojstvom stranice',
'pageswithprop-text' => 'Ova stranica navodi stranice sa specifiÄnim svojstvom stranice.',
@@ -2257,7 +2293,6 @@ Buduće promjene ove stranice i njoj pridružene stranice za razgovor će biti n
'unwatchthispage' => 'Ukinite praćenje',
'notanarticle' => 'Nije Älanak',
'notvisiblerev' => 'Posljednja izmjena drugog korisnika je bila izbrisana',
-'watchnochange' => 'Ništa što pratite nije promjenjeno u prikazanom vremenu.',
'watchlist-details' => '{{PLURAL:$1|$1 stranica praćena|$1 stranice praćene|$1 stranica praćeno}} ne raÄunajući stranice za razgovor.',
'wlheader-enotif' => '* Obavještavanje e-poštom je omogućeno.',
'wlheader-showupdated' => "* Stranice koje su izmijenjene od kad ste ih posljednji put posjetili su prikazane '''podebljanim slovima'''",
@@ -2673,15 +2708,13 @@ Možda je već deblokirana.',
Međutim, možda je blokirana kao dio bloka $2, koji se može deblokirati.',
'ip_range_invalid' => 'NetaÄan raspon IP adresa.',
'ip_range_toolarge' => 'Grupne blokade veće od /$1 nisu dozvoljene.',
-'blockme' => 'Blokiraj me',
'proxyblocker' => 'Bloker proksija',
-'proxyblocker-disabled' => 'Ova funkcija je onemogućena.',
'proxyblockreason' => 'Vaša IP adresa je blokirana jer je ona otvoreni proksi.
Molimo vas da kontaktirate vaÅ¡eg davatelja internetskih usluga (Internet Service Provider-a) ili tehniÄku podrÅ¡ku i obavijestite ih o ovom ozbiljnom sigurnosnom problemu.',
-'proxyblocksuccess' => 'Proksi uspješno blokiran.',
'sorbsreason' => 'Vaša IP adresa je prikazana kao otvoreni proxy u DNSBL koji koristi {{SITENAME}}.',
'sorbs_create_account_reason' => 'Vaša IP adresa je prikazana kao otvoreni proxy u DNSBL korišten od {{SITENAME}}.
Ne možete napraviti raÄun',
+'xffblockreason' => 'IP adresa koja postoji u zagljavlju X-Forwarded-For, ili Vaša ili od proxy servera koji koristite, je blokirana. Originalni razlog za blokiranje je bio: $1',
'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.',
@@ -2846,6 +2879,8 @@ Molimo posjetite [//www.mediawiki.org/wiki/Localisation MediaWiki lokalizaciju]
'thumbnail-more' => 'Uvećaj',
'filemissing' => 'Nedostaje datoteka',
'thumbnail_error' => 'Greška pri pravljenju umanjene slike: $1',
+'thumbnail_error_remote' => 'Poruka o pogrešci o $1:
+$2',
'djvu_page_error' => 'DjVu stranica je van opsega',
'djvu_no_xml' => 'Za XML-datoteku se ne može pozvati DjVu datoteka',
'thumbnail-temp-create' => 'Ne mogu da napravim privremenu smanjenu sliku',
@@ -3145,11 +3180,25 @@ Njegovim izvršavanjem možete da ugrozite Vaš sistem.",
'minutes' => '{{PLURAL:$1|$1 minut|$1 minuta|$1 minuta}}',
'hours' => '{{PLURAL:$1|$1 sat|$1 sata|$1 sati}}',
'days' => '{{PLURAL:$1|$1 dan|$1 dana|$1 dana}}',
+'weeks' => '{{PLURAL:$1|$1 sedmica}}',
'months' => '{{PLURAL:$1|$1 mjesec|$1 mjeseci}}',
'years' => '{{PLURAL:$1|$1 godina|$1 godine|$1 godina}}',
'ago' => 'prije $1',
'just-now' => 'upravo sada',
+# Human-readable timestamps
+'hours-ago' => '$1 {{PLURAL:$1|sat|sati}}',
+'minutes-ago' => '$1 {{PLURAL:$1|minut|minuta}}',
+'seconds-ago' => '$1 {{PLURAL:$1|sekunda|sekunde}}',
+'monday-at' => 'ponedjeljak u $1',
+'tuesday-at' => 'utorak u $1',
+'wednesday-at' => 'srijeda u $1',
+'thursday-at' => 'Äetvrtak u $1',
+'friday-at' => 'petak u $1',
+'saturday-at' => 'subota u $1',
+'sunday-at' => 'nedjelja u $1',
+'yesterday-at' => 'juÄer u $1',
+
# Bad image list
'bad_image_list' => "Koristi se sljedeći format:
@@ -3177,7 +3226,7 @@ Svi drugi linkovi u istoj liniji se smatraju izuzecima, npr. kod stranica gdje s
* gpslongitude
* gpsaltitude',
-# EXIF tags
+# Exif tags
'exif-imagewidth' => 'Å irina',
'exif-imagelength' => 'Visina',
'exif-bitspersample' => 'Bita po komponenti',
@@ -3357,7 +3406,7 @@ Svi drugi linkovi u istoj liniji se smatraju izuzecima, npr. kod stranica gdje s
'exif-originalimageheight' => 'Visina slike prije nego Å¡to je odrezana',
'exif-originalimagewidth' => 'Å irina slike prije nego Å¡to je odrezana',
-# EXIF attributes
+# Exif attributes
'exif-compression-1' => 'Nekompresovano',
'exif-compression-2' => 'CCITT Grupa 3 1 — Dimenzionalno izmijenjeo Huffmanovo šifriranje po dužini',
'exif-compression-3' => 'CCITT Group 3 faks kodiranje',
@@ -3752,7 +3801,6 @@ TakoÄ‘er možete [[Special:EditWatchlist|koristiti standardni ureÄ‘ivaÄ]].',
'version-other' => 'Ostalo',
'version-mediahandlers' => 'UpravljaÄi medije',
'version-hooks' => 'Kuke',
-'version-extension-functions' => 'Funkcije proširenja (ekstenzije)',
'version-parser-extensiontags' => "Parser proširenja (''tagovi'')",
'version-parser-function-hooks' => 'Kuke parserske funkcije',
'version-hook-name' => 'Naziv kuke',
@@ -3774,12 +3822,17 @@ Trebali biste dobiti [{{SERVER}}{{SCRIPTPATH}}/KOPIJU GNU opće javne licence] z
'version-entrypoints-header-entrypoint' => 'Ulazna taÄka',
'version-entrypoints-header-url' => 'URL',
-# Special:FilePath
-'filepath' => 'Putanja datoteke',
-'filepath-page' => 'Datoteka:',
-'filepath-submit' => 'Idi',
-'filepath-summary' => 'Ova posebna stranica prikazuje potpunu putanju za datoteku.
-Slike su prikazane u punoj veliÄini, ostale vrste datoteka su prikazane direktno sa, s njima povezanim, programom.',
+# Special:Redirect
+'redirect' => 'Preusmjeravanje preko datoteke, korisnika ili ID-a izmjene',
+'redirect-legend' => 'Preusmjeravanje na datoteku ili stranicu',
+'redirect-summary' => 'Ova posebna stranica preusmjerava na datoteku (ako je navedeno ime datoteke), stranicu (ako postoji ID revizije) ili korisniÄku stranicu (ako postoji brojÄani ID korisnika).',
+'redirect-submit' => 'Idi',
+'redirect-lookup' => 'Pregled:',
+'redirect-value' => 'Vrijednost:',
+'redirect-user' => 'KorisniÄki ID',
+'redirect-revision' => 'Izmjena stranice',
+'redirect-file' => 'Naziv datoteke',
+'redirect-not-exists' => 'Vrijednost nije pronađena',
# Special:FileDuplicateSearch
'fileduplicatesearch' => 'Potraga za duplim datotekama',
@@ -3829,6 +3882,7 @@ Slike su prikazane u punoj veliÄini, ostale vrste datoteka su prikazane direktn
'tags' => 'Oznake valjane izmjene',
'tag-filter' => 'Filter [[Special:Tags|oznaka]]:',
'tag-filter-submit' => 'Filter',
+'tag-list-wrapper' => '([[Special:Tags|{{PLURAL:$1|tag|tagova}}]]: $2)',
'tags-title' => 'Oznake',
'tags-intro' => 'Ova stranica prikazuje spisak oznaka (tagova) koje softver može staviti na svaku izmjenu i njihovo znaÄenje.',
'tags-tag' => 'Naziv oznake',
@@ -3870,6 +3924,9 @@ Slike su prikazane u punoj veliÄini, ostale vrste datoteka su prikazane direktn
'htmlform-submit' => 'Unesi',
'htmlform-reset' => 'Vrati izmjene',
'htmlform-selectorother-other' => 'Ostalo',
+'htmlform-no' => 'Ne',
+'htmlform-yes' => 'Da',
+'htmlform-chosen-placeholder' => 'Odaberi opciju',
# SQLite database support
'sqlite-has-fts' => '$1 sa podrškom pretrage cijelog teksta',
diff --git a/languages/messages/MessagesShi.php b/languages/messages/MessagesShi.php
index 02cac985..35fbfed4 100644
--- a/languages/messages/MessagesShi.php
+++ b/languages/messages/MessagesShi.php
@@ -43,9 +43,6 @@ $messages = array(
'tog-shownumberswatching' => 'Ml uṭṭun n Midn lli swurn ɣ tasna yad',
'tog-oldsig' => 'Asmmaql (Tiẓṛi) n ukrraj n ufus lli illan:',
'tog-fancysig' => 'Skr akrrag n ufus s taɣarast n wikitext (bla azday utumatik)',
-'tog-externaleditor' => 'Swwur s yan umẓṛg u uṭṛiṣ n brra ( i imskarn lli bahra ḥrcnin, ira mayad riglaj iẓlin ɣ urdinatur)',
-'tog-externaldiff' => 'Skr s yan umsnaḥya abrrani ( i midn lli bahra ḥrcnin, mayad ira riglaj ɣ urdinatur)',
-'tog-showjumplinks' => 'Srɣ izdayn « Amuddu » d « acnubc » niḠ« Asiǧl » ɣ uflla n tasna',
'tog-uselivepreview' => 'Skr s umẓri amaynu izrbn (ira JavaScript) (Arm)',
'tog-forceeditsummary' => 'Ayyit tini iɣ ur iwiɣ imsmun n imbdln',
'tog-watchlisthideown' => 'hbo ghayli bdlgh gh omdfor inu',
@@ -239,7 +236,7 @@ $1',
'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).
+# 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).
'aboutsite' => 'F {{SITENAME}}',
'aboutpage' => "Project:f' mayad",
'copyright' => 'Mayllan gis illa ɣ ddu $1.',
@@ -249,7 +246,6 @@ $1',
'disclaimers' => 'Ur darssuq',
'disclaimerpage' => 'Project: Ur illa maddar illa ssuq',
'edithelp' => 'Aws ɣ tirra',
-'edithelppage' => 'Help:Imaratn',
'helppage' => 'Help:Mayllan',
'mainpage' => 'Tasana tamzwarut',
'mainpage-description' => 'Tasna tamzwarut',
@@ -276,7 +272,6 @@ $1',
'newmessagesdifflink' => 'Imbddeln imÄura',
'youhavenewmessagesmulti' => 'Dark tibratin timaynutin ɣ $1',
'editsection' => 'Ẓreg (bddel)',
-'editsection-brackets' => '[$1]',
'editold' => 'Ẓreg (bddel)',
'viewsourceold' => 'Mel aɣbalu',
'editlink' => 'Ẓreg (bddel)',
@@ -326,12 +321,6 @@ Tifilit n tasnayin gaddanin ratn taft ɣid [[Special:SpecialPages|{{int:specialp
# General errors
'error' => 'Laffut',
'databaseerror' => 'Laffut ɣ database',
-'dberrortext' => 'Tlla laffut ɣikli s tskert database.
-Ulla mayad kis kra ntmukrist.
-May igguran ittu isigal ɣ mayad igat.
-<blockquote><tt>$1</tt></blockquote>
-S ussiglad "<tt>$2</tt>".
-laffut d yurrin ɣ database "<tt>$3: $4</tt>".',
'laggedslavemode' => 'Ḥan tasnayad ur gis graygan ambddel amaynu.',
'readonly' => 'Tqqn tabase',
'missing-article' => 'lqaa\'ida n lbayanat ortofa nass ad gh tawriqt liss ikhssa asti taf limism "$1" $2.
@@ -416,7 +405,7 @@ Ussaɣ n isqdacn ḥiln hlli.
'newpassword' => 'Awal iḥá¸an amaynu:',
'retypenew' => 'Als i tirra n w-awal iḥá¸an:',
'resetpass_submit' => 'Sbadl awal n uzri tkcmt',
-'resetpass_success' => 'Awal n uzri nk ibudl mzyan! rad nit tilit ɣ ifalan',
+'changepassword-success' => 'Awal n uzri nk ibudl mzyan! rad nit tilit ɣ ifalan',
'resetpass_forbidden' => 'Iwaliwn n uzri ur ufan ad badln.',
'resetpass-no-info' => 'illa fllak ad zwar tilit ɣ ifalan bac ad tkcmt s tasna yad',
'resetpass-submit-loggedin' => 'Bdl awal n ukccum (tangalt)',
@@ -614,7 +603,6 @@ Tigira n ujbbad ns, ar takka yat tayafut bahra imqqurn, ɣayan afan ur ttili.',
'searchmenu-legend' => 'Istayn ucnubc',
'searchmenu-exists' => '"\'Tlla yat tasna lli ilan assaɣ « [[:$1]] » ɣ wiki yad',
'searchmenu-new' => "'''Skr Tasna « [[:$1|$1]] » ɣ wiki !'''",
-'searchhelp-url' => 'Help:Mayllan',
'searchprofile-articles' => 'Mayllan ɣ tasna',
'searchprofile-project' => 'Tisniwin n w-aws n usnfar',
'searchprofile-images' => 'Multimedia',
@@ -657,14 +645,6 @@ Tigira n ujbbad ns, ar takka yat tayafut bahra imqqurn, ɣayan afan ur ttili.',
Tzdar at cabbat ɣilad ɣ Google.
Izdar ad urtili ɣ isbidn n mayllan ɣ {{SITENAME}} .',
-# Quickbar
-'qbsettings' => 'Tafeggagt izrbn',
-'qbsettings-none' => 'Ur iḥudda',
-'qbsettings-fixedleft' => 'Aẓẓugz azlmaá¸',
-'qbsettings-fixedright' => 'Azzugz afasi',
-'qbsettings-floatingleft' => 'Yaywul su uzlmad',
-'qbsettings-floatingright' => 'Yaywul su ufasi',
-
# Preferences page
'preferences' => 'Timssusmin',
'mypreferences' => 'Timssusmin',
@@ -689,7 +669,6 @@ Izdar ad urtili ɣ isbidn n mayllan ɣ {{SITENAME}} .',
'resetprefs' => 'hiyd tghyirat li orsjilnin',
'restoreprefs' => 'sglbd kollo regalega',
'prefs-editing' => 'tahrir',
-'prefs-edit-boxsize' => 'hajm nafida n thrir',
'rows' => 'sfof:',
'columns' => 'aamida:',
'searchresultshead' => 'Cabba',
@@ -793,7 +772,6 @@ Izdar ad urtili ɣ isbidn n mayllan ɣ {{SITENAME}} .',
'recentchangeslinked-feed' => 'Imbddeln zund ɣwid',
'recentchangeslinked-toolbox' => 'Imbddeln zund ɣwid',
'recentchangeslinked-title' => 'Imbddeln li izdin "$1"',
-'recentchangeslinked-noresult' => 'Ur illi may budeln ɣ tisniwin li dar izdayn s ɣid',
'recentchangeslinked-summary' => 'Ɣid umuɣ iymbddeln li ittyskarnin tigira yad ɣ tisniwin li ittuyzdayn d kra n tasna (ulla i igmamn n kra taggayt ittuyzlayn). Tisniwin ɣ [[Special:Watchlist|Umuɣ n tisniwin li ttsaggat]].',
'recentchangeslinked-page' => 'Assaɣ n tasna',
'recentchangeslinked-to' => 'Afficher les changements vers les pages liées au lieu de la page donnée
@@ -847,8 +825,6 @@ Mel imbddeln z tisniwin li ittuyzdayni bla tasna li trit.',
# Statistics
'statistics' => 'Tisnaddanin',
-'disambiguationspage' => 'Template:Homonymie',
-
# Miscellaneous special pages
'nbytes' => '$1 {{PLURAL:$1|byt|byt}}',
'ncategories' => '$1 {{PLURAL:$1|taggayt|taggayin}}',
@@ -1286,17 +1262,12 @@ WiyyaḠraggis ḥbun s ɣiklli sttin kkan gantn.
'version-other' => 'wayya',
'version-mediahandlers' => 'motahakkimat lmedia',
'version-hooks' => 'lkhtatif',
-'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',
-# Special:FilePath
-'filepath-page' => 'Asdaw:',
-'filepath-submit' => 'Ftu',
-
# Special:FileDuplicateSearch
'fileduplicatesearch-filename' => 'smiyt n-wasdaw:',
'fileduplicatesearch-submit' => 'Sigl',
diff --git a/languages/messages/MessagesSi.php b/languages/messages/MessagesSi.php
index 24b27a8a..4f40b1fd 100644
--- a/languages/messages/MessagesSi.php
+++ b/languages/messages/MessagesSi.php
@@ -222,9 +222,6 @@ $messages = array(
'tog-shownumberswatching' => 'මුර කරනු ලබන පරිà·à·“ලකයන් සංඛ්â€à¶ºà·à·€ පෙන්වන්න',
'tog-oldsig' => 'පවතින අත්සන:',
'tog-fancysig' => 'අත්සන විකිපෙළ (ස්වයංක්â€à¶»à·“ය සබà·à¶³à·’යක් විරහිතව) ලෙසින් සලකන්න',
-'tog-externaleditor' => 'බà·à·„ිර සම්පà·à¶¯à¶šà¶ºà¶šà·ŠÂ à¶·à·à·€à·’ත කරන්න (ප්â€à¶»à·€à·“ණයන් සඳහ෠පමණි, ඔබගේ පරිගණකයේ විà·à·šà·‚ිත වූ සà·à¶šà·ƒà·”ම් අවà·à·Šâ€à¶ºÂ à·€à·š. [//www.mediawiki.org/wiki/Manual:External_editors තවත් තොරතුරු.])',
-'tog-externaldiff' => 'බà·à·„ිර ප්â€à¶»à¶·à·šà¶¯à¶ºà¶šà·ŠÂ à¶·à·à·€à·’ත කරන්න (ප්â€à¶»à·€à·“ණයන් සඳහ෠පමණි, ඔබගේ පරිගණකයේ විà·à·šà·‚ිත වූ සà·à¶šà·ƒà·”ම් අවà·à·Šâ€à¶ºÂ à·€à·š. [//www.mediawiki.org/wiki/Manual:External_editors තවත් තොරතුරු.])',
-'tog-showjumplinks' => '"වෙත පනින්න" යන ප්â€à¶»à·€à·šà·à¶­à· සබà·à¶³à·’යන් සක්â€à¶»à·“ය කරන්න',
'tog-uselivepreview' => 'තත්කà·à¶½ පෙර-දසුන භà·à·€à·’ත෠කරන්න (ජà·à·€à·à·ƒà·Šà¶šà·Šâ€à¶»à·’ප්ට්) (පරීක්ෂණà·à¶­à·Šà¶¸à¶š)',
'tog-forceeditsummary' => 'හිස් සංස්කරණ à·ƒà·à¶»à·à¶‚à·à¶ºà¶šà¶§ ම෠ඇතුළු වන විට මà·à·„ට ඉඟි කරන්න',
'tog-watchlisthideown' => 'මුර-ලà·à¶ºà·’ස්තුවෙන් මà·à¶œà·š සංස්කරණ සඟවන්න',
@@ -238,6 +235,7 @@ $messages = array(
'tog-showhiddencats' => 'à·ƒà·à¶Ÿà·€à·”නු ප්â€à¶»à·€à¶»à·Šà¶œ පෙන්වන්න',
'tog-noconvertlink' => 'සබà·à¶³à·’යන්ගේ à·à·“ර්ෂ පෙරà·à·…ීම අක්â€à¶»à·“ය කරන්න',
'tog-norollbackdiff' => 'පුනරà·à·€à¶»à·Šà¶­à¶±à¶ºà¶šà·Š කිරීමෙන් පසු වෙනස්වීම් අත්හරින්න',
+'tog-useeditwarning' => 'ම෠සංස්කරණ පිටුවක් සුරකිනු නොලà·à¶¶à·– වෙනස්කිරීම් සමඟ අතහà·à¶» යන විට අවවà·à¶¯ කරන්න',
'underline-always' => 'à·ƒà·à¶¸à·€à·’ටම කරන්න',
'underline-never' => 'කිසිවිටෙක නොකරන්න',
@@ -301,6 +299,18 @@ $messages = array(
'oct' => 'ඔක්',
'nov' => 'නොවà·',
'dec' => 'දෙසà·',
+'january-date' => 'ජනවà·à¶»à·’ $1',
+'february-date' => 'පෙබරවà·à¶»à·’ $1',
+'march-date' => 'මà·à¶»à·Šà¶­à·” $1',
+'april-date' => 'අප්â€à¶»à·šà¶½à·Š $1',
+'may-date' => 'මà·à¶ºà·’ $1',
+'june-date' => 'ජූනි $1',
+'july-date' => 'ජූලි $1',
+'august-date' => 'අගà·à·ƒà·Šà¶­à·” $1',
+'september-date' => 'à·ƒà·à¶´à·Šà¶­à·à¶¸à·Šà¶¶à¶»à·Š $1',
+'october-date' => 'ඔක්තොම්බර් $1',
+'november-date' => 'නොවà·à¶¸à·Šà¶¶à¶»à·Š $1',
+'december-date' => 'දෙසà·à¶¸à·Šà¶¶à¶»à·Š $1',
# Categories related messages
'pagecategories' => '{{PLURAL:$1|ප්â€à¶»à·€à¶»à·Šà¶œà¶º|ප්â€à¶»à·€à¶»à·Šà¶œ}}',
@@ -321,7 +331,7 @@ $messages = array(
'noindex-category' => 'සූචිගත නොකළ පිටු',
'broken-file-category' => 'භින්න වූ ගොනු සබà·à¶³à·’ සහිත පිටු',
-'linkprefix' => '/^(.*?)([a-zA-Z\\x80-\\xff]+)$/sD',
+'linkprefix' => '/^((?>.*(?<![a-zA-Z\\x80-\\xff])))(.+)$/sD',
'about' => 'පිළිබඳ',
'article' => 'පටුන',
@@ -384,6 +394,7 @@ $messages = array(
'create-this-page' => 'මෙම පිටුව තනන්න',
'delete' => 'මකන්න',
'deletethispage' => 'මෙම පිටුව මකන්න',
+'undeletethispage' => 'මෙම පිටුව මà·à¶šà·”ම අවලංගු කරන්න',
'undelete_short' => '{{PLURAL:$1|එක් සංස්කරණයක|සංස්කරණ $1 ක}} මක෠දà·à¶¸à·“ම ප්â€à¶»à¶­à·’ලà·à¶¸ කරන්න',
'viewdeleted_short' => 'මක෠දමනු ලà·à¶¶à·– {{PLURAL:$1|එක් සංස්කරණයක්|සංස්කරණ $1 ක්}} බලන්න',
'protect' => 'ආරක්â€à·‚ණය',
@@ -427,7 +438,7 @@ $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).
+# 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).
'aboutsite' => '{{SITENAME}} පිළිබඳ',
'aboutpage' => 'Project:පිළිබඳ',
'copyright' => ' $1 යටතේ අන්තර්ගතය දà·à¶š ගත à·„à·à¶š.',
@@ -437,7 +448,6 @@ $1",
'disclaimers' => 'වියà·à¶ à¶±à¶ºà¶±à·Š',
'disclaimerpage' => 'Project:පොදු වියà·à¶ à¶±',
'edithelp' => 'සංස්කරණ උදවු',
-'edithelppage' => 'Help:සංස්කරණ',
'helppage' => 'Help:පටුන',
'mainpage' => 'මුල් පිටුව',
'mainpage-description' => 'මුල් පිටුව',
@@ -466,7 +476,6 @@ $1",
'newmessagesdifflinkplural' => 'අවසන් {{PLURAL:$1|වෙනස්වීම|වෙනස්වීම්}}',
'youhavenewmessagesmulti' => 'ඔබ හට $1 හි නව පණිවුඩ ඇත',
'editsection' => 'සංස්කරණය',
-'editsection-brackets' => '[$1]',
'editold' => 'සංස්කරණය',
'viewsourceold' => 'මූලà·à·à·Šâ€à¶»à¶º නරඹන්න',
'editlink' => 'සංස්කරණය',
@@ -518,17 +527,6 @@ $1",
# General errors
'error' => 'දà·à·‚ය',
'databaseerror' => 'දත්ත-ගබඩ෠දà·à·‚ය',
-'dberrortext' => 'දත්තසංචිත විමසුම් කà·à¶»à¶š-රීති දà·à·‚යක් සිදුවී ඇත.
-මෙය මෘදුකà·à¶‚ගයේ දà·à·‚යක් හඟවන්නක් විය à·„à·à¶š.
-අවසන් වරට උත්සà·à·„ කල දත්ත-ගබඩ෠විමසුම:
-"<tt>$2</tt>" à·à·Šâ€à¶»à·’තය අනුසà·à¶»à¶ºà·™à¶±à·Š
-<blockquote><tt>$1</tt></blockquote> විය.
-දත්තසංචිතය විසින් à·€à·à¶»à·Šà¶­à·à¶šà¶½ දà·à·‚ය "<tt>$3: $4</tt>".',
-'dberrortextcl' => 'දත්ත-ගබඩ෠විමසුමෙහි කà·à¶»à¶š-රීති දà·à·‚යක් හට ගෙන ඇත.
-අවසන් වරට උත්සà·à·„ කල දත්ත-ගබඩ෠විමසුම:
-"$2" à·à·Šâ€à¶»à·’තය අනුසà·à¶»à¶ºà·™à¶±à·Š,
-"$1" විය
-දත්ත-ගබඩà·à·€ විසින් à·€à·à¶»à·Šà¶­à· කල දà·à·‚ය "$3: $4"',
'laggedslavemode' => "'''අවවà·à¶¯à¶ºà¶ºà·’:''' මෑත යà·à·€à¶­à·Šà¶šà·à¶½à·“න කිරීම් මෙම පිටුවෙහි අඩංගු නොවීමට ඉඩ ඇත.",
'readonly' => 'දත්තසංචිතය අගුළුල෠ඇත',
'enterlockreason' => 'අවුර෠දà·à¶¸à·“මට හේතුවක් සපයන අතරතුර, ඇවිරීම මුදà·à·„à·à¶»à·“මට බලà·à¶´à·œà¶»à·œà¶­à·Šà¶­à·” වන කà·à¶½à·ƒà·“මà·à·€ නිමà·à¶±à¶º කර දක්වන්න',
@@ -584,12 +582,15 @@ URL සඳහන් කරමින්, මෙම කරුණ [[Special:ListUs
'editinginterface' => "'''අවවà·à¶¯à¶ºà¶ºà·’:''' මෘදුකà·à¶‚ගයට අතුරුමුව පෙළ à·ƒà·à¶´à¶ºà·“මට භà·à·€à·’ත෠වන පිටුවක් ඔබ විසින් සංස්කරණය කරනු ලබයි.
මෙම පිටුවට සිදු කරන වෙනස්වීම් විසින් අනෙකුත් පරිà·à·“ලකයන්ගේ පරිà·à·“ලක අතුරුමුවෙහි පෙනුමට බලපෑම් එල්ල කෙරෙනු ඇත.
පරිවර්තන සඳහà·, මීඩියà·à·€à·’කි ප්â€à¶»à·à¶¯à·šà·à·“යකරන ව්â€à¶ºà·à¶´à·˜à¶­à·’ය, [//translatewiki.net/wiki/Main_Page?setlang=si translatewiki.net], භà·à·€à·’ත෠කිරීම සලක෠බà·à¶½à·“මට කà·à¶»à·”ණික වන්න.",
-'sqlhidden' => '(SQL query සඟව෠ඇත)',
'cascadeprotected' => '"තීරු දර්à·à¶±" විකල්පය සක්â€à¶»à·“යනය කොට එමගින් ආරක්â€à·‚ණය කල පහත දà·à¶šà·Šà·€à·™à¶± {{PLURAL:$1|පිටුව|පිටු}} අඩංගු කර ඇති බà·à·€à·’න්, මෙම පිටුව සංස්කරණය කිරීමෙන් වලක෠ඇත:
$2',
'namespaceprotected' => "'''$1''' නà·à¶¸à¶…වකà·à·à¶ºà·™à·„à·’ පිටු සංස්කරණය කිරීමට ඔබහට අවසර නොමà·à¶­.",
'customcssprotected' => 'මෙම CSS පිටුව සංස්කරණය කිරීමට ඔබට අවසර නොමà·à¶­à·Šà¶­à·š එහි අනෙකුත් පරිà·à·“ලකයෙකුගේ පුද්ගලික පරිස්ථිතීන් අඩංගු බà·à·€à·’නි.',
'customjsprotected' => 'මෙම ජà·à·€à·à·ƒà·Šà¶šà·Šâ€à¶»à·’ට් පිටුව සංස්කරණය කිරීමට ඔබට අවසර නොමà·à¶­à·Šà¶­à·š එහි අනෙකුත් පරිà·à·“ලකයෙකුගේ පුද්ගලික පරිස්ථිතීන් අඩංගු බà·à·€à·’නි.',
+'mycustomcssprotected' => 'මෙම CSS පිටුව සංස්කරණය කිරීමට ඔබට අවසර නොමà·à¶­.',
+'mycustomjsprotected' => 'මෙම ජà·à·€à·à·ƒà·Šà¶šà·Šâ€à¶»à·’ප්ට් පිටුව සංස්කරණය කිරීමට ඔබට අවසර නොමà·à¶­.',
+'myprivateinfoprotected' => 'ඔබගේ පෞද්ගලික තොරතුරු සංස්කරණය කිරීමට ඔබට අවසර නොමà·à¶­.',
+'mypreferencesprotected' => 'ඔබගේ අභිරුචීන් සංස්කරණය කිරීමට ඔබට අවසර නොමà·à¶­.',
'ns-specialprotected' => 'විà·à·šà·‚ පිටු සංස්කරණය කිරීම සිදු කල නොහà·à¶š.',
'titleprotected' => "මෙම à·à·“ර්ෂ-නà·à¶¸à¶º තà·à¶±à·“ම [[User:$1|$1]] විසින් à·€à·à¶»à¶«à¶º කොට ඇත.
මේ සඳහ෠''$2'' හේතුව දක්ව෠ඇත.",
@@ -609,10 +610,18 @@ $2',
'welcomecreation-msg' => 'ඔබගේ ගිණුම තන෠ඇත.
ඔබගේ [[Special:Preferences|{{SITENAME}} අභිරුචීන්]] නෙස් කිරීමට අමතක නොකරන්න.',
'yourname' => 'පරිà·à·“ලක නà·à¶¸à¶º:',
+'userlogin-yourname' => 'පරිà·à·“ලක නම',
+'userlogin-yourname-ph' => 'ඔබගේ පරිà·à·“ලක නම ඇතුළු කරන්න',
'yourpassword' => 'මුරපදය:',
+'userlogin-yourpassword' => 'මුර පදය',
+'userlogin-yourpassword-ph' => 'ඔබගේ මුර පදය ඇතුළු කරන්න',
+'createacct-yourpassword-ph' => 'මුර පදයක් ඇතුළු කරන්න',
'yourpasswordagain' => 'මුරපදය යළි ඇතුළු කරන්න:',
+'createacct-yourpasswordagain' => 'මුර පදය සනà·à¶® කරන්න',
+'createacct-yourpasswordagain-ph' => 'මුර පදය යළි ඇතුළු කරන්න',
'remembermypassword' => 'මà·à¶œà·š පිවිසීම මෙම ගවේෂක මතකයෙහි (උපරිම ලෙස {{PLURAL:$1|දින|දින}}) $1 ක් මතක තබà·à¶œà¶±à·Šà¶±',
-'securelogin-stick-https' => 'ඇතුල්වීමෙන් පසුවද HTTPS හරහ෠සම්බන්ධ වන්න',
+'userlogin-remembermypassword' => 'ම෠ප්â€à¶»à·€à·’ෂ්ටයෙහි තබන්න',
+'userlogin-signwithsecure' => 'ආරක්â€à·‚ිත සබඳතà·à·€ භà·à·€à·’ත෠කරන්න',
'yourdomainname' => 'ඔබගේ වසම:',
'password-change-forbidden' => 'ඔබට මෙම විකියෙහි මුරපද වෙනස් කල නොහà·à¶š.',
'externaldberror' => 'එක්ක෠සත්â€à¶ºà·à·€à¶­à·Š දත්ත-ගබඩ෠දà·à·‚යක් පà·à·€à¶­à·”නි නà·à¶­à·’නම් ඔබගේ බà·à·„ිර ගිණුම යà·à·€à¶­à·Šà¶šà·à¶½à·“න කිරීමට ඔබ හට අවසර දී නොමà·à¶­.',
@@ -624,18 +633,34 @@ $2',
'logout' => 'නික්මීම',
'userlogout' => 'නික්මීම',
'notloggedin' => 'ප්â€à¶»à·€à·’සී නà·à¶­',
+'userlogin-noaccount' => 'ගිණුමක් නොමà·à¶­à·’ද?',
+'userlogin-joinproject' => '{{SITENAME}}හ෠එක්වන්න',
'nologin' => "ඔබ හට ගිණුමක් නොමà·à¶­à·’ද? '''$1'''.",
'nologinlink' => 'ගිණුමක් තනන්න',
'createaccount' => 'අලුත් ගිණුමක් තනන්න',
'gotaccount' => 'දà·à¶±à¶§à¶¸à¶­à·Š ගිණුමක් තිබේද? $1.',
'gotaccountlink' => 'පිවිසෙන්න',
'userlogin-resetlink' => 'ඔබේ පිවිසුම් තොරතුරු අමතකද?',
+'helplogin-url' => 'Help:ප්â€à¶»à·€à·’ෂ්ට වීම',
+'userlogin-helplink' => '[[{{MediaWiki:helplogin-url}}|ප්â€à¶»à·€à·’ෂ්ට වීමට උදවු වන්න]]',
+'createacct-join' => 'ඔබගේ තොරතුරු පහත ඇතුළු කරන්න.',
+'createacct-emailrequired' => 'වි-තà·à¶´à·‘ල ලිපිනය',
+'createacct-emailoptional' => 'වි-තà·à¶´à·‘ල ලිපිනය (විකල්ප)',
+'createacct-email-ph' => 'ඔබගේ වි-තà·à¶´à·‘ල ලිපිනය ඇතුළු කරන්න',
'createaccountmail' => 'තà·à·€à¶šà·à¶½à·’ක අහුඹු මුර පදයක් භà·à·€à·’ත෠කර එය පහත දක්ව෠ඇති වි-තà·à¶´à·à¶½à·Š ලිපිනයට යවන්න',
+'createacct-realname' => 'නියම නම (වෛකල්පීය)',
'createaccountreason' => 'හේතුව:',
+'createacct-reason' => 'හේතුව',
+'createacct-reason-ph' => 'ඔබ තවත් ගිණුමක් තනන්නේ කුමක් නිසà·à¶¯',
+'createacct-captcha' => 'ආරක්ෂක පරික්ෂà·à·€',
+'createacct-benefit-body1' => '{{PLURAL:$1|සංස්කරණය|සංස්කරණ}}',
+'createacct-benefit-body2' => '{{PLURAL:$1|පිටුව|පිටු}}',
+'createacct-benefit-body3' => 'මෑත{{PLURAL:$1|දà·à¶ºà¶šà¶ºà·|දà·à¶ºà¶šà¶ºà·}}',
'badretype' => 'ඔබ ඇතුළු කල මුරපදය නොගà·à¶½à¶´à·š.',
'userexists' => 'ඔබ ඇතුළු කල පරිà·à·“ලක නà·à¶¸à¶º දà·à¶±à¶§à¶¸à¶­à·Š භà·à·€à·’තයෙහි ඇත.
කරුණà·à¶šà¶» වෙනත් නමක් තà·à¶»à· ගන්න.',
'loginerror' => 'පිවිසීමේ දà·à·‚යකි',
+'createacct-error' => 'ගිණුම් තà·à¶±à·“මේ දà·à·‚ය',
'createaccounterror' => 'ගිණුම නිර්මà·à¶«à¶º කළ නොහà·à¶šà·’ විය:$1',
'nocookiesnew' => 'පරිà·à·“ලක ගිණුම තන෠ඇති නමුදු, ඔබ ප්â€à¶»à·€à·’සී නà·à¶­.
පරිà·à·“ලකයන් ප්â€à¶»à·€à·’ෂ්ට කර ගà·à¶±à·“ම සඳහà·, {{SITENAME}} විසින් කුකී භà·à·€à·’ත෠කරයි.
@@ -717,7 +742,7 @@ $2',
'newpassword' => 'නව මුර-පදය:',
'retypenew' => 'නව මුර-පදය නà·à·€à¶­ ඇතුළු කරන්න:',
'resetpass_submit' => 'මුර-පදය පූරණය කොට ඉන් පසු ප්â€à¶»à·€à·’ෂ්ට වන්න',
-'resetpass_success' => 'ඔබගේ මුර-පදය à·ƒà·à¶»à·Šà¶®à¶š ලෙස වෙනස් කරන ලදි! දà·à¶±à·Š ඔබව ප්â€à¶»à·€à·’ෂ්ට කරගනිමින්...',
+'changepassword-success' => 'ඔබගේ මුර-පදය à·ƒà·à¶»à·Šà¶®à¶š ලෙස වෙනස් කරන ලදි! දà·à¶±à·Š ඔබව ප්â€à¶»à·€à·’ෂ්ට කරගනිමින්...',
'resetpass_forbidden' => 'මුර-පදයන් වෙනස් කිරීම සිදු කල නොහà·à¶š',
'resetpass-no-info' => 'මෙම පිටුව සෘජු ලෙස පරිà·à·“ලනය කෙරුමට ඔබ පළමු ප්â€à¶»à·€à·’ෂ්ට විය යුතුය.',
'resetpass-submit-loggedin' => 'මුර-පදය වෙනස්කරන්න',
@@ -728,10 +753,8 @@ $2',
# Special:PasswordReset
'passwordreset' => 'මුරපදය වෙනස් කරන්න',
-'passwordreset-text' => 'ඔබගේ මුරපදය යළි à·ƒà·à¶šà·ƒà·“ම සදහ෠මෙම ආකෘතිපත්â€à¶»à¶ºÂ à¶´à·”රවන්න.',
'passwordreset-legend' => 'මුරපදය යළි පිහිටුවන්න',
'passwordreset-disabled' => 'මෙම විකියෙහි මුර පද ප්â€à¶»à¶­à·Šâ€à¶ºà·à¶»à¶¸à·Šà¶·Â à¶šà·’රීම් අක්â€à¶»à·“ය කොට ඇත.',
-'passwordreset-pretext' => '{{PLURAL:$1||පහත දà·à¶šà·Šà·€à·™à¶± දත්ත කණ්ඩ වලින් එකක් ඇතුල් කරන්න}}',
'passwordreset-username' => 'පරිà·à·“ලක නà·à¶¸à¶º:',
'passwordreset-domain' => 'වසම:',
'passwordreset-capture' => 'ප්â€à¶»à¶­à·’පලදà·à¶ºà¶š විද්â€à¶ºà·”ත් තà·à¶´à·‘ල නරඹනවà·à¶¯?',
@@ -964,10 +987,13 @@ $2
එය මක෠දම෠ඇති බවක් පෙනේ.',
'edit-conflict' => 'සංස්කරණ ගà·à¶§à·”ම.',
'edit-no-change' => 'පෙළට කිසිදු වෙනසක් සිදු නොකල බà·à·€à·’න් ඔබගේ සංස්කරණය නොසලකà·à·„රින ලදි.',
+'postedit-confirmation' => 'ඔබගේ සංස්කරණය සුරකින ලදී.',
'edit-already-exists' => 'නව පිටුවක් තà·à¶±à·’ය නොහà·à¶šà·’ විය.
එය දà·à¶±à¶§à¶¸à¶­à·Š පවතියි.',
'defaultmessagetext' => 'à·ƒà·à¶¸à·à¶±à·Šâ€à¶º පණිවුඩ පෙළ',
'invalid-content-data' => 'වලංගු නොවන අන්තර්ගත දත්ත',
+'editwarning-warning' => 'අවධà·à¶±à¶ºà¶§: මෙම පිටුවෙන් නික්ම යà·à¶¸ ඔබ සිදු කළ වෙනස්කම් නà·à¶­à·’වී යෑමට හේතු විය à·„à·à¶š.
+ඔබ ප්â€à¶»à·€à·’ෂ්ටවී ඇත්නම්, ඔබගේ වරණයන්වල "සංසකරණය කිරීම්" කොටසේ ඇති මෙම අනතුරු ඇඟවීම අක්â€à¶»à·“ය කළ à·„à·à¶š.',
# Content models
'content-model-wikitext' => 'විකිපෙළ',
@@ -1198,7 +1224,6 @@ $1",
'searchmenu-legend' => 'ගවේෂණ තà·à¶»à·à¶œà·à¶±à·“ම්',
'searchmenu-exists' => "'''මෙම විකියෙහි \"[[:\$1]]\" ලෙස නම් කර ඇති පිටුවක් ඇත.'''",
'searchmenu-new' => "'''මෙම විකියෙහි \"[[:\$1]]\" පිටුව තනන්න!'''",
-'searchhelp-url' => 'Help:පටුන',
'searchmenu-prefix' => '[[Special:PrefixIndex/$1|මෙම උපසර්ගය භà·à·€à·’ත කරමින් පිටු පිරික්සන්න]]',
'searchprofile-articles' => 'අන්තර්ගත පිටු',
'searchprofile-project' => 'උදවු හ෠ව්â€à¶ºà·à¶´à·˜à¶­à·’ පිටු',
@@ -1243,14 +1268,6 @@ $1",
මේ අතරතුර ඔබ හට ගූගල් ඔස්සේ ගවේෂණය කල à·„à·à¶š.
{{SITENAME}} අන්තර්ගතය පිළිබඳ ඔවුන්ගේ සූචි යල් පà·à¶± ගොස් ඇතිව෠විය à·„à·à¶šà·’ බව සටහන් කර ගන්න.',
-# Quickbar
-'qbsettings' => 'යුහුතීරුව',
-'qbsettings-none' => 'කිසිවක් නොමà·à¶­',
-'qbsettings-fixedleft' => 'ස්ථà·à·€à¶» වම',
-'qbsettings-fixedright' => 'ස්ථà·à·€à¶» දකුණ',
-'qbsettings-floatingleft' => 'ප්ලà·à·€à¶š වම',
-'qbsettings-floatingright' => 'ප්ලà·à·€à¶š දකුණ',
-
# Preferences page
'preferences' => 'අභිරුචි',
'mypreferences' => 'අභිරුචීන්',
@@ -1283,7 +1300,6 @@ $1",
'resetprefs' => 'නොසුරà·à¶šà·– වෙනස්වීම් නිෂ්කà·à·à¶±à¶º කරන්න',
'restoreprefs' => 'පෙරනිමි à·ƒà·à¶šà·ƒà·”ම් සියල්ලම යළි-පිහිටුවන්න',
'prefs-editing' => 'සංස්කරණය කිරීම්',
-'prefs-edit-boxsize' => 'සංස්කරණ â€à¶šà·€à·”ළුවෙහි ප්â€à¶»à¶¸à·à¶«à¶º.',
'rows' => 'පේළි:',
'columns' => 'තීරු:',
'searchresultshead' => 'ගවේෂණය',
@@ -1294,9 +1310,6 @@ $1",
'recentchangesdays-max' => '(උපරිමයෙන් {{PLURAL:$1|එක් දිනක්|දින $1 ක්}})',
'recentchangescount' => 'පෙරනිමියෙන් පෙන්විය යුතු සංස්කරණ ගණන:',
'prefs-help-recentchangescount' => 'මෑත වෙනස්වීම්, පිටු ඉතිහà·à·ƒà¶ºà¶±à·Š, සහ ලà¶à·”-සටහන් මෙයට ඇතුලත් වෙති.',
-'prefs-help-watchlist-token' => 'මෙම පà·à¶§à·“රය වෙත රහස් කේතයක් ඇතුළු කිරීමෙන් ඔබගේ මුරලà·à¶ºà·’ස්තුව වෙත RSS පà·à·‚කයක් ජනනය වනු ඇත.
-මෙම පà·à¶§à·“රයෙහි කේතය දන්න෠ඕනෑම අයෙකුට ඔබගේ මුරලà·à¶ºà·’ස්තුව කියවිය à·„à·à¶šà·’ වන අතර, එබà·à·€à·’න්ම විරල එකක් තà·à¶»à·à¶œà¶±à·Šà¶±.
-ඔබට භà·à·€à·’ත෠කල à·„à·à¶šà·’ අහඹු ලෙස-ජනනය වූ අගයක් මෙන්න: $1',
'savedprefs' => 'අභිරුචීන් සුරà·à¶šà·’නි.',
'timezonelegend' => 'වේල෠කලà·à¶´à¶º:',
'localtime' => 'ප්â€à¶»à·à¶¯à·šà·à·“ය වේලà·à·€:',
@@ -1327,7 +1340,6 @@ $1",
'prefs-reset-intro' => 'ඔබගේ අභිප්â€à¶»à·šà¶­à¶ºà¶±à·Š, අඩවි පෙරනිමි වෙතට යළි-පිහිටුවීම සඳහà·, ඔබ හට මෙම පිටුව භà·à·€à·’ත෠කල à·„à·à¶š.
මෙය අහà·à·ƒà·’ කල නොහà·à¶š.',
'prefs-emailconfirm-label' => 'විද්â€à¶ºà·”ත්-ලිපිනය තහවුරුකිරීම:',
-'prefs-textboxsize' => 'සංස්කරණ කවුළුවෙහි ප්â€à¶»à¶¸à·à¶«à¶º',
'youremail' => 'විද්â€à¶ºà·”ත් තà·à¶´à·‘ල:',
'username' => '{{GENDER:$1|පරිà·à·“ලක නà·à¶¸à¶º}}:',
'uid' => '{{GENDER:$1|පරිà·à·“ලක}} අනන්â€à¶ºà·à¶‚කය:',
@@ -1566,7 +1578,6 @@ HTML ටà·à¶œà¶ºà¶±à·Š පිරික්සන්න.',
'recentchangeslinked-feed' => 'සහසම්බන්ධිත වෙනස්වීම්',
'recentchangeslinked-toolbox' => 'සහසම්බන්ධිත වෙනස්වීම්',
'recentchangeslinked-title' => '"$1" ආà·à·Šâ€à¶»à·’ත වෙනස්කිරීම්',
-'recentchangeslinked-noresult' => 'සලක෠බà·à¶½à·– කà·à¶½à·ƒà·“මà·à·€à·™à·„ිදී, සබà·à¶³à·’ පිටු වල කිසිදු වෙනසක් සිදුවී නොමà·à¶­.',
'recentchangeslinked-summary' => "විà·à·šà·‚à·“ ලෙස නිරූපිත පිටුවකට (හ෠විà·à·šà·‚à·’ ලෙස නිරූපිත ප්â€à¶»à·€à¶»à·Šà¶œà¶ºà¶š à·ƒà·à¶¸à·à¶¢à·“කයන්ට) සබà·à¶³à·’ පිටුවල මෑතදී සිදුවූ වෙනස්වීම් දà·à¶šà·Šà·€à·™à¶± ලà·à¶ºà·’ස්තුවක් මෙහි දà·à¶šà·Šà·€à·š.
[[Special:Watchlist|ඔබගේ මුර-ලà·à¶ºà·’ස්තුවෙහි]] පිටු '''තදකුරු''' වලින් දක්ව෠ඇත.",
'recentchangeslinked-page' => 'පිටු නà·à¶¸à¶º:',
@@ -1800,7 +1811,6 @@ https://www.mediawiki.org/wiki/Manual:Image_Authorization බලන්න.',
'http-read-error' => 'HTTP කියà·à·€à·”ම් දà·à·‚ය.',
'http-timed-out' => 'HTTP අයà·à¶¯à·”ම සඳහ෠වූ කà·à¶½à¶º ඉක්මව ඇත.',
'http-curl-error' => 'අන්තර්ජà·à¶½ ලිපිනය පමුණුවà·à¶œà·™à¶± ඒමේ දà·à·‚ය : $1',
-'http-host-unreachable' => 'අන්තර්ජà·à¶½ ලිපිනය වෙත සේන්දු විය නොහà·à¶šà·’ විය',
'http-bad-status' => 'HTTP ආයà·à¶ à¶±à¶ºà·™à·„ිදී ගà·à¶§à·…ුවක් පà·à¶± නà·à¶œà·”නි: $1 $2',
# Some likely curl errors. More could be added from <http://curl.haxx.se/libcurl/c/libcurl-errors.html>
@@ -1948,12 +1958,6 @@ When filtered by user, only files where that user uploaded the most recent versi
'statistics-users-active-desc' => 'පසුගිය {{PLURAL:$1|දිනය|දින $1}} තුලදී කිසියම් ක්â€à¶»à·’යà·à·€à¶šà·Š සිදු කල පරිà·à·“ලකයන්',
'statistics-mostpopular' => 'බෙහෙවින් නරඹනු ලබන පිටු',
-'disambiguations' => 'නිරà·à¶šà¶»à¶« පිටු සඳහ෠සබà·à¶¯à·™à¶± පිටු',
-'disambiguationspage' => 'Template:තේරුම් නිරà·à¶šà¶»à¶«à¶º',
-'disambiguations-text' => "පහත දà·à¶šà·Šà·€à·™à¶± පිටු අතර '''වක්â€à¶»à·à¶­à·Šà¶­à·’හරණ පිටුවකට''' සබà·à¶³à·™à¶± එක් සබà·à¶³à·’යක් හ෠ඇත.
-ඒව෠ඒ වෙනුවට අනුරූප මà·à¶­à·˜à¶šà·à·€à¶§ සබà·à¶³à·’ය යුතුය.<br />
-යම් පිටුවක් වක්â€à¶»à·à¶­à·Šà¶­à·’හරණ පිටුවක් ලෙස සලකනුයේ එය [[MediaWiki:Disambiguationspage]] වෙතින් සබà·à¶³à·”නු à·ƒà·à¶šà·’ල්ලක් භà·à·€à·’ත෠කරන්නේ නම්ය.",
-
'doubleredirects' => 'ද්විත්ව යළි-යොමුකිරීම්',
'doubleredirectstext' => 'අනෙකුත් යළි-යොමුවීම් පිටුවලට යළි-යොමුවන පිටුවල ලà·à¶ºà·’ස්තුවක් මෙම පිටුවේ දà·à¶šà·Šà·€à·š.
එක් එක් පේළියක අඩංගු වන්නේ පළමු හ෠දෙවන යළි-යොමුවීම් වලට සබà·à¶³à·’ හ෠ඒ සමග පළමු යළි-යොමුව එල්ල වන්නà·à·€à·–, à·ƒà·à¶¸à·à¶±à·Šâ€à¶ºà¶ºà·™à¶±à·Š "සත්â€à¶º" ඉලක්ක පිටුව වන, දෙවන යළි-යොමුවේ ඉලක්කයයි.<del>කප෠හà·à¶»à·’</del> නිවේà·à·’තයන් පිලිබඳ ගà·à¶§à·…à·” විසඳ෠ඇත.',
@@ -2193,10 +2197,9 @@ When filtered by user, only files where that user uploaded the most recent versi
'unwatchthispage' => 'මුර-කිරීම නවතින්න',
'notanarticle' => 'අන්තර්ගත පිටුවක් නොවේ',
'notvisiblerev' => 'සංà·à·à¶°à¶±à¶º මකà·à¶¯à¶¸à· ඇත',
-'watchnochange' => 'ඔබ විසින් මුරකෙරෙන කිසිදු අයිතමයක් දක්ව෠ඇති කà·à¶½ සීමà·à·€à·™à·„ිදී සංස්කරණයට භà·à¶¢à¶±à¶º වී නොමà·à¶­.',
'watchlist-details' => 'à·ƒà·à¶šà¶ à·Šà¶¡à· පිටු නොගිණුනු කල, ඔබගේ මුර ලà·à¶ºà·’ස්තුවෙහි {{PLURAL:$1|එක් පිටුවක්|පිටු $1 ක්}} ඇත.',
-'wlheader-enotif' => '* විද්â€à¶ºà·”ත්-තà·à¶´à·à¶½à·Š දà·à¶±à·”ම්දීම සක්â€à¶»à·“ය කෙරිණි.',
-'wlheader-showupdated' => "* ඔබ විසින් ඒවà·à¶§ අවසන් වරට පිවිසුනු පසුව වෙනස්කෙරුනු පිටු '''තදකුරු''' වලින් පෙන්ව෠ඇත",
+'wlheader-enotif' => 'විද්â€à¶ºà·”ත්-තà·à¶´à·à¶½à·Š දà·à¶±à·”ම්දීම සක්â€à¶»à·“ය කෙරිණි.',
+'wlheader-showupdated' => "ඔබ විසින් ඒවà·à¶§ අවසන් වරට පිවිසුනු පසුව වෙනස්කෙරුනු පිටු '''තදකුරු''' වලින් පෙන්ව෠ඇත",
'watchmethod-recent' => 'මුර-කෙරෙන පිටු සඳහ෠මෑත සංස්කරණයන් පරික්â€à·‚෠කරමින්',
'watchmethod-list' => 'මෑත සංස්කරණයන් සඳහ෠මුර-කෙරෙන පිටු පරික්â€à·‚෠කරමින්',
'watchlistcontains' => 'ඔබගේ මුර-ලà·à¶ºà·’ස්තුවෙහි {{PLURAL:$1|එක් පිටුවක්|පිටු $1 ක්}} අඩංගුය.',
@@ -2598,12 +2601,9 @@ $1 ගේ à·€à·à¶»à¶«à¶ºà¶§ හේතුව මෙය වේ: "$2"',
එනමුදු, එය, $2 පරà·à·ƒà¶ºà·™à·„à·’ කොටසක් ලෙස à·€à·à¶»à¶«à¶ºà¶§ ලක් කොට ඇති අතර, එහි à·€à·à¶»à¶«à¶º අත්හිටුවිය à·„à·à¶š.',
'ip_range_invalid' => 'අනීතික අන්තර්ජà·à¶½ ලිපින පරà·à·ƒà¶ºà¶šà·’.',
'ip_range_toolarge' => '/$1 ට වඩ෠විà·à·à¶½ පරà·à·ƒ කොටස්වලට ඉඩ ලබ෠නොදේ.',
-'blockme' => 'ම෠වà·à¶»à¶«à¶º කරන්න',
'proxyblocker' => 'ප්â€à¶»à¶­à·’යුක්ත (ප්â€à¶»à·œà¶šà·Šà·ƒà·’) à·€à·à¶»à¶«à¶šà¶»à·”',
-'proxyblocker-disabled' => 'මෙම කෘත්â€à¶ºà¶º අක්â€à¶»à·“ය කොට ඇත.',
'proxyblockreason' => 'ඔබගේ අන්තර්ජà·à¶½ ලිපිනය විවෘත ප්â€à¶»à¶­à·’යුක්තයක් (ප්â€à¶»à·œà¶šà·Šà·ƒà·’) බà·à·€à·’න් එය à·€à·à¶»à¶«à¶º කොට ඇත.
ඔබගේ අන්තර්ජà·à¶½ සේව෠ප්â€à¶»à¶­à·’පà·à¶¯à¶šà¶ºà· හ෠තà·à¶šà·Šà·‚ණික අනුග්â€à¶»à·à·„කය෠හ෠අමත෠මෙම බරපතළ ආරක්ෂණ ගà·à¶§à·…ුව ඔවුනට නිරà·à·€à¶»à¶«à¶º කරන්න.',
-'proxyblocksuccess' => 'සිදුකලà·.',
'sorbs' => 'DNSBL',
'sorbsreason' => 'ඔබගේ අන්තර්ජà·à¶½ ලිපිනය, {{SITENAME}} විසින් භà·à·€à·’ත වන DNSBL à·„à·’ විවෘත නියුතුවක් (ප්â€à¶»à·œà¶šà·Šà·ƒà·’යක්) ලෙස ලà·à¶ºà·’ස්තුගත කොට ඇත.',
'sorbs_create_account_reason' => 'ඔබගේ අන්තර්ජà·à¶½ ලිපිනය, {{SITENAME}} විසින් භà·à·€à·’ත වන DNSBL à·„à·’ විවෘත නියුතුවක් (ප්â€à¶»à·œà¶šà·Šà·ƒà·’යක්) ලෙස ලà·à¶ºà·’ස්තුගත කොට ඇත.
@@ -2916,26 +2916,15 @@ $1 ගේ à·€à·à¶»à¶«à¶ºà¶§ හේතුව මෙය වේ: "$2"',
# Stylesheets
'common.css' => '/* මෙහි CSS බහà·à¶½à·“ම සියළු ඡවියයන් භà·à·€à·’ත෠කරන පරිà·à·“ලකයන් හට බලපෑම් සිදු කල à·„à·à¶š */',
-'standard.css' => '/* මෙහි CSS බහà·à¶½à·“ම සම්මත ඡවිය භà·à·€à·’ත෠කරන පරිà·à·“ලකයන් හට බලපෑම් සිදු කල à·„à·à¶š */',
-'nostalgia.css' => '/* මෙහි CSS බහà·à¶½à·“ම පිළිසà·à¶¸à¶»à·”ම් ඡවිය භà·à·€à·’ත෠කරන පරිà·à·“ලකයන් හට බලපෑම් සිදු කල à·„à·à¶š */',
'cologneblue.css' => '/* මෙහි CSS බහà·à¶½à·“ම "Cologne Blue" ඡවිය භà·à·€à·’ත෠කරන පරිà·à·“ලකයන් හට බලපෑම් සිදු කල à·„à·à¶š */',
'monobook.css' => '/* මෙහි CSS බහà·à¶½à·“ම ඒකà·à¶ºà¶± ඡවිය භà·à·€à·’ත෠කරන පරිà·à·“ලකයන් හට බලපෑම් සිදු කල à·„à·à¶š */',
-'myskin.css' => '/* මෙහි CSS බහà·à¶½à·“ම මගේ-ඡවිය ඡවිය භà·à·€à·’ත෠කරන පරිà·à·“ලකයන් හට බලපෑම් සිදු කල à·„à·à¶š */',
-'chick.css' => '/* මෙහි CSS බහà·à¶½à·“ම à·„à·à¶©à¶šà·à¶»à·“ ඡවිය භà·à·€à·’ත෠කරන පරිà·à·“ලකයන් හට බලපෑම් සිදු කල à·„à·à¶š */',
-'simple.css' => '/* මෙහි CSS බහà·à¶½à·“ම සරල ඡවිය භà·à·€à·’ත෠කරන පරිà·à·“ලකයන් හට බලපෑම් සිදු කල à·„à·à¶š */',
'modern.css' => '/* මෙහි CSS බහà·à¶½à·“ම නූතන ඡවිය භà·à·€à·’ත෠කරන පරිà·à·“ලකයන් හට බලපෑම් සිදු කල à·„à·à¶š */',
'print.css' => '/* මෙහි CSS බහà·à¶½à·“ම මුද්â€à¶»à¶« ප්â€à¶»à¶­à·’දà·à¶±à¶ºà¶§ බලපෑම් සිදු කල à·„à·à¶š */',
-'handheld.css' => '/* මෙහි බහà·à¶½à¶± CSS විසින් $wgHandheldStyle à·„à·’ වින්â€à¶ºà·à·ƒà¶šà·™à¶»à·™à¶± ජවිය මත පදනම් වූ අතේ ගෙන ය෠හà·à¶šà·’ උපකරණ වලට බලපෑම් කල à·„à·à¶š*/',
# Scripts
'common.js' => '/* මෙහි ඕනෑම ජà·à·€à·à·ƒà·Šà¶šà·Šâ€à¶»à·’ප්ට් එකක් සෑම පිටු ප්â€à¶»à·€à·šà·à¶±à¶ºà¶šà¶¯à·“ම සියළු පරිà·à·“ලකයන්හට ප්â€à¶»à·€à·šà·à¶±à¶º කෙරේ. */',
-'standard.js' => '/* මෙහි ඕනෑම ජà·à·€à·à·ƒà·Šà¶šà·Šâ€à¶»à·’ප්ට් එකක් සම්මත ඡවිය භà·à·€à·’ත෠කරන පරිà·à·“ලකයන්හට ප්â€à¶»à·€à·šà·à¶±à¶º කෙරේ */',
-'nostalgia.js' => '/* මෙහි ඕනෑම ජà·à·€à·à·ƒà·Šà¶šà·Šâ€à¶»à·’ප්ට් එකක් පිළි à·ƒà·à¶¸à¶»à·”ම් ඡවිය භà·à·€à·’ත෠කරන පරිà·à·“ලකයන්හට ප්â€à¶»à·€à·šà·à¶±à¶º කෙරේ */',
'cologneblue.js' => '/* මෙහි ඕනෑම ජà·à·€à·à·ƒà·Šà¶šà·Šâ€à¶»à·’ප්ට් එකක් සිහිල්-සුවඳ-පà·à¶±à·Š ඡවිය භà·à·€à·’ත෠කරන පරිà·à·“ලකයන්හට ප්â€à¶»à·€à·šà·à¶±à¶º කෙරේ */',
'monobook.js' => '/* මෙහි ඕනෑම ජà·à·€à·à·ƒà·Šà¶šà·Šâ€à¶»à·’ප්ට් එකක් ඒකà·à¶ºà¶± ඡවිය භà·à·€à·’ත෠කරන පරිà·à·“ලකයන්හට ප්â€à¶»à·€à·šà·à¶±à¶º කෙරේ */',
-'myskin.js' => '/* මෙහි ඕනෑම ජà·à·€à·à·ƒà·Šà¶šà·Šâ€à¶»à·’ප්ට් එකක් මගේ-ඡවිය ඡවිය භà·à·€à·’ත෠කරන පරිà·à·“ලකයන්හට ප්â€à¶»à·€à·šà·à¶±à¶º කෙරේ */',
-'chick.js' => '/* මෙහි ඕනෑම ජà·à·€à·à·ƒà·Šà¶šà·Šâ€à¶»à·’ප්ට් එකක් à·„à·à¶©à¶šà·à¶»à·“ ඡවිය භà·à·€à·’ත෠කරන පරිà·à·“ලකයන්හට ප්â€à¶»à·€à·šà·à¶±à¶º කෙරේ */',
-'simple.js' => '/* මෙහි ඕනෑම ජà·à·€à·à·ƒà·Šà¶šà·Šâ€à¶»à·’ප්ට් එකක් සරල ඡවිය භà·à·€à·’ත෠කරන පරිà·à·“ලකයන්හට ප්â€à¶»à·€à·šà·à¶±à¶º කෙරේ */',
'modern.js' => '/* මෙහි ඕනෑම ජà·à·€à·à·ƒà·Šà¶šà·Šâ€à¶»à·’ප්ට් එකක් නූතන ඡවිය භà·à·€à·’ත෠කරන පරිà·à·“ලකයන්හට ප්â€à¶»à·€à·šà·à¶±à¶º කෙරේ */',
# Metadata
@@ -3141,7 +3130,7 @@ Others will be hidden by default.
* gpslongitude
* gpsaltitude',
-# EXIF tags
+# Exif tags
'exif-imagewidth' => 'පළල',
'exif-imagelength' => 'උස',
'exif-bitspersample' => 'එක් සංරචකයකට බිට් ගණන',
@@ -3320,7 +3309,7 @@ Others will be hidden by default.
'exif-personinimage' => 'පුද්ගලික වචනයෙන් විස්තර කරන ලද',
'exif-originalimageheight' => 'කප්පà·à¶¯à·”වට පෙර රූපයෙහි උස',
-# EXIF attributes
+# Exif attributes
'exif-compression-1' => 'අසංක්ෂිප්ත',
'exif-compression-3' => 'CCITT සමූහය 3 à·†à·à¶šà·Šà·ƒà·Š කේතීකරණය',
'exif-compression-4' => 'CCITT සමූහය 4 à·†à·à¶šà·Šà·ƒà·Š කේතීකරණය',
@@ -3797,7 +3786,6 @@ This confirmation code will expire at $4.',
'version-other' => 'වෙනත්',
'version-mediahandlers' => 'මà·à¶°à·Šâ€à¶º හසුරුවනය',
'version-hooks' => 'හසුරු',
-'version-extension-functions' => 'ප්â€à¶»à·ƒà¶»à·Šà¶¢à·’ත කà·à¶»à·Šà¶ºà¶ºà¶±à·Š',
'version-parser-extensiontags' => 'ව්â€à¶ºà·à¶šà¶»à¶« විග්â€à¶»à·„ක ප්â€à¶»à·ƒà¶»à·Šà¶¢à¶± ටà·à¶œà¶ºà¶±à·Š',
'version-parser-function-hooks' => 'වයà·à¶šà¶»à¶« විග්â€à¶»à·„ක à·à·Šâ€à¶»à·’ත හසුරු',
'version-hook-name' => 'හසුරු නම',
@@ -3818,13 +3806,6 @@ MediaWiki බෙදà·à·„à·à¶» ඇත්තේ එය ප්â€à¶»à¶ºà·à¶¢à¶±à
'version-entrypoints-header-entrypoint' => 'නිවේà·à¶± ලක්ෂ්â€à¶ºà¶º',
'version-entrypoints-header-url' => 'URL',
-# Special:FilePath
-'filepath' => 'ගොනු පෙත',
-'filepath-page' => 'ගොනුව:',
-'filepath-submit' => 'යන්න',
-'filepath-summary' => 'මෙම විà·à·šà·‚ පිටුව ගොනුවකට අදà·à¶½ සම්පූර්ණ පෙත හුව෠දක්වයි.
-රූප පූර්ණ විසර්ජනයෙන් දà·à¶šà·Šà·€à·™à¶± අතර, අනෙකුත් ගොනු වර්ග ඒවà·à¶ºà·š ආà·à·Šâ€à¶»à·’ත ක්â€à¶»à¶¸à¶½à·šà¶›à¶ºà¶±à·Š අනුසà·à¶»à¶ºà·™à¶±à·Š සෘජුව ආරම්භ කෙරේ.',
-
# Special:FileDuplicateSearch
'fileduplicatesearch' => 'අනුපිටපත් ගොනු සඳහ෠ගවේෂණය කරන්න',
'fileduplicatesearch-summary' => 'එහි පූරක අගය පà·à¶¯à¶š කර ගෙන අනුපිටපත් ගොනු සඳහ෠ගවේෂණය කරන්න.',
diff --git a/languages/messages/MessagesSk.php b/languages/messages/MessagesSk.php
index 31107f43..65f1589f 100644
--- a/languages/messages/MessagesSk.php
+++ b/languages/messages/MessagesSk.php
@@ -17,6 +17,7 @@
* @author Maros
* @author Michawiki
* @author Mormegil
+ * @author Nemo bis
* @author Palica
* @author Pitr2311
* @author Ragimiri
@@ -313,9 +314,6 @@ $messages = array(
'tog-shownumberswatching' => 'ZobraziÅ¥ poÄet používateľov sledujúcich stránku',
'tog-oldsig' => 'SúÄasný podpis:',
'tog-fancysig' => 'Považovať podpisy za wikitext (bez automatických odkazov)',
-'tog-externaleditor' => 'PoužívaÅ¥ Å¡tandardne externý editor (iba pre expertov, vyžaduje Å¡peciálne nastavenie vášho poÄítaÄa. [//www.mediawiki.org/wiki/Manual:External_editors ÄŽalÅ¡ie informácie.])',
-'tog-externaldiff' => 'PoužívaÅ¥ Å¡tandardne externý diff (iba pre expertov, vyžaduje Å¡peciálne nastavenie vášho poÄítaÄa. [//www.mediawiki.org/wiki/Manual:External_editors ÄŽalÅ¡ie informácie.])',
-'tog-showjumplinks' => 'PoužívaÅ¥ odkazy „skoÄiÅ¥ na“ pre lepÅ¡iu dostupnosÅ¥',
'tog-uselivepreview' => 'Používať živý náhľad(experimentálna funkcia)',
'tog-forceeditsummary' => 'UpozoriÅ¥ ma, keÄ nevyplním zhrnutie úprav',
'tog-watchlisthideown' => 'Skryť moje úpravy zo zoznamu sledovaných',
@@ -329,6 +327,8 @@ $messages = array(
'tog-showhiddencats' => 'Zobraziť skryté kategórie',
'tog-noconvertlink' => 'Vypnúť konverziu názvov odkazov',
'tog-norollbackdiff' => 'Vynechať rozdiel po vykonaní rollbacku',
+'tog-useeditwarning' => 'UpozorniÅ¥ ma, keÄ opúšťam upravovaciu stránku s neuloženými zmenami',
+'tog-prefershttps' => 'Po prihlásení používaÅ¥ vždy zabezpeÄené pripojenie',
'underline-always' => 'Vždy',
'underline-never' => 'Nikdy',
@@ -392,6 +392,18 @@ $messages = array(
'oct' => 'okt',
'nov' => 'nov',
'dec' => 'dec',
+'january-date' => '$1. januára',
+'february-date' => '$1. februára',
+'march-date' => '$1. marca',
+'april-date' => '$1. apríla',
+'may-date' => '$1. mája',
+'june-date' => '$1. júna',
+'july-date' => '$1. júla',
+'august-date' => '$1. augusta',
+'september-date' => '$1. septembra',
+'october-date' => '$1. októbra',
+'november-date' => '$1. novembra',
+'december-date' => '$1. decembra',
# Categories related messages
'pagecategories' => '{{PLURAL:$1|Kategória|Kategórie|Kategórie}}',
@@ -473,6 +485,7 @@ $messages = array(
'create-this-page' => 'Vytvoriť túto stránku',
'delete' => 'Vymazať',
'deletethispage' => 'Vymazať túto stránku',
+'undeletethispage' => 'Obnoviť túto stránku',
'undelete_short' => 'Obnoviť {{PLURAL:$1|jednu úpravu|$1 úpravy|$1 úprav}}',
'viewdeleted_short' => 'Zobraziť {{PLURAL:$1|jednu zmazanú úpravu|$1 zmazané úpravy|$1 zmazaných úprav}}',
'protect' => 'Zamknúť',
@@ -516,7 +529,7 @@ $1',
'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).
+# 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).
'aboutsite' => 'O {{GRAMMAR:lokál|{{SITENAME}}}}',
'aboutpage' => 'Project:Úvod',
'copyright' => 'Obsah je dostupný pod $1, pokiaľ nie je uvedené inak.',
@@ -526,7 +539,6 @@ $1',
'disclaimers' => 'VylúÄenie zodpovednosti',
'disclaimerpage' => 'Project:VylúÄenie zodpovednosti',
'edithelp' => 'Ako upravovať stránku',
-'edithelppage' => 'Help:Ako upravovať stránku',
'helppage' => 'Help:Obsah',
'mainpage' => 'Hlavná stránka',
'mainpage-description' => 'Hlavná stránka',
@@ -603,17 +615,11 @@ Zoznam platných špeciálnych stránok nájdete na [[Special:SpecialPages|{{int
# General errors
'error' => 'Chyba',
'databaseerror' => 'Chyba v databáze',
-'dberrortext' => 'V databázovom dopyte sa vyskytla syntaktická chyba.
-PríÄinou môže byÅ¥ chyba v softvéri.
-Posledný dopyt bol:
-<blockquote><tt>$1</tt></blockquote>
-z funkcie „<tt>$2</tt>“.
-Databáza vrátila chybu „<tt>$3: $4</tt>“.',
-'dberrortextcl' => 'Nastala syntaktická chyba pri požiadavke do databázy.
-Posledná požiadavka na databázu bola:
-„$1“
-z funkcie „$2“.
-Databáza vrátila chybu „$3: $4“.',
+'databaseerror-text' => 'Došlo k chybe pri otázke do databázy.
+Môže to byť spôsobené chybou v softvéri.',
+'databaseerror-query' => 'Otázka: $1',
+'databaseerror-function' => 'Funkcia: $1',
+'databaseerror-error' => 'Chyba: $1',
'laggedslavemode' => 'Upozornenie: Je možné, že stránka neobsahuje posledné aktualizácie.',
'readonly' => 'Databáza je zamknutá',
'enterlockreason' => 'Zadajte dôvod požadovaného zamknutia vrátane odhadu, kedy oÄakávate odomknutie',
@@ -647,6 +653,7 @@ Možno ju už zmazal nieto iný.',
'cannotdelete-title' => 'Nemôžete zmazať stránku „$1“',
'delete-hook-aborted' => 'Zmazanie zrušila prídavná funkcia (prípojný bod syntaktického analyzátora).
Neudala vysvetlenie.',
+'no-null-revision' => 'Nepodarilo sa vytvoriť novú prázdnu revíziu stránky „$1“',
'badtitle' => 'Neplatný nadpis',
'badtitletext' => 'Požadovaný nadpis bol neplatný, nezadaný, alebo nesprávne odkazovaný z inej jazykovej verzie {{GRAMMAR:genitív|{{SITENAME}}}}. Mohol tiež obsahovať jeden alebo viac znakov, ktoré nie je možné použiť v nadpisoch.',
'perfcached' => 'Nasledujúce údaje pochádzajú z vyrovnávacej pamäte a nemusia byť úplne aktuálne. Vo vyrovnávacej pamäti {{PLURAL:$1|je dostupný|sú dostupné|je dostupných}} najviac {{PLURAL:$1|jeden výsledok|$1 výsledky|$1 výsledkov}}.',
@@ -667,12 +674,15 @@ Ak chcete pridať alebo zmeniť preklady pre všetky wiki, prosím, použite [//
'editinginterface' => "'''Upozornenie:''' Upravujete stránku, ktorá poskytuje text používateľského rozhrania.
Zmeny tejto stránky ovplyvnia vzhľad používateľského rozhrania ostatným používateľom.
Ak chcete pridať alebo zmeniť preklady pre všetky wiki, prosím, použite [//translatewiki.net/wiki/Main_Page?setlang=sk translatewiki.net], projekt lokalizácie MediaWiki.",
-'sqlhidden' => '(SQL príkaz je skrytý)',
'cascadeprotected' => 'Táto stránka bola zamknutá proti úpravám, pretože je použitá na {{PLURAL:$1|nasledovnej stránke, ktorá je zamknutá|nasledovných stránkach, ktoré sú zamknuté}} voľbou „kaskádového zamknutia“:
$2',
'namespaceprotected' => "Nemáte povolenie upravovať stránky v mennom priestore '''$1'''.",
'customcssprotected' => 'Nemáte právo upravovať túto CSS stránku, pretože obsahuje osobné nastavenie iného používateľa.',
'customjsprotected' => 'Nemáte právo upravovať túto JavaScript stránku, pretože obsahuje osobné nastavenie iného používateľa.',
+'mycustomcssprotected' => 'Nemáte povolenie na úpravu tejto CSS stránky.',
+'mycustomjsprotected' => 'Nemáte povolenie na úpravu tejto JavaScriptovej stránky.',
+'myprivateinfoprotected' => 'Nemáte povolenie na úpravu vašich súkromných informácií.',
+'mypreferencesprotected' => 'Nemáte povolenie na úpravu vašich nastavení.',
'ns-specialprotected' => 'Stránky v mennom priestore {{ns:special}} nie je možné upravovať.',
'titleprotected' => "Používateľ [[User:$1|$1]] zabránil vytváraniu stránky s týmto názvom.
Udaný dôvod: ''$2''.",
@@ -697,10 +707,19 @@ Uvedomte si, že niektoré stránky sa môžu naÄalej zobrazovaÅ¥ ako keby ste
'welcomecreation-msg' => 'Váš úÄet bol vytvorený.
Nezabudnite zmeniť svoje [[Special:Preferences|Predvoľby {{GRAMMAR:genitív|{{SITENAME}}}}]].',
'yourname' => 'Používateľské meno:',
+'userlogin-yourname' => 'Používateľské meno',
+'userlogin-yourname-ph' => 'Zadajte svoje používateľské meno',
+'createacct-another-username-ph' => 'Zadajte svoje používateľské meno',
'yourpassword' => 'Heslo:',
+'userlogin-yourpassword' => 'Heslo',
+'userlogin-yourpassword-ph' => 'Zadajte svoje heslo',
+'createacct-yourpassword-ph' => 'Zadajte heslo',
'yourpasswordagain' => 'Zopakujte heslo:',
+'createacct-yourpasswordagain' => 'Potvrdiť heslo',
+'createacct-yourpasswordagain-ph' => 'Zadajte heslo znova',
'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í',
+'userlogin-remembermypassword' => 'Zapamätať si ma',
+'userlogin-signwithsecure' => 'PoužiÅ¥ zabezpeÄené pripojenie',
'yourdomainname' => 'Vaša doména:',
'password-change-forbidden' => 'Na tejto wiki si nemôžete zmeniť heslo.',
'externaldberror' => 'BuÄ nastala chyba externej autentifikaÄnej databázy alebo vám nie je povolené aktualizovaÅ¥ váš externý úÄet.',
@@ -712,18 +731,44 @@ Nezabudnite zmeniť svoje [[Special:Preferences|Predvoľby {{GRAMMAR:genitív|{{
'logout' => 'Odhlásiť',
'userlogout' => 'Odhlásiť',
'notloggedin' => 'Neprihlásený/á',
+'userlogin-noaccount' => 'Nemáte eÅ¡te úÄet?',
+'userlogin-joinproject' => 'Pridajte sa k {{GRAMMAR:lokál|{{SITENAME}}}}',
'nologin' => 'Nemáte eÅ¡te úÄet? $1.',
'nologinlink' => 'VytvoriÅ¥ nový úÄet',
'createaccount' => 'VytvoriÅ¥ nový úÄet',
'gotaccount' => "Máte už vytvorený úÄet? '''$1'''.",
'gotaccountlink' => 'Prihlásiť',
'userlogin-resetlink' => 'Zabudli ste svoje prihlasovacie údaje?',
+'userlogin-resetpassword-link' => 'Obnoviť heslo',
+'helplogin-url' => 'Help:Prihlasovanie',
+'userlogin-helplink' => '[[{{MediaWiki:helplogin-url}}|Pomoc s prihlásením]]',
+'userlogin-loggedin' => 'Ste už {{GENDER:$1|prihĺasený|prihlásená}} ako $1.
+Pomocou formulára nižšie sa môžete prihlásiť ako iný redaktor.',
+'userlogin-createanother' => 'VytvoriÅ¥ Äalší úÄet',
+'createacct-join' => 'Vyplňte svoje údaje.',
+'createacct-another-join' => 'Vyplňte údaje nového úÄtu.',
+'createacct-emailrequired' => 'E-mailová adresa',
+'createacct-emailoptional' => 'E-mailová adresa (nepovinné)',
+'createacct-email-ph' => 'Zadajte vašu e-mailovú adresu',
+'createacct-another-email-ph' => 'Zadajte vašu e-mailovú adresu',
'createaccountmail' => 'PoužiÅ¥ doÄasné náhodné heslo a poslaÅ¥ ho na uvedenú emailovú adresu',
+'createacct-realname' => 'SkutoÄné meno (nepovinné)',
'createaccountreason' => 'Dôvod:',
+'createacct-reason' => 'Dôvod',
+'createacct-reason-ph' => 'PreÄo si vytvárate Äalší úÄet',
+'createacct-captcha' => 'BezpeÄnostná kontrola',
+'createacct-imgcaptcha-ph' => 'Zadajte text, ktorý vidíte vyššie',
+'createacct-submit' => 'VytvoriÅ¥ úÄet',
+'createacct-another-submit' => 'VytvoriÅ¥ Äalší úÄet',
+'createacct-benefit-heading' => '{{grammar:4sg|{{SITENAME}}}} tvoria ľudia ako vy.',
+'createacct-benefit-body1' => '{{PLURAL:$1|úprava|úpravy|úprav}}',
+'createacct-benefit-body2' => '{{PLURAL:$1|stránka|stránky|stránok}}',
+'createacct-benefit-body3' => '{{PLURAL:$1|nedávny prispievateľ|nedávni prispievatelia|nedávnych prispievateľov}}',
'badretype' => 'Zadané heslá nie sú rovnaké.',
'userexists' => 'Zadané používateľské meno sa už používa.
Prosím, zvoľte si iné meno.',
'loginerror' => 'Chyba pri prihlasovaní',
+'createacct-error' => 'Chyba pri vytváraní úÄtu',
'createaccounterror' => 'Nepodarilo sa vytvoriÅ¥ úÄet: $1',
'nocookiesnew' => 'Používateľské konto bolo vytvorené, ale nie ste prihlásený. {{SITENAME}} používa cookies na prihlásenie. Máte cookies vypnuté. Zapnite ich a potom sa prihláste pomocou vášho nového používateľského mena a hesla.',
'nocookieslogin' => '{{SITENAME}} používa cookies na prihlásenie. Vy máte cookies vypnuté. Prosíme, zapnite ich a skúste znovu.',
@@ -781,8 +826,8 @@ Z tohto dôvodu nemôžu návštevníci z tejto IP adresy momentálne vytvoriť
Ak bol úÄet vytvorený omylom, túto správu môžete ignorovaÅ¥.',
'usernamehasherror' => 'Používateľské meno nemôže obsahovať znak mriežky.',
-'login-throttled' => 'Nedávno ste uskutoÄnili príliÅ¡ mnoho neúspeÅ¡ných pokusov o prihlásenie.
-Prosím, poÄkajte predtým, než to skúsite znova.',
+'login-throttled' => 'UskutoÄnili ste príliÅ¡ mnoho neúspeÅ¡ných pokusov o prihlásenie.
+Prosím, poÄkajte $1 predtým, než to skúsite znova.',
'login-abort-generic' => 'Vaše prihlásenie nebolo úspešné - zrušené',
'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.',
@@ -801,7 +846,7 @@ Prosím, poÄkajte predtým, než to skúsite znova.',
'newpassword' => 'Nové heslo:',
'retypenew' => 'Nové heslo (ešte raz):',
'resetpass_submit' => 'Nastaviť heslo a prihlásiť sa',
-'resetpass_success' => 'Vaše heslo bolo úspešne zmenené! Prebieha prihlasovanie...',
+'changepassword-success' => 'Vaše heslo bolo úspešne zmenené! Prebieha prihlasovanie...',
'resetpass_forbidden' => 'Heslá nie je možné zmeniť',
'resetpass-no-info' => 'Aby ste mohli priamo pristupovať k tejto stránke, musíte sa prihlásiť.',
'resetpass-submit-loggedin' => 'Zmeniť heslo',
@@ -813,10 +858,11 @@ Je možné, že sa vám už podarilo úspešne zmeniť svoje heslo alebo ste si
# Special:PasswordReset
'passwordreset' => 'Reset hesla',
-'passwordreset-text' => 'Vyplnením tohto formulára si vytvoríte nové heslo.',
+'passwordreset-text-one' => 'Pre získanie nového hesla vyplňte tento formulár.',
+'passwordreset-text-many' => '{{PLURAL:$1|Pre získanie nového hesla zadajte jeden z údajov.}}',
'passwordreset-legend' => 'Obnoviť heslo',
'passwordreset-disabled' => 'Obnovenie hesla bolo na tejto wiki zakázané.',
-'passwordreset-pretext' => '{{PLURAL:$1|Zadajte nižšie uvedený údaj|Zadajte jeden z nižšie uvedených údajov}}',
+'passwordreset-emaildisabled' => 'E-mailové funkcie boli na tejto wiki vypnuté.',
'passwordreset-username' => 'Používateľské meno:',
'passwordreset-domain' => 'Doména:',
'passwordreset-capture' => 'Zobraziť výsledný e-mail?',
@@ -845,7 +891,7 @@ ignorovaÅ¥ a Äalej používaÅ¥ vaÅ¡e staré heslo.',
DoÄasné heslo:$2',
'passwordreset-emailsent' => 'Email s novým heslom bol odoslaný.',
'passwordreset-emailsent-capture' => 'Bol odoslaný email s novým heslom, ktorý je zobrazený nižšie.',
-'passwordreset-emailerror-capture' => 'Bol vytvorený pripomienkový e-mail, ktorý je zobrazený nižšie, ale nepodarilo sa ho odoslať používateľovi: $1',
+'passwordreset-emailerror-capture' => 'Bol odoslaný email s novým heslom, ktorý je zobrazený nižšie, ale nepodarilo sa ho odoslať používateľovi: $1',
# Special:ChangeEmail
'changeemail' => 'Zmeniť emailovú adresu',
@@ -859,6 +905,9 @@ DoÄasné heslo:$2',
'changeemail-submit' => 'Zmeniť e-mail',
'changeemail-cancel' => 'Zrušiť',
+# Special:ResetTokens
+'resettokens-tokens' => 'Tokeny:',
+
# Edit page toolbar
'bold_sample' => 'TuÄný text',
'bold_tip' => 'TuÄný text',
@@ -1058,12 +1107,15 @@ Neudala vysvetlenie.',
Zdá sa, že bola zmazaná.',
'edit-conflict' => 'Konflikt pri upravovaní.',
'edit-no-change' => 'VaÅ¡a úprava bola ignorovaná, pretože ste v texte niÄ nezmenili.',
+'postedit-confirmation' => 'Vaša úprava bola uložená.',
'edit-already-exists' => 'Nebolo možné vytvoriť novú stránku.
Už existuje.',
'defaultmessagetext' => 'Predvolený text správy',
'content-failed-to-parse' => 'Nepodarilo sa spracovať obsah $2 pre model $1: $3',
'invalid-content-data' => 'Neplatné dáta obsahu',
'content-not-allowed-here' => 'Obsah „$1“ nie je povolený na stránke [[$2]]',
+'editwarning-warning' => 'Ak opustíte túto stránku, môžete tým stratiť všetky vykonané zmeny.
+Ak ste prihlásený, toto upozornenie môžete vypnúť v sekcii „{{int:prefs-editing}}“ svojich nastavení.',
# Content models
'content-model-wikitext' => 'wikitext',
@@ -1277,6 +1329,7 @@ Uistite sa, že táto zmena zachová historickú kontinuitu zmien stránky.',
'compareselectedversions' => 'PorovnaÅ¥ oznaÄené verzie',
'showhideselectedversions' => 'Zobraziť/skryť vybrané revízie',
'editundo' => 'vrátiť',
+'diff-empty' => '(Žiaden rozdiel)',
'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}})',
'difference-missing-revision' => '{{PLURAL:$2|$2 revízia|$2 revízie|$2 revízií}} pre požadovaný rozdiel ($1) {{PLURAL:$2|neexistuje|neexistujú|neexistuje}}.
@@ -1304,7 +1357,6 @@ Podrobnosti nájdete v [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}
'searchmenu-legend' => 'Možnosti hľadania',
'searchmenu-exists' => "*Stránka '''[[$1]]'''",
'searchmenu-new' => "'''Vytvoriť stránku „[[:$1|$1]]“ na tejto wiki'''",
-'searchhelp-url' => 'Help:Obsah',
'searchmenu-prefix' => '[[Special:PrefixIndex/$1|Prehliadať stránky s touto predponou]]',
'searchprofile-articles' => 'Stránky s obsahom',
'searchprofile-project' => 'Stránky pomocníka a projektu',
@@ -1345,15 +1397,7 @@ Podrobnosti nájdete v [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}
'powersearch-togglenone' => 'Žiadne',
'search-external' => 'Externé vyhľadávanie',
'searchdisabled' => 'PrepáÄte! Fulltextové vyhľadávanie bolo doÄasne vypnuté z dôvodu preÅ¥aženia. Zatiaľ môžete použiÅ¥ hľadanie pomocou Google, ktoré vÅ¡ak nemusí byÅ¥ aktuálne.',
-
-# Quickbar
-'qbsettings' => 'NavigaÄný panel',
-'qbsettings-none' => 'Žiadne',
-'qbsettings-fixedleft' => 'Ukotvené vľavo',
-'qbsettings-fixedright' => 'Ukotvené vpravo',
-'qbsettings-floatingleft' => 'Plávajúce vľavo',
-'qbsettings-floatingright' => 'Plávajúce vpravo',
-'qbsettings-directionality' => 'Pevný, v závislosti na smerovosti písma vášho jazyka',
+'search-error' => 'Pri hľadaní sa vyskytla chyba:$1',
# Preferences page
'preferences' => 'Nastavenia',
@@ -1387,7 +1431,6 @@ Podrobnosti nájdete v [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}
'resetprefs' => 'Obnoviť pôvodné nastavenia',
'restoreprefs' => 'Obnoviť všetky nastavenia na štandardné hodnoty',
'prefs-editing' => 'Úpravy',
-'prefs-edit-boxsize' => 'Veľkosť okna na úpravy.',
'rows' => 'Riadky:',
'columns' => 'Stĺpce:',
'searchresultshead' => 'Vyhľadávanie',
@@ -1398,8 +1441,6 @@ Podrobnosti nájdete v [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}
'recentchangesdays-max' => '(maximálne $1 {{PLURAL:$1|deň|dni|dní}})',
'recentchangescount' => 'Å tandardne zobrazovaný poÄet úprav:',
'prefs-help-recentchangescount' => 'Toto sa týka posledných úprav, histórií stránok a záznamov.',
-'prefs-help-watchlist-token' => 'Ak vyplníte toto pole tajným kľúÄom, bude sa tvoriÅ¥ RSS kanál vášho zoznamu sledovaných. Ktokoľvek, kto pozná tajný kÄ¾ÃºÄ v tomto poli bude môcÅ¥ ÄítaÅ¥ váš zoznam sledovaných, preto dbajte na to, aby bol bezpeÄený.
-Tu je náhodne vytvorená hodnota, ktorú môžete použiť: $1',
'savedprefs' => 'Vaše nastavenia boli uložené.',
'timezonelegend' => 'Časové pásmo:',
'localtime' => 'Miestny Äas:',
@@ -1430,7 +1471,6 @@ Tu je náhodne vytvorená hodnota, ktorú môžete použiť: $1',
'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:',
-'prefs-textboxsize' => 'Veľkosť okna na úpravy',
'youremail' => 'Váš e-mail²',
'username' => 'Používateľské meno:',
'uid' => 'ID používateľa:',
@@ -1461,6 +1501,7 @@ Musí obsahovať menej ako $1 {{PLURAL:$1|znak|znaky|znakov}}.',
'prefs-dateformat' => 'Formát dátumu',
'prefs-timeoffset' => 'Časový posun',
'prefs-advancedediting' => 'Rozšírené možnosti',
+'prefs-preview' => 'Náhľad',
'prefs-advancedrc' => 'Rozšírené možnosti',
'prefs-advancedrendering' => 'Rozšírené možnosti',
'prefs-advancedsearchoptions' => 'Rozšírené možnosti',
@@ -1565,6 +1606,7 @@ Musí obsahovať menej ako $1 {{PLURAL:$1|znak|znaky|znakov}}.',
'right-editusercssjs' => 'Upravovať CSS a JS súbory ostatných používateľov',
'right-editusercss' => 'Upravovať CSS súbory ostatných používateľov',
'right-edituserjs' => 'Upravovať JS súbory ostatných používateľov',
+'right-editmyoptions' => 'Upraviť vlastné nastavenia',
'right-rollback' => 'Rýchlo vrátiť úpravy posledného používateľa, ktorý upravoval danú stránku',
'right-markbotedits' => 'OznaÄiÅ¥ vrátené úpravy ako úpravy robota',
'right-noratelimit' => 'Neovplyvnené obmedzeniami',
@@ -1626,12 +1668,18 @@ Musí obsahovať menej ako $1 {{PLURAL:$1|znak|znaky|znakov}}.',
'action-userrights-interwiki' => 'upravovať práva používateľov na iných wiki',
'action-siteadmin' => 'zamykať alebo odomykať databázu',
'action-sendemail' => 'posielať e-maily',
+'action-editmywatchlist' => 'upraviť zoznam sledovaných stránok',
+'action-viewmywatchlist' => 'zobraziť zoznam sledovaných stránok',
+'action-viewmyprivateinfo' => 'zobraziť vaše súkromné údaje',
+'action-editmyprivateinfo' => 'upraviť vaše súkromné údaje',
# Recent changes
'nchanges' => '$1 {{PLURAL:$1|zmena|zmeny|zmien}}',
+'enhancedrc-history' => 'história',
'recentchanges' => 'Posledné úpravy',
'recentchanges-legend' => 'Možnosti posledných zmien',
'recentchanges-summary' => 'Pomocou tejto stránky sledujete posledné úpravy wiki.',
+'recentchanges-noresult' => 'V danom období nie sú zmeny spĺňajúce tieto kritériá.',
'recentchanges-feed-description' => 'Sledovať posledné úpravy tejto wiki týmto kanálom.',
'recentchanges-label-newpage' => 'Táto úprava vytvorila novú stránku.',
'recentchanges-label-minor' => 'Toto je drobná úprava',
@@ -1668,7 +1716,6 @@ Musí obsahovať menej ako $1 {{PLURAL:$1|znak|znaky|znakov}}.',
'recentchangeslinked-feed' => 'Súvisiace úpravy',
'recentchangeslinked-toolbox' => 'Súvisiace úpravy',
'recentchangeslinked-title' => 'Zmeny týkajúce sa „$1â€',
-'recentchangeslinked-noresult' => 'V zadanom období neboli odkazované stránky zmenené.',
'recentchangeslinked-summary' => "Táto špeciálna stránka obsahuje zoznam posledných úprav stránok, ''na ktoré odkazuje'' zadaná stránka (alebo ktoré patria do zadanej kategórie).
Stránky, ktoré sa nachádzajú vo vaÅ¡om [[Special:Watchlist|zozname sledovaných]] sú vyznaÄené '''hrubo'''.",
'recentchangeslinked-page' => 'Názov stránky:',
@@ -1680,7 +1727,7 @@ Stránky, ktoré sa nachádzajú vo vaÅ¡om [[Special:Watchlist|zozname sledovanÃ
'reuploaddesc' => 'Zrušiť nahrávanie a vrátiť sa späť na nahrávací formulár.',
'upload-tryagain' => 'Poslať zmenený popis súboru',
'uploadnologin' => 'Nie ste prihlásený',
-'uploadnologintext' => 'Musíte byť [[Special:UserLogin|prihlásený/á]], aby ste mohli nahrávať súbory.',
+'uploadnologintext' => 'Musíte sa $1, aby ste mohli nahrávať súbory.',
'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í',
@@ -1907,7 +1954,6 @@ Aby bolo zabezpeÄenie optimálne, img_auth.php je vypnutý.',
'http-read-error' => 'Chyba Äítania HTTP.',
'http-timed-out' => 'Vyhradený Äas požiadavky HTTP vyprÅ¡al.',
'http-curl-error' => 'Chyba pri sťahovaní URL: $1',
-'http-host-unreachable' => 'URL nie je dostupný',
'http-bad-status' => 'PoÄas požiadavky HTTP nastal problém: $1 $2',
# Some likely curl errors. More could be added from <http://curl.haxx.se/libcurl/c/libcurl-errors.html>
@@ -1935,6 +1981,10 @@ Aby bolo zabezpeÄenie optimálne, img_auth.php je vypnutý.',
'listfiles_size' => 'Veľkosť (v bajtoch)',
'listfiles_description' => 'Popis',
'listfiles_count' => 'Verzie',
+'listfiles-show-all' => 'Vrátane starších verzií obrázkov',
+'listfiles-latestversion' => 'Aktuálna verzia',
+'listfiles-latestversion-yes' => 'Ãno',
+'listfiles-latestversion-no' => 'Nie',
# File description page
'file-anchor-link' => 'Súbor',
@@ -2027,6 +2077,13 @@ Možno chcete upraviť popis na jeho [$2 popisnej stránke súboru] tam.',
'randompage' => 'Náhodná stránka',
'randompage-nopages' => '{{PLURAL:$2|V mennom priestore „$1“ nie sú žiadne stránky.|V nasledovných menných priestoroch nie sú žiadne stránky: $1}}',
+# Random page in category
+'randomincategory' => 'Náhodná stránka v kategórii',
+'randomincategory-invalidcategory' => '"$1" nie je platný názov kategórie.',
+'randomincategory-nopages' => 'V [[:Category:$1|kategórii $1]] nie sú žiadne stránky.',
+'randomincategory-selectcategory' => 'Získať náhodnú stránku z kategórie: $1 $2',
+'randomincategory-selectcategory-submit' => 'ÃsÅ¥ na',
+
# Random redirect
'randomredirect' => 'Náhodná presmerovacia stránka',
'randomredirect-nopages' => 'V mennom „$1“ priestore nie sú žiadne presmerovania.',
@@ -2052,12 +2109,6 @@ Možno chcete upraviť popis na jeho [$2 popisnej stránke súboru] tam.',
'statistics-users-active-desc' => 'Používatelia, ktorí za {{PLURAL:$1|posledný deň|posledné $1 dni|posledných $1 dní}} vykonali nejakú operáciu',
'statistics-mostpopular' => 'NajÄastejÅ¡ie prezerané stránky',
-'disambiguations' => 'Stránky odkazujúce na rozlišovacie stránky',
-'disambiguationspage' => 'Template:Rozlišovacia stránka',
-'disambiguations-text' => "Nasledovné stránky odkazujú na '''rozlišovaciu stránku'''.
-Mali by však odkazovať priamo na príslušnú tému.<br />
-Stránka sa považuje za rozliÅ¡ovaciu, keÄ používa Å¡ablónu, na ktorú odkazuje [[MediaWiki:Disambiguationspage]].",
-
'pageswithprop' => 'Stránky s vlastnosťou stránky',
'pageswithprop-legend' => 'Stránky s vlastnosťou stránky',
'pageswithprop-text' => 'Táto stránka obsahuje stránky, ktoré používajú konkrétnu vlastnosť stránky.',
@@ -2120,6 +2171,7 @@ Každý riadok obsahuje odkaz na prvé a druhé presmerovanie a tiež prvý riad
'mostrevisions' => 'Stránky s najväÄším poÄtom úprav',
'prefixindex' => 'Všetky stránky s predponou',
'prefixindex-namespace' => 'Všetky stránky s predponou (menný priestor $1)',
+'prefixindex-strip' => 'Zobraziť bez predpony',
'shortpages' => 'Krátke stránky',
'longpages' => 'Dlhé stránky',
'deadendpages' => 'Slepé stránky',
@@ -2311,10 +2363,9 @@ Budú tam uvedené aj budúce úpravy tejto stránky a jej diskusie.',
'unwatchthispage' => 'Prestať sledovať túto stránku',
'notanarticle' => 'Toto nie je stránka',
'notvisiblerev' => 'Revízia bola zmazaná',
-'watchnochange' => 'V rámci zobrazeného Äasu nebola upravená žiadna z vaÅ¡ich sledovaných stránok.',
'watchlist-details' => '{{PLURAL:$1|Jedna sledovaná stránka|$1 sledované stránky|$1 sledovaných stránok}}, nepoÄítajúc diskusné stránky.',
-'wlheader-enotif' => '* Upozorňovanie e-mailom je zapnuté.',
-'wlheader-showupdated' => "* Stránky, ktoré boli zmené od vaÅ¡ej poslednej návÅ¡tevy sú zobrazené '''tuÄne'''.",
+'wlheader-enotif' => 'Upozorňovanie e-mailom je zapnuté.',
+'wlheader-showupdated' => "Stránky, ktoré boli zmenené od vaÅ¡ej poslednej návÅ¡tevy sú zobrazené '''tuÄne'''.",
'watchmethod-recent' => 'kontrolujú sa sledované stránky v posledných úpravách',
'watchmethod-list' => 'kontrolujú posledné úpravy v sledovaných stránkach',
'watchlistcontains' => 'Váš zoznam sledovaných obsahuje {{PLURAL:$1|jednu stránku|$1 stránky|$1 stránok}}.',
@@ -2709,11 +2760,8 @@ blokované IP adresy nie sú zahrnuté. Pozri zoznam
'ipb_blocked_as_range' => 'Chyba: IP adresa $1 nie je blokovaná priamo a nie je ju teda možné odblokovať. Je však blokovaná v rámci rozsahu $2, ktorý je možné odblokovať.',
'ip_range_invalid' => 'Neplatný IP rozsah.',
'ip_range_toolarge' => 'Bloky rozsahov väÄÅ¡ie ako /$1 nie sú povolené.',
-'blockme' => 'Zablokuj ma',
'proxyblocker' => 'BlokovaÄ proxy',
-'proxyblocker-disabled' => 'Táto funkcia je vypnutá.',
'proxyblockreason' => 'VaÅ¡a IP adresa bola zablokovaná, pretože je otvorená proxy. Prosím kontaktujte vášho internetového poskytovateľa alebo technickú podporu a informujte ich o tomto vážnom bezpeÄnostnom probléme.',
-'proxyblocksuccess' => 'Hotovo.',
'sorbsreason' => 'VaÅ¡a IP adresa je vedená ako nezabezpeÄený proxy server v DNSBL.',
'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ý.',
@@ -2891,6 +2939,8 @@ Prosím, navštívte [//www.mediawiki.org/wiki/Localisation MediaWiki Localisati
'thumbnail-more' => 'ZväÄÅ¡iÅ¥',
'filemissing' => 'Chýbajúci súbor',
'thumbnail_error' => 'Chyba pri vytváraní náhľadu: $1',
+'thumbnail_error_remote' => 'Chybová správa z $1:
+$2',
'djvu_page_error' => 'DjVu stránka mimo rozsahu',
'djvu_no_xml' => 'Nebolo možné priniesť XML DjVu súboru',
'thumbnail-temp-create' => 'Nie je možné vytvoriÅ¥ doÄasný súbor náhľadu',
@@ -3040,17 +3090,11 @@ Umožnuje do zhrnutia pridanie dôvodu.',
# Stylesheets
'common.css' => '/* Tu umiestnené CSS bude ovplyvňovať všetky štýly */',
-'standard.css' => '/* Tu umiestnené CSS bude ovplyvňovať používateľov štýlu Klasický */',
-'nostalgia.css' => '/* Tu umiestnené CSS bude ovplyvňovať používateľov štýlu Nostalgia */',
'cologneblue.css' => '/* Tu umiestnené CSS bude ovplyvňovať používateľov štýlu Kolínska modrá */',
'monobook.css' => '/* Tu umiestnené CSS bude ovplyvňovať používateľov štýlu Monobook */',
-'myskin.css' => '/* Tu umiestnené CSS bude ovplyvňovať používateľov štýlu Môjvzhľad */',
-'chick.css' => '/* Tu umiestnené CSS bude ovplyvňovať používateľov štýlu Kuriatko */',
-'simple.css' => '/* Tu umiestnené CSS bude ovplyvňovať používateľov štýlu Jednoduchý */',
'modern.css' => '/* Tu umiestnené CSS bude ovplyvňovať používateľov štýlu Moderný */',
'vector.css' => '/* Tu umiestnené CSS bude ovplyvňovať používateľov štýlu Vector */',
'print.css' => '/* Tu umiestnené CSS bude ovplyvňovaÅ¥ tlaÄový výstup */',
-'handheld.css' => '/* Tu umiestnené CSS bude ovplyvňovať prenosné zariadenia vychádzajúceho zo štýlu nastaveného v $wgHandheldStyle */',
'noscript.css' => '/* Tu umiestnené CSS bude ovplyvňovať používateľov s vypnutým JavaScriptom */',
'group-autoconfirmed.css' => '/* Tu umiestnené CSS bude ovplyvňovať iba používateľov s overenou emailovou adresou */',
'group-bot.css' => '/* Tu umiestnené CSS bude ovplyvňovať iba robotov */',
@@ -3059,13 +3103,8 @@ Umožnuje do zhrnutia pridanie dôvodu.',
# Scripts
'common.js' => '/* Tu uvedený JavaScript sa nahrá všetkým používateľom pri každom nahraní stránky. */',
-'standard.js' => '/* Tu sa nachádzajúci JavaScript sa naÄíta používateľom vzhľadu Klasický */',
-'nostalgia.js' => '/* Tu sa nachádzajúci JavaScript sa naÄíta používateľom vzhľadu Nostalgia */',
'cologneblue.js' => '/* Tu sa nachádzajúci JavaScript sa naÄíta používateľom vzhľadu Kolínska modrá */',
'monobook.js' => '/* Tu sa nachádzajúci JavaScript sa naÄíta používateľom vzhľadu Monobook */',
-'myskin.js' => '/* Tu sa nachádzajúci JavaScript sa naÄíta používateľom vzhľadu Môjvzhľad */',
-'chick.js' => '/* Tu sa nachádzajúci JavaScript sa naÄíta používateľom vzhľadu Kuriatko */',
-'simple.js' => '/* Tu sa nachádzajúci JavaScript sa naÄíta používateľom vzhľadu Jednoduchý */',
'modern.js' => '/* Tu sa nachádzajúci JavaScript sa naÄíta používateľom vzhľadu Moderný */',
'vector.js' => '/* Tu sa nachádzajúci JavaScript sa naÄíta používateľom vzhľadu Vector */',
'group-autoconfirmed.js' => '/* Tu sa nachádzajúci JavaScript sa naÄíta používateľom s potvrdenou emailovou adresou */',
@@ -3145,13 +3184,8 @@ Pravdepodobne to spôsobil odkaz na externú internetovú lokalitu, ktorá sa na
'pageinfo-category-files' => 'PoÄet súborov',
# Skin names
-'skinname-standard' => 'Klasický',
-'skinname-nostalgia' => 'Nostalgia',
'skinname-cologneblue' => 'Kolínska modrá',
'skinname-monobook' => 'MonoBook',
-'skinname-myskin' => 'Môj vzhľad',
-'skinname-chick' => 'Kuriatko',
-'skinname-simple' => 'Jednoduchý',
'skinname-modern' => 'Moderný',
'skinname-vector' => 'Vector',
@@ -3230,11 +3264,25 @@ Jeho spustením môžete kompromitovať svoj systém.",
'minutes' => '{{PLURAL:$1|$1 minúta|$1 minúty|$1 minút}}',
'hours' => '{{PLURAL:$1|$1 hodina|$1 hodiny|$1 hodín}}',
'days' => '{{PLURAL:$1|$1 deň|$1 dni|$1 dní}}',
+'weeks' => '{{PLURAL:$1|$1 týždeň|$1 týždne|$1 týždňov}}',
'months' => '{{PLURAL:$1|$1 mesiac|$1 mesiace|$1 mesiacov}}',
'years' => '{{PLURAL:$1|$1 rok|$1 rok|$1 rokov}}',
'ago' => 'pred: $1',
'just-now' => 'Pred chvíľkou',
+# Human-readable timestamps
+'hours-ago' => 'pred $1 {{PLURAL:$1|hodinou|hodinami}}',
+'minutes-ago' => 'pred $1 {{PLURAL:$1|minútou|minútami}}',
+'seconds-ago' => 'pred $1 {{PLURAL:$1|sekundou|sekundami}}',
+'monday-at' => 'v pondelok o $1',
+'tuesday-at' => 'v utorok o $1',
+'wednesday-at' => 'v stredu o $1',
+'thursday-at' => 'vo Å¡tvrtok o $1',
+'friday-at' => 'v piatok o $1',
+'saturday-at' => 'v sobotu o $1',
+'sunday-at' => 'v nedeľu o $1',
+'yesterday-at' => 'vÄera o $1',
+
# Bad image list
'bad_image_list' => 'Formát je nasledovný:
@@ -3262,7 +3310,7 @@ Ostatné budú predvolene skryté.
* gpslongitude
* gpsaltitude',
-# EXIF tags
+# Exif tags
'exif-imagewidth' => 'Šírka',
'exif-imagelength' => 'Výška',
'exif-bitspersample' => 'Bitov na zložku',
@@ -3440,7 +3488,7 @@ Ostatné budú predvolene skryté.
'exif-originalimageheight' => 'Výška obrázka pred orezaním',
'exif-originalimagewidth' => 'Šírka obrázka pred orezaním',
-# EXIF attributes
+# Exif attributes
'exif-compression-1' => 'Bez kompresie',
'exif-compression-2' => 'CCITT Group 3 1-rozmerné modifikované Huffmanovo kódovanie RLE',
'exif-compression-3' => 'CCITT Group 3 faxové kódovanie',
@@ -3840,7 +3888,6 @@ Tiež môžete [[Special:EditWatchlist|použiť štandardný editor]].',
'version-other' => 'Iné',
'version-mediahandlers' => 'Obsluha multimédií',
'version-hooks' => 'Prípojné body',
-'version-extension-functions' => 'Rozširujúce funkcie',
'version-parser-extensiontags' => 'RozÅ¡irujúce znaÄky syntaxe',
'version-parser-function-hooks' => 'Prípojné body funkcií syntaktického analyzátora',
'version-hook-name' => 'Názov prípojného bodu',
@@ -3849,6 +3896,7 @@ Tiež môžete [[Special:EditWatchlist|použiť štandardný editor]].',
'version-license' => 'Licencia',
'version-poweredby-credits' => "Táto wiki beží na '''[//www.mediawiki.org/ MediaWiki]''', copyright © 2001-$1 $2.",
'version-poweredby-others' => 'Äalší',
+'version-poweredby-translators' => 'prekladatelia na translatewiki.net',
'version-credits-summary' => 'Nasledujúcim osobám by sme radi poÄakovali za ich príspevky k vývoju [[Special:Version|MediaWiki]].',
'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.
@@ -3862,12 +3910,17 @@ Spolu s týmto programom by ste obdržať [{{SERVER}}{{SCRIPTPATH}}/COPYING kóp
'version-entrypoints-header-entrypoint' => 'Vstupný bod',
'version-entrypoints-header-url' => 'URL',
-# Special:FilePath
-'filepath' => 'Cesta k súboru',
-'filepath-page' => 'Súbor:',
-'filepath-submit' => 'Vykonať',
-'filepath-summary' => 'Táto špeciálna stránka vráti úplnú cestu k súboru.
-Obrázky sa zobrazia v plnom rozlíšení, ostatné typy súborov sa spustia v príslušnom priradenom programe.',
+# Special:Redirect
+'redirect' => 'Presmerovanie podľa súboru, používateľa alebo ID revízie',
+'redirect-legend' => 'Presmerovanie na súbor alebo stránku',
+'redirect-summary' => 'Táto Å¡peciálna stránka presmerováva na súbor (podľa názvu), stránku (podľa identifikátora revízie) alebo používateľa (podľa Äíselného identifikátora používateľa).',
+'redirect-submit' => 'ÃsÅ¥',
+'redirect-lookup' => 'Vyhľadať:',
+'redirect-value' => 'Hodnota:',
+'redirect-user' => 'ID používateľa',
+'redirect-revision' => 'Revíziu stránky',
+'redirect-file' => 'Názov súboru',
+'redirect-not-exists' => 'Hodnota nebola nájdená',
# Special:FileDuplicateSearch
'fileduplicatesearch' => 'Hľadať duplicitné súbory',
@@ -3917,12 +3970,15 @@ Obrázky sa zobrazia v plnom rozlíšení, ostatné typy súborov sa spustia v p
'tags' => 'Platné oznaÄenia zmien',
'tag-filter' => 'Filter [[Special:Tags|znaÄiek]]:',
'tag-filter-submit' => 'Filter',
+'tag-list-wrapper' => '([[Special:Tags|{{PLURAL:$1|ZnaÄka|ZnaÄky}}]]: $2)',
'tags-title' => 'ZnaÄky',
'tags-intro' => 'Táto stránka obsahuje zoznam znaÄiek, s ktorým softvér môže pracovaÅ¥ a upravovaÅ¥ ich a ich význam.',
'tags-tag' => 'Názov znaÄky',
'tags-display-header' => 'Vzhľad v zoznamoch úprav',
'tags-description-header' => 'Úplný popis významu',
'tags-hitcount-header' => 'OznaÄené úpravy',
+'tags-active-yes' => 'Ãno',
+'tags-active-no' => 'Nie',
'tags-edit' => 'upraviť',
'tags-hitcount' => '$1 {{PLURAL:$1|zmena|zmeny|zmien}}',
@@ -3943,6 +3999,7 @@ Obrázky sa zobrazia v plnom rozlíšení, ostatné typy súborov sa spustia v p
'dberr-problems' => 'PrepáÄte! Táto stránka má práve technické problémy.',
'dberr-again' => 'Skúste niekoľko minút poÄkaÅ¥ a potom opäť naÄítaÅ¥ stránku.',
'dberr-info' => '(Spojenie s databázovým serverom neúspešné: $1)',
+'dberr-info-hidden' => '(Nie je možné kontaktovať databázový server)',
'dberr-usegoogle' => 'Zatiaľ môžete skúsiť hľadať pomocou Google.',
'dberr-outofdate' => 'Pamätajte, že ich indexy nemusia byť aktuálne.',
'dberr-cachederror' => 'Toto je kópia požadovanej stránky z vyrovnávacej pamäte a nemusí byť aktuálna.',
@@ -3958,6 +4015,9 @@ Obrázky sa zobrazia v plnom rozlíšení, ostatné typy súborov sa spustia v p
'htmlform-submit' => 'Odoslať',
'htmlform-reset' => 'Vrátiť zmeny',
'htmlform-selectorother-other' => 'Iné',
+'htmlform-no' => 'Nie',
+'htmlform-yes' => 'Ãno',
+'htmlform-chosen-placeholder' => 'Vyberte možnosť',
# SQLite database support
'sqlite-has-fts' => '$1 s podporou vyhľadávania v plnom texte',
@@ -4075,4 +4135,11 @@ V opaÄnom prípade môžete použiÅ¥ zjednoduÅ¡ený formulár nižšie. Váš k
# Image rotation
'rotate-comment' => 'Obrázok otoÄený o $1 {{PLURAL:$1|stupeň|stupne|stupňov}} v smere hodinových ruÄiÄiek',
+# Limit report
+'limitreport-postexpandincludesize-value' => '$1/$2 {{PLURAL:$2|bajt|bajty|bajtov}}',
+'limitreport-templateargumentsize' => 'Veľkosť argumentov šablón',
+'limitreport-templateargumentsize-value' => '$1/$2 {{PLURAL:$2|bajt|bajty|bajtov}}',
+'limitreport-expansiondepth' => 'NajväÄÅ¡ia hĺbka expanzie',
+'limitreport-expensivefunctioncount' => 'PoÄet nároÄných funkcií parseru',
+
);
diff --git a/languages/messages/MessagesSl.php b/languages/messages/MessagesSl.php
index 23a5cfb2..040fef74 100644
--- a/languages/messages/MessagesSl.php
+++ b/languages/messages/MessagesSl.php
@@ -11,7 +11,9 @@
* @author Eleassar
* @author Freakolowsky
* @author Irena Plahuta
+ * @author Matej1234
* @author McDutchie
+ * @author Nemo bis
* @author Smihael
* @author Vadgt
* @author XJamRastafire
@@ -216,9 +218,6 @@ $messages = array(
'tog-shownumberswatching' => 'Prikaži število uporabnikov, ki spremljajo temo',
'tog-oldsig' => 'Trenutni podpis:',
'tog-fancysig' => 'Obravnavaj podpis kot wikibesedilo (brez samodejne povezave)',
-'tog-externaleditor' => 'Po privzetem uporabljaj zunanji urejevalnik (samo za strokovnjake; potrebuje posebne nastavitve na vaÅ¡em raÄunalniku; [//www.mediawiki.org/wiki/Manual:External_editors veÄ informacij])',
-'tog-externaldiff' => 'Po privzetem uporabljaj zunanje primerjanje (samo za strokovnjake; potrebuje posebne nastavitve na vaÅ¡em raÄunalniku; [//www.mediawiki.org/wiki/Manual:External_editors veÄ informacij])',
-'tog-showjumplinks' => 'Prikaži pomožni povezavi »SkoÄi na«',
'tog-uselivepreview' => 'Uporabi hitri predogled (preizkusno)',
'tog-forceeditsummary' => 'Ob vpisu praznega povzetka urejanja me opozori',
'tog-watchlisthideown' => 'Na spisku nadzorov skrij moja urejanja',
@@ -231,6 +230,8 @@ $messages = array(
'tog-diffonly' => 'Pod primerjavo ne prikaži vsebine strani',
'tog-showhiddencats' => 'Prikaži skrite kategorije',
'tog-norollbackdiff' => 'Ne prikaži primerjave po izvedeni vrnitvi',
+'tog-useeditwarning' => 'Opozori me, ko skušam zapreti urejevalno polje z neshranjenimi spremembami',
+'tog-prefershttps' => 'Med prijavo vedno uporabljaj varno povezavo',
'underline-always' => 'Vedno',
'underline-never' => 'Nikoli',
@@ -294,6 +295,18 @@ $messages = array(
'oct' => 'okt.',
'nov' => 'nov.',
'dec' => 'dec.',
+'january-date' => '$1. januar',
+'february-date' => '$1. februar',
+'march-date' => '$1. marec',
+'april-date' => '$1. april',
+'may-date' => '$1. maj',
+'june-date' => '$1. junij',
+'july-date' => '$1. julij',
+'august-date' => '$1. avgust',
+'september-date' => '$1. september',
+'october-date' => '$1. oktober',
+'november-date' => '$1. november',
+'december-date' => '$1. december',
# Categories related messages
'pagecategories' => '{{PLURAL:$1|Kategorija|Kategoriji|Kategorije}}',
@@ -375,6 +388,7 @@ $messages = array(
'create-this-page' => 'Ustvari stran',
'delete' => 'Briši',
'deletethispage' => 'Briši stran',
+'undeletethispage' => 'Obnovi stran',
'undelete_short' => 'Vrni $1 {{PLURAL:$1|izbrisano urejanje|izbrisani urejanji|izbrisana urejanja|izbrisanih urejanj|izbrisanih urejanj}}',
'viewdeleted_short' => 'Ogled {{PLURAL:$1|enega izbrisanega urejanja|$1 izbrisanih urejanj}}',
'protect' => 'ZaÅ¡Äiti',
@@ -418,7 +432,7 @@ $1',
'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).
+# 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).
'aboutsite' => 'O {{GRAMMAR:dajalnik|{{SITENAME}}}}',
'aboutpage' => 'Project:O {{GRAMMAR:dajalnik|{{SITENAME}}}}',
'copyright' => 'Razen, kjer je navedeno drugaÄe, je besedilo na razpolago pod pogoji licence $1.',
@@ -428,7 +442,6 @@ $1',
'disclaimers' => 'Zanikanja odgovornosti',
'disclaimerpage' => 'Project:Splošno zanikanje odgovornosti',
'edithelp' => 'PomoÄ pri urejanju',
-'edithelppage' => 'Help:Urejanje',
'helppage' => 'Help:Vsebina',
'mainpage' => 'Glavna stran',
'mainpage-description' => 'Glavna stran',
@@ -506,17 +519,12 @@ Seznam vseh prepoznanih posebnih strani je na razpolago na strani [[Special:Spec
# General errors
'error' => 'Napaka',
'databaseerror' => 'Napaka zbirke podatkov',
-'dberrortext' => 'Prišlo je do napake podatkovne zbirke.
-Vzrok je lahko programski hroÅ¡Ä v programju.
-Zadnja poskušana poizvedba po zbirki podatkov:
-<blockquote><code>$1</code></blockquote>
-znotraj funkcije »<code>$2</code>«.
-Zbirka podatkov je vrnila napako »<samp>$3: $4</samp>«.',
-'dberrortextcl' => 'Pri iskanju v podatkoovni zbirki je prišlo do skladenjske napake.
-Zadnje iskanje v zbirki podatkov:
-»$1«
-iz funkcije »$2«.
-Podatkovna zbirka je vrnila napako »$3: $4«.',
+'databaseerror-text' => 'Prišlo je do napake poizvedbe v zbirki podatkov.
+To lahko pomeni hroÅ¡Äa v programju.',
+'databaseerror-textcl' => 'Prišlo je do napake poizvedbe v zbirki podatkov.',
+'databaseerror-query' => 'Poizvedba: $1',
+'databaseerror-function' => 'Funkcija: $1',
+'databaseerror-error' => 'Napaka: $1',
'laggedslavemode' => "'''Opozorilo:''' Stran morda ne vsebuje najnovejših posodobitev.",
'readonly' => 'Zbirka podatkov je zaklenjena',
'enterlockreason' => 'Vnesite razlog za zaklenitev in oceno, kdaj bo urejanje spet mogoÄe',
@@ -550,6 +558,7 @@ Morda jo je izbrisal že kdo drug.',
'cannotdelete-title' => 'Ne morem izbrisati strani »$1«',
'delete-hook-aborted' => 'Zanka je prekinila brisanje.
Vrnila ni nobene razlage.',
+'no-null-revision' => 'Ne morem ustvariti nove niÄelne redakcije strani »$1«',
'badtitle' => 'Nepravilen naslov',
'badtitletext' => 'Navedeni naslov strani je neveljaven, prazen, napaÄno povezan k drugim jezikom oziroma wikiprojektom.
Morda vsebuje enega ali veÄ nepodprtih znakov.',
@@ -573,12 +582,15 @@ Za dodajanje ali spreminjanje prevodov vseh wikijev uporabite [//translatewiki.n
'editinginterface' => "'''Opozorilo:''' Urejate stran, ki vsebuje besedilo ali drug element uporabniškega vmesnika programja.
Spremembe te strani bodo vplivale na podobo uporabniškega vmesnika ostalih uporabnikov na tem wikiju.
Za dodajanje ali spreminjanje prevodov vseh wikijev uporabite [//translatewiki.net/ translatewiki.net], projekt za lokalizacijo MediaWiki.",
-'sqlhidden' => '(Poizvedba SQL je skrita)',
'cascadeprotected' => 'Ta stran je bila zaÅ¡Äitena pred urejanji, ker je vkljuÄena na {{PLURAL:$1|sledeÄo stran, ki je bila zaÅ¡Äitena|sledeÄi strani, ki sta bili zaÅ¡Äiteni|sledeÄe strani, ki so bile zaÅ¡Äitene}} z vkljuÄeno kaskadno možnostjo:
$2',
'namespaceprotected' => "Za urejanje strani v imenskem prostoru '''$1''' nimate dovoljenja.",
'customcssprotected' => 'Nimate pravice urejati te strani CSS, ker vsebuje osebne nastavitve drugega uporabnika.',
'customjsprotected' => 'Nimate pravice urejati te strani JavaScript, ker vsebuje osebne nastavitve drugega uporabnika.',
+'mycustomcssprotected' => 'Nimate pravic za urejanje te strani s CSS.',
+'mycustomjsprotected' => 'Nimate pravic za urejanje te strani z JavaScriptom.',
+'myprivateinfoprotected' => 'Nimate dovoljenja za urejanje svojih zasebnih podatkov.',
+'mypreferencesprotected' => 'Nimate dovoljenja za urejanje svojih nastavitev.',
'ns-specialprotected' => 'Posebnih strani ni mogoÄe urejati.',
'titleprotected' => "Uporabnik [[User:$1|$1]] je prepreÄil ustvarjanje strani s takim naslovom.
Podani razlog je bil »''$2''«.",
@@ -603,10 +615,19 @@ Nekatere strani bodo morda Å¡e naprej prikazane, kot da ste prijavljeni, dokler
'welcomecreation-msg' => 'Ustvarili ste raÄun.
Ne pozabite si prilagoditi vaših [[Special:Preferences|nastavitev {{GRAMMAR:rodilnik|{{SITENAME}}}}]].',
'yourname' => 'Uporabniško ime:',
+'userlogin-yourname' => 'Uporabniško ime',
+'userlogin-yourname-ph' => 'Vnesite svoje uporabniško ime',
+'createacct-another-username-ph' => 'Vnesite uporabniško ime',
'yourpassword' => 'Geslo:',
+'userlogin-yourpassword' => 'Geslo',
+'userlogin-yourpassword-ph' => 'Vnesite svoje geslo',
+'createacct-yourpassword-ph' => 'Vnesite geslo',
'yourpasswordagain' => 'Ponovno vpišite geslo',
+'createacct-yourpasswordagain' => 'Potrdite geslo',
+'createacct-yourpasswordagain-ph' => 'Ponovno vnesite geslo',
'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',
+'userlogin-remembermypassword' => 'Zapomni si me',
+'userlogin-signwithsecure' => 'Uporabi varno povezavo',
'yourdomainname' => 'Domena',
'password-change-forbidden' => 'Na tem wikiju ne morete spreminjati gesel.',
'externaldberror' => 'Pri potrjevanju istovetnosti je priÅ¡lo do notranje napake ali pa za osveževanje zunanjega raÄuna nimate dovoljenja.',
@@ -618,18 +639,44 @@ Ne pozabite si prilagoditi vaših [[Special:Preferences|nastavitev {{GRAMMAR:rod
'logout' => 'Odjava',
'userlogout' => 'Odjava',
'notloggedin' => 'Niste prijavljeni',
+'userlogin-noaccount' => 'Nimate uporabniÅ¡kega raÄuna?',
+'userlogin-joinproject' => 'Pridružite se {{GRAMMAR:dajalnik|{{SITENAME}}}}',
'nologin' => 'Å e nimate uporabniÅ¡kega raÄuna? $1!',
'nologinlink' => 'Registrirajte se',
'createaccount' => 'Registracija',
'gotaccount' => 'RaÄun že imate? $1.',
'gotaccountlink' => 'Prijavite se',
'userlogin-resetlink' => 'Ste pozabili svoje prijavne podatke?',
+'userlogin-resetpassword-link' => 'Ponastavite svoje geslo',
+'helplogin-url' => 'Help:Prijava',
+'userlogin-helplink' => '[[{{MediaWiki:helplogin-url}}|PomoÄ pri prijavi]]',
+'userlogin-loggedin' => 'Ste že prijavljeni kot {{GENDER:$1|$1}}.
+Uporabite spodnji obrazec, da se prijavite kot drug uporabnik.',
+'userlogin-createanother' => 'Ustvari drug raÄun',
+'createacct-join' => 'Spodaj vnesite svoje informacije.',
+'createacct-another-join' => 'Spodaj vnesite informacije o novem raÄunu.',
+'createacct-emailrequired' => 'E-poštni naslov',
+'createacct-emailoptional' => 'E-poštni naslov (izbirno)',
+'createacct-email-ph' => 'Vnesite svoj e-poštni naslov',
+'createacct-another-email-ph' => 'Vnesite e-poštni naslov',
'createaccountmail' => 'Ustvari zaÄasno nakljuÄno geslo in ga poÅ¡lji na spodaj navedeni e-poÅ¡tni naslov',
+'createacct-realname' => 'Pravo ime (izbirno)',
'createaccountreason' => 'Razlog:',
+'createacct-reason' => 'Razlog',
+'createacct-reason-ph' => 'Zakaj ustvarjate drug raÄun',
+'createacct-captcha' => 'Varnostno preverjanje',
+'createacct-imgcaptcha-ph' => 'Vnesite zgornje besedilo',
+'createacct-submit' => 'Ustvarite svoj raÄun',
+'createacct-another-submit' => 'Ustvarite Å¡e en raÄun',
+'createacct-benefit-heading' => '{{GRAMMAR:tožilnik|{{SITENAME}}}} ustvarjajo ljudje, kot ste vi.',
+'createacct-benefit-body1' => '{{PLURAL:$1|urejanje|urejanji|urejanja|urejanj}}',
+'createacct-benefit-body2' => '{{PLURAL:$1|stran|strani}}',
+'createacct-benefit-body3' => '{{PLURAL:$1|nedavni sodelavec|nedavna sodelavca|nedavni sodelavci|nedavnih sodelavcev}}',
'badretype' => 'Gesli, ki ste ju vnesli, se ne ujemata.',
'userexists' => 'Uporabniško ime, ki ste ga vnesli, je že zasedeno.
Prosimo, izberite drugo.',
'loginerror' => 'Napaka ob prijavi',
+'createacct-error' => 'Napaka pri ustvarjanju raÄuna',
'createaccounterror' => 'Ne morem ustvariti raÄuna: $1',
'nocookiesnew' => 'UporabniÅ¡ki raÄun je ustvarjen, vendar niste prijavljeni.
{{SITENAME}} za prijavo uporabnikov uporablja piÅ¡kotke, ki pa so pri vas onemogoÄeni.
@@ -696,10 +743,12 @@ Prosimo, vpišite pravilno oblikovanega ali polje izpraznite.',
To sporoÄilo lahko prezrete, Äe je bil raÄun ustvarjen pomotoma.',
'usernamehasherror' => "Uporabniško ime ne sme vsebovati ''hash'' znakov",
'login-throttled' => 'Nedavno ste izvedli preveÄ poskusov prijave.
-Prosimo poÄakajte, preden poskusite znova.',
+Prosimo, poÄakajte $1, preden poskusite znova.',
'login-abort-generic' => 'Vaša prijava ni bila uspešna – Prekinjeno',
'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.',
+'createacct-another-realname-tip' => 'Pravo ime ni obvezno.
+ÄŒe se ga odloÄite navesti, bo uporabljeno za priznavanje uporabnikovega dela.',
# Email sending
'php-mail-error-unknown' => 'Neznana napaka v funkciji PHP mail()',
@@ -716,8 +765,7 @@ Za zakljuÄitev prijave, morate tukaj nastaviti novo geslo:',
'newpassword' => 'Novo geslo:',
'retypenew' => 'Ponovno vpišite geslo:',
'resetpass_submit' => 'Nastavi geslo in se prijavi',
-'resetpass_success' => 'Vaše geslo je bilo uspešno spremenjeno!
-Prijavljanje ...',
+'changepassword-success' => 'Vaše geslo je bilo uspešno spremenjeno!',
'resetpass_forbidden' => 'Gesla ne morete spremeniti',
'resetpass-no-info' => 'Za neposreden dostop do te strani morate biti prijavljeni.',
'resetpass-submit-loggedin' => 'Spremenite geslo',
@@ -729,10 +777,11 @@ Morda ste že uspeÅ¡no spremenili geslo ali pa ste zahtevali novo zaÄasno geslo
# Special:PasswordReset
'passwordreset' => 'Ponastavitev gesla',
-'passwordreset-text' => 'Izpolnite obrazec, da ponastavite geslo.',
+'passwordreset-text-one' => 'Izpolnite obrazec, da ponastavite svoje geslo.',
+'passwordreset-text-many' => 'Izpolnite {{PLURAL:$1|polje|enega od polj}}, da ponastavite svoje geslo.',
'passwordreset-legend' => 'Ponastavitev gesla',
'passwordreset-disabled' => 'Ponastavljanje gesla je na tem wikiju onemogoÄeno.',
-'passwordreset-pretext' => '{{PLURAL:$1||Vnesite enega od dela podatkov spodaj}}',
+'passwordreset-emaildisabled' => 'Na tem wikiju so možnosti e-poÅ¡te onemogoÄene.',
'passwordreset-username' => 'Uporabniško ime:',
'passwordreset-domain' => 'Domena:',
'passwordreset-capture' => 'Ogled nastale e-pošte?',
@@ -764,7 +813,7 @@ svojega starega gesla.',
ZaÄasno geslo: $2',
'passwordreset-emailsent' => 'Poslali smo e-pošto za postavitev gesla.',
'passwordreset-emailsent-capture' => 'Poslali smo e-pošto za ponastavitev gesla, ki je prikazana spodaj.',
-'passwordreset-emailerror-capture' => 'Ustvarili smo e-pošto za ponastavitev gesla, ki je prikazana spodaj, vendar pa pošiljanje uporabniku ni uspelo: $1',
+'passwordreset-emailerror-capture' => 'Ustvarili smo e-pošto za ponastavitev gesla, ki je prikazana spodaj, vendar pa pošiljanje {{GENDER:$2|uporabniku|uporabnici}} ni uspelo: $1',
# Special:ChangeEmail
'changeemail' => 'Sprememba e-poštnega naslova',
@@ -778,6 +827,19 @@ ZaÄasno geslo: $2',
'changeemail-submit' => 'Spremeni e-naslov',
'changeemail-cancel' => 'PrekliÄi',
+# Special:ResetTokens
+'resettokens' => 'Ponastavitev žetonov',
+'resettokens-text' => 'Žetone lahko ponastavite, kar omogoÄa dostop do nekaterih zasebnih podatkov, povezanih z vaÅ¡im raÄunom.
+
+To storite, Äe ste po nesreÄi žetone z nekom delili, ali Äe je bil vaÅ¡ raÄun ogrožen.',
+'resettokens-no-tokens' => 'Ni nobenih žetonov za ponastavitev.',
+'resettokens-legend' => 'Ponastavitev žetonov',
+'resettokens-tokens' => 'Žetoni:',
+'resettokens-token-label' => '$1 (trenutna vrednost: $2)',
+'resettokens-watchlist-token' => 'Žeton spletnega vira (Atom/RSS) [[Special:Watchlist|sprememb strani na vašem spisku nadzorov]]',
+'resettokens-done' => 'Žetone sem ponastavil.',
+'resettokens-resetbutton' => 'Ponastavi izbrane žetone',
+
# Edit page toolbar
'bold_sample' => 'Krepko besedilo',
'bold_tip' => 'Krepko besedilo',
@@ -972,11 +1034,14 @@ Spodaj sta za sklicevanje na razpolago dnevnik brisanja in dnevnik prestavljanja
Izgleda, da je bila izbrisana.',
'edit-conflict' => 'Navzkrižje urejanj.',
'edit-no-change' => 'Vaše urejanje je bilo prezrto, saj ni vsebovalo sprememb.',
+'postedit-confirmation' => 'Vaše urejanje smo shranili.',
'edit-already-exists' => 'Ni bilo mogoÄe ustvariti nove strani, ker že obstaja.',
'defaultmessagetext' => 'Prednastavljeno besedilo',
'content-failed-to-parse' => 'Nisem mogel razÄleniti vsebine $2 za obliko $1: $3',
'invalid-content-data' => 'Neveljavni podatki vsebine',
'content-not-allowed-here' => 'Vsebina »$1« ni dovoljena na strani [[$2]]',
+'editwarning-warning' => 'ÄŒe zapustite stran, boste morda izgubili vse spremembe, ki ste jih naredili.
+ÄŒe ste prijavljeni, lahko to opozorilo onemogoÄite v razdelku »Urejanje« v svojih nastavitvah.',
# Content models
'content-model-wikitext' => 'wikibesedilo',
@@ -1011,6 +1076,7 @@ Naslednji argumenti so bili izpuÅ¡Äeni.",
'undo-failure' => 'Zaradi navzkrižij urejanj, ki so se vmes pojavila, tega urejanja ni moÄ razveljaviti.',
'undo-norev' => 'Urejanja ni mogoÄe razveljaviti, ker ne obstaja ali je bilo izbrisano.',
'undo-summary' => 'Redakcija $1 uporabnika [[Special:Contributions/$2|$2]] ([[User talk:$2|pogovor]]) razveljavljena',
+'undo-summary-username-hidden' => 'Razveljavi redakcijo $1 skritega uporabnika',
# Account creation failure
'cantcreateaccounttitle' => 'RaÄuna ni moÄ ustvariti',
@@ -1192,6 +1258,7 @@ Upoštevajte, da bo uporaba navigacijskih gumbov ponastavila ta stolpec.',
'compareselectedversions' => 'Primerjaj izbrani redakciji',
'showhideselectedversions' => 'Prikaži/skrij izbrane redakcije',
'editundo' => 'razveljavi',
+'diff-empty' => '(Ni razlike)',
'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}})',
'difference-missing-revision' => '{{PLURAL:$2|Ene redakcije|$2 redakcij}} razlike ($1) {{PLURAL:$2|nisem}} našel.
@@ -1219,7 +1286,6 @@ Podrobnosti lahko najdete v [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENA
'searchmenu-legend' => 'Možnosti za iskanje',
'searchmenu-exists' => "'''Na tem wikiju obstaja stran »[[:$1]]«'''",
'searchmenu-new' => "'''Ustvari stran »[[:$1]]« na tem wikiju!'''",
-'searchhelp-url' => 'Help:Vsebina',
'searchmenu-prefix' => '[[Special:PrefixIndex/$1|Iskanje strani s to predpono]]',
'searchprofile-articles' => 'ÄŒlanki',
'searchprofile-project' => 'PomoÄ in projektne strani',
@@ -1262,15 +1328,7 @@ Podrobnosti lahko najdete v [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENA
'searchdisabled' => 'Iskanje po {{GRAMMAR:dajalnik|{{SITENAME}}}} je onemogooÄeno.
Medtem lahko iÅ¡Äete preko Googla.
Upoštevajte, da so njihovi podatki vsebine {{GRAMMAR:rodilnik|{{SITENAME}}}} morda zastareli.',
-
-# Quickbar
-'qbsettings' => 'Nastavitve hitre vrstice',
-'qbsettings-none' => 'Brez',
-'qbsettings-fixedleft' => 'Levo nepomiÄno',
-'qbsettings-fixedright' => 'Desno nepomiÄno',
-'qbsettings-floatingleft' => 'Levo leteÄe',
-'qbsettings-floatingright' => 'Desno leteÄe',
-'qbsettings-directionality' => 'Stalno, odvisno od usmerjenosti pisave vašega jezika',
+'search-error' => 'Med iskanjem je prišlo do napake: $1',
# Preferences page
'preferences' => 'Nastavitve',
@@ -1304,7 +1362,6 @@ Upoštevajte, da so njihovi podatki vsebine {{GRAMMAR:rodilnik|{{SITENAME}}}} mo
'resetprefs' => 'PoÄisti neshranjene spremembe',
'restoreprefs' => 'Obnovi vse privzete nastavitve (v vseh razdelkih)',
'prefs-editing' => 'Urejanje',
-'prefs-edit-boxsize' => 'Velikost okna za urejanje.',
'rows' => 'Vrstic:',
'columns' => 'Stolpcev:',
'searchresultshead' => 'Nastavitve poizvedovanja',
@@ -1315,9 +1372,7 @@ Upoštevajte, da so njihovi podatki vsebine {{GRAMMAR:rodilnik|{{SITENAME}}}} mo
'recentchangesdays-max' => 'NajveÄ $1 {{PLURAL:$1|dan|dneva|dnevi|dni}}',
'recentchangescount' => 'Privzeto Å¡tevilo prikazanih urejanj:',
'prefs-help-recentchangescount' => 'VkljuÄuje zadnje spremembe, zgodovine strani in dnevniÅ¡ke zapise.',
-'prefs-help-watchlist-token' => 'Izpolnjevanje tega polja s skrivnim kljuÄem bo ustvarilo vir RSS za vaÅ¡ spisek nadzorov.
-Kdorkoli pozna ta kljuÄ bo lahko bral vaÅ¡ spisek nadzorov, zato izbrite varen in Äim daljÅ¡i kljuÄ.
-Tukaj je nakljuÄno ustvarjena vrednost, ki jo lahko uporabite: $1',
+'prefs-help-watchlist-token2' => 'To je skrivni kljuÄ do spletnega vira vaÅ¡ega spiska nadzorov. Kdor ve zanj, lahko bere vaÅ¡ spisek nadzorov, zato kljuÄa ne delite. [[Special:ResetTokens|Kliknite tukaj, Äe ga želite ponastaviti]].',
'savedprefs' => 'Spremembe so bile uspešno shranjene.',
'timezonelegend' => 'ÄŒasovni pas',
'localtime' => 'Krajevni Äas:',
@@ -1348,7 +1403,6 @@ Tukaj je nakljuÄno ustvarjena vrednost, ki jo lahko uporabite: $1',
'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:',
-'prefs-textboxsize' => 'Velikost urejevalnega polja',
'youremail' => 'E-poštni naslov:',
'username' => '{{GENDER:$1|UporabniÅ¡ko|UporabniÄino}} ime:',
'uid' => 'ID {{GENDER:$1|uporabnika|uporabnice}}:',
@@ -1384,6 +1438,8 @@ Ko vas drugi uporabniki kontaktirajo, jim vašega e-poštnega naslova ne bomo ra
'prefs-dateformat' => 'Zapis datuma',
'prefs-timeoffset' => 'ÄŒasovni odmik',
'prefs-advancedediting' => 'Splošne možnosti',
+'prefs-editor' => 'Urejevalnik',
+'prefs-preview' => 'Predogled',
'prefs-advancedrc' => 'Napredne možnosti',
'prefs-advancedrendering' => 'Napredne možnosti',
'prefs-advancedsearchoptions' => 'Napredne možnosti',
@@ -1391,7 +1447,9 @@ Ko vas drugi uporabniki kontaktirajo, jim vašega e-poštnega naslova ne bomo ra
'prefs-displayrc' => 'Možnosti prikaza',
'prefs-displaysearchoptions' => 'Možnosti prikaza',
'prefs-displaywatchlist' => 'Možnosti prikaza',
+'prefs-tokenwatchlist' => 'Žeton',
'prefs-diffs' => 'Primerjave',
+'prefs-help-prefershttps' => 'Nastavitev bo zaÄela veljati ob vaÅ¡i naslednji prijavi.',
# User preference: email validation using jQuery
'email-address-validity-valid' => 'Izgleda veljaven',
@@ -1418,6 +1476,8 @@ Ko vas drugi uporabniki kontaktirajo, jim vašega e-poštnega naslova ne bomo ra
'userrights-notallowed' => 'Za dodajanje ali odstranjevanje uporabniških pravic nimate dovoljenja.',
'userrights-changeable-col' => 'Skupine, ki jih lahko spremenite',
'userrights-unchangeable-col' => 'Skupine, ki jih ne morete spremeniti',
+'userrights-conflict' => 'Spor sprememb uporabniških pravic! Prosimo, da pregledate in potrdite svoje spremembe.',
+'userrights-removed-self' => 'UspeÅ¡no ste odstranili svoje pravice. Tako sedaj ne morete veÄ dostopati do te strani.',
# Groups
'group' => 'Skupina:',
@@ -1483,11 +1543,19 @@ Ko vas drugi uporabniki kontaktirajo, jim vašega e-poštnega naslova ne bomo ra
'right-proxyunbannable' => 'Izogne se samodejnim blokadam proxyjev',
'right-unblockself' => 'Odblokiraj se',
'right-protect' => 'Spreminjanje stopenj zaÅ¡Äite in urejanje kaskadno zaÅ¡Äitenih strani',
-'right-editprotected' => 'Urejanje zaÅ¡Äitenih strani (brez kaskadne zaÅ¡Äite)',
+'right-editprotected' => 'Urejanje strani, zaÅ¡Äitenih kot »{{int:protect-level-sysop}}«',
+'right-editsemiprotected' => 'Urejanje strani, zaÅ¡Äitenih kot »{{int:protect-level-autoconfirmed}}«',
'right-editinterface' => 'Urejanje uporabniškega vmesnika',
'right-editusercssjs' => 'Urejanje CSS- in JS-datotek drugih uporabnikov',
'right-editusercss' => 'Uredi CSS datotek drugih uporabnikov',
'right-edituserjs' => 'Uredi JS datotek drugih uporabnikov',
+'right-editmyusercss' => 'Uredite svoje uporabniške datoteke CSS',
+'right-editmyuserjs' => 'Uredite svoje uporabniške datoteke JavaScript',
+'right-viewmywatchlist' => 'Ogledovanje svojega spiska nadzorov',
+'right-editmywatchlist' => 'Urejanje vašega spiska nadzorov. Vedite, da bodo nekatera dejanja dodala strani nanj tudi brez te pravice.',
+'right-viewmyprivateinfo' => 'Ogled svojih zasebnih podatkov (npr. e-poštnega naslova, pravega imena)',
+'right-editmyprivateinfo' => 'Urejanje svojih zasebnih podatkov (npr. e-poštnega naslova, pravega imena)',
+'right-editmyoptions' => 'Urejanje svojih nastavitev',
'right-rollback' => 'Hitro vraÄanje urejanj zadnjega uporabnika, ki je urejal doloÄeno stran',
'right-markbotedits' => 'OznaÄi vrnjena urejanja kot urejanja botov',
'right-noratelimit' => 'Omejitve dejavnosti ne veljajo',
@@ -1549,12 +1617,19 @@ Ko vas drugi uporabniki kontaktirajo, jim vašega e-poštnega naslova ne bomo ra
'action-userrights-interwiki' => 'upravljanje uporabniških pravic za uporabnike drugih wikijev',
'action-siteadmin' => 'zaklenitev ali odklepanje podatkovne baze',
'action-sendemail' => 'poÅ¡iljanje e-sporoÄil',
+'action-editmywatchlist' => 'urejanje svojega spiska nadzorov',
+'action-viewmywatchlist' => 'ogleda svojega spiska nadzorov',
+'action-viewmyprivateinfo' => 'ogled svojih zasebnih informacij',
+'action-editmyprivateinfo' => 'urejanje svojih zasebnih informacij',
# Recent changes
'nchanges' => '$1 {{PLURAL:$1|sprememba|spremembi|spremembe|sprememb|sprememb}}',
+'enhancedrc-since-last-visit' => '$1 {{PLURAL:$1|od zadnjega obiska}}',
+'enhancedrc-history' => 'zgodovina',
'recentchanges' => 'Zadnje spremembe',
'recentchanges-legend' => 'Možnosti zadnjih sprememb',
'recentchanges-summary' => 'Na tej strani lahko spremljate najnovejše spremembe wikija.',
+'recentchanges-noresult' => 'V podanem obdobju nobena sprememba ne ustreza tem merilom.',
'recentchanges-feed-description' => 'Spremljajte zadnje spremembe wikija prek tega vira.',
'recentchanges-label-newpage' => 'S tem urejanjem je bila ustvarjena nova stran',
'recentchanges-label-minor' => 'Manjše urejanje',
@@ -1591,7 +1666,6 @@ Ko vas drugi uporabniki kontaktirajo, jim vašega e-poštnega naslova ne bomo ra
'recentchangeslinked-feed' => 'Sorodne spremembe',
'recentchangeslinked-toolbox' => 'Sorodne spremembe',
'recentchangeslinked-title' => 'Spremembe, povezane z "$1"',
-'recentchangeslinked-noresult' => 'Na povezanih straneh v doloÄenem obdobju ni bilo nobenih sprememb.',
'recentchangeslinked-summary' => "To je seznam nedavnih sprememb strani povezanih na doloÄeno stran (ali iz doloÄene kategorije).
Strani iz [[Special:Watchlist|vašega spiska nadzorov]] so '''odebeljene'''.",
'recentchangeslinked-page' => 'Naslov strani:',
@@ -1603,7 +1677,7 @@ Strani iz [[Special:Watchlist|vašega spiska nadzorov]] so '''odebeljene'''.",
'reuploaddesc' => 'PrekliÄi nalaganje in se vrni na obrazec za nalaganje',
'upload-tryagain' => 'Vnesite spremenjen opis datoteke',
'uploadnologin' => 'Niste prijavljeni',
-'uploadnologintext' => 'Za nalaganje datotek se [[Special:UserLogin|prijavite]].',
+'uploadnologintext' => 'Za nalaganje datotek se morate $1.',
'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',
@@ -1838,7 +1912,6 @@ Za optimalno varnost je img_auth.php onemogoÄen.',
'http-read-error' => 'Napaka branja HTTP.',
'http-timed-out' => 'Zahteva HTTP je potekla.',
'http-curl-error' => 'Napaka pri doseganju URL: $1',
-'http-host-unreachable' => 'Ni mogoÄe doseÄi URL.',
'http-bad-status' => 'Med zahtevo HTTP je prišlo do težave: $1 $2',
# Some likely curl errors. More could be added from <http://curl.haxx.se/libcurl/c/libcurl-errors.html>
@@ -1869,6 +1942,10 @@ Morda želite poskusiti ob Äasu manjÅ¡e zasedenosti.',
'listfiles_size' => 'Velikost',
'listfiles_description' => 'Opis',
'listfiles_count' => 'RazliÄice',
+'listfiles-show-all' => 'VkljuÄuje stare razliÄice slik',
+'listfiles-latestversion' => 'Trenutna razliÄica',
+'listfiles-latestversion-yes' => 'Da',
+'listfiles-latestversion-no' => 'Ne',
# File description page
'file-anchor-link' => 'Datoteka',
@@ -1966,6 +2043,13 @@ Preden jih izbrišete, preverite še druge povezave nanje.',
'randompage' => 'NakljuÄni Älanek',
'randompage-nopages' => 'V {{PLURAL:$2|naslednjem imenskem prostoru|naslednjih imenskih prostorih}} ni strani: $1.',
+# Random page in category
+'randomincategory' => 'NakljuÄna stran v kategoriji',
+'randomincategory-invalidcategory' => '»$1« ni veljavno ime kategorije.',
+'randomincategory-nopages' => 'V kategoriji [[:Category:$1]] ni nobene strani.',
+'randomincategory-selectcategory' => 'Dobi nakljuÄno stran iz kategorije: $1 $2.',
+'randomincategory-selectcategory-submit' => 'Pojdi',
+
# Random redirect
'randomredirect' => 'NakljuÄna preusmeritev',
'randomredirect-nopages' => 'V imenskem prostoru »$1« ni preusmeritev.',
@@ -1991,17 +2075,13 @@ Preden jih izbrišete, preverite še druge povezave nanje.',
'statistics-users-active-desc' => 'Uporabniki, ki so izvedli dejanje v {{PLURAL:$1|zadnjem dnevu|zadnjih $1 dneh}}',
'statistics-mostpopular' => 'Strani z najveÄ ogledi',
-'disambiguations' => 'Strani s povezavami na razloÄitvene strani',
-'disambiguationspage' => 'Template:RazloÄitev',
-'disambiguations-text' => "Naslednje strani vsebujejo vsaj eno povezavo na '''razloÄitvene strani'''.
-Namesto tega bi morda bilo bolje, da se povezujejo na primernejše strani.<br />
-Stran se obravnava kot razloÄitvena, Äe uporablja predloge, povezane z [[MediaWiki:Disambiguationspage]].",
-
'pageswithprop' => 'Strani z lastnostmi strani',
'pageswithprop-legend' => 'Strani z lastnostmi strani',
'pageswithprop-text' => 'Stran navaja vse strani, ki uporabljajo doloÄene lastnosti strani.',
'pageswithprop-prop' => 'Ime lastnosti:',
'pageswithprop-submit' => 'Pojdi',
+'pageswithprop-prophidden-long' => 'dolga besedilna vrednost lastnosti je skrita ($1)',
+'pageswithprop-prophidden-binary' => 'dvojiška vrednost lastnosti je skrita ($1)',
'doubleredirects' => 'Dvojne preusmeritve',
'doubleredirectstext' => 'Ta stran navaja strani, ki se preusmerjajo na druge preusmeritvene strani.
@@ -2060,6 +2140,7 @@ Sedaj je preusmeritev na [[$2]].',
'mostrevisions' => 'NajveÄkrat urejane strani',
'prefixindex' => 'Vse strani s predpono',
'prefixindex-namespace' => 'Vse strani s predpono (imenski prostor $1)',
+'prefixindex-strip' => 'Na seznamu odreži predpono',
'shortpages' => 'Kratke strani',
'longpages' => 'Dolge strani',
'deadendpages' => 'ÄŒlanki brez delujoÄih povezav',
@@ -2075,6 +2156,7 @@ Sedaj je preusmeritev na [[$2]].',
'listusers' => 'Seznam uporabnikov',
'listusers-editsonly' => 'Pokaži samo uporabnike z urejanji',
'listusers-creationsort' => 'Razvrsti po datumu ustvaritve',
+'listusers-desc' => 'Razvrsti padajoÄe',
'usereditcount' => '$1 {{PLURAL:$1|urejanje|urejanji|urejanja|urejanj}}',
'usercreated' => '{{GENDER:$3|Ustvarjen|Ustvarjena}} dne $1 ob $2',
'newpages' => 'Nove strani',
@@ -2251,10 +2333,9 @@ Tam bodo navedene prihodnje spremembe te strani in pripadajoÄe pogovorne strani
'unwatchthispage' => 'Prenehaj opazovati stran',
'notanarticle' => 'Ni Älanek',
'notvisiblerev' => 'Redakcija je bila izbrisana',
-'watchnochange' => 'V prikazanem Äasovnem obdobju ni nihÄe spremenil nadzorovanih strani.',
'watchlist-details' => 'Spremljate $1 {{PLURAL:$1|stran|strani|strani|strani|strani}} (pogovorne strani niso vštete).',
-'wlheader-enotif' => '* ObveÅ¡Äanje po elektronski poÅ¡ti je omogoÄeno.',
-'wlheader-showupdated' => "* Strani, spremenjene od vašega zadnjega ogleda, so prikazane '''krepko'''.",
+'wlheader-enotif' => 'ObveÅ¡Äanje po elektronski poÅ¡ti je omogoÄeno.',
+'wlheader-showupdated' => "Strani, spremenjene od vašega zadnjega ogleda, so prikazane '''krepko'''.",
'watchmethod-recent' => 'med nedavnimi urejanji iÅ¡Äem spremljane strani',
'watchmethod-list' => 'med spremljanimi stranmi iÅ¡Äem nedavna urejanja',
'watchlistcontains' => 'Spremljate $1 {{PLURAL:$1|stran|strani}}.',
@@ -2507,7 +2588,7 @@ $1',
'contributions' => '{{GENDER:$1|Uporabnikovi|UporabniÄini}} prispevki',
'contributions-title' => 'Prispevki uporabnika $1',
'mycontris' => 'Prispevki',
-'contribsub2' => 'Uporabnik: $1 ($2)',
+'contribsub2' => 'Za {{GENDER:$3|$1}} ($2)',
'nocontribs' => 'Ne najdem nobene merilom ustrezajoÄe spremembe.',
'uctop' => '(trenutno)',
'month' => 'Od meseca (in prej):',
@@ -2665,15 +2746,13 @@ Ali želite spremeniti nastavitve blokade?',
Je pa blokiran kot del obmoÄja $2, ki ga lahko odblokirate.',
'ip_range_invalid' => 'Neveljaven IP-razpon.',
'ip_range_toolarge' => 'ObmoÄja blokade veÄja od /$1 niso dovoljena.',
-'blockme' => 'Blokiraj me',
'proxyblocker' => 'Blokator posredniških strežnikov',
-'proxyblocker-disabled' => 'Funkcija je onemogoÄena.',
'proxyblockreason' => 'Ker uporabljate odprti posredniÅ¡ki strežnik, je urejanje z vaÅ¡ega IP-naslova prepreÄeno.
Gre za resno varnostno težavo, o kateri obvestite svojega internetnega ponudnika ali tehniÄno podporo.',
-'proxyblocksuccess' => 'Storjeno.',
'sorbsreason' => 'VaÅ¡ IP-naslov je v DNSBL uvrÅ¡Äen med odprte posredniÅ¡ke strežnike.',
'sorbs_create_account_reason' => 'Vaš IP-naslov je v DNSBL, ki ga uporablja {{GRAMMAR:tožilnik|{{SITENAME}}}}, naveden kot odprti posredniški strežnik (proxy).
RaÄuna žal ne morete ustvariti.',
+'xffblockreason' => 'IP-naslov, prisoten v glavi X-Forwarded-For, ali vaš ali od strežnika proxy, ki ga uporabljate, je blokiran. Izvirni razlog za blokado: $1',
'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.',
@@ -2840,6 +2919,8 @@ Za lokalizacijo in prevajanje obiÅ¡Äite [//www.mediawiki.org/wiki/Localisation
'thumbnail-more' => 'PoveÄaj',
'filemissing' => 'Datoteka manjka',
'thumbnail_error' => 'Napaka pri izdelavi sliÄice: $1',
+'thumbnail_error_remote' => 'SporoÄilo o napaki od $1:
+$2',
'djvu_page_error' => 'Stran DjVu je izven obmoÄja',
'djvu_no_xml' => 'Ni mogoÄe pridobiti XML za datoteko DjVu',
'thumbnail-temp-create' => 'Ne morem ustvariti zaÄasne datoteke sliÄice',
@@ -3142,11 +3223,25 @@ Z njenim zagonom lahko ogrozite vaš sistem.",
'minutes' => '$1 {{PLURAL:$1|minuta|minuti|minute|minut}}',
'hours' => '$1 {{PLURAL:$1|ura|uri|ure|ur}}',
'days' => '$1 {{PLURAL:$1|dan|dneva|dnevi|dni}}',
+'weeks' => '$1 {{PLURAL:$1|teden|tedna|tedni|tednov}}',
'months' => '$1 {{PLURAL:$1|mesec|meseca|mesece|mesecev}}',
'years' => '$1 {{PLURAL:$1|leto|leti|leta|let}}',
'ago' => 'pred $1',
'just-now' => 'pravkar',
+# Human-readable timestamps
+'hours-ago' => 'pred $1 {{PLURAL:$1|uro|urama|urami}}',
+'minutes-ago' => 'pred $1 {{PLURAL:$1|minuto|minutama|minutami}}',
+'seconds-ago' => 'pred $1 {{PLURAL:$1|sekundo|sekundama|sekundami}}',
+'monday-at' => 'Ponedeljek ob $1',
+'tuesday-at' => 'Torek ob $1',
+'wednesday-at' => 'Sreda ob $1',
+'thursday-at' => 'ÄŒetrtek ob $1',
+'friday-at' => 'Petek ob $1',
+'saturday-at' => 'Sobota ob $1',
+'sunday-at' => 'Nedelja ob $1',
+'yesterday-at' => 'VÄeraj ob $1',
+
# Bad image list
'bad_image_list' => 'Oblika je naslednja:
@@ -3175,7 +3270,7 @@ Druga bodo po privzetem skrita.
* gpslongitude
* gpsaltitude',
-# EXIF tags
+# Exif tags
'exif-imagewidth' => 'Å irina',
'exif-imagelength' => 'Višina',
'exif-bitspersample' => 'Bitov na barvni gradnik',
@@ -3353,7 +3448,7 @@ Druga bodo po privzetem skrita.
'exif-originalimageheight' => 'Višina slike, preden je bila obrezana',
'exif-originalimagewidth' => 'Å irina slike, preden je bila obrezana',
-# EXIF attributes
+# Exif attributes
'exif-compression-1' => 'Nestisnjeno',
'exif-compression-2' => 'Kodiranje CCITT skupina 3 1-razsežnostna spremenjena dolžina teka Huffman',
'exif-compression-3' => 'Kodiranje CCITT skupina 3 faks',
@@ -3753,7 +3848,6 @@ Uporabite lahko tudi [[Special:EditWatchlist|standardni urejevalnik]].',
'version-other' => 'Ostalo',
'version-mediahandlers' => 'Upravljavci predstavnostnih vsebin',
'version-hooks' => 'Razširitve',
-'version-extension-functions' => 'Funkcije razširitev',
'version-parser-extensiontags' => 'Etikete razÅ¡iritev razÄlenjevalnika',
'version-parser-function-hooks' => 'Funkcije razÅ¡iritev razÄlenjevalnika',
'version-hook-name' => 'Ime razširitve',
@@ -3762,6 +3856,7 @@ Uporabite lahko tudi [[Special:EditWatchlist|standardni urejevalnik]].',
'version-license' => 'Licenca',
'version-poweredby-credits' => "Ta wiki poganja '''[//www.mediawiki.org/ MediaWiki]''', vse pravice pridržave © 2001-$1 $2.",
'version-poweredby-others' => 'drugi',
+'version-poweredby-translators' => 'Prevajalci translatewiki.net',
'version-credits-summary' => 'Radi bi priznali prispevek naslednjih oseb k [[Special:Version|MediaWiki]].',
'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.
@@ -3777,14 +3872,17 @@ Skupaj s programom bi morali bi prejeti [{{SERVER}}{{SCRIPTPATH}}/COPYING kopijo
'version-entrypoints-articlepath' => '[https://www.mediawiki.org/wiki/Manual:$wgArticlePath Pot Älanka]',
'version-entrypoints-scriptpath' => '[https://www.mediawiki.org/wiki/Manual:$wgScriptPath Pot skripta]',
-# Special:FilePath
-'filepath' => 'Pot do datoteke',
-'filepath-page' => 'Datoteka:',
-'filepath-submit' => 'Pojdi',
-'filepath-summary' => 'Ta posebna stran vrne polno pot do datoteke.
-Slike so prikazane v polni loÄljivosti, druge vrste datotek pa se zaženejo v zanje doloÄenih programih.
-
-Vnesite ime datoteke brez predpone »{{ns:file}}:«.',
+# Special:Redirect
+'redirect' => 'Preusmeri po datoteki, uporabniku ali ID-ju redakcije',
+'redirect-legend' => 'Preusmeritev na datoteko ali stran',
+'redirect-summary' => 'Posebna stran preusmeri na datoteko (Äe podate ime datoteke), stran (Äe podate ID redakcije) ali uporabniÅ¡ko stran (Äe podatek Å¡tevilski ID uporabnika).',
+'redirect-submit' => 'Pojdi',
+'redirect-lookup' => 'Iskanje:',
+'redirect-value' => 'Vrednost:',
+'redirect-user' => 'ID uporabnika',
+'redirect-revision' => 'Redakcija strani',
+'redirect-file' => 'Ime datoteke',
+'redirect-not-exists' => 'Vrednosti ni mogoÄe najti',
# Special:FileDuplicateSearch
'fileduplicatesearch' => 'Iskanje podvojenih datotek',
@@ -3834,12 +3932,16 @@ Vnesite ime datoteke brez predpone »{{ns:file}}:«.',
'tags' => 'Veljavne etikete sprememb',
'tag-filter' => 'Filter [[Special:Tags|oznak]]:',
'tag-filter-submit' => 'Filtriraj',
+'tag-list-wrapper' => '([[Special:Tags|{{PLURAL:$1|Oznaka|Oznaki|Oznake}}]]: $2)',
'tags-title' => 'Etikete',
'tags-intro' => 'Ta stran navaja etikete, s katerimi lahko programje oznaÄi urejanja, in njihov pomen.',
'tags-tag' => 'Ime oznake',
'tags-display-header' => 'Prikaz na seznamu sprememb',
'tags-description-header' => 'Polni opis pomena',
+'tags-active-header' => 'Dejavno?',
'tags-hitcount-header' => 'Etiketirane spremembe',
+'tags-active-yes' => 'Da',
+'tags-active-no' => 'Ne',
'tags-edit' => 'uredi',
'tags-hitcount' => '$1 {{PLURAL:$1|sprememba|spremembi|spremembe|sprememb|sprememb}}',
@@ -3860,6 +3962,7 @@ Vnesite ime datoteke brez predpone »{{ns:file}}:«.',
'dberr-problems' => 'Oprostite! Ta stran se sooÄa s tehniÄnimi težavami.',
'dberr-again' => 'Poskusite poÄakati nekaj minut in ponovno naložite stran.',
'dberr-info' => '(Ne morem se povezati s strežnikom zbirke podatkov: $1)',
+'dberr-info-hidden' => '(Ne morem se povezati s strežnikom zbirke podatkov)',
'dberr-usegoogle' => 'V vmesnem Äasu lahko poskusite z iskanjem preko Googla',
'dberr-outofdate' => 'Pomnite, da so njegovi imeniki naših vsebin lahko zastareli.',
'dberr-cachederror' => 'To je shranjena kopija zahtevane strani, ki morda ni najnovejša.',
@@ -3875,6 +3978,9 @@ Vnesite ime datoteke brez predpone »{{ns:file}}:«.',
'htmlform-submit' => 'Pošlji',
'htmlform-reset' => 'Razveljavi spremembe',
'htmlform-selectorother-other' => 'Drugo',
+'htmlform-no' => 'Ne',
+'htmlform-yes' => 'Da',
+'htmlform-chosen-placeholder' => 'Izberite možnost',
# SQLite database support
'sqlite-has-fts' => '$1 s podporo iskanju polnih besedil',
@@ -3992,4 +4098,19 @@ V nasprotnem primeru lahko uporabite preprost obrazec spodaj. Vašo pripombo bom
# Image rotation
'rotate-comment' => 'Slika zavrti s $1 {{PLURAL:$1| degree|degrees}} v smeri urinega kazalca',
+# Limit report
+'limitreport-title' => 'Podatki profiliranja razÄlenjevalnika:',
+'limitreport-cputime' => 'Poraba Äasa CPU',
+'limitreport-cputime-value' => '$1 {{PLURAL:$1|sekunda|sekundi|sekunde|sekund}}',
+'limitreport-walltime' => 'Realna poraba Äasa',
+'limitreport-walltime-value' => '$1 {{PLURAL:$1|sekunda|sekundi|sekunde|sekund}}',
+'limitreport-ppvisitednodes' => 'Å tevilo predprocesorjevih ogledanih vozliÅ¡Ä',
+'limitreport-ppgeneratednodes' => 'Å tevilo predprocesorjevih ustvarjenih vozliÅ¡Ä',
+'limitreport-postexpandincludesize' => 'Velikost vkljuÄitve po razÅ¡iritvi',
+'limitreport-postexpandincludesize-value' => '$1/$2 {{PLURAL:$2|zlog|zloga|zloge|zlogov}}',
+'limitreport-templateargumentsize' => 'Velikost argumentov predloge',
+'limitreport-templateargumentsize-value' => '$1/$2 {{PLURAL:$2|zlog|zloga|zloge|zlogov}}',
+'limitreport-expansiondepth' => 'NajveÄja globina razÅ¡iritve',
+'limitreport-expensivefunctioncount' => 'Å tevilo dragih funkcij razÄlenjevalnika',
+
);
diff --git a/languages/messages/MessagesSli.php b/languages/messages/MessagesSli.php
index e028a80f..d9f04125 100644
--- a/languages/messages/MessagesSli.php
+++ b/languages/messages/MessagesSli.php
@@ -55,9 +55,6 @@ $messages = array(
'tog-shownumberswatching' => 'Oazoahl derr beobachtenden Nutzer oazäan',
'tog-oldsig' => 'Vorschau der aktuella Signatur:',
'tog-fancysig' => 'Signatur ols Wikitext behandeln (ohne automatische Verlinkung)',
-'tog-externaleditor' => "Extern'n Editor als Standard benutza (nur fier Experta, is missa spezielle Einstellungen uff dam eegenen Rechner vurgenumma warn)",
-'tog-externaldiff' => 'Externes Diff-Programm als Standard benutza (nur fier Experta, is missa spezielle Einstellungen uff dam eegenen Rechner vurgenumma warn)',
-'tog-showjumplinks' => '„Wechseln zu“-Verknipfunga aktiviern',
'tog-uselivepreview' => 'Direkte Vurschau notza (beneetigt JavaScript) (vrsuchsweise)',
'tog-forceeditsummary' => 'Warnen, wenn bem Speichern de Zsoammafassung fahln tutt',
'tog-watchlisthideown' => 'Eigene Bearbeitungen ausblenden',
@@ -235,7 +232,7 @@ Bitte warte eenige Minuta, bevur du 's noo eemool versuchst.
$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).
+# 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).
'aboutsite' => 'Ieber {{SITENAME}}',
'aboutpage' => 'Project:Ieber',
'copyright' => 'Inhalt ies verfügbar unter der $1.',
@@ -245,7 +242,6 @@ $1",
'disclaimers' => 'Impressum',
'disclaimerpage' => 'Project:Impressum',
'edithelp' => 'Bearbeitungshilfe',
-'edithelppage' => 'Help:Bearbeitungshilfe',
'helppage' => 'Help:Hilfe',
'mainpage' => 'Hauptseite',
'mainpage-description' => 'Hauptseite',
@@ -309,15 +305,6 @@ Oalle verfügbara Spezialseyta sein ei der [[Special:SpecialPages|Liste der Spez
# General errors
'databaseerror' => 'Fehler ei der Datenbank',
-'dberrortext' => 'Is ies a Datenbankfahler uffgetreten.
-Dar Grund koan a Programmierfahler sei.
-De letzte Datenbankoabfroage lautete:
-<blockquote><tt>$1</tt></blockquote>
-aus dar Funksjonn „<tt>$2</tt>“.
-De Datenbank meldete dann Fahler „<tt>$3: $4</tt>“.',
-'dberrortextcl' => "Is goab an'n Syntaxfahler ei dar Datenbankobfroage.
-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',
'missing-article' => 'Der Text von „$1“ $2 wurde nicht in der Datenbank gefunden.
@@ -347,7 +334,6 @@ Abfroage: $2',
'editinginterface' => "'''Warnung:''' Diese Seite enthält vu der MediaWiki-Software benutzta Text.
Änderunga wirka siech uff de Benutzeroberfläche aus.
Fier Iebersetzunga ziehe bitte ei Betracht, diese eim [//translatewiki.net/wiki/Main_Page?setlang=de Translatewiki], damm MediaWiki-Lokalisierungsprojekt, durchzufiehra.",
-'sqlhidden' => '(SQL-Abfroage versteckt)',
'cascadeprotected' => 'Diese Seite ies zur Beoarbeetung gesperrt. Se ies ei de {{PLURAL:$1|fulgende Seite|fulgenda Seita}} eengebunda, de mittels der Kaskadensperroption geschitzt {{PLURAL:$1|ies|sein}}:
$2',
'namespaceprotected' => "Du host kenne Berechtigung, de Seite eim '''$1'''-Noamensraum zu bearbta.",
@@ -449,7 +435,7 @@ Bitte warte, bevor du is erneut probierst.',
'newpassword' => 'Neues Passwurt:',
'retypenew' => 'Neues Passwurt (nuchmoal):',
'resetpass_submit' => 'Poaßwurt iebermitteln und oamelda',
-'resetpass_success' => 'Dei Poaßwurt wurde erfolgreich geändert. Is fulgt de Oameldung …',
+'changepassword-success' => 'Dei Poaßwurt wurde erfolgreich geändert. Is fulgt de Oameldung …',
'resetpass_forbidden' => 'Doas Poaßwurt koan ne geändert waan.',
'resetpass-no-info' => 'Du muoßt diech oamelda, im uff diese Seite direkt zuzugreifa.',
'resetpass-submit-loggedin' => 'Poaßwurt ändern',
@@ -808,10 +794,6 @@ Stelle sicher, doaß de Versionsgeschichte anner Seite historisch korrekt ies.',
'powersearch-togglenone' => 'Kenne',
'searchdisabled' => 'De {{SITENAME}}-Suche ies deaktiviert. Du koast underdessa miet Google sucha. Bitte bedenke, doaß der Suchindex fier {{SITENAME}} veraltet sei koan.',
-# Quickbar
-'qbsettings' => 'Seytaleiste',
-'qbsettings-none' => 'Keene',
-
# Preferences page
'preferences' => 'Eenstellunga',
'mypreferences' => 'Meene Eistellunga',
@@ -829,7 +811,6 @@ Stelle sicher, doaß de Versionsgeschichte anner Seite historisch korrekt ies.',
'saveprefs' => 'Eenstallunga speichern',
'restoreprefs' => 'Olle Standardeinstallunga wiederherstalla',
'prefs-editing' => 'Bearbta',
-'prefs-edit-boxsize' => 'Griße des Beoarbeetungsfansters:',
'rows' => 'Zeila:',
'columns' => 'Spalta:',
'resultsperpage' => 'Treffer pro Seite:',
@@ -848,7 +829,6 @@ Stelle sicher, doaß de Versionsgeschichte anner Seite historisch korrekt ies.',
'prefs-namespaces' => 'Noamasräume',
'defaultns' => 'Andernfoalls ei diesen Noamasräumen sucha:',
'prefs-custom-js' => 'Nutzerdefiniertes JS',
-'prefs-textboxsize' => 'Griße des Beoarbeetungsfansters',
'youremail' => 'E-Mail-Adresse:',
'username' => 'Benutzernoame:',
'prefs-memberingroups' => 'Mitglied dar {{PLURAL:$1|Nutzergruppe|Nutzergruppen}}:',
@@ -1038,7 +1018,6 @@ Stelle sicher, doaß de Versionsgeschichte anner Seite historisch korrekt ies.',
'recentchangeslinked-feed' => 'Änderunga oa verlinkta Seyta',
'recentchangeslinked-toolbox' => 'Änderunga oa verlinkta Seyta',
'recentchangeslinked-title' => 'Änneronga oa Seyta, de voo „$1“ verlinkt sein',
-'recentchangeslinked-noresult' => 'Eim ausgewählta Zeitraum wurden oa dann verlinkten Seyta kenne Änderunga vurgenumma.',
'recentchangeslinked-summary' => "Diese Spezialseyte listet de letzta Änderunga oa dan verlinkta Seyta uff (bzw. bei Kategoria oa dan Mitgliedern dieser Kategorie). Seyta uff denner [[Special:Watchlist|Beobachtungsliste]] sein '''fett''' dargestellt.",
'recentchangeslinked-page' => 'Seite:',
'recentchangeslinked-to' => 'Zeige Änneronga uff Seita, de hierher verlinka',
@@ -1228,10 +1207,6 @@ Ieberpriefe andere Links zu den Vurlooga, bevur du diese läscht.',
'statistics-users-active-desc' => 'Nutzer miet Beoarbeetunga {{PLURAL:$1|enn letzta 24 Stunden|enn vergangenen $1 Tagen}}',
'statistics-mostpopular' => 'Meistbesichte Seyta',
-'disambiguations' => 'Begriffsklärungsseyta',
-'disambiguationspage' => 'Template:Begriffsklärung',
-'disambiguations-text' => 'De fulgenda Seita verlinka uff anne Seite zur Begriefsklärung. Se sullta stoats dassens uff de eigentlich gemeente Seite verlinka.<br />Anne Seite werd ols Begriefsklärungsseite behandelt, wenn [[MediaWiki:Disambiguationspage]] uff se verlinkt.<br />Links aus Noamasräumen waan hier ne uffgelistet.',
-
'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.
@@ -1415,10 +1390,9 @@ Wenn du de Seite wieder vu denner Beobachtungsliste entferna mechtest, klicke uf
'unwatch' => 'nä mehr beobachta',
'unwatchthispage' => 'Nä mehr beobachta',
'notanarticle' => 'Keene Seite',
-'watchnochange' => 'Kenne dar vu dir beobachteta Seyta wurde während des oagezeigta Zeitraums beoarbeetet.',
'watchlist-details' => 'Du beobachtest {{PLURAL:$1|1 Seite|$1 Seita}}.',
-'wlheader-enotif' => '* Dar E-Mail-Benoachrichtigungsdienst ies aktiviert.',
-'wlheader-showupdated' => "* Seyta miet noo ne gesehenen Änderunga waan '''fett''' dargestellt.",
+'wlheader-enotif' => 'Dar E-Mail-Benoachrichtigungsdienst ies aktiviert.',
+'wlheader-showupdated' => "Seyta miet noo ne gesehenen Änderunga waan '''fett''' dargestellt.",
'watchmethod-recent' => 'Ieberprifa dar letzta Beoarbeetunga fier de Beobachtungsliste',
'watchmethod-list' => 'Ieberpriefa dar Beobachtungsliste noach letzta Beoarbeetunga',
'watchlistcontains' => 'Denne Beobachtungsliste enthält $1 {{PLURAL:$1|Seite|Seita}}.',
@@ -1720,10 +1694,7 @@ Siehe de [[Special:BlockList|Liste dar gesperrta IP-Atressa und Nutzernoama]] fi
'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',
@@ -2047,7 +2018,7 @@ Weitere werden standardmäßig nicht angezeigt.
* gpslongitude
* gpsaltitude',
-# EXIF tags
+# Exif tags
'exif-imagelength' => 'Länge',
'exif-bitspersample' => 'Bits pro Forbkomponente',
'exif-compression' => 'Oart dar Kompression',
@@ -2293,18 +2264,11 @@ Du koast au de [[Special:EditWatchlist|Standard-Beoarbeetungsseyte]] benutza.',
'version-specialpages' => 'Spezialseyta',
'version-other' => 'Oanderes',
'version-hooks' => "Schnittstalla ''(Hooks)''",
-'version-extension-functions' => 'Funksjonnsuffruffe',
'version-parser-extensiontags' => "Parser-Erweiterunga ''(tags)''",
'version-parser-function-hooks' => 'Parser-Funksjonna',
'version-hook-name' => 'Schnittstallanoame',
'version-hook-subscribedby' => 'Uffruff vu',
-# Special:FilePath
-'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-summary' => 'Suche noach Dateiduplikaten uff Basis ihres Hashwertes.',
'fileduplicatesearch-legend' => 'Suche noach Duplikata',
diff --git a/languages/messages/MessagesSm.php b/languages/messages/MessagesSm.php
index edf772b6..137ffc4d 100644
--- a/languages/messages/MessagesSm.php
+++ b/languages/messages/MessagesSm.php
@@ -167,7 +167,7 @@ $messages = array(
# Special:AllPages
'allpagessubmit' => 'Alu',
-# Email user
+# E-mail user
'emailuser' => "'Imeli mai le tagata lenei",
'emailmessage' => "Fe'au",
diff --git a/languages/messages/MessagesSma.php b/languages/messages/MessagesSma.php
index 32474003..42fa0c0d 100644
--- a/languages/messages/MessagesSma.php
+++ b/languages/messages/MessagesSma.php
@@ -788,7 +788,7 @@ Jeatjebh dajveh lea gaptjedh goh sïejhme, bine vuesehte gåessie taabelle stoer
* gpslongitude
* gpsaltitude',
-# EXIF tags
+# Exif tags
'exif-imagewidth' => 'Gamte',
'exif-imagelength' => 'GÃ¥hkoe',
'exif-model' => 'Guvviedahke hammohke',
diff --git a/languages/messages/MessagesSn.php b/languages/messages/MessagesSn.php
index ad74a735..db4716bb 100644
--- a/languages/messages/MessagesSn.php
+++ b/languages/messages/MessagesSn.php
@@ -88,6 +88,9 @@ $messages = array(
'viewsource' => 'Wona mabviro',
# Login and logout pages
+'welcomecreation' => '== Tigashire, $1! ==
+Akaunzi yako yagadzirwa.
+Usakanganwe kuchinga [[Special:Preferences|mapreferences ako {{SITENAME}}]].',
'yourname' => 'Zita:',
'yourpassword' => 'Password:',
'yourpasswordagain' => 'Nyorazve password:',
diff --git a/languages/messages/MessagesSo.php b/languages/messages/MessagesSo.php
index 8345e130..cfba54fe 100644
--- a/languages/messages/MessagesSo.php
+++ b/languages/messages/MessagesSo.php
@@ -44,9 +44,6 @@ $messages = array(
'tog-shownumberswatching' => "I'tus tirada isticmaalayaasha wax waardiyeynaayo",
'tog-oldsig' => '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" 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' => 'Ka qari wax bedelkeyga liiska waardiyaha',
@@ -243,7 +240,7 @@ $1',
'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).
+# 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).
'aboutsite' => 'Ku saabsan {{SITENAME}}',
'aboutpage' => 'Project:ku saabsan',
'copyright' => 'Qoraalka wuxuu ku salaysanyahay $1.',
@@ -253,7 +250,6 @@ $1',
'disclaimers' => "Masuul la'aan",
'disclaimerpage' => "Project:Masuul la'aan guud",
'edithelp' => 'Caawinaada wax ka bedelka',
-'edithelppage' => 'Help:Wax ka bedelka',
'helppage' => 'Help:Caawinaad',
'mainpage' => 'Bogga Hore',
'mainpage-description' => 'Bogga Hore',
@@ -387,9 +383,18 @@ Sababta neh waxaa waaye "\'\'$2\'\'".',
Waad sii isticmaali kartaa {{SITENAME}} adoona lagu aqoon, ama <span class='plainlinks'>[$1 gudaha gal]</span> 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.",
'welcomeuser' => 'Soo dhowoow, $1',
'yourname' => 'Magaca gudagalka:',
+'userlogin-yourname' => 'Magaca gudagalka',
+'userlogin-yourname-ph' => 'Gasho magacaada kuu gaarka ah',
'yourpassword' => 'Eraysir:',
+'userlogin-yourpassword' => 'Erey sir',
+'userlogin-yourpassword-ph' => 'Gali erey sir',
+'createacct-yourpassword-ph' => 'Gali erey sir',
'yourpasswordagain' => 'Markale qor ereysirka:',
+'createacct-yourpasswordagain' => 'Hubi erey sirta',
+'createacct-yourpasswordagain-ph' => 'Mar kale gali erey sirta',
'remembermypassword' => 'Kumbuyuutarkaan ku xasuusnaaw magaceyga gudagalka (ilaa $1 {{PLURAL:$1|maalin|maalmood}})',
+'userlogin-remembermypassword' => 'Ka dhig mid diyaar ah mar waliba',
+'userlogin-signwithsecure' => 'Adeegso khad la hubo',
'yourdomainname' => 'Magacaga shabakada',
'password-change-forbidden' => 'Ma badali kartid Eraysir ee wiki.',
'login' => 'Gudaha gal',
@@ -400,18 +405,33 @@ Waad sii isticmaali kartaa {{SITENAME}} adoona lagu aqoon, ama <span class='plai
'logout' => 'Ka bax',
'userlogout' => 'Ka bax',
'notloggedin' => 'Gudaha kuma jirtid',
+'userlogin-noaccount' => 'Akoon ma heysatid?',
+'userlogin-joinproject' => 'Ku biir {{SITENAME}}',
'nologin' => 'Akoon ma heysatid? $1.',
'nologinlink' => 'Akoon sameyso',
'createaccount' => 'Sameey gudagale',
'gotaccount' => "Waan heystaa gudagale? '''$1'''.",
'gotaccountlink' => 'Gudaha gal',
'userlogin-resetlink' => 'Ma ilaawday tafaasiisha gudagalahaada?',
+'userlogin-resetpassword-link' => 'Dib usoo cesho erey sirtaada',
+'userlogin-helplink' => '[[{{MediaWiki:helplogin-url}}|Caawinaad habka gudagalka]]',
+'createacct-join' => 'Gali macluumaadkaada gaarka ah.',
+'createacct-emailoptional' => 'Ciwaanka e-mail-ka (dooqasho)',
+'createacct-email-ph' => 'Gali Ciwaankaada e-mail-ka',
'createaccountmail' => 'E-mail ahaan',
'createaccountreason' => 'Sababta:',
+'createacct-captcha' => 'Hubin amni',
+'createacct-imgcaptcha-ph' => 'Gali qoraalka aad kor ku aragto',
+'createacct-submit' => 'Sameeyso akoonkaada',
+'createacct-benefit-heading' => 'Bogga {{SITENAME}} waxaa sameeyey dad kula mid ah.',
+'createacct-benefit-body1' => '{{PLURAL:$1|bedel|bedelaadyo}}',
+'createacct-benefit-body2' => '{{PLURAL:$1|bog|Bogag}}',
+'createacct-benefit-body3' => '{{PLURAL:$1|contributor|wax qoreyaasha}}',
'badretype' => 'Ereyada sirta ah oo qortay ma islahan.',
'userexists' => 'Magaca isticmaalaha aad qortay wuu jiraa.
Fadlan dooro magac kale.',
'loginerror' => 'Qalad gudagalista',
+'createacct-error' => 'Qalad dhacay samaynta akoonka',
'createaccounterror' => 'Ma sameeyn karin akoon: $1',
'nocookiesnew' => "Akoonka isticmaalahaan waa la sameeyay, laakiin adiga gudaha uma soo gelin.
{{SITENAME}} wuxuu isticmaalaa cookies si ee gudaha u galaan isticmaale yaasha.
@@ -484,7 +504,7 @@ Hadii aad rabtid in aad dhameestirtid gudagelkaaga, waa in aad meeshaan ku qorta
'newpassword' => 'Ereysir cusub:',
'retypenew' => 'Qor mar labaad ereysirka cusub:',
'resetpass_submit' => 'Qor eraysirka gudaha neh gal',
-'resetpass_success' => 'Ereysirkaada si fiican oo kuugu bedelmay!
+'changepassword-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.',
@@ -494,6 +514,7 @@ Hadda gudaha ku gal',
# Special:PasswordReset
'passwordreset' => 'Bedel ereysirka',
+'passwordreset-text-many' => '{{PLURAL:$1|Gali mid ka mid ah macluumaadkaada asaasiga ah si erey sirtaada usoo ceshato.}}',
'passwordreset-legend' => 'Bedel ereysirka',
'passwordreset-username' => 'Magaca gudagalka',
'passwordreset-email' => 'Ciwaanka e-mailka',
@@ -741,7 +762,6 @@ sababteeda neh waxaa laga heli kartaa [{{fullurl:{{#Special:Log}}/delete|page={
'searchmenu-legend' => 'Raadi doorashooyinka',
'searchmenu-exists' => "'''Wikigaan wuu 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-images' => 'Multimedia-ha',
@@ -776,9 +796,6 @@ sababteeda neh waxaa laga heli kartaa [{{fullurl:{{#Special:Log}}/delete|page={
'powersearch-toggleall' => 'Dhamaan',
'powersearch-togglenone' => 'Waxna',
-# Quickbar
-'qbsettings-none' => 'Waxna',
-
# Preferences page
'preferences' => 'Dooqyada',
'mypreferences' => 'Dooqyadeyda',
@@ -875,6 +892,7 @@ E-mailkaada mala sheegaayo markii ee dadka kale kula soo xiriirayaan.',
'recentchanges' => 'Isbedelada dhow',
'recentchanges-legend' => 'Dooqyada isbedelada dhow',
'recentchanges-summary' => 'Dabagal isbedelada dhow ee wikiga ee ku dhacay bogaan.',
+'recentchanges-noresult' => 'Ma jiraan wax is bedel ah xilliga aad soo koobtay ee u dhigma habkaan.',
'recentchanges-feed-description' => 'Dabagal isbedelada dhow ee wikiga oo ku dhacay feedkaan',
'recentchanges-label-newpage' => 'Wax bedelkaan wuxuu sameeyay bog cusub',
'recentchanges-label-minor' => 'Kan waa bedel yar',
@@ -905,7 +923,6 @@ E-mailkaada mala sheegaayo markii ee dadka kale kula soo xiriirayaan.',
'recentchangeslinked' => "Isbedelada la'xiriira",
'recentchangeslinked-toolbox' => "Isbedelada la'xiriira",
'recentchangeslinked-title' => 'Wax bedelka la xiriiro "$1"',
-'recentchangeslinked-noresult' => 'Wax isbedel ah laguma sameyn boggaga ilaa xiligii la doortay.',
'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:',
@@ -1283,8 +1300,6 @@ Eeg [[Special:BlockList|Mamnuucyada]] si aad u aragto liiska mamnuucyada ee hadd
'block-log-flags-nocreate' => 'sameynta gudagalah lamaogola',
'block-log-flags-noemail' => 'e-mailka laga mamnuucay',
'ipb-needreblock' => '$1 mar hore aa la mamnuucay. marabtaa in aad wax ka bedesho habka?',
-'blockme' => 'I mamnuuc',
-'proxyblocksuccess' => 'waa la sameeyay.',
# Move page
'movenologin' => 'Gudaha kuma jirtid',
@@ -1416,7 +1431,7 @@ Hadii faylka wax laga badalay sida oo markiisa hore ahaa, waxaa laga yaabaa in e
* gpslongitude
* gpsaltitude',
-# EXIF tags
+# Exif tags
'exif-iimcategory' => 'Qeybta',
# External editor support
@@ -1462,9 +1477,8 @@ waxaad awoodaa [[Special:EditWatchlist/raw|Liiska wax ka bedel]].',
# Special:Version
'version-poweredby-others' => 'kuwa kale',
-# Special:FilePath
-'filepath-page' => 'Fayl:',
-'filepath-submit' => 'Soco',
+# Special:Redirect
+'redirect-file' => 'Magaca faylka',
# Special:FileDuplicateSearch
'fileduplicatesearch-legend' => 'Raadi mid tusaale ah',
@@ -1509,4 +1523,8 @@ waxaad awoodaa [[Special:EditWatchlist/raw|Liiska wax ka bedel]].',
'api-error-unknown-warning' => 'Digniin la aqoon: $1',
'api-error-uploaddisabled' => 'Soo gelinta waa laga xiray wikigaan.',
+# Limit report
+'limitreport-cputime' => 'Waqtiga adeegsiga CPU',
+'limitreport-walltime' => 'Waqtiga dhabta ah adeegsiga',
+
);
diff --git a/languages/messages/MessagesSq.php b/languages/messages/MessagesSq.php
index 1ee106ed..35a67cbe 100644
--- a/languages/messages/MessagesSq.php
+++ b/languages/messages/MessagesSq.php
@@ -246,9 +246,6 @@ $messages = array(
'tog-shownumberswatching' => 'Trego numrin e përdoruesve që vëzhgojnë këtë faqe',
'tog-oldsig' => 'Nënshkrimi ekzistues:',
'tog-fancysig' => 'Mbaje nënshkrimin si wikitekst (pa lidhje automatike)',
-'tog-externaleditor' => 'Përdor si rregull program të jashtëm redaktimi (vetëm për ekspertë, kërkon regjistrime speciale të kompjuterit. [//www.mediawiki.org/wiki/Manual:External_editors More information.])',
-'tog-externaldiff' => 'Përdor si rregull program të jashtëm diff (vetëm për ekspertë, kërkon regjistrime speciale të kompjuterit. [//www.mediawiki.org/wiki/Manual:External_editors More information.])',
-'tog-showjumplinks' => 'Lejo lidhje "shko tek"',
'tog-uselivepreview' => 'Trego bocetin në mënyrë të drejtëpërdrejtë (kërkon JavaScript) (eksperimentale)',
'tog-forceeditsummary' => 'Më njofto kur e lë përmbledhjen e redaktimit bosh',
'tog-watchlisthideown' => 'Fshih redaktimet e mia nga lista e faqeve të vëzhguara',
@@ -261,6 +258,7 @@ $messages = array(
'tog-diffonly' => 'Mos trego përmbajtjen e faqes nën diff-e',
'tog-showhiddencats' => 'Trego kategoritë e fshehura',
'tog-norollbackdiff' => 'Ndryshimi pas rikthimit do të fshihet',
+'tog-useeditwarning' => 'Më paralajmëro kur unë lë një redaktim faqeje me ndryshime të paruajtura',
'underline-always' => 'Gjithmonë',
'underline-never' => 'Asnjëherë',
@@ -324,6 +322,18 @@ $messages = array(
'oct' => 'Tet',
'nov' => 'Nën',
'dec' => 'Dhje',
+'january-date' => '$1 janar',
+'february-date' => '$1 shkurt',
+'march-date' => '$1 mars',
+'april-date' => '$1 prill',
+'may-date' => '$1 maj',
+'june-date' => '$1 qershor',
+'july-date' => '$1 korrik',
+'august-date' => '$1 gusht',
+'september-date' => '$1 shtator',
+'october-date' => '$1 tetor',
+'november-date' => '$1 nëntor',
+'december-date' => '$1 dhjetor',
# Categories related messages
'pagecategories' => '{{PLURAL:$1|Kategoria|Kategoritë}}',
@@ -405,6 +415,7 @@ $messages = array(
'create-this-page' => 'Krijoje këtë faqe',
'delete' => 'Grise',
'deletethispage' => 'Grise këtë faqe',
+'undeletethispage' => 'Rikthe faqen',
'undelete_short' => 'Anullo fshirjen {{PLURAL:$1|një redaktim|$1 redaktime}}',
'viewdeleted_short' => 'Shiko {{PLURAL:$1|një redaktim të fshirë|$1 redaktime të fshira}}',
'protect' => 'Mbroje',
@@ -448,7 +459,7 @@ $1",
'pool-queuefull' => 'Radha e proceseve është mbushur',
'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).
+# 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).
'aboutsite' => 'Rreth {{SITENAME}}',
'aboutpage' => 'Project:Rreth',
'copyright' => 'Përmbajtja është në disponim nëpërmjet licencës $1.',
@@ -458,7 +469,6 @@ $1",
'disclaimers' => 'Shfajësimet',
'disclaimerpage' => 'Project:Shfajësimet e përgjithshme',
'edithelp' => 'Ndihmë për redaktim',
-'edithelppage' => 'Help:Redaktimi',
'helppage' => 'Help:Përmbajtje',
'mainpage' => 'Faqja kryesore',
'mainpage-description' => 'Faqja kryesore',
@@ -535,18 +545,6 @@ Kjo mund të vijë edhe si rezultat i një gabimi në programin e përdorur nga
# General errors
'error' => 'Gabim',
'databaseerror' => 'Gabim në databazë',
-'dberrortext' => 'Ka ndodhur një gabim me pyetjen e regjistrit.
-Kjo mund të ndodhi n.q.s. pyetja nuk është e vlehshme,
-ose mund të jetë një yçkël e softuerit.
-Pyetja e fundit që i keni bërë regjistrit ishte:
-<blockquote><tt>$1</tt></blockquote>
-nga funksioni "<tt>$2</tt>".
-MySQL kthehu gabimin "<tt>$3: $4</tt>".',
-'dberrortextcl' => 'Ka ndodhur një gabim me sintaksën query në databazë.
-Query e fundit që i keni bërë regjistrit ishte:
-"$1"
-nga funksioni "$2".
-MySQL kthehu gabimin "$3: $4".',
'laggedslavemode' => "'''Kujdes:''' Kjo faqe nuk mund të ketë përditësime të kohëve të fundit.",
'readonly' => 'Databaza e kyçur',
'enterlockreason' => 'Shëno arsyen e kyçjes, gjithashtu shëno se kur mund të hapet.',
@@ -601,7 +599,6 @@ Ju lutemi, provojeni përsëri pas disa minutash.',
'editinginterface' => "'''Kujdes:''' Po redaktoni një faqe që përdoret për tekstin dritares së programit.
Ndryshimet në këtë faqe do të ndikojnë pamjen e dritares për përdoruesit e tjerë.
Për përkthime, ju lutem konsideroni përdorimin e [//translatewiki.net/wiki/Main_Page?setlang=en translatewiki.net], projektin e lokalizimit MediaWiki.",
-'sqlhidden' => '(Query SQL e fshehur)',
'cascadeprotected' => 'Kjo faqe është mbrojtur nga redaktimi pasi është përfshirë në {{PLURAL:$1|faqen|faqet}} e mëposhtme që {{PLURAL:$1|është|janë}} mbrojtur sipas metodës "cascading":
$2',
'namespaceprotected' => "Nuk ju lejohet redaktimi i faqeve në hapsirën '''$1'''.",
@@ -632,10 +629,19 @@ Administratori i cili e mbylli atë e dha këtë shpjegim: "$3".',
'welcomecreation-msg' => 'Llogaria juaj u krijua.
Mos harroni të ndryshoni [[Special:Preferences|{{SITENAME}} preferencat]] tuaja.',
'yourname' => 'Fusni nofkën tuaj',
+'userlogin-yourname' => 'Emri i përdoruesit',
+'userlogin-yourname-ph' => 'Shtypni emrin tuaj të përdoruesit',
+'createacct-another-username-ph' => 'Shtypni emrin e përdoruesit',
'yourpassword' => 'Fusni fjalëkalimin tuaj',
+'userlogin-yourpassword' => 'Fjalëkalimi',
+'userlogin-yourpassword-ph' => 'Shtypni fjalëkalimin tuaj',
+'createacct-yourpassword-ph' => 'Shtypni një fjalëkalim',
'yourpasswordagain' => 'Fusni fjalëkalimin përsëri',
+'createacct-yourpasswordagain' => 'Konfirmoni fjalëkalimin',
+'createacct-yourpasswordagain-ph' => 'Shtypni fjalëkalimin përsëri',
'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',
+'userlogin-remembermypassword' => 'Më mbaj të kyçur',
+'userlogin-signwithsecure' => 'Përdor lidhje të sigurtë',
'yourdomainname' => 'Faqja juaj',
'password-change-forbidden' => 'Ju nuk mund të ndryshoni fjalëkalimet në këtë wiki.',
'externaldberror' => 'Ose kishte një gabim tek regjistri i identifikimit të jashtëm, ose nuk ju lejohet të përtërini llogarinë tuaje të jashtme.',
@@ -647,12 +653,17 @@ Mos harroni të ndryshoni [[Special:Preferences|{{SITENAME}} preferencat]] tuaja
'logout' => 'Dalje',
'userlogout' => 'Dalje',
'notloggedin' => 'Nuk keni hyrë brenda',
+'userlogin-noaccount' => 'Nuk keni një llogari?',
+'userlogin-joinproject' => 'Bashkohu me ne në {{SITENAME}}',
'nologin' => "Nuk keni një llogari? '''$1'''.",
'nologinlink' => 'Hapeni',
'createaccount' => 'Hap një llogari',
'gotaccount' => "Keni një llogari? '''$1'''.",
'gotaccountlink' => 'Hyni',
'userlogin-resetlink' => 'Keni harruar të dhënat tuaja të identifikimit?',
+'userlogin-resetpassword-link' => 'Rivendos fjalëkalimin',
+'userlogin-helplink' => '[[{{MediaWiki:helplogin-url}}|Më ndihmo të futem në Wikipedia]]',
+'createacct-join' => 'Jepni informacionin tuaj më poshtë',
'createaccountmail' => 'me email',
'createaccountreason' => 'Arsyeja:',
'badretype' => 'Fjalëkalimet nuk janë njësoj.',
@@ -728,7 +739,7 @@ Për të hyrë tërësisht duhet të vendosni një fjalëkalim të ri këtu:',
'newpassword' => 'I riu',
'retypenew' => 'I riu përsëri',
'resetpass_submit' => 'Ndrysho fjalëkalimin dhe hyni brenda',
-'resetpass_success' => 'Fjalëkalimi juaj është ndryshuar me sukses! Mund të hyni brenda...',
+'changepassword-success' => 'Fjalëkalimi juaj është ndryshuar me sukses! Mund të hyni brenda...',
'resetpass_forbidden' => 'Fjalëkalimet nuk mund të ndryshohen',
'resetpass-no-info' => 'Duhet të jeni i kyçur që të keni qasje direkte në këtë faqe.',
'resetpass-submit-loggedin' => 'Ndrysho fjalëkalimin',
@@ -738,10 +749,8 @@ Për të hyrë tërësisht duhet të vendosni një fjalëkalim të ri këtu:',
# Special:PasswordReset
'passwordreset' => 'Ndrysho fjalkalimin',
-'passwordreset-text' => 'Plotësoni këtë formular për të marrë një këshillë e-mail të dhënat e llogarisë suaj.',
'passwordreset-legend' => 'Ndrysho fjalkalimin',
'passwordreset-disabled' => 'Rivendosja e fjalëkalimit është deaktivizuar në këtë wiki.',
-'passwordreset-pretext' => '{{PLURAL:$1| | Shkruani një nga pjesët e të dhënave më poshtë}}',
'passwordreset-username' => 'Nofka:',
'passwordreset-domain' => 'Domain:',
'passwordreset-capture' => 'Dëshiron të shikosh e-mail-in që rezulton?',
@@ -983,6 +992,8 @@ Duket se është grisur.',
'edit-already-exists' => 'Faqja nuk mundej të hapet.
Ajo tanimë ekziston.',
'defaultmessagetext' => 'Teksti i porosisë së parazgjedhur',
+'editwarning-warning' => 'Lënia e kësaj faqeje mund t\'ju shkaktojë humbjen e çdo ndryshimi që keni bërë.
+Nëse keni hyrë brenda, ju mund ta hiqni këtë paralajmërim në seksionin "Redaktimi" tek preferencat tuaja.',
# Content models
'content-model-text' => 'tekst i thejshtë',
@@ -1208,7 +1219,6 @@ Kini kujdes se përdorimi i lidhjeve të shfletimit do të ndryshojë përzgjedh
'searchmenu-legend' => 'Parazgjedhjet e kërkimit',
'searchmenu-exists' => "'''Në këtë wiki kjo faqe është emëruar \"[[:\$1]]\"'''",
'searchmenu-new' => "'''Hapë faqen \"[[:\$1]]\" në këtë wiki!'''",
-'searchhelp-url' => 'Help:Ndihmë',
'searchmenu-prefix' => '[[Special:PrefixIndex/$1|Shfletoi faqet me këtë parashtesë]]',
'searchprofile-articles' => 'Përmbajtja e faqeve',
'searchprofile-project' => 'Ndihmë dhe faqet e Projektit',
@@ -1250,15 +1260,6 @@ Kini kujdes se përdorimi i lidhjeve të shfletimit do të ndryshojë përzgjedh
'search-external' => 'Kërkim i jashtëm',
'searchdisabled' => '<p>Kërkimi me tekst të plotë është bllokuar tani për tani ngaqë shërbyesi është shumë i ngarkuar; shpresojmë ta nxjerrim prapë në gjendje normale pas disa punimeve. Deri atëherë mund të përdorni Google-in për kërkime:</p>',
-# Quickbar
-'qbsettings' => 'Vendime të shpejta',
-'qbsettings-none' => 'Asnjë',
-'qbsettings-fixedleft' => 'Lidhur majtas',
-'qbsettings-fixedright' => 'Lidhur djathtas',
-'qbsettings-floatingleft' => 'Pezull majtas',
-'qbsettings-floatingright' => 'Pezull djathtas',
-'qbsettings-directionality' => 'Fikse, në varësi të skriptës së drejtuar në gjuhën tuaj',
-
# Preferences page
'preferences' => 'Parapëlqimet',
'mypreferences' => 'Parapëlqimet',
@@ -1291,7 +1292,6 @@ Kini kujdes se përdorimi i lidhjeve të shfletimit do të ndryshojë përzgjedh
'resetprefs' => 'Rikthe parapëlqimet',
'restoreprefs' => 'Rikthe të gjitha të dhënat e mëparshme',
'prefs-editing' => 'Redaktimi',
-'prefs-edit-boxsize' => 'Madhësia e dritares së redaktimit.',
'rows' => 'Rreshta:',
'columns' => 'Kollona:',
'searchresultshead' => 'Kërkimi',
@@ -1302,9 +1302,6 @@ Kini kujdes se përdorimi i lidhjeve të shfletimit do të ndryshojë përzgjedh
'recentchangesdays-max' => '(maksimum $1 {{PLURAL:$1|dit|ditë}})',
'recentchangescount' => 'Numri i redaktimeve për të treguar:',
'prefs-help-recentchangescount' => 'Kjo përfshin ndryshimet e freskëta, historikun e faqes dhe regjistrat.',
-'prefs-help-watchlist-token' => 'Plotësimi në këtë fushë me një kyç të fshehtë do të gjenerojë një RSS për të listës mbikqyrëse tuaj.
- Kushdo që e di të rëndësishme në këtë fushë do të jetë në gjendje për të lexuar lista mbikqyrëse e juaj, kështu që zgjidhni një vlerë të sigurt.
- Këtu ka një vlerë të rastësishme-generated ju mund të përdorni: $1',
'savedprefs' => 'Parapëlqimet tuaja janë ruajtur.',
'timezonelegend' => 'Zona kohore:',
'localtime' => 'Ora lokale:',
@@ -1335,7 +1332,6 @@ Kini kujdes se përdorimi i lidhjeve të shfletimit do të ndryshojë përzgjedh
'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:',
-'prefs-textboxsize' => 'Madhësia e dritares së redakrimit',
'youremail' => 'Adresa e email-it*',
'username' => 'Nofka e përdoruesit:',
'uid' => 'Nr. i identifikimit:',
@@ -1574,7 +1570,6 @@ Kjo informatë është publike.',
'recentchangeslinked-feed' => 'Ndryshime të ndërvarura',
'recentchangeslinked-toolbox' => 'Ndryshime të ndërvarura',
'recentchangeslinked-title' => 'Ndryshime që kanë lidhje me "$1"',
-'recentchangeslinked-noresult' => 'Nuk ka pasur ndryshime tek faqet e lidhura gjatë kohës së dhënë.',
'recentchangeslinked-summary' => "Kjo është një listë e ndryshimeve së fundmi të faqeve të lidhura nga faqja e dhënë (ose bëjnë pjesë tek kategoria e dhënë).
Faqet [[Special:Watchlist|nën mbikqyrjen tuaj]] duken të '''theksuara'''.",
'recentchangeslinked-page' => 'Emri i faqes:',
@@ -1796,7 +1791,6 @@ Për siguri optimale, img_auth.php është çaktivizuar.',
'http-read-error' => 'Gabim në leximin e HTTP.',
'http-timed-out' => 'Kërkesës HTTP i kaloi koha.',
'http-curl-error' => 'Gabim gjatë gjetjes së URL-së: $1',
-'http-host-unreachable' => 'Nuk mund të lidheni me adresën URL.',
'http-bad-status' => 'Ndodhi një problem gjatë kërkesës HTTP: $1 $2',
# Some likely curl errors. More could be added from <http://curl.haxx.se/libcurl/c/libcurl-errors.html>
@@ -1945,12 +1939,6 @@ Mos harroni të shihni nyje tjera të stampave para grisjes së tyre.',
'statistics-users-active-desc' => 'Përdoruesit që kanë së paku një veprim në {{PLURAL:$1|ditën|$1 ditët}} e fundit',
'statistics-mostpopular' => 'Faqet më të shikuara',
-'disambiguations' => 'Faqet që lidhen te faqet kthjelluese',
-'disambiguationspage' => 'Template:Kthjellim',
-'disambiguations-text' => "Faqet e mëposhtme lidhen tek një '''faqe kthjelluese'''.
-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' => "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.
@@ -2194,10 +2182,9 @@ Në qoftë se dëshironi të hiqni një faqe nga lista mbikqyrëse më vonë, sh
'unwatchthispage' => 'Mos e mbikqyr',
'notanarticle' => 'Nuk është artikull',
'notvisiblerev' => 'Revizioni është grisur',
-'watchnochange' => 'Asnjë nga artikujt nën mbikqyrje nuk është redaktuar gjatë kohës së dhënë.',
'watchlist-details' => '{{PLURAL:$1|$1 faqe|$1 faqe}} nën mbikqyrje duke mos numëruar faqet e diskutimit.',
-'wlheader-enotif' => '* Njoftimi me email është lejuar.',
-'wlheader-showupdated' => "* Faqet që kanë ndryshuar nga vizita juaj e fundit do të tregohen të '''trasha'''",
+'wlheader-enotif' => 'Njoftimi me email është lejuar.',
+'wlheader-showupdated' => "Faqet që kanë ndryshuar nga vizita juaj e fundit do të tregohen të '''trasha'''",
'watchmethod-recent' => 'duke parë ndryshimet e fundit për faqet nën mbikqyrje',
'watchmethod-list' => 'duke parë faqet nën mbikqyrje për ndryshimet e fundit',
'watchlistcontains' => 'Lista mbikqyrëse e juaj ka $1 {{PLURAL:$1|faqe|faqe}}.',
@@ -2614,11 +2601,8 @@ Mund të jetë zhbllokuar.',
Ajo është, megjithatë, e bllokuar si pjesë e rangut $2, që nuk mund të zhbllokohet.',
'ip_range_invalid' => 'Shtrirje IP gabim.',
'ip_range_toolarge' => 'Radhitja e bllokimeve më të mëdha se /$1 nuk lejohet.',
-'blockme' => 'Më blloko',
'proxyblocker' => 'Bllokuesi i ndërmjetëseve',
-'proxyblocker-disabled' => 'Ky funksion është pamundësuar.',
'proxyblockreason' => 'IP adresa juaj është bllokuar sepse është një ndërmjetëse e hapur. Ju lutem lidhuni me kompaninë e shërbimeve të Internetit që përdorni dhe i informoni për këtë problem sigurije.',
-'proxyblocksuccess' => 'Mbaruar.',
'sorbsreason' => 'Adresa IP e juaj është radhitur si ndërmjetëse e hapur tek lista DNSBL.',
'sorbs_create_account_reason' => 'Adresa IP e juaj është radhitur si ndërmjetëse e hapur tek lista DNSBL që përdoret nga {{SITENAME}}. Nuk ju lejohet të hapni një llogari.',
'cant-block-while-blocked' => 'Ju nuk mund të bllokoni përdorues të tjerë ndërkohë që jeni i bllokuar.',
@@ -2959,8 +2943,6 @@ Ju lutemi provoni përsëri.',
'pageinfo-authors' => 'Numri i autorëve të veçantë',
# Skin names
-'skinname-standard' => 'Standarte',
-'skinname-nostalgia' => 'Nostalgjike',
'skinname-cologneblue' => 'Kolonjë Blu',
# Patrolling
@@ -3062,7 +3044,7 @@ Në qoftë se skeda është ndryshuar nga gjendja origjinale, disa hollësira mu
* gpslongitude
* gpsaltitude',
-# EXIF tags
+# Exif tags
'exif-imagewidth' => 'Gjerësia',
'exif-imagelength' => 'Gjatësia',
'exif-bitspersample' => 'Bit për komponent',
@@ -3240,7 +3222,7 @@ Në qoftë se skeda është ndryshuar nga gjendja origjinale, disa hollësira mu
'exif-originalimageheight' => 'Lartësia e fotografisë para se të shkurtohej',
'exif-originalimagewidth' => 'Gjerësia e fotografisë para se të shkurtohej',
-# EXIF attributes
+# Exif attributes
'exif-compression-1' => 'E pangjeshur',
'exif-compression-2' => 'CCITT Grupi 3 1-Dimensional Kodimi i Modifikuar Huffman i linjës së gjatësisë',
'exif-compression-3' => 'CCITT Grupi 3 faks kodimi',
@@ -3627,7 +3609,6 @@ Ju gjithashtu mund [[Special:EditWatchlist|të përdorni redaktuesin standart]].
'version-other' => 'Të tjera',
'version-mediahandlers' => 'Mbajtesit e Media-s',
'version-hooks' => 'Goditjet',
-'version-extension-functions' => 'Funksionet shtese',
'version-parser-extensiontags' => 'Parser etiketat shtese',
'version-parser-function-hooks' => 'Parser goditjet e funksionit',
'version-hook-name' => 'Emri i goditjes',
@@ -3646,13 +3627,6 @@ Ju duhet të keni marrë [{{SERVER}}{{SCRIPTPATH}}/COPYING një kopje të GNU Ge
'version-software-version' => 'Versioni',
'version-entrypoints-header-url' => 'URL',
-# Special:FilePath
-'filepath' => 'Vendndodhja e skedave',
-'filepath-page' => 'Skeda:',
-'filepath-submit' => 'Shko',
-'filepath-summary' => 'Kjo faqe speciale jep vendndodhjen e plotë të një skede.
-Figurat tregohen me madhësi të plotë, skedat e tjera hapen me programet përkatëse.',
-
# Special:FileDuplicateSearch
'fileduplicatesearch' => 'Kërkoni për skeda të dyfishta',
'fileduplicatesearch-summary' => 'Kërkoni për dyfishime të skedave në bazë të vlerës përmbledhëse («hash»).',
diff --git a/languages/messages/MessagesSr_ec.php b/languages/messages/MessagesSr_ec.php
index d365b193..88c90c4a 100644
--- a/languages/messages/MessagesSr_ec.php
+++ b/languages/messages/MessagesSr_ec.php
@@ -27,6 +27,7 @@
* @author TheStefan12345
* @author Јованвб
* @author Жељко Тодоровић
+ * @author Милан ЈелиÑавчић
* @author Михајло Ðнђелковић
* @author לערי ריינה×רט
*/
@@ -425,9 +426,6 @@ $messages = array(
'tog-shownumberswatching' => 'Прикажи број кориÑника који надгледају',
'tog-oldsig' => 'Текући потпиÑ:',
'tog-fancysig' => 'Сматрај Ð¿Ð¾Ñ‚Ð¿Ð¸Ñ ÐºÐ°Ð¾ викитекÑÑ‚ (без Ñамоповезивања)',
-'tog-externaleditor' => 'Увек кориÑти Ñпољни уређивач (Ñамо за напредне — потребне Ñу поÑебне поÑтавке на рачунару)',
-'tog-externaldiff' => 'Увек кориÑти Ñпољни програм за упоређивање (Ñамо за напредне — потребне Ñу поÑебне поÑтавке на рачунару)',
-'tog-showjumplinks' => 'Омогући помоћне везе „Иди на“',
'tog-uselivepreview' => 'КориÑти тренутан преглед (екÑпериментално)',
'tog-forceeditsummary' => 'Упозори ме када не унеÑем Ð¾Ð¿Ð¸Ñ Ð¸Ð·Ð¼ÐµÐ½Ðµ',
'tog-watchlisthideown' => 'Сакриј моје измене Ñа ÑпиÑка надгледања',
@@ -441,6 +439,8 @@ $messages = array(
'tog-showhiddencats' => 'Прикажи Ñкривене категорије',
'tog-noconvertlink' => 'Онемогући претварање наÑлова веза',
'tog-norollbackdiff' => 'ИзоÑтави разлику након извршеног враћања',
+'tog-useeditwarning' => 'Упозори ме када напуштам Ñтраницу Ñа неÑачуваним променама',
+'tog-prefershttps' => 'Увек кориÑти Ñигурну конекцију када Ñам пријављен.',
'underline-always' => 'увек подвлачи',
'underline-never' => 'никад не подвлачи',
@@ -504,6 +504,18 @@ $messages = array(
'oct' => 'окт',
'nov' => 'нов',
'dec' => 'дец',
+'january-date' => '$1 јануар',
+'february-date' => '$1 фебруар',
+'march-date' => '$1 март',
+'april-date' => '$1 април',
+'may-date' => '$1 мај',
+'june-date' => '$1 јун',
+'july-date' => '$1 јул',
+'august-date' => '$1 авгуÑÑ‚',
+'september-date' => '$1 Ñемптембар',
+'october-date' => '$1 окотобар',
+'november-date' => '$1 новембар',
+'december-date' => '$1 децембар',
# Categories related messages
'pagecategories' => '{{PLURAL:$1|Категорија|Категорије}}',
@@ -524,7 +536,7 @@ $messages = array(
'noindex-category' => 'ÐепопиÑане Ñтранице',
'broken-file-category' => 'Странице Ñ Ð½ÐµÐ¸Ñправним везама до датотека',
-'linkprefix' => '/^(.*?)([a-zA-Z\\x80-\\xff]+)$/sD',
+'linkprefix' => '/^((?>.*(?<![a-zA-Z\\x80-\\xff])))(.+)$/sD',
'about' => 'О нама',
'article' => 'Страница Ñа Ñадржајем',
@@ -587,6 +599,7 @@ $messages = array(
'create-this-page' => 'Ðаправи ову Ñтраницу',
'delete' => 'Обриши',
'deletethispage' => 'Обриши ову Ñтраницу',
+'undeletethispage' => 'Поврати ову Ñтраницу',
'undelete_short' => 'Врати {{PLURAL:$1|једну обриÑану измену|$1 обриÑане измене|$1 обриÑаних измена}}',
'viewdeleted_short' => 'Погледај {{PLURAL:$1|обриÑану измену|$1 обриÑане измене|$1 обриÑаних измена}}',
'protect' => 'Заштити',
@@ -630,7 +643,7 @@ $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).
+# 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).
'aboutsite' => 'О пројекту {{SITENAME}}',
'aboutpage' => 'Project:О нама',
'copyright' => 'Садржај је доÑтупан под лиценцом $1.',
@@ -640,7 +653,6 @@ $1',
'disclaimers' => 'Одрицање одговорноÑти',
'disclaimerpage' => 'Project:Одрицање одговорноÑти',
'edithelp' => 'Помоћ при уређивању',
-'edithelppage' => 'Help:Уређивање',
'helppage' => 'Help:Садржај',
'mainpage' => 'Главна Ñтрана',
'mainpage-description' => 'Главна Ñтрана',
@@ -672,7 +684,6 @@ $1',
'newmessagesdifflinkplural' => '{{PLURAL:$1|поÑледњу измену|поÑледње измене}}',
'youhavenewmessagesmulti' => 'Имате нових порука на $1',
'editsection' => 'уреди',
-'editsection-brackets' => '[$1]',
'editold' => 'уреди',
'viewsourceold' => 'изворни код',
'editlink' => 'уреди',
@@ -724,17 +735,8 @@ $1',
# General errors
'error' => 'Грешка',
'databaseerror' => 'Грешка у бази података',
-'dberrortext' => 'Дошло је до Ñинтактичке грешке у бази.
-Можда Ñе ради о грешци у Ñофтверу.
-ПоÑледњи покушај упита је глаÑио:
-<blockquote><code>$1</code></blockquote>
-унутар функције „<code>$2</code>“.
-База података је пријавила грешку „<samp>$3: $4</samp>“.',
-'dberrortextcl' => 'Дошло је до Ñинтактичке грешке у бази.
-ПоÑледњи покушај упита је глаÑио:
-„$1“
-унутар функције „$2“.
-База података је пријавила грешку „$3: $4“',
+'databaseerror-function' => 'Функција: $1',
+'databaseerror-error' => 'Грешка: $1',
'laggedslavemode' => "'''Упозорење:''' Ñтраница је можда заÑтарела.",
'readonly' => 'База података је закључана',
'enterlockreason' => 'УнеÑите разлог за закључавање, укључујући и време откључавања',
@@ -790,12 +792,15 @@ $1',
'editinginterface' => "'''Упозорење:''' уређујете Ñтраницу која Ñе кориÑти за приказивање текÑта кориÑничког окружења.
Измене на овој Ñтраници ће утицати на Ñве кориÑнике овог викија.
Да биÑте додали или изменили преводе Ñвих викија, поÑетите [//translatewiki.net/wiki/Main_Page?setlang=sr_ec ТранÑлејтвики], пројекат за локализацију Медијавикија.",
-'sqlhidden' => '(SQL упит је Ñакривен)',
'cascadeprotected' => 'Ова Ñтраница је закључана јер Ñадржи {{PLURAL:$1|Ñледећу Ñтраницу која је заштићена|Ñледеће Ñтранице које Ñу заштићене}} „преноÑивом“ заштитом:
$2',
'namespaceprotected' => "Ðемате дозволу да уређујете Ñтранице у именÑком проÑтору '''$1'''.",
'customcssprotected' => 'Ðемате дозволу да мењате ову CSS Ñтраницу јер Ñадржи личне поÑтавке другог кориÑника.',
'customjsprotected' => 'Ðемате дозволу да мењате ову Ñтраницу јаваÑкрипта јер Ñадржи личне поÑтавке другог кориÑника.',
+'mycustomcssprotected' => 'Ðемате дозволу за мењање ове CSS Ñтранице.',
+'mycustomjsprotected' => 'Ðемате дозволу за мењање ове JavaScript Ñтранице.',
+'myprivateinfoprotected' => 'Ðемате дозволу за мењање ваших личних информација.',
+'mypreferencesprotected' => 'Ðемате дозволу за мењање ваших подешавања.',
'ns-specialprotected' => 'ПоÑебне Ñтранице Ñе не могу уређивати.',
'titleprotected' => "Овај наÑлов је {{GENDER:$1|заштитио кориÑник|заштитила кориÑница|заштитио кориÑник}} [[User:$1|$1]].
Ðаведени разлог: ''$2''.",
@@ -820,10 +825,19 @@ $2',
'welcomecreation-msg' => 'Ваш налог је отворен.
Ðе заборавите да промените Ñвоја [[Special:Preferences|подешавања]].',
'yourname' => 'КориÑничко име:',
+'userlogin-yourname' => 'КориÑничко име',
+'userlogin-yourname-ph' => 'УнеÑите ваше кориÑничко име',
+'createacct-another-username-ph' => 'УнеÑите кориÑничко име',
'yourpassword' => 'Лозинка:',
+'userlogin-yourpassword' => 'Лозинка',
+'userlogin-yourpassword-ph' => 'УнеÑите вашу лозинку',
+'createacct-yourpassword-ph' => 'УнеÑите нову лозинку',
'yourpasswordagain' => 'Потврда лозинке:',
+'createacct-yourpasswordagain' => 'Потврдите лозинку',
+'createacct-yourpasswordagain-ph' => 'УнеÑите лозинку још једном',
'remembermypassword' => 'Запамти моју лозинку на овом прегледачу (најдуже $1 {{PLURAL:$1|дан|дана}})',
-'securelogin-stick-https' => 'ОÑтаните повезани Ñа HTTPS након пријаве',
+'userlogin-remembermypassword' => 'ОÑтави ме пријављеног/у',
+'userlogin-signwithsecure' => 'КориÑтите Ñигурну конекцију',
'yourdomainname' => 'Домен:',
'password-change-forbidden' => 'Ðе можете да промените лозинку на овом викију.',
'externaldberror' => 'Дошло је до грешке при препознавању базе података или немате овлашћења да ажурирате Ñвој Ñпољни налог.',
@@ -835,17 +849,41 @@ $2',
'logout' => 'Одјава',
'userlogout' => 'Одјави ме',
'notloggedin' => 'ÐиÑте пријављени',
+'userlogin-noaccount' => 'Ðемате налог?',
+'userlogin-joinproject' => 'Отворите га',
'nologin' => 'Ðемате налог? Идите на Ñтраницу $1.',
'nologinlink' => 'Отварање налога',
'createaccount' => 'Отвори налог',
'gotaccount' => 'Већ имате налог? Идите на Ñтраницу „$1“.',
'gotaccountlink' => 'Пријава',
'userlogin-resetlink' => 'Заборавили Ñте податке за пријаву?',
+'userlogin-resetpassword-link' => 'РеÑетујте лозинку',
+'helplogin-url' => 'Help:Logging in',
+'userlogin-helplink' => '[[{{MediaWiki:helplogin-url}}|Помоћ при пријављивању]]',
+'userlogin-createanother' => 'Отвори још један налог',
+'createacct-join' => 'УнеÑите Ñвоје податке иÑпод',
+'createacct-another-join' => 'УнеÑите податке за нови налог иÑпод.',
+'createacct-emailrequired' => 'ÐдреÑа е-поште',
+'createacct-emailoptional' => 'ÐдреÑа е-поште (опционо)',
+'createacct-email-ph' => 'УнеÑите вашу адреÑу е-поште',
+'createacct-another-email-ph' => 'УнеÑите адреÑу е-поште',
'createaccountmail' => 'КориÑтите привремену, Ñлучајно Ñтворену лозинку и пошаљите на наведену адреÑу електронÑке поште',
+'createacct-realname' => 'Право име (опционо)',
'createaccountreason' => 'Разлог:',
+'createacct-reason' => 'Разлог',
+'createacct-reason-ph' => 'Зашто правите још један налог?',
+'createacct-captcha' => 'СигурноÑна провера',
+'createacct-imgcaptcha-ph' => 'УнеÑите текÑÑ‚ који видите изнад',
+'createacct-submit' => 'Отвори налог',
+'createacct-another-submit' => 'Отвори још један налог',
+'createacct-benefit-heading' => '{{SITENAME}} је направљен од Ñтране људи као што Ñте ви.',
+'createacct-benefit-body1' => '{{PLURAL:$1|измена}}',
+'createacct-benefit-body2' => '{{PLURAL:$1|Ñтраница}}',
+'createacct-benefit-body3' => 'Ñкорашњих {{PLURAL:$1|доприноÑа}}',
'badretype' => 'Унете лозинке Ñе не поклапају.',
'userexists' => 'КориÑничко име је заузето. Изаберите друго.',
'loginerror' => 'Грешка при пријављивању',
+'createacct-error' => 'Дошло је до грешке при креирању налога',
'createaccounterror' => 'Ðе могу да отворим налог: $1',
'nocookiesnew' => 'КориÑнички налог је отворен, али ниÑте пријављени.
Овај вики кориÑти колачиће за пријаву. Вама Ñу колачићи онемогућени.
@@ -908,10 +946,12 @@ $2',
Ðко је ово грешка, занемарите ову поруку.',
'usernamehasherror' => 'КориÑничко име не може Ñадржати тарабе',
'login-throttled' => 'Превише пута Ñте покушали да Ñе пријавите.
-Сачекајте неколико минута и покушајте поново.',
+Молимо Ð²Ð°Ñ Ð´Ð° Ñачекате $1 пре него што покушате поново.',
'login-abort-generic' => 'ÐеуÑпешна пријава – прекинуто',
'loginlanguagelabel' => 'Језик: $1',
'suspicious-userlogout' => 'Ваш захтев за одјаву је одбијен јер је поÑлат од Ñтране неиÑправног прегледача или поÑредника.',
+'createacct-another-realname-tip' => 'Право име није обавезно.
+Ðко изаберете да га унеÑете, оно ће бити коришћено за припиÑивање вашег рада.',
# Email sending
'php-mail-error-unknown' => 'Ðепозната грешка у функцији PHP mail().',
@@ -928,8 +968,7 @@ $2',
'newpassword' => 'Ðова лозинка:',
'retypenew' => 'Потврда лозинке:',
'resetpass_submit' => 'ПоÑтави лозинку и пријави ме',
-'resetpass_success' => 'Ваша лозинка је уÑпешно промењена!
-Пријављујем ваÑ...',
+'changepassword-success' => 'Ваша лозинка је уÑпешно промењена!',
'resetpass_forbidden' => 'Лозинка не може бити промењена',
'resetpass-no-info' => 'Морате бити пријављени да биÑте приÑтупили овој Ñтраници.',
'resetpass-submit-loggedin' => 'Промени лозинку',
@@ -941,10 +980,10 @@ $2',
# Special:PasswordReset
'passwordreset' => 'Обнављање лозинке',
-'passwordreset-text' => 'Попуните овај образац да биÑте реÑетовали лозинку.',
+'passwordreset-text-one' => 'Попуните овај образац да биÑте реÑетовали лозинку.',
'passwordreset-legend' => 'Поништи лозинку',
'passwordreset-disabled' => 'Обнављање лозинке је онемогућено на овом викију.',
-'passwordreset-pretext' => '{{PLURAL:$1||УнеÑите један од делова података иÑпод}}',
+'passwordreset-emaildisabled' => 'Е-пошта је онемогућена на овом викију.',
'passwordreset-username' => 'КориÑничко име:',
'passwordreset-domain' => 'Домен:',
'passwordreset-capture' => 'Погледати крајњу поруку?',
@@ -969,7 +1008,7 @@ $2
Привремена лозинка: $2',
'passwordreset-emailsent' => 'ПодÑетник о лозинци је поÑлат на вашу адреÑу.',
'passwordreset-emailsent-capture' => 'ПоÑлат је подÑетник преко е-поште (приказан доле).',
-'passwordreset-emailerror-capture' => 'Ðаправљен је подÑетник за Ñлање преко е-поште (приказан доле), али га не могу поÑлати кориÑнику: $1',
+'passwordreset-emailerror-capture' => 'Е-порука за реÑетовање лозинке, приказана иÑпод је поÑлата, али Ñлање {{GENDER:$2|кориÑнику|кориÑници}} није уÑпело: $1',
# Special:ChangeEmail
'changeemail' => 'Промена е-адреÑе',
@@ -1187,12 +1226,15 @@ $2
Изгледа да је обриÑана.',
'edit-conflict' => 'Сукоб измена.',
'edit-no-change' => 'Ваша измена је занемарена јер није било никаквих измена у текÑту.',
+'postedit-confirmation' => 'Ваша измена је Ñачувана.',
'edit-already-exists' => 'Ðе могу да направим Ñтраницу.
Изгледа да она већ поÑтоји.',
'defaultmessagetext' => 'Подразумевани текÑÑ‚ поруке',
'content-failed-to-parse' => 'Ðе могу да рашчланим Ñадржај типа $2 за модел $1: $3',
'invalid-content-data' => 'ÐеиÑправни подаци Ñадржаја',
'content-not-allowed-here' => 'Садржај модела „$1“ није дозвољен на Ñтраници [[$2]]',
+'editwarning-warning' => 'Ðко напуÑтите ову Ñтраницу, изгубићете Ñве измене које Ñте направили.
+Ðко Ñте пријављени, можете онемогућити ово упозорење у Ñвојим подешавањима, у одељку „Уређивање“.',
# Content models
'content-model-wikitext' => 'викитекÑÑ‚',
@@ -1228,6 +1270,7 @@ $2
'undo-failure' => 'Ðе могу да вратим измену због поÑтојања Ñукобљених међуизмена.',
'undo-norev' => 'Ðе могу да вратим измену јер не поÑтоји или је обриÑана.',
'undo-summary' => 'Поништена измена $1 {{GENDER:$2|кориÑника|кориÑнице}} [[Special:Contributions/$2|$2]] ([[User talk:$2|разговор]])',
+'undo-summary-username-hidden' => 'Поништи измену $1 Ñкривеног кориÑника',
# Account creation failure
'cantcreateaccounttitle' => 'Ðе могу да отворим налог',
@@ -1409,6 +1452,7 @@ $1",
'compareselectedversions' => 'Упореди изабране измене',
'showhideselectedversions' => 'Прикажи/Ñакриј изабране измене',
'editundo' => 'поништи',
+'diff-empty' => '(Ðема разлике)',
'diff-multi' => '({{PLURAL:$1|није приказана међуизмена|ниÑу приказане $1 међуизмене|није приказано $1 међуизмена}} {{PLURAL:$2|једног|$2|$2}} кориÑника)',
'diff-multi-manyusers' => '({{PLURAL:$1|Ðије приказана међуизмена|ÐиÑу приказане $1 међуизмене|Ðије приказано $1 међуизмена}} од више од $2 кориÑника)',
'difference-missing-revision' => 'Ðе могу да пронађем {{PLURAL:$2|једну измену|$2 измене|$2 измена}} од ове разлике ($1).
@@ -1436,7 +1480,6 @@ $1",
'searchmenu-legend' => 'ПоÑтавке претраге',
'searchmenu-exists' => "'''ПоÑтоји и чланак под називом „[[:$1]]“.'''",
'searchmenu-new' => "'''Ðаправите Ñтраницу „[[:$1]]“.'''",
-'searchhelp-url' => 'Help:Садржај',
'searchmenu-prefix' => '[[Special:PrefixIndex/$1|Прегледај Ñтранице Ñ Ð¾Ð²Ð¸Ð¼ префикÑом]]',
'searchprofile-articles' => 'Чланци',
'searchprofile-project' => 'Странице помоћи и пројеката',
@@ -1481,15 +1524,6 @@ $1",
У међувремену можете тражити преко Гугла.
Упамтите да његови попиÑи овог викија могу бити заÑтарели.',
-# Quickbar
-'qbsettings' => 'Бочна палета',
-'qbsettings-none' => 'Ðишта',
-'qbsettings-fixedleft' => 'Причвршћена лево',
-'qbsettings-fixedright' => 'Причвршћена деÑно',
-'qbsettings-floatingleft' => 'Плутајућа лево',
-'qbsettings-floatingright' => 'Плутајућа деÑно',
-'qbsettings-directionality' => 'ФикÑно, у завиÑноÑти од Ñмера пиÑања вашег језика',
-
# Preferences page
'preferences' => 'Подешавања',
'mypreferences' => 'Подешавања',
@@ -1522,7 +1556,6 @@ $1",
'resetprefs' => 'ОчиÑти неÑачуване измене',
'restoreprefs' => 'Врати Ñве на подразумевано (у Ñвим одељцима)',
'prefs-editing' => 'Уређивање',
-'prefs-edit-boxsize' => 'Величина оквира за уређивање.',
'rows' => 'Редова:',
'columns' => 'Колоне:',
'searchresultshead' => 'Претрага',
@@ -1533,9 +1566,6 @@ $1",
'recentchangesdays-max' => '(највише $1 {{PLURAL:$1|дан|дана|дана}})',
'recentchangescount' => 'Број измена за приказ:',
'prefs-help-recentchangescount' => 'Подразумева Ñкорашње измене, иÑторије Ñтраница и дневнике.',
-'prefs-help-watchlist-token' => 'Попуњавањем овог поља Ñ Ñ‚Ð°Ñ˜Ð½Ð¾Ð¼ шифром направиће RSS довод вашег ÑпиÑка надгледања.
-Свако ко зна ту шифру биће у могућноÑти да види ваша надгледања, зато изаберите безбедну.
-Ðа пример: $1',
'savedprefs' => 'Ваша подешавања Ñу Ñачувана.',
'timezonelegend' => 'ВременÑка зона:',
'localtime' => 'Локално време:',
@@ -1566,7 +1596,6 @@ $1",
'prefs-reset-intro' => 'Можете кориÑтити ову Ñтраницу да поништите Ñвоје поÑтавке на подразумеване вредноÑти.
Ова радња Ñе не може вратити.',
'prefs-emailconfirm-label' => 'Потврда е-адреÑе:',
-'prefs-textboxsize' => 'Величина оквира за уређивање',
'youremail' => 'Е-адреÑа:',
'username' => '{{GENDER:$1|КориÑничко име}}:',
'uid' => '{{GENDER:$1|КориÑнички}} ID:',
@@ -1602,6 +1631,8 @@ $1",
'prefs-dateformat' => 'Формат датума',
'prefs-timeoffset' => 'ВременÑка разлика',
'prefs-advancedediting' => 'Главна подешавања',
+'prefs-editor' => 'Уређивач',
+'prefs-preview' => 'Претпреглед',
'prefs-advancedrc' => 'Ðапредне поÑтавке',
'prefs-advancedrendering' => 'Ðапредне поÑтавке',
'prefs-advancedsearchoptions' => 'Ðапредне поÑтавке',
@@ -1610,6 +1641,7 @@ $1",
'prefs-displaysearchoptions' => 'ПоÑтавке приказа',
'prefs-displaywatchlist' => 'ПоÑтавке приказа',
'prefs-diffs' => 'Разлике',
+'prefs-help-prefershttps' => 'Ова подешавања ће Ñтупити на Ñнагу при Ñледећој пријави.',
# User preference: email validation using jQuery
'email-address-validity-valid' => 'Е-адреÑа је иÑправна',
@@ -1702,11 +1734,15 @@ $1",
'right-proxyunbannable' => 'заобилажење Ñамоблокирања поÑредника',
'right-unblockself' => 'Одблокирај Ñамог Ñебе',
'right-protect' => 'Промени нивое заштите и уреди каÑкадно заштићене Ñтранице',
-'right-editprotected' => 'уређивање заштићених Ñтраница (Ñ Ð¿Ñ€ÐµÐ½Ð¾Ñивом заштитом)',
+'right-editprotected' => 'Уреди Ñтранице под заштитом „{{int:protect-level-sysop}}“',
+'right-editsemiprotected' => 'Уреди Ñтранице под заштитом „{{int:protect-level-autoconfirmed}}“',
'right-editinterface' => 'уређивање кориÑничког окружења',
'right-editusercssjs' => 'уређивање туђих CSS и јаваÑкрипт датотека',
'right-editusercss' => 'уређивање туђих CSS датотека',
'right-edituserjs' => 'уређивање туђих јаваÑкрипт датотека',
+'right-viewmyprivateinfo' => 'Видите Ñвоје личне податке (нпр. адреÑу е-поште, право име)',
+'right-editmyprivateinfo' => 'Уреди Ñвоје личне податке (нпр. адреÑу е-поште, право име)',
+'right-editmyoptions' => 'Уредите Ñвоја подешавања',
'right-rollback' => 'брзо враћање измена поÑледњег кориÑника који је мењао одређену Ñтраницу',
'right-markbotedits' => 'означавање враћених измена као измене бота',
'right-noratelimit' => 'отпорноÑÑ‚ на ограничења',
@@ -1768,9 +1804,12 @@ $1",
'action-userrights-interwiki' => 'уређивање кориÑничких права на другим викијима',
'action-siteadmin' => 'закључавање или откључавање базе података',
'action-sendemail' => 'Ñлање е-порука',
+'action-editmywatchlist' => 'измени Ñвој ÑпиÑак надгледања',
# Recent changes
'nchanges' => '$1 {{PLURAL:$1|измена|измене|измена}}',
+'enhancedrc-since-last-visit' => '$1 {{PLURAL:$1|измена од ваше поÑледње поÑете}}',
+'enhancedrc-history' => 'иÑторија',
'recentchanges' => 'Скорашње измене',
'recentchanges-legend' => 'ПоÑтавке Ñкорашњих измена',
'recentchanges-summary' => 'Пратите Ñкорашње измене на овој Ñтраници.',
@@ -1812,7 +1851,6 @@ $1",
'recentchangeslinked-feed' => 'Сродне измене',
'recentchangeslinked-toolbox' => 'Сродне измене',
'recentchangeslinked-title' => 'Сродне измене Ñа „$1“',
-'recentchangeslinked-noresult' => 'Ðема измена на повезаним Ñтраницама у заданом периоду.',
'recentchangeslinked-summary' => "Ова поÑебна Ñтраница приказује ÑпиÑак поÑледњих измена на Ñтраницама које Ñу повезане (или чланови одређене категорије).
Странице Ñ [[Special:Watchlist|вашег ÑпиÑка надгледања]] Ñу '''подебљане'''.",
'recentchangeslinked-page' => 'Ðазив Ñтранице:',
@@ -1824,7 +1862,7 @@ $1",
'reuploaddesc' => 'Ðазад на образац за отпремање',
'upload-tryagain' => 'Пошаљи измењени Ð¾Ð¿Ð¸Ñ Ð´Ð°Ñ‚Ð¾Ñ‚ÐµÐºÐµ',
'uploadnologin' => 'ÐиÑте пријављени',
-'uploadnologintext' => 'Морате бити [[Special:UserLogin|пријављени]] да биÑте отпремали датотеке.',
+'uploadnologintext' => 'Морате бити $1 да биÑте отпремали датотеке.',
'upload_directory_missing' => 'ФаÑцикла за Ñлање ($1) недоÑтаје и Ñервер је не може направити.',
'upload_directory_read_only' => 'Сервер не може да пише по фаÑцикли за Ñлање ($1).',
'uploaderror' => 'Грешка при отпремању',
@@ -2062,7 +2100,6 @@ $1',
'http-read-error' => 'HTTP грешка при читању.',
'http-timed-out' => 'Захтев HTTP је иÑтекао.',
'http-curl-error' => 'Грешка при отварању адреÑе: $1',
-'http-host-unreachable' => 'Ðе могу да приÑтупим адреÑи.',
'http-bad-status' => 'Дошло је до проблема током захтева HTTP: $1 $2',
# Some likely curl errors. More could be added from <http://curl.haxx.se/libcurl/c/libcurl-errors.html>
@@ -2093,6 +2130,9 @@ $1',
'listfiles_size' => 'Величина',
'listfiles_description' => 'ОпиÑ',
'listfiles_count' => 'Верзије',
+'listfiles-latestversion' => 'Тренутна верзија',
+'listfiles-latestversion-yes' => 'Да',
+'listfiles-latestversion-no' => 'Ðе',
# File description page
'file-anchor-link' => 'Датотека',
@@ -2191,6 +2231,10 @@ $1',
'randompage' => 'Случајна Ñтраница',
'randompage-nopages' => 'Ðема Ñтраница у {{PLURAL:$2|Ñледећем именÑком проÑтору|Ñледећим именÑким проÑторима}}: $1.',
+# Random page in category
+'randomincategory' => 'Случајна Ñтраница у категорији',
+'randomincategory-selectcategory-submit' => 'Иди',
+
# Random redirect
'randomredirect' => 'Случајно преуÑмерење',
'randomredirect-nopages' => 'Ðема преуÑмерења у именÑком проÑтору „$1â€.',
@@ -2216,12 +2260,6 @@ $1',
'statistics-users-active-desc' => 'КориÑници који Ñу извршили бар једну радњу {{PLURAL:$1|претходни дан|у поÑледња $1 дана|у поÑледњих $1 дана}}',
'statistics-mostpopular' => 'ÐајпоÑећеније Ñтранице',
-'disambiguations' => 'Странице до вишезначних одредница',
-'disambiguationspage' => 'Template:Вишезначна одредница',
-'disambiguations-text' => "Следеће Ñтранице Ñадрже бар једну везу до '''вишезначне одреднице'''.
-УмеÑто тога, ваљало би да воде до одговарајуће теме.
-Страница Ñе Ñматра вишезначном одредницом ако кориÑти шаблон који води од [[MediaWiki:Disambiguationspage]].",
-
'pageswithprop' => 'Стране Ñ Ð¾Ñобином Ñтране',
'pageswithprop-legend' => 'Стране Ñ Ð¾Ñобином Ñтране',
'pageswithprop-text' => 'Ова Ñтрана излиÑтава Ñтране које имају одређену оÑобину',
@@ -2481,10 +2519,9 @@ $1',
'unwatchthispage' => 'Прекини надгледање',
'notanarticle' => 'Ðије Ñтраница Ñа Ñадржајем',
'notvisiblerev' => 'Измена је обриÑана',
-'watchnochange' => 'Ðишта што надгледате није промењено у приказаном времену.',
'watchlist-details' => '{{PLURAL:$1|$1 Ñтраница|$1 Ñтранице|$1 Ñтраница}} на вашем ÑпиÑку надгледања, не рачунајући Ñтранице за разговор.',
-'wlheader-enotif' => '* Е-обавештење је омогућено.',
-'wlheader-showupdated' => "* Странице које Ñу измењене откад Ñте их поÑледњи пут поÑетили Ñу '''подебљане'''",
+'wlheader-enotif' => 'Обавештење е-поруком је омогућено.',
+'wlheader-showupdated' => "Странице које Ñу измењене откад Ñте их поÑледњи пут поÑетили Ñу '''подебљане'''.",
'watchmethod-recent' => 'проверава Ñе да ли има надгледаних Ñтраница у Ñкорашњим изменама',
'watchmethod-list' => 'проверава Ñе да ли има Ñкорашњих измена у надгледаним Ñтраницама',
'watchlistcontains' => 'Ваш ÑпиÑак надгледања Ñадржи $1 {{PLURAL:$1|Ñтраницу|Ñтранице|Ñтраница}}.',
@@ -2739,7 +2776,7 @@ $1',
'contributions' => '{{GENDER:$1|КориÑнички}} доприноÑи',
'contributions-title' => 'ДоприноÑи {{GENDER:$1|кориÑника|кориÑнице|кориÑника}} $1',
'mycontris' => 'ДоприноÑи',
-'contribsub2' => 'За $1 ($2)',
+'contribsub2' => 'За {{GENDER:$3|$1}} ($2)',
'nocontribs' => 'Измене које одговарају овим уÑловима ниÑу пронађене.',
'uctop' => '(поÑледња)',
'month' => 'од меÑеца (и раније):',
@@ -2897,12 +2934,9 @@ $1',
Она је блокирана као део блокаде $2, која може бити деблокирана.',
'ip_range_invalid' => 'ÐеиÑправан раÑпод ИП адреÑа.',
'ip_range_toolarge' => 'ОпÑежна блокирања већа од /$1 ниÑу дозвољена.',
-'blockme' => 'Блокирај ме',
'proxyblocker' => 'Блокер поÑредника',
-'proxyblocker-disabled' => 'Ова функција је онемогућена.',
'proxyblockreason' => 'Ваша ИП адреÑа је блокирана јер предÑтавља отворени поÑредник.
Обратите Ñе вашем добављачу интернет уÑлуга или техничку подршку и обавеÑтите их о овом озбиљном безбедноÑном проблему.',
-'proxyblocksuccess' => 'Урађено.',
'sorbs' => 'DNSBL',
'sorbsreason' => 'Ваша ИП адреÑа је наведена као отворени поÑредник у DNSBL-у који кориÑти {{SITENAME}}.',
'sorbs_create_account_reason' => 'Ваша ИП адреÑа је наведена као отворени поÑредник у DNSBL-у који кориÑти {{SITENAME}}.
@@ -3226,17 +3260,11 @@ $1',
# Stylesheets
'common.css' => '/** CSS поÑтављен овде ће Ñе одразити на Ñве теме */',
-'standard.css' => '/* CSS поÑтављен овде ће утицати на Ñве кориÑнике теме „Стандардно“ */',
-'nostalgia.css' => '/* CSS поÑтављен овде ће утицати на Ñве кориÑнике теме „ÐоÑталгија“ */',
'cologneblue.css' => '/* CSS поÑтављен овде ће утицати на Ñве кориÑнике теме „КелнÑко плава“ */',
'monobook.css' => '/* CSS поÑтављен овде ће утицати на Ñве кориÑнике теме „Монобук“ */',
-'myskin.css' => '/* CSS поÑтављен овде ће утицати на Ñве кориÑнике теме „Моја тема“ */',
-'chick.css' => '/* CSS поÑтављен овде ће утицати на Ñве кориÑнике теме „Шик“ */',
-'simple.css' => '/* CSS поÑтављен овде ће утицати на Ñве кориÑнике теме „ПроÑто“ */',
'modern.css' => '/* CSS поÑтављен овде ће утицати на Ñве кориÑнике теме „Савремено“ */',
'vector.css' => '/* CSS поÑтављен овде ће утицати на Ñве кориÑнике теме „ВекторÑко“ */',
'print.css' => '/* CSS поÑтављен овде ће утицати на издање за штампу */',
-'handheld.css' => '/* CSS поÑтављен овде ће утицати на ручне уређаје Ñ Ñ‚ÐµÐ¼Ð¾Ð¼ прилагођеном у $wgHandheldStyle */',
'noscript.css' => '/* CSS поÑтављен овде ће утицати на Ñве кориÑнике којима је онемогућен јаваÑкрипт */',
'group-autoconfirmed.css' => '/* CSS поÑтављен овде ће утицати на Ñамопотврђене кориÑнике */',
'group-bot.css' => '/* CSS поÑтављен овде ће утицати Ñамо на ботове */',
@@ -3245,13 +3273,8 @@ $1',
# Scripts
'common.js' => '/* ЈаваÑкрипт поÑтављен овде ће Ñе кориÑтити за Ñве кориÑнике при отварању Ñваке Ñтранице. */',
-'standard.js' => '/* ЈаваÑкрипт поÑтављен овде ће Ñе учитати за Ñве оне који кориÑте тему „Стандардно“ */',
-'nostalgia.js' => '/* ЈаваÑкрипт поÑтављен овде ће Ñе учитати за Ñве оне који кориÑте тему „ÐоÑталгија“ */',
'cologneblue.js' => '/* ЈаваÑкрипт поÑтављен овде ће Ñе учитати за Ñве оне који кориÑте тему „КелнÑко плава“ */',
'monobook.js' => '/* ЈаваÑкрипт поÑтављен овде ће Ñе учитати за Ñве оне који кориÑте тему „Монобук“ */',
-'myskin.js' => '/* ЈаваÑкрипт поÑтављен овде ће Ñе учитати за Ñве оне који кориÑте „Моју тему“ */',
-'chick.js' => '/* ЈаваÑкрипт поÑтављен овде ће Ñе учитати за Ñве оне који кориÑте тему „Шик“ */',
-'simple.js' => '/* ЈаваÑкрипт поÑтављен овде ће Ñе учитати за Ñве оне који кориÑте тему „ПроÑто“ */',
'modern.js' => '/* ЈаваÑкрипт поÑтављен овде ће Ñе учитати за Ñве оне који кориÑте тему „Савремено“ */',
'vector.js' => '/* ЈаваÑкрипт поÑтављен овде ће Ñе учитати за Ñве оне који кориÑте тему „ВекторÑко“ */',
'group-autoconfirmed.js' => '/* ЈаваÑкрипт поÑтављен овде ће Ñе учитати за Ñамопотврђене кориÑнике */',
@@ -3331,13 +3354,8 @@ $1',
'pageinfo-category-files' => 'Број датотека',
# Skin names
-'skinname-standard' => 'КлаÑично',
-'skinname-nostalgia' => 'ÐоÑталгија',
'skinname-cologneblue' => 'КелнÑко плава',
'skinname-monobook' => 'Монобук',
-'skinname-myskin' => 'Моја тема',
-'skinname-chick' => 'Шик',
-'skinname-simple' => 'ПроÑто',
'skinname-modern' => 'Савремено',
'skinname-vector' => 'ВекторÑко',
@@ -3422,11 +3440,25 @@ $1',
'minutes' => '{{PLURAL:$1|$1 минут|$1 минута|$1 минута}}',
'hours' => '{{PLURAL:$1|$1 Ñат|$1 Ñата|$1 Ñати}}',
'days' => '{{PLURAL:$1|$1 дан|$1 дана|$1 дана}}',
+'weeks' => '{{PLURAL:$1|$1 Ñедмица}}',
'months' => '{{PLURAL:$1|$1 меÑец|$1 меÑеци}}',
'years' => '{{PLURAL:$1|$1 година|$1 године}}',
'ago' => 'пре $1',
'just-now' => 'управо Ñад',
+# Human-readable timestamps
+'hours-ago' => 'Пре $1 {{PLURAL:$1|Ñат|Ñати}}',
+'minutes-ago' => 'Пре $1 {{PLURAL:$1|минут|минута}}',
+'seconds-ago' => 'Пре $1 {{PLURAL:$1|Ñекунда|Ñекунди}}',
+'monday-at' => 'Понедељак у $1',
+'tuesday-at' => 'Уторак у $1',
+'wednesday-at' => 'Среда у $1',
+'thursday-at' => 'Четвртак у $1',
+'friday-at' => 'Петак у $1',
+'saturday-at' => 'Субота у $1',
+'sunday-at' => 'Ðедеља у $1',
+'yesterday-at' => 'Јуче у $1',
+
# Bad image list
'bad_image_list' => 'Формат је Ñледећи:
@@ -3510,7 +3542,7 @@ Variants for Chinese language
'metadata-langitem' => "'''$2:''' $1",
'metadata-langitem-default' => '$1',
-# EXIF tags
+# Exif tags
'exif-imagewidth' => 'Ширина',
'exif-imagelength' => 'ВиÑина',
'exif-bitspersample' => 'Дубина боје',
@@ -3703,7 +3735,7 @@ $4, $5, $6 $7
$8',
'exif-subjectnewscode-value' => '$2 ($1)',
-# EXIF attributes
+# Exif attributes
'exif-compression-1' => 'ÐеÑажето',
'exif-compression-2' => 'CCITT Group 3 1 – Димензионално измењено Хафманово кодирање по дужини',
'exif-compression-3' => 'CCITT Group 3 Ñ„Ð°ÐºÑ ÐºÐ¾Ð´Ð¸Ñ€Ð°ÑšÐµ',
@@ -4043,7 +4075,6 @@ $5
'semicolon-separator' => ';&#32;',
'comma-separator' => ',&#32;',
'colon-separator' => ':&#32;',
-'autocomment-prefix' => '-&#32;',
'pipe-separator' => '&#32;•&#32;',
'word-separator' => '&#32;',
'ellipsis' => '…',
@@ -4197,7 +4228,6 @@ $5
'version-other' => 'Друго',
'version-mediahandlers' => 'Руководиоци медијима',
'version-hooks' => 'Куке',
-'version-extension-functions' => 'Функције',
'version-parser-extensiontags' => 'Ознаке',
'version-parser-function-hooks' => 'Куке',
'version-hook-name' => 'Ðазив куке',
@@ -4207,6 +4237,7 @@ $5
'version-license' => 'Лиценца',
'version-poweredby-credits' => "Овај вики покреће '''[//www.mediawiki.org/ Медијавики]''', ауторÑка права © 2001-$1 $2.",
'version-poweredby-others' => 'оÑтали',
+'version-poweredby-translators' => 'translatewiki.net преводиоци',
'version-credits-summary' => 'Желели биÑмо да захвалимо Ñледећим људима на њиховом доприноÑу [[Special:Version|Медијавикији]].',
'version-license-info' => 'Медијавики је Ñлободан Ñофтвер можете га редиÑтрибуирати и/или модификовати под уÑловима ГÐУ-ове опште јавне лиценце верзија 2 или Ñваке Ñледеће коју објави Задужбина за Ñлободан Ñофтвер.
@@ -4220,12 +4251,12 @@ $5
'version-entrypoints-header-entrypoint' => 'Улазна тачка',
'version-entrypoints-header-url' => 'ÐдреÑа',
-# Special:FilePath
-'filepath' => 'Путања датотеке',
-'filepath-page' => 'Датотека:',
-'filepath-submit' => 'Иди',
-'filepath-summary' => 'Ова поÑебна Ñтраница приказује потпуну путању датотеке.
-Слике Ñу приказане у пуној величини, а друге врÑте датотека Ñе покрећу помоћу њима придруженим програмима.',
+# Special:Redirect
+'redirect-legend' => 'ПреуÑмери на датотеку или Ñтраницу',
+'redirect-submit' => 'Иди',
+'redirect-value' => 'ВредноÑÑ‚:',
+'redirect-file' => 'Ðазив датотеке',
+'redirect-not-exists' => 'ВредноÑÑ‚ није пронађена',
# Special:FileDuplicateSearch
'fileduplicatesearch' => 'Претрага дупликата',
@@ -4275,6 +4306,7 @@ $5
'tags' => 'Важеће ознаке измена',
'tag-filter' => 'Филтер за [[Special:Tags|ознаке]]:',
'tag-filter-submit' => 'Филтрирај',
+'tag-list-wrapper' => '([[Special:Tags|{{PLURAL:$1|Ознака|Ознаке}}]]: $2)',
'tags-title' => 'Ознаке',
'tags-intro' => 'Ðа овој Ñтраници је наведен ÑпиÑак ознака Ñ ÐºÐ¾Ñ˜Ð¸Ð¼Ð° програм може да означи измене и његово значење.',
'tags-tag' => 'Ðазив ознаке',
@@ -4316,6 +4348,9 @@ $5
'htmlform-submit' => 'Пошаљи',
'htmlform-reset' => 'Врати измене',
'htmlform-selectorother-other' => 'Друго',
+'htmlform-no' => 'Ðе',
+'htmlform-yes' => 'Да',
+'htmlform-chosen-placeholder' => 'Изаберите опцију',
# SQLite database support
'sqlite-has-fts' => '$1 Ñ Ð¿Ð¾Ð´Ñ€ÑˆÐºÐ¾Ð¼ претраге целог текÑта',
@@ -4433,4 +4468,9 @@ $5
# Image rotation
'rotate-comment' => 'Слика је ротирана у Ñмеру казаљке на Ñату за {{PLURAL:$1|Ñтепени}}',
+# Limit report
+'limitreport-walltime-value' => '$1 {{PLURAL:$1|Ñекунда|Ñекунди}}',
+'limitreport-postexpandincludesize-value' => '$1/$2 бајтова',
+'limitreport-templateargumentsize-value' => '$1/$2 бајтова',
+
);
diff --git a/languages/messages/MessagesSr_el.php b/languages/messages/MessagesSr_el.php
index 4d423832..55ce97bd 100644
--- a/languages/messages/MessagesSr_el.php
+++ b/languages/messages/MessagesSr_el.php
@@ -18,6 +18,7 @@
* @author Red Baron
* @author Reedy
* @author Slaven Kosanovic
+ * @author TheStefan12345
* @author Жељко Тодоровић
* @author Михајло Ðнђелковић
* @author לערי ריינה×רט
@@ -334,9 +335,6 @@ $messages = array(
'tog-shownumberswatching' => 'Prikaži broj korisnika koji nadgledaju',
'tog-oldsig' => 'Tekući potpis:',
'tog-fancysig' => 'Smatraj potpis kao vikitekst (bez samopovezivanja)',
-'tog-externaleditor' => 'Uvek koristi spoljni ureÄ‘ivaÄ (samo za napredne — potrebne su posebne postavke na raÄunaru)',
-'tog-externaldiff' => 'Uvek koristi spoljni program za uporeÄ‘ivanje (samo za napredne — potrebne su posebne postavke na raÄunaru)',
-'tog-showjumplinks' => 'Omogući pomoćne veze „Idi na“',
'tog-uselivepreview' => 'Koristi trenutan pregled (eksperimentalno)',
'tog-forceeditsummary' => 'Upozori me kada ne unesem opis izmene',
'tog-watchlisthideown' => 'Sakrij moje izmene sa spiska nadgledanja',
@@ -350,6 +348,7 @@ $messages = array(
'tog-showhiddencats' => 'Prikaži skrivene kategorije',
'tog-noconvertlink' => 'Onemogući pretvaranje naslova veza',
'tog-norollbackdiff' => 'Izostavi razliku nakon izvršenog vraćanja',
+'tog-useeditwarning' => 'Upozori me kada napuÅ¡tam stranicu sa nesaÄuvanim promenama',
'underline-always' => 'uvek podvlaÄi',
'underline-never' => 'nikad ne podvlaÄi',
@@ -413,6 +412,18 @@ $messages = array(
'oct' => 'okt',
'nov' => 'nov',
'dec' => 'dec',
+'january-date' => '$1. januar',
+'february-date' => '$1. februar',
+'march-date' => '$1. mart',
+'april-date' => '$1. april',
+'may-date' => '$1. maj',
+'june-date' => '$1. jun',
+'july-date' => '$1. jul',
+'august-date' => '$1. august',
+'september-date' => '$1. septembar',
+'october-date' => '$1. oktobar',
+'november-date' => '$1. novembar',
+'december-date' => '$1. decembar',
# Categories related messages
'pagecategories' => '{{PLURAL:$1|Kategorija|Kategorije}}',
@@ -433,7 +444,7 @@ $messages = array(
'noindex-category' => 'Nepopisane stranice',
'broken-file-category' => 'Stranice s neispravnim vezama do datoteka',
-'linkprefix' => '/^(.*?)([a-zA-Z\\x80-\\xff]+)$/sD',
+'linkprefix' => '/^((?>.*(?<![a-zA-Z\\x80-\\xff])))(.+)$/sD',
'about' => 'O nama',
'article' => 'Stranica sa sadržajem',
@@ -538,7 +549,7 @@ $1',
'pool-queuefull' => 'Red je pun zahteva',
'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).
+# 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).
'aboutsite' => 'O projektu {{SITENAME}}',
'aboutpage' => 'Project:O nama',
'copyright' => 'Sadržaj je dostupan pod licencom $1.',
@@ -548,7 +559,6 @@ $1',
'disclaimers' => 'Odricanje odgovornosti',
'disclaimerpage' => 'Project:Odricanje odgovornosti',
'edithelp' => 'Pomoć pri uređivanju',
-'edithelppage' => 'Help:Uređivanje',
'helppage' => 'Help:Sadržaj',
'mainpage' => 'Glavna strana',
'mainpage-description' => 'Glavna strana',
@@ -580,7 +590,6 @@ Pogledajte stranicu za [[Special:Version|izdanje]].',
'newmessagesdifflinkplural' => '{{PLURAL:$1|poslednju izmenu|poslednje izmene}}',
'youhavenewmessagesmulti' => 'Imate novih poruka na $1',
'editsection' => 'uredi',
-'editsection-brackets' => '[$1]',
'editold' => 'uredi',
'viewsourceold' => 'izvornik',
'editlink' => 'uredi',
@@ -632,17 +641,6 @@ Spisak svih posebnih stranica nalazi se [[Special:SpecialPages|ovde]].',
# General errors
'error' => 'Greška',
'databaseerror' => 'Greška u bazi podataka',
-'dberrortext' => 'DoÅ¡lo je do sintaktiÄke greÅ¡ke u bazi.
-Možda se radi o grešci u softveru.
-Poslednji pokušaj upita je glasio:
-<blockquote><code>$1</code></blockquote>
-unutar funkcije „<code>$2</code>“.
-Baza podataka je prijavila grešku „<samp>$3: $4</samp>“.',
-'dberrortextcl' => 'DoÅ¡lo je do sintaktiÄke greÅ¡ke u bazi.
-Poslednji pokušaj upita je glasio:
-„$1“
-unutar funkcije „$2“.
-Baza podataka je prijavila grešku „$3: $4“',
'laggedslavemode' => "'''Upozorenje:''' stranica je možda zastarela.",
'readonly' => 'Baza podataka je zakljuÄana',
'enterlockreason' => 'Unesite razlog za zakljuÄavanje, ukljuÄujući i vreme otkljuÄavanja',
@@ -698,7 +696,6 @@ Da biste dodali ili izmenili prevode svih vikija, posetite [//translatewiki.net/
'editinginterface' => "'''Upozorenje:''' ureÄ‘ujete stranicu koja se koristi za prikazivanje teksta korisniÄkog okruženja.
Izmene na ovoj stranici će uticati na sve korisnike ovog vikija.
Da biste dodali ili izmenili prevode svih vikija, posetite [//translatewiki.net/wiki/Main_Page?setlang=sr_ec Translejtviki], projekat za lokalizaciju Medijavikija.",
-'sqlhidden' => '(SQL upit je sakriven)',
'cascadeprotected' => 'Ova stranica je zakljuÄana jer sadrži {{PLURAL:$1|sledeću stranicu koja je zaÅ¡tićena|sledeće stranice koje su zaÅ¡tićene}} „prenosivom“ zaÅ¡titom:
$2',
'namespaceprotected' => "Nemate dozvolu da uređujete stranice u imenskom prostoru '''$1'''.",
@@ -726,10 +723,18 @@ Administrator koji ju je zakljuÄao ponudio je sledeće objaÅ¡njenje: „$3“.'
Imajte na umu da neke stranice mogu nastaviti da se prikazuju kao da ste joÅ¡ prijavljeni, sve dok ne oÄistite privremenu memoriju svog pregledaÄa.",
'welcomeuser' => 'Dobrodošli, $1!',
'yourname' => 'KorisniÄko ime:',
+'userlogin-yourname' => 'KorisniÄko ime',
+'userlogin-yourname-ph' => 'Unesite vaÅ¡e korisniÄko ime',
'yourpassword' => 'Lozinka:',
+'userlogin-yourpassword' => 'Lozinka',
+'userlogin-yourpassword-ph' => 'Unesite vašu lozinku',
+'createacct-yourpassword-ph' => 'Unesite novu lozinku',
'yourpasswordagain' => 'Potvrda lozinke:',
+'createacct-yourpasswordagain' => 'Potvrdite lozinku',
+'createacct-yourpasswordagain-ph' => 'Unesite lozinku još jednom',
'remembermypassword' => 'Zapamti me na ovom pregledaÄu (najduže $1 {{PLURAL:$1|dan|dana|dana}})',
-'securelogin-stick-https' => 'Ostanite povezani sa HTTPS nakon prijave',
+'userlogin-remembermypassword' => 'Ostavi me prijavljenog/u',
+'userlogin-signwithsecure' => 'Koristite sigurnu konekciju',
'yourdomainname' => 'Domen:',
'password-change-forbidden' => 'Ne možete da promenite lozinku na ovom vikiju.',
'externaldberror' => 'Došlo je do greške pri prepoznavanju baze podataka ili nemate ovlašćenja da ažurirate svoj spoljni nalog.',
@@ -741,17 +746,35 @@ Imajte na umu da neke stranice mogu nastaviti da se prikazuju kao da ste još pr
'logout' => 'Odjava',
'userlogout' => 'Odjavi me',
'notloggedin' => 'Niste prijavljeni',
+'userlogin-noaccount' => 'Nemate nalog?',
+'userlogin-joinproject' => 'Otvorite ga',
'nologin' => 'Nemate nalog? Idite na stranicu $1.',
'nologinlink' => 'Otvaranje naloga',
'createaccount' => 'Otvori nalog',
'gotaccount' => 'Već imate nalog? Idite na stranicu „$1“.',
'gotaccountlink' => 'Prijava',
'userlogin-resetlink' => 'Zaboravili ste podatke za prijavu?',
+'userlogin-resetpassword-link' => 'Resetuj lozinku',
+'helplogin-url' => 'Help:Logging in',
+'userlogin-helplink' => '[[{{MediaWiki:helplogin-url}}|Pomoć pri prijavljivanju]]',
+'createacct-join' => 'Unesite svoje podatke ispod.',
+'createacct-emailrequired' => 'Adresa e-pošte',
+'createacct-emailoptional' => 'Adresa e-pošte (opciono)',
+'createacct-email-ph' => 'Unesite vašu adresu e-pоšte',
'createaccountmail' => 'Koristite privremenu, sluÄajno stvorenu lozinku i poÅ¡aljite na navedenu adresu elektronske poÅ¡te',
+'createacct-realname' => 'Pravo ime (opciono)',
'createaccountreason' => 'Razlog:',
+'createacct-reason' => 'Razlog',
+'createacct-reason-ph' => 'Zašto pravite još jedan nalog?',
+'createacct-captcha' => 'Sigurnosna provera',
+'createacct-imgcaptcha-ph' => 'Unesite tekst koji vidite iznad',
+'createacct-submit' => 'Otvori nalog',
+'createacct-benefit-heading' => '{{SITENAME}} je napravljen od strane ljudi kao Å¡to ste vi.',
+'createacct-benefit-body3' => 'skorašnjih {{PLURAL:$1|doprinosa}}',
'badretype' => 'Unete lozinke se ne poklapaju.',
'userexists' => 'KorisniÄko ime je zauzeto. Izaberite drugo.',
'loginerror' => 'Greška pri prijavljivanju',
+'createacct-error' => 'Došlo je do greške pri kreiranju naloga',
'createaccounterror' => 'Ne mogu da otvorim nalog: $1',
'nocookiesnew' => 'KorisniÄki nalog je otvoren, ali niste prijavljeni.
Ovaj viki koristi kolaÄiće za prijavu. Vama su kolaÄići onemogućeni.
@@ -813,8 +836,8 @@ Prijavite se i promenite svoju lozinku.
Ako je ovo greška, zanemarite ovu poruku.',
'usernamehasherror' => 'KorisniÄko ime ne može sadržati tarabe',
-'login-throttled' => 'Previše puta ste pokušali da se prijavite.
-SaÄekajte nekoliko minuta i pokuÅ¡ajte ponovo.',
+'login-throttled' => 'Previše puta ste pokušali da se prijavite.
+Molimo vas da saÄekate $1 pre nego Å¡to pokuÅ¡ate ponovo.',
'login-abort-generic' => 'Neuspešna prijava – prekinuto',
'loginlanguagelabel' => 'Jezik: $1',
'suspicious-userlogout' => 'VaÅ¡ zahtev za odjavu je odbijen jer je poslat od strane neispravnog pregledaÄa ili posrednika.',
@@ -833,8 +856,7 @@ Da biste završili prijavu, podesite novu lozinku ovde:',
'newpassword' => 'Nova lozinka:',
'retypenew' => 'Potvrda lozinke:',
'resetpass_submit' => 'Postavi lozinku i prijavi me',
-'resetpass_success' => 'Vaša lozinka je promenjena.
-Prijavljivanje je u toku…',
+'changepassword-success' => 'Vaša lozinka je uspešno promenjena.',
'resetpass_forbidden' => 'Lozinka ne može biti promenjena',
'resetpass-no-info' => 'Morate biti prijavljeni da biste pristupili ovoj stranici.',
'resetpass-submit-loggedin' => 'Promeni lozinku',
@@ -845,10 +867,9 @@ Možda ste već promenili lozinku ili ste zatražili novu privremenu lozinku.',
# Special:PasswordReset
'passwordreset' => 'Obnavljanje lozinke',
-'passwordreset-text' => 'Popunite ovaj obrazac da biste primili e-poruku sa svojim podacima za prijavu.',
+'passwordreset-text-one' => 'Popunite ovaj obrazac da biste resetovali lozinku.',
'passwordreset-legend' => 'Poništi lozinku',
'passwordreset-disabled' => 'Obnavljanje lozinke je onemogućeno na ovom vikiju.',
-'passwordreset-pretext' => '{{PLURAL:$1||Unesite jedan od delova podataka ispod}}',
'passwordreset-username' => 'KorisniÄko ime:',
'passwordreset-domain' => 'Domen:',
'passwordreset-capture' => 'Pogledati krajnju poruku?',
@@ -873,7 +894,7 @@ Prijavite se i izaberite novu lozinku. Ako je neko drugi zahtevao ovu radnju ili
Privremena lozinka: $2',
'passwordreset-emailsent' => 'Podsetnik o lozinci je poslat na vašu adresu.',
'passwordreset-emailsent-capture' => 'Poslat je podsetnik preko e-pošte (prikazan dole).',
-'passwordreset-emailerror-capture' => 'Napravljen je podsetnik za slanje preko e-pošte (prikazan dole), ali ga ne mogu poslati korisniku: $1',
+'passwordreset-emailerror-capture' => 'E-poruka za resetovanje lozinke, prikazana ispod je poslata, ali slanje {{GENDER:$2|korisniku|korisnici}} nije uspelo: $1',
# Special:ChangeEmail
'changeemail' => 'Promena e-adrese',
@@ -1090,12 +1111,15 @@ Nije dato nikakvo obrazloženje.',
Izgleda da je obrisana.',
'edit-conflict' => 'Sukob izmena.',
'edit-no-change' => 'Vaša izmena je zanemarena jer nije bilo nikakvih izmena u tekstu.',
+'postedit-confirmation' => 'VaÅ¡a izmena je saÄuvana.',
'edit-already-exists' => 'Ne mogu da napravim stranicu.
Izgleda da ona već postoji.',
'defaultmessagetext' => 'Podrazumevani tekst poruke',
'content-failed-to-parse' => 'Ne mogu da raÅ¡Älanim sadržaj tipa $2 za model $1: $3',
'invalid-content-data' => 'Neispravni podaci sadržaja',
'content-not-allowed-here' => 'Sadržaj modela „$1“ nije dozvoljen na stranici [[$2]]',
+'editwarning-warning' => 'Ako napustite ovu stranicu, izgubićete sve izmene koje ste napravili.
+Ako ste prijavljeni, možete onemogućiti ovo upozorenje u svojim podešavanjima, u odeljku „Uređivanje“.',
# Content models
'content-model-wikitext' => 'vikitekst',
@@ -1339,7 +1363,6 @@ Više informacija možete pronaći u [{{fullurl:{{#Special:Log}}/delete|page={{F
'searchmenu-legend' => 'Postavke pretrage',
'searchmenu-exists' => "'''Postoji i Älanak pod nazivom „[[:$1]]“.'''",
'searchmenu-new' => "'''Napravite stranicu „[[:$1]]“.'''",
-'searchhelp-url' => 'Help:Sadržaj',
'searchmenu-prefix' => '[[Special:PrefixIndex/$1|Pregledaj stranice s ovim prefiksom]]',
'searchprofile-articles' => 'ÄŒlanci',
'searchprofile-project' => 'Stranice pomoći i projekata',
@@ -1384,15 +1407,6 @@ Ako želite sve da pretražite, dodajte prefiks '''all:''' ispred traženog sadr
U međuvremenu možete tražiti preko Gugla.
Upamtite da njegovi popisi ovog vikija mogu biti zastareli.',
-# Quickbar
-'qbsettings' => 'BoÄna paleta',
-'qbsettings-none' => 'Ništa',
-'qbsettings-fixedleft' => 'PriÄvršćena levo',
-'qbsettings-fixedright' => 'PriÄvršćena desno',
-'qbsettings-floatingleft' => 'Plutajuća levo',
-'qbsettings-floatingright' => 'Plutajuća desno',
-'qbsettings-directionality' => 'Fiksno, u zavisnosti od smera pisanja vašeg jezika',
-
# Preferences page
'preferences' => 'Podešavanja',
'mypreferences' => 'Podešavanja',
@@ -1425,7 +1439,6 @@ Upamtite da njegovi popisi ovog vikija mogu biti zastareli.',
'resetprefs' => 'OÄisti nesaÄuvane izmene',
'restoreprefs' => 'Vrati sve na podrazumevano (u svim odeljcima)',
'prefs-editing' => 'Uređivanje',
-'prefs-edit-boxsize' => 'VeliÄina okvira za ureÄ‘ivanje.',
'rows' => 'Redova:',
'columns' => 'Kolone:',
'searchresultshead' => 'Pretraga',
@@ -1436,9 +1449,6 @@ Upamtite da njegovi popisi ovog vikija mogu biti zastareli.',
'recentchangesdays-max' => '(najviše $1 {{PLURAL:$1|dan|dana|dana}})',
'recentchangescount' => 'Broj izmena za prikaz:',
'prefs-help-recentchangescount' => 'Podrazumeva skorašnje izmene, istorije stranica i dnevnike.',
-'prefs-help-watchlist-token' => 'Popunjavanjem ovog polja s tajnom šifrom napraviće RSS dovod vašeg spiska nadgledanja.
-Svako ko zna tu šifru biće u mogućnosti da vidi vaša nadgledanja, zato izaberite bezbednu.
-Na primer: $1',
'savedprefs' => 'VaÅ¡a podeÅ¡avanja su saÄuvana.',
'timezonelegend' => 'Vremenska zona:',
'localtime' => 'Lokalno vreme:',
@@ -1469,7 +1479,6 @@ Na primer: $1',
'prefs-reset-intro' => 'Možete koristiti ovu stranicu da poništite svoje postavke na podrazumevane vrednosti.
Ova radnja se ne može vratiti.',
'prefs-emailconfirm-label' => 'Potvrda e-adrese:',
-'prefs-textboxsize' => 'VeliÄina okvira za ureÄ‘ivanje',
'youremail' => 'E-adresa:',
'username' => '{{GENDER:$1|KorisniÄko ime}}:',
'uid' => '{{GENDER:$1|KorisniÄki}} ID:',
@@ -1605,7 +1614,7 @@ Ako izaberete da ga unesete, ono će biti korišćeno za pripisivanje vašeg rad
'right-proxyunbannable' => 'zaobilaženje samoblokiranja posrednika',
'right-unblockself' => 'Odblokiraj samog sebe',
'right-protect' => 'Promeni nivoe zaštite i uredi kaskadno zaštićene stranice',
-'right-editprotected' => 'uređivanje zaštićenih stranica (s prenosivom zaštitom)',
+'right-editprotected' => 'Uredi stranice pod zaštitom „{{int:protect-level-sysop}}“',
'right-editinterface' => 'ureÄ‘ivanje korisniÄkog suÄelja',
'right-editusercssjs' => 'uređivanje tuđih CSS i javaskript datoteka',
'right-editusercss' => 'uređivanje tuđih CSS datoteka',
@@ -1715,7 +1724,6 @@ Ako izaberete da ga unesete, ono će biti korišćeno za pripisivanje vašeg rad
'recentchangeslinked-feed' => 'Srodne izmene',
'recentchangeslinked-toolbox' => 'Srodne izmene',
'recentchangeslinked-title' => 'Srodne izmene sa „$1“',
-'recentchangeslinked-noresult' => 'Nema izmena na povezanim stranicama u zadanom periodu.',
'recentchangeslinked-summary' => "Ova posebna stranica prikazuje spisak poslednjih izmena na stranicama koje su povezane (ili Älanovi odreÄ‘ene kategorije).
Stranice s [[Special:Watchlist|vašeg spiska nadgledanja]] su '''podebljane'''.",
'recentchangeslinked-page' => 'Naziv stranice:',
@@ -1727,7 +1735,7 @@ Stranice s [[Special:Watchlist|vašeg spiska nadgledanja]] su '''podebljane'''."
'reuploaddesc' => 'Nazad na obrazac za otpremanje',
'upload-tryagain' => 'Pošalji izmenjeni opis datoteke',
'uploadnologin' => 'Niste prijavljeni',
-'uploadnologintext' => 'Morate biti [[Special:UserLogin|prijavljeni]] da biste otpremali datoteke.',
+'uploadnologintext' => 'Morate biti $1 da biste otpremali datoteke.',
'upload_directory_missing' => 'Fascikla za slanje ($1) nedostaje i server je ne može napraviti.',
'upload_directory_read_only' => 'Server ne može da piše po fascikli za slanje ($1).',
'uploaderror' => 'Greška pri otpremanju',
@@ -1965,7 +1973,6 @@ Radi sigurnosti, img_auth.php je onemogućen.',
'http-read-error' => 'HTTP greÅ¡ka pri Äitanju.',
'http-timed-out' => 'Zahtev HTTP je istekao.',
'http-curl-error' => 'Greška pri otvaranju adrese: $1',
-'http-host-unreachable' => 'Ne mogu da pristupim adresi.',
'http-bad-status' => 'Došlo je do problema tokom zahteva HTTP: $1 $2',
# Some likely curl errors. More could be added from <http://curl.haxx.se/libcurl/c/libcurl-errors.html>
@@ -2119,12 +2126,6 @@ Pre brisanja proverite da li druge stranice vode do tih Å¡ablona.',
'statistics-users-active-desc' => 'Korisnici koji su izvršili bar jednu radnju {{PLURAL:$1|prethodni dan|u poslednja $1 dana|u poslednjih $1 dana}}',
'statistics-mostpopular' => 'Najposećenije stranice',
-'disambiguations' => 'Stranice do viÅ¡eznaÄnih odrednica',
-'disambiguationspage' => 'Template:ViÅ¡eznaÄna odrednica',
-'disambiguations-text' => "Sledeće stranice sadrže bar jednu vezu do '''viÅ¡eznaÄne odrednice'''.
-Umesto toga, valjalo bi da vode do odgovarajuće teme.
-Stranica se smatra viÅ¡eznaÄnom odrednicom ako koristi Å¡ablon koji vodi od [[MediaWiki:Disambiguationspage]].",
-
'pageswithprop-prop' => 'Ime osobine:',
'pageswithprop-submit' => 'Idi',
@@ -2381,10 +2382,9 @@ Buduće izmene ove stranice i njene stranice za razgovor biće navedene tamo.',
'unwatchthispage' => 'Prekini nadgledanje',
'notanarticle' => 'Nije stranica sa sadržajem',
'notvisiblerev' => 'Izmena je obrisana',
-'watchnochange' => 'Ništa što nadgledate nije promenjeno u prikazanom vremenu.',
'watchlist-details' => '{{PLURAL:$1|$1 stranica|$1 stranice|$1 stranica}} na vaÅ¡em spisku nadgledanja, ne raÄunajući stranice za razgovor.',
-'wlheader-enotif' => '* E-obaveštenje je omogućeno.',
-'wlheader-showupdated' => "* Stranice koje su izmenjene otkad ste ih poslednji put posetili su '''podebljane'''",
+'wlheader-enotif' => 'Obaveštenje e-porukom je omogućeno.',
+'wlheader-showupdated' => "Stranice koje su izmenjene otkad ste ih poslednji put posetili su '''podebljane'''.",
'watchmethod-recent' => 'proverava se da li ima nadgledanih stranica u skorašnjim izmenama',
'watchmethod-list' => 'proverava se da li ima skorašnjih izmena u nadgledanim stranicama',
'watchlistcontains' => 'Vaš spisak nadgledanja sadrži $1 {{PLURAL:$1|stranicu|stranice|stranica}}.',
@@ -2629,7 +2629,7 @@ $1',
'contributions' => '{{GENDER:$1|KorisniÄki}} doprinosi',
'contributions-title' => 'Doprinosi {{GENDER:$1|korisnika|korisnice|korisnika}} $1',
'mycontris' => 'Doprinosi',
-'contribsub2' => 'Za $1 ($2)',
+'contribsub2' => 'Za {{GENDER:$3|$1}} ($2)',
'nocontribs' => 'Izmene koje odgovaraju ovim uslovima nisu pronađene.',
'uctop' => '(poslednja)',
'month' => 'od meseca (i ranije):',
@@ -2787,12 +2787,9 @@ Tekuće zabrane i blokiranja možete naći [[Special:BlockList|ovde]].',
Ona je blokirana kao deo blokade $2, koja može biti deblokirana.',
'ip_range_invalid' => 'Neispravan raspod IP adresa.',
'ip_range_toolarge' => 'Opsežna blokiranja veća od /$1 nisu dozvoljena.',
-'blockme' => 'Blokiraj me',
'proxyblocker' => 'Bloker posrednika',
-'proxyblocker-disabled' => 'Ova funkcija je onemogućena.',
'proxyblockreason' => 'Vaša IP adresa je blokirana jer predstavlja otvoreni posrednik.
Obratite se vaÅ¡em dobavljaÄu internet usluga ili tehniÄku podrÅ¡ku i obavestite ih o ovom ozbiljnom bezbednosnom problemu.',
-'proxyblocksuccess' => 'Urađeno.',
'sorbs' => 'DNSBL',
'sorbsreason' => 'Vaša IP adresa je navedena kao otvoreni posrednik u DNSBL-u koji koristi {{SITENAME}}.',
'sorbs_create_account_reason' => 'Vaša IP adresa je navedena kao otvoreni posrednik u DNSBL-u koji koristi {{SITENAME}}.
@@ -3115,17 +3112,11 @@ Pokušajte ponovo.',
# Stylesheets
'common.css' => '/** CSS postavljen ovde će se odraziti na sve teme */',
-'standard.css' => '/* CSS postavljen ovde će uticati na sve korisnike teme „Standardno“ */',
-'nostalgia.css' => '/* CSS postavljen ovde će uticati na sve korisnike teme „Nostalgija“ */',
'cologneblue.css' => '/* CSS postavljen ovde će uticati na sve korisnike teme „Kelnsko plava“ */',
'monobook.css' => '/* CSS postavljen ovde će uticati na sve korisnike teme „Monobuk“ */',
-'myskin.css' => '/* CSS postavljen ovde će uticati na sve korisnike teme „Moja tema“ */',
-'chick.css' => '/* CSS postavljen ovde će uticati na sve korisnike teme „Šik“ */',
-'simple.css' => '/* CSS postavljen ovde će uticati na sve korisnike teme „Prosto“ */',
'modern.css' => '/* CSS postavljen ovde će uticati na sve korisnike teme „Savremeno“ */',
'vector.css' => '/* CSS postavljen ovde će uticati na sve korisnike teme „Vektorsko“ */',
'print.css' => '/* CSS postavljen ovde će uticati na izdanje za štampu */',
-'handheld.css' => '/* CSS postavljen ovde će uticati na ruÄne ureÄ‘aje s temom prilagoÄ‘enom u $wgHandheldStyle */',
'noscript.css' => '/* CSS postavljen ovde će uticati na sve korisnike kojima je onemogućen javaskript */',
'group-autoconfirmed.css' => '/* CSS postavljen ovde će uticati na samopotvrđene korisnike */',
'group-bot.css' => '/* CSS postavljen ovde će uticati samo na botove */',
@@ -3134,13 +3125,8 @@ Pokušajte ponovo.',
# Scripts
'common.js' => '/* Javaskript postavljen ovde će se koristiti za sve korisnike pri otvaranju svake stranice. */',
-'standard.js' => '/* Javaskript postavljen ovde će se uÄitati za sve one koji koriste temu „Standardno“ */',
-'nostalgia.js' => '/* Javaskript postavljen ovde će se uÄitati za sve one koji koriste temu „Nostalgija“ */',
'cologneblue.js' => '/* Javaskript postavljen ovde će se uÄitati za sve one koji koriste temu „Kelnsko plava“ */',
'monobook.js' => '/* Javaskript postavljen ovde će se uÄitati za sve one koji koriste temu „Monobuk“ */',
-'myskin.js' => '/* Javaskript postavljen ovde će se uÄitati za sve one koji koriste „Moju temu“ */',
-'chick.js' => '/* Javaskript postavljen ovde će se uÄitati za sve one koji koriste temu „Šik“ */',
-'simple.js' => '/* Javaskript postavljen ovde će se uÄitati za sve one koji koriste temu „Prosto“ */',
'modern.js' => '/* Javaskript postavljen ovde će se uÄitati za sve one koji koriste temu „Savremeno“ */',
'vector.js' => '/* Javaskript postavljen ovde će se uÄitati za sve one koji koriste temu „Vektorsko“ */',
'group-autoconfirmed.js' => '/* Javaskript postavljen ovde će se uÄitati za samopotvrÄ‘ene korisnike */',
@@ -3219,13 +3205,8 @@ Ovo je verovatno izazvano vezom do spoljašnjeg sajta koji se nalazi na crnoj li
'pageinfo-category-files' => 'Broj datoteka',
# Skin names
-'skinname-standard' => 'KlasiÄno',
-'skinname-nostalgia' => 'Nostalgija',
'skinname-cologneblue' => 'Kelnsko plava',
'skinname-monobook' => 'Monobuk',
-'skinname-myskin' => 'Moja tema',
-'skinname-chick' => 'Å ik',
-'skinname-simple' => 'Prosto',
'skinname-modern' => 'Savremeno',
'skinname-vector' => 'Vektorsko',
@@ -3396,7 +3377,7 @@ Ako je prvobitno stanje datoteke promenjeno, moguće je da neki detalji ne opisu
'metadata-langitem' => "'''$2:''' $1",
'metadata-langitem-default' => '$1',
-# EXIF tags
+# Exif tags
'exif-imagewidth' => 'Å irina',
'exif-imagelength' => 'Visina',
'exif-bitspersample' => 'Dubina boje',
@@ -3589,7 +3570,7 @@ $4, $5, $6 $7
$8',
'exif-subjectnewscode-value' => '$2 ($1)',
-# EXIF attributes
+# Exif attributes
'exif-compression-1' => 'Nesažeto',
'exif-compression-2' => 'CCITT Group 3 1 – Dimenzionalno izmenjeno Hafmanovo kodiranje po dužini',
'exif-compression-3' => 'CCITT Group 3 faks kodiranje',
@@ -3928,7 +3909,6 @@ Potvrdite da stvarno želite da napravite stranicu.",
'semicolon-separator' => ';&#32;',
'comma-separator' => ',&#32;',
'colon-separator' => ':&#32;',
-'autocomment-prefix' => '-&#32;',
'pipe-separator' => '&#32;•&#32;',
'word-separator' => '&#32;',
'ellipsis' => '…',
@@ -4082,7 +4062,6 @@ Možete da [[Special:EditWatchlist|koristite i obiÄan ureÄ‘ivaÄ]].',
'version-other' => 'Drugo',
'version-mediahandlers' => 'Rukovodioci medijima',
'version-hooks' => 'Kuke',
-'version-extension-functions' => 'Funkcije',
'version-parser-extensiontags' => 'Oznake',
'version-parser-function-hooks' => 'Kuke',
'version-hook-name' => 'Naziv kuke',
@@ -4105,12 +4084,12 @@ Trebalo bi da ste primili [{{SERVER}}{{SCRIPTPATH}}/COPYING primerak GNU-ove opÅ
'version-entrypoints-header-entrypoint' => 'Ulazna taÄka',
'version-entrypoints-header-url' => 'Adresa',
-# Special:FilePath
-'filepath' => 'Putanja datoteke',
-'filepath-page' => 'Datoteka:',
-'filepath-submit' => 'Idi',
-'filepath-summary' => 'Ova posebna stranica prikazuje potpunu putanju datoteke.
-Slike su prikazane u punoj veliÄini, a druge vrste datoteka se pokreću pomoću njima pridruženim programima.',
+# Special:Redirect
+'redirect-legend' => 'Preusmeri na datoteku ili stranicu',
+'redirect-submit' => 'Idi',
+'redirect-value' => 'Vrednost:',
+'redirect-file' => 'Naziv datoteke',
+'redirect-not-exists' => 'Vrednost nije pronađen',
# Special:FileDuplicateSearch
'fileduplicatesearch' => 'Pretraga duplikata',
@@ -4201,6 +4180,9 @@ Slike su prikazane u punoj veliÄini, a druge vrste datoteka se pokreću pomoću
'htmlform-submit' => 'Pošalji',
'htmlform-reset' => 'Vrati izmene',
'htmlform-selectorother-other' => 'Drugo',
+'htmlform-no' => 'Ne',
+'htmlform-yes' => 'Da',
+'htmlform-chosen-placeholder' => 'Izaberite opciju',
# SQLite database support
'sqlite-has-fts' => '$1 s podrškom pretrage celog teksta',
diff --git a/languages/messages/MessagesSrn.php b/languages/messages/MessagesSrn.php
index ce0037dd..d210911a 100644
--- a/languages/messages/MessagesSrn.php
+++ b/languages/messages/MessagesSrn.php
@@ -179,9 +179,6 @@ $messages = array(
'tog-enotifminoredits' => 'E-mail mi fu pikin kenki fu peprewoysi opo mi sirey',
'tog-enotifrevealaddr' => 'Sori mi e-mail nen ini den e-mail boskopu',
'tog-shownumberswatching' => 'Sori omeni kebroikiman e tan luku a papira disi',
-'tog-externaleditor' => 'Tan kebroiki wan dorosey kenki-wrokosani (soso gi sabiman - spesrutu seti de fanowdu gi disi)',
-'tog-externaldiff' => 'Tan kebroiki wan dorosey agersi-wrokosani (soso gi sabiman - spesrutu set de fanowdu gi disi)',
-'tog-showjumplinks' => 'Sori den "go na" miti',
'tog-uselivepreview' => 'Kebroiki "wanten sori-na-fesi" (JavaScript – ondrosuku fasi)',
'tog-forceeditsummary' => 'Gi wan boskopu efu a "Syatu" boksu leygi',
'tog-watchlisthideown' => 'Kibri mi eygi kenki ini mi Tan luku réy',
@@ -338,7 +335,7 @@ $messages = array(
'jumptonavigation' => 'fenipresi',
'jumptosearch' => 'suku',
-# 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).
+# 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).
'aboutsite' => 'Abra {{SITENAME}}',
'aboutpage' => 'Project:Abra',
'copyright' => 'Ala san skrifi dyaso de ondro $1.',
@@ -348,7 +345,6 @@ $messages = array(
'disclaimers' => 'Disclaimers',
'disclaimerpage' => 'Project:Disclaimer gi ala',
'edithelp' => 'Yepi nanga kenki',
-'edithelppage' => 'Help:Kenki',
'helppage' => 'Help:San de',
'mainpage' => 'Fesipapira',
'mainpage-description' => 'Fesipapira',
@@ -638,17 +634,8 @@ A kan ben trowe efu dribi.
'prevn' => '{{PLURAL:$1|$1}} di psa',
'nextn' => '{{PLURAL:$1|$1}} trawan',
'viewprevnext' => 'Luku ($1 {{int:pipe-separator}} $2) ($3).',
-'searchhelp-url' => 'Help:San de',
'powersearch' => 'Suku moro dipi',
-# Quickbar
-'qbsettings' => 'Kwikbak',
-'qbsettings-none' => 'Nowan',
-'qbsettings-fixedleft' => 'Set na ku',
-'qbsettings-fixedright' => 'Set na pe',
-'qbsettings-floatingleft' => 'Han na ku',
-'qbsettings-floatingright' => 'Han na pe',
-
# Preferences page
'preferences' => 'Seti',
'mypreferences' => 'Mi seti',
@@ -756,7 +743,6 @@ A kan ben trowe efu dribi.
'recentchangeslinked-feed' => 'Kenki di abi wan sani fu du nanga disi',
'recentchangeslinked-toolbox' => 'Kenki di abi wan sani fu du nanga disi',
'recentchangeslinked-title' => 'Kenki di abi wan sani fu du nanga "$1"',
-'recentchangeslinked-noresult' => 'Noti ben kenki ini den miti papira ini a pisi di gi.',
'recentchangeslinked-summary' => "A spesrutu papira disi e sori den laste kenki di ben meki tapu papira di miti tapu wan papira di sori (noso go na memre fu wan grupu di sori).
Papira ini [[Special:Watchlist|yu Tan Luku réy]] '''fatu'''.",
@@ -851,8 +837,6 @@ Papira ini [[Special:Watchlist|yu Tan Luku réy]] '''fatu'''.",
'statistics' => 'Den statistiek',
'statistics-header-users' => 'Masyininfrumasi',
-'disambiguations' => 'Seni doro papira',
-
'doubleredirects' => 'Seni doro tu leisi',
'doubleredirectstext' => 'Disi rei abi peprewoysi dy stir na trawan stir. Ies rei abi skaki na a foswan nanga a fostu stirpapira nanga wan skaki na a duli fu a fosty stirpapira. Pasa den ten ben a bakaseywan papira a tru duli.',
diff --git a/languages/messages/MessagesSt.php b/languages/messages/MessagesSt.php
index 327b587a..65d5e967 100644
--- a/languages/messages/MessagesSt.php
+++ b/languages/messages/MessagesSt.php
@@ -138,7 +138,7 @@ $messages = array(
[[Special:UnusedCategories|Unused categories]] are not shown here.
Also see [[Special:WantedCategories|wanted categories]].',
-# Email user
+# E-mail user
'emailuser' => 'Romela motho enwa email',
'emailfrom' => 'E tswa ho:',
'emailto' => 'Ho:',
diff --git a/languages/messages/MessagesStq.php b/languages/messages/MessagesStq.php
index 6f58e152..89997c08 100644
--- a/languages/messages/MessagesStq.php
+++ b/languages/messages/MessagesStq.php
@@ -74,10 +74,6 @@ $messages = array(
'tog-shownumberswatching' => 'Antaal fon do beooboachtjende Benutsere anwiese',
'tog-oldsig' => 'Aktuälle Signatuur:',
'tog-fancysig' => 'Unnerskrift as Wikitext behonnelje (sunner automatiske Ferlinkenge)',
-'tog-externaleditor' => 'Externen Editor as Standoard benutsje (bloot foar Experte, der mouten spezielle Ienstaalengen ap dän oaine Computer moaked wäide. [//www.mediawiki.org/wiki/Manual:External_editors Moor Information hiertou.])',
-'tog-externaldiff' => 'Extern Diff-Program as Standoard benutsje (bloot foar Experte, der mouten spezielle Ienstaalengen ap dän oaine Computer moaked wäide.
- [//www.mediawiki.org/wiki/Manual:External_editors Wiedere Informatione hiertou.])',
-'tog-showjumplinks' => '"Wikselje tou"-Links muugelk moakje',
'tog-uselivepreview' => 'Live-Foarbekiek nutsje (JavaScript) (experimentell)',
'tog-forceeditsummary' => 'Woarskauje, wan bie dät Spiekerjen ju Touhoopefoatenge failt',
'tog-watchlisthideown' => 'Oaine Biedraage in ju Beooboachtengslieste ferbierge',
@@ -275,7 +271,7 @@ $1',
'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).
+# 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).
'aboutsite' => 'Uur {{SITENAME}}',
'aboutpage' => 'Project:Uur_{{SITENAME}}',
'copyright' => 'Inhoold is ferföichboar unner de $1.',
@@ -285,7 +281,6 @@ $1',
'disclaimers' => 'Begriepskläärenge',
'disclaimerpage' => 'Project:Siede tou Begriepskläärenge',
'edithelp' => 'Beoarbaidengshälpe',
-'edithelppage' => 'Help:Beoarbaidengshälpe',
'helppage' => 'Help:Hälpe',
'mainpage' => 'Haudsiede',
'mainpage-description' => 'Haudsiede',
@@ -358,15 +353,6 @@ Aal ferföichboare Spezioalsieden sunt in ju [[Special:SpecialPages|Lieste fon d
# General errors
'error' => 'Failer',
'databaseerror' => 'Failer in ju Doatenboank',
-'dberrortext' => 'Der is n Doatenboankfailer aptreeden.
-Die Gruund kon n Programmierfailer weese.
-Ju lääste Doatenboankoufroage lutte:
-<blockquote><tt>$1</tt></blockquote>
-uut de Funktion "<tt>$2</tt>".
-Die Doatenboank mäldede dän Failer "<tt>$3: $4</tt>".',
-'dberrortextcl' => 'Dät roate n Syntaxfailer in ju Doatenboankoufroage.
-Ju lääste Doatenboankoufroage lutte: „$1“ uut ju Funktion „<tt>$2</tt>“.
-Die Doatenboank mäldede dän Failer: „<tt>$3: $4</tt>“.',
'laggedslavemode' => 'Woarskauenge: Ju anwiesde Siede kon unner Umstande do jungste Beoarbaidengen noch nit be-ienhoolde.',
'readonly' => 'Doatenboank is speerd',
'enterlockreason' => 'Reek n Gruund ien, wieruum ju Doatenboank speerd wäide skuul un ne Ouskätsenge uur ju Duur fon ju Speerenge',
@@ -417,7 +403,6 @@ Oufroage: $2',
'editinginterface' => "'''Woarskauenge:''' Du beoarbaidest ne Siede ju der bruukt wäd, Interface-Text foar ju Software tou lääwerjen.
Annerengen ap disse Siede wirkje sik uut ap ju Benutseruurfläche foar uur Bruukere.
Foar Uursättengen koast du fielicht beeter [//translatewiki.net/wiki/Main_Page?setlang=en translatewiki.net] bruuke, dät is dät MediaWiki Lokalisierengsprojekt.",
-'sqlhidden' => '(SQL-Oufroage ferbierged)',
'cascadeprotected' => 'Disse Siede is tou Beoarbaidenge speerd. Ju is in do {{PLURAL:$1|foulgjende Siede|foulgjende Sieden}} ienbuunen, do der middels ju Kaskadenspeeroption skutsed {{PLURAL:$1|is|sunt}}:
$2',
'namespaceprotected' => "Du hääst neen Begjuchtigenge, ju Siede in dän '''$1'''-Noomensruum tou beoarbaidjen.",
@@ -448,7 +433,6 @@ Beoachtje, dät eenige Sieden noch anwiese konnen, dät du oumälded bäst, solo
'yourpassword' => 'Paaswoud:',
'yourpasswordagain' => 'Paaswoud wierhoalje:',
'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',
@@ -540,7 +524,7 @@ Täif, eer du fon näien fersäkst.',
'newpassword' => 'Näi Paaswoud:',
'retypenew' => 'Näi Paaswoud (nochmoal):',
'resetpass_submit' => 'Paaswoud ienbrange un anmäldje',
-'resetpass_success' => 'Dien Paaswoud wuude mäd Ärfoulch annerd. Nu foulget ju Anmäldenge...',
+'changepassword-success' => 'Dien Paaswoud wuude mäd Ärfoulch annerd. Nu foulget ju Anmäldenge...',
'resetpass_forbidden' => 'Dät Paaswoud kon nit annerd wäide.',
'resetpass-no-info' => 'Du moast die anmäldje, uum ap disse Siede direkt toutougriepen.',
'resetpass-submit-loggedin' => 'Paaswoud annerje',
@@ -551,10 +535,8 @@ Muugelkerwiese hääst du dien Paaswoud al mäd Ärfoulch annerd of n näi tiede
# Special:PasswordReset
'passwordreset' => 'Paaswoud touräächsätte',
-'passwordreset-text' => 'Dit Formular uutfälle, uum per E-Mail ne Ärinnerenge tou do Anmäldeinformatione tou kriegen.',
'passwordreset-legend' => 'Paaswoud touräächsätte',
'passwordreset-disabled' => 'Dät Touräächsätten fon Paaswoude wuud in dissen Wiki deaktivierd.',
-'passwordreset-pretext' => '{{PLURAL:$1||Reek aan fon do foulgjende Doaten ien}}',
'passwordreset-username' => 'Benutsernoome:',
'passwordreset-domain' => 'Domain:',
'passwordreset-capture' => 'Ju E-Mail-Ättergjucht bekiekje?',
@@ -980,7 +962,6 @@ Staal deertruch sicher, dät ju Versionsgeskichte fon n Artikkel historisk akroa
'searchmenu-legend' => 'Säikoptione',
'searchmenu-exists' => "'''Dät rakt n Siede mäd Noome \"[[:\$1]]\" ap dissen Wiki'''",
'searchmenu-new' => "'''Moak ju Siede „[[:$1]]“ in dissen Wiki.'''",
-'searchhelp-url' => 'Help:Hälpe',
'searchmenu-prefix' => '[[Special:PrefixIndex/$1|Wies aal Sieden, do mäd dän Säikbegriep ounfange]]',
'searchprofile-articles' => 'Inhooldssieden',
'searchprofile-project' => 'Hälpe un Projektsieden',
@@ -1022,15 +1003,6 @@ Staal deertruch sicher, dät ju Versionsgeskichte fon n Artikkel historisk akroa
'search-external' => 'Externe Säike',
'searchdisabled' => 'Ju {{SITENAME}} Fultextsäike is weegen Uurläästenge apstuuns deaktivierd. Du koast insteede deerfon ne Google- of Yahoo-Säike startje. Do Resultoate foar {{SITENAME}} speegelje oawers nit uunbedingd dän aktuällen Stand wier.',
-# Quickbar
-'qbsettings' => 'Siedenlieste',
-'qbsettings-none' => 'Naan',
-'qbsettings-fixedleft' => 'Links, fääst',
-'qbsettings-fixedright' => 'Gjuchts, fääst',
-'qbsettings-floatingleft' => 'Links, swieuwjend',
-'qbsettings-floatingright' => 'Gjuchts, swieuwjend',
-'qbsettings-directionality' => 'Fääst, ouhongich fon de Skrieuwgjuchte fon ju wäälde Sproake',
-
# Preferences page
'preferences' => 'Ienstaalengen',
'mypreferences' => 'Ienstaalengen',
@@ -1060,7 +1032,6 @@ Staal deertruch sicher, dät ju Versionsgeskichte fon n Artikkel historisk akroa
'resetprefs' => 'Nit spiekerde Annerengen fersmiete',
'restoreprefs' => 'Aal Standoard-Ienstaalengen wier häärstaale',
'prefs-editing' => 'Beoarbaidje',
-'prefs-edit-boxsize' => 'Grööte fon dät Beoarbaidengsfinster:',
'rows' => 'Riegen',
'columns' => 'Spalten',
'searchresultshead' => 'Säike (010)',
@@ -1071,9 +1042,6 @@ Staal deertruch sicher, dät ju Versionsgeskichte fon n Artikkel historisk akroa
'recentchangesdays-max' => '(Maximoal $1 {{PLURAL:$1|Dai|Deege}})',
'recentchangescount' => 'Antaal fon do standoardmäitich anwiesde Beoarbaidengen:',
'prefs-help-recentchangescount' => 'Dit uumfoatet ju Lieste fon do lääste Annerengen, ju Versionsgeskichte un do Logbouke.',
-'prefs-help-watchlist-token' => 'Dät Uutfällen fon dit Fäild mäd ne stilkene Koaie generiert n RSS-Feed foar dien Beooboachtengslieste.
-Älk, die disse Koaie koant, kon dien Beooboachtengslieste iensjo. Wääl also n sicheren Wäid.
-Hier n toufällich generierden Wäid, dän du ferweende koast: $1',
'savedprefs' => 'Dien Ienstaalengen wuuden spiekerd.',
'timezonelegend' => 'Tiedzone:',
'localtime' => 'Tied bie Jou:',
@@ -1104,7 +1072,6 @@ Hier n toufällich generierden Wäid, dän du ferweende koast: $1',
'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:',
-'prefs-textboxsize' => 'Grööte fon dät Beoarbaidengsfinster',
'youremail' => 'E-Mail-Adrässe:',
'username' => 'Benutsernoome:',
'uid' => 'Benutser-ID:',
@@ -1337,7 +1304,6 @@ Ju duur maximoal $1 {{PLURAL:$1|Teeken|Teekene}} loang weese.',
'recentchangeslinked-feed' => 'Annerengen an ferlinkede Sieden',
'recentchangeslinked-toolbox' => 'Annerengen an ferlinkede Sieden',
'recentchangeslinked-title' => 'Annerengen an Sieden, do der fon „$1“ ferbuunden sunt',
-'recentchangeslinked-noresult' => 'In dän uutwäälde Tiedruum wuuden an do ferbuundene Sieden neen Annerengen foarnuumen.',
'recentchangeslinked-summary' => "Disse Spezioalsiede liestet do lääste Annerengen fon ferbuundene Sieden ap (blw. bie Kategorien an do Meegliedere fon disse Kategorie). Sieden ap dien [[Special:Watchlist|Beooboachtengslieste]] sunt '''fat''' skrieuwen.",
'recentchangeslinked-page' => 'Siede:',
'recentchangeslinked-to' => 'Wies Annerengen ap Sieden, do hierhäär ferlinkje',
@@ -1525,7 +1491,6 @@ Uut Sicherhaidsgruunde is img_auth.php deaktivierd.',
'http-read-error' => 'HTTP-Leesefailer.',
'http-timed-out' => 'Tied is ferron bie ju HTTP-Anfroage.',
'http-curl-error' => 'Failer bier dän Ouroup fon ju URL: $1',
-'http-host-unreachable' => 'URL is nit tou beloangjen',
'http-bad-status' => 'Unner ju HTTP-Anfroage is n Failer aptreeden: $1 $2',
# Some likely curl errors. More could be added from <http://curl.haxx.se/libcurl/c/libcurl-errors.html>
@@ -1665,12 +1630,6 @@ Ne [[Special:WhatLinksHere/$2|fulständige Lieste]] is ferföigboar.',
'statistics-users-active-desc' => 'Benutsere mäd Beoarbaidengen {{PLURAL:$1|in do lääste 24 Uuren|in do fergeene $1 Deege}}',
'statistics-mostpopular' => 'Maast besoachte Sieden',
-'disambiguations' => 'Sieden do der ap Begriepskläärengssieden ferlinkje',
-'disambiguationspage' => 'Template:Begriepskläärenge',
-'disambiguations-text' => "Do foulgjende Sieden ferlinkje ap ne Siede tou ju '''Begriepskläärenge'''.
-Jie skuulen insteede deerfon ap ju eegentelk meende Siede ferlinkje.<br />
-Ne Siede wäd as Begriepskläärengssiede behonneld, wan [[MediaWiki:Disambiguationspage]] ap ju ferlinket.",
-
'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 skuul.
@@ -1905,10 +1864,9 @@ Wan du die Artikkel wier fon ju Foulgelieste ou hoalje moatest, klik ap ju Siede
'unwatchthispage' => 'Nit moor beooboachtje',
'notanarticle' => 'Naan Artikkel',
'notvisiblerev' => 'Version wuude läsked',
-'watchnochange' => 'Neen fon do Sieden, do du beooboachtest, wuude in dän läästen Tiedruum beoarbaided.',
'watchlist-details' => 'Jie beooboachtje {{PLURAL:$1|1 Siede|$1 Sieden}} (Diskussionssieden wuuden hier nit meetäld).',
-'wlheader-enotif' => '* E-Mail-Beskeed is aktivierd.',
-'wlheader-showupdated' => "* Sieden, do ätter dien lääste Besäik annerd wuuden sunt, wäide '''fat''' deerstoald.",
+'wlheader-enotif' => 'E-Mail-Beskeed is aktivierd.',
+'wlheader-showupdated' => "Sieden, do ätter dien lääste Besäik annerd wuuden sunt, wäide '''fat''' deerstoald.",
'watchmethod-recent' => 'Uurpröiwjen fon do lääste Beoarbaidengen foar ju Beooboachtengslieste',
'watchmethod-list' => 'Uurpröiwjen fon ju Beooboachtengslieste ätter lääste Beoarbaidengen',
'watchlistcontains' => 'Jou Beooboachtengslieste änthaalt $1 {{PLURAL:$1|Siede|Sieden}}.',
@@ -2279,11 +2237,8 @@ Sjuch ju [[Special:BlockList|Lieste fon de speerde IP-Adrässen un Benutsernoome
'ipb_blocked_as_range' => 'Failer: Ju IP-Adresse $1 wuude as Deel fon ju Beräksspeere $2 indirekt speerd. Ne Äntspeerenge fon $1 alleene is nit muugelk.',
'ip_range_invalid' => 'Uungultige IP-Adräsberäk.',
'ip_range_toolarge' => 'Adräsberäkke, do der gratter sunt as /$1, sunt nit ferlööwed.',
-'blockme' => 'Speer mie',
'proxyblocker' => 'Proxy blokker',
-'proxyblocker-disabled' => 'Disse Funktion is deaktivierd.',
'proxyblockreason' => 'Jou IP-Adrässe wuude speerd, deer ju n eepenen Proxy is. Kontaktierje jädden Jou Provider af Jou Systemtechnik un informierje Jou jou uur dit muugelke Sicherhaidsproblem.',
-'proxyblocksuccess' => 'Kloor.',
'sorbsreason' => 'Dien IP-Adrässe is in ju DNSBL fon {{SITENAME}} as eepene PROXY liested.',
'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.',
@@ -2696,7 +2651,7 @@ Wiedere wäide standoardmäitich nit anwiesd.
* gpslongitude
* gpsaltitude',
-# EXIF tags
+# Exif tags
'exif-imagewidth' => 'Bratte',
'exif-imagelength' => 'Laangte',
'exif-bitspersample' => 'Bits pro Faawenkomponente',
@@ -2854,7 +2809,7 @@ Wiedere wäide standoardmäitich nit anwiesd.
'exif-copyrighted' => 'Uurhieuwergjuchtstoatus',
'exif-copyrightowner' => 'Uurhieuwergjuchtsienhääber',
-# EXIF attributes
+# Exif attributes
'exif-compression-1' => 'Uunkomprimierd',
'exif-unknowndate' => 'Uunbekoand Doatum',
@@ -3168,7 +3123,6 @@ Du koast dien Beooboachtengslieste uk in dät [[Special:EditWatchlist/raw|Lieste
'version-other' => 'Uurswät',
'version-mediahandlers' => 'Medien-Handlere',
'version-hooks' => "Snitsteeden ''(Hooks)''",
-'version-extension-functions' => 'Funktionsaproupe',
'version-parser-extensiontags' => "Parser-Ärwiederengen ''(tags)''",
'version-parser-function-hooks' => 'Parser-Funktione',
'version-hook-name' => 'Snitsteedennoome',
@@ -3186,12 +3140,6 @@ Ne [{{SERVER}}{{SCRIPTPATH}}/COPYING Kopie fon ju ''GNU General Public License''
'version-software-product' => 'Produkt',
'version-software-version' => 'Version',
-# Special:FilePath
-'filepath' => 'Doatäipaad',
-'filepath-page' => 'Doatäi:',
-'filepath-submit' => 'Gung',
-'filepath-summary' => 'Mäd disse Spezialsiede lät sik die komplette Paad fon ju aktuelle Version fon ne Doatäi sunner Uumwai oufräigje. Ju anfräigede Doatäi wäd fluks deerstoald blw. mäd ju ferknätte Anweendenge started.',
-
# Special:FileDuplicateSearch
'fileduplicatesearch' => 'Doatäi-Duplikoat-Säike',
'fileduplicatesearch-summary' => 'Säike ätter Doatäi-Duplikoate ap Basis fon hieren Hash-Wäid.',
diff --git a/languages/messages/MessagesSu.php b/languages/messages/MessagesSu.php
index 2c8b70ad..410e1ba2 100644
--- a/languages/messages/MessagesSu.php
+++ b/languages/messages/MessagesSu.php
@@ -159,9 +159,6 @@ $messages = array(
'tog-shownumberswatching' => 'Témbongkeun jumlah nu ngawaskeun',
'tog-oldsig' => 'Paraf nu geus aya:',
'tog-fancysig' => 'Témbongkeun paraf salaku wikitext (tanpa tumbu otomatis)',
-'tog-externaleditor' => 'Paké éditor éxternal dumasar asalna (ukur pikeun nu ahli, perlu sétingan husus dina komputer anjeun. [//www.mediawiki.org/wiki/Manual:External_editors More information.])',
-'tog-externaldiff' => 'Paké diff éxternal dumasar asalna (ukur pikeun nu ahli, perlu sétingan husus dina komputer anjeun. [//www.mediawiki.org/wiki/Manual:External_editors Émbaran lengkep.])',
-'tog-showjumplinks' => 'Aktifkeun tumbu panyambung "luncat ka"',
'tog-uselivepreview' => 'Paké pramidang saharita (JavaScript) (ujicoba)',
'tog-forceeditsummary' => 'Mun kotak ringkesan éditan masih kosong, béjaan!',
'tog-watchlisthideown' => 'Sumputkeun éditan kuring dina daptar awaskeuneun',
@@ -175,6 +172,7 @@ $messages = array(
'tog-showhiddencats' => 'Témbongkeun kategori nyumput',
'tog-noconvertlink' => 'Non-aktifkeun konvérsi judul tumbu',
'tog-norollbackdiff' => 'Liwat béda sanggeus malikkeun révisi',
+'tog-useeditwarning' => 'Béjaan kuring lamun ninggalkeun kaca édit anu parobahanana can disimpen',
'underline-always' => 'Salawasna',
'underline-never' => 'Ulah',
@@ -360,7 +358,7 @@ $1',
'pool-queuefull' => 'Antrian geus pinuh',
'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).
+# 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).
'aboutsite' => 'Ngeunaan {{SITENAME}}',
'aboutpage' => 'Project:Ngeunaan',
'copyright' => 'Sadaya kandungan ieu loka ditangtayungan ku $1',
@@ -370,7 +368,6 @@ $1',
'disclaimers' => 'Bantahan',
'disclaimerpage' => 'Project:Bantahan_umum',
'edithelp' => 'Pitulung ngédit',
-'edithelppage' => 'Help:Ngédit',
'helppage' => 'Help:Pitulung',
'mainpage' => 'Tepas',
'mainpage-description' => 'Tepas',
@@ -442,17 +439,6 @@ Kaca husus anu bener bisa ditempo béréndélanana dina [[Special:SpecialPages|{
# General errors
'error' => 'Kasalahan',
'databaseerror' => 'Kasalahan gudang data',
-'dberrortext' => 'Éror rumpaka kueri pangkalan data.
-Ieu bisa jadi alatan ayana bug dina sopwérna.
-Kueri pangkalan data nu panungtung nyaéta:
-<blockquote><tt>$1</tt></blockquote>
-ti antara fungsi "<tt>$2</tt>".
-Éror ti pangkalan data "<tt>$3: $4</tt>".',
-'dberrortextcl' => 'Éror rumpaka kueri pangkalan data.
-Kueri pangkalan data nu panungtung nyaéta:
-"$1"
-ti antara fungsi "$2".
-Éror ti pangkalan data "$3: $4".',
'laggedslavemode' => 'Awas: kandungan kaca bisa baé teu mutahir.',
'readonly' => 'pangkalan data dikonci',
'enterlockreason' => 'Asupkeun alesan pikeun ngonci, kaasup kira-kira iraha konci ieu rék dibuka',
@@ -501,7 +487,6 @@ Sigana geus dihapus ku nu séjén.',
'editinginterface' => "'''Awas:''' Anjeun keur ngédit kaca nu dipaké pikeun nyadiakeun téks antarmuka pikeun sopwérna.
Parobahan kana ieu kaca bakal mangaruhan pidangan antarmuka pikeun pamaké séjén.
Pikeun alihbasa, mangga sumping ka [//translatewiki.net/wiki/Main_Page?setlang=en translatewiki.net], proyék lokalisasi MediaWiki.",
-'sqlhidden' => '(Pamenta SQL disumputkeun)',
'cascadeprotected' => 'Kaca ieu geus dikonci ti éditan alatan disartakeun di {{PLURAL:$1|kaca|kaca-kaca}} katut anu geus dikonci kalawan pilihan "runtun": $2',
'namespaceprotected' => "Anjeun teu ngabogaan hak pikeun ngédit kaca di ngaranspasi '''$1'''.",
'customcssprotected' => 'Anjeun teu teu diwenangkeun pikeun ngédit ieu kaca CSS, sabab ngandung setélan pribadi kontributor séjén.',
@@ -523,7 +508,6 @@ Mangkahadé, sababaraha kaca bakal tetep némbongkeun saolah-olah anjeun asup lo
'yourpassword' => 'Sandi anjeun',
'yourpasswordagain' => 'Ketik deui sandi anjeun',
'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',
@@ -614,7 +598,7 @@ Tungguan heula sakeudeung, laju cobaan deui.',
'newpassword' => 'Sandi anyar:',
'retypenew' => 'Ketik ulang sandi',
'resetpass_submit' => 'Setél log asup katut sandina',
-'resetpass_success' => 'Kecap sandi Anjeun geus junun dirobah! Ayeuna proses asup log Anjeun...',
+'changepassword-success' => 'Kecap sandi Anjeun geus junun dirobah! Ayeuna proses asup log Anjeun...',
'resetpass_forbidden' => 'Sandi henteu bisa dirobah',
'resetpass-no-info' => 'Anjeun kudu asup log pkeun bisa muka ieu kaca sacara langsung.',
'resetpass-submit-loggedin' => 'Ganti kecap sandi rekening',
@@ -625,10 +609,8 @@ Bisa jadi anjeun geus ngaganti sandina atawa ménta sandi saheulaanan anu anyar.
# Special:PasswordReset
'passwordreset' => 'Setél ulang sandi',
-'passwordreset-text' => 'Lengkepan ieu formulir pikeun nampa surélék pangéling ngeunaan wincikan akun anjeun.',
'passwordreset-legend' => 'Setél ulang sandi',
'passwordreset-disabled' => 'Dina ieu wiki, sandi teu bisa disetél ulang.',
-'passwordreset-pretext' => '{{PLURAL:$1||Asupkeun salah sahiji data di handap ieu}}',
'passwordreset-username' => 'Sandiasma:',
'passwordreset-domain' => 'Domain:',
'passwordreset-capture' => 'Témbongkeun surat-é hasilna?',
@@ -1046,7 +1028,6 @@ Pastikeun yén ieu parobahan bisa miara jujutan kaca sagemblengna.',
'searchmenu-legend' => 'Pilihan nyungsi',
'searchmenu-exists' => "'''Dina wiki ieu geus aya kaca nu ngaranna \"[[:\$1]]\"'''",
'searchmenu-new' => "'''Jieun kaca \"[[:\$1]]\" dina ieu wiki!'''",
-'searchhelp-url' => 'Help:Pitulung',
'searchmenu-prefix' => '[[Special:PrefixIndex/$1|Sungsi kaca-kaca nu dimimitian ku ieu awalan]]',
'searchprofile-articles' => 'Kaca eusi',
'searchprofile-project' => 'Kaca Pitulung jeung Proyék',
@@ -1089,14 +1070,6 @@ Coba susud dimimitian ku ''all:'' pikeun nyusud sakabéh kandunganana (kaasup ka
'search-external' => 'Panéangan luar',
'searchdisabled' => 'Punten! Néangan téks lengkep di {{SITENAME}} kanggo samentawis ditumpurkeun pikeun alesan kinerja. Jalaran kitu, saheulaanan anjeun bisa nyungsi di Google di handap ieu. Catet yén indéxna ngeunaan eusi {{SITENAME}} bisa jadi teu mutahir.',
-# Quickbar
-'qbsettings' => 'Bar gancang',
-'qbsettings-none' => 'Henteu aya',
-'qbsettings-fixedleft' => 'Angger beulah kenca',
-'qbsettings-fixedright' => 'Angger beulah katuhu',
-'qbsettings-floatingleft' => 'Ngambang ka kenca',
-'qbsettings-floatingright' => 'Ngambang ka katuhu',
-
# Preferences page
'preferences' => 'Préferénsi',
'mypreferences' => 'Préferéns',
@@ -1127,7 +1100,6 @@ Coba susud dimimitian ku ''all:'' pikeun nyusud sakabéh kandunganana (kaasup ka
'resetprefs' => 'Sét ulang préferénsi',
'restoreprefs' => 'Larapkeun setélan buhun',
'prefs-editing' => 'Ukuran kotak téks',
-'prefs-edit-boxsize' => 'Ukuran jandéla édit.',
'rows' => 'Baris',
'columns' => 'Kolom',
'searchresultshead' => 'Aturan hasil néang',
@@ -1168,7 +1140,6 @@ Coba susud dimimitian ku ''all:'' pikeun nyusud sakabéh kandunganana (kaasup ka
'prefs-reset-intro' => 'Anjeun bisa maké ieu kaca pikeun mulangkeun préferénsi anjeun ka nu baku.
Mun geus anggeus teu bisa dibolaykeun.',
'prefs-emailconfirm-label' => 'Konfirmasi surélék:',
-'prefs-textboxsize' => 'Lega jandéla ngédit',
'youremail' => 'Surélék:',
'username' => 'Landihan:',
'uid' => 'ID pamaké:',
@@ -1392,7 +1363,6 @@ Mun geus anggeus teu bisa dibolaykeun.',
'recentchangeslinked-feed' => 'Parobahan nu patali',
'recentchangeslinked-toolbox' => 'Parobahan nu patali',
'recentchangeslinked-title' => 'Parobahan patali ka "$1"',
-'recentchangeslinked-noresult' => 'Dina selang waktu anu dipénta, euweuh parobahan dina kaca-kaca anu numbu.',
'recentchangeslinked-summary' => "Ieu kaca husus ngabéréndélkeun parobahan anyar anu numbu ti kaca husus (atawa uesi katagori husus). Kaca anu [[Special:Watchlist|diawaskeun]] némbongan '''kandel'''.",
'recentchangeslinked-page' => 'Ngaran kaca:',
'recentchangeslinked-to' => 'Témbongkeun parobahan ka kaca-kaca nu ditumbukeun ka kaca nu dimaksud',
@@ -1533,7 +1503,6 @@ Pariksa heula jujutan hapusanana saméméh neruskeun ngamuat deui éta berkas.',
# HTTP errors
'http-invalid-url' => 'URL teu bener: $1',
'http-invalid-scheme' => 'URL anu skémana "$1" teu karojong',
-'http-host-unreachable' => 'URL teu kahontal.',
# Some likely curl errors. More could be added from <http://curl.haxx.se/libcurl/c/libcurl-errors.html>
'upload-curl-error6' => 'URL teu kahontal',
@@ -1657,12 +1626,6 @@ Saméméh ngahapus, pariksa heula bisi aya tumbu ka ieu citakan.',
'statistics-users-active-desc' => 'Kontributor nu ngoprék salila {{PLURAL:$1|poé|$1 poé}} panungtung',
'statistics-mostpopular' => 'Kaca nu pangmindengna dibuka',
-'disambiguations' => 'Kaca disambiguasi',
-'disambiguationspage' => 'Template:disambig',
-'disambiguations-text' => "Kaca-kaca ieu ngabogaan tumbu ka hiji ''kaca disambiguasi''.
-Kaca eta sakuduna numbu ka topik-topik anu luyu.<br />
-Sahiji kaca dianggap minangka kaca disambiguasi lamun kaca kasebut ngagunakeun citakan anu nyambung ka [[MediaWiki:Disambiguationspage]].",
-
'doubleredirects' => 'Alihan ganda',
'doubleredirectstext' => 'Ieu kaca ngabéréndélkeun kaca-kaca alihan ka kaca alihan lianna. Unggal baris ngandung tutumbu ka alihan kahiji jeung kadua, ogé tujul alihan kadua anu biasana tujul kaca anu "bener", anu sakuduna dituju ku alihan kahiji. Ëntri nu <del>dicorét</del> geus diropéa.',
'double-redirect-fixed-move' => '[[$1]] geus pindah, dialihkeun ka [[$2]].',
@@ -1881,10 +1844,9 @@ Jaga, parobahan na kaca ieu katut kaca obrolanana bakal dibéréndélkeun di din
'unwatchthispage' => 'Eureun ngawaskeun',
'notanarticle' => 'Sanés kaca eusi',
'notvisiblerev' => 'Révisi geus dihapus',
-'watchnochange' => 'Sadaya awaseun anjeun taya nu diédit dina jangka wanci nu ditémbongkeun.',
'watchlist-details' => 'Aya {{PLURAL:$1|$1 kaca|$1 kaca}} nu ku anjeun diawaskeun, teu kaasup kaca obrolan/sawala.',
-'wlheader-enotif' => '* Pangémbar surélék difungsikeun.',
-'wlheader-showupdated' => "* Kaca nu robah ti panungtungan anjeun sindang ditémbongkeun kalawan '''kandel'''",
+'wlheader-enotif' => 'Pangémbar surélék difungsikeun.',
+'wlheader-showupdated' => "Kaca nu robah ti panungtungan anjeun sindang ditémbongkeun kalawan '''kandel'''",
'watchmethod-recent' => 'mariksa nu anyar robah na kaca nu diawaskeun',
'watchmethod-list' => 'mariksa nu anyar robah na kaca nu diawaskeun',
'watchlistcontains' => 'Anjeun ngawaskeun $1 {{PLURAL:$1|kaca|kaca}}.',
@@ -2195,11 +2157,8 @@ Pikeun rujukan, logna dipidangkeun di handap ieu:',
'unblock-hideuser' => 'Anjeun teu bisa muka peungpeuk ieu pamaké, kusabab landihanan keur disumputkeun.',
'ipb_cant_unblock' => 'Éror: ID peungpeuk $1 teu kapanggih. Sigana mah geus dibuka.',
'ip_range_invalid' => 'Angka IP teu bener.',
-'blockme' => 'Peungpeuk kuring',
'proxyblocker' => 'Pameungpeuk proxy',
-'proxyblocker-disabled' => 'Ieu fungsi keur ditumpurkeun.',
'proxyblockreason' => "Alamat IP anjeun dipeungpeuk sabab mangrupa proxy muka. Mangga tepungan ''Internet service provider'' atanapi ''tech support'' anjeun, béjakeun masalah serius ieu.",
-'proxyblocksuccess' => 'Réngsé.',
'sorbsreason' => "Alamat IP anjeun kadaptar salaku ''open proxy'' dina DNSBL.",
'sorbs_create_account_reason' => "Alamat IP anjeun kadaptar salaku ''open proxy'' dina DNSBL. Anjeun teu bisa nyieun rekening",
'cant-block-while-blocked' => 'Lamun keur dipeungpeuk, anjeun teu bisa meungpeuk séjén kontributor.',
@@ -2551,7 +2510,7 @@ Nu séjénna bakal disumputkeun sakumaha asalna.
* gpslongitude
* gpsaltitude',
-# EXIF tags
+# Exif tags
'exif-imagewidth' => 'Lega',
'exif-imagelength' => 'Luhur',
'exif-compression' => 'Skéma komprési',
@@ -2953,7 +2912,6 @@ Coba ku sawangan normal.',
'version-variables' => 'Variabel',
'version-other' => 'Séjén',
'version-hooks' => 'Kait',
-'version-extension-functions' => 'Fungsi éksténsi',
'version-parser-extensiontags' => 'Tag éksténsi parser',
'version-hook-name' => 'Ngaran kait',
'version-hook-subscribedby' => 'Didaptarkeun ku',
@@ -2963,11 +2921,6 @@ Coba ku sawangan normal.',
'version-software-product' => 'Produk',
'version-software-version' => 'Vérsi',
-# Special:FilePath
-'filepath' => 'Jalur koropak',
-'filepath-page' => 'Koropak:',
-'filepath-submit' => 'Jalur',
-
# Special:FileDuplicateSearch
'fileduplicatesearch' => 'Sungsi gambar duplikat',
'fileduplicatesearch-legend' => 'Sungsi duplikat',
diff --git a/languages/messages/MessagesSv.php b/languages/messages/MessagesSv.php
index 47b4ec6f..30dd4d02 100644
--- a/languages/messages/MessagesSv.php
+++ b/languages/messages/MessagesSv.php
@@ -21,6 +21,7 @@
* @author Grillo
* @author Habj
* @author Habjchen
+ * @author Hangsna
* @author Hannibal
* @author Haxpett
* @author Jon Harald Søby
@@ -29,6 +30,7 @@
* @author LPfi
* @author Lejonel
* @author Leo Johannes
+ * @author Liftarn
* @author Lokal Profil
* @author M.M.S.
* @author MagnusA
@@ -36,6 +38,7 @@
* @author Mikez
* @author NH
* @author Najami
+ * @author Nemo bis
* @author Nghtwlkr
* @author Ozp
* @author Per
@@ -353,10 +356,6 @@ $messages = array(
'tog-shownumberswatching' => 'Visa antalet användare som bevakar',
'tog-oldsig' => 'Nuvarande signatur:',
'tog-fancysig' => 'Rå signatur som wikitext (utan en automatisk länk)',
-'tog-externaleditor' => 'Använd extern editor som standard (endast för avancerade användare, speciella inställningar på din dator krävs. [//www.mediawiki.org/wiki/Manual:External_editors Mer information.])',
-'tog-externaldiff' => 'Använd externt diff-verktyg som förval (endast för avancerade användare, kräver speciella inställningar i din dator.
-[//www.mediawiki.org/wiki/Manual:External_editors Mer information.])',
-'tog-showjumplinks' => 'Aktivera "hoppa till"-tillgänglighetslänkar',
'tog-uselivepreview' => 'Använd direktuppdaterad förhandsgranskning (experimentell)',
'tog-forceeditsummary' => 'PÃ¥minn mig om jag inte fyller i en redigeringskommentar',
'tog-watchlisthideown' => 'Visa inte mina redigeringar i bevakningslistan',
@@ -370,6 +369,8 @@ $messages = array(
'tog-showhiddencats' => 'Visa dolda kategorier',
'tog-noconvertlink' => 'Stäng av konvertering av sidtitlar',
'tog-norollbackdiff' => 'Visa inte diff efter tillbakarullning',
+'tog-useeditwarning' => 'Varna mig om jag lämnar en redigeringssida där jag gjort ändringar men inte sparat.',
+'tog-prefershttps' => 'Använd alltid en säker anslutning när jag är inloggad',
'underline-always' => 'Alltid',
'underline-never' => 'Aldrig',
@@ -433,6 +434,18 @@ $messages = array(
'oct' => 'okt',
'nov' => 'nov',
'dec' => 'dec',
+'january-date' => '$1 januari',
+'february-date' => '$1 februari',
+'march-date' => '$1 mars',
+'april-date' => '$1 april',
+'may-date' => '$1 maj',
+'june-date' => '$1 juni',
+'july-date' => '$1 juli',
+'august-date' => '$1 augusti',
+'september-date' => '$1 september',
+'october-date' => '$1 oktober',
+'november-date' => '$1 november',
+'december-date' => '$1 december',
# Categories related messages
'pagecategories' => '{{PLURAL:$1|Kategori|Kategorier}}',
@@ -514,6 +527,7 @@ $messages = array(
'create-this-page' => 'Skapa denna sida',
'delete' => 'Radera',
'deletethispage' => 'Radera denna sida',
+'undeletethispage' => 'Återställ denna sida',
'undelete_short' => 'Återställ {{PLURAL:$1|en version|$1 versioner}}',
'viewdeleted_short' => 'Visa {{PLURAL:$1|en raderad redigering|$1 raderade redigeringar}}',
'protect' => 'Skrivskydda',
@@ -530,7 +544,7 @@ $messages = array(
'articlepage' => 'Visa innehållssida',
'talk' => 'Diskussion',
'views' => 'Visningar',
-'toolbox' => 'Verktygslåda',
+'toolbox' => 'Verktyg',
'userpage' => 'Visa användarsida',
'projectpage' => 'Visa projektsida',
'imagepage' => 'Visa filsida',
@@ -557,7 +571,7 @@ $1',
'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).
+# 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).
'aboutsite' => 'Om {{SITENAME}}',
'aboutpage' => 'Project:Om',
'copyright' => 'Innehållet är tillgängligt under $1.',
@@ -567,7 +581,6 @@ $1',
'disclaimers' => 'Förbehåll',
'disclaimerpage' => 'Project:Allmänt förbehåll',
'edithelp' => 'Redigeringshjälp',
-'edithelppage' => 'Help:Redigering',
'helppage' => 'Help:Innehåll',
'mainpage' => 'Huvudsida',
'mainpage-description' => 'Huvudsida',
@@ -644,17 +657,12 @@ I [[Special:SpecialPages|listan över specialsidor]] kan du se vilka specialsido
# General errors
'error' => 'Fel',
'databaseerror' => 'Databasfel',
-'dberrortext' => 'Ett syntaxfel i databasfrågan har uppstått.
-Detta kan indikera en bugg i mjukvaran.
-Den senaste databasfrågan att köras var:
-<blockquote><tt>$1</tt></blockquote>
-från funktionen "<tt>$2</tt>".
-Databasen returnerade felet "<tt>$3: $4</tt>".',
-'dberrortextcl' => 'Det har uppstått ett syntaxfel i databassökningen.
-Senaste sökbegrepp var:
-"$1"
-från funktionen "$2".
-Databasen svarade med felmeddelandet "$3: $4"',
+'databaseerror-text' => 'Ett fel inträffade vid en databasfråga.
+Detta kan tyda på en bugg i mjukvaran.',
+'databaseerror-textcl' => 'Ett fel inträffade vid en databasfråga.',
+'databaseerror-query' => 'Fråga: $1',
+'databaseerror-function' => 'Funktion: $1',
+'databaseerror-error' => 'Fel: $1',
'laggedslavemode' => 'Varning: Sidan kan sakna de senaste uppdateringarna.',
'readonly' => 'Databasen är skrivskyddad',
'enterlockreason' => 'Ange varför sidan skrivskyddats, och ge en uppskattning av hur länge skrivskyddet bör behållas.',
@@ -688,6 +696,7 @@ Den kanske redan har raderats av någon annan.',
'cannotdelete-title' => 'Sidan "$1" kan inte raderas',
'delete-hook-aborted' => 'Borttagning avbruten av hook.
Den gav ingen förklaring.',
+'no-null-revision' => 'Kunde inte skapa ny tom version för sidan "$1"',
'badtitle' => 'Felaktig titel',
'badtitletext' => 'Den begärda sidtiteln är antingen ogiltig eller tom, eller så är titeln felaktigt länkad från en annan wiki.
Den kan innehålla ett eller flera tecken som inte får användas i sidtitlar.',
@@ -707,12 +716,15 @@ För att lägga till eller ändra översättningar för alla wikis, var god anvÃ
'editinginterface' => "'''Varning:''' Du redigerar en sida som används till texten i gränssnittet.
Ändringar på denna sida kommer att påverka gränssnittets utseende för alla användare på denna wiki.
För att lägga till eller ändra översättningar för alla wikis, var god använd [//translatewiki.net/ translatewiki.net], översättningsprojektet för MediaWiki.",
-'sqlhidden' => '(gömd SQL-förfrågan)',
'cascadeprotected' => 'Den här sidan har skyddats från redigering eftersom den inkluderas på följande {{PLURAL:$1|sida|sidor}} som skrivskyddats med "kaskaderande skydd":
$2',
'namespaceprotected' => "Du har inte behörighet att redigera sidor i namnrymden '''$1'''.",
'customcssprotected' => 'Du har inte behörighet att redigera denna CSS-sidan eftersom den innehåller en annan användares personliga inställningar.',
'customjsprotected' => 'Du har inte behörighet att redigera denna JavaScript-sidan eftersom den innehåller en annan användares personliga inställningar.',
+'mycustomcssprotected' => 'Du har inte rättigheten att redigera denna CSS-sida.',
+'mycustomjsprotected' => 'Du har inte rättigheten att redigera denna JavaScript-sida.',
+'myprivateinfoprotected' => 'Du har inte behörighet att redigera din privata information.',
+'mypreferencesprotected' => 'Du har inte behörighet att redigera dina inställningar.',
'ns-specialprotected' => 'Specialsidor kan inte redigeras.',
'titleprotected' => 'Denna sidtitel har skyddats från att skapas av [[User:$1|$1]].
Den uppgivna anledningen är "\'\'$2\'\'".',
@@ -737,10 +749,19 @@ Observera att det, tills du tömmer din webbläsares cache, på vissa sidor kan
'welcomecreation-msg' => 'Ditt konto har skapats.
Glöm inte att justera dina [[Special:Preferences|{{SITENAME}}-inställningar]].',
'yourname' => 'Användarnamn:',
+'userlogin-yourname' => 'Användarnamn',
+'userlogin-yourname-ph' => 'Ange ditt användarnamn',
+'createacct-another-username-ph' => 'Skriv in användarnamnet',
'yourpassword' => 'Lösenord:',
+'userlogin-yourpassword' => 'Lösenord',
+'userlogin-yourpassword-ph' => 'Ange ditt lösenord',
+'createacct-yourpassword-ph' => 'Ange ett lösenord',
'yourpasswordagain' => 'Upprepa lösenord',
+'createacct-yourpasswordagain' => 'Bekräfta lösenordet',
+'createacct-yourpasswordagain-ph' => 'Ange lösenordet igen',
'remembermypassword' => 'Spara min inloggning på den här datorn (i max $1 {{PLURAL:$1|dygn|dygn}})',
-'securelogin-stick-https' => 'Fortsätt vara ansluten till HTTPS efter inloggning',
+'userlogin-remembermypassword' => 'HÃ¥ll mig inloggad',
+'userlogin-signwithsecure' => 'Använd säker anslutning',
'yourdomainname' => 'Din domän',
'password-change-forbidden' => 'Du kan inte ändra lösenord på denna wiki.',
'externaldberror' => 'Antingen inträffade autentiseringsproblem med en extern databas, eller så får du inte uppdatera ditt externa konto.',
@@ -752,18 +773,44 @@ Glöm inte att justera dina [[Special:Preferences|{{SITENAME}}-inställningar]].
'logout' => 'Logga ut',
'userlogout' => 'Logga ut',
'notloggedin' => 'Inte inloggad',
+'userlogin-noaccount' => 'Har du inget konto?',
+'userlogin-joinproject' => 'GÃ¥ med i {{SITENAME}}',
'nologin' => 'Har du inget användarkonto? $1.',
'nologinlink' => 'Skapa ett användarkonto',
'createaccount' => 'Skapa ett konto',
'gotaccount' => "Har du redan ett användarkonto? '''$1'''.",
'gotaccountlink' => 'Logga in',
'userlogin-resetlink' => 'Har du glömt dina inloggningsuppgifter?',
+'userlogin-resetpassword-link' => 'Återställ ditt lösenord',
+'helplogin-url' => 'Help:Logga in',
+'userlogin-helplink' => '[[{{MediaWiki:helplogin-url}}|Hjälp med inloggning]]',
+'userlogin-loggedin' => 'Du är redan inloggad som {{GENDER:$1|$1}}.
+Använd formuläret nedan för att logga in som en annan användare.',
+'userlogin-createanother' => 'Skapa ett annat konto',
+'createacct-join' => 'Ange din information nedan.',
+'createacct-another-join' => 'Ange information för det nya kontot nedan.',
+'createacct-emailrequired' => 'E-postadress',
+'createacct-emailoptional' => 'E-postadress (valfritt)',
+'createacct-email-ph' => 'Bekräfta din e-postadress',
+'createacct-another-email-ph' => 'Skriv in e-postadress',
'createaccountmail' => 'Använd ett tillfälligt slumpvis valt lösenord och skicka det till den angivna e-postadressen',
+'createacct-realname' => 'Riktigt namn (valfritt)',
'createaccountreason' => 'Orsak:',
+'createacct-reason' => 'Anledning',
+'createacct-reason-ph' => 'Varför du skapar ett annat konto',
+'createacct-captcha' => 'Säkerhetskontroll',
+'createacct-imgcaptcha-ph' => 'Fyll i texten du ser ovan',
+'createacct-submit' => 'Skapa ditt konto',
+'createacct-another-submit' => 'Skapa ett till konto',
+'createacct-benefit-heading' => '{{SITENAME}} är skapad av människor som dig.',
+'createacct-benefit-body1' => '{{PLURAL:$1|redigering|redigeringar}}',
+'createacct-benefit-body2' => '{{PLURAL:$1|sida|sidor}}',
+'createacct-benefit-body3' => 'senaste {{PLURAL:$1|bidragsgivare}}',
'badretype' => 'De lösenord du uppgett överensstämmer inte med varandra.',
'userexists' => 'Det valda användarnamnet används redan.
Var god välj ett annat namn.',
'loginerror' => 'Inloggningsproblem',
+'createacct-error' => 'Fel när konto skulle skapas',
'createaccounterror' => 'Kunde inte skapa konto: $1',
'nocookiesnew' => 'Användarkontot skapades, men du är inte inloggad.
{{SITENAME}} använder cookies för att logga in användare.
@@ -820,10 +867,12 @@ Skriv in en adress med korrekt format eller töm fältet.',
Du kan ignorera detta meddelande om kontot skapats av misstag.',
'usernamehasherror' => 'Användarnamnet får inte innehålla #.',
'login-throttled' => 'Du har gjort för många misslyckade inloggningsförsök till det här kontot.
-Vänta innan du försöker igen.',
+Vänta $1 innan du försöker igen.',
'login-abort-generic' => 'Din inloggning misslyckades - Avbröts',
'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.',
+'createacct-another-realname-tip' => 'Riktiga namnet är valfritt.
+Om du väljer att ange det, kommer det användas för att tillskriva användaren för sitt arbete.',
# Email sending
'php-mail-error-unknown' => "Okänt fel i PHP's mail()-funktion",
@@ -839,8 +888,7 @@ Vänta innan du försöker igen.',
'newpassword' => 'Nytt lösenord:',
'retypenew' => 'Upprepa det nya lösenordet:',
'resetpass_submit' => 'Spara lösenord och logga in',
-'resetpass_success' => 'Ditt lösenord har ändrats!
-Du loggas nu in…',
+'changepassword-success' => 'Ditt lösenord har ändrats!',
'resetpass_forbidden' => 'Lösenord kan inte ändras',
'resetpass-no-info' => 'Du måste vara inloggad för att komma åt den här sidan direkt.',
'resetpass-submit-loggedin' => 'Ändra lösenord',
@@ -852,10 +900,11 @@ Du kanske redan har lyckats ändra ditt lösenord eller begärt ett nytt tillfä
# Special:PasswordReset
'passwordreset' => 'Lösenordsåterställning',
-'passwordreset-text' => 'Fyll i detta formulär för att återställa ditt lösenord.',
+'passwordreset-text-one' => 'Fyll i detta formulär för att återställa ditt lösenord.',
+'passwordreset-text-many' => '{{PLURAL:$1|Fyll i ett av fälten för att återställa ditt lösenord.}}',
'passwordreset-legend' => 'Återställ lösenord',
'passwordreset-disabled' => 'Lösenordsåterställning har inaktiverats på denna wiki.',
-'passwordreset-pretext' => '{{PLURAL:$1||Ange en av datadelarna nedan}}',
+'passwordreset-emaildisabled' => 'E-postfunktioner har inaktiverats på denna wiki.',
'passwordreset-username' => 'Användarnamn:',
'passwordreset-domain' => 'Domän:',
'passwordreset-capture' => 'Visa resulterande e-post?',
@@ -878,7 +927,7 @@ Du bör logga in och välja ett nytt lösenord nu. Om någon annan gjorde denna
Tillfälligt lösenord: $2',
'passwordreset-emailsent' => 'En lösenordsåterställning via e-post har skickats.',
'passwordreset-emailsent-capture' => 'En lösenordsåterställning via e-post har skickats, som visas nedan.',
-'passwordreset-emailerror-capture' => 'En lösenordsåterställning via e-post har skapats, som visas nedan, men det gick inte att skicka den till användaren: $1',
+'passwordreset-emailerror-capture' => 'En lösenordsåterställning via e-post har skapats, som visas nedan, men det gick inte att skicka den till {{GENDER:$2|användaren}}: $1',
# Special:ChangeEmail
'changeemail' => 'Ändra e-postadress',
@@ -892,6 +941,19 @@ Tillfälligt lösenord: $2',
'changeemail-submit' => 'Ändra e-post',
'changeemail-cancel' => 'Avbryt',
+# Special:ResetTokens
+'resettokens' => 'Återställ nycklar',
+'resettokens-text' => 'Du kan återställa nycklar som tillåter åtkomst till vissa privata uppgifter som är associerade till ditt konto här.
+
+Du bör återställa om du av misstag delade dem med någon eller om ditt konto har äventyrats.',
+'resettokens-no-tokens' => 'Det finns inga nycklar att återställa.',
+'resettokens-legend' => 'Återställ nycklar',
+'resettokens-tokens' => 'Nycklar:',
+'resettokens-token-label' => '$1 (aktuellt värde: $2)',
+'resettokens-watchlist-token' => 'Nyckel för webbflöde (Atom/RSS) av [[Special:Watchlist|ändringar i sidor på din bevakningslista]]',
+'resettokens-done' => 'Nycklarna är återställda.',
+'resettokens-resetbutton' => 'Återställ valda nycklar',
+
# Edit page toolbar
'bold_sample' => 'Fet text',
'bold_tip' => 'Fet stil',
@@ -1088,12 +1150,15 @@ Den gav ingen förklaring.',
Det verkar som att den har raderats.',
'edit-conflict' => 'Redigeringskonflikt.',
'edit-no-change' => 'Din redigering ignorerades, eftersom ingen ändring gjordes i texten.',
+'postedit-confirmation' => 'Din redigering sparades.',
'edit-already-exists' => 'Sidan kunde inte skapas.
Den finns redan.',
'defaultmessagetext' => 'Standardtext för meddelande',
'content-failed-to-parse' => 'Det gick inte att parsa $2 innehåll för $1 modell: $3',
'invalid-content-data' => 'Ogiltig innehållsdata',
'content-not-allowed-here' => 'innehåll av "$1" är inte tillåtet på sidan [[$2]]',
+'editwarning-warning' => 'Om du lämnar den här sidan kommer du att förlora alla ändringar du har gjort.
+Om du är inloggad kan du slå av den här varningen under "Redigering" i dina inställningar.',
# Content models
'content-model-wikitext' => 'wikitext',
@@ -1129,6 +1194,7 @@ Var god och kontrollera jämförelsen nedan för att bekräfta att detta är vad
'undo-failure' => 'Redigeringen kunde inte göras ogjord på grund av konflikt med mellanliggande redigeringar.',
'undo-norev' => 'Redigeringen kan inte göras ogjord eftersom den inte finns eller har raderats.',
'undo-summary' => 'Gör version $1 av [[Special:Contributions/$2|$2]] ([[User talk:$2|diskussion]]) ogjord',
+'undo-summary-username-hidden' => 'Gör version $1 av en dold användare ogjord',
# Account creation failure
'cantcreateaccounttitle' => 'Kan inte skapa konto',
@@ -1310,6 +1376,7 @@ Se till att sidhistorikens kontinuitet behålls när du sammanfogar historik.',
'compareselectedversions' => 'Jämför angivna versioner',
'showhideselectedversions' => 'Visa/dölj valda versioner',
'editundo' => 'gör ogjord',
+'diff-empty' => '(Ingen skillnad)',
'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 användare visas inte)',
'difference-missing-revision' => '{{PLURAL:$2|En revision|$2 revisioner}} av denna skillnad ($1) kunde inte hittas.
@@ -1337,7 +1404,6 @@ Detaljer kan hittas i [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}
'searchmenu-legend' => 'Sökalternativ',
'searchmenu-exists' => "'''Det finns en sida med namnet \"[[:\$1]]\" på denna wiki.'''",
'searchmenu-new' => "'''Skapa sidan \"[[:\$1]]\" på denna wiki!'''",
-'searchhelp-url' => 'Help:Innehåll',
'searchmenu-prefix' => '[[Special:PrefixIndex/$1|Bläddra igenom sidor med detta prefix]]',
'searchprofile-articles' => 'Innehållssidor',
'searchprofile-project' => 'Hjälp- och projektsidor',
@@ -1380,15 +1446,7 @@ Detaljer kan hittas i [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}
'searchdisabled' => 'Sökfunktionen på {{SITENAME}} är avstängd.
Du kan istället göra sökningar med hjälp av Google.
Notera dock att deras indexering av {{SITENAME}} kan vara något föråldrad.',
-
-# Quickbar
-'qbsettings' => 'Snabbmeny',
-'qbsettings-none' => 'Ingen',
-'qbsettings-fixedleft' => 'Fast vänster',
-'qbsettings-fixedright' => 'Fast höger',
-'qbsettings-floatingleft' => 'Flytande vänster',
-'qbsettings-floatingright' => 'Flytande höger',
-'qbsettings-directionality' => 'Fast, beroende på riktningen av ditt skript och språk',
+'search-error' => 'Ett fel uppstod under sökningen: $1',
# Preferences page
'preferences' => 'Inställningar',
@@ -1422,7 +1480,6 @@ Notera dock att deras indexering av {{SITENAME}} kan vara något föråldrad.',
'resetprefs' => 'Återställ osparade ändringar',
'restoreprefs' => 'Återgå till standardinställningar',
'prefs-editing' => 'Redigering',
-'prefs-edit-boxsize' => 'Storlek på redigeringsfönstret.',
'rows' => 'Rader:',
'columns' => 'Kolumner:',
'searchresultshead' => 'Sökning',
@@ -1433,9 +1490,9 @@ Notera dock att deras indexering av {{SITENAME}} kan vara något föråldrad.',
'recentchangesdays-max' => '(maximalt $1 {{PLURAL:$1|dygn|dygn}})',
'recentchangescount' => 'Antal redigeringar som visas som standard:',
'prefs-help-recentchangescount' => 'Detta inkluderar senaste ändringarna, sidhistorik och loggar.',
-'prefs-help-watchlist-token' => 'Om du fyller i detta fält med en hemlig nyckel så skapas ett RSS-flöde för din bevakningslista.
-Alla som kan nyckeln kan också läsa din bevakningslista, så välj ett säkert värde.
-Här är ett slumpmässigt genererat värde som du kan använda: $1',
+'prefs-help-watchlist-token2' => 'Detta är den hemliga nyckeln till webbflödet i din bevakningslista.
+Någon som vet den kommer att kunna läsa din bevakningslista, så inte dela ut den.
+[[Special:ResetTokens|Klicka här om du behöver återställa den]].',
'savedprefs' => 'Dina inställningar har sparats',
'timezonelegend' => 'Tidszon:',
'localtime' => 'Lokal tid:',
@@ -1466,7 +1523,6 @@ Här är ett slumpmässigt genererat värde som du kan använda: $1',
'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:',
-'prefs-textboxsize' => 'Storlek på redigeringsrutan',
'youremail' => 'E-post:',
'username' => '{{GENDER:$1|Användarnamn}}:',
'uid' => '{{GENDER:$1|Användar}}-ID:',
@@ -1491,7 +1547,7 @@ Programvaran använder detta värde för att adressera dig till andra med rätt
'prefs-help-realname' => 'Riktigt namn behöver inte anges.
Om du väljer att ange ditt riktiga namn, kommer det att användas för att tillskriva dig ditt arbete.',
'prefs-help-email' => 'Att ange e-postadress är valfritt, men gör det möjligt att få ditt lösenord mejlat till dig om du glömmer det.',
-'prefs-help-email-others' => 'Du kan också välja att låta andra användare kontakta dig genom din användar-eller diskussionssida utan att avslöja din identitet.',
+'prefs-help-email-others' => 'Du kan också välja att låta andra användare kontakta dig genom din användar- eller diskussionssida utan att avslöja din identitet.',
'prefs-help-email-required' => 'E-postadress måste anges.',
'prefs-info' => 'Grundläggande information',
'prefs-i18n' => 'Internationalisering',
@@ -1499,6 +1555,8 @@ Om du väljer att ange ditt riktiga namn, kommer det att användas för att till
'prefs-dateformat' => 'Datumformat',
'prefs-timeoffset' => 'Tidsförskjutning',
'prefs-advancedediting' => 'Allmänna alternativ',
+'prefs-editor' => 'Redigerare',
+'prefs-preview' => 'Förhandsvisa',
'prefs-advancedrc' => 'Avancerade alternativ',
'prefs-advancedrendering' => 'Avancerade alternativ',
'prefs-advancedsearchoptions' => 'Avancerade alternativ',
@@ -1506,7 +1564,9 @@ Om du väljer att ange ditt riktiga namn, kommer det att användas för att till
'prefs-displayrc' => 'Visningsalternativ',
'prefs-displaysearchoptions' => 'Visningalternativ',
'prefs-displaywatchlist' => 'Visningalternativ',
+'prefs-tokenwatchlist' => 'Nyckel',
'prefs-diffs' => 'Skillnader',
+'prefs-help-prefershttps' => 'Ändringar av denna inställning börjar gälla nästa gång du loggar in',
# User preference: email validation using jQuery
'email-address-validity-valid' => 'Ser giltig ut',
@@ -1533,6 +1593,8 @@ Om du väljer att ange ditt riktiga namn, kommer det att användas för att till
'userrights-notallowed' => 'Du har inte behörighet till att lägga till eller ta bort användarrättigheter.',
'userrights-changeable-col' => 'Grupper du kan ändra',
'userrights-unchangeable-col' => 'Grupper du inte kan ändra',
+'userrights-conflict' => 'Konflikt vid ändringar av användarrättigheter! Var god granska och bekräfta dina ändringar.',
+'userrights-removed-self' => 'Du tog bort dina egna rättigheter. Som sådan, kan du inte längre komma åt denna sida.',
# Groups
'group' => 'Grupp:',
@@ -1598,11 +1660,19 @@ Om du väljer att ange ditt riktiga namn, kommer det att användas för att till
'right-proxyunbannable' => 'Kan redigera från blockerade proxyer',
'right-unblockself' => 'Avblockera sig själv',
'right-protect' => 'Ändra skyddsnivåer och redigera kaskadskyddade sidor',
-'right-editprotected' => 'Redigera skyddade sidor',
+'right-editprotected' => 'Redigera skyddade sidor som "{{int:protect-level-sysop}}"',
+'right-editsemiprotected' => 'Redigera skyddade sidor som "{{int:protect-level-autoconfirmed}}"',
'right-editinterface' => 'Redigera användargränssnittet',
'right-editusercssjs' => 'Redigera andra användares CSS- och JS-filer',
'right-editusercss' => 'Redigera andra användares CSS-filer',
'right-edituserjs' => 'Redigera andra användares JS-filer',
+'right-editmyusercss' => 'Redigera din egen användares CSS-filer',
+'right-editmyuserjs' => 'Redigera din egen användares JavaScript-filer',
+'right-viewmywatchlist' => 'Visa din egen bevakningslista',
+'right-editmywatchlist' => 'Redigera din egen bevakningslista. Observera att en del åtgärder kommer fortfarande lägga till sidor även utan denna rättighet.',
+'right-viewmyprivateinfo' => 'Visa dina egna privata data (t.ex. e-postadress, riktiga namn)',
+'right-editmyprivateinfo' => 'Redigera dina egen privata data (t.ex. e-postadress, riktiga namn)',
+'right-editmyoptions' => 'Redigera dina egna inställningar',
'right-rollback' => 'Rulla tillbaka den användare som senast redigerat en sida',
'right-markbotedits' => 'Markera tillbakarullningar som robotändringar',
'right-noratelimit' => 'Påverkas inte av hastighetsgränser',
@@ -1664,12 +1734,19 @@ Om du väljer att ange ditt riktiga namn, kommer det att användas för att till
'action-userrights-interwiki' => 'ändra rättigheter för användare på andra wikier',
'action-siteadmin' => 'låsa eller låsa upp databasen',
'action-sendemail' => 'skicka e-post',
+'action-editmywatchlist' => 'redigera din bevakningslista',
+'action-viewmywatchlist' => 'visa din bevakningslista',
+'action-viewmyprivateinfo' => 'visa din privata information',
+'action-editmyprivateinfo' => 'redigera din privata information',
# Recent changes
'nchanges' => '$1 {{PLURAL:$1|ändring|ändringar}}',
+'enhancedrc-since-last-visit' => '$1 {{PLURAL:$1|sedan senaste besöket}}',
+'enhancedrc-history' => 'historik',
'recentchanges' => 'Senaste ändringarna',
'recentchanges-legend' => 'Alternativ för senaste ändringarna',
'recentchanges-summary' => 'Följ de senaste ändringarna i wikin på denna sida.',
+'recentchanges-noresult' => 'Inga ändringar under den angivna perioden matchar dessa kriterier.',
'recentchanges-feed-description' => 'Följ de senaste ändringarna i wikin genom den här matningen.',
'recentchanges-label-newpage' => 'Denna redigering skapade en ny sida',
'recentchanges-label-minor' => 'Detta är en mindre ändring',
@@ -1706,7 +1783,6 @@ Om du väljer att ange ditt riktiga namn, kommer det att användas för att till
'recentchangeslinked-feed' => 'Relaterade ändringar',
'recentchangeslinked-toolbox' => 'Relaterade ändringar',
'recentchangeslinked-title' => 'Ändringar relaterade till $1',
-'recentchangeslinked-noresult' => 'Inga ändringar på länkade sidor under den angivna tidsperioden.',
'recentchangeslinked-summary' => "Detta är en lista över de senaste ändringarna på sidor som länkas till från en given sida (eller på sidor som hör till en viss kategori).
Sidor på [[Special:Watchlist|din bevakningslista]] är markerade med '''fetstil'''.",
'recentchangeslinked-page' => 'Sidnamn:',
@@ -1718,7 +1794,7 @@ Sidor på [[Special:Watchlist|din bevakningslista]] är markerade med '''fetstil
'reuploaddesc' => 'Avbryt uppladdningen och gå tillbaka till uppladdningsformuläret.',
'upload-tryagain' => 'Skicka modifierad filbeskrivning',
'uploadnologin' => 'Inte inloggad',
-'uploadnologintext' => 'Du måste vara [[Special:UserLogin|inloggad]] för att kunna ladda upp filer.',
+'uploadnologintext' => 'Du måste $1 för att ladda upp filer.',
'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',
@@ -1946,7 +2022,6 @@ För optimal säkerhet, har img_auth.php blivit avaktiverad.',
'http-read-error' => 'HTTP-läsfel.',
'http-timed-out' => 'Time out för HTTP-begäran.',
'http-curl-error' => 'Fel vid hämtning av URL: $1',
-'http-host-unreachable' => 'URL:en kunde inte nås.',
'http-bad-status' => 'Det uppstod ett problem under HTTP-begäran: $1 $2',
# Some likely curl errors. More could be added from <http://curl.haxx.se/libcurl/c/libcurl-errors.html>
@@ -1974,6 +2049,10 @@ För optimal säkerhet, har img_auth.php blivit avaktiverad.',
'listfiles_size' => 'Storlek (byte)',
'listfiles_description' => 'Beskrivning',
'listfiles_count' => 'Versioner',
+'listfiles-show-all' => 'Visa även äldre versioner av bilder',
+'listfiles-latestversion' => 'Nuvarande version',
+'listfiles-latestversion-yes' => 'Ja',
+'listfiles-latestversion-no' => 'Nej',
# File description page
'file-anchor-link' => 'Fil',
@@ -2070,6 +2149,13 @@ Innan mallarna raderas, kontrollera att det inte finns andra länkar till dem.',
'randompage' => 'Slumpsida',
'randompage-nopages' => 'Det finns inte några sidor i följande {{PLURAL:$2|namnrymd|namnrymder}}: $1.',
+# Random page in category
+'randomincategory' => 'Slumpsida i kategori',
+'randomincategory-invalidcategory' => '"$1" är inte ett giltigt kategorinamn.',
+'randomincategory-nopages' => 'Det finns inga sidor i [[:Category:$1]].',
+'randomincategory-selectcategory' => 'Få slumpsida från kategori: $1 $2.',
+'randomincategory-selectcategory-submit' => 'GÃ¥',
+
# Random redirect
'randomredirect' => 'Slumpvald omdirigering',
'randomredirect-nopages' => 'Det finns inte några omdirigeringar i namnrymden "$1".',
@@ -2095,17 +2181,13 @@ Innan mallarna raderas, kontrollera att det inte finns andra länkar till dem.',
'statistics-users-active-desc' => 'Användare som utfört någon åtgärd under {{PLURAL:$1|det senaste dygnet|de senaste $1 dygnen}}',
'statistics-mostpopular' => 'Mest besökta sidor',
-'disambiguations' => 'Sidor som länkar till förgreningssidor',
-'disambiguationspage' => 'Template:Förgrening',
-'disambiguations-text' => "Följande sidorna innehåller minst en länk till en '''förgreningssida'''.
-De bör troligtvis ändras så att de länkar till en mer passande sida istället.<br />
-En sida anses vara en förgreningssida om den inkluderar en mall som länkas till från [[MediaWiki:Disambiguationspage]].",
-
'pageswithprop' => 'Sidor med en sidegenskap',
'pageswithprop-legend' => 'Sidor med en sidegenskap',
'pageswithprop-text' => 'Denna sida listar sidor som använder en speciell sidegenskap.',
'pageswithprop-prop' => 'Egenskapsnamn:',
'pageswithprop-submit' => 'GÃ¥',
+'pageswithprop-prophidden-long' => 'dold långt textegenskapsvärde ($1)',
+'pageswithprop-prophidden-binary' => 'dold binärt egenskapsvärde ($1)',
'doubleredirects' => 'Dubbla omdirigeringar',
'doubleredirectstext' => 'Det här är en lista över sidor som dirigerar om till andra omdirigeringssidor.
@@ -2163,6 +2245,7 @@ Varje rad innehåller länkar till den första och andra omdirigeringsidan, samt
'mostrevisions' => 'Sidor med flest ändringar',
'prefixindex' => 'Alla sidor med prefix',
'prefixindex-namespace' => 'Alla sidor med prefix ($1 namnrymder)',
+'prefixindex-strip' => 'Avlägsna prefix i lista',
'shortpages' => 'Korta sidor',
'longpages' => 'LÃ¥nga sidor',
'deadendpages' => 'Sidor utan länkar',
@@ -2178,6 +2261,7 @@ Varje rad innehåller länkar till den första och andra omdirigeringsidan, samt
'listusers' => 'Användarlista',
'listusers-editsonly' => 'Visa endast användare som redigerat',
'listusers-creationsort' => 'Sortera efter datum skapat',
+'listusers-desc' => 'Sortera i fallande ordning',
'usereditcount' => '$1 {{PLURAL:$1|redigering|redigeringar}}',
'usercreated' => '{{GENDER:$3|Skapat}} $1 $2',
'newpages' => 'Nya sidor',
@@ -2354,10 +2438,9 @@ Framtida ändringar av den här sidan och dess diskussionssida kommer att listas
'unwatchthispage' => 'Sluta bevaka',
'notanarticle' => 'Inte en artikel',
'notvisiblerev' => 'Sidversionen har raderats',
-'watchnochange' => 'Inga av dina bevakade sidor har ändrats inom den visade tidsperioden.',
'watchlist-details' => 'Du har $1 {{PLURAL:$1|sida|sidor}} på din bevakningslista (diskussionssidor är inte medräknade).',
-'wlheader-enotif' => '* Bekräftelse per e-post är aktiverad.',
-'wlheader-showupdated' => "* Sidor som har ändrats sedan ditt senaste besök visas i '''fetstil.'''",
+'wlheader-enotif' => 'E-postmeddelanden är aktiverade.',
+'wlheader-showupdated' => "Sidor som har ändrats sedan ditt senaste besök visas i '''fetstil.'''",
'watchmethod-recent' => 'letar efter bevakade sidor bland senaste ändringar',
'watchmethod-list' => 'letar efter nyligen gjorda ändringar bland bevakade sidor',
'watchlistcontains' => 'Din bevakningslista innehåller $1 {{PLURAL:$1|sida|sidor}}.',
@@ -2603,7 +2686,7 @@ $1',
'contributions' => '{{GENDER:$1|Användarbidrag}}',
'contributions-title' => 'Bidrag av $1',
'mycontris' => 'Bidrag',
-'contribsub2' => 'För $1 ($2)',
+'contribsub2' => 'För {{GENDER:$3|$1}} ($2)',
'nocontribs' => 'Inga ändringar som motsvarar dessa kriterier hittades.',
'uctop' => '(senaste)',
'month' => 'Från månad (och tidigare):',
@@ -2761,14 +2844,12 @@ Se [[Special:BlockList|blockeringslistan]] för en översikt av gällande blocke
'ipb_blocked_as_range' => 'Fel: IP-adressen $1 är inte direkt blockerad, och kan därför inte avblockeras. Adressen är blockerad som en del av IP-intervallet $2, som kan avblockeras.',
'ip_range_invalid' => 'Ogiltigt IP-intervall.',
'ip_range_toolarge' => 'Blockering av block större än /$1 är inte tillåtna.',
-'blockme' => 'Blockera mig',
'proxyblocker' => 'Proxy-block',
-'proxyblocker-disabled' => 'Den här funktionen är avaktiverad.',
'proxyblockreason' => 'Din IP-adress har blivit blockerad eftersom den tillhör en öppen proxy. Kontakta din internetleverantör eller din organisations eller företags tekniska support, och informera dem om denna allvarliga säkerhetsrisk.',
-'proxyblocksuccess' => 'Gjort.',
'sorbsreason' => 'Din IP-adress är listad som öppen proxy i den DNSBL {{SITENAME}} använder.',
'sorbs_create_account_reason' => 'Din IP-adress är listad som en öppen proxy i den DNSBL som används av {{SITENAME}}.
Du får inte skapa ett användarkonto',
+'xffblockreason' => 'En IP-adress i sidhuvudet X-Forwarded-For, antingen din adress eller en proxyserver som du använder, har blockerats. Den ursprungliga anledningen till blockeringen var: $1',
'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',
@@ -2931,6 +3012,8 @@ Besök [//www.mediawiki.org/wiki/Localisation MediaWiki Localisation] eller [//t
'thumbnail-more' => 'Förstora',
'filemissing' => 'Fil saknas',
'thumbnail_error' => 'Fel vid skapande av miniatyrbild: $1',
+'thumbnail_error_remote' => 'Felmeddelande från $1:
+$2',
'djvu_page_error' => 'DjVu-sida utanför gränserna',
'djvu_no_xml' => 'Kan inte hämta DjVu-filens XML',
'thumbnail-temp-create' => 'Kunde inte skapa temporär miniatyrfil',
@@ -3078,20 +3161,15 @@ Vänligen använd förhandsgranskningsknappen innan du sparar.',
Ger möjlighet att skriva en motivering i redigeringssammanfattningen',
'tooltip-preferences-save' => 'Spara inställningar',
'tooltip-summary' => 'Skriv en kort sammanfattning',
+'tooltip-iwiki' => '$1 - $2',
# Stylesheets
'common.css' => '/* CSS som skrivs här påverkar alla skal */',
-'standard.css' => '/* CSS som skrivs här kommer att påverka alla användare av skalet Standard */',
-'nostalgia.css' => '/* CSS som skrivs här kommer att påverka alla användare av skalet Nostalgi */',
'cologneblue.css' => '/* CSS som skrivs här kommer att påverka alla användare av skalet Cologne blå */',
'monobook.css' => '/* CSS som skrivs här kommer att påverka alla användare av skalet Monobook */',
-'myskin.css' => '/* CSS som skrivs här kommer att påverka alla användare av skalet Mitt utseende */',
-'chick.css' => '/* CSS som skrivs här kommer att påverka alla användare av skalet Chick */',
-'simple.css' => '/* CSS som skrivs här kommer att påverka alla användare av skalet Enkel */',
'modern.css' => '/* CSS som skrivs här kommer att påverka alla användare av skalet Modern */',
'vector.css' => '/* CSS som skrivs här kommer att påverka alla användare av skalet Vector */',
'print.css' => '/* CSS som skrivs här kommer att påverka utskriftsversionen */',
-'handheld.css' => '/* CSS som placeras här kommer att påverka handhållna enheter som baseras på skalet som konfigurerats i $wgHandheldStyle */',
'noscript.css' => '/* CSS som placeras här kommer att påverka användare med JavaScript inaktiverat */',
'group-autoconfirmed.css' => '/* CSS som placeras här kommer bara att påverka bekräftade användare */',
'group-bot.css' => '/* CSS som placeras här kommer bara att påverka robotar */',
@@ -3100,13 +3178,8 @@ Ger möjlighet att skriva en motivering i redigeringssammanfattningen',
# Scripts
'common.js' => '/* JavaScript som skrivs här körs varje gång en användare laddar en sida. */',
-'standard.js' => '/* JavaScript här kommer att laddas för dem som använder skalet Standard */',
-'nostalgia.js' => '/* JavaScript här kommer att laddas för dem som använder skalet Nostalgi */',
'cologneblue.js' => '/* JavaScript här kommer att laddas för dem som använder skalet Cologne blå */',
'monobook.js' => '/* JavaScript här kommer att laddas för dem som använder skalet Monobook */',
-'myskin.js' => '/* JavaScript här kommer att laddas för dem som använder skalet Mitt utseende */',
-'chick.js' => '/* JavaScript här kommer att laddas för dem som använder skalet Chick */',
-'simple.js' => '/* JavaScript här kommer att laddas för dem som använder skalet Enkel */',
'modern.js' => '/* JavaScript här kommer att laddas för dem som använder skalet Modern */',
'vector.js' => '/* JavaScript här kommer att laddas för dem som använder skalet Vector */',
'group-autoconfirmed.js' => '/* JavaScript här kommer att laddas för bekräftade användare */',
@@ -3186,13 +3259,8 @@ Detta orsakades troligen av en länk till en svartlistad webbplats.',
'pageinfo-category-files' => 'Antal filer',
# Skin names
-'skinname-standard' => 'Standard',
-'skinname-nostalgia' => 'Nostalgi',
'skinname-cologneblue' => 'Cologne blå',
'skinname-monobook' => 'Monobook',
-'skinname-myskin' => 'Mitt utseende',
-'skinname-chick' => 'Chick',
-'skinname-simple' => 'Enkel',
'skinname-modern' => 'Modern',
'skinname-vector' => 'Vector',
@@ -3272,11 +3340,25 @@ Om du kör den kan din dator skadas.",
'minutes' => '{{PLURAL:$1|$1 minut|$1 minuter}}',
'hours' => '{{PLURAL:$1|$1 timme|$1 timmar}}',
'days' => '{{PLURAL:$1|$1 dag|$1 dagar}}',
+'weeks' => '{{PLURAL:$1|$1 vecka|$1 veckor}}',
'months' => '{{PLURAL:$1|$1 månad|$1 månader}}',
'years' => '{{PLURAL:$1|$1 år}}',
'ago' => '$1 sedan',
'just-now' => 'precis nu',
+# Human-readable timestamps
+'hours-ago' => '$1 {{PLURAL:$1|timme|timmar}} sedan',
+'minutes-ago' => '$1 {{PLURAL:$1|minut|minuter}} sedan',
+'seconds-ago' => '$1 {{PLURAL:$1|sekund|sekunder}} sedan',
+'monday-at' => 'MÃ¥ndag kl. $1',
+'tuesday-at' => 'Tisdag kl. $1',
+'wednesday-at' => 'Onsdag kl. $1',
+'thursday-at' => 'Torsdag kl. $1',
+'friday-at' => 'Fredag kl. $1',
+'saturday-at' => 'Lördag kl. $1',
+'sunday-at' => 'Söndag kl. $1',
+'yesterday-at' => 'Igår kl. $1',
+
# Bad image list
'bad_image_list' => 'Listan fungerar enligt följande:
@@ -3305,7 +3387,7 @@ Andra kommer att gömmas som standard
* gpslongitude
* gpsaltitude',
-# EXIF tags
+# Exif tags
'exif-imagewidth' => 'Bredd',
'exif-imagelength' => 'Höjd',
'exif-bitspersample' => 'Bitar per komponent',
@@ -3483,7 +3565,7 @@ Andra kommer att gömmas som standard
'exif-originalimageheight' => 'Bildens höjd innan den beskärdes',
'exif-originalimagewidth' => 'Bildens bredd innan den beskärdes',
-# EXIF attributes
+# Exif attributes
'exif-compression-1' => 'Inte komprimerad',
'exif-compression-2' => 'CCITT Grupp 3 1-dimensionell modifierad Huffman-skurlängdskodning',
'exif-compression-3' => 'CCITT Grupp 3 fax-kodning',
@@ -3876,7 +3958,6 @@ Du kan också [[Special:EditWatchlist|använda standardeditorn]].',
'version-other' => 'Annat',
'version-mediahandlers' => 'Mediahanterare',
'version-hooks' => 'Hakar',
-'version-extension-functions' => 'Tilläggsfunktioner',
'version-parser-extensiontags' => 'Tilläggstaggar',
'version-parser-function-hooks' => 'Parserfunktioner',
'version-hook-name' => 'Namn',
@@ -3885,6 +3966,7 @@ Du kan också [[Special:EditWatchlist|använda standardeditorn]].',
'version-license' => 'Licens',
'version-poweredby-credits' => "Den här wikin drivs av '''[//www.mediawiki.org/ MediaWiki]''', copyright © 2001-$1 $2.",
'version-poweredby-others' => 'andra',
+'version-poweredby-translators' => 'översättare från translatewiki.net',
'version-credits-summary' => 'Vi skulle vilja tacka följande personer för deras bidrag till [[Special:Version|MediaWiki]].',
'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.
@@ -3898,12 +3980,17 @@ Du bör ha fått [{{SERVER}}{{SCRIPTPATH}}/COPYING en kopia av GNU General Publi
'version-entrypoints-header-entrypoint' => 'Startpunkt',
'version-entrypoints-header-url' => 'URL',
-# Special:FilePath
-'filepath' => 'Sökväg till fil',
-'filepath-page' => 'Fil:',
-'filepath-submit' => 'Sökväg',
-'filepath-summary' => 'Den här specialsidan ger den fullständiga sökvägen till en fil.
-Bilder visas i full upplösning, andra filtyper öppnas direkt i de program som är associerade till dem.',
+# Special:Redirect
+'redirect' => 'Omdirigering efter filnamn, användar-ID eller versions-ID',
+'redirect-legend' => 'Omdirigera till en fil eller sida',
+'redirect-summary' => 'Den här specialsidan omdirigerar till en fil (efter filnamn), en sida (efter versions-id) eller en användarsida (efter användar-id).',
+'redirect-submit' => 'Kör',
+'redirect-lookup' => 'Slå upp:',
+'redirect-value' => 'Värde:',
+'redirect-user' => 'Användar-ID',
+'redirect-revision' => 'Sidversion',
+'redirect-file' => 'Filnamn',
+'redirect-not-exists' => 'Värdet hittades inte',
# Special:FileDuplicateSearch
'fileduplicatesearch' => 'Sök efter dubblettfiler',
@@ -3953,12 +4040,16 @@ Bilder visas i full upplösning, andra filtyper öppnas direkt i de program som
'tags' => 'Giltiga ändringsmärken',
'tag-filter' => 'Filter för [[Special:Tags|märken]]:',
'tag-filter-submit' => 'Filter',
+'tag-list-wrapper' => '([[Special:Tags|{{PLURAL:$1|Märke|Märken}}]]: $2)',
'tags-title' => 'Märken',
'tags-intro' => 'Denna sida listar märkena som mjukvaran kan markera en redigering med, och deras betydelse.',
'tags-tag' => 'Märkesnamn',
'tags-display-header' => 'Utseende på listor över ändringar',
'tags-description-header' => 'Full beskrivning av betydelse',
+'tags-active-header' => 'Aktiv?',
'tags-hitcount-header' => 'Märkta ändringar',
+'tags-active-yes' => 'Ja',
+'tags-active-no' => 'Nej',
'tags-edit' => 'redigera',
'tags-hitcount' => '$1 {{PLURAL:$1|ändring|ändringar}}',
@@ -3979,6 +4070,7 @@ Bilder visas i full upplösning, andra filtyper öppnas direkt i de program som
'dberr-problems' => 'Ursäkta! Denna sajt har just nu tekniska problem.',
'dberr-again' => 'Pröva med att vänta några minuter och ladda om.',
'dberr-info' => '(Kan inte kontakta databasservern: $1)',
+'dberr-info-hidden' => '(Kan inte kontakta databasservern)',
'dberr-usegoogle' => 'Du kan pröva att söka med Google under tiden.',
'dberr-outofdate' => 'Observera att deras index av vårt innehåll kan vara föråldrat.',
'dberr-cachederror' => 'Följande är en cachad kopia av den efterfrågade sidan, och kan vara föråldrad.',
@@ -3994,6 +4086,9 @@ Bilder visas i full upplösning, andra filtyper öppnas direkt i de program som
'htmlform-submit' => 'Spara',
'htmlform-reset' => 'Ogör ändringar',
'htmlform-selectorother-other' => 'Andra',
+'htmlform-no' => 'Nej',
+'htmlform-yes' => 'Ja',
+'htmlform-chosen-placeholder' => 'Välj ett alternativ',
# SQLite database support
'sqlite-has-fts' => '$1 med stöd för fulltextsökning',
@@ -4111,4 +4206,19 @@ Annars kan du använda det enkla formuläret nedan. Din kommentar kommer att lä
# Image rotation
'rotate-comment' => 'Bilden roteras $1 {{PLURAL:$1|grad|grader}} medurs',
+# Limit report
+'limitreport-title' => 'Profildata för parser:',
+'limitreport-cputime' => 'Processortidsanvändning',
+'limitreport-cputime-value' => '$1 {{PLURAL:$1|sekund|sekunder}}',
+'limitreport-walltime' => 'Realtidsanvändning',
+'limitreport-walltime-value' => '$1 {{PLURAL:$1|sekund|sekunder}}',
+'limitreport-ppvisitednodes' => 'Antal nodbesök för preprocessor',
+'limitreport-ppgeneratednodes' => 'Antal noder genererade av preprocessor',
+'limitreport-postexpandincludesize' => 'Inkluderad storlek efter mallutvidgning',
+'limitreport-postexpandincludesize-value' => '$1/$2 {{PLURAL:$2|byte}}',
+'limitreport-templateargumentsize' => 'Storlek på mallargument',
+'limitreport-templateargumentsize-value' => '$1/$2 {{PLURAL:$2|byte}}',
+'limitreport-expansiondepth' => 'Största expansionsdjup',
+'limitreport-expensivefunctioncount' => 'Antal dyra parser-funktioner',
+
);
diff --git a/languages/messages/MessagesSw.php b/languages/messages/MessagesSw.php
index 973f6f90..d8ef3761 100644
--- a/languages/messages/MessagesSw.php
+++ b/languages/messages/MessagesSw.php
@@ -14,6 +14,7 @@
* @author Malangali
* @author Marcos
* @author Muddyb Blast Producer
+ * @author Nemo bis
* @author Robert Ullmann
* @author Stephenwanjau
* @author לערי ריינה×רט
@@ -154,9 +155,6 @@ $messages = array(
'tog-shownumberswatching' => 'Onyesha idadi ya watumiaji waangalizi',
'tog-oldsig' => 'Sahihi iliyopo:',
'tog-fancysig' => 'Weka sahihi tu (bila kujiweka kiungo yenyewe)',
-'tog-externaleditor' => 'Tumia kiharirio cha nje inaposhindikana (kwa wataalamu tu, inahitaji marekebisho maalum kwenye tarakilishi yako. [//www.mediawiki.org/wiki/Manual:External_editors Maelezo zaidi.])',
-'tog-externaldiff' => 'Tumia diff za nje inaposhindikana (kwa wataalamu tu, inahitaji marekebisho maalum kwenye tarakilishi yako. [//www.mediawiki.org/wiki/Manual:External_editors Maelezo zaidi.])',
-'tog-showjumplinks' => 'Wezesha "ruka hadi" viungo vya mafikio',
'tog-uselivepreview' => 'Tumia kihakikio cha papohapo (JavaScript) (Experimental)',
'tog-forceeditsummary' => 'Nishtue pale ninapoingiza muhtasari mtupu wa kuhariri',
'tog-watchlisthideown' => 'Ficha kuhariri kwangu kwenye orodha ya maangalizi',
@@ -170,6 +168,7 @@ $messages = array(
'tog-showhiddencats' => 'Onyesha jamii zilizofichwa',
'tog-noconvertlink' => 'Lemaza kiungo cha jina la badiliko',
'tog-norollbackdiff' => 'Ondoa faili za diff baada ya kufanyakazi ya kurejesha',
+'tog-useeditwarning' => 'Unionyeshe ilani ninapotaka kutoka kwenye ukurasa ninouhariri, bila kuhifadhi mabadiliko',
'underline-always' => 'Muda wote',
'underline-never' => 'Kamwe',
@@ -233,6 +232,18 @@ $messages = array(
'oct' => 'Okt',
'nov' => 'Nov',
'dec' => 'Des',
+'january-date' => '$1 Januari',
+'february-date' => '$1 Februari',
+'march-date' => '$1 Machi',
+'april-date' => '$1 Aprili',
+'may-date' => '$1 Mei',
+'june-date' => '$1 Juni',
+'july-date' => '$1 Julai',
+'august-date' => '$1 Agosti',
+'september-date' => '$1 Septemba',
+'october-date' => '$1 Oktoba',
+'november-date' => '$1 Novemba',
+'december-date' => '$1 Desemba',
# Categories related messages
'pagecategories' => '{{PLURAL:$1|Jamii}}',
@@ -356,7 +367,7 @@ $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).
+# 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).
'aboutsite' => 'Kuhusu {{SITENAME}}',
'aboutpage' => 'Project:Kuhusu',
'copyright' => 'Yaliyomo yafuata $1.',
@@ -366,7 +377,6 @@ $1',
'disclaimers' => 'Kanusho',
'disclaimerpage' => 'Project:Kanusho kwa jumla',
'edithelp' => 'Usaidizi kwa uhariri',
-'edithelppage' => 'Help:Usaidizi kwa uhariri',
'helppage' => 'Help:Yaliyomo',
'mainpage' => 'Mwanzo',
'mainpage-description' => 'Mwanzo',
@@ -444,17 +454,6 @@ Orodha ya kurasa maalumu zinapatika kwenye [[Special:SpecialPages|{{int:kurasama
# General errors
'error' => 'Hitilafu',
'databaseerror' => 'Hitilafu ya hifadhidata',
-'dberrortext' => 'Shina la kuulizia kihifadhidata kuna hitilafu imetokea.
-Hii inaweza kuashiria kuna mdudu katika bidhaa pepe.
-Jaribio la ulizio la mwisho la kihifadhidata lilikuwa:
-<blockquote><tt>$1</tt></blockquote>
-kutoka ndani ya kitendea "<tt>$2</tt>".
-Kihifadhidata kikarejesha tatizo "<tt>$3: $4</tt>".',
-'dberrortextcl' => 'Shina la kuulizia kihifadhidata kuna hitilafu imetokea.
-Jaribio la ulizio la mwisho la kihifadhidata lilikuwa:
-"$1"
-kutoka ndani ya kitendea "$2".
-Kihifadhidata kikarejesha tatizo "<tt>$3: $4</tt>".',
'laggedslavemode' => "'''Ilani:'''Labda masahihisho ya hivi karibuni bado hayajaonekana.",
'readonly' => 'Hifadhidata imefungika',
'enterlockreason' => 'Ingiza sababu za kufunga, pamoja na makisio yake lini itafunguliwa',
@@ -507,7 +506,6 @@ Tafadhali jaribu tena baada ya muda mfupi.',
'editinginterface' => "'''Ilani:''' Una hariri ukurasa unaotumika kutoa maelezo ya msingi ya bidhaa pepe.
Mabadiliko katika ukurasa huu yataathiri mwonekano mzima wa viungo vya watumiaji wengine.
Kwa lengo la kutaka kutafsiri, tafadhali fikiria kutumia [//translatewiki.net/wiki/Main_Page?setlang=en translatewiki.net], kwa kuweka miradi ya MediaWiki kwa kienyeji.",
-'sqlhidden' => '(maulizo ya SQL yamefichwa)',
'cascadeprotected' => 'Ukurasa huu umekingwa usihaririwe, kwa sababu umejumlishwa katika {{PLURAL:$1|ukurasa ufuatao, ambao umekingwa|kurasa zifuatazo, ambazo zimekingwa}} na chagua la "cascadi" iliwashwa:
$2',
'namespaceprotected' => "Huna ruhusa ya kuhariri kurasa za eneo la wiki la '''$1'''.",
@@ -530,10 +528,13 @@ Sababu zilizotolewa ni "\'\'$2\'\'".',
Unaweza kuendelea kutumia {{SITENAME}} bila kutaja jina lako, au unaweza <span class='plainlinks'>[$1 kuingia tena]</span> kwenye akaunti yako. Kumbuka kwamba kurasa nyingine zitaendelea kuonekana kana kwamba bado hujatoka kwenye akaunti yako, hadi utakaposafisha kache ya kivinjari.",
'welcomeuser' => 'Karibu, $1!',
'yourname' => 'Jina la mtumiaji:',
+'userlogin-yourname' => 'Jina la mtumiaji',
+'userlogin-yourname-ph' => 'Weka jina lako la mtumiaji',
'yourpassword' => 'Neno la siri:',
+'userlogin-yourpassword' => 'Neno la siri',
+'userlogin-yourpassword-ph' => 'Weka neno lako la siri',
'yourpasswordagain' => 'Andika tena neno la siri',
'remembermypassword' => 'Kumbuka kuingia kwangu katika kivinjari hiki (kwa muda usiozidi {{PLURAL:$1|siku}} $1)',
-'securelogin-stick-https' => 'Endelea kuunganishwa na HTTPS baada ya kuingia',
'yourdomainname' => 'Tovuti yako:',
'password-change-forbidden' => 'Hauwezi kubadili nywila katika Wiki hii.',
'externaldberror' => 'Huenda kulikuwa na hitilafu ya database au labda hauruhusiwi kubadilisha akaunti yako ya nje.',
@@ -545,6 +546,8 @@ Unaweza kuendelea kutumia {{SITENAME}} bila kutaja jina lako, au unaweza <span c
'logout' => 'Toka',
'userlogout' => 'Toka',
'notloggedin' => 'Hujaingia',
+'userlogin-noaccount' => 'Huna akaunti ya kuingilia?',
+'userlogin-joinproject' => 'Jiunga na {{SITENAME}}',
'nologin' => "Huna akaunti ya kuingilia? '''$1'''.",
'nologinlink' => 'Sajili akaunti',
'createaccount' => 'Sajili akaunti',
@@ -638,7 +641,7 @@ Kumalizia kuingia ndani, ni lazima urekebishe neno la siri jipya hapa:',
'newpassword' => 'Neno jipya la siri:',
'retypenew' => 'Andika neno la siri tena:',
'resetpass_submit' => 'Rekebisha neno la siri na uingie',
-'resetpass_success' => 'Neno lako la siri limefanikiwa kubadilishwa! Sasa unaingia...',
+'changepassword-success' => 'Neno lako la siri limefanikiwa kubadilishwa! Sasa unaingia...',
'resetpass_forbidden' => 'Maneno ya siri hayawezi kubadilishwa',
'resetpass-no-info' => 'Lazima uwe umeingia ili kuweza kutumia kurasa hii moja kwa moja.',
'resetpass-submit-loggedin' => 'Badilisha neno la siri',
@@ -649,10 +652,8 @@ Inawezekana ikawa tayari umefaulu kubadilisha neno lako la siri au neno la siri
# Special:PasswordReset
'passwordreset' => 'Seti upya neno la siri',
-'passwordreset-text' => 'Jaza fomu hii ili upate barua pepe inayotoa maelezo ya akaunti yako.',
'passwordreset-legend' => 'Seti upya neno la siri',
'passwordreset-disabled' => 'Kuweka neno la siri jipya kumeshitishwa katika wiki hii.',
-'passwordreset-pretext' => '{{PLURAL:$1||Ingiza moja kati ya data hizi hapo chini}}',
'passwordreset-username' => 'Jina la mtumiaji:',
'passwordreset-domain' => 'Miliki',
'passwordreset-capture' => 'Ioneshe barua-pepe itakayotumwa?',
@@ -884,6 +885,8 @@ Inaonekana kwamba ukurasa umefutwa.',
'edit-already-exists' => 'Haikufanikiwa kuanzisha ukurasa mpya.
Ukurasa wa jina hilo unapatikana tayari.',
'defaultmessagetext' => 'Ujumbe uliopo',
+'editwarning-warning' => 'Ukitoka kwenye ukurasa huu labda utapoteza madabiliko uliyoyafanya.
+Unaweza kuondoa ilani hii ukienda kwenye sehemu ya "{{int:prefs-editing}}" kwenye mapendekezo yako.',
# Content models
'content-model-javascript' => 'HatiJava',
@@ -1077,7 +1080,6 @@ Tazama [[Special:BlockList|IP block orodha ya uzuio wa IP]] kuona orodha ya zuio
'searchmenu-legend' => 'Hitiari za kutafuta',
'searchmenu-exists' => "'''Ukurasa wa \"[[:\$1]]\" upo kwenye wiki hii'''",
'searchmenu-new' => "'''Anzisha ukurasa wa \"[[:\$1]]\" katika wiki hii!'''",
-'searchhelp-url' => 'Help:Yaliyomo',
'searchmenu-prefix' => '[[Special:PrefixIndex/$1|Tafuta kurasa kwenye eneo hili la wiki]]',
'searchprofile-articles' => 'Kurasa kwa kusudi ya wiki',
'searchprofile-project' => 'Kurasa za msaada na za mradi',
@@ -1122,14 +1124,6 @@ Ukitaka kutafuta kwenye maeneo yote (pamoja na kurasa za majadiliano, vigezo, nk
Unaweza kutafuta kwa kutumia Google punde si punde.
Ujue lakini kwamba kumbukumbu za {{SITENAME}} kule Google labda zilipitwa na wakati.',
-# Quickbar
-'qbsettings' => 'Mwambaa pembe',
-'qbsettings-none' => 'Hakuna',
-'qbsettings-fixedleft' => 'Kushoto tuli',
-'qbsettings-fixedright' => 'Kulia tuli',
-'qbsettings-floatingleft' => 'Kushoto geugeu',
-'qbsettings-floatingright' => 'Kulia geugeu',
-
# Preferences page
'preferences' => 'Mapendekezo',
'mypreferences' => 'Mapendekezo',
@@ -1162,7 +1156,6 @@ Ujue lakini kwamba kumbukumbu za {{SITENAME}} kule Google labda zilipitwa na wak
'resetprefs' => 'Utupe mabadiliko yasijahifadhika',
'restoreprefs' => 'Rudisha mapendekezo ya msingi',
'prefs-editing' => 'Kuhariri',
-'prefs-edit-boxsize' => 'Ukubwa wa dirisha la kuhariri.',
'rows' => 'Mistari:',
'columns' => 'Safu:',
'searchresultshead' => 'Kutafuta',
@@ -1173,9 +1166,6 @@ Ujue lakini kwamba kumbukumbu za {{SITENAME}} kule Google labda zilipitwa na wak
'recentchangesdays-max' => 'Isizidi {{PLURAL:$1|siku}} $1',
'recentchangescount' => 'Idadi ya masahihisho yatakayoonyeshwa kwa kawaida:',
'prefs-help-recentchangescount' => 'Kwenye kurasa za mabadiliko ya karibuni, za historia ya ukurasa, na za kumbukumbu.',
-'prefs-help-watchlist-token' => 'Ukiandika ufunguo wa siri kwenye kisanduku hiki, programu itaanzisha tawanyiko la RSS kwa ajili ya maangalizi yako.
-Mtu wowote anayejua ufunguo wa siri huu ataweza kusoma orodha yako ya maangalizi, kwa hiyo chagua ufunguo salama.
-Hapo kuna ufunguo uliotolewa na programu kwa kubahatisha, ambao unaweza kuutumia: $1',
'savedprefs' => 'Mapendekezo yako yamehifadhiwa.',
'timezonelegend' => 'Ukanda saa:',
'localtime' => 'Saa ya kwetu:',
@@ -1206,7 +1196,6 @@ Hapo kuna ufunguo uliotolewa na programu kwa kubahatisha, ambao unaweza kuutumia
'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:',
-'prefs-textboxsize' => 'Ukubwa wa sanduku la kuhariri',
'youremail' => 'Barua pepe yako:',
'username' => 'Jina la mtumiaji:',
'uid' => 'Namba ya mtumiaji:',
@@ -1427,7 +1416,6 @@ Taarifa hii itakuwa wazi.',
'recentchangeslinked-feed' => 'Mabadiliko husika',
'recentchangeslinked-toolbox' => 'Mabadiliko husika',
'recentchangeslinked-title' => 'Mabadiliko kuhusiana na "$1"',
-'recentchangeslinked-noresult' => 'Hakuna mabadiliko kwenye kurasa zilizounganishwa wakati wa muda huo.',
'recentchangeslinked-summary' => "Ukurasa maalum huu unaorodhesha mabadiliko ya hivi karibuni katika kurasa zinazoungwa (au katika jamii fulani). Kurasa katika [[Special:Watchlist|maangalizi yako]] ni za '''koze'''.",
'recentchangeslinked-page' => 'Jina la ukurasa:',
'recentchangeslinked-to' => 'Onyesha mabadiliko yaliyotokea kwenye kurasa zile zinazoungwa kufikia ukurasa uliotajwa',
@@ -1609,7 +1597,6 @@ Haliwezi kukaguliwa vilivyo kwa sababu za kiusalama.',
'http-read-error' => 'Hitilafu ya kusoma HTTP.',
'http-timed-out' => 'Ombi la HTTP muda umepita.',
'http-curl-error' => 'Hitilafu ya kuleta URL: $1',
-'http-host-unreachable' => 'KISARA (URL) haikupatikana',
'http-bad-status' => 'Kulikuwa na tatizo wakati wa kutekeleza ombi la HTTP: $1 $2',
# Some likely curl errors. More could be added from <http://curl.haxx.se/libcurl/c/libcurl-errors.html>
@@ -1761,12 +1748,6 @@ Kumbuka kuhakikisha kwamba hakuna viungo vingine vinavyoelekea kigezo fulani kab
'statistics-users-active-desc' => 'Watumiaji waliofanya kazi katika siku {{PLURAL:$1|iliyopita|$1 zilizopita}}',
'statistics-mostpopular' => 'Kurasa zinazotazamwa sana',
-'disambiguations' => 'Kurasa zinazoungana na kurasa za uanishaji',
-'disambiguationspage' => 'Template:Maana',
-'disambiguations-text' => "Kurasa zinazofuata zina angalau kiungo kimoja kinachoelekea kwa '''kurasa ya kutofautishana maana'''.
-Ni afadhali kiungo kiende makala yanayostahili moja kwa moja.<br />
-Ukurasa unatibiwa kama ukurasa wa kutofautishana maana inazotumia 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.',
@@ -2003,10 +1984,9 @@ Ukitaka kufuta ukurasa huo kutoka maangalizi yako baadaye, bonyeza \"Acha kufuat
'unwatchthispage' => 'Acha kufuatilia',
'notanarticle' => 'Ukurasa nje ya kusudi ya wiki',
'notvisiblerev' => 'Haririo ya mwisho, iliotendwa na mtumiaji mwingine, imefutwa',
-'watchnochange' => 'Hakuna kitu kati ya maangalizi yako kilichohaririwa katika kipindi kilichotajwa.',
'watchlist-details' => 'Unafuatilia {{PLURAL:$1|ukurasa $1|kurasa $1}} bila kuzingatia kurasa za majadiliano.',
-'wlheader-enotif' => '* Huduma ya kuarifu kwa barua pepe imewezeshwa.',
-'wlheader-showupdated' => "* Kurasa zilizobadilika tangu ulivyotembelea mara ya mwisho zinaonyeshwa katika hali ya '''kukooza'''",
+'wlheader-enotif' => 'Huduma ya kuarifu kwa barua pepe imewezeshwa.',
+'wlheader-showupdated' => "Kurasa zilizobadilika tangu ulivyotembelea mara ya mwisho zinaonyeshwa katika hali ya '''kukooza'''",
'watchmethod-recent' => 'kupitia madabiliko ya karibuni ili kupata kurasa za maangalizi',
'watchmethod-list' => 'Kupitia kurasa za maangalizi ili kupata madabiliko ya karibuni',
'watchlistcontains' => 'Orodha ya maangalizi yako ina {{PLURAL:$1|pages|kurasa}}.',
@@ -2314,8 +2294,6 @@ Andika sababu ya kuzuia chini (kwa mfano, kwa kutaja mifano ya kurasa zilizohari
'block-log-flags-noemail' => 'barua pepe imezuiliwa',
'block-log-flags-hiddenname' => 'jina la mtumiaji limefichwa',
'ipb_already_blocked' => '"$1" tayari imeshazuiwa',
-'blockme' => 'Nizuie',
-'proxyblocksuccess' => 'Tayari.',
# Developer tools
'lockdb' => 'Funga hifadhidata',
@@ -2668,7 +2646,7 @@ likifupishwa. Nyuga zingine zitafichwa kama chaguo-msingi.
* gpslongitude
* gpsaltitude',
-# EXIF tags
+# Exif tags
'exif-imagewidth' => 'Upana',
'exif-imagelength' => 'Urefu',
'exif-jpeginterchangeformatlength' => 'Idadi ya baiti za data ya JPEG',
@@ -3042,12 +3020,6 @@ Huwa unapokea [{{SERVER}}{{SCRIPTPATH}}/COPYING nakala ya GNU General Public Lic
'version-software-version' => 'Toleo',
'version-entrypoints-header-url' => 'KISARA Kioneshi Sanifu Raslimali',
-# Special:FilePath
-'filepath' => 'Njia ya faili',
-'filepath-page' => 'Faili:',
-'filepath-submit' => 'Nenda',
-'filepath-summary' => 'Ukurasa huu maalumu unarejesha njia kamili ya faili. Picha inaonyeshwa ukubwa wote, faili za aina zingine zinaanza na programu zake zinazohusiana moja kwa moja.',
-
# Special:FileDuplicateSearch
'fileduplicatesearch' => 'Tafuta mafaili ya nakili',
'fileduplicatesearch-summary' => 'Kutafuta mafaili ya nakili kwa kuzingatia thamani za reli.',
@@ -3131,6 +3103,8 @@ Huwa unapokea [{{SERVER}}{{SCRIPTPATH}}/COPYING nakala ya GNU General Public Lic
'htmlform-submit' => 'Wasilisha',
'htmlform-reset' => 'Tengua mabadiliko',
'htmlform-selectorother-other' => 'Nyingine',
+'htmlform-no' => 'Hapana',
+'htmlform-yes' => 'Ndiyo',
# New logging system
'logentry-delete-delete' => '$1 alifuta ukurasa wa $3',
diff --git a/languages/messages/MessagesSzl.php b/languages/messages/MessagesSzl.php
index 03d6c194..c70d6279 100644
--- a/languages/messages/MessagesSzl.php
+++ b/languages/messages/MessagesSzl.php
@@ -94,9 +94,6 @@ $messages = array(
'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 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 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',
@@ -292,7 +289,7 @@ $1',
'pool-queuefull' => 'Kolejka zadań jest pełna',
'pool-errorunknown' => 'Feler Å„yznany',
-# 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).
+# 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).
'aboutsite' => 'Uo {{GRAMMAR:MS.lp|{{SITENAME}}}}',
'aboutpage' => 'Project:Uo serwiśe',
'copyright' => 'Tekst udostympńany na licencyji $1.',
@@ -302,7 +299,6 @@ $1',
'disclaimers' => 'Prawne informacyje',
'disclaimerpage' => 'Project:Prawne informacyje',
'edithelp' => 'Půmoc we půmjyńańy',
-'edithelppage' => 'Help:Jak půmjyńać zajta',
'helppage' => 'Help:Treść',
'mainpage' => 'Przodńo zajta',
'mainpage-description' => 'Przodńo zajta',
@@ -373,14 +369,6 @@ Lista špecyjalnych zajtůw znejdźeš na [[Special:SpecialPages|{{int:specialpa
# General errors
'error' => 'Feler',
'databaseerror' => 'Feler bazy danych',
-'dberrortext' => 'Zdorziu sie feler we skuadńi zapytańo do bazy danych. Uostatńy, ńyudane zapytańy to:
-<blockquote><tt>$1</tt></blockquote>
-wysuane bez funkcja "<tt>$2</tt>".
-MySQL zguośiu feler "<tt>$3: $4</tt>".',
-'dberrortextcl' => 'Zdorziu śe feler we skuadńi zapytańo do bazy danych. Uostatńy, ńyudane zapytańy to:
-"$1"
-kere wywououa funkcyjo "$2".
-MySQL zguośiu feler "$3: $4"',
'laggedslavemode' => 'Dej pozůr: Ta zajta može ńy mjeć nojnowšych aktualizacyjůw.',
'readonly' => 'Baza danych je zawarto',
'enterlockreason' => 'Naškryflej sam powůd zawarća bazy danych a za wjela (myńi-wjyncyj) ja uodymkńeš',
@@ -428,7 +416,6 @@ Zapytańy: $2',
'viewyourtext' => 'We tekst zdrzůduowy tyj zajty możno dali filować, idźe go tyż kopjować.',
'protectedinterface' => 'Na tyj zajće znojduje śe tekst interfejsu uoprogramowańo, bestož uůna je zawarto uod sprowjańo.',
'editinginterface' => "''''Dej pozůr:''' Sprowjosz zajta, na keryj je tekst interfejsu uoprogramowańo. Pomjyńyńa na tyj zajće zmjyńům wyglůnd interfejsu lo inkšych užytkowńikůw.",
-'sqlhidden' => '(schowano zapytańy SQL)',
'cascadeprotected' => 'Ta zajta je zawarto uod sprowjaÅ„o, po takymu, co uůna je zauonÄono na {{PLURAL:$1|nastympujůncyj zajće, kero zostaua zawarto|nastympujůncych zajtach, kere zostauy zawarte}} ze zauonÄonům opcyjům dźedźiÄyÅ„o:
$2',
'namespaceprotected' => "Ńy moš uprowńyń, coby sprowjać zajty we přestřeńi mjan '''$1'''.",
@@ -456,7 +443,6 @@ Dej pozůr, co na ńykerych zajtach přeglůndarka može dali pokozywać co jež
'yourpassword' => 'Hasło:',
'yourpasswordagain' => 'Naszkryflej ausdruk zaÅ›',
'remembermypassword' => 'Pamjyntej můj ausdruk na tym kůmputrze (nojdalij bez $1 {{PLURAL:$1|dźyń|dńůw}})',
-'securelogin-stick-https' => 'Po zalogowańy mjyj połonczenie bez HTTPS',
'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',
@@ -545,7 +531,7 @@ Coby powstřimać nadužyća, možliwość wysyuańa připůmńeń naštalowano
'newpassword' => 'Nowe hasło',
'retypenew' => 'Naszkryflej jeszcze roz nowe hasło:',
'resetpass_submit' => 'Naštaluj hasuo a zalůguj',
-'resetpass_success' => 'Twoje hasuo zostouo půmyślńy pomjyńone! Trwo logůwańe...',
+'changepassword-success' => 'Twoje hasuo zostouo půmyślńy pomjyńone! Trwo logůwańe...',
'resetpass_forbidden' => 'Ńy idźe sam půmjyńyć hasuůw.',
'resetpass-no-info' => 'Muśysz być zalogowany, coby uzyskać bezpostrzedńi dostymp do tyj zajty.',
'resetpass-submit-loggedin' => 'Zmjyń hasło',
@@ -556,10 +542,8 @@ Możliwe co właśńy zmjyńiłżeś swoje hasło abo poprosiłżeś uo nowe tym
# Special:PasswordReset
'passwordreset' => 'Wyczyść hasło',
-'passwordreset-text' => 'WypeÅ‚nij formularz, aby otrzymać eâ€mail z przypomnieniem danych Twojego konta.',
'passwordreset-legend' => 'Wyczyść hasło',
'passwordreset-disabled' => 'No tyj wiki zamkńynto resytowańy hasył.',
-'passwordreset-pretext' => '{{PLURAL:$1||Wćep jydną z danych}}',
'passwordreset-username' => 'Mjano używacza:',
'passwordreset-domain' => 'Domyna:',
'passwordreset-capture' => 'Czy pokazywać treść wiadomoÅ›ci eâ€mail?',
@@ -941,7 +925,6 @@ $1',
'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 půmocy a projektu',
@@ -983,14 +966,6 @@ $1',
'search-external' => 'Šnupańy zewnyntřne',
'searchdisabled' => 'Å nupaÅ„y we {{GRAMMAR:MS.lp|{{SITENAME}}}} zostouo zawarte. ZaÅ„im go zouůnÄům, možeÅ¡ sprůbować Å¡nupaÅ„o bez Google. Ino zauwaž, co informacyje uo treśći {{GRAMMAR:MS.lp|{{SITENAME}}}} můgům być we Google Å„yakuratne.',
-# Quickbar
-'qbsettings' => 'Gurt Å¡ybkigo dostympu',
-'qbsettings-none' => 'Brak',
-'qbsettings-fixedleft' => 'Stouy, s lewyj',
-'qbsettings-fixedright' => 'Stouy, s prawyj',
-'qbsettings-floatingleft' => 'Unošůncy śe, s lewyj',
-'qbsettings-floatingright' => 'Unošůncy śe, s prawyj',
-
# Preferences page
'preferences' => 'Preferyncyje',
'mypreferences' => 'Moje preferyncyje',
@@ -1023,7 +998,6 @@ $1',
'resetprefs' => 'Preferencyje důmyślne',
'restoreprefs' => 'Wćep wszyjskie důmyślne preferencyje',
'prefs-editing' => 'Sprowjańy',
-'prefs-edit-boxsize' => 'Rozmjor uokna edycyji.',
'rows' => 'Wjerše:',
'columns' => 'Kůlumny:',
'searchresultshead' => 'Šnupańy',
@@ -1262,7 +1236,6 @@ $1',
'recentchangeslinked-feed' => 'Pomjyńańa we adresowanych',
'recentchangeslinked-toolbox' => 'Půmjyńańa we nalinkowanych',
'recentchangeslinked-title' => 'Pomjyńyńo w adrésowanych s "$1"',
-'recentchangeslinked-noresult' => 'Nikt nic niy pomjyÅ„oÅ‚ w dolinkowanych bez Äas uo kery žeÅ› pytou.',
'recentchangeslinked-summary' => "Ńiżyj je lista ńydowno půmjyńanych na zajtach, na kere uobrano zajta linkuje (abo wszyjskich zajtach patrzůncych do uobranyj kategoryje).
Zajty z [[Special:Watchlist|pozůrlisty]] sům '''rube'''",
'recentchangeslinked-page' => 'Mjano zajty',
@@ -1480,11 +1453,6 @@ Niżyj sům informacyje ze [$2 zajty popisu] tygo pliku.',
'statistics-users-active-desc' => 'Użytkowńiki, kere bůły aktywne bez {{PLURAL:$1|uostatńi dźyń|uostatńich $1 dńi}}',
'statistics-mostpopular' => 'Zajty we kere nojÄyńśći sam filujom',
-'disambiguations' => 'Zajty ujydnoznaÄÅ„ajůnce',
-'disambiguationspage' => '{{ns:template}}:disambig',
-'disambiguations-text' => "Artikle půńižej uodwouůjům Å›e do '''zajtůw ujydnoznaÄÅ„ajůncych''', a powinny uodwouywać Å›e bezpostÅ™edÅ„o do hasua kere je zwjůnzane ze treśćům artikla.<br />
-Zajta uznawano je za ujydnoznaÄÅ„ajůnco kej zawiyro Å¡ablůn uokreÅ›lůny we [[MediaWiki:Disambiguationspage]].",
-
'doubleredirects' => 'Podwůjne překierowańa',
'doubleredirectstext' => 'Na tyi liśće mogům znojdować Å›e pÅ™ekerowaÅ„o pozorne. UoznaÄa to, aže půńižej pjyrwÅ¡ej liÅ„ii artikla, zawjerajůncyj "#REDIRECT ...", može znojdować Å›e dodotkowy tekst. Koždy wjerÅ¡ listy zawjero uodwouaÅ„o do pjyrwÅ¡ygo i drůgygo pÅ™ekerowaÅ„o a pjyrwÅ¡om liÅ„jům tekstu drůgygo pÅ™ekerowaÅ„o. Uůmožliwjo to na ogůu uodnaleźyÅ„y wuaśćiwygo artikla, do kerygo powinno Å›e pÅ™ekerowywać.',
'double-redirect-fixed-move' => 'zajta [[$1]] zostoła zastůmpjůno bez przekerowańy, skiż jeij przekludzyńo ku [[$2]]',
@@ -1691,10 +1659,9 @@ Na tyi liśće bydźeš mjou rejer přišuych sprowjyń tyi zajty i jeji zajty g
'unwatchthispage' => 'Přestoń dować pozůr',
'notanarticle' => 'To Å„y je artikel',
'notvisiblerev' => 'Wersyja zostoua wyćepano',
-'watchnochange' => 'Žodno ze zajtůw, na kere dowoš pozůr, ńy bůua sprowjano w podanym uokreśe.',
'watchlist-details' => 'Na pozorliśće {{PLURAL:$1|je 1 artikel|sům $1 artikle|je $1 artikli}} ńy rachujůnc zajtůw godek.',
-'wlheader-enotif' => '* WysůuaÅ„y powjadůmjyÅ„ na adres e-brif je zouůnÄůne',
-'wlheader-showupdated' => "* Zajty, kere bouy sprowjane uod Twoi uostatńi wizyty na ńych zostoy naškryflane '''tuustym'''",
+'wlheader-enotif' => 'WysůuaÅ„y powjadůmjyÅ„ na adres e-brif je zouůnÄůne',
+'wlheader-showupdated' => "Zajty, kere bouy sprowjane uod Twoi uostatńi wizyty na ńych zostoy naškryflane '''tuustym'''",
'watchmethod-recent' => 'šnupańy za půmjyńanymi na uostatku w zajtach, na kere dowoš pozůr',
'watchmethod-list' => 'šnupańy w zajtach, na kere dowoš pozůr pośrůd půmjyńanych na uostatku',
'watchlistcontains' => 'Lista zajtůw, na kere dowoš pozůr mo {{PLURAL:$1|jedna pozycja|$1 pozycje|$1 pozycyji}}.',
@@ -2035,12 +2002,9 @@ Coby přejřeć lista uobecńy aktywnych zawarć, přyńdź na zajta [[Special:B
'ipb_blocked_as_range' => 'Feler: Adres IP $1 ńy zostou zawarty bezpośredńo i ńy može zostać uodymkńjynty.
Noležy uůn do zawartygo zakresu adresůw $2. Uodymknůńć možno ino couki zakres.',
'ip_range_invalid' => 'Ńypoprowny zakres adresów IP.',
-'blockme' => 'Zawryj mi sprowjyńa',
'proxyblocker' => 'Zawjyrańe proxy',
-'proxyblocker-disabled' => 'Ta fůnkcyjo je wůuůnÄůna.',
'proxyblockreason' => 'Twůj adres IP zostou zawarty, bo je to adres uotwartygo proxy.
Sprawa noležy wyjaśńić s dostawcům Internetu abo půmocům techÅ„iÄnům informujůnc uo tym powažnym problymje s bezpjeÄyÅ„stwym.',
-'proxyblocksuccess' => 'Wykůnane.',
'sorbsreason' => 'Twůj adres IP znojdowo śe na liśće serwerůw open proxy w DNSBL, užywanej bez {{GRAMMAR:B.lp|{{SITENAME}}}}.',
'sorbs_create_account_reason' => 'Twůj adres IP znojdowo śe na liśće serwerůw open proxy w DNSBL, užywanej bez {{GRAMMAR:B.lp|{{SITENAME}}}}.
Ńy možeš utwořić kůnta',
@@ -2380,7 +2344,7 @@ Eli plik byÅ‚ modyfikowany, dane mogům w tajli Å„y być we zgodźe ze parametrÅ
* gpslongitude
* gpsaltitude',
-# EXIF tags
+# Exif tags
'exif-imagewidth' => 'Šyrokość',
'exif-imagelength' => 'Wysokość',
'exif-bitspersample' => 'Bitůw na průbka',
@@ -2494,7 +2458,7 @@ Eli plik byÅ‚ modyfikowany, dane mogům w tajli Å„y być we zgodźe ze parametrÅ
'exif-gpsdatestamp' => 'Data GPS',
'exif-gpsdifferential' => 'Korekcyjo růžńicy GPS',
-# EXIF attributes
+# Exif attributes
'exif-compression-1' => 'ńyskůmpresowany',
'exif-unknowndate' => 'Å„yznano data',
@@ -2775,7 +2739,6 @@ Možeš tyž [[Special:EditWatchlist|užyć standardowygo edytora]].',
'version-other' => 'Inkše',
'version-mediahandlers' => 'WtyÄki uobsůgi medjůw',
'version-hooks' => 'Haki (ang. hooks)',
-'version-extension-functions' => 'Fůnkcyje rozšyřyń',
'version-parser-extensiontags' => 'ZnaÄÅ„iki rozÅ¡eÅ™yÅ„ do analizatora skuadÅ„i',
'version-parser-function-hooks' => 'Fůnkcyje hokůw analizatora skuadńi (ang. parser function hooks)',
'version-hook-name' => 'Mjano haka (ang. hook name)',
@@ -2786,15 +2749,6 @@ Možeš tyž [[Special:EditWatchlist|užyć standardowygo edytora]].',
'version-software-product' => 'Mjano',
'version-software-version' => 'Wersjo',
-# Special:FilePath
-'filepath' => 'Śćežka do plika',
-'filepath-page' => 'Plik:',
-'filepath-submit' => 'Śćežka',
-'filepath-summary' => 'Ta ekstra zajta zwraco peuno śćyžka do plika.
-Grafiki sům pokazywane w peunyj rozdźelÄośći, inkÅ¡e typy plikůw sům uodmykane we skojařůnym Å› Å„imi průgramje.
-
-NaÅ¡kryflej sam mjano plika bez prefiksu „{{ns:file}}:â€.',
-
# Special:FileDuplicateSearch
'fileduplicatesearch' => 'Å nupej za duplikatym plika',
'fileduplicatesearch-summary' => 'Šnupej za duplikatůma plika na podstawje wartośći fůnkcyji skrůtu.',
diff --git a/languages/messages/MessagesTa.php b/languages/messages/MessagesTa.php
index 2a52bd28..d2fd4c6a 100644
--- a/languages/messages/MessagesTa.php
+++ b/languages/messages/MessagesTa.php
@@ -115,9 +115,6 @@ $messages = array(
'tog-shownumberswatching' => 'கவனிகà¯à®•à¯à®®à¯ பயனரà¯à®•à®³à®¿à®©à¯ எணà¯à®£à®¿à®•à¯à®•à¯ˆà®¯à¯ˆà®•à¯ காடà¯à®Ÿà®µà¯à®®à¯',
'tog-oldsig' => 'நடபà¯à®ªà¯ கையொபà¯à®ªà®®à¯:',
'tog-fancysig' => 'வெறà¯à®±à¯à®•à¯ கையொபà¯à®ªà®®à¯ (தானியஙà¯à®•à®¿ இணைபà¯à®ªà®¿à®©à¯à®±à®¿)',
-'tog-externaleditor' => 'இயலà¯à®ªà®¿à®°à¯à®ªà¯à®ªà®¾à®• வெளித௠தொகà¯à®ªà¯à®ªà¯ மெனà¯à®ªà¯Šà®°à¯à®³à¯ˆà®ªà¯ பயனà¯à®ªà®Ÿà¯à®¤à¯à®¤à¯ (இத௠வலà¯à®²à¯à®¨à®°à¯à®•à®³à¯à®•à¯à®•à¯ மடà¯à®Ÿà¯à®®à¯, உஙà¯à®•à®³à¯ கணினியில௠சிறபà¯à®ªà¯ அமைபà¯à®ªà¯à®•à®³à¯ தேவைபà¯à®ªà®Ÿà¯à®®à¯ [மேலà¯à®®à¯ விவரஙà¯à®•à®³à¯à®•à¯à®•à¯ //www.mediawiki.org/wiki/Manual:External_editors .])',
-'tog-externaldiff' => 'வெளி வேறà¯à®ªà®¾à®Ÿà¯à®Ÿà¯ˆ இயலà¯à®ªà®¿à®°à¯à®ªà¯à®ªà®¾à®•à®ªà¯ பயனà¯à®ªà®Ÿà¯à®¤à¯à®¤à¯ (இத௠வலà¯à®²à¯à®¨à®°à¯à®•à®³à¯à®•à¯à®•à¯ மடà¯à®Ÿà¯à®®à¯; உஙà¯à®•à®³à¯ கணினியில௠சிறபà¯à®ªà¯ அமைபà¯à®ªà¯à®•à®³à¯ தேவைபà¯à®ªà®Ÿà¯à®®à¯ [மேலà¯à®®à¯ விவரஙà¯à®•à®³à¯à®•à¯à®•à¯ //www.mediawiki.org/wiki/Manual:External_editors .])',
-'tog-showjumplinks' => '"தாவிச௠செலà¯à®²à®µà¯à®®à¯" இணைபà¯à®ªà¯à®•à®³à¯ˆ செயலாகà¯à®•à®µà¯à®®à¯',
'tog-uselivepreview' => 'நேரடி à®®à¯à®©à¯à®¤à¯‹à®±à¯à®±à®¤à¯à®¤à¯ˆà®ªà¯ பயனà¯à®ªà®Ÿà¯à®¤à¯à®¤à¯ (சோதனையிலà¯à®³à¯à®³à®¤à¯)',
'tog-forceeditsummary' => 'தொகà¯à®ªà¯à®ªà¯à®šà¯ சà¯à®°à¯à®•à¯à®•à®®à¯ வெறà¯à®±à®¾à®• இரà¯à®•à¯à®•à¯à®®à¯ போத௠எனகà¯à®•à¯ நினைவூடà¯à®Ÿà¯',
'tog-watchlisthideown' => 'எனத௠தொகà¯à®ªà¯à®ªà¯à®•à¯à®•à®³à¯ˆà®•à¯ கவனிபà¯à®ªà¯à®ªà¯ படà¯à®Ÿà®¿à®¯à®²à®¿à®²à®¿à®°à¯à®¨à¯à®¤à¯ மறை',
@@ -130,6 +127,8 @@ $messages = array(
'tog-diffonly' => 'மாறà¯à®±à®™à¯à®•à®³à¯ˆ ஒபà¯à®ªà®¿à®Ÿà¯à®®à¯ போத௠அதன௠கீழ௠பகà¯à®• உளà¯à®³à®Ÿà®•à¯à®•à®¤à¯à®¤à¯ˆà®•à¯ காடà¯à®Ÿà®¾à®¤à¯‡',
'tog-showhiddencats' => 'மறைகà¯à®•à®ªà¯à®ªà®Ÿà¯à®Ÿ பகà¯à®ªà¯à®ªà¯à®•à®³à¯ˆà®•à¯ காடà¯à®Ÿà¯',
'tog-norollbackdiff' => 'à®®à¯à®©à¯à®ªà®¿à®°à¯à®¨à¯à®¤ நிலைகà¯à®•à¯à®•à¯ கொணà¯à®Ÿà¯à®µà®¨à¯à®¤à®ªà®¿à®©à¯ விதà¯à®¤à®¿à®¯à®¾à®šà®™à¯à®•à®³à¯ˆ விடà¯à®Ÿà¯à®µà®¿à®Ÿà®µà¯à®®à¯ (காடà¯à®Ÿà®¤à¯à®¤à¯‡à®µà¯ˆà®¯à®¿à®²à¯à®²à¯ˆ).',
+'tog-useeditwarning' => 'தொகà¯à®¤à¯à®¤à¯à®•à¯ கொணà¯à®Ÿà®¿à®°à¯à®•à¯à®•à¯à®®à¯ பகà¯à®•à®¤à¯à®¤à¯ˆ சேமிகà¯à®•à®¾à®®à®²à¯ வெளியேறினால௠எனகà¯à®•à¯ எசà¯à®šà®°à®¿à®•à¯à®•à¯ˆ செயà¯',
+'tog-prefershttps' => 'பà¯à®•à¯à®ªà®¤à®¿à®•à¯ˆ செயà¯à®¯à¯à®®à¯à®ªà¯‹à®¤à¯ எபà¯à®ªà¯‹à®¤à¯à®®à¯‡ பாதà¯à®•à®¾à®ªà¯à®ªà®¾à®© இணைபà¯à®ªà¯ˆ பயனà¯à®ªà®Ÿà¯à®¤à¯à®¤à®µà¯à®®à¯',
'underline-always' => 'எபà¯à®ªà¯Šà®´à¯à®¤à¯à®®à¯',
'underline-never' => 'எபà¯à®ªà¯‹à®¤à¯à®®à®¿à®²à¯à®²à¯ˆ',
@@ -193,6 +192,18 @@ $messages = array(
'oct' => 'அகà¯',
'nov' => 'நவ',
'dec' => 'டிச',
+'january-date' => 'ஜனவரி $1',
+'february-date' => 'பெபà¯à®°à®µà®°à®¿ $1',
+'march-date' => 'மாரà¯à®šà¯ $1',
+'april-date' => 'மாரà¯à®šà¯ $1',
+'may-date' => 'மே $1',
+'june-date' => 'ஜூன௠$1',
+'july-date' => 'ஜூலை $1',
+'august-date' => 'ஆகஸà¯à®Ÿà¯ $1',
+'september-date' => 'செபà¯à®Ÿà®®à¯à®ªà®°à¯ $1',
+'october-date' => 'அகà¯à®Ÿà¯‹à®ªà®°à¯ $1',
+'november-date' => 'நவமà¯à®ªà®°à¯ $1',
+'december-date' => 'டிசமà¯à®ªà®°à¯ $1',
# Categories related messages
'pagecategories' => '{{PLURAL:$1|பகà¯à®ªà¯à®ªà¯|பகà¯à®ªà¯à®ªà¯à®•à®³à¯}}',
@@ -276,6 +287,7 @@ $messages = array(
'create-this-page' => 'இபà¯à®ªà®•à¯à®•à®¤à¯à®¤à¯ˆ உரà¯à®µà®¾à®•à¯à®•à¯',
'delete' => 'நீகà¯à®•à®µà¯à®®à¯',
'deletethispage' => 'இபà¯à®ªà®•à¯à®•à®¤à¯à®¤à¯ˆ நீகà¯à®•à¯',
+'undeletethispage' => 'அழிதà¯à®¤ பகà¯à®•à®¤à¯à®¤à¯ˆ மறà¯à®ªà®Ÿà®¿à®¯à¯à®®à¯ கொணà¯à®Ÿà¯ வா',
'undelete_short' => '{{PLURAL:$1|ஒர௠தொகà¯à®ªà¯à®ªà¯ˆ|$1 தொகà¯à®ªà¯à®ªà¯à®•à¯à®•à®³à¯ˆ}} மீடà¯à®Ÿà¯†à®Ÿà¯',
'viewdeleted_short' => '{{PLURAL:$1|ஒர௠நீகà¯à®•à®ªà¯à®ªà®Ÿà¯à®Ÿ தொகà¯à®ªà¯à®ªà¯ˆ|$1 நீகà¯à®•à®ªà¯à®ªà®Ÿà¯à®Ÿ தொகà¯à®ªà¯à®ªà¯à®•à®³à¯ˆ}} பாரà¯.',
'protect' => 'காகà¯à®•à®µà¯à®®à¯',
@@ -319,7 +331,7 @@ $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).
+# 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).
'aboutsite' => '{{SITENAME}} பறà¯à®±à®¿',
'aboutpage' => 'Project:விவரமà¯',
'copyright' => 'உளà¯à®³à®Ÿà®•à¯à®•à®™à¯à®•à®³à¯ $1 இன௠கீழ௠கிடைகà¯à®•à®¿à®©à¯à®±à®©.',
@@ -329,7 +341,6 @@ $1',
'disclaimers' => 'பொறà¯à®ªà¯à®ªà¯à®¤à¯ தà¯à®±à®ªà¯à®ªà¯à®•à®³à¯',
'disclaimerpage' => 'Project:பொதà¯à®µà®¾à®© பொறà¯à®ªà¯à®ªà¯à®¤à¯ தà¯à®±à®ªà¯à®ªà¯à®•à®³à¯',
'edithelp' => 'தொகà¯à®¤à¯à®¤à®²à¯à®•à¯à®•à®¾à®© உதவி',
-'edithelppage' => 'Help:à®’à®°à¯à®µà®°à¯ பகà¯à®•à®®à¯Šà®©à¯à®±à¯ˆà®¤à¯ தொகà¯à®ªà¯à®ªà®¤à¯ எபà¯à®ªà®Ÿà®¿?',
'helppage' => 'Help:உதவி',
'mainpage' => 'à®®à¯à®¤à®±à¯ பகà¯à®•à®®à¯',
'mainpage-description' => 'à®®à¯à®¤à®±à¯ பகà¯à®•à®®à¯',
@@ -404,17 +415,6 @@ $1',
# General errors
'error' => 'தவறà¯',
'databaseerror' => 'தரவà¯à®¤à¯à®¤à®³ தவறà¯',
-'dberrortext' => 'தரவà¯à®¤à¯à®¤à®³ வினவல௠தொடரமைபà¯à®ªà®¿à®²à¯ தவற௠à®à®±à¯à®ªà®Ÿà¯à®Ÿà¯à®³à¯à®³à®¤à¯.
-இத௠மெனà¯à®ªà¯Šà®°à¯à®²à®¿à®²à¯ இரà¯à®•à¯à®•à¯à®®à¯ ஒர௠பிழை கà¯à®±à®¿à®•à¯à®•à®•à¯à®•à¯‚டà¯à®®à¯.
-கடைசியாக à®®à¯à®¯à®±à¯à®šà®¿à®•à¯à®•à®ªà¯à®ªà®Ÿà¯à®Ÿ தரவà¯à®¤à¯à®¤à®³ வினவலà¯:
-<blockquote><code>$1</code></blockquote>
-"<code>$2</code>" எனà¯à®©à¯à®®à¯ செயலà¯à®•à¯à®•à¯à®³à¯ இரà¯à®¨à¯à®¤à¯.
-தரவà¯à®¤à¯à®¤à®³à®®à¯ "<samp>$3: $4</samp>" எனà¯à®©à¯à®®à¯ பிழையை விளைவாகà¯à®•à®¿à®¯à®¤à¯.',
-'dberrortextcl' => 'ஒர௠தரவà¯à®¤à¯à®¤à®³ வினவல௠தொடரமைபà¯à®ªà¯à®¤à¯ தவற௠à®à®±à¯à®ªà®Ÿà¯à®Ÿà¯à®³à¯à®³à®¤à¯.
-கடைசியாக à®®à¯à®¯à®±à¯à®šà®¿à®•à¯à®•à®ªà¯à®ªà®Ÿà¯à®Ÿ தரவà¯à®¤à¯à®¤à®³ வினவலà¯:
-"$1"
-செயலà¯à®•à¯à®•à¯à®³à¯(function) இரà¯à®¨à¯à®¤à¯ "$2".
-MySQL returned error "$3: $4".',
'laggedslavemode' => 'எசà¯à®šà®°à®¿à®•à¯à®•à¯ˆ: இபà¯à®ªà®•à¯à®•à®®à¯ அணà¯à®®à¯ˆà®¯à®¿à®²à¯ இறà¯à®±à¯ˆà®ªà¯à®ªà®Ÿà¯à®¤à¯à®¤à®ªà¯à®ªà®Ÿà®¾à®®à®²à¯ இரà¯à®•à¯à®•à®²à®¾à®®à¯.',
'readonly' => 'தரவà¯à®¤à¯à®¤à®³à®®à¯ பூடà¯à®Ÿà®ªà¯à®ªà®Ÿà¯à®Ÿà¯à®³à¯à®³à®¤à¯',
'enterlockreason' => 'பூடà¯à®Ÿà¯à®•à¯à®•à®¾à®© காரணதà¯à®¤à¯ˆà®¤à¯ தரà¯à®•. பூடà¯à®Ÿà¯ எபà¯à®ªà¯Šà®´à¯à®¤à¯ திறகà¯à®•à®ªà¯à®ªà®Ÿà¯à®®à¯ எனà¯à®ªà®¤à¯ˆà®¯à¯à®®à¯ கà¯à®±à®¿à®ªà¯à®ªà®¿à®Ÿà¯à®•.',
@@ -465,11 +465,14 @@ MySQL returned error "$3: $4".',
'viewyourtext' => "நீஙà¯à®•à®³à¯ இநà¯à®¤ பகà¯à®•à®¤à¯à®¤à®¿à®±à¯à®•à®¾à®© ''' உஙà¯à®•à®³à¯ திரà¯à®¤à¯à®¤à®™à¯à®•à®³à¯à®•à¯à®•à®¾à®© ''' மூலதà¯à®¤à¯ˆà®•à¯ காணவà¯à®®à¯ நகலெடà¯à®•à¯à®•à®µà¯à®®à¯ à®®à¯à®Ÿà®¿à®¯à¯à®®à¯.",
'protectedinterface' => 'இபà¯à®ªà®•à¯à®•à®®à¯ இமà¯à®®à¯†à®©à¯ பொரà¯à®³à¯à®•à¯à®•à®¾à®© பயனர௠இடைமà¯à®• உரைகளை வழஙà¯à®•à¯à®•à®¿à®±à®¤à¯, விசம தொகà¯à®ªà¯à®ªà¯à®•à¯à®•à®³à¯ˆ தவிரà¯à®ªà¯à®ªà®¤à®±à¯à®•à¯à®•à®¾à®• இபà¯à®ªà®•à¯à®•à®®à¯ பூடà¯à®Ÿà®ªà¯à®ªà®Ÿà¯à®Ÿà¯à®³à¯à®³à®¤à¯.',
'editinginterface' => "'''எசà¯à®šà®°à®¿à®•à¯à®•à¯ˆ:''' நீஙà¯à®•à®³à¯ இமà¯à®®à¯†à®©à¯ பொரà¯à®³à¯à®•à¯à®•à®¾à®© பயனர௠இடைமà¯à®• உரைகளை வழஙà¯à®•à¯à®®à¯ பகà¯à®•à®®à¯Šà®©à¯à®±à¯ˆ தொகà¯à®•à¯à®• à®®à¯à®¯à®±à¯à®šà®¿ செயà¯à®•à®¿à®±à¯€à®°à¯à®•à®³à¯. இதில௠செயà¯à®¯à®ªà¯à®ªà®Ÿà¯à®®à¯ மாறà¯à®±à®™à¯à®•à®³à¯ à®à®©à¯ˆà®¯ பயனரà¯à®•à®³à®¤à¯ பயனர௠இடைமà¯à®•à®™à¯à®•à®³à®¿à®²à¯à®®à¯ மாறà¯à®±à®™à¯à®•à®³à¯ˆ à®à®±à¯à®ªà®Ÿà¯à®¤à¯à®¤à¯à®®à¯. மொழிபெயரà¯à®ªà¯à®ªà¯à®•à®³à¯à®•à¯à®•à¯, à®…à®°à¯à®³à¯ கூரà¯à®¨à¯à®¤à¯ மிடியாவிகà¯à®•à®¿ மொழிபெயரà¯à®ªà¯à®ªà¯à®¤à¯ திடà¯à®Ÿà®®à®¾à®© [//translatewiki.net/wiki/Main_Page?setlang=ta பீடà¯à®Ÿà®¾à®µà®¿à®•à¯à®•à®¿] திடà¯à®Ÿà®¤à¯à®¤à¯ˆ பயனà¯à®ªà®Ÿà¯à®¤à¯à®¤à®µà¯à®®à¯.",
-'sqlhidden' => '(SQL கோரிகà¯à®•à¯ˆ மறைகà¯à®•à®ªà¯à®ªà®Ÿà¯à®Ÿà¯à®³à¯à®³à®¤à¯)',
'cascadeprotected' => 'படிநிலைக௠காபà¯à®ªà¯à®•à¯à®•à¯à®Ÿà¯à®ªà®Ÿà¯à®¤à¯à®¤à®ªà¯à®ªà®Ÿà¯à®Ÿà¯à®³à¯à®³ பினà¯à®µà®°à¯à®®à¯ {{PLURAL:$1|பகà¯à®•à®¤à¯à®¤à®¿à®²à¯|பகà¯à®•à®™à¯à®•à®³à®¿à®²à¯}} இபà¯à®ªà®•à¯à®•à®®à¯ இணைகà¯à®•à®ªà¯ படà¯à®Ÿà¯à®³à¯à®³à®®à¯ˆà®¯à®¾à®²à¯ இபà¯à®ªà®•à¯à®•à®®à¯ தொகà¯à®ªà¯à®ªà®¤à®¿à®²à®¿à®°à¯à®¨à¯à®¤à¯ காகà¯à®•à®ªà¯à®ªà®Ÿà¯à®Ÿà¯à®³à¯à®³à®¤à¯:$2',
'namespaceprotected' => "'''$1''' பெயரà¯à®µà¯†à®³à®¿à®¯à®¿à®²à¯ தொகà¯à®ªà¯à®ªà¯à®•à¯à®•à®³à¯ˆà®šà¯ செயà¯à®µà®¤à®±à¯à®•à¯ உஙà¯à®•à®³à¯à®•à¯à®•à¯ அனà¯à®®à®¤à®¿ கிடையாதà¯.",
'customcssprotected' => 'வேற௠பயனர௠ஒரà¯à®µà®°à®¿à®©à¯ தனிபà¯à®ªà®Ÿà¯à®Ÿ அமைபà¯à®ªà¯à®•à®³à¯ காணபà¯à®ªà®Ÿà¯à®µà®¤à®¾à®²à¯ இபà¯à®ªà®•à¯à®•à®¤à¯à®¤à¯ˆ தொகà¯à®•à¯à®• உஙà¯à®•à®³à¯à®•à¯à®•à¯ அனà¯à®®à®¤à®¿ கிடையாதà¯.',
'customjsprotected' => 'வேற௠பயனர௠ஒரà¯à®µà®°à®¿à®©à¯ தனிபà¯à®ªà®Ÿà¯à®Ÿ அமைபà¯à®ªà¯à®•à®³à¯ காணபà¯à®ªà®Ÿà¯à®µà®¤à®¾à®²à¯ இநà¯à®¤ JavaScript பகà¯à®•à®¤à¯à®¤à¯ˆ தொகà¯à®•à¯à®• உஙà¯à®•à®³à¯à®•à¯à®•à¯ அனà¯à®®à®¤à®¿ கிடையாதà¯.',
+'mycustomcssprotected' => 'இநà¯à®¤ CSS பகà¯à®•à®¤à¯à®¤à¯ˆ தொகà¯à®•à¯à®•à¯à®®à¯ அனà¯à®®à®¤à®¿ உஙà¯à®•à®³à¯à®•à¯à®•à¯ இலà¯à®²à¯ˆ.',
+'mycustomjsprotected' => 'இநà¯à®¤ JavaScript பகà¯à®•à®¤à¯à®¤à¯ˆ தொகà¯à®•à¯à®•à¯à®®à¯ அனà¯à®®à®¤à®¿ உஙà¯à®•à®³à¯à®•à¯à®•à¯ இலà¯à®²à¯ˆ.',
+'myprivateinfoprotected' => 'உஙà¯à®•à®³à®¿à®©à¯ தனிபà¯à®ªà®Ÿà¯à®Ÿ தகவலà¯à®•à®³à¯ˆ தொகà¯à®•à¯à®•à¯à®®à¯ அனà¯à®®à®¤à®¿ உஙà¯à®•à®³à¯à®•à¯à®•à¯ இலà¯à®²à¯ˆ.',
+'mypreferencesprotected' => 'உஙà¯à®•à®³à®¿à®©à¯ தனிபà¯à®ªà®Ÿà¯à®Ÿ தகவலà¯à®•à®³à¯ˆ தொகà¯à®•à¯à®•à¯à®®à¯ அனà¯à®®à®¤à®¿ உஙà¯à®•à®³à¯à®•à¯à®•à¯ இலà¯à®²à¯ˆ.',
'ns-specialprotected' => 'சிறபà¯à®ªà¯à®ªà¯ பகà¯à®•à®™à¯à®•à®³à¯ˆà®¤à¯ தொகà¯à®•à¯à®• à®®à¯à®Ÿà®¿à®¯à®¾à®¤à¯.',
'titleprotected' => "பயனர௠[[User:$1|$1]] இதà¯à®¤à®²à¯ˆà®ªà¯à®ªà¯ உரà¯à®µà®¾à®•à¯à®•à®ªà¯à®ªà®Ÿà¯à®µà®¤à¯ˆ தவிரà¯à®•à¯à®•à¯à®®à¯ வகையில௠தடà¯à®¤à¯à®¤à¯à®³à¯à®³à®¾à®°à¯.
கொடà¯à®•à¯à®•à®ªà¯à®ªà®Ÿà¯à®Ÿà®•à¯ காரணம௠''$2''.",
@@ -491,10 +494,19 @@ MySQL returned error "$3: $4".',
'welcomeuser' => 'வரà¯à®• $1',
'welcomecreation-msg' => 'உஙà¯à®•à®³à¯à®•à¯à®•à®¾à®© பயனர௠கணகà¯à®•à¯ உரà¯à®µà®¾à®•à¯à®•à®ªà¯à®ªà®Ÿà¯à®Ÿà¯à®³à¯à®³à®¤à¯. உஙà¯à®•à®³à¯à®•à¯à®•à¯‡à®±à¯à®±à®µà®¾à®±à¯ [[Special:Preferences|{{SITENAME}} விரà¯à®ªà¯à®ªà®¤à¯à®¤à¯‡à®°à¯à®µà¯à®•à®³à¯ˆ]] மாறà¯à®±à®¿à®•à¯ கொளà¯à®³ மறவாதீரà¯à®•à®³à¯.',
'yourname' => 'பயனர௠பெயரà¯:',
+'userlogin-yourname' => 'பயனர௠பெயரà¯',
+'userlogin-yourname-ph' => 'உஙà¯à®•à®³à¯ பயனர௠பெயரை உளà¯à®³à®¿à®Ÿà¯à®•',
+'createacct-another-username-ph' => 'பயனர௠பெயரொனà¯à®±à¯ˆ இடà¯à®•:',
'yourpassword' => 'கடவà¯à®šà¯à®šà¯Šà®²à¯:',
+'userlogin-yourpassword' => 'கடவà¯à®šà¯à®šà¯Šà®²à¯',
+'userlogin-yourpassword-ph' => 'உஙà¯à®•à®³à¯ கடவà¯à®šà¯à®šà¯Šà®²à¯à®²à¯ˆ உளà¯à®³à®¿à®Ÿà¯à®•',
+'createacct-yourpassword-ph' => 'கடவà¯à®šà¯à®šà¯Šà®²à¯à®²à¯ˆ உளà¯à®³à®¿à®Ÿà¯à®•',
'yourpasswordagain' => 'கடவà¯à®šà¯à®šà¯Šà®²à¯à®²à¯ˆà®¤à¯ திரà¯à®®à¯à®ª தடà¯à®Ÿà®šà¯à®šà®¿à®Ÿà¯à®•:',
+'createacct-yourpasswordagain' => 'கடவà¯à®šà¯à®šà¯Šà®²à¯à®²à¯ˆ உறà¯à®¤à®¿à®šà¯†à®¯à¯à®•',
+'createacct-yourpasswordagain-ph' => 'கடவà¯à®šà¯à®šà¯Šà®²à¯à®²à¯ˆ மீளவà¯à®®à¯ இடà¯à®•',
'remembermypassword' => 'எனத௠கடவà¯à®šà¯à®šà¯Šà®²à¯à®²à¯ˆ (கூடியத௠$1 {{PLURAL:$1|நாளà¯|நாடà¯à®•à®³à¯}}) அமரà¯à®µà¯à®•à®³à®¿à®Ÿà¯ˆà®¯à¯‡ நினைவில௠வைதà¯à®¤à®¿à®°à¯à®•à¯à®•à®µà¯à®®à¯.',
-'securelogin-stick-https' => 'பà¯à®•à¯à®ªà®¤à®¿à®•à¯ˆà®•à¯à®•à¯à®ªà¯ பிறகà¯à®®à¯ HTTPS-இலேயே இரà¯à®•à¯à®•à®µà¯à®®à¯',
+'userlogin-remembermypassword' => 'இடà¯à®ªà®¤à®¿à®¨à¯à®¤à¯‡ இரà¯à®•à¯à®•à®µà®¿à®Ÿà®µà¯à®®à¯',
+'userlogin-signwithsecure' => 'பாதà¯à®•à®¾à®ªà¯à®ªà®¾à®© தொடரà¯à®ªà¯ˆ உபயோகிகà¯à®•à®µà¯à®®à¯',
'yourdomainname' => 'உஙà¯à®•à®³à¯ உரிமைபà¯à®ªà®°à®ªà¯à®ªà¯:',
'password-change-forbidden' => 'நீஙà¯à®•à®³à¯ விகà¯à®•à®¿à®•à®³à®¿à®²à¯ கடவà¯à®šà¯ சொறà¯à®•à®³à¯ˆ மாறà¯à®± à®®à¯à®Ÿà®¿à®¯à®¾à®¤à¯',
'externaldberror' => 'வெளி உறà¯à®¤à®¿à®ªà¯à®ªà®Ÿà¯à®¤à¯à®¤à®²à®¿à®²à¯ à®à®±à¯à®ªà®Ÿà¯à®Ÿ தவற௠காரணமாக உஙà¯à®•à®³à¯ வெளி கணகà¯à®•à¯ˆ இறà¯à®±à¯ˆà®ªà¯à®ªà®Ÿà¯à®¤à¯à®¤ à®®à¯à®Ÿà®¿à®¯à®¾à®¤à¯.',
@@ -506,18 +518,41 @@ MySQL returned error "$3: $4".',
'logout' => 'விடà¯à®ªà®¤à®¿à®•à¯ˆ',
'userlogout' => 'விடà¯à®ªà®¤à®¿à®•à¯ˆ',
'notloggedin' => 'பà¯à®•à¯à®ªà®¤à®¿à®•à¯ˆ செயà¯à®¯à®ªà¯à®ªà®Ÿà®µà®¿à®²à¯à®²à¯ˆ',
+'userlogin-noaccount' => 'பயனர௠கணகà¯à®•à¯ இலà¯à®²à¯ˆà®¯à®¾?',
+'userlogin-joinproject' => 'இணைக {{SITENAME}}',
'nologin' => "பயனர௠கணகà¯à®•à¯ இலà¯à®²à¯ˆà®¯à®¾? '''$1'''.",
'nologinlink' => 'கணகà¯à®•à¯ ஒனà¯à®±à¯ˆ உரà¯à®µà®¾à®•à¯à®•à®µà¯à®®à¯',
'createaccount' => 'பà¯à®¤à®¿à®¯ கணகà¯à®•à¯ˆ உரà¯à®µà®¾à®•à¯à®•à¯',
'gotaccount' => "à®à®±à¯à®•à®©à®µà¯‡ பயனர௠கணகà¯à®•à¯ உளà¯à®³à®¤à®¾? '''$1'''.",
'gotaccountlink' => 'பà¯à®•à¯à®ªà®¤à®¿à®•à¯ˆ',
'userlogin-resetlink' => 'உஙà¯à®•à®³à¯ பà¯à®•à¯à®ªà®¤à®¿à®•à¯ˆà®•à¯ கà¯à®±à®¿à®ªà¯à®ªà¯à®•à®³à¯ˆ மறநà¯à®¤à¯à®µà®¿à®Ÿà¯à®Ÿà¯€à®°à¯à®•à®³à®¾?',
+'userlogin-resetpassword-link' => 'உஙà¯à®•à®³à¯ கடவà¯à®šà¯à®šà¯Šà®²à¯ மறநà¯à®¤à¯à®µà®¿à®Ÿà¯à®Ÿà®¤à®¾?',
+'helplogin-url' => 'Help:பà¯à®•à¯à®ªà®¤à®¿à®•à¯ˆ',
+'userlogin-helplink' => '[[{{MediaWiki:helplogin-url}}|பà¯à®•à¯à®ªà®¤à®¿à®µà®¤à®±à¯à®•à®¾à®© உதவி]]',
+'createacct-join' => 'உஙà¯à®•à®³à®¿à®©à¯ தகவலை கீழிடவà¯à®®à¯',
+'createacct-another-join' => 'கீழே பà¯à®¤à®¿à®¯ கணகà¯à®•à®¿à®±à¯à®•à®¾à®© தகவலà¯à®•à®³à¯ˆ உளà¯à®³à®¿à®Ÿà®µà¯à®®à¯.',
+'createacct-emailrequired' => 'மினà¯à®©à®žà¯à®šà®²à¯ à®®à¯à®•à®µà®°à®¿',
+'createacct-emailoptional' => 'மினà¯à®©à®žà¯à®šà®²à¯ à®®à¯à®•à®µà®°à®¿ (விரà¯à®ªà¯à®ªà®¤à¯à®¤à¯‡à®°à¯à®µà¯)',
+'createacct-email-ph' => 'உஙà¯à®•à®³à¯ மினà¯à®©à®žà¯à®šà®²à¯ à®®à¯à®•à®µà®°à®¿à®¯à¯ˆ உளà¯à®³à®¿à®Ÿà¯à®•',
+'createacct-another-email-ph' => 'உஙà¯à®•à®³à¯ மினà¯à®©à®žà¯à®šà®²à¯ à®®à¯à®•à®µà®°à®¿à®¯à¯ˆ உளà¯à®³à®¿à®Ÿà¯à®•',
'createaccountmail' => 'தறà¯à®•à®¾à®²à®¿à®•à®®à®¾à®• எழà¯à®¨à¯à®¤à®®à®¾à®© ஒர௠கடவà¯à®šà¯à®šà¯Šà®²à¯à®²à¯ˆ பயனà¯à®ªà®Ÿà¯à®¤à¯à®¤à¯à®•, அதை கà¯à®±à®¿à®¤à¯à®¤à¯à®³à¯à®³ மினà¯à®©à®žà¯à®šà®²à¯à®•à¯à®•à¯ அனà¯à®ªà¯à®ªà¯à®•',
+'createacct-realname' => 'உணà¯à®®à¯ˆà®ªà¯ பெயர௠(விரà¯à®ªà¯à®ªà®¤à¯à®¤à¯‡à®°à¯à®µà¯)',
'createaccountreason' => 'காரணமà¯:',
+'createacct-reason' => 'காரணமà¯',
+'createacct-reason-ph' => 'தாஙà¯à®•à®³à¯ à®à®©à¯ மறà¯à®±à¯Šà®°à¯ கணகà¯à®•à¯ˆà®¤à¯ தà¯à®µà®™à¯à®•à¯à®•à®¿à®±à¯€à®°à¯à®•à®³à¯?',
+'createacct-captcha' => 'பாதà¯à®•à®¾à®ªà¯à®ªà¯ சோதனை',
+'createacct-imgcaptcha-ph' => 'மேலே காணà¯à®®à¯ சொறà¯à®•à®³à¯ˆ உளà¯à®³à®¿à®Ÿà¯à®•',
+'createacct-submit' => 'உஙà¯à®•à®³à¯ கணகà¯à®•à¯ˆ உரà¯à®µà®¾à®•à¯à®•à¯à®•',
+'createacct-another-submit' => 'மறà¯à®±à¯Šà®°à¯ கணகà¯à®•à¯ ஒனà¯à®±à¯ˆ உரà¯à®µà®¾à®•à¯à®•à®µà¯à®®à¯',
+'createacct-benefit-heading' => '{{SITENAME}} தஙà¯à®•à®³à¯ˆà®ªà¯ போனà¯à®±à¯‹à®°à¯à®•à®³à®¾à®²à¯ உரà¯à®µà®¾à®•à¯à®•à®ªà¯à®ªà®Ÿà¯à®Ÿà®¤à¯',
+'createacct-benefit-body1' => '{{PLURAL:$1|தொகà¯à®ªà¯à®ªà¯|தொகà¯à®ªà¯à®ªà¯à®•à®³à¯}}',
+'createacct-benefit-body2' => '{{PLURAL:$1|பகà¯à®•à®®à¯|பகà¯à®•à®™à¯à®•à®³à¯}}',
+'createacct-benefit-body3' => 'அணà¯à®®à¯ˆà®¯ {{PLURAL:$1|பஙà¯à®•à®³à®¿à®ªà¯à®ªà®¾à®³à®°à¯|பஙà¯à®•à®³à®¿à®ªà¯à®ªà®¾à®³à®°à¯à®•à®³à¯}}',
'badretype' => 'நீஙà¯à®•à®³à¯ பதிநà¯à®¤ கடவà¯à®šà¯à®šà¯Šà®±à¯à®•à®³à¯ பொரà¯à®¨à¯à®¤à®µà®¿à®²à¯à®²à¯ˆ.',
'userexists' => 'உளà¯à®³à®¿à®Ÿà¯à®Ÿ பயனரà¯à®ªà¯†à®¯à®°à¯ à®à®±à¯à®•à®©à®µà¯‡ உபயோகதà¯à®¤à®¿à®²à¯ உளà¯à®³à®¤à¯.
தயவà¯à®•à¯‚à®°à¯à®¨à¯à®¤à¯ வேற௠பெயரை தேரà¯à®¨à¯à®¤à¯†à®Ÿà¯à®•à¯à®•à®µà¯à®®à¯.',
'loginerror' => 'பà¯à®•à¯à®ªà®¤à®¿à®•à¯ˆà®¤à¯ தவறà¯',
+'createacct-error' => 'கணகà¯à®•à¯ உரà¯à®µà®¾à®•à¯à®•à¯à®¤à®²à®¿à®²à¯ பிழை',
'createaccounterror' => 'இநà¯à®¤ கணகà¯à®•à¯ˆ உரà¯à®µà®¾à®•à¯à®• à®®à¯à®Ÿà®¿à®¯à®µà®¿à®²à¯à®²à¯ˆ: $1',
'nocookiesnew' => '{{SITENAME}} தளதà¯à®¤à¯à®•à¯à®•à®¾à®© உஙà¯à®•à®³à¯ பயனர௠கணகà¯à®•à¯ உரà¯à®µà®¾à®•à¯à®•à®ªà¯à®ªà®Ÿà¯à®Ÿà¯à®³à¯à®³à®¤à¯, ஆனால௠நீஙà¯à®•à®³à¯ பà¯à®•à¯à®ªà®¤à®¿à®•à¯ˆ செயà¯à®¯à®µà®¿à®²à¯à®²à¯ˆ. பயனரà¯à®•à®³à¯ˆà®ªà¯ பà¯à®•à¯à®ªà®¤à®¿à®•à¯ˆ செயà¯à®¯ {{SITENAME}} தளம௠ஞாபகிகளைப௠(கà¯à®•à¯à®•à®¿à®•à®³à¯) பயனà¯à®ªà®Ÿà¯à®¤à¯à®¤à¯à®•à®¿à®±à®¤à¯. நீஙà¯à®•à®³à¯ ஞாபகிகளைச௠செயலறà¯à®±à®µà¯ˆà®¯à®¾à®•à¯à®•à®¿à®¯à¯à®³à¯à®³à¯€à®°à¯à®•à®³à¯. தயவà¯à®šà¯†à®¯à¯à®¤à¯ அவறà¯à®±à¯ˆà®šà¯ செயறà¯à®ªà®Ÿà¯à®¤à¯à®¤à®¿à®¯à®ªà¯ பின௠உஙà¯à®•à®³à¯ பà¯à®¤à®¿à®¯ பயனர௠பெயரà¯à®Ÿà®©à¯à®®à¯, கடவà¯à®šà¯ சொலà¯à®²à¯à®Ÿà®©à¯à®®à¯ பà¯à®•à¯à®ªà®¤à®¿à®•à¯ˆ செயà¯à®¯à¯à®™à¯à®•à®³à¯.',
'nocookieslogin' => '{{SITENAME}} தளம௠பயனரà¯à®•à®³à¯ˆà®ªà¯ பà¯à®•à¯à®ªà®¤à®¿à®•à¯ˆ செயà¯à®µà®¤à®±à¯à®•à¯ ஞாபகிகளைப௠(கà¯à®•à¯à®•à®¿à®•à®³à¯) பயனà¯à®ªà®Ÿà¯à®¤à¯à®¤à¯à®•à®¿à®±à®¤à¯. நீஙà¯à®•à®³à¯ ஞாபகிகளைச௠செயலிழகà¯à®•à®šà¯ செயà¯à®¤à¯à®³à¯à®³à¯€à®°à¯à®•à®³à¯. தயவà¯à®šà¯†à®¯à¯à®¤à¯ அவறà¯à®±à¯ˆà®šà¯ செயறà¯à®ªà®¾à®Ÿà¯à®³à¯à®³à®¤à®¾à®•à¯à®•à®¿à®¤à¯ திரà¯à®®à¯à®ªà®µà¯à®®à¯ à®®à¯à®¯à®²à¯à®™à¯à®•à®³à¯.',
@@ -570,12 +605,14 @@ MySQL returned error "$3: $4".',
இகà¯à®•à®£à®•à¯à®•à¯ தவறà¯à®¤à®²à®¾à®• தொடஙà¯à®•à®ªà¯à®ªà®Ÿà¯à®Ÿà®¿à®°à¯à®¨à¯à®¤à®¾à®²à¯, இதà¯à®¤à®•à®µà®²à¯ˆà®ªà¯ பà¯à®±à®•à¯à®•à®£à®¿à®•à¯à®•à®²à®¾à®®à¯.',
'usernamehasherror' => "பயனர௠பெயரில௠'#' எழà¯à®¤à¯à®¤à¯ˆà®ªà¯ பயனà¯à®ªà®Ÿà¯à®¤à¯à®¤ à®®à¯à®Ÿà®¿à®¯à®¾à®¤à¯",
-'login-throttled' => 'தாஙà¯à®•à®³à¯ பலமà¯à®±à¯ˆ தறà¯à®ªà¯‹à®¤à¯ பà¯à®•à¯à®ªà®¤à®¿à®•à¯ˆ செயà¯à®¯ à®®à¯à®¯à®±à¯à®šà®¿ செயà¯à®¤à¯à®³à¯à®³à¯€à®°à¯à®•à®³à¯.
+'login-throttled' => 'தாஙà¯à®•à®³à¯ மிக அணà¯à®®à¯ˆà®¯à®¿à®²à¯ பலமà¯à®±à¯ˆ பà¯à®•à¯à®ªà®¤à®¿à®•à¯ˆ செயà¯à®¯ à®®à¯à®¯à®±à¯à®šà®¿ செயà¯à®¤à¯à®³à¯à®³à¯€à®°à¯à®•à®³à¯.
-அடà¯à®¤à¯à®¤à®ªà®Ÿà®¿à®¯à®¾à®• à®®à¯à®¯à®±à¯à®šà®¿ செயà¯à®µà®¤à®±à¯à®•à¯ à®®à¯à®©à¯ சிறித௠நேரம௠காதà¯à®¤à®¿à®°à¯à®•à¯à®•à®µà¯à®®à¯.',
+மீணà¯à®Ÿà¯à®®à¯ à®®à¯à®¯à®±à¯à®šà®¿à®•à¯à®•à¯à®®à¯ à®®à¯à®©à¯ $1 காதà¯à®¤à®¿à®°à¯à®•à¯à®•à®µà¯à®®à¯.',
'login-abort-generic' => 'உஙà¯à®•à®³à¯ உளà¯à®¨à¯à®´à¯ˆà®µà¯ தோலà¯à®µà®¿à®¯à¯à®±à¯à®±à®¤à¯ - Aborted',
'loginlanguagelabel' => 'மொழி: $1',
'suspicious-userlogout' => 'உஙà¯à®•à®³à¯ விடà¯à®ªà®¤à®¿à®•à¯ˆ கோரிகà¯à®•à¯ˆ மறà¯à®•à¯à®•à®ªà¯à®ªà®Ÿà¯à®Ÿà®¤à¯ à®à®©à¯†à®©à¯à®±à®¾à®²à¯ அத௠அறà¯à®ªà®Ÿà¯à®Ÿ உலாவி அலà¯à®²à®¤à¯ மாறà¯à®±à¯ இடைகà¯à®•à®¿à®Ÿà®™à¯à®•à®¿à®¯à®¾à®²à¯ அனà¯à®ªà¯à®ªà®ªà¯à®ªà®Ÿà¯à®Ÿà¯à®³à¯à®³à®¤à¯.',
+'createacct-another-realname-tip' => 'உணà¯à®®à¯ˆà®¯à®¾à®© பெயர௠கடà¯à®Ÿà®¾à®¯à®®à®±à¯à®±à®¤à¯.
+நீஙà¯à®•à®³à¯ இதை கொடà¯à®¤à¯à®¤à®¾à®²à¯ உஙà¯à®•à®³à¯ ஆகà¯à®•à®™à¯à®•à®³à¯à®•à¯à®•à®¾à®© உரிமையளிபà¯à®ªà¯à®•à®³à®¿à®©à¯ போத௠இத௠பயனà¯à®ªà®Ÿà¯à®®à¯.',
# Email sending
'php-mail-error-unknown' => "PHP 's mail() செயலà¯à®ªà®¾à®Ÿà¯à®Ÿà®¿à®²à¯ அறியபà¯à®ªà®Ÿà®¾à®¤ பிழை.",
@@ -590,7 +627,7 @@ MySQL returned error "$3: $4".',
'newpassword' => 'பà¯à®¤à®¿à®¯ கடவà¯à®šà¯à®šà¯Šà®²à¯:',
'retypenew' => 'பà¯à®¤à®¿à®¯ கடவà¯à®šà¯à®šà¯Šà®²à¯à®²à¯ˆ மீணà¯à®Ÿà¯à®®à¯ தடà¯à®Ÿà®šà¯à®šà®¿à®Ÿà¯',
'resetpass_submit' => 'கடவà¯à®šà¯à®šà¯Šà®²à¯à®²à¯ˆ பதிவà¯à®šà¯†à®¯à¯à®¤à¯ பà¯à®•à¯à®ªà®¤à®¿à®•à¯ˆ செயà¯',
-'resetpass_success' => 'உஙà¯à®•à®³à®¤à¯ கடவà¯à®šà¯à®šà¯Šà®²à¯ வெறà¯à®±à®¿à®•à®°à®®à®¾à®• மாறà¯à®±à®ªà¯à®ªà®Ÿà¯à®Ÿà¯à®³à¯à®³à®¤à¯! உஙà¯à®•à®³à¯ˆ பà¯à®•à¯à®ªà®¤à®¿à®•à¯ˆ செயà¯à®¯à®ªà¯à®ªà®Ÿà¯à®•à®¿à®±à®¤à¯...',
+'changepassword-success' => 'உஙà¯à®•à®³à®¤à¯ கடவà¯à®šà¯à®šà¯Šà®²à¯ வெறà¯à®±à®¿à®•à®°à®®à®¾à®• மாறà¯à®±à®ªà¯à®ªà®Ÿà¯à®Ÿà¯à®³à¯à®³à®¤à¯!',
'resetpass_forbidden' => 'கடவà¯à®šà¯à®šà¯Šà®±à¯à®•à®³à¯ மாறà¯à®±à®ªà¯à®ªà®Ÿ à®®à¯à®Ÿà®¿à®¯à®¾à®¤à¯',
'resetpass-no-info' => 'இபà¯à®ªà®•à¯à®•à®¤à¯à®¤à¯ˆ நேரடியாக அணà¯à®•à¯à®µà®¤à®±à¯à®•à¯ நீஙà¯à®•à®³à¯ பà¯à®•à¯à®ªà®¤à®¿à®•à¯ˆ செயà¯à®¤à®¿à®°à¯à®•à¯à®•à®µà¯‡à®£à¯à®Ÿà¯à®®à¯.',
'resetpass-submit-loggedin' => 'கடவà¯à®šà¯à®šà¯Šà®²à¯à®²à¯ˆ மாறà¯à®±à¯',
@@ -601,10 +638,8 @@ MySQL returned error "$3: $4".',
# Special:PasswordReset
'passwordreset' => 'கடவà¯à®šà¯à®šà¯Šà®²à¯à®²à¯ˆ மீடà¯à®Ÿà®®à¯ˆ',
-'passwordreset-text' => 'உஙà¯à®•à®³à¯ கடவà¯à®šà¯à®šà¯Šà®²à¯à®²à¯ˆ மீடà¯à®Ÿà®®à¯ˆà®•à¯à®• இபà¯à®ªà®Ÿà®¿à®µà®¤à¯à®¤à¯ˆ பூரà¯à®¤à¯à®¤à®¿ செயà¯à®¯à®µà¯à®®à¯.',
'passwordreset-legend' => 'கடவà¯à®šà¯à®šà¯Šà®²à¯à®²à¯ˆ மீடà¯à®Ÿà®®à¯ˆ',
'passwordreset-disabled' => 'கடவà¯à®šà¯à®šà¯Šà®²à¯ மீடà¯à®Ÿà®®à¯ˆà®ªà¯à®ªà¯ இநà¯à®¤ விகà¯à®•à®¿à®¯à®¿à®²à¯ செயலிழகà¯à®• செயà¯à®¯à®ªà¯à®ªà®Ÿà¯à®Ÿà¯à®³à¯à®³à®¤à¯.',
-'passwordreset-pretext' => '{{PLURAL:$1|| தரவ௠பகà¯à®¤à®¿ ஒனà¯à®±à¯ˆ கீழே உளà¯à®³à®¿à®Ÿà¯}}',
'passwordreset-username' => 'பயனர௠பெயரà¯:',
'passwordreset-domain' => 'இணையதள à®®à¯à®•à®µà®°à®¿:',
'passwordreset-capture' => 'விளைவ௠மினà¯à®©à®žà¯à®šà®²à¯ˆ காணà¯',
@@ -629,7 +664,7 @@ $2
தறà¯à®•à®¾à®²à®¿à®•à®•à¯ கடவà¯à®šà¯à®šà¯Šà®²à¯: $2',
'passwordreset-emailsent' => 'கடவà¯à®šà¯à®šà¯Šà®²à¯ மீடà¯à®Ÿà®®à¯ˆà®•à¯à®•à¯à®®à¯ மினà¯à®©à®žà¯à®šà®²à¯ அனà¯à®ªà¯à®ªà®ªà¯à®ªà®Ÿà¯à®Ÿà®¤à¯.',
'passwordreset-emailsent-capture' => 'கீழே காணà¯à®ªà®¿à®•à¯à®•à®ªà¯à®ªà®Ÿà¯à®Ÿà¯à®³à¯à®³à®¤à¯ போல௠கடவà¯à®šà¯à®šà¯Šà®²à¯ மீடà¯à®Ÿà®®à¯ˆà®•à¯à®•à¯à®®à¯ மினà¯à®©à®žà¯à®šà®²à¯ அனà¯à®ªà¯à®ªà®ªà¯à®ªà®Ÿà¯à®Ÿà®¤à¯.',
-'passwordreset-emailerror-capture' => 'நினைவà¯à®ªà®Ÿà¯à®¤à¯à®¤à®¿ மினà¯à®©à®žà¯à®šà®²à¯ உரà¯à®µà®¾à®•à¯à®•à®ªà¯à®ªà®Ÿà¯à®Ÿà¯à®µà®¿à®Ÿà¯à®Ÿà®¤à¯,அத௠கீழே காடà¯à®Ÿà®ªà¯à®ªà®Ÿà¯à®Ÿà¯à®³à¯à®³à®¤à¯, ஆனால௠பயனீடà¯à®Ÿà®¾à®³à®°à¯à®•à¯à®•à¯ அனà¯à®ªà¯à®ªà¯à®µà®¤à¯ தோலà¯à®µà®¿à®¯à®Ÿà¯ˆà®¨à¯à®¤à®¤à¯:$1',
+'passwordreset-emailerror-capture' => 'கடவà¯à®šà¯à®šà¯Šà®²à¯ மீடà¯à®Ÿà®®à¯ˆà®•à¯à®•à¯à®®à¯ மினà¯à®©à®žà¯à®šà®²à¯ உரà¯à®µà®¾à®•à¯à®•à®ªà¯à®ªà®Ÿà¯à®Ÿà¯à®µà®¿à®Ÿà¯à®Ÿà®¤à¯, அத௠கீழே காடà¯à®Ÿà®ªà¯à®ªà®Ÿà¯à®Ÿà¯à®³à¯à®³à®¤à¯, ஆனால௠பயனீடà¯à®Ÿà®¾à®³à®°à¯à®•à¯à®•à¯ அனà¯à®ªà¯à®ªà¯à®µà®¤à¯ தோலà¯à®µà®¿à®¯à®Ÿà¯ˆà®¨à¯à®¤à®¤à¯:$1',
# Special:ChangeEmail
'changeemail' => 'மினà¯à®©à®žà¯à®šà®²à¯ à®®à¯à®•à®µà®°à®¿à®¯à¯ˆ மாறà¯à®±à¯',
@@ -824,6 +859,7 @@ $1 எனà¯à®®à¯ பயனரையோ வேற௠[[{{MediaWiki:Grouppage-sy
இத௠நீகà¯à®•à®ªà¯à®ªà®Ÿà¯à®Ÿà®¤à®¾à®• இரà¯à®•à¯à®•à®²à®¾à®®à¯.',
'edit-conflict' => 'à®®à¯à®°à®£à¯à®ªà®¾à®Ÿà¯à®•à®³à¯ˆà®¤à¯ தொகà¯à®•à¯à®•à®µà¯à®®à¯.',
'edit-no-change' => 'வாசகஙà¯à®•à®³à¯à®•à¯à®•à¯ எநà¯à®¤ மாறà¯à®±à®®à¯à®®à¯ செயà¯à®¯à®ªà¯à®ªà®Ÿà®µà®¿à®²à¯à®²à¯ˆ எனà¯à®ªà®¤à®©à®¾à®²à¯ உஙà¯à®•à®³à¯ தொகà¯à®ªà¯à®ªà¯ பà¯à®±à®•à¯à®•à®£à®¿à®•à¯à®•à®ªà¯à®ªà®Ÿà¯à®Ÿà®¤à¯.',
+'postedit-confirmation' => 'உஙà¯à®•à®³à®¤à¯ தொகà¯à®ªà¯à®ªà¯ சேமிகà¯à®•à®ªà¯à®ªà®Ÿà¯à®Ÿà®¤à¯.',
'edit-already-exists' => 'பà¯à®¤à®¿à®¯ பகà¯à®•à®®à¯Šà®©à¯à®±à¯ˆ உரà¯à®µà®¾à®•à¯à®• à®®à¯à®Ÿà®¿à®¯à®¾à®¤à¯.
இபà¯à®ªà®•à¯à®•à®®à¯ à®à®±à¯à®•à®©à®µà¯‡ உளà¯à®³à®¤à¯.',
'defaultmessagetext' => 'இயலà¯à®ªà®¿à®°à¯à®ªà¯à®ªà¯ தகவல௠உரை',
@@ -1042,6 +1078,7 @@ $1",
'compareselectedversions' => 'தெரிவ௠செயà¯à®¯à®ªà¯à®ªà®Ÿà¯à®Ÿ பதிபà¯à®ªà¯à®•à¯à®•à®³à¯ˆ ஒபà¯à®ªà®¿à®Ÿà®µà¯à®®à¯',
'showhideselectedversions' => 'தெரிவ௠செயà¯à®¯à®ªà¯à®ªà®Ÿà¯à®Ÿ மாறà¯à®±à®™à¯à®•à®³à¯ˆ காடà¯à®Ÿà¯/மறை',
'editundo' => 'மீளமை',
+'diff-empty' => '(வேறà¯à®ªà®¾à®Ÿà¯ à®à®¤à¯à®®à®¿à®²à¯à®²à¯ˆ)',
'diff-multi' => '({{PLURAL:$1|ஒர௠இடைபà¯à®ªà®Ÿà¯à®Ÿ திரà¯à®¤à¯à®¤à®®à¯|$1 இடைபà¯à®ªà®Ÿà¯à®Ÿ திரà¯à®¤à¯à®¤à®™à¯à®•à®³à¯}} {{PLURAL:$2|பயனரà¯|$2 பயனரà¯à®•à®³à¯}} செயà¯à®¤à®µà¯ˆà®•à®³à¯ˆ காடà¯à®Ÿà®ªà¯à®ªà®Ÿà®µà®¿à®²à¯à®²à¯ˆ.)',
'diff-multi-manyusers' => '({{PLURAL:$2|பயனராலà¯|$2 பயனரà¯à®•à®³à®¾à®²à¯}} செயà¯à®¯à®ªà¯à®ªà®Ÿà¯à®Ÿ {{PLURAL:$1|ஒர௠இடைபà¯à®ªà®Ÿà¯à®Ÿ திரà¯à®¤à¯à®¤à®®à¯|$1 இடைபà¯à®ªà®Ÿà¯à®Ÿ திரà¯à®¤à¯à®¤à®™à¯à®•à®³à¯}} காடà¯à®Ÿà®ªà¯à®ªà®Ÿà®µà®¿à®²à¯à®²à¯ˆ.)',
@@ -1065,7 +1102,6 @@ $1",
'searchmenu-legend' => 'தேடல௠விரà¯à®ªà¯à®ªà¯',
'searchmenu-exists' => "'''\"[[:\$1]]\" எனà¯à®©à¯à®®à¯ பெயரà¯à®Ÿà¯ˆà®¯ பகà¯à®•à®®à¯ இநà¯à®¤ விகà¯à®•à®¿à®¯à®¿à®²à¯ உளà¯à®³à®¤à¯'''",
'searchmenu-new' => "'''\"[[:\$1]]\" பகà¯à®•à®¤à¯à®¤à¯ˆ இநà¯à®¤ விகà¯à®•à®¿à®¯à®¿à®²à¯ உரà¯à®µà®¾à®•à¯à®•à®µà¯à®®à¯!'''",
-'searchhelp-url' => 'Help:உதவி',
'searchmenu-prefix' => '[[Special:PrefixIndex/$1|இநà¯à®¤ à®®à¯à®©à¯à®©à¯Šà®Ÿà¯à®Ÿà¯à®Ÿà®©à¯ உலவிதà¯à®¤à¯‡à®Ÿà¯]]',
'searchprofile-articles' => 'உளà¯à®³à®Ÿà®•à¯à®•à®ªà¯ பகà¯à®•à®™à¯à®•à®³à®¿à®©à¯ படà¯à®Ÿà®¿à®¯à®²à¯',
'searchprofile-project' => 'உதவி மறà¯à®±à¯à®®à¯ திடà¯à®Ÿà®ªà¯ பகà¯à®•à®™à¯à®•à®³à¯',
@@ -1110,15 +1146,7 @@ $1",
'powersearch-togglenone' => 'à®à®¤à¯à®®à®¿à®²à¯à®²à¯ˆ',
'search-external' => 'வெளிதà¯à®¤à¯‡à®Ÿà®²à¯',
'searchdisabled' => '{{SITENAME}} தளதà¯à®¤à®¿à®©à¯ தேடல௠வசதிகள௠தறà¯à®•à®¾à®²à®¿à®•à®®à®¾à®• à®®à¯à®Ÿà®•à¯à®•à®ªà¯à®ªà®Ÿà¯à®Ÿà¯à®³à¯à®³à®¤à¯. அதà¯à®µà®°à¯ˆ நீஙà¯à®•à®³à¯ கீழேயà¯à®³à¯à®³ கூகிள௠தேடலைப௠பயனà¯à®ªà®Ÿà¯à®¤à¯à®¤à®²à®¾à®®à¯. இத௠சில சமயம௠இறà¯à®±à¯ˆà®ªà¯à®ªà®Ÿà¯à®¤à¯à®¤à®ªà¯à®ªà®Ÿà®¾à®¤à®¤à®¾à®¯à¯ இரà¯à®•à¯à®•à®•à¯à®•à¯‚டà¯à®®à¯.',
-
-# Quickbar
-'qbsettings' => 'விரைவà¯à®šà¯ சடà¯à®Ÿ அமைவà¯à®•à®³à¯',
-'qbsettings-none' => 'எதà¯à®µà¯à®®à®¿à®²à¯à®²à¯ˆ',
-'qbsettings-fixedleft' => 'நிலைதà¯à®¤ இடதà¯',
-'qbsettings-fixedright' => 'நிலைதà¯à®¤ வலதà¯',
-'qbsettings-floatingleft' => 'மிதபà¯à®ªà¯ இடதà¯',
-'qbsettings-floatingright' => 'மிதபà¯à®ªà¯ வலதà¯',
-'qbsettings-directionality' => 'உஙà¯à®•à®³à¯ மொழியைப௠படிகà¯à®•à¯à®®à¯ திசைகà¯à®•à¯ à®à®±à¯à®ª, நிறà¯à®µà®ªà¯à®ªà®Ÿà¯à®Ÿà®¤à¯',
+'search-error' => 'தேடà¯à®•à¯ˆà®¯à®¿à®²à¯ ஒர௠பிழை à®à®±à¯à®ªà®Ÿà¯à®Ÿà¯à®³à¯à®³à®¤à¯:$1',
# Preferences page
'preferences' => 'விரà¯à®ªà¯à®ªà®™à¯à®•à®³à¯',
@@ -1152,7 +1180,6 @@ $1",
'resetprefs' => 'சேமிகà¯à®•à®¾à®¤ மாறà¯à®±à®™à¯à®•à®³à¯ நீகà¯à®•à¯à®•',
'restoreprefs' => 'எலà¯à®²à¯‹à®°à¯à®•à¯à®•à¯à®®à¯ பொதà¯à®µà®¾à®© வடிவமைபà¯à®ªà¯ˆà®¤à¯ திரà¯à®®à¯à®ªà®•à¯à®•à¯Šà®£à¯à®Ÿà¯à®µà®°à®µà¯à®®à¯.',
'prefs-editing' => 'தொகà¯à®¤à¯à®¤à®²à¯',
-'prefs-edit-boxsize' => 'தொகà¯à®•à¯à®•à¯à®®à¯ சாளரதà¯à®¤à®¿à®©à¯ அளவà¯.',
'rows' => 'நிரைகள௠(கிடை வரிசைகளà¯):',
'columns' => 'நிரலà¯à®•à®³à¯',
'searchresultshead' => 'தேடà¯à®•',
@@ -1193,7 +1220,6 @@ $1",
'prefs-reset-intro' => ' இநà¯à®¤ பகà¯à®•à®¤à¯à®¤à¯ˆ பயனà¯à®ªà®Ÿà¯à®¤à¯à®¤à®¿ உஙà¯à®•à®³à¯ விரà¯à®ªà¯à®ªà®™à¯à®•à®³à¯ˆ தள இயலà¯à®ªà¯à®¨à®¿à®²à¯ˆà®•à¯à®•à¯ மீடà¯à®Ÿà®®à¯ˆà®•à¯à®•à®²à®¾à®®à¯.
இத௠செயà¯à®¯à®¾à®®à®²à¯ இரà¯à®•à¯à®• இயலாதà¯.',
'prefs-emailconfirm-label' => 'மினà¯à®©à®žà¯à®šà®²à¯ˆ உறà¯à®¤à®¿à®šà¯†à®¯à¯à®¤à®²à¯:',
-'prefs-textboxsize' => 'தொகà¯à®•à¯à®•à¯à®®à¯ சாளரதà¯à®¤à®¿à®©à¯ அளவà¯',
'youremail' => 'மினà¯à®©à®žà¯à®šà®²à¯:',
'username' => '{{GENDER:$1|பயனர௠பெயரà¯}}:',
'uid' => '{{GENDER:$1|User}} ID:',
@@ -1225,6 +1251,8 @@ $1",
'prefs-dateformat' => 'தேதியின௠வடிவமைபà¯à®ªà¯',
'prefs-timeoffset' => 'நேர விதà¯à®¤à®¿à®¯à®¾à®šà®®à¯',
'prefs-advancedediting' => 'மேமà¯à®ªà®Ÿà¯à®Ÿ விரà¯à®ªà¯à®ªà®¤à¯à®¤à¯‡à®°à¯à®µà¯à®•à®³à¯',
+'prefs-editor' => 'தொகà¯à®ªà¯à®ªà®¾à®³à®°à¯',
+'prefs-preview' => 'à®®à¯à®©à¯à®¤à¯‹à®±à¯à®±à®®à¯',
'prefs-advancedrc' => 'மேமà¯à®ªà®Ÿà¯à®Ÿ விரà¯à®ªà¯à®ªà®¤à¯à®¤à¯‡à®°à¯à®µà¯à®•à®³à¯',
'prefs-advancedrendering' => 'மேமà¯à®ªà®Ÿà¯à®Ÿ விரà¯à®ªà¯à®ªà®¤à¯à®¤à¯‡à®°à¯à®µà¯à®•à®³à¯',
'prefs-advancedsearchoptions' => 'மேமà¯à®ªà®Ÿà¯à®Ÿ விரà¯à®ªà¯à®ªà®¤à¯à®¤à¯‡à®°à¯à®µà¯à®•à®³à¯',
@@ -1434,7 +1462,6 @@ $1",
'recentchangeslinked-feed' => 'தொடரà¯à®ªà®¾à®© மாறà¯à®±à®™à¯à®•à®³à¯',
'recentchangeslinked-toolbox' => 'தொடரà¯à®ªà®¾à®© மாறà¯à®±à®™à¯à®•à®³à¯',
'recentchangeslinked-title' => '"$1" பகà¯à®•à®¤à¯à®¤à¯à®Ÿà®©à¯ தொடரà¯à®ªà¯à®Ÿà¯ˆà®¯ மாறà¯à®±à®™à¯à®•à®³à¯',
-'recentchangeslinked-noresult' => 'கà¯à®±à®¿à®¤à¯à®¤ நேரதà¯à®¤à®¿à®²à¯ இபà¯à®ªà®•à¯à®•à®¤à¯à®¤à¯à®Ÿà®©à¯ இணைகà¯à®•à®ªà¯à®ªà®Ÿà¯à®Ÿ பகà¯à®•à®™à¯à®•à®³à®¿à®²à¯ மாறà¯à®±à®™à¯à®•à®³à¯ à®à®¤à¯à®®à®¿à®²à¯à®²à¯ˆ.',
'recentchangeslinked-summary' => 'இநà¯à®¤ சிறபà¯à®ªà¯à®ªà¯ பகà¯à®•à®®à¯ அணà¯à®®à¯ˆà®¯ மாறà¯à®±à®™à¯à®•à®³à¯à®•à¯à®•à¯à®šà¯ செனà¯à®±à¯ இநà¯à®¤à®•à¯ கடà¯à®Ÿà¯à®°à¯ˆà®•à¯à®•à®¾à®© மாறà¯à®±à®™à¯à®•à®³à¯ˆà®¤à¯ தேடà¯à®µà®¤à¯ˆà®¤à¯ தவிரà¯à®¤à¯à®¤à¯, இநà¯à®¤à®•à¯ கடà¯à®Ÿà¯à®°à¯ˆà®¯à¯à®Ÿà®©à¯ தொடரà¯à®ªà¯à®Ÿà¯ˆà®¯ (அலà¯à®²à®¤à¯ சிறபà¯à®ªà¯à®ªà¯ படà¯à®Ÿà®¿à®¯à®²à®¿à®²à¯à®³à¯à®³ à®…à®™à¯à®•à®¤à¯à®¤à®µà®°à¯à®•à®³à¯à®•à¯à®•à¯) அணà¯à®®à¯ˆà®¯ மாறà¯à®±à®™à¯à®•à®³à¯ˆ மடà¯à®Ÿà¯à®®à¯ படà¯à®Ÿà®¿à®¯à®²à®¿à®Ÿà¯à®•à®¿à®±à®¤à¯.இஙà¯à®•à¯ [[Special:Watchlist|உஙà¯à®•à®³à¯ கவனிபà¯à®ªà¯à®ªà¯ படà¯à®Ÿà®¿à®¯à®²à®¿à®²à¯]] உளà¯à®³ பகà¯à®•à®™à¯à®•à®³à¯ தடிதà¯à®¤ எழà¯à®¤à¯à®¤à¯à®•à¯à®•à®³à®¿à®²à¯ உளà¯à®³à®© எனà¯à®ªà®¤à¯ˆà®•à¯ கவனதà¯à®¤à®¿à®²à¯ கொளà¯à®³à®µà¯à®®à¯.',
'recentchangeslinked-page' => 'பகà¯à®•à®ªà¯ பெயரà¯:',
'recentchangeslinked-to' => 'இதறà¯à®•à¯à®ªà¯ பதிலாக இபà¯à®ªà®•à¯à®•à®¤à¯à®¤à®¿à®©à¯ˆ இணைதà¯à®¤ பகà¯à®•à®™à¯à®•à®³à®¿à®©à¯ மாறà¯à®±à®™à¯à®•à®³à¯ˆà®•à¯ காடà¯à®Ÿà®µà¯à®®à¯',
@@ -1641,7 +1668,6 @@ $1',
'http-read-error' => 'HTTP படிபà¯à®ªà®¤à®¿à®²à¯ பிழை.',
'http-timed-out' => 'HTTP கோரியதறà¯à®•à®¾à®© நேரம௠மà¯à®Ÿà®¿à®µà®Ÿà¯ˆà®¨à¯à®¤à¯à®µà®¿à®Ÿà¯à®Ÿà®¤à¯.',
'http-curl-error' => '$1 உரலியை பெறà¯à®µà®¤à®¿à®²à¯ பிழை நேரிடà¯à®Ÿà®¤à¯',
-'http-host-unreachable' => 'இணைய à®®à¯à®•à®µà®°à®¿à®¯à¯ˆ (URL) செனà¯à®±à®Ÿà¯ˆà®¯ à®®à¯à®Ÿà®¿à®¯à®µà®¿à®²à¯à®²à¯ˆ',
'http-bad-status' => 'HTTP கோரிகà¯à®•à¯ˆà®¯à®¿à®²à¯ பிரசà¯à®šà®¿à®©à¯ˆ à®à®±à¯à®ªà®Ÿà¯à®Ÿà¯à®³à¯à®³à®¤à¯:$1 $2',
# Some likely curl errors. More could be added from <http://curl.haxx.se/libcurl/c/libcurl-errors.html>
@@ -1785,10 +1811,6 @@ $1',
'statistics-users-active-desc' => 'கடநà¯à®¤ {{PLURAL:$1|நாளà¯|$1 நாடà¯à®•à®³à®¿à®²à¯}} ஒனà¯à®±à¯ அலà¯à®²à®¤à¯ அதறà¯à®•à¯ மேறà¯à®ªà®Ÿà¯à®Ÿ செயலைச௠செயà¯à®¤ பயனரà¯à®•à®³à¯',
'statistics-mostpopular' => 'அதிகம௠பாரà¯à®•à¯à®•à®ªà¯à®ªà®Ÿà¯à®Ÿ பகà¯à®•à®™à¯à®•à®³à¯',
-'disambiguations' => 'வழிநெறிபà¯à®ªà®Ÿà¯à®¤à¯à®¤à®²à¯ பகà¯à®•à®™à¯à®•à®³à¯ˆ இணைகà¯à®•à¯à®®à¯ பகà¯à®•à®™à¯à®•à®³à¯',
-'disambiguationspage' => 'Template:பகà¯à®•à®µà®´à®¿ நெறிபà¯à®ªà®Ÿà¯à®¤à¯à®¤à®²à¯',
-'disambiguations-text' => "பினà¯à®µà®°à¯à®®à¯ பகà¯à®•à®™à¯à®•à®³à¯ '''பகà¯à®•à®µà®´à®¿ நெறிபà¯à®ªà®Ÿà¯à®¤à¯à®¤à®²à¯ பகà¯à®•à®¤à¯à®¤à¯à®•à¯à®•à¯''' இணைகà¯à®•à®ªà¯à®ªà®Ÿà¯à®Ÿà¯à®³à¯à®³à®©. மாறாக இவை பொரà¯à®¤à¯à®¤à®®à®© தலைபà¯à®ªà®¿à®±à¯à®•à¯ இணைகà¯à®•à®ªà¯à®ªà®Ÿ வேணà¯à®Ÿà¯à®®à¯. <br />[[MediaWiki:Disambiguationspage|பகà¯à®•à®µà®´à®¿ நெறிபà¯à®ªà®Ÿà¯à®¤à¯à®¤à®²à¯ பகà¯à®•à®™à¯à®•à®¤à¯à®¤à®¿à®²à¯]] உளà¯à®³ வாரà¯à®ªà¯à®ªà¯à®°à¯ இணைகà¯à®•à®ªà¯à®ªà®Ÿà¯à®Ÿ பகà¯à®•à®™à¯à®•à®³à¯ பகà¯à®•à®µà®´à®¿ நெறிபà¯à®ªà®Ÿà¯à®¤à¯à®¤à®²à¯ பகà¯à®•à®™à¯à®•à®³à¯ என௠கரà¯à®¤à®ªà¯à®ªà®Ÿà¯à®®à¯.",
-
'pageswithprop' => 'பகà¯à®•à®ªà¯ பணà¯à®ªà¯à®Ÿà¯ˆà®¯ பகà¯à®•à®™à¯à®•à®³à¯',
'pageswithprop-submit' => 'செலà¯à®•',
@@ -2026,10 +2048,9 @@ $1',
'unwatchthispage' => 'கவனிபà¯à®ªà®¤à¯ˆ நிறà¯à®¤à¯à®¤à®µà¯à®®à¯',
'notanarticle' => 'ஒர௠கடà¯à®Ÿà¯à®°à¯ˆà®ªà¯ பகà¯à®•à®®à®²à¯à®²',
'notvisiblerev' => 'திரà¯à®¤à¯à®¤à®®à¯ நீகà¯à®•à®ªà¯à®ªà®Ÿà¯à®Ÿà¯à®³à¯à®³à®¤à¯',
-'watchnochange' => 'காடà¯à®šà®¿à®ªà¯à®ªà®Ÿà¯à®¤à¯à®¤à®ªà¯à®ªà®Ÿà¯à®Ÿ கால இடைவெளியிலà¯, கவனிபà¯à®ªà®¿à®²à¯à®³à¯à®³, உஙà¯à®•à®³à¯ விடயமெதà¯à®µà¯à®®à¯ தொகà¯à®•à¯à®•à®ªà¯à®ªà®Ÿà¯à®Ÿà®¿à®°à¯à®•à¯à®•à®µà®¿à®²à¯à®²à¯ˆ.',
'watchlist-details' => 'பேசà¯à®šà¯à®ªà¯ பகà¯à®•à®™à¯à®•à®³à¯ˆà®¤à¯ தவிரà¯à®¤à¯à®¤à¯, {{PLURAL:$1|$1 பகà¯à®•à®®à¯ கவனிகà¯à®•à®ªà¯à®ªà®Ÿà¯à®Ÿà®¤à¯.|$1 பகà¯à®•à®™à¯à®•à®³à¯ கவனிகà¯à®•à®ªà¯à®ªà®Ÿà¯à®Ÿà®©.}}',
-'wlheader-enotif' => '* மினà¯à®©à®žà¯à®šà®²à¯ அறிவிதà¯à®¤à®²à¯à®•à®³à¯ செயலà¯à®ªà®Ÿà¯à®¤à¯à®¤à®ªà¯à®ªà®Ÿà¯à®Ÿà¯à®³à¯à®³à®©.',
-'wlheader-showupdated' => "* உமத௠கடைசி வரà¯à®•à¯ˆà®•à¯à®•à¯à®ªà¯ பினà¯à®©à®°à¯ மாறà¯à®±à®™à¯à®•à®³à¯ செயà¯à®¯à®ªà¯à®ªà®Ÿà¯à®Ÿ பகà¯à®•à®™à¯à®•à®³à¯ '''தடிதà¯à®¤ எழà¯à®¤à¯à®¤à¯à®•à¯à®•à®³à®¾à®²à¯''' காடà¯à®Ÿà®ªà¯à®ªà®Ÿà¯à®Ÿà¯à®³à¯à®³à®©",
+'wlheader-enotif' => 'மினà¯à®©à®žà¯à®šà®²à¯ அறிவிதà¯à®¤à®²à¯à®•à®³à¯ செயலà¯à®ªà®Ÿà¯à®¤à¯à®¤à®ªà¯à®ªà®Ÿà¯à®Ÿà¯à®³à¯à®³à®©.',
+'wlheader-showupdated' => "உமத௠கடைசி வரà¯à®•à¯ˆà®•à¯à®•à¯à®ªà¯ பினà¯à®©à®°à¯ மாறà¯à®±à®™à¯à®•à®³à¯ செயà¯à®¯à®ªà¯à®ªà®Ÿà¯à®Ÿ பகà¯à®•à®™à¯à®•à®³à¯ '''தடிதà¯à®¤ எழà¯à®¤à¯à®¤à¯à®•à¯à®•à®³à®¾à®²à¯''' காடà¯à®Ÿà®ªà¯à®ªà®Ÿà¯à®Ÿà¯à®³à¯à®³à®©",
'watchmethod-recent' => 'கவனிகà¯à®•à®ªà¯à®ªà®Ÿà¯à®•à®¿à®©à¯à®± பகà¯à®•à®™à¯à®•à®³à¯à®•à¯à®•à®¾à®•, அணà¯à®®à¯ˆà®¯ தொகà¯à®ªà¯à®ªà¯à®•à®³à¯ தேடிப௠பாரà¯à®•à¯à®•à®ªà¯à®ªà®Ÿà¯à®•à®¿à®±à®©',
'watchmethod-list' => 'அணà¯à®®à¯ˆà®¯ தொகà¯à®ªà¯à®ªà¯à®•à®³à¯à®•à¯à®•à®¾à®•, கவனிகà¯à®•à®ªà¯à®ªà®Ÿà¯à®•à®¿à®©à¯à®± பகà¯à®•à®™à¯à®•à®³à¯ தேடிப௠பாரà¯à®•à¯à®•à®ªà¯à®ªà®Ÿà¯à®•à®¿à®±à®©',
'watchlistcontains' => 'உஙà¯à®•à®³à¯ கவனிபà¯à®ªà¯à®ªà¯ படà¯à®Ÿà®¿à®¯à®²à¯ {{PLURAL:$1|ஒர௠பகà¯à®•à®¤à¯à®¤à¯ˆà®•à¯|$1 பகà¯à®•à®™à¯à®•à®³à¯ˆà®•à¯}} கொணà¯à®Ÿà¯à®³à¯à®³à®¤à¯.',
@@ -2408,12 +2429,9 @@ $1',
'ipb_blocked_as_range' => 'தவறà¯:இநà¯à®¤ à®.பி. $1 நேரடியாக தடைச௠செயà¯à®¯à®ªà¯à®ªà®Ÿà®µà®¿à®²à¯à®²à¯ˆ எனவே தடையை நீகà¯à®• à®®à¯à®Ÿà®¿à®¯à®¾à®¤à¯. இத௠$2 எனà¯à®± à®.பி. வீசà¯à®šà¯ தடைச௠செயà¯à®¯à®ªà¯à®ªà®Ÿà¯à®Ÿà®¤à®¾à®²à¯ தடைச௠செயà¯à®¯à®ªà¯à®ªà®Ÿà¯à®Ÿà¯à®³à¯à®³à®¤à¯ இவà¯à®µà¯€à®šà¯à®šà®¿à®±à¯à®•à®¾à®© தடையை நீகà¯à®• à®®à¯à®Ÿà®¿à®¯à¯à®®à¯.',
'ip_range_invalid' => 'செலà¯à®²à¯à®ªà®Ÿà®¿à®¯à®±à¯à®± à®.பி. வீசà¯à®šà¯',
'ip_range_toolarge' => '/$1 கà¯à®•à¯ பெரிய வரமà¯à®ªà¯ தடà¯à®ªà¯à®ªà¯à®•à®³à¯ அனà¯à®®à®¤à®¿à®•à¯à®•à®ªà¯à®ªà®Ÿà®µà®¿à®²à¯à®²à¯ˆ.',
-'blockme' => 'எனà¯à®©à¯ˆ தடைச௠செயà¯',
'proxyblocker' => 'மறைவணà¯à®•à¯à®•à®®à¯ (பà¯à®°à¯Šà®•à¯à®šà®¿) தடà¯à®ªà¯à®ªà®¿',
-'proxyblocker-disabled' => 'இநà¯à®¤à®šà¯ செயல௠செயலிழகà¯à®•à®šà¯ à®®à¯à®Ÿà®•à¯à®•à®ªà¯à®ªà®Ÿà¯à®Ÿà¯à®³à¯à®³à®¤à¯.',
'proxyblockreason' => 'உஙà¯à®•à®³à¯ IP à®®à¯à®•à®µà®°à®¿ தடை செயà¯à®¯à®ªà¯à®ªà®Ÿà¯à®Ÿà¯à®³à¯à®³à®¤à¯ à®à®©à¯†à®©à®¿à®²à¯ இத௠ஒர௠திறநà¯à®¤ பதிலி(proxy).
தயவà¯à®šà¯†à®¯à¯à®¤à¯ உஙà¯à®•à®³à¯ இணைய சேவை வழஙà¯à®•à¯à®ªà®µà®°à¯ˆà®¯à¯‹ அலà¯à®²à®¤à¯ உஙà¯à®•à®³à¯ நிறà¯à®µà®©à®¤à¯à®¤à®¿à®©à¯ தொழிலà¯à®¨à¯à®Ÿà¯à®ª ஆதரவையோ தொடரà¯à®ªà¯ கொளà¯à®³à®µà¯à®®à¯ மேலà¯à®®à¯ அவரà¯à®•à®³à®¿à®Ÿà®®à¯ இநà¯à®¤ கடà¯à®®à¯ˆà®¯à®¾à®© பாதà¯à®•à®¾à®ªà¯à®ªà¯ பிரசà¯à®šà®¿à®©à¯ˆ பறà¯à®±à®¿ தெரிவியà¯à®™à¯à®•à®³à¯.',
-'proxyblocksuccess' => 'வெறà¯à®±à®¿.',
'sorbsreason' => 'உஙà¯à®•à®³à¯ IP à®®à¯à®•à®µà®°à®¿ ஒர௠திறநà¯à®¤ பதிலியாக DNSBL பயனà¯à®ªà®Ÿà¯à®¤à¯à®¤à®ªà¯à®ªà®Ÿà¯à®µà®¤à®¾à®• {{SITENAME}} ல௠படà¯à®Ÿà®¿à®¯à®²à®¿à®Ÿà®ªà¯à®ªà®Ÿà¯à®Ÿà¯à®³à¯à®³à®¤à¯.',
'sorbs_create_account_reason' => 'உஙà¯à®•à®³à¯ IP à®®à¯à®•à®µà®°à®¿ ஒர௠திறநà¯à®¤ பதிலியாக DNSBL பயனà¯à®ªà®Ÿà¯à®¤à¯à®¤à®ªà¯à®ªà®Ÿà¯à®µà®¤à®¾à®• {{SITENAME}} ல௠படà¯à®Ÿà®¿à®¯à®²à®¿à®Ÿà®ªà¯à®ªà®Ÿà¯à®Ÿà¯à®³à¯à®³à®¤à¯.
உஙà¯à®•à®³à®¾à®²à¯ கணகà¯à®•à¯ˆ உரà¯à®µà®¾à®•à¯à®• இயலாதà¯.',
@@ -2707,6 +2725,7 @@ $1',
'tooltip-undo' => '"பினà¯à®µà®¾à®™à¯à®•à¯" எனà¯à®ªà®¤à¯ à®®à¯à®©à¯à®ªà¯ செயà¯à®¤ தொகà¯à®ªà¯à®ªà¯à®•à¯à®•à®³à¯ˆ இலà¯à®²à®¾à®¤à¯ செயà¯à®•à®¿à®±à®¤à¯. மேலà¯à®®à¯ தாஙà¯à®•à®³à¯ செயà¯à®¤ தொகà¯à®ªà¯à®ªà®¿à®©à¯ˆ à®®à¯à®©à¯à®¤à¯‹à®±à¯à®± நிலைகà¯à®•à¯ கொணà¯à®Ÿà¯à®µà®¨à¯à®¤à¯ காடà¯à®Ÿà¯à®®à¯. அத௠தஙà¯à®•à®³à¯à®•à¯à®•à¯à®šà¯ சிறà¯à®•à¯à®±à®¿à®ªà¯à®ªà¯à®ªà¯ பகà¯à®¤à®¿à®¯à®¿à®²à¯ அதறà¯à®•à®¾à®© காரணதà¯à®¤à¯ˆà®•à¯ கூற அனà¯à®®à®¤à®¿à®•à¯à®•à®¿à®±à®¤à¯.',
'tooltip-preferences-save' => 'விரà¯à®ªà¯à®ªà®™à¯à®•à®³à¯ˆ சேமி',
'tooltip-summary' => 'கà¯à®±à¯à®•à®¿à®¯ சà¯à®°à¯à®•à¯à®•à®¤à¯à®¤à¯ˆ உளà¯à®³à®¿à®Ÿà®µà¯à®®à¯.',
+'tooltip-iwiki' => '$1 - $2',
# Metadata
'notacceptable' => 'உஙà¯à®•à®³à®¤à¯ சேவையாளர௠வாசிகà¯à®• கூடிய விததà¯à®¤à®¿à®²à¯ இநà¯à®¤ விகà¯à®•à®¿à®¯à®¾à®² தரவà¯à®•à®³à¯ˆ வழஙà¯à®• à®®à¯à®Ÿà®¿à®¯à®¾à®¤à¯.',
@@ -2772,8 +2791,6 @@ $1',
'pageinfo-category-files' => 'கோபà¯à®ªà¯à®•à®³à®¿à®©à¯ எணà¯à®£à®¿à®•à¯à®•à¯ˆ',
# Skin names
-'skinname-standard' => 'இயலà¯à®ªà®¾à®©',
-'skinname-nostalgia' => 'பசà¯à®®à¯ˆ நினைவ௠(Nostalgia)',
'skinname-cologneblue' => 'கொலோன௠(Cologne) நீலம௠Blue',
# Patrolling
@@ -2850,6 +2867,16 @@ $1',
'ago' => '$1 à®®à¯à®©à¯à®ªà¯',
'just-now' => 'சடà¯à®¤à®¿à®¯à®¿à®²à¯.',
+# Human-readable timestamps
+'monday-at' => 'திஙà¯à®•à®³à¯ $1 மணிகà¯à®•à¯',
+'tuesday-at' => 'செவà¯à®µà®¾à®¯à¯ $1 மணிகà¯à®•à¯',
+'wednesday-at' => 'பà¯à®¤à®©à¯ $1 மணிகà¯à®•à¯',
+'thursday-at' => 'வியாழன௠$1 மணிகà¯à®•à¯',
+'friday-at' => 'வெளà¯à®³à®¿ $1 மணிகà¯à®•à¯',
+'saturday-at' => 'சனி $1 மணிகà¯à®•à¯',
+'sunday-at' => 'ஞாயிற௠$1 மணிகà¯à®•à¯',
+'yesterday-at' => 'நேறà¯à®±à¯ $1 மணிகà¯à®•à¯',
+
# Bad image list
'bad_image_list' => 'à®®à¯à®±à¯ˆ பினà¯à®µà®°à¯à®®à®¾à®±à¯:
@@ -2877,7 +2904,7 @@ $1',
* gpslongitude
* gpsaltitude',
-# EXIF tags
+# Exif tags
'exif-imagewidth' => 'அகலமà¯',
'exif-imagelength' => 'உயரமà¯',
'exif-bitspersample' => 'ஒவà¯à®µà¯Šà®°à¯ உறà¯à®ªà¯à®ªà®¿à®©à¯à®ªà®Ÿà®¿ பிடà¯à®•à®³à¯.',
@@ -3054,7 +3081,7 @@ $1',
'exif-originalimageheight' => 'சரிசெயà¯à®¯à®ªà¯à®ªà®Ÿà¯à®®à¯ à®®à¯à®©à¯ படதà¯à®¤à®¿à®©à¯ உயரமà¯',
'exif-originalimagewidth' => 'சரிசெயà¯à®¯à®ªà¯à®ªà®Ÿà¯à®®à¯ à®®à¯à®©à¯ படதà¯à®¤à®¿à®©à¯ அகலமà¯',
-# EXIF attributes
+# Exif attributes
'exif-compression-1' => 'சà¯à®°à¯à®•à¯à®•à®ªà¯à®ªà®Ÿà®¾à®¤',
'exif-copyrighted-true' => 'பதிபà¯à®ªà¯à®°à®¿à®®à¯ˆà®ªà¯à®ªà®Ÿà¯à®Ÿà®¤à¯',
@@ -3431,7 +3458,6 @@ $5
'version-other' => 'பிறரà¯',
'version-mediahandlers' => 'ஊடக கையாளிகளà¯',
'version-hooks' => 'கொகà¯à®•à®¿à®•à®³à¯',
-'version-extension-functions' => 'நீடà¯à®šà®¿ செயறà¯à®ªà®¾à®Ÿà¯à®•à®³à¯',
'version-parser-extensiontags' => 'இலகà¯à®•à®£à®ªà¯ பாகà¯à®ªà®Ÿà¯à®¤à¯à®¤à®¿ நீடà¯à®šà®¿ கà¯à®±à®¿à®šà¯à®šà¯Šà®±à¯à®•à®³à¯',
'version-parser-function-hooks' => 'இலகà¯à®•à®£à®ªà¯ பாகà¯à®ªà®Ÿà¯à®¤à¯à®¤à®¿ செயறà¯à®ªà®¾à®Ÿà¯à®Ÿà¯ கொகà¯à®•à®¿à®•à®³à¯',
'version-hook-name' => 'கொகà¯à®•à®¿à®¯à®¿à®©à¯ பெயரà¯',
@@ -3450,12 +3476,11 @@ $5
'version-entrypoints-header-entrypoint' => 'நà¯à®´à¯ˆà®µà¯ பà¯à®³à¯à®³à®¿',
'version-entrypoints-header-url' => 'உரலி (URL)',
-# Special:FilePath
-'filepath' => 'கோபà¯à®ªà¯ வழி',
-'filepath-page' => 'கோபà¯à®ªà¯:',
-'filepath-submit' => 'செலà¯',
-'filepath-summary' => 'இசà¯à®šà®¿à®±à®ªà¯à®ªà¯à®ªà¯ பகà¯à®•à®®à¯ கோபà¯à®ªà¯ ஒனà¯à®±à¯à®•à¯à®•à®¾à®© à®®à¯à®´à¯à®®à¯ˆà®¯à®¾à®© à®®à¯à®•à®µà®°à®¿à®¯à¯ˆ பெறà¯à®±à¯à®•à¯ கொடà¯à®•à¯à®•à®¿à®±à®¤à¯.
-படிமஙà¯à®•à®³à¯ அவறà¯à®±à®¿à®©à¯ à®®à¯à®´à¯ அளவில௠காடà¯à®Ÿà®ªà®Ÿà¯à®µà®¤à¯‹à®Ÿà¯ à®à®©à¯ˆà®¯ கோபà¯à®ªà¯à®•à®³à¯ அவறà¯à®±à¯à®•à¯à®•à®¾à®© மெனà¯à®ªà¯Šà®°à¯à®³à®¿à®²à¯ நேரடியாகத௠திறகà¯à®•à®ªà¯à®ªà®Ÿà¯à®®à¯.',
+# Special:Redirect
+'redirect-submit' => 'செலà¯à®•',
+'redirect-lookup' => 'கவனிகà¯à®•à®µà¯à®®à¯:',
+'redirect-file' => 'கோபà¯à®ªà®¿à®©à¯ பெயரà¯',
+'redirect-not-exists' => 'மதிபà¯à®ªà¯ காணபà¯à®ªà¯†à®±à®µà®¿à®²à¯à®²à¯ˆ',
# Special:FileDuplicateSearch
'fileduplicatesearch' => 'நகல௠கோபà¯à®ªà¯à®•à®³à¯ˆà®¤à¯ தேடà¯à®•',
@@ -3510,6 +3535,8 @@ $5
'tags-display-header' => 'கவனிபà¯à®ªà¯à®ªà¯ படà¯à®Ÿà®¿à®¯à®²à®¿à®²à¯ தெரியà¯à®®à¯ பெயரà¯',
'tags-description-header' => 'விரிவான விளகà¯à®•à®®à¯',
'tags-hitcount-header' => 'மாறà¯à®±à®™à¯à®•à®³à®¿à®©à¯ எணà¯à®£à®¿à®•à¯à®•à¯ˆ',
+'tags-active-yes' => 'ஆமà¯',
+'tags-active-no' => 'இலà¯à®²à¯ˆ',
'tags-edit' => 'தொகà¯',
'tags-hitcount' => '$1 {{PLURAL:$1|மாறà¯à®±à®®à¯|மாறà¯à®±à®™à¯à®•à®³à¯}}',
@@ -3545,6 +3572,9 @@ $5
'htmlform-submit' => 'சமரà¯à®ªà¯à®ªà®¿',
'htmlform-reset' => 'மாறà¯à®±à®™à¯à®•à®³à¯ˆ இலà¯à®²à®¾à®¤à¯ செயà¯',
'htmlform-selectorother-other' => 'மறà¯à®±à®µà¯ˆ',
+'htmlform-no' => 'இலà¯à®²à¯ˆ',
+'htmlform-yes' => 'ஆமà¯',
+'htmlform-chosen-placeholder' => 'விரà¯à®ªà¯à®ªà®¤à¯à®¤à®¿à®©à¯ˆà®¤à¯ தேரà¯à®•',
# SQLite database support
'sqlite-has-fts' => '$1à®®à¯à®´à¯-உரை தேடல௠ஆதரவà¯à®Ÿà®©à¯',
diff --git a/languages/messages/MessagesTcy.php b/languages/messages/MessagesTcy.php
index 163d3643..238be258 100644
--- a/languages/messages/MessagesTcy.php
+++ b/languages/messages/MessagesTcy.php
@@ -43,8 +43,6 @@ $messages = array(
'tog-shownumberswatching' => 'ಪà³à²Ÿà³Šà²¨à³ ತೂವೊಂದà³à²ªà³à²ªà³à²¨à²‚ಚಿನ ಸದಸà³à²¯à³†à²°à³â€™à²¨ ಸಂಖà³à²¯à³†à²¨à³ ತೊಜà³à²ªà²¾à²²à³†',
'tog-oldsig' => 'ಇತà³à²¤à³†à²¦ ಸಹಿ',
'tog-fancysig' => 'ಸರಳ ಸಹಿಗಳೠ(ಲಿಂಕೠಇಜà³à²œà²‚ದಿಲೆಕ)',
-'tog-externaleditor' => 'ಯಾಪಲ ಪಿದಯಿದ ಸಂಪಾದನೆ ಉಪಕರಣದ ಉಪಯೋಗ ಮನà³à²ªà³à²²à³† (ಅನà³à²­à²µ ಉಪà³à²ªà³à²¨à²‚ಚಿನ ಸದಸà³à²¯à³†à²°à³†à²—ೠಮಾತà³à²°, ನಿಕà³à²²à³†à²¨ ಕಂಪà³à²¯à³‚ಟರà³â€™à²¡à³ ವಿಶೇಷವಾಯಿನ ಬದಲಾವಣೆಲೠಬೋಡಾಪà³à²‚ಡà³)',
-'tog-externaldiff' => 'ಬಾಹà³à²¯ ಮà³à²¨à³à²¨à³‹à²Ÿà²¨à³ ಯಾಪಲ ಉಪಯೋಗ ಮಲà³à²ªà³à²²à³† (ಅನà³à²­à²µ ಉಪà³à²ªà³à²¨à²‚ಚಿನ ಸದಸà³à²¯à³†à²°à³†à²—ೠಮಾತà³à²°, ನಿಕà³à²²à³†à²¨ ಕಂಪà³à²¯à³‚ಟರà³â€™à²¡à³ ವಿಶೇಷ ಬದಲಾವಣೆಲೠಬೋಡಾಪà³à²‚ಡà³)',
'tog-uselivepreview' => 'ನೇರ ಮà³à²¨à³à²¨à³‹à²Ÿà²¨à³ ಉಪಯೋಗ ಮಲà³à²ªà³à²²à³† (JavaScript) (ಪà³à²°à²¾à²¯à³‹à²—ಿಕ)',
'tog-forceeditsummary' => 'ಸಂಪಾದನೆ ಸಾರಾಂಶೊನೠಖಾಲಿ ಬà³à²¡à³â€™à²¨à³à²¡à³ ಎಂಕೠನೆನಪೠಮಲà³à²ªà³à²²à³†',
'tog-watchlisthideown' => 'ವೀಕà³à²·à²£à²¾à²ªà²Ÿà³à²Ÿà²¿à²¡à³ ಎನà³à²¨ ಸಂಪಾದನೆಲೆನೠತೊಜà³â€™à²ªà²¾à²µà³Šà²šà²¿',
@@ -233,7 +231,7 @@ $messages = array(
'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).
+# 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).
'aboutsite' => '{{SITENAME}} ದ ಬಗà³à²—ೆ',
'aboutpage' => 'Project:ನಮà³à²® ಬಗà³à²—ೆ',
'copyright' => 'ಉಂದೠಈ ಕಾಪಿರೈಟà³â€Œà²¡à³ ಲಭà³à²¯à²µà³à²‚ಡೠ$1.',
@@ -243,7 +241,6 @@ $messages = array(
'disclaimers' => 'ಅಬಾಧà³à²¯à²¤à³†à²²à³',
'disclaimerpage' => 'Project:ಸಾಮಾನà³à²¯ ಅಬಾಧà³à²¯à²¤à³†à²²à³',
'edithelp' => 'ಸಂಪಾದನೆ(ಎಡಿಟà³) ಮಲà³à²ªà³†à²°à³† ಸಹಾಯ',
-'edithelppage' => 'Help:ಸಂಪಾದನೆ',
'helppage' => 'Help:ಪರಿವಿಡಿ',
'mainpage' => 'ಮà³à²–à³à²¯ ಪà³à²Ÿ',
'mainpage-description' => 'ಮà³à²–à³à²¯ ಪà³à²Ÿ',
@@ -268,7 +265,6 @@ $messages = array(
'newmessagesdifflink' => 'ಕಡೆತ ಬದಲಾವಣೆ',
'youhavenewmessagesmulti' => '$1 ಡೠಇರೆಗೠಪೊಸ ಸಂದೇಶೊಲೠಉಂಡà³',
'editsection' => 'ಸಂಪಾದನೆ ಮಲà³à²ªà³à²²à³†',
-'editsection-brackets' => '[$1]',
'editold' => 'ಸಂಪಾದನೆ ಮಲà³à²ªà³à²²à³†',
'viewsourceold' => 'ಮೂಲೊನೠತೂಲೆ',
'editlink' => 'ಎಡಿಟೠಮಲà³à²ªà³à²²à³†',
@@ -565,7 +561,6 @@ $messages = array(
'nextn' => 'ಬೊಕà³à²•à²¦ {{PLURAL:$1|$1}}',
'viewprevnext' => 'ತೂಲೆ ($1 {{int:pipe-separator}} $2) ($3)',
'searchmenu-legend' => 'ನಾಡಾಟದ ಆಯà³à²•à³†à²²à³',
-'searchhelp-url' => 'Help:ಪರಿವಿಡಿ',
'searchprofile-articles' => 'ಲೇಖನ ಪà³à²Ÿà³Š',
'searchprofile-images' => 'ಬಹà³à²®à²¾à²§à³à²¯à²®',
'searchprofile-everything' => 'ಪà³à²°à²¤à²¿à²¯à³Šà²‚ಜಿ',
@@ -690,7 +685,6 @@ $messages = array(
'recentchangeslinked-feed' => 'ಸಂಬಂಧ ಉಪà³à²ªà³à²¨à²‚ಚಿನ ಬದಲಾವಣೆಲà³',
'recentchangeslinked-toolbox' => 'ಸಂಬಂಧ ಉಪà³à²ªà³à²¨à²‚ಚಿನ ಬದಲಾವಣೆಲà³',
'recentchangeslinked-title' => '"$1" ಪà³à²Ÿà³Šà²Ÿà³ ಆತಿನ ಬದಲಾವಣೆಲà³',
-'recentchangeslinked-noresult' => 'ಕೊರà³à²¤à²¿à²¨ ಸಮಯೊಡೠಲಿಂಕೠಉಪà³à²ªà³à²¨ ಪà³à²Ÿà³Šà²²à³†à²¡à³ ಓವà³à²²à²¾ ಬದಲಾವಣೆಲೠಆತಿಜಿ.',
'recentchangeslinked-summary' => "ಒಂಜಿ ನಿರà³à²¦à²¿à²·à³à²Ÿ ಪà³à²Ÿà³Šà²°à³à²¦à³ (ಅತà³à²¤à³â€™à²¨à³à²¡ ನಿರà³à²¦à²¿à²·à³à²Ÿ ವರà³à²—ೊಗೠಸೇರà³à²¦à²¿à²¨ ಪà³à²Ÿà³Šà²²à³†à²°à³à²¦à³) ಸಂಪರà³à²• ಉಪà³à²ªà³à²¨ ಪà³à²Ÿà³Šà²²à³†à²¡à³ ಇಂಚಿಪ ಮಲà³à²¤à²¿à²¨à²‚ಚಿನ ಬದಲಾವಣೆಲೆನೠತಿರà³à²¤à³ ಪಟà³à²Ÿà²¿ ಮಲà³à²ªà³†à²°à²¾à²¤à³â€™à²¨à³à²¡à³.
[[Special:Watchlist|ಇರೆನ ವೀಕà³à²·à²£à²¾à²ªà²Ÿà³à²Ÿà²¿à²¡à³]] ಉಪà³à²ªà³à²¨ ಪà³à²Ÿà³Šà²²à³ '''ದಪà³à²ª ಅಕà³à²·à²°à³Šà²¡à³''' ಉಂಡà³.",
'recentchangeslinked-page' => 'ಪà³à²Ÿà³Šà²¤ ಪà³à²¦à²°à³:',
@@ -743,8 +737,6 @@ $messages = array(
'statistics' => 'ಅಂಕಿ ಅಂಶೊಲà³',
'statistics-header-pages' => 'ಪà³à²Ÿà³Šà²¤ ಅಂಕಿ ಅಂಶಲà³',
-'disambiguationspage' => 'ದà³à²µà²‚ದà³à²µ ನಿವಾರಣೆ',
-
# Miscellaneous special pages
'nbytes' => '$1 {{PLURAL:$1|ಬೈಟà³|ಬೈಟà³â€à²²à³}}',
'nmembers' => '$1 {{PLURAL:$1|ಸದಸà³à²¯à³†|ಸದಸà³à²¯à³†à²°à³}}',
diff --git a/languages/messages/MessagesTe.php b/languages/messages/MessagesTe.php
index 1aab5ea4..8e8cbb84 100644
--- a/languages/messages/MessagesTe.php
+++ b/languages/messages/MessagesTe.php
@@ -174,9 +174,6 @@ $messages = array(
'tog-shownumberswatching' => 'వీకà±à°·à°•à±à°² సంఖà±à°¯à°¨à± చూపించà±',
'tog-oldsig' => 'à°ªà±à°°à°¸à±à°¤à±à°¤ సంతకం:',
'tog-fancysig' => 'సంతకానà±à°¨à°¿ వికీపాఠà±à°¯à°‚à°—à°¾ తీసà±à°•à±‹ (ఆటోమెటికà±â€Œ లింకౠలేకà±à°‚à°¡à°¾)',
-'tog-externaleditor' => 'మామూలà±à°—à°¾ బయటి à°Žà°¡à°¿à°Ÿà°°à±à°¨à± వాడౠ(నిపà±à°£à±à°²à°•à± మాతà±à°°à°®à±‡. మీ à°•à°‚à°ªà±à°¯à±‚à°Ÿà°°à±à°²à±‹ à°ªà±à°°à°¤à±à°¯à±‡à°• అమరికలౠఅవసరమవà±à°¤à°¾à°¯à°¿. [//www.mediawiki.org/wiki/Manual:External_editors మరింత సమాచారం.])',
-'tog-externaldiff' => 'మారà±à°ªà±à°²à°¨à± చూడటానికి బయటి సాఫà±à°Ÿà±à°µà±‡à°°à±à°¨à± వాడౠ(నిపà±à°£à±à°²à°•à± మాతà±à°°à°®à±‡, మీ à°•à°‚à°ªà±à°¯à±‚à°Ÿà°°à±à°²à±‹ à°ªà±à°°à°¤à±à°¯à±‡à°• అమరికలౠఅవసరమవà±à°¤à°¾à°¯à°¿. [//www.mediawiki.org/wiki/Manual:External_editors మరింత సమాచారం.])',
-'tog-showjumplinks' => '"ఇకà±à°•à°¡à°¿à°•à°¿ గెంతà±" లింకà±à°²à°¨à± చూపించà±',
'tog-uselivepreview' => 'రాసà±à°¤à±à°¨à±à°¨à°¦à°¾à°¨à°¿à°¨à°¿ à°Žà°ªà±à°ªà°Ÿà°¿à°•à°ªà±à°ªà±à°¡à± సరిచూడండి (జావాసà±à°•à±à°°à°¿à°ªà±à°Ÿà±) (పరీకà±à°·à°¾à°¦à°¶à°²à±‹ ఉంది)',
'tog-forceeditsummary' => 'దిదà±à°¦à±à°¬à°¾à°Ÿà± సారాంశం ఖాళీగా ఉంటే à°† విషయానà±à°¨à°¿ నాకౠసూచించà±',
'tog-watchlisthideown' => 'నా మారà±à°ªà±à°²à°¨à± వీకà±à°·à°£à°¾ జాబితాలో చూపించొదà±à°¦à±',
@@ -189,6 +186,7 @@ $messages = array(
'tog-diffonly' => 'తేడాలనౠచూపిసà±à°¤à±à°¨à±à°¨à°ªà±à°¡à±, à°•à°¿à°‚à°¦ చూపించే పేజీలోని సమాచారానà±à°¨à°¿ చూపించొదà±à°¦à±',
'tog-showhiddencats' => 'దాచిన వరà±à°—ాలనౠచూపించà±',
'tog-norollbackdiff' => 'à°°à°¦à±à°¦à± చేసాక తేడాలౠచూపించవదà±à°¦à±',
+'tog-useeditwarning' => 'à°à°¦à±ˆà°¨à°¾ పేజీని నేనౠవదిలివెళà±à°¤à±à°¨à±à°¨à°ªà±à°ªà±à°¡à± దానిలో à°­à°¦à±à°°à°ªà°°à°šà°¨à°¿ మారà±à°ªà±à°²à± ఉంటే ననà±à°¨à± హెచà±à°šà°°à°¿à°‚à°šà±',
'underline-always' => 'à°Žà°²à±à°²à°ªà±à°ªà±à°¡à±‚',
'underline-never' => 'à°Žà°ªà±à°ªà°Ÿà°¿à°•à±€ వదà±à°¦à±',
@@ -252,6 +250,18 @@ $messages = array(
'oct' => 'à°…à°•à±à°Ÿà±‹',
'nov' => 'నవం',
'dec' => 'డిసెం',
+'january-date' => 'జనవరి $1',
+'february-date' => 'à°«à°¿à°¬à±à°°à°µà°°à°¿ $1',
+'march-date' => 'మారà±à°šà°¿ $1',
+'april-date' => 'à°à°ªà±à°°à°¿à°²à± $1',
+'may-date' => 'మే $1',
+'june-date' => 'జూనౠ$1',
+'july-date' => 'జూలై $1',
+'august-date' => 'ఆగసà±à°Ÿà± $1',
+'september-date' => 'సెపà±à°Ÿà±†à°‚బరౠ$1',
+'october-date' => 'à°…à°•à±à°Ÿà±‹à°¬à°°à± $1',
+'november-date' => 'నవంబరౠ$1',
+'december-date' => 'డిసెంబరౠ$1',
# Categories related messages
'pagecategories' => '{{PLURAL:$1|వరà±à°—à°‚|వరà±à°—ాలà±}}',
@@ -375,7 +385,7 @@ $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).
+# 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).
'aboutsite' => '{{SITENAME}} à°—à±à°°à°¿à°‚à°šà°¿',
'aboutpage' => 'Project:à°—à±à°°à°¿à°‚à°šà°¿',
'copyright' => 'విషయ సంగà±à°°à°¹à°‚ $1 à°•à°¿ లోబడి లభà±à°¯à°‚.',
@@ -385,7 +395,6 @@ $1',
'disclaimers' => 'à°…à°¸à±à°µà±€à°•à°¾à°°à°®à±à°²à±',
'disclaimerpage' => 'Project:సాధారణ నిషà±à°ªà±‚à°šà±€',
'edithelp' => 'దిదà±à°¦à±à°¬à°¾à°Ÿà± సహాయం',
-'edithelppage' => 'Help:దిదà±à°¦à±à°¬à°¾à°Ÿà±à°²à± ఎలా చెయà±à°¯à°¾à°²à°¿',
'helppage' => 'Help:సూచిక',
'mainpage' => 'మొదటి పేజీ',
'mainpage-description' => 'తలపà±à°Ÿ',
@@ -462,17 +471,6 @@ $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' => 'డేటాబేసà±à°•à± వేయబోతà±à°¨à±à°¨ లాకà±à°•à± కారణం తెలà±à°ªà°‚à°¡à°¿, దానితోపాటే ఎంతసమయం తరà±à°µà°¾à°¤ à°† లాకౠతీసేసà±à°¤à°¾à°°à±‹ కూడా తెలà±à°ªà°‚à°¡à°¿',
@@ -525,7 +523,6 @@ $1',
'editinginterface' => "'''హెచà±à°šà°°à°¿à°•''': సాఫà±à°Ÿà±à°µà±‡à°°à±à°•à± ఇంటరà±à°«à±‡à°¸à± టెకà±à°¸à±à°Ÿà±à°¨à± అందించే పేజీని మీరౠసరిదిదà±à°¦à±à°¤à±à°¨à±à°¨à°¾à°°à±.
à°ˆ పేజీలో చేసే మారà±à°ªà±à°² వలà±à°² ఇతర వాడà±à°•à°°à±à°²à°•à± ఇంటరà±à°«à±‡à°¸à± కనబడే విధానంలో తేడావసà±à°¤à±à°‚ది.
à°…à°¨à±à°µà°¾à°¦à°¾à°² కొరకైతే, [//translatewiki.net/wiki/Main_Page?setlang=te à°Ÿà±à°°à°¾à°¨à±à°¸à±â€Œà°²à±‡à°Ÿà± వికీ.నెటà±], మీడియావికీ à°¸à±à°¥à°¾à°¨à°¿à°•à±€à°•à°°à°£ à°ªà±à°°à°¾à°œà±†à°•à±à°Ÿà±, ని వాడండి.",
-'sqlhidden' => '(SQL à°•à±à°µà°¿à°°à±€à°¨à°¿ చూపించటం లేదà±)',
'cascadeprotected' => 'కింది {{PLURAL:$1|పేజీని|పేజీలనà±}} కాసà±à°•à±‡à°¡à°¿à°‚గౠఆపà±à°·à°¨à±à°¤à±‹ చేసి సంరకà±à°·à°¿à°‚చారà±. à°ªà±à°°à°¸à±à°¤à±à°¤ పేజీ, à°ˆ పేజీలà±à°²à±‹ ఇంకà±à°²à±‚డౠఅయి ఉంది కాబటà±à°Ÿà°¿, దిదà±à°¦à±à°¬à°¾à°Ÿà± చేసే వీలౠలేకà±à°‚à°¡à°¾ ఇది కూడా à°°à°•à±à°·à°£à°²à±‹ ఉంది.
$2',
'namespaceprotected' => "'''$1''' నేంసà±à°ªà±‡à°¸à±à°²à±‹ మారà±à°ªà±à°²à± చేయటానికి మీకౠఅనà±à°®à°¤à°¿ లేదà±.",
@@ -553,10 +550,17 @@ $2',
*వికీని à°¤à±à°µà°°à°—à°¾ à°…à°°à±à°¥à°‚ చేసà±à°•à±à°¨à±‡à°‚à°¦à±à°•à± [[వికీపీడియా:5 నిమిషాలà±à°²à±‹ వికీ|5 నిమిషాలà±à°²à±‹ వికీ]] పేజీని చూడండి.
*తెలà±à°—à±à°²à±‹ రాసేందà±à°•à± ఇంగà±à°²à±€à°·à± à°…à°•à±à°·à°°à°¾à°² ఉచà±à°›à°¾à°°à°£à°¤à±‹ తెలà±à°—ౠటైపౠచేసే [[వికీపీడియా:టైపింగౠసహాయం| టైపింగౠసహాయం]] వాడవచà±à°šà±. మరినà±à°¨à°¿ ఉపకరణాల కొరకౠ[[à°•à±€ బోరà±à°¡à±]] మరియౠతెరపై తెలà±à°—ౠసరిగా లేకపోతే[[వికీపీడియా:Setting up your browser for Indic scripts|à°ˆ పేజీ]] చూడండి.',
'yourname' => 'వాడà±à°•à°°à°¿ పేరà±:',
+'userlogin-yourname' => 'వాడà±à°•à°°à°¿ పేరà±',
+'userlogin-yourname-ph' => 'మీ వాడà±à°•à°°à°¿ పేరà±à°¨à± ఇవà±à°µà°‚à°¡à°¿',
'yourpassword' => 'సంకేతపదం:',
+'userlogin-yourpassword' => 'సంకేతపదం',
+'userlogin-yourpassword-ph' => 'మీ సంకేతపదానà±à°¨à°¿ ఇవà±à°µà°‚à°¡à°¿',
+'createacct-yourpassword-ph' => 'సంకేతపదానà±à°¨à°¿ ఇవà±à°µà°‚à°¡à°¿',
'yourpasswordagain' => 'సంకేతపదానà±à°¨à°¿ మళà±à°³à±€ ఇవà±à°µà°‚à°¡à°¿:',
+'createacct-yourpasswordagain' => 'సంకేతపదానà±à°¨à°¿ నిరà±à°§à°¾à°°à°¿à°‚à°šà°‚à°¡à°¿',
+'createacct-yourpasswordagain-ph' => 'సంకేతపదానà±à°¨à°¿ మళà±à°³à±€ ఇవà±à°µà°‚à°¡à°¿',
'remembermypassword' => 'à°ˆ à°•à°‚à°ªà±à°¯à±‚à°Ÿà°°à±à°²à±‹ నా à°ªà±à°°à°µà±‡à°¶à°¾à°¨à±à°¨à°¿ à°—à±à°°à±à°¤à±à°‚à°šà±à°•à±‹ (à°—à°°à°¿à°·à±à° à°‚à°—à°¾ $1 {{PLURAL:$1|రోజà±|రోజà±à°²}}à°•à°¿)',
-'securelogin-stick-https' => 'à°ªà±à°°à°µà±‡à°¶à°‚ తరà±à°µà°¾à°¤ కూడా HTTPSà°•à°¿ à°…à°¨à±à°¸à°‚ధానమై ఉండà±',
+'userlogin-remembermypassword' => 'ననà±à°¨à± à°ªà±à°°à°µà±‡à°¶à°¿à°‚పజేసి ఉంచà±',
'yourdomainname' => 'మీ డోమైనà±',
'password-change-forbidden' => 'à°ˆ వికీలో మీరౠసంకేతపదాలనౠమారà±à°šà°²à±‡à°°à±.',
'externaldberror' => 'డేటాబేసౠఅధీకరణలో పొరపాటౠజరిగింది లేదా మీ బయటి ఖాతాని తాజాకరించడానికి మీకౠఅనà±à°®à°¤à°¿ లేదà±.',
@@ -568,18 +572,37 @@ $2',
'logout' => 'నిషà±à°•à±à°°à°®à°¿à°‚à°šà±',
'userlogout' => 'నిషà±à°•à±à°°à°®à°¿à°‚à°šà±',
'notloggedin' => 'లోనికి à°ªà±à°°à°µà±‡à°¶à°¿à°‚à°šà°¿ లేరà±',
+'userlogin-noaccount' => 'మీకౠఖాతా లేదా?',
+'userlogin-joinproject' => '{{SITENAME}}లో చేరండి',
'nologin' => 'ఖాతా లేదా? $1.',
'nologinlink' => 'ఖాతాని సృషà±à°Ÿà°¿à°‚à°šà±à°•à±‹à°‚à°¡à°¿',
'createaccount' => 'ఖాతాని సృషà±à°Ÿà°¿à°‚à°šà±',
'gotaccount' => 'ఇపà±à°ªà°Ÿà°¿à°•à±‡ మీకౠఖాతా ఉందా? $1.',
'gotaccountlink' => 'à°ªà±à°°à°µà±‡à°¶à°¿à°‚à°šà°‚à°¡à°¿',
'userlogin-resetlink' => 'మీ à°ªà±à°°à°µà±‡à°¶ వివరాలనౠమరచిపోయారా?',
+'userlogin-resetpassword-link' => 'మీ దాటà±à°®à°¾à°Ÿà°¨à± మారà±à°šà±à°•à±‹à°‚à°¡à°¿',
+'helplogin-url' => 'Help:à°ªà±à°°à°µà±‡à°¶à°¿à°‚à°šà°¡à°‚',
+'userlogin-helplink' => '[[{{MediaWiki:helplogin-url}}|à°ªà±à°°à°µà±‡à°¶à°¿à°‚చడానికి సహాయం]]',
+'createacct-join' => 'మీ సమాచారానà±à°¨à°¿ à°•à±à°°à°¿à°‚à°¦ ఇవà±à°µà°‚à°¡à°¿.',
+'createacct-emailrequired' => 'ఈమెయిలౠచిరà±à°¨à°¾à°®à°¾',
+'createacct-emailoptional' => 'ఈమెయిలౠచిరà±à°¨à°¾à°®à°¾ (à°à°šà±à°šà°¿à°•à°‚)',
+'createacct-email-ph' => 'మీ ఈమెయిలౠచిరà±à°¨à°¾à°®à°¾à°¨à± ఇవà±à°µà°‚à°¡à°¿',
'createaccountmail' => 'తాతà±à°•à°¾à°²à°¿à°• యాదృచà±à°šà°¿à°• సంకేతపదానà±à°¨à°¿ వాడి దానà±à°¨à°¿ à°ˆ à°•à±à°°à°¿à°‚à°¦ ఇచà±à°šà°¿à°¨ ఈమెయిలౠచిరà±à°¨à°¾à°®à°¾à°•à± పంపించà±',
+'createacct-realname' => 'అసలౠపేరౠ(à°à°šà±à°šà°¿à°•à°‚)',
'createaccountreason' => 'కారణం:',
+'createacct-reason' => 'కారణం',
+'createacct-reason-ph' => 'మీరౠమరో ఖాతానౠఎందà±à°•à± సృషà±à°Ÿà°¿à°‚à°šà±à°•à±à°‚à°Ÿà±à°¨à±à°¨à°¾à°°à±',
+'createacct-captcha' => 'à°­à°¦à±à°°à°¤à°¾ తనిఖీ',
+'createacct-imgcaptcha-ph' => 'పైన కనబడే మాటలనౠఇకà±à°•à°¡ ఇవà±à°µà°‚à°¡à°¿',
+'createacct-submit' => 'మీ ఖాతానౠసృషà±à°Ÿà°¿à°‚à°šà±à°•à±‹à°‚à°¡à°¿',
+'createacct-benefit-heading' => '{{SITENAME}}నౠతయారà±à°šà±‡à°¸à±‡à°¦à°¿ మీలాంటి à°ªà±à°°à°œà°²à±‡.',
+'createacct-benefit-body1' => '{{PLURAL:$1|మారà±à°ªà±|మారà±à°ªà±à°²à±}}',
+'createacct-benefit-body2' => '{{PLURAL:$1|పేజీ|పేజీలà±}}',
'badretype' => 'మీరౠఇచà±à°šà°¿à°¨ రెండౠసంకేతపదాలౠఒకదానితో మరొకటి సరిపోలడం లేదà±.',
'userexists' => 'ఇచà±à°šà°¿à°¨ వాడà±à°•à°°à°¿à°ªà±‡à°°à± ఇపà±à°ªà°Ÿà°¿à°•à±‡ వాడà±à°•à°²à±‹ ఉంది.
వేరే పేరà±à°¨à± à°Žà°‚à°šà±à°•à±‹à°‚à°¡à°¿.',
'loginerror' => 'à°ªà±à°°à°µà±‡à°¶à°‚లో పొరపాటà±',
+'createacct-error' => 'పదà±à°¦à± తెరవడమà±à°²à±‹ తపà±à°ªà±',
'createaccounterror' => 'ఖాతాని సృషà±à°Ÿà°¿à°‚చలేకపోయాం: $1',
'nocookiesnew' => 'ఖాతాని సృషà±à°Ÿà°¿à°‚చాం, కానీ మీరౠఇంకా లోనికి à°ªà±à°°à°µà±‡à°¶à°¿à°‚చలేదà±.
వాడà±à°•à°°à±à°² à°ªà±à°°à°µà±‡à°¶à°¾à°¨à°¿à°•à°¿ {{SITENAME}} కూకీలనౠవాడà±à°¤à±à°‚ది.
@@ -656,7 +679,7 @@ $2',
'newpassword' => 'కొతà±à°¤ సంకేతపదం:',
'retypenew' => 'సంకేతపదం, మళà±à°³à±€',
'resetpass_submit' => 'సంకేతపదానà±à°¨à°¿ మారà±à°šà°¿ లోనికి à°ªà±à°°à°µà±‡à°¶à°¿à°‚à°šà°‚à°¡à°¿',
-'resetpass_success' => 'మీ సంకేతపదానà±à°¨à°¿ జయపà±à°°à°¦à°‚à°—à°¾ మారà±à°šà°¾à°‚! ఇక మిమà±à°®à°²à±à°¨à°¿ లోనికి à°ªà±à°°à°µà±‡à°¶à°¿à°‚పచేసà±à°¤à±à°¨à±à°¨à°¾à°‚...',
+'changepassword-success' => 'మీ సంకేతపదానà±à°¨à°¿ జయపà±à°°à°¦à°‚à°—à°¾ మారà±à°šà°¾à°‚! ఇక మిమà±à°®à°²à±à°¨à°¿ లోనికి à°ªà±à°°à°µà±‡à°¶à°¿à°‚పచేసà±à°¤à±à°¨à±à°¨à°¾à°‚...',
'resetpass_forbidden' => 'సంకేతపదాలనౠమారà±à°šà°Ÿà°‚ à°•à±à°¦à°°à°¦à±',
'resetpass-no-info' => 'à°ˆ పేజీని నేరà±à°—à°¾ చూడటానికి మీరౠలోనికి à°ªà±à°°à°µà±‡à°¶à°¿à°‚à°šà°¿à°µà±à°‚డాలి.',
'resetpass-submit-loggedin' => 'సంకేతపదానà±à°¨à°¿ మారà±à°šà±',
@@ -667,10 +690,8 @@ $2',
# Special:PasswordReset
'passwordreset' => 'సంకేతపదానà±à°¨à°¿ మారà±à°šà±à°•à±‹à°‚à°¡à°¿',
-'passwordreset-text' => 'మీ ఖాతా వివరాలనౠగà±à°°à±à°¤à± చేసే ఈమెయిలౠకోసం à°ˆ ఫారానà±à°¨à°¿ పూరà±à°¤à°¿ చెయà±à°¯à°‚à°¡à°¿.',
'passwordreset-legend' => 'సంకేతపదానà±à°¨à°¿ మారà±à°šà±à°•à±‹à°‚à°¡à°¿',
'passwordreset-disabled' => 'à°ˆ వికీలో సంకేతపదాల మారà±à°ªà±à°¨à± అచేతనం చేసాం.',
-'passwordreset-pretext' => '{{PLURAL:$1||డేటా శకలాలà±à°²à±‹à°‚à°šà°¿ ఒకదానà±à°¨à°¿ ఇవà±à°µà°‚à°¡à°¿}}',
'passwordreset-username' => 'వాడà±à°•à°°à°¿ పేరà±:',
'passwordreset-domain' => 'డొమైనà±:',
'passwordreset-email' => 'à°ˆ-మెయిలౠచిరà±à°¨à°¾à°®à°¾:',
@@ -885,10 +906,13 @@ $2
దీనà±à°¨à°¿ తొలగించినటà±à°Ÿà±à°¨à±à°¨à°¾à°°à±.',
'edit-conflict' => 'మారà±à°ªà± సంఘరà±à°·à°£.',
'edit-no-change' => 'పాఠà±à°¯à°‚లో à°à°®à±€ మారà±à°ªà±à°²à± లేవౠగనక, మీ మారà±à°ªà±à°¨à°¿ పటà±à°Ÿà°¿à°‚à°šà±à°•à±‹à°µà°Ÿà±à°²à±‡à°¦à±.',
+'postedit-confirmation' => 'మీ మారà±à°ªà± à°­à°¦à±à°°à°®à°¯à±à°¯à°¿à°‚ది.',
'edit-already-exists' => 'కొతà±à°¤ పేజీని సృషà±à°Ÿà°¿à°‚చలేమà±.
అది ఇపà±à°ªà°Ÿà°¿à°•à±‡ ఉంది.',
'defaultmessagetext' => 'à°…à°ªà±à°°à°®à±‡à°¯ సందేశపౠపాఠà±à°¯à°‚',
'invalid-content-data' => 'తపà±à°ªà±à°¡à± విషయం',
+'editwarning-warning' => 'à°ˆ పేజీని వదిలివెళà±à°³à°¡à°‚ వలà±à°² మీరౠచేసిన మారà±à°ªà±à°²à°¨à± కోలà±à°ªà±‹à°¯à±‡ అవకాశం ఉంది.
+మీరౠపà±à°°à°µà±‡à°¶à°¿à°‚à°šà°¿à°µà±à°‚టే, à°ˆ హెచà±à°šà°°à°¿à°•à°¨à°¿ మీ à°…à°­à°¿à°°à±à°šà±à°²à°²à±‹ "మరపà±à°²à±" అనే విభాగంలో అచేతనం చేసà±à°•à±‹à°µà°šà±à°šà±.',
# Content models
'content-model-wikitext' => 'వికీపాఠà±à°¯à°‚',
@@ -1117,7 +1141,6 @@ $1",
'searchmenu-legend' => 'à°…à°¨à±à°µà±‡à°·à°£ ఎంపికలà±',
'searchmenu-exists' => "'''ఈ వికీలో \"[[:\$1]]\" అనే పేజీ ఉంది'''",
'searchmenu-new' => "'''à°ˆ వికీలో \"[[:\$1]]\" అనే పేరà±à°¤à±‹ పేజీని సృషà±à°Ÿà°¿à°‚à°šà±!'''",
-'searchhelp-url' => 'Help:సూచిక',
'searchmenu-prefix' => '[[Special:PrefixIndex/$1|à°ˆ ఉపసరà±à°— ఉనà±à°¨ పేజీలనౠచూడండి]]',
'searchprofile-articles' => 'విషయపౠపేజీలà±',
'searchprofile-project' => 'సహాయం మరియౠపà±à°°à°¾à°œà±†à°•à±à°Ÿà± పేజీలà±',
@@ -1159,15 +1182,6 @@ $1",
'search-external' => 'బయటి à°…à°¨à±à°µà±‡à°·à°£',
'searchdisabled' => '{{SITENAME}} à°…à°¨à±à°µà±‡à°·à°£ తాతà±à°•à°¾à°²à°¿à°•à°‚à°—à°¾ పని చెయà±à°¯à°¡à°‚ లేదà±. ఈలోగా మీరౠగూగà±à°²à±â€Œ ఉపయోగించి à°…à°¨à±à°µà±‡à°·à°¿à°‚చవచà±à°šà±. à°’à°• గమనిక: గూగà±à°²à±â€Œ à°¦à±à°µà°¾à°°à°¾ కాలదోషం పటà±à°Ÿà°¿à°¨ ఫలితాలౠరావడానికి అవకాశం ఉంది.',
-# Quickbar
-'qbsettings' => 'à°•à±à°µà°¿à°•à±â€Œà°¬à°¾à°°à±',
-'qbsettings-none' => 'à°à°¦à±€à°•à°¾à°¦à±',
-'qbsettings-fixedleft' => 'à°¸à±à°¥à°¿à°° à°Žà°¡à°®',
-'qbsettings-fixedright' => 'à°¸à±à°¥à°¿à°° à°•à±à°¡à°¿',
-'qbsettings-floatingleft' => 'ఎడమకౠఒదిగి',
-'qbsettings-floatingright' => 'à°•à±à°¡à°¿à°•à°¿ ఒదిగి',
-'qbsettings-directionality' => 'à°¸à±à°¥à°¿à°°à°‚, మీ లిపి మరియౠభాషల యొకà±à°• దిశ ఆధారంగా',
-
# Preferences page
'preferences' => 'à°…à°­à°¿à°°à±à°šà±à°²à±',
'mypreferences' => 'à°…à°­à°¿à°°à±à°šà±à°²à±',
@@ -1200,7 +1214,6 @@ $1",
'resetprefs' => 'à°®à±à°¨à±à°ªà°Ÿà°¿ వలె',
'restoreprefs' => 'సృషà±à°Ÿà°¿à°‚చబడినపà±à°ªà°Ÿà°¿ à°…à°­à°¿à°°à±à°šà±à°²à± తిరిగి తీసà±à°•à±à°°à°¾',
'prefs-editing' => 'మారà±à°ªà±à°²à±',
-'prefs-edit-boxsize' => 'మారà±à°ªà±à°² à°•à°¿à°Ÿà°¿à°•à±€ యొకà±à°• పరిమాణం.',
'rows' => 'వరà±à°¸à°²à±',
'columns' => 'వరà±à°¸à°²à±:',
'searchresultshead' => 'à°…à°¨à±à°µà±‡à°·à°£',
@@ -1211,8 +1224,6 @@ $1",
'recentchangesdays-max' => '($1 {{PLURAL:$1|రోజà±|రోజà±à°²à±}} à°—à°°à°¿à°·à±à° à°‚)',
'recentchangescount' => 'à°…à°ªà±à°°à°®à±‡à°¯à°‚à°—à°¾ చూపించాలà±à°¸à°¿à°¨ దిదà±à°¦à±à°¬à°¾à°Ÿà±à°² సంఖà±à°¯:',
'prefs-help-recentchangescount' => 'ఇది ఇటీవలి మారà±à°ªà±à°²à±, పేజీ à°šà°°à°¿à°¤à±à°°à°²à±, మరియౠచిటà±à°Ÿà°¾à°²à°•à± వరà±à°¤à°¿à°¸à±à°¤à±à°‚ది.',
-'prefs-help-watchlist-token' => 'à°ˆ à°•à±à°·à±‡à°¤à±à°°à°¾à°¨à±à°¨à°¿ à°’à°• రహసà±à°¯ కీతో నింపితే, మీ వీకà±à°·à°£ జాబితాకౠఒక RSS వడà±à°¡à°¨ తయారవà±à°¤à±à°‚ది. à°† à°•à±€ తెలిసిన వారెవరైనా మీ వీకà±à°·à°£à°œà°¾à°¬à°¿à°¤à°¾à°¨à± చూడగలà±à°—à±à°¤à°¾à°°à±. à°…à°‚à°¦à±à°šà±‡à°¤ కీని జాగà±à°°à°¤à±à°¤à°—à°¾ à°Žà°‚à°šà±à°•à±‹à°‚à°¡à°¿.
-ఇదిగో, అనామతà±à°—à°¾ సృషà±à°Ÿà°¿à°‚à°šà°¿à°¨ à°’à°• à°•à±€ -మీకోసం: $1',
'savedprefs' => 'మీ à°…à°­à°¿à°°à±à°šà±à°²à°¨à± à°­à°¦à±à°°à°ªà°°à°¿à°šà°¾à°‚.',
'timezonelegend' => 'కాల మండలం:',
'localtime' => 'à°¸à±à°¥à°¾à°¨à°¿à°• సమయం:',
@@ -1242,7 +1253,6 @@ $1",
'prefs-common-css-js' => 'à°…à°¨à±à°¨à°¿ అలంకారాలకై పంచà±à°•à±‹à°¬à°¡à°¿à°¨ CSS/JS:',
'prefs-reset-intro' => 'à°ˆ పేజీలో, మీ à°…à°­à°¿à°°à±à°šà±à°²à°¨à± సైటౠడిఫాలà±à°Ÿà± విలà±à°µà°²à°•à± మారà±à°šà±à°•à±‹à°µà°šà±à°šà±. మళà±à°³à±€ వెనకà±à°•à°¿ తీసà±à°•à±à°ªà±‹à°²à±‡à°°à±.',
'prefs-emailconfirm-label' => 'à°ˆ-మెయిలౠనిరà±à°§à°¾à°°à°£:',
-'prefs-textboxsize' => 'దిదà±à°¦à±à°¬à°¾à°Ÿà± à°•à°¿à°Ÿà°¿à°•à±€ పరిమాణం',
'youremail' => 'మీ à°ˆ-మెయిలà±*',
'username' => '{{GENDER:$1|వాడà±à°•à°°à°¿ పేరà±}}:',
'uid' => '{{GENDER:$1|వాడà±à°•à°°à°¿}} ID:',
@@ -1440,6 +1450,7 @@ $1",
# Recent changes
'nchanges' => '{{PLURAL:$1|à°’à°• మారà±à°ªà±|$1 మారà±à°ªà±à°²à±}}',
+'enhancedrc-history' => 'చరితం',
'recentchanges' => 'ఇటీవలి మారà±à°ªà±à°²à±',
'recentchanges-legend' => 'ఇటీవలి మారà±à°ªà±à°² ఎంపికలà±',
'recentchanges-summary' => 'వికీలో ఇటీవలే జరిగిన మారà±à°ªà±à°²à°¨à± à°ˆ పేజీలో గమనించవచà±à°šà±.',
@@ -1479,7 +1490,6 @@ $1",
'recentchangeslinked-feed' => 'సంబంధిత మారà±à°ªà±à°²à±',
'recentchangeslinked-toolbox' => 'పొంతనగల మారà±à°ªà±à°²à±',
'recentchangeslinked-title' => '$1 కౠసంబంధించిన మారà±à°ªà±à°²à±',
-'recentchangeslinked-noresult' => 'మీరిచà±à°šà°¿à°¨ కాలంలో ఇకà±à°•à°¡à°¿à°•à°¿ లింకౠఉనà±à°¨ పేజీలలో à°Žà°Ÿà±à°µà°‚టౠమారà±à°ªà±à°²à±‚ జరగలేదà±.',
'recentchangeslinked-summary' => "దీనికి లింకై ఉనà±à°¨ పేజీలà±à°²à±‹ జరిగిన చివరి మారà±à°ªà±à°²à± ఇకà±à°•à°¡ చూడవచà±à°šà±. మీ వీకà±à°·à°£ జాబితాలో ఉనà±à°¨ పేజీలౠ'''బొదà±à°¦à±'''à°—à°¾ ఉంటాయి.",
'recentchangeslinked-page' => 'పేజీ పేరà±:',
'recentchangeslinked-to' => 'ఇచà±à°šà°¿à°¨ పేజీకి లింకయివà±à°¨à±à°¨ పేజీలలో జరిగిన మారà±à°ªà±à°²à°¨à± చూపించà±',
@@ -1661,7 +1671,6 @@ https://www.mediawiki.org/wiki/Manual:Image_Authorization చూడండి.',
'http-read-error' => 'HTTP à°šà°¦à±à°µà±à°Ÿà°²à±‹ పొరపాటà±.',
'http-timed-out' => 'HTTP à°…à°­à±à°¯à°°à±à°¥à°¨à°•à°¿ కాలం చెలà±à°²à°¿à°‚ది.',
'http-curl-error' => 'URLని తేవడంలో పొరపాటà±: $1',
-'http-host-unreachable' => 'URLని చేరలేకపోయాం.',
'http-bad-status' => 'HTTP à°…à°­à±à°¯à°°à±à°§à°¨ చేసà±à°¤à±à°¨à±à°¨à°ªà±à°ªà±à°¡à± సమసà±à°¯ ఉంది: $1 $2',
# Some likely curl errors. More could be added from <http://curl.haxx.se/libcurl/c/libcurl-errors.html>
@@ -1807,10 +1816,6 @@ https://www.mediawiki.org/wiki/Manual:Image_Authorization చూడండి.',
'statistics-users-active-desc' => 'à°—à°¤ {{PLURAL:$1|రోజà±|$1 రోజà±à°²}}లో à°’à°•à±à°• à°šà°°à±à°¯à±ˆà°¨à°¾ చేసిన వాడà±à°•à°°à±à°²à±',
'statistics-mostpopular' => 'à°Žà°•à±à°•à±à°µà°—à°¾ చూసిన పేజీలà±',
-'disambiguations' => 'అయోమయ నివృతà±à°¤à°¿ à°ªà±à°Ÿà°²à°•à± లింకà±à°¨à±à°¨ à°ªà±à°Ÿà°²à±',
-'disambiguationspage' => 'Template:అయోమయ నివృతà±à°¤à°¿',
-'disambiguations-text' => "కింది పేజీలౠ'''అయోమయ నివృతà±à°¤à°¿''' పేజీకి లింకవà±à°¤à±à°¨à±à°¨à°¾à°¯à°¿. కానీ అవి సంబంధిత పేజీకి నేరà±à°—à°¾ లింకౠఅవాలి. <br /> [[MediaWiki:Disambiguationspage]] à°¨à±à°‚ది లింకౠఉనà±à°¨ మూసనౠవాడే పేజీని అయోమయ నివృతà±à°¤à°¿ పేజీగా భావిసà±à°¤à°¾à°°à±.",
-
'pageswithprop-submit' => 'వెళà±à°³à±',
'doubleredirects' => 'జంట దారిమారà±à°ªà±à°²à±',
@@ -2050,10 +2055,9 @@ https://www.mediawiki.org/wiki/Manual:Image_Authorization చూడండి.',
'unwatchthispage' => 'వీకà±à°·à°£à°¨à± ఆపà±',
'notanarticle' => 'à°µà±à°¯à°¾à°¸à°‚ పేజీ కాదà±',
'notvisiblerev' => 'à°ˆ కూరà±à°ªà±à°¨à± తొలగించాం',
-'watchnochange' => 'మీ వీకà±à°·à°£ జాబితాలోని ఠపేజీలోనూ à°ˆ కాల అవధిలో మారà±à°ªà±à°²à± జరగలేదà±.',
'watchlist-details' => 'మీ వీకà±à°·à°£ జాబితాలో {{PLURAL:$1|à°’à°• పేజీ ఉంది|$1 పేజీలౠఉనà±à°¨à°¾à°¯à°¿}}, à°šà°°à±à°šà°¾ పేజీలని వదిలేసి.',
-'wlheader-enotif' => '* à°ˆ-మెయిలౠపà±à°°à°•à°Ÿà°¨à°²à± పంపబడతాయి.',
-'wlheader-showupdated' => "* మీ à°—à°¤ సందరà±à°¶à°¨ తరà±à°µà°¾à°¤ మారిన పేజీలౠ'''బొదà±à°¦à±'''à°—à°¾ చూపించబడà±à°¡à°¾à°¯à°¿.",
+'wlheader-enotif' => 'à°ˆ-మెయిలౠపà±à°°à°•à°Ÿà°¨à°²à± పంపబడతాయి.',
+'wlheader-showupdated' => "మీ à°—à°¤ సందరà±à°¶à°¨ తరà±à°µà°¾à°¤ మారిన పేజీలౠ'''బొదà±à°¦à±'''à°—à°¾ చూపించబడà±à°¡à°¾à°¯à°¿.",
'watchmethod-recent' => 'వీకà±à°·à°£ జాబితాలోని పేజీల కొరకౠఇటీవలి మారà±à°ªà±à°²à± పరిశీలించబడà±à°¤à±à°¨à±à°¨à°¾à°¯à°¿',
'watchmethod-list' => 'ఇటీవలి మారà±à°ªà±à°² కొరకౠవీకà±à°·à°£ జాబితాలోని పేజీలౠపరిశీలించబడà±à°¤à±à°¨à±à°¨à°¾à°¯à°¿',
'watchlistcontains' => 'మీ వీకà±à°·à°£ జాబితాలో {{PLURAL:$1|à°’à°• పేజీ ఉంది|$1 పేజీలౠఉనà±à°¨à°¾à°¯à°¿}}.',
@@ -2429,11 +2433,8 @@ $1',
'ipb_blocked_as_range' => 'లోపం: à°à°ªà±€ $1 నౠనేరà±à°—à°¾ నిరోధించలేదà±, అంచేత నిరోధానà±à°¨à°¿ à°°à°¦à±à°¦à±à°ªà°°à°šà°²à±‡à°®à±. అయితే, అది $2 à°¶à±à°°à±‡à°£à°¿à°²à±‹ భాగంగా నిరోధానికి à°—à±à°°à±ˆà°‚ది, à°ˆ à°¶à±à°°à±‡à°£à°¿à°ªà±ˆ ఉనà±à°¨ నిరోధానà±à°¨à°¿ à°°à°¦à±à°¦à±à°ªà°°à°šà°µà°šà±à°šà±.',
'ip_range_invalid' => 'సరైన à°à°ªà±€ à°¶à±à°°à±‡à°£à°¿ కాదà±.',
'ip_range_toolarge' => '/$1 కంటే పెదà±à°¦à°µà±ˆà°¨ సామూహిక నిరోధాలౠఅనà±à°®à°¤à°¿à°‚చబడవà±.',
-'blockme' => 'ననà±à°¨à± నిరోధించà±',
'proxyblocker' => 'à°ªà±à°°à°¾à°•à±à°¸à±€ నిరోధకం',
-'proxyblocker-disabled' => 'à°ˆ à°«à°‚à°•à±à°·à°¨à±à°¨à± అశకà±à°¤à°‚ చేసాం.',
'proxyblockreason' => 'మీ à°à°ªà±€ à°…à°¡à±à°°à°¸à± à°’à°• ఓపెనౠపà±à°°à°¾à°•à±à°¸à±€ కాబటà±à°Ÿà°¿ దానà±à°¨à°¿ నిరోధించాం. మీ ఇంటరà±à°¨à±†à°Ÿà± సేవాదారà±à°¨à°¿ గానీ, సాంకేతిక సహాయకà±à°¨à°¿ గానీ సంపà±à°°à°¦à°¿à°‚à°šà°¿ తీవà±à°°à°®à±ˆà°¨ à°ˆ à°­à°¦à±à°°à°¤à°¾ వైఫలà±à°¯à°¾à°¨à±à°¨à°¿ à°—à±à°°à°¿à°‚à°šà°¿ తెలపండి.',
-'proxyblocksuccess' => 'పూరà±à°¤à°¯à°¿à°‚ది.',
'sorbsreason' => '{{SITENAME}} వాడే DNSBLలో మీ à°à°ªà±€ à°…à°¡à±à°°à°¸à± à°’à°• ఓపెనౠపà±à°°à°¾à°•à±à°¸à±€à°—à°¾ నమోదై ఉంది.',
'sorbs_create_account_reason' => 'మీ à°à°ªà±€ à°…à°¡à±à°°à°¸à± DNSBL లో ఓపెనౠపà±à°°à°¾à°•à±à°¸à±€à°—à°¾ నమోదయి ఉంది. మీరౠఎకౌంటà±à°¨à± సృషà±à°Ÿà°¿à°‚చజాలరà±.',
'cant-block-while-blocked' => 'నిరోధంలో ఉనà±à°¨ మీరౠఇతర వాడà±à°•à°°à±à°²à°ªà±ˆ నిరోధం అమలà±à°šà±‡à°¯à°²à±‡à°°à±.',
@@ -2763,13 +2764,8 @@ $1',
'pageinfo-category-files' => 'దసà±à°¤à±à°°à°¾à°² సంఖà±à°¯',
# Skin names
-'skinname-standard' => 'సంపà±à°°à°¦à°¾à°¯',
-'skinname-nostalgia' => 'నాసà±à°Ÿà°¾à°²à±à°œà°¿à°¯à°¾',
'skinname-cologneblue' => 'కలోనౠనీలం',
'skinname-monobook' => 'మోనోబà±à°•à±',
-'skinname-myskin' => 'నాఅలంకారం',
-'skinname-chick' => 'à°šà°¿à°•à±',
-'skinname-simple' => 'సరళ',
'skinname-modern' => 'ఆధà±à°¨à°¿à°•',
'skinname-vector' => 'వెకà±à°Ÿà°°à±',
@@ -2844,11 +2840,25 @@ $1',
'minutes' => '{{PLURAL:$1|ఒక నిమిషం|$1 నిమిషాల}}',
'hours' => '{{PLURAL:$1|à°’à°• à°—à°‚à°Ÿ|$1 à°—à°‚à°Ÿà°²}}',
'days' => '{{PLURAL:$1|à°’à°• రోజà±|$1 రోజà±à°²}}',
+'weeks' => '{{PLURAL:$1|$1 వారం|$1 వారాలà±}}',
'months' => '{{PLURAL:$1|ఒక నెల|$1 నెలల}}',
'years' => '{{PLURAL:$1|à°’à°• సంవతà±à°¸à°°à°‚|$1 సంవతà±à°¸à°°à°¾à°²}}',
'ago' => '$1 à°•à±à°°à°¿à°¤à°‚',
'just-now' => 'ఇపà±à°ªà±à°¡à±‡',
+# Human-readable timestamps
+'hours-ago' => '$1 {{PLURAL:$1|à°—à°‚à°Ÿ|à°—à°‚à°Ÿà°²}} à°•à±à°°à°¿à°¤à°‚',
+'minutes-ago' => '$1 {{PLURAL:$1|నిమిషం|నిమిషాల}} à°•à±à°°à°¿à°¤à°‚',
+'seconds-ago' => '$1 {{PLURAL:$1|à°•à±à°·à°£à°‚|à°•à±à°·à°£à°¾à°²}} à°•à±à°°à°¿à°¤à°‚',
+'monday-at' => 'సోమవారం నాడౠ$1కి',
+'tuesday-at' => 'మంగళవారం నాడౠ$1కి',
+'wednesday-at' => 'à°¬à±à°§à°µà°¾à°°à°‚ నాడౠ$1à°•à°¿',
+'thursday-at' => 'à°—à±à°°à±à°µà°¾à°°à°‚ నాడౠ$1à°•à°¿',
+'friday-at' => 'à°¶à±à°•à±à°°à°µà°¾à°°à°‚ నాడౠ$1à°•à°¿',
+'saturday-at' => 'శనివారం నాడౠ$1కి',
+'sunday-at' => 'ఆదివారం నాడౠ$1కి',
+'yesterday-at' => 'నినà±à°¨ $1à°•à°¿',
+
# Bad image list
'bad_image_list' => 'à°•à°¿à°‚à°¦ తెలిపిన తీరà±à°²à±‹ కలపాలి:
@@ -2875,7 +2885,7 @@ $1',
* gpslongitude
* gpsaltitude',
-# EXIF tags
+# Exif tags
'exif-imagewidth' => 'వెడలà±à°ªà±',
'exif-imagelength' => 'à°Žà°¤à±à°¤à±',
'exif-bitspersample' => 'à°’à°•à±à°•à±‹ కాంపొనెంటà±à°•à± బిటà±à°²à±',
@@ -3041,7 +3051,7 @@ $1',
'exif-originalimageheight' => 'à°•à°¤à±à°¤à°¿à°°à°¿à°‚చబడక à°®à±à°‚దౠబొమà±à°® యొకà±à°• à°Žà°¤à±à°¤à±',
'exif-originalimagewidth' => 'à°•à°¤à±à°¤à°¿à°°à°¿à°‚చబడక à°®à±à°‚దౠబొమà±à°® యొకà±à°• వెడలà±à°ªà±',
-# EXIF attributes
+# Exif attributes
'exif-compression-1' => 'à°•à±à°¦à°¿à°‚చని',
'exif-copyrighted-true' => 'నకలà±à°¹à°•à±à°•à±à°²à±à°•à°²à°¦à°¿',
@@ -3399,7 +3409,6 @@ $5
'version-other' => 'ఇతర',
'version-mediahandlers' => 'మీడియానౠఫైళà±à°²à°¨à± నడిపించే పొడిగింపà±à°²à±',
'version-hooks' => 'కొకà±à°•à°¾à°²à±',
-'version-extension-functions' => 'పొడిగింపౠఫంకà±à°·à°¨à±à°²à±',
'version-parser-extensiontags' => 'పారà±à°¸à°°à± పొడిగింపౠటà±à°¯à°¾à°—à±à°²à±',
'version-parser-function-hooks' => 'పారà±à°¸à°°à±à°•à± కొకà±à°•à°¾à°²à±',
'version-hook-name' => 'కొకà±à°•à±†à°‚ పేరà±',
@@ -3420,13 +3429,13 @@ $5
'version-entrypoints-header-entrypoint' => 'à°ªà±à°°à°µà±‡à°¶ బిందà±à°µà±',
'version-entrypoints-header-url' => 'à°šà°¿à°°à±à°¨à°¾à°®à°¾',
-# Special:FilePath
-'filepath' => 'పూరà±à°¤à°¿ à°šà°¿à°°à±à°¨à°¾à°®à°¾',
-'filepath-page' => '{{ns:file}}:',
-'filepath-submit' => 'వెళà±à°³à±',
-'filepath-summary' => 'à°ˆ à°ªà±à°°à°¤à±à°¯à±‡à°• పేజీలో ఫైళà±à°² పేరà±à°²à± ఇసà±à°¤à±‡ వాటి పూరà±à°¤à°¿ à°šà°¿à°°à±à°¨à°¾à°®à°²à± వసà±à°¤à°¾à°¯à°¿. బొమà±à°®à°²à±ˆà°¤à±‡ వాటి పూరà±à°¤à°¿ సైజà±à°¤à±‹ తెరà±à°šà±à°•à±à°‚టాయి, బొమà±à°®à°²à± కాని ఇతర ఫైళà±à°²à± వాటి à°…à°¨à±à°¬à°‚à°§ à°ªà±à°°à±‹à°—à±à°°à°¾à°®à±à°²à°¤à±‹ తెరà±à°šà±à°•à±à°‚టాయి.
-
-పేరà±à°•à± à°®à±à°‚దౠ"{{ns:file}}:" అని చేరà±à°šà°µà°¦à±à°¦à±.',
+# Special:Redirect
+'redirect-submit' => 'వెళà±à°³à±',
+'redirect-value' => 'విలà±à°µ:',
+'redirect-user' => 'వాడà±à°•à°°à°¿ ID',
+'redirect-revision' => 'పేజీ కూరà±à°ªà±',
+'redirect-file' => 'దసà±à°¤à±à°°à°ªà± పేరà±',
+'redirect-not-exists' => 'విలà±à°µ కనబడలేదà±',
# Special:FileDuplicateSearch
'fileduplicatesearch' => 'ఫైళà±à°² మారà±à°ªà±à°°à°¤à±à°² కోసం వెతà±à°•à±',
@@ -3517,6 +3526,8 @@ $5
'htmlform-submit' => 'దాఖలà±à°šà±†à°¯à±à°¯à°¿',
'htmlform-reset' => 'మారà±à°ªà±à°²à°¨à± à°°à°¦à±à°¦à±à°šà±†à°¯à±à°¯à°¿',
'htmlform-selectorother-other' => 'ఇతర',
+'htmlform-no' => 'కాదà±',
+'htmlform-yes' => 'à°…à°µà±à°¨à±',
# SQLite database support
'sqlite-has-fts' => '$1 పూరà±à°¤à°¿-పాఠà±à°¯ à°…à°¨à±à°µà±‡à°·à°£ తోడà±à°ªà°¾à°Ÿà±à°¤à±‹',
diff --git a/languages/messages/MessagesTet.php b/languages/messages/MessagesTet.php
index 5549db2f..51a6d736 100644
--- a/languages/messages/MessagesTet.php
+++ b/languages/messages/MessagesTet.php
@@ -228,7 +228,7 @@ $messages = array(
'jumptonavigation' => 'hatudu-dalan',
'jumptosearch' => 'buka',
-# 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).
+# 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).
'aboutsite' => 'Kona-ba {{SITENAME}}',
'aboutpage' => 'Project:Kona-ba',
'copyright' => 'Testu pájina nian iha $1 okos.',
@@ -238,7 +238,6 @@ $messages = array(
'disclaimers' => 'Avisu legál',
'disclaimerpage' => 'Project:Avisu legál',
'edithelp' => 'Ajuda kona-ba edita',
-'edithelppage' => 'Help:Edita',
'helppage' => 'Help:Konteúdu',
'mainpage' => 'Pájina Mahuluk',
'mainpage-description' => 'Pájina Mahuluk',
@@ -859,10 +858,7 @@ Ita-nia mudansa la armazenadu seidauk!",
'siteusers' => "{{PLURAL:$2|uza-na'in|uza-na'in}} {{SITENAME}} nian $1",
# Skin names
-'skinname-standard' => 'Klásiku',
'skinname-cologneblue' => 'Kolónia azúl',
-'skinname-myskin' => 'MySkin',
-'skinname-chick' => 'Manu',
# Browsing diffs
'previousdiff' => 'â†Versaun molok',
@@ -882,7 +878,7 @@ Liña hotu tenke komesa ho *
Ligasaun uluk iha liña tenke ligasaun bá imajen aat.
Ligasaun seluk iha liña - ne'e pájina sira iha ne'ebé bele inklui imajen aat.",
-# EXIF tags
+# Exif tags
'exif-make' => 'Fabrikante kámara nian',
'exif-model' => 'Kámara',
'exif-artist' => 'Autór',
@@ -963,10 +959,6 @@ Ligasaun seluk iha liña - ne'e pájina sira iha ne'ebé bele inklui imajen aat.
'version-software-product' => 'Produtu',
'version-software-version' => 'Versaun',
-# Special:FilePath
-'filepath-page' => 'Fail:',
-'filepath-submit' => 'Bá',
-
# Special:FileDuplicateSearch
'fileduplicatesearch-submit' => 'Buka',
diff --git a/languages/messages/MessagesTg_cyrl.php b/languages/messages/MessagesTg_cyrl.php
index 9a9c71fb..f7ea5cd2 100644
--- a/languages/messages/MessagesTg_cyrl.php
+++ b/languages/messages/MessagesTg_cyrl.php
@@ -100,9 +100,6 @@ $messages = array(
'tog-shownumberswatching' => 'Ðишон додани шумораи корбарони пайгир',
'tog-oldsig' => 'Пешнамоиши имзои вуҷуддошта:',
'tog-fancysig' => 'Имзоро ба Ñурати викиматн ба назар бигир (бе пайванди худкор)',
-'tog-externaleditor' => 'ИÑтифода аз вироишгари хориҷӣ ба таври пешфарз (фақат барои корбарони пешрафта, ниёзманди танзимоти вижа дар ройонаи шумо аÑÑ‚. [//www.mediawiki.org/wiki/Manual:External_editors Иттилооти бештар.])',
-'tog-externaldiff' => 'ИÑтифода аз тафовутгири (diff) хориҷӣ ба таври пешфарз (фақат барои корбарони пешрафта, ниёзманди танзимоти вижа дар ройонаи шумо аÑÑ‚. [//www.mediawiki.org/wiki/Manual:External_editors Иттилооти бештар.])',
-'tog-showjumplinks' => 'Ðамоиши пайвандҳои даÑтраÑии "ҷаҳиш ба" дар феҳриÑти мундариҷот',
'tog-uselivepreview' => 'ИÑтифода аз пешнамоиши зинда (ҶаваСкрипт) (Озмоишӣ)',
'tog-forceeditsummary' => 'Ҳангоме ки хулоÑаи вироиш нанавиштаам юа ман иÑлоҳ бидеҳ',
'tog-watchlisthideown' => 'Пинҳон намудани вироишҳои ман дар феҳриÑти назарот',
@@ -295,7 +292,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).
+# 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).
'aboutsite' => 'Дар бораи {{SITENAME}}',
'aboutpage' => 'Project:Дар бораи',
'copyright' => 'Мӯҳтаво таҳти иҷозатномаи $1 даÑÑ‚Ñ€Ð°Ñ Ð°ÑÑ‚.',
@@ -305,7 +302,6 @@ $1',
'disclaimers' => 'Такзибнома',
'disclaimerpage' => 'Project:Такзибномаи умумӣ',
'edithelp' => 'Роҳнамои вироиш',
-'edithelppage' => 'Help:Вироиш',
'helppage' => 'Help:Мундариҷа',
'mainpage' => 'Саҳифаи ÐÑлӣ',
'mainpage-description' => 'Саҳифаи ÐÑлӣ',
@@ -375,17 +371,6 @@ $1',
# General errors
'error' => 'Иштибоҳ',
'databaseerror' => 'Хатои бойгоҳи дода',
-'dberrortext' => 'Ишколе дар даÑтури фириÑтанда шуда ба пойгоҳи дода рух дод.
-Далели ин мушкил метавонад Ñроде дар нармафзор бошад.
-Ин охирин даÑтуре буд ки барои пойгоҳи дода фириÑтода шуд:
-<blockquote><tt>$1</tt></blockquote>
-ин даÑтур аз даруни амалгир "<tt>$2</tt>".
-Погоҳи дода ин хаторо бозгардонд "<tt>$3: $4</tt>".',
-'dberrortextcl' => 'Хатое дар даÑтури фириÑтодашуда ба пойгоҳи дода рух дод.
-Охирин даÑтуре ки ба пойгоҳи дода фириÑтода шуд ин буд:
-"$1"
-аз даруни амалгар фириÑтода шуд "$2".
-Пойгоҳи дода (MySQL) ин хаторо бозгардонд "$3: $4"',
'laggedslavemode' => 'Ҳушдор: Саҳифа мумкин аÑÑ‚ рӯзраÑониҳои охирро дар бар нагирад.',
'readonly' => 'Бойгоҳи дода қуфл шудааÑÑ‚',
'enterlockreason' => 'Далелеро барои қуфл кардан зикр кунед, ва тақрибан вақти аз қуфл озод шуданашро ҳам зикр кунед',
@@ -429,7 +414,6 @@ $1',
'viewsourcetext' => 'Шумо метавонед матни викии ин Ñаҳифаро назар кунед Ñ‘ нуÑха бардоред:',
'protectedinterface' => 'Ин Ñаҳифа ороишдиҳандаи матни ин нармафзор аÑÑ‚, ва ба манзури пешгирӣ аз харобкорӣ қуфл шудааÑÑ‚.',
'editinginterface' => "'''Огоҳӣ:''' Шумо Ñаҳифаеро вироиш карда иÑтодаед, ки матни интерфейÑи барнома мебошад. Тағйироти ин Ñаҳифа барои намуди интерфейÑи дигар корбарон таъÑир хоҳад раÑонид. Барои тарҷумаҳо, лутфан аз [//translatewiki.net/wiki/Main_Page?setlang=tg Бетавики], ки лоиҳаи маҳаликунонии МедиаВики мебошад, иÑтифода кунед.",
-'sqlhidden' => '(ДаÑтури SQL пинҳониÑÑ‚)',
'cascadeprotected' => 'Ин Ñаҳифа аз вироиш муҳофизат шудааÑÑ‚, барои ин ки дар {{PLURAL:$1|Ñаҳифаи|Ñаҳифаҳои}} муҳофизатшудаи зерин, ки гузаинаи "обшорӣ" дар {{PLURAL:$1|он|онҳо}} интихоб шудааÑÑ‚, фаро гирифтааÑÑ‚: $2',
'namespaceprotected' => "Шумо иҷозати вироиши Ñаҳифаҳои фазоиноми '''$1'''-ро надоред.",
'ns-specialprotected' => 'Саҳифаҳои вижа ғайри қобили вироиш ҳаÑтанд.',
@@ -527,7 +511,7 @@ $1',
'newpassword' => 'Калимаи нави убур:',
'retypenew' => 'Калимаи нави убурро такроран навиÑед:',
'resetpass_submit' => 'Калимаи убурро танзим карда ба ÑиÑтем вуруд кунед',
-'resetpass_success' => 'Калимаи убури шумо бо муваффақиÑÑ‚ тағйир дода шуд! Дар ҳоли ворид кардани шумо ба ÑиÑтем...',
+'changepassword-success' => 'Калимаи убури шумо бо муваффақиÑÑ‚ тағйир дода шуд! Дар ҳоли ворид кардани шумо ба ÑиÑтем...',
'resetpass_forbidden' => 'Дар {{SITENAME}} калимаҳои убурро наметавон тағйир дод',
'resetpass-no-info' => 'Барои даÑтраÑии муÑтақим ба ин Ñаҳифа шумо боÑд ба ÑиÑтем ворид шуда бошед.',
'resetpass-submit-loggedin' => 'Тағйири гузарвожа',
@@ -829,7 +813,6 @@ $1',
'searchmenu-legend' => 'Гузинаҳои ҷуÑтуҷӯ',
'searchmenu-exists' => "'''Саҳифае бо номи \"[[:\$1]]\" дар ин вики вуҷуд дорад.'''",
'searchmenu-new' => "'''Эҷоди Ñаҳифаи \"[[:\$1]]\" дар ин вики!'''",
-'searchhelp-url' => 'Help:Мундариҷа',
'searchprofile-articles' => 'Саҳифаҳои мӯҳтаво',
'searchprofile-project' => 'Саҳифаҳои роҳномо ва лоиҳа',
'searchprofile-images' => 'ЧандраÑонаӣ',
@@ -864,14 +847,6 @@ $1',
'search-external' => 'ҶуÑтуҷӯи хориҷӣ',
'searchdisabled' => 'ҶуÑтуҷу дар {{SITENAME}} ғайрифаъол карда шудааÑÑ‚. Шумо метавонед тариқи Google дар ҳол ҷуÑтуҷӯ кунед. Таваҷҷӯҳ кунед, ки натоиҷи ҷуÑтуҷӯ {{SITENAME}} метавонад барӯз набошад.',
-# Quickbar
-'qbsettings' => 'Танзимоти тезхат (Quickbar)',
-'qbsettings-none' => 'Ðабошад',
-'qbsettings-fixedleft' => 'Сабти чап',
-'qbsettings-fixedright' => 'Сабти роÑÑ‚',
-'qbsettings-floatingleft' => 'Шиновар чап',
-'qbsettings-floatingright' => 'Шиновар роÑÑ‚',
-
# Preferences page
'preferences' => 'Тарҷиҳот',
'mypreferences' => 'Танзимот',
@@ -893,7 +868,6 @@ $1',
'saveprefs' => 'Захираи тарҷиҳот',
'resetprefs' => 'Тозакунии тағйироти захиранашуда',
'prefs-editing' => 'Дар ҳоли вироиш',
-'prefs-edit-boxsize' => 'Ҳаҷми равзанаи вироиш.',
'rows' => 'Теъдоди Ñатрҳо:',
'columns' => 'Теъдоди Ñутунҳо:',
'searchresultshead' => 'ҶуÑтуҷӯ',
@@ -1073,7 +1047,6 @@ $1',
'recentchangeslinked-feed' => 'Таъғироти монандӣ',
'recentchangeslinked-toolbox' => 'Таъғироти монандӣ',
'recentchangeslinked-title' => 'Тағйирҳои алоқаманд ба "$1"',
-'recentchangeslinked-noresult' => 'Дар давоми замони додашуда тағйире дар Ñаҳифаҳои пайваÑта рух надодааÑÑ‚.',
'recentchangeslinked-summary' => "Ин феҳриÑти тағйироти охир барои Ñаҳифаҳои пайваÑта аз Ñаҳифаи мушаххаÑшуда мебошад (Ñ‘ ба аъзоёни гурӯҳи мушаххаÑшуда).
Саҳифаҳои дар [[Special:Watchlist|феҳриÑти назароти шумо]] буда '''пурранг''' ҳаÑтанд.",
'recentchangeslinked-page' => 'Ðоми Ñаҳифа:',
@@ -1268,10 +1241,6 @@ $1',
'statistics-users-active' => 'Корбарони фаъол',
'statistics-mostpopular' => 'Саҳифаҳои биÑÑ‘Ñ€ назаркардашуда',
-'disambiguations' => 'Саҳифаҳои ибҳомзудоӣ',
-'disambiguationspage' => 'Template:ибҳомзудоӣ',
-'disambiguations-text' => "Саҳифаҳои зерин пайванд ба '''Ñаҳифаи ибҳомзудоӣ''' доранд. Ин Ñаҳифаҳо боÑд ба мавзӯъи муноÑиби худ пайваÑÑ‚ шаванд.<br />Саҳифа Ибҳомзудоӣ дар назар гирифта мешавад, ки дар он шаблоне, ки ба [[MediaWiki:Disambiguationspage]] пайванд дорад иÑтифода шуда бошад",
-
'doubleredirects' => 'Тағйири маÑирҳои дутоӣ',
'doubleredirectstext' => 'Ҳар Ñатр дар бар дорандаи пайвандҳое ба тағйири маÑири аввал ва дувум ва ҳамчунин хати нахуÑÑ‚ тагйири маÑири дувум аÑÑ‚. Маъмулан Ñаҳифаи мақÑади воқеъӣ, ки нахуÑтин тағйири маÑир боÑд ба он бошад ба ин гуна Ð¼ÑƒÑˆÐ°Ñ…Ñ…Ð°Ñ Ð¼ÐµÑˆÐ°Ð²Ð°Ð´.',
'double-redirect-fixer' => 'Таъмиркори тағйирмаÑирҳо',
@@ -1450,10 +1419,9 @@ Also see [[Special:WantedCategories|wanted categories]].',
'unwatchthispage' => 'Тавқифи пайгирии ин Ñаҳифа',
'notanarticle' => 'Мақола неÑÑ‚',
'notvisiblerev' => 'ÐуÑха ҳазф шуд',
-'watchnochange' => 'Ягон мавриди пайгириҳои шумо дар давраи замони намоишёфта вироиш нашуда аÑÑ‚.',
'watchlist-details' => '{{PLURAL:$1|$1 Ñаҳифаи|$1 Ñаҳифаҳои}} дар феҳриÑти пайгириҳои шумо, бидуни ҳиÑоби Ñаҳифаҳои баҳÑ.',
-'wlheader-enotif' => '* ИттилоораÑонии тариқи почтаи Ñлектронӣ (E-mail) имконпазир аÑÑ‚.',
-'wlheader-showupdated' => "* Саҳифаҳое, ки Ð¿Ð°Ñ Ð°Ð· охирин Ñар заданатон ба онҳо тағйир кардаанд '''пурранг''' нишон дода шудаанд",
+'wlheader-enotif' => 'ИттилоораÑонии тариқи почтаи Ñлектронӣ (E-mail) имконпазир аÑÑ‚.',
+'wlheader-showupdated' => "Саҳифаҳое, ки Ð¿Ð°Ñ Ð°Ð· охирин Ñар заданатон ба онҳо тағйир кардаанд '''пурранг''' нишон дода шудаанд",
'watchmethod-recent' => 'барраÑии вироишҳои охир барои Ñаҳифаҳои пайгиришуда',
'watchmethod-list' => 'барраÑии Ñаҳифаҳои пайгиришуда барои вироишҳои охир',
'watchlistcontains' => 'ФеҳриÑти пайгириҳои шумо $1 {{PLURAL:$1|Ñаҳифаро|Ñаҳифаҳоро}} дар бар мегирад.',
@@ -1752,11 +1720,8 @@ $1',
'ipb_cant_unblock' => 'Хато: Ðишонаи баÑта шудани $1 Ñ‘Ñ„Ñ‚ нашуд. Мумкин аÑÑ‚ пештар боз шуда бошад.',
'ipb_blocked_as_range' => 'Хато: Ðишонаи IP-и $1 ба шакли муÑтақим баÑта нашудааÑÑ‚ ва наметавонад боз шавад. Ин нишона ҳамроҳи $2, баÑта шуда қобили боз шудан аÑÑ‚.',
'ip_range_invalid' => 'Сафи IP номӯътабар аÑÑ‚.',
-'blockme' => 'ДаÑтраÑии манро қать кун',
'proxyblocker' => 'ПрокÑибанд',
-'proxyblocker-disabled' => 'Ин амал ғайрифаъол шудааÑÑ‚.',
'proxyblockreason' => 'Ðз Ñабаби пешкор боз (open proxy) буданаш, нишонаи IP-и шумо баÑта шудааÑÑ‚. Лутфан бо таъминкунандаи хизматҳои Интернетии худ Ñ‘ пуштибони техникӣ Ñ‚Ð°Ð¼Ð¾Ñ Ð±Ð¸Ð³Ð¸Ñ€ÐµÐ´ ва онҳоро бо ин мушкилии амниÑтии муҳим огоҳ кунед.',
-'proxyblocksuccess' => 'Ðнҷом шуд.',
'sorbsreason' => 'Ðишонаи IP-и шумо ҳамчун Ñк прокÑии кушода дар DNSBL феҳриÑÑ‚ шудааÑÑ‚, ки аз тарафи {{SITENAME}} иÑтифода мешавад.',
'sorbs_create_account_reason' => 'Ðишонаи IP-и шумо ҳамчун прокÑии кушода дар DNSBL, ки аз тарафи {{SITENAME}} иÑтифода мешавад, феҳриÑÑ‚ шудааÑÑ‚. Шумо наметавонед ҳиÑоби корабариеро Ñҷод кунед',
@@ -2092,7 +2057,7 @@ $1',
* gpslongitude
* gpsaltitude',
-# EXIF tags
+# Exif tags
'exif-imagewidth' => 'ВаÑеъӣ',
'exif-imagelength' => 'Баландӣ',
'exif-bitspersample' => 'Ðуқта дар ҳар ҷузъ',
@@ -2206,7 +2171,7 @@ $1',
'exif-gpsdatestamp' => 'Таърихи ҶПС',
'exif-gpsdifferential' => 'ТаÑҳеҳи ҷузъии ҶПС',
-# EXIF attributes
+# Exif attributes
'exif-compression-1' => 'Ғайрифишурда',
'exif-unknowndate' => 'Таърихи номаълум',
@@ -2496,7 +2461,6 @@ $5
'version-other' => 'Дигар',
'version-mediahandlers' => 'БадаÑтгирандаҳои раÑонаҳо',
'version-hooks' => 'Қолабҳо',
-'version-extension-functions' => 'Ðмалгарҳои афзуна',
'version-parser-extensiontags' => 'БарчаÑбҳои афзунаҳои таҷзеҳгар',
'version-parser-function-hooks' => 'Қолабҳои амалгарҳои таҷзеҳгар',
'version-hook-name' => 'Ðоми қолаб',
@@ -2507,15 +2471,6 @@ $5
'version-software-product' => 'МаҳÑул',
'version-software-version' => 'ÐуÑха',
-# Special:FilePath
-'filepath' => 'МаÑири парванда',
-'filepath-page' => 'Парванда:',
-'filepath-submit' => 'МаÑир',
-'filepath-summary' => 'Ин Ñаҳифаи вижа нишонаи комил барои Ñк парвандаро нишон медиҳад.
-ÐкÑҳо бо кайфиÑÑ‚ бо ҳаҷми пурраашон нишон дода мешаванд, дигар навъҳои парвандаҳои дигар бо барномаҳои алоқаманди махÑÑƒÑ Ð±Ð° худашон боз мешаванд.
-
-Ðишонаи пайвандро бидуни пешванд "{{ns:file}}:" ворид кунед.',
-
# Special:FileDuplicateSearch
'fileduplicatesearch' => 'ҶуÑтуҷӯ барои парвандаҳои такрорӣ',
'fileduplicatesearch-summary' => 'ҶуÑтуҷӯ барои парвандаҳои такрорӣ бар аÑоÑи миқдори дар ҳам шудаи онҳо Ñурат мегирад.',
diff --git a/languages/messages/MessagesTg_latn.php b/languages/messages/MessagesTg_latn.php
index 61887afa..40debf6b 100644
--- a/languages/messages/MessagesTg_latn.php
+++ b/languages/messages/MessagesTg_latn.php
@@ -42,9 +42,6 @@ $messages = array(
'tog-shownumberswatching' => 'NiÅŸon dodani ÅŸumorai korbaroni pajgir',
'tog-oldsig' => 'Peşnamoişi imzoi vuçuddoşta:',
'tog-fancysig' => 'Imzoro ba surati vikimatn ba nazar bigir (be pajvandi xudkor)',
-'tog-externaleditor' => 'Istifoda az viroişgari xoriçī ba tavri peşfarz (faqat baroi korbaroni peşrafta, nijozmandi tanzimoti viƶa dar rojonai şumo ast. [//www.mediawiki.org/wiki/Manual:External_editors Ittilooti beştar.])',
-'tog-externaldiff' => 'Istifoda az tafovutgiri (diff) xoriçī ba tavri peşfarz (faqat baroi korbaroni peşrafta, nijozmandi tanzimoti viƶa dar rojonai şumo ast. [//www.mediawiki.org/wiki/Manual:External_editors Ittilooti beştar.])',
-'tog-showjumplinks' => 'Namoişi pajvandhoi dastrasiji "çahiş ba" dar fehristi mundariçot',
'tog-uselivepreview' => 'Istifoda az peşnamoişi zinda (ÇavaSkript) (Ozmoişī)',
'tog-forceeditsummary' => 'Hangome ki xulosai viroiÅŸ nanaviÅŸtaam jua man isloh bideh',
'tog-watchlisthideown' => 'Pinhon namudani viroiÅŸhoi man dar fehristi nazarot',
@@ -236,7 +233,7 @@ Lutfan qabl az taloÅŸ dubora baroi didani in sahifa muddate sabr kuned.
$1",
'pool-errorunknown' => 'Xatogiji noÅŸinos',
-# 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).
+# 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).
'aboutsite' => 'Dar borai {{SITENAME}}',
'aboutpage' => 'Project:Dar borai',
'copyright' => 'Mūhtavo tahti içozatnomai $1 dastras ast.',
@@ -246,7 +243,6 @@ $1",
'disclaimers' => 'Takzibnoma',
'disclaimerpage' => 'Project:Takzibnomai umumī',
'edithelp' => 'Rohnamoi viroiÅŸ',
-'edithelppage' => 'Help:ViroiÅŸ',
'helppage' => 'Help:Mundariça',
'mainpage' => 'Sahifai Aslī',
'mainpage-description' => 'Sahifai Aslī',
@@ -316,12 +312,6 @@ Fehristi sahifahoi viƶai durustro metavoned dar inço [[Special:SpecialPages|{{
# General errors
'error' => 'IÅŸtiboh',
'databaseerror' => 'Xatoi bojgohi doda',
-'dberrortext' => 'IÅŸkole dar dasturi firistanda ÅŸuda ba pojgohi doda rux dod.
-Daleli in muÅŸkil metavonad erode dar narmafzor boÅŸad.
-In oxirin dasture bud ki baroi pojgohi doda firistoda ÅŸud:
-<blockquote><tt>$1</tt></blockquote>
-in dastur az daruni amalgir "<tt>$2</tt>".
-Pogohi doda in xatoro bozgardond "<tt>$3: $4</tt>".',
'laggedslavemode' => 'Huşdor: Sahifa mumkin ast rūzrasonihoi oxirro dar bar nagirad.',
'readonly' => 'Bojgohi doda qufl ÅŸudaast',
'enterlockreason' => 'Dalelero baroi qufl kardan zikr kuned, va taqriban vaqti az qufl ozod ÅŸudanaÅŸro ham zikr kuned',
@@ -363,7 +353,6 @@ Pursuçū: $2',
'protectedpagetext' => 'In sahifa baroi çilavgirī az viroiş qufl şudaast.',
'viewsourcetext' => 'Åžumo metavoned matni vikiji in sahifaro nazar kuned jo nusxa bardored:',
'protectedinterface' => 'In sahifa oroişdihandai matni in narmafzor ast, va ba manzuri peşgirī az xarobkorī qufl şudaast.',
-'sqlhidden' => '(Dasturi SQL pinhonist)',
'cascadeprotected' => 'In sahifa az viroiş muhofizat şudaast, baroi in ki dar {{PLURAL:$1|sahifai|sahifahoi}} muhofizatşudai zerin, ki guzainai "obşorī" dar {{PLURAL:$1|on|onho}} intixob şudaast, faro giriftaast: $2',
'namespaceprotected' => "Şumo içozati viroişi sahifahoi fazoinomi '''$1'''-ro nadored.",
'ns-specialprotected' => 'Sahifahoi viƶa ƣajri qobili viroiş hastand.',
@@ -450,7 +439,7 @@ Lutfan peÅŸ az on, ki dubora taloÅŸ kuned, sabr kuned.',
'newpassword' => 'Kalimai navi ubur:',
'retypenew' => 'Kalimai navi uburro takroran navised:',
'resetpass_submit' => 'Kalimai uburro tanzim karda ba sistem vurud kuned',
-'resetpass_success' => 'Kalimai uburi şumo bo muvaffaqijat taƣjir doda şud! Dar holi vorid kardani şumo ba sistem...',
+'changepassword-success' => 'Kalimai uburi şumo bo muvaffaqijat taƣjir doda şud! Dar holi vorid kardani şumo ba sistem...',
'resetpass-no-info' => 'Baroi dastrasiji mustaqim ba in sahifa ÅŸumo bojad ba sistem vorid ÅŸuda boÅŸed.',
'resetpass-submit-loggedin' => 'Taƣjiri guzarvoƶa',
'resetpass-wrong-oldpass' => "Guzarvoƶai muvaqat jo oxir nomū'tabar.
@@ -704,7 +693,6 @@ Itminon hosil kuned, ki in taƣjir davomnokiji ta'rixiji sahifaro nigoh dorad.",
'viewprevnext' => 'NamoiÅŸ ($1 {{int:pipe-separator}} $2) ($3)',
'searchmenu-legend' => 'Guzinahoi çustuçū',
'searchmenu-new' => "'''Eçodi sahifai \"[[:\$1]]\" dar in viki!'''",
-'searchhelp-url' => 'Help:Mundariça',
'searchprofile-advanced' => 'PeÅŸrafta',
'searchprofile-articles-tooltip' => 'Çustuçū dar $1',
'searchprofile-project-tooltip' => 'Çustuçū dar $1',
@@ -733,14 +721,6 @@ Itminon hosil kuned, ki in taƣjir davomnokiji ta'rixiji sahifaro nigoh dorad.",
'search-external' => 'Çustuçūi xoriçī',
'searchdisabled' => "Çustuçu dar {{SITENAME}} ƣajrifa'ol karda şudaast. Şumo metavoned tariqi Google dar hol çustuçū kuned. Tavaççūh kuned, ki natoiçi çustuçū {{SITENAME}} metavonad barūz naboşad.",
-# Quickbar
-'qbsettings' => 'Tanzimoti tezxat (Quickbar)',
-'qbsettings-none' => 'NaboÅŸad',
-'qbsettings-fixedleft' => 'Sabti cap',
-'qbsettings-fixedright' => 'Sabti rost',
-'qbsettings-floatingleft' => 'Åžinovar cap',
-'qbsettings-floatingright' => 'Åžinovar rost',
-
# Preferences page
'preferences' => 'Tarçihot',
'mypreferences' => 'Tarçihoti man',
@@ -761,7 +741,6 @@ Itminon hosil kuned, ki in taƣjir davomnokiji ta'rixiji sahifaro nigoh dorad.",
'saveprefs' => 'Zaxirai tarçihot',
'resetprefs' => 'Tozakuniji taƣjiroti zaxiranaşuda',
'prefs-editing' => 'Dar holi viroiÅŸ',
-'prefs-edit-boxsize' => 'Haçmi ravzanai viroiş.',
'rows' => "Te'dodi satrho:",
'columns' => "Te'dodi sutunho:",
'searchresultshead' => 'Çustuçū',
@@ -933,7 +912,6 @@ On bojad kamtar az $1 {{PLURAL:$1|alomat|alomatho}} boÅŸad.',
'recentchangeslinked-feed' => "Ta'ƣiroti monandī",
'recentchangeslinked-toolbox' => "Ta'ƣiroti monandī",
'recentchangeslinked-title' => 'Taƣjirhoi aloqamand ba "$1"',
-'recentchangeslinked-noresult' => 'Dar davomi zamoni dodaşuda taƣjire dar sahifahoi pajvasta rux nadodaast.',
'recentchangeslinked-summary' => "In fehristi taƣjiroti oxir baroi sahifahoi pajvasta az sahifai muşaxxasşuda meboşad (jo ba a'zojoni gurūhi muşaxxasşuda).
Sahifahoi dar [[Special:Watchlist|fehristi nazaroti ÅŸumo]] buda '''purrang''' hastand.",
'recentchangeslinked-page' => 'Nomi sahifa:',
@@ -1104,10 +1082,6 @@ Jak klik kardani rūi unvoni sutunho boisi taƣjiri tartibi namoişi parvandaho
'statistics-users-active' => "Korbaroni fa'ol",
'statistics-mostpopular' => 'Sahifahoi bisjor nazarkardaÅŸuda',
-'disambiguations' => 'Sahifahoi ibhomzudoī',
-'disambiguationspage' => 'Template:ibhomzudoī',
-'disambiguations-text' => "Sahifahoi zerin pajvand ba '''sahifai ibhomzudoī''' dorand. In sahifaho bojad ba mavzū'i munosibi xud pajvast şavand.<br />Sahifa Ibhomzudoī dar nazar girifta meşavad, ki dar on şablone, ki ba [[MediaWiki:Disambiguationspage]] pajvand dorad istifoda şuda boşad",
-
'doubleredirects' => 'Taƣjiri masirhoi dutoī',
'double-redirect-fixer' => "Ta'mirkori taƣjirmasirho",
@@ -1273,10 +1247,9 @@ Agar ÅŸumo dertar az fehristi nazarotaton in sahifaro hazv kardan xohed, dar men
'unwatchthispage' => 'Tavqifi pajgiriji in sahifa',
'notanarticle' => 'Maqola nest',
'notvisiblerev' => 'Nusxa hazf ÅŸud',
-'watchnochange' => 'Jagon mavridi pajgirihoi ÅŸumo dar davrai zamoni namoiÅŸjofta viroiÅŸ naÅŸuda ast.',
'watchlist-details' => '{{PLURAL:$1|$1 sahifai|$1 sahifahoi}} dar fehristi pajgirihoi ÅŸumo, biduni hisobi sahifahoi bahs.',
-'wlheader-enotif' => '* Ittiloorasoniji tariqi poctai elektronī (E-mail) imkonpazir ast.',
-'wlheader-showupdated' => "* Sahifahoe, ki pas az oxirin sar zadanaton ba onho taƣjir kardaand '''purrang''' nişon doda şudaand",
+'wlheader-enotif' => 'Ittiloorasoniji tariqi poctai elektronī (E-mail) imkonpazir ast.',
+'wlheader-showupdated' => "Sahifahoe, ki pas az oxirin sar zadanaton ba onho taƣjir kardaand '''purrang''' nişon doda şudaand",
'watchmethod-recent' => 'barrasiji viroiÅŸhoi oxir baroi sahifahoi pajgiriÅŸuda',
'watchmethod-list' => 'barrasiji sahifahoi pajgiriÅŸuda baroi viroiÅŸhoi oxir',
'watchlistcontains' => 'Fehristi pajgirihoi ÅŸumo $1 {{PLURAL:$1|sahifaro|sahifahoro}} dar bar megirad.',
@@ -1534,11 +1507,8 @@ Baroi fehristi mahrumijatho va basta şudanhoi amalijoti kununī ba [[Special:Bl
'ipb_cant_unblock' => 'Xato: NiÅŸonai basta ÅŸudani $1 joft naÅŸud. Mumkin ast peÅŸtar boz ÅŸuda boÅŸad.',
'ipb_blocked_as_range' => 'Xato: NiÅŸonai IP-i $1 ba ÅŸakli mustaqim basta naÅŸudaast va nametavonad boz ÅŸavad. In niÅŸona hamrohi $2, basta ÅŸuda qobili boz ÅŸudan ast.',
'ip_range_invalid' => "Safi IP nomū'tabar ast.",
-'blockme' => 'Dastrasiji manro qatь kun',
'proxyblocker' => 'Proksiband',
-'proxyblocker-disabled' => "In amal ƣajrifa'ol şudaast.",
'proxyblockreason' => "Az sababi peşkor boz (open proxy) budanaş, nişonai IP-i şumo basta şudaast. Lutfan bo ta'minkunandai xizmathoi Internetiji xud jo puştiboni texnikī tamos bigired va onhoro bo in muşkiliji amnijatiji muhim ogoh kuned.",
-'proxyblocksuccess' => 'Ançom şud.',
'sorbsreason' => 'NiÅŸonai IP-i ÅŸumo hamcun jak proksiji kuÅŸoda dar DNSBL fehrist ÅŸudaast, ki az tarafi {{SITENAME}} istifoda meÅŸavad.',
'sorbs_create_account_reason' => 'Nişonai IP-i şumo hamcun proksiji kuşoda dar DNSBL, ki az tarafi {{SITENAME}} istifoda meşavad, fehrist şudaast. Şumo nametavoned hisobi korabariero eçod kuned',
@@ -1871,7 +1841,7 @@ Faqat satrhoe, ki bo * şurū' şavand ba nazar girifta meşavand. Avvalin pajva
* gpslongitude
* gpsaltitude",
-# EXIF tags
+# Exif tags
'exif-imagewidth' => "Vase'Ä«",
'exif-imagelength' => 'Balandī',
'exif-bitspersample' => "Nuqta dar har çuz'",
@@ -1985,7 +1955,7 @@ Faqat satrhoe, ki bo * şurū' şavand ba nazar girifta meşavand. Avvalin pajva
'exif-gpsdatestamp' => "Ta'rixi ÇPS",
'exif-gpsdifferential' => "Tashehi çuz'iji ÇPS",
-# EXIF attributes
+# Exif attributes
'exif-compression-1' => 'Æ¢ajrifiÅŸurda',
'exif-unknowndate' => "Ta'rixi noma'lum",
@@ -2269,7 +2239,6 @@ Tavaççūh kuned, ki şumo metavoned az [[Special:EditWatchlist|viroişgari sta
'version-other' => 'Digar',
'version-mediahandlers' => 'Badastgirandahoi rasonaho',
'version-hooks' => 'Qolabho',
-'version-extension-functions' => 'Amalgarhoi afzuna',
'version-parser-extensiontags' => 'Barcasbhoi afzunahoi taçzehgar',
'version-parser-function-hooks' => 'Qolabhoi amalgarhoi taçzehgar',
'version-hook-name' => 'Nomi qolab',
@@ -2280,15 +2249,6 @@ Tavaççūh kuned, ki şumo metavoned az [[Special:EditWatchlist|viroişgari sta
'version-software-product' => 'Mahsul',
'version-software-version' => 'Nusxa',
-# Special:FilePath
-'filepath' => 'Masiri parvanda',
-'filepath-page' => 'Parvanda:',
-'filepath-submit' => 'Masir',
-'filepath-summary' => 'In sahifai viƶa nişonai komil baroi jak parvandaro nişon medihad.
-Aksho bo kajfijat bo haçmi purraaşon nişon doda meşavand, digar nav\'hoi parvandahoi digar bo barnomahoi aloqamandi maxsus ba xudaşon boz meşavand.
-
-NiÅŸonai pajvandro biduni peÅŸvand "{{ns:file}}:" vorid kuned.',
-
# Special:FileDuplicateSearch
'fileduplicatesearch' => 'Çustuçū baroi parvandahoi takrorī',
'fileduplicatesearch-summary' => 'Çustuçū baroi parvandahoi takrorī bar asosi miqdori dar ham şudai onho surat megirad.',
diff --git a/languages/messages/MessagesTh.php b/languages/messages/MessagesTh.php
index 8e04c9f5..a0d9ec1e 100644
--- a/languages/messages/MessagesTh.php
+++ b/languages/messages/MessagesTh.php
@@ -194,7 +194,7 @@ $dateFormats = array(
'ISO 8601 both' => 'xnY-xnm-xnd"T"xnH:xni:xns',
);
-$linkTrail = '/^([a-z]+)(.*)\$/sD';
+$linkTrail = '/^([a-z]+)(.*)$/sD';
$messages = array(
# User preference toggles
@@ -227,9 +227,6 @@ $messages = array(
'tog-shownumberswatching' => 'à¹à¸ªà¸”งจำนวนผู้ใช้ที่เà¸à¹‰à¸²à¸”ู',
'tog-oldsig' => 'ลายเซ็นที่ใช้อยู่:',
'tog-fancysig' => 'ใช้คำสั่งวิà¸à¸´à¸—ี่ปราà¸à¸à¹ƒà¸™à¸¥à¸²à¸¢à¹€à¸‹à¹‡à¸™à¸™à¸µà¹‰ (โดยไม่มีลิงà¸à¹Œà¸­à¸±à¸•à¹‚นมัติ)',
-'tog-externaleditor' => 'ใช้โปรà¹à¸à¸£à¸¡à¹à¸à¹‰à¹„ขภายนอà¸à¹‚ดยปริยาย (สำหรับผู้เชี่ยวชาà¸à¹€à¸—่านั้น ต้องà¸à¸²à¸£à¸à¸²à¸£à¸•à¸±à¹‰à¸‡à¸„่าพิเศษบนคอมพิวเตอร์ของคุณ [//www.mediawiki.org/wiki/Manual:External_editors ข้อมูลเพิ่มเติม])',
-'tog-externaldiff' => 'ใช้โปรà¹à¸à¸£à¸¡à¹€à¸›à¸£à¸µà¸¢à¸šà¹€à¸—ียบภายนอà¸à¹‚ดยปริยาย (สำหรับผู้เชี่ยวชาà¸à¹€à¸—่านั้น ต้องà¸à¸²à¸£à¸à¸²à¸£à¸•à¸±à¹‰à¸‡à¸„่าพิเศษบนคอมพิวเตอร์ของคุณ [//www.mediawiki.org/wiki/Manual:External_editors ข้อมูลเพิ่มเติม])',
-'tog-showjumplinks' => 'เปิดใช้งาน "à¸à¸£à¸°à¹‚ดด" อัตโนมัติไปตามลิงà¸à¹Œ',
'tog-uselivepreview' => 'à¹à¸ªà¸”งตัวอย่างà¸à¸²à¸£à¹à¸à¹‰à¹„ขà¹à¸šà¸šà¸—ันที (ทดลอง)',
'tog-forceeditsummary' => 'เตือนเมื่อช่องคำอธิบายอย่างย่อว่าง',
'tog-watchlisthideown' => 'ซ่อนà¸à¸²à¸£à¹à¸à¹‰à¹„ขของฉันจาà¸à¸£à¸²à¸¢à¸à¸²à¸£à¹€à¸à¹‰à¸²à¸”ู',
@@ -243,6 +240,8 @@ $messages = array(
'tog-showhiddencats' => 'à¹à¸ªà¸”งหมวดหมู่ที่ซ่อนอยู่',
'tog-noconvertlink' => 'ปิดใช้งานà¸à¸²à¸£à¹à¸›à¸¥à¸‡à¸Šà¸·à¹ˆà¸­à¹€à¸£à¸·à¹ˆà¸­à¸‡à¸‚องลิงà¸à¹Œ',
'tog-norollbackdiff' => 'ไม่à¹à¸ªà¸”งà¸à¸²à¸£à¹€à¸›à¸¥à¸µà¹ˆà¸¢à¸™à¹à¸›à¸¥à¸‡à¸«à¸¥à¸±à¸‡à¸”ำเนินà¸à¸²à¸£à¸¢à¹‰à¸­à¸™à¸à¸¥à¸±à¸šà¸‰à¸¸à¸à¹€à¸‰à¸´à¸™',
+'tog-useeditwarning' => 'เตือนฉัน เมื่อฉันà¸à¸³à¸¥à¸±à¸‡à¸ˆà¸°à¸­à¸­à¸à¸ˆà¸²à¸à¸«à¸™à¹‰à¸²à¹à¸à¹‰à¹„ขโดยมีข้อมูลที่ยังไม่ได้บันทึà¸',
+'tog-prefershttps' => 'ใช้à¸à¸²à¸£à¹€à¸Šà¸·à¹ˆà¸­à¸¡à¸•à¹ˆà¸­à¸›à¸¥à¸­à¸”ภัยทุà¸à¸„รั้งเมื่อล็อà¸à¸­à¸´à¸™',
'underline-always' => 'เสมอ',
'underline-never' => 'ไม่เคย',
@@ -306,6 +305,18 @@ $messages = array(
'oct' => 'ต.ค.',
'nov' => 'พ.ย.',
'dec' => 'ธ.ค.',
+'january-date' => '$1 มà¸à¸£à¸²à¸„ม',
+'february-date' => '$1 à¸à¸¸à¸¡à¸ à¸²à¸žà¸±à¸™à¸˜à¹Œ',
+'march-date' => '$1 มีนาคม',
+'april-date' => '$1 เมษายน',
+'may-date' => '$1 พฤษภาคม',
+'june-date' => '$1 มิถุนายน',
+'july-date' => '$1 à¸à¸£à¸à¸Žà¸²à¸„ม',
+'august-date' => '$1 สิงหาคม',
+'september-date' => '$1 à¸à¸±à¸™à¸¢à¸²à¸¢à¸™',
+'october-date' => '$1 ตุลาคม',
+'november-date' => '$1 พฤศจิà¸à¸²à¸¢à¸™',
+'december-date' => '$1 ธันวาคม',
# Categories related messages
'pagecategories' => '{{PLURAL:$1|หมวดหมู่|หมวดหมู่}}',
@@ -387,6 +398,7 @@ $messages = array(
'create-this-page' => 'สร้างหน้านี้',
'delete' => 'ลบ',
'deletethispage' => 'ลบหน้านี้',
+'undeletethispage' => 'à¸à¸¹à¹‰à¸„ืนหน้านี้',
'undelete_short' => 'à¸à¸¹à¹‰à¸„ืน $1 à¸à¸²à¸£à¹à¸à¹‰à¹„ข',
'viewdeleted_short' => 'ดู $1 à¸à¸²à¸£à¹à¸à¹‰à¹„ขที่ถูà¸à¸¥à¸š',
'protect' => 'ล็อà¸',
@@ -430,7 +442,7 @@ $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).
+# 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).
'aboutsite' => 'เà¸à¸µà¹ˆà¸¢à¸§à¸à¸±à¸š{{SITENAME}}',
'aboutpage' => 'Project:เà¸à¸µà¹ˆà¸¢à¸§à¸à¸±à¸š',
'copyright' => 'เนื้อหาอนุà¸à¸²à¸•à¹ƒà¸«à¹‰à¹€à¸œà¸¢à¹à¸žà¸£à¹ˆà¸ à¸²à¸¢à¹ƒà¸•à¹‰ $1 เว้นà¹à¸•à¹ˆà¸£à¸°à¸šà¸¸à¹„ว้เป็นอย่างอื่น',
@@ -440,7 +452,6 @@ $1',
'disclaimers' => 'ข้อปà¸à¸´à¹€à¸ªà¸˜à¸„วามรับผิดชอบ',
'disclaimerpage' => 'Project:ข้อปà¸à¸´à¹€à¸ªà¸˜à¸„วามรับผิดชอบทั่วไป',
'edithelp' => 'คำอธิบายà¸à¸²à¸£à¹à¸à¹‰à¹„ข',
-'edithelppage' => 'Help:à¸à¸²à¸£à¹à¸à¹‰à¹„ข',
'helppage' => 'Help:สารบัà¸',
'mainpage' => 'หน้าหลัà¸',
'mainpage-description' => 'หน้าหลัà¸',
@@ -517,17 +528,6 @@ $1',
# General errors
'error' => 'ข้อผิดพลาด',
'databaseerror' => 'ความผิดพลาดที่à¸à¸²à¸™à¸‚้อมูล',
-'dberrortext' => 'ไวยาà¸à¸£à¸“์ในà¸à¸²à¸£à¸„้นà¸à¸²à¸™à¸‚้อมูลผิดพลาด
-สาเหตุอาจเà¸à¸´à¸”จาà¸à¸šà¸±à¹Šà¸à¸‚องซอฟต์à¹à¸§à¸£à¹Œ
-à¸à¸²à¸£à¸„้นà¸à¸²à¸™à¸‚้อมูลล่าสุดà¸à¸£à¸°à¸—ำเมื่อ:
-<blockquote><tt>$1</tt></blockquote>
-จาà¸à¸Ÿà¸±à¸‡à¸à¹Œà¸Šà¸±à¸™ "<tt>$2</tt>"
-à¸à¸²à¸™à¸‚้อมูลà¹à¸ˆà¹‰à¸‡à¸‚้อผิดพลาดว่า "<samp>$3: $4</samp>"',
-'dberrortextcl' => 'ไวยาà¸à¸£à¸“์ในà¸à¸²à¸£à¸„้นà¸à¸²à¸™à¸‚้อมูลผิดพลาด
-à¸à¸²à¸£à¸„้นà¸à¸²à¸™à¸‚้อมูลล่าสุดà¸à¸£à¸°à¸—ำเมื่อ:
-"$1"
-จาà¸à¸Ÿà¸±à¸‡à¸à¹Œà¸Šà¸±à¸™ "$2"
-à¸à¸²à¸™à¸‚้อมูลà¹à¸ˆà¹‰à¸‡à¸‚้อผิดพลาดว่า "$3: $4"',
'laggedslavemode' => "'''คำเตือน:''' ข้อมูลในหน้าอาจไม่ใช่ข้อมูลล่าสุด",
'readonly' => 'à¸à¸²à¸™à¸‚้อมูลถูà¸à¸¥à¹‡à¸­à¸',
'enterlockreason' => 'ใส่เหตุà¹à¸«à¹ˆà¸‡à¸à¸²à¸£à¸¥à¹‡à¸­à¸ ทั้งเวลาที่คาดว่าจะปลดล็อà¸',
@@ -581,11 +581,14 @@ $1',
'editinginterface' => "'''คำเตือน:''' คุณà¸à¸³à¸¥à¸±à¸‡à¹à¸à¹‰à¹„ขหน้าที่ใช้เพื่อให้ข้อความอินเตอร์เฟซà¹à¸à¹ˆà¸‹à¸­à¸Ÿà¸•à¹Œà¹à¸§à¸£à¹Œ
à¸à¸²à¸£à¹€à¸›à¸¥à¸µà¹ˆà¸¢à¸™à¹à¸›à¸¥à¸‡à¸«à¸™à¹‰à¸²à¸™à¸µà¹‰à¸ˆà¸°à¸à¸£à¸°à¸—บต่อลัà¸à¸©à¸“ะของอินเตอร์เฟซผู้ใช้à¹à¸à¹ˆà¸œà¸¹à¹‰à¹ƒà¸Šà¹‰à¸­à¸·à¹ˆà¸™à¸šà¸™à¸§à¸´à¸à¸´à¸™à¸µà¹‰
ในà¸à¸²à¸£à¹€à¸žà¸´à¹ˆà¸¡à¸«à¸£à¸·à¸­à¹€à¸›à¸¥à¸µà¹ˆà¸¢à¸™à¹à¸›à¸¥à¸‡à¸„ำà¹à¸›à¸¥à¸ªà¸³à¸«à¸£à¸±à¸šà¸—ุà¸à¸§à¸´à¸à¸´ โปรดใช้ [//translatewiki.net/wiki/Main_Page?setlang=th translatewiki.net] โครงà¸à¸²à¸£à¹à¸›à¸¥à¸¡à¸µà¹€à¸”ียวิà¸à¸´à¹€à¸›à¹‡à¸™à¸ à¸²à¸©à¸²à¸–ิ่น",
-'sqlhidden' => '(คำสั่ง SQL ซ่อนอยู่)',
'cascadeprotected' => 'หน้านี้ได้รับà¸à¸²à¸£à¸›à¹‰à¸­à¸‡à¸à¸±à¸™à¸ˆà¸²à¸à¸à¸²à¸£à¹à¸à¹‰à¹„ข เนื่องจาà¸à¸«à¸™à¹‰à¸²à¸™à¸µà¹‰à¸–ูà¸à¹ƒà¸Šà¹‰à¹€à¸›à¹‡à¸™à¸ªà¹ˆà¸§à¸™à¸«à¸™à¸¶à¹ˆà¸‡à¹ƒà¸™{{PLURAL:$1|หน้า $2 ซึ่งได้รับà¸à¸²à¸£à¸›à¹‰à¸­à¸‡à¸à¸±à¸™à¹à¸šà¸š "ทบทุà¸à¸¥à¸³à¸”ับขั้น"|หน้าซึ่งได้รับà¸à¸²à¸£à¸›à¹‰à¸­à¸‡à¸à¸±à¸™à¹à¸šà¸š "ทบทุà¸à¸¥à¸³à¸”ับขั้น" ดังต่อไปนี้: $2}}',
'namespaceprotected' => "คุณไม่มีสิทธิà¹à¸à¹‰à¹„ขหน้าในเนมสเปซ '''$1'''",
'customcssprotected' => 'คุณไม่มีสิทธิà¹à¸à¹‰à¹„ขหน้าสไตล์ CSS นี้ เนื่องจาà¸à¸«à¸™à¹‰à¸²à¸™à¸µà¹‰à¸¡à¸µà¸à¸²à¸£à¸•à¸±à¹‰à¸‡à¸„่าส่วนบุคคลของผู้ใช้อื่น',
'customjsprotected' => 'คุณไม่มีสิทธิà¹à¸à¹‰à¹„ขหน้าจาวาสคริปต์นี้ เนื่องจาà¸à¸«à¸™à¹‰à¸²à¸™à¸µà¹‰à¸¡à¸µà¸à¸²à¸£à¸•à¸±à¹‰à¸‡à¸„่าส่วนบุคคลของผู้ใช้อื่น',
+'mycustomcssprotected' => 'คุณไม่ได้รับอนุà¸à¸²à¸•à¹ƒà¸«à¹‰à¹à¸à¹‰à¹„ขหน้าซีเอสเอสนี้',
+'mycustomjsprotected' => 'คุณไม่ได้รับอนุà¸à¸²à¸•à¹ƒà¸«à¹‰à¹à¸à¹‰à¹„ขหน้าจาวาสคริปต์นี้',
+'myprivateinfoprotected' => 'คุณไม่ได้รับอนุà¸à¸²à¸•à¹ƒà¸«à¹‰à¹à¸à¹‰à¹„ขข้อมูลส่วนตัวของคุณ',
+'mypreferencesprotected' => 'คุณไม่ได้รับอนุà¸à¸²à¸•à¹ƒà¸«à¹‰à¹à¸à¹‰à¹„ขà¸à¸²à¸£à¸•à¸±à¹‰à¸‡à¸„่าของคุณ',
'ns-specialprotected' => 'หน้าพิเศษไม่สามารถà¹à¸à¹‰à¹„ขได้',
'titleprotected' => "ชื่อเรื่องนี้ถูà¸à¸›à¹‰à¸­à¸‡à¸à¸±à¸™à¸¡à¸´à¹ƒà¸«à¹‰à¸ªà¸£à¹‰à¸²à¸‡à¹‚ดย [[User:$1|$1]]
เหตุผลที่ให้ไว้คือ ''$2''",
@@ -609,10 +612,19 @@ $1',
'welcomecreation-msg' => 'บัà¸à¸Šà¸µà¸‚องคุณถูà¸à¸ªà¸£à¹‰à¸²à¸‡à¸‚ึ้นà¹à¸¥à¹‰à¸§
อย่าลืมเปลี่ยนà¹à¸›à¸¥à¸‡[[Special:Preferences|à¸à¸²à¸£à¸•à¸±à¹‰à¸‡à¸„่าใน {{SITENAME}}]] ของคุณ',
'yourname' => 'ชื่อผู้ใช้',
+'userlogin-yourname' => 'ชื่อผู้ใช้',
+'userlogin-yourname-ph' => 'à¸à¸£à¸­à¸à¸Šà¸·à¹ˆà¸­à¸œà¸¹à¹‰à¹ƒà¸Šà¹‰',
+'createacct-another-username-ph' => 'à¸à¸£à¸­à¸à¸Šà¸·à¹ˆà¸­à¸œà¸¹à¹‰à¹ƒà¸Šà¹‰',
'yourpassword' => 'รหัสผ่าน',
+'userlogin-yourpassword' => 'รหัสผ่าน',
+'userlogin-yourpassword-ph' => 'à¸à¸£à¸­à¸à¸£à¸«à¸±à¸ªà¸œà¹ˆà¸²à¸™',
+'createacct-yourpassword-ph' => 'à¸à¸£à¸­à¸à¸£à¸«à¸±à¸ªà¸œà¹ˆà¸²à¸™',
'yourpasswordagain' => 'พิมพ์รหัสผ่านอีà¸à¸„รั้ง:',
+'createacct-yourpasswordagain' => 'ยืนยันรหัสผ่าน',
+'createacct-yourpasswordagain-ph' => 'à¸à¸£à¸­à¸à¸£à¸«à¸±à¸ªà¸œà¹ˆà¸²à¸™à¸­à¸µà¸à¸„รั้ง',
'remembermypassword' => 'จำà¸à¸²à¸£à¸¥à¹‡à¸­à¸à¸­à¸´à¸™à¸‚องฉันบนเบราเซอร์นี้ (นานสุด $1 วัน)',
-'securelogin-stick-https' => 'ยังคงเชื่อมต่อà¸à¸±à¸š HTTPS หลังจาà¸à¸¥à¹‡à¸­à¸à¸­à¸´à¸™',
+'userlogin-remembermypassword' => 'ให้ฉันอยู่ในระบบ',
+'userlogin-signwithsecure' => 'ใช้à¸à¸²à¸£à¹€à¸Šà¸·à¹ˆà¸­à¸¡à¸•à¹ˆà¸­à¸—ี่ปลอดภัย',
'yourdomainname' => 'โดเมนของคุณ:',
'password-change-forbidden' => 'คุณไม่สามารถเปลี่ยนรหัสผ่านบนวิà¸à¸´à¸™à¸µà¹‰',
'externaldberror' => 'มีข้อผิดพลาดของà¸à¸²à¸™à¸‚้อมูลในà¸à¸²à¸£à¸žà¸´à¸ªà¸¹à¸ˆà¸™à¹Œà¸•à¸±à¸§à¸ˆà¸£à¸´à¸‡ หรือคุณไม่ได้รับอนุà¸à¸²à¸•à¹ƒà¸«à¹‰à¸›à¸£à¸±à¸šà¸šà¸±à¸à¸Šà¸µà¸ à¸²à¸¢à¸™à¸­à¸à¸‚องคุณ',
@@ -624,17 +636,43 @@ $1',
'logout' => 'ล็อà¸à¹€à¸­à¸²à¸•à¹Œ',
'userlogout' => 'ล็อà¸à¹€à¸­à¸²à¸•à¹Œ',
'notloggedin' => 'ไม่ได้ล็อà¸à¸­à¸´à¸™',
+'userlogin-noaccount' => 'ไม่มีบัà¸à¸Šà¸µà¸«à¸£à¸·à¸­',
+'userlogin-joinproject' => 'เข้าร่วมà¸à¸±à¸š{{SITENAME}}',
'nologin' => 'ไม่มีบัà¸à¸Šà¸µà¸«à¸£à¸·à¸­ $1',
'nologinlink' => 'สร้างบัà¸à¸Šà¸µ',
'createaccount' => 'สร้างบัà¸à¸Šà¸µ',
'gotaccount' => "มีบัà¸à¸Šà¸µà¹à¸¥à¹‰à¸§à¹ƒà¸Šà¹ˆà¹„หม '''$1'''",
'gotaccountlink' => 'ล็อà¸à¸­à¸´à¸™',
'userlogin-resetlink' => 'ลืมรายละเอียดล็อà¸à¸­à¸´à¸™à¸‚องคุณหรือ',
+'userlogin-resetpassword-link' => 'ตั้งรหัสผ่านใหม่',
+'helplogin-url' => 'Help:à¸à¸²à¸£à¸¥à¹‡à¸­à¸à¸­à¸´à¸™',
+'userlogin-helplink' => '[[{{MediaWiki:helplogin-url}}|คำอธิบายเรื่องà¸à¸²à¸£à¸¥à¹‡à¸­à¸à¸­à¸´à¸™]]',
+'userlogin-loggedin' => 'คุณล็อà¸à¸­à¸´à¸™à¹ƒà¸™à¸Šà¸·à¹ˆà¸­ {{GENDER:$1|$1}} à¹à¸¥à¹‰à¸§
+ใช้à¹à¸šà¸šà¸”้านล่างเพื่อล็อà¸à¸­à¸´à¸™à¹€à¸›à¹‡à¸™à¸­à¸µà¸à¸œà¸¹à¹‰à¹ƒà¸Šà¹‰à¸«à¸™à¸¶à¹ˆà¸‡',
+'userlogin-createanother' => 'สร้างอีà¸à¸šà¸±à¸à¸Šà¸µ',
+'createacct-join' => 'à¸à¸£à¸­à¸à¸ªà¸²à¸£à¸ªà¸™à¹€à¸—ศของคุณด้านล่าง',
+'createacct-another-join' => 'à¸à¸£à¸­à¸à¸‚้อมูลของบัà¸à¸Šà¸µà¹ƒà¸«à¸¡à¹ˆà¸”้านล่าง',
+'createacct-emailrequired' => 'ที่อยู่อีเมล',
+'createacct-emailoptional' => 'ที่อยู่อีเมล (เลือà¸à¹„ม่ใส่ได้)',
+'createacct-email-ph' => 'à¸à¸£à¸­à¸à¸—ี่อยู่อีเมล',
+'createacct-another-email-ph' => 'à¸à¸£à¸­à¸à¸—ี่อยู่อีเมล',
'createaccountmail' => 'ใช้รหัสผ่านสุ่มชั่วคราวà¹à¸¥à¸°à¸ªà¹ˆà¸‡à¹„ปยังที่อยู่อีเมลที่ระบุ',
+'createacct-realname' => 'ชื่อจริง (เลือà¸à¹„ม่ใส่ได้)',
'createaccountreason' => 'เหตุผล:',
+'createacct-reason' => 'เหตุผล',
+'createacct-reason-ph' => 'เหตุใดคุณจึงสร้างอีà¸à¸šà¸±à¸à¸Šà¸µ',
+'createacct-captcha' => 'ตรวจสอบความปลอดภัย',
+'createacct-imgcaptcha-ph' => 'à¸à¸£à¸­à¸à¸‚้อความที่คุณเห็นด้านบน',
+'createacct-submit' => 'สร้างบัà¸à¸Šà¸µà¸‚องคุณ',
+'createacct-another-submit' => 'สร้างอีà¸à¸šà¸±à¸à¸Šà¸µ',
+'createacct-benefit-heading' => '{{SITENAME}}สร้างขึ้นจาà¸à¸„นเช่นคุณ',
+'createacct-benefit-body1' => '$1 à¸à¸²à¸£à¹à¸à¹‰à¹„ข',
+'createacct-benefit-body2' => '$1 หน้า',
+'createacct-benefit-body3' => '$1 ผู้ร่วมเขียน',
'badretype' => 'รหัสผ่านที่ใส่ไม่ตรงà¸à¸±à¸™',
'userexists' => 'ชื่อผู้ใช้ที่à¸à¸£à¸­à¸à¸¡à¸µà¸œà¸¹à¹‰à¸­à¸·à¹ˆà¸™à¹ƒà¸Šà¹‰à¹„ปà¹à¸¥à¹‰à¸§ à¸à¸£à¸¸à¸“าเลือà¸à¸Šà¸·à¹ˆà¸­à¸­à¸·à¹ˆà¸™',
'loginerror' => 'ล็อà¸à¸­à¸´à¸™à¸œà¸´à¸”พลาด',
+'createacct-error' => 'à¸à¸²à¸£à¸ªà¸£à¹‰à¸²à¸‡à¸šà¸±à¸à¸Šà¸µà¸œà¸´à¸”พลาด',
'createaccounterror' => 'ไม่สามารถสร้างบัà¸à¸Šà¸µà¸œà¸¹à¹‰à¹ƒà¸Šà¹‰: $1',
'nocookiesnew' => 'ชื่อบัà¸à¸Šà¸µà¸œà¸¹à¹‰à¹ƒà¸Šà¹‰à¹„ด้ถูà¸à¸ªà¸£à¹‰à¸²à¸‡à¸‚ึ้นà¹à¸¥à¹‰à¸§ à¹à¸•à¹ˆà¸¢à¸±à¸‡à¹„ม่ได้ล็อà¸à¸­à¸´à¸™à¹€à¸‚้าสู่ {{SITENAME}} เนื่องจาà¸à¸§à¹ˆà¸²à¹„ม่ได้เปิดใช้คุà¸à¸à¸µà¹‰ ถ้าต้องà¸à¸²à¸£à¸¥à¹‡à¸­à¸à¸­à¸´à¸™à¹ƒà¸«à¹‰à¹€à¸›à¸´à¸”ใช้งานคุà¸à¸à¸µà¹‰à¹à¸¥à¸°à¸—ำà¸à¸²à¸£à¸¥à¹‡à¸­à¸à¸­à¸´à¸™à¹‚ดยใส่ชื่อผู้ใช้พร้อมรหัสผ่าน',
'nocookieslogin' => '{{SITENAME}} ใช้คุà¸à¸à¸µà¹‰à¸ªà¸³à¸«à¸£à¸±à¸šà¸à¸²à¸£à¸¥à¹‡à¸­à¸à¸­à¸´à¸™ ขณะนี้คุà¸à¸à¸µà¹‰à¸‚องคุณไม่เปิดใช้งาน à¸à¸£à¸¸à¸“าเปิดใช้งานà¹à¸¥à¸°à¸¥à¸­à¸‡à¸­à¸µà¸à¸„รั้ง',
@@ -687,10 +725,12 @@ $1',
คุณอาจเพิà¸à¹€à¸‰à¸¢à¸‚้อความนี้ หาà¸à¸à¸²à¸£à¸ªà¸£à¹‰à¸²à¸‡à¸šà¸±à¸à¸Šà¸µà¸™à¸µà¹‰à¹€à¸à¸´à¸”จาà¸à¸„วามผิดพลาด',
'usernamehasherror' => 'ชื่อผู้ใช้ต้องไม่มีอัà¸à¸‚ระà¹à¸®à¸Š',
'login-throttled' => 'ที่ผ่านมาคุณพยายามล็อà¸à¸­à¸´à¸™à¸¡à¸²à¸à¸„รั้งเà¸à¸´à¸™à¹„ป
-à¸à¸£à¸¸à¸“ารอสัà¸à¸„รู่à¹à¸¥à¹‰à¸§à¸¥à¸­à¸‡à¹ƒà¸«à¸¡à¹ˆà¸­à¸µà¸à¸„รั้ง',
+à¸à¸£à¸¸à¸“ารอ $1 à¸à¹ˆà¸­à¸™à¸¥à¸­à¸‡à¸­à¸µà¸à¸„รั้ง',
'login-abort-generic' => 'à¸à¸²à¸£à¹€à¸‚้าสู่ระบบของคุณไม่ประสบความสำเร็จ - ล้มเลิà¸à¹à¸¥à¹‰à¸§',
'loginlanguagelabel' => 'ภาษา: $1',
'suspicious-userlogout' => 'คำขอล็อà¸à¹€à¸­à¸²à¸•à¹Œà¸‚องคุณถูà¸à¸›à¸à¸´à¹€à¸ªà¸˜à¹€à¸žà¸£à¸²à¸°à¸”ูเหมือนส่งมาจาà¸à¹€à¸šà¸£à¸²à¸§à¹Œà¹€à¸‹à¸­à¸£à¹Œà¸«à¸£à¸·à¸­à¸žà¸£à¹‡à¸­à¸à¸‹à¸µà¹à¸„ชที่เสีย',
+'createacct-another-realname-tip' => 'ไม่จำเป็นต้องใส่ชื่อจริง
+หาà¸à¸„ุณเลือà¸à¹ƒà¸ªà¹ˆà¸Šà¸·à¹ˆà¸­à¸ˆà¸£à¸´à¸‡ จะใช้เพื่อà¹à¸ªà¸”งที่มาสำหรับงานของตน',
# Email sending
'php-mail-error-unknown' => 'เà¸à¸´à¸”ข้อผิดพลาดไม่ทราบสาเหตุในฟังà¸à¹Œà¸Šà¸±à¸™ mail() ของพีเอชพี',
@@ -706,8 +746,7 @@ $1',
'newpassword' => 'รหัสผ่านใหม่:',
'retypenew' => 'พิมพ์รหัสผ่านใหม่อีà¸à¸„รั้ง:',
'resetpass_submit' => 'ตั้งรหัสผ่านà¹à¸¥à¸°à¸¥à¹‡à¸­à¸à¸­à¸´à¸™',
-'resetpass_success' => 'เปลี่ยนรหัสผ่านสำเร็จ!
-à¸à¸³à¸¥à¸±à¸‡à¸¥à¹‡à¸­à¸à¸­à¸´à¸™...',
+'changepassword-success' => 'เปลี่ยนรหัสผ่านของคุณเรียบร้อย',
'resetpass_forbidden' => 'ไม่สามารถเปลี่ยนรหัสผ่านได้',
'resetpass-no-info' => 'คุณต้องล็อà¸à¸­à¸´à¸™à¹€à¸žà¸·à¹ˆà¸­à¹€à¸‚้าถึงหน้านี้โดยตรง',
'resetpass-submit-loggedin' => 'เปลี่ยนรหัสผ่าน',
@@ -719,9 +758,11 @@ $1',
# Special:PasswordReset
'passwordreset' => 'ตั้งรหัสผ่านใหม่',
-'passwordreset-text' => 'à¸à¸£à¸­à¸à¹à¸šà¸šà¸Ÿà¸­à¸£à¹Œà¸¡à¸™à¸µà¹‰à¹€à¸žà¸·à¹ˆà¸­à¸•à¸±à¹‰à¸‡à¸£à¸«à¸±à¸ªà¸œà¹ˆà¸²à¸™à¹ƒà¸«à¸¡à¹ˆ',
+'passwordreset-text-one' => 'à¸à¸£à¸­à¸à¹à¸šà¸šà¸™à¸µà¹‰à¹€à¸žà¸·à¹ˆà¸­à¸•à¸±à¹‰à¸‡à¸£à¸«à¸±à¸ªà¸œà¹ˆà¸²à¸™à¹ƒà¸«à¸¡à¹ˆ',
+'passwordreset-text-many' => '{{PLURAL:$1|à¸à¸£à¸­à¸à¹€à¸‚ตข้อมูลหนึ่งเพื่อตั้งรหัสผ่านใหม่}}',
'passwordreset-legend' => 'เปลี่ยนรหัสผ่าน',
'passwordreset-disabled' => 'à¸à¸²à¸£à¸•à¸±à¹‰à¸‡à¸£à¸«à¸±à¸ªà¸œà¹ˆà¸²à¸™à¹ƒà¸«à¸¡à¹ˆà¸›à¸´à¸”ใช้งานบนวิà¸à¸´à¸™à¸µà¹‰',
+'passwordreset-emaildisabled' => 'คุณลัà¸à¸©à¸“ะอีเมลถูà¸à¸›à¸´à¸”ใช้งานบนวิà¸à¸´à¸™à¸µà¹‰',
'passwordreset-username' => 'ชื่อผู้ใช้:',
'passwordreset-domain' => 'โดเมน:',
'passwordreset-capture' => 'ดูอีเมลที่ได้หรือไม่',
@@ -744,7 +785,7 @@ $2
รหัสผ่านชั่วคราว: $2',
'passwordreset-emailsent' => 'อีเมลตั้งรหัสผ่านใหม่ถูà¸à¸ªà¹ˆà¸‡à¹„ปà¹à¸¥à¹‰à¸§',
'passwordreset-emailsent-capture' => 'อีเมลตั้งรหัสผ่านใหม่ถูà¸à¸ªà¹ˆà¸‡à¹„ปà¹à¸¥à¹‰à¸§ ซึ่งà¹à¸ªà¸”งด้านล่าง',
-'passwordreset-emailerror-capture' => 'อีเมลà¹à¸ˆà¹‰à¸‡à¹€à¸•à¸·à¸­à¸™à¸–ูà¸à¸ªà¸£à¹‰à¸²à¸‡à¸‚ึ้นà¹à¸¥à¹‰à¸§ ซึ่งà¹à¸ªà¸”งข้างล่าง à¹à¸•à¹ˆà¸à¸²à¸£à¸ªà¹ˆà¸‡à¹„ปยังผู้ใช้ล้มเหลว: $1',
+'passwordreset-emailerror-capture' => 'อีเมลตั้งรหัสผ่านใหม่ถูà¸à¸ªà¸£à¹‰à¸²à¸‡à¸‚ึ้นà¹à¸¥à¹‰à¸§ ซึ่งà¹à¸ªà¸”งด้านล่าง à¹à¸•à¹ˆà¹„ม่สามารถส่งไปยัง{{GENDER:$2|ผู้ใช้}}: $1',
# Special:ChangeEmail
'changeemail' => 'เปลี่ยนที่อยู่อีเมล',
@@ -758,6 +799,19 @@ $2
'changeemail-submit' => 'เปลี่ยนอีเมล',
'changeemail-cancel' => 'ยà¸à¹€à¸¥à¸´à¸',
+# Special:ResetTokens
+'resettokens' => 'ตั้งโทเค็นใหม่',
+'resettokens-text' => 'คุณสามารถตั้งโทเค็นใหม่ ซึ่งให้à¸à¸²à¸£à¹€à¸‚้าถึงข้อมูลส่วนตัวบางอย่างที่เà¸à¸µà¹ˆà¸¢à¸§à¸‚้องà¸à¸±à¸šà¸šà¸±à¸à¸Šà¸µà¸‚องคุณที่นี่
+
+คุณควรตั้งโทเค็นใหม่ หาà¸à¸„ุณบอà¸à¸œà¸¹à¹‰à¸­à¸·à¹ˆà¸™à¹‚ดยมิได้ตั้งใจหรือบัà¸à¸Šà¸µà¸‚องคุณถูà¸à¹€à¸ˆà¸²à¸°',
+'resettokens-no-tokens' => 'ไม่มีโทเค็นให้ตั้งใหม่',
+'resettokens-legend' => 'ตั้งโทเค็นใหม่',
+'resettokens-tokens' => 'โทเค็น:',
+'resettokens-token-label' => '$1 (ค่าปัจจุบัน: $2)',
+'resettokens-watchlist-token' => 'โทเค็นà¸à¸²à¸£à¸›à¹‰à¸­à¸™à¹€à¸§à¹‡à¸š (Atom/RSS) ของ[[Special:Watchlist|à¸à¸²à¸£à¹€à¸›à¸¥à¸µà¹ˆà¸¢à¸™à¹à¸›à¸¥à¸‡à¹„ปยังหน้าในรายà¸à¸²à¸£à¹€à¸à¹‰à¸²à¸”ูของคุณ]]',
+'resettokens-done' => 'ตั้งโทเค็นใหม่à¹à¸¥à¹‰à¸§',
+'resettokens-resetbutton' => 'ตั้งโทเค็นที่เลือà¸à¹ƒà¸«à¸¡à¹ˆ',
+
# Edit page toolbar
'bold_sample' => 'ข้อความตัวหนา',
'bold_tip' => 'ทำตัวหนา',
@@ -949,11 +1003,14 @@ $2
เนื่องจาà¸à¸«à¸™à¹‰à¸²à¸™à¸µà¹‰à¸–ูà¸à¸¥à¸šà¹„ปà¹à¸¥à¹‰à¸§',
'edit-conflict' => 'à¹à¸à¹‰à¸Šà¸™à¸à¸±à¸™',
'edit-no-change' => 'à¸à¸²à¸£à¹à¸à¹‰à¹„ขของคุณถูà¸à¹€à¸žà¸´à¸à¹€à¸‰à¸¢ เพราะไม่มีà¸à¸²à¸£à¹€à¸›à¸¥à¸µà¹ˆà¸¢à¸™à¹à¸›à¸¥à¸‡à¹ƒà¸” ๆ',
+'postedit-confirmation' => 'บันทึà¸à¸à¸²à¸£à¹à¸à¹‰à¹„ขของคุณà¹à¸¥à¹‰à¸§',
'edit-already-exists' => 'ไม่สามารถสร้างหน้าใหม่ได้
เพราะมีหน้านี้à¹à¸¥à¹‰à¸§',
'defaultmessagetext' => 'ข้อความสารโดยปริยาย',
'invalid-content-data' => 'ข้อมูลเนื้อหาไม่ถูà¸à¸•à¹‰à¸­à¸‡',
'content-not-allowed-here' => 'เนื้อหา "$1" ไม่อนุà¸à¸²à¸•à¹ƒà¸™à¸«à¸™à¹‰à¸² [[$2]]',
+'editwarning-warning' => 'à¸à¸²à¸£à¸­à¸­à¸à¸ˆà¸²à¸à¸«à¸™à¹‰à¸²à¸™à¸µà¹‰à¸­à¸²à¸ˆà¸—ำให้ความเปลี่ยนà¹à¸›à¸¥à¸‡à¸—ี่คุณà¸à¸£à¸°à¸—ำสูà¸à¸«à¸²à¸¢
+ถ้าคุณล็อà¸à¸­à¸´à¸™à¹à¸¥à¹‰à¸§ คุณสามารถปิดคำเตือนนี้ได้ที่ส่วน "à¸à¸²à¸£à¹à¸à¹‰à¹„ข" ในà¸à¸²à¸£à¸•à¸±à¹‰à¸‡à¸„่าของคุณ',
# Content models
'content-model-wikitext' => 'ข้อความวิà¸à¸´',
@@ -980,6 +1037,7 @@ $2
'undo-failure' => 'à¸à¸²à¸£à¹à¸à¹‰à¹„ขนี้ไม่สามารถย้อนà¸à¸¥à¸±à¸šà¹„ด้ เนื่องจาà¸à¸‚ัดà¹à¸¢à¹‰à¸‡à¸à¸±à¸šà¸à¸²à¸£à¹à¸à¹‰à¹„ขปัจจุบัน',
'undo-norev' => 'ไม่สามารถย้อนà¸à¸²à¸£à¹à¸à¹‰à¹„ขนี้ เพราะไม่มีหรือถูà¸à¸¥à¸šà¹„ปà¹à¸¥à¹‰à¸§',
'undo-summary' => 'ย้อนà¸à¸²à¸£à¹à¸à¹‰à¹„ขรุ่น $1 โดย [[Special:Contributions/$2|$2]] ([[User talk:$2|พูดคุย]])',
+'undo-summary-username-hidden' => 'ย้อนรุ่น $1 โดยผู้ใช้ไม่ระบุชื่อ',
# Account creation failure
'cantcreateaccounttitle' => 'ไม่สามารถสร้างบัà¸à¸Šà¸µà¹„ด้',
@@ -1159,6 +1217,7 @@ $1",
'compareselectedversions' => 'เปรียบเทียบสองรุ่นที่เลือà¸',
'showhideselectedversions' => 'à¹à¸ªà¸”ง/ซ่อนรุ่นที่เลือà¸',
'editundo' => 'ย้อน',
+'diff-empty' => '(ไม่à¹à¸•à¸à¸•à¹ˆà¸²à¸‡)',
'diff-multi' => '(มิได้à¹à¸ªà¸”ง $1 รุ่นระหว่างà¸à¸¥à¸²à¸‡à¹‚ดย{{PLURAL:$2|ผู้ใช้คนหนึ่ง|ผู้ใช้ $2 คน}})',
'diff-multi-manyusers' => '(มิได้à¹à¸ªà¸”ง $1 รุ่นระหว่างà¸à¸¥à¸²à¸‡à¹‚ดยผู้ใช้à¸à¸§à¹ˆà¸² $2 คน)',
'difference-missing-revision' => 'ไม่พบรุ่น{{PLURAL:$2|รุ่น| $2 รุ่น}}ของผลต่างนี้ ($1)
@@ -1186,7 +1245,6 @@ $1",
'searchmenu-legend' => 'ตัวเลือà¸à¸à¸²à¸£à¸„้นหา',
'searchmenu-exists' => "'''มีหน้าชื่อ \"[[:\$1]]\" บนวิà¸à¸´à¸™à¸µà¹‰'''",
'searchmenu-new' => "'''สร้างหน้า \"[[:\$1]]\" บนวิà¸à¸´à¸™à¸µà¹‰'''",
-'searchhelp-url' => 'Help:สารบัà¸',
'searchmenu-prefix' => '[[Special:PrefixIndex/$1|ค้นดูหน้าที่มีคำขึ้นต้นนี้]]',
'searchprofile-articles' => 'หน้าเนื้อหา',
'searchprofile-project' => 'คำอธิบายà¹à¸¥à¸°à¸«à¸™à¹‰à¸²à¹‚ครงà¸à¸²à¸£',
@@ -1228,14 +1286,7 @@ $1",
'powersearch-togglenone' => 'ไม่เลือà¸',
'search-external' => 'ค้นหาภายนอà¸',
'searchdisabled' => 'à¸à¸²à¸£à¸„้นหา {{SITENAME}} ปิดใช้งาน คุณสามารถค้นหาผ่านà¸à¸¹à¹€à¸à¸´à¸¥à¸«à¸£à¸·à¸­à¹€à¸‹à¸´à¸£à¹Œà¸Šà¹€à¸­à¸™à¸ˆà¸´à¸™à¸­à¸·à¹ˆà¸™à¹ƒà¸™à¹€à¸§à¸¥à¸²à¹„ม่นาน โปรดทราบว่าดัชนีเนื้อหาของ {{SITENAME}} บนเซิร์ชเอนจินอาจเป็นข้อมูลเà¸à¹ˆà¸²',
-
-# Quickbar
-'qbsettings' => 'à¹à¸–บพิเศษ',
-'qbsettings-none' => 'ไม่มี',
-'qbsettings-fixedleft' => 'ตรึงไว้ทางซ้าย',
-'qbsettings-fixedright' => 'ตรึงไว้ทางขวา',
-'qbsettings-floatingleft' => 'ด้านซ้าย',
-'qbsettings-floatingright' => 'ด้านขวา',
+'search-error' => 'เà¸à¸´à¸”ข้อผิดพลาดขณะà¸à¸³à¸¥à¸±à¸‡à¸„้นหา: $1',
# Preferences page
'preferences' => 'ตั้งค่าส่วนตัว',
@@ -1269,7 +1320,6 @@ $1",
'resetprefs' => 'ล้างà¸à¸²à¸£à¹€à¸›à¸¥à¸µà¹ˆà¸¢à¸™à¹à¸›à¸¥à¸‡à¸—ี่ยังไม่บันทึà¸',
'restoreprefs' => 'คืนà¸à¸²à¸£à¸•à¸±à¹‰à¸‡à¸„่าโดยปริยายทั้งหมด (ในทุà¸à¸ªà¹ˆà¸§à¸™)',
'prefs-editing' => 'à¸à¸²à¸£à¹à¸à¹‰à¹„ข',
-'prefs-edit-boxsize' => 'ขนาดหน้าจอà¸à¸¥à¹ˆà¸­à¸‡à¹à¸à¹‰à¹„ข',
'rows' => 'à¹à¸–ว:',
'columns' => 'คอลัมน์:',
'searchresultshead' => 'ค้นหา',
@@ -1280,9 +1330,9 @@ $1",
'recentchangesdays-max' => 'มาà¸à¸ªà¸¸à¸” $1 วัน',
'recentchangescount' => 'จำนวนà¸à¸²à¸£à¹à¸à¹‰à¹„ขที่à¹à¸ªà¸”งโดยปริยาย:',
'prefs-help-recentchangescount' => 'นี่รวมถึงà¸à¸²à¸£à¸›à¸£à¸±à¸šà¸›à¸£à¸¸à¸‡à¸¥à¹ˆà¸²à¸ªà¸¸à¸” ประวิติหน้า à¹à¸¥à¸°à¸›à¸¹à¸¡',
-'prefs-help-watchlist-token' => 'à¸à¸²à¸£à¹€à¸•à¸´à¸¡à¸Šà¹ˆà¸­à¸‡à¸™à¸µà¹‰à¸”้วยรหัสลับจะสร้างฟีด RSS à¹à¸à¹ˆà¸£à¸²à¸¢à¸à¸²à¸£à¹€à¸à¹‰à¸²à¸”ูของคุณ
-ผู้ใดที่รู้รหัสในช่องนี้จะสามารถอ่านรายà¸à¸²à¸£à¹€à¸à¹‰à¸²à¸”ูของคุณได้ ฉะนั้นให้เลือà¸à¸£à¸«à¸±à¸ªà¸—ี่ปลอดภัย
-นี่คือรหัสที่สุ่มเลือà¸à¸‚ึ้นมาที่คุณสามารถใช้ได้: $1',
+'prefs-help-watchlist-token2' => 'นี่คือà¹à¸›à¹‰à¸™à¸¥à¸±à¸šà¸ªà¸³à¸«à¸£à¸±à¸šà¹€à¸‚้าà¸à¸²à¸£à¸›à¹‰à¸­à¸™à¹€à¸§à¹‡à¸šà¸£à¸²à¸¢à¸à¸²à¸£à¹€à¸à¹‰à¸²à¸”ูของคุณ
+ใครà¸à¹‡à¸•à¸²à¸¡à¸—ี่ทราบจะสามารถอ่านรายà¸à¸²à¸£à¹€à¸à¹‰à¸²à¸”ูของคุณได้ ฉะนั้นอย่าบอà¸à¸œà¸¹à¹‰à¸­à¸·à¹ˆà¸™
+[[Special:ResetTokens|คลิà¸à¸—ี่นี่หาà¸à¸„ุณต้องà¸à¸²à¸£à¸•à¸±à¹‰à¸‡à¹ƒà¸«à¸¡à¹ˆ]]',
'savedprefs' => 'à¸à¸²à¸£à¸•à¸±à¹‰à¸‡à¸„่าของคุณได้ถูà¸à¸šà¸±à¸™à¸—ึà¸à¹à¸¥à¹‰à¸§',
'timezonelegend' => 'เขตเวลา:',
'localtime' => 'เวลาท้องถิ่น',
@@ -1313,7 +1363,6 @@ $1",
'prefs-reset-intro' => 'คุณสามารถใช้หน้านี้ตั้งà¸à¸²à¸£à¸•à¸±à¹‰à¸‡à¸„่าของคุณà¸à¸¥à¸±à¸šà¹„ปยังค่าตั้งต้นของเว็บใหม่
ซึ่งไม่สามารถทำà¸à¸¥à¸±à¸šà¹„ด้',
'prefs-emailconfirm-label' => 'à¸à¸²à¸£à¸¢à¸·à¸™à¸¢à¸±à¸™à¸­à¸µà¹€à¸¡à¸¥:',
-'prefs-textboxsize' => 'ขนาดหน้าต่างà¹à¸à¹‰à¹„ข',
'youremail' => 'อีเมล:',
'username' => '{{GENDER:$1|ชื่อผู้ใช้}}:',
'uid' => 'รหัสประจำตัว{{GENDER:$1|ผู้ใช้}}:',
@@ -1345,6 +1394,7 @@ $1",
'prefs-dateformat' => 'รูปà¹à¸šà¸šà¸§à¸±à¸™à¸—ี่',
'prefs-timeoffset' => 'ส่วนต่างเวลา',
'prefs-advancedediting' => 'ตัวเลือà¸à¸—ั่วไป',
+'prefs-preview' => 'à¸à¸²à¸£à¹à¸ªà¸”งตัวอย่าง',
'prefs-advancedrc' => 'ตัวเลือà¸à¸‚ั้นสูง',
'prefs-advancedrendering' => 'ตัวเลือà¸à¸‚ั้นสูง',
'prefs-advancedsearchoptions' => 'ตัวเลือà¸à¸‚ั้นสูง',
@@ -1352,7 +1402,9 @@ $1",
'prefs-displayrc' => 'ตัวเลือà¸à¸œà¸¥à¹à¸ªà¸”ง',
'prefs-displaysearchoptions' => 'ตัวเลือà¸à¸œà¸¥à¹à¸ªà¸”ง',
'prefs-displaywatchlist' => 'ตัวเลือà¸à¸œà¸¥à¹à¸ªà¸”ง',
+'prefs-tokenwatchlist' => 'โทเค็น',
'prefs-diffs' => 'ผลต่าง',
+'prefs-help-prefershttps' => 'à¸à¸²à¸£à¸•à¸±à¹‰à¸‡à¸„่านี้จะมีผลเมื่อคุณล็อà¸à¸­à¸´à¸™à¸„รั้งถัดไป',
# User preference: email validation using jQuery
'email-address-validity-valid' => 'ที่อยู่อีเมลดูถูà¸à¸•à¹‰à¸­à¸‡',
@@ -1379,6 +1431,8 @@ $1",
'userrights-notallowed' => 'บัà¸à¸Šà¸µà¸‚องคุณไม่ได้รับอนุà¸à¸²à¸•à¹ƒà¸«à¹‰à¹€à¸žà¸´à¹ˆà¸¡à¸«à¸£à¸·à¸­à¸¥à¸”สิทธิผู้ใช้',
'userrights-changeable-col' => 'à¸à¸¥à¸¸à¹ˆà¸¡à¸—ี่คุณสามารถเปลี่ยนได้',
'userrights-unchangeable-col' => 'à¸à¸¥à¸¸à¹ˆà¸¡à¸—ี่คุณไม่สามารถเปลี่ยนได้',
+'userrights-conflict' => 'พบà¸à¸²à¸£à¹€à¸›à¸¥à¸µà¹ˆà¸¢à¸™à¹à¸›à¸¥à¸‡à¸ªà¸´à¸—ธิผู้ใช้ขัดà¸à¸±à¸™! โปรดทบทวนà¹à¸¥à¸°à¸¢à¸·à¸™à¸¢à¸±à¸™à¸à¸²à¸£à¹€à¸›à¸¥à¸µà¹ˆà¸¢à¸™à¹à¸›à¸¥à¸‡à¸‚องคุณ',
+'userrights-removed-self' => 'คุณเพิà¸à¸–อนสิทธิของคุณสำเร็จà¹à¸¥à¹‰à¸§ ฉะนั้น คุณจึงไม่สามารถเข้าถึงหน้านี้ได้อีà¸à¸•à¹ˆà¸­à¹„ป',
# Groups
'group' => 'à¸à¸¥à¸¸à¹ˆà¸¡:',
@@ -1444,11 +1498,19 @@ $1",
'right-proxyunbannable' => 'เลี่ยงà¸à¸²à¸£à¸šà¸¥à¹‡à¸­à¸à¸­à¸±à¸•à¹‚นมัติของพร็อà¸à¸‹à¸µ',
'right-unblockself' => 'ปลดบล็อà¸à¸•à¸™à¹€à¸­à¸‡',
'right-protect' => 'เปลี่ยนระดับà¸à¸²à¸£à¸¥à¹‡à¸­à¸à¹à¸¥à¸°à¹à¸à¹‰à¹„ขหน้าที่ถูà¸à¸¥à¹‡à¸­à¸',
-'right-editprotected' => 'หน้าที่ถูà¸à¸¥à¹‡à¸­à¸à¹€à¸•à¹‡à¸¡à¸—ี่ (ที่ไม่ล็อà¸à¹à¸šà¸šà¸ªà¸·à¸šà¸—อด)',
+'right-editprotected' => 'à¹à¸à¹‰à¹„ขหน้าที่ถูà¸à¸¥à¹‡à¸­à¸à¸‹à¸¶à¹ˆà¸‡ "{{int:protect-level-sysop}}"',
+'right-editsemiprotected' => 'à¹à¸à¹‰à¹„ขหน้าที่ถูà¸à¸¥à¹‡à¸­à¸à¸‹à¸¶à¹ˆà¸‡ "{{int:protect-level-autoconfirmed}}"',
'right-editinterface' => 'à¹à¸à¹‰à¹„ขอินเตอร์เฟซผู้ใช้',
'right-editusercssjs' => 'à¹à¸à¹‰à¹„ขไฟล์ CSS à¹à¸¥à¸°à¸ˆà¸²à¸§à¸²à¸ªà¸„ริปต์ของผู้ใช้อื่น',
'right-editusercss' => 'à¹à¸à¹‰à¹„ขไฟล์ CSS ของผู้ใช้อื่น',
'right-edituserjs' => 'à¹à¸à¹‰à¹„ขไฟล์จาวาสคริปต์ของผู้ใช้อื่น',
+'right-editmyusercss' => 'à¹à¸à¹‰à¹„ขไฟล์ซีเอสเอสผู้ใช้ของคุณเอง',
+'right-editmyuserjs' => 'à¹à¸à¹‰à¹„ขไฟล์จาวาสคริปต์ผู้ใช้ของคุณเอง',
+'right-viewmywatchlist' => 'ดูรายà¸à¸²à¸£à¹€à¸à¹‰à¸²à¸”ูของคุณ',
+'right-editmywatchlist' => 'à¹à¸à¹‰à¹„ขรายà¸à¸²à¸£à¹€à¸à¹‰à¸²à¸”ูของคุณ หมายเหตุว่า à¸à¸²à¸£à¸à¸£à¸°à¸—ำบางอย่างอาจยังเพิ่มหน้าà¹à¸¡à¹‰à¸ˆà¸°à¸›à¸£à¸²à¸¨à¸ˆà¸²à¸à¸ªà¸´à¸—ธินี้',
+'right-viewmyprivateinfo' => 'ดูข้อมูลส่วนตัวของคุณ (เช่น ที่อยู่อีเมล ชื่อจริง)',
+'right-editmyprivateinfo' => 'à¹à¸à¹‰à¹„ขข้อมูลส่วนตัวของคุณ (เช่น ที่อยู่อีเมล ชื่อจริง)',
+'right-editmyoptions' => 'à¹à¸à¹‰à¹„ขà¸à¸²à¸£à¸•à¸±à¹‰à¸‡à¸„่าของคุณ',
'right-rollback' => 'ย้อนà¸à¸²à¸£à¹à¸à¹‰à¹„ขของผู้ใช้ล่าสุดที่à¹à¸à¹‰à¹„ขหน้าเฉพาะอย่างรวดเร็ว',
'right-markbotedits' => 'ทำเครื่องหมายà¸à¸²à¸£à¸¢à¹‰à¸­à¸™à¸§à¹ˆà¸²à¹€à¸›à¹‡à¸™à¸à¸²à¸£à¹à¸à¹‰à¹„ขโดยบอต',
'right-noratelimit' => 'ไม่ได้รับผลà¸à¸£à¸°à¸—บจาà¸à¸‚ีดจำà¸à¸±à¸”อัตรา',
@@ -1510,12 +1572,19 @@ $1",
'action-userrights-interwiki' => 'à¹à¸à¹‰à¹„ขสิทธิผู้ใช้ของผู้ใช้บนวิà¸à¸´à¸­à¸·à¹ˆà¸™',
'action-siteadmin' => 'ล็อà¸à¸«à¸£à¸·à¸­à¸›à¸¥à¸”ล็อà¸à¸à¸²à¸™à¸‚้อมูล',
'action-sendemail' => 'ส่งอีเมล',
+'action-editmywatchlist' => 'à¹à¸à¹‰à¹„ขรายà¸à¸²à¸£à¹€à¸à¹‰à¸²à¸”ูของคุณ',
+'action-viewmywatchlist' => 'ดูรายà¸à¸²à¸£à¹€à¸à¹‰à¸²à¸”ูของคุณ',
+'action-viewmyprivateinfo' => 'ดูข้อมูลส่วนตัวของคุณ',
+'action-editmyprivateinfo' => 'à¹à¸à¹‰à¹„ขข้อมูลส่วนตัวของคุณ',
# Recent changes
'nchanges' => '$1 à¸à¸²à¸£à¹à¸à¹‰à¹„ข',
+'enhancedrc-since-last-visit' => '$1 {{PLURAL:$1|ตั้งà¹à¸•à¹ˆà¸à¸²à¸£à¹€à¸‚้าชมล่าสุด}}',
+'enhancedrc-history' => 'ประวัติ',
'recentchanges' => 'ปรับปรุงล่าสุด',
'recentchanges-legend' => 'ตัวเลือà¸à¸›à¸£à¸±à¸šà¸›à¸£à¸¸à¸‡à¸¥à¹ˆà¸²à¸ªà¸¸à¸”',
'recentchanges-summary' => 'ในหน้านี้เป็นรายà¸à¸²à¸£à¸à¸²à¸£à¸›à¸£à¸±à¸šà¸›à¸£à¸¸à¸‡à¸¥à¹ˆà¸²à¸ªà¸¸à¸”บนวิà¸à¸´à¸™à¸µà¹‰',
+'recentchanges-noresult' => 'ไม่มีà¸à¸²à¸£à¹€à¸›à¸¥à¸µà¹ˆà¸¢à¸™à¹à¸›à¸¥à¸‡à¹ƒà¸™à¸Šà¹ˆà¸§à¸‡à¸—ี่à¸à¸³à¸«à¸™à¸”ซึ่งตรงà¸à¸±à¸šà¹€à¸à¸“ฑ์เหล่านี้',
'recentchanges-feed-description' => 'ติดตามà¸à¸²à¸£à¸›à¸£à¸±à¸šà¸›à¸£à¸¸à¸‡à¸¥à¹ˆà¸²à¸ªà¸¸à¸”ในวิà¸à¸´à¸™à¸µà¹‰à¹ƒà¸™à¸Ÿà¸µà¸”นี้',
'recentchanges-label-newpage' => 'à¸à¸²à¸£à¹à¸à¹‰à¹„ขนี้สร้างหน้าใหม่',
'recentchanges-label-minor' => 'เป็นà¸à¸²à¸£à¹à¸à¹‰à¹„ขเล็à¸à¸™à¹‰à¸­à¸¢',
@@ -1553,7 +1622,6 @@ $1",
'recentchangeslinked-feed' => 'ปรับปรุงที่เà¸à¸µà¹ˆà¸¢à¸§à¹‚ยง',
'recentchangeslinked-toolbox' => 'à¸à¸²à¸£à¸›à¸£à¸±à¸šà¸›à¸£à¸¸à¸‡à¸—ี่เà¸à¸µà¹ˆà¸¢à¸§à¹‚ยง',
'recentchangeslinked-title' => 'à¸à¸²à¸£à¸›à¸£à¸±à¸šà¸›à¸£à¸¸à¸‡à¸—ี่โยงมายัง "$1"',
-'recentchangeslinked-noresult' => 'ไม่มีà¸à¸²à¸£à¹€à¸›à¸¥à¸µà¹ˆà¸¢à¸™à¹à¸›à¸¥à¸‡à¹ƒà¸™à¸«à¸™à¹‰à¸²à¸—ี่ถูà¸à¹‚ยงไป ในช่วงเวลาที่à¸à¸³à¸«à¸™à¸”',
'recentchangeslinked-summary' => "หน้านี้เป็นรายà¸à¸²à¸£à¸›à¸£à¸±à¸šà¸›à¸£à¸¸à¸‡à¸¥à¹ˆà¸²à¸ªà¸¸à¸”ของหน้าที่ถูà¸à¹‚ยงไป (หรือไปยังหน้าต่าง ๆ ของหมวดหมู่ที่à¸à¸³à¸«à¸™à¸”) โดยหน้าที่อยู่ใน[[Special:Watchlist|รายà¸à¸²à¸£à¹€à¸à¹‰à¸²à¸”ู]]à¹à¸ªà¸”งเป็น'''ตัวหนา'''",
'recentchangeslinked-page' => 'ชื่อหน้า:',
'recentchangeslinked-to' => 'à¹à¸ªà¸”งà¸à¸²à¸£à¹€à¸›à¸¥à¸µà¹ˆà¸¢à¸™à¹à¸›à¸¥à¸‡à¸—ี่เชื่อมโยงมายังหน้านี้à¹à¸—น',
@@ -1564,7 +1632,7 @@ $1",
'reuploaddesc' => 'ยà¸à¹€à¸¥à¸´à¸à¸à¸²à¸£à¸­à¸±à¸›à¹‚หลดà¹à¸¥à¸°à¸à¸¥à¸±à¸šà¹„ปยังà¹à¸šà¸šà¸­à¸±à¸›à¹‚หลด',
'upload-tryagain' => 'ส่งคำอธิบายไฟล์ที่ดัดà¹à¸›à¸£à¹à¸¥à¹‰à¸§',
'uploadnologin' => 'ไม่ได้ล็อà¸à¸­à¸´à¸™',
-'uploadnologintext' => 'ต้อง[[Special:UserLogin|ล็อà¸à¸­à¸´à¸™]]à¸à¹ˆà¸­à¸™à¸ˆà¸¶à¸‡à¸ˆà¸°à¸­à¸±à¸›à¹‚หลดไฟล์ได้',
+'uploadnologintext' => 'ต้อง$1à¸à¹ˆà¸­à¸™à¸ˆà¸¶à¸‡à¸ˆà¸°à¸­à¸±à¸›à¹‚หลดไฟล์ได้',
'upload_directory_missing' => 'ไดเรà¸à¸—อรีสำหรับอัปโหลด ($1) หายไป à¹à¸¥à¸°à¹€à¸§à¹‡à¸šà¹€à¸‹à¸´à¸£à¹Œà¸Ÿà¹€à¸§à¸­à¸£à¹Œà¹„ม่สามารถสร้างได้',
'upload_directory_read_only' => 'เว็บเซิร์ฟเวอร์ไม่สามารถเà¸à¹‡à¸šà¸‚้อมูลในไดเรà¸à¸—อรี ($1)',
'uploaderror' => 'à¸à¸²à¸£à¸­à¸±à¸›à¹‚หลดผิดพลาด',
@@ -1748,7 +1816,6 @@ $1',
'http-read-error' => 'à¸à¸²à¸£à¸­à¹ˆà¸²à¸™à¸‚้อมูล HTTP ผิดพลาด',
'http-timed-out' => 'คำขอข้อมูล HTTP เà¸à¸´à¸™à¹€à¸§à¸¥à¸²à¸—ี่à¸à¸³à¸«à¸™à¸”',
'http-curl-error' => 'เà¸à¸´à¸”ข้อผิดพลาดในà¸à¸²à¸£à¹€à¸£à¸µà¸¢à¸à¸‚้อมูลจาภURL: $1',
-'http-host-unreachable' => 'ไม่สามารถเข้าถึง URL',
'http-bad-status' => 'พบปัà¸à¸«à¸²à¹ƒà¸™à¸£à¸°à¸«à¸§à¹ˆà¸²à¸‡à¸à¸²à¸£à¸‚้อข้อมูล HTTP: $1 $2',
# Some likely curl errors. More could be added from <http://curl.haxx.se/libcurl/c/libcurl-errors.html>
@@ -1776,6 +1843,10 @@ $1',
'listfiles_size' => 'ขนาด',
'listfiles_description' => 'คำอธิบาย',
'listfiles_count' => 'รุ่น',
+'listfiles-show-all' => 'รวมภาพรุ่นเà¸à¹ˆà¸²',
+'listfiles-latestversion' => 'รุ่นปัจจุบัน',
+'listfiles-latestversion-yes' => 'ใช่',
+'listfiles-latestversion-no' => 'ไม่',
# File description page
'file-anchor-link' => 'ไฟล์',
@@ -1873,6 +1944,13 @@ $1',
'randompage' => 'สุ่มหน้า',
'randompage-nopages' => 'ไม่มีหน้าใดใน{{PLURAL:$2|เนมสเปซ}}ต่อไปนี้: "$1"',
+# Random page in category
+'randomincategory' => 'สุ่มหน้าในหมวดหมู่',
+'randomincategory-invalidcategory' => '"$1" มิใช่ชื่อหมวดหมู่ที่ถูà¸à¸•à¹‰à¸­à¸‡',
+'randomincategory-nopages' => 'ไม่มีหน้าใน[[:Category:$1]]',
+'randomincategory-selectcategory' => 'ดึงหน้าà¹à¸šà¸šà¸ªà¸¸à¹ˆà¸¡à¸ˆà¸²à¸à¸«à¸¡à¸§à¸”หมู่: $1 $2',
+'randomincategory-selectcategory-submit' => 'ไป',
+
# Random redirect
'randomredirect' => 'สุ่มหน้าเปลี่ยนทาง',
'randomredirect-nopages' => 'ไม่มีหน้าเปลี่ยนทางในเนมสเปซ "$1"',
@@ -1898,12 +1976,6 @@ $1',
'statistics-users-active-desc' => 'ผู้ใช้ที่ดำเนินปà¸à¸´à¸šà¸±à¸•à¸´à¸à¸²à¸£à¹ƒà¸™à¸Šà¹ˆà¸§à¸‡ $1 วันที่ผ่านมา',
'statistics-mostpopular' => 'หน้าที่มีà¸à¸²à¸£à¹€à¸‚้าชมมาà¸à¸—ี่สุด',
-'disambiguations' => 'หน้าที่เชื่อมโยงไปยังหน้าà¹à¸à¹‰à¸„วามà¸à¸³à¸à¸§à¸¡',
-'disambiguationspage' => 'Template:à¹à¸à¹‰à¸à¸³à¸à¸§à¸¡',
-'disambiguations-text' => "หน้าต่อไปนี้มีà¸à¸²à¸£à¹€à¸Šà¸·à¹ˆà¸­à¸¡à¹‚ยงไปยัง'''หน้าความà¸à¸³à¸à¸§à¸¡'''อย่างน้อยหนึ่งà¹à¸«à¹ˆà¸‡
-ซึ่งอาจต้องเชื่อมโยงไปยังหน้าที่เหมาะสมà¸à¸§à¹ˆà¸²à¹à¸—น<br />
-หน้าใดที่ใช้à¹à¸¡à¹ˆà¹à¸šà¸šà¸—ี่เชื่อมโยงมาจาภ[[MediaWiki:Disambiguationspage]] จะถูà¸à¸™à¸±à¸šà¹€à¸›à¹‡à¸™à¸«à¸™à¹‰à¸²à¸„วามà¸à¸³à¸à¸§à¸¡",
-
'pageswithprop' => 'หน้าพร้อมคุณสมบัติหน้า',
'pageswithprop-legend' => 'หน้าพร้อมคุณสมบัติหน้า',
'pageswithprop-text' => 'หน้านี้à¹à¸ªà¸”งรายà¸à¸²à¸£à¸«à¸™à¹‰à¸²à¸—ี่ใช้คุณสมบัติหน้าอย่างใดอย่างหนึ่งโดยเฉพาะ',
@@ -1967,6 +2039,7 @@ $1',
'mostrevisions' => 'หน้าที่มีรุ่นมาà¸à¸—ี่สุด',
'prefixindex' => 'ทุà¸à¸«à¸™à¹‰à¸²à¸žà¸£à¹‰à¸­à¸¡à¸„ำขึ้นต้น',
'prefixindex-namespace' => 'ทุà¸à¸«à¸™à¹‰à¸²à¸žà¸£à¹‰à¸­à¸¡à¸„ำขึ้นต้น (เนมสเปซ $1)',
+'prefixindex-strip' => 'ลบคำขึ้นต้นในรายà¸à¸²à¸£à¸­à¸­à¸',
'shortpages' => 'หน้าสั้น',
'longpages' => 'หน้ายาว',
'deadendpages' => 'หน้าสุดทาง',
@@ -2157,10 +2230,9 @@ $1',
'unwatchthispage' => 'เลิà¸à¹€à¸à¹‰à¸²à¸”ูหน้านี้',
'notanarticle' => 'ไม่ใช่หน้าเนื้อหา',
'notvisiblerev' => 'รุ่นล่าสุดโดยผู้ใช้อีà¸à¸„นถูà¸à¸¥à¸šà¹à¸¥à¹‰à¸§',
-'watchnochange' => 'ไม่มีà¸à¸²à¸£à¹à¸à¹‰à¹„ขหน้าที่คุณเà¸à¹‰à¸²à¸”ูในระยะเวลาที่à¹à¸ªà¸”ง',
'watchlist-details' => 'มี $1 หน้าในรายà¸à¸²à¸£à¹€à¸à¹‰à¸²à¸”ูของคุณ ไม่รวมหน้าอภิปราย',
-'wlheader-enotif' => '* à¹à¸ˆà¹‰à¸‡à¹€à¸•à¸·à¸­à¸™à¸œà¹ˆà¸²à¸™à¸­à¸µà¹€à¸¡à¸¥à¸–ูà¸à¹€à¸›à¸´à¸”ใช้งาน',
-'wlheader-showupdated' => "* หน้าที่มีà¸à¸²à¸£à¹€à¸›à¸¥à¸µà¹ˆà¸¢à¸™à¹à¸›à¸¥à¸‡à¸•à¸±à¹‰à¸‡à¹à¸•à¹ˆà¸à¸²à¸£à¹€à¸‚้าชมครั้งล่าสุดของคุณà¹à¸ªà¸”งใน'''ตัวหนา'''",
+'wlheader-enotif' => 'à¸à¸²à¸£à¹à¸ˆà¹‰à¸‡à¹€à¸•à¸·à¸­à¸™à¸œà¹ˆà¸²à¸™à¸­à¸µà¹€à¸¡à¸¥à¸–ูà¸à¹€à¸›à¸´à¸”ใช้งาน',
+'wlheader-showupdated' => "หน้าที่มีà¸à¸²à¸£à¹€à¸›à¸¥à¸µà¹ˆà¸¢à¸™à¹à¸›à¸¥à¸‡à¸•à¸±à¹‰à¸‡à¹à¸•à¹ˆà¸„ุณเข้าชมล่าสุดà¹à¸ªà¸”งใน'''ตัวหนา'''",
'watchmethod-recent' => 'ตรวจสอบà¸à¸²à¸£à¸›à¸£à¸±à¸šà¸›à¸£à¸¸à¸‡à¸¥à¹ˆà¸²à¸ªà¸¸à¸”à¸à¸±à¸šà¸«à¸™à¹‰à¸²à¹€à¸à¹‰à¸²à¸”ู',
'watchmethod-list' => 'ตรวจสอบหน้าเà¸à¹‰à¸²à¸”ูà¸à¸±à¸šà¸à¸²à¸£à¹à¸à¹‰à¹„ขล่าสุด',
'watchlistcontains' => 'รายà¸à¸²à¸£à¹€à¸à¹‰à¸²à¸”ูของคุณมี $1 หน้า',
@@ -2407,7 +2479,7 @@ $1',
'contributions' => 'เรื่องที่เขียนโดย{{GENDER:$1|ผู้ใช้}}นี้',
'contributions-title' => 'เรื่องที่เขียนโดย $1',
'mycontris' => 'เรื่องที่เขียน',
-'contribsub2' => 'สำหรับ $1 ($2)',
+'contribsub2' => 'สำหรับ {{GENDER:$3|$1}} ($2)',
'nocontribs' => 'ไม่พบà¸à¸²à¸£à¹€à¸›à¸¥à¸µà¹ˆà¸¢à¸™à¹à¸›à¸¥à¸‡à¸•à¸£à¸‡à¸à¸±à¸šà¹€à¸‡à¸·à¹ˆà¸­à¸™à¹„ขเหล่านี้',
'uctop' => '(ปัจจุบัน)',
'month' => 'จาà¸à¹€à¸”ือน (à¹à¸¥à¸°à¸à¹ˆà¸­à¸™à¸«à¸™à¹‰à¸²):',
@@ -2565,11 +2637,8 @@ $1',
อย่างไรà¸à¹‡à¸•à¸²à¸¡ ไอพีนี้ถูà¸à¸£à¸°à¸‡à¸±à¸šà¹ƒà¸™à¸à¸²à¸™à¸°à¸—ี่เป็นส่วนหนึ่งของเลขที่อยู่ไอพีในพิสัย $2 ซึ่งสามารถปลดบล็อà¸à¹„ด้',
'ip_range_invalid' => 'พิสัยไอพีไม่ถูà¸à¸•à¹‰à¸­à¸‡',
'ip_range_toolarge' => 'พิสัยบล็อà¸à¸—ี่มีขนาดใหà¸à¹ˆà¸à¸§à¹ˆà¸² /$1 จะไม่ได้รับอนุà¸à¸²à¸•',
-'blockme' => 'บล็อà¸à¸‰à¸±à¸™',
'proxyblocker' => 'บล็อà¸à¸žà¸£à¹‡à¸­à¸à¸‹à¸µ',
-'proxyblocker-disabled' => 'ฟังà¸à¹Œà¸Šà¸±à¸™à¸™à¸µà¹‰à¸–ูà¸à¸›à¸´à¸”ใช้งาน',
'proxyblockreason' => 'เลขที่อยู่ไอพีของคุณถูà¸à¸šà¸¥à¹‡à¸­à¸à¹€à¸™à¸·à¹ˆà¸­à¸‡à¸ˆà¸²à¸à¹€à¸›à¹‡à¸™à¸žà¸£à¹‡à¸­à¸à¸‹à¸µà¹€à¸›à¸´à¸” à¸à¸£à¸¸à¸“าติดต่อผู้ให้บริà¸à¸²à¸£à¸­à¸´à¸™à¹€à¸—อร์เน็ตหรือà¸à¹ˆà¸²à¸¢à¸ªà¸™à¸±à¸šà¸ªà¸™à¸¸à¸™à¹€à¸—คนิคขององค์à¸à¸²à¸£à¸„ุณ à¹à¸¥à¸°à¹à¸ˆà¹‰à¸‡à¹ƒà¸«à¹‰à¸žà¸§à¸à¹€à¸‚าทราบถึงปัà¸à¸«à¸²à¸„วามปลอดภัยร้ายà¹à¸£à¸‡à¸™à¸µà¹‰',
-'proxyblocksuccess' => 'สำเร็จ',
'sorbsreason' => 'เลขที่อยู่ไอพีของคุณอยู่ในพร็อà¸à¸‹à¸µà¹€à¸›à¸´à¸”ในส่วน DNSBL ที่ {{SITENAME}} ใช้',
'sorbs_create_account_reason' => 'เลขที่อยู่ไอพีของคุณอยู่ในพร็อà¸à¸‹à¸µà¹€à¸›à¸´à¸”ในส่วน DNSBL ที่ {{SITENAME}} ใช้
คุณไม่สามารถสร้างบัà¸à¸Šà¸µà¹„ด้',
@@ -2868,17 +2937,11 @@ $1',
# Stylesheets
'common.css' => '/* สไตล์ชีตในหน้านี้จะส่งผลà¹à¸à¹ˆà¸œà¸¹à¹‰à¹ƒà¸Šà¹‰à¸—ุà¸à¸ªà¸à¸´à¸™ */',
-'standard.css' => '/* สไตล์ชีตในหน้านี้จะส่งผลà¹à¸à¹ˆà¸œà¸¹à¹‰à¹ƒà¸Šà¹‰à¸—ี่ใช้สà¸à¸´à¸™à¸„ลาสสิภ*/',
-'nostalgia.css' => '/* สไตล์ชีตในหน้านี้จะส่งผลà¹à¸à¹ˆà¸œà¸¹à¹‰à¹ƒà¸Šà¹‰à¸—ี่ใช้สà¸à¸´à¸™à¸™à¸­à¸ªà¸•à¸±à¸¥à¹€à¸ˆà¸µà¸¢ */',
'cologneblue.css' => '/* สไตล์ชีตในหน้านี้จะส่งผลà¹à¸à¹ˆà¸œà¸¹à¹‰à¹ƒà¸Šà¹‰à¸—ี่ใช้สà¸à¸´à¸™à¹‚คโลà¸à¸ˆà¹Œà¸šà¸¥à¸¹ */',
'monobook.css' => '/* สไตล์ชีตในหน้านี้จะส่งผลà¹à¸à¹ˆà¸œà¸¹à¹‰à¹ƒà¸Šà¹‰à¸—ี่ใช้สà¸à¸´à¸™à¹‚มโนบุ๊ภ*/',
-'myskin.css' => '/* สไตล์ชีตในหน้านี้จะส่งผลà¹à¸à¹ˆà¸œà¸¹à¹‰à¹ƒà¸Šà¹‰à¸—ี่ใช้สà¸à¸´à¸™à¸¡à¸²à¸¢à¸ªà¸à¸´à¸™ */',
-'chick.css' => '/* สไตล์ชีตในหน้านี้จะส่งผลà¹à¸à¹ˆà¸œà¸¹à¹‰à¹ƒà¸Šà¹‰à¸—ี่ใช้สà¸à¸´à¸™à¸Šà¸´à¸ */',
-'simple.css' => '/* สไตล์ชีตในหน้านี้จะส่งผลà¹à¸à¹ˆà¸œà¸¹à¹‰à¹ƒà¸Šà¹‰à¸—ี่ใช้สà¸à¸´à¸™à¸‹à¸´à¸¡à¹€à¸›à¸´à¸¥ */',
'modern.css' => '/* สไตล์ชีตในหน้านี้จะส่งผลà¹à¸à¹ˆà¸œà¸¹à¹‰à¹ƒà¸Šà¹‰à¸—ี่ใช้สà¸à¸´à¸™à¹‚มเดิร์น */',
'vector.css' => '/* สไตล์ชีตในหน้านี้จะส่งผลà¹à¸à¹ˆà¸œà¸¹à¹‰à¹ƒà¸Šà¹‰à¸—ี่ใช้สà¸à¸´à¸™à¹€à¸§à¸à¹€à¸•à¸­à¸£à¹Œ */',
'print.css' => '/* สไตล์ชีตในหน้านี้จะส่งผลà¹à¸à¹ˆà¸‚้อมูลส่งออà¸à¹€à¸›à¹‡à¸™à¸ªà¸´à¹ˆà¸‡à¸žà¸´à¸¡à¸žà¹Œ */',
-'handheld.css' => '/* สไตล์ชีตในหน้านี้จะส่งผลà¹à¸à¹ˆà¸­à¸¸à¸›à¸à¸£à¸“์เคลื่อนที่ โดยขึ้นอยู่à¸à¸±à¸šà¸ªà¸à¸´à¸™à¸—ี่ตั้งค่าไว้ใน $wgHandheldStyle */',
'noscript.css' => '/* สไตล์ชีตในหน้านี้จะส่งผลà¹à¸à¹ˆà¸œà¸¹à¹‰à¹ƒà¸Šà¹‰à¸—ี่ปิดà¸à¸²à¸£à¹ƒà¸Šà¹‰à¸‡à¸²à¸™à¸ˆà¸²à¸§à¸²à¸ªà¸„ริปต์ */',
'group-autoconfirmed.css' => '/* สไตล์ชีตในหน้านี้จะส่งผลà¹à¸à¹ˆà¸œà¸¹à¹‰à¹ƒà¸Šà¹‰à¸—ั่วไปเท่านั้น */',
'group-bot.css' => '/* สไตล์ชีตในหน้านี้จะส่งผลà¹à¸à¹ˆà¸šà¸­à¸•à¹€à¸—่านั้น */',
@@ -2887,13 +2950,8 @@ $1',
# Scripts
'common.js' => '/* จาวาสคริปต์ใด ๆ ในหน้านี้จะถูà¸à¹‚หลดให้à¹à¸à¹ˆà¸œà¸¹à¹‰à¹ƒà¸Šà¹‰à¸—ุà¸à¸„นในทุà¸à¸«à¸™à¹‰à¸² */',
-'standard.js' => '/* จาวาสคริปต์ใด ๆ ในหน้านี้จะถูà¸à¹‚หลดให้à¹à¸à¹ˆà¸œà¸¹à¹‰à¹ƒà¸Šà¹‰à¸—ี่ใช้สà¸à¸´à¸™à¸„ลาสสิภ*/',
-'nostalgia.js' => '/* จาวาสคริปต์ใด ๆ ในหน้านี้จะถูà¸à¹‚หลดให้à¹à¸à¹ˆà¸œà¸¹à¹‰à¹ƒà¸Šà¹‰à¸—ี่ใช้สà¸à¸´à¸™à¸™à¸­à¸ªà¸•à¸±à¸¥à¹€à¸ˆà¸µà¸¢ */',
'cologneblue.js' => '/* จาวาสคริปต์ใด ๆ ในหน้านี้จะถูà¸à¹‚หลดให้à¹à¸à¹ˆà¸œà¸¹à¹‰à¹ƒà¸Šà¹‰à¸—ี่ใช้สà¸à¸´à¸™à¹‚คโลà¸à¸ˆà¹Œà¸šà¸¥à¸¹ */',
'monobook.js' => '/* จาวาสคริปต์ใด ๆ ในหน้านี้จะถูà¸à¹‚หลดให้à¹à¸à¹ˆà¸œà¸¹à¹‰à¹ƒà¸Šà¹‰à¸—ี่ใช้สà¸à¸´à¸™à¹‚มโนบุ๊ภ*/',
-'myskin.js' => '/* จาวาสคริปต์ใด ๆ ในหน้านี้จะถูà¸à¹‚หลดให้à¹à¸à¹ˆà¸œà¸¹à¹‰à¹ƒà¸Šà¹‰à¸—ี่ใช้สà¸à¸´à¸™à¸¡à¸²à¸¢à¸ªà¸à¸´à¸™ */',
-'chick.js' => '/* จาวาสคริปต์ใด ๆ ในหน้านี้จะถูà¸à¹‚หลดให้à¹à¸à¹ˆà¸œà¸¹à¹‰à¹ƒà¸Šà¹‰à¸—ี่ใช้สà¸à¸´à¸™à¸Šà¸´à¸ */',
-'simple.js' => '/* จาวาสคริปต์ใด ๆ ในหน้านี้จะถูà¸à¹‚หลดให้à¹à¸à¹ˆà¸œà¸¹à¹‰à¹ƒà¸Šà¹‰à¸—ี่ใช้สà¸à¸´à¸™à¸‹à¸´à¸¡à¹€à¸›à¸´à¸¥ */',
'modern.js' => '/* จาวาสคริปต์ใด ๆ ในหน้านี้จะถูà¸à¹‚หลดให้à¹à¸à¹ˆà¸œà¸¹à¹‰à¹ƒà¸Šà¹‰à¸—ี่ใช้สà¸à¸´à¸™à¹‚มเดิร์น */',
'vector.js' => '/* จาวาสคริปต์ใด ๆ ในหน้านี้จะถูà¸à¹‚หลดให้à¹à¸à¹ˆà¸œà¸¹à¹‰à¹ƒà¸Šà¹‰à¸—ี่ใช้สà¸à¸´à¸™à¹€à¸§à¸à¹€à¸•à¸­à¸£à¹Œ */',
'group-autoconfirmed.js' => '/* จาวาสคริปต์ใด ๆ ในหน้านี้จะถูà¸à¹‚หลดให้à¹à¸à¹ˆà¸œà¸¹à¹‰à¹ƒà¸Šà¹‰à¸—ั่วไปเท่านั้น */',
@@ -2970,13 +3028,8 @@ $1',
'pageinfo-category-files' => 'จำนวนไฟล์',
# Skin names
-'skinname-standard' => 'คลาสสิà¸',
-'skinname-nostalgia' => 'นอสตัลเจีย',
'skinname-cologneblue' => 'โคโลà¸à¸ˆà¹Œà¸šà¸¥à¸¹',
'skinname-monobook' => 'โมโนบุ๊à¸',
-'skinname-myskin' => 'มายสà¸à¸´à¸™',
-'skinname-chick' => 'ชิà¸',
-'skinname-simple' => 'ซิมเปิล',
'skinname-modern' => 'โมเดิร์น',
'skinname-vector' => 'เวà¸à¹€à¸•à¸­à¸£à¹Œ',
@@ -3055,11 +3108,25 @@ $1',
'minutes' => '$1 นาที',
'hours' => '$1 ชั่วโมง',
'days' => '$1 วัน',
+'weeks' => '$1 สัปดาห์',
'months' => '$1 เดือน',
'years' => '$1 ปี',
'ago' => '$1 มาà¹à¸¥à¹‰à¸§',
'just-now' => 'เมื่อสัà¸à¸„รู่นี้',
+# Human-readable timestamps
+'hours-ago' => '$1 ชั่วโมงที่à¹à¸¥à¹‰à¸§',
+'minutes-ago' => '$1 นาทีที่à¹à¸¥à¹‰à¸§',
+'seconds-ago' => '$1 วินาทีที่à¹à¸¥à¹‰à¸§',
+'monday-at' => 'วันจันทร์เมื่อ $1 น.',
+'tuesday-at' => 'วันอังคารเมื่อ $1 น.',
+'wednesday-at' => 'วันพุธเมื่อ $1 น.',
+'thursday-at' => 'วันพฤหัสบดีเมื่อ $1 น.',
+'friday-at' => 'วันศุà¸à¸£à¹Œà¹€à¸¡à¸·à¹ˆà¸­ $1 น.',
+'saturday-at' => 'วันเสาร์เมื่อ $1 น.',
+'sunday-at' => 'วันอาทิตย์เมื่อ $1 น.',
+'yesterday-at' => 'เมื่อวานเมื่อ $1 น.',
+
# Bad image list
'bad_image_list' => 'รูปà¹à¸šà¸šà¹à¸ªà¸”งต่อไปนี้:
@@ -3086,7 +3153,7 @@ $1',
* gpslongitude
* gpsaltitude',
-# EXIF tags
+# Exif tags
'exif-imagewidth' => 'ความà¸à¸§à¹‰à¸²à¸‡',
'exif-imagelength' => 'ความสูง',
'exif-bitspersample' => 'บิต ต่อคอมโพเนนต์',
@@ -3210,7 +3277,7 @@ $1',
'exif-label' => 'ป้ายฉลาà¸',
'exif-usageterms' => 'ข้อตà¸à¸¥à¸‡à¹ƒà¸™à¸à¸²à¸£à¹ƒà¸Šà¹‰à¸‡à¸²à¸™',
-# EXIF attributes
+# Exif attributes
'exif-compression-1' => 'ไม่ได้บีบอัด',
'exif-unknowndate' => 'ไม่ทราบวัน',
@@ -3572,7 +3639,6 @@ $5
'version-other' => 'อื่นๆ',
'version-mediahandlers' => 'ตัวจัดà¸à¸²à¸£à¹€à¸à¸µà¹ˆà¸¢à¸§à¸à¸±à¸šà¸ªà¸·à¹ˆà¸­ (media handler)',
'version-hooks' => 'ฮุà¸',
-'version-extension-functions' => 'ฟังà¸à¹Œà¸Šà¸±à¸™à¸ˆà¸²à¸à¸ªà¹ˆà¸§à¸™à¸‚ยายเพิ่ม (extension function)',
'version-parser-extensiontags' => 'à¹à¸—็à¸à¸—ี่มีà¸à¸²à¸£à¹ƒà¸Šà¹‰à¸‡à¸²à¸™à¸‚องพาร์สเซอร์',
'version-parser-function-hooks' => 'ฮุà¸à¸—ี่มีฟังà¸à¹Œà¸Šà¸±à¸™à¸žà¸²à¸£à¹Œà¸ªà¹€à¸‹à¸­à¸£à¹Œ',
'version-hook-name' => 'ชื่อฮุà¸',
@@ -3581,6 +3647,7 @@ $5
'version-license' => 'สัà¸à¸à¸²à¸­à¸™à¸¸à¸à¸²à¸•',
'version-poweredby-credits' => "วิà¸à¸´à¸™à¸µà¹‰à¸ˆà¸±à¸”ทำโดย '''[//www.mediawiki.org/ MediaWiki]''', สงวนลิขสิทธิ์ © 2001-$1 โดย $2",
'version-poweredby-others' => 'ผู้อื่น',
+'version-poweredby-translators' => 'ผู้à¹à¸›à¸¥ translatewiki.net',
'version-license-info' => 'มีเดียวิà¸à¸´à¹€à¸›à¹‡à¸™à¸‹à¸­à¸Ÿà¸•à¹Œà¹à¸§à¸£à¹Œà¹€à¸ªà¸£à¸µ คุณสามารถà¹à¸ˆà¸à¸ˆà¹ˆà¸²à¸¢ à¹à¸¥à¸°/หรือ à¹à¸à¹‰à¹„ขได้ภายใต้เงื่อนไขà¹à¸«à¹ˆà¸‡à¸ªà¸±à¸à¸à¸²à¸­à¸™à¸¸à¸à¸²à¸•à¸ªà¸²à¸˜à¸²à¸£à¸“ะทั่วไปของà¸à¸™à¸¹à¸•à¸²à¸¡à¸—ี่เผยà¹à¸žà¸£à¹ˆà¹‚ดยมูลนิธิซอฟต์à¹à¸§à¸£à¹Œà¹€à¸ªà¸£à¸µ ไม่ว่ารุ่นที่ 2 à¹à¸«à¹ˆà¸‡à¸ªà¸±à¸à¸à¸²à¸­à¸™à¸¸à¸à¸²à¸• หรือรุ่นภายหลังอื่นใด (ตามที่คุณเลือà¸)
มีเดียวิà¸à¸´à¸¡à¸µà¸–ูà¸à¹à¸ˆà¸à¸ˆà¹ˆà¸²à¸¢à¸”้วยหวังว่าจะเป็นประโยชน์ à¹à¸•à¹ˆà¹„ม่มีà¸à¸²à¸£à¸£à¸±à¸šà¸›à¸£à¸°à¸à¸±à¸™à¹ƒà¸” ๆ ทั้งสิ้น ไม่มีà¹à¸¡à¹‰à¸à¸²à¸£à¸£à¸±à¸šà¸›à¸£à¸°à¸à¸±à¸™à¹‚ดยนัยเพื่อà¸à¸²à¸£à¸„้า หรือความเหมาะสมสำหรับวัตถุประสงค์เฉพาะ ดูรายละเอียดเพิ่มเติมที่สัà¸à¸à¸²à¸­à¸™à¸¸à¸à¸²à¸•à¸ªà¸²à¸˜à¸²à¸£à¸“ะทั่วไปของà¸à¸™à¸¹
@@ -3592,14 +3659,17 @@ $5
'version-entrypoints-articlepath' => '[https://www.mediawiki.org/wiki/Manual:$wgArticlePath เส้นทางบทความ]',
'version-entrypoints-scriptpath' => '[https://www.mediawiki.org/wiki/Manual:$wgScriptPath เส้นทางสคริปต์]',
-# Special:FilePath
-'filepath' => 'พาธของไฟล์',
-'filepath-page' => '{{ns:file}}:',
-'filepath-submit' => 'ไป',
-'filepath-summary' => 'หน้าพิเศษนี้คืนค่าเป็นเส้นทางเต็มของไฟล์
-ไฟล์ภาพจะถูà¸à¹à¸ªà¸”งในขนาดเต็ม à¹à¸¥à¸°à¹„ฟล์ประเภทอื่นจะถูà¸à¹€à¸›à¸´à¸”ด้วยโปรà¹à¸à¸£à¸¡à¸—ี่เà¸à¸µà¹ˆà¸¢à¸§à¸‚้องโดยตรง
-
-à¸à¸£à¸¸à¸“าป้อนชื่อไฟล์โดยไม่มี "{{ns:file}}:" นำหน้า',
+# Special:Redirect
+'redirect' => 'à¸à¸²à¸£à¹€à¸›à¸¥à¸µà¹ˆà¸¢à¸™à¸—างตามชื่อไฟล์ รหัสประจำผู้ใช้หรือรุ่น',
+'redirect-legend' => 'à¸à¸²à¸£à¹€à¸›à¸¥à¸µà¹ˆà¸¢à¸™à¸—างไปยังไฟล์หรือหน้า',
+'redirect-summary' => 'หน้าพิเศษนี้เปลี่ยนทางไปยังไฟล์ (ระบุเป็นชื่อไฟล์) หน้า (ระบุเป็นรหัสรุ่น) หรือหน้าผู้ใช้ (ระบุเป็นรหัสผู้ใช้)',
+'redirect-submit' => 'ไป',
+'redirect-lookup' => 'ค้นดู:',
+'redirect-value' => 'ค่า:',
+'redirect-user' => 'รหัสผู้ใช้',
+'redirect-revision' => 'รุ่นหน้า',
+'redirect-file' => 'ชื่อไฟล์',
+'redirect-not-exists' => 'ไม่พบค่า',
# Special:FileDuplicateSearch
'fileduplicatesearch' => 'ค้นหาไฟล์ที่ซ้ำซ้อน',
@@ -3648,6 +3718,7 @@ $5
'tags' => 'ป้ายà¸à¸³à¸à¸±à¸šà¸à¸²à¸£à¹€à¸›à¸¥à¸µà¹ˆà¸¢à¸™à¹à¸›à¸¥à¸‡ (ที่สามารถใช้ได้)',
'tag-filter' => 'ตัวà¸à¸£à¸­à¸‡[[Special:Tags|ป้ายà¸à¸³à¸à¸±à¸š]]:',
'tag-filter-submit' => 'à¸à¸£à¸­à¸‡',
+'tag-list-wrapper' => '([[Special:Tags|{{PLURAL:$1|ป้ายà¸à¸³à¸à¸±à¸š}}]]: $2)',
'tags-title' => 'ป้ายà¸à¸³à¸à¸±à¸š',
'tags-intro' => 'หน้านี้à¹à¸ªà¸”งรายà¸à¸²à¸£à¹à¸¥à¸°à¸„วามหมายของป้ายà¸à¸³à¸à¸±à¸šà¸•à¹ˆà¸²à¸‡à¹† ที่ซอฟต์à¹à¸§à¸£à¹Œà¸­à¸²à¸ˆà¸ˆà¸°à¹ƒà¸Šà¹‰à¸—ำเครื่องหมายà¸à¸³à¸à¸±à¸šà¸à¸²à¸£à¹à¸à¹‰à¹„ข',
'tags-tag' => 'ชื่อป้ายà¸à¸³à¸à¸±à¸š',
@@ -3689,6 +3760,8 @@ $5
'htmlform-submit' => 'ส่งข้อมูล',
'htmlform-reset' => 'ยà¸à¹€à¸¥à¸´à¸à¸à¸²à¸£à¹€à¸›à¸¥à¸·à¹ˆà¸¢à¸™à¹à¸›à¸¥à¸‡',
'htmlform-selectorother-other' => 'อื่น ๆ',
+'htmlform-no' => 'ไม่',
+'htmlform-yes' => 'ใช่',
# SQLite database support
'sqlite-has-fts' => 'รุ่น $1 พร้อมà¸à¸²à¸£à¸ªà¸™à¸±à¸šà¸ªà¸™à¸¸à¸™à¸à¸²à¸£à¸„้นหาข้อความà¹à¸šà¸šà¹€à¸•à¹‡à¸¡',
diff --git a/languages/messages/MessagesTk.php b/languages/messages/MessagesTk.php
index fcd08d5c..30a9c332 100644
--- a/languages/messages/MessagesTk.php
+++ b/languages/messages/MessagesTk.php
@@ -68,9 +68,6 @@ $messages = array(
'tog-shownumberswatching' => 'Gözegçilikde saklaýan ulanyjylaryň sanyny görkez',
'tog-oldsig' => 'Bar bolan gol:',
'tog-fancysig' => 'Gola wikitekst hökmünde çemeleş (awtomatik çykgytsyz)',
-'tog-externaleditor' => 'Gaýybana daşarky redaktor ulan (diňe hünärmenler üçin, kompýuteriňizde ýörite sazlamalar talap edilýär. [//www.mediawiki.org/wiki/Manual:External_editors Jikme-jik.])',
-'tog-externaldiff' => 'Başga programmalaryň üsti bilen deňeşdir (diňe hünärmenler üçin, kompýuteriňizde ýörite sazlamalar talap edilýär)',
-'tog-showjumplinks' => '"Git" çykgydyny işlet',
'tog-uselivepreview' => 'Gönümel deslapky syny ulan (JavaScript) (Synag edilýär)',
'tog-forceeditsummary' => 'Gysgaça mazmuny boş galdyran mahalym maňa ýatlat',
'tog-watchlisthideown' => 'Gözegçilik sanawymdan öz özgerdişlerimi gizle',
@@ -268,7 +265,7 @@ $1',
'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).
+# 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).
'aboutsite' => '{{SITENAME}} hakynda',
'aboutpage' => 'Project:Hakynda',
'copyright' => 'Mazmun $1 esasynda elýeterlidir.',
@@ -278,7 +275,6 @@ $1',
'disclaimers' => 'Jogapkärçilikden boýun gaçyrma',
'disclaimerpage' => 'Project:Umumy jogapkärçilikden boýun gaçyrma',
'edithelp' => 'Nähili redaktirlenýär?',
-'edithelppage' => 'Help:Redaktirleme',
'helppage' => 'Help:Içindäkiler',
'mainpage' => 'BaÅŸ Sahypa',
'mainpage-description' => 'BaÅŸ Sahypa',
@@ -351,16 +347,6 @@ Bar bolan ähli ýörite sahypalary [[Special:SpecialPages|ýörite sahypalar]]
# General errors
'error' => 'Säwlik',
'databaseerror' => 'Maglumat bazasynyň säwligi',
-'dberrortext' => 'Maglumat bazasy gözleginde sintaksis säwligi ýüze çykdy.
-Onuň programmadaky bir säwlik bolmagy ahmal.
-"<tt>$2</tt>" funksiýasyndan synalyp görülen iň soňky maglumat bazasy gözlegi:
-<blockquote><tt>$1</tt></blockquote>.
-Maglumat bazasy tarapyndan yzyna gaýtarylan säwlik "<tt>$3: $4</tt>".',
-'dberrortextcl' => 'Maglumat bazasy gözleginde sintaksis säwligi ýüze çykdy.
-Iň soňky maglumat bazasy gözlegi:
-"$1"
-Ulanylan funksiýa "$2".
-Maglumat bazasy tarapyndan yzyna gaýtarylan säwlik "$3: $4"',
'laggedslavemode' => 'Duýduryş: Sahypada soňky täzelemeler ýok bolmagy ahmal.',
'readonly' => 'Maglumat bazasy gulplandy',
'enterlockreason' => 'Gulplamak üçin bir sebäp görkeziň. Gulpuň haçan açyljakdygy barada takmynan bir sene ýazyň.',
@@ -408,7 +394,6 @@ Talap: $2',
'viewsourcetext' => 'Bu sahypanyň çeşmesini görüp hem-de göçürip bilersiňiz:',
'protectedinterface' => 'Bu sahypa programma üçin interfeýs tekstini üpjün edýär. Bet niýetli hüjümlerden goramak maksady bilen gulp astyna alnandyr.',
'editinginterface' => "'''Duýduryş:''' Programma üçin interfeýs tekstini üpjün etmekte ulanylýan bir sahypany redaktirleýärsiňiz. Bu sahypada ediljek üýtgeşmeler beýleki ulanyjylar üçin ulanyjy interfeýsiniň daşky görnüşini üýtgedýändir. Terjimeler üçin, MediaWikiniň lokalizasiýa taslamasy bolan [//translatewiki.net/wiki/Main_Page?setlang=tr translatewiki.net]i ulanmaklygyňyzy haýyş edýäris.",
-'sqlhidden' => '(SQL gizlin talap)',
'cascadeprotected' => 'Bu sahypa redaktirlenmekden goralýar, sebäbi ol "kaskadly" opsiýasy işledilip gorag astyna alnan {{PLURAL:$1|sahypada|sahypada}} ulanylýar:
$2',
'namespaceprotected' => "Siziň '''$1''' giňişligindäki sahypalary redaktirlemäge rugsadyňyz ýok.",
@@ -520,7 +505,7 @@ Sessiýa açmaklygy tamamlamak üçin, bu ýere täze parol ýazyň:',
'newpassword' => 'Täze parol:',
'retypenew' => 'Täze paroly gaýtadan ýaz:',
'resetpass_submit' => 'Paroly sazlaň we sessiýa açyň',
-'resetpass_success' => 'Parolyňyz şowlulyk bilen üýtgedildi! Häzir sessiýaňyz açylýar...',
+'changepassword-success' => 'Parolyňyz şowlulyk bilen üýtgedildi! Häzir sessiýaňyz açylýar...',
'resetpass_forbidden' => 'Parollary üýtgedip bolmaýar',
'resetpass-no-info' => 'Bu sahypany gönüden-göni açmak üçin sessiýa açmagyňyz zerurdyr.',
'resetpass-submit-loggedin' => 'Paroly üýtget',
@@ -967,7 +952,6 @@ Nawigasiýa çykgytlaryny ulanmaklygyň bu sütüni başky ýagdaýyna getirjekd
'searchmenu-legend' => 'Gözleg opsiýalary',
'searchmenu-exists' => "'''Bu wikide \"[[:\$1]]\" atly sahypa bar'''",
'searchmenu-new' => "'''Bu wikide \"[[:\$1]]\" sahypasyny döret!'''",
-'searchhelp-url' => 'Help:Içindäkiler',
'searchmenu-prefix' => '[[Special:PrefixIndex/$1|Şu prefiksli sahypalara göz aýla]]',
'searchprofile-articles' => 'Mazmunly sahypalar',
'searchprofile-project' => 'Ãardam we Taslama sahypalary',
@@ -1012,14 +996,6 @@ Gözlegiňiziň başyna '''all:''' pristawkasyny goşup tutuş mazmuny (şol san
Ãogsa-da, oňa çenli Google bilen gözleg geçirip bilersiňiz.
Emma olaryň {{SITENAME}} indeksleriniň möwriti geçen bolmagy mümkindir.',
-# Quickbar
-'qbsettings' => 'Tiz panel',
-'qbsettings-none' => 'Hiç biri',
-'qbsettings-fixedleft' => 'Çepe berkidildi',
-'qbsettings-fixedright' => 'Saga berkidildi',
-'qbsettings-floatingleft' => 'Çepe ýaplanýar',
-'qbsettings-floatingright' => 'Saga ýaplanýar',
-
# Preferences page
'preferences' => 'Ileri tutmalar',
'mypreferences' => 'Ileri tutmalar',
@@ -1050,7 +1026,6 @@ Emma olaryň {{SITENAME}} indeksleriniň möwriti geçen bolmagy mümkindir.',
'resetprefs' => 'Ãazdyrylmadyk üýtgeÅŸmeleri aýyr',
'restoreprefs' => 'Ähli gaýybana sazlamalary dikelt',
'prefs-editing' => 'Redaktirleme',
-'prefs-edit-boxsize' => 'Redaktirleme penjiresiniň ölçegi.',
'rows' => 'Hatarlar:',
'columns' => 'Sütünler:',
'searchresultshead' => 'Gözleg',
@@ -1061,9 +1036,6 @@ Emma olaryň {{SITENAME}} indeksleriniň möwriti geçen bolmagy mümkindir.',
'recentchangesdays-max' => '(maksimum $1 {{PLURAL:$1|gün|gün}})',
'recentchangescount' => 'Gaýybana görkeziljek özgerdiş sany:',
'prefs-help-recentchangescount' => 'Muňa soňky üýtgeşmeler, sahypa geçmişleri hem-de gündelikler girýär.',
-'prefs-help-watchlist-token' => 'Bu meýdança gizlin açar ýazmagyňyz gözegçilik sanawyňyz üçin RSS translýasiýasyny döredýär.
-Bu meýdançadaky açary bilen adam gözegçilik sanawyňyzy okap biler, şonuň üçin hem başga bir howpsuz baha saýlaň.
-Gabat gelşine görä döredilen şu bahany ulanyp bilersiňiz: $1',
'savedprefs' => 'Ileri tutmalaryňyz ýazdyryldy.',
'timezonelegend' => 'Sagat guÅŸaklygy',
'localtime' => 'Ãerli wagt:',
@@ -1093,7 +1065,6 @@ Gabat gelşine görä döredilen şu bahany ulanyp bilersiňiz: $1',
'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',
'youremail' => 'E-poçta:',
'username' => 'Ulanyjy ady:',
'uid' => 'Ulanyjy belgisi:',
@@ -1319,7 +1290,6 @@ $1 {{PLURAL:$1|simwoldan|simwoldan}} köp bolmaly däl.',
'recentchangeslinked-feed' => 'Degişli üýtgeşmeler',
'recentchangeslinked-toolbox' => 'Degişli üýtgeşmeler',
'recentchangeslinked-title' => '"$1" bilen baglanyşykly üýtgeşmeler',
-'recentchangeslinked-noresult' => 'Berlen wagtyň dowamynda çykgyt berýän sahypalarda üýtgeşme bolmady.',
'recentchangeslinked-summary' => "Aşakdaky sanaw, görkezilen sahypa (ýa-da görkezilen kategoriýanyň agzalaryna) çykgyt berýän sahypalarda edilen üýtgeşmeleriň sanawydyr.
[[Special:Watchlist|Gözegçilik sanawyňyzdaky]] sahypalar '''goýy''' ýazgy bilen görkezilýär.",
'recentchangeslinked-page' => 'Sahypanyň ady:',
@@ -1484,7 +1454,6 @@ Howpsuzlygyň optimizasiýasy üçin, img_auth.php ýapylyp goýuldy.',
'http-read-error' => 'HTTP okamak säwligi.',
'http-timed-out' => 'HTTP talabynyň wagty geçdi.',
'http-curl-error' => 'URL äkelmek säwligi: $1',
-'http-host-unreachable' => 'URL-ä baryp bolmaýar',
'http-bad-status' => 'HTTP talaby wagtynda problema döredi: $1 $2',
# Some likely curl errors. More could be added from <http://curl.haxx.se/libcurl/c/libcurl-errors.html>
@@ -1628,12 +1597,6 @@ Giriş formaty: mazmuntip/kiçitip, meselem <code>surat/jpeg</code>.',
'statistics-users-active-desc' => 'Soňky {{PLURAL:$1|1 günde|$1 günde}} haýsydyr bir iş geçiren ulanyjylar',
'statistics-mostpopular' => 'Iň köp görülýän sahypalar',
-'disambiguations' => 'Dürli manyly sahypalar',
-'disambiguationspage' => 'Template:Dürli manylar',
-'disambiguations-text' => "Aşakdaky sahypalar '''dürli manyly sahypa''' çykgyt berýär.
-Olar muňa derek degişli anyk sahypa çykgyt bermelidir.<br />
-[[MediaWiki:Disambiguationspage]] sahypasyndan çykgyt berilýän bir şablony ulanýan bolsa, onda ol sahypa dürli manyly hökmünde çemeleşilýär.",
-
'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.
@@ -1859,10 +1822,9 @@ Aňsatlyk bilen saýlap almak üçin bolsa, [[Special:RecentChanges|soňky üýt
'unwatchthispage' => 'Gözegçilik etmegi bes et',
'notanarticle' => 'Makala däl',
'notvisiblerev' => 'Başga bir ulanyja degişli iň soňky wersiýa öçürilipdir',
-'watchnochange' => 'Gözegçilik edýän sahypalaryňyzyň hiç birisi görkezilen wagtyň dowamynda redaktirlenmändir.',
'watchlist-details' => 'Çekişme sahypalaryny hasap etmäniňde, gözegçilik sanawyňyzda {{PLURAL:$1|$1 sahypa|$1 sahypa}} bar.',
-'wlheader-enotif' => '* E-poçta bilen habar beriş açyk.',
-'wlheader-showupdated' => "* Soňky gezek baryp görenizden soňra üýtgedilen sahypalar '''goýy şrift''' bilen görkezilýär.",
+'wlheader-enotif' => 'E-poçta bilen habar beriş açyk.',
+'wlheader-showupdated' => "Soňky gezek baryp görenizden soňra üýtgedilen sahypalar '''goýy şrift''' bilen görkezilýär.",
'watchmethod-recent' => 'soňky özgerdişlerdäki gözegçilikde saklaýan sahypalaryňyz barlanylýar',
'watchmethod-list' => 'gözegçilikde saklaýan sahypalaryňyzdaky soňky özgerdişler barlanylýar',
'watchlistcontains' => 'Gözegçilik sanawyňyzda $1 sany {{PLURAL:$1|sahypa|sahypa}} bar.',
@@ -2093,7 +2055,7 @@ $1',
'contributions' => '{{GENDER:$1|Ulanyjy}} goÅŸantlary',
'contributions-title' => '$1 üçin ulanyjy goşantlary',
'mycontris' => 'GoÅŸantlar',
-'contribsub2' => '$1 ($2)',
+'contribsub2' => '{{GENDER:$3|$1}} üçin ($2)',
'nocontribs' => 'Bu kriteriýlere gabat gelýän üýtgeşme ýok.',
'uctop' => '(häzirki)',
'month' => 'Aý:',
@@ -2230,12 +2192,9 @@ Blokirlemesi eýýäm aýyrylan bolmagy mümkin.',
Emma, bu adres $2 diapazonynyň bir bölegi hökmünde blokirlenipdir, diapazon blokirlemesini aýryp bilersiňiz.',
'ip_range_invalid' => 'Nädogry IP diapazony.',
'ip_range_toolarge' => '/$1 blokdan uly aralyk blokirlemelere rugsat berilmeýär',
-'blockme' => 'Meni blokirle',
'proxyblocker' => 'Proksi blokirleýji',
-'proxyblocker-disabled' => 'Bu funksiýa ýapyk.',
'proxyblockreason' => 'IP adresiňiz açyk proksidigi sebäpli blokirlenipdir.
Internet üpjün edijiňiz ýa-da goldaw gullugy bilen habarlaşyp, olary bu çynlakaý howpsuzlyk problemasy barada habardar ediň.',
-'proxyblocksuccess' => 'Ãerine ýetirildi.',
'sorbsreason' => 'IP adresiňiz {{SITENAME}} tarapyndan ulanylýan DNSBL-de açyk proksi hökmünde sanawa goşulypdyr.',
'sorbs_create_account_reason' => 'IP adresiňiz {{SITENAME}} tarapyndan ulanylýan DNSBL-de açyk proksi hökmünde sanawa goşulypdyr.
Hasap açyp bilmeýärsiňiz.',
@@ -2616,7 +2575,7 @@ Ondan soňraky çykgyt(lar) kadadan çykma hökmünde kabul edilýär, meselem:
* gpslongitude
* gpsaltitude',
-# EXIF tags
+# Exif tags
'exif-imagewidth' => 'In',
'exif-imagelength' => 'Beýiklik',
'exif-bitspersample' => 'Komponent baÅŸyna bit',
@@ -2732,7 +2691,7 @@ Ondan soňraky çykgyt(lar) kadadan çykma hökmünde kabul edilýär, meselem:
'exif-languagecode' => 'Dil',
'exif-iimcategory' => 'Kategoriýa',
-# EXIF attributes
+# Exif attributes
'exif-compression-1' => 'Gysylmadyk',
'exif-unknowndate' => 'Näbelli sene',
@@ -3033,7 +2992,6 @@ Bolanyňyzdan soňra "{{int:Watchlistedit-raw-submit}}" düwmesine basyň.
'version-other' => 'BaÅŸga',
'version-mediahandlers' => 'Media işleýjiler',
'version-hooks' => 'Ilgençekler',
-'version-extension-functions' => 'Giňeltme funksiýalary',
'version-parser-extensiontags' => 'Analizator giňeltme bellikleri',
'version-parser-function-hooks' => 'Analizator funsiýasynyň ilgençekleri',
'version-hook-name' => 'Ilgençegiň ady',
@@ -3051,15 +3009,6 @@ Bu programmanyň ýany bilen siz [{{SERVER}}{{SCRIPTPATH}}/COPYING GNU General P
'version-software-product' => 'Önüm',
'version-software-version' => 'Wersiýa',
-# Special:FilePath
-'filepath' => 'Faýla barýan ýol',
-'filepath-page' => 'Faýl:',
-'filepath-submit' => 'Git',
-'filepath-summary' => 'Bu ýörite sahypa faýla barýan doly ýoly gaýtaryp getirýär.
-Suratlar doly ölçegde görkezilýär, beýleki faýl görnüşleri degişli programmalary bilen gönümel başladylýar.
-
-Faýlyň adyny "{{ns:file}}:" pristawkasyz giriziň.',
-
# Special:FileDuplicateSearch
'fileduplicatesearch' => 'Dublikat faýllaryň gözlegi',
'fileduplicatesearch-summary' => 'Heş kodlary boýunça meňzeş faýllary gözle.',
diff --git a/languages/messages/MessagesTl.php b/languages/messages/MessagesTl.php
index 73c7c570..1d333551 100644
--- a/languages/messages/MessagesTl.php
+++ b/languages/messages/MessagesTl.php
@@ -10,6 +10,7 @@
* @author AnakngAraw
* @author Dosmiin Barsbold
* @author Felipe Aira
+ * @author Jojit fb
* @author Kaganer
* @author Sky Harbor
* @author tl.wikipedia.org sysops
@@ -36,8 +37,6 @@ $namespaceNames = array(
);
$namespaceAliases = array(
- 'Talaksan' => NS_FILE,
- 'Usapang talaksan' => NS_FILE_TALK,
'Suleras' => NS_TEMPLATE,
'Usapang_suleras' => NS_TEMPLATE_TALK,
'Kaurian' => NS_CATEGORY,
@@ -176,9 +175,6 @@ $messages = array(
'tog-shownumberswatching' => 'Ipakita ang bilang ng mga nagbabantay na tagagamit',
'tog-oldsig' => 'Umiiral na lagda:',
'tog-fancysig' => 'Ituring ang lagda bilang teksto ng wiki (walang automatikong pagkawing)',
-'tog-externaleditor' => 'Gumamit ng nakatakdang panlabas na pampatnugot ayon sa likas na pagkakatakda (para sa mga dalubhasa lamang, kailangan ng natatanging mga pagtatakda sa iyong kompyuter. [//www.mediawiki.org/wiki/Manual:External_editors Marami pang kabatiran.])',
-'tog-externaldiff' => 'Gumamit ng likas na nakatakdang panlabas na pagkakaiba (para sa mga dalubhasa lamang, kailangan ng natatanging mga pagtatakda sa iyong kompyuter. [//www.mediawiki.org/wiki/Manual:External_editors Mas marami pang kabatiran.])',
-'tog-showjumplinks' => 'Payagan ang mga "tumalon sa" na kawing pampagamit',
'tog-uselivepreview' => 'Gamitin ang buhay na paunang tingin (JavaScript) (Eksperimental)',
'tog-forceeditsummary' => 'Pagsabihan ako kapag nagpapasok ng walang-lamang buod ng pagbabago',
'tog-watchlisthideown' => 'Itago ang aking mga pagbabago mula sa tala ng mga binabantayan',
@@ -192,6 +188,7 @@ $messages = array(
'tog-showhiddencats' => 'Ipakita ang mga nakatagong kategorya',
'tog-noconvertlink' => 'Huwag paganahin ang pagpapalit ng pamagat na pangkawing',
'tog-norollbackdiff' => 'Alisin ang mga pagkakaiba pagkatapos isagawa ang pagpapagulong na pabalik sa dati',
+'tog-useeditwarning' => 'Magbabala sa akin kapag umalis ako sa isang pahina ng pampatnugot na hindi pa nasasagip ang mga pagbabago',
'underline-always' => 'Palagi',
'underline-never' => 'Hindi magpakailanman',
@@ -255,6 +252,18 @@ $messages = array(
'oct' => 'Okt',
'nov' => 'Nob',
'dec' => 'Dis',
+'january-date' => '$1 Enero',
+'february-date' => '$1 Pebrero',
+'march-date' => '$1 Marso',
+'april-date' => '$1 Abril',
+'may-date' => '$1 Mayo',
+'june-date' => '$1 Hunyo',
+'july-date' => '$1 Hulyo',
+'august-date' => '$1 Agosto',
+'september-date' => '$1 Setyembre',
+'october-date' => '$1 Oktubre',
+'november-date' => '$1 Nobyembre',
+'december-date' => '$1 Disyembre',
# Categories related messages
'pagecategories' => '{{PLURAL:$1|Kategorya|Mga kategorya}}',
@@ -276,7 +285,7 @@ $messages = array(
'broken-file-category' => 'Mga pahina na may sirang mga kawing ng talaksan',
'categoryviewer-pagedlinks' => '($1) ($2)',
-'linkprefix' => '/^(.*?)([a-zA-Z\\x80-\\xff]+)$/sD',
+'linkprefix' => '/^((?>.*(?<![a-zA-Z\\x80-\\xff])))(.+)$/sD',
'about' => 'Patungkol',
'article' => 'Pahina ng nilalaman',
@@ -381,7 +390,7 @@ $1',
'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).
+# 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).
'aboutsite' => 'Tungkol sa {{SITENAME}}',
'aboutpage' => 'Project:Patungkol',
'copyright' => 'Maaaring gamitin ang nilalaman sa ilalim ng $1.',
@@ -391,7 +400,6 @@ $1',
'disclaimers' => 'Mga pagtatanggi',
'disclaimerpage' => 'Project:Pangkalahatang pagtatanggi',
'edithelp' => 'Tulong sa pagbabago',
-'edithelppage' => 'Help:Pagbabago',
'helppage' => 'Help:Mga nilalaman',
'mainpage' => 'Unang Pahina',
'mainpage-description' => 'Unang Pahina',
@@ -423,7 +431,6 @@ Tingnan ang [[Special:Version|pahina ng bersiyon]].',
'newmessagesdifflinkplural' => 'huling {{PLURAL:$1|pagbabago|mga pagbabago}}',
'youhavenewmessagesmulti' => 'Mayroon kang mga bagong mensahe sa $1',
'editsection' => 'baguhin',
-'editsection-brackets' => '[$1]',
'editold' => 'baguhin',
'viewsourceold' => 'tingnan ang batayan',
'editlink' => 'baguhin',
@@ -475,17 +482,6 @@ Matatagpuan ang isang tala ng mga tamang natatanging pahina sa [[Special:Special
# General errors
'error' => 'Kamalian',
'databaseerror' => 'Kamalian sa kalipunan ng datos',
-'dberrortext' => 'Naganap ang isang pagkakamali sa pag-uusisa na pampalaugnayan sa kalipunan ng datos.
-Maaaring magpahiwatig ito ng isang surot sa loob ng sopwer.
-Ang huling tinangkang pag-uusisa sa kalipunan ng datos ay:
-<blockquote><code>$1</code></blockquote>
-magmula sa loob ng tungkuling "<code>$2</code>".
-Nagbalik ang kalipunan ng dato ng kamalian na "<samp>$3: $4</samp>".',
-'dberrortextcl' => 'Nagkaroon po ng isang pagkakamali sa usisang pampalaugnayan sa kalipunan ng datos.
-Ang huling sinubukang paguusisa sa kalipunan ng datos ay:
-"$1"
-mula sa gawaing "$2".
-Ibinalik ng kalipunan ng datos ang kamaliang "$3: $4"',
'laggedslavemode' => "'''Babala:''' Maaaring hindi naglalaman ang pahina ng mga huling dagdag.",
'readonly' => 'Nakakandado ang kalipunan ng datos',
'enterlockreason' => 'Maglagay ng dahilan sa pagkakandado, kasama ang taya kung kailan magtatapos ang pagkakandado',
@@ -541,12 +537,13 @@ Pakisubok na lang ulit pagkaraan ng kaunting mga minuto.",
'editinginterface' => "'''Babala:''' Binabago mo ang isang pahinang ginagamit sa pagbibigay ng tekstong panghangganan para sa sopwer.
Makaaapekto ang mga pagbago sa pahinang ito sa anyo ng hangganang (''interface'') pantagagamit na para sa ibang mga tagagamit sa wiking ito.
Upang magdagag o magbago ng mga salinwika, isaaalang-alang na lang po ang paggamit ng [//translatewiki.net/wiki/Main_Page?setlang=en translatewiki.net], ang proyekto para sa lokalisasyon ng MediaWiki.",
-'sqlhidden' => '(nakatago ang tanong ng SQL)',
'cascadeprotected' => 'Nakasanggalang ang pahinang ito mula sa mga pagbabago, dahil kabilang ito sa sumusunod na {{PLURAL:$1|pahinang|mga pahinang}} nakasanggalang sa pamamagitan ng binuhay na opsyong "nahuhulog" (kumakaskada):
$2',
'namespaceprotected' => "Wala kang pahintulot na magbago ng mga pahinang nasa ngalan-espasyong '''$1'''.",
'customcssprotected' => 'Wala kang pahintulot na baguhin ang pahina ng CSS na ito, dahil naglalaman ito ng mga katakdaang pansarili ng ibang tagagamit.',
'customjsprotected' => 'Wala kang pahintulot na baguhin ang pahina ng JavaScript na ito, dahil naglalaman ito ng mga katakdaang pansarili ng ibang tagagamit.',
+'mycustomcssprotected' => 'Wala kang pahintulot na baguhin itong pahinang CSS.',
+'mycustomjsprotected' => 'Wala kang pahintulot na baguhin itong pahinang JavaScript.',
'ns-specialprotected' => 'Hindi pwedeng baguhin ang mga natatanging pahina.',
'titleprotected' => "Nakasanggalang ang pamagat na ito mula sa paglikha ni [[User:$1|$1]].
Ang ibinigay na dahilan ay ''$2''.",
@@ -573,9 +570,12 @@ Tandaan na may ilang pahinang maaaring magpatuloy na nagpapakitang parang nakala
Huwag kalimutang baguhin ang iyong [[Special:Preferences|mga kagustuhan sa {{SITENAME}}]].',
'yourname' => 'Bansag:',
'yourpassword' => 'Hudyat:',
+'userlogin-yourpassword' => 'Hudyat',
+'userlogin-yourpassword-ph' => 'Ipasok ang iyong hudyat',
'yourpasswordagain' => 'Hudyat mo uli:',
+'createacct-yourpasswordagain' => 'Tiyakin ang hudyat',
'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',
+'userlogin-remembermypassword' => 'Panatilihin akong nakalagda',
'yourdomainname' => 'Dominyo mo:',
'password-change-forbidden' => 'Hindi mo maaaring palitan ang mga hudyat sa wiking ito.',
'externaldberror' => 'Maaaring may kamalian sa pagpapatotoo ng kalipunan ng mga dato o kaya hindi ka pinahintulutang isapanahon ng iyong panlabas na kuwenta o patnugutan.',
@@ -587,14 +587,19 @@ Huwag kalimutang baguhin ang iyong [[Special:Preferences|mga kagustuhan sa {{SIT
'logout' => 'Umalis sa pagkakalagda',
'userlogout' => 'Umalis sa pagkakalagda',
'notloggedin' => 'Hindi nakalagda',
+'userlogin-noaccount' => 'Wala ka pa bang kuwenta?',
+'userlogin-joinproject' => 'Sumali sa {{SITENAME}}',
'nologin' => 'Wala ka pang kuwenta? $1.',
'nologinlink' => 'Lumikha ng kuwenta',
'createaccount' => 'Lumikha ng kuwenta',
'gotaccount' => 'May kuwenta ka na ba? $1.',
'gotaccountlink' => 'Lumagda',
'userlogin-resetlink' => 'Nakalimutan mo ang iyong mga detalyeng panglagda?',
+'createacct-emailrequired' => 'Direksiyong e-liham:',
'createaccountmail' => 'Gumamit ng pansamantalang walang-piling hudyat at ipadala ito sa direksiyong e-liham na nakasaad sa ibaba',
+'createacct-realname' => 'Tunay na pangalan (maaaring wala)',
'createaccountreason' => 'Dahilan:',
+'createacct-reason' => 'Dahilan',
'badretype' => 'Hindi magkatugma ang ipinasok mong mga hudyat.',
'userexists' => 'May gumagamit na ng ipinasok na bansag.
Pumili po ng ibang pangalan.',
@@ -687,7 +692,7 @@ Para tapusin ang paglagda, dapat kang magtakda ng isang bagong hudyat dito:',
'newpassword' => 'Bagong hudyat:',
'retypenew' => 'Ipasok muli ang bagong hudyat:',
'resetpass_submit' => 'Itakda ang hudyat at lumagda',
-'resetpass_success' => 'Matagumpay na nabago ang iyong hudyat! Inilalagda ka na ngayon...',
+'changepassword-success' => 'Matagumpay na nabago ang iyong hudyat! Inilalagda ka na ngayon...',
'resetpass_forbidden' => 'Hindi mababago ang mga hudyat',
'resetpass-no-info' => 'Nakalagda ka dapat para tuwirang mapuntahan ang pahina ito.',
'resetpass-submit-loggedin' => 'Baguhin ang hudyat',
@@ -698,10 +703,8 @@ Maaaring matagumpay mo nang nabago ang iyong hudyat o nakahiling na ng isang bag
# Special:PasswordReset
'passwordreset' => 'Muling pagtatakda ng hudyat',
-'passwordreset-text' => 'Punuin ang pormularyong ito upang makatanggap ng isang pampaalalang e-liham ng iyong mga detalye ng akawnt.',
'passwordreset-legend' => 'Itakdang muli ang hudyat',
'passwordreset-disabled' => 'Hindi pinagagana sa wiking ito ang muling mga pagtatakda ng hudyat.',
-'passwordreset-pretext' => '{{PLURAL:$1| | Ipasok ang isa sa mga piraso ng datos sa ibaba}}',
'passwordreset-username' => 'Pangalan ng tagagamit:',
'passwordreset-domain' => 'Nasasakupan:',
'passwordreset-capture' => 'Tingnan ang lumabas na e-liham?',
@@ -949,6 +952,8 @@ Tila binura na ito.',
'edit-already-exists' => 'Hindi makalikha ng isang bagong pahina.
Umiiral na ito.',
'defaultmessagetext' => 'Nakatakdang teksto ng mensahe',
+'editwarning-warning' => 'Ang paglisan mula sa pahinang ito ay maaaring makasanhi sa iyo ng pagkawala ng anumang mga pagbabagong ginawa mo.
+Kung nakalagda ka, maaari mong huwag paganahin ang babalang ito sa loob ng seksyong "May binabago" ng mga nais mo.',
# Content models
'content-model-wikitext' => 'wikiteksto',
@@ -1187,7 +1192,6 @@ Matatagpuan ang mga detalye sa loob ng [{{fullurl:{{#Special:Log}}/delete|page={
'searchmenu-legend' => 'Mga pagpipilian para sa paghahanap',
'searchmenu-exists' => "'''Mayroong pahinang may pangalang \"[[:\$1]]\" dito sa wiking ito'''",
'searchmenu-new' => "'''Likhain ang pahinang \"[[:\$1]]\" sa wiking ito!'''",
-'searchhelp-url' => 'Help:Nilalaman',
'searchmenu-prefix' => '[[Special:PrefixIndex/$1|Tingnan-tingnan ang mga pahinang may ganitong unahan/unlapi]]',
'searchprofile-articles' => 'Mga pahina ng nilalaman',
'searchprofile-project' => 'Mga pahina ng Tulong at Proyekto',
@@ -1230,15 +1234,6 @@ Subuking lagyan ng unlapi/paunang ''all:'' upang hanapin ang lahat ng mga nialal
'search-external' => 'Panlabas na paghahanap',
'searchdisabled' => 'Nakapatay ang paghahanap sa {{SITENAME}}. Maaari kang pansamantalang maghanap sa pamamagitan ng Google. Tandaan na maaaring luma na ang kanilang mga indeks sa nilalaman ng {{SITENAME}}.',
-# Quickbar
-'qbsettings' => 'Quickbar',
-'qbsettings-none' => 'Wala',
-'qbsettings-fixedleft' => 'Inayos ang kaliwa',
-'qbsettings-fixedright' => 'Inayos ang kanan',
-'qbsettings-floatingleft' => 'Kaliwa lumulutang',
-'qbsettings-floatingright' => 'Kanan lumulutang',
-'qbsettings-directionality' => 'Naayos na, ayon sa kapupuntahan ng panitik ng wika mo',
-
# Preferences page
'preferences' => 'Mga kagustuhan',
'mypreferences' => 'Mga nais',
@@ -1271,7 +1266,6 @@ Subuking lagyan ng unlapi/paunang ''all:'' upang hanapin ang lahat ng mga nialal
'resetprefs' => 'Hawanin ang hindi nasagip na mga pagbabago',
'restoreprefs' => 'Ibalik ang lahat ng likas na mga pagtatakda',
'prefs-editing' => 'May binabago',
-'prefs-edit-boxsize' => 'Sukat ng dungawan ng ginagawang pagbabago.',
'rows' => 'Mga pahalang na hanay:',
'columns' => 'Mga pahabang hanay:',
'searchresultshead' => 'Hanapin',
@@ -1282,7 +1276,6 @@ Subuking lagyan ng unlapi/paunang ''all:'' upang hanapin ang lahat ng mga nialal
'recentchangesdays-max' => '(pinakamataas na ang $1 {{PLURAL:$1|araw|mga araw}})',
'recentchangescount' => 'Bilang ng mga pagbabagong ipapakita sa pamamagitan ng likas na katakdaan:',
'prefs-help-recentchangescount' => 'Kasama nito ang mga huling binago, kasaysayan ng mga pahina, at mga tala.',
-'prefs-help-watchlist-token' => "Ang pagpupuno sa lugar na ito na ginagamitan ng lihim na susi ay lilikha ng pakaing RSS para sa iyong talaan ng mga binabantayan. Ang sinumang nakakaalam ng susi sa loob ng lugar na ito ay makababasa ng iyong talaan ng mga binabantayan, kaya't pumili ng ligtas na halaga. Narito ang magagamit mong isang halagang nilikha ng pagkakataon: $1",
'savedprefs' => 'Nasagip na ang mga kagustuhan mo.',
'timezonelegend' => 'Sona ng oras:',
'localtime' => 'Lokal na oras:',
@@ -1313,7 +1306,6 @@ Subuking lagyan ng unlapi/paunang ''all:'' upang hanapin ang lahat ng mga nialal
'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:',
-'prefs-textboxsize' => 'Sukat ng bintana ng pagbabago',
'youremail' => 'E-liham:',
'username' => '{{GENDER:$1|Bansag}}:',
'uid' => 'ID ng {{GENDER:$1|tagagamit}}:',
@@ -1560,7 +1552,6 @@ Kung pipiliin mong ibigay ito, gagamitin ito para mabigyan ka ng pagkilala para
'recentchangeslinked-feed' => 'Kaugnay na mga pagbabago',
'recentchangeslinked-toolbox' => 'Kaugnay na mga pagbabago',
'recentchangeslinked-title' => 'Mga pagbabagong kaugnay ng "$1"',
-'recentchangeslinked-noresult' => 'Walang mga pagbabago sa mga pahinang nakakawing sa ibinigay na kapanahunan.',
'recentchangeslinked-summary' => "Nililista ng natatanging pahina na ito ang huling mga pagbabago na nakaugnay. Naka '''matapang na teksto''' ang iyong mga binabantayan.",
'recentchangeslinked-page' => 'Pangalan ng pahina:',
'recentchangeslinked-to' => 'Ipakita ang mga pagbabago sa mga pahinang nakaugnay sa isang binigay na pahina sa halip',
@@ -1798,7 +1789,6 @@ Para sa pinakamatatag na kaligtasan, hindi pinagana ang img_auth.php.',
'http-read-error' => 'Kamalian sa pagbasa ng HTTP.',
'http-timed-out' => 'Huminto ang kahilingang HTTP.',
'http-curl-error' => 'Kamalian sa pagsalok ng URL: $1',
-'http-host-unreachable' => 'Hindi marating ang URL.',
'http-bad-status' => 'Nagkaroon ng suliranin habang hinihiling ang HTTP na: $1 $2',
# Some likely curl errors. More could be added from <http://curl.haxx.se/libcurl/c/libcurl-errors.html>
@@ -1951,12 +1941,6 @@ Marahil ay naisa mong baguhin ang paglalarawan doon sa [$2 pahina ng paglalarawa
'statistics-users-active-desc' => 'Mga tagagamit na nagsagawa ng isang galaw/gawain sa huling {{PLURAL:$1|araw|$1 mga araw}}',
'statistics-mostpopular' => 'Mga pinakarinarayong pahina',
-'disambiguations' => 'Mga pahinang nakakawing sa mga pahina ng paglilinaw',
-'disambiguationspage' => 'Template:disambig',
-'disambiguations-text' => "Ang sumusunod na mga pahina ay naglalaman ng kahit na isang kawing na papunta sa isang '''pahina ng paglilinaw'''.
-Sa halip, maaaring kailanganing kumawing ang mga ito sa isang mas naaangkop na pahina.<br />
-Ang isang pahina ay itinuturing bilang pahina ng paglilinaw kung gumagamit ito ng isang suleras na nakakawing magmula sa [[MediaWiki:Disambiguationspage|MediaWiki:Pahina ng mga paglilinaw]].",
-
'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 <del>inekisan</del>.',
@@ -2206,10 +2190,9 @@ Makikita doon ang lahat ng mga susunod na pagbabago sa pahinang ito pati na ang
'unwatchthispage' => 'Tigil Bantay',
'notanarticle' => 'Hindi isang nilalamang pahina',
'notvisiblerev' => 'Nabura na ang pagbabago',
-'watchnochange' => 'Wala sa binabantayan mo ang binago sa oras na nakikita.',
'watchlist-details' => '{{PLURAL:$1|$1 pahinang|$1 mga pahinang}} nasa iyong talaan ng mga binabantayan, hindi binibilang ang mga pahina ng usapan.',
-'wlheader-enotif' => '* Umiiral ang pagpapahayag sa pamamagitan ng e-liham.',
-'wlheader-showupdated' => "* Ipinapakitang may '''makakapal na mga panitik''' ang nabagong/binagong mga pahina mula pa noong huli mong pagdalaw sa kanila",
+'wlheader-enotif' => 'Umiiral ang pagpapahayag sa pamamagitan ng e-liham.',
+'wlheader-showupdated' => "Ipinapakitang may '''makakapal na mga panitik''' ang nabagong/binagong mga pahina mula pa noong huli mong pagdalaw sa kanila",
'watchmethod-recent' => 'sinusuri ang kamakailan lamang na mga pagbabago para sa binabantayang mga pahina',
'watchmethod-list' => 'sinusuri ang binabantayang mga pahina para sa mga kamakailan lamang na mga pagbabago',
'watchlistcontains' => 'Naglalaman ng $1 {{PLURAL:$1|pahina|mga pahina}} ang iyong talaan ng mga binabantayan.',
@@ -2608,11 +2591,8 @@ Tingnan ang [[Special:BlockList|talaan ng pagharang]] para sa lista ng kasalukuy
'ipb_blocked_as_range' => 'Mali: Hindi diretsong nakaharang ang IP na $1 at hindi maaaring tanggalin sa pagkakaharang. Bagaman, bahagi ito sa sakop na $2, na maaaring tanggalin sa pagkaharang.',
'ip_range_invalid' => 'Hindi tamang sakop ng IP.',
'ip_range_toolarge' => 'Hindi pinapayagan ang mga saklaw ng pagharang na mas malaki kaysa /$1.',
-'blockme' => 'Harangin ako',
'proxyblocker' => 'Pangharang ng proxy',
-'proxyblocker-disabled' => 'Nakapatay ang pagharang sa proxy.',
'proxyblockreason' => 'Hinarang ang IP address mo dahil bukas na proxy ito. Makipag-ugnayan sa iyong tagabigay ng serbisyong Internet o suportang teknikal at ipaalam sa kanila itong seryesong suliranin sa seguridad.',
-'proxyblocksuccess' => 'Tapos na.',
'sorbs' => 'DNSBL',
'sorbsreason' => 'Nakalista ang IP address mo bilang isang bukas na proxy sa DNSBL na ginagamit ng sayt na ito.',
'sorbs_create_account_reason' => 'Nakalista ang IP address mo bilang isang bukas na proxy sa DNSBL na ginagamit ng sayt na ito. Hindi ka makakalikha ng akawnt',
@@ -2927,17 +2907,11 @@ Maaari mong tingnan ang batayan nito.',
# Stylesheets
'common.css' => '/* Ang inilagay na CSS dito ay gagamitin para sa lahat ng mga pabalat */',
-'standard.css' => '/* Ang inilagay na CSS dito ay makakaapekto sa mga tagagamit ng Karaniwang pabalat */',
-'nostalgia.css' => '/* Ang CSS na inilagay dito ay makakaapekto sa mga tagagamit ng pabalat na Nostalgia */',
'cologneblue.css' => "/* Ang Cascading Style Sheets na inilagay dito ay makakaapekto sa mga tagagamit ng pabalat na Bughaw na Kolown (''Cologne Blue'') */",
'monobook.css' => '/* Ang CSS na inilagay dito ay makakaapekto sa mga tagagamit ng pabalat na Monobook */',
-'myskin.css' => "/* Ang CSS na inilagay dito ay makakaapekto sa lahat ng mga tagagamit ng pabalat na Balatko (''MySkin'') */",
-'chick.css' => "/* Ang CSS na inilagay dito ay makakaapekto sa mga tagagamit ng pabalat na ''Chick'' */",
-'simple.css' => "/* Ang CSS na iniligay dito ay makakaapekto sa mga tagagamit ng Payak (''Simple'') na pabalat */",
'modern.css' => "/* Ang CSS na iniligay dito ay makakaapekto sa tagagamit ng Makabagong (''Modern'') pabalat */",
'vector.css' => '/* Ang inilagay na CSS dito ay makakaapekto sa mga tagagamit ng pabalat na Vector */',
'print.css' => '/* Ang CSS na inilagay dito ay makakaapekto sa kalalabasan o resulta ng paglilimbag */',
-'handheld.css' => "/* Ang CSS na inilagay dito ay makakaapekto sa mga aparatong nahahawakan (''handheld device'') batay sa itinakdang pabalat sa ''\$wgHandheldStyle'' */",
'noscript.css' => '/* Ang inilagay na Cascading Style Sheets dito ay makakaapekto sa mga tagagamit na hindi nagpapagana ng JavaScript */',
'group-autoconfirmed.css' => '/* Ang inilagay na Mga Pilas ng Estilong Lumalagaslas (Cascading Style Sheets o CSS) dito ay makakaapekto lamang sa mga tagagamit na kusang natiyak */',
'group-bot.css' => '/* Ang inilagay na Mga Pilas ng Estilong Lumalagaslas (Cascading Style Sheets o CSS) dito ay makakaapekto lamang sa mga bot */',
@@ -2946,13 +2920,8 @@ Maaari mong tingnan ang batayan nito.',
# Scripts
'common.js' => '/* Ang anumang JavaScript dito ay ikakarga para sa lahat ng mga tagagamit ng bawat pahinang ikinarga. */',
-'standard.js' => '/* Ang anumang JavaScript dito ay ikakarga para sa mga tagagamit na gumagamit ng Karaniwang pabalat */',
-'nostalgia.js' => '/* Ang anumang JavaScript dito ay ikakarga para sa mga tagagamit na gumagamit ng pabalat na Nostalgia */',
'cologneblue.js' => '/* Ang anumang JavaScript dito ay ikakarga para sa mga tagagamit ng pabalat na Cologne Blue o Bughaw na Kolown */',
'monobook.js' => '/* Ang anumang JavaScript dito ay ikakarga para sa mga tagagamit na gumagamit ng pabalat na MonoBook */',
-'myskin.js' => '/* Ang anumang JavaScript dito ay ikakarga para sa tagagamit na gumagamit ng pabalat na MySkin o Balat Ko */',
-'chick.js' => '/* Ang anumang JavaScript dito ay ikakarga para sa mga tagagamit na gumagamit ng pabalat na Chick */',
-'simple.js' => '/* Ang anumang JavaScript dito ay ikakarga para sa mga tagagamit na gumagamit ng Payak na pabalat */',
'modern.js' => '/* Ang anumang JavaScript dito ay ikakarga para sa mga tagagamit na gumagamit ng Modernong pabalat */',
'vector.js' => '/* Ang anumang JavaScript dito ay ikakarga para sa mga tagagamit na gumagamit ng pabalat na Vector */',
'group-autoconfirmed.js' => '/* Ang anumang JavaScript dito ay ikakarga para sa mga tagagamit na kusang natiyak lamang */',
@@ -3018,13 +2987,8 @@ Maaaring dahil ito sa isang kawing sa isang nakatalang hinarang dahil di-kinaisn
'pageinfo-templates' => '{{PLURAL:$1|Suleras|Mga suleras}} ($1) na nasa transklusyon (kasama sa maraming mga lugar)',
# Skin names
-'skinname-standard' => 'Klasiko',
-'skinname-nostalgia' => 'Nostalhiya',
'skinname-cologneblue' => 'Bughaw na Kolown',
'skinname-monobook' => 'MonoAklat ("isang aklat")',
-'skinname-myskin' => 'PabalatKo',
-'skinname-chick' => "\"Pambabae\" (''Chick'')",
-'skinname-simple' => 'Payak',
'skinname-modern' => 'Makabago (Moderno)',
'skinname-vector' => 'Vector',
@@ -3192,7 +3156,7 @@ Likas na nakatakdang itago ang iba pa.
'metadata-langitem' => "'''$2:''' $1",
'metadata-langitem-default' => '$1',
-# EXIF tags
+# Exif tags
'exif-imagewidth' => 'Lapad',
'exif-imagelength' => 'Taas',
'exif-bitspersample' => 'Mga bit (piraso) ng bawat komponente (bahagi)',
@@ -3385,7 +3349,7 @@ $4, $5, $6 $7
$8',
'exif-subjectnewscode-value' => '$2 ($1)',
-# EXIF attributes
+# Exif attributes
'exif-compression-1' => 'Walang kompresyon',
'exif-compression-2' => 'CCITT Pangkat 3 1-kodigo sa haba ng pagtakbo ng Pangdimensiyong Huffman na May Bahagyang Pagbabago',
'exif-compression-3' => 'Kodigo ng Pangkat 3 ng CCITT',
@@ -3725,7 +3689,6 @@ Pakitiyak kung ibig mo talagang likhain muli ang pahinang ito.",
'semicolon-separator' => ';&#32;',
'comma-separator' => ',&#32;',
'colon-separator' => ':&#32;',
-'autocomment-prefix' => '-&#32;',
'pipe-separator' => '&#32;|&#32;',
'word-separator' => '&#32;',
'ellipsis' => '...',
@@ -3896,7 +3859,6 @@ Maaari mo ring [[Special:EditWatchlist|gamitin ang pangkaraniwang pampatnugot]].
'version-other' => 'Iba pa',
'version-mediahandlers' => 'Mga tagahawak/tagapamahala ng midya',
'version-hooks' => 'Mga pangkawit',
-'version-extension-functions' => 'Mga tungkuling pangkarugtong',
'version-parser-extensiontags' => "Mga tatak ng banghay (''parser'')",
'version-parser-function-hooks' => "Mga pangkawit ng/sa tungkuling pambanghay (''parser'')",
'version-hook-name' => 'Pangalan ng pangkawit',
@@ -3918,13 +3880,6 @@ Dapat na nakatanggap ka ng [{{SERVER}}{{SCRIPTPATH}}/COPYING isang sipi ng Pangk
'version-entrypoints-articlepath' => '[https://www.mediawiki.org/wiki/Manual:$wgArticlePath Landas ng artikulo]',
'version-entrypoints-scriptpath' => '[https://www.mediawiki.org/wiki/Manual:$wgScriptPath Landas ng panitik]',
-# Special:FilePath
-'filepath' => 'Lokasyon ng talaksan (file path)',
-'filepath-page' => 'Talaksan:',
-'filepath-submit' => 'Gawin',
-'filepath-summary' => 'Ibinabalik ng natatanging pahinang ito ang buong landas para sa isang talaksan.
-Ipinapakita ang mga larawan sa buong kalinawan, tuwirang sinisimulan ang ibang uri ng mga talaksan sa pamamagitan ng kaugnay nilang mga programa.',
-
# Special:FileDuplicateSearch
'fileduplicatesearch' => 'Maghanap ng kaparehong mga talaksan',
'fileduplicatesearch-summary' => "Maghanap ng mga kaparehong mga talaksan sa baba ng kanyang halaga ng ''hash''.",
diff --git a/languages/messages/MessagesTly.php b/languages/messages/MessagesTly.php
index 0e51ca55..5e73c119 100644
--- a/languages/messages/MessagesTly.php
+++ b/languages/messages/MessagesTly.php
@@ -340,7 +340,7 @@ $messages = array(
'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).
+# 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).
'aboutsite' => 'Təsvir {{SITENAME}}',
'aboutpage' => 'Project: ТәÑвир',
'copyrightpage' => '{{ns:project}}:Мыәллифә һуғуғ',
@@ -349,7 +349,6 @@ $messages = array(
'disclaimers' => 'Çe məsuliyyətiku imtino.',
'disclaimerpage' => 'Project:Дејни бә гиј ныгәтеј',
'edithelp' => 'Ðрајиш бо редактә кардеј',
-'edithelppage' => 'Help:Ðрајиш бо ÑәроÑÑ‚ кардеј',
'helppage' => 'Help:Мындәриҹот',
'mainpage' => 'ÆsosÉ™ sÉ™hifÉ™',
'mainpage-description' => 'Ó˜ÑоÑÓ™ Ñәһифә',
@@ -591,7 +590,6 @@ $messages = array(
'searchmenu-legend' => 'Бо нәве кукон',
'searchmenu-exists' => "'''Бы вики-нәхшәдә һеÑте Ñәһифә «[[:$1]]»'''",
'searchmenu-new' => "'''Сәһифә офәјеј «[[:$1]]» бә ым вики-нахшәдә!'''",
-'searchhelp-url' => 'Help:Мындәриҹот',
'searchprofile-articles' => 'Ó˜ÑоÑÓ™ Ñәһифон',
'searchprofile-project' => 'Че араијшон ијән нахшон Ñәһифон',
'searchprofile-images' => 'Мултимедијә',
@@ -691,7 +689,6 @@ $messages = array(
'recentchangeslinked' => 'Ðнгыл кардә быә дәгишон',
'recentchangeslinked-toolbox' => 'Ðнгыл кардә быә дәгишон',
'recentchangeslinked-title' => 'Ðнгыл кардә быә дәгишон бо "$1"',
-'recentchangeslinked-noresult' => 'Ðишо доә быә мыддәтәдә, ангыл кардә быә Ñәһифонәдә дәгишон бәнин.',
'recentchangeslinked-summary' => "Бә ым Ñәһифонәдә охонә дәгишон Ñијоһије, бә кон Ñәһифон Ñәбон вардә ын Ñәһифә (јаанки дахыл кардә быән бә нишо доә быә категоријә).
[[Special:Watchlist|Шымә ноғо доә Ñијоһиәдә]] быә Ñәһифон, де '''ғалинә''' шрифти нишо доә быән.",
'recentchangeslinked-page' => 'Сәһифә ном:',
@@ -745,8 +742,6 @@ $messages = array(
# Statistics
'statistics' => 'СтатиÑтика',
-'disambiguationspage' => 'Template:дәгиг кардеј',
-
# Miscellaneous special pages
'nbytes' => '$1 {{PLURAL:$1|бајт|бајтон}}',
'nmembers' => '$1 {{PLURAL:$1|узв|узвон}}',
@@ -993,7 +988,7 @@ $messages = array(
* gpslongitude
* gpsaltitude',
-# EXIF tags
+# Exif tags
'exif-imagewidth' => 'Һовужи',
'exif-imagelength' => 'Былынди',
'exif-source' => 'Сәвон',
@@ -1030,10 +1025,6 @@ $messages = array(
'version-specialpages' => 'ХыÑуÑијә Ñәһифон',
'version-entrypoints-header-url' => 'URL',
-# Special:FilePath
-'filepath-page' => 'Фајл:',
-'filepath-submit' => 'Давард',
-
# Special:FileDuplicateSearch
'fileduplicatesearch-submit' => 'Ðәве',
diff --git a/languages/messages/MessagesTn.php b/languages/messages/MessagesTn.php
index 14ac27e8..cebf739e 100644
--- a/languages/messages/MessagesTn.php
+++ b/languages/messages/MessagesTn.php
@@ -88,6 +88,9 @@ $messages = array(
'viewsource' => 'Lebelela motswedi',
# Login and logout pages
+'welcomecreation' => '== Amogelesega, $1! ==
+
+O ipuletse akhaonte. O seka wa lebala go fetola tse o di dikgatlhegelo tsa gago tsa {{SITENAME}}.',
'yourname' => 'Leina la modirisi:',
'yourpassword' => 'Selotlolo sa sephiri:',
'yourpasswordagain' => 'Kwala selotlolo sa gago sa sephiri gape:',
diff --git a/languages/messages/MessagesTo.php b/languages/messages/MessagesTo.php
index 6f85d0f6..13293712 100644
--- a/languages/messages/MessagesTo.php
+++ b/languages/messages/MessagesTo.php
@@ -169,7 +169,7 @@ $messages = array(
'jumptonavigation' => 'ʻai taumuʻa',
'jumptosearch' => 'kumi',
-# 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).
+# 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).
'aboutsite' => 'Kau ki: {{SITENAME}}',
'aboutpage' => 'Project:ʻo kau ki',
'currentevents' => 'Ngaahi ongoongo',
@@ -254,7 +254,6 @@ Eke: $2",
'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 [//translatewiki.net/wiki/Main_Page?setlang=en translatewiki.net], the MediaWiki localisation project.",
-'sqlhidden' => '(ʻOku toi ʻa e fehuʻi SQL)',
'namespaceprotected' => "Ê»Oku Ê»ikai ngofua ke ke fatu Ê»a e ngaahi kupu Ê»i he vÄ hingoa '''$1'''.",
# Login and logout pages
@@ -628,10 +627,6 @@ Ko e ʻuhinga loka ko e $1 ia.",
'statistics-header-users' => 'Sitesitesika ʻo e ʻetita',
'statistics-mostpopular' => 'Ko e ngaahi peesi naʻe vakai ki ai lahi taha',
-'disambiguations' => 'Peesi fakaʻuhingakehe',
-'disambiguationspage' => 'Template:Fakaʻuhingakehe',
-'disambiguations-text' => "Ê»Oku Ê»i ai haÊ»anau fehokotaki ki ha '''Peesi fakaÊ»uhingakehe''' maÊ»a e ngaahi kupu Ê»oku Ê»asi Ê»i lalo. Ê»E taau Ê»o Ê»enau fehokotaki ki he kupu totonu. Ê»Oku kau Ê»a e kupu ki he peesi fakaÊ»uhingakehe kapau Ê»oku ngÄueÊ»aki ha sÄ«pinga Ê»oku Ê»asi Ê»i he [[MediaWiki:Disambiguationspage]].",
-
'doubleredirects' => 'Ngaahi leʻeleʻei',
'doubleredirectstext' => 'ʻOku ʻasi ʻi he ʻotu kotoa pē ha ongo fehokotaki ki he leʻei, mo e leʻeleʻei, mo e kamataʻanga ʻo e leʻeleʻei, taimi ʻe niʻihi ko e peesi totonu ia, ʻoku taau ʻe tuhu ki ai ʻe he leʻei.',
@@ -761,7 +756,6 @@ Kapau ʻaho ʻe taha, te ke fietoʻo ʻa e pēsí mei hoʻo hokohoko leʻo, lomi
'watchthispage' => 'Leʻo he pēsí ni',
'unwatch' => 'Taʻeleʻo',
'unwatchthispage' => 'Tuʻu he leʻo',
-'watchnochange' => 'ʻOku ʻikai ʻaupito ʻe fatuʻi hoʻo ngaahi kupu fakaleʻo lolotonga ha taimi ʻoku ʻasi mai.',
'watchlist-details' => 'ʻOku leʻoʻi ʻa e peesi ʻe $1, ʻikai kau ki ai ʻa e ngaahi peesi alea.',
'wlheader-enotif' => 'Kuo fakamafeiaʻi tala mei he tohila',
'wlheader-showupdated' => '*Ko e ngaahi peesi kuo liliu talu he taimi hoʻo ʻaʻahi ki ai, ʻoku ʻasi mai fakasinolahi',
@@ -896,7 +890,6 @@ Vakai ki he [[Special:Log/delete|hokohoko tÄmateÊ»i]] ki he lekooti Ê»o e ngaah
'ipb_already_blocked' => 'Kuo ʻosi taʻofi ʻa e "$1"',
'ipb_cant_unblock' => 'Hala: naʻe ʻikai ʻilo ko e taʻofi fika $1. Mahalo pē kuo ʻosi ʻene taʻetaʻofi.',
'ip_range_invalid' => 'Ê»Oku taÊ»eÊ»aonga Ê»a e fakavÄ IP',
-'proxyblocksuccess' => 'Kuo fai.',
# Developer tools
'lockdb' => 'LokaÊ»i Ê»a e tÄnekingaÊ»ilo',
@@ -1043,7 +1036,7 @@ Pea hoko ai pÄ“ hoÊ»o lava tÄnaki ha Ê»uhinga Ê»i he fakanounou',
'metadata-expand' => 'Fano kiʻi meʻa',
'metadata-collapse' => 'Holo kiʻi meʻa',
-# EXIF tags
+# Exif tags
'exif-xresolution' => 'Auiiki fakalava',
'exif-yresolution' => 'Auiiki tuʻutonu',
'exif-jpeginterchangeformatlength' => 'ʻŪ valu meʻaʻilo JPEG',
@@ -1221,11 +1214,6 @@ KÄtaki fakapapauÊ»i te ke fie toe fatu Ê»a e kupu ni.",
# Special:Version
'version' => 'Paaki',
-# Special:FilePath
-'filepath' => 'Hala ki he faile',
-'filepath-page' => 'Faile:',
-'filepath-submit' => 'Ko e hala',
-
# Special:SpecialPages
'specialpages' => 'Ngaahi peesi makehe',
diff --git a/languages/messages/MessagesTpi.php b/languages/messages/MessagesTpi.php
index 55dd51a4..3906b888 100644
--- a/languages/messages/MessagesTpi.php
+++ b/languages/messages/MessagesTpi.php
@@ -80,9 +80,6 @@ $messages = array(
'tog-shownumberswatching' => 'Soim hamas yusa i lukautim pes',
'tog-oldsig' => 'Olsem wanem yu raitim nem nau',
'tog-fancysig' => 'Dispela rot yu raitim long nem stap wikitext (i no gat otomatik link)',
-'tog-externaleditor' => 'Yusim long ausait edita oltaim (tasol long man bilong save, i nidim sipesol setap antap long komputa bilong yu. [//www.mediawiki.org/wiki/Manual:External_editors Lukim moa infomesen.])',
-'tog-externaldiff' => 'Yusim long ausait diff oltaim (tasol long man bilong save, i nidim sipesol setap antap long komputa bilong yu. [//www.mediawiki.org/wiki/Manual:External_editors Lukim moa infomesen.])',
-'tog-showjumplinks' => ' Setap ol "Go stret long" links bilong helpim',
'tog-uselivepreview' => 'Soim ol senis kwiktaim taim mi wokim (i nidim Javascript)',
'tog-forceeditsummary' => 'Tokim mi long wanem taim raitim mi nating long liklik toksave bilong senis',
'tog-watchlisthideown' => 'Haitim ol senis mi wokim long lukautbuk bilong mi',
@@ -236,7 +233,7 @@ $messages = array(
'jumptonavigation' => 'ol bikpela pes',
'jumptosearch' => 'painim',
-# 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).
+# 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).
'aboutsite' => 'Long {{SITENAME}}',
'aboutpage' => 'Project:Long',
'copyrightpage' => '{{ns:project}}:Ol laisens',
@@ -245,7 +242,6 @@ $messages = array(
'disclaimers' => 'Ol toksave bilong lo',
'disclaimerpage' => 'Project:Ol tok warn long lo',
'edithelp' => 'Halivim mi long pasin bilong wokim senis',
-'edithelppage' => 'Help:Senisim',
'mainpage' => 'Fran Pes',
'mainpage-description' => 'Fran Pes',
'portal' => 'Bung ples',
@@ -397,9 +393,6 @@ Na tu yu tok tru nau olsem yu raitim dispela yu yet, o yu kisim long wanpela hap
'powersearch-toggleall' => 'Olgeta',
'powersearch-togglenone' => 'I nogat wanpela',
-# Quickbar
-'qbsettings-none' => 'I nogat wanpela',
-
# Preferences page
'preferences' => 'Ol laik',
'mypreferences' => 'Ol laik bilong mi',
@@ -643,7 +636,7 @@ Sapos yu laik rausim dispela pes long lukautbuk bilong yu bihain, paitim \"Pinis
'unwatch' => 'Pinis long lukautim',
'unwatchthispage' => 'Pinis long lukautim',
'watchlist-details' => '$1 pes istap long lukautbuk (dispela namba i no kaunim ol pes bilong toktok).',
-'wlheader-showupdated' => "* Ol pes i senis pinis bihain long taim yu lukim ol igat nem i '''strongpela'''",
+'wlheader-showupdated' => "Ol pes i senis pinis bihain long taim yu lukim ol igat nem i '''strongpela'''",
'wlshowlast' => 'Lukim dispela $1 aua $2 de $3',
'watchlist-options' => 'Ol laik bilong Lukautbuk',
@@ -805,7 +798,7 @@ Yu inap lukim as tok bilong em',
# Metadata
'metadata' => 'Metadata',
-# EXIF tags
+# Exif tags
'exif-imagedescription' => 'Nem bilong piksa',
'exif-meteringmode-255' => 'Narapela',
@@ -858,10 +851,6 @@ Yu inap lukim as tok bilong em',
'version-license' => 'Laisens',
'version-poweredby-others' => 'ol narapela',
-# Special:FilePath
-'filepath-page' => 'Fail:',
-'filepath-submit' => 'Go',
-
# Special:FileDuplicateSearch
'fileduplicatesearch-filename' => 'Nem bilong fail:',
'fileduplicatesearch-submit' => 'Painim',
diff --git a/languages/messages/MessagesTr.php b/languages/messages/MessagesTr.php
index 952005df..a32169b0 100644
--- a/languages/messages/MessagesTr.php
+++ b/languages/messages/MessagesTr.php
@@ -13,6 +13,7 @@
* @author Bilalokms
* @author Bombola
* @author Cekli829
+ * @author Coolland
* @author Dbl2010
* @author Don Alessandro
* @author Emperyan
@@ -21,6 +22,7 @@
* @author Fryed-peach
* @author Geitost
* @author Goktr001
+ * @author Gorizon
* @author Hanberke
* @author Hcagri
* @author Hedda Gabler
@@ -34,11 +36,13 @@
* @author LuCKY
* @author Mach
* @author Manco Capac
+ * @author Meelo
* @author Metal Militia
* @author Mirzali
* @author Mskyrider
* @author Myildirim2007
* @author Nazif Ä°LBEK
+ * @author Nemo bis
* @author Rapsar
* @author Reedy
* @author Runningfridgesrule
@@ -379,9 +383,6 @@ $messages = array(
'tog-shownumberswatching' => 'İzleyen kullanıcı sayısını göster',
'tog-oldsig' => 'Mevcut imza:',
'tog-fancysig' => 'İmzaya vikimetin muamelesi yap (otomatik bir bağlantı olmadan)',
-'tog-externaleditor' => 'Varsayılan olarak harici düzenleyici kullan (deneyimli kullanıcılar içindir ve bilgisayarınızda özel ayarlar gerektirir. [//www.mediawiki.org/wiki/Manual:External_editors Ayrıntılı bilgi için tıklayın.])',
-'tog-externaldiff' => 'Varsayılan olarak harici karşılaştırıcı kullan (deneyimli kullanıcılar içindir ve bilgisayarınızda özel ayarlar gerektirir. [//www.mediawiki.org/wiki/Manual:External_editors Ayrıntılı bilgi için tıklayın.])',
-'tog-showjumplinks' => '"{{int:jumpto}}" erişilebilirlik bağlantısı etkinleştir',
'tog-uselivepreview' => 'Canlı önizlemeyi kullan (deneysel)',
'tog-forceeditsummary' => 'Özeti boş bıraktığımda beni uyar',
'tog-watchlisthideown' => 'İzleme listemden düzenlemelerimi gizle',
@@ -395,6 +396,8 @@ $messages = array(
'tog-showhiddencats' => 'Gizli kategorileri göster',
'tog-noconvertlink' => 'Bağlantı başlığı dönüştürmesini devre dışı bırakma',
'tog-norollbackdiff' => 'Geridönüş uygulandıktan sonra değişikliği atla',
+'tog-useeditwarning' => 'Kaydedilmemiş değişikliğe sahip bir değişiklik sayfasından çıkarken beni uyar',
+'tog-prefershttps' => 'Oturumu açarken her zaman güvenli bağlantı kullan',
'underline-always' => 'Daima',
'underline-never' => 'Asla',
@@ -458,6 +461,18 @@ $messages = array(
'oct' => 'Eki',
'nov' => 'Kas',
'dec' => 'Ara',
+'january-date' => '$1 Ocak',
+'february-date' => '$1 Åžubat',
+'march-date' => '$1 Mart',
+'april-date' => '$1 Nisan',
+'may-date' => '$1 Mayıs',
+'june-date' => '$1 Haziran',
+'july-date' => '$1 Temmuz',
+'august-date' => '$1 AÄŸustos',
+'september-date' => '$1 Eylül',
+'october-date' => '$1 Ekim',
+'november-date' => '$1 Kasım',
+'december-date' => '$1 Aralık',
# Categories related messages
'pagecategories' => '{{PLURAL:$1|Kategori|Kategoriler}}',
@@ -539,6 +554,7 @@ $messages = array(
'create-this-page' => 'Bu sayfayı oluştur',
'delete' => 'Sil',
'deletethispage' => 'Bu sayfayı sil',
+'undeletethispage' => 'Bu sayfanın silme işlemini geri al',
'undelete_short' => '$1 deÄŸiÅŸikliÄŸi geri getir',
'viewdeleted_short' => '{{PLURAL:$1|bir silinmiş değişiklik|$1 silinmiş değişiklikleri}} görüntüle.',
'protect' => 'Korumaya al',
@@ -582,7 +598,7 @@ $1',
'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).
+# 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).
'aboutsite' => '{{SITENAME}} hakkında',
'aboutpage' => 'Project:Hakkında',
'copyright' => 'Aksi belirtilmedikçe içerik $1 altındadır.',
@@ -592,7 +608,6 @@ $1',
'disclaimers' => 'Sorumluluk reddi',
'disclaimerpage' => 'Project:Genel sorumluluk reddi',
'edithelp' => 'Nasıl değiştirilir?',
-'edithelppage' => 'Help:Sayfa nasıl değiştirilir',
'helppage' => 'Help:İçindekiler',
'mainpage' => 'Ana Sayfa',
'mainpage-description' => 'Ana sayfa',
@@ -670,16 +685,12 @@ Bu, {{SITENAME}} sitesindeki bir hatayı da belirtebilir.",
# General errors
'error' => 'Hata',
'databaseerror' => 'Veritabanı hatası',
-'dberrortext' => 'Bir veritabanı sorgusu sözdizimi hatası oluştu.
-Bu yazılımdaki bir hatadan kaynaklanabilir.
-"<tt>$2</tt>" iÅŸlevinden denenen son sorgulama:
-<blockquote><tt>$1</tt></blockquote>.
-Veritabanının rapor ettiği hata "<tt>$3: $4</tt>".',
-'dberrortextcl' => 'Veritabanı sorgu sözdizimi hatası oluştu.
-Son yapılan veritabanı sorgusu:
-"$1"
-Kullanılan fonksiyon "$2".
-Veritabanının verdiği hata mesajı "$3: $4"',
+'databaseerror-text' => 'Bir veritabanı sorgu hatası oluştu.
+Bu yazılım bir hata gösteriyor olabilir.',
+'databaseerror-textcl' => 'Bir veritabanı sorgu hatası oluştu.',
+'databaseerror-query' => 'Sorgu: $1',
+'databaseerror-function' => 'Fonksiyon: $1',
+'databaseerror-error' => 'Hata: $1',
'laggedslavemode' => 'Uyarı: Sayfa son güncellemeleri içermeyebilir.',
'readonly' => 'Veritabanı kilitlendi',
'enterlockreason' => 'Koruma için bir neden belirtin. Korumanın ne zaman kaldırılacağına dair tahmini bir tarih eklemeyi unutmayın.',
@@ -713,6 +724,7 @@ Başka bir kullanıcı tarafından silinmiş olabilir.',
'cannotdelete-title' => '"$1" sayfasını silemezsiniz',
'delete-hook-aborted' => 'Silme işlemi kanca tarafından durduruldu.
Hiçbir açıklama yapılmadı.',
+'no-null-revision' => '"$1" sayfası için yeni boş bir sürüm oluşturulamadı',
'badtitle' => 'Geçersiz başlık',
'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' => 'Aşağıdaki veriler önbellekten alınmıştır ve güncel olmayabilir. Önbellekte en fazla {{PLURAL:$1|bir sonuç|$1 sonuç}} mevcut.',
@@ -731,12 +743,15 @@ Lütfen birkaç dakika sonra yeniden deneyin.',
'viewyourtext' => "Bu sayfaya '''yaptığınız değişikliklerin''' kaynağını görünteleyip kopyalayabilirsiniz:",
'protectedinterface' => "Bu sayfa yazılım için arayüz metni sağlamaktadır ve kötüye kullanımı önlemek için korumaya alınmıştır. Eklemek ya da bütün vikilerdeki çevirileri değiştirmek için lütfen MediaWiki yerelleştirme projesi [//translatewiki.net/ translatewiki.net]'i kullanın.",
'editinginterface' => "'''UYARI:''' Wiki yazılımı için arayüz sağlamakta kullanılan bir sayfayı değiştirmektesiniz. Bu sayfadaki değişiklikler kullanıcı arayüzünü diğer kullanıcılar için de değiştirecektir. Çeviriler için, lütfen [//translatewiki.net/wiki/Main_Page?setlang=tr translatewiki.net]'yi kullanarak MediaWiki yerelleştirme projesini dikkate alınız.",
-'sqlhidden' => '(SQL gizli sorgu)',
'cascadeprotected' => 'Bu sayfa değişiklik yapılması engellenmiştir, çünkü "kademeli" seçeneği aktif hale getirilerek koruma altına alınan {{PLURAL:$1|sayfada|sayfada}} kullanılmaktadır:
$2',
'namespaceprotected' => "'''$1''' alandındaki sayfaları düzenlemeye izniniz bulunmamaktadır.",
'customcssprotected' => 'Bu sayfayı değiştirmeye yetkiniz bulunmamaktadır, çünkü bu sayfa başka bir kullanıcının kişisel ayarlarını içermektedir.',
'customjsprotected' => 'Bu Java Script sayfasını değiştirmeye yetkiniz bulunmamaktadır, çünkü bu sayfa başka bir kullanıcının kişisel ayarlarını içermektedir.',
+'mycustomcssprotected' => 'Bu CSS sayfasını değiştirmeye yetkiniz yok.',
+'mycustomjsprotected' => 'Bu JavaScript sayfasını değiştirmeye yetkiniz yok.',
+'myprivateinfoprotected' => 'Sizin özel bilgilerinizi düzenleme yetkiniz yok.',
+'mypreferencesprotected' => 'Tercihlerinizi düzenlemek için yetkiniz yok.',
'ns-specialprotected' => '{{ns:special}} alanadı içindeki sayfalar değiştirilemez.',
'titleprotected' => "[[User:$1|$1]] tarafından oluşturulması engellenmesi için bu sayfa koruma altına alınmıştır.
Verilen sebep: ''$2''.",
@@ -761,10 +776,19 @@ Tarayıcınızın önbelleğini temizleyinceye kadar bazı sayfalarda, oturumunu
'welcomecreation-msg' => 'Hesabınız açıldı.
[[Special:Preferences|{{SITENAME}} tercihlerinizi]] değiştirmeyi unutmayın.',
'yourname' => 'Kullanıcı adı:',
+'userlogin-yourname' => 'Kullanıcı adı',
+'userlogin-yourname-ph' => 'Kullanıcı adı girin',
+'createacct-another-username-ph' => 'Kullanıcı adınızı girin',
'yourpassword' => 'Parola:',
+'userlogin-yourpassword' => 'Parola',
+'userlogin-yourpassword-ph' => 'Parolanızı girin',
+'createacct-yourpassword-ph' => 'Bir parola girin',
'yourpasswordagain' => 'Parolayı yeniden girin:',
+'createacct-yourpasswordagain' => 'Parolayı onayla',
+'createacct-yourpasswordagain-ph' => 'Parolayı yeniden girin',
'remembermypassword' => 'Girişimi bu tarayıcıda 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",
+'userlogin-remembermypassword' => 'Oturumumu sürekli açık tut',
+'userlogin-signwithsecure' => 'Güvenli bağlantı kullanın',
'yourdomainname' => 'Alan adınız:',
'password-change-forbidden' => 'Bu vikide parolanızı değiştiremezsiniz.',
'externaldberror' => 'Ya doğrulama veritabanı hatası var ya da kullanıcı hesabınızı güncellemeye yetkiniz yok.',
@@ -776,18 +800,41 @@ Tarayıcınızın önbelleğini temizleyinceye kadar bazı sayfalarda, oturumunu
'logout' => 'Oturumu kapat',
'userlogout' => 'Oturumu kapat',
'notloggedin' => 'Oturum açık değil',
+'userlogin-noaccount' => 'Bir hesabınız yok mu?',
+'userlogin-joinproject' => '{{SITENAME}} sitesine katılın',
'nologin' => 'Bir hesabınız yok mu? $1.',
'nologinlink' => 'Hesap oluÅŸturun',
'createaccount' => 'Hesap oluÅŸtur',
'gotaccount' => 'Zaten bir hesabınız var mı? $1.',
'gotaccountlink' => 'Oturum açın',
'userlogin-resetlink' => 'GiriÅŸ bilgilerinizi mi unuttunuz?',
+'userlogin-resetpassword-link' => 'Parolanızı sıfırlayın',
+'helplogin-url' => 'Help:Oturum açma',
+'userlogin-helplink' => '[[{{MediaWiki:helplogin-url}}|Oturum açma konusunda yardım alın]]',
+'createacct-join' => 'Aşağıya bilgilerinizi girin.',
+'createacct-another-join' => 'Aşağıya yeni hesabınızın bilgilerini girin.',
+'createacct-emailrequired' => 'E-posta adresi',
+'createacct-emailoptional' => 'E-posta adresi (isteğe bağlı)',
+'createacct-email-ph' => 'E-posta adresinizi girin',
+'createacct-another-email-ph' => 'E-posta adresinizi girin',
'createaccountmail' => 'Geçici bir rastgele şifre kullanabilir ve bu şifreyi belirtilen e-posta adresine gönderebilirsiniz',
+'createacct-realname' => 'Gerçek adı (isteğe bağlı)',
'createaccountreason' => 'Sebep:',
+'createacct-reason' => 'Gerekçe',
+'createacct-reason-ph' => 'Neden baÅŸka bir hesap oluÅŸturuyorsunuz',
+'createacct-captcha' => 'Güvenlik kontrolü',
+'createacct-imgcaptcha-ph' => 'Yukarıda gördüğünüz metni girin',
+'createacct-submit' => 'Hesabınızı oluşturun',
+'createacct-another-submit' => 'BaÅŸka bir hesap oluÅŸturun',
+'createacct-benefit-heading' => '{{SITENAME}} sizin gibi insanlar tarafından oluşturulur.',
+'createacct-benefit-body1' => '{{PLURAL:$1|düzenleme|düzenleme}}',
+'createacct-benefit-body2' => '{{PLURAL:$1|sayfa|sayfa}}',
+'createacct-benefit-body3' => 'en son {{PLURAL:$1|katkıda bulunan|katkıda bulunan}}',
'badretype' => 'GirdiÄŸiniz ÅŸifreler birbirleriyle uyuÅŸmuyor.',
'userexists' => 'Girdiğiniz kullanıcı adı zaten kullanımda.
Lütfen farklı bir kullanıcı adı seçiniz.',
'loginerror' => 'Oturum açma hatası.',
+'createacct-error' => 'Hesap oluşturma hatası',
'createaccounterror' => 'Hesap oluşturulamıyor: $1',
'nocookiesnew' => 'Kullanıcı hesabı oluşturuldu ama oturum açamadınız.
Oturum açmak için {{SITENAME}} çerezleri kullanır.
@@ -843,11 +890,13 @@ Siteye giriş yapmalı ve parolanızı değiştirmelisiniz.
Eğer kullanıcı hesabını yanlışlıkla oluşturmuş iseniz, bu mesajı yoksayabilirsiniz.',
'usernamehasherror' => 'Kullanıcı adı karma karakterler içeremez',
-'login-throttled' => 'Yakın zamanda çok fazla oturum açma denemesinde bulundunuz.
-Lütfen tekrar denemeden önce bekleyin.',
+'login-throttled' => 'Çok fazla yeni oturum açma girişiminde bulundunuz.
+Devam etmeden önce $1 bekleyin.',
'login-abort-generic' => 'Girişiniz başarısız - iptal edilmiş',
'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.',
+'createacct-another-realname-tip' => 'Gerçek adınız isteğe bağlıdır.
+Eğer gerçek adınızı belirtirseniz, çalışmalarınıza atıfta bulunulması için de kullanılacaktır.',
# Email sending
'php-mail-error-unknown' => "PHP's mail() fonksiyonunda bilinmeyen hata",
@@ -864,8 +913,7 @@ Girişi bitirmek için, burada yeni bir parola yazın:',
'newpassword' => 'Yeni parola',
'retypenew' => 'Yeni parolayı tekrar girin',
'resetpass_submit' => 'Şifreyi ayarlayın ve oturum açın',
-'resetpass_success' => 'Parolanız başarıyla değiştirildi!
-Şimdi oturumunuz açılıyor...',
+'changepassword-success' => 'Parolanız başarıyla değiştirildi!',
'resetpass_forbidden' => 'Parolalar deÄŸiÅŸtirilememektedir',
'resetpass-no-info' => 'Bu sayfaya doğrudan erişmek için oturum açmanız gereklidir.',
'resetpass-submit-loggedin' => 'Parolayı değiştir',
@@ -877,10 +925,11 @@ Girişi bitirmek için, burada yeni bir parola yazın:',
# Special:PasswordReset
'passwordreset' => 'Parola sıfırlama',
-'passwordreset-text' => 'Hesap bilgilerinizin e-posta ile hatırlatılması için bu formu doldurunuz.',
+'passwordreset-text-one' => 'Parolanızı sıfırlamak için bu formu doldurun.',
+'passwordreset-text-many' => '{{PLURAL:$1|Parolanızı sıfırlamak için alanlardan birini doldurun.}}',
'passwordreset-legend' => 'Şifreyi sıfırla',
'passwordreset-disabled' => 'Parola sıfırlamaları bu wiki üzerinde devre dışı bırakıldı.',
-'passwordreset-pretext' => '{{PLURAL:$1||Aşağıdaki verilerden birini girin}}',
+'passwordreset-emaildisabled' => "Bu wiki'deki e-posta özellikleri devre dışı bırakıldı.",
'passwordreset-username' => 'Kullanıcı adı:',
'passwordreset-domain' => 'Domain:',
'passwordreset-capture' => 'Sonuç e-postasını görüntüle?',
@@ -904,7 +953,7 @@ Bu geçici parola ile giriş yapın ve yeni bir şifre seçin. Bu talep bir baş
Geçici şifre: $2',
'passwordreset-emailsent' => 'Parola sıfırlama e-postası gönderildi.',
'passwordreset-emailsent-capture' => 'Aşağıda gözüktüğü gibi bir parola sıfırlama e-postası gönderildi.',
-'passwordreset-emailerror-capture' => 'Aşağıda gözüktüğü gibi bir hatırlatma e-postası oluşturulmuştur ancak $1 adlı kullanıcıya gönderilememiştir.',
+'passwordreset-emailerror-capture' => 'Aşağıda gözüktüğü gibi bir parola sıfırlama e-postası oluşturuldu ancak {{GENDER:$2|kullanıcıya}} gönderme işlemi başarısız oldu: $1',
# Special:ChangeEmail
'changeemail' => 'E-posta adresini deÄŸiÅŸtir',
@@ -918,6 +967,20 @@ Geçici şifre: $2',
'changeemail-submit' => "E-posta'yı değiştir",
'changeemail-cancel' => 'Ä°ptal',
+# Special:ResetTokens
+'resettokens' => 'Anahtarları sıfırla',
+'resettokens-text' => 'Burada hesabınızla ilişkili bazı özel verilere erişim izin anahtarları sıfırlayabilirsiniz.
+
+
+Siz yanlışlıkla bunları paylaştıysanız veya hesabınızda bir bozulma varsa bunu yapmalısınız.',
+'resettokens-no-tokens' => 'Sıfırlamak için hiç bir belirteç bulunmuyor.',
+'resettokens-legend' => 'Anahtarları sıfırla',
+'resettokens-tokens' => 'Belirteçler:',
+'resettokens-token-label' => '$1 (geçerli değer: $2)',
+'resettokens-watchlist-token' => '[[Special:Watchlist|İzleme listenizdeki sayfa değişiklikleri]] için web beslemeleri (Atom/RSS) anahtarı',
+'resettokens-done' => 'Belirteçler sıfırlandı.',
+'resettokens-resetbutton' => 'Seçili anahtarları sıfırla',
+
# Edit page toolbar
'bold_sample' => 'Kalın yazı',
'bold_tip' => 'Kalın yazı',
@@ -1110,12 +1173,15 @@ Bir açıklama verilmedi.',
Silinmiş görünüyor.',
'edit-conflict' => 'Değişiklik çakışması.',
'edit-no-change' => 'Değişikliğiniz yoksayıldı, çünkü metinde bir değişiklik yapılmadı.',
+'postedit-confirmation' => 'DeÄŸiÅŸikliÄŸiniz kaydedildi.',
'edit-already-exists' => 'Yeni sayfa oluşturulamıyor.
Sayfa zaten mevcut.',
'defaultmessagetext' => 'Varsayılan mesaj metni',
'content-failed-to-parse' => '$1 modeli için $2 içerik türü çözümlenemedi: $3',
'invalid-content-data' => 'Geçersiz içerik verisi',
'content-not-allowed-here' => '"$1" içeriğine, [[$2]] sayfasında izin verilmemekte.',
+'editwarning-warning' => 'Bu sayfadan ayrılmak yaptığınız herhangi bir değişikliği kaybetmenize sebep olabilir.
+Eğer giriş yaptıysanız, bu uyarıyı, tercihlerinizin "Sayfa yazma alanı" bölümünde devre dışı bırakabilirsiniz.',
# Content models
'content-model-wikitext' => 'vikimetin',
@@ -1150,6 +1216,7 @@ Bu değişkenler atlandı.",
'undo-failure' => 'Değişikliklerin çakışması nedeniyle geri alma işlemi başarısız oldu.',
'undo-norev' => 'Değişiklik geri alınamaz çünkü ya silinmiş ya da varolmamaktadır.',
'undo-summary' => '$1 değişikliği [[Special:Contributions/$2|$2]] ([[User talk:$2|mesaj]]) tarafından geri alındı.',
+'undo-summary-username-hidden' => 'Gizli bir kullanıcı tarafından $1 sürümü geri alınıyor',
# Account creation failure
'cantcreateaccounttitle' => 'Hesap açılamıyor',
@@ -1330,6 +1397,7 @@ Gezinti bağlantılarının bu sütunu sıfırlayacağını unutmayın.',
'compareselectedversions' => 'Seçilen sürümleri karşılaştır',
'showhideselectedversions' => 'Seçili sürümleri göster/gizle',
'editundo' => 'geri al',
+'diff-empty' => '(Fark yok)',
'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)',
@@ -1353,7 +1421,6 @@ Gezinti bağlantılarının bu sütunu sıfırlayacağını unutmayın.',
'searchmenu-legend' => 'Arama seçenekleri',
'searchmenu-exists' => "'''Bu vikide \"[[:\$1]]\" adında bir sayfa mevcut'''",
'searchmenu-new' => "'''Bu vikide \"[[:\$1]]\" sayfasını oluştur!'''",
-'searchhelp-url' => 'Help:İçindekiler',
'searchmenu-prefix' => '[[Special:PrefixIndex/$1|Bu ön ekle sayfalara göz at]]',
'searchprofile-articles' => 'İçerik sayfaları',
'searchprofile-project' => 'Yardım ve proje sayfaları',
@@ -1396,15 +1463,6 @@ Aramanızın başına '''all:''' önekini ekleyerek tüm içeriği aramayı (tar
'search-external' => 'Dış arama',
'searchdisabled' => '{{SITENAME}} sitesinde arama yapma geçici olarak durdurulmuştur. Bu arada Google kullanarak {{SITENAME}} içinde arama yapabilirsiniz. Arama sitelerinde dizinlerin biraz eski kalmış olabileceğini göz önünde bulundurunuz.',
-# Quickbar
-'qbsettings' => 'Hızlı erişim sütun ayarları',
-'qbsettings-none' => 'Hiçbiri',
-'qbsettings-fixedleft' => 'Sola sabitlendi',
-'qbsettings-fixedright' => 'SaÄŸa sabitlendi',
-'qbsettings-floatingleft' => 'Sola yaslanıyor',
-'qbsettings-floatingright' => 'Sağa yaslanıyor',
-'qbsettings-directionality' => 'Sabit, dilinizin komut dosyasının yönüne bağlı',
-
# Preferences page
'preferences' => 'Tercihler',
'mypreferences' => 'Tercihler',
@@ -1437,7 +1495,6 @@ Aramanızın başına '''all:''' önekini ekleyerek tüm içeriği aramayı (tar
'resetprefs' => 'Ayarları ilk durumuna getir',
'restoreprefs' => 'Tüm varsayılan ayarları geri yükle',
'prefs-editing' => 'Sayfa yazma alanı',
-'prefs-edit-boxsize' => 'DeÄŸiÅŸtirme penceresinin boyutu.',
'rows' => 'Satır',
'columns' => 'Sütun',
'searchresultshead' => 'Arama',
@@ -1448,9 +1505,7 @@ Aramanızın başına '''all:''' önekini ekleyerek tüm içeriği aramayı (tar
'recentchangesdays-max' => '(en fazla $1 {{PLURAL:$1|gün|gün}})',
'recentchangescount' => 'Varsayılan olarak gösterilecek değişiklik sayısı:',
'prefs-help-recentchangescount' => 'Bu, son değişiklikleri, sayfa geçmişlerini ve günlükleri içerir.',
-'prefs-help-watchlist-token' => 'Bu alanı gizli bir anahtarla doldurmak, izleme listeniz için bir RSS beslemesi oluşturur.
-Bu alandaki anahtarı bilen herkes izleme listenizi okuyabilir, bu yüzden güvenli bir değer seçin.
-Kullanabileceğiniz rastgele-üretilmiş bir değer: $1',
+'prefs-help-watchlist-token2' => 'Bu izleme listenizin gizli anahtarıdır. Anahtarı bilen herkes izleme listenizi görebilir. Bu nedenle kimseyle paylaşmayın. [[Special:ResetTokens|Bu anahtarı sıfırlamak isterseniz buraya tıklayın]].',
'savedprefs' => 'Tercihleriniz kaydedildi.',
'timezonelegend' => 'Zaman dilimi:',
'localtime' => 'Yerel saat:',
@@ -1480,7 +1535,6 @@ Kullanabileceğiniz rastgele-üretilmiş bir değer: $1',
'prefs-common-css-js' => 'Tüm temalar 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:',
'username' => '{{GENDER:$1|Kullanıcı adı}}:',
'uid' => '{{GENDER:$1|Kullanıcı}} kimliği:',
@@ -1497,8 +1551,8 @@ Kullanabileceğiniz rastgele-üretilmiş bir değer: $1',
$1 {{PLURAL:$1|karakterin|karakterin}} altında olmalı.',
'yourgender' => 'Nasıl açıklamayı tercih edersiniz?',
'gender-unknown' => 'Söylemek istemiyorsanız',
-'gender-male' => 'Wiki düzenlemelerinde erkek olarak',
-'gender-female' => 'Wiki düzenlemelerinde kadın olarak',
+'gender-male' => 'Viki sayfalarını erkek olarak düzenliyorum',
+'gender-female' => 'Viki sayfalarını kadın olarak düzenliyorum',
'prefs-help-gender' => 'Bu tercih ayarı isteğe bağlıdır.
Yazılımda söz değerlerinin başlarında bulunan cinsiyete uygun gramerler için kullanılır.
Bu bilgiler herkes tarafından görülebilir.',
@@ -1514,6 +1568,8 @@ Diğer kullanıcılar sizinle bu yolla iletişime geçtiğinde e-posta adresiniz
'prefs-dateformat' => 'Tarih biçemi',
'prefs-timeoffset' => 'Saat farkı',
'prefs-advancedediting' => 'Genel seçenekler',
+'prefs-editor' => 'Editör',
+'prefs-preview' => 'Önizleme',
'prefs-advancedrc' => 'Gelişmiş seçenekler',
'prefs-advancedrendering' => 'Gelişmiş seçenekler',
'prefs-advancedsearchoptions' => 'Gelişmiş seçenekler',
@@ -1521,6 +1577,7 @@ Diğer kullanıcılar sizinle bu yolla iletişime geçtiğinde e-posta adresiniz
'prefs-displayrc' => 'Görüntü seçenekleri',
'prefs-displaysearchoptions' => 'Görüntüleme seçenekleri',
'prefs-displaywatchlist' => 'Görüntüleme seçenekleri',
+'prefs-tokenwatchlist' => 'Anahtar',
'prefs-diffs' => 'Farklar',
# User preference: email validation using jQuery
@@ -1617,6 +1674,7 @@ Diğer kullanıcılar sizinle bu yolla iletişime geçtiğinde e-posta adresiniz
'right-editusercssjs' => 'Diğer kullanıcıların CSS ve JS dosyalarında değişiklik yap',
'right-editusercss' => 'Diğer kullanıcıların CSS dosyalarında değişiklik yap',
'right-edituserjs' => 'Diğer kullanıcıların JS dosyalarında değişiklik yap',
+'right-editmyoptions' => 'tercihlerini düzenle',
'right-rollback' => 'Belirli bir sayfayı değiştiren son kullanıcının değişikliklerini hızlıca geri döndür',
'right-markbotedits' => 'Geri döndürülen değişiklikleri, bot değişiklikleri olarak işaretle',
'right-noratelimit' => 'Derecelendirme sınırlamalarından etkilenme',
@@ -1678,12 +1736,17 @@ Diğer kullanıcılar sizinle bu yolla iletişime geçtiğinde e-posta adresiniz
'action-userrights-interwiki' => 'diğer vikilerde kullanıcıların, kullanıcı haklarını değiştirmeye',
'action-siteadmin' => 'veritabanını kilitleyip açmaya',
'action-sendemail' => 'e-posta gönder',
+'action-editmywatchlist' => 'izleme listeni düzenle',
+'action-viewmywatchlist' => 'izleme listeni gör',
# Recent changes
'nchanges' => '$1 {{PLURAL:$1|deÄŸiÅŸiklik|deÄŸiÅŸiklik}}',
+'enhancedrc-since-last-visit' => '$1 {{PLURAL:$1|son ziyaretten bu yana}}',
+'enhancedrc-history' => 'geçmiş',
'recentchanges' => 'Son deÄŸiÅŸiklikler',
'recentchanges-legend' => 'Son değişiklikler seçenekleri',
'recentchanges-summary' => 'Yapılan en son değişiklikleri bu sayfadan izleyin.',
+'recentchanges-noresult' => 'Belirtilen kriterlere uyan herhangi bir değişiklik bulunamadı.',
'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-label-minor' => 'Bu küçük bir değişiklik',
@@ -1720,7 +1783,6 @@ Diğer kullanıcılar sizinle bu yolla iletişime geçtiğinde e-posta adresiniz
'recentchangeslinked-feed' => 'Ä°lgili deÄŸiÅŸiklikler',
'recentchangeslinked-toolbox' => 'Ä°lgili deÄŸiÅŸiklikler',
'recentchangeslinked-title' => '"$1" ile iliÅŸkili deÄŸiÅŸiklikler',
-'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''' olarak belirtilmiştir.",
'recentchangeslinked-page' => 'Sayfa adı:',
@@ -1732,7 +1794,7 @@ Diğer kullanıcılar sizinle bu yolla iletişime geçtiğinde e-posta adresiniz
'reuploaddesc' => 'Yükleme formuna geri dön.',
'upload-tryagain' => 'Değiştirilmiş dosya açıklamasını gönder',
'uploadnologin' => 'Oturum açık değil',
-'uploadnologintext' => 'Dosya yükleyebilmek için [[Special:UserLogin|oturum aç]]manız gerekiyor.',
+'uploadnologintext' => 'Dosya yükleyebilmek için [[$1|oturum aç]]manız gerekiyor.',
'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ı',
@@ -1930,7 +1992,6 @@ En uygun güvenlik için, img_auth.php devre dışı bırakıldı.",
'http-read-error' => 'HTTP okuma hatası.',
'http-timed-out' => 'HTTP isteği zaman aşımına uğradı.',
'http-curl-error' => 'URL alınırken hata: $1',
-'http-host-unreachable' => "URL'ye ulaşılamıyor.",
'http-bad-status' => 'HTTP isteği sırasında bir sorun oluştu: $1 $2',
# Some likely curl errors. More could be added from <http://curl.haxx.se/libcurl/c/libcurl-errors.html>
@@ -1962,6 +2023,9 @@ Kullanıcı tarafından filtrelendiğinde, sadece o kullanıcı dosyanın en son
'listfiles_size' => 'Boyut (bayt)',
'listfiles_description' => 'Tanım',
'listfiles_count' => 'Sürümler',
+'listfiles-latestversion' => 'Geçerli sürüm',
+'listfiles-latestversion-yes' => 'Evet',
+'listfiles-latestversion-no' => 'Hayır',
# File description page
'file-anchor-link' => 'Dosya',
@@ -2052,6 +2116,11 @@ Dosya açıklamasını düzenlemek isterseniz, [$2 dosya açıklama sayfası] bu
'randompage' => 'Rastgele sayfa',
'randompage-nopages' => 'Şu {{PLURAL:$2|ad alanında|ad alanlarında}} hiç bir sayfa yok: $1.',
+# Random page in category
+'randomincategory' => 'Kategoriye göre rastgele sayfa',
+'randomincategory-selectcategory' => 'Rastgele sayfa alınacak kategori: $1 $2.',
+'randomincategory-selectcategory-submit' => 'Getir',
+
# Random redirect
'randomredirect' => 'Rastgele yönlendirme',
'randomredirect-nopages' => '"$1" ad alanında hiç bir yönlendirme yok.',
@@ -2077,10 +2146,6 @@ Dosya açıklamasını düzenlemek isterseniz, [$2 dosya açıklama sayfası] bu
'statistics-users-active-desc' => 'Son {{PLURAL:$1|gün|$1 günde}} çalışma yapan kullanıcılar',
'statistics-mostpopular' => 'En çok ziyaret edilen sayfalar',
-'disambiguations' => 'Anlam ayrım sayfalarına bağlantısı olan sayfalar',
-'disambiguationspage' => 'Template:Anlam ayrımı',
-'disambiguations-text' => 'İlk satırda yer alan sayfalar bir anlam ayrım sayfasına iç bağlantı olduğunu gösterir. İkinci sırada yer alan sayfalar anlam ayrım sayfalarını gösterir. <br />Burada [[MediaWiki:Disambiguationspage]] tüm anlam ayrım şablonlarına bağlantılar verilmesi gerekmektedir.',
-
'pageswithprop' => 'Bir sayfa özelliğine sahip sayfalar',
'pageswithprop-text' => 'Bu sayfa belirli bir sayfa özelliğini kullanan sayfaları listeler.',
'pageswithprop-submit' => 'Git',
@@ -2326,10 +2391,9 @@ Bundan sonra, bu sayfaya ve ilgili tartışma sayfasına yapılacak değişiklik
'unwatchthispage' => 'Sayfa izlemeyi durdur',
'notanarticle' => 'İçerik sayfası değil',
'notvisiblerev' => 'Revizyon silinmiÅŸ',
-'watchnochange' => 'İzleme listenizdeki sayfaların hiçbiri, gösterilen zaman aralığında güncellenmemiş.',
'watchlist-details' => 'Tartışma sayfaları hariç {{PLURAL:$1|$1 sayfa|$1 sayfa}} izleme listenizdedir.',
-'wlheader-enotif' => '* E-posta bildirimi etkin.',
-'wlheader-showupdated' => "* Son ziyaretinizden sonraki sayfa değişiklikleri '''kalın yazıyla''' gösterilmiştir.",
+'wlheader-enotif' => 'E-posta bildirimi etkin.',
+'wlheader-showupdated' => "Son ziyaretinizden sonraki sayfa değişiklikleri '''kalın yazıyla''' gösterilmiştir.",
'watchmethod-recent' => 'izlediğiniz sayfalarda yapılan son değişiklikler kontrol ediliyor',
'watchmethod-list' => 'izlediğiniz sayfalarda yapılan son değişiklikler kontrol ediliyor',
'watchlistcontains' => 'Ä°zleme listenizde $1 tane {{PLURAL:$1|sayfa|sayfa}} var.',
@@ -2726,12 +2790,9 @@ Engelleme kaldırılmış olabilir.',
Ancak, bu adres $2 aralığının parçası olarak engellenmiş, aralık engellemesini kaldırabilirsiniz.',
'ip_range_invalid' => 'Geçersiz IP aralığı.',
'ip_range_toolarge' => '/$1 bloktan daha büyük aralık bloklarına izin verilmez.',
-'blockme' => 'Beni engelle',
'proxyblocker' => 'Proxy engelleyici',
-'proxyblocker-disabled' => 'Bu işlev devre dışı bırakıldı.',
'proxyblockreason' => 'IP adresiniz açık bir proxy olduğu için engellendi.
Lütfen İnternet sevis sağlayınız ile ya da teknik destek ile irtibat kurun ve bu ciddi güvenlik probleminden haberdar edin.',
-'proxyblocksuccess' => 'Tamamlanmıştır.',
'sorbsreason' => "IP adresiniz, {{SITENAME}} sitesi tarafından kullanılan DNSBL'de açık proxy olarak listelenmiş.",
'sorbs_create_account_reason' => "IP adresiniz {{SITENAME}} sitesi tarafından kullanılan DNSBL'de açık proxy olarak listelenmiş.
Hesap oluşturamazsınız",
@@ -3099,10 +3160,6 @@ Geçici dosya kayıp.',
'pageinfo-category-files' => 'Dosya sayısı',
# Skin names
-'skinname-standard' => 'Klasik',
-'skinname-nostalgia' => 'Nostaljik',
-'skinname-chick' => 'Şık',
-'skinname-simple' => 'Basit',
'skinname-modern' => 'Modern',
# Patrolling
@@ -3180,11 +3237,25 @@ Bunu çalıştırmak, sisteminizi tehlikeye atabilir.",
'minutes' => '{{PLURAL:$1|$1 dakika|$1 dakika}}',
'hours' => '{{PLURAL:$1|$1 saat|$1 saat}}',
'days' => '{{PLURAL:$1|$1 gün|$1 gün}}',
+'weeks' => '{{PLURAL: $1|$1 hafta|$1 hafta}}',
'months' => '{{PLURAL:$1|$1 ay|$1 ay}}',
'years' => '{{PLURAL:$1|$1 yıl|$1 yıl}}',
'ago' => '$1 önce',
'just-now' => 'Hemen ÅŸimdi',
+# Human-readable timestamps
+'hours-ago' => '$1 {{PLURAL:$1|saat|saat}} önce',
+'minutes-ago' => '$1 {{PLURAL:$1|dakika|dakika}} önce',
+'seconds-ago' => '$1 {{PLURAL:$1|saniye|saniye}} önce',
+'monday-at' => '$1 Pazartesi günü',
+'tuesday-at' => '$1 Salı günü',
+'wednesday-at' => '$1 Çarşamba günü',
+'thursday-at' => '$1 Perşembe günü',
+'friday-at' => '$1 Cuma günü',
+'saturday-at' => '$1 Cumartesi günü',
+'sunday-at' => '$1 Pazar günü',
+'yesterday-at' => '$1 dün itibariyle',
+
# Bad image list
'bad_image_list' => 'Biçim aşağıdaki gibidir:
@@ -3216,7 +3287,7 @@ Diğerleri varsayılan olarak gizlenecektir.
* gpslongitude
* gpsaltitude',
-# EXIF tags
+# Exif tags
'exif-imagewidth' => 'GeniÅŸlik',
'exif-imagelength' => 'Yükseklik',
'exif-bitspersample' => 'Bits per component',
@@ -3382,7 +3453,7 @@ Diğerleri varsayılan olarak gizlenecektir.
'exif-originalimageheight' => 'Resmin kırpılmadan önceki yükseliği',
'exif-originalimagewidth' => 'Resmin kırpılmadan önceki genişliği',
-# EXIF attributes
+# Exif attributes
'exif-compression-1' => 'Sıkıştırılmamış',
'exif-compression-6' => 'JPEG',
@@ -3795,7 +3866,6 @@ Ayrıca [[Special:EditWatchlist|standart düzenleme sayfasını]] da kullanabili
'version-other' => 'DiÄŸer',
'version-mediahandlers' => 'Ortam iÅŸleyiciler',
'version-hooks' => 'Çengeller',
-'version-extension-functions' => 'Ek fonksiyonları',
'version-parser-extensiontags' => 'Derleyici eklenti etiketleri',
'version-parser-function-hooks' => 'Derleyici fonksiyon çengelleri',
'version-hook-name' => 'Çengel adı',
@@ -3816,12 +3886,15 @@ Bu programla birlikte [{{SERVER}}{{SCRIPTPATH}}/COPYING GNU Genel Kamu Lisansın
'version-entrypoints-header-entrypoint' => 'Giriş noktası',
'version-entrypoints-header-url' => 'URL',
-# Special:FilePath
-'filepath' => 'Dosyanın konumu',
-'filepath-page' => 'Dosya adı:',
-'filepath-submit' => 'Git',
-'filepath-summary' => 'Bu özel sayfa bir dosya için tam yolu getirir.
-Resimler tam çözünürlükte görüntülenir, diğer dosya tipleri ilgili programlarıyla doğrudan başlatılır.',
+# Special:Redirect
+'redirect' => 'Dosya, kullanıcı veya sayfa ID yönlendirme',
+'redirect-legend' => 'Bir dosya veya sayfaya yönlendirme',
+'redirect-summary' => "Bu özel sayfa sizi bir dosya (dosya adı verilen), bir sayfa (bir revizyon ID'si verilen) veya bir kullanıcı sayfasının (sayısal kullanıcı kimliği verilen) adresine yönlendirir.",
+'redirect-submit' => 'Git',
+'redirect-value' => 'DeÄŸer:',
+'redirect-user' => 'Kullanıcı kimliği',
+'redirect-file' => 'Dosya adı',
+'redirect-not-exists' => 'Değer bulunamadı',
# Special:FileDuplicateSearch
'fileduplicatesearch' => 'Benzer dosyaları ara',
@@ -3876,7 +3949,10 @@ Resimler tam çözünürlükte görüntülenir, diğer dosya tipleri ilgili prog
'tags-tag' => 'Etiket adı',
'tags-display-header' => 'Değişiklik listelerindeki görünüm',
'tags-description-header' => 'Anlamının tam açıklaması',
+'tags-active-header' => 'Etkin?',
'tags-hitcount-header' => 'Etiketli deÄŸiÅŸiklikler',
+'tags-active-yes' => 'Evet',
+'tags-active-no' => 'Hayır',
'tags-edit' => 'deÄŸiÅŸtir',
'tags-hitcount' => '$1 {{PLURAL:$1|deÄŸiÅŸiklik|deÄŸiÅŸiklik}}',
@@ -3912,6 +3988,8 @@ Resimler tam çözünürlükte görüntülenir, diğer dosya tipleri ilgili prog
'htmlform-submit' => 'Gönder',
'htmlform-reset' => 'DeÄŸiÅŸiklikleri geri al',
'htmlform-selectorother-other' => 'DiÄŸer',
+'htmlform-no' => 'Hayır',
+'htmlform-yes' => 'Evet',
# SQLite database support
'sqlite-has-fts' => '$1 tam-metin arama desteÄŸi ile',
@@ -4007,4 +4085,17 @@ Resimler tam çözünürlükte görüntülenir, diğer dosya tipleri ilgili prog
'duration-centuries' => '$1 {{PLURAL:$1|yüzyıl|yüzyıl}}',
'duration-millennia' => '$1 {{PLURAL:$1|bin yıl|bin yıl}}',
+# Limit report
+'limitreport-title' => 'Ayrıştırıcı profil verileri:',
+'limitreport-cputime' => 'CPU süresi kullanımı',
+'limitreport-cputime-value' => '$1 {{PLURAL:$1|saniye|saniye}}',
+'limitreport-walltime' => 'Gerçek süre kullanımı',
+'limitreport-ppvisitednodes' => 'Önişlemci düğümü ziyaret sayısı',
+'limitreport-ppgeneratednodes' => 'Önişlemcinin ürettiği düğüm sayısı',
+'limitreport-postexpandincludesize' => 'Gönderi genişliği boyutu dahil',
+'limitreport-postexpandincludesize-value' => '$1/$2 bayt',
+'limitreport-templateargumentsize' => 'Åžablon deÄŸiÅŸkeni boyutu',
+'limitreport-expansiondepth' => 'En yüksek genişleme derinliği',
+'limitreport-expensivefunctioncount' => 'Daha fazla ayrıştırıcı işlev sayısı',
+
);
diff --git a/languages/messages/MessagesTru.php b/languages/messages/MessagesTru.php
index c396d495..5dd30114 100644
--- a/languages/messages/MessagesTru.php
+++ b/languages/messages/MessagesTru.php
@@ -158,7 +158,7 @@ $messages = array(
'jumptosearch' => 'Kruxyo',
'pool-errorunknown' => 'Fawdo nuxroyo',
-# 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).
+# 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).
'aboutsite' => '3al {{SITENAME}}',
'aboutpage' => 'Project: 3al',
'copyrightpage' => '{{ns:project}}:Ḥaqat duKaṭowo',
@@ -167,7 +167,6 @@ $messages = array(
'disclaimers' => 'Disclaimers',
'disclaimerpage' => 'Project: Disclaimer gawonoyo',
'edithelp' => 'Editing help',
-'edithelppage' => 'Help:Mşaḥlaf',
'helppage' => 'Help: Ḥbişoṭo',
'mainpage' => 'Faá¹­o riÅŸoyto',
'mainpage-description' => 'Faá¹­o riÅŸoyto',
@@ -400,7 +399,6 @@ Legend: '''({{int:cur}})''' = difference with latest revision, '''({{int:last}})
'searchmenu-legend' => '3ayar duKruxyo',
'searchmenu-exists' => "'''Kito Faá¹­o herke IÅŸma \"[[:\$1]]\"yo'''",
'searchmenu-new' => 'Ká¹­aw iFaá¹­aá¹­e "[[:$1]]" buWiki.',
-'searchhelp-url' => 'Help: Ḥbişoṭo',
'searchprofile-articles' => 'Faṭoṭe daḤbişoṭo',
'searchprofile-project' => 'Faá¹­oá¹­e du3udrono u daProjat',
'searchprofile-images' => 'Multimediya',
@@ -504,7 +502,6 @@ Legend: '''({{int:cur}})''' = difference with latest revision, '''({{int:last}})
'recentchangeslinked' => 'Şuḥlofe bFaṭoṭe masre',
'recentchangeslinked-toolbox' => 'Şuḥlofe bFaṭoṭe masre',
'recentchangeslinked-title' => 'Şuḥlofe bFaṭoṭe dkıtne masre b$1',
-'recentchangeslinked-noresult' => 'No changes on linked pages during the given period.',
'recentchangeslinked-summary' => "This is a list of changes made recently to pages linked from a specified page (or to members of a specified category).
Pages on [[Special:Watchlist|your watchlist]] are '''bold'''.",
'recentchangeslinked-page' => 'IÅŸmo diFaá¹­o',
@@ -543,8 +540,6 @@ The description on its [$2 file description page] there is shown below.',
# Statistics
'statistics' => 'Mardonwoá¹­o',
-'disambiguationspage' => 'Template:disambig',
-
'brokenredirects-edit' => 'mşaḥlaf',
'brokenredirects-delete' => 'slag',
@@ -802,7 +797,7 @@ Others will be hidden by default.
* gpslongitude
* gpsaltitude',
-# EXIF tags
+# Exif tags
'exif-writer' => 'Kaá¹­owo',
'exif-languagecode' => 'LeÅŸono',
'exif-cameraownername' => 'uMoro diQamera',
@@ -824,9 +819,6 @@ Others will be hidden by default.
# Core parser functions
'duplicate-defaultsort' => '\'\'\'Warning:\'\'\' Default sort key "$2" overrides earlier default sort key "$1".',
-# Special:FilePath
-'filepath-submit' => 'Zux',
-
# Special:FileDuplicateSearch
'fileduplicatesearch-submit' => 'Krax',
diff --git a/languages/messages/MessagesTs.php b/languages/messages/MessagesTs.php
index a1ad946d..a468b680 100644
--- a/languages/messages/MessagesTs.php
+++ b/languages/messages/MessagesTs.php
@@ -38,8 +38,6 @@ $messages = array(
'tog-enotifminoredits' => 'ndzurhumele e-mail loko ku endleka mindzulamiso leyi ntsongo',
'tog-enotifrevealaddr' => 'Paluxa e-mail yamina eka mapapila lawa ndzimarhumelaka',
'tog-shownumberswatching' => 'Komba ntsengo wa vatirhisi lava hlaleleke tluka',
-'tog-externaleditor' => 'Tirhisa xilulamisi xalehandle hikukongoma (Nhlawulo lowu i wavatirhisi lavangani ntokoto ntsena, wu lava ku cinca kokarhi eka khompuyuta yawena. [//www.mediawiki.org/wiki/Manual:External_editors vuxokoxoko hi mhakaleyi.])',
-'tog-externaldiff' => 'Tirhisa phurogiremi yalehandle hikukongoma (Nhlawulo lowu i wavatirhisi lavangani ntokoto ntsena, wu lava ku cinca kokarhi eka khompuyuta yawena. [//www.mediawiki.org/wiki/Manual:External_editors vuxokoxoko hi mhakaleyi.])',
'tog-forceeditsummary' => 'Ndzivutisisi loko ndzinga hoxi nkomiso wa ndzulamiso lowu ndzi wu endleke',
'tog-watchlisthideown' => 'Tumbeta mindzulamiso ya mina eka leswi ndzi swi languteke',
'tog-watchlisthidebots' => 'Tumbeta mindzulamiso ya rhobhoti eka leswi ndzi swi languteke',
@@ -216,7 +214,7 @@ $messages = array(
'jumptosearch' => 'Lava',
'pool-errorunknown' => 'xiphiqo xoka xingativeki',
-# 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).
+# 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).
'aboutsite' => 'ta {{SITENAME}}',
'aboutpage' => 'Project:ta',
'copyright' => 'Matsalwa makumeka ehansi ka $1.',
@@ -226,7 +224,6 @@ $messages = array(
'disclaimers' => 'Swi alanandzu',
'disclaimerpage' => 'Project:Swithsuxa nadzu hikuangara',
'edithelp' => 'Mpfuno hi ta mindzulamiso',
-'edithelppage' => 'Help:Mindzulamiso',
'helppage' => 'Help:Leswinga ndzeni',
'mainpage' => 'Tlukankulu',
'mainpage-description' => 'Tluka-Nkulu',
@@ -300,17 +297,6 @@ Vona nxaxamelo wa ma tluka yo hlawuleka e [[Special:SpecialPages|{{int:specialpa
# General errors
'error' => 'Xihoxo',
'databaseerror' => 'Xihoxo xo Database',
-'dberrortext' => 'A database query syntax error has occurred.
-This may indicate a bug in the software.
-The last attempted database query was:
-<blockquote><tt>$1</tt></blockquote>
-from within function "<tt>$2</tt>".
-MySQL returned error "<tt>$3: $4</tt>".',
-'dberrortextcl' => 'A database query syntax error has occurred.
-The last attempted database query was:
-"$1"
-from within function "$2".
-MySQL returned error "$3: $4"',
'laggedslavemode' => 'Warning: Page may not contain recent updates.',
'readonly' => 'Database locked',
'enterlockreason' => 'Enter a reason for the lock, including an estimate of when the lock will be released',
@@ -514,7 +500,6 @@ Swihlamuseri: '''({{int:sweswi}})''' = kuhambana na ndzulamiso wa sweswinyana, '
'viewprevnext' => 'Vona ($1 {{int:pipe-separator}} $2) ($3)',
'searchmenu-exists' => "'''Tluka leri vuriwaka \"[[:\$1]]\" ikhale ririkona eka wiki leyi.'''",
'searchmenu-new' => "'''Tumbuluxa tluka ra \"[[:\$1]]\" eka wiki leyi!'''",
-'searchhelp-url' => 'Help:Leswinga ndzeni',
'searchprofile-articles' => 'Matluka lama tsariweke',
'searchprofile-project' => 'Mpfuno na matluka ya phurojeki',
'searchprofile-images' => 'Tifayili ta mfpumawulo na swifaniso',
@@ -612,7 +597,6 @@ Adiresi ya wena ya e-mail yitunberile loko van'wana va bula na wena.",
'recentchangeslinked-feed' => 'Kuncica loku yelanaka',
'recentchangeslinked-toolbox' => 'Kuncica loku yelanaka',
'recentchangeslinked-title' => 'Kucinca loku yelanaka na "$1"',
-'recentchangeslinked-noresult' => 'Kuhava mindzulamiso eka matluka lawa eka nkarhi lowu langiweke',
'recentchangeslinked-summary' => "Lowu inxaxamelo wa kucinca kasweswinyana loku endliweke eka matluka la ma khwekelaka eka tluka leri u rilavaka (kumbe yinw'ana ya mitlawa leyi yelanaka).Matluka lawa [[Special:Watchlist|umalanguteke]] ma '''bumburisiwile'''.",
'recentchangeslinked-page' => 'Vito ratluka:',
'recentchangeslinked-to' => 'Komba kucinca eka matluka lama khwekelaka eka tluka leri ntsena',
@@ -658,8 +642,6 @@ Nhlamuselo ya yona leyi nge ndzeni ka [$2 tluka ro hlamusela] hi yona leyi kombi
# Statistics
'statistics' => 'Mintsengo',
-'disambiguationspage' => 'Template:Hambanisa marito',
-
# Miscellaneous special pages
'nbytes' => '$1 {{PLURAL:$1|wa bayiti|wa tibayit}}',
'nmembers' => '$1 {{PLURAL:$1|museketeri| wa vaseketeri}}',
diff --git a/languages/messages/MessagesTt_cyrl.php b/languages/messages/MessagesTt_cyrl.php
index 8aa4c4e9..479dea83 100644
--- a/languages/messages/MessagesTt_cyrl.php
+++ b/languages/messages/MessagesTt_cyrl.php
@@ -240,9 +240,6 @@ $messages = array(
'tog-shownumberswatching' => 'Битне күзәтү иÑемлекләренә Ó©Ñтәгән кулланучылар Ñанын күрÑәтелÑен',
'tog-oldsig' => 'Хәзерге имза:',
'tog-fancysig' => 'Имзаның шәхÑи вики-билгеләмәÑе (автоматик ÑылтамаÑыз)',
-'tog-externaleditor' => 'Тышкы редактор куллану (бары тик белгечләргә генә һәм Ñанак махÑÑƒÑ ÐºÓ©Ð¹Ð»Ó™Ð½Ð³Ó™Ð½ булу зарур; [//www.mediawiki.org/wiki/Manual:External_editors тулырак...])',
-'tog-externaldiff' => 'Тышкы верÑÐ¸Ñ Ñ‡Ð°Ð³Ñ‹ÑˆÑ‚Ñ‹Ñ€Ñƒ программаÑын куллану (бары тик белгечләр өчен һшм Ñанак махÑÑƒÑ ÐºÓ©Ð¹Ð»Ó™Ð½Ð³Ó™Ð½ булу зарур; [//www.mediawiki.org/wiki/Manual:External_editors тулырак...])',
-'tog-showjumplinks' => '«Күчү» Ñрдәмче Ñылтамалары ÑлганÑын',
'tog-uselivepreview' => 'Тиз карап алу кулланылÑын (JavaScript, ÑкÑперименталь)',
'tog-forceeditsummary' => 'Үзгәртүләрне таÑвирлау юлы тутырылмаган булÑа, киÑәтү',
'tog-watchlisthideown' => 'Минем үзгәртүләрем күзәтү иÑемлегеннән ÑшерелÑен',
@@ -255,6 +252,7 @@ $messages = array(
'tog-diffonly' => 'Юрама чагыштыру аÑтында бит Ñчтәлеге күрÑәтелмәÑен',
'tog-showhiddencats' => 'Яшерен төркемнәр күрÑәтелÑен',
'tog-norollbackdiff' => 'Кире кайтару ÑÑагач юрамалар аермаÑÑ‹ күрÑәтелмәÑен',
+'tog-useeditwarning' => 'Битне Ñакламыйча китү вакытында мине киÑәтергә',
'underline-always' => 'Һәрвакыт',
'underline-never' => 'Бервакытта да',
@@ -318,6 +316,18 @@ $messages = array(
'oct' => 'окт',
'nov' => 'ноÑ',
'dec' => 'дек',
+'january-date' => '$1 Гыйнвар',
+'february-date' => '$1 Февраль',
+'march-date' => '$1 Март',
+'april-date' => '$1 Ðпрель',
+'may-date' => '$1 Май',
+'june-date' => '$1 Июнь',
+'july-date' => '$1 Июль',
+'august-date' => '$1 ÐвгуÑÑ‚',
+'september-date' => '$1 СентÑбрь',
+'october-date' => '$1 ОктÑбрь',
+'november-date' => '$1 ÐоÑбрь',
+'december-date' => '$1 Декабрь',
# Categories related messages
'pagecategories' => '{{PLURAL:$1|Төркем|Төркемнәр}}',
@@ -338,7 +348,7 @@ $messages = array(
'noindex-category' => 'ИндекÑланмаган битләр',
'broken-file-category' => 'Файлларга Ñшләми торган Ñылтамалар булган битләр',
-'linkprefix' => '/^(.*?)([a-zA-Z\\x80-\\xff]+)$/sD',
+'linkprefix' => '/^((?>.*(?<![a-zA-Z\\x80-\\xff])))(.+)$/sD',
'about' => 'ТаÑвирлама',
'article' => 'Мәкалә',
@@ -400,6 +410,7 @@ $messages = array(
'create-this-page' => 'Бу битне төзү',
'delete' => 'Бетерү',
'deletethispage' => 'Бу битне бетерү',
+'undeletethispage' => 'Бу битне кайтарырга',
'undelete_short' => '$1 {{PLURAL:$1|үзгәртмәне}} торгызу',
'viewdeleted_short' => '{{PLURAL:$1|1 бетерелгән үзгәртүне|$1 бетерелгән үзгәртүне}} карау',
'protect' => 'Яклау',
@@ -443,7 +454,7 @@ $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).
+# 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).
'aboutsite' => '{{SITENAME}} турында',
'aboutpage' => 'Project:ТаÑвирлама',
'copyright' => 'Мәгълүмат $1 буенча таратыла.',
@@ -453,7 +464,6 @@ $1',
'disclaimers' => 'Җаваплылыктан баш тарту',
'disclaimerpage' => 'Project:Җаваплылыктан баш тарту',
'edithelp' => 'Үзгәртү буенча Ñрдәм',
-'edithelppage' => 'Help:Үзгәртү',
'helppage' => 'Help:Эчтәлек',
'mainpage' => 'Баш бит',
'mainpage-description' => 'Баш бит',
@@ -483,7 +493,6 @@ $1',
'newmessagesdifflinkplural' => '{{PLURAL:$1|Ñоңгы үзгәртү|Ñоңгы үзгәртүләр}}',
'youhavenewmessagesmulti' => 'Сезгә монда Ñңа хәбәрләр бар: $1',
'editsection' => 'үзгәртү',
-'editsection-brackets' => '[$1]',
'editold' => 'үзгәртү',
'viewsourceold' => 'башлангыч кодны карау',
'editlink' => 'үзгәртү',
@@ -535,17 +544,6 @@ $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' => 'Ябылу Ñәбәбен һәм вакытын күрÑәтегез.',
@@ -595,12 +593,13 @@ $1',
'viewyourtext' => "Сез '''үз төзәтмәләрегезне''' бу Ñәхифәдә карый һәм чыгарылма текÑтны күчермәли алаÑыз:",
'protectedinterface' => 'Бу биттә программа Ñ‚Ó™Ñминатының Ð¸Ð½Ñ‚ÐµÑ€Ñ„ÐµÐ¹Ñ Ñ…Ó™Ð±Ó™Ñ€Ð»Ó™Ñ€Ðµ бар. Вандализмга каршы көрәш Ñәбәпле, бу битне үзгәртү тыела. Әлеге хәбәрнең тәрҗемәÑен Ó©ÑÑ‚Ó™Ò¯ Ñки үзгәртү өчен, зинһар өчен, MediaWiki [//translatewiki.net/ translatewiki.net] тәрҗемәләү Ñайтын кулланыгыз.',
'editinginterface' => "'''Игътибар:''' Сез программа Ñ‚Ó™Ñминатының Ð¸Ð½Ñ‚ÐµÑ€Ñ„ÐµÐ¹Ñ Ñ‚ÐµÐºÑÑ‚Ñ‹ булган битне үзгәртәÑез. Бу башка кулланучыларга да Ñ‚Ó™ÑÑир итәчәк. Тәрҗемә өчен [//translatewiki.net/wiki/Main_Page?setlang=tt-cyrl translatewiki.net] локализациÑләү проектын кулланыгыз.",
-'sqlhidden' => '(SQL-Ñорау Ñшерелгән)',
'cascadeprotected' => 'Бу бит үзгәртүләрдән Ñакланган, чөнки ул каÑкадлы Ñаклау кабул ителгән {{PLURAL:$1|биткә|битләргә}} Ó©Ñтәлгән:
$2',
'namespaceprotected' => "'''$1''' иÑем киңлегендәге битләрне үзгәртү өчен Ñезнең Ñ€Ó©Ñ…Ñәтегез юк.",
'customcssprotected' => 'Сез бу CSS-Ñәхифәне үзгәртә алмыйÑыз, чөнки монда башка кулланучының шәхÑи көйләнмәләре Ñаклана',
'customjsprotected' => 'Сез бу JavaScript-Ñәхифәне үзгәртә алмыйÑыз, чөнк монда башка кулланучының шәхÑи көйләнмәләре Ñаклана',
+'mycustomcssprotected' => 'Сезнең әлеге CSS битен үзгәртергә хокукыгыз юк.',
+'mycustomjsprotected' => 'Сезнең биттә JavaScript үзгәртергә хокукларыгыз юк.',
'ns-specialprotected' => 'МахÑÑƒÑ Ð±Ð¸Ñ‚Ð»Ó™Ñ€Ð½Ðµ үзгәртеп булмый.',
'titleprotected' => "Бу иÑем белән бит ÑÑау [[User:$1|$1]] тарафыннан тыелган.
Ул күрÑәткән Ñәбәп: ''$2''.",
@@ -617,10 +616,19 @@ $2',
Кайбер битләр Сез кергән кебек күрÑәтелергә мөмкин. Моны бетерү өчен браузер кÑшын чиÑтартыгыз.",
'welcomeuser' => 'Хуш килдегез, $1!',
'yourname' => 'Кулланучы иÑеме:',
+'userlogin-yourname' => 'Кулланучы иÑеме',
+'userlogin-yourname-ph' => 'ХиÑап ÑзмаÑының иÑемен кертегез',
+'createacct-another-username-ph' => 'ХиÑап ÑзмаÑының иÑемен кертегез',
'yourpassword' => 'СерÑүз:',
+'userlogin-yourpassword' => 'СерÑүз',
+'userlogin-yourpassword-ph' => 'СерÑүзне Ñзыгыз',
+'createacct-yourpassword-ph' => 'СерÑүзне кертегез',
'yourpasswordagain' => 'СерÑүзне кабат кертү:',
+'createacct-yourpasswordagain' => 'СерÑүзне раÑлагыз',
+'createacct-yourpasswordagain-ph' => 'СерÑүзне кабаттан кертегез',
'remembermypassword' => 'ХиÑап Ñзмамны бу браузерда ÑакланÑын (иң күп $1 {{PLURAL:$1|көн|көн|көн}}гә кадәр)',
-'securelogin-stick-https' => 'Керүдән Ñоң HTTPS буенча тоташтыру дәвам ителÑен',
+'userlogin-remembermypassword' => 'СиÑтемада калырга',
+'userlogin-signwithsecure' => 'Якланган кушылу',
'yourdomainname' => 'Сезнең доменыгыз:',
'password-change-forbidden' => 'Сез бу викидә ÑерÑүзне үзгәртә алмыйÑыз.',
'externaldberror' => 'Тышкы мәгълүмат базаÑÑ‹ Ñрдәмендә Ð°ÑƒÑ‚ÐµÐ½Ñ‚Ð¸Ñ„Ð¸ÐºÐ°Ñ†Ð¸Ñ Ò¯Ñ‚ÐºÓ™Ð½Ð´Ó™ хата чыкты, ÑиÑÓ™ тышкы хиÑап Ñзмагызга үзгәрешләр кертү хокукыгыз юк.',
@@ -632,6 +640,8 @@ $2',
'logout' => 'Чыгу',
'userlogout' => 'Чыгу',
'notloggedin' => 'Сез хиÑап Ñзмагызга кермәгәнÑез',
+'userlogin-noaccount' => 'Ðккаунт юкмы?',
+'userlogin-joinproject' => 'Проектка керү',
'nologin' => "Кулланучы иÑемең юкмы? '''$1'''",
'nologinlink' => 'ХиÑап ÑзмаÑÑ‹ төзегез',
'createaccount' => 'Яңа кулланучы теркәү',
@@ -709,7 +719,7 @@ $2',
'newpassword' => 'Яңа ÑерÑүз:',
'retypenew' => 'Яңа ÑерÑүзне кабатлагыз:',
'resetpass_submit' => 'СерÑүз куеп керү',
-'resetpass_success' => 'Сезнең ÑерÑүз уңышлы үзгәртелде! СиÑтемага керү башкарыла...',
+'changepassword-success' => 'Сезнең ÑерÑүз уңышлы үзгәртелде! СиÑтемага керү башкарыла...',
'resetpass_forbidden' => 'СерÑүз үзгәртелә алмый',
'resetpass-no-info' => 'Бу битне карау өчен Ñез ÑиÑтемага үз хиÑап Ñзмагыз Ñрдәмендә керергә тиеш.',
'resetpass-submit-loggedin' => 'СерÑүзне үзгәртү',
@@ -720,10 +730,8 @@ $2',
# Special:PasswordReset
'passwordreset' => 'СерÑүзне бетерү',
-'passwordreset-text' => 'Сезнең хиÑап ÑзмаÑының параметрлары турында хат алыр өчен, түбәндәгеләрне тутырыгыз',
'passwordreset-legend' => 'СерÑүзне Ñңадан кую',
'passwordreset-disabled' => 'Бу викида ÑерÑүз бетереп булмый',
-'passwordreset-pretext' => '{{PLURAL:$1||Түбәндә күрÑәтелгән мәгълүматларның бер өлешен Ñзыгыз}}',
'passwordreset-username' => 'Кулланучы иÑеме:',
'passwordreset-domain' => 'Домен:',
'passwordreset-capture' => 'Килеп чыккан хатны күрÑәтелÑенме?',
@@ -961,6 +969,8 @@ $2
'edit-no-change' => 'ТекÑтта үзгәешләр ÑÑалмау Ñәбәпле, Ñезнең үзгәртү кире кагыла.',
'edit-already-exists' => 'Яңа бит төзеп булмый.
Ул инде бар.',
+'editwarning-warning' => 'Башка биткә күчү вакытында бу мәкаләгә керткән үзгәрешләр югалырга мөмкин.
+Әгәрдә Ñез теркәлгән булÑагыз, бу иÑкәрмәне Ñез «Көйләнмәләрем» өлешендә үзгәртә алаÑыз.',
# Parser/template warnings
'expensive-parserfunction-warning' => "'''Игътибар:''' бу биттә хәтерне еш кулланучы функциÑләр артык күп.
@@ -1136,7 +1146,6 @@ $1",
'searchmenu-legend' => 'Эзләү көйләнмәләре',
'searchmenu-exists' => "'''Бу вики-проекта «[[:$1]]» иÑемле бит бар инде'''",
'searchmenu-new' => "'''«[[:$1]]» иÑемле Ñңа бит ÑÑау'''",
-'searchhelp-url' => 'Help:Эчтәлек',
'searchmenu-prefix' => '[[Special:PrefixIndex/$1|Бу префикÑлы битләрне күрÑәтү]]',
'searchprofile-articles' => 'Төп битләр',
'searchprofile-project' => 'Ярдәм һәм проектлар бите',
@@ -1178,14 +1187,6 @@ $1",
'powersearch-togglenone' => 'Бирни дә юк',
'search-external' => 'Тышкы Ñзләү',
-# Quickbar
-'qbsettings' => 'Күчешләр аÑлыгы',
-'qbsettings-none' => 'КүрÑәтмәү',
-'qbsettings-fixedleft' => 'Сулда күчерелмәÑ',
-'qbsettings-fixedright' => 'Уңда күчерелмәÑ',
-'qbsettings-floatingleft' => 'Сулда йөзмә',
-'qbsettings-floatingright' => 'Уңда йөзмә',
-
# Preferences page
'preferences' => 'Көйләнмәләр',
'mypreferences' => 'Көйләнмәләр',
@@ -1215,7 +1216,6 @@ $1",
'resetprefs' => 'Сакланмаган үзгәртүләрне бетерү',
'restoreprefs' => 'Баштагы көйләнмәләрне кире кайтару',
'prefs-editing' => 'Үзгәртү',
-'prefs-edit-boxsize' => 'Үзгәртү тәрәзәÑенең зурлыгы',
'rows' => 'Юллар:',
'columns' => 'Баганалар:',
'searchresultshead' => 'Эзләү',
@@ -1226,7 +1226,6 @@ $1",
'recentchangesdays-max' => '( $1 {{PLURAL:$1|көннән}} дә артык булмаÑка тиеш)',
'recentchangescount' => 'Төп буларак кулланучы үзгәртүләр Ñаны:',
'prefs-help-recentchangescount' => 'Үз өченә үзгәртүләрне, битләрнең тарихын һәм Ñзлу көндәлеген дә кертә.',
-'prefs-help-watchlist-token' => 'Әлеге юлны ÑерÑүз белән тутыру Ñезнең күзәтү иÑемлегегезнең RSS-таÑмаÑын барлыкка китерәчәк. Мондагы ÑерÑүзне белүче һәрбер кеше Ñезнең күзәтү иÑемлегегезне карый ала, шуңа күрә автоматик рәвештә ÑÑалган ÑерÑүзне кулланыгыз: $1',
'savedprefs' => 'Көйләнмәләрегез Ñакланды.',
'timezonelegend' => 'Сәгать поÑÑÑ‹:',
'localtime' => 'Җирле вакыт',
@@ -1256,7 +1255,6 @@ $1",
'prefs-common-css-js' => 'Барлык бизәлешләр өчен гомуми CSS/JS:',
'prefs-reset-intro' => 'Бу бит Ñезнең көйләнмәләрегезне бетерү өчен кулланыла. Бу Ñшне башкару нәтиҗәÑендә Ñез Ñңадан үз көйләнмәләрне Ñңадан кайтара алмыйÑыз.',
'prefs-emailconfirm-label' => 'E-mail раÑлау',
-'prefs-textboxsize' => 'Үзгәртү тәрәзәÑенең зурлыгы',
'youremail' => 'Электрон почта:',
'username' => 'Кулланучы иÑеме:',
'uid' => 'Кулланучының идентификаторы:',
@@ -1408,7 +1406,6 @@ $1",
'recentchangeslinked-feed' => 'Бәйләнешле үзгәртүләр',
'recentchangeslinked-toolbox' => 'Бәйләнешле үзгәртүләр',
'recentchangeslinked-title' => '"$1" битенә бәйләнешле үзгәртүләр',
-'recentchangeslinked-noresult' => 'КүрÑәтелгән вакытта Ñылташкан битләрнең үзгәртелмәләре юк иде.',
'recentchangeslinked-summary' => "Бу күрÑәтелгән бит белән Ñылталган (йә күрÑәтелгән төркемгә керткән) битләрнең үзгәртелмәләре иÑемлеге.
[[Special:Watchlist|Күзәтү иÑемлегегезгә]] керә торган битләр '''калын'''.",
'recentchangeslinked-page' => 'Битнең иÑеме:',
@@ -1599,9 +1596,6 @@ PICT # төрле
'statistics-users-active-desc' => '{{PLURAL:$1|$1 көн }} өчендә нинди дә булÑа үзгәртүләр керткән кулланучылар',
'statistics-mostpopular' => 'Иң күп каралучы битләр',
-'disambiguations' => 'Күп мәгънәле Ñүзләр турында битләр',
-'disambiguationspage' => 'Template:disambig',
-
'doubleredirects' => 'Икеләтә юнәлтүләр',
'brokenredirects' => 'БәйләнешÑез юнәлтүләр',
@@ -1998,7 +1992,6 @@ $1',
'block-log-flags-noemail' => 'хат җибәрү тыелган',
'block-log-flags-hiddenname' => 'кулланучының иÑеме Ñшерелгән',
'proxyblocker' => 'ПрокÑи Ñ‚Ñ‹ÑŽ',
-'proxyblocksuccess' => 'Эшләнде',
'sorbsreason' => 'Сезнең IP адреÑыгыз DNSBLда ачык прокÑи дип Ñанала.',
# Developer tools
@@ -2174,13 +2167,8 @@ $1',
'pageinfo-toolboxlink' => 'Бит турында мәгълүмат',
# Skin names
-'skinname-standard' => 'КлаÑÑик',
-'skinname-nostalgia' => 'ИÑкә алу',
'skinname-cologneblue' => 'Зәңгәр Ñагыш',
'skinname-monobook' => 'Китап',
-'skinname-myskin' => 'Үзем',
-'skinname-chick' => 'Чеби',
-'skinname-simple' => 'Гади',
'skinname-modern' => 'Замана',
'skinname-vector' => 'Сызымлы',
@@ -2250,7 +2238,7 @@ $1',
* gpslongitude
* gpsaltitude',
-# EXIF tags
+# Exif tags
'exif-imagewidth' => 'Киңлек',
'exif-imagelength' => 'Биеклек',
'exif-imagedescription' => 'РәÑемнең иÑеме',
@@ -2460,11 +2448,6 @@ $1',
'version-software-product' => 'Продукт',
'version-software-version' => 'ВерÑиÑ',
-# Special:FilePath
-'filepath' => 'Файлга юл',
-'filepath-page' => 'Файл:',
-'filepath-submit' => 'Күчү',
-
# Special:FileDuplicateSearch
'fileduplicatesearch' => 'Бер үк файлларны Ñзләү',
'fileduplicatesearch-submit' => 'Эзләү',
diff --git a/languages/messages/MessagesTt_latn.php b/languages/messages/MessagesTt_latn.php
index 826d8335..36d11973 100644
--- a/languages/messages/MessagesTt_latn.php
+++ b/languages/messages/MessagesTt_latn.php
@@ -122,9 +122,6 @@ $messages = array(
'tog-shownumberswatching' => 'Bitne küzätü isemleklärenä östägän qullanuçılar sanın kürsätelsen',
'tog-oldsig' => 'Xäzerge imzanı aldan qaraw:',
'tog-fancysig' => 'İmzanıñ şäxsi wiki-bilgelämäse (avtomatik sıltamasız)',
-'tog-externaleditor' => 'Tışqı redaqtor qullanu (kompyuter maxsus köylängän bulu zarur)',
-'tog-externaldiff' => 'Tışqı versiä çağıştıru programmasın qullanu (kompyuter maxsus köylängän bulu zarur)',
-'tog-showjumplinks' => '«Küçü» yärdämçe sıltamaları yalğansın',
'tog-uselivepreview' => 'Tiz qarap alu qullanılsın (JavaScript, eksperimental)',
'tog-forceeditsummary' => 'Üzgärtülärne taswirlaw yulı tutırılmağan bulsa, kisätü',
'tog-watchlisthideown' => 'Minem üzgärtülärem küzätü isemlegennän yäşerelsen',
@@ -219,7 +216,7 @@ $messages = array(
'index-category' => 'İndekslanğan bitlär',
'noindex-category' => 'İndekslanmağan bitlär',
-'linkprefix' => '/^(.*?)([a-zA-Z\\x80-\\xff]+)$/sD',
+'linkprefix' => '/^((?>.*(?<![a-zA-Z\\x80-\\xff])))(.+)$/sD',
'about' => 'Taswirlama',
'article' => 'Mäqälä',
@@ -321,7 +318,7 @@ $1',
'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).
+# 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).
'aboutsite' => '{{SITENAME}} turında',
'aboutpage' => 'Project:Taswirlama',
'copyright' => 'Mäğlümat $1 buyınça taratıla.',
@@ -331,7 +328,6 @@ $1',
'disclaimers' => 'Cawaplılıqtan baş tartu',
'disclaimerpage' => 'Project:Cawaplılıqtan baş tartu',
'edithelp' => 'Üzgärtü buyınça yärdäm',
-'edithelppage' => 'Help:Üzgärtü',
'helppage' => 'Help:Eçtälek',
'mainpage' => 'BaÅŸ bit',
'mainpage-description' => 'BaÅŸ bit',
@@ -357,7 +353,6 @@ $1',
'newmessagesdifflink' => 'bäxäs bitegezneñ soñğı üzgärtüe',
'youhavenewmessagesmulti' => 'Sezgä monda yaña xäbärlär bar: $1',
'editsection' => 'üzgärtü',
-'editsection-brackets' => '[$1]',
'editold' => 'üzgärtü',
'viewsourceold' => 'başlanğıç kodnı qaraw',
'editlink' => 'üzgärtü',
@@ -405,17 +400,6 @@ Maxsus bitlär isemlegen qarağız: [[Special:SpecialPages|{{int:specialpages}}]
# General errors
'error' => 'Xata',
'databaseerror' => 'Mäğlümatlar bazasında xata',
-'dberrortext' => 'Mäğlümatlar bazasına cibärelgän sorawda sintaksik xata tabıldı.
-Programmada xata bulırğa mömkin.
-Mäğlümatlar bazasına cibärelgän soñğı soraw:
-<blockquote><tt>$1</tt></blockquote>
-<tt>«$2»</tt> funksiäsennän.
-Baza <tt>«$3: $4»</tt> xatasın qaytardı.',
-'dberrortextcl' => 'Mäğlümatlar bazasına cibärelgän sorawda sintaksik xata tabıldı.
-Mäğlümatlar bazasına cibärelgän soñğı soraw:
-"$1"
-«$2» funksiäsennän.
-Baza «$3: $4» xatasın qaytardı.',
'laggedslavemode' => 'İğtibar: bittä soñğı yañartular kürsätelmägän bulırğa mömkin.',
'readonly' => 'Mäğlümatlar bazasına yazu yabılğan',
'enterlockreason' => 'Yabılu säbäben häm waqıtın kürsätegez.',
@@ -460,7 +444,6 @@ Soraw: $2',
'viewsourcetext' => 'Sez bu bitneñ başlanğıç tekstın qarıy häm küçerä alasız:',
'protectedinterface' => 'Bu bittä programma interfeysı xäbärläre bar. Vandalizmğa qarşı köräş säbäple, bu bitne üzgärtü tıyıla.',
'editinginterface' => "'''İğtibar:''' Sez MediaWiki sistemasınıñ interfeys biten üzgärtäsez. Bu başqa qullanuçılarğa da tä'sir itäçäk. Tärcemä öçen [//translatewiki.net/wiki/Main_Page?setlang=tt-latn translatewiki.net] lokalizatsiäläw proyektın qullanığız.",
-'sqlhidden' => '(SQL-soraw yäşerelgän)',
'cascadeprotected' => 'Bu bit üzgärtülärdän saqlanğan, çönki ul kaskadlı saqlaw qabul itelgän {{PLURAL:$1|bitkä|bitlärgä}} östälgän:
$2',
'namespaceprotected' => "'''$1''' isem kiñlegendäge bitlärne üzgärtü öçen sezneñ röxsätegez yuq.",
@@ -482,7 +465,6 @@ Qayber bitlär Sez kergän kebek kürsätelergä mömkin. Monı beterü öçen b
'yourpassword' => 'Sersüz:',
'yourpasswordagain' => 'Sersüzne qabat kertü:',
'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ü',
@@ -561,7 +543,7 @@ Yañadan qabatlağançı beraz kötüegez sorala.',
'newpassword' => 'Yaña sersüz:',
'retypenew' => 'Yaña sersüzne qabatlağız:',
'resetpass_submit' => 'Sersüz quyıp kerü',
-'resetpass_success' => 'Sezneñ sersüz uñışlı üzgärtelde! Sistemağa kerü başqarıla...',
+'changepassword-success' => 'Sezneñ sersüz uñışlı üzgärtelde! Sistemağa kerü başqarıla...',
'resetpass_forbidden' => 'Sersüz üzgärtelä almıy',
'resetpass-no-info' => 'Bu bitne qaraw öçen sez sistemağa üz xisap yazmağız yärdämendä kerergä tieş.',
'resetpass-submit-loggedin' => 'Sersüzne üzgärtü',
@@ -899,7 +881,6 @@ Sez idaräçe bulu säbäple, [$1 yäşerelgän yuramanı qarıy alasız]",
'viewprevnext' => 'Kürsätelüe: ($1 {{int:pipe-separator}} $2) ($3)',
'searchmenu-legend' => 'Ezläw köylänmäläre',
'searchmenu-new' => "'''«[[:$1]]» isemle yaña bit yasaw'''",
-'searchhelp-url' => 'Help:Eçtälek',
'searchmenu-prefix' => '[[Special:PrefixIndex/$1|Bu prefikslı bitlärne kürsätü]]',
'searchprofile-articles' => 'Töp bitlär',
'searchprofile-project' => 'Yärdäm häm proyektlar bite',
@@ -940,14 +921,6 @@ Barlıq alannarda (bäxäs bitläre, ürnäklär, h.b.) ezläw öçen ''all'' sÃ
'powersearch-togglenone' => 'Birni dä yuq',
'search-external' => 'Tışqı ezläw',
-# Quickbar
-'qbsettings' => 'Küçeşlär aslığı',
-'qbsettings-none' => 'Kürsätmäw',
-'qbsettings-fixedleft' => 'Sulda küçerelmäs',
-'qbsettings-fixedright' => 'Uñda küçerelmäs',
-'qbsettings-floatingleft' => 'Sulda yözmä',
-'qbsettings-floatingright' => 'Uñda yözmä',
-
# Preferences page
'preferences' => 'Köylänmälär',
'mypreferences' => 'Köylänmälärem',
@@ -975,7 +948,6 @@ Barlıq alannarda (bäxäs bitläre, ürnäklär, h.b.) ezläw öçen ''all'' sÃ
'resetprefs' => 'Saqlanmağan üzgärtülärne beterü',
'restoreprefs' => 'Baştağı köylänmälärne kire qaytaru',
'prefs-editing' => 'Üzgärtü',
-'prefs-edit-boxsize' => 'Üzgärtü täräzäseneñ zurlığı',
'rows' => 'Yullar:',
'columns' => 'BaÄŸanalar:',
'searchresultshead' => 'Ezläw',
@@ -986,7 +958,6 @@ Barlıq alannarda (bäxäs bitläre, ürnäklär, h.b.) ezläw öçen ''all'' sÃ
'recentchangesdays-max' => '( $1 {{PLURAL:$1|könnän}} dä artıq bulmasqa tieş)',
'recentchangescount' => 'Töp bularaq qullanuçı üzgärtülär sanı:',
'prefs-help-recentchangescount' => 'Üz öçenä üzgärtülärne, bitlärneñ tarixın häm yazlu köndälegen dä kertä.',
-'prefs-help-watchlist-token' => 'Älege yulnı sersüz belän tutıru sezneñ küzätü isemlegegezneñ RSS-tasmasın barlıqqa kiteräçäk. Mondağı sersüzne belüçe härber keşe sezneñ küzätü isemlegegezne qarıy ala, şuña kürä avtomatik räweştä yasalğan sersüzne qullanığız: $1',
'savedprefs' => 'Köylänmäläregez saqlandı.',
'timezonelegend' => 'Säğät poyası:',
'localtime' => 'Cirle waqıt',
@@ -1016,7 +987,6 @@ Barlıq alannarda (bäxäs bitläre, ürnäklär, h.b.) ezläw öçen ''all'' sÃ
'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ığı',
'youremail' => 'Elektron poçta:',
'username' => 'Qullanuçı iseme:',
'uid' => 'Qullanuçınıñ identifikatorı:',
@@ -1163,7 +1133,6 @@ Ul $1 {{PLURAL:$1|xäreftän}} kübräk bulırğa tieş tügel.',
'recentchangeslinked-feed' => 'Bäyläneşle üzgärtülär',
'recentchangeslinked-toolbox' => 'Bäyläneşle üzgärtülär',
'recentchangeslinked-title' => '"$1" bitenä bäyläneşle üzgärtülär',
-'recentchangeslinked-noresult' => 'Kürsätelgän waqıtta sıltaşqan bitlärneñ üzgärtelmäläre yuq ide.',
'recentchangeslinked-summary' => "Bu kürsätelgän bit belän sıltalğan (yä kürsätelgän törkemgä kertkän) bitlärneñ üzgärtelmäläre isemlege.
[[Special:Watchlist|Küzätü isemlegegezgä]] kerä torğan bitlär '''qalın'''.",
'recentchangeslinked-page' => 'Bitneñ iseme:',
@@ -1351,8 +1320,6 @@ PICT # törle
'statistics-users-active-desc' => '{{PLURAL:$1|$1 kön }} öçendä nindi dä bulsa üzgärtülär kertkän qullanuçılar',
'statistics-mostpopular' => 'İñ küp qaraluçı bitlär',
-'disambiguations' => 'Küp mäğnäle süzlär turında bitlär',
-
'doubleredirects' => 'İkelätä yünältülär',
'brokenredirects' => 'Bäyläneşsez yünältülär',
@@ -1720,7 +1687,6 @@ $1',
'ipb_expiry_invalid' => 'İskärü waqıtı xatalı.',
'ip_range_invalid' => 'Xatalı IP arası.',
'proxyblocker' => 'Proksi tıyu',
-'proxyblocksuccess' => 'Eşlände',
'sorbsreason' => 'Sezneñ IP adresığız DNSBLda açıq proksi dip sanala.',
# Developer tools
@@ -1893,13 +1859,8 @@ Zinhar başqa isem saylağız.',
'spamprotectiontitle' => 'Spam filtrı',
# Skin names
-'skinname-standard' => 'Klassik',
-'skinname-nostalgia' => 'İskä alu',
'skinname-cologneblue' => 'Zäñgär sağış',
'skinname-monobook' => 'Kitap',
-'skinname-myskin' => 'Ãœzem',
-'skinname-chick' => 'Çebi',
-'skinname-simple' => 'Ğädi',
'skinname-modern' => 'Zamana',
'skinname-vector' => 'Sızımlı',
@@ -1970,7 +1931,7 @@ Yulnıñ berençe sıltaması quyma öçen tıyılğan räsemgä sıltama bulır
* gpslongitude
* gpsaltitude',
-# EXIF tags
+# Exif tags
'exif-imagewidth' => 'Kiñlek',
'exif-imagelength' => 'Bieklek',
'exif-imagedescription' => 'Räsemneñ iseme',
@@ -2138,11 +2099,6 @@ Yulnıñ berençe sıltaması quyma öçen tıyılğan räsemgä sıltama bulır
'version-software-product' => 'Produkt',
'version-software-version' => 'Versiä',
-# Special:FilePath
-'filepath' => 'FaylÄŸa yul',
-'filepath-page' => 'Fayl:',
-'filepath-submit' => 'Küçü',
-
# Special:FileDuplicateSearch
'fileduplicatesearch-submit' => 'Ezläw',
diff --git a/languages/messages/MessagesTyv.php b/languages/messages/MessagesTyv.php
index 02be7746..8a1d47e4 100644
--- a/languages/messages/MessagesTyv.php
+++ b/languages/messages/MessagesTyv.php
@@ -24,57 +24,72 @@ $namespaceNames = array(
NS_SPECIAL => 'ТуÑкай',
NS_TALK => 'Чугаа',
NS_USER => 'Aжыглакчы',
- NS_USER_TALK => 'Aжыглакчы_чугаазы',
- NS_PROJECT_TALK => '$1_чугаазы',
+ NS_USER_TALK => 'Aжыглакчы_чугаа',
+ 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_CATEGORY => 'КатегориÑ',
- NS_CATEGORY_TALK => 'КатегориÑ_чугаазы',
+ NS_HELP_TALK => 'Дуза_чугаа',
+ NS_CATEGORY => 'Ðңгылал',
+ NS_CATEGORY_TALK => 'Ðңгылал_чугаа',
);
+$namespaceAliases = array(
+ 'Aжыглакчы_чугаазы' => NS_USER_TALK,
+ '$1_чугаазы' => NS_PROJECT_TALK,
+ 'Файл_чугаазы' => NS_FILE_TALK,
+ 'МедиаВики_чугаазы' => NS_MEDIAWIKI_TALK,
+ 'Майык_чугаазы' => NS_TEMPLATE_TALK,
+ 'Дуза_чугаазы' => NS_HELP_TALK,
+ 'КатегориÑ' => NS_CATEGORY,
+ 'КатегориÑ_чугаазы' => NS_CATEGORY_TALK,
+);
$magicWords = array(
- 'redirect' => array( '0', '#ШИГЛЕДИР', '#REDIRECT' ),
- 'notoc' => array( '0', '__ДОПЧУЗУЧОК__', '__NOTOC__' ),
- 'toc' => array( '0', '__ДОПЧУЗУ__', '__TOC__' ),
- 'currentmonth' => array( '1', 'ÐМГЫÐЙ', 'ÐМГЫÐЙ2', 'CURRENTMONTH', 'CURRENTMONTH2' ),
- 'currentmonth1' => array( '1', 'ÐМГЫÐЙ1', 'CURRENTMONTH1' ),
- 'currentmonthname' => array( '1', 'ÐМГЫÐЙÐЫҢÐДЫ', 'CURRENTMONTHNAME' ),
- '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' ),
- 'numberofpages' => array( '1', 'ÐРЫÐÐÐРÐЫҢСÐÐЫ', 'NUMBEROFPAGES' ),
- 'numberofarticles' => array( '1', 'ЧҮҮЛДЕРÐИҢСÐÐЫ', 'NUMBEROFARTICLES' ),
- 'numberoffiles' => array( '1', 'ФÐЙЛДÐРÐЫҢСÐÐЫ', 'NUMBEROFFILES' ),
- 'numberofusers' => array( '1', 'ÐЖЫГЛÐКЧЫЛÐРÐЫҢСÐÐЫ', 'NUMBEROFUSERS' ),
- 'numberofedits' => array( '1', 'ӨСКЕРЛИИШКИÐÐЕРÐИҢСÐÐЫ', 'NUMBEROFEDITS' ),
- 'pagename' => array( '1', 'ÐРЫÐÐЫҢÐДЫ', 'PAGENAME' ),
- 'namespace' => array( '1', 'ÐТТÐРДЕЛГЕМИ', 'NAMESPACE' ),
- 'namespacee' => array( '1', 'ÐТТÐРДЕЛГЕМИ2', 'NAMESPACEE' ),
+ 'redirect' => array( '0', '#көжүрүлге', '#ШИГЛЕДИР', '#перенаправление', '#перенапр', '#REDIRECT' ),
+ 'notoc' => array( '0', '__ЭГЕ_ЧОК__', '__БЕЗ_ОГЛÐВЛЕÐИЯ__', '__БЕЗ_ОГЛ__', '__NOTOC__' ),
+ 'nogallery' => array( '0', '__ГÐЛЕРЕЯ_ЧОК__', '__БЕЗ_ГÐЛЕРЕИ__', '__NOGALLERY__' ),
+ 'forcetoc' => array( '0', '__ÐЛБÐÐ_ЭГЕ__', '__ОБЯЗÐТЕЛЬÐОЕ_ОГЛÐВЛЕÐИЕ__', '__ОБЯЗ_ОГЛ__', '__FORCETOC__' ),
+ 'toc' => array( '0', '__ДОПЧУ__', '__ОГЛÐВЛЕÐИЕ__', '__ОГЛ__', '__TOC__' ),
+ 'noeditsection' => array( '0', '__ҮЛЕГ_ЭДИЛГЕЗИ_ЧОК__', '__БЕЗ_РЕДÐКТИРОВÐÐИЯ_РÐЗДЕЛÐ__', '__NOEDITSECTION__' ),
+ 'currentmonth' => array( '1', '__ÐМГЫ_ÐЙ', '__ÐМГЫ_ÐЙ_2__', 'ТЕКУЩИЙ_МЕСЯЦ', 'ТЕКУЩИЙ_МЕСЯЦ_2', 'CURRENTMONTH', 'CURRENTMONTH2' ),
+ 'currentmonth1' => array( '1', '__ÐМГЫ_ÐЙ_1__', 'ТЕКУЩИЙ_МЕСЯЦ_1', 'CURRENTMONTH1' ),
+ 'currentmonthname' => array( '1', 'ÐМГЫÐЙÐЫҢÐДЫ', 'ÐÐЗВÐÐИЕ_ТЕКУЩЕГО_МЕСЯЦÐ', 'CURRENTMONTHNAME' ),
+ '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' ),
+ 'numberofpages' => array( '1', 'ÐРЫÐÐÐРÐЫҢСÐÐЫ', 'КОЛИЧЕСТВО_СТРÐÐИЦ', 'NUMBEROFPAGES' ),
+ 'numberofarticles' => array( '1', 'ЧҮҮЛДЕРÐИҢСÐÐЫ', 'КОЛИЧЕСТВО_СТÐТЕЙ', 'NUMBEROFARTICLES' ),
+ 'numberoffiles' => array( '1', 'ФÐЙЛДÐРÐЫҢСÐÐЫ', 'КОЛИЧЕСТВО_ФÐЙЛОВ', 'NUMBEROFFILES' ),
+ 'numberofusers' => array( '1', 'ÐЖЫГЛÐКЧЫЛÐРÐЫҢСÐÐЫ', 'КОЛИЧЕСТВО_УЧÐСТÐИКОВ', 'NUMBEROFUSERS' ),
+ 'numberofedits' => array( '1', 'ӨСКЕРЛИИШКИÐÐЕРÐИҢСÐÐЫ', 'КОЛИЧЕСТВО_ПРÐВОК', 'NUMBEROFEDITS' ),
+ 'pagename' => array( '1', 'ÐРЫÐÐЫҢÐДЫ', 'ÐÐЗВÐÐИЕ_СТРÐÐИЦЫ', 'PAGENAME' ),
+ 'namespace' => array( '1', 'ÐТТÐРДЕЛГЕМИ', 'ПРОСТРÐÐСТВО_ИМÐÐ', 'NAMESPACE' ),
+ 'namespacee' => array( '1', 'ÐТТÐРДЕЛГЕМИ2', 'ПРОСТРÐÐСТВО_ИМÐÐ_2', 'NAMESPACEE' ),
'namespacenumber' => array( '1', 'ÐТТÐРДЕЛГЕМИÐИҢСÐÐЫ', 'NAMESPACENUMBER' ),
- 'talkspace' => array( '1', 'ЧУГÐÐДЕЛГЕМИ', 'TALKSPACE' ),
- 'talkspacee' => array( '1', 'ЧУГÐÐДЕЛГЕМИ2', 'TALKSPACEE' ),
- 'img_right' => array( '1', 'оң', 'right' ),
- 'img_left' => array( '1', 'Ñолагай', 'left' ),
- 'img_center' => array( '1', 'төп', 'center', 'centre' ),
- 'sitename' => array( '1', 'СÐЙТТЫҢÐДЫ', 'SITENAME' ),
- 'ns' => array( '0', 'ÐД:', 'NS:' ),
- 'nse' => array( '0', 'ÐД2:', 'NSE:' ),
- 'currentweek' => array( '1', 'ÐМГЫЧЕДИХОÐУК', 'CURRENTWEEK' ),
- 'currentdow' => array( '1', 'ÐМГЫЧЕДИХОÐУКТУҢХҮÐÒ®', 'CURRENTDOW' ),
- 'raw' => array( '0', 'ЧИГ:', 'RAW:' ),
- 'language' => array( '0', '#ДЫЛ:', '#LANGUAGE:' ),
- 'special' => array( '0', 'туÑкай', 'special' ),
- 'tag' => array( '0', 'демдек', 'tag' ),
+ 'talkspace' => array( '1', 'ЧУГÐÐДЕЛГЕМИ', 'ПРОСТРÐÐСТВО_ОБСУЖДЕÐИЙ', 'TALKSPACE' ),
+ 'talkspacee' => array( '1', 'ЧУГÐÐДЕЛГЕМИ2', 'ПРОСТРÐÐСТВО_ОБСУЖДЕÐИЙ_2', 'TALKSPACEE' ),
+ 'img_right' => array( '1', 'оң', 'Ñправа', 'right' ),
+ 'img_left' => array( '1', 'Ñолагай', 'Ñлева', 'left' ),
+ 'img_center' => array( '1', 'төп', 'центр', 'center', 'centre' ),
+ 'sitename' => array( '1', 'СÐЙТТЫҢÐДЫ', 'ÐÐЗВÐÐИЕ_СÐЙТÐ', 'SITENAME' ),
+ 'ns' => array( '0', 'ÐД:', 'ПИ:', 'NS:' ),
+ 'nse' => array( '0', 'ÐД2:', 'ПИК:', 'NSE:' ),
+ 'currentweek' => array( '1', 'ÐМГЫЧЕДИХОÐУК', 'ТЕКУЩÐЯ_ÐЕДЕЛЯ', 'CURRENTWEEK' ),
+ 'currentdow' => array( '1', 'ÐМГЫЧЕДИХОÐУКТУҢХҮÐÒ®', 'ТЕКУЩИЙ_ДЕÐЬ_ÐЕДЕЛИ', 'CURRENTDOW' ),
+ 'raw' => array( '0', 'ЧИГ:', 'ÐЕОБРÐБ:', 'RAW:' ),
+ 'language' => array( '0', '#ДЫЛ:', '#ЯЗЫК:', '#LANGUAGE:' ),
+ 'special' => array( '0', 'туÑкай', 'ÑлужебнаÑ', 'special' ),
+ 'tag' => array( '0', 'демдек', 'метка', 'тег', 'Ñ‚Ñг', 'tag' ),
+ 'hiddencat' => array( '1', '__ЧÐЖЫТ_ÐҢГЫЛÐЛ__', '__СКРЫТÐЯ_КÐТЕГОРИЯ__', '__HIDDENCAT__' ),
+ 'pagesincategory' => array( '1', '__ÐҢГЫЛÐЛ_ÐРЫÐÐÐРЫ__', 'СТРÐÐИЦ_Ð’_КÐТЕГОРИИ', 'PAGESINCATEGORY', 'PAGESINCAT' ),
'pagesincategory_all' => array( '0', 'шупту', 'all' ),
'pagesincategory_pages' => array( '0', 'арыннар', 'pages' ),
'pagesincategory_files' => array( '0', 'файлдар', 'files' ),
@@ -281,7 +296,7 @@ $messages = array(
'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).
+# 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).
'aboutsite' => '{{SITENAME}} дугайында',
'aboutpage' => 'Project:Дугайында',
'copyrightpage' => '{{ns:project}}:Чогаалчының Ñргелери',
@@ -290,7 +305,6 @@ $messages = array(
'disclaimers' => 'Ðжыглаар харыÑаалгазын чөрчүүрү (ойталаары)',
'disclaimerpage' => 'Project:Ðжыглаар харыÑаалгазын ойталаары',
'edithelp' => 'Эдеринге дуза',
-'edithelppage' => 'Help:Эдери',
'helppage' => 'Help:Допчузу',
'mainpage' => 'Кол Ðрын',
'mainpage-description' => 'Кол Ðрын',
@@ -368,7 +382,6 @@ $messages = array(
Ðдында Ñ‚Ð°Ð°Ñ€Ñ‹ÑˆÐ¿Ð°Ñ Ð´ÐµÐ¼Ð´ÐµÐºÑ‚ÐµÑ€ бары чадапчок.',
'viewsource' => 'Дөзүн көөрү',
'actionthrottled' => 'ШеглÑÑн дүрген',
-'sqlhidden' => '(SQL айтырыгны чажырган)',
'exception-nologin' => 'КирбеÑ',
# Login and logout pages
@@ -593,7 +606,6 @@ Please check if you want to create/edit this page.',
'viewprevnext' => '($1 {{int:pipe-separator}} $2) ($3) көөрү',
'searchmenu-exists' => "'''Бо викиде \"[[:\$1]]\" деп арын бар.'''",
'searchmenu-new' => "'''Бо викиде «[[:$1]]» арынны чогаадыры'''",
-'searchhelp-url' => 'Help:Допчузу',
'searchprofile-articles' => 'үндезин арыннар',
'searchprofile-project' => 'Төлевилел биле дуза арыннары',
'searchprofile-images' => 'Мультимедиа',
@@ -638,7 +650,6 @@ Please check if you want to create/edit this page.',
'saveprefs' => 'Шыгжаары',
'restoreprefs' => 'Шупту баштайгы ниити шилилгелерни restore',
'prefs-editing' => 'Ó¨Ñкертир',
-'prefs-edit-boxsize' => 'Ó¨Ñкертир көзенектиң хемчÑÑли.',
'rows' => 'Одуруглар:',
'columns' => 'Баганалар:',
'searchresultshead' => 'ДилÑÑÑ€',
@@ -656,7 +667,6 @@ Please check if you want to create/edit this page.',
'prefs-files' => 'файлдар',
'prefs-custom-css' => 'Бодуңар CSS',
'prefs-custom-js' => 'Бодуңар JavaScript',
-'prefs-textboxsize' => 'Ó¨Ñкертир көзенектиң хемчÑÑли',
'youremail' => 'Э-чагааңар:',
'username' => 'Aжыглакчының ады:',
'uid' => 'Ðжыглакчынын Ñаны (ID):',
@@ -767,7 +777,6 @@ It must not be more than $1 {{PLURAL:$1|character|characters}} long.',
'recentchangeslinked' => 'Хамааржыр Ó©Ñкерлиишкиннер',
'recentchangeslinked-toolbox' => 'Хамааржыр Ó©Ñкерлиишкиннер',
'recentchangeslinked-title' => '«$1» деп арынга хамаарыштырган Ó©Ñкерлиишкиннер',
-'recentchangeslinked-noresult' => 'Холбаштырган арыннарда айыткан үе иштинде кандыг-даа Ó©Ñкертилге турбаан.',
'recentchangeslinked-summary' => "Ðйыткан арынның (азы айыткан аңгылалга хамаарышкан) шөлүлүглериниң чедер арыннарнының чаа Ó©Ñкерилгер даңзызы.
[[Special:Watchlist|Силерниң хайгаарал даңзызынче]] кирип турар арыннарны '''ылгап каан'''.",
'recentchangeslinked-page' => 'Ðрынның ады:',
@@ -860,8 +869,6 @@ It must not be more than $1 {{PLURAL:$1|character|characters}} long.',
'statistics' => 'СтатиÑтика',
'statistics-pages' => 'Ðрыннар',
-'disambiguationspage' => 'Майык: уш-бажы билдинмеÑ',
-
'brokenredirects-edit' => 'Ó©Ñкертири',
'brokenredirects-delete' => 'ырадыры',
@@ -1195,13 +1202,8 @@ It must not be more than $1 {{PLURAL:$1|character|characters}} long.',
'anonymous' => '{{grammar:genitive|{{SITENAME}}}} ат ÑÐ²ÐµÑ {{PLURAL:$1|ажыглакчызы|ажыглакчылары}}',
# Skin names
-'skinname-standard' => 'КлаÑÑик',
-'skinname-nostalgia' => 'ÐоÑтальгиÑ',
'skinname-cologneblue' => 'Cologne Blue',
'skinname-monobook' => 'МоноБук',
-'skinname-myskin' => 'МайСкин',
-'skinname-chick' => 'Чикк',
-'skinname-simple' => 'Симпел',
'skinname-modern' => 'Модерн',
'skinname-vector' => 'Вектор',
@@ -1262,7 +1264,7 @@ It must not be more than $1 {{PLURAL:$1|character|characters}} long.',
* gpslongitude
* gpsaltitude',
-# EXIF tags
+# Exif tags
'exif-imagewidth' => 'Калбаа',
'exif-imagelength' => 'Бедик',
'exif-imagedescription' => 'Чуруктуң ады',
@@ -1340,10 +1342,6 @@ It must not be more than $1 {{PLURAL:$1|character|characters}} long.',
'version-other' => 'Ó¨Ñке',
'version-software-version' => 'Үндүрери',
-# Special:FilePath
-'filepath-page' => 'Файл:',
-'filepath-submit' => 'Күүcедири',
-
# Special:FileDuplicateSearch
'fileduplicatesearch-filename' => 'Файлдың ады:',
'fileduplicatesearch-submit' => 'ДилÑÑри',
diff --git a/languages/messages/MessagesUdm.php b/languages/messages/MessagesUdm.php
index 9f2d03fe..ac03870d 100644
--- a/languages/messages/MessagesUdm.php
+++ b/languages/messages/MessagesUdm.php
@@ -23,8 +23,8 @@ $namespaceNames = array(
NS_USER => 'Викиавтор',
NS_USER_TALK => 'Викиавтор_ÑÑрыÑÑŒ_вераÑькон',
NS_PROJECT_TALK => '$1_ÑÑрыÑÑŒ_вераÑькон',
- NS_FILE => 'Суред',
- NS_FILE_TALK => 'Суред_ÑÑрыÑÑŒ_вераÑькон',
+ NS_FILE => 'Файл',
+ NS_FILE_TALK => 'Файл_ÑÑрыÑÑŒ_вераÑькон',
NS_MEDIAWIKI => 'MediaWiki',
NS_MEDIAWIKI_TALK => 'MediaWiki_ÑÑрыÑÑŒ_вераÑькон',
NS_TEMPLATE => 'Шаблон',
@@ -35,6 +35,11 @@ $namespaceNames = array(
NS_CATEGORY_TALK => 'КатегориÑ_ÑÑрыÑÑŒ_вераÑькон',
);
+$namespaceAliases = array(
+ 'Суред' => NS_FILE,
+ 'Суред_ÑÑрыÑÑŒ_вераÑькон' => NS_FILE_TALK,
+);
+
// Remove Russian aliases
$namespaceGenderAliases = array();
@@ -57,7 +62,7 @@ $messages = array(
'tog-editsectiononrightclick' => 'CекциоÑÑ‚Ñ‹ шырлÑн бур кнопкаез заголовок вылын зӥбиÑькыкуз тупатыны (JavaScript кулÑ)',
'tog-showtoc' => 'ПуштроÑÑз возьматоно (2-лÑÑÑŒ Ñ‚Ñ€Ð¾Ñ Ð·Ð°Ð³Ð¾Ð»Ð¾Ð²Ð¾ÐºÑŠÐµÐ¼ Ð±Ð°Ð¼ÑŠÑ‘Ñ Ð¿Ð¾Ð½Ð½Ð°)',
'tog-rememberpassword' => 'Мынам пыроннимме та браузерлÑн тодаз возьыны ($1 Ñке $1-лÑÑÑŒ Ó§Ð¶Ñ‹Ñ‚Ð³ÐµÑ Ð½ÑƒÐ½Ð°Ð» ӵоже гинÑ)',
-'tog-watchcreations' => 'МынÑÑьтым кылдытÑм бамъёÑме но Óуткам файлъёÑме чаклан ÑпиÑокам пыртыны',
+'tog-watchcreations' => 'БамъёÑÑ‚Ñ‹, кудъёÑÑ‚ÑÑ Ð¼Ð¾Ð½ кылдытӥÑько, мынам чаклкан ÑпиÑокам пыртыны',
'tog-watchdefault' => 'БамъёÑÑ‚Ñ‹, кудъёÑÑ‚ÑÑ Ð¼Ð¾Ð½ тупатӥÑько, мынам чаклкан ÑпиÑокам пыртыны',
'tog-watchmoves' => 'БамъёÑÑ‚Ñ‹, кудъёÑÑ‚ÑÑ Ð¼Ð¾Ð½ мукет интые выжтӥÑько, мынам чаклкан ÑпиÑокам пыртыны',
'tog-watchdeletion' => 'БамъёÑÑ‚Ñ‹, кудъёÑÑ‚ÑÑ Ð¼Ð¾Ð½ ӵушиÑько, мынам чаклкан ÑпиÑоке пыртыны',
@@ -129,7 +134,7 @@ $messages = array(
'dec' => 'Ñ‚ÑÑ‚',
# Categories related messages
-'pagecategories' => '{{PLURAL:$1|КатегориÑ|КатегориоÑ}}',
+'pagecategories' => '$1 категориÑ',
'category_header' => '«$1» категориыÑÑŒ бамъёÑ',
'subcategories' => 'ПодкатегориоÑ',
'category-media-header' => '«$1» категориыÑÑŒ файлъёÑ',
@@ -146,7 +151,7 @@ $messages = array(
'index-category' => 'ИндекÑировать кароно бамъёÑ',
'noindex-category' => 'ИндекÑировать каронтÑм бамъёÑ',
-'linkprefix' => '/^(.*?)(„|«)$/sDu',
+'linkprefix' => '/^((?>.*(?<!(?:„|«)$)))(.+)$/sDu',
'about' => 'Та ÑÑрыÑÑŒ',
'article' => 'СтатьÑ',
@@ -216,10 +221,9 @@ $messages = array(
'viewsource' => 'ÐšÐ¾Ð´Ð·Ñ ÑƒÑ‡ÐºÑ‹Ð½Ñ‹',
# Login and logout pages
-'login' => 'Пырон',
+'login' => 'Википедие пырон',
'nav-login-createaccount' => 'ÐимдÑÑ Ð²ÐµÑ€Ð°Ð½Ñ‹ / РегиÑтрациез ортчытыны',
'userlogin' => 'РегиÑтрациез ортчытыны Ñке Википедие пырыны',
-'userloginnocreate' => 'Пырон',
'logout' => 'Кошкыны',
'userlogout' => 'Кошкыны',
'createaccount' => 'выль вики-авторлÑн региÑтрациез',
@@ -269,7 +273,7 @@ $messages = array(
'nbytes' => '$1 байт',
'move' => 'Мукет интые выжтыны',
-# Email user
+# E-mail user
'emailmessage' => 'Ивортон:',
# Watchlist
diff --git a/languages/messages/MessagesUg_arab.php b/languages/messages/MessagesUg_arab.php
index b2af2074..16c052b3 100644
--- a/languages/messages/MessagesUg_arab.php
+++ b/languages/messages/MessagesUg_arab.php
@@ -22,17 +22,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_MEDIAWIKI_TALK => 'MediaWiki مۇنازىرىسى',
+ NS_FILE_TALK => 'ھۆججەت_مۇنازىرىسى',
+ 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(
+ 'مۇنازىرىسى$1' => NS_PROJECT_TALK,
+);
+
+$specialPageAliases = array(
+ 'Allmessages' => array( 'بارلىق_خەۋەرلەر' ),
+ 'Allpages' => array( 'بارلىق_بەتلەر' ),
+ 'Ancientpages' => array( 'كونا_بەتلەر' ),
);
$messages = array(
@@ -66,10 +76,6 @@ $messages = array(
'tog-shownumberswatching' => 'بۇ بەتنى كۆزىتىۋاتقان ئىشلەتكۈچى سانىنى كۆرسەت',
'tog-oldsig' => 'نۆۋەتتىكى ئىمزا:',
'tog-fancysig' => 'ئىمزاغا wiki تÛكستى سۈپىتىدە مۇئامىلە قىل (ئۆزلۈكىدىن ئۇلانما ھاسىل بولمايدۇ)',
-'tog-externaleditor' => 'كۆڭۈلدىكى ئەھۋالدا سىرتقى تەھرىرلىگۈچ ئىشلىتىدۇ (ئالىي ئىشلەتكۈچىگە تەمىنلىنىدۇ، كومپيۇتÛرىڭىزدا بىر قىسىم ئالاھىدە تەڭشەش ئÛلىپ بÛرىشىڭىز لازىم
-[//www.mediawiki.org/wiki/Manual:External_editors تÛخىمۇ ÙƒÛ†Ù¾ ئۇچۇر.])',
-'tog-externaldiff' => 'كۆڭۈلدىكى ئەھۋالدا سىرتقى پەرق تەھلىلى ئىشلىتىدۇ (ئالىي ئىشلەتكۈچىگە تەمىنلىنىدۇ، كومپيۇتÛرىڭىزدا بىر قىسىم ئالاھىدە تەڭشەش ئÛلىپ بÛرىشىڭىز لازىم. [//www.mediawiki.org/wiki/Manual:External_editors تÛخىمۇ ÙƒÛ†Ù¾ ئۇچۇر.])',
-'tog-showjumplinks' => '"ئاتلا" زىيارەت ئۇلانمىسىنى قوزغات',
'tog-uselivepreview' => 'رىئال ۋاقىتلىق ئالدىن كۆزىتىشنى ئىشلەت (JavaScript زۆرۈر) (سىناق)',
'tog-forceeditsummary' => 'ئۈزۈندە كىرگۈزمىگەندە Ù…Ûنى ئەسكەرت',
'tog-watchlisthideown' => 'كۆزەت تىزىملىكىدىن Ù…Ûنىڭ تەھرىرلىگىنىمنى يوشۇر',
@@ -167,7 +173,7 @@ $messages = array(
'broken-file-category' => 'ھۆججەت ئۇلىنىشى بۇزۇلغان بەتلەر',
'categoryviewer-pagedlinks' => '($1) ($2)',
-'linkprefix' => '/^(.*?)([a-zA-Z\\x80-\\xff]+)$/sD',
+'linkprefix' => '/^((?>.*(?<![a-zA-Z\\x80-\\xff])))(.+)$/sD',
'about' => 'ھەققىدە',
'article' => 'مۇندەرىجە',
@@ -273,7 +279,7 @@ $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).
+# 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).
'aboutsite' => '{{SITENAME}} ھەققىدە',
'aboutpage' => 'Project:ھەققىدە',
'copyright' => 'بۇ بÛكەتتىكى بارلىق تÛكست مەزمۇنى $1 ماددىسىغا ئاساسەن تەمىنلىنىدۇ.',
@@ -283,7 +289,6 @@ $1',
'disclaimers' => 'جاۋابكارلىقنى كەچۈرۈم قىلىش باياناتى',
'disclaimerpage' => 'Project:ئادەتتىكى جاۋابكارلىقنى كەچۈرۈم قىلىش باياناتى',
'edithelp' => 'تەھرىرلەش ياردىمى',
-'edithelppage' => 'Help:تەھرىرلەۋاتىدۇ',
'helppage' => 'Help:مەزمۇنلار',
'mainpage' => 'باش بەت',
'mainpage-description' => 'باش بەت',
@@ -316,7 +321,6 @@ $1',
'newmessagesdifflinkplural' => 'ئاخىرقى $1 {{PLURAL:$1|ئۆزگەرتىش|ئۆزگەرتىش}}',
'youhavenewmessagesmulti' => '$1 ÙŠÛÚ­Ù‰ ئۇچۇرىڭىز بار',
'editsection' => 'تەھرىر',
-'editsection-brackets' => '[$1]',
'editold' => 'تەھرىر',
'viewsourceold' => 'مەنبەنى كۆرسەت',
'editlink' => 'تەھرىر',
@@ -371,17 +375,6 @@ URL نى خاتا كىرگۈزۈپ قالدىڭىز ياكى خاتا ئۇلان
# General errors
'error' => 'خاتالىق',
'databaseerror' => 'ساندان خاتالىقى',
-'dberrortext' => 'ساندان سۈرۈشتۈرۈشتە گرامماتىكىلىق خاتالىق يۈز بەردى.
-يۇمشاق دÛتالنىڭ ئۆزىدىكى خاتالىقتىن ÙƒÛلىپ چىققان بولۇشى مۇمكىن.
-ئاخىرقى Ù‚Ûتىملىق ساندان سۈرۈشتۈرۈش بۇيرۇقى:
-<blockquote><code>$1</code></blockquote>
- "<code>$2</code>"Ùۇنكسىيىدىن ÙƒÛ•Ù„Ú¯Û•Ù†.
-ساندان قايتۇرغان خاتالىق "<samp>$3: $4</samp>".',
-'dberrortextcl' => 'ساندان سۈرۈشتۈرۈشتە گرامماتىكىلىق خاتالىق يۈز بەردى.
-ئاخىرقى Ù‚Ûتىملىق ساندان سۈرۈشتۈرۈش بۇيرۇقى:
-"$1"
-"$2" Ùۇنكسىيىدىن ÙƒÛ•Ù„Ú¯Û•Ù†.
-MySQL قايتۇرغان خاتالىقى"$3: $4"',
'laggedslavemode' => 'ئاگاھلاندۇرۇش: بەت ÙŠÛقىنقى ÙŠÛڭىلاشنى ئۆز ئىچىگە ئالمىغان بولۇشى مۇمكىن.',
'readonly' => 'ساندان قۇلۇپلانغان',
'enterlockreason' => 'قۇلۇپلىنىش سەۋەبىنى كىرگۈزۈڭ، قايتا ئÛچىشنىڭ مۆلچەر ۋاقتىنىمۇ ئۆز ئىچىگە ئالىدۇ',
@@ -446,7 +439,6 @@ MySQL قايتۇرغان خاتالىقى"$3: $4"',
بۇ بەت ئۆزگەرتىلسە باشقا ئىشلەتكۈچىلەرنىڭ كۆرۈنۈش ئۇسلۇبىغا تەسىر كۆرسىتىدۇ.
مەسىلەن ئەگەر تەرجىمە قىلسىڭىز [//translatewiki.net/wiki/Main_Page?setlang=ug translatewiki.net] ئۇنداقتا MediaWiki يەرلىكلەشتۈرۈش پىلانىنى ئىشلىتىشنى ئويلىشىڭ.",
-'sqlhidden' => '(SQL سۈرۈشتۈرۈش يوشۇرۇلدى)',
'cascadeprotected' => 'بۇ بەت قوغدالغان چۈنكى تۆۋەندىكى {{PLURAL:$1|بىر|بىر قانچە}} بەت مەزكۇر بەتنى ئۆز ئىچىگە ئÛلىش بىلەن بىللە "زەنجىرسىمان قوغداش" قوزغىتىلغان.
$2',
@@ -483,7 +475,6 @@ $2',
'yourpassword' => 'ئىم:',
'yourpasswordagain' => 'ئاچقۇچنى قايتا بەسىڭ:',
'remembermypassword' => 'بۇ كومپيۇتÛردا كىرگىنىمنى ئەستە ساقلا(ئەڭ ئۇزۇن بولغاندا $1 {{PLURAL:$1|ÙƒÛˆÙ†|ÙƒÛˆÙ†}})',
-'securelogin-stick-https' => 'تىزىمغا كىرگەندىن ÙƒÛيىن HTTPS باغلىنىشنى داۋاملاشتۇر',
'yourdomainname' => 'دائىرە ئاتىڭىز:',
'password-change-forbidden' => 'بۇ ۋىكىدىكى ئىمنى ئۆزگەرتەلمەيسىز.',
'externaldberror' => 'بۇ سانداننى دەلىللەش خاتالىقى ياكى سىرتقى Ú¾Ûساباتىڭىزنى ÙŠÛڭىلاشنى چەكلىگەنلىكتىن بولغان بولۇشى مۇمكىن.',
@@ -601,7 +592,7 @@ cookies نى قوزغاتقانلىقىڭىزنى جەزملەڭ، بۇ بەتن
'newpassword' => 'ÙŠÛÚ­Ù‰ ئىم:',
'retypenew' => 'ÙŠÛÚ­Ù‰ ئىمنى قايتا كىرگۈزۈڭ:',
'resetpass_submit' => 'ئىم بەلگىلەپ تىزىمغا كىرىڭ',
-'resetpass_success' => 'سىز ئىمنى مۇۋەپپەقىيەتلىك ئۆزگەرتتىڭىز!
+'changepassword-success' => 'سىز ئىمنى مۇۋەپپەقىيەتلىك ئۆزگەرتتىڭىز!
تىزىمغا كىرىۋاتىسىز…',
'resetpass_forbidden' => 'ئىمنى ئۆزگەرتەلمىدى',
'resetpass-no-info' => 'سىز تىزىمغا كىرگەندىن ÙƒÛيىن بىۋاسىتە بۇ بەتكە كىرىشىڭىز لازىم.',
@@ -614,10 +605,8 @@ cookies نى قوزغاتقانلىقىڭىزنى جەزملەڭ، بۇ بەتن
# Special:PasswordReset
'passwordreset' => 'ئىمنى ئەسلىگە قايتۇرماق',
-'passwordreset-text' => 'بۇ جەدۋەل تاماملانسا Ú¾Ûسابات تەپسىلاتىڭىزنى ئÛلخەتىڭىزدە تاپشۇرۇۋالىسىز.',
'passwordreset-legend' => 'ئىمنى ئەسلىگە قايتۇرماق',
'passwordreset-disabled' => 'بۇ ۋىكىدا ئىمنى ئەسلىگە قايتۇرۇش چەكلەنگەن.',
-'passwordreset-pretext' => '{{PLURAL:$1||تۆۋەندىكى سانلىق مەلۇماتتىن بىرنى كىرگۈزۈڭ}}',
'passwordreset-username' => 'ئىشلەتكۈچى ئاتى:',
'passwordreset-domain' => 'دائىرە:',
'passwordreset-capture' => 'ھاسىل قىلىنغان ئÛلخەتنى كۆرسىتەمدۇ؟',
@@ -1112,7 +1101,6 @@ $1",
'searchmenu-legend' => 'ئىزدەش تاللانما',
'searchmenu-exists' => "'''بۇ wiki دا \"[[:\$1]]\" ئاتلىق بەت بار '''",
'searchmenu-new' => "'''بۇ wiki دا \"[[:\$1]]\" ئاتلىق بەت قۇر!'''",
-'searchhelp-url' => 'Help:مەزمۇنلار',
'searchmenu-prefix' => '[[Special:PrefixIndex/$1| بۇنى ئالدى قوشۇلغۇچى قىلغان بەتكە كۆز يۈگۈرت ]]',
'searchprofile-articles' => 'مەزمۇن بÛتى',
'searchprofile-project' => 'ياردەم ۋە قۇرۇلۇش بەتلەر',
@@ -1156,15 +1144,6 @@ $1",
'searchdisabled' => '{{SITENAME}} نىڭ ئىزدىشى چەكلەنگەن. سىز ھازىرچە Google ئىشلىتىپ ئىزدەپ تۇرۇڭ،.
دىققەت ئۇلار ئىندÛكسلىغان {{SITENAME}} مەزمۇنىنىڭ ۋاقتى ئۆتكەن بولۇشى مۇمكىن.',
-# Quickbar
-'qbsettings' => 'تÛز يولباشچى ستونى',
-'qbsettings-none' => 'يوق',
-'qbsettings-fixedleft' => 'سول تەرەپ مۇقىم',
-'qbsettings-fixedright' => 'ئوڭ تەرەپ مۇقىم',
-'qbsettings-floatingleft' => 'سول تەرەپ لەيلىمە',
-'qbsettings-floatingright' => 'ئوڭ تەرەپ لەيلىمە',
-'qbsettings-directionality' => 'تىلىڭىزدىكى تÛكىست Û‹Û• قوليازمىنىڭ يۆنىلىشىگە ئاساسەن مۇقىملاشتۇرىدۇ.',
-
# Preferences page
'preferences' => 'مايىللىق',
'mypreferences' => 'مايىللىق',
@@ -1197,7 +1176,6 @@ $1",
'resetprefs' => 'ساقلىمىغان ئۆزگەرتىشلەرنى تازىلا',
'restoreprefs' => 'بارلىق كۆڭۈلدىكى تەڭشەكنى ئەسلىگە كەلتۈر',
'prefs-editing' => 'تەھرىرلەۋاتىدۇ',
-'prefs-edit-boxsize' => 'تەھرىرلەش كۆزنىكىنىڭ چوڭلۇقى',
'rows' => 'قۇر:',
'columns' => 'ستون:',
'searchresultshead' => 'ئىزدە',
@@ -1208,9 +1186,6 @@ $1",
'recentchangesdays-max' => 'ئەڭ چوڭ $1 {{PLURAL:$1|كۈن|كۈن}}',
'recentchangescount' => 'كۆرسىتىدىغان تەھرىرنىڭ كۆڭۈلدىكى سانى:',
'prefs-help-recentchangescount' => 'بۇ ÙŠÛقىنقى ئۆزگەرتىش، بەت تارىخى Û‹Û• خاتىرىنى ئۆز ئىچىگە ئالىدۇ،',
-'prefs-help-watchlist-token' => 'بۇ سۆز بۆلىكىگە تولدۇرغان شىÙىرلىق ئاچقۇچ كۆزەت تىزىملىكىڭىزنىڭ RSS قانىلىنى ھاسىل قىلالايدۇ.
-بۇ سۆز بۆلىكىنىڭ شىÙىرلىق ئاچقۇچىنى بىلىدىغان ھەر قانداق كىشى سىزنىڭ كۆزەت تىزىملىكىڭىزنى ئوقۇيالايدۇ، شۇڭلاشقا بىخەتەر قىممەت ئىشلىتىڭ.
-بۇ جايدا ئىختىيارى ھاسىل قىلىنغان سانلىق قىممەت پايدىلىنىشىڭىز ئۈچۈن تەمىنلەندى: $1',
'savedprefs' => 'مايىللىق تەڭشىكىڭىز ساقلاندى.',
'timezonelegend' => 'ۋاقىت رايونى:',
'localtime' => 'يەرلىك ۋاقىت:',
@@ -1241,7 +1216,6 @@ $1",
'prefs-reset-intro' => 'سىز بۇ بەتنى ئىشلىتىپ تەڭشەكلىرىڭىزنى تور بÛكەتنىڭ كۆڭۈلدىكى قىممىتىگە تەڭشىيەلەيسىز.
بۇ مەشغۇلاتتىن يانغىلى بولمايدۇ.',
'prefs-emailconfirm-label' => 'ئÛلخەت جەزملەش:',
-'prefs-textboxsize' => 'تەھرىر كۆزنەك چوڭلۇقى',
'youremail' => 'ئÛلخەت:',
'username' => '{{GENDER:$1|ئىشلەتكۇچى ئىسمى}}:',
'uid' => '{{GENDER:$1|ئىشلەتكۇچى}} كىملىك:',
@@ -1492,7 +1466,6 @@ HTML بەلگىسىنى تەكشۈرۈڭ.',
'recentchangeslinked-feed' => 'مۇناسىۋەتلىك ئۆزگەرتىشلەر',
'recentchangeslinked-toolbox' => 'مۇناسىۋەتلىك ئۆزگەرتىشلەر',
'recentchangeslinked-title' => '"$1" مۇناسىۋەتلىك ئۇلانما ئۆزگەردى',
-'recentchangeslinked-noresult' => 'بÛرىلگەن ۋاقىتتا ئۇلانغان بەتلەردە ئۆزگىرىش يوق.',
'recentchangeslinked-summary' => "بۇ ئالاھىدە بەت يۈزى كۆرسەتكەن بەتتىن ئۇلىنىپ چىققان ÙŠÛقىنقى ئۆزگەرتىش تىزىملىكى (ياكى ئالاھىدە تۈرنىڭ ئەزاسى).
[[Special:Watchlist|كۆزەت تىزىملىكىڭىز]] دىكى بەت يۈزى '''توم''' كۆرسىتىلىدۇ.",
'recentchangeslinked-page' => 'بەت ئاتى:',
@@ -1726,7 +1699,6 @@ https://www.mediawiki.org/wiki/Manual:Image_Authorization',
'http-read-error' => 'HTTP ئوقۇش خاتالىقى.',
'http-timed-out' => 'HTTP ئىلتىماسى ۋاقىت ھالقىدى.',
'http-curl-error' => 'URL ئاجراتقاندا خاتالىق كۆرۈلدى: $1',
-'http-host-unreachable' => 'URL غا ئۇلىشالمىدى.',
'http-bad-status' => 'HTTP ئىلتىماس قىلغاندا مەسىلە كۆرۈلدى: $1 $2',
# Some likely curl errors. More could be added from <http://curl.haxx.se/libcurl/c/libcurl-errors.html>
@@ -1880,12 +1852,6 @@ URL نىڭ توغرىلىقى Û‹Û• تور بÛكەتنى زىيارەت قىلى
'statistics-users-active-desc' => 'ئالدىنقى {{PLURAL:$1|كۈن|$1 كۈن}} دىكى مەشغۇلات قىلغان ئىشلەتكۈچىلەر',
'statistics-mostpopular' => 'ئەڭ كۆپ كۆرۈلگەن بەتلەر',
-'disambiguations' => 'ئىككى بىسلىق بەتكە ئۇلانغلىكبەتلەر.',
-'disambiguationspage' => 'Template:ئىككى بىسلىق بەت',
-'disambiguations-text' => "تۆۋەندىكى بەتلەر '''ئىككى بىسلىق بەت'''كە ئۇلانغان.
-ئەمما ئۇلار مۇۋاپىق ماۋزۇغا ئۇلىنىشى ÙƒÛرەك ئىدى.<br />
-ئەگەر بىر بەت [[MediaWiki:Disambiguationspage]] غا ئۇلانغان بولسا ئىككى بىسلىق بەت دەپ قارىلىدۇ.",
-
'doubleredirects' => 'قوش قايتا نىشانلانغان بەت',
'doubleredirectstext' => 'بۇ بەتتە قايتا نىشانلانغان بەت يەنە بىر قايتا نىشانلانغان بەتنى نىشانغانلىق تىزىملىكى كۆرسىتىلدى.
ھەر بىر قۇردا بىرىنچى Û‹Û• ئىككىنچى قايتا نىشانلانغان بەتنىڭ ئۇلانمىسىنى شۇنداقلا ئىككىنچى قايتا نىشانلانغان بەتنىڭ نىشانىنى ئۆز ئىچىگە ئالىدۇ، ئادەتتە كۆرسىتىلىدىغىنى "ھەقىقىي" نىشان بەت، مۇنداقچە ئÛيتقاندا بىرىنچى نىشانلانغان بەت نىشانلايدىغان بەتتۇر.',
@@ -2136,10 +2102,9 @@ URL نىڭ توغرىلىقى Û‹Û• تور بÛكەتنى زىيارەت قىلى
'unwatchthispage' => 'كۆزەتنى توختات',
'notanarticle' => 'مەزمۇن بÛتى ئەمەس',
'notvisiblerev' => 'تۈزىتىلگەن نەشرى ئۆچۈرۈلدى',
-'watchnochange' => 'كۆرسەتكەن ۋاقىت بۆلىكىدە سىزنىڭ كۆزەت بÛتىڭىزدە ئۆزگىرىش بولمىدى.',
'watchlist-details' => 'كۆزەت تىزىملىكىڭىزدە {{PLURAL:$1|$1 بەت|$1 بەت}} بار، مۇنازىرە بÛتىنى ئۆز ئىچىگە ئالمايدۇ.',
-'wlheader-enotif' => '* ئÛلخەتتە ئەسكەرتىش ئىقتىدارى قوزغىتىلدى.',
-'wlheader-showupdated' => "* سىز ئالدىنقى Ù‚Ûتىم كۆرگەندىن ÙƒÛيىن ئۆزگەرتىلگەن بەتلەر '''توم''' كۆرۈنىدۇ",
+'wlheader-enotif' => 'ئÛلخەتتە ئەسكەرتىش ئىقتىدارى قوزغىتىلدى.',
+'wlheader-showupdated' => "سىز ئالدىنقى Ù‚Ûتىم كۆرگەندىن ÙƒÛيىن ئۆزگەرتىلگەن بەتلەر '''توم''' كۆرۈنىدۇ",
'watchmethod-recent' => 'كۆزىتىۋاتقان بەتنىڭ ÙŠÛقىنقى ئۆزگەرتىشىنى تەكشۈر',
'watchmethod-list' => 'كۆزىتىۋاتقان بەتنىڭ ÙŠÛقىنقى ئۆزگەرتىشىنى تەكشۈر',
'watchlistcontains' => 'كۆزەت تىزىملىكىڭىزدە $1 {{PLURAL:$1|بەت|بەت}} بار.',
@@ -2553,12 +2518,9 @@ $1',
ئەمما ئۇ $2 نىڭ چەكلەش دائىرىسى ئىچىدە، بۇ دائىرىنى چەكلەشتىن بىكار قىلغىلى بولىدۇ.',
'ip_range_invalid' => 'IP دائىرىسى ئىناۋەتسىز.',
'ip_range_toolarge' => '/$1 دىن چوڭ بولغان چەكلەش دائىرىسىگە يول قويۇلمايدۇ.',
-'blockme' => 'Ù…Ûنى چەكلە',
'proxyblocker' => 'ۋاكالەتچىنى چەكلىگۈچى',
-'proxyblocker-disabled' => 'بۇ ئىقتىدار چەكلەنگەن.',
'proxyblockreason' => 'IP ئادرÛسىڭىز ئوچۇق ۋاكالەتچى، ئۇ ئاللىبۇرۇن چەكلەنگەن.
ئىنتÛرنÛت مۇلازىمىتى تەمىنلىگۈچى سودىگەر ياكى تÛخنىكىلىق قوللىغۇچى بىلەن ئالاقىلىشىڭ ھەمدە ئۇلارغا بۇ ئÛغىر بىخەتەرلىك مەسىلىسىنى ئۇقتۇرۇڭ.',
-'proxyblocksuccess' => 'تامام',
'sorbs' => 'DNSBL',
'sorbsreason' => 'IP ئادرÛسىڭىز {{SITENAME}} دا DNSBL تەرىپىدىن ئوچۇق ۋاكالەتچى تىزىملىكىگە قوشۇلغان.',
'sorbs_create_account_reason' => 'IP ئادرÛسىڭىز {{SITENAME}} دا DNSBL تەرىپىدىن ئوچۇق ۋاكالەتچى تىزىملىكىگە قوشۇلغان.
@@ -2886,13 +2848,8 @@ $1',
# Stylesheets
'common.css' => '/* CSS placed here will be applied to all skins */',
-'standard.css' => '/* CSS placed here will affect users of the Standard skin */',
-'nostalgia.css' => '/* CSS placed here will affect users of the Nostalgia skin */',
'cologneblue.css' => '/* CSS placed here will affect users of the Cologne Blue skin */',
'monobook.css' => '/* CSS placed here will affect users of the Monobook skin */',
-'myskin.css' => '/* CSS placed here will affect users of the MySkin skin */',
-'chick.css' => '/* CSS placed here will affect users of the Chick skin */',
-'simple.css' => '/* CSS placed here will affect users of the Simple skin */',
'modern.css' => '/* CSS placed here will affect users of the Modern skin */',
'vector.css' => '/* CSS placed here will affect users of the Vector skin */',
'print.css' => '/* CSS placed here will affect the print output */',
@@ -2904,13 +2861,8 @@ $1',
# Scripts
'common.js' => '/* Any JavaScript here will be loaded for all users on every page load. */',
-'standard.js' => '/* Any JavaScript here will be loaded for users using the Standard skin */',
-'nostalgia.js' => '/* Any JavaScript here will be loaded for users using the Nostalgia skin */',
'cologneblue.js' => '/* Any JavaScript here will be loaded for users using the Cologne Blue skin */',
'monobook.js' => '/* Any JavaScript here will be loaded for users using the MonoBook skin */',
-'myskin.js' => '/* Any JavaScript here will be loaded for users using the MySkin skin */',
-'chick.js' => '/* Any JavaScript here will be loaded for users using the Chick skin */',
-'simple.js' => '/* Any JavaScript here will be loaded for users using the Simple skin */',
'modern.js' => '/* Any JavaScript here will be loaded for users using the Modern skin */',
'vector.js' => '/* Any JavaScript here will be loaded for users using the Vector skin */',
'group-autoconfirmed.js' => '/* Any JavaScript here will be loaded for autoconfirmed users only */',
@@ -2990,13 +2942,8 @@ $1',
'pageinfo-category-files' => 'ھۆججەت سانى',
# Skin names
-'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',
@@ -3147,7 +3094,7 @@ Variants for Chinese language
* gpslongitude
* gpsaltitude',
-# EXIF tags
+# Exif tags
'exif-imagewidth' => 'كەڭلىك',
'exif-imagelength' => 'ئÛگىزلىك',
'exif-bitspersample' => 'ھەر بىر نۇقتىنىڭ بىت سانى',
@@ -3325,7 +3272,7 @@ Variants for Chinese language
'exif-originalimageheight' => 'ÙƒÛسىشتىن ئىلگىرىكى سۈرەتنىڭ ئÛگىزلىكى',
'exif-originalimagewidth' => 'ÙƒÛسىشتىن ئىلگىرىكى سۈرەتنىڭ كەڭلىكى',
-# EXIF attributes
+# Exif attributes
'exif-compression-1' => 'پرىسلانمىغان',
'exif-compression-2' => 'CCITT 3-گۇرۇپپا بىر ئۆلچەملىك ئۆزگەرتىلگەن خۇÙمان ئىجرا كودلىنىشى',
'exif-compression-3' => 'CCITT نىڭ 3-گۇرۇپپا Ùاكس كودلىنىشى',
@@ -3716,7 +3663,6 @@ $5
'version-other' => 'باشقا',
'version-mediahandlers' => 'ۋاسىتە بىر تەرەپ قىلغۇچ',
'version-hooks' => 'ئىلمەك',
-'version-extension-functions' => 'تەھلىلچى Ùونكسىيە',
'version-parser-extensiontags' => 'تەھلىلچى ÙƒÛڭەيتىلمە خەتكۈچ',
'version-parser-function-hooks' => 'تەھلىلچى Ùونكسىيە ئىلمىكى',
'version-hook-name' => 'ئىلمەك ئاتى',
@@ -3738,13 +3684,6 @@ MediaWiki ئىشلىتىش مەقسىتىنى ئاساس قىلىپ ئÛلان Ù
'version-entrypoints-header-entrypoint' => 'كىرىش نۇقتىسى',
'version-entrypoints-header-url' => 'URL',
-# Special:FilePath
-'filepath' => 'ھۆججەت يولى',
-'filepath-page' => 'ھۆججەت:',
-'filepath-submit' => 'يۆتكەل',
-'filepath-summary' => '!بۇ ئالاھىدە بەت ھۆججەتنىڭ تولۇق يولىنى قايتۇرىدۇ.
-سۈرەت تولۇق ئÛنىقلىقتا كۆرسىتىلىدۇ، باشقا ھۆججەت تىپى بىۋاسىتە ئۇلانغان قوللىنىشچان پروگراممىدا ئÛچىلىدۇ',
-
# Special:FileDuplicateSearch
'fileduplicatesearch' => 'تەكرار ھۆججەت ئىزدە',
'fileduplicatesearch-summary' => 'چاچما (hash) قىممىتىگە ئاساسەن تەكرار ھۆججەت ئىزدە.',
diff --git a/languages/messages/MessagesUk.php b/languages/messages/MessagesUk.php
index 4b1c0c0d..da3ebcd5 100644
--- a/languages/messages/MessagesUk.php
+++ b/languages/messages/MessagesUk.php
@@ -14,6 +14,7 @@
* @author Aleksandrit
* @author Alex Khimich
* @author AlexSm
+ * @author Amire80
* @author Andrijko Z.
* @author Andriykopanytsia
* @author Arturyatsko
@@ -34,6 +35,7 @@
* @author Kalan
* @author Matma Rex
* @author Microcell
+ * @author Nemo bis
* @author NickK
* @author Olvin
* @author Prima klasy4na
@@ -170,6 +172,7 @@ $specialPageAliases = array(
'PermanentLink' => array( 'ПоÑтійне_поÑиланнÑ' ),
'Popularpages' => array( 'ПопулÑрні_Ñторінки' ),
'Preferences' => array( 'ÐалаштуваннÑ' ),
+ 'Prefixindex' => array( 'Покажчик_за_початком_назви' ),
'Protectedpages' => array( 'Захищені_Ñторінки' ),
'Protectedtitles' => array( 'Захищені_назви_Ñторінок' ),
'Randompage' => array( 'Випадкова_Ñторінка' ),
@@ -313,7 +316,7 @@ $magicWords = array(
'revisionmonth1' => array( '1', 'МІСЯЦЬ_ВЕРСІЇ_1', 'МЕСЯЦ_ВЕРСИИ_1', 'REVISIONMONTH1' ),
'revisionyear' => array( '1', 'РІК_ВЕРСІЇ', 'ГОД_ВЕРСИИ', 'REVISIONYEAR' ),
'revisiontimestamp' => array( '1', 'МІТКÐ_ЧÐСУ_ВЕРСІЇ', 'ОТМЕТКÐ_ВРЕМЕÐИ_ВЕРСИИ', 'REVISIONTIMESTAMP' ),
- 'revisionuser' => array( '1', 'ВЕРСІЯ_КОРИСТУВÐЧÐ', 'ВЕРСИЯ_УЧÐСÐИКÐ', 'ВЕРСИЯ_УЧÐСТÐИКÐ', 'REVISIONUSER' ),
+ 'revisionuser' => array( '1', 'ВЕРСІЯ_КОРИСТУВÐЧÐ', 'ВЕРСИЯ_УЧÐСТÐИКÐ', 'REVISIONUSER' ),
'plural' => array( '0', 'ÐœÐОЖИÐÐ:', 'ÐœÐОЖЕСТВЕÐÐОЕ_ЧИСЛО:', 'PLURAL:' ),
'fullurl' => array( '0', 'ПОВÐÐ_ÐДРЕСÐ:', 'ПОЛÐЫЙ_ÐДРЕС:', 'FULLURL:' ),
'fullurle' => array( '0', 'ПОВÐÐ_ÐДРЕСÐ_2:', 'ПОЛÐЫЙ_ÐДРЕС_2:', 'FULLURLE:' ),
@@ -390,9 +393,6 @@ $messages = array(
'tog-shownumberswatching' => 'Показувати чиÑло кориÑтувачів, Ñкі додали Ñторінку до Ñвого ÑпиÑку ÑпоÑтереженнÑ',
'tog-oldsig' => 'ІÑнуючий підпиÑ:',
'tog-fancysig' => 'ВлаÑна вікі-розмітка підпиÑу (без автоматичного поÑиланнÑ)',
-'tog-externaleditor' => "ВикориÑтовувати зовнішній редактор за умовчаннÑм (тільки Ð´Ð»Ñ Ð´Ð¾Ñвідчених кориÑтувачів, вимагає Ñпеціальних налаштувань вашого комп'ютера [//www.mediawiki.org/wiki/Manual:External_editors Детальніше.])",
-'tog-externaldiff' => "ВикориÑтовувати зовнішню програму порівнÑÐ½Ð½Ñ Ð²ÐµÑ€Ñій за умовчаннÑм (тільки Ð´Ð»Ñ ÐµÐºÑпертів, вимагає Ñпеціальних налаштувань вашого комп'ютера. [//www.mediawiki.org/wiki/Manual:External_editors Детальніше.])",
-'tog-showjumplinks' => 'Ðктивізувати допоміжні поÑÐ¸Ð»Ð°Ð½Ð½Ñ Â«Ð¿ÐµÑ€ÐµÐ¹Ñ‚Ð¸ до»',
'tog-uselivepreview' => 'ВикориÑтовувати швидкий попередній переглÑд (екÑпериментально)',
'tog-forceeditsummary' => 'Попереджати, коли не зазначений короткий Ð¾Ð¿Ð¸Ñ Ñ€ÐµÐ´Ð°Ð³ÑƒÐ²Ð°Ð½Ð½Ñ',
'tog-watchlisthideown' => 'Приховати мої Ñ€ÐµÐ´Ð°Ð³ÑƒÐ²Ð°Ð½Ð½Ñ Ñƒ ÑпиÑку ÑпоÑтереженнÑ',
@@ -406,6 +406,8 @@ $messages = array(
'tog-showhiddencats' => 'Показувати приховані категорії',
'tog-noconvertlink' => 'Вимкнути конвертацію назви поÑиланнÑ',
'tog-norollbackdiff' => 'Ðе показувати різницю верÑій піÑÐ»Ñ Ð²Ð¸ÐºÐ¾Ð½Ð°Ð½Ð½Ñ Ð²Ñ–Ð´ÐºÐ¾Ñ‚Ñƒ',
+'tog-useeditwarning' => 'Попереджати мене, Ñкщо Ñ Ð·Ð°Ð»Ð¸ÑˆÐ°ÑŽ Ñторінку Ñ€ÐµÐ´Ð°Ð³ÑƒÐ²Ð°Ð½Ð½Ñ Ð· незбереженими змінами',
+'tog-prefershttps' => "Завжди викориÑтовувати безпечне з'Ñ”Ð´Ð½Ð°Ð½Ð½Ñ Ð¿Ñ€Ð¸ вході у ÑиÑтему",
'underline-always' => 'Завжди',
'underline-never' => 'Ðіколи',
@@ -469,6 +471,18 @@ $messages = array(
'oct' => 'жов',
'nov' => 'лиÑ',
'dec' => 'груд',
+'january-date' => '$1 ÑічнÑ',
+'february-date' => '$1 лютого',
+'march-date' => '$1 березнÑ',
+'april-date' => '$1 квітнÑ',
+'may-date' => '$1 травнÑ',
+'june-date' => '$1 червнÑ',
+'july-date' => '$1 липнÑ',
+'august-date' => '$1 ÑерпнÑ',
+'september-date' => '$1 вереÑнÑ',
+'october-date' => '$1 жовтнÑ',
+'november-date' => '$1 лиÑтопада',
+'december-date' => '$1 груднÑ',
# Categories related messages
'pagecategories' => '{{PLURAL:$1|КатегоріÑ|Категорії}}',
@@ -490,7 +504,7 @@ $messages = array(
'broken-file-category' => 'Сторінки, що поÑилаютьÑÑ Ð½Ð° неіÑнуючі файли',
'categoryviewer-pagedlinks' => '($1) ($2)',
-'linkprefix' => '/^(.*?)(„|«)$/sD',
+'linkprefix' => '/^((?>.*(?<!(?:„|«)$)))(.+)$/sDu',
'about' => 'Про',
'article' => 'СтаттÑ',
@@ -553,6 +567,7 @@ $messages = array(
'create-this-page' => 'Створити цю Ñторінку',
'delete' => 'Вилучити',
'deletethispage' => 'Вилучити цю Ñторінку',
+'undeletethispage' => 'Відновити цю Ñторінку',
'undelete_short' => 'Відновити $1 {{PLURAL:$1|редагуваннÑ|редагуваннÑ|редагувань}}',
'viewdeleted_short' => 'ПереглÑнути {{PLURAL:$1|одне вилучене редагуваннÑ|$1 вилучених редагуваннÑ|$1 вилучених редагувань}}',
'protect' => 'ЗахиÑтити',
@@ -596,7 +611,7 @@ $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).
+# 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).
'aboutsite' => 'Про {{grammar:accusative|{{SITENAME}}}}',
'aboutpage' => 'Project:Про',
'copyright' => 'ВміÑÑ‚ доÑтупний на умовах $1, Ñкщо не вказано інше.',
@@ -606,7 +621,6 @@ $1',
'disclaimers' => 'Відмова від відповідальноÑÑ‚Ñ–',
'disclaimerpage' => 'Project:Відмова від відповідальноÑÑ‚Ñ–',
'edithelp' => 'Довідка про редагуваннÑ',
-'edithelppage' => 'Help:РедагуваннÑ',
'helppage' => 'Help:Довідка',
'mainpage' => 'Головна Ñторінка',
'mainpage-description' => 'Головна Ñторінка',
@@ -636,7 +650,6 @@ $1',
'newmessagesdifflinkplural' => '{{PLURAL:$1|оÑÑ‚Ð°Ð½Ð½Ñ Ð·Ð¼Ñ–Ð½Ð°|оÑтанні зміни|оÑтанніх змін}}',
'youhavenewmessagesmulti' => 'Ви отримали нові Ð¿Ð¾Ð²Ñ–Ð´Ð¾Ð¼Ð»ÐµÐ½Ð½Ñ Ð½Ð° $1',
'editsection' => 'ред.',
-'editsection-brackets' => '[$1]',
'editold' => 'ред.',
'viewsourceold' => 'переглÑнути вихідний код',
'editlink' => 'редагувати',
@@ -688,17 +701,12 @@ $1',
# General errors
'error' => 'Помилка',
'databaseerror' => 'Помилка бази даних',
-'dberrortext' => 'Знайдено ÑинтакÑичну помилку в запиті до бази даних.
-Це може вказувати на помилку в програмному забезпеченні.
-ОÑтанній запит до бази даних:
-<blockquote><code>$1</code></blockquote>
-відбувÑÑ Ð· функції "<code>$2</code>".
-База даних виÑвила помилку "<samp>$3: $4</samp>".',
-'dberrortextcl' => 'Знайдено ÑинтакÑичну помилку в запиті до бази даних.
-ОÑтанній запит до бази даних:
-«$1»
-відбувÑÑ Ð· функції «$2».
-База даних виÑвила помилку «$3: $4».',
+'databaseerror-text' => 'При запиті до бази даних ÑталаÑÑ Ð¿Ð¾Ð¼Ð¸Ð»ÐºÐ°.
+Це може вказувати на помилку у програмному забезпеченні.',
+'databaseerror-textcl' => 'При запиті до бази даних ÑталаÑÑ Ð¿Ð¾Ð¼Ð¸Ð»ÐºÐ°.',
+'databaseerror-query' => 'Запит: $1',
+'databaseerror-function' => 'ФункціÑ: $1',
+'databaseerror-error' => 'Помилка: $1',
'laggedslavemode' => 'Увага: Ñторінка може не міÑтити оÑтанніх редагувань.',
'readonly' => 'Ð—Ð°Ð¿Ð¸Ñ Ð´Ð¾ бази даних заблокований',
'enterlockreason' => 'Зазначте причину Ñ– приблизний термін блокуваннÑ',
@@ -732,6 +740,7 @@ $1',
'cannotdelete-title' => 'Ðе вдаєтьÑÑ Ð²Ð¸Ð´Ð°Ð»Ð¸Ñ‚Ð¸ Ñторінку «$1»',
'delete-hook-aborted' => 'Ð’Ð¸Ð»ÑƒÑ‡ÐµÐ½Ð½Ñ Ð±ÑƒÐ»Ð¾ ÑкаÑовано процедурою-перехоплювачем.
ÐÑ–Ñких поÑÑненень надано не було.',
+'no-null-revision' => 'Ðе вдалоÑÑ Ñтворити нульову верÑÑ–ÑŽ Ñторінки «$1»',
'badtitle' => 'ÐеприпуÑтима назва',
'badtitletext' => 'Запитана назва Ñторінки неправильна, порожнÑ, або неправильно зазначена міжмовна чи міжвікі назва.
Можливо, в назві викориÑтовуютьÑÑ Ð½ÐµÐ´Ð¾Ð¿ÑƒÑтимі Ñимволи.',
@@ -750,11 +759,14 @@ $1',
'viewyourtext' => "Ви можете переглÑнути та Ñкопіювати текÑÑ‚ '''ваших редагувань''' на цій Ñторінці:",
'protectedinterface' => 'Ð¦Ñ Ñторінка Ñ” чаÑтиною інтерфейÑу програмного Ð·Ð°Ð±ÐµÐ·Ð¿ÐµÑ‡ÐµÐ½Ð½Ñ Ñ†Ñ–Ñ”Ñ— вікі Ñ– Ñ—Ñ— можуть редагувати лише адмініÑтратори проекту. Щоб додати або змінити переклади Ð´Ð»Ñ ÑƒÑÑ–Ñ… вікі, відвідайте [//translatewiki.net/ translatewiki.net], проект локалізації MediaWiki.',
'editinginterface' => "'''Увага:''' Ви редагуєте Ñторінку, що Ñ” чаÑтиною текÑтового інтерфейÑу. Зміни цієї Ñторінки ÑпричинÑÑ‚ÑŒ зміну інтерфейÑу Ð´Ð»Ñ Ñ–Ð½ÑˆÐ¸Ñ… кориÑтувачів. Ð”Ð»Ñ Ð¿ÐµÑ€ÐµÐºÐ»Ð°Ð´Ñƒ Ð¿Ð¾Ð²Ñ–Ð´Ð¾Ð¼Ð»ÐµÐ½Ð½Ñ Ð²Ð¸ÐºÐ¾Ñ€Ð¸Ñтовуйте [//translatewiki.net/wiki/Main_Page?setlang=uk translatewiki.net] — проект, що займаєтьÑÑ Ð»Ð¾ÐºÐ°Ð»Ñ–Ð·Ð°Ñ†Ñ–Ñ”ÑŽ MediaWiki.",
-'sqlhidden' => '(SQL запит приховано)',
'cascadeprotected' => 'Сторінка захищена від змін, оÑкільки Ñ—Ñ— включено до {{PLURAL:$1|Ñторінки, Ð´Ð»Ñ Ñкої|наÑтупних Ñторінок, Ð´Ð»Ñ Ñких}} уÑтановлено каÑкадний захиÑÑ‚: $2',
'namespaceprotected' => 'У Ð²Ð°Ñ Ð½ÐµÐ¼Ð° дозволу редагувати Ñторінки в проÑторі назв «$1».',
'customcssprotected' => 'У Ð²Ð°Ñ Ð½ÐµÐ¼Ð°Ñ” прав на Ñ€ÐµÐ´Ð°Ð³ÑƒÐ²Ð°Ð½Ð½Ñ Ñ†Ñ–Ñ”Ñ— CSS-Ñторінки, так Ñк вона міÑтить оÑобиÑÑ‚Ñ– Ð½Ð°Ð»Ð°ÑˆÑ‚ÑƒÐ²Ð°Ð½Ð½Ñ Ñ–Ð½ÑˆÐ¾Ð³Ð¾ кориÑтувача.',
'customjsprotected' => 'У Ð²Ð°Ñ Ð½ÐµÐ¼Ð°Ñ” дозволу на Ñ€ÐµÐ´Ð°Ð³ÑƒÐ²Ð°Ð½Ð½Ñ Ñ†Ñ–Ñ”Ñ— JavaScript-Ñторінки, так Ñк вона міÑтить оÑобиÑÑ‚Ñ– Ð½Ð°Ð»Ð°ÑˆÑ‚ÑƒÐ²Ð°Ð½Ð½Ñ Ñ–Ð½ÑˆÐ¾Ð³Ð¾ кориÑтувача.',
+'mycustomcssprotected' => 'У Ð²Ð°Ñ Ð½ÐµÐ¼Ð°Ñ” прав Ð´Ð»Ñ Ñ€ÐµÐ´Ð°Ð³ÑƒÐ²Ð°Ð½Ð½Ñ Ñ†Ñ–Ñ”Ñ— CSS Ñторінки.',
+'mycustomjsprotected' => 'Ви не маєте дозволу Ð´Ð»Ñ Ñ€ÐµÐ´Ð°Ð³ÑƒÐ²Ð°Ð½Ð½Ñ Ñ†Ñ–Ñ”Ñ— Ñторінки JavaScript.',
+'myprivateinfoprotected' => 'У Ð’Ð°Ñ Ð½ÐµÐ¼Ð°Ñ” дозволу на Ñ€ÐµÐ´Ð°Ð³ÑƒÐ²Ð°Ð½Ð½Ñ Ñвоєї приватної інформації.',
+'mypreferencesprotected' => 'У Ð’Ð°Ñ Ð½ÐµÐ¼Ð°Ñ” дозволу на Ñ€ÐµÐ´Ð°Ð³ÑƒÐ²Ð°Ð½Ð½Ñ Ñвоїх налаштувань.',
'ns-specialprotected' => 'Спеціальні Ñторінки не можна редагувати.',
'titleprotected' => "Ð¡Ñ‚Ð²Ð¾Ñ€ÐµÐ½Ð½Ñ Ñторінки з такою назвою було заборонене кориÑтувачем [[User:$1|$1]].
Зазначена наÑтупна причина: ''$2''.",
@@ -778,10 +790,19 @@ $1',
'welcomecreation-msg' => 'Ваш акаунт було Ñтворено.
Ðе забудьте змінити Ñвої [[Special:Preferences|Ð½Ð°Ð»Ð°ÑˆÑ‚ÑƒÐ²Ð°Ð½Ð½Ñ Ñƒ {{GRAMMAR:genitive|{{SITENAME}}}}]].',
'yourname' => "Ім'Ñ ÐºÐ¾Ñ€Ð¸Ñтувача:",
+'userlogin-yourname' => "Ім'Ñ ÐºÐ¾Ñ€Ð¸Ñтувача",
+'userlogin-yourname-ph' => "Введіть ім'Ñ ÐºÐ¾Ñ€Ð¸Ñтувача",
+'createacct-another-username-ph' => "Введіть ім'Ñ ÐºÐ¾Ñ€Ð¸Ñтувача",
'yourpassword' => 'Пароль:',
+'userlogin-yourpassword' => 'Пароль',
+'userlogin-yourpassword-ph' => 'Введіть ваш пароль',
+'createacct-yourpassword-ph' => 'Введіть пароль',
'yourpasswordagain' => 'Повторний набір паролÑ:',
+'createacct-yourpasswordagain' => 'Підтвердіть пароль',
+'createacct-yourpasswordagain-ph' => 'Введіть пароль знову',
'remembermypassword' => "Запам'Ñтати мій обліковий Ð·Ð°Ð¿Ð¸Ñ Ð½Ð° цьому комп'ютері (на Ñтрок не більше $1 {{PLURAL:$1|днÑ|днів}})",
-'securelogin-stick-https' => 'ЗалишайтиÑÑŒ підключенним через HTTPS піÑÐ»Ñ Ð²Ñ…Ð¾Ð´Ñƒ',
+'userlogin-remembermypassword' => "Запам'Ñтати мене",
+'userlogin-signwithsecure' => "Захищене з'єднаннÑ",
'yourdomainname' => 'Ваш домен:',
'password-change-forbidden' => 'Ви не можна змінити пароль на цій вікі.',
'externaldberror' => 'СталаÑÑ Ð¿Ð¾Ð¼Ð¸Ð»ÐºÐ° при автентифікації за допомогою зовнішньої бази даних, або у Ð²Ð°Ñ Ð½ÐµÐ´Ð¾Ñтатньо прав Ð´Ð»Ñ Ð²Ð½ÐµÑÐµÐ½Ð½Ñ Ð·Ð¼Ñ–Ð½ до Ñвого зовнішнього облікового запиÑу.',
@@ -793,18 +814,44 @@ $1',
'logout' => 'Вихід із ÑиÑтеми',
'userlogout' => 'Вихід із ÑиÑтеми',
'notloggedin' => 'Ви не ввійшли до ÑиÑтеми',
+'userlogin-noaccount' => 'Ðемає облікового запиÑу?',
+'userlogin-joinproject' => 'ПриєднатиÑÑ Ð´Ð¾ {{GRAMMAR:genitive|{{SITENAME}}}}',
'nologin' => 'Ви ще не зареєÑтрувалиÑÑŒ? $1.',
'nologinlink' => 'Створіть обліковий запиÑ',
'createaccount' => 'ЗареєÑтруватиÑÑ',
'gotaccount' => "Ви вже зареєÑтровані? '''$1'''.",
'gotaccountlink' => 'Увійдіть',
'userlogin-resetlink' => 'Забули дані, потрібні Ð´Ð»Ñ Ð²Ñ…Ð¾Ð´Ñƒ?',
+'userlogin-resetpassword-link' => 'Скинути пароль',
+'helplogin-url' => 'Help:Вхід до ÑиÑтеми',
+'userlogin-helplink' => '[[{{MediaWiki:helplogin-url}}|Допомога в реєÑтрації]]',
+'userlogin-loggedin' => 'Ви вже увійшли Ñк {{GENDER:$1|$1}}.
+ВикориÑтайте нижче форму Ð´Ð»Ñ Ð²Ñ…Ð¾Ð´Ñƒ Ñк інший кориÑтувач.',
+'userlogin-createanother' => 'Створити інший обліковий запиÑ',
+'createacct-join' => 'Введіть вашу інформацію нижче.',
+'createacct-another-join' => 'Введіть нижче дані нового облікового запиÑу.',
+'createacct-emailrequired' => 'ÐдреÑа електронної пошти',
+'createacct-emailoptional' => "ÐдреÑа електронної пошти (не обов'Ñзково)",
+'createacct-email-ph' => 'Введіть Вашу адреÑу електронної пошти',
+'createacct-another-email-ph' => 'Введіть адреÑу електронної пошти',
'createaccountmail' => 'ВикориÑтати тимчаÑовий випадковий пароль Ñ– надіÑлати його на вказану адреÑу електронної пошти',
+'createacct-realname' => "Справжнє ім'Ñ (не обов'Ñзково)",
'createaccountreason' => 'Причина:',
+'createacct-reason' => 'Причина',
+'createacct-reason-ph' => 'Чому Ви Ñтворюєте інший обліковий запиÑ',
+'createacct-captcha' => 'Перевірка безпеки',
+'createacct-imgcaptcha-ph' => 'Введіть текÑÑ‚, що Ви бачите вище',
+'createacct-submit' => 'Створіть Ваш обліковий запиÑ',
+'createacct-another-submit' => 'Створити інший обліковий запиÑ',
+'createacct-benefit-heading' => '{{SITENAME}} ÑтворюєтьÑÑ Ñ‚Ð°ÐºÐ¸Ð¼Ð¸ ж людьми, Ñк Ñ– ви.',
+'createacct-benefit-body1' => '{{PLURAL:$1|редагуваннÑ|редагуваннÑ|редагувань}}',
+'createacct-benefit-body2' => '{{PLURAL:$1|Ñторінка|Ñторінки|Ñторінок}}',
+'createacct-benefit-body3' => '{{PLURAL:$1|допиÑувач|допиÑувачі|допиÑувачів}} цього міÑÑцÑ',
'badretype' => 'Уведені вами паролі не збігаютьÑÑ.',
'userexists' => "Уведене ім'Ñ ÐºÐ¾Ñ€Ð¸Ñтувача вже Ñ–Ñнує.
Будь лаÑка оберіть інше ім'Ñ.",
'loginerror' => 'Помилка при вході до ÑиÑтеми',
+'createacct-error' => 'Помилка ÑÑ‚Ð²Ð¾Ñ€ÐµÐ½Ð½Ñ Ð¾Ð±Ð»Ñ–ÐºÐ¾Ð²Ð¾Ð³Ð¾ запиÑу',
'createaccounterror' => 'Ðе в змозі Ñтворити обліковий запиÑ: $1',
'nocookiesnew' => 'КориÑтувач зареєÑтрувавÑÑ, але не ввійшов до ÑиÑтеми.
{{SITENAME}} викориÑтовує куки Ð´Ð»Ñ Ð²Ñ…Ð¾Ð´Ñƒ до ÑиÑтеми.
@@ -870,10 +917,12 @@ $1',
Проігноруйте дане повідомленнÑ, Ñкщо обліковий Ð·Ð°Ð¿Ð¸Ñ Ð±ÑƒÐ»Ð¾ Ñтворено помилково.',
'usernamehasherror' => "Ім'Ñ ÐºÐ¾Ñ€Ð¸Ñтувача не може міÑтити Ñимволу «решітка»",
'login-throttled' => 'Ви зробили надто багато Ñпроб ввійти до ÑиÑтеми.
-Будь лаÑка, зачекайте перед повторною Ñпробою.',
+Будь лаÑка, зачекайте $1 перед повторною Ñпробою.',
'login-abort-generic' => 'Ðе вдалоÑÑ Ð²Ð²Ñ–Ð¹Ñ‚Ð¸ до ÑиÑтеми',
'loginlanguagelabel' => 'Мова: $1',
'suspicious-userlogout' => 'Ваш запит на Ð·Ð°Ð²ÐµÑ€ÑˆÐµÐ½Ð½Ñ ÑеанÑа відхилений, оÑкільки він Ñхожий на запит, відправлений зіпÑованим веб-оглÑдачем або кешуючим прокÑÑ–-Ñервером.',
+'createacct-another-realname-tip' => "Справжнє ім'Ñ Ñ” необов'Ñзковим.
+Якщо ви вирішите надати його, то воно буде викориÑтовуватиÑÑ Ð´Ð»Ñ Ð¿Ñ€Ð¸ÑÐ²Ð¾Ñ”Ð½Ð½Ñ ÐºÐ¾Ñ€Ð¸Ñтувачу авторÑтва до його роботи.",
# Email sending
'php-mail-error-unknown' => 'Ðевідома помилка в PHP-функції mail()',
@@ -889,8 +938,7 @@ $1',
'newpassword' => 'Ðовий пароль:',
'retypenew' => 'Ще раз введіть новий пароль:',
'resetpass_submit' => 'УÑтановити пароль Ñ– ввійти',
-'resetpass_success' => 'Ваш пароль вже уÑпішно змінено!
-Зараз входимо…',
+'changepassword-success' => 'Ваш пароль уÑпішно змінено!',
'resetpass_forbidden' => 'Пароль не можна змінювати',
'resetpass-no-info' => 'Щоб звертатиÑÑ Ð±ÐµÐ·Ð¿Ð¾Ñередньо до цієї Ñторінки, вам Ñлід увійти до ÑиÑтеми.',
'resetpass-submit-loggedin' => 'Змінити пароль',
@@ -902,10 +950,11 @@ $1',
# Special:PasswordReset
'passwordreset' => 'Скинути пароль',
-'passwordreset-text' => 'Заповніть цю форму Ð´Ð»Ñ Ð²Ñ–Ð´Ð½Ð¾Ð²Ð»ÐµÐ½Ð½Ñ Ð¿Ð°Ñ€Ð¾Ð»Ñ.',
+'passwordreset-text-one' => 'Заповніть цю форму Ð´Ð»Ñ Ð²Ñ–Ð´Ð½Ð¾Ð²Ð»ÐµÐ½Ð½Ñ Ð¿Ð°Ñ€Ð¾Ð»Ñ.',
+'passwordreset-text-many' => '{{PLURAL:$1|Заповніть одне з полів Ð´Ð»Ñ ÑÐºÐ¸Ð´Ð°Ð½Ð½Ñ Ð¿Ð°Ñ€Ð¾Ð»Ñ.}}',
'passwordreset-legend' => 'ПеревÑтановити пароль',
'passwordreset-disabled' => 'У цій вікі вимкнена можливіÑÑ‚ÑŒ ÑÐºÐ¸Ð´Ð°Ð½Ð½Ñ Ð¿Ð°Ñ€Ð¾Ð»Ñ.',
-'passwordreset-pretext' => '{{PLURAL:$1||Введіть одну з чаÑтин даних}}',
+'passwordreset-emaildisabled' => 'Функції електронної пошти вимкнуто в цій вікі.',
'passwordreset-username' => "Ім'Ñ ÐºÐ¾Ñ€Ð¸Ñтувача:",
'passwordreset-domain' => 'Домен:',
'passwordreset-capture' => 'ПродивитиÑÑŒ результуючий електронний лиÑÑ‚?',
@@ -928,7 +977,7 @@ $2
ТимчаÑовий пароль: $2",
'passwordreset-emailsent' => 'Електронний лиÑÑ‚ Ð´Ð»Ñ Ð²Ñ–Ð´Ð½Ð¾Ð²Ð»ÐµÐ½Ð½Ñ Ð¿Ð°Ñ€Ð¾Ð»Ñ Ð²Ñ–Ð´Ð¿Ñ€Ð°Ð²Ð»ÐµÐ½Ð¸Ð¹.',
'passwordreset-emailsent-capture' => 'Електронний лиÑÑ‚ ÑÐºÐ¸Ð´Ð°Ð½Ð½Ñ Ð¿Ð°Ñ€Ð¾Ð»ÑŽ було надіÑлано, Ñк показано нижче.',
-'passwordreset-emailerror-capture' => 'Електронний лиÑÑ‚ Ð´Ð»Ñ Ð²Ñ–Ð´Ð½Ð¾Ð²Ð»ÐµÐ½Ð½Ñ Ð¿Ð°Ñ€Ð¾Ð»Ñ Ð¼Ð°Ð² бути надіÑланий, Ñк показано нижче, але його надÑÐ¸Ð»Ð°Ð½Ð½Ñ ÐºÐ¾Ñ€Ð¸Ñтувачеві $1 не вдалоÑÑ.',
+'passwordreset-emailerror-capture' => 'Електронний лиÑÑ‚ Ð´Ð»Ñ Ð²Ñ–Ð´Ð½Ð¾Ð²Ð»ÐµÐ½Ð½Ñ Ð¿Ð°Ñ€Ð¾Ð»Ñ Ð¼Ð°Ð² бути надіÑланий, Ñк показано нижче, але його надÑÐ¸Ð»Ð°Ð½Ð½Ñ {{GENDER:$2|кориÑтувачеві|кориÑтувачці}} $1 не вдалоÑÑ.',
# Special:ChangeEmail
'changeemail' => 'Змінити адреÑу електронної пошти',
@@ -942,6 +991,18 @@ $2
'changeemail-submit' => 'Змінити адреÑу електронної пошти',
'changeemail-cancel' => 'СкаÑувати',
+# Special:ResetTokens
+'resettokens' => 'Ð¡ÐºÐ¸Ð´Ð°Ð½Ð½Ñ Ð¶ÐµÑ‚Ð¾Ð½Ñ–Ð²',
+'resettokens-text' => "Ви можете Ñкинути жетони, що забезпечують доÑтуп до певних оÑобиÑтих даних, пов'Ñзаних тут із Вашим обліковим запиÑом.
+Вам Ñлід це зробити, Ñкщо Ви випадково поділилиÑÑŒ жетонами з кимоÑÑŒ, або Ñкщо Ваш обліковий Ð·Ð°Ð¿Ð¸Ñ Ð±ÑƒÐ»Ð¾ зламано.",
+'resettokens-no-tokens' => 'Ðемає жетонів до ÑкиданнÑ.',
+'resettokens-legend' => 'Скинути жетони',
+'resettokens-tokens' => 'Жетони:',
+'resettokens-token-label' => '$1 (поточне значеннÑ: $2)',
+'resettokens-watchlist-token' => 'Маркер Ñтрічки новин (Atom/RSS) з [[Special:Watchlist|змін на Ñторінку у вашому ÑпиÑку ÑпоÑтереженнÑ]]',
+'resettokens-done' => 'Жетони Ñкинуто.',
+'resettokens-resetbutton' => 'Скинути обрані жетони',
+
# Edit page toolbar
'bold_sample' => 'Жирний текÑÑ‚',
'bold_tip' => 'Жирний текÑÑ‚',
@@ -1146,12 +1207,15 @@ $2
Імовірно, вона була вилучена.',
'edit-conflict' => 'Конфлікт редагувань.',
'edit-no-change' => 'Ваше Ñ€ÐµÐ´Ð°Ð³ÑƒÐ²Ð°Ð½Ð½Ñ Ð²Ñ–Ð´Ñ…Ð¸Ð»ÐµÐ½Ðµ, оÑкільки в текÑÑ‚Ñ– не було зроблено змін.',
+'postedit-confirmation' => 'Ваше Ñ€ÐµÐ´Ð°Ð³ÑƒÐ²Ð°Ð½Ð½Ñ Ð·Ð±ÐµÑ€ÐµÐ¶ÐµÐ½Ð¾',
'edit-already-exists' => 'Ðеможливо Ñтворити нову Ñторінку.
Вона вже Ñ–Ñнує.',
'defaultmessagetext' => 'ТекÑÑ‚ «за замовчуваннÑ»',
'content-failed-to-parse' => 'Ðе вдалоÑÑŒ проаналізувати $2 Ñк тип $1: $3',
'invalid-content-data' => 'ÐеприпуÑтимі дані',
'content-not-allowed-here' => 'ВміÑÑ‚ «$1» недопуÑтимий на Ñторінці [[$2]]',
+'editwarning-warning' => 'Перехід на іншу Ñторінку призведе до втрати ваших змін.
+Якщо ви ввійшли до ÑиÑтеми, то ви можете відключити це Ð¿Ð¾Ð¿ÐµÑ€ÐµÐ´Ð¶ÐµÐ½Ð½Ñ Ð² розділі «РедагуваннÑ» ваших налаштувань.',
# Content models
'content-model-wikitext' => 'вікітекÑÑ‚',
@@ -1187,6 +1251,7 @@ $2
'undo-failure' => 'Ðеможливо ÑкаÑувати Ñ€ÐµÐ´Ð°Ð³ÑƒÐ²Ð°Ð½Ð½Ñ Ñ‡ÐµÑ€ÐµÐ· неÑуміÑніÑÑ‚ÑŒ проміжних змін.',
'undo-norev' => 'Ð ÐµÐ´Ð°Ð³ÑƒÐ²Ð°Ð½Ð½Ñ Ð½Ðµ може бути ÑкаÑоване, бо воно не Ñ–Ñнує або було вилучене.',
'undo-summary' => 'СкаÑÑƒÐ²Ð°Ð½Ð½Ñ Ñ€ÐµÐ´Ð°Ð³ÑƒÐ²Ð°Ð½Ð½Ñ â„– $1 кориÑтувача [[Special:Contributions/$2|$2]] ([[User talk:$2|обговореннÑ]])',
+'undo-summary-username-hidden' => 'СкаÑувати перевірку $1 прихованого кориÑтувача',
# Account creation failure
'cantcreateaccounttitle' => 'Ðеможливо Ñтворити обліковий запиÑ',
@@ -1367,6 +1432,7 @@ $1",
'compareselectedversions' => 'ПорівнÑти вибрані верÑÑ–Ñ—',
'showhideselectedversions' => 'Показати/приховати обрані верÑÑ–Ñ—',
'editundo' => 'ÑкаÑувати',
+'diff-empty' => '(Ðемає відмінноÑтей)',
'diff-multi' => '({{PLURAL:$1|Одна проміжна верÑÑ–Ñ Ð¾Ð´Ð½Ð¾Ð³Ð¾ кориÑтувача не показана|$1 проміжні верÑÑ–Ñ— {{PLURAL:$2|одного кориÑтувача|$2 кориÑтувачів}} не показані|$1 проміжних верÑій {{PLURAL:$2|одного кориÑтувача|$2 кориÑтувачів}} не показані}})',
'diff-multi-manyusers' => '({{PLURAL:$1|не показана $1 проміжна Ñ Ð²ÐµÑ€ÑÑ–Ñ|не показані $1 проміжні верÑÑ–Ñ—|не показано $1 проміжних верÑій}}, зроблених більш, ніж {{PLURAL:$2|$1 кориÑтувачем|$2 кориÑтувачами}})',
'difference-missing-revision' => '{{PLURAL:$2|$2 верÑÑ–Ñ|$2 верÑÑ–Ñ—|$2 верÑій}} Ð´Ð»Ñ Ñ†ÑŒÐ¾Ð³Ð¾ порівнÑÐ½Ð½Ñ ($1) не {{PLURAL:$2|знайдена|знайдені}}.
@@ -1394,7 +1460,6 @@ $1",
'searchmenu-legend' => 'Параметри пошуку',
'searchmenu-exists' => "'''У цій вікі Ñ” Ñторінка з назвою «[[:$1]]»'''",
'searchmenu-new' => "'''Створити Ñторінку «[[:$1]]» у цій вікі!'''",
-'searchhelp-url' => 'Help:Довідка',
'searchmenu-prefix' => '[[Special:PrefixIndex/$1|Показати Ñторінки з цим префікÑом]]',
'searchprofile-articles' => 'Статті',
'searchprofile-project' => 'Сторінки довідки і проекту',
@@ -1435,15 +1500,7 @@ $1",
'powersearch-togglenone' => 'Жодний',
'search-external' => 'Зовнішній пошук',
'searchdisabled' => '<p>Вибачте, повнотекÑтовий пошук тимчаÑово недоÑтупний через Ð¿ÐµÑ€ÐµÐ²Ð°Ð½Ñ‚Ð°Ð¶ÐµÐ½Ð½Ñ Ñервера; передбачаєтьÑÑ, що Ñ†Ñ Ñ„ÑƒÐ½ÐºÑ†Ñ–Ñ Ð±ÑƒÐ´Ðµ знову включена піÑÐ»Ñ ÑƒÑтановки нового обладнаннÑ. Поки що ми пропонуємо вам ÑкориÑтатиÑÑ Google чи Yahoo!:</p>',
-
-# Quickbar
-'qbsettings' => 'Панель навігації',
-'qbsettings-none' => 'Ðе показувати панель',
-'qbsettings-fixedleft' => 'ФікÑована ліворуч',
-'qbsettings-fixedright' => 'ФікÑована праворуч',
-'qbsettings-floatingleft' => 'Плаваюча ліворуч',
-'qbsettings-floatingright' => 'Плаваюча праворуч',
-'qbsettings-directionality' => 'ФікÑована, залежно від напрÑмку пиÑьма вашої мови',
+'search-error' => 'СталаÑÑ Ð¿Ð¾Ð¼Ð¸Ð»ÐºÐ° під Ñ‡Ð°Ñ Ð¿Ð¾ÑˆÑƒÐºÑƒ:$1',
# Preferences page
'preferences' => 'ÐалаштуваннÑ',
@@ -1477,7 +1534,6 @@ $1",
'resetprefs' => 'СкаÑувати незбережені зміни',
'restoreprefs' => 'Відновити вÑÑ– Ñтандартні Ð½Ð°Ð»Ð°ÑˆÑ‚ÑƒÐ²Ð°Ð½Ð½Ñ (у вÑÑ–Ñ… розділах)',
'prefs-editing' => 'РедагуваннÑ',
-'prefs-edit-boxsize' => 'Розмір вікна редагуваннÑ.',
'rows' => 'РÑдків:',
'columns' => 'Колонок:',
'searchresultshead' => 'Пошук',
@@ -1488,9 +1544,9 @@ $1",
'recentchangesdays-max' => '(макÑимум $1 {{PLURAL:$1|день|дні|днів}})',
'recentchangescount' => 'КількіÑÑ‚ÑŒ редагувань Ð´Ð»Ñ Ð¿Ð¾ÐºÐ°Ð·Ñƒ за умовчаннÑм:',
'prefs-help-recentchangescount' => 'Це ÑтоÑуєтьÑÑ Ð½Ð¾Ð²Ð¸Ñ… редагувань, Ñ–Ñторій Ñторінок Ñ– журналів.',
-'prefs-help-watchlist-token' => 'Ð—Ð°Ð¿Ð¾Ð²Ð½ÐµÐ½Ð½Ñ Ñ†ÑŒÐ¾Ð³Ð¾ Ð¿Ð¾Ð»Ñ Ñекретним ключем буде Ñтворювати RSS-транÑлÑцію Ð´Ð»Ñ Ð²Ð°ÑˆÐ¾Ð³Ð¾ ÑпиÑку ÑпоÑтереженнÑ.
-Кожен, хто знає ключ в цьому полі, зможе читати ваш ÑпиÑок ÑпоÑтереженнÑ, тому оберіть Ñекретне значеннÑ.
-Ви можете викориÑтати це випадково згенероване значеннÑ: $1',
+'prefs-help-watchlist-token2' => 'Це Ñекретний ключ до веб-каналу вашого ÑпиÑку ÑпоÑтереженнÑ.
+Будь-хто, хто його знає, матиме можливіÑÑ‚ÑŒ читати ваш ÑпиÑок ÑпоÑтереженнÑ, тому не поширюйте його.
+[[Special:ResetTokens|ÐатиÑніть тут, Ñкщо вам потрібно Ñкинути його]].',
'savedprefs' => 'Ваші Ð½Ð°Ð»Ð°ÑˆÑ‚ÑƒÐ²Ð°Ð½Ð½Ñ Ð·Ð±ÐµÑ€ÐµÐ¶ÐµÐ½Ð¾.',
'timezonelegend' => 'ЧаÑовий поÑÑ:',
'localtime' => 'МіÑцевий чаÑ:',
@@ -1521,7 +1577,6 @@ $1",
'prefs-reset-intro' => 'Ð¦Ñ Ñторінка може бути викориÑтана Ð´Ð»Ñ Ð·Ð¼Ñ–Ð½Ð¸ ваших налаштувань на Ñтандартні.
ПіÑÐ»Ñ Ð²Ð¸ÐºÐ¾Ð½Ð°Ð½Ð½Ñ Ñ†Ñ–Ñ”Ñ— дії ви не зможете відкотити зміни.',
'prefs-emailconfirm-label' => 'ÐŸÑ–Ð´Ñ‚Ð²ÐµÑ€Ð´Ð¶ÐµÐ½Ð½Ñ ÐµÐ»ÐµÐºÑ‚Ñ€Ð¾Ð½Ð½Ð¾Ñ— пошти:',
-'prefs-textboxsize' => 'Розмір вікна редагуваннÑ',
'youremail' => 'ÐдреÑа електронної пошти:',
'username' => "{{GENDER:$1|Ім'Ñ ÐºÐ¾Ñ€Ð¸Ñтувача|Ім'Ñ ÐºÐ¾Ñ€Ð¸Ñтувачки}}:",
'uid' => 'Ідентифікатор {{GENDER:$1|кориÑтувача}}:',
@@ -1557,6 +1612,8 @@ $1",
'prefs-dateformat' => 'Формат дати',
'prefs-timeoffset' => 'ЗÑув чаÑу',
'prefs-advancedediting' => 'Загальні параметри',
+'prefs-editor' => 'Редактор',
+'prefs-preview' => 'Попередній переглÑд',
'prefs-advancedrc' => 'Розширені налаштуваннÑ',
'prefs-advancedrendering' => 'Розширені налаштуваннÑ',
'prefs-advancedsearchoptions' => 'Розширені налаштуваннÑ',
@@ -1564,7 +1621,9 @@ $1",
'prefs-displayrc' => 'ÐÐ°Ð»Ð°ÑˆÑ‚ÑƒÐ²Ð°Ð½Ð½Ñ Ð¿Ð¾ÐºÐ°Ð·Ñƒ',
'prefs-displaysearchoptions' => 'ÐÐ°Ð»Ð°ÑˆÑ‚ÑƒÐ²Ð°Ð½Ð½Ñ Ð¿Ð¾ÐºÐ°Ð·Ñƒ',
'prefs-displaywatchlist' => 'ÐÐ°Ð»Ð°ÑˆÑ‚ÑƒÐ²Ð°Ð½Ð½Ñ Ð¿Ð¾ÐºÐ°Ð·Ñƒ',
+'prefs-tokenwatchlist' => 'Жетон',
'prefs-diffs' => 'Різниці верÑій',
+'prefs-help-prefershttps' => 'Цей параметр набуде чинноÑÑ‚Ñ– при вашому наÑтупному вході у ÑиÑтему.',
# User preference: email validation using jQuery
'email-address-validity-valid' => 'ÐдреÑа електронної пошти Ñ” чинною',
@@ -1592,6 +1651,8 @@ $1",
'userrights-changeable-col' => 'Групи, Ñкі ви можете змінити',
'userrights-unchangeable-col' => 'Групи, Ñкі ви не можете змінити',
'userrights-irreversible-marker' => '$1*',
+'userrights-conflict' => 'Конфлікт зміни прав кориÑтувача! Будь лаÑка, перевірте та підтвердіть зміни знову.',
+'userrights-removed-self' => 'Ви уÑпішно позбавили Ñебе влаÑних прав. Через це Ви більше не маєте доÑтупу до цієї Ñторінки.',
# Groups
'group' => 'Група:',
@@ -1657,11 +1718,19 @@ $1",
'right-proxyunbannable' => 'Ð£Ð½Ð¸ÐºÐ½ÐµÐ½Ð½Ñ Ð°Ð²Ñ‚Ð¾Ð¼Ð°Ñ‚Ð¸Ñ‡Ð½Ð¾Ð³Ð¾ Ð±Ð»Ð¾ÐºÑƒÐ²Ð°Ð½Ð½Ñ Ð¿Ñ€Ð¾ÐºÑÑ–-Ñерверів',
'right-unblockself' => 'Розблоковувати Ñебе',
'right-protect' => 'Зміна рівнів захиÑту та Ñ€ÐµÐ´Ð°Ð³ÑƒÐ²Ð°Ð½Ð½Ñ Ð·Ð°Ñ…Ð¸Ñ‰ÐµÐ½Ð¸Ñ… каÑкадно Ñторінок',
-'right-editprotected' => 'Ð ÐµÐ´Ð°Ð³ÑƒÐ²Ð°Ð½Ð½Ñ Ð·Ð°Ñ…Ð¸Ñ‰ÐµÐ½Ð¸Ñ… Ñторінок (без каÑкадного захиÑту)',
+'right-editprotected' => 'Ð ÐµÐ´Ð°Ð³ÑƒÐ²Ð°Ð½Ð½Ñ Ñторінок з рівнем захиÑту "{{int:protect-level-sysop}}"',
+'right-editsemiprotected' => 'Ð ÐµÐ´Ð°Ð³ÑƒÐ²Ð°Ð½Ð½Ñ Ñторінок з рівнем захиÑту "{{int:protect-level-autoconfirmed}}"',
'right-editinterface' => 'Ð ÐµÐ´Ð°Ð³ÑƒÐ²Ð°Ð½Ð½Ñ Ñ–Ð½Ñ‚ÐµÑ€Ñ„ÐµÐ¹Ñу кориÑтувача',
'right-editusercssjs' => 'Ð ÐµÐ´Ð°Ð³ÑƒÐ²Ð°Ð½Ð½Ñ CSS- Ñ– JS-файлів інших кориÑтувачів',
'right-editusercss' => 'Ð ÐµÐ´Ð°Ð³ÑƒÐ²Ð°Ð½Ð½Ñ CSS-файлів інших кориÑтувачів',
'right-edituserjs' => 'Ð ÐµÐ´Ð°Ð³ÑƒÐ²Ð°Ð½Ð½Ñ JS-файлів інших кориÑтувачів',
+'right-editmyusercss' => 'Ð ÐµÐ´Ð°Ð³ÑƒÐ²Ð°Ð½Ð½Ñ Ð²Ð»Ð°Ñних CSS-файлів кориÑтувача',
+'right-editmyuserjs' => 'Ð ÐµÐ´Ð°Ð³ÑƒÐ²Ð°Ð½Ð½Ñ Ð²Ð»Ð°Ñних JavaScript-файлів кориÑтувача',
+'right-viewmywatchlist' => 'ПереглÑдати влаÑний ÑпиÑок ÑпоÑтереженнÑ',
+'right-editmywatchlist' => 'Редагувати влаÑний ÑпиÑок ÑпоÑтереженнÑ. Зверніть увагу, що деÑкі дії будуть додавати Ñторінки навіть без такого права.',
+'right-viewmyprivateinfo' => "ПереглÑд влаÑних приватних даних (напр., адреÑа електронної пошти, Ñправжнє ім'Ñ)",
+'right-editmyprivateinfo' => "Ð ÐµÐ´Ð°Ð³ÑƒÐ²Ð°Ð½Ð½Ñ Ð²Ð»Ð°Ñних приватних даних (напр., адреÑа електронної пошти, Ñправжнє ім'Ñ)",
+'right-editmyoptions' => 'Ð ÐµÐ´Ð°Ð³ÑƒÐ²Ð°Ð½Ð½Ñ Ð²Ð»Ð°Ñних налаштувань',
'right-rollback' => 'Швидкий відкіт редагувань оÑтаннього кориÑтувача, Ñкий редагував Ñторінку',
'right-markbotedits' => 'ÐŸÐ¾Ð·Ð½Ð°Ñ‡ÐµÐ½Ð½Ñ Ð²Ñ–Ð´ÐºÐ¸Ð½ÑƒÑ‚Ð¸Ñ… редагувань Ñк Ñ€ÐµÐ´Ð°Ð³ÑƒÐ²Ð°Ð½Ð½Ñ Ð±Ð¾Ñ‚Ð°',
'right-noratelimit' => 'Ðема обмежень за швидкіÑÑ‚ÑŽ',
@@ -1723,12 +1792,19 @@ $1",
'action-userrights-interwiki' => 'зміну прав кориÑтувачів у інших вікі',
'action-siteadmin' => 'Ð±Ð»Ð¾ÐºÑƒÐ²Ð°Ð½Ð½Ñ Ñ– Ñ€Ð¾Ð·Ð±Ð»Ð¾ÐºÐ¾Ð²ÑƒÐ²Ð°Ð½Ð½Ñ Ð±Ð°Ð· даних',
'action-sendemail' => 'відправка електронної пошти',
+'action-editmywatchlist' => 'Ñ€ÐµÐ´Ð°Ð³ÑƒÐ²Ð°Ð½Ð½Ñ Ð’Ð°ÑˆÐ¾Ð³Ð¾ ÑпиÑку ÑпоÑтереженнÑ',
+'action-viewmywatchlist' => 'переглÑд влаÑного ÑпиÑку ÑпоÑтереженнÑ',
+'action-viewmyprivateinfo' => 'переглÑд Ñвоєї приватної інформації',
+'action-editmyprivateinfo' => 'Ñ€ÐµÐ´Ð°Ð³ÑƒÐ²Ð°Ð½Ð½Ñ Ñвоєї приватної інформації',
# Recent changes
'nchanges' => '$1 {{PLURAL:$1|зміна|зміни|змін}}',
+'enhancedrc-since-last-visit' => '$1 {{PLURAL:$1|зміна з оÑтаннього візиту|зміни з оÑтаннього візиту|змін з оÑтаннього візиту}}',
+'enhancedrc-history' => 'Ñ–ÑторіÑ',
'recentchanges' => 'Ðові редагуваннÑ',
'recentchanges-legend' => 'ÐÐ°Ð»Ð°ÑˆÑ‚ÑƒÐ²Ð°Ð½Ð½Ñ Ð½Ð¾Ð²Ð¸Ñ… редагувань',
'recentchanges-summary' => 'ВідÑÑ‚ÐµÐ¶ÐµÐ½Ð½Ñ Ð¾Ñтанніх змін на Ñторінках {{grammar:genitive|{{SITENAME}}}}.',
+'recentchanges-noresult' => 'Ðемає змін за даний період, що відповідають цим критеріÑм.',
'recentchanges-feed-description' => 'ВідÑтежувати оÑтанні зміни у вікі в цьому потоці.',
'recentchanges-label-newpage' => 'Цим редагуваннÑм Ñтворена нова Ñторінка',
'recentchanges-label-minor' => 'Це незначна зміна',
@@ -1767,7 +1843,6 @@ $1",
'recentchangeslinked-feed' => "Пов'Ñзані редгуваннÑ",
'recentchangeslinked-toolbox' => "Пов'Ñзані редагуваннÑ",
'recentchangeslinked-title' => "Пов'Ñзані Ñ€ÐµÐ´Ð°Ð³ÑƒÐ²Ð°Ð½Ð½Ñ Ð´Ð»Ñ Â«$1»",
-'recentchangeslinked-noresult' => "Ðа пов'Ñзаних Ñторінках не було змін протÑгом зазначеного періоду.",
'recentchangeslinked-summary' => "Це ÑпиÑок нещодавніх змін на Ñторінках, на Ñкі поÑилаєтьÑÑ Ð·Ð°Ð·Ð½Ð°Ñ‡ÐµÐ½Ð° Ñторінка (або на Ñторінках, що міÑÑ‚ÑÑ‚ÑŒÑÑ Ð² цій категорії).
Сторінки з [[Special:Watchlist|вашого ÑпиÑку ÑпоÑтереженнÑ]] виділено '''жирним шрифтом'''.",
'recentchangeslinked-page' => 'Ðазва Ñторінки:',
@@ -1779,7 +1854,7 @@ $1",
'reuploaddesc' => 'ПовернутиÑÑ Ð´Ð¾ форми завантаженнÑ',
'upload-tryagain' => 'Зберегти змінений Ð¾Ð¿Ð¸Ñ Ñ„Ð°Ð¹Ð»Ñƒ',
'uploadnologin' => 'Ви не ввійшли в ÑиÑтему',
-'uploadnologintext' => 'Ви повинні [[Special:UserLogin|ввійти до ÑиÑтеми]], щоб завантажувати файли.',
+'uploadnologintext' => 'Ви повинні $1, щоб завантажувати файли.',
'upload_directory_missing' => 'Ð”Ð¸Ñ€ÐµÐºÑ‚Ð¾Ñ€Ñ–Ñ Ð´Ð»Ñ Ð·Ð°Ð²Ð°Ð½Ñ‚Ð°Ð¶ÐµÐ½ÑŒ ($1) відÑÑƒÑ‚Ð½Ñ Ñ– не може бути Ñтворена веб-Ñервером.',
'upload_directory_read_only' => 'Веб-Ñервер не має прав запиÑу в папку ($1), в Ñкій плануєтьÑÑ Ð·Ð±ÐµÑ€Ñ–Ð³Ð°Ñ‚Ð¸ завантажувані файли.',
'uploaderror' => 'Помилка Ð·Ð°Ð²Ð°Ð½Ñ‚Ð°Ð¶ÐµÐ½Ð½Ñ Ñ„Ð°Ð¹Ð»Ñƒ',
@@ -2012,7 +2087,6 @@ $1',
'http-read-error' => 'Помилка Ñ‡Ð¸Ñ‚Ð°Ð½Ð½Ñ HTTP.',
'http-timed-out' => 'ÐŸÐµÑ€ÐµÐ²Ð¸Ñ‰ÐµÐ½Ð½Ñ Ñ‡Ð°Ñу Ð¾Ñ‡Ñ–ÐºÑƒÐ²Ð°Ð½Ð½Ñ HTTP-запиту.',
'http-curl-error' => 'Помилка Ð·Ð²ÐµÑ€Ñ‚Ð°Ð½Ð½Ñ Ð´Ð¾ URL: $1',
-'http-host-unreachable' => 'Ðеможливо доÑÑгнути вказану URL-адреÑу.',
'http-bad-status' => 'Під Ñ‡Ð°Ñ HTTP-запиту виникла проблема: $1 $2',
# Some likely curl errors. More could be added from <http://curl.haxx.se/libcurl/c/libcurl-errors.html>
@@ -2042,6 +2116,10 @@ $1',
'listfiles_size' => 'Розмір (в байтах)',
'listfiles_description' => 'ОпиÑ',
'listfiles_count' => 'ВерÑÑ–Ñ—',
+'listfiles-show-all' => 'Включати Ñтарі верÑÑ–Ñ— зображень',
+'listfiles-latestversion' => 'Поточна верÑÑ–Ñ',
+'listfiles-latestversion-yes' => 'Так',
+'listfiles-latestversion-no' => 'ÐÑ–',
# File description page
'file-anchor-link' => 'Файл',
@@ -2139,6 +2217,13 @@ $1',
'randompage' => 'Випадкова ÑтаттÑ',
'randompage-nopages' => 'Ðема Ñторінок в {{PLURAL:$2|проÑторі назв|проÑторах назв}} $1.',
+# Random page in category
+'randomincategory' => 'Випадкова Ñторінка у категорії',
+'randomincategory-invalidcategory' => '" $1 " не Ñ” дійÑним іменем категорії.',
+'randomincategory-nopages' => 'У [[:Category:$1]] немає Ñторінок.',
+'randomincategory-selectcategory' => 'Перейти на випадкову Ñторінку з категорії: $1 $2.',
+'randomincategory-selectcategory-submit' => 'Перейти',
+
# Random redirect
'randomredirect' => 'Випадкове перенаправленнÑ',
'randomredirect-nopages' => 'ПроÑÑ‚Ñ–Ñ€ назв «$1» не міÑтить перенаправлень.',
@@ -2164,17 +2249,13 @@ $1',
'statistics-users-active-desc' => 'КориÑтувачі, Ñкі здійÑнили ÑкуÑÑŒ дію протÑгом {{PLURAL:$1|минулого днÑ|минулих $1 днів}}',
'statistics-mostpopular' => 'Сторінки, Ñкі найчаÑтіше переглÑдають',
-'disambiguations' => 'Сторінки, що поÑилаютьÑÑ Ð½Ð° Ñторінки неоднозначноÑÑ‚Ñ–.',
-'disambiguationspage' => 'Template:disambig',
-'disambiguations-text' => "ÐаÑтупні Ñторінки поÑилаютьÑÑ Ð½Ð° '''багатозначні Ñторінки'''.
-Ймовірно, вони повинні вказувати на відповідну конкретну Ñтаттю.<br />
-Сторінка вважаєтьÑÑ Ð±Ð°Ð³Ð°Ñ‚Ð¾Ð·Ð½Ð°Ñ‡Ð½Ð¾ÑŽ, Ñкщо на ній розміщений шаблон, назва Ñкого Ñ” на Ñторінці [[MediaWiki:Disambiguationspage]].",
-
'pageswithprop' => 'Сторінки з перевизначеними влаÑтивоÑÑ‚Ñми',
'pageswithprop-legend' => 'Сторінки з перевизначеними влаÑтивоÑÑ‚Ñми',
'pageswithprop-text' => 'Тут перераховані Ñторінки, у Ñких були вручну перевизначені окремі влаÑтивоÑÑ‚Ñ–.',
'pageswithprop-prop' => 'Ðазва влаÑтивоÑÑ‚Ñ–:',
'pageswithprop-submit' => 'Перейти',
+'pageswithprop-prophidden-long' => 'довге Ð·Ð½Ð°Ñ‡ÐµÐ½Ð½Ñ Ñ‚ÐµÐºÑтової влаÑтивоÑÑ‚Ñ– приховано ($1)',
+'pageswithprop-prophidden-binary' => 'двійкове Ð·Ð½Ð°Ñ‡ÐµÐ½Ð½Ñ Ð²Ð»Ð°ÑтивоÑÑ‚Ñ– приховано ($1)',
'doubleredirects' => 'Подвійні перенаправленнÑ',
'doubleredirectstext' => 'Ðа цій Ñторінці наведено ÑпиÑок перенаправлень на інші перенаправленнÑ.
@@ -2232,6 +2313,7 @@ $1',
'mostrevisions' => 'Статті з найбільшою кількіÑÑ‚ÑŽ редагувань',
'prefixindex' => 'Покажчик за початком назв Ñторінок',
'prefixindex-namespace' => 'УÑÑ– Ñторінки з префікÑом (проÑÑ‚Ñ–Ñ€ назв $1)',
+'prefixindex-strip' => 'ОпуÑтити Ð¿Ñ€ÐµÑ„Ñ–ÐºÑ Ñƒ ÑпиÑку',
'shortpages' => 'Короткі Ñтатті',
'longpages' => 'Довгі Ñтатті',
'deadendpages' => 'Сторінки без поÑилань',
@@ -2247,6 +2329,7 @@ $1',
'listusers' => 'СпиÑок кориÑтувачів',
'listusers-editsonly' => 'Показати лише кориÑтувачів, Ñкі зробили принаймні одне редагуваннÑ',
'listusers-creationsort' => 'Сортувати за датою ÑтвореннÑ',
+'listusers-desc' => 'Сортувати за Ñпадним порÑдком',
'usereditcount' => '$1 {{PLURAL:$1|редагуваннÑ|редагуваннÑ|редагувань}}',
'usercreated' => '{{GENDER:$3|Створено}} $1 о $2',
'newpages' => 'Ðові Ñторінки',
@@ -2427,10 +2510,9 @@ $1',
'unwatchthispage' => 'СкаÑувати ÑпоÑтереженнÑ',
'notanarticle' => 'Ðе ÑтаттÑ',
'notvisiblerev' => 'ВерÑÑ–Ñ Ð±ÑƒÐ»Ð° вилучена',
-'watchnochange' => 'За вказаний період в ÑтаттÑÑ… з ÑпиÑку ÑпоÑÑ‚ÐµÑ€ÐµÐ¶ÐµÐ½Ð½Ñ Ð½Ñ–Ñ‡Ð¾Ð³Ð¾ не змінено.',
'watchlist-details' => 'У вашому ÑпиÑку ÑпоÑÑ‚ÐµÑ€ÐµÐ¶ÐµÐ½Ð½Ñ $1 {{PLURAL:$1|Ñторінка|Ñторінки|Ñторінок}} (не враховуючи Ñторінок обговореннÑ).',
-'wlheader-enotif' => '* Ð¡Ð¿Ð¾Ð²Ñ–Ñ‰ÐµÐ½Ð½Ñ ÐµÐ»ÐµÐºÑ‚Ñ€Ð¾Ð½Ð½Ð¾ÑŽ поштою ввімкнено.',
-'wlheader-showupdated' => "* Сторінки, що змінилиÑÑ Ð¿Ñ–ÑÐ»Ñ Ð²Ð°ÑˆÐ¾Ð³Ð¾ оÑтаннього Ñ—Ñ… відвідуваннÑ, виділені '''жирним''' шрифтом.",
+'wlheader-enotif' => 'Ð¡Ð¿Ð¾Ð²Ñ–Ñ‰ÐµÐ½Ð½Ñ ÐµÐ»ÐµÐºÑ‚Ñ€Ð¾Ð½Ð½Ð¾ÑŽ поштою ввімкнено.',
+'wlheader-showupdated' => "Сторінки, що змінилиÑÑ Ð¿Ñ–ÑÐ»Ñ Ð²Ð°ÑˆÐ¾Ð³Ð¾ оÑтаннього Ñ—Ñ… відвідуваннÑ, виділені '''жирним''' шрифтом.",
'watchmethod-recent' => 'переглÑд оÑтанніх редагувань Ñтатей за Ñкими ведетьÑÑ ÑпоÑтереженнÑ',
'watchmethod-list' => 'переглÑд Ñтатей за Ñкими ведетьÑÑ ÑпоÑтереженнÑ',
'watchlistcontains' => 'Ваш ÑпиÑок ÑпоÑÑ‚ÐµÑ€ÐµÐ¶ÐµÐ½Ð½Ñ Ð¼Ñ–Ñтить $1 {{PLURAL:$1|Ñторінку|Ñторінки|Ñторінок}}.',
@@ -2676,7 +2758,7 @@ $1',
'contributions' => 'ВнеÑок {{GENDER:$1|кориÑтувача|кориÑтувачки}}',
'contributions-title' => 'ВнеÑок кориÑтувача $1',
'mycontris' => 'ВнеÑок',
-'contribsub2' => 'ВнеÑок $1 ($2)',
+'contribsub2' => 'Ð”Ð»Ñ {{GENDER:$3|$1}} ($2)',
'nocontribs' => 'Редагувань, що задовольнÑÑŽÑ‚ÑŒ заданим умовам не знайдено.',
'uctop' => '(поточна)',
'month' => 'До міÑÑÑ†Ñ (включно):',
@@ -2831,15 +2913,13 @@ $1',
'ipb_blocked_as_range' => 'Помилка: IP-адреÑа $1 була заблокована не напрÑму Ñ– не може бути розблокована. Однак, вона належить до заблокованого діапазону $2, Ñкий можна розблокувати.',
'ip_range_invalid' => 'ÐеприпуÑтимий діапазон IP-адреÑ.',
'ip_range_toolarge' => 'Ð‘Ð»Ð¾ÐºÑƒÐ²Ð°Ð½Ð½Ñ Ð´Ñ–Ð°Ð¿Ð°Ð·Ð¾Ð½Ñ–Ð², більших за /$1, не дозволені.',
-'blockme' => 'Заблокуй мене',
'proxyblocker' => 'Ð‘Ð»Ð¾ÐºÑƒÐ²Ð°Ð½Ð½Ñ Ð¿Ñ€Ð¾ÐºÑÑ–',
-'proxyblocker-disabled' => 'Ð¤ÑƒÐ½ÐºÑ†Ñ–Ñ Ð²Ñ–Ð´ÐºÐ»ÑŽÑ‡ÐµÐ½Ð°.',
'proxyblockreason' => "Ваша IP-адреÑа заблокована, тому що це — відкритий прокÑÑ–.
Будь лаÑка, зв'ÑжітьÑÑ Ð· вашим Інтернет-провайдером чи Ñлужбою підтримки й повідомте їм про цю Ñерйозну проблему безпеки.",
-'proxyblocksuccess' => 'Виконано.',
'sorbs' => 'DNSBL',
'sorbsreason' => 'Ваша IP-адреÑа чиÑлитьÑÑ Ñк відкритий прокÑÑ– в DNSBL.',
'sorbs_create_account_reason' => 'Ваша IP-адреÑа чиÑлитьÑÑ Ñк відкритий прокÑÑ– в DNSBL. Ви не можете Ñтворити обліковий запиÑ.',
+'xffblockreason' => 'IP-адреÑа в X-Forwarded-For полі заголовка, або ваша, або прокÑÑ– Ñервера, що викориÑтовуєтьÑÑ Ð²Ð°Ð¼Ð¸, заблокована. Початкова причина Ð±Ð»Ð¾ÐºÑƒÐ²Ð°Ð½Ð½Ñ Ð±ÑƒÐ»Ð°:$1',
'cant-block-while-blocked' => 'Ви не можете блокувати інших кориÑтувачів, поки ви Ñамі заблоковані.',
'cant-see-hidden-user' => 'КориÑтувача, Ñкого ви хочете заблокувати, вже заблоковано та приховано. ОÑкільки у Ð²Ð°Ñ Ð½ÐµÐ¼Ð°Ñ” прав щодо Ð¿Ñ€Ð¸Ñ…Ð¾Ð²Ð°Ð½Ð½Ñ ÐºÐ¾Ñ€Ð¸Ñтувачів, ви не можете переглÑнути або змінити дане блокуваннÑ.',
'ipbblocked' => 'Ви не можете блокувати чи розблоковувати інших кориÑтувачів, оÑкільки Ñамі заблоковані',
@@ -3001,6 +3081,8 @@ $1',
'thumbnail-more' => 'Збільшити',
'filemissing' => 'Файл не знайдено',
'thumbnail_error' => 'Помилка ÑÑ‚Ð²Ð¾Ñ€ÐµÐ½Ð½Ñ Ð¼Ñ–Ð½Ñ–Ð°Ñ‚ÑŽÑ€Ð¸: $1',
+'thumbnail_error_remote' => 'ÐŸÐ¾Ð²Ñ–Ð´Ð¾Ð¼Ð»ÐµÐ½Ð½Ñ Ð¿Ñ€Ð¾ помилку від $1:
+$2',
'djvu_page_error' => 'Ðомер Ñторінки DjVu недоÑÑжний',
'djvu_no_xml' => 'Ðеможливо отримати XML Ð´Ð»Ñ DjVu',
'thumbnail-temp-create' => 'Ðе вдалоÑÑ Ñтворити тимчаÑовий файл мініатюри',
@@ -3145,20 +3227,15 @@ $1',
'tooltip-undo' => 'Прибрати внеÑені зміни Ñ– показати попередній переглÑд. ДозволÑÑ” зазначити причину ÑкаÑуваннÑ.',
'tooltip-preferences-save' => 'Зберегти налаштуваннÑ',
'tooltip-summary' => 'Введіть короткий опиÑ',
+'tooltip-iwiki' => '$1 — $2',
# Stylesheets
'common.css' => '/** Розміщений тут CSS буде заÑтоÑовуватиÑÑ Ð´Ð¾ вÑÑ–Ñ… тем Ð¾Ñ„Ð¾Ñ€Ð¼Ð»ÐµÐ½Ð½Ñ */',
-'standard.css' => '/* Розміщений тут CSS-код буде викориÑтаний Ð´Ð»Ñ ÐºÐ¾Ñ€Ð¸Ñтувачів з налаштованою темою Ð¾Ñ„Ð¾Ñ€Ð¼Ð»ÐµÐ½Ð½Ñ Ð¡Ñ‚Ð°Ð½Ð´Ð°Ñ€Ñ‚Ð½Ðµ */',
-'nostalgia.css' => '/* Розміщений тут CSS-код буде викориÑтаний Ð´Ð»Ñ ÐºÐ¾Ñ€Ð¸Ñтувачів з налаштованою темою Ð¾Ñ„Ð¾Ñ€Ð¼Ð»ÐµÐ½Ð½Ñ ÐоÑÑ‚Ð°Ð»ÑŒÐ³Ñ–Ñ */',
'cologneblue.css' => '/* Розміщений тут CSS-код буде викориÑтаний Ð´Ð»Ñ ÐºÐ¾Ñ€Ð¸Ñтувачів з налаштованою темою Ð¾Ñ„Ð¾Ñ€Ð¼Ð»ÐµÐ½Ð½Ñ ÐšÐµÐ»ÑŒÐ½Ñьке блакитне */',
'monobook.css' => '/* Розміщений тут CSS буде заÑтоÑовуватиÑÑ Ð´Ð¾ вÑÑ–Ñ… тем Ð¾Ñ„Ð¾Ñ€Ð¼Ð»ÐµÐ½Ð½Ñ Monobook */',
-'myskin.css' => '/* Розміщений тут CSS-код буде викориÑтаний в темі Ð¾Ñ„Ð¾Ñ€Ð¼Ð»ÐµÐ½Ð½Ñ Ð’Ð»Ð°Ñне */',
-'chick.css' => '/* Розміщений тут CSS-код буде викориÑтаний в темі Ð¾Ñ„Ð¾Ñ€Ð¼Ð»ÐµÐ½Ð½Ñ ÐšÑƒÑ€Ñ‡Ð° */',
-'simple.css' => '/* Розміщений тут CSS-код буде викориÑтаний в темі Ð¾Ñ„Ð¾Ñ€Ð¼Ð»ÐµÐ½Ð½Ñ ÐŸÑ€Ð¾Ñте */',
'modern.css' => '/* Розміщений тут CSS-код буде викориÑтаний в темі Ð¾Ñ„Ð¾Ñ€Ð¼Ð»ÐµÐ½Ð½Ñ Ð¡ÑƒÑ‡Ð°Ñне */',
'vector.css' => '/* Розміщений тут CSS-код буде викориÑтаний в темі Ð¾Ñ„Ð¾Ñ€Ð¼Ð»ÐµÐ½Ð½Ñ Ð’ÐµÐºÑ‚Ð¾Ñ€Ð½Ðµ */',
'print.css' => '/* Розміщений тут CSS-код буде викориÑтаний Ð´Ð»Ñ Ð´Ñ€ÑƒÐºÐ¾Ð²Ð°Ð½Ð¾Ñ— верÑÑ–Ñ— */',
-'handheld.css' => '/* Розміщений тут CSS-код буде викориÑтаний Ð´Ð»Ñ Ð¼Ð¾Ð±Ñ–Ð»ÑŒÐ½Ð¸Ñ… приÑтроїв, що викориÑтовують тему Ð¾Ñ„Ð¾Ñ€Ð¼Ð»ÐµÐ½Ð½Ñ Ð½Ð°Ð»Ð°ÑˆÑ‚Ð¾Ð²Ð°Ð½Ñƒ в $wgHandheldStyle */',
'noscript.css' => '/* Розміщений тут CSS-код буде викориÑтаний Ð´Ð»Ñ ÐºÐ¾Ñ€Ð¸Ñтувачів у Ñких вимкнено JavaScript */',
'group-autoconfirmed.css' => '/* Розміщений тут CSS-код буде викориÑтаний Ð´Ð»Ñ Ð°Ð²Ñ‚Ð¾Ð¿Ñ–Ð´Ñ‚Ð²ÐµÑ€Ð´Ð¶ÐµÐ½Ð¸Ñ… кориÑтувачів */',
'group-bot.css' => '/* Розміщений тут CSS-код буде викориÑтаний тільки Ð´Ð»Ñ Ð±Ð¾Ñ‚Ñ–Ð² */',
@@ -3167,13 +3244,8 @@ $1',
# Scripts
'common.js' => '/* Розміщений тут код JavaScript буде завантажений вÑім кориÑтувачам при зверненні до будь-Ñкої Ñторінки */',
-'standard.js' => '/* Розміщений тут код JavaScript буде завантажений Ð´Ð»Ñ Ð²ÑÑ–Ñ… кориÑтувачів, що викориÑтовують Ñтандартну тему Ð¾Ñ„Ð¾Ñ€Ð¼Ð»ÐµÐ½Ð½Ñ */',
-'nostalgia.js' => '/* Розміщений тут код JavaScript буде завантажений Ð´Ð»Ñ Ð²ÑÑ–Ñ… кориÑтувачів, що викориÑтовують тему Ð¾Ñ„Ð¾Ñ€Ð¼Ð»ÐµÐ½Ð½Ñ ÐоÑÑ‚Ð°Ð»ÑŒÐ³Ñ–Ñ */',
'cologneblue.js' => '/* Розміщений тут код JavaScript буде завантажений Ð´Ð»Ñ Ð²ÑÑ–Ñ… кориÑтувачів, що викориÑтовують тему Ð¾Ñ„Ð¾Ñ€Ð¼Ð»ÐµÐ½Ð½Ñ ÐšÐµÐ»ÑŒÐ½Ñьке Ñинє */',
'monobook.js' => '/* Розміщений тут код JavaScript буде завантажений Ð´Ð»Ñ Ð²ÑÑ–Ñ… кориÑтувачів, що викориÑтовують тему Ð¾Ñ„Ð¾Ñ€Ð¼Ð»ÐµÐ½Ð½Ñ ÐœÐ¾Ð½Ð¾-книга */',
-'myskin.js' => '/* Розміщений тут код JavaScript буде завантажений Ð´Ð»Ñ Ð²ÑÑ–Ñ… кориÑтувачів, що викориÑтовують влаÑну тему Ð¾Ñ„Ð¾Ñ€Ð¼Ð»ÐµÐ½Ð½Ñ */',
-'chick.js' => '/* Розміщений тут код JavaScript буде завантажений Ð´Ð»Ñ Ð²ÑÑ–Ñ… кориÑтувачів, що викориÑтовують тему Ð¾Ñ„Ð¾Ñ€Ð¼Ð»ÐµÐ½Ð½Ñ ÐšÑƒÑ€Ñ‡Ð° */',
-'simple.js' => '/* Розміщений тут код JavaScript буде завантажений Ð´Ð»Ñ Ð²ÑÑ–Ñ… кориÑтувачів, що викориÑтовують проÑту тему Ð¾Ñ„Ð¾Ñ€Ð¼Ð»ÐµÐ½Ð½Ñ */',
'modern.js' => '/* Розміщений тут код JavaScript буде завантажений Ð´Ð»Ñ Ð²ÑÑ–Ñ… кориÑтувачів, що викориÑтовують тему Ð¾Ñ„Ð¾Ñ€Ð¼Ð»ÐµÐ½Ð½Ñ Ð¡ÑƒÑ‡Ð°Ñне */',
'vector.js' => '/* Розміщений тут код JavaScript буде завантажений Ð´Ð»Ñ Ð²ÑÑ–Ñ… кориÑтувачів, що викориÑтовують векторну тему Ð¾Ñ„Ð¾Ñ€Ð¼Ð»ÐµÐ½Ð½Ñ */',
'group-autoconfirmed.js' => '/* Розміщений тут код JavaScript буде завантажений тільки Ð´Ð»Ñ Ð°Ð²Ñ‚Ð¾Ð¿Ñ–Ð´Ñ‚Ð²ÐµÑ€Ð´Ð¶ÐµÐ½Ð¸Ñ… кориÑтувачів */',
@@ -3254,13 +3326,8 @@ The wiki server can't provide data in a format your client can read.",
'pageinfo-category-files' => 'КількіÑÑ‚ÑŒ файлів',
# Skin names
-'skinname-standard' => 'Стандартне',
-'skinname-nostalgia' => 'ÐоÑтальгіÑ',
'skinname-cologneblue' => 'КельнÑьке Ñинє',
'skinname-monobook' => 'Моно-книга',
-'skinname-myskin' => 'Своє',
-'skinname-chick' => 'Курча',
-'skinname-simple' => 'ПроÑте',
'skinname-modern' => 'СучаÑне',
'skinname-vector' => 'Векторне',
@@ -3344,11 +3411,25 @@ $1',
'minutes' => '{{PLURAL:$1|$1 хвилина|$1 хвилини|$1 хвилин}}',
'hours' => '{{PLURAL:$1|$1 година|$1 години|$1 годин}}',
'days' => '{{PLURAL:$1|$1 день|$1 дні|$1 днів}}',
+'weeks' => '{{PLURAL:$1|$1 тиждень|$1 тижні|$1 тижнів}}',
'months' => '{{PLURAL:$1|$1 міÑÑць|$1 міÑÑці|$1 міÑÑців}}',
'years' => '{{PLURAL:$1|$1 рік|$1 роки|$1 років}}',
'ago' => '$1 тому',
'just-now' => 'щойно',
+# Human-readable timestamps
+'hours-ago' => '$1 {{PLURAL:$1|годину|години|годин}} тому',
+'minutes-ago' => '$1 {{PLURAL:$1|хвилину|хвилини|хвилин}} тому',
+'seconds-ago' => '$1 {{PLURAL:$1|Ñекунду|Ñекунди|Ñекунд}} тому',
+'monday-at' => 'У понеділок о $1',
+'tuesday-at' => 'У вівторок о $1',
+'wednesday-at' => 'У Ñереду о $1',
+'thursday-at' => 'У четвер о $1',
+'friday-at' => "У п'Ñтницю о $1",
+'saturday-at' => 'У Ñуботу о $1',
+'sunday-at' => 'У неділю о $1',
+'yesterday-at' => 'Учора о $1',
+
# Bad image list
'bad_image_list' => 'Формат має бути наÑтупним:
@@ -3426,7 +3507,7 @@ Variants for Chinese language
'metadata-langitem' => "'''$2:''' $1",
'metadata-langitem-default' => '$1',
-# EXIF tags
+# Exif tags
'exif-imagewidth' => 'Ширина',
'exif-imagelength' => 'ВиÑота',
'exif-bitspersample' => 'Глибина кольору',
@@ -3619,7 +3700,7 @@ $4, $5, $6 $7
$8',
'exif-subjectnewscode-value' => '$2 ($1)',
-# EXIF attributes
+# Exif attributes
'exif-compression-1' => 'ÐеÑтиÑнутий',
'exif-compression-2' => 'CCITT Group 3, 1-мірна Ð¼Ð¾Ð´Ð¸Ñ„Ñ–ÐºÐ°Ñ†Ñ–Ñ ÐºÐ¾Ð´ÑƒÐ²Ð°Ð½Ð½Ñ Ð´Ð¾Ð²Ð¶Ð¸Ð½ Ñерій Хаффмана',
'exif-compression-3' => 'CCITT Group 3, факÑове кодуваннÑ',
@@ -3960,7 +4041,6 @@ $5
'semicolon-separator' => ';&#32;',
'comma-separator' => ',&#32;',
'colon-separator' => ':&#32;',
-'autocomment-prefix' => '-&#32;',
'pipe-separator' => '&#32;•&#32;',
'word-separator' => '&#32;',
'ellipsis' => '...',
@@ -4110,7 +4190,6 @@ $5
'version-other' => 'Інше',
'version-mediahandlers' => 'Обробники медіа',
'version-hooks' => 'Перехоплювачі',
-'version-extension-functions' => 'Функції розширень',
'version-parser-extensiontags' => 'Теги розширень ÑинтакÑичного аналізатора',
'version-parser-function-hooks' => 'Перехоплювачі функцій ÑинтакÑичного аналізатора',
'version-hook-name' => "Ім'Ñ Ð¿ÐµÑ€ÐµÑ…Ð¾Ð¿Ð»ÑŽÐ²Ð°Ñ‡Ð°",
@@ -4120,6 +4199,7 @@ $5
'version-license' => 'ЛіцензіÑ',
'version-poweredby-credits' => "Ð¦Ñ Ð’Ñ–ÐºÑ– працює на ÑиÑтемі ÑƒÐ¿Ñ€Ð°Ð²Ð»Ñ–Ð½Ð½Ñ Ð²Ð¼Ñ–Ñтом '''[//www.mediawiki.org/ MediaWiki]''', copyright © 2001-$1 $2.",
'version-poweredby-others' => 'інші',
+'version-poweredby-translators' => 'перекладачі translatewiki.net',
'version-credits-summary' => 'Ðам хотілоÑÑ Ð± відзначити наÑтупних оÑіб, що зробили внеÑок у [[Special:Version|MediaWiki]].',
'version-license-info' => 'MediaWiki Ñ” вільним програмним забезпеченнÑм, ви можете розповÑюджувати та/або модифікувати його відповідно до умов GNU General Public License, Ñка Ð¾Ð¿ÑƒÐ±Ð»Ñ–ÐºÐ¾Ð²Ð°Ð½Ñ Ñ„Ð¾Ð½Ð´Ð¾Ð¼ вільного програмного забезпеченнÑ; або верÑÑ–Ñ— 2 Ліцензії, або (на Ваш розÑуд) будь-Ñкої наÑтупної верÑÑ–Ñ—.
@@ -4135,12 +4215,17 @@ MediaWiki поширюєтьÑÑ Ð² надії, що вона буде кориÑ
'version-entrypoints-articlepath' => '[https://www.mediawiki.org/wiki/Manual:$wgArticlePath ШлÑÑ… до Ñтатей]',
'version-entrypoints-scriptpath' => '[https://www.mediawiki.org/wiki/Manual:$wgScriptPath ШлÑÑ… до Ñкриптів]',
-# Special:FilePath
-'filepath' => 'ШлÑÑ… до файлу',
-'filepath-page' => 'Файл:',
-'filepath-submit' => 'Виконати',
-'filepath-summary' => 'Ð¦Ñ Ñпеціальна Ñторінка повертає повний шлÑÑ… до файлу.
-Ð—Ð¾Ð±Ñ€Ð°Ð¶ÐµÐ½Ð½Ñ Ð¿Ð¾ÐºÐ°Ð·ÑƒÑŽÑ‚ÑŒÑÑ Ð² оригінальному розмірі. Інші типи файлів відкриваютьÑÑ Ð¿Ð¾Ð²â€™Ñзаними програмами.',
+# Special:Redirect
+'redirect' => 'ÐŸÐµÑ€ÐµÐ½Ð°Ð¿Ñ€Ð°Ð²Ð»ÐµÐ½Ð½Ñ Ð·Ð° файлом, кориÑтувачем або ID верÑÑ–Ñ—',
+'redirect-legend' => 'Перенаправити на файл чи Ñторінку',
+'redirect-summary' => 'Ð¦Ñ Ñпеціальна Ñторінка перенаправлÑÑ” на файл (за поданою назвою файлу), Ñторінку (за поданим ID верÑÑ–Ñ—) або Ñторінку кориÑтувача (за поданим чиÑловим ID кориÑтувача).',
+'redirect-submit' => 'Перейти',
+'redirect-lookup' => 'Шукати:',
+'redirect-value' => 'ЗначеннÑ:',
+'redirect-user' => 'ID кориÑтувача',
+'redirect-revision' => 'ВерÑÑ–Ñ Ñторінки',
+'redirect-file' => 'Ðазва файлу',
+'redirect-not-exists' => 'Ð—Ð½Ð°Ñ‡ÐµÐ½Ð½Ñ Ð½Ðµ знайдено',
# Special:FileDuplicateSearch
'fileduplicatesearch' => 'Пошук файлів-дублікатів',
@@ -4190,12 +4275,16 @@ MediaWiki поширюєтьÑÑ Ð² надії, що вона буде кориÑ
'tags' => 'Чинні мітки змін',
'tag-filter' => 'Фільтр [[Special:Tags|міток]]:',
'tag-filter-submit' => 'Відфільтрувати',
+'tag-list-wrapper' => '([[Special:Tags|{{PLURAL:$1|Мітка|Мітки|Міток}}]]: $2)',
'tags-title' => 'Мітки',
'tags-intro' => 'Ðа цій Ñторінці наведений ÑпиÑок міток, Ñкими програмне Ð·Ð°Ð±ÐµÐ·Ð¿ÐµÑ‡ÐµÐ½Ð½Ñ Ð¿Ð¾Ð¼Ñ–Ñ‡Ð°Ñ” редагуваннÑ, а також Ð·Ð½Ð°Ñ‡ÐµÐ½Ð½Ñ Ñ†Ð¸Ñ… міток.',
'tags-tag' => 'Ðазва мітки',
'tags-display-header' => 'Показ у ÑпиÑках змін',
'tags-description-header' => 'Повний Ð¾Ð¿Ð¸Ñ Ð·Ð½Ð°Ñ‡ÐµÐ½Ð½Ñ',
+'tags-active-header' => 'Ðктивний?',
'tags-hitcount-header' => 'Помічені редагуваннÑ',
+'tags-active-yes' => 'Так',
+'tags-active-no' => 'ÐÑ–',
'tags-edit' => 'редагувати',
'tags-hitcount' => '$1 {{PLURAL:$1|зміна|зміни|змін}}',
@@ -4216,6 +4305,7 @@ MediaWiki поширюєтьÑÑ Ð² надії, що вона буде кориÑ
'dberr-problems' => 'Вибачте! Ðа цьому Ñайті виникли технічні труднощі.',
'dberr-again' => 'Спробуйте оновити Ñторінку за кілька хвилин.',
'dberr-info' => "(неможливо з'єднатиÑÑ Ð· Ñервером баз даних: $1)",
+'dberr-info-hidden' => "(Ðе вдаєтьÑÑ Ð·Ð²'ÑзатиÑÑ Ð· Ñервером бази даних)",
'dberr-usegoogle' => 'Можете Ñпробувати пошукати за допомогою Google.',
'dberr-outofdate' => 'Майте на увазі, що його індекÑи можуть бути заÑтарілими.',
'dberr-cachederror' => 'Ðижче наведена закешована верÑÑ–Ñ Ð·Ð°Ð¿Ð¸Ñ‚Ð°Ð½Ð¾Ñ— Ñторінки, можливо, вона не показує оÑтанні зміни.',
@@ -4231,6 +4321,9 @@ MediaWiki поширюєтьÑÑ Ð² надії, що вона буде кориÑ
'htmlform-submit' => 'Відправити',
'htmlform-reset' => 'Відкотити зміни',
'htmlform-selectorother-other' => 'Інше',
+'htmlform-no' => 'ÐÑ–',
+'htmlform-yes' => 'Так',
+'htmlform-chosen-placeholder' => 'Виберіть параметр',
# SQLite database support
'sqlite-has-fts' => '$1 з підтримкою повнотекÑтового пошуку',
@@ -4348,4 +4441,19 @@ MediaWiki поширюєтьÑÑ Ð² надії, що вона буде кориÑ
# Image rotation
'rotate-comment' => 'Ð—Ð¾Ð±Ñ€Ð°Ð¶ÐµÐ½Ð½Ñ Ð¿Ð¾Ð²ÐµÑ€Ð½ÑƒÑ‚Ðµ на $1 {{PLURAL:$1|градуÑ|градуÑів}} за годинниковою Ñтрілкою',
+# Limit report
+'limitreport-title' => 'Ðналізатор Ð¿Ñ€Ð¾Ñ„Ñ–Ð»ÑŽÐ²Ð°Ð½Ð½Ñ Ð´Ð°Ð½Ð¸Ñ…:',
+'limitreport-cputime' => 'Ð§Ð°Ñ Ð²Ð¸ÐºÐ¾Ñ€Ð¸ÑÑ‚Ð°Ð½Ð½Ñ Ð¦ÐŸ',
+'limitreport-cputime-value' => '$1 {{PLURAL:$1|Ñекунда|Ñекунди|Ñекунд}}',
+'limitreport-walltime' => 'ВикориÑÑ‚Ð°Ð½Ð½Ñ Ñ€ÐµÐ°Ð»ÑŒÐ½Ð¾Ð³Ð¾ чаÑу',
+'limitreport-walltime-value' => '$1 {{PLURAL:$1|Ñекунда|Ñекунди|Ñекунд}}',
+'limitreport-ppvisitednodes' => 'ЧиÑло вузлів відвіданих препроцеÑором',
+'limitreport-ppgeneratednodes' => 'ЧиÑло вузлів згенерованих препроцеÑором',
+'limitreport-postexpandincludesize' => 'Включений розмір піÑÐ»Ñ Ñ€Ð¾Ð·ÑˆÐ¸Ñ€ÐµÐ½Ð½Ñ',
+'limitreport-postexpandincludesize-value' => '$1/$2 {{PLURAL:$2|байт|байти|байтів}}',
+'limitreport-templateargumentsize' => 'Розмір аргументів шаблону',
+'limitreport-templateargumentsize-value' => '$1/$2 {{PLURAL:$2|байт|байти|байтів}}',
+'limitreport-expansiondepth' => 'Ðайвища глибина розширеннÑ',
+'limitreport-expensivefunctioncount' => 'ЧиÑло дорогої функції аналізатора',
+
);
diff --git a/languages/messages/MessagesUr.php b/languages/messages/MessagesUr.php
index dd88713b..cc5d0f7b 100644
--- a/languages/messages/MessagesUr.php
+++ b/languages/messages/MessagesUr.php
@@ -28,17 +28,17 @@ $fallback8bitEncoding = 'windows-1256';
$rtl = true;
$namespaceNames = array(
- NS_MEDIA => 'زریعÛ',
+ 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_FILE => 'ملÙ',
+ NS_FILE_TALK => 'تبادلۂ_خیال_ملÙ',
+ NS_MEDIAWIKI => 'میڈیاویکی',
+ NS_MEDIAWIKI_TALK => 'تبادلۂ_خیال_میڈیاویکی',
NS_TEMPLATE => 'سانچÛ',
NS_TEMPLATE_TALK => 'تبادلۂ_خیال_سانچÛ',
NS_HELP => 'معاونت',
@@ -47,6 +47,14 @@ $namespaceNames = array(
NS_CATEGORY_TALK => 'تبادلۂ_خیال_زمرÛ',
);
+$namespaceAliases = array(
+ 'زریعÛ' => NS_MEDIA,
+ 'تصویر' => NS_FILE,
+ 'تبادلۂ_خیال_تصویر' => NS_FILE_TALK,
+ 'میڈیاوکی' => NS_MEDIAWIKI,
+ 'تبادلۂ_خیال_میڈیاوکی' => NS_MEDIAWIKI_TALK,
+);
+
$specialPageAliases = array(
'Activeusers' => array( 'متحرک_صارÙین' ),
'Allmessages' => array( 'تمام_پیغامات' ),
@@ -54,13 +62,13 @@ $specialPageAliases = array(
'Ancientpages' => array( 'قدیم_صÙحات' ),
'Badtitle' => array( 'خراب_عنوان' ),
'Blankpage' => array( 'خالی_صÙØ­Û' ),
- 'Block' => array( 'پابندی،_دستور_شبکی_پابندی،_پابندی_بر_صارÙ' ),
+ 'Block' => array( 'پابندی', 'دستور_شبکی_پابندی', 'پابندی_بر_صارÙ' ),
'Blockme' => array( 'میری_پابندی' ),
'Booksources' => array( 'کتابی_وسائل' ),
'BrokenRedirects' => array( 'شکستÛ_رجوع_مکررات' ),
'Categories' => array( 'زمرÛ_جات' ),
'ChangeEmail' => array( 'ڈاک_تبدیل' ),
- 'ChangePassword' => array( 'کلمÛ_شناخت_تبدیل،_تنظیم_کلمÛ_شناخت' ),
+ 'ChangePassword' => array( 'کلمÛ_شناخت_تبدیل', 'تنظیم_کلمÛ_شناخت' ),
'ComparePages' => array( 'موازنÛ_صÙحات' ),
'Confirmemail' => array( 'تصدیق_ڈاک' ),
'Contributions' => array( 'شراکتیں' ),
@@ -78,15 +86,15 @@ $specialPageAliases = array(
'Import' => array( 'درآمدگی' ),
'Invalidateemail' => array( 'ڈاک_تصدیق_منسوخ' ),
'JavaScriptTest' => array( 'تجربÛ_جاوا_اسکرپٹ' ),
- 'BlockList' => array( 'ÙÛرست_ممنوع،_ÙÛرست_دستور_شبکی_ممنوع' ),
+ 'BlockList' => array( 'ÙÛرست_ممنوع', 'ÙÛرست_دستور_شبکی_ممنوع' ),
'LinkSearch' => array( 'تلاش_روابط' ),
'Listadmins' => array( 'ÙÛرست_منتظمین' ),
'Listbots' => array( 'ÙÛرست_روبÛ_جات' ),
- 'Listfiles' => array( 'ÙÛرست_املاÙØŒ_ÙÛرست_تصاویر' ),
- 'Listgrouprights' => array( 'ÙÛرست_اختیارات_گروÛØŒ_صارÙÛŒ_گروÛ_اختیارات' ),
+ 'Listfiles' => array( 'ÙÛرست_املاÙ', 'ÙÛرست_تصاویر' ),
+ 'Listgrouprights' => array( 'ÙÛرست_اختیارات_گروÛ', 'صارÙÛŒ_گروÛ_اختیارات' ),
'Listredirects' => array( 'ÙÛرست_رجوع_مکررات' ),
'Listusers' => array( 'ÙÛرست_صارÙین،_صارÙ_ÙÛرست' ),
- 'Log' => array( 'نوشتÛØŒ_نوشتÛ_جات' ),
+ 'Log' => array( 'نوشتÛ', 'نوشتÛ_جات' ),
'Lonelypages' => array( 'یتیم_صÙحات' ),
'Longpages' => array( 'طویل_صÙحات' ),
'MergeHistory' => array( 'ضم_تاریخچÛ' ),
@@ -95,7 +103,7 @@ $specialPageAliases = array(
'Mypage' => array( 'میرا_صÙØ­Û' ),
'Mytalk' => array( 'میری_Ú¯Ùتگو' ),
'Myuploads' => array( 'میرے_زبراثقالات' ),
- 'Newimages' => array( 'جدید_املاÙØŒ_جدید_تصاویر' ),
+ 'Newimages' => array( 'جدید_املاÙ', 'جدید_تصاویر' ),
'Newpages' => array( 'جدید_صÙحات' ),
'PermanentLink' => array( 'مستقل_ربط' ),
'Popularpages' => array( 'مقبول_صÙحات' ),
@@ -103,7 +111,7 @@ $specialPageAliases = array(
'Prefixindex' => array( 'اشاریÛ_سابقÛ' ),
'Protectedpages' => array( 'محÙوظ_صÙحات' ),
'Protectedtitles' => array( 'محÙوظ_عناوین' ),
- 'Randompage' => array( 'تصادÙØŒ_تصادÙÛŒ_مقالÛ' ),
+ 'Randompage' => array( 'تصادÙ', 'تصادÙÛŒ_مقالÛ' ),
'Randomredirect' => array( 'تصادÙÛŒ_رجوع_مکرر' ),
'Recentchanges' => array( 'حالیÛ_تبدیلیاں' ),
'Recentchangeslinked' => array( 'متعلقÛ_تبدیلیاں' ),
@@ -113,12 +121,12 @@ $specialPageAliases = array(
'Specialpages' => array( 'خصوصی_صÙحات' ),
'Statistics' => array( 'شماریات' ),
'Uncategorizedcategories' => array( 'غیر_زمرÛ_بند_زمرÛ_جات' ),
- 'Uncategorizedimages' => array( 'غیر_زمرÛ_بند_املاÙØŒ_غیر_زمرÛ_بند_تصاویر' ),
+ 'Uncategorizedimages' => array( 'غیر_زمرÛ_بند_املاÙ', 'غیر_زمرÛ_بند_تصاویر' ),
'Uncategorizedpages' => array( 'غیر_زمرÛ_بند_صÙحات' ),
'Uncategorizedtemplates' => array( 'غیر_زمرÛ_بند_سانچے' ),
'Undelete' => array( 'بحال' ),
'Unusedcategories' => array( 'غیر_مستعمل_زمرÛ_جات' ),
- 'Unusedimages' => array( 'غیر_مستعمل_املاÙØŒ_غیر_مستعمل_تصاویر' ),
+ 'Unusedimages' => array( 'غیر_مستعمل_املاÙ', 'غیر_مستعمل_تصاویر' ),
'Unusedtemplates' => array( 'غیر_مستعمل_سانچے' ),
'Unwatchedpages' => array( 'نادیدÛ_صÙحات' ),
'Upload' => array( 'زبراثقال' ),
@@ -128,7 +136,7 @@ $specialPageAliases = array(
'Version' => array( 'اخراجÛ' ),
'Wantedcategories' => array( 'مطلوب_زمرÛ_جات' ),
'Wantedfiles' => array( 'مطلوب_املاÙ' ),
- 'Wantedpages' => array( 'مطلوب_صÙحات،_شکستÛ_روابط' ),
+ 'Wantedpages' => array( 'مطلوب_صÙحات', 'شکستÛ_روابط' ),
'Wantedtemplates' => array( 'مطلوب_سانچے' ),
'Watchlist' => array( 'زیر_نظر_ÙÛرست' ),
'Whatlinkshere' => array( 'ÛŒÛاں_کس_کا_رابطÛ' ),
@@ -140,9 +148,11 @@ $magicWords = array(
'notoc' => array( '0', '_ÙÛرست_Ù†Ûیں_', '__NOTOC__' ),
'toc' => array( '0', '__ÙÛرست__', '__TOC__' ),
'noeditsection' => array( '0', '__ناتحریرقسم__', '__NOEDITSECTION__' ),
+ 'pagename' => array( '1', 'نام_صÙØ­Û', 'PAGENAME' ),
+ 'namespace' => array( '1', 'نام_Ùضا', 'NAMESPACE' ),
'msg' => array( '0', 'پیغام:', 'MSG:' ),
- 'subst' => array( '0', 'نقل:', 'SUBST:' ),
- 'safesubst' => array( '0', 'محÙوظ_نقل:', 'SAFESUBST:' ),
+ 'subst' => array( '0', 'جا:', 'نقل:', 'SUBST:' ),
+ 'safesubst' => array( '0', 'محÙوظ_جا:', 'محÙوظ_نقل:', 'SAFESUBST:' ),
'img_thumbnail' => array( '1', 'تصغیر', 'thumbnail', 'thumb' ),
'img_right' => array( '1', 'دائیں', 'right' ),
'img_left' => array( '1', 'بائیں', 'left' ),
@@ -187,10 +197,6 @@ $messages = array(
'tog-shownumberswatching' => 'دیکھنے والے صارÙین Ú©ÛŒ تعداد دکھاؤ',
'tog-oldsig' => 'Ù…ÙˆØ¬ÙˆØ¯Û Ø¯Ø³ØªØ®Ø·:',
'tog-fancysig' => '(Ø³Ø§Ø¯Û Ø¯Ø³ØªØ®Ø· بلا خودکار ربط)',
-'tog-externaleditor' => 'ÛÙ…ÛŒØ´Û Ø¨ÛŒØ±ÙˆÙ†ÛŒ تدوین کار استعمال کرو (صر٠ماÛرین کیلئے، اÙس کیلئے Ø´Ù…Ø§Ø±Ù†Ø¯Û Ù¾Ø± خاص ترتیبات درکار Ûوتی Ûیں۔
-[//www.mediawiki.org/wiki/Manual:External_editors مزید معلومات.])',
-'tog-externaldiff' => '',
-'tog-showjumplinks' => 'Enable "jump to" accessibility links',
'tog-uselivepreview' => 'براÛ٠راست نمائش استعمال کرو (JavaScript چاÛئے نیز تجرباتی)',
'tog-forceeditsummary' => 'جب میں ترمیمی Ø®Ù„Ø§ØµÛ Ø®Ø§Ù„ÛŒ Ú†Ú¾ÙˆÚ‘ÙˆÚº تو مجھے Ø¢Ú¯Ø§Û Ú©Ø±Ùˆ',
'tog-watchlisthideown' => 'زیرÙنظرÙÛرست سے میری ترمیمات چھپاؤ',
@@ -202,6 +208,7 @@ $messages = array(
'tog-ccmeonemails' => 'دیگر صارÙین Ú©Ùˆ ارسال Ú©Ø±Ø¯Û Ø¨Ø±Ù‚ÛŒ خطوط Ú©ÛŒ نقول مجھے ارسال کریں۔',
'tog-diffonly' => 'مختلÙات Ú©Û’ نیچے صÙØ­Û’ Ú©ÛŒ مشمولات مت دکھاؤ',
'tog-showhiddencats' => 'Ù¾ÙˆØ´ÛŒØ¯Û Ø²Ù…Ø±Û Ø¬Ø§Øª دکھاؤ',
+'tog-useeditwarning' => 'خبردار مجھے جب میں غیر محÙوظ Ú©Ø±Ø¯Û ØªØ¨Ø¯ÛŒÙ„ÛŒÙˆÚº Ú©Û’ ساتھ ایک ترمیم Ú©Û’ صÙØ­Û’ Ú©Ùˆ Ú†Ú¾ÙˆÚ‘ دو',
'underline-always' => 'ÛمیشÛ',
'underline-never' => 'کبھی Ù†Ûیں',
@@ -377,7 +384,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).
+# 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).
'aboutsite' => 'تعار٠{{SITENAME}}',
'aboutpage' => 'Project:تعارÙ',
'copyright' => 'تمام مواد $1 Ú©Û’ تحت میسر ÛÛ’Û”',
@@ -387,7 +394,6 @@ $1',
'disclaimers' => 'اعلانات',
'disclaimerpage' => 'Project:عام اعلان',
'edithelp' => 'معاونت براۓ ترمیم',
-'edithelppage' => 'Help:ترمیم',
'helppage' => 'Help:ÙÛرست',
'mainpage' => 'صÙØ­Û Ø§ÙˆÙ„',
'mainpage-description' => 'صÙØ­Û Ø§ÙˆÙ„',
@@ -416,7 +422,6 @@ $1',
'newmessagesdifflinkplural' => 'آخری {{PLURAL:$1|تبدیلی|تبدیلیاں}}',
'youhavenewmessagesmulti' => 'Ø¡$1 پر آپ کیلئے نئے پیغامات Ûیں',
'editsection' => 'ترمیم',
-'editsection-brackets' => '[$1]',
'editold' => 'ترمیم',
'viewsourceold' => 'مآخذ دیکھئے',
'editlink' => 'تدوین کریں',
@@ -467,17 +472,6 @@ $1',
# General errors
'error' => 'خطاء',
'databaseerror' => 'خطائے ڈیٹابیس',
-'dberrortext' => 'ڈیٹابیس Ú©Û’ استÙØ³Ø§Ø±Û Ù…ÛŒÚº ایک خطائے نحوی واقع Ûوئی ÛÛ’.
-اÙس سے مصنع‌لطی٠میں کھٹمل Ú©ÛŒ نشاندÛÛŒ کا Ø§Ù†Ø¯ÛŒØ´Û ÛÛ’.
-پچھلا Ø³Ø¹ÛŒâ€ŒØ´Ø¯Û ÚˆÛŒÙ¹Ø§Ø¨ÛŒØ³ÛŒ استÙØ³Ø§Ø±Û ÛŒÛ ØªÚ¾Ø§:
-<blockquote><tt>$1</tt></blockquote>
-Ùعلیت میں سے "<tt>$2</tt>".
-MySQL نے خطائی جواب دیا "<tt>$3: $4</tt>".',
-'dberrortextcl' => 'ڈیٹابیس Ú©Û’ استÙØ³Ø§Ø±Û Ù…ÛŒÚº ایک خطائے نحوی واقع Ûوئی ÛÛ’.
-پچھلا Ø³Ø¹ÛŒâ€ŒØ´Ø¯Û ÚˆÛŒÙ¹Ø§Ø¨ÛŒØ³ÛŒ استÙØ³Ø§Ø±Û ÛŒÛ ØªÚ¾Ø§:
-"$1"
-"$2" Ùعلیت میں سے.
-MySQL نے جواب٠خطاء دیا "$3: $4"',
'laggedslavemode' => 'انتباÛ: ممکن ÛÛ’ Ú©Û ØµÙØ­Û Ù…ÛŒÚº Ø­Ø§Ù„ÛŒÛ Ø¨ØªØ§Ø±ÛŒØ®Û Ø¬Ø§Øª شامل Ù†Û ÛÙˆÚº.
Warning: Page may not contain recent updates.',
@@ -522,7 +516,6 @@ Warning: Page may not contain recent updates.',
'protectedinterface' => 'ÛŒÛ ØµÙØ­Û Ù…ØµÙ†Ø¹â€ŒÙ„Ø·ÛŒÙ Ú©ÛŒÙ„Ø¦Û’ سطح‌البینی متن ÙراÛÙ… کرتا ÛÛ’ØŒ اور ناجائزاستعمال Ú©Û’ سدÙباب کیلئے اÙسے مقÙÙ„ کیا گیا ÛÛ’.',
'editinginterface' => "'''انتباÛ: ''' آپ ایک ایسا صÙØ­Û ØªØ¯ÙˆÛŒÙ† کر رÛÛ’ Ûیں جو مصنع‌لطی٠کیلئے سطح‌البینی متن ÙراÛÙ… کرتا ÛÛ’Û” اس صÙØ­Û Ù…ÛŒÚº Ú©ÛŒ جانے والی ترمیم، دیگر صارÙین کیلئے سطح‌البین Ú©Ùˆ تبدیل کردے گی۔
براÛ٠کرم، ØªØ±Ø¬Ù…Û Ú©ÛŒÙ„Ø¦Û’ [//translatewiki.net/wiki/Main_Page?setlang=en '''ٹرانسلیٹ ویکی.نیٹ'''] (میڈیاویکی مقامیانی منصوبÛ) استعمال کیجئے.",
-'sqlhidden' => '(SQL استÙØ³Ø§Ø±Û Ù¾ÙˆØ´ÛŒØ¯Û)',
'namespaceprotected' => "آپ Ú©Ùˆ '''$1''' Ùضائے نام میں صÙحات تدوین کرنے Ú©ÛŒ اÙجازت Ù†Ûیں ÛÛ’.",
'ns-specialprotected' => 'خاص صÙحات Ú©ÛŒ تدوین Ù†Ûیں Ú©ÛŒ جاسکتی.',
'titleprotected' => 'اس عنوان Ú©Ùˆ [[User:$1|$1]] Ù†Û’ تخلیق سے محÙوظ کیا ÛÛ’.
@@ -540,7 +533,10 @@ Warning: Page may not contain recent updates.',
آپ گمنام طور پر {{SITENAME}} کا استعمال جاری رکھ سکتے Ûیں، یا Ø¯ÙˆØ¨Ø§Ø±Û Ø§Ø³ÛŒ نام یا مختل٠نام سے <span class='plainlinks'>[$1 Ø¯ÙˆØ¨Ø§Ø±Û Ø¯Ø§Ø®Ù„Ù Ù†ÙˆØ´ØªÛ]</span> بھی ÛÙˆ سکتے Ûیں۔ ÛŒÛ ÛŒØ§Ø¯ آوری کرلیجیۓ Ú©Û Ú©Ú†Ú¾ صÙحات ایسے نظر آتے رÛیں Ú¯Û’ Ú©Û Ø¬ÛŒØ³Û’ ابھی آپ خارج Ù†Ûیں Ûوئے ØŒ جب تک آپ اپنے متصÙØ­ کا ابطن ØµØ§Ù Ù†Û Ú©Ø±Ø¯ÛŒÚºÛ”",
'yourname' => 'اسم٠رکنیت',
'yourpassword' => 'کلمۂ شناخت',
+'createacct-yourpassword-ph' => 'ایک پاس ورڈ داخل کریں',
'yourpasswordagain' => 'کلمۂ شناخت Ø¯ÙˆØ¨Ø§Ø±Û Ù„Ú©Ú¾ÛŒÚº',
+'createacct-yourpasswordagain' => 'کلمۂ اجازت تصدیق کریں',
+'createacct-yourpasswordagain-ph' => 'پاس ورڈ پھر داخل کریں',
'remembermypassword' => 'اÙس متصÙØ­ پر میرے داخل٠نوشتگی معلومات یاد رکھو (Ø²ÛŒØ§Ø¯Û Ø³Û’ Ø²ÛŒØ§Ø¯Û $1 {{PLURAL:$1|دÙÙ†|ایام}} کیلئے)',
'yourdomainname' => 'آپکا ڈومین',
'password-change-forbidden' => 'آپ اس ویکی پر پارلÙظ (پاس روڈ) تبدیل Ù†Ûیں کر سکتے',
@@ -559,12 +555,25 @@ Warning: Page may not contain recent updates.',
'gotaccount' => "Ù¾ÛÙ„Û’ سے Ú©Ú¾Ø§ØªÛ Ø¨Ù†Ø§ Ûوا ÛÛ’? '''$1'''.",
'gotaccountlink' => 'داخل Ûوجائیے',
'userlogin-resetlink' => 'Ø¯Ø§Ø®Ù„Ù Ù†ÙˆØ´ØªÛ Ûونے Ú©ÛŒ تÙاصیل بھول گئے Ûیں؟',
+'createacct-join' => 'اپنی معلومات نیچے لکھیں۔',
+'createacct-emailrequired' => 'ای میل پتÛ',
+'createacct-emailoptional' => 'ای میل ایڈریس (اختیاری)',
+'createacct-email-ph' => 'اپنا برقی Ù¾ØªÛ Ù„Ú©Ú¾ÛŒÚº',
'createaccountmail' => 'بذریعۂ برقی ڈاک',
+'createacct-realname' => 'اصلی نام (اختیاری)',
'createaccountreason' => 'وجÛ:',
+'createacct-reason' => 'وجÛ',
+'createacct-captcha' => 'Ø­Ùاظتی تدبیر',
+'createacct-imgcaptcha-ph' => 'آپ اوپر دیکھ متن داخل کریں',
+'createacct-benefit-heading' => '{{SITENAME}} آپ جیسے لوگوں Ú©ÛŒ طر٠سے بنایا گیا ÛÛ’ Û”',
+'createacct-benefit-body1' => 'ترمیم',
+'createacct-benefit-body2' => 'صÙحات',
+'createacct-benefit-body3' => 'شرکت کرنے والے اس Ù…Ø§Û Ú©Û’',
'badretype' => 'درج Ø´Ø¯Û Ú©Ù„Ù…Û‚ شناخت اصل سے مطابقت Ù†Ûیں رکھتا۔',
'userexists' => 'داخل Ú©Ø±Ø¯Û Ø§Ø³Ù… صار٠پÛÙ„Û’ سے مستعمل ÛÛ’Û”
براÛ٠کرم! کوئی دوسرا اسم منتخب کیجئے۔',
'loginerror' => 'داخلے میں غلطی',
+'createacct-error' => 'تخلیق Ú©Ú¾Ø§ØªÛ Ù…ÛŒÚº نقص',
'createaccounterror' => 'Ú©Ú¾Ø§ØªÛ $1 بنایا Ù†Ûیں جاسکا',
'nocookiesnew' => 'کھاتۂ صار٠بنادیا گیا ÛÛ’ØŒ لیکن آپ کا Ø¯Ø§Ø®Ù„Û Ù†Ûیں Ûوا.
صارÙین Ú©Û’ Ø¯Ø§Ø®Ù„Û Ú©ÛŒÙ„Ø¦Û’ {{SITENAME}} کوکیز استعمال کرتا ÛÛ’.
@@ -641,7 +650,7 @@ Warning: Page may not contain recent updates.',
'newpassword' => 'نیا کلمۂ شناخت',
'retypenew' => 'نیا کلمۂ شناخت Ø¯ÙˆØ¨Ø§Ø±Û Ø¯Ø±Ø¬ کریں:',
'resetpass_submit' => 'پارلÙظ بناؤ اور داخل Ûوجاؤ',
-'resetpass_success' => 'آپ کا پارلÙظ کامیابی سے تبدیل Ûوگیا!
+'changepassword-success' => 'آپ کا پارلÙظ کامیابی سے تبدیل Ûوگیا!
اَب Ø¯Ø§Ø®Ù„Ù Ù†ÙˆØ´ØªÛ Ú©ÛŒØ§ جارÛا ÛÛ’...',
'resetpass_forbidden' => 'پارلÙظ تبدیل Ù†Ûیں Ûوسکتا',
'resetpass-no-info' => 'اÙس صÙØ­Û ØªÚ© براÛ٠راست رسائی کیلئے آپ Ú©Ùˆ Ø¯Ø§Ø®Ù„Ù Ù†ÙˆØ´ØªÛ Ûونا Ù¾Ú‘Û’ گا.',
@@ -782,6 +791,7 @@ $1 نے پابندی لگائی تھی.
لگتا ÛÛ’ ÛŒÛ Ø­Ø°Ù Ûوچکا ÛÛ’.',
'edit-conflict' => 'تنازعۂ تدوین.',
'edit-no-change' => 'آپ Ú©ÛŒ تدوین Ú©Ùˆ نظرانداز کردیا گیا، Ú©ÛŒÙˆÙ†Ú©Û Ù…ØªÙ† میں کوئی تبدیلی Ù†Ûیں Ûوئی تھی.',
+'postedit-confirmation' => 'آپ Ú©ÛŒ ترمیم محÙوظ Ûوگئی۔',
'edit-already-exists' => 'نیا صÙØ­Û ØªØ®Ù„ÛŒÙ‚ Ù†Ûیں کیا جاسکتا.
ÛŒÛ Ù¾ÛÙ„Û’ سے موجود ÛÛ’.',
@@ -905,7 +915,6 @@ $1",
'searchmenu-legend' => 'اختیارات٠تلاش',
'searchmenu-exists' => "'''اÙس ویکی پر \"[[:\$1]]\" نامی ایک صÙØ­Û Ù…ÙˆØ¬ÙˆØ¯ ÛÛ’'''",
'searchmenu-new' => "'''اÙس ویکی پر صÙØ­Û \"[[:\$1]]\" تخلیق کیجئے!'''",
-'searchhelp-url' => 'Help:ÙÛرست',
'searchprofile-articles' => 'مشمولاتی صÙحات',
'searchprofile-project' => 'صÙحات٠مدد Ùˆ منصوبÛ',
'searchprofile-images' => 'کثیرالوسیط',
@@ -945,10 +954,6 @@ $1",
آپ ÙÛŒ الحال Ú¯ÙˆÚ¯Ù„ Ú©Û’ ذریعے تلاش کرسکتے Ûیں.
یاد رکھئے Ú©Û Ø§ÙÙ† Ú©Û’ {{SITENAME}} اشاریے ممکناً پرانے Ûوسکتے Ûیں.',
-# Quickbar
-'qbsettings' => 'Ùوری‌بار',
-'qbsettings-none' => 'Ûیچ',
-
# Preferences page
'preferences' => 'ترجیحات',
'mypreferences' => 'میری ترجیÛات',
@@ -976,7 +981,6 @@ $1",
'resetprefs' => 'نامحÙوظ تبدیلیاں صا٠کرو',
'restoreprefs' => 'تمام بےنقص ترتیبات بحال کیجئے',
'prefs-editing' => 'تدوین',
-'prefs-edit-boxsize' => 'تدوینی کھڑکی کی جسامت.',
'rows' => 'صÙیں:',
'columns' => 'قطاریں:',
'searchresultshead' => 'تلاش',
@@ -1006,7 +1010,6 @@ $1",
'prefs-custom-css' => 'Ø®ÙˆØ¯Ø³Ø§Ø®ØªÛ CSS',
'prefs-custom-js' => 'Ø®ÙˆØ¯Ø³Ø§Ø®ØªÛ JS',
'prefs-emailconfirm-label' => 'برقی Ù¾ØªÛ Ú©ÛŒ تصدیق:',
-'prefs-textboxsize' => 'خانۂ تدوین کی جسامت',
'youremail' => '٭ برقی خط',
'username' => 'اسم صارÙ',
'uid' => 'صار٠نمبر:',
@@ -1224,9 +1227,6 @@ HTML tags جانچئے.',
'statistics' => 'اعداد و شمار',
'statistics-header-users' => 'ارکان کے اعداد و شمار',
-'disambiguations' => 'ضد ابÛام صÙحات',
-'disambiguationspage' => 'سانچÛ:ضدابÛام',
-
'doubleredirects' => 'دوÛرے متبادل ربط',
'brokenredirects' => 'نامکمل متبادل ربط',
@@ -1427,7 +1427,6 @@ Also see [[Special:WantedCategories|wanted categories]].',
'contribslink' => 'شـراکـت',
'blocklogpage' => 'نوشتۂ پابندی',
'block-log-flags-nocreate' => 'کھاتے Ú©ÛŒ تخلیق غیرÙعال',
-'proxyblocksuccess' => 'کردیا.',
# Move page
'move-page' => 'منتقلی',
@@ -1568,6 +1567,9 @@ $1 × $2 عکصر (پکسلز)ØŒ حجم ملÙ: $3ØŒ MIME قسم: $4',
'ilsubmit' => 'تلاش',
'bydate' => 'بالحاظ تاریخ',
+# Video information, used by Language::formatTimePeriod() to format lengths in the above messages
+'weeks' => '{{PLURAL:$1|$1ÛÙتÛ| $1 ÛÙتے}}',
+
# Bad image list
'bad_image_list' => 'شکلبند درج ذیل ÛÛ’:
diff --git a/languages/messages/MessagesUz.php b/languages/messages/MessagesUz.php
index 08bb259a..41ba94b8 100644
--- a/languages/messages/MessagesUz.php
+++ b/languages/messages/MessagesUz.php
@@ -30,8 +30,8 @@ $namespaceNames = array(
NS_USER => 'Foydalanuvchi',
NS_USER_TALK => 'Foydalanuvchi_munozarasi',
NS_PROJECT_TALK => '$1_munozarasi',
- NS_FILE => 'Tasvir',
- NS_FILE_TALK => 'Tasvir_munozarasi',
+ NS_FILE => 'Fayl',
+ NS_FILE_TALK => 'Fayl_munozarasi',
NS_MEDIAWIKI => 'MediaWiki',
NS_MEDIAWIKI_TALK => 'MediaWiki_munozarasi',
NS_TEMPLATE => 'Andoza',
@@ -44,6 +44,8 @@ $namespaceNames = array(
$namespaceAliases = array(
'Mediya' => NS_MEDIA,
+ 'Tasvir' => NS_FILE,
+ 'Tasvir_munozarasi' => NS_FILE_TALK,
'MediyaViki' => NS_MEDIAWIKI,
'MediyaViki_munozarasi' => NS_MEDIAWIKI_TALK,
'Shablon' => NS_TEMPLATE,
@@ -53,7 +55,7 @@ $namespaceAliases = array(
);
$magicWords = array(
- 'redirect' => array( '0', '#YONALTIRISH', '#REDIRECT' ),
+ 'redirect' => array( '0', '#YOʻNALTIRISH', '#YONALTIRISH', '#REDIRECT' ),
'notoc' => array( '0', '__ICHIDAGILARYOQ__', '__NOTOC__' ),
'nogallery' => array( '0', '__GALEREYAYOQ__', '__NOGALLERY__' ),
'forcetoc' => array( '0', '__ICHIDAGILARMAJBURIY__', '__FORCETOC__' ),
@@ -89,6 +91,10 @@ $magicWords = array(
'numberofedits' => array( '1', 'OZGARISHSONI', 'NUMBEROFEDITS' ),
'numberofviews' => array( '1', 'KORISHSONI', 'NUMBEROFVIEWS' ),
'pagename' => array( '1', 'SAHIFANOMI', 'PAGENAME' ),
+ 'namespace' => array( '1', 'NOMFAZO', 'NAMESPACE' ),
+ 'gender' => array( '0', 'JINS', 'GENDER:' ),
+ 'currentweek' => array( '1', 'JORIYHAFTA', 'CURRENTWEEK' ),
+ 'language' => array( '0', '#TIL:', '#LANGUAGE:' ),
'numberofadmins' => array( '1', 'ADMINISTRATORSONI', 'NUMBEROFADMINS' ),
'special' => array( '0', 'maxsus', 'special' ),
'tag' => array( '0', 'yorliq', 'tag' ),
@@ -133,9 +139,6 @@ $messages = array(
'tog-shownumberswatching' => 'Sahifani kuzatuv roʻyxatiga olgan foydalanuvchilar sonini koʻrsatish',
'tog-oldsig' => 'Joriy imzo:',
'tog-fancysig' => 'Imzoni viki-belgi qilib koʻrsatish (avtomatik ishoratsiz)',
-'tog-externaleditor' => 'Sukut boʻyicha tashqi tahrirlash dasturidan foydalanish (faqat mutaxassislar uchun, kompyuteringizda maxsus moslamalar boʻlishi zarur. [//www.mediawiki.org/wiki/Manual:External_editors Batafsil])',
-'tog-externaldiff' => 'Sukut boʻyicha tashqi taqqoslash dasturidan foydalanish (faqat mutaxassislar uchun, kompyuteringizda maxsus moslamalar boʻlishi zarur. [//www.mediawiki.org/wiki/Manual:External_editors Batafsil])',
-'tog-showjumplinks' => 'Yordamchi «tez oʻtish» havolalarini yoqish',
'tog-uselivepreview' => 'Tez koʻrib chiqish (JavaScript orqali) (sinovda)',
'tog-forceeditsummary' => 'Qisqa tavsif oynasi toʻldirilmagani haqida ogohlantirish koʻrsatilsin',
'tog-watchlisthideown' => 'Oʻz tahrirlarim kuzatuv roʻyxatimda koʻrsatilmasin',
@@ -149,6 +152,7 @@ $messages = array(
'tog-showhiddencats' => 'Yashirin turkumlarni koʻrsatish',
'tog-noconvertlink' => 'Sarlavhani oʻzgartirish havolasini oʻchirib qoʻyish',
'tog-norollbackdiff' => 'Tahrir qaytarilganda, versiyalar taqqosi koʻrsatilmasin',
+'tog-useeditwarning' => 'Kiritgan oʻzgarishlarimni saqlamay sahifadan chiqib ketayotganim haqida ogohlantirilsin',
'underline-always' => 'Har doim',
'underline-never' => 'Hech qachon',
@@ -232,7 +236,7 @@ $messages = array(
'noindex-category' => 'Indekslanmaydigan sahifalar',
'broken-file-category' => 'Ishlamaydigan fayl havolalari bor sahifalar',
-'linkprefix' => '/^(.*?)([a-zA-Z\\x80-\\xffʻʼ«„]+)$/sDu',
+'linkprefix' => '/^((?>.*(?<![a-zA-Z\\x80-\\xffʻʼ«„])))(.+)$/sDu',
'about' => 'Haqida',
'article' => 'Sahifa',
@@ -338,7 +342,7 @@ $1',
'pool-queuefull' => 'Soʻrovlar jamlanmasi toʻldi',
'pool-errorunknown' => 'Nomaʼlum xato',
-# 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).
+# 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).
'aboutsite' => '{{SITENAME}} haqida',
'aboutpage' => 'Project:Haqida',
'copyright' => 'Keltirilgan maʼlumotlar $1 orqali tarqatilmoqda.',
@@ -348,7 +352,6 @@ $1',
'disclaimers' => 'Ogohlantirishlar',
'disclaimerpage' => 'Project:Umumiy ogohlantirish',
'edithelp' => 'Tahrirlash yordami',
-'edithelppage' => 'Help:Tahrirlash',
'helppage' => 'Help:Mundarija',
'mainpage' => 'Bosh sahifa',
'mainpage-description' => 'Bosh sahifa',
@@ -452,10 +455,17 @@ Ushbu xabar tarjimasini qoʻshish yoki oʻzgartirish uchun, iltimos, MediaWikini
{{SITENAME}} saytidan anonim holda foydalanishda davom etishindiz mumkin. Yoki siz yana hozirgi yoki boshqa foydalanuvchi nomi bilan qaytadan tizimga kirishingiz mumkin.
Shuni e'tiborga olingki, ayrim sahifalar siz brauzeringiz keshini tozalamaguningizga qadar xuddi tizimga kirganingizdagidek ko'rinishda davom etaverishi mumkin.",
'yourname' => 'Foydalanuvchi nomi:',
+'userlogin-yourname' => 'Foydalanuvchi nomi',
+'userlogin-yourname-ph' => 'Foydalanuvchi nomingizni kiriting',
'yourpassword' => 'Maxfiy soʻz:',
+'userlogin-yourpassword-ph' => 'Maxfiy soʻzni kiriting',
+'createacct-yourpassword-ph' => 'Maxfiy soʻzni kiriting',
'yourpasswordagain' => 'Maxfiy so‘zni qayta kiriting:',
+'createacct-yourpasswordagain' => 'Maxfiy soʻzni tasdiqlang',
+'createacct-yourpasswordagain-ph' => 'Maxfiy soʻzni yana bir bor kiriting',
'remembermypassword' => 'Hisob ma’lumotlarim ushbu brauzerda eslab qolinsin (ko‘pi bilan $1 {{PLURAL:$1|kunga|kunga}})',
-'securelogin-stick-https' => 'Kirgandan keyin HTTPS boʻyicha ulanishni davom ettirish',
+'userlogin-remembermypassword' => 'Esda saqla',
+'userlogin-signwithsecure' => 'Himoyalangan holda kirish',
'yourdomainname' => 'Sizning domeningiz:',
'password-change-forbidden' => 'Siz bu vikida maxfiy soʻzni oʻzgartira olmaysiz.',
'login' => 'Kirish',
@@ -466,14 +476,28 @@ Shuni e'tiborga olingki, ayrim sahifalar siz brauzeringiz keshini tozalamaguning
'logout' => 'Chiqish',
'userlogout' => 'Chiqish',
'notloggedin' => 'Siz tizimga kirmagansiz',
+'userlogin-noaccount' => 'Hisobingiz yoʻqmi?',
+'userlogin-joinproject' => '{{SITENAME}}ga aʼzo boʻlish',
'nologin' => "Hisobingiz yoʻqmi? '''$1'''.",
'nologinlink' => 'Hisob yaratish',
'createaccount' => 'Hisob yaratish',
'gotaccount' => "Hisobingiz bormi? '''$1'''.",
'gotaccountlink' => 'Kirish',
'userlogin-resetlink' => 'Kirish maʻlumotlaringiz esdan chiqdimi?',
+'userlogin-resetpassword-link' => 'Maxfiy soʻzni yangilash',
+'userlogin-helplink' => '[[{{MediaWiki:helplogin-url}}|Kirish uchun yordam]]',
+'createacct-join' => 'Maʼlumotlaringizni quyiga yozing',
+'createacct-emailoptional' => 'Elektron pochta manzili (majburiy emas)',
+'createacct-email-ph' => 'Elektron pochtangiz manzilini kiriting',
'createaccountmail' => "E-mail orqali maxfiy so'zni jo'natish",
'createaccountreason' => 'Sabab:',
+'createacct-captcha' => 'Xavfsizlik tekshiruvi',
+'createacct-imgcaptcha-ph' => 'Yuqoridagi yozuvni bu yerga kiriting',
+'createacct-submit' => 'Hisob yaratish',
+'createacct-benefit-heading' => '{{SITENAME}} Sizga oʻxshagan odamlar tomonidan yaratiladi',
+'createacct-benefit-body1' => 'tahrirlar soni',
+'createacct-benefit-body2' => 'maqolalar soni',
+'createacct-benefit-body3' => 'soʻnggi paytdagi ishtirokchilar soni',
'badretype' => "Siz tomondan kiritilgan maxfiy so'zlar mos kelmayapti.",
'loginerror' => 'Foydalanuvchini aniqlashda xatolik',
'createaccounterror' => 'Hisob yozuvi yaratishning iloji yoʻq: $1',
@@ -507,9 +531,9 @@ Ism yozilishini tekshirib koʻring.',
# Special:PasswordReset
'passwordreset' => 'Maxfiy soʻzni yangilash',
-'passwordreset-text' => 'Mahfiy soʻzni tashlash uchun ushbu oynalarni toʻltiring.',
+'passwordreset-text-one' => 'Mahfiy soʻzni tashlash uchun ushbu oynalarni toʻltiring.',
+'passwordreset-text-many' => '{{PLURAL:$1|Maxfiy soʻzni yangilash uchun quyidagi oynalardan birini toʻldiring.}}',
'passwordreset-legend' => 'Maxfiy soʻzni yangilash',
-'passwordreset-pretext' => '{{PLURAL:$1||Quyidagi maʼlumotlardan birorta qismini keltiring}}',
'passwordreset-username' => 'Foydalanuvchi nomi:',
'passwordreset-domain' => 'Domen:',
'passwordreset-email' => 'Elektron pochta manzili:',
@@ -628,6 +652,7 @@ Qulaylik uchun quyida yoʻqotilish qaydlari keltirilgan:",
Maʼlumot uchun quyida oʻchirish va qayta nomlash jurnallaridan mos yozuvlar keltirilgan.',
'log-fulllog' => 'Qaydlarni toʻliq koʻrish',
'edit-conflict' => 'Tahrirlash toʻqnashuvi.',
+'postedit-confirmation' => 'Tahriringiz saqlandi.',
'defaultmessagetext' => "Boshlang'ich matn",
# Parser/template warnings
@@ -733,7 +758,6 @@ Bu yerda: (joriy) = hozirgi koʻrinish bilan farq,
'searchmenu-legend' => 'Qidiruv shartlari',
'searchmenu-exists' => "'''Ushbu vikida \"[[:\$1]]\" nomli sahifa mavjud.'''",
'searchmenu-new' => "'''Ushbu vikida \"[[:\$1]]\" sahifasini yarat!'''",
-'searchhelp-url' => 'Help:Mundarija',
'searchmenu-prefix' => '[[Special:PrefixIndex/$1|Shu prefiksli sahifalarni koʻrsatish]]',
'searchprofile-articles' => 'Asosiy sahifalar',
'searchprofile-project' => 'Yordam va loyiha sahifalari',
@@ -773,14 +797,6 @@ Bu yerda: (joriy) = hozirgi koʻrinish bilan farq,
'powersearch-togglenone' => 'Hech qaysini',
'search-external' => 'Tashqi qidiruv',
-# Quickbar
-'qbsettings' => 'Saytda harakatlanish darchasi',
-'qbsettings-none' => "Ko'rsatmaslik",
-'qbsettings-fixedleft' => "Qo'zg'almas chap",
-'qbsettings-fixedright' => "Qo'zg'almas o'ng",
-'qbsettings-floatingleft' => 'Suzuvchi chap',
-'qbsettings-floatingright' => "Suzuvchi o'ng",
-
# Preferences page
'preferences' => 'Moslamalar',
'mypreferences' => 'Moslamalarim',
@@ -809,7 +825,6 @@ Bu yerda: (joriy) = hozirgi koʻrinish bilan farq,
'resetprefs' => 'Bekor qilish',
'restoreprefs' => 'Barcha moslamalarni dastlabki holatiga qaytarish',
'prefs-editing' => 'Tahrirlash',
-'prefs-edit-boxsize' => 'Tahrir oynasining oʻlchami',
'rows' => 'Qatorlar soni:',
'columns' => 'Ustunlar soni:',
'searchresultshead' => 'Qidiruv',
@@ -848,7 +863,6 @@ Bu yerda: (joriy) = hozirgi koʻrinish bilan farq,
'prefs-custom-js' => 'Shaxsiy JavaScript',
'prefs-common-css-js' => 'Umumiy CSS/JavaScript (barcha tashqi koʻrinishlar uchun):',
'prefs-emailconfirm-label' => 'Elektron pochta manzilini tasdiqlash:',
-'prefs-textboxsize' => 'Tahrir oynasining oʻlchami',
'youremail' => 'E-mail:',
'username' => 'Foydalanuvchi nomi',
'uid' => 'Identifikator:',
@@ -974,7 +988,6 @@ Agar keltirsangiz, undan sahifa kim tomonidan tahrirlanganini koʻrsatish uchun
'recentchangeslinked-feed' => 'Bogʻliq oʻzgarishlar',
'recentchangeslinked-toolbox' => 'Bogʻliq oʻzgarishlar',
'recentchangeslinked-title' => '"$1"ga aloqador oʻzgarishlar',
-'recentchangeslinked-noresult' => 'Berilgan davrda bogʻlangan sahifalarda oʻzgarishlar boʻlmagan.',
'recentchangeslinked-summary' => "Ushbu maxsus sahifa unga bogʻlangan sahifalardagi soʻnggi oʻzgarishlarni koʻrsatadi. [[Special:Watchlist|Kuzatuv roʻyxatingizdagi]] sahifalar '''qalin''' qilib koʻrsatilgan.",
'recentchangeslinked-page' => 'Sahifa nomi:',
'recentchangeslinked-to' => 'Koʻrsatilgan sahifaga bogʻlangan sahifalardagi oʻzgarishlarni koʻrish',
@@ -1065,8 +1078,6 @@ Uning [$2 fayl tavsifi sahifasidan] olingan tavsifi quyida keltirilgan.',
'statistics-users-active' => 'Faol foydalanuvchilar',
'statistics-users-active-desc' => 'Oxirgi $1 kun ichida kamida bitta amal qilgan foydalanuvchilar',
-'disambiguationspage' => '{{ns:template}}:Disambig',
-
# Miscellaneous special pages
'nbytes' => '$1 {{PLURAL:$1|bayt}}',
'ncategories' => '$1 {{PLURAL:$1|turkum|turkumlar}}',
@@ -1452,7 +1463,6 @@ Yaqinda sodir etilgan yoʻqotishlar uchun $2ni koʻring.',
'blocklogentry' => '$2 muddatga [[$1]]ni chetlashtirdi $3',
'block-log-flags-nocreate' => 'hisob ochish toʻxtatilgan',
'block-log-flags-nousertalk' => "o'zining munozara sahifasini tahrirlay olmaydi",
-'proxyblocksuccess' => 'Bajarildi.',
# Move page
'move-page' => '$1 — qayta nomlash',
@@ -1584,12 +1594,7 @@ Umumiy omborda [[:$1]] mavjud. Faylning bu nomga qayta nomlanishi faylning umumi
'pageinfo-redirectsto' => 'Qayta yoʻnaltirish',
# Skin names
-'skinname-standard' => 'Klassik',
-'skinname-nostalgia' => "Sog'inch",
'skinname-cologneblue' => 'Kyolncha sogʻinch',
-'skinname-myskin' => "O'zimniki",
-'skinname-chick' => "Jo'ja",
-'skinname-simple' => 'Oddiy',
'skinname-modern' => 'Zamonaviy',
'skinname-vector' => 'Vektor',
@@ -1618,7 +1623,7 @@ Umumiy omborda [[:$1]] mavjud. Faylning bu nomga qayta nomlanishi faylning umumi
'metadata-expand' => 'Batafsil axborotni koʻrsatish',
'metadata-collapse' => 'Batafsil axborotni yashirish',
-# EXIF tags
+# Exif tags
'exif-imagewidth' => 'Eni',
'exif-imagelength' => 'Boʻyi',
'exif-artist' => 'Muallif',
diff --git a/languages/messages/MessagesVe.php b/languages/messages/MessagesVe.php
index 70892fb5..4732fb68 100644
--- a/languages/messages/MessagesVe.php
+++ b/languages/messages/MessagesVe.php
@@ -12,12 +12,12 @@
*/
$messages = array(
-'search' => 'á¹°olani',
+'search' => 'á¹°olani',
'searchbutton' => 'á¹°olani',
-'talk' => 'Ambani',
+'talk' => 'Ambani',
# 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' => 'Hayani',
+'mainpage' => 'Hayani',
'mainpage-description' => 'Hayani',
# Short words for each namespace, by default used in the namespace tab in monobook
@@ -27,12 +27,12 @@ $messages = array(
'error' => 'Vhukhakhi',
# Login and logout pages
-'yourname' => 'Dzina ḽa mushumisi:',
+'yourname' => 'Dzina ḽa mushumisi:',
'yourpassword' => 'Phasiwede:',
# Preferences page
'changepassword' => 'Shandukisani phasiwede',
-'username' => 'Dzina ḽa mushumisi:',
+'username' => 'Dzina ḽa mushumisi:',
# Miscellaneous special pages
'newpages-username' => 'Dzina ḽa mushumisi:',
diff --git a/languages/messages/MessagesVec.php b/languages/messages/MessagesVec.php
index a00868cf..cd96f55b 100644
--- a/languages/messages/MessagesVec.php
+++ b/languages/messages/MessagesVec.php
@@ -14,6 +14,7 @@
* @author GatoSelvadego
* @author Kaganer
* @author Malafaya
+ * @author Nemo bis
* @author Nick1915
* @author Omnipaedista
* @author OrbiliusMagister
@@ -126,6 +127,7 @@ $specialPageAliases = array(
'Randomredirect' => array( 'UnRimandoAOcio' ),
'Recentchanges' => array( 'ÙltimiCanbiamenti' ),
'Recentchangeslinked' => array( 'CanbiamentiLigà' ),
+ 'Redirect' => array( 'Rimando' ),
'Revisiondelete' => array( 'ScancelaRevision' ),
'Search' => array( 'Serca' ),
'Shortpages' => array( 'PaginePiCurte' ),
@@ -187,9 +189,6 @@ $messages = array(
'tog-shownumberswatching' => 'Mostra el numaro de utenti che i ga Å‚a pajina en oservasion',
'tog-oldsig' => 'Anteprima de Å‚a firma:',
'tog-fancysig' => 'Interpreta i comandi wiki in te la firma (sensa colegamento automatego)',
-'tog-externaleditor' => "Dopara par default un editor de testo esterno (soło par utenti esperti. Richiede l'uxo de inpostasion particołari sol proprio computer)",
-'tog-externaldiff' => "Dopara par default un programa de diff esterno (soło par utenti esperti. Richiede l'uxo de inpostasion particołari sol proprio computer)",
-'tog-showjumplinks' => 'Ativa i cołegamenti acesibiłi "va a"',
'tog-uselivepreview' => 'Ativa ła funsion "Line preview" (el dimanda JavaScript; sperimentałe)',
'tog-forceeditsummary' => "Chiedi conferma se l'ozeto de ła modifega el xé vodo",
'tog-watchlisthideown' => 'Scondi łe me modifeghe ne i oservai spesałi',
@@ -202,6 +201,7 @@ $messages = array(
'tog-diffonly' => 'No visuałisar el contenuo de ła pajina dopo el confronto tra version',
'tog-showhiddencats' => 'Mostra Å‚e categorie sconte',
'tog-norollbackdiff' => 'No mostrare el confronto tra version dopo aver efetuà on rollback',
+'tog-useeditwarning' => 'Dime se sto lassando na pagina de modifica sensa aver salvà',
'underline-always' => 'Senpre',
'underline-never' => 'Mai',
@@ -265,6 +265,18 @@ $messages = array(
'oct' => 'oto',
'nov' => 'nov',
'dec' => 'dis',
+'january-date' => '$1 de zenaro',
+'february-date' => '$1 de febraro',
+'march-date' => '$1 de marso',
+'april-date' => '$1 de avril',
+'may-date' => '$1 de majo',
+'june-date' => '$1 de zugno',
+'july-date' => '$1 de lujo',
+'august-date' => '$1 de agosto',
+'september-date' => '$1 de setenbre',
+'october-date' => '$1 de otobre',
+'november-date' => '$1 de novenbre',
+'december-date' => '$1 de desenbre',
# Categories related messages
'pagecategories' => '{{PLURAL:$1|Categoria|Categorie}}',
@@ -346,6 +358,7 @@ $messages = array(
'create-this-page' => 'Crea sta pagina',
'delete' => 'Scansela',
'deletethispage' => 'Scansela sta pagina',
+'undeletethispage' => 'Recupera sta pagina',
'undelete_short' => 'Recupera {{PLURAL:$1|na revision|$1 revision}}',
'viewdeleted_short' => 'Vedi {{PLURAL:$1|na modifega cancełà|$1 modifeghe cancełade}}',
'protect' => 'Protezi',
@@ -389,7 +402,7 @@ $1',
'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).
+# 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).
'aboutsite' => 'Se parla de {{SITENAME}}',
'aboutpage' => 'Project:Se parla de',
'copyright' => "Contenui sojeti a licensa d'uso $1.",
@@ -399,7 +412,6 @@ $1',
'disclaimers' => 'Avertense',
'disclaimerpage' => 'Project:Avertense xenerali',
'edithelp' => 'Guida',
-'edithelppage' => 'Help:Modifega',
'helppage' => 'Help:Ajuto',
'mainpage' => 'Pajina prinsipałe',
'mainpage-description' => 'Pajina prinsipałe',
@@ -476,17 +488,6 @@ L'elenco de le pagine speciali te lo cati su [[Special:SpecialPages|{{int:specia
# General errors
'error' => 'Erore',
'databaseerror' => 'Erore del database',
-'dberrortext' => 'Eror de sintasi inte ła dimanda inoltrà al database.
-Ciò podaria indicar ła prexensa de un bug inte\'l software.
-L\'ultema query invià al database ła xè sta:
-<blockquote><tt>$1</tt></blockquote>
-riciamà da ła funsion "<tt>$2</tt>".
-El database el ga restituio el seguente eror "<tt>$3: $4</tt>".',
-'dberrortextcl' => 'Erore de sintasi ne ła richiesta inoltrà al database.
-L\'ultima query invià al database xè sta:
-"$1"
-riciamà da ła funsion "$2".
-El database ga restituio el seguente erore "$3: $4".',
'laggedslavemode' => "'''Atension:''' ła pajina podaria no riportare i azornamenti pì resenti.",
'readonly' => 'Database blocà',
'enterlockreason' => 'Indicare el motivo del bloco, spesifegando el momento in cui xè presumibiłe che el venga rimoso',
@@ -540,7 +541,6 @@ Query: $2',
Par xontar o modifegar tradusion par tute łe wiki doparar [//translatewiki.net/ translatewiki.net], el projeto de locałixasion de MediaWiki.",
'editinginterface' => "'''Ocio:''' El testo de sta pàjina el fa parte de l'interfacia utente del sito. Tute łe modifeghe aportae a sta pajina se riflete so i mesaji visuałixà par tuti i utenti so sta wiki.
Par xontare o modifegar łe tradusion vałide so tute łe wiki, considera ła posibiłità de doparar [//translatewiki.net/wiki/Main_Page?setlang=vec translatewiki.net], el projeto MediaWiki par ła localixasion.",
-'sqlhidden' => '(ła query SQL ła xè sta sconta)',
'cascadeprotected' => 'So sta pajina no xè posibiłe efetuare modifeghe parché xè sta inclusa {{PLURAL:$1|ne ła pajina indicà de seguito, che xè sta proteta|ne łe pajine indicae de seguito, che e xè sta protete}} sełesionando ła protesion "ricorsiva":
$2',
'namespaceprotected' => "No se dispone de i parmesi nesesari par modifegare Å‚e pajine del namespace '''$1'''.",
@@ -571,10 +571,19 @@ Ocio che serte pagine podarìa èssar che ti 'e vedi come se te fussi 'ncora dre
'welcomecreation-msg' => 'El to nome utente el xe stà creà.
Nó desmentegarte de personałixare łe [[Special:Preferences|prefarense de {{SITENAME}}]].',
'yourname' => 'Nome utente:',
+'userlogin-yourname' => 'Nome utente',
+'userlogin-yourname-ph' => 'Inserissi el to nome utente',
+'createacct-another-username-ph' => 'Inserissi el nome utente:',
'yourpassword' => 'Password:',
+'userlogin-yourpassword' => 'Password',
+'userlogin-yourpassword-ph' => 'Inserisi Å‚a to password',
+'createacct-yourpassword-ph' => 'Inserisi na password',
'yourpasswordagain' => 'De novo la password:',
+'createacct-yourpasswordagain' => 'Conferma la password',
+'createacct-yourpasswordagain-ph' => 'Inserissi da novo la password',
'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à',
+'userlogin-remembermypassword' => 'Tienme colegà',
+'userlogin-signwithsecure' => 'Entra con na conesion segura',
'yourdomainname' => 'Spesifegare el dominio',
'password-change-forbidden' => 'Nó xe posibiłe canbiar ła password so sta wiki.',
'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.",
@@ -586,18 +595,39 @@ Nó desmentegarte de personałixare łe [[Special:Preferences|prefarense de {{SI
'logout' => 'Và fora',
'userlogout' => 'và fora',
'notloggedin' => 'No te sì entrà col to nome utente',
+'userlogin-noaccount' => 'Gheto mia na utensa?',
+'userlogin-joinproject' => 'Unìssete a {{SITENAME}}',
'nologin' => "No te sito gnancora iscrito? '''$1'''.",
'nologinlink' => 'Falo desso',
'createaccount' => 'Crea un utente novo',
'gotaccount' => "Sito zà iscrito? '''$1'''.",
'gotaccountlink' => 'Entra',
'userlogin-resetlink' => "Desmentegà i to dati d'aceso?",
+'userlogin-resetpassword-link' => 'Reinposta la to password',
+'helplogin-url' => 'Help:Login',
+'userlogin-helplink' => '[[{{MediaWiki:helplogin-url}}|Ajuto col login]]',
+'createacct-join' => 'Meti le to informassion qua soto.',
+'createacct-emailrequired' => 'Indirisso e-mail',
+'createacct-emailoptional' => 'Indiriso e-mail (opsionałe)',
+'createacct-email-ph' => 'Inserissi el to indirizo de e-mail',
'createaccountmail' => 'Dopara na password caxuałe tenporanea e inviała al indiriso e-mail spesifegà cuà soto',
+'createacct-realname' => 'Nome reale (opsionale)',
'createaccountreason' => 'Motivassion:',
+'createacct-reason' => 'Motivo',
+'createacct-reason-ph' => "Com'èla te sì drio crear n'altra utensa",
+'createacct-captcha' => 'Controlo de sicuresa',
+'createacct-imgcaptcha-ph' => 'Inserissi el testo che te vedi de sora',
+'createacct-submit' => 'Crea la to utensa',
+'createacct-another-submit' => "Crèa n'altra utensa",
+'createacct-benefit-heading' => '{{SITENAME}} xe fato da gente come ti.',
+'createacct-benefit-body1' => '$1 {{PLURAL:$1|contributo|contributi}}',
+'createacct-benefit-body2' => '$1 {{PLURAL:$1|pàxena|pàxene}}',
+'createacct-benefit-body3' => '{{PLURAL:$1|contributor recente|contributori recenti}}',
'badretype' => 'Le do password le xe difarenti.',
'userexists' => 'El nome utente inserido vien xa doparà da cualchedun altro.
Prova co un nome utente difarente.',
'loginerror' => "Erore ne l'aceso",
+'createacct-error' => "Eror durante la creasion de l'utensa",
'createaccounterror' => "No se pole crear l'utente: $1",
'nocookiesnew' => "Åa rejistrasion xè sta conpletà, ma no xè sta posibiÅ‚e asedare a {{SITENAME}} parché i cookie i xè disativai. Riprovare l'aceso con el nome utente e Å‚a password pena creai dopo aver ativà i cookie nel proprio browser.",
'nocookieslogin' => "L'aceso a {{SITENAME}} richiede l'uso de i cookie, che i risulta disativai. Riprovare l'aceso dopo aver ativà i cookie nel proprio browser.",
@@ -651,7 +681,7 @@ La password par l\'utente "$2" la xe inpostà a "$3". Xe oportuno eseguir un ace
Se l\'acesso el xe stà creà par sbaglio, se pol ignorar sto messagio.',
'usernamehasherror' => "El nome utente no'l pode contegner caràteri hash",
'login-throttled' => 'Te ghè fato massa tentativi de autenticarte.
-Spèta un tocheto prima de proàr da novo.',
+Spèta $1 prima de proàr da novo.',
'login-abort-generic' => 'El to login no xe riusido - Anułà.',
'loginlanguagelabel' => 'Lengua: $1',
'suspicious-userlogout' => 'Åa to richiesta de disconesion xè sta negà parché e a senbra invià da on browser non funsionante o on proxy de caching.',
@@ -670,7 +700,7 @@ Spèta un tocheto prima de proàr da novo.',
'newpassword' => 'Nova password:',
'retypenew' => 'Riscrivi la password nova:',
'resetpass_submit' => 'Inposta la password e acedi al sito',
-'resetpass_success' => 'La password la xe stà modificà. Acesso in corso...',
+'changepassword-success' => 'La password la xe stà modificà!',
'resetpass_forbidden' => 'No se pol modificar le password',
'resetpass-no-info' => "Te ghè da ver fato l'acesso per poder entrar in sta pàxena.",
'resetpass-submit-loggedin' => 'Cànbia password',
@@ -682,10 +712,9 @@ Forse te ghè zà canbià la to password o te ghè domandà na password tenporan
# Special:PasswordReset
'passwordreset' => 'Rinposta Å‚a password',
-'passwordreset-text' => 'Conpleta sto moduło par resetar la to password.',
'passwordreset-legend' => 'Rinposta Å‚a password',
'passwordreset-disabled' => 'Åa rinpostasion deÅ‚a password xe stà dixabiÅ‚ità so sto projeto wiki.',
-'passwordreset-pretext' => '{{PLURAL:$1|| Inserisi una dełe porsion de dati cua soto}}',
+'passwordreset-emaildisabled' => 'Le funsionalità de posta eletrònega le xe stà disabilità su sta wiki.',
'passwordreset-username' => 'Nome utente:',
'passwordreset-domain' => 'Dominio',
'passwordreset-capture' => 'Vixuałixare el contenuto del mesajo de posta ełetronega?',
@@ -710,7 +739,7 @@ Sarìa mejo acedare e deçidare na nova password sùito. Se no te si stà ti a f
Password tenporanea: $2',
'passwordreset-emailsent' => 'Xe stà invià na mail de reset password.',
'passwordreset-emailsent-capture' => 'Xe stà invià na mail de reset password: el contegù xe riportà cuà de seguito.',
-'passwordreset-emailerror-capture' => "Xe stà generà el promemoria riportà cuà de seguito. L'invio al utente no xe riusido: $1",
+'passwordreset-emailerror-capture' => "Xe stà generà na mail de reset password, riportà cuà de seguito. L'invio a {{GENDER:$2|l'utente}} no xe riusido: $1",
# Special:ChangeEmail
'changeemail' => 'Canbia indiriso de posta ełetronega',
@@ -724,6 +753,9 @@ Password tenporanea: $2',
'changeemail-submit' => 'Canbia indiriso de posta ełetronega',
'changeemail-cancel' => 'Anuła',
+# Special:ResetTokens
+'resettokens-token-label' => '$1 (valor atuale: $2)',
+
# Edit page toolbar
'bold_sample' => 'Testo in grosso',
'bold_tip' => 'Testo in grosso',
@@ -917,6 +949,8 @@ La esiste de zà.',
'content-failed-to-parse' => "Inposibiłe anałixare $2 pa'l modèl $1: $3",
'invalid-content-data' => 'Dati contegnui nó vałidi',
'content-not-allowed-here' => 'Contegnùo in "$1" nó consentio inte ła pàjina [[$2]]',
+'editwarning-warning' => 'Se te vè via da sta pagina te podaressi pèrdar tute le modìfeghe che te ghè fato.
+Se te sì loggà, te poli disabilitar sto aviso in te la sezion "{{int:prefs-editing}} de le to preferense.',
# Content models
'content-model-wikitext' => 'wikitesto',
@@ -1126,6 +1160,7 @@ Assicùrete che la continuità storica de la pagina no la vegna alterà.',
'compareselectedversions' => 'Confronta le version segnàe',
'showhideselectedversions' => 'Mostra/scondi version selessionà',
'editundo' => 'tira indrìo',
+'diff-empty' => '(Nissuna difarensa)',
'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à)',
'difference-missing-revision' => "{{PLURAL:$2|Na version|$2 version}} de sta difarensa ($1) {{PLURAL:$2|nó ła xe sta trovà|nó łe xe stae trovae}}.
@@ -1153,7 +1188,6 @@ I detaji i pol esar catai inte'l [{{fullurl:{{#Special:Log}}/delete|page={{FULLP
'searchmenu-legend' => 'Opzion de riserca',
'searchmenu-exists' => 'Su sto sito ghe xe na pagina che se ciama "[[:$1]]"',
'searchmenu-new' => "'''Crèa la pagina \"[[:\$1]]\" su sta wiki!'''",
-'searchhelp-url' => 'Help:Ajuto',
'searchmenu-prefix' => '[[Special:PrefixIndex/$1|Varda tute le pagine che taca co ste létere]]',
'searchprofile-articles' => 'Pagine de contenuti',
'searchprofile-project' => 'Pagine de progeto e de ajuto',
@@ -1195,15 +1229,7 @@ Prova a métarghe \"all:\" davanti al testo che te serchi par vardar in tuti i n
'powersearch-togglenone' => 'Nissun',
'search-external' => 'Riserca esterna',
'searchdisabled' => 'La riserca interna de {{SITENAME}} no la xe ativa; par intanto te pol proár a doparar un motore de riserca esterno come Google. (Nota però che i contenuti de {{SITENAME}} presenti in sti motori i podarìa èssar mìà agiornà.)',
-
-# Quickbar
-'qbsettings' => 'Settaggio barra menu',
-'qbsettings-none' => 'Nessun',
-'qbsettings-fixedleft' => 'Fisso a sinistra',
-'qbsettings-fixedright' => 'Fisso a destra',
-'qbsettings-floatingleft' => 'Fluttuante a sinistra',
-'qbsettings-floatingright' => 'Fluttuante a destra',
-'qbsettings-directionality' => 'Fiso, a seconda de Å‚a diresion del testo nte Å‚a to lengua',
+'search-error' => 'Se gà verifegà un eror durante la riserca: $1',
# Preferences page
'preferences' => 'Prefarense',
@@ -1237,7 +1263,6 @@ Prova a métarghe \"all:\" davanti al testo che te serchi par vardar in tuti i n
'resetprefs' => 'Reinposta le preferense',
'restoreprefs' => 'Ripristina le inpostassion predefinìe',
'prefs-editing' => 'Canbiamento',
-'prefs-edit-boxsize' => 'Dimension de la finestra de modìfega.',
'rows' => 'Righe:',
'columns' => 'Cołone:',
'searchresultshead' => 'Riserca',
@@ -1248,7 +1273,6 @@ Prova a métarghe \"all:\" davanti al testo che te serchi par vardar in tuti i n
'recentchangesdays-max' => '($1 {{PLURAL:$1|zorno|zorni}} massimo)',
'recentchangescount' => 'Nùmaro de modìfeghe da far védar (valor predefinìo):',
'prefs-help-recentchangescount' => 'Questo include i ùltimi canbiamenti, el stòrico de le pàxene e i registri.',
-'prefs-help-watchlist-token' => 'Conpilando sto canpo co na ciave segreta vegnarà generà un feed RSS par i propri osservati speciali. Chiunque conossa la ciave in sto canpo el podarà lèzar i osservati speciali, quindi se racomanda de inserir un valore sicuro. Qua ghe xe un valore generà casualmente che se pol doparar: $1',
'savedprefs' => 'Le to preferense łe xè stà salvae.',
'timezonelegend' => 'Fuso orario:',
'localtime' => 'Ora locale:',
@@ -1279,7 +1303,6 @@ Prova a métarghe \"all:\" davanti al testo che te serchi par vardar in tuti i n
'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:",
-'prefs-textboxsize' => 'Dimension de la casèla de modifica',
'youremail' => 'La to e-mail',
'username' => '{{GENDER:$1|Nome utente}}:',
'uid' => '{{GENDER:$1|ID utente}}:',
@@ -1345,6 +1368,7 @@ Co qualcheduni te scrivarà, nol vedarà mia el to indirizo.',
'userrights-notallowed' => 'No te ghe i parmesi necesari par xontarghe o cavarghe diriti ai utenti.',
'userrights-changeable-col' => 'Grupi che te pol canbiar',
'userrights-unchangeable-col' => 'Grupi che no te pol canbiar',
+'userrights-conflict' => 'Conflito de diriti utente! Aplica de novo le to modifiche.',
# Groups
'group' => 'Grupo:',
@@ -1479,6 +1503,8 @@ Co qualcheduni te scrivarà, nol vedarà mia el to indirizo.',
# Recent changes
'nchanges' => '$1 {{PLURAL:$1|canbiamento|canbiamenti}}',
+'enhancedrc-since-last-visit' => "$1 {{PLURAL:$1|da l'ultima visita}}",
+'enhancedrc-history' => 'storia',
'recentchanges' => 'Ultimi canbiamenti',
'recentchanges-legend' => 'Prefarense par i ultimi canbiamenti',
'recentchanges-summary' => 'Qua se vede i ultimi canbiamenti fati a sto sito.',
@@ -1518,7 +1544,6 @@ Co qualcheduni te scrivarà, nol vedarà mia el to indirizo.',
'recentchangeslinked-feed' => 'Canbiamenti ligà a sta pagina',
'recentchangeslinked-toolbox' => 'Canbiamenti ligà a sta pagina',
'recentchangeslinked-title' => 'Canbiamenti ligà a "$1"',
-'recentchangeslinked-noresult' => 'Nel periodo specificà no ghe xe stà nissuna modifica a le pagine colegà.',
'recentchangeslinked-summary' => "Sti qua i xe i canbiamenti fati ultimamente a pagine pontà da na pagina indicà da ti (o a pagine de na categoria indicà da ti).
Le pagine [[Special:Watchlist|tegnùe d'ocio]] le xe in '''grosso'''.",
'recentchangeslinked-page' => 'Nome de la pagina:',
@@ -1741,7 +1766,6 @@ Par na major sicuressa, img_auth.php el xe disabilità.',
'http-read-error' => 'Eror de letura HTTP.',
'http-timed-out' => 'Richiesta HTTP scadùa.',
'http-curl-error' => "Eror nel recupero de l'URL: $1",
-'http-host-unreachable' => 'URL mìa ragiungibile',
'http-bad-status' => 'Ghe xe stà un problema durante la richiesta HTTP: $1 $2',
# Some likely curl errors. More could be added from <http://curl.haxx.se/libcurl/c/libcurl-errors.html>
@@ -1770,6 +1794,9 @@ Se l'utente modifega l'ordenamento, vien mostradi soło i file caricadi pi de re
'listfiles_size' => 'Dimension in byte',
'listfiles_description' => 'Descrizion',
'listfiles_count' => 'Versioni',
+'listfiles-latestversion' => 'Version atuale',
+'listfiles-latestversion-yes' => 'Sì',
+'listfiles-latestversion-no' => 'No',
# File description page
'file-anchor-link' => 'File',
@@ -1864,6 +1891,11 @@ Probabilmente te vui modifegar ła descrision prexente inte ła [$2 pàjina de d
'randompage' => 'Na pagina a ocio',
'randompage-nopages' => 'No ghe xe nissuna pàxena in {{PLURAL:$2|tel|tei}} namespace "$1".',
+# Random page in category
+'randomincategory' => 'Pagina a ocio in te na categoria',
+'randomincategory-nopages' => 'No ghe xe mia pagine in [[:Category:$1]].',
+'randomincategory-selectcategory-submit' => 'Và',
+
# Random redirect
'randomredirect' => 'Un redirect a caso',
'randomredirect-nopages' => 'No ghe xe nissun rimando in tel namespace "$1".',
@@ -1889,12 +1921,6 @@ Probabilmente te vui modifegar ła descrision prexente inte ła [$2 pàjina de d
'statistics-users-active-desc' => "Utenti che gà fato almanco un'azion in {{PLURAL:$1|tel'ultimo zorno|in tei ultimi $1 zorni}}",
'statistics-mostpopular' => 'Pagine piassè visità',
-'disambiguations' => 'Pajine cołegade a pajine de dixanbiguasion',
-'disambiguationspage' => 'Template:Disambigua',
-'disambiguations-text' => "Åe pàjine inte Å‚a lista cuà soto Å‚e ga drento almanco un ligamento a na '''pàjina de dixanbiguasion'''.
-Åe podaria dover puntar a na pàjina pì apropià.<br />
-Vien considerae pàjine de dixanbiguasion tute cuełe che łe ga drento i modełi elencai in [[MediaWiki:Disambiguationspage]].",
-
'pageswithprop' => 'Pagine co na proprietà de pagina',
'pageswithprop-legend' => 'Pagine co na proprietà de pagina',
'pageswithprop-text' => 'Sta pagina la elenca le pagine che dòpara na particolare proprietà de pagina.',
@@ -2147,10 +2173,9 @@ I futuri canbiamenti a sta pàjina e a ła so pàjina de discusion i vegnarà el
'unwatchthispage' => "Desmeti de tegner d'ocio",
'notanarticle' => 'Sta pagina no la xè na pagina de contenuto',
'notvisiblerev' => 'La revision la xe stà scancelà',
-'watchnochange' => "Nissuna pagina tegnùa d'ocio la xe stà canbià nel periodo mostrà.",
'watchlist-details' => "Te sì drio tegner d'ocio {{PLURAL:$1|una pagina (e la so pagina de discussion)|$1 pagine (e le so pagine de discussion)}}.",
-'wlheader-enotif' => '* Xe ativà la notifica via e-mail.',
-'wlheader-showupdated' => "* Le pagine che xe stà canbià da la to ultima visita le xe segnà in '''grosso'''",
+'wlheader-enotif' => 'Xe ativà la notifica via e-mail.',
+'wlheader-showupdated' => "Le pagine che xe stà canbià da la to ultima visita le xe segnà in '''grosso'''",
'watchmethod-recent' => 'controło de łe ultime modifeghe par i osservati speciałi',
'watchmethod-list' => 'controło de i osservati speciałi par modifeghe recenti',
'watchlistcontains' => 'La lista de i osservati speciałi la contien {{PLURAL:$1|una pagina|$1 pagine}}.',
@@ -2542,13 +2567,11 @@ Qua soto ghe xe el registro de le sopression:',
'ipb_blocked_as_range' => "Eror: L'indirizo IP $1 no'l xe sogeto a bloco individual e no'l pol èssar sblocà. El bloco el xe invesse ativo a livel de l'intervalo $2, che el pol èssar sblocà.",
'ip_range_invalid' => 'Intervało de indirissi IP mìa vałido.',
'ip_range_toolarge' => 'No se pol mia blocar intervali piassè grandi de /$1',
-'blockme' => 'Blòcheme',
'proxyblocker' => 'Bloco dei proxy verti',
-'proxyblocker-disabled' => 'Sta funzion la xe disabilità.',
'proxyblockreason' => 'Sto indirizo IP el xe stà blocà parché el risulta èssar un proxy verto. Se prega de contatar el proprio fornitor de acesso a Internet o el suporto tènico e dirghe de sto grave problema de sicureza.',
-'proxyblocksuccess' => 'Fatto.',
'sorbsreason' => 'Sto indirizo IP el xe elencà come proxy verto ne la lista nera DNSBL doparà da {{SITENAME}}.',
'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}}.',
+'xffblockreason' => "Un indiriso IP presente ne l'intestasion X-Forwarded-For, tuo o del server proxy che te sì drio doparar, el xe stà blocà. La motivasion originale del bloco la xe: $1",
'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à',
@@ -2707,6 +2730,8 @@ Par piaser visita [//www.mediawiki.org/wiki/Localisation MediaWiki Localisation]
'thumbnail-more' => 'Ingrandissi',
'filemissing' => 'File mancante',
'thumbnail_error' => 'Eror ne la creazion de la miniatura: $1',
+'thumbnail_error_remote' => 'Messajo de eror da $1:
+$2',
'djvu_page_error' => 'Nùmaro de pagina DjVu sbaglià',
'djvu_no_xml' => "Inpossibile otegner l'XML par el file DjVu",
'thumbnail-temp-create' => 'Inposibiłe crear el file tenporaneo de łe miniadure',
@@ -2999,11 +3024,25 @@ La so esecuzion la podarìa danegiar el to computer.",
'minutes' => '{{PLURAL:$1|un minuto|$1 minuti}}',
'hours' => "{{PLURAL:$1|un'ora|$1 ore}}",
'days' => '{{PLURAL:$1|un zorno|$1 zorni}}',
+'weeks' => '{{PLURAL:$1|$1 stimana|$1 stimane}}',
'months' => '{{PLURAL:$1|$1 mexe|$1 mexi}}',
'years' => '{{PLURAL:$1|$1 ano|$1 ani}}',
'ago' => '$1 fa',
'just-now' => 'giusto desso',
+# Human-readable timestamps
+'hours-ago' => '$1 {{PLURAL:$1|ora|ore}} fa',
+'minutes-ago' => '$1 {{PLURAL:$1|minuto|minuti}} fa',
+'seconds-ago' => '$1 {{PLURAL:$1|secondo|secondi}} fa',
+'monday-at' => 'Luni a le $1',
+'tuesday-at' => 'Marti a le $1',
+'wednesday-at' => 'Mèrcore a le $1',
+'thursday-at' => 'Zòbia a le $1',
+'friday-at' => 'Vènere a le $1',
+'saturday-at' => 'Sabo a le $1',
+'sunday-at' => 'Doménega a le $1',
+'yesterday-at' => 'Jèri a le $1',
+
# Bad image list
'bad_image_list' => 'El formato xe sto qua:
@@ -3031,7 +3070,7 @@ I colegamenti dopo, su la stessa riga, i xe considerai come ecession (cioè, pag
* gpslongitude
* gpsaltitude",
-# EXIF tags
+# Exif tags
'exif-imagewidth' => 'Largheza',
'exif-imagelength' => 'Alteza',
'exif-bitspersample' => 'Bit par campione',
@@ -3209,7 +3248,7 @@ I colegamenti dopo, su la stessa riga, i xe considerai come ecession (cioè, pag
'exif-originalimageheight' => "Altesa de l'imaxene prima che ła fuse tajà",
'exif-originalimagewidth' => "Larghesa de l'imaxene prima che ła fuse tajà",
-# EXIF attributes
+# Exif attributes
'exif-compression-1' => 'No conpresso',
'exif-compression-2' => 'CCITT grupo 3 monodimensionałe - codifega run length de Huffman modifegà',
'exif-compression-3' => 'Codifega fax CCITT Group 3',
@@ -3599,7 +3638,6 @@ Nota che te pol anca [[Special:EditWatchlist|modificar la lista con l'interfacia
'version-other' => 'Altro',
'version-mediahandlers' => 'Gestori de contenuti multimediài',
'version-hooks' => 'Hook',
-'version-extension-functions' => 'Funzion introdote da estensioni',
'version-parser-extensiontags' => 'Tag riconossiùi dal parser introdoti da estensioni',
'version-parser-function-hooks' => 'Hook par funzioni del parser',
'version-hook-name' => "Nome de l'hook",
@@ -3608,6 +3646,7 @@ Nota che te pol anca [[Special:EditWatchlist|modificar la lista con l'interfacia
'version-license' => 'Licensa',
'version-poweredby-credits' => "Sta wiki la va con '''[//www.mediawiki.org/ MediaWiki]''', copyright © 2001-$1 $2.",
'version-poweredby-others' => 'altri',
+'version-poweredby-translators' => 'tradutori de translatewiki.net',
'version-credits-summary' => "Semo contenti de riconosare Å‚e seguenti persone p' 'ver contribuio a [[Special:Version|MediaWiki]].",
'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.
@@ -3621,12 +3660,17 @@ Insieme co sto programa te dovaressi 'ver ricevùo na copia de la Licensa Public
'version-entrypoints-header-entrypoint' => 'Punti de aceso',
'version-entrypoints-header-url' => 'URL',
-# Special:FilePath
-'filepath' => 'Percorso de un file',
-'filepath-page' => 'Nome del file:',
-'filepath-submit' => 'Va',
-'filepath-summary' => 'Sta pagina speciale la restituìsse el percorso conpleto de un file.
-Le imagini le vien mostrà a la risoluzion pi granda che se pol, par i altri tipi de file vien avià diretamente el programa associà.',
+# Special:Redirect
+'redirect' => 'Rimando par file, utente, o ID de revision.',
+'redirect-legend' => 'Rimandar a un file o na pagina',
+'redirect-summary' => "Sta pagina speciale la rimanda a un file (dato el nome del file), a na pagina (dato l'ID de la revision), o a na pagina utente (dato l'ID de l'utente).",
+'redirect-submit' => 'Và',
+'redirect-lookup' => 'Ciave de riserca:',
+'redirect-value' => 'Valor:',
+'redirect-user' => 'ID utente',
+'redirect-revision' => 'Revision de la pagina',
+'redirect-file' => 'Nome del file',
+'redirect-not-exists' => 'Valor mia catà',
# Special:FileDuplicateSearch
'fileduplicatesearch' => 'Riçerca dei file duplicà',
@@ -3675,6 +3719,7 @@ Le imagini le vien mostrà a la risoluzion pi granda che se pol, par i altri tip
'tags' => 'Tag de le modifiche valide',
'tag-filter' => '[[Special:Tags|Tag]] filtro:',
'tag-filter-submit' => 'Filtro',
+'tag-list-wrapper' => '([[Special:Tags|{{PLURAL:$1|Eticheta|Etichete}}]]: $2)',
'tags-title' => 'Tag',
'tags-intro' => 'Sta pàxena la elenca i tag che el software el podarìa marcar come na modifica e el so significato.',
'tags-tag' => 'Nome del tag',
@@ -3716,6 +3761,9 @@ Le imagini le vien mostrà a la risoluzion pi granda che se pol, par i altri tip
'htmlform-submit' => 'Manda',
'htmlform-reset' => 'Scancèla modifiche',
'htmlform-selectorother-other' => 'Altro',
+'htmlform-no' => 'No',
+'htmlform-yes' => 'Sì',
+'htmlform-chosen-placeholder' => 'Selessiona na opzione',
# SQLite database support
'sqlite-has-fts' => '$1 con la possibilità de riserca completa nel testo',
diff --git a/languages/messages/MessagesVep.php b/languages/messages/MessagesVep.php
index 7872798a..a724c1e8 100644
--- a/languages/messages/MessagesVep.php
+++ b/languages/messages/MessagesVep.php
@@ -118,9 +118,6 @@ $messages = array(
'tog-shownumberswatching' => 'Ozutada niiden kävutajiden lugu, kudambad oma mülütanuded lehtpolen iÄeze kaclendnimikirjutesihe',
'tog-oldsig' => 'Nügüdläine allekirjutez',
'tog-fancysig' => 'IÄeze allekirjutesen wiki-znamiÅ¡t (avtomatižeta kosketuseta)',
-'tog-externaleditor' => 'Kävutada irdredaktor augotižjärgendusen mödhe (vaiše ekspertoiden täht; pidab järgeta specialižikš kompjuter; [//www.mediawiki.org/wiki/Manual:External_editors Enamb informacijad.])',
-'tog-externaldiff' => 'Kävutada irdredaktor augotižjärgendusen mödhe (vaiše ekspertoiden täht; pidab järgeta specialižikš kompjuter; [//www.mediawiki.org/wiki/Manual:External_editors Enamb informacijad.])',
-'tog-showjumplinks' => 'Ližata "hüpähtada..."-abukosketused',
'tog-uselivepreview' => 'Kävutada hered ezikacund (JavaScript) (Eksperimentaline)',
'tog-forceeditsummary' => 'Varutada, kunz toižetusen ümbrikirjutandan pöud ei ole täuttud',
'tog-watchlisthideown' => 'Peitta minun redakcijad kaclendnimikirjutesespäi',
@@ -319,7 +316,7 @@ $1",
'pool-queuefull' => 'Ecindoiden varadim om üläkormatud.',
'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).
+# 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).
'aboutsite' => 'Informacii saitas {{SITENAME}}',
'aboutpage' => 'Project:Informacii',
'copyright' => 'südäiolend kävutadas $1-licenzijan mödhe.',
@@ -329,7 +326,6 @@ $1",
'disclaimers' => 'PuÄind vastusenpidandaspäi',
'disclaimerpage' => 'Project:PuÄind vastusenpidandaspäi',
'edithelp' => 'Abu redaktiruindas',
-'edithelppage' => 'Help:Abu redaktiruindas',
'helppage' => 'Help:südäiolend',
'mainpage' => 'Pälehtpol’',
'mainpage-description' => 'Pälehtpol’',
@@ -403,11 +399,6 @@ Kc. [[Special:SpecialPages|specialižiden lehtpoliden nimikirj]].",
# General errors
'error' => 'Petuz',
'databaseerror' => 'Andmusiden bazan petuz',
-'dberrortextcl' => 'Andmusiden bazas ectes ozaižihe petuz.
-Jäl\'gmäine ecind andmusiden bazas oli:
-"$1"
-funkcijaspäi "$2".
-Andmusiden baz pördi petusen "$3: $4"',
'laggedslavemode' => "Varutuz: voib olda, lehtpolen versijal ei ole jäl'gmäižid ližadusid.",
'readonly' => 'Andmusiden baz om luklostadud',
'enterlockreason' => 'Kirjutagat sü da pandud blokiruindan strok',
@@ -455,7 +446,6 @@ Ecind: $2',
'editinginterface' => "'''Homaikat:''' Tö ladit redaktiruida lehtpol't, kudambal om programman interfeistekst.
Mugoi tegend toižetab interfeisan irdnägu toižiden kävutajiden täht.
Kändmižen täht om paremb kävutada [//translatewiki.net/wiki/Main_Page?setlang=vep translatewiki.net] - MediaWikin lokalizacijan projekt.",
-'sqlhidden' => '(SQL-küzelend om peittud)',
'namespaceprotected' => "Teil ei ole oiktust redaktiruida lehtpolid '''$1'''-nimiavaruses.",
'customcssprotected' => 'Teil ei ole oiktust redaktiruida nece CSS-lehtpol’, sikš sil oma toižen ühtnijan personaližed järgendused.',
'customjsprotected' => 'Teil ei ole oiktust redaktiruida nece JavaScript-lehtpol’, sikš sil oma toižen ühtnijan personaližed järgendused.',
@@ -477,7 +467,6 @@ Otkat sil'mnägubale, miše erasid lehtpolid ozutaškatas mugažo, kut i edel te
'yourpassword' => 'Peitsana:',
'yourpasswordagain' => 'Kirjutagat peitsana udes:',
'remembermypassword' => 'Panda muštho minun tulendandmused neciš kompjuteras (enintään $1 {{PLURAL:$1|päivä|päivää}})',
-'securelogin-stick-https' => "Jäda sidotud HTTPS-ha tulendan jäl'ghe",
'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',
@@ -559,7 +548,7 @@ Miše tulda sistemha lopuližikš, teile pidab säta uz' peitsana naku:",
'newpassword' => "Uz' peitsana:",
'retypenew' => "Toštkat uz' peitsana:",
'resetpass_submit' => 'Säta peitsana da kirjutadas sistemha',
-'resetpass_success' => 'Teiden peisana om vajehtadud jügedusita! Tulend sistemha...',
+'changepassword-success' => 'Teiden peisana om vajehtadud jügedusita! Tulend sistemha...',
'resetpass_forbidden' => 'Ei voi vajehtada peitsanad',
'resetpass-no-info' => 'Miše kirjutada necil lehtpolel, teile pidab kirjutadas sistemha.',
'resetpass-submit-loggedin' => 'Vajehtada peitsana',
@@ -929,7 +918,6 @@ Tö ei voigoi kävutada sidä.',
'searchmenu-legend' => 'Ecindan järgendused',
'searchmenu-exists' => "'''Neciš Wikiš om jo lehtpol' ningoižen nimenke: \"[[:\$1]]\"'''",
'searchmenu-new' => "'''Säta lehtpol' \"[[:\$1]]\" neciš Wikiš!'''",
-'searchhelp-url' => 'Help:Südäiolend',
'searchmenu-prefix' => '[[Special:PrefixIndex/$1|Ozutada kaik lehtpoled necen prefiksanke]]',
'searchprofile-articles' => 'Südäimištlehtpoled',
'searchprofile-project' => 'Abun da projektoiden lehtpoled',
@@ -974,14 +962,6 @@ Kävutagat prefiks ''all:'', miše ectä kaikes südäimištospäi (lodulehtpoli
Tö voit nügüd' ectä Google'n turbiš.
Otkat sil'mnägubale üks-se, miše {{SITENAME}}-saitan sädäimišt voib olda vanhtunuden.",
-# Quickbar
-'qbsettings' => "Navigacijan panel'",
-'qbsettings-none' => 'Ala ozuta',
-'qbsettings-fixedleft' => 'Likumatoi huralpäi',
-'qbsettings-fixedright' => 'Likumatoi oiktalpäi',
-'qbsettings-floatingleft' => 'Ujui huralpäi',
-'qbsettings-floatingright' => 'Ujui oiktalpäi',
-
# Preferences page
'preferences' => 'Järgendused',
'mypreferences' => 'Järgendused',
@@ -1013,7 +993,6 @@ Otkat sil'mnägubale üks-se, miše {{SITENAME}}-saitan sädäimišt voib olda v
'resetprefs' => 'ÄŒuta kaiÄematomad toižetused',
'restoreprefs' => 'Endištada kaik augotižjärgendused',
'prefs-editing' => 'Redaktiruind',
-'prefs-edit-boxsize' => 'Redaktiruindan iknan suruz.',
'rows' => 'Rivid:',
'columns' => 'Pachid:',
'searchresultshead' => 'Ecind',
@@ -1054,7 +1033,6 @@ Otkat sil'mnägubale üks-se, miše {{SITENAME}}-saitan sädäimišt voib olda v
'prefs-reset-intro' => "Tö sat kävutada nece lehtpol', miše pördutada teiden järgendused saitan ezijärgendusidennoks.
Necidä tegendad ei sa toižetada.",
'prefs-emailconfirm-label' => 'E-poÄtan vahviÅ¡tand:',
-'prefs-textboxsize' => 'Redaktiruindan iknan suruz',
'youremail' => 'E-poÄt:',
'username' => 'Kävutajan nimi:',
'uid' => 'Kävutajan nomer:',
@@ -1282,7 +1260,6 @@ Ku tö kirjutat sen, nece nimi kävutadas, miše ozutada lehtpolen toižetajad.'
'recentchangeslinked-feed' => 'Sidotud toižetused',
'recentchangeslinked-toolbox' => 'Sidotud toižetused',
'recentchangeslinked-title' => '"$1"-lehtpol\'he sidotud toižetused',
-'recentchangeslinked-noresult' => 'Sidotud lehtpolil ei olend toižetusid anttud pordon aigan.',
'recentchangeslinked-summary' => "Neciš nimikirjuteses om tantoižid toižetusid lehtpoliš, kudambid kosketab ozutadud lehtpol'.
[[Special:Watchlist|Teiden kaclendnimikirjutesen]] lehtpoled oma erigoittud lihavoitud Å¡riftal.",
'recentchangeslinked-page' => 'Lehtpolen nimi:',
@@ -1409,7 +1386,6 @@ Ku problem jäb jäl'ghepäi-ki, säkat pagin [[Special:ListUsers/sysop|sistemad
'http-read-error' => "HTTP'd lugemižen petuz.",
'http-timed-out' => 'HTTP-he küzelendan aig om lopnus.',
'http-curl-error' => "Petuz URL'ad ecmäs: $1",
-'http-host-unreachable' => 'Ei voi säta sidod URL:anke',
# Some likely curl errors. More could be added from <http://curl.haxx.se/libcurl/c/libcurl-errors.html>
'upload-curl-error6' => 'Ei voi säta sidod URL:anke',
@@ -1540,9 +1516,6 @@ Informacijad sen [$2 andmusiden lehtpolelpäi] om anttud alemba.',
'statistics-users-active-desc' => "Kävutajad, kudambad ozutiba aktivižut {{PLURAL:$1|jäl’gmäižen päivän|$1 jäl'gmäižil päivil}}",
'statistics-mostpopular' => 'Kaikiš populärižembad lehtpoled',
-'disambiguations' => 'Lehtpoled, kudambil om kosketusid lehtpolihe, kus om äiznamoiÄendusen laskendoid.',
-'disambiguationspage' => 'Template:ÄiznamoiÄenduz',
-
'doubleredirects' => 'Kaksitadud läbikosketused',
'double-redirect-fixed-move' => "[[$1]]-lehtpol' om udesnimitadud. Se läbikosketab nügüd' [[$2]]-lehtpolele.",
'double-redirect-fixer' => 'Läbikosketusiden kohendai',
@@ -1749,7 +1722,7 @@ Kc. mugažo [[Special:WantedCategories|ectud kategorijoiden nimikirjutez]].',
'notanarticle' => "Nece ei ole lehtpol'",
'notvisiblerev' => 'Versijad oma Äutud',
'watchlist-details' => "Teiden kaclendnimikirjuteses om {{PLURAL:$1|$1 lehtpol'|$1 lehtpol't}}. Lodulehtpoled ei olgoi neciš lugus.",
-'wlheader-enotif' => '* Tedotand e-poÄtadme om kävutamas.',
+'wlheader-enotif' => 'Tedotand e-poÄtadme om kävutamas.',
'watchmethod-recent' => 'ozutadas kaceltud lehtpoliden tantoižed toižetused',
'watchmethod-list' => 'kaceltud lehtpoliden kodvind tantoižid toižetusid ectes',
'watchlistcontains' => "Teiden kaclendnimikirjuteses om $1 {{PLURAL:$1|lehtpol'|lehtpol't}}.",
@@ -2102,12 +2075,9 @@ Alemba om anttud blokiruindaiglehtez:',
'ipb_cant_unblock' => 'Petuz: ei voi löuta ID $1:n blokiruindad.
Voib olda, se om jo heittud.',
'ip_range_invalid' => 'Vär IP-diapazon.',
-'blockme' => 'Blokiruigat mindai',
'proxyblocker' => 'Proxy-blokator',
-'proxyblocker-disabled' => 'Nece funkcii ei ole kävutamas.',
'proxyblockreason' => 'Teiden IP-adres om blokiruidud, sikš miše se om avoin proksi.
Olgat hüväd, säkat pagin teiden Internet-provaideranke i kirjutagat hänele necen varuitomuden problemas.',
-'proxyblocksuccess' => 'Vaumiž.',
'sorbsreason' => 'Teiden IP-adres om ozutadud kut avaitud proksi {{SITENAME}}-saitan DNSBL-an mustas nimikirjuteses.',
'cant-block-while-blocked' => 'Teile ei sa blokiruida toižid kävutajid, sikÅ¡ miÅ¡e tö iÄe olet blokiruidud.',
@@ -2371,13 +2341,8 @@ Voib olda, necil lehtpolel om kosketuz irdsaitale, kudamb om mustas nimikirjutes
'pageinfo-authors' => 'ErazvuiÄÄiden avtoroiden lugu',
# Skin names
-'skinname-standard' => 'Klassine',
-'skinname-nostalgia' => "Nostal'gii",
'skinname-cologneblue' => "Köl'nan sinine",
'skinname-monobook' => 'MonoBook',
-'skinname-myskin' => 'IÄeze',
-'skinname-chick' => 'Cipuine',
-'skinname-simple' => 'Koveritoi',
'skinname-modern' => "Nügüd'aigaine",
# Patrolling
@@ -2478,7 +2443,7 @@ Ku fail redaktiruidihe sändan polhe, erased parametrad voidas erineda nügüdlÃ
* gpslongitude
* gpsaltitude',
-# EXIF tags
+# Exif tags
'exif-imagewidth' => 'Leveduz',
'exif-imagelength' => 'Korktuz’',
'exif-bitspersample' => 'Mujun süvuz',
@@ -2610,7 +2575,7 @@ Ku fail redaktiruidihe sändan polhe, erased parametrad voidas erineda nügüdlÃ
'exif-label' => 'Arbaine',
'exif-pngfilecomment' => 'Kommentarii PNG-failha',
-# EXIF attributes
+# Exif attributes
'exif-compression-1' => 'Ahtištamatoi',
'exif-unknowndate' => 'Tundmatoi dat',
@@ -2945,7 +2910,6 @@ Kävutagat normaline ezikacund.',
'version-other' => 'Toine',
'version-mediahandlers' => 'Median radimed',
'version-hooks' => 'Sabutajad',
-'version-extension-functions' => 'Ližoiden funkcijad',
'version-parser-extensiontags' => 'Sintaksižen analizatoran ližoiden virgad',
'version-parser-function-hooks' => 'Sintaksižen analizatoran funkcijoiden sabutajad',
'version-hook-name' => 'Sabustajan nimi',
@@ -2958,11 +2922,6 @@ Kävutagat normaline ezikacund.',
'version-software-version' => 'Versii',
'version-entrypoints-header-url' => 'URL',
-# Special:FilePath
-'filepath' => 'Te failannoks',
-'filepath-page' => 'Fail:',
-'filepath-submit' => 'Te',
-
# Special:FileDuplicateSearch
'fileduplicatesearch' => 'Ectä kaksitadud failad',
'fileduplicatesearch-summary' => 'ÃœhtejiÄÄiden failoiden ecmine niiden heÅ¡-kodan mödhe.',
diff --git a/languages/messages/MessagesVi.php b/languages/messages/MessagesVi.php
index e80bb060..c5803edd 100644
--- a/languages/messages/MessagesVi.php
+++ b/languages/messages/MessagesVi.php
@@ -58,7 +58,7 @@ $namespaceAliases = array(
$specialPageAliases = array(
'Activeusers' => array( 'NgÆ°á»i_dùng_tích_cá»±c' ),
- 'Allmessages' => array( 'Má»i_thông_báo' ),
+ 'Allmessages' => array( 'Má»i_thông_Ä‘iệp', 'Má»i_thông_báo' ),
'Allpages' => array( 'Má»i_bài' ),
'Ancientpages' => array( 'Trang_cũ' ),
'Badtitle' => array( 'Tá»±a_Ä‘á»_há»ng' ),
@@ -73,7 +73,7 @@ $specialPageAliases = array(
'ComparePages' => array( 'So_sánh_trang' ),
'Confirmemail' => array( 'Xác_nhận_thư' ),
'Contributions' => array( 'Äóng_góp' ),
- 'CreateAccount' => array( 'Äăng_ký', 'Äăng_kí' ),
+ 'CreateAccount' => array( 'Mở_tài_khoản', 'Äăng_ký', 'Äăng_kí' ),
'Deadendpages' => array( 'Trang_Ä‘Æ°á»ng_cùng' ),
'DeletedContributions' => array( 'Äóng_góp_bị_xóa', 'Äóng_góp_bị_xoá' ),
'Disambiguations' => array( 'Trang_định_hướng' ),
@@ -103,6 +103,7 @@ $specialPageAliases = array(
'MIMEsearch' => array( 'Tìm_MIME' ),
'Mostcategories' => array( 'Thể_loại_lớn_nhất' ),
'Mostimages' => array( 'Tập_tin_liên_kết_nhiá»u_nhất' ),
+ 'Mostinterwikis' => array( 'Nhiá»u_liên_wiki_nhất', 'Nhiá»u_interwiki_nhấ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' ),
@@ -114,18 +115,19 @@ $specialPageAliases = array(
'Myuploads' => array( 'Tập_tin_tôi' ),
'Newimages' => array( 'Tập_tin_mới', 'Hình_mới' ),
'Newpages' => array( 'Trang_má»›i' ),
+ 'PagesWithProp' => array( 'Trang_theo_thuộc_tính' ),
'PasswordReset' => array( 'Tái_tạo_mật_khẩu', 'Äặt_lại_mật_khẩu' ),
'PermanentLink' => array( 'Liên_kết_thÆ°á»ng_trá»±c' ),
'Popularpages' => array( 'Trang_phổ_biến' ),
'Preferences' => array( 'Tùy_chá»n', 'Tuỳ_chá»n' ),
'Prefixindex' => array( 'Tiá»n_tố' ),
- 'Protectedpages' => array( 'Trang_khóa' ),
- 'Protectedtitles' => array( 'Tá»±a_Ä‘á»_bị_khóa' ),
+ 'Protectedpages' => array( 'Trang_khóa', 'Trang_khoá' ),
+ 'Protectedtitles' => array( 'Tá»±a_Ä‘á»_bị_khóa', 'Tá»±a_Ä‘á»_bị_khoá' ),
'Randompage' => array( 'Ngẫu_nhiên' ),
'Randomredirect' => array( 'Äổi_hÆ°á»›ng_ngẫu_nhiên' ),
'Recentchanges' => array( 'Thay_đổi_gần_đây' ),
'Recentchangeslinked' => array( 'Thay_đổi_liên_quan' ),
- 'Revisiondelete' => array( 'Xóa_phiên_bản' ),
+ 'Revisiondelete' => array( 'Xóa_phiên_bản', 'Xoá_phiên_bản' ),
'Search' => array( 'Tìm_kiếm' ),
'Shortpages' => array( 'Trang_ngắn' ),
'Specialpages' => array( 'Trang_đặc_biệt' ),
@@ -146,7 +148,7 @@ $specialPageAliases = array(
'UploadStash' => array( 'Hàng_đợi_tải_lên' ),
'Userlogin' => array( 'Äăng_nhập' ),
'Userlogout' => array( 'Äăng_xuất' ),
- 'Userrights' => array( 'Quyá»n_thành_viên' ),
+ 'Userrights' => array( 'Quyá»n_thành_viên', 'Quyá»n_ngÆ°á»i_dùng' ),
'Version' => array( 'Phiên_bản' ),
'Wantedcategories' => array( 'Thể_loại_cần_thiết' ),
'Wantedfiles' => array( 'Tập_tin_cần_thiết' ),
@@ -159,7 +161,7 @@ $specialPageAliases = array(
$magicWords = array(
'redirect' => array( '0', '#đổi', '#REDIRECT' ),
- 'notoc' => array( '0', '__KHÔNGMỤCMỤC__', '__NOTOC__' ),
+ 'notoc' => array( '0', '__KHÔNGMỤCLỤC__', '__NOTOC__' ),
'nogallery' => array( '0', '__KHÔNGALBUM__', '__NOGALLERY__' ),
'forcetoc' => array( '0', '__LUÔNMỤCLỤC__', '__FORCETOC__' ),
'toc' => array( '0', '__MỤCLỤC__', '__TOC__' ),
@@ -193,6 +195,7 @@ $magicWords = array(
'pagename' => array( '1', 'TÊNTRANG', 'PAGENAME' ),
'pagenamee' => array( '1', 'TÊNTRANG2', 'PAGENAMEE' ),
'namespace' => array( '1', 'KHÔNGGIANTÊN', 'NAMESPACE' ),
+ 'namespacenumber' => array( '1', 'Sá»KHÔNGGIANTÊN', 'NAMESPACENUMBER' ),
'talkspace' => array( '1', 'KGTTHẢOLUẬN', 'TALKSPACE' ),
'subjectspace' => array( '1', 'KGTNỘIDUNG', 'SUBJECTSPACE', 'ARTICLESPACE' ),
'fullpagename' => array( '1', 'TÊNTRANGÄỦ', 'FULLPAGENAME' ),
@@ -212,6 +215,13 @@ $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_baseline' => array( '1', 'chân-chữ', 'baseline' ),
+ 'img_sub' => array( '1', 'chỉ-số-dưới', 'sub' ),
+ 'img_super' => array( '1', 'chỉ-số-trên', 'super', 'sup' ),
+ 'img_top' => array( '1', 'trên', 'top' ),
+ 'img_text_top' => array( '1', 'trên-chữ', 'text-top' ),
+ 'img_bottom' => array( '1', 'dÆ°á»›i', 'bottom' ),
+ 'img_text_bottom' => array( '1', 'dưới-chữ', 'text-bottom' ),
'img_link' => array( '1', 'liên_kết=$1', 'link=$1' ),
'img_class' => array( '1', 'lá»›p=$1', 'class=$1' ),
'int' => array( '0', 'NỘI:', 'INT:' ),
@@ -236,13 +246,23 @@ $magicWords = array(
'revisionmonth' => array( '1', 'THÃNGBẢN', 'REVISIONMONTH' ),
'revisionmonth1' => array( '1', 'THÃNGBẢN1', 'REVISIONMONTH1' ),
'revisionyear' => array( '1', 'NĂMBẢN', 'REVISIONYEAR' ),
+ 'revisiontimestamp' => array( '1', 'Má»CTHỜIGIANBẢN', 'DẤUTHỜIGIANBẢN', 'REVISIONTIMESTAMP' ),
+ 'revisionuser' => array( '1', 'NGƯỜIDÙNGBẢN', 'REVISIONUSER' ),
'plural' => array( '0', 'Sá»NHIỀU:', 'PLURAL:' ),
'fullurl' => array( '0', 'URLÄỦ:', 'FULLURL:' ),
+ 'canonicalurl' => array( '0', 'URLCHUẨN:', 'CANONICALURL:' ),
+ 'lcfirst' => array( '0', 'CHá»®ÄẦUHOA:', 'LCFIRST:' ),
+ 'ucfirst' => array( '0', 'CHá»®ÄẦUTHƯỜNG:', 'UCFIRST:' ),
+ 'lc' => array( '0', 'CHá»®HOA:', 'LC:' ),
+ 'uc' => array( '0', 'CHỮTHƯỜNG:', 'UC:' ),
'displaytitle' => array( '1', 'TÊNHIỂNTHỊ', 'DISPLAYTITLE' ),
'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:' ),
+ 'anchorencode' => array( '0', 'MÃHÓANEO', 'ANCHORENCODE' ),
+ 'currenttimestamp' => array( '1', 'Má»CTHỜIGIANNÀY', 'DẤUTHỜIGIANNÀY', 'CURRENTTIMESTAMP' ),
+ 'localtimestamp' => array( '1', 'Má»CTHỜIGIANÄỊAPHƯƠNG', 'DẤUTHỜIGIANÄỊAPHƯƠNG', 'LOCALTIMESTAMP' ),
'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:' ),
@@ -254,6 +274,8 @@ $magicWords = array(
'hiddencat' => array( '1', '__THỂLOẠIẨN__', '__HIDDENCAT__' ),
'pagesincategory' => array( '1', 'CỠTHỂLOẠI', 'PAGESINCATEGORY', 'PAGESINCAT' ),
'pagesize' => array( '1', 'Cá» TRANG', 'PAGESIZE' ),
+ 'index' => array( '1', '__CHỈMỤC__', '__INDEX__' ),
+ 'noindex' => array( '1', '__KHÔNGCHỈMỤC__', '__NOINDEX__' ),
'numberingroup' => array( '1', 'CỠNHÓM', 'NUMBERINGROUP', 'NUMINGROUP' ),
'staticredirect' => array( '1', '__Äá»”IHƯỚNGNHẤTÄỊNH__', '__STATICREDIRECT__' ),
'protectionlevel' => array( '1', 'MỨCKHÓA', 'MỨCKHOÃ', 'PROTECTIONLEVEL' ),
@@ -332,9 +354,6 @@ $messages = array(
'tog-shownumberswatching' => 'Hiển thị số ngÆ°á»i Ä‘ang xem',
'tog-oldsig' => 'Chữ ký hiện tại:',
'tog-fancysig' => 'Xem chữ ký là mã wiki (không có liên kết tự động)',
-'tog-externaleditor' => 'Mặc định dùng trình soạn thảo bên ngoài (chỉ dành cho ngÆ°á»i thành thạo, cần thiết lập đặc biệt trên máy tính của bạn; [//www.mediawiki.org/wiki/Manual:External_editors?uselang=vi chi tiết])',
-'tog-externaldiff' => 'Mặc định dùng trình so sánh bên ngoài (chỉ dành cho ngÆ°á»i thành thạo, cần thiết lập đặc biệt trên máy tính của bạn; [//www.mediawiki.org/wiki/Manual:External_editors?uselang=vi chi tiết])',
-'tog-showjumplinks' => 'Bật liên kết “bước tới†trên đầu trang cho bộ trình duyệt thuần văn bản hay âm thanh',
'tog-uselivepreview' => 'Xem trước trực tiếp (thử nghiệm)',
'tog-forceeditsummary' => 'Nhắc tôi khi tôi quên tóm lược sửa đổi',
'tog-watchlisthideown' => 'Ẩn các sá»­a đổi của tôi khá»i danh sách theo dõi',
@@ -348,6 +367,8 @@ $messages = array(
'tog-showhiddencats' => 'Hiển thị thể loại ẩn',
'tog-noconvertlink' => 'Tắt liên kết chuyển đổi tá»±a Ä‘á»',
'tog-norollbackdiff' => 'Không so sánh sau khi lùi sửa',
+'tog-useeditwarning' => 'Cảnh báo khi tôi thoát trang sửa đổi mà chưa lưu trang',
+'tog-prefershttps' => 'Luôn kết nối an toàn khi đăng nhập',
'underline-always' => 'Luôn luôn',
'underline-never' => 'Không bao giá»',
@@ -411,6 +432,18 @@ $messages = array(
'oct' => 'tháng 10',
'nov' => 'tháng 11',
'dec' => 'tháng 12',
+'january-date' => '$1 tháng 1',
+'february-date' => '$1 tháng 2',
+'march-date' => '$1 tháng 3',
+'april-date' => '$1 tháng 4',
+'may-date' => '$1 tháng 5',
+'june-date' => '$1 tháng 6',
+'july-date' => '$1 tháng 7',
+'august-date' => '$1 tháng 8',
+'september-date' => '$1 tháng 9',
+'october-date' => '$1 tháng 10',
+'november-date' => '$1 tháng 11',
+'december-date' => '$1 tháng 12',
# Categories related messages
'pagecategories' => '{{PLURAL:$1|Thể loại|Thể loại}}',
@@ -492,6 +525,7 @@ $messages = array(
'create-this-page' => 'Tạo trang này',
'delete' => 'Xóa',
'deletethispage' => 'Xóa trang này',
+'undeletethispage' => 'Phục hồi trang này',
'undelete_short' => 'Phục hồi {{PLURAL:$1|một sửa đổi|$1 sửa đổi}}',
'viewdeleted_short' => 'Xem {{PLURAL:$1|sửa đổi|$1 sửa đổi}} đã xóa',
'protect' => 'Khóa',
@@ -535,7 +569,7 @@ $1',
'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).
+# 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).
'aboutsite' => 'Giới thiệu {{SITENAME}}',
'aboutpage' => 'Project:Giới thiệu',
'copyright' => 'Nội dung được phát hành theo $1, ngoại trừ khi có ghi chú khác.',
@@ -545,7 +579,6 @@ $1',
'disclaimers' => 'Phủ nhận',
'disclaimerpage' => 'Project:Phủ nhận chung',
'edithelp' => 'Trợ giúp sửa đổi',
-'edithelppage' => 'Help:Sửa đổi',
'helppage' => 'Help:Ná»™i dung',
'mainpage' => 'Trang Chính',
'mainpage-description' => 'Trang Chính',
@@ -623,17 +656,12 @@ Có danh sách trang đặc biệt tại [[Special:SpecialPages|{{int:specialpag
# General errors
'error' => 'Lá»—i',
'databaseerror' => 'Lỗi cơ sở dữ liệu',
-'dberrortext' => 'Äã xảy ra lá»—i cú pháp trong truy vấn cÆ¡ sở dữ liệu.
-Có vẻ nhÆ° nguyên nhân của vấn Ä‘á» này xuất phát từ má»™t lá»—i trong phần má»m.
-Truy vấn vừa rồi là:
-<blockquote><code>$1</code></blockquote>
-từ hàm “<code>$2</code>â€.
-CÆ¡ sở dữ liệu báo lá»—i “<samp>$3: $4</samp>â€.',
-'dberrortextcl' => 'Äã xảy ra lá»—i cú pháp trong truy vấn cÆ¡ sở dữ liệu.
-Truy vấn vừa rồi là:
-“$1â€
-từ hàm “$2â€.
-CÆ¡ sở dữ liệu báo lá»—i “$3: $4â€',
+'databaseerror-text' => 'Xuất hiện lỗi truy vấn cơ sở dữ liệu.
+Äiá»u này có thể xảy ra do má»™t lá»—i phần má»m.',
+'databaseerror-textcl' => 'Xuất hiện lỗi truy vấn cơ sở dữ liệu.',
+'databaseerror-query' => 'Truy vấn: $1',
+'databaseerror-function' => 'Hàm: $1',
+'databaseerror-error' => 'Lá»—i: $1',
'laggedslavemode' => 'Cảnh báo: Trang có thể chưa được cập nhật.',
'readonly' => 'Cơ sở dữ liệu bị khóa',
'enterlockreason' => 'Nêu lý do khóa, cùng vá»›i thá»i hạn khóa',
@@ -666,6 +694,7 @@ Xin hãy báo nó cho một [[Special:ListUsers/sysop|bảo quản viên]], tron
'cannotdelete-title' => 'Không thể xóa trang “$1â€',
'delete-hook-aborted' => 'Má»™t phần bổ trợ phần má»m đã bá» qua việc xóa này.
Không có lý do nào được đưa ra.',
+'no-null-revision' => 'Không thể tạo phiên bản không ná»™i dung má»›i cho trang “$1â€',
'badtitle' => 'Tá»±a trang sai',
'badtitletext' => 'Tá»±a trang yêu cầu không đúng, rá»—ng, hoặc là má»™t liên kết ngôn ngữ hoặc liên kết wiki sai. Nó có thể chứa má»™t hoặc nhiá»u ký tá»± mà tá»±a trang không thể sá»­ dụng.',
'perfcached' => 'Dữ liệu sau được lấy từ bá»™ nhá»› đệm và có thể đã lá»—i thá»i. Tối Ä‘a có sẵn {{PLURAL:$1|má»™t kết quả|$1 kết quả}} trong bá»™ nhá»› đệm.',
@@ -683,12 +712,15 @@ Truy vấn: $2',
'viewyourtext' => "Bạn vẫn có thể xem và chép xuống mã nguồn '''các sửa đổi của bạn''' tại trang này:",
'protectedinterface' => 'Trang này cung cấp má»™t thông Ä‘iệp trong giao diện phần má»m, và bị khóa để tránh phá hoại. Äể bổ sung hoặc thay đổi bản dịch ở bất cứ wiki nào, xin vui lòng đóng góp vào [//translatewiki.net/wiki/Main_Page?setlang=vi translatewiki.net], dá»± án bản địa hóa của MediaWiki.',
'editinginterface' => "'''LÆ°u ý:''' Bạn Ä‘ang sá»­a chữa má»™t trang dùng để cung cấp thông Ä‘iệp giao diện cho phần má»m. Những thay đổi tại trang này sẽ ảnh hưởng đến giao diện của rất nhiá»u ngÆ°á»i dùng wiki này. Äể bổ sung hoặc thay đổi bản dịch ở bất cứ wiki nào, xin vui lòng đóng góp vào [//translatewiki.net/wiki/Main_Page?setlang=vi translatewiki.net], dá»± án bản địa hóa của MediaWiki.",
-'sqlhidden' => '(đã giấu truy vấn SQL)',
'cascadeprotected' => 'Trang này đã bị khóa không cho sá»­a đổi, vì nó được nhúng vào {{PLURAL:$1|trang|những trang}} đã bị khóa vá»›i tùy chá»n “khóa theo tầng†được kích hoạt:
$2',
'namespaceprotected' => "Bạn không có quyá»n sá»­a các trang trong không gian tên '''$1'''.",
'customcssprotected' => 'Bạn không có quyá»n sá»­a đổi trang CSS này vì nó chứa các tùy chá»n cá nhân của má»™t thành viên khác.',
'customjsprotected' => 'Bạn không có quyá»n sá»­a đổi trang JavaScript này vì nó chứa các tùy chá»n cá nhân của má»™t thành viên khác.',
+'mycustomcssprotected' => 'Bạn không có quyá»n sá»­a đổi trang CSS này.',
+'mycustomjsprotected' => 'Bạn không có quyá»n sá»­a đổi trang JavaScript này.',
+'myprivateinfoprotected' => 'Bạn không có quyá»n sá»­a đổi thông tin cá nhân của bạn.',
+'mypreferencesprotected' => 'Bạn không có quyá»n thay đổi tùy chá»n của bạn.',
'ns-specialprotected' => 'Không thể sửa chữa các trang trong không gian tên {{ns:special}}.',
'titleprotected' => "Tựa đỠnày đã bị [[User:$1|$1]] khóa không cho tạo ra.
Lý do được cung cấp là ''$2''.",
@@ -713,10 +745,19 @@ Xin lưu ý rằng một vài trang có thể vẫn hiển thị như khi bạn
'welcomecreation-msg' => 'Tài khoản của bạn đã được mở.
Hãy nhá»› thay đổi [[Special:Preferences|tùy chá»n cá nhân {{SITENAME}}]] của bạn.',
'yourname' => 'Tên ngÆ°á»i dùng:',
+'userlogin-yourname' => 'Tên đăng nhập',
+'userlogin-yourname-ph' => 'Nhập tên đăng nhập',
+'createacct-another-username-ph' => 'Nhập tên ngÆ°á»i dùng',
'yourpassword' => 'Mật khẩu:',
+'userlogin-yourpassword' => 'Mật khẩu',
+'userlogin-yourpassword-ph' => 'Nhập mật khẩu',
+'createacct-yourpassword-ph' => 'Nhập vào mật khẩu',
'yourpasswordagain' => 'Gõ lại mật khẩu',
+'createacct-yourpasswordagain' => 'Xác nhận lại mật khẩu',
+'createacct-yourpasswordagain-ph' => 'Nhập mật khẩu lần nữa',
'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',
+'userlogin-remembermypassword' => 'Giữ trạng thái đăng nhập',
+'userlogin-signwithsecure' => 'Sử dụng kết nối an toàn',
'yourdomainname' => 'Tên miá»n của bạn:',
'password-change-forbidden' => 'Bạn không thể đổi mật khẩu trên wiki này.',
'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.',
@@ -728,18 +769,44 @@ Hãy nhá»› thay đổi [[Special:Preferences|tùy chá»n cá nhân {{SITENAME}}]
'logout' => 'Äăng xuất',
'userlogout' => 'Äăng xuất',
'notloggedin' => 'Chưa đăng nhập',
+'userlogin-noaccount' => 'Bạn chưa có tài khoản?',
+'userlogin-joinproject' => 'Tham gia {{SITENAME}}',
'nologin' => "Bạn chưa có tài khoản ở đây? '''$1'''.",
'nologinlink' => 'Mở tài khoản mới',
'createaccount' => 'Mở tài khoản',
'gotaccount' => "Äã mở tài khoản rồi? '''$1'''.",
'gotaccountlink' => 'Äăng nhập',
'userlogin-resetlink' => 'Quên mất thông tin đăng nhập?',
+'userlogin-resetpassword-link' => 'Äặt lại mật khẩu của bạn',
+'helplogin-url' => 'Help:Äăng nhập',
+'userlogin-helplink' => '[[{{MediaWiki:helplogin-url}}|Trợ giúp đăng nhập]]',
+'userlogin-loggedin' => 'Bạn đã đăng nhập với tên {{GENDER:$1}}$1.
+Hãy sá»­ dụng biểu mẫu ở dÆ°á»›i để đăng nhập vá»›i tài khoản ngÆ°á»i dùng khác.',
+'userlogin-createanother' => 'Mở thêm tài khoản',
+'createacct-join' => 'Nhập thông tin của bạn bên dưới.',
+'createacct-another-join' => 'Nhập thông tin của tài khoản mới dưới đây.',
+'createacct-emailrequired' => 'Äịa chỉ thÆ° Ä‘iện tá»­',
+'createacct-emailoptional' => 'Äịa chỉ thÆ° Ä‘iện tá»­ (tùy chá»n)',
+'createacct-email-ph' => 'Nhập địa chỉ thư điện tử của bạn',
+'createacct-another-email-ph' => 'Nhập địa chỉ thư điện tử',
'createaccountmail' => 'Sử dụng mật khẩu ngẫu nhiên tạm và gửi nó cho địa chỉ thư điện tử được chỉ định',
+'createacct-realname' => 'Tên thật (tùy chá»n)',
'createaccountreason' => 'Lý do:',
+'createacct-reason' => 'Lý do',
+'createacct-reason-ph' => 'Nhập lý do tạo một tài khoản khác',
+'createacct-captcha' => 'Kiểm tra an toàn',
+'createacct-imgcaptcha-ph' => 'Nhập dòng chữ bạn thấy bên dưới',
+'createacct-submit' => 'Tạo tài khoản',
+'createacct-another-submit' => 'Mở thêm tài khoản',
+'createacct-benefit-heading' => '{{SITENAME}} được xây dá»±ng bởi những ngÆ°á»i nhÆ° bạn.',
+'createacct-benefit-body1' => '{{PLURAL:$1}}lần sửa đổi',
+'createacct-benefit-body2' => '{{PLURAL:$1}}trang ná»™i dung',
+'createacct-benefit-body3' => '{{PLURAL:$1}}ngÆ°á»i đóng góp gần đây',
'badretype' => 'Hai mật khẩu không khớp.',
'userexists' => 'Tên ngÆ°á»i dùng được nhập đã có ngÆ°á»i lấy.
Hãy chá»n má»™t tên khác.',
'loginerror' => 'Lỗi đăng nhập',
+'createacct-error' => 'Lỗi mở tài khoản',
'createaccounterror' => 'Không thể mở tài khoản: $1',
'nocookiesnew' => 'Bạn đã tạo tài khoản thành công, nhÆ°ng bạn chÆ°a đăng nhập. {{SITENAME}} sá»­ dụng cookie để đăng nhập vào tài khoản. Bạn đã tắt cookie. Xin hãy bật cookie lên, rồi đăng nhập lại vá»›i tên ngÆ°á»i dùng và mật khẩu má»›i.',
'nocookieslogin' => '{{SITENAME}} sử dụng cookie để đăng nhập thành viên. Bạn đã tắt cookie. Xin hãy kích hoạt rồi thử lại.',
@@ -787,11 +854,13 @@ Hãy nhập một địa chỉ có định dạng đúng hoặc bỠtrống ô
Xin hãy bỠqua thông điệp này nếu tài khoản này không phải do bạn tạo ra.',
'usernamehasherror' => 'Tên ngÆ°á»i dùng không thể chứa dấu rào',
-'login-throttled' => 'Bạn đã thá»­ quá nhiá»u mật khẩu của tài khoản này.
-Xin hãy đợi chốc lát rồi thử lại.',
+'login-throttled' => 'Bạn đã hết quyá»n thá»­ mật khẩu tài khoản này vì bạn đã nhập sai quá nhiá»u. Xin hãy đợi $1 rồi hãy thá»­ lại.',
'login-abort-generic' => 'Thất bại khi đăng nhập',
'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Æ°.',
+'createacct-another-realname-tip' => 'Tên thật là không bắt buộc.
+
+Nếu bạn đồng ý cung cấp, nó sẽ dùng để ghi nhận công lao của bạn.',
# Email sending
'php-mail-error-unknown' => 'Lỗi không rõ trong hàm PHP mail()',
@@ -807,8 +876,7 @@ Xin hãy đợi chốc lát rồi thử lại.',
'newpassword' => 'Mật khẩu mới:',
'retypenew' => 'Gõ lại:',
'resetpass_submit' => 'Chá»n mật khẩu và đăng nhập',
-'resetpass_success' => 'Mật khẩu của bạn đã được thay thành công!
-Äang đăng nhập…',
+'changepassword-success' => 'Äã đổi mật khẩu thành công!',
'resetpass_forbidden' => 'Không được đổi mật khẩu',
'resetpass-no-info' => 'Bạn phải đăng nhập mới có thể truy cập trực tiếp trang này.',
'resetpass-submit-loggedin' => 'Thay đổi mật khẩu',
@@ -820,10 +888,11 @@ Có thể bạn đã thay đổi thành công mật khẩu của mình hoặc đ
# Special:PasswordReset
'passwordreset' => 'Tái tạo mật khẩu',
-'passwordreset-text' => 'Hãy Ä‘iá»n mẫu Ä‘Æ¡n này để tái tạo mật khẩu.',
+'passwordreset-text-one' => 'Hãy Ä‘iá»n mẫu Ä‘Æ¡n này để tái tạo mật khẩu.',
+'passwordreset-text-many' => '{{PLURAL:$1|Äiá»n vào má»™t há»™p sau để tái tạo mật khẩu.}}',
'passwordreset-legend' => 'Tái tạo mật khẩu',
'passwordreset-disabled' => 'Chức năng tái tạo mật khẩu đã bị tắt trên wiki này.',
-'passwordreset-pretext' => '{{PLURAL:$1||Nhập một trong những thông tin được yêu cầu ở dưới}}',
+'passwordreset-emaildisabled' => 'Tính năng gửi thư điện tử không được kích hoạt trên wiki này.',
'passwordreset-username' => 'Tên ngÆ°á»i dùng:',
'passwordreset-domain' => 'Tên miá»n:',
'passwordreset-capture' => 'Xem thư điện tử có mật khẩu tạm',
@@ -854,7 +923,7 @@ mật khẩu cũ.',
Mật khẩu tạm: $2',
'passwordreset-emailsent' => 'Äã gá»­i thÆ° Ä‘iện tá»­ để tái tạo mật khẩu.',
'passwordreset-emailsent-capture' => 'Thư điện tử để tái tạo mật khẩu đã được gửi, nội dung như sau.',
-'passwordreset-emailerror-capture' => 'Chúng tôi đã tạo thÆ° tái tạo mật khẩu dÆ°á»›i đây, nhÆ°ng không thể gá»­i đến ngÆ°á»i dùng: $1',
+'passwordreset-emailerror-capture' => 'Chúng tôi đã tạo thÆ° tái tạo mật khẩu dÆ°á»›i đây, nhÆ°ng không thể gá»­i đến {{GENDER:$2}}ngÆ°á»i dùng: $1',
# Special:ChangeEmail
'changeemail' => 'Äổi địa chỉ thÆ° Ä‘iện tá»­',
@@ -868,6 +937,19 @@ Mật khẩu tạm: $2',
'changeemail-submit' => 'Äổi địa chỉ',
'changeemail-cancel' => 'Hủy bá»',
+# Special:ResetTokens
+'resettokens' => 'Äặt lại dấu hiệu',
+'resettokens-text' => 'Bạn có thể đặt lại các dấu hiệu cho phép truy cập những dữ liệu cá nhân của tài khoản của bạn tại đây.
+
+Bạn nên sá»­ dụng chức năng này nếu bạn đã vô tình chia sẻ các dấu hiệu vá»›i ngÆ°á»i khác hoặc tài khoản của bạn đã bị xâm phạm.',
+'resettokens-no-tokens' => 'Không có dấu hiệu để đặt lại.',
+'resettokens-legend' => 'Äặt lại dấu hiệu',
+'resettokens-tokens' => 'Dấu hiệu:',
+'resettokens-token-label' => '$1 (giá trị hiện tại: $2)',
+'resettokens-watchlist-token' => 'Dấu hiệu cho nguồn cấp [[Special:Watchlist|thay đổi trong danh sách theo dõi]] (dạng Atom/RSS)',
+'resettokens-done' => 'Äã đặt lại các dấu hiệu.',
+'resettokens-resetbutton' => 'Äặt lại các dấu hiệu được chá»n',
+
# Edit page toolbar
'bold_sample' => 'Chữ đậm',
'bold_tip' => 'Chữ đậm',
@@ -948,7 +1030,7 @@ Có thể nó đã bị di chuyển hoặc xóa đi trong khi bạn đang xem tr
'accmailtitle' => 'Äã gá»­i mật khẩu.',
'accmailtext' => "Một mật khẩu được tạo ngẫu nhiên cho [[User talk:$1|$1]] đã được gửi đến $2. Có thể đổi mật khẩu tại trang ''[[Special:ChangePassword|đổi mật khẩu]]'' sau khi đã đăng nhập.",
'newarticle' => '(Má»›i)',
-'newarticletext' => '<div style="margin-top: 0px;" class="emptymwmsg mediawiki_newarticletext[[{{MediaWiki:Helppage}}|help page]]"></div>',
+'newarticletext' => "Bạn Ä‘i đến đây từ má»™t liên kết đến má»™t trang chÆ°a tồn tại. Äể tạo trang, hãy bắt đầu gõ vào ô bên dÆ°á»›i (xem [[{{MediaWiki:Helppage}}|trang trợ giúp]] để có thêm thông tin). Nếu bạn đến đây do nhầm lẫn, chỉ cần nhấn vào nút '''Lùi''' (''Back'') trong trình duyệt của bạn.",
'anontalkpagetext' => "----''Äây là trang thảo luận của má»™t ngÆ°á»i dùng vô danh chÆ°a tạo tài khoản hoặc có tài khoản nhÆ°ng không đăng nhập.
Do đó chúng ta phải dùng má»™t dãy số gá»i là địa chỉ IP để xác định anh/chị ta.
Má»™t địa chỉ IP nhÆ° vậy có thể có nhiá»u ngÆ°á»i cùng dùng chung.
@@ -1060,12 +1142,15 @@ Không có lý do nào được đưa ra.',
DÆ°á»ng nhÆ° trang này đã bị xóa.',
'edit-conflict' => 'Sửa đổi mâu thuẫn.',
'edit-no-change' => 'Sửa đổi của bạn không được tính đến, vì nó không làm thay đổi nội dung.',
+'postedit-confirmation' => 'Sửa đổi của bạn đã được lưu.',
'edit-already-exists' => 'Không thể tạo trang mới.
Nó đã tồn tại.',
'defaultmessagetext' => 'Nội dung mặc định',
'content-failed-to-parse' => 'Thất bại phân tích nội dung $2 cho mô hình $1: $3',
'invalid-content-data' => 'Dữ liệu nội dung không hợp lệ',
'content-not-allowed-here' => 'Không cho phép đưa nội dung “$1†vào trang [[$2]]',
+'editwarning-warning' => 'Rá»i khá»i trang này sẽ khiến bạn mất các sá»­a đổi đã thá»±c hiện.
+Nếu đã đăng nhập, bạn có thể tắt cảnh báo này tại mục “Sá»­a đổi†trong tùy chá»n cá nhân.',
# Content models
'content-model-wikitext' => 'mã wiki',
@@ -1100,6 +1185,7 @@ Những tham số này sẽ bị bỠđi.',
'undo-failure' => 'Sửa đổi không thể phục hồi vì đã có những sửa đổi mới ở sau.',
'undo-norev' => 'Sửa đổi không thể hồi phục vì nó không tồn tại hoặc đã bị xóa.',
'undo-summary' => 'Äã lùi lại sá»­a đổi $1 của [[Special:Contributions/$2|$2]] ([[User talk:$2|Thảo luận]])',
+'undo-summary-username-hidden' => 'Äã lùi lại sá»­a đổi $1 của má»™t ngÆ°á»i dùng ẩn',
# Account creation failure
'cantcreateaccounttitle' => 'Không thể mở tài khoản',
@@ -1279,6 +1365,7 @@ Xin hãy bảo đảm giữ vững tính liên tục của lịch sử trang.',
'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-empty' => '(Không có sự khác biệt)',
'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)',
'difference-missing-revision' => 'Không tìm thấy {{PLURAL:$2|một phiên bản|$2 phiên bản}} trong khác biệt này ($1).
@@ -1306,7 +1393,6 @@ Xem chi tiết trong [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}}
'searchmenu-legend' => 'Tùy chá»n tìm kiếm',
'searchmenu-exists' => "* Trang '''[[$1]]'''",
'searchmenu-new' => "'''Tạo trang “[[:$1]]†trên wiki này!'''",
-'searchhelp-url' => 'Help:Ná»™i dung',
'searchmenu-prefix' => '[[Special:PrefixIndex/$1|Duyệt các trang vá»›i tiá»n tố này]]',
'searchprofile-articles' => 'Trang ná»™i dung',
'searchprofile-project' => 'Trang trợ giúp và trang dự án',
@@ -1347,15 +1433,7 @@ Xem chi tiết trong [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}}
'powersearch-togglenone' => 'Không',
'search-external' => 'Tìm kiếm từ bên ngoài',
'searchdisabled' => 'Chức năng tìm kiếm tại {{SITENAME}} đã bị tắt. Bạn có tìm kiếm bằng Google trong thá»i gian này. Chú ý rằng các chỉ mục từ {{SITENAME}} của chúng có thể đã lá»—i thá»i.',
-
-# Quickbar
-'qbsettings' => 'Thanh công cụ',
-'qbsettings-none' => 'Không có',
-'qbsettings-fixedleft' => 'Cố định trái',
-'qbsettings-fixedright' => 'Cố định phải',
-'qbsettings-floatingleft' => 'Nổi bên trái',
-'qbsettings-floatingright' => 'Nổi bên phải',
-'qbsettings-directionality' => 'Cố định, tùy theo hướng viết ngôn ngữ của bạn',
+'search-error' => 'Äã xuất hiện lá»—i khi tìm kiếm: $1',
# Preferences page
'preferences' => 'Tùy chá»n',
@@ -1389,7 +1467,6 @@ Xem chi tiết trong [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}}
'resetprefs' => 'Mặc định lại lá»±a chá»n',
'restoreprefs' => 'Mặc định lại toàn bá»™ tùy chá»n (trong tất cả các phần)',
'prefs-editing' => 'Sửa đổi',
-'prefs-edit-boxsize' => 'Kích thước cửa sổ soạn thảo.',
'rows' => 'Số hàng:',
'columns' => 'Số cột:',
'searchresultshead' => 'Tìm kiếm',
@@ -1400,9 +1477,9 @@ Xem chi tiết trong [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}}
'recentchangesdays-max' => '(tối đa $1 {{PLURAL:$1|ngày|ngày}})',
'recentchangescount' => 'Số sửa đổi hiển thị mặc định:',
'prefs-help-recentchangescount' => 'Số này bao gồm các thay đổi gần đây, lịch sử trang, và nhật trình.',
-'prefs-help-watchlist-token' => 'Äiá»n vào ô này má»™t khóa bí mật để tạo ra bản tin RSS cho danh sách theo dõi của bạn.
-Bất cứ ai biết được khóa trong ô này cÅ©ng có thể Ä‘á»c được danh sách theo dõi của bạn, vì vậy hãy chá»n má»™t giá trị an toàn.
-Äây là giá trị được tạo ngẫu nhiên mà bạn có thể sá»­ dụng: $1',
+'prefs-help-watchlist-token2' => 'Äây là chìa khóa bí mật cho nguồn cấp dữ liệu danh sách theo dõi của bạn.
+Bất cứ ai biết nó sẽ có thể để Ä‘á»c danh sách theo dõi của bạn, vì vậy đừng chia sẻ nó.
+[[Special:ResetTokens|Nhấn chuột vào đây nếu bạn cần phải thiết lập lại nó]].',
'savedprefs' => 'Äã lÆ°u các tùy chá»n cá nhân.',
'timezonelegend' => 'Múi giá»:',
'localtime' => 'GiỠhiện tại:',
@@ -1433,7 +1510,6 @@ Bất cứ ai biết được khóa trong ô này cÅ©ng có thể Ä‘á»c đượ
'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ử:',
-'prefs-textboxsize' => 'Kích cỡ hộp sửa đổi',
'youremail' => 'Thư điện tử:',
'username' => '{{GENDER:$1}}Tên ngÆ°á»i dùng:',
'uid' => '{{GENDER:$1}}Số thứ tự thành viên:',
@@ -1467,6 +1543,8 @@ Nếu bạn đồng ý cung cấp, nó sẽ dùng để ghi nhận công lao cá»
'prefs-dateformat' => 'Kiểu ngày tháng',
'prefs-timeoffset' => 'Chênh giá»',
'prefs-advancedediting' => 'Tùy chá»n chung',
+'prefs-editor' => 'Trình soạn',
+'prefs-preview' => 'Xem trÆ°á»›c',
'prefs-advancedrc' => 'Tùy chá»n nâng cao',
'prefs-advancedrendering' => 'Tùy chá»n nâng cao',
'prefs-advancedsearchoptions' => 'Tùy chá»n nâng cao',
@@ -1474,7 +1552,9 @@ Nếu bạn đồng ý cung cấp, nó sẽ dùng để ghi nhận công lao cá»
'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-tokenwatchlist' => 'Dấu hiệu',
'prefs-diffs' => 'Khác biệt',
+'prefs-help-prefershttps' => 'Äăng xuất và đăng nhập lại để áp dụng tùy chá»n này.',
# User preference: email validation using jQuery
'email-address-validity-valid' => 'Có vẻ hợp lệ',
@@ -1501,6 +1581,8 @@ Nếu bạn đồng ý cung cấp, nó sẽ dùng để ghi nhận công lao cá»
'userrights-notallowed' => 'Bạn không có quyá»n gán hoặc bãi miá»…n quyá»n cho thành viên.',
'userrights-changeable-col' => 'Những nhóm bạn có thể thay đổi',
'userrights-unchangeable-col' => 'Những nhóm bạn không thể thay đổi',
+'userrights-conflict' => 'Mâu thuẫn thay đổi sửa nhóm thành viên! Xin vui lòng xem lại và xác nhận các thay đổi của bạn.',
+'userrights-removed-self' => 'Bạn đã loại bá» quyá»n của chính mình nên không còn truy cập được trang này.',
# Groups
'group' => 'Nhóm:',
@@ -1566,11 +1648,19 @@ Nếu bạn đồng ý cung cấp, nó sẽ dùng để ghi nhận công lao cá»
'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 theo tầng',
-'right-editprotected' => 'Sửa trang khóa (không bị khóa theo tầng)',
+'right-editprotected' => 'Sá»­a trang khóa ở mức “{{int:protect-level-sysop}}â€',
+'right-editsemiprotected' => 'Sá»­a trang khóa ở mức “{{int:protect-level-autoconfirmed}}â€',
'right-editinterface' => 'Sá»­a giao diện ngÆ°á»i dùng',
'right-editusercssjs' => 'Sá»­a tập tin CSS và JS của ngÆ°á»i dùng khác',
'right-editusercss' => 'Sá»­a tập tin CSS của ngÆ°á»i dùng khác',
'right-edituserjs' => 'Sá»­a đổi tập tin JavaScript của ngÆ°á»i dùng khác',
+'right-editmyusercss' => 'Sửa đổi tập tin CSS cá nhân của mình',
+'right-editmyuserjs' => 'Sửa đổi tập tin JavaScript cá nhân của mình',
+'right-viewmywatchlist' => 'Xem danh sách theo dõi của mình',
+'right-editmywatchlist' => 'Sá»­a đổi danh sách theo dõi của mình – má»™t số tác vụ có thể thêm trang vào danh sách bất chấp quyá»n này',
+'right-viewmyprivateinfo' => 'Xem dữ liệu cá nhân của bạn (ví dụ địa chỉ thư điện tử hoặc tên thật)',
+'right-editmyprivateinfo' => 'Sửa đổi dữ liệu cá nhân của bạn (thí dụ địa chỉ thư điện tử hoặc tên thật)',
+'right-editmyoptions' => 'Sá»­a đổi tùy chá»n của bạn',
'right-rollback' => 'Nhanh chóng lùi tất cả sá»­a đổi của ngÆ°á»i dùng cuối cùng sá»­a đổi trang nào đó',
'right-markbotedits' => 'Äánh dấu sá»­a đổi phục hồi là sá»­a đổi bot',
'right-noratelimit' => 'Không bị ảnh hưởng bởi mức giới hạn tần suất sử dụng',
@@ -1632,12 +1722,19 @@ Nếu bạn đồng ý cung cấp, nó sẽ dùng để ghi nhận công lao cá»
'action-userrights-interwiki' => 'sá»­a đổi quyá»n của ngÆ°á»i dùng tại wiki khác',
'action-siteadmin' => 'khóa hoặc mở khóa cơ sở dữ liệu',
'action-sendemail' => 'gửi thư điện tử',
+'action-editmywatchlist' => 'sửa đổi danh sách theo dõi của mình',
+'action-viewmywatchlist' => 'xem danh sách theo dõi của mình',
+'action-viewmyprivateinfo' => 'xem thông tin cá nhân của bạn',
+'action-editmyprivateinfo' => 'sửa đổi thông tin cá nhân của bạn',
# Recent changes
'nchanges' => '$1 {{PLURAL:$1|thay đổi|thay đổi}}',
+'enhancedrc-since-last-visit' => '$1 {{PLURAL:$1|sau lần truy cập vừa rồi}}',
+'enhancedrc-history' => 'lịch sử',
'recentchanges' => 'Thay đổi gần đây',
'recentchanges-legend' => 'Tùy chá»n thay đổi gần đây',
'recentchanges-summary' => 'Xem các thay đổi gần đây nhất tại wiki trên trang này.',
+'recentchanges-noresult' => 'Không có thay đổi trong khoảng thá»i gian phù hợp vá»›i các tiêu chí này.',
'recentchanges-feed-description' => 'Theo dõi các thay đổi gần đây nhất của wiki dùng nguồn cấp dữ liệu này.',
'recentchanges-label-newpage' => 'Bản sửa này tạo ra trang mới',
'recentchanges-label-minor' => 'Äây là má»™t sá»­a đổi nhá»',
@@ -1674,7 +1771,6 @@ Nếu bạn đồng ý cung cấp, nó sẽ dùng để ghi nhận công lao cá»
'recentchangeslinked-feed' => 'Thay đổi liên quan',
'recentchangeslinked-toolbox' => 'Thay đổi liên quan',
'recentchangeslinked-title' => 'Thay đổi liên quan tá»›i “$1â€',
-'recentchangeslinked-noresult' => 'Không có thay đổi nào trên trang được liên kết đến trong khoảng thá»i gian đã chá»n.',
'recentchangeslinked-summary' => "Äây là danh sách các thay đổi được thá»±c hiện gần đây tại những trang được liên kết đến từ má»™t trang nào đó (hoặc tại các trang thuá»™c má»™t thể loại nào đó).
Các trang trong [[Special:Watchlist|danh sách bạn theo dõi]] được '''tô đậm'''.",
'recentchangeslinked-page' => 'Tên trang:',
@@ -1686,7 +1782,7 @@ Các trang trong [[Special:Watchlist|danh sách bạn theo dõi]] được '''tÃ
'reuploaddesc' => 'Hủy tác vụ tải và quay lại mẫu tải tập tin lên',
'upload-tryagain' => 'Lưu miêu tả tập tin được sửa đổi',
'uploadnologin' => 'Chưa đăng nhập',
-'uploadnologintext' => 'Bạn phải [[Special:UserLogin|đăng nhập]] để tải tập tin lên.',
+'uploadnologintext' => 'Bạn phải $1 để tải tập tin lên.',
'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',
@@ -1914,7 +2010,6 @@ Vì lý do bảo mật, img_auth.php đã bị tắt.',
'http-read-error' => 'Lá»—i Ä‘á»c HTTP.',
'http-timed-out' => 'Hết thá»i gian yêu cầu HTTP.',
'http-curl-error' => 'Có lỗi khi truy xuất URL: $1',
-'http-host-unreachable' => 'Không thể truy cập URL',
'http-bad-status' => 'Có vấn đỠkhi yêu cầu HTTP: $1 $2',
# Some likely curl errors. More could be added from <http://curl.haxx.se/libcurl/c/libcurl-errors.html>
@@ -1942,6 +2037,10 @@ Vì lý do bảo mật, img_auth.php đã bị tắt.',
'listfiles_size' => 'Kích cỡ',
'listfiles_description' => 'Miêu tả',
'listfiles_count' => 'Số phiên bản',
+'listfiles-show-all' => 'Bao gồm các phiên bản cũ của hình ảnh',
+'listfiles-latestversion' => 'Phiên bản hiện tại',
+'listfiles-latestversion-yes' => 'Có',
+'listfiles-latestversion-no' => 'Không',
# File description page
'file-anchor-link' => 'Tập tin',
@@ -2039,6 +2138,13 @@ Hãy nhớ kiểm tra các liên kết khác đến bản mẫu trước khi xó
'randompage' => 'Trang ngẫu nhiên',
'randompage-nopages' => 'Hiện chưa có trang nào trong {{PLURAL:$2||các}} không gian tên: $1.',
+# Random page in category
+'randomincategory' => 'Trang ngẫu nhiên trong thể loại',
+'randomincategory-invalidcategory' => '“$1†không phải tên thể loại hợp lệ.',
+'randomincategory-nopages' => 'Không có trang nào trong [[:Category:$1]].',
+'randomincategory-selectcategory' => 'Xem trang ngẫu nhiên trong thể loại: $1 $2.',
+'randomincategory-selectcategory-submit' => 'Xem',
+
# Random redirect
'randomredirect' => 'Trang đổi hướng ngẫu nhiên',
'randomredirect-nopages' => 'Không có trang đổi hÆ°á»›ng nào trong không gian tên “$1â€.',
@@ -2064,15 +2170,13 @@ Hãy nhớ kiểm tra các liên kết khác đến bản mẫu trước khi xó
'statistics-users-active-desc' => 'Những thành viên đã hoạt động trong {{PLURAL:$1|ngày|$1 ngày}} qua',
'statistics-mostpopular' => 'Các trang được xem nhiá»u nhất',
-'disambiguations' => 'Trang liên kết đến trang định hướng',
-'disambiguationspage' => 'Template:disambig',
-'disambiguations-text' => "Các trang này có liên kết đến ít nhất một '''trang định hướng''', những trang này có thể có liên kết đến các trang đúng nghĩa hơn.<br />Các trang định hướng là trang sử dụng những bản mẫu được liệt kê ở [[MediaWiki:Disambiguationspage]].",
-
'pageswithprop' => 'Trang có thuộc tính trang',
'pageswithprop-legend' => 'Các trang có thuộc tính trang',
'pageswithprop-text' => 'Trang này liệt kê các trang sử dụng một thuộc tính trang nào đó.',
'pageswithprop-prop' => 'Tên thuộc tính:',
'pageswithprop-submit' => 'Xem',
+'pageswithprop-prophidden-long' => 'giá trị thuộc tính văn bản dài dòng bị ẩn ($1)',
+'pageswithprop-prophidden-binary' => 'giá trị thuộc tính nhị phân bị ẩn ($1)',
'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.
@@ -2130,6 +2234,7 @@ Các mục <del>bị gạch bá»</del> là các trang đã được sá»­a.',
'mostrevisions' => 'Trang được sá»­a đổi nhiá»u lần nhất',
'prefixindex' => 'Tất cả các trang trùng vá»›i tiá»n tố',
'prefixindex-namespace' => 'Tất cả các trang trùng vá»›i tiá»n tố (không gian $1)',
+'prefixindex-strip' => 'Ẩn tiá»n tố trong danh sách',
'shortpages' => 'Trang ngắn nhất',
'longpages' => 'Trang dài nhất',
'deadendpages' => 'Trang Ä‘Æ°á»ng cùng',
@@ -2145,6 +2250,7 @@ Các mục <del>bị gạch bá»</del> là các trang đã được sá»­a.',
'listusers' => 'Danh sách thành viên',
'listusers-editsonly' => 'Chỉ hiện thành viên có tham gia sửa đổi',
'listusers-creationsort' => 'Xếp theo ngày khởi tạo',
+'listusers-desc' => 'Sắp xếp thứ tự giảm dần',
'usereditcount' => '$1 {{PLURAL:$1|sửa đổi|sửa đổi}}',
'usercreated' => '{{GENDER:$3}}mở $1 lúc $2',
'newpages' => 'Trang má»›i',
@@ -2319,10 +2425,9 @@ Những sửa đổi đối với trang này và trang thảo luận của nó s
'unwatchthispage' => 'Ngừng theo dõi',
'notanarticle' => 'Không phải trang có nội dung',
'notvisiblerev' => 'Phiên bản bị xóa',
-'watchnochange' => 'Không có trang nào bạn theo dõi được sửa đổi.',
'watchlist-details' => 'Bạn đang theo dõi {{PLURAL:$1|$1 trang|$1 trang}}, không kể các trang thảo luận.',
-'wlheader-enotif' => '* Äã bật thông báo qua thÆ° Ä‘iện tá»­.',
-'wlheader-showupdated' => "* Các trang đã thay đổi từ lần cuối bạn xem chúng được in '''đậm'''",
+'wlheader-enotif' => 'Äã bật thông báo qua thÆ° Ä‘iện tá»­.',
+'wlheader-showupdated' => "Các trang đã thay đổi kể từ lần cuối bạn xem chúng được in '''đậm'''",
'watchmethod-recent' => 'Dưới đây hiện thay đổi mới với các trang theo dõi.',
'watchmethod-list' => 'Dưới đây hiện danh sách các trang theo dõi.',
'watchlistcontains' => 'Danh sách theo dõi của bạn có $1 {{PLURAL:$1|trang|trang}}.',
@@ -2406,8 +2511,8 @@ Xin xác nhận việc bạn định làm, và hiểu rõ những hệ lụy cá»
'deletereason-dropdown' => '*Các lý do xóa phổ biến
** Äăng tỉ thÆ° rác
** Phá hoại
-** Vi phạ bản quyá»n
-** Thiếu tôn trá»ng tác giả
+** Vi phạm bản quyá»n
+** Tác giả yêu cầu
** Chuyển hướng sai',
'delete-edit-reasonlist' => 'Sửa lý do xóa',
'delete-toobig' => 'Trang này có lịch sử sửa đổi lớn, đến hơn {{PLURAL:$1|lần|lần}} sửa đổi.
@@ -2570,7 +2675,7 @@ $1',
'contributions' => '{{GENDER:$1}}Äóng góp của thành viên',
'contributions-title' => 'Äóng góp của thành viên $1',
'mycontris' => 'Äóng góp',
-'contribsub2' => 'Của $1 ($2)',
+'contribsub2' => 'Của {{GENDER:$3}}$1 ($2)',
'nocontribs' => 'Không tìm thấy thay đổi nào khớp với yêu cầu.',
'uctop' => '(hiện tại)',
'month' => 'Từ tháng (trở vỠtrước):',
@@ -2626,17 +2731,13 @@ $1',
'ipbreason' => 'Lý do:',
'ipbreasonotherlist' => 'Lý do khác',
'ipbreason-dropdown' => '*Má»™t số lý do cấm thÆ°á»ng gặp
-** Phá hoại
-** Thêm thông tin nội dung sai lệch
-** Tẩy trống nội dung trang
-** Quảng cáo vớ vẩn
-** Äăng liên kết thÆ° rác đến trang web bên ngoài
+** Thêm thông tin sai lệch
+** Xóa nội dung trang
+** Äăng liên kết thÆ° rác đến trang Web bên ngoài
** Cho thông tin rác vào trang
** Có thái Ä‘á»™ dá»a dẫm/quấy rối
-** Tên thành viên không được chấp nhận
-** Tạo nhiá»u trang má»›i vi phạm bản quyá»n, bá» qua thảo luận và cảnh báo
-** Truyá»n nhiá»u hình ảnh thiếu nguồn gốc hoặc bản quyá»n
-** Con rối của thành viên bị cấm',
+** Lạm dụng nhiá»u tài khoản
+** Tên thành viên không thể chấp nhận',
'ipb-hardblock' => 'Ngăn không cho thành viên đã đăng nhập sửa đổi từ địa chỉ IP này',
'ipbcreateaccount' => 'Cấm mở tài khoản',
'ipbemailban' => 'Không cho gửi thư điện tử',
@@ -2725,13 +2826,11 @@ Xem lại những lần cấm tại [[Special:BlockList|danh sách cấm]].',
'ipb_blocked_as_range' => 'Lá»—i: Äịa chỉ IP $1 không bị cấm trá»±c tiếp và do đó không thể bá» cấm. Tuy nhiên, nó bị cấm do là má»™t bá»™ phận của dải IP $2, bạn có thể bá» cấm dải này.',
'ip_range_invalid' => 'Dải IP không hợp lệ.',
'ip_range_toolarge' => 'Không được phép cấm dải IP lớn hơn /$1.',
-'blockme' => 'Cấm tôi',
'proxyblocker' => 'Cấm proxy',
-'proxyblocker-disabled' => 'Chức năng này đã bị tắt.',
'proxyblockreason' => 'Äịa chỉ IP của bạn đã bị cấm vì là proxy mở. Xin hãy liên hệ nhà cung cấp dịch vụ Internet hoặc bá»™ phận há»— trợ kỹ thuật của bạn và thông báo vá»›i há» vá» vấn Ä‘á» an ninh nghiêm trá»ng này.',
-'proxyblocksuccess' => 'Xong.',
'sorbsreason' => 'Äịa chỉ IP của bạn bị liệt kê là má»™t proxy mở trong DNSBL mà {{SITENAME}} Ä‘ang sá»­ dụng.',
'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.',
+'xffblockreason' => 'Äầu Ä‘á» X-Forwarded-For chứa má»™t địa chỉ IP đã bị cấm, địa chỉ này hoặc của bạn hoặc của má»™t máy chủ proxy bạn Ä‘ang sá»­ dụng. Lý do cấm ban đầu là: $1',
'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.',
@@ -2895,6 +2994,8 @@ Má»i vào [//www.mediawiki.org/wiki/Localisation?uselang=vi Äịa phÆ°Æ¡ng hó
'thumbnail-more' => 'Phóng lớn',
'filemissing' => 'Không có tập tin',
'thumbnail_error' => 'Hình thu nhỠcó lỗi: $1',
+'thumbnail_error_remote' => 'Thông báo lỗi từ $1:
+$2',
'djvu_page_error' => 'Trang DjVu quá xa',
'djvu_no_xml' => 'Không thể truy xuất XML cho tập tin DjVu',
'thumbnail-temp-create' => 'Không thể tạo tập tin hình nhá» tạm thá»i',
@@ -3040,20 +3141,15 @@ Lưu nó vào máy tính của bạn rồi tải nó lên đây.',
'tooltip-undo' => '“Lùi lại†sẽ lùi sửa đổi này và mở trang sửa đổi ở chế độ xem trước. 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',
+'tooltip-iwiki' => '$1 – $2',
# Stylesheets
'common.css' => '/* Mã CSS đặt ở đây sẽ áp dụng cho má»i hình dạng */',
-'standard.css' => '/* Mã CSS tại đây sẽ ảnh hưởng đến những ngÆ°á»i dùng sá»­ dụng hình dạng Cổ Ä‘iển */',
-'nostalgia.css' => '/* Mã CSS tại đây sẽ ảnh hưởng đến những ngÆ°á»i dùng sá»­ dụng hình dạng Vá»ng cổ */',
'cologneblue.css' => '/* Mã CSS tại đây sẽ ảnh hưởng đến những ngÆ°á»i dùng sá»­ dụng hình dạng Xanh Cologne */',
'monobook.css' => '/* Mã CSS đặt ở đây sẽ ảnh hưởng đến thành viên sử dụng hình dạng MonoBook */',
-'myskin.css' => '/* Mã CSS tại đây sẽ ảnh hưởng đến những ngÆ°á»i dùng sá»­ dụng hình dạng Cá nhân */',
-'chick.css' => '/* Mã CSS tại đây sẽ ảnh hưởng đến những ngÆ°á»i dùng sá»­ dụng hình dạng Chick */',
-'simple.css' => '/* Mã CSS tại đây sẽ ảnh hưởng đến những ngÆ°á»i dùng sá»­ dụng hình dạng ÄÆ¡n giản */',
'modern.css' => '/* Mã CSS tại đây sẽ ảnh hưởng đến những ngÆ°á»i dùng sá»­ dụng hình dạng Hiện đại */',
'vector.css' => '/* Mã CSS đặt ở đây sẽ ảnh hưởng đến thành viên sử dụng hình dạng Vectơ */',
'print.css' => '/* Mã CSS tại đây sẽ ảnh hưởng đến bản để in */',
-'handheld.css' => '/* Mã CSS tại đây sẽ ảnh hưởng đến các thiết bị cầm tay dựa trên hình dạng cấu hình trong $wgHandheldStyle */',
'noscript.css' => '/* Mã CSS tại đây sẽ ảnh hưởng đến những ngÆ°á»i dùng tắt JavaScript */',
'group-autoconfirmed.css' => '/* Mã CSS tại đây sẽ chỉ ảnh hưởng đến các thành viên tự động xác nhận */',
'group-bot.css' => '/* Mã CSS tại đây sẽ chỉ ảnh hưởng đến các bot */',
@@ -3062,13 +3158,8 @@ Lưu nó vào máy tính của bạn rồi tải nó lên đây.',
# Scripts
'common.js' => '/* Bất kỳ mã JavaScript ở đây sẽ được tải cho tất cả các thành viên khi tải một trang nào đó lên. */',
-'standard.js' => '/* Mã JavaScript tại đây sẽ được tải khi ngÆ°á»i dùng sá»­ dụng hình dạng Cổ Ä‘iển */',
-'nostalgia.js' => '/* Mã JavaScript tại đây sẽ được tải khi ngÆ°á»i dùng sá»­ dụng hình dạng Vá»ng cổ */',
'cologneblue.js' => '/* Mã JavaScript tại đây sẽ được tải khi ngÆ°á»i dùng sá»­ dụng hình dạng Xanh Cologne */',
'monobook.js' => '/* Mã JavaScript tại đây sẽ được tải khi ngÆ°á»i dùng sá»­ dụng bá» ngoài MonoBook */',
-'myskin.js' => '/* Mã JavaScript tại đây sẽ được tải khi ngÆ°á»i dùng sá»­ dụng bá» ngoài Cá nhân */',
-'chick.js' => '/* Mã JavaScript tại đây sẽ được tải khi ngÆ°á»i dùng sá»­ dụng bá» ngoài Chick */',
-'simple.js' => '/* Mã JavaScript tại đây sẽ được tải khi ngÆ°á»i dùng sá»­ dụng bá» ngoài ÄÆ¡n giản */',
'modern.js' => '/* Mã JavaScript tại đây sẽ được tải khi ngÆ°á»i dùng sá»­ dụng bá» ngoài Hiện đại */',
'vector.js' => '/* Mã JavaScript tại đây sẽ được tải khi ngÆ°á»i dùng sá»­ dụng bá» ngoài VectÆ¡ */',
'group-autoconfirmed.js' => '/* Mã JavaScript tại đây sẽ chỉ được tải cho các thành viên tự động xác nhận */',
@@ -3149,11 +3240,7 @@ Lưu nó vào máy tính của bạn rồi tải nó lên đây.',
'pageinfo-category-files' => 'Số tập tin',
# Skin names
-'skinname-standard' => 'Cổ điển',
-'skinname-nostalgia' => 'Vá»ng cổ',
'skinname-cologneblue' => 'Xanh Cologne',
-'skinname-myskin' => 'Cá nhân',
-'skinname-simple' => 'ÄÆ¡n giản',
'skinname-modern' => 'Hiện đại',
'skinname-vector' => 'Vectơ',
@@ -3238,11 +3325,25 @@ Nếu thá»±c thi nó máy tính của bạn có thể bị tiếm quyá»n.",
'minutes' => '$1 phút',
'hours' => '$1 giá»',
'days' => '$1 ngày',
+'weeks' => '$1 tuần',
'months' => '$1 tháng',
'years' => '$1 năm',
'ago' => 'cách đây $1',
'just-now' => 'hồi nãy',
+# Human-readable timestamps
+'hours-ago' => 'cách đây $1 giá»',
+'minutes-ago' => 'cách đây $1 phút',
+'seconds-ago' => 'cách đây $1 giây',
+'monday-at' => 'Thứ Hai lúc $1',
+'tuesday-at' => 'Thứ Ba lúc $1',
+'wednesday-at' => 'Thứ Tư lúc $1',
+'thursday-at' => 'Thứ Năm lúc $1',
+'friday-at' => 'Thứ Sáu lúc $1',
+'saturday-at' => 'Thứ Bảy lúc $1',
+'sunday-at' => 'Chủ nhật lúc $1',
+'yesterday-at' => 'Hôm qua lúc $1',
+
# Bad image list
'bad_image_list' => 'Äịnh dạng nhÆ° sau:
@@ -3310,7 +3411,7 @@ Những thông tin khác mặc định sẽ được ẩn đi.
* gpslongitude
* gpsaltitude',
-# EXIF tags
+# Exif tags
'exif-imagewidth' => 'Chiá»u ngang',
'exif-imagelength' => 'Chiá»u cao',
'exif-bitspersample' => 'Bit trên mẫu',
@@ -3490,7 +3591,7 @@ Những thông tin khác mặc định sẽ được ẩn đi.
'exif-originalimageheight' => 'Chiá»u cao của hình trÆ°á»›c khi được cắt',
'exif-originalimagewidth' => 'Chiá»u rá»™ng của hình trÆ°á»›c khi được cắt',
-# EXIF attributes
+# Exif attributes
'exif-compression-1' => 'Không nén',
'exif-compression-2' => 'CCITT Nhóm 3: mã hóa thá»i gian chạy Huffman sá»­a má»™t chiá»u',
'exif-compression-3' => 'CCITT Nhóm 3: mã hóa fax',
@@ -3809,7 +3910,6 @@ Xin hãy xác nhận bạn thực sự muốn tạo lại trang này.",
'confirm-unwatch-top' => 'Bạn có muốn gỡ trang này khá»i danh sách theo dõi của bạn?',
# Separators for various lists, etc.
-'autocomment-prefix' => '–&#32;',
'ellipsis' => '…',
# Multipage image navigation
@@ -3946,7 +4046,6 @@ Bạn cÅ©ng có thể [[Special:EditWatchlist|dùng trang sá»­a đổi bình thÆ
'version-other' => 'Phần mở rộng khác',
'version-mediahandlers' => 'Bộ xử lý phương tiện',
'version-hooks' => 'Các hook',
-'version-extension-functions' => 'Hàm mở rộng',
'version-parser-extensiontags' => 'Thẻ mở rộng trong bộ xử lý',
'version-parser-function-hooks' => 'Hook cho hàm cú pháp trong bộ xử lý',
'version-hook-name' => 'Tên hook',
@@ -3955,6 +4054,7 @@ Bạn cÅ©ng có thể [[Special:EditWatchlist|dùng trang sá»­a đổi bình thÆ
'version-license' => 'Giấy phép bản quyá»n',
'version-poweredby-credits' => "Wiki này chạy trên '''[//www.mediawiki.org/ MediaWiki]''', bản quyá»n © 2001–$1 $2.",
'version-poweredby-others' => 'những ngÆ°á»i khác',
+'version-poweredby-translators' => 'các biên dịch viên translatewiki.net',
'version-credits-summary' => 'Chúng tôi muốn công nhận những ngÆ°á»i sau đã đóng góp vào [[Special:Version|MediaWiki]].',
'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.
@@ -3975,12 +4075,17 @@ hoặc [//www.gnu.org/licenses/old-licenses/gpl-2.0.html Ä‘á»c nó trá»±c tuyáº
'version-entrypoints-articlepath' => '[https://www.mediawiki.org/wiki/Manual:$wgArticlePath?uselang=vi ÄÆ°á»ng dẫn bài]',
'version-entrypoints-scriptpath' => '[https://www.mediawiki.org/wiki/Manual:$wgScriptPath?uselang=vi ÄÆ°á»ng dẫn kịch bản]',
-# Special:FilePath
-'filepath' => 'ÄÆ°á»ng dẫn tập tin',
-'filepath-page' => 'Tập tin:',
-'filepath-submit' => 'Hiển thị tập tin',
-'filepath-summary' => 'Trang này cho ra địa chỉ đầy đủ của một tập tin.
-Các hình ảnh được hiển thị ở kích thước tối đa, còn các loại tập tin khác được mở lên ngay trong chương trình mặc định.',
+# Special:Redirect
+'redirect' => 'Äổi hÆ°á»›ng đến tập tin, ngÆ°á»i dùng, hoặc số phiên bản',
+'redirect-legend' => 'Äổi hÆ°á»›ng đến tập tin hoặc trang',
+'redirect-summary' => 'Trang đặc biệt này đổi hướng đến một tập tin (theo tên tập tin được cho vào), trang (theo số phiên bản được cho vào), hoặc trang cá nhân (theo số thành viên).',
+'redirect-submit' => 'Äi',
+'redirect-lookup' => 'Tra cứu:',
+'redirect-value' => 'Giá trị:',
+'redirect-user' => 'Số thành viên',
+'redirect-revision' => 'Phiên bản trang',
+'redirect-file' => 'Tên tập tin',
+'redirect-not-exists' => 'Không tìm thấy giá trị',
# Special:FileDuplicateSearch
'fileduplicatesearch' => 'Tìm kiếm các tập tin trùng lắp',
@@ -4030,12 +4135,16 @@ Các hình ảnh được hiển thị ở kích thước tối đa, còn các l
'tags' => 'Thẻ đánh dấu thay đổi hợp lệ',
'tag-filter' => 'Bá»™ lá»c [[Special:Tags|thẻ]]:',
'tag-filter-submit' => 'Bá»™ lá»c',
+'tag-list-wrapper' => '([[Special:Tags|{{PLURAL:$1}}Thẻ]]: $2)',
'tags-title' => 'Thẻ đánh dấu',
'tags-intro' => 'Trang này liệt kê các thẻ đánh dấu mà phần má»m dùng nó để đánh dấu má»™t sá»­a đổi, và ý nghÄ©a của nó.',
'tags-tag' => 'Tên thẻ',
'tags-display-header' => 'Hiển thị trên danh sách thay đổi',
'tags-description-header' => 'Mô tả ý nghĩa đầy đủ',
+'tags-active-header' => 'Có kích hoạt?',
'tags-hitcount-header' => 'Các thay đổi được ghi thẻ',
+'tags-active-yes' => 'Kích hoạt',
+'tags-active-no' => 'Vô hiệu',
'tags-edit' => 'sá»­a',
'tags-hitcount' => '$1 {{PLURAL:$1|thay đổi|thay đổi}}',
@@ -4056,6 +4165,7 @@ Các hình ảnh được hiển thị ở kích thước tối đa, còn các l
'dberr-problems' => 'Xin lỗi! Trang này đang gặp phải những khó khăn vỠkỹ thuật.',
'dberr-again' => 'Xin thử đợi vài phút rồi tải lại trang.',
'dberr-info' => '(Không thể liên lạc với máy chủ cơ sở dữ liệu: $1)',
+'dberr-info-hidden' => '(Không thể liên lạc với máy chủ cơ sở dữ liệu)',
'dberr-usegoogle' => 'Bạn có thể thử tìm trên Google trong khi chỠđợi.',
'dberr-outofdate' => 'Chú ý rằng các chỉ mục của Google có thể đã lá»—i thá»i.',
'dberr-cachederror' => 'Sau đây là bản sao được lÆ°u bá»™ đệm của trang bạn muốn xem, và có thể đã lá»—i thá»i.',
@@ -4071,6 +4181,9 @@ Các hình ảnh được hiển thị ở kích thước tối đa, còn các l
'htmlform-submit' => 'Äăng',
'htmlform-reset' => 'Hủy các thay đổi',
'htmlform-selectorother-other' => 'Khác',
+'htmlform-no' => 'Không',
+'htmlform-yes' => 'Có',
+'htmlform-chosen-placeholder' => 'Chá»n má»™t tùy chá»n',
# SQLite database support
'sqlite-has-fts' => '$1 với sự hỗ trợ tìm kiếm toàn văn',
@@ -4188,4 +4301,19 @@ Nếu không thì bạn có thể Ä‘iá»n biểu mẫu Ä‘Æ¡n giản ở dÆ°á»›i.
# Image rotation
'rotate-comment' => 'Äã quay hình $1 Ä‘á»™ theo chiá»u kim đồng hồ',
+# Limit report
+'limitreport-title' => 'Dữ liệu hồ sơ bộ phân tích:',
+'limitreport-cputime' => 'Sá»­ dụng thá»i gian CPU',
+'limitreport-cputime-value' => '$1 giây',
+'limitreport-walltime' => 'Sá»­ dụng tức thá»i',
+'limitreport-walltime-value' => '$1 giây',
+'limitreport-ppvisitednodes' => 'Số nút được truy cập bởi bá»™ tiá»n xá»­ lý',
+'limitreport-ppgeneratednodes' => 'Số nút do bá»™ tiá»n xá»­ lý tạo',
+'limitreport-postexpandincludesize' => 'Kích thước bao gồm sau khi bung',
+'limitreport-postexpandincludesize-value' => '$1/$2 byte',
+'limitreport-templateargumentsize' => 'Kích thước đối số bản mẫu',
+'limitreport-templateargumentsize-value' => '$1/$2 byte',
+'limitreport-expansiondepth' => 'Äá»™ sâu bung cao nhất',
+'limitreport-expensivefunctioncount' => 'Số lá»i gá»i hàm cú pháp tốn cần mức Ä‘á»™ xá»­ lý cao',
+
);
diff --git a/languages/messages/MessagesVls.php b/languages/messages/MessagesVls.php
index 9b732f61..44efa56e 100644
--- a/languages/messages/MessagesVls.php
+++ b/languages/messages/MessagesVls.php
@@ -169,9 +169,6 @@ $messages = array(
# Search results
'search-result-size' => '$1 ({{PLURAL:$2|1 woord|$2 woordn}})',
-# Special:Log/newusers
-'newuserlogpage' => 'Logboek nieuwe gebrukers',
-
# Recent changes
'recentchanges' => 'Juste veranderd',
@@ -192,6 +189,9 @@ $messages = array(
'newpages' => 'Nieuwe bloadn',
'newpages-username' => 'Gebrukersnoame:',
+# Special:Log/newusers
+'newuserlogpage' => 'Logboek nieuwe gebrukers',
+
# Watchlist
'mywatchlist' => 'Myn volglyste',
'watch' => 'Volgn',
diff --git a/languages/messages/MessagesVmf.php b/languages/messages/MessagesVmf.php
index e1d44f76..11b0ea30 100644
--- a/languages/messages/MessagesVmf.php
+++ b/languages/messages/MessagesVmf.php
@@ -8,6 +8,7 @@
* @file
*
* @author Altaileopard
+ * @author Bua333
* @author Matma Rex
* @author Midnight Gambler
* @author Silvicola
@@ -82,10 +83,6 @@ $messages = array(
'tog-shownumberswatching' => 'Dii andsôôl dr beoobachdâr ôôdsajchn',
'tog-oldsig' => 'foorschau fon dr agduäln signaduur:',
'tog-fancysig' => 'Signaduur is dhägsd in wighi-sindhags (alsâ ned audomaadisch â lingg)',
-'tog-externaleditor' => 'Schdandardwäässich an ägsdhärnân eedidhâr neemn (nôr for di sich ausghenn, dâdsuu
-mus mr ufm ajchnen rächnâr was ajrichdn gehnn)',
-'tog-externaldiff' => 'Â ägsdhärns Brogram dsum ôôdsjachn fon dâ wärsjoons-undârschiid neemn (nôr fir dii sich
-ausghenn, mr mus dâdsuu ufm ajchnen rächnâr was âjrichdn ghenn)',
'tog-uselivepreview' => 'Schnäl-foorschau benudsn (brauchd JavaScript) (ärschd ân fârsuuch)',
'tog-forceeditsummary' => 'Sich erinärn lasn, wemmâr ghâ dsusamnfasung gschriiwn had',
'tog-watchlisthideown' => 'Ajchne bearbajdungn ned in dr beoobachdungs-lischdn uffiirn',
@@ -107,7 +104,12 @@ ausghenn, mr mus dâdsuu ufm ajchnen rächnâr was âjrichdn ghenn)',
'friday' => 'Freidooch',
'saturday' => 'Samsdooch',
'sun' => 'Su',
+'mon' => 'Mon',
+'tue' => 'Die',
+'wed' => 'Mid',
'thu' => 'Du',
+'fri' => 'Fre',
+'sat' => 'Sam',
'january' => 'Januaar',
'february' => 'Feebruaar',
'march' => 'Märds',
@@ -154,6 +156,7 @@ ausghenn, mr mus dâdsuu ufm ajchnen rächnâr was âjrichdn ghenn)',
'hidden-categories' => '{{PLURAL:$1|Fârschdegde ghadegorii|Fârschdegde ghadegoriin}}',
'category-subcat-count' => 'Di ghadegorii umfasd {{PLURAL:$2|bloos a undâr-ghadegorii|dsam $2 undâr-ghadegoriâ, wofoo {{PLURAL:$1|nôr ôône| $1}}}} undn ôôdsajchd wärn.',
'category-article-count' => 'Di ghadegorii umfasd {{PLURAL:$2|bloos a sajdn|$2 sajdn, wofoo hiir {{PLURAL:$1|aane undn ôôdsajchd wärd|l$1 ôôdsajchd undn wärn}}}}.',
+'category-file-count' => '{{PLURAL:$2|Di Gadegorii umfasd bloos a Dadei.|Di folgende {{PLURAL:$1|Dadei is|$1 Dadein sind}} in der Gadegorii, von insgsamd $2 Dadein anzeichd.}}',
'listingcontinuesabbrev' => '(Fôrdsedsung)',
'noindex-category' => 'Seidn, wou net indexierd sin',
@@ -224,7 +227,7 @@ ausghenn, mr mus dâdsuu ufm ajchnen rächnâr was âjrichdn ghenn)',
'articlepage' => "D'inhalds-sajdn dsajchn",
'talk' => 'Disghusjoon',
'views' => 'Ôôsichdn',
-'toolbox' => 'Werchdsajch-ghisdn',
+'toolbox' => 'Werchdsajch',
'userpage' => "D'benudsârsajdn dsajchn",
'projectpage' => "D'brojägdsajdn dsjachn",
'imagepage' => "D'dadhaj-sajdn dsajchn",
@@ -247,7 +250,7 @@ sajdn ham woln. Ward n'bôôr minuudn un brobiir's dan nochâmôôl.
$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).
+# 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).
'aboutsite' => 'Was {{SITENAME}} is',
'aboutpage' => 'Project:Iibär',
'copyright' => 'Was hiir schdäd däfmâr benudsn nach $1',
@@ -257,7 +260,6 @@ $1",
'disclaimers' => 'Imbräsum',
'disclaimerpage' => 'Project:Imbräsum',
'edithelp' => 'Hilfe dsum beärbâdn',
-'edithelppage' => 'Help:Beärbâdn',
'helppage' => 'Help:Inhalds-fârdsajchnis',
'mainpage' => 'Haubdsajdn',
'mainpage-description' => 'Haubdsajdn',
@@ -322,16 +324,6 @@ S'ghend aa â brogramiirfäälâr in dr sofdwäâr sâj, dii baj {{SITENAME}} le
# General errors
'error' => 'Feelâr',
'databaseerror' => 'Feelâr fon dr Daadnbangg',
-'dberrortext' => 'Bam abfrôôchn fon dr daadnbangg is was schiif gangn.
-Filajchd weechn am brogramiir-feelâr?
-Jeednfals wôôr di ledsd abfrôôchn:
-<blockquote><tt>$1</tt></blockquote>
-aus dr fungdsjoon „<tt>$2</tt>“.
-Un dôôdruf had dan di daadnbangg den feelâr „<tt>$3: $4</tt>“ gmeld.',
-'dberrortextcl' => 'Dii daadnbangg-abfrôôchn wôôr falsch gschriiwn.
-Di abfrôôchn wôôr neemlich
-<blockquote><tt>$1</tt></blockquote>
-aus dr fungdsjoon "<tt>$2</tt>". Un dôôdruf had dan di daadnbangg den feelâr „$3: $4“ gmeld.',
'laggedslavemode' => "'''Achdung:''' Filajchd dsajchd dii sajdn noch ned ales, was indswischn gändârd wôrn is.",
'readonly' => 'Di daadnbangg is gschbärd.',
'enterlockreason' => 'Bide schrajb, wisoo dii daadnbangg gschbärd wärn sol, un wi lang des dan dauârn mechd.',
@@ -351,7 +343,8 @@ 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 (for a maximum of $1 {{PLURAL:$1|day|days}})',
+'yourpasswordagain' => 'Bassworrd widderhulln:',
+'remembermypassword' => 'Miid den Brauser dauerhafd ogmeld bleim (maximal $1 {{PLURAL:$1|Dooch|Dooch}})',
'login' => 'Ôômeldn',
'nav-login-createaccount' => 'Oomeldn / Ghondoo ooleeng',
'loginprompt' => 'Zum Omelldn mäin Guggies agdivierd sei.',
@@ -360,7 +353,10 @@ Wen's des ned is, bisd womeeglich iwa ân feela in dr sofdwäâr gschdolbäd. In
'userlogout' => 'Abmeldn',
'nologin' => 'Du hast ka Nutzergonto? $1',
'nologinlink' => 'Sich als najâr Ôôgmeldâr ôômäldn',
+'createaccount' => 'Nutzergonto olegn',
+'gotaccount' => 'Du host scho a Benudtzergondo? $1',
'gotaccountlink' => 'Omeldn',
+'userlogin-resetlink' => 'Omeldedadn vergessn?',
'mailmypassword' => 'Â najs passwôrd iwâr iimejl dsuschign lasn',
'loginlanguagelabel' => 'Sproch: $1',
@@ -421,7 +417,8 @@ Wen'D dich awâr hiirhäär bloos fârlaafn hasd, glig ââfach af '''Zurück'''
'noarticletext' => 'Dii sajdn gibd\'s bis eds no ned.
Duu ghâusch nach däm ausdrug aa [[Special:Search/{{PAGENAME}}|in alle sajdn suchng]],
<span class="plainlinks"> [{{fullurl:{{#special:Log}}|page={{FULLPAGENAMEE}}}} in di dsugheerichng log-biichâr suchng] odâr dii sajdn [{{fullurl:{{FULLPAGENAME}}|action=edit}} ôôleeng un najschrajm]</span>.',
-'previewnote' => "'''Hiir siggsd bloos, wii's wärn dääd, dii sajdn is ôbâr no ned gschbaichärd!'''",
+'noarticletext-nopermission' => 'Däi Seidn endhäld momendan nu kan Dexd, [[Special:Search/{{PAGENAME}}|Du derfsd däi Seidn a net derschdelln]].',
+'previewnote' => "'''Des is blouss a Vuurschau.''' Däi Seidn is nu net gschbeicherd worrn.",
'editing' => 'Beärbâdn fon $1',
'editingsection' => 'Beärwâdn fo $1 (bloos abschnid)',
'copyrightwarning' => "''Ghobhiir jôô ghâ web-sajdn, dii där ned ghärn, un benuds ghâ uurheewarrechdlich gschidsde wärgghe oone geneemichung fom uurheewâr!'''<br />
@@ -433,15 +430,24 @@ Hirmid sagsd, das Du den dhägsd '''selbâr gschriim''' hasd, das däär dhägsd
'template-semiprotected' => '(ned ôôgmeldede un naje benudsär däfn hiir ned schrajm)',
'hiddencategories' => 'Dii sajdn ghäärd dsu {{PLURAL:$1|aanâr fârschdegdn|$1 fârschdegde}} ghadegoriin:',
'permissionserrorstext-withaction' => 'Du däfsd ned $2, des{{PLURAL:$1||}}dâsweechn:',
+'recreate-moveddeleted-warn' => "'''Achdung: Du derschdellsd a Seidn, däi wou bereids fräiers glöschd worrn is.'''
+
+Bidde dou sorgfälldig ieberbriefen, ob die erneide Seidnderschdellung die Richdlinien endschbrechn doud.
+
+Zu deiner Informadion folchd des Lösch- un Verschäibungs-Logbuch miid der Begrindung vo der vuurherichen Löschung:",
+'moveddeleted-notice' => 'Däi Seidn is glöschd worrn. Zur Informadion folchds Lösch- un Verschäibungslogbuch vo dera Seidn.',
# Parser/template warnings
'post-expand-template-inclusion-warning' => "'''Wannung''': Däi Gräiss vo eibundne Vuurloong is zu grouss, einiche Vuurloong könna net eibundn werrn.",
'post-expand-template-inclusion-category' => 'Seidn, in dena wou däi maximale Gräiss vo eibundne Vuurloong ieberschriddn is.',
+'post-expand-template-argument-warning' => "'''Wannung:''' Däi Seidn endhäld mindesdens an Barameder in anner Vuurlooch, der wou exbandierd zu grouß is.",
+'post-expand-template-argument-category' => 'Seidn miid ignorierde Vuurloongbarameder',
# History pages
'viewpagelogs' => 'Logbicher fär dii sajdn dsajchn',
'currentrev-asof' => 'Jedsiche wärsjoon, am $2 um $3 gmachd',
'revisionasof' => 'Wärsjoon fom $2 um $3 Uur',
+'revision-info' => 'Version vom $1 Uhr von $2',
'previousrevision' => '↠wärsjoon dâfoor',
'nextrevision' => 'Nägsdnajâre wärsjoon →',
'currentrevisionlink' => 'Geechnwärdiche wärsjoon',
@@ -451,9 +457,13 @@ Hirmid sagsd, das Du den dhägsd '''selbâr gschriim''' hasd, das däär dhägsd
* '''({{int:cur}})''' = undârschiid dsur geechnwärdichn wärsjoon, '''({{int:last}})''' = undârschiid dsur foorichn wärsjoon
* Uurdsajd/Daadum = wärsjoon dsu dära dsajd, '''{{int:minoreditletter}}''' = glane ändärung.",
'history-fieldset-title' => 'Suchng in där wärsjoonsfolche',
+'history-show-deleted' => 'Blouss glöschde Versiona zeing',
'histfirst' => 'älldsde',
'histlast' => 'neisde',
+# Revision feed
+'history-feed-item-nocomment' => '$1 bis $2',
+
# Revision deletion
'rev-delundel' => 'ôôdsajng/fârbärng',
'revdel-restore' => 'Ändârn, was oodsajchd wäd',
@@ -464,10 +474,11 @@ Hirmid sagsd, das Du den dhägsd '''selbâr gschriim''' hasd, das däär dhägsd
'revertmerge' => 'Dsrig fôr dii fârajnichung',
# Diffs
-'history-title' => 'Wärsjoonsfolche fo „$1“',
+'history-title' => '$1: Versionsgschichd',
'lineno' => 'Dsajln $1:',
'compareselectedversions' => 'Ausgwäälde wärsjoona fârglajchn',
'editundo' => 'riggängich machng',
+'diff-multi' => '({{PLURAL:$1|A dazwischaliengde Version|$1 dazwischaliengde Versiona}} von {{PLURAL:$2|am Nutzer|$2 Nutzern}} {{PLURAL:$1|wird|werrn}} ned ozeichd)',
# Search results
'searchresults' => 'Bam suchng gfundne sachng',
@@ -480,8 +491,10 @@ Hirmid sagsd, das Du den dhägsd '''selbâr gschriim''' hasd, das däär dhägsd
'prevn' => '{{PLURAL:$1|foorichâr|fooriche $1}}',
'nextn' => '{{PLURAL:$1|nägschdâr|nägschde $1}}',
'prevn-title' => '{{PLURAL:$1|Vuurherichs Ergebnis|Vuurheriche $1 Ergebniss}}',
+'nextn-title' => '{{PLURAL:$1|Folngnds Ergebnis|Folngnde $1 Ergebniss}}',
'shown-title' => 'Zeich mer $1 {{PLURAL:$1|Ergebnis|Ergebniss}} bro Seidn',
'viewprevnext' => 'Dsajch ($1 {{int:pipe-separator}} $2) ($3)',
+'searchmenu-exists' => "'''Es gidd a Seidn, däi wou´n Nooma „[[:$1]]“ hodd.'''",
'searchmenu-new' => "'''Derschdell dai Seidn „[[:$1]]“ in diesn Wigi.'''",
'searchprofile-articles' => 'Inhaldsseidn',
'searchprofile-project' => 'Hilf- un Brojegdseidn',
@@ -494,6 +507,7 @@ Hirmid sagsd, das Du den dhägsd '''selbâr gschriim''' hasd, das däär dhägsd
'searchprofile-everything-tooltip' => 'Gsamdn Inhald durchsoung (aa Disgussionsseidn)',
'searchprofile-advanced-tooltip' => 'Soung in weidere Namensraim',
'search-result-size' => '$1 ({{PLURAL:$2|1 wôrd|$2 wärdâr}})',
+'search-result-category-size' => '{{PLURAL:$1|1 Seidn|$1 Seidn}} ({{PLURAL:$2|1 Untergadegorii|$2 Untergadegoriin}}, {{PLURAL:$3|1 Dadei|$3 Dadein}})',
'search-result-score' => 'Âjschleechich: $1 %',
'search-redirect' => '(Wajdalajdung fon „$1“ häa)',
'search-section' => '(Abschnid $1)',
@@ -522,14 +536,6 @@ Hirmid sagsd, das Du den dhägsd '''selbâr gschriim''' hasd, das däär dhägsd
'search-external' => 'Ägsdärne suach',
'searchdisabled' => 'Diâ {{SITENAME}}-suâch ist ausgschald. Duu ghâusch so lang mid Google suâchn. Dengg drâu, des was mr dôô fir {{SITENAME}} find, ghâu iwârhoold saj.',
-# Quickbar
-'qbsettings' => 'Sajdn-lajsdn',
-'qbsettings-none' => 'Ghane',
-'qbsettings-fixedleft' => 'Lings, feschd',
-'qbsettings-fixedright' => 'Rächds, feschd',
-'qbsettings-floatingleft' => 'Lings, schwääbnd',
-'qbsettings-floatingright' => 'Rächds, schwääbnd',
-
# Preferences page
'preferences' => 'ajschdelunga',
'mypreferences' => 'Ajschdelunga',
@@ -557,7 +563,6 @@ Hirmid sagsd, das Du den dhägsd '''selbâr gschriim''' hasd, das däär dhägsd
'resetprefs' => 'Nigs iwârneemn',
'restoreprefs' => 'Uf dii uur-ajschdelungn dsrig',
'prefs-editing' => 'Bearbajdungs-fenschdâr',
-'prefs-edit-boxsize' => 'Grees fom bearbajdungs-fenschdâr:',
'rows' => 'Soofiil dsajln:',
'columns' => 'Soofiil schbaldn',
'searchresultshead' => 'Suuchn',
@@ -584,6 +589,8 @@ Hirmid sagsd, das Du den dhägsd '''selbâr gschriim''' hasd, das däär dhägsd
'allowemail' => 'Iimejl-embfang fon andrâ ôôschdeln',
'youremail' => 'E-mail:',
'yourrealname' => 'Bürcherlicher Noma:',
+'prefs-help-email' => 'Des Ogeem vo anner E-Mail-Adressn is obdional, ermöglichd obber däi Zusendung vo an Ersatzbassworrd, wennsd dei Bassworrd vergessn hosd.',
+'prefs-help-email-others' => 'Miid andre Benutzer koost a iber däi Benutzerdisgussionsseidn Kondagd afneha, ohne dass dei Idendidäd offenleeng moussd.',
# Groups
'group-sysop' => 'Adminisdradoorn',
@@ -604,13 +611,18 @@ Hirmid sagsd, das Du den dhägsd '''selbâr gschriim''' hasd, das däär dhägsd
'recentchanges' => 'ledsde änderunga',
'recentchanges-legend' => 'Âjschdelunga, wii di ledsdn ändrunga dsajchd wärn solln',
'recentchanges-feed-description' => 'Fârfolch mid dem Fiid dii ledsdn ändrungn in {{SITENAME}}.',
+'recentchanges-label-newpage' => 'Neie Seidn',
'recentchanges-label-minor' => 'Blos a weng wôs is gändârd wôrn',
+'recentchanges-label-bot' => 'Ändrung durch an Bot',
+'recentchanges-label-unpatrolled' => 'Net-kondrollierde Ändrung',
'rcnote' => "Des {{Plural:$1|is dii aane ändrung|sin dii '''$1''' ändrunga}}, dii in di {{Plural:$2|ledsdn 24 schdundn|ledsdn '''$2''' doochn}} gmachd wôrn {{Plural:$1|is|sin}}. Schdand is fom $4, $5 uur.",
+'rcnotefrom' => "Oozeichd werrn däi Ändrunga seid '''$2''' (max. '''$1''' Eidrääch).",
'rclistfrom' => 'Bloos di ändrunga dsajchn sajd $1',
'rcshowhideminor' => 'Glenâre Ändrungn $1',
'rcshowhidebots' => 'Bods (bearbajdâr, dii ajchendlich brograme san) $1',
'rcshowhideliu' => 'Ôôgmäldâde bearbajdâr $1',
'rcshowhideanons' => '$1 uuôôgmäldâde bearbajdâr',
+'rcshowhidepatr' => 'Gondrollierde Ändrunga $1',
'rcshowhidemine' => 'Ajchne bajdrääch $1',
'rclinks' => 'Dsajch dii ledsdn $1 ändrunga fo di ledsdn $2 dooch.<br />$3',
'diff' => 'undârschiid',
@@ -620,7 +632,7 @@ Hirmid sagsd, das Du den dhägsd '''selbâr gschriim''' hasd, das däär dhägsd
'minoreditletter' => 'g',
'newpageletter' => 'N',
'boteditletter' => 'B',
-'rc-enhanced-expand' => 'Ajndslhajdn ôôdsajchn (gäd bloos mid JavaScript)',
+'rc-enhanced-expand' => 'Eindslheidn oodseichn (gäd bloos mid JavaScript)',
'rc-enhanced-hide' => 'Glaanichghajdn ned dsajng',
# Recent changes linked
@@ -638,11 +650,13 @@ Hirmid sagsd, das Du den dhägsd '''selbâr gschriim''' hasd, das däär dhägsd
'uploadedimage' => 'had „[[$1]]“ naufglôôdn',
'license' => 'Lizenz',
+'license-header' => 'Lizenz',
# File description page
'file-anchor-link' => 'Daddei',
'filehist' => 'Wärsjoona bis eds',
'filehist-help' => 'Glig af ân dsajdbhungd, um dii dôômôôliche fasung ôôdsuschaua',
+'filehist-revert' => 'zricksedzn',
'filehist-current' => 'agduäl',
'filehist-datetime' => 'Âjschdlungs-daadum un -dsajd',
'filehist-thumb' => 'Schbigbildlâ',
@@ -676,6 +690,7 @@ S'gajd awâr aa â [[Special:WhatLinksHere/$2|lisdn mid alâ fârwajs]].",
'ncategories' => '$1 {{PLURAL:$1|GhadegoriiGhadegoriin}}',
'nmembers' => '{{PLURAL:$1|1 âjdrôôch|$1 âjdrääch}}',
'prefixindex' => 'Ale sajdn mid brääfigs',
+'usercreated' => '{{GENDER:$3|Ersschdelld}} am $1 um $2 Uhr',
'newpages' => 'Naje sajdn',
'move' => 'Umdaafn',
'movethispage' => 'Sajdn umdaafn',
@@ -704,6 +719,7 @@ S'gajd awâr aa â [[Special:WhatLinksHere/$2|lisdn mid alâ fârwajs]].",
# Special:LinkSearch
'linksearch' => 'Linggs nach ausârhalb',
+'linksearch-line' => '$1 is verlingt vo $2',
# Special:ListGroupRights
'listgrouprights-members' => '(Lisdn fon dâ midgliidâr)',
@@ -714,6 +730,7 @@ S'gajd awâr aa â [[Special:WhatLinksHere/$2|lisdn mid alâ fârwajs]].",
# Watchlist
'watchlist' => 'Beoobachdungslisdn',
'mywatchlist' => 'Beoobachdungslisdn',
+'watchlistfor2' => 'Fär $1 ($2)',
'addedwatchtext' => "Di sajdn „[[:$1]]“ schdäd eds mid af dajnâr [[Special:Watchlist|beoobachdungs-lisdn]] .
Wen sich af der sajdn oda iirâr disghusjoons-sajdn was duud, wärd se ab eds
@@ -736,6 +753,7 @@ Wenns'd dii sajdn irchendwan amôl nimä fârfolchn wilsd, musd bloos af „{{in
'deletepage' => 'Sajdn leschn',
'confirmdeletetext' => "Duu bisd grôd dâbaj, â sajdn midsamd alle dsugheeriche alde wärsjoona ds'leschn. Bide beschdäädich, das De wasd, was des als bewirgd, un das De Dich dâbaj aa an d'[[{{MediaWiki:Policy-url}}|richliinjen]] fo dem wighi hiir häldsd.",
'actioncomplete' => 'Erleedichd',
+'actionfailed' => 'Agdsion fehlgschloong',
'deletedtext' => '„$1“ is gleschd wôrn. Im $2 findsd â lisdn mid dâ ledsdn leschunga.',
'dellogpage' => 'Logbuch fo di leschunga',
'deletecomment' => 'Grund:',
@@ -787,10 +805,10 @@ Wenns'd dii sajdn irchendwan amôl nimä fârfolchn wilsd, musd bloos af „{{in
'blanknamespace' => '(Sajdn)',
# Contributions
-'contributions' => 'Ajchne bajdrääch',
+'contributions' => 'Eichne Beidrääch',
'contributions-title' => 'Bajdrääch fo „$1“',
'mycontris' => 'Bajdreech',
-'contribsub2' => 'Fär $1 ($2)',
+'contribsub2' => 'Von {{GENDER:$3|$1}} ($2)',
'uctop' => '(agduell)',
'month' => 'bis moonad:',
'year' => 'bis dsum jôôr:',
@@ -802,6 +820,7 @@ Wenns'd dii sajdn irchendwan amôl nimä fârfolchn wilsd, musd bloos af „{{in
'sp-contributions-talk' => 'Disgussion',
'sp-contributions-search' => 'Bajdreech suchng',
'sp-contributions-username' => 'IP-adresn odär nôômâ fom Ôôgmeldn:',
+'sp-contributions-toponly' => 'Blouss agduelle Versiona zeing',
'sp-contributions-submit' => 'Suchng',
# What links here
@@ -809,6 +828,7 @@ Wenns'd dii sajdn irchendwan amôl nimä fârfolchn wilsd, musd bloos af „{{in
'whatlinkshere-title' => 'Sajdn, di af „$1“ fârwajsn',
'whatlinkshere-page' => 'Sajdn:',
'linkshere' => "Dii afgfiirdn sajdn fârwajsn af ''„[[:$1]]“''':",
+'nolinkshere' => "Ka Seidn verlingt af '''„[[:$1]]“'''.",
'isredirect' => 'Wajdârlajdungssajdn',
'istemplate' => 'Foorlaachn-ajbindung',
'isimage' => 'Daddeilink',
@@ -818,7 +838,7 @@ Wenns'd dii sajdn irchendwan amôl nimä fârfolchn wilsd, musd bloos af „{{in
'whatlinkshere-hideredirs' => '$1 wajdârlajdungn',
'whatlinkshere-hidetrans' => '$1 Foorlaachn-ajbindunga',
'whatlinkshere-hidelinks' => '$1 Fârwajse',
-'whatlinkshere-hideimages' => '$1 Bild-fârwajse',
+'whatlinkshere-hideimages' => 'Daddeilings $1',
'whatlinkshere-filters' => 'Fildhâr',
# Block/unblock
@@ -874,6 +894,7 @@ Schrajb bide den '''naja'' nôômâ fo dâr sajdn undârals '''Dsiil'' nâj un '
# Thumbnails
'thumbnail-more' => 'Grässär machng',
+'thumbnail_error' => 'Fehler beim Derschdelln von Vuurschaubilld: $1',
# Tooltip help for the actions
'tooltip-pt-userpage' => 'Daj benudsâr-sajdn',
@@ -939,17 +960,11 @@ Bidde gug's mi´m foorschau-gnobf ôô fôrm schbajchan",
# Stylesheets
'common.css' => '/* CSS hiir beâjflusd ale schelfn */',
-'standard.css' => "/* CSS hiir beâjflusd nôr dii Klassik-schelfn. Wen'd ale uf ôômôôl beâjflusn wilsch, muâsch an [[MediaWiki:Common.css]] was ändârn. */",
-'nostalgia.css' => "/* CSS hiir beâjflusd nôr dii Nostalgia-schelfn. Wen'd ale uf ôômôôl beâjflusn wilsch, muâsch an MediaWiki:Common.css was ändârn. */",
'cologneblue.css' => "/* CSS hiir beâjflusd nôr dii Kölnisch-Blau-schelfn. Wen'd ale uf ôômôôl beâjflusn wilsch, muâsch an MediaWiki:Common.css was ändârn. */",
'monobook.css' => "/* CSS hiir beâjflusd nôr dii Monobook-schelfn. Wen'd ale uf ôômôôl beâjflusn wilsch, muâsch an MediaWiki:Common.css was ändârn. */",
-'myskin.css' => "/* CSS hiir beâjflusd nôr dii MySkin-schelfn. Wen'd ale uf ôômôôl beâjflusn wilsch, muâsch an MediaWiki:Common.css was ändârn. */",
-'chick.css' => "/* CSS hiir beâjflusd nôr dii Küken-schelfn. Wen'd ale uf ôômôôl beâjflusn wilsch, muâsch an MediaWiki:Common.css was ändârn. */",
-'simple.css' => "/* CSS hiir beâjflusd nôr dii Simple-schelfn. Wen'd ale uf ôômôôl beâjflusn wilsch, muâsch an MediaWiki:Common.css was ändârn. */",
'modern.css' => "/* CSS hiir beâjflusd nôr dii Modern-schelfn. Wen'd ale uf ôômôôl beâjflusn wilsch, muâsch an MediaWiki:Common.css was ändârn. */",
'vector.css' => "/* CSS hiir beâjflusd nôr dii Vector-schelfn. Wen'd ale uf ôômôôl beâjflusn wilsch, muâsch an MediaWiki:Common.css was ändârn. */",
'print.css' => '/* CSS hiir beâjflusd nôr dii drugausgaawe. */',
-'handheld.css' => '/* CSS hiir beâjflusd nôr dii handgerääde, jee nachdeem, welche schelfn in $wgHandheldStyle âjgeschdeld is. */',
# Scripts
'common.js' => '/* Des folchende JavaScript wird fir ale benudsâr glôôdn un fir ale sajdn, dii se ôôgugn. */',
@@ -989,7 +1004,7 @@ Bloos dsajln, dii mi´m dsajchn * ôôfanga, wärn berigsichdichd. Un dä ärsc
* gpslongitude
* gpsaltitude',
-# EXIF tags
+# Exif tags
'exif-imagewidth' => 'brajdn',
'exif-imagelength' => 'Heen',
@@ -1007,7 +1022,23 @@ Bloos dsajln, dii mi´m dsajchn * ôôfanga, wärn berigsichdichd. Un dä ärsc
'watchlisttools-edit' => 'Beobachdungslisdn dsajchn un ändârn',
'watchlisttools-raw' => "In där beoobachdungslisdn ds'fuâs rumworschdln",
+# Core parser functions
+'duplicate-defaultsort' => 'Der Sordierungsschlissl „$2“ ieberschreibt den vuurher verwendten Schlissl „$1“.',
+
# Special:SpecialPages
'specialpages' => 'Schbedsjaal-sajdn',
+# External image whitelist
+'external_image_whitelist' => ' # Däi Zeiln net verändern.<pre>
+# Undnstehnd könna Fragmende vo reguläre Asdrigg (der Deil zwischa die //) eigeem werrn.
+# Däi werrn miid die URLs vo Bilder aus egsderne Gwelln verglichng.
+# A bositiver Vergleich fiehrt zur Ozeich vom Bild, sunsd werrds Bild blouss als Link ozeichd.
+# Zeiln, däi wou miid an # ofanga, werrn als Gommendar behandld.
+# Zwischa Grouß- un Klaaschreibung werrd net underschiedn.
+
+# Fragmende vo reguläre Asdrigg nach dera Zeiln eidroong. Däi Zeiln net verändern.</pre>',
+
+# Special:Tags
+'tag-filter' => '[[Special:Tags|Marrgierungs]]-Fillder:',
+
);
diff --git a/languages/messages/MessagesVo.php b/languages/messages/MessagesVo.php
index 05a4c2f4..b638e4a8 100644
--- a/languages/messages/MessagesVo.php
+++ b/languages/messages/MessagesVo.php
@@ -143,9 +143,6 @@ $messages = array(
'tog-shownumberswatching' => 'Jonön numi gebanas galädöl',
'tog-oldsig' => 'Dispenäd dabinöl:',
'tog-fancysig' => 'Dispenäd balugik (nen yüms lü gebanapad)',
-'tog-externaleditor' => 'Gebön nomiko redakömi plödik (te pro jäfüdisevans; paramets patik paneodons su nünöm olik)',
-'tog-externaldiff' => 'Gebön nomiko difi plödik (te pro jäfüdisevans; paramets patik paneodons su nünöm olik)',
-'tog-showjumplinks' => 'Dälön lügolovi me yüms „lübunöl“',
'tog-uselivepreview' => 'Gebön büologedi itjäfidik (sperimäntik)',
'tog-forceeditsummary' => 'Sagön obe, ven redakaplän brefik vagon',
'tog-watchlisthideown' => 'Klänedön redakamis obik se galädalised',
@@ -217,6 +214,18 @@ $messages = array(
'oct' => 'tob',
'nov' => 'nov',
'dec' => 'dek',
+'january-date' => 'yanul $1',
+'february-date' => 'febul $1',
+'march-date' => 'mäzul $1',
+'april-date' => 'prilul $1',
+'may-date' => 'mayul $1',
+'june-date' => 'yunul $1',
+'july-date' => 'yulul $1',
+'august-date' => 'gustul $1',
+'september-date' => 'setul $1',
+'october-date' => 'tobul $1',
+'november-date' => 'novul $1',
+'december-date' => 'dekul $1',
# Categories related messages
'pagecategories' => '{{PLURAL:$1|Klad|Klads}}',
@@ -293,6 +302,7 @@ $messages = array(
'create-this-page' => 'Jafön padi at',
'delete' => 'Moükön',
'deletethispage' => 'Moükolös padi at',
+'undeletethispage' => 'Sämoükön padi at',
'undelete_short' => 'Sädunön moükami {{PLURAL:$1|redakama bal|redakamas $1}}',
'viewdeleted_short' => 'Logön {{PLURAL:$1|redakami pemoüköl bal|redakamis pemoüköls $1}}',
'protect' => 'Jelön',
@@ -329,7 +339,7 @@ $messages = array(
'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).
+# 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).
'aboutsite' => 'Tefü {{SITENAME}}',
'aboutpage' => 'Project:Tefü',
'copyright' => 'Ninäd gebidon ma el $1.',
@@ -339,7 +349,6 @@ $messages = array(
'disclaimers' => 'Nuneds',
'disclaimerpage' => 'Project:Gididimiedükam valemik',
'edithelp' => 'Redakamayuf',
-'edithelppage' => 'Help:Redakam',
'helppage' => 'Help:Ninäd',
'mainpage' => 'Cifapad',
'mainpage-description' => 'Cifapad',
@@ -410,17 +419,7 @@ Mögos i, das atos sinifon, das dabinon säkädil pö program fa {{SITENAME}} pa
# General errors
'error' => 'Pöl',
'databaseerror' => 'Pöl in nünodem',
-'dberrortext' => 'Süntagapök pö geb vüka at ejenon.
-Atos ba sinifön, das dabinon säkäd pö program.
-Steifül lätik ad gebön vüki äbinon:
-<blockquote><code>$1</code></blockquote>
-se dunod: „<code>$2</code>“.
-Nünodem ägesedon pökanuni: „<samp>$3: $4</samp>“.',
-'dberrortextcl' => 'Süntagapök pö geb vüka at ejenon.
-Steifül lätik ad gebön vüki at äbinon:
-„$1“
-se dunod: „$2“.
-Nünodem ägesedon pökanuni: „$3: $4“',
+'databaseerror-error' => 'Pöl: $1',
'laggedslavemode' => 'Nuned: pad ba labon votükamis brefabüik',
'readonly' => 'Vük pefärmükon',
'enterlockreason' => 'Penolös kodi löka, keninükamü täxet dula onik e dela, kü pomoükon',
@@ -468,7 +467,6 @@ Beg: $2',
'editinginterface' => "'''Nuned:''' redakol padi, kel labükon vödemis bevüik pro programem.
Votükams pada at oflunons logoti gebanasita pro gebans votik.
Ad läükön u votükön tradutodis pro els wiki valik, demolös gebi ela [//translatewiki.net/?setlang=vo translatewiki.net]: topükamaproyeg ela MediaWiki.",
-'sqlhidden' => '(SQL beg peklänedon)',
'cascadeprotected' => 'Pad at pejelon ta redakam, bi pakeninükon fa {{PLURAL:$1|pad|pads}} sököl, kels pejelons ma „jänajel“: $2',
'namespaceprotected' => "No dalol redakön padis in nemaspad: '''$1'''.",
'ns-specialprotected' => 'Pads patik no kanons paredakön.',
@@ -488,9 +486,17 @@ Kanol laigebön {{SITENAME}} nennemiko, u kanol <span class='plainlinks'>[$1 nun
Küpälolös, das pads anik ba nog pojenons äsva no esenunädol oli, jüs uklinükol memi no laidüpik bevüresodanaföma olik.",
'welcomeuser' => 'Benokömö, o $1!',
'yourname' => 'Gebananem:',
+'userlogin-yourname' => 'Gebananem',
+'userlogin-yourname-ph' => 'Penolös gebananemi olik',
'yourpassword' => 'Letavöd:',
+'userlogin-yourpassword' => 'Letavöd',
+'userlogin-yourpassword-ph' => 'Penolös letavödi olik',
+'createacct-yourpassword-ph' => 'Penolös letavödi',
'yourpasswordagain' => 'Klavolös dönu letavödi:',
+'createacct-yourpasswordagain' => 'Fümedolös letavödi',
+'createacct-yourpasswordagain-ph' => 'Penolös letavödi dönu',
'remembermypassword' => 'Dakipolöd ninädamanünis obik in nünöm at (muiko {{PLURAL:$1|del|dels}} $1)',
+'userlogin-remembermypassword' => 'Dakipön obi penunädöl',
'yourdomainname' => 'Domen olik:',
'password-change-forbidden' => 'No kanol votükön letavödis su el wiki at.',
'externaldberror' => 'U ejenon fümükamapöl plödik nünödema, u no dalol atimükön kali plödik ola.',
@@ -502,14 +508,25 @@ Küpälolös, das pads anik ba nog pojenons äsva no esenunädol oli, jüs uklin
'logout' => 'Senunädön oki',
'userlogout' => 'Senunädön oki',
'notloggedin' => 'No enunädol oli',
+'userlogin-noaccount' => 'No labol-li kali?',
+'userlogin-joinproject' => 'Sogolös oki lä {{SITENAME}}',
'nologin' => 'No labol-li kali? $1.',
'nologinlink' => 'Jafolös bali',
'createaccount' => 'Jafön kali',
'gotaccount' => "Ya labol-li kali? '''$1'''.",
'gotaccountlink' => 'Nunädolös obi',
'userlogin-resetlink' => 'Eglömol-li nünis kala olik?',
+'userlogin-resetpassword-link' => 'Dönuvälön letavödi olik',
+'helplogin-url' => 'Help:Nunädön',
+'userlogin-helplink' => '[[{{MediaWiki:helplogin-url}}|Yuf ad nunädön]]',
+'createacct-join' => 'Penolös nünis olik dono.',
+'createacct-emailrequired' => 'Ladet leäktronik',
'createaccountmail' => 'me pot leäktronik',
'createaccountreason' => 'Kod:',
+'createacct-reason' => 'Kod',
+'createacct-submit' => 'Jafön kali olik',
+'createacct-benefit-body1' => '{{PLURAL:$1|redakam|redakams}}',
+'createacct-benefit-body2' => '{{PLURAL:$1|pad|pads}}',
'badretype' => 'Letavöds fa ol pepenöls no leigons.',
'userexists' => 'Gebananem at ya pagebon.
Välolös, begö! nemi votik.',
@@ -568,7 +585,7 @@ Stebedolös büä osteifülol nogna.',
'newpassword' => 'Letavöd nulik:',
'retypenew' => 'Klavolöd dönu letavödi nulik:',
'resetpass_submit' => 'Välön letavödi e nunädön omi',
-'resetpass_success' => 'Letavöd olik pevotükon benosekiko! Anu sit nunädon oli...',
+'changepassword-success' => 'Letavöd olik pevotükon benosekiko!',
'resetpass_forbidden' => 'Letavöds no kanons pavotükön',
'resetpass-no-info' => 'Mutol nunädön oli ad logön padi at nemediko.',
'resetpass-submit-loggedin' => 'Votükön letavödi',
@@ -762,6 +779,7 @@ No enunon kodi.',
Jiniko pemoükon.',
'edit-conflict' => 'Redakamakonflit.',
'edit-no-change' => 'Redakam olik penedemon, bi vödemivotükams nonik pedunons.',
+'postedit-confirmation' => 'Redakam olik pedakipolon.',
'edit-already-exists' => 'No kanoy jafön padi nulik.
On ya dabinon.',
@@ -935,7 +953,6 @@ Kontrololös, va votükam at okipon fovöfi padajenotema.',
'searchmenu-legend' => 'Sukaparamets',
'searchmenu-exists' => "'''Dabinon pad labü nem: \"[[:\$1]]\" su vük at'''",
'searchmenu-new' => "'''Jafolös padi: \"[[:\$1]]\" su vük at!'''",
-'searchhelp-url' => 'Help:Ninäd',
'searchmenu-prefix' => '[[Special:PrefixIndex/$1|Logön padis labü foyümot at]]',
'searchprofile-articles' => 'Ninädapads',
'searchprofile-project' => 'Yufa e Proyegapads',
@@ -977,14 +994,6 @@ Kontrololös, va votükam at okipon fovöfi padajenotema.',
'search-external' => 'Suk plödik',
'searchdisabled' => 'Suk in {{SITENAME}} penemogükon. Vütimo kanol sukön yufü el Google. Demolös, das liseds onik tefü ninäd in {{SITENAME}} ba no binon anuik.',
-# Quickbar
-'qbsettings' => 'Stumem',
-'qbsettings-none' => 'Nonik',
-'qbsettings-fixedleft' => 'nedeto (fimiko)',
-'qbsettings-fixedright' => 'Deto (fimiko)',
-'qbsettings-floatingleft' => 'nedeto (vebölo)',
-'qbsettings-floatingright' => 'deto (vebölo)',
-
# Preferences page
'preferences' => 'Buükams',
'mypreferences' => 'Buükams',
@@ -1011,7 +1020,6 @@ Kontrololös, va votükam at okipon fovöfi padajenotema.',
'resetprefs' => 'Buükams rigik',
'restoreprefs' => 'Geikön lü paramets kösömik valik',
'prefs-editing' => 'Redakam',
-'prefs-edit-boxsize' => 'Gretot redakamafenäta.',
'rows' => 'Kedets:',
'columns' => 'Padüls:',
'searchresultshead' => 'Suk',
@@ -1252,7 +1260,6 @@ Muton labön {{PLURAL:$1|malati|malatis}} läs $1.',
'recentchangeslinked-feed' => 'Votükams teföl',
'recentchangeslinked-toolbox' => 'Votükams teföl',
'recentchangeslinked-title' => 'Votükams tefü pad: "$1"',
-'recentchangeslinked-noresult' => 'Pads ad pad at peyümöls no pevotükons ün period at.',
'recentchangeslinked-summary' => "Su pad patik at palisedons votükams padas, lü kels pad pevälöl yumon.
If ye pad pevälöl binon klad, palisedons is votükams nulik padas in klad at.
Pads [[Special:Watchlist|galädaliseda olik]] '''pakazetons'''.",
@@ -1490,12 +1497,6 @@ Primanünods: ninädasot/donasot, a.s. <code>image/jpeg</code>.',
'statistics-users-active-desc' => 'Gebans, kels edunons bosi ün {{PLURAL:$1|del lätik|dels lätik $1}}',
'statistics-mostpopular' => 'Pads suvüno palogöls:',
-'disambiguations' => 'Pads lü telplänovapads yümöls',
-'disambiguationspage' => 'Template:Telplänov',
-'disambiguations-text' => "Pads sököl payümons ad '''telplanövapad'''.
-Sötons plao payümon lü yeged pötik.<br />
-Pad palelogon telplänovapad if gebon samafomoti, lü kel payümon pad [[MediaWiki:Disambiguationspage]].",
-
'pageswithprop-submit' => 'Golön',
'doubleredirects' => 'Lüodüköms telik',
@@ -1707,10 +1708,9 @@ If vilol poso moükön padi de galädalised olik, välolös lä on knopi: „neg
'unwatchthispage' => 'No plu galädön',
'notanarticle' => 'No binon pad ninädilabik',
'notvisiblerev' => 'Fomam pemoükon',
-'watchnochange' => 'Nonik padas pagalädöl olik peredakon dü period löpo pejonöl.',
'watchlist-details' => '{{PLURAL:$1|pad $1|pads $1}} su galädalised, plä bespikapads.',
-'wlheader-enotif' => '* Nunam medü pot leäktronik pemögükon.',
-'wlheader-showupdated' => "* Pads pos visit lätik ola pevotüköls papenons '''me tonats bigik'''",
+'wlheader-enotif' => 'Nunam medü pot leäktronik pemögükon.',
+'wlheader-showupdated' => "Pads pos visit lätik ola pevotüköls papenons '''me tonats bigik'''",
'watchmethod-recent' => 'vestigam redakamas brefabüik padas galädaliseda',
'watchmethod-list' => 'vestigam votükamas brefabüik padas galädaliseda',
'watchlistcontains' => 'Galädalised olik labon {{PLURAL:$1|padi|padis}} $1.',
@@ -2053,12 +2053,9 @@ Logolös blokamis e xilis anu lonöfölis in [[Special:BlockList|lised blokamas]
'ipb_blocked_as_range' => 'Pöl: ladet-IP $1 no peblokon stedöfiko e no kanon pasäblokön.
Peblokon ye as dil ladetema: $2, kel kanon pasäblokön.',
'ip_range_invalid' => 'Ladetem-IP no lonöföl.',
-'blockme' => 'Blokolöd obi',
'proxyblocker' => 'Bloköm pladulömas',
-'proxyblocker-disabled' => 'Dun at penemogükon.',
'proxyblockreason' => 'Ladet-IP olik peblokon bi binon pladulöm maifik.
Kosikolös ko dünigevan bevüresodik u kaenastütans olik e nunolös ones sefasäkädi fefik at.',
-'proxyblocksuccess' => 'Peledunon.',
'sorbsreason' => 'Ladet-IP olik palisedon as pladulöm maifik pö el DNSBL fa {{SITENAME}} pageböl.',
'sorbs_create_account_reason' => 'Ladet-IP olik palisedon as pladulöm maifik pö el DNSBL fa {{SITENAME}} pageböl.
No dalol jafön kali.',
@@ -2407,6 +2404,19 @@ If ojäfidükol oni, nünömasit olik ba podämükon.",
'ago' => 'bü $1',
'just-now' => 'anu',
+# Human-readable timestamps
+'hours-ago' => 'bü {{PLURAL:$1|düp|düps}} $1',
+'minutes-ago' => 'bü {{PLURAL:$1|minut|minuts}} $1',
+'seconds-ago' => 'bü {{PLURAL:$1|sekun|sekuns}} $1',
+'monday-at' => 'Tü mudel düp $1',
+'tuesday-at' => 'Tü tudel düp $1',
+'wednesday-at' => 'Tü vedel düp $1',
+'thursday-at' => 'Tü dödel düp $1',
+'friday-at' => 'Tü fridel düp $1',
+'saturday-at' => 'Tü zädel düp $1',
+'sunday-at' => 'Tü sudel düp $1',
+'yesterday-at' => 'Ädelo düp $1',
+
# Bad image list
'bad_image_list' => 'Fomät pabevobon ön mod soik:
@@ -2433,7 +2443,7 @@ Nünabinets votik poklänedons.
* gpslongitude
* gpsaltitude',
-# EXIF tags
+# Exif tags
'exif-imagewidth' => 'Vidot',
'exif-imagelength' => 'Geilot',
'exif-bitspersample' => 'Jölätabinets a köl',
@@ -2546,7 +2556,7 @@ Nünabinets votik poklänedons.
'exif-languagecode' => 'Pük',
'exif-iimcategory' => 'Klad',
-# EXIF attributes
+# Exif attributes
'exif-compression-1' => 'No pekobopedöl',
'exif-unknowndate' => 'Dät nesevädik',
@@ -2808,12 +2818,9 @@ Kanol i [[Special:EditWatchlist|gebön redakametodi kösömik]].',
'version-software-product' => 'Prodäd',
'version-software-version' => 'Fomam',
-# Special:FilePath
-'filepath' => 'Ragivaluveg',
-'filepath-page' => 'Ragiv:',
-'filepath-submit' => 'Gololöd',
-'filepath-summary' => 'Pad patik at tuvon luvegi lölöfik ragiva.
-Magods pajonons ma fomät gudikün, ragivasots votik pamaifükons stedöfo kobü programs onsik.',
+# Special:Redirect
+'redirect-submit' => 'Golön',
+'redirect-file' => 'Ragivanem',
# Special:FileDuplicateSearch
'fileduplicatesearch' => 'Sukön ragivis petelüköl',
@@ -2873,6 +2880,8 @@ Magods pajonons ma fomät gudikün, ragivasots votik pamaifükons stedöfo kobü
'htmlform-submit' => 'Sedön',
'htmlform-reset' => 'Sädunön votükamis',
'htmlform-selectorother-other' => 'Votik',
+'htmlform-no' => 'Nö',
+'htmlform-yes' => 'Si',
# New logging system
'revdelete-restricted' => 'miedükams pelonöfükons pro guvans',
diff --git a/languages/messages/MessagesVot.php b/languages/messages/MessagesVot.php
index 0afeb398..3998ef45 100644
--- a/languages/messages/MessagesVot.php
+++ b/languages/messages/MessagesVot.php
@@ -156,7 +156,7 @@ $messages = array(
'jumptonavigation' => 'valittsõmisiisõ',
'jumptosearch' => 'ettsüse',
-# 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).
+# 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).
'aboutsite' => 'Tääteja {{GRAMMAR:elative|{{SITENAME}}}}',
'aboutpage' => 'Project:Täätühsed',
'copyright' => 'Sisälto on $1 litsentsii mukka svobodnoi.',
@@ -166,7 +166,6 @@ $messages = array(
'disclaimers' => 'Ceeltümin vassamizõõ',
'disclaimerpage' => 'Project:Ceeltümin vassamizõõ',
'edithelp' => 'Muutuzavid',
-'edithelppage' => 'Help:Kui muuttaa cülciä',
'helppage' => 'Help:Sisälto',
'mainpage' => 'Esicülci',
'mainpage-description' => 'Esicülci',
@@ -404,9 +403,6 @@ Proovvi lizät etsün alkuu ''all:'', nii ettsü etsib kõikkõõ sisältoo (taa
'powersearch-redir' => 'Spiiska mešaitussijõ',
'powersearch-field' => 'Etsi',
-# Quickbar
-'qbsettings-none' => 'Eb õõ',
-
# Preferences page
'preferences' => 'Koozid',
'mypreferences' => 'Minu koozid',
@@ -488,7 +484,6 @@ Proovvi lizät etsün alkuu ''all:'', nii ettsü etsib kõikkõõ sisältoo (taa
'recentchangeslinked-feed' => 'Sukulaizõd muutussõd',
'recentchangeslinked-toolbox' => 'Sukulaizõd muutussõd',
'recentchangeslinked-title' => 'Cüľľelt $1 linkitettüÄÄe cülcije muutuhsõd.',
-'recentchangeslinked-noresult' => 'Cüseizez aigakõhaz eväd õltu milliziitäid muuttumiziit.',
'recentchangeslinked-summary' => "Kase osoobennoi cülci näütteb muutusõd cülcillä, kummalõõ on seltä cüľľeltä näüteltü.
Cüľľed, kummad õmad teÄÄellä [[Special:Watchlist|kattsõspiizgalla]] on cirjuttõnnu '''pimmiässi'''.",
'recentchangeslinked-page' => 'Cüľľee nimi:',
@@ -549,8 +544,6 @@ Seness [$2 kuvauhsõ lehocülless] informaattsija on alapallõ annõttu.',
'statistics' => 'Staťisťikka',
'statistics-pages' => 'Cülcid',
-'disambiguationspage' => 'Template:disambig',
-
'brokenredirects-edit' => 'muuttaa',
'brokenredirects-delete' => 'pühi',
@@ -741,7 +734,6 @@ Cüľľellä $2 on spiiska viimeiziss pühcimühsiiss.',
'blocklogentry' => 'piätteli cäüttijää vai IP-cislaa [[$1]]. Piättelemin lõpub $2 $3',
'unblocklogentry' => 'rooci cäüttijält $1 muutuzpiäsüss',
'block-log-flags-nocreate' => 'lukuloomin piäteltü',
-'proxyblocksuccess' => 'On tehtü.',
# Move page
'movepagetext' => "Alla õlõvall ruumõll võitta anta cüľľelle uutt nimiä; kõik cüľľee istori leeb liikutõttu uuvvõ nimee alle.
@@ -890,7 +882,7 @@ Kui faili on muutõttu, siiz detaaľid võivad õlla kahõllaizõd muutõtull fa
* gpslongitude
* gpsaltitude',
-# EXIF tags
+# Exif tags
'exif-gpstimestamp' => 'GPS-aika',
'exif-languagecode' => 'Ceeli',
'exif-iimcategory' => 'Gruppa',
@@ -934,10 +926,6 @@ Kui faili on muutõttu, siiz detaaľid võivad õlla kahõllaizõd muutõtull fa
# Core parser functions
'duplicate-defaultsort' => '\'\'\'Warning:\'\'\' Default sort key "$2" overrides earlier default sort key "$1".',
-# Special:FilePath
-'filepath-page' => 'Faili:',
-'filepath-submit' => 'Mee',
-
# Special:FileDuplicateSearch
'fileduplicatesearch-filename' => 'Failinimi:',
'fileduplicatesearch-submit' => 'Etsi',
diff --git a/languages/messages/MessagesVro.php b/languages/messages/MessagesVro.php
index 78bd15a1..7ed52782 100644
--- a/languages/messages/MessagesVro.php
+++ b/languages/messages/MessagesVro.php
@@ -72,9 +72,6 @@ $messages = array(
'tog-shownumberswatching' => "Näütäq, ku pall'o pruukjit taa lehe perrä kaes",
'tog-oldsig' => 'Parhillanõ alakirotus:',
'tog-fancysig' => 'Pruugiq vikiteksti moodulist alakirotust (ilma automaatsõ lingildä)',
-'tog-externaleditor' => "Pruugiq vaikimiisi välist tekstitoimõndajat (õnnõ as'atundjilõ, nõud suq puutri ümbresäädmist, kaeq [//www.mediawiki.org/wiki/Manual:External_editors More information.])",
-'tog-externaldiff' => "Pruugiq vaikimiisi välist võrrõlusprogrammi (õnnõ as'atundjilõ, nõud su puutri ümbresäädmist, kaeq [//www.mediawiki.org/wiki/Manual:External_editors More information.])",
-'tog-showjumplinks' => 'Panõq lehe algustõ kipõqlingiq',
'tog-uselivepreview' => 'Pruugiq kipõkaehust (JavaScript) (proomi)',
'tog-forceeditsummary' => 'Annaq teedäq, ku olõ-i kirotõt kokkovõtõt',
'tog-watchlisthideown' => 'Näüdäku-i perräkaemisnimekirän mu hindä toimõnduisi',
@@ -272,7 +269,7 @@ $1",
'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).
+# 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).
'aboutsite' => '{{SITENAME}} tutvustus',
'aboutpage' => 'Project:Pääteedüs',
'copyright' => 'Teksti või vabalt pruukiq litsendsi $1 perrä.',
@@ -282,7 +279,6 @@ $1",
'disclaimers' => 'Hoiatuisi',
'disclaimerpage' => 'Project:Üledseq hoiatusõq',
'edithelp' => 'Toimõndamisoppus',
-'edithelppage' => 'Help:Kuis_artiklit_toimõndaq',
'helppage' => 'Help:Oppus',
'mainpage' => 'Pääleht',
'mainpage-description' => 'Pääleht',
@@ -353,17 +349,6 @@ Olõmanolõvaq tallitusleheküleq ommaq löüdäq leheküle päält [[Special:Sp
# General errors
'error' => 'Viga',
'databaseerror' => 'Teedüskogo viga',
-'dberrortext' => 'Teedüskogo perräküsümisen oll\' süntaksiviga.
-Perräküsümine oll\' viganõ vai om tarkvaran viga.
-Viimäne teedüskogo perräküsümine oll\':
-<blockquote><tt>$1</tt></blockquote>
-ja tuu tetti funktsioonist "<tt>$2</tt>".
-Teedüskogo and\' viateedüse "<tt>$3: $4</tt>".',
-'dberrortextcl' => 'Teedüskogo perräküsümisen oll\' süntaksiviga.
-Viimäne teedüskogo perräküsümine oll\':
-"$1"
-ja tuu tetti funktsioonist "$2".
-Teedüskogo and\' viateedüse "$3: $4".',
'laggedslavemode' => 'Hoiatus: Taa lehe pääl pruugi-i ollaq perämäidsi muutmiisi.',
'readonly' => 'Teedüskogo kirotuskaitsõ all',
'enterlockreason' => 'Kirodaq lukkupandmisõ põhjus ja ligikaudnõ vallalõvõtmisõ aig',
@@ -408,7 +393,6 @@ Perräküsümine: $2',
'viewsourcetext' => 'Võit kaiaq ja kopidaq taa lehe lättekoodi:',
'protectedinterface' => "Taa lehe pääl om tarkvara pruukjapalgõ tekst. Leht om lukku pant, et taad saasi-i ärq ts'urkiq.",
'editinginterface' => "'''Hoiatus:''' Sa toimõndat tarkvara pruukjapalgõ tekstiga lehte. Ku siin midä muudat, mõotas tuu pruukjapalõt. Ümbrepandmisõs tasos pruukiq MediaWiki ümbrepandmisõ tüüriista [//translatewiki.net/wiki/Main_Page?setlang=fiu-vro translatewiki.net].",
-'sqlhidden' => '(SQL-perräküsümine käkit)',
'cascadeprotected' => 'Taa leht om kirotuskaidsõt, selle et taa {{PLURAL:$1|kuulus alanolõvidõ kaidsõtuidõ lehti hulka|kuulus alanolõvidõ kaidsõtuidõ lehti hulka}}:
$2',
'namespaceprotected' => "Sul olõ-i lubat toimõndaq nimeruumi '''$1''' lehti.",
@@ -506,7 +490,7 @@ Oodaq vähä inne ku proovit vahtsõst.",
'newpassword' => 'Vahtsõnõ salasõna',
'retypenew' => 'Kirodaq viilkõrd vahtsõnõ salasõna',
'resetpass_submit' => 'Kirodaq salasõna ja mineq nimega sisse',
-'resetpass_success' => 'Salasõna vaihtaminõ läts kõrda.',
+'changepassword-success' => 'Salasõna vaihtaminõ läts kõrda.',
'resetpass_forbidden' => 'Salasõnno saa-i muutaq.',
'resetpass-no-info' => 'Taa lehe pääle päsemises piät olõma nimega sisse lännüq.',
'resetpass-submit-loggedin' => 'Muudaq salasõnna',
@@ -777,7 +761,6 @@ Lisateedüst või ollaq [{{fullurl:{{#Special:Log}}/suppress|page={{FULLPAGENAME
'shown-title' => 'Näütäq lehe kotsilõ $1 {{PLURAL:$1|tulõmus|tulõmust}}',
'viewprevnext' => 'Näütäq ($1 {{int:pipe-separator}} $2) ($3).',
'searchmenu-new' => "'''Luuq leht päälkiräga \"[[:\$1]]\".'''",
-'searchhelp-url' => 'Help:Oppus',
'searchprofile-articles' => 'Sisuleheq',
'searchprofile-project' => 'Abi- ja projektileheq',
'searchprofile-images' => 'Multimeediä',
@@ -815,14 +798,6 @@ otsisõna iin edejakku ''all:''. Ütest kimmäst nimeruumist otsmisõs pruugiq e
'search-external' => 'Väline otsminõ',
'searchdisabled' => "{{SITENAME}} otsminõ parhillaq ei tüütäq. Niikavva, ku otsminõ jälq tüüle saa, võit pruukiq otsmisõs alanolõvat Google'i otsikasti, a näide teedüs {{SITENAME}} sisust pruugi-i ollaq alasi kõgõ värskimb.",
-# Quickbar
-'qbsettings' => 'Kipõriba säädmine',
-'qbsettings-none' => 'Olõ-i',
-'qbsettings-fixedleft' => 'Kõgõ kural puul',
-'qbsettings-fixedright' => 'Kõgõ hüäl puul',
-'qbsettings-floatingleft' => 'Ujovahe kural puul',
-'qbsettings-floatingright' => 'Ujovahe hüäl puul',
-
# Preferences page
'preferences' => 'Säädmine',
'mypreferences' => 'Säädmiseq',
@@ -997,7 +972,6 @@ Taa tohe-i ollaq rohkõmb ku $1 {{PLURAL:$1|märk|märki}}.",
'recentchangeslinked-feed' => 'Siiäq putvaq muutmisõq',
'recentchangeslinked-toolbox' => 'Siiäq putvaq muutmisõq',
'recentchangeslinked-title' => 'Muutusõq noidõ lehti pääl, kohe näüdätäs lähe päält "$1"',
-'recentchangeslinked-noresult' => 'Taaha putvit lehti olõ-i taa ao seen muudõt.',
'recentchangeslinked-summary' => "Taan nimekirän ommaq noidõ lehti muutmisõq, mink pääle näütäs seo lehe päält linke. Naad leheq ommaq [[Special:Watchlist|perräkaemisnimekirän]] märgidüq '''paksu kiräga'''.",
'recentchangeslinked-page' => 'Lehe nimi:',
'recentchangeslinked-to' => 'Näütäq muutmiisi noidõ lehti pääl, kon om näütämiisi seo lehe pääle',
@@ -1176,12 +1150,6 @@ Ku ülekaet teedüstü om sama pilt alguperälidsen suurusõn, sis olõ-i vaia e
'statistics-users-active-desc' => 'Pruukjaq, kiä ommaq tan midägi toimõndanuq {{PLURAL:$1|viimädse päävä|viimädse $1 päävä}} seen.',
'statistics-mostpopular' => 'Kõgõ kaetumbaq leheq',
-'disambiguations' => 'Lingiq, miä näütäseq täpsüstüslehekülgi pääle',
-'disambiguationspage' => 'Template:Linke täpsüstüslehekülile',
-'disambiguations-text' => "Naaq leheq näütäseq '''täpsüstüslehti''' pääle.
-Tuu asõmal pidänüq nä näütämä as'a sisu pääle.<br />
-Lehte peetäs täpsüstüslehes, ku timän om pruugit näüdüst, kohe näütäs link lehelt [[MediaWiki:Disambiguationspage]].",
-
'doubleredirects' => 'Katõkõrdsõq ümbresaatmisõq',
'doubleredirectstext' => 'Egä ria pääl om ärq tuud edimäne ja tõõnõ ümbresaatmisleht ja niisama tõõsõ ümbresaatmislehe link, miä näütäs hariligult kotusõ pääle, kohe edimäne ümbersaatmisleht pidänüq õkva näütämä.',
@@ -1329,10 +1297,9 @@ ja sul piät umin [[Special:Preferences|säädmiisin]] olõma e-postiaadrõs, et
'unwatch' => 'Lõpõdaq perräkaeminõ ärq',
'unwatchthispage' => 'Lõpõdaq perräkaeminõ ärq',
'notanarticle' => 'Olõ-i artikli',
-'watchnochange' => 'Taa ao seen olõ-i üttegi perräkaetavat lehte muudõt.',
'watchlist-details' => 'Perräkaemisnimekirän om {{PLURAL:$1|$1 leht|$1 lehte}}, rehkendämäldä arotuslehti.',
-'wlheader-enotif' => '* E-postiga teedäqandmisõq ommaq käügin.',
-'wlheader-showupdated' => "* Leheq, midä om muudõt päält su viimäst käümist, ommaq '''paksun kirän'''",
+'wlheader-enotif' => 'E-postiga teedäqandmisõq ommaq käügin.',
+'wlheader-showupdated' => "Leheq, midä om muudõt päält su viimäst käümist, ommaq '''paksun kirän'''",
'watchmethod-recent' => 'kontrollitas perräkaetavidõ lehti perämäidsi muutmiisi',
'watchmethod-list' => 'perräkaetavidõ lehti perämädseq muutmisõq',
'watchlistcontains' => 'Perräkaemisnimekirän om $1 {{PLURAL:$1|leht|lehte}}.',
@@ -1595,7 +1562,6 @@ Perämäidsi kistutuisi ja tagasitegemiisi saat kaiaq [[Special:Log/delete|kistu
'ip_range_invalid' => 'Viganõ puutri võrgoaadrõsi kujo.',
'proxyblocker' => 'Vaihõserveri kinniqpidämine',
'proxyblockreason' => "Su puutri võrgoaadrõs om kinniq peet, selle et taa om avalik vaihõserver. Otsiq üles uma võrgoliini pakja vai puutrias'atundja ja kõnõlõq näile taast hädäst.",
-'proxyblocksuccess' => 'Valmis.',
'sorbsreason' => 'Su puutri võrgoaadrõs om SORBS-i mustan nimekirän ku avalik vaihõserver.',
'sorbs_create_account_reason' => 'Su puutri võrgoaadrõs om pant SORBS-i musta nimekirjä ku avalik vaihõserver. Sa saa-i pruukjanimme tetäq',
@@ -1824,9 +1790,7 @@ Kokkovõttõria pääle või kirotaq tagasivõtmisõ põhjusõ.',
'spam_blanking' => "Kõigin kujõn oll' linke lehele $1. Leht tühäs tett.",
# Skin names
-'skinname-standard' => 'Array',
'skinname-cologneblue' => 'Array',
-'skinname-myskin' => 'Array',
# Patrolling
'markaspatrolleddiff' => 'Märgiq ülekaetus',
@@ -1894,7 +1858,7 @@ Kokkovõttõria pääle või kirotaq tagasivõtmisõ põhjusõ.',
* gpslongitude
* gpsaltitude',
-# EXIF tags
+# Exif tags
'exif-imagewidth' => 'Lakjus',
'exif-imagelength' => 'Korgus',
'exif-bitspersample' => 'Bitti osa kotsilõ',
@@ -2008,7 +1972,7 @@ Kokkovõttõria pääle või kirotaq tagasivõtmisõ põhjusõ.',
'exif-gpsdatestamp' => 'GPS-kuupäiv',
'exif-gpsdifferential' => 'GPS-differentsiaalparandus',
-# EXIF attributes
+# Exif attributes
'exif-compression-1' => 'Kokkopakmalda',
'exif-unknowndate' => 'Tundmalda kuupäiv',
@@ -2237,11 +2201,6 @@ Prooviq harilikku kaehust.',
'version-version' => '(Kujo $1)',
'version-software-version' => 'Kujo',
-# Special:FilePath
-'filepath' => 'Teedüstü aadrõs',
-'filepath-page' => 'Teedüstü:',
-'filepath-submit' => 'Aadrõs',
-
# Special:FileDuplicateSearch
'fileduplicatesearch-filename' => 'Teedüstünimi:',
'fileduplicatesearch-submit' => 'Otsiq',
diff --git a/languages/messages/MessagesWa.php b/languages/messages/MessagesWa.php
index d6b8740d..52b32020 100644
--- a/languages/messages/MessagesWa.php
+++ b/languages/messages/MessagesWa.php
@@ -113,9 +113,6 @@ $messages = array(
'tog-shownumberswatching' => "Mostrer l' nombe d' uzeus ki shuvèt l' pådje",
'tog-oldsig' => 'Siné pol moumint:',
'tog-fancysig' => 'Sinateure avou do tecse wiki (sins loyén otomatike)',
-'tog-externaleditor' => "Eployî on dfoûtrin aspougneu d' tecse come prémetowe dujhance (po les spepieus uzeus seulmint, ca i vs fåt fé des apontiaedjes sol sopiutrece da vosse, [//www.mediawiki.org/wiki/Manual:External_editors loukîz chal po pus di racsegnes]).",
-'tog-externaldiff' => 'Eployî on dfoûtrin programe di diferinces come prémetowe dujhance (po les spepieus uzeus seulmint, ca i vs fåt fé des apontiaedjes sol sopiutrece da vosse, [//www.mediawiki.org/wiki/Manual:External_editors loukîz chal po pus di racsegnes]).',
-'tog-showjumplinks' => 'Mete en alaedje les loyéns di naiviaedje «potchî a» å dzeu del pådje (pol pea «Myskin» et ds ôtes)',
'tog-uselivepreview' => "Eployî l' prévoeyaedje abeye (JavaScript) (Esperimintå)",
'tog-forceeditsummary' => "M' advierti cwand dji lai vude on rascourti",
'tog-watchlisthideown' => 'Èn nén mostrer les candjmints da minne',
@@ -127,6 +124,7 @@ $messages = array(
'tog-ccmeonemails' => "M' evoyî ene copeye des emiles ki dj' evoye ås ôtes",
'tog-diffonly' => "Èn nén håyner l' contnou del pådje pa dzo l' pådje des diferinces",
'tog-showhiddencats' => 'Mostrer les categoreyes mucheyes',
+'tog-useeditwarning' => "M' advierti cwand dji cwite ene pådje k' a des candjmints nén schapés",
'underline-always' => 'Tofer',
'underline-never' => 'MÃ¥y',
@@ -298,7 +296,7 @@ Soeyoz vayant di ratinde ene miete divant di rsayî di vey cisse pådje ci.
$1",
'pool-errorunknown' => 'Aroke nén cnoxhowe',
-# 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).
+# 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).
'aboutsite' => 'Ã…d fwait di {{SITENAME}}',
'aboutpage' => 'Project:Ã…d fwait',
'copyright' => "Li contnou est dizo l' $1.",
@@ -306,7 +304,6 @@ $1",
'currentevents' => 'Actouwålités',
'currentevents-url' => 'Project:Actouwålités',
'edithelp' => 'Aidance',
-'edithelppage' => 'Help:Kimint candjî ene pådje',
'helppage' => 'Help:Aidance',
'mainpage' => 'Mwaisse pådje',
'mainpage-description' => 'Mwaisse pådje',
@@ -369,17 +366,6 @@ Motoit ki vos avoz må scrît l' hårdêye ou shuvou on cron loyén.
# General errors
'error' => 'Aroke',
'databaseerror' => "Åk n' a nén stî avou l' båze di dnêyes",
-'dberrortext' => "Åk n' a nén stî avou l' sintacse do cweraedje del båze di dnêyes.
-Çoula pout esse cåze d' on bug dins l' programe.
-Li dierin cweraedje del båze di dnêyes di sayî esteut:
-<blockquote><tt>$1</tt></blockquote>
-a pårti del fonccion «<tt>$2</tt>».
-Li båze di dnêyes a rtourné l' aroke «<tt>$3: $4</tt>».",
-'dberrortextcl' => "Åk n' a nén stî avou l' sintacse do cweraedje del båze di dnêyes.
-Li dierin cweraedje del båze di dnêyes di sayî esteut:
-«$1»
-a pårti del fonccion «$2».
-Li båze di dnêyes a rtourné l' aroke «$3: $4».",
'laggedslavemode' => "Asteme: I s' pout ki l' pådje n' åye nén co les dierins candjmints.",
'readonly' => 'Li båze di dnêyes est aclawêye',
'missing-article' => "Li båze di dnêyes n' a nén trové l' tecse d' ene pådje k' åreut dvou esse trovêye, lomêye «$1» $2.
@@ -502,7 +488,7 @@ Por vos fini l' elodjaedje, vos dvoz defini on novea scret:",
'newpassword' => 'Noû scret:',
'retypenew' => "Ritapez l' noû scret:",
'resetpass_submit' => "Defini on scret et s' elodjî",
-'resetpass_success' => "Vosse sicret a stî candjî comifåt!
+'changepassword-success' => "Vosse sicret a stî candjî comifåt!
Asteure l' elodjaedje...",
'resetpass_forbidden' => "Les screts n' polèt nén esse candjîs",
'resetpass-no-info' => 'Vos dvoz esse elodjî po pleur aveur accès a cisse pådje ci.',
@@ -514,10 +500,8 @@ Motoit ki vos l' avoz ddja candjî ou ridmandé on novea scret timporaire.",
# Special:PasswordReset
'passwordreset' => "Rifé l' sicret",
-'passwordreset-text' => 'Completez cisse formulrece ci po rçure èn emile ki dene les detays do conte da vosse.',
'passwordreset-legend' => "Rifé l' sicret",
'passwordreset-disabled' => "Li rfijhaedje di screts a stî dismetou so ç' wiki ci.",
-'passwordreset-pretext' => '{{PLURAL:$1||Dinez onk des elemints di dnêyes shuvants}}',
'passwordreset-username' => "No d' elodjaedje:",
'passwordreset-domain' => 'Dominne:',
'passwordreset-capture' => "Vey li messaedje di l' emile?",
@@ -711,6 +695,8 @@ Motoit k' elle a stî tapêye evoye.",
'edit-conflict' => 'Ecramiaedje di candjmints.',
'edit-no-change' => "Vosse sicrijhaedje n' a nén passé, paski rén n' a stî candjî al modêye di dvant.",
'edit-already-exists' => "Li novele pâdje n' a savou esse ahivêye, ca cisse pâdje la egzistêye dedja.",
+'editwarning-warning' => "Cwiter cisse pådje ci vos frè piede tos les candjmints ki vos avoz fwait.
+Si vos estoz elodjî, vos ploz dismete cist adviertixhmint ci dins l' linwete «Boesse di tecse» di vos preferinces.",
# Parser/template warnings
'post-expand-template-inclusion-warning' => "'''Asteme:''' I gn a trop di modeles dins cisse pådje ci.
@@ -817,7 +803,6 @@ Les ôtes manaedjeus so {{SITENAME}} pôront todi vey li contnou catchî eyet l'
'searchmenu-legend' => 'Tchuzes di cweraedje',
'searchmenu-exists' => "'''Gn a ddja ene pådje lomêye « [[:$1]] » so ç' wiki ci'''",
'searchmenu-new' => "'''Ahiver l' pådje \"[[:\$1]]\" so ç' wiki ci!'''",
-'searchhelp-url' => 'Help:Aidance',
'searchprofile-articles' => 'PÃ¥djes di contnou',
'searchprofile-project' => "PÃ¥djes d' aidance et do pordjet",
'searchprofile-images' => 'Multimedia',
@@ -855,15 +840,6 @@ Vos ploz sayî di mete «all:» pa dvant l' tecse a cweri po cweri dins tot l' c
'search-external' => 'Difoûtrin cweraedje',
'searchdisabled' => "Mande escuzes! Li cweraedje å dvins des årtikes a stî dismetou pol moumint, cåze ki l' sierveu est fortcherdjî. Tot ratindant, vos ploz eployî Google po fé les rcweraedjes so {{SITENAME}}, mins çoula pout esse ene miete vî.",
-# Quickbar
-'qbsettings' => 'Apontiaedjes pol bår di menu',
-'qbsettings-none' => 'Nole bår',
-'qbsettings-fixedleft' => 'Aclawêye a hintche',
-'qbsettings-fixedright' => 'Aclawêye a droete',
-'qbsettings-floatingleft' => 'Flotante a hintche',
-'qbsettings-floatingright' => 'Flotante a droete',
-'qbsettings-directionality' => "Aclawêye, sorlon l' sinse di scrijhaedje di vosse lingaedje",
-
# Preferences page
'preferences' => 'Preferinces',
'mypreferences' => 'Mes preferinces',
@@ -929,7 +905,6 @@ Vos ploz sayî di mete «all:» pa dvant l' tecse a cweri po cweri dins tot l' c
'prefs-reset-intro' => "Vos ploz eployî ç' boton chal po rmete totes vos preferinces åzès prémetowès valixhances del waibe.
Çoul n' pôrè nén esse disfwait.",
'prefs-emailconfirm-label' => "Acertinaedje di l' emile:",
-'prefs-textboxsize' => 'Grandeu del boesse di tecse',
'youremail' => 'Vost emile:',
'username' => "No d' elodjaedje:",
'uid' => "Limero d' l' uzeu:",
@@ -1282,12 +1257,6 @@ Rimimbrez vs di verifyî s' i n' a nén des ôtes loyéns divant delzès disface
'statistics-pages-desc' => 'Totes les pådjes do "Wiki", minme les copinaedjes, les rdjiblaedjes, evnd.',
'statistics-mostpopular' => 'PÃ¥djes les pus veyowes',
-'disambiguations' => "Pådjes avou des loyéns viè des pådjes d' omonimeye",
-'disambiguationspage' => 'Template:omonimeye',
-'disambiguations-text' => "Ces pådjes ci loynut eviè ene '''pådje d' omonimeye'''.
-Ele divrént purade raloyî direk å mwaisse sudjet.<br />
-Ene pådje est waiteye come pådje d' omonimeye s' ele eploye on modele k' est loyî a [[MediaWiki:Disambiguationspage]].",
-
'doubleredirects' => 'Dobes redjiblaedjes',
'doubleredirectstext' => "Cisse pådje ci mostere les dobes redjiblaedjes (pådjes ki redjiblèt viè ene ôte pådje di redjiblaedje).
Tchaeke roye a-st on loyén viè l' prumî eyet l' deujhinme redjiblaedje, avou on mostraedje del såme do deujhinme redjiblaedje, çou ki å pus sovint dene li «vraiy» årtike såme, ki l' prumî redjiblaedje divreut evoyî viè lu.
@@ -1470,10 +1439,9 @@ Si vos vloz bodjî l' pådje foû di vosse djivêye des shuvous, clitchîz so «
'unwatch' => 'Èn pus shuve',
'unwatchthispage' => 'Èn pus shuve li pådje',
'notanarticle' => 'Nén èn årtike',
-'watchnochange' => "Nole des pådjes di vosse djivêye di pådjes a shuve n' a stî candjeye dins l' termene di tins dmandêye.",
'watchlist-details' => 'Vos avoz {{PLURAL:$1|$1 pådje shuvowe|$1 pådjes shuvowes}} (sins conter les pådjes di copene).',
-'wlheader-enotif' => '* Li notifiaedje pa emile est en alaedje.',
-'wlheader-showupdated' => "* Les pådjes k' ont candjî dispoy vosse dierinne vizite sont metowes e '''cråssès letes'''",
+'wlheader-enotif' => 'Li notifiaedje pa emile est en alaedje.',
+'wlheader-showupdated' => "Les pådjes k' ont candjî dispoy vosse dierinne vizite sont metowes e '''cråssès letes'''",
'watchmethod-recent' => "Cwerant après les pådjes k' ont stî candjeyes dierinnmint ki sont eto des pådjes shuvowes",
'watchmethod-list' => "Cwerant après les pådjes shuvowes k' ont stî candjeyes dierinnmint",
'watchlistcontains' => 'I gn a {{PLURAL:$1|$1 pådje|$1 pådjes}} e vosse djivêye des pådjes a shuve.',
@@ -1756,7 +1724,6 @@ Loukîz li [[Special:BlockList|djivêye des blocaedjes]] po vey les blocaedjes Ã
'ip_range_invalid' => "Fortchete d' adresses IP nén valide.",
'proxyblocker' => 'Blocaedje di procsi',
'proxyblockreason' => "Voste adresse IP a stî blokêye paski c' est on procsi k' est å lådje. Contactez vost ahesseu Internet ou l' siervice di sopoirt tecnike eyet lzî dire po çoula, la k' c' est on problinme di såvrité serieus.",
-'proxyblocksuccess' => 'Fwait.',
'sorbsreason' => "Voste adresse IP si trove dins l' djivêye des procsis å lådje di DNSBL.",
'sorbs_create_account_reason' => "Voste adresse IP si trove dins l' djivêye des procsis å lådje di DNSBL. Vos n' poloz nén ahiver on conte d' uzeu.",
@@ -2051,7 +2018,7 @@ est raptiti. Les ôtes seront catchîs.
* gpslongitude
* gpsaltitude",
-# EXIF tags
+# Exif tags
'exif-imagewidth' => 'LÃ¥rdjeur',
'exif-imagelength' => 'Hôteur',
'exif-bitspersample' => 'Bits pa compôzant',
@@ -2268,9 +2235,6 @@ Acertinez s' i vs plait ki vos vloz vormint rifé cisse pådje ci.",
'version-software-product' => 'Prodût',
'version-software-version' => 'Modêye',
-# Special:FilePath
-'filepath-page' => 'Fitchî:',
-
# Special:FileDuplicateSearch
'fileduplicatesearch' => 'Cweraedje après les dobes fitchîs',
'fileduplicatesearch-submit' => 'Cweri',
diff --git a/languages/messages/MessagesWar.php b/languages/messages/MessagesWar.php
index f0b7dfa8..62e75c91 100644
--- a/languages/messages/MessagesWar.php
+++ b/languages/messages/MessagesWar.php
@@ -94,9 +94,6 @@ $messages = array(
'tog-shownumberswatching' => 'Igpakita an ihap han mga nangingita nga mga nagamit',
'tog-oldsig' => 'Aada nga pirma:',
'tog-fancysig' => 'Tratuha it pirma komo uska wikitext (nga waray automatiko nga sumpay)',
-'tog-externaleditor' => 'Gamit hin ha-gawas nga pagliwat ha default (ha mga experto la ini, nakinahanglan hin mga pinaurog nga mga seting ha imo kompyuter. [//www.mediawiki.org/wiki/Manual:External_editors More information.] )',
-'tog-externaldiff' => 'Gamit hin ha-gawas nga diff ha default (ha mga experto la, nakinahanglan hin mga pinaurog nga mga seting ha imo kompyuter. [//www.mediawiki.org/wiki/Manual:External_editors More information.])',
-'tog-showjumplinks' => 'Enable "jump to" accessibility links',
'tog-uselivepreview' => 'Gamita an buhi nga pahiuna nga pagawas (eksperimental)',
'tog-forceeditsummary' => 'Pasabti ako kun waray ko ginsurat ha dalikyat-nga-tigaman han pagliwat (edit summary)',
'tog-watchlisthideown' => 'Tago-a an akon mga ginliwat tikang han angay timan-an',
@@ -109,6 +106,8 @@ $messages = array(
'tog-diffonly' => 'Ayaw igpakita an sulod han pakli ha ilarom han pagkakaiba',
'tog-showhiddencats' => 'Igpakita an mga tinago nga mga kaarangay',
'tog-norollbackdiff' => 'Iglat-ang an kaiban kahuman himoa an libot-pabalik',
+'tog-useeditwarning' => 'Pasabti ako kun nabaya ako hin ginliwat ng pakli nga waray katipig an mga pagbag-o',
+'tog-prefershttps' => 'Pirmihi paggamit hin segurado nga koneksyon kun nakalog-in',
'underline-always' => 'Pirme',
'underline-never' => 'Diri',
@@ -172,6 +171,18 @@ $messages = array(
'oct' => 'Okt',
'nov' => 'Nob',
'dec' => 'Dis',
+'january-date' => 'Enero $1',
+'february-date' => 'Pebrero $1',
+'march-date' => 'Marso $1',
+'april-date' => 'Abril $1',
+'may-date' => 'Mayo $1',
+'june-date' => 'Hunyo $1',
+'july-date' => 'Hulyo $1',
+'august-date' => 'Agosto $1',
+'september-date' => 'Septyembre $1',
+'october-date' => 'Oktubre $1',
+'november-date' => 'Nobyembre $1',
+'december-date' => 'Disyembre $1',
# Categories related messages
'pagecategories' => '{{PLURAL:$1|Kaarangay|Mga kaarangay}}',
@@ -192,7 +203,7 @@ $messages = array(
'noindex-category' => 'Mga diri nakatudlokan nga pagkli',
'broken-file-category' => 'Mga pakli nga mayda utod nga mga sumpay hin paypay',
-'linkprefix' => '/^(.*?)([a-zA-Z\\x80-\\xff]+)$/sD',
+'linkprefix' => '/^((?>.*(?<![a-zA-Z\\x80-\\xff])))(.+)$/sD',
'about' => 'Mahitungod han',
'article' => 'Pakli hin sulod',
@@ -255,6 +266,7 @@ $messages = array(
'create-this-page' => 'Himo-a ini nga pakli',
'delete' => 'Para-a',
'deletethispage' => 'Para-a ini nga pakli',
+'undeletethispage' => 'Igbalik an ini nga pakli nga napara',
'undelete_short' => 'Igkansela an pagpara {{PLURAL:$1|usa nga pagliwat|$1 nga mga pagliwat}}',
'viewdeleted_short' => '{{PLURAL:$1|usa nga ginpara nga pagliwat|$1 ka ginpara nga mga pagliwat}}',
'protect' => 'Panalipdi',
@@ -298,7 +310,7 @@ $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).
+# 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).
'aboutsite' => 'Mahitungod han {{SITENAME}}',
'aboutpage' => 'Project:Mahitungod han',
'copyright' => 'An sulod mabiblingan ha ilarom han $1 antes may-ada pasabot.',
@@ -308,7 +320,6 @@ $1',
'disclaimers' => 'Mga Disclaimer',
'disclaimerpage' => 'Project:Kasahiran nga disclaimer',
'edithelp' => 'Bulig hin pagliwat',
-'edithelppage' => 'Help:Pagliwat',
'helppage' => 'Help:Sulod',
'mainpage' => 'Syahan nga Pakli',
'mainpage-description' => 'Syahan nga Pakli',
@@ -338,7 +349,6 @@ $1',
'newmessagesdifflinkplural' => '$1 {{PLURAL:$1|nga pagbag-o|nga mga pagbag-o}}',
'youhavenewmessagesmulti' => 'Mayda ka mga bag-o nga mensahe ha $1',
'editsection' => 'igliwat',
-'editsection-brackets' => '[$1]',
'editold' => 'igliwat',
'viewsourceold' => 'kitaa an ginkuhaan',
'editlink' => 'igliwat',
@@ -388,17 +398,13 @@ Listahan o talaan hin puyde nga mga pinaurog nga pakli in mabibilngan ha [[Speci
# General errors
'error' => 'Sayop',
'databaseerror' => 'Sayop hin database',
-'dberrortext' => 'Mayda nahinabo nga sayop hin syntax ha database nga kwery.
-Bangin ini nagpapakita hin bug dida han softweyr.
-An kataposan nga ginsari nga database nga kweri amo in:
-<blockquote><code>$1</code></blockquote>
-tikang ha sakob han funsyon nga "<code>$2</code>".
-Nagbalik an database hin sayop nga "<samp>$3: $4</samp>".',
-'dberrortextcl' => 'Mayda nahitabo nga sayop hin syntax ha database nga kwery.
-An kataposan nga ginsari nga kweri han database amo an:
-"$1"
-tikang ha sakob han funsyon nga "$2".
-Nagbalik hin sayop an database nga "$3: $4"',
+'databaseerror-text' => 'Nagkamay-ada hin database query error.
+
+Ini in indikasyon nga may-ada bug hini nga software.',
+'databaseerror-textcl' => 'Nagkamay-ada hin database query error.',
+'databaseerror-query' => 'Pakiana: $1',
+'databaseerror-function' => 'Function: $1',
+'databaseerror-error' => 'Sayop: $1',
'laggedslavemode' => 'Pahimatngon: It pakli bangin waray mga kabag-ohan nga bag-o.',
'readonly' => 'Gintrankahan an database',
'enterlockreason' => 'Pagbutang hin rason para han pagtrangka, upod hin banabana kon san-o kukuha-on an pagtrangka',
@@ -431,6 +437,7 @@ Alayon la igsumat ini ha [[Special:ListUsers/sysop|administrator]], igsurat la a
Bangin na ini ginpara hin iba.',
'cannotdelete-title' => 'diri nakakapara han pakli "$1"',
'delete-hook-aborted' => 'Pagpara ginpugngan han kawil. Waray eksplenasyon an ginhatag.',
+'no-null-revision' => 'Diri nakakahimo hin bag-o nga null rebisyon para han pakli "$1"',
'badtitle' => 'Maraot nga titulo',
'badtitletext' => 'An ginhangyo nga pakli diri puyde, waray sulod, o sayop nga nasumpay nga inter-pinunongan o inter-wiki nga titulo.
Bangin mayda usa o damo nga mga agi nga diri puyde magamit ha mga titulo.',
@@ -454,12 +461,15 @@ Para makadugang o makaliwat hin mga paghubad para han tanan nga mga wiki, alayon
'editinginterface' => "'''Pahimatngon:''' Imo ginliliwat an pakli nga gingagamit paghatag hin interface text para han software.
An mga pagbag-o hini nga pakli in makakaapekto han user interface han iba nga mga gumaramit hini nga wiki.
Para makadugang o makabag-o han mga paghubad para han ngatanan nga mga wiki, alayon paggamit han [//translatewiki.net/ translatewiki.net], an lokalisasyon nga proyekto han MediaWiki.",
-'sqlhidden' => '(nakatago an SQL query)',
'cascadeprotected' => 'Ini nga pakli in pinapasaliporan hin pagliwat tungod ini in nalalakip ha masunod nga {{PLURAL:$1|pakli, kun diin |mga pakli, kun diin}} pinapasaliporan hit "cascading" nga pagpili nga pinaandar:
$2',
'namespaceprotected' => "Diri ka gintutugutan pagliwat han mga pakli ha ngaran-lat'ang nga '''$1'''.",
'customcssprotected' => 'Diri ka gintutugotan pagliwat hini nga CSS nga pakli, tungod nga nagsusulod ini hin kanan iba nga tawo personal nga karuyagon.',
'customjsprotected' => 'Diri ka gintutugotan pagliwat hini nga JavaScript nga pakli, tungod nga nagsusulod ini hin kanan iba nga tawo personal nga karuyagon.',
+'mycustomcssprotected' => 'Waray nim pagtugot hin pagliwat hini nga CSS nga pakli.',
+'mycustomjsprotected' => 'Waray nim pagtugot hit pagliwat hini nga JavaScript nga pakli.',
+'myprivateinfoprotected' => 'Waray nim pagtugot hit pagliwat hit imo pribado nga impormasyon.',
+'mypreferencesprotected' => 'Waray nim pagtugot hit pagliwat hit imo mga karuyag.',
'ns-specialprotected' => 'Diri maliliwat an mga ispisyal nga pakli.',
'titleprotected' => 'Ini nga titulo pinasalipod ha paghimo ni [[User:$1|$1]].
An katadungan nga ginhatag amo in "\'\'$2\'\'".',
@@ -484,10 +494,19 @@ Ginpapasabot ka la nga an iba nga pakli in magpapadayon nga magpakita komo nga i
'welcomecreation-msg' => 'An im akawnt in nahimo na.
Ayaw kalimti pagbalyo han imo [[Special:Preferences|{{SITENAME}} preperensya]].',
'yourname' => 'Agnay hit gumaramit:',
+'userlogin-yourname' => 'Ngaran han gumaramit',
+'userlogin-yourname-ph' => 'Igbutang an imo ngaran-gumaramit',
+'createacct-another-username-ph' => 'Igbutang an imo agnay-gumaramit',
'yourpassword' => 'Tigaman-pagsulod:',
+'userlogin-yourpassword' => 'Tigaman pagsakob',
+'userlogin-yourpassword-ph' => 'Igbutang an imo tigaman-pagsakob',
+'createacct-yourpassword-ph' => 'Pagbutang hin uska tigaman-pagsakob',
'yourpasswordagain' => 'Utroha pagbutang an tigaman-han-pagsakob:',
+'createacct-yourpasswordagain' => 'Igkompirma an tigaman-pagsakob',
+'createacct-yourpasswordagain-ph' => 'Igbutang an tigaman-pagsakob utro',
'remembermypassword' => "Hinumdumi an akon pan-sakob dinhi nga panngaykay ''(browser)'' (para ha pinakamaiha $1 {{PLURAL:$1|ka adlaw|ka mga adlaw}})",
-'securelogin-stick-https' => 'Nagpapabilin nga masumpay ha HTTPS kahuman makalog-in',
+'userlogin-remembermypassword' => 'I-log-in la ako',
+'userlogin-signwithsecure' => 'Gamit hin koneksyon nga nakakasegurado',
'yourdomainname' => 'Imo dominyo:',
'password-change-forbidden' => 'Diri ka makakabalyo hin pulong-pagsulod ha dinhi nga wiki.',
'externaldberror' => 'Mayda authenticaton database error o diri ka tinutugotan pag-update an imo akwant ha gawas.',
@@ -499,18 +518,44 @@ Ayaw kalimti pagbalyo han imo [[Special:Preferences|{{SITENAME}} preperensya]].'
'logout' => 'Gawas',
'userlogout' => 'Gawas',
'notloggedin' => 'Diri sakob',
+'userlogin-noaccount' => 'Waray ka akawnt?',
+'userlogin-joinproject' => 'Tambong ha {{SITENAME}}',
'nologin' => 'Waray ka akawnt? $1.',
'nologinlink' => 'Paghimo hin akawnt',
'createaccount' => 'Himo-a an akawnt',
'gotaccount' => '¿Mayda kana akawnt? $1.',
'gotaccountlink' => 'Sakob',
'userlogin-resetlink' => 'Nangalimot han imo detalye han pagsakob?',
+'userlogin-resetpassword-link' => 'Ig-reset an imo tigaman-pagsakob',
+'helplogin-url' => 'Help:Pag-log-in',
+'userlogin-helplink' => '[[{{MediaWiki:helplogin-url}}|Bulig han pag-log-in]]',
+'userlogin-loggedin' => 'Nakalog-in kana komo hi {{GENDER:$1|$1}}.
+Gamiti an porma ha ubos para makalog-in komo iba nga gumaramit.',
+'userlogin-createanother' => 'Paghimo hin iba nga akawnt',
+'createacct-join' => 'Igbutang an imo impormasyon ha ubos.',
+'createacct-another-join' => 'Igbutang an impormasyon han bag-o nga akwant ha ilarom.',
+'createacct-emailrequired' => 'Email address',
+'createacct-emailoptional' => 'Email address (opsyonal)',
+'createacct-email-ph' => 'Igbutang an imo email address',
+'createacct-another-email-ph' => 'Igbutang an email address',
'createaccountmail' => 'Gamiti hin temporaryo nga bisan ano nag password ngan igpadangat ngada ha espesipikado nga e-mail address',
+'createacct-realname' => 'Tinuod nga ngaran (opsyonal)',
'createaccountreason' => 'Rason:',
+'createacct-reason' => 'Rason',
+'createacct-reason-ph' => 'Kay ano nahimo ka hin usa pa nga akawnt',
+'createacct-captcha' => 'Pagkita han seguridad',
+'createacct-imgcaptcha-ph' => 'Igbutang an sinurat nga nakikita mo ha igbaw',
+'createacct-submit' => 'Ighimo an im akawnt',
+'createacct-another-submit' => 'Paghimo hin lain nga akant',
+'createacct-benefit-heading' => '{{SITENAME}} in ginhimo hin tawo nga sugad ha imo.',
+'createacct-benefit-body1' => '{{PLURAL:$1|pagliwat|mga pagliwat}}',
+'createacct-benefit-body2' => '{{PLURAL:$1|ka pakli|ka mga pakli}}',
+'createacct-benefit-body3' => 'bag-o pala nga {{PLURAL:$1|mag-aramot|mga mag-aramot}}',
'badretype' => 'Diri naangay an mga tigaman-pagsulod nga im ginbutang',
'userexists' => 'An agnay hiton gumaramit nga im ginbutang in gingamit na.
Alayon pagpili hin lain nga ngaran.',
'loginerror' => 'Sayop hin pagsakob',
+'createacct-error' => 'Pakyas an paghimo han akawnt',
'createaccounterror' => 'Diri makakahimo hin akawnt: $1',
'nocookiesnew' => 'An akawnt han gumaramit hin nahimo, pero diri ka pa nakalog-in.
{{SITENAME}} in nagamit hin cookies para makalog-in han mga gumaramit.
@@ -574,9 +619,13 @@ Kinahanglan ka maglog-in ngan igbal-iw an imo tigaman-panakob yana dayon.
Puydi nimo pabay-on ini nga mensahe, kun ini nga paghimo hin akwant in nagsayop la.',
'usernamehasherror' => 'Agnay-hin-gumaramit in diri puydi magkamay-ada hin mga hash karakter',
+'login-throttled' => 'Damo na an imo login attempts ha pagkayana.
+Alayon paghulat hin $1 san-o ka umutro.',
'login-abort-generic' => 'An imo paglog-in in diri malinamposon - Naundang',
'loginlanguagelabel' => 'Pinulongan: $1',
'suspicious-userlogout' => 'Waray ka tugoti pag-logout tungod nga baga ini ginpadangat hin usa nga broken browser o caching proxy.',
+'createacct-another-realname-tip' => 'Ada la ha imo kun karuyag mo igbutang an imo tinuod nga ngaran.
+Kun pinili mo ito ighatag, gagamiton ini paghatag hin atribusyon ha gumaramit para hit ira buhat.',
# Email sending
'php-mail-error-unknown' => 'Waray kasabti ha kanan PHP mail() function.',
@@ -592,8 +641,7 @@ Para mahuman paglalog-on, kinahanglan mo magbutang hin bag-o nga tigaman-panakob
'newpassword' => 'Bag-o nga tigaman-pagsulod:',
'retypenew' => 'Utroha pagbutang an bag-o nga tigaman-pagsulod:',
'resetpass_submit' => 'Igbutang an password ngan log in',
-'resetpass_success' => 'Malinamposon nga nasalyuan na an imo tigaman-pagsulod!
-Ikaw in naglalog-in yana...',
+'changepassword-success' => 'Malinamposon an pagbal-iw hit imo tigaman-panakob!',
'resetpass_forbidden' => 'Diri mababalyoan an mga tigaman-pagsulod',
'resetpass-no-info' => 'Kinahanglan mo paglog-in para direkta ka makasakob dinhi nga pakli.',
'resetpass-submit-loggedin' => 'Igbal-iw an tigaman-pagsulod',
@@ -605,9 +653,11 @@ Imo malinamposon nga ginsalyuan an imo tigaman-panakob o umaro ka na hin bag-o n
# Special:PasswordReset
'passwordreset' => 'igreset an tigaman-hit-pagsulod',
-'passwordreset-text' => 'Kumpletoha ini nga porma para makareset han imo password.',
+'passwordreset-text-one' => 'Kompletoha ini nga porma paramakareset hin imo tigaman-panakob.',
+'passwordreset-text-many' => '{{PLURAL:$1|Butanga ha usa nga mga surodlan para mareset iton imo tigaman-panakob.}}',
'passwordreset-legend' => 'igreset an tigaman-hit-pagsulod',
'passwordreset-disabled' => 'Waray ginpaandar an password reset hini nga wiki.',
+'passwordreset-emaildisabled' => 'Mga mga higamit ha email in waray pinaandar hini nga wiki.',
'passwordreset-username' => 'Agnay hiton gumaramit:',
'passwordreset-domain' => 'Dominyo:',
'passwordreset-capture' => 'Kikitaon mo an resulta nga e-mail?',
@@ -618,7 +668,7 @@ Imo malinamposon nga ginsalyuan an imo tigaman-panakob o umaro ka na hin bag-o n
Temporaryo nga tigaman han pagsakob: $2',
'passwordreset-emailsent' => 'Ginpadangat an password reset email.',
'passwordreset-emailsent-capture' => 'Ginpadangat an password reset email, nga ginpakita ha ubos.',
-'passwordreset-emailerror-capture' => 'Mayda pahinumdom nga e-mail han nahimo, kun diin ini in ginpapakita ha ubos, pero pakyas an pagpadangat ngada ha gumaramit: $1',
+'passwordreset-emailerror-capture' => 'Ginhimo an password reset email, kun diin nakikita ha ubos, pero pakyas an pagpadara ha {{GENDER:$2|gumaramit}}: $1',
# Special:ChangeEmail
'changeemail' => 'Igliwan an e-mail address',
@@ -632,6 +682,18 @@ Temporaryo nga tigaman han pagsakob: $2',
'changeemail-submit' => 'Igbalyo an e-mail',
'changeemail-cancel' => 'Pasagdi',
+# Special:ResetTokens
+'resettokens' => 'Igrest an mga token',
+'resettokens-text' => 'Puydi nimo mareset an mga token para makahatag hin pipira nga pribado nga datos nga may pakahisumpay ha imo akawnt dinhi.
+Kinahanglan mo ini buhaton kun aksidenti nim nasaro hira ha iba nga tawo o an imo akawnt in nakompromiso.',
+'resettokens-no-tokens' => 'Waray token nga marereset.',
+'resettokens-legend' => 'Igreset an mga token',
+'resettokens-tokens' => 'Mga token:',
+'resettokens-token-label' => '$1 (yana nga balor: $2)',
+'resettokens-watchlist-token' => 'Token para han web feed (Atom/RSS) han[[Special:Watchlist|mga pagbag-o ha imo pakli han talaan-barantayon]]',
+'resettokens-done' => 'Narest an mga token.',
+'resettokens-resetbutton' => 'Igreset an pinili nga mga token',
+
# Edit page toolbar
'bold_sample' => 'dakmola an agi',
'bold_tip' => 'Dakmola an agi',
@@ -764,6 +826,7 @@ An taramdan han pagpara ngan pagbalhin para han pakli in ginhahatag ha ubos para
'log-fulllog' => 'Kitaa an bug-os nga taramdan',
'edit-conflict' => 'Diri pagkakauroyon han pagliwat.',
'edit-no-change' => 'Ginpabay-an an im pagliwat, mahitungod nga waray pagbalyo nga nabuhat ha nakasurat.',
+'postedit-confirmation' => 'Natipig an imo ginliwat.',
'edit-already-exists' => 'Diri nakakahimo hin bag-o nga pakli.
Aada na ito.',
'defaultmessagetext' => 'Aada-nga-daan nga teksto han mensahe',
@@ -787,6 +850,7 @@ Ini nga mga argumento in ginlaktawan.",
# "Undo" feature
'undo-norev' => 'An pagliwat in diri mapapawaray-buhat tungod waray ito dida o napara na.',
'undo-summary' => 'Ginpawara-buhat an rebisyon nga $1 ni [[Special:Contributions/$2|$2]] ([[User talk:$2|himangrawi]])',
+'undo-summary-username-hidden' => 'Igpawara-an-ginbuhat nga rebisyon $1 han uska tago nga gumaramit',
# Account creation failure
'cantcreateaccounttitle' => 'Diri makakahimo hin akawnt',
@@ -885,6 +949,7 @@ Diri mo ini malalabtan.',
'lineno' => 'Bagis $1:',
'compareselectedversions' => 'Igkumpara an mga pinili nga pagbabag-o',
'editundo' => 'Igpawara an ginbuhat',
+'diff-empty' => '(Waray pagkakaiba)',
'diff-multi' => '({{PLURAL:$1|Usa nga panbutnga nga pagbag-o|$1 nga panbutnga nga pagbag-o}} ni {{PLURAL:$2|usa nga gumaramit|$2 nga mga gumaramit}} waray ginpakita)',
'diff-multi-manyusers' => '({{PLURAL:$1|Uska sapit-nahiuna nga rebisyon|$1 nga mga sapit-nanhiuna nga rebisyon}} nga may labaw nga $2 {{PLURAL:$2|gumaramit|mga gumaramit}} in diri ginpapakita)',
@@ -907,7 +972,6 @@ Diri mo ini malalabtan.',
'searchmenu-legend' => 'Mga pagpipilian han pamiling',
'searchmenu-exists' => "'''May-ada pakli nga nakangaran hin \"[[:\$1]]\" hini nga wiki.'''",
'searchmenu-new' => "'''Himoa an pakli \"[[:\$1]]\" hini nga wiki!'''",
-'searchhelp-url' => 'Help:Sulod',
'searchmenu-prefix' => '[[Special:PrefixIndex/$1|Ig-browse an mga pakli gamit hini nga prefix]]',
'searchprofile-articles' => 'Mga unod nga pakli',
'searchprofile-project' => 'Mga Bulig ngan Proyekto nga pakli',
@@ -947,14 +1011,7 @@ Diri mo ini malalabtan.',
'searchdisabled' => '{{SITENAME}} nga pamiling in ginparong.
Pamilnga la anay pinaagi ha Google ha pagkayana.
Ginpapasabot nga an sulod han mga panudlok han {{SITENAME}} in bangin daan an.',
-
-# Quickbar
-'qbsettings' => 'Quickbar',
-'qbsettings-none' => 'Waray',
-'qbsettings-fixedleft' => 'Ginayad an wala',
-'qbsettings-fixedright' => 'Gin-ayad an to-o',
-'qbsettings-floatingleft' => 'Nalutaw pawala',
-'qbsettings-floatingright' => 'Nalutaw pato-o',
+'search-error' => 'May-ada sayop nga nahitabo samtang namimiling: $1',
# Preferences page
'preferences' => 'Mga karuyag',
@@ -987,7 +1044,6 @@ Ginpapasabot nga an sulod han mga panudlok han {{SITENAME}} in bangin daan an.',
'resetprefs' => 'Pabay-i an diri nakatipig nga mga pagbabag-o',
'restoreprefs' => 'Igbalik an ngatanan ngada nga aada-nga-daan nga settings (ha ngatanan nga mga bahin)',
'prefs-editing' => 'Ginliliwat',
-'prefs-edit-boxsize' => 'Kadako han bintana han pagliwat.',
'rows' => 'Mga rumbay pahigda:',
'columns' => 'Mga rumbay patindog:',
'searchresultshead' => 'Bilnga',
@@ -997,6 +1053,9 @@ Ginpapasabot nga an sulod han mga panudlok han {{SITENAME}} in bangin daan an.',
'recentchangesdays-max' => 'Pinakadamo $1 {{PLURAL:$1|ka adlaw|ka mga adlaw}}',
'recentchangescount' => 'Ihap han mga pagliwat nga igpapakita nga ginpasingada:',
'prefs-help-recentchangescount' => 'Ini in naglalakip han mga kabag-ohan nga pagliwat, mga kaagi han pakli, ngan mga talaan.',
+'prefs-help-watchlist-token2' => 'Ini in sekreto nga susi ngadto han web feed an imo talaan han binabantayan.
+Kun hin-o man it maaram hini in puyde bumasa han imo talaan han binabantayan, tungod hini ayaw ini igsaro ha iba.
+[[Special:ResetTokens|Pidlita ini kun kinahanglan mo igreset ini]].',
'savedprefs' => 'Gintipig an im karuyag.',
'timezonelegend' => 'Zona hin oras',
'localtime' => 'Oras nga lokal',
@@ -1026,7 +1085,6 @@ Ginpapasabot nga an sulod han mga panudlok han {{SITENAME}} in bangin daan an.',
'prefs-common-css-js' => 'Saro nga CSS/JavaScript para han ngatanan nga mga panit:',
'prefs-reset-intro' => 'Puydi nimo ini gamiton nga pakli para makareset han imo mga preperensya nga ginbutang nga daan han sityo. Diri ini puydi mapawaray-buhat.',
'prefs-emailconfirm-label' => 'Kompirmasyon han email:',
-'prefs-textboxsize' => 'Kadako han editing window',
'youremail' => 'E-mail:',
'username' => '{{HENERO:$1|Agnay hit gumaramit}}:',
'uid' => 'ID hit {{HENERO:$1|Gumaramit}}:',
@@ -1053,6 +1111,7 @@ An imo e-mail address in diri makikit-an kun an iba nga mga gumaramit in makonta
'prefs-signature' => 'Pirma',
'prefs-dateformat' => 'Batakan han petsa',
'prefs-advancedediting' => 'Abansado nga mga pagpipilian',
+'prefs-preview' => 'Pahiuna nga pakita',
'prefs-advancedrc' => 'Abansado nga mga pagpipilian',
'prefs-advancedrendering' => 'Abansado nga mga pagpipilian',
'prefs-advancedsearchoptions' => 'Abansado nga mga pagpipilian',
@@ -1060,7 +1119,9 @@ An imo e-mail address in diri makikit-an kun an iba nga mga gumaramit in makonta
'prefs-displayrc' => 'Mga pirilion hiunong han ginpapakita',
'prefs-displaysearchoptions' => 'Mga pirilion hiunong han ginpapakita',
'prefs-displaywatchlist' => 'Mga pirilion hiunong han ginpapakita',
+'prefs-tokenwatchlist' => 'Token',
'prefs-diffs' => 'Mga kaibhan',
+'prefs-help-prefershttps' => 'Ini nga preperensya in madulot ha sunod nimo nga paglog-in.',
# User preference: email validation using jQuery
'email-address-validity-valid' => 'E-mail address in baga puydi',
@@ -1136,6 +1197,9 @@ Diri ka gintutugotan pagliwat han mga katungod han gumaramit ha iba nga mga wiki
'right-editusercssjs' => 'Igliwat an kanan iba mga gumaramit nga mga paypay han CSS ngan JavaScript',
'right-editusercss' => 'Igliwat an kanan iba mga gumaramit nga mga paypay han CSS',
'right-edituserjs' => 'Iliwat an kanan iba mga gumaramit nga paypay han JavaScript',
+'right-viewmywatchlist' => 'Kitaa an imo kalugaringon nga talaan hin barantayon',
+'right-editmywatchlist' => 'Igliwat an imo talaan hin barantayon. Pasabot la nga an pipira ng abuhat in padayon nga madugang hin mga pakli bisan waray hini nga katungod.',
+'right-viewmyprivateinfo' => 'Kitaa an imo kalugaringon nga pribado nga datos (sugad han email address, tinuod nga ngaran)',
'right-import' => 'Man-aangbit hin mga pakli tikang ha iba nga mga wiki',
'right-importupload' => 'Man-aangbit hin mga pakli tikang ha uska paypay nga iginkarga-pasaka',
'right-mergehistory' => 'Igtampo an kaagi han mga pakli',
@@ -1218,7 +1282,6 @@ Diri ka gintutugotan pagliwat han mga katungod han gumaramit ha iba nga mga wiki
'recentchangeslinked-feed' => 'Mga may kalabotan nga binag-o',
'recentchangeslinked-toolbox' => 'Mga may kalabotan nga binag-o',
'recentchangeslinked-title' => "Mga pagbag-o kasumpay ha ''$1''",
-'recentchangeslinked-noresult' => 'Waray pagbabag-o ha mga nakasumpay nga pakli han ginhatag nga oras.',
'recentchangeslinked-summary' => "Ini nga taramdan hin pagbag-o nga lab-as nga hinimo ha mga pakli nga nakasumpay tikang a naka-specifico nga pakli (o ha api han uska specifico nga kaarangay).
Mga pakli ha [[Special:Watchlist|imo angay timan-an]] in naka-'''bold'''.",
'recentchangeslinked-page' => 'Ngaran han pakli:',
@@ -1338,7 +1401,6 @@ $1',
'http-read-error' => 'HTTP maysayop ha pagbasa.',
'http-timed-out' => 'Naubosan hin oras ha pagpaalayon ha HTTP.',
'http-curl-error' => 'May sayop ha pagkuha hin URL: $1',
-'http-host-unreachable' => 'Diri nakakaabot ha URL.',
# Some likely curl errors. More could be added from <http://curl.haxx.se/libcurl/c/libcurl-errors.html>
'upload-curl-error6' => 'Diri nakakaabot ha URL',
@@ -1356,6 +1418,8 @@ $1',
'listfiles_user' => 'Nagamit',
'listfiles_size' => 'Kadako',
'listfiles_count' => 'Mga bersyon',
+'listfiles-latestversion-yes' => 'Oo',
+'listfiles-latestversion-no' => 'Diri',
# File description page
'file-anchor-link' => 'Paypay',
@@ -1423,6 +1487,9 @@ An paglaladawan han iya [$2 fayl han paglaladawan nga pakli] didto in ginpapakit
# Random page
'randompage' => 'Bisan ano nga pakli',
+# Random page in category
+'randomincategory-selectcategory-submit' => 'Pakadto',
+
# Random redirect
'randomredirect' => 'Bisan ano la nga redirect',
'randomredirect-nopages' => 'Waray mga redirecta ha ngaran-lat\'ang nga "$1".',
@@ -1447,9 +1514,6 @@ An paglaladawan han iya [$2 fayl han paglaladawan nga pakli] didto in ginpapakit
'statistics-users-active-desc' => 'Mga gumaramit nga may-ada iginbuhat ha urhi nga {{PLURAL:$1|ka adlaw|$1 ka mga adlaw}}',
'statistics-mostpopular' => 'Gidamoi nga ginpanginanohan nga mga pakli',
-'disambiguations' => 'Mga pakli nga nasumpay ha mga pansayod nga pakli',
-'disambiguationspage' => 'Template:pansayod',
-
'pageswithprop-submit' => 'Kadto-a',
'doubleredirects' => 'Mga doble nga redirekta',
@@ -1734,7 +1798,7 @@ $1',
'contributions' => 'Mga ámot ni {{GENDER:$1|User}}',
'contributions-title' => 'Mga amot han gumaramit para ha $1',
'mycontris' => 'Mga ámot nakon',
-'contribsub2' => 'Para ha $1 $2',
+'contribsub2' => 'Para {{HENERO:$3|$1}} ($2)',
'uctop' => '(yana)',
'month' => 'Tikang ha bulan (ngan uruunhan):',
'year' => 'Tikang ha tuig (ngan uruunhan):',
@@ -1835,8 +1899,6 @@ Tanggala an pagpugong $1',
'block-log-flags-nousertalk' => 'diri makakaliwat hit kalugaringon nga hiruhimangraw nga pakli',
'block-log-flags-hiddenname' => 'nakatago an agnay-hit-gumaramit',
'ipb_already_blocked' => '"$1" in ginpugngan na',
-'blockme' => 'Pugngi ako',
-'proxyblocksuccess' => 'Human na.',
'ipbnounblockself' => 'Diri ka gintutugotan hin pagtanggal hit pagpugong ha kalugaringon',
# Developer tools
@@ -2016,6 +2078,7 @@ Makikit-an nimo an ginkuhaaan',
'tooltip-undo' => '"Igpawara an ginbuhat (undo)" in nagbabalik hinin nga pagliwat ngan nabuklad hin pagliwat nga porma ha pahiuna-nga-paggawas nga kahimtang. Natugot liwat pagdugang hin katadungan ha dinalikyat nga sumat.',
'tooltip-preferences-save' => 'Tipiga an mga karuyag',
'tooltip-summary' => 'Pagbutang hin dalikyat nga sumat',
+'tooltip-iwiki' => '$1 – $2',
# Attribution
'siteuser' => '{{SITENAME}} gumaramit $1',
@@ -2129,7 +2192,7 @@ An iba in daan nakatago.
* gpsngalongitud
* gpsngaaltitud',
-# EXIF tags
+# Exif tags
'exif-imagewidth' => 'Kahaluag',
'exif-imagelength' => 'Kahitaas',
'exif-ycbcrpositioning' => 'Pagpoposisyon han Y ngan C',
@@ -2389,11 +2452,6 @@ An iba in daan nakatago.
'version-entrypoints-header-entrypoint' => 'Surudlan',
'version-entrypoints-header-url' => 'URL',
-# Special:FilePath
-'filepath' => 'Aragian han paypay',
-'filepath-page' => 'Paypay:',
-'filepath-submit' => 'Kadto-a',
-
# Special:FileDuplicateSearch
'fileduplicatesearch' => 'Pamiling hin nadoble nga mga paypay',
'fileduplicatesearch-legend' => 'Pamiling hin nadoble',
diff --git a/languages/messages/MessagesWo.php b/languages/messages/MessagesWo.php
index 3ab66399..092ea9d4 100644
--- a/languages/messages/MessagesWo.php
+++ b/languages/messages/MessagesWo.php
@@ -110,9 +110,6 @@ $messages = array(
'tog-shownumberswatching' => 'Wone limu jëfandikukat yiy topp wii xët',
'tog-oldsig' => 'Wonendig xaatim gi teew:',
'tog-fancysig' => 'Soppi sa xaatim (du am lëkkalekaay bu boppu)',
-'tog-externaleditor' => 'Jëfandikoo soppikaay bu biti saa su ne',
-'tog-externaldiff' => 'Jëfandiku ab méngalekaay bu biti saa su ne (ngir jëfandikukat yu xarale yi rekk, dafa laaj yenn kocc-koccal yi ci sa nosukaay)',
-'tog-showjumplinks' => 'Doxalal lëkkalekaay yii di « joowin » ak « seet »',
'tog-uselivepreview' => 'Jëfandikul wonendi gu gaaw gi (JavaScript)',
'tog-forceeditsummary' => 'Wax ma ko suma mottaliwul koju coppite bi',
'tog-watchlisthideown' => 'Nëbb samay coppite ci limu toppte bi',
@@ -301,7 +298,7 @@ Taaxiirlul ba ci kanam nga jéemaat.
$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).
+# 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).
'aboutsite' => 'Ci mbiri {{SITENAME}}',
'aboutpage' => 'Project:Ci mbiri',
'copyright' => 'Ëmbit laa ngi jàppandi ci $1.',
@@ -311,7 +308,6 @@ $1',
'disclaimers' => 'Ay aartu',
'disclaimerpage' => 'Project:Aartu yu daj',
'edithelp' => 'Ndimbal',
-'edithelppage' => 'Help:Nooy soppee aw xët',
'helppage' => 'Help:Ndimbal',
'mainpage' => 'Xëtu Njëlbéen',
'mainpage-description' => 'Xët wu njëkk',
@@ -382,17 +378,6 @@ Ab limu xëti jagleel yépp, ma nees na koo gis ci [[Special:SpecialPages|{{int:
# General errors
'error' => 'Njuumte',
'databaseerror' => 'Njuumtey dàttub njoxe bi',
-'dberrortext' => '�Njuumtey mbindin ci laaj bi nga yónne dàttub njoxe bi.
-Man na nekk it ab njuumte ci tëriin bi.
-Laaj bees mujje yónne ci dàttub njoxe bi moo doonoon:
-<blockquote><tt>$1</tt></blockquote>.
-bàyyikoo ci bii solo « <tt>$2</tt> ».
-Dàttub njoxe bee delloo bii njuumte « <tt>$3 : $4</tt> ».',
-'dberrortextcl' => 'Ab laajub dàttub njoxe bi jur na njuumte.
-Laaj bees mujje yónne dàttub njoxe bi moo doon :
-« $1 »
-bàyyikoo ci bii solo « $2 ».
-Dàttub njoxe bi delloo bii njuumte « $3 : $4 ».',
'laggedslavemode' => 'Moytul, wii xët man naa bañ a man dékku coppite yi ñu mujjee def',
'readonly' => 'Dàttub njoxe bi dañu koo caabi',
'enterlockreason' => 'Biralal ngirtey tëj gi ak diir bi mu war a amee',
@@ -434,7 +419,6 @@ Laaj : $2',
'viewsourcetext' => 'Man ngaa xool te duppi li nekk ci bii jukki ngir man cee liggéey :',
'protectedinterface' => 'Xët wii dafa am ay mbind yu bokk ci jokkalekaayu tëriin wi, moo tax ñu caabi ko ngir bañ ku ci ëppal.',
'editinginterface' => "'''Moytul''': mbindu xët wii dafa bokk ci jokkalekaayu tëriin bi. Bépp coppite boo ci def day feeñ ci bataaxal yi yeneen jëfandikukat yi di gis. Ngir tekki yi ñu lay ñaan nga dem ci [//translatewiki.net/wiki/Main_Page?setlang=wo translatewiki.net] di am sémb ngir bennal bataaxal yi.",
-'sqlhidden' => '(Laaju SQL nëbbu na)',
'cascadeprotected' => 'Xët wii dañ kaa aar ndaxte daa ëmbu ci {{PLURAL:$1|xët wi toftal|xët yi toftal}}, di yu ñu aar :
$2',
'namespaceprotected' => "Amoo sañ-sañu soppi xët yi ne ci bii barabu tur « '''$1''' ».",
@@ -529,7 +513,7 @@ Ngalla néggandikul ab diir door a jéemaat.',
'newpassword' => 'Baatujàll bu bees :',
'retypenew' => 'Bindaatal baatujàll bu bees bi :',
'resetpass_submit' => 'Soppil baatujàll bi te dugg',
-'resetpass_success' => 'Coppiteeg baatujàll bi antu na : Yaa ngi dugg...',
+'changepassword-success' => 'Coppiteeg baatujàll bi antu na : Yaa ngi dugg...',
'resetpass_forbidden' => 'Baatujàll bi manoo kaa soppi',
'resetpass-no-info' => 'faaw nga dugg ngir man a jot ci wii xët.',
'resetpass-submit-loggedin' => 'Soppi baatujàll bi',
@@ -882,7 +866,6 @@ Soo jëfandikoo lëkkalekaayu joow yi day neenal boyot yi nga jotoon a fal.',
'searchmenu-legend' => 'Tànneefi ceet',
'searchmenu-exists' => "'''wenn xët wu tudd « [[:$1]] » moo am ci bii wiki'''",
'searchmenu-new' => "'''Sosal xët wii di « [[:$1|$1]] » ci bii wiki !'''",
-'searchhelp-url' => 'Help:Ndimbal',
'searchmenu-prefix' => '[[Special:PrefixIndex/$1|Xoolal xët wi tambalee nii]]',
'searchprofile-articles' => 'Xëti ëmbiit',
'searchprofile-project' => 'Xëti Ndimbal ak Sémb',
@@ -924,14 +907,6 @@ Jéemala bindaale ''all'' ngir seet ci biir ëmbit gépp (boolewaale ci xëti wa
'search-external' => 'Ceet gu biti',
'searchdisabled' => 'Ceet gi ci {{SITENAME}} doxul. Ci négandiku doxal gi, man nga seet ci Google. Jàppal ne, xéj-na ëmbiti {{SITENAME}} gi ci bii seetukaay yeesaluñ leen.',
-# Quickbar
-'qbsettings' => 'Banqaasu jumtukaay',
-'qbsettings-none' => 'Kenn',
-'qbsettings-fixedleft' => 'Cammooñ',
-'qbsettings-fixedright' => 'Ndijoor',
-'qbsettings-floatingleft' => 'Ci cammooñ',
-'qbsettings-floatingright' => 'Ci ndijoor',
-
# Preferences page
'preferences' => 'Tànneef',
'mypreferences' => 'Samay tànneef',
@@ -956,7 +931,6 @@ Jéemala bindaale ''all'' ngir seet ci biir ëmbit gépp (boolewaale ci xëti wa
'resetprefs' => 'Loppanti tànneef yi',
'restoreprefs' => 'Delloo say tànneef nañu meloon ca sag mbindu',
'prefs-editing' => 'Boyotu coppite',
-'prefs-edit-boxsize' => 'Dayoo palanteeru coppite bi.',
'rows' => 'Rëdd:',
'columns' => 'Kenu :',
'searchresultshead' => 'Seet',
@@ -993,7 +967,6 @@ Jéemala bindaale ''all'' ngir seet ci biir ëmbit gépp (boolewaale ci xëti wa
'prefs-custom-js' => 'JavaScript yees jëmmal',
'prefs-reset-intro' => 'Man ngaa jëfandikoo wii xët ngir delloowaat coppitey say tànneef delloo leen ci yi dal bi wàccaale. Doo ko man a neenal.',
'prefs-emailconfirm-label' => 'Dëggalug sa m-bataaxal :',
-'prefs-textboxsize' => 'Dayoob palanteerub coppite bi',
'youremail' => 'Sa màkkaanub m-bataaxal :',
'username' => 'Turu jëfandikukat :',
'uid' => 'Limu Jëfandikukat :',
@@ -1206,7 +1179,6 @@ Jéemala bindaale ''all'' ngir seet ci biir ëmbit gépp (boolewaale ci xëti wa
'recentchangeslinked-feed' => 'Coppite yi ko ñeel',
'recentchangeslinked-toolbox' => 'Coppite yi ko ñeel',
'recentchangeslinked-title' => 'Coppite yi ñeel $1',
-'recentchangeslinked-noresult' => 'Benn coppite amul ci xët yi mu lëkkalool ci diir bi nga wax.',
'recentchangeslinked-summary' => "Wii xëtu jagleel moo lay won coppite yu mujj ci xët yi lëkkalook wii. Xët yi ci sa [[Special:Watchlist|limu toppte]] ñoo '''duuf'''.",
'recentchangeslinked-page' => 'Turu xët wi :',
'recentchangeslinked-to' => 'Wone coppite yi ñeel xët yi lëkkalook xët wi nga joxe',
@@ -1396,12 +1368,6 @@ Bul fattee seet baxam amul yeneen lëkkalekaay yu lay jëmale ci royuwaay yi bal
'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}}',
'statistics-mostpopular' => 'Xët yees gën a saytu',
-'disambiguations' => 'Xëti turandoo',
-'disambiguationspage' => 'Template:turandoo',
-'disambiguations-text' => "Xët yii di toftal dañoo ëmb ay lëkkalekaay yuy jëme ciy '''xëti turandoo'''.
-Dañoo waroon a jublu ci jukki yu baax. <br />
-Xëti turandoo yi ñooy yi ëmb benn ci royuwaay yees def fii [[MediaWiki:Disambiguationspage]]",
-
'doubleredirects' => 'Jubluwaat ñaari yoon',
'doubleredirectstext' => "Wii xët dafa ëmb mbooleem xët yees jubluwaatal ci yeneen xëti jubluwaat.
Rëdd wu ne am na lëkkalekaay buy jëme ci bu njëkk ak ñaareelu jubluwaat bi, ak rëdduw mbind wu njëkk wu ñaareelu jubluwaat bi, biy ëmb xëtu jëmuwaay wu ''baax'' wi, wi jubluwaat bu njëkk bi war a jublu moom itam.",
@@ -1602,9 +1568,8 @@ Coppite yiy ñëw yu xët wi ak xëtu waxtaanuwaay wi mu àndal di nañu leen fa
'watchthispage' => 'Topp xët wii',
'unwatch' => 'Bul toppati',
'unwatchthispage' => 'Bul toppati',
-'watchnochange' => 'Lenn ci xët yi ngay topp soppikuwul ci diir bii',
'watchlist-details' => 'Topp nga $1 {{PLURAL:$1|xët|ciy xët}}, soo waññiwaalewul xëti waxtaanuwaay yi.',
-'wlheader-showupdated' => '* Xët yi ñu soppiwoon ca sa duggu bu mujj ñoom la ñu fesal ñu <b>xëm</b>',
+'wlheader-showupdated' => 'Xët yi ñu soppiwoon ca sa duggu bu mujj ñoom la ñu fesal ñu <b>xëm</b>',
'watchmethod-recent' => 'saytug coppite yu mujj yu xët yi ngay topp',
'watchmethod-list' => 'saytug xët yi ñuy topp ngir ay coppite yu mujj',
'watchlistcontains' => "Sa limu toppte am na '''$1''' {{PLURAL:$1|xët|xët}}.",
@@ -1885,11 +1850,8 @@ Dangaa bëgg a soppi anam yi?',
'ipb_cant_unblock' => 'Njuumte: téyeg $1 gisuwul. Xéj-na dañ kaa téyedi ba noppi.',
'ipb_blocked_as_range' => 'Njuumte: màkkaan mi $1 téyewuñ ko moom kase, kon doo ko man téyedi. Ci mbooloom $2 la bokk, faww nga téyedi mbooloo mépp.',
'ip_range_invalid' => 'Mbooloom IP mi baaxul.',
-'blockme' => 'Téye ma',
'proxyblocker' => 'Téyekatu yóbbantekat',
-'proxyblocker-disabled' => 'Bii solo doxul.',
'proxyblockreason' => 'Dañ téye sa IP ndax dadi ab yóbbantekat bu ubbeeku. Di la ñaan nga jublu ci sa ki la jox internet yegge ko jafe-jafeb kaaraange bi.',
-'proxyblocksuccess' => 'Jàll na.',
'sorbsreason' => 'Sa màkkaanu IP dañ ko limaale niki ab yóbbantekat bu ubbeeku ci DNSBL bi {{SITENAME}} di jëfandikoo.',
'sorbs_create_account_reason' => 'Sa màkkaanu IP dañ ko limaale niki ab yóbbantekat bu ubbeeku ci DNSBL bi {{SITENAME}} di jëfandikoo. Kon sag mbindu du mana nekk.',
'cant-block-while-blocked' => 'Manoo di téye yeneen jëfandikukat ci diir bi ñu la téye.',
@@ -2058,24 +2020,14 @@ Dafay tax nga man a bind ngirte li ci boyotu tënk bi.',
# Stylesheets
'common.css' => '/* CSS yiñ def fii dañuy am ay njeexit ci col yépp */',
-'standard.css' => '/* CSS yiñ def fii dañuy am ay njeexit ci jëfandikukatu col gu Standard */',
-'nostalgia.css' => '/* CSS yiñ def fii dañuy am ay njeexit ci jëfandikukatu col gu Nostalgia */',
'cologneblue.css' => '/* CSS yiñ def fii dañuy am ay njeexit ci jëfandikukatu col gu Cologne Blue */',
'monobook.css' => '/* CSS yiñ def fii dañuy am ay njeexit ci jëfandikukatu col gu Monobook. */',
-'myskin.css' => '/* CSS yiñ def fii dañuy am ay njeexit ci jëfandikukatu col gu MySkin */',
-'chick.css' => '/* CSS yiñ def fii dañuy am ay njeexit ci jëfandikukatu col gu Chick */',
-'simple.css' => '/* CSS yiñ def fii dañuy am ay njeexit ci jëfandikukatu col gu Simple */',
'modern.css' => '/* CSS yiñ def fii dañuy am ay njeexit ci jëfandikukatu col gu Modern */',
# Scripts
'common.js' => '/* Bépp JavaScript buñ fi duggal, xët yéppa koy yeb ak jëfandikukat bumu manti doon. */',
-'standard.js' => '/* Bépp JavaScript buñ fi duggal jëfandikukat yiy jëfandikoo col gu Standard keppa koy yeb */',
-'nostalgia.js' => '/* Bépp JavaScript buñ fi duggal jëfandikukat yiy jëfandikoo col gu Nostalgia keppa koy yeb */',
'cologneblue.js' => '/* Bépp JavaScript buñ fi duggal jëfandikukat yiy jëfandikoo col gu Cologne Blue keppa koy yeb */',
'monobook.js' => '/*Bépp JavaScript buñ fi duggal jëfandikukat yiy jëfandikoo col gu Monobook keppa koy yeb. */',
-'myskin.js' => '/* Bépp JavaScript buñ fi duggal jëfandikukat yiy jëfandikoo col gu MySkin keppa koy yeb */',
-'chick.js' => '/* Bépp JavaScript buñ fi duggal jëfandikukat yiy jëfandikoo col gu Chick keppa koy yeb */',
-'simple.js' => '/* Bépp JavaScript buñ fi duggal jëfandikukat yiy jëfandikoo col gu Simple keppa koy yeb*/',
'modern.js' => '/* Bépp JavaScript buñ fi duggal jëfandikukat yiy jëfandikoo col gu Modern keppa koy yeb */',
# Metadata
@@ -2136,7 +2088,7 @@ Lëkkalekaay yiy toftal, ci wenn rëdd wi, dees leen di jàppee nikiy sette, maa
* gpslongitude
* gpsaltitude',
-# EXIF tags
+# Exif tags
'exif-imagewidth' => 'Yaatuwaay',
'exif-imagelength' => 'Kawewaay',
'exif-usercomment' => 'Kadduy jëfëndikookat bi',
diff --git a/languages/messages/MessagesWuu.php b/languages/messages/MessagesWuu.php
index 5827ad91..69a4b97e 100644
--- a/languages/messages/MessagesWuu.php
+++ b/languages/messages/MessagesWuu.php
@@ -49,9 +49,6 @@ $messages = array(
'tog-shownumberswatching' => '顯示關注人數',
'tog-oldsig' => '能界签å先望:',
'tog-fancysig' => '畀簽å當wiki文本(弗自動éˆæŽ¥ï¼‰',
-'tog-externaleditor' => '默认使用外部编辑器(仅供高手使用,需è¦æ¥è®¸ç”µè„‘上作出特殊设置)',
-'tog-externaldiff' => '默认使用外部分æžï¼ˆä»…供高手使用,需è¦æ¥è®¸ç”µè„‘上作出特殊设置)',
-'tog-showjumplinks' => 'å¯ç”¨â€œè·³è½¬â€é“¾æŽ¥',
'tog-uselivepreview' => '用当场先望(试验)',
'tog-forceeditsummary' => 'ç·¨è¦ç©ºç™½åˆ°æ醒我',
'tog-watchlisthideown' => '關注表è£å›¥è„«æˆ‘所編',
@@ -64,6 +61,8 @@ $messages = array(
'tog-diffonly' => '比較兩版弗樣到弗顯示é å…§å®¹',
'tog-showhiddencats' => '顯示囥脫分類',
'tog-norollbackdiff' => '执行退回之åŽå¼—显示两样',
+'tog-useeditwarning' => '離開編é æœ†ä¿å­˜åˆ°æ醒我',
+'tog-prefershttps' => '登录åŽè€ä¸–用ä¿é™©è¿žæŽ¥',
'underline-always' => 'è€ä¸–',
'underline-never' => 'è€ä¸–å¼—',
@@ -127,6 +126,18 @@ $messages = array(
'oct' => '10月',
'nov' => '11月',
'dec' => '12月',
+'january-date' => '1月 $1',
+'february-date' => '2月 $1',
+'march-date' => '3月 $1',
+'april-date' => '4月 $1',
+'may-date' => '5月 $1',
+'june-date' => '6月 $1',
+'july-date' => '7月 $1',
+'august-date' => '8月 $1',
+'september-date' => '9月 $1',
+'october-date' => '10月 $1',
+'november-date' => '11月 $1',
+'december-date' => '12月 $1',
# Categories related messages
'pagecategories' => '$1个分类',
@@ -207,6 +218,7 @@ $messages = array(
'create-this-page' => '建箇é ',
'delete' => '刪',
'deletethispage' => '刪箇é ',
+'undeletethispage' => '弗删箇页',
'undelete_short' => '復原消脫個$1個編寫',
'viewdeleted_short' => '望̺$1个删脱编写',
'protect' => 'ä¿',
@@ -250,7 +262,7 @@ $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).
+# 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).
'aboutsite' => '有关{{SITENAME}}',
'aboutpage' => 'Project:有关',
'copyright' => '内容侪拉$1下底å‘布。',
@@ -260,7 +272,6 @@ $1',
'disclaimers' => '甮追å•',
'disclaimerpage' => 'Project:甮追å•',
'edithelp' => '编写帮助',
-'edithelppage' => 'Help:如何编辑页é¢',
'helppage' => 'Help:目录',
'mainpage' => 'å°é¢',
'mainpage-description' => 'å°é¢',
@@ -331,12 +342,12 @@ $1',
# General errors
'error' => '错误',
'databaseerror' => 'æ•°æ®åº“错误',
-'dberrortext' => 'å‘生仔数æ®åº“查询语法错误,作兴是软件自身个错误所引起个。压末一趟数æ®åº“查询指令是:
-<blockquote><tt>$1</tt></blockquote>
-æ¥è‡ªå‡½æ•°â€œ<tt>$2</tt>â€å†…。数æ®åº“返回错误“<tt>$3: $4</tt>â€ã€‚',
-'dberrortextcl' => 'å‘生了数æ®åº“查询语法错误。压末一趟数æ®åº“查询指令是:
-“$1â€
-æ¥è‡ªå‡½æ•°â€œ$2â€å†…。数æ®åº“返回错误“$3: $4â€ã€‚',
+'databaseerror-text' => '數據庫討信出錯。
+嘸數說明軟件è£æœ‰ä¸€å€‹bug。',
+'databaseerror-textcl' => '數據庫討信出錯。',
+'databaseerror-query' => '討信:$1',
+'databaseerror-function' => 'åŠŸèƒ½Ë $1',
+'databaseerror-error' => '出錯:$1',
'laggedslavemode' => '警告: 页é¢å¯èƒ½å¼—包å«æœ€è¿‘个更新。',
'readonly' => '數據庫鎖牢',
'enterlockreason' => '请输入é”定个原因,包括预计解é”个辰光',
@@ -368,6 +379,7 @@ $1',
'cannotdelete' => '无处删除页é¢æˆ–å›¾åƒ "$1"。
渠作兴已ç»æ‹¨åˆ«äººå®¶åˆ é™¤è„±å“‰ã€‚',
'cannotdelete-title' => '"$1"箇页删弗爻',
+'no-null-revision' => '"$1"页呒处建新个修改',
'badtitle' => 'å标题',
'badtitletext' => '所请求页é¢ä¸ªæ ‡é¢˜æ˜¯æ— æ•ˆä¸ªã€å¼—存在,跨语言或跨wiki链接个标题错误。渠作兴包å«ä¸€åªæˆ–多åªå¼—好用拉标题里å‘字符。',
'perfcached' => '下å‘是缓存数æ®ï¼Œå‘’数弗是最新个。 A maximum of {{PLURAL:$1|one result is|$1 results are}} available in the cache.',
@@ -385,12 +397,15 @@ $1',
'protectedinterface' => '箇页为箇维基个软件æ供界é¢æ–‡æœ¬ï¼Œé”牢定防乱用。
加改全部维基个译文,用[//translatewiki.net/ translatewiki.net],MediaWiki软件个本地化计划。',
'editinginterface' => "'''警告:''' 侬æ¥é‡Œç¼–写个页é¢æ˜¯ç•€è½¯ä»¶ç”¨ä¸ªç•Œé¢æ–‡æœ¬ã€‚箇页å˜åŒ–会影å“å„许人个界é¢æ ·å­ã€‚å‡ä½¿è¦ç•€å…¨éƒ¨ç»´åŸºç¿»è¯‘,用 [//translatewiki.net/wiki/Main_Page?setlang=zh-hans translatewiki.net],MediaWiki软件个本地化计划。",
-'sqlhidden' => '(SQL查询已éšè—)',
'cascadeprotected' => '箇åªé¡µé¢æ‹¨ä¿æŠ¤æ‹‰è®¸ï¼Œå› ä¸ºç®‡åªé¡µé¢æ‹¨ä¸‹åº•å·²ç»æ ‡æ³¨â€œè”é”ä¿æŠ¤â€ä¸ª{{PLURAL:$1|一åª|多åª}}被ä¿æŠ¤é¡µé¢åŒ…å«ï¼š
$2',
'namespaceprotected' => "侬无没编辑'''$1'''å字空间里å‘页é¢ä¸ªæƒé™ã€‚",
'customcssprotected' => '箇CSS页你呒处编,箇页有å„许用户个ç§äººè®¾ç½®ã€‚',
'customjsprotected' => '箇JavaScript页你呒处编,箇页有å„许用户个ç§äººè®¾ç½®ã€‚',
+'mycustomcssprotected' => '箇CSS页你呒处编。',
+'mycustomjsprotected' => '箇JavaScript页你呒处编。',
+'myprivateinfoprotected' => '你个ç§äººä¿¡æ¯ä½ å‘’处编。',
+'mypreferencesprotected' => '你个ç§äººå好你呒处编。',
'ns-specialprotected' => '特殊页编辑是弗æ¥ä¸‰ä¸ªã€‚',
'titleprotected' => "箇åªæ ‡é¢˜å·²ç»æ‹¨[[User:$1|$1]]ä¿æŠ¤ä»¥é˜²æ­¢åˆ›å»ºã€‚ç†ç”±æ˜¯''$2''。",
'filereadonlyerror' => '"$1"文件呒处改,文件存勒 "$2" 是åªè¯»æ¨¡å¼ã€‚管ç†å‘˜è€ƒè™‘畀渠é”牢个ç†ç”±æ˜¯ï¼š"$3"。',
@@ -412,9 +427,16 @@ $2',
'welcomecreation-msg' => '你个账å·å»ºèµ·æ¥å“‰ã€‚
覅忘记哉走去改你个[[Special:Preferences|{{SITENAME}}个ç§äººå好]]。',
'yourname' => '用户å:',
+'userlogin-yourname-ph' => '打进你侬个用户å',
+'createacct-another-username-ph' => '打进用户å',
'yourpassword' => '密ç :',
+'userlogin-yourpassword-ph' => '密ç æ‰“进去',
+'createacct-yourpassword-ph' => '密ç æ‰“进去',
'yourpasswordagain' => '密ç å†æ‰“一é:',
+'createacct-yourpasswordagain-ph' => '密ç æ‰“一éæ·»',
'remembermypassword' => '徕箇æµè§ˆå™¨é‡Œç•€æˆ‘登进去个记牢(记$1{{PLURAL:$1|æ—¥|æ—¥}})',
+'userlogin-remembermypassword' => '长期徕线里',
+'userlogin-signwithsecure' => '用ä¿é™©é“¾æŽ¥',
'yourdomainname' => '侬个域å:',
'password-change-forbidden' => '箇wikiè£å‘’处改你侬个密ç ã€‚',
'externaldberror' => '迭个作兴是由于验è¯æ•°æ®åº“错误或者侬拨ç¦æ­¢æ›´æ–°ä¾¬ä¸ªå¤–部账å·ã€‚',
@@ -426,17 +448,42 @@ $2',
'logout' => '登出',
'userlogout' => '登出',
'notloggedin' => '弗曾登录',
+'userlogin-noaccount' => 'è´¦å·è¿˜å‘’?',
+'userlogin-joinproject' => '加进{{SITENAME}}',
'nologin' => "你侬还呒有账å·ï¼Ÿ'''$1'''。",
'nologinlink' => '建新账å·',
'createaccount' => '建账å·',
'gotaccount' => "å·²ç»æœ‰ä»”å¸å·å“‰ï¼Ÿ '''$1'''。",
'gotaccountlink' => '登录',
'userlogin-resetlink' => '忘记登录细节?',
+'userlogin-resetpassword-link' => '转设密ç ',
+'helplogin-url' => '帮助Ë登进',
+'userlogin-helplink' => '[[{{MediaWiki:helplogin-url}}|登进帮忙]]',
+'userlogin-loggedin' => '你侬用{{GENDER:$1|$1}}登进æ¥å“‰ã€‚用下å‘个表以别样身份登进。',
+'userlogin-createanother' => '建别样账å·',
+'createacct-join' => '下å‘打进你侬个信æ¯ã€‚',
+'createacct-another-join' => '下å‘打进新账å·ä¸ªä¿¡æ¯ã€‚',
+'createacct-emailrequired' => '电å­ä¿¡åœ°å€',
+'createacct-emailoptional' => '电å­ä¿¡åœ°å€ï¼ˆå¡«å¼—填由你)',
+'createacct-email-ph' => '畀你侬个电å­ä¿¡åœ°å€æ‰“进去',
+'createacct-another-email-ph' => '电å­ä¿¡åœ°å€æ‰“进去',
'createaccountmail' => '用临时éšä¾¿å¯†ç å‘到指定个电å­ä¿¡åœ°å€',
+'createacct-realname' => '真å字(éšæ„)',
'createaccountreason' => 'ç†ç”±ï¼š',
+'createacct-reason' => 'ç†ç”±ï¼š',
+'createacct-reason-ph' => '为何物建别样账å·',
+'createacct-captcha' => 'ä¿é™©æ£€æŸ¥',
+'createacct-imgcaptcha-ph' => '畀上å‘望ç€ä¸ªå­—打箇里',
+'createacct-submit' => '建你侬个账å·',
+'createacct-another-submit' => '建别样账å·',
+'createacct-benefit-heading' => '{{SITENAME}} 是æ­ä½ ä¾¬æ ·ä¸ªäººå»ºèµ·ä¸ªã€‚',
+'createacct-benefit-body1' => '{{PLURAL:$1|编写}}',
+'createacct-benefit-body2' => '{{PLURAL:$1|页}}',
+'createacct-benefit-body3' => '此垡 {{PLURAL:$1|出力个人}}',
'badretype' => '倷输入个密ç æ­å€ªä¸ªæ¡£æ¡ˆå¼—é…。',
'userexists' => '用戶å有人用哉。相勞爾æ€åˆ¥æ¨£å字。',
'loginerror' => '登录错误',
+'createacct-error' => '建账å·å‡ºé”™',
'createaccounterror' => '无法建立账户:$1',
'nocookiesnew' => '侬个账户创建æˆåŠŸï¼Cookiesåƒç…žæ‹¨ä¾¬å…³æ‹‰è®¸ï¼Œè¯·å¼€å¼€æ¥å†ç™»å½•ã€‚',
'nocookieslogin' => '本站利用Cookies进行用户登录,侬个Cookiesåƒç…žå…³æ‹‰è®¸ï¼Œè¯·å¼€å¼€æ¥å†ç™»å½•ã€‚',
@@ -486,8 +533,8 @@ $2',
如果箇个账户创建错误个说è¯ï¼Œä¾¬å¯ä»¥å¿½ç•¥æ­¤ä¿¡æ¯ã€‚',
'usernamehasherror' => '用户å里å‘弗好包å«hash字符',
-'login-throttled' => '登录å°è¯•å¿’多哉。
-请等脱歇å†è¯•ã€‚',
+'login-throttled' => '你侬试登忒多次哉。
+ç­‰ $1 å†è¯•è¯•å‡‘相。',
'login-abort-generic' => '登录弗æˆåŠŸ - æµäº§',
'loginlanguagelabel' => '语言:$1',
'suspicious-userlogout' => '侬登出个è¦æ±‚å·²ç»æ‹¨å›žå¤´è„±ï¼Œå› ä¸ºæ¸ å¯èƒ½æ˜¯ç”±å·²æŸå个æµè§ˆå™¨æˆ–者缓存代ç†ä¼ é€ä¸ªã€‚',
@@ -500,8 +547,8 @@ $2',
'newpassword' => '新密ç :',
'retypenew' => 'å†æ‰“一é新密ç :',
'resetpass_submit' => '设置密ç å†ç™»å½•',
-'resetpass_success' => '密ç ä¿®æ”¹æˆåŠŸï¼
-现在垃许登录...',
+'changepassword-success' => '密碼改好哉ï¼
+能界登錄當中...',
'resetpass_forbidden' => '密ç å¼—好更改',
'resetpass-no-info' => '侬必须登录仔å†å¥½ç›´æŽ¥è¿›å…¥ç®‡åªé¡µé¢ã€‚',
'resetpass-submit-loggedin' => '更改密ç ',
@@ -900,7 +947,6 @@ $1",
'searchmenu-legend' => 'æœç´¢é€‰é¡¹',
'searchmenu-exists' => "'''箇wiki里有一页å字“[[:$1]]â€å“‰'''",
'searchmenu-new' => "'''徕箇wiki里建“[[:$1]]â€é¡µï¼'''",
-'searchhelp-url' => 'Help:目录',
'searchmenu-prefix' => '[[Special:PrefixIndex/$1|æµè§ˆå¸¦ç®‡åªå‰ç¼€ä¸ªé¡µé¢]]',
'searchprofile-articles' => '内容页',
'searchprofile-project' => '帮助æ­é¡¹ç›®é¡µ',
@@ -942,14 +988,6 @@ $1",
'search-external' => '外部æœç´¢',
'searchdisabled' => '{{SITENAME}}个æœç´¢å·²ç¦ç”¨ã€‚侬å¯ä»¥æš‚时使用Googleæœç´¢ï¼Œé¡»æ³¨æ„渠拉索引个{{SITENAME}}内容作兴会过时。',
-# Quickbar
-'qbsettings' => '快速导航排',
-'qbsettings-none' => 'å‘’',
-'qbsettings-fixedleft' => '左许固定',
-'qbsettings-fixedright' => 'å³è®¸å›ºå®š',
-'qbsettings-floatingleft' => '左许氽移',
-'qbsettings-floatingright' => 'å³è®¸æ°½ç§»',
-
# Preferences page
'preferences' => 'å好',
'mypreferences' => 'å好设定',
@@ -977,7 +1015,6 @@ $1",
'resetprefs' => '清除弗曾ä¿å­˜ä¸ªæ›´æ”¹',
'restoreprefs' => 'å¤åŽŸå…¨éƒ¨é»˜è®¤è®¾å®š',
'prefs-editing' => '编辑',
-'prefs-edit-boxsize' => '编辑框尺寸',
'rows' => '行:',
'columns' => '列:',
'searchresultshead' => 'æœç´¢',
@@ -987,7 +1024,6 @@ $1",
'recentchangesdays-max' => '最长 $1 日',
'recentchangescount' => '默认显示个编辑数:',
'prefs-help-recentchangescount' => '箇个包括近段辰光个改动ã€é¡µé¢åŽ†å²ä»¥åŠæ—¥å¿—。',
-'prefs-help-watchlist-token' => 'æ­¤æ å¡«å†™ä¸ªå¯†é’¥å¯ä»¥ç”Ÿæˆä¾¬ç›‘视列表个RSSæºã€‚任何知晓本æ å¯†é’¥ä¸ªäººä¾ªå¥½é˜…读侬个监视列表,因此请使用安全数值。箇æ­å·²æ供一åªéšæœºç”Ÿæˆä¸ªæ•°å€¼ä¾›ä¾¬æŒ‘拣:$1',
'savedprefs' => '倷个å好已ç»ä¿å­˜å“‰ã€‚',
'timezonelegend' => '时区:',
'localtime' => '当地辰光:',
@@ -1054,6 +1090,7 @@ $1",
'right-reupload' => '文件以舊æ›æ–°',
'right-delete' => '刪é é¢',
'right-browsearchive' => 'æœå°‹å·²åˆªé ',
+'right-viewmywatchlist' => '望自己個關注表',
'right-sendemail' => '發郵件畀å„許人',
# Special:Log/newusers
@@ -1083,9 +1120,14 @@ $1",
'action-userrights-interwiki' => '編用戶徠å„許維基個權',
'action-siteadmin' => '數據庫鎖牢è¦å‹¿é–‹éŽ–',
'action-sendemail' => '發郵件',
+'action-editmywatchlist' => '編關注表',
+'action-viewmywatchlist' => '望關注表',
+'action-viewmyprivateinfo' => '望ç§äººä¿¡æ¯',
+'action-editmyprivateinfo' => 'ç·¨ç§äººä¿¡æ¯',
# Recent changes
'nchanges' => '$1趟更改',
+'enhancedrc-history' => 'æ­·å²',
'recentchanges' => '箇阶段个å˜åŒ–',
'recentchanges-legend' => '箇阶段个å˜åŒ–选项',
'recentchanges-summary' => '登该个页é¢æµªè·Ÿè¸ªæœ€è¿‘对维基百科个改动。',
@@ -1200,6 +1242,8 @@ $1",
'listfiles_user' => '用户',
'listfiles_size' => '尺寸 (bytes)',
'listfiles_description' => 'æè¿°',
+'listfiles-latestversion-yes' => '正是',
+'listfiles-latestversion-no' => '弗是',
# File description page
'file-anchor-link' => '文件',
@@ -1252,6 +1296,10 @@ $1",
# Random page
'randompage' => 'éšä¾¿æœ›æœ›',
+# Random page in category
+'randomincategory' => '分類è£å€‹éš¨ä¾¿ä¸€é ',
+'randomincategory-selectcategory-submit' => '去',
+
# Statistics
'statistics' => '统计',
'statistics-header-users' => '用户资料',
@@ -1497,7 +1545,6 @@ $1",
'blocklogtext' => '箇是用戶å°æ­è§£å°æ“作個記錄。自動å°å€‹IP地å€å¼—排。到[[Special:BlockList|IP å°è¡¨]]è£æœ›ç›®å‰ç”Ÿæ•ˆå€‹å°è¡¨ã€‚',
'unblocklogentry' => '$1å·²ç»æ‹¨è§£å°',
'block-log-flags-nocreate' => '建账å·ç¦ç”¨å“‰',
-'proxyblocksuccess' => '好哉。',
# Developer tools
'lockdb' => '鎖數據庫',
@@ -1618,6 +1665,7 @@ $1",
'tooltip-rollback' => 'æ¿ä¸€è®°â€œå›žè½¬â€å°±å›žé€€åˆ°ä¸Šä¸€ä½è´¡çŒ®è€…个编辑状æ€',
'tooltip-undo' => '“撤销â€å¯ä»¥æ¢å¤è¯¥ç¼–辑并且垃拉预览模å¼ä¸‹å¤´æ‰“开编辑表å•ã€‚渠å…许垃拉摘è¦é‡Œå‘说明原因。',
'tooltip-summary' => '打进短摘è¦',
+'tooltip-iwiki' => 'Ì©$1 - $2',
# Attribution
'anonymous' => '{{SITENAME}}浪个匿å用户',
@@ -1676,7 +1724,7 @@ Variants for Chinese language
* gpslongitude
* gpsaltitude',
-# EXIF tags
+# Exif tags
'exif-artist' => '作者',
'exif-componentsconfiguration-0' => '弗存在',
@@ -1770,14 +1818,16 @@ $5
# Special:Version
'version' => '版本',
-# Special:FilePath
-'filepath' => '文件路径',
-'filepath-page' => '文件:',
-'filepath-submit' => '路径',
-
# Special:SpecialPages
'specialpages' => '特殊页',
+# Special:Tags
+'tags-active-yes' => '好',
+'tags-active-no' => 'å¼—',
+
+# Database error messages
+'dberr-info-hidden' => '(數據庫æœå‹™å™¨é€£å¼—上)',
+
# New logging system
'revdelete-restricted' => '已将é™åˆ¶åº”用到管ç†å‘˜',
'revdelete-unrestricted' => '已移除对管ç†å‘˜ä¸ªé™åˆ¶',
diff --git a/languages/messages/MessagesXal.php b/languages/messages/MessagesXal.php
index f20dfd16..a0edc0c5 100644
--- a/languages/messages/MessagesXal.php
+++ b/languages/messages/MessagesXal.php
@@ -86,9 +86,6 @@ $messages = array(
'tog-shownumberswatching' => 'Тер халх шинҗлдг демнчнрин то үзүлх',
'tog-oldsig' => 'Бәәдг тәвÑн һарна хәләвр:',
'tog-fancysig' => 'Эврән тәвÑн һарна бики темдлһн (авто заалһта уга)',
-'tog-externaleditor' => 'Һаза чикллгч олзлх (һанцхн Ñрдмчнрт, тана тоолцврт шишлң көг кергтә. [//www.mediawiki.org/wiki/Manual:External_editors Дәкәд өггцн.])',
-'tog-externaldiff' => 'Һаза йилһән үзүлдг програм олзлх (һанцхн Ñрдмчнрт, тана тоолцврт шишлң көг кергтә [//www.mediawiki.org/wiki/Manual:External_editors Дәкәд өггцн.])',
-'tog-showjumplinks' => 'ТуÑлмҗ заалһуд «-д/-Ñ‚ һарх» йовулх',
'tog-uselivepreview' => 'Шамдһа хәләвр олзлх (JavaScript кергтә, амÑлһн)',
'tog-forceeditsummary' => 'Учр-утх хооÑн бәәхлә медүлх',
'tog-watchlisthideown' => 'Шинҗллһнә Ñеткүлд мини Ñольлһиг бултулх',
@@ -279,7 +276,7 @@ $messages = array(
$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).
+# 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).
'aboutsite' => '{{SITENAME}} туÑкар',
'aboutpage' => 'Project:Тодлҗ бичлһн',
'copyright' => 'Өггцн $1 йоÑта орҗ болм',
@@ -289,7 +286,6 @@ $1',
'disclaimers' => 'Ð”Ð°Ð°Ð²Ñ€Ð°Ñ ÑÑ Ð·Ó©Ð²ÑˆÓ™Ñ€Ð»Ò»Ð½',
'disclaimerpage' => 'Project:Ð”Ð°Ð°Ñ€Ð°Ñ ÑÑ Ð·Ó©Ð²ÑˆÓ™Ñ€Ð»Ò»Ð½',
'edithelp' => 'Чикллһнә дөң',
-'edithelppage' => 'Help:Чикллһн',
'helppage' => 'Help:Һарг',
'mainpage' => 'Ðүр халх',
'mainpage-description' => 'Ðүр халх',
@@ -359,17 +355,6 @@ $1',
# General errors
'error' => 'Эндү',
'databaseerror' => 'Өггцнә базин Ñндү',
-'dberrortext' => 'Өггцнә базд Ñурврин ÑинтакÑиÑин Ñндү аҗглв.
-Эн заклһна теткүлин Ñндү болвза.
-Шидрә өггцнә базд Ñурвр:
-<blockquote><tt>$1</tt></blockquote>
-<tt>«$2»</tt> Ñ„ÑƒÐ½ÐºÑ†Ð°Ñ Ò»Ð°Ñ€Ð°Ð´ бәәнә.
-Өггцнә баз <tt>«$3: $4»</tt> Ñндү хәрү өгв.',
-'dberrortextcl' => 'Өггцнә базд Ñурврин ÑинтакÑиÑин Ñндү аҗглв.
-Шидрә өггцнә базд Ñурвр:
-«$1»
-«$2» Ñ„ÑƒÐ½ÐºÑ†Ð°Ñ Ò»Ð°Ñ€Ð°Ð´ бәәнә.
-Өггцнә баз «$3: $4» Ñндү хәрү өгв.',
'missing-article' => 'Өггцнә халһлд ÑурÑн халхин бичг олв уга. Эн халх олх йоÑта: "$1" нертә $2.
Тер йовдл һарһÑн халхна тууҗин өңгрÑн заалһиг дахлһна арһ болад бәәнә.
@@ -387,7 +372,6 @@ $1',
'badtitletext' => 'СурÑн нерн буру, хооÑн, аль му бичÑн келн хоорнд нертә. Тиим чигн биз, нерн зөв уга үзгтә.',
'viewsource' => 'Ишиг хәләх',
'actionthrottled' => 'Хурдна заг',
-'sqlhidden' => '(SQL Ñурвр бултулÑн)',
'ns-specialprotected' => 'Шишлң халх чиклÑн бәәх болшго.',
# Virus scanner
@@ -449,7 +433,7 @@ $1',
'oldpassword' => 'Көгшн нууц үг:',
'newpassword' => 'Шин нууц үг:',
'retypenew' => 'Шин нууц үгиг дәкәд бичтн:',
-'resetpass_success' => 'Тана нууц үгиг йовудта Ñольв! Та ода орнат...',
+'changepassword-success' => 'Тана нууц үгиг йовудта Ñольв! Та ода орнат...',
'resetpass-submit-loggedin' => 'Ðууц үгиг Ñольх',
'resetpass-submit-cancel' => 'Уга кех',
@@ -604,9 +588,6 @@ $1',
'powersearch-field' => 'Хәәх',
'powersearch-togglenone' => 'Уга',
-# Quickbar
-'qbsettings' => 'Ормин Ñамбр',
-
# Preferences page
'preferences' => 'Дурллһн',
'mypreferences' => 'Көгүд',
@@ -750,7 +731,6 @@ $1',
'recentchangeslinked-feed' => 'Садта чикллһн',
'recentchangeslinked-toolbox' => 'Садта чикллһн',
'recentchangeslinked-title' => '$1 Ñадта Ñольлһн',
-'recentchangeslinked-noresult' => 'Садта халх зааÑн цагт ÑольÑн уга',
'recentchangeslinked-summary' => "Эн тер халх заалдг халхÑин (аль тер Ñнзин халхÑин) шидрә Ñольлһн.
Тана [[Special:Watchlist|шинҗллһнә Ñеткүлин]] Ñ…Ð°Ð»Ñ…Ñ '''тарһн''' бичәтә.",
'recentchangeslinked-page' => 'Халхна нернь:',
@@ -1010,7 +990,6 @@ $2 шидрә һарһлһна төлә хәләтн.',
'blocklogentry' => '[[$1]] бүÑлÑн $2 күртл, $3 учрта',
'unblocklogentry' => '$1-г бүÑлÑн биш болулв',
'block-log-flags-nocreate' => 'бичгдлһиг бүтәҗ болшго',
-'blockme' => 'Ðамаг бүÑлчк',
# Move page
'movepagetext' => "Та дораһар цааÑар, халхин Ñольлһна тууҗ көндәд, терүнә нериг Ñольх.
@@ -1156,7 +1135,7 @@ $2 шидрә һарһлһна төлә хәләтн.',
* gpslongitude
* gpsaltitude',
-# EXIF tags
+# Exif tags
'exif-imagewidth' => 'Өргн',
'exif-imagelength' => 'Өндр',
'exif-bitspersample' => 'Өңгин гүн',
@@ -1234,11 +1213,6 @@ $2 шидрә һарһлһна төлә хәләтн.',
'version-software-product' => 'Һарц',
'version-software-version' => 'Һарц',
-# Special:FilePath
-'filepath' => 'Боомгд хаалһ',
-'filepath-page' => 'Боомг:',
-'filepath-submit' => 'Орх',
-
# Special:FileDuplicateSearch
'fileduplicatesearch-filename' => 'Боомгин нерн:',
'fileduplicatesearch-submit' => 'Хәәх',
diff --git a/languages/messages/MessagesXh.php b/languages/messages/MessagesXh.php
index 08473de8..0fb07c33 100644
--- a/languages/messages/MessagesXh.php
+++ b/languages/messages/MessagesXh.php
@@ -86,6 +86,9 @@ $messages = array(
'viewsource' => 'Jonga i Source',
# Login and logout pages
+'welcomecreation' => '== Wamkelekile, $1! ==
+
+I Account yakhgo ivuliwe, ungalibali ukutshitsha izinto ozithandayo ngo {{SITENAME}}.',
'yourname' => 'Igama lelungu:',
'yourpassword' => 'Igama elifihlakeleyo lelungu:',
'yourpasswordagain' => 'Faka kwakhona igama elifihlakeleyo:',
diff --git a/languages/messages/MessagesXmf.php b/languages/messages/MessagesXmf.php
index 4f21adc8..d3e036ae 100644
--- a/languages/messages/MessagesXmf.php
+++ b/languages/messages/MessagesXmf.php
@@ -180,7 +180,7 @@ $messages = array(
'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).
+# 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).
'aboutsite' => '{{SITENAME}}-შენი',
'aboutpage' => 'Project:შენი',
'copyright' => 'დინáƒáƒ áƒ” მიწáƒáƒ áƒ˜áƒœáƒáƒ¤áƒ˜áƒšáƒ˜ რე $1–იშ ჯáƒáƒ®áƒáƒ—.',
@@ -190,7 +190,6 @@ $messages = array(
'disclaimers' => 'გáƒáƒ›áƒáƒ›áƒ˜áƒœáƒ¯áƒáƒšáƒáƒ¨ ვáƒáƒ áƒ”ბáƒ',
'disclaimerpage' => 'Project:გáƒáƒ›áƒáƒ›áƒ˜áƒœáƒ¯áƒáƒšáƒáƒ¨ ვáƒáƒ áƒ”ბáƒ',
'edithelp' => 'მáƒáƒ®áƒ•áƒáƒ áƒ რედáƒáƒ¥áƒ¢áƒ˜áƒ áƒáƒ¤áƒáƒ¡',
-'edithelppage' => 'Help:ტექსტიშ რედáƒáƒ¥áƒ¢áƒ˜áƒ áƒáƒ¤áƒ',
'helppage' => 'Help:დინáƒáƒ áƒ”',
'mainpage' => 'დუდხáƒáƒ¡áƒ·áƒšáƒ',
'mainpage-description' => 'დუდხáƒáƒ¡áƒ·áƒšáƒ',
@@ -411,7 +410,6 @@ $messages = array(
'viewprevnext' => 'ქáƒáƒ«áƒ˜áƒ  ($1 {{int:pipe-separator}} $2) ($3).',
'searchmenu-exists' => 'თე ვიკის "[[:$1]]" ჯáƒáƒ®áƒáƒ— ხáƒáƒ¡áƒ·áƒšáƒ რე',
'searchmenu-new' => "''ქჷდáƒáƒ áƒ¡áƒ®áƒ˜ \"[[:\$1]]\" ხáƒáƒ¡áƒ·áƒšáƒ თე ვიკის'''",
-'searchhelp-url' => 'Help:მáƒáƒ®áƒ•áƒáƒ áƒ',
'searchprofile-articles' => 'სტáƒáƒ¢áƒ˜áƒ”ფი',
'searchprofile-project' => 'მáƒáƒ®áƒ•áƒáƒ áƒáƒ¨ დრპრáƒáƒ”ქტიშ ხáƒáƒ¡áƒ·áƒšáƒ”ფი',
'searchprofile-images' => 'მულტიმედიáƒ',
@@ -502,7 +500,6 @@ $messages = array(
'recentchangeslinked-feed' => 'áƒáƒ™áƒáƒ®áƒ•áƒáƒšáƒáƒ›áƒ˜áƒ  თირáƒáƒ¤áƒ”ფ',
'recentchangeslinked-toolbox' => 'áƒáƒ™áƒáƒ®áƒ•áƒáƒšáƒáƒ›áƒ˜áƒ  თირáƒáƒ¤áƒ”ფ',
'recentchangeslinked-title' => '"$1"-შრმებუნáƒáƒ¤áƒ˜áƒš თირáƒáƒ¤áƒ”ფი',
-'recentchangeslinked-noresult' => 'წურáƒáƒ¤áƒ˜áƒš პერიáƒáƒ“ს თირáƒáƒ¤áƒ”ფ áƒáƒ™áƒáƒ®áƒ•áƒáƒšáƒáƒ›áƒ˜áƒ  ხáƒáƒ¡áƒ˜áƒšáƒ”ფს ვრჸáƒáƒ¤áƒ”რენ.',
'recentchangeslinked-summary' => "თენრრე მეწურáƒáƒ¤áƒ˜áƒšáƒ˜ ხáƒáƒ¡áƒ˜áƒšáƒáƒ¬áƒ™áƒ£áƒ›áƒ (ვáƒáƒ áƒ მეწურáƒáƒ¤áƒ˜áƒšáƒ˜ კáƒáƒ¢áƒ”გáƒáƒ áƒ˜áƒáƒ¨ მáƒáƒ™áƒáƒ—ურეფწკუმáƒ) გინáƒáƒ áƒªáƒ®áƒ£áƒáƒ¤áƒ˜áƒšáƒ˜ ხáƒáƒ¡áƒ˜áƒšáƒ”ფს ეკáƒáƒœáƒ˜áƒ ბáƒáƒ áƒ¯áƒ˜áƒ¡ ღáƒáƒšáƒáƒ›áƒ˜áƒ áƒ˜ თირáƒáƒ¤áƒ”ფიშ ერკებულ. ხáƒáƒ¡áƒ˜áƒšáƒ”ფი [[Special:Watchlist|your watchlist]] გიმáƒáƒ áƒ—ილი რე '''ფსქელáƒáƒ¡'''.\"",
'recentchangeslinked-page' => 'ხáƒáƒ¡áƒ˜áƒšáƒáƒ¨ ჯáƒáƒ®áƒ:',
'recentchangeslinked-to' => 'მáƒáƒœáƒ’იერრქáƒáƒ«áƒ˜áƒ áƒ” áƒáƒ—ე ხáƒáƒ¡áƒ˜áƒšáƒáƒ¨áƒ მერცხილ ხáƒáƒ¡áƒ˜áƒšáƒ”ფშრმიშáƒáƒ¦áƒáƒšáƒ˜áƒ  თირáƒáƒ¤áƒ”ფ',
@@ -550,8 +547,6 @@ $messages = array(
# Statistics
'statistics' => 'სტáƒáƒ¢áƒ˜áƒ¡áƒ¢áƒ˜áƒ™áƒ',
-'disambiguationspage' => 'Template:áƒáƒœáƒ“áƒáƒ‘ურმნიშვნელიáƒáƒœáƒ˜',
-
'withoutinterwiki' => 'ხáƒáƒ¡áƒ˜áƒšáƒ”ფ ნინáƒáƒ¨ რსხილეფიშ გáƒáƒ áƒ”შე',
# Miscellaneous special pages
@@ -882,7 +877,7 @@ $messages = array(
* gpslongitude
* gpsaltitude',
-# EXIF tags
+# Exif tags
'exif-imagewidth' => 'სიგáƒáƒœáƒ”',
'exif-imagelength' => 'სიმáƒáƒ¦áƒáƒšáƒ”',
diff --git a/languages/messages/MessagesYi.php b/languages/messages/MessagesYi.php
index 1e626929..22c9ed3b 100644
--- a/languages/messages/MessagesYi.php
+++ b/languages/messages/MessagesYi.php
@@ -46,6 +46,10 @@ $namespaceAliases = array(
'ב×זונדער' => NS_SPECIAL,
'ב×נוצער' => NS_USER,
'ב×נוצער_רעדן' => NS_USER_TALK,
+ 'משתמש' => NS_USER,
+ 'שיחת_משתמש' => NS_USER_TALK,
+ 'משתמשת' => NS_USER,
+ 'שיחת_משתמשת' => NS_USER_TALK,
'בילד' => NS_FILE,
'בילד_רעדן' => NS_FILE_TALK,
'מעדיעוויקי' => NS_MEDIAWIKI,
@@ -55,6 +59,10 @@ $namespaceAliases = array(
'ב×ניצער' => NS_USER,
'ב×ניצער_רעדן' => NS_USER_TALK,
);
+$namespaceGenderAliases = array(
+ NS_USER => array( 'male' => 'ב×ַניצער', 'female' => 'ב×ַניצערין' ),
+ NS_USER_TALK => array( 'male' => 'ב×ַניצער_רעדן', 'female' => 'ב×ַניצערין_רעדן' ),
+);
$specialPageAliases = array(
'Activeusers' => array( 'טעטיגע_ב×ניצער' ),
@@ -92,6 +100,7 @@ $specialPageAliases = array(
'MIMEsearch' => array( 'זוכן_MIME' ),
'Mostcategories' => array( 'מערסטע_ק×טעג×ריעס' ),
'Mostimages' => array( 'מערסטע_פ×רבונדענע_בילדער' ),
+ 'Mostinterwikis' => array( 'מערסטע_פ×רבונדענע_×ינטערוויקיס' ),
'Mostlinked' => array( 'מערסטע_פ×רבונדענע_בלעטער' ),
'Mostlinkedcategories' => array( 'מערסטע_פ×רבונדענע_ק×טעג×ריעס' ),
'Mostlinkedtemplates' => array( 'מערסטע_פ×רבונדענע_מוסטערן' ),
@@ -216,11 +225,6 @@ $messages = array(
'tog-shownumberswatching' => 'ווייזן ×“×¢× × ×•×ž×¢×¨ פון בל×ט ×ויפֿפ×סערס',
'tog-oldsig' => '×יצטיגער ×ונטערשריפֿט:',
'tog-fancysig' => 'ב×Ö·×”×ַנדלן ×ונטערשריפט ×ַלס וויקיטעקסט (×ָן ×ויט×מ×טישן לינק)',
-'tog-externaleditor' => 'ניצן × ×“×¨×•×™×¡× ×“×™×’×Ÿ רעד×קטירער גרונטלעך (× ×ר פֿ×ר מומחי×, ד×ס פֿ×דערט ב×זונדערע ק×מפיוטער שטעלונגען).
-[//www.mediawiki.org/wiki/Manual:External_editors ווײַטערע ×ינפֿ×רמ×ַציע.]',
-'tog-externaldiff' => 'ניצן × ×“×¨×•×™×¡× ×“×™×’×Ÿ פֿ×ַרגלײַכער גרונטלעך (× ×ר פֿ×ר מומחי×, ד×ס פֿ×דערט ב×זונדערע ק×מפיוטער שטעלונגען)
-[//www.mediawiki.org/wiki/Manual:External_editors ווײַטערע ×ינפֿ×רמ×ַציע.]',
-'tog-showjumplinks' => 'ב×מעגלעך צוטריט לינקס פון "שפרינג צו"',
'tog-uselivepreview' => 'ב×ניצן זיך מיט גיכער פ×ר×ויסדיגער ווייזונג (עקספערימענט×ל)',
'tog-forceeditsummary' => 'וו×רן מיך ווען ×יך לייג × ×œ×™×™×“×™×’ קורץ וו×רט ענדערונג',
'tog-watchlisthideown' => 'ב××”×לט מיינע ענדערונגען פון דער ×ויפפ×סן ליסטע',
@@ -233,6 +237,8 @@ $messages = array(
'tog-diffonly' => 'ווייז נישט ××™× ×”×לט ×ונטער די דיפערענץ',
'tog-showhiddencats' => 'ווײַז ב××”×לטענע ק×טעג×ריעס',
'tog-norollbackdiff' => 'היפט ×יבער ווײַזן ×ונטערשייד × ×כן ×ויספֿירן × ×¦×•×¨×™×§×“×¨×™×™',
+'tog-useeditwarning' => 'שטעלן × ×•×•×רענונג ווען ×יך ל××– ×יבער × ×¨×¢×“×קטירונג בל×ט מיט נישט ×ויפגעהיטענע ענדערונגען',
+'tog-prefershttps' => 'ניצט שטענדיק × ×–×™×›×¢×¨×¢ פ×רבינדונג ווען ×רײַנגל×גירט',
'underline-always' => '×ייביג',
'underline-never' => 'קיינמ×ל',
@@ -296,6 +302,18 @@ $messages = array(
'oct' => '×ָקט׳',
'nov' => '× ×ָוו׳',
'dec' => 'דעצ׳',
+'january-date' => '$1 ×™×נו×ר',
+'february-date' => '$1 פעברו×ר',
+'march-date' => '$1 מערץ',
+'april-date' => '$1 ×פריל',
+'may-date' => '$1 מיי',
+'june-date' => '$1 יוני',
+'july-date' => '$1 יולי',
+'august-date' => '$1 ×ויגוסט',
+'september-date' => '$1 סעפטעמבער',
+'october-date' => '$1 ×קט×בער',
+'november-date' => '$1 × ×וועמבער',
+'december-date' => '$1 דעצעמבער',
# Categories related messages
'pagecategories' => '{{PLURAL:$1|ק×ַטעג×ָריע|ק×ַטעג×ָריעס}}',
@@ -378,6 +396,7 @@ $messages = array(
'create-this-page' => 'ש×ַפֿן ×“×¢× ×‘×œ×ַט',
'delete' => '×ויסמעקן',
'deletethispage' => '×ויסמעקן ×“×¢× ×‘×œ×ַט',
+'undeletethispage' => 'צוריקשטעלן ×“×¢× ×‘×œ×ט',
'undelete_short' => 'צוריקשטעלן {{PLURAL:$1|×יין רעד×ַקטירונג|$1 רעד×ַקטירונגען}}',
'viewdeleted_short' => 'ב×ַקוקן {{PLURAL:$1|×יין געמעקטע ענדערונג|$1 געמעקטע ענדערונגען}}',
'protect' => 'ב×שיצן',
@@ -421,7 +440,7 @@ $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).
+# 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).
'aboutsite' => 'וועגן {{SITENAME}}',
'aboutpage' => 'Project:וועגן',
'copyright' => 'דער ××™× ×”×ַלט ××™×– פֿ×ַר×ַן ×ונטער $1 ווען נישט ב×וויזן ×נדערש.',
@@ -431,7 +450,6 @@ $1',
'disclaimers' => 'געזעצליכע ×ויפֿקלערונג',
'disclaimerpage' => 'Project:קל×רשטעלונג',
'edithelp' => 'הילף ווי×זוי צו ענדערן',
-'edithelppage' => 'Help:ענדערן',
'helppage' => 'Help:××™× ×”×ַלט',
'mainpage' => 'הויפט זייט',
'mainpage-description' => 'הויפט זייט',
@@ -512,17 +530,12 @@ $1',
# General errors
'error' => 'פעלער',
'databaseerror' => 'ד×טנב××–×¢ פעלער',
-'dberrortext' => '× ×“×טנב××–×¢ זוכונג סינט×קס גרייז ×”×ט פ×סירט.
-ד×ס קען זיין צוליב × ×‘××’ ××™× ×¢× ×•×•×™×™×›×•×•×רג.
-די לעצטע ד×טנב××–×¢ זוכונג ××™×– געווען:
-<blockquote><code>$1</code></blockquote>
-פון דער פונקציע "<code>$2</code>".
-ד×טנב××–×¢ ×”×ט צוריקגעגעבן גרייז "<samp>$3: $4</samp>".',
-'dberrortextcl' => '× ×“×טנב××–×¢ זוכונג סינט×קס גרייז ×”×ט פ×סירט.
-די לעצטע ד×טנב××–×¢ זוכונג ××™×– געווען:
-"$1"
-פון דער פונקציע "$2".
-ד×טנב××–×¢ ×”×ט צוריקגעגעבן גרייז "$3: $4".',
+'databaseerror-text' => "ס'×”×ט פ×סירט × ×“×טנב××–×¢ פֿר××’×¢ פֿעלער.
+קען ×פשר זיין × ×‘×Ö·×’ ××™× ×¢× ×•×•×™×™×›×•×•×רג.",
+'databaseerror-textcl' => "ס'×”×ט פ×סירט × ×“×טנב××–×¢ פֿר××’×¢ פֿעלער.",
+'databaseerror-query' => 'פֿר××’×¢: $1',
+'databaseerror-function' => 'פֿונקציע: $1',
+'databaseerror-error' => 'פֿעלער: $1',
'laggedslavemode' => 'וו×רענונג: בל×ט טוט מעגליך נישט ×נטה×לטן לעצטיגע דערהײַנטיגונגען.',
'readonly' => 'ד×ַטנב×Ö·×–×¢ פ×ַרשפ×ַרט',
'enterlockreason' => 'שטעלט × ×¡×™×‘×” פ×רן ×פשפ×ר, ×ריינגערעכנט × ×’×¢×©×צטער צייט ×ויף ווען ד×ס וועט זיך צוריקעפענען די פ×רשפ×רונג.',
@@ -556,6 +569,7 @@ $1',
'cannotdelete-title' => 'מען קען נישט ×ויסמעקן בל×ט "$1"',
'delete-hook-aborted' => '×ויסמעקונג ×נולירט דורך hook.
נישט געגעבן קיין דערקלערונג.',
+'no-null-revision' => 'נישט מעגלעך צו ש×פן × × ×•×œÖ¾×•×•×¢×¨×¡×™×¢ ×¤×•× ×¢× ×‘×œ×ט "$1".',
'badtitle' => 'שלעכט קעפל',
'badtitletext' => "ד×ס קעפל פון ×“×¢× ×’×¢×–×•×›×˜×Ÿ בל×ט ××™×– געווען ×ומגעזעצליך, ליידיג, ×ן ×ינטערשפר×ך ×דער ×ינטערוויקי לינק וו×ס פ×סט נישט, ×דער ×נטה×ט ×›×ר×קטערס וו×ס מ'קען נישט ניצן ×ין × ×§×¢×¤×œ.",
'perfcached' => "די פ×לגנדע ד×טן זענען גענומען ×¤×•× ×¢× '×–×ַפ×ַס' ×ון מעגלעך נישט ×קטועל. מ××§×¡×™×ž×•× {{PLURAL:$1|×יין רעזולט×ט ××™×–|$1 רעזולט×טן זענען}} פ×ר×ן ×ין ×–×פ×ס.",
@@ -576,13 +590,16 @@ $1',
כדי צולייגן ×דער ענדערן ×יבערזעצונגען פ×ר ×לע וויקיס, זייט ×זוי גוט ניצן [//translatewiki.net/ translatewiki.net], דער מעדיעוויקי ל×ק×ליז×ציע פר×יעקט.',
'editinginterface' => "'''וו×רענונג:''' ×יר ב×Ö·×ַרבעט × ×‘×œ×ט וו×ס ××™×– געניצט צוצושטעלן ×ינטערפֿייס טעקסט פ×ר דער ווייכוו×רג. ענדערונגען ×ין ×“×¢× ×‘×œ×ַט וועלן טוישן ד×ס ×ויסזען פון די ×¡×™×¡×˜×¢× ×ž×•×“×¢×•×ª פ×ר ×לע ×נדערע ב×ניצער ×ויף דער וויקי.
כדי צולייגן ×דער ענדערן ×יבערזעצונגען, ב×ַטר×ַכטס ב×ַניצן [//translatewiki.net/ translatewiki.net], דער מעדיעוויקי ל×ק×ַליז×ציע פר×יעקט.",
-'sqlhidden' => '(SQL פ×רל×× ×’ ב××”×לטן)',
'cascadeprotected' => 'דער בל×ט ××™×– פ×רשפ×רט ×¦×•× ×¢× ×“×¢×¨×Ÿ וויב×לד ער ××™×– ×יינגעשל×סן ×ין ××™×™× ×¢ פון די פ×לגנדע {{PLURAL:$1|בל×ט, וו×ס ××™×–|בלעטער, וו×ס זענען}} ב×שיצט מיט דער ק×סקייד ×פציע:
$2',
'namespaceprotected' => "×יר זענט נישט ערלויבט צו רעד×קטירן בלעטער ××™× ×¢× '''$1''' × ×מענטייל.",
'customcssprotected' => '×יר ×”×ט נישט רשות צו רעד×ַקטירן ×“×¢× CSS בל×ַט, ווײַל ער ×ַנטה×ַלט די פערזענלעכע ב×ַשטימונגען פון ×ַן ×ַנדער ב×ַניצער.',
'customjsprotected' => '×יר ×”×ט נישט רשות צו רעד×ַקטירן ×“×¢× JavaScript בל×ַט, ווײַל ער ×ַנטה×ַלט די פערזענלעכע ב×ַשטימונגען פון ×ַן ×ַנדער ב×ַניצער.',
+'mycustomcssprotected' => '×יר זענט נישט ערלויבט צו רעד×קטירן ×“×¢× CSS בל×ט.',
+'mycustomjsprotected' => '×יר זענט נישט ערלויבט צו רעד×קטירן ×“×¢× JavaScript בל×ט.',
+'myprivateinfoprotected' => '×יר ×”×ט נישט קיין דערלויבניש צו רעד×קטירן ×ייער פריוו×טע ×ינפ×רמ×ציע.',
+'mypreferencesprotected' => '×יר ×”×ט נישט קיין דערלויבניש צו רעד×קטירן ×ייערע פרעפערענצן.',
'ns-specialprotected' => 'מען קען נישט רעד×גירן ספעציעלע בלעטער.',
'titleprotected' => 'דער טיטל ××™×– געשיצט פון ווערן געש×פֿן דורך [[User:$1|$1]].
די ×ורז×ך ××™×– \'\'$2".',
@@ -606,10 +623,19 @@ $2',
'welcomecreation-msg' => "מ'×”×ט געש×פן ×ייער ק×נטע.
פ×רגעסט נישט צו ענדערן ×ייערע [[Special:Preferences|{{SITENAME}} פרעפערענצן]].",
'yourname' => 'ב×ַניצער × ×ָמען:',
+'userlogin-yourname' => 'ב×ַניצער × ×ָמען',
+'userlogin-yourname-ph' => 'גיט ×ריין ×ייער ב×ניצער × ×מען',
+'createacct-another-username-ph' => '×ריינגעבן ב×ניצער × ×מען',
'yourpassword' => 'פ×סוו×רט',
+'userlogin-yourpassword' => 'פ×ַסוו×רט',
+'userlogin-yourpassword-ph' => '×ַרײַנגעבן ×ײַער פ×ַסוו×רט',
+'createacct-yourpassword-ph' => '×ַרײַנגעבן × ×¤×ַסוו×רט',
'yourpasswordagain' => 'ווידער ×ריינקל×פן פ×סוו×רט',
+'createacct-yourpasswordagain' => 'ב×שטעטיקן פ×סוו×רט',
+'createacct-yourpasswordagain-ph' => '×רײַנגעבן פ×סוו×רט × ××›×מ×ל',
'remembermypassword' => 'געדיינק מײַן ×ַרײַנל×גירן ×ויף ×“×¢× ×§×מפיוטער (ביז $1 {{PLURAL:$1|ט×ָג|טעג}})',
-'securelogin-stick-https' => 'בלייַבן פ×רבונדן צו HTTPS × ×ָכן ×רײַנל×ָגירן',
+'userlogin-remembermypassword' => 'ל××– מיך בלײַבן ×רײַנל×גירט',
+'userlogin-signwithsecure' => 'ניצן זיכערן ס×רווער',
'yourdomainname' => '×ײַער געביט:',
'password-change-forbidden' => '×יר קען נישט ענדערן פ×סווערטער ×ויף דער וויקי.',
'externaldberror' => 'עס ××™×– ×דער פ×רגעקומען ×ן ×ויטענטיק×ציע ד×טנב××–×¢ פעלער ×דער ×יר זענט נישט ערמעגליכט צו דערהיינטיגן ×ייער דרויסנדיגע ק×נטע.',
@@ -621,18 +647,44 @@ $2',
'logout' => '×ַרױסל×ָגירן',
'userlogout' => '×ַרױסל×ָגירן',
'notloggedin' => 'נישט ×יינגעשריבן',
+'userlogin-noaccount' => '×יר ×”×ט נישט קיין ק×נטע?',
+'userlogin-joinproject' => '×יינטרעטן ביי {{SITENAME}}',
'nologin' => "×יר ×”×ט נישט קיין ק×נטע? '''$1'''.",
'nologinlink' => 'ש×ַפֿן ×Ö· ק×נטע',
'createaccount' => 'ש×ַפֿן ×Ö· נײַע ק×נטע',
'gotaccount' => "×”×סטו שוין × ×§×נטע? '''$1'''.",
'gotaccountlink' => '×ַרײַנל×גירן',
'userlogin-resetlink' => 'פ×רגעסן ×ײַערע ×ַרײַנל×ָגירן פרטי×?',
+'userlogin-resetpassword-link' => 'צוריקשטעלן ×ײַער פ×ַסוו×רט',
+'helplogin-url' => 'Help:×ריינל×גירן',
+'userlogin-helplink' => '[[{{MediaWiki:helplogin-url}}|הילף מיט ×ריינל×גירן]]',
+'userlogin-loggedin' => '×יר זענט שוין ×ריינל×גירט ווי {{GENDER:$1|$1}}.
+ניצט די פ××¨×¢× ×ונטן כדי ×ריינל×גירן ווי ×ן ×נדער ב×ניצער.',
+'userlogin-createanother' => 'ש×פֿן × ×ך × ×§×נטע',
+'createacct-join' => 'גיט ×רײַן ×ײַער ×ינפֿ×רמ×ציע ×ונטן.',
+'createacct-another-join' => '×רײַנגעבן דער נײַער ק×נטעס ×ינפ×רמ×ציע ×ונטן.',
+'createacct-emailrequired' => 'בליצפּ×ָסט ×ַדרעס',
+'createacct-emailoptional' => 'בליצפ×סט ×דרעס (×פצי×× ×ל)',
+'createacct-email-ph' => 'קל×ַפט ×רײַן ×ײַער בליצפּ×ָסט ×ַדרעס',
+'createacct-another-email-ph' => '×ַרײַנגעבן בליצפּ×ָסט ×ַדרעס',
'createaccountmail' => 'ניצן × ×¤×¨×וויז×ריש פ×סוו×רט ×ון שיקן ×¦×•× ×’×¢×¦×™×™×›× ×˜×Ÿ ×¢-פ×סט ×דרעס',
+'createacct-realname' => 'עכטער × ×מען (×פצי×× ×ל)',
'createaccountreason' => '×ורז×ַך:',
+'createacct-reason' => '×ורז×ך',
+'createacct-reason-ph' => 'פֿ×רוו×ס ש×פֿט ×יר × ×ך × ×§×נטע',
+'createacct-captcha' => 'פ×רזיכערן ק×נטר×ל',
+'createacct-imgcaptcha-ph' => 'קל×פט ×רײַן ×“×¢× ×˜×¢×§×¡×˜ ×יר זעט ×ויבן',
+'createacct-submit' => 'ש×פֿט ×ײַער ק×נטע',
+'createacct-another-submit' => 'ש×פן × ×ך × ×§×נטע',
+'createacct-benefit-heading' => '{{SITENAME}} ××™×– געמ×כט דורך מענטשן ווי ×יר.',
+'createacct-benefit-body1' => '{{PLURAL:$1|רעד×ַקטירונג|$1 רעד×ַקטירונגען}}',
+'createacct-benefit-body2' => '$1 {{PLURAL:$1|בל×ַט|בלעטער}}',
+'createacct-benefit-body3' => 'לעצטיקע {{PLURAL:$1|בײַשטײַערער}}',
'badretype' => 'די פ×סווערטער וו×ס ×יר ×”×ט ×ריינגעלייגט זענען נישט ××™×™× ×™×’.',
'userexists' => 'דער ב×ַניצער × ×ָמען ××™×– שוין געניצט.
ביטע קלײַבט ×ױס ×ַן ×ַנדער × ×ָמען.',
'loginerror' => 'ל×גירן פֿעלער',
+'createacct-error' => 'ק×נטע ש×פן פעלער',
'createaccounterror' => '×”×ט נישט געקענט ש×ַפֿן ק×נטע: $1',
'nocookiesnew' => 'די ב×ניצער ק×נטע ××™×– ב×ש×פן, ×בער ×יר זענט נישט ×ריינל×גירט.
{{SITENAME}} ניצט קיכלעך ×ריינצול×גירן ב×ניצער.
@@ -697,10 +749,12 @@ $2',
×יר קענט ××™×’× ×רירן די מעלדונג, ווען די ק×נטע ××™×– ב×ש×פֿן בטעות.',
'usernamehasherror' => 'ב×ַניצער × ×מען ט×ָר נישט ×ַנטה×ַלטן קיין לייטער סימב×ל',
'login-throttled' => '×יר ×”×ט געפרוווט צופֿיל מ×ל ×ריינל×גירן.
-זייט ×זוי גוט ×ון וו×ַרט ×יידער ×יר פרוווט × ××›×מ×ל.',
+זייט ×זוי גוט ×ון וו×ַרט $1 ×יידער ×יר פרוווט × ××›×מ×ל.',
'login-abort-generic' => '×ײַער ×רײַנל×גירונג ××™×– נישט געווען דערפֿ×לגרייך—×ָפגעשטעלט',
'loginlanguagelabel' => 'שפר×ך: $1',
'suspicious-userlogout' => ' ×ײַער בקשה ×ַרויסל×ָגירן זיך ××™×– ×פגעלייגט געוו×רן ווייַל ×ייגנטלעך ××™×– ×–×™ געשיקט דורך ×Ö· צעבר××›×¢× ×¢× ×‘×œ×¢×˜×¢×¨×¢×¨ ×ָדער × ×¤×¨×קסי מיט × ×–×פ×ס.',
+'createacct-another-realname-tip' => 'עכטער × ×מען ××™×– ×פצי×× ×ל.
+×ויב ×יר וויילט ×ויס צוצושטעלן ××™×, וועט ד×ס גענוצט ווערן צו געבן ×טריבוציע פ×ר זייער ×רבעט.',
# Email sending
'php-mail-error-unknown' => '×ומב×ַק×ַנט טעות ×ין()mail פֿונקציע פֿון PHP.',
@@ -716,7 +770,7 @@ $2',
'newpassword' => '× ×™×™ פּ×סוו×ָרט:',
'retypenew' => 'ווידער שרײַבן פ×ַסוו×רט:',
'resetpass_submit' => 'שטעלן פ×סוו×רט ×ון ×ריינל×גירן',
-'resetpass_success' => '×ייער פ×ַסוו×רט ××™×– געטוישט געוו×רן מיט דערפֿ×לג! ×יצט טוט מען ×ייך ×ריינל×גירן…',
+'changepassword-success' => '×ייער פ×ַסוו×רט ××™×– געטוישט געוו×רן מיט דערפֿ×לג!',
'resetpass_forbidden' => 'פ×סווערטער קענען נישט ווערן געטוישט',
'resetpass-no-info' => '×יר ד×רפֿט זיין ×ריינל×גירט צוצוקומען גלייך צו ×“×¢× ×“×זיגן בל×ט.',
'resetpass-submit-loggedin' => 'טוישן פ×סוו×רט',
@@ -728,10 +782,11 @@ $2',
# Special:PasswordReset
'passwordreset' => 'צוריקשטעלן פ×ַסוו×רט',
-'passwordreset-text' => 'דערג×ַנצט די פ×Ö¸×¨×¢× ×¦×•×¨×™×§×¦×•×©×˜×¢×œ×Ÿ ×ײַער פ×ַסוו×רט.',
+'passwordreset-text-one' => 'דערג×ַנצט די פ×Ö¸×¨×¢× ×¦×•×¨×™×§×¦×•×©×˜×¢×œ×Ÿ ×ײַער פ×ַסוו×רט.',
+'passwordreset-text-many' => '{{PLURAL:$1|דערג×ַנצט ××™×™× ×¢ פֿון די פֿעלדער צוריקצושטעלן ×ײַער פ×ַסוו×רט.}}',
'passwordreset-legend' => 'צוריקשטעלן פ×ַסוו×רט',
'passwordreset-disabled' => 'מען ×”×ט ×ומ×ַקטיוויטר צוריקשטעלן פ×ַסווערטער ×ויף דער וויקי.',
-'passwordreset-pretext' => '{{PLURAL:$1| | קל×ַפט ×ַרײַן ××™×™× ×¢ פֿון די ד×ַטן ×ונטן}}',
+'passwordreset-emaildisabled' => '×¢-פ×סט דינסטן זענען געוו×רן ×ומ×קטיווירט ×ויף דער ד×זיקער וויקי.',
'passwordreset-username' => 'ב×ַניצער × ×ָמען:',
'passwordreset-domain' => 'ד×מען:',
'passwordreset-capture' => 'זען ×“×¢× ×’×¢×©×™×§×˜×Ÿ ע־בריוו?',
@@ -760,7 +815,7 @@ $2
פר×וויז×רישער פּ×ַר×ָל: $2',
'passwordreset-emailsent' => "מ'×”×ט געשיקט × ×¤×סוו×רט צוריקשטעלן ×¢-פּ×ָסט.",
'passwordreset-emailsent-capture' => 'מען ×”×ט געשיקט × ×¤×סוו×רט צוריקשטעלן בליצבריוו, וו×ס ווערט געוויזן ×ונטן.',
-'passwordreset-emailerror-capture' => 'מען ×”×ט געש×פן × ×¤×סוו×רט צוריקשטעלן בליצבריוו, וו×ס ווערט געוויזן ×ונטן, ×בער שיקן ×¦×•× ×‘×ניצער ××™×– דורכגעפ×לן: $1',
+'passwordreset-emailerror-capture' => 'מען ×”×ט געש×פן × ×¤×סוו×רט צוריקשטעלן בליצבריוו, וו×ס ווערט געוויזן ×ונטן, ×בער שיקן ×¦×•× {{GENDER:$2|ב×ניצער}}××™×– דורכגעפ×לן: $1',
# Special:ChangeEmail
'changeemail' => 'ענדערן ×¢-פּ×ָסט ×ַדרעס',
@@ -774,6 +829,16 @@ $2
'changeemail-submit' => 'ענדערן ע־פ×סט ×דרעס',
'changeemail-cancel' => '×ַנולירן',
+# Special:ResetTokens
+'resettokens' => 'צוריקזעצן ט×קנס',
+'resettokens-no-tokens' => 'נישט פ×ר×ן קיין ט×קנס צוריקצוזעצן.',
+'resettokens-legend' => 'צוריקזעצן ט×קנס',
+'resettokens-tokens' => 'ט×קנס:',
+'resettokens-token-label' => '$1 (×קטועלער ווערט: $2)',
+'resettokens-watchlist-token' => 'ט×קן פ×רן וועב־פֿיד (Atom/RSS) פון [[Special:Watchlist|ענדערונגען צו בלעטער ×ויף ×ייער ×ויפֿפ×סונג ליסטע]]',
+'resettokens-done' => 'ט×קנס צוריקגעזעצט.',
+'resettokens-resetbutton' => 'צוריקזעצן ×ויסגעקליבענע ט×קנס',
+
# Edit page toolbar
'bold_sample' => 'דיקער טעקסט',
'bold_tip' => 'דיקער טעקסט',
@@ -975,12 +1040,15 @@ $2
ס'ווייזט ×ויס ××– ער ××™×– ×ויסגעמעקט.",
'edit-conflict' => 'רעד×קטירן ק×נפֿליקט.',
'edit-no-change' => "מ'×”×ט ××™×’× ×רירט ×ײַער רעד×ַקטירונג, ווײַל קיין ×©×•× ×¢× ×“×¢×¨×•× ×’ ××™×– נישט געמ×ַכט ×¦×•× ×˜×¢×§×¡×˜.",
+'postedit-confirmation' => '×ייער רעד×קטירונג ××™×– געוו×רן ×ויפגעהיטן.',
'edit-already-exists' => 'נישט מעגליך צו ש×ַפֿן × ×™×™×¢× ×‘×œ×ט.
ער עקזיסטירט שוין.',
'defaultmessagetext' => 'גרונטלעכער מעלדונג טעקסט',
'content-failed-to-parse' => 'פ×רזן $2 ××™× ×”×לט פ×ר $1 מ×דעל דורכגעפ×לן: $3',
'invalid-content-data' => '×ומגילטיקע ××™× ×”×לט ד×טן',
'content-not-allowed-here' => '"$1" ××™× ×”×לט נישט דערלויבט ×ויף בל×ט [[$2]]',
+'editwarning-warning' => '×יבערל×זן ×“×¢× ×‘×œ×ט קען ×’×•×¨× ×–×²Ö·×Ÿ פֿ×רלירן ×ײַערע ענדערונגען.
+×ויב ×יר זענט ×רײַנל×גירט, קענט ×יר מבטל זײַן די ד××–×™×’×¢ וו×רענונג ×ין דער "ב××רבעטן" ×פטיילונג פון ×ײַערע פרעפערענצן.',
# Content models
'content-model-wikitext' => 'וויקיטעקסט',
@@ -1013,6 +1081,7 @@ $2
'undo-failure' => 'די ענדערונג קען נישט מבוטל ווערן צוליב סתירות מיט צווישנצייטלעכע ענדערונגען.',
'undo-norev' => "ס'××™×– נישט מעגלעך צוריקקערן די רעד×ַקטירונג ווײַל ×–×™ עקסיסטירט נישט ×דער ××™×– ×ויסגעמעקט.",
'undo-summary' => 'זיי מבטל רי-ווערסיע $1 פון [[Special:Contributions/$2|$2]] ([[User talk:$2|רעדן]])',
+'undo-summary-username-hidden' => 'זײַט מבטל ווערסיע $1 פון × ×‘××”××œ×˜×¢× ×¢× ×‘×ניצער',
# Account creation failure
'cantcreateaccounttitle' => 'מען קען נישט ב×ש×פֿן ק×נטע',
@@ -1194,6 +1263,7 @@ $1",
'compareselectedversions' => 'פ×רגלייך סעלעקטירטע ווערסיעס',
'showhideselectedversions' => 'ווײַזן/ב×Ö·×”×ַלטן געקליבענע רעוויזיעס',
'editundo' => '×ַנולירן',
+'diff-empty' => '(קיין ×ונטערשייד)',
'diff-multi' => '({{PLURAL:$1|×יין מיטלסטע ווערסיע |$1 מיטלסטע ווערסיעס}} פֿון {{PLURAL:$2|×יין ב×ַניצער|$2 ב×ַניצער}} נישט געוויזן.)',
'diff-multi-manyusers' => '({{PLURAL:$1|×יין מיטלסטע ווערסיע |$1 מיטלסטע ווערסיעס}} פֿון מער ווי {{PLURAL:$2|×יין ב×ַניצער|$2 ב×ַניצער}} נישט געוויזן.)',
'difference-missing-revision' => '{{PLURAL:$2|×יין ווערסיע|$2 ווערסיעס}} פון ×“×¢× ×“×™×¤×¢×¨×¢× ×¥ ($1) {{PLURAL:$2|×”×ט}} מען נישט געטר×פן.
@@ -1221,7 +1291,6 @@ $1",
'searchmenu-legend' => 'זוכן ברירות',
'searchmenu-exists' => "'''ס'××™×– פֿ×ַר×ַן × ×‘×œ×ַט מיטן × ×מען \"[[:\$1]]\" ×ין דער וויקי'''",
'searchmenu-new' => "'''ב×ַש×ַפֿן ×“×¢× ×‘×œ×ַט \"[[:\$1]]\" ×ויף דער וויקי'''",
-'searchhelp-url' => 'Help:××™× ×”×ַלט',
'searchmenu-prefix' => '[[Special:PrefixIndex/$1|בלעטערן בלעטער מיט ×“×¢× ×¤×¨×¢×¤Ö¿×™×§×¡]]',
'searchprofile-articles' => '××™× ×”×לט בלעטער',
'searchprofile-project' => 'הילף ×ון פר×יעקט בלעטער',
@@ -1265,15 +1334,7 @@ $1",
'searchdisabled' => "{{SITENAME}} זוך ××™×– ×ָפ×ַקטיווירט.
צווישנצײַט קענט ×יר זוכן מיט גוגל.
געב ×כט ××– ס'××™×– מעגלעך ×Ö·×– זייער ×ינדעקס פֿון {{SITENAME}} ××™× ×”×ַלט ××™×– ×פשר פֿ×ַרעלטערט.",
-
-# Quickbar
-'qbsettings' => 'גיכפ×ַס',
-'qbsettings-none' => '×’×רנישט',
-'qbsettings-fixedleft' => 'קבוע לינקס',
-'qbsettings-fixedright' => 'קבוע רעכטס',
-'qbsettings-floatingleft' => 'שווימנדיג לינקס',
-'qbsettings-floatingright' => 'שווימנדיג רעכטס',
-'qbsettings-directionality' => 'פֿעסט, ×פהענגיק ×ויף דער שריפֿט ריכטונג פֿון ×ײַער שפר×ַך.',
+'search-error' => "ס'×”×ט פ×סירט × ×¤Ö¿×¢×œ×¢×¨ ×‘×™×™× ×–×•×›×Ÿ: $1",
# Preferences page
'preferences' => 'פרעפֿערענצן',
@@ -1307,7 +1368,6 @@ $1",
'resetprefs' => '×וועקנעמען נישט-×ויפגעהיטענע ענדערונגען',
'restoreprefs' => 'צוריקשטעלן ×לע גרונטלעכע שטעלונגען (×ין ×לע ×פטיילן)',
'prefs-editing' => 'ב×Ö·×ַרבעטן',
-'prefs-edit-boxsize' => 'גרויס ×¤×•× ×¢× ×¨×¢×“×קטירונג פענסטער.',
'rows' => 'שורות:',
'columns' => 'עמודי×:',
'searchresultshead' => 'זוכן',
@@ -1318,6 +1378,9 @@ $1",
'recentchangesdays-max' => 'מ×Ö·×§×¡×™×ž×•× $1 {{PLURAL:$1|ט×ָג|טעג}}',
'recentchangescount' => 'די צ×ָל רעד×ַקטירונגען צו ווײַזן גרונטלעך:',
'prefs-help-recentchangescount' => 'כולל לעצטע ענדערונגען, בל×ַט היסט×ָריעס, ×ון ל×ָגביכער.',
+'prefs-help-watchlist-token2' => 'ד×ס ××™×– דער געהיימער שליסל ×¦×•× ×•×•×¢×‘×¤Ö¿×™×“ פון ×ײַער ×ויפֿפ×סונג ליסטע.
+יעדער וו×ס ווייסט ××™× ×•×•×¢×˜ קענען לייענען ×ײַער ×ויפֿפ×סונג ליסטע; טוט ××™× × ×™×©×˜ טיילן.
+[[Special:ResetTokens|קליקט ×“× ×•×•×¢×Ÿ ×יר ד×רפט ××™× ×¦×•×¨×™×§×©×˜×¢×œ×Ÿ]].',
'savedprefs' => '×ייערע פרעפערענצן ××™×– ×פגעהיטן געוו×רן.',
'timezonelegend' => 'צײַט ×–×× ×¢:',
'localtime' => 'ל×ק×לע צייט:',
@@ -1348,7 +1411,6 @@ $1",
'prefs-reset-intro' => '×יר קענט ניצן ×“×¢× ×‘×œ×ַט צוריקצושטעלן ×ײַערע פרעפֿערענצן גרונטלעך פֿ×ַרן ×רט.
מען קען ד×ָס נישט ×ַנולירן.',
'prefs-emailconfirm-label' => '×¢-פ×סט ב×ַשטעטיקונג:',
-'prefs-textboxsize' => 'גרייס פֿון רעד×ַקטירונג פֿענסטער',
'youremail' => '×¢-פ×סט:',
'username' => '{{GENDER:$1|ב×ַניצער־נ×ָמען}}:',
'uid' => '{{GENDER:$1|ב×ַנוצער־נומער}}:',
@@ -1381,6 +1443,8 @@ $1",
'prefs-dateformat' => 'ד×ַטע פֿ×רמ×ַט',
'prefs-timeoffset' => 'צײַט ×ונטערשייד',
'prefs-advancedediting' => '×ַלגעמיינע ברירות',
+'prefs-editor' => 'רעד×ַקט×ָר',
+'prefs-preview' => 'פֿ×ר×ויסשטעלונג',
'prefs-advancedrc' => 'פֿ×רגעשריטענע ×פציעס',
'prefs-advancedrendering' => 'פֿ×רגעשריטענע ×פציעס',
'prefs-advancedsearchoptions' => 'פֿ×רגעשריטענע ×פציעס',
@@ -1388,7 +1452,9 @@ $1",
'prefs-displayrc' => 'ווײַזן ×פציעס',
'prefs-displaysearchoptions' => 'ווײַזן ×פציעס',
'prefs-displaywatchlist' => 'ווײַזן ×פציעס',
+'prefs-tokenwatchlist' => 'ט×קן',
'prefs-diffs' => 'צווישנשיידן',
+'prefs-help-prefershttps' => 'דער פרעפערענץ וועט ×רבעטן ביי ×ײַער נעקסטער ×רײַנל×גירונג.',
# User preference: email validation using jQuery
'email-address-validity-valid' => '×¢-פּ×ָסט ×ַדרעס זעט ×ויס גילטיק',
@@ -1479,11 +1545,18 @@ $1",
'right-ipblock-exempt' => '×רומגיין IP בל×קן, ×ויט×בל×קן ×ון גרייך־בל×קן',
'right-unblockself' => 'זיך ×ליין ×ויפֿשפ×ַרן',
'right-protect' => 'ענדערן שוץ ניוו×ען ×ון רעד×ַגירן ק×סק×ד־געשיצטע בלעטער',
-'right-editprotected' => 'רעד×ַגירן געשיצטע בלעטער (×ָן ק×ַסק×ַדן שוץ)',
+'right-editprotected' => 'רעד×ַגירן בלעטער געשיצט ווי "{{int:protect-level-sysop}}"',
+'right-editsemiprotected' => 'רעד×ַגירן בלעטער געשיצט ווי "{{int:protect-level-autoconfirmed}}"',
'right-editinterface' => 'רעד×ַקטירן די ב×ַניצער ×ייבערפֿל×ַך',
'right-editusercssjs' => 'רעד×ַקטירן ×ַנדערע ב×ַניצערס CSS ×ון JS טעקעס',
'right-editusercss' => 'רעד×ַקטירן ×ַנדערע ב×ַניצערס CSS טעקעס',
'right-edituserjs' => 'רעד×ַקטירן ×ַנדערע ב×ַניצערס JS טעקעס',
+'right-editmyusercss' => 'רעד×קטירע ×ײַערע ××™×™×’×¢× ×¢ ב×ניצער CSS טעקעס',
+'right-editmyuserjs' => 'רעד×קטירן ×ײַערע ××™×™×’×¢× ×¢ ב×ניצער JavaScript טעקעס',
+'right-viewmywatchlist' => 'ב×קוקן ×ייער ××™×™×’×¢× ×¢ ×ויפפ×סונג ליסטע',
+'right-viewmyprivateinfo' => 'ב×קוקן ×ײַער ××™×™×’×¢× ×¢ פריוו×טע ד×טן (צ"ב ע־פ×סט ×דרעס, ×מתער × ×מען)',
+'right-editmyprivateinfo' => 'רעד×קטירן ×ײַער ××™×™×’×¢× ×¢ פריוו×טע ד×טן (צ"ב ע־פ×סט ×דרעס, ×מתער × ×מען)',
+'right-editmyoptions' => 'רעד×קטירן ×ײַערע ××™×™×’×¢× ×¢ פרעפערענצן',
'right-rollback' => 'גיך צוריקדרייען די רעד×ַקטירונגען ×¤×•× ×¢× ×œ×¢×¦×˜×Ÿ ב×ַניצער וו×ס ×”×ט רעד×ַקטירט × ×’×¢×•×•×™×¡×Ÿ בל×ַט',
'right-markbotedits' => 'מ×ַרקירן צוריקגעזעצטע רעד×ַגירונגען ווי ב×ט רעד×ַגירונגען',
'right-noratelimit' => 'נישט ווערן ב×ַגרענעצט דורך לימיט×ַציע',
@@ -1545,12 +1618,19 @@ $1",
'action-userrights-interwiki' => 'רעד×ַקטירן רעכטן פון ב×ַניצער ×ויף ×ַנדערע וויקיס',
'action-siteadmin' => 'שליסן ×דער ×ויפשליסן די ד×טנב××–×¢',
'action-sendemail' => 'שיקן ע־פ×סט',
+'action-editmywatchlist' => 'רעד×קטירן ×ײַער ×ויפֿפ×סונג ליסטע',
+'action-viewmywatchlist' => 'ב×קוקן ×ײַער ×ויפֿפ×סונג ליסטע',
+'action-viewmyprivateinfo' => 'ב×קוקן ×ײַער פריוו×טע ×ינפ×רמ×ציע',
+'action-editmyprivateinfo' => 'רעד×קטירן ×ײַער פריוו×טע ×ינפ×רמ×ציע',
# Recent changes
'nchanges' => '{{PLURAL:$1|ענדערונג|$1 ענדערונגען}}',
+'enhancedrc-since-last-visit' => '$1 {{PLURAL:$1|זײַט לעצטן וויזיט}}',
+'enhancedrc-history' => 'היסט×ריע',
'recentchanges' => 'לעצטע ענדערונגען',
'recentchanges-legend' => 'ברירות פ×ר לעצטע ענדערונגען',
'recentchanges-summary' => '×’×™×™ × ×ך די לעצטע ענדערונגען צו דער וויקי ×ויף ×“×¢× ×‘×œ×ט.',
+'recentchanges-noresult' => 'קיין ענדערונגען ווערנט דער ד×זיקער תקופה זענען צוגעפ×סט צו די קריטעריע.',
'recentchanges-feed-description' => 'גייט × ×ך די לעצטע ענדערונגען צו דער וויקי ×ין ×“×¢× ×‘×œ×ט.',
'recentchanges-label-newpage' => 'די רעד×ַקטירונג ×”×ט ב×ש×פֿן × × ×²Ö·×¢× ×‘×œ×ַט',
'recentchanges-label-minor' => 'ד×ָס ××™×– ×Ö· מינערדיקע רעד×ַקטירונג',
@@ -1587,7 +1667,6 @@ $1",
'recentchangeslinked-feed' => 'פֿ×ַרבונדענע ענדערונגען',
'recentchangeslinked-toolbox' => 'פֿ×ַרבונדענע ענדערונגען',
'recentchangeslinked-title' => 'ענדערונגען פֿ×רבונדן מיט $1',
-'recentchangeslinked-noresult' => 'נישט געווען קיין ענדערונגען ×ין פֿ×רבונדענע בלעטער ×ין דער תקופה.',
'recentchangeslinked-summary' => "×ט × ×¨×©×™×ž×” פון × ×™×™×¢ ענדערונגען צו בלעטער פ×רבונדן פון × ×¡×¤×¢×¦×™×¤×™×©×Ÿ בל×ט (×דער מיטגליד בלעטער פון × ×¡×¤×¢×¦×™×¤×™×©×¢×¨ ק×טעג×ריע).
בלעטער ×ויף [[Special:Watchlist|×ייער ×ויפפ×סונג ליסטע]] זענען געוויזן '''דיק'''.",
'recentchangeslinked-page' => 'בל×ַט × ×ָמען:',
@@ -1599,7 +1678,7 @@ $1",
'reuploaddesc' => '×ַנולירן ×ַרויפֿל×ָד ×ון צוריקגיין צו דער ×ַרויפֿל×ָדן פֿ×רע×',
'upload-tryagain' => 'פֿ×ָרלייגן מ×דיפֿיצירטע טעקע ב×ַשרײַבונג',
'uploadnologin' => 'נישט ×ַרײַנל×גירט',
-'uploadnologintext' => '×יר מוזט זײַן [[Special:UserLogin| ×ַרײַנל×ָָגירט]] כדי ×רויפֿצול×ָדן טעקעס',
+'uploadnologintext' => '×יר ד×רפֿט זײַן $1 כדי ×רויפֿצול×ָדן טעקעס.',
'upload_directory_missing' => 'די ×רויפל×ד דירעקט×ריע ($1) פעלט ×ון דער וועבסערווירער קען ×–×™ נישט ש×פן.',
'upload_directory_read_only' => 'דער וועבס×רווער קען נישט שרייבן ×¦×•× ×רויפל×דן ×רכיוו "$1".',
'uploaderror' => '×ַרויפֿל×ָדן פֿעלער',
@@ -1788,7 +1867,6 @@ $1",
'http-read-error' => 'HTTP לייענען גרײַז.',
'http-timed-out' => 'HTTP בקשה ×ויסגעג×ַנגען.',
'http-curl-error' => 'גרײַז ×‘×²Ö·× ×‘×¨×¢× ×’×¢×Ÿ URL: $1',
-'http-host-unreachable' => "מ'קען נישט דערגרייכן ×“×¢× URL",
'http-bad-status' => "ס'××™×– געווען × ×¤×¨××‘×œ×¢× ×‘×™×™× HTTP פֿ×ַרל×Ö·× ×’: $1 $2",
# Some likely curl errors. More could be added from <http://curl.haxx.se/libcurl/c/libcurl-errors.html>
@@ -1814,6 +1892,10 @@ $1",
'listfiles_size' => 'גרייס',
'listfiles_description' => 'ב×ַשרײַבונג',
'listfiles_count' => 'ווערסיעס',
+'listfiles-show-all' => 'שליסט ×ײַן ×לטע ווערסיעס פון בילדער',
+'listfiles-latestversion' => 'לויפיקע ווערסיע',
+'listfiles-latestversion-yes' => '×™×',
+'listfiles-latestversion-no' => 'ניין',
# File description page
'file-anchor-link' => 'בילד טעקע',
@@ -1908,6 +1990,13 @@ $1",
'randompage' => 'צופֿעליגער ×ַרטיקל',
'randompage-nopages' => '× ×™×©×˜× ×§×™×™×Ÿ בלעטער ×ין {{PLURAL:$2|×“×¢× ×¤×לגנדן × ×מענטייל |די פ×לגנדע × ×מענטיילן}} "$1".',
+# Random page in category
+'randomincategory' => 'צופעליקער בל×ט ×ין ק×טעג×ריע',
+'randomincategory-invalidcategory' => '"$1" ××™×– נישט קיין גילטיקער ק×טעג×ריע × ×מען.',
+'randomincategory-nopages' => 'נישט פ×ר×ן קיין בלעטער ×ין [[:Category:$1]].',
+'randomincategory-selectcategory' => 'ב×קומען צופעליקן בל×ט פון ק×טעג×ריע: $1, $2.',
+'randomincategory-selectcategory-submit' => 'גיין',
+
# Random redirect
'randomredirect' => 'צופֿעליק ווײַטערפֿירן',
'randomredirect-nopages' => '× ×™×©×˜× ×§×™×™×Ÿ ווײַטערפֿירונגען ×ין ×“×¢× × ×מענטייל $1.',
@@ -1933,10 +2022,6 @@ $1",
'statistics-users-active-desc' => 'ב×ניצערס וו×ס ×”×בן דורכגעפירט × ×¤×¢×•×œ×” ×ין די לעצטע {{PLURAL:$1|ט××’|$1 טעג}}',
'statistics-mostpopular' => 'מערסטע געזען בלעטער',
-'disambiguations' => 'בלעטער וו×ס פֿ×רבינדן מיט ב×דייטן בלעטער',
-'disambiguationspage' => 'Template:ב×דייטן',
-'disambiguations-text' => "די קומענדיגע בלעטער פ×רבינדן צו × '''ב×דייטן בל×ט'''. ×–×™×™ ברויכן ענדערשט פֿ×רבינדן צו ×“×¢× ×¨×¢×œ×¢×•×•×נטן טעמע בל×ט.<br />× ×‘×œ×ט ווערט פ×ררעכענט פ×ר × ×‘×דײַטן בל×ט ×ויב ער ב×ניצט זיך מיט × ×ž×•×¡×˜×¢×¨ וו×ס ××™×– פ×רבינדען פון [[MediaWiki:Disambiguationspage]].",
-
'pageswithprop' => 'בלעטער מיט × ×‘×œ×ט ×ייגנש×פט',
'pageswithprop-legend' => 'בלעטער מיט × ×‘×œ×ט ×ייגנש×פט',
'pageswithprop-text' => 'דער בל×ט ×”×לט × ×¨×©×™×ž×” פון בלעטער וו×ס ניצן × ×’×¢×•×•×™×¡×¢ בל×ט ×ייגנש×פט.',
@@ -2186,10 +2271,9 @@ $1",
'unwatchthispage' => 'ענדיגן ×ויפֿפ×ַסן',
'notanarticle' => 'ד×ס ××™×– נישט קיין ××™× ×”×לט בל×ט',
'notvisiblerev' => 'די ב××רבעטונג ××™×– געוו×רן ×ויסגעמעקט',
-'watchnochange' => 'קיינע פֿון ×ײַערע ×ויפֿגעפ×ַסטע בלעטער ×”×בן זיך געענדערט ×ין ×“×¢× ×¦×²Ö·×˜ פערי×ד געוויזן.',
'watchlist-details' => '{{PLURAL:$1|×יין בל×ט|$1 בלעטער}} ×ין ×ייער ×ויפֿפ×סן ליסטע (נישט רעכענען רעדן בלעטער).',
-'wlheader-enotif' => '* ×¢-פ×סט מעלדונג ערמעגליכט.',
-'wlheader-showupdated' => "* בלעטער געענדערט זײַט ×ײַער לעצטן וויזיט זען געוויזן '''דיק'''",
+'wlheader-enotif' => '×¢-פ×סט מעלדונג ערמעגליכט.',
+'wlheader-showupdated' => "בלעטער געענדערט זײַט ×ײַער לעצטן וויזיט זען געוויזן '''דיק'''.",
'watchmethod-recent' => 'ק×נטר×לירן לעצטע ענדערונגען פֿ×ַר ×ויפֿגעפ×ַסטע בלעטער',
'watchmethod-list' => 'ק×נטר×לירן בלעטער ×ין ×ַכטונג־ליסטע פֿ×ַר לעצטע ענדערונגען',
'watchlistcontains' => '×ייער ×ויפֿפ×סונג ליסטע ×נטה×לט {{PLURAL:$1|×יין בל×ט|$1 בלעטער}}.',
@@ -2431,7 +2515,7 @@ $1',
'contributions' => '{{GENDER:$1|ב×ניצער}} בײַשטײַערונגען',
'contributions-title' => 'בײַשטײַערונגען פֿון ב×ַניצער $1',
'mycontris' => 'בײַשטײַערונגען',
-'contribsub2' => 'וועגן $1 ($2)',
+'contribsub2' => 'פֿ×ַר {{GENDER:$3|$1}} ($2)',
'nocontribs' => 'נישט געטר×פן קיין ענדערונגען צוז×מעגעפ×סט מיט די קריטעריעס.',
'uctop' => '(לויפֿיק)',
'month' => 'ביז חודש:',
@@ -2597,11 +2681,8 @@ $1',
ד×ך ××™×– ער בל×קירט ×ַלס × ×˜×™×™×œ פֿון ×“×¢× ×ָפשט×ַנד $2, וו×ָס מ'קען ×™× ×ויפֿבל×קירן.",
'ip_range_invalid' => '×ומריכטיגער IP גרייך.',
'ip_range_toolarge' => '×ָפשט×ַנדן גרעסער ווי /$1 קען מען נישט בל×קירן.',
-'blockme' => 'בל×קירט מיך',
'proxyblocker' => 'פר×קסי בל×קער',
-'proxyblocker-disabled' => 'די פֿונקציע ××™×– ×ומ×ַקטיווירט.',
'proxyblockreason' => '×ייער ××™×™.פי. ×דרעס ××™×– געוו×רן געבל×קט צוליב ×“×¢× ×•×•×™×™×œ ד×ס ××™×– × ×פענער פר×קסי. ביטע פ×רבינדט זיך מיט ×ייער ×ינטערנעט סערוויס פר×וויידער ×דער טעקס ס×פ×רט צו ×ינפ×רמירן ×–×™×™ ×יבער ×“×¢× ×¢×¨×¢× ×¡×˜×Ÿ זיכערהייט פר×בלע×.',
-'proxyblocksuccess' => 'געט×ן.',
'cant-block-while-blocked' => '×יר קען נישט בל×קירן קיין ×נדערע ב×ניצער ווען ×יר זענט ×ליין בל×קירט.',
'ipbblocked' => '×יר קען נישט בל×קירן ×דער ×ויפבל×קירן ×נדערע ב×ניצער, ווייל ×יר זענט ×ליין בל×קירט.',
'ipbnounblockself' => '×יר זענט נישט ערלויבט זיך ×ליין ×ויסבל×קירן',
@@ -2760,6 +2841,8 @@ $1',
'thumbnail-more' => 'פ×רגרעסער',
'filemissing' => 'טעקע פֿעלט',
'thumbnail_error' => 'גרײַז ×‘×²Ö·× ×‘×ש×פֿן ד×ס קליינבילד: $1',
+'thumbnail_error_remote' => 'פֿעלער־מעלדונג פֿון $1:
+$2',
'djvu_page_error' => 'DjVu בל×ט ×רויס פֿון גרייך',
'djvu_no_xml' => "מ'קען נישט ב×קומען ×“×¢× XML פֿ×ַר דער DjVu טעקע",
'thumbnail-temp-create' => "מ'קען נישט ש×פן × ×¤×¨×וויז×רישע פ×רקלענערטע טעקע",
@@ -2909,13 +2992,8 @@ $1',
# Stylesheets
'common.css' => '/* CSS געשריבן ×“× ×•×•×¢×˜ ×פילירן ×ון ב×יינפלוסן ×לע סקינס */',
-'standard.css' => '/* CSS געשטעלט ×“× ×•×•×™×¨×§×˜ ×ויפן סט×נד×רט סקין */',
-'nostalgia.css' => '/* CSS געשטעלט ×“× ×•×•×™×¨×§×˜ × ×ר ×ויפן × ×סט×לגיע סקין */',
'cologneblue.css' => '/* CSS געשטעלט ×“× ×•×•×™×¨×§×˜ × ×ר ×ויפן קעלנישן־בלוי סקין */',
'monobook.css' => '/* סטייל ×“× ×’×¢×œ×™×™×’×˜ וועט ב××יינפלוסן ×“×¢× Monobook סקין */',
-'myskin.css' => '/* CSS געשטעלט ×“× ×•×•×™×¨×§×˜ ×ויפן MySkin סקין */',
-'chick.css' => '/* CSS געשטעלט ×“× ×•×•×™×¨×§×˜ ×ויפן טשיק סקין */',
-'simple.css' => '/* CSS געשטעלט ×“× ×•×•×™×¨×§×˜ ×ויפן ×יינפ×ך סקין */',
'modern.css' => '/* CSS געשטעלט ×“× ×•×•×™×¨×§×˜ ×ויפן מ××“×¢×¨× ×¢× ×¡×§×™×Ÿ */',
'vector.css' => '/* CSS געשטעלט ×“× ×•×•×™×¨×§×˜ × ×ר ×ויפן וועקט×ר סקין */',
@@ -2991,13 +3069,8 @@ $1',
'pageinfo-category-files' => 'צ×ָל טעקעס',
# Skin names
-'skinname-standard' => 'קל×סיש',
-'skinname-nostalgia' => '× ×סט×לגיע',
'skinname-cologneblue' => 'קעלניש בלוי',
'skinname-monobook' => 'מ×× ×בוק',
-'skinname-myskin' => 'מיין סקין',
-'skinname-chick' => 'טשיק',
-'skinname-simple' => '×יינפֿ×ַך',
'skinname-modern' => 'מ×דערן',
'skinname-vector' => 'וועקט×ר',
@@ -3077,11 +3150,25 @@ $1',
'minutes' => '{{PLURAL:$1|$1 מינוט|$1 מינוט}}',
'hours' => '{{PLURAL:$1|$1 שעה|$1 שעה}}',
'days' => '{{PLURAL:$1|$1 ט××’|$1 טעג}}',
+'weeks' => '{{PLURAL:$1|$1 וו×ך|$1 וו×כן}}',
'months' => '{{PLURAL:$1|×יין מ×× ×ַט|$1 מ×× ×ַטן}}',
'years' => '{{PLURAL:$1|×יין ×™×ָר|$1 ×™×ָר}}',
'ago' => 'פֿ×ַר $1',
'just-now' => 'גר×דע יעצט',
+# Human-readable timestamps
+'hours-ago' => "פֿ×ר $1 {{PLURAL:$1|שעה|שעה'ן}}",
+'minutes-ago' => 'פֿ×ר $1 {{PLURAL:$1|מינוט}}',
+'seconds-ago' => 'פֿ×ַר $1 {{PLURAL:$1|סעקונדע|סעקונדעס}}',
+'monday-at' => 'מ×נטיק $1',
+'tuesday-at' => 'דינסטיק $1',
+'wednesday-at' => 'מיטוו×ך $1',
+'thursday-at' => 'ד×נערשטיק $1',
+'friday-at' => 'פֿרײַטיק $1',
+'saturday-at' => 'שבת $1',
+'sunday-at' => 'זונטיק $1',
+'yesterday-at' => 'נעכטן $1',
+
# Bad image list
'bad_image_list' => 'דער פֿ×ָרמ×ַט ××™×– ×°×™ פֿ×ָלגנדיק:
@@ -3114,7 +3201,7 @@ $1',
* gpslongitude
* gpsaltitude',
-# EXIF tags
+# Exif tags
'exif-imagewidth' => 'ברייט',
'exif-imagelength' => 'הייך',
'exif-bitspersample' => 'ביטס פער ב×שט×נדטייל',
@@ -3269,7 +3356,7 @@ $1',
'exif-organisationinimage' => '×ויסגעשטעלטע ×רג×× ×™×–×ציע',
'exif-personinimage' => '×ויסגעשטעלטער מענטש',
-# EXIF attributes
+# Exif attributes
'exif-compression-1' => '×ומ-צ×מגעקוועטשט',
'exif-copyrighted-true' => 'געשיצט מיט ק×פירעכט',
@@ -3645,12 +3732,12 @@ $5
'version-skins' => 'ב×ניצער־×ייבערפל×כן',
'version-other' => '×נדער',
'version-hooks' => 'Hook סטרוקטורן',
-'version-extension-functions' => 'פ×רברייטערן פונקציעס',
'version-parser-extensiontags' => 'פ×רזער פ×רברייטערן ט×ַגן',
'version-hook-name' => '× ×מען פון hook',
'version-version' => '(ווערסיע $1)',
'version-license' => 'ליצענץ',
'version-poweredby-others' => '×ַנדערע',
+'version-poweredby-translators' => 'translatewiki.net ×יבערזעצער',
'version-credits-summary' => 'מיר ווילן ×נערקענען די פֿ×לגנדע מענטשן פֿ×ר זייער בײַשטײַערוג צו [[Special:Version|מעדיעוויקי]].',
'version-software' => '×ינסט×ַלירט ווייכוו×ַרג',
'version-software-product' => 'פר×דוקט',
@@ -3658,10 +3745,15 @@ $5
'version-entrypoints-header-entrypoint' => '×ריינג×× ×’ פונקט',
'version-entrypoints-header-url' => 'URL',
-# Special:FilePath
-'filepath' => 'טעקע שטעג',
-'filepath-page' => 'טעקע:',
-'filepath-submit' => 'גיין',
+# Special:Redirect
+'redirect-legend' => 'ווײַטערײַטערפירונג צו × ×˜×¢×§×¢ ×דער בל×ט',
+'redirect-submit' => 'גייט',
+'redirect-lookup' => 'זוכן:',
+'redirect-value' => 'ווערט:',
+'redirect-user' => 'ב×ַניצער־נומער:',
+'redirect-revision' => 'בל×ט ווערסיע',
+'redirect-file' => 'טעקע × ×מען',
+'redirect-not-exists' => 'ווערט נישט געטר×פן',
# Special:FileDuplicateSearch
'fileduplicatesearch' => 'זוכן דופליק×ַטע טעקעס',
@@ -3709,6 +3801,7 @@ $5
'tags' => 'גילטיקע ענדערונג ט×ַגן',
'tag-filter' => '[[Special:Tags|מ×ַרקירונג]] פֿילטער:',
'tag-filter-submit' => 'פֿילטער',
+'tag-list-wrapper' => '([[Special:Tags|{{PLURAL:$1|ט×Ö·×’|ט×ַגן}}]]: $2)',
'tags-title' => 'ט×ַגן',
'tags-intro' => 'דער בל×ַט ווײַזט די ט×ַגן מיט וו×ס ד×ס ווייכוו×רג קען צייכענען ×Ö· רעד×ַגירונג, ×ון זייער ב×ַטייַט.',
'tags-tag' => 'ט×Ö·×’ × ×ָמען',
@@ -3750,6 +3843,8 @@ $5
'htmlform-submit' => '×ײַנגעבן',
'htmlform-reset' => 'צוריקשטעלן ענדערונגען',
'htmlform-selectorother-other' => '×ַנדער',
+'htmlform-no' => 'ניין',
+'htmlform-yes' => '×™×',
# SQLite database support
'sqlite-has-fts' => '$1 מיט פולן-טעקסט זוכן שטיץ',
@@ -3867,4 +3962,19 @@ $5
# Image rotation
'rotate-comment' => 'בילד געדרייט דורך $1 {{PLURAL:$1|גר×ד}} זייגערווייז',
+# Limit report
+'limitreport-title' => 'פ×רזער פר×פילירן ד×טן:',
+'limitreport-cputime' => 'צײַט ב×× ×™×¥ CPU',
+'limitreport-cputime-value' => '$1 {{PLURAL:$1|סעקונדע|סעקונדעס}}',
+'limitreport-walltime' => 'עכטע צייט ניצונג',
+'limitreport-walltime-value' => '$1 {{PLURAL:$1|סעקונדע|סעקונדעס}}',
+'limitreport-ppvisitednodes' => 'פ×ר־פר×צעס×ר ב×זוכן × ×דן־צ×ל',
+'limitreport-ppgeneratednodes' => 'פ×ר־פר×צעס×ר גענערירט × ×דן־צ×ל',
+'limitreport-postexpandincludesize' => 'טעקסט גרייס × ×כן שפרייטן',
+'limitreport-postexpandincludesize-value' => '{{PLURAL:$2|בייט|בייטן}}$1/$2',
+'limitreport-templateargumentsize' => ' מוסטער פ×ר×מעטער גרייס',
+'limitreport-templateargumentsize-value' => '$1/$2 {{PLURAL:$2|בייט|בייטן}}',
+'limitreport-expansiondepth' => 'גרעסטע ×ויסשפרייט טיף',
+'limitreport-expensivefunctioncount' => 'צ×ל פזרנישע פ×רזער־פֿונקציעס',
+
);
diff --git a/languages/messages/MessagesYo.php b/languages/messages/MessagesYo.php
index 6d420c2a..1d2c0b26 100644
--- a/languages/messages/MessagesYo.php
+++ b/languages/messages/MessagesYo.php
@@ -83,9 +83,6 @@ $messages = array(
'tog-shownumberswatching' => "S'àfihàn iye àwá»n oníṣe tí wá»n tẹjú má»Ìá»",
'tog-oldsig' => 'ÃŒtá»wá»Ìbá»Ì€wé tówà:',
'tog-fancysig' => 'á¹¢e ìtá»wá»Ìbá»Ì€wé bíi ìká» wiki (láìní ìjápá»Ì€ fúnrararẹ̀)',
-'tog-externaleditor' => 'Lo aláàtúná¹£e á»Ì€tá»Ì€ látìbẹ̀rẹ̀ (fún àwá»n tó má»Ì€ nìkan, ìtò á»Ì€tá»Ì€á»Ì€tá»Ì€ pá»ndandan lórí ká»Ì€mpútà yín. [//www.mediawiki.org/wiki/Manual:External_editors More information.])',
-'tog-externaldiff' => 'Lo awoìyàtò á»Ì€tá»Ì€ látìbẹ̀rẹ̀ (fún àwá»n tó má»Ì€ nìkan, ìtò á»Ì€tá»Ì€á»Ì€tá»Ì€ pá»ndandan lórí ká»Ì€mpútà yín. [//www.mediawiki.org/wiki/Manual:External_editors ÃŒfá»Ì€rá»Ì€tónilétí mìhínhìn.])',
-'tog-showjumplinks' => 'ÃŒgbàláyè "fò lá» sí" àwá»n ìjápá»Ì€ ìṣeégbà',
'tog-uselivepreview' => 'ÃŒlo àká»Ìká»Ìyẹ̀wò lẹÌṣẹ̀kẹṣẹ̀ (JavaScript pá»ndandan) (aládànhánwò)',
'tog-forceeditsummary' => 'Kìlá»Ì€ fún mi tí àkótán àtúná¹£e bá jáº¹Ì Ã²fo',
'tog-watchlisthideown' => 'ÃŒbòmá»Ìlẹ̀ àwá»n àtúná¹£e mi nínú ìmójútó',
@@ -98,6 +95,7 @@ $messages = array(
'tog-diffonly' => 'Kò gbá»dá»Ì€ ṣàfihàn àkóónú ojúewé lábáº¹Ì Ã wá»n ìyàtá»Ì€',
'tog-showhiddencats' => "á¹¢'àfihàn àwá»n ẹ̀ka pípamá»Ì",
'tog-norollbackdiff' => 'Fo ìyàtá»Ì€ lẹÌyín síṣe ìyísẹÌyìn',
+'tog-useeditwarning' => 'Kìlá»Ì€ fún mi tí mo bá únkúrò ní ojúewé àtúná¹£e láì tíì mupamá»Ì',
'underline-always' => 'Nígbà gbogbo',
'underline-never' => 'Rárá',
@@ -161,6 +159,18 @@ $messages = array(
'oct' => 'Oṣù 10',
'nov' => 'Oṣù 11',
'dec' => 'Oṣù 12',
+'january-date' => '$1 Oṣù Kínní',
+'february-date' => '$1 Oṣù Kejì',
+'march-date' => '$1 Oṣù Kẹta',
+'april-date' => '$1 Oṣù Kẹrin',
+'may-date' => '$1 Oṣù Kàrún',
+'june-date' => '$1 Oṣù Kẹfà',
+'july-date' => '$1 Oṣù Keje',
+'august-date' => '$1 Oṣù Kẹjá»',
+'september-date' => '$1 Oṣù Kẹ̀sán',
+'october-date' => '$1 Oṣù Kẹ̀wá',
+'november-date' => '$1 Oṣù Ká»kànlá',
+'december-date' => '$1 Oṣù Kejìlá',
# Categories related messages
'pagecategories' => '{{PLURAL:$1|Ẹ̀ka|Àwá»n ẹ̀ka}}',
@@ -242,6 +252,7 @@ $messages = array(
'create-this-page' => "Ṣè'dá ojúewé yìí",
'delete' => 'ÃŒparẹÌ',
'deletethispage' => 'Pa ojúewé yi rẹÌ',
+'undeletethispage' => 'Mú ìparáº¹Ì kúrò fún ojúewé yìí',
'undelete_short' => 'ÃŒdápadà ìparáº¹Ì {{PLURAL:$1|àtúná¹£e kan|àwá»n àtúná¹£e $1}}',
'viewdeleted_short' => 'ÃŒwòran {{PLURAL:$1|àtúná¹£e ajẹÌpíparáº¹Ì kan|àwá»n àtúná¹£e ajẹÌpíparáº¹Ì $1}}',
'protect' => 'Àbò',
@@ -285,7 +296,7 @@ $1',
'pool-queuefull' => 'Oríìlà dátà ti kún',
'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).
+# 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).
'aboutsite' => 'Nípa {{SITENAME}}',
'aboutpage' => 'Project:Nípa',
'copyright' => 'Gbogbo ohun inú ibí yìí wà lábáº¹Ì $1.',
@@ -295,7 +306,6 @@ $1',
'disclaimers' => 'Ikìlá»Ì€',
'disclaimerpage' => 'Project:ÃŒkìlá»Ì€ gbogbo',
'edithelp' => 'ÃŒrànlá»Ìwá»Ì fún àtúná¹£e',
-'edithelppage' => 'Help:Àtúnṣe',
'helppage' => 'Help:Àwon àkóónú',
'mainpage' => 'Ojúewé Àká»Ìká»Ì',
'mainpage-description' => 'Ojúewé Àká»Ìká»Ì',
@@ -373,17 +383,6 @@ $1',
# General errors
'error' => 'Àsìṣe',
'databaseerror' => 'Àsìṣe ibùdó dátà',
-'dberrortext' => 'Àṣìṣe ìsoá»Ì€rá»Ì€pá»Ì€ ìtá»rá» ibùdó-dátà kan ti ṣẹlẹ̀.
-Ó lè jáº¹Ì nítorí àṣìṣe inú atòlànà.
-ÃŒgbìyànjú ìtá»rá» ibùdó-dátà ṣẹlẹ̀ jẹÌ:
-<blockquote><code>$1</code></blockquote>
-láti inú ìmúṣiá¹£áº¹Ì "<code>$2</code>".
-Ibùdó-dátà mú àṣìṣe "<samp>$3: $4</samp>" padà.',
-'dberrortextcl' => 'Àṣìṣe ìsoá»Ì€rá»Ì€pá»Ì€ ìtá»rá» ibùdó-dátà kan ti ṣẹlẹ̀.
-ÃŒgbìyànjú ìtá»rá» ibùdó-dátà ṣẹlẹ̀ jẹÌ:
-"$1"
-láti inú ìmúṣiá¹£áº¹Ì "$2".
-Ibùdó-dátà mú àṣìṣe "$3: $4" padà',
'laggedslavemode' => "'''ÃŒkìlá»Ì€:''' Ojúewé náà le má»Ì nìí àwá»n àtúná¹£e tuntun.",
'readonly' => 'Títìpa ibùdó dátà',
'enterlockreason' => 'Ẹ ṣàlàyé ìtìpa náà, àti ìgbàtí ẹ rò pé ìtìpa náà yíò kúrò.',
@@ -439,11 +438,12 @@ Kò ṣe àlàyé kankan.',
'editinginterface' => "'''ÃŒkìlá»Ì€:''' Ẹ ún ṣàtúná¹£e ojúewé tó jáº¹Ì lílò láti pèsè ìkỠìfojúkojú fún àtòlànà ká»Ì€mpútà.
Àwá»n ìyípadà sí ojúewé yìí yíò kan ìhànsí ìfojúkojú oníṣe fún àwá»n oníṣe míràn lá»Ìrí wiki yìí.
Láti á¹£'àfikún tàbí á¹£'àyípadà àwá»n ìyédèpadà fún gbogbo àwá»n wiki, ẹ já»Ì€wá»Ì ẹ lo [//translatewiki.net/wiki/Main_Page?setlang=en translatewiki.net], iṣẹÌ-á»wá»Ì ìṣá»dìbílẹ̀ MediaWiki.",
-'sqlhidden' => '(bíbòmá»Ìlẹ̀ ìbéèrè SQL)',
'cascadeprotected' => 'Ojúewé yìí ti jáº¹Ì dídáàbòbò sí àtùná¹£e, nítorípé ó wà nínú {{PLURAL:$1|ojúewé ìsàlẹ̀ yìí, tó jẹÌ|àwá»n ojúewé ìsàlẹ̀ wá»Ì€nyí, tí wá»Ìn jẹÌ}} dídáàbòbò pẹ̀lú ìyàn "ajámá»Ìra" ní títàn: $2',
'namespaceprotected' => "A kò gbàyín ní ààyè láti á¹£'àtúná¹£e àwá»n ojúewé tó wà nínú orúká»Ã yè '''$1'''.",
'customcssprotected' => 'Ẹ kò ní ìyá»Ì€nda láti ṣàtúná¹£e ojúewé CSS yìí nítorípé ó ní àwá»n ìtòjá» oníṣe ẹlòmíràn.',
'customjsprotected' => 'Ẹ kò ní ìyá»Ì€nda láti ṣàtúná¹£e ojúewé JavaScript yìí nítorípé ó ní àwá»n ìtòjá» oníṣe ẹlòmíràn.',
+'mycustomcssprotected' => 'Ẹ kò ní ìyá»Ì€nda láti ṣàtúná¹£e ojúewé CSS yìí.',
+'mycustomjsprotected' => 'Ẹ kò ní ìyá»Ì€nda láti ṣàtúná¹£e ojúewé JavaScript yìí.',
'ns-specialprotected' => 'Àtúná¹£e kò á¹£e é á¹£e sí àwá»n ojúewé pàtàkì.',
'titleprotected' => "[[User:$1|$1]] ti dínà sí dídá àká»lé yìí. ÃŒdí rẹ̀ ni pé ''$2''.",
'filereadonlyerror' => 'Àtúná¹£e kò á¹£e é á¹£e sí fáìlì "$1" nítorípé ibi-àkójá» fáìlì "$2" jáº¹Ì fún wíwò nìkàn.
@@ -468,10 +468,18 @@ Olùṣeàmójútó tó típa ṣe àlàyé yìí: "$3".',
'welcomecreation-msg' => "A ti á¹£'èdá àpamá»Ì yín.
Ẹ má»Ì gbàgbé l'áti á¹£'àtúná¹£e [[Special:Preferences|{{SITENAME}} àwá»n ìfẹÌràn]] yín.",
'yourname' => 'OrúkỠoníṣe:',
+'userlogin-yourname' => 'OrúkỠolùṣe',
+'userlogin-yourname-ph' => 'Ẹ kỠorúkỠolùṣe yín',
'yourpassword' => 'Ọ̀rá»Ì€Ã¬pamá»Ì:',
+'userlogin-yourpassword' => 'Ọ̀rá»Ì€Ã¬pamá»Ì',
+'userlogin-yourpassword-ph' => 'Ẹ ká» á»Ì€rá»Ì€Ã¬pamá»Ì yín',
+'createacct-yourpassword-ph' => 'Ẹ ká» á»Ì€rá»Ì€Ã¬pamá»Ì',
'yourpasswordagain' => 'Ká» á»Ì€rá»Ì€Ã¬pamá»Ì lẹÌẹ̀kansí:',
+'createacct-yourpasswordagain' => 'Ẹ á¹£e ìfidájú á»Ì€rá»Ì€Ã¬pamá»Ì',
+'createacct-yourpasswordagain-ph' => 'Ẹ ká» á»Ì€rá»Ì€Ã¬pamá»Ì lẹÌẹ̀kan síi',
'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é',
+'userlogin-remembermypassword' => 'Fi mí sí ìwá»lé',
+'userlogin-signwithsecure' => 'Lo ìsopá»Ì€ ẹ̀rá» tó ní àbò',
'yourdomainname' => 'Domain yín:',
'password-change-forbidden' => 'Ẹ kò le á¹£e ìyípadà á»Ì€rá»Ì€Ã¬pamá»Ì lórí wiki yìí.',
'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.',
@@ -483,18 +491,38 @@ Olùṣeàmójútó tó típa ṣe àlàyé yìí: "$3".',
'logout' => 'Ìjáde',
'userlogout' => 'Ìjáde',
'notloggedin' => "Ẹ kò tí w'á»lé",
+'userlogin-noaccount' => 'Ṣé ẹ kò ní àkópamá»Ì?',
+'userlogin-joinproject' => 'Ẹ darapá»Ì€má»Ì {{SITENAME}}',
'nologin' => "Ṣé ẹ fáº¹Ì wá»lé? '''$1'''.",
'nologinlink' => 'ÃŒforúká»sílẹ̀',
'createaccount' => 'Ẹ fi orúkỠsílẹ̀',
'gotaccount' => "Ṣé ẹ ti ní àpamá»Ì tẹÌlẹ̀? '''$1'''.",
'gotaccountlink' => "Ẹ w'á»lé",
'userlogin-resetlink' => 'À bí ẹ gbàgbé ìwá»lé yín?',
+'userlogin-resetpassword-link' => 'ÃŒtúntò á»Ì€rá»Ì€Ã¬pamá»Ì yín',
+'helplogin-url' => 'Help:Ìwolé',
+'userlogin-helplink' => '[[{{MediaWiki:helplogin-url}}|ÃŒrànlá»Ìwá»Ì láti ìwá»lé]]',
+'createacct-join' => 'Ẹ kỠìsá»Ì€rá»Ì€nípa yín sísàlẹ̀',
+'createacct-emailrequired' => 'Àdírẹ̀sì email',
+'createacct-emailoptional' => 'Àdírẹ̀sì email (kò pá»ndandan)',
+'createacct-email-ph' => 'Ẹ kỠàdírẹ̀sì email yín',
'createaccountmail' => 'Lo á»Ì€rá»Ì€Ã¬pamá»Ì àrìnnàkò ìgbàdíẹ̀ ná, kí o sì fi ránsáº¹Ì sí àdírẹ̀sì email tó wà nísàlẹ̀',
+'createacct-realname' => 'Orúká» yín gangan (kò pá»ndandan)',
'createaccountreason' => 'Ìdíẹ̀:',
+'createacct-reason' => 'Ìdí',
+'createacct-reason-ph' => 'ÃŒdí tí ẹ á¹£e fáº¹Ì dá àkópamá»Ì míràn',
+'createacct-captcha' => 'Àyẹ̀wò àbò',
+'createacct-imgcaptcha-ph' => 'Ẹ kỠìká»Ì€rá»Ì€ tí ẹ rí lókè',
+'createacct-submit' => 'ÃŒdá àkópamá»Ì yín',
+'createacct-benefit-heading' => 'Àwá»n ènìyàn bíi yín ni wá»Ìn dá {{SITENAME}}.',
+'createacct-benefit-body1' => '{{PLURAL:$1|àtúná¹£e|àwá»n àtúná¹£e}}',
+'createacct-benefit-body2' => '{{PLURAL:$1|ojúewé|àwá»n ojúewé}}',
+'createacct-benefit-body3' => ' {{PLURAL:$1|olùkópa|Àwá»n olùkópa}} aṣẹ̀ṣẹ̀ṣe',
'badretype' => 'Àwá»n á»Ì€rá»Ì€Ã¬pamá»Ì tí ẹ ká» kò já» ra wá»n.',
'userexists' => 'Orúká» oníṣe tí ẹ mú wà lá»Ìwá»Ì ẹlòmíràn.
Ẹjá»Ì€wá»Ì ẹ yan orúká» mìíràn tó yàtá»Ì€.',
'loginerror' => 'Àsìṣe ìwá»lé',
+'createacct-error' => 'Àṣìṣe ìdá àkópamá»Ì',
'createaccounterror' => 'Kò le dá àkópamá»Ì: $1',
'nocookiesnew' => 'A ti dá àpamá»Ì oníṣe, á¹£ugbá»Ìn ẹ kò tíì wá»lé.
{{SITENAME}} ún lo cookies láti gba àwá»n oníṣe wá»lé.
@@ -580,7 +608,7 @@ Láti parí ìmúwá»lẹÌ, ẹ gbá»Ìdá»Ì€ ṣètò á»Ì€rá»Ì€Ã¬pamá»Ì tu
'newpassword' => 'Ọ̀rá»Ì€Ã¬pamá»Ì tuntun:',
'retypenew' => 'Àtúntẹ̀ á»Ì€rá»Ì€Ã¬pamá»Ì tuntun:',
'resetpass_submit' => 'Ẹ á¹£e àtúntò á»Ì€rá»Ì€Ã¬pamá»Ì kí ẹ tó wá»lé',
-'resetpass_success' => 'ÃŒyípadà á»Ì€rá»Ì€Ã¬pamá»Ì yín ti já sí rere! Ẹ̀ ún wá»lé lá»Ìwá»Ì...',
+'changepassword-success' => 'ÃŒyípadà á»Ì€rá»Ì€Ã¬pamá»Ì yín ti já sí rere! Ẹ̀ ún wá»lé lá»Ìwá»Ì...',
'resetpass_forbidden' => 'Àwá»n á»Ì€rá»Ì€Ã¬pamá»Ì kò á¹£e é yípadà',
'resetpass-no-info' => 'Ẹ gbá»Ìdá»Ì€ wá»láº¹Ì láti le lá» sí ojúewé yìí tààrà.',
'resetpass-submit-loggedin' => 'ÃŒyípadà á»Ì€rá»Ì€Ã¬pamá»Ì',
@@ -592,10 +620,9 @@ Láti parí ìmúwá»lẹÌ, ẹ gbá»Ìdá»Ì€ ṣètò á»Ì€rá»Ì€Ã¬pamá»Ì tu
# Special:PasswordReset
'passwordreset' => 'ÃŒtúntò á»Ì€rá»Ì€Ã¬pamá»Ì',
-'passwordreset-text' => 'Ẹ parí fá»Ìá»Ì€mù yìí láti á¹£e ìtúntò á»Ì€rá»Ì€Ã¬pamá»Ì yín.',
'passwordreset-legend' => 'ÃŒtúntò á»Ì€rá»Ì€Ã¬pamá»Ì',
'passwordreset-disabled' => 'ÃŒdálẹÌkun ìtúntò á»Ì€rá»Ì€Ã¬pamá»Ì lórí wiki yìí.',
-'passwordreset-pretext' => '{{PLURAL:$1||Ẹ kỠìkan nínú àwá»n wẹÌwáº¹Ì dátà ìsàlẹ̀}}',
+'passwordreset-emaildisabled' => 'ÃŒdálẹÌkun lílo email lórí wiki yìí.',
'passwordreset-username' => 'OrúkỠoníṣe:',
'passwordreset-domain' => 'Àbùgbé:',
'passwordreset-capture' => 'Wo e-mail tí yíò jáde?',
@@ -839,12 +866,15 @@ Kò ṣe àlàyé kankan.',
Ó dà bíi pé a ti paárẹÌ.',
'edit-conflict' => 'ÃŒtakora áwá»n àtúná¹£e',
'edit-no-change' => 'A á¹£e àìkàsí àtúná¹£e yín, nítorípé ìká»Ì€wé kò ní àtúná¹£e kankan.',
+'postedit-confirmation' => 'Àtúná¹£e yín ti jáº¹Ì gbígbépamá»Ì.',
'edit-already-exists' => "A kò le è ṣè'dá ojúewé tuntun.
Ó pilẹ̀ ti wà.",
'defaultmessagetext' => 'ÃŒkỠìráná¹£áº¹Ì Ã tìbẹ̀rẹ̀',
'content-failed-to-parse' => 'Ìkùnà láti ṣàtúwò àkóónú $2 fún àfijúwe $1: $3',
'invalid-content-data' => 'Àkóónú dátà tí kò yẹ',
'content-not-allowed-here' => 'Àkóónú "$1" kò ní ìyá»Ì€nda lórí ojúewé [[$2]]',
+'editwarning-warning' => 'Kíkúrò ní ojúewé yìí yíò jáº¹Ì kí ẹ pòfo àwá»n àtúná¹£e tí ẹ ti á¹£e.
+Tó bá jáº¹Ì pé ẹ ti wá»lé, ẹ lè dẹÌkun ìkìlá»Ì€ yìí nínù abala "Àtúná¹£e ṣíṣe" ti àwá»n ìfẹÌràn yín.',
# Content models
'content-model-wikitext' => 'ìká»Ì€rá»Ì€ wiki',
@@ -1088,7 +1118,6 @@ Kò á¹£e é bòmá»Ìlẹ̀.',
'searchmenu-legend' => 'Àwá»n àṣàyàn àwáàrí',
'searchmenu-exists' => "'''Ojúewé tó ún jáº¹Ì \"[[:\$1]]\" wà lórí wiki yìí'''",
'searchmenu-new' => "'''Dá ojúewé \"[[:\$1]]\" sí orí wiki yìí!'''",
-'searchhelp-url' => 'Help:Àwon àkóónú',
'searchmenu-prefix' => '[[Special:PrefixIndex/$1|Ẹ lá» sí àwá»n ojúewé tí wá»Ìn ní àsopá»Ì€ yìí]]',
'searchprofile-articles' => 'Àwá»n ojúewé Àkóónú',
'searchprofile-project' => 'Àwá»n ojúewé ÃŒrànwá»Ì àti IṣẹÌ-á»wá»Ì',
@@ -1133,15 +1162,6 @@ Kò á¹£e é bòmá»Ìlẹ̀.',
Ní báyìí ná ẹ le ṣàwárí lá»Ìdá»Ì€ Google.
Àkíyèsí pé àwá»n atá»Ìka wá»n fún àkóónú {{SITENAME}} le má»Ì jáº¹Ì tuntun.',
-# Quickbar
-'qbsettings' => 'Pẹpẹ ìṣárémúlò',
-'qbsettings-none' => 'ÃŒkankan',
-'qbsettings-fixedleft' => 'Kíkàn sí òsì',
-'qbsettings-fixedright' => 'Kíkàn sí á»Ì€tún',
-'qbsettings-floatingleft' => 'Léfòó sí òsì',
-'qbsettings-floatingright' => 'Léfòó sí á»Ì€tún',
-'qbsettings-directionality' => 'Fi sí ẹ̀gbẹÌ, gẹÌgáº¹Ì bí ìdojúká» lẹÌtà-á»Ì€rá»Ì€ èdè yín bá á¹£e rí',
-
# Preferences page
'preferences' => 'Àwá»n ìfẹÌràn',
'mypreferences' => 'Àwá»n ìfẹÌràn',
@@ -1174,7 +1194,6 @@ Ní báyìí ná ẹ le ṣàwárí lá»Ìdá»Ì€ Google.
'resetprefs' => 'ÃŒpalẹ̀má»Ì àwá»n àyípadà àìmúpamá»Ì',
'restoreprefs' => 'ÃŒdápadà áwá»n ìtò àtìbẹ̀rẹ̀',
'prefs-editing' => 'Àtúnṣe ṣíṣẹ',
-'prefs-edit-boxsize' => 'Ìtóbi fèrèsé àtúnṣe',
'rows' => 'Àwá»n ìtẹ̀lé gbá»lá»já»:',
'columns' => 'Àwá»n ìtẹ̀lé gogoro:',
'searchresultshead' => 'Àwárí',
@@ -1185,9 +1204,6 @@ Ní báyìí ná ẹ le ṣàwárí lá»Ìdá»Ì€ Google.
'recentchangesdays-max' => '{{PLURAL:$1|Ọjá»Ì|Ọjá»Ì}} $1 púpá»Ì€jùlá»',
'recentchangescount' => 'Iye àtúnṣe láti fihàn látìbẹ̀rẹ̀:',
'prefs-help-recentchangescount' => 'Àwá»n àtúná¹£e tuntun, ìtàn ojúewé, àti àká»á»Ìlẹ̀ wà nínú èyí.',
-'prefs-help-watchlist-token' => 'Tí ẹ bá fílì fá»Ìá»Ì€mù yìí pẹ̀lú ká»Ìká»Ìrá»Ì àmìá»Ì€rá»Ì€ àsírí yíò dá feed RSS fún ìmójútó yín.
-ẸnikẹÌni tó bá má» ká»Ìká»Ìrá»Ì àmìá»Ì€rá»Ì€ náà nínú fá»Ìá»Ì€mù yìí yíò le ka ìmójútó yín, nítoríẹ̀ ẹ mú ná»Ìmbà tó pamá»Ì.
-Ná»Ìmbà àrìnnàkò kan nìyí tí ẹ le lò: $1',
'savedprefs' => 'Àwá»n ìfẹÌràn yín ti jẹÌmímúpapá»Ì.',
'timezonelegend' => 'Àsìkò ilẹ̀àmùrè:',
'localtime' => 'Àkókò ìbílẹ̀:',
@@ -1218,7 +1234,6 @@ Ná»Ìmbà àrìnnàkò kan nìyí tí ẹ le lò: $1',
'prefs-reset-intro' => 'Ẹ le lo ojúewé yìí láti ṣàtùntò àwá»n ìfẹÌràn yín sí àká»Ìká»Ìá¹£e ibiìtakùn yìí.
Kò ní á¹£eé dápadà má»Ì.',
'prefs-emailconfirm-label' => 'E-mail ìmúdájú:',
-'prefs-textboxsize' => 'Ìtóbi fèrèsé àtúnṣe',
'youremail' => 'E-mail:',
'username' => '{{GENDER:$1|OrúkỠoníṣe}}:',
'uid' => 'Ná»mba ìdámá»Ì€ {{GENDER:$1|oníṣe}}:',
@@ -1460,7 +1475,6 @@ Tí ẹ bá fisílẹ̀ a ó lòó láti tóka iá¹£áº¹Ì yín fún yín.',
'recentchangeslinked-feed' => 'Àtúnṣe tó báramu',
'recentchangeslinked-toolbox' => 'Àtúnṣe tó báramu',
'recentchangeslinked-title' => 'Àtúná¹£e tó báramu má»Ì "$1"',
-'recentchangeslinked-noresult' => 'Kò sí ìyàtá»Ì€ nínú àwá»n ojúewé ìjápá»Ì€ láàrin ìgbà tí ẹ sá».',
'recentchangeslinked-summary' => "ÀkójỠàwá»n àtúná¹£e tí a sẹ̀sẹ̀ á¹£e sí àwá»n ojúewé tó jápá»Ì€ wá láti ojúewé pàtó kan (tàbí sí ìkan nìnú ẹ̀ka pàtó kan).
Àwá»n ojúewé inú [[Special:Watchlist|ìmójútó yín]] jáº¹Ì '''kedere'''.",
'recentchangeslinked-page' => 'OrúkỠojúewé:',
@@ -1472,7 +1486,7 @@ Tí ẹ bá fisílẹ̀ a ó lòó láti tóka iá¹£áº¹Ì yín fún yín.',
'reuploaddesc' => 'Fagilé ìrùsókè kí ó tó padà sí fá»Ìá»Ì€mù ìrùsókè',
'upload-tryagain' => 'Ìkóólẹ̀ fáìlì ìjúwe aláàtúnṣe',
'uploadnologin' => 'Ẹ kò tíì wá»lé',
-'uploadnologintext' => 'Ẹ gbá»Ìdá»Ì€ [[Special:UserLogin|wá»lè]] láti rùsókè faili.',
+'uploadnologintext' => 'Ẹ gbá»Ìdá»Ì€ [[Special:UserLogin|wá»lè]] láti á¹£e ìrùsókè faili.',
'upload_directory_missing' => 'Àpò ìrùsókè ($1) kòsí bẹÌẹ̀sìni kò le jáº¹Ì dídá látá»wá»Ì ẹ̀rá»-ìwá»Ì€fà.',
'upload_directory_read_only' => 'Àpò ìrùsókè ($1) kò á¹£eéká» sí nínú látá»wá»Ì ẹ̀rá»-ìwá»Ì€fà.',
'uploaderror' => 'Àsìse ìrùsókè',
@@ -1696,7 +1710,6 @@ Fún àbò kúnkún, img_auth.php ti jáº¹Ì dídálẹÌkun.',
'http-read-error' => 'Àṣìṣe kíkà HTTP.',
'http-timed-out' => 'Àsìkò ìtá»rá» HTTP ti tán.',
'http-curl-error' => 'Àsìṣe ìmúwá URL: $1',
-'http-host-unreachable' => 'Kò le dé ibi URL.',
'http-bad-status' => 'Ìṣòro kan ṣẹlẹ̀ nìgbà ìtá»rá» HTTP: $1, $2',
# Some likely curl errors. More could be added from <http://curl.haxx.se/libcurl/c/libcurl-errors.html>
@@ -1849,12 +1862,6 @@ Tó bá jáº¹Ì jíjá»Ì€ gẹÌgẹÌbí oníṣe, àwá»n fáìlì tí oníṣ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',
'statistics-mostpopular' => 'Àwá»n ojúewé tí wá»Ìn jáº¹Ì wíwò jùlá»',
-'disambiguations' => 'Àwá»n ojúewé tó jápá»Ì€ má»Ì àwá»n ojúewé ìṣeojútùú',
-'disambiguationspage' => 'Template:ojútùú',
-'disambiguations-text' => "Àwá»n ojúewé ìsàlẹ̀ yìí, ó kéréjù ní àjápá»Ì€ kan sí '''ojúewé ìṣeojúùtú'''.
-Ó yẹ kí wá»n ó jápá»Ì€ sí ojúewé tó yẹ wá»Ìn.<br />
-Ojúewé kan jáº¹Ì á¹£Ã­á¹£e bíi ojúewé ìṣeojúùtú tí ó bá lo àdàká» tó jápá»Ì€ láti [[MediaWiki:Disambiguationspage]].",
-
'pageswithprop' => 'Àwá»n ojúewé tó ní ohun-ìní ojúewé',
'pageswithprop-legend' => 'Àwá»n ojúewé tó ní ohun-ìní ojúewé',
'pageswithprop-text' => 'Ojúewé yìí á¹£e àtòjỠàwá»n ojúewé tó únlo ohun-ìní ojúewé pàtò kan.',
@@ -2109,10 +2116,9 @@ A óò á¹£\'àkójỠàwá»n àtúná¹£e á»já»Ìwajú sí ojúewé yìí àti
'unwatchthispage' => "Já'wá»Ì ìmójútó ojúewé yi",
'notanarticle' => 'Kìí ṣe ojúewé àkóónú',
'notvisiblerev' => 'Àtúnyẹ̀wò gbígbẹ̀yìn látá»wá»Ì oníṣe míràn ti jáº¹Ì píparẹÌ',
-'watchnochange' => 'Kò sí ìkankan nínú àwá»n ohun ìmójútó yín tó jáº¹Ì títúná¹£e láàrin àsìkò títẹÌkalẹ̀.',
'watchlist-details' => '{{PLURAL:$1|Ojúewé $1|Àwá»n ojúewé $1}} ló wà nínú ìmójútó yín, tí a kò bá ka àwá»n ojúewé á»Ì€rá»Ì€.',
-'wlheader-enotif' => '* Ìfitónilétí e-mail wà ní gbígbàláyè.',
-'wlheader-showupdated' => "* Àwá»n ojúewé tí wá»n ti yípadà látìgbà tí ẹ ṣàbẹ̀wò wá»n gbẹ̀yìn jáº¹Ì fífihàn ní ''kedere'''",
+'wlheader-enotif' => 'Ìfitónilétí e-mail wà ní gbígbàláyè.',
+'wlheader-showupdated' => "Àwá»n ojúewé tí wá»n ti yípadà látìgbà tí ẹ ṣàbẹ̀wò wá»n gbẹ̀yìn jáº¹Ì fífihàn ní ''kedere'''",
'watchmethod-recent' => 'únwo àwá»n àtúná¹£e tuntun fún àwá»n ojúewé mímójútó',
'watchmethod-list' => 'únwo àwá»n ojúewé mímójútó fún àwá»n àtúná¹£e tuntun',
'watchlistcontains' => 'Àwá»n ìmójútó yín ní {{PLURAL:$1|ojúewé|àwá»n ojúewé}} $1 nínú.',
@@ -2524,11 +2530,8 @@ $1',
Sùgbá»Ìn ó jáº¹Ì dídílá»Ìnà gẹÌgẹÌbí ìkan nínú ìgbàjá $2, èyí sì á¹£e é má»Ì dí lá»Ìnà má»Ì.',
'ip_range_invalid' => 'Àdìmá»Ì IP aláìníìbámu.',
'ip_range_toolarge' => 'ÃŒgbàjá ìdínà tó tóbi ju /$1 kò jáº¹Ì gbígbà ní àyè.',
-'blockme' => 'Dínà mi',
'proxyblocker' => 'Olùdínà ẹ̀rá»-ìwá»Ì€fà ẹlòmíràn',
-'proxyblocker-disabled' => 'ÃŒmúṣe yìí jáº¹Ì dídálẹÌkun.',
'proxyblockreason' => 'ÀdírẹÌẹ̀sì IP yín ti jáº¹Ì dídílá»Ìnà nítorípé ó jáº¹Ì áº¹Ì€rá» alàìlórúkỠẹlòmíràn ìgboro. Ẹ sỠìsòro yìí fún olùpèsè ìwá»Ì€fà Internet yín tàbí aá¹£eàtìlẹyìn ẹ̀rá»-ìpèsè ibiiá¹£áº¹Ì yín.',
-'proxyblocksuccess' => 'Ṣetán',
'sorbsreason' => 'ÀdírẹÌẹ̀sì IP yín jáº¹Ì títòjá» bíi ẹ̀rá»-ìwá»Ì€fà ẹlòmíràn àsíílẹ̀ nínú DNSBL tí {{SITENAME}} lò.',
'sorbs_create_account_reason' => 'ÀdírẹÌẹ̀sì IP yín jáº¹Ì títòjá» bíi ẹ̀rá»-ìwá»Ì€fà ẹlòmíràn àsíílẹ̀ nínú DNSBL tí {{SITENAME}} lò.
Ẹ kò le dá àpamá»Ì.',
@@ -2997,6 +3000,16 @@ Tí ẹ bá jáº¹Ì Ã³ á¹£iṣẹÌ, ẹ̀rá» sístẹÌmù yín le kó sí ewu.
'ago' => '$1 sẹÌyìn',
'just-now' => 'nísinsìnyí',
+# Human-readable timestamps
+'monday-at' => 'Ọjá»Ìajé ní ago $1',
+'tuesday-at' => 'Ọjá»ÌìṣẹÌgun ní ago $1',
+'wednesday-at' => 'Ọjá»Ìrú ní ago $1',
+'thursday-at' => 'Ọjá»Ìbá»Ì€ ní ago $1',
+'friday-at' => 'Ọjá»Ìẹtì ní ago $1',
+'saturday-at' => 'Ọjá»ÌàbámẹÌta ní ago $1',
+'sunday-at' => 'Ọjá»Ìàìkú ní ago $1',
+'yesterday-at' => 'Àná ní ago $1',
+
# Bad image list
'bad_image_list' => 'Onírú jáº¹Ì gẹÌgáº¹Ì bíi àtèlé yìí:
Àwá»n ohun àkójá» nìkan (àwá»n ìlà tí wá»Ìn bẹ̀rẹ̀ pẹ̀lú *) ni wá»Ìn jáº¹Ì gbígbérò.
@@ -3025,7 +3038,7 @@ TóbájẹÌpé fáìlì á»Ì€hún ti jáº¹Ì títúná¹£e sí bóṣewà ní bẹ
* gpslongitude
* gpsaltitude",
-# EXIF tags
+# Exif tags
'exif-imagewidth' => 'Fífẹ̀sí',
'exif-imagelength' => 'Gígasí',
'exif-bitspersample' => 'Bit fún àkóónú ká»Ì€á»Ì€kan',
@@ -3147,7 +3160,7 @@ TóbájẹÌpé fáìlì á»Ì€hún ti jáº¹Ì títúná¹£e sí bóṣewà ní bẹ
'exif-organisationinimage' => 'ÀgbájỠtó ṣe',
'exif-personinimage' => 'Ẹni àfihàn',
-# EXIF attributes
+# Exif attributes
'exif-compression-1' => 'Àìtẹ̀pá»Ì€',
'exif-copyrighted-true' => 'Ó ní ẹ̀tá»Ì-àwòká»',
@@ -3430,7 +3443,6 @@ $5
'version-skins' => 'Skin (Àwá»Ì€)',
'version-other' => 'Òmíràn',
'version-hooks' => 'Àwá»n hook',
-'version-extension-functions' => 'Àwá»n ìmúṣe ìfàgùn',
'version-hook-name' => 'OrúkỠhook',
'version-version' => '(Àtẹ̀jáde $1)',
'version-license' => 'Ìwé àṣẹ',
@@ -3444,13 +3456,6 @@ $5
'version-entrypoints-header-entrypoint' => 'Ojú ìwá»lé',
'version-entrypoints-header-url' => 'URL',
-# Special:FilePath
-'filepath' => 'Ipaṣẹ̀ fáìlì',
-'filepath-page' => 'Faili:',
-'filepath-submit' => 'Lá»',
-'filepath-summary' => 'Ojúewé pàtàkì yìí úndá gbogbo ipasẹ̀ fáìlì kan padà.
-Àwá»n àwòrán únhàn ní kedere, àwá»n irú fáìlì míràn jáº¹Ì bíbẹ̀rẹ̀ pẹ̀lú ètò ìbáṣe wá»n tàràtà.',
-
# Special:FileDuplicateSearch
'fileduplicatesearch' => 'Ìṣàwárí fún àwá»n fáìlì àdáwòká»',
'fileduplicatesearch-summary' => 'Ìṣàwárí fún àwá»n fáìlì àdáwòká» gẹÌgẹÌbí ná»Ìmbà hash',
diff --git a/languages/messages/MessagesYue.php b/languages/messages/MessagesYue.php
index c19bd068..f0a9494a 100644
--- a/languages/messages/MessagesYue.php
+++ b/languages/messages/MessagesYue.php
@@ -13,6 +13,7 @@
* @author Kaganer
* @author KaiesTse
* @author Mark85296341
+ * @author Nemo bis
* @author Simon Shek
* @author Waihorace
* @author William915
@@ -263,9 +264,6 @@ $messages = array(
'tog-shownumberswatching' => '顯示有幾多人監視',
'tog-oldsig' => '原有簽å嘅é è¦½ï¼š',
'tog-fancysig' => '將簽å以維基字å°å¾…(冇自動連çµï¼‰',
-'tog-externaleditor' => 'é è¨­ç”¨å¤–掛編輯器(高階者專用,需è¦éŸ¿ä½ éƒ¨é›»è…¦åº¦åšä¸€å•²ç‰¹åˆ¥è¨­å®šã€‚[//www.mediawiki.org/wiki/Manual:External_editors 更多資訊。])',
-'tog-externaldiff' => 'é è¨­ç”¨å¤–掛比較器(高階者專用,需è¦éŸ¿ä½ éƒ¨é›»è…¦åº¦åšä¸€å•²ç‰¹åˆ¥è¨­å®šã€‚[//www.mediawiki.org/wiki/Manual:External_editors 更多資訊。])',
-'tog-showjumplinks' => '啟用 "跳至" å”助連çµ',
'tog-uselivepreview' => '用å³æ™‚é è¦½ï¼ˆéœ€è¦JavaScript)(實驗緊)',
'tog-forceeditsummary' => '我冇入修改註解時通知我',
'tog-watchlisthideown' => '響監視清單度隱è—我嘅編輯',
@@ -279,6 +277,8 @@ $messages = array(
'tog-showhiddencats' => '顯示隱è—é¡ž',
'tog-noconvertlink' => '唔轉連çµæ¨™é¡Œ',
'tog-norollbackdiff' => '進行å轉之後略éŽå·®ç•°',
+'tog-useeditwarning' => '當我離開未ä¿å­˜å¥½å˜…修改嗰陣警告我',
+'tog-prefershttps' => '簽到後繼續用加密連線',
'underline-always' => '全部',
'underline-never' => 'æ°¸ä¸',
@@ -463,7 +463,7 @@ $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).
+# 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).
'aboutsite' => '關於{{SITENAME}}',
'aboutpage' => 'Project:關於',
'copyright' => '響版度嘅內容係根據$1嘅æ¢æ¬¾ç™¼ä½ˆã€‚',
@@ -473,7 +473,6 @@ $1',
'disclaimers' => 'å…責è²æ˜Ž',
'disclaimerpage' => 'Project:一般å…責è²æ˜Ž',
'edithelp' => '編輯å”助',
-'edithelppage' => 'Help:編輯',
'helppage' => 'Help:目錄',
'mainpage' => '頭版',
'mainpage-description' => '頭版',
@@ -544,17 +543,6 @@ $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' => '輸入鎖資料庫嘅原因,åŒåŸ‹é è¨ˆå¹¾è€å¾Œæœƒè§£éŽ–',
@@ -600,7 +588,6 @@ $1',
'viewsourcetext' => 'ä½ å¯ä»¥ç‡å“或者複製呢一é å˜…原始碼:',
'protectedinterface' => '呢一é æ供軟件嘅介é¢æ–‡å­—,呢一é å·²ç¶“ä¿è­·å’—以é é˜²æ¿«ç”¨ã€‚',
'editinginterface' => "'''警告:'''你而家編輯緊嘅呢一個用嚟æ供介é¢æ–‡å­—嘅é é¢ã€‚響呢一é å˜…更改會影響到其他用戶使用中嘅介é¢å¤–觀。è¦ç¿»è­¯ï¼Œè«‹è€ƒæ…®åˆ©ç”¨[//translatewiki.net/wiki/Main_Page?setlang=yue translatewiki.net],一個用來為MediaWiki軟件本地化嘅計劃。",
-'sqlhidden' => '(SQL 查詢隱è—)',
'cascadeprotected' => '呢一版已經ä¿è­·å’—唔能夠編輯,因為佢係響以下嘅{{PLURAL:$1|一|å¹¾}}é åº¦åŒ…å«å’—,當中啟用咗"連串"ä¿è­·é¸é …來ä¿è­·å—°ä¸€ç‰ˆ: $2',
'namespaceprotected' => "你無權編輯響'''$1'''空間åè£é¢å˜…呢一版。",
'ns-specialprotected' => '特別é ä¿‚å””å¯ä»¥ç·¨è¼¯å˜…。',
@@ -620,7 +607,6 @@ $1',
'yourpassword' => '密碼:',
'yourpasswordagain' => 'å†è¼¸å…¥å¯†ç¢¼:',
'remembermypassword' => '響呢個ç€è¦½å™¨åº¦è¨˜ä½æˆ‘嘅登入資料 (最高維æŒ$1{{PLURAL:$1|æ—¥|æ—¥}})',
-'securelogin-stick-https' => '登入後繼續以HTTPS連接',
'yourdomainname' => '你嘅網域:',
'externaldberror' => '驗證資料庫出錯,或者唔å…許你更新你嘅外部帳戶。',
'login' => '登入',
@@ -677,7 +663,7 @@ $1',
'passwordsent' => '新嘅密碼已經寄咗畀呢ä½ç”¨æˆ¶ "$1" 嘅電郵地å€ã€‚收到之後請é‡æ–°ç™»å…¥ã€‚',
'blocked-mailpassword' => '你嘅IP地å€è¢«éŽ–ä½ï¼Œå””å¯ä»¥ç”¨å¯†ç¢¼å¾©åŽŸåŠŸèƒ½ä»¥é˜²æ­¢æ¿«ç”¨ã€‚',
'eauthentsent' => '確èªé›»éƒµå·²ç¶“傳é€åˆ°æŒ‡å®šå˜…電郵地å€ã€‚喺其它嘅郵件傳é€åˆ°å‘¢å€‹æˆ¶å£ä¹‹å‰ï¼Œä½ éœ€è¦æŒ‰é›»éƒµå˜…指示,嚟確èªå‘¢å€‹æˆ¶å£çœŸä¿‚屬於你嘅。',
-'throttled-mailpassword' => '一個密碼æ醒已經響$1個é˜é ­ä¹‹å‰ç™¼é€å’—。為咗防止濫用,響$1個é˜é ­ä¹‹å…§åªå¯ä»¥ç™¼é€ä¸€å€‹å¯†ç¢¼æ醒。',
+'throttled-mailpassword' => '一個密碼æ醒已經響$1{{PLURAL:$1|個é˜é ­}}之å‰ç™¼é€å’—。為咗防止濫用,響$1{{PLURAL:$1|個é˜é ­}}之內åªå¯ä»¥ç™¼é€ä¸€å€‹å¯†ç¢¼æ醒。',
'mailerror' => '傳é€é›»éƒµéŒ¯èª¤ï¼š $1',
'acct_creation_throttle_hit' => '利用你呢個IP地å€å˜…訪客響上一日已經開咗 $1 個戶å£ï¼Œä¿‚響呢段時間嘅上é™ã€‚
çµæžœï¼Œåˆ©ç”¨å‘¢å€‹IP地å€å˜…訪客唔å¯ä»¥éŸ¿å‘¢æ®µæ™‚é–“å†é–‹å¤šå€‹æˆ¶å£ã€‚',
@@ -709,7 +695,7 @@ $1',
'newpassword' => '新密碼:',
'retypenew' => '打多次新密碼:',
'resetpass_submit' => '設定密碼åŒç™»å…¥',
-'resetpass_success' => '你嘅密碼已經æˆåŠŸå™‰æ”¹å’—ï¼
+'changepassword-success' => '你嘅密碼已經æˆåŠŸå™‰æ”¹å’—ï¼
而家幫你登入緊...',
'resetpass_forbidden' => 'å””å¯ä»¥æ›´æ”¹å¯†ç¢¼',
'resetpass-no-info' => '你一定è¦ç™»å…¥å’—去直接入來呢一版。',
@@ -905,6 +891,8 @@ $1',
'edit-no-change' => '你嘅編輯已經略éŽï¼Œå› ç‚ºæ–‡å­—無改éŽã€‚',
'edit-already-exists' => 'å””å¯ä»¥é–‹ä¸€æ–°ç‰ˆã€‚
佢已經存在。',
+'editwarning-warning' => '離開呢一版會令到你嘅修改唔見咗。
+ä½ å¯ä»¥éŸ¿ä½ å˜…喜好設定嘅"{{int:prefs-editing}}"å°ç¯€åº¦åœç”¨å‘¢å€‹è­¦å‘Šã€‚',
# Parser/template warnings
'expensive-parserfunction-warning' => '警告: 呢一版有太多耗費嘅語法功能呼å«ã€‚
@@ -1122,7 +1110,6 @@ $1",
'searchmenu-legend' => 'æµå˜¢é¸é …',
'searchmenu-exists' => "'''響呢個wiki度有一版å«åš\"[[:\$1]]\"。'''",
'searchmenu-new' => "'''響呢個wiki度開呢版\"[[:\$1]]\"ï¼'''",
-'searchhelp-url' => 'Help:目錄',
'searchmenu-prefix' => '[[Special:PrefixIndex/$1|去ç‡ä»¥å‘¢å€‹åšé–‹é ­å˜…版]]',
'searchprofile-articles' => '內容é ',
'searchprofile-project' => '幫手åŒè¨ˆåŠƒé ',
@@ -1164,14 +1151,6 @@ $1",
'search-external' => '出é¢æµå˜¢',
'searchdisabled' => '{{SITENAME}}嘅æœå°‹åŠŸèƒ½å·²ç¶“關閉。你å¯ä»¥åˆ©ç”¨Google嚟æµã€‚ä¸éŽä½¢å“‹å°{{SITENAME}}嘅索引å¯èƒ½å””係最新嘅。',
-# Quickbar
-'qbsettings' => 'å¿«æ·åˆ—',
-'qbsettings-none' => 'ç„¡',
-'qbsettings-fixedleft' => '左邊固定',
-'qbsettings-fixedright' => 'å³é‚Šå›ºå®š',
-'qbsettings-floatingleft' => '左邊浮動',
-'qbsettings-floatingright' => 'å³é‚Šæµ®å‹•',
-
# Preferences page
'preferences' => '喜好設定',
'mypreferences' => '自訂喜好',
@@ -1201,7 +1180,6 @@ $1",
'resetprefs' => '清除未ä¿å­˜å˜…更改',
'restoreprefs' => 'æ¢å¾©å…¨éƒ¨é è¨­è¨­å®š',
'prefs-editing' => '編輯中',
-'prefs-edit-boxsize' => '編寫框大細',
'rows' => '列:',
'columns' => '行:',
'searchresultshead' => 'æµå˜¢',
@@ -1212,9 +1190,6 @@ $1",
'recentchangesdays-max' => '最多 $1 日',
'recentchangescount' => 'é è¨­é¡¯ç¤ºå˜…編輯數:',
'prefs-help-recentchangescount' => '呢個包埋最近修改ã€é æ­·å²åŒåŸ‹æ—¥èªŒç´€éŒ„。',
-'prefs-help-watchlist-token' => '響呢欄加入一個秘密匙會生æˆä¸€å€‹å°ä½ ç›£è¦–清單嘅RSSæºã€‚
-任何一ä½çŸ¥é“響呢個欄ä½å˜…匙會ç‡åˆ°ä½ å˜…監視清單,請æ€ä¸€å€‹å®‰å…¨å˜…值。
-呢度有一個任æ„生æˆå˜…值,你係å¯ä»¥åŽ»æ€å˜…: $1',
'savedprefs' => '你嘅喜好設定已經儲存。',
'timezonelegend' => '時å€:',
'localtime' => '本地時間:',
@@ -1244,7 +1219,6 @@ $1",
'prefs-common-css-js' => '共有嘅CSSåŒåŸ‹JavaScript畀所有畫é¢ç”¨ï¼š',
'prefs-reset-intro' => 'ä½ å¯ä»¥ç”¨å‘¢ç‰ˆåŽ»é‡è¨­ä½ å˜…喜好設定到網站é è¨­å€¼ã€‚呢個動作無得番轉頭。',
'prefs-emailconfirm-label' => '電郵確èª:',
-'prefs-textboxsize' => '編寫框大細',
'youremail' => '電郵:',
'username' => '用戶å:',
'uid' => '用戶 ID:',
@@ -1476,7 +1450,6 @@ $1",
'recentchangeslinked-feed' => '連çµé å˜…更改',
'recentchangeslinked-toolbox' => '連çµé å˜…更改',
'recentchangeslinked-title' => 'å°ã€Œ$1ã€æœ‰é—œå˜…更改',
-'recentchangeslinked-noresult' => '響呢一段時間內連çµé ä¸¦ç„¡æ›´æ”¹ã€‚',
'recentchangeslinked-summary' => "呢一個特別é åˆ—示咗''ç”±''所畀到嘅一版連çµåˆ°é å˜…最近更改(或者係指定分類嘅æˆå“¡ï¼‰ã€‚
響[[Special:Watchlist|你張監視清單]]嘅版會以'''粗體'''顯示。",
'recentchangeslinked-page' => 'é å:',
@@ -1646,7 +1619,6 @@ $1',
'http-read-error' => 'HTTP讀å–錯誤。',
'http-timed-out' => 'HTTP請求已éŽæ™‚。',
'http-curl-error' => 'æ“·å–URL嗰陣出錯:$1',
-'http-host-unreachable' => '到唔到URL。',
'http-bad-status' => '當åšç·ŠHTTP請求嗰陣出ç¾å’—å•é¡Œï¼š$1 $2',
# Some likely curl errors. More could be added from <http://curl.haxx.se/libcurl/c/libcurl-errors.html>
@@ -1789,11 +1761,6 @@ $1',
'statistics-users-active-desc' => '響$1æ—¥å‰åšéŽå‹•ä½œå˜…用戶',
'statistics-mostpopular' => '最多人ç‡å˜…é ',
-'disambiguations' => 'æžæ¸…楚é ',
-'disambiguationspage' => 'Template:disambig
-Template:æžæ¸…楚',
-'disambiguations-text' => "以下呢啲é é¢é€£çµåŽ»ä¸€å€‹'''æžæ¸…楚é '''。佢哋先至應該指去正確嘅主題。<br />如果一個é é¢é€£çµè‡ª[[MediaWiki:Disambiguationspage]],噉就會當佢係æžæ¸…楚é ã€‚",
-
'doubleredirects' => 'é›™é‡è·³è½‰',
'doubleredirectstext' => 'æ¯ä¸€è¡Œéƒ½é †æ¬¡åºå¯«ä½ç¬¬ä¸€é å,佢嘅目的é ï¼ŒåŒåŸ‹ç›®çš„é å†æŒ‡åŽ»é‚Šåº¦ã€‚改嘅時候,應該將第一個跳轉é è½‰å…¥ç¬¬ä¸‰é ã€‚
<del>劃咗</del>嘅項目係已經解決咗嘅。',
@@ -2017,10 +1984,9 @@ Template:æžæ¸…楚',
'unwatchthispage' => 'åœæ­¢ç›£è¦–',
'notanarticle' => '唔係一個內容é ',
'notvisiblerev' => '上次由唔åŒç”¨æˆ¶å˜…修訂已經刪除咗',
-'watchnochange' => '響顯示嘅時間之內,你所監視嘅é é¢ä¸¦ç„¡ä»»ä½•å˜…更改。',
'watchlist-details' => '唔計討論é ï¼Œæœ‰ $1 版響你個監視清單度。',
-'wlheader-enotif' => '* é›»å­éƒµä»¶é€šçŸ¥å·²ç¶“啟用。',
-'wlheader-showupdated' => "* '''粗體字'''嘅é éŸ¿ä½ ä¸Šæ¬¡åšŸä¹‹å¾Œè¢«äººæ”¹éŽ",
+'wlheader-enotif' => 'é›»å­éƒµä»¶é€šçŸ¥å·²ç¶“啟用。',
+'wlheader-showupdated' => "'''粗體字'''嘅é éŸ¿ä½ ä¸Šæ¬¡åšŸä¹‹å¾Œè¢«äººæ”¹éŽ",
'watchmethod-recent' => 'ç‡ç·Šæœ€è¿‘修改中有邊é ç›£è¦–ç·Š',
'watchmethod-list' => 'ç‡ç·Šè¢«ç›£è¦–é æœ‰ä¹œæ–°ä¿®æ”¹',
'watchlistcontains' => '你嘅監視清單è£é¢æœ‰$1é ã€‚',
@@ -2362,11 +2328,8 @@ $1',
'ipb_blocked_as_range' => '錯誤:個IP $1 無直接å°éŽ–,唔å¯ä»¥è§£å°ã€‚但係佢係響 $2 嘅å°éŽ–範åœä¹‹å…§ï¼Œå—°æ®µç¯„åœä¿‚å¯ä»¥è§£å°å˜…。',
'ip_range_invalid' => '無效嘅IP範åœ',
'ip_range_toolarge' => 'å¤§éŽ /$1 嘅å°éŽ–範åœä¿‚唔容許嘅。',
-'blockme' => 'å°éŽ–我',
'proxyblocker' => 'Proxy å°éŽ–器',
-'proxyblocker-disabled' => '呢個功能已經åœç”¨ã€‚',
'proxyblockreason' => '你嘅IP係一個公開(指任何人都å¯ä»¥ç”¨ï¼Œç„¡é ˆèº«ä»½èªè­‰ï¼Ÿï¼‰å˜…代ç†åœ°å€ï¼Œå› æ­¤è¢«å°éŽ–。請è¯çµ¡ä½ å˜…Internetæœå‹™æ供商或技術支æ´ï¼Œå‘佢哋報告呢個嚴é‡å˜…安全å•é¡Œã€‚',
-'proxyblocksuccess' => '完æˆã€‚',
'sorbsreason' => '你嘅IP地å€å·²ç¶“畀響{{SITENAME}}度用嘅DNSBL列咗åšå…¬é–‹ä»£ç†ã€‚',
'sorbs_create_account_reason' => '你嘅IP地å€å·²ç¶“畀響{{SITENAME}}度用嘅DNSBL列咗åšå…¬é–‹ä»£ç†ã€‚ä½ å””å¯ä»¥é–‹æ–°æˆ¶å£ã€‚',
'cant-block-while-blocked' => '當你被å°éŽ–嗰陣唔å¯ä»¥å°éŽ–其他用戶。',
@@ -2646,27 +2609,16 @@ $1',
# Stylesheets
'common.css' => '/* 響呢度放 CSS 碼來改æˆå€‹ç¶²ç«™å˜…ç•«é¢ */',
-'standard.css' => '/* 響呢度放 CSS ç¢¼åŽ»æ”¹ç”¨æˆ¶ç”¨å˜…å‚³çµ±ç•«é¢ */',
-'nostalgia.css' => '/* 響呢度放 CSS ç¢¼åŽ»æ”¹ç”¨æˆ¶ç”¨å˜…æ‡·èˆŠç•«é¢ */',
'cologneblue.css' => '/* 響呢度放 CSS 碼去改用戶用嘅科隆è—ç•«é¢ */',
'monobook.css' => '/* 響呢度放 CSS 碼去改用戶用嘅 Monobook ç•«é¢ */',
-'myskin.css' => '/* 響呢度放 CSS ç¢¼åŽ»æ”¹ç”¨æˆ¶ç”¨å˜…æˆ‘å˜…ç•«é¢ */',
-'chick.css' => '/* 響呢度放 CSS 碼去改用戶用嘅ä¿ç•«é¢ */',
-'simple.css' => '/* 響呢度放 CSS ç¢¼åŽ»æ”¹ç”¨æˆ¶ç”¨å˜…ç°¡å–®ç•«é¢ */',
'modern.css' => '/* 響呢度放 CSS ç¢¼åŽ»æ”¹ç”¨æˆ¶ç”¨å˜…æ‘©ç™»ç•«é¢ */',
'vector.css' => '/* 響呢度放 CSS 碼去改用戶用嘅域é”ç•«é¢ */',
'print.css' => '/* 響呢度放 CSS 碼去改打å°è¼¸å‡º */',
-'handheld.css' => '/* 響呢度放 CSS 碼去改響 $wgHandheldStyle 設定手æè£ç½®ç•«é¢ */',
# Scripts
'common.js' => '/* 響æ¯ä¸€æ¬¡å€‹é é¢è¼‰å…¥æ™‚,所有用戶都會載入呢度任何嘅JavaScript。 */',
-'standard.js' => '/* 響æ¯ä¸€æ¬¡å€‹é é¢è¼‰å…¥æ™‚,用標準畫é¢å˜…用戶都會載入呢度任何嘅JavaScript */',
-'nostalgia.js' => '/* 響æ¯ä¸€æ¬¡å€‹é é¢è¼‰å…¥æ™‚,用懷舊畫é¢å˜…用戶都會載入呢度任何嘅JavaScript */',
'cologneblue.js' => '/* 響æ¯ä¸€æ¬¡å€‹é é¢è¼‰å…¥æ™‚,用科隆è—ç•«é¢å˜…用戶都會載入呢度任何嘅JavaScript */',
'monobook.js' => '/* 響æ¯ä¸€æ¬¡å€‹é é¢è¼‰å…¥æ™‚,用 Monobook ç•«é¢å˜…用戶都會載入呢度任何嘅JavaScript */',
-'myskin.js' => '/* 響æ¯ä¸€æ¬¡å€‹é é¢è¼‰å…¥æ™‚,用我嘅畫é¢å˜…用戶都會載入呢度任何嘅JavaScript */',
-'chick.js' => '/* 響æ¯ä¸€æ¬¡å€‹é é¢è¼‰å…¥æ™‚,用ä¿ç•«é¢å˜…用戶都會載入呢度任何嘅JavaScript */',
-'simple.js' => '/* 響æ¯ä¸€æ¬¡å€‹é é¢è¼‰å…¥æ™‚,用簡單畫é¢å˜…用戶都會載入呢度任何嘅JavaScript */',
'modern.js' => '/* 響æ¯ä¸€æ¬¡å€‹é é¢è¼‰å…¥æ™‚,用摩登畫é¢å˜…用戶都會載入呢度任何嘅JavaScript */',
'vector.js' => '/* 響æ¯ä¸€æ¬¡å€‹é é¢è¼‰å…¥æ™‚,用域é”ç•«é¢å˜…用戶都會載入呢度任何嘅JavaScript */',
@@ -2695,13 +2647,8 @@ $1',
'spam_blanking' => '全部版本都å«æœ‰æŒ‡åŽ»$1嘅連çµï¼Œç•™ç©º',
# Skin names
-'skinname-standard' => '傳統',
-'skinname-nostalgia' => '懷舊',
'skinname-cologneblue' => '科隆è—',
'skinname-monobook' => 'MonoBook',
-'skinname-myskin' => '我嘅畫é¢',
-'skinname-chick' => 'ä¿',
-'skinname-simple' => 'ç°¡å–®',
'skinname-modern' => 'æ‘©ç™»',
'skinname-vector' => 'Vector',
@@ -2765,6 +2712,12 @@ $1',
'bydate' => '以時間',
'sp-newimages-showfrom' => '顯示由$1 $2嘅新檔',
+# Video information, used by Language::formatTimePeriod() to format lengths in the above messages
+'hours' => '$1{{PLURAL:$1|個é˜}}',
+
+# Human-readable timestamps
+'hours-ago' => '$1{{PLURAL:$1|個é˜}}之å‰',
+
# Bad image list
'bad_image_list' => '請根據下é¢å˜…æ ¼å¼åŽ»å¯«:
@@ -2818,7 +2771,7 @@ Variants for Chinese language
* gpslongitude
* gpsaltitude',
-# EXIF tags
+# Exif tags
'exif-imagewidth' => 'é—Š',
'exif-imagelength' => '高',
'exif-bitspersample' => 'æ¯éƒ¨ä½ä½å…ƒæ•¸',
@@ -2934,7 +2887,7 @@ Variants for Chinese language
'exif-gpsdifferential' => 'GPS 差動修正',
'exif-objectname' => '短標題',
-# EXIF attributes
+# Exif attributes
'exif-compression-1' => '未壓éŽ',
'exif-unknowndate' => '未知日期',
@@ -3069,7 +3022,7 @@ Variants for Chinese language
'exif-gpsmeasuremode-3' => '三維é‡åº¦',
# Pseudotags used for GPSSpeedRef
-'exif-gpsspeed-k' => 'åƒç±³/å°æ™‚',
+'exif-gpsspeed-k' => '公里/å°æ™‚',
'exif-gpsspeed-m' => '英里/å°æ™‚',
'exif-gpsspeed-n' => '浬/å°æ™‚',
@@ -3244,7 +3197,6 @@ $5
'version-other' => '其他',
'version-mediahandlers' => '媒體處ç†å™¨',
'version-hooks' => '鈎',
-'version-extension-functions' => '擴展函數',
'version-parser-extensiontags' => '語法擴展標籤',
'version-parser-function-hooks' => '語法函數鈎',
'version-hook-name' => '鈎å',
@@ -3262,12 +3214,6 @@ MediaWiki是基於使用目的而加以發佈,但係就唔會負上任何嘅è²
'version-software-product' => '產å“',
'version-software-version' => '版本',
-# Special:FilePath
-'filepath' => '檔案路徑',
-'filepath-page' => '檔å:',
-'filepath-submit' => '去',
-'filepath-summary' => '呢個特別é æ‹Žä¸€å€‹æª”案嘅完整路徑。圖åƒæœƒä»¥å®Œæ•´å˜…解åƒåº¦é¡¯ç¤ºï¼Œå…¶å®ƒå˜…檔案類型會以åŒä½¢å“‹é—œè¯å’—嘅程å¼å•Ÿå‹•ã€‚',
-
# Special:FileDuplicateSearch
'fileduplicatesearch' => '㨂é‡è¦†æª”案',
'fileduplicatesearch-summary' => '用é‡è¦†æª”案嘅切細值去æµå€‹æª”案係唔係é‡è¦†ã€‚',
@@ -3367,4 +3313,7 @@ MediaWiki是基於使用目的而加以發佈,但係就唔會負上任何嘅è²
'searchsuggest-search' => 'æµå˜¢',
'searchsuggest-containing' => 'å單傳é€ç·Š...',
+# Durations
+'duration-hours' => '$1{{PLURAL:$1|個é˜}}',
+
);
diff --git a/languages/messages/MessagesZea.php b/languages/messages/MessagesZea.php
index 2715b8f1..c14af626 100644
--- a/languages/messages/MessagesZea.php
+++ b/languages/messages/MessagesZea.php
@@ -73,9 +73,6 @@ $messages = array(
'tog-shownumberswatching' => "'t Antal gebrukers weerheven 't a deêze pahina volg",
'tog-oldsig' => 'Bestaende onderteêkenienge',
'tog-fancysig' => "As wikitekst behandel'n (zonder automaotische verwiezienge ni de gebrukersbladzie)",
-'tog-externaleditor' => 'Standard een externe tekstbewerker gebruken (alleêne vò experts - vò deêze functie ben speciaole ienstellienge nudig. [//www.mediawiki.org/wiki/Manual:External_editors Meê informaosie]).',
-'tog-externaldiff' => 'Standard een extern verheliekiengsprohramma gebruken (alleên vò experts - vò deêze functie ben speciaole ienstelliengen nudig. [//www.mediawiki.org/wiki/Manual:External_editors Meê informaosie]).',
-'tog-showjumplinks' => '“hi naeâ€-toehankelijkeidslienks inschaokelen',
'tog-uselivepreview' => '“live voevertoônienge†gebruken (JavaScript vereist – experimenteêl)',
'tog-forceeditsummary' => 'Heef me een meldieng bie een lehe saemenvattieng',
'tog-watchlisthideown' => 'Eihen bewerkiengen op men volglieste verberhen',
@@ -273,7 +270,7 @@ $1",
'pool-queuefull' => 'De wachtrieë von de poel is vaol',
'pool-errorunknown' => "Er is 'n onbekande fout ophetreed'n",
-# 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).
+# 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).
'aboutsite' => 'Over {{SITENAME}}',
'aboutpage' => 'Project:Info',
'copyright' => 'Den inoud is beschikbaer onder de $1.',
@@ -283,7 +280,6 @@ $1",
'disclaimers' => 'Voebehoud',
'disclaimerpage' => 'Project:Alhemeên voebehoud',
'edithelp' => "Ulpe bie't bewerken",
-'edithelppage' => 'Help:Bewerken',
'helppage' => 'Help:Inoud',
'mainpage' => 'Vòblad',
'mainpage-description' => 'Vòblad',
@@ -350,17 +346,6 @@ Een lieste mie speciaole pagina’s sti op [[Special:SpecialPages|speciaole pagi
# General errors
'error' => 'Fout',
'databaseerror' => 'Databasefout',
-'dberrortext' => "Der is een syntaxisfout in 't databaseverzoek opetreeën.
-Meuhlijk zit der een fout in de software.
-'t Lèste verzoek an de database was:
-<blockquote><tt>$1</tt></blockquote>
-vanuut de functie “<tt>$2</tt>â€.
-MySQL haf de foutmeldieng “<tt>$3: $4</tt>â€.",
-'dberrortextcl' => "Der is een syntaxisfout in 't databaseverzoek opetreeën.
-'t Lèste verzoek an de database was:
-“$1â€
-vanuut de functie “$2â€.
-MySQL haf de volhende foutmeldieng: “$3: $4â€",
'laggedslavemode' => "Waerschuwieng: de pahina zou verouwerd kunn'n zien.",
'readonly' => 'Database heblokkeerd',
'enterlockreason' => 'Heef een reeën op voe de blokkaode en heef op wunnir a die warschijnlijk wor opeheven',
@@ -404,7 +389,6 @@ Probeer 't over een antal menuten wee.",
'viewsourcetext' => 'Je kan de brontekst van deêze pagina bekieken en kopiëren:',
'protectedinterface' => "Deêze pagina bevat tekst voe berichen van de software en is beveiligd om misbruuk te voorkomm'n.",
'editinginterface' => "'''Waerschuwienge:''' Je bewerk een pagina die a gebruukt wor deur de software. Bewerkiengen op deêze pagina beïnvloeden de gebrukersinterface van iedereên. Overweeg voe vertaeliengen om [//translatewiki.net/wiki/Main_Page?setlang=zea translatewiki.net] te gebruken, 't vertaeliengsproject voe MediaWiki.",
-'sqlhidden' => '(SQL-zoekopdracht verborhen)',
'cascadeprotected' => "Deêze pagina kan nie bewerkt worn, omda 't een is openomen in de volhende {{PLURAL:$1|pagina|pagina's}} die beveiligd {{PLURAL:$1|is|zien}} mie de cascaode-optie:
$2",
'namespaceprotected' => "Je ei hin rechen om pagina's in de naemruumte '''$1''' te bewerken.",
@@ -495,7 +479,7 @@ Neheer dit bericht as deêze gebruker zonder joe medeweten is anemikt.',
'newpassword' => 'Nieuw wachtwoôrd:',
'retypenew' => 'Herhaolieng nieuwe wachtwoôrd:',
'resetpass_submit' => "Wachtwoôrd instell'n en anmelden",
-'resetpass_success' => 'Je wachtwoord is ewiezigd. Bezig mie anmelden ...',
+'changepassword-success' => 'Je wachtwoord is ewiezigd. Bezig mie anmelden ...',
'resetpass_forbidden' => "Wachtwoôrden kunn'n op {{SITENAME}} nie ewiezigd worn",
# Edit page toolbar
@@ -811,7 +795,6 @@ Zurg da je bie deêze wiezigieng de heschiedenisdeurloôpendeid van de pagina be
'viewprevnext' => 'Bekiek ($1 {{int:pipe-separator}} $2) ($3).',
'searchmenu-exists' => "'''Er is 'n pagina genaemd \"[[:\$1]]\" op deêze wiki.'''",
'searchmenu-new' => "'''De pagina \"[[:\$1]]\" anmaek'n op deêze wiki.'''",
-'searchhelp-url' => 'Help:Inoud',
'searchprofile-articles' => "Inhoudelike pagina's",
'searchprofile-project' => "Hilp- en projectpagina's",
'searchprofile-images' => 'Multimedia',
@@ -842,14 +825,6 @@ Zurg da je bie deêze wiezigieng de heschiedenisdeurloôpendeid van de pagina be
Je kan gebruuk maeken van Google.
De hehevens over {{SITENAME}} zien meuhlijk nie bie'ewerkt.",
-# Quickbar
-'qbsettings' => 'Menubalke',
-'qbsettings-none' => 'Uuteschaokeld',
-'qbsettings-fixedleft' => 'Lienks vast',
-'qbsettings-fixedright' => 'Rechs vast',
-'qbsettings-floatingleft' => 'Lienks zwevend',
-'qbsettings-floatingright' => 'Rechs zwevend',
-
# Preferences page
'preferences' => 'Vòkeuren',
'mypreferences' => 'Mien vòkeuren',
@@ -991,7 +966,6 @@ Een nie anekruusd vienkvakje beteêken da de gebruker hin lid is van de hroep.",
'recentchangeslinked-feed' => 'Gerelateerde bewerkiengen',
'recentchangeslinked-toolbox' => 'Gerelateerde bewerkiengen',
'recentchangeslinked-title' => 'Wiezigiengen verwant an "$1"',
-'recentchangeslinked-noresult' => "Der zien hin bewerkiengen in de heheven periode ewist op de pagina's die an vanaf ier elienkt worn.",
'recentchangeslinked-summary' => "Deze speciaole pagina geeft de laetste bewerkiengen weer op pagina's waerheê verwezen òdt vanof 'n angegeven pagina of vanuut pagina's in 'n angegeven categorie.
Pagina's die op [[Special:Watchlist|je volglieste]] staen wòdde '''vet''' weergegeven.",
'recentchangeslinked-page' => 'Paginanaem:',
@@ -1062,8 +1036,6 @@ De [$2 pagina mè de bestandsbeschrievienge] wòdt hieronder weergegeev'n.",
# Statistics
'statistics' => "Stattistiek'n",
-'disambiguationspage' => 'Template:Deurverwiespagina',
-
'brokenredirectstext' => 'De volgende deuverwieziengen stiere deu nae bladzie die nie bestae:',
# Miscellaneous special pages
@@ -1136,7 +1108,6 @@ A je de bladzie laeter weêr van je volglieste afaele wil, klik dan op \"nie meÃ
'watch' => 'Volg',
'watchthispage' => 'Bekiek deêze bladzie',
'unwatch' => 'Nie meêr volge',
-'watchnochange' => "D'r is in d'n opgevrogen tied niks op je volglieste veranderd.",
'watchlist-details' => "Er {{PLURAL:$1|sti eên pagina|staen $1 pagina's}} op je volglieste, exclusief overlegpagina's.",
'watchlistcontains' => 'Uw volglieste bevat $1 {{PLURAL:$1|bladzie|bladzies}}.',
'wlshowlast' => 'Laetste $1 uur, $2 daegen bekieken ($3)',
diff --git a/languages/messages/MessagesZh_hans.php b/languages/messages/MessagesZh_hans.php
index dadd9049..9d66edec 100644
--- a/languages/messages/MessagesZh_hans.php
+++ b/languages/messages/MessagesZh_hans.php
@@ -33,6 +33,7 @@
* @author Hydra
* @author Hzy980512
* @author Jding2010
+ * @author Jetlag
* @author Jidanni
* @author Jimmy xu wrk
* @author Kaganer
@@ -58,6 +59,7 @@
* @author Simon Shek
* @author Slboat
* @author StephDC
+ * @author Stevenliuyi
* @author Supaiku
* @author Tommyang
* @author Waihorace
@@ -125,15 +127,15 @@ $namespaceAliases = array(
$specialPageAliases = array(
'Activeusers' => array( '活跃用户' ),
- 'Allmessages' => array( '所有消æ¯' ),
+ 'Allmessages' => array( '所有信æ¯' ),
'Allpages' => array( '所有页é¢' ),
- 'Ancientpages' => array( '最早页é¢' ),
+ 'Ancientpages' => array( '最è€é¡µé¢' ),
'Badtitle' => array( '无效标题' ),
'Blankpage' => array( '空白页é¢' ),
'Block' => array( 'å°ç¦ç”¨æˆ·' ),
'Blockme' => array( '自我å°ç¦' ),
'Booksources' => array( '网络书æº' ),
- 'BrokenRedirects' => array( 'æŸåçš„é‡å®šå‘页' ),
+ 'BrokenRedirects' => array( 'å—æŸé‡å®šå‘页' ),
'Categories' => array( '页é¢åˆ†ç±»' ),
'ChangeEmail' => array( '修改邮箱' ),
'ChangePassword' => array( '修改密ç ' ),
@@ -387,9 +389,6 @@ $messages = array(
'tog-shownumberswatching' => '显示监视用户数',
'tog-oldsig' => '当å‰ç­¾å:',
'tog-fancysig' => '将签å视为维基文本(ä¸è‡ªåŠ¨ç”Ÿæˆé“¾æŽ¥ï¼‰',
-'tog-externaleditor' => '默认使用外部编辑器(供高级用户使用,需è¦åœ¨æ‚¨çš„计算机上åšç‰¹åˆ«è®¾ç½®ã€‚[//www.mediawiki.org/wiki/Manual:External_editors 更多信æ¯ã€‚])',
-'tog-externaldiff' => '默认使用外部版本差异工具(供高级用户使用,需è¦åœ¨æ‚¨çš„计算机上åšç‰¹åˆ«è®¾ç½®ã€‚[//www.mediawiki.org/wiki/Manual:External_editors 更多信æ¯ã€‚])',
-'tog-showjumplinks' => 'å¯ç”¨â€œè·³è½¬åˆ°â€è®¿é—®é“¾æŽ¥',
'tog-uselivepreview' => '使用实时预览(实验)',
'tog-forceeditsummary' => '未输入编辑摘è¦æ—¶æ醒我',
'tog-watchlisthideown' => 'éšè—监视列表中的我的编辑',
@@ -403,6 +402,8 @@ $messages = array(
'tog-showhiddencats' => '显示éšè—分类',
'tog-noconvertlink' => 'åœç”¨é“¾æŽ¥æ–‡å­—转æ¢',
'tog-norollbackdiff' => '执行回退åŽä¸æ˜¾ç¤ºå·®å¼‚',
+'tog-useeditwarning' => '当我离开有未ä¿å­˜æ›´æ”¹çš„编辑页é¢æ—¶æ醒我',
+'tog-prefershttps' => '登录时始终使用安全连接',
'underline-always' => '始终',
'underline-never' => '从ä¸',
@@ -466,6 +467,18 @@ $messages = array(
'oct' => '10月',
'nov' => '11月',
'dec' => '12月',
+'january-date' => '1月$1日',
+'february-date' => '2月$1日',
+'march-date' => '3月$1日',
+'april-date' => '4月$1日',
+'may-date' => '5月$1日',
+'june-date' => '6月$1日',
+'july-date' => '7月$1日',
+'august-date' => '8月$1日',
+'september-date' => '9月$1日',
+'october-date' => '10月$1日',
+'november-date' => '11月$1日',
+'december-date' => '12月$1日',
# Categories related messages
'pagecategories' => '$1个分类',
@@ -548,6 +561,7 @@ $messages = array(
'create-this-page' => '创建本页',
'delete' => '删除',
'deletethispage' => '删除本页',
+'undeletethispage' => 'æ¢å¤æœ¬é¡µ',
'undelete_short' => 'æ¢å¤$1个编辑',
'viewdeleted_short' => '查看$1个被删除的编辑',
'protect' => 'ä¿æŠ¤',
@@ -589,7 +603,7 @@ $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).
+# 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).
'aboutsite' => '关于{{SITENAME}}',
'aboutpage' => 'Project:关于',
'copyright' => '除éžå¦æœ‰å£°æ˜Žï¼Œæœ¬ç½‘站内容采用$1授æƒã€‚',
@@ -599,7 +613,6 @@ $1',
'disclaimers' => 'å…责声明',
'disclaimerpage' => 'Project:å…责声明',
'edithelp' => '编辑帮助',
-'edithelppage' => 'Help:编辑',
'helppage' => 'Help:目录',
'mainpage' => '首页',
'mainpage-description' => '首页',
@@ -675,15 +688,11 @@ $1',
# General errors
'error' => '出错',
'databaseerror' => 'æ•°æ®åº“错误',
-'dberrortext' => 'å‘生数æ®åº“查询语法错误。
-å¯èƒ½æ˜¯ç”±äºŽè½¯ä»¶è‡ªèº«çš„错误所引起。
-最åŽä¸€æ¬¡æ•°æ®åº“查询指令是:
-<blockquote><code>$1</code></blockquote>
-æ¥è‡ªäºŽå‡½æ•°â€œ<code>$2</code>â€ã€‚
-æ•°æ®åº“返回错误“<samp>$3: $4</samp>â€ã€‚',
-'dberrortextcl' => 'å‘生了数æ®åº“查询语法错误。最åŽä¸€æ¬¡æ•°æ®åº“查询指令是:
-“$1â€
-æ¥è‡ªå‡½æ•°â€œ$2â€å†…。数æ®åº“返回错误“$3: $4â€ã€‚',
+'databaseerror-text' => 'æ•°æ®åº“查询出错。这å¯èƒ½è¡¨æ˜Žè½¯ä»¶ä¸­å­˜åœ¨æ¼æ´žï¼ˆbug)。',
+'databaseerror-textcl' => 'æ•°æ®åº“查询出错。',
+'databaseerror-query' => '查询:$1',
+'databaseerror-function' => '函数:$1',
+'databaseerror-error' => '出错:$1',
'laggedslavemode' => "'''警告:'''页é¢å¯èƒ½æ²¡æœ‰åŒ…å«æœ€è¿‘的更新。",
'readonly' => 'æ•°æ®åº“被é”定',
'enterlockreason' => '请输入é”定的原因(包括预计解é”的时间)',
@@ -715,6 +724,7 @@ $1',
它å¯èƒ½å·²è¢«å…¶ä»–人删除了。',
'cannotdelete-title' => '无法删除“$1â€',
'delete-hook-aborted' => '删除被扩展钩å­å–消。钩å­å¹¶æ²¡æœ‰ç»™å‡ºè§£é‡Šã€‚',
+'no-null-revision' => '无法创建对"$1"页é¢æ–°çš„空白修订',
'badtitle' => '错误标题',
'badtitletext' => '所请求页é¢çš„标题是无效的ã€ä¸å­˜åœ¨ï¼Œè·¨è¯­è¨€æˆ–è·¨wiki链接的标题错误。它å¯èƒ½åŒ…å«ä¸€ä¸ªæˆ–更多的ä¸èƒ½ç”¨äºŽæ ‡é¢˜çš„字符。',
'perfcached' => '下列数æ®å·²ç¼“存,但å¯èƒ½å·²è¿‡æ—¶ã€‚最高{{PLURAL:$1|一个结果|$1个结果}}在缓存中å¯ç”¨ã€‚',
@@ -736,12 +746,15 @@ $1',
'editinginterface' => "'''警告:'''您正在编辑的页é¢æ˜¯ç”¨äºŽæ供软件的界é¢æ–‡å­—。
改å˜æ­¤é¡µå°†å½±å“其他在此wiki上的用户界é¢å¤–观。
如欲修改所有wiki的翻译,请到[//translatewiki.net/ translatewiki.net]上的MediaWiki本地化计划。",
-'sqlhidden' => '(SQL查询已éšè—)',
'cascadeprotected' => '此页é¢å·²è¢«ä¿æŠ¤ï¼Œå› ä¸ºè¿™ä¸ªé¡µé¢è¢«ä»¥ä¸‹å·²æ ‡æ³¨â€œè”é”ä¿æŠ¤â€çš„{{PLURAL:$1|一个|多个}}被ä¿æŠ¤é¡µé¢åŒ…å«ï¼š
$2',
'namespaceprotected' => "您没有æƒé™ç¼–辑'''$1'''å字空间内的页é¢ã€‚",
'customcssprotected' => '您没有æƒé™ç¼–辑此CSS页é¢ï¼Œå› ä¸ºå®ƒåŒ…å«å¦ä¸€ä½ç”¨æˆ·çš„个人设置。',
'customjsprotected' => '您没有æƒé™ç¼–辑此JavaScript页é¢ï¼Œå› ä¸ºå®ƒåŒ…å«å¦ä¸€ä½ç”¨æˆ·çš„个人设置。',
+'mycustomcssprotected' => '您没有æƒé™ç¼–辑这个 CSS 页é¢ã€‚',
+'mycustomjsprotected' => '您没有æƒé™ç¼–辑这个 JavaScript 页é¢ã€‚',
+'myprivateinfoprotected' => '您没有æƒé™æ¥ç¼–辑您的ç§äººä¿¡æ¯ã€‚',
+'mypreferencesprotected' => '您没有æƒé™æ¥ç¼–辑您的个人设置。',
'ns-specialprotected' => '特殊页é¢ä¸å¯ç¼–辑。',
'titleprotected' => '此标题已被[[User:$1|$1]]ä¿æŠ¤ä»¥é˜²æ­¢åˆ›å»ºã€‚ç†ç”±æ˜¯â€œ$2â€ã€‚',
'filereadonlyerror' => '因为媒体库$2处于åªè¯»æ¨¡å¼è€Œæ— æ³•ä¿®æ”¹æ–‡ä»¶$1。
@@ -764,10 +777,19 @@ $2',
'welcomeuser' => '欢迎,$1ï¼',
'welcomecreation-msg' => '你的账户已创建。请ä¸è¦å¿˜è®°æ›´æ”¹ä½ çš„[[Special:Preferences|{{SITENAME}}设置]]。',
'yourname' => '用户å:',
+'userlogin-yourname' => '用户å',
+'userlogin-yourname-ph' => '请输入你的用户å',
+'createacct-another-username-ph' => '请输入用户å',
'yourpassword' => '密ç ï¼š',
+'userlogin-yourpassword' => '密ç ',
+'userlogin-yourpassword-ph' => '请输入你的密ç ',
+'createacct-yourpassword-ph' => '请输入一个密ç ',
'yourpasswordagain' => '请å†æ¬¡è¾“入密ç ï¼š',
+'createacct-yourpasswordagain' => '确认密ç ',
+'createacct-yourpasswordagain-ph' => '请å†æ¬¡è¾“入密ç ',
'remembermypassword' => '在该æµè§ˆå™¨è®°ä½æˆ‘的登录状æ€ï¼ˆæœ€é•¿$1天)',
-'securelogin-stick-https' => '登录åŽç»§ç»­ä½¿ç”¨HTTPS连接',
+'userlogin-remembermypassword' => 'è®°ä½æˆ‘的登录状æ€',
+'userlogin-signwithsecure' => '使用安全连接',
'yourdomainname' => '您的域å:',
'password-change-forbidden' => '您ä¸èƒ½åœ¨æœ¬wiki上更改密ç ã€‚',
'externaldberror' => '验è¯æ•°æ®åº“出错或您被ç¦æ­¢æ›´æ–°æ‚¨çš„外部账å·ã€‚',
@@ -779,17 +801,43 @@ $2',
'logout' => '退出',
'userlogout' => '退出',
'notloggedin' => '未登录',
+'userlogin-noaccount' => '没有账户?',
+'userlogin-joinproject' => '加入{{SITENAME}}',
'nologin' => '没有账户?$1。',
'nologinlink' => '创建账户',
'createaccount' => '创建账户',
'gotaccount' => 'å·²ç»æ‹¥æœ‰è´¦æˆ·ï¼Ÿè¯·$1。',
'gotaccountlink' => '登录',
'userlogin-resetlink' => '忘记你的登录信æ¯ï¼Ÿ',
+'userlogin-resetpassword-link' => 'é‡ç½®ä½ çš„密ç ',
+'helplogin-url' => 'Help:登录',
+'userlogin-helplink' => '[[{{MediaWiki:helplogin-url}}|登录帮助]]',
+'userlogin-loggedin' => '您已ç»ä½œä¸º{{GENDER:$1|$1}}登录。
+使用以下表å•ä»¥ä½œä¸ºå¦ä¸€è´¦æˆ·ç™»å½•ã€‚',
+'userlogin-createanother' => '创建å¦ä¸€ä¸ªå¸æˆ·',
+'createacct-join' => '请在下é¢è¾“入你的信æ¯ã€‚',
+'createacct-another-join' => '在下方输入新å¸æˆ·ä¿¡æ¯ã€‚',
+'createacct-emailrequired' => '电å­é‚®ä»¶åœ°å€',
+'createacct-emailoptional' => '电å­é‚®ä»¶åœ°å€ï¼ˆå¯é€‰ï¼‰',
+'createacct-email-ph' => '请输入您的电å­é‚®ä»¶åœ°å€',
+'createacct-another-email-ph' => '输入电å­é‚®ä»¶åœ°å€',
'createaccountmail' => '使用一个临时的éšæœºå¯†ç å¹¶å°†å…¶å‘é€åˆ°æŒ‡å®šçš„电å­é‚®ä»¶åœ°å€ä¸­',
+'createacct-realname' => '真实姓å (å¯é€‰)',
'createaccountreason' => '原因:',
+'createacct-reason' => '原因',
+'createacct-reason-ph' => '为什么您è¦åˆ›å»ºå¦ä¸€ä¸ªå¸æˆ·',
+'createacct-captcha' => '安全检查',
+'createacct-imgcaptcha-ph' => '请输入上图中的文字',
+'createacct-submit' => '创建您的账户',
+'createacct-another-submit' => '创建å¦ä¸€ä¸ªå¸æˆ·',
+'createacct-benefit-heading' => '{{SITENAME}}是由åƒæ‚¨è¿™æ ·çš„人建立的。',
+'createacct-benefit-body1' => '{{PLURAL:$1|编辑}}',
+'createacct-benefit-body2' => '{{PLURAL:$1|页é¢}}',
+'createacct-benefit-body3' => '最近{{PLURAL:$1|贡献者}}',
'badretype' => '您所输入的密ç å¹¶ä¸ç›¸åŒã€‚',
'userexists' => '用户å已存在。请使用其他å称。',
'loginerror' => '登录错误',
+'createacct-error' => '账户创建出错',
'createaccounterror' => '无法建立账户:$1',
'nocookiesnew' => '该用户å¸æˆ·å·²è¢«åˆ›å»ºï¼Œä½†ç™»å½•å¤±è´¥ã€‚{{SITENAME}}使用Cookie实现用户登录。您已ç¦ç”¨Cookie,请å¯ç”¨Cookie,然åŽä½¿ç”¨ä½ çš„新用户å与密ç ç™»å½•ã€‚',
'nocookieslogin' => '{{SITENAME}}使用Cookie实现用户登录。您已åœç”¨Cookie。请å¯ç”¨CookieåŽå†è¯•ã€‚',
@@ -838,10 +886,12 @@ $2',
如果该账户创建错误的è¯ï¼Œæ‚¨å¯ä»¥å¿½ç•¥æ­¤ä¿¡æ¯ã€‚',
'usernamehasherror' => '用户å中ä¸å¯åŒ…å«å“ˆå¸Œï¼ˆhash)字符',
-'login-throttled' => '你最近å°è¯•ç™»å½•çš„次数过多。请ç¨åŽé‡è¯•ã€‚',
+'login-throttled' => '你最近å°è¯•ç™»å½•çš„次数过多。请等待$1åŽå†è¯•ã€‚',
'login-abort-generic' => '登录失败 - 已终止',
'loginlanguagelabel' => '语言:$1',
'suspicious-userlogout' => '注销请求被拒ç»ï¼Œå› ä¸ºå®ƒä¼¼ä¹Žæ˜¯ç”±æœ‰è®¾è®¡ç¼ºé™·çš„æµè§ˆå™¨æˆ–缓存代ç†å‘出的。',
+'createacct-another-realname-tip' => '真实姓å是选填项目。
+如果你选择æ供它,它将会用于贡献署å。',
# Email sending
'php-mail-error-unknown' => '在 PHP 的 mail() 函数中的未知错误',
@@ -857,8 +907,7 @@ $2',
'newpassword' => '新密ç ï¼š',
'retypenew' => '确认密ç ï¼š',
'resetpass_submit' => '设定密ç å¹¶ç™»å½•',
-'resetpass_success' => '您的密ç å·²ç»æ›´æ”¹æˆåŠŸï¼
-现在将带您登录...',
+'changepassword-success' => '您已ç»ä¿®æ”¹äº†æ‚¨çš„密ç ï¼',
'resetpass_forbidden' => '无法更改密ç ',
'resetpass-no-info' => '您必须登录åŽç›´æŽ¥è¿›å…¥è¿™ä¸ªé¡µé¢ã€‚',
'resetpass-submit-loggedin' => '更改密ç ',
@@ -869,10 +918,11 @@ $2',
# Special:PasswordReset
'passwordreset' => 'é‡ç½®å¯†ç ',
-'passwordreset-text' => '完æˆè¯¥è¡¨æ ¼ä»¥é‡è®¾ä½ çš„密ç ã€‚',
+'passwordreset-text-one' => '请输入你è¦é‡ç½®çš„用户å。',
+'passwordreset-text-many' => '{{PLURAL:$1|填充部分字段以é‡ç½®æ‚¨çš„密ç ã€‚}}',
'passwordreset-legend' => 'é‡ç½®å¯†ç ',
'passwordreset-disabled' => 'æ­¤Wikiå·²ç»ç¦ç”¨å¯†ç é‡ç½®ã€‚',
-'passwordreset-pretext' => '{{PLURAL:$1||输入下é¢çš„æ•°æ®é¡¹ä¹‹ä¸€}}',
+'passwordreset-emaildisabled' => '此Wiki上无法使用邮件功能。',
'passwordreset-username' => '用户å:',
'passwordreset-domain' => '域:',
'passwordreset-capture' => '查看生æˆçš„电å­é‚®ä»¶å—?',
@@ -893,7 +943,7 @@ $2
临时密ç ï¼š$2',
'passwordreset-emailsent' => '密ç é‡ç½®é‚®ä»¶å·²å‘é€ã€‚',
'passwordreset-emailsent-capture' => '密ç é‡è®¾ç”µå­é‚®ä»¶å·²å‘é€ï¼Œå¹¶åœ¨ä¸‹é¢æ˜¾ç¤ºã€‚',
-'passwordreset-emailerror-capture' => '生æˆçš„æ醒电å­é‚®ä»¶å¦‚下所示,但å‘é€å¤±è´¥ï¼š$1',
+'passwordreset-emailerror-capture' => 'é‡ç½®å¯†ç é‚®ä»¶å·²ç”Ÿæˆï¼Œä½†æ˜¯æ— æ³•å‘{{GENDER:$2|下列用户}} å‘é€ï¼š$1',
# Special:ChangeEmail
'changeemail' => '更改电å­é‚®ä»¶åœ°å€',
@@ -908,6 +958,19 @@ $2
'changeemail-submit' => '更改电å­é‚®ä»¶åœ°å€',
'changeemail-cancel' => 'å–消',
+# Special:ResetTokens
+'resettokens' => 'é‡ç½®æƒæ ‡',
+'resettokens-text' => '您å¯ä»¥é‡ç½®æƒæ ‡ï¼Œå…¶å…许访问æŸäº›ä¸Žæ‚¨çš„å¸æˆ·ç›¸å…³è”çš„ç§äººæ•°æ®ã€‚
+
+如果您æ„外地与他人共享æƒæ ‡ï¼Œæˆ–您的å¸æˆ·å·²é­åˆ°ç ´å,您应该é‡ç½®æƒæ ‡ã€‚',
+'resettokens-no-tokens' => '没有å¯é‡ç½®å¾—æƒæ ‡ã€‚',
+'resettokens-legend' => 'é‡ç½®æƒæ ‡',
+'resettokens-tokens' => 'æƒæ ‡ï¼š',
+'resettokens-token-label' => '$1(当å‰å€¼ï¼š$2)',
+'resettokens-watchlist-token' => '请在[[Special:Watchlist|您的监视列表]]中更改Web订阅(Atom或RSS)的æƒæ ‡',
+'resettokens-done' => 'æƒæ ‡å·²é‡ç½®ã€‚',
+'resettokens-resetbutton' => 'é‡ç½®æ‰€é€‰çš„æƒæ ‡',
+
# Edit page toolbar
'bold_sample' => '粗体文字',
'bold_tip' => '粗体文字',
@@ -1074,12 +1137,14 @@ $2
它å¯èƒ½åˆšåˆšè¢«åˆ é™¤ã€‚',
'edit-conflict' => '编辑冲çªã€‚',
'edit-no-change' => '因为没有文字更改,你的编辑已被忽略。',
+'postedit-confirmation' => '你的编辑已ä¿å­˜ã€‚',
'edit-already-exists' => 'ä¸å¯ä»¥å»ºç«‹ä¸€ä¸ªæ–°é¡µé¢ã€‚
它已ç»å­˜åœ¨ã€‚',
'defaultmessagetext' => '默认消æ¯æ–‡æœ¬',
'content-failed-to-parse' => '未能将 $2 内容转æ¢ä¸º $1:$3',
'invalid-content-data' => '无效的内容数æ®',
'content-not-allowed-here' => '[[$2]]页é¢ä¸Šä¸å…许“$1â€å†…容',
+'editwarning-warning' => '离开这个页é¢ä¼šä»¤æ‚¨é—失之å‰çš„所有更改。若您已ç»ç™»å…¥ï¼Œæ‚¨å¯åœ¨æ‚¨å‚数设置的“编辑â€èŠ‚中关闭此警告。',
# Content models
'content-model-wikitext' => 'wiki语法',
@@ -1113,6 +1178,7 @@ $2
'undo-failure' => '因存在冲çªçš„中间编辑,本编辑ä¸èƒ½æ’¤é”€ã€‚',
'undo-norev' => '由于其修订版本ä¸å­˜åœ¨æˆ–已删除,此编辑ä¸èƒ½æ’¤é”€ã€‚',
'undo-summary' => '撤销[[Special:Contributions/$2|$2]]([[User talk:$2|讨论]])的版本$1',
+'undo-summary-username-hidden' => 'å–消由一匿å用户所作的修订$1',
# Account creation failure
'cantcreateaccounttitle' => '无法创建账户',
@@ -1273,6 +1339,7 @@ $1",
'compareselectedversions' => '对比选择的版本',
'showhideselectedversions' => '显示/éšè—选择的版本',
'editundo' => '撤销',
+'diff-empty' => '(没有差异)',
'diff-multi' => '(未显示$2个用户的$1个中间版本)',
'diff-multi-manyusers' => '(未显示超过$2个用户的$1个中间版本)',
'difference-missing-revision' => '此差异对比的{{PLURAL:$2|一个修订|$2个修订}}($1){{PLURAL:$2|没有}}找到。
@@ -1300,7 +1367,6 @@ $1",
'searchmenu-legend' => 'æœç´¢é€‰é¡¹',
'searchmenu-exists' => "'''本wiki上有å为“[[:$1]]â€çš„页é¢ã€‚'''",
'searchmenu-new' => "'''在本wiki上新建å为“[[:$1]]â€çš„页é¢ï¼'''",
-'searchhelp-url' => 'Help:目录',
'searchmenu-prefix' => '[[Special:PrefixIndex/$1|去æµè§ˆä»¥æ­¤ä¸ºé¦–的页é¢]]',
'searchprofile-articles' => '内容页é¢',
'searchprofile-project' => '帮助和项目页é¢',
@@ -1341,15 +1407,7 @@ $1",
'powersearch-togglenone' => 'å…¨ä¸é€‰',
'search-external' => '外部æœç´¢',
'searchdisabled' => '{{SITENAME}}çš„æœç´¢å·²è¢«ç¦ç”¨ã€‚您å¯ä»¥æš‚时使用Google进行æœç´¢ï¼Œé¡»æ³¨æ„他们索引的{{SITENAME}}内容å¯èƒ½ä¼šè¿‡æ—¶ã€‚',
-
-# Quickbar
-'qbsettings' => '快速导航æ ',
-'qbsettings-none' => 'æ— ',
-'qbsettings-fixedleft' => '左侧固定',
-'qbsettings-fixedright' => 'å³ä¾§å›ºå®š',
-'qbsettings-floatingleft' => '左侧漂移',
-'qbsettings-floatingright' => 'å³ä¾§æ¼‚移',
-'qbsettings-directionality' => 'æ ¹æ®æ‚¨çš„语言文本方å‘固定ä½ç½®',
+'search-error' => 'æœç´¢æ—¶å‘生错误:$1',
# Preferences page
'preferences' => '设置',
@@ -1383,7 +1441,6 @@ $1",
'resetprefs' => '清除未ä¿å­˜çš„更改',
'restoreprefs' => 'æ¢å¤æ‰€æœ‰é»˜è®¤è®¾ç½®ï¼ˆæ‰€æœ‰éƒ¨åˆ†ï¼‰',
'prefs-editing' => '编辑',
-'prefs-edit-boxsize' => '编辑框尺寸',
'rows' => '行:',
'columns' => '列:',
'searchresultshead' => 'æœç´¢',
@@ -1394,7 +1451,9 @@ $1",
'recentchangesdays-max' => '最多$1天',
'recentchangescount' => '默认显示的编辑数:',
'prefs-help-recentchangescount' => '该项包å«æœ€è¿‘更改ã€é¡µé¢åŽ†å²å’Œæ—¥å¿—。',
-'prefs-help-watchlist-token' => 'æ­¤æ å¡«å†™çš„密钥å¯ä»¥ç”Ÿæˆæ‚¨ç›‘视列表的RSSæºã€‚任何知晓本æ å¯†é’¥çš„人都能阅读您的监视列表,因此请使用安全的数值。这里已æ供了一个éšæœºç”Ÿæˆçš„数值供您选择:$1',
+'prefs-help-watchlist-token2' => '这是您的监视列表网络订阅æºå¯†é’¥çš„关键。
+知é“它的人将能够读å–您的监视列表,所以ä¸åº”分享它。
+[[Special:ResetTokens|点击这里以é‡ç½®å®ƒ]]。',
'savedprefs' => '你的系统设置已ä¿å­˜ã€‚',
'timezonelegend' => '时区:',
'localtime' => '当地时间:',
@@ -1424,7 +1483,6 @@ $1",
'prefs-common-css-js' => '所有皮肤共用的CSS/JavaScript:',
'prefs-reset-intro' => 'ä½ å¯ä»¥ä½¿ç”¨æœ¬é¡µé¢é‡ç½®ä½ çš„系统设置为网站默认值。该æ“作ä¸èƒ½æ’¤é”€ã€‚',
'prefs-emailconfirm-label' => '电å­é‚®ä»¶ç¡®è®¤ï¼š',
-'prefs-textboxsize' => '编辑框大å°',
'youremail' => '电å­é‚®ä»¶ï¼š',
'username' => '{{GENDER:$1|用户å}}:',
'uid' => '{{GENDER:$1|用户}}ID:',
@@ -1456,6 +1514,8 @@ $1",
'prefs-dateformat' => '日期格å¼',
'prefs-timeoffset' => '时差',
'prefs-advancedediting' => '一般选项',
+'prefs-editor' => '编辑',
+'prefs-preview' => '预览',
'prefs-advancedrc' => '高级选项',
'prefs-advancedrendering' => '高级选项',
'prefs-advancedsearchoptions' => '高级选项',
@@ -1463,7 +1523,9 @@ $1",
'prefs-displayrc' => '显示',
'prefs-displaysearchoptions' => '显示',
'prefs-displaywatchlist' => '显示',
+'prefs-tokenwatchlist' => 'æƒæ ‡',
'prefs-diffs' => '差异对比',
+'prefs-help-prefershttps' => '此首选项将在您下次登录时生效。',
# User preference: email validation using jQuery
'email-address-validity-valid' => '电å­é‚®ä»¶åœ°å€æœ‰æ•ˆ',
@@ -1490,6 +1552,8 @@ $1",
'userrights-notallowed' => '你没有æƒé™æ·»åŠ æˆ–删除用户æƒé™ã€‚',
'userrights-changeable-col' => 'ä½ å¯ä»¥æ›´æ”¹çš„用户组',
'userrights-unchangeable-col' => 'ä½ ä¸èƒ½æ›´æ”¹çš„用户组',
+'userrights-conflict' => '用户æƒé™çš„更改存在冲çªï¼è¯·æ£€æŸ¥å¹¶ç¡®è®¤æ‚¨çš„更改。',
+'userrights-removed-self' => '您已æˆåŠŸåˆ é™¤æ‚¨è‡ªå·±çš„æƒåˆ©ã€‚因此,您ä¸å†èƒ½å¤Ÿè®¿é—®æ­¤é¡µã€‚',
# Groups
'group' => '用户组:',
@@ -1555,11 +1619,19 @@ $1",
'right-proxyunbannable' => 'é¿å¼€ä»£ç†æœåŠ¡å™¨çš„自动å°ç¦',
'right-unblockself' => '自我解å°',
'right-protect' => '更改ä¿æŠ¤çº§åˆ«å’Œç¼–辑å—è¿žé”ä¿æŠ¤çš„页é¢',
-'right-editprotected' => '编辑ä¿æŠ¤é¡µé¢ï¼ˆæ— è¿žé”ä¿æŠ¤ï¼‰',
+'right-editprotected' => '编辑页é¢ä¿æŠ¤éœ€è¦â€œ{{int:protect-level-sysop}}â€',
+'right-editsemiprotected' => '编辑页é¢ä¿æŠ¤éœ€è¦â€œ{{int:protect-level-autoconfirmed}}â€',
'right-editinterface' => '编辑用户界é¢',
'right-editusercssjs' => '编辑其他用户的CSS和JavaScript文件',
'right-editusercss' => '编辑其他用户的CSS文件',
'right-edituserjs' => '编辑其他用户的JavaScript文件',
+'right-editmyusercss' => '编辑您自己的用户 CSS 文件',
+'right-editmyuserjs' => '编辑您自己的用户 JavaScript 文件',
+'right-viewmywatchlist' => '查看你的监视列表',
+'right-editmywatchlist' => '编辑您的监视列表。请注æ„å³ä½¿æ²¡æœ‰è¿™ç§æƒåˆ©ï¼ŒæŸäº›æ“作ä»å°†æ·»åŠ é¡µé¢ã€‚',
+'right-viewmyprivateinfo' => '查看您自己的ç§äººæ•°æ® (如电å­é‚®ä»¶åœ°å€ã€ 真实姓å)',
+'right-editmyprivateinfo' => '编辑您自己的ç§äººæ•°æ® (如电å­é‚®ä»¶åœ°å€ã€ 真实姓å)',
+'right-editmyoptions' => '编辑您的个人设置',
'right-rollback' => '快速回退最åŽç¼–辑特定页é¢çš„用户的编辑',
'right-markbotedits' => '标记回退编辑为机器人编辑',
'right-noratelimit' => 'ä¸å—速率é™åˆ¶å½±å“',
@@ -1621,12 +1693,19 @@ $1",
'action-userrights-interwiki' => '编辑其它wiki的用户的用户æƒé™',
'action-siteadmin' => 'é”定或解é”æ•°æ®åº“',
'action-sendemail' => '电邮è”系其他用户',
+'action-editmywatchlist' => '编辑你的监视列表',
+'action-viewmywatchlist' => '查看你的监视列表',
+'action-viewmyprivateinfo' => '查看您的ç§äººä¿¡æ¯',
+'action-editmyprivateinfo' => '编辑您的ç§äººä¿¡æ¯',
# Recent changes
'nchanges' => '$1个更改',
+'enhancedrc-since-last-visit' => '$1 {{PLURAL:$1|自上次访问}}',
+'enhancedrc-history' => '历å²',
'recentchanges' => '最近更改',
'recentchanges-legend' => '最近更改选项',
'recentchanges-summary' => '在此页é¢ä¸Šè·Ÿè¸ªç»´åŸºçš„更改。',
+'recentchanges-noresult' => '在此期间没有符åˆè¿™äº›æ¡ä»¶çš„编辑',
'recentchanges-feed-description' => '用这个æºè·Ÿè¸ªæœ¬wiki的最近更改。',
'recentchanges-label-newpage' => '该编辑创建了新页é¢',
'recentchanges-label-minor' => '这是一个å°ç¼–辑',
@@ -1663,7 +1742,6 @@ $1",
'recentchangeslinked-feed' => '相关更改',
'recentchangeslinked-toolbox' => '相关更改',
'recentchangeslinked-title' => '与“$1â€æœ‰å…³çš„更改',
-'recentchangeslinked-noresult' => '在这一段时间中链接的页é¢å¹¶æ— æ›´æ”¹ã€‚',
'recentchangeslinked-summary' => "这是链接自指定页é¢ï¼ˆæˆ–至指定分类的æˆå‘˜ï¼‰çš„页é¢çš„最近更改的列表。[[Special:Watchlist|你的监视列表]]中的页é¢ä»¥'''粗体'''显示。",
'recentchangeslinked-page' => '页é¢å称:',
'recentchangeslinked-to' => '显示链到所给出的页é¢',
@@ -1674,7 +1752,7 @@ $1",
'reuploaddesc' => 'å–消上传并返回上传表å•',
'upload-tryagain' => 'æ交修改åŽçš„文件æè¿°',
'uploadnologin' => '未登录',
-'uploadnologintext' => '您必须先[[Special:UserLogin|登录]]æ‰èƒ½ä¸Šä¼ æ–‡ä»¶ã€‚',
+'uploadnologintext' => '您必须先$1æ‰èƒ½ä¸Šä¼ æ–‡ä»¶ã€‚',
'upload_directory_missing' => '上传目录($1)é—失,ä¸èƒ½ç”±ç½‘页æœåŠ¡å™¨å»ºç«‹ã€‚',
'upload_directory_read_only' => '上传目录($1)ä¸å­˜åœ¨æˆ–无写æƒé™ã€‚',
'uploaderror' => '上传错误',
@@ -1875,7 +1953,6 @@ $1',
'http-read-error' => 'HTTP读å–错误。',
'http-timed-out' => 'HTTP请求已过时。',
'http-curl-error' => 'æ’·å–URL时出错:$1',
-'http-host-unreachable' => '无法到达URL。',
'http-bad-status' => '进行HTTP请求时出现问题:$1 $2',
# Some likely curl errors. More could be added from <http://curl.haxx.se/libcurl/c/libcurl-errors.html>
@@ -1903,6 +1980,10 @@ $1',
'listfiles_size' => '大å°',
'listfiles_description' => '说明',
'listfiles_count' => '版本',
+'listfiles-show-all' => '包括图片的旧版本',
+'listfiles-latestversion' => '当å‰ç‰ˆæœ¬',
+'listfiles-latestversion-yes' => '是',
+'listfiles-latestversion-no' => 'å¦',
# File description page
'file-anchor-link' => '文件',
@@ -1995,9 +2076,16 @@ $1',
'randompage' => 'éšæœºé¡µé¢',
'randompage-nopages' => '在以下{{PLURAL:$2|å字空间}}中没有页é¢ï¼š$1。',
+# Random page in category
+'randomincategory' => '分类中的éšæœºé¡µé¢',
+'randomincategory-invalidcategory' => '“$1â€ä¸æ˜¯ä¸€ä¸ªæœ‰æ•ˆçš„分类å称。',
+'randomincategory-nopages' => '[[:Category:$1]]中没有页é¢ã€‚',
+'randomincategory-selectcategory' => '从分类获å–éšæœºé¡µé¢ï¼š$1 $2。',
+'randomincategory-selectcategory-submit' => '显示',
+
# Random redirect
'randomredirect' => 'éšæœºé‡å®šå‘',
-'randomredirect-nopages' => '在 "$1" å字空间中没有é‡å®šå‘页é¢ã€‚',
+'randomredirect-nopages' => '“$1â€å字空间中没有é‡å®šå‘。',
# Statistics
'statistics' => '统计',
@@ -2020,15 +2108,13 @@ $1',
'statistics-users-active-desc' => '在å‰$1天中æ“作过的用户',
'statistics-mostpopular' => 'æµè§ˆæœ€å¤šçš„页é¢',
-'disambiguations' => '链接至消歧义页é¢çš„页é¢',
-'disambiguationspage' => 'Template:消歧义',
-'disambiguations-text' => "以下页é¢åŒ…å«è‡³å°‘一个至'''消歧义页é¢'''的链接。它们å¯èƒ½åº”该链接至更适当的页é¢ã€‚<br />如果页é¢ä½¿ç”¨äº†é“¾è‡ª[[MediaWiki:Disambiguationspage]]的模æ¿ï¼Œåˆ™è¢«è§†ä¸ºæ¶ˆæ­§ä¹‰é¡µé¢ã€‚",
-
'pageswithprop' => '有页é¢å±žæ€§çš„页é¢',
'pageswithprop-legend' => '有页é¢å±žæ€§çš„页é¢',
'pageswithprop-text' => '此页é¢åˆ—出了使用特定页é¢å±žæ€§çš„页é¢åå•ã€‚',
'pageswithprop-prop' => '属性å称:',
'pageswithprop-submit' => 'æ交',
+'pageswithprop-prophidden-long' => '长文本属性值已éšè—($1)',
+'pageswithprop-prophidden-binary' => 'å·²éšè—二进制属性值($1)',
'doubleredirects' => 'åŒé‡é‡å®šå‘',
'doubleredirectstext' => '本页é¢åˆ—出é‡å®šå‘至其他é‡å®šå‘页的页é¢ã€‚æ¯è¡Œå«æœ‰ç¬¬ä¸€åŠç¬¬äºŒé‡å®šå‘的链接和第二é‡å®šå‘的目标(通常是第一é‡å®šå‘应该指å‘的“真实â€ç›®æ ‡é¡µé¢ï¼‰ã€‚<del>带删除线的</del>æ¡ç›®å·²è¢«è§£å†³ã€‚',
@@ -2084,6 +2170,7 @@ $1',
'mostrevisions' => '最多版本页é¢',
'prefixindex' => '所有有å‰ç¼€çš„页é¢',
'prefixindex-namespace' => '所有有å‰ç¼€çš„页é¢ï¼ˆ$1å字空间)',
+'prefixindex-strip' => '在列表中çœç•¥å‰ç¼€',
'shortpages' => '短页é¢',
'longpages' => '长页é¢',
'deadendpages' => '断链页é¢',
@@ -2099,6 +2186,7 @@ $1',
'listusers' => '用户列表',
'listusers-editsonly' => 'åªæ˜¾ç¤ºæœ‰ç¼–辑的用户',
'listusers-creationsort' => '按创建日期排åº',
+'listusers-desc' => 'é™åºæŽ’åº',
'usereditcount' => '$1次编辑',
'usercreated' => '{{GENDER:$3|创建}}于$1 $2',
'newpages' => '新页é¢',
@@ -2272,10 +2360,9 @@ $1',
'unwatchthispage' => 'åœæ­¢ç›‘视',
'notanarticle' => 'éžå†…容页é¢',
'notvisiblerev' => '上次由ä¸åŒç”¨æˆ·æ‰€ä½œçš„修订版本已ç»åˆ é™¤',
-'watchnochange' => '在显示的时间段内您所监视的页é¢æ²¡æœ‰æ›´æ”¹ã€‚',
'watchlist-details' => 'ä¸è®¡è®¨è®ºé¡µé¢ï¼Œä½ çš„监视列表中有$1个页é¢ã€‚',
-'wlheader-enotif' => '* å·²ç»å¯åŠ¨ç”µå­é‚®ä»¶é€šçŸ¥åŠŸèƒ½ã€‚',
-'wlheader-showupdated' => "*你上次访问åŽæ›´æ”¹çš„页é¢ä»¥'''粗体'''显示",
+'wlheader-enotif' => 'å·²å¯ç”¨ç”µå­é‚®ä»¶é€šçŸ¥ã€‚',
+'wlheader-showupdated' => "你上次访问åŽæ›´æ”¹çš„页é¢ä»¥'''粗体'''显示",
'watchmethod-recent' => '检查被监视页é¢çš„最近编辑',
'watchmethod-list' => '查看监视页中的最新修改',
'watchlistcontains' => '您的监视列表包å«$1个页é¢ã€‚',
@@ -2511,7 +2598,7 @@ $1',
'contributions' => '{{GENDER:$1|用户}}贡献',
'contributions-title' => '$1的用户贡献',
'mycontris' => '贡献',
-'contribsub2' => '$1的贡献($2)',
+'contribsub2' => '{{GENDER:$3|$1}}的贡献($2)',
'nocontribs' => '没有找到符åˆç‰¹å¾çš„更改。',
'uctop' => '(当å‰ï¼‰',
'month' => '截止月份:',
@@ -2665,13 +2752,11 @@ $1被å°ç¦çš„ç†ç”±æ˜¯ï¼šâ€œ$2â€',
'ipb_blocked_as_range' => '错误:IP地å€$1未被直接å°ç¦ï¼Œæ•…无法解除å°ç¦ã€‚然而,它ä½äºŽIP地å€æ®µ$2çš„å°ç¦èŒƒå›´å†…,åŽè€…å¯è¢«è§£é™¤å°ç¦ã€‚',
'ip_range_invalid' => '无效的IP地å€æ®µã€‚',
'ip_range_toolarge' => 'ä¸å…许大于/$1的段å°ç¦ã€‚',
-'blockme' => 'å°ç¦æˆ‘',
'proxyblocker' => '代ç†å°ç¦å™¨',
-'proxyblocker-disabled' => '此功能已ç¦ç”¨ã€‚',
'proxyblockreason' => '您的IP地å€ä¸ºå·²è¢«å°ç¦çš„公开代ç†ã€‚请è”系您的互è”网æœåŠ¡æ供商或技术支æŒè€…,并告知他们此严é‡çš„安全问题。',
-'proxyblocksuccess' => '完æˆã€‚',
'sorbsreason' => '在{{SITENAME}}使用的DNSBL中,您的IP地å€è¢«åˆ—为公开代ç†ã€‚',
'sorbs_create_account_reason' => '在{{SITENAME}}使用的DNSBL中,您的IP地å€è¢«åˆ—为公开代ç†ï¼Œå› æ­¤æ‚¨ä¸èƒ½åˆ›å»ºæ–°è´¦æˆ·ã€‚',
+'xffblockreason' => '您或您正在使用的代ç†æœåŠ¡å™¨å‘ˆçŽ°åœ¨X-Forwarded-Foræ•°æ®åŒ…头的一个IP地å€å·²è¢«å°ç¦ã€‚å°ç¦åŽŸå› ä¸ºï¼š$1',
'cant-block-while-blocked' => '您无法在å°ç¦æœŸå†…å°ç¦å…¶ä»–用户。',
'cant-see-hidden-user' => '您å°è¯•å°ç¦çš„用户已被å°ç¦å¹¶éšè—。
由于您尚无éšè—用户的æƒé™ï¼Œæ‚¨æ— æ³•æŸ¥çœ‹æˆ–编辑此用户的å°ç¦ã€‚',
@@ -2831,6 +2916,8 @@ $1被å°ç¦çš„ç†ç”±æ˜¯ï¼šâ€œ$2â€',
'thumbnail-more' => '放大',
'filemissing' => '无法找到文件',
'thumbnail_error' => '生æˆç¼©ç•¥å›¾å‡ºé”™ï¼š$1',
+'thumbnail_error_remote' => 'æ¥è‡ª$1的错误消æ¯ä»Žï¼š
+$2',
'djvu_page_error' => 'DjVu页é¢è¶…出范围',
'djvu_no_xml' => '无法在DjVu文件中获å–XML',
'thumbnail-temp-create' => '无法创建临时缩略图文件',
@@ -2974,20 +3061,15 @@ $1被å°ç¦çš„ç†ç”±æ˜¯ï¼šâ€œ$2â€',
'tooltip-undo' => '“撤销â€å¯ä»¥æ¢å¤è¯¥ç¼–辑并在预览模å¼ä¸‹æ‰“开编辑表å•ã€‚它å…许在摘è¦ä¸­åŠ å…¥åŽŸå› ã€‚',
'tooltip-preferences-save' => 'ä¿å­˜ç³»ç»Ÿè®¾ç½®',
'tooltip-summary' => '请输入简短的摘è¦',
+'tooltip-iwiki' => '$1——$2',
# Stylesheets
'common.css' => '/* 此处的 CSS 将应用于所有的皮肤 */',
-'standard.css' => '/* 此处的 CSS 将影å“使用标准皮肤的用户 */',
-'nostalgia.css' => '/* 此处的 CSS 将影å“使用怀旧皮肤的用户 */',
'cologneblue.css' => '/* 此处的 CSS 将影å“使用科隆香水è“皮肤的用户 */',
'monobook.css' => '/* 此处的 CSS 将影å“使用 Monobook 皮肤的用户 */',
-'myskin.css' => '/* 此处的 CSS 将影å“使用 MySkin 皮肤的用户 */',
-'chick.css' => '/* 此处的 CSS 将影å“使用 Chick 皮肤的用户 */',
-'simple.css' => '/* 此处的 CSS 将影å“使用 Simple 皮肤的用户 */',
'modern.css' => '/* 此处的 CSS 将影å“使用 Modern 皮肤的用户 */',
'vector.css' => '/* 此处的 CSS 将影å“使用 Vector 皮肤的用户 */',
'print.css' => '/* 此处的 CSS 将影å“打å°è¾“出 */',
-'handheld.css' => '/* 此处的 CSS 将影å“在 $wgHandheldStyle 设置手æ装置é¢æ¿ */',
'noscript.css' => '/* 此处的 CSS 将影å“没有å¯ç”¨ JavaScript 的用户 */',
'group-autoconfirmed.css' => '/* 此处的 CSS å°†åªä¼šå½±å“自动确认用户 */',
'group-bot.css' => '/* 此处的 CSS å°†åªä¼šå½±å“机器人 */',
@@ -2996,13 +3078,8 @@ $1被å°ç¦çš„ç†ç”±æ˜¯ï¼šâ€œ$2â€',
# Scripts
'common.js' => '/* 此处的JavaScript将加载于所有用户æ¯ä¸€ä¸ªé¡µé¢ã€‚ */',
-'standard.js' => '/* 此处的JavaScript将加载于使用标准皮肤的用户 */',
-'nostalgia.js' => '/* 此处的JavaScript将加载于使用怀旧皮肤的用户 */',
'cologneblue.js' => '/* 此处的JavaScript将加载于使用科隆香水è“皮肤的用户 */',
'monobook.js' => '/* 此处的JavaScript将加载于使用Monobook皮肤的用户 */',
-'myskin.js' => '/* 此处的JavaScript将加载于使用MySkin皮肤的用户 */',
-'chick.js' => '/* 此处的JavaScript将加载于使用Chick皮肤的用户 */',
-'simple.js' => '/* 此处的JavaScript将加载于使用Simple皮肤的用户 */',
'modern.js' => '/* 此处的JavaScript将加载于使用Modern皮肤的用户 */',
'vector.js' => '/* 此处的JavaScript将加载于使用Vector皮肤的用户 */',
'group-autoconfirmed.js' => '/* 此处的JavaScript将仅加载于自动确认用户 */',
@@ -3082,10 +3159,7 @@ $1被å°ç¦çš„ç†ç”±æ˜¯ï¼šâ€œ$2â€',
'pageinfo-category-files' => '文件数',
# Skin names
-'skinname-standard' => '标准',
-'skinname-nostalgia' => '怀旧',
'skinname-cologneblue' => '科隆香水è“',
-'skinname-simple' => '简å•',
'skinname-modern' => '现代',
# Patrolling
@@ -3166,11 +3240,25 @@ $1',
'minutes' => '$1分',
'hours' => '$1å°æ—¶',
'days' => '$1天',
+'weeks' => '$1周',
'months' => '$1个月',
'years' => '$1å¹´',
'ago' => '$1å‰',
'just-now' => '刚刚',
+# Human-readable timestamps
+'hours-ago' => '$1å°æ—¶å‰',
+'minutes-ago' => '$1分å‰',
+'seconds-ago' => '$1秒å‰',
+'monday-at' => '周一$1',
+'tuesday-at' => '周二$1',
+'wednesday-at' => '周三$1',
+'thursday-at' => '周四$1',
+'friday-at' => '周五$1',
+'saturday-at' => '周六$1',
+'sunday-at' => '周日$1',
+'yesterday-at' => '昨天$1',
+
# Bad image list
'bad_image_list' => 'æ ¼å¼å¦‚下:
@@ -3220,7 +3308,7 @@ Variants for Chinese language
* gpslongitude
* gpsaltitude',
-# EXIF tags
+# Exif tags
'exif-imagewidth' => '宽度',
'exif-imagelength' => '高度',
'exif-bitspersample' => 'æ¯åƒç´ å­—节数',
@@ -3398,7 +3486,7 @@ Variants for Chinese language
'exif-originalimageheight' => 'è£å‰ªå‰çš„图åƒé«˜åº¦',
'exif-originalimagewidth' => 'è£å‰ªå‰çš„图åƒå®½åº¦',
-# EXIF attributes
+# Exif attributes
'exif-compression-1' => '未压缩',
'exif-compression-2' => 'CCITT第3组一维修改éœå¤«æ›¼æ¸¸ç¨‹ç¼–ç ',
'exif-compression-3' => 'CCITT第3组传真编ç ',
@@ -3789,7 +3877,6 @@ $5
'version-other' => '其他',
'version-mediahandlers' => '媒体文件处ç†å™¨',
'version-hooks' => 'é’©',
-'version-extension-functions' => '扩展函数',
'version-parser-extensiontags' => '解æžå™¨æ‰©å±•æ ‡ç­¾',
'version-parser-function-hooks' => '解æžå™¨å‡½æ•°é’©',
'version-hook-name' => 'é’©å',
@@ -3798,6 +3885,7 @@ $5
'version-license' => '授æƒåè®®',
'version-poweredby-credits' => "本Wikiç”±'''[//www.mediawiki.org/ MediaWiki]'''驱动,版æƒæ‰€æœ‰ © 2001-$1 $2。",
'version-poweredby-others' => '其他',
+'version-poweredby-translators' => 'translatewiki.net上的翻译者',
'version-credits-summary' => '我们感谢下列人士为[[Special:Version|MediaWiki]]作出的贡献。',
'version-license-info' => "MediaWiki是自由软件,你å¯ä»¥ä¾æ®è‡ªç”±è½¯ä»¶åŸºé‡‘会å‘行的'''GNU公众授æƒåè®®'''第2版或任æ„åŽç»­ç‰ˆæœ¬çš„æ¡æ¬¾ï¼Œä¼ æ’­å’Œ/或修改本软件。
@@ -3813,11 +3901,17 @@ MediaWikiå‘表时预期有用,但对此'''无任何ä¿è¯''',亦无éšå«çš
'version-entrypoints-articlepath' => '[https://www.mediawiki.org/wiki/Manual:$wgArticlePath æ¡ç›®è·¯å¾„]',
'version-entrypoints-scriptpath' => '[https://www.mediawiki.org/wiki/Manual:$wgScriptPath 脚本路径]',
-# Special:FilePath
-'filepath' => '文件路径',
-'filepath-page' => '文件å:',
-'filepath-submit' => 'æ交',
-'filepath-summary' => '本特殊页é¢è¿”回文件的完整路径。图åƒä»¥å®Œæ•´åˆ†è¾¨çŽ‡æ˜¾ç¤ºï¼Œå…¶å®ƒæ–‡ä»¶ç±»åž‹ä»¥å…³è”程åºç›´æŽ¥æ‰“开。',
+# Special:Redirect
+'redirect' => 'é‡å®šå‘(按文件ã€ç”¨æˆ·æˆ–版本ID)',
+'redirect-legend' => 'é‡å®šå‘至文件或页é¢',
+'redirect-summary' => '本特殊页é¢ä¼šé‡å®šå‘到一个文件(给予文件å),一个页é¢ï¼ˆç»™äºˆä¿®è®¢ç‰ˆæœ¬ID),或一个用户页é¢ï¼ˆç»™äºˆç”¨æˆ·æ•°å­—ID)。',
+'redirect-submit' => 'æ交',
+'redirect-lookup' => '基于:',
+'redirect-value' => '值:',
+'redirect-user' => '用户ID',
+'redirect-revision' => '页é¢ä¿®è®¢',
+'redirect-file' => '文件å',
+'redirect-not-exists' => '没找到相应值',
# Special:FileDuplicateSearch
'fileduplicatesearch' => 'æœç´¢é‡å¤æ–‡ä»¶',
@@ -3866,12 +3960,16 @@ MediaWikiå‘表时预期有用,但对此'''无任何ä¿è¯''',亦无éšå«çš
'tags' => '有效的更改标签',
'tag-filter' => '[[Special:Tags|标签]]过滤器:',
'tag-filter-submit' => '过滤器',
+'tag-list-wrapper' => '([[Special:Tags|$1个标签]]:$2)',
'tags-title' => '标签',
'tags-intro' => '本页é¢åˆ—出了软件å¯èƒ½ç”¨äºŽæ ‡è®°ç¼–辑的标签和它们的å«ä¹‰ã€‚',
'tags-tag' => '标签å称',
'tags-display-header' => '更改列表中的表现形å¼',
'tags-description-header' => '完整å«ä¹‰è¯´æ˜Ž',
+'tags-active-header' => '是å¦æ´»è·ƒï¼Ÿ',
'tags-hitcount-header' => '标记的更改数',
+'tags-active-yes' => '是',
+'tags-active-no' => 'å¦',
'tags-edit' => '编辑',
'tags-hitcount' => '$1个更改',
@@ -3892,6 +3990,7 @@ MediaWikiå‘表时预期有用,但对此'''无任何ä¿è¯''',亦无éšå«çš
'dberr-problems' => '抱歉ï¼æœ¬ç½‘站出现了一些技术问题。',
'dberr-again' => '请等待几分钟åŽé‡è¯•ã€‚',
'dberr-info' => '(无法连接到数æ®åº“æœåŠ¡å™¨ï¼š$1)',
+'dberr-info-hidden' => '(无法连接到数æ®åº“æœåŠ¡å™¨ï¼‰',
'dberr-usegoogle' => '在此期间您å¯ä»¥å°è¯•ç”¨ Google æ¥æœç´¢ã€‚',
'dberr-outofdate' => '须注æ„他们索引出æ¥çš„内容å¯èƒ½ä¸æ˜¯æœ€æ–°çš„。',
'dberr-cachederror' => '这是所请求页é¢çš„缓存副本,å¯èƒ½ä¸æ˜¯æœ€æ–°çš„。',
@@ -3907,6 +4006,9 @@ MediaWikiå‘表时预期有用,但对此'''无任何ä¿è¯''',亦无éšå«çš
'htmlform-submit' => 'æ交',
'htmlform-reset' => '撤销更改',
'htmlform-selectorother-other' => '其他',
+'htmlform-no' => 'å¦',
+'htmlform-yes' => '是',
+'htmlform-chosen-placeholder' => '选择选项',
# SQLite database support
'sqlite-has-fts' => '带全文æœç´¢çš„版本$1',
@@ -4023,4 +4125,19 @@ MediaWikiå‘表时预期有用,但对此'''无任何ä¿è¯''',亦无éšå«çš
# Image rotation
'rotate-comment' => '图åƒå·²é¡ºæ—¶é’ˆæ–¹å‘旋转了 $1 {{PLURAL:$1|度}}',
+# Limit report
+'limitreport-title' => '分æžå™¨åˆ†æžæ•°æ®ï¼š',
+'limitreport-cputime' => 'CPU使用时间',
+'limitreport-cputime-value' => '$1秒',
+'limitreport-walltime' => '实际使用时间',
+'limitreport-walltime-value' => '$1秒',
+'limitreport-ppvisitednodes' => '预处ç†å™¨è®¿é—®èŠ‚点计数',
+'limitreport-ppgeneratednodes' => '预处ç†å™¨ç”ŸæˆèŠ‚点计数',
+'limitreport-postexpandincludesize' => '展开åŽå¤§å°',
+'limitreport-postexpandincludesize-value' => '$1/$2字节',
+'limitreport-templateargumentsize' => '模æ¿å‚数大å°',
+'limitreport-templateargumentsize-value' => '$1/$2 字节',
+'limitreport-expansiondepth' => '最高扩展深度',
+'limitreport-expensivefunctioncount' => '高级函数分æžå™¨',
+
);
diff --git a/languages/messages/MessagesZh_hant.php b/languages/messages/MessagesZh_hant.php
index 29f57c84..992db6b7 100644
--- a/languages/messages/MessagesZh_hant.php
+++ b/languages/messages/MessagesZh_hant.php
@@ -17,6 +17,7 @@
* @author Danny0838
* @author FireJackey
* @author Frankou
+ * @author Gakmo
* @author Gaoxuewei
* @author Hakka
* @author Horacewai2
@@ -31,6 +32,7 @@
* @author Lauhenry
* @author Liangent
* @author Liflon
+ * @author Littletung
* @author Liuxinyu970226
* @author Mark85296341
* @author Oapbtommy
@@ -38,6 +40,7 @@
* @author Pbdragonwang
* @author PhiLiP
* @author Philip
+ * @author Radish10cm
* @author Shinjiman
* @author Shirayuki
* @author Shizhao
@@ -181,6 +184,7 @@ $specialPageAliases = array(
'Randomredirect' => array( '隨機é‡å®šå‘é é¢' ),
'Recentchanges' => array( '最近更改' ),
'Recentchangeslinked' => array( 'éˆå‡ºæ›´æ”¹' ),
+ 'Redirect' => array( 'é‡å®šå‘' ),
'Revisiondelete' => array( '刪除或æ¢å¾©ç‰ˆæœ¬' ),
'Search' => array( 'æœç´¢' ),
'Shortpages' => array( '短é é¢' ),
@@ -214,6 +218,7 @@ $specialPageAliases = array(
);
$magicWords = array(
+ 'redirect' => array( '0', '#é‡å®šå‘', '#REDIRECT' ),
'notoc' => array( '0', '__無目錄__', '__无目录__', '__NOTOC__' ),
'nogallery' => array( '0', '__無圖庫__', '__无图库__', '__NOGALLERY__' ),
'forcetoc' => array( '0', '__強制目錄__', '__强显目录__', '__FORCETOC__' ),
@@ -235,10 +240,10 @@ $magicWords = array(
'img_page' => array( '1', 'é =$1', '$1é ', '页数=$1', '$1页', 'page=$1', 'page $1' ),
'img_link' => array( '1', '連çµ=$1', '链接=$1', 'link=$1' ),
'sitename' => array( '1', '網站å稱', '站点å称', 'SITENAME' ),
- 'ns' => array( '0', 'å字空間', 'å字空间:', 'NS:' ),
- 'nse' => array( '0', 'å字空間E', 'å字空间E:', 'NSE:' ),
- 'localurl' => array( '0', '本地URL', '本地URL:', 'LOCALURL:' ),
- 'localurle' => array( '0', '本地URLE', '本地URLE:', 'LOCALURLE:' ),
+ 'ns' => array( '0', 'å字空間:', 'å字空间:', 'NS:' ),
+ 'nse' => array( '0', 'å字空間E:', 'å字空间E:', 'NSE:' ),
+ 'localurl' => array( '0', '本地URL:', 'LOCALURL:' ),
+ 'localurle' => array( '0', '本地URLE:', 'LOCALURLE:' ),
'pageid' => array( '0', 'é é¢ID', '页é¢ID', 'PAGEID' ),
'server' => array( '0', '伺æœå™¨', 'æœåŠ¡å™¨', 'SERVER' ),
'servername' => array( '0', '伺æœå™¨å稱', 'æœåŠ¡å™¨å', 'SERVERNAME' ),
@@ -247,6 +252,7 @@ $magicWords = array(
'nocontentconvert' => array( '0', '__ä¸è½‰æ›å…§å®¹__', '__ä¸è½¬æ¢å†…容__', '__NOCONTENTCONVERT__', '__NOCC__' ),
'displaytitle' => array( '1', '顯示標題', '显示标题', 'DISPLAYTITLE' ),
'currentversion' => array( '1', '當å‰ç‰ˆæœ¬', '当å‰ç‰ˆæœ¬', 'CURRENTVERSION' ),
+ 'language' => array( '0', '#語言:', '#语言:', '#LANGUAGE:' ),
'hiddencat' => array( '1', '__éš±è—分類__', '__éšè—分类__', '__HIDDENCAT__' ),
'staticredirect' => array( '1', '__éœæ…‹é‡å®šå‘__', '__é™æ€é‡å®šå‘__', '__STATICREDIRECT__' ),
);
@@ -289,9 +295,6 @@ $messages = array(
'tog-shownumberswatching' => '顯示正在監視的使用者數目',
'tog-oldsig' => '原有簽å:',
'tog-fancysig' => '將簽å視為åœè¨˜æ–‡å­—(Wikitext)(ä¸æœƒè‡ªå‹•ç”¢ç”Ÿé€£çµï¼‰',
-'tog-externaleditor' => 'é è¨­ä½¿ç”¨å¤–部編輯器(進階者專用,您的電腦需è¦ç‰¹æ®Šè¨­å®šã€‚[//www.mediawiki.org/wiki/Manual:External_editors 更多訊æ¯ã€‚])',
-'tog-externaldiff' => 'é è¨­ä½¿ç”¨å¤–部程å¼åšå·®ç•°æ¯”å°ï¼ˆé€²éšŽè€…專用,您的電腦需è¦ç‰¹æ®Šè¨­å®šã€‚[//www.mediawiki.org/wiki/Manual:External_editors 更多訊æ¯ã€‚])',
-'tog-showjumplinks' => '啟用「跳轉到ã€è¨ªå•é€£çµ',
'tog-uselivepreview' => '使用å³æ™‚é è¦½ï¼ˆå¯¦é©—性)',
'tog-forceeditsummary' => '未輸入編輯摘è¦æ™‚æ醒我',
'tog-watchlisthideown' => '監視列表中隱è—我的編輯',
@@ -305,6 +308,8 @@ $messages = array(
'tog-showhiddencats' => '顯示隱è—分類',
'tog-noconvertlink' => 'ä¸è½‰æ›é€£çµæ¨™é¡Œ',
'tog-norollbackdiff' => '回退後ä¸åšå·®ç•°æ¯”å°',
+'tog-useeditwarning' => '當離開é é¢æ™‚編輯ä»æœªå„²å­˜ï¼Œè«‹æ醒我',
+'tog-prefershttps' => '登入時始終使用安全連線',
'underline-always' => '總是使用',
'underline-never' => '從ä¸ä½¿ç”¨',
@@ -368,6 +373,18 @@ $messages = array(
'oct' => '10月',
'nov' => '11月',
'dec' => '12月',
+'january-date' => '1月$1日',
+'february-date' => '2月$1日',
+'march-date' => '3月$1日',
+'april-date' => '4月$1日',
+'may-date' => '5月$1日',
+'june-date' => '6月$1日',
+'july-date' => '7月$1日',
+'august-date' => '8月$1日',
+'september-date' => '9月$1日',
+'october-date' => '10月$1日',
+'november-date' => '11月$1日',
+'december-date' => '12月$1日',
# Categories related messages
'pagecategories' => '$1 個分類',
@@ -449,6 +466,7 @@ $messages = array(
'create-this-page' => '建立本é ',
'delete' => '刪除',
'deletethispage' => '刪除本é ',
+'undeletethispage' => 'å–消刪除此é ',
'undelete_short' => 'å刪除$1項修訂',
'viewdeleted_short' => '查看$1項已刪除的修訂',
'protect' => 'ä¿è­·',
@@ -490,7 +508,7 @@ $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).
+# 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).
'aboutsite' => '關於 {{SITENAME}}',
'aboutpage' => 'Project:關於',
'copyright' => '除éžå¦æœ‰èªªæ˜Žï¼Œå¦å‰‡æœ¬ç«™å…§å®¹å‡ä»¥$1æ¢æ¬¾æ供。',
@@ -500,7 +518,6 @@ $1',
'disclaimers' => 'å…責è²æ˜Ž',
'disclaimerpage' => 'Project:一般å…責è²æ˜Ž',
'edithelp' => '編輯幫助',
-'edithelppage' => 'Help:如何編輯é é¢',
'helppage' => 'Help:目錄',
'mainpage' => '首é ',
'mainpage-description' => '首é ',
@@ -578,17 +595,12 @@ $1',
# General errors
'error' => '錯誤',
'databaseerror' => '資料庫錯誤',
-'dberrortext' => '發生資料庫查詢語法錯誤。
-å¯èƒ½æ˜¯ç”±æ–¼è»Ÿé«”自身的錯誤所引起。
-最後一次資料庫查詢指令是:
-<blockquote><code>$1</code></blockquote>
-來自於函數“<code>$2</code>â€ã€‚
-資料庫返回錯誤“<samp>$3: $4</samp>â€ã€‚',
-'dberrortextcl' => '發生資料庫查詢語法錯誤。
-最後一次的資料庫查詢是:
-「$1ã€
-來自於函數「$2ã€ã€‚
-數據庫返回錯誤「$3: $4ã€ã€‚',
+'databaseerror-text' => '出ç¾è³‡æ–™åº«æŸ¥è©¢éŒ¯èª¤ã€‚
+這å¯èƒ½è¡¨ç¤ºè»Ÿä»¶ä¸­å­˜åœ¨éŒ¯èª¤ã€‚',
+'databaseerror-textcl' => '資料庫查詢錯誤。',
+'databaseerror-query' => '查詢:$1',
+'databaseerror-function' => '功能:$1',
+'databaseerror-error' => '錯誤:$1',
'laggedslavemode' => "'''警告:'''é é¢å¯èƒ½ä¸åŒ…å«æœ€è¿‘的更新。",
'readonly' => '資料庫ç¦æ­¢è¨ªå•',
'enterlockreason' => '請輸入ç¦æ­¢è¨ªå•åŽŸå› , 包括估計é‡æ–°é–‹æ”¾çš„時間',
@@ -623,6 +635,7 @@ $1',
'cannotdelete-title' => '無法刪除é é¢ã€Œ$1ã€',
'delete-hook-aborted' => '刪除被勾點中止。
它沒有æ供解釋。',
+'no-null-revision' => '無法創建å°"$1"é é¢æ–°çš„空白修訂',
'badtitle' => '錯誤的標題',
'badtitletext' => '所請求é é¢çš„標題是無效的ã€ä¸å­˜åœ¨ï¼Œè·¨èªžè¨€æˆ–è·¨wiki連çµçš„標題錯誤。它å¯èƒ½åŒ…å«ä¸€å€‹æˆ–更多的ä¸èƒ½ç”¨æ–¼æ¨™é¡Œçš„字符。',
'perfcached' => '下列是快å–資料,因此å¯èƒ½ä¸æ˜¯æœ€æ–°çš„。最多{{PLURAL:$1|åªæœ‰1個çµæžœ|$1個çµæžœ}}å¯ç”¨ã€‚',
@@ -645,12 +658,15 @@ $1',
'editinginterface' => "'''警告:'''您正在編輯的é é¢æ˜¯ç”¨æ–¼æ供軟體的介é¢æ–‡å­—。
改變此é å°‡å½±éŸ¿å…¶ä»–在此wiki上的用戶介é¢å¤–觀。
如欲修改所有wiki的翻譯,請到[//translatewiki.net/ translatewiki.net]上的MediaWiki本地化計畫。",
-'sqlhidden' => '(隱è—SQL查詢)',
'cascadeprotected' => '這個é é¢å·²ç¶“被ä¿è­·ï¼Œå› ç‚ºé€™å€‹é é¢è¢«ä»¥ä¸‹å·²æ¨™è¨»"è¯éŽ–ä¿è­·"çš„{{PLURAL:$1|一個|多個}}被ä¿è­·é é¢åŒ…å«ï¼š
$2',
'namespaceprotected' => "您並沒有權é™ç·¨è¼¯'''$1'''å字空間的é é¢ã€‚",
'customcssprotected' => '你並無權é™ç·¨è¼¯æ­¤CSSé é¢ï¼Œå› ç‚ºå®ƒåŒ…å«äº†å…¶ä»–用戶的個人設置。',
'customjsprotected' => '你並無權é™åŽ»ç·¨è¼¯æ­¤JavaScripté é¢ï¼Œå› ç‚ºä»–包å«äº†å¦ä¸€ä½ç”¨æˆ¶çš„個人設定。',
+'mycustomcssprotected' => '你沒有編輯這CSSé é¢çš„權é™ã€‚',
+'mycustomjsprotected' => '你沒有編輯這JavaScripté é¢çš„權é™ã€‚',
+'myprivateinfoprotected' => '您沒有權é™ä¾†ç·¨è¼¯æ‚¨çš„個人信æ¯ã€‚',
+'mypreferencesprotected' => '您沒有權é™ç·¨è¼¯æ‚¨çš„設定。',
'ns-specialprotected' => '特殊é é¢æ˜¯ä¸å¯ä»¥ç·¨è¼¯çš„。',
'titleprotected' => "這個標題已經被[[User:$1|$1]]ä¿è­·ä»¥é˜²æ­¢å»ºç«‹ã€‚ç†ç”±æ˜¯''$2''。",
'filereadonlyerror' => '無法修改文件「$1ã€å› ç‚ºæ–‡ä»¶åº«ã€Œ$2ã€è™•æ–¼å”¯è®€æ¨¡å¼ã€‚ ï¼
@@ -673,10 +689,19 @@ $2',
'welcomecreation-msg' => '您的帳號已建立。
ä¸è¦å¿˜è¨˜è®Šæ›´æ‚¨çš„[[Special:Preferences| {{SITENAME}} çš„å好設定]]。',
'yourname' => '使用者å稱:',
+'userlogin-yourname' => '使用者å稱:',
+'userlogin-yourname-ph' => '輸入您的使用者å稱',
+'createacct-another-username-ph' => '輸入帳號å稱',
'yourpassword' => '您的密碼:',
+'userlogin-yourpassword' => '密碼',
+'userlogin-yourpassword-ph' => '輸入您的密碼',
+'createacct-yourpassword-ph' => '輸入密碼',
'yourpasswordagain' => 'å†æ¬¡è¼¸å…¥å¯†ç¢¼ï¼š',
+'createacct-yourpasswordagain' => '確èªå¯†ç¢¼',
+'createacct-yourpasswordagain-ph' => 'å†æ¬¡è¼¸å…¥å¯†ç¢¼',
'remembermypassword' => '在這個ç€è¦½å™¨ä¸Šè¨˜ä½æˆ‘的登入資訊(å¯ç¶­æŒ $1 {{PLURAL:$1|天}})',
-'securelogin-stick-https' => '登入後繼續以HTTPS連接',
+'userlogin-remembermypassword' => 'ä¿æŒæˆ‘的登入狀態',
+'userlogin-signwithsecure' => '使用安全連線',
'yourdomainname' => '您的網域:',
'password-change-forbidden' => '您ä¸å¯è®Šæ›´æ­¤åœè¨˜ï¼ˆWiki)上的密碼。',
'externaldberror' => '這å¯èƒ½æ˜¯ç”±æ–¼é©—證資料庫錯誤,或是您被ç¦æ­¢æ›´æ–°æ‚¨çš„外部帳號。',
@@ -688,17 +713,43 @@ $2',
'logout' => '登出',
'userlogout' => '登出',
'notloggedin' => '未登入',
+'userlogin-noaccount' => '沒有帳號嗎?',
+'userlogin-joinproject' => 'åƒèˆ‡ {{SITENAME}}',
'nologin' => '您還沒有帳號嗎?$1。',
'nologinlink' => '建立帳號',
'createaccount' => '建立帳號',
'gotaccount' => '已經æ“有帳號?$1。',
'gotaccountlink' => '登入',
'userlogin-resetlink' => '忘記了您的登入細節?',
+'userlogin-resetpassword-link' => 'é‡è¨­å¯†ç¢¼',
+'helplogin-url' => 'Help:登入',
+'userlogin-helplink' => '[[{{MediaWiki:helplogin-url}}|登入幫助]]',
+'userlogin-loggedin' => '您已作為{{GENDER:$1|$1}}登錄。
+利用以下表單以作為å¦ä¸€è³¬æˆ¶ç™»éŒ„。',
+'userlogin-createanother' => '建立å¦ä¸€è³¬æˆ¶',
+'createacct-join' => '輸入您的基本資料:',
+'createacct-another-join' => '在下方輸入新帳號的資訊。',
+'createacct-emailrequired' => 'é›»å­éƒµä»¶',
+'createacct-emailoptional' => 'é›»å­éƒµä»¶ï¼ˆå¯é¸ï¼‰',
+'createacct-email-ph' => '設定信件ä½å€',
+'createacct-another-email-ph' => '輸入信件ä½å€',
'createaccountmail' => '使用一個臨時的隨機密碼,並將它發é€åˆ°æŒ‡å®šçš„é›»å­éƒµä»¶åœ°å€',
+'createacct-realname' => '真實姓å(å¯é¸ï¼‰',
'createaccountreason' => 'ç†ç”±ï¼š',
+'createacct-reason' => '原因',
+'createacct-reason-ph' => '您為什麼è¦å»ºç«‹å¦ä¸€å€‹å¸³è™Ÿ',
+'createacct-captcha' => '安全驗證',
+'createacct-imgcaptcha-ph' => '輸入您在上方看到的文字',
+'createacct-submit' => '建立帳號',
+'createacct-another-submit' => '建立å¦ä¸€å€‹ä½¿ç”¨è€…帳號',
+'createacct-benefit-heading' => '{{SITENAME}}是由åƒæ‚¨ä¸€æ¨£çš„人建立。',
+'createacct-benefit-body1' => '{{PLURAL:$1|次編輯}}',
+'createacct-benefit-body2' => '{{PLURAL:$1|篇é é¢}}',
+'createacct-benefit-body3' => 'ä½è¿‘期{{PLURAL:$1|è²¢ç»è€…}}',
'badretype' => '您所輸入的密碼並ä¸ç¬¦åˆã€‚',
'userexists' => '您所輸入的使用者å稱已存在,請å¦é¸ä¸€å€‹å稱。',
'loginerror' => '登入錯誤',
+'createacct-error' => '帳號建立錯誤',
'createaccounterror' => '無法建立帳號:$1',
'nocookiesnew' => 'å·²æˆåŠŸå»ºç«‹æ–°å¸³è™Ÿï¼åµæ¸¬åˆ°æ‚¨å·²é—œé–‰ Cookies,請開啟它並登入。',
'nocookieslogin' => '本站利用 Cookies 進行使用者登入,åµæ¸¬åˆ°æ‚¨å·²é—œé–‰ Cookies,請開啟它並é‡æ–°ç™»å…¥ã€‚',
@@ -753,10 +804,12 @@ $2',
如果該賬戶建立錯誤的話,您å¯ä»¥å¿½ç•¥æ­¤è¨Šæ¯ã€‚',
'usernamehasherror' => '用戶å稱ä¸å¯ä»¥åŒ…å«åˆ‡ç´°å­—å…ƒ',
'login-throttled' => '您已經嘗試多次的登入動作。
-è«‹ç¨ç­‰å¤šä¸€æœƒå†è©¦ã€‚',
+è«‹ç¨ç­‰$1後å†è©¦ã€‚',
'login-abort-generic' => '登入錯誤 - 中止',
'loginlanguagelabel' => '語言:$1',
'suspicious-userlogout' => '您登出的è¦æ±‚已經被拒絕,因為它å¯èƒ½æ˜¯ç”±å·²æ壞的ç€è¦½å™¨æˆ–者快å–代ç†å‚³é€ã€‚',
+'createacct-another-realname-tip' => '真實姓å為é¸å¡«ã€‚
+如果您é¸æ“‡æ供,它將用於貢ç»ç½²å。',
# Email sending
'php-mail-error-unknown' => '在 PHP çš„ mail() åƒæ•¸ä¸­çš„未知錯誤',
@@ -772,8 +825,7 @@ $2',
'newpassword' => '新密碼:',
'retypenew' => '確èªå¯†ç¢¼ï¼š',
'resetpass_submit' => '設定密碼並登入',
-'resetpass_success' => '您的密碼已經被æˆåŠŸæ›´æ”¹ï¼
-ç¾åœ¨æ­£ç‚ºæ‚¨ç™»å…¥...',
+'changepassword-success' => '您的密碼已æˆåŠŸè®Šæ›´ï¼',
'resetpass_forbidden' => '無法變更密碼',
'resetpass-no-info' => '您必須登入後直接進入這個é é¢ã€‚',
'resetpass-submit-loggedin' => '變更密碼',
@@ -785,10 +837,11 @@ $2',
# Special:PasswordReset
'passwordreset' => 'é‡æ–°è¨­å®šå¯†ç¢¼',
-'passwordreset-text' => '完æˆæ­¤è¡¨æ ¼ä»¥é‡ç½®æ‚¨çš„密碼。',
+'passwordreset-text-one' => '完æˆæ­¤è¡¨æ ¼ä»¥é‡æ–°è¨­å®šæ‚¨çš„密碼。',
+'passwordreset-text-many' => '{{PLURAL:$1|輸入其中一項以é‡æ–°è¨­å®šæ‚¨çš„密碼。}}',
'passwordreset-legend' => 'é‡è¨­å¯†ç¢¼',
'passwordreset-disabled' => 'æ­¤åœè¨˜ï¼ˆWiki)已ç¦ç”¨é‡è¨­å¯†ç¢¼ã€‚',
-'passwordreset-pretext' => '{{PLURAL:$1||輸入下列其中一項}}',
+'passwordreset-emaildisabled' => 'æ­¤åœè¨˜ï¼ˆWiki)已ç¦ç”¨é›»å­éƒµä»¶åŠŸèƒ½ã€‚',
'passwordreset-username' => '使用者å稱:',
'passwordreset-domain' => '域å:',
'passwordreset-capture' => '檢視產生的電å­éƒµä»¶å—Žï¼Ÿ',
@@ -814,7 +867,7 @@ $2
臨時密碼:$2',
'passwordreset-emailsent' => '已發é€é‡è¨­å¯†ç¢¼çš„é›»å­éƒµä»¶ã€‚',
'passwordreset-emailsent-capture' => '已發é€é‡è¨­å¯†ç¢¼çš„é›»å­éƒµä»¶ï¼Œä¸¦åœ¨ä¸‹é¢é¡¯ç¤ºã€‚',
-'passwordreset-emailerror-capture' => '生æˆçš„æ醒電å­éƒµä»¶å¦‚下所示,但發é€å¤±æ•—:$1',
+'passwordreset-emailerror-capture' => '產生的é‡è¨­å¯†ç¢¼çš„é›»å­éƒµä»¶å¦‚下所示,但發é€çµ¦{{GENDER:$2|使用者}}失敗:$1',
# Special:ChangeEmail
'changeemail' => '變更電å­éƒµä»¶ä½å€',
@@ -828,6 +881,19 @@ $2
'changeemail-submit' => '變更電å­éƒµä»¶',
'changeemail-cancel' => 'å–消',
+# Special:ResetTokens
+'resettokens' => 'é‡è¨­å¯†é‘°',
+'resettokens-text' => 'ä½ å¯ä»¥åœ¨é€™è£¡é‡è¨­èˆ‡æ‚¨çš„帳戶ç§éš±æœ‰é—œé€£çš„密鑰。
+
+如果您æ„外地與任何一個人分享這些密鑰,或者您的帳戶被入侵ã€å—到破壞,您應該é‡è¨­å¯†é‘°ã€‚',
+'resettokens-no-tokens' => '沒有å¯é‡è¨­çš„密鑰。',
+'resettokens-legend' => 'é‡è¨­å¯†é‘°ã€‚',
+'resettokens-tokens' => '密鑰:',
+'resettokens-token-label' => '$1(ç¾æ™‚為$2)',
+'resettokens-watchlist-token' => 'è«‹æ–¼[[Special:Watchlist|監視列表]]中更改網上訂閱(Atom或RSS)的權æ–',
+'resettokens-done' => 'å·²é‡è¨­å¯†é‘°ã€‚',
+'resettokens-resetbutton' => 'é‡è¨­æ‰€é¸çš„密鑰',
+
# Edit page toolbar
'bold_sample' => '粗體文字',
'bold_tip' => '粗體文字',
@@ -1016,12 +1082,14 @@ $2
它å¯èƒ½å‰›å‰›è¢«åˆªé™¤ã€‚',
'edit-conflict' => '編輯è¡çªã€‚',
'edit-no-change' => '您的編輯已經略éŽï¼Œå› ç‚ºæ–‡å­—無任何改動。',
+'postedit-confirmation' => '您的編輯已儲存。',
'edit-already-exists' => 'ä¸å¯ä»¥å»ºç«‹ä¸€å€‹æ–°é é¢ã€‚
它已經存在。',
'defaultmessagetext' => 'é è¨­è¨Šæ¯æ–‡å­—',
'content-failed-to-parse' => '未能轉æ›$2 內容æˆç‚º$1:$3',
'invalid-content-data' => '內容資料無效',
'content-not-allowed-here' => '[[$2]]é é¢ä¸Šä¸å…許「$1ã€å…§å®¹',
+'editwarning-warning' => '離開這個é é¢å¯èƒ½æœƒä»¤æ‚¨å¤±åŽ»ä¹‹å‰ä½œå‡ºçš„所有更改。若您已經登入,您å¯åœ¨å好設定的「編輯ã€éƒ¨ä»½è£¡é—œé–‰æ­¤è­¦å‘Šã€‚',
# Content models
'content-model-wikitext' => 'åœè¨˜æ–‡å­—(Wikitext)',
@@ -1056,6 +1124,7 @@ $2
'undo-failure' => '由於中途的編輯ä¸ä¸€è‡´ï¼Œæ­¤ç·¨è¼¯ä¸èƒ½æ’¤éŠ·ã€‚',
'undo-norev' => '由於其修訂版本ä¸å­˜åœ¨æˆ–已刪除,此編輯ä¸èƒ½æ’¤éŠ·ã€‚',
'undo-summary' => 'å–消由[[Special:Contributions/$2|$2]] ([[User talk:$2|å°è©±]])所作出的修訂 $1',
+'undo-summary-username-hidden' => 'éš±è—的用戶撤銷$1的修訂',
# Account creation failure
'cantcreateaccounttitle' => '無法建立帳號',
@@ -1217,6 +1286,7 @@ $1",
'compareselectedversions' => '比較é¸å®šçš„修訂版本',
'showhideselectedversions' => '顯示ï¼éš±è—é¸å®šçš„修訂版本',
'editundo' => '復原',
+'diff-empty' => '(沒有差異)',
'diff-multi' => '(由{{PLURAL:$2|1å用戶|$2å用戶}}作出的{{PLURAL:$1|一個中途修訂版本|$1個中途修訂版本}}未被顯示)',
'diff-multi-manyusers' => '(由多於$2å用戶作出的{{PLURAL:$1|一個中途修訂版本|$1個中途修訂版本}} 未被顯示)',
'difference-missing-revision' => '{{PLURAL:$2|1次修訂|$2 次修訂}}差異($1)ä¸å­˜åœ¨ã€‚
@@ -1244,7 +1314,6 @@ $1",
'searchmenu-legend' => 'æœå°‹é¸é …',
'searchmenu-exists' => "'''在這個 wiki 上已有一é é¢å«åšã€Œ[[:$1]]ã€ã€‚'''",
'searchmenu-new' => "'''在這個 wiki 上建立這個é é¢ã€Œ[[:$1]]ã€ï¼'''",
-'searchhelp-url' => 'Help:目錄',
'searchmenu-prefix' => '[[Special:PrefixIndex/$1|去ç€è¦½ä»¥æ­¤ç‚ºé¦–çš„é é¢]]',
'searchprofile-articles' => '內容é é¢',
'searchprofile-project' => '幫助和計劃é é¢',
@@ -1285,15 +1354,7 @@ $1",
'powersearch-togglenone' => 'ç„¡',
'search-external' => '外部æœå°‹',
'searchdisabled' => '{{SITENAME}}由於性能方é¢çš„原因,全文æœç´¢å·²è¢«æš«æ™‚åœç”¨ã€‚您å¯ä»¥æš«æ™‚é€éŽGoogleæœç´¢ã€‚è«‹ç•™æ„他們的索引å¯èƒ½æœƒéŽæ™‚。',
-
-# Quickbar
-'qbsettings' => '快速導航æ¢',
-'qbsettings-none' => 'ç„¡',
-'qbsettings-fixedleft' => 'å·¦å´å›ºå®š',
-'qbsettings-fixedright' => 'å³å´å›ºå®š',
-'qbsettings-floatingleft' => 'å·¦å´æ¼‚移',
-'qbsettings-floatingright' => 'å³å´æ¼‚移',
-'qbsettings-directionality' => '固定,å–決於你的語言腳本的方å‘性',
+'search-error' => 'æœå°‹æ™‚發生錯誤:$1',
# Preferences page
'preferences' => 'å好設定',
@@ -1327,7 +1388,6 @@ $1",
'resetprefs' => '清除未儲存的變更',
'restoreprefs' => '還原所有é è¨­è¨­å®šï¼ˆæ‰€æœ‰éƒ¨åˆ†ï¼‰',
'prefs-editing' => '編輯',
-'prefs-edit-boxsize' => '編輯框尺寸',
'rows' => '行:',
'columns' => '列:',
'searchresultshead' => 'æœå°‹',
@@ -1338,9 +1398,8 @@ $1",
'recentchangesdays-max' => '最多$1{{PLURAL:$1|天}}',
'recentchangescount' => 'é è¨­é¡¯ç¤ºçš„編輯數:',
'prefs-help-recentchangescount' => '這個包括最近更改ã€é é¢æ­·å²ä»¥åŠæ—¥èªŒã€‚',
-'prefs-help-watchlist-token' => '在這欄加入一個秘密鑰會生æˆä¸€å€‹å°æ‚¨ç›£è¦–列表中的 RSS æºã€‚
-任何一ä½çŸ¥é“在這個欄ä½ä¸Šçš„匙å¯ä»¥é–±è®€åˆ°æ‚¨çš„監視列表,請é¸æ“‡ä¸€å€‹å®‰å…¨çš„值。
-這裡有一個任æ„生æˆçš„值,供您é¸æ“‡ï¼š$1',
+'prefs-help-watchlist-token2' => '這是一個秘密的密鑰,用於訂æºæ‚¨çš„監視列表。
+知é“它的人將能夠讀å–您的監視列表,所以您ä¸æ‡‰è©²åˆ†äº«å®ƒã€‚[[Special:ResetTokens|如有需è¦é‡è¨­æ­¤å¯†é‘°ï¼Œè«‹é»žæ“Šé€™è£¡]]。',
'savedprefs' => '您的å好設定已儲存。',
'timezonelegend' => '時å€ï¼š',
'localtime' => '當地時間:',
@@ -1370,7 +1429,6 @@ $1",
'prefs-common-css-js' => '共用 CSS/JavaScript 於所有的外觀中:',
'prefs-reset-intro' => '您å¯ä»¥åˆ©ç”¨é€™å€‹é é¢åŽ»é‡è¨­æ‚¨çš„åƒæ•¸è¨­ç½®åˆ°ç¶²ç«™é è¨­å€¼ã€‚這個動作無法復原。',
'prefs-emailconfirm-label' => 'é›»å­éƒµä»¶ç¢ºèªï¼š',
-'prefs-textboxsize' => '編輯框大å°',
'youremail' => 'é›»å­éƒµä»¶ï¼š',
'username' => '{{GENDER:$1|使用者å稱}}:',
'uid' => '{{GENDER:$1|使用者 ID}}:',
@@ -1404,6 +1462,8 @@ $1",
'prefs-dateformat' => '日期格å¼',
'prefs-timeoffset' => '時間å移',
'prefs-advancedediting' => '一般é¸é …',
+'prefs-editor' => '編輯器',
+'prefs-preview' => 'é è¦½',
'prefs-advancedrc' => '進階é¸é …',
'prefs-advancedrendering' => '進階é¸é …',
'prefs-advancedsearchoptions' => '進階é¸é …',
@@ -1411,7 +1471,9 @@ $1",
'prefs-displayrc' => '顯示é¸é …',
'prefs-displaysearchoptions' => '顯示é¸é …',
'prefs-displaywatchlist' => '顯示é¸é …',
+'prefs-tokenwatchlist' => '密鑰',
'prefs-diffs' => '差異',
+'prefs-help-prefershttps' => 'æ­¤é¸é …將於您下次登入時生效。',
# User preference: email validation using jQuery
'email-address-validity-valid' => 'é›»å­éƒµä»¶ä½å€æœ‰æ•ˆ',
@@ -1438,6 +1500,8 @@ $1",
'userrights-notallowed' => '你無權加入或刪除使用者權é™ã€‚',
'userrights-changeable-col' => '您å¯ä»¥æ›´æ”¹çš„群組',
'userrights-unchangeable-col' => '您ä¸å¯ä»¥æ›´æ”¹çš„群組',
+'userrights-conflict' => '使用者權é™æ›´æ”¹ç™¼ç”Ÿè¡çªï¼è«‹æª¢è¦–並確èªä½ çš„更改。',
+'userrights-removed-self' => '您已æˆåŠŸç§»é™¤è‡ªå·±çš„權é™ï¼Œæ•…此您沒法å†æ¬¡è¨ªå•æ­¤é ã€‚',
# Groups
'group' => '群組:',
@@ -1503,11 +1567,19 @@ $1",
'right-proxyunbannable' => '繞éŽProxy的自動å°éŽ–',
'right-unblockself' => '解除å°éŽ–自己',
'right-protect' => '更改ä¿è­·ç­‰ç´šä»¥åŠç·¨è¼¯è¢«é€£éŽ–ä¿è­·çš„é é¢',
-'right-editprotected' => '編輯ä¿è­·é é¢ï¼ˆç„¡é€£éŽ–ä¿è­·ï¼‰',
+'right-editprotected' => '編輯ä¿è­·å±¤ç´šç‚ºã€Œ{{int:protect-level-sysop}}ã€çš„é é¢',
+'right-editsemiprotected' => '編輯ä¿è­·å±¤ç´šç‚ºã€Œ{{int:protect-level-autoconfirmed}}ã€çš„é é¢',
'right-editinterface' => '編輯用戶界é¢',
'right-editusercssjs' => '編輯其他用戶的CSS和JavaScript檔案',
'right-editusercss' => '編輯其他用戶的CSS檔案',
'right-edituserjs' => '編輯其他用戶的JavaScript檔案',
+'right-editmyusercss' => '編輯你自己的用戶CSS檔',
+'right-editmyuserjs' => '編輯你自己的用戶JavaScript檔',
+'right-viewmywatchlist' => '檢視您的監視列表',
+'right-editmywatchlist' => '編輯您的監視列表。請注æ„å³ä½¿æ²’有這種權利,æŸäº›æ“作ä»å°‡æ·»åŠ é é¢ã€‚',
+'right-viewmyprivateinfo' => '檢視自己的ç§éš±è³‡æ–™ï¼ˆå¦‚電郵地å€åŠçœŸå¯¦å§“å)',
+'right-editmyprivateinfo' => '編輯自己的ç§éš±è³‡æ–™ï¼ˆå¦‚電郵地å€åŠçœŸå¯¦å§“å)',
+'right-editmyoptions' => '編輯您的設定',
'right-rollback' => '快速復原上ä½ç”¨æˆ¶å°æŸä¸€é é¢ä¹‹ç·¨è¼¯',
'right-markbotedits' => '標示復原編輯作機械人編輯',
'right-noratelimit' => '沒有使用頻率é™åˆ¶',
@@ -1569,12 +1641,19 @@ $1",
'action-userrights-interwiki' => '編輯在其它wiki上用戶的權é™',
'action-siteadmin' => '鎖定和解除鎖定資料庫',
'action-sendemail' => '發é€é›»éƒµ',
+'action-editmywatchlist' => '編輯您的監視列表�',
+'action-viewmywatchlist' => '查看您的監視列表',
+'action-viewmyprivateinfo' => '查看您的個人資料',
+'action-editmyprivateinfo' => '編輯您的個人資料',
# Recent changes
'nchanges' => '$1次更改',
+'enhancedrc-since-last-visit' => '自上次訪å•å·²æœ‰$1',
+'enhancedrc-history' => 'æ­·å²',
'recentchanges' => '最近變更',
'recentchanges-legend' => '近期變更é¸é …',
'recentchanges-summary' => '追蹤該åœè¨˜ï¼ˆWiki)的近期變更。',
+'recentchanges-noresult' => '在所é¸æ“‡çš„時間裡沒有任何更改與所給æ¢ä»¶å»åˆã€‚',
'recentchanges-feed-description' => '訂閱該åœè¨˜ï¼ˆWiki)的近期變更。',
'recentchanges-label-newpage' => '這次編輯建立了一個新é é¢',
'recentchanges-label-minor' => '這是一個å°ç·¨è¼¯',
@@ -1611,7 +1690,6 @@ $1",
'recentchangeslinked-feed' => '相關變更',
'recentchangeslinked-toolbox' => '相關變更',
'recentchangeslinked-title' => '與「$1ã€æœ‰é—œçš„變更',
-'recentchangeslinked-noresult' => '在這一段時間中連çµçš„é é¢ä¸¦ç„¡æ›´æ”¹ã€‚',
'recentchangeslinked-summary' => "這一個特殊é é¢åˆ—示''ç”±''所給出的一個é é¢ä¹‹é€£çµåˆ°é é¢çš„最近更改(或者是å°æ–¼æŒ‡å®šåˆ†é¡žçš„æˆå“¡ï¼‰ã€‚
在[[Special:Watchlist|您的監視列表]]中的é é¢æœƒä»¥'''ç²—é«”'''顯示。",
'recentchangeslinked-page' => 'é é¢å稱:',
@@ -1623,8 +1701,7 @@ $1",
'reuploaddesc' => 'å–消上載並返回上載表單',
'upload-tryagain' => 'æ交修改後的檔案æè¿°',
'uploadnologin' => '未登入',
-'uploadnologintext' => '您必須先[[Special:UserLogin|登入]]
-æ‰èƒ½ä¸Šè¼‰æª”案。',
+'uploadnologintext' => '您必須先$1æ‰èƒ½ä¸Šè¼‰æª”案。',
'upload_directory_missing' => '上傳目錄($1)éºå¤±ï¼Œä¸èƒ½ç”±ç¶²é ä¼ºæœå™¨å»ºç«‹ã€‚',
'upload_directory_read_only' => '上傳目錄($1)ä¸å­˜åœ¨æˆ–無寫權é™ã€‚',
'uploaderror' => '上傳錯誤',
@@ -1830,7 +1907,6 @@ $1',
'http-read-error' => 'HTTP讀å–錯誤。',
'http-timed-out' => 'HTTP請求已éŽæ™‚。',
'http-curl-error' => 'æ“·å–URL時出錯:$1',
-'http-host-unreachable' => '無法到é”URL。',
'http-bad-status' => '進行HTTP請求時出ç¾å•é¡Œï¼š$1 $2',
# Some likely curl errors. More could be added from <http://curl.haxx.se/libcurl/c/libcurl-errors.html>
@@ -1858,6 +1934,10 @@ $1',
'listfiles_size' => '大å°',
'listfiles_description' => 'æè¿°',
'listfiles_count' => '版本',
+'listfiles-show-all' => '包括圖片的舊版本',
+'listfiles-latestversion' => 'ç›®å‰ç‰ˆæœ¬',
+'listfiles-latestversion-yes' => '是',
+'listfiles-latestversion-no' => 'å¦',
# File description page
'file-anchor-link' => '檔案',
@@ -1954,6 +2034,13 @@ $1',
'randompage' => '隨機é é¢',
'randompage-nopages' => '在以下的{{PLURAL:$2|å字空間}}中沒有é é¢ï¼š$1',
+# Random page in category
+'randomincategory' => '分類中的隨機é é¢',
+'randomincategory-invalidcategory' => '"$1" ä¸æ˜¯ä¸€å€‹æœ‰æ•ˆçš„分類å稱。',
+'randomincategory-nopages' => '[[:Category:$1]]中沒有é é¢ã€‚',
+'randomincategory-selectcategory' => '從分類中ç²å–隨機é é¢ï¼š$1 $2',
+'randomincategory-selectcategory-submit' => '顯示',
+
# Random redirect
'randomredirect' => '隨機é‡å®šå‘',
'randomredirect-nopages' => '在「$1ã€å字空間中沒有é‡å®šå‘é é¢ã€‚',
@@ -1979,21 +2066,13 @@ $1',
'statistics-users-active-desc' => '在å‰$1天中æ“作éŽçš„用戶',
'statistics-mostpopular' => '被查閱次數最多的é é¢',
-'disambiguations' => 'éˆæŽ¥åˆ°æ¶ˆæ­§ç¾©é çš„é é¢',
-'disambiguationspage' => 'Template:disambig
-Template:消å«ç³Š
-Template:消除å«ç³Š
-Template:消歧义
-Template:消除歧义
-Template:消歧義
-Template:消除歧義',
-'disambiguations-text' => "以下的é é¢éƒ½æœ‰è‡³å°‘一個連到'''消歧義é '''çš„éˆæŽ¥ï¼Œä½†å®ƒå€‘應éˆæŽ¥åˆ°åˆé©çš„é é¢ã€‚<br />一個é é¢å¦‚果使用了[[MediaWiki:Disambiguationspage]]內的模æ¿ï¼Œå‰‡æœƒè¢«è¦–為消歧義é ã€‚",
-
'pageswithprop' => '有é é¢å±¬æ€§çš„é é¢',
'pageswithprop-legend' => '有é é¢å±¬æ€§çš„é é¢',
'pageswithprop-text' => 'æ­¤é åˆ—出所有é é¢ä½¿ç”¨äº†ç‰¹å®šçš„é é¢å±¬æ€§ã€‚',
'pageswithprop-prop' => '屬性å稱:',
'pageswithprop-submit' => '進入',
+'pageswithprop-prophidden-long' => '長文本屬性值已被隱è—($1)',
+'pageswithprop-prophidden-binary' => '已隱è—二進ä½å±¬æ€§å€¼ï¼ˆ$1)',
'doubleredirects' => 'é›™é‡çš„é‡æ–°å°Žå‘',
'doubleredirectstext' => '這一é åˆ—出所有é‡å®šå‘é é¢é‡å®šå‘到å¦ä¸€å€‹é‡å®šå‘é çš„é é¢ã€‚æ¯ä¸€è¡Œéƒ½åŒ…å«åˆ°ç¬¬ä¸€å’Œç¬¬äºŒå€‹é‡å®šå‘é é¢çš„連çµï¼Œä»¥åŠç¬¬äºŒå€‹é‡å®šå‘é é¢çš„目標,通常顯示的都會是"真正"的目標é é¢ï¼Œä¹Ÿå°±æ˜¯ç¬¬ä¸€å€‹é‡å®šå‘é é¢æ‡‰è©²æŒ‡å‘çš„é é¢ã€‚
@@ -2050,6 +2129,7 @@ Template:消除歧義',
'mostrevisions' => '最多修訂é é¢',
'prefixindex' => '所有有å‰ç¶´çš„é é¢',
'prefixindex-namespace' => '帶有å‰ç¶´çš„é é¢ï¼ˆå±¬æ–¼$1å字空間)',
+'prefixindex-strip' => '於列表中çœç•¥å‰ç¶´',
'shortpages' => '短é é¢',
'longpages' => 'é•·é é¢',
'deadendpages' => '斷連é é¢',
@@ -2065,6 +2145,7 @@ Template:消除歧義',
'listusers' => '用戶列表',
'listusers-editsonly' => 'åªé¡¯ç¤ºæœ‰ç·¨è¼¯çš„用戶',
'listusers-creationsort' => '按建立日期排åº',
+'listusers-desc' => '使用é™å†ªæŽ’åº',
'usereditcount' => '$1 次{{PLURAL:$1|編輯}}',
'usercreated' => '$1 $2{{GENDER:$3|創建}}',
'newpages' => '最新é é¢',
@@ -2240,10 +2321,9 @@ Template:消除歧義',
'unwatchthispage' => 'åœæ­¢ç›£è¦–',
'notanarticle' => 'ä¸æ˜¯é é¢',
'notvisiblerev' => '上次由ä¸åŒç”¨æˆ¶æ‰€ä½œçš„修訂版本已經刪除',
-'watchnochange' => '在顯示的時間段內您所監視的é é¢æ²’有更改。',
'watchlist-details' => 'ä¸åŒ…å«è¨Žè«–é ï¼Œæ‚¨çš„監視列表上有 $1 個é é¢ã€‚',
-'wlheader-enotif' => '* 已經啟動電å­éƒµä»¶é€šçŸ¥åŠŸèƒ½ã€‚',
-'wlheader-showupdated' => "* 在{{GENDER:|ä½ |妳|ä½ }}上次檢視後有被修改éŽçš„é é¢æœƒé¡¯ç¤ºç‚º'''ç²—é«”'''",
+'wlheader-enotif' => '已經啟動電å­éƒµä»¶é€šçŸ¥åŠŸèƒ½ã€‚',
+'wlheader-showupdated' => "在{{GENDER:|ä½ |妳|ä½ }}上次檢視後有被修改éŽçš„é é¢æœƒé¡¯ç¤ºç‚º'''ç²—é«”'''。",
'watchmethod-recent' => '檢查被監視é é¢çš„最近編輯',
'watchmethod-list' => '檢查最近編輯的被監視é é¢',
'watchlistcontains' => '您的監視列表包å«$1個é é¢ã€‚',
@@ -2487,7 +2567,7 @@ $1',
'contributions' => '{{GENDER:$1|用戶}}è²¢ç»',
'contributions-title' => '$1 的使用者貢ç»',
'mycontris' => '我的貢ç»',
-'contribsub2' => '$1çš„è²¢ç» ï¼ˆ$2)',
+'contribsub2' => '{{GENDER:$3|$1}} çš„è²¢ç» ï¼ˆ$2)',
'nocontribs' => '沒有找到符åˆç‰¹å¾µçš„更改。',
'uctop' => '(最新修改)',
'month' => '從該月份 (或更早):',
@@ -2641,13 +2721,11 @@ $1被å°ç¦çš„ç†ç”±æ˜¯â€œ$2â€',
'ipb_blocked_as_range' => '錯誤: 該IP $1 無直接查å°ï¼Œä¸å¯ä»¥è§£é™¤å°ç¦ã€‚但是它是在 $2 的查å°ç¯„åœä¹‹å…§ï¼Œè©²æ®µç¯„åœæ˜¯å¯ä»¥è§£é™¤å°ç¦çš„。',
'ip_range_invalid' => '無效的IP範åœã€‚',
'ip_range_toolarge' => '大於 /$1 çš„å°éŽ–範åœæ˜¯ä¸å®¹è¨±çš„。',
-'blockme' => '查å°æˆ‘',
'proxyblocker' => '代ç†å°éŽ–器',
-'proxyblocker-disabled' => '這個功能已經åœç”¨ã€‚',
'proxyblockreason' => '您的IPä½å€æ˜¯ä¸€å€‹é–‹æ”¾çš„代ç†ï¼Œå®ƒå·²ç¶“被å°éŽ–。請è¯ç¹«æ‚¨çš„網際網路æœå‹™æ供商或技術支æ´è€…並告知告知他們該嚴é‡çš„安全å•é¡Œã€‚',
-'proxyblocksuccess' => '完æˆã€‚',
'sorbsreason' => '您的IPä½å€åœ¨{{SITENAME}}中被 DNSBL列為屬於開放代ç†æœå‹™å™¨ã€‚',
'sorbs_create_account_reason' => '由於您的IPä½å€åœ¨{{SITENAME}}中被 DNSBL列為屬於開放代ç†æœå‹™å™¨ï¼Œæ‰€ä»¥æ‚¨ç„¡æ³•å»ºç«‹è³¬è™Ÿã€‚',
+'xffblockreason' => '您或您使用的代ç†ä¼ºæœå™¨X-Forwarded-For字段所包å«çš„一個IP地å€å·²è¢«å°ç¦ã€‚原始å°ç¦ç†ç”±ï¼š$1',
'cant-block-while-blocked' => '當您被å°éŽ–時ä¸å¯ä»¥å°éŽ–其他用戶。',
'cant-see-hidden-user' => '您ç¾æ­£å˜—試å°éŽ–的用戶已經被å°éŽ–或隱è—。
您ç¾åœ¨æ²’有隱è—用戶的權é™ï¼Œæ‚¨ä¸å¯ä»¥æª¢è¦–或者編輯這ä½ç”¨æˆ¶çš„å°éŽ–。',
@@ -2814,6 +2892,8 @@ $1被å°ç¦çš„ç†ç”±æ˜¯â€œ$2â€',
'thumbnail-more' => '放大',
'filemissing' => '無法找到檔案',
'thumbnail_error' => '創建縮圖錯誤: $1',
+'thumbnail_error_remote' => '$1發出的電å­éƒµä»¶ï¼š
+$2',
'djvu_page_error' => 'DjVué é¢è¶…出範åœ',
'djvu_no_xml' => '無法在DjVu檔案中擷å–XML',
'thumbnail-temp-create' => '無法創建臨時縮略圖文件',
@@ -2962,17 +3042,11 @@ $1被å°ç¦çš„ç†ç”±æ˜¯â€œ$2â€',
# Stylesheets
'common.css' => '/* 此處的 CSS 將應用於所有的é¢æ¿ */',
-'standard.css' => '/* 此處的 CSS 將影響使用標準é¢æ¿çš„用戶 */',
-'nostalgia.css' => '/* 此處的 CSS 將影響使用懷舊é¢æ¿çš„用戶 */',
'cologneblue.css' => '/* 此處的 CSS 將影響使用科隆香水è—é¢æ¿çš„用戶 */',
'monobook.css' => '/* 此處的 CSS 將影響使用 Monobook é¢æ¿çš„用戶 */',
-'myskin.css' => '/* 此處的 CSS 將影響使用 MySkin é¢æ¿çš„用戶 */',
-'chick.css' => '/* 此處的 CSS 將影響使用 Chick é¢æ¿çš„用戶 */',
-'simple.css' => '/* 此處的 CSS 將影響使用 Simple é¢æ¿çš„用戶 */',
'modern.css' => '/* 此處的 CSS 將影響使用 Modern é¢æ¿çš„用戶 */',
'vector.css' => '/* 此處的 CSS 將影響使用 Vector é¢æ¿çš„用戶 */',
'print.css' => '/* 此處的 CSS 將影響打å°è¼¸å‡º */',
-'handheld.css' => '/* 此處的 CSS 將影響在 $wgHandheldStyle 設定手æè£ç½®é¢æ¿ */',
'noscript.css' => '/* 此處的 CSS 將影響沒有啓用 JavaScript 的用戶 */',
'group-autoconfirmed.css' => '/* 此處的 CSS å°‡åªæœƒå½±éŸ¿è‡ªå‹•ç¢ºèªç”¨æˆ¶ */',
'group-bot.css' => '/* 此處的 CSS å°‡åªæœƒå½±éŸ¿æ©Ÿå™¨äºº */',
@@ -2981,13 +3055,8 @@ $1被å°ç¦çš„ç†ç”±æ˜¯â€œ$2â€',
# Scripts
'common.js' => '/* 此處的JavaScript將載入於所有用戶æ¯ä¸€å€‹é é¢ã€‚ */',
-'standard.js' => '/* 此處的JavaScript將載入於使用標準é¢æ¿çš„用戶 */',
-'nostalgia.js' => '/* 此處的JavaScript將載入於使用懷舊é¢æ¿çš„用戶 */',
'cologneblue.js' => '/* 此處的JavaScript將載入於使用科隆香水è—é¢æ¿çš„用戶 */',
'monobook.js' => '/* 此處的JavaScript將載入於使用Monobooké¢æ¿çš„用戶 */',
-'myskin.js' => '/* 此處的JavaScript將載入於使用MySkiné¢æ¿çš„用戶 */',
-'chick.js' => '/* 此處的JavaScript將載入於使用Chické¢æ¿çš„用戶 */',
-'simple.js' => '/* 此處的JavaScript將載入於使用Simpleé¢æ¿çš„用戶 */',
'modern.js' => '/* 此處的JavaScript將載入於使用Moderné¢æ¿çš„用戶 */',
'vector.js' => '/* 此處的JavaScript將載入於使用Vectoré¢æ¿çš„用戶 */',
@@ -3063,10 +3132,7 @@ $1被å°ç¦çš„ç†ç”±æ˜¯â€œ$2â€',
'pageinfo-category-files' => '編輯數é‡',
# Skin names
-'skinname-standard' => '標準',
-'skinname-nostalgia' => '懷舊',
'skinname-cologneblue' => '科隆香水è—',
-'skinname-simple' => 'ç°¡å–®',
'skinname-modern' => 'ç¾ä»£',
# Patrolling
@@ -3144,11 +3210,25 @@ $1',
'minutes' => '$1分é¾',
'hours' => '$1å°æ™‚',
'days' => '$1天',
+'weeks' => '{{PLURAL:$1|$1周}}',
'months' => '{{PLURAL:$1|$1個月}}',
'years' => '{{PLURAL:$1|$1å¹´}}',
'ago' => '$1å‰',
'just-now' => '剛æ‰',
+# Human-readable timestamps
+'hours-ago' => '$1å°æ™‚å‰',
+'minutes-ago' => '$1分é˜å‰',
+'seconds-ago' => '$1秒å‰',
+'monday-at' => '於星期一$1',
+'tuesday-at' => '於星期二$1',
+'wednesday-at' => '於星期三$1',
+'thursday-at' => '於星期四$1',
+'friday-at' => '於星期五$1',
+'saturday-at' => '於星期六$1',
+'sunday-at' => '於星期日$1',
+'yesterday-at' => '昨天$1',
+
# Bad image list
'bad_image_list' => '請按照下列格å¼ç·¨å¯«ï¼š
@@ -3197,7 +3277,7 @@ Variants for Chinese language
* gpslongitude
* gpsaltitude',
-# EXIF tags
+# Exif tags
'exif-imagewidth' => '寬度',
'exif-imagelength' => '高度',
'exif-bitspersample' => 'æ¯è±¡ç´ æ¯”特數',
@@ -3375,7 +3455,7 @@ Variants for Chinese language
'exif-originalimageheight' => '被è£å‰ªå‰é«˜åº¦',
'exif-originalimagewidth' => '被è£å‰ªå‰å¯¬åº¦',
-# EXIF attributes
+# Exif attributes
'exif-compression-1' => '未壓縮',
'exif-compression-2' => 'CCITT第3組一維修改éœå¤«æ›¼éŠç¨‹ç·¨ç¢¼',
'exif-compression-3' => 'CCITT第3組傳真編碼',
@@ -3767,7 +3847,6 @@ $5
'version-other' => '其他',
'version-mediahandlers' => '媒體處ç†å™¨',
'version-hooks' => '鈎',
-'version-extension-functions' => '擴展函數',
'version-parser-extensiontags' => '語法擴展標籤',
'version-parser-function-hooks' => '語法函數鈎',
'version-hook-name' => '鈎å',
@@ -3776,6 +3855,7 @@ $5
'version-license' => '授權',
'version-poweredby-credits' => "此維基由'''[//www.mediawiki.org/ MediaWiki]'''驅動,版權所有 © 2001-$1 $2。",
'version-poweredby-others' => '其他',
+'version-poweredby-translators' => 'translatewiki.net 上的翻譯者',
'version-credits-summary' => '我們感è¬ä»¥ä¸‹äººå£«ç‚º[[Special:Version|MediaWiki]]作出的貢ç»ã€‚',
'version-license-info' => 'MediaWiki為自由軟件;您å¯ä¾æ“šè‡ªç”±è»Ÿä»¶åŸºé‡‘會所發表的GNU通用公共授權æ¢æ¬¾è¦å®šï¼Œå°±æœ¬ç¨‹å¼å†ç‚ºç™¼ä½ˆèˆ‡ï¼æˆ–修改;無論您ä¾æ“šçš„是本授權的第二版或(您自行é¸æ“‡çš„)任一日後發行的版本。
@@ -3790,11 +3870,17 @@ MediaWiki是基於使用目的而加以發佈,然而ä¸è² ä»»ä½•æ“”ä¿è²¬ä»»ï¼
'version-entrypoints-header-url' => 'URL',
'version-entrypoints-articlepath' => '[https://www.mediawiki.org/wiki/Manual:$wgArticlePath æ¢ç›®è·¯å¾‘]',
-# Special:FilePath
-'filepath' => '檔案路徑',
-'filepath-page' => '檔案å:',
-'filepath-submit' => 'å‰å¾€',
-'filepath-summary' => '這個特殊é é¢æ“·å–一個檔案的完整路徑。圖片會以完整的解åƒåº¦é¡¯ç¤ºï¼Œå…¶å®ƒçš„檔案類型會以åŒå®ƒå€‘已關è¯ç¨‹å¼å•Ÿå‹•ã€‚',
+# Special:Redirect
+'redirect' => 'é‡å®šå‘檔案ã€ç”¨æˆ¶ID或é é¢ä¿®è¨‚ID',
+'redirect-legend' => 'é‡å®šå‘到檔案或é é¢',
+'redirect-summary' => '此特殊é é¢é‡å®šå‘到檔案(指定的檔案å稱)ã€é é¢ (指定的é é¢ä¿®è¨‚ID) 或用戶é é¢ï¼ˆæŒ‡å®šçš„用戶ID數值)。',
+'redirect-submit' => 'æ交',
+'redirect-lookup' => '尋找:',
+'redirect-value' => '值:',
+'redirect-user' => '用戶ID:',
+'redirect-revision' => 'é é¢ä¿®è¨‚ID',
+'redirect-file' => '檔案å稱',
+'redirect-not-exists' => '找ä¸åˆ°',
# Special:FileDuplicateSearch
'fileduplicatesearch' => 'é¸æ“‡é‡è¦†æª”案',
@@ -3844,12 +3930,16 @@ MediaWiki是基於使用目的而加以發佈,然而ä¸è² ä»»ä½•æ“”ä¿è²¬ä»»ï¼
'tags' => '有效標籤',
'tag-filter' => '[[Special:Tags|標籤]]éŽæ¿¾å™¨:',
'tag-filter-submit' => 'æœå°‹',
+'tag-list-wrapper' => '([[Special:Tags|$1個標籤]]:$2)',
'tags-title' => '標籤',
'tags-intro' => '這個é é¢åˆ—示出在軟件中已標示的編輯,以åŠå®ƒå€‘的解釋。',
'tags-tag' => '標籤å稱',
'tags-display-header' => '在更改清單中的出ç¾æ–¹å¼',
'tags-description-header' => '解釋完整æè¿°',
+'tags-active-header' => '存檔?',
'tags-hitcount-header' => '已加上標籤的更改',
+'tags-active-yes' => '是',
+'tags-active-no' => 'å¦',
'tags-edit' => '編輯',
'tags-hitcount' => '$1次更改',
@@ -3870,6 +3960,7 @@ MediaWiki是基於使用目的而加以發佈,然而ä¸è² ä»»ä½•æ“”ä¿è²¬ä»»ï¼
'dberr-problems' => 'æ­‰ï¼é€™å€‹ç¶²ç«™å‡ºç¾äº†ä¸€äº›æŠ€è¡“上的å•é¡Œã€‚',
'dberr-again' => '嘗試等候數分é˜å¾Œï¼Œç„¶å¾Œå†è©¦ã€‚',
'dberr-info' => '(無法連繫到資料庫伺æœå™¨: $1)',
+'dberr-info-hidden' => '(無法與資料庫伺æœå™¨è¯ç¹«ï¼‰',
'dberr-usegoogle' => '在ç¾éšŽæ®µæ‚¨å¯ä»¥å˜—試é€éŽ Google æœå°‹ã€‚',
'dberr-outofdate' => 'ç•™æ„他們索引出來之內容å¯èƒ½ä¸æ˜¯æœ€æ–°çš„。',
'dberr-cachederror' => '這個是所è¦æ±‚出來的快å–複本,å¯èƒ½ä¸æ˜¯æœ€æ–°çš„。',
@@ -3885,6 +3976,9 @@ MediaWiki是基於使用目的而加以發佈,然而ä¸è² ä»»ä½•æ“”ä¿è²¬ä»»ï¼
'htmlform-submit' => 'æ交',
'htmlform-reset' => '撤銷更改',
'htmlform-selectorother-other' => '其他',
+'htmlform-no' => 'å¦',
+'htmlform-yes' => '是',
+'htmlform-chosen-placeholder' => 'é¸é …',
# SQLite database support
'sqlite-has-fts' => '帶全文æœå°‹çš„版本$1',
@@ -4001,4 +4095,19 @@ MediaWiki是基於使用目的而加以發佈,然而ä¸è² ä»»ä½•æ“”ä¿è²¬ä»»ï¼
# Image rotation
'rotate-comment' => '順時é‡æ—‹è½‰åœ–åƒ$1{{PLURAL:$1|度}}',
+# Limit report
+'limitreport-title' => '分æžå™¨åˆ†æžè³‡æ–™ï¼š',
+'limitreport-cputime' => 'CPU使用時間',
+'limitreport-cputime-value' => '$1秒',
+'limitreport-walltime' => '實際使用時間',
+'limitreport-walltime-value' => '$1秒',
+'limitreport-ppvisitednodes' => 'é è™•ç†å™¨è¨ªå•ç¯€é»žè¨ˆæ•¸',
+'limitreport-ppgeneratednodes' => 'é è™•ç†å™¨ç”Ÿæˆç¯€é»žè¨ˆæ•¸',
+'limitreport-postexpandincludesize' => '展開後大å°',
+'limitreport-postexpandincludesize-value' => '$1/$2 個{{PLURAL:$2|ä½å…ƒçµ„}}',
+'limitreport-templateargumentsize' => '模æ¿åƒæ•¸å¤§å°',
+'limitreport-templateargumentsize-value' => '$1/$2 個{{PLURAL:$2|ä½å…ƒçµ„}}',
+'limitreport-expansiondepth' => '最高展開深度',
+'limitreport-expensivefunctioncount' => '昂貴分æžå™¨å‡½æ•¸è¨ˆæ•¸',
+
);
diff --git a/languages/messages/MessagesZh_tw.php b/languages/messages/MessagesZh_tw.php
index 7d984604..2d9b8185 100644
--- a/languages/messages/MessagesZh_tw.php
+++ b/languages/messages/MessagesZh_tw.php
@@ -875,12 +875,7 @@ $NEWPAGE
åªæœ‰åˆ—示項目(以 * 開頭的項目)會被考慮。第一個連çµä¸€å®šè¦é€£æŽ¥åŽ»å£žåœ–片中。
然後在åŒä¸€è¡Œçš„連çµæœƒè€ƒæ…®ä½œä¾‹å¤–,å³æ˜¯å¹…圖片å¯ä»¥åœ¨å“ªä¸€å€‹é é¢ä¸­åŒæ™‚顯示。',
-/*
-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
-*/
+# Variants for Chinese language
'variantname-zh-tw' => 'å°ç£ç¹é«”',
# Metadata
diff --git a/languages/messages/MessagesZu.php b/languages/messages/MessagesZu.php
index 380cf32e..5efa16a9 100644
--- a/languages/messages/MessagesZu.php
+++ b/languages/messages/MessagesZu.php
@@ -9,8 +9,6 @@
*
* @author Jose77 (on zu.wikipedia.org)
* @author Joziboy (on zu.wikipedia.org)
- * @author Rosinah3
- * @author Vogone
* @author לערי ריינה×רט
*/
@@ -25,18 +23,18 @@ $messages = array(
'thursday' => 'uLwesine',
'friday' => 'uLwesihlanu',
'saturday' => 'uMgqibelo',
-'january' => 'Umasingana',
-'february' => 'uNhlolanja',
-'march' => 'uMbasa',
-'april' => 'uNdasa',
-'may_long' => 'uNhlaba',
-'june' => 'uNhlangulana',
-'july' => 'uNtulikazi',
-'august' => 'uNcwaba',
-'september' => 'uMandulo',
-'october' => 'uMfumfu',
-'november' => 'uLwezi',
-'december' => 'uZibandlela',
+'january' => 'uJanuwali',
+'february' => 'uFebruwari',
+'march' => 'uMashi',
+'april' => 'u-Apreli',
+'may_long' => 'uMeyi',
+'june' => 'uJuni',
+'july' => 'uJulayi',
+'august' => 'u-Agasti',
+'september' => 'uSepthemba',
+'october' => 'u-Okthoba',
+'november' => 'uNovemba',
+'december' => 'uDisemba',
'january-gen' => 'uJanuwali',
'february-gen' => 'uFebruwari',
'march-gen' => 'uMashi',
@@ -101,7 +99,6 @@ $messages = array(
'portal' => 'Umnyango wamgwamanda',
'portal-url' => 'Project:Umnyango wamgwamanda',
-'ok' => 'Kulungile',
'newmessageslink' => 'Imilayezo emisha',
'youhavenewmessagesmulti' => 'Uyanemilayezo emisha e $1',
'editsection' => 'hlela',
@@ -124,8 +121,9 @@ $messages = array(
'internalerror' => 'Icala lingaphakathi',
# Login and logout pages
-'welcomeuser' => 'Umbingelelo, $1!',
-'welcomecreation-msg' => 'Ikhawundi lakho liyadalwa. Musa ukukhohlwa ukuguqula [[Special:Preferences|amakhethelo]] a-Wikipedia wakho.',
+'welcomecreation' => '== Umbingelelo, $1! ==
+
+ikhawundi lakho liyadalwa. musa ukukhohlwa ukuguqula amakhethelo a-{{SITENAME}} wakho.',
'yourname' => 'Isiga',
'yourpassword' => 'Izwi elingenangozi',
'yourpasswordagain' => 'Bhala izwi elingenangozi lakho kabusha',
@@ -191,7 +189,7 @@ $messages = array(
'mypreferences' => 'Amakhethelo ami',
'prefsnologin' => 'Awungenile',
'changepassword' => 'Guqula izwi elingenangozi',
-'saveprefs' => 'Ukonga',
+'saveprefs' => 'Saveprefs',
'searchresultshead' => 'Sesha',
'timezonelegend' => 'Isifunda sasikhathi',
'localtime' => 'Isikhathi siyalapha',
@@ -244,7 +242,7 @@ $messages = array(
'allinnamespace' => 'Onke amakhasi ($1 namespace)',
'allpagessubmit' => 'Hamba',
-# Email user
+# E-mail user
'emailuser' => 'Thumela umlayezo lo msebenzisi',
'noemailtitle' => 'Akukho ikheli likaposi',
'emailsubject' => 'Indaba',
@@ -258,6 +256,8 @@ $messages = array(
'unwatch' => "Mus'ukubukela",
'notanarticle' => 'Akulona ikhasi elinakho okuqukethwe',
+'enotif_newpagetext' => 'Lelikhasi liyasha.',
+
# Delete
'deletepage' => 'Sula ikhasi',
'confirm' => 'Qinisekisa',
@@ -278,7 +278,6 @@ $messages = array(
'mycontris' => 'Amanikelo ami',
# What links here
-'nolinkshere' => "Akukho amakhasi ukuthi balayela lapha '''[[:$1]]'''.",
'isredirect' => 'Ikhasi silayela',
# Block/unblock
@@ -316,12 +315,6 @@ $messages = array(
# Special:Import
'import-interwiki-submit' => 'Ngenisa',
-# Tooltip help for the actions
-'tooltip-search' => 'Phenya',
-'tooltip-search-fulltext' => '
-Phenya amakhasi ukuze uthole lombhalo',
-'tooltip-p-logo' => 'vakashela ikhasi elikhulu',
-
# Attribution
'others' => 'Abanye',
@@ -368,7 +361,7 @@ Phenya amakhasi ukuze uthole lombhalo',
'exif-sharpness-1' => 'Kuntofontofo',
'exif-sharpness-2' => 'Kulukhuni',
-# Email address confirmation
+# E-mail address confirmation
'confirmemail' => 'Qinisekisa ikheli likagesi',
'confirmemail_loggedin' => 'Ikheli likagesi lakho liqinisekiswa.',
diff --git a/languages/utils/CLDRPluralRuleEvaluator.php b/languages/utils/CLDRPluralRuleEvaluator.php
index 56627f7d..d3a863b4 100644
--- a/languages/utils/CLDRPluralRuleEvaluator.php
+++ b/languages/utils/CLDRPluralRuleEvaluator.php
@@ -67,7 +67,7 @@ class CLDRPluralRuleEvaluator {
public static function evaluateCompiled( $number, array $rules ) {
// The compiled form is RPN, with tokens strictly delimited by
// spaces, so this is a simple RPN evaluator.
- foreach ( $rules as $i => $rule ) {
+ foreach ( $rules as $i => $rule ) {
$stack = array();
$zero = ord( '0' );
$nine = ord( '9' );
@@ -104,7 +104,7 @@ class CLDRPluralRuleEvaluator {
*/
private static function doOperation( $token, $left, $right ) {
if ( in_array( $token, array( 'in', 'not-in', 'within', 'not-within' ) ) ) {
- if ( !($right instanceof CLDRPluralRuleEvaluator_Range ) ) {
+ if ( !( $right instanceof CLDRPluralRuleEvaluator_Range ) ) {
$right = new CLDRPluralRuleEvaluator_Range( $right );
}
}
@@ -127,7 +127,7 @@ class CLDRPluralRuleEvaluator {
return !$right->isNumberWithin( $left );
case 'mod':
if ( is_int( $left ) ) {
- return (int) fmod( $left, $right );
+ return (int)fmod( $left, $right );
}
return fmod( $left, $right );
case ',':
@@ -305,7 +305,7 @@ class CLDRPluralRuleConverter {
continue;
} else {
// Operator
- if ( !$expectOperator ) {
+ if ( !$expectOperator ) {
$token->error( 'unexpected operator' );
}
// Resolve higher precedence levels
@@ -381,7 +381,7 @@ class CLDRPluralRuleConverter {
// Word
if ( !preg_match( self::WORD_REGEX, $this->rule, $m, 0, $this->pos ) ) {
- $this->error( 'unexpected character "' . $this->rule[$this->pos] . '"' );
+ $this->error( 'unexpected character "' . $this->rule[$this->pos] . '"' );
}
$word1 = strtolower( $m[0] );
$word2 = '';
diff --git a/load.php b/load.php
index f363c3fa..1790f483 100644
--- a/load.php
+++ b/load.php
@@ -25,15 +25,11 @@
// Bail if PHP is too low
if ( !function_exists( 'version_compare' ) || version_compare( phpversion(), '5.3.2' ) < 0 ) {
// We need to use dirname( __FILE__ ) here cause __DIR__ is PHP5.3+
- require( dirname( __FILE__ ) . '/includes/PHPVersionError.php' );
+ require dirname( __FILE__ ) . '/includes/PHPVersionError.php';
wfPHPVersionError( 'load.php' );
}
-if ( isset( $_SERVER['MW_COMPILED'] ) ) {
- require ( 'phase3/includes/WebStart.php' );
-} else {
- require ( __DIR__ . '/includes/WebStart.php' );
-}
+require __DIR__ . '/includes/WebStart.php';
wfProfileIn( 'load.php' );
diff --git a/maintenance/Doxyfile b/maintenance/Doxyfile
index e6862acd..ffc8c3b0 100644
--- a/maintenance/Doxyfile
+++ b/maintenance/Doxyfile
@@ -1,5 +1,7 @@
-# Doxyfile 1.7.5.1
+# Doxyfile 1.7.6.1
+# This file describes the settings to be used by the documentation system
+# doxygen (www.doxygen.org) for MediaWiki.
#
# Some placeholders have been added for MediaWiki usage:
# {{OUTPUT_DIRECTORY}}
@@ -44,7 +46,7 @@ QT_AUTOBRIEF = NO
MULTILINE_CPP_IS_BRIEF = NO
INHERIT_DOCS = YES
SEPARATE_MEMBER_PAGES = NO
-TAB_SIZE = 8
+TAB_SIZE = 4
ALIASES = "type{1}=<b> \1 </b>:" \
"types{2}=<b> \1 </b> or <b> \2 </b>:" \
"types{3}=<b> \1 </b>, <b> \2 </b>, or <b> \3 </b>:" \
@@ -64,6 +66,7 @@ ALIASES = "type{1}=<b> \1 </b>:" \
"copyright=\note" \
"license=\note" \
"codeCoverageIgnore="
+TCL_SUBST =
OPTIMIZE_OUTPUT_FOR_C = NO
OPTIMIZE_OUTPUT_JAVA = NO
OPTIMIZE_FOR_FORTRAN = NO
@@ -72,13 +75,14 @@ EXTENSION_MAPPING =
BUILTIN_STL_SUPPORT = NO
CPP_CLI_SUPPORT = NO
SIP_SUPPORT = NO
-IDL_PROPERTY_SUPPORT = NO
+IDL_PROPERTY_SUPPORT = YES
DISTRIBUTE_GROUP_DOC = YES
SUBGROUPING = YES
INLINE_GROUPED_CLASSES = NO
INLINE_SIMPLE_STRUCTS = NO
TYPEDEF_HIDES_STRUCT = NO
SYMBOL_CACHE_SIZE = 0
+LOOKUP_CACHE_SIZE = 1
#---------------------------------------------------------------------------
# Build related configuration options
#---------------------------------------------------------------------------
@@ -176,6 +180,7 @@ FILE_PATTERNS = *.c \
*.txt \
README
RECURSIVE = YES
+EXCLUDE = {{EXCLUDE}}
EXCLUDE_SYMLINKS = YES
EXCLUDE_PATTERNS = LocalSettings.php AdminSettings.php StartProfiler.php .svn */.git/* {{EXCLUDE_PATTERNS}}
EXCLUDE_SYMBOLS =
@@ -216,7 +221,7 @@ HTML_STYLESHEET =
HTML_EXTRA_FILES =
HTML_COLORSTYLE_HUE = 220
HTML_COLORSTYLE_SAT = 100
-HTML_COLORSTYLE_GAMMA = 80
+HTML_COLORSTYLE_GAMMA = 80
HTML_TIMESTAMP = YES
HTML_ALIGN_MEMBERS = YES
HTML_DYNAMIC_SECTIONS = NO
@@ -358,7 +363,7 @@ MSCFILE_DIRS =
DOT_GRAPH_MAX_NODES = 50
MAX_DOT_GRAPH_DEPTH = 1000
DOT_TRANSPARENT = NO
-DOT_MULTI_TARGETS = NO
+DOT_MULTI_TARGETS = YES
GENERATE_LEGEND = YES
DOT_CLEANUP = YES
diff --git a/maintenance/Maintenance.php b/maintenance/Maintenance.php
index a13453df..30e93c90 100644
--- a/maintenance/Maintenance.php
+++ b/maintenance/Maintenance.php
@@ -23,7 +23,7 @@
// Make sure we're on PHP5.3.2 or better
if ( !function_exists( 'version_compare' ) || version_compare( PHP_VERSION, '5.3.2' ) < 0 ) {
// We need to use dirname( __FILE__ ) here cause __DIR__ is PHP5.3+
- require_once( dirname( __FILE__ ) . '/../includes/PHPVersionError.php' );
+ require_once dirname( __FILE__ ) . '/../includes/PHPVersionError.php';
wfPHPVersionError( 'cli' );
}
@@ -54,8 +54,8 @@ abstract class Maintenance {
* Constants for DB access type
* @see Maintenance::getDbType()
*/
- const DB_NONE = 0;
- const DB_STD = 1;
+ const DB_NONE = 0;
+ const DB_STD = 1;
const DB_ADMIN = 2;
// Const for getStdin()
@@ -153,7 +153,7 @@ abstract class Maintenance {
return false; // last call should be to this function
}
$includeFuncs = array( 'require_once', 'require', 'include', 'include_once' );
- for( $i=1; $i < $count; $i++ ) {
+ for ( $i = 1; $i < $count; $i++ ) {
if ( !in_array( $bt[$i]['function'], $includeFuncs ) ) {
return false; // previous calls should all be "requires"
}
@@ -327,7 +327,7 @@ abstract class Maintenance {
}
if ( $channel === null ) {
$this->cleanupChanneled();
- print( $out );
+ print $out;
} else {
$out = preg_replace( '/\n\z/', '', $out );
$this->outputChanneled( $out, $channel );
@@ -426,9 +426,10 @@ abstract class Maintenance {
$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 );
+ $this->addOption( 'profiler', 'Set to "text" or "trace" to show profiling output', false, true );
# Save generic options to display them separately in help
- $this->mGenericParameters = $this->mParams ;
+ $this->mGenericParameters = $this->mParams;
# Script dependant options:
@@ -452,11 +453,11 @@ abstract class Maintenance {
*/
public function runChild( $maintClass, $classFile = null ) {
// Make sure the class is loaded first
- if ( !MWInit::classExists( $maintClass ) ) {
+ if ( !class_exists( $maintClass ) ) {
if ( $classFile ) {
- require_once( $classFile );
+ require_once $classFile;
}
- if ( !MWInit::classExists( $maintClass ) ) {
+ if ( !class_exists( $maintClass ) ) {
$this->error( "Cannot spawn child: $maintClass" );
}
}
@@ -476,15 +477,20 @@ abstract class Maintenance {
* Do some sanity checking and basic setup
*/
public function setup() {
- global $wgCommandLineMode, $wgRequestTime;
+ global $IP, $wgCommandLineMode, $wgRequestTime;
# Abort if called from a web server
if ( isset( $_SERVER ) && isset( $_SERVER['REQUEST_METHOD'] ) ) {
$this->error( 'This script must be run from the command line', true );
}
+ if ( $IP === null ) {
+ $this->error( "\$IP not set, aborting!\n" .
+ '(Did you forget to call parent::__construct() in your maintenance script?)', 1 );
+ }
+
# Make sure we can handle script parameters
- if ( !function_exists( 'hphp_thread_set_warmup_enabled' ) && !ini_get( 'register_argc_argv' ) ) {
+ if ( !defined( 'HPHP_VERSION' ) && !ini_get( 'register_argc_argv' ) ) {
$this->error( 'Cannot get command line arguments, register_argc_argv is set to false', true );
}
@@ -515,7 +521,7 @@ abstract class Maintenance {
$wgCommandLineMode = true;
# Turn off output buffering if it's on
- while( ob_get_level() > 0 ) {
+ while ( ob_get_level() > 0 ) {
ob_end_flush();
}
@@ -634,7 +640,7 @@ abstract class Maintenance {
} elseif ( substr( $arg, 0, 1 ) == '-' ) {
# Short options
for ( $p = 1; $p < strlen( $arg ); $p++ ) {
- $option = $arg { $p } ;
+ $option = $arg { $p };
if ( !isset( $this->mParams[$option] ) && isset( $this->mShortParamsMap[$option] ) ) {
$option = $this->mShortParamsMap[$option];
}
@@ -712,7 +718,7 @@ abstract class Maintenance {
* @param $force boolean Whether to force the help to show, default false
*/
protected function maybeHelp( $force = false ) {
- if( !$force && !$this->hasOption( 'help' ) ) {
+ if ( !$force && !$this->hasOption( 'help' ) ) {
return;
}
@@ -743,8 +749,9 @@ abstract class Maintenance {
} else {
$output .= '[' . $arg['name'] . ']';
}
- if ( $k < count( $this->mArgList ) - 1 )
+ if ( $k < count( $this->mArgList ) - 1 ) {
$output .= ' ';
+ }
}
}
$this->output( "$output\n\n" );
@@ -765,7 +772,7 @@ abstract class Maintenance {
$this->output( "\n" );
$scriptDependantParams = $this->mDependantParameters;
- if( count($scriptDependantParams) > 0 ) {
+ if ( count( $scriptDependantParams ) > 0 ) {
$this->output( "Script dependant parameters:\n" );
// Parameters description
foreach ( $scriptDependantParams as $par => $info ) {
@@ -790,7 +797,7 @@ abstract class Maintenance {
$this->mGenericParameters,
$this->mDependantParameters
);
- if( count($scriptSpecificParams) > 0 ) {
+ if ( count( $scriptSpecificParams ) > 0 ) {
$this->output( "Script specific parameters:\n" );
// Parameters description
foreach ( $scriptSpecificParams as $par => $info ) {
@@ -806,7 +813,7 @@ abstract class Maintenance {
}
// Print arguments
- if( count( $this->mArgList ) > 0 ) {
+ if ( count( $this->mArgList ) > 0 ) {
$this->output( "Arguments:\n" );
// Arguments description
foreach ( $this->mArgList as $info ) {
@@ -839,7 +846,7 @@ abstract class Maintenance {
$wgCommandLineMode = true;
# Override $wgServer
- if( $this->hasOption( 'server') ) {
+ if ( $this->hasOption( 'server' ) ) {
$wgServer = $this->getOption( 'server', $wgServer );
}
@@ -876,6 +883,16 @@ abstract class Maintenance {
$wgShowSQLErrors = true;
@set_time_limit( 0 );
$this->adjustMemoryLimit();
+
+ // Per-script profiling; useful for debugging
+ $forcedProfiler = $this->getOption( 'profiler' );
+ if ( $forcedProfiler === 'text' ) {
+ Profiler::setInstance( new ProfilerSimpleText( array() ) );
+ Profiler::instance()->setTemplated( true );
+ } elseif ( $forcedProfiler === 'trace' ) {
+ Profiler::setInstance( new ProfilerSimpleTrace( array() ) );
+ Profiler::instance()->setTemplated( true );
+ }
}
/**
@@ -906,7 +923,7 @@ abstract class Maintenance {
if ( isset( $this->mOptions['conf'] ) ) {
$settingsFile = $this->mOptions['conf'];
- } elseif ( defined("MW_CONFIG_FILE") ) {
+ } elseif ( defined( "MW_CONFIG_FILE" ) ) {
$settingsFile = MW_CONFIG_FILE;
} else {
$settingsFile = "$IP/LocalSettings.php";
@@ -1025,7 +1042,7 @@ abstract class Maintenance {
( strpos( file_get_contents( $file ), '$maintClass' ) === false ) ) {
continue;
}
- require( $file );
+ require $file;
$vars = get_defined_vars();
if ( array_key_exists( 'maintClass', $vars ) ) {
self::$mCoreScripts[$vars['maintClass']] = $file;
@@ -1076,7 +1093,7 @@ abstract class Maintenance {
* @param &$db DatabaseBase object
*/
private function unlockSearchindex( &$db ) {
- $db->unlockTables( __CLASS__ . '::' . __METHOD__ );
+ $db->unlockTables( __CLASS__ . '::' . __METHOD__ );
}
/**
@@ -1143,8 +1160,7 @@ abstract class Maintenance {
$title = $titleObj->getPrefixedDBkey();
$this->output( "$title..." );
# Update searchindex
- # TODO: pass the Content object to SearchUpdate, let the search engine decide how to deal with it.
- $u = new SearchUpdate( $pageId, $titleObj->getText(), $rev->getContent()->getTextForSearchIndex() );
+ $u = new SearchUpdate( $pageId, $titleObj->getText(), $rev->getContent() );
$u->doUpdate();
$this->output( "\n" );
}
@@ -1160,7 +1176,7 @@ abstract class Maintenance {
* @return bool
*/
public static function posix_isatty( $fd ) {
- if ( !MWInit::functionExists( 'posix_isatty' ) ) {
+ if ( !function_exists( 'posix_isatty' ) ) {
return !$fd;
} else {
return posix_isatty( $fd );
@@ -1190,7 +1206,9 @@ abstract class Maintenance {
$st = fgets( STDIN, 1024 );
}
}
- if ( $st === false ) return false;
+ if ( $st === false ) {
+ return false;
+ }
$resp = trim( $st );
return $resp;
}
diff --git a/maintenance/archives/patch-archive-ar_id.sql b/maintenance/archives/patch-archive-ar_id.sql
new file mode 100644
index 00000000..ddd1d7b4
--- /dev/null
+++ b/maintenance/archives/patch-archive-ar_id.sql
@@ -0,0 +1,8 @@
+--
+-- patch-archive-ar_id.sql
+--
+-- Bug 39675. Add archive.ar_id.
+
+ALTER TABLE /*$wgDBprefix*/archive
+ ADD COLUMN ar_id int unsigned NOT NULL AUTO_INCREMENT FIRST,
+ ADD PRIMARY KEY (ar_id);
diff --git a/maintenance/archives/patch-change_tag.sql b/maintenance/archives/patch-change_tag.sql
index 030e086b..3079a5bb 100644
--- a/maintenance/archives/patch-change_tag.sql
+++ b/maintenance/archives/patch-change_tag.sql
@@ -13,20 +13,3 @@ CREATE UNIQUE INDEX /*i*/change_tag_log_tag ON /*_*/change_tag (ct_log_id,ct_tag
CREATE UNIQUE INDEX /*i*/change_tag_rev_tag ON /*_*/change_tag (ct_rev_id,ct_tag);
-- Covering index, so we can pull all the info only out of the index.
CREATE INDEX /*i*/change_tag_tag_id ON /*_*/change_tag (ct_tag,ct_rc_id,ct_rev_id,ct_log_id);
-
--- Rollup table to pull a LIST of tags simply without ugly GROUP_CONCAT that only works on MySQL 4.1+
-CREATE TABLE /*_*/tag_summary (
- ts_rc_id int NULL,
- ts_log_id int NULL,
- ts_rev_id int NULL,
- ts_tags BLOB NOT NULL
-) /*$wgDBTableOptions*/;
-
-CREATE UNIQUE INDEX /*i*/tag_summary_rc_id ON /*_*/tag_summary (ts_rc_id);
-CREATE UNIQUE INDEX /*i*/tag_summary_log_id ON /*_*/tag_summary (ts_log_id);
-CREATE UNIQUE INDEX /*i*/tag_summary_rev_id ON /*_*/tag_summary (ts_rev_id);
-
-
-CREATE TABLE /*_*/valid_tag (
- vt_tag varchar(255) NOT NULL PRIMARY KEY
-) /*$wgDBTableOptions*/;
diff --git a/maintenance/archives/patch-eu_local_id.sql b/maintenance/archives/patch-eu_local_id.sql
deleted file mode 100644
index bb59d067..00000000
--- a/maintenance/archives/patch-eu_local_id.sql
+++ /dev/null
@@ -1,3 +0,0 @@
-ALTER TABLE /*_*/external_user
-CHANGE COLUMN eu_wiki_id
-eu_local_id int unsigned NOT NULL;
diff --git a/maintenance/archives/patch-external_user.sql b/maintenance/archives/patch-external_user.sql
deleted file mode 100644
index 176b46d4..00000000
--- a/maintenance/archives/patch-external_user.sql
+++ /dev/null
@@ -1,9 +0,0 @@
-CREATE TABLE /*_*/external_user (
- -- Foreign key to user_id
- eu_local_id int unsigned NOT NULL PRIMARY KEY,
-
- -- Some opaque identifier provided by the external database
- eu_external_id varchar(255) binary NOT NULL
-) /*$wgDBTableOptions*/;
-
-CREATE UNIQUE INDEX /*i*/eu_external_id ON /*_*/external_user (eu_external_id);
diff --git a/maintenance/archives/patch-externallinks-el_id.sql b/maintenance/archives/patch-externallinks-el_id.sql
new file mode 100644
index 00000000..d4b51b51
--- /dev/null
+++ b/maintenance/archives/patch-externallinks-el_id.sql
@@ -0,0 +1,8 @@
+--
+-- patch-extenallinks-el_id.sql
+--
+-- Bug 15441. Add externallinks.el_id.
+
+ALTER TABLE /*$wgDBprefix*/externallinks
+ ADD COLUMN el_id int unsigned NOT NULL AUTO_INCREMENT FIRST,
+ ADD PRIMARY KEY (el_id);
diff --git a/maintenance/archives/patch-iwl_prefix_title_from-non-unique.sql b/maintenance/archives/patch-iwl_prefix_title_from-non-unique.sql
new file mode 100644
index 00000000..bff63c74
--- /dev/null
+++ b/maintenance/archives/patch-iwl_prefix_title_from-non-unique.sql
@@ -0,0 +1,5 @@
+--
+-- Makes the iwl_prefix_title_from index for the iwlinks table non-unique
+--
+DROP INDEX /*i*/iwl_prefix_title_from ON /*_*/iwlinks;
+CREATE INDEX /*i*/iwl_prefix_title_from ON /*_*/iwlinks (iwl_prefix, iwl_title, iwl_from);
diff --git a/maintenance/archives/patch-iwlinks-from-title-index.sql b/maintenance/archives/patch-iwlinks-from-title-index.sql
new file mode 100644
index 00000000..8b73f9e3
--- /dev/null
+++ b/maintenance/archives/patch-iwlinks-from-title-index.sql
@@ -0,0 +1,4 @@
+--
+-- Recreates the iwl_prefix_from_title index for the iwlinks table
+--
+CREATE INDEX /*i*/iwl_prefix_from_title ON /*_*/iwlinks (iwl_prefix, iwl_from, iwl_title);
diff --git a/maintenance/archives/patch-kill-iwl_pft.sql b/maintenance/archives/patch-kill-iwl_pft.sql
deleted file mode 100644
index 96e14356..00000000
--- a/maintenance/archives/patch-kill-iwl_pft.sql
+++ /dev/null
@@ -1,7 +0,0 @@
---
--- 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-tag_summary.sql b/maintenance/archives/patch-tag_summary.sql
new file mode 100644
index 00000000..a81b3680
--- /dev/null
+++ b/maintenance/archives/patch-tag_summary.sql
@@ -0,0 +1,12 @@
+-- Rollup table to pull a LIST of tags simply without ugly GROUP_CONCAT that only works on MySQL 4.1+
+-- Andrew Garrett, 2009-01
+CREATE TABLE /*_*/tag_summary (
+ ts_rc_id int NULL,
+ ts_log_id int NULL,
+ ts_rev_id int NULL,
+ ts_tags BLOB NOT NULL
+) /*$wgDBTableOptions*/;
+
+CREATE UNIQUE INDEX /*i*/tag_summary_rc_id ON /*_*/tag_summary (ts_rc_id);
+CREATE UNIQUE INDEX /*i*/tag_summary_log_id ON /*_*/tag_summary (ts_log_id);
+CREATE UNIQUE INDEX /*i*/tag_summary_rev_id ON /*_*/tag_summary (ts_rev_id);
diff --git a/maintenance/archives/patch-valid_tag.sql b/maintenance/archives/patch-valid_tag.sql
new file mode 100644
index 00000000..994a5d53
--- /dev/null
+++ b/maintenance/archives/patch-valid_tag.sql
@@ -0,0 +1,4 @@
+-- Andrew Garrett, 2009-01
+CREATE TABLE /*_*/valid_tag (
+ vt_tag varchar(255) NOT NULL PRIMARY KEY
+) /*$wgDBTableOptions*/;
diff --git a/maintenance/archives/upgradeLogging.php b/maintenance/archives/upgradeLogging.php
index f0806458..0749bbf6 100644
--- a/maintenance/archives/upgradeLogging.php
+++ b/maintenance/archives/upgradeLogging.php
@@ -21,7 +21,7 @@
* @ingroup MaintenanceArchive
*/
-require( __DIR__ . '/../commandLine.inc' );
+require __DIR__ . '/../commandLine.inc';
/**
* Maintenance script that upgrade for log_id/log_deleted fields in a
diff --git a/maintenance/attachLatest.php b/maintenance/attachLatest.php
index 475cafc9..2cf277fe 100644
--- a/maintenance/attachLatest.php
+++ b/maintenance/attachLatest.php
@@ -24,7 +24,7 @@
* @ingroup Maintenance
*/
-require_once( __DIR__ . '/Maintenance.php' );
+require_once __DIR__ . '/Maintenance.php';
/**
* Maintenance script to correct wrong values in the `page_latest` field
@@ -83,4 +83,4 @@ class AttachLatest extends Maintenance {
}
$maintClass = "AttachLatest";
-require_once( RUN_MAINTENANCE_IF_MAIN );
+require_once RUN_MAINTENANCE_IF_MAIN;
diff --git a/maintenance/backup.inc b/maintenance/backup.inc
index e3dc488b..3dc94c88 100644
--- a/maintenance/backup.inc
+++ b/maintenance/backup.inc
@@ -40,17 +40,17 @@ class BackupDumper {
var $reportingInterval = 100;
var $reporting = true;
var $pageCount = 0;
- var $revCount = 0;
- var $server = null; // use default
- var $pages = null; // all pages
+ var $revCount = 0;
+ var $server = null; // use default
+ var $pages = null; // all pages
var $skipHeader = false; // don't output <mediawiki> and <siteinfo>
var $skipFooter = false; // don't output </mediawiki>
- var $startId = 0;
- var $endId = 0;
+ var $startId = 0;
+ var $endId = 0;
var $revStartId = 0;
- var $revEndId = 0;
- var $sink = null; // Output filters
- var $stubText = false; // include rev_text_id instead of text; for 2-pass dump
+ var $revEndId = 0;
+ var $sink = null; // Output filters
+ var $stubText = false; // include rev_text_id instead of text; for 2-pass dump
var $dumpUploads = false;
var $dumpUploadFileContents = false;
var $lastTime = 0;
@@ -116,7 +116,7 @@ class BackupDumper {
*/
function loadPlugin( $class, $file ) {
if ( $file != '' ) {
- require_once( $file );
+ require_once $file;
}
$register = array( $class, 'register' );
call_user_func_array( $register, array( &$this ) );
@@ -133,7 +133,7 @@ class BackupDumper {
$matches = array();
if ( preg_match( '/^--(.+?)(?:=(.+?)(?::(.+?))?)?$/', $arg, $matches ) ) {
@list( /* $full */ , $opt, $val, $param ) = $matches;
- switch( $opt ) {
+ switch ( $opt ) {
case "plugin":
$this->loadPlugin( $val, $param );
break;
@@ -170,11 +170,8 @@ class BackupDumper {
break;
case "force-normal":
if ( !function_exists( 'utf8_normalize' ) ) {
- wfDl( "php_utfnormal.so" );
- if ( !function_exists( 'utf8_normalize' ) ) {
- $this->fatalError( "Failed to load UTF-8 normalization extension. " .
- "Install or remove --force-normal parameter to use slower code." );
- }
+ $this->fatalError( "UTF-8 normalization extension not loaded. " .
+ "Install or remove --force-normal parameter to use slower code." );
}
break;
default:
@@ -202,8 +199,9 @@ 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 );
@@ -215,8 +213,9 @@ 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 ) {
@@ -225,7 +224,7 @@ class BackupDumper {
$exporter->allLogs();
}
# Page dumps: all or by page ID range
- } else if ( is_null( $this->pages ) ) {
+ } elseif ( is_null( $this->pages ) ) {
if ( $this->startId || $this->endId ) {
$exporter->pagesByRange( $this->startId, $this->endId );
} elseif ( $this->revStartId || $this->revEndId ) {
@@ -238,8 +237,9 @@ class BackupDumper {
$exporter->pagesByName( $this->pages );
}
- if ( !$this->skipFooter )
+ if ( !$this->skipFooter ) {
$exporter->closeStream();
+ }
$this->report( true );
}
@@ -365,7 +365,7 @@ class BackupDumper {
function fatalError( $msg ) {
$this->progress( "$msg\n" );
- die(1);
+ die( 1 );
}
}
diff --git a/maintenance/backupPrefetch.inc b/maintenance/backupPrefetch.inc
index cc0a7e17..04352b9b 100644
--- a/maintenance/backupPrefetch.inc
+++ b/maintenance/backupPrefetch.inc
@@ -51,7 +51,7 @@ class BaseDump {
$this->infiles = explode( ';', $infile );
$this->reader = new XMLReader();
$infile = array_shift( $this->infiles );
- if (defined( 'LIBXML_PARSEHUGE' ) ) {
+ if ( defined( 'LIBXML_PARSEHUGE' ) ) {
$this->reader->open( $infile, null, LIBXML_PARSEHUGE );
}
else {
@@ -110,8 +110,8 @@ class BaseDump {
}
} else {
$this->close();
- if (count($this->infiles)) {
- $infile = array_shift($this->infiles);
+ if ( count( $this->infiles ) ) {
+ $infile = array_shift( $this->infiles );
$this->reader->open( $infile );
$this->atEnd = false;
}
@@ -181,7 +181,7 @@ class BaseDump {
}
$buffer = "";
while ( $this->reader->read() ) {
- switch( $this->reader->nodeType ) {
+ switch ( $this->reader->nodeType ) {
case XMLReader::TEXT:
// case XMLReader::WHITESPACE:
case XMLReader::SIGNIFICANT_WHITESPACE:
diff --git a/maintenance/backupTextPass.inc b/maintenance/backupTextPass.inc
index 0b8b3445..c515c6fe 100644
--- a/maintenance/backupTextPass.inc
+++ b/maintenance/backupTextPass.inc
@@ -24,7 +24,7 @@
* @ingroup Maintenance
*/
-require_once( __DIR__ . '/backup.inc' );
+require_once __DIR__ . '/backup.inc';
/**
* @ingroup Maintenance
@@ -141,8 +141,9 @@ class TextPassDumper extends 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( $this->history );
@@ -182,7 +183,7 @@ class TextPassDumper extends BackupDumper {
global $IP;
$url = $this->processFileOpt( $val, $param );
- switch( $opt ) {
+ switch ( $opt ) {
case 'prefetch':
require_once "$IP/maintenance/backupPrefetch.inc";
$this->prefetch = new BaseDump( $url );
@@ -214,7 +215,7 @@ class TextPassDumper extends BackupDumper {
function processFileOpt( $val, $param ) {
$fileURIs = explode( ';', $param );
foreach ( $fileURIs as $URI ) {
- switch( $val ) {
+ switch ( $val ) {
case "file":
$newURI = $URI;
break;
@@ -298,7 +299,7 @@ class TextPassDumper extends BackupDumper {
}
function checkIfTimeExceeded() {
- if ( $this->maxTimeAllowed && ( $this->lastTime - $this->timeOfCheckpoint > $this->maxTimeAllowed ) ) {
+ if ( $this->maxTimeAllowed && ( $this->lastTime - $this->timeOfCheckpoint > $this->maxTimeAllowed ) ) {
return true;
}
return false;
@@ -413,6 +414,8 @@ class TextPassDumper extends BackupDumper {
* @throws MWException
*/
function getText( $id ) {
+ global $wgContentHandlerUseDB;
+
$prefetchNotTried = true; // Whether or not we already tried to get the text via prefetch.
$text = false; // The candidate for a good text. false if no proper value.
$failures = 0; // The number of times, this invocation of getText already failed.
@@ -478,7 +481,28 @@ class TextPassDumper extends BackupDumper {
if ( ! isset( $this->db ) ) {
throw new MWException( "No database available" );
}
- $revLength = $this->db->selectField( 'revision', 'rev_len', array( 'rev_id' => $revID ) );
+
+ $revLength = strlen( $text );
+ if ( $wgContentHandlerUseDB ) {
+ $row = $this->db->selectRow(
+ 'revision',
+ array( 'rev_len', 'rev_content_model' ),
+ array( 'rev_id' => $revID ),
+ __METHOD__
+ );
+ if ( $row ) {
+ // only check the length for the wikitext content handler,
+ // it's a wasted (and failed) check otherwise
+ if ( $row->rev_content_model == CONTENT_MODEL_WIKITEXT ) {
+ $revLength = $row->rev_len;
+ }
+ }
+
+ }
+ else {
+ $revLength = $this->db->selectField( 'revision', 'rev_len', array( 'rev_id' => $revID ) );
+ }
+
if ( strlen( $text ) == $revLength ) {
if ( $tryIsPrefetch ) {
$this->prefetchCount++;
@@ -611,17 +635,21 @@ class TextPassDumper extends BackupDumper {
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();
}
@@ -631,11 +659,15 @@ class TextPassDumper extends BackupDumper {
$ok = fwrite( $this->spawnWrite, "$id\n" );
// $this->progress( ">> $id" );
- if ( !$ok ) return false;
+ if ( !$ok ) {
+ return false;
+ }
$ok = fflush( $this->spawnWrite );
// $this->progress( ">> [flush]" );
- if ( !$ok ) return false;
+ 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
@@ -649,18 +681,24 @@ class TextPassDumper extends BackupDumper {
$len = fgets( $this->spawnRead );
// $this->progress( "<< " . trim( $len ) );
- if ( $len === false ) return false;
+ if ( $len === false ) {
+ return false;
+ }
$nbytes = intval( $len );
// actual error, not zero-length text
- if ( $nbytes < 0 ) return false;
+ if ( $nbytes < 0 ) {
+ return false;
+ }
$text = "";
// Subprocess may not send everything at once, we have to loop.
while ( $nbytes > strlen( $text ) ) {
$buffer = fread( $this->spawnRead, $nbytes - strlen( $text ) );
- if ( $buffer === false ) break;
+ if ( $buffer === false ) {
+ break;
+ }
$text .= $buffer;
}
diff --git a/maintenance/benchmarks/Benchmarker.php b/maintenance/benchmarks/Benchmarker.php
index 98b35b53..dd558f32 100644
--- a/maintenance/benchmarks/Benchmarker.php
+++ b/maintenance/benchmarks/Benchmarker.php
@@ -27,7 +27,7 @@
* @ingroup Benchmark
*/
-require_once( __DIR__ . '/../Maintenance.php' );
+require_once __DIR__ . '/../Maintenance.php';
/**
* Base class for benchmark scripts.
@@ -48,20 +48,20 @@ abstract class Benchmarker extends Maintenance {
foreach( $benchs as $bench ) {
// handle empty args
- if(!array_key_exists( 'args', $bench )) {
+ if( !array_key_exists( 'args', $bench ) ) {
$bench['args'] = array();
}
$bench_number++;
$start = microtime( true );
- for( $i=0; $i<$count; $i++ ) {
+ for( $i = 0; $i < $count; $i++ ) {
call_user_func_array( $bench['function'], $bench['args'] );
}
$delta = microtime( true ) - $start;
// function passed as a callback
if( is_array( $bench['function'] ) ) {
- $ret = get_class( $bench['function'][0] ). '->' . $bench['function'][1];
+ $ret = get_class( $bench['function'][0] ) . '->' . $bench['function'][1];
$bench['function'] = $ret;
}
@@ -85,7 +85,7 @@ abstract class Benchmarker extends Maintenance {
join( ', ', $res['arguments'] )
);
$ret .= sprintf( " %6.2fms (%6.2fms each)\n",
- $res['delta'] * 1000,
+ $res['delta'] * 1000,
$res['average'] * 1000
);
}
diff --git a/maintenance/benchmarks/README b/maintenance/benchmarks/README
new file mode 100644
index 00000000..c021abd2
--- /dev/null
+++ b/maintenance/benchmarks/README
@@ -0,0 +1,7 @@
+This directory hold several benchmarking scripts used as a proof of speed
+or to track PHP performances over time.
+
+To get somehow accurate result, you might want to bound the PHP process
+to a specific CPU with `taskset` and raise its priority with `nice`. Example:
+
+ $ taskset 1 nice -n-10 php bench_wfIsWindows.php
diff --git a/maintenance/benchmarks/bench_HTTP_HTTPS.php b/maintenance/benchmarks/bench_HTTP_HTTPS.php
index fa76ae22..6f800fb3 100644
--- a/maintenance/benchmarks/bench_HTTP_HTTPS.php
+++ b/maintenance/benchmarks/bench_HTTP_HTTPS.php
@@ -24,7 +24,7 @@
* @author Platonides
*/
-require_once( __DIR__ . '/Benchmarker.php' );
+require_once __DIR__ . '/Benchmarker.php';
/**
* Maintenance script that benchmarks HTTP request vs HTTPS request.
@@ -62,4 +62,4 @@ class bench_HTTP_HTTPS extends Benchmarker {
}
$maintClass = 'bench_HTTP_HTTPS';
-require_once( RUN_MAINTENANCE_IF_MAIN );
+require_once RUN_MAINTENANCE_IF_MAIN;
diff --git a/maintenance/benchmarks/bench_delete_truncate.php b/maintenance/benchmarks/bench_delete_truncate.php
index d9741496..3eff534b 100644
--- a/maintenance/benchmarks/bench_delete_truncate.php
+++ b/maintenance/benchmarks/bench_delete_truncate.php
@@ -21,7 +21,7 @@
* @ingroup Benchmark
*/
-require_once( __DIR__ . '/Benchmarker.php' );
+require_once __DIR__ . '/Benchmarker.php';
/**
* Maintenance script that benchmarks SQL DELETE vs SQL TRUNCATE.
@@ -101,4 +101,4 @@ class BenchmarkDeleteTruncate extends Benchmarker {
}
$maintClass = "BenchmarkDeleteTruncate";
-require_once( RUN_MAINTENANCE_IF_MAIN );
+require_once RUN_MAINTENANCE_IF_MAIN;
diff --git a/maintenance/benchmarks/bench_if_switch.php b/maintenance/benchmarks/bench_if_switch.php
index 1f590d4d..80fd9623 100644
--- a/maintenance/benchmarks/bench_if_switch.php
+++ b/maintenance/benchmarks/bench_if_switch.php
@@ -24,7 +24,7 @@
* @author Platonides
*/
-require_once( __DIR__ . '/Benchmarker.php' );
+require_once __DIR__ . '/Benchmarker.php';
/**
* Maintenance script that benchmark if elseif... versus switch case.
@@ -93,4 +93,4 @@ class bench_if_switch extends Benchmarker {
}
$maintClass = 'bench_if_switch';
-require_once( RUN_MAINTENANCE_IF_MAIN );
+require_once RUN_MAINTENANCE_IF_MAIN;
diff --git a/maintenance/benchmarks/bench_strtr_str_replace.php b/maintenance/benchmarks/bench_strtr_str_replace.php
index 10c5cd0b..bd21b186 100644
--- a/maintenance/benchmarks/bench_strtr_str_replace.php
+++ b/maintenance/benchmarks/bench_strtr_str_replace.php
@@ -23,7 +23,7 @@
* @ingroup Benchmark
*/
-require_once( __DIR__ . '/Benchmarker.php' );
+require_once __DIR__ . '/Benchmarker.php';
function bfNormalizeTitleStrTr( $str ) {
return strtr( $str, '_', ' ' );
@@ -75,4 +75,4 @@ class bench_strtr_str_replace extends Benchmarker {
}
$maintClass = 'bench_strtr_str_replace';
-require_once( RUN_MAINTENANCE_IF_MAIN );
+require_once RUN_MAINTENANCE_IF_MAIN;
diff --git a/maintenance/benchmarks/bench_utf8_title_check.php b/maintenance/benchmarks/bench_utf8_title_check.php
index f5987800..078293eb 100644
--- a/maintenance/benchmarks/bench_utf8_title_check.php
+++ b/maintenance/benchmarks/bench_utf8_title_check.php
@@ -21,7 +21,7 @@
* @ingroup Benchmark
*/
-require_once( __DIR__ . '/Benchmarker.php' );
+require_once __DIR__ . '/Benchmarker.php';
/**
* This little benchmark executes the regexp used in Language->checkTitleEncoding()
@@ -38,7 +38,7 @@ class bench_utf8_title_check extends Benchmarker {
public function __construct() {
parent::__construct();
- $this->data = array (
+ $this->data = array(
"",
"United States of America", // 7bit ASCII
"S%C3%A9rie%20t%C3%A9l%C3%A9vis%C3%A9e",
@@ -123,4 +123,4 @@ class bench_utf8_title_check extends Benchmarker {
}
$maintClass = 'bench_utf8_title_check';
-require_once( RUN_MAINTENANCE_IF_MAIN );
+require_once RUN_MAINTENANCE_IF_MAIN;
diff --git a/maintenance/benchmarks/bench_wfBaseConvert.php b/maintenance/benchmarks/bench_wfBaseConvert.php
index a1e5c6a4..f8a21562 100644
--- a/maintenance/benchmarks/bench_wfBaseConvert.php
+++ b/maintenance/benchmarks/bench_wfBaseConvert.php
@@ -22,7 +22,7 @@
* @author Tyler Romeo
*/
-require_once( __DIR__ . '/Benchmarker.php' );
+require_once __DIR__ . '/Benchmarker.php';
/**
* Maintenance script that benchmarks wfBaseConvert().
@@ -74,4 +74,4 @@ class bench_wfBaseConvert extends Benchmarker {
}
$maintClass = 'bench_wfBaseConvert';
-require_once( RUN_MAINTENANCE_IF_MAIN );
+require_once RUN_MAINTENANCE_IF_MAIN;
diff --git a/maintenance/benchmarks/bench_wfIsWindows.php b/maintenance/benchmarks/bench_wfIsWindows.php
index 85439827..1cd2016b 100644
--- a/maintenance/benchmarks/bench_wfIsWindows.php
+++ b/maintenance/benchmarks/bench_wfIsWindows.php
@@ -24,7 +24,7 @@
* @author Platonides
*/
-require_once( __DIR__ . '/Benchmarker.php' );
+require_once __DIR__ . '/Benchmarker.php';
/**
* Maintenance script that benchmarks wfIsWindows().
@@ -66,4 +66,4 @@ class bench_wfIsWindows extends Benchmarker {
}
$maintClass = 'bench_wfIsWindows';
-require_once( RUN_MAINTENANCE_IF_MAIN );
+require_once RUN_MAINTENANCE_IF_MAIN;
diff --git a/maintenance/benchmarks/benchmarkHooks.php b/maintenance/benchmarks/benchmarkHooks.php
index fdb016f4..3f5d6db0 100644
--- a/maintenance/benchmarks/benchmarkHooks.php
+++ b/maintenance/benchmarks/benchmarkHooks.php
@@ -21,7 +21,7 @@
* @ingroup Benchmark
*/
-require_once( __DIR__ . '/Benchmarker.php' );
+require_once __DIR__ . '/Benchmarker.php';
/**
* Maintenance script that benchmarks %MediaWiki hooks.
@@ -84,4 +84,4 @@ class BenchmarkHooks extends Benchmarker {
}
$maintClass = 'BenchmarkHooks';
-require_once( RUN_MAINTENANCE_IF_MAIN );
+require_once RUN_MAINTENANCE_IF_MAIN;
diff --git a/maintenance/benchmarks/benchmarkPurge.php b/maintenance/benchmarks/benchmarkPurge.php
index ec686b2a..fd863d52 100644
--- a/maintenance/benchmarks/benchmarkPurge.php
+++ b/maintenance/benchmarks/benchmarkPurge.php
@@ -21,7 +21,7 @@
* @ingroup Benchmark
*/
-require_once( __DIR__ . '/Benchmarker.php' );
+require_once __DIR__ . '/Benchmarker.php';
/**
* Maintenance script that benchmarks Squid purge.
@@ -112,4 +112,4 @@ class BenchmarkPurge extends Benchmarker {
}
$maintClass = "BenchmarkPurge";
-require_once( RUN_MAINTENANCE_IF_MAIN );
+require_once RUN_MAINTENANCE_IF_MAIN;
diff --git a/maintenance/cdb.php b/maintenance/cdb.php
index c06c2cd0..d42f9f7a 100644
--- a/maintenance/cdb.php
+++ b/maintenance/cdb.php
@@ -23,12 +23,12 @@
*/
/** */
-require_once( __DIR__ . '/commandLine.inc' );
+require_once __DIR__ . '/commandLine.inc';
function cdbShowHelp( $command ) {
$commandList = array(
'load' => 'load a cdb file for reading',
- 'get' => 'get a value for a key',
+ 'get' => 'get a value for a key',
'exit' => 'exit cdb',
'quit' => 'exit cdb',
'help' => 'help about a command',
@@ -55,7 +55,9 @@ do {
static $fileHandle;
$line = Maintenance::readconsole();
- if ( $line === false ) exit;
+ if ( $line === false ) {
+ exit;
+ }
$args = explode( ' ', $line );
$command = array_shift( $args );
@@ -67,25 +69,25 @@ do {
cdbShowHelp( array_shift( $args ) );
break;
case 'load':
- if( !isset( $args[0] ) ) {
+ if ( !isset( $args[0] ) ) {
print "Need a filename there buddy\n";
break;
}
$file = $args[0];
print "Loading cdb file $file...";
$fileHandle = CdbReader::open( $file );
- if( !$fileHandle ) {
+ if ( !$fileHandle ) {
print "not a cdb file or unable to read it\n";
} else {
print "ok\n";
}
break;
case 'get':
- if( !$fileHandle ) {
+ if ( !$fileHandle ) {
print "Need to load a cdb file first\n";
break;
}
- if( !isset( $args[0] ) ) {
+ if ( !isset( $args[0] ) ) {
print "Need to specify a key, Luke\n";
break;
}
diff --git a/maintenance/changePassword.php b/maintenance/changePassword.php
index 861610b7..5d98e1f5 100644
--- a/maintenance/changePassword.php
+++ b/maintenance/changePassword.php
@@ -24,7 +24,7 @@
* @ingroup Maintenance
*/
-require_once( __DIR__ . '/Maintenance.php' );
+require_once __DIR__ . '/Maintenance.php';
/**
* Maintenance script to change the password of a given user.
@@ -62,4 +62,4 @@ class ChangePassword extends Maintenance {
}
$maintClass = "ChangePassword";
-require_once( RUN_MAINTENANCE_IF_MAIN );
+require_once RUN_MAINTENANCE_IF_MAIN;
diff --git a/maintenance/checkBadRedirects.php b/maintenance/checkBadRedirects.php
index 4ba7e66b..a96e9b80 100644
--- a/maintenance/checkBadRedirects.php
+++ b/maintenance/checkBadRedirects.php
@@ -21,7 +21,7 @@
* @ingroup Maintenance
*/
-require_once( __DIR__ . '/Maintenance.php' );
+require_once __DIR__ . '/Maintenance.php';
/**
* Maintenance script to check that pages marked as being redirects really are.
@@ -61,4 +61,4 @@ class CheckBadRedirects extends Maintenance {
}
$maintClass = "CheckBadRedirects";
-require_once( RUN_MAINTENANCE_IF_MAIN );
+require_once RUN_MAINTENANCE_IF_MAIN;
diff --git a/maintenance/checkImages.php b/maintenance/checkImages.php
index c05d9151..e6aea537 100644
--- a/maintenance/checkImages.php
+++ b/maintenance/checkImages.php
@@ -20,7 +20,7 @@
* @file
* @ingroup Maintenance
*/
-require_once( __DIR__ . '/Maintenance.php' );
+require_once __DIR__ . '/Maintenance.php';
/**
* Maintenance script to check images to see if they exist, are readable, etc.
@@ -87,4 +87,4 @@ class CheckImages extends Maintenance {
}
$maintClass = "CheckImages";
-require_once( RUN_MAINTENANCE_IF_MAIN );
+require_once RUN_MAINTENANCE_IF_MAIN;
diff --git a/maintenance/checkLess.php b/maintenance/checkLess.php
new file mode 100644
index 00000000..d02d8a7b
--- /dev/null
+++ b/maintenance/checkLess.php
@@ -0,0 +1,72 @@
+<?php
+/**
+ * Checks LESS files in known resources for errors
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with this program; if not, write 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 __DIR__ . '/Maintenance.php';
+
+/**
+ * @ingroup Maintenance
+ */
+class CheckLess extends Maintenance {
+ public function __construct() {
+ parent::__construct();
+ $this->mDescription = 'Checks LESS files for errors';
+ }
+
+ public function execute() {
+ $result = false;
+ $resourceLoader = new ResourceLoader();
+ foreach ( $resourceLoader->getModuleNames() as $name ) {
+ /** @var ResourceLoaderFileModule $module */
+ $module = $resourceLoader->getModule( $name );
+ if ( !$module || !$module instanceof ResourceLoaderFileModule ) {
+ continue;
+ }
+
+ $hadErrors = false;
+ foreach ( $module->getAllStyleFiles() as $file ) {
+ if ( $module->getStyleSheetLang( $file ) !== 'less' ) {
+ continue;
+ }
+ try {
+ $compiler = ResourceLoader::getLessCompiler();
+ $compiler->compileFile( $file );
+ } catch ( Exception $e ) {
+ if ( !$hadErrors ) {
+ $this->error( "Errors checking module $name:\n" );
+ $hadErrors = true;
+ }
+ $this->error( $e->getMessage() . "\n" );
+ $result = true;
+ }
+ }
+ }
+ if ( !$result ) {
+ $this->output( "No errors found\n" );
+ } else {
+ die( 1 );
+ }
+ }
+}
+
+$maintClass = 'CheckLess';
+require_once RUN_MAINTENANCE_IF_MAIN;
diff --git a/maintenance/checkSyntax.php b/maintenance/checkSyntax.php
index 1e44e239..dc8626df 100644
--- a/maintenance/checkSyntax.php
+++ b/maintenance/checkSyntax.php
@@ -21,7 +21,7 @@
* @ingroup Maintenance
*/
-require_once( __DIR__ . '/Maintenance.php' );
+require_once __DIR__ . '/Maintenance.php';
/**
* Maintenance script to check syntax of all PHP files in MediaWiki.
@@ -221,12 +221,14 @@ class CheckSyntax extends Maintenance {
private function isSuitableFile( $file ) {
$file = str_replace( '\\', '/', $file );
$ext = pathinfo( $file, PATHINFO_EXTENSION );
- if ( $ext != 'php' && $ext != 'inc' && $ext != 'php5' )
+ if ( $ext != 'php' && $ext != 'inc' && $ext != 'php5' ) {
return false;
+ }
foreach ( $this->mIgnorePaths as $regex ) {
$m = array();
- if ( preg_match( "~{$regex}~", $file, $m ) )
+ if ( preg_match( "~{$regex}~", $file, $m ) ) {
return false;
+ }
}
return true;
}
@@ -328,14 +330,15 @@ class CheckSyntax extends Maintenance {
private function checkForMistakes( $file ) {
foreach ( $this->mNoStyleCheckPaths as $regex ) {
$m = array();
- if ( preg_match( "~{$regex}~", $file, $m ) )
+ if ( preg_match( "~{$regex}~", $file, $m ) ) {
return;
+ }
}
$text = file_get_contents( $file );
$tokens = token_get_all( $text );
- $this->checkEvilToken( $file, $tokens, '@', 'Error supression operator (@)');
+ $this->checkEvilToken( $file, $tokens, '@', 'Error supression operator (@)' );
$this->checkRegex( $file, $text, '/^[\s\r\n]+<\?/', 'leading whitespace' );
$this->checkRegex( $file, $text, '/\?>[\s\r\n]*$/', 'trailing ?>' );
$this->checkRegex( $file, $text, '/^[\xFF\xFE\xEF]/', 'byte-order mark' );
@@ -367,4 +370,4 @@ class CheckSyntax extends Maintenance {
}
$maintClass = "CheckSyntax";
-require_once( RUN_MAINTENANCE_IF_MAIN );
+require_once RUN_MAINTENANCE_IF_MAIN;
diff --git a/maintenance/checkUsernames.php b/maintenance/checkUsernames.php
index dd5e0022..6df189fc 100644
--- a/maintenance/checkUsernames.php
+++ b/maintenance/checkUsernames.php
@@ -21,8 +21,7 @@
* @ingroup Maintenance
*/
-
-require_once( __DIR__ . '/Maintenance.php' );
+require_once __DIR__ . '/Maintenance.php';
/**
* Maintenance script to check that database usernames are actually valid.
@@ -37,25 +36,34 @@ class CheckUsernames extends Maintenance {
public function __construct() {
parent::__construct();
$this->mDescription = "Verify that database usernames are actually valid";
+ $this->setBatchSize( 1000 );
}
function execute() {
$dbr = wfGetDB( DB_SLAVE );
- $res = $dbr->select( 'user',
- array( 'user_id', 'user_name' ),
- null,
- __METHOD__
- );
+ $maxUserId = 0;
+ do {
+ $res = $dbr->select( 'user',
+ array( 'user_id', 'user_name' ),
+ array( 'user_id > ' . $maxUserId ),
+ __METHOD__,
+ array(
+ 'ORDER BY' => 'user_id',
+ 'LIMIT' => $this->mBatchSize,
+ )
+ );
- 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', $row->user_name );
+ 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', $row->user_name );
+ }
}
- }
+ $maxUserId = $row->user_id;
+ } while ( $res->numRows() );
}
}
$maintClass = "CheckUsernames";
-require_once( RUN_MAINTENANCE_IF_MAIN );
+require_once RUN_MAINTENANCE_IF_MAIN;
diff --git a/maintenance/cleanupAncientTables.php b/maintenance/cleanupAncientTables.php
index dbc2e0d3..694efaa6 100644
--- a/maintenance/cleanupAncientTables.php
+++ b/maintenance/cleanupAncientTables.php
@@ -21,7 +21,7 @@
* @ingroup Maintenance
*/
-require_once( __DIR__ . '/Maintenance.php' );
+require_once __DIR__ . '/Maintenance.php';
/**
* Maintenance script to cleans up old database tables, dropping old indexes
@@ -38,7 +38,7 @@ class CleanupAncientTables extends Maintenance {
}
public function execute() {
- if( !$this->hasOption( 'force' ) ) {
+ if ( !$this->hasOption( 'force' ) ) {
$this->error( "This maintenance script will remove old columns and indexes.\n"
. "It is recommended to backup your database first, and ensure all your data has been migrated to newer tables\n"
. "If you want to continue, run this script again with the --force \n"
@@ -61,7 +61,7 @@ class CleanupAncientTables extends Maintenance {
'validate', // 1.6
);
- foreach( $ancientTables as $table ) {
+ foreach ( $ancientTables as $table ) {
if ( $db->tableExists( $table, __METHOD__ ) ) {
$this->output( "Dropping table $table..." );
$db->dropTable( $table, __METHOD__ );
@@ -78,7 +78,7 @@ class CleanupAncientTables extends Maintenance {
'user_timestamp',
'usertext_timestamp',
);
- foreach( $oldIndexes as $index ) {
+ foreach ( $oldIndexes as $index ) {
if ( $db->indexExists( 'text', $index, __METHOD__ ) ) {
$this->output( "Dropping index $index from the text table..." );
$db->query( "DROP INDEX " . $db->addIdentifierQuotes( $index )
@@ -97,7 +97,7 @@ class CleanupAncientTables extends Maintenance {
'old_minor_edit',
'inverse_timestamp',
);
- foreach( $oldFields as $field ) {
+ foreach ( $oldFields as $field ) {
if ( $db->fieldExists( 'text', $field, __METHOD__ ) ) {
$this->output( "Dropping the $field field from the text table..." );
$db->query( "ALTER TABLE " . $db->tableName( 'text' )
@@ -110,4 +110,4 @@ class CleanupAncientTables extends Maintenance {
}
$maintClass = "CleanupAncientTables";
-require_once( RUN_MAINTENANCE_IF_MAIN );
+require_once RUN_MAINTENANCE_IF_MAIN;
diff --git a/maintenance/cleanupCaps.php b/maintenance/cleanupCaps.php
index ec2aa957..1a47ac4e 100644
--- a/maintenance/cleanupCaps.php
+++ b/maintenance/cleanupCaps.php
@@ -29,7 +29,7 @@
* @ingroup Maintenance
*/
-require_once( __DIR__ . '/cleanupTable.inc' );
+require_once __DIR__ . '/cleanupTable.inc';
/**
* Maintenance script to clean up broken page links when somebody turns on $wgCapitalLinks.
@@ -103,4 +103,4 @@ class CapsCleanup extends TableCleanup {
}
$maintClass = "CapsCleanup";
-require_once( RUN_MAINTENANCE_IF_MAIN );
+require_once RUN_MAINTENANCE_IF_MAIN;
diff --git a/maintenance/cleanupImages.php b/maintenance/cleanupImages.php
index 4e7b937d..0e0b6194 100644
--- a/maintenance/cleanupImages.php
+++ b/maintenance/cleanupImages.php
@@ -29,7 +29,7 @@
* @ingroup Maintenance
*/
-require_once( __DIR__ . '/cleanupTable.inc' );
+require_once __DIR__ . '/cleanupTable.inc';
/**
* Maintenance script to clean up broken, unparseable upload filenames.
@@ -213,4 +213,4 @@ class ImageCleanup extends TableCleanup {
}
$maintClass = "ImageCleanup";
-require_once( RUN_MAINTENANCE_IF_MAIN );
+require_once RUN_MAINTENANCE_IF_MAIN;
diff --git a/maintenance/cleanupPreferences.php b/maintenance/cleanupPreferences.php
index c0a526b7..06ae17fb 100644
--- a/maintenance/cleanupPreferences.php
+++ b/maintenance/cleanupPreferences.php
@@ -23,7 +23,7 @@
* @ingroup Maintenance
*/
-require_once( __DIR__ . '/Maintenance.php' );
+require_once __DIR__ . '/Maintenance.php';
/**
* Maintenance script that removes hidden preferences from the database.
@@ -36,7 +36,7 @@ class CleanupPreferences extends Maintenance {
$dbw = wfGetDB( DB_MASTER );
$dbw->begin( __METHOD__ );
- foreach( $wgHiddenPrefs as $item ) {
+ foreach ( $wgHiddenPrefs as $item ) {
$dbw->delete(
'user_properties',
array( 'up_property' => $item ),
@@ -49,4 +49,4 @@ class CleanupPreferences extends Maintenance {
}
$maintClass = 'CleanupPreferences'; // Tells it to run the class
-require_once( RUN_MAINTENANCE_IF_MAIN );
+require_once RUN_MAINTENANCE_IF_MAIN;
diff --git a/maintenance/cleanupRemovedModules.php b/maintenance/cleanupRemovedModules.php
index 2085da94..84eec289 100644
--- a/maintenance/cleanupRemovedModules.php
+++ b/maintenance/cleanupRemovedModules.php
@@ -22,7 +22,7 @@
* @author Roan Kattouw
*/
-require_once( __DIR__ . '/Maintenance.php' );
+require_once __DIR__ . '/Maintenance.php';
/**
* Maintenance script to remove cache entries for removed ResourceLoader modules
@@ -58,7 +58,7 @@ class CleanupRemovedModules extends Maintenance {
$this->output( "Batch $i: $numRows rows\n" );
$i++;
wfWaitForSlaves( $maxlag );
- } while( $numRows > 0 );
+ } while ( $numRows > 0 );
$this->output( "done\n" );
$this->output( "Cleaning up msg_resource table...\n" );
@@ -72,7 +72,7 @@ class CleanupRemovedModules extends Maintenance {
$this->output( "Batch $i: $numRows rows\n" );
$i++;
wfWaitForSlaves( $maxlag );
- } while( $numRows > 0 );
+ } while ( $numRows > 0 );
$this->output( "done\n" );
$this->output( "Cleaning up msg_resource_links table...\n" );
@@ -85,10 +85,10 @@ class CleanupRemovedModules extends Maintenance {
$this->output( "Batch $i: $numRows rows\n" );
$i++;
wfWaitForSlaves( $maxlag );
- } while( $numRows > 0 );
+ } while ( $numRows > 0 );
$this->output( "done\n" );
}
}
$maintClass = "CleanupRemovedModules";
-require_once( RUN_MAINTENANCE_IF_MAIN );
+require_once RUN_MAINTENANCE_IF_MAIN;
diff --git a/maintenance/cleanupSpam.php b/maintenance/cleanupSpam.php
index a41423ae..4b8c9feb 100644
--- a/maintenance/cleanupSpam.php
+++ b/maintenance/cleanupSpam.php
@@ -21,7 +21,7 @@
* @ingroup Maintenance
*/
-require_once( __DIR__ . '/Maintenance.php' );
+require_once __DIR__ . '/Maintenance.php';
/**
* Maintenance script to cleanup all spam from a given hostname.
@@ -141,4 +141,4 @@ class CleanupSpam extends Maintenance {
}
$maintClass = "CleanupSpam";
-require_once( RUN_MAINTENANCE_IF_MAIN );
+require_once RUN_MAINTENANCE_IF_MAIN;
diff --git a/maintenance/cleanupTable.inc b/maintenance/cleanupTable.inc
index 57acfd82..cbd1be6b 100644
--- a/maintenance/cleanupTable.inc
+++ b/maintenance/cleanupTable.inc
@@ -21,7 +21,7 @@
* @ingroup Maintenance
*/
-require_once( __DIR__ . '/Maintenance.php' );
+require_once __DIR__ . '/Maintenance.php';
/**
* Generic class to cleanup a database table. Already subclasses Maintenance.
@@ -41,6 +41,8 @@ class TableCleanup extends Maintenance {
public $batchSize = 100;
public $reportInterval = 100;
+ protected $processed, $updated, $count, $startTime, $table;
+
public function __construct() {
parent::__construct();
$this->addOption( 'dry-run', 'Perform a dry run' );
@@ -66,6 +68,9 @@ class TableCleanup extends Maintenance {
$this->table = $table;
}
+ /**
+ * @param int $updated
+ */
protected function progress( $updated ) {
$this->updated += $updated;
$this->processed++;
@@ -96,12 +101,16 @@ class TableCleanup extends Maintenance {
flush();
}
+ /**
+ * @param array $params
+ * @throws MWException
+ */
public function runTable( $params ) {
$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 ) );
}
@@ -111,7 +120,6 @@ class TableCleanup extends Maintenance {
$this->init( $count, $table );
$this->output( "Processing $table...\n" );
-
$index = (array)$params['index'];
$indexConds = array();
$options = array(
@@ -156,6 +164,10 @@ class TableCleanup extends Maintenance {
$this->output( "Finished $table... $this->updated of $this->processed rows updated\n" );
}
+ /**
+ * @param array $matches
+ * @return string
+ */
protected function hexChar( $matches ) {
return sprintf( "\\x%02x", ord( $matches[1] ) );
}
diff --git a/maintenance/cleanupTitles.php b/maintenance/cleanupTitles.php
index 66f9e87f..5b5ef184 100644
--- a/maintenance/cleanupTitles.php
+++ b/maintenance/cleanupTitles.php
@@ -29,7 +29,7 @@
* @ingroup Maintenance
*/
-require_once( __DIR__ . '/cleanupTable.inc' );
+require_once __DIR__ . '/cleanupTable.inc';
/**
* Maintenance script to clean up broken, unparseable titles.
@@ -42,6 +42,9 @@ class TitleCleanup extends TableCleanup {
$this->mDescription = "Script to clean up broken, unparseable titles";
}
+ /**
+ * @param object $row
+ */
protected function processRow( $row ) {
global $wgContLang;
$display = Title::makeName( $row->page_namespace, $row->page_title );
@@ -51,40 +54,54 @@ class TitleCleanup extends TableCleanup {
if ( !is_null( $title )
&& $title->canExist()
&& $title->getNamespace() == $row->page_namespace
- && $title->getDBkey() === $row->page_title )
- {
- return $this->progress( 0 ); // all is fine
+ && $title->getDBkey() === $row->page_title
+ ) {
+ $this->progress( 0 ); // all is fine
+
+ return;
}
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 );
+ $this->progress( 0 );
} elseif ( is_null( $title ) ) {
$this->output( "page $row->page_id ($display) is illegal.\n" );
$this->moveIllegalPage( $row );
- return $this->progress( 1 );
+ $this->progress( 1 );
} else {
$this->output( "page $row->page_id ($display) doesn't match self.\n" );
$this->moveInconsistentPage( $row, $title );
- return $this->progress( 1 );
+ $this->progress( 1 );
}
}
+ /**
+ * @param string $name
+ * @return bool
+ */
protected function fileExists( $name ) {
// XXX: Doesn't actually check for file existence, just presence of image record.
// This is reasonable, since cleanupImages.php only iterates over the image table.
$dbr = wfGetDB( DB_SLAVE );
$row = $dbr->selectRow( 'image', array( 'img_name' ), array( 'img_name' => $name ), __METHOD__ );
+
return $row !== false;
}
+ /**
+ * @param object $row
+ */
protected function moveIllegalPage( $row ) {
$legal = 'A-Za-z0-9_/\\\\-';
$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 );
@@ -100,9 +117,11 @@ class TitleCleanup extends TableCleanup {
$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" );
+ $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" );
+ $this->output( "renaming $row->page_id ($row->page_namespace," .
+ "'$row->page_title') to ($row->page_namespace,'$dest')\n" );
$dbw = wfGetDB( DB_MASTER );
$dbw->update( 'page',
array( 'page_title' => $dest ),
@@ -111,6 +130,10 @@ class TitleCleanup extends TableCleanup {
}
}
+ /**
+ * @param object $row
+ * @param Title $title
+ */
protected function moveInconsistentPage( $row, $title ) {
if ( $title->exists() || $title->getInterwiki() || !$title->canExist() ) {
if ( $title->getInterwiki() || !$title->canExist() ) {
@@ -121,7 +144,9 @@ class TitleCleanup extends TableCleanup {
# Old cleanupTitles could move articles there. See bug 23147.
$ns = $row->page_namespace;
- if ( $ns < 0 ) $ns = 0;
+ if ( $ns < 0 ) {
+ $ns = 0;
+ }
$clean = 'Broken/' . $prior;
$verified = Title::makeTitleSafe( $ns, $clean );
@@ -139,9 +164,11 @@ class TitleCleanup extends TableCleanup {
$dest = $title->getDBkey();
if ( $this->dryrun ) {
- $this->output( "DRY RUN: would rename $row->page_id ($row->page_namespace,'$row->page_title') to ($ns,'$dest')\n" );
+ $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" );
+ $this->output( "renaming $row->page_id ($row->page_namespace," .
+ "'$row->page_title') to ($ns,'$dest')\n" );
$dbw = wfGetDB( DB_MASTER );
$dbw->update( 'page',
array(
@@ -156,4 +183,4 @@ class TitleCleanup extends TableCleanup {
}
$maintClass = "TitleCleanup";
-require_once( RUN_MAINTENANCE_IF_MAIN );
+require_once RUN_MAINTENANCE_IF_MAIN;
diff --git a/maintenance/cleanupUploadStash.php b/maintenance/cleanupUploadStash.php
index 441e8ae3..c2ba5558 100644
--- a/maintenance/cleanupUploadStash.php
+++ b/maintenance/cleanupUploadStash.php
@@ -25,7 +25,7 @@
* @ingroup Maintenance
*/
-require_once( __DIR__ . '/Maintenance.php' );
+require_once __DIR__ . '/Maintenance.php';
/**
* Maintenance script to remove old or broken uploads from temporary uploaded
@@ -65,7 +65,7 @@ class UploadStashCleanup extends Maintenance {
} else {
// finish the read before starting writes.
$keys = array();
- foreach( $res as $row ) {
+ foreach ( $res as $row ) {
array_push( $keys, $row->us_key );
}
@@ -76,15 +76,15 @@ class UploadStashCleanup extends Maintenance {
$stash = new UploadStash( $repo );
$i = 0;
- foreach( $keys as $key ) {
+ foreach ( $keys as $key ) {
$i++;
try {
$stash->getFile( $key, true );
$stash->removeFileNoAuth( $key );
} catch ( UploadStashBadPathException $ex ) {
- $this->output( "Failed removing stashed upload with key: $key\n" );
+ $this->output( "Failed removing stashed upload with key: $key\n" );
} catch ( UploadStashZeroLengthFileException $ex ) {
- $this->output( "Failed removing stashed upload with key: $key\n" );
+ $this->output( "Failed removing stashed upload with key: $key\n" );
}
if ( $i % 100 == 0 ) {
$this->output( "$i\n" );
@@ -94,7 +94,7 @@ class UploadStashCleanup extends Maintenance {
}
// Delete all the corresponding thumbnails...
- $dir = $tempRepo->getZonePath( 'thumb' );
+ $dir = $tempRepo->getZonePath( 'thumb' );
$iterator = $tempRepo->getBackend()->getFileList( array( 'dir' => $dir ) );
$this->output( "Deleting old thumbnails...\n" );
$i = 0;
@@ -112,8 +112,8 @@ class UploadStashCleanup extends Maintenance {
$this->output( "$i done\n" );
// Apparently lots of stash files are not registered in the DB...
- $dir = $tempRepo->getZonePath( 'public' );
- $iterator = $tempRepo->getBackend()->getFileList( array( 'dir' => $dir ) );
+ $dir = $tempRepo->getZonePath( 'public' );
+ $iterator = $tempRepo->getBackend()->getFileList( array( 'dir' => $dir, 'adviseStat' => 1 ) );
$this->output( "Deleting orphaned temp files...\n" );
if ( strpos( $dir, '/local-temp' ) === false ) { // sanity check
$this->error( "Temp repo is not using the temp container.", 1 ); // die
@@ -140,4 +140,4 @@ class UploadStashCleanup extends Maintenance {
}
$maintClass = "UploadStashCleanup";
-require_once( RUN_MAINTENANCE_IF_MAIN );
+require_once RUN_MAINTENANCE_IF_MAIN;
diff --git a/maintenance/cleanupWatchlist.php b/maintenance/cleanupWatchlist.php
index fbab6a3c..f1a7b481 100644
--- a/maintenance/cleanupWatchlist.php
+++ b/maintenance/cleanupWatchlist.php
@@ -29,7 +29,7 @@
* @ingroup Maintenance
*/
-require_once( __DIR__ . '/cleanupTable.inc' );
+require_once __DIR__ . '/cleanupTable.inc';
/**
* Maintenance script to remove broken, unparseable titles in the watchlist table.
@@ -77,9 +77,9 @@ class WatchlistCleanup extends TableCleanup {
if ( !$this->dryrun && $this->hasOption( 'fix' ) ) {
$dbw = wfGetDB( DB_MASTER );
$dbw->delete( 'watchlist', array(
- 'wl_user' => $row->wl_user,
+ 'wl_user' => $row->wl_user,
'wl_namespace' => $row->wl_namespace,
- 'wl_title' => $row->wl_title ),
+ 'wl_title' => $row->wl_title ),
__METHOD__ );
$this->output( "- removed\n" );
return 1;
@@ -90,4 +90,4 @@ class WatchlistCleanup extends TableCleanup {
}
$maintClass = "WatchlistCleanup";
-require_once( RUN_MAINTENANCE_IF_MAIN );
+require_once RUN_MAINTENANCE_IF_MAIN;
diff --git a/maintenance/clearCacheStats.php b/maintenance/clearCacheStats.php
index 7a0d664a..6a966121 100644
--- a/maintenance/clearCacheStats.php
+++ b/maintenance/clearCacheStats.php
@@ -21,7 +21,7 @@
* @ingroup Maintenance
*/
-require_once( __DIR__ . '/Maintenance.php' );
+require_once __DIR__ . '/Maintenance.php';
/**
* Maintenance script to remove all statistics tracking from the cache.
@@ -57,4 +57,4 @@ class ClearCacheStats extends Maintenance {
}
$maintClass = "ClearCacheStats";
-require_once( RUN_MAINTENANCE_IF_MAIN );
+require_once RUN_MAINTENANCE_IF_MAIN;
diff --git a/maintenance/clearInterwikiCache.php b/maintenance/clearInterwikiCache.php
index 88769df2..80c9004e 100644
--- a/maintenance/clearInterwikiCache.php
+++ b/maintenance/clearInterwikiCache.php
@@ -21,7 +21,7 @@
* @ingroup Maintenance
*/
-require_once( __DIR__ . '/Maintenance.php' );
+require_once __DIR__ . '/Maintenance.php';
/**
* Maintenance script to clear the cache of interwiki prefixes for all local wikis.
@@ -55,4 +55,4 @@ class ClearInterwikiCache extends Maintenance {
}
$maintClass = "ClearInterwikiCache";
-require_once( RUN_MAINTENANCE_IF_MAIN );
+require_once RUN_MAINTENANCE_IF_MAIN;
diff --git a/maintenance/commandLine.inc b/maintenance/commandLine.inc
index 86a558d0..be071422 100644
--- a/maintenance/commandLine.inc
+++ b/maintenance/commandLine.inc
@@ -21,7 +21,7 @@
* @ingroup Maintenance
*/
-require_once( __DIR__ . '/Maintenance.php' );
+require_once __DIR__ . '/Maintenance.php';
global $optionsWithArgs;
if ( !isset( $optionsWithArgs ) ) {
@@ -55,5 +55,5 @@ class CommandLineInc extends Maintenance {
}
$maintClass = 'CommandLineInc';
-require( RUN_MAINTENANCE_IF_MAIN );
+require RUN_MAINTENANCE_IF_MAIN;
diff --git a/maintenance/compareParsers.php b/maintenance/compareParsers.php
index 1f3ac1c3..fabc2571 100644
--- a/maintenance/compareParsers.php
+++ b/maintenance/compareParsers.php
@@ -28,7 +28,7 @@
* @ingroup Maintenance
*/
-require_once( __DIR__ . '/dumpIterator.php' );
+require_once __DIR__ . '/dumpIterator.php';
/**
* Maintenance script to take page text out of an XML dump file and render
@@ -55,8 +55,8 @@ class CompareParsers extends DumpIterator {
}
public function checkOptions() {
- if ( $this->hasOption('save-failed') ) {
- $this->saveFailed = $this->getOption('save-failed');
+ if ( $this->hasOption( 'save-failed' ) ) {
+ $this->saveFailed = $this->getOption( 'save-failed' );
}
$this->stripParametersEnabled = $this->hasOption( 'strip-parameters' );
@@ -87,8 +87,9 @@ class CompareParsers extends DumpIterator {
public function conclusions() {
$this->error( "{$this->failed} failed revisions out of {$this->count}" );
- if ($this->count > 0)
+ if ( $this->count > 0 ) {
$this->output( " (" . ( $this->failed / $this->count ) . "%)\n" );
+ }
}
function stripParameters( $text ) {
@@ -155,4 +156,4 @@ class CompareParsers extends DumpIterator {
}
$maintClass = "CompareParsers";
-require_once( RUN_MAINTENANCE_IF_MAIN );
+require_once RUN_MAINTENANCE_IF_MAIN;
diff --git a/maintenance/convertLinks.php b/maintenance/convertLinks.php
index 5f7b02e4..17b91110 100644
--- a/maintenance/convertLinks.php
+++ b/maintenance/convertLinks.php
@@ -21,7 +21,7 @@
* @ingroup Maintenance
*/
-require_once( __DIR__ . '/Maintenance.php' );
+require_once __DIR__ . '/Maintenance.php';
/**
* Maintenance script to convert from the old links schema (string->ID)
@@ -80,9 +80,9 @@ This gives a huge speed improvement for very large links tables which are MyISAM
# --------------------------------------------------------------------
- list ( $cur, $links, $links_temp, $links_backup ) = $dbw->tableNamesN( 'cur', 'links', 'links_temp', 'links_backup' );
+ list( $cur, $links, $links_temp, $links_backup ) = $dbw->tableNamesN( 'cur', 'links', 'links_temp', 'links_backup' );
- if( $dbw->tableExists( 'pagelinks' ) ) {
+ if ( $dbw->tableExists( 'pagelinks' ) ) {
$this->output( "...have pagelinks; skipping old links table updates\n" );
return;
}
@@ -177,15 +177,16 @@ This gives a huge speed improvement for very large links tables which are MyISAM
}
$dbw->freeResult( $res );
# $this->output( "rowOffset: $rowOffset\ttuplesAdded: $tuplesAdded\tnumBadLinks: $numBadLinks\n" );
- if ( $tuplesAdded != 0 ) {
+ if ( $tuplesAdded != 0 ) {
if ( $reportLinksConvProgress ) {
$this->output( "Inserting $tuplesAdded tuples into $links_temp..." );
}
$dbw->query( implode( "", $sqlWrite ) );
$totalTuplesInserted += $tuplesAdded;
- if ( $reportLinksConvProgress )
+ if ( $reportLinksConvProgress ) {
$this->output( " done. Total $totalTuplesInserted tuples inserted.\n" );
- $this->performanceLog( $fh, $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" );
@@ -258,4 +259,4 @@ This gives a huge speed improvement for very large links tables which are MyISAM
}
$maintClass = "ConvertLinks";
-require_once( RUN_MAINTENANCE_IF_MAIN );
+require_once RUN_MAINTENANCE_IF_MAIN;
diff --git a/maintenance/convertUserOptions.php b/maintenance/convertUserOptions.php
index e2223e1a..34c643bb 100644
--- a/maintenance/convertUserOptions.php
+++ b/maintenance/convertUserOptions.php
@@ -21,7 +21,7 @@
* @ingroup Maintenance
*/
-require_once( __DIR__ . '/Maintenance.php' );
+require_once __DIR__ . '/Maintenance.php';
/**
* Maintenance script to convert user options to the new `user_properties` table.
@@ -96,4 +96,4 @@ class ConvertUserOptions extends Maintenance {
}
$maintClass = "ConvertUserOptions";
-require_once( RUN_MAINTENANCE_IF_MAIN );
+require_once RUN_MAINTENANCE_IF_MAIN;
diff --git a/maintenance/copyFileBackend.php b/maintenance/copyFileBackend.php
index f2c4ac54..21ef4ffa 100644
--- a/maintenance/copyFileBackend.php
+++ b/maintenance/copyFileBackend.php
@@ -21,7 +21,7 @@
* @ingroup Maintenance
*/
-require_once( __DIR__ . '/Maintenance.php' );
+require_once __DIR__ . '/Maintenance.php';
/**
* Copy all files in one container of one backend to another.
@@ -35,6 +35,8 @@ require_once( __DIR__ . '/Maintenance.php' );
* @ingroup Maintenance
*/
class CopyFileBackend extends Maintenance {
+ protected $statCache = array();
+
public function __construct() {
parent::__construct();
$this->mDescription = "Copy files in one backend to another.";
@@ -43,8 +45,10 @@ class CopyFileBackend extends Maintenance {
$this->addOption( 'containers', 'Pipe separated list of containers', true, true );
$this->addOption( 'subdir', 'Only do items in this child directory', false, true );
$this->addOption( 'ratefile', 'File to check periodically for batch size', false, true );
+ $this->addOption( 'prestat', 'Stat the destination files first (try to use listings)' );
$this->addOption( 'skiphash', 'Skip SHA-1 sync checks for files' );
$this->addOption( 'missingonly', 'Only copy files missing from destination listing' );
+ $this->addOption( 'syncviadelete', 'Delete destination files missing from source listing' );
$this->addOption( 'utf8only', 'Skip source files that do not have valid UTF-8 names' );
$this->setBatchSize( 50 );
}
@@ -53,7 +57,7 @@ class CopyFileBackend extends Maintenance {
$src = FileBackendGroup::singleton()->get( $this->getOption( 'src' ) );
$dst = FileBackendGroup::singleton()->get( $this->getOption( 'dst' ) );
$containers = explode( '|', $this->getOption( 'containers' ) );
- $subDir = $this->getOption( rtrim( 'subdir', '/' ), '' );
+ $subDir = rtrim( $this->getOption( 'subdir', '' ), '/' );
$rateFile = $this->getOption( 'ratefile' );
@@ -61,7 +65,6 @@ class CopyFileBackend extends Maintenance {
$this->error( "Cannot check for UTF-8, mbstring extension missing.", 1 ); // die
}
- $count = 0;
foreach ( $containers as $container ) {
if ( $subDir != '' ) {
$backendRel = "$container/$subDir";
@@ -71,40 +74,46 @@ class CopyFileBackend extends Maintenance {
$this->output( "Doing container '$container'...\n" );
}
- $srcPathsRel = $src->getFileList( array(
- 'dir' => $src->getRootStoragePath() . "/$backendRel" ) );
- if ( $srcPathsRel === null ) {
- $this->error( "Could not list files in $container.", 1 ); // die
- }
-
- // Do a listing comparison if specified
if ( $this->hasOption( 'missingonly' ) ) {
- $relFilesSrc = array();
- $relFilesDst = array();
- foreach ( $srcPathsRel as $srcPathRel ) {
- $relFilesSrc[] = $srcPathRel;
+ $this->output( "\tBuilding list of missing files..." );
+ $srcPathsRel = $this->getListingDiffRel( $src, $dst, $backendRel );
+ $this->output( count( $srcPathsRel ) . " file(s) need to be copied.\n" );
+ } else {
+ $srcPathsRel = $src->getFileList( array(
+ 'dir' => $src->getRootStoragePath() . "/$backendRel",
+ 'adviseStat' => true // avoid HEADs
+ ) );
+ if ( $srcPathsRel === null ) {
+ $this->error( "Could not list files in $container.", 1 ); // die
}
+ }
+
+ if ( $this->getOption( 'prestat' ) && !$this->hasOption( 'missingonly' ) ) {
+ // Build the stat cache for the destination files
+ $this->output( "\tBuilding destination stat cache..." );
$dstPathsRel = $dst->getFileList( array(
- 'dir' => $dst->getRootStoragePath() . "/$backendRel" ) );
+ 'dir' => $dst->getRootStoragePath() . "/$backendRel",
+ 'adviseStat' => true // avoid HEADs
+ ) );
if ( $dstPathsRel === null ) {
$this->error( "Could not list files in $container.", 1 ); // die
}
+ $this->statCache = array(); // clear
foreach ( $dstPathsRel as $dstPathRel ) {
- $relFilesDst[] = $dstPathRel;
+ $path = $dst->getRootStoragePath() . "/$backendRel/$dstPathRel";
+ $this->statCache[sha1( $path )] = $dst->getFileStat( array( 'src' => $path ) );
}
- // Only copy the missing files over in the next loop
- $srcPathsRel = array_diff( $relFilesSrc, $relFilesDst );
- $this->output( count( $srcPathsRel ) . " file(s) need to be copied.\n" );
- unset( $relFilesSrc );
- unset( $relFilesDst );
+ $this->output( "done [" . count( $this->statCache ) . " file(s)]\n" );
}
+ $this->output( "\tCopying file(s)...\n" );
+ $count = 0;
$batchPaths = array();
foreach ( $srcPathsRel as $srcPathRel ) {
// Check up on the rate file periodically to adjust the concurrency
if ( $rateFile && ( !$count || ( $count % 500 ) == 0 ) ) {
$this->mBatchSize = max( 1, (int)file_get_contents( $rateFile ) );
- $this->output( "Batch size is now {$this->mBatchSize}.\n" );
+ $this->output( "\tBatch size is now {$this->mBatchSize}.\n" );
}
$batchPaths[$srcPathRel] = 1; // remove duplicates
if ( count( $batchPaths ) >= $this->mBatchSize ) {
@@ -117,6 +126,36 @@ class CopyFileBackend extends Maintenance {
$this->copyFileBatch( array_keys( $batchPaths ), $backendRel, $src, $dst );
$batchPaths = array(); // done
}
+ $this->output( "\tCopied $count file(s).\n" );
+
+ if ( $this->hasOption( 'syncviadelete' ) ) {
+ $this->output( "\tBuilding list of excess destination files..." );
+ $delPathsRel = $this->getListingDiffRel( $dst, $src, $backendRel );
+ $this->output( count( $delPathsRel ) . " file(s) need to be deleted.\n" );
+
+ $this->output( "\tDeleting file(s)...\n" );
+ $count = 0;
+ $batchPaths = array();
+ foreach ( $delPathsRel as $delPathRel ) {
+ // Check up on the rate file periodically to adjust the concurrency
+ if ( $rateFile && ( !$count || ( $count % 500 ) == 0 ) ) {
+ $this->mBatchSize = max( 1, (int)file_get_contents( $rateFile ) );
+ $this->output( "\tBatch size is now {$this->mBatchSize}.\n" );
+ }
+ $batchPaths[$delPathRel] = 1; // remove duplicates
+ if ( count( $batchPaths ) >= $this->mBatchSize ) {
+ $this->delFileBatch( array_keys( $batchPaths ), $backendRel, $dst );
+ $batchPaths = array(); // done
+ }
+ ++$count;
+ }
+ if ( count( $batchPaths ) ) { // left-overs
+ $this->delFileBatch( array_keys( $batchPaths ), $backendRel, $dst );
+ $batchPaths = array(); // done
+ }
+
+ $this->output( "\tDeleted $count file(s).\n" );
+ }
if ( $subDir != '' ) {
$this->output( "Finished container '$container', directory '$subDir'.\n" );
@@ -125,15 +164,58 @@ class CopyFileBackend extends Maintenance {
}
}
- $this->output( "Done [$count file(s)].\n" );
+ $this->output( "Done.\n" );
}
+ /**
+ * @param FileBackend $src
+ * @param FileBackend $dst
+ * @param string $backendRel
+ * @return array (rel paths in $src minus those in $dst)
+ */
+ protected function getListingDiffRel( FileBackend $src, FileBackend $dst, $backendRel ) {
+ $srcPathsRel = $src->getFileList( array(
+ 'dir' => $src->getRootStoragePath() . "/$backendRel" ) );
+ if ( $srcPathsRel === null ) {
+ $this->error( "Could not list files in source container.", 1 ); // die
+ }
+ $dstPathsRel = $dst->getFileList( array(
+ 'dir' => $dst->getRootStoragePath() . "/$backendRel" ) );
+ if ( $dstPathsRel === null ) {
+ $this->error( "Could not list files in destination container.", 1 ); // die
+ }
+ // Get the list of destination files
+ $relFilesDstSha1 = array();
+ foreach ( $dstPathsRel as $dstPathRel ) {
+ $relFilesDstSha1[sha1( $dstPathRel )] = 1;
+ }
+ unset( $dstPathsRel ); // free
+ // Get the list of missing files
+ $missingPathsRel = array();
+ foreach ( $srcPathsRel as $srcPathRel ) {
+ if ( !isset( $relFilesDstSha1[sha1( $srcPathRel )] ) ) {
+ $missingPathsRel[] = $srcPathRel;
+ }
+ }
+ unset( $srcPathsRel ); // free
+
+ return $missingPathsRel;
+ }
+
+ /**
+ * @param array $srcPathsRel
+ * @param string $backendRel
+ * @param FileBackend $src
+ * @param FileBackend $dst
+ * @return void
+ */
protected function copyFileBatch(
array $srcPathsRel, $backendRel, FileBackend $src, FileBackend $dst
) {
$ops = array();
$fsFiles = array();
$copiedRel = array(); // for output message
+ $wikiId = $src->getWikiId();
// Download the batch of source files into backend cache...
if ( $this->hasOption( 'missingonly' ) ) {
@@ -144,8 +226,8 @@ class CopyFileBackend extends Maintenance {
$t_start = microtime( true );
$fsFiles = $src->getLocalReferenceMulti( array( 'srcs' => $srcPaths, 'latest' => 1 ) );
$ellapsed_ms = floor( ( microtime( true ) - $t_start ) * 1000 );
- $this->output( "\nDownloaded these file(s) [{$ellapsed_ms}ms]:\n" .
- implode( "\n", $srcPaths ) . "\n\n" );
+ $this->output( "\n\tDownloaded these file(s) [{$ellapsed_ms}ms]:\n\t" .
+ implode( "\n\t", $srcPaths ) . "\n\n" );
}
// Determine what files need to be copied over...
@@ -153,22 +235,30 @@ class CopyFileBackend extends Maintenance {
$srcPath = $src->getRootStoragePath() . "/$backendRel/$srcPathRel";
$dstPath = $dst->getRootStoragePath() . "/$backendRel/$srcPathRel";
if ( $this->hasOption( 'utf8only' ) && !mb_check_encoding( $srcPath, 'UTF-8' ) ) {
- $this->error( "Detected illegal (non-UTF8) path for $srcPath." );
+ $this->error( "$wikiId: Detected illegal (non-UTF8) path for $srcPath." );
continue;
- } elseif ( $this->filesAreSame( $src, $dst, $srcPath, $dstPath ) ) {
- $this->output( "Already have $srcPathRel.\n" );
+ } elseif ( !$this->hasOption( 'missingonly' )
+ && $this->filesAreSame( $src, $dst, $srcPath, $dstPath ) )
+ {
+ $this->output( "\tAlready have $srcPathRel.\n" );
continue; // assume already copied...
}
$fsFile = array_key_exists( $srcPath, $fsFiles )
? $fsFiles[$srcPath]
: $src->getLocalReference( array( 'src' => $srcPath, 'latest' => 1 ) );
if ( !$fsFile ) {
- $this->error( "Could not get local copy of $srcPath.", 1 ); // die
+ $src->clearCache( array( $srcPath ) );
+ if ( $src->fileExists( array( 'src' => $srcPath, 'latest' => 1 ) ) === false ) {
+ $this->error( "$wikiId: File '$srcPath' was listed but does not exist." );
+ } else {
+ $this->error( "$wikiId: Could not get local copy of $srcPath." );
+ }
+ continue;
} elseif ( !$fsFile->exists() ) {
// FSFileBackends just return the path for getLocalReference() and paths with
// illegal slashes may get normalized to a different path. This can cause the
// local reference to not exist...skip these broken files.
- $this->error( "Detected possible illegal path for $srcPath." );
+ $this->error( "$wikiId: Detected possible illegal path for $srcPath." );
continue;
}
$fsFiles[] = $fsFile; // keep TempFSFile objects alive as needed
@@ -176,7 +266,7 @@ class CopyFileBackend extends Maintenance {
$status = $dst->prepare( array( 'dir' => dirname( $dstPath ), 'bypassReadOnly' => 1 ) );
if ( !$status->isOK() ) {
$this->error( print_r( $status->getErrorsArray(), true ) );
- $this->error( "Could not copy $srcPath to $dstPath.", 1 ); // die
+ $this->error( "$wikiId: Could not copy $srcPath to $dstPath.", 1 ); // die
}
$ops[] = array( 'op' => 'store',
'src' => $fsFile->getPath(), 'dst' => $dstPath, 'overwrite' => 1 );
@@ -193,26 +283,75 @@ class CopyFileBackend extends Maintenance {
$ellapsed_ms = floor( ( microtime( true ) - $t_start ) * 1000 );
if ( !$status->isOK() ) {
$this->error( print_r( $status->getErrorsArray(), true ) );
- $this->error( "Could not copy file batch.", 1 ); // die
+ $this->error( "$wikiId: Could not copy file batch.", 1 ); // die
} elseif ( count( $copiedRel ) ) {
- $this->output( "\nCopied these file(s) [{$ellapsed_ms}ms]:\n" .
- implode( "\n", $copiedRel ) . "\n\n" );
+ $this->output( "\n\tCopied these file(s) [{$ellapsed_ms}ms]:\n\t" .
+ implode( "\n\t", $copiedRel ) . "\n\n" );
+ }
+ }
+
+ /**
+ * @param array $dstPathsRel
+ * @param string $backendRel
+ * @param FileBackend $dst
+ * @return void
+ */
+ protected function delFileBatch(
+ array $dstPathsRel, $backendRel, FileBackend $dst
+ ) {
+ $ops = array();
+ $deletedRel = array(); // for output message
+ $wikiId = $dst->getWikiId();
+
+ // Determine what files need to be copied over...
+ foreach ( $dstPathsRel as $dstPathRel ) {
+ $dstPath = $dst->getRootStoragePath() . "/$backendRel/$dstPathRel";
+ $ops[] = array( 'op' => 'delete', 'src' => $dstPath );
+ $deletedRel[] = $dstPathRel;
+ }
+
+ // Delete the batch of source files...
+ $t_start = microtime( true );
+ $status = $dst->doQuickOperations( $ops, array( 'bypassReadOnly' => 1 ) );
+ if ( !$status->isOK() ) {
+ sleep( 10 ); // wait and retry copy again
+ $status = $dst->doQuickOperations( $ops, array( 'bypassReadOnly' => 1 ) );
+ }
+ $ellapsed_ms = floor( ( microtime( true ) - $t_start ) * 1000 );
+ if ( !$status->isOK() ) {
+ $this->error( print_r( $status->getErrorsArray(), true ) );
+ $this->error( "$wikiId: Could not delete file batch.", 1 ); // die
+ } elseif ( count( $deletedRel ) ) {
+ $this->output( "\n\tDeleted these file(s) [{$ellapsed_ms}ms]:\n\t" .
+ implode( "\n\t", $deletedRel ) . "\n\n" );
}
}
+ /**
+ * @param FileBackend $src
+ * @param FileBackend $dst
+ * @param string $sPath
+ * @param string $dPath
+ * @return bool
+ */
protected function filesAreSame( FileBackend $src, FileBackend $dst, $sPath, $dPath ) {
$skipHash = $this->hasOption( 'skiphash' );
+ $srcStat = $src->getFileStat( array( 'src' => $sPath ) );
+ $dPathSha1 = sha1( $dPath );
+ $dstStat = isset( $this->statCache[$dPathSha1] )
+ ? $this->statCache[$dPathSha1]
+ : $dst->getFileStat( array( 'src' => $dPath ) );
return (
- ( $src->fileExists( array( 'src' => $sPath, 'latest' => 1 ) )
- === $dst->fileExists( array( 'src' => $dPath, 'latest' => 1 ) ) // short-circuit
- ) && ( $src->getFileSize( array( 'src' => $sPath, 'latest' => 1 ) )
- === $dst->getFileSize( array( 'src' => $dPath, 'latest' => 1 ) ) // short-circuit
- ) && ( $skipHash || ( $src->getFileSha1Base36( array( 'src' => $sPath, 'latest' => 1 ) )
+ is_array( $srcStat ) // sanity check that source exists
+ && is_array( $dstStat ) // dest exists
+ && $srcStat['size'] === $dstStat['size']
+ && ( !$skipHash || $srcStat['mtime'] <= $dstStat['mtime'] )
+ && ( $skipHash || $src->getFileSha1Base36( array( 'src' => $sPath, 'latest' => 1 ) )
=== $dst->getFileSha1Base36( array( 'src' => $dPath, 'latest' => 1 ) )
- ) )
+ )
);
}
}
$maintClass = 'CopyFileBackend';
-require_once( RUN_MAINTENANCE_IF_MAIN );
+require_once RUN_MAINTENANCE_IF_MAIN;
diff --git a/maintenance/copyJobQueue.php b/maintenance/copyJobQueue.php
new file mode 100644
index 00000000..e833115b
--- /dev/null
+++ b/maintenance/copyJobQueue.php
@@ -0,0 +1,99 @@
+<?php
+/**
+ * Copy all jobs from one job queue system to another.
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with this program; if not, write 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 __DIR__ . '/Maintenance.php';
+
+/**
+ * Copy all jobs from one job queue system to another.
+ * This uses an ad-hoc $wgJobQueueMigrationConfig setting,
+ * which is a map of queue system names to JobQueue::factory() parameters.
+ * The parameters should not have wiki or type settings and thus partial.
+ *
+ * @ingroup Maintenance
+ */
+class CopyJobQueue extends Maintenance {
+ public function __construct() {
+ parent::__construct();
+ $this->mDescription = "Copy jobs from one queue system to another.";
+ $this->addOption( 'src', 'Key to $wgJobQueueMigrationConfig for source', true, true );
+ $this->addOption( 'dst', 'Key to $wgJobQueueMigrationConfig for destination', true, true );
+ $this->addOption( 'type', 'Types of jobs to copy (use "all" for all)', true, true );
+ $this->setBatchSize( 500 );
+ }
+
+ public function execute() {
+ global $wgJobQueueMigrationConfig;
+
+ $srcKey = $this->getOption( 'src' );
+ $dstKey = $this->getOption( 'dst' );
+
+ if ( !isset( $wgJobQueueMigrationConfig[$srcKey] ) ) {
+ $this->error( "\$wgJobQueueMigrationConfig not set for '$srcKey'.", 1 );
+ } elseif ( !isset( $wgJobQueueMigrationConfig[$dstKey] ) ) {
+ $this->error( "\$wgJobQueueMigrationConfig not set for '$dstKey'.", 1 );
+ }
+
+ $types = ( $this->getOption( 'type' ) === 'all' )
+ ? JobQueueGroup::singleton()->getQueueTypes()
+ : array( $this->getOption( 'type' ) );
+
+ foreach ( $types as $type ) {
+ $baseConfig = array( 'type' => $type, 'wiki' => wfWikiID() );
+ $src = JobQueue::factory( $baseConfig + $wgJobQueueMigrationConfig[$srcKey] );
+ $dst = JobQueue::factory( $baseConfig + $wgJobQueueMigrationConfig[$dstKey] );
+
+ list( $total, $totalOK ) = $this->copyJobs( $src, $dst, $src->getAllQueuedJobs() );
+ $this->output( "Copied $totalOK/$total queued $type jobs.\n" );
+
+ list( $total, $totalOK ) = $this->copyJobs( $src, $dst, $src->getAllDelayedJobs() );
+ $this->output( "Copied $totalOK/$total delayed $type jobs.\n" );
+ }
+ }
+
+ protected function copyJobs( JobQueue $src, JobQueue $dst, $jobs ) {
+ $total = 0;
+ $totalOK = 0;
+ $batch = array();
+ foreach ( $jobs as $job ) {
+ ++$total;
+ $batch[] = $job;
+ if ( count( $batch ) >= $this->mBatchSize ) {
+ if ( $dst->push( $batch ) ) {
+ $totalOK += count( $batch );
+ }
+ $batch = array();
+ $dst->waitForBackups();
+ }
+ }
+ if ( count( $batch ) ) {
+ if ( $dst->push( $batch ) ) {
+ $totalOK += count( $batch );
+ }
+ $dst->waitForBackups();
+ }
+ return array( $total, $totalOK );
+ }
+}
+
+$maintClass = 'CopyJobQueue';
+require_once RUN_MAINTENANCE_IF_MAIN;
diff --git a/maintenance/createAndPromote.php b/maintenance/createAndPromote.php
index 81fbbb3d..aa25ee60 100644
--- a/maintenance/createAndPromote.php
+++ b/maintenance/createAndPromote.php
@@ -1,6 +1,6 @@
<?php
/**
- * Creates an account and grant it administrator rights.
+ * Creates an account and grants it rights.
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
@@ -23,26 +23,26 @@
* @author Pablo Castellano <pablo@anche.no>
*/
-require_once( __DIR__ . '/Maintenance.php' );
+require_once __DIR__ . '/Maintenance.php';
/**
- * Maintenance script to create an account and grant it administrator rights.
+ * Maintenance script to create an account and grant it rights.
*
* @ingroup Maintenance
*/
class CreateAndPromote extends Maintenance {
- static $permitRoles = array( 'sysop', 'bureaucrat' );
+ static $permitRoles = array( 'sysop', 'bureaucrat', 'bot' );
public function __construct() {
parent::__construct();
$this->mDescription = "Create a new user account and/or grant it additional rights";
$this->addOption( "force", "If acccount exists already, just grant it rights or change password." );
- foreach( self::$permitRoles as $role ) {
+ foreach ( self::$permitRoles as $role ) {
$this->addOption( $role, "Add the account to the {$role} group" );
}
$this->addArg( "username", "Username of new user" );
- $this->addArg( "password", "Password to set (not required if --force is used)", false);
+ $this->addArg( "password", "Password to set (not required if --force is used)", false );
}
public function execute() {
@@ -60,10 +60,10 @@ class CreateAndPromote extends Maintenance {
if ( $exists && !$force ) {
$this->error( "Account exists. Perhaps you want the --force option?", true );
- } else if ( !$exists && !$password ) {
+ } elseif ( !$exists && !$password ) {
$this->error( "Argument <password> required!", false );
$this->maybeHelp( true );
- } else if ( $exists ) {
+ } elseif ( $exists ) {
$inGroups = $user->getGroups();
}
@@ -72,7 +72,7 @@ class CreateAndPromote extends Maintenance {
if ( $exists && !$password && count( $promotions ) === 0 ) {
$this->output( "Account exists and nothing to do.\n" );
return;
- } else if ( count( $promotions ) !== 0 ) {
+ } elseif ( count( $promotions ) !== 0 ) {
$promoText = "User:{$username} into " . implode( ', ', $promotions ) . "...\n";
if ( $exists ) {
$this->output( wfWikiID() . ": Promoting $promoText" );
@@ -114,4 +114,4 @@ class CreateAndPromote extends Maintenance {
}
$maintClass = "CreateAndPromote";
-require_once( RUN_MAINTENANCE_IF_MAIN );
+require_once RUN_MAINTENANCE_IF_MAIN;
diff --git a/maintenance/deleteArchivedFiles.inc b/maintenance/deleteArchivedFiles.inc
index 792ee6c6..d58e9a40 100644
--- a/maintenance/deleteArchivedFiles.inc
+++ b/maintenance/deleteArchivedFiles.inc
@@ -42,7 +42,7 @@ class DeleteArchivedFilesImplementation {
$group = $row->fa_storage_group;
$id = $row->fa_id;
$path = $repo->getZonePath( 'deleted' ) . '/' . $repo->getDeletedHashPath( $key ) . $key;
- if( isset( $row->fa_sha1 ) ) {
+ if ( isset( $row->fa_sha1 ) ) {
$sha1 = $row->fa_sha1;
} else {
// old row, populate from key
diff --git a/maintenance/deleteArchivedFiles.php b/maintenance/deleteArchivedFiles.php
index 85ffc23b..ad7b54d0 100644
--- a/maintenance/deleteArchivedFiles.php
+++ b/maintenance/deleteArchivedFiles.php
@@ -24,8 +24,8 @@
* @author Aaron Schulz
*/
-require_once( __DIR__ . '/Maintenance.php' );
-require_once( __DIR__ . '/deleteArchivedFiles.inc' );
+require_once __DIR__ . '/Maintenance.php';
+require_once __DIR__ . '/deleteArchivedFiles.inc';
/**
* Maintenance script to delete archived (non-current) files from the database.
@@ -55,4 +55,4 @@ class DeleteArchivedFiles extends Maintenance {
}
$maintClass = "DeleteArchivedFiles";
-require_once( RUN_MAINTENANCE_IF_MAIN );
+require_once RUN_MAINTENANCE_IF_MAIN;
diff --git a/maintenance/deleteArchivedRevisions.php b/maintenance/deleteArchivedRevisions.php
index 4b658bbb..ffd581c1 100644
--- a/maintenance/deleteArchivedRevisions.php
+++ b/maintenance/deleteArchivedRevisions.php
@@ -24,8 +24,8 @@
* @author Aaron Schulz
*/
-require_once( __DIR__ . '/Maintenance.php' );
-require_once( __DIR__ . '/deleteArchivedRevisions.inc' );
+require_once __DIR__ . '/Maintenance.php';
+require_once __DIR__ . '/deleteArchivedRevisions.inc';
/**
* Maintenance script to delete archived (deleted from public) revisions
@@ -59,4 +59,4 @@ class DeleteArchivedRevisions extends Maintenance {
}
$maintClass = "DeleteArchivedRevisions";
-require_once( RUN_MAINTENANCE_IF_MAIN );
+require_once RUN_MAINTENANCE_IF_MAIN;
diff --git a/maintenance/deleteBatch.php b/maintenance/deleteBatch.php
index 936a52b8..c1cc03cd 100644
--- a/maintenance/deleteBatch.php
+++ b/maintenance/deleteBatch.php
@@ -28,7 +28,7 @@
* @ingroup Maintenance
*/
-require_once( __DIR__ . '/Maintenance.php' );
+require_once __DIR__ . '/Maintenance.php';
/**
* Maintenance script to delete a batch of pages.
@@ -121,4 +121,4 @@ class DeleteBatch extends Maintenance {
}
$maintClass = "DeleteBatch";
-require_once( RUN_MAINTENANCE_IF_MAIN );
+require_once RUN_MAINTENANCE_IF_MAIN;
diff --git a/maintenance/deleteDefaultMessages.php b/maintenance/deleteDefaultMessages.php
index 4ab6d1d9..7d8c80e4 100644
--- a/maintenance/deleteDefaultMessages.php
+++ b/maintenance/deleteDefaultMessages.php
@@ -22,7 +22,7 @@
* @ingroup Maintenance
*/
-require_once( __DIR__ . '/Maintenance.php' );
+require_once __DIR__ . '/Maintenance.php';
/**
* Maintenance script that deletes all pages in the MediaWiki namespace
@@ -51,7 +51,7 @@ class DeleteDefaultMessages extends Maintenance {
)
);
- if( $dbr->numRows( $res ) == 0 ) {
+ if ( $dbr->numRows( $res ) == 0 ) {
# No more messages left
$this->output( "done.\n" );
return;
@@ -86,4 +86,4 @@ class DeleteDefaultMessages extends Maintenance {
}
$maintClass = "DeleteDefaultMessages";
-require_once( RUN_MAINTENANCE_IF_MAIN );
+require_once RUN_MAINTENANCE_IF_MAIN;
diff --git a/maintenance/deleteEqualMessages.php b/maintenance/deleteEqualMessages.php
index 7048140b..81758913 100644
--- a/maintenance/deleteEqualMessages.php
+++ b/maintenance/deleteEqualMessages.php
@@ -19,7 +19,7 @@
* @ingroup Maintenance
*/
-require_once( __DIR__ . '/Maintenance.php' );
+require_once __DIR__ . '/Maintenance.php';
/**
* Maintenance script that deletes all pages in the MediaWiki namespace
@@ -41,7 +41,7 @@ class DeleteEqualMessages extends Maintenance {
* @param string|bool $langCode See --lang-code option.
*/
protected function fetchMessageInfo( $langCode, array &$messageInfo ) {
- global $wgUser, $wgContLang;
+ global $wgContLang;
if ( $langCode ) {
$this->output( "\n... fetching message info for language: $langCode" );
@@ -70,7 +70,13 @@ class DeleteEqualMessages extends Maintenance {
$default = wfMessage( $key )->inLanguage( $langCode )->useDatabase( false )->plain();
$messageInfo['relevantPages']++;
- if ( $actual === $default ) {
+
+ if (
+ // Exclude messages that are empty by default, such as sitenotice, specialpage
+ // summaries and accesskeys.
+ $default !== '' && $default !== '-' &&
+ $actual === $default
+ ) {
$hasTalk = isset( $statuses['talks'][$key] );
$messageInfo['results'][] = array(
'title' => $key . $titleSuffix,
@@ -152,6 +158,7 @@ class DeleteEqualMessages extends Maintenance {
if ( !$user ) {
$this->error( "Invalid username", true );
}
+ global $wgUser;
$wgUser = $user;
// Hide deletions from RecentChanges
@@ -183,4 +190,4 @@ class DeleteEqualMessages extends Maintenance {
}
$maintClass = "DeleteEqualMessages";
-require_once( RUN_MAINTENANCE_IF_MAIN );
+require_once RUN_MAINTENANCE_IF_MAIN;
diff --git a/maintenance/deleteImageMemcached.php b/maintenance/deleteImageMemcached.php
index 3c8c5fdd..835de352 100644
--- a/maintenance/deleteImageMemcached.php
+++ b/maintenance/deleteImageMemcached.php
@@ -24,7 +24,7 @@
* @ingroup Maintenance
*/
-require_once( __DIR__ . '/Maintenance.php' );
+require_once __DIR__ . '/Maintenance.php';
/**
* Maintenance script that deletes image information from the object cache.
@@ -59,13 +59,15 @@ class DeleteImageCache extends Maintenance {
$total = $this->getImageCount();
foreach ( $res as $row ) {
- if ( $i % $this->report == 0 )
+ 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;
}
@@ -78,4 +80,4 @@ class DeleteImageCache extends Maintenance {
}
$maintClass = "DeleteImageCache";
-require_once( RUN_MAINTENANCE_IF_MAIN );
+require_once RUN_MAINTENANCE_IF_MAIN;
diff --git a/maintenance/deleteOldRevisions.php b/maintenance/deleteOldRevisions.php
index 114aefd7..847d8634 100644
--- a/maintenance/deleteOldRevisions.php
+++ b/maintenance/deleteOldRevisions.php
@@ -22,7 +22,7 @@
* @author Rob Church <robchur@gmail.com>
*/
-require_once( __DIR__ . '/Maintenance.php' );
+require_once __DIR__ . '/Maintenance.php';
/**
* Maintenance script that deletes old (non-current) revisions from the database.
@@ -100,4 +100,4 @@ class DeleteOldRevisions extends Maintenance {
}
$maintClass = "DeleteOldRevisions";
-require_once( RUN_MAINTENANCE_IF_MAIN );
+require_once RUN_MAINTENANCE_IF_MAIN;
diff --git a/maintenance/deleteOrphanedRevisions.php b/maintenance/deleteOrphanedRevisions.php
index f0da9a82..f0a96928 100644
--- a/maintenance/deleteOrphanedRevisions.php
+++ b/maintenance/deleteOrphanedRevisions.php
@@ -24,7 +24,7 @@
* @todo More efficient cleanup of text records
*/
-require_once( __DIR__ . '/Maintenance.php' );
+require_once __DIR__ . '/Maintenance.php';
/**
* Maintenance script that deletes revisions which refer to a nonexisting page.
@@ -54,8 +54,9 @@ class DeleteOrphanedRevisions extends Maintenance {
# Stash 'em all up for deletion (if needed)
$revisions = array();
- foreach ( $res as $row )
+ foreach ( $res as $row ) {
$revisions[] = $row->rev_id;
+ }
$count = count( $revisions );
$this->output( "found {$count}.\n" );
@@ -83,11 +84,12 @@ class DeleteOrphanedRevisions extends Maintenance {
* @param $dbw DatabaseBase 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( RUN_MAINTENANCE_IF_MAIN );
+require_once RUN_MAINTENANCE_IF_MAIN;
diff --git a/maintenance/deleteRevision.php b/maintenance/deleteRevision.php
index ad6470d9..6bc0f7cd 100644
--- a/maintenance/deleteRevision.php
+++ b/maintenance/deleteRevision.php
@@ -21,7 +21,7 @@
* @ingroup Maintenance
*/
-require_once( __DIR__ . '/Maintenance.php' );
+require_once __DIR__ . '/Maintenance.php';
/**
* Maintenance script that deletes one or more revisions by moving them
@@ -85,4 +85,4 @@ class DeleteRevision extends Maintenance {
}
$maintClass = "DeleteRevision";
-require_once( RUN_MAINTENANCE_IF_MAIN );
+require_once RUN_MAINTENANCE_IF_MAIN;
diff --git a/maintenance/deleteSelfExternals.php b/maintenance/deleteSelfExternals.php
index da220d64..a0976228 100644
--- a/maintenance/deleteSelfExternals.php
+++ b/maintenance/deleteSelfExternals.php
@@ -21,7 +21,7 @@
* @ingroup Maintenance
*/
-require_once( __DIR__ . '/Maintenance.php' );
+require_once __DIR__ . '/Maintenance.php';
/**
* Maintenance script that deletes self-references to $wgServer
@@ -47,10 +47,12 @@ class DeleteSelfExternals extends Maintenance {
. $db->buildLike( $wgServer . '/', $db->anyString() ), $this->mBatchSize );
$this->output( "Deleting a batch\n" );
$db->query( $q );
- if ( !$db->affectedRows() ) return;
+ if ( !$db->affectedRows() ) {
+ return;
+ }
}
}
}
$maintClass = "DeleteSelfExternals";
-require_once( RUN_MAINTENANCE_IF_MAIN );
+require_once RUN_MAINTENANCE_IF_MAIN;
diff --git a/maintenance/dev/includes/router.php b/maintenance/dev/includes/router.php
index 1d5070b1..a3cc0ba3 100644
--- a/maintenance/dev/includes/router.php
+++ b/maintenance/dev/includes/router.php
@@ -25,8 +25,8 @@ if ( PHP_SAPI != 'cli-server' ) {
die( "This script can only be run by php's cli-server sapi." );
}
-ini_set('display_errors', 1);
-error_reporting(E_ALL);
+ini_set( 'display_errors', 1 );
+error_reporting( E_ALL );
if ( isset( $_SERVER["SCRIPT_FILENAME"] ) ) {
# Known resource, sometimes a script sometimes a file
@@ -58,7 +58,7 @@ if ( $ext == 'php' || $ext == 'php5' ) {
# We use require and return true here because when you return false
# the php webserver will discard post data and things like login
# will not function in the dev environment.
- require( $file );
+ require $file;
return true;
}
$mime = false;
@@ -83,16 +83,16 @@ if ( $mime ) {
# This way we can serve things like .svg files that the built-in
# PHP webserver doesn't understand.
# ;) Nicely enough we just happen to bundle a mime.types file
- $f = fopen($file, 'rb');
+ $f = fopen( $file, 'rb' );
if ( preg_match( '#^text/#', $mime ) ) {
# Text should have a charset=UTF-8 (php's webserver does this too)
- header("Content-Type: $mime; charset=UTF-8");
+ header( "Content-Type: $mime; charset=UTF-8" );
} else {
- header("Content-Type: $mime");
+ header( "Content-Type: $mime" );
}
- header("Content-Length: " . filesize($file));
+ header( "Content-Length: " . filesize( $file ) );
// Stream that out to the browser
- fpassthru($f);
+ fpassthru( $f );
return true;
}
diff --git a/maintenance/dictionary/mediawiki.dic b/maintenance/dictionary/mediawiki.dic
new file mode 100644
index 00000000..164b5b05
--- /dev/null
+++ b/maintenance/dictionary/mediawiki.dic
@@ -0,0 +1,4556 @@
+ænglisc
+ævar
+&add
+&amp
+&bar
+&sim
+&url
+ABNF
+API
+Aacute
+Aborted
+Abuse
+Account
+Accum
+Acirc
+Action
+Activity
+Agrave
+All
+Allocations
+Ancientpages
+Anim
+Api
+Apitestsysop
+Apitestuser
+Aring
+Article
+As
+Atilde
+Auml
+Autopromote
+BACKCOMPAT
+Backlinks
+Blacklist
+Block
+Blocked
+Blocks
+Bodytext
+Broken
+COMPUTERNAME
+CRLF
+CURLOPT
+Campaign
+Capture
+Categories
+Category
+Ccedil
+Central
+Changes
+Check
+Click
+Client
+Clientfor
+Colorer
+Compare
+Config
+Console
+Continue
+Contribs
+Contributions
+Conversiontable
+Coordinates
+Create
+Creation
+Cview
+DDLMODE
+DWIM
+DWIMD
+Daily
+Dbkeyform
+Deadendpages
+Debugtext
+Delete
+Deletedrevs
+Denied
+Dfile
+Double
+Duplicate
+EAGAIN
+EBML
+ECMA
+EDITFILTERMERGED
+EINPROGRESS
+EINTR
+EOCDR
+ETAG
+Eacute
+Ecirc
+Edit
+Editor
+Education
+Egrave
+Ehcache
+Elig
+Email
+Empty
+End
+English
+Enlist
+Euml
+Eval
+Events
+Exists
+Expand
+Expression
+Ext
+External
+Extracts
+Extraneous
+FFFD
+FOLLOWLOCATION
+Failure
+Featured
+Feed
+Feedback
+Feedbackv
+Feeds
+Fewestrevisions
+Ffile
+File
+Filearchive
+Filedelete
+Files
+Filter
+Filters
+Flag
+Flagged
+GI
+GRAPHEME
+Gadget
+Gadgets
+Geo
+Get
+Global
+Groups
+HEA
+HTM
+Hardblock
+Help
+Helpful
+ID
+IPTC
+IWBacklinks
+IWLinks
+Iacute
+Icirc
+Igrave
+Illegal
+Image
+Images
+Implict
+Import
+Info
+Invalidateemail
+Isarticle
+Item
+Iuml
+LOCALISATIONCACHE
+Lang
+Lastmod
+Links
+Linktags
+List
+Listredirects
+Living
+Log
+Login
+Logout
+Logs
+Lonelypages
+Longpages
+Love
+Ltitle
+MSVC
+Mark
+Match
+Matrix
+Members
+Mesg
+Messages
+Metatags
+Mobile
+Mostcategories
+Mostimages
+Mostinterwikis
+Mostlinked
+Mostlinkedcategories
+Mostlinkedtemplates
+Mostrevisions
+Move
+Mssql
+Mwstore
+Myuploads
+NEWPAGE
+NOTIC
+Name
+Need
+No
+Noscript
+Not
+Notalk
+Notice
+Notification
+Ntilde
+Oacute
+Ocirc
+Ograve
+Oldreviewedpages
+Open
+Options
+Oslash
+Otilde
+Ouml
+PAGEEDITDATE
+PAGEEDITOR
+PAGEEDITTIME
+PAGEINTRO
+PAGEMINOREDIT
+PAGESUMMARY
+PARSEHUGE
+PARSERFIRSTCALLINIT
+PHPTAL
+PMID
+Page
+Pages
+Param
+Parse
+Parsers
+Pass
+Passpass
+Patrol
+People
+Plugin
+Possible
+Program
+Props
+Protect
+Protected
+Protectexpiry
+Protectother
+Protectreason
+Protectreasonother
+Purge
+Query
+Queued
+Random
+Rapid
+Ratings
+Raw
+Recent
+Redirects
+Redis
+Referer
+Refresh
+Regexlike
+Replacer
+Reset
+Resursive
+Revert
+Review
+Revisions
+Rollback
+Rsd
+SEGSIZE
+STDERR
+SYSDBA
+Scaron
+Scribunto
+Search
+Section
+Set
+Shortpages
+Site
+Siteinfo
+Solr
+Stabilize
+Stash
+Stats
+Status
+Success
+Syntax
+TMPDIR
+TOOLBOXEND
+TRANSLIT
+Tagging
+Tags
+Template
+Templates
+Textform
+Tfile
+Throttled
+Timestamp
+Title
+Titles
+Token
+Tokens
+Tracking
+Transcode
+Triage
+UNWATCHURL
+Uacute
+Ucirc
+Ugrave
+Unblock
+Uncategorizedcategories
+Uncategorizedimages
+Uncategorizedpages
+Uncategorizedtemplates
+Undelete
+Unusedcategories
+Unusedimages
+Unusedtemplates
+Unwatchedpages
+Upload
+Urlform
+Usage
+User
+Usercreate
+Userdir
+Userlang
+Userrights
+Users
+Useruser
+Ustart
+Uuml
+Value
+Video
+View
+Visual
+WATCHINGUSERNAME
+WEBPVP
+Wantedcategories
+Wantedfiles
+Wantedpages
+Wantedtemplates
+Warning
+Watch
+Watchingusers
+Watchlist
+Wiki
+Wikibase
+Withoutinterwiki
+Wrong
+XX
+Xml
+YYYY
+YYYYMMDDHHMMSS
+Yacute
+Yuml
+\
+a
+aa
+aacute
+abbrv
+abcdefghijklmnopqrstuvwxyz
+abf
+aboutpage
+aboutsite
+abusefilter
+abusefiltercheckmatch
+abusefilterchecksyntax
+abusefilterevalexpression
+abusefilters
+abusefilterunblockautopromote
+abuselog
+abusive
+ac
+acad
+accel
+acceptlang
+accessdenied
+accesskey
+accesskeycache
+accesskeys
+accessors
+acchits
+account
+accountcreator
+accum
+acirc
+aclimit
+acprefix
+action
+actioncomplete
+actionhidden
+actions
+actiontext
+actionthrottled
+actionthrottledtext
+actiontoken
+activeusers
+activity
+acuxvalidate
+add
+addablegroups
+addbegin
+addedline
+addedwatchtext
+addergroup
+addergroups
+addin
+adding
+additional
+addr
+address
+addresses
+addsection
+addstudent
+admin
+administrator
+adnum
+adrelid
+adsrc
+advancedediting
+advancedrc
+advancedrendering
+advancedsearchoptions
+advancedwatchlist
+aelig
+af
+afl
+aft
+afttest
+afvf
+age
+aggregators
+agrave
+ahandler
+ahttp
+ai
+aifc
+aiff
+aiprop
+ajaxwatch
+al
+alefsym
+algo
+algos
+all
+all's
+allcategories
+alldata
+alle
+allexamples
+allhidden
+allimages
+allimit
+alllinks
+alllogstext
+allmessages
+allmonths
+allowedctypes
+allowedonly
+allowemail
+allowsduplicates
+allowusertalk
+allpages
+allpagesbadtitle
+allpagesprefix
+allpagesredirect
+allpagessubmit
+allrev
+alltitles
+alltransclusions
+allusers
+aloption
+alprefix
+alreadyblocked
+alreadydone
+alreadyexists
+alreadyrolled
+alunique
+am
+anchor
+anchorclose
+anchorencode
+and
+andconvert
+andtitle
+anon
+anoneditwarning
+anonlogin
+anonnotice
+anononly
+anonpreviewwarning
+anontalk
+anontalkpagetext
+anontoken
+anonuserpage
+anonymous
+anti
+antispoof
+antivirus
+anymap
+ap
+apcond
+apdir
+api
+api's
+apibase
+apihelp
+apihighlimits
+apis
+aplimit
+apnamespace
+apng
+apos
+appendnotsupported
+appendtext
+apprefix
+approve
+aprops
+aqbt
+aqct
+archivename
+aren
+args
+argsarams
+aring
+arnfjörð
+article
+articleexists
+articlefeedbackv
+articleid
+articlelink
+articlepage
+articlepath
+articles
+aryeh
+asc
+ascending
+asctime
+asdf
+aspx
+assert
+astriks
+asymp
+async
+asynccopyuploaddisabled
+asyncdownload
+at
+atend
+atext
+atid
+atilde
+atime
+atlimit
+atoi
+atom
+atprefix
+atthasdef
+attibs
+attibute
+attlen
+attname
+attnum
+attrdef
+attrelid
+attrib
+attribs
+attributename
+attrs
+atttypid
+atunique
+au
+auml
+authplugins
+autoaccount
+autobiography
+autoblock
+autoblocked
+autoblockedtext
+autoblocker
+autoblockid
+autoblocking
+autoblockip
+autoblocks
+autocad
+autocomment
+autocomments
+autocomplete
+autoconfirm
+autoconfirmed
+autocreate
+autocreated
+autocreation
+autodetection
+autoflag
+autofocus
+autogen
+autogenerated
+autohide
+autoload
+autoloader
+autoloaders
+autoloading
+automagically
+automatic
+autonym
+autopatrol
+autoplay
+autopromote
+autopromoted
+autopromotion
+autoreview
+autoreviewer
+autoreviewrestore
+autosumm
+autosummaries
+autosummary
+axto
+azərbaycanca
+backends
+backlink
+backlinks
+backlinksubtitle
+backported
+backslashed
+backtraces
+bad
+badaccess
+badarticleerror
+badcontinue
+baddiff
+bademail
+badfilename
+badformat
+badgenerator
+badhookmsg
+badinterwiki
+badip
+badipaddress
+badkey
+badmd
+badmime
+badminpassword
+badminuser
+badnamespace
+badoption
+badparams
+badport
+badretype
+badrevids
+badsig
+badsiglength
+badsyntax
+badtag
+badtimestamp
+badtitle
+badtitletext
+badtoken
+badtype
+badupload
+baduser
+badversion
+balancer
+balancers
+banjar
+barstein
+base
+basefont
+basename
+basepagename
+basepagenamee
+basetimestamp
+bashkir
+bashpid
+bcancel
+bceffd
+bcmath
+bcompress
+bcpio
+bdop
+bdquo
+becampus
+beinstructor
+belarusian
+beonline
+bereviewer
+berror
+bestq
+besttype
+bg
+bgcolor
+bgzip
+bidi
+bigdelete
+binhex
+bitdepth
+bitfield
+bitfields
+bitmask
+bjarmason
+bk
+bkey
+bkinvalidparammix
+bkmissingparam
+bkusers
+bl
+blanking
+blanknamespace
+blankpage
+blegh
+bleh
+blinvalidparammix
+blksize
+blmissingparam
+block
+blockable
+blocked
+blockedasrange
+blockedby
+blockedbyid
+blockedemailuser
+blockedexpiry
+blockedfrommail
+blockednoreason
+blockedreason
+blockedtext
+blockedtitle
+blockemail
+blockexpiry
+blockid
+blockinfo
+blockip
+blocklink
+blocklogentry
+blocklogpage
+blocklogtext
+blockme
+blockquote
+blockreason
+blocks
+blocktoken
+bloggs
+blogs
+blogspot
+bltitle
+bluelink
+bluelinks
+bmwschema
+bmysql
+bname
+bodycontent
+boldening
+bolding
+booksources
+bool
+boolean
+borderhack
+bot
+botedit
+boteditletter
+bots
+bottom
+bottomscripts
+bpassword
+bpatch
+bpchar
+bport
+bprefix
+broeck
+brokenlibxml
+brokenredirects
+brokenredirectstext
+browsearchive
+brvbar
+bserver
+bservers
+bssl
+btestpassword
+btestuser
+btype
+bucket
+bucketcount
+bugfix
+bugfixes
+buglist
+bugzilla
+buildpath
+buildpathentry
+bulgakov
+bulkdelcourses
+bulkdelorgs
+bureaucrat
+buser
+by
+byemail
+byid
+bytea
+bytesleft
+bytesread
+bytevalue
+cacheable
+cached
+cachedcount
+cachedsidebar
+cachedspecial
+cachedtimestamp
+calimit
+callargs
+campaign
+campus
+cancelto
+cannotdelete
+cannotundelete
+canonicalised
+canonicalization
+canonicalize
+canonicalizes
+canonicalizing
+canremember
+canreset
+cansecurelogin
+cantblock
+cantcreate
+cantdelete
+cantedit
+cantexecute
+canthide
+cantimport
+cantmove
+cantmovefile
+cantopenfile
+cantoverwrite
+cantrollback
+cantsend
+cantunblock
+cantundelete
+capitalizeallnouns
+captchaid
+captchas
+captchaword
+cascade
+cascadeable
+cascadeon
+cascadeprotected
+cascadeprotectedwarning
+cascading
+cascadingness
+categories
+categories's
+categorieshtml
+category
+categoryfinder
+categoryinfo
+categorylinks
+categorymembers
+categorypage
+categoryviewer
+catids
+catlinks
+catpage
+catrope
+cattitles
+ccedil
+ccme
+ccmeonemails
+cdab
+cdel
+cdlink
+cedil
+ceebc
+cellpadding
+cellspacing
+central
+centralauth
+centralnotice
+centralnoticeallocations
+centralnoticelogs
+centralnoticequerycampaign
+cgroup
+cgroups
+change
+change's
+changeablegroups
+changed
+changedby
+changedorcreated
+changeemail
+changelog
+changeslist
+changing
+characters
+chardiff
+charoff
+chars
+checkfreq
+checkmatrix
+checkstatus
+checkuser
+checkuserlog
+chgrp
+childs
+chillu
+chmoding
+choicesstring
+chrs
+chunk
+chunked
+chunking
+ci
+cidr
+cidrtoobroad
+circ
+citeseer
+ckers
+ckey
+cl
+clamav
+clamscan
+classname
+clcategorie
+cldir
+cldr
+clear
+clearable
+clearyourcache
+clfrom
+clickjacking
+clicktracking
+clientfor
+clientpool
+cllimit
+clober
+closed
+clto
+cm
+cminvalidparammix
+cmmissingparam
+cmnamespace
+cmtitle
+co
+code
+codemap
+codepoint
+codestr
+coi
+colgroup
+collapsable
+collectionsaveascommunitypage
+collectionsaveasuserpage
+colname
+cologneblue
+colonseparator
+colorer
+colspan
+commafy
+commafying
+comment
+commentedit
+commenthidden
+comments
+commitdiff
+commoncssjs
+compactpro
+compare
+compat
+complete
+cond
+condcomment
+condeferrable
+condeferred
+conds
+config
+confirmdeletetext
+confirmed
+confirmedittext
+confirmemail
+confirmrecreate
+conflimit
+confstr
+conkey
+conname
+conrelid
+console
+content
+contentformat
+contenthandler
+contentlanguage
+contentless
+contentmodel
+contenttoobig
+continue
+contribs
+contribslink
+conttitle
+contype
+conv
+converttitles
+convmv
+cookieprefix
+cooltalk
+coord
+coordinates
+copyrightico
+copyrightpage
+copyrightwarning
+copyuploadbaddomain
+copyuploaddisabled
+copyvio
+copywarn
+cors
+couldn
+counter
+countmsg
+country
+course
+courseid
+cpio
+cprefs
+cprotected
+crarr
+crashbug
+create
+createaccount
+createonly
+createpage
+createtalk
+creationsort
+creativecommons
+creditspage
+crocker
+cryptrand
+csize
+csrf
+css
+cssclass
+csslinks
+cssprefs
+cta
+ctime
+ctor
+ctype
+cu
+cul
+curation
+curdiff
+curid
+curlink
+curren
+currentarticle
+currentbrowser
+currentday
+currentdayname
+currentdow
+currenthour
+currentmonth
+currentmonthabbrev
+currentmonthname
+currentmonthnamegen
+currentrev
+currentrevisionlink
+currenttime
+currenttimestamp
+currentversion
+currentweek
+currentyear
+customcssprotected
+customised
+customjsprotected
+cut
+cyber
+cygwin
+cyrl
+d'oh
+dadedad
+dairiki
+danga
+danielc
+darr
+datalen
+dataset
+datasets
+datasize
+datatable
+datatype
+datedefault
+dateformat
+dateheader
+dateopts
+daysago
+dbcnt
+dbconnect
+dberrortext
+dbg
+dbgfm
+dbkey
+dbkeys
+dbks
+dbname
+dbrepllag
+dbsettings
+dbtype
+dbversion
+ddjvu
+de
+deadend
+deadendpagestext
+deadenpages
+dealies
+debughtml
+decline
+declined
+decls
+decr
+decrease
+default
+defaultcontentmodel
+defaultmessagetext
+defaultmissing
+defaultns
+defaultsort
+defaultval
+deferr
+definite
+deflimit
+defs
+deja
+delete
+deleteall
+deletecomment
+deleteconfirm
+deleted
+deletedhistory
+deletedline
+deletedonly
+deletedrevision
+deletedrevs
+deletedtext
+deletedwhileediting
+deleteeducation
+deleteglobalaccount
+deletelogentry
+deleteone
+deleteotherreason
+deletepage
+deletereason
+deletereasonotherlist
+deleterevision
+deleteset
+deletethispage
+deletetoken
+deletion
+deletionlog
+delim
+dellogpage
+dellogpagetext
+delundel
+deprecated
+deps
+depth
+dequeue
+dequeued
+dequeueing
+dequeues
+derivatives
+desc
+descending
+description
+descriptionmsg
+descriptionmsgparams
+descriptionurl
+deserialization
+deserialize
+dest
+detail
+details
+devangari
+devel
+df
+dflt
+dhtml
+diams
+didn
+diff
+diff's
+diffchange
+diffhist
+difflink
+diffonly
+difftext
+diffto
+difftocontent
+difftotext
+dim
+dimensions
+dir
+direction
+directionmark
+directorycreateerror
+directorynotreadableerror
+directoryreadonlyerror
+dirmark
+dirname
+disabled
+disabledtranscode
+disablemail
+disablepp
+disablesuggest
+disclaimerpage
+diskussion
+displayname
+displayrc
+displaysearchoptions
+displaytitle
+displaytitles
+displaywatchlist
+distclean
+distro
+djava
+djob
+djvu
+djvudump
+djvulibre
+djvutoxml
+djvutxt
+djvuxml
+djvuzone
+dkjsagfjsgashfajsh
+dlen
+dltk
+dmoz
+dnsbl
+dnsblacklist
+dnumber
+docm
+docroot
+doctype
+doctypes
+docx
+dodiff
+doesn
+domain
+domainnames
+domainpart
+domainparts
+domas
+doms
+dotdotcount
+dotm
+dotsc
+dotsi
+dotsm
+dotso
+dotwise
+dotx
+doubleclick
+doublequote
+doxygen
+dpos
+dr
+dropdown
+dump
+dumpfm
+dupfunc
+duplicatefiles
+duplicatesoffile
+dvips
+dwfx
+dwhitelist
+e
+eacute
+earth
+eauth
+ecirc
+ecmascript
+edit
+editbutton
+editconflict
+editconflicts
+editcount
+editfont
+editform
+edithelp
+edithelppage
+edithelpurl
+editingcomment
+editinginterface
+editingold
+editingsection
+editinterface
+editintro
+edititis
+editlink
+editmyoptions
+editmyprivateinfo
+editmyusercss
+editmyuserjs
+editmywatchlist
+editnotice
+editnotsupported
+editondblclick
+editor
+editownusertalk
+editpage
+editprotected
+editreasons
+editredlink
+editrestriction
+edits
+editsection
+editsectionhint
+editsectiononrightclick
+editsemiprotected
+editsonly
+editthispage
+edittime
+edittoken
+edittools
+editurl
+editusercss
+editusercssjs
+edituserjs
+edoe
+egrave
+ehcache
+ei
+eich
+eiinvalidparammix
+eimissingparam
+eititle
+el
+elapsedreal
+elemname
+elink
+eltitle
+email
+emailable
+emailaddress
+emailauthenticated
+emailauthentication
+emailauthenticationclass
+emailcapture
+emailconfirm
+emailconfirmed
+emailconfirmlink
+emaildisabled
+emailling
+emaillink
+emailnotauthenticated
+emailtoken
+emailuser
+embeddedin
+empty
+emptyfile
+emptynewsection
+emptypage
+emsenhuber
+emsp
+en
+enabled
+enabledonly
+enableparser
+encapsed
+enctype
+end
+endcode
+endcond
+endian
+endid
+endl
+endsortkey
+endsortkeyprefix
+endtime
+endverbatim
+enhancedchanges
+enlist
+enotif
+enotifminoredits
+enotifrevealaddr
+enotifusertalkpages
+enotifwatchlistpages
+enqueueing
+enroll
+ensp
+entirewatchlist
+entityid
+envcmd
+enwiki
+eocdr
+ep
+eparticle
+epcampus
+epcoordinator
+epinstructor
+eponline
+erevoke
+errno
+error
+errorbox
+errormessage
+errorpagetitle
+errors
+errorstr
+errortext
+errorunknown
+errstr
+es
+escapenoentities
+escapeshellarg
+esearch
+español
+española
+etag
+eu
+euml
+event
+eventid
+ex
+exampleextension
+examples
+excludegroup
+excludepage
+excludeuser
+executables
+exempt
+existingwiki
+exists
+exiv
+expandtab
+expandtemplates
+expandurl
+experiment
+expertise
+expiry
+expiryarray
+explainconflict
+export
+exportnowrap
+exportxml
+expression
+exptime
+extauth
+extendwatchlist
+extensionname
+extensions
+extensiontags
+external
+externaldberror
+externaldiff
+externaledit
+externaleditor
+externallinks
+externalstore
+extet
+extiw
+extlink
+extlinks
+extracts
+extradata
+extrafields
+extraq
+extratags
+exturlusage
+extuser
+exxaammppllee
+fa
+facto
+failback
+failover
+failsafe
+fallbacks
+false
+falsy
+fancysig
+fastcgi
+faux
+favicon
+fclose
+fdef
+fdff
+feature
+featured
+featuredfeed
+feed
+feed's
+feedback
+feedbackid
+feedcontributions
+feedformat
+feeditems
+feedlink
+feedlinks
+feedurl
+feedwatchlist
+feff
+female
+fetchfileerror
+fffe
+ffff
+fffff
+ffffff
+fieldname
+fieldset
+fieldsets
+file
+filearchive
+filebackend
+filecache
+filecopyerror
+filedelete
+filedeleteerror
+fileexists
+fileextensions
+filehidden
+filehist
+filehistory
+fileinfo
+filejournal
+filekey
+filelinks
+filemissing
+filemover
+filemtime
+filename
+filenames
+filenotfound
+filepage
+filepath
+filerenameerror
+filerepo
+filerevert
+filerevisions
+files
+filesize
+filesort
+filesorts
+filesystem's
+filesystems
+filetoc
+filetoobig
+filetype
+filetypemismatch
+fileversions
+filter
+filterbots
+filteriw
+filterlanglinks
+filterlocal
+filterredir
+filterwatched
+findnext
+finfo
+firefox
+firstname
+firstrev
+firsttime
+fishbowl
+fixme
+fixup
+flac
+flag
+flagconfig
+flagged
+flags
+flagtype
+flatlist
+flds
+float
+fmttime
+fname
+fnof
+foldmarker
+foldmethod
+followpolicy
+footericon
+footericons
+footerlinks
+fopen
+for
+forall
+forbidden
+forcearticlepath
+forcebot
+forceditsummary
+forceeditsummary
+forcelinkupdate
+forcetoc
+forcontent
+formaction
+format
+formatmodules
+formatted
+formatters
+formatting
+formedness
+formenctype
+formnovalidate
+formtype
+forupdate
+found
+founder
+fr
+frac
+frameless
+framesets
+frasl
+fread
+freedomdefined
+freeform
+freenode
+frickin
+from
+fromdb
+fromdbmaster
+fromid
+fromrev
+fromrevid
+fromtitle
+frontends
+fseek
+fsockopen
+fsync
+ftp
+fullhistory
+fullpagename
+fullpagenamee
+fulluri
+fullurl
+funcname
+functionhooks
+functionname
+futuresplash
+fvalue
+ga
+gack
+gadgetcategories
+gadgets
+gaid
+gaifilterredir
+gallerybox
+gallerycaption
+gallerytext
+gapdir
+gapfilterredir
+gaplimit
+gapprefix
+garber
+gblblock
+gblock
+gblrights
+gc
+gcldir
+gcllimit
+gender
+general
+generatexml
+generator
+geocoordinate
+geosearch
+gerrit
+getcookie
+getenv
+getheader
+getimagesize
+getlink
+getmac
+getmarkashelpfulitem
+getmypid
+getrusage
+gettimeofday
+gettingstarted
+gettoken
+getuid
+gfdl
+ggp
+ghostscript
+gimpbaseenums
+git
+gitblit
+gitdir
+github
+global
+globalauth
+globalblock
+globalblocks
+globalgroupmembership
+globalgrouppermissions
+globalgroups
+globalsettings
+globalunblock
+globalusage
+globaluserinfo
+globe
+gmail
+gmdate
+goodtitle
+gopher
+graymap
+grayscale
+greant
+greymap
+group
+groupcounts
+groupless
+groupmember
+grouppage
+groupperms
+groupprms
+groups
+growinglink
+grxml
+gs
+gtar
+gu
+guesstimezone
+gui
+guid
+gunblock
+guser
+gwicke
+gzcompress
+gzdeflate
+gzencode
+gzhandler
+gzip
+gzipped
+gzipping
+hacky
+hansm
+hant
+hardblocks
+hardcode
+hardcoding
+harr
+hash
+hashar
+hashcheckfailed
+hashsearchdisabled
+hashtable
+hashtables
+hasmatch
+hasmsg
+hasn
+hasrelated
+headelement
+headerpos
+headhtml
+headitems
+headlinks
+headscripts
+height
+hellip
+help
+helpful
+helppage
+helptext
+helpurl
+helpurls
+helpwindow
+hexdump
+hexstring
+hidden
+hiddencat
+hiddencategories
+hiddencats
+hide
+hideanons
+hidebots
+hidediff
+hideliu
+hideminor
+hidemyself
+hidename
+hidepatrolled
+hideredirects
+hiderevision
+hideuser
+hidpi
+highlimit
+highmax
+highuse
+hilfe
+hiphop
+histfirst
+histlast
+historyempty
+historysubmit
+historywarning
+hit
+hitcount
+hitcounter
+hits
+hmac
+hmtl
+hobby
+homelink
+hookaborted
+horohoe
+hostnames
+hours
+hphp
+hplist
+hpos
+hreflang
+hslots
+htaccess
+htcp
+html
+htmlelements
+htmlescaped
+htmlform
+htmlish
+htmllist
+htmlnest
+htmlpair
+htmlpairs
+htmlsingle
+htmlsingleallowed
+htmlsingleonly
+htmlspecialchars
+htmltidy
+http
+httpaccept
+httpbl
+https
+i
+ia
+iabn
+iacute
+icirc
+icononly
+iconv
+icubench
+icutest
+id
+idanduser
+ids
+ie's
+ieinternals
+ietf
+iexcl
+ifconfig
+iframe
+igbinary
+iges
+ignorewarnings
+igrave
+ii
+iicontinue
+iiprop
+iiurlparam
+iiurlwidth
+iker
+ilfrom
+ilto
+im
+image
+imagegetsize
+imageinfo
+imageinvalidfilename
+imagelinks
+imagemagick
+imagemaxsize
+imagenocrossnamespace
+imagepage
+imagerepository
+imagerotate
+images
+imagesize
+imagetype
+imagetypemismatch
+imageusage
+imagick
+imgmultigo
+imgmultigoto
+imgmultipagenext
+imgmultipageprev
+imgs
+imgserv
+immobilenamespace
+implicitgroups
+import
+importbadinterwiki
+importcantopen
+importlogpage
+importlogpagetext
+importnofile
+importtoken
+importupload
+importuploaderrorpartial
+importuploaderrorsize
+importuploaderrortemp
+in
+iname
+inbound
+includable
+include
+includecomments
+includelocal
+includeonly
+includexmlnamespace
+incr
+increase
+indefinite
+index
+indexfield
+indexpageids
+indexpolicy
+indstr
+infin
+infinite
+infiniteblock
+info
+infoaction
+infobox
+infoline
+infomsg
+ingroups
+injectjs
+inkscape
+inlanguagecode
+inlined
+inno
+inputneeded
+insb
+inser
+instantcommons
+institution
+instructor
+int
+integer
+integeroutofrange
+intentionallyblankpage
+interlang
+interlangs
+interlanguage
+internal
+internaledit
+internalerror
+interwiki
+interwikimap
+interwikipage
+interwikis
+interwikisource
+intnull
+intoken
+intra
+intro
+intrw
+ints
+intval
+invalid
+invalidaction
+invalidations
+invalidcategory
+invaliddomain
+invalidemail
+invalidemailaddress
+invalidexpiry
+invalidip
+invalidlang
+invalidlevel
+invalidmode
+invalidoldimage
+invalidpage
+invalidpageid
+invalidparameter
+invalidparammix
+invalidpath
+invalidrange
+invalidsection
+invalidsessiondata
+invalidsha
+invalidspecialpage
+invalidtags
+invalidtime
+invalidtitle
+invalidtoken
+invaliduser
+invalue
+iorm
+ip
+ipbblocked
+ipblock
+ipblocks
+ipbnounblockself
+ipchain
+ipedits
+iphash
+ipinrange
+ipusers
+iquest
+irc
+ircs
+isam
+isapi
+isbot
+isconnected
+iscur
+isin
+isip
+ismap
+isminor
+ismodsince
+ismulti
+isnew
+ispermalink
+isself
+isset
+istainted
+istalk
+iswatch
+it
+item
+itemid
+itemprop
+itemref
+itemscope
+itemtype
+iter
+iu
+iuinvalidparammix
+iumissingparam
+iuml
+iw
+iwbacklinks
+iwbl
+iwlfrom
+iwlinks
+iwlprefix
+iwltitle
+iwprefix
+iwtitle
+iwurl
+javascript
+javascripttest
+jbartsh
+jconds
+jdk's
+jhtml
+jimbo
+joaat
+jobqueue
+jointype
+jorsch
+journaling
+jpeg
+jpegtran
+jslint
+jsmimetype
+jsminplus
+json
+jsonfm
+jsparse
+jstext
+jsvarurl
+justthis
+kabardian
+kangxi
+kashubia
+kattouw
+kblength
+kernowek
+key
+keygen
+keylen
+keyname
+keynames
+keytype
+khash
+kludgy
+knownnamespace
+konqueror
+kpos
+kuza
+labarga
+labelmsg
+laggedslavemode
+laggy
+lang
+langbacklinks
+langcode
+langcodes
+langconversion
+langlinks
+langprop
+langs
+language
+languagelinks
+languages
+languageshtml
+laquo
+large
+larr
+last
+lastdiff
+lastdot
+lastedit
+lasteditor
+lastedittime
+lastlink
+lastmod
+lastmodifiedat
+lastname
+lastrevid
+lastvisited
+latgalian
+laxström
+lbase
+lbl
+lcattrib
+lceil
+lcomments
+lcount
+lcrocker
+ldquo
+le
+leavemessage
+len
+length
+leprop
+lesque
+lettercase
+level
+lfloor
+lg
+lgname
+lgpassword
+lgpl
+lgtoken
+lguserid
+lgusername
+libcurl
+libel
+libgimpbase
+libketama
+libmemcached
+libre
+libtidy
+ligabue
+lighttpd
+limit
+limitable
+line
+linenumber
+linestart
+link
+linkarr
+linkcolour
+linkprefix
+links
+linkstoimage
+linktbl
+linktext
+linktodiffs
+linktrail
+linktype
+linkupdate
+list
+listable
+listadmins
+listbots
+listfiles
+listgrouprights
+listinfo
+listingcontinuesabbrev
+listoutput
+listresult
+lists
+listtags
+listuser
+listusers
+listusersfrom
+livepreview
+ll
+llfrom
+lllang
+lltitle
+lnumber
+local
+localday
+localdayname
+localdow
+locale
+localhour
+localmonth
+localmonthabbrev
+localmonthname
+localmonthnamegen
+localname
+localonly
+localsettings
+localtimezone
+localweek
+localyear
+lock
+lockandhid
+lockdb
+lockdir
+locked
+lockmanager
+log
+logaction
+logentry
+logevent
+logevents
+logextract
+loggedin
+logid
+login
+loginend
+loginerror
+loginfo
+loginlanguagelinks
+loginlink
+loginprompt
+loginreqlink
+loginreqpagetext
+loginreqtitle
+logins
+loginstart
+logitem
+loglink
+loglist
+logname
+logonly
+logopath
+logourl
+logout
+logpage
+logtext
+logtitle
+logtype
+longpage
+longpageerror
+lookie
+lookups
+loopback
+lossless
+lossy
+lowast
+lowercaps
+lowercased
+lowlimit
+lsaquo
+lsquo
+ltags
+ltitle
+ltrimmed
+lurl
+lysator
+möller
+macr
+magicarr
+magicfile
+magick
+magicword
+magicwordkey
+magicwords
+magnus
+mahaction
+mailerror
+mailmypassword
+mailnologin
+mailparts
+mailpassword
+mailtext
+mailto
+mainmodule
+mainpage
+maintainership
+makesafe
+male
+malloc
+manske
+manualthumb
+mark
+markashelpful
+markaspatrolledlink
+markaspatrolledtext
+markbot
+markbotedits
+markedaspatrollederror
+markpatrolled
+masse
+match
+matchcount
+mathml
+mathtt
+matrixes
+matroska
+max
+maxage
+maxdim
+maxlag
+maxlength
+maxlifetime
+maxqueue
+maxresults
+maxsize
+maxuploadsize
+maxwidth
+mazeland
+mbresponse
+mbstring
+mckey
+mcklmqw
+mcrypt
+mcvalue
+md
+mdash
+medialink
+mediaqueries
+mediatype
+mediawarning
+mediawiki's
+mediawikipage
+megapixels
+member
+memberingroups
+members
+memc
+memcache
+memcached
+memlimit
+memoryp
+memsw
+merge
+mergeable
+merged
+mergehistory
+mergelog
+mergelogpagetext
+message
+messagekey
+messagename
+messagepattern
+messages
+messagetype
+meta
+metacharacters
+metachars
+metadata
+metadataversion
+metafile
+mhash
+mhtml
+micrblogging
+microdata
+microsyntaxes
+microtime
+middot
+migurski
+millitime
+mime
+mimer
+mimesearchdisabled
+mimetype
+min
+minangkabau
+minh
+minification
+minified
+minifier
+minifies
+minify
+minifying
+minimal
+minor
+minordefault
+minoredit
+minoreditletter
+minsize
+misconfigured
+misermode
+mismatch
+misresolved
+missing
+missingcommentheader
+missingcommenttext
+missingdata
+missingparam
+missingpermission
+missingresult
+missingrev
+missingsummary
+missingtext
+missingtitle
+missinguser
+mituzas
+mixedapproval
+mkdir
+mms
+mobile
+mobileformat
+mobileview
+modified
+modifiedarticleprotection
+modify
+modsecurity
+modsince
+module
+moduledisabled
+modulename
+modules
+monitor
+monobook
+monospace
+monospaced
+month
+monthsall
+moodbar
+moredotdotdot
+morelinkstoimage
+morethan
+move
+movedarticleprotection
+moveddeleted
+movedto
+movefile
+movelogpage
+movelogpagetext
+movenologintext
+movenotallowed
+movenotallowedfile
+moveonly
+moveoverredirect
+movepage
+moves
+movestable
+movesubpages
+movetalk
+movethispage
+movetoken
+mozilla
+mpeg
+mpegurl
+mpga
+mplink
+mptitle
+msdn
+msdownload
+msec
+msexcel
+msgid
+msgkey
+msgs
+msgsize
+msgsmall
+msgtext
+msie
+msmetafile
+mssql
+msvideo
+msword
+mtime
+mtype
+mullane
+multi
+multibyte
+multicast
+multipage
+multipageimage
+multipageimagenavbox
+multipart
+multiselect
+multisource
+multithreaded
+multival
+multivalue
+multpages
+munge
+musso
+mustbeloggedin
+mustbeposted
+mutator
+mutators
+muxers
+mwdumper
+mwfile
+mwstore
+mwsuggest
+mwuser
+mxircecho
+mycontributions
+mycontris
+myext
+myextension
+myisam
+mykey
+mypage
+mypreferences
+mysqldump
+mytalk
+mytext
+mywatchlist
+nabla
+name
+namehidden
+nameinlowercase
+names
+namespace
+namespacealiases
+namespacebanner
+namespacee
+namespacenotice
+namespacenumber
+namespaceoptions
+namespaceprotected
+namespaces
+namespacesall
+namespaceselector
+namespacing
+nassert
+nbase
+nbsp
+nbytes
+nchanges
+ncount
+ndash
+nearmatch
+nedersaksies
+nedersaksisch
+needreblock
+needservers
+needtoken
+netcdf
+netware
+never
+new
+newaddr
+newarticletext
+newarticletextanon
+newer
+newerthanrevid
+newgroups
+newheader
+newid
+newimages
+newlen
+newmessagesdifflink
+newmessagesdifflinkplural
+newmessageslink
+newmessageslinkplural
+newname
+newnames
+newnamespace
+newpage
+newpageletter
+newpages
+newpageshidepatrolled
+newparams
+newpass
+newpassword
+newpos
+newquery
+newrevid
+news
+newsectionlink
+newsectionsummary
+newset
+newsfeed
+newsize
+newtalk
+newtalks
+newtalkseparator
+newtext
+newtimestamp
+newtitle
+newuser
+newuserlogpage
+newuserlogpagetext
+newusers
+newwidth
+newwindow
+nextdiff
+nextid
+nextlink
+nextn
+nextpage
+nextredirect
+nextrevision
+nextval
+nfkc
+nginx
+nheight
+niklas
+nlink
+nlinks
+nmime
+nnnn
+nntp
+no
+noanimatethumb
+noanontoken
+noapiwrite
+noarchivename
+noarticle
+noarticletext
+noarticletextanon
+noautopatrol
+noblock
+nobots
+nobucket
+nobuffer
+nochange
+nochanges
+noclasses
+nocode
+nocomment
+nocomplete
+nocontent
+nocontentconvert
+nocontinue
+noconvertlink
+nocookiesfornew
+nocopyright
+nocourseid
+nocreate
+nocreatetext
+nocredits
+nocta
+nodata
+nodatabase
+nodb
+nodefault
+nodeid
+nodeleteablefile
+nodeletion
+nodelist
+nodename
+nodirection
+nodotdot
+noedit
+noeditsection
+noemail
+noemailprefs
+noemailtitle
+noeventid
+noexec
+noexpertise
+noexpression
+nofeed
+nofeedbackid
+nofile
+nofilekey
+nofilename
+nofilter
+noflagtype
+noflip
+nofollow
+nofound
+nogallery
+nogomatch
+nogroup
+noheader
+noheadings
+nohires
+noids
+noimage
+noimageredirect
+noimages
+noinclude
+noindex
+noindexing
+nointerwikipage
+nointerwikiuserrights
+noitem
+nojs
+nolabel
+nolang
+nolicense
+nolimit
+nolink
+nolinkstoimage
+nologging
+nologin
+nomahaction
+nominornewtalk
+nomodule
+non
+noname
+nonamespacenumber
+nonascii
+noncascading
+nondefaults
+none
+nonewsectionlink
+nonexistent
+nonfile
+nonfilenamespace
+nonincludable
+noninfringement
+noninitial
+nonlocal
+nonote
+nonredirects
+nonsense
+nonunicodebrowser
+noobjective
+noofexpiries
+noofprotections
+noop
+nooptions
+nooverride
+nopaction
+nopage
+nopageid
+nopagetext
+nopagetitle
+noparser
+nopathinfo
+nopermission
+noport
+noprefix
+noproject
+noprop
+noprotections
+noquestion
+noradius
+noratelimit
+norating
+norcid
+noread
+noreason
+noredir
+noredirect
+norequest
+norestrictiontypes
+noresult
+noreturnto
+norev
+norevid
+noreviewed
+normalizedtitle
+norole
+norollbackdiff
+noscale
+noschema
+noscript
+nosearch
+nosectiontitle
+nosession
+noshade
+noskipnotif
+noslash
+nosniff
+nosort
+nosortdirection
+nosource
+nospecialpagetext
+nost
+nosubaction
+nosubject
+nosubpage
+nosubpages
+nosuccess
+nosuchaction
+nosuchactiontext
+nosuchdatabase
+nosuchlogid
+nosuchpageid
+nosuchrcid
+nosuchrevid
+nosuchsection
+nosuchsectiontext
+nosuchsectiontitle
+nosuchspecialpage
+nosuchuser
+nosuchusershort
+nosummary
+notacceptable
+notag
+notaglist
+notalk
+notallowed
+notanarticle
+notarget
+notcached
+notdeleted
+note
+notempdir
+notemplate
+notext
+nothumb
+notif
+notificationtimestamp
+notificationtimestamps
+notin
+notitle
+notitleconvert
+notloggedin
+notminor
+noto
+notoc
+notoggle
+notoken
+notransform
+notreviewable
+notrustworthy
+notspecialpage
+notsuspended
+notvisiblerev
+notwatched
+notwikitext
+notype
+noudp
+noupdates
+nouploadmodule
+nouser
+nouserid
+nousername
+nouserspecified
+novalues
+noview
+nowatchlist
+nowellwritten
+nowiki
+nowlocal
+nowserver
+nparsing
+ns
+nsassociated
+nsfrom
+nsinvert
+nslinks
+nslist
+nsname
+nsnum
+nspname
+nsselect
+nstab
+nsub
+ntfs
+ntilde
+ntitle
+nuke
+null
+nullable
+numauthors
+number
+numberheadings
+numberingroup
+numberof
+numberofactiveusers
+numberofadmins
+numberofarticles
+numberofedits
+numberoffiles
+numberofpages
+numberofusers
+numberofviews
+numberofwatchingusers
+numedits
+numentries
+numericized
+numgroups
+numtalkauthors
+numtalkedits
+numwatchers
+nwidth
+oacute
+objectcache
+objective
+ocirc
+ocount
+oelig
+of
+officedocument
+offset
+offsite
+ofname
+ogevents
+ogghandler
+ograve
+old
+oldaddr
+oldcountable
+older
+olderror
+oldfile
+oldgroups
+oldid
+oldimage
+oldlen
+oldnamespace
+oldquery
+oldrev
+oldrevid
+oldreviewedpages
+oldshared
+oldsig
+oldsize
+oldtext
+oldtitle
+oldtitlemsg
+oline
+oname
+onkeyup
+online
+onload
+onlyauthor
+onlyinclude
+onlypst
+onlyquery
+onsubmit
+onthisday
+ontop
+openbasedir
+opendoc
+opendocument
+opensearch
+opensearchdescription
+openssl's
+openxml
+openxmlformats
+oplus
+oppositedm
+optgroup
+optgroups
+optionname
+options
+optionstoken
+optionvalue
+optstack
+or
+ordertype
+ordf
+ordm
+org
+origcategory
+ortime
+oslash
+other
+otherlanguages
+otherlist
+otheroption
+otherreason
+othertime
+otilde
+otimes
+otitle
+ouml
+outparam
+outputter
+outputtype
+outreachwiki
+over
+overridable
+override
+oversight
+oversighted
+oversighter
+overwrite
+overwroteimage
+own
+owner
+paction
+page
+pagecannotexist
+pagecategories
+pagecategorieslink
+pageclass
+pagecontent
+pagecount
+pagecss
+pagedeleted
+pagedlinks
+pageid
+pageids
+pageimages
+pageinfo
+pagelink
+pagelinks
+pagemerge
+pagename
+pagenamee
+pagenames
+pagenum
+pageoffset
+pagepropnames
+pageprops
+pagerestrictions
+pages
+pageselector
+pageset
+pagesetmodule
+pagesincategory
+pagesinnamespace
+pageswithprop
+pagetextmsg
+pagetitle
+pagetools
+pagetriage
+pagetriageaction
+pagetriagelist
+pagetriagestats
+pagetriagetagging
+pagetriagetemplate
+pageurl
+pageview
+param
+parameters
+paraminfo
+paramlist
+paramname
+params
+paren
+parens
+parentid
+parenttree
+parms
+parse
+parsedcomment
+parseddescription
+parsedsummary
+parseerror
+parseinline
+parsemag
+parser
+parsercache
+parserfuncs
+parserfunctions
+parserhook
+parserrender
+parsetree
+parsevalue
+parsoid
+partialupload
+partname
+pass's
+passthru
+password
+passwordfor
+passwordreset
+passwordtooshort
+paste
+pastexpiry
+pathchar
+pathinfo
+pathname
+patrol
+patroldisabled
+patrolled
+patrollink
+patrolmarks
+patroltoken
+pattern
+pcache
+pcntl
+pcomment
+pdbk
+pdf's
+pendingdelta
+perc
+perfcached
+perfcachedts
+perm
+perma
+permalink
+permdenied
+permil
+permissiondenied
+permissionerror
+permissionserrors
+permissionserrorstext
+permissiontype
+perp
+perrow
+pgsql
+photoshop
+php
+php's
+phpfm
+phps
+phpsapi
+phpunit
+phpversion
+phpwiki
+phrasewise
+phtml
+pi
+pipermail
+pixmap
+pkey
+pkuk
+pl
+plain
+plainlink
+plainlinks
+plaintext
+plfrom
+plink
+pllimit
+plns
+plpgsql
+pltitle
+pltitles
+plusminus
+plusmn
+pname
+pnmtojpeg
+pnmtopng
+poolcounter
+popts
+popularpages
+portlet
+portlets
+posplus
+possible
+postcomment
+postgre
+postsep
+potd
+potm
+potx
+poweredby
+poweredbyico
+powersearch
+pp
+ppam
+ppsm
+ppsx
+pptm
+pptx
+precaching
+precompiled
+preferences
+preferencestoken
+prefill
+prefilled
+prefix
+prefixindex
+prefixsearchdisabled
+prefs
+prefsection
+prefsnologin
+prefsnologintext
+prefsubmit
+preload
+preloads
+preloadtitle
+prepending
+prependtext
+preprocess
+preprocessing
+preprocessors
+presentationml
+presep
+prevchar
+prevdiff
+previd
+previewconflict
+previewhead
+previewheader
+previewnote
+previewonfirst
+previewontop
+previewtext
+previousrevision
+prevlink
+prevn
+prexpiry
+prfiltercascade
+prfx
+primary
+printableversion
+printfooter
+printurl
+privacypage
+private
+privs
+prlevel
+probabalistically
+probs
+proc
+processings
+procs
+prodromou
+profession
+profileinfo
+programmatically
+project
+projectpage
+promotion
+prop
+properties
+property
+propname
+props
+prot
+protect
+protectcomment
+protectedarticle
+protectedinterface
+protectednamespace
+protectedpage
+protectedpages
+protectedpagetext
+protectedpagewarning
+protectedtitle
+protectedtitles
+protection
+protections
+protectlevel
+protectlogpage
+protectlogtext
+protectthispage
+protecttoken
+proto
+protocol
+protocols
+protos
+proxied
+proxyblocker
+proxyblockreason
+proxyunbannable
+prtype
+psir
+pst
+psttext
+psychedelix
+pt
+ptext
+ptool
+pubdate
+publicsuffix
+publishfailed
+punycode
+purge
+purged
+qabardjajəbza
+qbar
+qbsettings
+qmoicj
+qp
+quasit
+query
+querycache
+querycachetwo
+querycur
+querydiff
+querykey
+querymodule
+querymodules
+querypage
+querypages
+querystring
+querytype
+question
+queuefull
+quickbar
+quicktemplate
+quicktime
+qunit
+quux
+qvalues
+rabdiff
+radic
+radius
+raggett
+raii
+raimond
+random
+randompage
+randomredirect
+randstr
+range
+rangeblock
+rangeblocks
+rangedisabled
+rangeend
+rangestart
+raquo
+rarr
+rarticle
+rasterizations
+rasterize
+rasterized
+rasterizer
+ratelimited
+ratelimits
+rating
+ratings
+raw
+rawfm
+rawrow
+rbspan
+rc
+rcdays
+rceil
+rcfeed
+rcid
+rcids
+rclimit
+rcoptions
+rcpatroldisabled
+rctitle
+rctoken
+rdev
+rdfa
+rdfrom
+rdftype
+rdquo
+read
+readable
+readapidenied
+readarray
+reader
+readline
+readonlyreason
+readonlytext
+readonlywarning
+readrequired
+readrights
+realaudio
+realllly
+realname
+realpath
+reason
+reasonlist
+reasonstr
+reblock
+rebuildtextindex
+recache
+recached
+recaching
+recalc
+recentchange
+recentchanges
+recentchangescount
+recentchangesdays
+recentchangeslinked
+recentchangestext
+recenteditcount
+recentedits
+recip
+recips
+recreate
+recurse
+recurses
+redir
+redirect
+redirectable
+redirectcreated
+redirectedfrom
+redirections
+redirectpagesub
+redirectparams
+redirects
+redirectsnippet
+redirectstofile
+redirecttitle
+redirectto
+redirid
+redirlinks
+redirs
+redis
+redlink
+redlinks
+redocument
+reedyboy
+reenables
+reencode
+reference
+refetch
+refresheducation
+refreshlinks
+regexes
+regexlike
+region
+registered
+registration
+registrationdate
+reimport
+reindexation
+reindexed
+releasenotes
+relevance
+relevant
+relicense
+relimit
+relkind
+relname
+relnamespace
+remarticle
+remembermypassword
+rememberpassword
+removablegroups
+removal
+remove
+removed
+removedwatchtext
+removetags
+remreviewer
+remstudent
+renameuser
+renaming
+renderable
+renormalized
+repeating
+repl
+replaceafter
+replacer
+replacers
+replag
+replyto
+reporttime
+repos
+request
+requested
+requestid
+requeue
+required
+rerender
+rerendered
+rescnt
+researcher
+resends
+reset
+resetkinds
+resetlink
+resetpass
+resized
+resolutioninfo
+resolutionunit
+resolve
+resolved
+resourceloader
+responsecode
+restore
+restorelink
+restoreprefs
+restricted
+result
+resultset
+resultsperpage
+retrievedfrom
+returnto
+returntoquery
+retval
+reupload
+revalidate
+revalidation
+revdel
+revdelete
+revdelete'd
+revdelundel
+revert
+reverting
+revertpage
+reverts
+revid
+revids
+review
+reviewactivity
+reviewed
+reviewer
+reviewing
+revision
+revisionasof
+revisionday
+revisiondelete
+revisionid
+revisionmonth
+revisions
+revisiontext
+revisiontimestamp
+revisionuser
+revisionyear
+revlink
+revwrongpage
+rfloor
+rgba
+richtext
+rights
+rightscode
+rightsinfo
+rightslog
+rightslogtext
+rked
+rmdir
+rn
+rnlimit
+robotstxt
+roff
+role
+rollback
+rollbacker
+rollbacklink
+rollbacklinkcount
+rollbacktoken
+rootpage
+rootuserpages
+rowcount
+rown
+rownum
+rowsarr
+rowset
+rowspan
+rowspans
+rsaquo
+rsargs
+rsd
+rsdf
+rsquo
+rss
+rsvg
+ruleset
+rulesets
+rusyn
+rv
+rvcontinue
+rvdiffto
+rvlimit
+rvparse
+rvprop
+rvstart
+rvstartid
+rvtoken
+sabino
+safemode
+safesubst
+sais
+sameorigin
+samp
+sansserif
+save
+savearticle
+savedprefs
+saveprefs
+saveusergroups
+sawfish
+sbin
+sbquo
+scaler
+scalers
+scaron
+score
+screensize
+scribunto
+scriptable
+scriptbuilder
+scriptpath
+scrolltop
+sdot
+search
+search's
+searchaction
+searcharticle
+searchboxes
+searchbutton
+searcheverything
+searchform
+searchindex
+searchinfo
+searchlimit
+searchmenu
+searchnamespaces
+searchoptions
+searchresulttext
+searchstring
+searchtitle
+secondary
+section
+sectionanchor
+sectionedit
+sectioneditnotsupported
+sectionformat
+sectionnumber
+sectionprop
+sections
+sectionsnippet
+sectionsnotsupported
+sectiontitle
+securelogin
+seiten
+selectandother
+selectorother
+self
+selflink
+selfmove
+semiglobal
+semiprotected
+semiprotectedpagewarning
+sendemail
+sendmail
+sentences
+serialize
+servedby
+servername
+servertime
+serverurl
+sess
+session
+sessionfailure
+sessionid
+sessionkey
+setchange
+setcookie
+setemail
+setext
+setglobalaccountstatus
+setnewtype
+setnotificationtimestamp
+setopt
+setrename
+setrlimit
+setstatus
+sha
+shar
+sharding
+shared
+shareddescriptionfollows
+sharedfile
+sharedrepo
+sharedupload
+shellscript
+shiftwidth
+shockwave
+short
+shorturl
+shouldn
+shouting
+show
+showalldb
+showbots
+showdeleted
+showdiff
+showdifflinks
+showfilename
+showhiddencats
+showhideminor
+showhooks
+showingresults
+showinitializer
+showjumplinks
+showlinkedto
+showme
+showmeta
+shownavigation
+shownumberswatching
+showpreview
+showredirs
+showreviewed
+showsizediff
+showtoc
+showtoolbar
+showunreviewed
+shtml
+si
+siebrand
+sighhhh
+sigkill
+sigmaf
+signup
+sigsegv
+sigterm
+sii
+siit
+siiurlwidth
+simplesearch
+singlegroup
+singularthey
+sinumberingroup
+siprop
+site
+siteadmin
+sitecsspreview
+sitedir
+siteinfo
+sitejspreview
+sitemap
+sitemaps
+sitematrix
+sitename
+sitenotice
+siteprop
+sitesearch
+sitestats
+sitestatsupdate
+siteuser
+sitewide
+size
+sizediff
+sizediffdisabled
+sizes
+skey
+skinclass
+skinkey
+skinname
+skinnameclass
+skins
+skipcache
+skipcaptcha
+skipnotif
+skname
+sktemplate
+slideshow
+sm
+smaxage
+smil
+smtp
+snippet
+sodipodi
+softtabstop
+solaris
+somecontent
+somefeed
+someuser
+sorani
+sorbs
+sorbsreason
+sort
+sortdirection
+sortkey
+sortkeyprefix
+sortkeys
+source
+soxred
+spam
+spamdetected
+spamprotected
+spamprotectionmatch
+spamprotectiontext
+spamprotectiontitle
+spcontent
+special
+specialpage
+specialpagealiases
+specialpageattributes
+specialpagegroup
+specialpages
+specialprotected
+speedtip
+speedy
+speex
+spekking
+spellcheck
+spezial
+spoofable
+spreadsheetml
+sprefs
+sprintf
+sprotected
+sql's
+sqlite
+sqltotal
+sr
+srchres
+srcset
+srgs
+srprop
+srwhat
+stabilize
+stable
+stablesettings
+stansvik
+start
+startid
+startime
+startsortkey
+startsortkeyprefix
+starttime
+starttimestamp
+stash
+stashfailed
+stashimageinfo
+state
+staticredirect
+statistics
+statline
+status
+statuskey
+stdclass
+stdout
+steward
+stopwords
+storedversion
+strcasecmp
+strcmp
+string
+stripos
+stripslashes
+strlen
+strpos
+strrpos
+strtime
+strtok
+strtolower
+strtotime
+strtr
+struct
+strval
+stubthreshold
+student
+studies
+stuffit
+stxt
+stylename
+stylepath
+styleversion
+subaction
+subarray
+subcat
+subcats
+subclassing
+subcond
+subconds
+subdir
+subdomain
+subdomains
+sube
+subelement
+subelements
+subfunction
+subfunctions
+subimages
+subitem
+subitems
+subject
+subjectid
+subjectids
+subjectpagename
+subjectpagenamee
+subjectspace
+subjectspacee
+subkey
+subkeys
+sublevels
+submatch
+submodule
+submodule's
+submodules
+subnet
+subpage
+subpagename
+subpagenamee
+subpages
+subpagestr
+subparents
+subprocesses
+subsql
+substr
+succ
+success
+successbox
+suckage
+suggest
+suggestion
+suhosin
+suhosin's
+summ
+summary
+summarymissed
+summaryrequired
+supe
+superdomain
+superglobals
+superset
+suppress
+suppressed
+suppressedredirect
+suppressionlog
+suppressionlogtext
+suppressredirect
+suppressrevision
+svgs
+svn
+svnroot
+sybase
+symlinked
+syms
+sysinfo
+sysop
+system
+systemnachrichten
+szdiff
+szlig
+szymon
+t
+tabindex
+tablealign
+tablecell
+tablename
+tablesorter
+tablestack
+tabletags
+tabletype
+tabstop
+tag
+tagfilter
+tagline
+taglist
+tags
+tagset
+tagstack
+tailorings
+talk
+talkable
+talkfrom
+talkid
+talkids
+talkmove
+talkmoveoverredirect
+talkpage
+talkpageheader
+talkpagelinktext
+talkpagename
+talkpagenamee
+talkpagetext
+talkspace
+talkspacee
+talkto
+taraškievica
+tarask
+target
+tb
+tbase
+tbody
+tboverride
+tcount
+tcsh
+tddate
+tdtime
+teardown
+telnet
+temp
+tempdir
+template
+templatelinks
+templatepage
+templates
+templatesused
+templatesusedpreview
+templatesusedsection
+tempname
+tempout
+test
+testclean
+testdata
+testmailuser
+testpass
+testrunner
+testswarm
+testuser
+testutf
+texi
+texinfo
+text
+textarea
+textareas
+textares
+textbox
+textboxsize
+texthidden
+textid
+textlink
+textmissing
+textoverride
+textsf
+textsize
+textvector
+texvc
+tfoot
+tful
+tg
+that'll
+thead
+thelink
+theora
+thetasym
+thinsp
+thisisdeleted
+thispage
+thumbborder
+thumbcaption
+thumberror
+thumbheight
+thumbhtml
+thumbimage
+thumbinner
+thumbmime
+thumbnail
+thumbnailing
+thumbnailsize
+thumbname
+thumbsize
+thumbtext
+thumburl
+thumbwidth
+timeago
+timeanddate
+timecond
+timecorrection
+timeframe
+timekey
+timeoffset
+timep
+timespans
+timestamp
+timestamps
+timestamptz
+timezonelegend
+timezoneregion
+timezoneuseoffset
+timezoneuseserverdefault
+tino
+title
+titleblacklist
+titleconversion
+titleexists
+titlemsg
+titleprefixeddbkey
+titleprotected
+titleprotectedwarning
+titles
+titlesnippet
+titletext
+titlevector
+tl
+tllimit
+tltemplates
+tmpfile
+to
+toclevel
+tocline
+tocnumber
+tocsection
+toctext
+toctitle
+tofragment
+toggle
+toid
+token
+tokenname
+tokens
+tolang
+tongminh
+toobig
+toofewexpiries
+toohigh
+toolarray
+toolbarparent
+toolboxend
+toolboxlink
+toolong
+toolow
+tooltiponly
+tooshort
+top
+toparse
+topbar
+toplevel
+toplinks
+toponly
+torev
+torevid
+tornevall
+torunblocked
+totalcnt
+totalcount
+totalhits
+totalmemory
+totaltime
+totitle
+touched
+tplarg
+transcludable
+transclude
+transcluded
+transcluding
+transclusion
+transclusions
+transcode
+transcodekey
+transcoder
+transcodereset
+transcodestatus
+transcoding
+translatewiki
+transstat
+transwiki
+troff
+true
+truespeed
+trustworthy
+truthy
+tsearch
+tsquery
+tuple
+tweakblogs
+tweakers
+txt
+txtfm
+type
+typemustmatch
+typeof
+typname
+tzstring
+uacute
+uarr
+uc
+ucfirst
+ucirc
+udpprofile
+ufffd
+ugrave
+ui
+uint
+ulimit
+ulink
+ulinks
+uname
+unanchored
+unapprove
+unary
+unattached
+unauthenticate
+unavailable
+unblock
+unblocklogentry
+unblockself
+unblocktoken
+unbuffered
+uncacheable
+uncached
+uncategorized
+unclosable
+uncompress
+undel
+undelete
+undeleted
+undeletion
+undo
+undoafter
+undofailure
+undorev
+unescape
+unescaped
+unfeature
+unfeatured
+unflag
+ungrouped
+unhelpful
+unhidden
+unhide
+unidata
+unindent
+unindexed
+uniq
+unique
+universaleditbutton
+unixtime
+unknown
+unknownerror
+unknownnamespace
+unlock
+unlockdb
+unlogged
+unmakesafe
+unmark
+unmerge
+unmodified
+unoversight
+unoversighted
+unpadded
+unpatrolled
+unpatrolledletter
+unprefixed
+unprintables
+unprotect
+unprotectedarticle
+unprotection
+unprotectthispage
+unredacted
+unrequest
+unrequested
+unresolve
+unresolved
+unreviewed
+unreviewedpages
+unsanitized
+unseed
+unserialization
+unserialize
+unserialized
+unserializing
+unsetting
+unstub
+unstubbed
+unstubbing
+unstubs
+unsupportednamespace
+unsupportedrepo
+untaint
+untracked
+untrustworthiness
+unused
+unusual
+unversioned
+unviewable
+unviewed
+unwatch
+unwatched
+unwatchedpages
+unwatching
+unwatchthispage
+unwikified
+unwritable
+upconvert
+updateddate
+updatedtime
+updatelog
+upgradedoc
+upgrader
+upload
+upload's
+uploaddisabled
+uploadedimage
+uploadjava
+uploadlogpage
+uploadlogpagetext
+uploadnewversion
+uploadnologintext
+uploadpage
+uploadscripted
+uploadsource
+uploadstash
+uploadvirus
+uppercased
+upsih
+urandom
+url
+url's
+urlaction
+urldecode
+urldecoded
+urlencode
+urlencoded
+urlheight
+urlparam
+urlparm
+urlpath
+urlvar
+urlwidth
+ursh
+us
+usedomain
+useemail
+uselang
+uselivepreview
+usemod
+usemsgcache
+usenewrc
+user
+useragent
+useragents
+userblock
+usercan
+usercontribs
+usercreate
+usercreated
+usercss
+usercsspreview
+usercssyoucanpreview
+userdailycontribs
+userdir
+userdoesnotexist
+usereditcount
+useredits
+useremail
+userexists
+usergroup
+usergroups
+userhidden
+userid
+userinfo
+userinvalidcssjstitle
+userips
+userjs
+userjsprev
+userjspreview
+userjsyoucanpreview
+userlang
+userlangattributes
+userlink
+userlinks
+userlogin
+userloginlink
+userloginprompt
+userlogout
+usermaildisabled
+usermessage
+username
+usernameless
+usernames
+userpage
+userpages
+userpageurl
+userprefix
+userrights
+userrightstoken
+users
+usersbody
+userspace
+usertalk
+usertalklink
+usertext
+usertoollinks
+useskin
+useto
+usort
+ustar
+ustoken
+utfnormal
+uuml
+validate
+validationbuilder
+valign
+vals
+value
+values
+vandal
+vandalism
+variables
+variant
+variantarticlepath
+varlang
+varname
+vars
+varval
+vasiliev
+vasilvv
+vbase
+vbscript
+vcount
+vcsize
+venema's
+verbosify
+version
+versioning
+versionlink
+versionlog
+versionrequired
+versionrequiredtext
+very
+vhost
+vi
+vibber
+videoinfo
+view
+viewcount
+viewdeleted
+viewhelppage
+viewmyprivateinfo
+viewmywatchlist
+viewprevnext
+viewsource
+viewsourcelink
+viewsourcetext
+viewvc
+viewyourtext
+visible
+visualeditor
+viurlwidth
+voff
+vofp
+voicexml
+vorbis
+vpad
+vrml
+vslow
+vvcv
+vxml
+wais
+wait
+wakeup
+walltime
+warmup
+warning
+wasdeleted
+wasn
+watch
+watchcreations
+watchdefault
+watchdeletion
+watched
+watchlist
+watchlistdays
+watchlisthideanons
+watchlisthidebots
+watchlisthideliu
+watchlisthideminor
+watchlisthideown
+watchlisthidepatrolled
+watchlistraw
+watchlists
+watchlisttoken
+watchmoves
+watchthis
+watchthispage
+watchtoken
+watchuser
+wb
+wbmp
+wbxml
+wddx
+wddxfm
+weblog
+webm
+webp
+webrequest
+webserver
+weeks
+weierp
+weight
+wellwritten
+werdna
+wget
+what
+whatlinkshere
+whatwg
+wheely
+wheter
+whitelist
+whitelisted
+whitelistedittext
+whitelisting
+whois
+wicke
+width
+widthx
+wierkosz
+wietse
+wiki
+wiki'd
+wiki's
+wikia
+wikiadmin
+wikibase
+wikibits
+wikibooks
+wikidb
+wikifarm
+wikiid
+wikilink
+wikilinks
+wikilove
+wikiloveimagelog
+wikimedia
+wikimediacommons
+wikipage
+wikipedia
+wikipedian
+wikipedias
+wikis
+wikisyntax
+wikitable
+wikitables
+wikitech
+wikitext
+wikiuser
+wiktionary
+wincache
+wininet
+withaccess
+withaction
+witheditsonly
+withlanglinks
+withoutlanglinks
+wl
+wlallrev
+wldir
+wlend
+wlexcludeuser
+wllimit
+wlowner
+wlprop
+wltoken
+wmf's
+wml
+wmlc
+wmls
+wmlsc
+wmlscript
+wmlscriptc
+wordcount
+wordprocessingml
+wordwg
+workalike
+worldwind
+wouldn
+wr
+writeapi
+writeapidenied
+writedisabled
+writerequired
+writerights
+wrongpassword
+x
+xbitmap
+xcache
+xcancel
+xdebug
+xdiff
+xdomain
+xdomains
+xff
+xhtmldefaultnamespace
+xhtmlnamespaces
+xiff
+xlam
+xlsb
+xlsm
+xlsx
+xltm
+xltx
+xml
+xmldoublequote
+xmlfm
+xmlimport
+xmlns
+xmlsafe
+xmlselect
+xor
+xpinstall
+xpixmap
+xpsdocument
+xtended
+xwindowdump
+xxxx
+xxxxx
+yacute
+yaml
+yamlfm
+year
+yes
+youhavenewmessages
+youhavenewmessagesfromusers
+youhavenewmessagesmanyusers
+youhavenewmessagesmulti
+yourdiff
+yourdomainname
+youremail
+yourgender
+yourinternal
+yourlanguage
+yourname
+yournick
+yourpassword
+yourrealname
+yourtext
+yourvariant
+yourwiki
+yuml
+yyyymmddhhiiss
+zhdaemon
+zhengzhu
+zhtable
+zijdel
+zlib
+zoffset
+zwnj
diff --git a/maintenance/doMaintenance.php b/maintenance/doMaintenance.php
index 15b00167..3bd508cb 100644
--- a/maintenance/doMaintenance.php
+++ b/maintenance/doMaintenance.php
@@ -34,7 +34,7 @@ if ( !defined( 'RUN_MAINTENANCE_IF_MAIN' ) ) {
// 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' ) {
+if ( !Maintenance::shouldExecute() && $maintClass != 'CommandLineInc' ) {
return;
}
@@ -53,27 +53,29 @@ $maintenance->setup();
// to $maintenance->mSelf. Keep that here for b/c
$self = $maintenance->getName();
-// Detect compiled mode
-if ( isset( $_SERVER['MW_COMPILED'] ) ) {
- define( 'MW_COMPILED', 1 );
-} else {
- # Get the MWInit class
- require_once( "$IP/includes/Init.php" );
- require_once( "$IP/includes/AutoLoader.php" );
-}
-
+# Start the autoloader, so that extensions can derive classes from core files
+require_once "$IP/includes/AutoLoader.php";
# Stub the profiler
-require_once( MWInit::compiledPath( 'includes/profiler/Profiler.php' ) );
+require_once "$IP/includes/profiler/Profiler.php";
+
+# Start the profiler
+$wgProfiler = array();
+if ( file_exists( "$IP/StartProfiler.php" ) ) {
+ require "$IP/StartProfiler.php";
+}
// Some other requires
-if ( !defined( 'MW_COMPILED' ) ) {
- require_once( "$IP/includes/Defines.php" );
+require_once "$IP/includes/Defines.php";
+require_once "$IP/includes/DefaultSettings.php";
+
+# Load composer's autoloader if present
+if ( is_readable( "$IP/vendor/autoload.php" ) ) {
+ require_once "$IP/vendor/autoload.php";
}
-require_once( MWInit::compiledPath( 'includes/DefaultSettings.php' ) );
if ( defined( 'MW_CONFIG_CALLBACK' ) ) {
# Use a callback function to configure MediaWiki
- MWFunction::call( MW_CONFIG_CALLBACK );
+ call_user_func( MW_CONFIG_CALLBACK );
} else {
if ( file_exists( "$IP/../wmf-config/wikimedia-mode" ) ) {
// Load settings, using wikimedia-mode if needed
@@ -82,25 +84,26 @@ if ( defined( 'MW_CONFIG_CALLBACK' ) ) {
# Maybe a hook?
global $cluster;
$cluster = 'pmtpa';
- require( MWInit::interpretedPath( '../wmf-config/wgConf.php' ) );
+ require "$IP/../wmf-config/wgConf.php";
}
// Require the configuration (probably LocalSettings.php)
- require( $maintenance->loadSettings() );
+ require $maintenance->loadSettings();
}
if ( $maintenance->getDbType() === Maintenance::DB_ADMIN &&
is_readable( "$IP/AdminSettings.php" ) )
{
- require( MWInit::interpretedPath( 'AdminSettings.php' ) );
+ require "$IP/AdminSettings.php";
}
if ( $maintenance->getDbType() === Maintenance::DB_NONE ) {
- if ( $wgLocalisationCacheConf['storeClass'] === false && ( $wgLocalisationCacheConf['store'] == 'db' || ( $wgLocalisationCacheConf['store'] == 'detect' && !$wgCacheDirectory ) ) )
+ if ( $wgLocalisationCacheConf['storeClass'] === false && ( $wgLocalisationCacheConf['store'] == 'db' || ( $wgLocalisationCacheConf['store'] == 'detect' && !$wgCacheDirectory ) ) ) {
$wgLocalisationCacheConf['storeClass'] = 'LCStore_Null';
+ }
}
$maintenance->finalSetup();
// Some last includes
-require_once( MWInit::compiledPath( 'includes/Setup.php' ) );
+require_once "$IP/includes/Setup.php";
// Much much faster startup than creating a title object
$wgTitle = null;
@@ -123,6 +126,6 @@ try {
$factory->commitMasterChanges();
$factory->shutdown();
} catch ( MWException $mwe ) {
- echo( $mwe->getText() );
+ echo $mwe->getText();
exit( 1 );
}
diff --git a/maintenance/dumpBackup.php b/maintenance/dumpBackup.php
index c9546c60..25a777cd 100644
--- a/maintenance/dumpBackup.php
+++ b/maintenance/dumpBackup.php
@@ -27,10 +27,10 @@
$originalDir = getcwd();
-$optionsWithArgs = array( 'pagelist', 'start', 'end', 'revstart', 'revend');
+$optionsWithArgs = array( 'pagelist', 'start', 'end', 'revstart', 'revend' );
-require_once( __DIR__ . '/commandLine.inc' );
-require_once( __DIR__ . '/backup.inc' );
+require_once __DIR__ . '/commandLine.inc';
+require_once __DIR__ . '/backup.inc';
$dumper = new BackupDumper( $argv );
@@ -44,8 +44,8 @@ if ( isset( $options['pagelist'] ) ) {
$pages = file( $options['pagelist'] );
chdir( $olddir );
if ( $pages === false ) {
- echo( "Unable to open file {$options['pagelist']}\n" );
- die(1);
+ echo "Unable to open file {$options['pagelist']}\n";
+ die( 1 );
}
$pages = array_map( 'trim', $pages );
$dumper->pages = array_filter( $pages, create_function( '$x', 'return $x !== "";' ) );
@@ -79,7 +79,7 @@ if ( isset( $options['full'] ) ) {
$dumper->dump( WikiExporter::STABLE, $textMode );
} elseif ( isset( $options['logs'] ) ) {
$dumper->dump( WikiExporter::LOGS );
-} elseif ( isset($options['revrange'] ) ) {
+} elseif ( isset( $options['revrange'] ) ) {
$dumper->dump( WikiExporter::RANGE, $textMode );
} else {
$dumper->progress( <<<ENDS
diff --git a/maintenance/dumpIterator.php b/maintenance/dumpIterator.php
index 870d6321..dd468a9f 100644
--- a/maintenance/dumpIterator.php
+++ b/maintenance/dumpIterator.php
@@ -26,7 +26,7 @@
* @ingroup Maintenance
*/
-require_once( __DIR__ . '/Maintenance.php' );
+require_once __DIR__ . '/Maintenance.php';
/**
* Base class for interating over a dump.
@@ -47,13 +47,13 @@ abstract class DumpIterator extends Maintenance {
}
public function execute() {
- if (! ( $this->hasOption('file') ^ $this->hasOption('dump') ) ) {
- $this->error("You must provide a file or dump", true);
+ if ( !( $this->hasOption( 'file' ) ^ $this->hasOption( 'dump' ) ) ) {
+ $this->error( "You must provide a file or dump", true );
}
$this->checkOptions();
- if ( $this->hasOption('file') ) {
+ if ( $this->hasOption( 'file' ) ) {
$revision = new WikiRevision;
$revision->setText( file_get_contents( $this->getOption( 'file' ) ) );
@@ -64,10 +64,10 @@ abstract class DumpIterator extends Maintenance {
$this->startTime = microtime( true );
- if ( $this->getOption('dump') == '-' ) {
+ if ( $this->getOption( 'dump' ) == '-' ) {
$source = new ImportStreamSource( $this->getStdin() );
} else {
- $this->error("Sorry, I don't support dump filenames yet. Use - and provide it on stdin on the meantime.", true);
+ $this->error( "Sorry, I don't support dump filenames yet. Use - and provide it on stdin on the meantime.", true );
}
$importer = new WikiImporter( $source );
@@ -81,9 +81,10 @@ abstract class DumpIterator extends Maintenance {
$this->conclusions();
$delta = microtime( true ) - $this->startTime;
- $this->error( "Done {$this->count} revisions in " . round($delta, 2) . " seconds " );
- if ($delta > 0)
- $this->error( round($this->count / $delta, 2) . " pages/sec" );
+ $this->error( "Done {$this->count} revisions in " . round( $delta, 2 ) . " seconds " );
+ if ( $delta > 0 ) {
+ $this->error( round( $this->count / $delta, 2 ) . " pages/sec" );
+ }
# Perform the memory_get_peak_usage() when all the other data has been output so there's no damage if it dies.
# It is only available since 5.2.0 (since 5.2.1 if you haven't compiled with --enable-memory-limit)
@@ -96,7 +97,7 @@ abstract class DumpIterator extends Maintenance {
if ( $this->getDbType() == Maintenance::DB_NONE ) {
global $wgUseDatabaseMessages, $wgLocalisationCacheConf, $wgHooks;
$wgUseDatabaseMessages = false;
- $wgLocalisationCacheConf['storeClass'] = 'LCStore_Null';
+ $wgLocalisationCacheConf['storeClass'] = 'LCStore_Null';
$wgHooks['InterwikiLoadPrefix'][] = 'DumpIterator::disableInterwikis';
}
}
@@ -122,9 +123,10 @@ abstract class DumpIterator extends Maintenance {
$this->count++;
if ( isset( $this->from ) ) {
- if ( $this->from != $title )
+ if ( $this->from != $title ) {
return;
- $this->output( "Skipped " . ($this->count - 1) . " pages\n" );
+ }
+ $this->output( "Skipped " . ( $this->count - 1 ) . " pages\n" );
$this->count = 1;
$this->from = null;
@@ -175,4 +177,4 @@ class SearchDump extends DumpIterator {
}
$maintClass = "SearchDump";
-require_once( RUN_MAINTENANCE_IF_MAIN );
+require_once RUN_MAINTENANCE_IF_MAIN;
diff --git a/maintenance/dumpLinks.php b/maintenance/dumpLinks.php
index 08aae295..be0b4633 100644
--- a/maintenance/dumpLinks.php
+++ b/maintenance/dumpLinks.php
@@ -30,7 +30,7 @@
* @ingroup Maintenance
*/
-require_once( __DIR__ . '/Maintenance.php' );
+require_once __DIR__ . '/Maintenance.php';
/**
* Maintenance script that generates a plaintext link dump.
@@ -63,16 +63,17 @@ class DumpLinks extends Maintenance {
$this->output( "\n" );
}
$page = Title::makeTitle( $row->page_namespace, $row->page_title );
- $this->output( $page->getPrefixedUrl() );
+ $this->output( $page->getPrefixedURL() );
$lastPage = $row->page_id;
}
$link = Title::makeTitle( $row->pl_namespace, $row->pl_title );
- $this->output( " " . $link->getPrefixedUrl() );
+ $this->output( " " . $link->getPrefixedURL() );
}
- if ( isset( $lastPage ) )
+ if ( isset( $lastPage ) ) {
$this->output( "\n" );
+ }
}
}
$maintClass = "DumpLinks";
-require_once( RUN_MAINTENANCE_IF_MAIN );
+require_once RUN_MAINTENANCE_IF_MAIN;
diff --git a/maintenance/dumpSisterSites.php b/maintenance/dumpSisterSites.php
index e05e154e..5f0c5b7c 100644
--- a/maintenance/dumpSisterSites.php
+++ b/maintenance/dumpSisterSites.php
@@ -25,7 +25,7 @@
* @ingroup Maintenance
*/
-require_once( __DIR__ . '/Maintenance.php' );
+require_once __DIR__ . '/Maintenance.php';
/**
* Maintenance script that generates a page name dump for SisterSites usage.
@@ -43,14 +43,15 @@ class DumpSisterSites extends Maintenance {
$dbr->bufferResults( false );
$result = $dbr->select( 'page',
array( 'page_namespace', 'page_title' ),
- array( 'page_namespace' => NS_MAIN,
- 'page_is_redirect' => 0,
+ array(
+ 'page_namespace' => NS_MAIN,
+ 'page_is_redirect' => 0,
),
__METHOD__ );
foreach ( $result as $row ) {
$title = Title::makeTitle( $row->page_namespace, $row->page_title );
- $url = $title->getFullUrl();
+ $url = $title->getFullURL();
$text = $title->getPrefixedText();
$this->output( "$url $text\n" );
}
@@ -58,4 +59,4 @@ class DumpSisterSites extends Maintenance {
}
$maintClass = "DumpSisterSites";
-require_once( RUN_MAINTENANCE_IF_MAIN );
+require_once RUN_MAINTENANCE_IF_MAIN;
diff --git a/maintenance/dumpTextPass.php b/maintenance/dumpTextPass.php
index 2e0d03b1..5d783cb9 100644
--- a/maintenance/dumpTextPass.php
+++ b/maintenance/dumpTextPass.php
@@ -26,8 +26,8 @@
$originalDir = getcwd();
-require_once( __DIR__ . '/commandLine.inc' );
-require_once( __DIR__ . '/backupTextPass.inc' );
+require_once __DIR__ . '/commandLine.inc';
+require_once __DIR__ . '/backupTextPass.inc';
$dumper = new TextPassDumper( $argv );
diff --git a/maintenance/dumpUploads.php b/maintenance/dumpUploads.php
index 0d0dfcf3..1a9293cb 100644
--- a/maintenance/dumpUploads.php
+++ b/maintenance/dumpUploads.php
@@ -21,7 +21,7 @@
* @ingroup Maintenance
*/
-require_once( __DIR__ . '/Maintenance.php' );
+require_once __DIR__ . '/Maintenance.php';
/**
* Maintenance script to dump a the list of files uploaded,
@@ -125,4 +125,4 @@ By default, outputs relative paths against the parent directory of \$wgUploadDir
}
$maintClass = "UploadDumper";
-require_once( RUN_MAINTENANCE_IF_MAIN );
+require_once RUN_MAINTENANCE_IF_MAIN;
diff --git a/maintenance/edit.php b/maintenance/edit.php
index 93fc3e79..7c24f0fa 100644
--- a/maintenance/edit.php
+++ b/maintenance/edit.php
@@ -21,7 +21,7 @@
* @ingroup Maintenance
*/
-require_once( __DIR__ . '/Maintenance.php' );
+require_once __DIR__ . '/Maintenance.php';
/**
* Maintenance script to make a page edit.
@@ -52,6 +52,8 @@ class EditCLI extends Maintenance {
$noRC = $this->hasOption( 'no-rc' );
$wgUser = User::newFromName( $userName );
+ $context = RequestContext::getMain();
+ $context->setUser( $wgUser );
if ( !$wgUser ) {
$this->error( "Invalid username", true );
}
@@ -63,6 +65,7 @@ class EditCLI extends Maintenance {
if ( !$wgTitle ) {
$this->error( "Invalid title", true );
}
+ $context->setTitle( $wgTitle );
$page = WikiPage::factory( $wgTitle );
@@ -92,4 +95,4 @@ class EditCLI extends Maintenance {
}
$maintClass = "EditCLI";
-require_once( RUN_MAINTENANCE_IF_MAIN );
+require_once RUN_MAINTENANCE_IF_MAIN;
diff --git a/maintenance/eraseArchivedFile.php b/maintenance/eraseArchivedFile.php
new file mode 100644
index 00000000..1c3f0376
--- /dev/null
+++ b/maintenance/eraseArchivedFile.php
@@ -0,0 +1,119 @@
+<?php
+/**
+ * Delete archived (non-current) files from storage
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with this program; if not, write 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 Aaron Schulz
+ */
+
+require_once __DIR__ . '/Maintenance.php';
+
+/**
+ * Maintenance script to delete archived (non-current) files from storage.
+ *
+ * @TODO: Maybe add some simple logging
+ *
+ * @ingroup Maintenance
+ * @since 1.22
+ */
+class EraseArchivedFile extends Maintenance {
+ public function __construct() {
+ parent::__construct();
+ $this->mDescription = "Erases traces of deleted files.";
+ $this->addOption( 'delete', 'Perform the deletion' );
+ $this->addOption( 'filename', 'File name', false, true );
+ $this->addOption( 'filekey', 'File storage key (with extension) or "*"', true, true );
+ }
+
+ public function execute() {
+ if ( !$this->hasOption( 'delete' ) ) {
+ $this->output( "Use --delete to actually confirm this script\n" );
+ }
+
+ $filekey = $this->getOption( 'filekey' );
+ $filename = $this->getOption( 'filename' );
+
+ if ( $filekey === '*' ) { // all versions by name
+ if ( !strlen( $filename ) ) {
+ $this->error( "Missing --filename parameter.", 1 );
+ }
+ $afile = false;
+ } else { // specified version
+ $dbw = wfGetDB( DB_MASTER );
+ $row = $dbw->selectRow( 'filearchive', '*',
+ array( 'fa_storage_group' => 'deleted', 'fa_storage_key' => $filekey ),
+ __METHOD__ );
+ if ( !$row ) {
+ $this->error( "No deleted file exists with key '$filekey'.", 1 );
+ }
+ $filename = $row->fa_name;
+ $afile = ArchivedFile::newFromRow( $row );
+ }
+
+ $file = wfLocalFile( $filename );
+ if ( $file->exists() ) {
+ $this->error( "File '$filename' is still a public file, use the delete form.\n", 1 );
+ }
+
+ $this->output( "Purging all thumbnails for file '$filename'..." );
+ $file->purgeCache();
+ $file->purgeHistory();
+ $this->output( "done.\n" );
+
+ if ( $afile instanceof ArchivedFile ) {
+ $this->scrubVersion( $afile );
+ } else {
+ $this->output( "Finding deleted versions of file '$filename'...\n" );
+ $this->scrubAllVersions( $filename );
+ $this->output( "Done\n" );
+ }
+ }
+
+ protected function scrubAllVersions( $name ) {
+ $dbw = wfGetDB( DB_MASTER );
+ $res = $dbw->select( 'filearchive', '*',
+ array( 'fa_name' => $name, 'fa_storage_group' => 'deleted' ),
+ __METHOD__ );
+ foreach ( $res as $row ) {
+ $this->scrubVersion( ArchivedFile::newFromRow( $row ) );
+ }
+ }
+
+ protected function scrubVersion( ArchivedFile $archivedFile ) {
+ $key = $archivedFile->getStorageKey();
+ $name = $archivedFile->getName();
+ $ts = $archivedFile->getTimestamp();
+ $repo = RepoGroup::singleton()->getLocalRepo();
+ $path = $repo->getZonePath( 'deleted' ) . '/' . $repo->getDeletedHashPath( $key ) . $key;
+ if ( $this->hasOption( 'delete' ) ) {
+ $status = $repo->getBackend()->delete( array( 'src' => $path ) );
+ if ( $status->isOK() ) {
+ $this->output( "Deleted version '$key' ($ts) of file '$name'\n" );
+ } else {
+ $this->output( "Failed to delete version '$key' ($ts) of file '$name'\n" );
+ $this->output( print_r( $status->getErrorsArray(), true ) );
+ }
+ } else {
+ $this->output( "Would delete version '{$key}' ({$ts}) of file '$name'\n" );
+ }
+ }
+}
+
+$maintClass = "EraseArchivedFile";
+require_once RUN_MAINTENANCE_IF_MAIN;
diff --git a/maintenance/eval.php b/maintenance/eval.php
index 95f46ffa..abedc61a 100644
--- a/maintenance/eval.php
+++ b/maintenance/eval.php
@@ -34,7 +34,7 @@
$optionsWithArgs = array( 'd' );
/** */
-require_once( __DIR__ . "/commandLine.inc" );
+require_once __DIR__ . "/commandLine.inc";
if ( isset( $options['d'] ) ) {
$d = $options['d'];
diff --git a/maintenance/fetchText.php b/maintenance/fetchText.php
index a705bcca..05470d30 100644
--- a/maintenance/fetchText.php
+++ b/maintenance/fetchText.php
@@ -22,7 +22,7 @@
* @ingroup Maintenance
*/
-require_once( __DIR__ . '/Maintenance.php' );
+require_once __DIR__ . '/Maintenance.php';
/**
* Maintenance script used to fetch page text in a subprocess.
@@ -45,7 +45,7 @@ class FetchText extends Maintenance {
*
* note that that the text string itself is *not* followed by newline
*/
- public function execute() {
+ public function execute() {
$db = wfGetDB( DB_SLAVE );
$stdin = $this->getStdin();
while ( !feof( $stdin ) ) {
@@ -56,12 +56,12 @@ class FetchText extends Maintenance {
}
$textId = intval( $line );
$text = $this->doGetText( $db, $textId );
- if ($text === false) {
+ if ( $text === false ) {
# actual error, not zero-length text
$textLen = "-1";
}
else {
- $textLen = strlen($text);
+ $textLen = strlen( $text );
}
$this->output( $textId . "\n" . $textLen . "\n" . $text );
}
@@ -88,4 +88,4 @@ class FetchText extends Maintenance {
}
$maintClass = "FetchText";
-require_once( RUN_MAINTENANCE_IF_MAIN );
+require_once RUN_MAINTENANCE_IF_MAIN;
diff --git a/maintenance/fileOpPerfTest.php b/maintenance/fileOpPerfTest.php
index 008d7686..9dba8183 100644
--- a/maintenance/fileOpPerfTest.php
+++ b/maintenance/fileOpPerfTest.php
@@ -21,10 +21,8 @@
* @ingroup Maintenance
*/
-$wgProfiler = array( 'class' => 'ProfilerSimpleText' );
error_reporting( E_ALL );
-
-require_once( __DIR__ . '/Maintenance.php' );
+require_once __DIR__ . '/Maintenance.php';
/**
* Maintenance script to test fileop performance.
@@ -44,6 +42,8 @@ class TestFileOpPerformance extends Maintenance {
}
public function execute() {
+ Profiler::setInstance( new ProfilerSimpleText( array() ) ); // clear
+
$backend = FileBackendGroup::singleton()->get( $this->getOption( 'b1' ) );
$this->doPerfTest( $backend );
@@ -52,10 +52,8 @@ class TestFileOpPerformance extends Maintenance {
$this->doPerfTest( $backend );
}
- $profiler = Profiler::instance();
- $profiler->setTemplated( true );
-
- //NOTE: as of MW1.21, $profiler->logData() is called implicitly by doMaintenance.php.
+ Profiler::instance()->setTemplated( true );
+ // NOTE: as of MW1.21, $profiler->logData() is called implicitly by doMaintenance.php.
}
protected function doPerfTest( FileBackend $backend ) {
@@ -79,7 +77,7 @@ class TestFileOpPerformance extends Maintenance {
$this->output( "Using '$dirname/$file' in operations.\n" );
$dst = $baseDir . '/' . wfBaseName( $file );
$ops1[] = array( 'op' => 'store',
- 'src' => "$dirname/$file", 'dst' => $dst, 'overwrite' => 1);
+ 'src' => "$dirname/$file", 'dst' => $dst, 'overwrite' => 1 );
$ops2[] = array( 'op' => 'copy',
'src' => "$dst", 'dst' => "$dst-1", 'overwrite' => 1 );
$ops3[] = array( 'op' => 'move',
@@ -106,7 +104,7 @@ class TestFileOpPerformance extends Maintenance {
$e = ( microtime( true ) - $start ) * 1000;
if ( $status->getErrorsArray() ) {
print_r( $status->getErrorsArray() );
- exit(0);
+ exit( 0 );
}
$this->output( $backend->getName() . ": Stored " . count( $ops1 ) . " files in $e ms.\n" );
@@ -115,7 +113,7 @@ class TestFileOpPerformance extends Maintenance {
$e = ( microtime( true ) - $start ) * 1000;
if ( $status->getErrorsArray() ) {
print_r( $status->getErrorsArray() );
- exit(0);
+ exit( 0 );
}
$this->output( $backend->getName() . ": Copied " . count( $ops2 ) . " files in $e ms.\n" );
@@ -124,7 +122,7 @@ class TestFileOpPerformance extends Maintenance {
$e = ( microtime( true ) - $start ) * 1000;
if ( $status->getErrorsArray() ) {
print_r( $status->getErrorsArray() );
- exit(0);
+ exit( 0 );
}
$this->output( $backend->getName() . ": Moved " . count( $ops3 ) . " files in $e ms.\n" );
@@ -133,7 +131,7 @@ class TestFileOpPerformance extends Maintenance {
$e = ( microtime( true ) - $start ) * 1000;
if ( $status->getErrorsArray() ) {
print_r( $status->getErrorsArray() );
- exit(0);
+ exit( 0 );
}
$this->output( $backend->getName() . ": Deleted " . count( $ops4 ) . " files in $e ms.\n" );
@@ -142,11 +140,11 @@ class TestFileOpPerformance extends Maintenance {
$e = ( microtime( true ) - $start ) * 1000;
if ( $status->getErrorsArray() ) {
print_r( $status->getErrorsArray() );
- exit(0);
+ exit( 0 );
}
$this->output( $backend->getName() . ": Deleted " . count( $ops5 ) . " files in $e ms.\n" );
}
}
$maintClass = "TestFileOpPerformance";
-require_once( RUN_MAINTENANCE_IF_MAIN );
+require_once RUN_MAINTENANCE_IF_MAIN;
diff --git a/maintenance/findHooks.php b/maintenance/findHooks.php
index 778da5a1..373170ff 100644
--- a/maintenance/findHooks.php
+++ b/maintenance/findHooks.php
@@ -34,7 +34,7 @@
* @author Antoine Musso <hashar at free dot fr>
*/
-require_once( __DIR__ . '/Maintenance.php' );
+require_once __DIR__ . '/Maintenance.php';
/**
* Maintenance script that compares documented and actually present mismatches.
@@ -248,4 +248,4 @@ class FindHooks extends Maintenance {
}
$maintClass = 'FindHooks';
-require_once( RUN_MAINTENANCE_IF_MAIN );
+require_once RUN_MAINTENANCE_IF_MAIN;
diff --git a/maintenance/fixDoubleRedirects.php b/maintenance/fixDoubleRedirects.php
index 19b97777..523be7ef 100644
--- a/maintenance/fixDoubleRedirects.php
+++ b/maintenance/fixDoubleRedirects.php
@@ -25,7 +25,7 @@
* @ingroup Maintenance
*/
-require_once( __DIR__ . '/Maintenance.php' );
+require_once __DIR__ . '/Maintenance.php';
/**
* Maintenance script that fixes double redirects.
@@ -134,4 +134,4 @@ class FixDoubleRedirects extends Maintenance {
}
$maintClass = "FixDoubleRedirects";
-require_once( RUN_MAINTENANCE_IF_MAIN );
+require_once RUN_MAINTENANCE_IF_MAIN;
diff --git a/maintenance/fixExtLinksProtocolRelative.php b/maintenance/fixExtLinksProtocolRelative.php
index 2403ec68..55fbd9a3 100644
--- a/maintenance/fixExtLinksProtocolRelative.php
+++ b/maintenance/fixExtLinksProtocolRelative.php
@@ -23,7 +23,7 @@
* @ingroup Maintenance
*/
-require_once( __DIR__ . '/Maintenance.php' );
+require_once __DIR__ . '/Maintenance.php';
/**
* Maintenance script that fixes any entriy for protocol-relative URLs
@@ -85,4 +85,4 @@ class FixExtLinksProtocolRelative extends LoggedUpdateMaintenance {
}
$maintClass = "FixExtLinksProtocolRelative";
-require_once( RUN_MAINTENANCE_IF_MAIN );
+require_once RUN_MAINTENANCE_IF_MAIN;
diff --git a/maintenance/fixSlaveDesync.php b/maintenance/fixSlaveDesync.php
index ab7603de..e4e557fe 100644
--- a/maintenance/fixSlaveDesync.php
+++ b/maintenance/fixSlaveDesync.php
@@ -21,7 +21,7 @@
* @ingroup Maintenance
*/
-require_once( __DIR__ . '/Maintenance.php' );
+require_once __DIR__ . '/Maintenance.php';
/**
* Maintenance script that fixes erroneous page_latest values
@@ -106,10 +106,10 @@ class FixSlaveDesync extends Maintenance {
$db = wfGetDB( $i );
/*
if ( !$db->masterPosWait( $masterFile, $masterPos, 10 ) ) {
- $this->output( "Slave is too lagged, aborting\n" );
- $dbw->commit( __METHOD__ );
- sleep(10);
- return;
+ $this->output( "Slave is too lagged, aborting\n" );
+ $dbw->commit( __METHOD__ );
+ sleep(10);
+ return;
}*/
$latest = $db->selectField( 'page', 'page_latest', array( 'page_id' => $pageID ), __METHOD__ );
$max = $db->selectField( 'revision', 'MAX(rev_id)', false, __METHOD__ );
@@ -213,4 +213,4 @@ class FixSlaveDesync extends Maintenance {
}
$maintClass = "FixSlaveDesync";
-require_once( RUN_MAINTENANCE_IF_MAIN );
+require_once RUN_MAINTENANCE_IF_MAIN;
diff --git a/maintenance/fixTimestamps.php b/maintenance/fixTimestamps.php
index 84d08d39..b0609d17 100644
--- a/maintenance/fixTimestamps.php
+++ b/maintenance/fixTimestamps.php
@@ -25,7 +25,7 @@
* @ingroup Maintenance
*/
-require_once( __DIR__ . '/Maintenance.php' );
+require_once __DIR__ . '/Maintenance.php';
/**
* Maintenance script that fixes timestamp corruption caused by one or
@@ -125,4 +125,4 @@ class FixTimestamps extends Maintenance {
}
$maintClass = "FixTimestamps";
-require_once( RUN_MAINTENANCE_IF_MAIN );
+require_once RUN_MAINTENANCE_IF_MAIN;
diff --git a/maintenance/fixUserRegistration.php b/maintenance/fixUserRegistration.php
index 91d42a5d..097936c9 100644
--- a/maintenance/fixUserRegistration.php
+++ b/maintenance/fixUserRegistration.php
@@ -22,7 +22,7 @@
* @ingroup Maintenance
*/
-require_once( __DIR__ . '/Maintenance.php' );
+require_once __DIR__ . '/Maintenance.php';
/**
* Maintenance script that fixes the user_registration field.
@@ -58,4 +58,4 @@ class FixUserRegistration extends Maintenance {
}
$maintClass = "FixUserRegistration";
-require_once( RUN_MAINTENANCE_IF_MAIN );
+require_once RUN_MAINTENANCE_IF_MAIN;
diff --git a/maintenance/formatInstallDoc.php b/maintenance/formatInstallDoc.php
index 691ed80c..e2b3c419 100644
--- a/maintenance/formatInstallDoc.php
+++ b/maintenance/formatInstallDoc.php
@@ -21,7 +21,7 @@
* @ingroup Maintenance
*/
-require_once( __DIR__ .'/Maintenance.php' );
+require_once __DIR__ . '/Maintenance.php';
/**
* Maintenance script that formats RELEASE-NOTE file to wiki text or HTML markup.
@@ -75,4 +75,4 @@ class MaintenanceFormatInstallDoc extends Maintenance {
}
$maintClass = 'MaintenanceFormatInstallDoc';
-require_once( RUN_MAINTENANCE_IF_MAIN );
+require_once RUN_MAINTENANCE_IF_MAIN;
diff --git a/maintenance/fuzz-tester.php b/maintenance/fuzz-tester.php
index 4c039807..548bb2f2 100644
--- a/maintenance/fuzz-tester.php
+++ b/maintenance/fuzz-tester.php
@@ -118,7 +118,6 @@ Wiki configuration for testing:
// Enable weird and wonderful options:
// 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.
$wgDBerrorLog = "/root/mediawiki-db-error-log.txt"; // log DB errors, replace with suitable path.
$wgShowSQLErrors = true; // Show SQL errors (instead of saying the query was hidden).
@@ -127,17 +126,17 @@ Wiki configuration for testing:
$wgEnableWriteAPI = true; // enable API.
// Install & enable Parser Hook extensions to increase code coverage. E.g.:
- require_once("extensions/ParserFunctions/ParserFunctions.php");
- require_once("extensions/Cite/Cite.php");
- require_once("extensions/inputbox/inputbox.php");
- require_once("extensions/Sort/Sort.php");
- require_once("extensions/wikihiero/wikihiero.php");
- require_once("extensions/CharInsert/CharInsert.php");
- require_once("extensions/FixedImage/FixedImage.php");
+ require_once "extensions/ParserFunctions/ParserFunctions.php";
+ require_once "extensions/Cite/Cite.php";
+ require_once "extensions/inputbox/inputbox.php";
+ require_once "extensions/Sort/Sort.php";
+ require_once "extensions/wikihiero/wikihiero.php";
+ require_once "extensions/CharInsert/CharInsert.php";
+ require_once "extensions/FixedImage/FixedImage.php";
// Install & enable Special Page extensions to increase code coverage. E.g.:
- require_once("extensions/Cite/SpecialCite.php");
- require_once("extensions/Renameuser/SpecialRenameuser.php");
+ require_once "extensions/Cite/SpecialCite.php";
+ require_once "extensions/Renameuser/SpecialRenameuser.php";
// --------- End ---------
If you want to try E_STRICT error logging, add this to the above:
@@ -181,7 +180,7 @@ TODO:
// ///////////////////////// COMMAND LINE HELP ////////////////////////////////////
// This is a command line script, load MediaWiki env (gives command line options);
-require_once( __DIR__ . '/commandLine.inc' );
+require_once __DIR__ . '/commandLine.inc';
// if the user asked for an explanation of command line options.
if ( isset( $options["help"] ) ) {
@@ -657,6 +656,7 @@ class wikiFuzz {
"}}",
"{{INT:googlesearch|",
"}}",
+ "{{ROOTPAGENAME}}",
"{{BASEPAGENAME}}",
"{{CONTENTLANGUAGE}}",
"{{PAGESINNAMESPACE:}}",
@@ -1482,24 +1482,6 @@ class watchlistTest extends pageTest {
}
}
-
-/**
- ** a page test for "Special:Blockme"
- */
-class specialBlockmeTest extends pageTest {
- function __construct() {
- $this->pagePath = "index.php?title=Special:Blockme";
-
- $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( 8134, -10 ), wikiFuzz::makeFuzz( 2 ) ) );
- }
- }
-}
-
-
/**
** a page test for "Special:Movepage"
*/
@@ -1972,7 +1954,7 @@ class specialChemicalsourcesTest extends pageTest {
** returns the help screen - so currently a lot of the tests aren't actually doing much
** because something wasn't right in the query.
**
- ** @todo: Incomplete / unfinished; Runs too fast (suggests not much testing going on).
+ ** @todo Incomplete / unfinished; Runs too fast (suggests not much testing going on).
*/
class api extends pageTest {
@@ -2160,7 +2142,7 @@ class GeSHi_Test extends pageTest {
/**
** selects a page test to run.
* @param $count
- * @return \api|\confirmEmail|\contributionsTest|\editPageTest|\imagelistTest|\imagepageTest|\ipblocklistTest|\listusersTest|\mimeSearchTest|\newImagesTest|\pageDeletion|\pageHistoryTest|\pageProtectionForm|\prefixindexTest|\profileInfo|\recentchangesTest|\redirectTest|\searchTest|\specialAllmessagesTest|\specialAllpagesTest|\specialBlockip|\specialBlockmeTest|\specialBooksourcesTest|\specialCategoryTree|\specialChemicalsourcesTest|\specialCitePageTest|\specialExportTest|\specialFilepathPageTest|\specialImportPageTest|\specialLinksearch|\specialLockdbPageTest|\specialLogTest|\specialMovePage|\specialNewpagesPageTest|\specialRenameuserPageTest|\specialRevisionDeletePageTest|\specialUndeletePageTest|\specialUnlockdbPageTest|\specialUserrights|\successfulUserLoginTest|\thumbTest|\userLoginTest|\viewPageTest|\watchlistTest
+ * @return \api|\confirmEmail|\contributionsTest|\editPageTest|\imagelistTest|\imagepageTest|\ipblocklistTest|\listusersTest|\mimeSearchTest|\newImagesTest|\pageDeletion|\pageHistoryTest|\pageProtectionForm|\prefixindexTest|\profileInfo|\recentchangesTest|\redirectTest|\searchTest|\specialAllmessagesTest|\specialAllpagesTest|\specialBlockip|\specialBooksourcesTest|\specialCategoryTree|\specialChemicalsourcesTest|\specialCitePageTest|\specialExportTest|\specialFilepathPageTest|\specialImportPageTest|\specialLinksearch|\specialLockdbPageTest|\specialLogTest|\specialMovePage|\specialNewpagesPageTest|\specialRenameuserPageTest|\specialRevisionDeletePageTest|\specialUndeletePageTest|\specialUnlockdbPageTest|\specialUserrights|\successfulUserLoginTest|\thumbTest|\userLoginTest|\viewPageTest|\watchlistTest
*/
function selectPageTest( $count ) {
@@ -2196,7 +2178,6 @@ function selectPageTest( $count ) {
case 20: return new redirectTest();
case 21: return new confirmEmail();
case 22: return new watchlistTest();
- case 23: return new specialBlockmeTest();
case 24: return new specialUndeletePageTest();
case 25: return new specialMovePage();
case 26: return new specialUnlockdbPageTest();
@@ -2542,7 +2523,7 @@ function runWikiTest( pageTest $test, &$testname, $can_overwrite = false ) {
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.
+ // Get tidy to check the page, unless we already know it produces non-(X)HTML output.
if ( $test->tidyValidate() ) {
$valid = tidyCheckFile( $testname . HTML_FILE ) && $valid;
}
diff --git a/maintenance/generateSitemap.php b/maintenance/generateSitemap.php
index adea97ea..0b21a1fe 100644
--- a/maintenance/generateSitemap.php
+++ b/maintenance/generateSitemap.php
@@ -26,7 +26,7 @@
* @see http://www.sitemaps.org/schemas/sitemap/0.9/sitemap.xsd
*/
-require_once( __DIR__ . '/Maintenance.php' );
+require_once __DIR__ . '/Maintenance.php';
/**
* Maintenance script that generates a sitemap for the site.
@@ -167,7 +167,7 @@ class GenerateSitemap extends Maintenance {
}
$this->identifier = $this->getOption( 'identifier', wfWikiID() );
$this->compress = $this->getOption( 'compress', 'yes' ) !== 'no';
- $this->skipRedirects = $this->getOption( 'skip-redirects', false ) !== false ;
+ $this->skipRedirects = $this->getOption( 'skip-redirects', false ) !== false;
$this->dbr = wfGetDB( DB_SLAVE );
$this->generateNamespaces();
$this->timestamp = wfTimestamp( TS_ISO_8601, wfTimestampNow() );
@@ -231,7 +231,7 @@ class GenerateSitemap extends Maintenance {
wfMkdirParents( $fspath, null, __METHOD__ ) or die( "Can not create directory $fspath.\n" );
}
- return realpath( $fspath ) . DIRECTORY_SEPARATOR ;
+ return realpath( $fspath ) . DIRECTORY_SEPARATOR;
}
/**
@@ -255,8 +255,9 @@ class GenerateSitemap extends Maintenance {
)
);
- foreach ( $res as $row )
+ foreach ( $res as $row ) {
$this->namespaces[] = $row->page_namespace;
+ }
}
/**
@@ -319,7 +320,7 @@ class GenerateSitemap extends Maintenance {
$this->output( "$namespace ($fns)\n" );
$skippedRedirects = 0; // Number of redirects skipped for that namespace
foreach ( $res as $row ) {
- if ($this->skipRedirects && $row->page_is_redirect ) {
+ if ( $this->skipRedirects && $row->page_is_redirect ) {
$skippedRedirects++;
continue;
}
@@ -346,7 +347,9 @@ class GenerateSitemap extends Maintenance {
if ( $wgContLang->hasVariants() ) {
$variants = $wgContLang->getVariants();
foreach ( $variants as $vCode ) {
- if ( $vCode == $wgContLang->getCode() ) continue; // we don't want default variant
+ if ( $vCode == $wgContLang->getCode() ) {
+ continue; // we don't want default variant
+ }
$entry = $this->fileEntry( $title->getCanonicalURL( '', $vCode ), $date, $this->priority( $namespace ) );
$length += strlen( $entry );
$this->write( $this->file, $entry );
@@ -354,7 +357,7 @@ class GenerateSitemap extends Maintenance {
}
}
- if ($this->skipRedirects && $skippedRedirects > 0) {
+ if ( $this->skipRedirects && $skippedRedirects > 0 ) {
$this->output( " skipped $skippedRedirects redirect(s)\n" );
}
@@ -374,8 +377,8 @@ class GenerateSitemap extends Maintenance {
*/
function open( $file, $flags ) {
$resource = $this->compress ? gzopen( $file, $flags ) : fopen( $file, $flags );
- if( $resource === false ) {
- wfDebugDieBacktrace( __METHOD__ . " error opening file $file with flags $flags. Check permissions?" );
+ if ( $resource === false ) {
+ throw new MWException( __METHOD__ . " error opening file $file with flags $flags. Check permissions?" );
}
return $resource;
}
@@ -384,23 +387,25 @@ class GenerateSitemap extends Maintenance {
* gzwrite() / fwrite() wrapper
*/
function write( &$handle, $str ) {
- if( $handle === true || $handle === false ) {
- wfDebugDieBacktrace( __METHOD__ . " was passed a boolean as a file handle.\n" );
+ if ( $handle === true || $handle === false ) {
+ throw new MWException( __METHOD__ . " was passed a boolean as a file handle.\n" );
}
- if ( $this->compress )
+ if ( $this->compress ) {
gzwrite( $handle, $str );
- else
+ } else {
fwrite( $handle, $str );
+ }
}
/**
* gzclose() / fclose() wrapper
*/
function close( &$handle ) {
- if ( $this->compress )
+ if ( $this->compress ) {
gzclose( $handle );
- else
+ } else {
fclose( $handle );
+ }
}
/**
@@ -485,7 +490,8 @@ class GenerateSitemap extends Maintenance {
function fileEntry( $url, $date, $priority ) {
return
"\t<url>\n" .
- "\t\t<loc>$url</loc>\n" .
+ // bug 34666: $url may contain bad characters such as ampersands.
+ "\t\t<loc>" . htmlspecialchars( $url ) . "</loc>\n" .
"\t\t<lastmod>$date</lastmod>\n" .
"\t\t<priority>$priority</priority>\n" .
"\t</url>\n";
@@ -516,4 +522,4 @@ class GenerateSitemap extends Maintenance {
}
$maintClass = "GenerateSitemap";
-require_once( RUN_MAINTENANCE_IF_MAIN );
+require_once RUN_MAINTENANCE_IF_MAIN;
diff --git a/maintenance/getConfiguration.php b/maintenance/getConfiguration.php
index 83b5b029..5a5eb587 100644
--- a/maintenance/getConfiguration.php
+++ b/maintenance/getConfiguration.php
@@ -1,6 +1,6 @@
<?php
/**
- * Print serialized output of MediaWiki config vars
+ * Print serialized output of MediaWiki config vars.
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
@@ -20,10 +20,10 @@
* @file
* @ingroup Maintenance
* @author Tim Starling
- * @author Antoine Musso
+ * @author Antoine Musso <hashar@free.fr>
*/
-require_once( __DIR__ . '/Maintenance.php' );
+require_once __DIR__ . '/Maintenance.php';
/**
* Print serialized output of MediaWiki config vars
@@ -31,33 +31,123 @@ require_once( __DIR__ . '/Maintenance.php' );
* @ingroup Maintenance
*/
class GetConfiguration extends Maintenance {
+
+ protected $regex = null;
+
+ protected $settings_list = array();
+
+ /**
+ * List of format output internally supported.
+ * Each item MUST be lower case.
+ */
+ protected static $outFormats = array(
+ 'json',
+ 'php',
+ 'serialize',
+ 'vardump',
+ );
+
public function __construct() {
parent::__construct();
$this->mDescription = "Get serialized MediaWiki site configuration";
- $this->addOption( 'settings', 'Space-separated list of wg* variables', true, true );
- $this->addOption( 'format', 'PHP or JSON', true, true );
- $this->addOption( 'wiki', 'Wiki ID', true, true );
+ $this->addOption( 'regex', 'regex to filter variables with', false, true );
+ $this->addOption( 'iregex', 'same as --regex but case insensitive', false, true );
+ $this->addOption( 'settings', 'Space-separated list of wg* variables', false, true );
+ $this->addOption( 'format', join( ', ', self::$outFormats ), false, true );
+ }
+
+ protected function validateParamsAndArgs() {
+ $error_out = false;
+
+ # Get the format and make sure it is set to a valid default value
+ $format = strtolower( $this->getOption( 'format', 'PHP' ) );
+
+ $validFormat = in_array( $format, self::$outFormats );
+ if ( ! $validFormat ) {
+ $this->error( "--format set to an unrecognized format", 0 );
+ $error_out = true;
+ }
+
+ if ( $this->getOption( 'regex' ) && $this->getOption( 'iregex' ) ) {
+ $this->error( "Can only use either --regex or --iregex" );
+ $error_out = true;
+ }
+
+ parent::validateParamsAndArgs();
+
+ if ( $error_out ) {
+ # Force help and quit
+ $this->maybeHelp( true );
+ }
+ }
+
+ /**
+ * finalSetup() since we need MWException
+ */
+ public function finalSetup() {
+ parent::finalSetup();
+
+ $this->regex = $this->getOption( 'regex' ) ? : $this->getOption( 'iregex' );
+ if ( $this->regex ) {
+ $this->regex = '/' . $this->regex . '/';
+ if ( $this->hasOption( 'iregex' ) ) {
+ $this->regex .= 'i'; # case insensitive regex
+ }
+ }
+
+ if ( $this->hasOption( 'settings' ) ) {
+ $this->settings_list = explode( ' ', $this->getOption( 'settings' ) );
+ # Values validation
+ foreach ( $this->settings_list as $name ) {
+ if ( !preg_match( '/^wg[A-Z]/', $name ) ) {
+ throw new MWException( "Variable '$name' does start with 'wg'." );
+ } elseif ( !isset( $GLOBALS[$name] ) ) {
+ throw new MWException( "Variable '$name' is not set." );
+ } elseif ( !$this->isAllowedVariable( $GLOBALS[$name] ) ) {
+ throw new MWException( "Variable '$name' includes non-array, non-scalar, items." );
+ }
+ }
+ }
}
public function execute() {
+ // Settings we will display
$res = array();
- foreach ( explode( ' ', $this->getOption( 'settings' ) ) as $name ) {
- if ( !preg_match( '/^wg[A-Z]/', $name ) ) {
- throw new MWException( "Variable '$name' does start with 'wg'." );
- } elseif ( !isset( $GLOBALS[$name] ) ) {
- throw new MWException( "Variable '$name' is not set." );
- } elseif ( !$this->isAllowedVariable( $GLOBALS[$name] ) ) {
- throw new MWException( "Variable '$name' includes non-array, non-scalar, items." );
+
+ # Sane default: dump any wg / wmg variable
+ if ( ! $this->regex && ! $this->getOption( 'settings' ) ) {
+ $this->regex = '/^wm?g/';
+ }
+
+ # Filter out globals based on the regex
+ if ( $this->regex ) {
+ $res = array();
+ foreach ( $GLOBALS as $name => $value ) {
+ if ( preg_match( $this->regex, $name ) ) {
+ $res[$name] = $value;
+ }
}
- $res[$name] = $GLOBALS[$name];
}
+ # Explicitly dumps a list of provided global names
+ if ( $this->settings_list ) {
+ foreach ( $this->settings_list as $name ) {
+ $res[$name] = $GLOBALS[$name];
+ }
+ }
+
+ ksort( $res );
+
$out = null;
- switch( $this->getOption( 'format' ) ) {
- case 'PHP':
+ switch ( strtolower( $this->getOption( 'format' ) ) ) {
+ case 'serialize':
+ case 'php':
$out = serialize( $res );
break;
- case 'JSON':
+ case 'vardump':
+ $out = $this->formatVarDump( $res );
+ break;
+ case 'json':
$out = FormatJson::encode( $res );
break;
default:
@@ -67,7 +157,22 @@ class GetConfiguration extends Maintenance {
throw new MWException( "Failed to serialize the requested settings." );
}
- $this->output( $out . "\n" );
+ if ( $out ) {
+ $this->output( $out . "\n" );
+ }
+ }
+
+ protected function formatVarDump( $res ) {
+ $ret = '';
+ foreach ( $res as $key => $value ) {
+ ob_start(); # intercept var_dump() output
+ print "\${$key} = ";
+ var_dump( $value );
+ # grab var_dump() output and discard it from the output buffer
+ $ret .= trim( ob_get_clean() ) . ";\n";
+ }
+
+ return trim( $ret, "\n" );
}
private function isAllowedVariable( $value ) {
@@ -86,4 +191,4 @@ class GetConfiguration extends Maintenance {
}
$maintClass = "GetConfiguration";
-require_once( RUN_MAINTENANCE_IF_MAIN );
+require_once RUN_MAINTENANCE_IF_MAIN;
diff --git a/maintenance/getLagTimes.php b/maintenance/getLagTimes.php
index 72b1d48a..7365a2ee 100644
--- a/maintenance/getLagTimes.php
+++ b/maintenance/getLagTimes.php
@@ -21,7 +21,7 @@
* @ingroup Maintenance
*/
-require_once( __DIR__ . '/Maintenance.php' );
+require_once __DIR__ . '/Maintenance.php';
/**
* Maintenance script that displays replication lag times.
@@ -39,7 +39,7 @@ class GetLagTimes extends Maintenance {
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 ) {
@@ -59,4 +59,4 @@ class GetLagTimes extends Maintenance {
}
$maintClass = "GetLagTimes";
-require_once( RUN_MAINTENANCE_IF_MAIN );
+require_once RUN_MAINTENANCE_IF_MAIN;
diff --git a/maintenance/getSlaveServer.php b/maintenance/getSlaveServer.php
index ec9ed20a..d618825f 100644
--- a/maintenance/getSlaveServer.php
+++ b/maintenance/getSlaveServer.php
@@ -21,7 +21,7 @@
* @ingroup Maintenance
*/
-require_once( __DIR__ . '/Maintenance.php' );
+require_once __DIR__ . '/Maintenance.php';
/**
* Maintenance script that reports the hostname of a slave server.
@@ -51,4 +51,4 @@ class GetSlaveServer extends Maintenance {
}
$maintClass = "GetSlaveServer";
-require_once( RUN_MAINTENANCE_IF_MAIN );
+require_once RUN_MAINTENANCE_IF_MAIN;
diff --git a/maintenance/getText.php b/maintenance/getText.php
index f6adfe2b..9c4bdfb8 100644
--- a/maintenance/getText.php
+++ b/maintenance/getText.php
@@ -23,7 +23,7 @@
* @ingroup Maintenance
*/
-require_once( __DIR__ . '/Maintenance.php' );
+require_once __DIR__ . '/Maintenance.php';
/**
* Maintenance script that outputs page text to stdout.
@@ -62,4 +62,4 @@ class GetTextMaint extends Maintenance {
}
$maintClass = "GetTextMaint";
-require_once( RUN_MAINTENANCE_IF_MAIN );
+require_once RUN_MAINTENANCE_IF_MAIN;
diff --git a/maintenance/hiphop/compiler.conf b/maintenance/hiphop/compiler.conf
deleted file mode 100644
index 3e01640d..00000000
--- a/maintenance/hiphop/compiler.conf
+++ /dev/null
@@ -1,5 +0,0 @@
-GenerateSourceInfo = true
-EnableEval = 2
-AllDynamic = true
-EnableHipHopSyntax = true
-EnableHipHopExperimentalSyntax = true
diff --git a/maintenance/hiphop/extra-files b/maintenance/hiphop/extra-files
deleted file mode 100644
index f07f7c7c..00000000
--- a/maintenance/hiphop/extra-files
+++ /dev/null
@@ -1,34 +0,0 @@
-img_auth.php
-includes/AutoLoader.php
-includes/DefaultSettings.php
-includes/Defines.php
-includes/GlobalFunctions.php
-includes/ImageFunctions.php
-includes/OutputHandler.php
-includes/ProxyTools.php
-includes/SeleniumWebSettings.php
-includes/Setup.php
-includes/StreamFile.php
-includes/WebStart.php
-includes/filerepo/NullRepo.php
-includes/normal/UtfNormalDefines.php
-includes/normal/UtfNormalUtil.php
-index.php
-languages/Names.php
-load.php
-maintenance/Maintenance.php
-maintenance/commandLine.inc
-maintenance/doMaintenance.php
-maintenance/eval.php
-opensearch_desc.php
-profileinfo.php
-redirect.php
-resources/Resources.php
-serialized/serialize.php
-skins/MonoBook.deps.php
-skins/MonoBook.php
-skins/Vector.deps.php
-skins/Vector.php
-thumb.php
-trackback.php
-
diff --git a/maintenance/hiphop/make b/maintenance/hiphop/make
deleted file mode 100644
index 13e3163a..00000000
--- a/maintenance/hiphop/make
+++ /dev/null
@@ -1,311 +0,0 @@
-#!/usr/bin/hphpi -f
-<?php
-
-define( 'MW_CONFIG_CALLBACK', 'MakeHipHop::noConfigNeeded' );
-require( __DIR__ . '/../Maintenance.php' );
-
-class MakeHipHop extends Maintenance {
- function noConfigNeeded() {}
-
- function execute() {
- global $wgHipHopBuildDirectory;
-
- $startTime = time();
-
- $thisDir = realpath( __DIR__ );
- $IP = realpath( "$thisDir/../.." );
- if ( strval( $wgHipHopBuildDirectory ) !== '' ) {
- $buildDir = $wgHipHopBuildDirectory;
- } else {
- $buildDir = "$thisDir/build";
- }
- $extensionsDir = realpath( MWInit::getExtensionsDirectory() );
- $outDir = "$buildDir/hiphop-output";
- $persistentDir = "$buildDir/persistent";
-
- if ( !is_dir( $buildDir ) ) {
- mkdir( $buildDir, 0777, true );
- }
- if ( !is_dir( $persistentDir ) ) {
- mkdir( $persistentDir, 0777, true );
- }
-
- if ( realpath( "$IP/../phase3" ) !== $IP
- || realpath( "$IP/../extensions" ) !== $extensionsDir )
- {
- # Set up a fake source directory with the correct layout
- $sourceBase = "$buildDir/source";
- $this->setupFakeSourceBase( $IP, $extensionsDir, $sourceBase );
- } else {
- $sourceBase = realpath( "$IP/.." );
- unlink( "$buildDir/source" );
- }
-
- # With the CentOS RPMs, you just get g++44, no g++, so we have to
- # use the environment
- if ( isset( $_ENV['CXX'] ) ) {
- $cxx = $_ENV['CXX'];
- } else {
- $cxx = 'g++';
- }
-
- # Create a function that provides the HipHop compiler version, and
- # doesn't exist when MediaWiki is invoked in interpreter mode.
- $version = str_replace( PHP_EOL, ' ', trim( `hphp --version` ) );
- file_put_contents(
- "$buildDir/HipHopCompilerVersion.php",
- "<" . "?php\n" .
- "function wfHipHopCompilerVersion() {\n" .
- "return " . var_export( $version, true ) . ";\n" .
- "}\n"
- );
-
- # Generate the file list
- $files = $this->getFileList();
- file_put_contents(
- "$buildDir/file-list",
- implode( "\n", $files ) . "\n" );
-
- # Generate the C++
- passthru(
- 'hphp' .
- ' --target=cpp' .
- ' --format=file' .
- ' --input-dir=' . wfEscapeShellArg( $sourceBase ) .
- ' --input-list=' . wfEscapeShellArg( "$buildDir/file-list" ) .
- ' --inputs=' . wfEscapeShellArg( "$buildDir/HipHopCompilerVersion.php" ) .
- ' -c ' . wfEscapeShellArg( "$thisDir/compiler.conf" ) .
- ' --parse-on-demand=false' .
- ' --program=mediawiki-hphp' .
- ' --output-dir=' . wfEscapeShellArg( $outDir ) .
- ' --log=3', $ret );
-
- if ( $ret ) {
- $this->error( "hphp hit an error. Stopping build.\n" );
- exit( 1 );
- }
-
- # Sanity check, quickly make sure we've got an output directory
- if( !is_dir( $outDir ) ) {
- $this->error( "No output directory", true );
- }
-
- # Warn about volatile classes
- $this->checkVolatileClasses( $outDir );
-
- # Copy the generated C++ files into the source directory for cmake
- $iter = new RecursiveIteratorIterator(
- new RecursiveDirectoryIterator( $outDir ),
- RecursiveIteratorIterator::SELF_FIRST );
- $sourceFiles = array();
- $regenerateMakefile = false;
- $numFiles = 0;
- $numFilesChanged = 0;
- foreach ( $iter as $sourcePath => $file ) {
- $name = substr( $sourcePath, strlen( $outDir ) + 1 );
- $sourceFiles[$name] = true;
- $destPath = "$persistentDir/$name";
- if ( $file->isDir() ) {
- if ( !is_dir( $destPath ) ) {
- mkdir( $destPath );
- }
- continue;
- }
-
- $numFiles++;
- # Remove any files that weren't touched, these may have been removed
- # from file-list, we should not compile them
- if ( $file->getMTime() < $startTime ) {
- if ( file_exists( $destPath ) ) {
- unlink( $destPath );
- # Files removed, regenerate the makefile
- $regenerateMakefile = true;
- }
- unlink( $sourcePath );
- $numFilesChanged++;
- continue;
- }
-
- if ( file_exists( $destPath ) ) {
- $sourceHash = md5( file_get_contents( $sourcePath ) );
- $destHash = md5( file_get_contents( $destPath ) );
- if ( $sourceHash == $destHash ) {
- continue;
- }
- } else {
- # New files added, regenerate the makefile
- $regenerateMakefile = true;
- }
- $numFilesChanged++;
- copy( $sourcePath, $destPath );
- }
-
- echo "MediaWiki: $numFilesChanged files changed out of $numFiles\n";
-
- if ( !file_exists( "$persistentDir/CMakeLists.txt" ) ) {
- # Run cmake for the first time
- $regenerateMakefile = true;
- }
-
- # Do our own version of $HPHP_HOME/bin/run.sh, which isn't so broken.
- # HipHop's RELEASE mode seems to be stuck always on, so symbols get
- # stripped. Also we will try keeping the generated .o files instead of
- # throwing away hours of CPU time every time you make a typo.
-
- chdir( $persistentDir );
-
- if ( $regenerateMakefile ) {
- copy( $_ENV['HPHP_HOME'] . '/bin/CMakeLists.base.txt',
- "$persistentDir/CMakeLists.txt" );
-
- if ( file_exists( "$persistentDir/CMakeCache.txt" ) ) {
- unlink( "$persistentDir/CMakeCache.txt" );
- }
-
- $cmd = 'cmake' .
- " -D CMAKE_BUILD_TYPE:string=" . wfEscapeShellArg( $GLOBALS['wgHipHopBuildType'] ) .
- ' -D PROGRAM_NAME:string=mediawiki-hphp';
-
- if ( file_exists( '/usr/bin/ccache' ) ) {
- $cmd .= ' -D CMAKE_CXX_COMPILER:string=ccache' .
- ' -D CMAKE_CXX_COMPILER_ARG1:string=' . wfEscapeShellArg( $cxx );
- }
-
- $cmd .= ' .';
- echo "$cmd\n";
- passthru( $cmd );
- }
-
- # Determine appropriate make concurrency
- # Compilation can take a lot of memory, let's assume that that is limiting.
- $procs = $this->getNumProcs();
-
- # Run make. This is the slow step.
- passthru( 'make -j' . wfEscapeShellArg( $procs ) );
-
- $elapsed = time() - $startTime;
-
- echo "Completed in ";
- if ( $elapsed >= 3600 ) {
- $hours = floor( $elapsed / 3600 );
- echo $hours . 'h ';
- $elapsed -= $hours * 3600;
- }
- if ( $elapsed >= 60 ) {
- $minutes = floor( $elapsed / 60 );
- echo $minutes . 'm ';
- $elapsed -= $minutes * 60;
- }
- echo $elapsed . "s\n";
- echo "The MediaWiki executable is at $buildDir/persistent/mediawiki-hphp\n";
- }
-
- function checkVolatileClasses( $dir ) {
- $lines = file( "$dir/sys/dynamic_table_class.cpp" );
- $classes = array();
- foreach ( $lines as $line ) {
- if ( preg_match( '/^\s+\(const char \*\)"([^"]*)", \(const char \*\)-1/', $line, $m ) ) {
- $classes[] = $m[1];
- }
- }
- if ( !count( $classes ) ) {
- print "No volatile classes found\n";
- return;
- }
- sort( $classes );
- $classes = array_unique( $classes );
- print "WARNING: The following classes are volatile: " . implode( ', ', $classes ) . "\n";
- }
-
- function getNumProcs() {
- global $wgHipHopCompilerProcs;
- if ( $wgHipHopCompilerProcs !== 'detect' ) {
- return intval( $wgHipHopCompilerProcs );
- }
-
- if ( !file_exists( '/proc/meminfo' ) ) {
- return 1;
- }
- $mem = false;
- foreach ( file( '/proc/meminfo' ) as $line ) {
- if ( preg_match( '/^MemTotal:\s+(\d+)\s+kB/', $line, $m ) ) {
- $mem = intval( $m[1] );
- break;
- }
- }
- if ( $mem ) {
- // At least one process
- return max( 1, floor( $mem / 1000000 ) );
- } else {
- return 1;
- }
- }
-
- function setupFakeSourceBase( $phase3, $extensions, $dest ) {
- if ( !file_exists( $dest ) ) {
- mkdir( $dest, 0777, true );
- }
-
- $this->forceCreateLink( "$dest/phase3", $phase3 );
- $this->forceCreateLink( "$dest/extensions", $extensions );
- }
-
- function forceCreateLink( $target, $link ) {
- if ( file_exists( $target ) ) {
- if ( readlink( $target ) === $link ) {
- return;
- }
- unlink( $target );
- }
- symlink( $target, $link );
- }
-
- function getFileList() {
- global $wgAutoloadClasses, $wgAutoloadLocalClasses, $wgCompiledFiles;
- $inputFiles = array_merge(
- array_values( $wgAutoloadClasses ),
- array_values( $wgAutoloadLocalClasses ),
- $wgCompiledFiles
- );
- $processedFiles = array();
- foreach ( $inputFiles as $file ) {
- if ( substr( $file, 0, 1 ) === '/' ) {
- $processedFiles[] = $this->absoluteToRelative( $file );
- } elseif ( preg_match( '/^extensions/', $file ) ) {
- $processedFiles[] = $file;
- } else {
- $processedFiles[] = "phase3/$file";
- }
- }
-
- $extraCoreFiles = array_map( 'trim', file( __DIR__ . '/extra-files' ) );
- foreach ( $extraCoreFiles as $file ) {
- if ( $file === '' ) {
- continue;
- }
- $processedFiles[] = "phase3/$file";
- }
- return array_unique( $processedFiles );
- }
-
- function absoluteToRelative( $file ) {
- global $IP;
-
- $coreBase = realpath( $IP ) . '/';
- $extBase = realpath( MWInit::getExtensionsDirectory() ) . '/';
- $file = realpath( $file );
-
- if ( substr( $file, 0, strlen( $extBase ) ) === $extBase ) {
- return 'extensions/' . substr( $file, strlen( $extBase ) );
- } elseif ( substr( $file, 0, strlen( $coreBase ) ) === $coreBase ) {
- return 'phase3/' . substr( $file, strlen( $coreBase ) );
- } else {
- $this->error( "The following file is registered for compilation but is not in \$IP or " .
- "\$wgExtensionsDirectory: $file \n" );
- exit( 1 );
- }
- }
-}
-
-$maintClass = 'MakeHipHop';
-require_once( RUN_MAINTENANCE_IF_MAIN );
diff --git a/maintenance/hiphop/run-server b/maintenance/hiphop/run-server
index 1adfe29f..2d71b871 100644
--- a/maintenance/hiphop/run-server
+++ b/maintenance/hiphop/run-server
@@ -1,68 +1,21 @@
-#!/usr/bin/hphpi -f
+#!/usr/bin/hhvm -f
<?php
-require( __DIR__ . '/../Maintenance.php' );
+require __DIR__ . '/../Maintenance.php';
class RunHipHopServer extends Maintenance {
function __construct() {
parent::__construct();
- $this->addOption( 'interpret', 'Run in interpreted mode' );
}
function execute() {
- if ( $this->hasOption( 'interpret' ) ) {
- $this->runInterpreted();
- } else {
- $this->runCompiled();
- }
- }
-
- function runCompiled() {
- global $wgHipHopBuildDirectory;
- $thisDir = realpath( __DIR__ );
- $IP = realpath( "$thisDir/../.." );
- if ( strval( $wgHipHopBuildDirectory ) !== '' ) {
- $buildDir = $wgHipHopBuildDirectory;
- } else {
- $buildDir = "$thisDir/build";
- }
-
- if ( file_exists( "$buildDir/source" ) ) {
- $sourceBase = "$buildDir/source";
- } else {
- $sourceBase = realpath( "$IP/.." );
- }
-
- passthru(
- 'cd ' . wfEscapeShellArg( $sourceBase ) . " && " .
- 'MW_INSTALL_PATH=' . wfEscapeShellArg( $IP ) . ' ' .
- wfEscapeShellArg(
- "$buildDir/persistent/mediawiki-hphp",
- '-c', "$thisDir/server.conf",
- '-v', "Server.SourceRoot=$sourceBase",
- '-v', "Server.IncludeSearchPaths.0=$sourceBase",
- '-v', 'ServerVariables.MW_COMPILED=1',
- '--mode=server',
- '--port=8080'
- ),
- $ret
- );
- exit( $ret );
- }
-
- function runInterpreted() {
- $thisDir = realpath( __DIR__ );
- $IP = realpath( "$thisDir/../.." );
- $sourceBase = realpath( "$IP/.." );
+ global $IP;
passthru(
- 'cd ' . wfEscapeShellArg( $sourceBase ) . " && " .
- 'MW_INSTALL_PATH=' . wfEscapeShellArg( $IP ) . ' ' .
+ 'cd ' . wfEscapeShellArg( $IP ) . " && " .
wfEscapeShellArg(
- 'hphpi',
- '-c', "$thisDir/server.conf",
- '-v', "Server.SourceRoot=$sourceBase",
- '-v', "Server.IncludeSearchPaths.0=$sourceBase",
+ 'hhvm',
+ '-c', __DIR__."/server.conf",
'--mode=server',
'--port=8080'
),
@@ -72,4 +25,4 @@ class RunHipHopServer extends Maintenance {
}
}
$maintClass = 'RunHipHopServer';
-require_once( RUN_MAINTENANCE_IF_MAIN );
+require_once RUN_MAINTENANCE_IF_MAIN;
diff --git a/maintenance/hiphop/server.conf b/maintenance/hiphop/server.conf
index 16af0f2f..558bdad8 100644
--- a/maintenance/hiphop/server.conf
+++ b/maintenance/hiphop/server.conf
@@ -12,7 +12,7 @@ Debug {
}
Server {
EnableStaticContentCache = false
- EnableStaticContentFromDisk = false
+ EnableStaticContentFromDisk = true
AlwaysUseRelativePath = true
}
VirtualHost {
@@ -22,7 +22,7 @@ VirtualHost {
RewriteRules {
* {
pattern = ^/wiki/(.*)$
- to = /phase3/index.php?title=$1
+ to = /index.php?title=$1
qsa = true
}
}
diff --git a/maintenance/importDump.php b/maintenance/importDump.php
index 904b6247..1f47cf12 100644
--- a/maintenance/importDump.php
+++ b/maintenance/importDump.php
@@ -24,7 +24,7 @@
* @ingroup Maintenance
*/
-require_once( __DIR__ . '/Maintenance.php' );
+require_once __DIR__ . '/Maintenance.php';
/**
* Maintenance script that imports XML dump files into the current wiki.
@@ -34,16 +34,16 @@ require_once( __DIR__ . '/Maintenance.php' );
class BackupReader extends Maintenance {
public $reportingInterval = 100;
public $pageCount = 0;
- public $revCount = 0;
- public $dryRun = false;
- public $uploads = false;
+ public $revCount = 0;
+ public $dryRun = false;
+ public $uploads = false;
public $imageBasePath = false;
- public $nsFilter = false;
+ public $nsFilter = false;
function __construct() {
parent::__construct();
- $gz = in_array('compress.zlib', stream_get_wrappers()) ? 'ok' : '(disabled; requires PHP zlib module)';
- $bz2 = in_array('compress.bzip2', stream_get_wrappers()) ? 'ok' : '(disabled; requires PHP bzip2 module)';
+ $gz = in_array( 'compress.zlib', stream_get_wrappers() ) ? 'ok' : '(disabled; requires PHP zlib module)';
+ $bz2 = in_array( 'compress.bzip2', stream_get_wrappers() ) ? 'ok' : '(disabled; requires PHP bzip2 module)';
$this->mDescription = <<<TEXT
This script reads pages from an XML file as produced from Special:Export or
@@ -73,7 +73,7 @@ TEXT;
}
public function execute() {
- if( wfReadOnly() ) {
+ if ( wfReadOnly() ) {
$this->error( "Wiki is in read-only mode; you'll need to disable it for import to work.", true );
}
@@ -91,7 +91,7 @@ TEXT;
$this->setNsfilter( explode( '|', $this->getOption( 'namespaces' ) ) );
}
- if( $this->hasArg() ) {
+ if ( $this->hasArg() ) {
$this->importFromFile( $this->getArg() );
} else {
$this->importFromStdin();
@@ -247,7 +247,7 @@ TEXT;
function importFromStdin() {
$file = fopen( 'php://stdin', 'rt' );
- if( self::posix_isatty( $file ) ) {
+ if ( self::posix_isatty( $file ) ) {
$this->maybeHelp( true );
}
return $this->importFromHandle( $file );
@@ -259,14 +259,14 @@ TEXT;
$source = new ImportStreamSource( $handle );
$importer = new WikiImporter( $source );
- if( $this->hasOption( 'debug' ) ) {
+ if ( $this->hasOption( 'debug' ) ) {
$importer->setDebug( true );
}
if ( $this->hasOption( 'no-updates' ) ) {
$importer->setNoUpdates( true );
}
$importer->setPageCallback( array( &$this, 'reportPage' ) );
- $this->importCallback = $importer->setRevisionCallback(
+ $this->importCallback = $importer->setRevisionCallback(
array( &$this, 'handleRevision' ) );
$this->uploadCallback = $importer->setUploadCallback(
array( &$this, 'handleUpload' ) );
@@ -288,4 +288,4 @@ TEXT;
}
$maintClass = 'BackupReader';
-require_once( RUN_MAINTENANCE_IF_MAIN );
+require_once RUN_MAINTENANCE_IF_MAIN;
diff --git a/maintenance/importImages.inc b/maintenance/importImages.inc
index 2b3d5514..5ae6d6be 100644
--- a/maintenance/importImages.inc
+++ b/maintenance/importImages.inc
@@ -99,7 +99,9 @@ function findAuxFile( $file, $auxExtension, $maxStrip = 1 ) {
}
$idx = strrpos( $n, '.' );
- if ( !$idx ) break;
+ if ( !$idx ) {
+ break;
+ }
$n = substr( $n, 0, $idx );
$maxStrip -= 1;
diff --git a/maintenance/importImages.php b/maintenance/importImages.php
index 782f502d..54fd4e2d 100644
--- a/maintenance/importImages.php
+++ b/maintenance/importImages.php
@@ -35,11 +35,11 @@ $optionsWithArgs = array(
'extensions', 'comment', 'comment-file', 'comment-ext', 'summary', 'user',
'license', 'sleep', 'limit', 'from', 'source-wiki-url', 'timestamp',
);
-require_once( __DIR__ . '/commandLine.inc' );
-require_once( __DIR__ . '/importImages.inc' );
+require_once __DIR__ . '/commandLine.inc';
+require_once __DIR__ . '/importImages.inc';
$processed = $added = $ignored = $skipped = $overwritten = $failed = 0;
-echo( "Import Images\n\n" );
+echo "Import Images\n\n";
# Need a path
if ( count( $args ) == 0 ) {
@@ -104,15 +104,15 @@ if ( $limit ) {
$timestamp = isset( $options['timestamp'] ) ? $options['timestamp'] : false;
# Get the upload comment. Provide a default one in case there's no comment given.
-$comment = 'Importing image file';
+$comment = 'Importing file';
if ( isset( $options['comment-file'] ) ) {
- $comment = file_get_contents( $options['comment-file'] );
+ $comment = file_get_contents( $options['comment-file'] );
if ( $comment === false || $comment === null ) {
die( "failed to read comment file: {$options['comment-file']}\n" );
}
} elseif ( isset( $options['comment'] ) ) {
- $comment = $options['comment'];
+ $comment = $options['comment'];
}
$commentExt = isset( $options['comment-ext'] ) ? $options['comment-ext'] : false;
@@ -132,7 +132,7 @@ if ( $count > 0 ) {
# Validate a title
$title = Title::makeTitleSafe( NS_FILE, $base );
if ( !is_object( $title ) ) {
- echo( "{$base} could not be imported; a valid title cannot be produced\n" );
+ echo "{$base} could not be imported; a valid title cannot be produced\n";
continue;
}
@@ -148,7 +148,7 @@ if ( $count > 0 ) {
if ( $checkUserBlock && ( ( $processed % $checkUserBlock ) == 0 ) ) {
$user->clearInstanceCache( 'name' ); // reload from DB!
if ( $user->isBlocked() ) {
- echo( $user->getName() . " was blocked! Aborting.\n" );
+ echo $user->getName() . " was blocked! Aborting.\n";
break;
}
}
@@ -157,10 +157,10 @@ if ( $count > 0 ) {
$image = wfLocalFile( $title );
if ( $image->exists() ) {
if ( isset( $options['overwrite'] ) ) {
- echo( "{$base} exists, overwriting..." );
+ echo "{$base} exists, overwriting...";
$svar = 'overwritten';
} else {
- echo( "{$base} exists, skipping\n" );
+ echo "{$base} exists, skipping\n";
$skipped++;
continue;
}
@@ -172,23 +172,24 @@ if ( $count > 0 ) {
$dupes = $repo->findBySha1( $sha1 );
if ( $dupes ) {
- echo( "{$base} already exists as " . $dupes[0]->getName() . ", skipping\n" );
+ echo "{$base} already exists as " . $dupes[0]->getName() . ", skipping\n";
$skipped++;
continue;
}
}
- echo( "Importing {$base}..." );
+ echo "Importing {$base}...";
$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 )
+ if ( $real_comment === false ) {
$commentText = $comment;
- else
+ } else {
$commentText = $real_comment;
+ }
/* find user directly from source wiki, through MW's API */
$real_user = getFileUserFromSourceWiki( $options['source-wiki-url'], $base );
@@ -198,7 +199,7 @@ if ( $count > 0 ) {
$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." );
+ echo "failed: user '$real_user' does not exist in target wiki.";
continue;
}
}
@@ -209,11 +210,11 @@ if ( $count > 0 ) {
if ( $commentExt ) {
$f = findAuxFile( $file, $commentExt );
if ( !$f ) {
- echo( " No comment file with extension {$commentExt} found for {$file}, using default comment. " );
+ echo " No comment file with extension {$commentExt} found for {$file}, using default comment. ";
} else {
$commentText = file_get_contents( $f );
if ( !$commentText ) {
- echo( " Failed to load comment file {$f}, using default comment. " );
+ echo " Failed to load comment file {$f}, using default comment. ";
}
}
}
@@ -225,28 +226,37 @@ if ( $count > 0 ) {
# Import the file
if ( isset( $options['dry'] ) ) {
- echo( " publishing {$file} by '" . $wgUser->getName() . "', comment '$commentText'... " );
+ echo " publishing {$file} by '" . $wgUser->getName() . "', comment '$commentText'... ";
} else {
- $archive = $image->publish( $file );
+ $props = FSFile::getPropsFromPath( $file );
+ $flags = 0;
+ $publishOptions = array();
+ $handler = MediaHandler::getHandler( $props['mime'] );
+ if ( $handler ) {
+ $publishOptions['headers'] = $handler->getStreamHeaders( $props['metadata'] );
+ } else {
+ $publishOptions['headers'] = array();
+ }
+ $archive = $image->publish( $file, $flags, $publishOptions );
if ( !$archive->isGood() ) {
- echo( "failed. (" .
+ echo "failed. (" .
$archive->getWikiText() .
- ")\n" );
+ ")\n";
$failed++;
continue;
}
}
$commentText = SpecialUpload::getInitialPageText( $commentText, $license );
- if ( !$summary ) {
+ if ( !isset( $options['summary'] ) ) {
$summary = $commentText;
}
if ( isset( $options['dry'] ) ) {
- echo( "done.\n" );
- } elseif ( $image->recordUpload2( $archive->value, $summary, $commentText, false, $timestamp ) ) {
+ echo "done.\n";
+ } elseif ( $image->recordUpload2( $archive->value, $summary, $commentText, $props, $timestamp ) ) {
# We're done!
- echo( "done.\n" );
+ echo "done.\n";
$doProtect = false;
@@ -269,21 +279,21 @@ if ( $count > 0 ) {
sleep( 2.0 ); # Why this sleep?
wfWaitForSlaves();
- echo( "\nSetting image restrictions ... " );
+ echo "\nSetting image restrictions ... ";
$cascade = false;
$restrictions = array();
- foreach( $title->getRestrictionTypes() as $type ) {
+ foreach ( $title->getRestrictionTypes() as $type ) {
$restrictions[$type] = $protectLevel;
}
$page = WikiPage::factory( $title );
$status = $page->doUpdateRestrictions( $restrictions, array(), $cascade, '', $user );
- echo( ( $status->isOK() ? 'done' : 'failed' ) . "\n" );
+ echo ( $status->isOK() ? 'done' : 'failed' ) . "\n";
}
} else {
- echo( "failed. (at recordUpload stage)\n" );
+ echo "failed. (at recordUpload stage)\n";
$svar = 'failed';
}
@@ -300,23 +310,24 @@ if ( $count > 0 ) {
}
# Print out some statistics
- echo( "\n" );
+ echo "\n";
foreach ( array( 'count' => 'Found', 'limit' => 'Limit', 'ignored' => 'Ignored',
'added' => 'Added', 'skipped' => 'Skipped', 'overwritten' => 'Overwritten',
'failed' => 'Failed' ) as $var => $desc ) {
- if ( $$var > 0 )
- echo( "{$desc}: {$$var}\n" );
+ if ( $$var > 0 ) {
+ echo "{$desc}: {$$var}\n";
+ }
}
} else {
- echo( "No suitable files could be found for import.\n" );
+ echo "No suitable files could be found for import.\n";
}
exit( 0 );
function showUsage( $reason = false ) {
if ( $reason ) {
- echo( $reason . "\n" );
+ echo $reason . "\n";
}
echo <<<TEXT
@@ -336,7 +347,7 @@ Options:
--sleep=<sec> Sleep between files. Useful mostly for debugging.
--user=<username> Set username of uploader, default 'Maintenance script'
--check-userblock Check if the user got blocked during import.
---comment=<text> Set file description, default 'Importing image file'.
+--comment=<text> Set file description, default 'Importing file'.
--comment-file=<file> Set description to the content of <file>.
--comment-ext=<ext> Causes the description for each file to be loaded from a file with the same name
but the extension <ext>. If a global description is also given, it is appended.
diff --git a/maintenance/importSiteScripts.php b/maintenance/importSiteScripts.php
index fabc6dc6..fd768b34 100644
--- a/maintenance/importSiteScripts.php
+++ b/maintenance/importSiteScripts.php
@@ -21,7 +21,7 @@
* @ingroup Maintenance
*/
-require_once( __DIR__ . '/Maintenance.php' );
+require_once __DIR__ . '/Maintenance.php';
/**
* Maintenance script to import all scripts in the MediaWiki namespace from a
@@ -105,4 +105,4 @@ class ImportSiteScripts extends Maintenance {
}
$maintClass = 'ImportSiteScripts';
-require_once( RUN_MAINTENANCE_IF_MAIN );
+require_once RUN_MAINTENANCE_IF_MAIN;
diff --git a/maintenance/importTextFile.php b/maintenance/importTextFile.php
index c04989c0..e081c20b 100644
--- a/maintenance/importTextFile.php
+++ b/maintenance/importTextFile.php
@@ -24,15 +24,15 @@
$options = array( 'help', 'nooverwrite', 'norc' );
$optionsWithArgs = array( 'title', 'user', 'comment' );
-require_once( __DIR__ . '/commandLine.inc' );
-echo( "Import Text File\n\n" );
+require_once __DIR__ . '/commandLine.inc';
+echo "Import Text File\n\n";
if ( count( $args ) < 1 || isset( $options['help'] ) ) {
showHelp();
} else {
$filename = $args[0];
- echo( "Using {$filename}..." );
+ echo "Using {$filename}...";
if ( is_file( $filename ) ) {
$title = isset( $options['title'] ) ? $options['title'] : titleFromFilename( $filename );
@@ -40,7 +40,7 @@ if ( count( $args ) < 1 || isset( $options['help'] ) ) {
if ( is_object( $title ) ) {
- echo( "\nUsing title '" . $title->getPrefixedText() . "'..." );
+ echo "\nUsing title '" . $title->getPrefixedText() . "'...";
if ( !$title->exists() || !isset( $options['nooverwrite'] ) ) {
$text = file_get_contents( $filename );
@@ -49,31 +49,31 @@ if ( count( $args ) < 1 || isset( $options['help'] ) ) {
if ( is_object( $user ) ) {
- echo( "\nUsing username '" . $user->getName() . "'..." );
+ echo "\nUsing username '" . $user->getName() . "'...";
$wgUser =& $user;
$comment = isset( $options['comment'] ) ? $options['comment'] : 'Importing text file';
$flags = 0 | ( isset( $options['norc'] ) ? EDIT_SUPPRESS_RC : 0 );
- echo( "\nPerforming edit..." );
+ echo "\nPerforming edit...";
$page = WikiPage::factory( $title );
$content = ContentHandler::makeContent( $text, $title );
$page->doEditContent( $content, $comment, $flags, false, $user );
- echo( "done.\n" );
+ echo "done.\n";
} else {
- echo( "invalid username.\n" );
+ echo "invalid username.\n";
}
} else {
- echo( "page exists.\n" );
+ echo "page exists.\n";
}
} else {
- echo( "invalid title.\n" );
+ echo "invalid title.\n";
}
} else {
- echo( "does not exist.\n" );
+ echo "does not exist.\n";
}
}
diff --git a/maintenance/initEditCount.php b/maintenance/initEditCount.php
index 3135b4c7..4b046835 100644
--- a/maintenance/initEditCount.php
+++ b/maintenance/initEditCount.php
@@ -22,7 +22,7 @@
* @ingroup Maintenance
*/
-require_once( __DIR__ . '/Maintenance.php' );
+require_once __DIR__ . '/Maintenance.php';
class InitEditCount extends Maintenance {
public function __construct() {
@@ -107,4 +107,4 @@ in the load balancer, usually indicating a replication environment.' );
}
$maintClass = "InitEditCount";
-require_once( RUN_MAINTENANCE_IF_MAIN );
+require_once RUN_MAINTENANCE_IF_MAIN;
diff --git a/maintenance/initSiteStats.php b/maintenance/initSiteStats.php
index 19906592..92268b3e 100644
--- a/maintenance/initSiteStats.php
+++ b/maintenance/initSiteStats.php
@@ -23,7 +23,7 @@
* @author Rob Church <robchur@gmail.com>
*/
-require_once( __DIR__ . '/Maintenance.php' );
+require_once __DIR__ . '/Maintenance.php';
/**
* Maintenance script to re-initialise or update the site statistics table
@@ -48,7 +48,7 @@ class InitSiteStats extends Maintenance {
$edits = $counter->edits();
$this->output( "{$edits}\nCounting number of articles..." );
- $good = $counter->articles();
+ $good = $counter->articles();
$this->output( "{$good}\nCounting total pages..." );
$pages = $counter->pages();
@@ -85,4 +85,4 @@ class InitSiteStats extends Maintenance {
}
$maintClass = "InitSiteStats";
-require_once( RUN_MAINTENANCE_IF_MAIN );
+require_once RUN_MAINTENANCE_IF_MAIN;
diff --git a/maintenance/install.php b/maintenance/install.php
index 935a2966..d118747a 100644
--- a/maintenance/install.php
+++ b/maintenance/install.php
@@ -22,14 +22,14 @@
*/
if ( !function_exists( 'version_compare' ) || ( version_compare( phpversion(), '5.3.2' ) < 0 ) ) {
- require_once( dirname( __FILE__ ) . '/../includes/PHPVersionError.php' );
+ require_once dirname( __FILE__ ) . '/../includes/PHPVersionError.php';
wfPHPVersionError( 'cli' );
}
define( 'MW_CONFIG_CALLBACK', 'Installer::overrideConfig' );
define( 'MEDIAWIKI_INSTALL', true );
-require_once( dirname( __DIR__ )."/maintenance/Maintenance.php" );
+require_once dirname( __DIR__ ) . "/maintenance/Maintenance.php";
/**
* Maintenance script to install and configure MediaWiki
@@ -41,7 +41,7 @@ class CommandLineInstaller extends Maintenance {
parent::__construct();
global $IP;
- $this->addArg( 'name', 'The name of the wiki', true);
+ $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.', false, true );
@@ -109,13 +109,13 @@ class CommandLineInstaller extends Maintenance {
InstallerOverrides::getCliInstaller( $siteName, $adminName, $this->mOptions );
$status = $installer->doEnvironmentChecks();
- if( $status->isGood() ) {
+ if ( $status->isGood() ) {
$installer->showMessage( 'config-env-good' );
} else {
$installer->showStatusMessage( $status );
return;
}
- if( !$this->hasOption( 'env-checks' ) ) {
+ if ( !$this->hasOption( 'env-checks' ) ) {
$installer->execute();
$installer->writeConfigurationFile( $this->getOption( 'confpath', $IP ) );
}
@@ -130,4 +130,4 @@ class CommandLineInstaller extends Maintenance {
$maintClass = "CommandLineInstaller";
-require_once( RUN_MAINTENANCE_IF_MAIN );
+require_once RUN_MAINTENANCE_IF_MAIN;
diff --git a/maintenance/jsduck/MetaTags.rb b/maintenance/jsduck/MetaTags.rb
index 84e40213..83cc0884 100644
--- a/maintenance/jsduck/MetaTags.rb
+++ b/maintenance/jsduck/MetaTags.rb
@@ -3,6 +3,22 @@
# - https://github.com/senchalabs/jsduck/wiki/Custom-tags
require 'jsduck/meta_tag'
+class SourceTag < JsDuck::MetaTag
+ def initialize
+ # This defines the name of the @tag
+ @name = 'source'
+ end
+
+ # Generate HTML output for this tag.
+ # One can make use of the #format method to easily support
+ # Markdown and {@link} tags inside the contents of the tag.
+ #
+ # @param tags All matches of this tag on one class.
+ def to_html(tags)
+ '<h3 class="pa">Source</h3>' + tags.map {|tag| format(tag) }.join("\n")
+ end
+end
+
class ContextTag < JsDuck::MetaTag
def initialize
@name = 'context'
diff --git a/maintenance/jsduck/categories.json b/maintenance/jsduck/categories.json
index 4a8ba8c3..f96902d8 100644
--- a/maintenance/jsduck/categories.json
+++ b/maintenance/jsduck/categories.json
@@ -9,21 +9,30 @@
"mw.Map",
"mw.Message",
"mw.loader",
+ "mw.log",
"mw.html",
"mw.html.Cdata",
- "mw.html.Raw"
+ "mw.html.Raw",
+ "mw.hook"
]
},
{
"name": "General",
"classes": [
"mw.Title",
+ "mw.inspect",
+ "mw.inspect.reports",
"mw.notification",
+ "mw.user",
"mw.util",
- "mw.plugin.notify"
+ "mw.plugin.*"
]
},
{
+ "name": "Actions",
+ "classes": ["mw.toolbar"]
+ },
+ {
"name": "API",
"classes": ["mw.Api*"]
}
@@ -33,20 +42,20 @@
"name": "jQuery",
"groups": [
{
- "name": "Core",
- "classes": ["jQuery", "jQuery.Event", "jQuery.Promise", "jQuery.Deferred", "jQuery.jqXHR"]
- },
- {
"name": "Plugins",
"classes": ["jQuery.plugin.*"]
}
]
},
{
- "name": "Misc",
+ "name": "Upstream",
"groups": [
{
- "name": "Native",
+ "name": "jQuery",
+ "classes": ["jQuery", "jQuery.Event", "jQuery.Callbacks", "jQuery.Promise", "jQuery.Deferred", "jQuery.jqXHR", "QUnit"]
+ },
+ {
+ "name": "JavaScript",
"classes": ["Array", "Boolean", "Date", "Function", "Number", "Object", "RegExp", "String"]
}
]
diff --git a/maintenance/jsduck/config.json b/maintenance/jsduck/config.json
index c4705d8f..e6e0f658 100644
--- a/maintenance/jsduck/config.json
+++ b/maintenance/jsduck/config.json
@@ -1,18 +1,27 @@
{
- "--title": "MediaWiki Code Documentation",
+ "--title": "MediaWiki core - Documentation",
+ "--footer": "Documentation for MediaWiki core. Generated on {DATE} by {JSDUCK} {VERSION}.",
"--categories": "./categories.json",
"--meta-tags": "./MetaTags.rb",
+ "--eg-iframe": "./eg-iframe.html",
"--warnings": ["-no_doc"],
"--builtin-classes": true,
"--output": "../../docs/js",
"--": [
"./external.js",
"../../resources/mediawiki/mediawiki.js",
+ "../../resources/mediawiki/mediawiki.log.js",
"../../resources/mediawiki/mediawiki.util.js",
"../../resources/mediawiki/mediawiki.Title.js",
+ "../../resources/mediawiki/mediawiki.inspect.js",
"../../resources/mediawiki/mediawiki.notify.js",
"../../resources/mediawiki/mediawiki.notification.js",
+ "../../resources/mediawiki/mediawiki.user.js",
+ "../../resources/mediawiki.action/mediawiki.action.edit.js",
+ "../../resources/mediawiki.action/mediawiki.action.view.postEdit.js",
+ "../../resources/mediawiki.page/mediawiki.page.startup.js",
"../../resources/mediawiki.api",
- "../../resources/jquery/jquery.localize.js"
+ "../../resources/jquery/jquery.localize.js",
+ "../../resources/jquery/jquery.spinner.js"
]
-} \ No newline at end of file
+}
diff --git a/maintenance/jsduck/eg-iframe.html b/maintenance/jsduck/eg-iframe.html
index f53b4044..86eae4b6 100644
--- a/maintenance/jsduck/eg-iframe.html
+++ b/maintenance/jsduck/eg-iframe.html
@@ -2,19 +2,87 @@
<html>
<head>
<meta charset="utf-8">
- <title>MediaWiki Examples</title>
+ <title>MediaWiki Code Example</title>
+ <script src="modules/startup.js"></script>
<script>
- function loadInlineExample(code, options, callback) {
+ function startUp() {
+ mw.config = new mw.Map();
+ }
+ </script>
+ <script src="modules/jquery/jquery.js"></script>
+ <script src="modules/mediawiki/mediawiki.js"></script>
+ <style>
+ .mw-jsduck-log {
+ position: relative;
+ min-height: 3em;
+ margin-top: 2em;
+ background: #f7f7f7;
+ border: 1px solid #e4e4e4;
+ }
+
+ .mw-jsduck-log::after {
+ position: absolute;
+ bottom: 100%;
+ right: -1px;
+ padding: 0.5em;
+ background: #fff;
+ border: 1px solid #e4e4e4;
+ border-bottom: 0;
+ border-radius: 0.5em 0.5em 0 0;
+ font: normal 0.5em sans-serif;
+ content: 'console';
+ }
+
+ .mw-jsduck-log-line {
+ padding: 0.2em 0.5em;
+ white-space: pre-wrap;
+ }
+
+ .mw-jsduck-log-line:nth-child(odd) {
+ background: #fff;
+ }
+ </style>
+</head>
+<body>
+ <script>
+ /**
+ * Basic log console for the example iframe in documentation pages.
+ */
+ ( function () {
+ var pre;
+ mw.log = function () {
+ var str, i, len, line;
+ if ( !pre ) {
+ pre = document.createElement( 'pre' );
+ pre.className = 'mw-jsduck-log';
+ document.body.appendChild( pre );
+ }
+ str = [];
+ for ( i = 0, len = arguments.length; i < len; i++ ) {
+ str.push( String( arguments[ i ] ) );
+ }
+ line = document.createElement( 'div' );
+ line.className = 'mw-jsduck-log-line';
+ line.appendChild(
+ document.createTextNode( str.join( ' , ' ) + '\n' )
+ );
+ pre.appendChild( line );
+ };
+ }() );
+
+ /**
+ * Method called by jsduck to execute the example code.
+ */
+ function loadInlineExample( code, options, callback ) {
try {
- document.body.innerHTML = '';
- eval(code);
- callback && callback(true);
+ eval( code );
+ callback && callback( true );
} catch (e) {
- document.body.innerHTML = document.createTextNode(e);
- callback && callback(false, e);
+ mw.log( 'Uncaught exception: ' + e );
+ callback && callback( false, e );
+ throw e;
}
}
</script>
-</head>
-<body></body>
+</body>
</html>
diff --git a/maintenance/jsduck/external.js b/maintenance/jsduck/external.js
index 8ab102f4..4bb83694 100644
--- a/maintenance/jsduck/external.js
+++ b/maintenance/jsduck/external.js
@@ -1,26 +1,44 @@
/**
* @class jQuery
+ * @source <http://api.jquery.com/>
*/
/**
* @method ajax
+ * @static
+ * @source <http://api.jquery.com/jQuery.ajax/>
* @return {jqXHR}
*/
/**
* @class jQuery.Event
+ * @source <http://api.jquery.com/Types/#Event>
+ */
+
+/**
+ * @class jQuery.Callbacks
+ * @source <http://api.jquery.com/jQuery.Callbacks/>
*/
/**
* @class jQuery.Promise
+ * @source <http://api.jquery.com/Types/#Promise>
*/
/**
* @class jQuery.Deferred
* @mixins jQuery.Promise
+ * @source <http://api.jquery.com/jQuery.Deferred/>
*/
/**
* @class jQuery.jqXHR
+ * @source <http://api.jquery.com/Types/#jqXHR>
* @alternateClassName jqXHR
*/
+
+
+/**
+ * @class QUnit
+ * @source <http://api.qunitjs.com/>
+ */
diff --git a/maintenance/jsparse.php b/maintenance/jsparse.php
index 1a2e121c..3f0a9ba7 100644
--- a/maintenance/jsparse.php
+++ b/maintenance/jsparse.php
@@ -21,7 +21,7 @@
* @ingroup Maintenance
*/
-require_once( __DIR__ . '/Maintenance.php' );
+require_once __DIR__ . '/Maintenance.php';
/**
* Maintenance script to do test JavaScript validity parses using jsmin+'s parser
@@ -50,7 +50,7 @@ class JSParseHelper extends Maintenance {
wfSuppressWarnings();
$js = file_get_contents( $filename );
wfRestoreWarnings();
- if ($js === false) {
+ if ( $js === false ) {
$this->output( "$filename ERROR: could not read file\n" );
$this->errs++;
continue;
@@ -58,7 +58,7 @@ class JSParseHelper extends Maintenance {
try {
$parser->parse( $js, $filename, 1 );
- } catch (Exception $e) {
+ } catch ( Exception $e ) {
$this->errs++;
$this->output( "$filename ERROR: " . $e->getMessage() . "\n" );
continue;
@@ -67,11 +67,11 @@ class JSParseHelper extends Maintenance {
$this->output( "$filename OK\n" );
}
- if ($this->errs > 0) {
- exit(1);
+ if ( $this->errs > 0 ) {
+ exit( 1 );
}
}
}
$maintClass = "JSParseHelper";
-require_once( RUN_MAINTENANCE_IF_MAIN );
+require_once RUN_MAINTENANCE_IF_MAIN;
diff --git a/maintenance/lag.php b/maintenance/lag.php
index 3df11692..410bf756 100644
--- a/maintenance/lag.php
+++ b/maintenance/lag.php
@@ -21,7 +21,7 @@
* @ingroup Maintenance
*/
-require_once( __DIR__ . '/Maintenance.php' );
+require_once __DIR__ . '/Maintenance.php';
/**
* Maintenance script to show database lag.
@@ -68,4 +68,4 @@ class DatabaseLag extends Maintenance {
}
$maintClass = "DatabaseLag";
-require_once( RUN_MAINTENANCE_IF_MAIN );
+require_once RUN_MAINTENANCE_IF_MAIN;
diff --git a/maintenance/language/StatOutputs.php b/maintenance/language/StatOutputs.php
index 20fb4778..e9d8c86d 100644
--- a/maintenance/language/StatOutputs.php
+++ b/maintenance/language/StatOutputs.php
@@ -1,5 +1,7 @@
<?php
-if ( !defined( 'MEDIAWIKI' ) ) die();
+if ( !defined( 'MEDIAWIKI' ) ) {
+ die();
+}
/**
* Statistic output classes.
*
@@ -52,9 +54,9 @@ class wikiStatsOutput extends statsOutput {
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 'English (en) is excluded because it is the default localization';
- if( is_array( $wgDummyLanguageCodes ) ) {
+ if ( is_array( $wgDummyLanguageCodes ) ) {
$dummyCodes = array();
- foreach( $wgDummyLanguageCodes as $dummyCode => $correctCode ) {
+ foreach ( $wgDummyLanguageCodes as $dummyCode => $correctCode ) {
$dummyCodes[] = Language::fetchLanguageName( $dummyCode ) . ' (' . $dummyCode . ')';
}
echo ', as well as the following languages that are not intended for system message translations, usually because they redirect to other language codes: ' . implode( ', ', $dummyCodes );
@@ -80,7 +82,9 @@ class wikiStatsOutput extends statsOutput {
# 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;
+ if ( $v > 255 ) {
+ $v = 255;
+ }
$v = 255 - $v;
}
if ( $v < 128 ) {
diff --git a/maintenance/language/alltrans.php b/maintenance/language/alltrans.php
index 8caf8677..d0e6e849 100644
--- a/maintenance/language/alltrans.php
+++ b/maintenance/language/alltrans.php
@@ -21,7 +21,7 @@
* @ingroup MaintenanceLanguage
*/
-require_once( __DIR__ . '/../Maintenance.php' );
+require_once __DIR__ . '/../Maintenance.php';
/**
* Maintenance script that gets all messages as defined by the
@@ -44,4 +44,4 @@ class AllTrans extends Maintenance {
}
$maintClass = "AllTrans";
-require_once( RUN_MAINTENANCE_IF_MAIN );
+require_once RUN_MAINTENANCE_IF_MAIN;
diff --git a/maintenance/language/checkDupeMessages.php b/maintenance/language/checkDupeMessages.php
index 6abf7b44..381ddae1 100644
--- a/maintenance/language/checkDupeMessages.php
+++ b/maintenance/language/checkDupeMessages.php
@@ -21,7 +21,7 @@
* @ingroup MaintenanceLanguage
*/
-require_once( __DIR__ . '/../commandLine.inc' );
+require_once __DIR__ . '/../commandLine.inc';
$messagesDir = __DIR__ . '/../../languages/messages/';
$runTest = false;
$run = false;
@@ -52,7 +52,7 @@ Options:
* mode: Output format, can be either:
* text: Text output on the console (default)
* wiki: Wiki format, with * at beginning of each line
- * php: Output text as PHP syntax in a array $dupeMessages
+ * php: Output text as PHP syntax in an array named \$dupeMessages
* raw: Raw output for duplicates
TEXT;
}
@@ -80,35 +80,37 @@ if ( $run ) {
} elseif ( !strcmp( $runMode, 'raw' ) ) {
$runMode = 'raw';
}
- include( $messagesFile );
+ include $messagesFile;
$messageExist = isset( $messages );
- if ( $messageExist )
+ if ( $messageExist ) {
$wgMessages[$langCode] = $messages;
- include( $messagesFileC );
+ }
+ include $messagesFileC;
$messageCExist = isset( $messages );
- if ( $messageCExist )
+ if ( $messageCExist ) {
$wgMessages[$langCodeC] = $messages;
+ }
$count = 0;
if ( ( $messageExist ) && ( $messageCExist ) ) {
if ( !strcmp( $runMode, 'php' ) ) {
- print( "<?php\n" );
- print( '$dupeMessages = array(' . "\n" );
+ 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" );
+ print "$key\n";
} elseif ( !strcmp( $runMode, 'php' ) ) {
- print( "'$key' => '',\n" );
+ print "'$key' => '',\n";
} elseif ( !strcmp( $runMode, 'wiki' ) ) {
$uKey = ucfirst( $key );
- print( "* MediaWiki:$uKey/$langCode\n" );
+ print "* MediaWiki:$uKey/$langCode\n";
} else {
- print( "* $key\n" );
+ print "* $key\n";
}
$count++;
}
@@ -116,7 +118,7 @@ if ( $run ) {
}
}
if ( !strcmp( $runMode, 'php' ) ) {
- print( ");\n" );
+ print ");\n";
}
if ( !strcmp( $runMode, 'text' ) ) {
if ( $count == 1 ) {
@@ -126,9 +128,11 @@ if ( $run ) {
}
}
} 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 ebc62b60..79a4dd98 100644
--- a/maintenance/language/checkExtensions.php
+++ b/maintenance/language/checkExtensions.php
@@ -21,14 +21,14 @@
* @ingroup MaintenanceLanguage
*/
-require_once( __DIR__ . '/../commandLine.inc' );
-require_once( 'languages.inc' );
-require_once( 'checkLanguage.inc' );
+require_once __DIR__ . '/../commandLine.inc';
+require_once 'languages.inc';
+require_once 'checkLanguage.inc';
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' );
+ require_once 'extensions/Translate/Translate.php';
\$wgTranslateEC = array_keys( \$wgTranslateAC );
If you still get this message, update Translate to its latest version.
diff --git a/maintenance/language/checkLanguage.inc b/maintenance/language/checkLanguage.inc
index 1860f4a5..4b49ada3 100644
--- a/maintenance/language/checkLanguage.inc
+++ b/maintenance/language/checkLanguage.inc
@@ -25,7 +25,7 @@
* @ingroup MaintenanceLanguage
*/
class CheckLanguageCLI {
- protected $code = null;
+ protected $code = null;
protected $level = 2;
protected $doLinks = false;
protected $linksPrefix = '';
@@ -46,7 +46,7 @@ class CheckLanguageCLI {
public function __construct( array $options ) {
if ( isset( $options['help'] ) ) {
echo $this->help();
- exit(1);
+ exit( 1 );
}
if ( isset( $options['lang'] ) ) {
@@ -134,24 +134,24 @@ class CheckLanguageCLI {
protected function getChecks() {
return array(
'untranslated' => 'getUntranslatedMessages',
- 'duplicate' => 'getDuplicateMessages',
- 'obsolete' => 'getObsoleteMessages',
- 'variables' => 'getMessagesWithMismatchVariables',
- 'plural' => 'getMessagesWithoutPlural',
- 'empty' => 'getEmptyMessages',
- 'whitespace' => 'getMessagesWithWhitespace',
- 'xhtml' => 'getNonXHTMLMessages',
- 'chars' => 'getMessagesWithWrongChars',
- 'links' => 'getMessagesWithDubiousLinks',
- 'unbalanced' => 'getMessagesWithUnbalanced',
- 'namespace' => 'getUntranslatedNamespaces',
- 'projecttalk' => 'getProblematicProjectTalks',
- 'magic' => 'getUntranslatedMagicWords',
- 'magic-old' => 'getObsoleteMagicWords',
- 'magic-over' => 'getOverridingMagicWords',
- 'magic-case' => 'getCaseMismatchMagicWords',
- 'special' => 'getUntraslatedSpecialPages',
- 'special-old' => 'getObsoleteSpecialPages',
+ 'duplicate' => 'getDuplicateMessages',
+ 'obsolete' => 'getObsoleteMessages',
+ 'variables' => 'getMessagesWithMismatchVariables',
+ 'plural' => 'getMessagesWithoutPlural',
+ 'empty' => 'getEmptyMessages',
+ 'whitespace' => 'getMessagesWithWhitespace',
+ 'xhtml' => 'getNonXHTMLMessages',
+ 'chars' => 'getMessagesWithWrongChars',
+ 'links' => 'getMessagesWithDubiousLinks',
+ 'unbalanced' => 'getMessagesWithUnbalanced',
+ 'namespace' => 'getUntranslatedNamespaces',
+ 'projecttalk' => 'getProblematicProjectTalks',
+ 'magic' => 'getUntranslatedMagicWords',
+ 'magic-old' => 'getObsoleteMagicWords',
+ 'magic-over' => 'getOverridingMagicWords',
+ 'magic-case' => 'getCaseMismatchMagicWords',
+ 'special' => 'getUntraslatedSpecialPages',
+ 'special-old' => 'getObsoleteSpecialPages',
);
}
@@ -163,14 +163,14 @@ class CheckLanguageCLI {
*/
protected function getTotalCount() {
return array(
- 'namespace' => array( 'getNamespaceNames', 'en' ),
- 'projecttalk' => null,
- 'magic' => array( 'getMagicWords', 'en' ),
- 'magic-old' => array( 'getMagicWords', null ),
- 'magic-over' => array( 'getMagicWords', null ),
- 'magic-case' => array( 'getMagicWords', null ),
- 'special' => array( 'getSpecialPageAliases', 'en' ),
- 'special-old' => array( 'getSpecialPageAliases', null ),
+ 'namespace' => array( 'getNamespaceNames', 'en' ),
+ 'projecttalk' => null,
+ 'magic' => array( 'getMagicWords', 'en' ),
+ 'magic-old' => array( 'getMagicWords', null ),
+ 'magic-over' => array( 'getMagicWords', null ),
+ 'magic-case' => array( 'getMagicWords', null ),
+ 'special' => array( 'getSpecialPageAliases', 'en' ),
+ 'special-old' => array( 'getSpecialPageAliases', null ),
);
}
@@ -181,24 +181,24 @@ class CheckLanguageCLI {
protected function getDescriptions() {
return array(
'untranslated' => '$1 message(s) of $2 are not translated to $3, but exist in en:',
- 'duplicate' => '$1 message(s) of $2 are translated the same in en and $3:',
- 'obsolete' => '$1 message(s) of $2 do not exist in en or are in the ignore list, but exist in $3:',
- 'variables' => '$1 message(s) of $2 in $3 don\'t match the variables used in en:',
- 'plural' => '$1 message(s) of $2 in $3 don\'t use {{plural}} while en uses:',
- 'empty' => '$1 message(s) of $2 in $3 are empty or -:',
- 'whitespace' => '$1 message(s) of $2 in $3 have trailing whitespace:',
- 'xhtml' => '$1 message(s) of $2 in $3 contain illegal XHTML:',
- 'chars' => '$1 message(s) of $2 in $3 include hidden chars which should not be used in the messages:',
- 'links' => '$1 message(s) of $2 in $3 have problematic link(s):',
- 'unbalanced' => '$1 message(s) of $2 in $3 have unbalanced {[]}:',
- 'namespace' => '$1 namespace name(s) of $2 are not translated to $3, but exist in en:',
- 'projecttalk' => '$1 namespace name(s) and alias(es) in $3 are project talk namespaces without the parameter:',
- 'magic' => '$1 magic word(s) of $2 are not translated to $3, but exist in en:',
- 'magic-old' => '$1 magic word(s) of $2 do not exist in en, but exist in $3:',
- 'magic-over' => '$1 magic word(s) of $2 in $3 do not contain the original en word(s):',
- 'magic-case' => '$1 magic word(s) of $2 in $3 change the case-sensitivity of the original en word:',
- 'special' => '$1 special page alias(es) of $2 are not translated to $3, but exist in en:',
- 'special-old' => '$1 special page alias(es) of $2 do not exist in en, but exist in $3:',
+ 'duplicate' => '$1 message(s) of $2 are translated the same in en and $3:',
+ 'obsolete' => '$1 message(s) of $2 do not exist in en or are in the ignore list, but exist in $3:',
+ 'variables' => '$1 message(s) of $2 in $3 don\'t match the variables used in en:',
+ 'plural' => '$1 message(s) of $2 in $3 don\'t use {{plural}} while en uses:',
+ 'empty' => '$1 message(s) of $2 in $3 are empty or -:',
+ 'whitespace' => '$1 message(s) of $2 in $3 have trailing whitespace:',
+ 'xhtml' => '$1 message(s) of $2 in $3 contain illegal XHTML:',
+ 'chars' => '$1 message(s) of $2 in $3 include hidden chars which should not be used in the messages:',
+ 'links' => '$1 message(s) of $2 in $3 have problematic link(s):',
+ 'unbalanced' => '$1 message(s) of $2 in $3 have unbalanced {[]}:',
+ 'namespace' => '$1 namespace name(s) of $2 are not translated to $3, but exist in en:',
+ 'projecttalk' => '$1 namespace name(s) and alias(es) in $3 are project talk namespaces without the parameter:',
+ 'magic' => '$1 magic word(s) of $2 are not translated to $3, but exist in en:',
+ 'magic-old' => '$1 magic word(s) of $2 do not exist in en, but exist in $3:',
+ 'magic-over' => '$1 magic word(s) of $2 in $3 do not contain the original en word(s):',
+ 'magic-case' => '$1 magic word(s) of $2 in $3 change the case-sensitivity of the original en word:',
+ 'special' => '$1 special page alias(es) of $2 are not translated to $3, but exist in en:',
+ 'special-old' => '$1 special page alias(es) of $2 do not exist in en, but exist in $3:',
);
}
@@ -222,7 +222,7 @@ Parameters:
--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: Do not check for EXIF messages (a bit hard and boring to translate), if you know
+ --noexif: Do not 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: Do not do the following checks (form: code,code).
@@ -299,6 +299,7 @@ ENDS;
*/
protected function getCheckBlacklist() {
global $checkBlacklist;
+
return $checkBlacklist;
}
@@ -313,6 +314,7 @@ ENDS;
$results = array();
if ( $this->level === 0 ) {
$this->L->getMessages( $code );
+
return $results;
}
@@ -320,7 +322,8 @@ ENDS;
$checkBlacklist = $this->getCheckBlacklist();
foreach ( $this->checks as $check ) {
if ( isset( $checkBlacklist[$code] ) &&
- in_array( $check, $checkBlacklist[$code] ) ) {
+ in_array( $check, $checkBlacklist[$code] )
+ ) {
$results[$check] = array();
continue;
}
@@ -384,7 +387,7 @@ ENDS;
echo "[messages are hidden]\n";
} else {
foreach ( $messages as $key => $value ) {
- if( !in_array( $check, $this->nonMessageChecks() ) ) {
+ if ( !in_array( $check, $this->nonMessageChecks() ) ) {
$key = $this->formatKey( $key, $code );
}
if ( $this->level == 2 || empty( $value ) ) {
@@ -411,7 +414,7 @@ ENDS;
$problems = 0;
$detailTextForLangChecks = array();
foreach ( $results as $check => $messages ) {
- if( in_array( $check, $this->nonMessageChecks() ) ) {
+ if ( in_array( $check, $this->nonMessageChecks() ) ) {
continue;
}
$count = count( $messages );
@@ -427,7 +430,6 @@ ENDS;
} else {
$numbers[] = $count;
}
-
}
if ( count( $detailTextForLangChecks ) ) {
@@ -463,13 +465,14 @@ EOL;
* @return bool True if there are any results, false if not.
*/
protected function isEmpty() {
- foreach( $this->results as $results ) {
- foreach( $results as $messages ) {
- if( !empty( $messages ) ) {
+ foreach ( $this->results as $results ) {
+ foreach ( $results as $messages ) {
+ if ( !empty( $messages ) ) {
return false;
}
}
}
+
return true;
}
}
@@ -488,7 +491,7 @@ class CheckExtensionsCLI extends CheckLanguageCLI {
public function __construct( array $options, $extension ) {
if ( isset( $options['help'] ) ) {
echo $this->help();
- exit(1);
+ exit( 1 );
}
if ( isset( $options['lang'] ) ) {
@@ -645,16 +648,16 @@ ENDS;
* @throws MWException
*/
protected function checkLanguage( $code ) {
- foreach( $this->extensions as $extension ) {
+ foreach ( $this->extensions as $extension ) {
$this->L = $extension;
$this->results = array();
$this->results[$code] = parent::checkLanguage( $code );
- if( !$this->isEmpty() ) {
+ if ( !$this->isEmpty() ) {
echo $extension->name() . ":\n";
- if( $this->level > 0 ) {
- switch( $this->output ) {
+ if ( $this->level > 0 ) {
+ switch ( $this->output ) {
case 'plain':
$this->outputText();
break;
@@ -675,48 +678,49 @@ ENDS;
# Blacklist some checks for some languages
$checkBlacklist = array(
#'code' => array( 'check1', 'check2' ... )
-'az' => array( 'plural' ),
-'bo' => array( 'plural' ),
-'dz' => array( 'plural' ),
-'id' => array( 'plural' ),
-'fa' => array( 'plural' ),
-'gan' => array( 'plural' ),
-'gan-hans' => array( 'plural' ),
-'gan-hant' => array( 'plural' ),
-'gn' => array( 'plural' ),
-'hak' => array( 'plural' ),
-'hu' => array( 'plural' ),
-'ja' => array( 'plural' ), // Does not use plural
-'jv' => array( 'plural' ),
-'ka' => array( 'plural' ),
-'kk-arab' => array( 'plural' ),
-'kk-cyrl' => array( 'plural' ),
-'kk-latn' => array( 'plural' ),
-'km' => array( 'plural' ),
-'kn' => array( 'plural' ),
-'ko' => array( 'plural' ),
-'lzh' => array( 'plural' ),
-'mn' => array( 'plural' ),
-'ms' => array( 'plural' ),
-'my' => array( 'plural', 'chars' ), // Uses a lot zwnj
-'sah' => array( 'plural' ),
-'sq' => array( 'plural' ),
-'tet' => array( 'plural' ),
-'th' => array( 'plural' ),
-'to' => array( 'plural' ),
-'tr' => array( 'plural' ),
-'vi' => array( 'plural' ),
-'wuu' => array( 'plural' ),
-'xmf' => array( 'plural' ),
-'yo' => array( 'plural' ),
-'yue' => array( 'plural' ),
-'zh' => array( 'plural' ),
-'zh-classical' => array( 'plural' ),
-'zh-cn' => array( 'plural' ),
-'zh-hans' => array( 'plural' ),
-'zh-hant' => array( 'plural' ),
-'zh-hk' => array( 'plural' ),
-'zh-sg' => array( 'plural' ),
-'zh-tw' => array( 'plural' ),
-'zh-yue' => array( 'plural' ),
+ 'az' => array( 'plural' ),
+ 'bo' => array( 'plural' ),
+ 'cdo' => array( 'plural' ),
+ 'dz' => array( 'plural' ),
+ 'id' => array( 'plural' ),
+ 'fa' => array( 'plural' ),
+ 'gan' => array( 'plural' ),
+ 'gan-hans' => array( 'plural' ),
+ 'gan-hant' => array( 'plural' ),
+ 'gn' => array( 'plural' ),
+ 'hak' => array( 'plural' ),
+ 'hu' => array( 'plural' ),
+ 'ja' => array( 'plural' ), // Does not use plural
+ 'jv' => array( 'plural' ),
+ 'ka' => array( 'plural' ),
+ 'kk-arab' => array( 'plural' ),
+ 'kk-cyrl' => array( 'plural' ),
+ 'kk-latn' => array( 'plural' ),
+ 'km' => array( 'plural' ),
+ 'kn' => array( 'plural' ),
+ 'ko' => array( 'plural' ),
+ 'lzh' => array( 'plural' ),
+ 'mn' => array( 'plural' ),
+ 'ms' => array( 'plural' ),
+ 'my' => array( 'plural', 'chars' ), // Uses a lot zwnj
+ 'sah' => array( 'plural' ),
+ 'sq' => array( 'plural' ),
+ 'tet' => array( 'plural' ),
+ 'th' => array( 'plural' ),
+ 'to' => array( 'plural' ),
+ 'tr' => array( 'plural' ),
+ 'vi' => array( 'plural' ),
+ 'wuu' => array( 'plural' ),
+ 'xmf' => array( 'plural' ),
+ 'yo' => array( 'plural' ),
+ 'yue' => array( 'plural' ),
+ 'zh' => array( 'plural' ),
+ 'zh-classical' => array( 'plural' ),
+ 'zh-cn' => array( 'plural' ),
+ 'zh-hans' => array( 'plural' ),
+ 'zh-hant' => array( 'plural' ),
+ 'zh-hk' => array( 'plural' ),
+ 'zh-sg' => array( 'plural' ),
+ 'zh-tw' => array( 'plural' ),
+ 'zh-yue' => array( 'plural' ),
);
diff --git a/maintenance/language/checkLanguage.php b/maintenance/language/checkLanguage.php
index 99ba4e98..ec6e1226 100644
--- a/maintenance/language/checkLanguage.php
+++ b/maintenance/language/checkLanguage.php
@@ -21,9 +21,9 @@
* @ingroup MaintenanceLanguage
*/
-require_once( __DIR__ . '/../commandLine.inc' );
-require_once( 'checkLanguage.inc' );
-require_once( 'languages.inc' );
+require_once __DIR__ . '/../commandLine.inc';
+require_once 'checkLanguage.inc';
+require_once 'languages.inc';
$cli = new CheckLanguageCLI( $options );
diff --git a/maintenance/language/countMessages.php b/maintenance/language/countMessages.php
index 5058a549..95a7154b 100644
--- a/maintenance/language/countMessages.php
+++ b/maintenance/language/countMessages.php
@@ -21,7 +21,7 @@
* @ingroup MaintenanceLanguage
*/
-require_once( __DIR__ . '/../Maintenance.php' );
+require_once __DIR__ . '/../Maintenance.php';
/**
* Maintenance script that counts how many messages we have defined
@@ -59,7 +59,7 @@ class CountMessages extends Maintenance {
private function getNumMessages( $file ) {
// Separate function to limit scope
- require( $file );
+ require $file;
if ( isset( $messages ) ) {
return count( $messages );
} else {
@@ -69,4 +69,4 @@ class CountMessages extends Maintenance {
}
$maintClass = "CountMessages";
-require_once( RUN_MAINTENANCE_IF_MAIN );
+require_once RUN_MAINTENANCE_IF_MAIN;
diff --git a/maintenance/language/date-formats.php b/maintenance/language/date-formats.php
index ed12b786..14634185 100644
--- a/maintenance/language/date-formats.php
+++ b/maintenance/language/date-formats.php
@@ -21,7 +21,7 @@
* @ingroup MaintenanceLanguage
*/
-require_once( __DIR__ . '/../Maintenance.php' );
+require_once __DIR__ . '/../Maintenance.php';
/**
* Maintenance script that tests various language time and date functions.
@@ -79,4 +79,4 @@ class DateFormats extends Maintenance {
}
$maintClass = "DateFormats";
-require_once( RUN_MAINTENANCE_IF_MAIN );
+require_once RUN_MAINTENANCE_IF_MAIN;
diff --git a/maintenance/language/digit2html.php b/maintenance/language/digit2html.php
index 9d4cbe7e..a6e0456a 100644
--- a/maintenance/language/digit2html.php
+++ b/maintenance/language/digit2html.php
@@ -21,7 +21,7 @@
* @ingroup MaintenanceLanguage
*/
-require_once( __DIR__ . '/../Maintenance.php' );
+require_once __DIR__ . '/../Maintenance.php';
/**
* Maintenance script that check digit transformation.
@@ -49,7 +49,7 @@ class Digit2Html extends Maintenance {
$filename = Language::getMessagesFileName( $code );
$this->output( "Loading language [$code] ... " );
unset( $digitTransformTable );
- require_once( $filename );
+ require_once $filename;
if ( !isset( $digitTransformTable ) ) {
$this->error( "\$digitTransformTable not found for lang: $code" );
continue;
@@ -66,4 +66,4 @@ class Digit2Html extends Maintenance {
}
$maintClass = "Digit2Html";
-require_once( RUN_MAINTENANCE_IF_MAIN );
+require_once RUN_MAINTENANCE_IF_MAIN;
diff --git a/maintenance/language/dumpMessages.php b/maintenance/language/dumpMessages.php
index 0292d314..a72e25b8 100644
--- a/maintenance/language/dumpMessages.php
+++ b/maintenance/language/dumpMessages.php
@@ -23,7 +23,7 @@
* @todo Make this more useful, right now just dumps $wgContLang
*/
-require_once( __DIR__ . '/../Maintenance.php' );
+require_once __DIR__ . '/../Maintenance.php';
/**
* Maintenance script that dumps an entire language, using the keys from English.
@@ -49,4 +49,4 @@ class DumpMessages extends Maintenance {
}
$maintClass = "DumpMessages";
-require_once( RUN_MAINTENANCE_IF_MAIN );
+require_once RUN_MAINTENANCE_IF_MAIN;
diff --git a/maintenance/language/generateCollationData.php b/maintenance/language/generateCollationData.php
index 12823c0c..fcf2c960 100644
--- a/maintenance/language/generateCollationData.php
+++ b/maintenance/language/generateCollationData.php
@@ -21,7 +21,7 @@
* @ingroup MaintenanceLanguage
*/
-require_once( __DIR__ .'/../Maintenance.php' );
+require_once __DIR__ . '/../Maintenance.php';
/**
* Generate first letter data files for Collation.php
@@ -102,7 +102,7 @@ class GenerateCollationData extends Maintenance {
$error .= "You are using outdated version of ICU ($icuVersion), intended for "
. ( $unicodeVersion ? "Unicode $unicodeVersion" : "an unknown version of Unicode" )
. "; this file might not be avalaible for it, and it's not supported by MediaWiki. "
- ." You are on your own; consider upgrading PHP's intl extension or try "
+ . " You are on your own; consider upgrading PHP's intl extension or try "
. "one of the files available at:";
} elseif ( version_compare( $icuVersion, "51.0", ">=" ) ) {
// Extra recent version
@@ -386,7 +386,7 @@ class UcdXmlReader {
$this->xml = new XMLReader;
$this->xml->open( $this->fileName );
if ( !$this->xml ) {
- throw new MWException( __METHOD__.": unable to open {$this->fileName}" );
+ throw new MWException( __METHOD__ . ": unable to open {$this->fileName}" );
}
while ( $this->xml->name !== 'ucd' && $this->xml->read() );
$this->xml->read();
@@ -466,4 +466,4 @@ class UcdXmlReader {
}
$maintClass = 'GenerateCollationData';
-require_once( RUN_MAINTENANCE_IF_MAIN );
+require_once RUN_MAINTENANCE_IF_MAIN;
diff --git a/maintenance/language/generateNormalizerData.php b/maintenance/language/generateNormalizerData.php
index c03162c4..216445e4 100644
--- a/maintenance/language/generateNormalizerData.php
+++ b/maintenance/language/generateNormalizerData.php
@@ -21,9 +21,9 @@
* @ingroup MaintenanceLanguage
*/
-require_once( __DIR__ . '/../../includes/normal/UtfNormalUtil.php' );
+require_once __DIR__ . '/../../includes/normal/UtfNormalUtil.php';
-require_once( __DIR__ . '/../Maintenance.php' );
+require_once __DIR__ . '/../Maintenance.php';
/**
* Generates normalizer data files for Arabic and Malayalam.
@@ -156,4 +156,4 @@ class GenerateNormalizerData extends Maintenance {
}
$maintClass = 'GenerateNormalizerData';
-require_once( RUN_MAINTENANCE_IF_MAIN );
+require_once RUN_MAINTENANCE_IF_MAIN;
diff --git a/maintenance/language/langmemusage.php b/maintenance/language/langmemusage.php
index ad29efb2..14485f98 100644
--- a/maintenance/language/langmemusage.php
+++ b/maintenance/language/langmemusage.php
@@ -22,8 +22,8 @@
*/
/** This is a command line script */
-require_once( __DIR__ . '/../Maintenance.php' );
-require_once( __DIR__ . '/languages.inc' );
+require_once __DIR__ . '/../Maintenance.php';
+require_once __DIR__ . '/languages.inc';
/**
* Maintenance script that tries to get the memory usage for each language file.
@@ -39,8 +39,9 @@ class LangMemUsage extends Maintenance {
}
public function execute() {
- if ( !function_exists( 'memory_get_usage' ) )
+ if ( !function_exists( 'memory_get_usage' ) ) {
$this->error( "You must compile PHP with --enable-memory-limit", true );
+ }
$langtool = new languages();
$memlast = $memstart = memory_get_usage();
@@ -61,4 +62,4 @@ class LangMemUsage extends Maintenance {
}
$maintClass = "LangMemUsage";
-require_once( RUN_MAINTENANCE_IF_MAIN );
+require_once RUN_MAINTENANCE_IF_MAIN;
diff --git a/maintenance/language/languages.inc b/maintenance/language/languages.inc
index dcd9b9b4..6070f4ab 100644
--- a/maintenance/language/languages.inc
+++ b/maintenance/language/languages.inc
@@ -43,10 +43,10 @@ class languages {
* Load the list of languages: all the Messages*.php
* files in the languages directory.
*
- * @param $exif bool Treat the EXIF messages?
+ * @param $exif bool Treat the Exif messages?
*/
function __construct( $exif = true ) {
- require( __DIR__ . '/messageTypes.inc' );
+ require __DIR__ . '/messageTypes.inc';
$this->mIgnoredMessages = $wgIgnoredMessages;
if ( $exif ) {
$this->mOptionalMessages = array_merge( $wgOptionalMessages );
@@ -107,7 +107,7 @@ class languages {
$this->mSpecialPageAliases[$code] = array();
$filename = Language::getMessagesFileName( $code );
if ( file_exists( $filename ) ) {
- require( $filename );
+ require $filename;
if ( isset( $messages ) ) {
$this->mRawMessages[$code] = $messages;
}
@@ -154,7 +154,7 @@ class languages {
if ( isset( $this->mGeneralMessages['required'][$key] ) ) {
$this->mMessages[$code]['required'][$key] = $value;
$this->mMessages[$code]['translated'][$key] = $value;
- } else if ( isset( $this->mGeneralMessages['optional'][$key] ) ) {
+ } elseif ( isset( $this->mGeneralMessages['optional'][$key] ) ) {
$this->mMessages[$code]['optional'][$key] = $value;
$this->mMessages[$code]['translated'][$key] = $value;
} else {
@@ -184,7 +184,7 @@ class languages {
foreach ( $this->mGeneralMessages['all'] as $key => $value ) {
if ( in_array( $key, $this->mIgnoredMessages ) ) {
$this->mGeneralMessages['ignored'][$key] = $value;
- } else if ( in_array( $key, $this->mOptionalMessages ) ) {
+ } elseif ( in_array( $key, $this->mOptionalMessages ) ) {
$this->mGeneralMessages['optional'][$key] = $value;
$this->mGeneralMessages['translatable'][$key] = $value;
} else {
@@ -466,11 +466,11 @@ class languages {
'[POP]' => "\xE2\x80\xAC",
'[LRO]' => "\xE2\x80\xAD",
'[RLO]' => "\xE2\x80\xAB",
- '[ZWSP]'=> "\xE2\x80\x8B",
- '[NBSP]'=> "\xC2\xA0",
- '[WJ]' => "\xE2\x81\xA0",
+ '[ZWSP]' => "\xE2\x80\x8B",
+ '[NBSP]' => "\xC2\xA0",
+ '[WJ]' => "\xE2\x81\xA0",
'[BOM]' => "\xEF\xBB\xBF",
- '[FFFD]'=> "\xEF\xBF\xBD",
+ '[FFFD]' => "\xEF\xBF\xBD",
);
$wrongRegExp = '/(' . implode( '|', array_values( $wrongChars ) ) . ')/sDu';
$wrongCharsMessages = array();
@@ -500,8 +500,8 @@ class languages {
foreach ( $this->mMessages[$code]['translated'] as $key => $value ) {
$matches = array();
preg_match_all( "/\[\[([{$tc}]+)(?:\\|(.+?))?]]/sDu", $value, $matches );
- for ($i = 0; $i < count($matches[0]); $i++ ) {
- if ( preg_match( "/.*project.*/isDu", $matches[1][$i] ) ) {
+ for ( $i = 0; $i < count( $matches[0] ); $i++ ) {
+ if ( preg_match( "/.*project.*/isDu", $matches[1][$i] ) ) {
$messages[$key][] = $matches[0][$i];
}
}
@@ -563,7 +563,9 @@ class languages {
$this->loadFile( 'en' );
$this->loadFile( $code );
$namespacesDiff = array_diff_key( $this->mNamespaceNames['en'], $this->mNamespaceNames[$code] );
- if ( isset( $namespacesDiff[NS_MAIN] ) ) unset( $namespacesDiff[NS_MAIN] );
+ if ( isset( $namespacesDiff[NS_MAIN] ) ) {
+ unset( $namespacesDiff[NS_MAIN] );
+ }
return $namespacesDiff;
}
@@ -579,7 +581,7 @@ class languages {
$namespaces = array();
# Check default namespace name
- if( isset( $this->mNamespaceNames[$code][NS_PROJECT_TALK] ) ) {
+ if ( isset( $this->mNamespaceNames[$code][NS_PROJECT_TALK] ) ) {
$default = $this->mNamespaceNames[$code][NS_PROJECT_TALK];
if ( strpos( $default, '$1' ) === false ) {
$namespaces[$default] = 'default';
@@ -587,7 +589,7 @@ class languages {
}
# Check namespace aliases
- foreach( $this->mNamespaceAliases[$code] as $key => $value ) {
+ foreach ( $this->mNamespaceAliases[$code] as $key => $value ) {
if ( $value == NS_PROJECT_TALK && strpos( $key, '$1' ) === false ) {
$namespaces[$key] = '';
}
@@ -758,9 +760,9 @@ class extensionLanguages extends languages {
* @param $code string The language code.
*/
protected function loadFile( $code ) {
- if( !isset( $this->mRawMessages[$code] ) ) {
+ if ( !isset( $this->mRawMessages[$code] ) ) {
$this->mRawMessages[$code] = $this->mMessageGroup->load( $code );
- if( empty( $this->mRawMessages[$code] ) ) {
+ if ( empty( $this->mRawMessages[$code] ) ) {
$this->mRawMessages[$code] = array();
}
}
diff --git a/maintenance/language/messageTypes.inc b/maintenance/language/messageTypes.inc
index 66cc1dcc..8676d741 100644
--- a/maintenance/language/messageTypes.inc
+++ b/maintenance/language/messageTypes.inc
@@ -96,7 +96,6 @@ $wgIgnoredMessages = array(
'talkpageheader',
'anonnotice',
'autoblock_whitelist',
- 'searchmenu-help',
'searchmenu-new-nocreate',
'googlesearch',
'opensearch-desc',
@@ -142,6 +141,7 @@ $wgIgnoredMessages = array(
'statistics-footer',
'talkpagetext',
'uploadfooter',
+ 'upload-default-description',
'listgrouprights-link',
'search-interwiki-custom',
'allpages-summary',
@@ -224,6 +224,8 @@ $wgIgnoredMessages = array(
'deletedarticle',
// 'uploadedimage',
// 'overwroteimage',
+ 'createacct-helpusername',
+ 'createacct-imgcaptcha-help',
'userlogout-summary',
'changeemail-summary',
'changepassword-summary',
@@ -242,18 +244,29 @@ $wgIgnoredMessages = array(
'version-summary',
'tags-summary',
'comparepages-summary',
+ 'resettokens-summary',
'version-entrypoints-index-php',
'version-entrypoints-api-php',
'version-entrypoints-load-php',
'ipb-default-expiry',
'pageinfo-header',
'pageinfo-footer',
+ 'createacct-benefit-head1',
+ 'createacct-benefit-icon1',
+ 'createacct-benefit-head2',
+ 'createacct-benefit-icon2',
+ 'createacct-benefit-head3',
+ 'createacct-benefit-icon3',
+ 'today-at',
+ 'redirect-text',
+ 'edithelppage',
+ 'autocomment-prefix',
+ 'move-redirect-text',
);
/** Optional messages, which may be translated only if changed in the target language. */
$wgOptionalMessages = array(
'linkprefix',
- 'editsection-brackets',
'feed-atom',
'feed-rss',
'unit-pixel',
@@ -297,40 +310,24 @@ $wgOptionalMessages = array(
'resetpass_text',
'image_sample',
'media_sample',
- 'skinname-standard',
- 'skinname-nostalgia',
'skinname-cologneblue',
'skinname-monobook',
- 'skinname-myskin',
- 'skinname-chick',
- 'skinname-simple',
'skinname-modern',
'skinname-vector',
'common.css',
- 'standard.css',
- 'nostalgia.css',
'cologneblue.css',
'monobook.css',
- 'myskin.css',
- 'chick.css',
- 'simple.css',
'modern.css',
'vector.css',
'print.css',
- 'handheld.css',
'noscript.css',
'group-autoconfirmed.css',
'group-bot.css',
'group-sysop.css',
'group-bureaucrat.css',
'common.js',
- 'standard.js',
- 'nostalgia.js',
'cologneblue.js',
'monobook.js',
- 'myskin.js',
- 'chick.js',
- 'simple.js',
'modern.js',
'vector.js',
'group-autoconfirmed.js',
@@ -460,7 +457,6 @@ $wgOptionalMessages = array(
'percent',
'parentheses',
'brackets',
- 'autocomment-prefix',
'listgrouprights-right-display',
'listgrouprights-right-revoked',
'timezone-utc',
@@ -485,9 +481,14 @@ $wgOptionalMessages = array(
'pageinfo-redirects-value',
'created', // @deprecated. Remove in MediaWiki 1.23.
'changed', // @deprecated. Remove in MediaWiki 1.23.
+ 'limitreport-ppvisitednodes-value',
+ 'limitreport-ppgeneratednodes-value',
+ 'limitreport-expansiondepth-value',
+ 'limitreport-expensivefunctioncount-value',
+ 'tooltip-iwiki',
);
-/** EXIF messages, which may be set as optional in several checks, but are generally mandatory */
+/** Exif messages, which may be set as optional in several checks, but are generally mandatory */
$wgEXIFMessages = array(
'exif-imagewidth',
'exif-imagelength',
diff --git a/maintenance/language/messages.inc b/maintenance/language/messages.inc
index c2d5847d..5e8e9744 100644
--- a/maintenance/language/messages.inc
+++ b/maintenance/language/messages.inc
@@ -56,9 +56,6 @@ $wgMessageStructure = array(
'tog-shownumberswatching',
'tog-oldsig',
'tog-fancysig',
- 'tog-externaleditor',
- 'tog-externaldiff',
- 'tog-showjumplinks',
'tog-uselivepreview',
'tog-forceeditsummary',
'tog-watchlisthideown',
@@ -72,6 +69,8 @@ $wgMessageStructure = array(
'tog-showhiddencats',
'tog-noconvertlink',
'tog-norollbackdiff',
+ 'tog-useeditwarning',
+ 'tog-prefershttps'
),
'underline' => array(
'underline-always',
@@ -136,6 +135,18 @@ $wgMessageStructure = array(
'oct',
'nov',
'dec',
+ 'january-date',
+ 'february-date',
+ 'march-date',
+ 'april-date',
+ 'may-date',
+ 'june-date',
+ 'july-date',
+ 'august-date',
+ 'september-date',
+ 'october-date',
+ 'november-date',
+ 'december-date',
),
'categorypages' => array(
'pagecategories',
@@ -226,6 +237,7 @@ $wgMessageStructure = array(
'create-this-page',
'delete',
'deletethispage',
+ 'undeletethispage',
'undelete_short',
'viewdeleted_short',
'protect',
@@ -313,7 +325,6 @@ $wgMessageStructure = array(
'youhavenewmessagesmulti',
'newtalkseparator',
'editsection',
- 'editsection-brackets',
'editold',
'viewsourceold',
'editlink',
@@ -366,8 +377,11 @@ $wgMessageStructure = array(
'errors' => array(
'error',
'databaseerror',
- 'dberrortext',
- 'dberrortextcl',
+ 'databaseerror-text',
+ 'databaseerror-textcl',
+ 'databaseerror-query',
+ 'databaseerror-function',
+ 'databaseerror-error',
'laggedslavemode',
'readonly',
'enterlockreason',
@@ -392,6 +406,7 @@ $wgMessageStructure = array(
'cannotdelete',
'cannotdelete-title',
'delete-hook-aborted',
+ 'no-null-revision',
'badtitle',
'badtitletext',
'perfcached',
@@ -407,11 +422,14 @@ $wgMessageStructure = array(
'viewyourtext',
'protectedinterface',
'editinginterface',
- 'sqlhidden',
'cascadeprotected',
'namespaceprotected',
'customcssprotected',
'customjsprotected',
+ 'mycustomcssprotected',
+ 'mycustomjsprotected',
+ 'myprivateinfoprotected',
+ 'mypreferencesprotected',
'ns-specialprotected',
'titleprotected',
'filereadonlyerror',
@@ -430,10 +448,20 @@ $wgMessageStructure = array(
'welcomeuser',
'welcomecreation-msg',
'yourname',
+ 'userlogin-yourname',
+ 'userlogin-yourname-ph',
+ 'createacct-another-username-ph',
+ 'createacct-helpusername',
'yourpassword',
+ 'userlogin-yourpassword',
+ 'userlogin-yourpassword-ph',
+ 'createacct-yourpassword-ph',
'yourpasswordagain',
+ 'createacct-yourpasswordagain',
+ 'createacct-yourpasswordagain-ph',
'remembermypassword',
- 'securelogin-stick-https',
+ 'userlogin-remembermypassword',
+ 'userlogin-signwithsecure',
'yourdomainname',
'password-change-forbidden',
'externaldberror',
@@ -446,17 +474,49 @@ $wgMessageStructure = array(
'userlogout',
'userlogout-summary',
'notloggedin',
+ 'userlogin-noaccount',
+ 'userlogin-joinproject',
'nologin',
'nologinlink',
'createaccount',
'gotaccount',
'gotaccountlink',
'userlogin-resetlink',
+ 'userlogin-resetpassword-link',
+ 'helplogin-url',
+ 'userlogin-helplink',
+ 'userlogin-loggedin',
+ 'userlogin-createanother',
+ 'createacct-join',
+ 'createacct-another-join',
+ 'createacct-emailrequired',
+ 'createacct-emailoptional',
+ 'createacct-email-ph',
+ 'createacct-another-email-ph',
'createaccountmail',
+ 'createacct-realname',
'createaccountreason',
+ 'createacct-reason',
+ 'createacct-reason-ph',
+ 'createacct-captcha',
+ 'createacct-imgcaptcha-help',
+ 'createacct-imgcaptcha-ph',
+ 'createacct-submit',
+ 'createacct-another-submit',
+ 'createacct-benefit-heading',
+ 'createacct-benefit-icon1',
+ 'createacct-benefit-head1',
+ 'createacct-benefit-body1',
+ 'createacct-benefit-icon2',
+ 'createacct-benefit-head2',
+ 'createacct-benefit-body2',
+ 'createacct-benefit-icon3',
+ 'createacct-benefit-head3',
+ 'createacct-benefit-body3',
'badretype',
'userexists',
'loginerror',
+ 'createacct-error',
'createaccounterror',
'nocookiesnew',
'nocookieslogin',
@@ -508,6 +568,7 @@ $wgMessageStructure = array(
'loginlanguagelabel',
'loginlanguagelinks',
'suspicious-userlogout',
+ 'createacct-another-realname-tip',
),
'mail' => array(
'pear-mail-error',
@@ -525,7 +586,7 @@ $wgMessageStructure = array(
'newpassword',
'retypenew',
'resetpass_submit',
- 'resetpass_success',
+ 'changepassword-success',
'resetpass_forbidden',
'resetpass-no-info',
'resetpass-submit-loggedin',
@@ -536,10 +597,11 @@ $wgMessageStructure = array(
),
'passwordreset' => array(
'passwordreset',
- 'passwordreset-text',
+ 'passwordreset-text-one',
+ 'passwordreset-text-many',
'passwordreset-legend',
'passwordreset-disabled',
- 'passwordreset-pretext',
+ 'passwordreset-emaildisabled',
'passwordreset-username',
'passwordreset-domain',
'passwordreset-capture',
@@ -566,6 +628,18 @@ $wgMessageStructure = array(
'changeemail-submit',
'changeemail-cancel',
),
+ 'resettokens' => array(
+ 'resettokens',
+ 'resettokens-summary',
+ 'resettokens-text',
+ 'resettokens-no-tokens',
+ 'resettokens-legend',
+ 'resettokens-tokens',
+ 'resettokens-token-label',
+ 'resettokens-watchlist-token',
+ 'resettokens-done',
+ 'resettokens-resetbutton',
+ ),
'toolbar' => array(
'bold_sample',
'bold_tip',
@@ -689,6 +763,7 @@ $wgMessageStructure = array(
'edit-gone-missing',
'edit-conflict',
'edit-no-change',
+ 'postedit-confirmation',
'edit-already-exists',
'addsection-preload',
'addsection-editintro',
@@ -696,6 +771,7 @@ $wgMessageStructure = array(
'content-failed-to-parse',
'invalid-content-data',
'content-not-allowed-here',
+ 'editwarning-warning',
),
'contentmodels' => array(
'content-model-wikitext',
@@ -726,6 +802,7 @@ $wgMessageStructure = array(
'undo-failure',
'undo-norev',
'undo-summary',
+ 'undo-summary-username-hidden',
),
'cantcreateaccount' => array(
'cantcreateaccounttitle',
@@ -874,6 +951,7 @@ $wgMessageStructure = array(
'compareselectedversions',
'showhideselectedversions',
'editundo',
+ 'diff-empty',
'diff-multi',
'diff-multi-manyusers',
'difference-missing-revision',
@@ -900,9 +978,7 @@ $wgMessageStructure = array(
'searchmenu-exists',
'searchmenu-new',
'searchmenu-new-nocreate',
- 'searchhelp-url',
'searchmenu-prefix',
- 'searchmenu-help',
'searchprofile-articles',
'searchprofile-project',
'searchprofile-images',
@@ -944,19 +1020,11 @@ $wgMessageStructure = array(
'search-external',
'searchdisabled',
'googlesearch',
+ 'search-error',
),
'opensearch' => array(
'opensearch-desc',
),
- 'quickbar' => array(
- 'qbsettings',
- 'qbsettings-none',
- 'qbsettings-fixedleft',
- 'qbsettings-fixedright',
- 'qbsettings-floatingleft',
- 'qbsettings-floatingright',
- 'qbsettings-directionality',
- ),
'preferences' => array(
'preferences',
'preferences-summary',
@@ -991,7 +1059,6 @@ $wgMessageStructure = array(
'resetprefs',
'restoreprefs',
'prefs-editing',
- 'prefs-edit-boxsize',
'rows',
'columns',
'searchresultshead',
@@ -1002,7 +1069,7 @@ $wgMessageStructure = array(
'recentchangesdays-max',
'recentchangescount',
'prefs-help-recentchangescount',
- 'prefs-help-watchlist-token',
+ 'prefs-help-watchlist-token2',
'savedprefs',
'timezonelegend',
'localtime',
@@ -1033,7 +1100,6 @@ $wgMessageStructure = array(
'prefs-common-css-js',
'prefs-reset-intro',
'prefs-emailconfirm-label',
- 'prefs-textboxsize',
'youremail',
'username',
'uid',
@@ -1068,6 +1134,8 @@ $wgMessageStructure = array(
'prefs-dateformat',
'prefs-timeoffset',
'prefs-advancedediting',
+ 'prefs-editor',
+ 'prefs-preview',
'prefs-advancedrc',
'prefs-advancedrendering',
'prefs-advancedsearchoptions',
@@ -1075,7 +1143,9 @@ $wgMessageStructure = array(
'prefs-displayrc',
'prefs-displaysearchoptions',
'prefs-displaywatchlist',
+ 'prefs-tokenwatchlist',
'prefs-diffs',
+ 'prefs-help-prefershttps',
),
'preferences-email' => array(
'email-address-validity-valid',
@@ -1102,6 +1172,8 @@ $wgMessageStructure = array(
'userrights-changeable-col',
'userrights-unchangeable-col',
'userrights-irreversible-marker',
+ 'userrights-conflict',
+ 'userrights-removed-self',
),
'group' => array(
'group',
@@ -1170,10 +1242,18 @@ $wgMessageStructure = array(
'right-unblockself',
'right-protect',
'right-editprotected',
+ 'right-editsemiprotected',
'right-editinterface',
'right-editusercssjs',
'right-editusercss',
'right-edituserjs',
+ 'right-editmyusercss',
+ 'right-editmyuserjs',
+ 'right-viewmywatchlist',
+ 'right-editmywatchlist',
+ 'right-viewmyprivateinfo',
+ 'right-editmyprivateinfo',
+ 'right-editmyoptions',
'right-rollback',
'right-markbotedits',
'right-noratelimit',
@@ -1235,14 +1315,21 @@ $wgMessageStructure = array(
'action-userrights-interwiki',
'action-siteadmin',
'action-sendemail',
+ 'action-editmywatchlist',
+ 'action-viewmywatchlist',
+ 'action-viewmyprivateinfo',
+ 'action-editmyprivateinfo',
),
'recentchanges' => array(
'nchanges',
+ 'enhancedrc-since-last-visit',
+ 'enhancedrc-history',
'recentchanges',
'recentchanges-url',
'recentchanges-legend',
'recentchanges-summary',
'recentchangestext',
+ 'recentchanges-noresult',
'recentchanges-feed-description',
'recentchanges-label-newpage',
'recentchanges-label-minor',
@@ -1282,7 +1369,6 @@ $wgMessageStructure = array(
'recentchangeslinked-feed',
'recentchangeslinked-toolbox',
'recentchangeslinked-title',
- 'recentchangeslinked-noresult',
'recentchangeslinked-summary',
'recentchangeslinked-page',
'recentchangeslinked-to',
@@ -1304,6 +1390,7 @@ $wgMessageStructure = array(
'upload-preferred',
'upload-prohibited',
'uploadfooter',
+ 'upload-default-description',
'uploadlog',
'uploadlogpage',
'uploadlogpagetext',
@@ -1481,7 +1568,6 @@ $wgMessageStructure = array(
'http-read-error',
'http-timed-out',
'http-curl-error',
- 'http-host-unreachable',
'http-bad-status',
),
@@ -1512,6 +1598,10 @@ $wgMessageStructure = array(
'listfiles_size',
'listfiles_description',
'listfiles_count',
+ 'listfiles-show-all',
+ 'listfiles-latestversion',
+ 'listfiles-latestversion-yes',
+ 'listfiles-latestversion-no',
),
'filedescription' => array(
'file-anchor-link',
@@ -1605,6 +1695,13 @@ $wgMessageStructure = array(
'randompage-nopages',
'randompage-url',
),
+ 'randomincategory' => array(
+ 'randomincategory',
+ 'randomincategory-invalidcategory',
+ 'randomincategory-nopages',
+ 'randomincategory-selectcategory',
+ 'randomincategory-selectcategory-submit',
+ ),
'randomredirect' => array(
'randomredirect',
'randomredirect-nopages',
@@ -1632,12 +1729,6 @@ $wgMessageStructure = array(
'statistics-mostpopular',
'statistics-footer',
),
- 'disambiguations' => array(
- 'disambiguations',
- 'disambiguations-summary',
- 'disambiguationspage',
- 'disambiguations-text',
- ),
'pageswithprop' => array(
'pageswithprop',
'pageswithprop-summary',
@@ -1645,6 +1736,8 @@ $wgMessageStructure = array(
'pageswithprop-text',
'pageswithprop-prop',
'pageswithprop-submit',
+ 'pageswithprop-prophidden-long',
+ 'pageswithprop-prophidden-binary',
),
'doubleredirects' => array(
'doubleredirects',
@@ -1728,6 +1821,7 @@ $wgMessageStructure = array(
'prefixindex',
'prefixindex-namespace',
'prefixindex-summary',
+ 'prefixindex-strip',
'shortpages',
'shortpages-summary',
'longpages',
@@ -1749,6 +1843,7 @@ $wgMessageStructure = array(
'listusers-summary',
'listusers-editsonly',
'listusers-creationsort',
+ 'listusers-desc',
'usereditcount',
'usercreated',
'newpages',
@@ -1934,7 +2029,6 @@ $wgMessageStructure = array(
'unwatchthispage',
'notanarticle',
'notvisiblerev',
- 'watchnochange',
'watchlist-details',
'wlheader-enotif',
'wlheader-showupdated',
@@ -2284,14 +2378,12 @@ $wgMessageStructure = array(
'ipb_blocked_as_range',
'ip_range_invalid',
'ip_range_toolarge',
- 'blockme',
'proxyblocker',
- 'proxyblocker-disabled',
'proxyblockreason',
- 'proxyblocksuccess',
'sorbs',
'sorbsreason',
'sorbs_create_account_reason',
+ 'xffblockreason',
'cant-block-while-blocked',
'cant-see-hidden-user',
'ipbblocked',
@@ -2355,6 +2447,7 @@ $wgMessageStructure = array(
'movesubpagetext',
'movenosubpage',
'movereason',
+ 'move-redirect-text',
'revertmove',
'delete_and_move',
'delete_and_move_text',
@@ -2416,6 +2509,7 @@ $wgMessageStructure = array(
'thumbnail-more',
'filemissing',
'thumbnail_error',
+ 'thumbnail_error_remote',
'djvu_page_error',
'djvu_no_xml',
'thumbnail-temp-create',
@@ -2488,7 +2582,7 @@ $wgMessageStructure = array(
'javascripttest-pagetext-noframework',
'javascripttest-pagetext-unknownframework',
'javascripttest-pagetext-frameworks',
- 'javascripttest-pagetext-skins' ,
+ 'javascripttest-pagetext-skins',
'javascripttest-qunit-name',
'javascripttest-qunit-intro',
'javascripttest-qunit-heading',
@@ -2633,20 +2727,15 @@ $wgMessageStructure = array(
'tooltip-undo',
'tooltip-preferences-save',
'tooltip-summary',
+ 'interlanguage-link-title',
),
'stylesheets' => array(
'common.css',
- 'standard.css',
- 'nostalgia.css',
'cologneblue.css',
'monobook.css',
- 'myskin.css',
- 'chick.css',
- 'simple.css',
'modern.css',
'vector.css',
'print.css',
- 'handheld.css',
'noscript.css',
'group-autoconfirmed.css',
'group-bot.css',
@@ -2655,13 +2744,8 @@ $wgMessageStructure = array(
),
'scripts' => array(
'common.js',
- 'standard.js',
- 'nostalgia.js',
'cologneblue.js',
'monobook.js',
- 'myskin.js',
- 'chick.js',
- 'simple.js',
'modern.js',
'vector.js',
'group-autoconfirmed.js',
@@ -2692,6 +2776,7 @@ $wgMessageStructure = array(
'spam_reverting',
'spam_blanking',
'spam_deleting',
+ 'simpleantispam-label',
),
'info' => array(
'pageinfo-header',
@@ -2743,13 +2828,8 @@ $wgMessageStructure = array(
'pageinfo-category-files'
),
'skin' => array(
- 'skinname-standard',
- 'skinname-nostalgia',
'skinname-cologneblue',
'skinname-monobook',
- 'skinname-myskin',
- 'skinname-chick',
- 'skinname-simple',
'skinname-modern',
'skinname-vector',
),
@@ -2832,11 +2912,26 @@ $wgMessageStructure = array(
'minutes',
'hours',
'days',
+ 'weeks',
'months',
'years',
'ago',
'just-now',
),
+ 'human-timestamps' => array(
+ 'hours-ago',
+ 'minutes-ago',
+ 'seconds-ago',
+ 'monday-at',
+ 'tuesday-at',
+ 'wednesday-at',
+ 'thursday-at',
+ 'friday-at',
+ 'saturday-at',
+ 'sunday-at',
+ 'today-at',
+ 'yesterday-at',
+ ),
'badimagelist' => array(
'bad_image_list',
),
@@ -3192,16 +3287,16 @@ $wgMessageStructure = array(
'exif-lightsource-255',
),
'exif-flash' => array(
- '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-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' => array(
'exif-focalplaneresolutionunit-2',
@@ -3596,7 +3691,6 @@ $wgMessageStructure = array(
'version-other',
'version-mediahandlers',
'version-hooks',
- 'version-extension-functions',
'version-parser-extensiontags',
'version-parser-function-hooks',
'version-hook-name',
@@ -3606,6 +3700,7 @@ $wgMessageStructure = array(
'version-license',
'version-poweredby-credits',
'version-poweredby-others',
+ 'version-poweredby-translators',
'version-credits-summary',
'version-license-info',
'version-software',
@@ -3620,11 +3715,18 @@ $wgMessageStructure = array(
'version-entrypoints-api-php',
'version-entrypoints-load-php',
),
- 'filepath' => array(
- 'filepath',
- 'filepath-page',
- 'filepath-submit',
- 'filepath-summary',
+ 'redirect' => array(
+ 'redirect',
+ 'redirect-legend',
+ 'redirect-text',
+ 'redirect-summary',
+ 'redirect-submit',
+ 'redirect-lookup',
+ 'redirect-value',
+ 'redirect-user',
+ 'redirect-revision',
+ 'redirect-file',
+ 'redirect-not-exists',
),
'fileduplicatesearch' => array(
'fileduplicatesearch',
@@ -3666,12 +3768,16 @@ $wgMessageStructure = array(
'tags-summary',
'tag-filter',
'tag-filter-submit',
+ 'tag-list-wrapper',
'tags-title',
'tags-intro',
'tags-tag',
'tags-display-header',
'tags-description-header',
+ 'tags-active-header',
'tags-hitcount-header',
+ 'tags-active-yes',
+ 'tags-active-no',
'tags-edit',
'tags-hitcount',
),
@@ -3693,6 +3799,7 @@ $wgMessageStructure = array(
'dberr-problems',
'dberr-again',
'dberr-info',
+ 'dberr-info-hidden',
'dberr-usegoogle',
'dberr-outofdate',
'dberr-cachederror',
@@ -3708,6 +3815,9 @@ $wgMessageStructure = array(
'htmlform-submit',
'htmlform-reset',
'htmlform-selectorother-other',
+ 'htmlform-no',
+ 'htmlform-yes',
+ 'htmlform-chosen-placeholder',
),
'sqlite' => array(
'sqlite-has-fts',
@@ -3856,6 +3966,25 @@ $wgMessageStructure = array(
'rotation' => array(
'rotate-comment',
),
+ 'limitreport' => array(
+ 'limitreport-title',
+ 'limitreport-cputime',
+ 'limitreport-cputime-value',
+ 'limitreport-walltime',
+ 'limitreport-walltime-value',
+ 'limitreport-ppvisitednodes',
+ 'limitreport-ppvisitednodes-value',
+ 'limitreport-ppgeneratednodes',
+ 'limitreport-ppgeneratednodes-value',
+ 'limitreport-postexpandincludesize',
+ 'limitreport-postexpandincludesize-value',
+ 'limitreport-templateargumentsize',
+ 'limitreport-templateargumentsize-value',
+ 'limitreport-expansiondepth',
+ 'limitreport-expansiondepth-value',
+ 'limitreport-expensivefunctioncount',
+ 'limitreport-expensivefunctioncount-value',
+ ),
);
/** Comments for each block */
@@ -3864,8 +3993,8 @@ $wgBlockComments = array(
begin with * or ** are discarded, furthermore lines that do begin with ** and
do not contain | are also discarded, but do not depend on this behavior for
future releases. Also note that since each list value is wrapped in a unique
-XHTML id it should only appear once and include characters that are legal
-XHTML id names.",
+(X)HTML id it should only appear once and include characters that are legal
+(X)HTML id names.",
'toggles' => 'User preference toggles',
'underline' => '',
'editfont' => 'Font style option in Special:Preferences',
@@ -3876,7 +4005,7 @@ XHTML id names.",
'cologneblue' => 'Cologne Blue skin',
'vector' => 'Vector skin',
'miscellaneous2' => '',
- 'links' => '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).',
+ 'links' => '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).',
'badaccess' => '',
'versionrequired' => '',
'miscellaneous3' => '',
@@ -3890,6 +4019,7 @@ XHTML id names.",
'resetpass' => 'Change password dialog',
'passwordreset' => 'Special:PasswordReset',
'changeemail' => 'Special:ChangeEmail',
+ 'resettokens' => 'Special:ResetTokens',
'toolbar' => 'Edit page toolbar',
'edit' => 'Edit pages',
'parserwarnings' => 'Parser/template warnings',
@@ -3905,7 +4035,6 @@ XHTML id names.",
'diffs' => 'Diffs',
'search' => 'Search results',
'opensearch' => 'OpenSearch description',
- 'quickbar' => 'Quickbar',
'preferences' => 'Preferences page',
'preferences-email' => 'User preference: email validation using jQuery',
'userrights' => 'User rights',
@@ -3937,9 +4066,9 @@ XHTML id names.",
'listredirects' => 'List redirects',
'unusedtemplates' => 'Unused templates',
'randompage' => 'Random page',
+ 'randomincategory' => 'Random page in category',
'randomredirect' => 'Random redirect',
'statistics' => 'Statistics',
- 'disambiguations' => '',
'pageswithprop' => '',
'doubleredirects' => '',
'brokenredirects' => '',
@@ -3995,8 +4124,9 @@ XHTML id names.",
'patrol-log' => 'Patrol log',
'imagedeletion' => 'Image deletion',
'browsediffs' => 'Browsing diffs',
- 'newfiles' => 'Special:NewFiles',
+ 'newfiles' => 'Special:NewFiles',
'video-info' => 'Video information, used by Language::formatTimePeriod() to format lengths in the above messages',
+ 'human-timestamps' => 'Human-readable timestamps',
'badimagelist' => 'Bad image list',
'variantname-zh' => "Short names for language variants used for language conversion links.
Variants for Chinese language",
@@ -4009,9 +4139,9 @@ Variants for Chinese language",
'variantname-shi' => 'Variants for Tachelhit language',
'media-info' => 'Media information',
'metadata' => 'Metadata',
- 'exif' => 'EXIF tags',
+ 'exif' => 'Exif tags',
'exif-values' => 'Make & model, can be wikified in order to link to the camera and model name',
- 'exif-compression' => 'EXIF attributes',
+ 'exif-compression' => 'Exif attributes',
'exif-copyrighted' => '',
'exif-unknowndate' => '',
'exif-photometricinterpretation' => '',
@@ -4080,7 +4210,7 @@ Variants for Chinese language",
'signatures' => 'Signatures',
'CoreParserFunctions' => 'Core parser functions',
'version' => 'Special:Version',
- 'filepath' => 'Special:FilePath',
+ 'redirect' => 'Special:Redirect',
'fileduplicatesearch' => 'Special:FileDuplicateSearch',
'special-specialpages' => 'Special:SpecialPages',
'special-blank' => 'Special:BlankPage',
@@ -4098,4 +4228,5 @@ Variants for Chinese language",
'duration' => 'Durations',
'cachedspecial' => 'SpecialCachedPage',
'rotation' => 'Image rotation',
+ 'limitreport' => 'Limit report',
);
diff --git a/maintenance/language/rebuildLanguage.php b/maintenance/language/rebuildLanguage.php
index ad839054..66948aeb 100644
--- a/maintenance/language/rebuildLanguage.php
+++ b/maintenance/language/rebuildLanguage.php
@@ -22,9 +22,9 @@
* @defgroup MaintenanceLanguage MaintenanceLanguage
*/
-require_once( __DIR__ . '/../commandLine.inc' );
-require_once( 'languages.inc' );
-require_once( 'writeMessagesArray.inc' );
+require_once __DIR__ . '/../commandLine.inc';
+require_once 'languages.inc';
+require_once 'writeMessagesArray.inc';
/**
* Rewrite a messages array.
@@ -56,13 +56,13 @@ function rebuildLanguage( $languages, $code, $write, $listUnknown, $removeUnknow
*/
function removeDupes( $oldMsgArray, $dupeMsgSource ) {
if ( file_exists( $dupeMsgSource ) ) {
- include( $dupeMsgSource );
+ include $dupeMsgSource;
if ( !isset( $dupeMessages ) ) {
- echo( "There are no duplicated messages in the source file provided." );
+ echo "There are no duplicated messages in the source file provided.";
exit( 1 );
}
} else {
- echo ( "The specified file $dupeMsgSource cannot be found." );
+ echo "The specified file $dupeMsgSource cannot be found.";
exit( 1 );
}
$newMsgArray = $oldMsgArray;
diff --git a/maintenance/language/transstat.php b/maintenance/language/transstat.php
index ba503224..61b84a07 100644
--- a/maintenance/language/transstat.php
+++ b/maintenance/language/transstat.php
@@ -28,9 +28,9 @@
*/
$optionsWithArgs = array( 'output' );
-require_once( __DIR__ . '/../commandLine.inc' );
-require_once( 'languages.inc' );
-require_once( __DIR__ . '/StatOutputs.php' );
+require_once __DIR__ . '/../commandLine.inc';
+require_once 'languages.inc';
+require_once __DIR__ . '/StatOutputs.php';
if ( isset( $options['help'] ) ) {
@@ -96,7 +96,7 @@ $wgRequiredMessagesNumber = count( $wgGeneralMessages['required'] );
foreach ( $wgLanguages->getLanguages() as $code ) {
# Don't check English, RTL English or dummy language codes
- if ( $code == 'en' || $code == 'enRTL' || (is_array( $wgDummyLanguageCodes ) &&
+ if ( $code == 'en' || $code == 'enRTL' || ( is_array( $wgDummyLanguageCodes ) &&
isset( $wgDummyLanguageCodes[$code] ) ) ) {
continue;
}
diff --git a/maintenance/language/validate.php b/maintenance/language/validate.php
index 4f00496f..63d9b847 100644
--- a/maintenance/language/validate.php
+++ b/maintenance/language/validate.php
@@ -36,8 +36,8 @@ define( 'NOT_REALLY_MEDIAWIKI', 1 );
$IP = __DIR__ . '/../..';
-require_once( "$IP/includes/Defines.php" );
-require_once( "$IP/languages/Language.php" );
+require_once "$IP/includes/Defines.php";
+require_once "$IP/languages/Language.php";
$files = array();
foreach ( $argv as $arg ) {
@@ -57,7 +57,7 @@ foreach ( $files as $filename ) {
}
function getVars( $filename ) {
- require( $filename );
+ require $filename;
$vars = get_defined_vars();
unset( $vars['filename'] );
return $vars;
diff --git a/maintenance/language/writeMessagesArray.inc b/maintenance/language/writeMessagesArray.inc
index b2e04c7f..fc0da3f5 100644
--- a/maintenance/language/writeMessagesArray.inc
+++ b/maintenance/language/writeMessagesArray.inc
@@ -50,25 +50,27 @@ class MessageWriter {
$sortedMessages = $messages[1];
# Write to the file
- if ( $messagesFolder )
+ if ( $messagesFolder ) {
$filename = Language::getFileName( "$messagesFolder/Messages", $code );
- else
+ } else {
$filename = Language::getMessagesFileName( $code );
+ }
- if ( file_exists( $filename ) )
+ if ( file_exists( $filename ) ) {
$contents = file_get_contents( $filename );
- else
+ } else {
$contents = '<?php
$messages = array(
);
';
+ }
- if( strpos( $contents, '$messages' ) !== false ) {
+ if ( strpos( $contents, '$messages' ) !== false ) {
$contents = explode( '$messages', $contents );
- if( $messagesText == '$messages' . $contents[1] ) {
+ if ( $messagesText == '$messages' . $contents[1] ) {
echo "Generated messages for language $code. Same as the current file.\n";
} else {
- if( $write ) {
+ if ( $write ) {
$new = $contents[0];
$new .= $messagesText;
file_put_contents( $filename, $new );
@@ -77,12 +79,13 @@ $messages = array(
echo "Generated messages for language $code. Please run the script again (without the parameter \"dry-run\") to write the array to the file.\n";
}
}
- if( $listUnknown && isset( $sortedMessages['unknown'] ) && !empty( $sortedMessages['unknown'] ) ) {
- if ( $removeUnknown )
+ if ( $listUnknown && isset( $sortedMessages['unknown'] ) && !empty( $sortedMessages['unknown'] ) ) {
+ if ( $removeUnknown ) {
echo "\nThe following " . count( $sortedMessages['unknown'] ) . " unknown messages have been removed:\n";
- else
+ } else {
echo "\nThere are " . count( $sortedMessages['unknown'] ) . " unknown messages, please check them:\n";
- foreach( $sortedMessages['unknown'] as $key => $value ) {
+ }
+ foreach ( $sortedMessages['unknown'] as $key => $value ) {
echo "* " . $key . "\n";
}
}
@@ -107,22 +110,22 @@ $messages = array(
# Load messages
$dir = $prefix ? $prefix : __DIR__;
- require( $dir . '/messages.inc' );
+ require $dir . '/messages.inc';
self::$messageStructure = $wgMessageStructure;
self::$blockComments = $wgBlockComments;
- require( $dir . '/messageTypes.inc' );
+ require $dir . '/messageTypes.inc';
self::$ignoredMessages = $wgIgnoredMessages;
self::$optionalMessages = $wgOptionalMessages;
# Sort messages to blocks
$sortedMessages['unknown'] = $messages;
- foreach( self::$messageStructure as $blockName => $block ) {
+ foreach ( self::$messageStructure as $blockName => $block ) {
/**
* @var $block array
*/
- foreach( $block as $key ) {
- if( array_key_exists( $key, $sortedMessages['unknown'] ) ) {
+ foreach ( $block as $key ) {
+ if ( array_key_exists( $key, $sortedMessages['unknown'] ) ) {
$sortedMessages[$blockName][$key] = $sortedMessages['unknown'][$key];
unset( $sortedMessages['unknown'][$key] );
}
@@ -132,13 +135,13 @@ $messages = array(
# Write all the messages
$messagesText = "\$messages = array(
";
- foreach( $sortedMessages as $block => $messages ) {
+ foreach ( $sortedMessages as $block => $messages ) {
# Skip if it's the block of unknown messages - handle that in the end of file
- if( $block == 'unknown' ) {
+ if ( $block == 'unknown' ) {
continue;
}
- if( $ignoredComments ) {
+ if ( $ignoredComments ) {
$ignored = self::$ignoredMessages;
$optional = self::$optionalMessages;
} else {
@@ -175,10 +178,10 @@ $messages = array(
$commentArray = array();
# List of keys only
- foreach( $messages as $key ) {
- if( in_array( $key, $ignored ) ) {
+ foreach ( $messages as $key ) {
+ if ( in_array( $key, $ignored ) ) {
$commentArray[$key] = ' # ' . self::$ignoredComment;
- } elseif( in_array( $key, $optional ) ) {
+ } elseif ( in_array( $key, $optional ) ) {
$commentArray[$key] = ' # ' . self::$optionalComment;
}
}
@@ -202,13 +205,13 @@ $messages = array(
$blockText = '';
# Skip the block if it includes no messages
- if( empty( $messages ) ) {
+ if ( empty( $messages ) ) {
return '';
}
# Format the block comment (if exists); check for multiple lines comments
- if( !empty( $blockComment ) ) {
- if( strpos( $blockComment, "\n" ) === false ) {
+ if ( !empty( $blockComment ) ) {
+ if ( strpos( $blockComment, "\n" ) === false ) {
$blockText .= "$prefix# $blockComment
";
} else {
@@ -223,7 +226,7 @@ $blockComment
$maxKeyLength = max( array_map( 'strlen', array_keys( $messages ) ) );
# Format the messages
- foreach( $messages as $key => $value ) {
+ foreach ( $messages as $key => $value ) {
# Add the key name
$blockText .= "$prefix'$key'";
@@ -241,16 +244,16 @@ $blockComment
$single = "'";
$double = '"';
- if( strpos( $value, $single ) === false ) {
+ if ( strpos( $value, $single ) === false ) {
# Nothing ugly, just use '
- $blockText .= $single.$value.$single;
- } elseif( strpos( $value, $double ) === false && !preg_match('/\$[a-zA-Z_\x7f-\xff]/', $value) ) {
+ $blockText .= $single . $value . $single;
+ } elseif ( strpos( $value, $double ) === false && !preg_match( '/\$[a-zA-Z_\x7f-\xff]/', $value ) ) {
# No "-quotes, no variables that need quoting, use "
- $blockText .= $double.$value.$double;
+ $blockText .= $double . $value . $double;
} else {
# Something needs quoting, pick the quote which causes less quoting
$quote = substr_count( $value, $double ) + substr_count( $value, '$' ) >= substr_count( $value, $single ) ? $single : $double;
- if( $quote === $double ) {
+ if ( $quote === $double ) {
$extra = '$';
} else {
$extra = '';
@@ -262,7 +265,7 @@ $blockComment
$blockText .= ',';
# Add comments, if there is any
- if( array_key_exists( $key, $messageComments ) ) {
+ if ( array_key_exists( $key, $messageComments ) ) {
$blockText .= $messageComments[$key];
}
diff --git a/maintenance/mcc.php b/maintenance/mcc.php
index 6ff8a176..7b7b7614 100644
--- a/maintenance/mcc.php
+++ b/maintenance/mcc.php
@@ -23,7 +23,7 @@
*/
/** */
-require_once( __DIR__ . '/commandLine.inc' );
+require_once __DIR__ . '/commandLine.inc';
$options = getopt( '', array( 'debug', 'help', 'cache:' ) );
@@ -48,7 +48,7 @@ if ( $cache ) {
$servers = $wgObjectCaches[$cache]['servers'];
} elseif ( $wgMainCacheType === CACHE_MEMCACHED ) {
$mcc->set_servers( $wgMemCachedServers );
-} elseif( isset( $wgObjectCaches[$wgMainCacheType]['servers'] ) ) {
+} elseif ( isset( $wgObjectCaches[$wgMainCacheType]['servers'] ) ) {
$mcc->set_servers( $wgObjectCaches[$wgMainCacheType]['servers'] );
} else {
print "MediaWiki isn't configured for Memcached usage\n";
@@ -116,7 +116,9 @@ do {
$quit = false;
$line = Maintenance::readconsole();
- if ( $line === false ) exit;
+ if ( $line === false ) {
+ exit;
+ }
$args = explode( ' ', $line );
$command = array_shift( $args );
diff --git a/maintenance/mctest.php b/maintenance/mctest.php
index 469feca2..eda101e7 100644
--- a/maintenance/mctest.php
+++ b/maintenance/mctest.php
@@ -22,7 +22,7 @@
* @ingroup Maintenance
*/
-require_once( __DIR__ . '/Maintenance.php' );
+require_once __DIR__ . '/Maintenance.php';
/**
* Maintenance script that makes several 'set', 'incr' and 'get' requests
@@ -34,7 +34,7 @@ class mcTest extends Maintenance {
public function __construct() {
parent::__construct();
$this->mDescription = "Makes several 'set', 'incr' and 'get' requests on every"
- . " memcached server and shows a report";
+ . " memcached server and shows a report";
$this->addOption( 'i', 'Number of iterations', false, true );
$this->addOption( 'cache', 'Use servers from this $wgObjectCaches store', false, true );
$this->addArg( 'server[:port]', 'Memcached server to test, with optional port', false );
@@ -54,15 +54,22 @@ class mcTest extends Maintenance {
$servers = array( $this->getArg() );
} elseif ( $wgMainCacheType === CACHE_MEMCACHED ) {
global $wgMemCachedServers;
- $servers = $wgMemCachedServers ;
+ $servers = $wgMemCachedServers;
} elseif ( isset( $wgObjectCaches[$wgMainCacheType]['servers'] ) ) {
$servers = $wgObjectCaches[$wgMainCacheType]['servers'];
} else {
$this->error( "MediaWiki isn't configured for Memcached usage", 1 );
}
+ # find out the longest server string to nicely align output later on
+ $maxSrvLen = $servers ? max( array_map( 'strlen', $servers ) ) : 0;
+
foreach ( $servers as $server ) {
- $this->output( $server . " ", $server );
+ $this->output(
+ str_pad( $server, $maxSrvLen ),
+ $server # output channel
+ );
+
$mcc = new MemCachedClientforWiki( array(
'persistant' => true,
'timeout' => $wgMemCachedTimeout
@@ -73,7 +80,7 @@ class mcTest extends Maintenance {
$get = 0;
$time_start = $this->microtime_float();
for ( $i = 1; $i <= $iterations; $i++ ) {
- if ( !is_null( $mcc->set( "test$i", $i ) ) ) {
+ if ( $mcc->set( "test$i", $i ) ) {
$set++;
}
}
@@ -90,7 +97,7 @@ class mcTest extends Maintenance {
}
$exectime = $this->microtime_float() - $time_start;
- $this->output( "set: $set incr: $incr get: $get time: $exectime", $server );
+ $this->output( " set: $set incr: $incr get: $get time: $exectime", $server );
}
}
@@ -105,4 +112,4 @@ class mcTest extends Maintenance {
}
$maintClass = "mcTest";
-require_once( RUN_MAINTENANCE_IF_MAIN );
+require_once RUN_MAINTENANCE_IF_MAIN;
diff --git a/maintenance/mergeMessageFileList.php b/maintenance/mergeMessageFileList.php
index 62596b20..e9183377 100644
--- a/maintenance/mergeMessageFileList.php
+++ b/maintenance/mergeMessageFileList.php
@@ -25,7 +25,7 @@
# Start from scratch
define( 'MW_NO_EXTENSION_MESSAGES', 1 );
-require_once( __DIR__ . '/Maintenance.php' );
+require_once __DIR__ . '/Maintenance.php';
$maintClass = 'MergeMessageFileList';
$mmfl = false;
@@ -36,10 +36,14 @@ $mmfl = false;
* @ingroup Maintenance
*/
class MergeMessageFileList extends Maintenance {
+ /**
+ * @var bool
+ */
+ protected $hasError;
function __construct() {
parent::__construct();
- $this->addOption( 'list-file', 'A file containing a list of extension setup files, one per line.', true, true );
+ $this->addOption( 'list-file', 'A file containing a list of extension setup files, one per line.', false, true );
$this->addOption( 'extensions-dir', 'Path where extensions can be found.', 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 ' .
@@ -47,21 +51,29 @@ class MergeMessageFileList extends Maintenance {
}
public function execute() {
- global $mmfl;
+ global $mmfl, $wgExtensionEntryPointListFiles;
+
+ if ( !count( $wgExtensionEntryPointListFiles )
+ && !$this->hasOption( 'list-file' )
+ && !$this->hasOption( 'extensions-dir' )
+ ) {
+ $this->error( "Either --list-file or --extensions-dir must be provided if " .
+ "\$wgExtensionEntryPointListFiles is not set", 1 );
+ }
+
+ $mmfl = array( 'setupFiles' => array() );
# Add setup files contained in file passed to --list-file
- $lines = file( $this->getOption( 'list-file' ) );
- if ( $lines === false ) {
- $this->error( 'Unable to open list file.' );
+ if ( $this->hasOption( 'list-file' ) ) {
+ $extensionPaths = $this->readFile( $this->getOption( 'list-file' ) );
+ $mmfl['setupFiles'] = array_merge( $mmfl['setupFiles'], $extensionPaths );
}
- $mmfl = array( 'setupFiles' => array_map( 'trim', $lines ) );
# Now find out files in a directory
- $hasError = false;
if ( $this->hasOption( 'extensions-dir' ) ) {
$extdir = $this->getOption( 'extensions-dir' );
$entries = scandir( $extdir );
- foreach( $entries as $extname ) {
+ foreach ( $entries as $extname ) {
if ( $extname == '.' || $extname == '..' || !is_dir( "$extdir/$extname" ) ) {
continue;
}
@@ -69,13 +81,19 @@ class MergeMessageFileList extends Maintenance {
if ( file_exists( $extfile ) ) {
$mmfl['setupFiles'][] = $extfile;
} else {
- $hasError = true;
+ $this->hasError = true;
$this->error( "Extension {$extname} in {$extdir} lacks expected {$extname}.php" );
}
}
}
- if ( $hasError ) {
+ # Add setup files defined via configuration
+ foreach ( $wgExtensionEntryPointListFiles as $points ) {
+ $extensionPaths = $this->readFile( $points );
+ $mmfl['setupFiles'] = array_merge( $mmfl['setupFiles'], $extensionPaths );
+ }
+
+ if ( $this->hasError ) {
$this->error( "Some files are missing (see above). Giving up.", 1 );
}
@@ -86,19 +104,54 @@ class MergeMessageFileList extends Maintenance {
$mmfl['quiet'] = true;
}
}
+
+ /**
+ * @param string $fileName
+ * @return array List of absolute extension paths
+ */
+ private function readFile( $fileName ) {
+ global $IP;
+
+ $files = array();
+ $fileLines = file( $fileName );
+ if ( $fileLines === false ) {
+ $this->hasError = true;
+ $this->error( "Unable to open list file $fileName." );
+ return $files;
+ }
+ # Strip comments, discard empty lines, and trim leading and trailing
+ # whitespace. Comments start with '#' and extend to the end of the line.
+ foreach ( $fileLines as $extension ) {
+ $extension = trim( preg_replace( '/#.*/', '', $extension ) );
+ if ( $extension !== '' ) {
+ # Paths may use the string $IP to be substituted by the actual value
+ $extension = str_replace( '$IP', $IP, $extension );
+ if ( file_exists( $extension ) ) {
+ $files[] = $extension;
+ } else {
+ $this->hasError = true;
+ $this->error( "Extension {$extension} doesn't exist" );
+ }
+ }
+ }
+ return $files;
+ }
}
-require_once( RUN_MAINTENANCE_IF_MAIN );
+require_once RUN_MAINTENANCE_IF_MAIN;
foreach ( $mmfl['setupFiles'] as $fileName ) {
if ( strval( $fileName ) === '' ) {
continue;
}
- $fileName = str_replace( '$IP', $IP, $fileName );
if ( empty( $mmfl['quiet'] ) ) {
fwrite( STDERR, "Loading data from $fileName\n" );
}
- include_once( $fileName );
+ // Include the extension to update $wgExtensionMessagesFiles
+ if ( !( include_once( $fileName ) ) ) {
+ fwrite( STDERR, "Unable to read $fileName\n" );
+ exit( 1 );
+ }
}
fwrite( STDERR, "\n" );
$s =
@@ -114,10 +167,7 @@ $dirs = array(
);
foreach ( $dirs as $dir ) {
- $s = preg_replace(
- "/'" . preg_quote( $dir, '/' ) . "([^']*)'/",
- '"$IP\1"',
- $s );
+ $s = preg_replace( "/'" . preg_quote( $dir, '/' ) . "([^']*)'/", '"$IP\1"', $s );
}
if ( isset( $mmfl['output'] ) ) {
diff --git a/maintenance/migrateUserGroup.php b/maintenance/migrateUserGroup.php
index f3e5957c..6903365b 100644
--- a/maintenance/migrateUserGroup.php
+++ b/maintenance/migrateUserGroup.php
@@ -21,7 +21,7 @@
* @ingroup Maintenance
*/
-require_once( __DIR__ . '/Maintenance.php' );
+require_once __DIR__ . '/Maintenance.php';
/**
* Maintenance script that re-assigns users from an old group to a new one.
@@ -106,4 +106,4 @@ class MigrateUserGroup extends Maintenance {
}
$maintClass = "MigrateUserGroup";
-require_once( RUN_MAINTENANCE_IF_MAIN );
+require_once RUN_MAINTENANCE_IF_MAIN;
diff --git a/maintenance/minify.php b/maintenance/minify.php
index 0846a64c..ec936c83 100644
--- a/maintenance/minify.php
+++ b/maintenance/minify.php
@@ -21,7 +21,7 @@
* @ingroup Maintenance
*/
-require_once( __DIR__ . '/Maintenance.php' );
+require_once __DIR__ . '/Maintenance.php';
/**
* Maintenance script that minifies a file or set of files.
@@ -144,4 +144,4 @@ class MinifyScript extends Maintenance {
}
$maintClass = 'MinifyScript';
-require_once( RUN_MAINTENANCE_IF_MAIN );
+require_once RUN_MAINTENANCE_IF_MAIN;
diff --git a/maintenance/moveBatch.php b/maintenance/moveBatch.php
index 7d15959c..34e64282 100644
--- a/maintenance/moveBatch.php
+++ b/maintenance/moveBatch.php
@@ -34,7 +34,7 @@
* e.g. immobile_namespace for namespaces which can't be moved
*/
-require_once( __DIR__ . '/Maintenance.php' );
+require_once __DIR__ . '/Maintenance.php';
/**
* Maintenance script to move a batch of pages.
@@ -116,4 +116,4 @@ class MoveBatch extends Maintenance {
}
$maintClass = "MoveBatch";
-require_once( RUN_MAINTENANCE_IF_MAIN );
+require_once RUN_MAINTENANCE_IF_MAIN;
diff --git a/maintenance/mssql/tables.sql b/maintenance/mssql/tables.sql
index ad996175..7356c38f 100644
--- a/maintenance/mssql/tables.sql
+++ b/maintenance/mssql/tables.sql
@@ -159,6 +159,7 @@ CREATE TABLE /*$wgDBprefix*/text (
-- Cannot reasonably create views on this table, due to the presence of TEXT
-- columns.
CREATE TABLE /*$wgDBprefix*/archive (
+ ar_id NOT NULL PRIMARY KEY clustered IDENTITY,
ar_namespace SMALLINT NOT NULL DEFAULT 0,
ar_title NVARCHAR(255) NOT NULL DEFAULT '',
ar_text NVARCHAR(MAX) NOT NULL,
@@ -298,6 +299,7 @@ CREATE INDEX /*$wgDBprefix*/lc_lang_key ON /*$wgDBprefix*/l10n_cache (lc_lang, l
-- Track links to external URLs
-- IE >= 4 supports no more than 2083 characters in a URL
CREATE TABLE /*$wgDBprefix*/externallinks (
+ el_id INT NOT NULL PRIMARY KEY clustered IDENTITY,
el_from INT NOT NULL DEFAULT '0',
el_to VARCHAR(2083) NOT NULL,
el_index VARCHAR(896) NOT NULL,
@@ -306,17 +308,6 @@ CREATE TABLE /*$wgDBprefix*/externallinks (
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 (
@@ -516,8 +507,6 @@ CREATE TABLE /*$wgDBprefix*/recentchanges (
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,
diff --git a/maintenance/mwdoc-filter.php b/maintenance/mwdoc-filter.php
index 6eeb48d3..c80981b5 100644
--- a/maintenance/mwdoc-filter.php
+++ b/maintenance/mwdoc-filter.php
@@ -18,6 +18,6 @@ if ( PHP_SAPI != 'cli' ) {
$source = file_get_contents( $argv[1] );
$regexp = '#\@var\s+([^\s]+)([^/]+)/\s+(var|public|protected|private)\s+(\$[^\s;=]+)#';
$replac = '${2} */ ${3} ${1} ${4}';
-$source = preg_replace($regexp, $replac, $source);
+$source = preg_replace( $regexp, $replac, $source );
echo $source;
diff --git a/maintenance/mwdocgen.php b/maintenance/mwdocgen.php
index 4fad7a7f..b22dd885 100644
--- a/maintenance/mwdocgen.php
+++ b/maintenance/mwdocgen.php
@@ -8,12 +8,6 @@
* Usage:
* php mwdocgen.php
*
- * KNOWN BUGS:
- *
- * - pass_thru seems to always use buffering (even with ob_implicit_flush()),
- * that make output slow when doxygen parses language files.
- * - the menu doesnt work, got disabled at revision 13740. Need to code it.
- *
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
@@ -39,237 +33,135 @@
* @version first release
*/
-#
-# Variables / Configuration
-#
-
-if ( PHP_SAPI != 'cli' ) {
- echo 'Run "' . __FILE__ . '" from the command line.';
- die( -1 );
-}
-
-/** Figure out the base directory for MediaWiki location */
-$mwPath = dirname( __DIR__ ) . DIRECTORY_SEPARATOR;
-
-/** doxygen binary script */
-$doxygenBin = 'doxygen';
-
-/** doxygen configuration template for mediawiki */
-$doxygenTemplate = $mwPath . 'maintenance/Doxyfile';
-
-/** doxygen input filter to tweak source file before they are parsed */
-$doxygenInputFilter = "php {$mwPath}maintenance/mwdoc-filter.php";
-
-/** where Phpdoc should output documentation */
-$doxyOutput = $mwPath . 'docs' . DIRECTORY_SEPARATOR ;
-
-$doxyVersion = 'master';
-
-/** MediaWiki subpaths */
-$mwPathI = $mwPath . 'includes/';
-$mwPathL = $mwPath . 'languages/';
-$mwPathM = $mwPath . 'maintenance/';
-$mwPathS = $mwPath . 'skins/';
-
-/** Ignored paths relative to $mwPath */
-$mwExcludePaths = array(
- 'images',
- 'static',
-);
-
-/** Variable to get user input */
-$input = '';
-$excludePatterns = '';
-/** Whether to generates man pages: */
-$doxyGenerateMan = false;
-
-#
-# Functions
-#
-
-define( 'MEDIAWIKI', true );
-require_once( "$mwPath/includes/GlobalFunctions.php" );
-
-/**
- * Read a line from the shell
- * @param $prompt String
- * @return string
- */
-function readaline( $prompt = '' ) {
- print $prompt;
- $fp = fopen( "php://stdin", "r" );
- $resp = trim( fgets( $fp, 1024 ) );
- fclose( $fp );
- return $resp;
-}
+require_once __DIR__ . '/Maintenance.php';
/**
- * Generate a configuration file given user parameters and return the temporary filename.
- * @param $doxygenTemplate String: full path for the template.
- * @param $outputDirectory String: directory where the stuff will be output.
- * @param $stripFromPath String: path that should be stripped out (usually mediawiki base path).
- * @param $currentVersion String: Version number of the software
- * @param $input String: Path to analyze.
- * @param $exclude String: Additionals path regex to exclude
- * @param $excludePatterns String: Additionals path regex to exclude
- * (LocalSettings.php, AdminSettings.php, .svn and .git directories are always excluded)
- * @param $doxyGenerateMan Boolean
- * @return string
+ * Maintenance script that builds doxygen documentation.
+ * @ingroup Maintenance
*/
-function generateConfigFile( $doxygenTemplate, $outputDirectory, $stripFromPath, $currentVersion, $input, $exclude, $excludePatterns, $doxyGenerateMan, $doxygenInputFilter ) {
-
- $template = file_get_contents( $doxygenTemplate );
- // Replace template placeholders by correct values.
- $replacements = array(
- '{{OUTPUT_DIRECTORY}}' => $outputDirectory,
- '{{STRIP_FROM_PATH}}' => $stripFromPath,
- '{{CURRENT_VERSION}}' => $currentVersion,
- '{{INPUT}}' => $input,
- '{{EXCLUDE}}' => $exclude,
- '{{EXCLUDE_PATTERNS}}' => $excludePatterns,
- '{{HAVE_DOT}}' => `which dot` ? 'YES' : 'NO',
- '{{GENERATE_MAN}}' => $doxyGenerateMan ? 'YES' : 'NO',
- '{{INPUT_FILTER}}' => $doxygenInputFilter,
- );
- $tmpCfg = str_replace( array_keys( $replacements ), array_values( $replacements ), $template );
- $tmpFileName = tempnam( wfTempDir(), 'mwdocgen-' );
- file_put_contents( $tmpFileName, $tmpCfg ) or die( "Could not write doxygen configuration to file $tmpFileName\n" );
+class MWDocGen extends Maintenance {
+
+ /**
+ * Prepare Maintenance class
+ */
+ public function __construct() {
+ parent::__construct();
+ $this->mDescription = 'Build doxygen documentation';
+
+ $this->addOption( 'doxygen',
+ 'Path to doxygen',
+ false, true );
+ $this->addOption( 'version',
+ 'Pass a MediaWiki version',
+ false, true );
+ $this->addOption( 'generate-man',
+ 'Whether to generate man files' );
+ $this->addOption( 'file',
+ "Only process given file or directory. Multiple values " .
+ "accepted with comma separation. Path relative to \$IP.",
+ false, true );
+ $this->addOption( 'output',
+ 'Path to write doc to',
+ false, true );
+ $this->addOption( 'no-extensions',
+ 'Ignore extensions' );
+ }
- return $tmpFileName;
-}
+ public function getDbType() {
+ return Maintenance::DB_NONE;
+ }
-#
-# Main !
-#
+ protected function init() {
+ global $IP;
-unset( $file );
+ $this->doxygen = $this->getOption( 'doxygen', 'doxygen' );
+ $this->mwVersion = $this->getOption( 'version', 'master' );
-if ( is_array( $argv ) ) {
- for ($i = 0; $i < count($argv); $i++ ) {
- switch( $argv[$i] ) {
- case '--all': $input = 0; break;
- case '--includes': $input = 1; break;
- case '--languages': $input = 2; break;
- case '--maintenance': $input = 3; break;
- case '--skins': $input = 4; break;
- case '--file':
- $input = 5;
- $i++;
- if ( isset( $argv[$i] ) ) {
- $file = $argv[$i];
- }
- break;
- case '--no-extensions': $input = 6; break;
- case '--output':
- $i++;
- if ( isset( $argv[$i] ) ) {
- $doxyOutput = realpath( $argv[$i] );
- }
- break;
- case '--version':
- $i++;
- if ( isset( $argv[$i] ) ) {
- $doxyVersion = $argv[$i];
- }
- break;
- case '--generate-man':
- $doxyGenerateMan = true;
- break;
- case '--help':
- print <<<END
-Usage: php mwdocgen.php [<command>] [<options>]
+ $this->input = '';
+ $inputs = explode( ',', $this->getOption( 'file', '' ) );
+ foreach ( $inputs as $input ) {
+ # Doxygen inputs are space separted and double quoted
+ $this->input .= " \"$IP/$input\"";
+ }
-Commands:
- --all Process entire codebase
- --includes Process only files in includes/ dir
- --languages Process only files in languages/ dir
- --maintenance Process only files in maintenance/ dir
- --skins Process only files in skins/ dir
- --file <file> Process only the given file
- --no-extensions Process everything but extensions directorys
+ $this->output = $this->getOption( 'output', "$IP/docs" );
+
+ $this->inputFilter = wfShellWikiCmd(
+ $IP . '/maintenance/mwdoc-filter.php' );
+ $this->template = $IP . '/maintenance/Doxyfile';
+ $this->excludes = array(
+ 'vendor',
+ 'images',
+ 'static',
+ );
+ $this->excludePatterns = array();
+ if ( $this->hasOption( 'no-extensions' ) ) {
+ $this->excludePatterns[] = 'extensions';
+ }
-If no command is given, you will be prompted.
+ $this->doDot = `which dot`;
+ $this->doMan = $this->hasOption( 'generate-man' );
+ }
-Other options:
- --output <dir> Set output directory (default: $doxyOutput)
- --generate-man Generates man page documentation
- --version Project version to display in the outut (default: $doxyVersion)
- --help Show this help and exit.
+ public function execute() {
+ global $IP;
+ $this->init();
-END;
- exit(0);
- break;
+ # Build out directories we want to exclude
+ $exclude = '';
+ foreach ( $this->excludes as $item ) {
+ $exclude .= " $IP/$item";
}
- }
-}
-// TODO : generate a list of paths ))
-
-if ( $input === '' ) {
- echo <<<OPTIONS
-Several documentation possibilities:
- 0 : whole documentation (1 + 2 + 3 + 4)
- 1 : only includes
- 2 : only languages
- 3 : only maintenance
- 4 : only skins
- 5 : only a given file
- 6 : all but the extensions directory
-OPTIONS;
- while ( !is_numeric( $input ) )
- {
- $input = readaline( "\nEnter your choice [0]:" );
- if ( $input == '' ) {
- $input = 0;
+ $excludePatterns = implode( ' ', $this->excludePatterns );
+
+ $conf = strtr( file_get_contents( $this->template ),
+ array(
+ '{{OUTPUT_DIRECTORY}}' => $this->output,
+ '{{STRIP_FROM_PATH}}' => $IP,
+ '{{CURRENT_VERSION}}' => $this->mwVersion,
+ '{{INPUT}}' => $this->input,
+ '{{EXCLUDE}}' => $exclude,
+ '{{EXCLUDE_PATTERNS}}' => $excludePatterns,
+ '{{HAVE_DOT}}' => $this->doDot ? 'YES' : 'NO',
+ '{{GENERATE_MAN}}' => $this->doMan ? 'YES' : 'NO',
+ '{{INPUT_FILTER}}' => $this->inputFilter,
+ )
+ );
+
+ $tmpFile = tempnam( wfTempDir(), 'MWDocGen-' );
+ if ( file_put_contents( $tmpFile, $conf ) === false ) {
+ $this->error( "Could not write doxygen configuration to file $tmpFile\n",
+ /** exit code: */ 1 );
}
- }
-}
-
-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 ) ) {
- $file = readaline( "Enter file name $mwPath" );
- }
- $input = $mwPath . $file;
- break;
-case 6:
- $input = $mwPath;
- $excludePatterns = 'extensions';
-}
-// Generate path exclusions
-$excludedPaths = $mwPath . join( " $mwPath", $mwExcludePaths );
-print "EXCLUDE: $excludedPaths\n\n";
+ $command = $this->doxygen . ' ' . $tmpFile;
+ $this->output( "Executing command:\n$command\n" );
-$generatedConf = generateConfigFile( $doxygenTemplate, $doxyOutput, $mwPath, $doxyVersion, $input, $excludedPaths, $excludePatterns, $doxyGenerateMan, $doxygenInputFilter );
-$command = $doxygenBin . ' ' . $generatedConf;
+ $exitcode = 1;
+ system( $command, $exitcode );
-echo <<<TEXT
+ $this->output( <<<TEXT
---------------------------------------------------
-Launching the command:
-
-$command
+Doxygen execution finished.
+Check above for possible errors.
+You might want to delete the temporary file:
+ $tmpFile
---------------------------------------------------
-TEXT;
-
-$exitcode = 1;
-passthru( $command, $exitcode );
+TEXT
+ );
-echo <<<TEXT
----------------------------------------------------
-Doxygen execution finished.
-Check above for possible errors.
+ if ( $exitcode !== 0 ) {
+ $this->error( "Something went wrong (exit: $exitcode)\n",
+ $exitcode );
+ }
-You might want to delete the temporary file $generatedConf
+ }
-TEXT;
+}
-exit( $exitcode );
+$maintClass = 'MWDocGen';
+require_once RUN_MAINTENANCE_IF_MAIN;
diff --git a/maintenance/mwjsduck-gen b/maintenance/mwjsduck-gen
index fbd428f1..bc10bc2c 100644
--- a/maintenance/mwjsduck-gen
+++ b/maintenance/mwjsduck-gen
@@ -1,2 +1,21 @@
-#!/usr/bin/env sh
-jsduck --config=$(cd $(dirname $0)/..; pwd)/maintenance/jsduck/config.json && echo 'JSDuck execution finished.'
+#!/usr/bin/env bash
+
+JSDUCK_MWVERSION=master
+if [[ "$1" == "--version" && "$2" != "" ]]
+then
+ JSDUCK_MWVERSION="$2"
+elif [[ "$*" != "" ]]
+then
+ echo "Usage $0: [--version <mediawiki version>]"
+ echo
+ exit 1
+fi
+
+MWCORE_DIR=$(cd $(dirname $0)/..; pwd)
+
+jsduck \
+--config=$MWCORE_DIR/maintenance/jsduck/config.json \
+--footer="Documentation for MediaWiki core ($JSDUCK_MWVERSION). Generated on {DATE} by {JSDUCK} {VERSION}." \
+&& echo 'JSDuck execution finished.'
+
+ln -s ../../resources $MWCORE_DIR/docs/js/modules
diff --git a/maintenance/namespaceDupes.php b/maintenance/namespaceDupes.php
index 6067a826..ff024682 100644
--- a/maintenance/namespaceDupes.php
+++ b/maintenance/namespaceDupes.php
@@ -24,7 +24,7 @@
* @ingroup Maintenance
*/
-require_once( __DIR__ . '/Maintenance.php' );
+require_once __DIR__ . '/Maintenance.php';
/**
* Maintenance script that checks for articles to fix after
@@ -185,7 +185,7 @@ class NamespaceConflictChecker extends Maintenance {
}
/**
- * @todo: do this for reals
+ * @todo Do this for real
* @param $key
* @param $prefix
* @param $fix
@@ -207,10 +207,10 @@ class NamespaceConflictChecker extends Maintenance {
* @return array
*/
private function getConflicts( $ns, $name ) {
- $page = 'page';
+ $page = 'page';
$table = $this->db->tableName( $page );
- $prefix = $this->db->strencode( $name );
+ $prefix = $this->db->strencode( $name );
$encNamespace = $this->db->addQuotes( $ns );
$titleSql = "TRIM(LEADING '$prefix:' FROM {$page}_title)";
@@ -318,12 +318,12 @@ class NamespaceConflictChecker extends Maintenance {
$this->db->update( $table,
array(
"{$prefix}_namespace" => $newTitle->getNamespace(),
- "{$prefix}_title" => $newTitle->getDBkey(),
+ "{$prefix}_title" => $newTitle->getDBkey(),
),
array(
// "{$prefix}_namespace" => 0,
- // "{$prefix}_title" => $row->oldtitle,
- "{$prefix}_id" => $row->id,
+ // "{$prefix}_title" => $row->oldtitle,
+ "{$prefix}_id" => $row->id,
),
__METHOD__ );
$this->output( "ok.\n" );
@@ -332,4 +332,4 @@ class NamespaceConflictChecker extends Maintenance {
}
$maintClass = "NamespaceConflictChecker";
-require_once( RUN_MAINTENANCE_IF_MAIN );
+require_once RUN_MAINTENANCE_IF_MAIN;
diff --git a/maintenance/nextJobDB.php b/maintenance/nextJobDB.php
index 1be5146e..219b5d8e 100644
--- a/maintenance/nextJobDB.php
+++ b/maintenance/nextJobDB.php
@@ -21,7 +21,7 @@
* @ingroup Maintenance
*/
-require_once( __DIR__ . '/Maintenance.php' );
+require_once __DIR__ . '/Maintenance.php';
/**
* Maintenance script that picks a database that has pending jobs.
@@ -116,4 +116,4 @@ class nextJobDB extends Maintenance {
}
$maintClass = "nextJobDb";
-require_once( RUN_MAINTENANCE_IF_MAIN );
+require_once RUN_MAINTENANCE_IF_MAIN;
diff --git a/maintenance/nukeNS.php b/maintenance/nukeNS.php
index c471a441..479dcf76 100644
--- a/maintenance/nukeNS.php
+++ b/maintenance/nukeNS.php
@@ -33,7 +33,7 @@
* based on nukePage by Rob Church
*/
-require_once( __DIR__ . '/Maintenance.php' );
+require_once __DIR__ . '/Maintenance.php';
/**
* Maintenance script that removes pages with only one revision from the
@@ -66,7 +66,7 @@ class NukeNS extends Maintenance {
foreach ( $res as $row ) {
// echo "$ns_name:".$row->page_title, "\n";
$title = Title::makeTitle( $ns, $row->page_title );
- $id = $title->getArticleID();
+ $id = $title->getArticleID();
// Get corresponding revisions
$res2 = $dbw->query( "SELECT rev_id FROM $tbl_rev WHERE rev_page = $id" );
@@ -94,7 +94,7 @@ class NukeNS extends Maintenance {
$n_deleted ++;
}
} else {
- $this->output( "skip: " . $title->getPrefixedText() . "\n" );
+ $this->output( "skip: " . $title->getPrefixedText() . "\n" );
}
}
$dbw->commit( __METHOD__ );
@@ -119,4 +119,4 @@ class NukeNS extends Maintenance {
}
$maintClass = "NukeNS";
-require_once( RUN_MAINTENANCE_IF_MAIN );
+require_once RUN_MAINTENANCE_IF_MAIN;
diff --git a/maintenance/nukePage.php b/maintenance/nukePage.php
index 89dffe0c..1870273e 100644
--- a/maintenance/nukePage.php
+++ b/maintenance/nukePage.php
@@ -23,7 +23,7 @@
* @author Rob Church <robchur@gmail.com>
*/
-require_once( __DIR__ . '/Maintenance.php' );
+require_once __DIR__ . '/Maintenance.php';
/**
* Maintenance script that erases a page record from the database.
@@ -54,7 +54,7 @@ class NukePage extends Maintenance {
$this->output( "Searching for \"$name\"..." );
$title = Title::newFromText( $name );
if ( $title ) {
- $id = $title->getArticleID();
+ $id = $title->getArticleID();
$real = $title->getPrefixedText();
$isGoodArticle = $title->isContentPage();
$this->output( "found \"$real\" with ID $id.\n" );
@@ -117,4 +117,4 @@ class NukePage extends Maintenance {
}
$maintClass = "NukePage";
-require_once( RUN_MAINTENANCE_IF_MAIN );
+require_once RUN_MAINTENANCE_IF_MAIN;
diff --git a/maintenance/oracle/alterSharedConstraints.php b/maintenance/oracle/alterSharedConstraints.php
index a46c5e1f..435625d5 100644
--- a/maintenance/oracle/alterSharedConstraints.php
+++ b/maintenance/oracle/alterSharedConstraints.php
@@ -27,7 +27,7 @@
* i.e.: GRANT REFERENCES (user_id) ON mwuser TO hubclient;
*/
-require_once( __DIR__ . '/../Maintenance.php' );
+require_once __DIR__ . '/../Maintenance.php';
class AlterSharedConstraints extends Maintenance {
public function __construct() {
@@ -49,11 +49,11 @@ class AlterSharedConstraints extends Maintenance {
$dbw = wfGetDB( DB_MASTER );
foreach ( $wgSharedTables as $table ) {
- $stable = $dbw->tableNameInternal($table);
+ $stable = $dbw->tableNameInternal( $table );
if ( $wgSharedPrefix != null ) {
$ltable = preg_replace( "/^$wgSharedPrefix(.*)/i", "$wgDBprefix\\1", $stable );
} else {
- $ltable = "{$wgDBprefix}{$stable}" ;
+ $ltable = "{$wgDBprefix}{$stable}";
}
$result = $dbw->query( "SELECT uc.constraint_name, uc.table_name, ucc.column_name, uccpk.table_name pk_table_name, uccpk.column_name pk_column_name, uc.delete_rule, uc.deferrable, uc.deferred
@@ -62,14 +62,14 @@ class AlterSharedConstraints extends Maintenance {
AND ucc.constraint_name = uc.constraint_name
AND uccpk.constraint_name = uc.r_constraint_name
AND uccpk.table_name = '$ltable'" );
- while (($row = $result->fetchRow()) !== false) {
+ while ( ( $row = $result->fetchRow() ) !== false ) {
- $this->output( "Altering {$row['constraint_name']} ...");
+ $this->output( "Altering {$row['constraint_name']} ..." );
try {
$dbw->query( "ALTER TABLE {$row['table_name']} DROP CONSTRAINT {$wgDBprefix}{$row['constraint_name']}" );
- } catch (DBQueryError $exdb) {
- if ($exdb->errno != 2443) {
+ } catch ( DBQueryError $exdb ) {
+ if ( $exdb->errno != 2443 ) {
throw $exdb;
}
}
@@ -88,4 +88,4 @@ class AlterSharedConstraints extends Maintenance {
}
$maintClass = "AlterSharedConstraints";
-require_once( RUN_MAINTENANCE_IF_MAIN );
+require_once RUN_MAINTENANCE_IF_MAIN;
diff --git a/maintenance/oracle/archives/patch-archive-ar_id.sql b/maintenance/oracle/archives/patch-archive-ar_id.sql
new file mode 100644
index 00000000..a43f7602
--- /dev/null
+++ b/maintenance/oracle/archives/patch-archive-ar_id.sql
@@ -0,0 +1,6 @@
+define mw_prefix='{$wgDBprefix}';
+
+ALTER TABLE &mw_prefix.archive ADD (
+ar_id NUMBER NOT NULL,
+);
+ALTER TABLE &mw_prefix.archive ADD CONSTRAINT &mw_prefix.archive_pk PRIMARY KEY (ar_id);
diff --git a/maintenance/oracle/archives/patch-externallinks-el_id.sql b/maintenance/oracle/archives/patch-externallinks-el_id.sql
new file mode 100644
index 00000000..a8c443f4
--- /dev/null
+++ b/maintenance/oracle/archives/patch-externallinks-el_id.sql
@@ -0,0 +1,4 @@
+define mw_prefix='{$wgDBprefix}';
+
+ALTER TABLE &mw_prefix.externallinks ADD el_id NUMBER NOT NULL;
+ALTER TABLE &mw_prefix.externallinks ADD CONSTRAINT &mw_prefix.externallinks_pk PRIMARY KEY (el_id); \ No newline at end of file
diff --git a/maintenance/oracle/tables.sql b/maintenance/oracle/tables.sql
index ba69da1b..acfabc33 100644
--- a/maintenance/oracle/tables.sql
+++ b/maintenance/oracle/tables.sql
@@ -129,7 +129,9 @@ 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 SEQUENCE archive_ar_id_seq;
CREATE TABLE &mw_prefix.archive (
+ ar_id NUMBER NOT NULL,
ar_namespace NUMBER DEFAULT 0 NOT NULL,
ar_title VARCHAR2(255) NOT NULL,
ar_text CLOB,
@@ -149,6 +151,7 @@ CREATE TABLE &mw_prefix.archive (
ar_content_model VARCHAR2(32),
ar_content_format VARCHAR2(64)
);
+ALTER TABLE &mw_prefix.archive ADD CONSTRAINT &mw_prefix.archive_pk PRIMARY KEY (ar_id);
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);
@@ -208,23 +211,19 @@ ALTER TABLE &mw_prefix.category ADD CONSTRAINT &mw_prefix.category_pk PRIMARY KE
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 SEQUENCE externallinks_el_id_seq;
CREATE TABLE &mw_prefix.externallinks (
+ el_id NUMBER NOT NULL,
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_pk PRIMARY KEY (el_id);
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);
-CREATE TABLE &mw_prefix.external_user (
- eu_local_id NUMBER NOT NULL,
- eu_external_id varchar2(255) NOT NULL
-);
-ALTER TABLE &mw_prefix.external_user ADD CONSTRAINT &mw_prefix.external_user_pk PRIMARY KEY (eu_local_id);
-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,
ll_lang VARCHAR2(20),
@@ -416,8 +415,6 @@ CREATE TABLE &mw_prefix.recentchanges (
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 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,
@@ -643,10 +640,11 @@ ALTER TABLE &mw_prefix.valid_tag ADD CONSTRAINT &mw_prefix.valid_tag_pk PRIMARY
-- This table is not used unless profiling is turned on
--CREATE TABLE &mw_prefix.profiling (
--- pf_count NUMBER DEFAULT 0 NOT NULL,
--- pf_time NUMERIC(18,10) DEFAULT 0 NOT NULL,
--- pf_name CLOB NOT NULL,
--- pf_server CLOB NULL
+-- pf_count NUMBER DEFAULT 0 NOT NULL,
+-- pf_time NUMBER(18,10) DEFAULT 0 NOT NULL,
+-- pf_memory NUMBER(18,10) DEFAULT 0 NOT NULL,
+-- pf_name VARCHAR2(255),
+-- pf_server VARCHAR2(30)
--);
--CREATE UNIQUE INDEX &mw_prefix.profiling_u01 ON &mw_prefix.profiling (pf_name, pf_server);
diff --git a/maintenance/orphans.php b/maintenance/orphans.php
index 3b1a9b0e..b4d255ab 100644
--- a/maintenance/orphans.php
+++ b/maintenance/orphans.php
@@ -28,7 +28,7 @@
* @ingroup Maintenance
*/
-require_once( __DIR__ . '/Maintenance.php' );
+require_once __DIR__ . '/Maintenance.php';
/**
* Maintenance script that looks for 'orphan' revisions hooked to pages which
@@ -171,7 +171,7 @@ class Orphans extends Maintenance {
*/
private function checkSeparation( $fix ) {
$dbw = wfGetDB( DB_MASTER );
- $page = $dbw->tableName( 'page' );
+ $page = $dbw->tableName( 'page' );
$revision = $dbw->tableName( 'revision' );
if ( $fix ) {
@@ -209,7 +209,7 @@ class Orphans extends Maintenance {
'revision',
'rev_id',
array(
- 'rev_page' => $row->page_id,
+ 'rev_page' => $row->page_id,
'rev_timestamp' => $row2->max_timestamp ) );
$this->output( "... updating to revision $maxId\n" );
$maxRev = Revision::newFromId( $maxId );
@@ -239,4 +239,4 @@ class Orphans extends Maintenance {
}
$maintClass = "Orphans";
-require_once( RUN_MAINTENANCE_IF_MAIN );
+require_once RUN_MAINTENANCE_IF_MAIN;
diff --git a/maintenance/parse.php b/maintenance/parse.php
index 58e76b0a..3ac7a281 100644
--- a/maintenance/parse.php
+++ b/maintenance/parse.php
@@ -49,7 +49,7 @@
* @license GNU General Public License 2.0 or later
*/
-require_once( __DIR__ . '/Maintenance.php' );
+require_once __DIR__ . '/Maintenance.php';
/**
* Maintenance script to parse some wikitext.
@@ -85,12 +85,12 @@ class CLIParser extends Maintenance {
*/
protected function Wikitext() {
- $php_stdin = 'php://stdin';
+ $php_stdin = 'php://stdin';
$input_file = $this->getArg( 0, $php_stdin );
- if( $input_file === $php_stdin ) {
+ if ( $input_file === $php_stdin ) {
$ctrl = wfIsWindows() ? 'CTRL+Z' : 'CTRL+D';
- $this->error( basename(__FILE__) .": warning: reading wikitext from STDIN. Press $ctrl to parse.\n" );
+ $this->error( basename( __FILE__ ) . ": warning: reading wikitext from STDIN. Press $ctrl to parse.\n" );
}
return file_get_contents( $input_file );
@@ -113,7 +113,7 @@ class CLIParser extends Maintenance {
$title =
$this->getOption( 'title' )
? $this->getOption( 'title' )
- : 'CLIParser' ;
+ : 'CLIParser';
return Title::newFromText( $title );
}
@@ -131,4 +131,4 @@ class CLIParser extends Maintenance {
}
$maintClass = "CLIParser";
-require_once( RUN_MAINTENANCE_IF_MAIN );
+require_once RUN_MAINTENANCE_IF_MAIN;
diff --git a/maintenance/patchSql.php b/maintenance/patchSql.php
index 1f393556..31ce1566 100644
--- a/maintenance/patchSql.php
+++ b/maintenance/patchSql.php
@@ -22,7 +22,7 @@
* @ingroup Maintenance
*/
-require_once( __DIR__ . '/Maintenance.php' );
+require_once __DIR__ . '/Maintenance.php';
/**
* Maintenance script that manually runs an SQL patch outside of the general updaters.
@@ -62,4 +62,4 @@ class PatchSql extends Maintenance {
}
$maintClass = "PatchSql";
-require_once( RUN_MAINTENANCE_IF_MAIN );
+require_once RUN_MAINTENANCE_IF_MAIN;
diff --git a/maintenance/populateCategory.php b/maintenance/populateCategory.php
index ae54d698..4c8cdaa1 100644
--- a/maintenance/populateCategory.php
+++ b/maintenance/populateCategory.php
@@ -22,7 +22,7 @@
* @author Simetrical
*/
-require_once( __DIR__ . '/Maintenance.php' );
+require_once __DIR__ . '/Maintenance.php';
/**
* Mainteance script to populate the category table.
@@ -142,4 +142,4 @@ TEXT;
}
$maintClass = "PopulateCategory";
-require_once( RUN_MAINTENANCE_IF_MAIN );
+require_once RUN_MAINTENANCE_IF_MAIN;
diff --git a/maintenance/populateFilearchiveSha1.php b/maintenance/populateFilearchiveSha1.php
index 27e692d1..c579d4fc 100644
--- a/maintenance/populateFilearchiveSha1.php
+++ b/maintenance/populateFilearchiveSha1.php
@@ -21,7 +21,7 @@
* @ingroup Maintenance
*/
-require_once( dirname( __FILE__ ) . '/Maintenance.php' );
+require_once dirname( __FILE__ ) . '/Maintenance.php';
/**
* Maintenance script to populate the fa_sha1 field.
@@ -86,7 +86,7 @@ class PopulateFilearchiveSha1 extends LoggedUpdateMaintenance {
}
$done += $i;
- if( $i !== $batchSize ) {
+ if ( $i !== $batchSize ) {
break;
}
@@ -94,7 +94,7 @@ class PopulateFilearchiveSha1 extends LoggedUpdateMaintenance {
$this->output( sprintf(
"id %d done (up to %d), %5.3f%% \r", $lastId, $endId, $lastId / $endId * 100 ) );
wfWaitForSlaves();
- } while( true );
+ } while ( true );
$processingTime = microtime( true ) - $startTime;
$this->output( sprintf( "\nDone %d files in %.1f seconds\n", $done, $processingTime ) );
@@ -104,4 +104,4 @@ class PopulateFilearchiveSha1 extends LoggedUpdateMaintenance {
}
$maintClass = "PopulateFilearchiveSha1";
-require_once( RUN_MAINTENANCE_IF_MAIN );
+require_once RUN_MAINTENANCE_IF_MAIN;
diff --git a/maintenance/populateImageSha1.php b/maintenance/populateImageSha1.php
index 37429a34..126d22d9 100644
--- a/maintenance/populateImageSha1.php
+++ b/maintenance/populateImageSha1.php
@@ -21,7 +21,7 @@
* @ingroup Maintenance
*/
-require_once( __DIR__ . '/Maintenance.php' );
+require_once __DIR__ . '/Maintenance.php';
/**
* Maintenance script to populate the img_sha1 field.
@@ -164,4 +164,4 @@ class PopulateImageSha1 extends LoggedUpdateMaintenance {
}
$maintClass = "PopulateImageSha1";
-require_once( RUN_MAINTENANCE_IF_MAIN );
+require_once RUN_MAINTENANCE_IF_MAIN;
diff --git a/maintenance/populateLogSearch.php b/maintenance/populateLogSearch.php
index 99d81557..d65635e5 100644
--- a/maintenance/populateLogSearch.php
+++ b/maintenance/populateLogSearch.php
@@ -22,7 +22,7 @@
* @ingroup Maintenance
*/
-require_once( __DIR__ . '/Maintenance.php' );
+require_once __DIR__ . '/Maintenance.php';
/**
* Maintenance script that makes the required database updates for populating the
@@ -75,7 +75,9 @@ class PopulateLogSearch extends LoggedUpdateMaintenance {
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?
+ 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 ) {
@@ -97,8 +99,9 @@ class PopulateLogSearch extends LoggedUpdateMaintenance {
$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] ) )
+ if ( !isset( self::$tableMap[$prefix] ) ) {
continue; // bad row?
+ }
$table = self::$tableMap[$prefix];
$userField = $prefix . '_user';
$userTextField = $prefix . '_user_text';
@@ -109,10 +112,11 @@ class PopulateLogSearch extends LoggedUpdateMaintenance {
array( $field => $items )
);
foreach ( $sres as $srow ) {
- if ( $srow->$userField > 0 )
+ if ( $srow->$userField > 0 ) {
$userIds[] = intval( $srow->$userField );
- elseif ( $srow->$userTextField != '' )
+ } elseif ( $srow->$userTextField != '' ) {
$userIPs[] = $srow->$userTextField;
+ }
}
// Add item author relations...
$log->addRelations( 'target_author_id', $userIds, $row->log_id );
@@ -121,7 +125,9 @@ class PopulateLogSearch extends LoggedUpdateMaintenance {
} elseif ( 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...
@@ -133,10 +139,11 @@ class PopulateLogSearch extends LoggedUpdateMaintenance {
array( 'log_id' => $items )
);
foreach ( $sres as $srow ) {
- if ( $srow->log_user > 0 )
+ if ( $srow->log_user > 0 ) {
$userIds[] = intval( $srow->log_user );
- elseif ( IP::isIPAddress( $srow->log_user_text ) )
+ } elseif ( IP::isIPAddress( $srow->log_user_text ) ) {
$userIPs[] = $srow->log_user_text;
+ }
}
$log->addRelations( 'target_author_id', $userIds, $row->log_id );
$log->addRelations( 'target_author_ip', $userIPs, $row->log_id );
@@ -152,4 +159,4 @@ class PopulateLogSearch extends LoggedUpdateMaintenance {
}
$maintClass = "PopulateLogSearch";
-require_once( RUN_MAINTENANCE_IF_MAIN );
+require_once RUN_MAINTENANCE_IF_MAIN;
diff --git a/maintenance/populateLogUsertext.php b/maintenance/populateLogUsertext.php
index fa9d512f..e579e522 100644
--- a/maintenance/populateLogUsertext.php
+++ b/maintenance/populateLogUsertext.php
@@ -24,7 +24,7 @@
* @ingroup Maintenance
*/
-require_once( __DIR__ . '/Maintenance.php' );
+require_once __DIR__ . '/Maintenance.php';
/**
* Maintenance script that makes the required database updates for
@@ -82,4 +82,4 @@ class PopulateLogUsertext extends LoggedUpdateMaintenance {
}
$maintClass = "PopulateLogUsertext";
-require_once( RUN_MAINTENANCE_IF_MAIN );
+require_once RUN_MAINTENANCE_IF_MAIN;
diff --git a/maintenance/populateParentId.php b/maintenance/populateParentId.php
index e81d4ffb..e29fa5f1 100644
--- a/maintenance/populateParentId.php
+++ b/maintenance/populateParentId.php
@@ -23,7 +23,7 @@
* @ingroup Maintenance
*/
-require_once( __DIR__ . '/Maintenance.php' );
+require_once __DIR__ . '/Maintenance.php';
/**
* Maintenance script that makes the required database updates for rev_parent_id
@@ -98,8 +98,9 @@ class PopulateParentId extends LoggedUpdateMaintenance {
}
}
$previousID = intval( $previousID );
- if ( $previousID != $row->rev_parent_id )
+ if ( $previousID != $row->rev_parent_id ) {
$changed++;
+ }
# Update the row...
$db->update( 'revision',
array( 'rev_parent_id' => $previousID ),
@@ -117,4 +118,4 @@ class PopulateParentId extends LoggedUpdateMaintenance {
}
$maintClass = "PopulateParentId";
-require_once( RUN_MAINTENANCE_IF_MAIN );
+require_once RUN_MAINTENANCE_IF_MAIN;
diff --git a/maintenance/populateRevisionLength.php b/maintenance/populateRevisionLength.php
index 7c529d53..3c69125a 100644
--- a/maintenance/populateRevisionLength.php
+++ b/maintenance/populateRevisionLength.php
@@ -21,7 +21,7 @@
* @ingroup Maintenance
*/
-require_once( __DIR__ . '/Maintenance.php' );
+require_once __DIR__ . '/Maintenance.php';
/**
* Maintenance script that populates the rev_len field for old revisions
@@ -48,8 +48,8 @@ class PopulateRevisionLength extends LoggedUpdateMaintenance {
$db = $this->getDB( DB_MASTER );
if ( !$db->tableExists( 'revision' ) ) {
$this->error( "revision table does not exist", true );
- } else if ( !$db->fieldExists( 'revision', 'rev_sha1', __METHOD__ ) ) {
- $this->output( "rev_sha1 column does not exist\n\n", true );
+ } elseif ( !$db->fieldExists( 'revision', 'rev_len', __METHOD__ ) ) {
+ $this->output( "rev_len column does not exist\n\n", true );
return false;
}
@@ -70,12 +70,16 @@ class PopulateRevisionLength extends LoggedUpdateMaintenance {
$fields = Revision::selectFields();
while ( $blockStart <= $end ) {
$this->output( "...doing rev_id from $blockStart to $blockEnd\n" );
- $res = $db->select( 'revision',
- $fields,
- array( "rev_id >= $blockStart",
- "rev_id <= $blockEnd",
- "rev_len IS NULL" ),
- __METHOD__ );
+ $res = $db->select(
+ 'revision',
+ $fields,
+ 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 );
@@ -105,4 +109,4 @@ class PopulateRevisionLength extends LoggedUpdateMaintenance {
}
$maintClass = "PopulateRevisionLength";
-require_once( RUN_MAINTENANCE_IF_MAIN );
+require_once RUN_MAINTENANCE_IF_MAIN;
diff --git a/maintenance/populateRevisionSha1.php b/maintenance/populateRevisionSha1.php
index 113eef49..89bfb85b 100644
--- a/maintenance/populateRevisionSha1.php
+++ b/maintenance/populateRevisionSha1.php
@@ -22,7 +22,7 @@
* @ingroup Maintenance
*/
-require_once( __DIR__ . '/Maintenance.php' );
+require_once __DIR__ . '/Maintenance.php';
/**
* Maintenance script that fills the rev_sha1 and ar_sha1 columns of revision
@@ -48,7 +48,7 @@ class PopulateRevisionSha1 extends LoggedUpdateMaintenance {
$this->error( "revision table does not exist", true );
} elseif ( !$db->tableExists( 'archive' ) ) {
$this->error( "archive table does not exist", true );
- } else if ( !$db->fieldExists( 'revision', 'rev_sha1', __METHOD__ ) ) {
+ } elseif ( !$db->fieldExists( 'revision', 'rev_sha1', __METHOD__ ) ) {
$this->output( "rev_sha1 column does not exist\n\n", true );
return false;
}
@@ -189,9 +189,9 @@ class PopulateRevisionSha1 extends LoggedUpdateMaintenance {
array( 'ar_sha1' => Revision::base36Sha1( $text ) ),
array(
'ar_namespace' => $row->ar_namespace,
- 'ar_title' => $row->ar_title,
+ 'ar_title' => $row->ar_title,
'ar_timestamp' => $row->ar_timestamp,
- 'ar_len' => $row->ar_len // extra sanity
+ 'ar_len' => $row->ar_len // extra sanity
),
__METHOD__
);
@@ -201,4 +201,4 @@ class PopulateRevisionSha1 extends LoggedUpdateMaintenance {
}
$maintClass = "PopulateRevisionSha1";
-require_once( RUN_MAINTENANCE_IF_MAIN );
+require_once RUN_MAINTENANCE_IF_MAIN;
diff --git a/maintenance/postgres/archives/patch-external_user.sql b/maintenance/postgres/archives/patch-external_user.sql
deleted file mode 100644
index 6058a706..00000000
--- a/maintenance/postgres/archives/patch-external_user.sql
+++ /dev/null
@@ -1,6 +0,0 @@
-CREATE TABLE external_user (
- eu_local_id INTEGER NOT NULL PRIMARY KEY,
- eu_external_id TEXT
-);
-
-CREATE UNIQUE INDEX eu_external_id ON external_user (eu_external_id);
diff --git a/maintenance/postgres/archives/patch-kill-iwl_pft.sql b/maintenance/postgres/archives/patch-kill-iwl_pft.sql
deleted file mode 100644
index 4419d9e9..00000000
--- a/maintenance/postgres/archives/patch-kill-iwl_pft.sql
+++ /dev/null
@@ -1,7 +0,0 @@
---
--- 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-profiling.sql b/maintenance/postgres/archives/patch-profiling.sql
index 1c4dce4e..5a2710a8 100644
--- a/maintenance/postgres/archives/patch-profiling.sql
+++ b/maintenance/postgres/archives/patch-profiling.sql
@@ -1,6 +1,7 @@
CREATE TABLE profiling (
pf_count INTEGER NOT NULL DEFAULT 0,
- pf_time NUMERIC(18,10) NOT NULL DEFAULT 0,
+ pf_time FLOAT NOT NULL DEFAULT 0,
+ pf_memory FLOAT NOT NULL DEFAULT 0,
pf_name TEXT NOT NULL,
pf_server TEXT NULL
);
diff --git a/maintenance/postgres/archives/patch-rename-iwl_prefix.sql b/maintenance/postgres/archives/patch-rename-iwl_prefix.sql
index a4bdb6a9..0eb792ea 100644
--- a/maintenance/postgres/archives/patch-rename-iwl_prefix.sql
+++ b/maintenance/postgres/archives/patch-rename-iwl_prefix.sql
@@ -1,2 +1,2 @@
DROP INDEX iwl_prefix;
-CREATE UNIQUE INDEX iwl_prefix_title_from ON iwlinks (iwl_prefix, iwl_from, iwl_title);
+CREATE UNIQUE INDEX iwl_prefix_title_from ON iwlinks (iwl_prefix, iwl_title, iwl_from);
diff --git a/maintenance/postgres/tables.sql b/maintenance/postgres/tables.sql
index 9cbabfdf..bc2428e4 100644
--- a/maintenance/postgres/tables.sql
+++ b/maintenance/postgres/tables.sql
@@ -18,6 +18,8 @@ DROP SEQUENCE IF EXISTS recentchanges_rc_id_seq CASCADE;
DROP SEQUENCE IF EXISTS logging_log_id_seq CASCADE;
DROP SEQUENCE IF EXISTS job_job_id_seq CASCADE;
DROP SEQUENCE IF EXISTS category_cat_id_seq CASCADE;
+DROP SEQUENCE IF EXISTS archive_ar_id_seq CASCADE;
+DROP SEQUENCE IF EXISTS externallinks_el_id_seq CASCADE;
DROP FUNCTION IF EXISTS page_deleted() CASCADE;
DROP FUNCTION IF EXISTS ts2_page_title() CASCADE;
DROP FUNCTION IF EXISTS ts2_page_text() CASCADE;
@@ -156,7 +158,9 @@ ALTER TABLE page_props ADD CONSTRAINT page_props_pk PRIMARY KEY (pp_page,pp_prop
CREATE INDEX page_props_propname ON page_props (pp_propname);
CREATE UNIQUE INDEX pp_propname_page ON page_props (pp_propname,pp_page);
+CREATE SEQUENCE archive_ar_id_seq;
CREATE TABLE archive (
+ ar_id INTEGER NOT NULL PRIMARY KEY DEFAULT nextval('archive_ar_id_seq'),
ar_namespace SMALLINT NOT NULL,
ar_title TEXT NOT NULL,
ar_text TEXT, -- technically should be bytea, but not used anymore
@@ -224,7 +228,9 @@ CREATE TABLE categorylinks (
CREATE UNIQUE INDEX cl_from ON categorylinks (cl_from, cl_to);
CREATE INDEX cl_sortkey ON categorylinks (cl_to, cl_sortkey, cl_from);
+CREATE SEQUENCE externallinks_id_seq;
CREATE TABLE externallinks (
+ el_id INTEGER NOT NULL PRIMARY KEY DEFAULT nextval('externallinks_id_seq'),
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
@@ -232,13 +238,6 @@ CREATE TABLE externallinks (
CREATE INDEX externallinks_from_to ON externallinks (el_from,el_to);
CREATE INDEX externallinks_index ON externallinks (el_index);
-CREATE TABLE external_user (
- eu_local_id INTEGER NOT NULL PRIMARY KEY,
- eu_external_id TEXT
-);
-
-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 DEFERRABLE INITIALLY DEFERRED,
ll_lang TEXT,
@@ -412,8 +411,6 @@ CREATE TABLE recentchanges (
rc_this_oldid INTEGER NOT NULL,
rc_last_oldid INTEGER NOT NULL,
rc_type SMALLINT NOT NULL DEFAULT 0,
- rc_moved_to_ns SMALLINT,
- rc_moved_to_title TEXT,
rc_patrolled SMALLINT NOT NULL DEFAULT 0,
rc_ip CIDR,
rc_old_len INTEGER,
@@ -594,8 +591,8 @@ $mw$;
-- 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_memory NUMERIC(18,10) NOT NULL DEFAULT 0,
+ pf_time FLOAT NOT NULL DEFAULT 0,
+ pf_memory FLOAT NOT NULL DEFAULT 0,
pf_name TEXT NOT NULL,
pf_server TEXT NULL
);
@@ -679,6 +676,7 @@ CREATE TABLE iwlinks (
);
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);
+CREATE UNIQUE INDEX iwl_prefix_from_title ON iwlinks (iwl_prefix, iwl_from, iwl_title);
CREATE TABLE msg_resource (
mr_resource TEXT NOT NULL,
diff --git a/maintenance/preprocessDump.php b/maintenance/preprocessDump.php
index bb3d68b0..0dc19e28 100644
--- a/maintenance/preprocessDump.php
+++ b/maintenance/preprocessDump.php
@@ -25,7 +25,7 @@
* @ingroup Maintenance
*/
-require_once( __DIR__ . '/dumpIterator.php' );
+require_once __DIR__ . '/dumpIterator.php';
/**
* Maintenance script that takes page text out of an XML dump file and
@@ -86,12 +86,11 @@ class PreprocessDump extends DumpIterator {
try {
$this->mPreprocessor->preprocessToObj( strval( $content->getNativeData() ), 0 );
- }
- catch(Exception $e) {
- $this->error("Caught exception " . $e->getMessage() . " in " . $rev->getTitle()->getPrefixedText() );
+ } catch ( Exception $e ) {
+ $this->error( "Caught exception " . $e->getMessage() . " in " . $rev->getTitle()->getPrefixedText() );
}
}
}
$maintClass = "PreprocessDump";
-require_once( RUN_MAINTENANCE_IF_MAIN );
+require_once RUN_MAINTENANCE_IF_MAIN;
diff --git a/maintenance/preprocessorFuzzTest.php b/maintenance/preprocessorFuzzTest.php
index 49c7aee3..563ea459 100644
--- a/maintenance/preprocessorFuzzTest.php
+++ b/maintenance/preprocessorFuzzTest.php
@@ -21,7 +21,7 @@
* @ingroup Maintenance
*/
-require_once( __DIR__ . '/commandLine.inc' );
+require_once __DIR__ . '/commandLine.inc';
$wgHooks['BeforeParserFetchTemplateAndtitle'][] = 'PPFuzzTester::templateHook';
@@ -29,7 +29,7 @@ class PPFuzzTester {
public $hairs = array(
'[[', ']]', '{{', '{{', '}}', '}}', '{{{', '}}}',
'<', '>', '<nowiki', '<gallery', '</nowiki>', '</gallery>', '<nOwIkI>', '</NoWiKi>',
- '<!--' , '-->',
+ '<!--', '-->',
"\n==", "==\n",
'|', '=', "\n", ' ', "\t", "\x7f",
'~~', '~~~', '~~~~', 'subst:',
diff --git a/maintenance/protect.php b/maintenance/protect.php
index ff13bd6e..ec03f934 100644
--- a/maintenance/protect.php
+++ b/maintenance/protect.php
@@ -21,7 +21,7 @@
* @ingroup Maintenance
*/
-require_once( __DIR__ . '/Maintenance.php' );
+require_once __DIR__ . '/Maintenance.php';
/**
* Maintenance script that protects or unprotects a page.
@@ -67,7 +67,7 @@ class Protect extends Maintenance {
}
$restrictions = array();
- foreach( $t->getRestrictionTypes() as $type ) {
+ foreach ( $t->getRestrictionTypes() as $type ) {
$restrictions[$type] = $protection;
}
@@ -86,4 +86,4 @@ class Protect extends Maintenance {
}
$maintClass = "Protect";
-require_once( RUN_MAINTENANCE_IF_MAIN );
+require_once RUN_MAINTENANCE_IF_MAIN;
diff --git a/maintenance/proxyCheck.php b/maintenance/proxyCheck.php
deleted file mode 100644
index 2ccf703e..00000000
--- a/maintenance/proxyCheck.php
+++ /dev/null
@@ -1,70 +0,0 @@
-<?php
-/**
- * Command line script to check for an open proxy at a specified location.
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License along
- * with this program; if not, write 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
- */
-
-if( PHP_SAPI != 'cli' ) {
- die( 1 );
-}
-
-/**
- *
- */
-$output = '';
-
-/**
- * Exit if there are not enough parameters, or if it's not command line mode
- */
-if ( ( isset( $_REQUEST ) && array_key_exists( 'argv', $_REQUEST ) ) || count( $argv ) < 4 ) {
- $output .= "Incorrect parameters\n";
-} else {
- /**
- * Get parameters
- */
- $ip = $argv[1];
- $port = $argv[2];
- $url = $argv[3];
- $host = trim(`hostname`);
- $output = "Connecting to $ip:$port, target $url, this hostname $host\n";
-
- # Open socket
- $sock = @fsockopen($ip, $port, $errno, $errstr, 5);
- if ($errno == 0 ) {
- $output .= "Connected\n";
- # Send payload
- $request = "GET $url HTTP/1.0\r\n";
-# $request .= "Proxy-Connection: Keep-Alive\r\n";
-# $request .= "Pragma: no-cache\r\n";
-# $request .= "Host: ".$url."\r\n";
-# $request .= "User-Agent: MediaWiki open proxy check\r\n";
- $request .= "\r\n";
- @fputs($sock, $request);
- $response = fgets($sock, 65536);
- $output .= $response;
- @fclose($sock);
- } else {
- $output .= "No connection\n";
- }
-}
-
-$output = escapeshellarg( $output );
-
-#`echo $output >> /home/tstarling/open/proxy.log`;
diff --git a/maintenance/pruneFileCache.php b/maintenance/pruneFileCache.php
index e058e3ec..48d38977 100644
--- a/maintenance/pruneFileCache.php
+++ b/maintenance/pruneFileCache.php
@@ -21,7 +21,7 @@
* @ingroup Maintenance
*/
-require_once( __DIR__ . '/Maintenance.php' );
+require_once __DIR__ . '/Maintenance.php';
/**
* Maintenance script that prunes file cache for pages, objects, resources, etc.
@@ -108,4 +108,4 @@ class PruneFileCache extends Maintenance {
}
$maintClass = "PruneFileCache";
-require_once( RUN_MAINTENANCE_IF_MAIN );
+require_once RUN_MAINTENANCE_IF_MAIN;
diff --git a/maintenance/purgeChangedFiles.php b/maintenance/purgeChangedFiles.php
new file mode 100644
index 00000000..9f83ee7f
--- /dev/null
+++ b/maintenance/purgeChangedFiles.php
@@ -0,0 +1,255 @@
+<?php
+/**
+ * Scan the logging table and purge affected files within a timeframe.
+ *
+ * @section 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 Maintenance
+ */
+
+require_once __DIR__ . '/Maintenance.php';
+
+/**
+ * Maintenance script that scans the deletion log and purges affected files
+ * within a timeframe.
+ *
+ * @ingroup Maintenance
+ */
+class PurgeChangedFiles extends Maintenance {
+ /**
+ * Mapping from type option to log type and actions.
+ * @var array
+ */
+ private static $typeMappings = array(
+ 'created' => array(
+ 'upload' => array( 'upload' ),
+ 'import' => array( 'upload', 'interwiki' ),
+ ),
+ 'deleted' => array(
+ 'delete' => array( 'delete', 'revision' ),
+ 'suppress' => array( 'delete', 'revision' ),
+ ),
+ 'modified' => array(
+ 'upload' => array( 'overwrite', 'revert' ),
+ 'move' => array( 'move', 'move_redir' ),
+ ),
+ );
+
+ /**
+ * @var string
+ */
+ private $startTimestamp;
+
+ /**
+ * @var string
+ */
+ private $endTimestamp;
+
+ public function __construct() {
+ parent::__construct();
+ $this->mDescription = "Scan the logging table and purge files and thumbnails.";
+ $this->addOption( 'starttime', 'Starting timestamp', true, true );
+ $this->addOption( 'endtime', 'Ending timestamp', true, true );
+ $this->addOption( 'type', 'Comma-separated list of types of changes to send purges for (' .
+ implode( ',', array_keys( self::$typeMappings ) ) . ',all)', false, true );
+ $this->addOption( 'htcp-dest', 'HTCP announcement destination (IP:port)', false, true );
+ $this->addOption( 'dry-run', 'Do not send purge requests' );
+ $this->addOption( 'verbose', 'Show more output', false, false, 'v' );
+ }
+
+ public function execute() {
+ global $wgHTCPRouting;
+
+ if ( $this->hasOption( 'htcp-dest' ) ) {
+ $parts = explode( ':', $this->getOption( 'htcp-dest' ) );
+ if ( count( $parts ) < 2 ) {
+ // Add default htcp port
+ $parts[] = '4827';
+ }
+
+ // Route all HTCP messages to provided host:port
+ $wgHTCPRouting = array(
+ '' => array( 'host' => $parts[0], 'port' => $parts[1] ),
+ );
+ $this->verbose( "HTCP broadcasts to {$parts[0]}:{$parts[1]}\n" );
+ }
+
+ // Find out which actions we should be concerned with
+ $typeOpt = $this->getOption( 'type', 'all' );
+ $validTypes = array_keys( self::$typeMappings );
+ if ( $typeOpt === 'all' ) {
+ // Convert 'all' to all registered types
+ $typeOpt = implode( ',', $validTypes );
+ }
+ $typeList = explode( ',', $typeOpt );
+ foreach ( $typeList as $type ) {
+ if ( !in_array( $type, $validTypes ) ) {
+ $this->error( "\nERROR: Unknown type: {$type}\n" );
+ $this->maybeHelp( true );
+ }
+ }
+
+ // Validate the timestamps
+ $dbr = $this->getDB( DB_SLAVE );
+ $this->startTimestamp = $dbr->timestamp( $this->getOption( 'starttime' ) );
+ $this->endTimestamp = $dbr->timestamp( $this->getOption( 'endtime' ) );
+
+ if ( $this->startTimestamp > $this->endTimestamp ) {
+ $this->error( "\nERROR: starttime after endtime\n" );
+ $this->maybeHelp( true );
+ }
+
+ // Turn on verbose when dry-run is enabled
+ if ( $this->hasOption( 'dry-run' ) ) {
+ $this->mOptions['verbose'] = 1;
+ }
+
+ $this->verbose( 'Purging files that were: ' . implode( ', ', $typeList ) . "\n");
+ foreach ( $typeList as $type ) {
+ $this->verbose( "Checking for {$type} files...\n" );
+ $this->purgeFromLogType( $type );
+ if ( !$this->hasOption( 'dry-run' ) ) {
+ $this->verbose( "...{$type} files purged.\n\n" );
+ }
+ }
+ }
+
+ /**
+ * Purge cache and thumbnails for changes of the given type.
+ *
+ * @param string $type Type of change to find
+ */
+ protected function purgeFromLogType( $type ) {
+ $repo = RepoGroup::singleton()->getLocalRepo();
+ $dbr = $this->getDB( DB_SLAVE );
+
+ foreach ( self::$typeMappings[$type] as $logType => $logActions ) {
+ $this->verbose( "Scanning for {$logType}/" . implode( ',', $logActions ) . "\n" );
+
+ $res = $dbr->select(
+ 'logging',
+ array( 'log_title', 'log_timestamp', 'log_params' ),
+ array(
+ 'log_namespace' => NS_FILE,
+ 'log_type' => $logType,
+ 'log_action' => $logActions,
+ 'log_timestamp >= ' . $dbr->addQuotes( $this->startTimestamp ),
+ 'log_timestamp <= ' . $dbr->addQuotes( $this->endTimestamp ),
+ ),
+ __METHOD__
+ );
+
+ foreach ( $res as $row ) {
+ $file = $repo->newFile( Title::makeTitle( NS_FILE, $row->log_title ) );
+
+ if ( $this->hasOption( 'dry-run' ) ) {
+ $this->verbose( "{$type}[{$row->log_timestamp}]: {$row->log_title}\n" );
+ continue;
+ }
+
+ // Purge current version and any versions in oldimage table
+ $file->purgeCache();
+ $file->purgeHistory();
+
+ if ( $logType === 'delete' ) {
+ // If there is an orphaned storage file... delete it
+ if ( !$file->exists() && $repo->fileExists( $file->getPath() ) ) {
+ $dpath = $this->getDeletedPath( $repo, $file );
+ if ( $repo->fileExists( $dpath ) ) {
+ // Sanity check to avoid data loss
+ $repo->getBackend()->delete( array( 'src' => $file->getPath() ) );
+ $this->verbose( "Deleted orphan file: {$file->getPath()}.\n" );
+
+ } else {
+ $this->error( "File was not deleted: {$file->getPath()}.\n" );
+ }
+ }
+
+ // Purge items from fileachive table (rows are likely here)
+ $this->purgeFromArchiveTable( $repo, $file );
+
+ } else if ( $logType === 'move' ) {
+ // Purge the target file as well
+
+ $params = unserialize( $row->log_params );
+ if ( isset( $params['4::target'] ) ) {
+ $target = $params['4::target'];
+ $targetFile = $repo->newFile( Title::makeTitle( NS_FILE, $target ) );
+ $targetFile->purgeCache();
+ $targetFile->purgeHistory();
+ $this->verbose( "Purged file {$target}; move target @{$row->log_timestamp}.\n" );
+ }
+ }
+
+ $this->verbose( "Purged file {$row->log_title}; {$type} @{$row->log_timestamp}.\n" );
+ }
+ }
+ }
+
+ protected function purgeFromArchiveTable( LocalRepo $repo, LocalFile $file ) {
+ $dbr = $repo->getSlaveDB();
+ $res = $dbr->select(
+ 'filearchive',
+ array( 'fa_archive_name' ),
+ array( 'fa_name' => $file->getName() ),
+ __METHOD__
+ );
+
+ foreach ( $res as $row ) {
+ if ( $row->fa_archive_name === null ) {
+ // Was not an old version (current version names checked already)
+ continue;
+ }
+ $ofile = $repo->newFromArchiveName( $file->getTitle(), $row->fa_archive_name );
+ // If there is an orphaned storage file still there...delete it
+ if ( !$file->exists() && $repo->fileExists( $ofile->getPath() ) ) {
+ $dpath = $this->getDeletedPath( $repo, $ofile );
+ if ( $repo->fileExists( $dpath ) ) {
+ // Sanity check to avoid data loss
+ $repo->getBackend()->delete( array( 'src' => $ofile->getPath() ) );
+ $this->output( "Deleted orphan file: {$ofile->getPath()}.\n" );
+
+ } else {
+ $this->error( "File was not deleted: {$ofile->getPath()}.\n" );
+ }
+ }
+ $file->purgeOldThumbnails( $row->fa_archive_name );
+ }
+ }
+
+ protected function getDeletedPath( LocalRepo $repo, LocalFile $file ) {
+ $hash = $repo->getFileSha1( $file->getPath() );
+ $key = "{$hash}.{$file->getExtension()}";
+ return $repo->getDeletedHashPath( $key ) . $key;
+ }
+
+ /**
+ * Send an output message iff the 'verbose' option has been provided.
+ *
+ * @param string $msg Message to output
+ */
+ protected function verbose( $msg ) {
+ if ( $this->hasOption( 'verbose' ) ) {
+ $this->output( $msg );
+ }
+ }
+
+}
+
+$maintClass = "PurgeChangedFiles";
+require_once RUN_MAINTENANCE_IF_MAIN;
diff --git a/maintenance/purgeChangedPages.php b/maintenance/purgeChangedPages.php
new file mode 100644
index 00000000..071ac09c
--- /dev/null
+++ b/maintenance/purgeChangedPages.php
@@ -0,0 +1,191 @@
+<?php
+/**
+ * Send purge requests for pages edited in date range to squid/varnish.
+ *
+ * @section 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 Maintenance
+ */
+
+require_once __DIR__ . '/Maintenance.php';
+
+/**
+ * Maintenance script that sends purge requests for pages edited in a date
+ * range to squid/varnish.
+ *
+ * Can be used to recover from an HTCP message partition or other major cache
+ * layer interruption.
+ *
+ * @ingroup Maintenance
+ */
+class PurgeChangedPages extends Maintenance {
+
+ public function __construct() {
+ parent::__construct();
+ $this->mDescription = 'Send purge requests for edits in date range to squid/varnish';
+ $this->addOption( 'starttime', 'Starting timestamp', true, true );
+ $this->addOption( 'endtime', 'Ending timestamp', true, true );
+ $this->addOption( 'htcp-dest', 'HTCP announcement destination (IP:port)', false, true );
+ $this->addOption( 'sleep-per-batch', 'Milliseconds to sleep between batches', false, true );
+ $this->addOption( 'dry-run', 'Do not send purge requests' );
+ $this->addOption( 'verbose', 'Show more output', false, false, 'v' );
+ $this->setBatchSize( 100 );
+ }
+
+ public function execute() {
+ global $wgHTCPRouting;
+
+ if ( $this->hasOption( 'htcp-dest' ) ) {
+ $parts = explode( ':', $this->getOption( 'htcp-dest' ) );
+ if ( count( $parts ) < 2 ) {
+ // Add default htcp port
+ $parts[] = '4827';
+ }
+
+ // Route all HTCP messages to provided host:port
+ $wgHTCPRouting = array(
+ '' => array( 'host' => $parts[0], 'port' => $parts[1] ),
+ );
+ if ( $this->hasOption( 'verbose' ) ) {
+ $this->output( "HTCP broadcasts to {$parts[0]}:{$parts[1]}\n" );
+ }
+ }
+
+ $dbr = $this->getDB( DB_SLAVE );
+ $minTime = $dbr->timestamp( $this->getOption( 'starttime' ) );
+ $maxTime = $dbr->timestamp( $this->getOption( 'endtime' ) );
+
+ if ( $maxTime < $minTime ) {
+ $this->error( "\nERROR: starttime after endtime\n" );
+ $this->maybeHelp( true );
+ }
+
+ $stuckCount = 0; // loop breaker
+ while ( true ) {
+ // Adjust bach size if we are stuck in a second that had many changes
+ $bSize = $this->mBatchSize + ( $stuckCount * $this->mBatchSize );
+
+ $res = $dbr->select(
+ array( 'page', 'revision' ),
+ array(
+ 'rev_timestamp',
+ 'page_namespace',
+ 'page_title',
+ ),
+ array(
+ "rev_timestamp > " . $dbr->addQuotes( $minTime ),
+ "rev_timestamp <= " . $dbr->addQuotes( $maxTime ),
+ // Only get rows where the revision is the latest for the page.
+ // Other revisions would be duplicate and we don't need to purge if
+ // there has been an edit after the interesting time window.
+ "page_latest = rev_id",
+ ),
+ __METHOD__,
+ array( 'ORDER BY' => 'rev_timestamp', 'LIMIT' => $bSize ),
+ array(
+ 'page' => array( 'INNER JOIN', 'rev_page=page_id' ),
+ )
+ );
+
+ if ( !$res->numRows() ) {
+ // nothing more found so we are done
+ break;
+ }
+
+ // Kludge to not get stuck in loops for batches with the same timestamp
+ list( $rows, $lastTime ) = $this->pageableSortedRows( $res, 'rev_timestamp', $bSize );
+ if ( !count( $rows ) ) {
+ ++$stuckCount;
+ continue;
+ }
+ // Reset suck counter
+ $stuckCount = 0;
+
+ $this->output( "Processing changes from {$minTime} to {$lastTime}.\n" );
+
+ // Advance past the last row next time
+ $minTime = $lastTime;
+
+ // Create list of URLs from page_namespace + page_title
+ $urls = array();
+ foreach ( $rows as $row ) {
+ $title = Title::makeTitle( $row->page_namespace, $row->page_title );
+ $urls[] = $title->getInternalURL();
+ }
+
+ if ( $this->hasOption( 'dry-run' ) || $this->hasOption( 'verbose' ) ) {
+ $this->output( implode( "\n", $urls ) . "\n" );
+ if ( $this->hasOption( 'dry-run' ) ) {
+ continue;
+ }
+ }
+
+ // Send batch of purge requests out to squids
+ $squid = new SquidUpdate( $urls, count( $urls ) );
+ $squid->doUpdate();
+
+ if ( $this->hasOption( 'sleep-per-batch' ) ) {
+ // sleep-per-batch is milliseconds, usleep wants micro seconds.
+ usleep( 1000 * (int)$this->getOption( 'sleep-per-batch' ) );
+ }
+ }
+
+ $this->output( "Done!\n" );
+ }
+
+ /**
+ * Remove all the rows in a result set with the highest value for column
+ * $column unless the number of rows is less $limit. This returns the new
+ * array of rows and the highest value of column $column for the rows left.
+ * The ordering of rows is maintained.
+ *
+ * This is useful for paging on mostly-unique values that may sometimes
+ * have large clumps of identical values. It should be safe to do the next
+ * query on items with a value higher than the highest of the rows returned here.
+ * If this returns an empty array for a non-empty query result, then all the rows
+ * had the same column value and the query should be repeated with a higher LIMIT.
+ *
+ * @TODO: move this elsewhere
+ *
+ * @param ResultWrapper $res Query result sorted by $column (ascending)
+ * @param string $column
+ * @return array (array of rows, string column value)
+ */
+ protected function pageableSortedRows( ResultWrapper $res, $column, $limit ) {
+ $rows = iterator_to_array( $res, false );
+ $count = count( $rows );
+ if ( !$count ) {
+ return array( array(), null ); // nothing to do
+ } elseif ( $count < $limit ) {
+ return array( $rows, $rows[$count - 1]->$column ); // no more rows left
+ }
+ $lastValue = $rows[$count - 1]->$column; // should be the highest
+ for ( $i = $count - 1; $i >= 0; --$i ) {
+ if ( $rows[$i]->$column === $lastValue ) {
+ unset( $rows[$i] );
+ } else {
+ break;
+ }
+ }
+ $lastValueLeft = count( $rows ) ? $rows[count( $rows ) - 1]->$column : null;
+ return array( $rows, $lastValueLeft );
+ }
+}
+
+$maintClass = "PurgeChangedPages";
+require_once RUN_MAINTENANCE_IF_MAIN;
diff --git a/maintenance/purgeDeletedFiles.php b/maintenance/purgeDeletedFiles.php
deleted file mode 100644
index cd62716b..00000000
--- a/maintenance/purgeDeletedFiles.php
+++ /dev/null
@@ -1,96 +0,0 @@
-<?php
-/**
- * Scan the deletion log and purges affected files within a timeframe.
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License along
- * with this program; if not, write 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( __DIR__ . '/Maintenance.php' );
-
-/**
- * Maintenance script that scans the deletion log and purges affected files
- * within a timeframe.
- *
- * @ingroup Maintenance
- */
-class PurgeDeletedFiles extends Maintenance {
- public function __construct() {
- parent::__construct();
- $this->mDescription = "Scan the logging table and purge files that where deleted.";
- $this->addOption( 'starttime', 'Starting timestamp', false, true );
- $this->addOption( 'endtime', 'Ending timestamp', false, true );
- }
-
- public function execute() {
- $this->output( "Purging cache and thumbnails for deleted files...\n" );
- $this->purgeFromLogType( 'delete' );
- $this->output( "...deleted files purged.\n\n" );
-
- $this->output( "Purging cache and thumbnails for suppressed files...\n" );
- $this->purgeFromLogType( 'suppress' );
- $this->output( "...suppressed files purged.\n" );
- }
-
- protected function purgeFromLogType( $logType ) {
- $repo = RepoGroup::singleton()->getLocalRepo();
- $db = $repo->getSlaveDB();
-
- $conds = array(
- 'log_namespace' => NS_FILE,
- 'log_type' => $logType,
- 'log_action' => array( 'delete', 'revision' )
- );
- $start = $this->getOption( 'starttime' );
- if ( $start ) {
- $conds[] = 'log_timestamp >= ' . $db->addQuotes( $db->timestamp( $start ) );
- }
- $end = $this->getOption( 'endtime' );
- if ( $end ) {
- $conds[] = 'log_timestamp <= ' . $db->addQuotes( $db->timestamp( $end ) );
- }
-
- $res = $db->select( 'logging', array( 'log_title', 'log_timestamp' ), $conds, __METHOD__ );
- foreach ( $res as $row ) {
- $file = $repo->newFile( Title::makeTitle( NS_FILE, $row->log_title ) );
-
- // Purge current version and any versions in oldimage table
- $file->purgeCache();
- $file->purgeHistory();
- // Purge items from fileachive table (rows are likely here)
- $this->purgeFromArchiveTable( $file );
-
- $this->output( "Purged file {$row->log_title}; deleted on {$row->log_timestamp}.\n" );
- }
- }
-
- protected function purgeFromArchiveTable( LocalFile $file ) {
- $db = $file->getRepo()->getSlaveDB();
- $res = $db->select( 'filearchive',
- array( 'fa_archive_name' ),
- array( 'fa_name' => $file->getName() ),
- __METHOD__
- );
- foreach ( $res as $row ) {
- $file->purgeOldThumbnails( $row->fa_archive_name );
- }
- }
-}
-
-$maintClass = "PurgeDeletedFiles";
-require_once( RUN_MAINTENANCE_IF_MAIN );
diff --git a/maintenance/purgeList.php b/maintenance/purgeList.php
index b72c417e..2f895201 100644
--- a/maintenance/purgeList.php
+++ b/maintenance/purgeList.php
@@ -21,7 +21,7 @@
* @ingroup Maintenance
*/
-require_once( __DIR__ . '/Maintenance.php' );
+require_once __DIR__ . '/Maintenance.php';
/**
* Maintenance script that sends purge requests for listed pages to squid.
@@ -44,7 +44,7 @@ class PurgeList extends Maintenance {
if ( $this->hasOption( 'all' ) ) {
$this->purgeNamespace( false );
} elseif ( $this->hasOption( 'namespace' ) ) {
- $this->purgeNamespace( intval( $this->getOption( 'namespace') ) );
+ $this->purgeNamespace( intval( $this->getOption( 'namespace' ) ) );
} else {
$this->doPurge();
}
@@ -63,7 +63,7 @@ class PurgeList extends Maintenance {
} elseif ( $page !== '' ) {
$title = Title::newFromText( $page );
if ( $title ) {
- $url = $title->getInternalUrl();
+ $url = $title->getInternalURL();
$this->output( "$url\n" );
$urls[] = $url;
if ( $this->getOption( 'purge' ) ) {
@@ -74,7 +74,7 @@ class PurgeList extends Maintenance {
}
}
}
- $this->output( "Purging " . count( $urls ). " urls\n" );
+ $this->output( "Purging " . count( $urls ) . " urls\n" );
$this->sendPurgeRequest( $urls );
}
@@ -88,7 +88,7 @@ class PurgeList extends Maintenance {
$conds = array( 'page_namespace' => $namespace );
}
while ( true ) {
- $res = $dbr->select( 'page',
+ $res = $dbr->select( 'page',
array( 'page_id', 'page_namespace', 'page_title' ),
$conds + array( 'page_id > ' . $dbr->addQuotes( $startId ) ),
__METHOD__,
@@ -104,7 +104,7 @@ class PurgeList extends Maintenance {
$urls = array();
foreach ( $res as $row ) {
$title = Title::makeTitle( $row->page_namespace, $row->page_title );
- $url = $title->getInternalUrl();
+ $url = $title->getInternalURL();
$urls[] = $url;
$startId = $row->page_id;
}
@@ -129,7 +129,7 @@ class PurgeList extends Maintenance {
}
} else {
if ( $this->hasOption( 'verbose' ) ) {
- $this->output( implode( "\n", $urls ) . "\n" );
+ $this->output( implode( "\n", $urls ) . "\n" );
}
$u = new SquidUpdate( $urls );
$u->doUpdate();
@@ -139,4 +139,4 @@ class PurgeList extends Maintenance {
}
$maintClass = "PurgeList";
-require_once( RUN_MAINTENANCE_IF_MAIN );
+require_once RUN_MAINTENANCE_IF_MAIN;
diff --git a/maintenance/purgeOldText.inc b/maintenance/purgeOldText.inc
index 111c786a..db961d81 100644
--- a/maintenance/purgeOldText.inc
+++ b/maintenance/purgeOldText.inc
@@ -34,42 +34,42 @@ function PurgeRedundantText( $delete = false ) {
$tbl_txt = $dbw->tableName( 'text' );
# Get "active" text records from the revisions table
- echo( "Searching for active text records in revisions table..." );
+ echo "Searching for active text records in revisions table...";
$res = $dbw->query( "SELECT DISTINCT rev_text_id FROM $tbl_rev" );
foreach ( $res as $row ) {
$cur[] = $row->rev_text_id;
}
- echo( "done.\n" );
+ echo "done.\n";
# Get "active" text records from the archive table
- echo( "Searching for active text records in archive table..." );
+ echo "Searching for active text records in archive table...";
$res = $dbw->query( "SELECT DISTINCT ar_text_id FROM $tbl_arc" );
$cur = array();
foreach ( $res as $row ) {
$cur[] = $row->ar_text_id;
}
- echo( "done.\n" );
+ echo "done.\n";
# Get the IDs of all text records not in these sets
- echo( "Searching for inactive text records..." );
+ 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();
foreach ( $res as $row ) {
$old[] = $row->old_id;
}
- echo( "done.\n" );
+ echo "done.\n";
# Inform the user of what we're going to do
$count = count( $old );
- echo( "$count inactive items found.\n" );
+ echo "$count inactive items found.\n";
# Delete as appropriate
if ( $delete && $count ) {
- echo( "Deleting..." );
+ echo "Deleting...";
$set = implode( ', ', $old );
$dbw->query( "DELETE FROM $tbl_txt WHERE old_id IN ( $set )" );
- echo( "done.\n" );
+ echo "done.\n";
}
# Done
diff --git a/maintenance/purgeOldText.php b/maintenance/purgeOldText.php
index 1f0b063b..3d81e2df 100644
--- a/maintenance/purgeOldText.php
+++ b/maintenance/purgeOldText.php
@@ -22,7 +22,7 @@
* @author Rob Church <robchur@gmail.com>
*/
-require_once( __DIR__ . '/Maintenance.php' );
+require_once __DIR__ . '/Maintenance.php';
/**
* Maintenance script that purges old text records from the database.
@@ -42,4 +42,4 @@ class PurgeOldText extends Maintenance {
}
$maintClass = "PurgeOldText";
-require_once( RUN_MAINTENANCE_IF_MAIN );
+require_once RUN_MAINTENANCE_IF_MAIN;
diff --git a/maintenance/purgeParserCache.php b/maintenance/purgeParserCache.php
index e21dd176..ca2a0414 100644
--- a/maintenance/purgeParserCache.php
+++ b/maintenance/purgeParserCache.php
@@ -22,7 +22,7 @@
* @ingroup Maintenance
*/
-require( __DIR__ . '/Maintenance.php' );
+require __DIR__ . '/Maintenance.php';
/**
* Maintenance script to remove old objects from the parser cache.
@@ -81,4 +81,4 @@ class PurgeParserCache extends Maintenance {
}
}
$maintClass = 'PurgeParserCache';
-require_once( RUN_MAINTENANCE_IF_MAIN );
+require_once RUN_MAINTENANCE_IF_MAIN;
diff --git a/maintenance/reassignEdits.php b/maintenance/reassignEdits.php
index 2d79f363..7e15c09e 100644
--- a/maintenance/reassignEdits.php
+++ b/maintenance/reassignEdits.php
@@ -23,7 +23,7 @@
* @licence GNU General Public Licence 2.0 or later
*/
-require_once( __DIR__ . '/Maintenance.php' );
+require_once __DIR__ . '/Maintenance.php';
/**
* Maintenance script that reassigns edits from a user or IP address
@@ -46,7 +46,7 @@ class ReassignEdits extends Maintenance {
if ( $this->hasArg( 0 ) && $this->hasArg( 1 ) ) {
# Set up the users involved
$from = $this->initialiseUser( $this->getArg( 0 ) );
- $to = $this->initialiseUser( $this->getArg( 1 ) );
+ $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' ) ) {
@@ -179,4 +179,4 @@ class ReassignEdits extends Maintenance {
}
$maintClass = "ReassignEdits";
-require_once( RUN_MAINTENANCE_IF_MAIN );
+require_once RUN_MAINTENANCE_IF_MAIN;
diff --git a/maintenance/rebuildFileCache.php b/maintenance/rebuildFileCache.php
index 3165b97f..12ed9fac 100644
--- a/maintenance/rebuildFileCache.php
+++ b/maintenance/rebuildFileCache.php
@@ -21,7 +21,7 @@
* @ingroup Maintenance
*/
-require_once( __DIR__ . '/Maintenance.php' );
+require_once __DIR__ . '/Maintenance.php';
/**
* Maintenance script that builds file cache for content pages.
@@ -153,10 +153,11 @@ class RebuildFileCache extends Maintenance {
$this->output( "Done!\n" );
// Remove these to be safe
- if ( isset( $wgTitle ) )
+ if ( isset( $wgTitle ) ) {
unset( $wgTitle );
+ }
}
}
$maintClass = "RebuildFileCache";
-require_once( RUN_MAINTENANCE_IF_MAIN );
+require_once RUN_MAINTENANCE_IF_MAIN;
diff --git a/maintenance/rebuildImages.php b/maintenance/rebuildImages.php
index 2842b402..53bf823f 100644
--- a/maintenance/rebuildImages.php
+++ b/maintenance/rebuildImages.php
@@ -30,7 +30,7 @@
* @ingroup Maintenance
*/
-require_once( __DIR__ . '/Maintenance.php' );
+require_once __DIR__ . '/Maintenance.php';
/**
* Maintenance script to update image metadata records.
@@ -217,4 +217,4 @@ class ImageBuilder extends Maintenance {
}
$maintClass = 'ImageBuilder';
-require_once( RUN_MAINTENANCE_IF_MAIN );
+require_once RUN_MAINTENANCE_IF_MAIN;
diff --git a/maintenance/rebuildLocalisationCache.php b/maintenance/rebuildLocalisationCache.php
index db77564b..b7f306b1 100644
--- a/maintenance/rebuildLocalisationCache.php
+++ b/maintenance/rebuildLocalisationCache.php
@@ -29,7 +29,7 @@
* @ingroup Maintenance
*/
-require_once( __DIR__ . '/Maintenance.php' );
+require_once __DIR__ . '/Maintenance.php';
/**
* Maintenance script to rebuild the localisation cache.
@@ -44,6 +44,8 @@ class RebuildLocalisationCache extends Maintenance {
$this->addOption( 'threads', 'Fork more than one thread', false, true );
$this->addOption( 'outdir', 'Override the output directory (normally $wgCacheDirectory)',
false, true );
+ $this->addOption( 'lang', 'Only rebuild these languages, comma separated.',
+ false, true );
}
public function memoryLimit() {
@@ -59,7 +61,7 @@ class RebuildLocalisationCache extends Maintenance {
# no l10n cache. Break the cycle by forcing $wgLanguageCode = 'en'.
global $wgLanguageCode;
$wgLanguageCode = 'en';
- return parent::finalSetup();
+ parent::finalSetup();
}
public function execute() {
@@ -90,7 +92,19 @@ class RebuildLocalisationCache extends Maintenance {
}
$lc = new LocalisationCache_BulkLoad( $conf );
- $codes = array_keys( Language::fetchLanguageNames( null, 'mwfile' ) );
+ $allCodes = array_keys( Language::fetchLanguageNames( null, 'mwfile' ) );
+ if ( $this->hasOption( 'lang' ) ) {
+ # Validate requested languages
+ $codes = array_intersect( $allCodes,
+ explode( ',', $this->getOption( 'lang' ) ) );
+ # Bailed out if nothing is left
+ if ( count( $codes ) == 0 ) {
+ $this->error( 'None of the languages specified exists.', 1 );
+ }
+ } else {
+ # By default get all languages
+ $codes = $allCodes;
+ }
sort( $codes );
// Initialise and split into chunks
@@ -162,4 +176,4 @@ class RebuildLocalisationCache extends Maintenance {
}
$maintClass = "RebuildLocalisationCache";
-require_once( RUN_MAINTENANCE_IF_MAIN );
+require_once RUN_MAINTENANCE_IF_MAIN;
diff --git a/maintenance/rebuildall.php b/maintenance/rebuildall.php
index 882ae1b3..1268d209 100644
--- a/maintenance/rebuildall.php
+++ b/maintenance/rebuildall.php
@@ -22,7 +22,7 @@
* @ingroup Maintenance
*/
-require_once( __DIR__ . '/Maintenance.php' );
+require_once __DIR__ . '/Maintenance.php';
/**
* Maintenance script that rebuilds link tracking tables from scratch.
@@ -35,6 +35,10 @@ class RebuildAll extends Maintenance {
$this->mDescription = "Rebuild links, text index and recent changes";
}
+ public function getDbType() {
+ return Maintenance::DB_ADMIN;
+ }
+
public function execute() {
// Rebuild the text index
if ( wfGetDB( DB_SLAVE )->getType() != 'postgres' ) {
@@ -58,4 +62,4 @@ class RebuildAll extends Maintenance {
}
$maintClass = "RebuildAll";
-require_once( RUN_MAINTENANCE_IF_MAIN );
+require_once RUN_MAINTENANCE_IF_MAIN;
diff --git a/maintenance/rebuildmessages.php b/maintenance/rebuildmessages.php
index a70e591f..f223f1ab 100644
--- a/maintenance/rebuildmessages.php
+++ b/maintenance/rebuildmessages.php
@@ -21,7 +21,7 @@
* @ingroup Maintenance
*/
-require_once( __DIR__ . '/Maintenance.php' );
+require_once __DIR__ . '/Maintenance.php';
/**
* Maintenance script that purges all languages from the message cache.
@@ -45,12 +45,13 @@ class RebuildMessages extends Maintenance {
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" );
}
}
}
$maintClass = "RebuildMessages";
-require_once( RUN_MAINTENANCE_IF_MAIN );
+require_once RUN_MAINTENANCE_IF_MAIN;
diff --git a/maintenance/rebuildrecentchanges.php b/maintenance/rebuildrecentchanges.php
index bfaaab54..18348258 100644
--- a/maintenance/rebuildrecentchanges.php
+++ b/maintenance/rebuildrecentchanges.php
@@ -23,7 +23,7 @@
* @todo Document
*/
-require_once( __DIR__ . '/Maintenance.php' );
+require_once __DIR__ . '/Maintenance.php';
/**
* Maintenance script that rebuilds recent changes from scratch.
@@ -61,9 +61,9 @@ class RebuildRecentchanges extends Maintenance {
$this->output( '$wgRCMaxAge=' . $wgRCMaxAge );
$days = $wgRCMaxAge / 24 / 3600;
if ( intval( $days ) == $days ) {
- $this->output( " (" . $days . " days)\n" );
+ $this->output( " (" . $days . " days)\n" );
} else {
- $this->output( " (approx. " . intval( $days ) . " days)\n" );
+ $this->output( " (approx. " . intval( $days ) . " days)\n" );
}
$cutoff = time() - $wgRCMaxAge;
@@ -99,13 +99,13 @@ 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";
+ "ORDER BY rc_cur_id,rc_timestamp";
$res = $dbw->query( $sql, DB_MASTER );
$lastCurId = 0;
@@ -142,12 +142,12 @@ class RebuildRecentchanges extends Maintenance {
$dbw->update( 'recentchanges',
array(
'rc_last_oldid' => $lastOldId,
- 'rc_new' => $new,
- 'rc_type' => $new,
- 'rc_old_len' => $lastSize,
- 'rc_new_len' => $size,
+ 'rc_new' => $new,
+ 'rc_type' => $new,
+ 'rc_old_len' => $lastSize,
+ 'rc_new_len' => $size,
), array(
- 'rc_cur_id' => $lastCurId,
+ 'rc_cur_id' => $lastCurId,
'rc_this_oldid' => $obj->rc_this_oldid,
),
__METHOD__
@@ -292,4 +292,4 @@ class RebuildRecentchanges extends Maintenance {
}
$maintClass = "RebuildRecentchanges";
-require_once( RUN_MAINTENANCE_IF_MAIN );
+require_once RUN_MAINTENANCE_IF_MAIN;
diff --git a/maintenance/rebuildtextindex.php b/maintenance/rebuildtextindex.php
index 534b7ca1..c651f720 100644
--- a/maintenance/rebuildtextindex.php
+++ b/maintenance/rebuildtextindex.php
@@ -25,7 +25,7 @@
* @todo document
*/
-require_once( __DIR__ . '/Maintenance.php' );
+require_once __DIR__ . '/Maintenance.php';
/**
* Maintenance script that rebuilds search index table from scratch.
@@ -115,9 +115,8 @@ class RebuildTextIndex extends Maintenance {
$rev = new Revision( $s );
$content = $rev->getContent();
- $text = $content->getTextForSearchIndex();
- $u = new SearchUpdate( $s->page_id, $title, $text );
+ $u = new SearchUpdate( $s->page_id, $title, $content );
$u->doUpdate();
} catch ( MWContentSerializationException $ex ) {
$this->output( "Failed to deserialize content of revision {$s->rev_id} of page "
@@ -147,7 +146,7 @@ class RebuildTextIndex extends Maintenance {
$searchindex = $this->db->tableName( 'searchindex' );
$this->output( "\nRebuild the index...\n" );
$sql = "ALTER TABLE $searchindex ADD FULLTEXT si_title (si_title), " .
- "ADD FULLTEXT si_text (si_text)";
+ "ADD FULLTEXT si_text (si_text)";
$this->db->query( $sql, __METHOD__ );
}
@@ -162,4 +161,4 @@ class RebuildTextIndex extends Maintenance {
}
$maintClass = "RebuildTextIndex";
-require_once( RUN_MAINTENANCE_IF_MAIN );
+require_once RUN_MAINTENANCE_IF_MAIN;
diff --git a/maintenance/refreshFileHeaders.php b/maintenance/refreshFileHeaders.php
index 74f0f35d..8b852e39 100644
--- a/maintenance/refreshFileHeaders.php
+++ b/maintenance/refreshFileHeaders.php
@@ -24,7 +24,7 @@
* @ingroup Maintenance
*/
-require_once( __DIR__ . '/Maintenance.php' );
+require_once __DIR__ . '/Maintenance.php';
/**
* Maintenance script to refresh file headers from metadata
@@ -90,4 +90,4 @@ class RefreshFileHeaders extends Maintenance {
}
$maintClass = 'RefreshFileHeaders';
-require_once( RUN_MAINTENANCE_IF_MAIN );
+require_once RUN_MAINTENANCE_IF_MAIN;
diff --git a/maintenance/refreshImageMetadata.php b/maintenance/refreshImageMetadata.php
index 55f5b4aa..7fe5c4c1 100644
--- a/maintenance/refreshImageMetadata.php
+++ b/maintenance/refreshImageMetadata.php
@@ -27,7 +27,7 @@
* @ingroup Maintenance
*/
-require_once( __DIR__ . '/Maintenance.php' );
+require_once __DIR__ . '/Maintenance.php';
/**
* Maintenance script to refresh image metadata fields.
@@ -99,7 +99,7 @@ class RefreshImageMetadata extends Maintenance {
if ( $res->numRows() > 0 ) {
$row1 = $res->current();
- $this->output( "Processing next {$this->mBatchSize} rows starting with {$row1->img_name}.\n");
+ $this->output( "Processing next {$this->mBatchSize} rows starting with {$row1->img_name}.\n" );
$res->rewind();
} else {
$this->error( "No images to process.", 4 );
@@ -123,7 +123,7 @@ class RefreshImageMetadata extends Maintenance {
$this->output( "Warning: File:{$row->img_name} used to have " .
"$oldLength bytes of metadata but now has $newLength bytes.\n" );
} elseif ( $verbose ) {
- $this->output("Refreshed File:{$row->img_name}.\n" );
+ $this->output( "Refreshed File:{$row->img_name}.\n" );
}
} else {
$leftAlone++;
@@ -138,7 +138,7 @@ class RefreshImageMetadata extends Maintenance {
}
if ( $verbose ) {
- $this->output("Forcibly refreshed File:{$row->img_name}.\n" );
+ $this->output( "Forcibly refreshed File:{$row->img_name}.\n" );
}
}
else {
@@ -151,7 +151,7 @@ class RefreshImageMetadata extends Maintenance {
}
$conds2 = array( 'img_name > ' . $dbw->addQuotes( $row->img_name ) );
wfWaitForSlaves();
- } while( $res->numRows() === $this->mBatchSize );
+ } while ( $res->numRows() === $this->mBatchSize );
$total = $upgraded + $leftAlone;
if ( $force ) {
@@ -173,7 +173,7 @@ class RefreshImageMetadata extends Maintenance {
$like = $this->getOption( 'metadata-contains', false );
if ( $end !== false ) {
- $conds[] = 'img_name <= ' . $dbw->addQuotes( $end ) ;
+ $conds[] = 'img_name <= ' . $dbw->addQuotes( $end );
}
if ( $mime !== false ) {
list( $major, $minor ) = File::splitMime( $mime );
@@ -209,4 +209,4 @@ class RefreshImageMetadata extends Maintenance {
$maintClass = 'RefreshImageMetadata';
-require_once( RUN_MAINTENANCE_IF_MAIN );
+require_once RUN_MAINTENANCE_IF_MAIN;
diff --git a/maintenance/refreshLinks.php b/maintenance/refreshLinks.php
index 7b255664..98ea9301 100644
--- a/maintenance/refreshLinks.php
+++ b/maintenance/refreshLinks.php
@@ -21,7 +21,7 @@
* @ingroup Maintenance
*/
-require_once( __DIR__ . '/Maintenance.php' );
+require_once __DIR__ . '/Maintenance.php';
/**
* Maintenance script to refresh link tables.
@@ -160,7 +160,7 @@ class RefreshLinks extends Maintenance {
}
if ( !$redirectsOnly ) {
- $this->output( "Refreshing links table.\n" );
+ $this->output( "Refreshing links tables.\n" );
$this->output( "Starting from page_id $start of $end.\n" );
for ( $id = $start; $id <= $end; $id++ ) {
@@ -281,12 +281,13 @@ class RefreshLinks extends Maintenance {
$this->output( "Retrieving illegal entries from $table... " );
// 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 ),
- __METHOD__,
- 'DISTINCT',
- array( 'page' => array( 'LEFT JOIN', "$field=page_id" ) )
+ $results = $dbr->select(
+ array( $table, 'page' ),
+ $field,
+ array( 'page_id' => null ),
+ __METHOD__,
+ 'DISTINCT',
+ array( 'page' => array( 'LEFT JOIN', "$field=page_id" ) )
);
$counter = 0;
@@ -315,4 +316,4 @@ class RefreshLinks extends Maintenance {
}
$maintClass = 'RefreshLinks';
-require_once( RUN_MAINTENANCE_IF_MAIN );
+require_once RUN_MAINTENANCE_IF_MAIN;
diff --git a/maintenance/removeUnusedAccounts.php b/maintenance/removeUnusedAccounts.php
index b4528ca0..16cb17ab 100644
--- a/maintenance/removeUnusedAccounts.php
+++ b/maintenance/removeUnusedAccounts.php
@@ -23,7 +23,7 @@
* @author Rob Church <robchur@gmail.com>
*/
-require_once( __DIR__ . '/Maintenance.php' );
+require_once __DIR__ . '/Maintenance.php';
/**
* Maintenance script that removes unused user accounts from the database.
@@ -74,9 +74,12 @@ class RemoveUnusedAccounts extends Maintenance {
# If required, go back and delete each marked account
if ( $count > 0 && $this->hasOption( 'delete' ) ) {
- $this->output( "\nDeleting inactive accounts..." );
+ $this->output( "\nDeleting unused accounts..." );
$dbw = wfGetDB( DB_MASTER );
$dbw->delete( 'user', array( 'user_id' => $del ), __METHOD__ );
+ $dbw->delete( 'user_groups', array( 'ug_user' => $del ), __METHOD__ );
+ $dbw->delete( 'user_former_groups', array( 'ufg_user' => $del ), __METHOD__ );
+ $dbw->delete( 'user_properties', array( 'up_user' => $del ), __METHOD__ );
$dbw->delete( 'logging', array( 'log_user' => $del ), __METHOD__ );
$dbw->delete( 'recentchanges', array( 'rc_user' => $del ), __METHOD__ );
$this->output( "done.\n" );
@@ -124,4 +127,4 @@ class RemoveUnusedAccounts extends Maintenance {
}
$maintClass = "RemoveUnusedAccounts";
-require_once( RUN_MAINTENANCE_IF_MAIN );
+require_once RUN_MAINTENANCE_IF_MAIN;
diff --git a/maintenance/renameDbPrefix.php b/maintenance/renameDbPrefix.php
index 6f244791..ed9d1f5d 100644
--- a/maintenance/renameDbPrefix.php
+++ b/maintenance/renameDbPrefix.php
@@ -23,7 +23,7 @@
* @ingroup Maintenance
*/
-require_once( __DIR__ . '/Maintenance.php' );
+require_once __DIR__ . '/Maintenance.php';
/**
* Maintenance script that changes the prefix of database tables.
@@ -91,4 +91,4 @@ class RenameDbPrefix extends Maintenance {
}
$maintClass = "RenameDbPrefix";
-require_once( RUN_MAINTENANCE_IF_MAIN );
+require_once RUN_MAINTENANCE_IF_MAIN;
diff --git a/maintenance/renderDump.php b/maintenance/renderDump.php
index 2ba2b3dc..0cde28c5 100644
--- a/maintenance/renderDump.php
+++ b/maintenance/renderDump.php
@@ -28,7 +28,7 @@
* @ingroup Maintenance
*/
-require_once( __DIR__ . '/Maintenance.php' );
+require_once __DIR__ . '/Maintenance.php';
/**
* Maintenance script that takes page text out of an XML dump file
@@ -69,9 +69,10 @@ class DumpRenderer extends Maintenance {
$importer->doImport();
$delta = microtime( true ) - $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( "Rendered {$this->count} pages in " . round( $delta, 2 ) . " seconds " );
+ if ( $delta > 0 ) {
+ $this->error( round( $this->count / $delta, 2 ) . " pages/sec" );
+ }
$this->error( "\n" );
}
@@ -104,11 +105,10 @@ class DumpRenderer extends Maintenance {
$output = $content->getParserOutput( $title, null, $options );
file_put_contents( $filename,
- "<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Transitional//EN\" " .
- "\"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd\">\n" .
- "<html xmlns=\"http://www.w3.org/1999/xhtml\">\n" .
+ "<!DOCTYPE html>\n" .
+ "<html lang=\"en\" dir=\"ltr\">\n" .
"<head>\n" .
- "<meta http-equiv=\"Content-Type\" content=\"text/html; charset=utf-8\" />\n" .
+ "<meta charset=\"UTF-8\" />\n" .
"<title>" . htmlspecialchars( $display ) . "</title>\n" .
"</head>\n" .
"<body>\n" .
@@ -119,4 +119,4 @@ class DumpRenderer extends Maintenance {
}
$maintClass = "DumpRenderer";
-require_once( RUN_MAINTENANCE_IF_MAIN );
+require_once RUN_MAINTENANCE_IF_MAIN;
diff --git a/maintenance/resetUserTokens.php b/maintenance/resetUserTokens.php
index d7f8c6d0..bfe04d79 100644
--- a/maintenance/resetUserTokens.php
+++ b/maintenance/resetUserTokens.php
@@ -21,9 +21,10 @@
* @file
* @ingroup Maintenance
* @author Daniel Friesen <mediawiki@danielfriesen.name>
+ * @author Chris Steipp <csteipp@wikimedia.org>
*/
-require_once( __DIR__ . '/Maintenance.php' );
+require_once __DIR__ . '/Maintenance.php';
/**
* Maintenance script to reset the user_token for all users on the wiki.
@@ -35,14 +36,21 @@ class ResetUserTokens extends Maintenance {
parent::__construct();
$this->mDescription = "Reset the user_token of all users on the wiki. Note that this may log some of them out.";
$this->addOption( 'nowarn', "Hides the 5 seconds warning", false, false );
+ $this->addOption( 'nulls', 'Only reset tokens that are currently null (string of \x00\'s)', false, false );
+ $this->setBatchSize( 1000 );
}
public function execute() {
+ $this->nullsOnly = $this->getOption( 'nulls' );
if ( !$this->getOption( 'nowarn' ) ) {
- $this->output( "The script is about to reset the user_token for ALL USERS in the database.\n" );
- $this->output( "This may log some of them out and is not necessary unless you believe your\n" );
- $this->output( "user table has been compromised.\n" );
+ if ( $this->nullsOnly ) {
+ $this->output( "The script is about to reset the user_token for USERS WITH NULL TOKENS in the database.\n" );
+ } else {
+ $this->output( "The script is about to reset the user_token for ALL USERS in the database.\n" );
+ $this->output( "This may log some of them out and is not necessary unless you believe your\n" );
+ $this->output( "user table has been compromised.\n" );
+ }
$this->output( "\n" );
$this->output( "Abort with control-c in the next five seconds (skip this countdown with --nowarn) ... " );
wfCountDown( 5 );
@@ -50,29 +58,53 @@ class ResetUserTokens extends Maintenance {
// We list user by user_id from one of the slave database
$dbr = wfGetDB( DB_SLAVE );
- $result = $dbr->select( 'user',
- array( 'user_id' ),
- array(),
- __METHOD__
- );
- foreach ( $result as $id ) {
- $user = User::newFromId( $id->user_id );
+ $where = array();
+ if ( $this->nullsOnly ) {
+ // Have to build this by hand, because \ is escaped in helper functions
+ $where = array( 'user_token = \'' . str_repeat( '\0', 32) . '\'' );
+ }
- $username = $user->getName();
+ $maxid = $dbr->selectField( 'user', 'MAX(user_id)', array(), __METHOD__ );
- $this->output( "Resetting user_token for $username: " );
+ $min = 0;
+ $max = $this->mBatchSize;
- // Change value
- $user->setToken();
- $user->saveSettings();
+ do {
+ $result = $dbr->select( 'user',
+ array( 'user_id' ),
+ array_merge(
+ $where,
+ array( 'user_id > ' . $dbr->addQuotes( $min ),
+ 'user_id <= ' . $dbr->addQuotes( $max )
+ )
+ ),
+ __METHOD__
+ );
- $this->output( " OK\n" );
+ foreach ( $result as $user ) {
+ $this->updateUser( $user->user_id );
+ }
- }
+ $min = $max;
+ $max = $min + $this->mBatchSize;
+
+ wfWaitForSlaves();
+
+ } while ( $max <= $maxid );
+
+ }
+ private function updateUser( $userid ) {
+ $user = User::newFromId( $userid );
+ $username = $user->getName();
+ $this->output( 'Resetting user_token for "' . $username . '": ' );
+ // Change value
+ $user->setToken();
+ $user->saveSettings();
+ $this->output( " OK\n" );
}
}
$maintClass = "ResetUserTokens";
-require_once( RUN_MAINTENANCE_IF_MAIN );
+require_once RUN_MAINTENANCE_IF_MAIN;
diff --git a/maintenance/rollbackEdits.php b/maintenance/rollbackEdits.php
index 4660bcef..e5e33c02 100644
--- a/maintenance/rollbackEdits.php
+++ b/maintenance/rollbackEdits.php
@@ -22,7 +22,7 @@
* @ingroup Maintenance
*/
-require_once( __DIR__ . '/Maintenance.php' );
+require_once __DIR__ . '/Maintenance.php';
/**
* Maintenance script to rollback all edits by a given user or IP provided
@@ -104,4 +104,4 @@ class RollbackEdits extends Maintenance {
}
$maintClass = 'RollbackEdits';
-require_once( RUN_MAINTENANCE_IF_MAIN );
+require_once RUN_MAINTENANCE_IF_MAIN;
diff --git a/maintenance/runBatchedQuery.php b/maintenance/runBatchedQuery.php
index e1139164..93ba24a9 100644
--- a/maintenance/runBatchedQuery.php
+++ b/maintenance/runBatchedQuery.php
@@ -23,7 +23,7 @@
* @ingroup Maintenance
*/
-require_once( __DIR__ . '/Maintenance.php' );
+require_once __DIR__ . '/Maintenance.php';
/**
* Maintenance script to run a database query in batches and wait for slaves.
@@ -38,8 +38,9 @@ class BatchedQueryRunner extends Maintenance {
}
public function execute() {
- if ( !$this->hasArg() )
+ if ( !$this->hasArg() ) {
$this->error( "No query specified. Specify the query as a command line parameter.", true );
+ }
$query = $this->getArg();
$n = 1;
@@ -61,4 +62,4 @@ class BatchedQueryRunner extends Maintenance {
$maintClass = "BatchedQueryRunner";
-require_once( RUN_MAINTENANCE_IF_MAIN );
+require_once RUN_MAINTENANCE_IF_MAIN;
diff --git a/maintenance/runJobs.php b/maintenance/runJobs.php
index b1be714c..429edf42 100644
--- a/maintenance/runJobs.php
+++ b/maintenance/runJobs.php
@@ -25,7 +25,7 @@
* @ingroup Maintenance
*/
-require_once( __DIR__ . '/Maintenance.php' );
+require_once __DIR__ . '/Maintenance.php';
/**
* Maintenance script that runs pending jobs.
@@ -61,10 +61,11 @@ class RunJobs extends Maintenance {
$procs = intval( $this->getOption( 'procs' ) );
if ( $procs < 1 || $procs > 1000 ) {
$this->error( "Invalid argument to --procs", true );
- }
- $fc = new ForkController( $procs );
- if ( $fc->start() != 'child' ) {
- exit( 0 );
+ } elseif ( $procs != 1 ) {
+ $fc = new ForkController( $procs );
+ if ( $fc->start() != 'child' ) {
+ exit( 0 );
+ }
}
}
$maxJobs = $this->getOption( 'maxjobs', false );
@@ -72,7 +73,6 @@ class RunJobs extends Maintenance {
$startTime = time();
$type = $this->getOption( 'type', false );
$wgTitle = Title::newFromText( 'RunJobs.php' );
- $dbw = wfGetDB( DB_MASTER );
$jobsRun = 0; // counter
$group = JobQueueGroup::singleton();
@@ -82,16 +82,20 @@ class RunJobs extends Maintenance {
$this->runJobsLog( "Executed $count periodic queue task(s)." );
}
- $lastTime = time();
+ $flags = JobQueueGroup::USE_CACHE | JobQueueGroup::USE_PRIORITY;
+ $lastTime = time(); // time since last slave check
do {
$job = ( $type === false )
- ? $group->pop( JobQueueGroup::TYPE_DEFAULT, JobQueueGroup::USE_CACHE )
+ ? $group->pop( JobQueueGroup::TYPE_DEFAULT, $flags )
: $group->pop( $type ); // job from a single queue
if ( $job ) { // found a job
++$jobsRun;
$this->runJobsLog( $job->toString() . " STARTING" );
+ // Set timer to stop the job if too much CPU time is used
+ set_time_limit( $maxTime ?: 0 );
// Run the job...
+ wfProfileIn( __METHOD__ . '-' . get_class( $job ) );
$t = microtime( true );
try {
$status = $job->run();
@@ -99,15 +103,19 @@ class RunJobs extends Maintenance {
} catch ( MWException $e ) {
$status = false;
$error = get_class( $e ) . ': ' . $e->getMessage();
+ $e->report(); // write error to STDERR and the log
}
$timeMs = intval( ( microtime( true ) - $t ) * 1000 );
+ wfProfileOut( __METHOD__ . '-' . get_class( $job ) );
+ // Disable the timer
+ set_time_limit( 0 );
// Mark the job as done on success or when the job cannot be retried
if ( $status !== false || !$job->allowRetries() ) {
$group->ack( $job ); // done
}
- if ( !$status ) {
+ if ( $status === false ) {
$this->runJobsLog( $job->toString() . " t=$timeMs error={$error}" );
} else {
$this->runJobsLog( $job->toString() . " t=$timeMs good" );
@@ -124,16 +132,42 @@ class RunJobs extends Maintenance {
$timePassed = time() - $lastTime;
if ( $timePassed >= 5 || $timePassed < 0 ) {
wfWaitForSlaves();
+ $lastTime = time();
}
// Don't let any queue slaves/backups fall behind
if ( $jobsRun > 0 && ( $jobsRun % 100 ) == 0 ) {
$group->waitForBackups();
}
+
+ // Bail if near-OOM instead of in a job
+ $this->assertMemoryOK();
}
} while ( $job ); // stop when there are no jobs
}
/**
+ * Make sure that this script is not too close to the memory usage limit
+ * @throws MWException
+ */
+ private function assertMemoryOK() {
+ static $maxBytes = null;
+ if ( $maxBytes === null ) {
+ $m = array();
+ if ( preg_match( '!^(\d+)(k|m|g|)$!i', ini_get( 'memory_limit' ), $m ) ) {
+ list( , $num, $unit ) = $m;
+ $conv = array( 'g' => 1024 * 1024 * 1024, 'm' => 1024 * 1024, 'k' => 1024, '' => 1 );
+ $maxBytes = $num * $conv[strtolower( $unit )];
+ } else {
+ $maxBytes = 0;
+ }
+ }
+ $usedBytes = memory_get_usage();
+ if ( $maxBytes && $usedBytes >= 0.95 * $maxBytes ) {
+ throw new MWException( "Detected excessive memory usage ($usedBytes/$maxBytes)." );
+ }
+ }
+
+ /**
* Log the job message
* @param $msg String The message to log
*/
@@ -144,4 +178,4 @@ class RunJobs extends Maintenance {
}
$maintClass = "RunJobs";
-require_once( RUN_MAINTENANCE_IF_MAIN );
+require_once RUN_MAINTENANCE_IF_MAIN;
diff --git a/maintenance/showCacheStats.php b/maintenance/showCacheStats.php
index 8f238680..cd9768d4 100644
--- a/maintenance/showCacheStats.php
+++ b/maintenance/showCacheStats.php
@@ -21,7 +21,7 @@
* @ingroup Maintenance
*/
-require_once( __DIR__ . '/Maintenance.php' );
+require_once __DIR__ . '/Maintenance.php';
/**
* Maintenance script that shows statistics from the cache.
@@ -103,4 +103,4 @@ class ShowCacheStats extends Maintenance {
}
$maintClass = "ShowCacheStats";
-require_once( RUN_MAINTENANCE_IF_MAIN );
+require_once RUN_MAINTENANCE_IF_MAIN;
diff --git a/maintenance/showJobs.php b/maintenance/showJobs.php
index 8b49517f..afd7c745 100644
--- a/maintenance/showJobs.php
+++ b/maintenance/showJobs.php
@@ -25,7 +25,7 @@
* @author Antoine Musso
*/
-require_once( __DIR__ . '/Maintenance.php' );
+require_once __DIR__ . '/Maintenance.php';
/**
* Maintenance script that reports the number of jobs currently waiting
@@ -38,17 +38,33 @@ class ShowJobs extends Maintenance {
parent::__construct();
$this->mDescription = "Show number of jobs waiting in master database";
$this->addOption( 'group', 'Show number of jobs per job type' );
+ $this->addOption( 'list', 'Show a complete list of all jobs in a machine-readable format, instead of statistics' );
}
public function execute() {
$group = JobQueueGroup::singleton();
- if ( $this->hasOption( 'group' ) ) {
+ if ( $this->hasOption( 'list' ) ) {
foreach ( $group->getQueueTypes() as $type ) {
- $queue = $group->get( $type );
+ $queue = $group->get( $type );
+ foreach ( $queue->getAllQueuedJobs() as $job ) {
+ $this->output( $job->toString() . " status=unclaimed\n" );
+ }
+ foreach ( $queue->getAllDelayedJobs() as $job ) {
+ $this->output( $job->toString() . " status=delayed\n" );
+ }
+ }
+ } elseif ( $this->hasOption( 'group' ) ) {
+ foreach ( $group->getQueueTypes() as $type ) {
+ $queue = $group->get( $type );
$pending = $queue->getSize();
$claimed = $queue->getAcquiredCount();
+ $abandoned = $queue->getAbandonedCount();
+ $active = max( 0, $claimed - $abandoned );
if ( ( $pending + $claimed ) > 0 ) {
- $this->output( "{$type}: $pending queued; $claimed acquired\n" );
+ $this->output(
+ "{$type}: $pending queued; " .
+ "$claimed claimed ($active active, $abandoned abandoned)\n"
+ );
}
}
} else {
@@ -62,4 +78,4 @@ class ShowJobs extends Maintenance {
}
$maintClass = "ShowJobs";
-require_once( RUN_MAINTENANCE_IF_MAIN );
+require_once RUN_MAINTENANCE_IF_MAIN;
diff --git a/maintenance/showSiteStats.php b/maintenance/showSiteStats.php
index e7359b2f..49148b33 100644
--- a/maintenance/showSiteStats.php
+++ b/maintenance/showSiteStats.php
@@ -29,7 +29,7 @@
* @license GNU General Public License 2.0 or later
*/
-require_once( __DIR__ . '/Maintenance.php' );
+require_once __DIR__ . '/Maintenance.php';
/**
* Maintenance script to show the cached statistics.
@@ -48,6 +48,7 @@ class ShowSiteStats extends Maintenance {
'ss_good_articles' => 'Number of articles',
'ss_total_pages' => 'Total pages',
'ss_users' => 'Number of users',
+ 'ss_active_users' => 'Active users',
'ss_images' => 'Number of images',
);
@@ -59,7 +60,7 @@ class ShowSiteStats extends Maintenance {
$max_length_value = $max_length_desc = 0;
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
@@ -70,4 +71,4 @@ class ShowSiteStats extends Maintenance {
}
$maintClass = "ShowSiteStats";
-require_once( RUN_MAINTENANCE_IF_MAIN );
+require_once RUN_MAINTENANCE_IF_MAIN;
diff --git a/maintenance/sql.php b/maintenance/sql.php
index 11699909..a628b0bc 100644
--- a/maintenance/sql.php
+++ b/maintenance/sql.php
@@ -22,7 +22,7 @@
* @ingroup Maintenance
*/
-require_once( __DIR__ . '/Maintenance.php' );
+require_once __DIR__ . '/Maintenance.php';
/**
* Maintenance script that sends SQL queries from the specified file to the database.
@@ -34,16 +34,42 @@ class MwSql extends Maintenance {
parent::__construct();
$this->mDescription = "Send SQL queries to a MediaWiki database";
$this->addOption( 'cluster', 'Use an external cluster by name', false, true );
+ $this->addOption( 'slave', 'Use a slave server (either "any" or by name)', false, true );
}
public function execute() {
- // Get a DB handle (with this wiki's DB select) from the appropriate load balancer
+ // Get the appropriate load balancer (for this wiki)
if ( $this->hasOption( 'cluster' ) ) {
$lb = wfGetLBFactory()->getExternalLB( $this->getOption( 'cluster' ) );
- $dbw = $lb->getConnection( DB_MASTER ); // master for external LB
} else {
- $dbw = wfGetDB( DB_MASTER ); // master for primary LB for this wiki
+ $lb = wfGetLB();
}
+ // Figure out which server to use
+ if ( $this->hasOption( 'slave' ) ) {
+ $server = $this->getOption( 'slave' );
+ if ( $server === 'any' ) {
+ $index = DB_SLAVE;
+ } else {
+ $index = null;
+ for ( $i = 0; $i < $lb->getServerCount(); ++$i ) {
+ if ( $lb->getServerName( $i ) === $server ) {
+ $index = $i;
+ break;
+ }
+ }
+ if ( $index === null ) {
+ $this->error( "No slave server configured with the name '$server'.", 1 );
+ }
+ }
+ } else {
+ $index = DB_MASTER;
+ }
+ // Get a DB handle (with this wiki's DB selected) from the appropriate load balancer
+ $dbw = $lb->getConnection( $index );
+ if ( $this->hasOption( 'slave' ) && $dbw->getLBInfo( 'master' ) !== null ) {
+ $this->error( "The server selected ({$dbw->getServer()}) is not a slave.", 1 );
+ }
+
if ( $this->hasArg( 0 ) ) {
$file = fopen( $this->getArg( 0 ), 'r' );
if ( !$file ) {
@@ -70,9 +96,9 @@ class MwSql extends Maintenance {
$wholeLine = '';
$newPrompt = '> ';
- $prompt = $newPrompt;
+ $prompt = $newPrompt;
while ( ( $line = Maintenance::readconsole( $prompt ) ) !== false ) {
- if( !$line ) {
+ if ( !$line ) {
# User simply pressed return key
continue;
}
@@ -91,12 +117,12 @@ class MwSql extends Maintenance {
readline_add_history( $wholeLine . $dbw->getDelimiter() );
readline_write_history( $historyFile );
}
- try{
+ try {
$res = $dbw->query( $wholeLine );
$this->sqlPrintResult( $res, $dbw );
- $prompt = $newPrompt;
+ $prompt = $newPrompt;
$wholeLine = '';
- } catch (DBQueryError $e) {
+ } catch ( DBQueryError $e ) {
$doDie = ! Maintenance::posix_isatty( 0 );
$this->error( $e, $doDie );
}
@@ -132,4 +158,4 @@ class MwSql extends Maintenance {
}
$maintClass = "MwSql";
-require_once( RUN_MAINTENANCE_IF_MAIN );
+require_once RUN_MAINTENANCE_IF_MAIN;
diff --git a/maintenance/sqlite.inc b/maintenance/sqlite.inc
index 16568ac7..08188cad 100644
--- a/maintenance/sqlite.inc
+++ b/maintenance/sqlite.inc
@@ -33,10 +33,7 @@ class Sqlite {
* @return bool
*/
public static function isPresent() {
- wfSuppressWarnings();
- $compiled = wfDl( 'pdo_sqlite' );
- wfRestoreWarnings();
- return $compiled;
+ return extension_loaded( 'pdo_sqlite' );
}
/**
@@ -73,7 +70,9 @@ class Sqlite {
$tables = $db->query( "SELECT name FROM sqlite_master WHERE type='table'", __METHOD__ );
foreach ( $tables as $table ) {
- if ( strpos( $table->name, 'sqlite_' ) === 0 ) continue;
+ if ( strpos( $table->name, 'sqlite_' ) === 0 ) {
+ continue;
+ }
$columns = $db->query( "PRAGMA table_info({$table->name})", __METHOD__ );
foreach ( $columns as $col ) {
@@ -89,4 +88,4 @@ class Sqlite {
$db->close();
return true;
}
- };
+};
diff --git a/maintenance/sqlite.php b/maintenance/sqlite.php
index 4085c59b..8a785245 100644
--- a/maintenance/sqlite.php
+++ b/maintenance/sqlite.php
@@ -21,7 +21,7 @@
* @ingroup Maintenance
*/
-require_once( __DIR__ . '/Maintenance.php' );
+require_once __DIR__ . '/Maintenance.php';
/**
* Maintenance script that performs some operations specific to SQLite database backend.
@@ -137,4 +137,4 @@ class SqliteMaintenance extends Maintenance {
}
$maintClass = "SqliteMaintenance";
-require_once( RUN_MAINTENANCE_IF_MAIN );
+require_once RUN_MAINTENANCE_IF_MAIN;
diff --git a/maintenance/sqlite/archives/initial-indexes.sql b/maintenance/sqlite/archives/initial-indexes.sql
index 73b008cc..1a59be5a 100644
--- a/maintenance/sqlite/archives/initial-indexes.sql
+++ b/maintenance/sqlite/archives/initial-indexes.sql
@@ -28,6 +28,8 @@ DROP TABLE IF EXISTS /*_*/interwiki_tmp;
DROP TABLE IF EXISTS /*_*/page_restrictions_tmp;
DROP TABLE IF EXISTS /*_*/protected_titles_tmp;
DROP TABLE IF EXISTS /*_*/page_props_tmp;
+DROP TABLE IF EXISTS /*_*/archive_tmp;
+DROP TABLE IF EXISTS /*_*/externallinks_tmp;
--------------------------------------------------------------------------------
-- Create new tables
@@ -268,6 +270,47 @@ CREATE TABLE /*_*/page_props_tmp (
);
CREATE UNIQUE INDEX /*i*/pp_page_propname ON /*_*/page_props_tmp (pp_page,pp_propname);
+--
+-- 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_tmp (
+ ar_id NOT NULL PRIMARY KEY clustered IDENTITY,
+ 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_tmp(ar_namespace,ar_title,ar_timestamp);
+CREATE INDEX /*$wgDBprefix*/ar_usertext_timestamp ON /*$wgDBprefix*/archive_tmp(ar_user_text,ar_timestamp);
+CREATE INDEX /*$wgDBprefix*/ar_user_text ON /*$wgDBprefix*/archive_tmp(ar_user_text);
+
+--
+-- Track links to external URLs
+-- IE >= 4 supports no more than 2083 characters in a URL
+CREATE TABLE /*$wgDBprefix*/externallinks_tmp (
+ el_id INT NOT NULL PRIMARY KEY clustered IDENTITY,
+ 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_tmp(el_index);
+
--------------------------------------------------------------------------------
-- Populate the new tables using INSERT SELECT
--------------------------------------------------------------------------------
@@ -290,6 +333,8 @@ INSERT OR IGNORE INTO /*_*/interwiki_tmp SELECT * FROM /*_*/interwiki;
INSERT OR IGNORE INTO /*_*/page_restrictions_tmp SELECT * FROM /*_*/page_restrictions;
INSERT OR IGNORE INTO /*_*/protected_titles_tmp SELECT * FROM /*_*/protected_titles;
INSERT OR IGNORE INTO /*_*/page_props_tmp SELECT * FROM /*_*/page_props;
+INSERT OR IGNORE INTO /*_*/archive_tmp SELECT * FROM /*_*/archive;
+INSERT OR IGNORE INTO /*_*/externallinks_tmp SELECT * FROM /*_*/externallinks;
--------------------------------------------------------------------------------
-- Do the table renames
@@ -331,6 +376,10 @@ DROP TABLE /*_*/protected_titles;
ALTER TABLE /*_*/protected_titles_tmp RENAME TO /*_*/protected_titles;
DROP TABLE /*_*/page_props;
ALTER TABLE /*_*/page_props_tmp RENAME TO /*_*/page_props;
+DROP TABLE /*_*/archive;
+ALTER TABLE /*_*/archive_tmp RENAME TO /*_*/archive;
+DROP TABLE /*_*/externalllinks;
+ALTER TABLE /*_*/externallinks_tmp RENAME TO /*_*/externallinks;
--------------------------------------------------------------------------------
-- Drop and create tables with unique indexes but no valuable data
diff --git a/maintenance/sqlite/archives/patch-archive-ar_id.sql b/maintenance/sqlite/archives/patch-archive-ar_id.sql
new file mode 100644
index 00000000..00a9b071
--- /dev/null
+++ b/maintenance/sqlite/archives/patch-archive-ar_id.sql
@@ -0,0 +1,39 @@
+DROP TABLE IF EXISTS /*_*/archive_tmp;
+
+CREATE TABLE /*$wgDBprefix*/archive_tmp (
+ ar_id int unsigned NOT NULL PRIMARY KEY AUTO_INCREMENT,
+ ar_namespace int NOT NULL default 0,
+ ar_title varchar(255) binary NOT NULL default '',
+ ar_text mediumblob NOT NULL,
+ 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,
+ ar_flags tinyblob NOT NULL,
+ ar_rev_id int unsigned,
+ ar_text_id int unsigned,
+ ar_deleted tinyint unsigned NOT NULL default 0,
+ ar_len int unsigned,
+ ar_page_id int unsigned,
+ ar_parent_id int unsigned default NULL,
+ ar_sha1 varbinary(32) NOT NULL default '',
+ ar_content_model varbinary(32) DEFAULT NULL,
+ ar_content_format varbinary(64) DEFAULT NULL
+);
+
+INSERT OR IGNORE INTO /*_*/archive_tmp (
+ ar_namespace, ar_title, ar_title, ar_text, ar_comment, ar_user, ar_user_text, ar_timestamp,
+ ar_minor_edit, ar_flags, ar_rev_id, ar_text_id, ar_deleted, ar_len, ar_page_id, ar_parent_id )
+ SELECT
+ ar_namespace, ar_title, ar_title, ar_text, ar_comment, ar_user, ar_user_text, ar_timestamp,
+ ar_minor_edit, ar_flags, ar_rev_id, ar_text_id, ar_deleted, ar_len, ar_page_id, ar_parent_id
+ FROM /*_*/archive;
+
+DROP TABLE /*_*/archive;
+
+ALTER TABLE /*_*/archive_tmp RENAME TO /*_*/archive;
+
+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);
diff --git a/maintenance/sqlite/archives/patch-externallinks-el_id.sql b/maintenance/sqlite/archives/patch-externallinks-el_id.sql
new file mode 100644
index 00000000..0aad4071
--- /dev/null
+++ b/maintenance/sqlite/archives/patch-externallinks-el_id.sql
@@ -0,0 +1,19 @@
+DROP TABLE IF EXISTS /*_*/externallinks_tmp;
+
+CREATE TABLE /*$wgDBprefix*/externallinks_tmp (
+ el_id int unsigned NOT NULL PRIMARY KEY AUTO_INCREMENT,
+ el_from int unsigned NOT NULL default 0,
+ el_to blob NOT NULL,
+ el_index blob NOT NULL
+);
+
+INSERT OR IGNORE INTO /*_*/externallinks_tmp (el_from, el_to, el_index) SELECT
+ el_from, el_to, el_index FROM /*_*/externallinks;
+
+DROP TABLE /*_*/externallinks;
+
+ALTER TABLE /*_*/externallinks_tmp RENAME TO /*_*/externallinks;
+
+CREATE INDEX /*i*/el_from ON /*_*/externallinks (el_from, el_to(40));
+CREATE INDEX /*i*/el_to ON /*_*/externallinks (el_to(60), el_from);
+CREATE INDEX /*i*/el_index ON /*_*/externallinks (el_index(60)); \ 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
deleted file mode 100644
index 8fc4b5cd..00000000
--- a/maintenance/sqlite/archives/patch-kill-iwl_pft.sql
+++ /dev/null
@@ -1,7 +0,0 @@
---
--- 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-rename-iwl_prefix.sql b/maintenance/sqlite/archives/patch-rename-iwl_prefix.sql
index fd4c9ec7..6d5b1bfa 100644
--- a/maintenance/sqlite/archives/patch-rename-iwl_prefix.sql
+++ b/maintenance/sqlite/archives/patch-rename-iwl_prefix.sql
@@ -2,4 +2,4 @@
-- Recreates the iwl_prefix for the iwlinks table
--
DROP INDEX IF EXISTS /*i*/iwl_prefix;
-CREATE INDEX IF NOT EXISTS /*i*/iwl_prefix_from_title ON /*_*/iwlinks (iwl_prefix, iwl_from, iwl_title);
+CREATE INDEX IF NOT EXISTS /*i*/iwl_prefix_title_from ON /*_*/iwlinks (iwl_prefix, iwl_title, iwl_from);
diff --git a/maintenance/storage/checkStorage.php b/maintenance/storage/checkStorage.php
index fd9393f2..03dc113a 100644
--- a/maintenance/storage/checkStorage.php
+++ b/maintenance/storage/checkStorage.php
@@ -22,7 +22,7 @@
*/
if ( !defined( 'MEDIAWIKI' ) ) {
- require_once( __DIR__ . '/../commandLine.inc' );
+ require_once __DIR__ . '/../commandLine.inc';
$cs = new CheckStorage;
$fix = isset( $options['fix'] );
@@ -75,7 +75,7 @@ class CheckStorage {
'fixable' => array(),
);
- for ( $chunkStart = 1 ; $chunkStart < $maxRevId; $chunkStart += $chunkSize ) {
+ for ( $chunkStart = 1; $chunkStart < $maxRevId; $chunkStart += $chunkSize ) {
$chunkEnd = $chunkStart + $chunkSize - 1;
// print "$chunkStart of $maxRevId\n";
@@ -443,18 +443,26 @@ class CheckStorage {
function importRevision( &$revision, &$importer ) {
$id = $revision->getID();
- $text = $revision->getText();
+ $content = $revision->getContent( Revision::RAW );
+ $id = $id ? $id : '';
+
+ if ( $content === null ) {
+ echo "Revision $id is broken, we have no content available\n";
+ return;
+ }
+
+ $text = $content->serialize();
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
// 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 : '';
+
echo "Revision $id is blank in the dump, may have been broken before export\n";
return;
}
- if ( !$id ) {
+ if ( !$id ) {
// No ID, can't import
echo "No id tag in revision, can't import\n";
return;
diff --git a/maintenance/storage/compressOld.php b/maintenance/storage/compressOld.php
index d6362834..8cb55487 100644
--- a/maintenance/storage/compressOld.php
+++ b/maintenance/storage/compressOld.php
@@ -41,7 +41,7 @@
* @ingroup Maintenance ExternalStorage
*/
-require_once( __DIR__ . '/../Maintenance.php' );
+require_once __DIR__ . '/../Maintenance.php';
/**
* Maintenance script that compress the text of a wiki.
@@ -53,7 +53,7 @@ class CompressOld extends Maintenance {
* @todo document
*/
const LS_INDIVIDUAL = 0;
- const LS_CHUNKED = 1;
+ const LS_CHUNKED = 1;
public function __construct() {
parent::__construct();
@@ -113,9 +113,9 @@ class CompressOld extends Maintenance {
$this->output( "Starting from old_id $start...\n" );
$dbw = wfGetDB( DB_MASTER );
do {
- $res = $dbw->select( 'text', array( 'old_id','old_flags','old_text' ),
+ $res = $dbw->select( 'text', array( 'old_id', 'old_flags', 'old_text' ),
"old_id>=$start", __METHOD__, array( 'ORDER BY' => 'old_id', 'LIMIT' => $chunksize, 'FOR UPDATE' ) );
- if( $res->numRows() == 0 ) {
+ if ( $res->numRows() == 0 ) {
break;
}
$last = $start;
@@ -126,7 +126,7 @@ class CompressOld extends Maintenance {
}
$start = $last + 1; # Deletion may leave long empty stretches
$this->output( "$start...\n" );
- } while( true );
+ } while ( true );
}
/**
@@ -223,7 +223,7 @@ class CompressOld extends Maintenance {
}
$conds[] = "rev_timestamp>'" . $beginDate . "'";
}
- if ( $endDate ) {
+ if ( $endDate ) {
if ( !preg_match( '/^\d{14}$/', $endDate ) ) {
$this->error( "Invalid end date \"$endDate\"\n" );
return false;
@@ -254,8 +254,8 @@ class CompressOld extends Maintenance {
# Get the page row
$pageRes = $dbr->select( 'page',
- array('page_id', 'page_namespace', 'page_title','page_latest'),
- $pageConds + array('page_id' => $pageId), __METHOD__ );
+ array( 'page_id', 'page_namespace', 'page_title', 'page_latest' ),
+ $pageConds + array( 'page_id' => $pageId ), __METHOD__ );
if ( $pageRes->numRows() == 0 ) {
continue;
}
@@ -282,7 +282,7 @@ class CompressOld extends Maintenance {
$revs[] = $revRow;
}
- if ( count( $revs ) < 2) {
+ if ( count( $revs ) < 2 ) {
# No revisions matching, no further processing
$this->output( "\n" );
continue;
@@ -351,21 +351,22 @@ class CompressOld extends Maintenance {
if ( $extdb != "" ) {
# Move blob objects to External Storage
$stored = $storeObj->store( $extdb, serialize( $chunk ));
- if ($stored === false) {
- $this->error( "Unable to store object" );
+ if ( $stored === false ) {
+ $this->error( "Unable to store object" );
return false;
}
# Store External Storage URLs instead of Stub placeholders
- foreach ($stubs as $stub) {
- if ($stub===false)
+ foreach ( $stubs as $stub ) {
+ if ( $stub === false ) {
continue;
+ }
# $stored should provide base path to a BLOB
- $url = $stored."/".$stub->getHash();
+ $url = $stored . "/" . $stub->getHash();
$dbw->update( 'text',
array( /* SET */
'old_text' => $url,
'old_flags' => 'external,utf-8',
- ), array ( /* WHERE */
+ ), array( /* WHERE */
'old_id' => $stub->getReferrer(),
)
);
@@ -387,7 +388,7 @@ class CompressOld extends Maintenance {
if ( $stubs[$j] !== false && $revs[$i + $j]->rev_text_id != $primaryOldid ) {
$dbw->update( 'text',
array( /* SET */
- 'old_text' => serialize($stubs[$j]),
+ 'old_text' => serialize( $stubs[$j] ),
'old_flags' => 'object,utf-8',
), array( /* WHERE */
'old_id' => $revs[$i + $j]->rev_text_id
@@ -411,4 +412,4 @@ class CompressOld extends Maintenance {
}
$maintClass = 'CompressOld';
-require_once( RUN_MAINTENANCE_IF_MAIN );
+require_once RUN_MAINTENANCE_IF_MAIN;
diff --git a/maintenance/storage/dumpRev.php b/maintenance/storage/dumpRev.php
index 39f08f9d..f12bbd1b 100644
--- a/maintenance/storage/dumpRev.php
+++ b/maintenance/storage/dumpRev.php
@@ -21,7 +21,7 @@
* @ingroup Maintenance ExternalStorage
*/
-require_once( __DIR__ . '/../Maintenance.php' );
+require_once __DIR__ . '/../Maintenance.php';
/**
* Maintenance script that gets the text of a revision,
@@ -46,7 +46,7 @@ class DumpRev extends Maintenance {
$this->error( "Row not found", true );
}
- $flags = explode( ',', $row->old_flags );
+ $flags = explode( ',', $row->old_flags );
$text = $row->old_text;
if ( in_array( 'external', $flags ) ) {
$this->output( "External $text\n" );
@@ -85,4 +85,4 @@ class DumpRev extends Maintenance {
}
$maintClass = "DumpRev";
-require_once( RUN_MAINTENANCE_IF_MAIN );
+require_once RUN_MAINTENANCE_IF_MAIN;
diff --git a/maintenance/storage/fixBug20757.php b/maintenance/storage/fixBug20757.php
index 30cbcf1a..101aa068 100644
--- a/maintenance/storage/fixBug20757.php
+++ b/maintenance/storage/fixBug20757.php
@@ -21,7 +21,7 @@
* @ingroup Maintenance ExternalStorage
*/
-require_once( __DIR__ . '/../Maintenance.php' );
+require_once __DIR__ . '/../Maintenance.php';
/**
* Maintenance script to fix bug 20757.
@@ -348,4 +348,4 @@ class FixBug20757 extends Maintenance {
}
$maintClass = 'FixBug20757';
-require_once( RUN_MAINTENANCE_IF_MAIN );
+require_once RUN_MAINTENANCE_IF_MAIN;
diff --git a/maintenance/storage/moveToExternal.php b/maintenance/storage/moveToExternal.php
index 1049e0cc..348fb773 100644
--- a/maintenance/storage/moveToExternal.php
+++ b/maintenance/storage/moveToExternal.php
@@ -24,9 +24,9 @@
define( 'REPORTING_INTERVAL', 1 );
if ( !defined( 'MEDIAWIKI' ) ) {
- require_once( __DIR__ . '/../commandLine.inc' );
- require_once( __DIR__ . '/../../includes/externalstore/ExternalStoreDB.php' );
- require_once( 'resolveStubs.php' );
+ require_once __DIR__ . '/../commandLine.inc';
+ require_once __DIR__ . '/../../includes/externalstore/ExternalStoreDB.php';
+ require_once 'resolveStubs.php';
$fname = 'moveToExternal';
diff --git a/maintenance/storage/orphanStats.php b/maintenance/storage/orphanStats.php
index 4e246287..1df1501e 100644
--- a/maintenance/storage/orphanStats.php
+++ b/maintenance/storage/orphanStats.php
@@ -21,7 +21,7 @@
* @ingroup Maintenance ExternalStorage
*/
-require_once( __DIR__ . '/../Maintenance.php' );
+require_once __DIR__ . '/../Maintenance.php';
/**
* Maintenance script that shows some statistics on the blob_orphans table,
@@ -74,4 +74,4 @@ class OrphanStats extends Maintenance {
}
$maintClass = "OrphanStats";
-require_once( RUN_MAINTENANCE_IF_MAIN );
+require_once RUN_MAINTENANCE_IF_MAIN;
diff --git a/maintenance/storage/recompressTracked.php b/maintenance/storage/recompressTracked.php
index 030a147e..b2663165 100644
--- a/maintenance/storage/recompressTracked.php
+++ b/maintenance/storage/recompressTracked.php
@@ -23,7 +23,7 @@
*/
$optionsWithArgs = RecompressTracked::getOptionsWithArgs();
-require( __DIR__ . '/../commandLine.inc' );
+require __DIR__ . '/../commandLine.inc';
if ( count( $args ) < 1 ) {
echo "Usage: php recompressTracked.php [options] <cluster> [... <cluster>...]
@@ -279,7 +279,7 @@ class RecompressTracked {
*/
function dispatchToSlave( $slaveId, $args ) {
$args = (array)$args;
- $cmd = implode( ' ', $args );
+ $cmd = implode( ' ', $args );
fwrite( $this->slavePipes[$slaveId], "$cmd\n" );
}
diff --git a/maintenance/storage/resolveStubs.php b/maintenance/storage/resolveStubs.php
index 414eab81..e47d6407 100644
--- a/maintenance/storage/resolveStubs.php
+++ b/maintenance/storage/resolveStubs.php
@@ -27,7 +27,7 @@ define( 'REPORTING_INTERVAL', 100 );
if ( !defined( 'MEDIAWIKI' ) ) {
$optionsWithArgs = array( 'm' );
- require_once( __DIR__ . '/../commandLine.inc' );
+ require_once __DIR__ . '/../commandLine.inc';
resolveStubs();
}
diff --git a/maintenance/storage/storageTypeStats.php b/maintenance/storage/storageTypeStats.php
index 3187c318..e33057f6 100644
--- a/maintenance/storage/storageTypeStats.php
+++ b/maintenance/storage/storageTypeStats.php
@@ -19,7 +19,7 @@
* @ingroup Maintenance ExternalStorage
*/
-require_once( __DIR__ . '/../Maintenance.php' );
+require_once __DIR__ . '/../Maintenance.php';
class StorageTypeStats extends Maintenance {
function execute() {
@@ -112,4 +112,4 @@ SQL;
}
$maintClass = 'StorageTypeStats';
-require_once( RUN_MAINTENANCE_IF_MAIN );
+require_once RUN_MAINTENANCE_IF_MAIN;
diff --git a/maintenance/storage/testCompression.php b/maintenance/storage/testCompression.php
index e13e1b10..fdc28d9b 100644
--- a/maintenance/storage/testCompression.php
+++ b/maintenance/storage/testCompression.php
@@ -22,7 +22,7 @@
*/
$optionsWithArgs = array( 'start', 'limit', 'type' );
-require( __DIR__ . '/../commandLine.inc' );
+require __DIR__ . '/../commandLine.inc';
if ( !isset( $args[0] ) ) {
echo "Usage: php testCompression.php [--type=<type>] [--start=<start-date>] [--limit=<num-revs>] <page-title>\n";
diff --git a/maintenance/storage/trackBlobs.php b/maintenance/storage/trackBlobs.php
index 2f3c8c6a..7857dd95 100644
--- a/maintenance/storage/trackBlobs.php
+++ b/maintenance/storage/trackBlobs.php
@@ -22,7 +22,7 @@
* @see wfWaitForSlaves()
*/
-require( __DIR__ . '/../commandLine.inc' );
+require __DIR__ . '/../commandLine.inc';
if ( count( $args ) < 1 ) {
diff --git a/maintenance/syncFileBackend.php b/maintenance/syncFileBackend.php
index 158019b7..f0be709f 100644
--- a/maintenance/syncFileBackend.php
+++ b/maintenance/syncFileBackend.php
@@ -21,7 +21,7 @@
* @ingroup Maintenance
*/
-require_once( __DIR__ . '/Maintenance.php' );
+require_once __DIR__ . '/Maintenance.php';
/**
* Maintenance script that syncs one file backend to another based on
@@ -40,6 +40,7 @@ class SyncFileBackend extends Maintenance {
$this->addOption( 'posdir', 'Directory to read/record journal positions', false, true );
$this->addOption( 'posdump', 'Just dump current journal position into the position dir.' );
$this->addOption( 'postime', 'For position dumps, get the ID at this time', false, true );
+ $this->addOption( 'backoff', 'Stop at entries younger than this age (sec).', false, true );
$this->addOption( 'verbose', 'Verbose mode', false, false, 'v' );
$this->setBatchSize( 50 );
}
@@ -88,7 +89,13 @@ class SyncFileBackend extends Maintenance {
} else {
$startFromPosFile = false;
}
- $end = $this->getOption( 'end', INF );
+
+ if ( $this->hasOption( 'backoff' ) ) {
+ $time = time() - $this->getOption( 'backoff', 0 );
+ $end = (int)$src->getJournal()->getPositionAtTime( $time );
+ } else {
+ $end = $this->getOption( 'end', INF );
+ }
$this->output( "Synchronizing backend '{$dst->getName()}' to '{$src->getName()}'...\n" );
$this->output( "Starting journal position is $start.\n" );
@@ -289,4 +296,4 @@ class SyncFileBackend extends Maintenance {
}
$maintClass = "SyncFileBackend";
-require_once( RUN_MAINTENANCE_IF_MAIN );
+require_once RUN_MAINTENANCE_IF_MAIN;
diff --git a/maintenance/tables.sql b/maintenance/tables.sql
index 72b4eb6c..de92ef53 100644
--- a/maintenance/tables.sql
+++ b/maintenance/tables.sql
@@ -380,6 +380,8 @@ CREATE TABLE /*_*/text (
-- fields, with several caveats.
--
CREATE TABLE /*_*/archive (
+ -- Primary key
+ ar_id int unsigned NOT NULL PRIMARY KEY AUTO_INCREMENT,
ar_namespace int NOT NULL default 0,
ar_title varchar(255) binary NOT NULL default '',
@@ -445,7 +447,6 @@ CREATE TABLE /*_*/archive (
-- content format, see CONTENT_FORMAT_XXX constants
ar_content_format varbinary(64) DEFAULT NULL
-
) /*$wgDBTableOptions*/;
CREATE INDEX /*i*/name_title_timestamp ON /*_*/archive (ar_namespace,ar_title,ar_timestamp);
@@ -602,6 +603,9 @@ CREATE INDEX /*i*/cat_pages ON /*_*/category (cat_pages);
-- Track links to external URLs
--
CREATE TABLE /*_*/externallinks (
+ -- Primary key
+ el_id int unsigned NOT NULL PRIMARY KEY AUTO_INCREMENT,
+
-- page_id of the referring page
el_from int unsigned NOT NULL default 0,
@@ -626,21 +630,6 @@ CREATE INDEX /*i*/el_from ON /*_*/externallinks (el_from, el_to(40));
CREATE INDEX /*i*/el_to ON /*_*/externallinks (el_to(60), el_from);
CREATE INDEX /*i*/el_index ON /*_*/externallinks (el_index(60));
-
---
--- Track external user accounts, if ExternalAuth is used
---
-CREATE TABLE /*_*/external_user (
- -- Foreign key to user_id
- eu_local_id int unsigned NOT NULL PRIMARY KEY,
-
- -- Some opaque identifier provided by the external database
- eu_external_id varchar(255) binary NOT NULL
-) /*$wgDBTableOptions*/;
-
-CREATE UNIQUE INDEX /*i*/eu_external_id ON /*_*/external_user (eu_external_id);
-
-
--
-- Track interlanguage links
--
@@ -674,7 +663,8 @@ CREATE TABLE /*_*/iwlinks (
) /*$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);
+CREATE INDEX /*i*/iwl_prefix_title_from ON /*_*/iwlinks (iwl_prefix, iwl_title, iwl_from);
+CREATE INDEX /*i*/iwl_prefix_from_title ON /*_*/iwlinks (iwl_prefix, iwl_from, iwl_title);
--
@@ -774,6 +764,9 @@ CREATE TABLE /*_*/ipblocks (
-- Start and end of an address range, in hexadecimal
-- Size chosen to allow IPv6
+ -- FIXME: these fields were originally blank for single-IP blocks,
+ -- but now they are populated. No migration was ever done. They
+ -- should be fixed to be blank again for such blocks (bug 49504).
ipb_range_start tinyblob NOT NULL,
ipb_range_end tinyblob NOT NULL,
@@ -821,7 +814,7 @@ CREATE TABLE /*_*/image (
img_width int NOT NULL default 0,
img_height int NOT NULL default 0,
- -- Extracted EXIF metadata stored as a serialized PHP array.
+ -- Extracted Exif metadata stored as a serialized PHP array.
img_metadata mediumblob NOT NULL,
-- For images, bits per pixel if known.
@@ -1066,7 +1059,7 @@ CREATE TABLE /*_*/recentchanges (
-- rev_id of the prior revision, for generating diff links.
rc_last_oldid int unsigned NOT NULL default 0,
- -- The type of change entry (RC_EDIT,RC_NEW,RC_LOG)
+ -- The type of change entry (RC_EDIT,RC_NEW,RC_LOG,RC_EXTERNAL)
rc_type tinyint unsigned NOT NULL default 0,
-- If the Recent Changes Patrol option is enabled,
@@ -1087,7 +1080,7 @@ CREATE TABLE /*_*/recentchanges (
-- Visibility of recent changes items, bitfield
rc_deleted tinyint unsigned NOT NULL default 0,
- -- Value corresonding to log_id, specific log entries
+ -- Value corresponding to log_id, specific log entries
rc_logid int unsigned NOT NULL default 0,
-- Store log type info here, or null
rc_log_type varbinary(255) NULL default NULL,
@@ -1143,7 +1136,7 @@ CREATE TABLE /*_*/searchindex (
-- Munged version of body text
si_text mediumtext NOT NULL
-) ENGINE=MyISAM;
+) ENGINE=MyISAM DEFAULT CHARSET=utf8;
CREATE UNIQUE INDEX /*i*/si_page ON /*_*/searchindex (si_page);
CREATE FULLTEXT INDEX /*i*/si_title ON /*_*/searchindex (si_title);
diff --git a/maintenance/tidyUpBug37714.php b/maintenance/tidyUpBug37714.php
new file mode 100644
index 00000000..1ad9c7ee
--- /dev/null
+++ b/maintenance/tidyUpBug37714.php
@@ -0,0 +1,49 @@
+<?php
+require_once __DIR__ . '/Maintenance.php';
+
+/**
+ * Fixes all rows affected by https://bugzilla.wikimedia.org/show_bug.cgi?id=37714
+ */
+class TidyUpBug37714 extends Maintenance {
+ public function execute() {
+ // Search for all log entries which are about changing the visability of other log entries.
+ $result = wfGetDB( DB_SLAVE )->select(
+ 'logging',
+ array( 'log_id', 'log_params' ),
+ array(
+ 'log_type' => array( 'suppress', 'delete' ),
+ 'log_action' => 'event',
+ 'log_namespace' => NS_SPECIAL,
+ 'log_title' => SpecialPage::getTitleFor( 'Log' )->getText()
+ ),
+ __METHOD__
+ );
+
+ foreach ( $result as $row ) {
+ $paramLines = explode( "\n", $row->log_params );
+ $ids = explode( ',', $paramLines[0] ); // Array dereferencing is PHP >= 5.4 :(
+ $result = wfGetDB( DB_SLAVE )->select( // Work out what log entries were changed here.
+ 'logging',
+ 'log_type',
+ array( 'log_id' => $ids ),
+ __METHOD__,
+ 'DISTINCT'
+ );
+ if ( $result->numRows() === 1 ) {
+ // If there's only one type, the target title can be set to include it.
+ $logTitle = SpecialPage::getTitleFor( 'Log', $result->current()->log_type )->getText();
+ $this->output( 'Set log_title to "' . $logTitle . '" for log entry ' . $row->log_id . ".\n" );
+ wfGetDB( DB_MASTER )->update(
+ 'logging',
+ array( 'log_title' => $logTitle ),
+ array( 'log_id' => $row->log_id ),
+ __METHOD__
+ );
+ wfWaitForSlaves();
+ }
+ }
+ }
+}
+
+$maintClass = 'TidyUpBug37714';
+require_once RUN_MAINTENANCE_IF_MAIN;
diff --git a/maintenance/undelete.php b/maintenance/undelete.php
index ea8b0c4b..c890c69b 100644
--- a/maintenance/undelete.php
+++ b/maintenance/undelete.php
@@ -21,7 +21,7 @@
* @ingroup Maintenance
*/
-require_once( __DIR__ . '/Maintenance.php' );
+require_once __DIR__ . '/Maintenance.php';
class Undelete extends Maintenance {
public function __construct() {
@@ -55,4 +55,4 @@ class Undelete extends Maintenance {
}
$maintClass = "Undelete";
-require_once( RUN_MAINTENANCE_IF_MAIN );
+require_once RUN_MAINTENANCE_IF_MAIN;
diff --git a/maintenance/update.php b/maintenance/update.php
index f69a9b0d..378217fd 100644
--- a/maintenance/update.php
+++ b/maintenance/update.php
@@ -26,12 +26,12 @@
*/
if ( !function_exists( 'version_compare' ) || ( version_compare( phpversion(), '5.3.2' ) < 0 ) ) {
- require( dirname( __FILE__ ) . '/../includes/PHPVersionError.php' );
+ require dirname( __FILE__ ) . '/../includes/PHPVersionError.php';
wfPHPVersionError( 'cli' );
}
$wgUseMasterForMaintenance = true;
-require_once( __DIR__ . '/Maintenance.php' );
+require_once __DIR__ . '/Maintenance.php';
/**
* Maintenance script to run database schema updates.
@@ -83,7 +83,7 @@ class UpdateMediaWiki extends Maintenance {
function execute() {
global $wgVersion, $wgTitle, $wgLang, $wgAllowSchemaUpdates;
- if( !$wgAllowSchemaUpdates && !( $this->hasOption( 'force' ) || $this->hasOption( 'schema' ) || $this->hasOption( 'noschema' ) ) ) {
+ if ( !$wgAllowSchemaUpdates && !( $this->hasOption( 'force' ) || $this->hasOption( 'schema' ) || $this->hasOption( 'noschema' ) ) ) {
$this->error( "Do not run update.php on this wiki. If you're seeing this you should\n"
. "probably ask for some help in performing your schema updates or use\n"
. "the --noschema and --schema options to get an SQL file for someone\n"
@@ -92,12 +92,12 @@ class UpdateMediaWiki extends Maintenance {
}
$this->fileHandle = null;
- if( substr( $this->getOption( 'schema' ), 0, 2 ) === "--" ) {
+ if ( substr( $this->getOption( 'schema' ), 0, 2 ) === "--" ) {
$this->error( "The --schema option requires a file as an argument.\n", true );
- } else if( $this->hasOption( 'schema' ) ) {
+ } elseif ( $this->hasOption( 'schema' ) ) {
$file = $this->getOption( 'schema' );
$this->fileHandle = fopen( $file, "w" );
- if( $this->fileHandle === false ) {
+ if ( $this->fileHandle === false ) {
$err = error_get_last();
$this->error( "Problem opening the schema file for writing: $file\n\t{$err['message']}", true );
}
@@ -122,7 +122,7 @@ class UpdateMediaWiki extends Maintenance {
$db = wfGetDB( DB_MASTER );
$this->output( "Going to run database updates for " . wfWikiID() . "\n" );
- if( $db->getType() === 'sqlite' ) {
+ if ( $db->getType() === 'sqlite' ) {
$this->output( "Using SQLite file: '{$db->mDatabaseFile}'\n" );
}
$this->output( "Depending on the size of your database this may take a while!\n" );
@@ -135,21 +135,17 @@ class UpdateMediaWiki extends Maintenance {
$shared = $this->hasOption( 'doshared' );
$updates = array( 'core', 'extensions' );
- if( !$this->hasOption('schema') ) {
- if( $this->hasOption('noschema') ) {
+ if ( !$this->hasOption( 'schema' ) ) {
+ if ( $this->hasOption( 'noschema' ) ) {
$updates[] = 'noschema';
}
$updates[] = 'stats';
-
- if( !$this->hasOption('nopurge') ) {
- $updates[] = 'purge';
- }
}
$updater = DatabaseUpdater::newForDb( $db, $shared, $this );
$updater->doUpdates( $updates );
- foreach( $updater->getPostDatabaseUpdateMaintenance() as $maint ) {
+ foreach ( $updater->getPostDatabaseUpdateMaintenance() as $maint ) {
$child = $this->runChild( $maint );
// LoggedUpdateMaintenance is checking the updatelog itself
@@ -159,14 +155,13 @@ class UpdateMediaWiki extends Maintenance {
continue;
}
- $child = $this->runChild( $maint );
$child->execute();
if ( !$isLoggedUpdate ) {
$updater->insertUpdateRow( $maint );
}
}
- if( !$this->hasOption('nopurge') ) {
+ if ( !$this->hasOption( 'nopurge' ) ) {
$updater->purgeCache();
}
@@ -189,4 +184,4 @@ class UpdateMediaWiki extends Maintenance {
}
$maintClass = 'UpdateMediaWiki';
-require_once( RUN_MAINTENANCE_IF_MAIN );
+require_once RUN_MAINTENANCE_IF_MAIN;
diff --git a/maintenance/updateArticleCount.php b/maintenance/updateArticleCount.php
index 4d49dd2d..7964a21f 100644
--- a/maintenance/updateArticleCount.php
+++ b/maintenance/updateArticleCount.php
@@ -23,7 +23,7 @@
* @author Rob Church <robchur@gmail.com>
*/
-require_once( __DIR__ . '/Maintenance.php' );
+require_once __DIR__ . '/Maintenance.php';
/**
* Maintenance script to provide a better count of the number of articles
@@ -58,4 +58,4 @@ class UpdateArticleCount extends Maintenance {
}
$maintClass = "UpdateArticleCount";
-require_once( RUN_MAINTENANCE_IF_MAIN );
+require_once RUN_MAINTENANCE_IF_MAIN;
diff --git a/maintenance/updateCollation.php b/maintenance/updateCollation.php
index a76a1ee6..964b3138 100644
--- a/maintenance/updateCollation.php
+++ b/maintenance/updateCollation.php
@@ -26,7 +26,7 @@
#$optionsWithArgs = array( 'begin', 'max-slave-lag' );
-require_once( __DIR__ . '/Maintenance.php' );
+require_once __DIR__ . '/Maintenance.php';
/**
* Maintenance script that will find all rows in the categorylinks table
@@ -82,6 +82,10 @@ TEXT;
$collation = Collation::singleton();
}
+ // Collation sanity check: in some cases the constructor will work,
+ // but this will raise an exception, breaking all category pages
+ $collation->getFirstLetter( 'MediaWiki' );
+
$options = array(
'LIMIT' => self::BATCH_SIZE,
'ORDER BY' => 'cl_to, cl_type, cl_from',
@@ -303,4 +307,4 @@ TEXT;
}
$maintClass = "UpdateCollation";
-require_once( RUN_MAINTENANCE_IF_MAIN );
+require_once RUN_MAINTENANCE_IF_MAIN;
diff --git a/maintenance/updateDoubleWidthSearch.php b/maintenance/updateDoubleWidthSearch.php
index dc7398ad..41988d1b 100644
--- a/maintenance/updateDoubleWidthSearch.php
+++ b/maintenance/updateDoubleWidthSearch.php
@@ -23,7 +23,7 @@
* @ingroup Maintenance
*/
-require_once( __DIR__ . '/Maintenance.php' );
+require_once __DIR__ . '/Maintenance.php';
/**
* Maintenance script to normalize double-byte latin UTF-8 characters.
@@ -72,4 +72,4 @@ class UpdateDoubleWidthSearch extends Maintenance {
}
$maintClass = "UpdateDoubleWidthSearch";
-require_once( RUN_MAINTENANCE_IF_MAIN );
+require_once RUN_MAINTENANCE_IF_MAIN;
diff --git a/maintenance/updateRestrictions.php b/maintenance/updateRestrictions.php
index 8699dc26..175447e7 100644
--- a/maintenance/updateRestrictions.php
+++ b/maintenance/updateRestrictions.php
@@ -24,7 +24,7 @@
* @ingroup Maintenance
*/
-require_once( __DIR__ . '/Maintenance.php' );
+require_once __DIR__ . '/Maintenance.php';
/**
* Maintenance script that updates page_restrictions table from
@@ -114,4 +114,4 @@ class UpdateRestrictions extends Maintenance {
}
$maintClass = "UpdateRestrictions";
-require_once( RUN_MAINTENANCE_IF_MAIN );
+require_once RUN_MAINTENANCE_IF_MAIN;
diff --git a/maintenance/updateSearchIndex.php b/maintenance/updateSearchIndex.php
index ac784847..0691bee8 100644
--- a/maintenance/updateSearchIndex.php
+++ b/maintenance/updateSearchIndex.php
@@ -28,7 +28,7 @@
* @ingroup Maintenance
*/
-require_once( __DIR__ . '/Maintenance.php' );
+require_once __DIR__ . '/Maintenance.php';
/**
* Maintenance script for periodic off-peak updating of the search index.
@@ -60,7 +60,7 @@ class UpdateSearchIndex extends Maintenance {
# We can safely delete the file when we're done though.
$start = file_get_contents( 'searchUpdate.pos' );
unlink( 'searchUpdate.pos' );
- } elseif( is_readable( $posFile ) ) {
+ } elseif ( is_readable( $posFile ) ) {
$start = file_get_contents( $posFile );
} else {
$start = wfTimestamp( TS_MW, time() - 86400 );
@@ -97,9 +97,8 @@ class UpdateSearchIndex extends Maintenance {
$page = $dbw->tableName( 'page' );
$sql = "SELECT rc_cur_id FROM $recentchanges
- JOIN $page ON rc_cur_id=page_id AND rc_this_oldid=page_latest
- WHERE rc_type != " . RC_LOG . " AND rc_timestamp BETWEEN '$start' AND '$end'
- ";
+ JOIN $page ON rc_cur_id=page_id AND rc_this_oldid=page_latest
+ WHERE rc_type != " . RC_LOG . " AND rc_timestamp BETWEEN '$start' AND '$end'";
$res = $dbw->query( $sql, __METHOD__ );
$this->updateSearchIndex( $maxLockTime, array( $this, 'searchIndexUpdateCallback' ), $dbw, $res );
@@ -113,4 +112,4 @@ class UpdateSearchIndex extends Maintenance {
}
$maintClass = "UpdateSearchIndex";
-require_once( RUN_MAINTENANCE_IF_MAIN );
+require_once RUN_MAINTENANCE_IF_MAIN;
diff --git a/maintenance/updateSpecialPages.php b/maintenance/updateSpecialPages.php
index f92f67aa..3432cb20 100644
--- a/maintenance/updateSpecialPages.php
+++ b/maintenance/updateSpecialPages.php
@@ -22,7 +22,7 @@
* @ingroup Maintenance
*/
-require_once( __DIR__ . '/Maintenance.php' );
+require_once __DIR__ . '/Maintenance.php';
/**
* Maintenance script to update cached special pages.
@@ -33,41 +33,22 @@ class UpdateSpecialPages extends Maintenance {
public function __construct() {
parent::__construct();
$this->addOption( 'list', 'List special page names' );
- $this->addOption( 'only', 'Only update "page". Ex: --only=BrokenRedirects', false, true );
+ $this->addOption( 'only', 'Only update "page"; case sensitive, ' .
+ 'check correct case by calling this script with --list or on ' .
+ 'includes/QueryPage.php. Ex: --only=BrokenRedirects', false, true );
$this->addOption( 'override', 'Also update pages that have updates disabled' );
}
public function execute() {
- global $IP, $wgSpecialPageCacheUpdates, $wgQueryPages, $wgQueryCacheLimit, $wgDisableQueryPageUpdate;
+ global $IP, $wgQueryPages, $wgQueryCacheLimit, $wgDisableQueryPageUpdate;
- $dbw = wfGetDB( DB_MASTER );
-
- foreach ( $wgSpecialPageCacheUpdates as $special => $call ) {
- if ( !is_callable( $call ) ) {
- $this->error( "Uncallable function $call!" );
- continue;
- }
- $this->output( sprintf( '%-30s ', $special ) );
- $t1 = explode( ' ', microtime() );
- call_user_func( $call, $dbw );
- $t2 = explode( ' ', microtime() );
- $elapsed = ( $t2[0] - $t1[0] ) + ( $t2[1] - $t1[1] );
- $hours = intval( $elapsed / 3600 );
- $minutes = intval( $elapsed % 3600 / 60 );
- $seconds = $elapsed - $hours * 3600 - $minutes * 60;
- if ( $hours ) {
- $this->output( $hours . 'h ' );
- }
- if ( $minutes ) {
- $this->output( $minutes . 'm ' );
- }
- $this->output( sprintf( "completed in %.2fs\n", $seconds ) );
- # Wait for the slave to catch up
- wfWaitForSlaves();
+ if ( !$this->hasOption( 'list' ) && !$this->hasOption( 'only' ) ) {
+ $this->doSpecialPageCacheUpdates();
}
+ $dbw = wfGetDB( DB_MASTER );
// This is needed to initialise $wgQueryPages
- require_once( "$IP/includes/QueryPage.php" );
+ require_once "$IP/includes/QueryPage.php";
foreach ( $wgQueryPages as $page ) {
list( $class, $special ) = $page;
@@ -94,13 +75,13 @@ class UpdateSpecialPages extends Maintenance {
} else {
if ( !class_exists( $class ) ) {
$file = $specialObj->getFile();
- require_once( $file );
+ require_once $file;
}
$queryPage = new $class;
}
if ( !$this->hasOption( 'only' ) || $this->getOption( 'only' ) == $queryPage->getName() ) {
- $this->output( sprintf( '%-30s ', $special ) );
+ $this->output( sprintf( '%-30s ', $special ) );
if ( $queryPage->isExpensive() ) {
$t1 = explode( ' ', microtime() );
# Do the query
@@ -124,7 +105,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..." );
@@ -140,10 +121,42 @@ class UpdateSpecialPages extends Maintenance {
} else {
$this->output( "cheap, skipped\n" );
}
+ if ( $this->hasOption( 'only' ) ) {
+ break;
+ }
}
}
}
+
+ public function doSpecialPageCacheUpdates() {
+ global $wgSpecialPageCacheUpdates;
+ $dbw = wfGetDB( DB_MASTER );
+
+ foreach ( $wgSpecialPageCacheUpdates as $special => $call ) {
+ if ( !is_callable( $call ) ) {
+ $this->error( "Uncallable function $call!" );
+ continue;
+ }
+ $this->output( sprintf( '%-30s ', $special ) );
+ $t1 = explode( ' ', microtime() );
+ call_user_func( $call, $dbw );
+ $t2 = explode( ' ', microtime() );
+ $elapsed = ( $t2[0] - $t1[0] ) + ( $t2[1] - $t1[1] );
+ $hours = intval( $elapsed / 3600 );
+ $minutes = intval( $elapsed % 3600 / 60 );
+ $seconds = $elapsed - $hours * 3600 - $minutes * 60;
+ if ( $hours ) {
+ $this->output( $hours . 'h ' );
+ }
+ if ( $minutes ) {
+ $this->output( $minutes . 'm ' );
+ }
+ $this->output( sprintf( "completed in %.2fs\n", $seconds ) );
+ # Wait for the slave to catch up
+ wfWaitForSlaves();
+ }
+ }
}
$maintClass = "UpdateSpecialPages";
-require_once( RUN_MAINTENANCE_IF_MAIN );
+require_once RUN_MAINTENANCE_IF_MAIN;
diff --git a/maintenance/userDupes.inc b/maintenance/userDupes.inc
index be45a111..8bd80c97 100644
--- a/maintenance/userDupes.inc
+++ b/maintenance/userDupes.inc
@@ -1,6 +1,6 @@
<?php
/**
- * Helper class for update.php and upgrade1_5.php.
+ * Helper class for update.php.
*
* Copyright © 2005 Brion Vibber <brion@pobox.com>
* http://www.mediawiki.org/
@@ -112,9 +112,9 @@ class UserDupes {
$count = count( $dupes );
$this->out( "Found $count accounts with duplicate records on " . wfWikiID() . ".\n" );
- $this->trimmed = 0;
+ $this->trimmed = 0;
$this->reassigned = 0;
- $this->failed = 0;
+ $this->failed = 0;
foreach ( $dupes as $name ) {
$this->examine( $name, $doDelete );
}
@@ -158,11 +158,7 @@ class UserDupes {
* @access private
*/
function lock() {
- if ( $this->newSchema() ) {
- $set = array( 'user', 'revision' );
- } else {
- $set = array( 'user', 'cur', 'old' );
- }
+ $set = array( 'user', 'revision' );
$names = array_map( array( $this, 'lockTable' ), $set );
$tables = implode( ',', $names );
@@ -174,14 +170,6 @@ class UserDupes {
}
/**
- * @return bool
- * @access private
- */
- function newSchema() {
- return MWInit::classExists( 'Revision' );
- }
-
- /**
* @access private
*/
function unlock() {
@@ -223,7 +211,7 @@ class UserDupes {
__METHOD__ );
$firstRow = $this->db->fetchObject( $result );
- $firstId = $firstRow->user_id;
+ $firstId = $firstRow->user_id;
$this->out( "Record that will be used for '$name' is user_id=$firstId\n" );
foreach ( $result as $row ) {
@@ -266,27 +254,10 @@ class UserDupes {
* @access private
*/
function editCount( $userid ) {
- if ( $this->newSchema() ) {
- return $this->editCountOn( 'revision', 'rev_user', $userid );
- } else {
- return $this->editCountOn( 'cur', 'cur_user', $userid ) +
- $this->editCountOn( 'old', 'old_user', $userid );
- }
- }
-
- /**
- * Count the number of hits on a given table for this account.
- * @param $table string
- * @param $field string
- * @param $userid int
- * @return int
- * @access private
- */
- function editCountOn( $table, $field, $userid ) {
return intval( $this->db->selectField(
- $table,
+ 'revision',
'COUNT(*)',
- array( $field => $userid ),
+ array( 'rev_user' => $userid ),
__METHOD__ ) );
}
@@ -296,26 +267,10 @@ class UserDupes {
* @access private
*/
function reassignEdits( $from, $to ) {
- $set = $this->newSchema()
- ? array( 'revision' => 'rev_user' )
- : array( 'cur' => 'cur_user', 'old' => 'old_user' );
- foreach ( $set as $table => $field ) {
- $this->reassignEditsOn( $table, $field, $from, $to );
- }
- }
-
- /**
- * @param $table string
- * @param $field string
- * @param $from int
- * @param $to int
- * @access private
- */
- function reassignEditsOn( $table, $field, $from, $to ) {
- $this->out( "reassigning on $table... " );
- $this->db->update( $table,
- array( $field => $to ),
- array( $field => $from ),
+ $this->out( 'reassigning... ' );
+ $this->db->update( 'revision',
+ array( 'rev_user' => $to ),
+ array( 'rev_user' => $from ),
__METHOD__ );
$this->out( "ok. " );
}
diff --git a/maintenance/userOptions.inc b/maintenance/userOptions.inc
index cbe6b057..51da80d3 100644
--- a/maintenance/userOptions.inc
+++ b/maintenance/userOptions.inc
@@ -25,7 +25,7 @@
$options = array( 'list', 'nowarn', 'quiet', 'usage', 'dry' );
$optionsWithArgs = array( 'old', 'new' );
-require_once( __DIR__ . '/commandLine.inc' );
+require_once __DIR__ . '/commandLine.inc';
/**
* @ingroup Maintenance
@@ -38,7 +38,7 @@ class userOptions {
public $mOldValue;
public $mNewValue;
- private $mMode, $mReady ;
+ private $mMode, $mReady;
/** Constructor. Will show usage and exit if script options are not correct */
function __construct( $opts, $args ) {
@@ -60,9 +60,9 @@ 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 ) ;
+ $list = isset( $opts['list'] );
+ $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 );
@@ -82,18 +82,18 @@ class userOptions {
$this->mQuick = isset( $opts['nowarn'] );
$this->mQuiet = isset( $opts['quiet'] );
- $this->mDry = isset( $opts['dry'] );
+ $this->mDry = isset( $opts['dry'] );
// Set object properties, specially 'mMode' used by run()
if ( isset( $opts['list'] ) ) {
- $this->mMode = 'LISTER' ;
+ $this->mMode = 'LISTER';
} elseif ( isset( $opts['usage'] ) ) {
- $this->mMode = 'USAGER' ;
- $this->mAnOption = isset( $args[0] ) ? $args[0] : false ;
+ $this->mMode = 'USAGER';
+ $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->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" );
@@ -212,7 +212,9 @@ class userOptions {
if ( !$this->mDry ) {
$user->saveSettings();
}
- if ( !$this->mQuiet ) { print " OK\n"; }
+ if ( !$this->mQuiet ) {
+ print " OK\n";
+ }
} elseif ( !$this->mQuiet ) {
print "Not changing '$username' using <{$this->mAnOption}> = '$curValue'\n";
diff --git a/maintenance/userOptions.php b/maintenance/userOptions.php
index 1e1f24b5..e0de3574 100644
--- a/maintenance/userOptions.php
+++ b/maintenance/userOptions.php
@@ -25,7 +25,7 @@
*/
// This is a command line script, load tools and parse args
-require_once( 'userOptions.inc' );
+require_once 'userOptions.inc';
// Load up our tool system, exit with usage() if options are not fine
$uo = new userOptions( $options, $args );
diff --git a/maintenance/waitForSlave.php b/maintenance/waitForSlave.php
index df83928b..a62d1618 100644
--- a/maintenance/waitForSlave.php
+++ b/maintenance/waitForSlave.php
@@ -22,7 +22,7 @@
* @see wfWaitForSlaves()
*/
-require_once( __DIR__ . '/Maintenance.php' );
+require_once __DIR__ . '/Maintenance.php';
/**
* Maintenance script to wait until slave lag goes under a certain value.
@@ -40,4 +40,4 @@ class WaitForSlave extends Maintenance {
}
$maintClass = "WaitForSlave";
-require_once( RUN_MAINTENANCE_IF_MAIN );
+require_once RUN_MAINTENANCE_IF_MAIN;
diff --git a/mw-config/index.php b/mw-config/index.php
index 2823210a..570b426e 100644
--- a/mw-config/index.php
+++ b/mw-config/index.php
@@ -24,11 +24,7 @@ define( 'MW_CONFIG_CALLBACK', 'Installer::overrideConfig' );
define( 'MEDIAWIKI_INSTALL', true );
chdir( dirname( __DIR__ ) );
-if ( isset( $_SERVER['MW_COMPILED'] ) ) {
- require ( 'core/includes/WebStart.php' );
-} else {
- require( dirname( __DIR__ ) . '/includes/WebStart.php' );
-}
+require dirname( __DIR__ ) . '/includes/WebStart.php';
wfInstallerMain();
diff --git a/opensearch_desc.php b/opensearch_desc.php
index cb8b1bec..ecd5051c 100644
--- a/opensearch_desc.php
+++ b/opensearch_desc.php
@@ -20,7 +20,7 @@
* @file
*/
-require_once( __DIR__ . '/includes/WebStart.php' );
+require_once __DIR__ . '/includes/WebStart.php';
if ( $wgRequest->getVal( 'ctype' ) == 'application/xml' ) {
// Makes testing tweaks about a billion times easier
diff --git a/profileinfo.php b/profileinfo.php
index 4117d975..8120599e 100644
--- a/profileinfo.php
+++ b/profileinfo.php
@@ -28,11 +28,7 @@
ini_set( 'zlib.output_compression', 'off' );
$wgEnableProfileInfo = $wgProfileToDatabase = false;
-if ( isset( $_SERVER['MW_COMPILED'] ) ) {
- require ( 'core/includes/WebStart.php' );
-} else {
- require ( __DIR__ . '/includes/WebStart.php' );
-}
+require __DIR__ . '/includes/WebStart.php';
header( 'Content-Type: text/html; charset=utf-8' );
@@ -390,8 +386,9 @@ if ( isset( $_REQUEST['filter'] ) ) {
}
$s = new profile_point( 'SQL Queries', 0, $sqltotal, 0, 0 );
- foreach ( $queries as $q )
+ foreach ( $queries as $q ) {
$s->add_child( $q );
+ }
$points[] = $s;
usort( $points, 'compare_point' );
diff --git a/redirect.php b/redirect.php
deleted file mode 100644
index 5e6cfeed..00000000
--- a/redirect.php
+++ /dev/null
@@ -1,36 +0,0 @@
-<?php
-/**
- * Script that redirects to the article passed in the "wpDropdown" parameter.
- * This is used by the nostalgia skin for the special pages drop-down
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License along
- * with this program; if not, write 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 ( isset( $_SERVER['MW_COMPILED'] ) ) {
- require ( 'phase3/includes/WebStart.php' );
-} else {
- require ( __DIR__ . '/includes/WebStart.php' );
-}
-
-global $wgArticlePath;
-
-$page = $wgRequest->getVal( 'wpDropdown' );
-
-$url = str_replace( "$1", urlencode( $page ), $wgArticlePath );
-
-header( "Location: {$url}", true, 301 );
diff --git a/redirect.phtml b/redirect.phtml
deleted file mode 100644
index 3e430bff..00000000
--- a/redirect.phtml
+++ /dev/null
@@ -1,3 +0,0 @@
-<?php
-// stub file for compatibility with older versions
-include_once('./redirect.php');
diff --git a/resources/Resources.php b/resources/Resources.php
index 6205bb91..06120008 100644
--- a/resources/Resources.php
+++ b/resources/Resources.php
@@ -20,7 +20,7 @@
* @file
*/
-if( !defined( 'MEDIAWIKI' ) ) {
+if ( !defined( 'MEDIAWIKI' ) ) {
die( 'Not an entry point.' );
}
@@ -60,14 +60,11 @@ return array(
*
* See Vector for an example.
*/
-
- 'skins.chick' => array(
- 'styles' => array( 'chick/main.css' => array( 'media' => 'screen, handheld' ) ),
- 'remoteBasePath' => $GLOBALS['wgStylePath'],
- 'localBasePath' => $GLOBALS['wgStyleDirectory'],
- ),
'skins.cologneblue' => array(
- 'styles' => array( 'cologneblue/screen.css' => array( 'media' => 'screen' ) ),
+ 'styles' => array(
+ 'cologneblue/screen.css' => array( 'media' => 'screen' ),
+ 'cologneblue/print.css' => array( 'media' => 'print' ),
+ ),
'remoteBasePath' => $GLOBALS['wgStylePath'],
'localBasePath' => $GLOBALS['wgStyleDirectory'],
),
@@ -102,37 +99,53 @@ return array(
'remoteBasePath' => $GLOBALS['wgStylePath'],
'localBasePath' => $GLOBALS['wgStyleDirectory'],
),
- 'skins.nostalgia' => array(
- 'styles' => array( 'nostalgia/screen.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.standard' => array(
- 'styles' => array( 'standard/main.css' => array( 'media' => 'screen' ) ),
+ 'skins.vector' => array(
+ // Used in the web installer. Test it after modifying this definition!
+ 'styles' => array(
+ 'common/commonElements.css' => array( 'media' => 'screen' ),
+ 'common/commonContent.css' => array( 'media' => 'screen' ),
+ 'common/commonInterface.css' => array( 'media' => 'screen' ),
+ 'vector/styles.less',
+ ),
'remoteBasePath' => $GLOBALS['wgStylePath'],
'localBasePath' => $GLOBALS['wgStyleDirectory'],
),
- 'skins.vector' => array(
- // Keep in sync with WebInstallerOutput::getCSS()
+ 'skins.vector.beta' => array(
+ // Keep in sync with skins.vector
'styles' => array(
'common/commonElements.css' => array( 'media' => 'screen' ),
'common/commonContent.css' => array( 'media' => 'screen' ),
'common/commonInterface.css' => array( 'media' => 'screen' ),
- 'vector/screen.css' => array( 'media' => 'screen' ),
- 'vector/screen-hd.css' => array( 'media' => 'screen and (min-width: 982px)' ),
+ 'vector/styles-beta.less',
),
'remoteBasePath' => $GLOBALS['wgStylePath'],
'localBasePath' => $GLOBALS['wgStyleDirectory'],
),
'skins.vector.js' => array(
- 'scripts' => 'vector/vector.js',
+ 'scripts' => array(
+ 'vector/collapsibleTabs.js',
+ 'vector/vector.js',
+ ),
+ 'position' => 'top',
+ 'dependencies' => 'jquery.delayedBind',
+ 'remoteBasePath' => $GLOBALS['wgStylePath'],
+ 'localBasePath' => $GLOBALS['wgStyleDirectory'],
+ ),
+ 'skins.vector.collapsibleNav' => array(
+ 'scripts' => array(
+ 'vector/collapsibleNav.js',
+ ),
+ 'messages' => array(
+ 'vector-collapsiblenav-more',
+ ),
+ 'dependencies' => array(
+ 'jquery.client',
+ 'jquery.cookie',
+ 'jquery.tabIndex',
+ ),
'remoteBasePath' => $GLOBALS['wgStylePath'],
'localBasePath' => $GLOBALS['wgStyleDirectory'],
+ 'position' => 'bottom',
),
/* jQuery */
@@ -166,6 +179,7 @@ return array(
),
'jquery.byteLength' => array(
'scripts' => 'resources/jquery/jquery.byteLength.js',
+ 'targets' => array( 'desktop', 'mobile' ),
),
'jquery.byteLimit' => array(
'scripts' => 'resources/jquery/jquery.byteLimit.js',
@@ -173,6 +187,11 @@ return array(
),
'jquery.checkboxShiftClick' => array(
'scripts' => 'resources/jquery/jquery.checkboxShiftClick.js',
+ 'targets' => array( 'desktop', 'mobile' ),
+ ),
+ 'jquery.chosen' => array(
+ 'scripts' => 'resources/jquery.chosen/chosen.jquery.js',
+ 'styles' => 'resources/jquery.chosen/chosen.css',
),
'jquery.client' => array(
'scripts' => 'resources/jquery/jquery.client.js',
@@ -210,6 +229,7 @@ return array(
),
'jquery.getAttrs' => array(
'scripts' => 'resources/jquery/jquery.getAttrs.js',
+ 'targets' => array( 'desktop', 'mobile' ),
),
'jquery.hidpi' => array(
'scripts' => 'resources/jquery/jquery.hidpi.js',
@@ -233,12 +253,14 @@ return array(
'scripts' => 'resources/jquery/jquery.makeCollapsible.js',
'styles' => 'resources/jquery/jquery.makeCollapsible.css',
'messages' => array( 'collapsible-expand', 'collapsible-collapse' ),
+ 'targets' => array( 'desktop', 'mobile' ),
),
'jquery.mockjax' => array(
'scripts' => 'resources/jquery/jquery.mockjax.js',
),
'jquery.mw-jump' => array(
'scripts' => 'resources/jquery/jquery.mw-jump.js',
+ 'targets' => array( 'desktop', 'mobile' ),
),
'jquery.mwExtension' => array(
'scripts' => 'resources/jquery/jquery.mwExtension.js',
@@ -246,15 +268,18 @@ return array(
),
'jquery.placeholder' => array(
'scripts' => 'resources/jquery/jquery.placeholder.js',
+ 'targets' => array( 'desktop', 'mobile' ),
),
'jquery.qunit' => array(
'scripts' => 'resources/jquery/jquery.qunit.js',
'styles' => 'resources/jquery/jquery.qunit.css',
'position' => 'top',
+ 'targets' => array( 'desktop', 'mobile' ),
),
'jquery.qunit.completenessTest' => array(
'scripts' => 'resources/jquery/jquery.qunit.completenessTest.js',
'dependencies' => 'jquery.qunit',
+ 'targets' => array( 'desktop', 'mobile' ),
),
'jquery.spinner' => array(
'scripts' => 'resources/jquery/jquery.spinner.js',
@@ -276,7 +301,10 @@ return array(
'scripts' => 'resources/jquery/jquery.tablesorter.js',
'styles' => 'resources/jquery/jquery.tablesorter.css',
'messages' => array( 'sort-descending', 'sort-ascending' ),
- 'dependencies' => 'jquery.mwExtension',
+ 'dependencies' => array(
+ 'jquery.mwExtension',
+ 'mediawiki.language.months',
+ ),
),
'jquery.textSelection' => array(
'scripts' => 'resources/jquery/jquery.textSelection.js',
@@ -605,6 +633,12 @@ return array(
'mediawiki.Title',
),
),
+ 'mediawiki.api.login' => array(
+ 'scripts' => 'resources/mediawiki.api/mediawiki.api.login.js',
+ 'dependencies' => array(
+ 'mediawiki.api',
+ ),
+ ),
'mediawiki.api.parse' => array(
'scripts' => 'resources/mediawiki.api/mediawiki.api.parse.js',
'dependencies' => 'mediawiki.api',
@@ -616,6 +650,9 @@ return array(
'user.tokens',
),
),
+ 'mediawiki.icon' => array(
+ 'styles' => 'resources/mediawiki/mediawiki.icon.css',
+ ),
'mediawiki.debug' => array(
'scripts' => 'resources/mediawiki/mediawiki.debug.js',
'styles' => 'resources/mediawiki/mediawiki.debug.css',
@@ -629,6 +666,14 @@ return array(
// must be loaded on the bottom
'position' => 'bottom',
),
+ 'mediawiki.inspect' => array(
+ 'scripts' => 'resources/mediawiki/mediawiki.inspect.js',
+ 'dependencies' => array(
+ 'jquery.byteLength',
+ 'jquery.json',
+ ),
+ 'targets' => array( 'desktop', 'mobile' ),
+ ),
'mediawiki.feedback' => array(
'scripts' => 'resources/mediawiki/mediawiki.feedback.js',
'styles' => 'resources/mediawiki/mediawiki.feedback.css',
@@ -663,6 +708,7 @@ return array(
),
'mediawiki.htmlform' => array(
'scripts' => 'resources/mediawiki/mediawiki.htmlform.js',
+ 'messages' => array( 'htmlform-chosen-placeholder' ),
),
'mediawiki.notification' => array(
'styles' => 'resources/mediawiki/mediawiki.notification.css',
@@ -687,11 +733,15 @@ return array(
'jquery.client',
'jquery.placeholder',
'jquery.suggestions',
+ 'mediawiki.api',
),
),
'mediawiki.Title' => array(
'scripts' => 'resources/mediawiki/mediawiki.Title.js',
- 'dependencies' => 'mediawiki.util',
+ 'dependencies' => array(
+ 'jquery.byteLength',
+ 'mediawiki.util',
+ ),
),
'mediawiki.Uri' => array(
'scripts' => 'resources/mediawiki/mediawiki.Uri.js',
@@ -723,16 +773,30 @@ return array(
'mediawiki.action.edit' => array(
'scripts' => 'resources/mediawiki.action/mediawiki.action.edit.js',
'dependencies' => array(
+ 'mediawiki.action.edit.styles',
'jquery.textSelection',
'jquery.byteLimit',
),
'position' => 'top',
),
+ 'mediawiki.action.edit.styles' => array(
+ 'styles' => 'resources/mediawiki.action/mediawiki.action.edit.styles.css',
+ 'position' => 'top',
+ ),
+ 'mediawiki.action.edit.collapsibleFooter' => array(
+ 'scripts' => 'resources/mediawiki.action/mediawiki.action.edit.collapsibleFooter.js',
+ 'styles' => 'resources/mediawiki.action/mediawiki.action.edit.collapsibleFooter.css',
+ 'dependencies' => array(
+ 'jquery.makeCollapsible',
+ 'mediawiki.icon',
+ ),
+ ),
'mediawiki.action.edit.preview' => array(
'scripts' => 'resources/mediawiki.action/mediawiki.action.edit.preview.js',
'dependencies' => array(
'jquery.form',
'jquery.spinner',
+ 'mediawiki.action.history.diff',
),
),
'mediawiki.action.history' => array(
@@ -759,11 +823,24 @@ return array(
),
'mediawiki.action.view.postEdit' => array(
'scripts' => 'resources/mediawiki.action/mediawiki.action.view.postEdit.js',
- 'dependencies' => 'jquery.cookie'
+ 'styles' => 'resources/mediawiki.action/mediawiki.action.view.postEdit.css',
+ 'dependencies' => array(
+ 'jquery.cookie',
+ 'mediawiki.jqueryMsg'
+ ),
+ 'messages' => array(
+ 'postedit-confirmation',
+ ),
),
'mediawiki.action.view.rightClickEdit' => array(
'scripts' => 'resources/mediawiki.action/mediawiki.action.view.rightClickEdit.js',
),
+ 'mediawiki.action.edit.editWarning' => array(
+ 'scripts' => 'resources/mediawiki.action/mediawiki.action.edit.editWarning.js',
+ 'messages' => array(
+ 'editwarning-warning',
+ ),
+ ),
// Alias for backwards compatibility
'mediawiki.action.watch.ajax' => array(
'dependencies' => 'mediawiki.page.watch.ajax'
@@ -825,6 +902,16 @@ return array(
'targets' => array( 'desktop', 'mobile' ),
),
+ 'mediawiki.language.months' => array(
+ 'scripts' => 'resources/mediawiki.language/mediawiki.language.months.js',
+ 'dependencies' => 'mediawiki.language',
+ 'messages' => array_merge(
+ Language::$mMonthMsgs,
+ Language::$mMonthGenMsgs,
+ Language::$mMonthAbbrevMsgs
+ )
+ ),
+
/* MediaWiki Libs */
'mediawiki.libs.jpegmeta' => array(
@@ -833,6 +920,9 @@ return array(
/* MediaWiki Page */
+ 'mediawiki.page.gallery' => array(
+ 'scripts' => 'resources/mediawiki.page/mediawiki.page.gallery.js',
+ ),
'mediawiki.page.ready' => array(
'scripts' => 'resources/mediawiki.page/mediawiki.page.ready.js',
'dependencies' => array(
@@ -842,6 +932,7 @@ return array(
'jquery.mw-jump',
'mediawiki.util',
),
+ 'targets' => array( 'desktop', 'mobile' ),
),
'mediawiki.page.startup' => array(
'scripts' => 'resources/mediawiki.page/mediawiki.page.startup.js',
@@ -850,6 +941,7 @@ return array(
'mediawiki.util',
),
'position' => 'top',
+ 'targets' => array( 'desktop', 'mobile' ),
),
'mediawiki.page.patrol.ajax' => array(
'scripts' => 'resources/mediawiki.page/mediawiki.page.patrol.ajax.js',
@@ -887,6 +979,10 @@ return array(
'watcherrortext',
),
),
+ 'mediawiki.page.image.pagination' => array(
+ 'scripts' => 'resources/mediawiki.page/mediawiki.page.image.pagination.js',
+ 'dependencies' => array( 'jquery.spinner' )
+ ),
/* MediaWiki Special pages */
@@ -913,15 +1009,21 @@ return array(
),
'mediawiki.special.changeslist' => array(
'styles' => 'resources/mediawiki.special/mediawiki.special.changeslist.css',
- 'dependencies' => array( 'jquery.makeCollapsible' ),
+ ),
+ 'mediawiki.special.changeslist.enhanced' => array(
+ 'styles' => 'resources/mediawiki.special/mediawiki.special.changeslist.enhanced.css',
),
'mediawiki.special.movePage' => array(
'scripts' => 'resources/mediawiki.special/mediawiki.special.movePage.js',
'dependencies' => 'jquery.byteLimit',
),
+ 'mediawiki.special.pagesWithProp' => array(
+ 'styles' => 'resources/mediawiki.special/mediawiki.special.pagesWithProp.css',
+ ),
'mediawiki.special.preferences' => array(
'scripts' => 'resources/mediawiki.special/mediawiki.special.preferences.js',
- 'styles' => 'resources/mediawiki.special/mediawiki.special.preferences.css',
+ 'styles' => 'resources/mediawiki.special/mediawiki.special.preferences.css',
+ 'position' => 'top',
),
'mediawiki.special.recentchanges' => array(
'scripts' => 'resources/mediawiki.special/mediawiki.special.recentchanges.js',
@@ -941,7 +1043,7 @@ return array(
'scripts' => 'resources/mediawiki.special/mediawiki.special.undelete.js',
),
'mediawiki.special.upload' => array(
- // @TODO: merge in remainder of mediawiki.legacy.upload
+ // @todo merge in remainder of mediawiki.legacy.upload
'scripts' => 'resources/mediawiki.special/mediawiki.special.upload.js',
'messages' => array(
'widthheight',
@@ -951,10 +1053,33 @@ return array(
'size-gigabytes',
'largefileserver',
),
- 'dependencies' => array( 'mediawiki.libs.jpegmeta', 'mediawiki.util' ),
+ 'dependencies' => array(
+ 'mediawiki.libs.jpegmeta',
+ 'mediawiki.util',
+ ),
+ ),
+ 'mediawiki.special.userlogin' => array(
+ 'styles' => array(
+ 'resources/mediawiki.special/mediawiki.special.vforms.css',
+ 'resources/mediawiki.special/mediawiki.special.userLogin.css',
+ ),
+ 'position' => 'top',
+ ),
+ 'mediawiki.special.createaccount' => array(
+ 'styles' => array(
+ 'resources/mediawiki.special/mediawiki.special.vforms.css',
+ 'resources/mediawiki.special/mediawiki.special.createAccount.css',
+ ),
),
- 'mediawiki.special.userlogin.signup' => array(
- 'scripts' => 'resources/mediawiki.special/mediawiki.special.userLogin.signup.js',
+ 'mediawiki.special.createaccount.js' => array(
+ 'scripts' => 'resources/mediawiki.special/mediawiki.special.createAccount.js',
+ 'messages' => array(
+ 'createacct-captcha',
+ 'createacct-emailrequired',
+ 'createacct-imgcaptcha-ph'
+ ),
+ 'dependencies' => 'mediawiki.jqueryMsg',
+ 'position' => 'top',
),
'mediawiki.special.javaScriptTest' => array(
'scripts' => 'resources/mediawiki.special/mediawiki.special.javaScriptTest.js',
@@ -964,6 +1089,7 @@ return array(
) ),
'dependencies' => array( 'jquery.qunit' ),
'position' => 'top',
+ 'targets' => array( 'desktop', 'mobile' ),
),
/* MediaWiki Tests */
@@ -978,6 +1104,7 @@ return array(
'mediawiki.page.ready',
),
'position' => 'top',
+ 'targets' => array( 'desktop', 'mobile' ),
),
/* MediaWiki Legacy */
@@ -998,14 +1125,9 @@ return array(
'localBasePath' => $GLOBALS['wgStyleDirectory'],
),
'mediawiki.legacy.config' => array(
+ // Used in the web installer. Test it after modifying this definition!
'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.IEFixes' => array(
- 'scripts' => 'common/IEFixes.js',
+ 'styles' => array( 'common/config.css' ),
'remoteBasePath' => $GLOBALS['wgStylePath'],
'localBasePath' => $GLOBALS['wgStyleDirectory'],
'dependencies' => 'mediawiki.legacy.wikibits',
@@ -1015,12 +1137,12 @@ return array(
'remoteBasePath' => $GLOBALS['wgStylePath'],
'localBasePath' => $GLOBALS['wgStyleDirectory'],
'dependencies' => array(
- 'mediawiki.legacy.wikibits',
'jquery.byteLimit',
),
'position' => 'top',
),
'mediawiki.legacy.shared' => array(
+ // Used in the web installer. Test it after modifying this definition!
'styles' => array( 'common/shared.css' => array( 'media' => 'screen' ) ),
'remoteBasePath' => $GLOBALS['wgStylePath'],
'localBasePath' => $GLOBALS['wgStyleDirectory'],
@@ -1035,7 +1157,9 @@ return array(
'remoteBasePath' => $GLOBALS['wgStylePath'],
'localBasePath' => $GLOBALS['wgStyleDirectory'],
'dependencies' => array(
- 'mediawiki.legacy.wikibits',
+ 'jquery.spinner',
+ 'mediawiki.api',
+ 'mediawiki.Title',
'mediawiki.util',
),
),
@@ -1048,9 +1172,11 @@ return array(
),
'position' => 'top',
),
- 'mediawiki.legacy.wikiprintable' => array(
- 'styles' => array( 'common/wikiprintable.css' => array( 'media' => 'print' ) ),
- 'remoteBasePath' => $GLOBALS['wgStylePath'],
- 'localBasePath' => $GLOBALS['wgStyleDirectory'],
+ 'mediawiki.ui' => array(
+ 'skinStyles' => array(
+ 'default' => 'resources/mediawiki.ui/mediawiki.ui.default.css',
+ 'vector' => 'resources/mediawiki.ui/mediawiki.ui.vector.css',
+ ),
+ 'position' => 'top',
),
);
diff --git a/resources/Resources.php.orig b/resources/Resources.php.orig
deleted file mode 100644
index 0a70c5a2..00000000
--- a/resources/Resources.php.orig
+++ /dev/null
@@ -1,968 +0,0 @@
-<?php
-
-return array(
-
- /* Special modules who have their own classes */
-
- // Scripts managed by the local wiki (stored in the MediaWiki namespace)
- 'site' => array( 'class' => 'ResourceLoaderSiteModule' ),
- 'noscript' => array( 'class' => 'ResourceLoaderNoscriptModule' ),
- 'startup' => array( 'class' => 'ResourceLoaderStartUpModule' ),
- 'filepage' => array( 'class' => 'ResourceLoaderFilePageModule' ),
- 'user.groups' => array( 'class' => 'ResourceLoaderUserGroupsModule' ),
-
- // Scripts managed by the current user (stored in their user space)
- 'user' => array( 'class' => 'ResourceLoaderUserModule' ),
-
- // Scripts generated based on the current user's preferences
- 'user.cssprefs' => array( 'class' => 'ResourceLoaderUserCSSPrefsModule' ),
-
- // Populate mediawiki.user placeholders with information about the current user
- 'user.options' => array( 'class' => 'ResourceLoaderUserOptionsModule' ),
- 'user.tokens' => array( 'class' => 'ResourceLoaderUserTokensModule' ),
-
- // Scripts for the dynamic language specific data, like grammar forms.
- 'mediawiki.language.data' => array( 'class' => 'ResourceLoaderLanguageDataModule' ),
-
- /* Skins */
-
- 'skins.chick' => array(
- 'styles' => array( 'chick/main.css' => array( 'media' => 'screen, handheld' ) ),
- 'remoteBasePath' => $GLOBALS['wgStylePath'],
- 'localBasePath' => $GLOBALS['wgStyleDirectory'],
- ),
- 'skins.cologneblue' => array(
- 'styles' => array( 'cologneblue/screen.css' => array( 'media' => 'screen' ) ),
- '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.monobook' => array(
- 'styles' => array(
- 'common/commonElements.css' => array( 'media' => 'screen' ),
- 'common/commonContent.css' => array( 'media' => 'screen' ),
- 'common/commonInterface.css' => array( 'media' => 'screen' ),
- 'monobook/main.css' => array( 'media' => 'screen' ),
- ),
- 'remoteBasePath' => $GLOBALS['wgStylePath'],
- 'localBasePath' => $GLOBALS['wgStyleDirectory'],
- ),
- 'skins.archlinux' => array(
- 'styles' => array(
- 'common/commonElements.css' => array( 'media' => 'screen' ),
- 'common/commonContent.css' => array( 'media' => 'screen' ),
- 'common/commonInterface.css' => array( 'media' => 'screen' ),
- 'archlinux/main.css' => array( 'media' => 'screen' ),
- 'archlinux/archnavbar.css' => array( 'media' => 'screen' ),
- 'archlinux/arch.css' => array( 'media' => 'screen' ),
- 'archlinux/print.css' => array( 'media' => 'print' ),
- ),
- 'remoteBasePath' => $GLOBALS['wgStylePath'],
- 'localBasePath' => $GLOBALS['wgStyleDirectory'],
- ),
- 'skins.nostalgia' => array(
- 'styles' => array( 'nostalgia/screen.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.standard' => array(
- 'styles' => array( 'standard/main.css' => array( 'media' => 'screen' ) ),
- 'remoteBasePath' => $GLOBALS['wgStylePath'],
- 'localBasePath' => $GLOBALS['wgStyleDirectory'],
- ),
- 'skins.vector' => array(
- // Keep in sync with WebInstallerOutput::getCSS()
- 'styles' => array(
- 'common/commonElements.css' => array( 'media' => 'screen' ),
- 'common/commonContent.css' => array( 'media' => 'screen' ),
- 'common/commonInterface.css' => array( 'media' => 'screen' ),
- 'vector/screen.css' => array( 'media' => 'screen' ),
- 'vector/screen-hd.css' => array( 'media' => 'screen and (min-width: 982px)' ),
- ),
- 'scripts' => 'vector/vector.js',
- 'remoteBasePath' => $GLOBALS['wgStylePath'],
- 'localBasePath' => $GLOBALS['wgStyleDirectory'],
- ),
-
- /* jQuery */
-
- 'jquery' => array(
- 'scripts' => 'resources/jquery/jquery.js',
- 'debugRaw' => false,
- ),
-
- /* jQuery Plugins */
-
- 'jquery.appear' => array(
- 'scripts' => 'resources/jquery/jquery.appear.js',
- ),
- 'jquery.arrowSteps' => array(
- 'scripts' => 'resources/jquery/jquery.arrowSteps.js',
- 'styles' => 'resources/jquery/jquery.arrowSteps.css',
- ),
- 'jquery.async' => array(
- 'scripts' => 'resources/jquery/jquery.async.js',
- ),
- 'jquery.autoEllipsis' => array(
- 'scripts' => 'resources/jquery/jquery.autoEllipsis.js',
- 'dependencies' => 'jquery.highlightText',
- ),
- 'jquery.badge' => array(
- 'scripts' => 'resources/jquery/jquery.badge.js',
- 'styles' => 'resources/jquery/jquery.badge.css',
- ),
- 'jquery.byteLength' => array(
- 'scripts' => 'resources/jquery/jquery.byteLength.js',
- ),
- 'jquery.byteLimit' => array(
- 'scripts' => 'resources/jquery/jquery.byteLimit.js',
- 'dependencies' => 'jquery.byteLength',
- ),
- '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',
- 'dependencies' => 'jquery.colorUtil',
- ),
- 'jquery.colorUtil' => array(
- 'scripts' => 'resources/jquery/jquery.colorUtil.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',
- 'dependencies' => 'jquery.delayedBind',
- ),
- 'jquery.farbtastic' => array(
- 'scripts' => 'resources/jquery/jquery.farbtastic.js',
- 'styles' => 'resources/jquery/jquery.farbtastic.css',
- 'dependencies' => 'jquery.colorUtil',
- ),
- 'jquery.footHovzer' => array(
- 'scripts' => 'resources/jquery/jquery.footHovzer.js',
- 'styles' => 'resources/jquery/jquery.footHovzer.css',
- ),
- 'jquery.form' => array(
- 'scripts' => 'resources/jquery/jquery.form.js',
- ),
- 'jquery.getAttrs' => array(
- 'scripts' => 'resources/jquery/jquery.getAttrs.js',
- ),
- 'jquery.highlightText' => array(
- 'scripts' => 'resources/jquery/jquery.highlightText.js',
- 'dependencies' => 'jquery.mwExtension',
- ),
- 'jquery.hoverIntent' => array(
- 'scripts' => 'resources/jquery/jquery.hoverIntent.js',
- ),
- 'jquery.json' => array(
- 'scripts' => 'resources/jquery/jquery.json.js',
- ),
- 'jquery.localize' => array(
- 'scripts' => 'resources/jquery/jquery.localize.js',
- ),
- 'jquery.makeCollapsible' => array(
- 'scripts' => 'resources/jquery/jquery.makeCollapsible.js',
- 'styles' => 'resources/jquery/jquery.makeCollapsible.css',
- 'messages' => array( 'collapsible-expand', 'collapsible-collapse' ),
- ),
- 'jquery.mockjax' => array(
- 'scripts' => 'resources/jquery/jquery.mockjax.js',
- ),
- 'jquery.mw-jump' => array(
- 'scripts' => 'resources/jquery/jquery.mw-jump.js',
- ),
- 'jquery.mwExtension' => array(
- 'scripts' => 'resources/jquery/jquery.mwExtension.js',
- ),
- 'jquery.placeholder' => array(
- 'scripts' => 'resources/jquery/jquery.placeholder.js',
- ),
- 'jquery.qunit' => array(
- 'scripts' => 'resources/jquery/jquery.qunit.js',
- 'styles' => 'resources/jquery/jquery.qunit.css',
- 'position' => 'top',
- ),
- 'jquery.qunit.completenessTest' => array(
- 'scripts' => 'resources/jquery/jquery.qunit.completenessTest.js',
- 'dependencies' => 'jquery.qunit',
- ),
- 'jquery.spinner' => array(
- 'scripts' => 'resources/jquery/jquery.spinner.js',
- 'styles' => 'resources/jquery/jquery.spinner.css',
- ),
- 'jquery.jStorage' => array(
- 'scripts' => 'resources/jquery/jquery.jStorage.js',
- 'dependencies' => 'jquery.json',
- ),
- '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.tablesorter' => array(
- 'scripts' => 'resources/jquery/jquery.tablesorter.js',
- 'styles' => 'resources/jquery/jquery.tablesorter.css',
- 'messages' => array( 'sort-descending', 'sort-ascending' ),
- 'dependencies' => 'jquery.mwExtension',
- ),
- 'jquery.textSelection' => array(
- 'scripts' => 'resources/jquery/jquery.textSelection.js',
- 'dependencies' => 'jquery.client',
- ),
- 'jquery.validate' => array(
- 'scripts' => 'resources/jquery/jquery.validate.js',
- ),
- 'jquery.xmldom' => array(
- 'scripts' => 'resources/jquery/jquery.xmldom.js',
- ),
-
- /* jQuery Tipsy */
-
- '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',
- 'group' => 'jquery.ui',
- ),
- 'jquery.ui.widget' => array(
- 'scripts' => 'resources/jquery.ui/jquery.ui.widget.js',
- 'group' => 'jquery.ui',
- ),
- 'jquery.ui.mouse' => array(
- 'scripts' => 'resources/jquery.ui/jquery.ui.mouse.js',
- 'dependencies' => 'jquery.ui.widget',
- 'group' => 'jquery.ui',
- ),
- 'jquery.ui.position' => array(
- 'scripts' => 'resources/jquery.ui/jquery.ui.position.js',
- 'group' => 'jquery.ui',
- ),
- // Interactions
- 'jquery.ui.draggable' => array(
- 'scripts' => 'resources/jquery.ui/jquery.ui.draggable.js',
- 'dependencies' => array( 'jquery.ui.core', 'jquery.ui.mouse', 'jquery.ui.widget' ),
- 'group' => 'jquery.ui',
- ),
- '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',
- ),
- 'group' => 'jquery.ui',
- ),
- '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' ),
- 'group' => 'jquery.ui',
- ),
- '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' ),
- 'group' => 'jquery.ui',
- ),
- 'jquery.ui.sortable' => array(
- 'scripts' => 'resources/jquery.ui/jquery.ui.sortable.js',
- 'dependencies' => array( 'jquery.ui.core', 'jquery.ui.widget', 'jquery.ui.mouse' ),
- 'group' => 'jquery.ui',
- ),
- // 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',
- ),
- 'group' => 'jquery.ui',
- ),
- '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',
- ),
- 'group' => 'jquery.ui',
- ),
- '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',
- ),
- 'group' => 'jquery.ui',
- ),
- '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' => 'resources/jquery.ui/i18n/jquery.ui.datepicker-fr.js',
- 'gl' => 'resources/jquery.ui/i18n/jquery.ui.datepicker-gl.js',
- 'he' => 'resources/jquery.ui/i18n/jquery.ui.datepicker-he.js',
- 'hi' => 'resources/jquery.ui/i18n/jquery.ui.datepicker-hi.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',
- 'ka' => 'resources/jquery.ui/i18n/jquery.ui.datepicker-ka.js',
- 'kk' => 'resources/jquery.ui/i18n/jquery.ui.datepicker-kk.js',
- 'km' => 'resources/jquery.ui/i18n/jquery.ui.datepicker-km.js',
- 'ko' => 'resources/jquery.ui/i18n/jquery.ui.datepicker-ko.js',
- 'lb' => 'resources/jquery.ui/i18n/jquery.ui.datepicker-lb.js',
- 'lt' => 'resources/jquery.ui/i18n/jquery.ui.datepicker-lt.js',
- 'lv' => 'resources/jquery.ui/i18n/jquery.ui.datepicker-lv.js',
- 'mk' => 'resources/jquery.ui/i18n/jquery.ui.datepicker-mk.js',
- 'ml' => 'resources/jquery.ui/i18n/jquery.ui.datepicker-ml.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' => 'resources/jquery.ui/i18n/jquery.ui.datepicker-pt.js',
- 'pt-br' => 'resources/jquery.ui/i18n/jquery.ui.datepicker-pt-BR.js',
- 'rm' => 'resources/jquery.ui/i18n/jquery.ui.datepicker-rm.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',
- ),
- 'group' => 'jquery.ui',
- ),
- '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',
- ),
- 'group' => 'jquery.ui',
- ),
- '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',
- ),
- 'group' => 'jquery.ui',
- ),
- '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',
- ),
- 'group' => 'jquery.ui',
- ),
- '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',
- ),
- 'group' => 'jquery.ui',
- ),
- // Effects
- 'jquery.effects.core' => array(
- 'scripts' => 'resources/jquery.effects/jquery.effects.core.js',
- 'dependencies' => 'jquery',
- 'group' => 'jquery.ui',
- ),
- 'jquery.effects.blind' => array(
- 'scripts' => 'resources/jquery.effects/jquery.effects.blind.js',
- 'dependencies' => 'jquery.effects.core',
- 'group' => 'jquery.ui',
- ),
- 'jquery.effects.bounce' => array(
- 'scripts' => 'resources/jquery.effects/jquery.effects.bounce.js',
- 'dependencies' => 'jquery.effects.core',
- 'group' => 'jquery.ui',
- ),
- 'jquery.effects.clip' => array(
- 'scripts' => 'resources/jquery.effects/jquery.effects.clip.js',
- 'dependencies' => 'jquery.effects.core',
- 'group' => 'jquery.ui',
- ),
- 'jquery.effects.drop' => array(
- 'scripts' => 'resources/jquery.effects/jquery.effects.drop.js',
- 'dependencies' => 'jquery.effects.core',
- 'group' => 'jquery.ui',
- ),
- 'jquery.effects.explode' => array(
- 'scripts' => 'resources/jquery.effects/jquery.effects.explode.js',
- 'dependencies' => 'jquery.effects.core',
- 'group' => 'jquery.ui',
- ),
- 'jquery.effects.fade' => array(
- 'scripts' => 'resources/jquery.effects/jquery.effects.fade.js',
- 'dependencies' => 'jquery.effects.core',
- 'group' => 'jquery.ui',
- ),
- 'jquery.effects.fold' => array(
- 'scripts' => 'resources/jquery.effects/jquery.effects.fold.js',
- 'dependencies' => 'jquery.effects.core',
- 'group' => 'jquery.ui',
- ),
- 'jquery.effects.highlight' => array(
- 'scripts' => 'resources/jquery.effects/jquery.effects.highlight.js',
- 'dependencies' => 'jquery.effects.core',
- 'group' => 'jquery.ui',
- ),
- 'jquery.effects.pulsate' => array(
- 'scripts' => 'resources/jquery.effects/jquery.effects.pulsate.js',
- 'dependencies' => 'jquery.effects.core',
- 'group' => 'jquery.ui',
- ),
- 'jquery.effects.scale' => array(
- 'scripts' => 'resources/jquery.effects/jquery.effects.scale.js',
- 'dependencies' => 'jquery.effects.core',
- 'group' => 'jquery.ui',
- ),
- 'jquery.effects.shake' => array(
- 'scripts' => 'resources/jquery.effects/jquery.effects.shake.js',
- 'dependencies' => 'jquery.effects.core',
- 'group' => 'jquery.ui',
- ),
- 'jquery.effects.slide' => array(
- 'scripts' => 'resources/jquery.effects/jquery.effects.slide.js',
- 'dependencies' => 'jquery.effects.core',
- 'group' => 'jquery.ui',
- ),
- 'jquery.effects.transfer' => array(
- 'scripts' => 'resources/jquery.effects/jquery.effects.transfer.js',
- 'dependencies' => 'jquery.effects.core',
- 'group' => 'jquery.ui',
- ),
-
- /* MediaWiki */
-
- 'mediawiki' => array(
- 'scripts' => 'resources/mediawiki/mediawiki.js',
- 'debugScripts' => 'resources/mediawiki/mediawiki.log.js',
- 'debugRaw' => false,
- ),
- 'mediawiki.api' => array(
- 'scripts' => 'resources/mediawiki.api/mediawiki.api.js',
- 'dependencies' => 'mediawiki.util',
- ),
- 'mediawiki.api.category' => array(
- 'scripts' => 'resources/mediawiki.api/mediawiki.api.category.js',
- 'dependencies' => array(
- 'mediawiki.api',
- 'mediawiki.Title',
- ),
- ),
- 'mediawiki.api.edit' => array(
- 'scripts' => 'resources/mediawiki.api/mediawiki.api.edit.js',
- 'dependencies' => array(
- 'mediawiki.api',
- 'mediawiki.Title',
- ),
- ),
- 'mediawiki.api.parse' => array(
- 'scripts' => 'resources/mediawiki.api/mediawiki.api.parse.js',
- 'dependencies' => 'mediawiki.api',
- ),
- 'mediawiki.api.titleblacklist' => array(
- 'scripts' => 'resources/mediawiki.api/mediawiki.api.titleblacklist.js',
- 'dependencies' => array(
- 'mediawiki.api',
- 'mediawiki.Title',
- ),
- ),
- 'mediawiki.api.watch' => array(
- 'scripts' => 'resources/mediawiki.api/mediawiki.api.watch.js',
- 'dependencies' => array(
- 'mediawiki.api',
- 'user.tokens',
- ),
- ),
- 'mediawiki.debug' => array(
- 'scripts' => 'resources/mediawiki/mediawiki.debug.js',
- 'styles' => 'resources/mediawiki/mediawiki.debug.css',
- 'dependencies' => 'jquery.footHovzer',
- 'position' => 'bottom',
- ),
- 'mediawiki.debug.init' => array(
- 'scripts' => 'resources/mediawiki/mediawiki.debug.init.js',
- 'dependencies' => 'mediawiki.debug',
- // Uses a custom mw.config variable that is set in debughtml,
- // must be loaded on the bottom
- 'position' => 'bottom',
- ),
- 'mediawiki.feedback' => array(
- 'scripts' => 'resources/mediawiki/mediawiki.feedback.js',
- 'styles' => 'resources/mediawiki/mediawiki.feedback.css',
- 'dependencies' => array(
- 'mediawiki.api.edit',
- 'mediawiki.Title',
- 'mediawiki.jqueryMsg',
- 'jquery.ui.dialog',
- ),
- 'messages' => array(
- 'feedback-bugornote',
- 'feedback-subject',
- 'feedback-message',
- 'feedback-cancel',
- 'feedback-submit',
- 'feedback-adding',
- 'feedback-error1',
- 'feedback-error2',
- 'feedback-error3',
- 'feedback-thanks',
- 'feedback-close',
- 'feedback-bugcheck',
- 'feedback-bugnew',
- ),
- ),
- 'mediawiki.htmlform' => array(
- 'scripts' => 'resources/mediawiki/mediawiki.htmlform.js',
- ),
- 'mediawiki.notification' => array(
- 'styles' => 'resources/mediawiki/mediawiki.notification.css',
- 'scripts' => 'resources/mediawiki/mediawiki.notification.js',
- 'dependencies' => array(
- 'mediawiki.page.startup',
- ),
- ),
- 'mediawiki.notify' => array(
- 'scripts' => 'resources/mediawiki/mediawiki.notify.js',
- ),
- 'mediawiki.searchSuggest' => array(
- 'scripts' => 'resources/mediawiki/mediawiki.searchSuggest.js',
- 'messages' => array(
- 'searchsuggest-search',
- 'searchsuggest-containing',
- ),
- 'dependencies' => array(
- 'jquery.autoEllipsis',
- 'jquery.client',
- 'jquery.placeholder',
- 'jquery.suggestions',
- ),
- ),
- 'mediawiki.Title' => array(
- 'scripts' => 'resources/mediawiki/mediawiki.Title.js',
- 'dependencies' => 'mediawiki.util',
- ),
- 'mediawiki.Uri' => array(
- 'scripts' => 'resources/mediawiki/mediawiki.Uri.js',
- ),
- 'mediawiki.user' => array(
- 'scripts' => 'resources/mediawiki/mediawiki.user.js',
- 'dependencies' => array(
- 'jquery.cookie',
- 'mediawiki.api',
- ),
- ),
- 'mediawiki.util' => array(
- 'scripts' => 'resources/mediawiki/mediawiki.util.js',
- 'dependencies' => array(
- 'jquery.client',
- 'jquery.cookie',
- 'jquery.mwExtension',
- 'mediawiki.notify',
- ),
- 'messages' => array( 'showtoc', 'hidetoc' ),
- 'position' => 'top', // For $wgPreloadJavaScriptMwUtil
- ),
-
- /* MediaWiki Action */
-
- 'mediawiki.action.edit' => array(
- 'scripts' => 'resources/mediawiki.action/mediawiki.action.edit.js',
- 'dependencies' => array(
- 'jquery.textSelection',
- 'jquery.byteLimit',
- ),
- 'position' => 'top',
- ),
- 'mediawiki.action.edit.preview' => array(
- 'scripts' => 'resources/mediawiki.action/mediawiki.action.edit.preview.js',
- 'dependencies' => array(
- 'jquery.form',
- 'jquery.spinner',
- ),
- ),
- 'mediawiki.action.history' => array(
- 'scripts' => 'resources/mediawiki.action/mediawiki.action.history.js',
- 'group' => 'mediawiki.action.history',
- ),
- 'mediawiki.action.history.diff' => array(
- 'styles' => 'resources/mediawiki.action/mediawiki.action.history.diff.css',
- 'group' => 'mediawiki.action.history',
- ),
- 'mediawiki.action.view.dblClickEdit' => array(
- 'scripts' => 'resources/mediawiki.action/mediawiki.action.view.dblClickEdit.js',
- 'dependencies' => 'mediawiki.util',
- ),
- 'mediawiki.action.view.metadata' => array(
- 'scripts' => 'resources/mediawiki.action/mediawiki.action.view.metadata.js',
- 'messages' => array(
- 'metadata-expand',
- 'metadata-collapse',
- ),
- ),
- 'mediawiki.action.view.rightClickEdit' => array(
- 'scripts' => 'resources/mediawiki.action/mediawiki.action.view.rightClickEdit.js',
- ),
- // Alias for backwards compatibility
- 'mediawiki.action.watch.ajax' => array(
- 'dependencies' => 'mediawiki.page.watch.ajax'
- ),
-
- /* MediaWiki Language */
-
- 'mediawiki.language' => array(
- 'scripts' => 'resources/mediawiki.language/mediawiki.language.js',
- 'languageScripts' => array(
- 'bs' => 'resources/mediawiki.language/languages/bs.js',
- 'dsb' => 'resources/mediawiki.language/languages/dsb.js',
- 'fi' => 'resources/mediawiki.language/languages/fi.js',
- 'ga' => 'resources/mediawiki.language/languages/ga.js',
- 'he' => 'resources/mediawiki.language/languages/he.js',
- 'hsb' => 'resources/mediawiki.language/languages/hsb.js',
- 'hu' => 'resources/mediawiki.language/languages/hu.js',
- 'hy' => 'resources/mediawiki.language/languages/hy.js',
- 'la' => 'resources/mediawiki.language/languages/la.js',
- 'os' => 'resources/mediawiki.language/languages/os.js',
- 'ru' => 'resources/mediawiki.language/languages/ru.js',
- 'sl' => 'resources/mediawiki.language/languages/sl.js',
- 'uk' => 'resources/mediawiki.language/languages/uk.js',
- ),
- 'dependencies' => array(
- 'mediawiki.language.data',
- 'mediawiki.cldr'
- ),
- ),
-
- 'mediawiki.cldr' => array(
- 'scripts' => 'resources/mediawiki.language/mediawiki.cldr.js',
- 'dependencies' => array(
- 'mediawiki.libs.pluralruleparser',
- ),
- ),
-
- 'mediawiki.libs.pluralruleparser' => array(
- 'scripts' => 'resources/mediawiki.libs/CLDRPluralRuleParser.js',
- ),
-
- 'mediawiki.language.init' => array(
- 'scripts' => 'resources/mediawiki.language/mediawiki.language.init.js',
- ),
-
- 'mediawiki.jqueryMsg' => array(
- 'scripts' => 'resources/mediawiki/mediawiki.jqueryMsg.js',
- 'dependencies' => array(
- 'mediawiki.util',
- 'mediawiki.language',
- ),
- ),
-
- /* MediaWiki Libs */
-
- 'mediawiki.libs.jpegmeta' => array(
- 'scripts' => 'resources/mediawiki.libs/mediawiki.libs.jpegmeta.js',
- ),
-
- /* MediaWiki Page */
-
- 'mediawiki.page.ready' => array(
- 'scripts' => 'resources/mediawiki.page/mediawiki.page.ready.js',
- 'dependencies' => array(
- 'jquery.checkboxShiftClick',
- 'jquery.makeCollapsible',
- 'jquery.placeholder',
- 'jquery.mw-jump',
- 'mediawiki.util',
- ),
- ),
- 'mediawiki.page.startup' => array(
- 'scripts' => 'resources/mediawiki.page/mediawiki.page.startup.js',
- 'dependencies' => array(
- 'jquery.client',
- 'mediawiki.util',
- ),
- 'position' => 'top',
- ),
- 'mediawiki.page.watch.ajax' => array(
- 'scripts' => 'resources/mediawiki.page/mediawiki.page.watch.ajax.js',
- 'dependencies' => array(
- 'mediawiki.page.startup',
- 'mediawiki.api.watch',
- 'mediawiki.util',
- 'mediawiki.notify',
- 'jquery.mwExtension',
- ),
- 'messages' => array(
- 'watch',
- 'unwatch',
- 'watching',
- 'unwatching',
- 'tooltip-ca-watch',
- 'tooltip-ca-unwatch',
- 'watcherrortext',
- ),
- ),
-
- /* MediaWiki Special pages */
-
- 'mediawiki.special' => array(
- 'scripts' => 'resources/mediawiki.special/mediawiki.special.js',
- 'styles' => 'resources/mediawiki.special/mediawiki.special.css',
- ),
- 'mediawiki.special.block' => array(
- 'scripts' => 'resources/mediawiki.special/mediawiki.special.block.js',
- 'dependencies' => array(
- 'mediawiki.util',
- ),
- ),
- 'mediawiki.special.changeemail' => array(
- 'scripts' => 'resources/mediawiki.special/mediawiki.special.changeemail.js',
- 'styles' => 'resources/mediawiki.special/mediawiki.special.changeemail.css',
- 'dependencies' => array(
- 'mediawiki.util',
- ),
- 'messages' => array(
- 'email-address-validity-valid',
- 'email-address-validity-invalid',
- ),
- ),
- 'mediawiki.special.changeslist' => array(
- 'styles' => 'resources/mediawiki.special/mediawiki.special.changeslist.css',
- 'dependencies' => array( 'jquery.makeCollapsible' ),
- ),
- 'mediawiki.special.movePage' => array(
- 'scripts' => 'resources/mediawiki.special/mediawiki.special.movePage.js',
- 'dependencies' => 'jquery.byteLimit',
- ),
- 'mediawiki.special.preferences' => array(
- 'scripts' => 'resources/mediawiki.special/mediawiki.special.preferences.js',
- 'styles' => 'resources/mediawiki.special/mediawiki.special.preferences.css',
- ),
- 'mediawiki.special.recentchanges' => array(
- 'scripts' => 'resources/mediawiki.special/mediawiki.special.recentchanges.js',
- 'dependencies' => array( 'mediawiki.special' ),
- 'position' => 'top',
- ),
- 'mediawiki.special.search' => array(
- 'scripts' => 'resources/mediawiki.special/mediawiki.special.search.js',
- 'styles' => 'resources/mediawiki.special/mediawiki.special.search.css',
- 'messages' => array(
- 'powersearch-togglelabel',
- 'powersearch-toggleall',
- 'powersearch-togglenone',
- ),
- ),
- 'mediawiki.special.undelete' => array(
- 'scripts' => 'resources/mediawiki.special/mediawiki.special.undelete.js',
- ),
- 'mediawiki.special.upload' => array(
- // @TODO: merge in remainder of mediawiki.legacy.upload
- 'scripts' => 'resources/mediawiki.special/mediawiki.special.upload.js',
- 'messages' => array(
- 'widthheight',
- 'size-bytes',
- 'size-kilobytes',
- 'size-megabytes',
- 'size-gigabytes',
- 'largefileserver',
- ),
- 'dependencies' => array( 'mediawiki.libs.jpegmeta', 'mediawiki.util' ),
- ),
- 'mediawiki.special.javaScriptTest' => array(
- 'scripts' => 'resources/mediawiki.special/mediawiki.special.javaScriptTest.js',
- 'messages' => array_merge( Skin::getSkinNameMessages(), array(
- 'colon-separator',
- 'javascripttest-pagetext-skins',
- ) ),
- 'dependencies' => array( 'jquery.qunit' ),
- 'position' => 'top',
- ),
-
- /* MediaWiki Tests */
-
- 'mediawiki.tests.qunit.testrunner' => array(
- 'scripts' => 'tests/qunit/data/testrunner.js',
- 'dependencies' => array(
- 'jquery.qunit',
- 'jquery.qunit.completenessTest',
- 'mediawiki.page.startup',
- 'mediawiki.page.ready',
- ),
- 'position' => 'top',
- ),
-
- /* MediaWiki Legacy */
-
- 'mediawiki.legacy.ajax' => array(
- 'scripts' => 'common/ajax.js',
- 'remoteBasePath' => $GLOBALS['wgStylePath'],
- 'localBasePath' => $GLOBALS['wgStyleDirectory'],
- 'dependencies' => array(
- 'mediawiki.util',
- 'mediawiki.legacy.wikibits',
- ),
- 'position' => 'top', // Temporary hack for legacy support
- ),
- '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.IEFixes' => array(
- 'scripts' => 'common/IEFixes.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' => array(
- 'mediawiki.legacy.wikibits',
- 'jquery.byteLimit',
- ),
- 'position' => 'top',
- ),
- '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' => array(
- 'mediawiki.legacy.wikibits',
- 'mediawiki.util',
- ),
- ),
- 'mediawiki.legacy.wikibits' => array(
- 'scripts' => 'common/wikibits.js',
- 'remoteBasePath' => $GLOBALS['wgStylePath'],
- 'localBasePath' => $GLOBALS['wgStyleDirectory'],
- 'dependencies' => array(
- 'mediawiki.util',
- ),
- 'position' => 'top',
- ),
- 'mediawiki.legacy.wikiprintable' => array(
- 'styles' => array( 'common/wikiprintable.css' => array( 'media' => 'print' ) ),
- 'remoteBasePath' => $GLOBALS['wgStylePath'],
- 'localBasePath' => $GLOBALS['wgStyleDirectory'],
- ),
-);
diff --git a/resources/jquery.chosen/LICENSE b/resources/jquery.chosen/LICENSE
new file mode 100644
index 00000000..0675dc52
--- /dev/null
+++ b/resources/jquery.chosen/LICENSE
@@ -0,0 +1,24 @@
+# Chosen, a Select Box Enhancer for jQuery and Protoype
+## by Patrick Filler for [Harvest](http://getharvest.com)
+
+Available for use under the [MIT License](http://en.wikipedia.org/wiki/MIT_License)
+
+Copyright (c) 2011-2013 by Harvest
+
+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.
diff --git a/resources/jquery.chosen/chosen-sprite.png b/resources/jquery.chosen/chosen-sprite.png
new file mode 100644
index 00000000..3611ae4a
--- /dev/null
+++ b/resources/jquery.chosen/chosen-sprite.png
Binary files differ
diff --git a/resources/jquery.chosen/chosen-sprite@2x.png b/resources/jquery.chosen/chosen-sprite@2x.png
new file mode 100644
index 00000000..bd61d963
--- /dev/null
+++ b/resources/jquery.chosen/chosen-sprite@2x.png
Binary files differ
diff --git a/resources/jquery.chosen/chosen.css b/resources/jquery.chosen/chosen.css
new file mode 100644
index 00000000..17793ed7
--- /dev/null
+++ b/resources/jquery.chosen/chosen.css
@@ -0,0 +1,440 @@
+/* @group Base */
+.chzn-container {
+ font-size: 13px;
+ position: relative;
+ display: inline-block;
+ vertical-align: middle;
+ zoom: 1;
+ *display: inline;
+}
+.chzn-container .chzn-drop {
+ background: #fff;
+ border: 1px solid #aaa;
+ border-top: 0;
+ position: absolute;
+ top: 100%;
+ left: -9999px;
+ -webkit-box-shadow: 0 4px 5px rgba(0,0,0,.15);
+ -moz-box-shadow : 0 4px 5px rgba(0,0,0,.15);
+ box-shadow : 0 4px 5px rgba(0,0,0,.15);
+ z-index: 1010;
+ width: 100%;
+ -moz-box-sizing : border-box;
+ -ms-box-sizing : border-box;
+ -webkit-box-sizing: border-box;
+ -khtml-box-sizing : border-box;
+ box-sizing : border-box;
+}
+
+.chzn-container.chzn-with-drop .chzn-drop {
+ left: 0;
+}
+
+/* @end */
+
+/* @group Single Chosen */
+.chzn-container-single .chzn-single {
+ background-color: #ffffff;
+ filter: progid:DXImageTransform.Microsoft.gradient( startColorstr='#ffffff', endColorstr='#eeeeee', GradientType=0 );
+ background-image: -webkit-gradient(linear, 0 0, 0 100%, color-stop(20%, #ffffff), color-stop(50%, #f6f6f6), color-stop(52%, #eeeeee), color-stop(100%, #f4f4f4));
+ background-image: -webkit-linear-gradient(top, #ffffff 20%, #f6f6f6 50%, #eeeeee 52%, #f4f4f4 100%);
+ background-image: -moz-linear-gradient(top, #ffffff 20%, #f6f6f6 50%, #eeeeee 52%, #f4f4f4 100%);
+ background-image: -o-linear-gradient(top, #ffffff 20%, #f6f6f6 50%, #eeeeee 52%, #f4f4f4 100%);
+ background-image: linear-gradient(#ffffff 20%, #f6f6f6 50%, #eeeeee 52%, #f4f4f4 100%);
+ -webkit-border-radius: 5px;
+ -moz-border-radius : 5px;
+ border-radius : 5px;
+ -moz-background-clip : padding;
+ -webkit-background-clip: padding-box;
+ background-clip : padding-box;
+ border: 1px solid #aaaaaa;
+ -webkit-box-shadow: 0 0 3px #ffffff inset, 0 1px 1px rgba(0,0,0,0.1);
+ -moz-box-shadow : 0 0 3px #ffffff inset, 0 1px 1px rgba(0,0,0,0.1);
+ box-shadow : 0 0 3px #ffffff inset, 0 1px 1px rgba(0,0,0,0.1);
+ display: block;
+ overflow: hidden;
+ white-space: nowrap;
+ position: relative;
+ height: 23px;
+ line-height: 24px;
+ padding: 0 0 0 8px;
+ color: #444444;
+ text-decoration: none;
+}
+.chzn-container-single .chzn-default {
+ color: #999;
+}
+.chzn-container-single .chzn-single span {
+ margin-right: 26px;
+ display: block;
+ overflow: hidden;
+ white-space: nowrap;
+ -o-text-overflow: ellipsis;
+ -ms-text-overflow: ellipsis;
+ text-overflow: ellipsis;
+}
+.chzn-container-single .chzn-single abbr {
+ display: block;
+ position: absolute;
+ right: 26px;
+ top: 6px;
+ width: 12px;
+ height: 12px;
+ font-size: 1px;
+ background: url('chosen-sprite.png') -42px 1px no-repeat;
+}
+.chzn-container-single .chzn-single abbr:hover {
+ background-position: -42px -10px;
+}
+.chzn-container-single.chzn-disabled .chzn-single abbr:hover {
+ background-position: -42px -10px;
+}
+.chzn-container-single .chzn-single div {
+ position: absolute;
+ right: 0;
+ top: 0;
+ display: block;
+ height: 100%;
+ width: 18px;
+}
+.chzn-container-single .chzn-single div b {
+ background: url('chosen-sprite.png') no-repeat 0px 2px;
+ display: block;
+ width: 100%;
+ height: 100%;
+}
+.chzn-container-single .chzn-search {
+ padding: 3px 4px;
+ position: relative;
+ margin: 0;
+ white-space: nowrap;
+ z-index: 1010;
+}
+.chzn-container-single .chzn-search input {
+ background: #fff url('chosen-sprite.png') no-repeat 100% -20px;
+ background: url('chosen-sprite.png') no-repeat 100% -20px, -webkit-gradient(linear, 0 0, 0 100%, color-stop(1%, #eeeeee), color-stop(15%, #ffffff));
+ background: url('chosen-sprite.png') no-repeat 100% -20px, -webkit-linear-gradient(top, #eeeeee 1%, #ffffff 15%);
+ background: url('chosen-sprite.png') no-repeat 100% -20px, -moz-linear-gradient(top, #eeeeee 1%, #ffffff 15%);
+ background: url('chosen-sprite.png') no-repeat 100% -20px, -o-linear-gradient(top, #eeeeee 1%, #ffffff 15%);
+ background: url('chosen-sprite.png') no-repeat 100% -20px, linear-gradient(#eeeeee 1%, #ffffff 15%);
+ margin: 1px 0;
+ padding: 4px 20px 4px 5px;
+ outline: 0;
+ border: 1px solid #aaa;
+ font-family: sans-serif;
+ font-size: 1em;
+ width: 100%;
+ -moz-box-sizing : border-box;
+ -ms-box-sizing : border-box;
+ -webkit-box-sizing: border-box;
+ -khtml-box-sizing : border-box;
+ box-sizing : border-box;
+}
+.chzn-container-single .chzn-drop {
+ margin-top: -1px;
+ -webkit-border-radius: 0 0 4px 4px;
+ -moz-border-radius : 0 0 4px 4px;
+ border-radius : 0 0 4px 4px;
+ -moz-background-clip : padding;
+ -webkit-background-clip: padding-box;
+ background-clip : padding-box;
+}
+.chzn-container-single-nosearch .chzn-search {
+ position: absolute;
+ left: -9999px;
+}
+/* @end */
+
+/* @group Multi Chosen */
+.chzn-container-multi .chzn-choices {
+ background-color: #fff;
+ background-image: -webkit-gradient(linear, 0 0, 0 100%, color-stop(1%, #eeeeee), color-stop(15%, #ffffff));
+ background-image: -webkit-linear-gradient(top, #eeeeee 1%, #ffffff 15%);
+ background-image: -moz-linear-gradient(top, #eeeeee 1%, #ffffff 15%);
+ background-image: -o-linear-gradient(top, #eeeeee 1%, #ffffff 15%);
+ background-image: linear-gradient(#eeeeee 1%, #ffffff 15%);
+ border: 1px solid #aaa;
+ margin: 0;
+ padding: 0;
+ cursor: text;
+ overflow: hidden;
+ height: auto !important;
+ height: 1%;
+ position: relative;
+ width: 100%;
+ -moz-box-sizing : border-box;
+ -ms-box-sizing : border-box;
+ -webkit-box-sizing: border-box;
+ -khtml-box-sizing : border-box;
+ box-sizing : border-box;
+}
+.chzn-container-multi .chzn-choices li {
+ float: left;
+ list-style: none;
+}
+.chzn-container-multi .chzn-choices .search-field {
+ white-space: nowrap;
+ margin: 0;
+ padding: 0;
+}
+.chzn-container-multi .chzn-choices .search-field input {
+ color: #666;
+ background: transparent !important;
+ border: 0 !important;
+ font-family: sans-serif;
+ font-size: 100%;
+ height: 15px;
+ padding: 5px;
+ margin: 1px 0;
+ outline: 0;
+ -webkit-box-shadow: none;
+ -moz-box-shadow : none;
+ box-shadow : none;
+}
+.chzn-container-multi .chzn-choices .search-field .default {
+ color: #999;
+}
+.chzn-container-multi .chzn-choices .search-choice {
+ -webkit-border-radius: 3px;
+ -moz-border-radius : 3px;
+ border-radius : 3px;
+ -moz-background-clip : padding;
+ -webkit-background-clip: padding-box;
+ background-clip : padding-box;
+ background-color: #e4e4e4;
+ filter: progid:DXImageTransform.Microsoft.gradient( startColorstr='#f4f4f4', endColorstr='#eeeeee', GradientType=0 );
+ background-image: -webkit-gradient(linear, 0 0, 0 100%, color-stop(20%, #f4f4f4), color-stop(50%, #f0f0f0), color-stop(52%, #e8e8e8), color-stop(100%, #eeeeee));
+ background-image: -webkit-linear-gradient(top, #f4f4f4 20%, #f0f0f0 50%, #e8e8e8 52%, #eeeeee 100%);
+ background-image: -moz-linear-gradient(top, #f4f4f4 20%, #f0f0f0 50%, #e8e8e8 52%, #eeeeee 100%);
+ background-image: -o-linear-gradient(top, #f4f4f4 20%, #f0f0f0 50%, #e8e8e8 52%, #eeeeee 100%);
+ background-image: linear-gradient(#f4f4f4 20%, #f0f0f0 50%, #e8e8e8 52%, #eeeeee 100%);
+ -webkit-box-shadow: 0 0 2px #ffffff inset, 0 1px 0 rgba(0,0,0,0.05);
+ -moz-box-shadow : 0 0 2px #ffffff inset, 0 1px 0 rgba(0,0,0,0.05);
+ box-shadow : 0 0 2px #ffffff inset, 0 1px 0 rgba(0,0,0,0.05);
+ color: #333;
+ border: 1px solid #aaaaaa;
+ line-height: 13px;
+ padding: 3px 20px 3px 5px;
+ margin: 3px 0 3px 5px;
+ position: relative;
+ cursor: default;
+}
+.chzn-container-multi .chzn-choices .search-choice.search-choice-disabled {
+ background-color: #e4e4e4;
+ filter: progid:DXImageTransform.Microsoft.gradient( startColorstr='#f4f4f4', endColorstr='#eeeeee', GradientType=0 );
+ background-image: -webkit-gradient(linear, 0% 0%, 0% 100%, color-stop(20%, #f4f4f4), color-stop(50%, #f0f0f0), color-stop(52%, #e8e8e8), color-stop(100%, #eeeeee));
+ background-image: -webkit-linear-gradient(top, #f4f4f4 20%, #f0f0f0 50%, #e8e8e8 52%, #eeeeee 100%);
+ background-image: -moz-linear-gradient(top, #f4f4f4 20%, #f0f0f0 50%, #e8e8e8 52%, #eeeeee 100%);
+ background-image: -o-linear-gradient(top, #f4f4f4 20%, #f0f0f0 50%, #e8e8e8 52%, #eeeeee 100%);
+ background-image: -ms-linear-gradient(top, #f4f4f4 20%, #f0f0f0 50%, #e8e8e8 52%, #eeeeee 100%);
+ background-image: linear-gradient(top, #f4f4f4 20%, #f0f0f0 50%, #e8e8e8 52%, #eeeeee 100%);
+ color: #666;
+ border: 1px solid #cccccc;
+ padding-right: 5px;
+}
+.chzn-container-multi .chzn-choices .search-choice-focus {
+ background: #d4d4d4;
+}
+.chzn-container-multi .chzn-choices .search-choice .search-choice-close {
+ display: block;
+ position: absolute;
+ right: 3px;
+ top: 4px;
+ width: 12px;
+ height: 12px;
+ font-size: 1px;
+ background: url('chosen-sprite.png') -42px 1px no-repeat;
+}
+.chzn-container-multi .chzn-choices .search-choice .search-choice-close:hover {
+ background-position: -42px -10px;
+}
+.chzn-container-multi .chzn-choices .search-choice-focus .search-choice-close {
+ background-position: -42px -10px;
+}
+/* @end */
+
+/* @group Results */
+.chzn-container .chzn-results {
+ margin: 0 4px 4px 0;
+ max-height: 240px;
+ padding: 0 0 0 4px;
+ position: relative;
+ overflow-x: hidden;
+ overflow-y: auto;
+ -webkit-overflow-scrolling: touch;
+}
+.chzn-container-multi .chzn-results {
+ margin: 0;
+ padding: 0;
+}
+.chzn-container .chzn-results li {
+ display: none;
+ line-height: 15px;
+ padding: 5px 6px;
+ margin: 0;
+ list-style: none;
+}
+.chzn-container .chzn-results .active-result {
+ cursor: pointer;
+ display: list-item;
+}
+.chzn-container .chzn-results .highlighted {
+ background-color: #3875d7;
+ filter: progid:DXImageTransform.Microsoft.gradient( startColorstr='#3875d7', endColorstr='#2a62bc', GradientType=0 );
+ background-image: -webkit-gradient(linear, 0 0, 0 100%, color-stop(20%, #3875d7), color-stop(90%, #2a62bc));
+ background-image: -webkit-linear-gradient(top, #3875d7 20%, #2a62bc 90%);
+ background-image: -moz-linear-gradient(top, #3875d7 20%, #2a62bc 90%);
+ background-image: -o-linear-gradient(top, #3875d7 20%, #2a62bc 90%);
+ background-image: linear-gradient(#3875d7 20%, #2a62bc 90%);
+ color: #fff;
+}
+.chzn-container .chzn-results li em {
+ background: #feffde;
+ font-style: normal;
+}
+.chzn-container .chzn-results .highlighted em {
+ background: transparent;
+}
+.chzn-container .chzn-results .no-results {
+ background: #f4f4f4;
+ display: list-item;
+}
+.chzn-container .chzn-results .group-result {
+ cursor: default;
+ color: #999;
+ font-weight: bold;
+}
+.chzn-container .chzn-results .group-option {
+ padding-left: 15px;
+}
+.chzn-container-multi .chzn-drop .result-selected {
+ display: none;
+}
+.chzn-container .chzn-results-scroll {
+ background: white;
+ margin: 0 4px;
+ position: absolute;
+ text-align: center;
+ width: 321px; /* This should by dynamic with js */
+ z-index: 1;
+}
+.chzn-container .chzn-results-scroll span {
+ display: inline-block;
+ height: 17px;
+ text-indent: -5000px;
+ width: 9px;
+}
+.chzn-container .chzn-results-scroll-down {
+ bottom: 0;
+}
+.chzn-container .chzn-results-scroll-down span {
+ background: url('chosen-sprite.png') no-repeat -4px -3px;
+}
+.chzn-container .chzn-results-scroll-up span {
+ background: url('chosen-sprite.png') no-repeat -22px -3px;
+}
+/* @end */
+
+/* @group Active */
+.chzn-container-active .chzn-single {
+ -webkit-box-shadow: 0 0 5px rgba(0,0,0,.3);
+ -moz-box-shadow : 0 0 5px rgba(0,0,0,.3);
+ box-shadow : 0 0 5px rgba(0,0,0,.3);
+ border: 1px solid #5897fb;
+}
+.chzn-container-active.chzn-with-drop .chzn-single {
+ border: 1px solid #aaa;
+ -webkit-box-shadow: 0 1px 0 #fff inset;
+ -moz-box-shadow : 0 1px 0 #fff inset;
+ box-shadow : 0 1px 0 #fff inset;
+ background-color: #eee;
+ filter: progid:DXImageTransform.Microsoft.gradient( startColorstr='#eeeeee', endColorstr='#ffffff', GradientType=0 );
+ background-image: -webkit-gradient(linear, 0 0, 0 100%, color-stop(20%, #eeeeee), color-stop(80%, #ffffff));
+ background-image: -webkit-linear-gradient(top, #eeeeee 20%, #ffffff 80%);
+ background-image: -moz-linear-gradient(top, #eeeeee 20%, #ffffff 80%);
+ background-image: -o-linear-gradient(top, #eeeeee 20%, #ffffff 80%);
+ background-image: linear-gradient(#eeeeee 20%, #ffffff 80%);
+ -webkit-border-bottom-left-radius : 0;
+ -webkit-border-bottom-right-radius: 0;
+ -moz-border-radius-bottomleft : 0;
+ -moz-border-radius-bottomright: 0;
+ border-bottom-left-radius : 0;
+ border-bottom-right-radius: 0;
+}
+.chzn-container-active.chzn-with-drop .chzn-single div {
+ background: transparent;
+ border-left: none;
+}
+.chzn-container-active.chzn-with-drop .chzn-single div b {
+ background-position: -18px 2px;
+}
+.chzn-container-active .chzn-choices {
+ -webkit-box-shadow: 0 0 5px rgba(0,0,0,.3);
+ -moz-box-shadow : 0 0 5px rgba(0,0,0,.3);
+ box-shadow : 0 0 5px rgba(0,0,0,.3);
+ border: 1px solid #5897fb;
+}
+.chzn-container-active .chzn-choices .search-field input {
+ color: #111 !important;
+}
+/* @end */
+
+/* @group Disabled Support */
+.chzn-disabled {
+ cursor: default;
+ opacity:0.5 !important;
+}
+.chzn-disabled .chzn-single {
+ cursor: default;
+}
+.chzn-disabled .chzn-choices .search-choice .search-choice-close {
+ cursor: default;
+}
+
+/* @group Right to Left */
+.chzn-rtl { text-align: right; }
+.chzn-rtl .chzn-single { padding: 0 8px 0 0; overflow: visible; }
+.chzn-rtl .chzn-single span { margin-left: 26px; margin-right: 0; direction: rtl; }
+
+.chzn-rtl .chzn-single div { left: 3px; right: auto; }
+.chzn-rtl .chzn-single abbr {
+ left: 26px;
+ right: auto;
+}
+.chzn-rtl .chzn-choices .search-field input { direction: rtl; }
+.chzn-rtl .chzn-choices li { float: right; }
+.chzn-rtl .chzn-choices .search-choice { padding: 3px 5px 3px 19px; margin: 3px 5px 3px 0; }
+.chzn-rtl .chzn-choices .search-choice .search-choice-close { left: 4px; right: auto; }
+.chzn-rtl .chzn-search { left: 9999px; }
+.chzn-rtl.chzn-with-drop .chzn-search { left: 0px; }
+.chzn-rtl .chzn-drop { left: 9999px; }
+.chzn-rtl.chzn-container-single .chzn-results { margin: 0 0 4px 4px; padding: 0 4px 0 0; }
+.chzn-rtl .chzn-results .group-option { padding-left: 0; padding-right: 15px; }
+.chzn-rtl.chzn-container-active.chzn-with-drop .chzn-single div { border-right: none; }
+.chzn-rtl .chzn-search input {
+ background: #fff url('chosen-sprite.png') no-repeat -30px -20px;
+ background: url('chosen-sprite.png') no-repeat -30px -20px, -webkit-gradient(linear, 0 0, 0 100%, color-stop(1%, #eeeeee), color-stop(15%, #ffffff));
+ background: url('chosen-sprite.png') no-repeat -30px -20px, -webkit-linear-gradient(top, #eeeeee 1%, #ffffff 15%);
+ background: url('chosen-sprite.png') no-repeat -30px -20px, -moz-linear-gradient(top, #eeeeee 1%, #ffffff 15%);
+ background: url('chosen-sprite.png') no-repeat -30px -20px, -o-linear-gradient(top, #eeeeee 1%, #ffffff 15%);
+ background: url('chosen-sprite.png') no-repeat -30px -20px, linear-gradient(#eeeeee 1%, #ffffff 15%);
+ padding: 4px 5px 4px 20px;
+ direction: rtl;
+}
+.chzn-container-single.chzn-rtl .chzn-single div b {
+ background-position: 6px 2px;
+}
+.chzn-container-single.chzn-rtl.chzn-with-drop .chzn-single div b {
+ background-position: -12px 2px;
+}
+/* @end */
+
+/* @group Retina compatibility */
+@media only screen and (-webkit-min-device-pixel-ratio: 2), only screen and (min-resolution: 144dpi) {
+ .chzn-rtl .chzn-search input, .chzn-container-single .chzn-single abbr, .chzn-container-single .chzn-single div b, .chzn-container-single .chzn-search input, .chzn-container-multi .chzn-choices .search-choice .search-choice-close, .chzn-container .chzn-results-scroll-down span, .chzn-container .chzn-results-scroll-up span {
+ background-image: url('chosen-sprite@2x.png') !important;
+ background-repeat: no-repeat !important;
+ background-size: 52px 37px !important;
+ }
+}
+/* @end */
diff --git a/resources/jquery.chosen/chosen.jquery.js b/resources/jquery.chosen/chosen.jquery.js
new file mode 100644
index 00000000..745174f7
--- /dev/null
+++ b/resources/jquery.chosen/chosen.jquery.js
@@ -0,0 +1,1103 @@
+// Chosen, a Select Box Enhancer for jQuery and Protoype
+// by Patrick Filler for Harvest, http://getharvest.com
+//
+// Version 0.9.14
+// Full source at https://github.com/harvesthq/chosen
+// Copyright (c) 2011 Harvest http://getharvest.com
+
+// MIT License, https://github.com/harvesthq/chosen/blob/master/LICENSE.md
+// This file is generated by `cake build`, do not edit it by hand.
+(function() {
+ var SelectParser;
+
+ SelectParser = (function() {
+
+ function SelectParser() {
+ this.options_index = 0;
+ this.parsed = [];
+ }
+
+ SelectParser.prototype.add_node = function(child) {
+ if (child.nodeName.toUpperCase() === "OPTGROUP") {
+ return this.add_group(child);
+ } else {
+ return this.add_option(child);
+ }
+ };
+
+ SelectParser.prototype.add_group = function(group) {
+ var group_position, option, _i, _len, _ref, _results;
+ group_position = this.parsed.length;
+ this.parsed.push({
+ array_index: group_position,
+ group: true,
+ label: group.label,
+ children: 0,
+ disabled: group.disabled
+ });
+ _ref = group.childNodes;
+ _results = [];
+ for (_i = 0, _len = _ref.length; _i < _len; _i++) {
+ option = _ref[_i];
+ _results.push(this.add_option(option, group_position, group.disabled));
+ }
+ return _results;
+ };
+
+ SelectParser.prototype.add_option = function(option, group_position, group_disabled) {
+ if (option.nodeName.toUpperCase() === "OPTION") {
+ if (option.text !== "") {
+ if (group_position != null) {
+ this.parsed[group_position].children += 1;
+ }
+ this.parsed.push({
+ array_index: this.parsed.length,
+ options_index: this.options_index,
+ value: option.value,
+ text: option.text,
+ html: option.innerHTML,
+ selected: option.selected,
+ disabled: group_disabled === true ? group_disabled : option.disabled,
+ group_array_index: group_position,
+ classes: option.className,
+ style: option.style.cssText
+ });
+ } else {
+ this.parsed.push({
+ array_index: this.parsed.length,
+ options_index: this.options_index,
+ empty: true
+ });
+ }
+ return this.options_index += 1;
+ }
+ };
+
+ return SelectParser;
+
+ })();
+
+ SelectParser.select_to_array = function(select) {
+ var child, parser, _i, _len, _ref;
+ parser = new SelectParser();
+ _ref = select.childNodes;
+ for (_i = 0, _len = _ref.length; _i < _len; _i++) {
+ child = _ref[_i];
+ parser.add_node(child);
+ }
+ return parser.parsed;
+ };
+
+ this.SelectParser = SelectParser;
+
+}).call(this);
+
+/*
+Chosen source: generate output using 'cake build'
+Copyright (c) 2011 by Harvest
+*/
+
+
+(function() {
+ var AbstractChosen, root;
+
+ root = this;
+
+ AbstractChosen = (function() {
+
+ function AbstractChosen(form_field, options) {
+ this.form_field = form_field;
+ this.options = options != null ? options : {};
+ if (!AbstractChosen.browser_is_supported()) {
+ return;
+ }
+ this.is_multiple = this.form_field.multiple;
+ this.set_default_text();
+ this.set_default_values();
+ this.setup();
+ this.set_up_html();
+ this.register_observers();
+ this.finish_setup();
+ }
+
+ AbstractChosen.prototype.set_default_values = function() {
+ var _this = this;
+ this.click_test_action = function(evt) {
+ return _this.test_active_click(evt);
+ };
+ this.activate_action = function(evt) {
+ return _this.activate_field(evt);
+ };
+ this.active_field = false;
+ this.mouse_on_container = false;
+ this.results_showing = false;
+ this.result_highlighted = null;
+ this.result_single_selected = null;
+ this.allow_single_deselect = (this.options.allow_single_deselect != null) && (this.form_field.options[0] != null) && this.form_field.options[0].text === "" ? this.options.allow_single_deselect : false;
+ this.disable_search_threshold = this.options.disable_search_threshold || 0;
+ this.disable_search = this.options.disable_search || false;
+ this.enable_split_word_search = this.options.enable_split_word_search != null ? this.options.enable_split_word_search : true;
+ this.search_contains = this.options.search_contains || false;
+ this.choices = 0;
+ this.single_backstroke_delete = this.options.single_backstroke_delete || false;
+ this.max_selected_options = this.options.max_selected_options || Infinity;
+ return this.inherit_select_classes = this.options.inherit_select_classes || false;
+ };
+
+ AbstractChosen.prototype.set_default_text = function() {
+ if (this.form_field.getAttribute("data-placeholder")) {
+ this.default_text = this.form_field.getAttribute("data-placeholder");
+ } else if (this.is_multiple) {
+ this.default_text = this.options.placeholder_text_multiple || this.options.placeholder_text || AbstractChosen.default_multiple_text;
+ } else {
+ this.default_text = this.options.placeholder_text_single || this.options.placeholder_text || AbstractChosen.default_single_text;
+ }
+ return this.results_none_found = this.form_field.getAttribute("data-no_results_text") || this.options.no_results_text || AbstractChosen.default_no_result_text;
+ };
+
+ AbstractChosen.prototype.mouse_enter = function() {
+ return this.mouse_on_container = true;
+ };
+
+ AbstractChosen.prototype.mouse_leave = function() {
+ return this.mouse_on_container = false;
+ };
+
+ AbstractChosen.prototype.input_focus = function(evt) {
+ var _this = this;
+ if (this.is_multiple) {
+ if (!this.active_field) {
+ return setTimeout((function() {
+ return _this.container_mousedown();
+ }), 50);
+ }
+ } else {
+ if (!this.active_field) {
+ return this.activate_field();
+ }
+ }
+ };
+
+ AbstractChosen.prototype.input_blur = function(evt) {
+ var _this = this;
+ if (!this.mouse_on_container) {
+ this.active_field = false;
+ return setTimeout((function() {
+ return _this.blur_test();
+ }), 100);
+ }
+ };
+
+ AbstractChosen.prototype.result_add_option = function(option) {
+ var classes, style;
+ if (!option.disabled) {
+ option.dom_id = this.container_id + "_o_" + option.array_index;
+ classes = option.selected && this.is_multiple ? [] : ["active-result"];
+ if (option.selected) {
+ classes.push("result-selected");
+ }
+ if (option.group_array_index != null) {
+ classes.push("group-option");
+ }
+ if (option.classes !== "") {
+ classes.push(option.classes);
+ }
+ style = option.style.cssText !== "" ? " style=\"" + option.style + "\"" : "";
+ return '<li id="' + option.dom_id + '" class="' + classes.join(' ') + '"' + style + '>' + option.html + '</li>';
+ } else {
+ return "";
+ }
+ };
+
+ AbstractChosen.prototype.results_update_field = function() {
+ this.set_default_text();
+ if (!this.is_multiple) {
+ this.results_reset_cleanup();
+ }
+ this.result_clear_highlight();
+ this.result_single_selected = null;
+ return this.results_build();
+ };
+
+ AbstractChosen.prototype.results_toggle = function() {
+ if (this.results_showing) {
+ return this.results_hide();
+ } else {
+ return this.results_show();
+ }
+ };
+
+ AbstractChosen.prototype.results_search = function(evt) {
+ if (this.results_showing) {
+ return this.winnow_results();
+ } else {
+ return this.results_show();
+ }
+ };
+
+ AbstractChosen.prototype.choices_click = function(evt) {
+ evt.preventDefault();
+ if (!this.results_showing) {
+ return this.results_show();
+ }
+ };
+
+ AbstractChosen.prototype.keyup_checker = function(evt) {
+ var stroke, _ref;
+ stroke = (_ref = evt.which) != null ? _ref : evt.keyCode;
+ this.search_field_scale();
+ switch (stroke) {
+ case 8:
+ if (this.is_multiple && this.backstroke_length < 1 && this.choices > 0) {
+ return this.keydown_backstroke();
+ } else if (!this.pending_backstroke) {
+ this.result_clear_highlight();
+ return this.results_search();
+ }
+ break;
+ case 13:
+ evt.preventDefault();
+ if (this.results_showing) {
+ return this.result_select(evt);
+ }
+ break;
+ case 27:
+ if (this.results_showing) {
+ this.results_hide();
+ }
+ return true;
+ case 9:
+ case 38:
+ case 40:
+ case 16:
+ case 91:
+ case 17:
+ break;
+ default:
+ return this.results_search();
+ }
+ };
+
+ AbstractChosen.prototype.generate_field_id = function() {
+ var new_id;
+ new_id = this.generate_random_id();
+ this.form_field.id = new_id;
+ return new_id;
+ };
+
+ AbstractChosen.prototype.generate_random_char = function() {
+ var chars, newchar, rand;
+ chars = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ";
+ rand = Math.floor(Math.random() * chars.length);
+ return newchar = chars.substring(rand, rand + 1);
+ };
+
+ AbstractChosen.prototype.container_width = function() {
+ var width;
+ if (this.options.width != null) {
+ return this.options.width;
+ }
+ width = window.getComputedStyle != null ? parseFloat(window.getComputedStyle(this.form_field).getPropertyValue('width')) : (typeof jQuery !== "undefined" && jQuery !== null) && (this.form_field_jq != null) ? this.form_field_jq.outerWidth() : this.form_field.getWidth();
+ return width + "px";
+ };
+
+ AbstractChosen.browser_is_supported = function() {
+ var _ref;
+ if (window.navigator.appName === "Microsoft Internet Explorer") {
+ return (null !== (_ref = document.documentMode) && _ref >= 8);
+ }
+ return true;
+ };
+
+ AbstractChosen.default_multiple_text = "Select Some Options";
+
+ AbstractChosen.default_single_text = "Select an Option";
+
+ AbstractChosen.default_no_result_text = "No results match";
+
+ return AbstractChosen;
+
+ })();
+
+ root.AbstractChosen = AbstractChosen;
+
+}).call(this);
+
+/*
+Chosen source: generate output using 'cake build'
+Copyright (c) 2011 by Harvest
+*/
+
+
+(function() {
+ var $, Chosen, root,
+ __hasProp = {}.hasOwnProperty,
+ __extends = function(child, parent) { for (var key in parent) { if (__hasProp.call(parent, key)) child[key] = parent[key]; } function ctor() { this.constructor = child; } ctor.prototype = parent.prototype; child.prototype = new ctor(); child.__super__ = parent.prototype; return child; };
+
+ root = this;
+
+ $ = jQuery;
+
+ $.fn.extend({
+ chosen: function(options) {
+ if (!AbstractChosen.browser_is_supported()) {
+ return this;
+ }
+ return this.each(function(input_field) {
+ var $this;
+ $this = $(this);
+ if (!$this.hasClass("chzn-done")) {
+ return $this.data('chosen', new Chosen(this, options));
+ }
+ });
+ }
+ });
+
+ Chosen = (function(_super) {
+
+ __extends(Chosen, _super);
+
+ function Chosen() {
+ return Chosen.__super__.constructor.apply(this, arguments);
+ }
+
+ Chosen.prototype.setup = function() {
+ this.form_field_jq = $(this.form_field);
+ this.current_selectedIndex = this.form_field.selectedIndex;
+ return this.is_rtl = this.form_field_jq.hasClass("chzn-rtl");
+ };
+
+ Chosen.prototype.finish_setup = function() {
+ return this.form_field_jq.addClass("chzn-done");
+ };
+
+ Chosen.prototype.set_up_html = function() {
+ var container_classes, container_props;
+ this.container_id = this.form_field.id.length ? this.form_field.id.replace(/[^\w]/g, '_') : this.generate_field_id();
+ this.container_id += "_chzn";
+ container_classes = ["chzn-container"];
+ container_classes.push("chzn-container-" + (this.is_multiple ? "multi" : "single"));
+ if (this.inherit_select_classes && this.form_field.className) {
+ container_classes.push(this.form_field.className);
+ }
+ if (this.is_rtl) {
+ container_classes.push("chzn-rtl");
+ }
+ container_props = {
+ 'id': this.container_id,
+ 'class': container_classes.join(' '),
+ 'style': "width: " + (this.container_width()) + ";",
+ 'title': this.form_field.title
+ };
+ this.container = $("<div />", container_props);
+ if (this.is_multiple) {
+ this.container.html('<ul class="chzn-choices"><li class="search-field"><input type="text" value="' + this.default_text + '" class="default" autocomplete="off" style="width:auto;" /></li></ul><div class="chzn-drop"><ul class="chzn-results"></ul></div>');
+ } else {
+ this.container.html('<a href="javascript:void(0)" class="chzn-single chzn-default" tabindex="-1"><span>' + this.default_text + '</span><div><b></b></div></a><div class="chzn-drop"><div class="chzn-search"><input type="text" autocomplete="off" /></div><ul class="chzn-results"></ul></div>');
+ }
+ this.form_field_jq.hide().after(this.container);
+ this.dropdown = this.container.find('div.chzn-drop').first();
+ this.search_field = this.container.find('input').first();
+ this.search_results = this.container.find('ul.chzn-results').first();
+ this.search_field_scale();
+ this.search_no_results = this.container.find('li.no-results').first();
+ if (this.is_multiple) {
+ this.search_choices = this.container.find('ul.chzn-choices').first();
+ this.search_container = this.container.find('li.search-field').first();
+ } else {
+ this.search_container = this.container.find('div.chzn-search').first();
+ this.selected_item = this.container.find('.chzn-single').first();
+ }
+ this.results_build();
+ this.set_tab_index();
+ this.set_label_behavior();
+ return this.form_field_jq.trigger("liszt:ready", {
+ chosen: this
+ });
+ };
+
+ Chosen.prototype.register_observers = function() {
+ var _this = this;
+ this.container.mousedown(function(evt) {
+ _this.container_mousedown(evt);
+ });
+ this.container.mouseup(function(evt) {
+ _this.container_mouseup(evt);
+ });
+ this.container.mouseenter(function(evt) {
+ _this.mouse_enter(evt);
+ });
+ this.container.mouseleave(function(evt) {
+ _this.mouse_leave(evt);
+ });
+ this.search_results.mouseup(function(evt) {
+ _this.search_results_mouseup(evt);
+ });
+ this.search_results.mouseover(function(evt) {
+ _this.search_results_mouseover(evt);
+ });
+ this.search_results.mouseout(function(evt) {
+ _this.search_results_mouseout(evt);
+ });
+ this.search_results.bind('mousewheel DOMMouseScroll', function(evt) {
+ _this.search_results_mousewheel(evt);
+ });
+ this.form_field_jq.bind("liszt:updated", function(evt) {
+ _this.results_update_field(evt);
+ });
+ this.form_field_jq.bind("liszt:activate", function(evt) {
+ _this.activate_field(evt);
+ });
+ this.form_field_jq.bind("liszt:open", function(evt) {
+ _this.container_mousedown(evt);
+ });
+ this.search_field.blur(function(evt) {
+ _this.input_blur(evt);
+ });
+ this.search_field.keyup(function(evt) {
+ _this.keyup_checker(evt);
+ });
+ this.search_field.keydown(function(evt) {
+ _this.keydown_checker(evt);
+ });
+ this.search_field.focus(function(evt) {
+ _this.input_focus(evt);
+ });
+ if (this.is_multiple) {
+ return this.search_choices.click(function(evt) {
+ _this.choices_click(evt);
+ });
+ } else {
+ return this.container.click(function(evt) {
+ evt.preventDefault();
+ });
+ }
+ };
+
+ Chosen.prototype.search_field_disabled = function() {
+ this.is_disabled = this.form_field_jq[0].disabled;
+ if (this.is_disabled) {
+ this.container.addClass('chzn-disabled');
+ this.search_field[0].disabled = true;
+ if (!this.is_multiple) {
+ this.selected_item.unbind("focus", this.activate_action);
+ }
+ return this.close_field();
+ } else {
+ this.container.removeClass('chzn-disabled');
+ this.search_field[0].disabled = false;
+ if (!this.is_multiple) {
+ return this.selected_item.bind("focus", this.activate_action);
+ }
+ }
+ };
+
+ Chosen.prototype.container_mousedown = function(evt) {
+ if (!this.is_disabled) {
+ if (evt && evt.type === "mousedown" && !this.results_showing) {
+ evt.preventDefault();
+ }
+ if (!((evt != null) && ($(evt.target)).hasClass("search-choice-close"))) {
+ if (!this.active_field) {
+ if (this.is_multiple) {
+ this.search_field.val("");
+ }
+ $(document).click(this.click_test_action);
+ this.results_show();
+ } else if (!this.is_multiple && evt && (($(evt.target)[0] === this.selected_item[0]) || $(evt.target).parents("a.chzn-single").length)) {
+ evt.preventDefault();
+ this.results_toggle();
+ }
+ return this.activate_field();
+ }
+ }
+ };
+
+ Chosen.prototype.container_mouseup = function(evt) {
+ if (evt.target.nodeName === "ABBR" && !this.is_disabled) {
+ return this.results_reset(evt);
+ }
+ };
+
+ Chosen.prototype.search_results_mousewheel = function(evt) {
+ var delta, _ref, _ref1;
+ delta = -((_ref = evt.originalEvent) != null ? _ref.wheelDelta : void 0) || ((_ref1 = evt.originialEvent) != null ? _ref1.detail : void 0);
+ if (delta != null) {
+ evt.preventDefault();
+ if (evt.type === 'DOMMouseScroll') {
+ delta = delta * 40;
+ }
+ return this.search_results.scrollTop(delta + this.search_results.scrollTop());
+ }
+ };
+
+ Chosen.prototype.blur_test = function(evt) {
+ if (!this.active_field && this.container.hasClass("chzn-container-active")) {
+ return this.close_field();
+ }
+ };
+
+ Chosen.prototype.close_field = function() {
+ $(document).unbind("click", this.click_test_action);
+ this.active_field = false;
+ this.results_hide();
+ this.container.removeClass("chzn-container-active");
+ this.winnow_results_clear();
+ this.clear_backstroke();
+ this.show_search_field_default();
+ return this.search_field_scale();
+ };
+
+ Chosen.prototype.activate_field = function() {
+ this.container.addClass("chzn-container-active");
+ this.active_field = true;
+ this.search_field.val(this.search_field.val());
+ return this.search_field.focus();
+ };
+
+ Chosen.prototype.test_active_click = function(evt) {
+ if ($(evt.target).parents('#' + this.container_id).length) {
+ return this.active_field = true;
+ } else {
+ return this.close_field();
+ }
+ };
+
+ Chosen.prototype.results_build = function() {
+ var content, data, _i, _len, _ref;
+ this.parsing = true;
+ this.results_data = root.SelectParser.select_to_array(this.form_field);
+ if (this.is_multiple && this.choices > 0) {
+ this.search_choices.find("li.search-choice").remove();
+ this.choices = 0;
+ } else if (!this.is_multiple) {
+ this.selected_item.addClass("chzn-default").find("span").text(this.default_text);
+ if (this.disable_search || this.form_field.options.length <= this.disable_search_threshold) {
+ this.container.addClass("chzn-container-single-nosearch");
+ } else {
+ this.container.removeClass("chzn-container-single-nosearch");
+ }
+ }
+ content = '';
+ _ref = this.results_data;
+ for (_i = 0, _len = _ref.length; _i < _len; _i++) {
+ data = _ref[_i];
+ if (data.group) {
+ content += this.result_add_group(data);
+ } else if (!data.empty) {
+ content += this.result_add_option(data);
+ if (data.selected && this.is_multiple) {
+ this.choice_build(data);
+ } else if (data.selected && !this.is_multiple) {
+ this.selected_item.removeClass("chzn-default").find("span").text(data.text);
+ if (this.allow_single_deselect) {
+ this.single_deselect_control_build();
+ }
+ }
+ }
+ }
+ this.search_field_disabled();
+ this.show_search_field_default();
+ this.search_field_scale();
+ this.search_results.html(content);
+ return this.parsing = false;
+ };
+
+ Chosen.prototype.result_add_group = function(group) {
+ if (!group.disabled) {
+ group.dom_id = this.container_id + "_g_" + group.array_index;
+ return '<li id="' + group.dom_id + '" class="group-result">' + $("<div />").text(group.label).html() + '</li>';
+ } else {
+ return "";
+ }
+ };
+
+ Chosen.prototype.result_do_highlight = function(el) {
+ var high_bottom, high_top, maxHeight, visible_bottom, visible_top;
+ if (el.length) {
+ this.result_clear_highlight();
+ this.result_highlight = el;
+ this.result_highlight.addClass("highlighted");
+ maxHeight = parseInt(this.search_results.css("maxHeight"), 10);
+ visible_top = this.search_results.scrollTop();
+ visible_bottom = maxHeight + visible_top;
+ high_top = this.result_highlight.position().top + this.search_results.scrollTop();
+ high_bottom = high_top + this.result_highlight.outerHeight();
+ if (high_bottom >= visible_bottom) {
+ return this.search_results.scrollTop((high_bottom - maxHeight) > 0 ? high_bottom - maxHeight : 0);
+ } else if (high_top < visible_top) {
+ return this.search_results.scrollTop(high_top);
+ }
+ }
+ };
+
+ Chosen.prototype.result_clear_highlight = function() {
+ if (this.result_highlight) {
+ this.result_highlight.removeClass("highlighted");
+ }
+ return this.result_highlight = null;
+ };
+
+ Chosen.prototype.results_show = function() {
+ if (this.result_single_selected != null) {
+ this.result_do_highlight(this.result_single_selected);
+ } else if (this.is_multiple && this.max_selected_options <= this.choices) {
+ this.form_field_jq.trigger("liszt:maxselected", {
+ chosen: this
+ });
+ return false;
+ }
+ this.container.addClass("chzn-with-drop");
+ this.form_field_jq.trigger("liszt:showing_dropdown", {
+ chosen: this
+ });
+ this.results_showing = true;
+ this.search_field.focus();
+ this.search_field.val(this.search_field.val());
+ return this.winnow_results();
+ };
+
+ Chosen.prototype.results_hide = function() {
+ this.result_clear_highlight();
+ this.container.removeClass("chzn-with-drop");
+ this.form_field_jq.trigger("liszt:hiding_dropdown", {
+ chosen: this
+ });
+ return this.results_showing = false;
+ };
+
+ Chosen.prototype.set_tab_index = function(el) {
+ var ti;
+ if (this.form_field_jq.attr("tabindex")) {
+ ti = this.form_field_jq.attr("tabindex");
+ this.form_field_jq.attr("tabindex", -1);
+ return this.search_field.attr("tabindex", ti);
+ }
+ };
+
+ Chosen.prototype.set_label_behavior = function() {
+ var _this = this;
+ this.form_field_label = this.form_field_jq.parents("label");
+ if (!this.form_field_label.length && this.form_field.id.length) {
+ this.form_field_label = $("label[for=" + this.form_field.id + "]");
+ }
+ if (this.form_field_label.length > 0) {
+ return this.form_field_label.click(function(evt) {
+ if (_this.is_multiple) {
+ return _this.container_mousedown(evt);
+ } else {
+ return _this.activate_field();
+ }
+ });
+ }
+ };
+
+ Chosen.prototype.show_search_field_default = function() {
+ if (this.is_multiple && this.choices < 1 && !this.active_field) {
+ this.search_field.val(this.default_text);
+ return this.search_field.addClass("default");
+ } else {
+ this.search_field.val("");
+ return this.search_field.removeClass("default");
+ }
+ };
+
+ Chosen.prototype.search_results_mouseup = function(evt) {
+ var target;
+ target = $(evt.target).hasClass("active-result") ? $(evt.target) : $(evt.target).parents(".active-result").first();
+ if (target.length) {
+ this.result_highlight = target;
+ this.result_select(evt);
+ return this.search_field.focus();
+ }
+ };
+
+ Chosen.prototype.search_results_mouseover = function(evt) {
+ var target;
+ target = $(evt.target).hasClass("active-result") ? $(evt.target) : $(evt.target).parents(".active-result").first();
+ if (target) {
+ return this.result_do_highlight(target);
+ }
+ };
+
+ Chosen.prototype.search_results_mouseout = function(evt) {
+ if ($(evt.target).hasClass("active-result" || $(evt.target).parents('.active-result').first())) {
+ return this.result_clear_highlight();
+ }
+ };
+
+ Chosen.prototype.choice_build = function(item) {
+ var choice_id, html, link,
+ _this = this;
+ if (this.is_multiple && this.max_selected_options <= this.choices) {
+ this.form_field_jq.trigger("liszt:maxselected", {
+ chosen: this
+ });
+ return false;
+ }
+ choice_id = this.container_id + "_c_" + item.array_index;
+ this.choices += 1;
+ if (item.disabled) {
+ html = '<li class="search-choice search-choice-disabled" id="' + choice_id + '"><span>' + item.html + '</span></li>';
+ } else {
+ html = '<li class="search-choice" id="' + choice_id + '"><span>' + item.html + '</span><a href="javascript:void(0)" class="search-choice-close" rel="' + item.array_index + '"></a></li>';
+ }
+ this.search_container.before(html);
+ link = $('#' + choice_id).find("a").first();
+ return link.click(function(evt) {
+ return _this.choice_destroy_link_click(evt);
+ });
+ };
+
+ Chosen.prototype.choice_destroy_link_click = function(evt) {
+ evt.preventDefault();
+ evt.stopPropagation();
+ if (!this.is_disabled) {
+ return this.choice_destroy($(evt.target));
+ }
+ };
+
+ Chosen.prototype.choice_destroy = function(link) {
+ if (this.result_deselect(link.attr("rel"))) {
+ this.choices -= 1;
+ this.show_search_field_default();
+ if (this.is_multiple && this.choices > 0 && this.search_field.val().length < 1) {
+ this.results_hide();
+ }
+ link.parents('li').first().remove();
+ return this.search_field_scale();
+ }
+ };
+
+ Chosen.prototype.results_reset = function() {
+ this.form_field.options[0].selected = true;
+ this.selected_item.find("span").text(this.default_text);
+ if (!this.is_multiple) {
+ this.selected_item.addClass("chzn-default");
+ }
+ this.show_search_field_default();
+ this.results_reset_cleanup();
+ this.form_field_jq.trigger("change");
+ if (this.active_field) {
+ return this.results_hide();
+ }
+ };
+
+ Chosen.prototype.results_reset_cleanup = function() {
+ this.current_selectedIndex = this.form_field.selectedIndex;
+ return this.selected_item.find("abbr").remove();
+ };
+
+ Chosen.prototype.result_select = function(evt) {
+ var high, high_id, item, position;
+ if (this.result_highlight) {
+ high = this.result_highlight;
+ high_id = high.attr("id");
+ this.result_clear_highlight();
+ if (this.is_multiple) {
+ this.result_deactivate(high);
+ } else {
+ this.search_results.find(".result-selected").removeClass("result-selected");
+ this.result_single_selected = high;
+ this.selected_item.removeClass("chzn-default");
+ }
+ high.addClass("result-selected");
+ position = high_id.substr(high_id.lastIndexOf("_") + 1);
+ item = this.results_data[position];
+ item.selected = true;
+ this.form_field.options[item.options_index].selected = true;
+ if (this.is_multiple) {
+ this.choice_build(item);
+ } else {
+ this.selected_item.find("span").first().text(item.text);
+ if (this.allow_single_deselect) {
+ this.single_deselect_control_build();
+ }
+ }
+ if (!((evt.metaKey || evt.ctrlKey) && this.is_multiple)) {
+ this.results_hide();
+ }
+ this.search_field.val("");
+ if (this.is_multiple || this.form_field.selectedIndex !== this.current_selectedIndex) {
+ this.form_field_jq.trigger("change", {
+ 'selected': this.form_field.options[item.options_index].value
+ });
+ }
+ this.current_selectedIndex = this.form_field.selectedIndex;
+ return this.search_field_scale();
+ }
+ };
+
+ Chosen.prototype.result_activate = function(el) {
+ return el.addClass("active-result");
+ };
+
+ Chosen.prototype.result_deactivate = function(el) {
+ return el.removeClass("active-result");
+ };
+
+ Chosen.prototype.result_deselect = function(pos) {
+ var result, result_data;
+ result_data = this.results_data[pos];
+ if (!this.form_field.options[result_data.options_index].disabled) {
+ result_data.selected = false;
+ this.form_field.options[result_data.options_index].selected = false;
+ result = $("#" + this.container_id + "_o_" + pos);
+ result.removeClass("result-selected").addClass("active-result").show();
+ this.result_clear_highlight();
+ this.winnow_results();
+ this.form_field_jq.trigger("change", {
+ deselected: this.form_field.options[result_data.options_index].value
+ });
+ this.search_field_scale();
+ return true;
+ } else {
+ return false;
+ }
+ };
+
+ Chosen.prototype.single_deselect_control_build = function() {
+ if (this.allow_single_deselect && this.selected_item.find("abbr").length < 1) {
+ return this.selected_item.find("span").first().after("<abbr class=\"search-choice-close\"></abbr>");
+ }
+ };
+
+ Chosen.prototype.winnow_results = function() {
+ var found, option, part, parts, regex, regexAnchor, result, result_id, results, searchText, startpos, text, zregex, _i, _j, _len, _len1, _ref;
+ this.no_results_clear();
+ results = 0;
+ searchText = this.search_field.val() === this.default_text ? "" : $('<div/>').text($.trim(this.search_field.val())).html();
+ regexAnchor = this.search_contains ? "" : "^";
+ regex = new RegExp(regexAnchor + searchText.replace(/[-[\]{}()*+?.,\\^$|#\s]/g, "\\$&"), 'i');
+ zregex = new RegExp(searchText.replace(/[-[\]{}()*+?.,\\^$|#\s]/g, "\\$&"), 'i');
+ _ref = this.results_data;
+ for (_i = 0, _len = _ref.length; _i < _len; _i++) {
+ option = _ref[_i];
+ if (!option.disabled && !option.empty) {
+ if (option.group) {
+ $('#' + option.dom_id).css('display', 'none');
+ } else if (!(this.is_multiple && option.selected)) {
+ found = false;
+ result_id = option.dom_id;
+ result = $("#" + result_id);
+ if (regex.test(option.html)) {
+ found = true;
+ results += 1;
+ } else if (this.enable_split_word_search && (option.html.indexOf(" ") >= 0 || option.html.indexOf("[") === 0)) {
+ parts = option.html.replace(/\[|\]/g, "").split(" ");
+ if (parts.length) {
+ for (_j = 0, _len1 = parts.length; _j < _len1; _j++) {
+ part = parts[_j];
+ if (regex.test(part)) {
+ found = true;
+ results += 1;
+ }
+ }
+ }
+ }
+ if (found) {
+ if (searchText.length) {
+ startpos = option.html.search(zregex);
+ text = option.html.substr(0, startpos + searchText.length) + '</em>' + option.html.substr(startpos + searchText.length);
+ text = text.substr(0, startpos) + '<em>' + text.substr(startpos);
+ } else {
+ text = option.html;
+ }
+ result.html(text);
+ this.result_activate(result);
+ if (option.group_array_index != null) {
+ $("#" + this.results_data[option.group_array_index].dom_id).css('display', 'list-item');
+ }
+ } else {
+ if (this.result_highlight && result_id === this.result_highlight.attr('id')) {
+ this.result_clear_highlight();
+ }
+ this.result_deactivate(result);
+ }
+ }
+ }
+ }
+ if (results < 1 && searchText.length) {
+ return this.no_results(searchText);
+ } else {
+ return this.winnow_results_set_highlight();
+ }
+ };
+
+ Chosen.prototype.winnow_results_clear = function() {
+ var li, lis, _i, _len, _results;
+ this.search_field.val("");
+ lis = this.search_results.find("li");
+ _results = [];
+ for (_i = 0, _len = lis.length; _i < _len; _i++) {
+ li = lis[_i];
+ li = $(li);
+ if (li.hasClass("group-result")) {
+ _results.push(li.css('display', 'auto'));
+ } else if (!this.is_multiple || !li.hasClass("result-selected")) {
+ _results.push(this.result_activate(li));
+ } else {
+ _results.push(void 0);
+ }
+ }
+ return _results;
+ };
+
+ Chosen.prototype.winnow_results_set_highlight = function() {
+ var do_high, selected_results;
+ if (!this.result_highlight) {
+ selected_results = !this.is_multiple ? this.search_results.find(".result-selected.active-result") : [];
+ do_high = selected_results.length ? selected_results.first() : this.search_results.find(".active-result").first();
+ if (do_high != null) {
+ return this.result_do_highlight(do_high);
+ }
+ }
+ };
+
+ Chosen.prototype.no_results = function(terms) {
+ var no_results_html;
+ no_results_html = $('<li class="no-results">' + this.results_none_found + ' "<span></span>"</li>');
+ no_results_html.find("span").first().html(terms);
+ return this.search_results.append(no_results_html);
+ };
+
+ Chosen.prototype.no_results_clear = function() {
+ return this.search_results.find(".no-results").remove();
+ };
+
+ Chosen.prototype.keydown_arrow = function() {
+ var first_active, next_sib;
+ if (!this.result_highlight) {
+ first_active = this.search_results.find("li.active-result").first();
+ if (first_active) {
+ this.result_do_highlight($(first_active));
+ }
+ } else if (this.results_showing) {
+ next_sib = this.result_highlight.nextAll("li.active-result").first();
+ if (next_sib) {
+ this.result_do_highlight(next_sib);
+ }
+ }
+ if (!this.results_showing) {
+ return this.results_show();
+ }
+ };
+
+ Chosen.prototype.keyup_arrow = function() {
+ var prev_sibs;
+ if (!this.results_showing && !this.is_multiple) {
+ return this.results_show();
+ } else if (this.result_highlight) {
+ prev_sibs = this.result_highlight.prevAll("li.active-result");
+ if (prev_sibs.length) {
+ return this.result_do_highlight(prev_sibs.first());
+ } else {
+ if (this.choices > 0) {
+ this.results_hide();
+ }
+ return this.result_clear_highlight();
+ }
+ }
+ };
+
+ Chosen.prototype.keydown_backstroke = function() {
+ var next_available_destroy;
+ if (this.pending_backstroke) {
+ this.choice_destroy(this.pending_backstroke.find("a").first());
+ return this.clear_backstroke();
+ } else {
+ next_available_destroy = this.search_container.siblings("li.search-choice").last();
+ if (next_available_destroy.length && !next_available_destroy.hasClass("search-choice-disabled")) {
+ this.pending_backstroke = next_available_destroy;
+ if (this.single_backstroke_delete) {
+ return this.keydown_backstroke();
+ } else {
+ return this.pending_backstroke.addClass("search-choice-focus");
+ }
+ }
+ }
+ };
+
+ Chosen.prototype.clear_backstroke = function() {
+ if (this.pending_backstroke) {
+ this.pending_backstroke.removeClass("search-choice-focus");
+ }
+ return this.pending_backstroke = null;
+ };
+
+ Chosen.prototype.keydown_checker = function(evt) {
+ var stroke, _ref;
+ stroke = (_ref = evt.which) != null ? _ref : evt.keyCode;
+ this.search_field_scale();
+ if (stroke !== 8 && this.pending_backstroke) {
+ this.clear_backstroke();
+ }
+ switch (stroke) {
+ case 8:
+ this.backstroke_length = this.search_field.val().length;
+ break;
+ case 9:
+ if (this.results_showing && !this.is_multiple) {
+ this.result_select(evt);
+ }
+ this.mouse_on_container = false;
+ break;
+ case 13:
+ evt.preventDefault();
+ break;
+ case 38:
+ evt.preventDefault();
+ this.keyup_arrow();
+ break;
+ case 40:
+ this.keydown_arrow();
+ break;
+ }
+ };
+
+ Chosen.prototype.search_field_scale = function() {
+ var div, h, style, style_block, styles, w, _i, _len;
+ if (this.is_multiple) {
+ h = 0;
+ w = 0;
+ style_block = "position:absolute; left: -1000px; top: -1000px; display:none;";
+ styles = ['font-size', 'font-style', 'font-weight', 'font-family', 'line-height', 'text-transform', 'letter-spacing'];
+ for (_i = 0, _len = styles.length; _i < _len; _i++) {
+ style = styles[_i];
+ style_block += style + ":" + this.search_field.css(style) + ";";
+ }
+ div = $('<div />', {
+ 'style': style_block
+ });
+ div.text(this.search_field.val());
+ $('body').append(div);
+ w = div.width() + 25;
+ div.remove();
+ if (!this.f_width) {
+ this.f_width = this.container.outerWidth();
+ }
+ if (w > this.f_width - 10) {
+ w = this.f_width - 10;
+ }
+ return this.search_field.css({
+ 'width': w + 'px'
+ });
+ }
+ };
+
+ Chosen.prototype.generate_random_id = function() {
+ var string;
+ string = "sel" + this.generate_random_char() + this.generate_random_char() + this.generate_random_char();
+ while ($("#" + string).length > 0) {
+ string += this.generate_random_char();
+ }
+ return string;
+ };
+
+ return Chosen;
+
+ })(AbstractChosen);
+
+ root.Chosen = Chosen;
+
+}).call(this);
diff --git a/resources/jquery.tipsy/images/tipsy.png b/resources/jquery.tipsy/images/tipsy.png
index fef8c4b5..ef17cc32 100644
--- a/resources/jquery.tipsy/images/tipsy.png
+++ b/resources/jquery.tipsy/images/tipsy.png
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
index 5b5dab2a..e425e6e4 100644
--- 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
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
index ac8b229a..72d47573 100644
--- 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
Binary files differ
diff --git a/resources/jquery.ui/themes/default/images/ui-bg_glass_55_fbf9ee_1x400.png b/resources/jquery.ui/themes/default/images/ui-bg_glass_55_fbf9ee_1x400.png
index ad3d6346..3b2914a2 100644
--- a/resources/jquery.ui/themes/default/images/ui-bg_glass_55_fbf9ee_1x400.png
+++ b/resources/jquery.ui/themes/default/images/ui-bg_glass_55_fbf9ee_1x400.png
Binary files differ
diff --git a/resources/jquery.ui/themes/default/images/ui-bg_glass_65_ffffff_1x400.png b/resources/jquery.ui/themes/default/images/ui-bg_glass_65_ffffff_1x400.png
index 42ccba26..8569c1bc 100644
--- a/resources/jquery.ui/themes/default/images/ui-bg_glass_65_ffffff_1x400.png
+++ b/resources/jquery.ui/themes/default/images/ui-bg_glass_65_ffffff_1x400.png
Binary files differ
diff --git a/resources/jquery.ui/themes/default/images/ui-bg_glass_75_dadada_1x400.png b/resources/jquery.ui/themes/default/images/ui-bg_glass_75_dadada_1x400.png
index 5a46b47c..d6cc3c58 100644
--- a/resources/jquery.ui/themes/default/images/ui-bg_glass_75_dadada_1x400.png
+++ b/resources/jquery.ui/themes/default/images/ui-bg_glass_75_dadada_1x400.png
Binary files differ
diff --git a/resources/jquery.ui/themes/default/images/ui-bg_highlight-soft_75_cccccc_1x100.png b/resources/jquery.ui/themes/default/images/ui-bg_highlight-soft_75_cccccc_1x100.png
index 7c9fa6c6..3cd467e1 100644
--- a/resources/jquery.ui/themes/default/images/ui-bg_highlight-soft_75_cccccc_1x100.png
+++ b/resources/jquery.ui/themes/default/images/ui-bg_highlight-soft_75_cccccc_1x100.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
index ee039dc0..9a9606f7 100644
--- a/resources/jquery.ui/themes/default/images/ui-icons_222222_256x240.png
+++ 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
index 45e8928e..08d26179 100644
--- a/resources/jquery.ui/themes/default/images/ui-icons_2e83ff_256x240.png
+++ 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
index 7ec70d11..80cb644a 100644
--- a/resources/jquery.ui/themes/default/images/ui-icons_454545_256x240.png
+++ 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
index 5ba708c3..8373712d 100644
--- a/resources/jquery.ui/themes/default/images/ui-icons_888888_256x240.png
+++ 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
index 7930a558..34fc8937 100644
--- a/resources/jquery.ui/themes/default/images/ui-icons_cd0a0a_256x240.png
+++ b/resources/jquery.ui/themes/default/images/ui-icons_cd0a0a_256x240.png
Binary files differ
diff --git a/resources/jquery.ui/themes/vector/images/button-blue-hover-large.png b/resources/jquery.ui/themes/vector/images/button-blue-hover-large.png
deleted file mode 100644
index 8f7cf74e..00000000
--- a/resources/jquery.ui/themes/vector/images/button-blue-hover-large.png
+++ /dev/null
Binary files differ
diff --git a/resources/jquery.ui/themes/vector/images/button-blue-hover.png b/resources/jquery.ui/themes/vector/images/button-blue-hover.png
deleted file mode 100644
index 1fc28163..00000000
--- a/resources/jquery.ui/themes/vector/images/button-blue-hover.png
+++ /dev/null
Binary files differ
diff --git a/resources/jquery.ui/themes/vector/images/button-blue-large.png b/resources/jquery.ui/themes/vector/images/button-blue-large.png
deleted file mode 100644
index 22ee5e59..00000000
--- a/resources/jquery.ui/themes/vector/images/button-blue-large.png
+++ /dev/null
Binary files differ
diff --git a/resources/jquery.ui/themes/vector/images/button-blue.png b/resources/jquery.ui/themes/vector/images/button-blue.png
deleted file mode 100644
index 2e6d121a..00000000
--- a/resources/jquery.ui/themes/vector/images/button-blue.png
+++ /dev/null
Binary files differ
diff --git a/resources/jquery.ui/themes/vector/images/button-disabled-blue.png b/resources/jquery.ui/themes/vector/images/button-disabled-blue.png
deleted file mode 100644
index 28eb1fcd..00000000
--- a/resources/jquery.ui/themes/vector/images/button-disabled-blue.png
+++ /dev/null
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
deleted file mode 100644
index 0e29d85b..00000000
--- a/resources/jquery.ui/themes/vector/images/button-disabled-green.png
+++ /dev/null
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
deleted file mode 100644
index ede69988..00000000
--- a/resources/jquery.ui/themes/vector/images/button-disabled-red.png
+++ /dev/null
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
deleted file mode 100644
index e4e4ec1c..00000000
--- a/resources/jquery.ui/themes/vector/images/button-disabled.png
+++ /dev/null
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
deleted file mode 100644
index 766e5746..00000000
--- a/resources/jquery.ui/themes/vector/images/button-down-blue.png
+++ /dev/null
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
deleted file mode 100644
index 90969c39..00000000
--- a/resources/jquery.ui/themes/vector/images/button-down-green.png
+++ /dev/null
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
deleted file mode 100644
index f6257298..00000000
--- a/resources/jquery.ui/themes/vector/images/button-down-red.png
+++ /dev/null
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
deleted file mode 100644
index c6467571..00000000
--- a/resources/jquery.ui/themes/vector/images/button-down.png
+++ /dev/null
Binary files differ
diff --git a/resources/jquery.ui/themes/vector/images/button-green-hover-large.png b/resources/jquery.ui/themes/vector/images/button-green-hover-large.png
deleted file mode 100644
index dd8851e1..00000000
--- a/resources/jquery.ui/themes/vector/images/button-green-hover-large.png
+++ /dev/null
Binary files differ
diff --git a/resources/jquery.ui/themes/vector/images/button-green-hover.png b/resources/jquery.ui/themes/vector/images/button-green-hover.png
deleted file mode 100644
index 19c39911..00000000
--- a/resources/jquery.ui/themes/vector/images/button-green-hover.png
+++ /dev/null
Binary files differ
diff --git a/resources/jquery.ui/themes/vector/images/button-green-large.png b/resources/jquery.ui/themes/vector/images/button-green-large.png
deleted file mode 100644
index a8e830eb..00000000
--- a/resources/jquery.ui/themes/vector/images/button-green-large.png
+++ /dev/null
Binary files differ
diff --git a/resources/jquery.ui/themes/vector/images/button-green.png b/resources/jquery.ui/themes/vector/images/button-green.png
deleted file mode 100644
index 54c418e9..00000000
--- a/resources/jquery.ui/themes/vector/images/button-green.png
+++ /dev/null
Binary files differ
diff --git a/resources/jquery.ui/themes/vector/images/button-large-disabled-green.png b/resources/jquery.ui/themes/vector/images/button-large-disabled-green.png
deleted file mode 100644
index f76f7b05..00000000
--- a/resources/jquery.ui/themes/vector/images/button-large-disabled-green.png
+++ /dev/null
Binary files differ
diff --git a/resources/jquery.ui/themes/vector/images/button-large-off-green.png b/resources/jquery.ui/themes/vector/images/button-large-off-green.png
deleted file mode 100644
index f997431b..00000000
--- a/resources/jquery.ui/themes/vector/images/button-large-off-green.png
+++ /dev/null
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
deleted file mode 100644
index 82dedb53..00000000
--- a/resources/jquery.ui/themes/vector/images/button-off-blue.png
+++ /dev/null
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
deleted file mode 100644
index 109907f0..00000000
--- a/resources/jquery.ui/themes/vector/images/button-off-green.png
+++ /dev/null
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
deleted file mode 100644
index 5a85b8aa..00000000
--- a/resources/jquery.ui/themes/vector/images/button-off-red.png
+++ /dev/null
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
deleted file mode 100644
index cc5eb119..00000000
--- a/resources/jquery.ui/themes/vector/images/button-off.png
+++ /dev/null
Binary files differ
diff --git a/resources/jquery.ui/themes/vector/images/button-orange-hover-large.png b/resources/jquery.ui/themes/vector/images/button-orange-hover-large.png
deleted file mode 100644
index 6f0dbd5d..00000000
--- a/resources/jquery.ui/themes/vector/images/button-orange-hover-large.png
+++ /dev/null
Binary files differ
diff --git a/resources/jquery.ui/themes/vector/images/button-orange-hover.png b/resources/jquery.ui/themes/vector/images/button-orange-hover.png
deleted file mode 100644
index a1077c58..00000000
--- a/resources/jquery.ui/themes/vector/images/button-orange-hover.png
+++ /dev/null
Binary files differ
diff --git a/resources/jquery.ui/themes/vector/images/button-orange-large.png b/resources/jquery.ui/themes/vector/images/button-orange-large.png
deleted file mode 100644
index 3d7f37f6..00000000
--- a/resources/jquery.ui/themes/vector/images/button-orange-large.png
+++ /dev/null
Binary files differ
diff --git a/resources/jquery.ui/themes/vector/images/button-orange.png b/resources/jquery.ui/themes/vector/images/button-orange.png
deleted file mode 100644
index 02347cf9..00000000
--- a/resources/jquery.ui/themes/vector/images/button-orange.png
+++ /dev/null
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
deleted file mode 100644
index 9edb7aa2..00000000
--- a/resources/jquery.ui/themes/vector/images/button-over-blue.png
+++ /dev/null
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
deleted file mode 100644
index 47a0b1b8..00000000
--- a/resources/jquery.ui/themes/vector/images/button-over-green.png
+++ /dev/null
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
deleted file mode 100644
index a2445365..00000000
--- a/resources/jquery.ui/themes/vector/images/button-over-red.png
+++ /dev/null
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
deleted file mode 100644
index 558f1f80..00000000
--- a/resources/jquery.ui/themes/vector/images/button-over.png
+++ /dev/null
Binary files differ
diff --git a/resources/jquery.ui/themes/vector/images/button-red-hover-large.png b/resources/jquery.ui/themes/vector/images/button-red-hover-large.png
deleted file mode 100644
index 11ccef06..00000000
--- a/resources/jquery.ui/themes/vector/images/button-red-hover-large.png
+++ /dev/null
Binary files differ
diff --git a/resources/jquery.ui/themes/vector/images/button-red-hover.png b/resources/jquery.ui/themes/vector/images/button-red-hover.png
deleted file mode 100644
index 55a61743..00000000
--- a/resources/jquery.ui/themes/vector/images/button-red-hover.png
+++ /dev/null
Binary files differ
diff --git a/resources/jquery.ui/themes/vector/images/button-red-large.png b/resources/jquery.ui/themes/vector/images/button-red-large.png
deleted file mode 100644
index 8d089efd..00000000
--- a/resources/jquery.ui/themes/vector/images/button-red-large.png
+++ /dev/null
Binary files differ
diff --git a/resources/jquery.ui/themes/vector/images/button-red.png b/resources/jquery.ui/themes/vector/images/button-red.png
deleted file mode 100644
index 7a292fc1..00000000
--- a/resources/jquery.ui/themes/vector/images/button-red.png
+++ /dev/null
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
index f9fde8b3..12a80c88 100644
--- a/resources/jquery.ui/themes/vector/images/titlebar-fade.png
+++ b/resources/jquery.ui/themes/vector/images/titlebar-fade.png
Binary files differ
diff --git a/resources/jquery.ui/themes/vector/jquery.ui.button.css b/resources/jquery.ui/themes/vector/jquery.ui.button.css
index a6a1b544..ea14723f 100644
--- a/resources/jquery.ui/themes/vector/jquery.ui.button.css
+++ b/resources/jquery.ui/themes/vector/jquery.ui.button.css
@@ -12,23 +12,12 @@
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;
+ text-shadow: 0 1px 1px #fff;
}
.ui-button-text-only .ui-button-text {
padding: 0.3em 1em 0.25em 1em;
@@ -90,7 +79,7 @@ input.ui-button {
}
.ui-buttonset .ui-button {
margin-left: 0;
- margin-right: -.3em;
+ margin-right: -.4em;
}
/* workarounds */
@@ -98,17 +87,21 @@ button.ui-button::-moz-focus-inner {
border: 0;
padding: 0; /* reset extra padding in Firefox */
}
-
-body .ui-button {
- margin: 0.5em 0 0.5em 0.4em;
- border: 1px solid #a6a6a6 !important;
+/* Disables the annoying dashed border Firefox puts on active buttons */
+body button.ui-button::-moz-focus-inner {
+ border: 0;
+}
+/* Give large buttons some extra padding */
+body .ui-button-large {
+ padding: 5px;
+}
+/* Use white icons for colored buttons */
+.ui-button-green .ui-icon,
+.ui-button-blue .ui-icon,
+.ui-button-red .ui-icon,
+.ui-button-orange .ui-icon {
/* @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;
+ background-image: url(images/ui-icons_ffffff_256x240.png) !important;
}
/* Corner radius */
@@ -124,6 +117,7 @@ body .ui-button {
}
.ui-button.ui-corner-all,
.ui-button.ui-corner-top,
+
.ui-button.ui-corner-right,
.ui-button.ui-corner-tr {
-moz-border-radius-topright: 4px;
@@ -147,145 +141,239 @@ body .ui-button {
border-bottom-right-radius: 4px;
}
-body .ui-button:hover {
- border-color: #6e7273;
- /* @embed */
- background: #e1e1e1 url(images/button-over.png) repeat-x scroll 50% 100% !important;
-}
-body .ui-button:active,
-body .ui-button:focus {
- border-color: #707271;
- /* @embed */
- background: #bfbfbf url(images/button-down.png) repeat-x scroll 50% 100% !important;
+body .ui-button {
+ color: #2779aa;
+ margin: 0.5em 0 0.5em 0.4em;
+ border: 1px solid #aaa !important;
+ background: #f0f0f0 !important;
+ background: -moz-linear-gradient(top, #fff 0%, #ddd 90%) !important; /* FF3.6+ */
+ background: -webkit-linear-gradient(top, #fff 0%, #ddd 90%) !important; /* Chrome10+, Safari5.1+ */
+ background: -o-linear-gradient(top, #fff 0%, #ddd 90%) !important; /* Opera 11.10+ */
+ background: -ms-linear-gradient(top, #fff 0%, #ddd 90%) !important; /* IE10+ */
+ background: linear-gradient(to bottom, #fff 0%, #ddd 90%) !important;
+ filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffffff', endColorstr='#dddddd', GradientType=0); /* IE6-8 */
+ cursor: pointer;
+ font-size: 1em;
+ line-height: 1.4em;
+ width: auto;
+ overflow: visible;
+ -webkit-box-shadow: 0 1px 3px rgba(0,0,0,.2);
+ -moz-box-shadow: 0 1px 3px rgba(0,0,0,.2);
+ box-shadow: 0 1px 3px rgba(0,0,0,.2);
}
-body .ui-button.disabled {
- color: #7f7f7f;
- border-color: #cccccc;
- /* @embed */
- background: #f2f2f2 url(images/button-disabled.png) repeat-x scroll 50% 100% !important;
+
+body .ui-button-icon-only {
+ width: 2.2em;
}
-/* Disables the annoying dashed border Firefox puts on active buttons */
-body button.ui-button::-moz-focus-inner {
- border: 0;
+
+body .ui-button-icons-only {
+ width: 3.4em;
}
-/* Give large buttons some extra padding */
-body .ui-button-large {
- padding: 5px;
+
+body .ui-button:hover {
+ color: #2779aa;
+ border-color: #bbb !important;
+ background: #fff !important;
+ background: -moz-linear-gradient(top, #fff 0%, #eee 90%) !important; /* FF3.6+ */
+ background: -webkit-linear-gradient(top, #fff 0%, #eee 90%) !important; /* Chrome10+, Safari5.1+ */
+ background: -o-linear-gradient(top, #fff 0%, #eee 90%) !important; /* Opera 11.10+ */
+ background: -ms-linear-gradient(top, #fff 0%, #eee 90%) !important; /* IE10+ */
+ background: linear-gradient(to bottom, #fff 0%, #eee 90%) !important;
+ filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffffff', endColorstr='#eeeeee', GradientType=0); /* IE6-8 */
+ -webkit-box-shadow: 0 1px 3px rgba(0,0,0,.1);
+ -moz-box-shadow: 0 1px 3px rgba(0,0,0,.1);
+ box-shadow: 0 1px 3px rgba(0,0,0,.1);
}
-/* Use white icons for colored buttons */
-.ui-button-green .ui-icon, .ui-button-blue .ui-icon, .ui-button-red .ui-icon, .ui-button-orange .ui-icon {
- /* @embed */
- background-image: url(images/ui-icons_ffffff_256x240.png) !important;
+body .ui-button:active,
+body .ui-button:focus {
+ border-color: #8ad !important;
+ -webkit-box-shadow: 0 0 1px 1px rgba(167,215,249,.5);
+ -moz-box-shadow: 0 0 1px 1px rgba(167,215,249,.5);
+ box-shadow: 0 0 1px 1px rgba(167,215,249,.5);
+}
+body .ui-button:active {
+ background: #e0e0e0 !important;
+ background: -moz-linear-gradient(top, #f0f0f0 0%, #d0d0d0 90%) !important; /* FF3.6+ */
+ background: -webkit-linear-gradient(top, #f0f0f0 0%, #d0d0d0 90%) !important; /* Chrome10+, Safari5.1+ */
+ background: -o-linear-gradient(top, #f0f0f0 0%, #d0d0d0 90%) !important; /* Opera 11.10+ */
+ background: -ms-linear-gradient(top, #f0f0f0 0%, #d0d0d0 90%) !important; /* IE10+ */
+ background: linear-gradient(to bottom, #f0f0f0 0%, #d0d0d0 90%) !important;
+ filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#f0f0f0', endColorstr='#d0d0d0', GradientType=0); /* IE6-8 */
}
/* Green buttons */
-
+body .ui-button-green,
+body .ui-button-green .ui-button-text {
+ color: white;
+ text-shadow: 0 -1px 1px #072;
+}
body .ui-button.ui-button-green {
- color: white !important;
- border-color: #97af7e !important;
- /* @embed */
- background: #3cb677 url(images/button-green.png) repeat-x scroll 50% 100% !important;
+ border-color: #294 !important;
+ background: #295 !important;
+ background: -moz-linear-gradient(top, #3c8 0%, #295 90%) !important; /* FF3.6+ */
+ background: -webkit-linear-gradient(top, #3c8 0%, #295 90%) !important; /* Chrome10+, Safari5.1+ */
+ background: -o-linear-gradient(top, #3c8 0%, #295 90%) !important; /* Opera 11.10+ */
+ background: -ms-linear-gradient(top, #3c8 0%, #295 90%) !important; /* IE10+ */
+ background: linear-gradient(to bottom, #3c8 0%, #295 90%) !important;
+ filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#33cc88', endColorstr='#229955', GradientType=0); /* IE6-8 */
+ -webkit-box-shadow: 0 1px 3px rgba(0,0,0,.3);
+ -moz-box-shadow: 0 1px 3px rgba(0,0,0,.3);
+ box-shadow: 0 1px 3px rgba(0,0,0,.3);
}
body .ui-button.ui-button-green:hover {
- border-color: #778e61 !important;
- /* @embed */
- background: #339b65 url(images/button-green-hover.png) repeat-x scroll 50% 100% !important;
-}
-body .ui-button.ui-button-green.ui-button-large {
- /* @embed */
- background: #3cb677 url(images/button-green-large.png) repeat-x scroll 50% 100% !important;
-}
-body .ui-button.ui-button-green.ui-button-large:hover {
- /* @embed */
- background: #339b65 url(images/button-green-hover-large.png) repeat-x scroll 50% 100% !important;
-}
-body .ui-button.ui-button-green.disabled {
- filter:alpha(opacity=50);
- -moz-opacity:0.50;
- -khtml-opacity: 0.50;
- opacity: 0.50;
+ background: #33a055 !important;
+ background: -moz-linear-gradient(top, #44d388 0%, #33a055 90%) !important; /* FF3.6+ */
+ background: -webkit-linear-gradient(top, #44d388 0%, #33a055 90%) !important; /* Chrome10+, Safari5.1+ */
+ background: -o-linear-gradient(top, #44d388 0%, #33a055 90%) !important; /* Opera 11.10+ */
+ background: -ms-linear-gradient(top, #44d388 0%, #33a055 90%) !important; /* IE10+ */
+ background: linear-gradient(to bottom, #44d388 0%, #33a055 90%) !important;
+ filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#44d388', endColorstr='#33a055', GradientType=0); /* IE6-8 */
+ -webkit-box-shadow: 0 1px 3px rgba(0,0,0,.25);
+ -moz-box-shadow: 0 1px 3px rgba(0,0,0,.25);
+ box-shadow: 0 1px 3px rgba(0,0,0,.25);
+}
+body .ui-button.ui-button-green:active,
+body .ui-button.ui-button-green:focus {
+ border-color: #172 !important;
+ -webkit-box-shadow: 0 0 2px 2px rgba(167,215,249,.75);
+ -moz-box-shadow: 0 0 2px 2px rgba(167,215,249,.75);
+ box-shadow: 0 0 2px 2px rgba(167,215,249,.75);
+}
+body .ui-button.ui-button-green:active {
+ background: #338855 !important;
+ background: -moz-linear-gradient(top, #30c080 0%, #338855 90%) !important; /* FF3.6+ */
+ background: -webkit-linear-gradient(top, #30c080 0%, #338855 90%) !important; /* Chrome10+, Safari5.1+ */
+ background: -o-linear-gradient(top, #30c080 0%, #338855 90%) !important; /* Opera 11.10+ */
+ background: -ms-linear-gradient(top, #30c080 0%, #338855 90%) !important; /* IE10+ */
+ background: linear-gradient(to bottom, #30c080 0%, #338855 90%) !important;
+ filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#30c080', endColorstr='#338855', GradientType=0); /* IE6-8 */
}
/* Blue buttons */
-
+body .ui-button-blue,
+body .ui-button-blue .ui-button-text {
+ color: white;
+ text-shadow: 0 -1px 1px #037;
+}
body .ui-button.ui-button-blue {
- color: white !important;
- border-color: #628acb !important;
- /* @embed */
- background: #3365ba url(images/button-blue.png) repeat-x scroll 50% 100% !important;
+ border-color: #468 !important;
+ background: #36b !important;
+ background: -moz-linear-gradient(top, #48e 0%, #36b 90%) !important; /* FF3.6+ */
+ background: -webkit-linear-gradient(top, #48e 0%, #36b 90%) !important; /* Chrome10+, Safari5.1+ */
+ background: -o-linear-gradient(top, #48e 0%, #36b 90%) !important; /* Opera 11.10+ */
+ background: -ms-linear-gradient(top, #48e 0%, #36b 90%) !important; /* IE10+ */
+ background: linear-gradient(to bottom, #48e 0%, #36b 90%) !important;
+ filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#4488ee', endColorstr='#3366bb', GradientType=0); /* IE6-8 */
+ -webkit-box-shadow: 0 1px 3px rgba(0,0,0,.35);
+ -moz-box-shadow: 0 1px 3px rgba(0,0,0,.35);
+ box-shadow: 0 1px 3px rgba(0,0,0,.35);
}
body .ui-button.ui-button-blue:hover {
- border-color: #5375ad !important;
- /* @embed */
- background: #2b569e url(images/button-blue-hover.png) repeat-x scroll 50% 100% !important;
-}
-body .ui-button.ui-button-blue.ui-button-large {
- /* @embed */
- background: #3365ba url(images/button-blue-large.png) repeat-x scroll 50% 100% !important;
-}
-body .ui-button.ui-button-blue.ui-button-large:hover {
- /* @embed */
- background: #2b569e url(images/button-blue-hover-large.png) repeat-x scroll 50% 100% !important;
-}
-body .ui-button.ui-button-blue.disabled {
- filter:alpha(opacity=50);
- -moz-opacity:0.50;
- -khtml-opacity: 0.50;
- opacity: 0.50;
+ background: #36c !important;
+ background: -moz-linear-gradient(top, #59e 0%, #36c 90%) !important; /* FF3.6+ */
+ background: -webkit-linear-gradient(top, #59e 0%, #36c 90%) !important; /* Chrome10+, Safari5.1+ */
+ background: -o-linear-gradient(top, #59e 0%, #36c 90%) !important; /* Opera 11.10+ */
+ background: -ms-linear-gradient(top, #59e 0%, #36c 90%) !important; /* IE10+ */
+ background: linear-gradient(to bottom, #59e 0%, #36c 90%) !important;
+ filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#5599ee', endColorstr='#3366cc', GradientType=0); /* IE6-8 */
+}
+body .ui-button.ui-button-blue:active,
+body .ui-button.ui-button-blue:focus {
+ border-color: #357 !important;
+ -webkit-box-shadow: 0 0 2px 2px rgba(167,215,249,.75);
+ -moz-box-shadow: 0 0 2px 2px rgba(167,215,249,.75);
+ box-shadow: 0 0 2px 2px rgba(167,215,249,.75);
+}
+body .ui-button.ui-button-blue:active {
+ background: #3060a0 !important;
+ background: -moz-linear-gradient(top, #4080e0 0%, #3060a0 90%) !important; /* FF3.6+ */
+ background: -webkit-linear-gradient(top, #4080e0 0%, #3060a0 90%) !important; /* Chrome10+, Safari5.1+ */
+ background: -o-linear-gradient(top, #4080e0 0%, #3060a0 90%) !important; /* Opera 11.10+ */
+ background: -ms-linear-gradient(top, #4080e0 0%, #3060a0 90%) !important; /* IE10+ */
+ background: linear-gradient(to bottom, #4080e0 0%, #3060a0 90%) !important;
+ filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#4080e0', endColorstr='#3060a0', GradientType=0); /* IE6-8 */
}
/* Red buttons */
-
+body .ui-button-red,
+body .ui-button-red .ui-button-text {
+ color: white;
+ text-shadow: 0 -1px 1px #700;
+}
body .ui-button.ui-button-red {
- color: white !important;
- border-color: #af977e !important;
- /* @embed */
- background: #cb0000 url(images/button-red.png) repeat-x scroll 50% 100% !important;
+ border-color: #944 !important;
+ background: #a22 !important;
+ background: -moz-linear-gradient(top, #d44 0%, #a22 90%) !important; /* FF3.6+ */
+ background: -webkit-linear-gradient(top, #d44 0%, #a22 90%) !important; /* Chrome10+, Safari5.1+ */
+ background: -o-linear-gradient(top, #d44 0%, #a22 90%) !important; /* Opera 11.10+ */
+ background: -ms-linear-gradient(top, #d44 0%, #a22 90%) !important; /* IE10+ */
+ background: linear-gradient(to bottom, #d44 0%, #a22 90%) !important;
+ filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#dd4444', endColorstr='#aa2222', GradientType=0); /* IE6-8 */
+ -webkit-box-shadow: 0 1px 3px rgba(0,0,0,.35);
+ -moz-box-shadow: 0 1px 3px rgba(0,0,0,.35);
+ box-shadow: 0 1px 3px rgba(0,0,0,.35);
}
body .ui-button.ui-button-red:hover {
- border-color: #8e7761 !important;
- /* @embed */
- background: #ad0000 url(images/button-red-hover.png) repeat-x scroll 50% 100% !important;
-}
-body .ui-button.ui-button-red.ui-button-large {
- /* @embed */
- background: #cb0000 url(images/button-red.png) repeat-x scroll 50% 100% !important;
-}
-body .ui-button.ui-button-red.ui-button-large:hover {
- /* @embed */
- background: #ad0000 url(images/button-red-hover.png) repeat-x scroll 50% 100% !important;
-}
-body .ui-button.ui-button-red.disabled {
- filter:alpha(opacity=50);
- -moz-opacity:0.50;
- -khtml-opacity: 0.50;
- opacity: 0.50;
+ border-color: #a44 !important;
+ background: #b03333 !important;
+ background: -moz-linear-gradient(top, #ee4646 0%, #b03333 90%) !important; /* FF3.6+ */
+ background: -webkit-linear-gradient(top, #ee4646 0%, #b03333 90%) !important; /* Chrome10+, Safari5.1+ */
+ background: -o-linear-gradient(top, #ee4646 0%, #b03333 90%) !important; /* Opera 11.10+ */
+ background: -ms-linear-gradient(top, #ee4646 0%, #b03333 90%) !important; /* IE10+ */
+ background: linear-gradient(to bottom, #ee4646 0%, #b03333 90%) !important;
+ filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ee4646', endColorstr='#b03333', GradientType=0); /* IE6-8 */
+ -webkit-box-shadow: 0 1px 3px rgba(0,0,0,.3);
+ -moz-box-shadow: 0 1px 3px rgba(0,0,0,.3);
+ box-shadow: 0 1px 3px rgba(0,0,0,.3);
+}
+body .ui-button.ui-button-red:active,
+body .ui-button.ui-button-red:focus {
+ border-color: #747 !important;
+ -webkit-box-shadow: 0 0 2px 2px rgba(167,215,249,.7);
+ -moz-box-shadow: 0 0 2px 2px rgba(167,215,249,.7);
+ box-shadow: 0 0 2px 2px rgba(167,215,249,.7);
+}
+body .ui-button.ui-button-red:active {
+ background: #952020 !important;
+ background: -moz-linear-gradient(top, #d04545 0%, #952020 90%) !important; /* FF3.6+ */
+ background: -webkit-linear-gradient(top, #d04545 0%, #952020 90%) !important; /* Chrome10+, Safari5.1+ */
+ background: -o-linear-gradient(top, #d04545 0%, #952020 90%) !important; /* Opera 11.10+ */
+ background: -ms-linear-gradient(top, #d04545 0%, #952020 90%) !important; /* IE10+ */
+ background: linear-gradient(to bottom, #d04545 0%, #952020 90%) !important;
+ filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#d04545', endColorstr='#952020', GradientType=0); /* IE6-8 */
}
-/* Orange buttons */
-
-body .ui-button.ui-button-orange {
- color: white !important;
- border-color: #f3a863 !important;
- /* @embed */
- background: #f07f14 url(images/button-orange.png) repeat-x scroll 50% 100% !important;
-}
-body .ui-button.ui-button-orange:hover {
- border-color: #ce9055 !important;
- /* @embed */
- background: #cc6c11 url(images/button-orange-hover.png) repeat-x scroll 50% 100% !important;
-}
-body .ui-button.ui-button-orange.ui-button-large {
- /* @embed */
- background: #f07f14 url(images/button-orange-large.png) repeat-x scroll 50% 100% !important;
-}
-body .ui-button.ui-button-orange.ui-button-large:hover {
- /* @embed */
- background: #cc6c11 url(images/button-orange-hover-large.png) repeat-x scroll 50% 100% !important;
-}
-body .ui-button.ui-button-orange.disabled {
- filter:alpha(opacity=50);
- -moz-opacity:0.50;
- -khtml-opacity: 0.50;
- opacity: 0.50;
+/* Disabled buttons */
+body .ui-button-green.disabled,
+body .ui-button-green.disabled:hover,
+body .ui-button-green.disabled:active,
+body .ui-button-green.disabled:focus,
+body .ui-button-blue.disabled,
+body .ui-button-blue.disabled:hover,
+body .ui-button-blue.disabled:active,
+body .ui-button-blue.disabled:focus,
+body .ui-button-red.disabled,
+body .ui-button-red.disabled:hover,
+body .ui-button-red.disabled:active,
+body .ui-button-red.disabled:focus,
+body .ui-button.disabled,
+body .ui-button.disabled:hover {
+ color: #aaa;
+ border-color: #ccc !important;
+ background: #eee !important;
+ background: -moz-linear-gradient(top, #f6f6f6 0%, #eee 90%) !important; /* FF3.6+ */
+ background: -webkit-linear-gradient(top, #f6f6f6 0%, #eee 90%) !important; /* Chrome10+, Safari5.1+ */
+ background: -o-linear-gradient(top, #f6f6f6 0%, #eee 90%) !important; /* Opera 11.10+ */
+ background: -ms-linear-gradient(top, #f6f6f6 0%, #eee 90%) !important; /* IE10+ */
+ background: linear-gradient(to bottom, #f6f6f6 0%, #eee 90%) !important;
+ filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#f6f6f6', endColorstr='#eeeeee', GradientType=0); /* IE6-8 */
+ -webkit-box-shadow: 0 1px 3px rgba(0,0,0,0);
+ -moz-box-shadow: 0 1px 3px rgba(0,0,0,0);
+ box-shadow: 0 1px 3px rgba(0,0,0,0);
+}
+body .ui-button-green.disabled .ui-button-text,
+body .ui-button-blue.disabled .ui-button-text,
+body .ui-button-red.disabled .ui-button-text {
+ color: #aaa;
+ text-shadow: 0 1px 1px #fff;
}
diff --git a/resources/jquery/images/jquery.arrowSteps.divider-ltr.png b/resources/jquery/images/jquery.arrowSteps.divider-ltr.png
index 83d6ff84..84ed2a2d 100644
--- a/resources/jquery/images/jquery.arrowSteps.divider-ltr.png
+++ b/resources/jquery/images/jquery.arrowSteps.divider-ltr.png
Binary files differ
diff --git a/resources/jquery/images/jquery.arrowSteps.divider-rtl.png b/resources/jquery/images/jquery.arrowSteps.divider-rtl.png
index 529d7b84..7cfbfeba 100644
--- a/resources/jquery/images/jquery.arrowSteps.divider-rtl.png
+++ b/resources/jquery/images/jquery.arrowSteps.divider-rtl.png
Binary files differ
diff --git a/resources/jquery/images/jquery.arrowSteps.head-ltr.png b/resources/jquery/images/jquery.arrowSteps.head-ltr.png
index 3289617d..eb070280 100644
--- a/resources/jquery/images/jquery.arrowSteps.head-ltr.png
+++ b/resources/jquery/images/jquery.arrowSteps.head-ltr.png
Binary files differ
diff --git a/resources/jquery/images/jquery.arrowSteps.head-rtl.png b/resources/jquery/images/jquery.arrowSteps.head-rtl.png
index 3d9f70cb..7ea2fdb5 100644
--- a/resources/jquery/images/jquery.arrowSteps.head-rtl.png
+++ b/resources/jquery/images/jquery.arrowSteps.head-rtl.png
Binary files differ
diff --git a/resources/jquery/images/jquery.arrowSteps.tail-ltr.png b/resources/jquery/images/jquery.arrowSteps.tail-ltr.png
index 92b872b2..3ad990b6 100644
--- a/resources/jquery/images/jquery.arrowSteps.tail-ltr.png
+++ b/resources/jquery/images/jquery.arrowSteps.tail-ltr.png
Binary files differ
diff --git a/resources/jquery/images/marker.png b/resources/jquery/images/marker.png
index 3929bbb5..19efb6ce 100644
--- a/resources/jquery/images/marker.png
+++ b/resources/jquery/images/marker.png
Binary files differ
diff --git a/resources/jquery/images/mask.png b/resources/jquery/images/mask.png
index b0a4d406..fe08de0e 100644
--- a/resources/jquery/images/mask.png
+++ b/resources/jquery/images/mask.png
Binary files differ
diff --git a/resources/jquery/jquery.badge.css b/resources/jquery/jquery.badge.css
index d961bf3d..f313663e 100644
--- a/resources/jquery/jquery.badge.css
+++ b/resources/jquery/jquery.badge.css
@@ -1,13 +1,12 @@
.mw-badge {
min-width: 7px;
- -moz-border-radius: 2px;
- -webkit-border-radius: 2px;
border-radius: 2px;
padding: 1px 4px;
text-align: center;
font-size: 12px;
line-height: 12px;
background-color: #d2d2d2;
+ cursor: pointer;
}
.mw-badge-content {
@@ -18,8 +17,12 @@
}
.mw-badge-inline {
- display: inline-block;
margin-left: 3px;
+ display: inline-block;
+ /* Hack for IE6 and IE7 (bug 47926) */
+ zoom: 1;
+ *display: inline;
+
}
.mw-badge-overlay {
position: absolute;
diff --git a/resources/jquery/jquery.byteLength.js b/resources/jquery/jquery.byteLength.js
index 3d5b7206..398937e6 100644
--- a/resources/jquery/jquery.byteLength.js
+++ b/resources/jquery/jquery.byteLength.js
@@ -4,6 +4,8 @@
* Calculate the byte length of a string (accounting for UTF-8).
*
* @author Jan Paul Posma, 2011
+ * @author Timo Tijhof, 2012
+ * @author David Chan, 2013
*/
jQuery.byteLength = function ( str ) {
@@ -12,8 +14,18 @@ jQuery.byteLength = function ( str ) {
// 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.
+
+ // https://en.wikipedia.org/wiki/UTF-8#Description
+ // The mapping from UTF-16 code units to UTF-8 bytes is as follows:
+ // > Range 0000-007F: codepoints that become 1 byte of UTF-8
+ // > Range 0080-07FF: codepoints that become 2 bytes of UTF-8
+ // > Range 0800-D7FF: codepoints that become 3 bytes of UTF-8
+ // > Range D800-DFFF: Surrogates (each pair becomes 4 bytes of UTF-8)
+ // > Range E000-FFFF: codepoints that become 3 bytes of UTF-8 (continued)
+
return str
.replace( /[\u0080-\u07FF\uD800-\uDFFF]/g, '**' )
.replace( /[\u0800-\uD7FF\uE000-\uFFFF]/g, '***' )
.length;
+
};
diff --git a/resources/jquery/jquery.byteLimit.js b/resources/jquery/jquery.byteLimit.js
index f2b98f09..a8c0b065 100644
--- a/resources/jquery/jquery.byteLimit.js
+++ b/resources/jquery/jquery.byteLimit.js
@@ -78,7 +78,8 @@
// Chop off characters from the end of the "inserted content" string
// until the limit is statisfied.
if ( fn ) {
- while ( $.byteLength( fn( inpParts.join( '' ) ) ) > byteLimit ) {
+ // stop, when there is nothing to slice - bug 41450
+ while ( $.byteLength( fn( inpParts.join( '' ) ) ) > byteLimit && inpParts[1].length > 0 ) {
inpParts[1] = inpParts[1].slice( 0, -1 );
}
} else {
diff --git a/resources/jquery/jquery.checkboxShiftClick.js b/resources/jquery/jquery.checkboxShiftClick.js
index aced0633..b2065665 100644
--- a/resources/jquery/jquery.checkboxShiftClick.js
+++ b/resources/jquery/jquery.checkboxShiftClick.js
@@ -15,11 +15,17 @@
$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
- ).prop( 'checked', !!e.target.checked );
+ // Check or uncheck this one and all in-between checkboxes,
+ // except for disabled ones
+ $box
+ .slice(
+ Math.min( $box.index( prevCheckbox ), $box.index( e.target ) ),
+ Math.max( $box.index( prevCheckbox ), $box.index( e.target ) ) + 1
+ )
+ .filter( function () {
+ return !this.disabled;
+ } )
+ .prop( 'checked', !!e.target.checked );
}
// Either way, update the prevCheckbox variable to the one clicked now
prevCheckbox = e.target;
diff --git a/resources/jquery/jquery.client.js b/resources/jquery/jquery.client.js
index b0bd6850..5a95dc5b 100644
--- a/resources/jquery/jquery.client.js
+++ b/resources/jquery/jquery.client.js
@@ -6,7 +6,7 @@
/* Private Members */
/**
- * @var profileCache {Object} Keyed by userAgent string,
+ * @var {Object} profileCache Keyed by userAgent string,
* value is the parsed $.client.profile object for that user agent.
*/
var profileCache = {};
@@ -18,9 +18,9 @@
/**
* Get an object containing information about the client.
*
- * @param nav {Object} An object with atleast a 'userAgent' and 'platform' key.
+ * @param {Object} nav An object with atleast a 'userAgent' and 'platform' key.
* Defaults to the global Navigator object.
- * @return {Object} The resulting client object will be in the following format:
+ * @returns {Object} The resulting client object will be in the following format:
* {
* 'name': 'firefox',
* 'layout': 'gecko',
@@ -50,47 +50,47 @@
// Generic version digit
x = 'x',
// Strings found in user agent strings that need to be conformed
- wildUserAgents = ['Opera', 'Navigator', 'Minefield', 'KHTML', 'Chrome', 'PLAYSTATION 3'],
+ wildUserAgents = ['Opera', 'Navigator', 'Minefield', 'KHTML', 'Chrome', 'PLAYSTATION 3', 'Iceweasel'],
// Translations for conforming user agent strings
userAgentTranslations = [
// Tons of browsers lie about being something they are not
- [/(Firefox|MSIE|KHTML,\slike\sGecko|Konqueror)/, ''],
+ [/(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
+ // This helps keep different 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
+ // Strings which precede a version number in a user agent string - combined and used as
+ // match 1 in version detection
versionPrefixes = [
'camino', 'chrome', 'firefox', 'iceweasel', 'netscape', 'netscape6', 'opera', 'version', 'konqueror',
- 'lynx', 'msie', 'safari', 'ps3'
+ 'lynx', 'msie', 'safari', 'ps3', 'android'
],
// Used as matches 2, 3 and 4 in version extraction - 3 is used as actual version number
versionSuffix = '(\\/|\\;?\\s|)([a-z0-9\\.\\+]*?)(\\;|dev|rel|\\)|\\s|$)',
// Names of known browsers
names = [
'camino', 'chrome', 'firefox', 'iceweasel', 'netscape', 'konqueror', 'lynx', 'msie', 'opera',
- 'safari', 'ipod', 'iphone', 'blackberry', 'ps3', 'rekonq'
+ 'safari', 'ipod', 'iphone', 'blackberry', 'ps3', 'rekonq', 'android'
],
// Tanslations for conforming browser names
nameTranslations = [],
// Names of known layout engines
- layouts = ['gecko', 'konqueror', 'msie', 'opera', 'webkit'],
+ layouts = ['gecko', 'konqueror', 'msie', 'trident', 'opera', 'webkit'],
// Translations for conforming layout names
layoutTranslations = [ ['konqueror', 'khtml'], ['msie', 'trident'], ['opera', 'presto'] ],
// Names of supported layout engines for version number
- layoutVersions = ['applewebkit', 'gecko'],
+ layoutVersions = ['applewebkit', 'gecko', 'trident'],
// Names of known operating systems
- platforms = ['win', 'mac', 'linux', 'sunos', 'solaris', 'iphone'],
+ platforms = ['win', 'wow64', 'mac', 'linux', 'sunos', 'solaris', 'iphone'],
// Translations for conforming operating system names
- platformTranslations = [ ['sunos', 'solaris'] ],
+ platformTranslations = [ ['sunos', 'solaris'], ['wow64', 'win'] ],
/* Methods */
@@ -143,18 +143,33 @@
/* Edge Cases -- did I mention about how user agent string lie? */
// Decode Safari's crazy 400+ version numbers
- if ( name.match( /safari/ ) && version > 400 ) {
+ if ( name === 'safari' && version > 400 ) {
version = '2.0';
}
// Expose Opera 10's lies about being Opera 9.8
- if ( name === 'opera' && version >= 9.8) {
- match = ua.match( /version\/([0-9\.]*)/i );
+ if ( name === 'opera' && version >= 9.8 ) {
+ match = ua.match( /\bversion\/([0-9\.]*)/ );
if ( match && match[1] ) {
version = match[1];
} else {
version = '10';
}
}
+ // And Opera 15's lies about being Chrome
+ if ( name === 'chrome' && ( match = ua.match( /\bopr\/([0-9\.]*)/ ) ) ) {
+ if ( match[1] ) {
+ name = 'opera';
+ version = match[1];
+ }
+ }
+ // And IE 11's lies about being not being IE
+ if ( layout === 'trident' && layoutversion >= 7 && ( match = ua.match( /\brv[ :\/]([0-9\.]*)/ ) ) ) {
+ if ( match[1] ) {
+ name = 'msie';
+ version = match[1];
+ }
+ }
+
versionNumber = parseFloat( version, 10 ) || 0.0;
/* Caching */
@@ -173,46 +188,61 @@
},
/**
- * 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.
+ * Checks the current browser against a support map object.
*
* A browser map is in the following format:
* {
+ * // Multiple rules with configurable operators
+ * 'msie': [['>=', 7], ['!=', 9]],
+ * // Match no versions
+ * 'iphone': false,
+ * // Match any version
+ * 'android': null
+ * }
+ *
+ * It can optionally be split into ltr/rtl sections:
+ * {
* 'ltr': {
- * // Multiple rules with configurable operators
- * 'msie': [['>=', 7], ['!=', 9]],
- * // Blocked entirely
+ * 'android': null,
* '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
+ * 'android': false,
+ * // rules are not inherited from ltr
* 'iphone': false
* }
* }
*
- * @param map {Object} Browser support map
- * @param profile {Object} (optional) a client-profile object.
+ * @param {Object} map Browser support map
+ * @param {Object} [profile] A client-profile object
+ * @param {boolean} [exactMatchOnly=false] Only return true if the browser is matched, otherwise
+ * returns true if the browser is not found.
*
- * @return Boolean true if browser known or assumed to be supported, false if blacklisted
+ * @returns {boolean} The current browser is in the support map
*/
- test: function ( map, profile ) {
+ test: function ( map, profile, exactMatchOnly ) {
/*jshint evil: true */
var conditions, dir, i, op, val;
profile = $.isPlainObject( profile ) ? profile : $.client.profile();
- dir = $( 'body' ).is( '.rtl' ) ? 'rtl' : 'ltr';
+ if ( map.ltr && map.rtl ) {
+ dir = $( 'body' ).is( '.rtl' ) ? 'rtl' : 'ltr';
+ map = map[dir];
+ }
// Check over each browser condition to determine if we are running in a compatible client
- if ( typeof map[dir] !== 'object' || map[dir][profile.name] === undefined ) {
- // Unknown, so we assume it's working
- return true;
+ if ( typeof map !== 'object' || map[profile.name] === undefined ) {
+ // Not found, return true if exactMatchOnly not set, false otherwise
+ return !exactMatchOnly;
}
- conditions = map[dir][profile.name];
+ conditions = map[profile.name];
if ( conditions === false ) {
+ // Match no versions
return false;
}
+ if ( conditions === null ) {
+ // Match all versions
+ return true;
+ }
for ( i = 0; i < conditions.length; i++ ) {
op = conditions[i][0];
val = conditions[i][1];
diff --git a/resources/jquery/jquery.makeCollapsible.js b/resources/jquery/jquery.makeCollapsible.js
index 1407f53b..0cd6417c 100644
--- a/resources/jquery/jquery.makeCollapsible.js
+++ b/resources/jquery/jquery.makeCollapsible.js
@@ -18,13 +18,15 @@
var lpx = 'jquery.makeCollapsible> ';
/**
+ * Handler for a click on a collapsible toggler.
+ *
* @param {jQuery} $collapsible
* @param {string} action The action this function will take ('expand' or 'collapse').
* @param {jQuery|null} [optional] $defaultToggle
* @param {Object|undefined} options
*/
function toggleElement( $collapsible, action, $defaultToggle, options ) {
- var $collapsibleContent, $containers;
+ var $collapsibleContent, $containers, hookCallback;
options = options || {};
// Validate parameters
@@ -47,6 +49,14 @@
return;
}
+ // Trigger a custom event to allow callers to hook to the collapsing/expanding,
+ // allowing the module to be testable, and making it possible to
+ // e.g. implement persistence via cookies
+ $collapsible.trigger( action === 'expand' ? 'beforeExpand.mw-collapsible' : 'beforeCollapse.mw-collapsible' );
+ hookCallback = function () {
+ $collapsible.trigger( action === 'expand' ? 'afterExpand.mw-collapsible' : 'afterCollapse.mw-collapsible' );
+ };
+
// Handle different kinds of elements
if ( !options.plainMode && $collapsible.is( 'table' ) ) {
@@ -63,11 +73,12 @@
// http://stackoverflow.com/questions/467336#920480
if ( options.instantHide ) {
$containers.hide();
+ hookCallback();
} else {
- $containers.stop( true, true ).fadeOut();
+ $containers.stop( true, true ).fadeOut().promise().done( hookCallback );
}
} else {
- $containers.stop( true, true ).fadeIn();
+ $containers.stop( true, true ).fadeIn().promise().done( hookCallback );
}
} else if ( !options.plainMode && ( $collapsible.is( 'ul' ) || $collapsible.is( 'ol' ) ) ) {
@@ -81,11 +92,12 @@
if ( action === 'collapse' ) {
if ( options.instantHide ) {
$containers.hide();
+ hookCallback();
} else {
- $containers.stop( true, true ).slideUp();
+ $containers.stop( true, true ).slideUp().promise().done( hookCallback );
}
} else {
- $containers.stop( true, true ).slideDown();
+ $containers.stop( true, true ).slideDown().promise().done( hookCallback );
}
} else {
@@ -97,11 +109,12 @@
if ( action === 'collapse' ) {
if ( options.instantHide ) {
$collapsibleContent.hide();
+ hookCallback();
} else {
- $collapsibleContent.slideUp();
+ $collapsibleContent.slideUp().promise().done( hookCallback );
}
} else {
- $collapsibleContent.slideDown();
+ $collapsibleContent.slideDown().promise().done( hookCallback );
}
// Otherwise assume this is a customcollapse with a remote toggle
@@ -110,18 +123,19 @@
if ( action === 'collapse' ) {
if ( options.instantHide ) {
$collapsible.hide();
+ hookCallback();
} else {
if ( $collapsible.is( 'tr' ) || $collapsible.is( 'td' ) || $collapsible.is( 'th' ) ) {
- $collapsible.fadeOut();
+ $collapsible.fadeOut().promise().done( hookCallback );
} else {
- $collapsible.slideUp();
+ $collapsible.slideUp().promise().done( hookCallback );
}
}
} else {
if ( $collapsible.is( 'tr' ) || $collapsible.is( 'td' ) || $collapsible.is( 'th' ) ) {
- $collapsible.fadeIn();
+ $collapsible.fadeIn().promise().done( hookCallback );
} else {
- $collapsible.slideDown();
+ $collapsible.slideDown().promise().done( hookCallback );
}
}
}
@@ -129,7 +143,7 @@
}
/**
- * Handles clicking on the collapsible element toggle and other
+ * Handles clicking/keypressing on the collapsible element toggle and other
* situations where a collapsible element is toggled (e.g. the initial
* toggle for collapsed ones).
*
@@ -138,20 +152,32 @@
* @param {jQuery.Event|null} e either the event or null if unavailable
* @param {Object|undefined} options
*/
- function togglingHandler( $toggle, $collapsible, event, options ) {
+ function togglingHandler( $toggle, $collapsible, e, options ) {
var wasCollapsed, $textContainer, collapseText, expandText;
- if ( event ) {
- // Don't fire if a link was clicked, if requested (for premade togglers by default)
- if ( options.linksPassthru && $.nodeName( event.target, 'a' ) ) {
- return true;
+ if ( options === undefined ) {
+ options = {};
+ }
+
+ if ( e ) {
+ if ( e.type === 'click' && options.linksPassthru && $.nodeName( e.target, 'a' ) ) {
+ // Don't fire if a link was clicked, if requested (for premade togglers by default)
+ return;
+ } else if ( e.type === 'keypress' && e.which !== 13 && e.which !== 32 ) {
+ // Only handle keypresses on the "Enter" or "Space" keys
+ return;
} else {
- event.preventDefault();
- event.stopPropagation();
+ e.preventDefault();
+ e.stopPropagation();
}
}
- wasCollapsed = $collapsible.hasClass( 'mw-collapsed' );
+ // This allows the element to be hidden on initial toggle without fiddling with the class
+ if ( options.wasCollapsed !== undefined ) {
+ wasCollapsed = options.wasCollapsed;
+ } else {
+ wasCollapsed = $collapsible.hasClass( 'mw-collapsed' );
+ }
// Toggle the state of the collapsible element (that is, expand or collapse)
$collapsible.toggleClass( 'mw-collapsed', !wasCollapsed );
@@ -180,45 +206,6 @@
}
/**
- * Toggles collapsible and togglelink class and updates text label.
- *
- * @param {jQuery} $that
- * @param {jQuery.Event} e
- * @param {Object|undefined} options
- */
- function toggleLinkDefault( $that, e, options ) {
- var $collapsible = $that.closest( '.mw-collapsible' );
- options = $.extend( { toggleClasses: true }, options );
- togglingHandler( $that, $collapsible, e, options );
- }
-
- /**
- * Toggles collapsible and togglelink class.
- *
- * @param {jQuery} $that
- * @param {jQuery.Event} e
- * @param {Object|undefined} options
- */
- function toggleLinkPremade( $that, e, options ) {
- var $collapsible = $that.eq( 0 ).closest( '.mw-collapsible' );
- options = $.extend( { toggleClasses: true, linksPassthru: true }, options );
- togglingHandler( $that, $collapsible, e, options );
- }
-
- /**
- * Toggles customcollapsible.
- *
- * @param {jQuery} $that
- * @param {jQuery.Event} e
- * @param {Object|undefined} options
- * @param {jQuery} $collapsible
- */
- function toggleLinkCustom( $that, e, options, $collapsible ) {
- options = $.extend( {}, options );
- togglingHandler( $that, $collapsible, e, options );
- }
-
- /**
* Make any element collapsible.
*
* Supported options:
@@ -243,17 +230,17 @@
* div.mw-collapsible-content. May only be used with custom togglers.
*/
$.fn.makeCollapsible = function ( options ) {
- return this.each(function () {
- var $collapsible, collapsetext, expandtext, $toggle, $toggleLink, $firstItem, collapsibleId,
- $customTogglers, firstval;
+ if ( options === undefined ) {
+ options = {};
+ }
- if ( options === undefined ) {
- options = {};
- }
+ return this.each( function () {
+ var $collapsible, collapseText, expandText, $toggle, actionHandler, buildDefaultToggleLink,
+ premadeToggleHandler, $toggleLink, $firstItem, collapsibleId, $customTogglers, firstval;
// Ensure class "mw-collapsible" is present in case .makeCollapsible()
// is called on element(s) that don't have it yet.
- $collapsible = $(this).addClass( 'mw-collapsible' );
+ $collapsible = $( this ).addClass( 'mw-collapsible' );
// Return if it has been enabled already.
if ( $collapsible.data( 'mw-made-collapsible' ) ) {
@@ -263,21 +250,35 @@
}
// Use custom text or default?
- collapsetext = options.collapseText || $collapsible.attr( 'data-collapsetext' ) || mw.msg( 'collapsible-collapse' );
- expandtext = options.expandText || $collapsible.attr( 'data-expandtext' ) || mw.msg( 'collapsible-expand' );
-
- // Create toggle link with a space around the brackets (&nbsp;[text]&nbsp;)
- $toggleLink =
- $( '<a href="#"></a>' )
- .text( collapsetext )
+ collapseText = options.collapseText || $collapsible.attr( 'data-collapsetext' ) || mw.msg( 'collapsible-collapse' );
+ expandText = options.expandText || $collapsible.attr( 'data-expandtext' ) || mw.msg( 'collapsible-expand' );
+
+ // Default click/keypress handler and toggle link to use when none is present
+ actionHandler = function ( e, opts ) {
+ var defaultOpts = {
+ toggleClasses: true,
+ toggleText: { collapseText: collapseText, expandText: expandText }
+ };
+ opts = $.extend( defaultOpts, options, opts );
+ togglingHandler( $( this ), $collapsible, e, opts );
+ };
+ // Default toggle link. Only build it when needed to avoid jQuery memory leaks (event data).
+ buildDefaultToggleLink = function () {
+ return $( '<a href="#"></a>' )
+ .text( collapseText )
.wrap( '<span class="mw-collapsible-toggle"></span>' )
.parent()
.prepend( '&nbsp;[' )
.append( ']&nbsp;' )
- .on( 'click.mw-collapse', function ( e, opts ) {
- opts = $.extend( { toggleText: { collapseText: collapsetext, expandText: expandtext } }, options, opts );
- toggleLinkDefault( $(this), e, opts );
- } );
+ .on( 'click.mw-collapsible keypress.mw-collapsible', actionHandler );
+ };
+
+ // Default handler for clicking on premade toggles
+ premadeToggleHandler = function ( e, opts ) {
+ var defaultOpts = { toggleClasses: true, linksPassthru: true };
+ opts = $.extend( defaultOpts, options, opts );
+ togglingHandler( $( this ), $collapsible, e, opts );
+ };
// Check if this element has a custom position for the toggle link
// (ie. outside the container or deeper inside the tree)
@@ -296,25 +297,21 @@
}
}
- // Bind the custom togglers
+ // Bind the togglers
if ( $customTogglers && $customTogglers.length ) {
- $customTogglers.on( 'click.mw-collapse', function ( e, opts ) {
- opts = $.extend( {}, options, opts );
- toggleLinkCustom( $(this), e, opts, $collapsible );
- } );
-
- // Initial state
- if ( options.collapsed || $collapsible.hasClass( 'mw-collapsed' ) ) {
- // Remove here so that the toggler goes in the right direction,
- // It re-adds the class.
- $collapsible.removeClass( 'mw-collapsed' );
- toggleLinkCustom( $customTogglers, null, $.extend( { instantHide: true }, options ), $collapsible );
- }
+ actionHandler = function ( e, opts ) {
+ var defaultOpts = {};
+ opts = $.extend( defaultOpts, options, opts );
+ togglingHandler( $( this ), $collapsible, e, opts );
+ };
+
+ $toggleLink = $customTogglers;
+ $toggleLink.on( 'click.mw-collapsible keypress.mw-collapsible', actionHandler );
- // If this is not a custom case, do the default:
- // Wrap the contents and add the toggle link
} else {
- // Elements are treated differently
+ // If this is not a custom case, do the default: wrap the
+ // contents and add the toggle link. Different elements are
+ // treated differently.
if ( $collapsible.is( 'table' ) ) {
// The toggle-link will be in one the the cells (td or th) of the first row
$firstItem = $collapsible.find( 'tr:first th, tr:first td' );
@@ -322,12 +319,10 @@
// If theres no toggle link, add it to the last cell
if ( !$toggle.length ) {
- $firstItem.eq(-1).prepend( $toggleLink );
+ $toggleLink = buildDefaultToggleLink().prependTo( $firstItem.eq( -1 ) );
} else {
- $toggleLink = $toggle.off( 'click.mw-collapse' ).on( 'click.mw-collapse', function ( e, opts ) {
- opts = $.extend( {}, options, opts );
- toggleLinkPremade( $toggle, e, opts );
- } );
+ actionHandler = premadeToggleHandler;
+ $toggleLink = $toggle.on( 'click.mw-collapsible keypress.mw-collapsible', actionHandler );
}
} else if ( $collapsible.is( 'ul' ) || $collapsible.is( 'ol' ) ) {
@@ -339,17 +334,16 @@
if ( !$toggle.length ) {
// Make sure the numeral order doesn't get messed up, force the first (soon to be second) item
// to be "1". Except if the value-attribute is already used.
- // If no value was set WebKit returns "", Mozilla returns '-1', others return null or undefined.
+ // If no value was set WebKit returns "", Mozilla returns '-1', others return 0, null or undefined.
firstval = $firstItem.attr( 'value' );
if ( firstval === undefined || !firstval || firstval === '-1' || firstval === -1 ) {
$firstItem.attr( 'value', '1' );
}
- $collapsible.prepend( $toggleLink.wrap( '<li class="mw-collapsible-toggle-li"></li>' ).parent() );
+ $toggleLink = buildDefaultToggleLink();
+ $toggleLink.wrap( '<li class="mw-collapsible-toggle-li"></li>' ).parent().prependTo( $collapsible );
} else {
- $toggleLink = $toggle.off( 'click.mw-collapse' ).on( 'click.mw-collapse', function ( e, opts ) {
- opts = $.extend( {}, options, opts );
- toggleLinkPremade( $toggle, e, opts );
- } );
+ actionHandler = premadeToggleHandler;
+ $toggleLink = $toggle.on( 'click.mw-collapsible keypress.mw-collapsible', actionHandler );
}
} else { // <div>, <p> etc.
@@ -364,28 +358,23 @@
// If theres no toggle link, add it
if ( !$toggle.length ) {
- $collapsible.prepend( $toggleLink );
+ $toggleLink = buildDefaultToggleLink().prependTo( $collapsible );
} else {
- $toggleLink = $toggle.off( 'click.mw-collapse' ).on( 'click.mw-collapse', function ( e, opts ) {
- opts = $.extend( {}, options, opts );
- toggleLinkPremade( $toggle, e, opts );
- } );
+ actionHandler = premadeToggleHandler;
+ $toggleLink = $toggle.on( 'click.mw-collapsible keypress.mw-collapsible', actionHandler );
}
}
}
- // Initial state (only for those that are not custom,
- // because the initial state of those has been taken care of already).
- if (
- ( options.collapsed || $collapsible.hasClass( 'mw-collapsed' ) ) &&
- ( !$customTogglers || !$customTogglers.length )
- ) {
- $collapsible.removeClass( 'mw-collapsed' );
- // The collapsible element could have multiple togglers
- // To toggle the initial state only click one of them (ie. the first one, eq(0) )
- // Else it would go like: hide,show,hide,show for each toggle link.
- // This is just like it would be in reality (only one toggle is clicked at a time).
- $toggleLink.eq( 0 ).trigger( 'click', [ { instantHide: true } ] );
+ // Attributes for accessibility. This isn't necessary when the toggler is already
+ // an <a> or a <button> etc., but it doesn't hurt either, and it's consistent.
+ $toggleLink.prop( 'tabIndex', 0 );
+
+ // Initial state
+ if ( options.collapsed || $collapsible.hasClass( 'mw-collapsed' ) ) {
+ // One toggler can hook to multiple elements, and one element can have
+ // multiple togglers. This is the sanest way to handle that.
+ actionHandler.call( $toggleLink.get( 0 ), null, { instantHide: true, wasCollapsed: false } );
}
} );
};
diff --git a/resources/jquery/jquery.placeholder.js b/resources/jquery/jquery.placeholder.js
index 7badb11a..8044d880 100644
--- a/resources/jquery/jquery.placeholder.js
+++ b/resources/jquery/jquery.placeholder.js
@@ -10,17 +10,22 @@
*/
( function ( $ ) {
- $.fn.placeholder = function () {
+ $.fn.placeholder = function ( text ) {
+ var hasArg = arguments.length;
return this.each( function () {
var placeholder, $input;
+ if ( hasArg ) {
+ this.setAttribute( 'placeholder', text );
+ }
+
// If the HTML5 placeholder attribute is supported, use it
if ( this.placeholder && 'placeholder' in document.createElement( this.tagName ) ) {
return;
}
- placeholder = this.getAttribute( 'placeholder' );
+ placeholder = hasArg ? text : this.getAttribute( 'placeholder' );
$input = $(this);
// Show initially, if empty
diff --git a/resources/jquery/jquery.spinner.css b/resources/jquery/jquery.spinner.css
index 4a775283..a9e06dbe 100644
--- a/resources/jquery/jquery.spinner.css
+++ b/resources/jquery/jquery.spinner.css
@@ -33,7 +33,7 @@
.mw-spinner-inline {
display: inline-block;
vertical-align: middle;
-
+
/* IE < 8 */
zoom: 1;
*display: inline;
diff --git a/resources/jquery/jquery.spinner.js b/resources/jquery/jquery.spinner.js
index 93e30b9a..27dabc6c 100644
--- a/resources/jquery/jquery.spinner.js
+++ b/resources/jquery/jquery.spinner.js
@@ -1,7 +1,9 @@
/**
- * jQuery spinner
+ * jQuery Spinner
*
* Simple jQuery plugin to create, inject and remove spinners.
+ *
+ * @class jQuery.plugin.spinner
*/
( function ( $ ) {
@@ -15,36 +17,37 @@
$.extend({
/**
- * Creates a spinner element.
+ * Create a spinner element
*
* The argument is an object with options used to construct the spinner. These can be:
*
* It is a good practice to keep a reference to the created spinner to be able to remove it later.
- * Alternatively one can use the id option and removeSpinner() (but make sure to choose an id
+ * Alternatively one can use the id option and #removeSpinner (but make sure to choose an id
* that's unlikely to cause conflicts, e.g. with extensions, gadgets or user scripts).
*
* CSS classes used:
- * .mw-spinner for every spinner
- * .mw-spinner-small / .mw-spinner-large for size
- * .mw-spinner-block / .mw-spinner-inline for display types
+ * - .mw-spinner for every spinner
+ * - .mw-spinner-small / .mw-spinner-large for size
+ * - .mw-spinner-block / .mw-spinner-inline for display types
*
- * @example
* // Create a large spinner reserving all available horizontal space.
* var $spinner = $.createSpinner({ size: 'large', type: 'block' });
* // Insert above page content.
* $( '#mw-content-text' ).prepend( $spinner );
- * @example
+ *
* // Place a small inline spinner next to the "Save" button
* var $spinner = $.createSpinner({ size: 'small', type: 'inline' });
* // Alternatively, just `$.createSpinner();` as these are the default options.
* $( '#wpSave' ).after( $spinner );
- * @example
+ *
* // The following two are equivalent:
* $.createSpinner( 'magic' );
* $.createSpinner({ id: 'magic' });
*
- * @param {Object|String} opts [optional] ID string or options:
- * - id: If given, spinner will be given an id of "mw-spinner-<id>"
+ * @static
+ * @inheritable
+ * @param {Object|string} [opts] ID string or options:
+ * - id: If given, spinner will be given an id of "mw-spinner-{id}"
* - size: 'small' (default) or 'large' for a 20-pixel or 32-pixel spinner
* - type: 'inline' (default) or 'block'. Inline creates an inline-block with width and
* height equal to spinner size. Block is a block-level element with width 100%, height
@@ -72,10 +75,12 @@
},
/**
- * Removes a spinner element.
+ * Remove a spinner element
*
- * @param {String} id [optional] Id of the spinner, as passed to createSpinner.
- * @return {jQuery} The (now detached) spinner.
+ * @static
+ * @inheritable
+ * @param {string} id Id of the spinner, as passed to #createSpinner
+ * @return {jQuery} The (now detached) spinner element
*/
removeSpinner: function ( id ) {
return $( '#mw-spinner-' + id ).remove();
@@ -83,13 +88,21 @@
});
/**
- * Injects a spinner after the elements in the jQuery collection
- * (as siblings, not children). Collection contents remain unchanged.
+ * Inject a spinner after each element in the collection
+ *
+ * Inserts spinner as siblings, not children, of the target elements.
+ * Collection contents remain unchanged.
*
- * @param {Object|String} opts See createSpinner() for description.
+ * @param {Object|string} [opts] See #createSpinner
* @return {jQuery}
*/
$.fn.injectSpinner = function ( opts ) {
return this.after( $.createSpinner( opts ) );
};
+
+ /**
+ * @class jQuery
+ * @mixins jQuery.plugin.spinner
+ */
+
}( jQuery ) );
diff --git a/resources/jquery/jquery.suggestions.js b/resources/jquery/jquery.suggestions.js
index 44382f0d..28e2afc4 100644
--- a/resources/jquery/jquery.suggestions.js
+++ b/resources/jquery/jquery.suggestions.js
@@ -220,7 +220,7 @@ $.suggestions = {
} else {
// Expand from right
newCSS.left = 'auto';
- newCSS.right = $( 'body' ).width() - ( context.config.$region.offset().left + context.config.$region.outerWidth() );
+ newCSS.right = $( document ).width() - ( context.config.$region.offset().left + context.config.$region.outerWidth() );
}
context.data.$container.css( newCSS );
@@ -585,10 +585,12 @@ $.fn.suggestions = function () {
switch ( context.data.keypressed ) {
// This preventDefault logic is duplicated from
// $.suggestions.keypress(), which sucks
+ // Arrow down
case 40:
e.preventDefault();
e.stopImmediatePropagation();
break;
+ // Arrow up, Escape and Enter
case 38:
case 27:
case 13:
diff --git a/resources/jquery/jquery.tablesorter.js b/resources/jquery/jquery.tablesorter.js
index e08c9aaf..b3d7bb3d 100644
--- a/resources/jquery/jquery.tablesorter.js
+++ b/resources/jquery/jquery.tablesorter.js
@@ -8,8 +8,9 @@
* http://www.opensource.org/licenses/mit-license.php
* http://www.gnu.org/licenses/gpl.html
*
- * Depends on mw.config (wgDigitTransformTable, wgMonthNames, wgMonthNamesShort,
- * wgDefaultDateFormat, wgContentLanguage)
+ * Depends on mw.config (wgDigitTransformTable, wgDefaultDateFormat, wgContentLanguage)
+ * and mw.language.months.
+ *
* Uses 'tableSorterCollation' in mw.config (if available)
*/
/**
@@ -287,44 +288,113 @@
function buildHeaders( table, msg ) {
var maxSeen = 0,
+ colspanOffset = 0,
longest,
- realCellIndex = 0,
- $tableHeaders = $( 'thead:eq(0) > tr', table );
- if ( $tableHeaders.length > 1 ) {
- $tableHeaders.each( function () {
- if ( this.cells.length > maxSeen ) {
- maxSeen = this.cells.length;
- longest = this;
+ columns,
+ i,
+ $tableHeaders = $( [] ),
+ $tableRows = $( 'thead:eq(0) > tr', table );
+ if ( $tableRows.length <= 1 ) {
+ $tableHeaders = $tableRows.children( 'th' );
+ } else {
+ // We need to find the cells of the row containing the most columns
+ var rowspan,
+ headersIndex = [];
+ $tableRows.each( function ( rowIndex ) {
+ $.each( this.cells, function( index2, cell ) {
+ rowspan = Number( cell.rowSpan );
+ for ( i = 0; i < rowspan; i++ ) {
+ if ( headersIndex[rowIndex+i] === undefined ) {
+ headersIndex[rowIndex+i] = $( [] );
+ }
+ headersIndex[rowIndex+i].push( cell );
+ }
+ } );
+ } );
+ $.each( headersIndex, function ( index, cellArray ) {
+ if ( cellArray.length >= maxSeen ) {
+ maxSeen = cellArray.length;
+ longest = index;
}
- });
- $tableHeaders = $( longest );
+ } );
+ $tableHeaders = headersIndex[longest];
}
- $tableHeaders = $tableHeaders.children( 'th' ).each( function ( index ) {
- this.column = realCellIndex;
- var colspan = this.colspan;
- colspan = colspan ? parseInt( colspan, 10 ) : 1;
- realCellIndex += colspan;
+ // as each header can span over multiple columns (using colspan=N),
+ // we have to bidirectionally map headers to their columns and columns to their headers
+ table.headerToColumns = [];
+ table.columnToHeader = [];
+
+ $tableHeaders.each( function ( headerIndex ) {
+ columns = [];
+ for ( i = 0; i < this.colSpan; i++ ) {
+ table.columnToHeader[ colspanOffset + i ] = headerIndex;
+ columns.push( colspanOffset + i );
+ }
+
+ table.headerToColumns[ headerIndex ] = columns;
+ colspanOffset += this.colSpan;
+ this.headerIndex = headerIndex;
this.order = 0;
this.count = 0;
- if ( $( this ).is( '.unsortable' ) ) {
+ if ( $( this ).hasClass( table.config.unsortableClass ) ) {
this.sortDisabled = true;
}
if ( !this.sortDisabled ) {
- $( this ).addClass( table.config.cssHeader ).attr( 'title', msg[1] );
+ $( this )
+ .addClass( table.config.cssHeader )
+ .prop( 'tabIndex', 0 )
+ .attr( {
+ role: 'columnheader button',
+ title: msg[1]
+ } );
}
// add cell to headerList
- table.config.headerList[index] = this;
+ table.config.headerList[headerIndex] = this;
} );
return $tableHeaders;
}
+ /**
+ * Sets the sort count of the columns that are not affected by the sorting to have them sorted
+ * in default (ascending) order when their header cell is clicked the next time.
+ *
+ * @param {jQuery} $headers
+ * @param {Number[][]} sortList
+ * @param {Number[][]} headerToColumns
+ */
+ function setHeadersOrder( $headers, sortList, headerToColumns ) {
+ // Loop through all headers to retrieve the indices of the columns the header spans across:
+ $.each( headerToColumns, function( headerIndex, columns ) {
+
+ $.each( columns, function( i, columnIndex ) {
+ var header = $headers[headerIndex];
+
+ if ( !isValueInArray( columnIndex, sortList ) ) {
+ // Column shall not be sorted: Reset header count and order.
+ header.order = 0;
+ header.count = 0;
+ } else {
+ // Column shall be sorted: Apply designated count and order.
+ $.each( sortList, function( j, sortColumn ) {
+ if ( sortColumn[0] === i ) {
+ header.order = sortColumn[1];
+ header.count = sortColumn[1] + 1;
+ return false;
+ }
+ } );
+ }
+ } );
+
+ } );
+ }
+
function isValueInArray( v, a ) {
var l = a.length;
for ( var i = 0; i < l; i++ ) {
@@ -407,12 +477,15 @@
var regex = [];
ts.monthNames = {};
- for ( var i = 1; i < 13; i++ ) {
- var name = mw.config.get( 'wgMonthNames' )[i].toLowerCase();
- ts.monthNames[name] = i;
+ for ( var i = 0; i < 12; i++ ) {
+ var name = mw.language.months.names[i].toLowerCase();
+ ts.monthNames[name] = i + 1;
regex.push( $.escapeRE( name ) );
- name = mw.config.get( 'wgMonthNamesShort' )[i].toLowerCase().replace( '.', '' );
- ts.monthNames[name] = i;
+ name = mw.language.months.genitive[i].toLowerCase();
+ ts.monthNames[name] = i + 1;
+ regex.push( $.escapeRE( name ) );
+ name = mw.language.months.abbrev[i].toLowerCase().replace( '.', '' );
+ ts.monthNames[name] = i + 1;
regex.push( $.escapeRE( name ) );
}
@@ -424,10 +497,10 @@
ts.dateRegex[0] = new RegExp( /^\s*(\d{1,2})[\,\.\-\/'\s]{1,2}(\d{1,2})[\,\.\-\/'\s]{1,2}(\d{2,4})\s*?/i);
// Written Month name, dmy
- ts.dateRegex[1] = new RegExp( '^\\s*(\\d{1,2})[\\,\\.\\-\\/\'\\s]*(' + regex + ')' + '[\\,\\.\\-\\/\'\\s]*(\\d{2,4})\\s*$', 'i' );
+ ts.dateRegex[1] = new RegExp( '^\\s*(\\d{1,2})[\\,\\.\\-\\/\'\\s]+(' + regex + ')' + '[\\,\\.\\-\\/\'\\s]+(\\d{2,4})\\s*$', 'i' );
// Written Month name, mdy
- ts.dateRegex[2] = new RegExp( '^\\s*(' + regex + ')' + '[\\,\\.\\-\\/\'\\s]*(\\d{1,2})[\\,\\.\\-\\/\'\\s]*(\\d{2,4})\\s*$', 'i' );
+ ts.dateRegex[2] = new RegExp( '^\\s*(' + regex + ')' + '[\\,\\.\\-\\/\'\\s]+(\\d{1,2})[\\,\\.\\-\\/\'\\s]+(\\d{2,4})\\s*$', 'i' );
}
@@ -572,7 +645,7 @@
$.each( sortObjects, function( i, sortObject ) {
$.each ( sortObject, function( columnIndex, order ) {
var orderIndex = ( order === 'desc' ) ? 1 : 0;
- sortList.push( [columnIndex, orderIndex] );
+ sortList.push( [parseInt( columnIndex, 10 ), orderIndex] );
} );
} );
return sortList;
@@ -590,6 +663,7 @@
sortInitialOrder: 'asc',
sortMultiSortKey: 'shiftKey',
sortLocaleCompare: false,
+ unsortableClass: 'unsortable',
parsers: {},
widgets: [],
headers: {},
@@ -611,7 +685,6 @@
return $tables.each( function ( i, table ) {
// Declare and cache.
var $headers, cache, config,
- headerToColumns, columnToHeader, colspanOffset,
$table = $( table ),
firstTime = true;
@@ -648,10 +721,9 @@
// Build headers
$headers = buildHeaders( table, sortMsg );
- // Grab and process locale settings
+ // Grab and process locale settings.
buildTransformTable();
buildDateTable();
- buildCollationTable();
// Precaching regexps can bring 10 fold
// performance improvements in some browsers.
@@ -660,6 +732,12 @@
function setupForFirstSort() {
firstTime = false;
+ // Defer buildCollationTable to first sort. As user and site scripts
+ // may customize tableSorterCollation but load after $.ready(), other
+ // scripts may call .tablesorter() before they have done the
+ // tableSorterCollation customizations.
+ buildCollationTable();
+
// Legacy fix of .sortbottoms
// Wrap them inside inside a tfoot (because that's what they actually want to be) &
// and put the <tfoot> at the end of the <table>
@@ -679,28 +757,17 @@
table.config.parsers = buildParserCache( table, $headers );
}
- // as each header can span over multiple columns (using colspan=N),
- // we have to bidirectionally map headers to their columns and columns to their headers
- headerToColumns = [];
- columnToHeader = [];
- colspanOffset = 0;
- $headers.each( function ( headerIndex ) {
- var columns = [];
- for ( var i = 0; i < this.colSpan; i++ ) {
- columnToHeader[ colspanOffset + i ] = headerIndex;
- columns.push( colspanOffset + i );
- }
-
- headerToColumns[ headerIndex ] = columns;
- colspanOffset += this.colSpan;
- } );
-
// Apply event handling to headers
// this is too big, perhaps break it out?
- $headers.filter( ':not(.unsortable)' ).click( function ( e ) {
- if ( e.target.nodeName.toLowerCase() === 'a' ) {
- // The user clicked on a link inside a table header
- // Do nothing and let the default link click action continue
+ $headers.not( '.' + table.config.unsortableClass ).on( 'keypress click', function ( e ) {
+ if ( e.type === 'click' && e.target.nodeName.toLowerCase() === 'a' ) {
+ // The user clicked on a link inside a table header.
+ // Do nothing and let the default link click action continue.
+ return true;
+ }
+
+ if ( e.type === 'keypress' && e.which !== 13 ) {
+ // Only handle keypresses on the "Enter" key.
return true;
}
@@ -724,7 +791,7 @@
var cell = this;
// Get current column index
- var columns = headerToColumns[this.column];
+ var columns = table.headerToColumns[ this.headerIndex ];
var newSortList = $.map( columns, function (c) {
// jQuery "helpfully" flattens the arrays...
return [[c, cell.order]];
@@ -758,8 +825,11 @@
}
}
+ // Reset order/counts of cells not affected by sorting
+ setHeadersOrder( $headers, config.sortList, table.headerToColumns );
+
// Set CSS for headers
- setHeadersCss( $table[0], $headers, config.sortList, sortCSS, sortMsg, columnToHeader );
+ setHeadersCss( $table[0], $headers, config.sortList, sortCSS, sortMsg, table.columnToHeader );
appendToTable(
$table[0], multisort( $table[0], config.sortList, cache )
);
@@ -798,11 +868,15 @@
sortList = convertSortList( sortList );
}
+ // Set each column's sort count to be able to determine the correct sort
+ // order when clicking on a header cell the next time
+ setHeadersOrder( $headers, sortList, table.headerToColumns );
+
// re-build the cache for the tbody cells
cache = buildCache( table );
// set css for headers
- setHeadersCss( table, $headers, sortList, sortCSS, sortMsg, columnToHeader );
+ setHeadersCss( table, $headers, sortList, sortCSS, sortMsg, table.columnToHeader );
// sort the table and append it to the dom
appendToTable( table, multisort( table, sortList, cache ) );
diff --git a/resources/jquery/jquery.textSelection.js b/resources/jquery/jquery.textSelection.js
index daff9d93..2b5a4406 100644
--- a/resources/jquery/jquery.textSelection.js
+++ b/resources/jquery/jquery.textSelection.js
@@ -89,7 +89,7 @@
* 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
+ * Inserts text at the beginning and end of a text selection, optionally
* inserting text at the caret when selection is empty.
*
* @fixme document the options parameters
@@ -257,7 +257,7 @@
* 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)
+ * Get the position (in resolution of bytes not necessarily characters)
* in a textarea
*
* Will focus the textarea in some browsers (IE/Opera)
diff --git a/resources/mediawiki.action/images/green-checkmark.png b/resources/mediawiki.action/images/green-checkmark.png
new file mode 100644
index 00000000..8ec604ea
--- /dev/null
+++ b/resources/mediawiki.action/images/green-checkmark.png
Binary files differ
diff --git a/resources/mediawiki.action/mediawiki.action.edit.collapsibleFooter.css b/resources/mediawiki.action/mediawiki.action.edit.collapsibleFooter.css
new file mode 100644
index 00000000..1af4a7a0
--- /dev/null
+++ b/resources/mediawiki.action/mediawiki.action.edit.collapsibleFooter.css
@@ -0,0 +1,17 @@
+/* Styles for collapsible lists of templates used and hidden categories */
+.mw-editfooter-toggler {
+ cursor: pointer;
+ background-position: left center;
+ padding-left: 16px;
+}
+
+.mw-editfooter-list {
+ margin-bottom: 1em;
+ margin-left: 2.5em;
+}
+
+/* Show/hide animation is incorrect if the table has a margin set. Extra
+ * "table.wikitable" is needed in the selector for CSS specificity. */
+table.wikitable.preview-limit-report {
+ margin: 0;
+}
diff --git a/resources/mediawiki.action/mediawiki.action.edit.collapsibleFooter.js b/resources/mediawiki.action/mediawiki.action.edit.collapsibleFooter.js
new file mode 100644
index 00000000..7ae51aba
--- /dev/null
+++ b/resources/mediawiki.action/mediawiki.action.edit.collapsibleFooter.js
@@ -0,0 +1,54 @@
+jQuery( document ).ready( function ( $ ) {
+ var collapsibleLists, i, handleOne;
+
+ // Collapsible lists of categories and templates
+ collapsibleLists = [
+ {
+ $list: $( '.templatesUsed ul' ),
+ $toggler: $( '.mw-templatesUsedExplanation' ),
+ cookieName: 'templates-used-list'
+ },
+ {
+ $list: $( '.hiddencats ul' ),
+ $toggler: $( '.mw-hiddenCategoriesExplanation' ),
+ cookieName: 'hidden-categories-list'
+ },
+ {
+ $list: $( '.preview-limit-report-wrapper' ),
+ $toggler: $( '.mw-limitReportExplanation' ),
+ cookieName: 'preview-limit-report'
+ }
+ ];
+
+ handleOne = function ( $list, $toggler, cookieName ) {
+ var isCollapsed = $.cookie( cookieName ) !== 'expanded';
+
+ // Style the toggler with an arrow icon and add a tabIndex and a role for accessibility
+ $toggler.addClass( 'mw-editfooter-toggler' ).prop( 'tabIndex', 0 ).attr( 'role', 'button' );
+ $list.addClass( 'mw-editfooter-list' );
+
+ $list.makeCollapsible( {
+ $customTogglers: $toggler,
+ linksPassthru: true,
+ plainMode: true,
+ collapsed: isCollapsed
+ } );
+
+ $toggler.addClass( isCollapsed ? 'mw-icon-arrow-collapsed' : 'mw-icon-arrow-expanded' );
+
+ $list.on( 'beforeExpand.mw-collapsible', function () {
+ $toggler.removeClass( 'mw-icon-arrow-collapsed' ).addClass( 'mw-icon-arrow-expanded' );
+ $.cookie( cookieName, 'expanded' );
+ } );
+
+ $list.on( 'beforeCollapse.mw-collapsible', function () {
+ $toggler.removeClass( 'mw-icon-arrow-expanded' ).addClass( 'mw-icon-arrow-collapsed' );
+ $.cookie( cookieName, 'collapsed' );
+ } );
+ };
+
+ for ( i = 0; i < collapsibleLists.length; i++ ) {
+ // Pass to a function for iteration-local variables
+ handleOne( collapsibleLists[i].$list, collapsibleLists[i].$toggler, collapsibleLists[i].cookieName );
+ }
+} );
diff --git a/resources/mediawiki.action/mediawiki.action.edit.editWarning.js b/resources/mediawiki.action/mediawiki.action.edit.editWarning.js
new file mode 100644
index 00000000..89bb64df
--- /dev/null
+++ b/resources/mediawiki.action/mediawiki.action.edit.editWarning.js
@@ -0,0 +1,56 @@
+/*
+ * Javascript for module editWarning
+ */
+( function ( mw, $ ) {
+ $( function () {
+ // Check if EditWarning is enabled and if we need it
+ if ( $( '#wpTextbox1' ).length === 0 ) {
+ return true;
+ }
+ // Get the original values of some form elements
+ $( '#wpTextbox1, #wpSummary' ).each( function () {
+ $( this ).data( 'origtext', $( this ).val() );
+ });
+ var savedWindowOnBeforeUnload;
+ $( window )
+ .on( 'beforeunload.editwarning', function () {
+ var retval;
+
+ // Check if the current values of some form elements are the same as
+ // the original values
+ if (
+ mw.config.get( 'wgAction' ) === 'submit' ||
+ $( '#wpTextbox1' ).data( 'origtext' ) !== $( '#wpTextbox1' ).val() ||
+ $( '#wpSummary' ).data( 'origtext' ) !== $( '#wpSummary' ).val()
+ ) {
+ // Return our message
+ retval = mw.msg( 'editwarning-warning' );
+ }
+
+ // Unset the onbeforeunload handler so we don't break page caching in Firefox
+ savedWindowOnBeforeUnload = window.onbeforeunload;
+ window.onbeforeunload = null;
+ if ( retval !== undefined ) {
+ // ...but if the user chooses not to leave the page, we need to rebind it
+ setTimeout( function () {
+ window.onbeforeunload = savedWindowOnBeforeUnload;
+ }, 1 );
+ return retval;
+ }
+ } )
+ .on( 'pageshow.editwarning', function () {
+ // Re-add onbeforeunload handler
+ if ( !window.onbeforeunload ) {
+ window.onbeforeunload = savedWindowOnBeforeUnload;
+ }
+ } );
+
+ // Add form submission handler
+ $( '#editform' ).submit( function () {
+ // Unbind our handlers
+ $( window ).off( '.editwarning' );
+ } );
+ } );
+
+}( mediaWiki, jQuery ) );
+
diff --git a/resources/mediawiki.action/mediawiki.action.edit.js b/resources/mediawiki.action/mediawiki.action.edit.js
index 2835c9cc..ba711aae 100644
--- a/resources/mediawiki.action/mediawiki.action.edit.js
+++ b/resources/mediawiki.action/mediawiki.action.edit.js
@@ -1,17 +1,20 @@
+/**
+ * Interface for the classic edit toolbar.
+ *
+ * @class mw.toolbar
+ * @singleton
+ */
( function ( mw, $ ) {
- var isReady, toolbar, currentFocused, queue, $toolbar, slice;
-
- isReady = false;
- queue = [];
- $toolbar = false;
- slice = Array.prototype.slice;
+ var toolbar, isReady, $toolbar, queue, slice, $currentFocused;
/**
- * Internal helper that does the actual insertion
- * of the button into the toolbar.
- * See mw.toolbar.addButton for parameter documentation.
+ * Internal helper that does the actual insertion of the button into the toolbar.
+ *
+ * See #addButton for parameter documentation.
+ *
+ * @private
*/
- function insertButton( b /* imageFile */, speedTip, tagOpen, tagClose, sampleText, imageId, selectText ) {
+ function insertButton( b, speedTip, tagOpen, tagClose, sampleText, imageId ) {
// Backwards compatibility
if ( typeof b !== 'object' ) {
b = {
@@ -20,11 +23,10 @@
tagOpen: tagOpen,
tagClose: tagClose,
sampleText: sampleText,
- imageId: imageId,
- selectText: selectText
+ imageId: imageId
};
}
- var $image = $( '<img>', {
+ var $image = $( '<img>' ).attr( {
width : 23,
height: 22,
src : b.imageFile,
@@ -33,30 +35,43 @@
id : b.imageId || undefined,
'class': 'mw-toolbar-editbutton'
} ).click( function () {
- toolbar.insertTags( b.tagOpen, b.tagClose, b.sampleText, b.selectText );
+ toolbar.insertTags( b.tagOpen, b.tagClose, b.sampleText );
return false;
} );
$toolbar.append( $image );
- return true;
}
+ isReady = false;
+ $toolbar = false;
+ /**
+ * @private
+ * @property {Array}
+ * Contains button objects (and for backwards compatibilty, it can
+ * also contains an arguments array for insertButton).
+ */
+ queue = [];
+ slice = queue.slice;
+
toolbar = {
+
/**
* Add buttons to the toolbar.
+ *
* Takes care of race conditions and time-based dependencies
* by placing buttons in a queue if this method is called before
* the toolbar is created.
- * @param {Object} button: Object with the following properties:
- * - imageFile
- * - speedTip
- * - tagOpen
- * - tagClose
- * - sampleText
- * - imageId
- * - selectText
- * For compatiblity, passing the above as separate arguments
+ *
+ * For compatiblity, passing the properties listed below as separate arguments
* (in the listed order) is also supported.
+ *
+ * @param {Object} button Object with the following properties:
+ * @param {string} button.imageFile
+ * @param {string} button.speedTip
+ * @param {string} button.tagOpen
+ * @param {string} button.tagClose
+ * @param {string} button.sampleText
+ * @param {string} [button.imageId]
*/
addButton: function () {
if ( isReady ) {
@@ -66,18 +81,44 @@
queue.push( slice.call( arguments ) );
}
},
+ /**
+ * Example usage:
+ * addButtons( [ { .. }, { .. }, { .. } ] );
+ * addButtons( { .. }, { .. } );
+ *
+ * @param {Object|Array} [buttons...] An array of button objects or the first
+ * button object in a list of variadic arguments.
+ */
+ addButtons: function ( buttons ) {
+ if ( !$.isArray( buttons ) ) {
+ buttons = slice.call( arguments );
+ }
+ if ( isReady ) {
+ $.each( buttons, function () {
+ insertButton( this );
+ } );
+ } else {
+ // Push each button into the queue
+ queue.push.apply( queue, buttons );
+ }
+ },
/**
- * Apply tagOpen/tagClose to selection in textarea,
- * use sampleText instead of selection if there is none.
+ * Apply tagOpen/tagClose to selection in currently focused textarea.
+ *
+ * Uses `sampleText` if selection is empty.
+ *
+ * @param {string} tagOpen
+ * @param {string} tagClose
+ * @param {string} sampleText
*/
insertTags: function ( tagOpen, tagClose, sampleText ) {
- if ( currentFocused && currentFocused.length ) {
- currentFocused.textSelection(
+ if ( $currentFocused && $currentFocused.length ) {
+ $currentFocused.textSelection(
'encapsulateSelection', {
- 'pre': tagOpen,
- 'peri': sampleText,
- 'post': tagClose
+ pre: tagOpen,
+ peri: sampleText,
+ post: tagClose
}
);
}
@@ -95,64 +136,58 @@
// Explose API publicly
mw.toolbar = toolbar;
- $( document ).ready( function () {
- var buttons, i, b, $iframe;
+ $( function () {
+ var i, b, $iframe, editBox, scrollTop, $editForm;
// currentFocus is used to determine where to insert tags
- currentFocused = $( '#wpTextbox1' );
+ $currentFocused = $( '#wpTextbox1' );
// Populate the selector cache for $toolbar
$toolbar = $( '#toolbar' );
- // Legacy: Merge buttons from mwCustomEditButtons
- buttons = [].concat( queue, window.mwCustomEditButtons );
- // Clear queue
- queue.length = 0;
- for ( i = 0; i < buttons.length; i++ ) {
- b = buttons[i];
+ for ( i = 0; i < queue.length; i++ ) {
+ b = queue[i];
if ( $.isArray( b ) ) {
// Forwarded arguments array from mw.toolbar.addButton
insertButton.apply( toolbar, b );
} else {
- // Raw object from legacy mwCustomEditButtons
+ // Raw object from mw.toolbar.addButtons
insertButton( b );
}
}
+ // Clear queue
+ queue.length = 0;
+
// This causes further calls to addButton to go to insertion directly
- // instead of to the toolbar.buttons queue.
+ // instead of to the queue.
// It is important that this is after the one and only loop through
- // the the toolbar.buttons queue
+ // the the queue
isReady = true;
// Make sure edit summary does not exceed byte limit
$( '#wpSummary' ).byteLimit( 255 );
- /**
- * Restore the edit box scroll state following a preview operation,
- * and set up a form submission handler to remember this state
- */
- ( function scrollEditBox() {
- var editBox, scrollTop, $editForm;
-
- editBox = document.getElementById( 'wpTextbox1' );
- scrollTop = document.getElementById( 'wpScrolltop' );
- $editForm = $( '#editform' );
- if ( $editForm.length && editBox && scrollTop ) {
- if ( scrollTop.value ) {
- editBox.scrollTop = scrollTop.value;
- }
- $editForm.submit( function () {
- scrollTop.value = editBox.scrollTop;
- });
+ // Restore the edit box scroll state following a preview operation,
+ // and set up a form submission handler to remember this state.
+ editBox = document.getElementById( 'wpTextbox1' );
+ scrollTop = document.getElementById( 'wpScrolltop' );
+ $editForm = $( '#editform' );
+ if ( $editForm.length && editBox && scrollTop ) {
+ if ( scrollTop.value ) {
+ editBox.scrollTop = scrollTop.value;
}
- }() );
+ $editForm.submit( function () {
+ scrollTop.value = editBox.scrollTop;
+ });
+ }
- $( 'textarea, input:text' ).focus( function () {
- currentFocused = $(this);
- });
+ // Apply to dynamically created textboxes as well as normal ones
+ $( document ).on( 'focus', 'textarea, input:text', function () {
+ $currentFocused = $( this );
+ } );
- // HACK: make currentFocused work with the usability iframe
+ // HACK: make $currentFocused work with the usability iframe
// With proper focus detection support (HTML 5!) this'll be much cleaner
// TODO: Get rid of this WikiEditor code from MediaWiki core!
$iframe = $( '.wikiEditor-ui-text iframe' );
@@ -161,7 +196,7 @@
// for IE
.add( $iframe.get( 0 ).contentWindow.document.body )
.focus( function () {
- currentFocused = $iframe;
+ $currentFocused = $iframe;
} );
}
});
diff --git a/resources/mediawiki.action/mediawiki.action.edit.preview.js b/resources/mediawiki.action/mediawiki.action.edit.preview.js
index 602aadb0..c5cd61ef 100644
--- a/resources/mediawiki.action/mediawiki.action.edit.preview.js
+++ b/resources/mediawiki.action/mediawiki.action.edit.preview.js
@@ -7,14 +7,16 @@
* @param {jQuery.Event} e
*/
function doLivePreview( e ) {
- var $wikiPreview, copySelectors, removeSelectors, $copyElements, $spinner,
+ var $wikiPreview, $editform, copySelectors, $copyElements, $spinner,
targetUrl, postData, $previewDataHolder;
e.preventDefault();
+ // Deprecated: Use mw.hook instead
$( mw ).trigger( 'LivePreviewPrepare' );
$wikiPreview = $( '#wikiPreview' );
+ $editform = $( '#editform' );
// Show #wikiPreview if it's hidden to be able to scroll to it
// (if it is hidden, it's also empty, so nothing changes in the rendering)
@@ -34,16 +36,13 @@
'#p-lang',
// Editing-related
'.templatesUsed',
+ '.limitreport',
'.mw-summary-preview'
];
$copyElements = $( copySelectors.join( ',' ) );
// Not shown during normal preview, to be removed if present
- removeSelectors = [
- '.mw-newarticletext'
- ];
-
- $( removeSelectors.join( ',' ) ).remove();
+ $( '.mw-newarticletext' ).remove();
$spinner = $.createSpinner( {
size: 'large',
@@ -51,36 +50,29 @@
});
$wikiPreview.before( $spinner );
$spinner.css( {
- position: 'absolute',
marginTop: $spinner.height()
} );
- // Make sure preview area is at least as tall as 2x the height of the spinner.
- // 1x because if its smaller, it will spin behind the edit toolbar.
- // (this happens on the first preview when editPreview is still empty)
- // 2x because the spinner has 1x margin top breathing room.
- $wikiPreview.css( 'minHeight', $spinner.height() * 2 );
// Can't use fadeTo because it calls show(), and we might want to keep some elements hidden
// (e.g. empty #catlinks)
- $copyElements.animate( {
- opacity: 0.4
- }, 'fast' );
+ $copyElements.animate( { opacity: 0.4 }, 'fast' );
$previewDataHolder = $( '<div>' );
- targetUrl = $( '#editform' ).attr( 'action' );
+ targetUrl = $editform.attr( 'action' );
// Gather all the data from the form
- postData = $( '#editform' ).formToArray();
+ postData = $editform.formToArray();
postData.push( {
name: e.target.name,
value: ''
} );
// Load new preview data.
- // TODO: This should use the action=parse API instead of loading the entire page
- // Though that requires figuring out how to conver that raw data into proper HTML.
+ // TODO: This should use the action=parse API instead of loading the entire page,
+ // although that requires figuring out how to convert that raw data into proper HTML.
$previewDataHolder.load( targetUrl + ' ' + copySelectors.join( ',' ), postData, function () {
var i, $from;
+
// Copy the contents of the specified elements from the loaded page to the real page.
// Also copy their class attributes.
for ( i = 0; i < copySelectors.length; i++ ) {
@@ -92,16 +84,19 @@
.attr( 'class', $from.attr( 'class' ) );
}
+ // Deprecated: Use mw.hook instead
+ $( mw ).trigger( 'LivePreviewDone', [copySelectors] );
+
+ mw.hook( 'wikipage.content' ).fire( $wikiPreview );
+
$spinner.remove();
$copyElements.animate( {
opacity: 1
}, 'fast' );
-
- $( mw ).trigger( 'LivePreviewDone', [copySelectors] );
} );
}
- $( document ).ready( function () {
+ $( function () {
// Do not enable on user .js/.css pages, as there's no sane way of "previewing"
// the scripts or styles without reloading the page.
if ( $( '#mw-userjsyoucanpreview' ).length || $( '#mw-usercssyoucanpreview' ).length ) {
@@ -109,32 +104,32 @@
}
// The following elements can change in a preview but are not output
- // by the server when they're empty until the preview reponse.
+ // by the server when they're empty until the preview response.
// TODO: Make the server output these always (in a hidden state), so we don't
// have to fish and (hopefully) put them in the right place (since skins
// can change where they are output).
if ( !document.getElementById( 'p-lang' ) && document.getElementById( 'p-tb' ) ) {
$( '#p-tb' ).after(
- $( '<div>' ).prop( 'id', 'p-lang' )
+ $( '<div>' ).attr( 'id', 'p-lang' )
);
}
if ( !$( '.mw-summary-preview' ).length ) {
$( '.editCheckboxes' ).before(
- $( '<div>' ).prop( 'className', 'mw-summary-preview' )
+ $( '<div>' ).addClass( 'mw-summary-preview' )
);
}
if ( !document.getElementById( 'wikiDiff' ) && document.getElementById( 'wikiPreview' ) ) {
$( '#wikiPreview' ).after(
- $( '<div>' ).prop( 'id', 'wikiDiff')
+ $( '<div>' ).attr( 'id', 'wikiDiff' )
);
}
- // Make sure diff styles are loaded
- mw.loader.load( 'mediawiki.action.history.diff' );
-
+ // This should be moved down to '#editform', but is kept on the body for now
+ // because the LiquidThreads extension is re-using this module with only half
+ // the EditPage (doesn't include #editform presumably, bug 55463).
$( document.body ).on( 'click', '#wpPreview, #wpDiff', doLivePreview );
} );
diff --git a/extensions/Vector/modules/ext.vector.footerCleanup.css b/resources/mediawiki.action/mediawiki.action.edit.styles.css
index a361346b..4a2bab3d 100644
--- a/extensions/Vector/modules/ext.vector.footerCleanup.css
+++ b/resources/mediawiki.action/mediawiki.action.edit.styles.css
@@ -1,5 +1,5 @@
/**
- * Footer cleanup
+ * Styles for elements of the editing form.
*/
/* General layout */
@@ -16,34 +16,6 @@
margin-bottom: 2em;
}
-/* Styles for collapsible lists of templates used and hidden categories */
-.collapsible-list {
- display: inline;
- cursor: pointer;
- min-width: 400px;
-}
-
-.collapsible-list span {
- float: left;
- /* @embed */
- background-image: url(./images/open.png);
- background-repeat: no-repeat;
- background-position: 50% 50%;
- display: block;
- height: 16px;
- width: 16px;
-}
-
-.collapsible-list span.collapsed {
- /* @embed */
- background-image: url(./images/closed-ltr.png);
-}
-
-.hiddencats ul, .templatesUsed ul {
- margin-bottom: 1em;
- margin-left: 2.5em;
-}
-
/* Adjustments to edit form elements */
.editCheckboxes {
margin-bottom: 1em;
diff --git a/resources/mediawiki.action/mediawiki.action.history.js b/resources/mediawiki.action/mediawiki.action.history.js
index e9d320c1..04f045a5 100644
--- a/resources/mediawiki.action/mediawiki.action.history.js
+++ b/resources/mediawiki.action/mediawiki.action.history.js
@@ -1,7 +1,7 @@
/**
* JavaScript for History action
*/
-jQuery( document ).ready( function ( $ ) {
+jQuery( function ( $ ) {
var $historyCompareForm = $( '#mw-history-compare' ),
$historySubmitter,
$lis = $( '#pagehistory > li' );
diff --git a/resources/mediawiki.action/mediawiki.action.view.postEdit.css b/resources/mediawiki.action/mediawiki.action.view.postEdit.css
new file mode 100644
index 00000000..be88337e
--- /dev/null
+++ b/resources/mediawiki.action/mediawiki.action.view.postEdit.css
@@ -0,0 +1,77 @@
+.postedit-container {
+ margin: 0 auto;
+ position: fixed;
+ top: 0;
+ height: 0;
+ left: 50%;
+ z-index: 1000;
+ font-size: 13px;
+}
+
+.postedit-container:hover {
+ cursor: pointer;
+}
+
+.postedit {
+ position: relative;
+ top: 0.6em;
+ left: -50%;
+ padding: .6em 3.6em .6em 1.1em;
+ line-height: 1.5625em;
+ color: #626465;
+ background-color: #f4f4f4;
+ border: 1px solid #dcd9d9;
+ text-shadow: 0 0.0625em 0 rgba(255, 255, 255, 0.5);
+ border-radius: 5px;
+ -webkit-box-shadow: 0 2px 5px 0 #ccc;
+ box-shadow: 0 2px 5px 0 #ccc;
+ -webkit-transition: all 0.25s ease-in-out;
+ -moz-transition: all 0.25s ease-in-out;
+ -ms-transition: all 0.25s ease-in-out;
+ -o-transition: all 0.25s ease-in-out;
+ transition: all 0.25s ease-in-out;
+}
+
+.skin-monobook .postedit {
+ top: 6em !important;
+}
+
+.postedit-faded {
+ opacity: 0;
+}
+
+.postedit-icon {
+ padding-left: 41px; /* 25 + 8 + 8 */
+ /* like min-height, but old IE compatible and keeps text vertically aligned, too */
+ line-height: 25px;
+ background-repeat: no-repeat;
+ background-position: 8px 50%;
+}
+
+.postedit-icon-checkmark {
+ /* @embed */
+ background-image: url(images/green-checkmark.png);
+ background-position: left;
+}
+
+.postedit-close {
+ position: absolute;
+ padding: 0 .8em;
+ right: 0;
+ top: 0;
+ font-size: 1.25em;
+ font-weight: bold;
+ line-height: 2.3em;
+ color: black;
+ text-shadow: 0 0.0625em 0 white;
+ text-decoration: none;
+ opacity: 0.2;
+ filter: alpha(opacity=20);
+}
+
+.postedit-close:hover {
+ color: black;
+ text-decoration: none;
+ opacity: 0.4;
+ filter: alpha(opacity=40);
+}
diff --git a/resources/mediawiki.action/mediawiki.action.view.postEdit.js b/resources/mediawiki.action/mediawiki.action.view.postEdit.js
index a11233fa..6e4df9f0 100644
--- a/resources/mediawiki.action/mediawiki.action.view.postEdit.js
+++ b/resources/mediawiki.action/mediawiki.action.view.postEdit.js
@@ -1,15 +1,76 @@
( function ( mw, $ ) {
- // Only a view can be a post-edit.
- if ( mw.config.get( 'wgAction' ) !== 'view' ) {
- return;
+ 'use strict';
+
+ /**
+ * @event postEdit
+ * @member mw.hook
+ * @param {Object} [data] Optional data
+ * @param {string|jQuery|Array} [data.message] Message that listeners
+ * should use when displaying notifications. String for plain text,
+ * use array or jQuery object to pass actual nodes.
+ * @param {string|mw.user} [data.user=mw.user] User that made the edit.
+ */
+
+ /**
+ * After the listener for #postEdit removes the notification.
+ *
+ * @event postEdit_afterRemoval
+ * @member mw.hook
+ */
+
+ var config = mw.config.get( [ 'wgAction', 'wgCookiePrefix', 'wgCurRevisionId' ] ),
+ // This should match EditPage::POST_EDIT_COOKIE_KEY_PREFIX:
+ cookieKey = config.wgCookiePrefix + 'PostEditRevision' + config.wgCurRevisionId,
+ $div, id;
+
+ function showConfirmation( data ) {
+ data = data || {};
+ if ( data.message === undefined ) {
+ data.message = $.parseHTML( mw.message( 'postedit-confirmation', data.user || mw.user ).escaped() );
+ }
+
+ $div = $(
+ '<div class="postedit-container">' +
+ '<div class="postedit">' +
+ '<div class="postedit-icon postedit-icon-checkmark postedit-content"></div>' +
+ '<a href="#" class="postedit-close">&times;</a>' +
+ '</div>' +
+ '</div>'
+ );
+
+ if ( typeof data.message === 'string' ) {
+ $div.find( '.postedit-content' ).text( data.message );
+ } else if ( typeof data.message === 'object' ) {
+ $div.find( '.postedit-content' ).append( data.message );
+ }
+
+ $div
+ .click( fadeOutConfirmation )
+ .prependTo( 'body' );
+
+ id = setTimeout( fadeOutConfirmation, 3000 );
}
- // Matches EditPage::POST_EDIT_COOKIE_KEY_PREFIX
- var cookieKey = mw.config.get( 'wgCookiePrefix' ) + 'PostEditRevision' + mw.config.get( 'wgCurRevisionId' );
+ function fadeOutConfirmation() {
+ clearTimeout( id );
+ $div.find( '.postedit' ).addClass( 'postedit postedit-faded' );
+ setTimeout( removeConfirmation, 500 );
- if ( $.cookie( cookieKey ) === '1' ) {
- // We just saved this page
+ return false;
+ }
+
+ function removeConfirmation() {
+ $div.remove();
+ mw.hook( 'postEdit.afterRemoval' ).fire();
+ }
+
+ mw.hook( 'postEdit' ).add( showConfirmation );
+
+ if ( config.wgAction === 'view' && $.cookie( cookieKey ) === '1' ) {
$.cookie( cookieKey, null, { path: '/' } );
mw.config.set( 'wgPostEdit', true );
+
+ mw.hook( 'postEdit' ).fire();
}
+
} ( mediaWiki, jQuery ) );
diff --git a/resources/mediawiki.action/mediawiki.action.view.rightClickEdit.js b/resources/mediawiki.action/mediawiki.action.view.rightClickEdit.js
index 61d9d150..93befe3a 100644
--- a/resources/mediawiki.action/mediawiki.action.view.rightClickEdit.js
+++ b/resources/mediawiki.action/mediawiki.action.view.rightClickEdit.js
@@ -5,10 +5,10 @@
*/
jQuery( function ( $ ) {
// Select all h1-h6 elements that contain editsection links
- // Don't use the ":has:(.editsection a)" selector because it performs very bad.
+ // Don't use the ":has:(.mw-editsection a)" selector because it performs very bad.
// http://jsperf.com/jq-1-7-2-vs-jq-1-8-1-performance-of-mw-has/2
$( document ).on( 'contextmenu', 'h1, h2, h3, h4, h5, h6', function ( e ) {
- var $edit = $( this ).find( '.editsection a' );
+ var $edit = $( this ).find( '.mw-editsection a' );
if ( !$edit.length ) {
return;
}
diff --git a/resources/mediawiki.api/mediawiki.api.category.js b/resources/mediawiki.api/mediawiki.api.category.js
index 4de52911..98a9c54b 100644
--- a/resources/mediawiki.api/mediawiki.api.category.js
+++ b/resources/mediawiki.api/mediawiki.api.category.js
@@ -14,12 +14,13 @@
* @return {boolean} return.done.isCategory Whether the category exists.
*/
isCategory: function ( title, ok, err ) {
- var d = $.Deferred();
+ var d = $.Deferred(),
+ apiPromise;
+
// Backwards compatibility (< MW 1.20)
- d.done( ok );
- d.fail( err );
+ d.done( ok ).fail( err );
- this.get( {
+ apiPromise = this.get( {
prop: 'categoryinfo',
titles: title.toString()
} )
@@ -36,7 +37,7 @@
})
.fail( d.reject );
- return d.promise();
+ return d.promise( { abort: apiPromise.abort } );
},
/**
@@ -50,13 +51,14 @@
* @return {String[]} return.done.categories Matched categories
*/
getCategoriesByPrefix: function ( prefix, ok, err ) {
- var d = $.Deferred();
+ var d = $.Deferred(),
+ apiPromise;
+
// Backwards compatibility (< MW 1.20)
- d.done( ok );
- d.fail( err );
+ d.done( ok ).fail( err );
// Fetch with allpages to only get categories that have a corresponding description page.
- this.get( {
+ apiPromise = this.get( {
list: 'allpages',
apprefix: prefix,
apnamespace: mw.config.get('wgNamespaceIds').category
@@ -72,7 +74,7 @@
})
.fail( d.reject );
- return d.promise();
+ return d.promise( { abort: apiPromise.abort } );
},
@@ -88,12 +90,13 @@
* if title was not found.
*/
getCategories: function ( title, ok, err, async ) {
- var d = $.Deferred();
+ var d = $.Deferred(),
+ apiPromise;
+
// Backwards compatibility (< MW 1.20)
- d.done( ok );
- d.fail( err );
+ d.done( ok ).fail( err );
- this.get( {
+ apiPromise = this.get( {
prop: 'categories',
titles: title.toString()
}, {
@@ -114,10 +117,10 @@
} );
}
d.resolve( ret );
- })
+ } )
.fail( d.reject );
- return d.promise();
+ return d.promise( { abort: apiPromise.abort } );
}
} );
diff --git a/resources/mediawiki.api/mediawiki.api.edit.js b/resources/mediawiki.api/mediawiki.api.edit.js
index 3c775ad0..cc83a4b8 100644
--- a/resources/mediawiki.api/mediawiki.api.edit.js
+++ b/resources/mediawiki.api/mediawiki.api.edit.js
@@ -3,9 +3,6 @@
*/
( function ( mw, $ ) {
- // Cache token so we don't have to keep fetching new ones for every single request.
- var cachedToken = null;
-
$.extend( mw.Api.prototype, {
/**
@@ -19,32 +16,7 @@
* @return {jQuery.Promise} See #post
*/
postWithEditToken: function ( params, ok, err ) {
- var useTokenToPost, getTokenIfBad,
- api = this;
- if ( cachedToken === null ) {
- // We don't have a valid cached token, so get a fresh one and try posting.
- // We do not trap any 'badtoken' or 'notoken' errors, because we don't want
- // an infinite loop. If this fresh token is bad, something else is very wrong.
- useTokenToPost = function ( token ) {
- params.token = token;
- api.post( params, ok, err );
- };
- return api.getEditToken( useTokenToPost, err );
- } else {
- // We do have a token, but it might be expired. So if it is 'bad' then
- // start over with a new token.
- params.token = cachedToken;
- getTokenIfBad = function ( code, result ) {
- if ( code === 'badtoken' ) {
- // force a new token, clear any old one
- cachedToken = null;
- api.postWithEditToken( params, ok, err );
- } else {
- err( code, result );
- }
- };
- return api.post( params, { ok : ok, err : getTokenIfBad });
- }
+ return this.postWithToken( 'edit', params ).done( ok ).fail( err );
},
/**
@@ -57,37 +29,7 @@
* @return {string} return.done.token Received token.
*/
getEditToken: function ( ok, err ) {
- var d = $.Deferred();
- // Backwards compatibility (< MW 1.20)
- d.done( ok );
- d.fail( err );
-
- this.get( {
- action: 'tokens',
- type: 'edit'
- }, {
- // Due to the API assuming we're logged out if we pass the callback-parameter,
- // we have to disable jQuery's callback system, and instead parse JSON string,
- // by setting 'jsonp' to false.
- // TODO: This concern seems genuine but no other module has it. Is it still
- // needed and/or should we pass this by default?
- jsonp: false
- } )
- .done( function ( data ) {
- var token;
- // If token type is not available for this user,
- // key 'edittoken' is missing or can contain Boolean false
- if ( data.tokens && data.tokens.edittoken ) {
- token = data.tokens.edittoken;
- cachedToken = token;
- d.resolve( token );
- } else {
- d.reject( 'token-missing', data );
- }
- })
- .fail( d.reject );
-
- return d.promise();
+ return this.getToken( 'edit' ).done( ok ).fail( err );
},
/**
@@ -110,8 +52,7 @@
text: message
}, ok, err );
}
-
- } );
+ } );
/**
* @class mw.Api
diff --git a/resources/mediawiki.api/mediawiki.api.js b/resources/mediawiki.api/mediawiki.api.js
index cf7443f3..cdc67679 100644
--- a/resources/mediawiki.api/mediawiki.api.js
+++ b/resources/mediawiki.api/mediawiki.api.js
@@ -20,7 +20,8 @@
dataType: 'json'
}
- };
+ },
+ tokenCache = {};
/**
* Constructor to create an object to interact with the API of a particular MediaWiki server.
@@ -115,7 +116,8 @@
*/
ajax: function ( parameters, ajaxOptions ) {
var token,
- apiDeferred = $.Deferred();
+ apiDeferred = $.Deferred(),
+ xhr;
parameters = $.extend( {}, this.defaults.parameters, parameters );
ajaxOptions = $.extend( {}, this.defaults.ajax, ajaxOptions );
@@ -147,7 +149,7 @@
}
// Make the AJAX request
- $.ajax( ajaxOptions )
+ xhr = $.ajax( ajaxOptions )
// If AJAX fails, reject API call with error code 'http'
// and details in second argument.
.fail( function ( xhr, textStatus, exception ) {
@@ -172,11 +174,85 @@
} );
// Return the Promise
- return apiDeferred.promise().fail( function ( code, details ) {
+ return apiDeferred.promise( { abort: xhr.abort } ).fail( function ( code, details ) {
mw.log( 'mw.Api error: ', code, details );
- });
- }
+ } );
+ },
+
+ /**
+ * Post to API with specified type of token. If we have no token, get one and try to post.
+ * If we have a cached token try using that, and if it fails, blank out the
+ * cached token and start over. For example to change an user option you could do:
+ *
+ * new mw.Api().postWithToken( 'options', {
+ * action: 'options',
+ * optionname: 'gender',
+ * optionvalue: 'female'
+ * } );
+ *
+ * @param {string} tokenType The name of the token, like options or edit.
+ * @param {Object} params API parameters
+ * @return {jQuery.Promise} See #post
+ */
+ postWithToken: function ( tokenType, params ) {
+ var api = this, hasOwn = tokenCache.hasOwnProperty;
+ if ( hasOwn.call( tokenCache, tokenType ) && tokenCache[tokenType] !== undefined ) {
+ params.token = tokenCache[tokenType];
+ return api.post( params ).then(
+ null,
+ function ( code ) {
+ if ( code === 'badtoken' ) {
+ // force a new token, clear any old one
+ tokenCache[tokenType] = params.token = undefined;
+ return api.post( params );
+ }
+ // Pass the promise forward, so the caller gets error codes
+ return this;
+ }
+ );
+ } else {
+ return api.getToken( tokenType ).then( function ( token ) {
+ tokenCache[tokenType] = params.token = token;
+ return api.post( params );
+ } );
+ }
+ },
+ /**
+ * Api helper to grab any token.
+ *
+ * @param {string} type Token type.
+ * @return {jQuery.Promise}
+ * @return {Function} return.done
+ * @return {string} return.done.token Received token.
+ */
+ getToken: function ( type ) {
+ var apiPromise,
+ d = $.Deferred();
+
+ apiPromise = this.get( {
+ action: 'tokens',
+ type: type
+ }, {
+ // Due to the API assuming we're logged out if we pass the callback-parameter,
+ // we have to disable jQuery's callback system, and instead parse JSON string,
+ // by setting 'jsonp' to false.
+ // TODO: This concern seems genuine but no other module has it. Is it still
+ // needed and/or should we pass this by default?
+ } )
+ .done( function ( data ) {
+ // If token type is not available for this user,
+ // key '...token' is missing or can contain Boolean false
+ if ( data.tokens && data.tokens[type + 'token'] ) {
+ d.resolve( data.tokens[type + 'token'] );
+ } else {
+ d.reject( 'token-missing', data );
+ }
+ } )
+ .fail( d.reject );
+
+ return d.promise( { abort: apiPromise.abort } );
+ }
};
/**
diff --git a/resources/mediawiki.api/mediawiki.api.login.js b/resources/mediawiki.api/mediawiki.api.login.js
new file mode 100644
index 00000000..ccbae06c
--- /dev/null
+++ b/resources/mediawiki.api/mediawiki.api.login.js
@@ -0,0 +1,54 @@
+/**
+ * Make the two-step login easier.
+ * @author Niklas Laxström
+ * @class mw.Api.plugin.login
+ * @since 1.22
+ */
+( function ( mw, $ ) {
+ 'use strict';
+
+ $.extend( mw.Api.prototype, {
+ /**
+ * @param {string} username
+ * @param {string} password
+ * @return {jQuery.Promise} See mw.Api#post
+ */
+ login: function ( username, password ) {
+ var params, request,
+ deferred = $.Deferred(),
+ api = this;
+
+ params = {
+ action: 'login',
+ lgname: username,
+ lgpassword: password
+ };
+
+ request = api.post( params );
+ request.fail( deferred.reject );
+ request.done( function ( data ) {
+ params.lgtoken = data.login.token;
+ api.post( params )
+ .fail( deferred.reject )
+ .done( function ( data ) {
+ var code;
+ if ( data.login && data.login.result === 'Success' ) {
+ deferred.resolve( data );
+ } else {
+ // Set proper error code whenever possible
+ code = data.error && data.error.code || 'unknown';
+ deferred.reject( code, data );
+ }
+ } );
+ } );
+
+ return deferred.promise( { abort: request.abort } );
+ }
+ } );
+
+ /**
+ * @class mw.Api
+ * @mixins mw.Api.plugin.login
+ */
+
+}( mediaWiki, jQuery ) );
diff --git a/resources/mediawiki.api/mediawiki.api.parse.js b/resources/mediawiki.api/mediawiki.api.parse.js
index ea0388c1..c4d23b82 100644
--- a/resources/mediawiki.api/mediawiki.api.parse.js
+++ b/resources/mediawiki.api/mediawiki.api.parse.js
@@ -15,13 +15,15 @@
* @return {string} return.done.data Parsed HTML of `wikitext`.
*/
parse: function ( wikitext, ok, err ) {
- var d = $.Deferred();
+ var d = $.Deferred(),
+ apiPromise;
+
// Backwards compatibility (< MW 1.20)
- d.done( ok );
- d.fail( err );
+ d.done( ok ).fail( err );
- this.get( {
+ apiPromise = this.get( {
action: 'parse',
+ contentmodel: 'wikitext',
text: wikitext
} )
.done( function ( data ) {
@@ -31,7 +33,7 @@
} )
.fail( d.reject );
- return d.promise();
+ return d.promise( { abort: apiPromise.abort } );
}
} );
diff --git a/resources/mediawiki.api/mediawiki.api.watch.js b/resources/mediawiki.api/mediawiki.api.watch.js
index c86a90a7..49a4c622 100644
--- a/resources/mediawiki.api/mediawiki.api.watch.js
+++ b/resources/mediawiki.api/mediawiki.api.watch.js
@@ -19,10 +19,12 @@
* @return {string} return.done.watch.message Parsed HTML of the confirmational interface message
*/
function doWatchInternal( page, ok, err, addParams ) {
- var params, d = $.Deferred();
+ var params,
+ d = $.Deferred(),
+ apiPromise;
+
// Backwards compatibility (< MW 1.20)
- d.done( ok );
- d.fail( err );
+ d.done( ok ).fail( err );
params = {
action: 'watch',
@@ -35,13 +37,13 @@
$.extend( params, addParams );
}
- this.post( params )
+ apiPromise = this.post( params )
.done( function ( data ) {
d.resolve( data.watch );
} )
.fail( d.reject );
- return d.promise();
+ return d.promise( { abort: apiPromise.abort } );
}
$.extend( mw.Api.prototype, {
diff --git a/resources/mediawiki.language/mediawiki.language.js b/resources/mediawiki.language/mediawiki.language.js
index 7f729bdc..631d13df 100644
--- a/resources/mediawiki.language/mediawiki.language.js
+++ b/resources/mediawiki.language/mediawiki.language.js
@@ -45,11 +45,34 @@ var language = {
*/
convertPlural: function ( count, forms ) {
var pluralRules,
+ formCount,
+ form,
+ index,
+ equalsPosition,
pluralFormIndex = 0;
if ( !forms || forms.length === 0 ) {
return '';
}
+
+ // Handle for explicit n= forms
+ for ( index = 0; index < forms.length; index++ ) {
+ form = forms[index];
+ if ( /^\d+=/.test( form ) ) {
+ equalsPosition = form.indexOf( '=' );
+ formCount = parseInt( form.substring( 0, equalsPosition ), 10 );
+ if ( formCount === count ) {
+ return form.substr( equalsPosition + 1 );
+ }
+ forms[index] = undefined;
+ }
+ }
+
+ // Remove explicit plural forms from the forms.
+ forms = $.map( forms, function ( form ) {
+ return form;
+ } );
+
pluralRules = mw.language.getData( mw.config.get( 'wgUserLanguage' ), 'pluralRules' );
if ( !pluralRules ) {
// default fallback.
diff --git a/resources/mediawiki.language/mediawiki.language.months.js b/resources/mediawiki.language/mediawiki.language.months.js
new file mode 100644
index 00000000..3d4b7ee7
--- /dev/null
+++ b/resources/mediawiki.language/mediawiki.language.months.js
@@ -0,0 +1,54 @@
+/**
+ * Transfer of month names from messages into mw.language.
+ *
+ * Loading this module also ensures the availability of appropriate messages via mw.msg.
+ */
+( function ( mw, $ ) {
+ var
+ monthMessages = [
+ 'january', 'february', 'march', 'april',
+ 'may_long', 'june', 'july', 'august',
+ 'september', 'october', 'november', 'december'
+ ],
+ monthGenMessages = [
+ 'january-gen', 'february-gen', 'march-gen', 'april-gen',
+ 'may-gen', 'june-gen', 'july-gen', 'august-gen',
+ 'september-gen', 'october-gen', 'november-gen', 'december-gen'
+ ],
+ monthAbbrevMessages = [
+ 'jan', 'feb', 'mar', 'apr',
+ 'may', 'jun', 'jul', 'aug',
+ 'sep', 'oct', 'nov', 'dec'
+ ];
+
+ // Function suitable for passing to jQuery.map
+ // Can't use mw.msg directly because jQuery.map passes element index as second argument
+ function mwMsgMapper( key ) {
+ return mw.msg( key );
+ }
+
+ /**
+ * Information about month names in current UI language.
+ *
+ * Object keys:
+ * - `names`: array of month names (in nominative case in languages which have the distinction),
+ * zero-indexed
+ * - `genitive`: array of month names in genitive case, zero-indexed
+ * - `abbrev`: array of three-letter-long abbreviated month names, zero-indexed
+ * - `keys`: object with three keys like the above, containing zero-indexed arrays of message keys
+ * for appropriate messages which can be passed to mw.msg.
+ *
+ * @property
+ */
+ mw.language.months = {
+ keys: {
+ names: monthMessages,
+ genitive: monthGenMessages,
+ abbrev: monthAbbrevMessages
+ },
+ names: $.map( monthMessages, mwMsgMapper ),
+ genitive: $.map( monthGenMessages, mwMsgMapper ),
+ abbrev: $.map( monthAbbrevMessages, mwMsgMapper )
+ };
+
+}( mediaWiki, jQuery ) );
diff --git a/resources/mediawiki.less/mediawiki.mixins.less b/resources/mediawiki.less/mediawiki.mixins.less
new file mode 100644
index 00000000..19a715b9
--- /dev/null
+++ b/resources/mediawiki.less/mediawiki.mixins.less
@@ -0,0 +1,46 @@
+/**
+ * Common LESS mixin library for MediaWiki
+ *
+ * By default the folder containing this file is included in $wgResourceLoaderLESSImportPaths,
+ * which makes this file importable by all less files via '@import "mediawiki.mixins";'.
+ *
+ * The mixins included below are considered a public interface for MediaWiki extensions.
+ * The signatures of parametrized mixins should be kept as stable as possible.
+ *
+ * See <http://lesscss.org/#-mixins> for more information about how to write mixins.
+ */
+
+.background-image(@url) when (embeddable(@url)) {
+ background-image: embed(@url);
+ background-image: url(@url)!ie;
+}
+
+.background-image(@url) when not (embeddable(@url)) {
+ background-image: url(@url);
+}
+
+/* Note gzip compression means that it is okay to embed twice */
+.background-image-svg(@svg, @fallback) {
+ background-image: url(@fallback);
+ /* SVG support using a transparent gradient to guarantee cross-browser
+ * compatibility (browsers able to understand gradient syntax support also SVG) */
+ /* @embed */ background-image: -webkit-linear-gradient(transparent, transparent), url(@svg);
+ /* @embed */ background-image: linear-gradient(transparent, transparent), url(@svg);
+}
+
+/* Caution: Does not support localisable images */
+.list-style-image(@url) when (embeddable(@url)) {
+ list-style-image: embed(@url);
+ list-style-image: url(@url)!ie;
+}
+
+.list-style-image(@url) when not (embeddable(@url)) {
+ list-style-image: url(@url);
+}
+
+.transition(@string) {
+ -webkit-transition: @string;
+ -moz-transition: @string;
+ -o-transition: @string;
+ transition: @string;
+}
diff --git a/resources/mediawiki.libs/mediawiki.libs.jpegmeta.js b/resources/mediawiki.libs/mediawiki.libs.jpegmeta.js
index af49889a..22429246 100644
--- a/resources/mediawiki.libs/mediawiki.libs.jpegmeta.js
+++ b/resources/mediawiki.libs/mediawiki.libs.jpegmeta.js
@@ -274,7 +274,7 @@
this.JpegMeta.JpegFile.prototype._JFIF_IDENT = "JFIF\x00";
this.JpegMeta.JpegFile.prototype._JFXX_IDENT = "JFXX\x00";
- /* EXIF idents */
+ /* Exif idents */
this.JpegMeta.JpegFile.prototype._EXIF_IDENT = "Exif\x00";
/* TIFF types */
diff --git a/resources/mediawiki.page/mediawiki.page.gallery.js b/resources/mediawiki.page/mediawiki.page.gallery.js
new file mode 100644
index 00000000..147a869d
--- /dev/null
+++ b/resources/mediawiki.page/mediawiki.page.gallery.js
@@ -0,0 +1,248 @@
+/**
+ * Show gallery captions when focused. Copied directly from jquery.mw-jump.js.
+ * Also Dynamically resize images to justify them.
+ */
+( function ( $, mw ) {
+ $( function () {
+ var isTouchScreen,
+ gettingFocus,
+ galleries = 'ul.mw-gallery-packed-overlay, ul.mw-gallery-packed-hover, ul.mw-gallery-packed';
+
+ // Is there a better way to detect a touchscreen? Current check taken from stack overflow.
+ isTouchScreen = !!( window.ontouchstart !== undefined || window.DocumentTouch !== undefined && document instanceof window.DocumentTouch );
+
+ if ( isTouchScreen ) {
+ // Always show the caption for a touch screen.
+ $( 'ul.mw-gallery-packed-hover' )
+ .addClass( 'mw-gallery-packed-overlay' )
+ .removeClass( 'mw-gallery-packed-hover' );
+ } else {
+ // Note use of just "a", not a.image, since we want this to trigger if a link in
+ // the caption receives focus
+ $( 'ul.mw-gallery-packed-hover li.gallerybox' ).on( 'focus blur', 'a', function ( e ) {
+ // Confusingly jQuery leaves e.type as focusout for delegated blur events
+ gettingFocus = e.type !== 'blur' && e.type !== 'focusout';
+ $( this ).closest( 'li.gallerybox' ).toggleClass( 'mw-gallery-focused', gettingFocus );
+ } );
+ }
+
+ // Now on to justification.
+ // We may still get ragged edges if someone resizes their window. Could bind to
+ // that event, otoh do we really want to constantly be resizing galleries?
+ $( galleries ).each( function() {
+ var lastTop,
+ $img,
+ imgWidth,
+ imgHeight,
+ rows = [],
+ $gallery = $( this );
+
+ $gallery.children( 'li' ).each( function() {
+ // Math.floor to be paranoid if things are off by 0.00000000001
+ var top = Math.floor( $(this ).position().top ),
+ $this = $( this );
+
+ if ( top !== lastTop ) {
+ rows[rows.length] = [];
+ lastTop = top;
+ }
+
+ $img = $this.find( 'div.thumb a.image img' );
+ if ( $img.length && $img[0].height ) {
+ imgHeight = $img[0].height;
+ imgWidth = $img[0].width;
+ } else {
+ // If we don't have a real image, get the containing divs width/height.
+ // Note that if we do have a real image, using this method will generally
+ // give the same answer, but can be different in the case of a very
+ // narrow image where extra padding is added.
+ imgHeight = $this.children().children( 'div:first' ).height();
+ imgWidth = $this.children().children( 'div:first' ).width();
+ }
+
+ // Hack to make an edge case work ok
+ if ( imgHeight < 30 ) {
+ // Don't try and resize this item.
+ imgHeight = 0;
+ }
+
+ rows[rows.length-1][rows[rows.length-1].length] = {
+ $elm: $this,
+ width: $this.outerWidth(),
+ imgWidth: imgWidth,
+ aspect: imgWidth / imgHeight, // XXX: can divide by 0 ever happen?
+ captionWidth: $this.children().children( 'div.gallerytextwrapper' ).width(),
+ height: imgHeight
+ };
+ });
+
+ (function () {
+ var maxWidth,
+ combinedAspect,
+ combinedPadding,
+ curRow,
+ curRowHeight,
+ wantedWidth,
+ preferredHeight,
+ newWidth,
+ padding,
+ $outerDiv,
+ $innerDiv,
+ $imageDiv,
+ $imageElm,
+ imageElm,
+ $caption,
+ hookInfo,
+ i,
+ j,
+ avgZoom,
+ totalZoom = 0;
+
+ for ( i = 0; i < rows.length; i++ ) {
+ maxWidth = $gallery.width();
+ combinedAspect = 0;
+ combinedPadding = 0;
+ curRow = rows[i];
+ curRowHeight = 0;
+
+ for ( j = 0; j < curRow.length; j++ ) {
+ if ( curRowHeight === 0 ) {
+ if ( isFinite( curRow[j].height ) ) {
+ // Get the height of this row, by taking the first
+ // non-out of bounds height
+ curRowHeight = curRow[j].height;
+ }
+ }
+
+ if ( curRow[j].aspect === 0 || !isFinite( curRow[j].aspect ) ) {
+ mw.log( 'Skipping item ' + j + ' due to aspect: ' + curRow[j].aspect );
+ // One of the dimensions are 0. Probably should
+ // not try to resize.
+ combinedPadding += curRow[j].width;
+ } else {
+ combinedAspect += curRow[j].aspect;
+ combinedPadding += curRow[j].width - curRow[j].imgWidth;
+ }
+ }
+
+ // Add some padding for inter-element spacing.
+ combinedPadding += 5 * curRow.length;
+ wantedWidth = maxWidth - combinedPadding;
+ preferredHeight = wantedWidth / combinedAspect;
+
+ if ( preferredHeight > curRowHeight * 1.5 ) {
+ // Only expand at most 1.5 times current size
+ // As that's as high a resolution as we have.
+ // Also on the off chance there is a bug in this
+ // code, would prevent accidentally expanding to
+ // be 10 billion pixels wide.
+ mw.log( 'mw.page.gallery: Cannot fit row, aspect is ' + preferredHeight/curRowHeight );
+ if ( i === rows.length - 1 ) {
+ // If its the last row, and we can't fit it,
+ // don't make the entire row huge.
+ avgZoom = ( totalZoom / ( rows.length - 1 ) ) * curRowHeight;
+ if ( isFinite( avgZoom ) && avgZoom >= 1 && avgZoom <= 1.5 ) {
+ preferredHeight = avgZoom;
+ } else {
+ // Probably a single row gallery
+ preferredHeight = curRowHeight;
+ }
+ } else {
+ preferredHeight = 1.5 * curRowHeight;
+ }
+ }
+ if ( !isFinite( preferredHeight ) ) {
+ // This *definitely* should not happen.
+ mw.log( 'mw.page.gallery: Trying to resize row ' + i + ' to ' + preferredHeight + '?!' );
+ // Skip this row.
+ continue;
+ }
+ if ( preferredHeight < 5 ) {
+ // Well something clearly went wrong...
+ mw.log( {maxWidth: maxWidth, combinedPadding: combinedPadding, combinedAspect: combinedAspect, wantedWidth: wantedWidth } );
+ mw.log( 'mw.page.gallery: [BUG!] Fitting row ' + i + ' to too small a size: ' + preferredHeight );
+ // Skip this row.
+ continue;
+ }
+
+ if ( preferredHeight / curRowHeight > 1 ) {
+ totalZoom += preferredHeight / curRowHeight;
+ } else {
+ // If we shrink, still consider that a zoom of 1
+ totalZoom += 1;
+ }
+
+ for ( j = 0; j < curRow.length; j++ ) {
+ newWidth = preferredHeight * curRow[j].aspect;
+ padding = curRow[j].width - curRow[j].imgWidth;
+ $outerDiv = curRow[j].$elm;
+ $innerDiv = $outerDiv.children( 'div' ).first();
+ $imageDiv = $innerDiv.children( 'div.thumb' );
+ $imageElm = $imageDiv.find( 'img' ).first();
+ imageElm = $imageElm.length ? $imageElm[0] : null;
+ $caption = $outerDiv.find( 'div.gallerytextwrapper' );
+
+
+ // Since we are going to re-adjust the height, the vertical
+ // centering margins need to be reset.
+ $imageDiv.children( 'div' ).css( 'margin', '0px auto' );
+
+ if ( newWidth < 60 || !isFinite( newWidth ) ) {
+ // Making something skinnier than this will mess up captions,
+ mw.log( 'mw.page.gallery: Tried to make image ' + newWidth + 'px wide but too narrow.' );
+ if ( newWidth < 1 || !isFinite( newWidth ) ) {
+ $innerDiv.height( preferredHeight );
+ // Don't even try and touch the image size if it could mean
+ // making it disappear.
+ continue;
+ }
+ } else {
+ $outerDiv.width( newWidth + padding );
+ $innerDiv.width( newWidth + padding );
+ $imageDiv.width( newWidth );
+ $caption.width( curRow[j].captionWidth + (newWidth - curRow[j].imgWidth ) );
+ }
+
+ hookInfo = {
+ fullWidth: newWidth + padding,
+ imgWidth: newWidth,
+ imgHeight: preferredHeight,
+ $innerDiv: $innerDiv,
+ $imageDiv: $imageDiv,
+ $outerDiv: $outerDiv,
+ // Whether the hook took action
+ resolved: false
+ };
+
+ /**
+ * Gallery resize.
+ *
+ * If your handler resizes an image, it should also set the resolved
+ * property to true. Additionally, because this module only exposes this
+ * logic temporarily, you should load your module in position top to
+ * ensure it is registered before this runs (FIXME: Don't use mw.hook)
+ *
+ * See TimedMediaHandler for an example.
+ *
+ * @event mediawiki_page_gallery_resize
+ * @member mw.hook
+ * @param {Object} hookInfo
+ */
+ mw.hook( 'mediawiki.page.gallery.resize' ).fire( hookInfo );
+
+ if ( !hookInfo.resolved ) {
+ if ( imageElm ) {
+ // We don't always have an img, e.g. in the case of an invalid file.
+ imageElm.width = newWidth;
+ imageElm.height = preferredHeight;
+ } else {
+ // Not a file box.
+ $imageDiv.height( preferredHeight );
+ }
+ }
+ }
+ }
+ } )();
+ } );
+ } );
+} )( jQuery, mediaWiki );
diff --git a/resources/mediawiki.page/mediawiki.page.image.pagination.js b/resources/mediawiki.page/mediawiki.page.image.pagination.js
new file mode 100644
index 00000000..fb44a76f
--- /dev/null
+++ b/resources/mediawiki.page/mediawiki.page.image.pagination.js
@@ -0,0 +1,51 @@
+/**
+ * Change multi-page image navigation so that the current page display can be changed
+ * without a page reload. Currently, the only image formats that can be multi-page images are
+ * PDF and DjVu files
+ */
+( function (mw, $) {
+ // Use jQuery's load function to specifically select and replace table.multipageimage's child
+ // tr with the new page's table.multipageimage's tr element.
+ // table.multipageimage always has only one row.
+ function loadPage( page ) {
+ var $multipageimage = $( 'table.multipageimage' ),
+ $spinner = $.createSpinner( {
+ size: 'large',
+ type: 'block'
+ } );
+
+ // Set the spinner's dimensions equal to the table's dimensions so that
+ // the current scroll position is not lost after the table is emptied prior to
+ // its contents being updated
+ $spinner.css( {
+ height: $multipageimage.find( 'tr' ).height(),
+ width: $multipageimage.find( 'tr' ).width()
+ } );
+
+ $multipageimage.empty().append( $spinner ).load(
+ page + ' table.multipageimage tr',
+ ajaxifyPageNavigation
+ );
+ }
+
+ function ajaxifyPageNavigation() {
+ // Intercept the default action of the links in the thumbnail navigation
+ $( '.multipageimagenavbox' ).one( 'click', 'a', function ( e ) {
+ loadPage( this.href );
+ e.preventDefault();
+ } );
+
+ // Prevent the submission of the page select form and instead call loadPage
+ $( 'form[name="pageselector"]' ).one( 'change submit', function ( e ) {
+ loadPage( this.action + '?' + $( this ).serialize() );
+ e.preventDefault();
+ } );
+ }
+
+ $( document ).ready( function() {
+ // The presence of table.multipageimage signifies that this file is a multi-page image
+ if( mw.config.get( 'wgNamespaceNumber' ) === 6 && $( 'table.multipageimage' ).length !== 0 ) {
+ ajaxifyPageNavigation();
+ }
+ } );
+}( mediaWiki, jQuery ) );
diff --git a/resources/mediawiki.page/mediawiki.page.patrol.ajax.js b/resources/mediawiki.page/mediawiki.page.patrol.ajax.js
index d7a07d71..75908eee 100644
--- a/resources/mediawiki.page/mediawiki.page.patrol.ajax.js
+++ b/resources/mediawiki.page/mediawiki.page.patrol.ajax.js
@@ -11,7 +11,7 @@
// that didn't have patrolToken yet.
return;
}
- $( document ).ready( function () {
+ $( function () {
var $patrolLinks = $( '.patrollink a' );
$patrolLinks.on( 'click', function ( e ) {
var $spinner, href, rcid, apiRequest;
diff --git a/resources/mediawiki.page/mediawiki.page.ready.js b/resources/mediawiki.page/mediawiki.page.ready.js
index 684f582f..ee416d67 100644
--- a/resources/mediawiki.page/mediawiki.page.ready.js
+++ b/resources/mediawiki.page/mediawiki.page.ready.js
@@ -1,28 +1,40 @@
-( function ( mw, $ ) {
- $( function () {
+( function ( mw , $ ) {
+ var supportsPlaceholder = 'placeholder' in document.createElement( 'input' );
+
+ mw.hook( 'wikipage.content' ).add( function ( $content ) {
var $sortableTables;
- /* Emulate placeholder if not supported by browser */
- if ( !( 'placeholder' in document.createElement( 'input' ) ) ) {
- $( 'input[placeholder]' ).placeholder();
+ // Run jquery.placeholder polyfill if placeholder is not supported
+ if ( !supportsPlaceholder ) {
+ $content.find( 'input[placeholder]' ).placeholder();
}
- /* Enable makeCollapsible */
- $( '.mw-collapsible' ).makeCollapsible();
+ // Run jquery.makeCollapsible
+ $content.find( '.mw-collapsible' ).makeCollapsible();
- /* Lazy load jquery.tablesorter */
- $sortableTables = $( 'table.sortable' );
+ // Lazy load jquery.tablesorter
+ $sortableTables = $content.find( 'table.sortable' );
if ( $sortableTables.length ) {
mw.loader.using( 'jquery.tablesorter', function () {
$sortableTables.tablesorter();
- });
+ } );
}
- /* Enable CheckboxShiftClick */
- $( 'input[type=checkbox]:not(.noshiftselect)' ).checkboxShiftClick();
+ // Run jquery.checkboxShiftClick
+ $content.find( 'input[type="checkbox"]:not(.noshiftselect)' ).checkboxShiftClick();
+ } );
+
+ // Things outside the wikipage content
+ $( function () {
+
+ if ( !supportsPlaceholder ) {
+ // Exclude content to avoid hitting it twice for the (first) wikipage content
+ $( 'input[placeholder]' ).not( '#mw-content-text input' ).placeholder();
+ }
- /* Add accesskey hints to the tooltips */
+ // Add accesskey hints to the tooltips
mw.util.updateTooltipAccessKeys();
} );
+
}( mediaWiki, jQuery ) );
diff --git a/resources/mediawiki.page/mediawiki.page.startup.js b/resources/mediawiki.page/mediawiki.page.startup.js
index 6a11d3e1..38466818 100644
--- a/resources/mediawiki.page/mediawiki.page.startup.js
+++ b/resources/mediawiki.page/mediawiki.page.startup.js
@@ -5,14 +5,23 @@
// Client profile classes for <html>
// Allows for easy hiding/showing of JS or no-JS-specific UI elements
$( 'html' )
- .addClass('client-js' )
+ .addClass( 'client-js' )
.removeClass( 'client-nojs' );
- // Initialize utilities as soon as the document is ready (mw.util.$content,
- // messageBoxNew, profile, tooltip access keys, Table of contents toggle, ..).
- // Enqueued into domready from here instead of mediawiki.page.ready to ensure that it gets enqueued
- // before other modules hook into document ready, so that mw.util.$content (defined by mw.util.init),
- // is defined for them.
- $( mw.util.init );
+ $( function () {
+ // Initialize utilities as soon as the document is ready (mw.util.$content,
+ // messageBoxNew, profile, tooltip access keys, Table of contents toggle, ..).
+ // In the domready here instead of in mediawiki.page.ready to ensure that it gets enqueued
+ // before other modules hook into domready, so that mw.util.$content (defined by
+ // mw.util.init), is defined for them.
+ mw.util.init();
+
+ /**
+ * @event wikipage_content
+ * @member mw.hook
+ * @param {jQuery} $content
+ */
+ mw.hook( 'wikipage.content' ).fire( $( '#mw-content-text' ) );
+ } );
}( mediaWiki, jQuery ) );
diff --git a/resources/mediawiki.page/mediawiki.page.watch.ajax.js b/resources/mediawiki.page/mediawiki.page.watch.ajax.js
index f945fa9d..e9afa4a2 100644
--- a/resources/mediawiki.page/mediawiki.page.watch.ajax.js
+++ b/resources/mediawiki.page/mediawiki.page.watch.ajax.js
@@ -71,7 +71,7 @@
actionPaths = mw.config.get( 'wgActionPaths' );
- // @todo: Does MediaWiki give action path or query param
+ // @todo Does MediaWiki give action path or query param
// precedence ? If the former, move this to the bottom
action = mw.util.getParamValue( 'action', url );
if ( action !== null ) {
@@ -100,7 +100,7 @@
updateWatchLink: updateWatchLink
};
- $( document ).ready( function () {
+ $( function () {
var $links = $( '.mw-watchlink a, a.mw-watchlink, ' +
'#ca-watch a, #ca-unwatch a, #mw-unwatch-link1, ' +
'#mw-unwatch-link2, #mw-watch-link2, #mw-watch-link1' );
@@ -161,7 +161,7 @@
cleanTitle = title.replace( /_/g, ' ' );
link = mw.html.element(
'a', {
- href: mw.util.wikiGetlink( title ),
+ href: mw.util.getUrl( title ),
title: cleanTitle
}, cleanTitle
);
diff --git a/resources/mediawiki.special/images/arrow-collapsed-ltr.png b/resources/mediawiki.special/images/arrow-collapsed-ltr.png
deleted file mode 100644
index 467a555a..00000000
--- a/resources/mediawiki.special/images/arrow-collapsed-ltr.png
+++ /dev/null
Binary files differ
diff --git a/resources/mediawiki.special/images/arrow-collapsed-rtl.png b/resources/mediawiki.special/images/arrow-collapsed-rtl.png
deleted file mode 100644
index 2246254f..00000000
--- a/resources/mediawiki.special/images/arrow-collapsed-rtl.png
+++ /dev/null
Binary files differ
diff --git a/resources/mediawiki.special/images/arrow-expanded.png b/resources/mediawiki.special/images/arrow-expanded.png
deleted file mode 100644
index 58a9fc66..00000000
--- a/resources/mediawiki.special/images/arrow-expanded.png
+++ /dev/null
Binary files differ
diff --git a/resources/mediawiki.special/images/glyph-people-large.png b/resources/mediawiki.special/images/glyph-people-large.png
new file mode 100644
index 00000000..0578be0b
--- /dev/null
+++ b/resources/mediawiki.special/images/glyph-people-large.png
Binary files differ
diff --git a/resources/mediawiki.special/images/icon-contributors.png b/resources/mediawiki.special/images/icon-contributors.png
new file mode 100644
index 00000000..f933aa69
--- /dev/null
+++ b/resources/mediawiki.special/images/icon-contributors.png
Binary files differ
diff --git a/resources/mediawiki.special/images/icon-edits.png b/resources/mediawiki.special/images/icon-edits.png
new file mode 100644
index 00000000..39f4f2de
--- /dev/null
+++ b/resources/mediawiki.special/images/icon-edits.png
Binary files differ
diff --git a/resources/mediawiki.special/images/icon-lock.png b/resources/mediawiki.special/images/icon-lock.png
new file mode 100644
index 00000000..03f0eecd
--- /dev/null
+++ b/resources/mediawiki.special/images/icon-lock.png
Binary files differ
diff --git a/resources/mediawiki.special/images/icon-pages.png b/resources/mediawiki.special/images/icon-pages.png
new file mode 100644
index 00000000..59513db2
--- /dev/null
+++ b/resources/mediawiki.special/images/icon-pages.png
Binary files differ
diff --git a/resources/mediawiki.special/mediawiki.special.block.js b/resources/mediawiki.special/mediawiki.special.block.js
index 2a158dfb..b8bcf177 100644
--- a/resources/mediawiki.special/mediawiki.special.block.js
+++ b/resources/mediawiki.special/mediawiki.special.block.js
@@ -2,7 +2,7 @@
* JavaScript for Special:Block
*/
( function ( mw, $ ) {
- $( document ).ready( function () {
+ $( function () {
var $blockTarget = $( '#mw-bi-target' ),
$anonOnlyRow = $( '#mw-input-wpHardBlock' ).closest( 'tr' ),
$enableAutoblockRow = $( '#mw-input-wpAutoBlock' ).closest( 'tr' ),
diff --git a/resources/mediawiki.special/mediawiki.special.changeemail.js b/resources/mediawiki.special/mediawiki.special.changeemail.js
index 14c2f036..2d22bad0 100644
--- a/resources/mediawiki.special/mediawiki.special.changeemail.js
+++ b/resources/mediawiki.special/mediawiki.special.changeemail.js
@@ -23,7 +23,7 @@
}
}
- $( document ).ready( function () {
+ $( function () {
// 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 immediate feedback.
diff --git a/resources/mediawiki.special/mediawiki.special.changeslist.css b/resources/mediawiki.special/mediawiki.special.changeslist.css
index fcdeba1b..5e4af7b6 100644
--- a/resources/mediawiki.special/mediawiki.special.changeslist.css
+++ b/resources/mediawiki.special/mediawiki.special.changeslist.css
@@ -2,63 +2,6 @@
* Styling for Special:Watchlist and Special:RecentChanges
*/
-table.mw-enhanced-rc {
- border: 0;
- border-spacing: 0;
-}
-
-table.mw-enhanced-rc th,
-table.mw-enhanced-rc td {
- padding: 0;
- vertical-align: top;
-}
-
-td.mw-enhanced-rc {
- white-space: nowrap;
- font-family: monospace;
-}
-
-.mw-enhanced-rc-time {
- font-family: monospace;
-}
-
-table.mw-enhanced-rc td.mw-enhanced-rc-nested {
- padding-left: 1em;
-}
-
-/* Show/hide arrows in enhanced changeslist */
-.mw-enhanced-rc .collapsible-expander {
- float: none;
-}
-
-/* If JS is disabled, the arrows or the placeholder space shouldn't be shown */
-.client-nojs .mw-enhancedchanges-arrow-space {
- display: none;
-}
-
-.mw-enhancedchanges-arrow-space {
- display: inline-block;
- *display: inline; /* IE7 and below */
- zoom: 1;
- width: 15px;
- height: 15px;
-}
-
-/* let it look like it is clickable */
-.mw-enhancedchanges-arrow.mw-collapsible-toggle {
- cursor: pointer;
-}
-
-.mw-enhancedchanges-arrow.mw-collapsible-toggle-collapsed {
- /* @embed */
- background: url(images/arrow-collapsed-ltr.png) no-repeat left center;
-}
-
-.mw-enhancedchanges-arrow.mw-collapsible-toggle-expanded {
- /* @embed */
- background: url(images/arrow-expanded.png) no-repeat left center;
-}
-
.mw-changeslist-line-watched .mw-title {
font-weight: bold;
}
diff --git a/resources/mediawiki.special/mediawiki.special.changeslist.enhanced.css b/resources/mediawiki.special/mediawiki.special.changeslist.enhanced.css
new file mode 100644
index 00000000..bed580d7
--- /dev/null
+++ b/resources/mediawiki.special/mediawiki.special.changeslist.enhanced.css
@@ -0,0 +1,66 @@
+/**
+ * Styling for Special:Watchlist and Special:RecentChanges when preference 'usenewrc'
+ * a.k.a. Enhanced Recent Changes is enabled.
+ */
+
+table.mw-enhanced-rc {
+ border: 0;
+ border-spacing: 0;
+}
+
+table.mw-enhanced-rc th,
+table.mw-enhanced-rc td {
+ padding: 0;
+ vertical-align: top;
+}
+
+td.mw-enhanced-rc {
+ white-space: nowrap;
+ font-family: monospace;
+}
+
+.mw-enhanced-rc-time {
+ font-family: monospace;
+}
+
+table.mw-enhanced-rc td.mw-enhanced-rc-nested {
+ padding-left: 1em;
+}
+
+/* Show/hide arrows in enhanced changeslist */
+.mw-enhanced-rc .collapsible-expander {
+ float: none;
+}
+
+/* If JS is disabled, the arrows or the placeholder space shouldn't be shown */
+.client-nojs .mw-enhancedchanges-arrow-space {
+ display: none;
+}
+
+/*
+ * And if it's enabled, let's optimize the collapsing a little: hide the rows
+ * that would be hidden by jquery.makeCollapsible with CSS to save us some
+ * reflows and repaints. This doesn't work on browsers that don't fully support
+ * CSS2 (IE6), but it's okay, this will be done in JavaScript with old degraded
+ * performance instead.
+ */
+.client-js table.mw-enhanced-rc.mw-collapsed tr + tr {
+ display: none;
+}
+
+.mw-enhancedchanges-arrow-space {
+ display: inline-block;
+ *display: inline; /* IE7 and below */
+ zoom: 1;
+ width: 15px;
+ height: 15px;
+}
+
+/* let it look like it is clickable */
+.mw-enhancedchanges-arrow.mw-collapsible-toggle {
+ cursor: pointer;
+}
+
+.mw-enhanced-watched .mw-enhanced-rc-time {
+ font-weight: bold;
+}
diff --git a/resources/mediawiki.special/mediawiki.special.createAccount.css b/resources/mediawiki.special/mediawiki.special.createAccount.css
new file mode 100644
index 00000000..11d00e75
--- /dev/null
+++ b/resources/mediawiki.special/mediawiki.special.createAccount.css
@@ -0,0 +1,89 @@
+/* Disable the underline that Vector puts on h2 headings, and bold them. */
+.mw-ui-container h2 {
+ border: 0;
+ font-weight: bold;
+}
+
+/**** shuffled CAPTCHA ****/
+#wpCaptchaWord {
+ margin-top: 6px;
+}
+
+.mw-createacct-captcha-container {
+ background-color: #f8f8f8;
+ border: 1px solid #c9c9c9;
+ padding: 10px;
+ text-align: center;
+}
+
+.mw-createacct-captcha-assisted {
+ display: block;
+ margin-top: 0.5em;
+}
+
+/* Put a border around the fancycaptcha-image-container. */
+.mw-createacct-captcha-and-reload {
+ border: 1px solid #c9c9c9;
+ display: table-cell; /* Other display formats end up too wide */
+ width: 270px;
+ background-color: #FFF;
+}
+
+/* Make the fancycaptcha-image-container full-width within its parent. */
+.fancycaptcha-image-container
+{
+ width: 100%;
+}
+
+/**** Benefits column CSS to the right (if it fits) of the form. ****/
+.mw-ui-container #userloginForm {
+ float: left;
+}
+
+div.mw-createacct-benefits-container {
+ /* Keeps this column compact and close to the form, but tends to squish contents. */
+ float: left;
+}
+
+div.mw-createacct-benefits-container h2 {
+ margin-bottom: 30px;
+}
+
+.mw-number-text.icon-edits {
+ /* @embed */
+ background: url(images/icon-edits.png) no-repeat left center;
+}
+
+.mw-number-text.icon-pages {
+ /* @embed */
+ background: url(images/icon-pages.png) no-repeat left center;
+}
+
+.mw-number-text.icon-contributors {
+ /* @embed */
+ background: url(images/icon-contributors.png) no-repeat left center;
+}
+
+/* Special font for numbers in benefits*/
+div.mw-number-text h3 {
+ top: 0;
+ margin: 0;
+ padding: 0;
+ color: #252525;
+ font-family: 'Georgia', serif;
+ font-weight: normal;
+ font-size: 2.2em;
+ line-height: 1.2;
+ text-align: center;
+}
+
+/* Contains a number and explanatory text, with space for an icon */
+div.mw-number-text {
+ display: block;
+ font-size: 1.2em;
+ color: #444;
+ margin-top: 1em;
+ padding: 0 0 0 95px; /* 80px wide icon plus "margin" */
+ min-height: 75px; /* matches max icon height, ensures icon emblem is visible */
+ text-align: center;
+}
diff --git a/resources/mediawiki.special/mediawiki.special.createAccount.js b/resources/mediawiki.special/mediawiki.special.createAccount.js
new file mode 100644
index 00000000..5cbb1ee0
--- /dev/null
+++ b/resources/mediawiki.special/mediawiki.special.createAccount.js
@@ -0,0 +1,112 @@
+/**
+ * JavaScript for Create account form (Special:UserLogin?type=signup).
+ */
+( function ( mw, $ ) {
+
+ // When sending password by email, hide the password input fields.
+ // This function doesn't need to be loaded early by ResourceLoader, but is tiny.
+ function hidePasswordOnEmail() {
+ // Always required if checked, otherwise it depends, so we use the original
+ var $emailLabel = $( 'label[for="wpEmail"]' ),
+ originalText = $emailLabel.text(),
+ requiredText = mw.message( 'createacct-emailrequired' ).text(),
+ $createByMailCheckbox = $( '#wpCreateaccountMail' ),
+ $beforePwds = $( '.mw-row-password:first' ).prev(),
+ $pwds;
+
+ function updateForCheckbox() {
+ var checked = $createByMailCheckbox.prop( 'checked' );
+ if ( checked ) {
+ $pwds = $( '.mw-row-password' ).detach();
+ $emailLabel.text( requiredText );
+ } else {
+ if ( $pwds ) {
+ $beforePwds.after( $pwds );
+ $pwds = null;
+ }
+ $emailLabel.text( originalText );
+ }
+ }
+
+ $createByMailCheckbox.on( 'change', updateForCheckbox );
+ updateForCheckbox();
+ }
+
+ // Move the FancyCaptcha image into a more attractive container.
+ // This function does need to be run early by ResourceLoader.
+ function adjustFancyCaptcha() {
+ var $content = $( '#mw-content-text' ),
+ $submit = $content.find( '#wpCreateaccount' ),
+ tabIndex,
+ $captchaStuff,
+ $captchaImageContainer,
+ // JavaScript can't yet parse the message createacct-imgcaptcha-help when it
+ // contains a MediaWiki transclusion, so PHP parses it and sends the HTML.
+ helpMsg = mw.config.get( 'wgCreateacctImgcaptchaHelp' ),
+ helpHtml = '';
+
+ /*
+ * CAPTCHA
+ * The CAPTCHA is in a div style="captcha" at the top of the form.
+ * If it's a FancyCaptcha, then we remove it and insert it lower down,
+ * in a customized div with just what we need (e.g. no
+ * fancycaptcha-createaccount message).
+ */
+ if ( !$submit.length) {
+ return;
+ }
+ tabIndex = $submit.prop( 'tabindex' ) - 1;
+ $captchaStuff = $content.find ( '.captcha' );
+
+ if ( $captchaStuff.length ) {
+
+ // The FancyCaptcha has this class in the ConfirmEdit extension
+ // after 2013-04-18.
+ $captchaImageContainer = $captchaStuff.find( '.fancycaptcha-image-container' );
+ if ( $captchaImageContainer.length !== 1 ) {
+ return;
+ }
+
+ $captchaStuff.remove();
+
+ if ( helpMsg) {
+ helpHtml = '<small class="mw-createacct-captcha-assisted">' + helpMsg + '</small>';
+ }
+
+ // Insert another div before the submit button that will include the
+ // repositioned FancyCaptcha div, an input field, and possible help.
+ $submit.closest( 'div' )
+ .before( [
+ '<div>',
+ '<label for="wpCaptchaWord">' + mw.message( 'createacct-captcha' ).escaped() + '</label>',
+ '<div class="mw-createacct-captcha-container">',
+ '<div class="mw-createacct-captcha-and-reload" />',
+ '<input id="wpCaptchaWord" name="wpCaptchaWord" type="text" placeholder="' +
+ mw.message( 'createacct-imgcaptcha-ph' ).escaped() +
+ '" tabindex="' + tabIndex + '" autocapitalize="off" autocorrect="off">',
+ helpHtml,
+ '</div>',
+ '</div>'
+ ].join( '' )
+ );
+
+ // Stick the FancyCaptcha container inside our bordered and framed parents.
+ $captchaImageContainer
+ .prependTo( $content.find( '.mw-createacct-captcha-and-reload' ) );
+
+ // Find the input field, add the text (if any) of the existing CAPTCHA
+ // field (although usually it's blanked out on every redisplay),
+ // and after it move over the hidden field that tells the CAPTCHA
+ // what to do.
+ $content.find( '#wpCaptchaWord' )
+ .val( $captchaStuff.find( '#wpCaptchaWord' ).val() )
+ .after( $captchaStuff.find( '#wpCaptchaId' ) );
+ }
+ }
+
+ $( function () {
+ adjustFancyCaptcha();
+ hidePasswordOnEmail();
+ } );
+
+}( mediaWiki, jQuery ) );
diff --git a/resources/mediawiki.special/mediawiki.special.movePage.js b/resources/mediawiki.special/mediawiki.special.movePage.js
index f719d07c..922eba5e 100644
--- a/resources/mediawiki.special/mediawiki.special.movePage.js
+++ b/resources/mediawiki.special/mediawiki.special.movePage.js
@@ -1,6 +1,6 @@
/**
* JavaScript for Special:MovePage
*/
-jQuery( document ).ready( function ( $ ) {
+jQuery( function ( $ ) {
$( '#wpReason, #wpNewTitleMain' ).byteLimit();
} );
diff --git a/resources/mediawiki.special/mediawiki.special.pagesWithProp.css b/resources/mediawiki.special/mediawiki.special.pagesWithProp.css
new file mode 100644
index 00000000..7ef75d0c
--- /dev/null
+++ b/resources/mediawiki.special/mediawiki.special.pagesWithProp.css
@@ -0,0 +1,4 @@
+/* Distinguish actual data from information about it being hidden visually */
+.prop-value-hidden {
+ font-style: italic;
+}
diff --git a/resources/mediawiki.special/mediawiki.special.preferences.js b/resources/mediawiki.special/mediawiki.special.preferences.js
index 6eaec6a1..03d93d00 100644
--- a/resources/mediawiki.special/mediawiki.special.preferences.js
+++ b/resources/mediawiki.special/mediawiki.special.preferences.js
@@ -1,7 +1,7 @@
/**
* JavaScript for Special:Preferences
*/
-jQuery( document ).ready( function ( $ ) {
+jQuery( function ( $ ) {
var $preftoc, $preferences, $fieldsets, $legends,
hash,
$tzSelect, $tzTextbox, $localtimeHolder, servertime;
diff --git a/resources/mediawiki.special/mediawiki.special.recentchanges.js b/resources/mediawiki.special/mediawiki.special.recentchanges.js
index d1c1354f..79d793af 100644
--- a/resources/mediawiki.special/mediawiki.special.recentchanges.js
+++ b/resources/mediawiki.special/mediawiki.special.recentchanges.js
@@ -27,7 +27,7 @@
}
};
- $( document ).ready( rc.init );
+ $( rc.init );
mw.special.recentchanges = rc;
diff --git a/resources/mediawiki.special/mediawiki.special.search.js b/resources/mediawiki.special/mediawiki.special.search.js
index 2dab3026..035252bf 100644
--- a/resources/mediawiki.special/mediawiki.special.search.js
+++ b/resources/mediawiki.special/mediawiki.special.search.js
@@ -2,7 +2,7 @@
* JavaScript for Special:Search
*/
( function ( mw, $ ) {
- $( document ).ready( function () {
+ $( function () {
var $checkboxes, $headerLinks;
// Emulate HTML5 autofocus behavior in non HTML5 compliant browsers
diff --git a/resources/mediawiki.special/mediawiki.special.undelete.js b/resources/mediawiki.special/mediawiki.special.undelete.js
index d20aab51..0dea3ef9 100644
--- a/resources/mediawiki.special/mediawiki.special.undelete.js
+++ b/resources/mediawiki.special/mediawiki.special.undelete.js
@@ -1,7 +1,7 @@
/**
* JavaScript for Special:Undelete
*/
-jQuery( document ).ready( function ( $ ) {
+jQuery( function ( $ ) {
$( '#mw-undelete-invert' ).click( function ( e ) {
$( '#undelete input[type="checkbox"]' ).prop( 'checked', function ( i, val ) {
return !val;
diff --git a/resources/mediawiki.special/mediawiki.special.upload.js b/resources/mediawiki.special/mediawiki.special.upload.js
index 75532f18..3f40c549 100644
--- a/resources/mediawiki.special/mediawiki.special.upload.js
+++ b/resources/mediawiki.special/mediawiki.special.upload.js
@@ -6,7 +6,7 @@
/**
* Add a preview to the upload form
*/
- $( document ).ready( function () {
+ $( function () {
/**
* Is the FileAPI available with sufficient functionality?
*/
@@ -290,7 +290,7 @@
/**
* Disable all upload source fields except the selected one
*/
- $( document ).ready( function () {
+ $( function () {
var i, $row,
$rows = $( '.mw-htmlform-field-UploadSourceField' );
diff --git a/resources/mediawiki.special/mediawiki.special.userLogin.css b/resources/mediawiki.special/mediawiki.special.userLogin.css
new file mode 100644
index 00000000..24c8d771
--- /dev/null
+++ b/resources/mediawiki.special/mediawiki.special.userLogin.css
@@ -0,0 +1,39 @@
+/* Styles just for VForm user login */
+#mw-userlogin-help {
+ text-align: center;
+}
+
+.mw-ui-vform .mw-secure {
+ /* @embed */
+ background: url(images/icon-lock.png) no-repeat scroll left center transparent;
+ margin: 0 0 0 1px;
+ padding: 0 0 0 11px;
+}
+
+/* The login form invites users to create an account */
+#mw-createaccount-cta {
+ width: 20em;
+ height: 10em;
+ /* @embed */
+ background: url(images/glyph-people-large.png) no-repeat 50%;
+ margin: 0 auto;
+}
+
+#mw-createaccount-cta h3,
+#mw-createaccount-another h3 {
+ font-size: 0.9em;
+ font-weight: normal;
+ text-align: center;
+}
+
+#mw-createaccount-cta h3 {
+ padding-top: 4em;
+}
+
+#mw-createaccount-join {
+ margin-left: 0.75em;
+ /* Separate from background image */
+ box-shadow: 4px 4px 4px 4px rgba(255, 255, 255, 1);
+ width: auto;
+ display: inline-block;
+}
diff --git a/resources/mediawiki.special/mediawiki.special.userLogin.signup.js b/resources/mediawiki.special/mediawiki.special.userLogin.signup.js
deleted file mode 100644
index bba42605..00000000
--- a/resources/mediawiki.special/mediawiki.special.userLogin.signup.js
+++ /dev/null
@@ -1,10 +0,0 @@
-/**
- * JavaScript for Special:UserLogin/signup
- */
-jQuery( document ).ready( function ( $ ) {
- $( '#wpCreateaccountMail' )
- .on( 'change', function() {
- $( '.mw-row-password' ).toggle( !$( this ).attr( 'checked' ) );
- } )
- .trigger( 'change' );
-} );
diff --git a/resources/mediawiki.special/mediawiki.special.vforms.css b/resources/mediawiki.special/mediawiki.special.vforms.css
new file mode 100644
index 00000000..768a9c6e
--- /dev/null
+++ b/resources/mediawiki.special/mediawiki.special.vforms.css
@@ -0,0 +1,46 @@
+/*
+ * When inside the VForm style, disable the border that Vector and other skins
+ * put on the div surrounding the login/create account form.
+ * Also disable the margin and padding that Vector puts around the form.
+ */
+.mw-ui-container #userloginForm,
+.mw-ui-container #userlogin {
+ border: 0;
+ margin: 0;
+ padding: 0;
+}
+
+/* Reposition and resize language links, which appear on a per-wiki basis */
+.mw-ui-container #languagelinks {
+ margin-bottom: 2em;
+ font-size: 0.8em;
+}
+
+/* Put some space under template's header, which may contain CAPTCHA HTML.*/
+section.mw-form-header {
+ margin-bottom: 10px;
+}
+
+/*
+ * Styles for information boxes.
+ */
+.mw-ui-vform .errorbox,
+.mw-ui-vform .warningbox,
+.mw-ui-vform .successbox {
+ -webkit-box-sizing: border-box;
+ -moz-box-sizing: border-box;
+ box-sizing: border-box;
+ font-size: 0.9em;
+ margin: 0 0 1em 0;
+ padding: 0.5em;
+ word-wrap: break-word;
+}
+
+/*
+ * Override the right margin of the form to give space in case a benefits
+ * column appears to the side.
+ *
+ */
+.mw-ui-container #userloginForm {
+ margin-right: 100px;
+}
diff --git a/resources/mediawiki.ui/mediawiki.ui.default.css b/resources/mediawiki.ui/mediawiki.ui.default.css
new file mode 100644
index 00000000..b0726165
--- /dev/null
+++ b/resources/mediawiki.ui/mediawiki.ui.default.css
@@ -0,0 +1,272 @@
+@charset "UTF-8";
+/**
+ * Provide Agora appearance for mw-ui-* classes when using a skin other than
+ * Vector.
+ * Compass builds these Agora styles from source Sass files in
+ * extensions/Agora/modules/scss
+ */
+/* _effects.scss */
+/* Mixins for visual effects in CSS3 */
+/* line 7, sourcefiles/scss/components/_utilities.scss */
+.mw-ui-flush-left {
+ float: left;
+ margin-left: 0;
+ padding-left: 0;
+}
+
+/* line 11, sourcefiles/scss/components/_utilities.scss */
+.mw-ui-flush-right {
+ float: right;
+ margin-right: 0;
+ padding-right: 0;
+}
+
+/* line 15, sourcefiles/scss/components/_utilities.scss */
+.mw-ui-center-block {
+ display: block;
+ margin-left: auto;
+ margin-right: auto;
+}
+
+/* line 4, sourcefiles/scss/components/default/_buttons.scss */
+.mw-ui-button {
+ display: -moz-inline-stack;
+ display: inline-block;
+ vertical-align: middle;
+ *vertical-align: auto;
+ zoom: 1;
+ *display: inline;
+ padding: 0.4em 1em 0.4em 1em;
+ margin: 0;
+ background-color: #c9c9c9;
+ *background-color: #c9c9c9;
+ *zoom: 1;
+ filter: progid:DXImageTransform.Microsoft.gradient(gradientType=0, startColorstr='#FFDCDCDC', endColorstr='#FFC9C9C9');
+ background-image: -webkit-gradient(linear, 50% 0%, 50% 100%, color-stop(0%, #dcdcdc), color-stop(100%, #c9c9c9));
+ background-image: -webkit-linear-gradient(top, #dcdcdc, #c9c9c9);
+ background-image: -moz-linear-gradient(top, #dcdcdc, #c9c9c9);
+ background-image: -o-linear-gradient(top, #dcdcdc, #c9c9c9);
+ background-image: linear-gradient(top, #dcdcdc, #c9c9c9);
+ color: black;
+ text-shadow: 0 1px 1px rgba(201, 201, 201, 0.3);
+ border: 1px solid #c4c4c4;
+ -webkit-border-radius: 3px;
+ -moz-border-radius: 3px;
+ -ms-border-radius: 3px;
+ -o-border-radius: 3px;
+ border-radius: 3px;
+ vertical-align: middle;
+ text-align: center;
+ text-decoration: none;
+ font-weight: bold;
+ cursor: pointer;
+}
+/* line 38, sourcefiles/scss/mixins/_effects.scss */
+.mw-ui-button:hover, .mw-ui-button.mw-ui-hover {
+ background-color: gainsboro;
+ *background-color: gainsboro;
+ *zoom: 1;
+ filter: progid:DXImageTransform.Microsoft.gradient(gradientType=0, startColorstr='#FFE9E9E9', endColorstr='#FFDCDCDC');
+ background-image: -webkit-gradient(linear, 50% 0%, 50% 100%, color-stop(0%, #e9e9e9), color-stop(100%, #dcdcdc));
+ background-image: -webkit-linear-gradient(top, #e9e9e9, #dcdcdc);
+ background-image: -moz-linear-gradient(top, #e9e9e9, #dcdcdc);
+ background-image: -o-linear-gradient(top, #e9e9e9, #dcdcdc);
+ background-image: linear-gradient(top, #e9e9e9, #dcdcdc);
+ text-decoration: none;
+}
+/* line 44, sourcefiles/scss/mixins/_effects.scss */
+.mw-ui-button:active, .mw-ui-button.mw-ui-active {
+ background-image: none;
+ background-color: #c1c1c1;
+ text-shadow: none;
+}
+/* line 54, sourcefiles/scss/mixins/_effects.scss */
+.mw-ui-button:disabled, .mw-ui-button.mw-ui-disabled {
+ background-image: none;
+ background-color: #c9c9c9;
+ opacity: 0.5;
+ text-shadow: none;
+}
+/* line 30, sourcefiles/scss/components/default/_buttons.scss */
+.mw-ui-button:disabled, .mw-ui-button.mw-ui-disabled {
+ cursor: default;
+}
+/* line 36, sourcefiles/scss/components/default/_buttons.scss */
+.mw-ui-button.mw-ui-big {
+ font-size: 1.3em;
+}
+/* line 41, sourcefiles/scss/components/default/_buttons.scss */
+.mw-ui-button.mw-ui-block {
+ display: block;
+ width: 100%;
+}
+
+/* line 49, sourcefiles/scss/components/default/_buttons.scss */
+a.mw-ui-button {
+ text-decoration: none;
+}
+
+/* line 56, sourcefiles/scss/components/default/_buttons.scss */
+.mw-ui-button-group > * {
+ -webkit-border-radius: 0;
+ -moz-border-radius: 0;
+ -ms-border-radius: 0;
+ -o-border-radius: 0;
+ border-radius: 0;
+ float: left;
+}
+/* line 60, sourcefiles/scss/components/default/_buttons.scss */
+.mw-ui-button-group > *:first-child {
+ -moz-border-radius-topleft: 3px;
+ -webkit-border-top-left-radius: 3px;
+ border-top-left-radius: 3px;
+ -moz-border-radius-bottomleft: 3px;
+ -webkit-border-bottom-left-radius: 3px;
+ border-bottom-left-radius: 3px;
+}
+/* line 65, sourcefiles/scss/components/default/_buttons.scss */
+.mw-ui-button-group > *:last-child {
+ -moz-border-radius-topright: 3px;
+ -webkit-border-top-right-radius: 3px;
+ border-top-right-radius: 3px;
+ -moz-border-radius-bottomright: 3px;
+ -webkit-border-bottom-right-radius: 3px;
+ border-bottom-right-radius: 3px;
+}
+
+/* line 14, sourcefiles/scss/components/default/_forms.scss */
+.mw-ui-vform {
+ -webkit-box-sizing: border-box;
+ -moz-box-sizing: border-box;
+ box-sizing: border-box;
+ width: 290px;
+}
+/* line 20, sourcefiles/scss/components/default/_forms.scss */
+.mw-ui-vform > div {
+ display: block;
+ margin: 0 0 15px 0;
+ padding: 0;
+ width: 100%;
+}
+/* line 28, sourcefiles/scss/components/default/_forms.scss */
+.mw-ui-vform > div input,
+.mw-ui-vform > div .mw-ui-button {
+ display: block;
+ -webkit-box-sizing: border-box;
+ -moz-box-sizing: border-box;
+ box-sizing: border-box;
+ margin: 0;
+ width: 100%;
+}
+/* line 37, sourcefiles/scss/components/default/_forms.scss */
+.mw-ui-vform > div input:not([type=button]):not([type=submit]):not([type=file]) {
+ border-style: solid;
+ border-width: 1px;
+ border-color: #c9c9c9;
+ color: #252525;
+ padding: 0.35em 0 0.35em 0.5em;
+}
+/* line 11, sourcefiles/scss/mixins/_forms.scss */
+.mw-ui-vform > div input:not([type=button]):not([type=submit]):not([type=file]):focus {
+ box-shadow: #4091ed 0px 0px 5px;
+ border-color: #4091ed;
+}
+/* line 13, sourcefiles/scss/mixins/_forms.scss */
+.mw-ui-vform > div input:not([type=button]):not([type=submit]):not([type=file]):focus:not([type=checkbox]):not([type=radio]) {
+ outline: 0;
+}
+/* line 41, sourcefiles/scss/components/default/_forms.scss */
+.mw-ui-vform > div label {
+ display: block;
+ -webkit-box-sizing: border-box;
+ -moz-box-sizing: border-box;
+ box-sizing: border-box;
+ font-size: 0.9em;
+ color: #4a4a4a;
+ width: auto;
+ margin: 0 0 0.2em 0;
+ padding: 0;
+}
+/* line 38, sourcefiles/scss/mixins/_forms.scss */
+.mw-ui-vform > div label * {
+ font-weight: normal;
+}
+/* line 52, sourcefiles/scss/components/default/_forms.scss */
+.mw-ui-vform > div input[type="checkbox"],
+.mw-ui-vform > div input[type="radio"] {
+ display: inline;
+ -webkit-box-sizing: content-box;
+ -moz-box-sizing: content-box;
+ box-sizing: content-box;
+ width: auto;
+}
+/* line 63, sourcefiles/scss/components/default/_forms.scss */
+.mw-ui-vform .error {
+ -webkit-box-sizing: border-box;
+ -moz-box-sizing: border-box;
+ box-sizing: border-box;
+ font-size: 0.9em;
+ margin: 0 0 1em 0;
+ padding: 0.5em;
+ color: #cc0000;
+ border: 1px solid #fac5c5;
+ background-color: #fae3e3;
+ text-shadow: 0 1px #fae3e3;
+ word-wrap: break-word;
+}
+
+/* line 86, sourcefiles/scss/components/default/_forms.scss */
+.mw-ui-vform-div {
+ display: block;
+ margin: 0 0 15px 0;
+ padding: 0;
+ width: 100%;
+}
+
+/* line 96, sourcefiles/scss/components/default/_forms.scss */
+.mw-ui-input {
+ border-style: solid;
+ border-width: 1px;
+ border-color: #c9c9c9;
+ color: #252525;
+ padding: 0.35em 0 0.35em 0.5em;
+}
+/* line 11, sourcefiles/scss/mixins/_forms.scss */
+.mw-ui-input:focus {
+ box-shadow: #4091ed 0px 0px 5px;
+ border-color: #4091ed;
+}
+/* line 13, sourcefiles/scss/mixins/_forms.scss */
+.mw-ui-input:focus:not([type=checkbox]):not([type=radio]) {
+ outline: 0;
+}
+
+/* line 103, sourcefiles/scss/components/default/_forms.scss */
+.mw-ui-label {
+ font-size: 0.9em;
+ color: #4a4a4a;
+}
+/* line 38, sourcefiles/scss/mixins/_forms.scss */
+.mw-ui-label * {
+ font-weight: normal;
+}
+
+/* line 112, sourcefiles/scss/components/default/_forms.scss */
+.mw-ui-checkbox-label, .mw-ui-radio-label {
+ margin-bottom: 0.5em;
+ cursor: pointer;
+ vertical-align: bottom;
+ line-height: normal;
+ font-weight: normal;
+}
+/* line 54, sourcefiles/scss/mixins/_forms.scss */
+.mw-ui-checkbox-label > input[type="checkbox"], .mw-ui-checkbox-label > input[type="radio"], .mw-ui-radio-label > input[type="checkbox"], .mw-ui-radio-label > input[type="radio"] {
+ width: auto;
+ height: auto;
+ margin: 0 0.1em 0em 0;
+ padding: 0;
+ border-style: solid;
+ border-width: 1px;
+ border-color: #c9c9c9;
+ cursor: pointer;
+}
diff --git a/resources/mediawiki.ui/mediawiki.ui.vector.css b/resources/mediawiki.ui/mediawiki.ui.vector.css
new file mode 100644
index 00000000..fd9e0915
--- /dev/null
+++ b/resources/mediawiki.ui/mediawiki.ui.vector.css
@@ -0,0 +1,414 @@
+@charset "UTF-8";
+/**
+ * Provide Agora appearance for mw-ui-* classes when using the Vector skin.
+ * Compass builds these Agora styles from source Sass files in
+ * extensions/Agora/modules/scss
+ */
+/* _effects.scss */
+/* Mixins for visual effects in CSS3 */
+/* line 7, sourcefiles/scss/components/_utilities.scss */
+.mw-ui-flush-left {
+ float: left;
+ margin-left: 0;
+ padding-left: 0;
+}
+
+/* line 11, sourcefiles/scss/components/_utilities.scss */
+.mw-ui-flush-right {
+ float: right;
+ margin-right: 0;
+ padding-right: 0;
+}
+
+/* line 15, sourcefiles/scss/components/_utilities.scss */
+.mw-ui-center-block {
+ display: block;
+ margin-left: auto;
+ margin-right: auto;
+}
+
+/* line 4, sourcefiles/scss/components/default/_buttons.scss */
+.mw-ui-button {
+ display: -moz-inline-stack;
+ display: inline-block;
+ vertical-align: middle;
+ *vertical-align: auto;
+ zoom: 1;
+ *display: inline;
+ padding: 0.4em 1em 0.4em 1em;
+ margin: 0;
+ background-color: #c9c9c9;
+ *background-color: #c9c9c9;
+ *zoom: 1;
+ filter: progid:DXImageTransform.Microsoft.gradient(gradientType=0, startColorstr='#FFDCDCDC', endColorstr='#FFC9C9C9');
+ background-image: -webkit-gradient(linear, 50% 0%, 50% 100%, color-stop(0%, #dcdcdc), color-stop(100%, #c9c9c9));
+ background-image: -webkit-linear-gradient(top, #dcdcdc, #c9c9c9);
+ background-image: -moz-linear-gradient(top, #dcdcdc, #c9c9c9);
+ background-image: -o-linear-gradient(top, #dcdcdc, #c9c9c9);
+ background-image: linear-gradient(top, #dcdcdc, #c9c9c9);
+ color: black;
+ text-shadow: 0 1px 1px rgba(201, 201, 201, 0.3);
+ border: 1px solid #c4c4c4;
+ -webkit-border-radius: 3px;
+ -moz-border-radius: 3px;
+ -ms-border-radius: 3px;
+ -o-border-radius: 3px;
+ border-radius: 3px;
+ vertical-align: middle;
+ text-align: center;
+ text-decoration: none;
+ font-weight: bold;
+ cursor: pointer;
+}
+/* line 38, sourcefiles/scss/mixins/_effects.scss */
+.mw-ui-button:hover, .mw-ui-button.mw-ui-hover {
+ background-color: gainsboro;
+ *background-color: gainsboro;
+ *zoom: 1;
+ filter: progid:DXImageTransform.Microsoft.gradient(gradientType=0, startColorstr='#FFE9E9E9', endColorstr='#FFDCDCDC');
+ background-image: -webkit-gradient(linear, 50% 0%, 50% 100%, color-stop(0%, #e9e9e9), color-stop(100%, #dcdcdc));
+ background-image: -webkit-linear-gradient(top, #e9e9e9, #dcdcdc);
+ background-image: -moz-linear-gradient(top, #e9e9e9, #dcdcdc);
+ background-image: -o-linear-gradient(top, #e9e9e9, #dcdcdc);
+ background-image: linear-gradient(top, #e9e9e9, #dcdcdc);
+ text-decoration: none;
+}
+/* line 44, sourcefiles/scss/mixins/_effects.scss */
+.mw-ui-button:active, .mw-ui-button.mw-ui-active {
+ background-image: none;
+ background-color: #c1c1c1;
+ text-shadow: none;
+}
+/* line 54, sourcefiles/scss/mixins/_effects.scss */
+.mw-ui-button:disabled, .mw-ui-button.mw-ui-disabled {
+ background-image: none;
+ background-color: #c9c9c9;
+ opacity: 0.5;
+ text-shadow: none;
+}
+/* line 30, sourcefiles/scss/components/default/_buttons.scss */
+.mw-ui-button:disabled, .mw-ui-button.mw-ui-disabled {
+ cursor: default;
+}
+/* line 36, sourcefiles/scss/components/default/_buttons.scss */
+.mw-ui-button.mw-ui-big {
+ font-size: 1.3em;
+}
+/* line 41, sourcefiles/scss/components/default/_buttons.scss */
+.mw-ui-button.mw-ui-block {
+ display: block;
+ width: 100%;
+}
+
+/* line 49, sourcefiles/scss/components/default/_buttons.scss */
+a.mw-ui-button {
+ text-decoration: none;
+}
+
+/* line 56, sourcefiles/scss/components/default/_buttons.scss */
+.mw-ui-button-group > * {
+ -webkit-border-radius: 0;
+ -moz-border-radius: 0;
+ -ms-border-radius: 0;
+ -o-border-radius: 0;
+ border-radius: 0;
+ float: left;
+}
+/* line 60, sourcefiles/scss/components/default/_buttons.scss */
+.mw-ui-button-group > *:first-child {
+ -moz-border-radius-topleft: 3px;
+ -webkit-border-top-left-radius: 3px;
+ border-top-left-radius: 3px;
+ -moz-border-radius-bottomleft: 3px;
+ -webkit-border-bottom-left-radius: 3px;
+ border-bottom-left-radius: 3px;
+}
+/* line 65, sourcefiles/scss/components/default/_buttons.scss */
+.mw-ui-button-group > *:last-child {
+ -moz-border-radius-topright: 3px;
+ -webkit-border-top-right-radius: 3px;
+ border-top-right-radius: 3px;
+ -moz-border-radius-bottomright: 3px;
+ -webkit-border-bottom-right-radius: 3px;
+ border-bottom-right-radius: 3px;
+}
+
+/* line 3, sourcefiles/scss/components/vector/_buttons.scss */
+.mw-ui-button {
+ font-size: 1em;
+ line-height: 1.4em;
+}
+/* line 6, sourcefiles/scss/components/vector/_buttons.scss */
+.mw-ui-button.mw-ui-primary {
+ background-color: #3366bb;
+ *background-color: #3366bb;
+ *zoom: 1;
+ filter: progid:DXImageTransform.Microsoft.gradient(gradientType=0, startColorstr='#FF4779CD', endColorstr='#FF3366BB');
+ background-image: -webkit-gradient(linear, 50% 0%, 50% 100%, color-stop(0%, #4779cd), color-stop(100%, #3366bb));
+ background-image: -webkit-linear-gradient(top, #4779cd, #3366bb);
+ background-image: -moz-linear-gradient(top, #4779cd, #3366bb);
+ background-image: -o-linear-gradient(top, #4779cd, #3366bb);
+ background-image: linear-gradient(top, #4779cd, #3366bb);
+ color: white;
+ text-shadow: 0 1px 1px rgba(51, 102, 187, 0.75);
+ border: 1px solid #3162b3;
+}
+/* line 38, sourcefiles/scss/mixins/_effects.scss */
+.mw-ui-button.mw-ui-primary:hover, .mw-ui-button.mw-ui-primary.mw-ui-hover {
+ background-color: #4779cd;
+ *background-color: #4779cd;
+ *zoom: 1;
+ filter: progid:DXImageTransform.Microsoft.gradient(gradientType=0, startColorstr='#FF5B88D2', endColorstr='#FF4779CD');
+ background-image: -webkit-gradient(linear, 50% 0%, 50% 100%, color-stop(0%, #5b88d2), color-stop(100%, #4779cd));
+ background-image: -webkit-linear-gradient(top, #5b88d2, #4779cd);
+ background-image: -moz-linear-gradient(top, #5b88d2, #4779cd);
+ background-image: -o-linear-gradient(top, #5b88d2, #4779cd);
+ background-image: linear-gradient(top, #5b88d2, #4779cd);
+ text-decoration: none;
+}
+/* line 44, sourcefiles/scss/mixins/_effects.scss */
+.mw-ui-button.mw-ui-primary:active, .mw-ui-button.mw-ui-primary.mw-ui-active {
+ background-image: none;
+ background-color: #305faf;
+ text-shadow: none;
+}
+/* line 54, sourcefiles/scss/mixins/_effects.scss */
+.mw-ui-button.mw-ui-primary:disabled, .mw-ui-button.mw-ui-primary.mw-ui-disabled {
+ background-image: none;
+ background-color: #3366bb;
+ opacity: 0.5;
+ text-shadow: none;
+}
+/* line 10, sourcefiles/scss/components/vector/_buttons.scss */
+.mw-ui-button.mw-ui-constructive {
+ background-color: #27aa65;
+ *background-color: #27aa65;
+ *zoom: 1;
+ filter: progid:DXImageTransform.Microsoft.gradient(gradientType=0, startColorstr='#FF2EC977', endColorstr='#FF27AA65');
+ background-image: -webkit-gradient(linear, 50% 0%, 50% 100%, color-stop(0%, #2ec977), color-stop(100%, #27aa65));
+ background-image: -webkit-linear-gradient(top, #2ec977, #27aa65);
+ background-image: -moz-linear-gradient(top, #2ec977, #27aa65);
+ background-image: -o-linear-gradient(top, #2ec977, #27aa65);
+ background-image: linear-gradient(top, #2ec977, #27aa65);
+ color: white;
+ text-shadow: 0 1px 1px rgba(39, 170, 101, 0.75);
+ border: 1px solid #25a260;
+}
+/* line 38, sourcefiles/scss/mixins/_effects.scss */
+.mw-ui-button.mw-ui-constructive:hover, .mw-ui-button.mw-ui-constructive.mw-ui-hover {
+ background-color: #2ec977;
+ *background-color: #2ec977;
+ *zoom: 1;
+ filter: progid:DXImageTransform.Microsoft.gradient(gradientType=0, startColorstr='#FF3ED384', endColorstr='#FF2EC977');
+ background-image: -webkit-gradient(linear, 50% 0%, 50% 100%, color-stop(0%, #3ed384), color-stop(100%, #2ec977));
+ background-image: -webkit-linear-gradient(top, #3ed384, #2ec977);
+ background-image: -moz-linear-gradient(top, #3ed384, #2ec977);
+ background-image: -o-linear-gradient(top, #3ed384, #2ec977);
+ background-image: linear-gradient(top, #3ed384, #2ec977);
+ text-decoration: none;
+}
+/* line 44, sourcefiles/scss/mixins/_effects.scss */
+.mw-ui-button.mw-ui-constructive:active, .mw-ui-button.mw-ui-constructive.mw-ui-active {
+ background-image: none;
+ background-color: #249e5e;
+ text-shadow: none;
+}
+/* line 54, sourcefiles/scss/mixins/_effects.scss */
+.mw-ui-button.mw-ui-constructive:disabled, .mw-ui-button.mw-ui-constructive.mw-ui-disabled {
+ background-image: none;
+ background-color: #27aa65;
+ opacity: 0.5;
+ text-shadow: none;
+}
+/* line 14, sourcefiles/scss/components/vector/_buttons.scss */
+.mw-ui-button.mw-ui-destructive {
+ background-color: #cc0000;
+ *background-color: #cc0000;
+ *zoom: 1;
+ filter: progid:DXImageTransform.Microsoft.gradient(gradientType=0, startColorstr='#FFF20000', endColorstr='#FFCC0000');
+ background-image: -webkit-gradient(linear, 50% 0%, 50% 100%, color-stop(0%, #f20000), color-stop(100%, #cc0000));
+ background-image: -webkit-linear-gradient(top, #f20000, #cc0000);
+ background-image: -moz-linear-gradient(top, #f20000, #cc0000);
+ background-image: -o-linear-gradient(top, #f20000, #cc0000);
+ background-image: linear-gradient(top, #f20000, #cc0000);
+ color: white;
+ text-shadow: 0 1px 1px rgba(204, 0, 0, 0.75);
+ border: 1px solid #c20000;
+}
+/* line 38, sourcefiles/scss/mixins/_effects.scss */
+.mw-ui-button.mw-ui-destructive:hover, .mw-ui-button.mw-ui-destructive.mw-ui-hover {
+ background-color: #f20000;
+ *background-color: #f20000;
+ *zoom: 1;
+ filter: progid:DXImageTransform.Microsoft.gradient(gradientType=0, startColorstr='#FFFF0D0D', endColorstr='#FFF20000');
+ background-image: -webkit-gradient(linear, 50% 0%, 50% 100%, color-stop(0%, #ff0d0d), color-stop(100%, #f20000));
+ background-image: -webkit-linear-gradient(top, #ff0d0d, #f20000);
+ background-image: -moz-linear-gradient(top, #ff0d0d, #f20000);
+ background-image: -o-linear-gradient(top, #ff0d0d, #f20000);
+ background-image: linear-gradient(top, #ff0d0d, #f20000);
+ text-decoration: none;
+}
+/* line 44, sourcefiles/scss/mixins/_effects.scss */
+.mw-ui-button.mw-ui-destructive:active, .mw-ui-button.mw-ui-destructive.mw-ui-active {
+ background-image: none;
+ background-color: #bd0000;
+ text-shadow: none;
+}
+/* line 54, sourcefiles/scss/mixins/_effects.scss */
+.mw-ui-button.mw-ui-destructive:disabled, .mw-ui-button.mw-ui-destructive.mw-ui-disabled {
+ background-image: none;
+ background-color: #cc0000;
+ opacity: 0.5;
+ text-shadow: none;
+}
+
+/* line 14, sourcefiles/scss/components/default/_forms.scss */
+.mw-ui-vform {
+ -webkit-box-sizing: border-box;
+ -moz-box-sizing: border-box;
+ box-sizing: border-box;
+ width: 290px;
+}
+/* line 20, sourcefiles/scss/components/default/_forms.scss */
+.mw-ui-vform > div {
+ display: block;
+ margin: 0 0 15px 0;
+ padding: 0;
+ width: 100%;
+}
+/* line 28, sourcefiles/scss/components/default/_forms.scss */
+.mw-ui-vform > div input,
+.mw-ui-vform > div .mw-ui-button {
+ display: block;
+ -webkit-box-sizing: border-box;
+ -moz-box-sizing: border-box;
+ box-sizing: border-box;
+ margin: 0;
+ width: 100%;
+}
+/* line 37, sourcefiles/scss/components/default/_forms.scss */
+.mw-ui-vform > div input:not([type=button]):not([type=submit]):not([type=file]) {
+ border-style: solid;
+ border-width: 1px;
+ border-color: #c9c9c9;
+ color: #252525;
+ padding: 0.35em 0 0.35em 0.5em;
+}
+/* line 11, sourcefiles/scss/mixins/_forms.scss */
+.mw-ui-vform > div input:not([type=button]):not([type=submit]):not([type=file]):focus {
+ box-shadow: #4091ed 0px 0px 5px;
+ border-color: #4091ed;
+}
+/* line 13, sourcefiles/scss/mixins/_forms.scss */
+.mw-ui-vform > div input:not([type=button]):not([type=submit]):not([type=file]):focus:not([type=checkbox]):not([type=radio]) {
+ outline: 0;
+}
+/* line 41, sourcefiles/scss/components/default/_forms.scss */
+.mw-ui-vform > div label {
+ display: block;
+ -webkit-box-sizing: border-box;
+ -moz-box-sizing: border-box;
+ box-sizing: border-box;
+ font-size: 0.9em;
+ color: #4a4a4a;
+ width: auto;
+ margin: 0 0 0.2em 0;
+ padding: 0;
+}
+/* line 38, sourcefiles/scss/mixins/_forms.scss */
+.mw-ui-vform > div label * {
+ font-weight: normal;
+}
+/* line 52, sourcefiles/scss/components/default/_forms.scss */
+.mw-ui-vform > div input[type="checkbox"],
+.mw-ui-vform > div input[type="radio"] {
+ display: inline;
+ -webkit-box-sizing: content-box;
+ -moz-box-sizing: content-box;
+ box-sizing: content-box;
+ width: auto;
+}
+/* line 63, sourcefiles/scss/components/default/_forms.scss */
+.mw-ui-vform .error {
+ -webkit-box-sizing: border-box;
+ -moz-box-sizing: border-box;
+ box-sizing: border-box;
+ font-size: 0.9em;
+ margin: 0 0 1em 0;
+ padding: 0.5em;
+ color: #cc0000;
+ border: 1px solid #fac5c5;
+ background-color: #fae3e3;
+ text-shadow: 0 1px #fae3e3;
+ word-wrap: break-word;
+}
+
+/* line 86, sourcefiles/scss/components/default/_forms.scss */
+.mw-ui-vform-div {
+ display: block;
+ margin: 0 0 15px 0;
+ padding: 0;
+ width: 100%;
+}
+
+/* line 96, sourcefiles/scss/components/default/_forms.scss */
+.mw-ui-input {
+ border-style: solid;
+ border-width: 1px;
+ border-color: #c9c9c9;
+ color: #252525;
+ padding: 0.35em 0 0.35em 0.5em;
+}
+/* line 11, sourcefiles/scss/mixins/_forms.scss */
+.mw-ui-input:focus {
+ box-shadow: #4091ed 0px 0px 5px;
+ border-color: #4091ed;
+}
+/* line 13, sourcefiles/scss/mixins/_forms.scss */
+.mw-ui-input:focus:not([type=checkbox]):not([type=radio]) {
+ outline: 0;
+}
+
+/* line 103, sourcefiles/scss/components/default/_forms.scss */
+.mw-ui-label {
+ font-size: 0.9em;
+ color: #4a4a4a;
+}
+/* line 38, sourcefiles/scss/mixins/_forms.scss */
+.mw-ui-label * {
+ font-weight: normal;
+}
+
+/* line 112, sourcefiles/scss/components/default/_forms.scss */
+.mw-ui-checkbox-label, .mw-ui-radio-label {
+ margin-bottom: 0.5em;
+ cursor: pointer;
+ vertical-align: bottom;
+ line-height: normal;
+ font-weight: normal;
+}
+/* line 54, sourcefiles/scss/mixins/_forms.scss */
+.mw-ui-checkbox-label > input[type="checkbox"], .mw-ui-checkbox-label > input[type="radio"], .mw-ui-radio-label > input[type="checkbox"], .mw-ui-radio-label > input[type="radio"] {
+ width: auto;
+ height: auto;
+ margin: 0 0.1em 0em 0;
+ padding: 0;
+ border-style: solid;
+ border-width: 1px;
+ border-color: #c9c9c9;
+ cursor: pointer;
+}
+
+/* line 5, sourcefiles/scss/components/vector/_forms.scss */
+.mw-ui-vform,
+.mw-ui-vform > div input,
+.mw-ui-input {
+ font-size: 1em;
+ line-height: 1.4em;
+}
+
+/* line 3, sourcefiles/scss/components/vector/_containers.scss */
+.mw-ui-container {
+ font-size: 1em;
+ line-height: 1.4em;
+}
diff --git a/resources/mediawiki.ui/sourcefiles/Makefile b/resources/mediawiki.ui/sourcefiles/Makefile
new file mode 100644
index 00000000..dea90139
--- /dev/null
+++ b/resources/mediawiki.ui/sourcefiles/Makefile
@@ -0,0 +1,24 @@
+DATE=$(shell date +%I:%M%p)
+CHECK=\033[32m✔\033[39m
+HR=\#\#\#\#\#\#\#\#\#\#\#\#\#\#\#\#\#\#\#\#\#\#\#\#\#\#\#\#\#\#\#\#\#\#\#\#\#\#\#\#\#\#\#\#\#\#\#\#\#\#
+
+build:
+ @echo "\n${HR}"
+ @echo "Building Agora..."
+ @echo "${HR}\n"
+ @compass compile
+ @echo "Compiling Compass project... ${CHECK} Done"
+ @rm -rf .sass-cache
+ @echo "Removing .sass-cache... ${CHECK} Done"
+ @echo "\n${HR}"
+ @echo "Agora successfully built at ${DATE}."
+ @echo "${HR}\n"
+
+all: build
+
+watch:
+ @echo "\n${HR}"
+ @echo "Watching SCSS files for Agora..."
+ @echo "${HR}\n"
+ @compass watch
+ @echo "Started watching modules/scss at ${DATE}..."
diff --git a/resources/mediawiki.ui/sourcefiles/config.rb b/resources/mediawiki.ui/sourcefiles/config.rb
new file mode 100644
index 00000000..28c65240
--- /dev/null
+++ b/resources/mediawiki.ui/sourcefiles/config.rb
@@ -0,0 +1,27 @@
+# Require any additional compass plugins here.
+
+# Set this to the root of your project when deployed:
+# (unused so far): http_path = "/"
+
+# Output to parent of build directory
+css_dir = ".."
+sass_dir = "scss"
+# (unused so far): images_dir = "modules/img"
+# (unused so far): javascripts_dir = "modules/js"
+
+# You can select your preferred output style here (can be overridden via the command line):
+# output_style = :expanded or :nested or :compact or :compressed
+output_style = :expanded
+
+# To enable relative paths to assets via compass helper functions. Uncomment:
+relative_assets = true
+
+# To disable debugging comments that display the original location of your selectors. Uncomment:
+line_comments = true
+
+
+# If you prefer the indented syntax, you might want to regenerate this
+# project again passing --syntax sass, or you can uncomment this:
+# preferred_syntax = :sass
+# and then run:
+# sass-convert -R --from scss --to sass sass scss && rm -rf sass && mv scss sass
diff --git a/resources/mediawiki.ui/sourcefiles/scss/components/_default.scss b/resources/mediawiki.ui/sourcefiles/scss/components/_default.scss
new file mode 100644
index 00000000..e7090ebc
--- /dev/null
+++ b/resources/mediawiki.ui/sourcefiles/scss/components/_default.scss
@@ -0,0 +1,3 @@
+@import "utilities";
+@import "default/buttons";
+@import "default/forms"; \ No newline at end of file
diff --git a/resources/mediawiki.ui/sourcefiles/scss/components/_utilities.scss b/resources/mediawiki.ui/sourcefiles/scss/components/_utilities.scss
new file mode 100644
index 00000000..4f1dba2f
--- /dev/null
+++ b/resources/mediawiki.ui/sourcefiles/scss/components/_utilities.scss
@@ -0,0 +1,17 @@
+// Generic helper classes that could be used in many elements/layouts
+
+// --------------------------------------------------------------------------
+// Positioning
+// --------------------------------------------------------------------------
+
+.mw-ui-flush-left {
+ @include agora-flush-left;
+}
+
+.mw-ui-flush-right {
+ @include agora-flush-right;
+}
+
+.mw-ui-center-block {
+ @include agora-center-block;
+} \ No newline at end of file
diff --git a/resources/mediawiki.ui/sourcefiles/scss/components/_vector.scss b/resources/mediawiki.ui/sourcefiles/scss/components/_vector.scss
new file mode 100644
index 00000000..d7cb34ae
--- /dev/null
+++ b/resources/mediawiki.ui/sourcefiles/scss/components/_vector.scss
@@ -0,0 +1,4 @@
+@import "utilities";
+@import "vector/buttons";
+@import "vector/forms";
+@import "vector/containers";
diff --git a/resources/mediawiki.ui/sourcefiles/scss/components/default/_buttons.scss b/resources/mediawiki.ui/sourcefiles/scss/components/default/_buttons.scss
new file mode 100644
index 00000000..d67810f7
--- /dev/null
+++ b/resources/mediawiki.ui/sourcefiles/scss/components/default/_buttons.scss
@@ -0,0 +1,69 @@
+$buttonBorderRadius: 3px;
+
+// Button styling
+.mw-ui-button {
+ // Container layout
+ @include inline-block;
+ padding: 0.4em 1em 0.4em 1em;
+ margin: 0;
+
+ // Container styling
+ @include buttonColors($agoraGray);
+ @include border-radius($buttonBorderRadius);
+
+ // Content styling
+ vertical-align: middle;
+
+ text: {
+ align: center;
+ decoration: none;
+ }
+
+ font: {
+ weight: bold;
+ }
+
+ // Interaction styling
+ cursor: pointer;
+
+ &:disabled,
+ &.mw-ui-disabled {
+ cursor: default;
+ }
+
+ // Button sizes and displays
+ // -----------------------------------------
+ &.mw-ui-big {
+ font: {
+ size: $baseFontSize * 1.3;
+ }
+ }
+ &.mw-ui-block {
+ display: block;
+ width: 100%;
+ }
+}
+
+// This overrides an underline declaration on a:hover and a:focus in commonElements.css, which the
+// class alone isn't specific enough to do
+a.mw-ui-button {
+ text: {
+ decoration: none;
+ }
+}
+
+// Button groups
+.mw-ui-button-group > * {
+ @include border-radius(0);
+ float: left;
+
+ &:first-child{
+ @include border-top-left-radius($buttonBorderRadius);
+ @include border-bottom-left-radius($buttonBorderRadius);
+ }
+
+ &:last-child{
+ @include border-top-right-radius($buttonBorderRadius);
+ @include border-bottom-right-radius($buttonBorderRadius);
+ }
+}
diff --git a/resources/mediawiki.ui/sourcefiles/scss/components/default/_forms.scss b/resources/mediawiki.ui/sourcefiles/scss/components/default/_forms.scss
new file mode 100644
index 00000000..a9cec39a
--- /dev/null
+++ b/resources/mediawiki.ui/sourcefiles/scss/components/default/_forms.scss
@@ -0,0 +1,114 @@
+// Form elements and layouts
+
+// --------------------------------------------------------------------------
+// Layouts
+// --------------------------------------------------------------------------
+
+// The FancyCaptcha image CAPTCHA used on WMF wikis drives the width of the
+// 'VForm' design, the form can't be narrower than this.
+$captchaContainerWidth: 290px;
+$defaultFormWidth: $captchaContainerWidth;
+
+// Style a compact vertical stacked form ("VForm") and the elements in divs
+// within it.
+.mw-ui-vform {
+ @include box-sizing(border-box);
+
+ width: $defaultFormWidth;
+
+ // Immediate divs in a vform are block and spaced-out.
+ & > div {
+ display: block;
+ margin: 0 0 15px 0;
+ padding: 0;
+ width: 100%;
+
+ // MW currently doesn't use the type attribute everywhere on inputs.
+ input,
+ .mw-ui-button {
+ display: block;
+ @include box-sizing(border-box);
+ margin: 0;
+ width: 100%;
+ }
+
+ // We exclude these because they'll generally use mw-ui-button.
+ // Otherwise, we'll unintentionally override that.
+ input:not([type=button]):not([type=submit]):not([type=file]), {
+ @include agora-field-styling; // mixins/_forms.scss
+ }
+
+ label {
+ display: block;
+ @include box-sizing(border-box);
+ @include agora-label-styling;
+ width: auto;
+ margin: 0 0 0.2em 0;
+ padding: 0;
+ }
+
+ // Override input styling just for checkboxes and radio inputs.
+ input[type="checkbox"],
+ input[type="radio"] {
+ display: inline;
+ @include box-sizing(content-box);
+ width: auto;
+ }
+
+ }
+
+ // HTMLForm uses error, SpecialUserlogin (login and create account) uses
+ // errorbox.
+ // TODO move errorbox from mediawiki.special.vforms.css into here.
+ .error {
+ -webkit-box-sizing: border-box;
+ -moz-box-sizing: border-box;
+ box-sizing: border-box;
+ font-size: 0.9em;
+ margin: 0 0 1em 0;
+ padding: 0.5em;
+ color: #cc0000;
+ border: 1px solid #fac5c5;
+ background-color: #fae3e3;
+ text-shadow: 0 1px #fae3e3;
+ word-wrap: break-word;
+ }
+}
+
+// --------------------------------------------------------------------------
+// Elements
+// --------------------------------------------------------------------------
+
+// Apply this to individual elements to style them.
+// You generally don't need to use this class on divs within an Agora
+// form container such as mw-ui-vform
+// XXX DRY: This repeats earlier styling, use an @include agora-div-styling ?
+.mw-ui-vform-div {
+ display: block;
+ margin: 0 0 15px 0;
+ padding: 0;
+ width: 100%;
+}
+
+// Apply mw-ui-input to individual input fields to style them.
+// You generally don't need to use this class if <input> is within an Agora
+// form container such as mw-ui-vform
+.mw-ui-input {
+ @include agora-field-styling; // mixins/_forms.scss
+}
+
+// Apply mw-ui-label to individual elements to style them.
+// You generally don't need to use this class if <label> is within an Agora
+// form container such as mw-ui-vform
+.mw-ui-label {
+ @include agora-label-styling; // mixins/_forms.scss
+}
+
+// Nesting an input checkbox or radio button inside a label with this class
+// improves alignment, e.g.
+// <label class="mw-ui-checkbox-label">
+// <input type="checkbox">The label text
+// </label>
+.mw-ui-checkbox-label, .mw-ui-radio-label {
+ @include agora-inline-label-styling;
+}
diff --git a/resources/mediawiki.ui/sourcefiles/scss/components/vector/_buttons.scss b/resources/mediawiki.ui/sourcefiles/scss/components/vector/_buttons.scss
new file mode 100644
index 00000000..8d5f0b6a
--- /dev/null
+++ b/resources/mediawiki.ui/sourcefiles/scss/components/vector/_buttons.scss
@@ -0,0 +1,19 @@
+@import "../default/buttons"; // Layer Vector on top of the default settings.
+
+.mw-ui-button {
+ // Button colors determined by function.
+ // -----------------------------------------
+ &.mw-ui-primary {
+ @include buttonColors($agoraBlue);
+ }
+
+ &.mw-ui-constructive {
+ @include buttonColors($agoraGreen);
+ }
+
+ &.mw-ui-destructive {
+ @include buttonColors($agoraRed);
+ }
+
+ @include vector-type;
+}
diff --git a/resources/mediawiki.ui/sourcefiles/scss/components/vector/_containers.scss b/resources/mediawiki.ui/sourcefiles/scss/components/vector/_containers.scss
new file mode 100644
index 00000000..ed01603d
--- /dev/null
+++ b/resources/mediawiki.ui/sourcefiles/scss/components/vector/_containers.scss
@@ -0,0 +1,5 @@
+// No default settings for containers yet.
+
+.mw-ui-container {
+ @include vector-type;
+}
diff --git a/resources/mediawiki.ui/sourcefiles/scss/components/vector/_forms.scss b/resources/mediawiki.ui/sourcefiles/scss/components/vector/_forms.scss
new file mode 100644
index 00000000..73ea24e2
--- /dev/null
+++ b/resources/mediawiki.ui/sourcefiles/scss/components/vector/_forms.scss
@@ -0,0 +1,7 @@
+@import "../default/forms"; // Layer Vector on top of the default settings.
+
+.mw-ui-vform,
+.mw-ui-vform > div input,
+.mw-ui-input {
+ @include vector-type;
+}
diff --git a/resources/mediawiki.ui/sourcefiles/scss/mediawiki.ui.default.scss b/resources/mediawiki.ui/sourcefiles/scss/mediawiki.ui.default.scss
new file mode 100644
index 00000000..e6db5237
--- /dev/null
+++ b/resources/mediawiki.ui/sourcefiles/scss/mediawiki.ui.default.scss
@@ -0,0 +1,16 @@
+/**
+ * Provide Agora appearance for mw-ui-* classes when using a skin other than
+ * Vector.
+ * Compass builds these Agora styles from source Sass files in
+ * extensions/Agora/modules/scss
+ */
+
+@charset "UTF-8";
+
+@import "compass";
+
+@import "settings/all";
+
+@import "mixins/all";
+
+@import "components/default";
diff --git a/resources/mediawiki.ui/sourcefiles/scss/mediawiki.ui.vector.scss b/resources/mediawiki.ui/sourcefiles/scss/mediawiki.ui.vector.scss
new file mode 100644
index 00000000..ac113eec
--- /dev/null
+++ b/resources/mediawiki.ui/sourcefiles/scss/mediawiki.ui.vector.scss
@@ -0,0 +1,15 @@
+/**
+ * Provide Agora appearance for mw-ui-* classes when using the Vector skin.
+ * Compass builds these Agora styles from source Sass files in
+ * extensions/Agora/modules/scss
+ */
+
+@charset "UTF-8";
+
+@import "compass";
+
+@import "settings/all";
+
+@import "mixins/all";
+
+@import "components/vector";
diff --git a/resources/mediawiki.ui/sourcefiles/scss/mixins/_all.scss b/resources/mediawiki.ui/sourcefiles/scss/mixins/_all.scss
new file mode 100644
index 00000000..adc48cd8
--- /dev/null
+++ b/resources/mediawiki.ui/sourcefiles/scss/mixins/_all.scss
@@ -0,0 +1,4 @@
+@import "utilities";
+@import "type";
+@import "effects";
+@import "forms"; \ No newline at end of file
diff --git a/resources/mediawiki.ui/sourcefiles/scss/mixins/_effects.scss b/resources/mediawiki.ui/sourcefiles/scss/mixins/_effects.scss
new file mode 100644
index 00000000..2efff820
--- /dev/null
+++ b/resources/mediawiki.ui/sourcefiles/scss/mixins/_effects.scss
@@ -0,0 +1,62 @@
+/* _effects.scss */
+
+/* Mixins for visual effects in CSS3 */
+
+// ----------------------------------------------------------------------------
+// Gradients
+// ----------------------------------------------------------------------------
+@mixin vertical-gradient ($startColor: lighten($agoraGray, 95%), $endColor: $agoraGray) {
+ // Fallback
+ background-color: $endColor;
+ *background-color: $endColor; // IE7
+
+ // IE6-8
+ @include filter-gradient($startColor, $endColor, vertical);
+
+ // IE9+, Opera, Gecko, WebKit
+ @include background-image(linear-gradient(top, $startColor, $endColor));
+}
+
+// ----------------------------------------------------------------------------
+// Button styling
+// ----------------------------------------------------------------------------
+@mixin buttonColors ($baseColor: $agoraGray) {
+ // Background color
+ @include vertical-gradient(lighten($baseColor, 7.5%), $baseColor);
+
+ @if $baseColor == $agoraGray {
+ color: black;
+ @include text-shadow(0 1px 1px rgba($baseColor, 0.3));
+ } @else {
+ color: white;
+ @include text-shadow(0 1px 1px rgba($baseColor, 0.75));
+ }
+
+ border: 1px solid darken($baseColor, 2%);
+
+ &:hover,
+ &.mw-ui-hover {
+ @include vertical-gradient(lighten($baseColor, 12.5%), lighten($baseColor, 7.5%));
+ text-decoration: none;
+ }
+
+ &:active,
+ &.mw-ui-active {
+ background: {
+ image: none;
+ color: darken($baseColor, 3%);
+ }
+
+ text-shadow: none;
+ }
+
+ &:disabled,
+ &.mw-ui-disabled {
+ background: {
+ image: none;
+ color: $baseColor;
+ }
+ opacity: 0.5;
+ text-shadow: none;
+ }
+}
diff --git a/resources/mediawiki.ui/sourcefiles/scss/mixins/_forms.scss b/resources/mediawiki.ui/sourcefiles/scss/mixins/_forms.scss
new file mode 100644
index 00000000..0f3f6ad3
--- /dev/null
+++ b/resources/mediawiki.ui/sourcefiles/scss/mixins/_forms.scss
@@ -0,0 +1,66 @@
+// Font is not included.
+// For Vector, that should be layered on top with vector-type
+@mixin agora-field-styling() {
+
+ border: {
+ style: solid;
+ width: 1px;
+ color: $agoraGray;
+ };
+
+ &:focus {
+ // Styling focus of native checkboxes etc on Mac is almost impossible.
+ &:not([type=checkbox]):not([type=radio]) {
+ @include reset-focus; // Removes OS field focus
+ };
+
+ // @include box-shadow generates unneeded prefixes
+ // https://github.com/chriseppstein/compass/issues/1054 , so specify
+ // directly.
+ box-shadow: $agoraBlueShadow 0px 0px 5px;
+
+ border: {
+ color: $agoraBlueShadow;
+ };
+ }
+
+ color: $agoraTextColor;
+ padding: 0.35em 0 0.35em 0.5em;
+}
+
+@mixin agora-label-styling() {
+ font: {
+ //weight: bold;
+ size: 0.9em;
+ };
+ color: darken($agoraGray, 50%);
+
+ & * {
+ font-weight: normal;
+ }
+}
+
+@mixin agora-inline-label-styling() {
+ margin-bottom: 0.5em;
+ cursor: pointer;
+ vertical-align: bottom;
+ line-height: normal;
+
+ font: {
+ weight: normal;
+ };
+
+ & > input[type="checkbox"],
+ & > input[type="radio"] {
+ width: auto;
+ height: auto;
+ margin: 0 0.1em 0em 0;
+ padding: 0;
+ border: {
+ style: solid;
+ width: 1px;
+ color: $agoraGray;
+ }
+ cursor: pointer;
+ }
+}
diff --git a/resources/mediawiki.ui/sourcefiles/scss/mixins/_type.scss b/resources/mediawiki.ui/sourcefiles/scss/mixins/_type.scss
new file mode 100644
index 00000000..8a93a08b
--- /dev/null
+++ b/resources/mediawiki.ui/sourcefiles/scss/mixins/_type.scss
@@ -0,0 +1,6 @@
+@mixin vector-type {
+ font: {
+ size: $baseFontSize;
+ }
+ line-height: $baseLineHeight;
+} \ No newline at end of file
diff --git a/resources/mediawiki.ui/sourcefiles/scss/mixins/_utilities.scss b/resources/mediawiki.ui/sourcefiles/scss/mixins/_utilities.scss
new file mode 100644
index 00000000..71a93b60
--- /dev/null
+++ b/resources/mediawiki.ui/sourcefiles/scss/mixins/_utilities.scss
@@ -0,0 +1,19 @@
+@mixin agora-flush-left() {
+ float: left;
+ margin-left: 0;
+ padding-left: 0;
+}
+
+@mixin agora-flush-right() {
+ float: right;
+ margin-right: 0;
+ padding-right: 0;
+}
+
+@mixin agora-center-block() {
+ display: block;
+ margin: {
+ left: auto;
+ right: auto;
+ };
+} \ No newline at end of file
diff --git a/resources/mediawiki.ui/sourcefiles/scss/settings/_all.scss b/resources/mediawiki.ui/sourcefiles/scss/settings/_all.scss
new file mode 100644
index 00000000..21ac292f
--- /dev/null
+++ b/resources/mediawiki.ui/sourcefiles/scss/settings/_all.scss
@@ -0,0 +1,2 @@
+@import "colors";
+@import "typography"; \ No newline at end of file
diff --git a/resources/mediawiki.ui/sourcefiles/scss/settings/_colors.scss b/resources/mediawiki.ui/sourcefiles/scss/settings/_colors.scss
new file mode 100644
index 00000000..0c18bdb4
--- /dev/null
+++ b/resources/mediawiki.ui/sourcefiles/scss/settings/_colors.scss
@@ -0,0 +1,17 @@
+// Grays
+// -----------------------------------------
+$agoraGray: #c9c9c9;
+$agoraTextColor: #252525;
+
+// Blues
+// -----------------------------------------
+$agoraBlue: #3366bb;
+$agoraBlueShadow: #4091ed;
+
+// Greens
+// -----------------------------------------
+$agoraGreen: #27aa65;
+
+// Reds
+// -----------------------------------------
+$agoraRed: #cc0000;
diff --git a/resources/mediawiki.ui/sourcefiles/scss/settings/_typography.scss b/resources/mediawiki.ui/sourcefiles/scss/settings/_typography.scss
new file mode 100644
index 00000000..013d12b3
--- /dev/null
+++ b/resources/mediawiki.ui/sourcefiles/scss/settings/_typography.scss
@@ -0,0 +1,5 @@
+$baseFontSize: 1em;
+$baseLineHeight: 1.4 * $baseFontSize;
+$baseFontColor: $agoraTextColor;
+
+$smallFontSize: 0.75em; \ No newline at end of file
diff --git a/resources/mediawiki/images/arrow-collapsed-ltr.png b/resources/mediawiki/images/arrow-collapsed-ltr.png
new file mode 100644
index 00000000..b17e578b
--- /dev/null
+++ b/resources/mediawiki/images/arrow-collapsed-ltr.png
Binary files differ
diff --git a/resources/mediawiki/images/arrow-collapsed-rtl.png b/resources/mediawiki/images/arrow-collapsed-rtl.png
new file mode 100644
index 00000000..a834548e
--- /dev/null
+++ b/resources/mediawiki/images/arrow-collapsed-rtl.png
Binary files differ
diff --git a/resources/mediawiki/images/arrow-expanded.png b/resources/mediawiki/images/arrow-expanded.png
new file mode 100644
index 00000000..2bec798e
--- /dev/null
+++ b/resources/mediawiki/images/arrow-expanded.png
Binary files differ
diff --git a/resources/mediawiki/mediawiki.Title.js b/resources/mediawiki/mediawiki.Title.js
index b86a14ba..5038c515 100644
--- a/resources/mediawiki/mediawiki.Title.js
+++ b/resources/mediawiki/mediawiki.Title.js
@@ -1,192 +1,368 @@
/*!
* @author Neil Kandalgaonkar, 2010
- * @author Timo Tijhof, 2011
+ * @author Timo Tijhof, 2011-2013
* @since 1.18
- *
- * Relies on: mw.config (wgFormattedNamespaces, wgNamespaceIds, wgCaseSensitiveNamespaces), mw.util.wikiGetlink
*/
( function ( mw, $ ) {
- /* Local space */
-
/**
* @class mw.Title
*
+ * Parse titles into an object struture. Note that when using the constructor
+ * directly, passing invalid titles will result in an exception. Use #newFromText to use the
+ * logic directly and get null for invalid titles which is easier to work with.
+ *
* @constructor
* @param {string} title Title of the page. If no second argument given,
- * this will be searched for a namespace.
- * @param {number} [namespace] Namespace id. If given, title will be taken as-is.
+ * this will be searched for a namespace
+ * @param {number} [namespace=NS_MAIN] If given, will used as default namespace for the given title
+ * @throws {Error} When the title is invalid
*/
function Title( title, namespace ) {
- this.ns = 0; // integer namespace id
- this.name = null; // name in canonical 'database' form
- this.ext = null; // extension
-
- if ( arguments.length === 2 ) {
- setNameAndExtension( this, title );
- this.ns = fixNsId( namespace );
- } else if ( arguments.length === 1 ) {
- setAll( this, title );
+ var parsed = parse( title, namespace );
+ if ( !parsed ) {
+ throw new Error( 'Unable to parse title' );
}
+
+ this.namespace = parsed.namespace;
+ this.title = parsed.title;
+ this.ext = parsed.ext;
+ this.fragment = parsed.fragment;
+
return this;
}
-var
- /* Public methods (defined later) */
- fn,
+ /* Private members */
+
+ var
/**
- * Strip some illegal chars: control chars, colon, less than, greater than,
- * brackets, braces, pipe, whitespace and normal spaces. This still leaves some insanity
- * intact, like unicode bidi chars, but it's a good start..
- * @ignore
- * @param {string} s
- * @return {string}
+ * @private
+ * @static
+ * @property NS_MAIN
*/
- clean = function ( s ) {
- if ( s !== undefined ) {
- return s.replace( /[\x00-\x1f\x23\x3c\x3e\x5b\x5d\x7b\x7c\x7d\x7f\s]+/g, '_' );
- }
- },
+ NS_MAIN = 0,
/**
- * Convert db-key to readable text.
- * @ignore
- * @param {string} s
- * @return {string}
+ * @private
+ * @static
+ * @property NS_TALK
*/
- text = function ( s ) {
- if ( s !== null && s !== undefined ) {
- return s.replace( /_/g, ' ' );
- } else {
- return '';
- }
- },
+ NS_TALK = 1,
/**
- * Sanitize name.
- * @ignore
+ * @private
+ * @static
+ * @property NS_SPECIAL
*/
- fixName = function ( s ) {
- return clean( $.trim( s ) );
- },
+ NS_SPECIAL = -1,
/**
- * Sanitize extension.
- * @ignore
+ * Get the namespace id from a namespace name (either from the localized, canonical or alias
+ * name).
+ *
+ * Example: On a German wiki this would return 6 for any of 'File', 'Datei', 'Image' or
+ * even 'Bild'.
+ *
+ * @private
+ * @static
+ * @method getNsIdByName
+ * @param {string} ns Namespace name (case insensitive, leading/trailing space ignored)
+ * @return {number|boolean} Namespace id or boolean false
*/
- fixExt = function ( s ) {
- return clean( s );
+ getNsIdByName = function ( ns ) {
+ var id;
+
+ // Don't cast non-strings to strings, because null or undefined should not result in
+ // returning the id of a potential namespace called "Null:" (e.g. on null.example.org/wiki)
+ // Also, toLowerCase throws exception on null/undefined, because it is a String method.
+ if ( typeof ns !== 'string' ) {
+ return false;
+ }
+ ns = ns.toLowerCase();
+ id = mw.config.get( 'wgNamespaceIds' )[ns];
+ if ( id === undefined ) {
+ return false;
+ }
+ return id;
},
+ rUnderscoreTrim = /^_+|_+$/g,
+
+ rSplit = /^(.+?)_*:_*(.*)$/,
+
+ // See Title.php#getTitleInvalidRegex
+ rInvalid = new RegExp(
+ '[^' + mw.config.get( 'wgLegalTitleChars' ) + ']' +
+ // URL percent encoding sequences interfere with the ability
+ // to round-trip titles -- you can't link to them consistently.
+ '|%[0-9A-Fa-f]{2}' +
+ // XML/HTML character references produce similar issues.
+ '|&[A-Za-z0-9\u0080-\uFFFF]+;' +
+ '|&#[0-9]+;' +
+ '|&#x[0-9A-Fa-f]+;'
+ ),
+
/**
- * Sanitize namespace id.
- * @ignore
- * @param id {Number} Namespace id.
- * @return {Number|Boolean} The id as-is or boolean false if invalid.
+ * Internal helper for #constructor and #newFromtext.
+ *
+ * Based on Title.php#secureAndSplit
+ *
+ * @private
+ * @static
+ * @method parse
+ * @param {string} title
+ * @param {number} [defaultNamespace=NS_MAIN]
+ * @return {Object|boolean}
*/
- fixNsId = function ( id ) {
- // wgFormattedNamespaces is an object of *string* key-vals (ie. arr["0"] not arr[0] )
- var ns = mw.config.get( 'wgFormattedNamespaces' )[id.toString()];
+ parse = function ( title, defaultNamespace ) {
+ var namespace, m, id, i, fragment, ext;
- // Check only undefined (may be false-y, such as '' (main namespace) ).
- if ( ns === undefined ) {
+ namespace = defaultNamespace === undefined ? NS_MAIN : defaultNamespace;
+
+ title = title
+ // Normalise whitespace to underscores and remove duplicates
+ .replace( /[ _\s]+/g, '_' )
+ // Trim underscores
+ .replace( rUnderscoreTrim, '' );
+
+ if ( title === '' ) {
return false;
+ }
+
+ // Process initial colon
+ if ( title.charAt( 0 ) === ':' ) {
+ // Initial colon means main namespace instead of specified default
+ namespace = NS_MAIN;
+ title = title
+ // Strip colon
+ .substr( 1 )
+ // Trim underscores
+ .replace( rUnderscoreTrim, '' );
+ }
+
+ // Process namespace prefix (if any)
+ m = title.match( rSplit );
+ if ( m ) {
+ id = getNsIdByName( m[1] );
+ if ( id !== false ) {
+ // Ordinary namespace
+ namespace = id;
+ title = m[2];
+
+ // For Talk:X pages, make sure X has no "namespace" prefix
+ if ( namespace === NS_TALK && ( m = title.match( rSplit ) ) ) {
+ // Disallow titles like Talk:File:x (subject should roundtrip: talk:file:x -> file:x -> file_talk:x)
+ if ( getNsIdByName( m[1] ) !== false ) {
+ return false;
+ }
+ }
+ }
+ }
+
+ // Process fragment
+ i = title.indexOf( '#' );
+ if ( i === -1 ) {
+ fragment = null;
} else {
- return Number( id );
+ fragment = title
+ // Get segment starting after the hash
+ .substr( i + 1 )
+ // Convert to text
+ // NB: Must not be trimmed ("Example#_foo" is not the same as "Example#foo")
+ .replace( /_/g, ' ' );
+
+ title = title
+ // Strip hash
+ .substr( 0, i )
+ // Trim underscores, again (strips "_" from "bar" in "Foo_bar_#quux")
+ .replace( rUnderscoreTrim, '' );
}
- },
- /**
- * Get namespace id from namespace name by any known namespace/id pair (localized, canonical or alias).
- * Example: On a German wiki this would return 6 for any of 'File', 'Datei', 'Image' or even 'Bild'.
- * @ignore
- * @param ns {String} Namespace name (case insensitive, leading/trailing space ignored).
- * @return {Number|Boolean} Namespace id or boolean false if unrecognized.
- */
- getNsIdByName = function ( ns ) {
- // Don't cast non-strings to strings, because null or undefined
- // should not result in returning the id of a potential namespace
- // called "Null:" (e.g. on nullwiki.example.org)
- // Also, toLowerCase throws exception on null/undefined, because
- // it is a String.prototype method.
- if ( typeof ns !== 'string' ) {
+
+ // Reject illegal characters
+ if ( title.match( rInvalid ) ) {
return false;
}
- ns = clean( $.trim( ns.toLowerCase() ) ); // Normalize
- var id = mw.config.get( 'wgNamespaceIds' )[ns];
- if ( id === undefined ) {
- mw.log( 'mw.Title: Unrecognized namespace: ' + ns );
+
+ // Disallow titles that browsers or servers might resolve as directory navigation
+ if (
+ title.indexOf( '.' ) !== -1 && (
+ title === '.' || title === '..' ||
+ title.indexOf( './' ) === 0 ||
+ title.indexOf( '../' ) === 0 ||
+ title.indexOf( '/./' ) !== -1 ||
+ title.indexOf( '/../' ) !== -1 ||
+ title.substr( -2 ) === '/.' ||
+ title.substr( -3 ) === '/..'
+ )
+ ) {
+ return false;
+ }
+
+ // Disallow magic tilde sequence
+ if ( title.indexOf( '~~~' ) !== -1 ) {
+ return false;
+ }
+
+ // Disallow titles exceeding the 255 byte size limit (size of underlying database field)
+ // Except for special pages, e.g. [[Special:Block/Long name]]
+ // Note: The PHP implementation also asserts that even in NS_SPECIAL, the title should
+ // be less than 512 bytes.
+ if ( namespace !== NS_SPECIAL && $.byteLength( title ) > 255 ) {
+ return false;
+ }
+
+ // Can't make a link to a namespace alone.
+ if ( title === '' && namespace !== NS_MAIN ) {
+ return false;
+ }
+
+ // Any remaining initial :s are illegal.
+ if ( title.charAt( 0 ) === ':' ) {
return false;
}
- return fixNsId( id );
+
+ // For backwards-compatibility with old mw.Title, we separate the extension from the
+ // rest of the title.
+ i = title.lastIndexOf( '.' );
+ if ( i === -1 || title.length <= i + 1 ) {
+ // Extensions are the non-empty segment after the last dot
+ ext = null;
+ } else {
+ ext = title.substr( i + 1 );
+ title = title.substr( 0, i );
+ }
+
+ return {
+ namespace: namespace,
+ title: title,
+ ext: ext,
+ fragment: fragment
+ };
},
/**
- * Helper to extract namespace, name and extension from a string.
+ * Convert db-key to readable text.
*
- * @ignore
- * @param {mw.Title} title
- * @param {string} raw
- * @return {mw.Title}
+ * @private
+ * @static
+ * @method text
+ * @param {string} s
+ * @return {string}
*/
- setAll = function ( title, s ) {
- // In normal browsers the match-array contains null/undefined if there's no match,
- // IE returns an empty string.
- var matches = s.match( /^(?:([^:]+):)?(.*?)(?:\.(\w+))?$/ ),
- nsMatch = getNsIdByName( matches[1] );
-
- // Namespace must be valid, and title must be a non-empty string.
- if ( nsMatch && typeof matches[2] === 'string' && matches[2] !== '' ) {
- title.ns = nsMatch;
- title.name = fixName( matches[2] );
- if ( typeof matches[3] === 'string' && matches[3] !== '' ) {
- title.ext = fixExt( matches[3] );
- }
+ text = function ( s ) {
+ if ( s !== null && s !== undefined ) {
+ return s.replace( /_/g, ' ' );
} else {
- // Consistency with MediaWiki PHP: Unknown namespace -> fallback to main namespace.
- title.ns = 0;
- setNameAndExtension( title, s );
+ return '';
}
- return title;
},
+ // Polyfill for ES5 Object.create
+ createObject = Object.create || ( function () {
+ return function ( o ) {
+ function Title() {}
+ if ( o !== Object( o ) ) {
+ throw new Error( 'Cannot inherit from a non-object' );
+ }
+ Title.prototype = o;
+ return new Title();
+ };
+ }() );
+
+
+ /* Static members */
+
/**
- * Helper to extract name and extension from a string.
+ * Constructor for Title objects with a null return instead of an exception for invalid titles.
*
- * @ignore
- * @param {mw.Title} title
- * @param {string} raw
- * @return {mw.Title}
+ * @static
+ * @method
+ * @param {string} title
+ * @param {number} [namespace=NS_MAIN] Default namespace
+ * @return {mw.Title|null} A valid Title object or null if the title is invalid
*/
- setNameAndExtension = function ( title, raw ) {
- // In normal browsers the match-array contains null/undefined if there's no match,
- // IE returns an empty string.
- var matches = raw.match( /^(?:)?(.*?)(?:\.(\w+))?$/ );
-
- // Title must be a non-empty string.
- if ( typeof matches[1] === 'string' && matches[1] !== '' ) {
- title.name = fixName( matches[1] );
- if ( typeof matches[2] === 'string' && matches[2] !== '' ) {
- title.ext = fixExt( matches[2] );
- }
- } else {
- throw new Error( 'mw.Title: Could not parse title "' + raw + '"' );
+ Title.newFromText = function ( title, namespace ) {
+ var t, parsed = parse( title, namespace );
+ if ( !parsed ) {
+ return null;
}
- return title;
+
+ t = createObject( Title.prototype );
+ t.namespace = parsed.namespace;
+ t.title = parsed.title;
+ t.ext = parsed.ext;
+ t.fragment = parsed.fragment;
+
+ return t;
};
+ /**
+ * Get the file title from an image element
+ *
+ * var title = mw.Title.newFromImg( $( 'img:first' ) );
+ *
+ * @static
+ * @param {HTMLElement|jQuery} img The image to use as a base
+ * @return {mw.Title|null} The file title or null if unsuccessful
+ */
+ Title.newFromImg = function ( img ) {
+ var matches, i, regex, src, decodedSrc,
+
+ // thumb.php-generated thumbnails
+ thumbPhpRegex = /thumb\.php/,
+
+ regexes = [
+ // Thumbnails
+ /\/[a-f0-9]\/[a-f0-9]{2}\/([^\s\/]+)\/[0-9]+px-\1[^\s\/]*$/,
+
+ // Thumbnails in non-hashed upload directories
+ /\/([^\s\/]+)\/[0-9]+px-\1[^\s\/]*$/,
+
+ // Full size images
+ /\/[a-f0-9]\/[a-f0-9]{2}\/([^\s\/]+)$/,
+
+ // Full-size images in non-hashed upload directories
+ /\/([^\s\/]+)$/
+ ],
- /* Static space */
+ recount = regexes.length;
+
+ src = img.jquery ? img[0].src : img.src;
+
+ matches = src.match( thumbPhpRegex );
+
+ if ( matches ) {
+ return mw.Title.newFromText( 'File:' + mw.util.getParamValue( 'f', src ) );
+ }
+
+ decodedSrc = decodeURIComponent( src );
+
+ for ( i = 0; i < recount; i++ ) {
+ regex = regexes[i];
+ matches = decodedSrc.match( regex );
+
+ if ( matches && matches[1] ) {
+ return mw.Title.newFromText( 'File:' + matches[1] );
+ }
+ }
+
+ return null;
+ };
/**
* Whether this title exists on the wiki.
+ *
* @static
- * @param {Mixed} title prefixed db-key name (string) or instance of Title
- * @return {Mixed} Boolean true/false if the information is available. Otherwise null.
+ * @param {string|mw.Title} title prefixed db-key name (string) or instance of Title
+ * @return {boolean|null} Boolean if the information is available, otherwise null
*/
Title.exists = function ( title ) {
- var type = $.type( title ), obj = Title.exist.pages, match;
+ var match,
+ type = $.type( title ),
+ obj = Title.exist.pages;
+
if ( type === 'string' ) {
match = obj[title];
} else if ( type === 'object' && title instanceof Title ) {
@@ -194,23 +370,23 @@ var
} else {
throw new Error( 'mw.Title.exists: title must be a string or an instance of Title' );
}
+
if ( typeof match === 'boolean' ) {
return match;
}
+
return null;
};
- /**
- * @static
- * @property
- */
Title.exist = {
/**
+ * Boolean true value indicates page does exist.
+ *
* @static
* @property {Object} exist.pages Keyed by PrefixedDb title.
- * Boolean true value indicates page does exist.
*/
pages: {},
+
/**
* Example to declare existing titles:
* Title.exist.set(['User:John_Doe', ...]);
@@ -219,8 +395,8 @@ var
*
* @static
* @property exist.set
- * @param {string|Array} titles Title(s) in strict prefixedDb title form.
- * @param {boolean} [state] State of the given titles. Defaults to true.
+ * @param {string|Array} titles Title(s) in strict prefixedDb title form
+ * @param {boolean} [state=true] State of the given titles
* @return {boolean}
*/
set: function ( titles, state ) {
@@ -234,42 +410,60 @@ var
}
};
- /* Public methods */
+ /* Public members */
- fn = {
+ Title.prototype = {
constructor: Title,
/**
- * Get the namespace number.
+ * Get the namespace number
+ *
+ * Example: 6 for "File:Example_image.svg".
+ *
* @return {number}
*/
- getNamespaceId: function (){
- return this.ns;
+ getNamespaceId: function () {
+ return this.namespace;
},
/**
- * Get the namespace prefix (in the content-language).
- * In NS_MAIN this is '', otherwise namespace name plus ':'
+ * Get the namespace prefix (in the content language)
+ *
+ * Example: "File:" for "File:Example_image.svg".
+ * In #NS_MAIN this is '', otherwise namespace name plus ':'
+ *
* @return {string}
*/
- getNamespacePrefix: function (){
- return mw.config.get( 'wgFormattedNamespaces' )[this.ns].replace( / /g, '_' ) + (this.ns === 0 ? '' : ':');
+ getNamespacePrefix: function () {
+ return this.namespace === NS_MAIN ?
+ '' :
+ ( mw.config.get( 'wgFormattedNamespaces' )[ this.namespace ].replace( / /g, '_' ) + ':' );
},
/**
- * The name, like "Foo_bar"
+ * Get the page name without extension or namespace prefix
+ *
+ * Example: "Example_image" for "File:Example_image.svg".
+ *
+ * For the page title (full page name without namespace prefix), see #getMain.
+ *
* @return {string}
*/
getName: function () {
- if ( $.inArray( this.ns, mw.config.get( 'wgCaseSensitiveNamespaces' ) ) !== -1 ) {
- return this.name;
+ if ( $.inArray( this.namespace, mw.config.get( 'wgCaseSensitiveNamespaces' ) ) !== -1 ) {
+ return this.title;
} else {
- return $.ucFirst( this.name );
+ return $.ucFirst( this.title );
}
},
/**
- * The name, like "Foo bar"
+ * Get the page name (transformed by #text)
+ *
+ * Example: "Example image" for "File:Example_image.svg".
+ *
+ * For the page title (full page name without namespace prefix), see #getMainText.
+ *
* @return {string}
*/
getNameText: function () {
@@ -277,24 +471,30 @@ var
},
/**
- * Get full name in prefixed DB form, like File:Foo_bar.jpg,
- * most useful for API calls, anything that must identify the "title".
- * @return {string}
+ * Get the extension of the page name (if any)
+ *
+ * @return {string|null} Name extension or null if there is none
*/
- getPrefixedDb: function () {
- return this.getNamespacePrefix() + this.getMain();
+ getExtension: function () {
+ return this.ext;
},
/**
- * Get full name in text form, like "File:Foo bar.jpg".
+ * Shortcut for appendable string to form the main page name.
+ *
+ * Returns a string like ".json", or "" if no extension.
+ *
* @return {string}
*/
- getPrefixedText: function () {
- return text( this.getPrefixedDb() );
+ getDotExtension: function () {
+ return this.ext === null ? '' : '.' + this.ext;
},
/**
- * The main title (without namespace), like "Foo_bar.jpg"
+ * Get the main page name (transformed by #text)
+ *
+ * Example: "Example_image.svg" for "File:Example_image.svg".
+ *
* @return {string}
*/
getMain: function () {
@@ -302,7 +502,10 @@ var
},
/**
- * The "text" form, like "Foo bar.jpg"
+ * Get the main page name (transformed by #text)
+ *
+ * Example: "Example image.svg" for "File:Example_image.svg".
+ *
* @return {string}
*/
getMainText: function () {
@@ -310,46 +513,73 @@ var
},
/**
- * Get the extension (returns null if there was none)
- * @return {string|null}
+ * Get the full page name
+ *
+ * Eaxample: "File:Example_image.svg".
+ * Most useful for API calls, anything that must identify the "title".
+ *
+ * @return {string}
*/
- getExtension: function () {
- return this.ext;
+ getPrefixedDb: function () {
+ return this.getNamespacePrefix() + this.getMain();
},
/**
- * Convenience method: return string like ".jpg", or "" if no extension
+ * Get the full page name (transformed by #text)
+ *
+ * Example: "File:Example image.svg" for "File:Example_image.svg".
+ *
* @return {string}
*/
- getDotExtension: function () {
- return this.ext === null ? '' : '.' + this.ext;
+ getPrefixedText: function () {
+ return text( this.getPrefixedDb() );
+ },
+
+ /**
+ * Get the fragment (if any).
+ *
+ * Note that this method (by design) does not include the hash character and
+ * the value is not url encoded.
+ *
+ * @return {string|null}
+ */
+ getFragment: function () {
+ return this.fragment;
},
/**
- * Return the URL to this title
- * @see mw.util#wikiGetlink
+ * Get the URL to this title
+ *
+ * @see mw.util#getUrl
* @return {string}
*/
getUrl: function () {
- return mw.util.wikiGetlink( this.toString() );
+ return mw.util.getUrl( this.toString() );
},
/**
* Whether this title exists on the wiki.
+ *
* @see #static-method-exists
- * @return {boolean|null} If the information is available. Otherwise null.
+ * @return {boolean|null} Boolean if the information is available, otherwise null
*/
exists: function () {
return Title.exists( this );
}
};
- // Alias
- fn.toString = fn.getPrefixedDb;
- fn.toText = fn.getPrefixedText;
+ /**
+ * @alias #getPrefixedDb
+ * @method
+ */
+ Title.prototype.toString = Title.prototype.getPrefixedDb;
+
- // Assign
- Title.prototype = fn;
+ /**
+ * @alias #getPrefixedText
+ * @method
+ */
+ Title.prototype.toText = Title.prototype.getPrefixedText;
// Expose
mw.Title = Title;
diff --git a/resources/mediawiki/mediawiki.Uri.js b/resources/mediawiki/mediawiki.Uri.js
index 643e5c3e..a2d4d6cb 100644
--- a/resources/mediawiki/mediawiki.Uri.js
+++ b/resources/mediawiki/mediawiki.Uri.js
@@ -201,7 +201,7 @@
uri = this,
matches = parser[ options.strictMode ? 'strict' : 'loose' ].exec( str );
$.each( properties, function ( i, property ) {
- uri[ property ] = matches[ i+1 ];
+ uri[ property ] = matches[ i + 1 ];
} );
// uri.query starts out as the query string; we will parse it into key-val pairs then make
@@ -210,7 +210,7 @@
q = {};
// using replace to iterate over a string
if ( uri.query ) {
- uri.query.replace( /(?:^|&)([^&=]*)(?:(=)([^&]*))?/g, function ($0, $1, $2, $3) {
+ uri.query.replace( /(?:^|&)([^&=]*)(?:(=)([^&]*))?/g, function ( $0, $1, $2, $3 ) {
var k, v;
if ( $1 ) {
k = Uri.decode( $1 );
diff --git a/resources/mediawiki/mediawiki.debug.js b/resources/mediawiki/mediawiki.debug.js
index 88af3c65..986917a1 100644
--- a/resources/mediawiki/mediawiki.debug.js
+++ b/resources/mediawiki/mediawiki.debug.js
@@ -229,7 +229,7 @@
$( '<colgroup>' ).css( 'width', 350 ).appendTo( $table );
- entryTypeText = function( entryType ) {
+ entryTypeText = function ( entryType ) {
switch ( entryType ) {
case 'log':
return 'Log';
diff --git a/resources/mediawiki/mediawiki.htmlform.js b/resources/mediawiki/mediawiki.htmlform.js
index 83bf2e3a..de068598 100644
--- a/resources/mediawiki/mediawiki.htmlform.js
+++ b/resources/mediawiki/mediawiki.htmlform.js
@@ -1,7 +1,7 @@
/**
* Utility functions for jazzing up HTMLForm elements.
*/
-( function ( $ ) {
+( function ( mw, $ ) {
/**
* jQuery plugin to fade or snap to visible state.
@@ -59,4 +59,70 @@
} );
-}( jQuery ) );
+ function addMulti( $oldContainer, $container ) {
+ var name = $oldContainer.find( 'input:first-child' ).attr( 'name' ),
+ oldClass = ( ' ' + $oldContainer.attr( 'class' ) + ' ' ).replace( /(mw-htmlform-field-HTMLMultiSelectField|mw-chosen)/g, '' ),
+ $select = $( '<select>' ),
+ dataPlaceholder = mw.message( 'htmlform-chosen-placeholder' );
+ oldClass = $.trim( oldClass );
+ $select.attr( {
+ name: name,
+ multiple: 'multiple',
+ 'data-placeholder': dataPlaceholder.plain(),
+ 'class': 'htmlform-chzn-select mw-input ' + oldClass
+ } );
+ $oldContainer.find( 'input' ).each( function () {
+ var $oldInput = $(this),
+ checked = $oldInput.prop( 'checked' ),
+ $option = $( '<option>' );
+ $option.prop( 'value', $oldInput.prop( 'value' ) );
+ if ( checked ) {
+ $option.prop( 'selected', true );
+ }
+ $option.text( $oldInput.prop( 'value' ) );
+ $select.append( $option );
+ } );
+ $container.append( $select );
+ }
+
+ function convertCheckboxesToMulti( $oldContainer, type ) {
+ var $fieldLabel = $( '<td>' ),
+ $td = $( '<td>' ),
+ $fieldLabelText = $( '<label>' ),
+ $container;
+ if ( type === 'tr' ) {
+ addMulti( $oldContainer, $td );
+ $container = $( '<tr>' );
+ $container.append( $td );
+ } else if ( type === 'div' ) {
+ $fieldLabel = $( '<div>' );
+ $container = $( '<div>' );
+ addMulti( $oldContainer, $container );
+ }
+ $fieldLabel.attr( 'class', 'mw-label' );
+ $fieldLabelText.text( $oldContainer.find( '.mw-label label' ).text() );
+ $fieldLabel.append( $fieldLabelText );
+ $container.prepend( $fieldLabel );
+ $oldContainer.replaceWith( $container );
+ return $container;
+ }
+
+ if ( $( '.mw-chosen' ).length ) {
+ mw.loader.using( 'jquery.chosen', function () {
+ $( '.mw-chosen' ).each( function () {
+ var type = this.nodeName.toLowerCase(),
+ $converted = convertCheckboxesToMulti( $( this ), type );
+ $converted.find( '.htmlform-chzn-select' ).chosen( { width: 'auto' } );
+ } );
+ } );
+ }
+
+ $( function () {
+ var $matrixTooltips = $( '.mw-htmlform-matrix .mw-htmlform-tooltip' );
+ if ( $matrixTooltips.length ) {
+ mw.loader.using( 'jquery.tipsy', function () {
+ $matrixTooltips.tipsy( { gravity: 's' } );
+ } );
+ }
+ } );
+}( mediaWiki, jQuery ) );
diff --git a/resources/mediawiki/mediawiki.icon.css b/resources/mediawiki/mediawiki.icon.css
new file mode 100644
index 00000000..f61b7257
--- /dev/null
+++ b/resources/mediawiki/mediawiki.icon.css
@@ -0,0 +1,15 @@
+/* General-purpose icons via CSS. Classes here should be named "mw-icon-*". */
+
+/* For the collapsed and expanded arrows, we also provide selectors to make it
+ * easy to use them with jquery.makeCollapsible. */
+.mw-icon-arrow-collapsed,
+.mw-collapsible-arrow.mw-collapsible-toggle-collapsed {
+ /* @embed */
+ background: url(images/arrow-collapsed-ltr.png) no-repeat left bottom;
+}
+
+.mw-icon-arrow-expanded,
+.mw-collapsible-arrow.mw-collapsible-toggle-expanded {
+ /* @embed */
+ background: url(images/arrow-expanded.png) no-repeat left bottom;
+}
diff --git a/resources/mediawiki/mediawiki.inspect.js b/resources/mediawiki/mediawiki.inspect.js
new file mode 100644
index 00000000..2f2ca335
--- /dev/null
+++ b/resources/mediawiki/mediawiki.inspect.js
@@ -0,0 +1,204 @@
+/*!
+ * Tools for inspecting page composition and performance.
+ *
+ * @author Ori Livneh
+ * @since 1.22
+ */
+/*jshint devel:true */
+( function ( mw, $ ) {
+
+ function sortByProperty( array, prop, descending ) {
+ var order = descending ? -1 : 1;
+ return array.sort( function ( a, b ) {
+ return a[prop] > b[prop] ? order : a[prop] < b[prop] ? -order : 0;
+ } );
+ }
+
+ /**
+ * @class mw.inspect
+ * @singleton
+ */
+ var inspect = {
+
+ /**
+ * Calculate the byte size of a ResourceLoader module.
+ *
+ * @param {string} moduleName The name of the module
+ * @return {number|null} Module size in bytes or null
+ */
+ getModuleSize: function ( moduleName ) {
+ var module = mw.loader.moduleRegistry[ moduleName ],
+ payload = 0;
+
+ if ( mw.loader.getState( moduleName ) !== 'ready' ) {
+ return null;
+ }
+
+ if ( !module.style && !module.script ) {
+ return null;
+ }
+
+ // Tally CSS
+ if ( module.style && $.isArray( module.style.css ) ) {
+ $.each( module.style.css, function ( i, stylesheet ) {
+ payload += $.byteLength( stylesheet );
+ } );
+ }
+
+ // Tally JavaScript
+ if ( $.isFunction( module.script ) ) {
+ payload += $.byteLength( module.script.toString() );
+ }
+
+ return payload;
+ },
+
+ /**
+ * Given CSS source, count both the total number of selectors it
+ * contains and the number which match some element in the current
+ * document.
+ *
+ * @param {string} css CSS source
+ * @return Selector counts
+ * @return {number} return.selectors Total number of selectors
+ * @return {number} return.matched Number of matched selectors
+ */
+ auditSelectors: function ( css ) {
+ var selectors = { total: 0, matched: 0 },
+ style = document.createElement( 'style' ),
+ sheet, rules;
+
+ style.textContent = css;
+ document.body.appendChild( style );
+ // Standards-compliant browsers use .sheet.cssRules, IE8 uses .styleSheet.rules…
+ sheet = style.sheet || style.styleSheet;
+ rules = sheet.cssRules || sheet.rules;
+ $.each( rules, function ( index, rule ) {
+ selectors.total++;
+ if ( document.querySelector( rule.selectorText ) !== null ) {
+ selectors.matched++;
+ }
+ } );
+ document.body.removeChild( style );
+ return selectors;
+ },
+
+ /**
+ * Get a list of all loaded ResourceLoader modules.
+ *
+ * @return {Array} List of module names
+ */
+ getLoadedModules: function () {
+ return $.grep( mw.loader.getModuleNames(), function ( module ) {
+ return mw.loader.getState( module ) === 'ready';
+ } );
+ },
+
+ /**
+ * Print tabular data to the console, using console.table, console.log,
+ * or mw.log (in declining order of preference).
+ *
+ * @param {Array} data Tabular data represented as an array of objects
+ * with common properties.
+ */
+ dumpTable: function ( data ) {
+ try {
+ // Bartosz made me put this here.
+ if ( window.opera ) { throw window.opera; }
+ // Use Function.prototype#call to force an exception on Firefox,
+ // which doesn't define console#table but doesn't complain if you
+ // try to invoke it.
+ console.table.call( console, data );
+ return;
+ } catch (e) {}
+ try {
+ console.log( $.toJSON( data, null, 2 ) );
+ return;
+ } catch (e) {}
+ mw.log( data );
+ },
+
+ /**
+ * Generate and print one more reports. When invoked with no arguments,
+ * print all reports.
+ *
+ * @param {string...} [reports] Report names to run, or unset to print
+ * all available reports.
+ */
+ runReports: function () {
+ var reports = arguments.length > 0 ?
+ Array.prototype.slice.call( arguments ) :
+ $.map( inspect.reports, function ( v, k ) { return k; } );
+
+ $.each( reports, function ( index, name ) {
+ inspect.dumpTable( inspect.reports[name]() );
+ } );
+ },
+
+ /**
+ * @class mw.inspect.reports
+ * @singleton
+ */
+ reports: {
+ /**
+ * Generate a breakdown of all loaded modules and their size in
+ * kilobytes. Modules are ordered from largest to smallest.
+ */
+ size: function () {
+ // Map each module to a descriptor object.
+ var modules = $.map( inspect.getLoadedModules(), function ( module ) {
+ return {
+ name: module,
+ size: inspect.getModuleSize( module )
+ };
+ } );
+
+ // Sort module descriptors by size, largest first.
+ sortByProperty( modules, 'size', true );
+
+ // Convert size to human-readable string.
+ $.each( modules, function ( i, module ) {
+ module.size = module.size > 1024 ?
+ ( module.size / 1024 ).toFixed( 2 ) + ' KB' :
+ ( module.size !== null ? module.size + ' B' : null );
+ } );
+
+ return modules;
+ },
+
+ /**
+ * For each module with styles, count the number of selectors, and
+ * count how many match against some element currently in the DOM.
+ */
+ css: function () {
+ var modules = [];
+
+ $.each( inspect.getLoadedModules(), function ( index, name ) {
+ var css, stats, module = mw.loader.moduleRegistry[name];
+
+ try {
+ css = module.style.css.join();
+ } catch (e) { return; } // skip
+
+ stats = inspect.auditSelectors( css );
+ modules.push( {
+ module: name,
+ allSelectors: stats.total,
+ matchedSelectors: stats.matched,
+ percentMatched: stats.total !== 0 ?
+ ( stats.matched / stats.total * 100 ).toFixed( 2 ) + '%' : null
+ } );
+ } );
+ sortByProperty( modules, 'allSelectors', true );
+ return modules;
+ },
+ }
+ };
+
+ if ( mw.config.get( 'debug' ) ) {
+ mw.log( 'mw.inspect: reports are not available in debug mode.' );
+ }
+
+ mw.inspect = inspect;
+
+}( mediaWiki, jQuery ) );
diff --git a/resources/mediawiki/mediawiki.jqueryMsg.js b/resources/mediawiki/mediawiki.jqueryMsg.js
index 183b525e..70b9be93 100644
--- a/resources/mediawiki/mediawiki.jqueryMsg.js
+++ b/resources/mediawiki/mediawiki.jqueryMsg.js
@@ -3,6 +3,7 @@
* See: http://www.mediawiki.org/wiki/Extension:UploadWizard/MessageParser for docs
*
* @author neilk@wikimedia.org
+* @author mflaschen@wikimedia.org
*/
( function ( mw, $ ) {
var oldParser,
@@ -11,6 +12,31 @@
magic : {
'SITENAME' : mw.config.get( 'wgSiteName' )
},
+ // This is a whitelist based on, but simpler than, Sanitizer.php.
+ // Self-closing tags are not currently supported.
+ allowedHtmlElements : [
+ 'b',
+ 'i'
+ ],
+ // Key tag name, value allowed attributes for that tag.
+ // See Sanitizer::setupAttributeWhitelist
+ allowedHtmlCommonAttributes : [
+ // HTML
+ 'id',
+ 'class',
+ 'style',
+ 'lang',
+ 'dir',
+ 'title',
+
+ // WAI-ARIA
+ 'role'
+ ],
+
+ // Attributes allowed for specific elements.
+ // Key is element name in lower case
+ // Value is array of allowed attributes for that element
+ allowedHtmlAttributesByElement : {},
messages : mw.messages,
language : mw.language,
@@ -18,7 +44,7 @@
//
// Only 'text', 'parse', and 'escaped' are supported, and the
// actual escaping for 'escaped' is done by other code (generally
- // through jqueryMsg).
+ // through mediawiki.js).
//
// However, note that this default only
// applies to direct calls to jqueryMsg. The default for mediawiki.js itself
@@ -28,6 +54,47 @@
};
/**
+ * Wrapper around jQuery append that converts all non-objects to TextNode so append will not
+ * convert what it detects as an htmlString to an element.
+ *
+ * Object elements of children (jQuery, HTMLElement, TextNode, etc.) will be left as is.
+ *
+ * @param {jQuery} $parent Parent node wrapped by jQuery
+ * @param {Object|string|Array} children What to append, with the same possible types as jQuery
+ * @return {jQuery} $parent
+ */
+ function appendWithoutParsing( $parent, children ) {
+ var i, len;
+
+ if ( !$.isArray( children ) ) {
+ children = [children];
+ }
+
+ for ( i = 0, len = children.length; i < len; i++ ) {
+ if ( typeof children[i] !== 'object' ) {
+ children[i] = document.createTextNode( children[i] );
+ }
+ }
+
+ return $parent.append( children );
+ }
+
+ /**
+ * Decodes the main HTML entities, those encoded by mw.html.escape.
+ *
+ * @param {string} encode Encoded string
+ * @return {string} String with those entities decoded
+ */
+ function decodePrimaryHtmlEntities( encoded ) {
+ return encoded
+ .replace( /&#039;/g, '\'' )
+ .replace( /&quot;/g, '"' )
+ .replace( /&lt;/g, '<' )
+ .replace( /&gt;/g, '>' )
+ .replace( /&amp;/g, '&' );
+ }
+
+ /**
* Given parser options, return a function that parses a key and replacements, returning jQuery object
* @param {Object} parser options
* @return {Function} accepting ( String message key, String replacement1, String replacement2 ... ) and returning {jQuery}
@@ -48,7 +115,7 @@
try {
return parser.parse( key, argsArray );
} catch ( e ) {
- return $( '<span>' ).append( key + ': ' + e.message );
+ return $( '<span>' ).text( key + ': ' + e.message );
}
};
}
@@ -125,10 +192,10 @@
*/
return function () {
var $target = this.empty();
- // TODO: Simply $target.append( failableParserFn( arguments ).contents() )
- // or Simply $target.append( failableParserFn( arguments ) )
+ // TODO: Simply appendWithoutParsing( $target, failableParserFn( arguments ).contents() )
+ // or Simply appendWithoutParsing( $target, failableParserFn( arguments ) )
$.each( failableParserFn( arguments ).contents(), function ( i, node ) {
- $target.append( node );
+ appendWithoutParsing( $target, node );
} );
return $target;
};
@@ -206,11 +273,13 @@
* @return {Mixed} abstract syntax tree
*/
wikiTextToAst: function ( input ) {
- var pos,
+ var pos, settings = this.settings, concat = Array.prototype.concat,
regularLiteral, regularLiteralWithoutBar, regularLiteralWithoutSpace, regularLiteralWithSquareBrackets,
- backslash, anyCharacter, escapedOrLiteralWithoutSpace, escapedOrLiteralWithoutBar, escapedOrRegularLiteral,
- whitespace, dollar, digits,
- openExtlink, closeExtlink, wikilinkPage, wikilinkContents, openLink, closeLink, templateName, pipe, colon,
+ doubleQuote, singleQuote, backslash, anyCharacter, asciiAlphabetLiteral,
+ escapedOrLiteralWithoutSpace, escapedOrLiteralWithoutBar, escapedOrRegularLiteral,
+ whitespace, dollar, digits, htmlDoubleQuoteAttributeValue, htmlSingleQuoteAttributeValue,
+ htmlAttributeEquals, openHtmlStartTag, optionalForwardSlash, openHtmlEndTag, closeHtmlTag,
+ openExtlink, closeExtlink, wikilinkPage, wikilinkContents, openWikilink, closeWikilink, templateName, pipe, colon,
templateContents, openTemplate, closeTemplate,
nonWhitespaceExpression, paramExpression, expression, curlyBraceTransformExpression, result;
@@ -289,6 +358,15 @@
return result;
};
}
+
+ /**
+ * Makes a regex parser, given a RegExp object.
+ * The regex being passed in should start with a ^ to anchor it to the start
+ * of the string.
+ *
+ * @param {RegExp} regex anchored regex
+ * @return {Function} function to parse input based on the regex
+ */
function makeRegexParser( regex ) {
return function () {
var matches = input.substr( pos ).match( regex );
@@ -315,12 +393,23 @@
// but some debuggers can't tell you exactly where they come from. Also the mutually
// recursive functions seem not to work in all browsers then. (Tested IE6-7, Opera, Safari, FF)
// This may be because, to save code, memoization was removed
- regularLiteral = makeRegexParser( /^[^{}\[\]$\\]/ );
+
+ regularLiteral = makeRegexParser( /^[^{}\[\]$<\\]/ );
regularLiteralWithoutBar = makeRegexParser(/^[^{}\[\]$\\|]/);
regularLiteralWithoutSpace = makeRegexParser(/^[^{}\[\]$\s]/);
regularLiteralWithSquareBrackets = makeRegexParser( /^[^{}$\\]/ );
+
backslash = makeStringParser( '\\' );
+ doubleQuote = makeStringParser( '"' );
+ singleQuote = makeStringParser( '\'' );
anyCharacter = makeRegexParser( /^./ );
+
+ openHtmlStartTag = makeStringParser( '<' );
+ optionalForwardSlash = makeRegexParser( /^\/?/ );
+ openHtmlEndTag = makeStringParser( '</' );
+ htmlAttributeEquals = makeRegexParser( /^\s*=\s*/ );
+ closeHtmlTag = makeRegexParser( /^\s*>/ );
+
function escapedLiteral() {
var result = sequence( [
backslash,
@@ -369,6 +458,10 @@
return result === null ? null : result.join('');
}
+ asciiAlphabetLiteral = makeRegexParser( /[A-Za-z]+/ );
+ htmlDoubleQuoteAttributeValue = makeRegexParser( /^[^"]*/ );
+ htmlSingleQuoteAttributeValue = makeRegexParser( /^[^']*/ );
+
whitespace = makeRegexParser( /^\s+/ );
dollar = makeStringParser( '$' );
digits = makeRegexParser( /^\d+/ );
@@ -385,7 +478,7 @@
}
openExtlink = makeStringParser( '[' );
closeExtlink = makeStringParser( ']' );
- // this extlink MUST have inner text, e.g. [foo] not allowed; [foo bar] is allowed
+ // this extlink MUST have inner contents, e.g. [foo] not allowed; [foo bar] [foo <i>bar</i>], etc. are allowed
function extlink() {
var result, parsedResult;
result = null;
@@ -393,11 +486,18 @@
openExtlink,
nonWhitespaceExpression,
whitespace,
- expression,
+ nOrMore( 1, expression ),
closeExtlink
] );
if ( parsedResult !== null ) {
- result = [ 'LINK', parsedResult[1], parsedResult[3] ];
+ result = [ 'EXTLINK', parsedResult[1] ];
+ // TODO (mattflaschen, 2013-03-22): Clean this up if possible.
+ // It's avoiding CONCAT for single nodes, so they at least doesn't get the htmlEmitter span.
+ if ( parsedResult[3].length === 1 ) {
+ result.push( parsedResult[3][0] );
+ } else {
+ result.push( ['CONCAT'].concat( parsedResult[3] ) );
+ }
}
return result;
}
@@ -414,10 +514,10 @@
if ( result === null ) {
return null;
}
- return [ 'LINKPARAM', parseInt( result[2], 10 ) - 1, result[4] ];
+ return [ 'EXTLINKPARAM', parseInt( result[2], 10 ) - 1, result[4] ];
}
- openLink = makeStringParser( '[[' );
- closeLink = makeStringParser( ']]' );
+ openWikilink = makeStringParser( '[[' );
+ closeWikilink = makeStringParser( ']]' );
pipe = makeStringParser( '|' );
function template() {
@@ -448,21 +548,158 @@
wikilinkPage // unpiped link
] );
- function link() {
+ function wikilink() {
var result, parsedResult, parsedLinkContents;
result = null;
parsedResult = sequence( [
- openLink,
+ openWikilink,
wikilinkContents,
- closeLink
+ closeWikilink
] );
if ( parsedResult !== null ) {
parsedLinkContents = parsedResult[1];
- result = [ 'WLINK' ].concat( parsedLinkContents );
+ result = [ 'WIKILINK' ].concat( parsedLinkContents );
+ }
+ return result;
+ }
+
+ // TODO: Support data- if appropriate
+ function doubleQuotedHtmlAttributeValue() {
+ var parsedResult = sequence( [
+ doubleQuote,
+ htmlDoubleQuoteAttributeValue,
+ doubleQuote
+ ] );
+ return parsedResult === null ? null : parsedResult[1];
+ }
+
+ function singleQuotedHtmlAttributeValue() {
+ var parsedResult = sequence( [
+ singleQuote,
+ htmlSingleQuoteAttributeValue,
+ singleQuote
+ ] );
+ return parsedResult === null ? null : parsedResult[1];
+ }
+
+ function htmlAttribute() {
+ var parsedResult = sequence( [
+ whitespace,
+ asciiAlphabetLiteral,
+ htmlAttributeEquals,
+ choice( [
+ doubleQuotedHtmlAttributeValue,
+ singleQuotedHtmlAttributeValue
+ ] )
+ ] );
+ return parsedResult === null ? null : [parsedResult[1], parsedResult[3]];
+ }
+
+ /**
+ * Checks if HTML is allowed
+ *
+ * @param {string} startTagName HTML start tag name
+ * @param {string} endTagName HTML start tag name
+ * @param {Object} attributes array of consecutive key value pairs,
+ * with index 2 * n being a name and 2 * n + 1 the associated value
+ * @return {boolean} true if this is HTML is allowed, false otherwise
+ */
+ function isAllowedHtml( startTagName, endTagName, attributes ) {
+ var i, len, attributeName;
+
+ startTagName = startTagName.toLowerCase();
+ endTagName = endTagName.toLowerCase();
+ if ( startTagName !== endTagName || $.inArray( startTagName, settings.allowedHtmlElements ) === -1 ) {
+ return false;
+ }
+
+ for ( i = 0, len = attributes.length; i < len; i += 2 ) {
+ attributeName = attributes[i];
+ if ( $.inArray( attributeName, settings.allowedHtmlCommonAttributes ) === -1 &&
+ $.inArray( attributeName, settings.allowedHtmlAttributesByElement[startTagName] || [] ) === -1 ) {
+ return false;
+ }
+ }
+
+ return true;
+ }
+
+ function htmlAttributes() {
+ var parsedResult = nOrMore( 0, htmlAttribute )();
+ // Un-nest attributes array due to structure of jQueryMsg operations (see emit).
+ return concat.apply( ['HTMLATTRIBUTES'], parsedResult );
+ }
+
+ // Subset of allowed HTML markup.
+ // Most elements and many attributes allowed on the server are not supported yet.
+ function html() {
+ var result = null, parsedOpenTagResult, parsedHtmlContents,
+ parsedCloseTagResult, wrappedAttributes, attributes,
+ startTagName, endTagName, startOpenTagPos, startCloseTagPos,
+ endOpenTagPos, endCloseTagPos;
+
+ // Break into three sequence calls. That should allow accurate reconstruction of the original HTML, and requiring an exact tag name match.
+ // 1. open through closeHtmlTag
+ // 2. expression
+ // 3. openHtmlEnd through close
+ // This will allow recording the positions to reconstruct if HTML is to be treated as text.
+
+ startOpenTagPos = pos;
+ parsedOpenTagResult = sequence( [
+ openHtmlStartTag,
+ asciiAlphabetLiteral,
+ htmlAttributes,
+ optionalForwardSlash,
+ closeHtmlTag
+ ] );
+
+ if ( parsedOpenTagResult === null ) {
+ return null;
}
+
+ endOpenTagPos = pos;
+ startTagName = parsedOpenTagResult[1];
+
+ parsedHtmlContents = nOrMore( 0, expression )();
+
+ startCloseTagPos = pos;
+ parsedCloseTagResult = sequence( [
+ openHtmlEndTag,
+ asciiAlphabetLiteral,
+ closeHtmlTag
+ ] );
+
+ if ( parsedCloseTagResult === null ) {
+ // Closing tag failed. Return the start tag and contents.
+ return [ 'CONCAT', input.substring( startOpenTagPos, endOpenTagPos ) ].concat( parsedHtmlContents );
+ }
+
+ endCloseTagPos = pos;
+ endTagName = parsedCloseTagResult[1];
+ wrappedAttributes = parsedOpenTagResult[2];
+ attributes = wrappedAttributes.slice( 1 );
+ if ( isAllowedHtml( startTagName, endTagName, attributes) ) {
+ result = [ 'HTMLELEMENT', startTagName, wrappedAttributes ].concat( parsedHtmlContents );
+ } else {
+ // HTML is not allowed, so contents will remain how
+ // it was, while HTML markup at this level will be
+ // treated as text
+ // E.g. assuming script tags are not allowed:
+ //
+ // <script>[[Foo|bar]]</script>
+ //
+ // results in '&lt;script&gt;' and '&lt;/script&gt;'
+ // (not treated as an HTML tag), surrounding a fully
+ // parsed HTML link.
+ //
+ // Concatenate everything from the tag, flattening the contents.
+ result = [ 'CONCAT', input.substring( startOpenTagPos, endOpenTagPos ) ].concat( parsedHtmlContents, input.substring( startCloseTagPos, endCloseTagPos ) );
+ }
+
return result;
}
+
templateName = transform(
// see $wgLegalTitleChars
// not allowing : due to the need to catch "PLURAL:$1"
@@ -525,7 +762,7 @@
closeTemplate = makeStringParser('}}');
nonWhitespaceExpression = choice( [
template,
- link,
+ wikilink,
extLinkParam,
extlink,
replacement,
@@ -533,7 +770,7 @@
] );
paramExpression = choice( [
template,
- link,
+ wikilink,
extLinkParam,
extlink,
replacement,
@@ -542,10 +779,11 @@
expression = choice( [
template,
- link,
+ wikilink,
extLinkParam,
extlink,
replacement,
+ html,
literal
] );
@@ -659,12 +897,12 @@
$.each( nodes, function ( i, node ) {
if ( node instanceof jQuery && node.hasClass( 'mediaWiki_htmlEmitter' ) ) {
$.each( node.contents(), function ( j, childNode ) {
- $span.append( childNode );
+ appendWithoutParsing( $span, childNode );
} );
} else {
// Let jQuery append nodes, arrays of nodes and jQuery objects
// other things (strings, numbers, ..) are appended as text nodes (not as HTML strings)
- $span.append( $.type( node ) === 'object' ? node : document.createTextNode( node ) );
+ appendWithoutParsing( $span, node );
}
} );
return $span;
@@ -704,11 +942,11 @@
*
* @param nodes
*/
- wlink: function ( nodes ) {
+ wikilink: function ( nodes ) {
var page, anchor, url;
page = nodes[0];
- url = mw.util.wikiGetlink( page );
+ url = mw.util.getUrl( page );
// [[Some Page]] or [[Namespace:Some Page]]
if ( nodes.length === 1 ) {
@@ -730,6 +968,36 @@
},
/**
+ * Converts array of HTML element key value pairs to object
+ *
+ * @param {Array} nodes array of consecutive key value pairs, with index 2 * n being a name and 2 * n + 1 the associated value
+ * @return {Object} object mapping attribute name to attribute value
+ */
+ htmlattributes: function ( nodes ) {
+ var i, len, mapping = {};
+ for ( i = 0, len = nodes.length; i < len; i += 2 ) {
+ mapping[nodes[i]] = decodePrimaryHtmlEntities( nodes[i + 1] );
+ }
+ return mapping;
+ },
+
+ /**
+ * Handles an (already-validated) HTML element.
+ *
+ * @param {Array} nodes nodes to process when creating element
+ * @return {jQuery|Array} jQuery node for valid HTML or array for disallowed element
+ */
+ htmlelement: function ( nodes ) {
+ var tagName, attributes, contents, $element;
+
+ tagName = nodes.shift();
+ attributes = nodes.shift();
+ contents = nodes;
+ $element = $( document.createElement( tagName ) ).attr( attributes );
+ return appendWithoutParsing( $element, contents );
+ },
+
+ /**
* Transform parsed structure into external link
* If the href is a jQuery object, treat it as "enclosing" the link text.
* ... function, treat it as the click handler
@@ -738,7 +1006,7 @@
* @param {Array} of two elements, {jQuery|Function|String} and {String}
* @return {jQuery}
*/
- link: function ( nodes ) {
+ extlink: function ( nodes ) {
var $el,
arg = nodes[0],
contents = nodes[1];
@@ -752,12 +1020,11 @@
$el.attr( 'href', arg.toString() );
}
}
- $el.append( contents );
- return $el;
+ return appendWithoutParsing( $el, contents );
},
/**
- * This is basically use a combination of replace + link (link with parameter
+ * This is basically use a combination of replace + external link (link with parameter
* as url), but we don't want to run the regular replace here-on: inserting a
* url as href-attribute of a link will automatically escape it already, so
* we don't want replace to (manually) escape it as well.
@@ -765,7 +1032,7 @@
* @param {Array} of one element, integer, n >= 0
* @return {String} replacement
*/
- linkparam: function ( nodes, replacements ) {
+ extlinkparam: function ( nodes, replacements ) {
var replacement,
index = parseInt( nodes[0], 10 );
if ( index < replacements.length) {
@@ -773,7 +1040,7 @@
} else {
replacement = '$' + ( index + 1 );
}
- return this.link( [ replacement, nodes[1] ] );
+ return this.extlink( [ replacement, nodes[1] ] );
},
/**
@@ -865,7 +1132,7 @@
// Caching is somewhat problematic, because we do need different message functions for different maps, so
// we'd have to cache the parser as a member of this.map, which sounds a bit ugly.
// Do not use mw.jqueryMsg unless required
- if ( this.format === 'plain' || !/\{\{|\[/.test(this.map.get( this.key ) ) ) {
+ if ( this.format === 'plain' || !/\{\{|[\[<>]/.test(this.map.get( this.key ) ) ) {
// Fall back to mw.msg's simple parser
return oldParser.apply( this );
}
diff --git a/resources/mediawiki/mediawiki.js b/resources/mediawiki/mediawiki.js
index ca987543..80223e5d 100644
--- a/resources/mediawiki/mediawiki.js
+++ b/resources/mediawiki/mediawiki.js
@@ -1,5 +1,9 @@
-/*
- * Core MediaWiki JavaScript Library
+/**
+ * Base library for MediaWiki.
+ *
+ * @class mw
+ * @alternateClassName mediaWiki
+ * @singleton
*/
var mw = ( function ( $, undefined ) {
@@ -10,15 +14,67 @@ var mw = ( function ( $, undefined ) {
var hasOwn = Object.prototype.hasOwnProperty,
slice = Array.prototype.slice;
+ /**
+ * Log a message to window.console, if possible. Useful to force logging of some
+ * errors that are otherwise hard to detect (I.e., this logs also in production mode).
+ * Gets console references in each invocation, so that delayed debugging tools work
+ * fine. No need for optimization here, which would only result in losing logs.
+ *
+ * @private
+ * @param {string} msg text for the log entry.
+ * @param {Error} [e]
+ */
+ function log( msg, e ) {
+ var console = window.console;
+ if ( console && console.log ) {
+ console.log( msg );
+ // If we have an exception object, log it through .error() to trigger
+ // proper stacktraces in browsers that support it. There are no (known)
+ // browsers that don't support .error(), that do support .log() and
+ // have useful exception handling through .log().
+ if ( e && console.error ) {
+ console.error( String( e ), e );
+ }
+ }
+ }
+
/* Object constructors */
/**
* Creates an object that can be read from or written to from prototype functions
* that allow both single and multiple variables at once.
+ *
+ * @example
+ *
+ * var addies, wanted, results;
+ *
+ * // Create your address book
+ * addies = new mw.Map();
+ *
+ * // This data could be coming from an external source (eg. API/AJAX)
+ * addies.set( {
+ * 'John Doe' : '10 Wall Street, New York, USA',
+ * 'Jane Jackson' : '21 Oxford St, London, UK',
+ * 'Dominique van Halen' : 'Kalverstraat 7, Amsterdam, NL'
+ * } );
+ *
+ * wanted = ['Dominique van Halen', 'George Johnson', 'Jane Jackson'];
+ *
+ * // You can detect missing keys first
+ * if ( !addies.exists( wanted ) ) {
+ * // One or more are missing (in this case: "George Johnson")
+ * mw.log( 'One or more names were not found in your address book' );
+ * }
+ *
+ * // Or just let it give you what it can
+ * results = addies.get( wanted, 'Middle of Nowhere, Alaska, US' );
+ * mw.log( results['Jane Jackson'] ); // "21 Oxford St, London, UK"
+ * mw.log( results['George Johnson'] ); // "Middle of Nowhere, Alaska, US"
+ *
* @class mw.Map
*
* @constructor
- * @param {boolean} global Whether to store the values in the global window
+ * @param {boolean} [global=false] Whether to store the values in the global window
* object or a exclusively in the object property 'values'.
*/
function Map( global ) {
@@ -32,8 +88,8 @@ var mw = ( function ( $, undefined ) {
*
* If called with no arguments, all values will be returned.
*
- * @param selection mixed String key or array of keys to get values for.
- * @param fallback mixed Value to use in case key(s) do not exist (optional).
+ * @param {string|Array} selection String key or array of keys to get values for.
+ * @param {Mixed} [fallback] Value to use in case key(s) do not exist.
* @return mixed If selection was a string returns the value or null,
* If selection was an array, returns an object of key/values (value is null if not found),
* If selection was not passed or invalid, will return the 'values' object member (be careful as
@@ -73,8 +129,8 @@ var mw = ( function ( $, undefined ) {
/**
* Sets one or multiple key/value pairs.
*
- * @param selection {mixed} String key or array of keys to set values for.
- * @param value {mixed} Value to set (optional, only in use when key is a string)
+ * @param {string|Object} selection String key to set value for, or object mapping keys to values.
+ * @param {Mixed} [value] Value to set (optional, only in use when key is a string)
* @return {Boolean} This returns true on success, false on failure.
*/
set: function ( selection, value ) {
@@ -96,7 +152,7 @@ var mw = ( function ( $, undefined ) {
/**
* Checks if one or multiple keys exist.
*
- * @param selection {mixed} String key or array of keys to check
+ * @param {Mixed} selection String key or array of keys to check
* @return {boolean} Existence of key(s)
*/
exists: function ( selection ) {
@@ -115,8 +171,12 @@ var mw = ( function ( $, undefined ) {
};
/**
- * Object constructor for messages,
- * similar to the Message class in MediaWiki PHP.
+ * Object constructor for messages.
+ *
+ * Similar to the Message class in MediaWiki PHP.
+ *
+ * Format defaults to 'text'.
+ *
* @class mw.Message
*
* @constructor
@@ -134,8 +194,7 @@ var mw = ( function ( $, undefined ) {
Message.prototype = {
/**
- * Simple message parser, does $N replacement, HTML-escaping (only for
- * 'escaped' format), and nothing else.
+ * Simple message parser, does $N replacement and nothing else.
*
* This may be overridden to provide a more complex message parser.
*
@@ -259,19 +318,21 @@ var mw = ( function ( $, undefined ) {
}
};
- /**
- * @class mw
- * @alternateClassName mediaWiki
- * @singleton
- */
return {
/* Public Members */
/**
- * Dummy function which in debug mode can be replaced with a function that
- * emulates console.log in console-less environments.
+ * Dummy placeholder for {@link mw.log}
+ * @method
*/
- log: function () { },
+ log: ( function () {
+ var log = function () {};
+ log.warn = function () {};
+ log.deprecate = function ( obj, key, val ) {
+ obj[key] = val;
+ };
+ return log;
+ }() ),
// Make the Map constructor publicly available.
Map: Map,
@@ -280,13 +341,17 @@ var mw = ( function ( $, undefined ) {
Message: Message,
/**
- * List of configuration values
+ * Map of configuration values
*
- * Dummy placeholder. Initiated in startUp module as a new instance of mw.Map().
- * If `$wgLegacyJavaScriptGlobals` is true, this Map will have its values
- * in the global window object.
- * @property
+ * Check out [the complete list of configuration values](https://www.mediawiki.org/wiki/Manual:Interface/JavaScript#mw.config)
+ * on MediaWiki.org.
+ *
+ * If `$wgLegacyJavaScriptGlobals` is true, this Map will put its values in the
+ * global window object.
+ *
+ * @property {mw.Map} config
*/
+ // Dummy placeholder. Re-assigned in ResourceLoaderStartupModule with an instance of `mw.Map`.
config: null,
/**
@@ -295,9 +360,15 @@ var mw = ( function ( $, undefined ) {
*/
libs: {},
- /* Extension points */
-
/**
+ * Access container for deprecated functionality that can be moved from
+ * from their legacy location and attached to this object (e.g. a global
+ * function that is deprecated and as stop-gap can be exposed through here).
+ *
+ * This was reserved for future use but never ended up being used.
+ *
+ * @deprecated since 1.22: Let deprecated identifiers keep their original name
+ * and use mw.log#deprecate to create an access container for tracking.
* @property
*/
legacy: {},
@@ -311,7 +382,9 @@ var mw = ( function ( $, undefined ) {
/* Public Methods */
/**
- * Gets a message object, similar to wfMessage().
+ * Get a message object.
+ *
+ * Similar to wfMessage() in MediaWiki PHP.
*
* @param {string} key Key of message to get
* @param {Mixed...} parameters Parameters for the $N replacements in messages.
@@ -324,14 +397,16 @@ var mw = ( function ( $, undefined ) {
},
/**
- * Gets a message string, similar to wfMessage()
+ * Get a message string using 'text' format.
+ *
+ * Similar to wfMsg() in MediaWiki PHP.
*
- * @see mw.Message#toString
+ * @see mw.Message
* @param {string} key Key of message to get
* @param {Mixed...} parameters Parameters for the $N replacements in messages.
* @return {string}
*/
- msg: function ( /* key, parameters... */ ) {
+ msg: function () {
return mw.message.apply( mw.message, arguments ).toString();
},
@@ -420,11 +495,11 @@ var mw = ( function ( $, undefined ) {
*
* @private
* @param {string} text CSS text
- * @param {Mixed} [nextnode] An Element or jQuery object for an element where
- * the style tag should be inserted before. Otherwise appended to the `<head>`.
- * @return {HTMLElement} Node reference to the created `<style>` tag.
+ * @param {HTMLElement|jQuery} [nextnode=document.head] The element where the style tag should be
+ * inserted before. Otherwise it will be appended to `<head>`.
+ * @return {HTMLElement} Reference to the created `<style>` element.
*/
- function addStyleTag( text, nextnode ) {
+ function newStyleTag( text, nextnode ) {
var s = document.createElement( 'style' );
// Insert into document before setting cssText (bug 33305)
if ( nextnode ) {
@@ -457,7 +532,7 @@ var mw = ( function ( $, undefined ) {
/**
* Checks whether it is safe to add this css to a stylesheet.
- *
+ *
* @private
* @param {string} cssText
* @return {boolean} False if a new one must be created.
@@ -470,8 +545,13 @@ var mw = ( function ( $, undefined ) {
}
/**
+ * Add a bit of CSS text to the current browser page.
+ *
+ * The CSS will be appended to an existing ResourceLoader-created `<style>` tag
+ * or create a new one based on whether the given `cssText` is safe for extension.
+ *
* @param {string} [cssText=cssBuffer] If called without cssText,
- * the internal buffer will be inserted instead.
+ * the internal buffer will be inserted instead.
* @param {Function} [callback]
*/
function addEmbeddedCSS( cssText, callback ) {
@@ -533,7 +613,7 @@ var mw = ( function ( $, undefined ) {
try {
styleEl.styleSheet.cssText += cssText; // IE
} catch ( e ) {
- log( 'addEmbeddedCSS fail\ne.message: ' + e.message, e );
+ log( 'addEmbeddedCSS fail', e );
}
} else {
styleEl.appendChild( document.createTextNode( String( cssText ) ) );
@@ -543,7 +623,7 @@ var mw = ( function ( $, undefined ) {
}
}
- $( addStyleTag( cssText, getMarker() ) ).data( 'ResourceLoaderDynamicStyleTag', true );
+ $( newStyleTag( cssText, getMarker() ) ).data( 'ResourceLoaderDynamicStyleTag', true );
cssCallbacks.fire().empty();
}
@@ -659,7 +739,7 @@ var mw = ( function ( $, undefined ) {
*
* @private
* @param {string|string[]} states Module states to filter by
- * @param {Array} modules List of module names to filter (optional, by default the entire
+ * @param {Array} [modules] List of module names to filter (optional, by default the entire
* registry is used)
* @return {Array} List of filtered module names
*/
@@ -712,30 +792,6 @@ var mw = ( function ( $, undefined ) {
}
/**
- * Log a message to window.console, if possible. Useful to force logging of some
- * errors that are otherwise hard to detect (I.e., this logs also in production mode).
- * Gets console references in each invocation, so that delayed debugging tools work
- * fine. No need for optimization here, which would only result in losing logs.
- *
- * @private
- * @param {string} msg text for the log entry.
- * @param {Error} [e]
- */
- function log( msg, e ) {
- var console = window.console;
- if ( console && console.log ) {
- console.log( msg );
- // If we have an exception object, log it through .error() to trigger
- // proper stacktraces in browsers that support it. There are no (known)
- // browsers that don't support .error(), that do support .log() and
- // have useful exception handling through .log().
- if ( e && console.error ) {
- console.error( e );
- }
- }
- }
-
- /**
* A module has entered state 'ready', 'error', or 'missing'. Automatically update pending jobs
* and modules that depend upon this module. if the given module failed, propagate the 'error'
* state up the dependency tree; otherwise, execute all jobs/modules that now have all their
@@ -775,22 +831,18 @@ var mw = ( function ( $, undefined ) {
j -= 1;
try {
if ( hasErrors ) {
- throw new Error( 'Module ' + module + ' failed.');
+ if ( $.isFunction( job.error ) ) {
+ job.error( new Error( 'Module ' + module + ' has failed dependencies' ), [module] );
+ }
} else {
if ( $.isFunction( job.ready ) ) {
job.ready();
}
}
} catch ( e ) {
- if ( $.isFunction( job.error ) ) {
- try {
- job.error( e, [module] );
- } catch ( ex ) {
- // A user-defined operation raised an exception. Swallow to protect
- // our state machine!
- log( 'Exception thrown by job.error()', ex );
- }
- }
+ // A user-defined callback raised an exception.
+ // Swallow it to protect our state machine!
+ log( 'Exception thrown by job.error', e );
}
}
}
@@ -816,8 +868,7 @@ var mw = ( function ( $, undefined ) {
*/
function addScript( src, callback, async ) {
/*jshint evil:true */
- var script, head,
- done = false;
+ var script, head, done;
// Using isReady directly instead of storing it locally from
// a $.fn.ready callback (bug 31895).
@@ -829,6 +880,7 @@ var mw = ( function ( $, undefined ) {
// IE-safe way of getting the <head>. document.head isn't supported
// in old IE, and doesn't work when in the <head>.
+ done = false;
head = document.getElementsByTagName( 'head' )[0] || document.body;
script = document.createElement( 'script' );
@@ -848,12 +900,12 @@ var mw = ( function ( $, undefined ) {
// Handle memory leak in IE
script.onload = script.onreadystatechange = null;
- // Remove the script
+ // Detach the element from the document
if ( script.parentNode ) {
script.parentNode.removeChild( script );
}
- // Dereference the script
+ // Dereference the element from javascript
script = undefined;
callback();
@@ -950,7 +1002,7 @@ var mw = ( function ( $, undefined ) {
} catch ( e ) {
// This needs to NOT use mw.log because these errors are common in production mode
// and not in debug mode, such as when a symbol that should be global isn't exported
- log( 'Exception thrown by ' + module + ': ' + e.message, e );
+ log( 'Exception thrown by ' + module, e );
registry[module].state = 'error';
handlePending( module );
}
@@ -967,30 +1019,37 @@ var mw = ( function ( $, undefined ) {
mw.messages.set( registry[module].messages );
}
- // Make sure we don't run the scripts until all (potentially asynchronous)
- // stylesheet insertions have completed.
- ( function () {
- var pending = 0;
- checkCssHandles = function () {
- // cssHandlesRegistered ensures we don't take off too soon, e.g. when
- // one of the cssHandles is fired while we're still creating more handles.
- if ( cssHandlesRegistered && pending === 0 && runScript ) {
- runScript();
- runScript = undefined; // Revoke
- }
- };
- cssHandle = function () {
- var check = checkCssHandles;
- pending++;
- return function () {
- if (check) {
- pending--;
- check();
- check = undefined; // Revoke
+ if ( $.isReady || registry[module].async ) {
+ // Make sure we don't run the scripts until all (potentially asynchronous)
+ // stylesheet insertions have completed.
+ ( function () {
+ var pending = 0;
+ checkCssHandles = function () {
+ // cssHandlesRegistered ensures we don't take off too soon, e.g. when
+ // one of the cssHandles is fired while we're still creating more handles.
+ if ( cssHandlesRegistered && pending === 0 && runScript ) {
+ runScript();
+ runScript = undefined; // Revoke
}
};
- };
- }() );
+ cssHandle = function () {
+ var check = checkCssHandles;
+ pending++;
+ return function () {
+ if (check) {
+ pending--;
+ check();
+ check = undefined; // Revoke
+ }
+ };
+ };
+ }() );
+ } else {
+ // We are in blocking mode, and so we can't afford to wait for CSS
+ cssHandle = function () {};
+ // Run immediately
+ checkCssHandles = runScript;
+ }
// Process styles (see also mw.loader.implement)
// * back-compat: { <media>: css }
@@ -1131,7 +1190,7 @@ var mw = ( function ( $, undefined ) {
* @param {Object} moduleMap Module map, see #buildModulesString
* @param {Object} currReqBase Object with other parameters (other than 'modules') to use in the request
* @param {string} sourceLoadScript URL of load.php
- * @param {boolean} async If true, use an asynchrounous request even if document ready has not yet occurred
+ * @param {boolean} async If true, use an asynchronous request even if document ready has not yet occurred
*/
function doRequest( moduleMap, currReqBase, sourceLoadScript, async ) {
var request = $.extend(
@@ -1146,10 +1205,24 @@ var mw = ( function ( $, undefined ) {
/* Public Methods */
return {
- addStyleTag: addStyleTag,
+ /**
+ * The module registry is exposed as an aid for debugging and inspecting page
+ * state; it is not a public interface for modifying the registry.
+ *
+ * @see #registry
+ * @property
+ * @private
+ */
+ moduleRegistry: registry,
/**
- * Requests dependencies from server, loading and executing when things when ready.
+ * @inheritdoc #newStyleTag
+ * @method
+ */
+ addStyleTag: newStyleTag,
+
+ /**
+ * Batch-request queued dependencies from the server.
*/
work: function () {
var reqBase, splits, maxQueryLength, q, b, bSource, bGroup, bSourceGroup,
@@ -1311,15 +1384,15 @@ var mw = ( function ( $, undefined ) {
},
/**
- * Registers a module, letting the system know about it and its
+ * Register a module, letting the system know about it and its
* properties. Startup modules contain calls to this function.
*
- * @param module {String}: Module name
- * @param version {Number}: Module version number as a timestamp (falls backs to 0)
- * @param dependencies {String|Array|Function}: One string or array of strings of module
+ * @param {string} module Module name
+ * @param {number} version Module version number as a timestamp (falls backs to 0)
+ * @param {string|Array|Function} dependencies One string or array of strings of module
* names on which this module depends, or a function that returns that array.
- * @param group {String}: Group which the module is in (optional, defaults to null)
- * @param source {String}: Name of the source. Defaults to local.
+ * @param {string} [group=null] Group which the module is in
+ * @param {string} [source='local'] Name of the source
*/
register: function ( module, version, dependencies, group, source ) {
var m;
@@ -1362,9 +1435,10 @@ var mw = ( function ( $, undefined ) {
},
/**
- * 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.
+ * Implement a module given the components that make up the module.
+ *
+ * When #load or #using requests one or more modules, the server
+ * response contain calls to this function.
*
* All arguments are required.
*
@@ -1419,12 +1493,12 @@ var mw = ( function ( $, undefined ) {
},
/**
- * Executes a function as soon as one or more required modules are ready
+ * Execute a function as soon as one or more required modules are ready.
*
- * @param dependencies {String|Array} Module name or array of modules names the callback
+ * @param {string|Array} dependencies Module name or array of modules names the callback
* dependends on 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)
+ * @param {Function} [ready] callback to execute when all dependencies are ready
+ * @param {Function} [error] callback to execute when if dependencies have a errors
*/
using: function ( dependencies, ready, error ) {
var tod = typeof dependencies;
@@ -1456,17 +1530,17 @@ var mw = ( function ( $, undefined ) {
},
/**
- * Loads an external script or one or more modules for future use
+ * Load an external script or one or more modules.
*
- * @param modules {mixed} Either the name of a module, array of modules,
+ * @param {string|Array} modules 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
+ * @param {string} [type='text/javascript'] 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.
- * @param async {Boolean} (optional) If true, load modules asynchronously
- * even if document ready has not yet occurred. If false (default),
- * block before document ready and load async after. If not set, true will
- * be assumed if loading a URL, and false will be assumed otherwise.
+ * @param {boolean} [async] If true, load modules asynchronously
+ * even if document ready has not yet occurred. If false, block before
+ * document ready and load async after. If not set, true will be
+ * assumed if loading a URL, and false will be assumed otherwise.
*/
load: function ( modules, type, async ) {
var filtered, m, module, l;
@@ -1536,10 +1610,10 @@ var mw = ( function ( $, undefined ) {
},
/**
- * Changes the state of a module
+ * Change the state of one or more modules.
*
- * @param module {String|Object} module name or object of module name/state pairs
- * @param state {String} state name
+ * @param {string|Object} module module name or object of module name/state pairs
+ * @param {string} state state name
*/
state: function ( module, state ) {
var m;
@@ -1565,9 +1639,9 @@ var mw = ( function ( $, undefined ) {
},
/**
- * Gets the version of a module
+ * Get the version of a module.
*
- * @param module string name of module to get version for
+ * @param {string} module Name of module to get version for
*/
getVersion: function ( module ) {
if ( registry[module] !== undefined && registry[module].version !== undefined ) {
@@ -1577,16 +1651,17 @@ var mw = ( function ( $, undefined ) {
},
/**
- * @deprecated since 1.18 use mw.loader.getVersion() instead
+ * @inheritdoc #getVersion
+ * @deprecated since 1.18 use #getVersion instead
*/
version: function () {
return mw.loader.getVersion.apply( mw.loader, arguments );
},
/**
- * Gets the state of a module
+ * Get the state of a module.
*
- * @param module string name of module to get state for
+ * @param {string} module name of module to get state for
*/
getState: function ( module ) {
if ( registry[module] !== undefined && registry[module].state !== undefined ) {
@@ -1607,16 +1682,45 @@ var mw = ( function ( $, undefined ) {
},
/**
- * For backwards-compatibility with Squid-cached pages. Loads mw.user
+ * Load the `mediawiki.user` module.
+ *
+ * For backwards-compatibility with cached pages from before 2013 where:
+ *
+ * - the `mediawiki.user` module didn't exist yet
+ * - `mw.user` was still part of mediawiki.js
+ * - `mw.loader.go` still existed and called after `mw.loader.load()`
*/
go: function () {
mw.loader.load( 'mediawiki.user' );
+ },
+
+ /**
+ * @inheritdoc mw.inspect#runReports
+ * @method
+ */
+ inspect: function () {
+ var args = slice.call( arguments );
+ mw.loader.using( 'mediawiki.inspect', function () {
+ mw.inspect.runReports.apply( mw.inspect, args );
+ } );
}
+
};
}() ),
/**
* HTML construction helper functions
+ *
+ * @example
+ *
+ * var Html, output;
+ *
+ * Html = mw.html;
+ * output = Html.element( 'div', {}, new Html.Raw(
+ * Html.element( 'img', { src: '<' } )
+ * ) );
+ * mw.log( output ); // <div><img src="&lt;"/></div>
+ *
* @class mw.html
* @singleton
*/
@@ -1646,39 +1750,17 @@ var mw = ( function ( $, undefined ) {
},
/**
- * Wrapper object for raw HTML passed to mw.html.element().
- * @class mw.html.Raw
- */
- Raw: function ( value ) {
- this.value = value;
- },
-
- /**
- * Wrapper object for CDATA element contents passed to mw.html.element()
- * @class mw.html.Cdata
- */
- 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:
+ * @param {string} name The tag name.
+ * @param {Object} attrs An object with members mapping element names to values
+ * @param {Mixed} 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 = mw.html;
- * return h.element( 'div', {},
- * new h.Raw( h.element( 'img', {src: '<'} ) ) );
- * Returns <div><img src="&lt;"/></div>
*/
element: function ( name, attrs, contents ) {
var v, attrName, s = '<' + name;
@@ -1727,6 +1809,22 @@ var mw = ( function ( $, undefined ) {
}
s += '</' + name + '>';
return s;
+ },
+
+ /**
+ * Wrapper object for raw HTML passed to mw.html.element().
+ * @class mw.html.Raw
+ */
+ Raw: function ( value ) {
+ this.value = value;
+ },
+
+ /**
+ * Wrapper object for CDATA element contents passed to mw.html.element()
+ * @class mw.html.Cdata
+ */
+ Cdata: function ( value ) {
+ this.value = value;
}
};
}() ),
@@ -1735,7 +1833,87 @@ var mw = ( function ( $, undefined ) {
user: {
options: new Map(),
tokens: new Map()
- }
+ },
+
+ /**
+ * Registry and firing of events.
+ *
+ * MediaWiki has various interface components that are extended, enhanced
+ * or manipulated in some other way by extensions, gadgets and even
+ * in core itself.
+ *
+ * This framework helps streamlining the timing of when these other
+ * code paths fire their plugins (instead of using document-ready,
+ * which can and should be limited to firing only once).
+ *
+ * Features like navigating to other wiki pages, previewing an edit
+ * and editing itself – without a refresh – can then retrigger these
+ * hooks accordingly to ensure everything still works as expected.
+ *
+ * Example usage:
+ *
+ * mw.hook( 'wikipage.content' ).add( fn ).remove( fn );
+ * mw.hook( 'wikipage.content' ).fire( $content );
+ *
+ * Handlers can be added and fired for arbitrary event names at any time. The same
+ * event can be fired multiple times. The last run of an event is memorized
+ * (similar to `$(document).ready` and `$.Deferred().done`).
+ * This means if an event is fired, and a handler added afterwards, the added
+ * function will be fired right away with the last given event data.
+ *
+ * Like Deferreds and Promises, the mw.hook object is both detachable and chainable.
+ * Thus allowing flexible use and optimal maintainability and authority control.
+ * You can pass around the `add` and/or `fire` method to another piece of code
+ * without it having to know the event name (or `mw.hook` for that matter).
+ *
+ * var h = mw.hook( 'bar.ready' );
+ * new mw.Foo( .. ).fetch( { callback: h.fire } );
+ *
+ * Note: Events are documented with an underscore instead of a dot in the event
+ * name due to jsduck not supporting dots in that position.
+ *
+ * @class mw.hook
+ */
+ hook: ( function () {
+ var lists = {};
+
+ /**
+ * Create an instance of mw.hook.
+ *
+ * @method hook
+ * @member mw
+ * @param {string} name Name of hook.
+ * @return {mw.hook}
+ */
+ return function ( name ) {
+ var list = lists[name] || ( lists[name] = $.Callbacks( 'memory' ) );
+
+ return {
+ /**
+ * Register a hook handler
+ * @param {Function...} handler Function to bind.
+ * @chainable
+ */
+ add: list.add,
+
+ /**
+ * Unregister a hook handler
+ * @param {Function...} handler Function to unbind.
+ * @chainable
+ */
+ remove: list.remove,
+
+ /**
+ * Run a hook.
+ * @param {Mixed...} data
+ * @chainable
+ */
+ fire: function () {
+ return list.fireWith( null, slice.call( arguments ) );
+ }
+ };
+ };
+ }() )
};
}( jQuery ) );
diff --git a/resources/mediawiki/mediawiki.log.js b/resources/mediawiki/mediawiki.log.js
index ee08b12b..75e4c961 100644
--- a/resources/mediawiki/mediawiki.log.js
+++ b/resources/mediawiki/mediawiki.log.js
@@ -1,4 +1,4 @@
-/**
+/*!
* Logger for MediaWiki javascript.
* Implements the stub left by the main 'mediawiki' module.
*
@@ -9,15 +9,20 @@
( function ( mw, $ ) {
/**
+ * @class mw.log
+ * @singleton
+ */
+
+ /**
* Logs a message to the console.
*
* In the case the browser does not have a console API, a console is created on-the-fly by appending
- * a <div id="mw-log-console"> element to the bottom of the body and then appending this and future
+ * a `<div id="mw-log-console">` element to the bottom of the body and then appending this and future
* messages to that, instead of the console.
*
- * @param {String} First in list of variadic messages to output to console.
+ * @param {string...} msg Messages to output to console.
*/
- mw.log = function ( /* logmsg, logmsg, */ ) {
+ mw.log = function () {
// Turn arguments into an array
var args = Array.prototype.slice.call( arguments ),
// Allow log messages to use a configured prefix to identify the source window (ie. frame)
@@ -54,7 +59,7 @@
hovzer.update();
}
$log.append(
- $( '<div></div>' )
+ $( '<div>' )
.css( {
borderBottom: 'solid 1px #DDDDDD',
fontSize: 'small',
@@ -68,4 +73,54 @@
} );
};
+ /**
+ * Write a message the console's warning channel.
+ * Also logs a stacktrace for easier debugging.
+ * Each action is silently ignored if the browser doesn't support it.
+ *
+ * @param {string...} msg Messages to output to console
+ */
+ mw.log.warn = function () {
+ var console = window.console;
+ if ( console && console.warn ) {
+ console.warn.apply( console, arguments );
+ if ( console.trace ) {
+ console.trace();
+ }
+ }
+ };
+
+ /**
+ * Create a property in a host object that, when accessed, will produce
+ * a deprecation warning in the console with backtrace.
+ *
+ * @param {Object} obj Host object of deprecated property
+ * @param {string} key Name of property to create in `obj`
+ * @param {Mixed} val The value this property should return when accessed
+ * @param {string} [msg] Optional text to include in the deprecation message.
+ */
+ mw.log.deprecate = !Object.defineProperty ? function ( obj, key, val ) {
+ obj[key] = val;
+ } : function ( obj, key, val, msg ) {
+ msg = 'MWDeprecationWarning: Use of "' + key + '" property is deprecated.' +
+ ( msg ? ( ' ' + msg ) : '' );
+ try {
+ Object.defineProperty( obj, key, {
+ configurable: true,
+ enumerable: true,
+ get: function () {
+ mw.log.warn( msg );
+ return val;
+ },
+ set: function ( newVal ) {
+ mw.log.warn( msg );
+ val = newVal;
+ }
+ } );
+ } catch ( err ) {
+ // IE8 can throw on Object.defineProperty
+ obj[key] = val;
+ }
+ };
+
}( mediaWiki, jQuery ) );
diff --git a/resources/mediawiki/mediawiki.notification.css b/resources/mediawiki/mediawiki.notification.css
index 9a7b651d..3aa358ac 100644
--- a/resources/mediawiki/mediawiki.notification.css
+++ b/resources/mediawiki/mediawiki.notification.css
@@ -2,15 +2,25 @@
* Stylesheet for mediawiki.notification module
*/
-#mw-notification-area {
+.mw-notification-area {
position: absolute;
- top: 1em;
- right: 1em;
+ top: 0;
+ right: 0;
+ padding: 1em 1em 0 0;
width: 20em;
line-height: 1.35;
z-index: 10000;
}
+.mw-notification-area-floating {
+ position: fixed;
+}
+
+* html .mw-notification-area-floating {
+ /* Make it at least 'absolute' in IE6 since 'fixed' is not supported */
+ position: absolute;
+}
+
.mw-notification {
padding: 0.25em 1em;
margin-bottom: 0.5em;
diff --git a/resources/mediawiki/mediawiki.notification.js b/resources/mediawiki/mediawiki.notification.js
index fd34e7ee..4ede8096 100644
--- a/resources/mediawiki/mediawiki.notification.js
+++ b/resources/mediawiki/mediawiki.notification.js
@@ -2,10 +2,10 @@
'use strict';
var notification,
- isPageReady = false,
- preReadyNotifQueue = [],
// The #mw-notification-area div that all notifications are contained inside.
- $area = null;
+ $area,
+ isPageReady = false,
+ preReadyNotifQueue = [];
/**
* Creates a Notification object for 1 message.
@@ -350,7 +350,9 @@
* @ignore
*/
function init() {
- $area = $( '<div id="mw-notification-area"></div>' )
+ var offset, $window = $( window );
+
+ $area = $( '<div id="mw-notification-area" class="mw-notification-area mw-notification-area-layout"></div>' )
// Pause auto-hide timers when the mouse is in the notification area.
.on( {
mouseenter: notification.pause,
@@ -371,6 +373,19 @@
// Prepend the notification area to the content area and save it's object.
mw.util.$content.prepend( $area );
+ offset = $area.offset();
+
+ function updateAreaMode() {
+ var isFloating = $window.scrollTop() > offset.top;
+ $area
+ .toggleClass( 'mw-notification-area-floating', isFloating )
+ .toggleClass( 'mw-notification-area-layout', !isFloating );
+ }
+
+ $window.on( 'scroll', updateAreaMode );
+
+ // Initial mode
+ updateAreaMode();
}
/**
@@ -411,6 +426,7 @@
* @param {HTMLElement|jQuery|mw.Message|string} message
* @param {Object} options The options to use for the notification.
* See #defaults for details.
+ * @return {Object} Object with a close function to close the notification
*/
notify: function ( message, options ) {
var notif;
@@ -423,6 +439,7 @@
} else {
preReadyNotifQueue.push( notif );
}
+ return { close: $.proxy( notif.close, notif ) };
},
/**
diff --git a/resources/mediawiki/mediawiki.notify.js b/resources/mediawiki/mediawiki.notify.js
index 83d95b61..743d6517 100644
--- a/resources/mediawiki/mediawiki.notify.js
+++ b/resources/mediawiki/mediawiki.notify.js
@@ -1,22 +1,23 @@
/**
* @class mw.plugin.notify
*/
-( function ( mw ) {
+( function ( mw, $ ) {
'use strict';
/**
* @see mw.notification#notify
* @param message
* @param options
+ * @return {jQuery.Promise}
*/
mw.notify = function ( message, options ) {
+ var d = $.Deferred();
// Don't bother loading the whole notification system if we never use it.
mw.loader.using( 'mediawiki.notification', function () {
- // Don't bother calling mw.loader.using a second time after we've already loaded mw.notification.
- mw.notify = mw.notification.notify;
// Call notify with the notification the user requested of us.
- mw.notify( message, options );
- } );
+ d.resolve( mw.notification.notify( message, options ) );
+ }, d.reject );
+ return d.promise();
};
/**
@@ -24,4 +25,4 @@
* @mixins mw.plugin.notify
*/
-}( mediaWiki ) );
+}( mediaWiki, jQuery ) );
diff --git a/resources/mediawiki/mediawiki.searchSuggest.js b/resources/mediawiki/mediawiki.searchSuggest.js
index 2bc7cea9..7f078626 100644
--- a/resources/mediawiki/mediawiki.searchSuggest.js
+++ b/resources/mediawiki/mediawiki.searchSuggest.js
@@ -2,7 +2,7 @@
* Add search suggestions to the search form.
*/
( function ( mw, $ ) {
- $( document ).ready( function ( $ ) {
+ $( function () {
var map, resultRenderCache, searchboxesSelectors,
// Region where the suggestions box will appear directly below
// (using the same width). Can be a container element or the input
@@ -130,8 +130,6 @@
searchboxesSelectors = [
// Primary searchbox on every page in standard skins
'#searchInput',
- // Secondary searchbox in legacy skins (LegacyTemplate::searchForm uses id "searchInput + unique id")
- '#searchInput2',
// Special:Search
'#powerSearchText',
'#searchText',
@@ -141,36 +139,27 @@
$( searchboxesSelectors.join(', ') )
.suggestions( {
fetch: function ( query ) {
- var $el, jqXhr;
+ var $el;
if ( query.length !== 0 ) {
- $el = $(this);
- jqXhr = $.ajax( {
- url: mw.util.wikiScript( 'api' ),
- data: {
- format: 'json',
- action: 'opensearch',
- search: query,
- namespace: 0,
- suggest: ''
- },
- dataType: 'json',
- success: function ( data ) {
- if ( $.isArray( data ) && data.length ) {
- $el.suggestions( 'suggestions', data[1] );
- }
- }
- });
- $el.data( 'request', jqXhr );
+ $el = $( this );
+ $el.data( 'request', ( new mw.Api() ).get( {
+ action: 'opensearch',
+ search: query,
+ namespace: 0,
+ suggest: ''
+ } ).done( function ( data ) {
+ $el.suggestions( 'suggestions', data[1] );
+ } ) );
}
},
cancel: function () {
- var jqXhr = $(this).data( 'request' );
+ var apiPromise = $( this ).data( 'request' );
// If the delay setting has caused the fetch to have not even happened
- // yet, the jqXHR object will have never been set.
- if ( jqXhr && $.isFunction( jqXhr.abort ) ) {
- jqXhr.abort();
- $(this).removeData( 'request' );
+ // yet, the apiPromise object will have never been set.
+ if ( apiPromise && $.isFunction( apiPromise.abort ) ) {
+ apiPromise.abort();
+ $( this ).removeData( 'request' );
}
},
result: {
@@ -196,11 +185,6 @@
return;
}
- // Placeholder text for search box
- $searchInput
- .attr( 'placeholder', mw.msg( 'searchsuggest-search' ) )
- .placeholder();
-
// Special suggestions functionality for skin-provided search box
$searchInput.suggestions( {
result: {
diff --git a/resources/mediawiki/mediawiki.user.js b/resources/mediawiki/mediawiki.user.js
index e0329597..3e375fb6 100644
--- a/resources/mediawiki/mediawiki.user.js
+++ b/resources/mediawiki/mediawiki.user.js
@@ -1,67 +1,60 @@
-/*
- * Implementation for mediaWiki.user
+/**
+ * @class mw.user
+ * @singleton
*/
-
( function ( mw, $ ) {
+ var user,
+ callbacks = {},
+ // Extend the skeleton mw.user from mediawiki.js
+ // This is kind of ugly but we're stuck with this for b/c reasons
+ options = mw.user.options || new mw.Map(),
+ tokens = mw.user.tokens || new mw.Map();
/**
- * User object
+ * Get the current user's groups or rights
+ *
+ * @private
+ * @param {string} info One of 'groups' or 'rights'
+ * @param {Function} callback
*/
- function User( options, tokens ) {
- var user, callbacks;
-
- /* Private Members */
-
- user = this;
- callbacks = {};
-
- /**
- * Gets the current user's groups or rights.
- * @param {String} info: One of 'groups' or 'rights'.
- * @param {Function} callback
- */
- function getUserInfo( info, callback ) {
- var api;
- if ( callbacks[info] ) {
- callbacks[info].add( callback );
- return;
- }
- callbacks.rights = $.Callbacks('once memory');
- callbacks.groups = $.Callbacks('once memory');
+ function getUserInfo( info, callback ) {
+ var api;
+ if ( callbacks[info] ) {
callbacks[info].add( callback );
- api = new mw.Api();
- api.get( {
- action: 'query',
- meta: 'userinfo',
- uiprop: 'rights|groups'
- } ).always( function ( data ) {
- var rights, groups;
- if ( data.query && data.query.userinfo ) {
- rights = data.query.userinfo.rights;
- groups = data.query.userinfo.groups;
- }
- callbacks.rights.fire( rights || [] );
- callbacks.groups.fire( groups || [] );
- } );
+ return;
}
+ callbacks.rights = $.Callbacks('once memory');
+ callbacks.groups = $.Callbacks('once memory');
+ callbacks[info].add( callback );
+ api = new mw.Api();
+ api.get( {
+ action: 'query',
+ meta: 'userinfo',
+ uiprop: 'rights|groups'
+ } ).always( function ( data ) {
+ var rights, groups;
+ if ( data.query && data.query.userinfo ) {
+ rights = data.query.userinfo.rights;
+ groups = data.query.userinfo.groups;
+ }
+ callbacks.rights.fire( rights || [] );
+ callbacks.groups.fire( groups || [] );
+ } );
+ }
- /* Public Members */
-
- this.options = options || new mw.Map();
-
- this.tokens = tokens || new mw.Map();
-
- /* Public Methods */
+ mw.user = user = {
+ options: options,
+ tokens: tokens,
/**
- * Generates a random user session ID (32 alpha-numeric characters).
+ * Generate 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. Its uniqueness should not be depended on.
*
- * @return String: Random set of 32 alpha-numeric characters
+ * @return {string} Random set of 32 alpha-numeric characters
*/
- this.generateRandomSessionId = function () {
+ generateRandomSessionId: function () {
var i, r,
id = '',
seed = '0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz';
@@ -70,33 +63,45 @@
id += seed.substring( r, r + 1 );
}
return id;
- };
+ },
+
+ /**
+ * Get the current user's database id
+ *
+ * Not to be confused with #id.
+ *
+ * @return {number} Current user's id, or 0 if user is anonymous
+ */
+ getId: function () {
+ return mw.config.get( 'wgUserId', 0 );
+ },
/**
- * Gets the current user's name.
+ * Get the current user's name
*
- * @return Mixed: User name string or null if users is anonymous
+ * @return {string|null} User name string or null if user is anonymous
*/
- this.getName = function () {
+ getName: function () {
return mw.config.get( 'wgUserName' );
- };
+ },
/**
- * @deprecated since 1.20 use mw.user.getName() instead
+ * @inheritdoc #getName
+ * @deprecated since 1.20 use #getName instead
*/
- this.name = function () {
- return this.getName();
- };
+ name: function () {
+ return user.getName();
+ },
/**
- * Get date user registered, if available.
+ * Get date user registered, if available
*
- * @return {Date|false|null} date user registered, or false for anonymous users, or
+ * @return {Date|boolean|null} Date user registered, or false for anonymous users, or
* null when data is not available
*/
- this.getRegistration = function () {
+ getRegistration: function () {
var registration = mw.config.get( 'wgUserRegistration' );
- if ( this.isAnon() ) {
+ if ( user.isAnon() ) {
return false;
} else if ( registration === null ) {
// Information may not be available if they signed up before
@@ -105,110 +110,109 @@
} else {
return new Date( registration );
}
- };
+ },
/**
- * Checks if the current user is anonymous.
+ * Whether the current user is anonymous
*
- * @return Boolean
+ * @return {boolean}
*/
- this.isAnon = function () {
+ isAnon: function () {
return user.getName() === null;
- };
+ },
/**
- * @deprecated since 1.20 use mw.user.isAnon() instead
+ * @inheritdoc #isAnon
+ * @deprecated since 1.20 use #isAnon instead
*/
- this.anonymous = function () {
+ anonymous: function () {
return user.isAnon();
- };
+ },
/**
- * Gets a random session ID automatically generated and kept in a cookie.
+ * Get an automatically generated random ID (stored in a session cookie)
*
* This ID is ephemeral for everyone, staying in their browser only until they close
* their browser.
*
- * @return String: User name or random session ID
+ * @return {string} Random session ID
*/
- this.sessionId = function () {
+ sessionId: function () {
var sessionId = $.cookie( 'mediaWiki.user.sessionId' );
- if ( typeof sessionId === 'undefined' || sessionId === null ) {
+ if ( sessionId === undefined || sessionId === null ) {
sessionId = user.generateRandomSessionId();
- $.cookie( 'mediaWiki.user.sessionId', sessionId, { 'expires': null, 'path': '/' } );
+ $.cookie( 'mediaWiki.user.sessionId', sessionId, { expires: null, path: '/' } );
}
return sessionId;
- };
+ },
/**
- * Gets the current user's name or the session ID
+ * Get the current user's name or the session ID
*
- * @return String: User name or random session ID
+ * Not to be confused with #getId.
+ *
+ * @return {string} User name or random session ID
*/
- this.id = function() {
- var name = user.getName();
- if ( name ) {
- return name;
- }
- return user.sessionId();
- };
+ id: function () {
+ return user.getName() || user.sessionId();
+ },
/**
- * Gets the user's bucket, placing them in one at random based on set odds if needed.
- *
- * @param key String: Name of bucket
- * @param options Object: Bucket configuration options
- * @param options.buckets Object: List of bucket-name/relative-probability pairs (required,
- * must have at least one pair)
- * @param options.version Number: Version of bucket test, changing this forces rebucketing
- * (optional, default: 0)
- * @param options.tracked Boolean: Track the event of bucketing through the API module of
- * the ClickTracking extension (optional, default: false)
- * @param options.expires Number: Length of time (in days) until the user gets rebucketed
- * (optional, default: 30)
- * @return String: Bucket name - the randomly chosen key of the options.buckets object
+ * Get the user's bucket (place them in one if not done already)
*
- * @example
* mw.user.bucket( 'test', {
- * 'buckets': { 'ignored': 50, 'control': 25, 'test': 25 },
- * 'version': 1,
- * 'tracked': true,
- * 'expires': 7
+ * buckets: { ignored: 50, control: 25, test: 25 },
+ * version: 1,
+ * expires: 7
* } );
+ *
+ * @param {string} key Name of bucket
+ * @param {Object} options Bucket configuration options
+ * @param {Object} options.buckets List of bucket-name/relative-probability pairs (required,
+ * must have at least one pair)
+ * @param {number} [options.version=0] Version of bucket test, changing this forces
+ * rebucketing
+ * @param {number} [options.expires=30] Length of time (in days) until the user gets
+ * rebucketed
+ * @return {string} Bucket name - the randomly chosen key of the `options.buckets` object
*/
- this.bucket = function ( key, options ) {
+ bucket: function ( key, options ) {
var cookie, parts, version, bucket,
range, k, rand, total;
options = $.extend( {
buckets: {},
version: 0,
- tracked: false,
expires: 30
}, options || {} );
cookie = $.cookie( 'mediaWiki.user.bucket:' + key );
// Bucket information is stored as 2 integers, together as version:bucket like: "1:2"
- if ( typeof cookie === 'string' && cookie.length > 2 && cookie.indexOf( ':' ) > 0 ) {
+ if ( typeof cookie === 'string' && cookie.length > 2 && cookie.indexOf( ':' ) !== -1 ) {
parts = cookie.split( ':' );
if ( parts.length > 1 && Number( parts[0] ) === options.version ) {
version = Number( parts[0] );
bucket = String( parts[1] );
}
}
+
if ( bucket === undefined ) {
if ( !$.isPlainObject( options.buckets ) ) {
- throw 'Invalid buckets error. Object expected for options.buckets.';
+ throw new Error( 'Invalid bucket. Object expected for options.buckets.' );
}
+
version = Number( options.version );
+
// Find range
range = 0;
for ( k in options.buckets ) {
range += options.buckets[k];
}
+
// Select random value within range
rand = Math.random() * range;
+
// Determine which bucket the value landed in
total = 0;
for ( k in options.buckets ) {
@@ -218,39 +222,34 @@
break;
}
}
- if ( options.tracked ) {
- mw.loader.using( 'jquery.clickTracking', function () {
- $.trackAction(
- 'mediaWiki.user.bucket:' + key + '@' + version + ':' + bucket
- );
- } );
- }
+
$.cookie(
'mediaWiki.user.bucket:' + key,
version + ':' + bucket,
- { 'path': '/', 'expires': Number( options.expires ) }
+ { path: '/', expires: Number( options.expires ) }
);
}
+
return bucket;
- };
+ },
/**
- * Gets the current user's groups.
+ * Get the current user's groups
+ *
+ * @param {Function} callback
*/
- this.getGroups = function ( callback ) {
+ getGroups: function ( callback ) {
getUserInfo( 'groups', callback );
- };
+ },
/**
- * Gets the current user's rights.
+ * Get the current user's rights
+ *
+ * @param {Function} callback
*/
- this.getRights = function ( callback ) {
+ getRights: function ( callback ) {
getUserInfo( 'rights', callback );
- };
- }
-
- // Extend the skeleton mw.user from mediawiki.js
- // This is kind of ugly but we're stuck with this for b/c reasons
- mw.user = new User( mw.user.options, mw.user.tokens );
+ }
+ };
}( mediaWiki, jQuery ) );
diff --git a/resources/mediawiki/mediawiki.util.js b/resources/mediawiki/mediawiki.util.js
index 5211b0d0..7383df2d 100644
--- a/resources/mediawiki/mediawiki.util.js
+++ b/resources/mediawiki/mediawiki.util.js
@@ -13,7 +13,7 @@
* (don't call before document ready)
*/
init: function () {
- var profile, $tocTitle, $tocToggleLink, hideTocCookie;
+ var profile;
/* Set tooltipAccessKeyPrefix */
profile = $.client.profile();
@@ -53,8 +53,9 @@
|| profile.name === 'konqueror' ) ) {
util.tooltipAccessKeyPrefix = 'ctrl-';
- // Firefox 2.x and later
- } else if ( profile.name === 'firefox' && profile.versionBase > '1' ) {
+ // Firefox/Iceweasel 2.x and later
+ } else if ( ( profile.name === 'firefox' || profile.name === 'iceweasel' )
+ && profile.versionBase > '1' ) {
util.tooltipAccessKeyPrefix = 'alt-shift-';
}
@@ -105,29 +106,32 @@
} )();
// Table of contents toggle
- $tocTitle = $( '#toctitle' );
- $tocToggleLink = $( '#togglelink' );
- // Only add it if there is a TOC and there is no toggle added already
- if ( $( '#toc' ).length && $tocTitle.length && !$tocToggleLink.length ) {
- hideTocCookie = $.cookie( 'mw_hidetoc' );
+ mw.hook( 'wikipage.content' ).add( function () {
+ var $tocTitle, $tocToggleLink, hideTocCookie;
+ $tocTitle = $( '#toctitle' );
+ $tocToggleLink = $( '#togglelink' );
+ // Only add it if there is a TOC and there is no toggle added already
+ if ( $( '#toc' ).length && $tocTitle.length && !$tocToggleLink.length ) {
+ hideTocCookie = $.cookie( 'mw_hidetoc' );
$tocToggleLink = $( '<a href="#" class="internal" id="togglelink"></a>' )
.text( mw.msg( 'hidetoc' ) )
.click( function ( e ) {
e.preventDefault();
util.toggleToc( $(this) );
} );
- $tocTitle.append(
- $tocToggleLink
- .wrap( '<span class="toctoggle"></span>' )
- .parent()
- .prepend( '&nbsp;[' )
- .append( ']&nbsp;' )
- );
-
- if ( hideTocCookie === '1' ) {
- util.toggleToc( $tocToggleLink );
+ $tocTitle.append(
+ $tocToggleLink
+ .wrap( '<span class="toctoggle"></span>' )
+ .parent()
+ .prepend( '&nbsp;[' )
+ .append( ']&nbsp;' )
+ );
+
+ if ( hideTocCookie === '1' ) {
+ util.toggleToc( $tocToggleLink );
+ }
}
- }
+ } );
},
/* Main body */
@@ -160,11 +164,18 @@
* Get the link to a page name (relative to `wgServer`),
*
* @param {string} str Page name to get the link for.
+ * @param {Object} params A mapping of query parameter names to values,
+ * e.g. { action: 'edit' }. Optional.
* @return {string} Location for a page with name of `str` or boolean false on error.
*/
- wikiGetlink: function ( str ) {
- return mw.config.get( 'wgArticlePath' ).replace( '$1',
+ getUrl: function ( str, params ) {
+ var url = mw.config.get( 'wgArticlePath' ).replace( '$1',
util.wikiUrlencode( typeof str === 'string' ? str : mw.config.get( 'wgPageName' ) ) );
+ if ( params && !$.isEmptyObject( params ) ) {
+ url += url.indexOf( '?' ) !== -1 ? '&' : '?';
+ url += $.param( params );
+ }
+ return url;
},
/**
@@ -251,7 +262,7 @@
* Returns null if not found.
*
* @param {string} param The parameter name.
- * @param {string} [url] URL to search through.
+ * @param {string} [url=document.location.href] URL to search through, defaulting to the current document's URL.
* @return {Mixed} Parameter value or null.
*/
getParamValue: function ( param, url ) {
@@ -279,8 +290,17 @@
/**
* @property {RegExp}
* Regex to match accesskey tooltips.
+ *
+ * Should match:
+ *
+ * - "ctrl-option-"
+ * - "alt-shift-"
+ * - "ctrl-alt-"
+ * - "ctrl-"
+ *
+ * The accesskey is matched in group $6.
*/
- tooltipAccessKeyRegexp: /\[(ctrl-)?(alt-)?(shift-)?(esc-)?(.)\]$/,
+ tooltipAccessKeyRegexp: /\[(ctrl-)?(option-)?(alt-)?(shift-)?(esc-)?(.)\]$/,
/**
* Add the appropriate prefix to the accesskey shown in the tooltip.
@@ -301,9 +321,9 @@
}
$nodes.attr( 'title', function ( i, val ) {
- if ( val && util.tooltipAccessKeyRegexp.exec( val ) ) {
+ if ( val && util.tooltipAccessKeyRegexp.test( val ) ) {
return val.replace( util.tooltipAccessKeyRegexp,
- '[' + util.tooltipAccessKeyPrefix + '$5]' );
+ '[' + util.tooltipAccessKeyPrefix + '$6]' );
}
return val;
} );
@@ -364,87 +384,86 @@
$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 ( mw.config.get( 'skin' ) ) {
- case 'standard':
- $( '#quickbar' ).append( $link.after( '<br/>' ) );
- return $link[0];
- case 'nostalgia':
- $( '#searchform' ).before( $link ).before( ' &#124; ' );
- return $link[0];
- default: // Skins like chick, modern, monobook, myskin, simple, vector...
-
- // Select the specified portlet
- $portlet = $( '#' + portlet );
- if ( $portlet.length === 0 ) {
- return null;
- }
- // Select the first (most likely only) unordered list inside the portlet
- $ul = $portlet.find( 'ul' ).eq( 0 );
+ // Select the specified portlet
+ $portlet = $( '#' + portlet );
+ if ( $portlet.length === 0 ) {
+ return null;
+ }
+ // Select the first (most likely only) unordered list inside the portlet
+ $ul = $portlet.find( 'ul' ).eq( 0 );
- // If it didn't have an unordered list yet, create it
- if ( $ul.length === 0 ) {
+ // If it didn't have an unordered list yet, create it
+ if ( $ul.length === 0 ) {
- $ul = $( '<ul>' );
+ $ul = $( '<ul>' );
- // If there's no <div> inside, append it to the portlet directly
- if ( $portlet.find( 'div:first' ).length === 0 ) {
- $portlet.append( $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 );
- }
- }
- // Just in case..
- if ( $ul.length === 0 ) {
- return null;
+ // If there's no <div> inside, append it to the portlet directly
+ if ( $portlet.find( 'div:first' ).length === 0 ) {
+ $portlet.append( $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 );
}
+ }
+ // Just in case..
+ if ( $ul.length === 0 ) {
+ return null;
+ }
- // Unhide portlet if it was hidden before
- $portlet.removeClass( 'emptyPortlet' );
+ // Unhide portlet if it was hidden before
+ $portlet.removeClass( 'emptyPortlet' );
- // Wrap the anchor tag in a list item (and a span if $portlet is a Vector tab)
- // and back up the selector to the list item
- if ( $portlet.hasClass( 'vectorTabs' ) ) {
- $item = $link.wrap( '<li><span></span></li>' ).parent().parent();
- } else {
- $item = $link.wrap( '<li></li>' ).parent();
- }
+ // Wrap the anchor tag in a list item (and a span if $portlet is a Vector tab)
+ // and back up the selector to the list item
+ if ( $portlet.hasClass( 'vectorTabs' ) ) {
+ $item = $link.wrap( '<li><span></span></li>' ).parent().parent();
+ } else {
+ $item = $link.wrap( '<li></li>' ).parent();
+ }
- // Implement the properties passed to the function
- if ( id ) {
- $item.attr( 'id', id );
- }
+ // Implement the properties passed to the function
+ if ( id ) {
+ $item.attr( 'id', id );
+ }
+
+ if ( tooltip ) {
+ // Trim any existing accesskey hint and the trailing space
+ tooltip = $.trim( tooltip.replace( util.tooltipAccessKeyRegexp, '' ) );
if ( accesskey ) {
- $link.attr( 'accesskey', accesskey );
tooltip += ' [' + accesskey + ']';
- $link.attr( 'title', tooltip );
}
- if ( accesskey && tooltip ) {
+ $link.attr( 'title', tooltip );
+ if ( accesskey ) {
util.updateTooltipAccessKeys( $link );
}
+ }
- // Where to put our node ?
- // - nextnode is a DOM element (was the only option before MW 1.17, in wikibits.js)
- if ( nextnode && nextnode.parentNode === $ul[0] ) {
- $(nextnode).before( $item );
-
- // - nextnode is a CSS selector for jQuery
- } else if ( typeof nextnode === 'string' && $ul.find( nextnode ).length !== 0 ) {
- $ul.find( nextnode ).eq( 0 ).before( $item );
+ if ( accesskey ) {
+ $link.attr( 'accesskey', accesskey );
+ }
- // If the jQuery selector isn't found within the <ul>,
- // or if nextnode was invalid or not passed at all,
- // then just append it at the end of the <ul> (this is the default behavior)
- } else {
+ if ( nextnode ) {
+ if ( nextnode.nodeType || typeof nextnode === 'string' ) {
+ // nextnode is a DOM element (was the only option before MW 1.17, in wikibits.js)
+ // or nextnode is a CSS selector for jQuery
+ nextnode = $ul.find( nextnode );
+ } else if ( !nextnode.jquery || ( nextnode.length && nextnode[0].parentNode !== $ul[0] ) ) {
+ // Fallback
$ul.append( $item );
+ return $item[0];
}
+ if ( nextnode.length === 1 ) {
+ // nextnode is a jQuery object that represents exactly one element
+ nextnode.before( $item );
+ return $item[0];
+ }
+ }
+ // Fallback (this is the default behavior)
+ $ul.append( $item );
+ return $item[0];
- return $item[0];
- }
},
/**
@@ -454,7 +473,7 @@
*
* @param {Mixed} message The DOM-element, jQuery object or HTML-string to be put inside the message box.
* to allow CSS/JS to hide different boxes. null = no class used.
- * @deprecated Use mw#notify
+ * @deprecated since 1.20 Use mw#notify
*/
jsMessage: function ( message ) {
if ( !arguments.length || message === '' || message === null ) {
@@ -593,6 +612,13 @@
}
};
+ /**
+ * @method wikiGetlink
+ * @inheritdoc #getUrl
+ * @deprecated since 1.23 Use #getUrl instead.
+ */
+ mw.log.deprecate( util, 'wikiGetlink', util.getUrl, 'Use mw.util.getUrl instead.' );
+
mw.util = util;
}( mediaWiki, jQuery ) );
diff --git a/resources/startup.js b/resources/startup.js
index deff7e6e..b6a27d2d 100644
--- a/resources/startup.js
+++ b/resources/startup.js
@@ -10,23 +10,39 @@
* This function will be deleted after it's used, so do not expand it to be
* generally useful beyond startup.
*
- * MediaWiki & jQuery compatibility:
- * - Internet Explorer 6.0+
- * - Firefox 10+
- * - Safari 5.0+
- * - Opera 11+
- * - Chrome
+ * See also:
+ * - https://www.mediawiki.org/wiki/Compatibility#Browser
+ * - http://jquerymobile.com/gbs/
+ * - http://jquery.com/browser-support/
*/
/*jshint unused: false */
-function isCompatible() {
- // IE < 6.0
- if ( navigator.appVersion.indexOf( 'MSIE' ) !== -1
- && parseFloat( navigator.appVersion.split( 'MSIE' )[1] ) < 6 )
- {
- return false;
+function isCompatible( ua ) {
+ if ( ua === undefined ) {
+ ua = navigator.userAgent;
}
- return true;
+
+ // MediaWiki JS or jQuery is known to have issues with:
+ return !(
+ // Internet Explorer < 6
+ ( ua.indexOf( 'MSIE' ) !== -1 && parseFloat( ua.split( 'MSIE' )[1] ) < 6 ) ||
+ // Firefox < 3
+ ( ua.indexOf( 'Firefox/' ) !== -1 && parseFloat( ua.split( 'Firefox/' )[1] ) < 3 ) ||
+ // BlackBerry < 6
+ ua.match( /BlackBerry[^\/]*\/[1-5]\./ ) ||
+ // Open WebOS < 1.5
+ ua.match( /webOS\/1\.[0-4]/ ) ||
+ // Anything PlayStation based.
+ ua.match( /PlayStation/i ) ||
+ // Any Symbian based browsers
+ ua.match( /SymbianOS|Series60/ ) ||
+ // Any NetFront based browser
+ ua.match( /NetFront/ ) ||
+ // Opera Mini, all versions
+ ua.match( /Opera Mini/ ) ||
+ // Nokia's Ovi Browser
+ ua.match( /S40OviBrowser/ )
+ );
}
/**
diff --git a/serialized/serialize.php b/serialized/serialize.php
index 09aec79e..766c1a51 100644
--- a/serialized/serialize.php
+++ b/serialized/serialize.php
@@ -24,7 +24,7 @@
if ( !defined( 'MEDIAWIKI' ) ) {
$wgNoDBParam = true;
$optionsWithArgs = array( 'o' );
- require_once( __DIR__ .'/../maintenance/commandLine.inc' );
+ require_once __DIR__ .'/../maintenance/commandLine.inc';
$stderr = fopen( 'php://stderr', 'w' );
if ( !isset( $args[0] ) ) {
@@ -65,7 +65,7 @@ if ( !defined( 'MEDIAWIKI' ) ) {
//----------------------------------------------------------------------------
function getVars( $_gv_filename ) {
- require( $_gv_filename );
+ require $_gv_filename;
$vars = get_defined_vars();
unset( $vars['_gv_filename'] );
diff --git a/skins/ArchLinux.php b/skins/ArchLinux.php
index d7a79616..b25d8cd8 100644
--- a/skins/ArchLinux.php
+++ b/skins/ArchLinux.php
@@ -22,8 +22,9 @@
* @ingroup Skins
*/
-if( !defined( 'MEDIAWIKI' ) )
+if ( !defined( 'MEDIAWIKI' ) ) {
die( -1 );
+}
/**
* Inherit main code from SkinTemplate, set the CSS and template filter.
@@ -39,17 +40,10 @@ class SkinArchLinux extends SkinTemplate {
* @param $out OutputPage
*/
function setupSkinUserCss( OutputPage $out ) {
- global $wgHandheldStyle;
parent::setupSkinUserCss( $out );
$out->addModuleStyles( 'skins.archlinux' );
- // Ugh. Can't do this properly because $wgHandheldStyle may be a URL
- if( $wgHandheldStyle ) {
- // Currently in testing... try 'chick/main.css'
- $out->addStyle( $wgHandheldStyle, 'handheld' );
- }
-
// TODO: Migrate all of these
$out->addStyle( 'archlinux/IE60Fixes.css', 'screen', 'IE 6' );
$out->addStyle( 'archlinux/IE70Fixes.css', 'screen', 'IE 7' );
@@ -105,39 +99,39 @@ class ArchLinuxTemplate extends BaseTemplate {
<div id="globalWrapper">
<div id="column-content"><div id="content" class="mw-body-primary" role="main">
<a id="top"></a>
- <?php if($this->data['sitenotice']) { ?><div id="siteNotice"><?php $this->html('sitenotice') ?></div><?php } ?>
+ <?php if ( $this->data['sitenotice'] ) { ?><div id="siteNotice"><?php $this->html( 'sitenotice' ) ?></div><?php } ?>
<h1 id="firstHeading" class="firstHeading" lang="<?php
- $this->data['pageLanguage'] = $this->getSkin()->getTitle()->getPageViewLanguage()->getCode();
- $this->html( 'pageLanguage' );
- ?>"><span dir="auto"><?php $this->html('title') ?></span></h1>
+ $this->data['pageLanguage'] = $this->getSkin()->getTitle()->getPageViewLanguage()->getHtmlCode();
+ $this->text( 'pageLanguage' );
+ ?>"><span dir="auto"><?php $this->html( 'title' ) ?></span></h1>
<div id="bodyContent" class="mw-body">
- <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>
-<?php } ?><?php if($this->data['newtalk'] ) { ?>
- <div class="usermessage"><?php $this->html('newtalk') ?></div>
-<?php } ?><?php if($this->data['showjumplinks']) { ?>
- <div id="jump-to-nav" class="mw-jump"><?php $this->msg('jumpto') ?> <a href="#column-one"><?php $this->msg('jumptonavigation') ?></a><?php $this->msg( 'comma-separator' ) ?><a href="#searchInput"><?php $this->msg('jumptosearch') ?></a></div>
+ <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>
+<?php } ?><?php if ( $this->data['newtalk'] ) { ?>
+ <div class="usermessage"><?php $this->html( 'newtalk' ) ?></div>
<?php } ?>
+ <div id="jump-to-nav" class="mw-jump"><?php $this->msg( 'jumpto' ) ?> <a href="#column-one"><?php $this->msg( 'jumptonavigation' ) ?></a><?php $this->msg( 'comma-separator' ) ?><a href="#searchInput"><?php $this->msg( 'jumptosearch' ) ?></a></div>
+
<!-- start content -->
-<?php $this->html('bodytext') ?>
- <?php if($this->data['catlinks']) { $this->html('catlinks'); } ?>
+<?php $this->html( 'bodytext' ) ?>
+ <?php if ( $this->data['catlinks'] ) { $this->html( 'catlinks' ); } ?>
<!-- end content -->
- <?php if($this->data['dataAfterContent']) { $this->html ('dataAfterContent'); } ?>
+ <?php if ( $this->data['dataAfterContent'] ) { $this->html( 'dataAfterContent' ); } ?>
<div class="visualClear"></div>
</div>
</div></div>
-<div id="column-one"<?php $this->html('userlangattributes') ?>>
+<div id="column-one"<?php $this->html( 'userlangattributes' ) ?>>
<h2><?php $this->msg( 'navigation-heading' ) ?></h2>
<?php $this->cactions(); ?>
<div class="portlet" id="p-personal" role="navigation">
- <h3><?php $this->msg('personaltools') ?></h3>
+ <h3><?php $this->msg( 'personaltools' ) ?></h3>
<div class="pBody">
- <ul<?php $this->html('userlangattributes') ?>>
-<?php foreach($this->getPersonalTools() as $key => $item) { ?>
- <?php echo $this->makeListItem($key, $item); ?>
+ <ul<?php $this->html( 'userlangattributes' ) ?>>
+<?php foreach ( $this->getPersonalTools() as $key => $item ) { ?>
+ <?php echo $this->makeListItem( $key, $item ); ?>
<?php } ?>
</ul>
@@ -148,7 +142,7 @@ class ArchLinuxTemplate extends BaseTemplate {
echo Html::element( 'a', array(
'href' => $this->data['nav_urls']['mainpage']['href'],
'style' => "background-image: url({$this->data['logopath']});" )
- + Linker::tooltipAndAccesskeyAttribs('p-logo') ); ?>
+ + Linker::tooltipAndAccesskeyAttribs( 'p-logo' ) ); ?>
</div>
<?php
@@ -161,14 +155,14 @@ class ArchLinuxTemplate extends BaseTemplate {
$validFooterLinks = $this->getFooterLinks( "flat" ); // Additional footer links
if ( count( $validFooterIcons ) + count( $validFooterLinks ) > 0 ) { ?>
-<div id="footer" role="contentinfo"<?php $this->html('userlangattributes') ?>>
+<div id="footer" role="contentinfo"<?php $this->html( 'userlangattributes' ) ?>>
<?php
$footerEnd = '</div>';
} else {
$footerEnd = '';
}
foreach ( $validFooterIcons as $blockName => $footerIcons ) { ?>
- <div id="f-<?php echo htmlspecialchars($blockName); ?>ico">
+ <div id="f-<?php echo htmlspecialchars( $blockName ); ?>ico">
<?php foreach ( $footerIcons as $icon ) { ?>
<?php echo $this->getSkin()->makeFooterIcon( $icon ); ?>
@@ -180,8 +174,8 @@ class ArchLinuxTemplate extends BaseTemplate {
if ( count( $validFooterLinks ) > 0 ) {
?> <ul id="f-list">
<?php
- foreach( $validFooterLinks as $aLink ) { ?>
- <li id="<?php echo $aLink ?>"><?php $this->html($aLink) ?></li>
+ foreach ( $validFooterLinks as $aLink ) { ?>
+ <li id="<?php echo $aLink ?>"><?php $this->html( $aLink ) ?></li>
<?php
}
?>
@@ -204,13 +198,20 @@ echo $footerEnd;
* @param $sidebar array
*/
protected function renderPortals( $sidebar ) {
- if ( !isset( $sidebar['SEARCH'] ) ) $sidebar['SEARCH'] = true;
- if ( !isset( $sidebar['TOOLBOX'] ) ) $sidebar['TOOLBOX'] = true;
- if ( !isset( $sidebar['LANGUAGES'] ) ) $sidebar['LANGUAGES'] = true;
+ if ( !isset( $sidebar['SEARCH'] ) ) {
+ $sidebar['SEARCH'] = true;
+ }
+ if ( !isset( $sidebar['TOOLBOX'] ) ) {
+ $sidebar['TOOLBOX'] = true;
+ }
+ if ( !isset( $sidebar['LANGUAGES'] ) ) {
+ $sidebar['LANGUAGES'] = true;
+ }
- foreach( $sidebar as $boxName => $content ) {
- if ( $content === false )
+ foreach ( $sidebar as $boxName => $content ) {
+ if ( $content === false ) {
continue;
+ }
if ( $boxName == 'SEARCH' ) {
$this->searchBox();
@@ -228,19 +229,19 @@ echo $footerEnd;
global $wgUseTwoButtonsSearchForm;
?>
<div id="p-search" class="portlet" role="search">
- <h3><label for="searchInput"><?php $this->msg('search') ?></label></h3>
+ <h3><label for="searchInput"><?php $this->msg( 'search' ) ?></label></h3>
<div id="searchBody" class="pBody">
- <form action="<?php $this->text('wgScript') ?>" id="searchform">
- <input type='hidden' name="title" value="<?php $this->text('searchtitle') ?>"/>
- <?php echo $this->makeSearchInput(array( "id" => "searchInput" )); ?>
+ <form action="<?php $this->text( 'wgScript' ) ?>" id="searchform">
+ <input type='hidden' name="title" value="<?php $this->text( 'searchtitle' ) ?>"/>
+ <?php echo $this->makeSearchInput( array( "id" => "searchInput" ) ); ?>
- <?php echo $this->makeSearchButton("go", array( "id" => "searchGoButton", "class" => "searchButton" ));
- if ($wgUseTwoButtonsSearchForm): ?>&#160;
- <?php echo $this->makeSearchButton("fulltext", array( "id" => "mw-searchButton", "class" => "searchButton" ));
- else: ?>
+ <?php echo $this->makeSearchButton( "go", array( "id" => "searchGoButton", "class" => "searchButton" ) );
+ if ( $wgUseTwoButtonsSearchForm ) { ?>&#160;
+ <?php echo $this->makeSearchButton( "fulltext", array( "id" => "mw-searchButton", "class" => "searchButton" ) );
+ } else { ?>
- <div><a href="<?php $this->text('searchaction') ?>" rel="search"><?php $this->msg('powersearch-legend') ?></a></div><?php
- endif; ?>
+ <div><a href="<?php $this->text( 'searchaction' ) ?>" rel="search"><?php $this->msg( 'powersearch-legend' ) ?></a></div><?php
+ } ?>
</form>
</div>
@@ -255,10 +256,10 @@ echo $footerEnd;
function cactions() {
?>
<div id="p-cactions" class="portlet" role="navigation">
- <h3><?php $this->msg('views') ?></h3>
+ <h3><?php $this->msg( 'views' ) ?></h3>
<div class="pBody">
<ul><?php
- foreach($this->data['content_actions'] as $key => $tab) {
+ foreach ( $this->data['content_actions'] as $key => $tab ) {
echo '
' . $this->makeListItem( $key, $tab );
} ?>
@@ -272,12 +273,12 @@ echo $footerEnd;
function toolbox() {
?>
<div class="portlet" id="p-tb" role="navigation">
- <h3><?php $this->msg('toolbox') ?></h3>
+ <h3><?php $this->msg( 'toolbox' ) ?></h3>
<div class="pBody">
<ul>
<?php
foreach ( $this->getToolbox() as $key => $tbitem ) { ?>
- <?php echo $this->makeListItem($key, $tbitem); ?>
+ <?php echo $this->makeListItem( $key, $tbitem ); ?>
<?php
}
@@ -292,14 +293,14 @@ echo $footerEnd;
/*************************************************************************************************/
function languageBox() {
- if( $this->data['language_urls'] ) {
+ if ( $this->data['language_urls'] ) {
?>
<div id="p-lang" class="portlet" role="navigation">
- <h3<?php $this->html('userlangattributes') ?>><?php $this->msg('otherlanguages') ?></h3>
+ <h3<?php $this->html( 'userlangattributes' ) ?>><?php $this->msg( 'otherlanguages' ) ?></h3>
<div class="pBody">
<ul>
-<?php foreach($this->data['language_urls'] as $key => $langlink) { ?>
- <?php echo $this->makeListItem($key, $langlink); ?>
+<?php foreach ( $this->data['language_urls'] as $key => $langlink ) { ?>
+ <?php echo $this->makeListItem( $key, $langlink ); ?>
<?php } ?>
</ul>
@@ -321,14 +322,15 @@ echo $footerEnd;
$portletAttribs['title'] = $tooltip;
}
echo ' ' . Html::openElement( 'div', $portletAttribs );
+ $msgObj = wfMessage( $bar );
?>
- <h3><?php $msg = wfMessage( $bar ); echo htmlspecialchars( $msg->exists() ? $msg->text() : $bar ); ?></h3>
+ <h3><?php echo htmlspecialchars( $msgObj->exists() ? $msgObj->text() : $bar ); ?></h3>
<div class='pBody'>
<?php if ( is_array( $cont ) ) { ?>
<ul>
-<?php foreach($cont as $key => $val) { ?>
- <?php echo $this->makeListItem($key, $val); ?>
+<?php foreach ( $cont as $key => $val ) { ?>
+ <?php echo $this->makeListItem( $key, $val ); ?>
<?php } ?>
</ul>
diff --git a/skins/Chick.php b/skins/Chick.php
deleted file mode 100644
index 75b807ad..00000000
--- a/skins/Chick.php
+++ /dev/null
@@ -1,47 +0,0 @@
-<?php
-/**
- * Chick: A lightweight Monobook skin with no sidebar, the sidebar links are
- * given at the bottom of the page instead, as in the unstyled MySkin.
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License along
- * with this program; if not, write 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 Skins
- */
-
-if( !defined( 'MEDIAWIKI' ) )
- die( -1 );
-
-/**
- * Inherit main code from SkinTemplate, set the CSS and template filter.
- * @ingroup Skins
- */
-class SkinChick extends SkinTemplate {
- var $skinname = 'chick', $stylename = 'chick',
- $template = 'MonoBookTemplate', $useHeadElement = true;
-
- /**
- * @param $out OutputPage
- */
- function setupSkinUserCss( OutputPage $out ) {
- parent::setupSkinUserCss( $out );
-
- $out->addModuleStyles( 'skins.chick' );
-
- // TODO: Migrate all of these to RL
- $out->addStyle( 'chick/IE60Fixes.css', 'screen,handheld', 'IE 6' );
- }
-}
diff --git a/skins/CologneBlue.php b/skins/CologneBlue.php
index 21b07f7d..0370e05b 100644
--- a/skins/CologneBlue.php
+++ b/skins/CologneBlue.php
@@ -22,7 +22,7 @@
* @ingroup Skins
*/
-if( !defined( 'MEDIAWIKI' ) ) {
+if ( !defined( 'MEDIAWIKI' ) ) {
die( -1 );
}
@@ -39,7 +39,7 @@ class SkinCologneBlue extends SkinTemplate {
* @param $out OutputPage
*/
function setupSkinUserCss( OutputPage $out ) {
- $out->addModuleStyles( 'mediawiki.legacy.shared' );
+ parent::setupSkinUserCss( $out );
$out->addModuleStyles( 'mediawiki.legacy.oldshared' );
$out->addModuleStyles( 'skins.cologneblue' );
}
@@ -127,7 +127,7 @@ class CologneBlueTemplate extends BaseTemplate {
*
* @return string
*/
- function processBottomLink( $key, $navlink, $message=null ) {
+ function processBottomLink( $key, $navlink, $message = null ) {
if ( !$navlink ) {
// Empty navlinks might be passed.
return null;
@@ -202,7 +202,7 @@ class CologneBlueTemplate extends BaseTemplate {
$companionTitle = $title->isTalkPage() ? $title->getSubjectPage() : $title->getTalkPage();
$companionNamespace = $companionTitle->getNamespace();
- // TODO these messages appear to only be used by CologneBlue and legacy skins,
+ // TODO these messages are only be used by CologneBlue,
// kill and replace with something more sensibly named?
$nsToMessage = array(
NS_MAIN => 'articlepage',
@@ -234,7 +234,7 @@ class CologneBlueTemplate extends BaseTemplate {
// Use the regular navigational link, but replace its text. Everything else stays unmodified.
$namespacesLinks = $this->data['content_navigation']['namespaces'];
- return $this->processBottomLink( $message, $namespacesLinks[$key], $message );
+ return $this->processBottomLink( $message, $namespacesLinks[$key], $message );
}
/**
@@ -246,7 +246,7 @@ class CologneBlueTemplate extends BaseTemplate {
* @param $navlink array Navigational link generated by SkinTemplate
* @param $idPrefix mixed Prefix to add to id of this navlink. If false, id is removed entirely. Default is 'cb-'.
*/
- function processNavlinkForDocument( $navlink, $idPrefix='cb-' ) {
+ function processNavlinkForDocument( $navlink, $idPrefix = 'cb-' ) {
if ( $navlink['id'] ) {
$navlink['single-id'] = $navlink['id']; // to allow for tooltip generation
$navlink['tooltiponly'] = true; // but no accesskeys
@@ -255,7 +255,7 @@ class CologneBlueTemplate extends BaseTemplate {
if ( $idPrefix === false ) {
unset( $navlink['id'] );
} else {
- $navlink['id'] = $idPrefix . $navlink['id'];
+ $navlink['id'] = $idPrefix . $navlink['id'];
}
}
@@ -290,8 +290,8 @@ class CologneBlueTemplate extends BaseTemplate {
<div id="siteNotice"><?php echo $this->getSkin()->getSiteNotice() ?></div>
<?php } ?>
<h1 id="firstHeading" lang="<?php
- $this->data['pageLanguage'] = $this->getSkin()->getTitle()->getPageViewLanguage()->getCode();
- $this->html( 'pageLanguage' );
+ $this->data['pageLanguage'] = $this->getSkin()->getTitle()->getPageViewLanguage()->getHtmlCode();
+ $this->text( 'pageLanguage' );
?>"><span dir="auto"><?php echo $this->data['title'] ?></span></h1>
<?php if ( $this->translator->translate( 'tagline' ) ) { ?>
<p class="tagline"><?php echo htmlspecialchars( $this->translator->translate( 'tagline' ) ) ?></p>
@@ -316,7 +316,8 @@ class CologneBlueTemplate extends BaseTemplate {
ob_start();
?>
</div>
- <div id="footer" role="contentinfo">
+ <div id="footer">
+ <div id="footer-navigation" role="navigation">
<?php
// Page-related links
echo $this->bottomLinks();
@@ -328,8 +329,10 @@ class CologneBlueTemplate extends BaseTemplate {
$this->getSkin()->aboutLink(),
$this->searchForm( 'footer' )
) );
- echo "\n<br />";
-
+?>
+ </div>
+ <div id="footer-info" role="contentinfo">
+<?php
// Standard footer info
$footlinks = $this->getFooterLinks();
if ( $footlinks['info'] ) {
@@ -338,6 +341,7 @@ class CologneBlueTemplate extends BaseTemplate {
}
}
?>
+ </div>
</div>
</div>
<div id="mw-navigation">
@@ -376,7 +380,7 @@ class CologneBlueTemplate extends BaseTemplate {
);
$personalUrls = $this->getPersonalTools();
- foreach ( array ( 'logout', 'createaccount', 'login', 'anonlogin' ) as $key ) {
+ foreach ( array( 'logout', 'createaccount', 'login', 'anonlogin' ) as $key ) {
if ( $personalUrls[$key] ) {
$s[] = $this->makeListItem( $key, $personalUrls[$key], array( 'tag' => 'span' ) );
}
@@ -417,7 +421,7 @@ class CologneBlueTemplate extends BaseTemplate {
// Personal tools ("My pages")
$qbmyoptions = $this->getPersonalTools();
- foreach ( array ( 'logout', 'createaccount', 'login', 'anonlogin' ) as $key ) {
+ foreach ( array( 'logout', 'createaccount', 'login', 'anonlogin' ) as $key ) {
$qbmyoptions[$key] = null;
}
@@ -532,18 +536,17 @@ class CologneBlueTemplate extends BaseTemplate {
$search = $this->getSkin()->getRequest()->getText( 'search' );
$action = $this->data['searchaction'];
- $s = "<form id=\"searchform-" . htmlspecialchars($which) . "\" method=\"get\" class=\"inline\" action=\"$action\">";
- if( $which == 'footer' ) {
+ $s = "<form id=\"searchform-" . htmlspecialchars( $which ) . "\" method=\"get\" class=\"inline\" action=\"$action\">";
+ if ( $which == 'footer' ) {
$s .= wfMessage( 'qbfind' )->text() . ": ";
}
- $s .= "<input type='text' class=\"mw-searchInput\" name=\"search\" size=\"14\" value=\""
- . htmlspecialchars( substr( $search, 0, 256 ) ) . "\" />"
- . ($which == 'footer' ? " " : "<br />")
- . "<input type='submit' class=\"searchButton\" name=\"go\" value=\"" . wfMessage( 'searcharticle' )->escaped() . "\" />";
+ $s .= $this->makeSearchInput( array( 'class' => 'mw-searchInput', 'type' => 'text', 'size' => '14' ) );
+ $s .= ( $which == 'footer' ? " " : "<br />" );
+ $s .= $this->makeSearchButton( 'go', array( 'class' => 'searchButton' ) );
- if( $wgUseTwoButtonsSearchForm ) {
- $s .= " <input type='submit' class=\"searchButton\" name=\"fulltext\" value=\"" . wfMessage( 'searchbutton' )->escaped() . "\" />\n";
+ if ( $wgUseTwoButtonsSearchForm ) {
+ $s .= $this->makeSearchButton( 'fulltext', array( 'class' => 'searchButton' ) );
} else {
$s .= '<div><a href="' . $action . '" rel="search">' . wfMessage( 'powersearch-legend' )->escaped() . "</a></div>\n";
}
diff --git a/skins/Modern.php b/skins/Modern.php
index 9dbefb11..8d778cf6 100644
--- a/skins/Modern.php
+++ b/skins/Modern.php
@@ -22,8 +22,9 @@
* @ingroup Skins
*/
-if( !defined( 'MEDIAWIKI' ) )
+if ( !defined( 'MEDIAWIKI' ) ) {
die( -1 );
+}
/**
* Inherit main code from SkinTemplate, set the CSS and template filter.
@@ -39,7 +40,7 @@ class SkinModern extends SkinTemplate {
*/
function setupSkinUserCss( OutputPage $out ) {
parent::setupSkinUserCss( $out );
- $out->addModuleStyles ('skins.modern');
+ $out->addModuleStyles( 'skins.modern' );
}
}
@@ -66,9 +67,9 @@ class ModernTemplate extends MonoBookTemplate {
<!-- heading -->
<div id="mw_header"><h1 id="firstHeading" lang="<?php
- $this->data['pageLanguage'] = $this->getSkin()->getTitle()->getPageViewLanguage()->getCode();
- $this->html( 'pageLanguage' );
- ?>"><span dir="auto"><?php $this->html('title') ?></span></h1></div>
+ $this->data['pageLanguage'] = $this->getSkin()->getTitle()->getPageViewLanguage()->getHtmlCode();
+ $this->text( 'pageLanguage' );
+ ?>"><span dir="auto"><?php $this->html( 'title' ) ?></span></h1></div>
<div id="mw_main">
<div id="mw_contentwrapper">
@@ -82,30 +83,30 @@ class ModernTemplate extends MonoBookTemplate {
for the margins -->
<div id="mw_contentholder" class="mw-body">
<div class='mw-topboxes'>
- <div id="mw-js-message" style="display:none;"<?php $this->html('userlangattributes')?>></div>
- <div class="mw-topbox" id="siteSub"><?php $this->msg('tagline') ?></div>
- <?php if($this->data['newtalk'] ) {
- ?><div class="usermessage mw-topbox"><?php $this->html('newtalk') ?></div>
+ <div id="mw-js-message" style="display:none;"<?php $this->html( 'userlangattributes' ) ?>></div>
+ <div class="mw-topbox" id="siteSub"><?php $this->msg( 'tagline' ) ?></div>
+ <?php if ( $this->data['newtalk'] ) {
+ ?><div class="usermessage mw-topbox"><?php $this->html( 'newtalk' ) ?></div>
<?php } ?>
- <?php if($this->data['sitenotice']) {
- ?><div class="mw-topbox" id="siteNotice"><?php $this->html('sitenotice') ?></div>
+ <?php if ( $this->data['sitenotice'] ) {
+ ?><div class="mw-topbox" id="siteNotice"><?php $this->html( 'sitenotice' ) ?></div>
<?php } ?>
</div>
- <div id="contentSub"<?php $this->html('userlangattributes') ?>><?php $this->html('subtitle') ?></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><?php } ?>
- <?php if($this->data['showjumplinks']) { ?><div id="jump-to-nav"><?php $this->msg('jumpto') ?> <a href="#mw_portlets"><?php $this->msg('jumptonavigation') ?></a><?php $this->msg( 'comma-separator' ) ?><a href="#searchInput"><?php $this->msg('jumptosearch') ?></a></div><?php } ?>
+ <?php if ( $this->data['undelete'] ) { ?><div id="contentSub2"><?php $this->html( 'undelete' ) ?></div><?php } ?>
+ <div id="jump-to-nav"><?php $this->msg( 'jumpto' ) ?> <a href="#mw_portlets"><?php $this->msg( 'jumptonavigation' ) ?></a><?php $this->msg( 'comma-separator' ) ?><a href="#searchInput"><?php $this->msg( 'jumptosearch' ) ?></a></div>
- <?php $this->html('bodytext') ?>
+ <?php $this->html( 'bodytext' ) ?>
<div class='mw_clear'></div>
- <?php if($this->data['catlinks']) { $this->html('catlinks'); } ?>
- <?php $this->html ('dataAfterContent') ?>
+ <?php if ( $this->data['catlinks'] ) { $this->html( 'catlinks' ); } ?>
+ <?php $this->html( 'dataAfterContent' ) ?>
</div><!-- mw_contentholder -->
</div><!-- mw_content -->
</div><!-- mw_contentwrapper -->
- <div id="mw_portlets"<?php $this->html("userlangattributes") ?>>
+ <div id="mw_portlets"<?php $this->html( "userlangattributes" ) ?>>
<h2><?php $this->msg( 'navigation-heading' ) ?></h2>
<!-- portlets -->
@@ -120,11 +121,11 @@ class ModernTemplate extends MonoBookTemplate {
<!-- personal portlet -->
<div class="portlet" id="p-personal" role="navigation">
- <h3><?php $this->msg('personaltools') ?></h3>
+ <h3><?php $this->msg( 'personaltools' ) ?></h3>
<div class="pBody">
<ul>
-<?php foreach($this->getPersonalTools() as $key => $item) { ?>
- <?php echo $this->makeListItem($key, $item); ?>
+<?php foreach ( $this->getPersonalTools() as $key => $item ) { ?>
+ <?php echo $this->makeListItem( $key, $item ); ?>
<?php } ?>
</ul>
@@ -133,19 +134,19 @@ class ModernTemplate extends MonoBookTemplate {
<!-- footer -->
- <div id="footer" role="contentinfo"<?php $this->html('userlangattributes') ?>>
+ <div id="footer" role="contentinfo"<?php $this->html( 'userlangattributes' ) ?>>
<ul id="f-list">
<?php
- foreach( $this->getFooterLinks("flat") as $aLink ) {
- if( isset( $this->data[$aLink] ) && $this->data[$aLink] ) {
-?> <li id="<?php echo$aLink?>"><?php $this->html($aLink) ?></li>
+ foreach ( $this->getFooterLinks( "flat" ) as $aLink ) {
+ if ( isset( $this->data[$aLink] ) && $this->data[$aLink] ) {
+?> <li id="<?php echo $aLink ?>"><?php $this->html( $aLink ) ?></li>
<?php }
}
?>
</ul>
<?php
- foreach ( $this->getFooterIcons("nocopyright") as $blockName => $footerIcons ) { ?>
- <div id="mw_<?php echo htmlspecialchars($blockName); ?>">
+ foreach ( $this->getFooterIcons( "nocopyright" ) as $blockName => $footerIcons ) { ?>
+ <div id="mw_<?php echo htmlspecialchars( $blockName ); ?>">
<?php
foreach ( $footerIcons as $icon ) { ?>
<?php echo $this->getSkin()->makeFooterIcon( $icon, 'withoutImage' ); ?>
diff --git a/skins/MonoBook.php b/skins/MonoBook.php
index f03d31b8..6d66cac3 100644
--- a/skins/MonoBook.php
+++ b/skins/MonoBook.php
@@ -25,8 +25,9 @@
* @ingroup Skins
*/
-if( !defined( 'MEDIAWIKI' ) )
+if ( !defined( 'MEDIAWIKI' ) ) {
die( -1 );
+}
/**
* Inherit main code from SkinTemplate, set the CSS and template filter.
@@ -42,17 +43,10 @@ class SkinMonoBook extends SkinTemplate {
* @param $out OutputPage
*/
function setupSkinUserCss( OutputPage $out ) {
- global $wgHandheldStyle;
parent::setupSkinUserCss( $out );
$out->addModuleStyles( 'skins.monobook' );
- // Ugh. Can't do this properly because $wgHandheldStyle may be a URL
- if( $wgHandheldStyle ) {
- // Currently in testing... try 'chick/main.css'
- $out->addStyle( $wgHandheldStyle, 'handheld' );
- }
-
// TODO: Migrate all of these
$out->addStyle( 'monobook/IE60Fixes.css', 'screen', 'IE 6' );
$out->addStyle( 'monobook/IE70Fixes.css', 'screen', 'IE 7' );
@@ -82,39 +76,39 @@ class MonoBookTemplate extends BaseTemplate {
?><div id="globalWrapper">
<div id="column-content"><div id="content" class="mw-body-primary" role="main">
<a id="top"></a>
- <?php if($this->data['sitenotice']) { ?><div id="siteNotice"><?php $this->html('sitenotice') ?></div><?php } ?>
+ <?php if ( $this->data['sitenotice'] ) { ?><div id="siteNotice"><?php $this->html( 'sitenotice' ) ?></div><?php } ?>
<h1 id="firstHeading" class="firstHeading" lang="<?php
- $this->data['pageLanguage'] = $this->getSkin()->getTitle()->getPageViewLanguage()->getCode();
- $this->html( 'pageLanguage' );
- ?>"><span dir="auto"><?php $this->html('title') ?></span></h1>
+ $this->data['pageLanguage'] = $this->getSkin()->getTitle()->getPageViewLanguage()->getHtmlCode();
+ $this->text( 'pageLanguage' );
+ ?>"><span dir="auto"><?php $this->html( 'title' ) ?></span></h1>
<div id="bodyContent" class="mw-body">
- <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>
-<?php } ?><?php if($this->data['newtalk'] ) { ?>
- <div class="usermessage"><?php $this->html('newtalk') ?></div>
-<?php } ?><?php if($this->data['showjumplinks']) { ?>
- <div id="jump-to-nav" class="mw-jump"><?php $this->msg('jumpto') ?> <a href="#column-one"><?php $this->msg('jumptonavigation') ?></a><?php $this->msg( 'comma-separator' ) ?><a href="#searchInput"><?php $this->msg('jumptosearch') ?></a></div>
+ <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>
+<?php } ?><?php if ( $this->data['newtalk'] ) { ?>
+ <div class="usermessage"><?php $this->html( 'newtalk' ) ?></div>
<?php } ?>
+ <div id="jump-to-nav" class="mw-jump"><?php $this->msg( 'jumpto' ) ?> <a href="#column-one"><?php $this->msg( 'jumptonavigation' ) ?></a><?php $this->msg( 'comma-separator' ) ?><a href="#searchInput"><?php $this->msg( 'jumptosearch' ) ?></a></div>
+
<!-- start content -->
-<?php $this->html('bodytext') ?>
- <?php if($this->data['catlinks']) { $this->html('catlinks'); } ?>
+<?php $this->html( 'bodytext' ) ?>
+ <?php if ( $this->data['catlinks'] ) { $this->html( 'catlinks' ); } ?>
<!-- end content -->
- <?php if($this->data['dataAfterContent']) { $this->html ('dataAfterContent'); } ?>
+ <?php if ( $this->data['dataAfterContent'] ) { $this->html( 'dataAfterContent' ); } ?>
<div class="visualClear"></div>
</div>
</div></div>
-<div id="column-one"<?php $this->html('userlangattributes') ?>>
+<div id="column-one"<?php $this->html( 'userlangattributes' ) ?>>
<h2><?php $this->msg( 'navigation-heading' ) ?></h2>
<?php $this->cactions(); ?>
<div class="portlet" id="p-personal" role="navigation">
- <h3><?php $this->msg('personaltools') ?></h3>
+ <h3><?php $this->msg( 'personaltools' ) ?></h3>
<div class="pBody">
- <ul<?php $this->html('userlangattributes') ?>>
-<?php foreach($this->getPersonalTools() as $key => $item) { ?>
- <?php echo $this->makeListItem($key, $item); ?>
+ <ul<?php $this->html( 'userlangattributes' ) ?>>
+<?php foreach ( $this->getPersonalTools() as $key => $item ) { ?>
+ <?php echo $this->makeListItem( $key, $item ); ?>
<?php } ?>
</ul>
@@ -125,7 +119,7 @@ class MonoBookTemplate extends BaseTemplate {
echo Html::element( 'a', array(
'href' => $this->data['nav_urls']['mainpage']['href'],
'style' => "background-image: url({$this->data['logopath']});" )
- + Linker::tooltipAndAccesskeyAttribs('p-logo') ); ?>
+ + Linker::tooltipAndAccesskeyAttribs( 'p-logo' ) ); ?>
</div>
<?php
@@ -138,14 +132,14 @@ class MonoBookTemplate extends BaseTemplate {
$validFooterLinks = $this->getFooterLinks( "flat" ); // Additional footer links
if ( count( $validFooterIcons ) + count( $validFooterLinks ) > 0 ) { ?>
-<div id="footer" role="contentinfo"<?php $this->html('userlangattributes') ?>>
+<div id="footer" role="contentinfo"<?php $this->html( 'userlangattributes' ) ?>>
<?php
$footerEnd = '</div>';
} else {
$footerEnd = '';
}
foreach ( $validFooterIcons as $blockName => $footerIcons ) { ?>
- <div id="f-<?php echo htmlspecialchars($blockName); ?>ico">
+ <div id="f-<?php echo htmlspecialchars( $blockName ); ?>ico">
<?php foreach ( $footerIcons as $icon ) { ?>
<?php echo $this->getSkin()->makeFooterIcon( $icon ); ?>
@@ -157,8 +151,8 @@ class MonoBookTemplate extends BaseTemplate {
if ( count( $validFooterLinks ) > 0 ) {
?> <ul id="f-list">
<?php
- foreach( $validFooterLinks as $aLink ) { ?>
- <li id="<?php echo $aLink ?>"><?php $this->html($aLink) ?></li>
+ foreach ( $validFooterLinks as $aLink ) { ?>
+ <li id="<?php echo $aLink ?>"><?php $this->html( $aLink ) ?></li>
<?php
}
?>
@@ -181,13 +175,20 @@ echo $footerEnd;
* @param $sidebar array
*/
protected function renderPortals( $sidebar ) {
- if ( !isset( $sidebar['SEARCH'] ) ) $sidebar['SEARCH'] = true;
- if ( !isset( $sidebar['TOOLBOX'] ) ) $sidebar['TOOLBOX'] = true;
- if ( !isset( $sidebar['LANGUAGES'] ) ) $sidebar['LANGUAGES'] = true;
+ if ( !isset( $sidebar['SEARCH'] ) ) {
+ $sidebar['SEARCH'] = true;
+ }
+ if ( !isset( $sidebar['TOOLBOX'] ) ) {
+ $sidebar['TOOLBOX'] = true;
+ }
+ if ( !isset( $sidebar['LANGUAGES'] ) ) {
+ $sidebar['LANGUAGES'] = true;
+ }
- foreach( $sidebar as $boxName => $content ) {
- if ( $content === false )
+ foreach ( $sidebar as $boxName => $content ) {
+ if ( $content === false ) {
continue;
+ }
if ( $boxName == 'SEARCH' ) {
$this->searchBox();
@@ -205,19 +206,19 @@ echo $footerEnd;
global $wgUseTwoButtonsSearchForm;
?>
<div id="p-search" class="portlet" role="search">
- <h3><label for="searchInput"><?php $this->msg('search') ?></label></h3>
+ <h3><label for="searchInput"><?php $this->msg( 'search' ) ?></label></h3>
<div id="searchBody" class="pBody">
- <form action="<?php $this->text('wgScript') ?>" id="searchform">
- <input type='hidden' name="title" value="<?php $this->text('searchtitle') ?>"/>
- <?php echo $this->makeSearchInput(array( "id" => "searchInput" )); ?>
+ <form action="<?php $this->text( 'wgScript' ) ?>" id="searchform">
+ <input type='hidden' name="title" value="<?php $this->text( 'searchtitle' ) ?>"/>
+ <?php echo $this->makeSearchInput( array( "id" => "searchInput" ) ); ?>
- <?php echo $this->makeSearchButton("go", array( "id" => "searchGoButton", "class" => "searchButton" ));
- if ($wgUseTwoButtonsSearchForm): ?>&#160;
- <?php echo $this->makeSearchButton("fulltext", array( "id" => "mw-searchButton", "class" => "searchButton" ));
- else: ?>
+ <?php echo $this->makeSearchButton( "go", array( "id" => "searchGoButton", "class" => "searchButton" ) );
+ if ( $wgUseTwoButtonsSearchForm ) { ?>&#160;
+ <?php echo $this->makeSearchButton( "fulltext", array( "id" => "mw-searchButton", "class" => "searchButton" ) );
+ } else { ?>
- <div><a href="<?php $this->text('searchaction') ?>" rel="search"><?php $this->msg('powersearch-legend') ?></a></div><?php
- endif; ?>
+ <div><a href="<?php $this->text( 'searchaction' ) ?>" rel="search"><?php $this->msg( 'powersearch-legend' ) ?></a></div><?php
+ } ?>
</form>
</div>
@@ -232,10 +233,10 @@ echo $footerEnd;
function cactions() {
?>
<div id="p-cactions" class="portlet" role="navigation">
- <h3><?php $this->msg('views') ?></h3>
+ <h3><?php $this->msg( 'views' ) ?></h3>
<div class="pBody">
<ul><?php
- foreach($this->data['content_actions'] as $key => $tab) {
+ foreach ( $this->data['content_actions'] as $key => $tab ) {
echo '
' . $this->makeListItem( $key, $tab );
} ?>
@@ -249,12 +250,12 @@ echo $footerEnd;
function toolbox() {
?>
<div class="portlet" id="p-tb" role="navigation">
- <h3><?php $this->msg('toolbox') ?></h3>
+ <h3><?php $this->msg( 'toolbox' ) ?></h3>
<div class="pBody">
<ul>
<?php
foreach ( $this->getToolbox() as $key => $tbitem ) { ?>
- <?php echo $this->makeListItem($key, $tbitem); ?>
+ <?php echo $this->makeListItem( $key, $tbitem ); ?>
<?php
}
@@ -269,14 +270,14 @@ echo $footerEnd;
/*************************************************************************************************/
function languageBox() {
- if( $this->data['language_urls'] ) {
+ if ( $this->data['language_urls'] ) {
?>
<div id="p-lang" class="portlet" role="navigation">
- <h3<?php $this->html('userlangattributes') ?>><?php $this->msg('otherlanguages') ?></h3>
+ <h3<?php $this->html( 'userlangattributes' ) ?>><?php $this->msg( 'otherlanguages' ) ?></h3>
<div class="pBody">
<ul>
-<?php foreach($this->data['language_urls'] as $key => $langlink) { ?>
- <?php echo $this->makeListItem($key, $langlink); ?>
+<?php foreach ( $this->data['language_urls'] as $key => $langlink ) { ?>
+ <?php echo $this->makeListItem( $key, $langlink ); ?>
<?php } ?>
</ul>
@@ -298,14 +299,15 @@ echo $footerEnd;
$portletAttribs['title'] = $tooltip;
}
echo ' ' . Html::openElement( 'div', $portletAttribs );
+ $msgObj = wfMessage( $bar );
?>
- <h3><?php $msg = wfMessage( $bar ); echo htmlspecialchars( $msg->exists() ? $msg->text() : $bar ); ?></h3>
+ <h3><?php echo htmlspecialchars( $msgObj->exists() ? $msgObj->text() : $bar ); ?></h3>
<div class='pBody'>
<?php if ( is_array( $cont ) ) { ?>
<ul>
-<?php foreach($cont as $key => $val) { ?>
- <?php echo $this->makeListItem($key, $val); ?>
+<?php foreach ( $cont as $key => $val ) { ?>
+ <?php echo $this->makeListItem( $key, $val ); ?>
<?php } ?>
</ul>
diff --git a/skins/Nostalgia.php b/skins/Nostalgia.php
deleted file mode 100644
index 3028915e..00000000
--- a/skins/Nostalgia.php
+++ /dev/null
@@ -1,147 +0,0 @@
-<?php
-/**
- * Nostalgia: A skin which looks like Wikipedia did in its first year (2001).
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License along
- * with this program; if not, write 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 Skins
- */
-
-if( !defined( 'MEDIAWIKI' ) ) {
- die( -1 );
-}
-
-/**
- * @todo document
- * @ingroup Skins
- */
-class SkinNostalgia extends SkinLegacy {
- var $skinname = 'nostalgia', $stylename = 'nostalgia',
- $template = 'NostalgiaTemplate';
-
- /**
- * @param $out OutputPage
- */
- function setupSkinUserCss( OutputPage $out ) {
- parent::setupSkinUserCss( $out );
- $out->addModuleStyles( 'skins.nostalgia' );
- }
-
-}
-
-class NostalgiaTemplate extends LegacyTemplate {
-
- /**
- * @return string
- */
- function doBeforeContent() {
- $s = "\n<div id='content'>\n<div id='top'>\n";
- $s .= '<div id="logo">' . $this->getSkin()->logoText( 'right' ) . '</div>';
-
- $s .= $this->pageTitle();
- $s .= $this->pageSubtitle() . "\n";
-
- $s .= '<div id="topbar">';
- $s .= $this->topLinks() . "\n<br />";
-
- $notice = $this->getSkin()->getSiteNotice();
- if( $notice ) {
- $s .= "\n<div id='siteNotice'>$notice</div>\n";
- }
- $s .= $this->pageTitleLinks();
-
- $ol = $this->otherLanguages();
- if( $ol ) {
- $s .= '<br />' . $ol;
- }
-
- $s .= $this->getSkin()->getCategories();
-
- $s .= "<br clear='all' /></div><hr />\n</div>\n";
- $s .= "\n<div id='article'>";
-
- return $s;
- }
-
- /**
- * @return string
- */
- function topLinks() {
- $sep = " |\n";
-
- $s = $this->getSkin()->mainPageLink() . $sep
- . Linker::specialLink( 'Recentchanges' );
-
- if ( $this->data['isarticle'] ) {
- $s .= $sep . '<strong>' . $this->editThisPage() . '</strong>' . $sep . $this->talkLink() .
- $sep . $this->historyLink();
- }
-
- /* show links to different language variants */
- $s .= $this->variantLinks();
- $s .= $this->extensionTabLinks();
- if ( !$this->data['loggedin'] ) {
- $s .= $sep . Linker::specialLink( 'Userlogin' );
- } else {
- /* show user page and user talk links */
- $user = $this->getSkin()->getUser();
- $s .= $sep . Linker::link( $user->getUserPage(), wfMessage( 'mypage' )->escaped() );
- $s .= $sep . Linker::link( $user->getTalkPage(), wfMessage( 'mytalk' )->escaped() );
- if ( $user->getNewtalk() ) {
- $s .= ' *';
- }
- /* show watchlist link */
- $s .= $sep . Linker::specialLink( 'Watchlist' );
- /* show my contributions link */
- $s .= $sep . Linker::link(
- SpecialPage::getSafeTitleFor( 'Contributions', $this->data['username'] ),
- wfMessage( 'mycontris' )->escaped() );
- /* show my preferences link */
- $s .= $sep . Linker::specialLink( 'Preferences' );
- /* show upload file link */
- if( UploadBase::isEnabled() && UploadBase::isAllowed( $user ) === true ) {
- $s .= $sep . $this->getUploadLink();
- }
-
- /* show log out link */
- $s .= $sep . Linker::specialLink( 'Userlogout' );
- }
-
- $s .= $sep . $this->specialPagesList();
-
- return $s;
- }
-
- /**
- * @return string
- */
- function doAfterContent() {
- $s = "\n</div><br clear='all' />\n";
-
- $s .= "\n<div id='footer'><hr />";
-
- $s .= $this->bottomLinks();
- $s .= "\n<br />" . $this->pageStats();
- $s .= "\n<br />" . $this->getSkin()->mainPageLink()
- . ' | ' . $this->getSkin()->aboutLink()
- . ' | ' . $this->searchForm();
-
- $s .= "\n</div>\n</div>\n";
-
- return $s;
- }
-}
diff --git a/skins/Simple.php b/skins/Simple.php
deleted file mode 100644
index 9a3ab946..00000000
--- a/skins/Simple.php
+++ /dev/null
@@ -1,58 +0,0 @@
-<?php
-/**
- * Simple: A lightweight skin with a simple white-background sidebar and no
- * top bar.
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License along
- * with this program; if not, write 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 Skins
- */
-
-if( !defined( 'MEDIAWIKI' ) )
- die( -1 );
-
-/** */
-require_once( __DIR__ . '/MonoBook.php' );
-
-/**
- * Inherit main code from SkinTemplate, set the CSS and template filter.
- * @ingroup Skins
- */
-class SkinSimple extends SkinTemplate {
- var $skinname = 'simple', $stylename = 'simple',
- $template = 'MonoBookTemplate', $useHeadElement = true;
-
- /**
- * @param $out OutputPage
- */
- function setupSkinUserCss( OutputPage $out ) {
- parent::setupSkinUserCss( $out );
-
- $out->addModuleStyles( 'skins.simple' );
-
- /* Add some userprefs specific CSS styling */
- $rules = array();
- $underline = "";
-
- if ( $this->getUser()->getOption( 'underline' ) < 2 ) {
- $underline = "text-decoration: " . $this->getUser()->getOption( 'underline' ) ? 'underline !important' : 'none' . ";";
- }
- $style = implode( "\n", $rules );
- $out->addInlineStyle( $style, 'flip' );
-
- }
-}
diff --git a/skins/Standard.php b/skins/Standard.php
deleted file mode 100644
index 5b358e06..00000000
--- a/skins/Standard.php
+++ /dev/null
@@ -1,294 +0,0 @@
-<?php
-/**
- * Standard (a.k.a. Classic) skin: old MediaWiki default skin
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License along
- * with this program; if not, write 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 Skins
- */
-
-if( !defined( 'MEDIAWIKI' ) ) {
- die( -1 );
-}
-
-/**
- * @todo document
- * @ingroup Skins
- */
-class SkinStandard extends SkinLegacy {
- var $skinname = 'standard', $stylename = 'standard',
- $template = 'StandardTemplate';
-
- /**
- * @param $out OutputPage
- */
- function setupSkinUserCss( OutputPage $out ) {
- parent::setupSkinUserCss( $out );
- $out->addModuleStyles( 'skins.standard' );
-
- $qb = $this->qbSetting();
- $rules = array();
-
- if ( 2 == $qb ) { # Right
- $rules[] = "/* @noflip */#quickbar { position: absolute; top: 4px; right: 4px; border-left: 2px solid #000000; }";
- $rules[] = "/* @noflip */#article, #mw-data-after-content { margin-left: 4px; margin-right: 152px; }";
- $rules[] = "/* @noflip */#topbar, #footer { margin-right: 152px; }";
- } elseif ( 1 == $qb || 3 == $qb ) {
- $rules[] = "/* @noflip */#quickbar { position: absolute; top: 4px; left: 4px; border-right: 1px solid gray; }";
- $rules[] = "/* @noflip */#article, #mw-data-after-content { margin-left: 152px; margin-right: 4px; }";
- $rules[] = "/* @noflip */#topbar, #footer { margin-left: 152px; }";
- if( 3 == $qb ) {
- $rules[] = "/* @noflip */#quickbar { position: fixed; padding: 4px; }";
- }
- } elseif ( 4 == $qb ) {
- $rules[] = "/* @noflip */#quickbar { position: fixed; right: 0; top: 0; padding: 4px; }";
- $rules[] = "/* @noflip */#quickbar { border-right: 1px solid gray; }";
- $rules[] = "/* @noflip */#article, #mw-data-after-content { margin-right: 152px; margin-left: 4px; }";
- $rules[] = "/* @noflip */#topbar, #footer { margin-right: 152px; }";
- }
- $style = implode( "\n", $rules );
- $out->addInlineStyle( $style, 'flip' );
- }
-
-}
-
-class StandardTemplate extends LegacyTemplate {
-
- /**
- * @return string
- */
- function doAfterContent() {
- wfProfileIn( __METHOD__ );
- wfProfileIn( __METHOD__ . '-1' );
-
- $s = "\n</div><br style=\"clear:both\" />\n";
- $s .= "\n<div id='footer'>";
- $s .= '<table cellspacing="0"><tr>';
-
- wfProfileOut( __METHOD__ . '-1' );
- wfProfileIn( __METHOD__ . '-2' );
- $l = $this->getSkin()->getLanguage()->alignStart();
- $s .= "<td class='bottom' style='text-align: $l; vertical-align: top;'>";
-
- $s .= $this->bottomLinks();
- $s .= "\n<br />" . $this->getSkin()->getLanguage()->pipeList( array(
- $this->getSkin()->mainPageLink(),
- $this->getSkin()->aboutLink(),
- Linker::specialLink( 'Recentchanges' ),
- $this->searchForm() ) )
- . '<br /><span id="pagestats">' . $this->pageStats() . '</span>';
-
- $s .= '</td>';
- $s .= "</tr></table>\n</div>\n</div>\n";
-
- wfProfileOut( __METHOD__ . '-2' );
- wfProfileIn( __METHOD__ . '-3' );
- if ( $this->getSkin()->qbSetting() != 0 ) {
- $s .= $this->quickBar();
- }
- wfProfileOut( __METHOD__ . '-3' );
- wfProfileOut( __METHOD__ );
- return $s;
- }
-
- /**
- * @return string
- */
- function quickBar() {
- global $wgContLang;
-
- wfProfileIn( __METHOD__ );
-
- $action = $this->getSkin()->getRequest()->getText( 'action' );
- $wpPreview = $this->getSkin()->getRequest()->getBool( 'wpPreview' );
- $title = $this->getSkin()->getTitle();
- $tns = $title->getNamespace();
-
- $s = "\n<div id='quickbar'>";
- $s .= "\n" . $this->getSkin()->logoText() . "\n<hr class='sep' />";
-
- $sep = "\n<br />";
-
- # Use the first heading from the Monobook sidebar as the "browse" section
- $bar = $this->getSkin()->buildSidebar();
- unset( $bar['SEARCH'] );
- unset( $bar['LANGUAGES'] );
- unset( $bar['TOOLBOX'] );
-
- $barnumber = 1;
- foreach ( $bar as $browseLinks ) {
- if ( is_array( $browseLinks ) ) {
- if ( $barnumber > 1 ) {
- $s .= "\n<hr class='sep' />";
- }
- foreach ( $browseLinks as $link ) {
- if ( $link['text'] != '-' ) {
- $s .= "<a href=\"{$link['href']}\">" .
- htmlspecialchars( $link['text'] ) . '</a>' . $sep;
- }
- }
- }
- if ( $barnumber == 1 ) {
- // only show watchlist link if logged in
- if( $this->data['loggedin'] ) {
- $s.= Linker::specialLink( 'Watchlist' ) ;
- $s .= $sep . Linker::linkKnown(
- SpecialPage::getTitleFor( 'Contributions' ),
- wfMessage( 'mycontris' )->escaped(),
- array(),
- array( 'target' => $this->data['username'] )
- );
- }
- }
- $barnumber = $barnumber + 1;
- }
-
- $s .= "\n<hr class='sep' />";
- $articleExists = $title->getArticleID();
- if ( $this->data['isarticle'] || $action == 'edit' || $action == 'history' || $wpPreview ) {
- if( $this->data['isarticle'] ) {
- $s .= '<strong>' . $this->editThisPage() . '</strong>';
- } else { # backlink to the article in edit or history mode
- if( $articleExists ){ # no backlink if no article
- switch( $tns ) {
- case NS_TALK:
- case NS_USER_TALK:
- case NS_PROJECT_TALK:
- case NS_FILE_TALK:
- case NS_MEDIAWIKI_TALK:
- case NS_TEMPLATE_TALK:
- case NS_HELP_TALK:
- case NS_CATEGORY_TALK:
- $text = wfMessage('viewtalkpage');
- break;
- case NS_MAIN:
- $text = wfMessage( 'articlepage' );
- break;
- case NS_USER:
- $text = wfMessage( 'userpage' );
- break;
- case NS_PROJECT:
- $text = wfMessage( 'projectpage' );
- break;
- case NS_FILE:
- $text = wfMessage( 'imagepage' );
- break;
- case NS_MEDIAWIKI:
- $text = wfMessage( 'mediawikipage' );
- break;
- case NS_TEMPLATE:
- $text = wfMessage( 'templatepage' );
- break;
- case NS_HELP:
- $text = wfMessage( 'viewhelppage' );
- break;
- case NS_CATEGORY:
- $text = wfMessage( 'categorypage' );
- break;
- default:
- $text = wfMessage( 'articlepage' );
- }
-
- $link = $title->getText();
- $nstext = $wgContLang->getNsText( $tns );
- if( $nstext ) { # add namespace if necessary
- $link = $nstext . ':' . $link;
- }
-
- $s .= Linker::link( Title::newFromText( $link ), $text->escaped() );
- } elseif( $title->getNamespace() != NS_SPECIAL ) {
- # we just throw in a "New page" text to tell the user that he's in edit mode,
- # and to avoid messing with the separator that is prepended to the next item
- $s .= '<strong>' . wfMessage( 'newpage' )->escaped() . '</strong>';
- }
- }
-
- # "Post a comment" link
- if( ( $title->isTalkPage() || $this->getSkin()->getOutput()->showNewSectionLink() ) && $action != 'edit' && !$wpPreview )
- $s .= '<br />' . Linker::link(
- $title,
- wfMessage( 'postcomment' )->escaped(),
- 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
- * article with "Watch this article" checkbox disabled, the article is transparently
- * unwatched. Therefore we do not show the "Watch this page" link in edit mode.
- */
- if ( $this->data['loggedin'] && $articleExists ) {
- if( $action != 'edit' && $action != 'submit' ) {
- $s .= $sep . $this->watchThisPage();
- }
- if ( $title->userCan( 'edit' ) )
- $s .= $sep . $this->moveThisPage();
- }
- if ( $this->getSkin()->getUser()->isAllowed( 'delete' ) && $articleExists ) {
- $s .= $sep . $this->deleteThisPage() .
- $sep . $this->protectThisPage();
- }
- $s .= $sep . $this->talkLink();
- if( $articleExists && $action != 'history' ) {
- $s .= $sep . $this->historyLink();
- }
- $s .= $sep . $this->whatLinksHere();
-
- if( $this->getSkin()->getOutput()->isArticleRelated() ) {
- $s .= $sep . $this->watchPageLinksLink();
- }
-
- if (
- NS_USER == $title->getNamespace() ||
- $title->getNamespace() == NS_USER_TALK
- ) {
-
- $id = User::idFromName( $title->getText() );
- $ip = User::isIP( $title->getText() );
-
- if( $id || $ip ){
- $s .= $sep . $this->userContribsLink();
- }
- if( $this->getSkin()->showEmailUser( $id ) ) {
- $s .= $sep . $this->emailUserLink();
- }
- }
- $s .= "\n<br /><hr class='sep' />";
- }
-
- if( UploadBase::isEnabled() && UploadBase::isAllowed( $this->getSkin()->getUser() ) === true ) {
- $s .= $this->getUploadLink() . $sep;
- }
-
- $s .= Linker::specialLink( 'Specialpages' );
-
- global $wgSiteSupportPage;
- if( $wgSiteSupportPage ) {
- $s .= "\n<br /><a href=\"" . htmlspecialchars( $wgSiteSupportPage ) .
- '" class="internal">' . wfMessage( 'sitesupport' )->escaped() . '</a>';
- }
-
- $s .= "\n<br /></div>\n";
- wfProfileOut( __METHOD__ );
- return $s;
- }
-}
diff --git a/skins/Vector.php b/skins/Vector.php
index d0f99951..288b5fd6 100644
--- a/skins/Vector.php
+++ b/skins/Vector.php
@@ -23,7 +23,7 @@
* @ingroup Skins
*/
-if( !defined( 'MEDIAWIKI' ) ) {
+if ( !defined( 'MEDIAWIKI' ) ) {
die( -1 );
}
@@ -48,7 +48,7 @@ class SkinVector extends SkinTemplate {
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
+ // this is better than including this in a CSS file since it doesn't
// wait for the CSS file to load before fetching the HTC file.
$min = $this->getRequest()->getFuzzyBool( 'debug' ) ? '' : '.min';
$out->addHeadItem( 'csshover',
@@ -57,17 +57,19 @@ class SkinVector extends SkinTemplate {
"/{$this->stylename}/csshover{$min}.htc\")}</style><![endif]-->"
);
- $out->addModules( 'skins.vector.js' );
+ $out->addModules( array( 'skins.vector.js', 'skins.vector.collapsibleNav' ) );
}
/**
- * Load skin and user CSS files in the correct order
- * fixes bug 22916
+ * Loads skin and user CSS files.
* @param $out OutputPage object
*/
function setupSkinUserCss( OutputPage $out ) {
parent::setupSkinUserCss( $out );
- $out->addModuleStyles( 'skins.vector' );
+
+ $styles = array( 'skins.vector' );
+ wfRunHooks( 'SkinVectorStyleModules', array( &$this, &$styles ) );
+ $out->addModuleStyles( $styles );
}
/**
@@ -155,81 +157,50 @@ class VectorTemplate extends BaseTemplate {
?>
<div id="mw-page-base" class="noprint"></div>
<div id="mw-head-base" class="noprint"></div>
- <!-- content -->
<div id="content" class="mw-body" role="main">
<a id="top"></a>
<div id="mw-js-message" style="display:none;"<?php $this->html( 'userlangattributes' ) ?>></div>
- <?php if ( $this->data['sitenotice'] ): ?>
- <!-- sitenotice -->
+ <?php if ( $this->data['sitenotice'] ) { ?>
<div id="siteNotice"><?php $this->html( 'sitenotice' ) ?></div>
- <!-- /sitenotice -->
- <?php endif; ?>
- <!-- firstHeading -->
+ <?php } ?>
<h1 id="firstHeading" class="firstHeading" lang="<?php
- $this->data['pageLanguage'] = $this->getSkin()->getTitle()->getPageViewLanguage()->getCode();
- $this->html( 'pageLanguage' );
+ $this->data['pageLanguage'] = $this->getSkin()->getTitle()->getPageViewLanguage()->getHtmlCode();
+ $this->text( 'pageLanguage' );
?>"><span dir="auto"><?php $this->html( 'title' ) ?></span></h1>
- <!-- /firstHeading -->
- <!-- bodyContent -->
<div id="bodyContent">
- <?php if ( $this->data['isarticle'] ): ?>
- <!-- tagline -->
+ <?php if ( $this->data['isarticle'] ) { ?>
<div id="siteSub"><?php $this->msg( 'tagline' ) ?></div>
- <!-- /tagline -->
- <?php endif; ?>
- <!-- subtitle -->
+ <?php } ?>
<div id="contentSub"<?php $this->html( 'userlangattributes' ) ?>><?php $this->html( 'subtitle' ) ?></div>
- <!-- /subtitle -->
- <?php if ( $this->data['undelete'] ): ?>
- <!-- undelete -->
+ <?php if ( $this->data['undelete'] ) { ?>
<div id="contentSub2"><?php $this->html( 'undelete' ) ?></div>
- <!-- /undelete -->
- <?php endif; ?>
- <?php if( $this->data['newtalk'] ): ?>
- <!-- newtalk -->
- <div class="usermessage"><?php $this->html( 'newtalk' ) ?></div>
- <!-- /newtalk -->
- <?php endif; ?>
- <?php if ( $this->data['showjumplinks'] ): ?>
- <!-- jumpto -->
+ <?php } ?>
+ <?php if ( $this->data['newtalk'] ) { ?>
+ <div class="usermessage"><?php $this->html( 'newtalk' ) ?></div>
+ <?php } ?>
<div id="jump-to-nav" class="mw-jump">
<?php $this->msg( 'jumpto' ) ?>
<a href="#mw-navigation"><?php $this->msg( 'jumptonavigation' ) ?></a><?php $this->msg( 'comma-separator' ) ?>
<a href="#p-search"><?php $this->msg( 'jumptosearch' ) ?></a>
</div>
- <!-- /jumpto -->
- <?php endif; ?>
- <!-- bodycontent -->
<?php $this->html( 'bodycontent' ) ?>
- <!-- /bodycontent -->
- <?php if ( $this->data['printfooter'] ): ?>
- <!-- printfooter -->
+ <?php if ( $this->data['printfooter'] ) { ?>
<div class="printfooter">
<?php $this->html( 'printfooter' ); ?>
</div>
- <!-- /printfooter -->
- <?php endif; ?>
- <?php if ( $this->data['catlinks'] ): ?>
- <!-- catlinks -->
+ <?php } ?>
+ <?php if ( $this->data['catlinks'] ) { ?>
<?php $this->html( 'catlinks' ); ?>
- <!-- /catlinks -->
- <?php endif; ?>
- <?php if ( $this->data['dataAfterContent'] ): ?>
- <!-- dataAfterContent -->
+ <?php } ?>
+ <?php if ( $this->data['dataAfterContent'] ) { ?>
<?php $this->html( 'dataAfterContent' ); ?>
- <!-- /dataAfterContent -->
- <?php endif; ?>
+ <?php } ?>
<div class="visualClear"></div>
- <!-- debughtml -->
<?php $this->html( 'debughtml' ); ?>
- <!-- /debughtml -->
</div>
- <!-- /bodyContent -->
</div>
- <!-- /content -->
<div id="mw-navigation">
<h2><?php $this->msg( 'navigation-heading' ) ?></h2>
- <!-- header -->
<div id="mw-head">
<?php $this->renderNavigation( 'PERSONAL' ); ?>
<div id="left-navigation">
@@ -239,41 +210,34 @@ class VectorTemplate extends BaseTemplate {
<?php $this->renderNavigation( array( 'VIEWS', 'ACTIONS', 'SEARCH' ) ); ?>
</div>
</div>
- <!-- /header -->
- <!-- panel -->
<div id="mw-panel">
- <!-- logo -->
<div id="p-logo" role="banner"><a style="background-image: url(<?php $this->text( 'logopath' ) ?>);" href="<?php echo htmlspecialchars( $this->data['nav_urls']['mainpage']['href'] ) ?>" <?php echo Xml::expandAttributes( Linker::tooltipAndAccesskeyAttribs( 'p-logo' ) ) ?>></a></div>
- <!-- /logo -->
<?php $this->renderPortals( $this->data['sidebar'] ); ?>
</div>
- <!-- /panel -->
</div>
- <!-- footer -->
<div id="footer" role="contentinfo"<?php $this->html( 'userlangattributes' ) ?>>
- <?php foreach( $this->getFooterLinks() as $category => $links ): ?>
+ <?php foreach ( $this->getFooterLinks() as $category => $links ) { ?>
<ul id="footer-<?php echo $category ?>">
- <?php foreach( $links as $link ): ?>
+ <?php foreach ( $links as $link ) { ?>
<li id="footer-<?php echo $category ?>-<?php echo $link ?>"><?php $this->html( $link ) ?></li>
- <?php endforeach; ?>
+ <?php } ?>
</ul>
- <?php endforeach; ?>
- <?php $footericons = $this->getFooterIcons("icononly");
- if ( count( $footericons ) > 0 ): ?>
+ <?php } ?>
+ <?php $footericons = $this->getFooterIcons( "icononly" );
+ if ( count( $footericons ) > 0 ) { ?>
<ul id="footer-icons" class="noprint">
-<?php foreach ( $footericons as $blockName => $footerIcons ): ?>
+<?php foreach ( $footericons as $blockName => $footerIcons ) { ?>
<li id="footer-<?php echo htmlspecialchars( $blockName ); ?>ico">
-<?php foreach ( $footerIcons as $icon ): ?>
+<?php foreach ( $footerIcons as $icon ) { ?>
<?php echo $this->getSkin()->makeFooterIcon( $icon ); ?>
-<?php endforeach; ?>
+<?php } ?>
</li>
-<?php endforeach; ?>
+<?php } ?>
</ul>
- <?php endif; ?>
+ <?php } ?>
<div style="clear:both"></div>
</div>
- <!-- /footer -->
<?php $this->printTrail(); ?>
</body>
@@ -299,11 +263,11 @@ class VectorTemplate extends BaseTemplate {
}
// Render portals
foreach ( $portals as $name => $content ) {
- if ( $content === false )
+ if ( $content === false ) {
continue;
+ }
- echo "\n<!-- {$name} -->\n";
- switch( $name ) {
+ switch ( $name ) {
case 'SEARCH':
break;
case 'TOOLBOX':
@@ -318,7 +282,6 @@ class VectorTemplate extends BaseTemplate {
$this->renderPortal( $name, $content );
break;
}
- echo "\n<!-- /{$name} -->\n";
}
}
@@ -332,29 +295,30 @@ class VectorTemplate extends BaseTemplate {
if ( $msg === null ) {
$msg = $name;
}
+ $msgObj = wfMessage( $msg );
?>
-<div class="portal" role="navigation" id='<?php echo Sanitizer::escapeId( "p-$name" ) ?>'<?php echo Linker::tooltip( 'p-' . $name ) ?>>
- <h3<?php $this->html( 'userlangattributes' ) ?>><?php $msgObj = wfMessage( $msg ); echo htmlspecialchars( $msgObj->exists() ? $msgObj->text() : $msg ); ?></h3>
+<div class="portal" role="navigation" id='<?php echo Sanitizer::escapeId( "p-$name" ) ?>'<?php echo Linker::tooltip( 'p-' . $name ) ?> aria-labelledby='<?php echo Sanitizer::escapeId( "p-$name-label" ) ?>'>
+ <h3<?php $this->html( 'userlangattributes' ) ?> id='<?php echo Sanitizer::escapeId( "p-$name-label" ) ?>'><?php echo htmlspecialchars( $msgObj->exists() ? $msgObj->text() : $msg ); ?></h3>
<div class="body">
<?php
- if ( is_array( $content ) ): ?>
+ if ( is_array( $content ) ) { ?>
<ul>
<?php
- foreach( $content as $key => $val ): ?>
+ foreach ( $content as $key => $val ) { ?>
<?php echo $this->makeListItem( $key, $val ); ?>
<?php
- endforeach;
+ }
if ( $hook !== null ) {
wfRunHooks( $hook, array( &$this, true ) );
}
?>
</ul>
<?php
- else: ?>
+ } else { ?>
<?php echo $content; /* Allow raw HTML block to be defined by extensions */ ?>
<?php
- endif; ?>
+ } ?>
</div>
</div>
<?php
@@ -379,36 +343,35 @@ class VectorTemplate extends BaseTemplate {
}
// Render elements
foreach ( $elements as $name => $element ) {
- echo "\n<!-- {$name} -->\n";
switch ( $element ) {
case 'NAMESPACES':
?>
-<div id="p-namespaces" role="navigation" class="vectorTabs<?php if ( count( $this->data['namespace_urls'] ) == 0 ) echo ' emptyPortlet'; ?>">
- <h3><?php $this->msg( 'namespaces' ) ?></h3>
+<div id="p-namespaces" role="navigation" class="vectorTabs<?php if ( count( $this->data['namespace_urls'] ) == 0 ) { echo ' emptyPortlet'; } ?>" aria-labelledby="p-namespaces-label">
+ <h3 id="p-namespaces-label"><?php $this->msg( 'namespaces' ) ?></h3>
<ul<?php $this->html( 'userlangattributes' ) ?>>
- <?php foreach ( $this->data['namespace_urls'] as $link ): ?>
+ <?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; ?>
+ <?php } ?>
</ul>
</div>
<?php
break;
case 'VARIANTS':
?>
-<div id="p-variants" role="navigation" class="vectorMenu<?php if ( count( $this->data['variant_urls'] ) == 0 ) echo ' emptyPortlet'; ?>">
+<div id="p-variants" role="navigation" class="vectorMenu<?php if ( count( $this->data['variant_urls'] ) == 0 ) { echo ' emptyPortlet'; } ?>" aria-labelledby="p-variants-label">
<h3 id="mw-vector-current-variant">
- <?php foreach ( $this->data['variant_urls'] as $link ): ?>
- <?php if ( stripos( $link['attributes'], 'selected' ) !== false ): ?>
+ <?php foreach ( $this->data['variant_urls'] as $link ) { ?>
+ <?php if ( stripos( $link['attributes'], 'selected' ) !== false ) { ?>
<?php echo htmlspecialchars( $link['text'] ) ?>
- <?php endif; ?>
- <?php endforeach; ?>
+ <?php } ?>
+ <?php } ?>
</h3>
- <h3><span><?php $this->msg( 'variants' ) ?></span><a href="#"></a></h3>
+ <h3 id="p-variants-label"><span><?php $this->msg( 'variants' ) ?></span><a href="#"></a></h3>
<div class="menu">
<ul>
- <?php foreach ( $this->data['variant_urls'] as $link ): ?>
+ <?php foreach ( $this->data['variant_urls'] as $link ) { ?>
<li<?php echo $link['attributes'] ?>><a href="<?php echo htmlspecialchars( $link['href'] ) ?>" lang="<?php echo htmlspecialchars( $link['lang'] ) ?>" hreflang="<?php echo htmlspecialchars( $link['hreflang'] ) ?>" <?php echo $link['key'] ?>><?php echo htmlspecialchars( $link['text'] ) ?></a></li>
- <?php endforeach; ?>
+ <?php } ?>
</ul>
</div>
</div>
@@ -416,30 +379,30 @@ class VectorTemplate extends BaseTemplate {
break;
case 'VIEWS':
?>
-<div id="p-views" role="navigation" class="vectorTabs<?php if ( count( $this->data['view_urls'] ) == 0 ) { echo ' emptyPortlet'; } ?>">
- <h3><?php $this->msg('views') ?></h3>
- <ul<?php $this->html('userlangattributes') ?>>
- <?php foreach ( $this->data['view_urls'] as $link ): ?>
+<div id="p-views" role="navigation" class="vectorTabs<?php if ( count( $this->data['view_urls'] ) == 0 ) { echo ' emptyPortlet'; } ?>" aria-labelledby="p-views-label">
+ <h3 id="p-views-label"><?php $this->msg( 'views' ) ?></h3>
+ <ul<?php $this->html( 'userlangattributes' ) ?>>
+ <?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
// $link['text'] can be undefined - bug 27764
if ( array_key_exists( 'text', $link ) ) {
- echo array_key_exists( 'img', $link ) ? '<img src="' . $link['img'] . '" alt="' . $link['text'] . '" />' : htmlspecialchars( $link['text'] );
+ echo array_key_exists( 'img', $link ) ? '<img src="' . $link['img'] . '" alt="' . $link['text'] . '" />' : htmlspecialchars( $link['text'] );
}
?></a></span></li>
- <?php endforeach; ?>
+ <?php } ?>
</ul>
</div>
<?php
break;
case 'ACTIONS':
?>
-<div id="p-cactions" role="navigation" class="vectorMenu<?php if ( count( $this->data['action_urls'] ) == 0 ) echo ' emptyPortlet'; ?>">
- <h3><span><?php $this->msg( 'actions' ) ?></span><a href="#"></a></h3>
+<div id="p-cactions" role="navigation" class="vectorMenu<?php if ( count( $this->data['action_urls'] ) == 0 ) { echo ' emptyPortlet'; } ?>" aria-labelledby="p-cactions-label">
+ <h3 id="p-cactions-label"><span><?php $this->msg( 'actions' ) ?></span><a href="#"></a></h3>
<div class="menu">
<ul<?php $this->html( 'userlangattributes' ) ?>>
- <?php foreach ( $this->data['action_urls'] as $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; ?>
+ <?php } ?>
</ul>
</div>
</div>
@@ -447,8 +410,8 @@ class VectorTemplate extends BaseTemplate {
break;
case 'PERSONAL':
?>
-<div id="p-personal" role="navigation" class="<?php if ( count( $this->data['personal_urls'] ) == 0 ) echo ' emptyPortlet'; ?>">
- <h3><?php $this->msg( 'personaltools' ) ?></h3>
+<div id="p-personal" role="navigation" class="<?php if ( count( $this->data['personal_urls'] ) == 0 ) { echo ' emptyPortlet'; } ?>" aria-labelledby="p-personal-label">
+ <h3 id="p-personal-label"><?php $this->msg( 'personaltools' ) ?></h3>
<ul<?php $this->html( 'userlangattributes' ) ?>>
<?php
$personalTools = $this->getPersonalTools();
@@ -465,21 +428,21 @@ class VectorTemplate extends BaseTemplate {
<div id="p-search" role="search">
<h3<?php $this->html( 'userlangattributes' ) ?>><label for="searchInput"><?php $this->msg( 'search' ) ?></label></h3>
<form action="<?php $this->text( 'wgScript' ) ?>" id="searchform">
- <?php if ( $wgVectorUseSimpleSearch && $this->getSkin()->getUser()->getOption( 'vector-simplesearch' ) ): ?>
+ <?php if ( $wgVectorUseSimpleSearch && $this->getSkin()->getUser()->getOption( 'vector-simplesearch' ) ) { ?>
<div id="simpleSearch">
- <?php if ( $this->data['rtl'] ): ?>
+ <?php if ( $this->data['rtl'] ) { ?>
<?php echo $this->makeSearchButton( 'image', array( 'id' => 'searchButton', 'src' => $this->getSkin()->getSkinStylePath( 'images/search-rtl.png' ), 'width' => '12', 'height' => '13' ) ); ?>
- <?php endif; ?>
+ <?php } ?>
<?php echo $this->makeSearchInput( array( 'id' => 'searchInput', 'type' => 'text' ) ); ?>
- <?php if ( !$this->data['rtl'] ): ?>
+ <?php if ( !$this->data['rtl'] ) { ?>
<?php echo $this->makeSearchButton( 'image', array( 'id' => 'searchButton', 'src' => $this->getSkin()->getSkinStylePath( 'images/search-ltr.png' ), 'width' => '12', 'height' => '13' ) ); ?>
- <?php endif; ?>
- <?php else: ?>
+ <?php } ?>
+ <?php } else { ?>
<div>
<?php echo $this->makeSearchInput( array( 'id' => 'searchInput' ) ); ?>
<?php echo $this->makeSearchButton( 'go', array( 'id' => 'searchGoButton', 'class' => 'searchButton' ) ); ?>
<?php echo $this->makeSearchButton( 'fulltext', array( 'id' => 'mw-searchButton', 'class' => 'searchButton' ) ); ?>
- <?php endif; ?>
+ <?php } ?>
<input type='hidden' name="title" value="<?php $this->text( 'searchtitle' ) ?>"/>
</div>
</form>
@@ -488,7 +451,6 @@ class VectorTemplate extends BaseTemplate {
break;
}
- echo "\n<!-- /{$name} -->\n";
}
}
}
diff --git a/skins/archlinux/IE60Fixes.css b/skins/archlinux/IE60Fixes.css
index ec1ce430..534d3333 100644
--- a/skins/archlinux/IE60Fixes.css
+++ b/skins/archlinux/IE60Fixes.css
@@ -70,15 +70,6 @@ div#footer {
#portal-personaltools {
padding-bottom: 0.1em;
}
-#bodyContent a.external {
- background: url(external.png) center right no-repeat;
- padding-right: 13px;
-}
-
-.rtl #bodyContent a.external {
- background-image: url(external-rtl.png);
- padding-right: 13px;
-}
.rtl a.feedlink {
background-position: right;
diff --git a/skins/archlinux/Opera6Fixes.css b/skins/archlinux/Opera6Fixes.css
deleted file mode 100644
index 77dec095..00000000
--- a/skins/archlinux/Opera6Fixes.css
+++ /dev/null
@@ -1,20 +0,0 @@
-/* opera 6 fixes */
-div#column-one {
- position: relative;
- max-width: 11.7em;
-}
-#p-personal {
- width: 45em;
- margin-left: 8.6em;
- right: 0;
-}
-#bodyContent a.external {
- background: url(external.png) center right no-repeat;
- padding-right: 13px;
-}
-
-.rtl a.feedlink {
- background-position: right;
- padding-right: 0;
- padding-left: 16px;
-}
diff --git a/skins/archlinux/Opera7Fixes.css b/skins/archlinux/Opera7Fixes.css
deleted file mode 100644
index 1dcba7c9..00000000
--- a/skins/archlinux/Opera7Fixes.css
+++ /dev/null
@@ -1,21 +0,0 @@
-/* small tweaks for opera seven */
-#p-cactions {
- margin-top: .1em;
-}
-#p-cactions li a {
- top: 2px;
-}
-#bodyContent a.external {
- background: url(external.png) center right no-repeat;
- padding-right: 13px;
-}
-.rtl #bodyContent a.external {
- background-image: url(external-rtl.png);
- padding-right: 13px;
-}
-
-.rtl a.feedlink {
- background-position: right;
- padding-right: 0;
- padding-left: 16px;
-}
diff --git a/skins/archlinux/Opera9Fixes.css b/skins/archlinux/Opera9Fixes.css
deleted file mode 100644
index 9c312a84..00000000
--- a/skins/archlinux/Opera9Fixes.css
+++ /dev/null
@@ -1,11 +0,0 @@
-.rtl #bodyContent a.external {
- background-image: url(external-rtl.png);
- padding-right: 13px;
- padding-left: 0;
-}
-
-.rtl a.feedlink {
- background-position: right;
- padding-right: 0;
- padding-left: 16px;
-}
diff --git a/skins/archlinux/external-ltr.png b/skins/archlinux/external-ltr.png
index acf260fc..63083831 100644
--- a/skins/archlinux/external-ltr.png
+++ b/skins/archlinux/external-ltr.png
Binary files differ
diff --git a/skins/archlinux/external-rtl.png b/skins/archlinux/external-rtl.png
index 7d5ee375..5313234e 100644
--- a/skins/archlinux/external-rtl.png
+++ b/skins/archlinux/external-rtl.png
Binary files differ
diff --git a/skins/archlinux/main.css b/skins/archlinux/main.css
index 4cbc0939..d8f25ebb 100644
--- a/skins/archlinux/main.css
+++ b/skins/archlinux/main.css
@@ -17,7 +17,7 @@ div#column-content {
}
div#content {
margin: 2.8em 0 0 12.2em;
- padding: 0 1em 1em 1em;
+ padding: 1em;
position: relative;
z-index: 2;
}
@@ -93,6 +93,9 @@ pre, .mw-code {
line-height: 1.1em;
}
+#firstHeading {
+ padding-top: 0;
+}
/*
** the main content area
*/
@@ -139,8 +142,7 @@ table.rimage {
** keep the whitespace in front of the ^=, hides rule from konqueror
** this is css3, the validator doesn't like it when validating as css2
*/
-#bodyContent a.external,
-#bodyContent a.external[href ^="gopher://"] {
+#bodyContent a.external {
/* @embed */
background: url(external-ltr.png) center right no-repeat;
padding-right: 13px;
@@ -319,7 +321,7 @@ input.searchButton {
position: absolute;
left: 0;
top: 0;
- z-index: 0;
+ z-index: 3;
}
#p-personal {
width: 100%;
@@ -381,19 +383,22 @@ input.searchButton {
#p-personal li.active a:hover {
background-color: transparent;
}
-/* the icon in front of the user name, single quotes
-in bg url to hide it from iemac */
+/* The icon in front of the username / login link */
li#pt-userpage,
li#pt-anonuserpage,
li#pt-login {
/* @embed */
background: url(user.gif) top left no-repeat;
padding-left: 20px;
- text-transform: none;
}
#p-personal ul {
text-transform: lowercase;
}
+/* Don't lowercase username or IP addresses (IPv6) */
+li#pt-userpage,
+li#pt-anonuserpage {
+ text-transform: none;
+}
#p-personal li.active {
font-weight: bold;
}
@@ -422,14 +427,13 @@ li#pt-login {
display: inline;
border: 1px solid #aaa;
border-bottom: none;
- padding: 0 0 .1em 0;
+ padding: 0 0 1em 0;
margin: 0 .3em 0 0;
overflow: visible;
background: white;
}
#p-cactions li.selected {
border-color: #fabd23;
- padding: 0 0 .2em 0;
font-weight: bold;
}
#p-cactions li a {
@@ -515,7 +519,8 @@ div#footer {
border-top: 1px solid #fabd23;
border-bottom: 1px solid #fabd23;
margin: .6em 0 1em 0;
- padding: .4em 0 1.2em 0;
+ overflow: hidden;
+ padding: .4em 0 .3em 0;
text-align: center;
font-size: 90%;
}
@@ -897,6 +902,5 @@ div.mw-lag-warn-high {
/* mediawiki.notification */
.skin-monobook .mw-notification {
-webkit-box-shadow: 0 2px 5px 0 rgba(0, 0, 0, 0.125);
- -moz-box-shadow: 0 2px 5px 0 rgba(0, 0, 0, 0.125);
box-shadow: 0 2px 5px 0 rgba(0, 0, 0, 0.125);
}
diff --git a/skins/archlinux/wiki-indexed.png b/skins/archlinux/wiki-indexed.png
index 0ec584a3..799ebac8 100644
--- a/skins/archlinux/wiki-indexed.png
+++ b/skins/archlinux/wiki-indexed.png
Binary files differ
diff --git a/skins/chick/IE60Fixes.css b/skins/chick/IE60Fixes.css
deleted file mode 100644
index 18e9655d..00000000
--- a/skins/chick/IE60Fixes.css
+++ /dev/null
@@ -1,79 +0,0 @@
-/* 6.0 - only fixes */
-/* content area */
-/* workaround for various ie float bugs */
-#column-content {
- float: none;
- margin-left: 0;
- height: 1%;
-}
-#column-content #content {
- margin-left: 12.2em;
- margin-top: 3em;
- height: 1%;
-}
-#column-one {
- position: absolute;
- top: 0;
- left: 0;
- z-index: 4;
-}
-#footer {
- margin-left: 13.6em;
- border-left: 1px solid #fabd23;
-}
-
-/* the tabs */
-
-#p-cactions {
- z-index: 3;
-}
-
-#p-cactions li {
- padding-bottom: 0 !important;
- border: none;
- background-color: transparent;
- cursor: default;
- float: none !important;
-}
-#p-cactions li a {
- display: inline-block !important;
- vertical-align: top;
- padding-bottom: 0;
- border: solid #aaa;
- border-width: 1px 1px 0;
-}
-#p-cactions li.selected a {
- border-color: #fabd23;
- padding-bottom: 0.17em;
-}
-#p-cactions li a:hover {
- padding-bottom: 0.17em;
-}
-#portal-personaltools {
- padding-bottom: 0.1em;
-}
-#bodyContent a.external {
- background: url(external.png) center right no-repeat;
- padding-right: 13px;
-}
-
-/* show the hand */
-#p-logo a,
-#p-logo a:hover {
- cursor: pointer;
-}
-div.visualClear {
- width:100%;
- line-height: 0;
-}
-textarea {
- width: 96%;
-}
-
-div.editsection,
-#catlinks,
-div.tright,
-div.tleft {
- position: relative;
-}
-/*{ border:1px solid Red !important;}*/
diff --git a/skins/chick/main.css b/skins/chick/main.css
deleted file mode 100644
index 5e2a2e7a..00000000
--- a/skins/chick/main.css
+++ /dev/null
@@ -1,368 +0,0 @@
-/*
-** MediaWiki 'chick' style sheet for PDAs or other small-screen devices.
-** Copyright Timwi
-** License: GPL (http://www.gnu.org/copyleft/gpl.html)
-**
-** Loosely based on Monobook by Gabriel Wicke
-*/
-
-body {
- font-family: sans-serif;
- color: black;
- background: white;
- margin: 0;
- padding: 0.3em;
-}
-
-a { color: #002bb8; }
-a:visited { color: #5a3696; }
-a:active { color: #ffa500; }
-a.stub { color: #772233; }
-a.new,
-#p-personal a.new { color:#ba0000; }
-a.new:visited,
-#p-personal a.new:visited { color:#a55858; }
-
-img {
- border: none;
- vertical-align: middle;
-}
-p {
- margin: 0.4em 0em 0.5em 0em;
- line-height: 1.5em;
-}
-
-p img { margin: 0; }
-
-hr {
- height: 1px;
- color: #aaaaaa;
- background-color: #aaaaaa;
- border: 0;
- margin: 0.2em 0 0.2em 0;
-}
-
-h1, h2, h3, h4, h5, h6 {
- color: black;
- background: none;
- font-weight: normal;
- margin: 0;
- overflow: hidden;
- padding-top: 0.5em;
- padding-bottom: 0.17em;
- border-bottom: 1px solid #aaaaaa;
-}
-.editsection {
- font-weight: normal;
-}
-h1 { font-size: 188%; }
-h1 .editsection { font-size: 53.2%; }
-h2 { font-size: 150%; }
-h2 .editsection { font-size: 66.7%; }
-h3, h4, h5, h6 {
- border-bottom: none;
- font-weight: bold;
-}
-h3 { font-size: 132%; }
-h3 .editsection { font-size: 75.8%; }
-h4 { font-size: 116%; }
-h4 .editsection { font-size: 86.2%; }
-h5 { font-size: 100%; }
-h6 { font-size: 80%; }
-h6 .editsection { font-size: 125%; }
-
-ul {
- line-height: 1.5em;
- margin: 0.3em 0 0 1.5em;
- padding:0;
-}
-ol {
- line-height: 1.5em;
- margin: 0.3em 0 0 3.2em;
- padding:0;
- list-style-image: none;
-}
-li { margin-bottom: 0.1em; }
-dt {
- font-weight: bold;
- margin-bottom: 0.1em;
-}
-dl{
- margin-top: 0.2em;
- margin-bottom: 0.5em;
-}
-dd {
- line-height: 1.5em;
- margin-left: 2em;
- margin-bottom: 0.1em;
-}
-
-fieldset {
- border: 1px solid #2f6fab;
- margin: 1em 0em 1em 0em;
- padding: 0em 1em 1em 1em;
- line-height: 1.5em;
-}
-legend {
- background: white;
- padding: 0.5em;
- font-size: 95%;
-}
-form {
- border: none;
- margin: 0;
-}
-
-textarea {
- border: 1px solid #2f6fab;
- color: black;
- background-color: white;
- width: 100%;
- padding: 0.1em;
- overflow: auto;
-}
-/* hide this from ie/mac and konq2.2 */
-@media All {
- head:first-child+body input {
- visibility: visible;
- border: 1px solid #2f6fab;
- color: black;
- background-color: white;
- vertical-align: middle;
- padding: 0.2em;
- }
-}
-input.historysubmit {
- padding: 0 0.3em 0.3em 0.3em !important;
- font-size: 94%;
- cursor: pointer;
- height: 1.7em !important;
- margin-left: 1.6em;
-}
-input[type="radio"],
-input[type="checkbox"] { border:none; }
-select {
- border: 1px solid #2f6fab;
- color: black;
- vertical-align: top;
-}
-q {
- font-family: Times, "Times New Roman", serif;
- font-style: italic;
-}
-code { background-color: #f9f9f9; }
-pre, .mw-code {
- padding: 1em;
- border: 1px dashed #2f6fab;
- color: black;
- background-color: #f9f9f9;
- line-height: 1.1em;
-}
-
-/*
-** the main content area
-*/
-
-span.subpages { display: block; }
-
-/* Some space under the headers in the content area */
-#bodyContent h1, #bodyContent h2 { margin-bottom:0.6em; }
-#bodyContent h3,
-#bodyContent h4,
-#bodyContent h5 {
- margin-bottom: 0.3em;
-}
-#firstHeading { margin-bottom:0.1em; }
-
-/* user notification thing */
-.usermessage {
- background-color: #ffce7b;
- border: 1px solid #ffa500;
- color: black;
- font-weight: bold;
- margin: 0.1em 0 0 0;
- padding: 2px 5px;
- vertical-align: middle;
-}
-#siteNotice {
- text-align: center;
- font-size: 95%;
- padding: 0 0.9em 0 0.9em;
-}
-#siteNotice p { margin: 0; padding: 0; }
-.error {
- color: red;
- font-size: larger;
-}
-.catlinks {
- border:1px solid #aaaaaa;
- background-color:#f9f9f9;
- padding: 2px 5px;
- margin: 0.1em 0 0 0;
- clear: both;
-}
-.catlinks { margin: 0; padding: 0; }
-
-/* emulate center */
-.center {
- width: 100%;
- text-align: center;
-}
-*.center * {
- margin-left: auto;
- margin-right: auto;
-}
-/* small for tables and similar */
-.small { font-size: 94%; }
-table.small { font-size: 100% }
-
-/*
-** content styles
-*/
-
-#toc {
- /*border:1px solid #2f6fab;*/
- border:1px solid #aaaaaa;
- background-color:#f9f9f9;
- padding:5px;
- font-size: 95%;
-}
-#toc ul { margin: 0 2em; }
-#toc .toctoggle { font-size: 94%; }
-#toc .editsection {
- margin-top: 0.7em;
- font-size: 94%;
-}
-
-/* images */
-/* @noflip */div.floatright, table.floatright {
- margin: 0;
- border: 0.5em solid white;
- border-width: 0.5em 0 0.8em 1.4em;
-}
-div.floatright p { font-style: italic; }
-/* @noflip */div.floatleft, table.floatleft {
- margin: 0.3em 0.5em 0.5em 0;
- border: 0.5em solid white;
- border-width: 0.5em 1.4em 0.8em 0;
-}
-div.floatleft p { font-style: italic; }
-/* thumbnails */
-div.thumb {
- margin-bottom: 0.5em;
- width: auto;
-}
-div.thumbinner {
- border:1px solid #cccccc;
- padding: 3px !important;
- background-color:#f9f9f9;
- font-size: 94%;
- text-align: center;
- overflow: hidden;
-}
-html .thumbimage {
- border:1px solid #cccccc;
-}
-html .thumbcaption {
- border: none;
- text-align: left;
- line-height: 1.4em;
- padding: 0.3em 0 0.1em 0;
-}
-div.magnify {
- float: right;
- border: none !important;
- background: none !important;
-}
-div.magnify a, div.magnify img {
- display: block;
- border: none !important;
- background: none !important;
-}
-/* @noflip */div.tright {
- margin: 0.5em 0 1.3em 1.4em;
-}
-/* @noflip */div.tleft {
- margin: 0.5em 1.4em 1.3em 0;
-}
-img.thumbborder {
- border: 1px solid #dddddd;
-}
-
-/*
-** classes for special content elements like town boxes
-** intended to be referenced directly from the wiki src
-*/
-
-/*
-** User styles
-*/
-/* table standards */
-table.rimage {
- float:right;
- position:relative;
- margin-left:1em;
- margin-bottom:1em;
- text-align:center;
-}
-.toccolours {
- border:1px solid #aaaaaa;
- background-color:#f9f9f9;
- padding:5px;
- font-size: 95%;
-}
-
-/*
-** edit views etc
-*/
-.special li {
- line-height: 1.4em;
- margin: 0;
- padding: 0;
-}
-
-a.external { color: #3366bb; }
-div#footer { text-align: center; }
-ul#f-list li { list-style: none; text-align: center; }
-div.portlet { margin: 0.5em 0; }
-
-.redirectText {
- font-size:150%;
- margin:5px;
-}
-
-ul.special li.not-patrolled, ol.special li.not-patrolled {
- background-color: #ffa;
-}
-div.patrollink {
- font-size: 75%;
- text-align: right;
-}
-
-span.updatedmarker {
- color:black;
- background-color:#00FF00;
-}
-
-div.gallerybox {
- width: 150px;
-}
-
-#xjump-to-nav {
- display: none;
-}
-
-.templatesUsed { margin-top: 1.5em; }
-
-#footer {
- background-color: white;
- border-top: 1px solid #fabd23;
- border-bottom: 1px solid #fabd23;
- margin: .6em 0 1em 0;
- padding: .4em 0 1.2em 0;
- text-align: center;
- font-size: 90%;
-}
-#f-poweredbyico, #f-copyrightico {
- display: inline;
-}
diff --git a/skins/cologneblue/print.css b/skins/cologneblue/print.css
new file mode 100644
index 00000000..d4b05518
--- /dev/null
+++ b/skins/cologneblue/print.css
@@ -0,0 +1,6 @@
+#sitetitle,
+#sitesub,
+#titlelinks,
+#footer-navigation {
+ display: none;
+}
diff --git a/skins/cologneblue/screen.css b/skins/cologneblue/screen.css
index 349638aa..bc5dd316 100644
--- a/skins/cologneblue/screen.css
+++ b/skins/cologneblue/screen.css
@@ -55,6 +55,14 @@ p, pre, .mw-code, td, th, li, dd, dt {
textarea {
overflow: auto;
+ width: 100%;
+}
+
+#editform textarea {
+ display: block;
+ -moz-box-sizing: border-box;
+ -webkit-box-sizing: border-box;
+ box-sizing: border-box;
}
#footer {
@@ -135,10 +143,6 @@ h1 {
line-height: 21pt;
}
-h1 .editsection {
- font-size: 55.6%;
-}
-
h1#firstHeading {
padding-bottom: 0;
margin-bottom: 0;
@@ -197,8 +201,8 @@ input.mw-searchInput {
#sitetitle, #sitesub, #toplinks, #linkcollection {
- margin-top: 0;
- margin-bottom: 0;
+ margin-top: 0;
+ margin-bottom: 0;
}
#sitetitle, #toplinks {
@@ -216,7 +220,7 @@ input.mw-searchInput {
}
#sitetitle a, #toplinks a {
color: white;
- text-decoration: none;
+ text-decoration: none;
}
/* Bring #sitetitle to top. Otherwise #toplinks is overlaid over it, making the link unclickable. */
#sitetitle a {
@@ -263,6 +267,7 @@ input.mw-searchInput {
font-size: small;
margin-right: 8px;
text-align: right;
+ padding-left: 140px;
}
/* Override text justification (user preference), see bug 31990 */
#linkcollection * {
diff --git a/skins/common/IEFixes.js b/skins/common/IEFixes.js
index dd999ed4..e35fcd1a 100644
--- a/skins/common/IEFixes.js
+++ b/skins/common/IEFixes.js
@@ -1,10 +1,17 @@
-// IE fixes javascript
+// IE fixes javascript loaded by wikibits.js for IE <= 6.0
+( function ( mw, $ ) {
-window.isMSIE55 = ( window.showModalDialog && window.clipboardData && window.createPopup );
-window.doneIETransform = undefined;
-window.doneIEAlphaFix = undefined;
+var doneIEAlphaFix, doneIETransform, expandedURLs, fixalpha, isMSIE55,
+ relativeforfloats, setrelative, hasClass;
-window.hookit = function() {
+// Also returns true for IE6, 7, 8, 9 and 10. createPopup is removed in IE11.
+// Good thing this is only loaded for IE <= 6 by wikibits.
+// Might as well set it to true.
+isMSIE55 = window.isMSIE55 = ( window.showModalDialog && window.clipboardData && window.createPopup );
+doneIETransform = window.doneIETransform = undefined;
+doneIEAlphaFix = window.doneIEAlphaFix = undefined;
+
+window.hookit = function () {
if ( !doneIETransform && document.getElementById && document.getElementById( 'bodyContent' ) ) {
doneIETransform = true;
relativeforfloats();
@@ -17,26 +24,27 @@ if ( document.attachEvent ) {
}
// png alpha transparency fixes
-window.fixalpha = function( logoId ) {
+fixalpha = window.fixalpha = function ( logoId ) {
// bg
if ( isMSIE55 && !doneIEAlphaFix ) {
- var plogo = document.getElementById( logoId || 'p-logo' );
+ var bg, imageUrl, linkFix, logoa, logospan, plogo;
+ plogo = document.getElementById( logoId || 'p-logo' );
if ( !plogo ) {
return;
}
- var logoa = plogo.getElementsByTagName('a')[0];
+ logoa = plogo.getElementsByTagName('a')[0];
if ( !logoa ) {
return;
}
- var bg = logoa.currentStyle.backgroundImage;
- var imageUrl = bg.substring( 5, bg.length - 2 );
+ bg = logoa.currentStyle.backgroundImage;
+ imageUrl = bg.substring( 5, bg.length - 2 );
doneIEAlphaFix = true;
- if ( imageUrl.substr( imageUrl.length - 4 ).toLowerCase() == '.png' ) {
- var logospan = logoa.appendChild( document.createElement( 'span' ) );
+ if ( imageUrl.substr( imageUrl.length - 4 ).toLowerCase() === '.png' ) {
+ logospan = logoa.appendChild( document.createElement( 'span' ) );
logoa.style.backgroundImage = 'none';
logospan.style.filter = 'progid:DXImageTransform.Microsoft.AlphaImageLoader(src=' + imageUrl + ')';
@@ -45,7 +53,7 @@ window.fixalpha = function( logoId ) {
logospan.style.width = logoa.currentStyle.width;
logospan.style.cursor = 'hand';
// Center image with hack for IE5.5
- if ( document.documentElement.dir == 'rtl' ) {
+ if ( document.documentElement.dir === 'rtl' ) {
logospan.style.right = '50%';
logospan.style.setExpression( 'marginRight', '"-" + (this.offsetWidth / 2) + "px"' );
} else {
@@ -55,7 +63,7 @@ window.fixalpha = function( logoId ) {
logospan.style.top = '50%';
logospan.style.setExpression( 'marginTop', '"-" + (this.offsetHeight / 2) + "px"' );
- var linkFix = logoa.appendChild( logoa.cloneNode() );
+ linkFix = logoa.appendChild( logoa.cloneNode() );
linkFix.style.position = 'absolute';
linkFix.style.height = '100%';
linkFix.style.width = '100%';
@@ -69,22 +77,23 @@ if ( isMSIE55 ) {
}
// fix ie6 disappering float bug
-window.relativeforfloats = function() {
- var bc = document.getElementById( 'bodyContent' );
+relativeforfloats = window.relativeforfloats = function () {
+ var bc, tables, divs;
+ bc = document.getElementById( 'bodyContent' );
if ( bc ) {
- var tables = bc.getElementsByTagName( 'table' );
- var divs = bc.getElementsByTagName( 'div' );
+ tables = bc.getElementsByTagName( 'table' );
+ divs = bc.getElementsByTagName( 'div' );
setrelative( tables );
setrelative( divs );
}
};
-window.setrelative = function( nodes ) {
+setrelative = window.setrelative = function ( nodes ) {
var i = 0;
while ( i < nodes.length ) {
- if( ( ( nodes[i].style.float && nodes[i].style.float != ( 'none' ) ||
- ( nodes[i].align && nodes[i].align != ( 'none' ) ) ) &&
- ( !nodes[i].style.position || nodes[i].style.position != 'relative' ) ) )
+ if( ( ( nodes[i].style.float && nodes[i].style.float !== ( 'none' ) ||
+ ( nodes[i].align && nodes[i].align !== ( 'none' ) ) ) &&
+ ( !nodes[i].style.position || nodes[i].style.position !== 'relative' ) ) )
{
nodes[i].style.position = 'relative';
}
@@ -93,30 +102,31 @@ window.setrelative = function( nodes ) {
};
// Expand links for printing
-String.prototype.hasClass = function( classWanted ) {
- var classArr = this.split(/\s/);
- for ( var i = 0; i < classArr.length; i++ ) {
- if ( classArr[i].toLowerCase() == classWanted.toLowerCase() ) {
+hasClass = function ( classText, classWanted ) {
+ var i = 0, classArr = classText.split(/\s/);
+ for ( i = 0; i < classArr.length; i++ ) {
+ if ( classArr[i].toLowerCase() === classWanted.toLowerCase() ) {
return true;
}
}
return false;
};
-window.expandedURLs = undefined;
+expandedURLs = window.expandedURLs = undefined;
-window.onbeforeprint = function() {
- expandedURLs = [];
+window.onbeforeprint = function () {
+ var allLinks, contentEl, expandedLink, expandedText, i;
- var contentEl = document.getElementById( 'content' );
+ expandedURLs = [];
+ contentEl = document.getElementById( 'content' );
if ( contentEl ) {
- var allLinks = contentEl.getElementsByTagName( 'a' );
+ allLinks = contentEl.getElementsByTagName( 'a' );
- for ( var i = 0; i < allLinks.length; i++ ) {
- if ( allLinks[i].className.hasClass( 'external' ) && !allLinks[i].className.hasClass( 'free' ) ) {
- var expandedLink = document.createElement( 'span' );
- var expandedText = document.createTextNode( ' (' + allLinks[i].href + ')' );
+ for ( i = 0; i < allLinks.length; i++ ) {
+ if ( hasClass( allLinks[i].className, 'external' ) && !hasClass( allLinks[i].className, 'free' ) ) {
+ expandedLink = document.createElement( 'span' );
+ expandedText = document.createTextNode( ' (' + allLinks[i].href + ')' );
expandedLink.appendChild( expandedText );
allLinks[i].parentNode.insertBefore( expandedLink, allLinks[i].nextSibling );
expandedURLs[i] = expandedLink;
@@ -132,3 +142,5 @@ window.onafterprint = function() {
}
}
};
+
+}( mediaWiki, jQuery ) );
diff --git a/skins/common/ajax.js b/skins/common/ajax.js
index 121f9d12..ca74b384 100644
--- a/skins/common/ajax.js
+++ b/skins/common/ajax.js
@@ -1,15 +1,23 @@
-// remote scripting library
-// (c) copyright 2005 modernmethod, inc
-window.sajax_debug_mode = false;
-window.sajax_request_type = 'GET';
+/**
+ * Remote Scripting Library
+ * Copyright 2005 modernmethod, inc
+ * Under the open source BSD license
+ * http://www.modernmethod.com/sajax/
+ */
+
+/*jshint camelcase:false, onevar:false */
+/*global alert */
+( function ( mw ) {
/**
- * 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,
+ * 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;
+function debug( text ) {
+ if ( !window.sajax_debug_mode ) {
+ return false;
+ }
var e = document.getElementById( 'sajax_debug' );
@@ -33,36 +41,36 @@ window.sajax_debug = function(text) {
e.appendChild( m );
return true;
-};
+}
/**
* Compatibility wrapper for creating a new XMLHttpRequest object.
*/
-window.sajax_init_object = function() {
- sajax_debug( 'sajax_init_object() called..' );
- var A;
+function createXhr() {
+ 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 ) {
+ a = new XMLHttpRequest();
+ } catch ( xhrE ) {
try {
- A = new ActiveXObject( 'Msxml2.XMLHTTP' );
- } catch ( e ) {
+ a = new window.ActiveXObject( 'Msxml2.XMLHTTP' );
+ } catch ( msXmlE ) {
try {
- A = new ActiveXObject( 'Microsoft.XMLHTTP' );
- } catch ( oc ) {
- A = null;
+ a = new window.ActiveXObject( 'Microsoft.XMLHTTP' );
+ } catch ( msXhrE ) {
+ a = null;
}
}
}
- if ( !A ) {
- sajax_debug( 'Could not create connection object.' );
+ if ( !a ) {
+ debug( 'Could not create connection object.' );
}
- return A;
-};
+ return a;
+}
/**
* Perform an AJAX call to MediaWiki. Calls are handled by AjaxDispatcher.php
@@ -80,13 +88,13 @@ window.sajax_init_object = function() {
* (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;
+function doAjaxRequest( func_name, args, target ) {
+ var i, x;
var uri;
var post_data;
uri = mw.util.wikiScript() + '?action=ajax';
- if ( sajax_request_type == 'GET' ) {
- if ( uri.indexOf( '?' ) == -1 ) {
+ if ( window.sajax_request_type === 'GET' ) {
+ if ( uri.indexOf( '?' ) === -1 ) {
uri = uri + '?rs=' + encodeURIComponent( func_name );
} else {
uri = uri + '&rs=' + encodeURIComponent( func_name );
@@ -102,47 +110,47 @@ window.sajax_do_call = function(func_name, args, target) {
post_data = post_data + '&rsargs[]=' + encodeURIComponent( args[i] );
}
}
- x = sajax_init_object();
+ x = createXhr();
if ( !x ) {
alert( 'AJAX not supported' );
return false;
}
try {
- x.open( sajax_request_type, uri, true );
+ x.open( window.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." );
+ if ( 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' ) {
+ if ( window.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.onreadystatechange = function() {
- if ( x.readyState != 4 ) {
+ x.onreadystatechange = function () {
+ if ( x.readyState !== 4 ) {
return;
}
- sajax_debug( 'received (' + x.status + ' ' + x.statusText + ') ' + x.responseText );
+ debug( 'received (' + x.status + ' ' + x.statusText + ') ' + x.responseText );
//if ( x.status != 200 )
// alert( 'Error: ' + x.status + ' ' + x.statusText + ': ' + x.responseText );
//else
- if ( typeof( target ) == 'function' ) {
+ if ( typeof target === 'function' ) {
target( x );
- } else if ( typeof( target ) == 'object' ) {
- if ( target.tagName == 'INPUT' ) {
- if ( x.status == 200 ) {
+ } 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 ) {
+ if ( x.status === 200 ) {
target.innerHTML = x.responseText;
} else {
target.innerHTML = '<div class="error">Error: ' + x.status +
@@ -150,24 +158,37 @@ window.sajax_do_call = function(func_name, args, target) {
}
}
} else {
- alert( 'bad target for sajax_do_call: not a function or object: ' + target );
+ alert( 'Bad target for sajax_do_call: not a function or object: ' + target );
}
};
- sajax_debug( func_name + ' uri = ' + uri + ' / post = ' + post_data );
+ debug( func_name + ' uri = ' + uri + ' / post = ' + post_data );
x.send( post_data );
- sajax_debug( func_name + ' waiting..' );
- delete x;
+ debug( func_name + ' waiting..' );
return true;
-};
+}
/**
- * @return boolean whether the browser supports XMLHttpRequest
+ * @return {boolean} Whether the browser supports AJAX
*/
-window.wfSupportsAjax = function() {
- var request = sajax_init_object();
+function wfSupportsAjax() {
+ var request = createXhr();
var supportsAjax = request ? true : false;
- delete request;
+ request = undefined;
return supportsAjax;
-};
+}
+
+// Expose + Mark as deprecated
+var deprecationNotice = 'Sajax is deprecated, use jQuery.ajax or mediawiki.api instead.';
+
+// Variables
+mw.log.deprecate( window, 'sajax_debug_mode', false, deprecationNotice );
+mw.log.deprecate( window, 'sajax_request_type', 'GET', deprecationNotice );
+// Methods
+mw.log.deprecate( window, 'sajax_debug', debug, deprecationNotice );
+mw.log.deprecate( window, 'sajax_init_object', createXhr, deprecationNotice );
+mw.log.deprecate( window, 'sajax_do_call', doAjaxRequest, deprecationNotice );
+mw.log.deprecate( window, 'wfSupportsAjax', wfSupportsAjax, deprecationNotice );
+
+}( mediaWiki ) );
diff --git a/skins/common/commonContent.css b/skins/common/commonContent.css
index a550d97a..14d39b92 100644
--- a/skins/common/commonContent.css
+++ b/skins/common/commonContent.css
@@ -14,6 +14,43 @@
padding: 5px;
font-size: 95%;
}
+
+/**
+ * We want to display the ToC element with intrinsic width in block mode. The fit-content
+ * value for width is however not supported by large groups of browsers.
+ *
+ * We use display:table. Even though it should only contain other table-* display
+ * elements, there are no known problems with using this.
+ *
+ * Because IE < 8, FF 2 and other older browsers don't support display:table, we fallback to
+ * using inline-block mode, which features at least intrinsic width, but won't clear preceding
+ * inline elements. In practice inline elements surrounding the TOC are uncommon enough that
+ * this is an acceptable sacrifice.
+ */
+#toc,
+.toc {
+ display: -moz-inline-block;
+ display: inline-block;
+ display: table;
+
+ /* IE7 and earlier */
+ zoom: 1;
+ *display: inline;
+
+ padding: 7px;
+}
+
+/* CSS for backwards-compatibility with cached page renders and creative uses in wikitext */
+table#toc,
+table.toc {
+ border-collapse: collapse;
+}
+/* Remove additional paddings inside table-cells that are not present in <div>s */
+table#toc td,
+table.toc td {
+ padding: 0;
+}
+
#toc h2,
.toc h2 {
display: inline;
@@ -96,6 +133,7 @@ html .thumbcaption {
div.magnify {
border: none !important;
background: none !important;
+ margin-left: 3px;
}
div.magnify a, div.magnify img {
display: block;
@@ -128,6 +166,13 @@ img.thumbborder {
#userlogin, #userloginForm {
border: solid 1px #cccccc;
padding: 1.2em;
- margin: .5em;
- float: left;
+ margin: 0.5em;
+}
+
+#loginend {
+ margin: 0.5em;
+}
+
+#loginend table {
+ width: 100%;
}
diff --git a/skins/common/commonElements.css b/skins/common/commonElements.css
index 2fa0cbaf..76ec4af7 100644
--- a/skins/common/commonElements.css
+++ b/skins/common/commonElements.css
@@ -86,15 +86,9 @@ h6 {
h1 {
font-size: 188%;
}
-h1 .editsection {
- font-size: 53%;
-}
h2 {
font-size: 150%;
}
-h2 .editsection {
- font-size: 67%;
-}
h3,
h4,
h5,
@@ -105,28 +99,14 @@ h6 {
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;
+ font-size: 108%;
}
h6 {
- font-size: 80%;
-}
-h6 .editsection {
- font-size: 125%;
- font-weight: normal;
+ font-size: 100%;
}
/* Some space under the headers in the content area */
@@ -198,7 +178,7 @@ code {
}
pre, .mw-code {
padding: 1em;
- border: 1px dashed #2f6fab;
+ border: 1px solid #ddd;
color: black;
background-color: #f9f9f9;
}
diff --git a/skins/common/commonPrint.css b/skins/common/commonPrint.css
index 6cb213f2..58628772 100644
--- a/skins/common/commonPrint.css
+++ b/skins/common/commonPrint.css
@@ -111,7 +111,7 @@ div#jump-to-nav,
div.top,
div#column-one,
#colophon,
-.editsection,
+.mw-editsection,
.toctoggle,
.tochidden,
div#f-poweredbyico,
@@ -127,6 +127,7 @@ tr.mw-metadata-show-hide-extended,
span.mw-filepage-other-resolutions,
#filetoc,
.usermessage,
+.patrollink,
#mw-navigation {
/* Hides all the elements irrelevant for printing */
display: none;
@@ -191,7 +192,7 @@ a:link, a:visited {
#content a.external.text:after,
#content a.external.autonumber:after {
/* Expand URLs for printing */
- content: " (" attr(href) ") ";
+ content: " (" attr(href) ")";
}
#globalWrapper {
@@ -352,7 +353,7 @@ a.sortheader {
.wikitable, .thumb, img {
page-break-inside: avoid;
}
-h2, h3, h4, h5, h6, h7 {
+h2, h3, h4, h5, h6 {
page-break-after: avoid;
}
p {
diff --git a/skins/common/config.css b/skins/common/config.css
index 39206c3a..79780da9 100644
--- a/skins/common/config.css
+++ b/skins/common/config.css
@@ -88,7 +88,13 @@
}
.config-input-check {
- margin-left: 10em;
+ margin-left: 3.7em;
+ margin-right: 2em;
+ margin-bottom: 0.25em;
+}
+
+.config-input-check input {
+ margin-left: -1em;
}
.error {
diff --git a/skins/common/config.js b/skins/common/config.js
index b1e28aba..fb8edc1f 100644
--- a/skins/common/config.js
+++ b/skins/common/config.js
@@ -1,5 +1,5 @@
( function ( $ ) {
- $( document ).ready( function () {
+ $( function () {
var $label, labelText;
function syncText() {
@@ -25,7 +25,7 @@
.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 () {
@@ -40,12 +40,12 @@
$wrapper.show( 'slow' );
}
} );
-
+
// Scroll to the bottom of upgrade log
$( '#config-live-log' ).children( 'textarea' ).each( function () {
this.scrollTop = this.scrollHeight;
} );
-
+
// Show/hide Creative Commons thingy
$( '.licenseRadio' ).click( function () {
var $wrapper = $( '#config-cc-wrapper' );
@@ -55,7 +55,7 @@
$wrapper.hide( 'slow' );
}
} );
-
+
// Show/hide random stuff (email, upload)
$( '.showHideRadio' ).click( function () {
var $wrapper = $( '#' + $(this).attr( 'rel' ) );
@@ -88,7 +88,7 @@
$textbox.prop( 'readonly', true ).closest( '.config-block' ).slideUp( 'fast' );
}
} );
-
+
// Synchronize radio button label for sitename with textbox
$label = $( 'label[for=config__NamespaceType_site-name]' );
labelText = $label.text();
@@ -97,7 +97,7 @@
// Show/Hide memcached servers when needed
$( 'input[name$="config_wgMainCacheType"]' ).change( function () {
- var $memc = $( "#config-memcachewrapper" );
+ var $memc = $( '#config-memcachewrapper' );
if( $( 'input[name$="config_wgMainCacheType"]:checked' ).val() === 'memcached' ) {
$memc.show( 'slow' );
} else {
diff --git a/skins/common/images/Arr_u.png b/skins/common/images/Arr_u.png
index 6132836b..1aa543af 100644
--- a/skins/common/images/Arr_u.png
+++ b/skins/common/images/Arr_u.png
Binary files differ
diff --git a/skins/common/images/ar/button_headline.png b/skins/common/images/ar/button_headline.png
index 04fb8f11..398e5614 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_nowiki.png b/skins/common/images/ar/button_nowiki.png
index 12b986b4..743ea61b 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_left_25.png b/skins/common/images/arrow_disabled_left_25.png
index 8f979aab..83df0684 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 11022f62..aa4fbf8c 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_right_25.png b/skins/common/images/arrow_right_25.png
index 9e1b550c..3f8fee38 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/button_hr.png b/skins/common/images/button_hr.png
index 19e4ad45..47e1ca40 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_nowiki.png b/skins/common/images/button_nowiki.png
index c647de2b..2ba818de 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 ff7348a9..fe34b3fb 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 53b6f92f..94d9d0b9 100644
--- a/skins/common/images/button_template.png
+++ b/skins/common/images/button_template.png
Binary files differ
diff --git a/skins/common/images/critical-32.png b/skins/common/images/critical-32.png
index dce5667a..9b38e6a2 100644
--- a/skins/common/images/critical-32.png
+++ b/skins/common/images/critical-32.png
Binary files differ
diff --git a/skins/common/images/fa/button_nowiki.png b/skins/common/images/fa/button_nowiki.png
index 12b986b4..743ea61b 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/feed-icon.png b/skins/common/images/feed-icon.png
index 7188fa23..00f49f6c 100644
--- a/skins/common/images/feed-icon.png
+++ b/skins/common/images/feed-icon.png
Binary files differ
diff --git a/skins/common/images/icons/fileicon-psd.png b/skins/common/images/icons/fileicon-psd.png
index 5bd40cb0..598f190e 100644
--- a/skins/common/images/icons/fileicon-psd.png
+++ b/skins/common/images/icons/fileicon-psd.png
Binary files differ
diff --git a/skins/common/images/magnify-clip-rtl.png b/skins/common/images/magnify-clip-rtl.png
index cfddc279..ff85c077 100644
--- a/skins/common/images/magnify-clip-rtl.png
+++ b/skins/common/images/magnify-clip-rtl.png
Binary files differ
diff --git a/skins/common/images/question-small.png b/skins/common/images/question-small.png
new file mode 100644
index 00000000..f7405d26
--- /dev/null
+++ b/skins/common/images/question-small.png
Binary files differ
diff --git a/skins/common/images/question.svg b/skins/common/images/question.svg
new file mode 100644
index 00000000..27973053
--- /dev/null
+++ b/skins/common/images/question.svg
@@ -0,0 +1,12 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Generator: Adobe Illustrator 16.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
+<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
+<svg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
+ width="21.059px" height="21.06px" viewBox="0 0 21.059 21.06" enable-background="new 0 0 21.059 21.06" xml:space="preserve">
+<path fill="#575757" d="M10.529,0C4.715,0,0,4.714,0,10.529s4.715,10.53,10.529,10.53c5.816,0,10.529-4.715,10.529-10.53
+ S16.346,0,10.529,0z M10.527,16.767c-0.861,0-1.498-0.688-1.498-1.516c0-0.862,0.637-1.534,1.498-1.534c0.828,0,1.5,0.672,1.5,1.534
+ C12.027,16.078,11.355,16.767,10.527,16.767z M12.664,10.255c-0.723,0.568-1,0.931-1,1.739v0.5H9.459v-0.603
+ c0-1.517,0.449-2.136,1.154-2.688c0.707-0.552,1.139-0.845,1.139-1.637c0-0.672-0.414-1.051-1.24-1.051
+ c-0.707,0-1.328,0.189-1.982,0.638L7.479,5.346c0.861-0.604,1.93-1.034,3.342-1.034c1.912,0,3.516,1.051,3.516,3.066
+ C14.336,8.808,13.543,9.566,12.664,10.255z"/>
+</svg>
diff --git a/skins/common/images/tick-32.png b/skins/common/images/tick-32.png
index dfde1707..34cfa9ce 100644
--- a/skins/common/images/tick-32.png
+++ b/skins/common/images/tick-32.png
Binary files differ
diff --git a/skins/common/images/warning-32.png b/skins/common/images/warning-32.png
index b14a8315..0400734c 100644
--- a/skins/common/images/warning-32.png
+++ b/skins/common/images/warning-32.png
Binary files differ
diff --git a/skins/common/oldshared.css b/skins/common/oldshared.css
index 6dcdf6f1..eea8b8ee 100644
--- a/skins/common/oldshared.css
+++ b/skins/common/oldshared.css
@@ -11,24 +11,15 @@
h1 { font-size: 2em; }
h2 { font-size: 1.5em; }
h3 { font-size: 1.17em; }
-h5 { font-size: .83em; }
-h6 { font-size: .75em; }
+h4 { font-size: 1.11em; }
+h5 { font-size: 1.05em; }
+h6 { font-size: 1em; }
h1, h2, h3, h4, h5, h6 {
font-weight: bolder;
}
/* Now the custom parts */
-/* Make edit sections (which are inside h# tags) normal-sized */
-.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%; }
-
#footer { clear: both }
/* images */
/* @noflip */
@@ -93,6 +84,7 @@ div.magnify {
float: right;
border: none !important;
background: none !important;
+ margin-left: 3px;
}
div.magnify a,
div.magnify img {
@@ -130,6 +122,25 @@ img { border: none; }
padding: 5px;
font-size: 95%;
text-align: center;
+ display: -moz-inline-block;
+ display: inline-block;
+ display: table;
+
+ /* IE7 and earlier */
+ zoom: 1;
+ *display: inline;
+
+ padding: 7px;
+}
+/* CSS for backwards-compatibility with cached page renders and creative uses in wikitext */
+table#toc,
+table.toc {
+ border-collapse: collapse;
+}
+/* Remove additional paddings inside table-cells that are not present in <div>s */
+table#toc td,
+table.toc td {
+ padding: 0;
}
#toc h2,
.toc h2 {
@@ -161,9 +172,6 @@ img { border: none; }
}
/* preference page with js-genrated toc */
-#mw-pref-clear {
- clear: both;
-}
#preftoc {
float: left;
margin: 1em 1em 1em 1em;
@@ -283,7 +291,7 @@ li span.deleted {
font-style: italic;
}
-/* Classes for EXIF data display */
+/* Classes for Exif data display */
table.mw_metadata {
margin-left: 0.5em;
}
@@ -458,4 +466,4 @@ html > body.rtl div#bodyContent ul#filetoc {
display: block;
}
-/* RTL specific CSS ends here **/ \ No newline at end of file
+/* RTL specific CSS ends here **/
diff --git a/skins/common/protect.js b/skins/common/protect.js
index a23c0cbd..dc142ca9 100644
--- a/skins/common/protect.js
+++ b/skins/common/protect.js
@@ -1,6 +1,7 @@
+( function ( mw, $ ) {
-window.ProtectionForm = {
- 'existingMatch': false,
+var ProtectionForm = window.ProtectionForm = {
+ existingMatch: false,
/**
* Set up the protection chaining interface (i.e. "unlock move permissions" checkbox)
@@ -12,40 +13,47 @@ window.ProtectionForm = {
* numTypes The number of protection types
* existingMatch True if all the existing expiry times match
*/
- 'init': function( opts ) {
- if( !( document.createTextNode && document.getElementById && document.getElementsByTagName ) )
+ init: function ( opts ) {
+ var box, boxbody, row, cell, check, label;
+
+ if ( !( document.createTextNode && document.getElementById && document.getElementsByTagName ) ) {
return false;
+ }
- var box = document.getElementById( opts.tableId );
- if( !box )
+ box = document.getElementById( opts.tableId );
+ if ( !box ) {
return false;
-
- var boxbody = box.getElementsByTagName('tbody')[0];
- var row = document.createElement( 'tr' );
+ }
+
+ boxbody = box.getElementsByTagName( 'tbody' )[0];
+ row = document.createElement( 'tr' );
boxbody.insertBefore( row, boxbody.firstChild.nextSibling );
this.existingMatch = opts.existingMatch;
- var cell = document.createElement( 'td' );
+ cell = document.createElement( 'td' );
row.appendChild( cell );
// If there is only one protection type, there is nothing to chain
- if( opts.numTypes > 1 ) {
- var check = document.createElement( 'input' );
+ if ( opts.numTypes > 1 ) {
+ check = document.createElement( 'input' );
check.id = 'mwProtectUnchained';
check.type = 'checkbox';
- cell.appendChild( check );
- addClickHandler( check, function() { ProtectionForm.onChainClick(); } );
+ $( check ).click( function () {
+ ProtectionForm.onChainClick();
+ } );
- cell.appendChild( document.createTextNode( ' ' ) );
- var label = document.createElement( 'label' );
+ label = document.createElement( 'label' );
label.htmlFor = 'mwProtectUnchained';
label.appendChild( document.createTextNode( opts.labelText ) );
+
+ cell.appendChild( check );
+ cell.appendChild( document.createTextNode( ' ' ) );
cell.appendChild( label );
check.checked = !this.areAllTypesMatching();
this.enableUnchainedInputs( check.checked );
}
-
+
$( '#mwProtect-reason' ).byteLimit( 180 );
this.updateCascadeCheckbox();
@@ -56,17 +64,19 @@ window.ProtectionForm = {
/**
* Sets the disabled attribute on the cascade checkbox depending on the current selected levels
*/
- 'updateCascadeCheckbox': function() {
+ updateCascadeCheckbox: function () {
+ var i, lists, items, selected;
+
// For non-existent titles, there is no cascade option
- if( !document.getElementById( 'mwProtect-cascade' ) ) {
+ if ( !document.getElementById( 'mwProtect-cascade' ) ) {
return;
}
- var lists = this.getLevelSelectors();
- for( var i = 0; i < lists.length; i++ ) {
- if( lists[i].selectedIndex > -1 ) {
- var items = lists[i].getElementsByTagName( 'option' );
- var selected = items[ lists[i].selectedIndex ].value;
- if( !this.isCascadeableLevel(selected) ) {
+ lists = this.getLevelSelectors();
+ for ( i = 0; i < lists.length; i++ ) {
+ if ( lists[i].selectedIndex > -1 ) {
+ items = lists[i].getElementsByTagName( 'option' );
+ selected = items[ lists[i].selectedIndex ].value;
+ if ( !this.isCascadeableLevel( selected ) ) {
document.getElementById( 'mwProtect-cascade' ).checked = false;
document.getElementById( 'mwProtect-cascade' ).disabled = true;
return;
@@ -81,7 +91,7 @@ window.ProtectionForm = {
* @param level {String}
* @return {Boolean}
*/
- 'isCascadeableLevel': function( level ) {
+ isCascadeableLevel: function ( level ) {
var cascadeLevels, len, i;
cascadeLevels = mw.config.get( 'wgCascadeableLevels' );
@@ -102,9 +112,10 @@ window.ProtectionForm = {
*
* @param source Element Level selector that changed
*/
- 'updateLevels': function(source) {
- if( !this.isUnchained() )
+ updateLevels: function ( source ) {
+ if ( !this.isUnchained() ) {
this.setAllSelectors( source.selectedIndex );
+ }
this.updateCascadeCheckbox();
},
@@ -115,22 +126,24 @@ window.ProtectionForm = {
* @param source Element expiry input that changed
*/
- 'updateExpiry': function(source) {
- if( !this.isUnchained() ) {
- var expiry = source.value;
- this.forEachExpiryInput(function(element) {
+ updateExpiry: function ( source ) {
+ var expiry, listId, list;
+
+ if ( !this.isUnchained() ) {
+ expiry = source.value;
+ this.forEachExpiryInput( function ( element ) {
element.value = expiry;
- });
+ } );
}
- var listId = source.id.replace( /^mwProtect-(\w+)-expires$/, 'mwProtectExpirySelection-$1' );
- var list = document.getElementById( listId );
- if (list && list.value != 'othertime' ) {
+ listId = source.id.replace( /^mwProtect-(\w+)-expires$/, 'mwProtectExpirySelection-$1' );
+ list = document.getElementById( listId );
+ if ( list && list.value !== 'othertime' ) {
if ( this.isUnchained() ) {
list.value = 'othertime';
} else {
- this.forEachExpirySelector(function(element) {
+ this.forEachExpirySelector( function ( element ) {
element.value = 'othertime';
- });
+ } );
}
}
},
@@ -141,15 +154,16 @@ window.ProtectionForm = {
*
* @param source Element expiry selector that changed
*/
- 'updateExpiryList': function(source) {
- if( !this.isUnchained() ) {
- var expiry = source.value;
- this.forEachExpirySelector(function(element) {
+ updateExpiryList: function ( source ) {
+ var expiry;
+ if ( !this.isUnchained() ) {
+ expiry = source.value;
+ this.forEachExpirySelector( function ( element ) {
element.value = expiry;
- });
- this.forEachExpiryInput(function(element) {
+ } );
+ this.forEachExpiryInput( function ( element ) {
element.value = '';
- });
+ } );
}
},
@@ -157,8 +171,8 @@ window.ProtectionForm = {
* Update chain status and enable/disable various bits of the UI
* when the user changes the "unlock move permissions" checkbox
*/
- 'onChainClick': function() {
- if( this.isUnchained() ) {
+ onChainClick: function () {
+ if ( this.isUnchained() ) {
this.enableUnchainedInputs( true );
} else {
this.setAllSelectors( this.getMaxLevel() );
@@ -170,16 +184,17 @@ window.ProtectionForm = {
/**
* Returns true if the named attribute in all objects in the given array are matching
*/
- 'matchAttribute' : function( objects, attrName ) {
- var value = null;
+ matchAttribute: function ( objects, attrName ) {
+ var i, element, value;
// Check levels
- for ( var i = 0; i < objects.length; i++ ) {
- var element = objects[i];
- if ( value == null ) {
+ value = null;
+ for ( i = 0; i < objects.length; i++ ) {
+ element = objects[i];
+ if ( value === null ) {
value = element[attrName];
} else {
- if ( value != element[attrName] ) {
+ if ( value !== element[attrName] ) {
return false;
}
}
@@ -192,7 +207,7 @@ window.ProtectionForm = {
*
* @return boolean
*/
- 'areAllTypesMatching': function() {
+ areAllTypesMatching: function () {
return this.existingMatch
&& this.matchAttribute( this.getLevelSelectors(), 'selectedIndex' )
&& this.matchAttribute( this.getExpirySelectors(), 'selectedIndex' )
@@ -204,7 +219,7 @@ window.ProtectionForm = {
*
* @return bool
*/
- 'isUnchained': function() {
+ isUnchained: function () {
var element = document.getElementById( 'mwProtectUnchained' );
return element
? element.checked
@@ -214,13 +229,13 @@ window.ProtectionForm = {
/**
* Find the highest protection level in any selector
*/
- 'getMaxLevel': function() {
+ getMaxLevel: function () {
var maxIndex = -1;
- this.forEachLevelSelector(function(element) {
- if (element.selectedIndex > maxIndex) {
+ this.forEachLevelSelector( function ( element ) {
+ if ( element.selectedIndex > maxIndex ) {
maxIndex = element.selectedIndex;
}
- });
+ } );
return maxIndex;
},
@@ -229,12 +244,12 @@ window.ProtectionForm = {
*
* @param index int Protection level
*/
- 'setAllSelectors': function(index) {
- this.forEachLevelSelector(function(element) {
- if (element.selectedIndex != index) {
+ setAllSelectors: function ( index ) {
+ this.forEachLevelSelector( function ( element ) {
+ if ( element.selectedIndex !== index ) {
element.selectedIndex = index;
}
- });
+ } );
},
/**
@@ -242,10 +257,12 @@ window.ProtectionForm = {
*
* @param func callable Callback function
*/
- 'forEachLevelSelector': function(func) {
- var selectors = this.getLevelSelectors();
- for (var i = 0; i < selectors.length; i++) {
- func(selectors[i]);
+ forEachLevelSelector: function ( func ) {
+ var i, selectors;
+
+ selectors = this.getLevelSelectors();
+ for ( i = 0; i < selectors.length; i++ ) {
+ func( selectors[i] );
}
},
@@ -254,12 +271,14 @@ window.ProtectionForm = {
*
* @return Array
*/
- 'getLevelSelectors': function() {
- var all = document.getElementsByTagName("select");
- var ours = [];
- for (var i = 0; i < all.length; i++) {
- var element = all[i];
- if (element.id.match(/^mwProtect-level-/)) {
+ getLevelSelectors: function () {
+ var i, ours, all, element;
+
+ all = document.getElementsByTagName( 'select' );
+ ours = [];
+ for ( i = 0; i < all.length; i++ ) {
+ element = all[i];
+ if ( element.id.match( /^mwProtect-level-/ ) ) {
ours[ours.length] = element;
}
}
@@ -271,10 +290,12 @@ window.ProtectionForm = {
*
* @param func callable Callback function
*/
- 'forEachExpiryInput': function(func) {
- var inputs = this.getExpiryInputs();
- for (var i = 0; i < inputs.length; i++) {
- func(inputs[i]);
+ forEachExpiryInput: function ( func ) {
+ var i, inputs;
+
+ inputs = this.getExpiryInputs();
+ for ( i = 0; i < inputs.length; i++ ) {
+ func( inputs[i] );
}
},
@@ -283,12 +304,14 @@ window.ProtectionForm = {
*
* @return Array
*/
- 'getExpiryInputs': function() {
- var all = document.getElementsByTagName("input");
- var ours = [];
- for (var i = 0; i < all.length; i++) {
- var element = all[i];
- if (element.name.match(/^mwProtect-expiry-/)) {
+ getExpiryInputs: function () {
+ var i, all, element, ours;
+
+ all = document.getElementsByTagName( 'input' );
+ ours = [];
+ for ( i = 0; i < all.length; i++ ) {
+ element = all[i];
+ if ( element.name.match( /^mwProtect-expiry-/ ) ) {
ours[ours.length] = element;
}
}
@@ -299,10 +322,12 @@ window.ProtectionForm = {
* Apply a callback to each expiry selector list
* @param func callable Callback function
*/
- 'forEachExpirySelector': function(func) {
- var inputs = this.getExpirySelectors();
- for (var i = 0; i < inputs.length; i++) {
- func(inputs[i]);
+ forEachExpirySelector: function ( func ) {
+ var i, inputs;
+
+ inputs = this.getExpirySelectors();
+ for ( i = 0; i < inputs.length; i++ ) {
+ func( inputs[i] );
}
},
@@ -311,12 +336,14 @@ window.ProtectionForm = {
*
* @return Array
*/
- 'getExpirySelectors': function() {
- var all = document.getElementsByTagName("select");
- var ours = [];
- for (var i = 0; i < all.length; i++) {
- var element = all[i];
- if (element.id.match(/^mwProtectExpirySelection-/)) {
+ getExpirySelectors: function () {
+ var i, all, ours, element;
+
+ all = document.getElementsByTagName( 'select' );
+ ours = [];
+ for ( i = 0; i < all.length; i++ ) {
+ element = all[i];
+ if ( element.id.match( /^mwProtectExpirySelection-/ ) ) {
ours[ours.length] = element;
}
}
@@ -328,30 +355,33 @@ window.ProtectionForm = {
*
* @param val boolean Enable?
*/
- 'enableUnchainedInputs': function(val) {
+ enableUnchainedInputs: function ( val ) {
var first = true;
- this.forEachLevelSelector(function(element) {
- if (first) {
+
+ this.forEachLevelSelector( function ( element ) {
+ if ( first ) {
first = false;
} else {
element.disabled = !val;
}
- });
+ } );
first = true;
- this.forEachExpiryInput(function(element) {
- if (first) {
+ this.forEachExpiryInput( function ( element ) {
+ if ( first ) {
first = false;
} else {
element.disabled = !val;
}
- });
+ } );
first = true;
- this.forEachExpirySelector(function(element) {
- if (first) {
+ this.forEachExpirySelector( function ( element ) {
+ if ( first ) {
first = false;
} else {
element.disabled = !val;
}
- });
+ } );
}
};
+
+}( mediaWiki, jQuery ) );
diff --git a/skins/common/shared.css b/skins/common/shared.css
index 6e1c94fd..ac7265a8 100644
--- a/skins/common/shared.css
+++ b/skins/common/shared.css
@@ -59,9 +59,8 @@ input[dir="rtl"] {
}
/* Default style for semantic tags */
-abbr,
-acronym,
-.explain {
+abbr[title],
+.explain[title] {
border-bottom: 1px dotted;
cursor: help;
}
@@ -127,21 +126,6 @@ span.texhtml {
cursor: pointer;
}
-/* Edit section links */
-/* Correct directionality when page dir is different from site/user dir */
-/* @noflip */
-.mw-content-ltr .editsection,
-.mw-content-rtl .mw-content-ltr .editsection {
- float: right;
- margin-left: 5px;
-}
-/* @noflip */
-.mw-content-rtl .editsection,
-.mw-content-ltr .mw-content-rtl .editsection {
- float: left;
- margin-right: 5px;
-}
-
/**
* File description page
*/
@@ -235,6 +219,32 @@ td.mw-label {
.prefsection table.mw-htmlform-matrix {
width: auto;
}
+
+.mw-icon-question {
+ /* @embed */
+ background: url('images/question-small.png') no-repeat;
+ /* SVG support using a transparent gradient to guarantee cross-browser
+ * compatibility (browsers able to understand gradient syntax support also SVG)
+ * lifted from #pt-login css rule in skins/vector/screen.css */
+ /* @embed */
+ background: -webkit-linear-gradient(transparent, transparent), url('images/question.svg') no-repeat;
+ /* @embed */
+ background: linear-gradient(transparent, transparent), url('images/question.svg') no-repeat;
+ background-size: 13px 13px;
+ display: inline-block;
+ height: 13px;
+ width: 13px;
+ margin-left: 4px;
+}
+
+.mw-icon-question:lang(ar),
+.mw-icon-question:lang(fa),
+.mw-icon-question:lang(ur) {
+ -webkit-transform: scaleX(-1);
+ -ms-transform: scaleX(-1);
+ transform: scaleX(-1);
+}
+
td.mw-submit {
white-space: nowrap;
}
@@ -525,49 +535,57 @@ table.collapsed tr.collapsable {
}
/* success and error messages */
+.error,
+.warning,
.success {
- color: green;
font-size: larger;
}
+.error {
+ color: #cc0000;
+}
.warning {
- color: #FFA500; /* orange */
- font-size: larger;
+ color: #705000;
}
-.error {
- color: red;
- font-size: larger;
+.success {
+ color: #009000;
}
+
.errorbox,
.warningbox,
.successbox {
- font-size: larger;
- border: 2px solid;
+ border: 1px solid;
padding: .5em 1em;
- float: left;
- margin-bottom: 2em;
- color: #000;
-}
-.errorbox {
- border-color: red;
- background-color: #fff2f2;
-}
-.warningbox {
- border-color: #FF8C00; /* darkorange */
- background-color: #FFFFC0;
-}
-.successbox {
- border-color: green;
- background-color: #dfd;
+ margin-bottom: 1em;
+ display: -moz-inline-block;
+ display: inline-block;
+ zoom: 1;
+ *display: inline;
}
.errorbox h2,
.warningbox h2,
.successbox h2 {
font-size: 1em;
+ color: inherit;
font-weight: bold;
display: inline;
margin: 0 .5em 0 0;
border: none;
}
+.errorbox {
+ color: #cc0000;
+ border-color: #fac5c5;
+ background-color: #fae3e3;
+}
+.warningbox {
+ color: #705000;
+ border-color: #fde29b;
+ background-color: #fdf1d1;
+}
+.successbox {
+ color: #009000;
+ border-color: #b7fdb5;
+ background-color: #e1fddf;
+}
/* general info/warning box for SP */
.mw-infobox {
@@ -684,7 +702,7 @@ ul#filetoc {
padding-right: 2em;
}
-/* Classes for EXIF data display */
+/* Classes for Exif data display */
table.mw_metadata {
font-size: 0.8em;
margin-left: 0.5em;
@@ -818,6 +836,69 @@ div.gallerytext {
word-wrap: break-word;
}
+/* new gallery stuff */
+ul.mw-gallery-nolines li.gallerybox div.thumb {
+ background-color: transparent;
+ border: none;
+}
+
+ul.mw-gallery-nolines li.gallerybox div.gallerytext {
+ text-align: center;
+}
+
+/* height constrained gallery */
+
+ul.mw-gallery-packed li.gallerybox div.thumb,
+ul.mw-gallery-packed-overlay li.gallerybox div.thumb,
+ul.mw-gallery-packed-hover li.gallerybox div.thumb {
+ background-color: transparent;
+ border: none;
+}
+ul.mw-gallery-packed li.gallerybox div.thumb img,
+ul.mw-gallery-packed-overlay li.gallerybox div.thumb img,
+ul.mw-gallery-packed-hover li.gallerybox div.thumb img {
+ margin: 0 auto;
+}
+
+ul.mw-gallery-packed-hover li.gallerybox,
+ul.mw-gallery-packed-overlay li.gallerybox {
+ position:relative;
+}
+
+ul.mw-gallery-packed-hover div.gallerytextwrapper {
+ overflow: hidden;
+ height: 0;
+}
+
+ul.mw-gallery-packed-hover li.gallerybox:hover div.gallerytextwrapper,
+ul.mw-gallery-packed-overlay li.gallerybox div.gallerytextwrapper,
+ul.mw-gallery-packed-hover li.gallerybox.mw-gallery-focused div.gallerytextwrapper {
+ position:absolute;
+ opacity:.8;
+ filter:alpha(opacity=80);
+ zoom: 1;
+ background-color:white;
+ padding: 5px 10px;
+ bottom: 0;
+ left: 0; /* Needed for IE */
+ height: auto;
+ font-weight: bold;
+ margin: 2px; /* correspond to style on div.thumb */
+}
+
+ul.mw-gallery-packed-hover,
+ul.mw-gallery-packed-overlay,
+ul.mw-gallery-packed {
+ text-align: center;
+}
+
+ul.mw-gallery-packed-hover div.gallerytext,
+ul.mw-gallery-packed-overlay div.gallerytext {
+ opacity: 1;
+ position: relative; /* Resets opacity in old IE */
+}
+
+
.mw-ajax-loader {
/* @embed */
background-image: url(images/ajax-loader.gif);
@@ -1033,6 +1114,7 @@ ol:lang(or) li {
direction: ltr;
unicode-bidi: embed;
}
+.diff-multi,
.diff-otitle,
.diff-ntitle,
.diff-lineno {
@@ -1092,9 +1174,37 @@ table.floatleft {
z-index: 99;
}
-.editsection, .toctoggle {
+.mw-editsection,
+.toctoggle {
-moz-user-select: none;
-webkit-user-select: none;
-ms-user-select: none;
user-select: none;
}
+
+/* Display editsection links smaller and next to headings */
+.mw-editsection {
+ font-size: small;
+ font-weight: normal;
+ margin-left: 1em;
+ vertical-align: baseline;
+ /* Reset line-height; headings tend to have it set to larger values */
+ line-height: 1em;
+ /* As .mw-editsection is a <span> (inline element), it is treated as part */
+ /* of the heading content when selecting text by multiple clicks and thus */
+ /* selected together with heading content, despite the user-select: none; */
+ /* rule set above. This enforces non-selection without changing the look. */
+ display: inline-block;
+}
+
+/* Correct directionality when page dir is different from site/user dir */
+/* @noflip */
+.mw-content-ltr .mw-editsection,
+.mw-content-rtl .mw-content-ltr .mw-editsection {
+ margin-left: 1em;
+}
+/* @noflip */
+.mw-content-rtl .mw-editsection,
+.mw-content-ltr .mw-content-rtl .mw-editsection {
+ margin-right: 1em;
+}
diff --git a/skins/common/upload.js b/skins/common/upload.js
index df819e19..d639f63a 100644
--- a/skins/common/upload.js
+++ b/skins/common/upload.js
@@ -1,12 +1,15 @@
+/*jshint camelcase:false */
( function ( mw, $ ) {
-var ajaxUploadDestCheck = mw.config.get( 'wgAjaxUploadDestCheck' ),
- fileExtensions = mw.config.get( 'wgFileExtensions' );
-
-window.licenseSelectorCheck = function() {
- var selector = document.getElementById( "wpLicense" );
- var selection = selector.options[selector.selectedIndex].value;
- if( selector.selectedIndex > 0 ) {
- if( selection == "" ) {
+var licenseSelectorCheck, wgUploadWarningObj, wgUploadLicenseObj, fillDestFilename,
+ ajaxUploadDestCheck = mw.config.get( 'wgAjaxUploadDestCheck' ),
+ fileExtensions = mw.config.get( 'wgFileExtensions' ),
+ $spinnerDestCheck, $spinnerLicense;
+
+licenseSelectorCheck = window.licenseSelectorCheck = function () {
+ var selector = document.getElementById( 'wpLicense' ),
+ selection = selector.options[selector.selectedIndex].value;
+ if ( selector.selectedIndex > 0 ) {
+ if ( !selection ) {
// Option disabled, but browser is broken and doesn't respect this
selector.selectedIndex = 0;
}
@@ -17,23 +20,29 @@ window.licenseSelectorCheck = function() {
function uploadSetup() {
// Disable URL box if the URL copy upload source type is not selected
- var e = document.getElementById( 'wpSourceTypeurl' );
- if( e ) {
- if( !e.checked ) {
- var ein = document.getElementById( 'wpUploadFileURL' );
- if(ein)
- ein.setAttribute( 'disabled', 'disabled' );
+ var ein,
+ selector, ua, isMacIe, i,
+ optionsTable, row, td,
+ wpLicense, wpLicenseRow, wpLicenseTbody,
+ uploadSourceIds, len, onchange,
+ e = document.getElementById( 'wpSourceTypeurl' );
+ if ( e ) {
+ if ( !e.checked ) {
+ ein = document.getElementById( 'wpUploadFileURL' );
+ if ( ein ) {
+ ein.disabled = true;
+ }
}
}
// For MSIE/Mac: non-breaking spaces cause the <option> not to render.
// But for some reason, setting the text to itself works
- var selector = document.getElementById("wpLicense");
- if (selector) {
- var ua = navigator.userAgent;
- var isMacIe = (ua.indexOf("MSIE") != -1) && (ua.indexOf("Mac") != -1);
- if (isMacIe) {
- for (var i = 0; i < selector.options.length; i++) {
+ selector = document.getElementById( 'wpLicense' );
+ if ( selector ) {
+ ua = navigator.userAgent;
+ isMacIe = ua.indexOf( 'MSIE' ) !== -1 && ua.indexOf( 'Mac' ) !== -1;
+ if ( isMacIe ) {
+ for ( i = 0; i < selector.options.length; i++ ) {
selector.options[i].text = selector.options[i].text;
}
}
@@ -43,31 +52,31 @@ function uploadSetup() {
if ( ajaxUploadDestCheck ) {
// Insert an event handler that fetches upload warnings when wpDestFile
// has been changed
- document.getElementById( 'wpDestFile' ).onchange = function ( e ) {
- wgUploadWarningObj.checkNow(this.value);
+ document.getElementById( 'wpDestFile' ).onchange = function () {
+ wgUploadWarningObj.checkNow( this.value );
};
// Insert a row where the warnings will be displayed just below the
// wpDestFile row
- var optionsTable = document.getElementById( 'mw-htmlform-description' ).tBodies[0];
- var row = optionsTable.insertRow( 1 );
- var td = document.createElement( 'td' );
+ optionsTable = document.getElementById( 'mw-htmlform-description' ).tBodies[0];
+ row = optionsTable.insertRow( 1 );
+ td = document.createElement( 'td' );
td.id = 'wpDestFile-warning';
td.colSpan = 2;
row.appendChild( td );
}
- var wpLicense = document.getElementById( 'wpLicense' );
+ wpLicense = document.getElementById( 'wpLicense' );
if ( mw.config.get( 'wgAjaxLicensePreview' ) && wpLicense ) {
// License selector check
wpLicense.onchange = licenseSelectorCheck;
// License selector table row
- var wpLicenseRow = wpLicense.parentNode.parentNode;
- var wpLicenseTbody = wpLicenseRow.parentNode;
+ wpLicenseRow = wpLicense.parentNode.parentNode;
+ wpLicenseTbody = wpLicenseRow.parentNode;
- var row = document.createElement( 'tr' );
- var td = document.createElement( 'td' );
+ row = document.createElement( 'tr' );
+ td = document.createElement( 'td' );
row.appendChild( td );
td = document.createElement( 'td' );
td.id = 'mw-license-preview';
@@ -78,156 +87,185 @@ function uploadSetup() {
// fillDestFile setup
- var i,
- uploadSourceIds = mw.config.get( 'wgUploadSourceIds' ),
- len = uploadSourceIds.length;
- for ( i = 0; i < len; i += 1 )
- document.getElementById( uploadSourceIds[i] ).onchange = function (e) {
- fillDestFilename( this.id );
- };
-};
+ uploadSourceIds = mw.config.get( 'wgUploadSourceIds' );
+ len = uploadSourceIds.length;
+ onchange = function () {
+ fillDestFilename( this.id );
+ };
+ for ( i = 0; i < len; i += 1 ) {
+ document.getElementById( uploadSourceIds[i] ).onchange = onchange;
+ }
+}
+wgUploadWarningObj = window.wgUploadWarningObj = {
+ responseCache: { '' : '&nbsp;' },
+ nameToCheck: '',
+ typing: false,
+ delay: 500, // ms
+ timeoutID: false,
-window.wgUploadWarningObj = {
- 'responseCache' : { '' : '&nbsp;' },
- 'nameToCheck' : '',
- 'typing': false,
- 'delay': 500, // ms
- 'timeoutID': false,
+ keypress: function () {
+ var cached, destFile, warningElt;
- 'keypress': function () {
- if ( !ajaxUploadDestCheck || !sajax_init_object() ) return;
+ if ( !ajaxUploadDestCheck ) {
+ return;
+ }
// Find file to upload
- var destFile = document.getElementById('wpDestFile');
- var warningElt = document.getElementById( 'wpDestFile-warning' );
- if ( !destFile || !warningElt ) return ;
+ destFile = document.getElementById( 'wpDestFile' );
+ warningElt = document.getElementById( 'wpDestFile-warning' );
+ if ( !destFile || !warningElt ) {
+ return;
+ }
- this.nameToCheck = destFile.value ;
+ this.nameToCheck = destFile.value;
// Clear timer
if ( this.timeoutID ) {
- window.clearTimeout( this.timeoutID );
+ clearTimeout( this.timeoutID );
}
// Check response cache
- for (cached in this.responseCache) {
- if (this.nameToCheck == cached) {
+ for ( cached in this.responseCache ) {
+ if ( this.nameToCheck === cached ) {
this.setWarning(this.responseCache[this.nameToCheck]);
return;
}
}
- this.timeoutID = window.setTimeout( 'wgUploadWarningObj.timeout()', this.delay );
+ this.timeoutID = setTimeout( function () {
+ wgUploadWarningObj.timeout();
+ }, this.delay );
},
- 'checkNow': function (fname) {
- if ( !ajaxUploadDestCheck || !sajax_init_object() ) return;
+ checkNow: function ( fname ) {
+ if ( !ajaxUploadDestCheck ) {
+ return;
+ }
if ( this.timeoutID ) {
- window.clearTimeout( this.timeoutID );
+ clearTimeout( this.timeoutID );
}
this.nameToCheck = fname;
this.timeout();
},
- 'timeout' : function() {
- if ( !ajaxUploadDestCheck || !sajax_init_object() ) return;
- injectSpinner( document.getElementById( 'wpDestFile' ), 'destcheck' );
-
- // Get variables into local scope so that they will be preserved for the
- // anonymous callback. fileName is copied so that multiple overlapping
- // ajax requests can be supported.
- var obj = this;
- var fileName = this.nameToCheck;
- sajax_do_call( 'SpecialUpload::ajaxGetExistsWarning', [this.nameToCheck],
- function (result) {
- obj.processResult(result, fileName)
+ timeout: function () {
+ if ( !ajaxUploadDestCheck || this.nameToCheck === '' ) {
+ return;
+ }
+ $spinnerDestCheck = $.createSpinner().insertAfter( '#wpDestFile' );
+
+ var uploadWarningObj = this;
+ ( new mw.Api() ).get( {
+ action: 'query',
+ titles: ( new mw.Title( this.nameToCheck, mw.config.get( 'wgNamespaceIds' ).file ) ).getPrefixedText(),
+ prop: 'imageinfo',
+ iiprop: 'uploadwarning',
+ indexpageids: ''
+ } ).done( function ( result ) {
+ var resultOut = '';
+ if ( result.query ) {
+ resultOut = result.query.pages[result.query.pageids[0]].imageinfo[0];
}
- );
+ uploadWarningObj.processResult( resultOut, uploadWarningObj.nameToCheck );
+ } );
},
- 'processResult' : function (result, fileName) {
- removeSpinner( 'destcheck' );
- this.setWarning(result.responseText);
- this.responseCache[fileName] = result.responseText;
+ processResult: function ( result, fileName ) {
+ $spinnerDestCheck.remove();
+ $spinnerDestCheck = undefined;
+ this.setWarning( result.html );
+ this.responseCache[fileName] = result.html;
},
- 'setWarning' : function (warning) {
- var warningElt = document.getElementById( 'wpDestFile-warning' );
- var ackElt = document.getElementsByName( 'wpDestFileWarningAck' );
+ setWarning: function ( warning ) {
+ var warningElt = document.getElementById( 'wpDestFile-warning' ),
+ ackElt = document.getElementsByName( 'wpDestFileWarningAck' );
- this.setInnerHTML(warningElt, warning);
+ this.setInnerHTML( warningElt, warning );
// Set a value in the form indicating that the warning is acknowledged and
// doesn't need to be redisplayed post-upload
- if ( warning == '' || warning == '&nbsp;' ) {
+ if ( !warning ) {
ackElt[0].value = '';
} else {
ackElt[0].value = '1';
}
},
- 'setInnerHTML' : function (element, text) {
+ setInnerHTML: function ( element, text ) {
// Check for no change to avoid flicker in IE 7
- if (element.innerHTML != text) {
+ if ( element.innerHTML !== text ) {
element.innerHTML = text;
}
}
};
-window.fillDestFilename = function(id) {
+fillDestFilename = window.fillDestFilename = function ( id ) {
+ var e, path, slash, backslash, fname,
+ found, ext, i,
+ destFile;
if ( !mw.config.get( 'wgUploadAutoFill' ) ) {
return;
}
- if (!document.getElementById) {
+ if ( !document.getElementById ) {
return;
}
// Remove any previously flagged errors
- var e = document.getElementById( 'mw-upload-permitted' );
- if( e ) e.className = '';
+ e = document.getElementById( 'mw-upload-permitted' );
+ if ( e ) {
+ e.className = '';
+ }
- var e = document.getElementById( 'mw-upload-prohibited' );
- if( e ) e.className = '';
+ e = document.getElementById( 'mw-upload-prohibited' );
+ if ( e ) {
+ e.className = '';
+ }
- var path = document.getElementById(id).value;
+ path = document.getElementById( id ).value;
// Find trailing part
- var slash = path.lastIndexOf('/');
- var backslash = path.lastIndexOf('\\');
- var fname;
- if (slash == -1 && backslash == -1) {
+ slash = path.lastIndexOf( '/' );
+ backslash = path.lastIndexOf( '\\' );
+ if ( slash === -1 && backslash === -1 ) {
fname = path;
- } else if (slash > backslash) {
- fname = path.substring(slash+1, 10000);
+ } else if ( slash > backslash ) {
+ fname = path.substring( slash + 1, 10000 );
} else {
- fname = path.substring(backslash+1, 10000);
+ fname = path.substring( backslash + 1, 10000 );
}
// 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 ( mw.config.get( 'wgStrictFileExtensions' ) && fileExtensions && id !== 'wpUploadFileURL' ) {
- var found = false;
+ found = false;
if ( fname.lastIndexOf( '.' ) !== -1 ) {
- var ext = fname.substr( fname.lastIndexOf( '.' ) + 1 );
- for ( var i = 0; i < fileExtensions.length; i += 1 ) {
+ ext = fname.substr( fname.lastIndexOf( '.' ) + 1 );
+ for ( i = 0; i < fileExtensions.length; i += 1 ) {
if ( fileExtensions[i].toLowerCase() === ext.toLowerCase() ) {
found = true;
break;
}
}
}
- if( !found ) {
+ if ( !found ) {
// Not a valid extension
// Clear the upload and set mw-upload-permitted to error
- document.getElementById(id).value = '';
- var e = document.getElementById( 'mw-upload-permitted' );
- if( e ) e.className = 'error';
+ document.getElementById( id ).value = '';
+ e = document.getElementById( 'mw-upload-permitted' );
+ if ( e ) {
+ e.className = 'error';
+ }
- var e = document.getElementById( 'mw-upload-prohibited' );
- if( e ) e.className = 'error';
+ e = document.getElementById( 'mw-upload-prohibited' );
+ if ( e ) {
+ e.className = 'error';
+ }
// Clear wpDestFile as well
- var e = document.getElementById( 'wpDestFile' );
- if( e ) e.value = '';
+ e = document.getElementById( 'wpDestFile' );
+ if ( e ) {
+ e.value = '';
+ }
return false;
}
@@ -241,72 +279,78 @@ window.fillDestFilename = function(id) {
}
// Output result
- var destFile = document.getElementById( 'wpDestFile' );
+ destFile = document.getElementById( 'wpDestFile' );
if ( destFile ) {
// Call decodeURIComponent function to remove possible URL-encoded characters
// from the file name (bug 30390). Especially likely with upload-form-url.
// decodeURIComponent can throw an exception in input is invalid utf-8
try {
destFile.value = decodeURIComponent( fname );
- } catch ( e ) {
+ } catch ( err ) {
destFile.value = fname;
}
wgUploadWarningObj.checkNow( fname );
}
};
-window.toggleFilenameFiller = function() {
- if(!document.getElementById) return;
- var upfield = document.getElementById('wpUploadFile');
- var destName = document.getElementById('wpDestFile').value;
- wgUploadAutoFill = ( destName == '' || destName == ' ' );
+window.toggleFilenameFiller = function () {
+ if ( !document.getElementById ) {
+ return;
+ }
+ var destName = document.getElementById( 'wpDestFile' ).value;
+ mw.config.set( 'wgUploadAutoFill', !destName );
};
-window.wgUploadLicenseObj = {
+wgUploadLicenseObj = window.wgUploadLicenseObj = {
- 'responseCache' : { '' : '' },
+ responseCache: { '' : '' },
- 'fetchPreview': function( license ) {
- if ( !mw.config.get( 'wgAjaxLicensePreview' ) ) return;
- for (cached in this.responseCache) {
- if (cached == license) {
+ fetchPreview: function ( license ) {
+ var cached, title;
+ if ( !mw.config.get( 'wgAjaxLicensePreview' ) ) {
+ return;
+ }
+ for ( cached in this.responseCache ) {
+ if ( cached === license ) {
this.showPreview( this.responseCache[license] );
return;
}
}
- injectSpinner( document.getElementById( 'wpLicense' ), 'license' );
- var title = document.getElementById('wpDestFile').value;
- if ( !title ) title = 'File:Sample.jpg';
+ $spinnerLicense = $.createSpinner().insertAfter( '#wpLicense' );
- var url = mw.util.wikiScript( 'api' )
- + '?action=parse&text={{' + encodeURIComponent( license ) + '}}'
- + '&title=' + encodeURIComponent( title )
- + '&prop=text&pst&format=json';
+ title = document.getElementById( 'wpDestFile' ).value;
+ if ( !title ) {
+ title = 'File:Sample.jpg';
+ }
- var req = sajax_init_object();
- req.onreadystatechange = function() {
- if ( req.readyState == 4 && req.status == 200 )
- wgUploadLicenseObj.processResult( eval( '(' + req.responseText + ')' ), license );
- };
- req.open( 'GET', url, true );
- req.send( '' );
+ ( new mw.Api() ).get( {
+ action: 'parse',
+ text: '{{' + license + '}}',
+ title: title,
+ prop: 'text',
+ pst: ''
+ } ).done( function ( result ) {
+ wgUploadLicenseObj.processResult( result, license );
+ } );
},
- 'processResult' : function( result, license ) {
- removeSpinner( 'license' );
- this.responseCache[license] = result['parse']['text']['*'];
+ processResult: function ( result, license ) {
+ $spinnerLicense.remove();
+ $spinnerLicense = undefined;
+ this.responseCache[license] = result.parse.text['*'];
this.showPreview( this.responseCache[license] );
},
- 'showPreview' : function( preview ) {
+ showPreview: function ( preview ) {
var previewPanel = document.getElementById( 'mw-license-preview' );
- if( previewPanel.innerHTML != preview )
+ if ( previewPanel.innerHTML !== preview ) {
previewPanel.innerHTML = preview;
+ }
}
};
-$( document ).ready( uploadSetup );
+$( uploadSetup );
}( mediaWiki, jQuery ) );
diff --git a/skins/common/wikibits.js b/skins/common/wikibits.js
index 709cc334..d28ca0a3 100644
--- a/skins/common/wikibits.js
+++ b/skins/common/wikibits.js
@@ -1,496 +1,36 @@
/**
* MediaWiki legacy wikibits
*/
-( function ( mw ) {
-
-window.clientPC = navigator.userAgent.toLowerCase(); // Get client info
-window.is_gecko = /gecko/.test( clientPC ) &&
- !/khtml|spoofer|netscape\/7\.0/.test(clientPC);
-
-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) {
- window.is_safari = clientPC.indexOf('applewebkit') != -1 &&
- clientPC.indexOf('spoofer') == -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!
-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
-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) {
- 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)
-window.ie6_bugs = false;
-if ( /msie ([0-9]{1,}[\.0-9]{0,})/.exec( clientPC ) != null
-&& parseFloat( RegExp.$1 ) <= 6.0 ) {
- ie6_bugs = true;
-}
-
-// add any onload functions in this hook (please don't hard-code any events in the xhtml source)
-window.doneOnloadHook = undefined;
-
-if (!window.onloadFuncts) {
- window.onloadFuncts = [];
-}
-
-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
- }
-};
-
-window.importScript = function( page ) {
- var uri = mw.config.get( 'wgScript' ) + '?title=' +
- mw.util.wikiUrlencode( page ) +
- '&action=raw&ctype=text/javascript';
- return importScriptURI( uri );
-};
-
-window.loadedScripts = {}; // included-scripts tracker
-window.importScriptURI = function( url ) {
- if ( loadedScripts[url] ) {
- return null;
- }
- loadedScripts[url] = true;
- var s = document.createElement( 'script' );
- s.setAttribute( 'src', url );
- s.setAttribute( 'type', 'text/javascript' );
- document.getElementsByTagName('head')[0].appendChild( s );
- return s;
-};
-
-window.importStylesheet = function( page ) {
- return importStylesheetURI( mw.config.get( 'wgScript' ) + '?action=raw&ctype=text/css&title=' + mw.util.wikiUrlencode( page ) );
-};
-
-window.importStylesheetURI = function( url, media ) {
- var l = document.createElement( 'link' );
- l.rel = 'stylesheet';
- l.href = url;
- if ( media ) {
- l.media = media;
- }
- document.getElementsByTagName('head')[0].appendChild( l );
- return l;
-};
-
-window.appendCSS = 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;
-};
-
-// Special stylesheet links for Monobook only (see bug 14717)
-var skinpath = mw.config.get( 'stylepath' ) + '/' + mw.config.get( 'skin' );
-if ( mw.config.get( 'skin' ) === 'monobook' ) {
- if ( opera6_bugs ) {
- importStylesheetURI( skinpath + '/Opera6Fixes.css' );
- } else if ( opera7_bugs ) {
- importStylesheetURI( skinpath + '/Opera7Fixes.css' );
- } else if ( opera95_bugs ) {
- importStylesheetURI( skinpath + '/Opera9Fixes.css' );
- }
-}
+( function ( mw, $ ) {
+ var msg,
+ win = window,
+ ua = navigator.userAgent.toLowerCase(),
+ isIE6 = ( /msie ([0-9]{1,}[\.0-9]{0,})/.exec( ua ) && parseFloat( RegExp.$1 ) <= 6.0 ),
+ isGecko = /gecko/.test( ua ) && !/khtml|spoofer|netscape\/7\.0/.test( ua ),
+ onloadFuncts = [];
if ( mw.config.get( 'wgBreakFrames' ) ) {
- // Un-trap us from framesets
- if ( window.top != window ) {
- window.top.location = window.location;
+ // Note: In IE < 9 strict comparison to window is non-standard (the standard didn't exist yet)
+ // it works only comparing to window.self or window.window (http://stackoverflow.com/q/4850978/319266)
+ if ( win.top !== win.self ) {
+ // Un-trap us from framesets
+ win.top.location = win.location;
}
}
-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;
- }
-};
-
-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.mwEditButtons = [];
-window.mwCustomEditButtons = []; // eg to add in MediaWiki:Common.js
-
-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 );
-};
-
-window.escapeQuotesHTML = function( text ) {
- var re = new RegExp( '&', "g" );
- text = text.replace( re, "&amp;" );
- re = new RegExp( '"', "g" );
- text = text.replace( re, "&quot;" );
- re = new RegExp( '<', "g" );
- text = text.replace( re, "&lt;" );
- re = new RegExp( '>', "g" );
- text = text.replace( re, "&gt;" );
- return text;
-};
-
-/**
- * Set the accesskey prefix based on browser detection.
- */
-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
- || clientPC.indexOf('mac') != -1
- || clientPC.indexOf('konqueror') != -1 ) ) {
- tooltipAccessKeyPrefix = 'ctrl-';
-} else if ( is_ff2 ) {
- tooltipAccessKeyPrefix = 'alt-shift-';
-}
-window.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 Array list of elements to update
- */
-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
- // optimization technique.
- var linkContainers = [
- 'column-one', // Monobook and Modern
- 'mw-head', 'mw-panel', 'p-logo' // Vector
- ];
- for ( var i in linkContainers ) {
- var linkContainer = document.getElementById( linkContainers[i] );
- if ( linkContainer ) {
- updateTooltipAccessKeys( linkContainer.getElementsByTagName( 'a' ) );
- }
- }
- // these are rare enough that no such optimization is needed
- updateTooltipAccessKeys( document.getElementsByTagName( 'input' ) );
- updateTooltipAccessKeys( document.getElementsByTagName( 'label' ) );
- return;
- }
-
- for ( var i = 0; i < nodeList.length; i++ ) {
- var element = nodeList[i];
- var tip = element.getAttribute( 'title' );
- if ( tip && tooltipAccessKeyRegexp.exec( tip ) ) {
- tip = tip.replace(tooltipAccessKeyRegexp,
- '[' + tooltipAccessKeyPrefix + "$5]");
- element.setAttribute( 'title', tip );
- }
- }
-};
-
-/**
- * Add a link to one of the portlet menus on the page, including:
- *
- * p-cactions: Content actions (shown as tabs above the main content in Monobook)
- * p-personal: Personal tools (shown at the top right of the page in Monobook)
- * p-navigation: Navigation
- * p-tb: Toolbox
- *
- * This function exists for the convenience of custom JS authors. All
- * but the first three parameters are optional, though providing at
- * least an id and a 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 of
- * that item (easily obtained with document.getElementById()) as the
- * nextnode parameter; to add the link _after_ an existing item, pass
- * the node's nextSibling instead.
- *
- * @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
- */
-window.addPortletLink = function( portlet, href, text, id, tooltip, accesskey, nextnode ) {
- var root = document.getElementById( portlet );
- if ( !root ) {
- return null;
- }
- 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;
- }
-
- // unhide portlet if it was hidden before
- root.className = root.className.replace( /(^| )emptyPortlet( |$)/, "$2" );
-
- var link = document.createElement( 'a' );
- 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( span );
- if ( id ) {
- item.id = id;
- }
-
- if ( accesskey ) {
- link.setAttribute( 'accesskey', accesskey );
- tooltip += ' [' + accesskey + ']';
- }
- if ( tooltip ) {
- link.setAttribute( 'title', tooltip );
- }
- if ( accesskey && tooltip ) {
- updateTooltipAccessKeys( [link] );
- }
-
- if ( nextnode && nextnode.parentNode == node ) {
- node.insertBefore( item, nextnode );
- } else {
- node.appendChild( item ); // IE compatibility (?)
- }
-
- return item;
-};
-
-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
- }
- if ( el.innerText ) {
- return el.innerText; // IE doesn't have textContent
- }
- var str = '';
-
- var cs = el.childNodes;
- var l = cs.length;
- for ( var i = 0; i < l; i++ ) {
- switch ( cs[i].nodeType ) {
- case 1: // ELEMENT_NODE
- str += getInnerText( cs[i] );
- break;
- case 3: // TEXT_NODE
- str += cs[i].nodeValue;
- break;
- }
- }
- return str;
-};
-
-window.checkboxes = undefined;
-window.lastCheckbox = undefined;
-
-window.setupCheckboxShiftClick = function() {
- checkboxes = [];
- lastCheckbox = null;
- var inputs = document.getElementsByTagName( 'input' );
- addCheckboxClickHandlers( inputs );
-};
-
-window.addCheckboxClickHandlers = function( inputs, start ) {
- if ( !start ) {
- start = 0;
- }
-
- var finish = start + 250;
- if ( finish > inputs.length ) {
- finish = inputs.length;
- }
-
- for ( var i = start; i < finish; i++ ) {
- var cb = inputs[i];
- if ( !cb.type || cb.type.toLowerCase() != 'checkbox' || ( ' ' + cb.className + ' ' ).indexOf( ' noshiftselect ' ) != -1 ) {
- continue;
- }
- var end = checkboxes.length;
- checkboxes[end] = cb;
- cb.index = end;
- addClickHandler( cb, checkboxClickHandler );
- }
-
- if ( finish < inputs.length ) {
- setTimeout( function() {
- addCheckboxClickHandlers( inputs, finish );
- }, 200 );
- }
-};
-
-window.checkboxClickHandler = function( e ) {
- if ( typeof e == 'undefined' ) {
- e = window.event;
- }
- if ( !e.shiftKey || lastCheckbox === null ) {
- lastCheckbox = this.index;
- return true;
- }
- var endState = this.checked;
- var start, finish;
- if ( this.index < lastCheckbox ) {
- start = this.index + 1;
- finish = lastCheckbox;
- } else {
- start = lastCheckbox;
- finish = this.index - 1;
- }
- for ( var i = start; i <= finish; ++i ) {
- checkboxes[i].checked = endState;
- if( i > start && typeof checkboxes[i].onchange == 'function' ) {
- checkboxes[i].onchange(); // fire triggers
- }
- }
- lastCheckbox = this.index;
- return true;
-};
-
-
-/*
- Written by Jonathan Snook, http://www.snook.ca/jonathan
- Add-ons by Robert Nyman, http://www.robertnyman.com
- 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/
-*/
-window.getElementsByClassName = function( oElm, strTagName, oClassNames ) {
- var arrReturnElements = [];
- if ( typeof( oElm.getElementsByClassName ) == 'function' ) {
- /* Use a native implementation where possible FF3, Saf3.2, Opera 9.5 */
- var arrNativeReturn = oElm.getElementsByClassName( oClassNames );
- if ( strTagName == '*' ) {
- return arrNativeReturn;
- }
- for ( var h = 0; h < arrNativeReturn.length; h++ ) {
- if( arrNativeReturn[h].tagName.toLowerCase() == strTagName.toLowerCase() ) {
- arrReturnElements[arrReturnElements.length] = arrNativeReturn[h];
- }
- }
- return arrReturnElements;
- }
- var arrElements = ( strTagName == '*' && oElm.all ) ? oElm.all : oElm.getElementsByTagName( strTagName );
- var arrRegExpClassNames = [];
- if( typeof oClassNames == 'object' ) {
- for( var i = 0; i < oClassNames.length; i++ ) {
- arrRegExpClassNames[arrRegExpClassNames.length] =
- new RegExp("(^|\\s)" + oClassNames[i].replace(/\-/g, "\\-") + "(\\s|$)");
- }
- } else {
- arrRegExpClassNames[arrRegExpClassNames.length] =
- new RegExp("(^|\\s)" + oClassNames.replace(/\-/g, "\\-") + "(\\s|$)");
- }
- var oElement;
- var bMatchesAll;
- for( var j = 0; j < arrElements.length; j++ ) {
- oElement = arrElements[j];
- bMatchesAll = true;
- for( var k = 0; k < arrRegExpClassNames.length; k++ ) {
- if( !arrRegExpClassNames[k].test( oElement.className ) ) {
- bMatchesAll = false;
- break;
- }
- }
- if( bMatchesAll ) {
- arrReturnElements[arrReturnElements.length] = oElement;
- }
- }
- return ( arrReturnElements );
-};
-
-window.redirectToFragment = function( fragment ) {
- var match = navigator.userAgent.match(/AppleWebKit\/(\d+)/);
+win.redirectToFragment = function ( fragment ) {
+ var webKitVersion,
+ match = navigator.userAgent.match( /AppleWebKit\/(\d+)/ );
if ( match ) {
- var webKitVersion = parseInt( match[1] );
+ webKitVersion = parseInt( match[1], 10 );
if ( webKitVersion < 420 ) {
// Released Safari w/ WebKit 418.9.1 messes up horribly
// Nightlies of 420+ are ok
return;
}
}
- if ( window.location.hash == '' ) {
- window.location.hash = fragment;
+ if ( !win.location.hash ) {
+ win.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>.
@@ -498,122 +38,211 @@ window.redirectToFragment = function( fragment ) {
// 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;
+ if ( isGecko ) {
+ $( function () {
+ if ( win.location.hash === fragment ) {
+ win.location.hash = fragment;
}
- });
+ } );
}
}
};
/**
- * Add a cute little box at the top of the screen to inform the user of
- * something, replacing any preexisting message.
+ * User-agent sniffing.
+ * To be removed in MediaWiki 1.23.
*
- * @deprecated since 1.17 Use the 'mediawiki.notify' module instead.
- * @param {String|HTMLElement} message To be put inside the message box.
+ * @deprecated since 1.17 Use jquery.client instead
*/
-window.jsMsg = function () {
- return mw.util.jsMessage.apply( mw.util, arguments );
-};
+
+msg = 'Use feature detection or module jquery.client instead';
+
+mw.log.deprecate( win, 'clientPC', ua, msg );
+
+// Ignored dummy values
+mw.log.deprecate( win, 'is_gecko', false, msg );
+mw.log.deprecate( win, 'is_chrome_mac', false, msg );
+mw.log.deprecate( win, 'is_chrome', false, msg );
+mw.log.deprecate( win, 'webkit_version', false, msg );
+mw.log.deprecate( win, 'is_safari_win', false, msg );
+mw.log.deprecate( win, 'is_safari', false, msg );
+mw.log.deprecate( win, 'webkit_match', false, msg );
+mw.log.deprecate( win, 'is_ff2', false, msg );
+mw.log.deprecate( win, 'ff2_bugs', false, msg );
+mw.log.deprecate( win, 'is_ff2_win', false, msg );
+mw.log.deprecate( win, 'is_ff2_x11', false, msg );
+mw.log.deprecate( win, 'opera95_bugs', false, msg );
+mw.log.deprecate( win, 'opera7_bugs', false, msg );
+mw.log.deprecate( win, 'opera6_bugs', false, msg );
+mw.log.deprecate( win, 'is_opera_95', false, msg );
+mw.log.deprecate( win, 'is_opera_preseven', false, msg );
+mw.log.deprecate( win, 'is_opera', false, msg );
+mw.log.deprecate( win, 'ie6_bugs', false, msg );
/**
- * Inject a cute little progress spinner after the specified element
+ * DOM utilities for handling of events, text nodes and selecting elements
+ *
+ * To be removed in MediaWiki 1.23.
*
- * @param element Element to inject after
- * @param id Identifier string (for use with removeSpinner(), below)
+ * @deprecated since 1.17 Use jQuery instead
*/
-window.injectSpinner = function( element, id ) {
- var spinner = document.createElement( 'img' );
- spinner.id = 'mw-spinner-' + id;
- spinner.src = mw.config.get( 'stylepath' ) + '/common/images/spinner.gif';
- spinner.alt = spinner.title = '...';
- if( element.nextSibling ) {
- element.parentNode.insertBefore( spinner, element.nextSibling );
+msg = 'Use jQuery instead';
+
+// Ignored dummy values
+mw.log.deprecate( win, 'doneOnloadHook', undefined, msg );
+mw.log.deprecate( win, 'onloadFuncts', [], msg );
+mw.log.deprecate( win, 'runOnloadHook', $.noop, msg );
+mw.log.deprecate( win, 'changeText', $.noop, msg );
+mw.log.deprecate( win, 'killEvt', $.noop, msg );
+mw.log.deprecate( win, 'addHandler', $.noop, msg );
+mw.log.deprecate( win, 'hookEvent', $.noop, msg );
+mw.log.deprecate( win, 'addClickHandler', $.noop, msg );
+mw.log.deprecate( win, 'removeHandler', $.noop, msg );
+mw.log.deprecate( win, 'getElementsByClassName', function () { return []; }, msg );
+mw.log.deprecate( win, 'getInnerText', function () { return ''; }, msg );
+
+// Run a function after the window onload event is fired
+mw.log.deprecate( win, 'addOnloadHook', function ( hookFunct ) {
+ if ( onloadFuncts ) {
+ onloadFuncts.push(hookFunct);
} else {
- element.parentNode.appendChild( spinner );
+ // If func queue is gone the event has happened already,
+ // run immediately instead of queueing.
+ hookFunct();
}
-};
+}, msg );
-/**
- * Remove a progress spinner added with injectSpinner()
- *
- * @param id Identifier string
- */
-window.removeSpinner = function( id ) {
- var spinner = document.getElementById( 'mw-spinner-' + id );
- if( spinner ) {
- spinner.parentNode.removeChild( spinner );
- }
-};
+$( win ).on( 'load', function () {
+ var i, functs;
-window.runOnloadHook = function() {
- // don't run anything below this for non-dom browsers
- if ( doneOnloadHook || !( document.getElementById && document.getElementsByTagName ) ) {
+ // Don't run twice
+ if ( !onloadFuncts ) {
return;
}
- // set this before running any hooks, since any errors below
- // might cause the function to terminate prematurely
- doneOnloadHook = true;
+ // Deference and clear onloadFuncts before running any
+ // hooks to make sure we don't miss any addOnloadHook
+ // calls.
+ functs = onloadFuncts.slice();
+ onloadFuncts = undefined;
- // Run any added-on functions
- for ( var i = 0; i < onloadFuncts.length; i++ ) {
- onloadFuncts[i]();
+ // Execute the queued functions
+ for ( i = 0; i < functs.length; i++ ) {
+ functs[i]();
}
-};
+} );
/**
- * Add an event handler to an element
+ * Toggle checkboxes with shift selection
+ *
+ * To be removed in MediaWiki 1.23.
*
- * @param element Element to add handler to
- * @param attach String Event to attach to
- * @param handler callable Event handler callback
+ * @deprecated since 1.17 Use jquery.checkboxShiftClick instead
*/
-window.addHandler = function( element, attach, handler ) {
- if( element.addEventListener ) {
- element.addEventListener( attach, handler, false );
- } else if( element.attachEvent ) {
- element.attachEvent( 'on' + attach, handler );
- }
-};
+msg = 'Use jquery.checkboxShiftClick instead';
+mw.log.deprecate( win, 'checkboxes', [], msg );
+mw.log.deprecate( win, 'lastCheckbox', null, msg );
+mw.log.deprecate( win, 'setupCheckboxShiftClick', $.noop, msg );
+mw.log.deprecate( win, 'addCheckboxClickHandlers', $.noop, msg );
+mw.log.deprecate( win, 'checkboxClickHandler', $.noop, msg );
-window.hookEvent = function( hookName, hookFunct ) {
- addHandler( window, hookName, hookFunct );
-};
+/**
+ * Add a button to the default editor toolbar
+ *
+ * To be removed in MediaWiki 1.23.
+ *
+ * @deprecated since 1.17 Use mw.toolbar instead
+ */
+mw.log.deprecate( win, 'mwEditButtons', [], 'Use mw.toolbar instead' );
+mw.log.deprecate( win, 'mwCustomEditButtons', [], 'Use mw.toolbar instead' );
/**
- * Add a click event handler to an element
+ * Spinner creation, injection and removal
+ *
+ * To be removed in MediaWiki 1.23.
*
- * @param element Element to add handler to
- * @param handler callable Event handler callback
+ * @deprecated since 1.18 Use jquery.spinner instead
*/
-window.addClickHandler = function( element, handler ) {
- addHandler( element, 'click', handler );
-};
+mw.log.deprecate( win, 'injectSpinner', $.noop, 'Use jquery.spinner instead' );
+mw.log.deprecate( win, 'removeSpinner', $.noop, 'Use jquery.spinner instead' );
/**
- * Removes an event handler from an element
+ * Escape utilities
*
- * @param element Element to remove handler from
- * @param remove String Event to remove
- * @param handler callable Event handler callback to remove
+ * To be removed in MediaWiki 1.23.
+ *
+ * @deprecated since 1.18 Use mw.html instead
*/
-window.removeHandler = function( element, remove, handler ) {
- if( window.removeEventListener ) {
- element.removeEventListener( remove, handler, false );
- } else if( window.detachEvent ) {
- element.detachEvent( 'on' + remove, handler );
+mw.log.deprecate( win, 'escapeQuotes', $.noop,'Use mw.html instead' );
+mw.log.deprecate( win, 'escapeQuotesHTML', $.noop,'Use mw.html instead' );
+
+/**
+ * Display a message to the user
+ *
+ * To be removed in MediaWiki 1.23.
+ *
+ * @deprecated since 1.17 Use mediawiki.notify instead
+ * @param {string|HTMLElement} message To be put inside the message box
+ */
+mw.log.deprecate( win, 'jsMsg', mw.util.jsMessage, 'Use mediawiki.notify instead' );
+
+/**
+ * Misc. utilities
+ *
+ * To be removed in MediaWiki 1.23.
+ *
+ * @deprecated since 1.17 Use mediawiki.util instead
+ */
+msg = 'Use mediawiki.util instead';
+mw.log.deprecate( win, 'tooltipAccessKeyPrefix', 'alt-', msg );
+mw.log.deprecate( win, 'tooltipAccessKeyRegexp', /\[(alt-)?(.)\]$/, msg );
+mw.log.deprecate( win, 'updateTooltipAccessKeys', mw.util.updateTooltipAccessKeys, msg );
+mw.log.deprecate( win, 'addPortletLink', mw.util.addPortletLink, msg );
+mw.log.deprecate( win, 'appendCSS', mw.util.addCSS, msg );
+
+/**
+ * Wikipage import methods
+ */
+
+// included-scripts tracker
+win.loadedScripts = {};
+
+win.importScript = function ( page ) {
+ var uri = mw.config.get( 'wgScript' ) + '?title=' +
+ mw.util.wikiUrlencode( page ) +
+ '&action=raw&ctype=text/javascript';
+ return win.importScriptURI( uri );
+};
+
+win.importScriptURI = function ( url ) {
+ if ( win.loadedScripts[url] ) {
+ return null;
}
+ win.loadedScripts[url] = true;
+ var s = document.createElement( 'script' );
+ s.setAttribute( 'src', url );
+ s.setAttribute( 'type', 'text/javascript' );
+ document.getElementsByTagName( 'head' )[0].appendChild( s );
+ return s;
+};
+
+win.importStylesheet = function( page ) {
+ return win.importStylesheetURI( mw.config.get( 'wgScript' ) + '?action=raw&ctype=text/css&title=' + mw.util.wikiUrlencode( page ) );
+};
+
+win.importStylesheetURI = function( url, media ) {
+ var l = document.createElement( 'link' );
+ l.rel = 'stylesheet';
+ l.href = url;
+ if ( media ) {
+ l.media = media;
+ }
+ document.getElementsByTagName('head')[0].appendChild( l );
+ return l;
};
-// 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 );
-if ( ie6_bugs ) {
- importScriptURI( mw.config.get( 'stylepath' ) + '/common/IEFixes.js' );
+if ( isIE6 ) {
+ win.importScriptURI( mw.config.get( 'stylepath' ) + '/common/IEFixes.js' );
}
-}( mediaWiki ) );
+}( mediaWiki, jQuery ) );
diff --git a/skins/common/wikiprintable.css b/skins/common/wikiprintable.css
deleted file mode 100644
index 95fcfef3..00000000
--- a/skins/common/wikiprintable.css
+++ /dev/null
@@ -1,59 +0,0 @@
-/* MediaWiki print stylesheet */
-
-body {
- color: #000000;
- background: #ffffff;
-}
-
-/* MSIE/Win doesn't understand 'inherit' */
-a,
-a.external,
-a.new,
-a.stub {
- color: black !important;
- text-decoration: none !important;
-}
-#article {
- margin: 0 !important;
-}
-
-/* Continue ... */
-a,
-a.external,
-a.new,
-a.stub {
- color: inherit !important;
- text-decoration: inherit !important;
-}
-
-/* Hide UI stuff */
-#quickbar,
-#topbar,
-#logo,
-#footer,
-#siteNotice,
-.editsection,
-.toctoggle {
- display: none;
-}
-
-/* */
-#article {
- position: relative;
- margin: inherit !important;
-}
-
-.printfooter {
- border-top: solid 1px black;
- display: block !important;
-}
-
-/* Old stuff. @todo FIXME:
-a.CBlink { color: #0000AA; text-decoration: none; font-size: 12pt; }
-a.interwiki,
-a.external { color: #3333BB; text-decoration: none; }
-h1.pagetitle { padding-bottom: 0; margin-bottom: 0; }
-i.link,
-u.link { color: #000066; }
-p.subtitle { padding-top: 0; margin-top: 0; }
-*/
diff --git a/skins/modern/external.png b/skins/modern/external.png
index acf260fc..63083831 100644
--- a/skins/modern/external.png
+++ b/skins/modern/external.png
Binary files differ
diff --git a/skins/modern/main.css b/skins/modern/main.css
index f201209d..40fbfd78 100644
--- a/skins/modern/main.css
+++ b/skins/modern/main.css
@@ -58,8 +58,7 @@ body {
font-variant: small-caps;
}
-#p-personal h3,
-#p-personal h5 {
+#p-personal h3 {
display: none;
}
@@ -177,8 +176,7 @@ textarea {
margin-top: .4em;
}
-.portlet h3,
-.portlet h5 {
+.portlet h3 {
padding: 0.1em 0 0.3em 1em;
margin: 0 0 0 0;
background-color: #dddddd;
@@ -252,8 +250,7 @@ ul {
color: white;
}
-#p-cactions h3,
-#p-cactions h5 {
+#p-cactions h3 {
display: none;
}
@@ -340,10 +337,6 @@ a.new:visited {
color: #a55858;
}
-span.editsection {
- font-size: small;
-}
-
h1, h2 {
border-bottom: solid 1px #003366;
}
@@ -412,13 +405,7 @@ h1, h2, h3, h4, h5, h6 {
text-decoration: none;
color: white;
}
-
-#mw-pref-clear {
- clear: both;
-}
-
-#mw_content a.external,
-#mw_content a.external[href ^="gopher://"] {
+#mw_content a.external {
/* @embed */
background: url(external.png) center right no-repeat;
padding-right: 13px;
@@ -526,6 +513,7 @@ div.magnify {
float: right;
border: none !important;
background: none !important;
+ margin-left: 3px;
}
div.magnify a, div.magnify img {
display: block;
@@ -555,6 +543,27 @@ img.thumbborder {
border-spacing: 0;
background-color: #f0f0f0;
border: solid 1px #bbbbbb;
+ display: -moz-inline-block;
+ display: inline-block;
+ display: table;
+
+ /* IE7 and earliers */
+ zoom: 1;
+ *display: inline;
+
+ padding: 7px;
+}
+
+/* CSS for backwards-compatibility with cached page renders and creative uses in wikitext */
+table#toc,
+table.toc {
+ border-collapse: collapse;
+}
+
+/* Remove additional paddings inside table-cells that are not present in <div>s */
+table#toc td,
+table.toc td {
+ padding: 0;
}
#toc tr, #toc td {
diff --git a/skins/modern/print.css b/skins/modern/print.css
index 82784100..e97bbdb4 100644
--- a/skins/modern/print.css
+++ b/skins/modern/print.css
@@ -3,7 +3,7 @@
#p-personal,
#jump-to-nav,
#footer,
-span.editsection,
+.mw-editsection,
.noprint {
display: none;
}
diff --git a/skins/monobook/IE60Fixes.css b/skins/monobook/IE60Fixes.css
index ec1ce430..534d3333 100644
--- a/skins/monobook/IE60Fixes.css
+++ b/skins/monobook/IE60Fixes.css
@@ -70,15 +70,6 @@ div#footer {
#portal-personaltools {
padding-bottom: 0.1em;
}
-#bodyContent a.external {
- background: url(external.png) center right no-repeat;
- padding-right: 13px;
-}
-
-.rtl #bodyContent a.external {
- background-image: url(external-rtl.png);
- padding-right: 13px;
-}
.rtl a.feedlink {
background-position: right;
diff --git a/skins/monobook/Opera6Fixes.css b/skins/monobook/Opera6Fixes.css
deleted file mode 100644
index 77dec095..00000000
--- a/skins/monobook/Opera6Fixes.css
+++ /dev/null
@@ -1,20 +0,0 @@
-/* opera 6 fixes */
-div#column-one {
- position: relative;
- max-width: 11.7em;
-}
-#p-personal {
- width: 45em;
- margin-left: 8.6em;
- right: 0;
-}
-#bodyContent a.external {
- background: url(external.png) center right no-repeat;
- padding-right: 13px;
-}
-
-.rtl a.feedlink {
- background-position: right;
- padding-right: 0;
- padding-left: 16px;
-}
diff --git a/skins/monobook/Opera7Fixes.css b/skins/monobook/Opera7Fixes.css
deleted file mode 100644
index 1dcba7c9..00000000
--- a/skins/monobook/Opera7Fixes.css
+++ /dev/null
@@ -1,21 +0,0 @@
-/* small tweaks for opera seven */
-#p-cactions {
- margin-top: .1em;
-}
-#p-cactions li a {
- top: 2px;
-}
-#bodyContent a.external {
- background: url(external.png) center right no-repeat;
- padding-right: 13px;
-}
-.rtl #bodyContent a.external {
- background-image: url(external-rtl.png);
- padding-right: 13px;
-}
-
-.rtl a.feedlink {
- background-position: right;
- padding-right: 0;
- padding-left: 16px;
-}
diff --git a/skins/monobook/Opera9Fixes.css b/skins/monobook/Opera9Fixes.css
deleted file mode 100644
index 9c312a84..00000000
--- a/skins/monobook/Opera9Fixes.css
+++ /dev/null
@@ -1,11 +0,0 @@
-.rtl #bodyContent a.external {
- background-image: url(external-rtl.png);
- padding-right: 13px;
- padding-left: 0;
-}
-
-.rtl a.feedlink {
- background-position: right;
- padding-right: 0;
- padding-left: 16px;
-}
diff --git a/skins/monobook/external-ltr.png b/skins/monobook/external-ltr.png
index acf260fc..63083831 100644
--- a/skins/monobook/external-ltr.png
+++ b/skins/monobook/external-ltr.png
Binary files differ
diff --git a/skins/monobook/external-rtl.png b/skins/monobook/external-rtl.png
index 7d5ee375..5313234e 100644
--- a/skins/monobook/external-rtl.png
+++ b/skins/monobook/external-rtl.png
Binary files differ
diff --git a/skins/monobook/main.css b/skins/monobook/main.css
index 4cbc0939..d8f25ebb 100644
--- a/skins/monobook/main.css
+++ b/skins/monobook/main.css
@@ -17,7 +17,7 @@ div#column-content {
}
div#content {
margin: 2.8em 0 0 12.2em;
- padding: 0 1em 1em 1em;
+ padding: 1em;
position: relative;
z-index: 2;
}
@@ -93,6 +93,9 @@ pre, .mw-code {
line-height: 1.1em;
}
+#firstHeading {
+ padding-top: 0;
+}
/*
** the main content area
*/
@@ -139,8 +142,7 @@ table.rimage {
** keep the whitespace in front of the ^=, hides rule from konqueror
** this is css3, the validator doesn't like it when validating as css2
*/
-#bodyContent a.external,
-#bodyContent a.external[href ^="gopher://"] {
+#bodyContent a.external {
/* @embed */
background: url(external-ltr.png) center right no-repeat;
padding-right: 13px;
@@ -319,7 +321,7 @@ input.searchButton {
position: absolute;
left: 0;
top: 0;
- z-index: 0;
+ z-index: 3;
}
#p-personal {
width: 100%;
@@ -381,19 +383,22 @@ input.searchButton {
#p-personal li.active a:hover {
background-color: transparent;
}
-/* the icon in front of the user name, single quotes
-in bg url to hide it from iemac */
+/* The icon in front of the username / login link */
li#pt-userpage,
li#pt-anonuserpage,
li#pt-login {
/* @embed */
background: url(user.gif) top left no-repeat;
padding-left: 20px;
- text-transform: none;
}
#p-personal ul {
text-transform: lowercase;
}
+/* Don't lowercase username or IP addresses (IPv6) */
+li#pt-userpage,
+li#pt-anonuserpage {
+ text-transform: none;
+}
#p-personal li.active {
font-weight: bold;
}
@@ -422,14 +427,13 @@ li#pt-login {
display: inline;
border: 1px solid #aaa;
border-bottom: none;
- padding: 0 0 .1em 0;
+ padding: 0 0 1em 0;
margin: 0 .3em 0 0;
overflow: visible;
background: white;
}
#p-cactions li.selected {
border-color: #fabd23;
- padding: 0 0 .2em 0;
font-weight: bold;
}
#p-cactions li a {
@@ -515,7 +519,8 @@ div#footer {
border-top: 1px solid #fabd23;
border-bottom: 1px solid #fabd23;
margin: .6em 0 1em 0;
- padding: .4em 0 1.2em 0;
+ overflow: hidden;
+ padding: .4em 0 .3em 0;
text-align: center;
font-size: 90%;
}
@@ -897,6 +902,5 @@ div.mw-lag-warn-high {
/* mediawiki.notification */
.skin-monobook .mw-notification {
-webkit-box-shadow: 0 2px 5px 0 rgba(0, 0, 0, 0.125);
- -moz-box-shadow: 0 2px 5px 0 rgba(0, 0, 0, 0.125);
box-shadow: 0 2px 5px 0 rgba(0, 0, 0, 0.125);
}
diff --git a/skins/monobook/wiki-indexed.png b/skins/monobook/wiki-indexed.png
index 0ec584a3..799ebac8 100644
--- a/skins/monobook/wiki-indexed.png
+++ b/skins/monobook/wiki-indexed.png
Binary files differ
diff --git a/skins/myskin/main.css b/skins/myskin/main.css
deleted file mode 100644
index f3ab0204..00000000
--- a/skins/myskin/main.css
+++ /dev/null
@@ -1 +0,0 @@
-/* this file must be empty */
diff --git a/skins/nostalgia/screen.css b/skins/nostalgia/screen.css
deleted file mode 100644
index aed5715b..00000000
--- a/skins/nostalgia/screen.css
+++ /dev/null
@@ -1,56 +0,0 @@
-body {
- /* background color is set separately on page type */
- color: black;
-}
-
-#specialform {
- display: inline;
-}
-
-#powersearch {
- background: #DDEEFF;
- border-style: solid;
- border-width: 1px;
- padding: 2px;
-}
-
-a.new {
- color: #ba0000;
-}
-
-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;
-}
-div.sitenotice {
- clear: both;
-}
diff --git a/skins/simple/discussionitem_icon.gif b/skins/simple/discussionitem_icon.gif
deleted file mode 100644
index e3ca6d9e..00000000
--- a/skins/simple/discussionitem_icon.gif
+++ /dev/null
Binary files differ
diff --git a/skins/simple/external.png b/skins/simple/external.png
deleted file mode 100644
index acf260fc..00000000
--- a/skins/simple/external.png
+++ /dev/null
Binary files differ
diff --git a/skins/simple/file_icon.gif b/skins/simple/file_icon.gif
deleted file mode 100644
index 69dbeaf7..00000000
--- a/skins/simple/file_icon.gif
+++ /dev/null
Binary files differ
diff --git a/skins/simple/link_icon.gif b/skins/simple/link_icon.gif
deleted file mode 100644
index 168c1a2f..00000000
--- a/skins/simple/link_icon.gif
+++ /dev/null
Binary files differ
diff --git a/skins/simple/lock_icon.gif b/skins/simple/lock_icon.gif
deleted file mode 100644
index 82844033..00000000
--- a/skins/simple/lock_icon.gif
+++ /dev/null
Binary files differ
diff --git a/skins/simple/mail_icon.gif b/skins/simple/mail_icon.gif
deleted file mode 100644
index cf5680d9..00000000
--- a/skins/simple/mail_icon.gif
+++ /dev/null
Binary files differ
diff --git a/skins/simple/main.css b/skins/simple/main.css
deleted file mode 100644
index edb1d7d4..00000000
--- a/skins/simple/main.css
+++ /dev/null
@@ -1,427 +0,0 @@
-/**
- * For clarity, explicitly state some recommendations from
- * http://www.w3.org/TR/CSS21/sample.html to make sure the editsection links scale right.
- */
-
-h1 {
- font-size: 2em;
-}
-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;
-}
-
-/* Now the custom parts */
-
-/* Make edit sections (which are inside h# tags) normal-sized */
-.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%;
-}
-
-#toolbar {
- display: none;
-}
-
-div.center {
- text-align: center;
-}
-
-#contentSub {
- padding-left: 2em;
-}
-
-a {
- text-decoration: none;
-}
-
-a:hover {
- text-decoration: underline;
-}
-
-#column-content {
- width: 100%;
- float: right;
- margin: 0 0 0.6em -12.2em;
- padding: 0;
-}
-
-#content {
- margin: 0em 0 0 12.2em;
- padding: 0em 1em 1.5em 1em;
- border-left: 1px solid #959595;
- line-height: 1.5em;
-}
-
-#column-one {
- position: absolute;
- top: 0;
- left: 0;
-}
-
-/* Hide, but keep accessible for screen-readers */
-#column-one h2 {
- position: absolute;
- top: -9999px;
-}
-
-body {
- margin: 0;
- padding: 0;
-}
-
-#globalWrapper {
- width: 100%;
- height: 100%;
- margin: 0;
- padding: 0;
-}
-.visualClear {
- clear: both;
-}
-
-img {
- border: none;
-}
-p {
- margin: 0.4em 0em 0.5em 0em;
- line-height: 1.5em;
-}
-p img {
- margin: 0;
-}
-
-h1, h2, h3, h4, h5, h6 {
- margin: 0;
- padding-top: 0.5em;
- padding-bottom: 0.17em;
-}
-fieldset {
- margin: 1em 0em 1em 0em;
- padding: 0em 1em 1em 1em;
-}
-.usermessage {
- background-color: #ffce7b;
- border: 1px solid #ffa500;
- color: black;
- font-weight: bold;
- margin: 2em 0em 1em 0em;
- padding: 0.5em 1em;
- vertical-align: middle;
-}
-.error {
- color: red;
- font-size: larger;
-}
-
-table.rimage {
- float: right;
- position: relative;
- margin-left: 1em;
- margin-bottom: 1em;
- text-align: center;
-}
-
-.portlet {
- border: none;
- float: none;
- padding: 0;
- width: 11.8em;
- overflow: hidden;
-}
-.portlet h4 {
- font-weight: normal;
- white-space: nowrap;
-}
-.portlet h5 {
- padding: 0em 1em 0em 0.5em;
- display: inline;
- height: 1em;
- font-weight: normal;
- white-space: nowrap;
-}
-.portlet h6 {
- padding: 0em 1em 0em 1em;
- display: block;
- height: 1.2em;
- font-weight: normal;
- white-space: nowrap;
-}
-.pBody {
- border-collapse: collapse;
- padding: 0 0.8em 0.3em 0.5em;
-}
-.portlet h1,
-.portlet h2,
-.portlet h3,
-.portlet h4 {
- margin: 0;
- padding: 0;
- font-size: small;
-}
-
-#p-search .pBody {
- text-align: center;
-}
-
-#searchInput {
- width: 100%;
- clear: both;
- margin: 0 0 0 0;
-}
-
-input.searchButton {
- margin-top: 1px;
- padding: 0 0.4em;
- cursor: pointer;
-}
-
-#p-search .pBody {
- padding: 0.5em 0.4em 0.4em 0.4em;
-}
-
-/* feed links */
-a.feedlink {
- background: url(../common/images/feed-icon.png) center left no-repeat;
- padding-left: 16px;
-}
-
-textarea {
- width: 100%;
-}
-
-.pBody li,
-.pBody ul {
- padding-left: 0em;
- margin-left: 0.5em;
-}
-
-pre, .mw-code {
- margin: 2em;
- border: solid 1px black;
-}
-
-h1.firstHeading,
-h2 {
- border-bottom: solid 1px black;
-}
-#bodyContent a.external,
-#bodyContent a.external[href ^="gopher://"] {
- background: url(external.png) center right no-repeat;
- padding-right: 13px;
-}
-#bodyContent a.external[href ^="https://"],
-.link-https {
- background: url(lock_icon.gif) center right no-repeat;
- padding-right: 16px;
-}
-#bodyContent a.external[href ^="mailto:"],
-.link-mailto {
- background: url(mail_icon.gif) center right no-repeat;
- padding-right: 18px;
-}
-#bodyContent a.external[href ^="news:"] {
- background: url(news_icon.png) center right no-repeat;
- padding-right: 18px;
-}
-#bodyContent a.external[href ^="ftp://"],
-.link-ftp {
- background: url(file_icon.gif) center right no-repeat;
- padding-right: 18px;
-}
-#bodyContent a.external[href ^="irc://"],
-#bodyContent a.external[href ^="ircs://"],
-.link-irc {
- background: url(discussionitem_icon.gif) center right no-repeat;
- padding-right: 18px;
-}
-
-#bodyContent a.extiw,
-#bodyContent a.extiw:active {
- color: #5E7CFF;
-}
-
-td.diff-addedline {
- background-color: #B9FFB0;
-}
-
-td.diff-deletedline {
- background-color: #f8ffaa;
-}
-
-.diffchange {
- background-color: #FFCDF3;
- text-decoration: none;
-}
-
-#pagehistory li {
- border: none;
-}
-
-div.tocindent {
- margin-left: 2em;
-}
-#toc {
- text-align: left;
- border-top: solid 1px black;
- border-bottom: solid 1px black;
-}
-
-/* @noflip */div.floatright, table.floatright {
- margin: 0;
- border-width: 0.5em 0 0.8em 1.4em;
-}
-div.floatright p {
- font-style: italic;
-}
-/* @noflip */div.floatleft, table.floatleft {
- margin: 0.3em 0.5em 0.5em 0;
- border-width: 0.5em 1.4em 0.8em 0;
-}
-div.floatleft p {
- font-style: italic;
-}
-
-/* thumbnails */
-div.thumb {
- margin-bottom: 0.5em;
- width: auto;
-}
-div.thumbinner {
- padding: 3px !important;
- text-align: center;
- overflow: hidden;
-}
-
-html .thumbcaption {
- border: none;
- text-align: left;
- line-height: 1.4;
- padding: 0.3em 0 0.1em 0;
-}
-div.magnify {
- float: right;
- border: none !important;
- background: none !important;
-}
-div.magnify a,
-div.magnify img {
- display: block;
- border: none !important;
- background: none !important;
-}
-/* @noflip */div.tright {
- border-width: 0.5em 0 0.8em 1.4em;
-}
-/* @noflip */div.tleft {
- margin-right: 0.5em;
- border-width: 0.5em 1.4em 0.8em 0;
-}
-img.thumbborder {
- border: 1px solid #dddddd;
-}
-
-a.stub {
- color: #772233;
-}
-a.new,
-#p-personal a.new {
- color: #BA0000;
- text-decoration: line-through;
-}
-li.new {
- text-decoration: line-through;
-}
-/**
- * Overrides text justification (user preference)
- * See bug 31990
- */
-#catlinks {
- text-align: center;
-}
-.catlinks {
- text-align: center;
- width: 80%;
- margin-left: auto;
- margin-right: auto;
- padding: 3px;
-}
-
-#mytabs {
- background-color: inherit;
-}
-#p-cactions {
- background-color: inherit;
-}
-
-#footer {
- padding-left: 11.8em;
-}
-
-#n-portal,
-#n-currentevents,
-#n-help,
-#n-sitesupport {
- display: none;
-}
-
-#preftoc {
- float: left;
- margin: 1em;
- width: 13em;
-}
-#preftoc li {
-}
-#preftoc li.selected {
- border: 1px dashed #aaa;
-}
-#preftoc a,
-#preftoc a:active {
- display: block;
-}
-div.htmlform-tip {
- font-size: 95%;
- margin-top: 1em;
-}
-
-#mw_trackbacks {
- border-style: groove;
-}
-
-#jump-to-nav {
- display: none;
-}
-
-table.collapsed tr.collapsable {
- display: none;
-}
-
-.templatesUsed {
- margin-top: 1.5em;
-}
-
diff --git a/skins/standard/main.css b/skins/standard/main.css
deleted file mode 100644
index a4b03a87..00000000
--- a/skins/standard/main.css
+++ /dev/null
@@ -1,188 +0,0 @@
-/**
- * This style sheet is used by the classic (aka standard) skin
- */
-
-#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;
-}
-
-#quickbar {
- width: 140px;
- height: 100%;
- padding: 4px;
- visibility: visible;
- z-index: 99;
- font-size: 95%;
-}
-
-#topbar {
- padding: 4px;
- font-size: 95%;
-}
-
-/* Table of contents */
-.toctoggle,
-.editsection {
- font-size: smaller;
-}
-
-/* ... */
-#toolbar {
- padding: 0;
-}
-
-#infobox {
- background: #eeeeff;
- color: black;
-}
-
-#editform {
- margin-top: 1px;
-}
-
-a.interwiki,
-a.external {
- color: #3366BB;
-}
-
-a.printable {
- text-decoration: underline;
-}
-
-a.new {
- color: #ba0000;
-}
-
-a.stub {
- color: #772233;
- text-decoration: none;
-}
-
-a:visited {
- color: #5A3696;
-}
-
-body {
- margin: 0;
- 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/vector/beta/screen.less b/skins/vector/beta/screen.less
new file mode 100644
index 00000000..6d56cd5c
--- /dev/null
+++ b/skins/vector/beta/screen.less
@@ -0,0 +1,75 @@
+/* Content */
+#content {
+ line-height: 1.5em;
+ .mw-editsection {
+ font-family: @content-font-family;
+ }
+
+ h1,
+ #firstHeading {
+ font-family: @content-heading-font-family;
+ font-size: 1.833em;
+ line-height: 22pt;
+ padding: 0;
+ margin-bottom: 4pt;
+ }
+
+ h2 {
+ font-size: 1.5em;
+ line-height: 22pt;
+ }
+
+ h2,
+ h3,
+ h4,
+ h5,
+ h6 {
+ font-family: @content-heading-font-family;
+ padding: 0;
+ margin-bottom: 4pt;
+ margin-top: 14pt;
+ }
+
+ h3 {
+ font-size: 1.17em;
+ line-height: 22pt;
+ }
+
+ h3,
+ h4 {
+ font-weight: bold;
+ }
+
+ h4,
+ h5,
+ h6 {
+ font-size: 100%; /* (reset) */
+ }
+
+ h6 {
+ font-style: italic;
+ }
+
+ p {
+ margin-bottom: 8pt;
+ }
+
+ // FIXME: this is hacky
+ #toc h2 {
+ font-size: 100%;
+ }
+}
+
+/* Personal menu */
+#p-personal a {
+ color: #555;
+}
+
+/* Main menu */
+div#mw-panel div.portal {
+ margin-left: 1.25em;
+ h3 {
+ margin: 0;
+ line-height: 1;
+ }
+}
diff --git a/skins/vector/beta/variables.less b/skins/vector/beta/variables.less
new file mode 100644
index 00000000..08e662dc
--- /dev/null
+++ b/skins/vector/beta/variables.less
@@ -0,0 +1,37 @@
+@html-font-size: 90%;
+
+@body-font-size: inherit;
+
+// Page content
+@content-font-family: "Helvetica Neue", "Helvetica", "Nimbus Sans L", "Arial", "Liberation Sans", sans-serif;
+@content-font-color: #252525;
+@content-font-size: 0.9em;
+@content-line-height: inherit;
+@content-padding: 1em;
+@content-heading-font-size: 1.6em;
+@content-heading-font-family: Georgia, "DejaVu Serif", serif;
+
+// Common menu
+@menu-link-color: #555;
+
+// Main menu
+@menu-main-font-size: 0.82em;
+@menu-main-heading-font-size: 100%;
+@menu-main-heading-padding: 5px 0;
+
+@menu-main-body-font-size: inherit;
+@menu-main-body-link-color: inherit;
+@menu-main-body-link-visited-color: inherit;
+@menu-main-body-margin: 0;
+@menu-main-body-padding: 0 0 10px;
+@menu-main-logo-left: 1.6em;
+
+// Personal menu
+@menu-personal-font-size: 0.75em;
+
+// Collapsible nav
+@collapsible-nav-heading-color: #555;
+@collapsible-nav-heading-collapsed-color: inherit;
+
+@collapsible-nav-heading-padding: 4px 0 3px 1.5em;
+@collapsible-nav-body-margin: 0 0 0 1.25em;
diff --git a/skins/vector/collapsibleNav.js b/skins/vector/collapsibleNav.js
new file mode 100644
index 00000000..67313c95
--- /dev/null
+++ b/skins/vector/collapsibleNav.js
@@ -0,0 +1,121 @@
+/**
+ * Collapsible navigation for Vector
+ */
+( function ( mw, $ ) {
+ 'use strict';
+ var map;
+
+ // Use the same function for all navigation headings - don't repeat
+ function toggle( $element ) {
+ $.cookie(
+ 'vector-nav-' + $element.parent().attr( 'id' ),
+ $element.parent().is( '.collapsed' ),
+ { 'expires': 30, 'path': '/' }
+ );
+ $element
+ .parent()
+ .toggleClass( 'expanded' )
+ .toggleClass( 'collapsed' )
+ .find( '.body' )
+ .slideToggle( 'fast' );
+ }
+
+ /* Browser Support */
+
+ map = {
+ // Left-to-right languages
+ ltr: {
+ // Collapsible Nav is broken in Opera < 9.6 and Konqueror < 4
+ opera: [['>=', 9.6]],
+ konqueror: [['>=', 4.0]],
+ blackberry: false,
+ ipod: false,
+ iphone: false,
+ ps3: false
+ },
+ // Right-to-left languages
+ rtl: {
+ opera: [['>=', 9.6]],
+ konqueror: [['>=', 4.0]],
+ blackberry: false,
+ ipod: false,
+ iphone: false,
+ ps3: false
+ }
+ };
+ if ( !$.client.test( map ) ) {
+ return true;
+ }
+
+ $( function ( $ ) {
+ var $headings, tabIndex;
+
+ /* General Portal Modification */
+
+ // Always show the first portal
+ $( '#mw-panel > .portal:first' ).addClass( 'first persistent' );
+ // Apply a class to the entire panel to activate styles
+ $( '#mw-panel' ).addClass( 'collapsible-nav' );
+ // Use cookie data to restore preferences of what to show and hide
+ $( '#mw-panel > .portal:not(.persistent)' )
+ .each( function ( i ) {
+ var id = $(this).attr( 'id' ),
+ state = $.cookie( 'vector-nav-' + id );
+ // Add anchor tag to heading for better accessibility
+ $( this ).find( 'h3' ).wrapInner( $( '<a href="#"></a>' ).click( false ) );
+ // In the case that we are not showing the new version, let's show the languages by default
+ if (
+ state === 'true' ||
+ ( state === null && i < 1 ) ||
+ ( state === null && id === 'p-lang' )
+ ) {
+ $(this)
+ .addClass( 'expanded' )
+ .removeClass( 'collapsed' )
+ .find( '.body' )
+ .hide() // bug 34450
+ .show();
+ } else {
+ $(this)
+ .addClass( 'collapsed' )
+ .removeClass( 'expanded' );
+ }
+ // Re-save cookie
+ if ( state !== null ) {
+ $.cookie( 'vector-nav-' + $(this).attr( 'id' ), state, { 'expires': 30, 'path': '/' } );
+ }
+ } );
+
+ /* Tab Indexing */
+
+ $headings = $( '#mw-panel > .portal:not(.persistent) > h3' );
+
+ // Get the highest tab index
+ tabIndex = $( document ).lastTabIndex() + 1;
+
+ // Fix the search not having a tabindex
+ $( '#searchInput' ).attr( 'tabindex', tabIndex++ );
+
+ // Make it keyboard accessible
+ $headings.attr( 'tabindex', function () {
+ return tabIndex++;
+ });
+
+ // Toggle the selected menu's class and expand or collapse the menu
+ $( '#mw-panel' )
+ .delegate( '.portal:not(.persistent) > h3', 'keydown', function ( e ) {
+ // Make the space and enter keys act as a click
+ if ( e.which === 13 /* Enter */ || e.which === 32 /* Space */ ) {
+ toggle( $(this) );
+ }
+ } )
+ .delegate( '.portal:not(.persistent) > h3', 'mousedown', function ( e ) {
+ if ( e.which !== 3 ) { // Right mouse click
+ toggle( $(this) );
+ $(this).blur();
+ }
+ return false;
+ } );
+ });
+
+}( mediaWiki, jQuery ) );
diff --git a/skins/vector/collapsibleNav.less b/skins/vector/collapsibleNav.less
new file mode 100644
index 00000000..e6f5c9aa
--- /dev/null
+++ b/skins/vector/collapsibleNav.less
@@ -0,0 +1,91 @@
+/**
+ * LESS Stylesheet for collapsible nav
+ */
+@import "mediawiki.mixins.less";
+
+#mw-panel.collapsible-nav {
+ .portal {
+ background-position: left top;
+ background-repeat: no-repeat;
+ .background-image('images/portal-break.png');
+ padding: 0.25em 0 !important;
+ margin: -11px 9px 10px 11px;
+
+ h3 {
+ font-size: @menu-main-heading-font-size;
+ color: @collapsible-nav-heading-color;
+ font-weight: normal;
+ background-position: left center;
+ background-repeat: no-repeat;
+ .background-image-svg('images/arrow-expanded.svg', 'images/arrow-expanded.png');
+ padding: @collapsible-nav-heading-padding;
+ margin-bottom: 0;
+
+ &:hover {
+ cursor: pointer;
+ text-decoration: none;
+ }
+
+ a {
+ color: @collapsible-nav-heading-color;
+ text-decoration: none;
+ }
+ }
+
+ .body {
+ margin: @collapsible-nav-body-margin;
+ background-image: none !important;
+ padding-top: 0;
+ display: none;
+
+ ul {
+ li {
+ padding: 0.25em 0;
+ }
+ }
+ }
+
+
+ /* First */
+ &.first {
+ background-image: none;
+ margin-top: 0;
+ h3 {
+ display: none;
+ }
+ }
+
+ /* Persistent */
+ &.persistent {
+ .body {
+ display: block;
+ margin-left: 0.5em;
+ }
+
+ h3 {
+ background-image: none !important;
+ padding-left: 0.7em;
+ cursor: default;
+ }
+ }
+
+ /* Collapsed */
+ &.collapsed {
+ h3 {
+ color: @collapsible-nav-heading-collapsed-color;
+ background-position: left center;
+ background-repeat: no-repeat;
+ .background-image-svg('images/arrow-collapsed-ltr.svg', 'images/arrow-collapsed-ltr.png');
+ margin-bottom: 0;
+
+ &:hover {
+ text-decoration: underline;
+ }
+
+ a {
+ color: @collapsible-nav-heading-collapsed-color;
+ }
+ }
+ }
+ }
+}
diff --git a/extensions/Vector/modules/jquery.collapsibleTabs.js b/skins/vector/collapsibleTabs.js
index 1e6b7af5..e3c2c519 100644
--- a/extensions/Vector/modules/jquery.collapsibleTabs.js
+++ b/skins/vector/collapsibleTabs.js
@@ -2,7 +2,7 @@
* Collapsible tabs jQuery Plugin
*/
( function ( $ ) {
- var rtl = $( 'body' ).is( '.rtl' );
+ var rtl = $( 'html' ).attr( 'dir' ) === 'rtl';
$.fn.collapsibleTabs = function ( options ) {
// return if the function is called on an empty jquery object
if ( !this.length ) {
@@ -27,7 +27,7 @@
// if we haven't already bound our resize hanlder, bind it now
if ( !$.collapsibleTabs.boundEvent ) {
$( window )
- .delayedBind( '500', 'resize', function ( ) {
+ .delayedBind( 500, 'resize', function () {
$.collapsibleTabs.handleResize();
} );
}
@@ -46,7 +46,7 @@
* @return {Numeric} distance/overlap in pixels
*/
function calculateTabDistance() {
- var $tabsArray, $leftTab, $rightTab, leftEnd, rightStart;
+ var $leftTab, $rightTab, leftEnd, rightStart;
// In RTL, #right-navigation is actually on the left and vice versa.
// Hooray for descriptive naming.
@@ -121,35 +121,36 @@
// 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(
+ 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
$el.trigger( 'beforeTabExpand' );
$.collapsibleTabs
.moveToExpanded( data.collapsedContainer + ' ' + data.collapsible + ':first' );
}
- });
+ } );
},
moveToCollapsed: function ( ele ) {
- var $moving = $( ele );
+ var data, expContainerSettings, target,
+ $moving = $( ele );
- var data = $.collapsibleTabs.getSettings( $moving );
+ data = $.collapsibleTabs.getSettings( $moving );
if ( !data ) {
return;
}
- var expContainerSettings = $.collapsibleTabs.getSettings( $( data.expandedContainer ) );
+ expContainerSettings = $.collapsibleTabs.getSettings( $( data.expandedContainer ) );
if ( !expContainerSettings ) {
return;
}
expContainerSettings.shifting = true;
// Remove the element from where it's at and put it in the dropdown menu
- var target = data.collapsedContainer;
+ target = data.collapsedContainer;
$moving.css( 'position', 'relative' )
.css( ( rtl ? 'left' : 'right' ), 0 )
.animate( { width: '1px' }, 'normal', function () {
- var data;
+ var data, expContainerSettings;
$( this ).hide();
// add the placeholder
$( '<span class="placeholder" style="display: none;"></span>' ).insertAfter( this );
@@ -159,7 +160,7 @@
$( this ).attr( 'style', 'display: list-item;' );
data = $.collapsibleTabs.getSettings( $( ele ) );
if ( data ) {
- var expContainerSettings = $.collapsibleTabs.getSettings( $( data.expandedContainer ) );
+ expContainerSettings = $.collapsibleTabs.getSettings( $( data.expandedContainer ) );
if ( expContainerSettings ) {
expContainerSettings.shifting = false;
$.collapsibleTabs.handleResize();
@@ -168,20 +169,22 @@
} );
},
moveToExpanded: function ( ele ) {
- var $moving = $( ele );
- var data = $.collapsibleTabs.getSettings( $moving );
+ var data, expContainerSettings, $target, expandedWidth,
+ $moving = $( ele );
+
+ data = $.collapsibleTabs.getSettings( $moving );
if ( !data ) {
return;
}
- var expContainerSettings = $.collapsibleTabs.getSettings( $( data.expandedContainer ) );
+ expContainerSettings = $.collapsibleTabs.getSettings( $( data.expandedContainer ) );
if ( !expContainerSettings ) {
return;
}
expContainerSettings.shifting = true;
// grab the next appearing placeholder so we can use it for replacing
- var $target = $( data.expandedContainer ).find( 'span.placeholder:first' );
- var expandedWidth = data.expandedWidth;
+ $target = $( data.expandedContainer ).find( 'span.placeholder:first' );
+ expandedWidth = data.expandedWidth;
$moving.css( 'position', 'relative' ).css( ( rtl ? 'right' : 'left' ), 0 ).css( 'width', '1px' );
$target.replaceWith(
$moving
@@ -190,9 +193,10 @@
.data( 'collapsibleTabsSettings', data )
.animate( { width: expandedWidth + 'px' }, 'normal', function () {
$( this ).attr( 'style', 'display: block;' );
- var data = $.collapsibleTabs.getSettings( $( this ) );
+ var data, expContainerSettings;
+ data = $.collapsibleTabs.getSettings( $( this ) );
if ( data ) {
- var expContainerSettings = $.collapsibleTabs.getSettings( $( data.expandedContainer ) );
+ expContainerSettings = $.collapsibleTabs.getSettings( $( data.expandedContainer ) );
if ( expContainerSettings ) {
expContainerSettings.shifting = false;
$.collapsibleTabs.handleResize();
diff --git a/skins/vector/externalLinks.less b/skins/vector/externalLinks.less
new file mode 100644
index 00000000..5b02abbd
--- /dev/null
+++ b/skins/vector/externalLinks.less
@@ -0,0 +1,75 @@
+// FIXME: This size of this CSS is ridiculous. Please refactor (see bug 54604)
+@import "mediawiki.mixins.less";
+
+div#content a.external {
+ background-position: center right;
+ background-repeat: no-repeat;
+ .background-image('images/external-link-ltr-icon.png');
+ padding-right: 13px;
+}
+div#content a.external[href ^="https://"],
+.link-https {
+ background-position: center right;
+ background-repeat: no-repeat;
+ .background-image('images/lock-icon.png');
+ padding-right: 13px;
+}
+div#content a.external[href ^="mailto:"],
+.link-mailto {
+ background-position: center right;
+ background-repeat: no-repeat;
+ .background-image('images/mail-icon.png');
+ padding-right: 13px;
+}
+div#content a.external[href ^="news:"] {
+ background-position: center right;
+ background-repeat: no-repeat;
+ .background-image('images/news-icon.png');
+ padding-right: 13px;
+}
+div#content a.external[href ^="ftp://"],
+.link-ftp {
+ background-position: center right;
+ background-repeat: no-repeat;
+ .background-image('images/file-icon.png');
+ padding-right: 13px;
+}
+div#content a.external[href ^="irc://"],
+div#content a.external[href ^="ircs://"],
+.link-irc {
+ background-position: center right;
+ background-repeat: no-repeat;
+ .background-image('images/talk-icon.png');
+ 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-position: center right;
+ background-repeat: no-repeat;
+ .background-image('images/audio-icon.png');
+ 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-position: center right;
+ background-repeat: no-repeat;
+ .background-image('images/video-icon.png');
+ padding-right: 13px;
+}
+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-position: center right;
+ background-repeat: no-repeat;
+ .background-image('images/document-icon.png');
+ padding-right: 13px;
+}
diff --git a/extensions/Vector/modules/images/closed-ltr.png b/skins/vector/images/arrow-collapsed-ltr.png
index 063ac6f7..063ac6f7 100644
--- a/extensions/Vector/modules/images/closed-ltr.png
+++ b/skins/vector/images/arrow-collapsed-ltr.png
Binary files differ
diff --git a/skins/vector/images/arrow-collapsed-ltr.svg b/skins/vector/images/arrow-collapsed-ltr.svg
new file mode 100644
index 00000000..d0c4729c
--- /dev/null
+++ b/skins/vector/images/arrow-collapsed-ltr.svg
@@ -0,0 +1,37 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ version="1.1"
+ width="16"
+ height="16"
+ id="svg2">
+ <defs
+ id="defs4" />
+ <metadata
+ id="metadata7">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:title></dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <g
+ transform="translate(0,-1036.0288)"
+ id="layer1">
+ <path
+ d="M 10.028624,3.7729932 8.1976442,6.9443424 6.3666649,3.7729932 z"
+ transform="matrix(0,-2.7307791,1.576616,0,0.05143855,1066.4148)"
+ id="path2985"
+ style="fill:#797979;fill-opacity:1;stroke:none" />
+ </g>
+</svg>
diff --git a/extensions/Vector/modules/images/closed-rtl.png b/skins/vector/images/arrow-collapsed-rtl.png
index c3462182..c3462182 100644
--- a/extensions/Vector/modules/images/closed-rtl.png
+++ b/skins/vector/images/arrow-collapsed-rtl.png
Binary files differ
diff --git a/skins/vector/images/arrow-collapsed-rtl.svg b/skins/vector/images/arrow-collapsed-rtl.svg
new file mode 100644
index 00000000..8c5e04b9
--- /dev/null
+++ b/skins/vector/images/arrow-collapsed-rtl.svg
@@ -0,0 +1,37 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ version="1.1"
+ width="16"
+ height="16"
+ id="svg2">
+ <defs
+ id="defs4" />
+ <metadata
+ id="metadata7">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:title></dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <g
+ transform="translate(0,-1036.0288)"
+ id="layer1">
+ <path
+ d="M 10.028624,3.7729932 8.1976442,6.9443424 6.3666649,3.7729932 z"
+ transform="matrix(0,2.7307791,-1.576616,0,15.948561,1021.6428)"
+ id="path2985"
+ style="fill:#797979;fill-opacity:1;stroke:none" />
+ </g>
+</svg>
diff --git a/skins/vector/images/arrow-down-focus-icon.svg b/skins/vector/images/arrow-down-focus-icon.svg
new file mode 100644
index 00000000..f2edf263
--- /dev/null
+++ b/skins/vector/images/arrow-down-focus-icon.svg
@@ -0,0 +1,37 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ version="1.1"
+ width="22"
+ height="16"
+ id="svg2">
+ <defs
+ id="defs4" />
+ <metadata
+ id="metadata7">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:title></dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <g
+ transform="translate(0,-1036.3622)"
+ id="layer1">
+ <path
+ d="M 10.028624,3.7729932 8.1976442,6.9443424 6.3666649,3.7729932 z"
+ transform="matrix(2.7307791,0,0,1.576616,-11.885956,1036.4136)"
+ id="path2985"
+ style="fill:#929292;fill-opacity:1;stroke:none" />
+ </g>
+</svg>
diff --git a/skins/vector/images/arrow-down-icon.svg b/skins/vector/images/arrow-down-icon.svg
new file mode 100644
index 00000000..9218ff28
--- /dev/null
+++ b/skins/vector/images/arrow-down-icon.svg
@@ -0,0 +1,37 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ version="1.1"
+ width="22"
+ height="16"
+ id="svg2">
+ <defs
+ id="defs4" />
+ <metadata
+ id="metadata7">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:title></dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <g
+ transform="translate(0,-1036.3622)"
+ id="layer1">
+ <path
+ d="M 10.028624,3.7729932 8.1976442,6.9443424 6.3666649,3.7729932 z"
+ transform="matrix(2.7307791,0,0,1.576616,-11.885956,1036.4136)"
+ id="path2985"
+ style="fill:#797979;fill-opacity:1;stroke:none" />
+ </g>
+</svg>
diff --git a/extensions/Vector/modules/images/open.png b/skins/vector/images/arrow-expanded.png
index 0221028e..0221028e 100644
--- a/extensions/Vector/modules/images/open.png
+++ b/skins/vector/images/arrow-expanded.png
Binary files differ
diff --git a/skins/vector/images/arrow-expanded.svg b/skins/vector/images/arrow-expanded.svg
new file mode 100644
index 00000000..60704d27
--- /dev/null
+++ b/skins/vector/images/arrow-expanded.svg
@@ -0,0 +1,37 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ version="1.1"
+ width="16"
+ height="16"
+ id="svg2">
+ <defs
+ id="defs4" />
+ <metadata
+ id="metadata7">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:title></dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <g
+ transform="translate(0,-1036.3622)"
+ id="layer1">
+ <path
+ d="M 10.028624,3.7729932 8.1976442,6.9443424 6.3666649,3.7729932 z"
+ transform="matrix(2.7307791,0,0,1.576616,-14.385956,1036.4136)"
+ id="path2985"
+ style="fill:#797979;fill-opacity:1;stroke:none" />
+ </g>
+</svg>
diff --git a/skins/vector/images/edit-icon.png b/skins/vector/images/edit-icon.png
index 462ca643..43e46919 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 acf260fc..63083831 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 7d5ee375..5313234e 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/mail-icon.png b/skins/vector/images/mail-icon.png
index 9823d72c..0d93a2f8 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 ade1a376..6f27054b 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-fade.png b/skins/vector/images/page-fade.png
index 1436cda0..b4a60342 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 cec17ea1..20bf3668 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/preferences-break.png b/skins/vector/images/preferences-break.png
index e59f5783..b5293082 100644
--- a/skins/vector/images/preferences-break.png
+++ b/skins/vector/images/preferences-break.png
Binary files differ
diff --git a/skins/vector/images/tab-break.png b/skins/vector/images/tab-break.png
index c03c72e4..6d37af5b 100644
--- a/skins/vector/images/tab-break.png
+++ b/skins/vector/images/tab-break.png
Binary files differ
diff --git a/skins/vector/images/talk-icon.png b/skins/vector/images/talk-icon.png
index c4434351..0332054e 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.svg b/skins/vector/images/user-icon.svg
new file mode 100644
index 00000000..767d5107
--- /dev/null
+++ b/skins/vector/images/user-icon.svg
@@ -0,0 +1,424 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:xlink="http://www.w3.org/1999/xlink"
+ version="1.1"
+ width="12"
+ height="13.837458"
+ id="svg2108">
+ <metadata
+ id="metadata68">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:title></dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <defs
+ id="defs3">
+ <linearGradient
+ id="linearGradient4356">
+ <stop
+ id="stop4358"
+ style="stop-color:#000000;stop-opacity:1"
+ offset="0" />
+ <stop
+ id="stop4360"
+ style="stop-color:#000000;stop-opacity:0"
+ offset="1" />
+ </linearGradient>
+ <linearGradient
+ id="linearGradient4344">
+ <stop
+ id="stop4346"
+ style="stop-color:#727e0a;stop-opacity:1"
+ offset="0" />
+ <stop
+ id="stop4348"
+ style="stop-color:#5b6508;stop-opacity:1"
+ offset="1" />
+ </linearGradient>
+ <linearGradient
+ id="linearGradient4338">
+ <stop
+ id="stop4340"
+ style="stop-color:#e9b15e;stop-opacity:1"
+ offset="0" />
+ <stop
+ id="stop4342"
+ style="stop-color:#966416;stop-opacity:1"
+ offset="1" />
+ </linearGradient>
+ <linearGradient
+ id="linearGradient4163">
+ <stop
+ id="stop4165"
+ style="stop-color:#3b74bc;stop-opacity:1"
+ offset="0" />
+ <stop
+ id="stop4167"
+ style="stop-color:#2d5990;stop-opacity:1"
+ offset="1" />
+ </linearGradient>
+ <linearGradient
+ id="linearGradient3824">
+ <stop
+ id="stop3826"
+ style="stop-color:#ffffff;stop-opacity:1"
+ offset="0" />
+ <stop
+ id="stop3828"
+ style="stop-color:#c9c9c9;stop-opacity:1"
+ offset="1" />
+ </linearGradient>
+ <linearGradient
+ id="linearGradient3816">
+ <stop
+ id="stop3818"
+ style="stop-color:#000000;stop-opacity:1"
+ offset="0" />
+ <stop
+ id="stop3820"
+ style="stop-color:#000000;stop-opacity:0"
+ offset="1" />
+ </linearGradient>
+ <linearGradient
+ id="linearGradient3800">
+ <stop
+ id="stop3802"
+ style="stop-color:#f4d9b1;stop-opacity:1"
+ offset="0" />
+ <stop
+ id="stop3804"
+ style="stop-color:#df9725;stop-opacity:1"
+ offset="1" />
+ </linearGradient>
+ <radialGradient
+ cx="29.344931"
+ cy="17.064077"
+ r="9.1620579"
+ fx="29.344931"
+ fy="17.064077"
+ id="radialGradient3806"
+ xlink:href="#linearGradient3800"
+ gradientUnits="userSpaceOnUse" />
+ <radialGradient
+ cx="31.112698"
+ cy="19.008621"
+ r="8.6620579"
+ fx="31.112698"
+ fy="19.008621"
+ id="radialGradient3822"
+ xlink:href="#linearGradient3816"
+ gradientUnits="userSpaceOnUse" />
+ <linearGradient
+ x1="30.935921"
+ y1="29.553486"
+ x2="30.935921"
+ y2="35.803486"
+ id="linearGradient3830"
+ xlink:href="#linearGradient3824"
+ gradientUnits="userSpaceOnUse" />
+ <radialGradient
+ cx="28.089741"
+ cy="27.203083"
+ r="13.56536"
+ fx="28.089741"
+ fy="27.203083"
+ id="radialGradient4169"
+ xlink:href="#linearGradient4163"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(1.297564,0,0,0.884831,-8.358505,4.940469)" />
+ <radialGradient
+ cx="29.344931"
+ cy="17.064077"
+ r="9.1620579"
+ fx="29.344931"
+ fy="17.064077"
+ id="radialGradient4171"
+ xlink:href="#linearGradient3800"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(0.787998,0,0,0.787998,6.221198,3.617627)" />
+ <linearGradient
+ x1="30.935921"
+ y1="29.553486"
+ x2="30.935921"
+ y2="35.803486"
+ id="linearGradient4175"
+ xlink:href="#linearGradient3824"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="translate(0.707108,0)" />
+ <radialGradient
+ cx="31.112698"
+ cy="19.008621"
+ r="8.6620579"
+ fx="31.112698"
+ fy="19.008621"
+ id="radialGradient4179"
+ xlink:href="#linearGradient3816"
+ gradientUnits="userSpaceOnUse" />
+ <linearGradient
+ x1="30.935921"
+ y1="29.553486"
+ x2="30.935921"
+ y2="35.803486"
+ id="linearGradient4326"
+ xlink:href="#linearGradient3824"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="translate(-12.41789,-7)" />
+ <radialGradient
+ cx="29.344931"
+ cy="17.064077"
+ r="9.1620579"
+ fx="29.344931"
+ fy="17.064077"
+ id="radialGradient4328"
+ xlink:href="#linearGradient4338"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(0.787998,0,0,0.787998,6.221198,3.617627)" />
+ <radialGradient
+ cx="31.112698"
+ cy="19.008621"
+ r="8.6620579"
+ fx="31.112698"
+ fy="19.008621"
+ id="radialGradient4330"
+ xlink:href="#linearGradient3816"
+ gradientUnits="userSpaceOnUse" />
+ <linearGradient
+ x1="30.935921"
+ y1="29.553486"
+ x2="30.935921"
+ y2="35.803486"
+ id="linearGradient4332"
+ xlink:href="#linearGradient3824"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="translate(-13.125,-7)" />
+ <radialGradient
+ cx="31.112698"
+ cy="19.008621"
+ r="8.6620579"
+ fx="31.112698"
+ fy="19.008621"
+ id="radialGradient4336"
+ xlink:href="#linearGradient3816"
+ gradientUnits="userSpaceOnUse" />
+ <radialGradient
+ cx="16.214741"
+ cy="19.836468"
+ r="13.56536"
+ fx="16.214741"
+ fy="19.836468"
+ id="radialGradient4350"
+ xlink:href="#linearGradient4344"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(1,0,0,0.681917,0,8.233773)" />
+ <linearGradient
+ x1="20.661695"
+ y1="35.817974"
+ x2="22.626925"
+ y2="36.217758"
+ id="linearGradient4362"
+ xlink:href="#linearGradient4356"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(0.983375,0.181588,-0.181588,0.983375,6.231716,-2.651466)" />
+ <linearGradient
+ x1="22.686766"
+ y1="36.3904"
+ x2="21.408455"
+ y2="35.739632"
+ id="linearGradient4366"
+ xlink:href="#linearGradient4356"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(-0.977685,0.210075,0.210075,0.977685,55.1096,-3.945209)" />
+ <linearGradient
+ x1="20.661695"
+ y1="35.817974"
+ x2="22.626925"
+ y2="36.217758"
+ id="linearGradient4372"
+ xlink:href="#linearGradient4356"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(0.983375,0.181588,-0.181588,0.983375,-7.07212,-9.82492)" />
+ <linearGradient
+ x1="22.686766"
+ y1="36.3904"
+ x2="21.408455"
+ y2="35.739632"
+ id="linearGradient4374"
+ xlink:href="#linearGradient4356"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(-0.977685,0.210075,0.210075,0.977685,41.80576,-11.11866)" />
+ <linearGradient
+ x1="22.686766"
+ y1="36.3904"
+ x2="21.408455"
+ y2="35.739632"
+ id="linearGradient1366"
+ xlink:href="#linearGradient4356"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(-0.977685,0.210075,0.210075,0.977685,41.80576,-11.11866)" />
+ <linearGradient
+ x1="20.661695"
+ y1="35.817974"
+ x2="22.626925"
+ y2="36.217758"
+ id="linearGradient1369"
+ xlink:href="#linearGradient4356"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(0.983375,0.181588,-0.181588,0.983375,-7.07212,-9.82492)" />
+ <linearGradient
+ x1="30.935921"
+ y1="29.553486"
+ x2="30.935921"
+ y2="35.803486"
+ id="linearGradient1372"
+ xlink:href="#linearGradient3824"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="translate(-12.41789,-7)" />
+ <radialGradient
+ cx="16.214741"
+ cy="19.836468"
+ r="13.56536"
+ fx="16.214741"
+ fy="19.836468"
+ id="radialGradient1381"
+ xlink:href="#linearGradient4344"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(1,0,0,0.681917,0,8.233773)" />
+ <radialGradient
+ cx="31.112698"
+ cy="19.008621"
+ r="8.6620579"
+ fx="31.112698"
+ fy="19.008621"
+ id="radialGradient2243"
+ xlink:href="#linearGradient3816"
+ gradientUnits="userSpaceOnUse" />
+ <radialGradient
+ cx="28.089741"
+ cy="27.203083"
+ r="13.56536"
+ fx="28.089741"
+ fy="27.203083"
+ id="radialGradient2245"
+ xlink:href="#linearGradient4163"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(1.297564,0,0,0.884831,-8.358505,4.940469)" />
+ <linearGradient
+ x1="30.935921"
+ y1="29.553486"
+ x2="30.935921"
+ y2="35.803486"
+ id="linearGradient2247"
+ xlink:href="#linearGradient3824"
+ gradientUnits="userSpaceOnUse" />
+ <radialGradient
+ cx="31.112698"
+ cy="19.008621"
+ r="8.6620579"
+ fx="31.112698"
+ fy="19.008621"
+ id="radialGradient2249"
+ xlink:href="#linearGradient3816"
+ gradientUnits="userSpaceOnUse" />
+ <radialGradient
+ cx="29.344931"
+ cy="17.064077"
+ r="9.1620579"
+ fx="29.344931"
+ fy="17.064077"
+ id="radialGradient2251"
+ xlink:href="#linearGradient3800"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(0.787998,0,0,0.787998,6.221198,3.617627)" />
+ <linearGradient
+ x1="20.661695"
+ y1="35.817974"
+ x2="22.626925"
+ y2="36.217758"
+ id="linearGradient2253"
+ xlink:href="#linearGradient4356"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(0.983375,0.181588,-0.181588,0.983375,6.231716,-2.651466)" />
+ <linearGradient
+ x1="22.686766"
+ y1="36.3904"
+ x2="21.408455"
+ y2="35.739632"
+ id="linearGradient2255"
+ xlink:href="#linearGradient4356"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(-0.977685,0.210075,0.210075,0.977685,55.1096,-3.945209)" />
+ </defs>
+ <g
+ transform="translate(-5.0000039,-32.070112)"
+ id="layer1"
+ style="display:inline" />
+ <g
+ transform="translate(-5.0000039,-32.070112)"
+ id="layer2"
+ style="display:inline">
+ <g
+ transform="matrix(0.39012793,0,0,0.39012793,-1.0891578,28.22979)"
+ id="g2230">
+ <path
+ d="m 39.774755,19.008621 a 8.6620579,8.6620579 0 1 1 -17.324115,0 8.6620579,8.6620579 0 1 1 17.324115,0 z"
+ transform="matrix(1.77551,0,0,0.959183,-24.25322,18.77153)"
+ id="path4306"
+ style="color:#000000;fill:url(#radialGradient2243);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1px;marker:none;visibility:visible;display:inline;overflow:visible" />
+ <path
+ d="m 25.986174,41.636039 10.606602,0 c 3.005204,0 5.980484,-1.101932 7.071067,-4.242641 1.035639,-2.982476 0.176777,-8.662058 -6.540737,-13.258252 l -12.551146,0 c -6.717514,4.24264 -7.556991,10.044831 -6.010407,13.435028 1.575595,3.45379 4.24264,4.065865 7.424621,4.065865 z"
+ id="path4308"
+ style="color:#000000;fill:url(#radialGradient2245);fill-opacity:1;fill-rule:evenodd;stroke:#204a87;stroke-width:1px;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible" />
+ <path
+ d="m 26.693281,25.726136 c 3.18198,2.828427 4.596194,13.081476 4.596194,13.081476 0,0 1.414213,-10.253048 3.889087,-13.258252 l -8.485281,0.176776 z"
+ id="path4310"
+ style="color:#000000;fill:url(#linearGradient2247);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1px;marker:none;visibility:visible;display:inline;overflow:visible" />
+ <path
+ d="m 28.972721,26.786797 c 0,0 -2.151323,1.660335 -1.965991,3.660533 -2.041226,-1.800794 -2.099873,-5.251524 -2.099873,-5.251524 l 4.065864,1.590991 z"
+ id="path4312"
+ style="color:#000000;fill:#729fcf;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1px;marker:none;visibility:visible;display:inline;overflow:visible" />
+ <path
+ d="m 25.914862,40.593933 10.493447,-0.0221 c 2.639723,0 5.253161,-0.967919 6.211112,-3.726667 0.909689,-2.61976 -0.09472,-7.608614 -5.995279,-11.645837 L 25.099417,24.956264 c -5.900557,3.726667 -7.04262,8.823219 -5.662029,12.044182 1.380592,3.220963 3.395211,3.57139 6.477474,3.593487 z"
+ id="path4314"
+ style="opacity:0.21518986;color:#000000;fill:none;stroke:#ffffff;stroke-width:0.99999976px;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible" />
+ <path
+ d="m 33.410795,26.786797 c 0,0 2.151323,1.660335 1.965991,3.660533 2.041226,-1.800794 2.099873,-5.251524 2.099873,-5.251524 l -4.065864,1.590991 z"
+ id="path4316"
+ style="color:#000000;fill:#729fcf;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1px;marker:none;visibility:visible;display:inline;overflow:visible" />
+ <path
+ d="m 39.774755,19.008621 a 8.6620579,8.6620579 0 1 1 -17.324115,0 8.6620579,8.6620579 0 1 1 17.324115,0 z"
+ transform="translate(-0.125,3.5)"
+ id="path4318"
+ style="color:#000000;fill:url(#radialGradient2249);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1px;marker:none;visibility:visible;display:inline;overflow:visible" />
+ <path
+ d="m 39.774755,19.008621 a 8.6620579,8.6620579 0 1 1 -17.324115,0 8.6620579,8.6620579 0 1 1 17.324115,0 z"
+ id="path4320"
+ style="color:#000000;fill:url(#radialGradient2251);fill-opacity:1;fill-rule:evenodd;stroke:#c17d11;stroke-width:1px;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible" />
+ <path
+ d="m 39.774755,19.008621 a 8.6620579,8.6620579 0 1 1 -17.324115,0 8.6620579,8.6620579 0 1 1 17.324115,0 z"
+ transform="matrix(0.877095,0,0,0.877095,3.823927,2.336267)"
+ id="path4322"
+ style="opacity:0.19620254;color:#000000;fill:none;stroke:#ffffff;stroke-width:1.14012825px;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible" />
+ <path
+ d="m 21.85179,40.775197 c -1.247607,-0.544969 -1.805994,-1.858277 -1.805994,-1.858277 0.841281,-4.069136 3.719925,-7.046216 3.719925,-7.046216 0,0 -2.279321,6.411514 -1.913931,8.904493 z"
+ id="path4354"
+ style="opacity:0.22784807;color:#000000;fill:url(#linearGradient2253);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1px;marker:none;visibility:visible;display:inline;overflow:visible" />
+ <path
+ d="m 40.757497,39.916846 c 1.231251,-0.580978 1.80438,-2.002321 1.80438,-2.002321 -0.95912,-4.042983 -3.976149,-6.842821 -3.976149,-6.842821 0,0 2.464593,6.342602 2.171769,8.845142 z"
+ id="path4364"
+ style="opacity:0.22784807;color:#000000;fill:url(#linearGradient2255);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1px;marker:none;visibility:visible;display:inline;overflow:visible" />
+ </g>
+ </g>
+</svg>
diff --git a/skins/vector/images/video-icon.png b/skins/vector/images/video-icon.png
index e934a0ff..ed852322 100644
--- a/skins/vector/images/video-icon.png
+++ b/skins/vector/images/video-icon.png
Binary files differ
diff --git a/skins/vector/screen-hd.css b/skins/vector/screen-hd.less
index b90fd63b..5a1fc055 100644
--- a/skins/vector/screen-hd.css
+++ b/skins/vector/screen-hd.less
@@ -5,7 +5,7 @@ div#content {
padding: 1.25em 1.5em 1.5em 1.5em;
}
#p-logo {
- left: 0.5em;
+ left: @menu-main-logo-left;
}
div#footer {
margin-left: 11em;
@@ -18,7 +18,7 @@ div#footer {
margin-right: 1em;
}
#left-navigation {
- left: 11em;
+ margin-left: 11em;
}
#p-personal {
right: 1em;
diff --git a/skins/vector/screen.css b/skins/vector/screen.less
index 2e09ee17..bb4be725 100644
--- a/skins/vector/screen.css
+++ b/skins/vector/screen.less
@@ -1,39 +1,43 @@
/*
* 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.
+ * prepended with @noflip in a comment block.
*
- * This style-sheet employs a few CSS trick to accomplish compatibility with a wide range of web
+ * This stylesheet 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.
*/
+@import "mediawiki.mixins";
/* Framework */
+html {
+ font-size: @html-font-size;
+}
html,
body {
height: 100%;
margin: 0;
padding: 0;
- font-family: sans-serif;
- font-size: 1em;
+ font-family: @content-font-family;
}
body {
background-color: #f6f6f6;
+ font-size: @body-font-size;
}
/* Content */
div#content {
+ line-height: @content-line-height;
margin-left: 10em;
- padding: 1em;
+ padding: @content-padding;
/* Border on top, left, and bottom side */
border: 1px solid #a7d7f9;
border-right-width: 0;
/* Merge the border with tabs' one (in their background image) */
margin-top: -1px;
background-color: white;
- color: black;
+ color: @content-font-color;
direction: ltr;
}
/* Hide, but keep accessible for screen-readers */
@@ -45,8 +49,7 @@ div#content {
#mw-page-base {
height: 5em;
background-color: white;
- /* @embed */
- background-image: url(images/page-fade.png);
+ .background-image('images/page-fade.png');
background-position: bottom left;
background-repeat: repeat-x;
}
@@ -61,8 +64,7 @@ div#mw-head {
right: 0;
width: 100%;
}
-div#mw-head h3,
-div#mw-head h5 {
+div#mw-head h3 {
margin: 0;
padding: 0;
}
@@ -75,11 +77,10 @@ div.emptyPortlet {
position: absolute;
top: 0.33em;
right: 0.75em;
- /* Display on top of page tabs - bug 37158 */
- z-index: 1;
+ /* Display on top of page tabs - bugs 37158, 48078 */
+ z-index: 100;
}
-#p-personal h3,
-#p-personal h5 {
+#p-personal h3 {
display: none;
}
#p-personal ul {
@@ -88,23 +89,28 @@ div.emptyPortlet {
margin: 0;
padding-left: 10em; /* Keep from overlapping logo */
}
-/* @noflip */
#p-personal li {
line-height: 1.125em;
+ /* @noflip */
float: left;
-}
-/* This one flips! */
-#p-personal li {
margin-left: 0.75em;
margin-top: 0.5em;
- font-size: 0.75em;
+ font-size: @menu-personal-font-size;
white-space: nowrap;
}
/* Navigation Containers */
#left-navigation {
- position: absolute;
- left: 10em;
- top: 2.5em;
+ float: left;
+ margin-left: 10em;
+ margin-top: 2.5em;
+ /* When right nav would overlap left nav, it's placed below it
+ (normal CSS floats behavior). This rule ensures that no empty space
+ is shown between them due to right nav's margin-top. Page layout
+ is still broken, but at least the nav overlaps only the page title
+ instead of half the content. */
+ margin-bottom: -2.5em;
+ /* IE 6 double-margin bug fix */
+ display: inline;
}
#right-navigation {
float: right;
@@ -112,49 +118,41 @@ div.emptyPortlet {
}
/* Navigation Labels */
div.vectorTabs h3,
-div.vectorTabs h5,
-div.vectorMenu h3 span,
-div.vectorMenu h5 span {
+div.vectorMenu h3 span {
display: none;
}
/* Namespaces and Views */
-/* @noflip */
div.vectorTabs {
+ /* @noflip */
float: left;
height: 2.5em;
}
div.vectorTabs {
- /* @embed */
- background-image: url(images/tab-break.png);
+ .background-image('images/tab-break.png');
background-position: bottom left;
background-repeat: no-repeat;
padding-left: 1px;
}
-/* @noflip */
div.vectorTabs ul {
+ /* @noflip */
float: left;
-}
-div.vectorTabs ul {
height: 100%;
list-style-type: none;
list-style-image: none;
margin: 0;
padding: 0;
}
-/* @noflip */
-div.vectorTabs ul li {
- float: left;
-}
/* OVERRIDDEN BY COMPLIANT BROWSERS */
div.vectorTabs ul li {
+ /* @noflip */
+ float: left;
line-height: 1.125em;
display: inline-block;
height: 100%;
margin: 0;
padding: 0;
background-color: #f3f3f3;
- /* @embed */
- background-image: url(images/tab-normal-fade.png);
+ .background-image('images/tab-normal-fade.png');
background-position: bottom left;
background-repeat: repeat-x;
white-space: nowrap;
@@ -164,8 +162,7 @@ div.vectorTabs ul > li {
display: block;
}
div.vectorTabs li.selected {
- /* @embed */
- background-image: url(images/tab-current-fade.png);
+ .background-image('images/tab-current-fade.png');
}
/* OVERRIDDEN BY COMPLIANT BROWSERS */
div.vectorTabs li a {
@@ -173,7 +170,7 @@ div.vectorTabs li a {
height: 1.9em;
padding-left: 0.5em;
padding-right: 0.5em;
- color: #0645ad;
+ color: @menu-link-color;
cursor: pointer;
font-size: 0.8em;
}
@@ -191,15 +188,14 @@ div.vectorTabs span a {
padding-top: 1.25em;
}
/* IGNORED BY IE6 */
-/* @noflip */
div.vectorTabs span > a {
+ /* @noflip */
float: left;
display: block;
}
div.vectorTabs span {
display: inline-block;
- /* @embed */
- background-image: url(images/tab-break.png);
+ .background-image('images/tab-break.png');
background-position: bottom right;
background-repeat: no-repeat;
}
@@ -213,43 +209,40 @@ div.vectorTabs li.new a:visited{
color: #a55858;
}
/* Variants and Actions */
-/* @noflip */
div.vectorMenu {
+ /* @noflip */
direction: ltr;
+ /* @noflip */
float: left;
- /* @embed */
- background-image: url(images/arrow-down-icon.png);
+ /* SVG support using a transparent gradient to guarantee cross-browser
+ * compatibility (browsers able to understand gradient syntax support also SVG) */
+ .background-image-svg('images/arrow-down-icon.svg', 'images/arrow-down-icon.png');
+ /* @noflip */
background-position: 100% 60%;
background-repeat: no-repeat;
cursor: pointer;
}
div.vectorMenuFocus {
- /* @embed */
- background-image: url(images/arrow-down-focus-icon.png);
+ /* SVG support using a transparent gradient to guarantee cross-browser
+ * compatibility (browsers able to understand gradient syntax support also SVG) */
+ .background-image-svg('images/arrow-down-focus-icon.svg', 'images/arrow-down-focus-icon.png');
background-position: 100% 60%;
}
-/* @noflip */
body.rtl div.vectorMenu {
+ /* @noflip */
direction: rtl;
}
/* OVERRIDDEN BY COMPLIANT BROWSERS */
-/* @noflip */
-div#mw-head div.vectorMenu h3,
-div#mw-head div.vectorMenu h5 {
+div#mw-head div.vectorMenu h3 {
+ /* @noflip */
float: left;
- /* @embed */
- background-image: url(images/tab-break.png);
+ .background-image('images/tab-break.png');
background-repeat: no-repeat;
-}
-/* This will be flipped - unlike the one above it */
-div#mw-head div.vectorMenu h3,
-div#mw-head div.vectorMenu h5 {
background-position: bottom left;
margin-left: -1px;
}
/* IGNORED BY IE6 */
-div#mw-head div.vectorMenu > h3,
-div#mw-head div.vectorMenu > h5 {
+div#mw-head div.vectorMenu > h3 {
background-image: none;
}
div#mw-head div.vectorMenu h4,
@@ -263,25 +256,17 @@ div.vectorMenu#p-variants #mw-vector-current-variant {
border: none;
}
/* OVERRIDDEN BY COMPLIANT BROWSERS */
-/* @noflip */
-div.vectorMenu h3 a,
-div.vectorMenu h5 a {
+div.vectorMenu h3 a {
display: inline-block;
width: 24px;
height: 1.9em;
text-decoration: none;
- /* @embed */
- background-image: url(images/tab-break.png);
+ .background-image('images/tab-break.png');
background-repeat: no-repeat;
-}
-/* This will be flipped - unlike the one above it */
-div.vectorMenu h3 a,
-div.vectorMenu h5 a {
background-position: bottom right;
}
/* IGNORED BY IE6 */
-div.vectorMenu h3 > a,
-div.vectorMenu h5 > a {
+div.vectorMenu h3 > a {
display: block;
}
div.vectorMenu div.menu {
@@ -291,20 +276,20 @@ div.vectorMenu div.menu {
text-align: left;
}
/* OVERRIDDEN BY COMPLIANT BROWSERS */
-/* @noflip */
body.rtl div.vectorMenu div.menu {
+ /* @noflip */
margin-left: 24px;
}
/* IGNORED BY IE6 */
-/* @noflip */
body.rtl div.vectorMenu > div.menu {
+ /* @noflip */
margin-left: auto;
}
/* IGNORED BY IE6 */
/* Also fixes old versions of FireFox */
-/* @noflip */
body.rtl div.vectorMenu > div.menu,
x:-moz-any-link {
+ /* @noflip */
margin-left: 23px;
}
/* Enable forcing showing of the menu for accessibility */
@@ -346,7 +331,7 @@ div.vectorMenu li a {
display: inline-block;
padding: 0.5em;
white-space: nowrap;
- color: #0645ad;
+ color: @menu-link-color;
cursor: pointer;
font-size: 0.8em;
}
@@ -360,12 +345,11 @@ div.vectorMenu li.selected a:visited {
text-decoration: none;
}
/* Search */
-#p-search h3,
-#p-search h5 {
+#p-search h3 {
display: none;
}
-/* @noflip */
#p-search {
+ /* @noflip */
float: left;
}
#p-search {
@@ -387,26 +371,15 @@ div#simpleSearch {
border: solid 1px #aaa;
color: black;
background-color: white;
- /* @embed */
- background-image: url(images/search-fade.png);
+ .background-image('images/search-fade.png');
background-position: top left;
background-repeat: repeat-x;
}
-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:focus {
+ outline: none;
}
div#simpleSearch input {
color: black;
- direction: ltr;
-}
-div#simpleSearch input:focus {
- outline: none;
}
div#simpleSearch input.placeholder {
color: #999;
@@ -468,6 +441,7 @@ div#simpleSearch button#searchButton > img {
}
/* Panel */
div#mw-panel {
+ font-size: @menu-main-font-size;
position: absolute;
top: 160px;
padding-top: 1em;
@@ -478,30 +452,26 @@ div#mw-panel div.portal {
padding-bottom: 1.5em;
direction: ltr;
}
-div#mw-panel div.portal h3,
-div#mw-panel div.portal h5 {
+div#mw-panel div.portal h3 {
font-weight: normal;
color: #444;
- padding: 0.25em;
- padding-top: 0;
- padding-left: 1.75em;
+ padding: @menu-main-heading-padding;
cursor: default;
border: none;
- font-size: 0.75em;
+ font-size: @menu-main-heading-font-size;
}
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);
+ margin: @menu-main-body-margin;
+
+ .background-image('images/portal-break.png');
background-repeat: no-repeat;
background-position: top left;
}
div#mw-panel div.portal div.body ul {
list-style-type: none;
list-style-image: none;
- padding: 0;
+ padding: @menu-main-body-padding;
margin: 0;
}
div#mw-panel div.portal div.body ul li {
@@ -509,15 +479,16 @@ div#mw-panel div.portal div.body ul li {
padding: 0;
padding-bottom: 0.5em;
margin: 0;
- font-size: 0.75em;
+ font-size: @menu-main-body-font-size;
word-wrap: break-word;
}
div#mw-panel div.portal div.body ul li a {
- color: #0645ad;
-}
-div#mw-panel div.portal div.body ul li a:visited {
- color: #0b0080;
+ color: @menu-main-body-link-color;
+ &:visited {
+ color: @menu-main-body-link-visited-color;
+ }
}
+
/* Footer */
div#footer {
margin-left: 10em;
@@ -542,8 +513,9 @@ div#footer ul li {
div#footer #footer-icons {
float: right;
}
-/* @noflip */
+
body.ltr div#footer #footer-places {
+ /* @noflip */
float: left;
}
div#footer #footer-info li {
@@ -592,8 +564,7 @@ div#footer #footer-places li {
clear: both;
margin: 0 !important;
padding: 0 !important;
- /* @embed */
- background-image: url(images/preferences-break.png);
+ .background-image('images/preferences-break.png');
background-position: bottom left;
background-repeat: no-repeat;
}
@@ -607,8 +578,7 @@ div#footer #footer-places li {
white-space: nowrap;
list-style-type: none;
list-style-image: none;
- /* @embed */
- background-image: url(images/preferences-break.png);
+ .background-image('images/preferences-break.png');
background-position: bottom right;
background-repeat: no-repeat;
}
@@ -620,7 +590,7 @@ div#footer #footer-places li {
#preftoc a:active {
display: inline-block;
position: relative;
- color: #0645ad;
+ color: @menu-link-color;
padding: 0.5em;
text-decoration: none;
background-image: none;
@@ -631,8 +601,7 @@ div#footer #footer-places li {
text-decoration: underline;
}
#preftoc li.selected a {
- /* @embed */
- background-image: url(images/preferences-fade.png);
+ .background-image('images/preferences-fade.png');
background-position: bottom;
background-repeat: repeat-x;
color: #333;
@@ -678,24 +647,9 @@ div#footer #footer-places li {
margin-right: 0.25em;
}
-/**
- * The following code is slightly modified from monobook
- */
-div#content {
- line-height: 1.5em;
-}
-#bodyContent {
- font-size: 0.8em;
-}
-
-.editsection {
- float: right;
-}
-
ul {
list-style-type: disc;
- /* @embed */
- list-style-image: url(images/bullet-icon.png);
+ .list-style-image('images/bullet-icon.png');
}
pre, .mw-code {
@@ -709,82 +663,19 @@ pre, .mw-code {
#firstHeading {
padding-top: 0;
margin-top: 0;
- padding-top: 0;
- font-size: 1.6em;
-}
-div#content a.external,
-div#content a.external[href ^="gopher://"] {
- /* @embed */
- background: url(images/external-link-ltr-icon.png) center right no-repeat;
- padding-right: 13px;
-}
-div#content a.external[href ^="https://"],
-.link-https {
- /* @embed */
- background: url(images/lock-icon.png) center right no-repeat;
- padding-right: 13px;
-}
-div#content a.external[href ^="mailto:"],
-.link-mailto {
- /* @embed */
- background: url(images/mail-icon.png) center right no-repeat;
- padding-right: 13px;
-}
-div#content a.external[href ^="news:"] {
- /* @embed */
- background: url(images/news-icon.png) center right no-repeat;
- padding-right: 13px;
-}
-div#content a.external[href ^="ftp://"],
-.link-ftp {
- /* @embed */
- background: url(images/file-icon.png) center right no-repeat;
- padding-right: 13px;
-}
-div#content a.external[href ^="irc://"],
-div#content a.external[href ^="ircs://"],
-.link-irc {
- /* @embed */
- background: url(images/talk-icon.png) center right no-repeat;
- 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 {
- /* @embed */
- background: url(images/audio-icon.png) 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 {
- /* @embed */
- background: url(images/video-icon.png) center right no-repeat;
- padding-right: 13px;
-}
-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 {
- /* @embed */
- background: url(images/document-icon.png) center right no-repeat;
- padding-right: 13px;
+ font-size: @content-heading-font-size;
}
/* Icon for Usernames */
#pt-userpage,
#pt-anonuserpage,
#pt-login {
- /* @embed */
- background: url(images/user-icon.png) left top no-repeat;
+ background-position: left top;
+ background-repeat: no-repeat;
+ /* SVG support using a transparent gradient to guarantee cross-browser
+ * compatibility (browsers able to understand gradient syntax support also SVG) */
+ .background-image-svg('images/user-icon.svg', 'images/user-icon.png');
padding-left: 15px !important;
- text-transform: none;
}
.redirectText {
@@ -798,16 +689,17 @@ div#content a.external[href *=".pdf?"], div#content a.external[href *=".PDF?"],
#bodyContent {
position: relative;
width: 100%;
-}
-div#bodyContent {
line-height: 1.5em;
+ font-size: @content-font-size;
}
/* mediawiki.notification */
-.skin-vector #mw-notification-area {
- top: 7em;
+.skin-vector .mw-notification-area {
font-size: 0.8em;
}
+.skin-vector .mw-notification-area-layout {
+ top: 7em;
+}
.skin-vector .mw-notification {
background-color: #fff;
background-color: rgba(255, 255, 255, 0.93);
@@ -815,7 +707,6 @@ div#bodyContent {
border: solid 1px #a7d7f9;
border-radius: 0.75em;
-webkit-box-shadow: 0 2px 10px 0 rgba(0, 0, 0, 0.125);
- -moz-box-shadow: 0 2px 10px 0 rgba(0, 0, 0, 0.125);
box-shadow: 0 2px 10px 0 rgba(0, 0, 0, 0.125);
}
@@ -834,8 +725,7 @@ div#bodyContent {
margin-top: -0.8em !ie;
height: 0;
overflow: hidden;
- /* @embed */
- background-image: url(images/watch-icons.png);
+ .background-image('images/watch-icons.png');
}
#ca-unwatch.icon a {
background-position: -43px 60%;
@@ -853,8 +743,7 @@ div#bodyContent {
}
#ca-unwatch.icon a.loading,
#ca-watch.icon a.loading {
- /* @embed */
- background-image: url(images/watch-icon-loading.gif);
+ .background-image('images/watch-icon-loading.gif');
background-position: 5px 60%;
}
#ca-unwatch.icon a span,
@@ -862,8 +751,7 @@ div#bodyContent {
display: none;
}
div.vectorTabs ul {
- /* @embed */
- background-image: url(images/tab-break.png);
+ .background-image('images/tab-break.png');
background-position: right bottom;
background-repeat: no-repeat;
}
@@ -874,42 +762,30 @@ div.vectorTabs ul {
}
/* Animate between standard and high definition layouts */
+body.vector-animateLayout {
+ div#content,
+ div#footer,
+ #left-navigation {
+ .transition(margin-left 250ms, padding 250ms;);
+ }
+
+ #p-logo {
+ .transition(left 250ms);
+ }
+
+ #mw-panel {
+ .transition(padding-right 250ms);
+ }
+
+ #p-search {
+ .transition(margin-right 250ms);
+ }
+
+ #p-personal {
+ .transition(right 250ms);
+ }
-body.vector-animateLayout div#content,
-body.vector-animateLayout div#footer {
- -moz-transition: margin-left 250ms, padding 250ms;
- -webkit-transition: margin-left 250ms, padding 250ms;
- -o-transition: margin-left 250ms, padding 250ms;
- transition: margin-left 250ms, padding 250ms;
-}
-body.vector-animateLayout #p-logo,
-body.vector-animateLayout #left-navigation {
- -moz-transition: left 250ms;
- -webkit-transition: left 250ms;
- -o-transition: left 250ms;
- transition: left 250ms;
-}
-body.vector-animateLayout #mw-panel {
- -moz-transition: padding-left 250ms;
- -webkit-transition: padding-left 250ms;
- -o-transition: padding-left 250ms;
- transition: padding-left 250ms;
-}
-body.vector-animateLayout #p-search {
- -moz-transition: margin-right 250ms;
- -webkit-transition: margin-right 250ms;
- -o-transition: margin-right 250ms;
- transition: margin-right 250ms;
-}
-body.vector-animateLayout #p-personal {
- -moz-transition: right 250ms;
- -webkit-transition: right 250ms;
- -o-transition: right 250ms;
- transition: right 250ms;
-}
-body.vector-animateLayout #mw-head-base {
- -moz-transition: margin-left 250ms;
- -webkit-transition: margin-left 250ms;
- -o-transition: margin-left 250ms;
- transition: margin-left 250ms;
+ #mw-head-base {
+ .transition(margin-left 250ms);
+ }
}
diff --git a/skins/vector/styles-beta.less b/skins/vector/styles-beta.less
new file mode 100644
index 00000000..a76b6394
--- /dev/null
+++ b/skins/vector/styles-beta.less
@@ -0,0 +1,13 @@
+@import "variables.less";
+@import "beta/variables.less";
+
+@media screen {
+ @import "screen.less";
+ @import "beta/screen.less";
+ @import "externalLinks.less";
+ @import "collapsibleNav.less";
+}
+
+@media screen and (min-width: 982px) {
+ @import "screen-hd.less";
+}
diff --git a/skins/vector/styles.less b/skins/vector/styles.less
new file mode 100644
index 00000000..bd458510
--- /dev/null
+++ b/skins/vector/styles.less
@@ -0,0 +1,11 @@
+@import "variables.less";
+
+@media screen {
+ @import "screen.less";
+ @import "externalLinks.less";
+ @import "collapsibleNav.less";
+}
+
+@media screen and (min-width: 982px) {
+ @import "screen-hd.less";
+}
diff --git a/skins/vector/variables.less b/skins/vector/variables.less
new file mode 100644
index 00000000..691e0fd5
--- /dev/null
+++ b/skins/vector/variables.less
@@ -0,0 +1,37 @@
+@html-font-size: 1em;
+
+@body-font-size: 1em;
+
+// Page content
+@content-font-family: sans-serif;
+@content-font-color: black;
+@content-font-size: 0.8em;
+@content-line-height: 1.5em;
+@content-padding: 1.5em 1.5em 1.5em 1.75em;
+@content-heading-font-size: 1.6em;
+@content-heading-font-family: sans-serif;
+
+// Common menu
+@menu-link-color: #0645ad;
+
+// Main menu
+@menu-main-font-size: inherit;
+@menu-main-heading-font-size: 0.75em;
+@menu-main-heading-padding: 0 1.75em 0.25em 0.25em;
+
+@menu-main-body-font-size: 0.75em;
+@menu-main-body-link-color: #0645ad;
+@menu-main-body-link-visited-color: #0b0080;
+@menu-main-body-margin: 0 0 0 1.25em;
+@menu-main-body-padding: 0;
+@menu-main-logo-left: 0.5em;
+
+// Personal menu
+@menu-personal-font-size: 0.75em;
+
+// Collapsible nav
+@collapsible-nav-heading-color: #4D4D4D;
+@collapsible-nav-heading-collapsed-color: #0645AD;
+
+@collapsible-nav-heading-padding: 4px 0 3px 1.5em;
+@collapsible-nav-body-margin: 0 0 0 1.25em;
diff --git a/skins/vector/vector.js b/skins/vector/vector.js
index 4427d9a3..aa64624a 100644
--- a/skins/vector/vector.js
+++ b/skins/vector/vector.js
@@ -4,18 +4,52 @@
jQuery( function ( $ ) {
$( 'div.vectorMenu' ).each( function () {
var $el = $( this );
- $el.find( 'h3:first a:first' )
- // For accessibility, show the menu when the hidden link in the menu is clicked (bug 24298)
- .click( function ( e ) {
- $el.find( '.menu:first' ).toggleClass( 'menuForceShow' );
- e.preventDefault();
+ $el.find( '> h3 > a' ).parent()
+ .attr( 'tabindex', '0' )
+ // For accessibility, show the menu when the h3 is clicked (bug 24298/46486)
+ .on( 'click keypress', function ( e ) {
+ if( e.type === 'click' || e.which === 13 ) {
+ $el.find( '.menu:first' ).toggleClass( 'menuForceShow' );
+ e.preventDefault();
+ }
} )
- // When the hidden link has focus, also set a class that will change the arrow icon
+ // When the heading has focus, also set a class that will change the arrow icon
.focus( function () {
- $el.addClass( 'vectorMenuFocus' );
+ $el.find( '> a' ).addClass( 'vectorMenuFocus' );
} )
.blur( function () {
- $el.removeClass( 'vectorMenuFocus' );
- } );
+ $el.find( '> a' ).removeClass( 'vectorMenuFocus' );
+ } )
+ .find( '> a:first' )
+ // As the h3 can already be focused there's no need for the link to be focusable
+ .attr( 'tabindex', '-1' );
} );
+
+ /**
+ * Collapsible tabs for Vector
+ */
+ var $cactions = $( '#p-cactions' );
+
+ // Bind callback functions to animate our drop down menu in and out
+ // and then call the collapsibleTabs function on the menu
+ $( '#p-views ul' )
+ .bind( 'beforeTabCollapse', function () {
+ // If the dropdown was hidden, show it
+ if ( $cactions.hasClass( 'emptyPortlet' ) ) {
+ $cactions
+ .removeClass( 'emptyPortlet' )
+ .find( 'h3' )
+ .css( 'width', '1px' ).animate( { 'width': '24px' }, 390 );
+ }
+ } )
+ .bind( 'beforeTabExpand', function () {
+ // If we're removing the last child node right now, hide the dropdown
+ if ( $cactions.find( 'li' ).length === 1 ) {
+ $cactions.find( 'h3' ).animate( { 'width': '1px' }, 390, function () {
+ $( this ).attr( 'style', '' )
+ .parent().addClass( 'emptyPortlet' );
+ });
+ }
+ } )
+ .collapsibleTabs();
} );
diff --git a/tests/RunSeleniumTests.php b/tests/RunSeleniumTests.php
deleted file mode 100644
index b7320cb1..00000000
--- a/tests/RunSeleniumTests.php
+++ /dev/null
@@ -1,258 +0,0 @@
-#!/usr/bin/env 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
- */
-
-if ( PHP_SAPI != 'cli' ) {
- die( "Run me from the command line please.\n" );
-}
-
-define( 'SELENIUMTEST', true );
-
-require( __DIR__ . '/../maintenance/Maintenance.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 behavior for compatibility
- require_once( 'PHPUnit/TextUI/Command.php' );
-}
-
-require_once( 'PHPUnit/Extensions/SeleniumTestCase.php' );
-include_once( 'PHPUnit/Util/Log/JUnit.php' );
-
-require_once( __DIR__ . "/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 );
- } elseif ( !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( RUN_MAINTENANCE_IF_MAIN );
diff --git a/tests/TestsAutoLoader.php b/tests/TestsAutoLoader.php
index c1c301f6..00ce13c8 100644
--- a/tests/TestsAutoLoader.php
+++ b/tests/TestsAutoLoader.php
@@ -30,14 +30,16 @@ $wgAutoloadClasses += array(
'DbTestPreviewer' => "$testDir/testHelpers.inc",
'DbTestRecorder' => "$testDir/testHelpers.inc",
'DelayedParserTest' => "$testDir/testHelpers.inc",
+ 'ParserTestResult' => "$testDir/parser/ParserTestResult.php",
'TestFileIterator' => "$testDir/testHelpers.inc",
'TestRecorder' => "$testDir/testHelpers.inc",
+ 'ITestRecorder' => "$testDir/testHelpers.inc",
# tests/phpunit
'MediaWikiTestCase' => "$testDir/phpunit/MediaWikiTestCase.php",
'MediaWikiPHPUnitCommand' => "$testDir/phpunit/MediaWikiPHPUnitCommand.php",
+ 'MediaWikiPHPUnitTestListener' => "$testDir/phpunit/MediaWikiPHPUnitTestListener.php",
'MediaWikiLangTestCase' => "$testDir/phpunit/MediaWikiLangTestCase.php",
- 'MediaWikiProvide' => "$testDir/phpunit/includes/Providers.php",
'TestUser' => "$testDir/phpunit/includes/TestUser.php",
# tests/phpunit/includes
@@ -48,9 +50,7 @@ $wgAutoloadClasses += array(
//db
'ORMTableTest' => "$testDir/phpunit/includes/db/ORMTableTest.php",
'PageORMTableForTesting' => "$testDir/phpunit/includes/db/ORMTableTest.php",
-
- //Selenium
- 'SeleniumTestConstants' => "$testDir/selenium/SeleniumTestConstants.php",
+ 'DatabaseTestHelper' => "$testDir/phpunit/includes/db/DatabaseTestHelper.php",
# tests/phpunit/includes/api
'ApiFormatTestBase' => "$testDir/phpunit/includes/api/format/ApiFormatTestBase.php",
@@ -73,14 +73,25 @@ $wgAutoloadClasses += array(
# tests/phpunit/includes/parser
'NewParserTest' => "$testDir/phpunit/includes/parser/NewParserTest.php",
+ 'MediaWikiParserTest' => "$testDir/phpunit/includes/parser/MediaWikiParserTest.php",
# tests/phpunit/includes/libs
'GenericArrayObjectTest' => "$testDir/phpunit/includes/libs/GenericArrayObjectTest.php",
+ # tests/phpunit/media
+ 'FakeDimensionFile' => "$testDir/phpunit/includes/media/FakeDimensionFile.php",
+
# tests/phpunit/includes/site
'SiteTest' => "$testDir/phpunit/includes/site/SiteTest.php",
'TestSites' => "$testDir/phpunit/includes/site/TestSites.php",
+ # tests/phpunit/mocks
+ 'MockFSFile' => "$testDir/phpunit/mocks/filebackend/MockFSFile.php",
+ 'MockFileBackend' => "$testDir/phpunit/mocks/filebackend/MockFileBackend.php",
+ 'MockBitmapHandler' => "$testDir/phpunit/mocks/media/MockBitmapHandler.php",
+ 'MockImageHandler' => "$testDir/phpunit/mocks/media/MockBitmapHandler.php",
+ 'MockSvgHandler' => "$testDir/phpunit/mocks/media/MockBitmapHandler.php",
+
# tests/phpunit/languages
'LanguageClassesTestCase' => "$testDir/phpunit/languages/LanguageClassesTestCase.php",
@@ -90,15 +101,4 @@ $wgAutoloadClasses += array(
# tests/parser
'ParserTest' => "$testDir/parser/parserTest.inc",
'ParserTestParserHook' => "$testDir/parser/parserTestsParserHook.php",
-
- # tests/selenium
- 'Selenium' => "$testDir/selenium/Selenium.php",
- 'SeleniumLoader' => "$testDir/selenium/SeleniumLoader.php",
- 'SeleniumTestCase' => "$testDir/selenium/SeleniumTestCase.php",
- 'SeleniumTestConsoleLogger' => "$testDir/selenium/SeleniumTestConsoleLogger.php",
- 'SeleniumTestConstants' => "$testDir/selenium/SeleniumTestConstants.php",
- 'SeleniumTestHTMLLogger' => "$testDir/selenium/SeleniumTestHTMLLogger.php",
- 'SeleniumTestListener' => "$testDir/selenium/SeleniumTestListener.php",
- 'SeleniumTestSuite' => "$testDir/selenium/SeleniumTestSuite.php",
- 'SeleniumConfig' => "$testDir/selenium/SeleniumConfig.php",
);
diff --git a/tests/parser/ParserTestResult.php b/tests/parser/ParserTestResult.php
new file mode 100644
index 00000000..d9ad773d
--- /dev/null
+++ b/tests/parser/ParserTestResult.php
@@ -0,0 +1,42 @@
+<?php
+/**
+ * @copyright Copyright © 2013, Antoine Musso
+ * @copyright Copyright © 2013, Wikimedia Foundation Inc.
+ * @license GNU GPL v2
+ *
+ * @file
+ */
+
+/**
+ * Represent the result of a parser test.
+ *
+ * @since 1.22
+ */
+class ParserTestResult {
+ /**
+ * Description of the parser test.
+ *
+ * This is usually the text used to describe a parser test in the .txt
+ * files. It is initialized on a construction and you most probably
+ * never want to change it.
+ */
+ public $description;
+ /** Text that was expected */
+ public $expected;
+ /** Actual text rendered */
+ public $actual;
+
+ /**
+ * @param $description string A short text describing the parser test
+ * usually the text in the parser test .txt file. The description
+ * is later available using the property $description.
+ */
+ public function __construct( $description ) {
+ $this->description = $description;
+ }
+
+ /** Whether the test passed */
+ public function isSuccess() {
+ return $this->expected === $this->actual;
+ }
+}
diff --git a/tests/parser/parserTest.inc b/tests/parser/parserTest.inc
index ce621f4e..58ea1ed0 100644
--- a/tests/parser/parserTest.inc
+++ b/tests/parser/parserTest.inc
@@ -1,6 +1,8 @@
<?php
/**
- * Helper code for the MediaWiki parser test suite.
+ * Helper code for the MediaWiki parser test suite. Some code is duplicated
+ * in PHPUnit's NewParserTests.php, so you'll probably want to update both
+ * at the same time.
*
* Copyright © 2004, 2010 Brion Vibber <brion@pobox.com>
* http://www.mediawiki.org/
@@ -31,22 +33,22 @@
*/
class ParserTest {
/**
- * boolean $color whereas output should be colorized
+ * @var bool $color whereas output should be colorized
*/
private $color;
/**
- * boolean $showOutput Show test output
+ * @var bool $showOutput Show test output
*/
private $showOutput;
/**
- * boolean $useTemporaryTables Use temporary tables for the temporary database
+ * @var bool $useTemporaryTables Use temporary tables for the temporary database
*/
private $useTemporaryTables = true;
/**
- * boolean $databaseSetupDone True if the database has been set up
+ * @var bool $databaseSetupDone True if the database has been set up
*/
private $databaseSetupDone = false;
@@ -63,7 +65,7 @@ class ParserTest {
private $dbClone;
/**
- * string $oldTablePrefix Original table prefix
+ * @var string $oldTablePrefix Original table prefix
*/
private $oldTablePrefix;
@@ -141,15 +143,14 @@ class ParserTest {
static function setUp() {
global $wgParser, $wgParserConf, $IP, $messageMemc, $wgMemc,
$wgUser, $wgLang, $wgOut, $wgRequest, $wgStyleDirectory, $wgEnableParserCache,
- $wgNamespaceAliases, $wgNamespaceProtection, $wgLocalFileRepo,
+ $wgExtraNamespaces, $wgNamespaceAliases, $wgNamespaceProtection, $wgLocalFileRepo,
$parserMemc, $wgThumbnailScriptPath, $wgScriptPath,
- $wgArticlePath, $wgStyleSheetPath, $wgScript, $wgStylePath, $wgExtensionAssetsPath,
+ $wgArticlePath, $wgScript, $wgStylePath, $wgExtensionAssetsPath,
$wgMainCacheType, $wgMessageCacheType, $wgParserCacheType, $wgLockManagers;
$wgScript = '/index.php';
$wgScriptPath = '/';
$wgArticlePath = '/wiki/$1';
- $wgStyleSheetPath = '/skins';
$wgStylePath = '/skins';
$wgExtensionAssetsPath = '/extensions';
$wgThumbnailScriptPath = false;
@@ -181,6 +182,9 @@ class ParserTest {
$wgNamespaceProtection[NS_MEDIAWIKI] = 'editinterface';
$wgNamespaceAliases['Image'] = NS_FILE;
$wgNamespaceAliases['Image_talk'] = NS_FILE_TALK;
+ # add a namespace shadowing a interwiki link, to test
+ # proper precedence when resolving links. (bug 51680)
+ $wgExtraNamespaces[100] = 'MemoryAlpha';
// XXX: tests won't run without this (for CACHE_DB)
if ( $wgMainCacheType === CACHE_DB ) {
@@ -211,6 +215,73 @@ class ParserTest {
$wgStyleDirectory = "$IP/skins";
}
+ self::setupInterwikis();
+ }
+
+ /**
+ * Insert hardcoded interwiki in the lookup table.
+ *
+ * This function insert a set of well known interwikis that are used in
+ * the parser tests. They can be considered has fixtures are injected in
+ * the interwiki cache by using the 'InterwikiLoadPrefix' hook.
+ * Since we are not interested in looking up interwikis in the database,
+ * the hook completely replace the existing mechanism (hook returns false).
+ */
+ public static function setupInterwikis() {
+ # Hack: insert a few Wikipedia in-project interwiki prefixes,
+ # for testing inter-language links
+ Hooks::register( 'InterwikiLoadPrefix', function ( $prefix, &$iwData ) {
+ static $testInterwikis = array(
+ 'wikipedia' => array(
+ 'iw_url' => 'http://en.wikipedia.org/wiki/$1',
+ 'iw_api' => '',
+ 'iw_wikiid' => '',
+ 'iw_local' => 0 ),
+ 'meatball' => array(
+ 'iw_url' => 'http://www.usemod.com/cgi-bin/mb.pl?$1',
+ 'iw_api' => '',
+ 'iw_wikiid' => '',
+ 'iw_local' => 0 ),
+ 'memoryalpha' => array(
+ 'iw_url' => 'http://www.memory-alpha.org/en/index.php/$1',
+ 'iw_api' => '',
+ 'iw_wikiid' => '',
+ 'iw_local' => 0 ),
+ 'zh' => array(
+ 'iw_url' => 'http://zh.wikipedia.org/wiki/$1',
+ 'iw_api' => '',
+ 'iw_wikiid' => '',
+ 'iw_local' => 1 ),
+ 'es' => array(
+ 'iw_url' => 'http://es.wikipedia.org/wiki/$1',
+ 'iw_api' => '',
+ 'iw_wikiid' => '',
+ 'iw_local' => 1 ),
+ 'fr' => array(
+ 'iw_url' => 'http://fr.wikipedia.org/wiki/$1',
+ 'iw_api' => '',
+ 'iw_wikiid' => '',
+ 'iw_local' => 1 ),
+ 'ru' => array(
+ 'iw_url' => 'http://ru.wikipedia.org/wiki/$1',
+ 'iw_api' => '',
+ 'iw_wikiid' => '',
+ 'iw_local' => 1 ),
+ );
+ if ( array_key_exists( $prefix, $testInterwikis ) ) {
+ $iwData = $testInterwikis[$prefix];
+ }
+
+ // We only want to rely on the above fixtures
+ return false;
+ } );// hooks::register
+ }
+
+ /**
+ * Remove the hardcoded interwiki lookup table.
+ */
+ public static function tearDownInterwikis() {
+ Hooks::clear( 'InterwikiLoadPrefix' );
}
public function setupRecorder( $options ) {
@@ -378,7 +449,12 @@ class ParserTest {
*/
public function runTestsFromFiles( $filenames ) {
$ok = false;
+
+ // be sure, ParserTest::addArticle has correct language set,
+ // so that system messages gets into the right language cache
+ $GLOBALS['wgLanguageCode'] = 'en';
$GLOBALS['wgContLang'] = Language::factory( 'en' );
+
$this->recorder->start();
try {
$this->setupDatabase();
@@ -418,6 +494,9 @@ class ParserTest {
/**
* Get a Parser object
+ *
+ * @param string $preprocessor
+ * @return Parser
*/
function getParser( $preprocessor = null ) {
global $wgParserConf;
@@ -487,9 +566,10 @@ class ParserTest {
} elseif ( isset( $opts['comment'] ) ) {
$out = Linker::formatComment( $input, $title, $local );
} elseif ( isset( $opts['preload'] ) ) {
- $out = $parser->getpreloadText( $input, $title, $options );
+ $out = $parser->getPreloadText( $input, $title, $options );
} else {
$output = $parser->parse( $input, $title, $options, true, true, 1337 );
+ $output->setTOCEnabled( !isset( $opts['notoc'] ) );
$out = $output->getText();
if ( isset( $opts['showtitle'] ) ) {
@@ -518,18 +598,23 @@ class ParserTest {
}
$this->teardownGlobals();
- return $this->showTestResult( $desc, $result, $out );
+
+ $testResult = new ParserTestResult( $desc );
+ $testResult->expected = $result;
+ $testResult->actual = $out;
+
+ return $this->showTestResult( $testResult );
}
/**
- *
+ * Refactored in 1.22 to use ParserTestResult
*/
- function showTestResult( $desc, $result, $out ) {
- if ( $result === $out ) {
- $this->showSuccess( $desc );
+ function showTestResult( ParserTestResult $testResult ) {
+ if ( $testResult->isSuccess() ) {
+ $this->showSuccess( $testResult );
return true;
} else {
- $this->showFailure( $desc, $result, $out );
+ $this->showFailure( $testResult );
return false;
}
}
@@ -537,7 +622,7 @@ class ParserTest {
/**
* 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 $opts array: Options array to look in
* @param $default Mixed: default value returned if not found
*/
private static function getOptionValue( $key, $opts, $default ) {
@@ -664,11 +749,10 @@ class ParserTest {
),
'wgEnableUploads' => self::getOptionValue( 'wgEnableUploads', $opts, true ),
'wgStylePath' => '/skins',
- 'wgStyleSheetPath' => '/skins',
'wgSitename' => 'MediaWiki',
'wgLanguageCode' => $lang,
'wgDBprefix' => $this->db->getType() != 'oracle' ? 'parsertest_' : 'pt_',
- 'wgRawHtml' => isset( $opts['rawhtml'] ),
+ 'wgRawHtml' => self::getOptionValue( 'wgRawHtml', $opts, false ),
'wgLang' => null,
'wgContLang' => null,
'wgNamespacesWithSubpages' => array( 0 => isset( $opts['subpage'] ) ),
@@ -678,8 +762,10 @@ class ParserTest {
'wgNoFollowDomainExceptions' => array(),
'wgThumbnailScriptPath' => false,
'wgUseImageResize' => true,
+ 'wgSVGConverter' => 'null',
+ 'wgSVGConverters' => array( 'null' => 'echo "1">$output' ),
'wgLocaltimezone' => 'UTC',
- 'wgAllowExternalImages' => true,
+ 'wgAllowExternalImages' => self::getOptionValue( 'wgAllowExternalImages', $opts, true ),
'wgUseTidy' => false,
'wgDefaultLanguageVariant' => $variant,
'wgVariantArticlePath' => false,
@@ -822,43 +908,9 @@ class ParserTest {
'user_name' => 'Anonymous' ) );
}
- # Hack: insert a few Wikipedia in-project interwiki prefixes,
- # for testing inter-language links
- $this->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
- $this->db->insert( 'site_stats', array( 'ss_row_id' => 1, 'ss_images' => 2, 'ss_good_articles' => 1 ) );
+ $this->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();
@@ -866,19 +918,52 @@ class ParserTest {
# Clear the message cache
MessageCache::singleton()->clear();
+ // Remember to update newParserTests.php after changing the below
+ // (and it uses a slightly different syntax just for teh lulz)
$this->uploadDir = $this->setupUploadDir();
$user = User::createNew( 'WikiSysop' );
$image = wfLocalFile( Title::makeTitle( NS_FILE, 'Foobar.jpg' ) );
+ # note that the size/width/height/bits/etc of the file
+ # are actually set by inspecting the file itself; the arguments
+ # to recordUpload2 have no effect. That said, we try to make things
+ # match up so it is less confusing to readers of the code & tests.
$image->recordUpload2( '', 'Upload of some lame file', 'Some lame file', array(
- 'size' => 12345,
+ 'size' => 7881,
'width' => 1941,
'height' => 220,
- 'bits' => 24,
+ 'bits' => 8,
'media_type' => MEDIATYPE_BITMAP,
'mime' => 'image/jpeg',
'metadata' => serialize( array() ),
- 'sha1' => wfBaseConvert( '', 16, 36, 31 ),
+ 'sha1' => wfBaseConvert( '1', 16, 36, 31 ),
+ 'fileExists' => true
+ ), $this->db->timestamp( '20010115123500' ), $user );
+
+ $image = wfLocalFile( Title::makeTitle( NS_FILE, 'Thumb.png' ) );
+ # again, note that size/width/height below are ignored; see above.
+ $image->recordUpload2( '', 'Upload of some lame thumbnail', 'Some lame thumbnail', array(
+ 'size' => 22589,
+ 'width' => 135,
+ 'height' => 135,
+ 'bits' => 8,
+ 'media_type' => MEDIATYPE_BITMAP,
+ 'mime' => 'image/png',
+ 'metadata' => serialize( array() ),
+ 'sha1' => wfBaseConvert( '2', 16, 36, 31 ),
'fileExists' => true
+ ), $this->db->timestamp( '20130225203040' ), $user );
+
+ $image = wfLocalFile( Title::makeTitle( NS_FILE, 'Foobar.svg' ) );
+ $image->recordUpload2( '', 'Upload of some lame SVG', 'Some lame SVG', array(
+ 'size' => 12345,
+ 'width' => 240,
+ 'height' => 180,
+ 'bits' => 24,
+ 'media_type' => MEDIATYPE_DRAWING,
+ 'mime' => 'image/svg+xml',
+ 'metadata' => serialize( array() ),
+ 'sha1' => wfBaseConvert( '', 16, 36, 31 ),
+ 'fileExists' => true
), $this->db->timestamp( '20010115123500' ), $user );
# This image will be blacklisted in [[MediaWiki:Bad image list]]
@@ -891,7 +976,7 @@ class ParserTest {
'media_type' => MEDIATYPE_BITMAP,
'mime' => 'image/jpeg',
'metadata' => serialize( array() ),
- 'sha1' => wfBaseConvert( '', 16, 36, 31 ),
+ 'sha1' => wfBaseConvert( '3', 16, 36, 31 ),
'fileExists' => true
), $this->db->timestamp( '20010115123500' ), $user );
}
@@ -922,8 +1007,11 @@ class ParserTest {
$tables = $this->listTables();
foreach ( $tables as $table ) {
- $sql = $this->db->getType() == 'oracle' ? "DROP TABLE pt_$table DROP CONSTRAINTS" : "DROP TABLE `parsertest_$table`";
- $this->db->query( $sql );
+ if ( $this->db->getType() == 'oracle' ) {
+ $this->db->query( "DROP TABLE pt_$table DROP CONSTRAINTS" );
+ } else {
+ $this->db->query( "DROP TABLE `parsertest_$table`" );
+ }
}
if ( $this->db->getType() == 'oracle' ) {
@@ -960,9 +1048,15 @@ class ParserTest {
wfMkdirParents( $dir . '/3/3a', null, __METHOD__ );
copy( "$IP/skins/monobook/headbg.jpg", "$dir/3/3a/Foobar.jpg" );
+ wfMkdirParents( $dir . '/e/ea', null, __METHOD__ );
+ copy( "$IP/skins/monobook/wiki.png", "$dir/e/ea/Thumb.png" );
wfMkdirParents( $dir . '/0/09', null, __METHOD__ );
copy( "$IP/skins/monobook/headbg.jpg", "$dir/0/09/Bad.jpg" );
-
+ wfMkdirParents( $dir . '/f/ff', null, __METHOD__ );
+ copy( "$IP/skins/monobook/headbg.jpg", "$dir/f/ff/Foobar.svg" );
+ file_put_contents( "$dir/f/ff/Foobar.svg",
+ '<?xml version="1.0" encoding="utf-8"?>' .
+ '<svg xmlns="http://www.w3.org/2000/svg" />' );
return $dir;
}
@@ -1008,8 +1102,18 @@ class ParserTest {
"$dir/thumb/3/3a/Foobar.jpg/70px-Foobar.jpg",
"$dir/thumb/3/3a/Foobar.jpg/960px-Foobar.jpg",
+ "$dir/e/ea/Thumb.png",
+
"$dir/0/09/Bad.jpg",
+ "$dir/f/ff/Foobar.svg",
+ "$dir/thumb/f/ff/Foobar.svg/180px-Foobar.svg.png",
+ "$dir/thumb/f/ff/Foobar.svg/360px-Foobar.svg.png",
+ "$dir/thumb/f/ff/Foobar.svg/langde-270px-Foobar.svg.png",
+ "$dir/thumb/f/ff/Foobar.svg/270px-Foobar.svg.png",
+ "$dir/thumb/f/ff/Foobar.svg/langde-180px-Foobar.svg.png",
+ "$dir/thumb/f/ff/Foobar.svg/langde-360px-Foobar.svg.png",
+
"$dir/math/f/a/5/fa50b8b616463173474302ca3e63586b.png",
)
);
@@ -1023,7 +1127,13 @@ class ParserTest {
"$dir/thumb/3/3a/Foobar.jpg",
"$dir/thumb/3/3a",
"$dir/thumb/3",
-
+ "$dir/e/ea",
+ "$dir/e",
+ "$dir/f/ff/",
+ "$dir/f/",
+ "$dir/thumb/f/ff/Foobar.svg",
+ "$dir/thumb/f/ff/",
+ "$dir/thumb/f/",
"$dir/0/09/",
"$dir/0/",
"$dir/thumb",
@@ -1070,10 +1180,12 @@ class ParserTest {
/**
* Print a happy success message.
*
- * @param $desc String: the test name
+ * Refactored in 1.22 to use ParserTestResult
+ *
+ * @param $testResult ParserTestResult
* @return Boolean
*/
- protected function showSuccess( $desc ) {
+ protected function showSuccess( ParserTestResult $testResult ) {
if ( $this->showProgress ) {
print $this->term->color( '1;32' ) . 'PASSED' . $this->term->reset() . "\n";
}
@@ -1085,28 +1197,29 @@ class ParserTest {
* 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
+ * Refactored in 1.22 to use ParserTestResult
+ *
+ * @param $testResult ParserTestResult
* @return Boolean
*/
- protected function showFailure( $desc, $result, $html ) {
+ protected function showFailure( ParserTestResult $testResult ) {
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 );
+ $this->showTesting( $testResult->description );
}
print $this->term->color( '31' ) . 'FAILED!' . $this->term->reset() . "\n";
if ( $this->showOutput ) {
- print "--- Expected ---\n$result\n--- Actual ---\n$html\n";
+ print "--- Expected ---\n{$testResult->expected}\n";
+ print "--- Actual ---\n{$testResult->actual}\n";
}
if ( $this->showDiffs ) {
- print $this->quickDiff( $result, $html );
- if ( !$this->wellFormed( $html ) ) {
+ print $this->quickDiff( $testResult->expected, $testResult->actual );
+ if ( !$this->wellFormed( $testResult->actual ) ) {
print "XML error: $this->mXmlError\n";
}
}
@@ -1125,7 +1238,9 @@ class ParserTest {
* @param $outFileTail String: tailing for the output file name
* @return String
*/
- protected function quickDiff( $input, $output, $inFileTail = 'expected', $outFileTail = 'actual' ) {
+ protected function quickDiff( $input, $output,
+ $inFileTail = 'expected', $outFileTail = 'actual'
+ ) {
# Windows, or at least the fc utility, is retarded
$slash = wfIsWindows() ? '\\' : '/';
$prefix = wfTempDir() . "{$slash}mwParser-" . mt_rand();
@@ -1141,9 +1256,10 @@ class ParserTest {
global $wgDiff3;
// we assume that people with diff3 also have usual diff
- $diff = ( wfIsWindows() && !$wgDiff3 )
- ? `fc $shellInfile $shellOutfile`
- : `diff -au $shellInfile $shellOutfile`;
+ $shellCommand = ( wfIsWindows() && !$wgDiff3 ) ? 'fc' : 'diff -au';
+
+ $diff = wfShellExec( "$shellCommand $shellInfile $shellOutfile" );
+
unlink( $infile );
unlink( $outfile );
@@ -1343,7 +1459,7 @@ class ParserTest {
}
static function getFakeTimestamp( &$parser, &$ts ) {
- $ts = 123;
+ $ts = 123; //parsed as '1970-01-01T00:02:03Z'
return true;
}
}
diff --git a/tests/parser/parserTests.txt b/tests/parser/parserTests.txt
index f0603e75..02a66b51 100644
--- a/tests/parser/parserTests.txt
+++ b/tests/parser/parserTests.txt
@@ -26,6 +26,11 @@
# showtitle make the first line the title
# comment run through Linker::formatComment() instead of main parser
# local format section links in edit comment text as local links
+# notoc disable table of contents
+#
+# You can also set the following parser properties via test options:
+# wgEnableUploads, wgAllowExternalImages, wgMaxTocLevel,
+# wgLinkHolderBatchSize, wgRawHtml
#
# For testing purposes, temporary articles can created:
# !!article / NAMESPACE:TITLE / !!text / ARTICLE TEXT / !!endarticle
@@ -117,11 +122,30 @@ Template:table_attribs
!! endarticle
!! article
+Template:table_cells
+!! text
+{{table_attribs}} || Bar || Baz
+!! endarticle
+
+!! article
+Template:image_attribs
+!! text
+<noinclude>
+[[File:foobar.jpg|</noinclude>right|Caption text<noinclude>]]</noinclude>
+!! endarticle
+
+!! article
A?b
!! text
Weirdo titles!
!! endarticle
+!!article
+Template:Bullet
+!!text
+* Bar
+!!endarticle
+
###
### Basic tests
###
@@ -165,6 +189,206 @@ baz
!! end
!! test
+Paragraphs with newline spacing with comment lines in between
+!! input
+----
+a
+<!--foo-->
+b
+----
+a
+<!--foo--><!--More than 1 comment, still stripped-->
+b
+----
+a
+ <!--foo--> <!----> <!-- bar -->
+b
+----
+a
+<!--foo-->
+
+b
+----
+a
+
+<!--foo-->
+b
+----
+a
+<!--foo-->
+
+
+b
+----
+a
+
+
+<!--foo-->
+b
+----
+!! result
+<hr />
+<p>a
+b
+</p>
+<hr />
+<p>a
+b
+</p>
+<hr />
+<p>a
+b
+</p>
+<hr />
+<p>a
+</p><p>b
+</p>
+<hr />
+<p>a
+</p><p>b
+</p>
+<hr />
+<p>a
+</p><p><br />
+b
+</p>
+<hr />
+<p>a
+</p><p><br />
+b
+</p>
+<hr />
+
+!! end
+
+!! test
+Paragraphs with newline spacing with non-empty white-space lines in between
+!! input
+----
+a
+
+b
+----
+a
+
+
+b
+----
+!! result
+<hr />
+<p>a
+</p><p>b
+</p>
+<hr />
+<p>a
+</p><p><br />
+b
+</p>
+<hr />
+
+!! end
+
+!! test
+Paragraphs with newline spacing with non-empty mixed comment and white-space lines in between
+!! input
+----
+a
+ <!--foo-->
+b
+----
+a
+ <!--foo--><!--More than 1 comment doesn't disable stripping of this line!-->
+b
+----
+a
+
+<!--foo-->
+ <!--bar-->
+b
+----
+a
+
+ <!--foo-->
+ <!--bar-->
+
+b
+----
+!! result
+<hr />
+<p>a
+b
+</p>
+<hr />
+<p>a
+b
+</p>
+<hr />
+<p>a
+</p><p>b
+</p>
+<hr />
+<p>a
+</p><p><br />
+b
+</p>
+<hr />
+
+!! end
+
+!! test
+Extra newlines: More paragraphs with indented comment
+!! input
+a
+
+ <!--boo-->
+
+b
+!!result
+<p>a
+</p><p><br />
+b
+</p>
+!!end
+
+!! test
+Extra newlines followed by heading
+!! input
+a
+
+
+
+=b=
+[[a]]
+
+
+=b=
+!! result
+<p>a
+</p><p><br />
+</p>
+<h1><span class="mw-headline" id="b">b</span><span class="mw-editsection"><span class="mw-editsection-bracket">[</span><a href="/index.php?title=Parser_test&amp;action=edit&amp;section=1" title="Edit section: b">edit</a><span class="mw-editsection-bracket">]</span></span></h1>
+<p><a href="/index.php?title=A&amp;action=edit&amp;redlink=1" class="new" title="A (page does not exist)">a</a>
+</p><p><br />
+</p>
+<h1><span class="mw-headline" id="b_2">b</span><span class="mw-editsection"><span class="mw-editsection-bracket">[</span><a href="/index.php?title=Parser_test&amp;action=edit&amp;section=2" title="Edit section: b">edit</a><span class="mw-editsection-bracket">]</span></span></h1>
+
+!! end
+
+!! test
+Extra newlines between heading and content are swallowed
+!! input
+=b=
+
+
+
+[[a]]
+!! result
+<h1><span class="mw-headline" id="b">b</span><span class="mw-editsection"><span class="mw-editsection-bracket">[</span><a href="/index.php?title=Parser_test&amp;action=edit&amp;section=1" title="Edit section: b">edit</a><span class="mw-editsection-bracket">]</span></span></h1>
+<p><a href="/index.php?title=A&amp;action=edit&amp;redlink=1" class="new" title="A (page does not exist)">a</a>
+</p>
+!! end
+
+!! test
Parsing an URL
!! input
http://fr.wikipedia.org/wiki/ðŸº
@@ -180,9 +404,12 @@ Simple list
* Item 1
* Item 2
!! result
-<ul><li> Item 1
-</li><li> Item 2
-</li></ul>
+<ul>
+<li> Item 1
+</li>
+<li> Item 2
+</li>
+</ul>
!! end
@@ -205,25 +432,72 @@ Italics and bold
* plain l'''italic''plain
* plain l''''bold''' plain
!! result
-<ul><li> plain
-</li><li> plain<i>italic</i>plain
-</li><li> plain<i>italic</i>plain<i>italic</i>plain
-</li><li> plain<b>bold</b>plain
-</li><li> plain<b>bold</b>plain<b>bold</b>plain
-</li><li> plain<i>italic</i>plain<b>bold</b>plain
-</li><li> plain<b>bold</b>plain<i>italic</i>plain
-</li><li> plain<i>italic<b>bold-italic</b>italic</i>plain
-</li><li> plain<b>bold<i>bold-italic</i>bold</b>plain
-</li><li> plain<i><b>bold-italic</b>italic</i>plain
-</li><li> plain<b><i>bold-italic</i>bold</b>plain
-</li><li> plain<i>italic<b>bold-italic</b></i>plain
-</li><li> plain<b>bold<i>bold-italic</i></b>plain
-</li><li> plain l'<i>italic</i>plain
-</li><li> plain l'<b>bold</b> plain
-</li></ul>
+<ul>
+<li> plain
+</li>
+<li> plain<i>italic</i>plain
+</li>
+<li> plain<i>italic</i>plain<i>italic</i>plain
+</li>
+<li> plain<b>bold</b>plain
+</li>
+<li> plain<b>bold</b>plain<b>bold</b>plain
+</li>
+<li> plain<i>italic</i>plain<b>bold</b>plain
+</li>
+<li> plain<b>bold</b>plain<i>italic</i>plain
+</li>
+<li> plain<i>italic<b>bold-italic</b>italic</i>plain
+</li>
+<li> plain<b>bold<i>bold-italic</i>bold</b>plain
+</li>
+<li> plain<i><b>bold-italic</b>italic</i>plain
+</li>
+<li> plain<b><i>bold-italic</i>bold</b>plain
+</li>
+<li> plain<i>italic<b>bold-italic</b></i>plain
+</li>
+<li> plain<b>bold<i>bold-italic</i></b>plain
+</li>
+<li> plain l'<i>italic</i>plain
+</li>
+<li> plain l'<b>bold</b> plain
+</li>
+</ul>
+
+!! end
+
+# this example taken from the [[simple:Moon]] article (bug 47326)
+!! test
+Italics and possessives (1)
+!! input
+obtained by ''[[Lunar Prospector]]'''s gamma-ray spectrometer
+!! result
+<p>obtained by <i><a href="/index.php?title=Lunar_Prospector&amp;action=edit&amp;redlink=1" class="new" title="Lunar Prospector (page does not exist)">Lunar Prospector</a>'</i>s gamma-ray spectrometer
+</p>
+!! end
+
+# this example taken from [[en:Flaming Pie]] (bug 49926)
+!! test
+Italics and possessives (2)
+!! input
+'''''Flaming Pie''''' is ... released in 1997. In ''Flaming Pie'''s liner notes
+!! result
+<p><i><b>Flaming Pie</b></i> is ... released in 1997. In <i>Flaming Pie'</i>s liner notes
+</p>
+!! end
+# this example taken from [[en:Dictionary]] (bug 49926)
+!! test
+Italics and possessives (3)
+!! input
+The first monolingual dictionary written in a Romance language was ''Sebastián Covarrubias''' ''Tesoro de la lengua castellana o española'', published in 1611 in Madrid. In 1612 the first edition of the ''Vocabolario dell'[[Accademia della Crusca]]'', for Italian, was published. In 1690 in Rotterdam was published, posthumously, the ''Dictionnaire Universel''.
+!! result
+<p>The first monolingual dictionary written in a Romance language was <i>Sebastián Covarrubias'</i> <i>Tesoro de la lengua castellana o española</i>, published in 1611 in Madrid. In 1612 the first edition of the <i>Vocabolario dell'<a href="/index.php?title=Accademia_della_Crusca&amp;action=edit&amp;redlink=1" class="new" title="Accademia della Crusca (page does not exist)">Accademia della Crusca</a></i>, for Italian, was published. In 1690 in Rotterdam was published, posthumously, the <i>Dictionnaire Universel</i>.
+</p>
!! end
+
###
### 2-quote opening sequence tests
###
@@ -258,13 +532,26 @@ Italics and bold: 2-quote opening sequence: (2,4)
!! test
-Italics and bold: 2-quote opening sequence: (2,5)
+Italics and bold: 2-quote opening sequence: (2,5) (php)
+!! options
+php
!! input
''foo'''''
!! result
<p><i>foo</i>
</p>
!!end
+# The PHP parser strips the empty tags out for giggles; parsoid doesn't.
+!! test
+Italics and bold: 2-quote opening sequence: (2,5) (parsoid)
+!! options
+parsoid
+!! input
+''foo'''''
+!! result
+<p><i>foo</i><b></b>
+</p>
+!!end
###
@@ -302,13 +589,26 @@ Italics and bold: 3-quote opening sequence: (3,4)
!! test
-Italics and bold: 3-quote opening sequence: (3,5)
+Italics and bold: 3-quote opening sequence: (3,5) (php)
+!! options
+php
!! input
'''foo'''''
!! result
<p><b>foo</b>
</p>
!!end
+# The PHP parser strips the empty tags out for giggles; parsoid doesn't.
+!! test
+Italics and bold: 3-quote opening sequence: (3,5) (parsoid)
+!! options
+parsoid
+!! input
+'''foo'''''
+!! result
+<p><b>foo</b><i></i>
+</p>
+!!end
###
@@ -346,13 +646,26 @@ Italics and bold: 4-quote opening sequence: (4,4)
!! test
-Italics and bold: 4-quote opening sequence: (4,5)
+Italics and bold: 4-quote opening sequence: (4,5) (php)
+!! options
+php
!! input
''''foo'''''
!! result
<p>'<b>foo</b>
</p>
!!end
+# The PHP parser strips the empty tags out for giggles; parsoid doesn't.
+!! test
+Italics and bold: 4-quote opening sequence: (4,5) (parsoid)
+!! options
+parsoid
+!! input
+''''foo'''''
+!! result
+<p>'<b>foo</b><i></i>
+</p>
+!!end
###
@@ -361,6 +674,7 @@ Italics and bold: 4-quote opening sequence: (4,5)
!! test
Italics and bold: 5-quote opening sequence: (5,2)
+!! options
!! input
'''''foo''
!! result
@@ -432,23 +746,49 @@ Italics and bold: multiple quote sequences: (2,4,4)
!! test
-Italics and bold: multiple quote sequences: (3,4,2)
+Italics and bold: multiple quote sequences: (3,4,2) (php)
+!! options
+php
!! input
'''foo''''bar''
!! result
<p><b>foo'</b>bar
</p>
!!end
+# The PHP parser strips the empty tags out for giggles; parsoid doesn't.
+!! test
+Italics and bold: multiple quote sequences: (3,4,2) (parsoid)
+!! options
+parsoid
+!! input
+'''foo''''bar''
+!! result
+<p><b>foo'</b>bar<i></i>
+</p>
+!!end
!! test
-Italics and bold: multiple quote sequences: (3,4,3)
+Italics and bold: multiple quote sequences: (3,4,3) (php)
+!! options
+php
!! input
'''foo''''bar'''
!! result
<p><b>foo'</b>bar
</p>
!!end
+# The PHP parser strips the empty tags out for giggles; parsoid doesn't.
+!! test
+Italics and bold: multiple quote sequences: (3,4,3) (parsoid)
+!! options
+parsoid
+!! input
+'''foo''''bar'''
+!! result
+<p><b>foo'</b>bar<b></b>
+</p>
+!!end
###
### other quote tests
@@ -485,6 +825,7 @@ Italics and bold: other quote tests: (3,2,3,2)
!! test
Italics and bold: other quote tests: (3,2,3,3)
+!! options
!! input
'''this is about ''foo'''s family'''
!! result
@@ -512,6 +853,23 @@ The ''[[Main Page]]'''s talk page.
</p>
!! end
+!! test
+Parsoid only: Quote balancing context should be restricted to td/th cells on the same wikitext line
+(Requires tidy for PHP parser output to be fixed up)
+!! options
+parsoid=wt2html,wt2wt
+!! input
+{|
+!''a!!''b
+|''a||''b
+|}
+!! result
+<table>
+<tbody><tr><th><i>a</i></th><th><i>b</i></th>
+<td><i>a</i></td><td><i>b</i></td></tr>
+</tbody></table>
+!! end
+
###
### Non-html5 tags
###
@@ -533,6 +891,74 @@ Non-html5 tags should be accepted
</p>
!! end
+!! test
+<wbr> is valid wikitext (bug 52468)
+!! input
+<wbr>
+!! result
+<p><wbr />
+</p>
+!! end
+
+# <strike> is HTML4, <s> is HTML4/5.
+!! test
+<s> or <strike> for strikethrough
+!! input
+<strike>strike</strike>
+
+<s>s</s>
+!! result
+<p><strike>strike</strike>
+</p><p><s>s</s>
+</p>
+!! end
+
+!! test
+Non-word characters don't terminate tag names (bug 17663, 40670, 52022)
+!! input
+<b→> doesn't work! </b>
+
+<bä> doesn't work! </b>
+
+<boo> works fine </b>
+
+<s.foo>foo</s>
+
+<s.foo>s.foo</s.foo>
+
+<sub-ID#1>
+!! result
+<p>&lt;b→&gt; doesn't work! &lt;/b&gt;
+</p><p>&lt;bä&gt; doesn't work! &lt;/b&gt;
+</p><p>&lt;boo&gt; works fine &lt;/b&gt;
+</p><p>&lt;s.foo&gt;foo&lt;/s&gt;
+</p><p>&lt;s.foo&gt;s.foo&lt;/s.foo&gt;
+</p><p>&lt;sub-ID#1&gt;
+</p>
+!! end
+
+###
+### Special characters
+###
+
+!! test
+Bare pipe character (bug 52363)
+!! input
+|
+!! result
+<p>|
+</p>
+!! end
+
+!! test
+Bare pipe character from a template (bug 52363)
+!! input
+{{pipe}}
+!! result
+<p>|
+</p>
+!! end
+
###
### <nowiki> test cases
###
@@ -579,15 +1005,24 @@ nowiki 3
*There is not nowiki.
*There is <nowiki>nowiki</nowiki>.
!! result
-<dl><dd>There is not nowiki.
-</dd><dd>There is nowiki.
-</dd></dl>
-<ol><li>There is not nowiki.
-</li><li>There is nowiki.
-</li></ol>
-<ul><li>There is not nowiki.
-</li><li>There is nowiki.
-</li></ul>
+<dl>
+<dd>There is not nowiki.
+</dd>
+<dd>There is nowiki.
+</dd>
+</dl>
+<ol>
+<li>There is not nowiki.
+</li>
+<li>There is nowiki.
+</li>
+</ol>
+<ul>
+<li>There is not nowiki.
+</li>
+<li>There is nowiki.
+</li>
+</ul>
!! end
@@ -600,6 +1035,16 @@ Entities inside <nowiki>
</p>
!! end
+!! test
+Entities inside template parameters
+!! options
+parsoid
+!! input
+{{echo|&ndash;}}
+!! result
+<p><span typeof="mw:Transclusion mw:Entity" data-mw='{"parts":[{"template":{"target":{"wt":"echo","href":"./Template:Echo"},"params":{"1":{"wt":"&amp;ndash;"}},"i":0}}]}'>&ndash;</span>
+</p>
+!! end
###
### Comments
@@ -781,7 +1226,7 @@ b
!! end
###
-### paragraph wraping tests
+### paragraph wrapping tests
###
!! test
No block tags
@@ -794,8 +1239,9 @@ b
</p><p>b
</p>
!! end
+
!! test
-Block tag on one line
+Block tag on one line (<div>)
!! input
a <div>foo</div>
@@ -807,7 +1253,19 @@ a <div>foo</div>
!! end
!! test
-Block tag on both lines
+Block tag on one line (<blockquote>)
+!! input
+a <blockquote>foo</blockquote>
+
+b
+!! result
+a <blockquote>foo</blockquote>
+<p>b
+</p>
+!! end
+
+!! test
+Block tag on both lines (<div>)
!! input
a <div>foo</div>
@@ -819,6 +1277,18 @@ b <div>foo</div>
!! end
!! test
+Block tag on both lines (<blockquote>)
+!! input
+a <blockquote>foo</blockquote>
+
+b <blockquote>foo</blockquote>
+!! result
+a <blockquote>foo</blockquote>
+b <blockquote>foo</blockquote>
+
+!! end
+
+!! test
Multiple lines without block tags
!! input
<div>foo</div> a
@@ -837,7 +1307,7 @@ x <div>foo</div> z
!! end
!! test
-Empty lines between block tags to test open p-tags are closed between the block tags
+Empty lines between lines with block tags
!! input
<div></div>
@@ -845,6 +1315,12 @@ Empty lines between block tags to test open p-tags are closed between the block
<div></div>a
b
+<div>a</div>b
+
+<div>b</div>d
+
+
+<div>e</div>
!! result
<div></div>
<p><br />
@@ -852,6 +1328,12 @@ b
<div></div>a
<p>b
</p>
+<div>a</div>b
+<div>b</div>d
+<p><br />
+</p>
+<div>e</div>
+
!! end
###
@@ -875,6 +1357,22 @@ And a <a href="/wiki/Main_Page" title="Main Page">link</a>
!! end
!! test
+Tabs don't trigger preformatted text
+!! input
+ This is not
+ preformatted text.
+ This is preformatted text.
+ So is this.
+!! result
+<p> This is not
+ preformatted text.
+</p>
+<pre>This is preformatted text.
+ So is this.
+</pre>
+!! end
+
+!! test
Ident preformatting with inline content
!! input
a
@@ -916,17 +1414,61 @@ 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>
+Bug 52763: Preformatted in <blockquote>
!! input
<blockquote>
Blah
</blockquote>
!! result
<blockquote>
- Blah
+<p> Blah
+</p>
+</blockquote>
+
+!! end
+
+!! test
+Bug 51086: Double newlines in blockquotes should be turned into paragraphs
+!! input
+<blockquote>
+Foo
+
+Bar
+</blockquote>
+!! result
+<blockquote>
+<p>Foo
+</p><p>Bar
+</p>
+</blockquote>
+
+!! end
+
+!! test
+Bug 15491: <ins>/<del> in blockquote
+!! input
+<blockquote>
+Foo <del>bar</del> <ins>baz</ins> quux
+</blockquote>
+!! result
+<blockquote>
+<p>Foo <del>bar</del> <ins>baz</ins> quux
+</p>
+</blockquote>
+
+!! end
+
+# Note that the p-wrapping is newline sensitive, which could be
+# considered a bug: tidy will wrap only the 'Foo' in the example
+# below in a <p> tag. (see comment 23-25 of bug #6200)
+!! test
+Bug 15491: <ins>/<del> in blockquote (2)
+!! input
+<blockquote>Foo <del>bar</del> <ins>baz</ins> quux
+</blockquote>
+!! result
+<blockquote>Foo <del>bar</del> <ins>baz</ins> quux
</blockquote>
!! end
@@ -1156,53 +1698,224 @@ Templates: Indent-Pre: 1f: Wrapping should be based on expanded content
</pre>
!!end
+# TODO / maybe: fix wt2wt for this
!! test
-Templates: Single-line variant of parameter whitespace stripping test
+Parsoid: Don't paragraph-wrap fosterable content
+!! options
+parsoid=wt2html
!! input
-{{echo| a}}
+{|
+<td></td>
+<td></td>
-{{echo|1= a}}
-{{echo|{{echo| a}}}}
-{{echo|1={{echo| a}}}}
+|}
+!! result
+<table>
+
+<tbody>
+<tr>
+<td></td>
+
+<td></td></tr>
+
+
+
+</tbody></table>
+!! end
+
+!! test
+Parsoid: Don't paragraph-wrap fosterable content even if table syntax is unbalanced
+!! options
+parsoid=wt2html
+!! input
+{|
+<td>
+<td>
+</td>
+
+
+
+|}
+!! result
+<table>
+
+<tbody>
+<tr>
+<td></td>
+
+<td>
+</td></tr>
+
+
+
+</tbody></table>
+!! end
+
+
+#--------------------------------------------------------------------
+# Transclusion parameter whitespace stripping tests
+# Behavior is different for positional and named parameters
+#--------------------------------------------------------------------
+!! test
+Templates: Strip leading and trailing whitespace from named-param values
+!! input
+{{echo|1= a }}
+
+{{echo|1= {{echo|b}} }}
+
+{{echo| 1 =
+ c }}
+
+{{echo| 1 =
+* d
+}}
!! result
-<pre>a
-</pre>
-<p>a
-</p>
-<pre>a
-</pre>
<p>a
+</p><p>b
+</p><p>c
</p>
+<ul>
+<li> d
+</li>
+</ul>
+
!! end
!! test
-Templates: Strip whitespace from named parameters, but not positional ones
+Templates: Don't strip whitespace from positional-param values
!! input
-{{echo|
- foo}}
+{{echo|a }}
+
+{{echo|{{echo|b}} }}
+
+{{echo| c
+}}
+
+{{echo| {{echo|d}}
+}}
{{echo|
-* foo}}
+ e}}
-{{echo| 1 =
- foo}}
+{{echo|
+* f}}
-{{echo| 1 =
-* foo}}
+{{echo|
+ }}g
!! result
-<pre>foo
+<p>a
+</p><p>b
+</p>
+<pre>c
</pre>
<p><br />
</p>
-<ul><li> foo
-</li></ul>
+<pre>d
+</pre>
+<p><br />
+</p>
+<pre>e
+</pre>
+<p><br />
+</p>
+<ul>
+<li> f
+</li>
+</ul>
+<p><br />
+</p>
+<pre>g
+</pre>
+!! end
+
+!! test
+Templates: Handle empty comment-and-ws-only lines correctly
+!! input
+{{echo|foo
+<!--should be ignored-->
+ <!--should be ignored as well-->
+bar}}
+!! result
<p>foo
+bar
</p>
-<ul><li> foo
-</li></ul>
+!! end
+#--------------------------------------------------------------------
+# Transclusion parameter escaping tests
+#--------------------------------------------------------------------
+!! test
+Templates: Parsoid parameter escaping test 1
+!! options
+parsoid
+!! input
+{{echo|[foo]|{{echo|[bar]}}}}
+!! result
+<p about="#mwt1" typeof="mw:Transclusion"
+data-mw='{"parts":[{"template":{"target":{"wt":"echo","href":"./Template:Echo"},"params":{"1":{"wt":"[foo]"},"2":{"wt":"{{echo|[bar]}}"}},"i":0}}]}'>[foo]</p>
+!! end
+
+!! test
+Parsoid: Pipes in external links in template parameter
+!! options
+parsoid
+!! input
+{{echo|[{{echo|http://example.com}} link]}}
+!! result
+<p><a rel="mw:ExtLink" href="http://example.com" about="#mwt31" typeof="mw:Transclusion" data-mw='{"parts":[{"template":{"target":{"wt":"echo","href":"./Template:Echo"},"params":{"1":{"wt":"[{{echo|http://example.com}} link]"}},"i":0}}]}'>link</a></p>
+!! end
+
+!! test
+Parsoid: pipe in transclusion parameter
+!! options
+parsoid
+!! input
+{{echo|http://foo.com/a&#124;b}}
+!! result
+<p><a rel="mw:ExtLink" href="http://foo.com/a|b" about="#mwt1"
+typeof="mw:Transclusion"
+data-mw='{"parts":[{"template":{"target":{"wt":"echo","href":"./Template:Echo"},"params":{"1":{"wt":"http://foo.com/a&amp;#124;b"}},"i":0}}]}'>http://foo.com/a|b</a></p>
+!! end
+
+!! test
+Parsoid: Pipe in external link target and content in template parameter
+!! options
+parsoid=html2wt,wt2wt
+!! input
+{{echo|[http://foo.com/a&#124;b a&#124;b]}}
+!! result
+<p><a rel="mw:ExtLink" href="http://foo.com/a|b" about="#mwt1"
+typeof="mw:Transclusion"
+data-mw='{"parts":[{"template":{"target":{"wt":"echo","href":"./Template:Echo"},
+"params":{"1":{"wt":"[http://foo.com/a|b a|b]"}},"i":0}}]}'>a|b</a></p>
+!! end
+
+!! test
+Templates: Dont escape already nowiki-escaped text in template parameters
+!! options
+parsoid=html2wt,wt2wt
+!! input
+{{echo|foo<nowiki>|</nowiki>bar}}
+{{echo|<nowiki>&lt;div&gt;</nowiki>}}
+{{echo|<nowiki></nowiki>}}
+!! result
+<p><span about="#mwt1" typeof="mw:Transclusion" data-mw='{"parts":[{"template":{"target":{"wt":"echo","href":"./Template:Echo"},"params":{"1":{"wt":"foo<nowiki>|</nowiki>bar"}},"i":0}}]}'}'>foo</span><span typeof="mw:Nowiki" about="#mwt1">|</span><span about="#mwt1">bar</span>
+<span typeof="mw:Transclusion mw:Nowiki" about="#mwt2" data-mw='{"parts":[{"template":{"target":{"wt":"echo","href":"./Template:Echo"},"params":{"1":{"wt":"<nowiki>&amp;lt;div&amp;gt;</nowiki>"}},"i":0}}]}'><span typeof="mw:Entity">&lt;</span>div<span typeof="mw:Entity">&gt;</span></span>
+<span typeof="mw:Transclusion mw:Nowiki" about="#mwt3" data-mw='{"parts":[{"template":{"target":{"wt":"echo","href":"./Template:Echo"},"params":{"1":{"wt":"<nowiki></nowiki>"}},"i":0}}]}'></span>
+</p>
+!! end
+
+## Bug 52824
+!! test
+Templates: '=' char in nested transclusions should not trigger nowiki escapes or conversion to named param
+!! options
+parsoid=html2wt,wt2wt
+!! input
+{{echo|{{echo|1=bar}}}}
+!! result
+<p about="#mwt1" typeof="mw:Transclusion" data-mw='{"parts":[{"template":{"target":{"wt":"echo","href":"./Template:Echo"},"params":{"1":{"wt":"{{echo|1=bar}}"}},"i":0}}]}'>bar</p>
!! end
###
@@ -1249,6 +1962,20 @@ c
!!end
!!test
+1d. Indent-Pre and Comments
+(Pre-handler currently cannot distinguish between comment/ws order and normalizes them to [comment,ws] order)
+!!input
+<!--a--> a
+
+ <!--b-->b
+!!result
+<pre>a
+</pre>
+<pre>b
+</pre>
+!!end
+
+!!test
2a. Indent-Pre and tables
!!input
{|
@@ -1307,10 +2034,12 @@ c
!!input
<p> foo </p>
<div> foo </div>
+ <blockquote> foo </blockquote>
<span> foo </span>
!!result
<p> foo </p>
<div> foo </div>
+ <blockquote> foo </blockquote>
<pre><span> foo </span>
</pre>
!!end
@@ -1334,6 +2063,12 @@ c
foo
</blockquote>
+<blockquote>
+<pre>
+foo
+</pre>
+</blockquote>
+
<table><tr><td>
foo
</td></tr></table>
@@ -1355,7 +2090,13 @@ c
</pre>
</center>
<blockquote>
- foo
+<p> foo
+</p>
+</blockquote>
+<blockquote>
+<pre>
+foo
+</pre>
</blockquote>
<table><tr><td>
<pre>foo
@@ -1400,6 +2141,56 @@ b
</pre>
!! end
+!! test
+6. Pre-blocks should extend across lines with leading WS even when there is no wrappable content
+!! input
+ a
+
+ <!-- continue -->
+ b
+
+ c
+
+d
+!! result
+<pre>a
+
+b
+</pre>
+<pre>c
+
+</pre>
+<p>d
+</p>
+!! end
+
+!! test
+7a. Indent-pre and category links
+!! options
+parsoid=wt2html,wt2wt
+!! input
+ [[Category:foo]] <!-- No pre-wrapping -->
+{{echo| [[Category:foo]]}} <!-- No pre-wrapping -->
+!! result
+ <link rel="mw:WikiLink/Category" href="./Category:Foo"> <!-- No pre-wrapping -->
+<span about="#mwt1" typeof="mw:Transclusion" data-mw='{"parts":[{"template":{"target":{"wt":"echo","href":"./Template:Echo"},"params":{"1":{"wt":" [[Category:foo]]"}},"i":0}}]}'> </span>
+<link rel="mw:WikiLink/Category" href="./Category:Foo" about="#mwt1"> <!-- No pre-wrapping -->
+!! end
+
+!! test
+7b. Indent-pre and category links
+!! options
+parsoid=wt2html,wt2wt
+!! input
+ [[Category:foo]] a
+ [[Category:foo]] {{echo|b}}
+!! result
+<pre>
+<link rel="mw:WikiLink/Category" href="./Category:Foo"> a
+
+<link rel="mw:WikiLink/Category" href="./Category:Foo"> <span about="#mwt1" typeof="mw:Transclusion" data-mw='{"parts":[{"template":{"target":{"wt":"echo","href":"./Template:Echo"},"params":{"1":{"wt":"b"}},"i":0}}]}'>b</span></pre>
+!! end
+
###
### HTML-pre (some to spec PHP parser behavior and some Parsoid-RT-centric)
###
@@ -1482,8 +2273,11 @@ Simple definition
!! input
; name : Definition
!! result
-<dl><dt> name&#160;</dt><dd> Definition
-</dd></dl>
+<dl>
+<dt> name&#160;</dt>
+<dd> Definition
+</dd>
+</dl>
!! end
@@ -1492,8 +2286,10 @@ Definition list for indentation only
!! input
: Indented text
!! result
-<dl><dd> Indented text
-</dd></dl>
+<dl>
+<dd> Indented text
+</dd>
+</dl>
!! end
@@ -1502,8 +2298,11 @@ Definition list with no space
!! input
;name:Definition
!! result
-<dl><dt>name</dt><dd>Definition
-</dd></dl>
+<dl>
+<dt>name</dt>
+<dd>Definition
+</dd>
+</dl>
!!end
@@ -1512,8 +2311,11 @@ Definition list with URL link
!! input
; http://example.com/ : definition
!! result
-<dl><dt> <a rel="nofollow" class="external free" href="http://example.com/">http://example.com/</a>&#160;</dt><dd> definition
-</dd></dl>
+<dl>
+<dt> <a rel="nofollow" class="external free" href="http://example.com/">http://example.com/</a>&#160;</dt>
+<dd> definition
+</dd>
+</dl>
!! end
@@ -1522,8 +2324,11 @@ Definition list with bracketed URL link
!! input
;[http://www.example.com/ Example]:Something about it
!! result
-<dl><dt><a rel="nofollow" class="external text" href="http://www.example.com/">Example</a></dt><dd>Something about it
-</dd></dl>
+<dl>
+<dt><a rel="nofollow" class="external text" href="http://www.example.com/">Example</a></dt>
+<dd>Something about it
+</dd>
+</dl>
!! end
@@ -1532,8 +2337,11 @@ Definition list with wikilink containing colon
!! input
; [[Help:FAQ]]: The least-read page on Wikipedia
!! result
-<dl><dt> <a href="/index.php?title=Help:FAQ&amp;action=edit&amp;redlink=1" class="new" title="Help:FAQ (page does not exist)">Help:FAQ</a></dt><dd> The least-read page on Wikipedia
-</dd></dl>
+<dl>
+<dt> <a href="/index.php?title=Help:FAQ&amp;action=edit&amp;redlink=1" class="new" title="Help:FAQ (page does not exist)">Help:FAQ</a></dt>
+<dd> The least-read page on Wikipedia
+</dd>
+</dl>
!! end
@@ -1543,8 +2351,11 @@ Definition list with news link containing colon
!! input
; news:alt.wikipedia.rox: This isn't even a real newsgroup!
!! result
-<dl><dt> <a rel="nofollow" class="external free" href="news:alt.wikipedia.rox">news:alt.wikipedia.rox</a></dt><dd> This isn't even a real newsgroup!
-</dd></dl>
+<dl>
+<dt> <a rel="nofollow" class="external free" href="news:alt.wikipedia.rox">news:alt.wikipedia.rox</a></dt>
+<dd> This isn't even a real newsgroup!
+</dd>
+</dl>
!! end
@@ -1553,8 +2364,10 @@ Malformed definition list with colon
!! input
; news:alt.wikipedia.rox -- don't crash or enter an infinite loop
!! result
-<dl><dt> <a rel="nofollow" class="external free" href="news:alt.wikipedia.rox">news:alt.wikipedia.rox</a> -- don't crash or enter an infinite loop
-</dt></dl>
+<dl>
+<dt> <a rel="nofollow" class="external free" href="news:alt.wikipedia.rox">news:alt.wikipedia.rox</a> -- don't crash or enter an infinite loop
+</dt>
+</dl>
!! end
@@ -1563,8 +2376,11 @@ 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 rel="nofollow" class="external text" href="http://www.wikipedia2.org/">Wikipedia&#160;: The Next Generation</a></dt><dd> OK, I made that up
-</dd></dl>
+<dl>
+<dt> <a rel="nofollow" class="external text" href="http://www.wikipedia2.org/">Wikipedia&#160;: The Next Generation</a></dt>
+<dd> OK, I made that up
+</dd>
+</dl>
!! end
@@ -1573,8 +2389,10 @@ Definition lists: colon in HTML attribute
!! input
;<b style="display: inline">bold</b>
!! result
-<dl><dt><b style="display: inline">bold</b>
-</dt></dl>
+<dl>
+<dt><b style="display: inline">bold</b>
+</dt>
+</dl>
!! end
@@ -1583,8 +2401,11 @@ Definition lists: self-closed tag
!! input
;one<br/>two : two-line fun
!! result
-<dl><dt>one<br />two&#160;</dt><dd> two-line fun
-</dd></dl>
+<dl>
+<dt>one<br />two&#160;</dt>
+<dd> two-line fun
+</dd>
+</dl>
!! end
@@ -1613,16 +2434,19 @@ Definition and unordered list using wiki syntax nested in unordered list using h
<ul><li>
; term : description
* unordered
-</li>
-</ul>
+</li></ul>
!! result
<ul><li>
-<dl><dt> term&#160;</dt><dd> description
-</dd></dl>
-<ul><li> unordered
-</li></ul>
+<dl>
+<dt> term&#160;</dt>
+<dd> description
+</dd>
+</dl>
+<ul>
+<li> unordered
</li>
</ul>
+</li></ul>
!! end
@@ -1633,8 +2457,11 @@ Definition list with empty definition and following paragraph
; term:
Paragraph text
!! result
-<dl><dt> term</dt><dd>
-</dd></dl>
+<dl>
+<dt> term</dt>
+<dd>
+</dd>
+</dl>
<p>Paragraph text
</p>
!! end
@@ -1663,10 +2490,14 @@ Definition Lists: No nesting: Multiple dd's
:a
:b
!! result
-<dl><dt>x
-</dt><dd>a
-</dd><dd>b
-</dd></dl>
+<dl>
+<dt>x
+</dt>
+<dd>a
+</dd>
+<dd>b
+</dd>
+</dl>
!! end
@@ -1677,12 +2508,18 @@ Definition Lists: Indentation: Regular
::i2
:::i3
!! result
-<dl><dd>i1
-<dl><dd>i2
-<dl><dd>i3
-</dd></dl>
-</dd></dl>
-</dd></dl>
+<dl>
+<dd>i1
+<dl>
+<dd>i2
+<dl>
+<dd>i3
+</dd>
+</dl>
+</dd>
+</dl>
+</dd>
+</dl>
!! end
@@ -1692,11 +2529,17 @@ Definition Lists: Indentation: Missing 1st level
::i2
:::i3
!! result
-<dl><dd><dl><dd>i2
-<dl><dd>i3
-</dd></dl>
-</dd></dl>
-</dd></dl>
+<dl>
+<dd><dl>
+<dd>i2
+<dl>
+<dd>i3
+</dd>
+</dl>
+</dd>
+</dl>
+</dd>
+</dl>
!! end
@@ -1705,10 +2548,16 @@ Definition Lists: Indentation: Multi-level indent
!! input
:::i3
!! result
-<dl><dd><dl><dd><dl><dd>i3
-</dd></dl>
-</dd></dl>
-</dd></dl>
+<dl>
+<dd><dl>
+<dd><dl>
+<dd>i3
+</dd>
+</dl>
+</dd>
+</dl>
+</dd>
+</dl>
!! end
@@ -1732,6 +2581,21 @@ should be left alone
should be left alone
</p>
!! end
+
+# Bug 52473
+!! test
+Definition Lists: Hacky use to indent tables (WS-insensitive)
+!! options
+parsoid
+!! input
+: {|
+|a
+|}
+!! result
+<dl>
+<dd> <table><tr><td>a</td></tr></table> </dd>
+</dl>
+!! end
## The PHP parser treats : items (dd) without a corresponding ; item (dt)
## as an empty dt item. It also ignores all but the last ";" when followed
## by ":" later on. So, ";" are not ignored in ";;;t3" but are ignored in
@@ -1783,13 +2647,17 @@ Table / list interaction: indented table with lists in table contents
<tr>
<td> a
-<ul><li> b
-</li></ul>
+<ul>
+<li> b
+</li>
+</ul>
</td></tr>
<tr>
<td> c
-<ul><li> d
-</li></ul>
+<ul>
+<li> d
+</li>
+</ul>
</td></tr></table></dd></dl>
!! end
@@ -1812,18 +2680,27 @@ Table / list interaction: lists nested in tables nested in indented lists
<dl><dd><table>
<tr>
<td>
-<dl><dd>a
-</dd><dd>b
-</dd></dl>
+<dl>
+<dd>a
+</dd>
+<dd>b
+</dd>
+</dl>
</td>
<td>
-<ul><li>c
-</li><li>d
-</li></ul>
+<ul>
+<li>c
+</li>
+<li>d
+</li>
+</ul>
</td></tr></table></dd></dl>
-<ul><li>e
-</li><li>f
-</li></ul>
+<ul>
+<li>e
+</li>
+<li>f
+</li>
+</ul>
!!end
@@ -1911,32 +2788,75 @@ Definition Lists: Nesting: Test 4
::;t3
:::d3
!! result
-<dl><dd><dl><dd><dl><dt>t3
-</dt><dd>d3
-</dd></dl>
-</dd></dl>
-</dd></dl>
+<dl>
+<dd><dl>
+<dd><dl>
+<dt>t3
+</dt>
+<dd>d3
+</dd>
+</dl>
+</dd>
+</dl>
+</dd>
+</dl>
!! end
+## The Parsoid team believes the following three test exposes a
+## bug in the PHP parser. (Parsoid team thinks the PHP parser is
+## wrong to close the <dl> after the <dt> containing the <ul>.)
!! test
-Definition Lists: Mixed Lists: Test 1
+Definition Lists: Mixed Lists: Test 1 (php)
+!! options
+php
!! input
:;* foo
::* bar
:; baz
!! result
-<dl><dd><dl><dt><ul><li> foo
-</li><li> bar
-</li></ul>
-</dt></dl>
-<dl><dt> baz
-</dt></dl>
-</dd></dl>
+<dl>
+<dd><dl>
+<dt><ul>
+<li> foo
+</li>
+<li> bar
+</li>
+</ul>
+</dt>
+</dl>
+<dl>
+<dt> baz
+</dt>
+</dl>
+</dd>
+</dl>
!! end
-
+!! test
+Definition Lists: Mixed Lists: Test 1 (parsoid)
+!! options
+parsoid
+!! input
+:;* foo
+::* bar
+:; baz
+!! result
+<dl>
+<dd><dl>
+<dt><ul>
+<li> foo
+</li>
+</ul></dt>
+<dd><ul>
+<li> bar
+</li>
+</ul></dd>
+<dt> baz</dt>
+</dl></dd>
+</dl>
+!! end
!! test
Definition Lists: Mixed Lists: Test 2
@@ -1944,10 +2864,15 @@ Definition Lists: Mixed Lists: Test 2
*: d1
*: d2
!! result
-<ul><li><dl><dd> d1
-</dd><dd> d2
-</dd></dl>
-</li></ul>
+<ul>
+<li><dl>
+<dd> d1
+</dd>
+<dd> d2
+</dd>
+</dl>
+</li>
+</ul>
!! end
@@ -1958,12 +2883,21 @@ Definition Lists: Mixed Lists: Test 3
*::: d1
*::: d2
!! result
-<ul><li><dl><dd><dl><dd><dl><dd> d1
-</dd><dd> d2
-</dd></dl>
-</dd></dl>
-</dd></dl>
-</li></ul>
+<ul>
+<li><dl>
+<dd><dl>
+<dd><dl>
+<dd> d1
+</dd>
+<dd> d2
+</dd>
+</dl>
+</dd>
+</dl>
+</dd>
+</dl>
+</li>
+</ul>
!! end
@@ -1974,10 +2908,17 @@ Definition Lists: Mixed Lists: Test 4
*;d1 :d2
*;d3 :d4
!! result
-<ul><li><dl><dt>d1&#160;</dt><dd>d2
-</dd><dt>d3&#160;</dt><dd>d4
-</dd></dl>
-</li></ul>
+<ul>
+<li><dl>
+<dt>d1&#160;</dt>
+<dd>d2
+</dd>
+<dt>d3&#160;</dt>
+<dd>d4
+</dd>
+</dl>
+</li>
+</ul>
!! end
@@ -1988,11 +2929,17 @@ Definition Lists: Mixed Lists: Test 5
*:d1
*:: d2
!! result
-<ul><li><dl><dd>d1
-<dl><dd> d2
-</dd></dl>
-</dd></dl>
-</li></ul>
+<ul>
+<li><dl>
+<dd>d1
+<dl>
+<dd> d2
+</dd>
+</dl>
+</dd>
+</dl>
+</li>
+</ul>
!! end
@@ -2003,13 +2950,23 @@ Definition Lists: Mixed Lists: Test 6
#*:d1
#*::: d3
!! result
-<ol><li><ul><li><dl><dd>d1
-<dl><dd><dl><dd> d3
-</dd></dl>
-</dd></dl>
-</dd></dl>
-</li></ul>
-</li></ol>
+<ol>
+<li><ul>
+<li><dl>
+<dd>d1
+<dl>
+<dd><dl>
+<dd> d3
+</dd>
+</dl>
+</dd>
+</dl>
+</dd>
+</dl>
+</li>
+</ul>
+</li>
+</ol>
!! end
@@ -2020,10 +2977,15 @@ Definition Lists: Mixed Lists: Test 7
:* d1
:* d2
!! result
-<dl><dd><ul><li> d1
-</li><li> d2
-</li></ul>
-</dd></dl>
+<dl>
+<dd><ul>
+<li> d1
+</li>
+<li> d2
+</li>
+</ul>
+</dd>
+</dl>
!! end
@@ -2034,12 +2996,20 @@ Definition Lists: Mixed Lists: Test 8
:* d1
::* d2
!! result
-<dl><dd><ul><li> d1
-</li></ul>
-<dl><dd><ul><li> d2
-</li></ul>
-</dd></dl>
-</dd></dl>
+<dl>
+<dd><ul>
+<li> d1
+</li>
+</ul>
+<dl>
+<dd><ul>
+<li> d2
+</li>
+</ul>
+</dd>
+</dl>
+</dd>
+</dl>
!! end
@@ -2049,9 +3019,14 @@ Definition Lists: Mixed Lists: Test 9
!! input
*;foo :bar
!! result
-<ul><li><dl><dt>foo&#160;</dt><dd>bar
-</dd></dl>
-</li></ul>
+<ul>
+<li><dl>
+<dt>foo&#160;</dt>
+<dd>bar
+</dd>
+</dl>
+</li>
+</ul>
!! end
@@ -2061,51 +3036,172 @@ Definition Lists: Mixed Lists: Test 10
!! input
*#;foo :bar
!! result
-<ul><li><ol><li><dl><dt>foo&#160;</dt><dd>bar
-</dd></dl>
-</li></ol>
-</li></ul>
+<ul>
+<li><ol>
+<li><dl>
+<dt>foo&#160;</dt>
+<dd>bar
+</dd>
+</dl>
+</li>
+</ol>
+</li>
+</ul>
!! end
+# The Parsoid team disagrees with the PHP parser's seemingly-random
+# rules regarding dd/dt on the next two tests. Parsoid is more
+# consistent, and recognizes the shared nesting and keeps the
+# still-open tags around until the nesting is complete.
!! test
-Definition Lists: Mixed Lists: Test 11
+Definition Lists: Mixed Lists: Test 11 (php)
+!! options
+php
!! input
*#*#;*;;foo :bar
*#*#;boo :baz
!! result
-<ul><li><ol><li><ul><li><ol><li><dl><dt>foo&#160;</dt><dd><ul><li><dl><dt><dl><dt>bar
-</dt></dl>
-</dd></dl>
-</li></ul>
-</dd></dl>
-<dl><dt>boo&#160;</dt><dd>baz
-</dd></dl>
-</li></ol>
-</li></ul>
-</li></ol>
-</li></ul>
+<ul>
+<li><ol>
+<li><ul>
+<li><ol>
+<li><dl>
+<dt>foo&#160;</dt>
+<dd><ul>
+<li><dl>
+<dt><dl>
+<dt>bar
+</dt>
+</dl>
+</dd>
+</dl>
+</li>
+</ul>
+</dd>
+</dl>
+<dl>
+<dt>boo&#160;</dt>
+<dd>baz
+</dd>
+</dl>
+</li>
+</ol>
+</li>
+</ul>
+</li>
+</ol>
+</li>
+</ul>
!! end
+!! test
+Definition Lists: Mixed Lists: Test 11 (parsoid)
+!! options
+parsoid
+!! input
+*#*#;*;;foo :bar
+*#*#;boo :baz
+!! result
+<ul>
+<li>
+<ol>
+<li>
+<ul>
+<li>
+<ol>
+<li>
+<dl>
+<dt>
+<ul>
+<li>
+<dl>
+<dt>
+<dl>
+<dt>foo<span typeof="mw:Placeholder" data-parsoid='{"src":" "}'>&nbsp;</span></dt>
+<dd data-parsoid='{"stx":"row"}'>bar</dd>
+</dl></dt>
+</dl></li>
+</ul></dt>
+<dt>boo<span typeof="mw:Placeholder" data-parsoid='{"src":" "}'>&nbsp;</span></dt>
+<dd data-parsoid='{"stx":"row"}'>baz</dd>
+</dl></li>
+</ol></li>
+</ul></li>
+</ol></li>
+</ul>
+!! end
!! test
-Definition Lists: Weird Ones: Test 1
+Definition Lists: Weird Ones: Test 1 (php)
+!! options
+php
!! input
*#;*::;; foo : bar (who uses this?)
!! result
-<ul><li><ol><li><dl><dt> foo&#160;</dt><dd><ul><li><dl><dd><dl><dd><dl><dt><dl><dt> bar (who uses this?)
-</dt></dl>
-</dd></dl>
-</dd></dl>
-</dd></dl>
-</li></ul>
-</dd></dl>
-</li></ol>
-</li></ul>
+<ul>
+<li><ol>
+<li><dl>
+<dt> foo&#160;</dt>
+<dd><ul>
+<li><dl>
+<dd><dl>
+<dd><dl>
+<dt><dl>
+<dt> bar (who uses this?)
+</dt>
+</dl>
+</dd>
+</dl>
+</dd>
+</dl>
+</dd>
+</dl>
+</li>
+</ul>
+</dd>
+</dl>
+</li>
+</ol>
+</li>
+</ul>
!! end
+!! test
+Definition Lists: Weird Ones: Test 1 (parsoid)
+!! options
+parsoid
+!! input
+*#;*::;; foo : bar (who uses this?)
+!! result
+<ul>
+<li>
+<ol>
+<li>
+<dl>
+<dt>
+<ul>
+<li>
+<dl>
+<dd>
+<dl>
+<dd>
+<dl>
+<dt>
+<dl>
+<dt> foo<span typeof="mw:Placeholder" data-parsoid='{"src":" "}'>&nbsp;</span></dt>
+<dd data-parsoid='{"stx":"row"}'> bar (who uses this?)</dd>
+</dl></dt>
+</dl></dd>
+</dl></dd>
+</dl></li>
+</ul></dt>
+</dl></li>
+</ol></li>
+</ul>
+!! end
###
### External links
@@ -2270,6 +3366,17 @@ External image from https: https://meta.wikimedia.org/upload/f/f1/Ncwikicol.png
!! end
!! test
+External image (when not allowed)
+!! options
+wgAllowExternalImages=0
+!! input
+External image: http://meta.wikimedia.org/upload/f/f1/Ncwikicol.png
+!! result
+<p>External image: <a rel="nofollow" class="external free" href="http://meta.wikimedia.org/upload/f/f1/Ncwikicol.png">http://meta.wikimedia.org/upload/f/f1/Ncwikicol.png</a>
+</p>
+!! end
+
+!! test
Link to non-http image, no img tag
!! input
Link to non-http image, no img tag: ftp://example.com/test.jpg
@@ -2692,6 +3799,15 @@ External link containing double-single-quotes with no space separating the url f
!! end
!! test
+External link with comments in link text
+!! input
+[http://www.google.com Google <!-- comment -->]
+!! result
+<p><a rel="nofollow" class="external text" href="http://www.google.com">Google </a>
+</p>
+!! end
+
+!! test
URL-encoding in URL functions (single parameter)
!! input
{{localurl:Some page|amp=&}}
@@ -2763,6 +3879,28 @@ Non-extlinks in brackets
</p>
!! end
+!! test
+Parsoid: Percent encoding in external links
+!! options
+parsoid
+!! input
+[https://github.com/search?l=&q=ResourceLoader+%40wikimedia Search]
+!! result
+<p><a rel="mw:ExtLink"
+href="https://github.com/search?l=&amp;q=ResourceLoader+%40wikimedia">Search</a></p>
+!! end
+
+!! test
+Parsoid: use url link syntax for links where the content is equal the link
+target
+!! options
+parsoid
+!! input
+http://example.com
+!! result
+<p><a rel="mw:ExtLink" href="http://example.com">http://example.com</a></p>
+!! end
+
###
### Quotes
###
@@ -2781,7 +3919,9 @@ Normal text. '''''Bold italic text.''''' Normal text.
!! test
-Unclosed and unmatched quotes
+Unclosed and unmatched quotes (php)
+!! options
+php
!! input
'''''Bold italic text '''with bold deactivated''' in between.'''''
@@ -2816,6 +3956,47 @@ Plain ''italic'''s plain
</p><p>Plain <i>italic'</i>s plain
</p>
!! end
+# Parsoid inserts an empty bold tag pair at the end of the line, that the PHP
+# parser strips. The wikitext contains just the first half of the bold
+# quote pair.
+!! test
+Unclosed and unmatched quotes (parsoid)
+!! options
+parsoid
+!! input
+'''''Bold italic text '''with bold deactivated''' in between.'''''
+
+'''''Bold italic text ''with italic deactivated'' in between.'''''
+
+'''Bold text..
+
+..spanning two paragraphs (should not work).'''
+
+'''Bold tag left open
+
+''Italic tag left open
+
+Normal text.
+
+<!-- Unmatching number of opening, closing tags: -->
+'''This year''''s election ''should'' beat '''last year''''s.
+
+''Tom'''s car is bigger than ''Susan'''s.
+
+Plain ''italic'''s plain
+!! result
+<p><i><b>Bold italic text </b>with bold deactivated<b> in between.</b></i>
+</p><p><b><i>Bold italic text </i>with italic deactivated<i> in between.</i></b>
+</p><p><b>Bold text..</b>
+</p><p>..spanning two paragraphs (should not work).<b></b>
+</p><p><b>Bold tag left open</b>
+</p><p><i>Italic tag left open</i>
+</p><p>Normal text.
+</p><p><b>This year'</b>s election <i>should</i> beat <b>last year'</b>s.
+</p><p><i>Tom<b>s car is bigger than </b></i><b>Susan</b>s.
+</p><p>Plain <i>italic'</i>s plain
+</p>
+!! end
###
### Tables
@@ -2824,19 +4005,33 @@ Plain ''italic'''s plain
###
# This should not produce <table></table> as <table><tr><td></td></tr></table>
-# is the bare minimun required by the spec, see:
+# is the bare minimum required by the spec, see:
# http://www.w3.org/TR/xhtml-modularization/dtd_module_defs.html#a_module_Basic_Tables
!! test
-A table with no data.
+A table with no data. (php)
+!! options
+php
+!! input
+{||}
+!! result
+!! end
+# Parsoid team replies: empty table tags are legal in HTML5
+!! test
+A table with no data. (parsoid)
+!! options
+parsoid
!! input
{||}
!! result
+<table></table>
!! end
# A table with nothing but a caption is invalid XHTML, we might want to render
# this as <p>caption</p>
!! test
-A table with nothing but a caption
+A table with nothing but a caption (php)
+!! options
+php
!! input
{|
|+ caption
@@ -2847,6 +4042,18 @@ A table with nothing but a caption
</caption><tr><td></td></tr></table>
!! end
+# Parsoid team replies: table with only a caption is legal in HTML5
+!! test
+A table with nothing but a caption (parsoid)
+!! options
+parsoid
+!! input
+{|
+|+ caption
+|}
+!! result
+<table><caption> caption</caption></table>
+!! end
!! test
A table with caption with default-spaced attributes and a table row
@@ -3243,11 +4450,44 @@ Template-generated table cell attributes and cell content
!! input
{|
|{{table_attribs}}
+| {{table_attribs}}
|}
!! result
<table>
<tr>
<td style="color: red"> Foo
+</td>
+<td style="color: red"> Foo
+</td></tr></table>
+
+!! end
+
+!! test
+Template-generated table cell attributes and cell content (2)
+!! input
+{|
+|align=center {{table_attribs}}
+|}
+!! result
+<table>
+<tr>
+<td align="center" style="color: red"> Foo
+</td></tr></table>
+
+!! end
+
+!! test
+Template-generated table cell attributes and cell content (3)
+!! input
+{|
+|align=center {{table_cells}}
+|}
+!! result
+<table>
+<tr>
+<td align="center" style="color: red"> Foo </td>
+<td> Bar </td>
+<td> Baz
</td></tr></table>
!! end
@@ -3270,21 +4510,40 @@ Table with row followed by newlines and table heading
!! end
+!! test
+Table with empty line following the start tag
+!! input
+{|
+
+|-
+| foo
+|}
+!! result
+<table>
+
+
+<tr>
+<td> foo
+</td></tr></table>
+
+!! end
+
# FIXME: Preserve the attribute properly (with an empty string as value) in
# the PHP parser. Parsoid implements the behavior below.
!! test
Table attributes with empty value
!! options
-disabled
+parsoid
!! input
{|
| style=| hello
|}
!! result
<table>
+<tbody>
<tr>
<td style=""> hello
-</td></tr></table>
+</td></tr></tbody></table>
!! end
@@ -3311,6 +4570,159 @@ Wikitext table with a lot of comments
!! end
+!! test
+Wikitext table with double-line table cell
+!! input
+{|
+|a
+b
+|}
+!! result
+<table>
+<tr>
+<td>a
+<p>b
+</p>
+</td></tr></table>
+
+!! end
+
+!! test
+Table cell with a single comment
+!! input
+{|
+| <!-- c1 -->
+| a
+|}
+!! result
+<table>
+<tr>
+<td>
+</td>
+<td> a
+</td></tr></table>
+
+!! end
+
+# The expected HTML structure in this test is debatable. The PHP parser does
+# not parse this kind of table at all. The main focus for Parsoid is on
+# round-tripping, so this output is ok for now. TODO: revisit!
+!! test
+Wikitext table with html-syntax row (Parsoid)
+!! options
+parsoid
+!! input
+{|
+|-
+<td>foo</td>
+|}
+!! result
+<table>
+<tbody>
+<tr>
+<td>foo</td></tr></tbody></table>
+!! end
+
+!! test
+Implicit <td> after a |-
+(PHP parser relies on Tidy to add the missing <td> tags)
+!! options
+parsoid=wt2html,wt2wt
+!! input
+{|
+|-
+a
+|}
+!! result
+<table>
+<tr><td>a</td></tr>
+</table>
+!! end
+
+!! test
+Pres should be recognized in an explicit <td> context, but not in an implicit <td> context
+(PHP parser relies on Tidy to add the missing <td> tags)
+!! options
+parsoid=wt2html,wt2wt
+!! input
+{|
+|-
+|
+ a
+|-
+ b
+|}
+!! result
+<table>
+<tbody>
+<tr><td><pre>a</pre></td></tr>
+<tr><td> b</td></tr>
+</tbody>
+</table>
+!! end
+
+!! test
+Lists should be recognized in an implicit <td> context
+(PHP parser relies on Tidy to add the missing <td> tags)
+!! options
+parsoid=wt2html,wt2wt
+!! input
+{|
+|-
+*a
+|}
+!! result
+<table>
+<tr>
+<td><ul>
+<li>a</li>
+</ul></td>
+</tr>
+</table>
+!! end
+
+!! test
+Parsoid: Round-trip tables directly followed by content (bug 51219)
+!! options
+parsoid=wt2html,wt2wt
+!! input
+{|
+|foo
+|} bar
+
+{|
+|baz
+|}<b>quux</b>
+!! result
+<table><tbody>
+<tr>
+<td>foo</td></tr></tbody></table> bar
+<table>
+<tbody>
+<tr>
+<td>baz</td></tr></tbody></table><b>quux</b>
+!! end
+
+!! test
+Parsoid: Default to a newline after tables in new content (bug 51219)
+!! options
+parsoid=html2wt
+!! input
+{|
+|foo
+|}
+<nowiki> </nowiki>bar
+{|
+|baz
+|}
+'''quux'''
+!! result
+<table><tbody>
+<tr><td>foo</td></tr></tbody></table> bar
+<table><tbody>
+<tr><td>baz</td></tr></tbody></table><b>quux</b>
+!! end
+
###
### Internal links
###
@@ -3342,6 +4754,15 @@ Piped link
!! end
!! test
+Piped link with comment in link text
+!! input
+[[Main Page|The Main<!--front--> Page]]
+!! result
+<p><a href="/wiki/Main_Page" title="Main Page">The Main Page</a>
+</p>
+!! end
+
+!! test
Broken link
!! input
[[Zigzagzogzagzig]]
@@ -3462,6 +4883,22 @@ Link to namespaces
</p>
!! end
+!! article
+MemoryAlpha:AlphaTest
+!! text
+This is an article in the MemoryAlpha namespace
+(which shadows the memoryalpha interwiki link).
+!! endarticle
+
+!! test
+Namespace takes precedence over interwiki link (bug 51680)
+!! input
+[[MemoryAlpha:AlphaTest]]
+!! result
+<p><a href="/wiki/MemoryAlpha:AlphaTest" title="MemoryAlpha:AlphaTest">MemoryAlpha:AlphaTest</a>
+</p>
+!! end
+
!! test
Piped link to namespace
!! input
@@ -3527,6 +4964,33 @@ Link containing "<#" and ">#" as a hex sequences
!! end
!! test
+Link containing an equals sign
+!! input
+[[Special:BookSources/isbn=4-00-026157-6]]
+!! result
+<p><a href="/wiki/Special:BookSources/isbn%3D4-00-026157-6" title="Special:BookSources/isbn=4-00-026157-6">Special:BookSources/isbn=4-00-026157-6</a>
+</p>
+!! end
+
+!! article
+Foo~bar
+!! text
+Just a test of an article title containing a tilde.
+!! endarticle
+
+# note that links containing signatures, like [[Foo~~~~]], are
+# massaged by the pre-save transform (PST) and so the tildes are never
+# seen by the parser.
+!! test
+Link containing a tilde
+!! input
+[[Foo~bar]]
+!! result
+<p><a href="/wiki/Foo%7Ebar" title="Foo~bar">Foo~bar</a>
+</p>
+!! end
+
+!! test
Link containing double-single-quotes '' (bug 4598)
!! input
[[Lista d''e paise d''o munno]]
@@ -3787,6 +5251,69 @@ language=kaa
</p>
!! end
+!! article
+Söfnuður
+!! text
+Test.
+!! endarticle
+
+!! test
+Internal link with is link prefix
+!! options
+language=is
+!! input
+Aðrir mótmælenda[[söfnuður|söfnuðir]] og
+!! result
+<p>Aðrir <a href="/wiki/S%C3%B6fnu%C3%B0ur" title="Söfnuður">mótmælendasöfnuðir</a> og
+</p>
+!! end
+
+!! article
+Mótmælendatrú
+!! text
+Test.
+!! endarticle
+
+!! test
+Internal link with is link trail and link prefix
+!! options
+language=is
+!! input
+[[mótmælendatrú|xxx]]ar
+[[mótmælendatrú]]ar
+mótmælenda[[söfnuður]]
+mótmælenda[[söfnuður|söfnuðir]]
+mótmælenda[[söfnuður|söfnuðir]]xxx
+!! result
+<p><a href="/wiki/M%C3%B3tm%C3%A6lendatr%C3%BA" title="Mótmælendatrú">xxxar</a>
+<a href="/wiki/M%C3%B3tm%C3%A6lendatr%C3%BA" title="Mótmælendatrú">mótmælendatrúar</a>
+<a href="/wiki/S%C3%B6fnu%C3%B0ur" title="Söfnuður">mótmælendasöfnuður</a>
+<a href="/wiki/S%C3%B6fnu%C3%B0ur" title="Söfnuður">mótmælendasöfnuðir</a>
+<a href="/wiki/S%C3%B6fnu%C3%B0ur" title="Söfnuður">mótmælendasöfnuðirxxx</a>
+</p>
+!! end
+
+!! test
+Parsoid link trail escaping
+!! options
+parsoid=html2wt,html2html
+!! input
+[[apple]]<nowiki/>s
+!! result
+<p><a rel="mw:WikiLink" href="Apple">apple</a>s</p>
+!! end
+
+!! test
+Parsoid link prefix escaping
+!! options
+language=is
+parsoid=html2wt,html2html
+!! input
+Aðrir mótmælenda<nowiki/>[[söfnuður]]
+!! result
+<p>Aðrir mótmælenda<a rel="mw:WikiLink" href="Söfnuður">söfnuður</a></p>
+!! end
+
!! test
Parsoid-centric test: Whitespace in ext- and wiki-links should be preserved
!! input
@@ -3833,9 +5360,12 @@ Interwiki link encoding conversion (bug 1636)
*[[Wikipedia:ro:Olteni&#0355;a]]
*[[Wikipedia:ro:Olteni&#355;a]]
!! result
-<ul><li><a href="http://en.wikipedia.org/wiki/ro:Olteni%C5%A3a" class="extiw" title="wikipedia:ro:Olteniţa">Wikipedia:ro:Olteni&#355;a</a>
-</li><li><a href="http://en.wikipedia.org/wiki/ro:Olteni%C5%A3a" class="extiw" title="wikipedia:ro:Olteniţa">Wikipedia:ro:Olteni&#355;a</a>
-</li></ul>
+<ul>
+<li><a href="http://en.wikipedia.org/wiki/ro:Olteni%C5%A3a" class="extiw" title="wikipedia:ro:Olteniţa">Wikipedia:ro:Olteni&#355;a</a>
+</li>
+<li><a href="http://en.wikipedia.org/wiki/ro:Olteni%C5%A3a" class="extiw" title="wikipedia:ro:Olteniţa">Wikipedia:ro:Olteni&#355;a</a>
+</li>
+</ul>
!! end
@@ -3848,6 +5378,12 @@ Interwiki link with fragment (bug 2130)
</p>
!! end
+
+###
+### Interlanguage links
+### Language links (so that searching for '### language' matches..)
+###
+
!! test
Interlanguage link
!! input
@@ -3905,6 +5441,189 @@ language=ln
</p>
!! end
+!! test
+Parsoid bug 53221: Wikilinks should be properly entity-escaped
+!! options
+parsoid=html2wt
+!! input
+He&amp;nbsp;llo [[Foo|He&amp;nbsp;llo]]
+
+He&amp;nbsp;llo [[He&amp;nbsp;llo]]
+!!result
+<p>He&amp;nbsp;llo <a href="Foo" rel="mw:WikiLink">He&amp;nbsp;llo</a></p>
+<p>He&amp;nbsp;llo <a href="He&amp;nbsp;llo" rel="mw:WikiLink">He&amp;nbsp;llo</a></p>
+!! end
+
+!! test
+Parsoid: handle constructor well
+!! options
+parsoid
+!! input
+[[constructor]]
+
+[[constructor:foo]]
+!! result
+<p data-parsoid="{&quot;dsr&quot;:[0,15,0,0]}"><a rel="mw:WikiLink" href="./Constructor" data-parsoid="{&quot;stx&quot;:&quot;simple&quot;,&quot;a&quot;:{&quot;href&quot;:&quot;./Constructor&quot;},&quot;sa&quot;:{&quot;href&quot;:&quot;constructor&quot;},&quot;dsr&quot;:[0,15,2,2]}">constructor</a></p>
+
+
+<p data-parsoid="{&quot;dsr&quot;:[17,36,0,0]}"><a rel="mw:WikiLink" href="./Foo" data-parsoid="{&quot;stx&quot;:&quot;simple&quot;,&quot;a&quot;:{&quot;href&quot;:&quot;./Foo&quot;},&quot;sa&quot;:{&quot;href&quot;:&quot;constructor:foo&quot;},&quot;dsr&quot;:[17,36,2,2]}">constructor:foo</a></p>
+!! end
+
+!! test
+Parsoid: recognize interlanguage links without a target page
+!! options
+parsoid
+!! input
+[[ko:]]
+!! result
+<p>
+<link rel="mw:WikiLink/Language" href="http://ko.wikipedia.org/wiki/"></p>
+!! end
+
+!! test
+Parsoid: recognize interwiki links without a target page
+!! options
+parsoid
+!! input
+[[:ko:]]
+!! result
+<p><a rel="mw:WikiLink/Interwiki" href="http://ko.wikipedia.org/wiki/">ko:</a></p>
+!! end
+
+###
+### Redirects, Parsoid-only
+###
+!! test
+Simple redirect to page
+!! options
+parsoid
+!! input
+#REDIRECT [[Main Page]]
+!! result
+<link rel="mw:PageProp/redirect" href="./Main_Page">
+!! end
+
+!! test
+Optional colon in #REDIRECT
+!! options
+# the colon is archaic syntax. we support it for wt2html, but we
+# don't care that it roundtrips back to the modern syntax.
+parsoid=wt2html,html2html
+!! input
+#REDIRECT:[[Main Page]]
+!! result
+<link rel="mw:PageProp/redirect" href="./Main_Page">
+!! end
+
+!! test
+Whitespace in #REDIRECT with optional colon
+!! options
+# the colon and gratuitous whitespace is archaic syntax. we support
+# it for wt2html, but we don't care that it roundtrips back to the
+# modern syntax (without extra whitespace)
+parsoid=wt2html,html2html
+!! input
+
+ #REDIRECT
+:
+[[Main Page]]
+!! result
+<link rel="mw:PageProp/redirect" href="./Main_Page">
+!! end
+
+!! test
+Piped link in #REDIRECT
+!! options
+# content after piped link is ignored. we support this syntax,
+# but don't care that the piped link is lost when we roundtrip this.
+parsoid=wt2html
+!! input
+#REDIRECT [[Main Page|bar]]
+!! result
+<link rel="mw:PageProp/redirect" href="./Main_Page">
+!! end
+
+!! test
+Redirect to category
+!! options
+parsoid=wt2html
+!! input
+#REDIRECT [[Category:Foo]]
+!! result
+<link rel="mw:PageProp/redirect" href="./Category:Foo"><link rel="mw:WikiLink/Category" href="./Category:Foo">
+!! end
+
+!! test
+Redirect to category with URL encoding
+!! options
+parsoid=wt2html
+!! input
+#REDIRECT [[Category%3AFoo]]
+!! result
+<link rel="mw:PageProp/redirect" href="./Category:Foo"><link rel="mw:WikiLink/Category" href="./Category:Foo">
+!! end
+
+!! test
+Redirect to category page
+!! options
+parsoid=wt2html,html2html
+!! input
+#REDIRECT [[:Category:Foo]]
+!! result
+<p><a rel="mw:WikiLink" href="Category:Foo">Category:Foo</a></p>
+!! end
+
+!! test
+Redirect to image page (1)
+!! options
+parsoid
+!! input
+#REDIRECT [[File:Wiki.png]]
+!! result
+<link rel="mw:PageProp/redirect" href="./File:Wiki.png">
+!! end
+
+!! test
+Redirect to image page (2)
+!! options
+parsoid
+!! input
+#REDIRECT [[Image:Wiki.png]]
+!! result
+<link rel="mw:PageProp/redirect" href="./File:Wiki.png">
+!! end
+
+!! test
+Redirect to language
+!! options
+parsoid
+!! input
+#REDIRECT [[en:File:Wiki.png]]
+!! result
+<link rel="mw:PageProp/redirect" href="File:Wiki.png">
+!! end
+
+!! test
+Redirect to interwiki
+!! options
+parsoid
+!! input
+#REDIRECT [[meatball:File:Wiki.png]]
+!! result
+<link rel="mw:PageProp/redirect" href="File:Wiki.png">
+!! end
+
+!! test
+Non-English #REDIRECT
+!! options
+parsoid
+language=is
+!! input
+#TILVÃSUN [[Main Page]]
+!! result
+<link rel="mw:PageProp/redirect" href="./Main_Page">
+!! end
+
##
## XHTML tidiness
###
@@ -3920,6 +5639,8 @@ language=ln
!! test
Broken br tag sanitization
+!! options
+php
!! input
</br>
!! result
@@ -3927,6 +5648,17 @@ Broken br tag sanitization
</p>
!! end
+# TODO: Fix html2html mode (bug 51055)!
+!! test
+Parsoid: Broken br tag recognition
+!! options
+parsoid=wt2html
+!! input
+</br>
+!! result
+<p><br></p>
+!! end
+
!! test
Incorrecly removing closing slashes from correctly formed XHTML
!! input
@@ -4023,7 +5755,7 @@ Horizontal ruler -- eats additional dashes on the same line
!! end
!! test
-Horizontal ruler -- does not collaps dashes on consecutive lines
+Horizontal ruler -- does not collapse dashes on consecutive lines
!! input
----
----
@@ -4061,10 +5793,14 @@ Common list
* item 2
*item 3
!! result
-<ul><li>Common list
-</li><li> item 2
-</li><li>item 3
-</li></ul>
+<ul>
+<li>Common list
+</li>
+<li> item 2
+</li>
+<li>item 3
+</li>
+</ul>
!! end
@@ -4075,10 +5811,14 @@ Numbered list
#item 2
# item 3
!! result
-<ol><li>Numbered list
-</li><li>item 2
-</li><li> item 3
-</li></ol>
+<ol>
+<li>Numbered list
+</li>
+<li>item 2
+</li>
+<li> item 3
+</li>
+</ol>
!! end
@@ -4101,35 +5841,67 @@ Mixed list
*** Level 3
#** Level 3, but ordered
!! result
-<ul><li>Mixed list
-<ol><li> with numbers
-</li></ol>
-<ul><li> and bullets
-</li></ul>
-<ol><li> and numbers
-</li></ol>
-</li><li>bullets again
-<ul><li>bullet level 2
-<ul><li>bullet level 3
-<ol><li>Number on level 4
-</li></ol>
-</li></ul>
-</li><li>bullet level 2
-<ol><li>Number on level 3
-</li><li>Number on level 3
-</li></ol>
-</li></ul>
-<ol><li>number level 2
-</li></ol>
-</li><li>Level 1
-<ul><li><ul><li> Level 3
-</li></ul>
-</li></ul>
-</li></ul>
-<ol><li><ul><li><ul><li> Level 3, but ordered
-</li></ul>
-</li></ul>
-</li></ol>
+<ul>
+<li>Mixed list
+<ol>
+<li> with numbers
+</li>
+</ol>
+<ul>
+<li> and bullets
+</li>
+</ul>
+<ol>
+<li> and numbers
+</li>
+</ol>
+</li>
+<li>bullets again
+<ul>
+<li>bullet level 2
+<ul>
+<li>bullet level 3
+<ol>
+<li>Number on level 4
+</li>
+</ol>
+</li>
+</ul>
+</li>
+<li>bullet level 2
+<ol>
+<li>Number on level 3
+</li>
+<li>Number on level 3
+</li>
+</ol>
+</li>
+</ul>
+<ol>
+<li>number level 2
+</li>
+</ol>
+</li>
+<li>Level 1
+<ul>
+<li><ul>
+<li> Level 3
+</li>
+</ul>
+</li>
+</ul>
+</li>
+</ul>
+<ol>
+<li><ul>
+<li><ul>
+<li> Level 3, but ordered
+</li>
+</ul>
+</li>
+</ul>
+</li>
+</ol>
!! end
@@ -4139,10 +5911,14 @@ Nested lists 1
*foo
**bar
!! result
-<ul><li>foo
-<ul><li>bar
-</li></ul>
-</li></ul>
+<ul>
+<li>foo
+<ul>
+<li>bar
+</li>
+</ul>
+</li>
+</ul>
!! end
@@ -4152,10 +5928,15 @@ Nested lists 2
**foo
*bar
!! result
-<ul><li><ul><li>foo
-</li></ul>
-</li><li>bar
-</li></ul>
+<ul>
+<li><ul>
+<li>foo
+</li>
+</ul>
+</li>
+<li>bar
+</li>
+</ul>
!! end
@@ -4165,10 +5946,14 @@ Nested lists 3 (first element empty)
*
**bar
!! result
-<ul><li>
-<ul><li>bar
-</li></ul>
-</li></ul>
+<ul>
+<li>
+<ul>
+<li>bar
+</li>
+</ul>
+</li>
+</ul>
!! end
@@ -4178,10 +5963,15 @@ Nested lists 4 (first element empty)
**
*bar
!! result
-<ul><li><ul><li>
-</li></ul>
-</li><li>bar
-</li></ul>
+<ul>
+<li><ul>
+<li>
+</li>
+</ul>
+</li>
+<li>bar
+</li>
+</ul>
!! end
@@ -4191,10 +5981,15 @@ Nested lists 5 (both elements empty)
**
*
!! result
-<ul><li><ul><li>
-</li></ul>
-</li><li>
-</li></ul>
+<ul>
+<li><ul>
+<li>
+</li>
+</ul>
+</li>
+<li>
+</li>
+</ul>
!! end
@@ -4204,10 +5999,14 @@ Nested lists 6 (both elements empty)
*
**
!! result
-<ul><li>
-<ul><li>
-</li></ul>
-</li></ul>
+<ul>
+<li>
+<ul>
+<li>
+</li>
+</ul>
+</li>
+</ul>
!! end
@@ -4216,10 +6015,16 @@ Nested lists 7 (skip initial nesting levels)
!! input
*** foo
!! result
-<ul><li><ul><li><ul><li> foo
-</li></ul>
-</li></ul>
-</li></ul>
+<ul>
+<li><ul>
+<li><ul>
+<li> foo
+</li>
+</ul>
+</li>
+</ul>
+</li>
+</ul>
!! end
@@ -4231,13 +6036,21 @@ Nested lists 8 (multiple nesting transitions)
** baz
* boo
!! result
-<ul><li> foo
-<ul><li><ul><li> bar
-</li></ul>
-</li><li> baz
-</li></ul>
-</li><li> boo
-</li></ul>
+<ul>
+<li> foo
+<ul>
+<li><ul>
+<li> bar
+</li>
+</ul>
+</li>
+<li> baz
+</li>
+</ul>
+</li>
+<li> boo
+</li>
+</ul>
!! end
@@ -4248,10 +6061,14 @@ Nested lists 8 (multiple nesting transitions)
*<!--cmt-->bar
<!--cmt-->*baz
!! result
-<ul><li>foo
-</li><li>bar
-</li><li>baz
-</li></ul>
+<ul>
+<li>foo
+</li>
+<li>bar
+</li>
+<li>baz
+</li>
+</ul>
!! end
@@ -4261,34 +6078,268 @@ Nested lists 8 (multiple nesting transitions)
*foo {{echo|bar
}}*baz
!! result
-<ul><li>foo bar
-</li><li>baz
-</li></ul>
+<ul>
+<li>foo bar
+</li>
+<li>baz
+</li>
+</ul>
+
+!! end
+
+!! test
+List items are not parsed correctly following a <pre> block (bug 785)
+!! input
+* <pre>foo</pre>
+* <pre>bar</pre>
+* zar
+!! result
+<ul>
+<li> <pre>foo</pre>
+</li>
+<li> <pre>bar</pre>
+</li>
+<li> zar
+</li>
+</ul>
+
+!! end
+
+!! test
+List items from template
+!! input
+
+{{inner list}}
+* item 2
+
+* item 0
+{{inner list}}
+* item 2
+
+* item 0
+* notSOL{{inner list}}
+* item 2
+!! result
+<ul>
+<li> item 1
+</li>
+<li> item 2
+</li>
+</ul>
+<ul>
+<li> item 0
+</li>
+<li> item 1
+</li>
+<li> item 2
+</li>
+</ul>
+<ul>
+<li> item 0
+</li>
+<li> notSOL
+</li>
+<li> item 1
+</li>
+<li> item 2
+</li>
+</ul>
+
+!! end
+
+!! test
+List interrupted by empty line or heading
+!! input
+* foo
+
+** bar
+== A heading ==
+* Another list item
+!! result
+<ul>
+<li> foo
+</li>
+</ul>
+<ul>
+<li><ul>
+<li> bar
+</li>
+</ul>
+</li>
+</ul>
+<h2><span class="mw-headline" id="A_heading">A heading</span><span class="mw-editsection"><span class="mw-editsection-bracket">[</span><a href="/index.php?title=Parser_test&amp;action=edit&amp;section=1" title="Edit section: A heading">edit</a><span class="mw-editsection-bracket">]</span></span></h2>
+<ul>
+<li> Another list item
+</li>
+</ul>
+
+!!end
+
+!!test
+Multiple list tags generated by templates
+!!input
+{{echo|<li>}}a
+{{echo|<li>}}b
+{{echo|<li>}}c
+!!result
+<li>a
+<li>b
+<li>c</li>
+</li>
+</li>
+
+!!end
+
+!!test
+Single-comment whitespace lines dont break lists, and neither do multi-comment whitespace lines
+!!input
+*a
+<!--This line will NOT split the list-->
+*b
+ <!--This line will NOT split the list either-->
+*c
+ <!--foo--> <!----> <!--This line NOT split the list either-->
+*d
+!!result
+<ul>
+<li>a
+</li>
+<li>b
+</li>
+<li>c
+</li>
+<li>d
+</li>
+</ul>
+
+!!end
+
+!!test
+Replacing whitespace with tabs still doesn't break the list (gerrit 78327)
+!!input
+*a
+<!--This line will NOT split the list-->
+*b
+ <!--This line will NOT split the list either-->
+*c
+ <!--foo--> <!----> <!--This line NOT split the list
+ either-->
+*d
+!!result
+<ul>
+<li>a
+</li>
+<li>b
+</li>
+<li>c
+</li>
+<li>d
+</li>
+</ul>
+!!end
+
+!!test
+Test the li-hack
+(Cannot test this with PHP parser since it relies on Tidy for the hack)
+!!options
+parsoid=wt2html,wt2wt
+!!input
+* foo
+* <li>li-hack
+* {{echo|<li>templated li-hack}}
+* <!--foo--> <li> unsupported li-hack with preceding comments
+
+<ul>
+<li><li>not a li-hack
+</li>
+</ul>
+!!result
+<ul>
+<li> foo</li>
+<li>li-hack</li>
+<li about="#mwt1" typeof="mw:Transclusion" data-mw='{"parts":[{"template":{"target":{"wt":"echo","href":"./Template:Echo"},"params":{"1":{"wt":"<li>templated li-hack"}}}}]}'>templated li-hack</li>
+<li> <!--foo--> </li>
+<li> li-hack with preceding comments</li>
+</ul>
+
+<ul>
+<li></li>
+<li>not a li-hack
+</li>
+</ul>
+!!end
+
+!! test
+Parsoid: Make sure nested lists are serialized on their own line even if HTML contains no newlines
+!! options
+parsoid
+!! input
+# foo
+## bar
+* foo
+** bar
+: foo
+:: bar
+!! result
+<ol>
+<li> foo<ol>
+<li> bar</li>
+</ol></li>
+</ol><ul>
+<li> foo<ul>
+<li> bar</li>
+</ul></li>
+</ul><dl>
+<dd> foo<dl>
+<dd> bar</dd>
+</dl></dd>
+</dl>
!! end
!! test
+Parsoid: Test of whitespace serialization with Templated bullets
+!! options
+parsoid
+!! input
+* {{bullet}}
+!! result
+<ul>
+<li> </li><li about="#mwt1" typeof="mw:Transclusion" data-mw='{"parts":[{"template":{"target":{"wt":"bullet","href":"./Template:Bullet"},"params":{},"i":0}}]}'> Bar</li>
+</ul>
+!! end
+
+# ------------------------------------------------------------------------
+# The next set of tests are about Parsoid's ability to handle badly nested
+# tags (parse, minimize scope of fixup, and roundtrip back)
+# ------------------------------------------------------------------------
+
+!! test
Unbalanced closing block tags break a list
-(Disabled since php parser generates broken html -- relies on Tidy to fix up)
+(Parsoid-only since php parser generates broken html -- relies on Tidy to fix up)
!! options
-disabled
+parsoid
!! input
<div>
*a</div><div>
*b</div>
!! result
<div>
-<ul><li>a
-</li></ul></div><div>
-<ul><li>b
-</li></ul></div>
+<ul>
+<li>a
+</li>
+</ul></div><div>
+<ul>
+<li>b
+</li>
+</ul></div>
!! end
!! test
Unbalanced closing non-block tags don't break a list
-(Disabled since php parser generates broken html -- relies on Tidy to fix up)
+(Parsoid-only since php parser generates broken html -- relies on Tidy to fix up)
!! options
-disabled
+parsoid
!! input
<span>
*a</span><span>
@@ -4296,23 +6347,29 @@ disabled
!! result
<p><span></span>
</p>
-<ul><li>a<span></span>
-</li><li>b
-</li></ul>
+<ul>
+<li>a<span></span>
+</li>
+<li>b
+</li>
+</ul>
!! end
!! test
Unclosed formatting tags that straddle lists are closed and reopened
-(Disabled since php parser generates broken html -- relies on Tidy to fix up)
+(Parsoid-only since php parser generates broken html -- relies on Tidy to fix up)
!! options
-disabled
+parsoid
!! input
# <s> a
# b </s>
!! result
-<ol><li> <s> a </s>
-</li><li> <s> b </s>
-</li></ol>
+<ol>
+<li> <s> a </s>
+</li>
+<li> <s> b </s>
+</li>
+</ol>
!! end
!!test
@@ -4335,88 +6392,31 @@ parsoid
!!end
!! test
-List items are not parsed correctly following a <pre> block (bug 785)
-!! input
-* <pre>foo</pre>
-* <pre>bar</pre>
-* zar
-!! result
-<ul><li> <pre>foo</pre>
-</li><li> <pre>bar</pre>
-</li><li> zar
-</li></ul>
-
-!! end
-
-!! test
-List items from template
+Table with missing opening <tr> tag
+!! options
+parsoid=wt2html,wt2wt
!! input
-
-{{inner list}}
-* item 2
-
-* item 0
-{{inner list}}
-* item 2
-
-* item 0
-* notSOL{{inner list}}
-* item 2
+<table>
+<td>foo</td>
+</tr>
+</table>
!! result
-<ul><li> item 1
-</li><li> item 2
-</li></ul>
-<ul><li> item 0
-</li><li> item 1
-</li><li> item 2
-</li></ul>
-<ul><li> item 0
-</li><li> notSOL
-</li><li> item 1
-</li><li> item 2
-</li></ul>
-
+<table>
+<tr>
+<td>foo</td>
+</tr>
+</table>
!! end
-!! test
-List interrupted by empty line or heading
-!! input
-* foo
-
-** bar
-== A heading ==
-* Another list item
-!! result
-<ul><li> foo
-</li></ul>
-<ul><li><ul><li> bar
-</li></ul>
-</li></ul>
-<h2><span class="editsection">[<a href="/index.php?title=Parser_test&amp;action=edit&amp;section=1" title="Edit section: A heading">edit</a>]</span> <span class="mw-headline" id="A_heading"> A heading </span></h2>
-<ul><li> Another list item
-</li></ul>
-
-!!end
-
-!!test
-Multiple list tags generated by templates
-!!input
-{{echo|<li>}}a
-{{echo|<li>}}b
-{{echo|<li>}}c
-!!result
-<li>a
-<li>b
-<li>c</li>
-</li>
-</li>
-
-!!end
-
###
### Magic Words
###
+# Note that the current date is hard-coded as
+# 1970-01-01T00:02:03Z (a Thursday)
+# when running parser tests. The timezone is also fixed to GMT, so
+# local date will be identical to current date.
+
!! test
Magic Word: {{CURRENTDAY}}
!! input
@@ -4463,6 +6463,15 @@ Magic Word: {{CURRENTMONTH}}
!! end
!! test
+Magic Word: {{CURRENTMONTH1}}
+!! input
+{{CURRENTMONTH1}}
+!! result
+<p>1
+</p>
+!! end
+
+!! test
Magic Word: {{CURRENTMONTHABBREV}}
!! input
{{CURRENTMONTHABBREV}}
@@ -4499,6 +6508,15 @@ Magic Word: {{CURRENTTIME}}
!! end
!! test
+Magic Word: {{CURRENTHOUR}}
+!! input
+{{CURRENTHOUR}}
+!! result
+<p>00
+</p>
+!! end
+
+!! test
Magic Word: {{CURRENTWEEK}} (@bug 4594)
!! input
{{CURRENTWEEK}}
@@ -4517,6 +6535,66 @@ Magic Word: {{CURRENTYEAR}}
!! end
!! test
+Magic Word: {{CURRENTTIMESTAMP}}
+!! input
+{{CURRENTTIMESTAMP}}
+!! result
+<p>19700101000203
+</p>
+!! end
+
+!! test
+Magic Words LOCAL (UTC)
+!! input
+* {{LOCALMONTH}}
+* {{LOCALMONTH1}}
+* {{LOCALMONTHNAME}}
+* {{LOCALMONTHNAMEGEN}}
+* {{LOCALMONTHABBREV}}
+* {{LOCALDAY}}
+* {{LOCALDAY2}}
+* {{LOCALDAYNAME}}
+* {{LOCALYEAR}}
+* {{LOCALTIME}}
+* {{LOCALHOUR}}
+* {{LOCALWEEK}}
+* {{LOCALDOW}}
+* {{LOCALTIMESTAMP}}
+!! result
+<ul>
+<li> 01
+</li>
+<li> 1
+</li>
+<li> January
+</li>
+<li> January
+</li>
+<li> Jan
+</li>
+<li> 1
+</li>
+<li> 01
+</li>
+<li> Thursday
+</li>
+<li> 1970
+</li>
+<li> 00:02
+</li>
+<li> 00
+</li>
+<li> 1
+</li>
+<li> 4
+</li>
+<li> 19700101000203
+</li>
+</ul>
+
+!! end
+
+!! test
Magic Word: {{FULLPAGENAME}}
!! options
title=[[User:Ævar Arnfjörð Bjarmason]]
@@ -4539,6 +6617,93 @@ title=[[User:Ævar Arnfjörð Bjarmason]]
!! end
!! test
+Magic Word: {{TALKSPACE}}
+!! options
+title=[[User:Ævar Arnfjörð Bjarmason]]
+!! input
+{{TALKSPACE}}
+!! result
+<p>User talk
+</p>
+!! end
+
+!! test
+Magic Word: {{TALKSPACE}}, same namespace
+!! options
+title=[[User talk:Ævar Arnfjörð Bjarmason]]
+!! input
+{{TALKSPACE}}
+!! result
+<p>User talk
+</p>
+!! end
+
+!! test
+Magic Word: {{TALKSPACE}}, main namespace
+!! options
+title=[[Parser Test]]
+!! input
+{{TALKSPACE}}
+!! result
+<p>Talk
+</p>
+!! end
+
+!! test
+Magic Word: {{TALKSPACEE}}
+!! options
+title=[[User:Ævar Arnfjörð Bjarmason]]
+!! input
+{{TALKSPACEE}}
+!! result
+<p>User_talk
+</p>
+!! end
+
+!! test
+Magic Word: {{SUBJECTSPACE}}
+!! options
+title=[[User talk:Ævar Arnfjörð Bjarmason]]
+!! input
+{{SUBJECTSPACE}}
+!! result
+<p>User
+</p>
+!! end
+
+!! test
+Magic Word: {{SUBJECTSPACE}}, same namespace
+!! options
+title=[[User:Ævar Arnfjörð Bjarmason]]
+!! input
+{{SUBJECTSPACE}}
+!! result
+<p>User
+</p>
+!! end
+
+!! test
+Magic Word: {{SUBJECTSPACE}}, main namespace
+!! options
+title=[[Parser Test]]
+!! input
+{{SUBJECTSPACE}}
+!! result
+
+!! end
+
+!! test
+Magic Word: {{SUBJECTSPACEE}}
+!! options
+title=[[User talk:Ævar Arnfjörð Bjarmason]]
+!! input
+{{SUBJECTSPACEE}}
+!! result
+<p>User
+</p>
+!! end
+
+!! test
Magic Word: {{NAMESPACE}}
!! options
title=[[User:Ævar Arnfjörð Bjarmason]]
@@ -4572,11 +6737,121 @@ title=[[User:Ævar Arnfjörð Bjarmason]]
!! end
!! test
+Magic Word: {{SUBPAGENAME}}
+!! options
+title=[[Ævar Arnfjörð Bjarmason/sub ö]] subpage
+!! input
+{{SUBPAGENAME}}
+!! result
+<p>sub ö
+</p>
+!! end
+
+!! test
+Magic Word: {{SUBPAGENAMEE}}
+!! options
+title=[[Ævar Arnfjörð Bjarmason/sub ö]] subpage
+!! input
+{{SUBPAGENAMEE}}
+!! result
+<p>sub_%C3%B6
+</p>
+!! end
+
+!! test
+Magic Word: {{ROOTPAGENAME}}
+!! options
+title=[[Ævar Arnfjörð Bjarmason/sub/sub2]] subpage
+!! input
+{{ROOTPAGENAME}}
+!! result
+<p>Ævar Arnfjörð Bjarmason
+</p>
+!! end
+
+!! test
+Magic Word: {{ROOTPAGENAMEE}}
+!! options
+title=[[Ævar Arnfjörð Bjarmason/sub/sub2]] subpage
+!! input
+{{ROOTPAGENAMEE}}
+!! result
+<p>%C3%86var_Arnfj%C3%B6r%C3%B0_Bjarmason
+</p>
+!! end
+
+!! test
+Magic Word: {{BASEPAGENAME}}
+!! options
+title=[[Ævar Arnfjörð Bjarmason/sub]] subpage
+!! input
+{{BASEPAGENAME}}
+!! result
+<p>Ævar Arnfjörð Bjarmason
+</p>
+!! end
+
+!! test
+Magic Word: {{BASEPAGENAMEE}}
+!! options
+title=[[Ævar Arnfjörð Bjarmason/sub]] subpage
+!! input
+{{BASEPAGENAMEE}}
+!! result
+<p>%C3%86var_Arnfj%C3%B6r%C3%B0_Bjarmason
+</p>
+!! end
+
+!! test
+Magic Word: {{TALKPAGENAME}}
+!! options
+title=[[User:Ævar Arnfjörð Bjarmason]]
+!! input
+{{TALKPAGENAME}}
+!! result
+<p>User talk:Ævar Arnfjörð Bjarmason
+</p>
+!! end
+
+!! test
+Magic Word: {{TALKPAGENAMEE}}
+!! options
+title=[[User:Ævar Arnfjörð Bjarmason]]
+!! input
+{{TALKPAGENAMEE}}
+!! result
+<p>User_talk:%C3%86var_Arnfj%C3%B6r%C3%B0_Bjarmason
+</p>
+!! end
+
+!! test
+Magic Word: {{SUBJECTPAGENAME}}
+!! options
+title=[[User talk:Ævar Arnfjörð Bjarmason]]
+!! input
+{{SUBJECTPAGENAME}}
+!! result
+<p>User:Ævar Arnfjörð Bjarmason
+</p>
+!! end
+
+!! test
+Magic Word: {{SUBJECTPAGENAMEE}}
+!! options
+title=[[User talk:Ævar Arnfjörð Bjarmason]]
+!! input
+{{SUBJECTPAGENAMEE}}
+!! result
+<p>User:%C3%86var_Arnfj%C3%B6r%C3%B0_Bjarmason
+</p>
+!! end
+
+!! test
Magic Word: {{NUMBEROFFILES}}
!! input
{{NUMBEROFFILES}}
!! result
-<p>2
+<p>4
</p>
!! end
@@ -4654,6 +6929,15 @@ Magic Word: {{SCRIPTPATH}}
!! end
!! test
+Magic Word: {{STYLEPATH}}
+!! input
+{{STYLEPATH}}
+!! result
+<p>/skins
+</p>
+!! end
+
+!! test
Magic Word: {{SERVER}}
!! input
{{SERVER}}
@@ -4681,6 +6965,36 @@ Magic Word: {{SITENAME}}
!! end
!! test
+Case-sensitive magic words, when cased differently, should just be template transclusions
+!! input
+{{CurrentMonth}}
+{{currentday}}
+{{cURreNTweEK}}
+{{currentHour}}
+!! result
+<p><a href="/index.php?title=Template:CurrentMonth&amp;action=edit&amp;redlink=1" class="new" title="Template:CurrentMonth (page does not exist)">Template:CurrentMonth</a>
+<a href="/index.php?title=Template:Currentday&amp;action=edit&amp;redlink=1" class="new" title="Template:Currentday (page does not exist)">Template:Currentday</a>
+<a href="/index.php?title=Template:CURreNTweEK&amp;action=edit&amp;redlink=1" class="new" title="Template:CURreNTweEK (page does not exist)">Template:CURreNTweEK</a>
+<a href="/index.php?title=Template:CurrentHour&amp;action=edit&amp;redlink=1" class="new" title="Template:CurrentHour (page does not exist)">Template:CurrentHour</a>
+</p>
+!! end
+
+!! test
+Case-insensitive magic words should still work with weird casing.
+!! input
+{{sErVeRNaMe}}
+{{LCFirst:AOEU}}
+{{ucFIRST:aoeu}}
+{{SERver}}
+!! result
+<p>example.org
+aOEU
+Aoeu
+<a rel="nofollow" class="external free" href="http://example.org">http://example.org</a>
+</p>
+!! end
+
+!! test
Namespace 1 {{ns:1}}
!! input
{{ns:1}}
@@ -5422,8 +7736,8 @@ Bug 6563: Edit link generation for section shown by <includeonly>
!! input
{{includeonly section}}
!! result
-<h2><span class="editsection">[<a href="/index.php?title=Template:Includeonly_section&amp;action=edit&amp;section=T-1" title="Template:Includeonly section">edit</a>]</span> <span class="mw-headline" id="Includeonly_section">Includeonly section</span></h2>
-<h2><span class="editsection">[<a href="/index.php?title=Template:Includeonly_section&amp;action=edit&amp;section=T-2" title="Template:Includeonly section">edit</a>]</span> <span class="mw-headline" id="Section_T-1">Section T-1</span></h2>
+<h2><span class="mw-headline" id="Includeonly_section">Includeonly section</span><span class="mw-editsection"><span class="mw-editsection-bracket">[</span><a href="/index.php?title=Template:Includeonly_section&amp;action=edit&amp;section=T-1" title="Template:Includeonly section">edit</a><span class="mw-editsection-bracket">]</span></span></h2>
+<h2><span class="mw-headline" id="Section_T-1">Section T-1</span><span class="mw-editsection"><span class="mw-editsection-bracket">[</span><a href="/index.php?title=Template:Includeonly_section&amp;action=edit&amp;section=T-2" title="Template:Includeonly section">edit</a><span class="mw-editsection-bracket">]</span></span></h2>
!! end
@@ -5449,7 +7763,7 @@ Bug 6563: Edit link generation for section suppressed by <includeonly>
</includeonly>
==Section 1==
!! result
-<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>
+<h2><span class="mw-headline" id="Section_1">Section 1</span><span class="mw-editsection"><span class="mw-editsection-bracket">[</span><a href="/index.php?title=Parser_test&amp;action=edit&amp;section=1" title="Edit section: Section 1">edit</a><span class="mw-editsection-bracket">]</span></span></h2>
!! end
@@ -5473,6 +7787,77 @@ Un-closed <includeonly>
!! result
!! end
+# TODO: test with DOM fragment reuse!
+!! test
+Parsoid: DOM fragment reuse
+!! options
+parsoid=wt2wt,wt2html
+!! input
+a{{echo|b<table></table>c}}d
+
+a{{echo|b
+<table></table>
+c}}d
+
+{{echo|a
+
+<table></table>
+
+b}}
+!! result
+a<span about="#mwt1" typeof="mw:Transclusion" data-mw='{"parts":[{"template":{"target":{"wt":"echo","href":"./Template:Echo"},"params":{"1":{"wt":"b
+<table></table>c"}},"i":0}}]}'>b</span>
+<table about="#mwt1"></table><span about="#mwt1">c</span>d
+
+
+<p about="#mwt2" typeof="mw:Transclusion" data-mw='{"parts":["a",{"template":{"target":{"wt":"echo","href":"./Template:Echo"},"params":{"1":{"wt":"b\n<table></table>\nc"}},"i":0}},"d"]}'>ab</p><span about="#mwt2">
+</span>
+<table about="#mwt2"></table><span about="#mwt2">
+</span>
+<p about="#mwt2">cd</p>
+
+
+<p about="#mwt3" typeof="mw:Transclusion" data-mw='{"parts":[{"template":{"target":{"wt":"echo","href":"./Template:Echo"},"params":{"1":{"wt":"a\n\n<table></table>\n\nb"}},"i":0}}]}'>a</p><span about="#mwt3">
+
+</span>
+<table about="#mwt3"></table><span about="#mwt3">
+
+</span>
+<p about="#mwt3">b</p>
+!! end
+
+!! test
+Parsoid: Merge double tds (bug 50603)
+!! options
+parsoid
+!! input
+{|
+|{{echo|{{!}} foo}}
+|}
+!! result
+<table><tbody>
+<tr><td about="#mwt1" typeof="mw:Transclusion" data-mw='{"parts":["|",{"template":{"target":{"wt":"echo","href":"./Template:Echo"},"params":{"1":{"wt":"{{!}} foo"}},"i":0}}]}'> foo</td></tr>
+</tbody></table>
+!! end
+
+!! test
+Parsoid: Merge double tds in nested transclusion content (bug 50603)
+!! options
+parsoid
+!! input
+{{echo|<div>}}
+{|
+|{{echo|{{!}} foo}}
+|}
+{{echo|</div>}}
+!! result
+<div about="#mwt1" typeof="mw:Transclusion" data-mw='{"parts":[{"template":{"target":{"wt":"echo","href":"./Template:Echo"},"params":{"1":{"wt":"<div>"}},"i":0}},"\n{|\n|",{"template":{"target":{"wt":"echo","href":"./Template:Echo"},"params":{"1":{"wt":"{{!}} foo"}},"i":1}},"\n|}\n",{"template":{"target":{"wt":"echo","href":"./Template:Echo"},"params":{"1":{"wt":"</div>"}},"i":2}}]}'>
+<table><tbody>
+<tr><td data-mw='{"parts":["|"]}'> foo</td></tr>
+</tbody></table>
+</div>
+!! end
+
###
### <includeonly> and <noinclude> in attributes
###
@@ -5569,8 +7954,10 @@ Templates: 1. Simple use
Templates: 2. Inside a block tag
!!input
<div>{{echo|Foo}}</div>
+<blockquote>{{echo|Foo}}</blockquote>
!!result
<div>Foo</div>
+<blockquote>Foo</blockquote>
!!end
@@ -5612,6 +7999,19 @@ bar <div>baz</div>
!!end
!!test
+Templates: P-wrapping: 1d. Template preceded by comment-only line
+!!options
+parsoid
+!!input
+<!-- foo -->
+{{echo|Bar}}
+!!result
+<!-- foo -->
+
+<p about="#mwt223" typeof="mw:Transclusion" data-mw='{"parts":[{"template":{"target":{"wt":"echo","href":"./Template:Echo"},"params":{"1":{"wt":"Bar"}},"i":0}}]}'>Bar</p>
+!!end
+
+!!test
Templates: Inline Text: 1. Multiple tmeplate uses
!!input
{{echo|Foo}}bar{{echo|baz}}
@@ -5771,6 +8171,15 @@ Templates: HTML Tag: 6. Generation of end piece of HTML attr value
!!end
!!test
+Templates: HTML Tag: 7. Generation of partial attribute key string
+!!input
+<div st{{echo|yle}}="color:red;">foo</div>
+!!result
+<div style="color:red;">foo</div>
+
+!!end
+
+!!test
Templates: HTML Tables: 1. Generating start of a HTML table
!!input
{{echo|<table><tr><td>foo</td>}}</tr></table>
@@ -5861,6 +8270,20 @@ Templates: HTML Tables: 4f. Generating a single tag of a HTML table
!!end
!!test
+Templates: HTML Tables: 5. Proper fostering of categories from inside
+!!options
+parsoid=wt2html,wt2wt
+!!input
+<table>[[Category:foo1]]<tr><td>foo</td></tr></table>
+<!--Two categories (Bug 50330)-->
+<table>[[Category:bar1]][[Category:bar2]]<tr><td>foo</td></tr></table>
+!!result
+<link rel="mw:WikiLink/Category" href="./Category:Foo1"><table><tbody><tr><td>foo</td></tr></tbody></table>
+<!--Two categories (Bug 50330)-->
+<link rel="mw:WikiLink/Category" href="./Category:Bar1"><link rel="mw:WikiLink/Category" href="./Category:Bar2"><table><tbody><tr><td>foo</td></tr></tbody></table>
+!!end
+
+!!test
Templates: Wiki Tables: 1a. Fostering of entire template content
!!input
{|
@@ -5967,9 +8390,12 @@ unused}}}}
*{{echo|b {{nonexistent|
unused}}}}
!!result
-<ul><li>a <a href="/index.php?title=Template:Nonexistent&amp;action=edit&amp;redlink=1" class="new" title="Template:Nonexistent (page does not exist)">Template:Nonexistent</a>
-</li><li>b <a href="/index.php?title=Template:Nonexistent&amp;action=edit&amp;redlink=1" class="new" title="Template:Nonexistent (page does not exist)">Template:Nonexistent</a>
-</li></ul>
+<ul>
+<li>a <a href="/index.php?title=Template:Nonexistent&amp;action=edit&amp;redlink=1" class="new" title="Template:Nonexistent (page does not exist)">Template:Nonexistent</a>
+</li>
+<li>b <a href="/index.php?title=Template:Nonexistent&amp;action=edit&amp;redlink=1" class="new" title="Template:Nonexistent (page does not exist)">Template:Nonexistent</a>
+</li>
+</ul>
!!end
@@ -5986,24 +8412,24 @@ Templates: Ugly nesting: 1. Quotes opened/closed across templates (echo)
Templates: Ugly nesting: 2. Quotes opened/closed across templates (echo_with_span)
(PHP parser generates misnested html)
!! options
-disabled
+parsoid
!!input
{{echo_with_span|''a}}{{echo_with_span|b''c''d}}{{echo_with_span|''e}}
!!result
-<p><span><i>a</i></span><i><span>b</span></i><span>c</span><i>d</i><span>e</span></p>
+<p><span about="#mwt1" typeof="mw:Transclusion" data-mw="{&quot;parts&quot;:[{&quot;template&quot;:{&quot;target&quot;:{&quot;wt&quot;:&quot;echo_with_span&quot;,&quot;href&quot;:&quot;./Template:Echo_with_span&quot;},&quot;params&quot;:{&quot;1&quot;:{&quot;wt&quot;:&quot;''a&quot;}},&quot;i&quot;:0}}]}"><i>a</i></span><i about="#mwt2" typeof="mw:Transclusion" data-mw="{&quot;parts&quot;:[{&quot;template&quot;:{&quot;target&quot;:{&quot;wt&quot;:&quot;echo_with_span&quot;,&quot;href&quot;:&quot;./Template:Echo_with_span&quot;},&quot;params&quot;:{&quot;1&quot;:{&quot;wt&quot;:&quot;b''c''d&quot;}},&quot;i&quot;:0}},{&quot;template&quot;:{&quot;target&quot;:{&quot;wt&quot;:&quot;echo_with_span&quot;,&quot;href&quot;:&quot;./Template:Echo_with_span&quot;},&quot;params&quot;:{&quot;1&quot;:{&quot;wt&quot;:&quot;''e&quot;}},&quot;i&quot;:1}}]}"><span>b</span></i><span about="#mwt2">c</span><i about="#mwt2">d<span></span></i><span about="#mwt2">e</span></p>
!!end
!!test
Templates: Ugly nesting: 3. Quotes opened/closed across templates (echo_with_div)
-(PHP parser generates misnested html)
+(PHP parser generates misnested html; Parsoid html2wt mode adds newlines between {{echo}}s)
!! options
-disabled
+parsoid=wt2html,wt2wt
!!input
{{echo_with_div|''a}}{{echo_with_div|b''c''d}}{{echo_with_div|''e}}
!!result
-<div><i>a</i></div>
-<div><i>b</i>c<i>d</i></div>
-<div>e</div>
+<div about="#mwt1" typeof="mw:Transclusion" data-mw="{&quot;parts&quot;:[{&quot;template&quot;:{&quot;target&quot;:{&quot;wt&quot;:&quot;echo_with_div&quot;,&quot;href&quot;:&quot;./Template:Echo_with_div&quot;},&quot;params&quot;:{&quot;1&quot;:{&quot;wt&quot;:&quot;''a&quot;}},&quot;i&quot;:0}}]}"><i>a</i></div>
+<div about="#mwt2" typeof="mw:Transclusion" data-mw="{&quot;parts&quot;:[{&quot;template&quot;:{&quot;target&quot;:{&quot;wt&quot;:&quot;echo_with_div&quot;,&quot;href&quot;:&quot;./Template:Echo_with_div&quot;},&quot;params&quot;:{&quot;1&quot;:{&quot;wt&quot;:&quot;b''c''d&quot;}},&quot;i&quot;:0}}]}"><i>b</i>c<i>d</i></div>
+<div about="#mwt3" typeof="mw:Transclusion" data-mw="{&quot;parts&quot;:[{&quot;template&quot;:{&quot;target&quot;:{&quot;wt&quot;:&quot;echo_with_div&quot;,&quot;href&quot;:&quot;./Template:Echo_with_div&quot;},&quot;params&quot;:{&quot;1&quot;:{&quot;wt&quot;:&quot;''e&quot;}},&quot;i&quot;:0}}]}">e</div>
!!end
!!test
@@ -6026,9 +8452,12 @@ parsoid
|bar
|}
!!result
-<table about="#mwt1" typeof="mw:Object/Template ">
-<tbody><tr><td>foo</td></tr></tbody></table><span about="#mwt1">
-bar</span><span about="#mwt1">
+<table about="#mwt1" typeof="mw:Transclusion" data-mw='{"parts":["{|\n|",{"template":{"target":{"wt":"echo","href":"./Template:Echo"},"params":{"1":{"wt":"foo</table>"}},"i":0}},"\n|bar\n|}"]}'>
+
+<tbody>
+<tr>
+<td>foo</td></tr></tbody></table><span about="#mwt1">
+</span><span about="#mwt1">bar</span><span about="#mwt1">
</span>
!!end
@@ -6058,24 +8487,24 @@ parsoid
</tr>
</table>
!!result
-<table about="#mwt1" typeof="mw:Object/Template">
- <tbody><tr >
- <td >
- <table >
- <tbody><tr >
- <td >1. foo </td></tr></tbody></table></td>
- <td > bar </td>
- <td >2. baz </td></tr></tbody></table><span about="#mwt1">
- </span><span about="#mwt1">
-
- abc</span><span about="#mwt1">
- </span><span about="#mwt1">
- </span><span about="#mwt1">
- </span><span about="#mwt1">
- </span><span about="#mwt1">
-
- xyz</span><span about="#mwt1">
- </span><span about="#mwt1">
+<table about="#mwt2" typeof="mw:Transclusion" data-mw='{"parts":["<table>\n <tr>\n <td>\n <table>\n <tr>\n <td>1. ",{"template":{"target":{"wt":"echo","href":"./Template:Echo"},"params":{"1":{"wt":"foo </table>"}},"i":0}},"</td>\n <td> bar </td>\n <td>2. ",{"template":{"target":{"wt":"echo","href":"./Template:Echo"},"params":{"1":{"wt":"baz </table>"}},"i":1}},"</td>\n </tr>\n <tr>\n <td>abc</td>\n </tr>\n </table>\n </td>\n </tr>\n <tr>\n <td>xyz</td>\n </tr>\n</table>"]}'>
+ <tbody><tr>
+ <td>
+ <table>
+ <tbody><tr>
+ <td>1. foo </td></tr></tbody></table></td>
+ <td> bar </td>
+ <td>2. baz </td></tr></tbody></table><span about="#mwt2">
+ </span><span about="#mwt2">
+ </span><span about="#mwt2">
+ </span><span about="#mwt2">abc</span><span about="#mwt2">
+ </span><span about="#mwt2">
+ </span><span about="#mwt2">
+ </span><span about="#mwt2">
+ </span><span about="#mwt2">
+ </span><span about="#mwt2">
+ </span><span about="#mwt2">xyz</span><span about="#mwt2">
+ </span><span about="#mwt2">
</span>
!!end
@@ -6237,10 +8666,13 @@ wiki<nowiki>nowiki<!--nowiki</nowiki>wiki
wiki<nowiki>nowiki<!--nowiki</nowiki>wiki
!!end
+# Leading @ in this template definition works around a limitation
+# in parsoid's parserTests which otherwise strips the <span> from the
+# result (confusing it for a template wrapper)
!! article
Template:dangerous
!!text
-<span onmouseover="alert('crap')">Oh no</span>
+@<span onmouseover="alert('crap')">Oh no</span>
!!endarticle
!!test
@@ -6248,7 +8680,7 @@ Template:dangerous
!! input
{{Template:dangerous}}
!! result
-<p><span>Oh no</span>
+<p>@<span>Oh no</span>
</p>
!! end
@@ -6637,6 +9069,62 @@ But not inside includeonly
<includeonly>{{subst:Foo}}</includeonly>
!! end
+!! test
+Parsoid: Recognize nowiki with trailing space in tags
+!! options
+parsoid=wt2html
+!! input
+<nowiki ><div>[[foo]]</nowiki >
+
+a<nowiki / >b
+
+c<nowiki />d
+
+e<nowiki/ >f
+!! result
+<p><span typeof="mw:Nowiki">&lt;div&gt;[[foo]]</span></p>
+<p>ab</p>
+<p>cd</p>
+<p>ef</p>
+!! end
+
+!! test
+Parsoid: Recognize nowiki with odd capitalization
+!! options
+parsoid=wt2html
+!! input
+<noWikI ><div>[[foo]]</Nowiki >
+!! result
+<p><span typeof="mw:Nowiki">&lt;div&gt;[[foo]]</span></p>
+!! end
+
+
+!! test
+Parsoid: Escape nowiki with trailing space in tags
+!! options
+parsoid=html2wt
+!! input
+&lt;nowiki &gt; foo &lt;/nowiki &gt;
+
+a&lt;nowiki /&gt;b
+
+c&lt;nowiki/ &gt;d
+!! result
+<p>&lt;nowiki &gt; foo &lt/nowiki ></p>
+<p>a&lt;nowiki /&gt;b</p>
+<p>c&lt;nowiki/ &gt;d</p>
+!! end
+
+!! test
+Parsoid: Escape weird noWikI capitalizations
+!! options
+parsoid=html2wt
+!! input
+&lt;noWikI &gt; foo &lt;/NoWikI &gt;
+!! result
+<p>&lt;noWikI &gt; foo &lt/NoWikI ></p>
+!! end
+
###
### Message transform tests
###
@@ -6705,9 +9193,9 @@ Special:RecentChanges/param
!! options
msg
!! input
-{{#special:foobarnonexistent}}
+{{#special:foobar nonexistent}}
!! result
-No such special page
+Special:Foobar nonexistent
!! end
!! test
@@ -6735,16 +9223,21 @@ Special:RecentChanges/param
!! options
msg
!! input
-{{#speciale:foobarnonexistent}}
+{{#speciale:foobar nonexistent}}
!! result
-No_such_special_page
+Special:Foobar_nonexistent
!! end
###
### Images
###
+### For Parsoid-specific tests, see
+#### http://www.mediawiki.org/wiki/Parsoid/MediaWiki_DOM_spec#Images
+
!! test
-Simple image
+Simple image (php)
+!! options
+php
!! input
[[Image:foobar.jpg]]
!! result
@@ -6753,16 +9246,20 @@ Simple image
!! end
!! test
-Right-aligned image
+Simple image (parsoid)
+!! options
+parsoid=wt2html
!! input
-[[Image:foobar.jpg|right]]
+[[Image:foobar.jpg]]
!! result
-<div class="floatright"><a href="/wiki/File:Foobar.jpg" class="image"><img alt="Foobar.jpg" src="http://example.com/images/3/3a/Foobar.jpg" width="1941" height="220" /></a></div>
-
+<p><span class="mw-default-size" typeof="mw:Image"><a href="File:Foobar.jpg"><img resource="./File:Foobar.jpg" src="//example.com/images/3/3a/Foobar.jpg" height="220" width="1941"></a></span>
+</p>
!! end
!! test
-Simple image (using File: namespace, now canonical)
+Simple image (using File: namespace, now canonical) (php)
+!! options
+php
!! input
[[File:foobar.jpg]]
!! result
@@ -6771,29 +9268,108 @@ Simple image (using File: namespace, now canonical)
!! end
!! test
-Image with caption
+Simple image (using File: namespace, now canonical) (parsoid)
+!! options
+parsoid
!! input
-[[Image:foobar.jpg|right|Caption text]]
+[[File:Foobar.jpg]]
+!! result
+<p><span class="mw-default-size" typeof="mw:Image"><a href="File:Foobar.jpg"><img resource="./File:Foobar.jpg" src="//example.com/images/3/3a/Foobar.jpg" height="220" width="1941"></a></span>
+</p>
+!! end
+
+!! test
+Right-aligned image (php)
+!! options
+php
+!! input
+[[Image:foobar.jpg|right]]
+!! result
+<div class="floatright"><a href="/wiki/File:Foobar.jpg" class="image"><img alt="Foobar.jpg" src="http://example.com/images/3/3a/Foobar.jpg" width="1941" height="220" /></a></div>
+
+!! end
+
+!! test
+Right-aligned image (parsoid)
+!! options
+parsoid
+!! input
+[[File:Foobar.jpg|right]]
+!! result
+<figure class="mw-default-size mw-halign-right" typeof="mw:Image"><a href="File:Foobar.jpg"><img resource="./File:Foobar.jpg" src="//example.com/images/3/3a/Foobar.jpg" height="220" width="1941"></a></figure>
+!! end
+
+!! test
+Image with caption (php)
+!! options
+php
+!! input
+[[File:Foobar.jpg|right|Caption text]]
+!! result
+<div class="floatright"><a href="/wiki/File:Foobar.jpg" class="image" title="Caption text"><img alt="Caption text" src="http://example.com/images/3/3a/Foobar.jpg" width="1941" height="220" /></a></div>
+
+!! end
+
+!! test
+Image with caption (parsoid)
+!! options
+parsoid
+!! input
+[[File:Foobar.jpg|right|Caption text]]
+!! result
+<figure class="mw-default-size mw-halign-right" typeof="mw:Image"><a href="File:Foobar.jpg"><img resource="./File:Foobar.jpg" src="//example.com/images/3/3a/Foobar.jpg" height="220" width="1941"></a><figcaption>Caption text</figcaption></figure>
+!! end
+
+!! test
+Image with empty attribute (php)
+!! options
+php
+!! input
+[[File:Foobar.jpg|right||Caption text]]
!! result
<div class="floatright"><a href="/wiki/File:Foobar.jpg" class="image" title="Caption text"><img alt="Caption text" src="http://example.com/images/3/3a/Foobar.jpg" width="1941" height="220" /></a></div>
!! end
!! test
-Image with empty attribute
+Image with empty attribute (parsoid)
+!! options
+parsoid=wt2html
+!! input
+[[File:Foobar.jpg|right||Caption text]]
+!! result
+<figure class="mw-default-size mw-halign-right" typeof="mw:Image"><a href="File:Foobar.jpg"><img resource="./File:Foobar.jpg" src="//example.com/images/3/3a/Foobar.jpg" height="220" width="1941"></a><figcaption>Caption text</figcaption></figure>
+!! end
+
+!! test
+Image with attributes from template (php)
+!! options
+php
!! input
-[[Image:foobar.jpg|right||Caption text]]
+[[File:Foobar.jpg|{{image_attribs}}]]
!! result
<div class="floatright"><a href="/wiki/File:Foobar.jpg" class="image" title="Caption text"><img alt="Caption text" src="http://example.com/images/3/3a/Foobar.jpg" width="1941" height="220" /></a></div>
!! end
!! test
-Image with link tails
+Image with attributes from template (parsoid)
+!! options
+parsoid
!! input
-123[[Image:foobar.jpg]]456
-123[[Image:foobar.jpg|right]]456
-123[[Image:foobar.jpg|thumb]]456
+[[File:Foobar.jpg|{{image_attribs}}]]
+!! result
+<figure class="mw-default-size mw-halign-right" typeof="mw:Image"><a href="File:Foobar.jpg"><img resource="./File:Foobar.jpg" src="//example.com/images/3/3a/Foobar.jpg" height="220" width="1941"></a><figcaption>Caption text</figcaption></figure>
+!! end
+
+!! test
+Image with link tails (php)
+!! options
+php
+!! input
+123[[File:Foobar.jpg]]456
+123[[File:Foobar.jpg|right]]456
+123[[File:Foobar.jpg|thumb]]456
!! result
<p>123<a href="/wiki/File:Foobar.jpg" class="image"><img alt="Foobar.jpg" src="http://example.com/images/3/3a/Foobar.jpg" width="1941" height="220" /></a>456
</p>
@@ -6803,20 +9379,48 @@ Image with link tails
!! end
!! test
-Image with multiple captions -- only last one is accepted
+Image with link tails (parsoid)
+!! options
+parsoid
+!! input
+123[[File:Foobar.jpg]]456
+123[[File:Foobar.jpg|right]]456
+123[[File:Foobar.jpg|thumb]]456
+!! result
+<p>123<span class="mw-default-size" typeof="mw:Image"><a href="File:Foobar.jpg"><img resource="./File:Foobar.jpg" src="//example.com/images/3/3a/Foobar.jpg" height="220" width="1941"></a></span>456</p>
+123<figure class="mw-default-size mw-halign-right" typeof="mw:Image"><a href="File:Foobar.jpg"><img resource="./File:Foobar.jpg" src="//example.com/images/3/3a/Foobar.jpg" height="220" width="1941"></a></figure>456
+123<figure class="mw-default-size" typeof="mw:Image/Thumb"><a href="File:Foobar.jpg"><img resource="./File:Foobar.jpg" src="//example.com/images/thumb/3/3a/Foobar.jpg/180px-Foobar.jpg" height="20" width="180"></a></figure>456
+!! end
+
+!! test
+Image with multiple captions -- only last one is accepted (php)
+!! options
+php
!! input
-[[Image:foobar.jpg|right|Caption1 - ignored|[[Caption2]] - ignored|Caption3 - accepted]]
+[[File:Foobar.jpg|right|Caption1 - ignored|[[Caption2]] - ignored|Caption3 - accepted]]
!! result
<div class="floatright"><a href="/wiki/File:Foobar.jpg" class="image" title="Caption3 - accepted"><img alt="Caption3 - accepted" src="http://example.com/images/3/3a/Foobar.jpg" width="1941" height="220" /></a></div>
!! end
!! test
-Image with width attribute at different positions
+Image with multiple captions -- only last one is accepted (parsoid)
+!! options
+parsoid
+!! input
+[[File:Foobar.jpg|right|Caption1 - ignored|[[Caption2]] - ignored|Caption3 - accepted]]
+!! result
+<figure class="mw-default-size mw-halign-right" typeof="mw:Image"><a href="File:Foobar.jpg"><img resource="./File:Foobar.jpg" src="//example.com/images/3/3a/Foobar.jpg" height="220" width="1941"></a><figcaption>Caption3 - accepted</figcaption></figure>
+!! end
+
+!! test
+Image with width attribute at different positions (php)
+!! options
+php
!! input
-[[Image:foobar.jpg|200px|right|Caption]]
-[[Image:foobar.jpg|right|200px|Caption]]
-[[Image:foobar.jpg|right|Caption|200px]]
+[[File:Foobar.jpg|200px|right|Caption]]
+[[File:Foobar.jpg|right|200px|Caption]]
+[[File:Foobar.jpg|right|Caption|200px]]
!! result
<div class="floatright"><a href="/wiki/File:Foobar.jpg" class="image" title="Caption"><img alt="Caption" src="http://example.com/images/thumb/3/3a/Foobar.jpg/200px-Foobar.jpg" width="200" height="23" srcset="http://example.com/images/thumb/3/3a/Foobar.jpg/300px-Foobar.jpg 1.5x, http://example.com/images/thumb/3/3a/Foobar.jpg/400px-Foobar.jpg 2x" /></a></div>
<div class="floatright"><a href="/wiki/File:Foobar.jpg" class="image" title="Caption"><img alt="Caption" src="http://example.com/images/thumb/3/3a/Foobar.jpg/200px-Foobar.jpg" width="200" height="23" srcset="http://example.com/images/thumb/3/3a/Foobar.jpg/300px-Foobar.jpg 1.5x, http://example.com/images/thumb/3/3a/Foobar.jpg/400px-Foobar.jpg 2x" /></a></div>
@@ -6825,23 +9429,84 @@ Image with width attribute at different positions
!! end
!! test
-Image with link parameter, wiki target
+Image with width attribute at different positions (parsoid)
+!! options
+parsoid
+!! input
+[[File:Foobar.jpg|200px|right|Caption]]
+[[File:Foobar.jpg|right|200px|Caption]]
+[[File:Foobar.jpg|right|Caption|200px]]
+!! result
+<figure class="mw-halign-right" typeof="mw:Image"><a href="File:Foobar.jpg"><img resource="./File:Foobar.jpg" src="//example.com/images/thumb/3/3a/Foobar.jpg/200px-Foobar.jpg" height="23" width="200"></a><figcaption>Caption</figcaption></figure>
+<figure class="mw-halign-right" typeof="mw:Image"><a href="File:Foobar.jpg"><img resource="./File:Foobar.jpg" src="//example.com/images/thumb/3/3a/Foobar.jpg/200px-Foobar.jpg" height="23" width="200"></a><figcaption>Caption</figcaption></figure>
+<figure class="mw-halign-right" typeof="mw:Image"><a href="File:Foobar.jpg"><img resource="./File:Foobar.jpg" src="//example.com/images/thumb/3/3a/Foobar.jpg/200px-Foobar.jpg" height="23" width="200"></a><figcaption>Caption</figcaption></figure>
+!! end
+
+!! test
+Image with link parameter, wiki target (php)
+!! options
+php
!! input
-[[Image:foobar.jpg|link=Target page]]
+[[File:Foobar.jpg|link=Main Page]]
!! result
-<p><a href="/wiki/Target_page" title="Target page"><img alt="Foobar.jpg" src="http://example.com/images/3/3a/Foobar.jpg" width="1941" height="220" /></a>
+<p><a href="/wiki/Main_Page" title="Main Page"><img alt="Foobar.jpg" src="http://example.com/images/3/3a/Foobar.jpg" width="1941" height="220" /></a>
</p>
!! end
!! test
-Image with link parameter, URL target
+Image with link parameter, wiki target (parsoid)
+!! options
+parsoid
+!! input
+[[File:Foobar.jpg|link=Main Page]]
+!! result
+<p><span class="mw-default-size" typeof="mw:Image"><a href="Main_Page"><img resource="./File:Foobar.jpg" src="//example.com/images/3/3a/Foobar.jpg" height="220" width="1941"></a></span></p>
+!! end
+
+!! test
+Image with link parameter, URL target (php)
+!! options
+php
!! input
-[[Image:foobar.jpg|link=http://example.com/]]
+[[File:Foobar.jpg|link=http://example.com/]]
!! result
<p><a href="http://example.com/" rel="nofollow"><img alt="Foobar.jpg" src="http://example.com/images/3/3a/Foobar.jpg" width="1941" height="220" /></a>
</p>
!! end
+# parsoid bug 49293 (part 1)
+!! test
+Image with link parameter, URL target (parsoid)
+!! options
+parsoid
+!! input
+[[File:Foobar.jpg|link=http://example.com/]]
+!! result
+<p><span class="mw-default-size" typeof="mw:Image"><a href="http://example.com/"><img resource="./File:Foobar.jpg" src="//example.com/images/3/3a/Foobar.jpg" height="220" width="1941"></a></span></p>
+!! end
+
+!! test
+Image with link parameter, protocol-less URL target (php)
+!! options
+php
+!! input
+[[File:Foobar.jpg|link=//example.com/]]
+!! result
+<p><a href="//example.com/" rel="nofollow"><img alt="Foobar.jpg" src="http://example.com/images/3/3a/Foobar.jpg" width="1941" height="220" /></a>
+</p>
+!! end
+
+# parsoid bug 49293 (part 2)
+!! test
+Image with link parameter, protocol-less URL target (parsoid)
+!! options
+parsoid
+!! input
+[[File:Foobar.jpg|link=//example.com/]]
+!! result
+<p><span class="mw-default-size" typeof="mw:Image"><a href="//example.com/"><img resource="./File:Foobar.jpg" src="//example.com/images/3/3a/Foobar.jpg" height="220" width="1941"></a></span></p>
+!! end
+
!! test
Image with link parameter, wgExternalLinkTarget
!! input
@@ -6887,34 +9552,72 @@ wgExternalLinkTarget='foobar'
!! end
!! test
-Image with empty link parameter
+Image with empty link parameter (php)
+!! options
+php
!! input
-[[Image:foobar.jpg|link=]]
+[[File:Foobar.jpg|link=]]
!! result
<p><img alt="Foobar.jpg" src="http://example.com/images/3/3a/Foobar.jpg" width="1941" height="220" />
</p>
!! end
!! test
-Image with link parameter (wiki target) and unnamed parameter
+Image with empty link parameter (parsoid)
+!! options
+parsoid
!! input
-[[Image:foobar.jpg|link=Target page|Title]]
+[[File:Foobar.jpg|link=]]
!! result
-<p><a href="/wiki/Target_page" title="Title"><img alt="Title" src="http://example.com/images/3/3a/Foobar.jpg" width="1941" height="220" /></a>
+<p><span class="mw-default-size" typeof="mw:Image"><span><img resource="./File:Foobar.jpg" src="//example.com/images/3/3a/Foobar.jpg" height="220" width="1941"></span></span></p>
+!! end
+
+!! test
+Image with link parameter (wiki target) and unnamed parameter (php)
+!! options
+php
+!! input
+[[File:Foobar.jpg|link=Main Page|Title]]
+!! result
+<p><a href="/wiki/Main_Page" title="Title"><img alt="Title" src="http://example.com/images/3/3a/Foobar.jpg" width="1941" height="220" /></a>
</p>
!! end
!! test
-Image with link parameter (URL target) and unnamed parameter
+Image with link parameter (wiki target) and unnamed parameter (parsoid)
+!! options
+parsoid
!! input
-[[Image:foobar.jpg|link=http://example.com/|Title]]
+[[File:Foobar.jpg|link=Main Page|Title]]
+!! result
+<p><span class="mw-default-size" typeof="mw:Image" data-mw='{"caption":"Title"}'><a href="Main_Page"><img resource="./File:Foobar.jpg" src="//example.com/images/3/3a/Foobar.jpg" height="220" width="1941"></a></span></p>
+!! end
+
+!! test
+Image with link parameter (URL target) and unnamed parameter (php)
+!! options
+php
+!! input
+[[File:Foobar.jpg|link=http://example.com/|Title]]
!! result
<p><a href="http://example.com/" title="Title" rel="nofollow"><img alt="Title" src="http://example.com/images/3/3a/Foobar.jpg" width="1941" height="220" /></a>
</p>
!! end
!! test
+Image with link parameter (URL target) and unnamed parameter (parsoid)
+!! options
+parsoid
+!! input
+[[File:Foobar.jpg|link=http://example.com/|Title]]
+!! result
+<p><span class="mw-default-size" typeof="mw:Image" data-mw='{"caption":"Title"}'><a href="http://example.com/"><img resource="./File:Foobar.jpg" src="//example.com/images/3/3a/Foobar.jpg" height="220" width="1941"></a></span></p>
+!! end
+
+!! test
Thumbnail image with link parameter
+!! options
+php
!! input
[[Image:foobar.jpg|thumb|link=http://example.com/|Title]]
!! result
@@ -6923,6 +9626,61 @@ Thumbnail image with link parameter
!! end
!! test
+Manually-specified thumbnail image
+!! options
+php
+!! input
+[[Image:Foobar.jpg|thumb=Thumb.png|Title]]
+!! result
+<div class="thumb tright"><div class="thumbinner" style="width:137px;"><a href="/wiki/File:Foobar.jpg"><img alt="" src="http://example.com/images/e/ea/Thumb.png" width="135" height="135" 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
+Manually-specified thumbnail image with explicit link to wiki page
+!! options
+php
+!! input
+[[Image:Foobar.jpg|thumb=Thumb.png|link=Main Page|Title]]
+!! result
+<div class="thumb tright"><div class="thumbinner" style="width:137px;"><a href="/wiki/Main_Page" title="Main Page"><img alt="" src="http://example.com/images/e/ea/Thumb.png" width="135" height="135" 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
+Manually-specified thumbnail image with explicit link to url
+!! options
+php
+!! input
+[[Image:Foobar.jpg|thumb=Thumb.png|link=http://example.com|Title]]
+!! result
+<div class="thumb tright"><div class="thumbinner" style="width:137px;"><a href="http://example.com"><img alt="" src="http://example.com/images/e/ea/Thumb.png" width="135" height="135" 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
+Manually-specified thumbnail image with explicit no link
+!! options
+php
+!! input
+[[Image:Foobar.jpg|thumb=Thumb.png|link=|Title]]
+!! result
+<div class="thumb tright"><div class="thumbinner" style="width:137px;"><img alt="" src="http://example.com/images/e/ea/Thumb.png" width="135" height="135" class="thumbimage" /> <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
+Manually-specified thumbnail image with explicit link and alt text
+!! options
+php
+!! input
+[[Image:Foobar.jpg|thumb=Thumb.png|link=Main Page|alt=alttext|Title]]
+!! result
+<div class="thumb tright"><div class="thumbinner" style="width:137px;"><a href="/wiki/Main_Page" title="Main Page"><img alt="alttext" src="http://example.com/images/e/ea/Thumb.png" width="135" height="135" 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]]]]
@@ -7006,6 +9764,36 @@ Thumbnail image caption with a free URL and explicit alt
!! end
!! test
+SVG thumbnails with no language set
+!! options
+!! input
+[[File:Foobar.svg|thumb|width=200]]
+!! result
+<div class="thumb tright"><div class="thumbinner" style="width:182px;"><a href="/wiki/File:Foobar.svg" class="image"><img alt="" src="http://example.com/images/thumb/f/ff/Foobar.svg/180px-Foobar.svg.png" width="180" height="180" class="thumbimage" srcset="http://example.com/images/thumb/f/ff/Foobar.svg/270px-Foobar.svg.png 1.5x, http://example.com/images/thumb/f/ff/Foobar.svg/360px-Foobar.svg.png 2x" /></a> <div class="thumbcaption"><div class="magnify"><a href="/wiki/File:Foobar.svg" class="internal" title="Enlarge"><img src="/skins/common/images/magnify-clip.png" width="15" height="11" alt="" /></a></div>width=200</div></div></div>
+
+!! end
+
+!! test
+SVG thumbnails with language de
+!! options
+!! input
+[[File:Foobar.svg|thumb|width=200|lang=de]]
+!! result
+<div class="thumb tright"><div class="thumbinner" style="width:182px;"><a href="/index.php?title=File:Foobar.svg&amp;lang=de" class="image"><img alt="" src="http://example.com/images/thumb/f/ff/Foobar.svg/langde-180px-Foobar.svg.png" width="180" height="180" class="thumbimage" srcset="http://example.com/images/thumb/f/ff/Foobar.svg/langde-270px-Foobar.svg.png 1.5x, http://example.com/images/thumb/f/ff/Foobar.svg/langde-360px-Foobar.svg.png 2x" /></a> <div class="thumbcaption"><div class="magnify"><a href="/wiki/File:Foobar.svg" class="internal" title="Enlarge"><img src="/skins/common/images/magnify-clip.png" width="15" height="11" alt="" /></a></div>width=200</div></div></div>
+
+!! end
+
+!! test
+SVG thumbnails with invalid language code
+!! options
+!! input
+[[File:Foobar.svg|thumb|width=200|lang=invalid.language.code]]
+!! result
+<div class="thumb tright"><div class="thumbinner" style="width:182px;"><a href="/wiki/File:Foobar.svg" class="image"><img alt="" src="http://example.com/images/thumb/f/ff/Foobar.svg/180px-Foobar.svg.png" width="180" height="180" class="thumbimage" srcset="http://example.com/images/thumb/f/ff/Foobar.svg/270px-Foobar.svg.png 1.5x, http://example.com/images/thumb/f/ff/Foobar.svg/360px-Foobar.svg.png 2x" /></a> <div class="thumbcaption"><div class="magnify"><a href="/wiki/File:Foobar.svg" class="internal" title="Enlarge"><img src="/skins/common/images/magnify-clip.png" width="15" height="11" alt="" /></a></div>lang=invalid.language.code</div></div></div>
+
+!! end
+
+!! test
BUG 1887: A ISBN with a thumbnail
!! input
[[Image:foobar.jpg|thumb|ISBN 1235467890]]
@@ -7200,6 +9988,152 @@ wgEnableUploads=0
</p>
!! end
+# Parsoid-specific testing for images
+# http://www.mediawiki.org/wiki/Parsoid/MediaWiki_DOM_spec#Images
+# Currently imperfect due to a flaw in the Parsoid testrunner
+# Work in progress
+# THESE TESTS SHOULD BE MOVED UP and merged with the php-specific
+# image tests.
+
+!! test
+Parsoid-specific image handling - simple image with size and middle alignment
+!! options
+parsoid
+!! input
+[[Image:Foobar.jpg|50px|middle]]
+!! result
+<p>
+<span class="mw-valign-middle" typeof="mw:Image">
+<a href="File:Foobar.jpg">
+<img resource="./File:Foobar.jpg" src="//example.com/images/thumb/3/3a/Foobar.jpg/50px-Foobar.jpg" height="6" width="50">
+</a>
+</span>
+</p>
+!! end
+
+!! test
+Parsoid-specific image handling - simple image with both sizes, a baseline alignment, and a caption
+!! options
+parsoid
+!! input
+[[Image:Foobar.jpg|500x10px|baseline|caption]]
+!! result
+<p>
+<span class="mw-valign-baseline" typeof="mw:Image" data-mw="{&quot;caption&quot;:&quot;caption&quot;}">
+<a href="File:Foobar.jpg">
+<img resource="./File:Foobar.jpg" src="//example.com/images/thumb/3/3a/Foobar.jpg/89px-Foobar.jpg" height="10" width="89">
+</a>
+</span>
+</p>
+!! end
+
+!! test
+Parsoid-specific image handling - simple image with border and size spec
+!! options
+parsoid
+!! input
+[[Image:Foobar.jpg|50px|border|caption]]
+!! result
+<p>
+<span class="mw-image-border" typeof="mw:Image" data-mw="{&quot;caption&quot;:&quot;caption&quot;}">
+<a href="File:Foobar.jpg">
+<img resource="./File:Foobar.jpg" src="//example.com/images/thumb/3/3a/Foobar.jpg/50px-Foobar.jpg" height="6" width="50">
+</a>
+</span>
+</p>
+!! end
+
+!! test
+Parsoid-specific image handling - thumbnail with halign, valign, and caption
+!! options
+parsoid
+!! input
+[[Image:Foobar.jpg|thumb|left|baseline|caption content]]
+!! result
+<figure class="mw-default-size mw-halign-left mw-valign-baseline" typeof="mw:Image/Thumb">
+<a href="File:Foobar.jpg">
+<img resource="./File:Foobar.jpg" src="//example.com/images/thumb/3/3a/Foobar.jpg/180px-Foobar.jpg" height="21" width="180" />
+</a>
+<figcaption>caption content</figcaption>
+</figure>
+!! end
+
+!! test
+Parsoid-specific image handling - thumbnail with specific size, halign, valign, and caption
+!! options
+parsoid
+!! input
+[[Image:Foobar.jpg|thumb|50x50px|right|middle|caption]]
+!! result
+<figure class="mw-halign-right mw-valign-middle" typeof="mw:Image/Thumb">
+<a href="File:Foobar.jpg">
+<img resource="./File:Foobar.jpg" src="//example.com/images/thumb/3/3a/Foobar.jpg/50px-Foobar.jpg" height="6" width="50" />
+</a>
+<figcaption>caption</figcaption>
+</figure>
+!! end
+
+!! test
+Parsoid-specific image handling - framed image with specific size and caption
+!! options
+parsoid
+!! input
+[[Image:Foobar.jpg|500x50px|frame|caption]]
+!! result
+<figure typeof="mw:Image/Frame">
+<a href="File:Foobar.jpg">
+<img resource="./File:Foobar.jpg" src="//example.com/images/thumb/3/3a/Foobar.jpg/442px-Foobar.jpg" height="50" width="442" />
+</a>
+<figcaption>caption</figcaption>
+</figure>
+!! end
+
+!! test
+Parsoid-specific image handling - framed image with specific size, halign, valign, and caption
+!! options
+parsoid
+!! input
+[[Image:Foobar.jpg|500x50px|frame|left|baseline|caption]]
+!! result
+<figure class="mw-halign-left mw-valign-baseline" typeof="mw:Image/Frame">
+<a href="File:Foobar.jpg">
+<img resource="./File:Foobar.jpg" src="//example.com/images/thumb/3/3a/Foobar.jpg/442px-Foobar.jpg" height="50" width="442" />
+</a>
+<figcaption>caption</figcaption>
+</figure>
+!! end
+
+!! test
+Parsoid-specific image handling - frameless image with specific size, border, and caption
+!! options
+parsoid
+!! input
+[[Image:Foobar.jpg|frameless|500x50px|border|caption]]
+!! result
+<p>
+<span class="mw-image-border" typeof="mw:Image/Frameless" data-mw="{&quot;caption&quot;:&quot;caption&quot;}">
+<a href="File:Foobar.jpg">
+<img resource="./File:Foobar.jpg" src="//example.com/images/thumb/3/3a/Foobar.jpg/442px-Foobar.jpg" height="50" width="442" />
+</a>
+</p>
+!! end
+
+#!! test
+#Parsoid-specific image handling - simple image with a formatted caption
+#!! options
+#parsoid
+#!! input
+#[[Image:Foobar.jpg|<table><tr><td>a</td><td>b</td></tr><tr><td>c</td></tr></table>]]
+#!! result
+#<p>
+#<span typeof="mw:Image">
+#<a class="mw-default-size" href="Image:Foobar.jpg">
+#<img alt="Foobar.jpg" class="mw-default-size" src="http://example.com/images/3/3a/Foobar.jpg" height="220" width="1941">
+#</a>
+#<span>abc</span>
+#</span>
+#</p>
+
###
### Subpages
@@ -7232,6 +10166,38 @@ subpage title=[[Subpage test]]
</p>
!! end
+# TODO: make this PHP-parser compatible!
+!! test
+Relative subpage noslash link
+!! options
+parsoid=wt2wt,wt2html,html2html
+subpage title=[[Subpage test/1/2/3/4]]
+!!input
+[[../../subpage/]]
+
+[[../../subpage]]
+!! result
+<p><a rel="mw:WikiLink" href="Subpage_test/1/2/subpage/">subpage</a></p>
+<p><a rel="mw:WikiLink" href="Subpage_test/1/2/subpage">Subpage_test/1/2/subpage</a></p>
+!! end
+
+# TODO: make this PHP-parser compatible!
+!! test
+Parsoid: dot-slash prefixed wikilinks
+!! options
+parsoid=wt2wt,wt2html,html2html
+!!input
+[[./foo]]
+
+[[././bar]]
+
+[[././baz/]]
+!! result
+<p><a rel="mw:WikiLink" href="./Foo">foo</a></p>
+<p><a rel="mw:WikiLink" href="./Bar">bar</a></p>
+<p><a rel="mw:WikiLink" href="./Baz/">baz/</a></p>
+!! end
+
!! test
Disabled subpages
!! input
@@ -7415,6 +10381,59 @@ Bar
</p>
!! end
+!! test
+Parsoid: Serialize link to category page with colon escape
+!! options
+parsoid
+!! input
+
+[[:Category:Foo]]
+[[:Category:Foo|Bar]]
+!! result
+<p>
+<a rel="mw:WikiLink" href="Category:Foo">Category:Foo</a>
+<a rel="mw:WikiLink" href="Category:Foo">Bar</a>
+</p>
+!! end
+
+!! test
+Parsoid: Link prefix/suffixes aren't applied to category links
+!! options
+parsoid=wt2html,wt2wt,html2html
+language=is
+!! input
+x[[Category:Foo]]y
+!! result
+<p>x<link rel="mw:WikiLink/Category" href="Category:Foo">y</p>
+!! end
+
+!! test
+Parsoid: Serialize link to file page with colon escape
+!! options
+parsoid
+!! input
+
+[[:File:Foo.png]]
+[[:File:Foo.png|Bar]]
+!! result
+<p>
+<a rel="mw:WikiLink" href="File:Foo.png">File:Foo.png</a>
+<a rel="mw:WikiLink" href="File:Foo.png">Bar</a>
+</p>
+!! end
+
+!! test
+Parsoid: Serialize a genuine category link without colon escape
+!! options
+parsoid
+!! input
+[[Category:Foo]]
+[[Category:Foo|Bar]]
+!! result
+<link rel="mw:WikiLink/Category" href="Category:Foo">
+<link rel="mw:WikiLink/Category" href="Category:Foo#Bar">
+!! end
+
###
### Inter-language links
###
@@ -7457,13 +10476,13 @@ More
===Smaller headline===
Blah blah
!! result
-<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>
+<h2><span class="mw-headline" id="Headline_1">Headline 1</span><span class="mw-editsection"><span class="mw-editsection-bracket">[</span><a href="/index.php?title=Parser_test&amp;action=edit&amp;section=1" title="Edit section: Headline 1">edit</a><span class="mw-editsection-bracket">]</span></span></h2>
<p>Some text
</p>
-<h2><span class="editsection">[<a href="/index.php?title=Parser_test&amp;action=edit&amp;section=2" title="Edit section: Headline 2">edit</a>]</span> <span class="mw-headline" id="Headline_2">Headline 2</span></h2>
+<h2><span class="mw-headline" id="Headline_2">Headline 2</span><span class="mw-editsection"><span class="mw-editsection-bracket">[</span><a href="/index.php?title=Parser_test&amp;action=edit&amp;section=2" title="Edit section: Headline 2">edit</a><span class="mw-editsection-bracket">]</span></span></h2>
<p>More
</p>
-<h3><span class="editsection">[<a href="/index.php?title=Parser_test&amp;action=edit&amp;section=3" title="Edit section: Smaller headline">edit</a>]</span> <span class="mw-headline" id="Smaller_headline">Smaller headline</span></h3>
+<h3><span class="mw-headline" id="Smaller_headline">Smaller headline</span><span class="mw-editsection"><span class="mw-editsection-bracket">[</span><a href="/index.php?title=Parser_test&amp;action=edit&amp;section=3" title="Edit section: Smaller headline">edit</a><span class="mw-editsection-bracket">]</span></span></h3>
<p>Blah blah
</p>
!! end
@@ -7480,7 +10499,7 @@ Section headings with TOC
Some text
===Another headline===
!! result
-<table id="toc" class="toc"><tr><td><div id="toctitle"><h2>Contents</h2></div>
+<div id="toc" class="toc"><div id="toctitle"><h2>Contents</h2></div>
<ul>
<li class="toclevel-1 tocsection-1"><a href="#Headline_1"><span class="tocnumber">1</span> <span class="toctext">Headline 1</span></a>
<ul>
@@ -7501,15 +10520,16 @@ Some text
</ul>
</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: 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>
-<h6><span class="editsection">[<a href="/index.php?title=Parser_test&amp;action=edit&amp;section=4" title="Edit section: Skipping a level">edit</a>]</span> <span class="mw-headline" id="Skipping_a_level_2"> Skipping a level </span></h6>
-<h2><span class="editsection">[<a href="/index.php?title=Parser_test&amp;action=edit&amp;section=5" title="Edit section: Headline 2">edit</a>]</span> <span class="mw-headline" id="Headline_2"> Headline 2 </span></h2>
+</div>
+
+<h2><span class="mw-headline" id="Headline_1">Headline 1</span><span class="mw-editsection"><span class="mw-editsection-bracket">[</span><a href="/index.php?title=Parser_test&amp;action=edit&amp;section=1" title="Edit section: Headline 1">edit</a><span class="mw-editsection-bracket">]</span></span></h2>
+<h3><span class="mw-headline" id="Subheadline_1">Subheadline 1</span><span class="mw-editsection"><span class="mw-editsection-bracket">[</span><a href="/index.php?title=Parser_test&amp;action=edit&amp;section=2" title="Edit section: Subheadline 1">edit</a><span class="mw-editsection-bracket">]</span></span></h3>
+<h5><span class="mw-headline" id="Skipping_a_level">Skipping a level</span><span class="mw-editsection"><span class="mw-editsection-bracket">[</span><a href="/index.php?title=Parser_test&amp;action=edit&amp;section=3" title="Edit section: Skipping a level">edit</a><span class="mw-editsection-bracket">]</span></span></h5>
+<h6><span class="mw-headline" id="Skipping_a_level_2">Skipping a level</span><span class="mw-editsection"><span class="mw-editsection-bracket">[</span><a href="/index.php?title=Parser_test&amp;action=edit&amp;section=4" title="Edit section: Skipping a level">edit</a><span class="mw-editsection-bracket">]</span></span></h6>
+<h2><span class="mw-headline" id="Headline_2">Headline 2</span><span class="mw-editsection"><span class="mw-editsection-bracket">[</span><a href="/index.php?title=Parser_test&amp;action=edit&amp;section=5" title="Edit section: Headline 2">edit</a><span class="mw-editsection-bracket">]</span></span></h2>
<p>Some text
</p>
-<h3><span class="editsection">[<a href="/index.php?title=Parser_test&amp;action=edit&amp;section=6" title="Edit section: Another headline">edit</a>]</span> <span class="mw-headline" id="Another_headline">Another headline</span></h3>
+<h3><span class="mw-headline" id="Another_headline">Another headline</span><span class="mw-editsection"><span class="mw-editsection-bracket">[</span><a href="/index.php?title=Parser_test&amp;action=edit&amp;section=6" title="Edit section: Another headline">edit</a><span class="mw-editsection-bracket">]</span></span></h3>
!! end
@@ -7528,7 +10548,7 @@ Handling of sections up to level 6 and beyond
========= Level 9 Heading=========
========== Level 10 Heading==========
!! result
-<table id="toc" class="toc"><tr><td><div id="toctitle"><h2>Contents</h2></div>
+<div id="toc" class="toc"><div id="toctitle"><h2>Contents</h2></div>
<ul>
<li class="toclevel-1 tocsection-1"><a href="#Level_1_Heading"><span class="tocnumber">1</span> <span class="toctext">Level 1 Heading</span></a>
<ul>
@@ -7556,17 +10576,18 @@ Handling of sections up to level 6 and beyond
</ul>
</li>
</ul>
-</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>
-<h4><span class="editsection">[<a href="/index.php?title=Parser_test&amp;action=edit&amp;section=4" title="Edit section: Level 4 Heading">edit</a>]</span> <span class="mw-headline" id="Level_4_Heading"> Level 4 Heading</span></h4>
-<h5><span class="editsection">[<a href="/index.php?title=Parser_test&amp;action=edit&amp;section=5" title="Edit section: Level 5 Heading">edit</a>]</span> <span class="mw-headline" id="Level_5_Heading"> Level 5 Heading</span></h5>
-<h6><span class="editsection">[<a href="/index.php?title=Parser_test&amp;action=edit&amp;section=6" title="Edit section: Level 6 Heading">edit</a>]</span> <span class="mw-headline" id="Level_6_Heading"> Level 6 Heading</span></h6>
-<h6><span class="editsection">[<a href="/index.php?title=Parser_test&amp;action=edit&amp;section=7" title="Edit section: = Level 7 Heading=">edit</a>]</span> <span class="mw-headline" id=".3D_Level_7_Heading.3D">= Level 7 Heading=</span></h6>
-<h6><span class="editsection">[<a href="/index.php?title=Parser_test&amp;action=edit&amp;section=8" title="Edit section: == Level 8 Heading==">edit</a>]</span> <span class="mw-headline" id=".3D.3D_Level_8_Heading.3D.3D">== Level 8 Heading==</span></h6>
-<h6><span class="editsection">[<a href="/index.php?title=Parser_test&amp;action=edit&amp;section=9" title="Edit section: === Level 9 Heading===">edit</a>]</span> <span class="mw-headline" id=".3D.3D.3D_Level_9_Heading.3D.3D.3D">=== Level 9 Heading===</span></h6>
-<h6><span class="editsection">[<a href="/index.php?title=Parser_test&amp;action=edit&amp;section=10" title="Edit section: ==== Level 10 Heading====">edit</a>]</span> <span class="mw-headline" id=".3D.3D.3D.3D_Level_10_Heading.3D.3D.3D.3D">==== Level 10 Heading====</span></h6>
+</div>
+
+<h1><span class="mw-headline" id="Level_1_Heading">Level 1 Heading</span><span class="mw-editsection"><span class="mw-editsection-bracket">[</span><a href="/index.php?title=Parser_test&amp;action=edit&amp;section=1" title="Edit section: Level 1 Heading">edit</a><span class="mw-editsection-bracket">]</span></span></h1>
+<h2><span class="mw-headline" id="Level_2_Heading">Level 2 Heading</span><span class="mw-editsection"><span class="mw-editsection-bracket">[</span><a href="/index.php?title=Parser_test&amp;action=edit&amp;section=2" title="Edit section: Level 2 Heading">edit</a><span class="mw-editsection-bracket">]</span></span></h2>
+<h3><span class="mw-headline" id="Level_3_Heading">Level 3 Heading</span><span class="mw-editsection"><span class="mw-editsection-bracket">[</span><a href="/index.php?title=Parser_test&amp;action=edit&amp;section=3" title="Edit section: Level 3 Heading">edit</a><span class="mw-editsection-bracket">]</span></span></h3>
+<h4><span class="mw-headline" id="Level_4_Heading">Level 4 Heading</span><span class="mw-editsection"><span class="mw-editsection-bracket">[</span><a href="/index.php?title=Parser_test&amp;action=edit&amp;section=4" title="Edit section: Level 4 Heading">edit</a><span class="mw-editsection-bracket">]</span></span></h4>
+<h5><span class="mw-headline" id="Level_5_Heading">Level 5 Heading</span><span class="mw-editsection"><span class="mw-editsection-bracket">[</span><a href="/index.php?title=Parser_test&amp;action=edit&amp;section=5" title="Edit section: Level 5 Heading">edit</a><span class="mw-editsection-bracket">]</span></span></h5>
+<h6><span class="mw-headline" id="Level_6_Heading">Level 6 Heading</span><span class="mw-editsection"><span class="mw-editsection-bracket">[</span><a href="/index.php?title=Parser_test&amp;action=edit&amp;section=6" title="Edit section: Level 6 Heading">edit</a><span class="mw-editsection-bracket">]</span></span></h6>
+<h6><span class="mw-headline" id=".3D_Level_7_Heading.3D">= Level 7 Heading=</span><span class="mw-editsection"><span class="mw-editsection-bracket">[</span><a href="/index.php?title=Parser_test&amp;action=edit&amp;section=7" title="Edit section: = Level 7 Heading=">edit</a><span class="mw-editsection-bracket">]</span></span></h6>
+<h6><span class="mw-headline" id=".3D.3D_Level_8_Heading.3D.3D">== Level 8 Heading==</span><span class="mw-editsection"><span class="mw-editsection-bracket">[</span><a href="/index.php?title=Parser_test&amp;action=edit&amp;section=8" title="Edit section: == Level 8 Heading==">edit</a><span class="mw-editsection-bracket">]</span></span></h6>
+<h6><span class="mw-headline" id=".3D.3D.3D_Level_9_Heading.3D.3D.3D">=== Level 9 Heading===</span><span class="mw-editsection"><span class="mw-editsection-bracket">[</span><a href="/index.php?title=Parser_test&amp;action=edit&amp;section=9" title="Edit section: === Level 9 Heading===">edit</a><span class="mw-editsection-bracket">]</span></span></h6>
+<h6><span class="mw-headline" id=".3D.3D.3D.3D_Level_10_Heading.3D.3D.3D.3D">==== Level 10 Heading====</span><span class="mw-editsection"><span class="mw-editsection-bracket">[</span><a href="/index.php?title=Parser_test&amp;action=edit&amp;section=10" title="Edit section: ==== Level 10 Heading====">edit</a><span class="mw-editsection-bracket">]</span></span></h6>
!! end
@@ -7580,7 +10601,7 @@ TOC regression (bug 9764)
== title 2 ==
=== title 2.1 ===
!! result
-<table id="toc" class="toc"><tr><td><div id="toctitle"><h2>Contents</h2></div>
+<div id="toc" class="toc"><div id="toctitle"><h2>Contents</h2></div>
<ul>
<li class="toclevel-1 tocsection-1"><a href="#title_1"><span class="tocnumber">1</span> <span class="toctext">title 1</span></a>
<ul>
@@ -7598,13 +10619,14 @@ TOC regression (bug 9764)
</ul>
</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: 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>
-<h3><span class="editsection">[<a href="/index.php?title=Parser_test&amp;action=edit&amp;section=4" title="Edit section: title 1.2">edit</a>]</span> <span class="mw-headline" id="title_1.2"> title 1.2 </span></h3>
-<h2><span class="editsection">[<a href="/index.php?title=Parser_test&amp;action=edit&amp;section=5" title="Edit section: title 2">edit</a>]</span> <span class="mw-headline" id="title_2"> title 2 </span></h2>
-<h3><span class="editsection">[<a href="/index.php?title=Parser_test&amp;action=edit&amp;section=6" title="Edit section: title 2.1">edit</a>]</span> <span class="mw-headline" id="title_2.1"> title 2.1 </span></h3>
+</div>
+
+<h2><span class="mw-headline" id="title_1">title 1</span><span class="mw-editsection"><span class="mw-editsection-bracket">[</span><a href="/index.php?title=Parser_test&amp;action=edit&amp;section=1" title="Edit section: title 1">edit</a><span class="mw-editsection-bracket">]</span></span></h2>
+<h3><span class="mw-headline" id="title_1.1">title 1.1</span><span class="mw-editsection"><span class="mw-editsection-bracket">[</span><a href="/index.php?title=Parser_test&amp;action=edit&amp;section=2" title="Edit section: title 1.1">edit</a><span class="mw-editsection-bracket">]</span></span></h3>
+<h4><span class="mw-headline" id="title_1.1.1">title 1.1.1</span><span class="mw-editsection"><span class="mw-editsection-bracket">[</span><a href="/index.php?title=Parser_test&amp;action=edit&amp;section=3" title="Edit section: title 1.1.1">edit</a><span class="mw-editsection-bracket">]</span></span></h4>
+<h3><span class="mw-headline" id="title_1.2">title 1.2</span><span class="mw-editsection"><span class="mw-editsection-bracket">[</span><a href="/index.php?title=Parser_test&amp;action=edit&amp;section=4" title="Edit section: title 1.2">edit</a><span class="mw-editsection-bracket">]</span></span></h3>
+<h2><span class="mw-headline" id="title_2">title 2</span><span class="mw-editsection"><span class="mw-editsection-bracket">[</span><a href="/index.php?title=Parser_test&amp;action=edit&amp;section=5" title="Edit section: title 2">edit</a><span class="mw-editsection-bracket">]</span></span></h2>
+<h3><span class="mw-headline" id="title_2.1">title 2.1</span><span class="mw-editsection"><span class="mw-editsection-bracket">[</span><a href="/index.php?title=Parser_test&amp;action=edit&amp;section=6" title="Edit section: title 2.1">edit</a><span class="mw-editsection-bracket">]</span></span></h3>
!! end
@@ -7620,7 +10642,7 @@ wgMaxTocLevel=3
== title 2 ==
=== title 2.1 ===
!! result
-<table id="toc" class="toc"><tr><td><div id="toctitle"><h2>Contents</h2></div>
+<div id="toc" class="toc"><div id="toctitle"><h2>Contents</h2></div>
<ul>
<li class="toclevel-1 tocsection-1"><a href="#title_1"><span class="tocnumber">1</span> <span class="toctext">title 1</span></a>
<ul>
@@ -7634,13 +10656,14 @@ wgMaxTocLevel=3
</ul>
</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: 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>
-<h3><span class="editsection">[<a href="/index.php?title=Parser_test&amp;action=edit&amp;section=4" title="Edit section: title 1.2">edit</a>]</span> <span class="mw-headline" id="title_1.2"> title 1.2 </span></h3>
-<h2><span class="editsection">[<a href="/index.php?title=Parser_test&amp;action=edit&amp;section=5" title="Edit section: title 2">edit</a>]</span> <span class="mw-headline" id="title_2"> title 2 </span></h2>
-<h3><span class="editsection">[<a href="/index.php?title=Parser_test&amp;action=edit&amp;section=6" title="Edit section: title 2.1">edit</a>]</span> <span class="mw-headline" id="title_2.1"> title 2.1 </span></h3>
+</div>
+
+<h2><span class="mw-headline" id="title_1">title 1</span><span class="mw-editsection"><span class="mw-editsection-bracket">[</span><a href="/index.php?title=Parser_test&amp;action=edit&amp;section=1" title="Edit section: title 1">edit</a><span class="mw-editsection-bracket">]</span></span></h2>
+<h3><span class="mw-headline" id="title_1.1">title 1.1</span><span class="mw-editsection"><span class="mw-editsection-bracket">[</span><a href="/index.php?title=Parser_test&amp;action=edit&amp;section=2" title="Edit section: title 1.1">edit</a><span class="mw-editsection-bracket">]</span></span></h3>
+<h4><span class="mw-headline" id="title_1.1.1">title 1.1.1</span><span class="mw-editsection"><span class="mw-editsection-bracket">[</span><a href="/index.php?title=Parser_test&amp;action=edit&amp;section=3" title="Edit section: title 1.1.1">edit</a><span class="mw-editsection-bracket">]</span></span></h4>
+<h3><span class="mw-headline" id="title_1.2">title 1.2</span><span class="mw-editsection"><span class="mw-editsection-bracket">[</span><a href="/index.php?title=Parser_test&amp;action=edit&amp;section=4" title="Edit section: title 1.2">edit</a><span class="mw-editsection-bracket">]</span></span></h3>
+<h2><span class="mw-headline" id="title_2">title 2</span><span class="mw-editsection"><span class="mw-editsection-bracket">[</span><a href="/index.php?title=Parser_test&amp;action=edit&amp;section=5" title="Edit section: title 2">edit</a><span class="mw-editsection-bracket">]</span></span></h2>
+<h3><span class="mw-headline" id="title_2.1">title 2.1</span><span class="mw-editsection"><span class="mw-editsection-bracket">[</span><a href="/index.php?title=Parser_test&amp;action=edit&amp;section=6" title="Edit section: title 2.1">edit</a><span class="mw-editsection-bracket">]</span></span></h3>
!! end
@@ -7655,7 +10678,7 @@ wgMaxTocLevel=3
====Section 1.1.1.1====
==Section 2==
!! result
-<table id="toc" class="toc"><tr><td><div id="toctitle"><h2>Contents</h2></div>
+<div id="toc" class="toc"><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>
@@ -7664,12 +10687,13 @@ wgMaxTocLevel=3
</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>
+</div>
+
+<h2><span class="mw-headline" id="Section_1">Section 1</span><span class="mw-editsection"><span class="mw-editsection-bracket">[</span><a href="/index.php?title=Parser_test&amp;action=edit&amp;section=1" title="Edit section: Section 1">edit</a><span class="mw-editsection-bracket">]</span></span></h2>
+<h3><span class="mw-headline" id="Section_1.1">Section 1.1</span><span class="mw-editsection"><span class="mw-editsection-bracket">[</span><a href="/index.php?title=Parser_test&amp;action=edit&amp;section=2" title="Edit section: Section 1.1">edit</a><span class="mw-editsection-bracket">]</span></span></h3>
+<h4><span class="mw-headline" id="Section_1.1.1">Section 1.1.1</span><span class="mw-editsection"><span class="mw-editsection-bracket">[</span><a href="/index.php?title=Parser_test&amp;action=edit&amp;section=3" title="Edit section: Section 1.1.1">edit</a><span class="mw-editsection-bracket">]</span></span></h4>
+<h4><span class="mw-headline" id="Section_1.1.1.1">Section 1.1.1.1</span><span class="mw-editsection"><span class="mw-editsection-bracket">[</span><a href="/index.php?title=Parser_test&amp;action=edit&amp;section=4" title="Edit section: Section 1.1.1.1">edit</a><span class="mw-editsection-bracket">]</span></span></h4>
+<h2><span class="mw-headline" id="Section_2">Section 2</span><span class="mw-editsection"><span class="mw-editsection-bracket">[</span><a href="/index.php?title=Parser_test&amp;action=edit&amp;section=5" title="Edit section: Section 2">edit</a><span class="mw-editsection-bracket">]</span></span></h2>
!! end
@@ -7680,8 +10704,8 @@ Resolving duplicate section names
== Foo bar ==
== Foo bar ==
!! result
-<h2><span class="editsection">[<a href="/index.php?title=Parser_test&amp;action=edit&amp;section=1" title="Edit section: Foo bar">edit</a>]</span> <span class="mw-headline" id="Foo_bar"> Foo bar </span></h2>
-<h2><span class="editsection">[<a href="/index.php?title=Parser_test&amp;action=edit&amp;section=2" title="Edit section: Foo bar">edit</a>]</span> <span class="mw-headline" id="Foo_bar_2"> Foo bar </span></h2>
+<h2><span class="mw-headline" id="Foo_bar">Foo bar</span><span class="mw-editsection"><span class="mw-editsection-bracket">[</span><a href="/index.php?title=Parser_test&amp;action=edit&amp;section=1" title="Edit section: Foo bar">edit</a><span class="mw-editsection-bracket">]</span></span></h2>
+<h2><span class="mw-headline" id="Foo_bar_2">Foo bar</span><span class="mw-editsection"><span class="mw-editsection-bracket">[</span><a href="/index.php?title=Parser_test&amp;action=edit&amp;section=2" title="Edit section: Foo bar">edit</a><span class="mw-editsection-bracket">]</span></span></h2>
!! end
@@ -7691,8 +10715,8 @@ Resolving duplicate section names with differing case (bug 10721)
== Foo bar ==
== Foo Bar ==
!! result
-<h2><span class="editsection">[<a href="/index.php?title=Parser_test&amp;action=edit&amp;section=1" title="Edit section: Foo bar">edit</a>]</span> <span class="mw-headline" id="Foo_bar"> Foo bar </span></h2>
-<h2><span class="editsection">[<a href="/index.php?title=Parser_test&amp;action=edit&amp;section=2" title="Edit section: Foo Bar">edit</a>]</span> <span class="mw-headline" id="Foo_Bar_2"> Foo Bar </span></h2>
+<h2><span class="mw-headline" id="Foo_bar">Foo bar</span><span class="mw-editsection"><span class="mw-editsection-bracket">[</span><a href="/index.php?title=Parser_test&amp;action=edit&amp;section=1" title="Edit section: Foo bar">edit</a><span class="mw-editsection-bracket">]</span></span></h2>
+<h2><span class="mw-headline" id="Foo_Bar_2">Foo Bar</span><span class="mw-editsection"><span class="mw-editsection-bracket">[</span><a href="/index.php?title=Parser_test&amp;action=edit&amp;section=2" title="Edit section: Foo Bar">edit</a><span class="mw-editsection-bracket">]</span></span></h2>
!! end
@@ -7711,10 +10735,10 @@ __NOTOC__
{{sections}}
==Section 4==
!! result
-<h2><span class="editsection">[<a href="/index.php?title=Parser_test&amp;action=edit&amp;section=1" title="Edit section: Section 0">edit</a>]</span> <span class="mw-headline" id="Section_0">Section 0</span></h2>
-<h3><span class="editsection">[<a href="/index.php?title=Template:Sections&amp;action=edit&amp;section=T-1" title="Template:Sections">edit</a>]</span> <span class="mw-headline" id="Section_1">Section 1</span></h3>
-<h2><span class="editsection">[<a href="/index.php?title=Template:Sections&amp;action=edit&amp;section=T-2" title="Template:Sections">edit</a>]</span> <span class="mw-headline" id="Section_2">Section 2</span></h2>
-<h2><span class="editsection">[<a href="/index.php?title=Parser_test&amp;action=edit&amp;section=2" title="Edit section: Section 4">edit</a>]</span> <span class="mw-headline" id="Section_4">Section 4</span></h2>
+<h2><span class="mw-headline" id="Section_0">Section 0</span><span class="mw-editsection"><span class="mw-editsection-bracket">[</span><a href="/index.php?title=Parser_test&amp;action=edit&amp;section=1" title="Edit section: Section 0">edit</a><span class="mw-editsection-bracket">]</span></span></h2>
+<h3><span class="mw-headline" id="Section_1">Section 1</span><span class="mw-editsection"><span class="mw-editsection-bracket">[</span><a href="/index.php?title=Template:Sections&amp;action=edit&amp;section=T-1" title="Template:Sections">edit</a><span class="mw-editsection-bracket">]</span></span></h3>
+<h2><span class="mw-headline" id="Section_2">Section 2</span><span class="mw-editsection"><span class="mw-editsection-bracket">[</span><a href="/index.php?title=Template:Sections&amp;action=edit&amp;section=T-2" title="Template:Sections">edit</a><span class="mw-editsection-bracket">]</span></span></h2>
+<h2><span class="mw-headline" id="Section_4">Section 4</span><span class="mw-editsection"><span class="mw-editsection-bracket">[</span><a href="/index.php?title=Parser_test&amp;action=edit&amp;section=2" title="Edit section: Section 4">edit</a><span class="mw-editsection-bracket">]</span></span></h2>
!! end
@@ -7725,8 +10749,8 @@ __NOEDITSECTION__
==Section 1==
==Section 2==
!! result
-<h2> <span class="mw-headline" id="Section_1">Section 1</span></h2>
-<h2> <span class="mw-headline" id="Section_2">Section 2</span></h2>
+<h2><span class="mw-headline" id="Section_1">Section 1</span></h2>
+<h2><span class="mw-headline" id="Section_2">Section 2</span></h2>
!! end
@@ -7735,7 +10759,7 @@ Link inside a section heading
!! input
==Section with a [[Main Page|link]] in it==
!! result
-<h2><span class="editsection">[<a href="/index.php?title=Parser_test&amp;action=edit&amp;section=1" title="Edit section: Section with a link in it">edit</a>]</span> <span class="mw-headline" id="Section_with_a_link_in_it">Section with a <a href="/wiki/Main_Page" title="Main Page">link</a> in it</span></h2>
+<h2><span class="mw-headline" id="Section_with_a_link_in_it">Section with a <a href="/wiki/Main_Page" title="Main Page">link</a> in it</span><span class="mw-editsection"><span class="mw-editsection-bracket">[</span><a href="/index.php?title=Parser_test&amp;action=edit&amp;section=1" title="Edit section: Section with a link in it">edit</a><span class="mw-editsection-bracket">]</span></span></h2>
!! end
@@ -7747,7 +10771,7 @@ __TOC__
=== title 1.1 ===
== title 2 ==
!! result
-<table id="toc" class="toc"><tr><td><div id="toctitle"><h2>Contents</h2></div>
+<div id="toc" class="toc"><div id="toctitle"><h2>Contents</h2></div>
<ul>
<li class="toclevel-1 tocsection-1"><a href="#title_1"><span class="tocnumber">1</span> <span class="toctext">title 1</span></a>
<ul>
@@ -7756,10 +10780,11 @@ __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>
-<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>
+</div>
+
+<h2><span class="mw-headline" id="title_1">title 1</span><span class="mw-editsection"><span class="mw-editsection-bracket">[</span><a href="/index.php?title=Parser_test&amp;action=edit&amp;section=1" title="Edit section: title 1">edit</a><span class="mw-editsection-bracket">]</span></span></h2>
+<h3><span class="mw-headline" id="title_1.1">title 1.1</span><span class="mw-editsection"><span class="mw-editsection-bracket">[</span><a href="/index.php?title=Parser_test&amp;action=edit&amp;section=2" title="Edit section: title 1.1">edit</a><span class="mw-editsection-bracket">]</span></span></h3>
+<h2><span class="mw-headline" id="title_2">title 2</span><span class="mw-editsection"><span class="mw-editsection-bracket">[</span><a href="/index.php?title=Parser_test&amp;action=edit&amp;section=3" title="Edit section: title 2">edit</a><span class="mw-editsection-bracket">]</span></span></h2>
!! end
@@ -7781,10 +10806,10 @@ 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>
+<h1><span class="mw-headline" id=".3D">=</span><span class="mw-editsection"><span class="mw-editsection-bracket">[</span><a href="/index.php?title=Parser_test&amp;action=edit&amp;section=1" title="Edit section: =">edit</a><span class="mw-editsection-bracket">]</span></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>
+<h1><span class="mw-headline" id=".3D_2">=</span><span class="mw-editsection"><span class="mw-editsection-bracket">[</span><a href="/index.php?title=Parser_test&amp;action=edit&amp;section=2" title="Edit section: =">edit</a><span class="mw-editsection-bracket">]</span></span></h1>
<p>But just in case it doesn't...
</p>
!! end
@@ -7811,7 +10836,7 @@ 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>
+<div id="toc" class="toc"><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>
@@ -7819,20 +10844,21 @@ section 5
<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>
+</div>
+
+<h2><span class="mw-headline" id="text_.3E_text">text &gt; text</span><span class="mw-editsection"><span class="mw-editsection-bracket">[</span><a href="/index.php?title=Parser_test&amp;action=edit&amp;section=1" title="Edit section: text > text">edit</a><span class="mw-editsection-bracket">]</span></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>
+<h2><span class="mw-headline" id="text_.3C_text">text &lt; text</span><span class="mw-editsection"><span class="mw-editsection-bracket">[</span><a href="/index.php?title=Parser_test&amp;action=edit&amp;section=2" title="Edit section: text &lt; text">edit</a><span class="mw-editsection-bracket">]</span></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>
+<h2><span class="mw-headline" id="text_.26_text">text &amp; text</span><span class="mw-editsection"><span class="mw-editsection-bracket">[</span><a href="/index.php?title=Parser_test&amp;action=edit&amp;section=3" title="Edit section: text &amp; text">edit</a><span class="mw-editsection-bracket">]</span></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>
+<h2><span class="mw-headline" id="text_.27_text">text ' text</span><span class="mw-editsection"><span class="mw-editsection-bracket">[</span><a href="/index.php?title=Parser_test&amp;action=edit&amp;section=4" title="Edit section: text ' text">edit</a><span class="mw-editsection-bracket">]</span></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>
+<h2><span class="mw-headline" id="text_.22_text">text " text</span><span class="mw-editsection"><span class="mw-editsection-bracket">[</span><a href="/index.php?title=Parser_test&amp;action=edit&amp;section=5" title="Edit section: text &quot; text">edit</a><span class="mw-editsection-bracket">]</span></span></h2>
<p>section 5
</p>
!! end
@@ -7846,18 +10872,59 @@ Headers with excess '=' characters
=''italic'' heading==
==''italic'' heading=
!! result
-<table id="toc" class="toc"><tr><td><div id="toctitle"><h2>Contents</h2></div>
+<div id="toc" class="toc"><div id="toctitle"><h2>Contents</h2></div>
<ul>
<li class="toclevel-1 tocsection-1"><a href="#foo.3D"><span class="tocnumber">1</span> <span class="toctext">foo=</span></a></li>
<li class="toclevel-1 tocsection-2"><a href="#.3Dfoo"><span class="tocnumber">2</span> <span class="toctext">=foo</span></a></li>
<li class="toclevel-1 tocsection-3"><a href="#italic_heading.3D"><span class="tocnumber">3</span> <span class="toctext"><i>italic</i> heading=</span></a></li>
<li class="toclevel-1 tocsection-4"><a href="#.3Ditalic_heading"><span class="tocnumber">4</span> <span class="toctext">=<i>italic</i> heading</span></a></li>
</ul>
-</td></tr></table>
-<h1><span class="editsection">[<a href="/index.php?title=Parser_test&amp;action=edit&amp;section=1" title="Edit section: foo=">edit</a>]</span> <span class="mw-headline" id="foo.3D">foo=</span></h1>
-<h1><span class="editsection">[<a href="/index.php?title=Parser_test&amp;action=edit&amp;section=2" title="Edit section: =foo">edit</a>]</span> <span class="mw-headline" id=".3Dfoo">=foo</span></h1>
-<h1><span class="editsection">[<a href="/index.php?title=Parser_test&amp;action=edit&amp;section=3" title="Edit section: italic heading=">edit</a>]</span> <span class="mw-headline" id="italic_heading.3D"><i>italic</i> heading=</span></h1>
-<h1><span class="editsection">[<a href="/index.php?title=Parser_test&amp;action=edit&amp;section=4" title="Edit section: =italic heading">edit</a>]</span> <span class="mw-headline" id=".3Ditalic_heading">=<i>italic</i> heading</span></h1>
+</div>
+
+<h1><span class="mw-headline" id="foo.3D">foo=</span><span class="mw-editsection"><span class="mw-editsection-bracket">[</span><a href="/index.php?title=Parser_test&amp;action=edit&amp;section=1" title="Edit section: foo=">edit</a><span class="mw-editsection-bracket">]</span></span></h1>
+<h1><span class="mw-headline" id=".3Dfoo">=foo</span><span class="mw-editsection"><span class="mw-editsection-bracket">[</span><a href="/index.php?title=Parser_test&amp;action=edit&amp;section=2" title="Edit section: =foo">edit</a><span class="mw-editsection-bracket">]</span></span></h1>
+<h1><span class="mw-headline" id="italic_heading.3D"><i>italic</i> heading=</span><span class="mw-editsection"><span class="mw-editsection-bracket">[</span><a href="/index.php?title=Parser_test&amp;action=edit&amp;section=3" title="Edit section: italic heading=">edit</a><span class="mw-editsection-bracket">]</span></span></h1>
+<h1><span class="mw-headline" id=".3Ditalic_heading">=<i>italic</i> heading</span><span class="mw-editsection"><span class="mw-editsection-bracket">[</span><a href="/index.php?title=Parser_test&amp;action=edit&amp;section=4" title="Edit section: =italic heading">edit</a><span class="mw-editsection-bracket">]</span></span></h1>
+
+!! end
+
+!! test
+HTML headers vs TOC (bug 23393)
+(__NOEDITSECTION__ for clearer output, doesn't matter here)
+!! input
+<h1>Header 1</h1>
+== Header 1.1 ==
+== Header 1.2 ==
+
+<h1>Header 2
+</h1>
+== Header 2.1 ==
+== Header 2.2 ==
+__NOEDITSECTION__
+!! result
+<div id="toc" class="toc"><div id="toctitle"><h2>Contents</h2></div>
+<ul>
+<li class="toclevel-1"><a href="#Header_1"><span class="tocnumber">1</span> <span class="toctext">Header 1</span></a>
+<ul>
+<li class="toclevel-2 tocsection-1"><a href="#Header_1.1"><span class="tocnumber">1.1</span> <span class="toctext">Header 1.1</span></a></li>
+<li class="toclevel-2 tocsection-2"><a href="#Header_1.2"><span class="tocnumber">1.2</span> <span class="toctext">Header 1.2</span></a></li>
+</ul>
+</li>
+<li class="toclevel-1"><a href="#Header_2"><span class="tocnumber">2</span> <span class="toctext">Header 2</span></a>
+<ul>
+<li class="toclevel-2 tocsection-3"><a href="#Header_2.1"><span class="tocnumber">2.1</span> <span class="toctext">Header 2.1</span></a></li>
+<li class="toclevel-2 tocsection-4"><a href="#Header_2.2"><span class="tocnumber">2.2</span> <span class="toctext">Header 2.2</span></a></li>
+</ul>
+</li>
+</ul>
+</div>
+
+<h1><span class="mw-headline" id="Header_1">Header 1</span></h1>
+<h2><span class="mw-headline" id="Header_1.1">Header 1.1</span></h2>
+<h2><span class="mw-headline" id="Header_1.2">Header 1.2</span></h2>
+<h1><span class="mw-headline" id="Header_2">Header 2</span></h1>
+<h2><span class="mw-headline" id="Header_2.1">Header 2.1</span></h2>
+<h2><span class="mw-headline" id="Header_2.2">Header 2.2</span></h2>
!! end
@@ -7953,7 +11020,7 @@ div with illegal double attributes
!! test
div with empty attribute value, space before equals
!! options
-disabled
+parsoid
!! input
<div class =>HTML rocks</div>
!! result
@@ -7966,7 +11033,7 @@ disabled
!! test
div with braces in attribute value
!! options
-disabled
+parsoid
!! input
<div title="{}">Foo</div>
!! result
@@ -7983,7 +11050,7 @@ disabled
!! test
div with empty attribute value, no space before equals
!! options
-disabled
+parsoid
!! input
<div class=>HTML rocks</div>
!! result
@@ -8079,6 +11146,81 @@ I always thought &xacute; was a cute letter.
###
+### Nesting tests (see bug 41545, 50604, 51081)
+###
+
+# This test case is fixed in Parsoid by domino 1.0.12. (bug 50604)
+# Note that html2wt is considerably more difficult if we use <b> in
+# the test case, instead of <big>
+!! test
+Ensure that HTML adoption agency algorithm is properly implemented.
+!! input
+<big>X<big>Y</big>Z</big>
+!! result
+<p><big>X<big>Y</big>Z</big>
+</p>
+!! end
+
+# This was bug 41545 in the PHP parser.
+!! test
+Nesting of <kbd>
+!! input
+<kbd>X<kbd>Y</kbd>Z</kbd>
+!! result
+<p><kbd>X<kbd>Y</kbd>Z</kbd>
+</p>
+!! end
+
+# The following cases were bug 51081 in the PHP parser.
+# Note that there are some other nestable tags (b, i, etc) which are
+# not covered; see bug 51081 for discussion.
+!! test
+Nesting of <em>
+!! input
+<em>X<em>Y</em>Z</em>
+!! result
+<p><em>X<em>Y</em>Z</em>
+</p>
+!! end
+
+!! test
+Nesting of <strong>
+!! input
+<strong>X<strong>Y</strong>Z</strong>
+!! result
+<p><strong>X<strong>Y</strong>Z</strong>
+</p>
+!! end
+
+!! test
+Nesting of <q>
+!! input
+<q>X<q>Y</q>Z</q>
+!! result
+<p><q>X<q>Y</q>Z</q>
+</p>
+!! end
+
+!! test
+Nesting of <ruby>
+!! input
+<ruby>X<ruby>Y</ruby>Z</ruby>
+!! result
+<p><ruby>X<ruby>Y</ruby>Z</ruby>
+</p>
+!! end
+
+!! test
+Nesting of <bdo>
+!! input
+<bdo>X<bdo>Y</bdo>Z</bdo>
+!! result
+<p><bdo>X<bdo>Y</bdo>Z</bdo>
+</p>
+!! end
+
+
+###
### Media links
###
@@ -8470,70 +11612,6 @@ MSIE CSS safety test: comment in expression
!! end
-!! test
-CSS safety test: vertical tab
-!! input
-<p style="font-size: 100px; background-image:url\b(https://www.google.com/images/srpr/logo6w.png)">A</p>
-!! result
-<p style="/* invalid control char */">A</p>
-
-!! end
-
-!! test
-MSIE CSS safety test: Fullwidth
-!! input
-<p style="font-size: 100px; color: exï½ï½’essiï½ï½Ž((title='XSSed'),'red')">A</p>
-<div style="top:EXPRESSION(alert())">B</div>
-!! result
-<p style="/* insecure input */">A</p>
-<div style="/* insecure input */">B</div>
-
-!! end
-
-!! test
-MSIE CSS safety test: IPA extensions
-!! input
-<div style="background-image:uʀʟ(javascript:alert())">A</div>
-<p style="font-size: 100px; color: expʀessɪoɴ((title='XSSed'),'red')">B</p>
-!! result
-<div style="/* insecure input */">A</div>
-<p style="/* insecure input */">B</p>
-
-!! end
-
-!! test
-MSIE CSS safety test: sup/sub script
-!! input
-<div style="background-image:urlâ½javascript:alert())">A</div>
-<div style="background-image:urlâ‚javascript:alert())">B</div>
-<p style="font-size: 100px; color: expressioâ¿((title='XSSed'),'red')">C</p>
-!! result
-<div style="/* insecure input */">A</div>
-<div style="/* insecure input */">B</div>
-<p style="/* insecure input */">C</p>
-
-!! end
-
-!! test
-MSIE CSS safety test: Repetition markers
-!! input
-<p style="font-size: 100px; color: expres〱ion((title='XSSed'),'red')">A</p>
-<p style="font-size: 100px; color: expresã‚ion((title='XSSed'),'red')">B</p>
-<p style="font-size: 100px; color: expresーion((title='XSSed'),'red')">C</p>
-<p style="font-size: 100px; color: expresヽion((title='XSSed'),'red')">D</p>
-<p style="font-size: 100px; color: expresï¹½ion((title='XSSed'),'red')">E</p>
-<p style="font-size: 100px; color: expresï¹¼ion((title='XSSed'),'red')">F</p>
-<p style="font-size: 100px; color: expresï½°ion((title='XSSed'),'red')">G</p>
-!! result
-<p style="/* insecure input */">A</p>
-<p style="/* insecure input */">B</p>
-<p style="/* insecure input */">C</p>
-<p style="/* insecure input */">D</p>
-<p style="/* insecure input */">E</p>
-<p style="/* insecure input */">F</p>
-<p style="/* insecure input */">G</p>
-
-!! end
!! test
Table attribute legitimate extension
@@ -8617,7 +11695,7 @@ Expansion of multi-line templates in attribute values (bug 6255 sanity check 2)
!! end
###
-### Parser hooks (see maintenance/parserTestsParserHook.php for the <tag> extension)
+### Parser hooks (see tests/parser/parserTestsParserHook.php for the <tag> extension)
###
!! test
Parser hook: empty input
@@ -8782,7 +11860,7 @@ array (
!! end
###
-### (see maintenance/parserTestsStaticParserHook.php for the <statictag> extension)
+### (see tests/parser/parserTestsParserHook.php for the <statictag> extension)
###
!! test
@@ -9014,8 +12092,10 @@ disabled
!! result
<ul>
<li>One
-</li><li>Two
-</li></ul>
+</li>
+<li>Two
+</li>
+</ul>
!! end
@@ -9046,8 +12126,10 @@ disabled
!! result
<ol>
<li>One
-</li><li>Two
-</li></ol>
+</li>
+<li>Two
+</li>
+</ol>
!! end
@@ -9092,12 +12174,16 @@ disabled
!! result
<ul>
<li>One
-</li><li>Two:
+</li>
+<li>Two:
<ul>
<li>Sub-one
-</li><li>Sub-two
-</li></ul>
-</li></ul>
+</li>
+<li>Sub-two
+</li>
+</ul>
+</li>
+</ul>
!! end
@@ -9142,21 +12228,27 @@ disabled
!! result
<ol>
<li>One
-</li><li>Two:
+</li>
+<li>Two:
<ol>
<li>Sub-one
-</li><li>Sub-two
-</li></ol>
-</li></ol>
+</li>
+<li>Sub-two
+</li>
+</ol>
+</li>
+</ol>
!! end
!! test
HTML ordered list item with parameters oddity
!! input
-<ol><li id="fragment">One</li></ol>
+<ol><li id="fragment">One</li>
+</ol>
!! result
-<ol><li id="fragment">One</li></ol>
+<ol><li id="fragment">One</li>
+</ol>
!! end
@@ -9208,12 +12300,13 @@ Fuzz testing: Parser14
== onmouseover= ==
http://__TOC__
!! result
-<h2><span class="editsection">[<a href="/index.php?title=Parser_test&amp;action=edit&amp;section=1" title="Edit section: onmouseover=">edit</a>]</span> <span class="mw-headline" id="onmouseover.3D"> onmouseover= </span></h2>
-http://<table id="toc" class="toc"><tr><td><div id="toctitle"><h2>Contents</h2></div>
+<h2><span class="mw-headline" id="onmouseover.3D">onmouseover=</span><span class="mw-editsection"><span class="mw-editsection-bracket">[</span><a href="/index.php?title=Parser_test&amp;action=edit&amp;section=1" title="Edit section: onmouseover=">edit</a><span class="mw-editsection-bracket">]</span></span></h2>
+http://<div id="toc" class="toc"><div id="toctitle"><h2>Contents</h2></div>
<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>
+</div>
+
!! end
@@ -9223,7 +12316,7 @@ Fuzz testing: Parser14-table
==a==
{| STYLE=__TOC__
!! result
-<h2><span class="editsection">[<a href="/index.php?title=Parser_test&amp;action=edit&amp;section=1" title="Edit section: a">edit</a>]</span> <span class="mw-headline" id="a">a</span></h2>
+<h2><span class="mw-headline" id="a">a</span><span class="mw-editsection"><span class="mw-editsection-bracket">[</span><a href="/index.php?title=Parser_test&amp;action=edit&amp;section=1" title="Edit section: a">edit</a><span class="mw-editsection-bracket">]</span></span></h2>
<table style="&#95;_TOC&#95;_">
<tr><td></td></tr>
</table>
@@ -9369,7 +12462,7 @@ Fuzz testing: image with bogus manual thumbnail
!!input
[[Image:foobar.jpg|thumbnail= ]]
!!result
-<div class="thumb tright"><div class="thumbinner" style="width:1943px;">Error creating thumbnail: <div class="thumbcaption"></div></div></div>
+<div class="thumb tright"><div class="thumbinner" style="width:182px;">Error creating thumbnail: <div class="thumbcaption"></div></div></div>
!!end
@@ -10380,17 +13473,33 @@ Handling of &#x0A; in URLs
!! input
**irc://&#x0A;a
!! result
-<ul><li><ul><li><a rel="nofollow" class="external free" href="irc://%0Aa">irc://%0Aa</a>
-</li></ul>
-</li></ul>
+<ul>
+<li><ul>
+<li><a rel="nofollow" class="external free" href="irc://%0Aa">irc://%0Aa</a>
+</li>
+</ul>
+</li>
+</ul>
!!end
!! test
-5 quotes, code coverage +1 line
+5 quotes, code coverage +1 line (php)
+!! options
+php
+!! input
+'''''
+!! result
+!! end
+# The PHP parser strips the empty tags out for giggles; parsoid doesn't.
+!! test
+5 quotes, code coverage +1 line (parsoid)
+!! options
+parsoid
!! input
'''''
!! result
+<p><b><i></i></b></p>
!! end
!! test
@@ -10404,43 +13513,78 @@ Special:Search page linking.
!! test
Say the magic word
+!! options
+title=[[Parser test]]
!! input
* {{PAGENAME}}
+* {{PAGENAMEE}}
+* {{FULLPAGENAME}}
+* {{FULLPAGENAMEE}}
* {{BASEPAGENAME}}
+* {{BASEPAGENAMEE}}
* {{SUBPAGENAME}}
* {{SUBPAGENAMEE}}
-* {{BASEPAGENAME}}
-* {{BASEPAGENAMEE}}
+* {{ROOTPAGENAME}}
+* {{ROOTPAGENAMEE}}
* {{TALKPAGENAME}}
* {{TALKPAGENAMEE}}
* {{SUBJECTPAGENAME}}
* {{SUBJECTPAGENAMEE}}
* {{NAMESPACEE}}
* {{NAMESPACE}}
+* {{NAMESPACENUMBER}}
* {{TALKSPACE}}
* {{TALKSPACEE}}
* {{SUBJECTSPACE}}
* {{SUBJECTSPACEE}}
* {{Dynamic|{{NUMBEROFUSERS}}|{{NUMBEROFPAGES}}|{{CURRENTVERSION}}|{{CONTENTLANGUAGE}}|{{DIRECTIONMARK}}|{{CURRENTTIMESTAMP}}|{{NUMBEROFARTICLES}}}}
!! result
-<ul><li> Parser test
-</li><li> Parser test
-</li><li> Parser test
-</li><li> Parser_test
-</li><li> Parser test
-</li><li> Parser_test
-</li><li> Talk:Parser test
-</li><li> Talk:Parser_test
-</li><li> Parser test
-</li><li> Parser_test
-</li><li>
-</li><li>
-</li><li> Talk
-</li><li> Talk
-</li><li>
-</li><li>
-</li><li> <a href="/index.php?title=Template:Dynamic&amp;action=edit&amp;redlink=1" class="new" title="Template:Dynamic (page does not exist)">Template:Dynamic</a>
-</li></ul>
+<ul>
+<li> Parser test
+</li>
+<li> Parser_test
+</li>
+<li> Parser test
+</li>
+<li> Parser_test
+</li>
+<li> Parser test
+</li>
+<li> Parser_test
+</li>
+<li> Parser test
+</li>
+<li> Parser_test
+</li>
+<li> Parser test
+</li>
+<li> Parser_test
+</li>
+<li> Talk:Parser test
+</li>
+<li> Talk:Parser_test
+</li>
+<li> Parser test
+</li>
+<li> Parser_test
+</li>
+<li>
+</li>
+<li>
+</li>
+<li> 0
+</li>
+<li> Talk
+</li>
+<li> Talk
+</li>
+<li>
+</li>
+<li>
+</li>
+<li> <a href="/index.php?title=Template:Dynamic&amp;action=edit&amp;redlink=1" class="new" title="Template:Dynamic (page does not exist)">Template:Dynamic</a>
+</li>
+</ul>
!! end
### Note: Above tests excludes the "{{NUMBEROFADMINS}}" magic word because it generates a MySQL error when included.
@@ -10459,40 +13603,40 @@ image4 |300px| centre
* image6
</gallery>
!! result
-<ul class="gallery">
+<ul class="gallery mw-gallery-traditional">
<li class="gallerybox" style="width: 155px"><div style="width: 155px">
- <div style="height: 150px;">Image1.png</div>
+ <div class="thumb" style="height: 150px;">Image1.png</div>
<div class="gallerytext">
</div>
</div></li>
<li class="gallerybox" style="width: 155px"><div style="width: 155px">
- <div style="height: 150px;">Image2.gif</div>
+ <div class="thumb" style="height: 150px;">Image2.gif</div>
<div class="gallerytext">
<p>||||
</p>
</div>
</div></li>
<li class="gallerybox" style="width: 155px"><div style="width: 155px">
- <div style="height: 150px;">Image3</div>
+ <div class="thumb" style="height: 150px;">Image3</div>
<div class="gallerytext">
</div>
</div></li>
<li class="gallerybox" style="width: 155px"><div style="width: 155px">
- <div style="height: 150px;">Image4</div>
+ <div class="thumb" style="height: 150px;">Image4</div>
<div class="gallerytext">
<p>300px| centre
</p>
</div>
</div></li>
<li class="gallerybox" style="width: 155px"><div style="width: 155px">
- <div style="height: 150px;">Image5.svg</div>
+ <div class="thumb" style="height: 150px;">Image5.svg</div>
<div class="gallerytext">
<p><a rel="nofollow" class="external free" href="http://///////">http://///////</a>
</p>
</div>
</div></li>
<li class="gallerybox" style="width: 155px"><div style="width: 155px">
- <div style="height: 150px;">* image6</div>
+ <div class="thumb" style="height: 150px;">* image6</div>
<div class="gallerytext">
</div>
</div></li>
@@ -10511,17 +13655,17 @@ image:foobar.jpg
image:foobar.jpg|Blabla|alt=This is a foo-bar.|blabla.
</gallery>
!! result
-<ul class="gallery" style="max-width: 226px;_width: 226px;">
+<ul class="gallery mw-gallery-traditional" style="max-width: 226px;_width: 226px;">
<li class='gallerycaption'>Foo <a href="/wiki/Main_Page" title="Main Page">Main Page</a></li>
<li class="gallerybox" style="width: 105px"><div style="width: 105px">
- <div style="height: 70px;">Nonexistant.jpg</div>
+ <div class="thumb" style="height: 70px;">Nonexistant.jpg</div>
<div class="gallerytext">
<p>caption
</p>
</div>
</div></li>
<li class="gallerybox" style="width: 105px"><div style="width: 105px">
- <div style="height: 70px;">Nonexistant.jpg</div>
+ <div class="thumb" style="height: 70px;">Nonexistant.jpg</div>
<div class="gallerytext">
</div>
</div></li>
@@ -10556,7 +13700,7 @@ File:foobar.jpg|[[File:foobar.jpg|20px|desc|alt=inneralt]]|alt=galleryalt
File:foobar.jpg|{{Test|unamedParam|alt=param}}|alt=galleryalt
</gallery>
!! result
-<ul class="gallery">
+<ul class="gallery mw-gallery-traditional">
<li class="gallerybox" style="width: 155px"><div style="width: 155px">
<div class="thumb" style="width: 150px;"><div style="margin:68px auto;"><a href="/wiki/File:Foobar.jpg" class="image"><img alt="galleryalt" src="http://example.com/images/thumb/3/3a/Foobar.jpg/120px-Foobar.jpg" width="120" height="14" /></a></div></div>
<div class="gallerytext">
@@ -10585,9 +13729,9 @@ image:foobar.jpg|some '''caption''' [[Main Page]]
File:Foobar.jpg
</gallery>
!! result
-<ul class="gallery">
+<ul class="gallery mw-gallery-traditional">
<li class="gallerybox" style="width: 155px"><div style="width: 155px">
- <div style="height: 150px;">Nonexistant.jpg</div>
+ <div class="thumb" 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
@@ -10595,7 +13739,7 @@ caption
</div>
</div></li>
<li class="gallerybox" style="width: 155px"><div style="width: 155px">
- <div style="height: 150px;">Nonexistant.jpg</div>
+ <div class="thumb" 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>
@@ -10630,14 +13774,14 @@ image:foobar.jpg
foobar.jpg
</gallery>
!! result
-<ul class="gallery">
+<ul class="gallery mw-gallery-traditional">
<li class="gallerybox" style="width: 155px"><div style="width: 155px">
- <div style="height: 150px;">Nonexistant.jpg</div>
+ <div class="thumb" style="height: 150px;">Nonexistant.jpg</div>
<div class="gallerytext">
</div>
</div></li>
<li class="gallerybox" style="width: 155px"><div style="width: 155px">
- <div style="height: 150px;">Nonexistant.jpg</div>
+ <div class="thumb" style="height: 150px;">Nonexistant.jpg</div>
<div class="gallerytext">
</div>
</div></li>
@@ -10828,13 +13972,25 @@ disabled
!! input
:;;;::
!! result
-<dl><dd><dl><dt><dl><dt><dl><dt><dl><dd><dl><dd>
-</dd></dl>
-</dd></dl>
-</dt></dl>
-</dt></dl>
-</dt></dl>
-</dd></dl>
+<dl>
+<dd><dl>
+<dt><dl>
+<dt><dl>
+<dt><dl>
+<dd><dl>
+<dd>
+</dd>
+</dl>
+</dd>
+</dl>
+</dt>
+</dl>
+</dt>
+</dl>
+</dt>
+</dl>
+</dd>
+</dl>
!!end
@@ -10861,7 +14017,7 @@ Images with the "|" character in the comment
!! test
HTML with raw HTML ($wgRawHtml==true)
!! options
-rawhtml
+wgRawHtml=1
!! input
<html><script>alert(1);</script></html>
!! result
@@ -10930,6 +14086,45 @@ subpage title=[[Subpage test/L1/L2/L3]]
</p>
!! end
+!! article
+Subpage test/L1/L2/L3Sibling
+!! text
+Sibling article
+!! endarticle
+
+!! test
+Transclusion of a sibling page (one level up)
+!! options
+subpage title=[[Subpage test/L1/L2/L3]]
+!! input
+{{../L3Sibling}}
+!! result
+<p>Sibling article
+</p>
+!! end
+
+!! test
+Transclusion of a child page
+!! options
+subpage title=[[Subpage test/L1/L2]]
+!! input
+{{/L3Sibling}}
+!! result
+<p>Sibling article
+</p>
+!! end
+
+!! test
+Non-transclusion because of too many up levels
+!! options
+subpage title=[[Subpage test/L1/L2/L3]]
+!! input
+{{../../../../More than parent}}
+!! result
+<p>{{../../../../More than parent}}
+</p>
+!! end
+
!! test
Definition list code coverage
!! input
@@ -10937,10 +14132,17 @@ Definition list code coverage
; title : def
;title: def
!! result
-<dl><dt> title &#160;</dt><dd> def
-</dd><dt> title&#160;</dt><dd> def
-</dd><dt>title</dt><dd> def
-</dd></dl>
+<dl>
+<dt> title &#160;</dt>
+<dd> def
+</dd>
+<dt> title&#160;</dt>
+<dd> def
+</dd>
+<dt>title</dt>
+<dd> def
+</dd>
+</dl>
!! end
@@ -11004,7 +14206,7 @@ Inclusion of !userCanEdit() content
!! input
{{MediaWiki:Fake}}
!! result
-<h2><span class="editsection">[<a href="/index.php?title=MediaWiki:Fake&amp;action=edit&amp;section=T-1" title="MediaWiki:Fake">edit</a>]</span> <span class="mw-headline" id="header">header</span></h2>
+<h2><span class="mw-headline" id="header">header</span><span class="mw-editsection"><span class="mw-editsection-bracket">[</span><a href="/index.php?title=MediaWiki:Fake&amp;action=edit&amp;section=T-1" title="MediaWiki:Fake">edit</a><span class="mw-editsection-bracket">]</span></span></h2>
!! end
@@ -11019,7 +14221,7 @@ Out-of-order TOC heading levels
=====5=====
==2==
!! result
-<table id="toc" class="toc"><tr><td><div id="toctitle"><h2>Contents</h2></div>
+<div id="toc" class="toc"><div id="toctitle"><h2>Contents</h2></div>
<ul>
<li class="toclevel-1 tocsection-1"><a href="#2"><span class="tocnumber">1</span> <span class="toctext">2</span></a>
<ul>
@@ -11034,13 +14236,14 @@ Out-of-order TOC heading levels
</ul>
</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: 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>
-<h1><span class="editsection">[<a href="/index.php?title=Parser_test&amp;action=edit&amp;section=4" title="Edit section: 1">edit</a>]</span> <span class="mw-headline" id="1">1</span></h1>
-<h5><span class="editsection">[<a href="/index.php?title=Parser_test&amp;action=edit&amp;section=5" title="Edit section: 5">edit</a>]</span> <span class="mw-headline" id="5">5</span></h5>
-<h2><span class="editsection">[<a href="/index.php?title=Parser_test&amp;action=edit&amp;section=6" title="Edit section: 2">edit</a>]</span> <span class="mw-headline" id="2_2">2</span></h2>
+</div>
+
+<h2><span class="mw-headline" id="2">2</span><span class="mw-editsection"><span class="mw-editsection-bracket">[</span><a href="/index.php?title=Parser_test&amp;action=edit&amp;section=1" title="Edit section: 2">edit</a><span class="mw-editsection-bracket">]</span></span></h2>
+<h6><span class="mw-headline" id="6">6</span><span class="mw-editsection"><span class="mw-editsection-bracket">[</span><a href="/index.php?title=Parser_test&amp;action=edit&amp;section=2" title="Edit section: 6">edit</a><span class="mw-editsection-bracket">]</span></span></h6>
+<h3><span class="mw-headline" id="3">3</span><span class="mw-editsection"><span class="mw-editsection-bracket">[</span><a href="/index.php?title=Parser_test&amp;action=edit&amp;section=3" title="Edit section: 3">edit</a><span class="mw-editsection-bracket">]</span></span></h3>
+<h1><span class="mw-headline" id="1">1</span><span class="mw-editsection"><span class="mw-editsection-bracket">[</span><a href="/index.php?title=Parser_test&amp;action=edit&amp;section=4" title="Edit section: 1">edit</a><span class="mw-editsection-bracket">]</span></span></h1>
+<h5><span class="mw-headline" id="5">5</span><span class="mw-editsection"><span class="mw-editsection-bracket">[</span><a href="/index.php?title=Parser_test&amp;action=edit&amp;section=5" title="Edit section: 5">edit</a><span class="mw-editsection-bracket">]</span></span></h5>
+<h2><span class="mw-headline" id="2_2">2</span><span class="mw-editsection"><span class="mw-editsection-bracket">[</span><a href="/index.php?title=Parser_test&amp;action=edit&amp;section=6" title="Edit section: 2">edit</a><span class="mw-editsection-bracket">]</span></span></h2>
!! end
@@ -11147,14 +14350,11 @@ anchorencode encodes like the TOC generator: (bug 18431)
{{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>
+<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
@@ -11167,7 +14367,8 @@ bar
baz
!! result
<blockquote>
-foo
+<p>foo
+</p>
</blockquote>
<p>bar
</p>
@@ -11196,6 +14397,27 @@ bar
</pre>
!! end
+!!test
+Parsing of overlapping (improperly nested) inline html tags (PHP parser)
+!!options
+php
+!!input
+<span><s>x</span></s>
+!!result
+<p><span><s>x&lt;/span&gt;</s></span>
+</p>
+!!end
+
+!!test
+Parsing of overlapping (improperly nested) inline html tags (Parsoid)
+!!options
+parsoid
+!!input
+<span><s>x</span></s>
+!!result
+<p><span><s>x</s></span><s></s>
+</p>
+!!end
###
### Language variants related tests
@@ -11229,6 +14451,17 @@ title=[[Duna]] language=sr
!! end
!! test
+Link to a section of a variant of this title shouldn't be parsed as self-link
+!! options
+title=[[Duna]] language=sr
+!! input
+[[Dуна]] is a self-link while [[Dunа#Foo]] and [[Dуна#Foo]] are not self-links.
+!! result
+<p><strong class="selflink">Dуна</strong> is a self-link while <a href="/wiki/%D0%94%D1%83%D0%BD%D0%B0" title="Дуна">Dunа#Foo</a> and <a href="/wiki/%D0%94%D1%83%D0%BD%D0%B0" title="Дуна">Dуна#Foo</a> are not self-links.
+</p>
+!! end
+
+!! test
Link to pages in language variants
!! options
language=sr
@@ -11377,7 +14610,7 @@ language=sr variant=sr-ec
!! input
== -{Naslov}- ==
!! result
-<h2><span class="editsection">[<a href="/index.php?title=Parser_test&amp;action=edit&amp;section=1" title="Уредите одељак „Naslov“">уреди</a>]</span> <span class="mw-headline" id="-.7BNaslov.7D-"> Naslov </span></h2>
+<h2><span class="mw-headline" id="-.7BNaslov.7D-">Naslov</span><span class="mw-editsection"><span class="mw-editsection-bracket">[</span><a href="/index.php?title=Parser_test&amp;action=edit&amp;section=1" title="Уредите одељак „Naslov“">уреди</a><span class="mw-editsection-bracket">]</span></span></h2>
!! end
@@ -11491,6 +14724,30 @@ This won't take interferes with the title rule.
!! end
!! test
+Partly disable title conversion if variant == main language code
+!! options
+language=zh variant=zh title=[[ZH]] showtitle
+!! input
+-{T|zh-cn:CN;zh-tw:TW}-
+!! result
+ZH
+<p>
+</p>
+!! end
+
+!! test
+Partly disable title conversion if variant == main language code, more
+!! options
+language=zh variant=zh title=[[ZH]] showtitle
+!! input
+-{T|TW}-
+!! result
+ZH
+<p>
+</p>
+!! end
+
+!! test
Raw output of variant escape tags (R flag)
!! options
language=zh variant=zh-tw
@@ -11568,20 +14825,17 @@ language=sr
</p>
!!end
-!!article
-Template:Bullet
-!!text
-* Bar
-!!endarticle
-
!! test
Bug 529: Uncovered bullet
!! input
* Foo {{bullet}}
!! result
-<ul><li> Foo
-</li><li> Bar
-</li></ul>
+<ul>
+<li> Foo
+</li>
+<li> Bar
+</li>
+</ul>
!! end
@@ -11596,15 +14850,30 @@ Bug 529: Uncovered bullet leaving empty list, normally removed by tidy
!! input
******* Foo {{bullet}}
!! result
-<ul><li><ul><li><ul><li><ul><li><ul><li><ul><li><ul><li> Foo
-</li></ul>
-</li></ul>
-</li></ul>
-</li></ul>
-</li></ul>
-</li></ul>
-</li><li> Bar
-</li></ul>
+<ul>
+<li><ul>
+<li><ul>
+<li><ul>
+<li><ul>
+<li><ul>
+<li><ul>
+<li> Foo
+</li>
+</ul>
+</li>
+</ul>
+</li>
+</ul>
+</li>
+</ul>
+</li>
+</ul>
+</li>
+</ul>
+</li>
+<li> Bar
+</li>
+</ul>
!! end
@@ -11636,9 +14905,12 @@ Bug 529: Uncovered bullet in parser function result
!! input
* Foo {{lc:{{bullet}} }}
!! result
-<ul><li> Foo
-</li><li> bar
-</li></ul>
+<ul>
+<li> Foo
+</li>
+<li> bar
+</li>
+</ul>
!! end
@@ -11694,7 +14966,7 @@ Morwen/13: Unclosed link followed by heading
!! result
<p>[[link
</p>
-<h2><span class="editsection">[<a href="/index.php?title=Parser_test&amp;action=edit&amp;section=1" title="Edit section: heading">edit</a>]</span> <span class="mw-headline" id="heading">heading</span></h2>
+<h2><span class="mw-headline" id="heading">heading</span><span class="mw-editsection"><span class="mw-editsection-bracket">[</span><a href="/index.php?title=Parser_test&amp;action=edit&amp;section=1" title="Edit section: heading">edit</a><span class="mw-editsection-bracket">]</span></span></h2>
!! end
@@ -11706,7 +14978,7 @@ HHP2.1: Heuristics for headings in preprocessor parenthetical structures
!! result
<p>{{foo|
</p>
-<h1> <span class="mw-headline" id="heading">heading</span></h1>
+<h1><span class="mw-headline" id="heading">heading</span></h1>
!! end
@@ -11718,7 +14990,7 @@ HHP2.2: Heuristics for headings in preprocessor parenthetical structures
!! result
<p>{{foo|
</p>
-<h2><span class="editsection">[<a href="/index.php?title=Parser_test&amp;action=edit&amp;section=1" title="Edit section: heading">edit</a>]</span> <span class="mw-headline" id="heading">heading</span></h2>
+<h2><span class="mw-headline" id="heading">heading</span><span class="mw-editsection"><span class="mw-editsection-bracket">[</span><a href="/index.php?title=Parser_test&amp;action=edit&amp;section=1" title="Edit section: heading">edit</a><span class="mw-editsection-bracket">]</span></span></h2>
!! end
@@ -11808,8 +15080,6 @@ B</strong>
# Bug 6200: <blockquote> should behave like <div> with respect to line breaks
!! test
Bug 6200: paragraphs inside blockquotes (no extra line breaks)
-!! options
-disabled
!! input
<blockquote>Line one
@@ -11822,8 +15092,6 @@ Line two</blockquote>
!! test
Bug 6200: paragraphs inside blockquotes (extra line break on open)
-!! options
-disabled
!! input
<blockquote>
Line one
@@ -11839,8 +15107,6 @@ Line two</blockquote>
!! test
Bug 6200: paragraphs inside blockquotes (extra line break on close)
-!! options
-disabled
!! input
<blockquote>Line one
@@ -11856,8 +15122,6 @@ Line two
!! test
Bug 6200: paragraphs inside blockquotes (extra line break on open and close)
-!! options
-disabled
!! input
<blockquote>
Line one
@@ -12078,7 +15342,7 @@ comment title=[[Main Page]]
!! input
pre-comment text /* External links */ removed bogus entries
!! result
-pre-comment text - <a href="/wiki/Main_Page#External_links" title="Main Page">→</a>‎<span dir="auto"><span class="autocomment">External links: </span> removed bogus entries</span>
+pre-comment text <a href="/wiki/Main_Page#External_links" title="Main Page">→</a>‎<span dir="auto"><span class="autocomment">External links: </span> removed bogus entries</span>
!!end
!! test
@@ -12310,6 +15574,40 @@ Screen
!! end
!! test
+Verify that displaytitle handles inline CSS styles (bug 26547) - rejected value
+!! options
+showtitle
+title=[[Screen]]
+!! config
+wgAllowDisplayTitle=true
+wgRestrictDisplayTitle=true
+!! input
+this is not the the title
+{{DISPLAYTITLE:<span style="display: none;">s</span>creen}}
+!! result
+<span style="/* attempt to bypass $wgRestrictDisplayTitle */">s</span>creen
+<p>this is not the the title
+</p>
+!! end
+
+!! test
+Verify that displaytitle handles inline CSS styles (bug 26547) - accepted value
+!! options
+showtitle
+title=[[Screen]]
+!! config
+wgAllowDisplayTitle=true
+wgRestrictDisplayTitle=true
+!! input
+this is not the the title
+{{DISPLAYTITLE:<span style="color: red;">s</span>creen}}
+!! result
+<span style="color: red;">s</span>creen
+<p>this is not the the title
+</p>
+!! end
+
+!! test
preload: check <noinclude> and <includeonly>
!! options
preload
@@ -12533,12 +15831,13 @@ title=[[Main Page]]
__TOC__
== ''Lost'' episodes ==
!! result
-<table id="toc" class="toc"><tr><td><div id="toctitle"><h2>Contents</h2></div>
+<div id="toc" class="toc"><div id="toctitle"><h2>Contents</h2></div>
<ul>
<li class="toclevel-1 tocsection-1"><a href="#Lost_episodes"><span class="tocnumber">1</span> <span class="toctext"><i>Lost</i> episodes</span></a></li>
</ul>
-</td></tr></table>
-<h2><span class="editsection">[<a href="/index.php?title=Main_Page&amp;action=edit&amp;section=1" title="Edit section: Lost episodes">edit</a>]</span> <span class="mw-headline" id="Lost_episodes"> <i>Lost</i> episodes </span></h2>
+</div>
+
+<h2><span class="mw-headline" id="Lost_episodes"><i>Lost</i> episodes</span><span class="mw-editsection"><span class="mw-editsection-bracket">[</span><a href="/index.php?title=Main_Page&amp;action=edit&amp;section=1" title="Edit section: Lost episodes">edit</a><span class="mw-editsection-bracket">]</span></span></h2>
!! end
@@ -12550,12 +15849,13 @@ title=[[Main Page]]
__TOC__
== '''should be bold''' then normal text ==
!! result
-<table id="toc" class="toc"><tr><td><div id="toctitle"><h2>Contents</h2></div>
+<div id="toc" class="toc"><div id="toctitle"><h2>Contents</h2></div>
<ul>
<li class="toclevel-1 tocsection-1"><a href="#should_be_bold_then_normal_text"><span class="tocnumber">1</span> <span class="toctext"><b>should be bold</b> then normal text</span></a></li>
</ul>
-</td></tr></table>
-<h2><span class="editsection">[<a href="/index.php?title=Main_Page&amp;action=edit&amp;section=1" title="Edit section: should be bold then normal text">edit</a>]</span> <span class="mw-headline" id="should_be_bold_then_normal_text"> <b>should be bold</b> then normal text </span></h2>
+</div>
+
+<h2><span class="mw-headline" id="should_be_bold_then_normal_text"><b>should be bold</b> then normal text</span><span class="mw-editsection"><span class="mw-editsection-bracket">[</span><a href="/index.php?title=Main_Page&amp;action=edit&amp;section=1" title="Edit section: should be bold then normal text">edit</a><span class="mw-editsection-bracket">]</span></span></h2>
!! end
@@ -12567,12 +15867,13 @@ title=[[Main Page]]
__TOC__
== Image [[Image:foobar.jpg]] ==
!! result
-<table id="toc" class="toc"><tr><td><div id="toctitle"><h2>Contents</h2></div>
+<div id="toc" class="toc"><div id="toctitle"><h2>Contents</h2></div>
<ul>
<li class="toclevel-1 tocsection-1"><a href="#Image"><span class="tocnumber">1</span> <span class="toctext">Image</span></a></li>
</ul>
-</td></tr></table>
-<h2><span class="editsection">[<a href="/index.php?title=Main_Page&amp;action=edit&amp;section=1" title="Edit section: Image">edit</a>]</span> <span class="mw-headline" id="Image"> Image <a href="/wiki/File:Foobar.jpg" class="image"><img alt="Foobar.jpg" src="http://example.com/images/3/3a/Foobar.jpg" width="1941" height="220" /></a> </span></h2>
+</div>
+
+<h2><span class="mw-headline" id="Image">Image <a href="/wiki/File:Foobar.jpg" class="image"><img alt="Foobar.jpg" src="http://example.com/images/3/3a/Foobar.jpg" width="1941" height="220" /></a></span><span class="mw-editsection"><span class="mw-editsection-bracket">[</span><a href="/index.php?title=Main_Page&amp;action=edit&amp;section=1" title="Edit section: Image">edit</a><span class="mw-editsection-bracket">]</span></span></h2>
!! end
@@ -12584,12 +15885,13 @@ title=[[Main Page]]
__TOC__
== <blockquote>Quote</blockquote> ==
!! result
-<table id="toc" class="toc"><tr><td><div id="toctitle"><h2>Contents</h2></div>
+<div id="toc" class="toc"><div id="toctitle"><h2>Contents</h2></div>
<ul>
<li class="toclevel-1 tocsection-1"><a href="#Quote"><span class="tocnumber">1</span> <span class="toctext">Quote</span></a></li>
</ul>
-</td></tr></table>
-<h2><span class="editsection">[<a href="/index.php?title=Main_Page&amp;action=edit&amp;section=1" title="Edit section: Quote">edit</a>]</span> <span class="mw-headline" id="Quote"> <blockquote>Quote</blockquote> </span></h2>
+</div>
+
+<h2><span class="mw-headline" id="Quote"><blockquote>Quote</blockquote></span><span class="mw-editsection"><span class="mw-editsection-bracket">[</span><a href="/index.php?title=Main_Page&amp;action=edit&amp;section=1" title="Edit section: Quote">edit</a><span class="mw-editsection-bracket">]</span></span></h2>
!! end
@@ -12603,12 +15905,13 @@ __TOC__
<small>Hanc marginis exiguitas non caperet.</small>
QED
!! result
-<table id="toc" class="toc"><tr><td><div id="toctitle"><h2>Contents</h2></div>
+<div id="toc" class="toc"><div id="toctitle"><h2>Contents</h2></div>
<ul>
<li class="toclevel-1 tocsection-1"><a href="#Proof:_2_.3C_3"><span class="tocnumber">1</span> <span class="toctext">Proof: 2 &lt; 3</span></a></li>
</ul>
-</td></tr></table>
-<h2><span class="editsection">[<a href="/index.php?title=Main_Page&amp;action=edit&amp;section=1" title="Edit section: Proof: 2 &lt; 3">edit</a>]</span> <span class="mw-headline" id="Proof:_2_.3C_3"> Proof: 2 &lt; 3 </span></h2>
+</div>
+
+<h2><span class="mw-headline" id="Proof:_2_.3C_3">Proof: 2 &lt; 3</span><span class="mw-editsection"><span class="mw-editsection-bracket">[</span><a href="/index.php?title=Main_Page&amp;action=edit&amp;section=1" title="Edit section: Proof: 2 &lt; 3">edit</a><span class="mw-editsection-bracket">]</span></span></h2>
<p><small>Hanc marginis exiguitas non caperet.</small>
QED
</p>
@@ -12622,14 +15925,15 @@ __TOC__
== <i>Foo</i> <blockquote>Bar</blockquote> ==
!! result
-<table id="toc" class="toc"><tr><td><div id="toctitle"><h2>Contents</h2></div>
+<div id="toc" class="toc"><div id="toctitle"><h2>Contents</h2></div>
<ul>
<li class="toclevel-1 tocsection-1"><a href="#Foo_Bar"><span class="tocnumber">1</span> <span class="toctext"><i>Foo</i> <b>Bar</b></span></a></li>
<li class="toclevel-1 tocsection-2"><a href="#Foo_Bar_2"><span class="tocnumber">2</span> <span class="toctext"><i>Foo</i> Bar</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: Foo Bar">edit</a>]</span> <span class="mw-headline" id="Foo_Bar"> <i>Foo</i> <b>Bar</b> </span></h2>
-<h2><span class="editsection">[<a href="/index.php?title=Parser_test&amp;action=edit&amp;section=2" title="Edit section: Foo Bar">edit</a>]</span> <span class="mw-headline" id="Foo_Bar_2"> <i>Foo</i> <blockquote>Bar</blockquote> </span></h2>
+</div>
+
+<h2><span class="mw-headline" id="Foo_Bar"><i>Foo</i> <b>Bar</b></span><span class="mw-editsection"><span class="mw-editsection-bracket">[</span><a href="/index.php?title=Parser_test&amp;action=edit&amp;section=1" title="Edit section: Foo Bar">edit</a><span class="mw-editsection-bracket">]</span></span></h2>
+<h2><span class="mw-headline" id="Foo_Bar_2"><i>Foo</i> <blockquote>Bar</blockquote></span><span class="mw-editsection"><span class="mw-editsection-bracket">[</span><a href="/index.php?title=Parser_test&amp;action=edit&amp;section=2" title="Edit section: Foo Bar">edit</a><span class="mw-editsection-bracket">]</span></span></h2>
!! end
@@ -12641,14 +15945,15 @@ __TOC__
== <sup class="a > b">Evilbye</sup> ==
!! result
-<table id="toc" class="toc"><tr><td><div id="toctitle"><h2>Contents</h2></div>
+<div id="toc" class="toc"><div id="toctitle"><h2>Contents</h2></div>
<ul>
<li class="toclevel-1 tocsection-1"><a href="#Hello"><span class="tocnumber">1</span> <span class="toctext"><sup>Hello</sup></span></a></li>
<li class="toclevel-1 tocsection-2"><a href="#b.22.3EEvilbye"><span class="tocnumber">2</span> <span class="toctext"><sup> b"&gt;Evilbye</sup></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: Hello">edit</a>]</span> <span class="mw-headline" id="Hello"> <sup class="in-h2">Hello</sup> </span></h2>
-<h2><span class="editsection">[<a href="/index.php?title=Parser_test&amp;action=edit&amp;section=2" title="Edit section: b&quot;>Evilbye">edit</a>]</span> <span class="mw-headline" id="b.22.3EEvilbye"> <sup> b"&gt;Evilbye</sup> </span></h2>
+</div>
+
+<h2><span class="mw-headline" id="Hello"><sup class="in-h2">Hello</sup></span><span class="mw-editsection"><span class="mw-editsection-bracket">[</span><a href="/index.php?title=Parser_test&amp;action=edit&amp;section=1" title="Edit section: Hello">edit</a><span class="mw-editsection-bracket">]</span></span></h2>
+<h2><span class="mw-headline" id="b.22.3EEvilbye"><sup> b"&gt;Evilbye</sup></span><span class="mw-editsection"><span class="mw-editsection-bracket">[</span><a href="/index.php?title=Parser_test&amp;action=edit&amp;section=2" title="Edit section: b&quot;>Evilbye">edit</a><span class="mw-editsection-bracket">]</span></span></h2>
!! end
@@ -12666,7 +15971,7 @@ __TOC__
== <span dir="ltr" style="font-style: italic">Attributes after dir on these span tags must be deleted from the TOC</span> ==
!! result
-<table id="toc" class="toc"><tr><td><div id="toctitle"><h2>Contents</h2></div>
+<div id="toc" class="toc"><div id="toctitle"><h2>Contents</h2></div>
<ul>
<li class="toclevel-1 tocsection-1"><a href="#C.2B.2B"><span class="tocnumber">1</span> <span class="toctext"><span dir="ltr">C++</span></span></a></li>
<li class="toclevel-1 tocsection-2"><a href="#.D7.96.D7.91.D7.A0.D7.92.21"><span class="tocnumber">2</span> <span class="toctext"><span dir="rtl">זבנג!</span></span></a></li>
@@ -12674,12 +15979,13 @@ __TOC__
<li class="toclevel-1 tocsection-4"><a href="#All_attributes_on_these_span_tags_must_be_deleted_from_the_TOC"><span class="tocnumber">4</span> <span class="toctext"><span>All attributes on these span tags must be deleted from the TOC</span></span></a></li>
<li class="toclevel-1 tocsection-5"><a href="#Attributes_after_dir_on_these_span_tags_must_be_deleted_from_the_TOC"><span class="tocnumber">5</span> <span class="toctext"><span dir="ltr">Attributes after dir on these span tags must be deleted from the TOC</span></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: C++">edit</a>]</span> <span class="mw-headline" id="C.2B.2B"> <span dir="ltr">C++</span> </span></h2>
-<h2><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=".D7.96.D7.91.D7.A0.D7.92.21"> <span dir="rtl">זבנג!</span> </span></h2>
-<h2><span class="editsection">[<a href="/index.php?title=Parser_test&amp;action=edit&amp;section=3" title="Edit section: The attributes on these span tags must be deleted from the TOC">edit</a>]</span> <span class="mw-headline" id="The_attributes_on_these_span_tags_must_be_deleted_from_the_TOC"> <span style="font-style: italic">The attributes on these span tags must be deleted from the TOC</span> </span></h2>
-<h2><span class="editsection">[<a href="/index.php?title=Parser_test&amp;action=edit&amp;section=4" title="Edit section: All attributes on these span tags must be deleted from the TOC">edit</a>]</span> <span class="mw-headline" id="All_attributes_on_these_span_tags_must_be_deleted_from_the_TOC"> <span style="font-style: italic" dir="ltr">All attributes on these span tags must be deleted from the TOC</span> </span></h2>
-<h2><span class="editsection">[<a href="/index.php?title=Parser_test&amp;action=edit&amp;section=5" title="Edit section: Attributes after dir on these span tags must be deleted from the TOC">edit</a>]</span> <span class="mw-headline" id="Attributes_after_dir_on_these_span_tags_must_be_deleted_from_the_TOC"> <span dir="ltr" style="font-style: italic">Attributes after dir on these span tags must be deleted from the TOC</span> </span></h2>
+</div>
+
+<h2><span class="mw-headline" id="C.2B.2B"><span dir="ltr">C++</span></span><span class="mw-editsection"><span class="mw-editsection-bracket">[</span><a href="/index.php?title=Parser_test&amp;action=edit&amp;section=1" title="Edit section: C++">edit</a><span class="mw-editsection-bracket">]</span></span></h2>
+<h2><span class="mw-headline" id=".D7.96.D7.91.D7.A0.D7.92.21"><span dir="rtl">זבנג!</span></span><span class="mw-editsection"><span class="mw-editsection-bracket">[</span><a href="/index.php?title=Parser_test&amp;action=edit&amp;section=2" title="Edit section: זבנג!">edit</a><span class="mw-editsection-bracket">]</span></span></h2>
+<h2><span class="mw-headline" id="The_attributes_on_these_span_tags_must_be_deleted_from_the_TOC"><span style="font-style: italic">The attributes on these span tags must be deleted from the TOC</span></span><span class="mw-editsection"><span class="mw-editsection-bracket">[</span><a href="/index.php?title=Parser_test&amp;action=edit&amp;section=3" title="Edit section: The attributes on these span tags must be deleted from the TOC">edit</a><span class="mw-editsection-bracket">]</span></span></h2>
+<h2><span class="mw-headline" id="All_attributes_on_these_span_tags_must_be_deleted_from_the_TOC"><span style="font-style: italic" dir="ltr">All attributes on these span tags must be deleted from the TOC</span></span><span class="mw-editsection"><span class="mw-editsection-bracket">[</span><a href="/index.php?title=Parser_test&amp;action=edit&amp;section=4" title="Edit section: All attributes on these span tags must be deleted from the TOC">edit</a><span class="mw-editsection-bracket">]</span></span></h2>
+<h2><span class="mw-headline" id="Attributes_after_dir_on_these_span_tags_must_be_deleted_from_the_TOC"><span dir="ltr" style="font-style: italic">Attributes after dir on these span tags must be deleted from the TOC</span></span><span class="mw-editsection"><span class="mw-editsection-bracket">[</span><a href="/index.php?title=Parser_test&amp;action=edit&amp;section=5" title="Edit section: Attributes after dir on these span tags must be deleted from the TOC">edit</a><span class="mw-editsection-bracket">]</span></span></h2>
!! end
@@ -12696,7 +16002,7 @@ title=[[Main Page]]
!! input
{{int:Bug32057}}
!! result
-<h2><span class="editsection">[<a href="/index.php?title=Main_Page&amp;action=edit&amp;section=1" title="Edit section: Headline text">edit</a>]</span> <span class="mw-headline" id="Headline_text"> Headline text </span></h2>
+<h2><span class="mw-headline" id="Headline_text">Headline text</span><span class="mw-editsection"><span class="mw-editsection-bracket">[</span><a href="/index.php?title=Main_Page&amp;action=edit&amp;section=1" title="Edit section: Headline text">edit</a><span class="mw-editsection-bracket">]</span></span></h2>
!! end
@@ -12798,7 +16104,7 @@ nowiki inside link inside heading (bug 18295)
!! input
==[[foo|x<nowiki>y</nowiki>z]]==
!! result
-<h2><span class="editsection">[<a href="/index.php?title=Parser_test&amp;action=edit&amp;section=1" title="Edit section: xyz">edit</a>]</span> <span class="mw-headline" id="xyz"><a href="/index.php?title=Foo&amp;action=edit&amp;redlink=1" class="new" title="Foo (page does not exist)">xyz</a></span></h2>
+<h2><span class="mw-headline" id="xyz"><a href="/index.php?title=Foo&amp;action=edit&amp;redlink=1" class="new" title="Foo (page does not exist)">xyz</a></span><span class="mw-editsection"><span class="mw-editsection-bracket">[</span><a href="/index.php?title=Parser_test&amp;action=edit&amp;section=1" title="Edit section: xyz">edit</a><span class="mw-editsection-bracket">]</span></span></h2>
!! end
@@ -12837,7 +16143,7 @@ Gallery override link with WikiLink (bug 34852)
File:foobar.jpg|caption|alt=galleryalt|link=InterWikiLink
</gallery>
!! result
-<ul class="gallery">
+<ul class="gallery mw-gallery-traditional">
<li class="gallerybox" style="width: 155px"><div style="width: 155px">
<div class="thumb" style="width: 150px;"><div style="margin:68px auto;"><a href="/wiki/InterWikiLink"><img alt="galleryalt" src="http://example.com/images/thumb/3/3a/Foobar.jpg/120px-Foobar.jpg" width="120" height="14" /></a></div></div>
<div class="gallerytext">
@@ -12856,7 +16162,7 @@ Gallery override link with absolute external link (bug 34852)
File:foobar.jpg|caption|alt=galleryalt|link=http://www.example.org
</gallery>
!! result
-<ul class="gallery">
+<ul class="gallery mw-gallery-traditional">
<li class="gallerybox" style="width: 155px"><div style="width: 155px">
<div class="thumb" style="width: 150px;"><div style="margin:68px auto;"><a href="http://www.example.org"><img alt="galleryalt" src="http://example.com/images/thumb/3/3a/Foobar.jpg/120px-Foobar.jpg" width="120" height="14" /></a></div></div>
<div class="gallerytext">
@@ -12875,7 +16181,7 @@ Gallery override link with malicious javascript (bug 34852)
File:foobar.jpg|caption|alt=galleryalt|link=" onclick="alert('malicious javascript code!');
</gallery>
!! result
-<ul class="gallery">
+<ul class="gallery mw-gallery-traditional">
<li class="gallerybox" style="width: 155px"><div style="width: 155px">
<div class="thumb" style="width: 150px;"><div style="margin:68px auto;"><a href="/wiki/%22_onclick%3D%22alert(%27malicious_javascript_code!%27);"><img alt="galleryalt" src="http://example.com/images/thumb/3/3a/Foobar.jpg/120px-Foobar.jpg" width="120" height="14" /></a></div></div>
<div class="gallerytext">
@@ -12894,7 +16200,7 @@ Gallery with invalid title as link (bug 43964)
File:foobar.jpg|link=<
</gallery>
!! result
-<ul class="gallery">
+<ul class="gallery mw-gallery-traditional">
<li class="gallerybox" style="width: 155px"><div style="width: 155px">
<div class="thumb" style="width: 150px;"><div style="margin:68px auto;"><a href="/wiki/File:Foobar.jpg" class="image"><img alt="Foobar.jpg" src="http://example.com/images/thumb/3/3a/Foobar.jpg/120px-Foobar.jpg" width="120" height="14" /></a></div></div>
<div class="gallerytext">
@@ -12925,6 +16231,19 @@ abc
!! end
!!test
+Special parser function
+!! input
+{{#special:RandomPage}}
+{{#special:BaDtItLe}}
+{{#special:Foobar}}
+!! result
+<p>Special:Random
+Special:Badtitle
+Special:Foobar
+</p>
+!! end
+
+!!test
Bug 34939 - Case insensitive link parsing ([HttP://])
!! input
[HttP://MediaWiki.Org/]
@@ -12951,6 +16270,30 @@ HttP://MediaWiki.Org/
</p>
!! end
+!!test
+Disable TOC
+!! options
+notoc
+!! input
+Lead
+== Section 1 ==
+== Section 2 ==
+== Section 3 ==
+== Section 4 ==
+== Section 5 ==
+!! result
+<p>Lead
+</p>
+
+<h2><span class="mw-headline" id="Section_1">Section 1</span><span class="mw-editsection"><span class="mw-editsection-bracket">[</span><a href="/index.php?title=Parser_test&amp;action=edit&amp;section=1" title="Edit section: Section 1">edit</a><span class="mw-editsection-bracket">]</span></span></h2>
+<h2><span class="mw-headline" id="Section_2">Section 2</span><span class="mw-editsection"><span class="mw-editsection-bracket">[</span><a href="/index.php?title=Parser_test&amp;action=edit&amp;section=2" title="Edit section: Section 2">edit</a><span class="mw-editsection-bracket">]</span></span></h2>
+<h2><span class="mw-headline" id="Section_3">Section 3</span><span class="mw-editsection"><span class="mw-editsection-bracket">[</span><a href="/index.php?title=Parser_test&amp;action=edit&amp;section=3" title="Edit section: Section 3">edit</a><span class="mw-editsection-bracket">]</span></span></h2>
+<h2><span class="mw-headline" id="Section_4">Section 4</span><span class="mw-editsection"><span class="mw-editsection-bracket">[</span><a href="/index.php?title=Parser_test&amp;action=edit&amp;section=4" title="Edit section: Section 4">edit</a><span class="mw-editsection-bracket">]</span></span></h2>
+<h2><span class="mw-headline" id="Section_5">Section 5</span><span class="mw-editsection"><span class="mw-editsection-bracket">[</span><a href="/index.php?title=Parser_test&amp;action=edit&amp;section=5" title="Edit section: Section 5">edit</a><span class="mw-editsection-bracket">]</span></span></h2>
+
+!! end
+
+
###
### Parsoids-specific tests
### Parsoid-PHP parser incompatibilities
@@ -12958,25 +16301,433 @@ HttP://MediaWiki.Org/
!!test
1. SOL-sensitive wikitext tokens as template-args
!!options
-disabled
+parsoid=wt2html,wt2wt
!!input
{{echo|*a}}
{{echo|#a}}
{{echo|:a}}
!!result
-<p>*a
-#a
-:a
-</p>
+<span about="#mwt1" typeof="mw:Transclusion">
+</span><ul about="#mwt1"><li>a</li>
+</ul>
+<span about="#mwt2" typeof="mw:Transclusion">
+</span><ol about="#mwt2"><li>a</li>
+</ol>
+<span about="#mwt3" typeof="mw:Transclusion">
+</span><dl about="#mwt3"><dd>a</dd>
+</dl>
+!!end
+
+#### ----------------------------------------------------------------
+#### Parsoid-only testing of Parsoid's impl of <ref> and <references>
+#### tags. Parsoid's output for these tags differs from that of the
+#### PHP parser.
+#### ----------------------------------------------------------------
+
+!!test
+Ref: 1. ref-location should be replaced with an index span
+!!options
+parsoid
+!!input
+A <ref>foo</ref>
+B <ref name="x">foo</ref>
+C <ref name="y" />
+!!result
+<p>A <span about="#mwt1" class="reference" data-mw='{"name":"ref","body":{"html":"foo"},"attrs":{}}' id="cite_ref-1-0" rel="dc:references" typeof="mw:Extension/ref"><a href="#cite_note-1">[1]</a></span>
+B <span about="#mwt2" class="reference" data-mw='{"name":"ref","body":{"html":"foo"},"attrs":{"name":"x"}}' id="cite_ref-x-2-0" rel="dc:references" typeof="mw:Extension/ref"><a href="#cite_note-x-2">[2]</a></span>
+C <span about="#mwt3" class="reference" data-mw='{"name":"ref","attrs":{"name":"y"}}' id="cite_ref-y-3-0" rel="dc:references" typeof="mw:Extension/ref"><a href="#cite_note-y-3">[3]</a></span></p>
+!!end
+
+!!test
+Ref: 2. ref-tags with identical names should all get the same index
+!!options
+parsoid
+!!input
+A <ref name="x">foo</ref>
+B <ref name="x" />
+!!result
+<p>A <span about="#mwt1" class="reference" data-mw='{"name":"ref","body":{"html":"foo"},"attrs":{"name":"x"}}' id="cite_ref-x-1-0" rel="dc:references" typeof="mw:Extension/ref"><a href="#cite_note-x-1">[1]</a></span>
+B <span about="#mwt2" class="reference" data-mw='{"name":"ref","attrs":{"name":"x"}}' id="cite_ref-x-1-1" rel="dc:references" typeof="mw:Extension/ref"><a href="#cite_note-x-1">[1]</a></span></p>
+!!end
+
+!!test
+Ref: 3. spaces in ref-names should be ignored
+!!options
+parsoid
+!!input
+A <ref name="x">foo</ref>
+B <ref name=" x " />
+C <ref name= x />
+!!result
+<p>A <span about="#mwt1" class="reference" data-mw='{"name":"ref","body":{"html":"foo"},"attrs":{"name":"x"}}' id="cite_ref-x-1-0" rel="dc:references" typeof="mw:Extension/ref"><a href="#cite_note-x-1">[1]</a></span>
+B <span about="#mwt2" class="reference" data-mw='{"name":"ref","attrs":{"name":"x"}}' id="cite_ref-x-1-1" rel="dc:references" typeof="mw:Extension/ref"><a href="#cite_note-x-1">[1]</a></span>
+C <span about="#mwt3" class="reference" data-mw='{"name":"ref","attrs":{"name":"x"}}' id="cite_ref-x-1-2" rel="dc:references" typeof="mw:Extension/ref"><a href="#cite_note-x-1">[1]</a></span></p>
+!!end
+
+!!test
+Ref: 4. 'constructor' should be accepted as a valid ref-name
+(NOTE: constructor is a predefined property in JS and constructor as a ref-name can clash with it if not handled properly)
+!!options
+parsoid
+!!input
+A <ref name="constructor">foo</ref>
+!!result
+<p>A <span about="#mwt1" class="reference" data-mw='{"name":"ref","body":{"html":"foo"},"attrs":{"name":"constructor"}}' id="cite_ref-constructor-1-0" rel="dc:references" typeof="mw:Extension/ref"><a href="#cite_note-constructor-1">[1]</a></span></p>
+!!end
+
+!!test
+Ref: 5. body should accept generic wikitext
+!!options
+parsoid
+!!input
+A <ref>
+ This is a '''[[bolded link]]''' and this is a {{echo|transclusion}}
+</ref>
+
+<references />
+!!result
+<p>A <span about="#mwt1" class="reference" data-mw='{"name":"ref","body":{"html":"This is a <b data-parsoid=\"{&amp;quot;dsr&amp;quot;:[19,40,3,3]}\"><a rel=\"mw:WikiLink\" href=\"./Bolded_link\" data-parsoid=\"{&amp;quot;stx&amp;quot;:&amp;quot;simple&amp;quot;,&amp;quot;a&amp;quot;:{&amp;quot;href&amp;quot;:&amp;quot;./Bolded_link&amp;quot;},&amp;quot;sa&amp;quot;:{&amp;quot;href&amp;quot;:&amp;quot;bolded link&amp;quot;},&amp;quot;dsr&amp;quot;:[22,37,2,2]}\">bolded link</a></b> and this is a <span about=\"#mwt5\" typeof=\"mw:Transclusion\" data-mw=\"{&amp;quot;parts&amp;quot;:[{&amp;quot;template&amp;quot;:{&amp;quot;target&amp;quot;:{&amp;quot;wt&amp;quot;:&amp;quot;echo&amp;quot;,&amp;quot;href&amp;quot;:&amp;quot;./Template:Echo&amp;quot;},&amp;quot;params&amp;quot;:{&amp;quot;1&amp;quot;:{&amp;quot;wt&amp;quot;:&amp;quot;transclusion&amp;quot;}},&amp;quot;i&amp;quot;:0}}]}\" data-parsoid=\"{&amp;quot;dsr&amp;quot;:[55,76,null,null],&amp;quot;pi&amp;quot;:[[{&amp;quot;k&amp;quot;:&amp;quot;1&amp;quot;,&amp;quot;spc&amp;quot;:[&amp;quot;&amp;quot;,&amp;quot;&amp;quot;,&amp;quot;&amp;quot;,&amp;quot;&amp;quot;]}]]}\">transclusion</span>\n"},"attrs":{}}' id="cite_ref-1-0" rel="dc:references" typeof="mw:Extension/ref"><a href="#cite_note-1">[1]</a></span></p>
+
+<ol class="references" typeof="mw:Extension/references" about="#mwt2" data-mw='{"name":"references","attrs":{}}'>
+<li about="#cite_note-1" id="cite_note-1"><span rel="mw:referencedBy"><a href="#cite_ref-1-0">↑</a></span> This is a <b><a rel="mw:WikiLink" href="./Bolded_link">bolded link</a></b> and this is a <span about="#mwt3" typeof="mw:Transclusion" data-mw='{"parts":[{"template":{"target":{"wt":"echo","href":"./Template:Echo"},"params":{"1":{"wt":"transclusion"}},"i":0}}]}'>transclusion</span>
+</li>
+</ol>
+!!end
+
+!!test
+Ref: 6. indent-pres should not be output in ref-body
+!!options
+parsoid
+!!input
+A <ref>
+ foo
+ bar
+ baz
+</ref>
+
+<references />
+!!result
+<p>A <span about="#mwt1" class="reference" data-mw='{"name":"ref","body":{"html":"foo\n bar\n baz\n"},"attrs":{}}' id="cite_ref-1-0" rel="dc:references" typeof="mw:Extension/ref"><a href="#cite_note-1">[1]</a></span></p>
+
+<ol class="references" typeof="mw:Extension/references" about="#mwt3" data-mw='{"name":"references","attrs":{}}'>
+<li about="#cite_note-1" id="cite_note-1"><span rel="mw:referencedBy"><a href="#cite_ref-1-0">↑</a></span> foo
+ bar
+ baz
+</li>
+</ol>
+!!end
+
+!!test
+Ref: 7. No p-wrapping in ref-body
+!!options
+parsoid
+!!input
+A <ref>
+foo
+
+bar
+
+
+baz
+
+
+
+booz
+</ref>
+
+<references />
+!!result
+<p>A <span about="#mwt1" class="reference" data-mw='{"name":"ref","body":{"html":"foo\n\nbar\n\n\nbaz\n\n\n\nbooz\n"},"attrs":{}}' id="cite_ref-1-0" rel="dc:references" typeof="mw:Extension/ref"><a href="#cite_note-1">[1]</a></span></p>
+
+<ol about="#mwt2" class="references" typeof="mw:Extension/references" data-mw='{"name":"references","attrs":{}}'>
+<li about="#cite_note-1" id="cite_note-1"><span rel="mw:referencedBy"><a href="#cite_ref-1-0">↑</a></span> foo
+
+bar
+
+
+baz
+
+
+
+booz
+</li>
+</ol>
+!!end
+
+!!test
+Ref: 8. transclusion wikitext has lower precedence
+!!options
+parsoid
+!!input
+A <ref> foo {{echo|</ref> B C}}
+
+<references />
+!!result
+<p>A <span about="#mwt1" class="reference" data-mw='{"name":"ref","body":{"html":"foo <span typeof=\"mw:Nowiki\" data-parsoid=\"{&amp;quot;src&amp;quot;:&amp;quot;{{&amp;quot;,&amp;quot;dsr&amp;quot;:[12,14,0,0]}\">{{</span>echo|"},"attrs":{}}' id="cite_ref-1-0" rel="dc:references" typeof="mw:Extension/ref"><a href="#cite_note-1">[1]</a></span> B C<span typeof="mw:Nowiki">}}</span></p>
+
+<ol about="#mwt2" class="references" typeof="mw:Extension/references" data-mw='{"name":"references","attrs":{}}'>
+<li about="#cite_note-1" id="cite_note-1"><span rel="mw:referencedBy"><a href="#cite_ref-1-0">↑</a></span> foo <span typeof="mw:Nowiki">{{</span>echo|</li>
+</ol>
+!!end
+
+!!test
+Ref: 9. unclosed comments should not leak out of ref-body
+!!options
+parsoid
+!!input
+A <ref> foo <!--</ref> B C
+
+<references />
+!!result
+<p>A <span about="#mwt1" class="reference" data-mw='{"name":"ref","body":{"html":"foo <!---->"},"attrs":{}}' id="cite_ref-1-0" rel="dc:references" typeof="mw:Extension/ref"><a href="#cite_note-1">[1]</a></span> B C</p>
+
+<ol about="#mwt2" class="references" typeof="mw:Extension/references" data-mw='{"name":"references","attrs":{}}'>
+<li about="#cite_note-1" id="cite_note-1"><span rel="mw:referencedBy"><a href="#cite_ref-1-0">↑</a></span> foo <!----></li>
+</ol>
+!!end
+
+!!test
+Ref: 10. Unclosed HTML tags should not leak out of ref-body
+!!options
+parsoid
+!!input
+A <ref> <b> foo </ref> B C
+
+<references />
+!!result
+<p>A <span about="#mwt1" class="reference" data-mw='{"name":"ref","body":{"html":"<b data-parsoid=\"{&amp;quot;stx&amp;quot;:&amp;quot;html&amp;quot;,&amp;quot;autoInsertedEnd&amp;quot;:true,&amp;quot;dsr&amp;quot;:[8,16,3,0]}\"> foo </b>"},"attrs":{}}' id="cite_ref-1-0" rel="dc:references" typeof="mw:Extension/ref"><a href="#cite_note-1">[1]</a></span> B C</p>
+
+<ol about="#mwt2" class="references" typeof="mw:Extension/references" data-mw='{"name":"references","attrs":{}}'>
+<li about="#cite_note-1" id="cite_note-1"><span rel="mw:referencedBy"><a href="#cite_ref-1-0">↑</a></span> <b> foo </b></li>
+</ol>
+!!end
+
+!!test
+Ref: 11. ref-tags acts like an inline element wrt P-wrapping
+!!options
+parsoid
+!!input
+A <ref>foo</ref> B
+C <ref>bar</ref> D
+!!result
+<p>A <span about="#mwt1" class="reference" data-mw='{"name":"ref","body":{"html":"foo"},"attrs":{}}' id="cite_ref-1-0" rel="dc:references" typeof="mw:Extension/ref"><a href="#cite_note-1">[1]</a></span> B
+C <span about="#mwt2" class="reference" data-mw='{"name":"ref","body":{"html":"bar"},"attrs":{}}' id="cite_ref-2-0" rel="dc:references" typeof="mw:Extension/ref"><a href="#cite_note-2">[2]</a></span> D</p>
+!!end
+
+!!test
+Ref: 12. ref-tags act as trailing newline migration barrier
+!!options
+parsoid
+!!input
+<!--the newline at the end of this line moves out of the p-tag-->a
+
+b<!--the newline at the end of this line stays inside the p-tag--> <ref />
+<ref />
+
+c
+!!result
+<p><!--the newline at the end of this line moves out of the p-tag-->a</p>
+
+
+<p>b<!--the newline at the end of this line stays inside the p-tag--> <span about="#mwt1" class="reference" data-mw='{"name":"ref","attrs":{}}' id="cite_ref-1-0" rel="dc:references" typeof="mw:Extension/ref"><a href="#cite_note-1">[1]</a></span>
+<span about="#mwt2" class="reference" data-mw='{"name":"ref","attrs":{}}' id="cite_ref-2-0" rel="dc:references" typeof="mw:Extension/ref"><a href="#cite_note-2">[2]</a></span></p>
+
+
+<p>c</p>
+!!end
+
+!!test
+Ref: 13. ref-tags are not SOL-transparent and block indent-pres
+!!options
+parsoid
+!!input
+<ref>foo</ref> A
+<ref>bar
+</ref> B
+!!result
+<p><span about="#mwt1" class="reference" data-mw='{"name":"ref","body":{"html":"foo"},"attrs":{}}' id="cite_ref-1-0" rel="dc:references" typeof="mw:Extension/ref"><a href="#cite_note-1">[1]</a></span> A
+<span about="#mwt2" class="reference" data-mw='{"name":"ref","body":{"html":"bar\n"},"attrs":{}}' id="cite_ref-2-0" rel="dc:references" typeof="mw:Extension/ref"><a href="#cite_note-2">[2]</a></span> B</p>
+!!end
+
+!!test
+Ref: 14. A nested ref-tag should be emitted as plain text
+!!options
+parsoid
+!!input
+<ref>foo <ref>bar</ref> baz</ref>
+
+<references />
+!!result
+<p><span about="#mwt1" class="reference" data-mw="{&quot;name&quot;:&quot;ref&quot;,&quot;body&quot;:{&quot;html&quot;:&quot;foo &amp;lt;ref&amp;gt;bar&amp;lt;/ref&amp;gt; baz&quot;},&quot;attrs&quot;:{}}" id="cite_ref-1-0" rel="dc:references" typeof="mw:Extension/ref"><a href="#cite_note-1">[1]</a></span></p>
+
+<ol class="references" typeof="mw:Extension/references" about="#mwt2" data-mw="{&quot;name&quot;:&quot;references&quot;,&quot;attrs&quot;:{}}">
+<li about="#cite_note-1" id="cite_note-1" data-parsoid="{}"><span rel="mw:referencedBy"><a href="#cite_ref-1-0">↑</a></span> foo &lt;ref&gt;bar&lt;/ref&gt; baz</li>
+</ol>
+!!end
+
+!!test
+Ref: 15. ref-tags with identical names should get identical indexes
+!!options
+parsoid
+!!input
+A1 <ref name="a">foo</ref> A2 <ref name="a" />
+B1 <ref name="b" /> B2 <ref name="b">bar</ref>
+
+<references />
+!!result
+<p>A1 <span about="#mwt3" class="reference" data-mw='{"name":"ref","body":{"html":"foo"},"attrs":{"name":"a"}}' id="cite_ref-a-1-0" rel="dc:references" typeof="mw:Extension/ref"><a href="#cite_note-a-1">[1]</a></span> A2 <span about="#mwt4" class="reference" data-mw='{"name":"ref","attrs":{"name":"a"}}' id="cite_ref-a-1-1" rel="dc:references" typeof="mw:Extension/ref"><a href="#cite_note-a-1">[1]</a></span>
+B1 <span about="#mwt7" class="reference" data-mw='{"name":"ref","attrs":{"name":"b"}}' id="cite_ref-b-2-0" rel="dc:references" typeof="mw:Extension/ref"><a href="#cite_note-b-2">[2]</a></span> B2 <span about="#mwt8" class="reference" data-mw='{"name":"ref","body":{"html":"bar"},"attrs":{"name":"b"}}' id="cite_ref-b-2-1" rel="dc:references" typeof="mw:Extension/ref"><a href="#cite_note-b-2">[2]</a></span></p>
+
+<ol about="#mwt10" class="references" typeof="mw:Extension/references" data-mw='{"name":"references","attrs":{}}'><li about="#cite_note-a-1" id="cite_note-a-1"><span rel="mw:referencedBy">↑ <a href="#cite_ref-a-1-0">1.0</a> <a href="#cite_ref-a-1-1">1.1</a></span> foo</li><li about="#cite_note-b-2" id="cite_note-b-2"><span rel="mw:referencedBy">↑ <a href="#cite_ref-b-2-0">2.0</a> <a href="#cite_ref-b-2-1">2.1</a></span> bar</li>
+</ol>
+!!end
+
+!!test
+References: 1. references tag without any refs should be handled properly
+!!options
+parsoid
+!!input
+<references />
+!!result
+<ol about="#mwt2" class="references" typeof="mw:Extension/references" data-mw='{"name":"references","attrs":{}}'></ol>
+!!end
+
+!!test
+References: 2. references tag with group only outputs references from that group
+!!options
+parsoid
+!!input
+A <ref group="a">foo</ref>
+B <ref group="b">bar</ref>
+
+<references group='a' />
+!!result
+<p>A <span about="#mwt2" class="reference" data-mw='{"name":"ref","body":{"html":"foo"},"attrs":{"group":"a"}}' id="cite_ref-1-0" rel="dc:references" typeof="mw:Extension/ref"><a href="#cite_note-1">[a 1]</a></span>
+B <span about="#mwt4" class="reference" data-mw='{"name":"ref","body":{"html":"bar"},"attrs":{"group":"b"}}' id="cite_ref-1-0" rel="dc:references" typeof="mw:Extension/ref"><a href="#cite_note-1">[b 1]</a></span></p>
+
+<ol about="#mwt6" class="references" typeof="mw:Extension/references" data-mw='{"name":"references","attrs":{"group":"a"}}'><li about="#cite_note-1" id="cite_note-1"><span rel="mw:referencedBy"><a href="#cite_ref-1-0">↑</a></span> foo</li>
+</ol>
+!!end
+
+!!test
+References: 3. ref list should be cleared after processing references
+!!options
+parsoid
+!!input
+A <ref>foo</ref>
+
+<references />
+
+B <ref>bar</ref>
+
+<references />
+!!result
+<p>A <span about="#mwt2" class="reference" data-mw='{"name":"ref","body":{"html":"foo"},"attrs":{}}' id="cite_ref-1-0" rel="dc:references" typeof="mw:Extension/ref"><a href="#cite_note-1">[1]</a></span></p>
+
+<ol about="#mwt4" class="references" typeof="mw:Extension/references" data-mw='{"name":"references","attrs":{}}'><li about="#cite_note-1" id="cite_note-1"><span rel="mw:referencedBy"><a href="#cite_ref-1-0">↑</a></span> foo</li>
+</ol>
+
+<p>B <span about="#mwt6" class="reference" data-mw='{"name":"ref","body":{"html":"bar"},"attrs":{}}' id="cite_ref-1-0" rel="dc:references" typeof="mw:Extension/ref"><a href="#cite_note-1">[1]</a></span></p>
+
+<ol about="#mwt8" class="references" typeof="mw:Extension/references" data-mw='{"name":"references","attrs":{}}'><li about="#cite_note-1" id="cite_note-1"><span rel="mw:referencedBy"><a href="#cite_ref-1-0">↑</a></span> bar</li>
+</ol>
!!end
+!!test
+References: 4. only referenced group should be cleared after processing references
+!!options
+parsoid
+!!input
+A <ref group="a">afoo</ref>
+B <ref>bfoo</ref>
+
+<references group="a"/>
+
+C <ref>cfoo</ref>
+
+<references />
+!!result
+<p>A <span about="#mwt2" class="reference" data-mw='{"name":"ref","body":{"html":"afoo"},"attrs":{"group":"a"}}' id="cite_ref-1-0" rel="dc:references" typeof="mw:Extension/ref"><a href="#cite_note-1">[a 1]</a></span>
+B <span about="#mwt4" class="reference" data-mw='{"name":"ref","body":{"html":"bfoo"},"attrs":{}}' id="cite_ref-1-0" rel="dc:references" typeof="mw:Extension/ref" data-parsoid='{"src":"<ref>bfoo</ref>","dsr":[30,45,5,6]}'><a href="#cite_note-1">[1]</a></span></p>
+
+<ol about="#mwt6" class="references" typeof="mw:Extension/references" data-mw='{"name":"references","attrs":{"group":"a"}}'><li about="#cite_note-1" id="cite_note-1"><span rel="mw:referencedBy"><a href="#cite_ref-1-0">↑</a></span> afoo</li>
+</ol>
+
+<p>C <span about="#mwt8" class="reference" data-mw='{"name":"ref","body":{"html":"cfoo"},"attrs":{}}' id="cite_ref-2-0" rel="dc:references" typeof="mw:Extension/ref"><a href="#cite_note-2">[2]</a></span></p>
+
+<ol about="#mwt10" class="references" typeof="mw:Extension/references" data-mw='{"name":"references","attrs":{}}'><li about="#cite_note-1" id="cite_note-1"><span rel="mw:referencedBy"><a href="#cite_ref-1-0">↑</a></span> bfoo</li><li about="#cite_note-2" id="cite_note-2"><span rel="mw:referencedBy"><a href="#cite_ref-2-0">↑</a></span> cfoo</li>
+</ol>
+!!end
+
+!!test
+References: 5. ref tags in references should be processed while ignoring all other content
+!!options
+parsoid
+!!input
+A <ref name="a" />
+B <ref name="b">bar</ref>
+
+<references>
+<ref name="a">foo</ref>
+This should just get lost.
+</references>
+!!result
+<p>A <span about="#mwt2" class="reference" data-mw='{"name":"ref","attrs":{"name":"a"}}' id="cite_ref-a-1-0" rel="dc:references" typeof="mw:Extension/ref"><a href="#cite_note-a-1">[1]</a></span>
+B <span about="#mwt4" class="reference" data-mw='{"name":"ref","body":{"html":"bar"},"attrs":{"name":"b"}}' id="cite_ref-b-2-0" rel="dc:references" typeof="mw:Extension/ref"><a href="#cite_note-b-2">[2]</a></span></p>
+
+<ol class="references" typeof="mw:Extension/references" about="#mwt6" data-mw='{"name":"references","body":{"extsrc":"<ref name=\"a\">foo</ref>\nThis should just get lost.","html":"\n<span about=\"#mwt8\" class=\"reference\" data-mw=\"{&amp;quot;name&amp;quot;:&amp;quot;ref&amp;quot;,&amp;quot;body&amp;quot;:{&amp;quot;html&amp;quot;:&amp;quot;foo&amp;quot;},&amp;quot;attrs&amp;quot;:{&amp;quot;name&amp;quot;:&amp;quot;a&amp;quot;}}\" rel=\"dc:references\" typeof=\"mw:Extension/ref\"><a href=\"#cite_note-a-1\">[1]</a></span>\n"},"attrs":{}}'><li about="#cite_note-a-1" id="cite_note-a-1"><span rel="mw:referencedBy"><a href="#cite_ref-a-1-0">↑</a></span> foo</li><li about="#cite_note-b-2" id="cite_note-b-2"><span rel="mw:referencedBy"><a href="#cite_ref-b-2-0">↑</a></span> bar</li>
+</ol>
+!!end
+
+!!test
+References: 6. <references /> from a transclusion
+!!options
+parsoid
+!!input
+{{echo|<references />}}
+!!result
+<ol class="references" about="#mwt2" typeof="mw:Transclusion" data-mw='{"parts":[{"template":{"target":{"wt":"echo","href":"./Template:Echo"},"params":{"1":{"wt":"<references />"}},"i":0}}]}'></ol>
+!!end
+
+!! test
+References: 7. Multiple references tags (one without and one with nested refs) should be correctly handled
+!! options
+parsoid
+!! input
+A <ref>foo bar for a</ref>
+B <ref name="b" />
+
+<references />
+
+<references>
+<ref name="b">foo</ref>
+</references>
+!! result
+<p>A <span about="#mwt2" class="reference" data-mw='{"name":"ref","body":{"html":"foo bar for a"},"attrs":{}}' id="cite_ref-1-0" rel="dc:references" typeof="mw:Extension/ref"><a href="#cite_note-1">[1]</a></span>
+B <span about="#mwt4" class="reference" data-mw='{"name":"ref","attrs":{"name":"b"}}' id="cite_ref-b-2-0" rel="dc:references" typeof="mw:Extension/ref"><a href="#cite_note-b-2">[2]</a></span></p>
+
+<ol class="references" typeof="mw:Extension/references" about="#mwt6" data-mw='{"name":"references","attrs":{}}'>
+<li about="#cite_note-1" id="cite_note-1"><span rel="mw:referencedBy"><a href="#cite_ref-1-0">↑</a></span> foo bar for a</li>
+<li about="#cite_note-b-2" id="cite_note-b-2"><span rel="mw:referencedBy"><a href="#cite_ref-b-2-0">↑</a></span> </li>
+</ol>
+
+<ol class="references" typeof="mw:Extension/references" about="#mwt8" data-mw='{"name":"references","body":{"extsrc":"<ref name=\"b\">foo</ref>","html":"\n<span about=\"#mwt10\" class=\"reference\" data-mw=\"{&amp;quot;name&amp;quot;:&amp;quot;ref&amp;quot;,&amp;quot;body&amp;quot;:{&amp;quot;html&amp;quot;:&amp;quot;foo&amp;quot;},&amp;quot;attrs&amp;quot;:{&amp;quot;name&amp;quot;:&amp;quot;b&amp;quot;}}\" rel=\"dc:references\" typeof=\"mw:Extension/ref\"><a href=\"#cite_note-b-1\">[1]</a></span>\n"},"attrs":{}}'>
+<li about="#cite_note-b-1" id="cite_note-b-1"><span rel="mw:referencedBy">↑</span> foo</li>
+</ol>
+!! end
+
+#### ----------------------------------------------------------------
#### The following section of tests are primarily to test
-#### wikitext escaping capabilities of Parsoid.
-#### A lot of the tests are disabled for the PHP parser either
-#### because of minor newline diffs or other reasons.
-#### As Parsoid serializer can handle newlines and other HTML
-#### more robustly, some of these tests might get reenabled
-#### for the PHP parser.
+#### wikitext escaping capabilities of Parsoid. Given that
+#### escaping can be done any number of ways, the wikitext (input)
+#### is always adjusted to reflect how Parsoid adds nowiki
+#### escape tags.
+####
+#### We are marking several tests as parsoid-only since the
+#### HTML in the result section is different from what the
+#### PHP parser generates for it.
+#### ----------------------------------------------------------------
+
#### --------------- Headings ---------------
#### 0. Unnested
@@ -12989,45 +16740,62 @@ disabled
#### ----------------------------------------
!! test
Headings: 0. Unnested
+!! options
+parsoid
!! input
<nowiki>=foo=</nowiki>
-<nowiki>=foo</nowiki>''a''=
+<nowiki> =foo= </nowiki>
+<!--cmt-->
+<nowiki>=foo=</nowiki>
+
+=foo''a''<nowiki>=</nowiki>
!! result
-<p>=foo=
-</p><p>=foo<i>a</i>=
-</p>
+<p><span typeof="mw:Nowiki">=foo=</span></p>
+
+<p><span typeof="mw:Nowiki"> =foo= </span>
+<!--cmt-->
+<span typeof="mw:Nowiki">=foo=</span></p>
+
+<p>=foo<i>a</i><span typeof="mw:Nowiki">=</span></p>
!!end
!! test
Headings: 1. Nested inside html
!! options
-disabled
+parsoid
!! input
=<nowiki>=foo=</nowiki>=
+
==<nowiki>=foo=</nowiki>==
+
===<nowiki>=foo=</nowiki>===
+
====<nowiki>=foo=</nowiki>====
+
=====<nowiki>=foo=</nowiki>=====
+
======<nowiki>=foo=</nowiki>======
!! result
-<h1>=foo=</h1>
-<h2>=foo=</h2>
-<h3>=foo=</h3>
-<h4>=foo=</h4>
-<h5>=foo=</h5>
-<h6>=foo=</h6>
+<h1><span typeof="mw:Nowiki">=foo=</span></h1>
+<h2><span typeof="mw:Nowiki">=foo=</span></h2>
+<h3><span typeof="mw:Nowiki">=foo=</span></h3>
+<h4><span typeof="mw:Nowiki">=foo=</span></h4>
+<h5><span typeof="mw:Nowiki">=foo=</span></h5>
+<h6><span typeof="mw:Nowiki">=foo=</span></h6>
!!end
!! test
Headings: 2. Outside heading nest on a single line <h1>foo</h1>*bar
!! options
-disabled
+parsoid
!! input
=foo=
-<nowiki>*bar</nowiki>
+<nowiki>*</nowiki>bar
+
=foo=
=bar
+
=foo=
<nowiki>=bar=</nowiki>
!! result
@@ -13039,44 +16807,75 @@ disabled
!! test
Headings: 3. Nested inside html with wikitext split by html tags
!! options
-disabled
+parsoid
!! input
-=<nowiki>=</nowiki>'''bold'''foo==
+=='''bold'''<nowiki>foo=</nowiki>=
!! result
-<h1>=<b>bold</b>foo=</h1>
+<h1>=<b>bold</b><span typeof="mw:Nowiki">foo=</span></h1>
!!end
!! test
-Headings: 4. No escaping needed (testing just h1 and h2)
+Headings: 4a. No escaping needed (testing just h1 and h2)
!! options
-disabled
+parsoid
!! input
==foo=
+
=foo==
+
+= =foo= =
+
+==foo= bar=
+
===foo==
+
==foo===
+
=''=''foo==
-===
+
+=<nowiki>=</nowiki>=
!! result
<h1>=foo</h1>
<h1>foo=</h1>
+<h1> =foo= </h1>
+<h1>=foo= bar</h1>
<h2>=foo</h2>
<h2>foo=</h2>
<h1><i>=</i>foo=</h1>
-<h1>=</h1>
+<h1><span typeof="mw:Nowiki">=</span></h1>
+!!end
+
+!! test
+Headings: 4b. No escaping needed (inside p-tags)
+!! options
+parsoid
+!! input
+===
+=foo= x
+=foo= <s></s>
+!! result
+<p>===
+=foo= x
+=foo= <s></s>
+</p>
!!end
!! test
Headings: 5. Empty headings
!! options
-disabled
+parsoid
!! input
-=<nowiki></nowiki>=
-==<nowiki></nowiki>==
-===<nowiki></nowiki>===
-====<nowiki></nowiki>====
-=====<nowiki></nowiki>=====
-======<nowiki></nowiki>======
+=<nowiki/>=
+
+==<nowiki/>==
+
+===<nowiki/>===
+
+====<nowiki/>====
+
+=====<nowiki/>=====
+
+======<nowiki/>======
!! result
<h1></h1>
<h2></h2>
@@ -13087,16 +16886,87 @@ disabled
!!end
!! test
-Headings: 6. Heading chars in SOL context
+Headings: 6a. Heading chars in SOL context (with trailing spaces)
!! options
-disabled
+parsoid
+!! input
+<nowiki>=a=</nowiki>
+
+<nowiki>=a=</nowiki>
+
+<nowiki>=a=</nowiki>
+
+<nowiki>=a=</nowiki>
+!! result
+<p>=a=</p>
+<p>=a= </p>
+<p>=a= </p>
+<p>=a= </p>
+!!end
+
+!! test
+Headings: 6b. Heading chars in SOL context (with trailing newlines)
+!! options
+parsoid
!! input
-<!--cmt--><nowiki>=h1=</nowiki>
+<nowiki>=a=
+b</nowiki>
+
+<nowiki>=a=
+b</nowiki>
+
+<nowiki>=a=
+b</nowiki>
+
+<nowiki>=a=
+b</nowiki>
!! result
-<p><!--cmt-->=h1=
+<p>=a=
+b</p>
+<p>=a=
+b</p>
+<p>=a=
+b</p>
+<p>=a=
+b</p>
</p>
!!end
+!! test
+Headings: 6c. Heading chars in SOL context (leading newline break)
+!! options
+parsoid
+!! input
+a
+<nowiki>=b=</nowiki>
+!! result
+<p>a
+=b=</p>
+!!end
+
+!! test
+Headings: 6d. Heading chars in SOL context (with interspersed comments)
+!! options
+parsoid
+!! input
+<!--c0--><nowiki>=a=</nowiki>
+<!--c1-->
+<nowiki>=a=</nowiki> <!--c2--> <!--c3-->
+!! result
+<p><!--c0-->=a=</p>
+<p><!--c1-->=a= <!--c2--> <!--c3--></p>
+!!end
+
+!! test
+Headings: 6d. Heading chars in SOL context (No escaping needed)
+!! options
+parsoid=html2wt
+!! input
+=a=<div>b</div>
+!! result
+=a=<div>b</div>
+!!end
+
#### --------------- Lists ---------------
#### 0. Outside nests (*foo, etc.)
#### 1. Nested inside html <ul><li>*foo</li></ul>
@@ -13111,9 +16981,9 @@ disabled
!! test
Lists: 0. Outside nests
!! input
-<nowiki>*foo</nowiki>
+<nowiki>*</nowiki>foo
-<nowiki>#foo</nowiki>
+<nowiki>#</nowiki>foo
!! result
<p>*foo
</p><p>#foo
@@ -13139,22 +17009,38 @@ Lists: 1. Nested inside html
#<nowiki>;foo</nowiki>
!! result
-<ul><li>*foo
-</li></ul>
-<ul><li>#foo
-</li></ul>
-<ul><li>:foo
-</li></ul>
-<ul><li>;foo
-</li></ul>
-<ol><li>*foo
-</li></ol>
-<ol><li>#foo
-</li></ol>
-<ol><li>:foo
-</li></ol>
-<ol><li>;foo
-</li></ol>
+<ul>
+<li>*foo
+</li>
+</ul>
+<ul>
+<li>#foo
+</li>
+</ul>
+<ul>
+<li>:foo
+</li>
+</ul>
+<ul>
+<li>;foo
+</li>
+</ul>
+<ol>
+<li>*foo
+</li>
+</ol>
+<ol>
+<li>#foo
+</li>
+</ol>
+<ol>
+<li>:foo
+</li>
+</ol>
+<ol>
+<li>;foo
+</li>
+</ol>
!!end
@@ -13170,15 +17056,24 @@ Lists: 2. Inside definition lists
:<nowiki>:foo</nowiki>
!! result
-<dl><dt>;foo
-</dt></dl>
-<dl><dt>:foo
-</dt></dl>
-<dl><dt>:foo
-</dt><dd>bar
-</dd></dl>
-<dl><dd>:foo
-</dd></dl>
+<dl>
+<dt>;foo
+</dt>
+</dl>
+<dl>
+<dt>:foo
+</dt>
+</dl>
+<dl>
+<dt>:foo
+</dt>
+<dd>bar
+</dd>
+</dl>
+<dl>
+<dd>:foo
+</dd>
+</dl>
!!end
@@ -13189,17 +17084,21 @@ Lists: 3. Only bullets at start of text should be escaped
*<nowiki>*foo</nowiki>''it''*bar
!! result
-<ul><li>*foo*bar
-</li></ul>
-<ul><li>*foo<i>it</i>*bar
-</li></ul>
+<ul>
+<li>*foo*bar
+</li>
+</ul>
+<ul>
+<li>*foo<i>it</i>*bar
+</li>
+</ul>
!!end
!! test
Lists: 4. No escapes needed
!! options
-disabled
+parsoid
!! input
*foo*bar
@@ -13207,12 +17106,18 @@ disabled
*[[Foo]]: bar
!! result
-<ul><li>foo*bar
-</li></ul>
-<ul><li><i>foo</i>*bar
-</li></ul>
-<ul><li><a href="Foo" rel="mw:WikiLink">Foo</a>: bar
-</li></ul>
+<ul>
+<li>foo*bar
+</li>
+</ul>
+<ul>
+<li><i>foo</i>*bar
+</li>
+</ul>
+<ul>
+<li><a rel="mw:WikiLink" href="Foo">Foo</a>: bar
+</li>
+</ul>
!!end
!! test
@@ -13224,39 +17129,54 @@ Lists: 5. No unnecessary escapes
*[[bar <span><nowiki>[[foo]]</nowiki></span>
-*<nowiki>]]bar </nowiki><span><nowiki>[[foo]]</nowiki></span>
+*]]bar <span><nowiki>[[foo]]</nowiki></span>
*=bar <span>foo]]</span>=
+
+* <s></s>: a
!! result
-<ul><li> bar <span>[[foo]]</span>
-</li></ul>
-<ul><li>=bar <span>[[foo]]</span>
-</li></ul>
-<ul><li>[[bar <span>[[foo]]</span>
-</li></ul>
-<ul><li>]]bar <span>[[foo]]</span>
-</li></ul>
-<ul><li>=bar <span>foo]]</span>=
-</li></ul>
+<ul>
+<li> bar <span>[[foo]]</span>
+</li>
+</ul>
+<ul>
+<li>=bar <span>[[foo]]</span>
+</li>
+</ul>
+<ul>
+<li>[[bar <span>[[foo]]</span>
+</li>
+</ul>
+<ul>
+<li>]]bar <span>[[foo]]</span>
+</li>
+</ul>
+<ul>
+<li>=bar <span>foo]]</span>=
+</li>
+</ul>
+<ul>
+<li> <s></s>: a
+</li>
+</ul>
!!end
!! test
Lists: 6. Escape bullets in SOL position
!! options
-disabled
+parsoid
!! input
<!--cmt--><nowiki>*foo</nowiki>
!! result
-<p><!--cmt-->*foo
-</p>
+<p><!--cmt--><span typeof="mw:Nowiki">*foo</span></p>
!!end
!! test
Lists: 7. Escape bullets in a multi-line context
!! input
-<nowiki>a
-*b</nowiki>
+a
+<nowiki>*</nowiki>b
!! result
<p>a
*b
@@ -13270,18 +17190,15 @@ Lists: 7. Escape bullets in a multi-line context
!! test
HRs: 1. Single line
!! options
-disabled
+parsoid
!! input
-----
-<nowiki>----</nowiki>
-----
-<nowiki>=foo=</nowiki>
-----
-<nowiki>*foo</nowiki>
+----<nowiki>----</nowiki>
+----=foo=
+----*foo
!! result
-<hr/>----
-<hr/>=foo=
-<hr/>*foo
+<hr><span typeof="mw:Nowiki">----</span>
+<hr>=foo=
+<hr>*foo
!! end
#### --------------- Tables ---------------
@@ -13344,102 +17261,92 @@ Tables: 1d. No escaping needed
!! test
Tables: 2a. Nested in td
!! options
-disabled
+parsoid
!! input
{|
|<nowiki>foo|bar</nowiki>
|}
!! result
-<table>
-<tr><td>foo|bar
-</td></tr></table>
-
+<table><tbody><tr>
+<td><span typeof="mw:Nowiki">foo|bar</span></td></tr></tbody></table>
!! end
!! test
Tables: 2b. Nested in td
!! options
-disabled
+parsoid
!! input
{|
|<nowiki>foo||bar</nowiki>
|''it''<nowiki>foo||bar</nowiki>
|}
!! result
-<table>
-<tr><td>foo||bar
-</td><td><i>it</i>foo||bar
-</td></tr></table>
-
+<table><tbody><tr>
+<td><span typeof="mw:Nowiki">foo||bar</span></td>
+<td><i>it</i><span typeof="mw:Nowiki">foo||bar</span></td></tr></tbody></table>
!! end
!! test
Tables: 2c. Nested in td -- no escaping needed
!! options
-disabled
+parsoid
!! input
{|
|foo!!bar
|}
!! result
-<table>
-<tr><td>foo!!bar
-</td></tr></table>
+<table><tbody><tr><td>foo!!bar
+</td></tr></tbody></table>
!! end
!! test
Tables: 3a. Nested in th
!! options
-disabled
+parsoid
!! input
{|
!foo!bar
|}
!! result
-<table>
-<tr><th>foo!bar
-</th></tr></table>
+<table><tbody><tr><th>foo!bar
+</th></tr></tbody></table>
!! end
!! test
Tables: 3b. Nested in th
!! options
-disabled
+parsoid
!! input
{|
!<nowiki>foo!!bar</nowiki>
|}
!! result
<table>
-<tr><th>foo!!bar
-</th></tr></table>
-
+<tbody><tr><th><span typeof="mw:Nowiki">foo!!bar</span></th></tr>
+</tbody></table>
!! end
!! test
Tables: 3c. Nested in th -- no escaping needed
!! options
-disabled
+parsoid
!! input
{|
-!foo||bar
+!<nowiki>foo||bar</nowiki>
|}
!! result
-<table>
-<tr><th>foo||bar
-</th></tr></table>
-
+<table><tbody><tr>
+<th><span typeof="mw:Nowiki">foo||bar</span></th></tr></tbody></table>
!! end
!! test
Tables: 4a. Escape -
!! options
-disabled
+parsoid
!! input
{|
-|-
!-bar
|-
|<nowiki>-bar</nowiki>
@@ -13447,17 +17354,16 @@ disabled
!! result
<table><tbody>
<tr><th>-bar</th></tr>
-<tr><td>-bar</td></tr>
-</tbody></table>
+<tr>
+<td><span typeof="mw:Nowiki">-bar</span></td></tr></tbody></table>
!! end
!! test
Tables: 4b. Escape +
!! options
-disabled
+parsoid
!! input
{|
-|-
!+bar
|-
|<nowiki>+bar</nowiki>
@@ -13465,32 +17371,48 @@ disabled
!! result
<table><tbody>
<tr><th>+bar</th></tr>
-<tr><td>+bar</td></tr>
-</tbody></table>
+<tr>
+<td><span typeof="mw:Nowiki">+bar</span></td></tr></tbody></table>
!! end
!! test
Tables: 4c. No escaping needed
!! options
-disabled
+parsoid
!! input
{|
-|-
|foo-bar
|foo+bar
|-
|''foo''-bar
|''foo''+bar
+|-
+|foo
+bar|baz
++bar
+-bar
|}
!! result
<table><tbody>
<tr><td>foo-bar</td><td>foo+bar</td></tr>
<tr><td><i>foo</i>-bar</td><td><i>foo</i>+bar</td></tr>
+<tr><td>foo
+<p>bar|baz
++bar
+-bar</p></td></tr>
</tbody></table>
!! end
+### SSS FIXME: Disabled right now because accurate html2wt
+### on this snippet requires data-parsoid flags that we've
+### stripped out of these tests. We should scheme how we
+### we want to handle these kind of tests that require
+### data-parsoid flags for accurate html2wt serialization
+
!! test
Tables: 4d. No escaping needed
+!! options
+disabled
!! input
{|
||+1
@@ -13506,7 +17428,7 @@ Tables: 4d. No escaping needed
!! end
-#### --------------- Links ---------------
+#### --------------- Links ----------------
#### 1. Quote marks in link text
#### 2. Wikilinks: Escapes needed
#### 3. Wikilinks: No escapes needed
@@ -13516,9 +17438,9 @@ Tables: 4d. No escaping needed
!! test
Links 1. Quote marks in link text
!! options
-disabled
+parsoid
!! input
-[[Foo|<nowiki>Foo''boo''</nowiki>]]
+[[Foo|Foo<nowiki>''boo''</nowiki>]]
!! result
<a rel="mw:WikiLink" href="Foo">Foo''boo''</a>
!! end
@@ -13526,15 +17448,18 @@ disabled
!! test
Links 2. WikiLinks: Escapes needed
!! options
-disabled
+parsoid
!! input
[[Foo|<nowiki>[Foobar]</nowiki>]]
[[Foo|<nowiki>Foobar]</nowiki>]]
-[[Foo|<nowiki>x [Foobar] x</nowiki>]]
+[[Foo|x [Foobar] x]]
[[Foo|<nowiki>x [http://google.com g] x</nowiki>]]
[[Foo|<nowiki>[[Bar]]</nowiki>]]
[[Foo|<nowiki>x [[Bar]] x</nowiki>]]
[[Foo|<nowiki>|Bar</nowiki>]]
+[[Foo|<nowiki>]]bar</nowiki>]]
+[[Foo|<nowiki>[[bar</nowiki>]]
+[[Foo|<nowiki>x ]] y [[ z</nowiki>]]
!! result
<a href="Foo" rel="mw:WikiLink">[Foobar]</a>
<a href="Foo" rel="mw:WikiLink">Foobar]</a>
@@ -13543,12 +17468,15 @@ disabled
<a href="Foo" rel="mw:WikiLink">[[Bar]]</a>
<a href="Foo" rel="mw:WikiLink">x [[Bar]] x</a>
<a href="Foo" rel="mw:WikiLink">|Bar</a>
+<a href="Foo" rel="mw:WikiLink">]]bar</a>
+<a href="Foo" rel="mw:WikiLink">[[bar</a>
+<a href="Foo" rel="mw:WikiLink">x ]] y [[ z</a>
!! end
!! test
Links 3. WikiLinks: No escapes needed
!! options
-disabled
+parsoid
!! input
[[Foo|[Foobar]]
[[Foo|foo|bar]]
@@ -13560,7 +17488,7 @@ disabled
!! test
Links 4. ExtLinks: Escapes needed
!! options
-disabled
+parsoid
!! input
[http://google.com <nowiki>[google]</nowiki>]
[http://google.com <nowiki>google]</nowiki>]
@@ -13572,7 +17500,7 @@ disabled
!! test
Links 5. ExtLinks: No escapes needed
!! options
-disabled
+parsoid
!! input
[http://google.com [google]
!! result
@@ -13583,26 +17511,44 @@ disabled
#### 1. Quotes inside <b> and <i>
#### 2. Link fragments separated by <i> and <b> tags
#### 3. Link fragments inside <i> and <b>
+#### 4. No escaping needed
#### --------------------------------------
!! test
1. Quotes inside <b> and <i>
+!! options
+parsoid=html2wt,wt2wt
!! input
''<nowiki>'foo'</nowiki>''
''<nowiki>''foo''</nowiki>''
''<nowiki>'''foo'''</nowiki>''
+''foo''<nowiki/>'s
'''<nowiki>'foo'</nowiki>'''
'''<nowiki>''foo''</nowiki>'''
'''<nowiki>'''foo'''</nowiki>'''
'''<nowiki>foo'</nowiki>''<nowiki>bar'</nowiki>''baz'''
+'''foo'''<nowiki/>'s
+'''foo''
+''foo''<nowiki/>'
+'<nowiki/>''foo''<nowiki/>'
+''''foo'''
+'''foo'''<nowiki/>'
+'<nowiki/>'''foo'''<nowiki/>'
!! result
<p><i>'foo'</i>
<i>''foo''</i>
<i>'''foo'''</i>
+<i>foo</i>'s
<b>'foo'</b>
<b>''foo''</b>
<b>'''foo'''</b>
<b>foo'<i>bar'</i>baz</b>
-</p>
+<b>foo</b>'s
+'<i>foo</i>
+<i>foo</i>'
+'<i>foo</i>'
+'<b>foo</b>
+<b>foo</b>'
+'<b>foo</b>'</p>
!! end
!! test
@@ -13618,7 +17564,7 @@ disabled
!! end
!! test
-2. Link fragments inside <i> and <b>
+3. Link fragments inside <i> and <b>
(FIXME: Escaping one or both of [[ and ]] is also acceptable --
this is one of the shortcomings of this format)
!! input
@@ -13631,7 +17577,18 @@ disabled
</p>
!! end
-#### --------------- Paragraphs ---------------
+!! test
+4. No escaping needed
+!! input
+'<span>''bar''</span>'
+'<span>'''bar'''</span>'
+!! result
+<p>'<span><i>bar</i></span>'
+'<span><b>bar</b></span>'
+</p>
+!! end
+
+#### ----------- Paragraphs ---------------
#### 1. No unnecessary escapes
#### --------------------------------------
@@ -13644,9 +17601,9 @@ bar <span><nowiki>[[foo]]</nowiki></span>
[[bar <span><nowiki>[[foo]]</nowiki></span>
-<nowiki>]]bar </nowiki><span><nowiki>[[foo]]</nowiki></span>
+]]bar <span><nowiki>[[foo]]</nowiki></span>
-<nowiki>=bar </nowiki><span>foo]]</span>=
+=bar <span>foo]]</span><nowiki>=</nowiki>
!! result
<p>bar <span>[[foo]]</span>
</p><p>=bar <span>[[foo]]</span>
@@ -13656,31 +17613,78 @@ bar <span><nowiki>[[foo]]</nowiki></span>
</p>
!!end
-#### --------------- PRE ------------------
-#### 1. Leading space in SOL context should be escaped
-#### --------------------------------------
+#### ----------------------- PRE --------------------------
+#### 1. Leading whitespace in SOL context should be escaped
+#### ------------------------------------------------------
!! test
-1. Leading space in SOL context should be escaped
+1. Leading whitespace in SOL context should be escaped
!! options
-disabled
+parsoid
!! input
-<nowiki> foo</nowiki>
-<!--cmt--><nowiki> foo</nowiki>
+<nowiki> </nowiki>a
+
+<nowiki> </nowiki> a
+
+<nowiki> </nowiki>a(tab)
+
+<nowiki> </nowiki> a
+<!--cmt-->
+<nowiki> </nowiki> a
+
+a
+<nowiki> </nowiki>b
+
+a
+<nowiki> </nowiki>b
+
+a
+<nowiki> </nowiki> b
!! result
-<p> foo
-<!--cmt--> foo
-</p>
+<p> a</p>
+<p> a</p>
+<p> a(tab)</p>
+<p> a</p>
+<p><!--cmt--> a</p>
+<p>a
+ b</p>
+<p>a
+ b</p>
+<p>a
+ b</p>
+!! end
+
+#### --------------- Behavior Switches --------------------
+!! test
+1. Valid behavior switches should be escaped
+!! options
+parsoid=html2wt
+!! input
+<nowiki>__TOC__</nowiki>
+!! result
+__TOC__
+!! end
+
+!! test
+2. Invalid behavior switches should not be escaped
+!! options
+parsoid=html2wt
+!! input
+__TOO__
+__|__
+!! result
+__TOO__
+__|__
!! end
#### --------------- HTML tags ---------------
#### 1. a tags
#### 2. other tags
#### 3. multi-line html tag
-#### --------------------------------------
+#### -----------------------------------------
!! test
1. a tags
!! options
-disabled
+parsoid
!! input
<a href="http://google.com">google</a>
!! result
@@ -13711,6 +17715,15 @@ disabled
</p>
!! end
+!! test
+4. extension tags
+!! input
+<nowiki><ref>foo</ref></nowiki>
+!! result
+<p>&lt;ref&gt;foo&lt;/ref&gt;
+</p>
+!! end
+
#### --------------- Others ---------------
!! test
Escaping nowikis
@@ -13721,7 +17734,19 @@ Escaping nowikis
</p>
!! end
+## The quote-char in the input is necessary for triggering the bug
+!! test
+(Bug 52035) Nowiki-escaping should not get tripped by " :" in text
+!! options
+parsoid=wt2wt,html2wt
+!! input
+foo's bar :
+!! result
+<p>foo's bar :</p>
+!! end
+
!! test
+
Tag-like HTML structures are passed through as text
!! input
<x y>
@@ -13749,16 +17774,14 @@ a>b
!! end
-# This fails in the PHP parser (see bug 40670,
-# https://bugzilla.wikimedia.org/show_bug.cgi?id=40670), so disabled for it.
+# This was a bug in the PHP parser (see bug 17663 and its dups,
+# https://bugzilla.wikimedia.org/show_bug.cgi?id=17663)
!! test
Tag names followed by punctuation should not be recognized as tags
-!! options
-disabled
!! input
<s.ome> text
!! result
-<p>&lt;s.ome&gt text
+<p>&lt;s.ome&gt; text
</p>
!! end
@@ -13841,14 +17864,34 @@ parsoid
| style="color:red|Bar
|}
!! result
-<table>
+<table><tbody>
<tr>
<td title="Hello world">Foo
</td><td style="color: red">Bar
-</td></tr></table>
+</td></tr></tbody></table>
!! end
+!! test
+Parsoid-only: Don't wrap broken template tags in <nowiki> on wt2wt (Bug 42353)
+!! options
+parsoid
+!! input
+{{}}
+!! result
+{{}}
+!! end
+
+!! test
+Parsoid-only: Don't wrap broken template tags in <nowiki> on wt2wt (Bug 42353)
+!! options
+parsoid
+!! input
+}}{{
+!! result
+}}{{
+!! end
+
!!test
Accept empty td cell attribute
!!input
@@ -13915,6 +17958,556 @@ Empty table rows go away
!! end
+###
+### Parsoid-centric tests for testing RTing of inter-element separators
+### Edge cases not tested by existing parser tests and specific to
+### Parsoid-specific serialization strategies.
+###
+
+!!test
+RT-ed inter-element separators should be valid separators
+!!input
+{|
+|- [[foo]]
+|}
+!!result
+<table>
+
+</table>
+
+!!end
+
+!!test
+Trailing newlines in a deep dom-subtree that ends a wikitext line should be migrated out
+(Parsoid-only since PHP parser relies on Tidy for correct output)
+!!options
+parsoid
+!!input
+{|
+|<small>foo
+bar
+|}
+
+{|
+|<small>foo<small>
+|}
+!!result
+!!end
+
+!!test
+Empty TD followed by TD with tpl-generated attribute
+!!input
+{|
+|-
+|
+|{{echo|style='color:red'}}|foo
+|}
+!!result
+<table>
+
+<tr>
+<td>
+</td>
+<td>foo
+</td></tr></table>
+
+!!end
+
+!!test
+Indented table with an empty td
+!!input
+ {|
+ |-
+ |
+ |foo
+ |}
+!!result
+<table>
+
+<tr>
+<td>
+</td>
+<td>foo
+</td></tr></table>
+
+!!end
+
+!!test
+Empty TR followed by a template-generated TR
+(Parsoid-specific since PHP parser doesn't handle this mixed tbl-wikitext)
+!!options
+parsoid
+!!input
+{|
+|-
+{{echo|<tr><td>foo</td></tr>}}
+|}
+!!result
+<table>
+<tbody>
+<tr></tr>
+<tr about="#mwt1" typeof="mw:Transclusion" data-mw='{"parts":[{"template":{"target":{"wt":"echo","href":"./Template:Echo"},"params":{"1":{"wt":"<tr><td>foo</td></tr>"}},"i":0}}]}'>
+<td>foo</td></tr>
+</tbody></table>
+!!end
+
+## PHP and parsoid output differ for this, and since this is primarily
+## for testing Parsoid's serializer, marking this Parsoid only
+!!test
+Empty TR followed by mixed-ws-comment line should RT correctly
+!!options
+parsoid
+!!input
+{|
+|-
+ <!--c-->
+|-
+<!--c--> <!--d-->
+|}
+!!result
+<table>
+<tbody>
+<tr></tr>
+ <!--c-->
+<tr>
+<!--c--> </tr><!--d-->
+</tbody></table>
+
+!!end
+
+!!test
+Multi-line image caption generated by templates with/without trailing newlines
+!!options
+parsoid
+!!input
+[[File:foo.jpg|thumb|300px|foo\n{{echo|A}}\n{{echo|B}}\n{{echo|C}}]]
+[[File:foo.jpg|thumb|300px|foo\n{{echo|A}}\n{{echo|B}}\n{{echo|C}}\n\n]]
+!!result
+<div class="thumb tright"><div class="thumbinner" style="width:182px;"><a href="/index.php?title=Special:Upload&amp;wpDestFile=Foo.jpg" class="new" title="File:Foo.jpg">File:Foo.jpg</a> <div class="thumbcaption">foo\nA\nB\nC</div></div></div>
+<div class="thumb tright"><div class="thumbinner" style="width:182px;"><a href="/index.php?title=Special:Upload&amp;wpDestFile=Foo.jpg" class="new" title="File:Foo.jpg">File:Foo.jpg</a> <div class="thumbcaption">foo\nA\nB\nC\n\n</div></div></div>
+
+!!end
+
+## PHP emits broken html for this, and since this is primarily
+## a Parsoid serializer test, marking this Parsoid only
+!!test
+Improperly nested inline or quotes tags with whitespace in between
+!!options
+parsoid
+!!input
+<span> <s>x</span> </s>
+''' ''x''' ''
+!!result
+<p><span> <s>x</s></span><s> </s>
+<b> <i>x</i></b><i> </i>
+</p>
+!!end
+
+!!test
+Encapsulate protected attributes from wt
+!!options
+parsoid
+!!input
+<div typeof="mw:placeholder stuff" data-parsoid="weird" data-parsoid-other="no" about="time" rel="mw:true">foo</div>
+!!result
+<body><div data-x-typeof="mw:placeholder stuff" data-x-data-parsoid="weird" data-x-data-parsoid-other="no" data-x-about="time" data-x-rel="mw:true">foo</div>
+</body>
+!!end
+
+## Currently the p-wrapper is fragile in how adds / removes transformations.
+## Having nested or stray pre tags results in the attempt to add duplicates,
+## causing an assertion fail. This test tries to prevent that situation.
+!!test
+Ensure ParagraphWrapper can deal with stray closing pre tags
+!!options
+parsoid=wt2html
+!!input
+plain text</pre>
+!!result
+plain text
+!!end
+
+!!test
+Ensure fostered text content is wrapped in spans
+!!options
+parsoid=wt2html
+!!input
+<table>hi</table><table>ho</table>
+!!result
+<span>hi</span>
+<table></table>
+<span>ho</span>
+<table></table>
+!!end
+
+!!test
+Encapsulation properly handles null DSR information from foster box
+!!options
+parsoid=wt2html,wt2wt
+!!input
+{{echo|<table>foo<tr><td>bar</td></tr></table>}}
+!!result
+<span typeof="mw:Transclusion" data-mw="{&quot;parts&quot;:[{&quot;template&quot;:{&quot;target&quot;:{&quot;wt&quot;:&quot;echo&quot;,&quot;href&quot;:&quot;./Template:Echo&quot;},&quot;params&quot;:{&quot;1&quot;:{&quot;wt&quot;:&quot;
+<table>foo
+<tr>
+<td>bar</td></tr></table>&quot;}},&quot;i&quot;:0}}]}">foo</span>
+<table>
+<tbody>
+<tr>
+<td>bar</td></tr></tbody></table>
+!!end
+
+!!test
+1. Encapsulate foster-parented transclusion content
+!!options
+parsoid=wt2wt,wt2html
+!!input
+<table>{{echo|foo<tr><td>bar</td></tr>}}</table>
+!!result
+<span typeof="mw:Transclusion" data-mw="{&quot;parts&quot;:[&quot;
+<table>&quot;,{&quot;template&quot;:{&quot;target&quot;:{&quot;wt&quot;:&quot;echo&quot;,&quot;href&quot;:&quot;./Template:Echo&quot;},&quot;params&quot;:{&quot;1&quot;:{&quot;wt&quot;:&quot;foo
+<tr>
+<td>bar</td></tr>&quot;}},&quot;i&quot;:0}},&quot;</table>&quot;]}">foo</span>
+<table>
+<tbody>
+<tr>
+<td>bar</td></tr></tbody></table>
+!!end
+
+!!test
+2. Encapsulate foster-parented transclusion content
+!!options
+parsoid=wt2wt,wt2html
+!!input
+<table><div>{{echo|foo}}</div><tr><td>bar</td></tr></table>
+!!result
+<div typeof="mw:Transclusion" data-mw="{&quot;parts&quot;:[&quot;
+<table>
+<div>&quot;,{&quot;template&quot;:{&quot;target&quot;:{&quot;wt&quot;:&quot;echo&quot;,&quot;href&quot;:&quot;./Template:Echo&quot;},&quot;params&quot;:{&quot;1&quot;:{&quot;wt&quot;:&quot;foo&quot;}},&quot;i&quot;:0}},&quot;</div>
+<tr>
+<td>bar</td></tr></table>&quot;]}">foo</div>
+<table>
+<tbody>
+<tr>
+<td>bar</td></tr></tbody></table>
+!!end
+
+!!test
+3. Encapsulate foster-parented transclusion content
+!!options
+parsoid=wt2wt,wt2html
+!!input
+<table><div><p>{{echo|foo</p></div><tr><td>}}bar</td></tr></table>
+!!result
+<div typeof="mw:Transclusion" data-mw="{&quot;parts&quot;:[&quot;
+<table>
+<div>
+<p>&quot;,{&quot;template&quot;:{&quot;target&quot;:{&quot;wt&quot;:&quot;echo&quot;,&quot;href&quot;:&quot;./Template:Echo&quot;},&quot;params&quot;:{&quot;1&quot;:{&quot;wt&quot;:&quot;foo</p></div>
+<tr>
+<td>&quot;}},&quot;i&quot;:0}},&quot;bar</td></tr></table>&quot;]}">
+<p>foo</p></div>
+<table>
+<tbody>
+<tr>
+<td>bar</td></tr></tbody></table>
+!!end
+
+!!test
+4. Encapsulate foster-parented transclusion content
+!!options
+parsoid=wt2wt,wt2html
+!!input
+<table><div><p>{{echo|foo</p></div><tr><td>}}bar</td></tr></table>
+!!result
+<div typeof="mw:Transclusion" data-mw="{&quot;parts&quot;:[&quot;
+<table>
+<div>
+<p>&quot;,{&quot;template&quot;:{&quot;target&quot;:{&quot;wt&quot;:&quot;echo&quot;,&quot;href&quot;:&quot;./Template:Echo&quot;},&quot;params&quot;:{&quot;1&quot;:{&quot;wt&quot;:&quot;foo</p></div>
+<tr>
+<td>&quot;}},&quot;i&quot;:0}},&quot;bar</td></tr></table>&quot;]}">
+<p>foo</p></div>
+<table>
+<tbody>
+<tr>
+<td>bar</td></tr></tbody></table>
+!!end
+
+!!test
+5. Encapsulate foster-parented transclusion content
+!!options
+parsoid=wt2wt,wt2html
+!!input
+<table><tr><td><div><p>{{echo|foo</p></div></td>foo}}</tr></table>
+!!result
+<span typeof="mw:Transclusion" data-mw="{&quot;parts&quot;:[&quot;
+<table>
+<tr>
+<td>
+<div>
+<p>&quot;,{&quot;template&quot;:{&quot;target&quot;:{&quot;wt&quot;:&quot;echo&quot;,&quot;href&quot;:&quot;./Template:Echo&quot;},&quot;params&quot;:{&quot;1&quot;:{&quot;wt&quot;:&quot;foo</p></div></td>foo&quot;}},&quot;i&quot;:0}},&quot;</tr></table>&quot;]}">foo</span>
+<table>
+<tbody>
+<tr>
+<td>
+<div>
+<p>foo</p></div></td></tr></tbody></table>
+!!end
+
+!!test
+6. Encapsulate foster-parented transclusion content
+!!options
+parsoid=wt2wt,wt2html
+!!input
+<table><tr><td><div><p>{{echo|foo</p></div></td>foo</tr></table>}}<p>ok</p>
+!!result
+<span typeof="mw:Transclusion" data-mw="{&quot;parts&quot;:[&quot;
+<table>
+<tr>
+<td>
+<div>
+<p>&quot;,{&quot;template&quot;:{&quot;target&quot;:{&quot;wt&quot;:&quot;echo&quot;,&quot;href&quot;:&quot;./Template:Echo&quot;},&quot;params&quot;:{&quot;1&quot;:{&quot;wt&quot;:&quot;foo</p></div></td>foo</tr></table>&quot;}},&quot;i&quot;:0}}]}">foo</span>
+<table>
+<tbody>
+<tr>
+<td>
+<div>
+<p>foo</p></div></td></tr></tbody></table>
+<p>ok</p>
+!!end
+
+!!test
+7. Encapsulate foster-parented transclusion content
+!!options
+parsoid=wt2wt,wt2html
+!!input
+<table>{{echo|<p>foo</p>}}<td>bar</td></table>
+!!result
+<p typeof="mw:Transclusion" data-mw="{&quot;parts&quot;:[&quot;
+<table>&quot;,{&quot;template&quot;:{&quot;target&quot;:{&quot;wt&quot;:&quot;echo&quot;,&quot;href&quot;:&quot;./Template:Echo&quot;},&quot;params&quot;:{&quot;1&quot;:{&quot;wt&quot;:&quot;
+<p>foo</p>&quot;}},&quot;i&quot;:0}},&quot;
+<td>bar</td></table>&quot;]}">foo</p>
+<table>
+<tbody>
+<tr>
+<td>bar</td></tr></tbody></table>
+!!end
+
+!!test
+8. Encapsulate foster-parented transclusion content
+!!options
+parsoid=wt2wt,wt2html
+!!input
+{{echo|a
+}}{|{{echo|style='color:red'}}
+|-
+|b
+|}
+!!result
+<p typeof="mw:Transclusion" data-mw="{&quot;parts&quot;:[{&quot;template&quot;:{&quot;target&quot;:{&quot;wt&quot;:&quot;echo&quot;,&quot;href&quot;:&quot;./Template:Echo&quot;},&quot;params&quot;:{&quot;1&quot;:{&quot;wt&quot;:&quot;a\n&quot;}},&quot;i&quot;:0}}]}">a</p><span typeof="mw:Transclusion" data-mw="{&quot;parts&quot;:[&quot;{|&quot;,{&quot;template&quot;:{&quot;target&quot;:{&quot;wt&quot;:&quot;echo&quot;,&quot;href&quot;:&quot;./Template:Echo&quot;},&quot;params&quot;:{&quot;style&quot;:{&quot;wt&quot;:&quot;'color:red'&quot;}},&quot;i&quot;:0}},&quot;\n|-\n|b\n|}&quot;]}">{{{1}}}</span>
+<table>
+<tbody>
+<tr>
+<td>b</td></tr></tbody></table>
+!!end
+
+# -----------------------------------------------------------------
+# The following section of tests are primarily to spec requirements
+# around serialization of new/edited content.
+#
+# All these tests are marked Parsoid html2wt and html2html only
+# ----------------------------------------------------------------
+
+!! test
+Image: Modifying size of an image
+!! options
+parsoid=html2wt
+!! input
+[[Image:Wiki.png|230x230px]]
+!! result
+<p data-parsoid='{"dsr":[0,24,0,0]}'><span typeof="mw:Image" data-parsoid='{"optList":[{"ck":"width","ak":"100px"}],"cacheKey":"[[Image:Wiki.png|100px]]","img":{"h":115,"w":100,"wdset":true},"dsr":[0,24,null,null]}'><a href="./File:Wiki.png" data-parsoid='{"a":{"href":"./File:Wiki.png"}}'><img resource="./File:Wiki.png" src="//upload.wikimedia.org/wikipedia/en/thumb/b/bc/Wiki.png/100px-Wiki.png" height="230" width="200" data-parsoid='{"a":{"resource":"./File:Wiki.png"},"sa":{"resource":"Image:Wiki.png"}}'></a></span></p>
+!!end
+
+!! test
+Image: New block level image should have \n before and after
+!! options
+parsoid=html2wt
+!! input
+123
+[[File:Wiki.png|right|thumb|150x150px]]
+456
+!! result
+<p>123</p><figure typeof="mw:Image/Thumb" class="mw-halign-right"><a href="./File:Wiki.png"><img src="http://192.168.142.128/mw/images/thumb/b/bc/Wiki.png/131px-Wiki.png" width="131" height="150" resource="./File:Wiki.png"></a></figure><p>456</p>
+!!end
+
+# Wacky -- the leading newline in input is required because
+# that is what the serializer emits. To be fixed. Not fixing
+# the test because this test is required to test serialization of
+# new content and preferred whitespace style.
+!! test
+Lists: Serialize correctly even when list content is wrapped in p-tags (like VE does)
+!! options
+parsoid=html2wt
+!! input
+
+* foo
+!! result
+<ul>
+<li><p>foo</p></li>
+</ul>
+!! end
+
+# Wacky -- the leading newline in input is required because
+# that is what the serializer emits. To be fixed. Not fixing
+# the test because this test is required to test serialization of
+# new content and preferred whitespace style.
+!! test
+Lists: Add space after bullets
+!! options
+parsoid=html2wt
+!! input
+
+* foo
+* bar
+* <span> baz</span>
+!! result
+<ul>
+<li>foo</li>
+<li> bar</li>
+<li><span> baz</span></li>
+</ul>
+!! end
+
+!! test
+Parsoid: Serialize positional parameters with = in them as named parameter
+!! options
+parsoid=html2wt
+!! input
+{{echo|1 = f=oo}}
+
+{{echo|1 = f=oo|2 = bar}}
+
+<!--Orig params with data-parsoid has heuristics for handling = chars-->
+<!--FIXME: But maybe the heuristic needs fixing to apply to new params as well-->
+{{echo|<nowiki>f=oo</nowiki>|bar}}
+!! result
+<p about="#mwt1" typeof="mw:Transclusion"
+data-mw='{"parts":[{"template":{"target":{"wt":"echo","href":"./Template:Echo"},"params":{"1":{"wt":"f=oo"}},"i":0}}]}'>foo</p>
+
+<p about="#mwt1" typeof="mw:Transclusion"
+data-mw='{"parts":[{"template":{"target":{"wt":"echo","href":"./Template:Echo"},"params":{"1":{"wt":"f=oo"}, "2":{"wt":"bar"}},"i":0}}]}'>foo</p>
+
+<!--Orig params with data-parsoid has heuristics for handling = chars-->
+<!--FIXME: But maybe the heuristic needs fixing to apply to new params as well-->
+<p data-parsoid='{"pi":[[{"k":"1","spc":["","","",""]},{"k":"2","spc":["","","",""]}]]}' about="#mwt1" typeof="mw:Transclusion" data-mw='{"parts":[{"template":{"target":{"wt":"echo","href":"./Template:Echo"},"params":{"1":{"wt":"f=oo"},"2":{"wt":"bar"}},"i":0}}]}'>foo</p>
+!! end
+
+!! test
+Parsoid: Correctly serialize block-node children when they are a combination of text and p-nodes
+!! options
+parsoid=html2wt
+!! input
+<div>a
+b
+</div>
+<div>a
+b
+</div>
+<div>
+a
+
+b
+</div>
+!! result
+<div>a<p>b</p></div>
+<div>a
+<p>b</p></div>
+<div>
+a
+<p>b</p></div>
+!! end
+
+#-----------------------------
+# I/B quote minimization tests
+#-----------------------------
+
+!! test
+1. I/B quote minimization: wikitext-only tags should be combined
+!! options
+parsoid=html2wt
+!! input
+''AB''
+
+'''AB'''
+
+''A'''B'''''
+
+'''A''B'''''
+
+'''A''BC''D'''
+
+'''''AB'''''
+
+'''''AB'''''
+
+'''''AB'''''
+!! result
+<p><i>A</i><i>B</i></p>
+<p><b>A</b><b>B</b></p>
+<p><i>A</i><b><i>B</i></b></p>
+<p><b>A</b><i><b>B</b></i></p>
+<p><b>A</b><i><b>B</b><b>C</b></i><b>D</b></p>
+<p><i><b>A</b></i><i><b>B</b></i></p>
+<p><i><b>A</b></i><b><i>B</i></b></p>
+<p><b><i>A</i></b><i><b>B</b></i></p>
+!! end
+
+!! test
+2. I/B quote minimization: wikitext and html tags should not be combined
+!! options
+parsoid=html2wt
+!! input
+''A''<i>B</i>
+
+''A'''''<i>B</i>'''
+!! result
+<p><i>A</i><i data-parsoid='{"stx":"html"}'>B</i></p>
+<p><i>A</i><b><i data-parsoid='{"stx":"html"}'>B</i></b></p>
+!! end
+
+!! test
+3. I/B quote minimization: templated content stops minimization
+!! options
+parsoid=html2wt
+!! input
+''A''{{echo|''B''}}
+
+''A''{{echo|'''''B'''''}}
+!! result
+<p><i>A</i><i about="#mwt1" typeof="mw:Transclusion" data-mw='{"parts":[{"template":{"target":{"wt":"echo","href":"./Template:Echo"},"params":{"1":{"wt":"&#39;&#39;B&#39;&#39;"}},"i":0}}]}'>B</i>
+<p><i>A</i><b about="#mwt1" typeof="mw:Transclusion" data-mw='{"parts":[{"template":{"target":{"wt":"echo","href":"./Template:Echo"},"params":{"1":{"wt":"&#39;&#39;&#39;&#39;&#39;B&#39;&#39;&#39;&#39;&#39;"}},"i":0}}]}'><i>B</i></b>
+!! end
+
+!! test
+4. I/B quote minimization: new content should be mimimized with adjacent old content
+!! options
+parsoid=html2wt
+!! input
+''AB''
+
+'''AB'''
+
+''A'''B'''''
+!! result
+<p><i>A</i><i data-parsoid='{}'>B</i></p>
+<p><b data-parsoid='{}'>A</b><b>B</b></p>
+<p><i>A</i><b data-parsoid='{}'><i data-parsoid='{}'>B</i></b></p>
+!! end
+
+# -----------------------------------------------------------------
+# End of section for Parsoid-only html2wt tests for serialization
+# of new content
+# -----------------------------------------------------------------
+
TODO:
more images
more tables
diff --git a/tests/parser/preprocess/All_system_messages.expected b/tests/parser/preprocess/All_system_messages.expected
index 897c5fb0..078d8f0d 100644
--- a/tests/parser/preprocess/All_system_messages.expected
+++ b/tests/parser/preprocess/All_system_messages.expected
@@ -1239,27 +1239,6 @@ diff
&lt;/td&gt;&lt;td&gt;
<template lineStart="1"><title>int:Difference</title></template>
&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Disambiguations&amp;action=edit disambiguations]&lt;br&gt;
-[[MediaWiki_talk:Disambiguations|Talk]]
-&lt;/td&gt;&lt;td&gt;
-Disambiguation pages
-&lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Disambiguations</title></template>
-&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Disambiguationspage&amp;action=edit disambiguationspage]&lt;br&gt;
-[[MediaWiki_talk:Disambiguationspage|Talk]]
-&lt;/td&gt;&lt;td&gt;
-Wiktionary:Links_to_disambiguating_pages
-&lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Disambiguationspage</title></template>
-&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Disambiguationstext&amp;action=edit disambiguationstext]&lt;br&gt;
-[[MediaWiki_talk:Disambiguationstext|Talk]]
-&lt;/td&gt;&lt;td&gt;
-The following pages link to a &amp;lt;i&amp;gt;disambiguation page&amp;lt;/i&amp;gt;. They should link to the appropriate topic instead.&amp;lt;br /&amp;gt;A page is treated as dismbiguation if it is linked from $1.&amp;lt;br /&amp;gt;Links from other namespaces are &amp;lt;i&amp;gt;not&amp;lt;/i&amp;gt; listed here.
-&lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Disambiguationstext</title></template>
-&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Disclaimerpage&amp;action=edit disclaimerpage]&lt;br&gt;
[[MediaWiki_talk:Disclaimerpage|Talk]]
&lt;/td&gt;&lt;td&gt;
diff --git a/tests/parser/preprocess/All_system_messages.txt b/tests/parser/preprocess/All_system_messages.txt
index fc10d7cf..3c30da94 100644
--- a/tests/parser/preprocess/All_system_messages.txt
+++ b/tests/parser/preprocess/All_system_messages.txt
@@ -1239,27 +1239,6 @@ diff
</td><td>
{{int:Difference}}
</td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Disambiguations&action=edit disambiguations]<br>
-[[MediaWiki_talk:Disambiguations|Talk]]
-</td><td>
-Disambiguation pages
-</td><td>
-{{int:Disambiguations}}
-</td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Disambiguationspage&action=edit disambiguationspage]<br>
-[[MediaWiki_talk:Disambiguationspage|Talk]]
-</td><td>
-Wiktionary:Links_to_disambiguating_pages
-</td><td>
-{{int:Disambiguationspage}}
-</td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Disambiguationstext&action=edit disambiguationstext]<br>
-[[MediaWiki_talk:Disambiguationstext|Talk]]
-</td><td>
-The following pages link to a &lt;i&gt;disambiguation page&lt;/i&gt;. They should link to the appropriate topic instead.&lt;br /&gt;A page is treated as dismbiguation if it is linked from $1.&lt;br /&gt;Links from other namespaces are &lt;i&gt;not&lt;/i&gt; listed here.
-</td><td>
-{{int:Disambiguationstext}}
-</td></tr><tr><td>
[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Disclaimerpage&action=edit disclaimerpage]<br>
[[MediaWiki_talk:Disclaimerpage|Talk]]
</td><td>
diff --git a/tests/parserTests.php b/tests/parserTests.php
index 804a30cb..debb3575 100644
--- a/tests/parserTests.php
+++ b/tests/parserTests.php
@@ -27,8 +27,8 @@
$otions = array( 'quick', 'color', 'quiet', 'help', 'show-output', 'record', 'run-disabled', 'run-parsoid' );
$optionsWithArgs = array( 'regex', 'filter', 'seed', 'setversion' );
-require_once( __DIR__ . '/../maintenance/commandLine.inc' );
-require_once( __DIR__ . '/TestsAutoLoader.php' );
+require_once __DIR__ . '/../maintenance/commandLine.inc';
+require_once __DIR__ . '/TestsAutoLoader.php';
if ( isset( $options['help'] ) ) {
echo <<<ENDS
@@ -84,11 +84,11 @@ if ( isset( $options['file'] ) ) {
# Print out software version to assist with locating regressions
$version = SpecialVersion::getVersion();
-echo( "This is MediaWiki version {$version}.\n\n" );
+echo "This is MediaWiki version {$version}.\n\n";
if ( isset( $options['fuzz'] ) ) {
$tester->fuzzTest( $files );
} else {
$ok = $tester->runTestsFromFiles( $files );
- exit ( $ok ? 0 : 1 );
+ exit( $ok ? 0 : 1 );
}
diff --git a/tests/phpunit/MediaWikiLangTestCase.php b/tests/phpunit/MediaWikiLangTestCase.php
index 0cf6e383..1131385f 100644
--- a/tests/phpunit/MediaWikiLangTestCase.php
+++ b/tests/phpunit/MediaWikiLangTestCase.php
@@ -15,6 +15,10 @@ abstract class MediaWikiLangTestCase extends MediaWikiTestCase {
"\$wgContLang->getCode() (" . $wgContLang->getCode() . ")" );
}
+ // HACK: Call getLanguage() so the real $wgContLang is cached as the user language
+ // rather than our fake one. This is to avoid breaking other, unrelated tests.
+ RequestContext::getMain()->getLanguage();
+
$langCode = 'en'; # For mainpage to be 'Main Page'
$langObj = Language::factory( $langCode );
diff --git a/tests/phpunit/MediaWikiPHPUnitCommand.php b/tests/phpunit/MediaWikiPHPUnitCommand.php
index 12c2e003..042956a9 100644
--- a/tests/phpunit/MediaWikiPHPUnitCommand.php
+++ b/tests/phpunit/MediaWikiPHPUnitCommand.php
@@ -12,13 +12,29 @@ class MediaWikiPHPUnitCommand extends PHPUnit_TextUI_Command {
'use-normal-tables' => false,
'reuse-db' => false,
'wiki=' => false,
+ 'debug-tests' => false,
);
public function __construct() {
foreach ( self::$additionalOptions as $option => $default ) {
$this->longOptions[$option] = $option . 'Handler';
}
+ }
+
+ protected function handleArguments( array $argv ) {
+ parent::handleArguments( $argv );
+
+ if ( !isset( $this->arguments['listeners'] ) ) {
+ $this->arguments['listeners'] = array();
+ }
+ foreach ( $this->options[0] as $option ) {
+ switch ( $option[0] ) {
+ case '--debug-tests':
+ $this->arguments['listeners'][] = new MediaWikiPHPUnitTestListener( 'PHPUnitCommand' );
+ break;
+ }
+ }
}
public static function main( $exit = true ) {
@@ -86,7 +102,7 @@ class MediaWikiPHPUnitCommand extends PHPUnit_TextUI_Command {
ParserTest-specific options:
--regex="<regex>" Only run parser tests that match the given regex
- --file="<filename>" Prints the version and exits.
+ --file="<filename>" File describing parser tests
--keep-uploads Re-use the same upload directory for each test, don't delete it
@@ -95,7 +111,9 @@ Database options:
--reuse-db Init DB only if tables are missing and keep after finish.
+Debugging options:
+ --debug-tests Log testing activity to the PHPUnitCommand log channel.
+
EOT;
}
-
}
diff --git a/tests/phpunit/MediaWikiPHPUnitTestListener.php b/tests/phpunit/MediaWikiPHPUnitTestListener.php
new file mode 100644
index 00000000..7237ef32
--- /dev/null
+++ b/tests/phpunit/MediaWikiPHPUnitTestListener.php
@@ -0,0 +1,114 @@
+<?php
+class MediaWikiPHPUnitTestListener implements PHPUnit_Framework_TestListener {
+
+ /**
+ * @var string
+ */
+ protected $logChannel;
+
+ public function __construct( $logChannel ) {
+ $this->logChannel = $logChannel;
+ }
+
+ protected function getTestName( PHPUnit_Framework_Test $test ) {
+ $name = get_class( $test );
+
+ if ( $test instanceof PHPUnit_Framework_TestCase ) {
+ $name .= '::' . $test->getName( true );
+ }
+
+ return $name;
+ }
+
+ protected function getErrorName( Exception $exception ) {
+ $name = get_class( $exception );
+ $name = "[$name] " . $exception->getMessage();
+
+ return $name;
+ }
+
+ /**
+ * An error occurred.
+ *
+ * @param PHPUnit_Framework_Test $test
+ * @param Exception $e
+ * @param float $time
+ */
+ public function addError( PHPUnit_Framework_Test $test, Exception $e, $time ) {
+ wfDebugLog( $this->logChannel, 'ERROR in ' . $this->getTestName( $test ) . ': ' . $this->getErrorName( $e ) );
+ }
+
+ /**
+ * A failure occurred.
+ *
+ * @param PHPUnit_Framework_Test $test
+ * @param PHPUnit_Framework_AssertionFailedError $e
+ * @param float $time
+ */
+ public function addFailure( PHPUnit_Framework_Test $test, PHPUnit_Framework_AssertionFailedError $e, $time ) {
+ wfDebugLog( $this->logChannel, 'FAILURE in ' . $this->getTestName( $test ) . ': ' . $this->getErrorName( $e ) );
+ }
+
+ /**
+ * Incomplete test.
+ *
+ * @param PHPUnit_Framework_Test $test
+ * @param Exception $e
+ * @param float $time
+ */
+ public function addIncompleteTest( PHPUnit_Framework_Test $test, Exception $e, $time ) {
+ wfDebugLog( $this->logChannel, 'Incomplete test ' . $this->getTestName( $test ) . ': ' . $this->getErrorName( $e ) );
+ }
+
+ /**
+ * Skipped test.
+ *
+ * @param PHPUnit_Framework_Test $test
+ * @param Exception $e
+ * @param float $time
+ *
+ * @since Method available since Release 3.0.0
+ */
+ public function addSkippedTest( PHPUnit_Framework_Test $test, Exception $e, $time ) {
+ wfDebugLog( $this->logChannel, 'Skipped test ' . $this->getTestName( $test ) . ': ' . $this->getErrorName( $e ) );
+ }
+
+ /**
+ * A test suite started.
+ *
+ * @param PHPUnit_Framework_TestSuite $suite
+ * @since Method available since Release 2.2.0
+ */
+ public function startTestSuite( PHPUnit_Framework_TestSuite $suite ) {
+ wfDebugLog( $this->logChannel, 'START suite ' . $suite->getName() );
+ }
+
+ /**
+ * A test suite ended.
+ *
+ * @param PHPUnit_Framework_TestSuite $suite
+ * @since Method available since Release 2.2.0
+ */
+ public function endTestSuite( PHPUnit_Framework_TestSuite $suite ) {
+ wfDebugLog( $this->logChannel, 'END suite ' . $suite->getName() );
+ }
+
+ /**
+ * A test started.
+ *
+ * @param PHPUnit_Framework_Test $test
+ */
+ public function startTest( PHPUnit_Framework_Test $test ) {
+ wfDebugLog( $this->logChannel, 'Start test ' . $this->getTestName( $test ) );
+ }
+
+ /**
+ * A test ended.
+ *
+ * @param PHPUnit_Framework_Test $test
+ * @param float $time
+ */
+ public function endTest( PHPUnit_Framework_Test $test, $time ) {
+ wfDebugLog( $this->logChannel, 'End test ' . $this->getTestName( $test ) );
+ }
+}
diff --git a/tests/phpunit/MediaWikiTestCase.php b/tests/phpunit/MediaWikiTestCase.php
index 7e6e0ab8..6ce78b56 100644
--- a/tests/phpunit/MediaWikiTestCase.php
+++ b/tests/phpunit/MediaWikiTestCase.php
@@ -64,7 +64,7 @@ abstract class MediaWikiTestCase extends PHPUnit_Framework_TestCase {
'oracle'
);
- function __construct( $name = null, array $data = array(), $dataName = '' ) {
+ function __construct( $name = null, array $data = array(), $dataName = '' ) {
parent::__construct( $name, $data, $dataName );
$this->backupGlobals = false;
@@ -137,6 +137,7 @@ abstract class MediaWikiTestCase extends PHPUnit_Framework_TestCase {
protected function getNewTempFile() {
$fname = tempnam( wfTempDir(), 'MW_PHPUnit_' . get_class( $this ) . '_' );
$this->tmpfiles[] = $fname;
+
return $fname;
}
@@ -158,6 +159,7 @@ abstract class MediaWikiTestCase extends PHPUnit_Framework_TestCase {
// where temporary directory creation is bundled and can be improved
unlink( $fname );
$this->assertTrue( wfMkdirParents( $fname ) );
+
return $fname;
}
@@ -171,7 +173,7 @@ abstract class MediaWikiTestCase extends PHPUnit_Framework_TestCase {
$this->called['setUp'] = 1;
/*
- //@todo: global variables to restore for *every* test
+ // @todo global variables to restore for *every* test
array(
'wgLang',
'wgContLang',
@@ -348,7 +350,8 @@ abstract class MediaWikiTestCase extends PHPUnit_Framework_TestCase {
* Stub. If a test needs to add additional data to the database, it should
* implement this method and do so
*/
- function addDBData() {}
+ function addDBData() {
+ }
private function addCoreDBData() {
# disabled for performance
@@ -377,7 +380,6 @@ abstract class MediaWikiTestCase extends PHPUnit_Framework_TestCase {
'page_touched' => $this->db->timestamp(),
'page_latest' => 0,
'page_len' => 0 ), __METHOD__, array( 'IGNORE' ) );
-
}
User::resetIdByNameCache();
@@ -394,7 +396,6 @@ abstract class MediaWikiTestCase extends PHPUnit_Framework_TestCase {
$user->saveSettings();
}
-
//Make 1 page with 1 revision
$page = WikiPage::factory( Title::newFromText( 'UTPage' ) );
if ( !$page->getId() == 0 ) {
@@ -438,7 +439,7 @@ abstract class MediaWikiTestCase extends PHPUnit_Framework_TestCase {
* even if using different parameters.
*
* @param DatabaseBase $db The database connection
- * @param String $prefix The prefix to use for the new table set (aka schema).
+ * @param String $prefix The prefix to use for the new table set (aka schema).
*
* @throws MWException if the database table prefix is already $prefix
*/
@@ -461,6 +462,7 @@ abstract class MediaWikiTestCase extends PHPUnit_Framework_TestCase {
if ( ( $db->getType() == 'oracle' || !self::$useTemporaryTables ) && self::$reuseDB ) {
CloneDatabase::changePrefix( $prefix );
+
return;
} else {
$dbClone->cloneTableStructure();
@@ -523,6 +525,7 @@ abstract class MediaWikiTestCase extends PHPUnit_Framework_TestCase {
private static function unprefixTable( $tableName ) {
global $wgDBprefix;
+
return substr( $tableName, strlen( $wgDBprefix ) );
}
@@ -534,6 +537,12 @@ abstract class MediaWikiTestCase extends PHPUnit_Framework_TestCase {
global $wgDBprefix;
$tables = $db->listTables( $wgDBprefix, __METHOD__ );
+
+ if ( $db->getType() === 'mysql' ) {
+ # bug 43571: cannot clone VIEWs under MySQL
+ $views = $db->listViews( $wgDBprefix, __METHOD__ );
+ $tables = array_diff( $tables, $views );
+ }
$tables = array_map( array( __CLASS__, 'unprefixTable' ), $tables );
// Don't duplicate test tables from the previous fataled run
@@ -547,6 +556,7 @@ abstract class MediaWikiTestCase extends PHPUnit_Framework_TestCase {
unset( $tables['searchindex_segments'] );
$tables = array_flip( $tables );
}
+
return $tables;
}
@@ -561,13 +571,11 @@ abstract class MediaWikiTestCase extends PHPUnit_Framework_TestCase {
if ( isset( MediaWikiPHPUnitCommand::$additionalOptions[$offset] ) ) {
return MediaWikiPHPUnitCommand::$additionalOptions[$offset];
}
-
}
public function setCliArg( $offset, $value ) {
MediaWikiPHPUnitCommand::$additionalOptions[$offset] = $value;
-
}
/**
@@ -775,7 +783,7 @@ abstract class MediaWikiTestCase extends PHPUnit_Framework_TestCase {
}
/**
- * Returns true iff the given namespace defaults to Wikitext
+ * Returns true if the given namespace defaults to Wikitext
* according to $wgNamespaceContentModels
*
* @param int $ns The namespace ID to check
@@ -839,12 +847,13 @@ abstract class MediaWikiTestCase extends PHPUnit_Framework_TestCase {
) {
$wikitextNS = $ns;
+
return $wikitextNS;
}
}
// give up
- // @todo: Inside a test, we could skip the test as incomplete.
+ // @todo Inside a test, we could skip the test as incomplete.
// But frequently, this is used in fixture setup.
throw new MWException( "No namespace defaults to wikitext!" );
}
@@ -906,6 +915,7 @@ abstract class MediaWikiTestCase extends PHPUnit_Framework_TestCase {
if ( !$loaded ) {
$this->markTestSkipped( "PHP extension '$extName' is not loaded, skipping." );
}
+
return $loaded;
}
@@ -914,6 +924,7 @@ abstract class MediaWikiTestCase extends PHPUnit_Framework_TestCase {
* the provided code.
*
* @since 1.21
+ * @deprecated since 1.22 Use setExpectedException
*
* @param callable $code
* @param string $expected
@@ -934,5 +945,4 @@ abstract class MediaWikiTestCase extends PHPUnit_Framework_TestCase {
$this->assertInstanceOf( $expected, $pokemons, $message );
}
-
}
diff --git a/tests/phpunit/bootstrap.php b/tests/phpunit/bootstrap.php
index 01caf8f4..d929b79d 100644
--- a/tests/phpunit/bootstrap.php
+++ b/tests/phpunit/bootstrap.php
@@ -11,22 +11,5 @@ if ( !defined( 'MW_PHPUNIT_TEST' ) ) {
You are running these tests directly from phpunit. You may not have all globals correctly set.
Running phpunit.php instead is recommended.
EOF;
- require_once ( __DIR__ . "/phpunit.php" );
+ require_once __DIR__ . "/phpunit.php";
}
-
-// Output a notice when running with older versions of PHPUnit
-if ( version_compare( PHPUnit_Runner_Version::id(), "3.6.7", "<" ) ) {
- echo <<<EOF
-********************************************************************************
-
-These tests run best with version PHPUnit 3.6.7 or better. Earlier versions may
-show failures because earlier versions of PHPUnit do not properly implement
-dependencies.
-
-********************************************************************************
-
-EOF;
-}
-
-/** @todo Check if this is really needed */
-MessageCache::destroyInstance();
diff --git a/tests/phpunit/data/db/sqlite/tables-1.16.sql b/tests/phpunit/data/db/sqlite/tables-1.16.sql
index 6e56add2..7e8f30ec 100644
--- a/tests/phpunit/data/db/sqlite/tables-1.16.sql
+++ b/tests/phpunit/data/db/sqlite/tables-1.16.sql
@@ -146,11 +146,6 @@ CREATE TABLE /*_*/externallinks (
CREATE INDEX /*i*/el_from ON /*_*/externallinks (el_from, el_to(40));
CREATE INDEX /*i*/el_to ON /*_*/externallinks (el_to(60), el_from);
CREATE INDEX /*i*/el_index ON /*_*/externallinks (el_index(60));
-CREATE TABLE /*_*/external_user (
- eu_local_id int unsigned NOT NULL PRIMARY KEY,
- eu_external_id varchar(255) binary NOT NULL
-) /*$wgDBTableOptions*/;
-CREATE UNIQUE INDEX /*i*/eu_external_id ON /*_*/external_user (eu_external_id);
CREATE TABLE /*_*/langlinks (
ll_from int unsigned NOT NULL default 0,
ll_lang varbinary(20) NOT NULL default '',
diff --git a/tests/phpunit/data/db/sqlite/tables-1.17.sql b/tests/phpunit/data/db/sqlite/tables-1.17.sql
index 69ae3764..e02e3e14 100644
--- a/tests/phpunit/data/db/sqlite/tables-1.17.sql
+++ b/tests/phpunit/data/db/sqlite/tables-1.17.sql
@@ -151,11 +151,6 @@ CREATE TABLE /*_*/externallinks (
CREATE INDEX /*i*/el_from ON /*_*/externallinks (el_from, el_to(40));
CREATE INDEX /*i*/el_to ON /*_*/externallinks (el_to(60), el_from);
CREATE INDEX /*i*/el_index ON /*_*/externallinks (el_index(60));
-CREATE TABLE /*_*/external_user (
- eu_local_id int unsigned NOT NULL PRIMARY KEY,
- eu_external_id varchar(255) binary NOT NULL
-) /*$wgDBTableOptions*/;
-CREATE UNIQUE INDEX /*i*/eu_external_id ON /*_*/external_user (eu_external_id);
CREATE TABLE /*_*/langlinks (
ll_from int unsigned NOT NULL default 0,
ll_lang varbinary(20) NOT NULL default '',
diff --git a/tests/phpunit/data/db/sqlite/tables-1.18.sql b/tests/phpunit/data/db/sqlite/tables-1.18.sql
index b106d2b7..8bfc28e2 100644
--- a/tests/phpunit/data/db/sqlite/tables-1.18.sql
+++ b/tests/phpunit/data/db/sqlite/tables-1.18.sql
@@ -157,11 +157,6 @@ CREATE TABLE /*_*/externallinks (
CREATE INDEX /*i*/el_from ON /*_*/externallinks (el_from, el_to(40));
CREATE INDEX /*i*/el_to ON /*_*/externallinks (el_to(60), el_from);
CREATE INDEX /*i*/el_index ON /*_*/externallinks (el_index(60));
-CREATE TABLE /*_*/external_user (
- eu_local_id int unsigned NOT NULL PRIMARY KEY,
- eu_external_id varchar(255) binary NOT NULL
-) /*$wgDBTableOptions*/;
-CREATE UNIQUE INDEX /*i*/eu_external_id ON /*_*/external_user (eu_external_id);
CREATE TABLE /*_*/langlinks (
ll_from int unsigned NOT NULL default 0,
ll_lang varbinary(20) NOT NULL default '',
diff --git a/tests/phpunit/data/less/common/test.common.mixins.less b/tests/phpunit/data/less/common/test.common.mixins.less
new file mode 100644
index 00000000..2fbe9b79
--- /dev/null
+++ b/tests/phpunit/data/less/common/test.common.mixins.less
@@ -0,0 +1,5 @@
+.test-mixin (@value) {
+ color: @value;
+ border: @foo solid @Foo;
+ line-height: test-sum(@bar, 10, 20);
+}
diff --git a/tests/phpunit/data/less/module/dependency.less b/tests/phpunit/data/less/module/dependency.less
new file mode 100644
index 00000000..c7725a25
--- /dev/null
+++ b/tests/phpunit/data/less/module/dependency.less
@@ -0,0 +1,3 @@
+@import "test.common.mixins";
+
+@unitTestColor: green;
diff --git a/tests/phpunit/data/less/module/styles.css b/tests/phpunit/data/less/module/styles.css
new file mode 100644
index 00000000..b78780a9
--- /dev/null
+++ b/tests/phpunit/data/less/module/styles.css
@@ -0,0 +1,6 @@
+/* @noflip */
+.unit-tests {
+ color: green;
+ border: 2px solid #eeeeee;
+ line-height: 35;
+}
diff --git a/tests/phpunit/data/less/module/styles.less b/tests/phpunit/data/less/module/styles.less
new file mode 100644
index 00000000..ecac8392
--- /dev/null
+++ b/tests/phpunit/data/less/module/styles.less
@@ -0,0 +1,6 @@
+@import "dependency";
+
+/* @noflip */
+.unit-tests {
+ .test-mixin(@unitTestColor);
+}
diff --git a/tests/phpunit/data/xmp/7.result.php b/tests/phpunit/data/xmp/7.result.php
index 9aa867bc..115cdc92 100644
--- a/tests/phpunit/data/xmp/7.result.php
+++ b/tests/phpunit/data/xmp/7.result.php
@@ -1,26 +1,26 @@
<?php
-$result = array (
+$result = array(
'xmp-exif' =>
- array (
+ array(
'CameraOwnerName' => 'Me!',
),
'xmp-general' =>
- array (
+ array(
'LicenseUrl' => 'http://creativecommons.com/cc-by-2.9',
'ImageDescription' =>
- array (
+ array(
'x-default' => 'Test image for the cc: xmp: xmpRights: namespaces in xmp',
'_type' => 'lang',
),
'ObjectName' =>
- array (
+ array(
'x-default' => 'xmp core/xmp rights/cc ns test',
'_type' => 'lang',
),
'DateTimeDigitized' => '2005:04:03',
'Software' => 'The one true editor: Vi (ok i used gimp)',
'Identifier' =>
- array (
+ array(
0 => 'http://example.com/identifierurl',
1 => 'urn:sha1:342524abcdef',
'_type' => 'ul',
@@ -33,12 +33,12 @@ $result = array (
'RightsCertificate' => 'http://example.com/rights-certificate/',
'Copyrighted' => 'True',
'CopyrightOwner' =>
- array (
+ array(
0 => 'Bawolff is copyright owner',
'_type' => 'ul',
),
'UsageTerms' =>
- array (
+ array(
'x-default' => 'do whatever you want',
'en-gb' => 'Do whatever you want in british english',
'_type' => 'lang',
@@ -46,7 +46,7 @@ $result = array (
'WebStatement' => 'http://example.com/web_statement',
),
'xmp-deprecated' =>
- array (
+ array(
'Identifier' => 'http://example.com/identifierurl/wrong',
),
);
diff --git a/tests/phpunit/includes/ArticleTablesTest.php b/tests/phpunit/includes/ArticleTablesTest.php
index 967ffa17..0f159ae4 100644
--- a/tests/phpunit/includes/ArticleTablesTest.php
+++ b/tests/phpunit/includes/ArticleTablesTest.php
@@ -5,7 +5,7 @@
*/
class ArticleTablesTest extends MediaWikiLangTestCase {
- function testbug14404() {
+ public function testbug14404() {
global $wgContLang, $wgLanguageCode, $wgLang;
$title = Title::newFromText( 'Bug 14404' );
@@ -16,18 +16,17 @@ class ArticleTablesTest extends MediaWikiLangTestCase {
$wgContLang = Language::factory( 'es' );
$wgLang = Language::factory( 'fr' );
- $status = $page->doEditContent( new WikitextContent( '{{:{{int:history}}}}' ), 'Test code for bug 14404', 0, false, $user );
+ $page->doEditContent( new WikitextContent( '{{:{{int:history}}}}' ), 'Test code for bug 14404', 0, false, $user );
$templates1 = $title->getTemplateLinksFrom();
$wgLang = Language::factory( 'de' );
$page->mPreparedEdit = false; // In order to force the rerendering of the same wikitext
// We need an edit, a purge is not enough to regenerate the tables
- $status = $page->doEditContent( new WikitextContent( '{{:{{int:history}}}}' ), 'Test code for bug 14404', EDIT_UPDATE, false, $user );
+ $page->doEditContent( new WikitextContent( '{{:{{int:history}}}}' ), 'Test code for bug 14404', EDIT_UPDATE, false, $user );
$templates2 = $title->getTemplateLinksFrom();
$this->assertEquals( $templates1, $templates2 );
$this->assertEquals( $templates1[0]->getFullText(), 'Historial' );
}
-
}
diff --git a/tests/phpunit/includes/ArticleTest.php b/tests/phpunit/includes/ArticleTest.php
index 867c4f00..b4d6dca6 100644
--- a/tests/phpunit/includes/ArticleTest.php
+++ b/tests/phpunit/includes/ArticleTest.php
@@ -25,14 +25,14 @@ class ArticleTest extends MediaWikiTestCase {
$this->article = null;
}
- function testImplementsGetMagic() {
+ public function testImplementsGetMagic() {
$this->assertEquals( false, $this->article->mLatest, "Article __get magic" );
}
/**
* @depends testImplementsGetMagic
*/
- function testImplementsSetMagic() {
+ public function testImplementsSetMagic() {
$this->article->mLatest = 2;
$this->assertEquals( 2, $this->article->mLatest, "Article __set magic" );
}
@@ -40,13 +40,13 @@ class ArticleTest extends MediaWikiTestCase {
/**
* @depends testImplementsSetMagic
*/
- function testImplementsCallMagic() {
+ public function testImplementsCallMagic() {
$this->article->mLatest = 33;
$this->article->mDataLoaded = true;
$this->assertEquals( 33, $this->article->getLatest(), "Article __call magic" );
}
- function testGetOrSetOnNewProperty() {
+ public function testGetOrSetOnNewProperty() {
$this->article->ext_someNewProperty = 12;
$this->assertEquals( 12, $this->article->ext_someNewProperty,
"Article get/set magic on new field" );
@@ -59,7 +59,7 @@ class ArticleTest extends MediaWikiTestCase {
/**
* Checks for the existence of the backwards compatibility static functions (forwarders to WikiPage class)
*/
- function testStaticFunctions() {
+ public function testStaticFunctions() {
$this->hideDeprecated( 'Article::getAutosummary' );
$this->hideDeprecated( 'WikiPage::getAutosummary' );
$this->hideDeprecated( 'CategoryPage::getAutosummary' ); // Inherited from Article
@@ -76,7 +76,7 @@ class ArticleTest extends MediaWikiTestCase {
"Article static functions" );
}
- function testWikiPageFactory() {
+ public function testWikiPageFactory() {
$title = Title::makeTitle( NS_FILE, 'Someimage.png' );
$page = WikiPage::factory( $title );
$this->assertEquals( 'WikiFilePage', get_class( $page ) );
diff --git a/tests/phpunit/includes/BlockTest.php b/tests/phpunit/includes/BlockTest.php
index 19c9b687..21de0985 100644
--- a/tests/phpunit/includes/BlockTest.php
+++ b/tests/phpunit/includes/BlockTest.php
@@ -51,36 +51,36 @@ class BlockTest extends MediaWikiLangTestCase {
} else {
throw new MWException( "Failed to insert block for BlockTest; old leftover block remaining?" );
}
+
+ $this->addXffBlocks();
}
/**
* debug function : dump the ipblocks table
*/
function dumpBlocks() {
- $v = $this->db->query( 'SELECT * FROM unittest_ipblocks' );
+ $v = $this->db->select( 'ipblocks', '*' );
print "Got " . $v->numRows() . " rows. Full dump follow:\n";
foreach ( $v as $row ) {
print_r( $row );
}
}
- function testInitializerFunctionsReturnCorrectBlock() {
+ public function testInitializerFunctionsReturnCorrectBlock() {
// $this->dumpBlocks();
$this->assertTrue( $this->block->equals( Block::newFromTarget( 'UTBlockee' ) ), "newFromTarget() returns the same block as the one that was made" );
$this->assertTrue( $this->block->equals( Block::newFromID( $this->blockId ) ), "newFromID() returns the same block as the one that was made" );
-
}
/**
* per bug 26425
*/
- function testBug26425BlockTimestampDefaultsToTime() {
+ public function testBug26425BlockTimestampDefaultsToTime() {
// delta to stop one-off errors when things happen to go over a second mark.
$delta = abs( $this->madeAt - $this->block->mTimestamp );
$this->assertLessThan( 2, $delta, "If no timestamp is specified, the block is recorded as time()" );
-
}
/**
@@ -91,7 +91,7 @@ class BlockTest extends MediaWikiLangTestCase {
*
* @dataProvider provideBug29116Data
*/
- function testBug29116LoadWithEmptyIp( $vagueTarget ) {
+ public function testBug29116LoadWithEmptyIp( $vagueTarget ) {
$this->hideDeprecated( 'Block::load' );
$uid = User::idFromName( 'UTBlockee' );
@@ -111,7 +111,7 @@ class BlockTest extends MediaWikiLangTestCase {
*
* @dataProvider provideBug29116Data
*/
- function testBug29116NewFromTargetWithEmptyIp( $vagueTarget ) {
+ public function testBug29116NewFromTargetWithEmptyIp( $vagueTarget ) {
$block = Block::newFromTarget( 'UTBlockee', $vagueTarget );
$this->assertTrue( $this->block->equals( $block ), "newFromTarget() returns the same block as the one that was made when given empty vagueTarget param " . var_export( $vagueTarget, true ) );
}
@@ -124,14 +124,13 @@ class BlockTest extends MediaWikiLangTestCase {
);
}
- function testBlockedUserCanNotCreateAccount() {
+ public function testBlockedUserCanNotCreateAccount() {
$username = 'BlockedUserToCreateAccountWith';
$u = User::newFromName( $username );
$u->setPassword( 'NotRandomPass' );
$u->addToDatabase();
unset( $u );
-
// Sanity check
$this->assertNull(
Block::newFromTarget( $username ),
@@ -185,7 +184,7 @@ class BlockTest extends MediaWikiLangTestCase {
);
}
- function testCrappyCrossWikiBlocks() {
+ public function testCrappyCrossWikiBlocks() {
// Delete the last round's block if it's still there
$oldBlock = Block::newFromTarget( 'UserOnForeignWiki' );
if ( $oldBlock ) {
@@ -228,4 +227,128 @@ class BlockTest extends MediaWikiLangTestCase {
$this->assertEquals( 'MetaWikiUser', $block->getByName(), 'Correct blocker name' );
$this->assertEquals( 0, $block->getBy(), 'Correct blocker id' );
}
+
+ protected function addXffBlocks() {
+ static $inited = false;
+
+ if ( $inited ) {
+ return;
+ }
+
+ $inited = true;
+
+ $blockList = array(
+ array( 'target' => '70.2.0.0/16',
+ 'type' => Block::TYPE_RANGE,
+ 'desc' => 'Range Hardblock',
+ 'ACDisable' => false,
+ 'isHardblock' => true,
+ 'isAutoBlocking' => false,
+ ),
+ array( 'target' => '2001:4860:4001::/48',
+ 'type' => Block::TYPE_RANGE,
+ 'desc' => 'Range6 Hardblock',
+ 'ACDisable' => false,
+ 'isHardblock' => true,
+ 'isAutoBlocking' => false,
+ ),
+ array( 'target' => '60.2.0.0/16',
+ 'type' => Block::TYPE_RANGE,
+ 'desc' => 'Range Softblock with AC Disabled',
+ 'ACDisable' => true,
+ 'isHardblock' => false,
+ 'isAutoBlocking' => false,
+ ),
+ array( 'target' => '50.2.0.0/16',
+ 'type' => Block::TYPE_RANGE,
+ 'desc' => 'Range Softblock',
+ 'ACDisable' => false,
+ 'isHardblock' => false,
+ 'isAutoBlocking' => false,
+ ),
+ array( 'target' => '50.1.1.1',
+ 'type' => Block::TYPE_IP,
+ 'desc' => 'Exact Softblock',
+ 'ACDisable' => false,
+ 'isHardblock' => false,
+ 'isAutoBlocking' => false,
+ ),
+ );
+
+ foreach ( $blockList as $insBlock ) {
+ $target = $insBlock['target'];
+
+ if ( $insBlock['type'] === Block::TYPE_IP ) {
+ $target = User::newFromName( IP::sanitizeIP( $target ), false )->getName();
+ } elseif ( $insBlock['type'] === Block::TYPE_RANGE ) {
+ $target = IP::sanitizeRange( $target );
+ }
+
+ $block = new Block();
+ $block->setTarget( $target );
+ $block->setBlocker( 'testblocker@global' );
+ $block->mReason = $insBlock['desc'];
+ $block->mExpiry = 'infinity';
+ $block->prevents( 'createaccount', $insBlock['ACDisable'] );
+ $block->isHardblock( $insBlock['isHardblock'] );
+ $block->isAutoblocking( $insBlock['isAutoBlocking'] );
+ $block->insert();
+ }
+ }
+
+ public static function providerXff() {
+ return array(
+ array( 'xff' => '1.2.3.4, 70.2.1.1, 60.2.1.1, 2.3.4.5',
+ 'count' => 2,
+ 'result' => 'Range Hardblock'
+ ),
+ array( 'xff' => '1.2.3.4, 50.2.1.1, 60.2.1.1, 2.3.4.5',
+ 'count' => 2,
+ 'result' => 'Range Softblock with AC Disabled'
+ ),
+ array( 'xff' => '1.2.3.4, 70.2.1.1, 50.1.1.1, 2.3.4.5',
+ 'count' => 2,
+ 'result' => 'Exact Softblock'
+ ),
+ array( 'xff' => '1.2.3.4, 70.2.1.1, 50.2.1.1, 50.1.1.1, 2.3.4.5',
+ 'count' => 3,
+ 'result' => 'Exact Softblock'
+ ),
+ array( 'xff' => '1.2.3.4, 70.2.1.1, 50.2.1.1, 2.3.4.5',
+ 'count' => 2,
+ 'result' => 'Range Hardblock'
+ ),
+ array( 'xff' => '1.2.3.4, 70.2.1.1, 60.2.1.1, 2.3.4.5',
+ 'count' => 2,
+ 'result' => 'Range Hardblock'
+ ),
+ array( 'xff' => '50.2.1.1, 60.2.1.1, 2.3.4.5',
+ 'count' => 2,
+ 'result' => 'Range Softblock with AC Disabled'
+ ),
+ array( 'xff' => '1.2.3.4, 50.1.1.1, 60.2.1.1, 2.3.4.5',
+ 'count' => 2,
+ 'result' => 'Exact Softblock'
+ ),
+ array( 'xff' => '1.2.3.4, <$A_BUNCH-OF{INVALID}TEXT\>, 60.2.1.1, 2.3.4.5',
+ 'count' => 1,
+ 'result' => 'Range Softblock with AC Disabled'
+ ),
+ array( 'xff' => '1.2.3.4, 50.2.1.1, 2001:4860:4001:802::1003, 2.3.4.5',
+ 'count' => 2,
+ 'result' => 'Range6 Hardblock'
+ ),
+ );
+ }
+
+ /**
+ * @dataProvider providerXff
+ */
+ public function testBlocksOnXff( $xff, $exCount, $exResult ) {
+ $list = array_map( 'trim', explode( ',', $xff ) );
+ $xffblocks = Block::getBlocksForIPList( $list, true );
+ $this->assertEquals( $exCount, count( $xffblocks ), 'Number of blocks for ' . $xff );
+ $block = Block::chooseBlock( $xffblocks, $list );
+ $this->assertEquals( $exResult, $block->mReason, 'Correct block type for XFF header ' . $xff );
+ }
}
diff --git a/tests/phpunit/includes/CdbTest.php b/tests/phpunit/includes/CdbTest.php
index add585d7..e3d9da7c 100644
--- a/tests/phpunit/includes/CdbTest.php
+++ b/tests/phpunit/includes/CdbTest.php
@@ -66,7 +66,6 @@ class CdbTest extends MediaWikiTestCase {
$this->cdbAssert( "PHP error", $key, $v1, $value );
$this->cdbAssert( "DBA error", $key, $v2, $value );
}
-
}
private function randomString() {
@@ -75,6 +74,7 @@ class CdbTest extends MediaWikiTestCase {
for ( $j = 0; $j < $len; $j++ ) {
$s .= chr( mt_rand( 0, 255 ) );
}
+
return $s;
}
diff --git a/tests/phpunit/includes/CollationTest.php b/tests/phpunit/includes/CollationTest.php
index c746208b..43bb3941 100644
--- a/tests/phpunit/includes/CollationTest.php
+++ b/tests/phpunit/includes/CollationTest.php
@@ -20,7 +20,7 @@ class CollationTest extends MediaWikiLangTestCase {
*
* @dataProvider prefixDataProvider
*/
- function testIsPrefix( $lang, $base, $extended ) {
+ public function testIsPrefix( $lang, $base, $extended ) {
$cp = Collator::create( $lang );
$cp->setStrength( Collator::PRIMARY );
$baseBin = $cp->getSortKey( $base );
@@ -47,12 +47,13 @@ class CollationTest extends MediaWikiLangTestCase {
array( 'en', 'A', 'Aꦲ' ),
);
}
+
/**
* Opposite of testIsPrefix
*
* @dataProvider notPrefixDataProvider
*/
- function testNotIsPrefix( $lang, $base, $extended ) {
+ public function testNotIsPrefix( $lang, $base, $extended ) {
$cp = Collator::create( $lang );
$cp->setStrength( Collator::PRIMARY );
$baseBin = $cp->getSortKey( $base );
@@ -80,10 +81,11 @@ class CollationTest extends MediaWikiLangTestCase {
*
* @dataProvider firstLetterProvider
*/
- function testGetFirstLetter( $collation, $string, $firstLetter ) {
+ public function testGetFirstLetter( $collation, $string, $firstLetter ) {
$col = Collation::factory( $collation );
$this->assertEquals( $firstLetter, $col->getFirstLetter( $string ) );
}
+
function firstLetterProvider() {
return array(
array( 'uppercase', 'Abc', 'A' ),
diff --git a/tests/phpunit/includes/DiffHistoryBlobTest.php b/tests/phpunit/includes/DiffHistoryBlobTest.php
index dcd9dddf..a4d5b91a 100644
--- a/tests/phpunit/includes/DiffHistoryBlobTest.php
+++ b/tests/phpunit/includes/DiffHistoryBlobTest.php
@@ -4,14 +4,17 @@ class DiffHistoryBlobTest extends MediaWikiTestCase {
protected function setUp() {
if ( !extension_loaded( 'xdiff' ) ) {
$this->markTestSkipped( 'The xdiff extension is not available' );
+
return;
}
if ( !function_exists( 'xdiff_string_rabdiff' ) ) {
$this->markTestSkipped( 'The version of xdiff extension is lower than 1.5.0' );
+
return;
}
- if ( !extension_loaded( 'hash' ) && !extension_loaded( 'mhash' ) ) {
- $this->markTestSkipped( 'Neither the hash nor mhash extension is available' );
+ if ( !extension_loaded( 'hash' ) ) {
+ $this->markTestSkipped( 'The hash extension is not available' );
+
return;
}
parent::setUp();
@@ -21,7 +24,7 @@ class DiffHistoryBlobTest extends MediaWikiTestCase {
* Test for DiffHistoryBlob::xdiffAdler32()
* @dataProvider provideXdiffAdler32
*/
- function testXdiffAdler32( $input ) {
+ public function testXdiffAdler32( $input ) {
$xdiffHash = substr( xdiff_string_rabdiff( $input, '' ), 0, 4 );
$dhb = new DiffHistoryBlob;
$myHash = $dhb->xdiffAdler32( $input );
diff --git a/tests/phpunit/includes/EditPageTest.php b/tests/phpunit/includes/EditPageTest.php
index 00eba30a..87272a4c 100644
--- a/tests/phpunit/includes/EditPageTest.php
+++ b/tests/phpunit/includes/EditPageTest.php
@@ -9,12 +9,12 @@
* @group medium
* ^--- tell phpunit that these test cases may take longer than 2 seconds.
*/
-class EditPageTest extends MediaWikiTestCase {
+class EditPageTest extends MediaWikiLangTestCase {
/**
* @dataProvider provideExtractSectionTitle
*/
- function testExtractSectionTitle( $section, $title ) {
+ public function testExtractSectionTitle( $section, $title ) {
$extracted = EditPage::extractSectionTitle( $section );
$this->assertEquals( $title, $extracted );
}
@@ -173,15 +173,90 @@ class EditPageTest extends MediaWikiTestCase {
}
public function testCreatePage() {
- $text = "Hello World!";
- $edit = array(
- 'wpTextbox1' => $text,
- 'wpSummary' => 'just testing',
+ $this->assertEdit(
+ 'EditPageTest_testCreatePage',
+ null,
+ null,
+ array(
+ 'wpTextbox1' => "Hello World!",
+ ),
+ EditPage::AS_SUCCESS_NEW_ARTICLE,
+ "Hello World!",
+ "expected article being created"
+ )->doDeleteArticleReal( 'EditPageTest_testCreatePage' );
+
+ $this->assertEdit(
+ 'EditPageTest_testCreatePage',
+ null,
+ null,
+ array(
+ 'wpTextbox1' => "",
+ ),
+ EditPage::AS_BLANK_ARTICLE,
+ null,
+ "expected article not being created if empty"
+ );
+
+
+ $this->assertEdit(
+ 'MediaWiki:January',
+ null,
+ 'UTSysop',
+ array(
+ 'wpTextbox1' => "Not January",
+ ),
+ EditPage::AS_SUCCESS_NEW_ARTICLE,
+ "Not January",
+ "expected MediaWiki: page being created"
+ )->doDeleteArticleReal( 'EditPageTest_testCreatePage' );
+
+ $this->assertEdit(
+ 'MediaWiki:EditPageTest_testCreatePage',
+ null,
+ 'UTSysop',
+ array(
+ 'wpTextbox1' => "",
+ ),
+ EditPage::AS_BLANK_ARTICLE,
+ null,
+ "expected not-registered MediaWiki: page not being created if empty"
);
- $this->assertEdit( 'EditPageTest_testCreatePafe', null, null, $edit,
- EditPage::AS_SUCCESS_NEW_ARTICLE, $text,
- "expected successfull creation with given text" );
+ $this->assertEdit(
+ 'MediaWiki:January',
+ null,
+ 'UTSysop',
+ array(
+ 'wpTextbox1' => "",
+ ),
+ EditPage::AS_SUCCESS_NEW_ARTICLE,
+ "",
+ "expected registered MediaWiki: page being created even if empty"
+ )->doDeleteArticleReal( 'EditPageTest_testCreatePage' );
+
+ $this->assertEdit(
+ 'MediaWiki:Ipb-default-expiry',
+ null,
+ 'UTSysop',
+ array(
+ 'wpTextbox1' => "",
+ ),
+ EditPage::AS_BLANK_ARTICLE,
+ "",
+ "expected registered MediaWiki: page whose default content is empty not being created if empty"
+ );
+
+ $this->assertEdit(
+ 'MediaWiki:January',
+ null,
+ 'UTSysop',
+ array(
+ 'wpTextbox1' => "January",
+ ),
+ EditPage::AS_BLANK_ARTICLE,
+ null,
+ "expected MediaWiki: page not being created if text equals default message"
+ );
}
public function testUpdatePage() {
diff --git a/tests/phpunit/includes/ExternalStoreTest.php b/tests/phpunit/includes/ExternalStoreTest.php
index 99544e7e..fcffcbc2 100644
--- a/tests/phpunit/includes/ExternalStoreTest.php
+++ b/tests/phpunit/includes/ExternalStoreTest.php
@@ -5,7 +5,7 @@
class ExternalStoreTest extends MediaWikiTestCase {
- function testExternalFetchFromURL() {
+ public function testExternalFetchFromURL() {
$this->setMwGlobals( 'wgExternalStores', false );
$this->assertFalse(
diff --git a/tests/phpunit/includes/ExtraParserTest.php b/tests/phpunit/includes/ExtraParserTest.php
index 067cfc4a..6c67beb1 100644
--- a/tests/phpunit/includes/ExtraParserTest.php
+++ b/tests/phpunit/includes/ExtraParserTest.php
@@ -27,7 +27,7 @@ class ExtraParserTest extends MediaWikiTestCase {
}
// Bug 8689 - Long numeric lines kill the parser
- function testBug8689() {
+ public function testBug8689() {
global $wgUser;
$longLine = '1.' . str_repeat( '1234567890', 100000 ) . "\n";
@@ -38,13 +38,13 @@ class ExtraParserTest extends MediaWikiTestCase {
}
/* Test the parser entry points */
- function testParse() {
+ public function testParse() {
$title = Title::newFromText( __FUNCTION__ );
$parserOutput = $this->parser->parse( "Test\n{{Foo}}\n{{Bar}}", $title, $this->options );
$this->assertEquals( "<p>Test\nContent of <i>Template:Foo</i>\nContent of <i>Template:Bar</i>\n</p>", $parserOutput->getText() );
}
- function testPreSaveTransform() {
+ public function testPreSaveTransform() {
global $wgUser;
$title = Title::newFromText( __FUNCTION__ );
$outputText = $this->parser->preSaveTransform( "Test\r\n{{subst:Foo}}\n{{Bar}}", $title, $wgUser, $this->options );
@@ -52,7 +52,7 @@ class ExtraParserTest extends MediaWikiTestCase {
$this->assertEquals( "Test\nContent of ''Template:Foo''\n{{Bar}}", $outputText );
}
- function testPreprocess() {
+ public function testPreprocess() {
$title = Title::newFromText( __FUNCTION__ );
$outputText = $this->parser->preprocess( "Test\n{{Foo}}\n{{Bar}}", $title, $this->options );
@@ -62,7 +62,7 @@ class ExtraParserTest extends MediaWikiTestCase {
/**
* cleanSig() makes all templates substs and removes tildes
*/
- function testCleanSig() {
+ public function testCleanSig() {
$title = Title::newFromText( __FUNCTION__ );
$outputText = $this->parser->cleanSig( "{{Foo}} ~~~~" );
@@ -72,9 +72,8 @@ class ExtraParserTest extends MediaWikiTestCase {
/**
* cleanSig() should do nothing if disabled
*/
- function testCleanSigDisabled() {
- global $wgCleanSignatures;
- $wgCleanSignatures = false;
+ public function testCleanSigDisabled() {
+ $this->setMwGlobals( 'wgCleanSignatures', false );
$title = Title::newFromText( __FUNCTION__ );
$outputText = $this->parser->cleanSig( "{{Foo}} ~~~~" );
@@ -86,7 +85,7 @@ class ExtraParserTest extends MediaWikiTestCase {
* cleanSigInSig() just removes tildes
* @dataProvider provideStringsForCleanSigInSig
*/
- function testCleanSigInSig( $in, $out ) {
+ public function testCleanSigInSig( $in, $out ) {
$this->assertEquals( Parser::cleanSigInSig( $in ), $out );
}
@@ -98,7 +97,7 @@ class ExtraParserTest extends MediaWikiTestCase {
);
}
- function testGetSection() {
+ public function testGetSection() {
$outputText2 = $this->parser->getSection( "Section 0\n== Heading 1 ==\nSection 1\n=== Heading 2 ===\nSection 2\n== Heading 3 ==\nSection 3\n", 2 );
$outputText1 = $this->parser->getSection( "Section 0\n== Heading 1 ==\nSection 1\n=== Heading 2 ===\nSection 2\n== Heading 3 ==\nSection 3\n", 1 );
@@ -106,7 +105,7 @@ class ExtraParserTest extends MediaWikiTestCase {
$this->assertEquals( "== Heading 1 ==\nSection 1\n=== Heading 2 ===\nSection 2", $outputText1 );
}
- function testReplaceSection() {
+ public function testReplaceSection() {
$outputText = $this->parser->replaceSection( "Section 0\n== Heading 1 ==\nSection 1\n=== Heading 2 ===\nSection 2\n== Heading 3 ==\nSection 3\n", 1, "New section 1" );
$this->assertEquals( "Section 0\nNew section 1\n\n== Heading 3 ==\nSection 3", $outputText );
@@ -115,7 +114,7 @@ class ExtraParserTest extends MediaWikiTestCase {
/**
* Templates and comments are not affected, but noinclude/onlyinclude is.
*/
- function testGetPreloadText() {
+ public function testGetPreloadText() {
$title = Title::newFromText( __FUNCTION__ );
$outputText = $this->parser->getPreloadText( "{{Foo}}<noinclude> censored</noinclude> information <!-- is very secret -->", $title, $this->options );
@@ -135,7 +134,7 @@ class ExtraParserTest extends MediaWikiTestCase {
/**
* @group Database
*/
- function testTrackingCategory() {
+ public function testTrackingCategory() {
$title = Title::newFromText( __FUNCTION__ );
$catName = wfMessage( 'broken-file-category' )->inContentLanguage()->text();
$cat = Title::makeTitleSafe( NS_CATEGORY, $catName );
@@ -148,7 +147,7 @@ class ExtraParserTest extends MediaWikiTestCase {
/**
* @group Database
*/
- function testTrackingCategorySpecial() {
+ public function testTrackingCategorySpecial() {
// Special pages shouldn't have tracking cats.
$title = SpecialPage::getTitleFor( 'Contributions' );
$parserOutput = $this->parser->parse( "[[file:nonexistent]]", $title, $this->options );
diff --git a/tests/phpunit/includes/FallbackTest.php b/tests/phpunit/includes/FallbackTest.php
new file mode 100644
index 00000000..f408f471
--- /dev/null
+++ b/tests/phpunit/includes/FallbackTest.php
@@ -0,0 +1,73 @@
+<?php
+
+/**
+ * @covers Fallback
+ */
+class FallbackTest extends MediaWikiTestCase {
+
+ public function testFallbackMbstringFunctions() {
+
+ if ( !extension_loaded( 'mbstring' ) ) {
+ $this->markTestSkipped( "The mb_string functions must be installed to test the fallback functions" );
+ }
+
+ $sampleUTF = "Östergötland_coat_of_arms.png";
+
+ //mb_substr
+ $substr_params = array(
+ array( 0, 0 ),
+ array( 5, -4 ),
+ array( 33 ),
+ array( 100, -5 ),
+ array( -8, 10 ),
+ array( 1, 1 ),
+ array( 2, -1 )
+ );
+
+ foreach ( $substr_params as $param_set ) {
+ $old_param_set = $param_set;
+ array_unshift( $param_set, $sampleUTF );
+
+ $this->assertEquals(
+ call_user_func_array( 'mb_substr', $param_set ),
+ call_user_func_array( 'Fallback::mb_substr', $param_set ),
+ 'Fallback mb_substr with params ' . implode( ', ', $old_param_set )
+ );
+ }
+
+ //mb_strlen
+ $this->assertEquals(
+ mb_strlen( $sampleUTF ),
+ Fallback::mb_strlen( $sampleUTF ),
+ 'Fallback mb_strlen'
+ );
+
+ //mb_str(r?)pos
+ $strpos_params = array(
+ //array( 'ter' ),
+ //array( 'Ö' ),
+ //array( 'Ö', 3 ),
+ //array( 'oat_', 100 ),
+ //array( 'c', -10 ),
+ //Broken for now
+ );
+
+ foreach ( $strpos_params as $param_set ) {
+ $old_param_set = $param_set;
+ array_unshift( $param_set, $sampleUTF );
+
+ $this->assertEquals(
+ call_user_func_array( 'mb_strpos', $param_set ),
+ call_user_func_array( 'Fallback::mb_strpos', $param_set ),
+ 'Fallback mb_strpos with params ' . implode( ', ', $old_param_set )
+ );
+
+ $this->assertEquals(
+ call_user_func_array( 'mb_strrpos', $param_set ),
+ call_user_func_array( 'Fallback::mb_strrpos', $param_set ),
+ 'Fallback mb_strrpos with params ' . implode( ', ', $old_param_set )
+ );
+ }
+ }
+
+} \ No newline at end of file
diff --git a/tests/phpunit/includes/FauxRequestTest.php b/tests/phpunit/includes/FauxRequestTest.php
new file mode 100644
index 00000000..9f3aa11d
--- /dev/null
+++ b/tests/phpunit/includes/FauxRequestTest.php
@@ -0,0 +1,15 @@
+<?php
+
+class FauxRequestTest extends MediaWikiTestCase {
+
+ public function testGetSetHeader() {
+ $value = 'test/test';
+
+ $request = new FauxRequest();
+ $request->setHeader( 'Content-Type', $value );
+
+ $this->assertEquals( $request->getHeader( 'Content-Type' ), $value );
+ $this->assertEquals( $request->getHeader( 'CONTENT-TYPE' ), $value );
+ $this->assertEquals( $request->getHeader( 'content-type' ), $value );
+ }
+}
diff --git a/tests/phpunit/includes/FauxResponseTest.php b/tests/phpunit/includes/FauxResponseTest.php
index 56691c9e..f9ba1b3b 100644
--- a/tests/phpunit/includes/FauxResponseTest.php
+++ b/tests/phpunit/includes/FauxResponseTest.php
@@ -30,13 +30,13 @@ class FauxResponseTest extends MediaWikiTestCase {
$this->response = new FauxResponse;
}
- function testCookie() {
+ public function testCookie() {
$this->assertEquals( null, $this->response->getcookie( 'key' ), 'Non-existing cookie' );
$this->response->setcookie( 'key', 'val' );
$this->assertEquals( 'val', $this->response->getcookie( 'key' ), 'Existing cookie' );
}
- function testHeader() {
+ public function testHeader() {
$this->assertEquals( null, $this->response->getheader( 'Location' ), 'Non-existing header' );
$this->response->header( 'Location: http://localhost/' );
@@ -47,9 +47,12 @@ class FauxResponseTest extends MediaWikiTestCase {
$this->response->header( 'Location: http://127.0.0.2/', false );
$this->assertEquals( 'http://127.0.0.1/', $this->response->getheader( 'Location' ), 'Same header with override disabled' );
+
+ $this->response->header( 'Location: http://localhost/' );
+ $this->assertEquals( 'http://localhost/', $this->response->getheader( 'LOCATION' ), 'Get header case insensitive' );
}
- function testResponseCode() {
+ public function testResponseCode() {
$this->response->header( 'HTTP/1.1 200' );
$this->assertEquals( 200, $this->response->getStatusCode(), 'Header with no message' );
diff --git a/tests/phpunit/includes/FormOptionsInitializationTest.php b/tests/phpunit/includes/FormOptionsInitializationTest.php
index 4053683f..fb2304dc 100644
--- a/tests/phpunit/includes/FormOptionsInitializationTest.php
+++ b/tests/phpunit/includes/FormOptionsInitializationTest.php
@@ -81,5 +81,4 @@ class FormOptionsInitializationTest extends MediaWikiTestCase {
$this->object->getOptions()
);
}
-
}
diff --git a/tests/phpunit/includes/GlobalFunctions/GlobalTest.php b/tests/phpunit/includes/GlobalFunctions/GlobalTest.php
index 24fc47cf..6154df1d 100644
--- a/tests/phpunit/includes/GlobalFunctions/GlobalTest.php
+++ b/tests/phpunit/includes/GlobalFunctions/GlobalTest.php
@@ -29,7 +29,10 @@ class GlobalTest extends MediaWikiTestCase {
parent::tearDown();
}
- /** @dataProvider provideForWfArrayDiff2 */
+ /**
+ * @dataProvider provideForWfArrayDiff2
+ * @covers ::wfArrayDiff2
+ */
public function testWfArrayDiff2( $a, $b, $expected ) {
$this->assertEquals(
wfArrayDiff2( $a, $b ), $expected
@@ -53,25 +56,37 @@ class GlobalTest extends MediaWikiTestCase {
);
}
- function testRandom() {
+ /**
+ * @covers ::wfRandom
+ */
+ public function testRandom() {
# This could hypothetically fail, but it shouldn't ;)
$this->assertFalse(
wfRandom() == wfRandom() );
}
- function testUrlencode() {
+ /**
+ * @covers ::wfUrlencode
+ */
+ public function testUrlencode() {
$this->assertEquals(
"%E7%89%B9%E5%88%A5:Contributions/Foobar",
wfUrlencode( "\xE7\x89\xB9\xE5\x88\xA5:Contributions/Foobar" ) );
}
- function testExpandIRI() {
+ /**
+ * @covers ::wfExpandIRI
+ */
+ public function testExpandIRI() {
$this->assertEquals(
"https://te.wikibooks.org/wiki/ఉబà±à°‚à°Ÿà±_వాడà±à°•à°°à°¿_మారà±à°—దరà±à°¶à°¨à°¿",
wfExpandIRI( "https://te.wikibooks.org/wiki/%E0%B0%89%E0%B0%AC%E0%B1%81%E0%B0%82%E0%B0%9F%E0%B1%81_%E0%B0%B5%E0%B0%BE%E0%B0%A1%E0%B1%81%E0%B0%95%E0%B0%B0%E0%B0%BF_%E0%B0%AE%E0%B0%BE%E0%B0%B0%E0%B1%8D%E0%B0%97%E0%B0%A6%E0%B0%B0%E0%B1%8D%E0%B0%B6%E0%B0%A8%E0%B0%BF" ) );
}
- function testReadOnlyEmpty() {
+ /**
+ * @covers ::wfReadOnly
+ */
+ public function testReadOnlyEmpty() {
global $wgReadOnly;
$wgReadOnly = null;
@@ -79,7 +94,10 @@ class GlobalTest extends MediaWikiTestCase {
$this->assertFalse( wfReadOnly() );
}
- function testReadOnlySet() {
+ /**
+ * @covers ::wfReadOnly
+ */
+ public function testReadOnlySet() {
global $wgReadOnly, $wgReadOnlyFile;
$f = fopen( $wgReadOnlyFile, "wt" );
@@ -97,19 +115,6 @@ class GlobalTest extends MediaWikiTestCase {
$this->assertFalse( wfReadOnly() );
}
- function testQuotedPrintable() {
- $this->assertEquals(
- "=?UTF-8?Q?=C4=88u=20legebla=3F?=",
- UserMailer::quotedPrintable( "\xc4\x88u legebla?", "UTF-8" ) );
- }
-
- function testTime() {
- $start = wfTime();
- $this->assertInternalType( 'float', $start );
- $end = wfTime();
- $this->assertTrue( $end > $start, "Time is running backwards!" );
- }
-
public static function provideArrayToCGI() {
return array(
array( array(), '' ), // empty
@@ -130,13 +135,17 @@ class GlobalTest extends MediaWikiTestCase {
/**
* @dataProvider provideArrayToCGI
+ * @covers ::wfArrayToCgi
*/
- function testArrayToCGI( $array, $result ) {
+ public function testArrayToCGI( $array, $result ) {
$this->assertEquals( $result, wfArrayToCgi( $array ) );
}
- function testArrayToCGI2() {
+ /**
+ * @covers ::testWfArrayDiff2
+ */
+ public function testArrayToCGI2() {
$this->assertEquals(
"baz=bar&foo=bar",
wfArrayToCgi(
@@ -161,8 +170,9 @@ class GlobalTest extends MediaWikiTestCase {
/**
* @dataProvider provideCgiToArray
+ * @covers ::wfCgiToArray
*/
- function testCgiToArray( $cgi, $result ) {
+ public function testCgiToArray( $cgi, $result ) {
$this->assertEquals( $result, wfCgiToArray( $cgi ) );
}
@@ -181,12 +191,16 @@ class GlobalTest extends MediaWikiTestCase {
/**
* @dataProvider provideCgiRoundTrip
+ * @covers ::wfArrayToCgi
*/
- function testCgiRoundTrip( $cgi ) {
+ public function testCgiRoundTrip( $cgi ) {
$this->assertEquals( $cgi, wfArrayToCgi( wfCgiToArray( $cgi ) ) );
}
- function testMimeTypeMatch() {
+ /**
+ * @covers ::mimeTypeMatch
+ */
+ public function testMimeTypeMatch() {
$this->assertEquals(
'text/html',
mimeTypeMatch( 'text/html',
@@ -208,7 +222,10 @@ class GlobalTest extends MediaWikiTestCase {
'image/svg+xml' => 0.5 ) ) );
}
- function testNegotiateType() {
+ /**
+ * @covers ::wfNegotiateType
+ */
+ public function testNegotiateType() {
$this->assertEquals(
'text/html',
wfNegotiateType(
@@ -249,77 +266,11 @@ class GlobalTest extends MediaWikiTestCase {
array( 'application/xhtml+xml' => 1.0 ) ) );
}
- function testFallbackMbstringFunctions() {
-
- if ( !extension_loaded( 'mbstring' ) ) {
- $this->markTestSkipped( "The mb_string functions must be installed to test the fallback functions" );
- }
-
- $sampleUTF = "Östergötland_coat_of_arms.png";
-
-
- //mb_substr
- $substr_params = array(
- array( 0, 0 ),
- array( 5, -4 ),
- array( 33 ),
- array( 100, -5 ),
- array( -8, 10 ),
- array( 1, 1 ),
- array( 2, -1 )
- );
-
- foreach ( $substr_params as $param_set ) {
- $old_param_set = $param_set;
- array_unshift( $param_set, $sampleUTF );
-
- $this->assertEquals(
- MWFunction::callArray( 'mb_substr', $param_set ),
- MWFunction::callArray( 'Fallback::mb_substr', $param_set ),
- 'Fallback mb_substr with params ' . implode( ', ', $old_param_set )
- );
- }
-
-
- //mb_strlen
- $this->assertEquals(
- mb_strlen( $sampleUTF ),
- Fallback::mb_strlen( $sampleUTF ),
- 'Fallback mb_strlen'
- );
-
-
- //mb_str(r?)pos
- $strpos_params = array(
- //array( 'ter' ),
- //array( 'Ö' ),
- //array( 'Ö', 3 ),
- //array( 'oat_', 100 ),
- //array( 'c', -10 ),
- //Broken for now
- );
-
- foreach ( $strpos_params as $param_set ) {
- $old_param_set = $param_set;
- array_unshift( $param_set, $sampleUTF );
-
- $this->assertEquals(
- MWFunction::callArray( 'mb_strpos', $param_set ),
- MWFunction::callArray( 'Fallback::mb_strpos', $param_set ),
- 'Fallback mb_strpos with params ' . implode( ', ', $old_param_set )
- );
-
- $this->assertEquals(
- MWFunction::callArray( 'mb_strrpos', $param_set ),
- MWFunction::callArray( 'Fallback::mb_strrpos', $param_set ),
- 'Fallback mb_strrpos with params ' . implode( ', ', $old_param_set )
- );
- }
-
- }
-
-
- function testDebugFunctionTest() {
+ /**
+ * @covers ::wfDebug
+ * @covers ::wfDebugMem
+ */
+ public function testDebugFunctionTest() {
global $wgDebugLogFile, $wgDebugTimestamps;
@@ -329,7 +280,6 @@ class GlobalTest extends MediaWikiTestCase {
$old_wgDebugTimestamps = $wgDebugTimestamps;
$wgDebugTimestamps = false;
-
wfDebug( "This is a normal string" );
$this->assertEquals( "This is a normal string", file_get_contents( $wgDebugLogFile ) );
unlink( $wgDebugLogFile );
@@ -338,7 +288,6 @@ class GlobalTest extends MediaWikiTestCase {
$this->assertEquals( "This is nöt an ASCII string", file_get_contents( $wgDebugLogFile ) );
unlink( $wgDebugLogFile );
-
wfDebug( "\00305This has böth UTF and control chars\003" );
$this->assertEquals( " 05This has böth UTF and control chars ", file_get_contents( $wgDebugLogFile ) );
unlink( $wgDebugLogFile );
@@ -351,12 +300,14 @@ class GlobalTest extends MediaWikiTestCase {
$this->assertGreaterThan( 5000000, preg_replace( '/\D/', '', file_get_contents( $wgDebugLogFile ) ) );
unlink( $wgDebugLogFile );
-
$wgDebugLogFile = $old_log_file;
$wgDebugTimestamps = $old_wgDebugTimestamps;
}
- function testClientAcceptsGzipTest() {
+ /**
+ * @covers ::wfClientAcceptsGzip
+ */
+ public function testClientAcceptsGzipTest() {
$settings = array(
'gzip' => true,
@@ -387,7 +338,10 @@ class GlobalTest extends MediaWikiTestCase {
}
}
- function testSwapVarsTest() {
+ /**
+ * @covers ::swap
+ */
+ public function testSwapVarsTest() {
$var1 = 1;
$var2 = 2;
@@ -398,10 +352,12 @@ class GlobalTest extends MediaWikiTestCase {
$this->assertEquals( $var1, 2, 'var1 is swapped' );
$this->assertEquals( $var2, 1, 'var2 is swapped' );
-
}
- function testWfPercentTest() {
+ /**
+ * @covers ::wfPercent
+ */
+ public function testWfPercentTest() {
$pcts = array(
array( 6 / 7, '0.86%', 2, false ),
@@ -429,6 +385,7 @@ class GlobalTest extends MediaWikiTestCase {
/**
* test @see wfShorthandToInteger()
* @dataProvider provideShorthand
+ * @covers ::wfShorthandToInteger
*/
public function testWfShorthandToInteger( $shorthand, $expected ) {
$this->assertEquals( $expected,
@@ -439,7 +396,7 @@ class GlobalTest extends MediaWikiTestCase {
/** array( shorthand, expected integer ) */
public static function provideShorthand() {
return array(
- # Null, empty ...
+ # Null, empty ...
array( '', -1 ),
array( ' ', -1 ),
array( null, -1 ),
@@ -489,6 +446,7 @@ class GlobalTest extends MediaWikiTestCase {
*
* @dataProvider provideMerge()
* @group medium
+ * @covers ::wfMerge
*/
public function testMerge( $old, $mine, $yours, $expectedMergeResult, $expectedText ) {
$this->checkHasDiff3();
@@ -564,13 +522,14 @@ class GlobalTest extends MediaWikiTestCase {
/**
* @dataProvider provideMakeUrlIndexes()
+ * @covers ::wfMakeUrlIndexes
*/
- function testMakeUrlIndexes( $url, $expected ) {
+ public function testMakeUrlIndexes( $url, $expected ) {
$index = wfMakeUrlIndexes( $url );
$this->assertEquals( $expected, $index, "wfMakeUrlIndexes(\"$url\")" );
}
- function provideMakeUrlIndexes() {
+ public static function provideMakeUrlIndexes() {
return array(
array(
// just a regular :)
@@ -621,13 +580,14 @@ class GlobalTest extends MediaWikiTestCase {
/**
* @dataProvider provideWfMatchesDomainList
+ * @covers ::wfMatchesDomainList
*/
- function testWfMatchesDomainList( $url, $domains, $expected, $description ) {
+ public function testWfMatchesDomainList( $url, $domains, $expected, $description ) {
$actual = wfMatchesDomainList( $url, $domains );
$this->assertEquals( $expected, $actual, $description );
}
- function provideWfMatchesDomainList() {
+ public static function provideWfMatchesDomainList() {
$a = array();
$protocols = array( 'HTTP' => 'http:', 'HTTPS' => 'https:', 'protocol-relative' => '' );
foreach ( $protocols as $pDesc => $p ) {
@@ -638,18 +598,30 @@ class GlobalTest extends MediaWikiTestCase {
array( "$p//www.example2.com", array( 'www.example.com', 'www.example2.com', 'www.example3.com' ), true, "Exact match with other domains in array, $pDesc URL" ),
array( "$p//www.example2.com", array( 'example.com', 'example2.com', 'example3,com' ), true, "Match without subdomain with other domains in array, $pDesc URL" ),
array( "$p//www.example4.com", array( 'example.com', 'example2.com', 'example3,com' ), false, "Domain not in array, $pDesc URL" ),
-
- // FIXME: This is a bug in wfMatchesDomainList(). If and when this is fixed, update this test case
- array( "$p//nds-nl.wikipedia.org", array( 'nl.wikipedia.org' ), true, "Substrings of domains match while they shouldn't, $pDesc URL" ),
+ array( "$p//nds-nl.wikipedia.org", array( 'nl.wikipedia.org' ), false, "Non-matching substring of domain, $pDesc URL" ),
) );
}
+
return $a;
}
/**
+ * @covers ::wfMkdirParents
+ */
+ public function testWfMkdirParents() {
+ // Should not return true if file exists instead of directory
+ $fname = $this->getNewTempFile();
+ wfSuppressWarnings();
+ $ok = wfMkdirParents( $fname );
+ wfRestoreWarnings();
+ $this->assertFalse( $ok );
+ }
+
+ /**
* @dataProvider provideWfShellMaintenanceCmdList
+ * @covers ::wfShellMaintenanceCmd
*/
- function testWfShellMaintenanceCmd( $script, $parameters, $options, $expected, $description ) {
+ public function testWfShellMaintenanceCmd( $script, $parameters, $options, $expected, $description ) {
if ( wfIsWindows() ) {
// Approximation that's good enough for our purposes just now
$expected = str_replace( "'", '"', $expected );
@@ -658,8 +630,9 @@ class GlobalTest extends MediaWikiTestCase {
$this->assertEquals( $expected, $actual, $description );
}
- function provideWfShellMaintenanceCmdList() {
+ public static function provideWfShellMaintenanceCmdList() {
global $wgPhpCli;
+
return array(
array( 'eval.php', array( '--help', '--test' ), array(),
"'$wgPhpCli' 'eval.php' '--help' '--test'",
@@ -675,5 +648,5 @@ class GlobalTest extends MediaWikiTestCase {
"Called eval.php --help --test with wrapper and php option" ),
);
}
- /* TODO: many more! */
+ /* @TODO many more! */
}
diff --git a/tests/phpunit/includes/GlobalFunctions/GlobalWithDBTest.php b/tests/phpunit/includes/GlobalFunctions/GlobalWithDBTest.php
index 4879a38d..cf891e7b 100644
--- a/tests/phpunit/includes/GlobalFunctions/GlobalWithDBTest.php
+++ b/tests/phpunit/includes/GlobalFunctions/GlobalWithDBTest.php
@@ -6,13 +6,15 @@
class GlobalWithDBTest extends MediaWikiTestCase {
/**
* @dataProvider provideWfIsBadImageList
+ * @covers ::wfIsBadImage
*/
- function testWfIsBadImage( $name, $title, $blacklist, $expected, $desc ) {
+ public function testWfIsBadImage( $name, $title, $blacklist, $expected, $desc ) {
$this->assertEquals( $expected, wfIsBadImage( $name, $title, $blacklist ), $desc );
}
- function provideWfIsBadImageList() {
+ public static function provideWfIsBadImageList() {
$blacklist = '* [[File:Bad.jpg]] except [[Nasty page]]';
+
return array(
array( 'Bad.jpg', false, $blacklist, true,
'Called on a bad image' ),
diff --git a/tests/phpunit/includes/GlobalFunctions/wfAssembleUrlTest.php b/tests/phpunit/includes/GlobalFunctions/wfAssembleUrlTest.php
index 4bd8c685..9bb74873 100644
--- a/tests/phpunit/includes/GlobalFunctions/wfAssembleUrlTest.php
+++ b/tests/phpunit/includes/GlobalFunctions/wfAssembleUrlTest.php
@@ -1,9 +1,11 @@
<?php
/**
- * Tests for wfAssembleUrl()
+ * @covers ::wfAssembleUrl
*/
class WfAssembleUrlTest extends MediaWikiTestCase {
- /** @dataProvider provideURLParts */
+ /**
+ * @dataProvider provideURLParts
+ */
public function testWfAssembleUrl( $parts, $output ) {
$partsDump = print_r( $parts, true );
$this->assertEquals(
@@ -87,7 +89,6 @@ class WfAssembleUrlTest extends MediaWikiTestCase {
$url .= '#' . $fragment;
}
-
$cases[] = array(
$parts,
$url,
diff --git a/tests/phpunit/includes/GlobalFunctions/wfBCP47Test.php b/tests/phpunit/includes/GlobalFunctions/wfBCP47Test.php
index 8df038dd..a01c0d49 100644
--- a/tests/phpunit/includes/GlobalFunctions/wfBCP47Test.php
+++ b/tests/phpunit/includes/GlobalFunctions/wfBCP47Test.php
@@ -1,6 +1,6 @@
<?php
/**
- * Tests for wfBCP47()
+ * @covers ::wfBCP47
*/
class WfBCP47Test extends MediaWikiTestCase {
/**
@@ -13,7 +13,7 @@ class WfBCP47Test extends MediaWikiTestCase {
* @see http://tools.ietf.org/html/bcp47
* @dataProvider provideLanguageCodes()
*/
- function testBCP47( $code, $expected ) {
+ public function testBCP47( $code, $expected ) {
$code = strtolower( $code );
$this->assertEquals( $expected, wfBCP47( $code ),
"Applying BCP47 standard to lower case '$code'"
@@ -28,7 +28,7 @@ class WfBCP47Test extends MediaWikiTestCase {
/**
* Array format is ($code, $expected)
*/
- function provideLanguageCodes() {
+ public static function provideLanguageCodes() {
return array(
// Extracted from BCP47 (list not exhaustive)
# 2.1.1
@@ -115,20 +115,6 @@ class WfBCP47Test extends MediaWikiTestCase {
// de-419-DE
// a-DE
// ar-a-aaa-b-bbb-a-ccc
-
- /*
- // ISO 15924 :
- array( 'sr-Cyrl', 'sr-Cyrl' ),
- # @todo FIXME: Fix our function?
- array( 'SR-lATN', 'sr-Latn' ),
- array( 'fr-latn', 'fr-Latn' ),
- // Use lowercase for single segment
- // ISO 3166-1-alpha-2 code
- array( 'US', 'us' ), # USA
- array( 'uS', 'us' ), # USA
- array( 'Fr', 'fr' ), # France
- array( 'va', 'va' ), # Holy See (Vatican City State)
- */
);
}
}
diff --git a/tests/phpunit/includes/GlobalFunctions/wfBaseConvertTest.php b/tests/phpunit/includes/GlobalFunctions/wfBaseConvertTest.php
index 10b62b3c..7da804e6 100644
--- a/tests/phpunit/includes/GlobalFunctions/wfBaseConvertTest.php
+++ b/tests/phpunit/includes/GlobalFunctions/wfBaseConvertTest.php
@@ -1,6 +1,6 @@
<?php
/**
- * Tests for wfBaseConvert()
+ * @covers ::wfBaseConvert
*/
class WfBaseConvertTest extends MediaWikiTestCase {
public static function provideSingleDigitConversions() {
@@ -152,6 +152,7 @@ class WfBaseConvertTest extends MediaWikiTestCase {
$x[] = array( $base, $str );
}
+
return $x;
}
diff --git a/tests/phpunit/includes/GlobalFunctions/wfBaseNameTest.php b/tests/phpunit/includes/GlobalFunctions/wfBaseNameTest.php
index 407be8d2..8c548040 100644
--- a/tests/phpunit/includes/GlobalFunctions/wfBaseNameTest.php
+++ b/tests/phpunit/includes/GlobalFunctions/wfBaseNameTest.php
@@ -1,17 +1,17 @@
<?php
/**
- * Tests for wfBaseName()
+ * @covers ::wfBaseName
*/
class WfBaseNameTest extends MediaWikiTestCase {
/**
* @dataProvider providePaths
*/
- function testBaseName( $fullpath, $basename ) {
+ public function testBaseName( $fullpath, $basename ) {
$this->assertEquals( $basename, wfBaseName( $fullpath ),
"wfBaseName('$fullpath') => '$basename'" );
}
- function providePaths() {
+ public static function providePaths() {
return array(
array( '', '' ),
array( '/', '' ),
diff --git a/tests/phpunit/includes/GlobalFunctions/wfExpandUrlTest.php b/tests/phpunit/includes/GlobalFunctions/wfExpandUrlTest.php
index c1225e3e..41230a1e 100644
--- a/tests/phpunit/includes/GlobalFunctions/wfExpandUrlTest.php
+++ b/tests/phpunit/includes/GlobalFunctions/wfExpandUrlTest.php
@@ -1,16 +1,17 @@
<?php
/**
- * Tests for wfExpandUrl()
+ * @covers ::wfExpandUrl
*/
class WfExpandUrlTest extends MediaWikiTestCase {
- /** @dataProvider provideExpandableUrls */
+ /**
+ * @dataProvider provideExpandableUrls
+ */
public function testWfExpandUrl( $fullUrl, $shortUrl, $defaultProto, $server, $canServer, $httpsMode, $message ) {
// Fake $wgServer and $wgCanonicalServer
- global $wgServer, $wgCanonicalServer;
- $oldServer = $wgServer;
- $oldCanServer = $wgCanonicalServer;
- $wgServer = $server;
- $wgCanonicalServer = $canServer;
+ $this->setMwGlobals( array(
+ 'wgServer' => $server,
+ 'wgCanonicalServer' => $canServer,
+ ) );
// Fake $_SERVER['HTTPS'] if needed
if ( $httpsMode ) {
@@ -20,10 +21,6 @@ class WfExpandUrlTest extends MediaWikiTestCase {
}
$this->assertEquals( $fullUrl, wfExpandUrl( $shortUrl, $defaultProto ), $message );
-
- // Restore $wgServer and $wgCanonicalServer
- $wgServer = $oldServer;
- $wgCanonicalServer = $oldCanServer;
}
/**
@@ -108,6 +105,7 @@ class WfExpandUrlTest extends MediaWikiTestCase {
}
}
}
+
return $retval;
}
}
diff --git a/tests/phpunit/includes/GlobalFunctions/wfGetCallerTest.php b/tests/phpunit/includes/GlobalFunctions/wfGetCallerTest.php
index 58cf6b95..62296245 100644
--- a/tests/phpunit/includes/GlobalFunctions/wfGetCallerTest.php
+++ b/tests/phpunit/includes/GlobalFunctions/wfGetCallerTest.php
@@ -1,8 +1,11 @@
<?php
+/**
+ * @covers ::wfGetCaller
+ */
class WfGetCallerTest extends MediaWikiTestCase {
- function testZero() {
+ public function testZero() {
$this->assertEquals( __METHOD__, wfGetCaller( 1 ) );
}
@@ -10,7 +13,7 @@ class WfGetCallerTest extends MediaWikiTestCase {
return wfGetCaller();
}
- function testOne() {
+ public function testOne() {
$this->assertEquals( 'WfGetCallerTest::testOne', self::callerOne() );
}
@@ -18,18 +21,20 @@ class WfGetCallerTest extends MediaWikiTestCase {
if ( $n > 0 ) {
return self::intermediateFunction( $level, $n - 1 );
}
+
return wfGetCaller( $level );
}
- function testTwo() {
+ public function testTwo() {
$this->assertEquals( 'WfGetCallerTest::testTwo', self::intermediateFunction() );
}
- function testN() {
+ public function testN() {
$this->assertEquals( 'WfGetCallerTest::testN', self::intermediateFunction( 2, 0 ) );
$this->assertEquals( 'WfGetCallerTest::intermediateFunction', self::intermediateFunction( 1, 0 ) );
- for ( $i = 0; $i < 10; $i++ )
+ for ( $i = 0; $i < 10; $i++ ) {
$this->assertEquals( 'WfGetCallerTest::intermediateFunction', self::intermediateFunction( $i + 1, $i ) );
+ }
}
}
diff --git a/tests/phpunit/includes/GlobalFunctions/wfParseUrlTest.php b/tests/phpunit/includes/GlobalFunctions/wfParseUrlTest.php
index 841a1b12..5032dc11 100644
--- a/tests/phpunit/includes/GlobalFunctions/wfParseUrlTest.php
+++ b/tests/phpunit/includes/GlobalFunctions/wfParseUrlTest.php
@@ -1,7 +1,5 @@
<?php
/**
- * Tests for wfParseUrl()
- *
* Copyright © 2013 Alexandre Emsenhuber
*
* This program is free software; you can redistribute it and/or modify
@@ -22,6 +20,9 @@
* @file
*/
+/**
+ * @covers ::wfParseUrl
+ */
class WfParseUrlTest extends MediaWikiTestCase {
protected function setUp() {
parent::setUp();
@@ -31,7 +32,9 @@ class WfParseUrlTest extends MediaWikiTestCase {
) );
}
- /** @dataProvider provideURLs */
+ /**
+ * @dataProvider provideURLs
+ */
public function testWfParseUrl( $url, $parts ) {
$partsDump = var_export( $parts, true );
$this->assertEquals(
diff --git a/tests/phpunit/includes/GlobalFunctions/wfRemoveDotSegmentsTest.php b/tests/phpunit/includes/GlobalFunctions/wfRemoveDotSegmentsTest.php
index 67861eeb..238a2c9c 100644
--- a/tests/phpunit/includes/GlobalFunctions/wfRemoveDotSegmentsTest.php
+++ b/tests/phpunit/includes/GlobalFunctions/wfRemoveDotSegmentsTest.php
@@ -1,9 +1,11 @@
<?php
/**
- * Tests for wfRemoveDotSegments()
+ *@covers ::wfRemoveDotSegments
*/
class WfRemoveDotSegmentsTest extends MediaWikiTestCase {
- /** @dataProvider providePaths */
+ /**
+ * @dataProvider providePaths
+ */
public function testWfRemoveDotSegments( $inputPath, $outputPath ) {
$this->assertEquals(
$outputPath,
diff --git a/tests/phpunit/includes/GlobalFunctions/wfShorthandToIntegerTest.php b/tests/phpunit/includes/GlobalFunctions/wfShorthandToIntegerTest.php
index 9d66d6b9..aadec87f 100644
--- a/tests/phpunit/includes/GlobalFunctions/wfShorthandToIntegerTest.php
+++ b/tests/phpunit/includes/GlobalFunctions/wfShorthandToIntegerTest.php
@@ -1,10 +1,13 @@
<?php
+/**
+ * @covers ::wfShorthandToInteger
+ */
class WfShorthandToIntegerTest extends MediaWikiTestCase {
/**
* @dataProvider provideABunchOfShorthands
*/
- function testWfShorthandToInteger( $input, $output, $description ) {
+ public function testWfShorthandToInteger( $input, $output, $description ) {
$this->assertEquals(
wfShorthandToInteger( $input ),
$output,
@@ -12,7 +15,7 @@ class WfShorthandToIntegerTest extends MediaWikiTestCase {
);
}
- function provideABunchOfShorthands() {
+ public static function provideABunchOfShorthands() {
return array(
array( '', -1, 'Empty string' ),
array( ' ', -1, 'String of spaces' ),
@@ -24,5 +27,4 @@ class WfShorthandToIntegerTest extends MediaWikiTestCase {
array( '1k', 1024, 'One kb lowercased' ),
);
}
-
}
diff --git a/tests/phpunit/includes/GlobalFunctions/wfTimestampTest.php b/tests/phpunit/includes/GlobalFunctions/wfTimestampTest.php
index cf1830f5..5998f186 100644
--- a/tests/phpunit/includes/GlobalFunctions/wfTimestampTest.php
+++ b/tests/phpunit/includes/GlobalFunctions/wfTimestampTest.php
@@ -1,17 +1,18 @@
<?php
/*
- * Tests for wfTimestamp()
+ * @covers ::wfTimestamp
*/
class WfTimestampTest extends MediaWikiTestCase {
/**
* @dataProvider provideNormalTimestamps
*/
- function testNormalTimestamps( $input, $format, $output, $desc ) {
+ public function testNormalTimestamps( $input, $format, $output, $desc ) {
$this->assertEquals( $output, wfTimestamp( $format, $input ), $desc );
}
- function provideNormalTimestamps() {
+ public static function provideNormalTimestamps() {
$t = gmmktime( 12, 34, 56, 1, 15, 2001 );
+
return array(
// TS_UNIX
array( $t, TS_MW, '20010115123456', 'TS_UNIX to TS_MW' ),
@@ -56,11 +57,11 @@ class WfTimestampTest extends MediaWikiTestCase {
* See r74778 and bug 25451
* @dataProvider provideOldTimestamps
*/
- function testOldTimestamps( $input, $format, $output, $desc ) {
+ public function testOldTimestamps( $input, $format, $output, $desc ) {
$this->assertEquals( $output, wfTimestamp( $format, $input ), $desc );
}
- function provideOldTimestamps() {
+ public static function provideOldTimestamps() {
return array(
array( '19011213204554', TS_RFC2822, 'Fri, 13 Dec 1901 20:45:54 GMT', 'Earliest time according to php documentation' ),
array( '20380119031407', TS_RFC2822, 'Tue, 19 Jan 2038 03:14:07 GMT', 'Latest 32 bit time' ),
@@ -95,11 +96,11 @@ class WfTimestampTest extends MediaWikiTestCase {
* @see http://www.w3.org/Protocols/rfc2616/rfc2616-sec3.html#sec3.3.1
* @dataProvider provideHttpDates
*/
- function testHttpDate( $input, $output, $desc ) {
+ public function testHttpDate( $input, $output, $desc ) {
$this->assertEquals( $output, wfTimestamp( TS_MW, $input ), $desc );
}
- function provideHttpDates() {
+ public static function provideHttpDates() {
return array(
array( 'Sun, 06 Nov 1994 08:49:37 GMT', '19941106084937', 'RFC 822 date' ),
array( 'Sunday, 06-Nov-94 08:49:37 GMT', '19941106084937', 'RFC 850 date' ),
@@ -113,9 +114,9 @@ class WfTimestampTest extends MediaWikiTestCase {
* There are a number of assumptions in our codebase where wfTimestamp()
* should give the current date but it is not given a 0 there. See r71751 CR
*/
- function testTimestampParameter() {
+ public function testTimestampParameter() {
$now = wfTimestamp( TS_UNIX );
- // We check that wfTimestamp doesn't return false (error) and use a LessThan assert
+ // We check that wfTimestamp doesn't return false (error) and use a LessThan assert
// for the cases where the test is run in a second boundary.
$zero = wfTimestamp( TS_UNIX, 0 );
diff --git a/tests/phpunit/includes/GlobalFunctions/wfUrlencodeTest.php b/tests/phpunit/includes/GlobalFunctions/wfUrlencodeTest.php
index 77685d50..ce6c82c5 100644
--- a/tests/phpunit/includes/GlobalFunctions/wfUrlencodeTest.php
+++ b/tests/phpunit/includes/GlobalFunctions/wfUrlencodeTest.php
@@ -1,18 +1,21 @@
<?php
/**
- * Tests for wfUrlencode()
- *
* The function only need a string parameter and might react to IIS7.0
+ * @covers ::wfUrlencode
*/
class WfUrlencodeTest extends MediaWikiTestCase {
#### TESTS ##############################################################
- /** @dataProvider provideURLS */
+ /**
+ * @dataProvider provideURLS
+ */
public function testEncodingUrlWith( $input, $expected ) {
$this->verifyEncodingFor( 'Apache', $input, $expected );
}
- /** @dataProvider provideURLS */
+ /**
+ * @dataProvider provideURLS
+ */
public function testEncodingUrlWithMicrosoftIis7( $input, $expected ) {
$this->verifyEncodingFor( 'Microsoft-IIS/7', $input, $expected );
}
diff --git a/tests/phpunit/includes/HTMLCheckMatrixTest.php b/tests/phpunit/includes/HTMLCheckMatrixTest.php
new file mode 100644
index 00000000..5bbafd37
--- /dev/null
+++ b/tests/phpunit/includes/HTMLCheckMatrixTest.php
@@ -0,0 +1,102 @@
+<?php
+
+/**
+ * Unit tests for the HTMLCheckMatrix form field
+ */
+class HtmlCheckMatrixTest extends MediaWikiTestCase {
+ static private $defaultOptions = array(
+ 'rows' => array( 'r1', 'r2' ),
+ 'columns' => array( 'c1', 'c2' ),
+ 'fieldname' => 'test',
+ );
+
+ public function testPlainInstantiation() {
+ try {
+ $form = new HTMLCheckMatrix( array() );
+ } catch ( MWException $e ) {
+ $this->assertInstanceOf( 'HTMLFormFieldRequiredOptionsException', $e );
+ return;
+ }
+
+ $this->fail( 'Expected MWException indicating missing parameters but none was thrown.' );
+ }
+
+ public function testInstantiationWithMinimumRequiredParameters() {
+ $form = new HTMLCheckMatrix( self::$defaultOptions );
+ $this->assertTrue( true ); // form instantiation must throw exception on failure
+ }
+
+ public function testValidateCallsUserDefinedValidationCallback() {
+ $called = false;
+ $field = new HTMLCheckMatrix( self::$defaultOptions + array(
+ 'validation-callback' => function() use ( &$called ) {
+ $called = true;
+ return false;
+ },
+ ) );
+ $this->assertEquals( false, $this->validate( $field, array() ) );
+ $this->assertTrue( $called );
+ }
+
+ public function testValidateRequiresArrayInput() {
+ $field = new HTMLCheckMatrix( self::$defaultOptions );
+ $this->assertEquals( false, $this->validate( $field, null ) );
+ $this->assertEquals( false, $this->validate( $field, true ) );
+ $this->assertEquals( false, $this->validate( $field, 'abc' ) );
+ $this->assertEquals( false, $this->validate( $field, new stdClass ) );
+ $this->assertEquals( true, $this->validate( $field, array() ) );
+ }
+
+ public function testValidateAllowsOnlyKnownTags() {
+ $field = new HTMLCheckMatrix( self::$defaultOptions );
+ $this->assertInternalType( 'string', $this->validate( $field, array( 'foo' ) ) );
+ }
+
+ public function testValidateAcceptsPartialTagList() {
+ $field = new HTMLCheckMatrix( self::$defaultOptions );
+ $this->assertTrue( $this->validate( $field, array() ) );
+ $this->assertTrue( $this->validate( $field, array( 'c1-r1' ) ) );
+ $this->assertTrue( $this->validate( $field, array( 'c1-r1', 'c1-r2', 'c2-r1', 'c2-r2' ) ) );
+ }
+
+ /**
+ * This form object actually has no visibility into what happens later on, but essentially
+ * if the data submitted by the user passes validate the following is run:
+ * foreach ( $field->filterDataForSubmit( $data ) as $k => $v ) {
+ * $user->setOption( $k, $v );
+ * }
+ */
+ public function testValuesForcedOnRemainOn() {
+ $field = new HTMLCheckMatrix( self::$defaultOptions + array(
+ 'force-options-on' => array( 'c2-r1' ),
+ ) );
+ $expected = array(
+ 'c1-r1' => false,
+ 'c1-r2' => false,
+ 'c2-r1' => true,
+ 'c2-r2' => false,
+ );
+ $this->assertEquals( $expected, $field->filterDataForSubmit( array() ) );
+ }
+
+ public function testValuesForcedOffRemainOff() {
+ $field = new HTMLCheckMatrix( self::$defaultOptions + array(
+ 'force-options-off' => array( 'c1-r2', 'c2-r2' ),
+ ) );
+ $expected = array(
+ 'c1-r1' => true,
+ 'c1-r2' => false,
+ 'c2-r1' => true,
+ 'c2-r2' => false,
+ );
+ // array_keys on the result simulates submitting all fields checked
+ $this->assertEquals( $expected, $field->filterDataForSubmit( array_keys( $expected ) ) );
+ }
+
+ protected function validate( HTMLFormField $field, $submitted ) {
+ return $field->validate(
+ $submitted,
+ array( self::$defaultOptions['fieldname'] => $submitted )
+ );
+ }
+}
diff --git a/tests/phpunit/includes/HashRingTest.php b/tests/phpunit/includes/HashRingTest.php
new file mode 100644
index 00000000..65f13696
--- /dev/null
+++ b/tests/phpunit/includes/HashRingTest.php
@@ -0,0 +1,53 @@
+<?php
+
+/**
+ * @group HashRing
+ */
+class HashRingTest extends MediaWikiTestCase {
+ public function testHashRing() {
+ $ring = new HashRing( array( 's1' => 1, 's2' => 1, 's3' => 2, 's4' => 2, 's5' => 2, 's6' => 3 ) );
+
+ $locations = array();
+ for ( $i = 0; $i < 20; $i++ ) {
+ $locations[ "hello$i"] = $ring->getLocation( "hello$i" );
+ }
+ $expectedLocations = array(
+ "hello0" => "s5",
+ "hello1" => "s6",
+ "hello2" => "s2",
+ "hello3" => "s5",
+ "hello4" => "s6",
+ "hello5" => "s4",
+ "hello6" => "s5",
+ "hello7" => "s4",
+ "hello8" => "s5",
+ "hello9" => "s5",
+ "hello10" => "s3",
+ "hello11" => "s6",
+ "hello12" => "s1",
+ "hello13" => "s3",
+ "hello14" => "s3",
+ "hello15" => "s5",
+ "hello16" => "s4",
+ "hello17" => "s6",
+ "hello18" => "s6",
+ "hello19" => "s3"
+ );
+
+ $this->assertEquals( $expectedLocations, $locations, 'Items placed at proper locations' );
+
+ $locations = array();
+ for ( $i = 0; $i < 5; $i++ ) {
+ $locations[ "hello$i"] = $ring->getLocations( "hello$i", 2 );
+ }
+
+ $expectedLocations = array(
+ "hello0" => array( "s5", "s6" ),
+ "hello1" => array( "s6", "s4" ),
+ "hello2" => array( "s2", "s1" ),
+ "hello3" => array( "s5", "s6" ),
+ "hello4" => array( "s6", "s4" ),
+ );
+ $this->assertEquals( $expectedLocations, $locations, 'Items placed at proper locations' );
+ }
+}
diff --git a/tests/phpunit/includes/HooksTest.php b/tests/phpunit/includes/HooksTest.php
index 89e789b1..81dd4870 100644
--- a/tests/phpunit/includes/HooksTest.php
+++ b/tests/phpunit/includes/HooksTest.php
@@ -2,81 +2,62 @@
class HooksTest extends MediaWikiTestCase {
- public function testOldStyleHooks() {
- $foo = 'Foo';
- $bar = 'Bar';
-
- $i = new NothingClass();
-
+ function setUp() {
global $wgHooks;
-
- $wgHooks['MediaWikiHooksTest001'][] = array( $i, 'someNonStatic' );
-
- wfRunHooks( 'MediaWikiHooksTest001', array( &$foo, &$bar ) );
-
- $this->assertEquals( 'fOO', $foo, 'Standard method' );
- $foo = 'Foo';
-
- $wgHooks['MediaWikiHooksTest001'][] = $i;
-
- wfRunHooks( 'MediaWikiHooksTest001', array( &$foo, &$bar ) );
-
- $this->assertEquals( 'foo', $foo, 'onEventName style' );
- $foo = 'Foo';
-
- $wgHooks['MediaWikiHooksTest001'][] = array( $i, 'someNonStaticWithData', 'baz' );
-
- wfRunHooks( 'MediaWikiHooksTest001', array( &$foo, &$bar ) );
-
- $this->assertEquals( 'baz', $foo, 'Data included' );
- $foo = 'Foo';
-
- $wgHooks['MediaWikiHooksTest001'][] = array( $i, 'someStatic' );
-
- wfRunHooks( 'MediaWikiHooksTest001', array( &$foo, &$bar ) );
-
- $this->assertEquals( 'bah', $foo, 'Standard static method' );
- //$foo = 'Foo';
-
+ parent::setUp();
+ Hooks::clear( 'MediaWikiHooksTest001' );
unset( $wgHooks['MediaWikiHooksTest001'] );
-
}
- public function testNewStyleHooks() {
- $foo = 'Foo';
- $bar = 'Bar';
-
+ public static function provideHooks() {
$i = new NothingClass();
- Hooks::register( 'MediaWikiHooksTest001', array( $i, 'someNonStatic' ) );
-
- Hooks::run( 'MediaWikiHooksTest001', array( &$foo, &$bar ) );
-
- $this->assertEquals( 'fOO', $foo, 'Standard method' );
- $foo = 'Foo';
-
- Hooks::register( 'MediaWikiHooksTest001', $i );
-
- Hooks::run( 'MediaWikiHooksTest001', array( &$foo, &$bar ) );
-
- $this->assertEquals( 'foo', $foo, 'onEventName style' );
- $foo = 'Foo';
+ return array(
+ array( 'Object and method', array( $i, 'someNonStatic' ), 'changed-nonstatic', 'changed-nonstatic' ),
+ array( 'Object and no method', array( $i ), 'changed-onevent', 'original' ),
+ array( 'Object and method with data', array( $i, 'someNonStaticWithData', 'data' ), 'data', 'original' ),
+ array( 'Object and static method', array( $i, 'someStatic' ), 'changed-static', 'original' ),
+ array( 'Class::method static call', array( 'NothingClass::someStatic' ), 'changed-static', 'original' ),
+ array( 'Global function', array( 'NothingFunction' ), 'changed-func', 'original' ),
+ array( 'Global function with data', array( 'NothingFunctionData', 'data' ), 'data', 'original' ),
+ array( 'Closure', array( function ( &$foo, $bar ) {
+ $foo = 'changed-closure';
+
+ return true;
+ } ), 'changed-closure', 'original' ),
+ array( 'Closure with data', array( function ( $data, &$foo, $bar ) {
+ $foo = $data;
+
+ return true;
+ }, 'data' ), 'data', 'original' )
+ );
+ }
- Hooks::register( 'MediaWikiHooksTest001', array( $i, 'someNonStaticWithData', 'baz' ) );
+ /**
+ * @dataProvider provideHooks
+ */
+ public function testOldStyleHooks( $msg, array $hook, $expectedFoo, $expectedBar ) {
+ global $wgHooks;
+ $foo = $bar = 'original';
- Hooks::run( 'MediaWikiHooksTest001', array( &$foo, &$bar ) );
+ $wgHooks['MediaWikiHooksTest001'][] = $hook;
+ wfRunHooks( 'MediaWikiHooksTest001', array( &$foo, &$bar ) );
- $this->assertEquals( 'baz', $foo, 'Data included' );
- $foo = 'Foo';
+ $this->assertSame( $expectedFoo, $foo, $msg );
+ $this->assertSame( $expectedBar, $bar, $msg );
+ }
- Hooks::register( 'MediaWikiHooksTest001', array( $i, 'someStatic' ) );
+ /**
+ * @dataProvider provideHooks
+ */
+ public function testNewStyleHooks( $msg, $hook, $expectedFoo, $expectedBar ) {
+ $foo = $bar = 'original';
+ Hooks::register( 'MediaWikiHooksTest001', $hook );
Hooks::run( 'MediaWikiHooksTest001', array( &$foo, &$bar ) );
- $this->assertEquals( 'bah', $foo, 'Standard static method' );
- $foo = 'Foo';
-
- Hooks::clear( 'MediaWikiHooksTest001' );
+ $this->assertSame( $expectedFoo, $foo, $msg );
+ $this->assertSame( $expectedBar, $bar, $msg );
}
public function testNewStyleHookInteraction() {
@@ -85,10 +66,6 @@ class HooksTest extends MediaWikiTestCase {
$a = new NothingClass();
$b = new NothingClass();
- // make sure to start with a clean slate
- Hooks::clear( 'MediaWikiHooksTest001' );
- unset( $wgHooks['MediaWikiHooksTest001'] );
-
$wgHooks['MediaWikiHooksTest001'][] = $a;
$this->assertTrue( Hooks::isRegistered( 'MediaWikiHooksTest001' ), 'Hook registered via $wgHooks should be noticed by Hooks::isRegistered' );
@@ -101,37 +78,81 @@ class HooksTest extends MediaWikiTestCase {
Hooks::run( 'MediaWikiHooksTest001', array( &$foo, &$bar ) );
$this->assertEquals( 1, $a->calls, 'Hooks::run() should run hooks registered via wgHooks as well as Hooks::register' );
$this->assertEquals( 1, $b->calls, 'Hooks::run() should run hooks registered via wgHooks as well as Hooks::register' );
+ }
- // clean up
- Hooks::clear( 'MediaWikiHooksTest001' );
- unset( $wgHooks['MediaWikiHooksTest001'] );
+ /**
+ * @expectedException MWException
+ */
+ public function testUncallableFunction() {
+ Hooks::register( 'MediaWikiHooksTest001', 'ThisFunctionDoesntExist' );
+ Hooks::run( 'MediaWikiHooksTest001', array() );
}
+
+ public function testFalseReturn() {
+ Hooks::register( 'MediaWikiHooksTest001', function ( &$foo ) {
+ return false;
+ } );
+ Hooks::register( 'MediaWikiHooksTest001', function ( &$foo ) {
+ $foo = 'test';
+
+ return true;
+ } );
+ $foo = 'original';
+ Hooks::run( 'MediaWikiHooksTest001', array( &$foo ) );
+ $this->assertSame( 'original', $foo, 'Hooks continued processing after a false return.' );
+ }
+
+ /**
+ * @expectedException FatalError
+ */
+ public function testFatalError() {
+ Hooks::register( 'MediaWikiHooksTest001', function () {
+ return 'test';
+ } );
+ Hooks::run( 'MediaWikiHooksTest001', array() );
+ }
+}
+
+function NothingFunction( &$foo, &$bar ) {
+ $foo = 'changed-func';
+
+ return true;
+}
+
+function NothingFunctionData( $data, &$foo, &$bar ) {
+ $foo = $data;
+
+ return true;
}
class NothingClass {
public $calls = 0;
public static function someStatic( &$foo, &$bar ) {
- $foo = 'bah';
+ $foo = 'changed-static';
+
return true;
}
public function someNonStatic( &$foo, &$bar ) {
$this->calls++;
- $foo = 'fOO';
- $bar = 'bAR';
+ $foo = 'changed-nonstatic';
+ $bar = 'changed-nonstatic';
+
return true;
}
public function onMediaWikiHooksTest001( &$foo, &$bar ) {
$this->calls++;
- $foo = 'foo';
+ $foo = 'changed-onevent';
+
return true;
}
- public function someNonStaticWithData( $foo, &$bar ) {
+ public function someNonStaticWithData( $data, &$foo, &$bar ) {
$this->calls++;
- $bar = $foo;
+ $foo = $data;
+
return true;
}
}
diff --git a/tests/phpunit/includes/HtmlFormatterTest.php b/tests/phpunit/includes/HtmlFormatterTest.php
new file mode 100644
index 00000000..a37df74f
--- /dev/null
+++ b/tests/phpunit/includes/HtmlFormatterTest.php
@@ -0,0 +1,81 @@
+<?php
+
+/**
+ * @group HtmlFormatter
+ */
+class HtmlFormatterTest extends MediaWikiTestCase {
+ /**
+ * @dataProvider getHtmlData
+ */
+ public function testTransform( $input, $expected, $callback = false ) {
+ $input = self::normalize( $input );
+ $formatter = new HtmlFormatter( HtmlFormatter::wrapHTML( $input ) );
+ if ( $callback ) {
+ $callback( $formatter );
+ }
+ $formatter->filterContent();
+ $html = $formatter->getText();
+ $this->assertEquals( self::normalize( $expected ), self::normalize( $html ) );
+ }
+
+ private static function normalize( $s ) {
+ return str_replace( "\n", '',
+ str_replace( "\r", '', $s ) // "yay" to Windows!
+ );
+ }
+
+ public function getHtmlData() {
+ $removeImages = function( HtmlFormatter $f ) {
+ $f->setRemoveMedia();
+ };
+ $removeTags = function( HtmlFormatter $f ) {
+ $f->remove( array( 'table', '.foo', '#bar', 'div.baz' ) );
+ };
+ $flattenSomeStuff = function( HtmlFormatter $f ) {
+ $f->flatten( array( 's', 'div' ) );
+ };
+ $flattenEverything = function( HtmlFormatter $f ) {
+ $f->flattenAllTags();
+ };
+ return array(
+ // remove images if asked
+ array(
+ '<img src="/foo/bar.jpg" alt="Blah"/>',
+ '',
+ $removeImages,
+ ),
+ // basic tag removal
+ array(
+ '<table><tr><td>foo</td></tr></table><div class="foo">foo</div><div class="foo quux">foo</div><span id="bar">bar</span>
+<strong class="foo" id="bar">foobar</strong><div class="notfoo">test</div><div class="baz"/>
+<span class="baz">baz</span>',
+
+ '<div class="notfoo">test</div>
+<span class="baz">baz</span>',
+ $removeTags,
+ ),
+ // don't flatten tags that start like chosen ones
+ array(
+ '<div><s>foo</s> <span>bar</span></div>',
+ 'foo <span>bar</span>',
+ $flattenSomeStuff,
+ ),
+ // total flattening
+ array(
+ '<div style="foo">bar<sup>2</sup></div>',
+ 'bar2',
+ $flattenEverything,
+ ),
+ // UTF-8 preservation and security
+ array(
+ '<span title="&quot; \' &amp;">&lt;ТеÑÑ‚!&gt;</span> &amp;&lt;&#38;&#0038;&#x26;&#x026;',
+ '<span title="&quot; \' &amp;">&lt;ТеÑÑ‚!&gt;</span> &amp;&lt;&amp;&amp;&amp;&amp;',
+ ),
+ // https://bugzilla.wikimedia.org/show_bug.cgi?id=53086
+ array(
+ 'Foo<sup id="cite_ref-1" class="reference"><a href="#cite_note-1">[1]</a></sup> <a href="/wiki/Bar" title="Bar" class="mw-redirect">Bar</a>',
+ 'Foo<sup id="cite_ref-1" class="reference"><a href="#cite_note-1">[1]</a></sup> <a href="/wiki/Bar" title="Bar" class="mw-redirect">Bar</a>',
+ ),
+ );
+ }
+}
diff --git a/tests/phpunit/includes/HtmlTest.php b/tests/phpunit/includes/HtmlTest.php
index 590664e8..1c62d032 100644
--- a/tests/phpunit/includes/HtmlTest.php
+++ b/tests/phpunit/includes/HtmlTest.php
@@ -37,14 +37,11 @@ class HtmlTest extends MediaWikiTestCase {
'wgLanguageCode' => $langCode,
'wgContLang' => $langObj,
'wgLang' => $langObj,
- 'wgHtml5' => true,
'wgWellFormedXml' => false,
) );
}
public function testElementBasics() {
- global $wgWellFormedXml;
-
$this->assertEquals(
'<img>',
Html::element( 'img', null, '' ),
@@ -63,7 +60,7 @@ class HtmlTest extends MediaWikiTestCase {
'Close tag for empty element (array, string)'
);
- $wgWellFormedXml = true;
+ $this->setMwGlobals( 'wgWellFormedXml', true );
$this->assertEquals(
'<img />',
@@ -72,6 +69,31 @@ class HtmlTest extends MediaWikiTestCase {
);
}
+ public function dataXmlMimeType() {
+ return array(
+ // ( $mimetype, $isXmlMimeType )
+ # HTML is not an XML MimeType
+ array( 'text/html', false ),
+ # XML is an XML MimeType
+ array( 'text/xml', true ),
+ array( 'application/xml', true ),
+ # XHTML is an XML MimeType
+ array( 'application/xhtml+xml', true ),
+ # Make sure other +xml MimeTypes are supported
+ # SVG is another random MimeType even though we don't use it
+ array( 'image/svg+xml', true ),
+ # Complete random other MimeTypes are not XML
+ array( 'text/plain', false ),
+ );
+ }
+
+ /**
+ * @dataProvider dataXmlMimeType
+ */
+ public function testXmlMimeType( $mimetype, $isXmlMimeType ) {
+ $this->assertEquals( $isXmlMimeType, Html::isXmlMimeType( $mimetype ) );
+ }
+
public function testExpandAttributesSkipsNullAndFalse() {
### EMPTY ########
@@ -90,8 +112,6 @@ class HtmlTest extends MediaWikiTestCase {
}
public function testExpandAttributesForBooleans() {
- global $wgHtml5, $wgWellFormedXml;
-
$this->assertEquals(
'',
Html::expandAttributes( array( 'selected' => false ) ),
@@ -114,21 +134,13 @@ class HtmlTest extends MediaWikiTestCase {
'Boolean attributes have no value when value is true (passed as numerical array)'
);
- $wgWellFormedXml = true;
+ $this->setMwGlobals( 'wgWellFormedXml', true );
$this->assertEquals(
' selected=""',
Html::expandAttributes( array( 'selected' => true ) ),
'Boolean attributes have empty string value when value is true (wgWellFormedXml)'
);
-
- $wgHtml5 = false;
-
- $this->assertEquals(
- ' selected="selected"',
- Html::expandAttributes( array( 'selected' => true ) ),
- 'Boolean attributes have their key as value when value is true (wgWellFormedXml, wgHTML5 = false)'
- );
}
/**
@@ -136,8 +148,6 @@ class HtmlTest extends MediaWikiTestCase {
* Please note it output a string prefixed with a space!
*/
public function testExpandAttributesVariousExpansions() {
- global $wgWellFormedXml;
-
### NOT EMPTY ####
$this->assertEquals(
' empty_string=""',
@@ -160,7 +170,7 @@ class HtmlTest extends MediaWikiTestCase {
'Number 0 value needs no quotes'
);
- $wgWellFormedXml = true;
+ $this->setMwGlobals( 'wgWellFormedXml', true );
$this->assertEquals(
' empty_string=""',
@@ -240,7 +250,7 @@ class HtmlTest extends MediaWikiTestCase {
* Test feature added by r96188, let pass attributes values as
* a PHP array. Restricted to class,rel, accesskey.
*/
- function testExpandAttributesSpaceSeparatedAttributesWithBoolean() {
+ public function testExpandAttributesSpaceSeparatedAttributesWithBoolean() {
$this->assertEquals(
' class="booltrue one"',
Html::expandAttributes( array( 'class' => array(
@@ -264,7 +274,7 @@ class HtmlTest extends MediaWikiTestCase {
*
* Feature added by r96188
*/
- function testValueIsAuthoritativeInSpaceSeparatedAttributesArrays() {
+ public function testValueIsAuthoritativeInSpaceSeparatedAttributesArrays() {
$this->assertEquals(
' class=""',
Html::expandAttributes( array( 'class' => array(
@@ -275,7 +285,7 @@ class HtmlTest extends MediaWikiTestCase {
);
}
- function testNamespaceSelector() {
+ public function testNamespaceSelector() {
$this->assertEquals(
'<select id=namespace name=namespace>' . "\n" .
'<option value=0>(Main)</option>' . "\n" .
@@ -354,7 +364,7 @@ class HtmlTest extends MediaWikiTestCase {
);
}
- function testCanFilterOutNamespaces() {
+ public function testCanFilterOutNamespaces() {
$this->assertEquals(
'<select id=namespace name=namespace>' . "\n" .
'<option value=2>User</option>' . "\n" .
@@ -376,7 +386,7 @@ class HtmlTest extends MediaWikiTestCase {
);
}
- function testCanDisableANamespaces() {
+ public function testCanDisableANamespaces() {
$this->assertEquals(
'<select id=namespace name=namespace>' . "\n" .
'<option disabled value=0>(Main)</option>' . "\n" .
@@ -406,7 +416,7 @@ class HtmlTest extends MediaWikiTestCase {
/**
* @dataProvider provideHtml5InputTypes
*/
- function testHtmlElementAcceptsNewHtml5TypesInHtml5Mode( $HTML5InputType ) {
+ public function testHtmlElementAcceptsNewHtml5TypesInHtml5Mode( $HTML5InputType ) {
$this->assertEquals(
'<input type=' . $HTML5InputType . '>',
Html::element( 'input', array( 'type' => $HTML5InputType ) ),
@@ -418,7 +428,7 @@ class HtmlTest extends MediaWikiTestCase {
* List of input element types values introduced by HTML5
* Full list at http://www.w3.org/TR/html-markup/input.html
*/
- function provideHtml5InputTypes() {
+ public static function provideHtml5InputTypes() {
$types = array(
'datetime',
'datetime-local',
@@ -438,6 +448,7 @@ class HtmlTest extends MediaWikiTestCase {
foreach ( $types as $type ) {
$cases[] = array( $type );
}
+
return $cases;
}
@@ -446,7 +457,7 @@ class HtmlTest extends MediaWikiTestCase {
* @covers Html::dropDefaults
* @dataProvider provideElementsWithAttributesHavingDefaultValues
*/
- function testDropDefaults( $expected, $element, $attribs, $message = '' ) {
+ public function testDropDefaults( $expected, $element, $attribs, $message = '' ) {
$this->assertEquals( $expected, Html::element( $element, $attribs ), $message );
}
@@ -602,6 +613,7 @@ class HtmlTest extends MediaWikiTestCase {
isset( $case[3] ) ? $case[3] : ''
);
}
+
return $ret;
}
@@ -616,5 +628,4 @@ class HtmlTest extends MediaWikiTestCase {
'Allow special case "step=any".'
);
}
-
}
diff --git a/tests/phpunit/includes/HttpTest.php b/tests/phpunit/includes/HttpTest.php
index 7698776c..11d8ed60 100644
--- a/tests/phpunit/includes/HttpTest.php
+++ b/tests/phpunit/includes/HttpTest.php
@@ -5,8 +5,9 @@
class HttpTest extends MediaWikiTestCase {
/**
* @dataProvider cookieDomains
+ * @covers Cookie::validateCookieDomain
*/
- function testValidateCookieDomain( $expected, $domain, $origin = null ) {
+ public function testValidateCookieDomain( $expected, $domain, $origin = null ) {
if ( $origin ) {
$ok = Cookie::validateCookieDomain( $domain, $origin );
$msg = "$domain against origin $origin";
@@ -50,8 +51,9 @@ class HttpTest extends MediaWikiTestCase {
* Test Http::isValidURI()
* @bug 27854 : Http::isValidURI is too lax
* @dataProvider provideURI
+ * @covers Http::isValidURI
*/
- function testIsValidUri( $expect, $URI, $message = '' ) {
+ public function testIsValidUri( $expect, $URI, $message = '' ) {
$this->assertEquals(
$expect,
(bool)Http::isValidURI( $URI ),
@@ -132,7 +134,7 @@ class HttpTest extends MediaWikiTestCase {
* rewritten when bug 29232 is taken care of (high-level handling of
* HTTP redirects).
*/
- function testRelativeRedirections() {
+ public function testRelativeRedirections() {
$h = MWHttpRequestTester::factory( 'http://oldsite/file.ext' );
# Forge a Location header
@@ -176,7 +178,7 @@ class HttpTest extends MediaWikiTestCase {
*/
class MWHttpRequestTester extends MWHttpRequest {
- // function derived from the MWHttpRequest factory function but
+ // function derived from the MWHttpRequest factory function but
// returns appropriate tester class here
public static function factory( $url, $options = null ) {
if ( !Http::$httpEngine ) {
@@ -194,6 +196,7 @@ class MWHttpRequestTester extends MWHttpRequest {
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 PhpHttpRequestTester( $url, $options );
default:
}
diff --git a/tests/phpunit/includes/IPTest.php b/tests/phpunit/includes/IPTest.php
index 7bc29385..c074eea6 100644
--- a/tests/phpunit/includes/IPTest.php
+++ b/tests/phpunit/includes/IPTest.php
@@ -1,7 +1,12 @@
<?php
/**
- * Tests for IP validity functions. Ported from /t/inc/IP.t by avar.
+ * Tests for IP validity functions.
+ *
+ * Ported from /t/inc/IP.t by avar.
+ *
* @group IP
+ * @todo Test methods in this call should be split into a method and a
+ * dataprovider.
*/
class IPTest extends MediaWikiTestCase {
@@ -259,14 +264,63 @@ class IPTest extends MediaWikiTestCase {
}
/**
- * test wrapper around ip2long which might return -1 or false depending on PHP version
* @covers IP::toUnsigned
+ * @dataProvider provideToUnsigned
*/
- public function testip2longWrapper() {
- // @todo FIXME: Add more tests ?
- $this->assertEquals( pow( 2, 32 ) - 1, IP::toUnsigned( '255.255.255.255' ) );
- $i = 'IN.VA.LI.D';
- $this->assertFalse( IP::toUnSigned( $i ) );
+ public function testToUnsigned( $expected, $input ) {
+ $result = IP::toUnsigned( $input );
+ $this->assertTrue( $result === false || is_string( $result ) || is_int( $result ) );
+ $this->assertEquals( $expected, $result );
+ }
+
+ /**
+ * Provider for IP::testToUnsigned()
+ */
+ public static function provideToUnsigned() {
+ return array(
+ array( 1, '0.0.0.1' ),
+ array( 16909060, '1.2.3.4' ),
+ array( 2130706433, '127.0.0.1' ),
+ array( '2147483648', '128.0.0.0' ),
+ array( '3735931646', '222.173.202.254' ),
+ array( pow( 2, 32 ) - 1, '255.255.255.255' ),
+ array( false, 'IN.VA.LI.D' ),
+ array( 1, '::1' ),
+ array( '42540766452641154071740215577757643572', '2001:0db8:85a3:0000:0000:8a2e:0370:7334' ),
+ array( '42540766452641154071740215577757643572', '2001:db8:85a3::8a2e:0370:7334' ),
+ array( false, 'IN:VA::LI:D' ),
+ array( false, ':::1' )
+ );
+ }
+
+ /**
+ * @covers IP::toHex
+ * @dataProvider provideToHex
+ */
+ public function testToHex( $expected, $input ) {
+ $result = IP::toHex( $input );
+ $this->assertTrue( $result === false || is_string( $result ) );
+ $this->assertEquals( $expected, $result );
+ }
+
+ /**
+ * Provider for IP::testToHex()
+ */
+ public static function provideToHex() {
+ return array(
+ array( '00000001', '0.0.0.1' ),
+ array( '01020304', '1.2.3.4' ),
+ array( '7F000001', '127.0.0.1' ),
+ array( '80000000', '128.0.0.0' ),
+ array( 'DEADCAFE', '222.173.202.254' ),
+ array( 'FFFFFFFF', '255.255.255.255' ),
+ array( false, 'IN.VA.LI.D' ),
+ array( 'v6-00000000000000000000000000000001', '::1' ),
+ array( 'v6-20010DB885A3000000008A2E03707334', '2001:0db8:85a3:0000:0000:8a2e:0370:7334' ),
+ array( 'v6-20010DB885A3000000008A2E03707334', '2001:db8:85a3::8a2e:0370:7334' ),
+ array( false, 'IN:VA::LI:D' ),
+ array( false, ':::1' )
+ );
}
/**
@@ -338,7 +392,7 @@ class IPTest extends MediaWikiTestCase {
* representing the network mask and the bit mask.
* @covers IP::parseCIDR
*/
- function testCIDRParsing() {
+ public function testCIDRParsing() {
$this->assertFalseCIDR( '192.0.2.0', "missing mask" );
$this->assertFalseCIDR( '192.0.2.0/', "missing bitmask" );
@@ -435,7 +489,7 @@ class IPTest extends MediaWikiTestCase {
* Test for IP::splitHostAndPort().
* @dataProvider provideSplitHostAndPort
*/
- function testSplitHostAndPort( $expected, $input, $description ) {
+ public function testSplitHostAndPort( $expected, $input, $description ) {
$this->assertEquals( $expected, IP::splitHostAndPort( $input ), $description );
}
@@ -462,7 +516,7 @@ class IPTest extends MediaWikiTestCase {
* Test for IP::combineHostAndPort()
* @dataProvider provideCombineHostAndPort
*/
- function testCombineHostAndPort( $expected, $input, $description ) {
+ public function testCombineHostAndPort( $expected, $input, $description ) {
list( $host, $port, $defaultPort ) = $input;
$this->assertEquals(
$expected,
@@ -486,7 +540,7 @@ class IPTest extends MediaWikiTestCase {
* Test for IP::sanitizeRange()
* @dataProvider provideIPCIDRs
*/
- function testSanitizeRange( $input, $expected, $description ) {
+ public function testSanitizeRange( $input, $expected, $description ) {
$this->assertEquals( $expected, IP::sanitizeRange( $input ), $description );
}
@@ -510,7 +564,7 @@ class IPTest extends MediaWikiTestCase {
* Test for IP::prettifyIP()
* @dataProvider provideIPsToPrettify
*/
- function testPrettifyIP( $ip, $prettified ) {
+ public function testPrettifyIP( $ip, $prettified ) {
$this->assertEquals( $prettified, IP::prettifyIP( $ip ), "Prettify of $ip" );
}
diff --git a/tests/phpunit/includes/JsonTest.php b/tests/phpunit/includes/JsonTest.php
deleted file mode 100644
index 96a2ead5..00000000
--- a/tests/phpunit/includes/JsonTest.php
+++ /dev/null
@@ -1,27 +0,0 @@
-<?php
-
-class JsonTest extends MediaWikiTestCase {
-
- function testPhpBug46944Test() {
- $this->assertNotEquals(
- '\ud840\udc00',
- strtolower( FormatJson::encode( "\xf0\xa0\x80\x80" ) ),
- 'Test encoding an broken json_encode character (U+20000)'
- );
-
- }
-
- function testDecodeVarTypes() {
- $this->assertInternalType(
- 'object',
- FormatJson::decode( '{"Name": "Cheeso", "Rank": 7}' ),
- 'Default to object'
- );
-
- $this->assertInternalType(
- 'array',
- FormatJson::decode( '{"Name": "Cheeso", "Rank": 7}', true ),
- 'Optional array'
- );
- }
-}
diff --git a/tests/phpunit/includes/LanguageConverterTest.php b/tests/phpunit/includes/LanguageConverterTest.php
index d4d93b07..7c2134b9 100644
--- a/tests/phpunit/includes/LanguageConverterTest.php
+++ b/tests/phpunit/includes/LanguageConverterTest.php
@@ -30,39 +30,39 @@ class LanguageConverterTest extends MediaWikiLangTestCase {
parent::tearDown();
}
- function testGetPreferredVariantDefaults() {
+ public function testGetPreferredVariantDefaults() {
$this->assertEquals( 'tg', $this->lc->getPreferredVariant() );
}
- function testGetPreferredVariantHeaders() {
+ public function testGetPreferredVariantHeaders() {
global $wgRequest;
$wgRequest->setHeader( 'Accept-Language', 'tg-latn' );
$this->assertEquals( 'tg-latn', $this->lc->getPreferredVariant() );
}
- function testGetPreferredVariantHeaderWeight() {
+ public function testGetPreferredVariantHeaderWeight() {
global $wgRequest;
$wgRequest->setHeader( 'Accept-Language', 'tg;q=1' );
$this->assertEquals( 'tg', $this->lc->getPreferredVariant() );
}
- function testGetPreferredVariantHeaderWeight2() {
+ public function testGetPreferredVariantHeaderWeight2() {
global $wgRequest;
$wgRequest->setHeader( 'Accept-Language', 'tg-latn;q=1' );
$this->assertEquals( 'tg-latn', $this->lc->getPreferredVariant() );
}
- function testGetPreferredVariantHeaderMulti() {
+ public function testGetPreferredVariantHeaderMulti() {
global $wgRequest;
$wgRequest->setHeader( 'Accept-Language', 'en, tg-latn;q=1' );
$this->assertEquals( 'tg-latn', $this->lc->getPreferredVariant() );
}
- function testGetPreferredVariantUserOption() {
+ public function testGetPreferredVariantUserOption() {
global $wgUser;
$wgUser = new User;
@@ -75,7 +75,21 @@ class LanguageConverterTest extends MediaWikiLangTestCase {
$this->assertEquals( 'tg-latn', $this->lc->getPreferredVariant() );
}
- function testGetPreferredVariantHeaderUserVsUrl() {
+ public function testGetPreferredVariantUserOptionForForeignLanguage() {
+ global $wgContLang, $wgUser;
+
+ $wgContLang = Language::factory( 'en' );
+ $wgUser = new User;
+ $wgUser->load(); // from 'defaults'
+ $wgUser->mId = 1;
+ $wgUser->mDataLoaded = true;
+ $wgUser->mOptionsLoaded = true;
+ $wgUser->setOption( 'variant-tg', 'tg-latn' );
+
+ $this->assertEquals( 'tg-latn', $this->lc->getPreferredVariant() );
+ }
+
+ public function testGetPreferredVariantHeaderUserVsUrl() {
global $wgContLang, $wgRequest, $wgUser;
$wgContLang = Language::factory( 'tg-latn' );
@@ -85,19 +99,19 @@ class LanguageConverterTest extends MediaWikiLangTestCase {
$wgUser->mFrom = 'defaults';
$wgUser->mOptionsLoaded = true;
// The user's data is ignored because the variant is set in the URL.
- $wgUser->setOption( 'variant', 'tg-latn' );
+ $wgUser->setOption( 'variant', 'tg-latn' );
$this->assertEquals( 'tg', $this->lc->getPreferredVariant() );
}
- function testGetPreferredVariantDefaultLanguageVariant() {
+ public function testGetPreferredVariantDefaultLanguageVariant() {
global $wgDefaultLanguageVariant;
$wgDefaultLanguageVariant = 'tg-latn';
$this->assertEquals( 'tg-latn', $this->lc->getPreferredVariant() );
}
- function testGetPreferredVariantDefaultLanguageVsUrlVariant() {
+ public function testGetPreferredVariantDefaultLanguageVsUrlVariant() {
global $wgDefaultLanguageVariant, $wgRequest, $wgContLang;
$wgContLang = Language::factory( 'tg-latn' );
@@ -123,7 +137,6 @@ class TestConverter extends LanguageConverter {
'tg' => new ReplacementArray()
);
}
-
}
class LanguageToTest extends Language {
diff --git a/tests/phpunit/includes/LicensesTest.php b/tests/phpunit/includes/LicensesTest.php
index 212b3b3b..478a2ffc 100644
--- a/tests/phpunit/includes/LicensesTest.php
+++ b/tests/phpunit/includes/LicensesTest.php
@@ -2,7 +2,7 @@
class LicensesTest extends MediaWikiTestCase {
- function testLicenses() {
+ public function testLicenses() {
$str = "
* Free licenses:
** GFDL|Debian disagrees
diff --git a/tests/phpunit/includes/LinkerTest.php b/tests/phpunit/includes/LinkerTest.php
index e353c46c..b605f08f 100644
--- a/tests/phpunit/includes/LinkerTest.php
+++ b/tests/phpunit/includes/LinkerTest.php
@@ -6,7 +6,7 @@ class LinkerTest extends MediaWikiLangTestCase {
* @dataProvider provideCasesForUserLink
* @covers Linker::userLink
*/
- function testUserLink( $expected, $userId, $userName, $altUserName = false, $msg = '' ) {
+ public function testUserLink( $expected, $userId, $userName, $altUserName = false, $msg = '' ) {
$this->setMwGlobals( array(
'wgArticlePath' => '/wiki/$1',
'wgWellFormedXml' => true,
@@ -17,7 +17,7 @@ class LinkerTest extends MediaWikiLangTestCase {
);
}
- function provideCasesForUserLink() {
+ public static function provideCasesForUserLink() {
# Format:
# - expected
# - userid
diff --git a/tests/phpunit/includes/LinksUpdateTest.php b/tests/phpunit/includes/LinksUpdateTest.php
index a79b3a25..5ade250e 100644
--- a/tests/phpunit/includes/LinksUpdateTest.php
+++ b/tests/phpunit/includes/LinksUpdateTest.php
@@ -7,7 +7,7 @@
*/
class LinksUpdateTest extends MediaWikiTestCase {
- function __construct( $name = null, array $data = array(), $dataName = '' ) {
+ function __construct( $name = null, array $data = array(), $dataName = '' ) {
parent::__construct( $name, $data, $dataName );
$this->tablesUsed = array_merge( $this->tablesUsed,
@@ -60,18 +60,30 @@ class LinksUpdateTest extends MediaWikiTestCase {
$po->addLink( Title::newFromText( "linksupdatetest:Foo" ) ); // interwiki link should be ignored
$po->addLink( Title::newFromText( "#Foo" ) ); // hash link should be ignored
- $this->assertLinksUpdate( $t, $po, 'pagelinks', 'pl_namespace, pl_title', 'pl_from = 111', array(
+ $update = $this->assertLinksUpdate( $t, $po, 'pagelinks', 'pl_namespace, pl_title', 'pl_from = 111', array(
array( NS_MAIN, 'Foo' ),
) );
+ $this->assertArrayEquals( array(
+ Title::makeTitle( NS_MAIN, 'Foo' ), // newFromText doesn't yield the same internal state....
+ ), $update->getAddedLinks() );
$po = new ParserOutput();
$po->setTitleText( $t->getPrefixedText() );
$po->addLink( Title::newFromText( "Bar" ) );
+ $po->addLink( Title::newFromText( "Talk:Bar" ) );
- $this->assertLinksUpdate( $t, $po, 'pagelinks', 'pl_namespace, pl_title', 'pl_from = 111', array(
+ $update = $this->assertLinksUpdate( $t, $po, 'pagelinks', 'pl_namespace, pl_title', 'pl_from = 111', array(
array( NS_MAIN, 'Bar' ),
+ array( NS_TALK, 'Bar' ),
) );
+ $this->assertArrayEquals( array(
+ Title::makeTitle( NS_MAIN, 'Bar' ),
+ Title::makeTitle( NS_TALK, 'Bar' ),
+ ), $update->getAddedLinks() );
+ $this->assertArrayEquals( array(
+ Title::makeTitle( NS_MAIN, 'Foo' ),
+ ), $update->getRemovedLinks() );
}
public function testUpdate_externallinks() {
@@ -122,7 +134,6 @@ class LinksUpdateTest extends MediaWikiTestCase {
$po->addImage( "Foo.png" );
-
$this->assertLinksUpdate( $t, $po, 'imagelinks', 'il_to', 'il_from = 111', array(
array( 'Foo.png' ),
) );
@@ -133,7 +144,6 @@ class LinksUpdateTest extends MediaWikiTestCase {
$po->addLanguageLink( Title::newFromText( "en:Foo" )->getFullText() );
-
$this->assertLinksUpdate( $t, $po, 'langlinks', 'll_lang, ll_title', 'll_from = 111', array(
array( 'En', 'Foo' ),
) );
@@ -149,7 +159,7 @@ class LinksUpdateTest extends MediaWikiTestCase {
) );
}
- #@todo: test recursive, too!
+ // @todo test recursive, too!
protected function assertLinksUpdate( Title $title, ParserOutput $parserOutput, $table, $fields, $condition, array $expectedRows ) {
$update = new LinksUpdate( $title, $parserOutput );
@@ -160,5 +170,6 @@ class LinksUpdateTest extends MediaWikiTestCase {
$update->commitTransaction();
$this->assertSelect( $table, $fields, $condition, $expectedRows );
+ return $update;
}
}
diff --git a/tests/phpunit/includes/LocalFileTest.php b/tests/phpunit/includes/LocalFileTest.php
index d6f0d2ee..2501c783 100644
--- a/tests/phpunit/includes/LocalFileTest.php
+++ b/tests/phpunit/includes/LocalFileTest.php
@@ -35,72 +35,72 @@ class LocalFileTest extends MediaWikiTestCase {
$this->file_lc = $this->repo_lc->newFile( 'test!' );
}
- function testGetHashPath() {
+ public 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() {
+ public 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() {
+ public 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() {
+ public function testGetArchivePath() {
$this->assertEquals( 'mwstore://local-backend/test-public/archive', $this->file_hl0->getArchivePath() );
$this->assertEquals( 'mwstore://local-backend/test-public/archive/a/a2', $this->file_hl2->getArchivePath() );
$this->assertEquals( 'mwstore://local-backend/test-public/archive/!', $this->file_hl0->getArchivePath( '!' ) );
$this->assertEquals( 'mwstore://local-backend/test-public/archive/a/a2/!', $this->file_hl2->getArchivePath( '!' ) );
}
- function testGetThumbPath() {
+ public function testGetThumbPath() {
$this->assertEquals( 'mwstore://local-backend/test-thumb/Test!', $this->file_hl0->getThumbPath() );
$this->assertEquals( 'mwstore://local-backend/test-thumb/a/a2/Test!', $this->file_hl2->getThumbPath() );
$this->assertEquals( 'mwstore://local-backend/test-thumb/Test!/x', $this->file_hl0->getThumbPath( 'x' ) );
$this->assertEquals( 'mwstore://local-backend/test-thumb/a/a2/Test!/x', $this->file_hl2->getThumbPath( 'x' ) );
}
- function testGetArchiveUrl() {
+ public 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() {
+ public 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() {
+ public 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() {
+ public 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() {
+ public function testGetUrl() {
$this->assertEquals( '/testurl/Test%21', $this->file_hl0->getUrl() );
$this->assertEquals( '/testurl/a/a2/Test%21', $this->file_hl2->getUrl() );
}
- function testWfLocalFile() {
+ public function testWfLocalFile() {
$file = wfLocalFile( "File:Some_file_that_probably_doesn't exist.png" );
$this->assertThat( $file, $this->isInstanceOf( 'LocalFile' ), 'wfLocalFile() returns LocalFile for valid Titles' );
}
diff --git a/tests/phpunit/includes/MWExceptionHandlerTest.php b/tests/phpunit/includes/MWExceptionHandlerTest.php
new file mode 100644
index 00000000..987dfa83
--- /dev/null
+++ b/tests/phpunit/includes/MWExceptionHandlerTest.php
@@ -0,0 +1,73 @@
+<?php
+/**
+ * Tests for includes/Exception.php.
+ *
+ * @author Antoine Musso
+ * @copyright Copyright © 2013, Antoine Musso
+ * @copyright Copyright © 2013, Wikimedia Foundation Inc.
+ * @file
+ */
+
+class MWExceptionHandlerTest extends MediaWikiTestCase {
+
+ /**
+ * @covers MWExceptionHandler::getRedactedTrace
+ */
+ function testGetRedactedTrace() {
+ try {
+ $array = array( 'a', 'b' );
+ $object = new StdClass();
+ self::helperThrowAnException( $array, $object );
+ } catch (Exception $e) {
+ }
+
+ # Make sure our strack trace contains an array and an object passed to
+ # some function in the stacktrace. Else, we can not assert the trace
+ # redaction achieved its job.
+ $trace = $e->getTrace();
+ $hasObject = false;
+ $hasArray = false;
+ foreach ( $trace as $frame ) {
+ if ( ! isset( $frame['args'] ) ) {
+ continue;
+ }
+ foreach ( $frame['args'] as $arg ) {
+ $hasObject = $hasObject || is_object( $arg );
+ $hasArray = $hasArray || is_array( $arg );
+ }
+
+ if( $hasObject && $hasArray ) {
+ break;
+ }
+ }
+ $this->assertTrue( $hasObject,
+ "The stacktrace must have a function having an object has parameter" );
+ $this->assertTrue( $hasArray,
+ "The stacktrace must have a function having an array has parameter" );
+
+ # Now we redact the trace.. and make sure no function arguments are
+ # arrays or objects.
+ $redacted = MWExceptionHandler::getRedactedTrace( $e );
+
+ foreach ( $redacted as $frame ) {
+ if ( ! isset( $frame['args'] ) ) {
+ continue;
+ }
+ foreach ( $frame['args'] as $arg ) {
+ $this->assertNotInternalType( 'array', $arg);
+ $this->assertNotInternalType( 'object', $arg);
+ }
+ }
+ }
+
+ /**
+ * Helper function for testExpandArgumentsInCall
+ *
+ * Pass it an object and an array :-)
+ *
+ * @throws Exception
+ */
+ protected static function helperThrowAnException( $a, $b ) {
+ throw new Exception();
+ }
+}
diff --git a/tests/phpunit/includes/MWFunctionTest.php b/tests/phpunit/includes/MWFunctionTest.php
index 6c17bf48..d86f2c9b 100644
--- a/tests/phpunit/includes/MWFunctionTest.php
+++ b/tests/phpunit/includes/MWFunctionTest.php
@@ -1,27 +1,7 @@
<?php
class MWFunctionTest extends MediaWikiTestCase {
- function testCallUserFuncWorkarounds() {
- $this->assertEquals(
- call_user_func( array( 'MWFunctionTest', 'someMethod' ) ),
- MWFunction::call( 'MWFunctionTest::someMethod' )
- );
- $this->assertEquals(
- call_user_func( array( 'MWFunctionTest', 'someMethod' ), 'foo', 'bar', 'baz' ),
- MWFunction::call( 'MWFunctionTest::someMethod', 'foo', 'bar', 'baz' )
- );
-
- $this->assertEquals(
- call_user_func_array( array( 'MWFunctionTest', 'someMethod' ), array() ),
- MWFunction::callArray( 'MWFunctionTest::someMethod', array() )
- );
- $this->assertEquals(
- call_user_func_array( array( 'MWFunctionTest', 'someMethod' ), array( 'foo', 'bar', 'baz' ) ),
- MWFunction::callArray( 'MWFunctionTest::someMethod', array( 'foo', 'bar', 'baz' ) )
- );
- }
-
- function testNewObjFunction() {
+ public function testNewObjFunction() {
$arg1 = 'Foo';
$arg2 = 'Bar';
$arg3 = array( 'Baz' );
@@ -34,32 +14,7 @@ class MWFunctionTest extends MediaWikiTestCase {
MWFunction::newObj( 'MWBlankClass', $args )->args,
$newObject->args
);
-
- $this->assertEquals(
- MWFunction::newObj( 'MWBlankClass', $args, true )->args,
- $newObject->args,
- 'Works even with PHP version < 5.1.3'
- );
- }
-
- /**
- * @expectedException MWException
- */
- function testCallingParentFails() {
- MWFunction::call( 'parent::foo' );
}
-
- /**
- * @expectedException MWException
- */
- function testCallingSelfFails() {
- MWFunction::call( 'self::foo' );
- }
-
- public static function someMethod() {
- return func_get_args();
- }
-
}
class MWBlankClass {
diff --git a/tests/phpunit/includes/MWNamespaceTest.php b/tests/phpunit/includes/MWNamespaceTest.php
index 45f8dafc..10e9db61 100644
--- a/tests/phpunit/includes/MWNamespaceTest.php
+++ b/tests/phpunit/includes/MWNamespaceTest.php
@@ -125,7 +125,6 @@ class MWNamespaceTest extends MediaWikiTestCase {
public function testGetAssociated() {
$this->assertEquals( NS_TALK, MWNamespace::getAssociated( NS_MAIN ) );
$this->assertEquals( NS_MAIN, MWNamespace::getAssociated( NS_TALK ) );
-
}
### Exceptions with getAssociated()
@@ -201,7 +200,6 @@ class MWNamespaceTest extends MediaWikiTestCase {
NS_SPECIAL, NS_MEDIA,
"NS_SPECIAL and NS_MEDIA are different subject namespaces"
);
-
}
/**
@@ -346,33 +344,32 @@ class MWNamespaceTest extends MediaWikiTestCase {
$this->assertEquals(
array( NS_MAIN ),
- MWNamespace::getcontentNamespaces(),
+ MWNamespace::getContentNamespaces(),
'$wgContentNamespaces is an array with only NS_MAIN by default'
);
-
# test !is_array( $wgcontentNamespaces )
$wgContentNamespaces = '';
- $this->assertEquals( NS_MAIN, MWNamespace::getcontentNamespaces() );
+ $this->assertEquals( array( NS_MAIN ), MWNamespace::getContentNamespaces() );
$wgContentNamespaces = false;
- $this->assertEquals( NS_MAIN, MWNamespace::getcontentNamespaces() );
+ $this->assertEquals( array( NS_MAIN ), MWNamespace::getContentNamespaces() );
$wgContentNamespaces = null;
- $this->assertEquals( NS_MAIN, MWNamespace::getcontentNamespaces() );
+ $this->assertEquals( array( NS_MAIN ), MWNamespace::getContentNamespaces() );
$wgContentNamespaces = 5;
- $this->assertEquals( NS_MAIN, MWNamespace::getcontentNamespaces() );
+ $this->assertEquals( array( NS_MAIN ), MWNamespace::getContentNamespaces() );
# test $wgContentNamespaces === array()
$wgContentNamespaces = array();
- $this->assertEquals( NS_MAIN, MWNamespace::getcontentNamespaces() );
+ $this->assertEquals( array( NS_MAIN ), MWNamespace::getContentNamespaces() );
# test !in_array( NS_MAIN, $wgContentNamespaces )
$wgContentNamespaces = array( NS_USER, NS_CATEGORY );
$this->assertEquals(
array( NS_MAIN, NS_USER, NS_CATEGORY ),
- MWNamespace::getcontentNamespaces(),
+ MWNamespace::getContentNamespaces(),
'NS_MAIN is forced in $wgContentNamespaces even if unwanted'
);
@@ -380,13 +377,13 @@ class MWNamespaceTest extends MediaWikiTestCase {
$wgContentNamespaces = array( NS_MAIN );
$this->assertEquals(
array( NS_MAIN ),
- MWNamespace::getcontentNamespaces()
+ MWNamespace::getContentNamespaces()
);
$wgContentNamespaces = array( NS_MAIN, NS_USER, NS_CATEGORY );
$this->assertEquals(
array( NS_MAIN, NS_USER, NS_CATEGORY ),
- MWNamespace::getcontentNamespaces()
+ MWNamespace::getContentNamespaces()
);
}
diff --git a/tests/phpunit/includes/MessageTest.php b/tests/phpunit/includes/MessageTest.php
index c378bb8e..1e18f975 100644
--- a/tests/phpunit/includes/MessageTest.php
+++ b/tests/phpunit/includes/MessageTest.php
@@ -10,7 +10,7 @@ class MessageTest extends MediaWikiLangTestCase {
) );
}
- function testExists() {
+ public function testExists() {
$this->assertTrue( wfMessage( 'mainpage' )->exists() );
$this->assertTrue( wfMessage( 'mainpage' )->params( array() )->exists() );
$this->assertTrue( wfMessage( 'mainpage' )->rawParams( 'foo', 123 )->exists() );
@@ -19,7 +19,7 @@ class MessageTest extends MediaWikiLangTestCase {
$this->assertFalse( wfMessage( 'i-dont-exist-evar' )->rawParams( 'foo', 123 )->exists() );
}
- function testKey() {
+ public function testKey() {
$this->assertInstanceOf( 'Message', wfMessage( 'mainpage' ) );
$this->assertInstanceOf( 'Message', wfMessage( 'i-dont-exist-evar' ) );
$this->assertEquals( 'Main Page', wfMessage( 'mainpage' )->text() );
@@ -28,47 +28,103 @@ class MessageTest extends MediaWikiLangTestCase {
$this->assertEquals( '&lt;i-dont-exist-evar&gt;', wfMessage( 'i-dont-exist-evar' )->escaped() );
}
- function testInLanguage() {
+ public function testInLanguage() {
$this->assertEquals( 'Main Page', wfMessage( 'mainpage' )->inLanguage( 'en' )->text() );
$this->assertEquals( 'Ð—Ð°Ð³Ð»Ð°Ð²Ð½Ð°Ñ Ñтраница', wfMessage( 'mainpage' )->inLanguage( 'ru' )->text() );
$this->assertEquals( 'Main Page', wfMessage( 'mainpage' )->inLanguage( Language::factory( 'en' ) )->text() );
$this->assertEquals( 'Ð—Ð°Ð³Ð»Ð°Ð²Ð½Ð°Ñ Ñтраница', wfMessage( 'mainpage' )->inLanguage( Language::factory( 'ru' ) )->text() );
}
- function testMessageParams() {
+ public function testMessageParams() {
$this->assertEquals( 'Return to $1.', wfMessage( 'returnto' )->text() );
$this->assertEquals( 'Return to $1.', wfMessage( 'returnto', array() )->text() );
$this->assertEquals( 'You have foo (bar).', wfMessage( 'youhavenewmessages', 'foo', 'bar' )->text() );
$this->assertEquals( 'You have foo (bar).', wfMessage( 'youhavenewmessages', array( 'foo', 'bar' ) )->text() );
}
- function testMessageParamSubstitution() {
+ public function testMessageParamSubstitution() {
$this->assertEquals( '(Ð—Ð°Ð³Ð»Ð°Ð²Ð½Ð°Ñ Ñтраница)', wfMessage( 'parentheses', 'Ð—Ð°Ð³Ð»Ð°Ð²Ð½Ð°Ñ Ñтраница' )->plain() );
$this->assertEquals( '(Ð—Ð°Ð³Ð»Ð°Ð²Ð½Ð°Ñ Ñтраница $1)', wfMessage( 'parentheses', 'Ð—Ð°Ð³Ð»Ð°Ð²Ð½Ð°Ñ Ñтраница $1' )->plain() );
$this->assertEquals( '(Ð—Ð°Ð³Ð»Ð°Ð²Ð½Ð°Ñ Ñтраница)', wfMessage( 'parentheses' )->rawParams( 'Ð—Ð°Ð³Ð»Ð°Ð²Ð½Ð°Ñ Ñтраница' )->plain() );
$this->assertEquals( '(Ð—Ð°Ð³Ð»Ð°Ð²Ð½Ð°Ñ Ñтраница $1)', wfMessage( 'parentheses' )->rawParams( 'Ð—Ð°Ð³Ð»Ð°Ð²Ð½Ð°Ñ Ñтраница $1' )->plain() );
}
- function testDeliciouslyManyParams() {
+ public function testDeliciouslyManyParams() {
$msg = new RawMessage( '$1$2$3$4$5$6$7$8$9$10$11$12' );
// One less than above has placeholders
$params = array( 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k' );
$this->assertEquals( 'abcdefghijka2', $msg->params( $params )->plain(), 'Params > 9 are replaced correctly' );
}
- function testInContentLanguage() {
- global $wgLang, $wgForceUIMsgAsContentMsg;
- $wgLang = Language::factory( 'fr' );
+ /**
+ * FIXME: This should not need database, but Language#formatExpiry does (bug 55912)
+ * @group Database
+ */
+ public function testMessageParamTypes() {
+ $lang = Language::factory( 'en' );
+
+ $msg = new RawMessage( '$1' );
+ $this->assertEquals(
+ $lang->formatNum( 123456.789 ),
+ $msg->inLanguage( $lang )->numParams( 123456.789 )->plain(),
+ 'numParams is handled correctly'
+ );
+
+ $msg = new RawMessage( '$1' );
+ $this->assertEquals(
+ $lang->formatDuration( 1234 ),
+ $msg->inLanguage( $lang )->durationParams( 1234 )->plain(),
+ 'durationParams is handled correctly'
+ );
+
+ $msg = new RawMessage( '$1' );
+ $this->assertEquals(
+ $lang->formatExpiry( wfTimestampNow() ),
+ $msg->inLanguage( $lang )->expiryParams( wfTimestampNow() )->plain(),
+ 'expiryParams is handled correctly'
+ );
+
+ $msg = new RawMessage( '$1' );
+ $this->assertEquals(
+ $lang->formatTimePeriod( 1234 ),
+ $msg->inLanguage( $lang )->timeperiodParams( 1234 )->plain(),
+ 'timeperiodParams is handled correctly'
+ );
+
+ $msg = new RawMessage( '$1' );
+ $this->assertEquals(
+ $lang->formatSize( 123456 ),
+ $msg->inLanguage( $lang )->sizeParams( 123456 )->plain(),
+ 'sizeParams is handled correctly'
+ );
+
+ $msg = new RawMessage( '$1' );
+ $this->assertEquals(
+ $lang->formatBitrate( 123456 ),
+ $msg->inLanguage( $lang )->bitrateParams( 123456 )->plain(),
+ 'bitrateParams is handled correctly'
+ );
+ }
+
+ public function testInContentLanguageDisabled() {
+ $this->setMwGlobals( 'wgLang', Language::factory( 'fr' ) );
$this->assertEquals( 'Main Page', wfMessage( 'mainpage' )->inContentLanguage()->plain(), 'ForceUIMsg disabled' );
- $wgForceUIMsgAsContentMsg['testInContentLanguage'] = 'mainpage';
+ }
+
+ public function testInContentLanguageEnabled() {
+ $this->setMwGlobals( array(
+ 'wgLang' => Language::factory( 'fr' ),
+ 'wgForceUIMsgAsContentMsg' => array( 'mainpage' ),
+ ) );
+
$this->assertEquals( 'Accueil', wfMessage( 'mainpage' )->inContentLanguage()->plain(), 'ForceUIMsg enabled' );
}
/**
* @expectedException MWException
*/
- function testInLanguageThrows() {
+ public function testInLanguageThrows() {
wfMessage( 'foo' )->inLanguage( 123 );
}
}
diff --git a/tests/phpunit/includes/OutputPageTest.php b/tests/phpunit/includes/OutputPageTest.php
index 4084fb17..56bb0fce 100644
--- a/tests/phpunit/includes/OutputPageTest.php
+++ b/tests/phpunit/includes/OutputPageTest.php
@@ -19,7 +19,6 @@ class OutputPageTest extends MediaWikiTestCase {
*
* options['printableQuery'] - value of query string for printable, or omitted for none
* options['handheldQuery'] - value of query string for handheld, or omitted for none
- * options['handheldForIPhone'] - value of the $wgHandheldForIPhone global
* options['media'] - passed into the method under the same name
* options['expectedReturn'] - expected return value
* options['message'] - PHPUnit message for assertion
@@ -39,7 +38,6 @@ class OutputPageTest extends MediaWikiTestCase {
$fauxRequest = new FauxRequest( $queryData, false );
$this->setMWGlobals( array(
'wgRequest' => $fauxRequest,
- 'wgHandheldForIPhone' => $args['handheldForIPhone']
) );
$actualReturn = OutputPage::transformCssMedia( $args['media'] );
@@ -47,50 +45,31 @@ class OutputPageTest extends MediaWikiTestCase {
}
/**
- * Tests a case of transformCssMedia with both values of wgHandheldForIPhone.
- * Used to verify that behavior is orthogonal to that option.
- *
- * If the value of wgHandheldForIPhone should matter, use assertTransformCssMediaCase.
- *
- * @param array $args key-value array of arguments as shown in assertTransformCssMediaCase.
- * Will be mutated.
- */
- protected function assertTransformCssMediaCaseWithBothHandheldForIPhone( $args ) {
- $message = $args['message'];
- foreach ( array( true, false ) as $handheldForIPhone ) {
- $args['handheldForIPhone'] = $handheldForIPhone;
- $stringHandheldForIPhone = var_export( $handheldForIPhone, true );
- $args['message'] = "$message. \$wgHandheldForIPhone was $stringHandheldForIPhone";
- $this->assertTransformCssMediaCase( $args );
- }
- }
-
- /**
* Tests print requests
*/
public function testPrintRequests() {
- $this->assertTransformCssMediaCaseWithBothHandheldForIPhone( array(
+ $this->assertTransformCssMediaCase( array(
'printableQuery' => '1',
'media' => 'screen',
'expectedReturn' => null,
'message' => 'On printable request, screen returns null'
) );
- $this->assertTransformCssMediaCaseWithBothHandheldForIPhone( array(
+ $this->assertTransformCssMediaCase( array(
'printableQuery' => '1',
'media' => self::SCREEN_MEDIA_QUERY,
'expectedReturn' => null,
'message' => 'On printable request, screen media query returns null'
) );
- $this->assertTransformCssMediaCaseWithBothHandheldForIPhone( array(
+ $this->assertTransformCssMediaCase( array(
'printableQuery' => '1',
'media' => self::SCREEN_ONLY_MEDIA_QUERY,
'expectedReturn' => null,
'message' => 'On printable request, screen media query with only returns null'
) );
- $this->assertTransformCssMediaCaseWithBothHandheldForIPhone( array(
+ $this->assertTransformCssMediaCase( array(
'printableQuery' => '1',
'media' => 'print',
'expectedReturn' => '',
@@ -103,25 +82,30 @@ class OutputPageTest extends MediaWikiTestCase {
*/
public function testScreenRequests() {
$this->assertTransformCssMediaCase( array(
- 'handheldForIPhone' => false,
'media' => 'screen',
'expectedReturn' => 'screen',
- 'message' => 'On screen request, with handheldForIPhone false, screen media type is preserved'
+ 'message' => 'On screen request, screen media type is preserved'
+ ) );
+
+ $this->assertTransformCssMediaCase( array(
+ 'media' => 'handheld',
+ 'expectedReturn' => 'handheld',
+ 'message' => 'On screen request, handheld media type is preserved'
) );
- $this->assertTransformCssMediaCaseWithBothHandheldForIPhone( array(
+ $this->assertTransformCssMediaCase( array(
'media' => self::SCREEN_MEDIA_QUERY,
'expectedReturn' => self::SCREEN_MEDIA_QUERY,
'message' => 'On screen request, screen media query is preserved.'
) );
- $this->assertTransformCssMediaCaseWithBothHandheldForIPhone( array(
+ $this->assertTransformCssMediaCase( array(
'media' => self::SCREEN_ONLY_MEDIA_QUERY,
'expectedReturn' => self::SCREEN_ONLY_MEDIA_QUERY,
'message' => 'On screen request, screen media query with only is preserved.'
) );
- $this->assertTransformCssMediaCaseWithBothHandheldForIPhone( array(
+ $this->assertTransformCssMediaCase( array(
'media' => 'print',
'expectedReturn' => 'print',
'message' => 'On screen request, print media type is preserved'
@@ -129,44 +113,21 @@ class OutputPageTest extends MediaWikiTestCase {
}
/**
- * Tests handheld and wgHandheldForIPhone behavior
+ * Tests handheld behavior
*/
public function testHandheld() {
- $this->assertTransformCssMediaCaseWithBothHandheldForIPhone( array(
+ $this->assertTransformCssMediaCase( array(
'handheldQuery' => '1',
'media' => 'handheld',
'expectedReturn' => '',
'message' => 'On request with handheld querystring and media is handheld, returns empty string'
) );
- $this->assertTransformCssMediaCaseWithBothHandheldForIPhone( array(
+ $this->assertTransformCssMediaCase( array(
'handheldQuery' => '1',
'media' => 'screen',
'expectedReturn' => null,
'message' => 'On request with handheld querystring and media is screen, returns null'
) );
-
- // A bit counter-intuitively, $wgHandheldForIPhone should only matter if the query handheld is false or omitted
- $this->assertTransformCssMediaCase( array(
- 'handheldQuery' => '0',
- 'media' => 'screen',
- 'handheldForIPhone' => true,
- 'expectedReturn' => 'screen and (min-device-width: 481px)',
- 'message' => 'With $wgHandheldForIPhone true, screen media type is transformed'
- ) );
-
- $this->assertTransformCssMediaCase( array(
- 'media' => 'handheld',
- 'handheldForIPhone' => true,
- 'expectedReturn' => 'handheld, only screen and (max-device-width: 480px)',
- 'message' => 'With $wgHandheldForIPhone true, handheld media type is transformed'
- ) );
-
- $this->assertTransformCssMediaCase( array(
- 'media' => 'handheld',
- 'handheldForIPhone' => false,
- 'expectedReturn' => 'handheld',
- 'message' => 'With $wgHandheldForIPhone false, handheld media type is preserved'
- ) );
}
}
diff --git a/tests/phpunit/includes/PathRouterTest.php b/tests/phpunit/includes/PathRouterTest.php
index 22591873..adfb215a 100644
--- a/tests/phpunit/includes/PathRouterTest.php
+++ b/tests/phpunit/includes/PathRouterTest.php
@@ -1,10 +1,17 @@
<?php
/**
- * Tests for the PathRouter parsing
+ * Tests for the PathRouter parsing.
+ *
+ * @todo Add covers tags.
*/
class PathRouterTest extends MediaWikiTestCase {
+ /**
+ * @var PathRouter
+ */
+ protected $basicRouter;
+
protected function setUp() {
parent::setUp();
$router = new PathRouter;
@@ -151,18 +158,20 @@ class PathRouterTest extends MediaWikiTestCase {
$router->add( array( 'qwerty' => "/qwerty/$1" ), array( 'qwerty' => '$key' ) );
$router->add( "/$2/$1", array( 'restricted-to-y' => '$2' ), array( '$2' => 'y' ) );
- foreach ( array(
- '/Foo' => array( 'title' => 'Foo' ),
- '/Bar' => array( 'ping' => 'pong' ),
- '/Baz' => array( 'marco' => 'polo' ),
- '/asdf-foo' => array( 'title' => 'qwerty-foo' ),
- '/qwerty-bar' => array( 'title' => 'asdf-bar' ),
- '/a/Foo' => array( 'title' => 'Foo' ),
- '/asdf/Foo' => array( 'title' => 'Foo' ),
- '/qwerty/Foo' => array( 'title' => 'Foo', 'qwerty' => 'qwerty' ),
- '/baz/Foo' => array( 'title' => 'Foo', 'unrestricted' => 'baz' ),
- '/y/Foo' => array( 'title' => 'Foo', 'restricted-to-y' => 'y' ),
- ) as $path => $result ) {
+ foreach (
+ array(
+ '/Foo' => array( 'title' => 'Foo' ),
+ '/Bar' => array( 'ping' => 'pong' ),
+ '/Baz' => array( 'marco' => 'polo' ),
+ '/asdf-foo' => array( 'title' => 'qwerty-foo' ),
+ '/qwerty-bar' => array( 'title' => 'asdf-bar' ),
+ '/a/Foo' => array( 'title' => 'Foo' ),
+ '/asdf/Foo' => array( 'title' => 'Foo' ),
+ '/qwerty/Foo' => array( 'title' => 'Foo', 'qwerty' => 'qwerty' ),
+ '/baz/Foo' => array( 'title' => 'Foo', 'unrestricted' => 'baz' ),
+ '/y/Foo' => array( 'title' => 'Foo', 'restricted-to-y' => 'y' ),
+ ) as $path => $result
+ ) {
$this->assertEquals( $router->parse( $path ), $result );
}
}
@@ -251,5 +260,4 @@ class PathRouterTest extends MediaWikiTestCase {
$matches = $router->parse( "/wiki/Foo" );
$this->assertEquals( $matches, array( 'title' => 'bar%20$1' ) );
}
-
}
diff --git a/tests/phpunit/includes/PreferencesTest.php b/tests/phpunit/includes/PreferencesTest.php
index 7aa3c4a4..3dec2da0 100644
--- a/tests/phpunit/includes/PreferencesTest.php
+++ b/tests/phpunit/includes/PreferencesTest.php
@@ -4,11 +4,16 @@
* @group Database
*/
class PreferencesTest extends MediaWikiTestCase {
- /** Array of User objects */
+ /**
+ * @var User[]
+ */
private $prefUsers;
+ /**
+ * @var RequestContext
+ */
private $context;
- function __construct() {
+ public function __construct() {
parent::__construct();
$this->prefUsers['noemail'] = new User;
@@ -30,14 +35,17 @@ class PreferencesTest extends MediaWikiTestCase {
protected function setUp() {
parent::setUp();
- $this->setMwGlobals( 'wgEnableEmail', true );
+ $this->setMwGlobals( array(
+ 'wgEnableEmail' => true,
+ 'wgEmailAuthentication' => true,
+ ) );
}
/**
* Placeholder to verify bug 34302
* @covers Preferences::profilePreferences
*/
- function testEmailFieldsWhenUserHasNoEmail() {
+ public function testEmailFieldsWhenUserHasNoEmail() {
$prefs = $this->prefsFor( 'noemail' );
$this->assertArrayHasKey( 'cssclass',
$prefs['emailaddress']
@@ -49,7 +57,7 @@ class PreferencesTest extends MediaWikiTestCase {
* Placeholder to verify bug 34302
* @covers Preferences::profilePreferences
*/
- function testEmailFieldsWhenUserEmailNotAuthenticated() {
+ public function testEmailFieldsWhenUserEmailNotAuthenticated() {
$prefs = $this->prefsFor( 'notauth' );
$this->assertArrayHasKey( 'cssclass',
$prefs['emailaddress']
@@ -61,7 +69,7 @@ class PreferencesTest extends MediaWikiTestCase {
* Placeholder to verify bug 34302
* @covers Preferences::profilePreferences
*/
- function testEmailFieldsWhenUserEmailIsAuthenticated() {
+ public function testEmailFieldsWhenUserEmailIsAuthenticated() {
$prefs = $this->prefsFor( 'auth' );
$this->assertArrayHasKey( 'cssclass',
$prefs['emailaddress']
@@ -70,13 +78,14 @@ class PreferencesTest extends MediaWikiTestCase {
}
/** Helper */
- function prefsFor( $user_key ) {
+ protected function prefsFor( $user_key ) {
$preferences = array();
Preferences::profilePreferences(
$this->prefUsers[$user_key]
, $this->context
, $preferences
);
+
return $preferences;
}
}
diff --git a/tests/phpunit/includes/Providers.php b/tests/phpunit/includes/Providers.php
deleted file mode 100644
index 948b6354..00000000
--- a/tests/phpunit/includes/Providers.php
+++ /dev/null
@@ -1,44 +0,0 @@
-<?php
-/**
- * Generic providers for the MediaWiki PHPUnit test suite
- *
- * @author Antoine Musso
- * @copyright Copyright © 2011, Antoine Musso
- * @file
- */
-
-/** */
-class MediaWikiProvide {
-
- /* provide an array of numbers from 1 up to @param $num */
- private static function createProviderUpTo( $num ) {
- $ret = array();
- for ( $i = 1; $i <= $num; $i++ ) {
- $ret[] = array( $i );
- }
- return $ret;
- }
-
- /* array of months numbers (as an integer) */
- public static function Months() {
- return self::createProviderUpTo( 12 );
- }
-
- /* array of days numbers (as an integer) */
- public static function Days() {
- return self::createProviderUpTo( 31 );
- }
-
- public static function DaysMonths() {
- $ret = array();
-
- $months = self::Months();
- $days = self::Days();
- foreach ( $months as $month ) {
- foreach ( $days as $day ) {
- $ret[] = array( $day[0], $month[0] );
- }
- }
- return $ret;
- }
-}
diff --git a/tests/phpunit/includes/RecentChangeTest.php b/tests/phpunit/includes/RecentChangeTest.php
index a1e62363..cfa3e777 100644
--- a/tests/phpunit/includes/RecentChangeTest.php
+++ b/tests/phpunit/includes/RecentChangeTest.php
@@ -9,7 +9,7 @@ class RecentChangeTest extends MediaWikiTestCase {
protected $user_comment;
protected $context;
- function __construct() {
+ public function __construct() {
parent::__construct();
$this->title = Title::newFromText( 'SomeTitle' );
@@ -56,7 +56,7 @@ class RecentChangeTest extends MediaWikiTestCase {
/**
* @covers LogFormatter::getIRCActionText
*/
- function testIrcMsgForLogTypeBlock() {
+ public function testIrcMsgForLogTypeBlock() {
$sep = $this->context->msg( 'colon-separator' )->text();
# block/block
@@ -78,7 +78,7 @@ class RecentChangeTest extends MediaWikiTestCase {
/**
* @covers LogFormatter::getIRCActionText
*/
- function testIrcMsgForLogTypeDelete() {
+ public function testIrcMsgForLogTypeDelete() {
$sep = $this->context->msg( 'colon-separator' )->text();
# delete/delete
@@ -101,7 +101,7 @@ class RecentChangeTest extends MediaWikiTestCase {
/**
* @covers LogFormatter::getIRCActionText
*/
- function testIrcMsgForLogTypeNewusers() {
+ public function testIrcMsgForLogTypeNewusers() {
$this->assertIRCComment(
'New user account',
'newusers', 'newusers',
@@ -127,7 +127,7 @@ class RecentChangeTest extends MediaWikiTestCase {
/**
* @covers LogFormatter::getIRCActionText
*/
- function testIrcMsgForLogTypeMove() {
+ public function testIrcMsgForLogTypeMove() {
$move_params = array(
'4::target' => $this->target->getPrefixedText(),
'5::noredir' => 0,
@@ -154,7 +154,7 @@ class RecentChangeTest extends MediaWikiTestCase {
/**
* @covers LogFormatter::getIRCActionText
*/
- function testIrcMsgForLogTypePatrol() {
+ public function testIrcMsgForLogTypePatrol() {
# patrol/patrol
$this->assertIRCComment(
$this->context->msg( 'patrol-log-line', 'revision 777', '[[SomeTitle]]', '' )->plain(),
@@ -170,7 +170,7 @@ class RecentChangeTest extends MediaWikiTestCase {
/**
* @covers LogFormatter::getIRCActionText
*/
- function testIrcMsgForLogTypeProtect() {
+ public function testIrcMsgForLogTypeProtect() {
$protectParams = array(
'[edit=sysop] (indefinite) ‎[move=sysop] (indefinite)'
);
@@ -204,7 +204,7 @@ class RecentChangeTest extends MediaWikiTestCase {
/**
* @covers LogFormatter::getIRCActionText
*/
- function testIrcMsgForLogTypeUpload() {
+ public function testIrcMsgForLogTypeUpload() {
$sep = $this->context->msg( 'colon-separator' )->text();
# upload/upload
@@ -225,24 +225,24 @@ class RecentChangeTest extends MediaWikiTestCase {
}
/**
- * @todo: Emulate these edits somehow and extract
+ * @todo Emulate these edits somehow and extract
* raw edit summary from RecentChange object
* --
*/
/*
- function testIrcMsgForBlankingAES() {
+ public function testIrcMsgForBlankingAES() {
// $this->context->msg( 'autosumm-blank', .. );
}
- function testIrcMsgForReplaceAES() {
+ public function testIrcMsgForReplaceAES() {
// $this->context->msg( 'autosumm-replace', .. );
}
- function testIrcMsgForRollbackAES() {
+ public function testIrcMsgForRollbackAES() {
// $this->context->msg( 'revertpage', .. );
}
- function testIrcMsgForUndoAES() {
+ public function testIrcMsgForUndoAES() {
// $this->context->msg( 'undo-summary', .. );
}
*/
@@ -251,10 +251,11 @@ class RecentChangeTest extends MediaWikiTestCase {
* @param $expected String Expected IRC text without colors codes
* @param $type String Log type (move, delete, suppress, patrol ...)
* @param $action String A log type action
+ * @param $params
* @param $comment String (optional) A comment for the log action
* @param $msg String (optional) A message for PHPUnit :-)
*/
- function assertIRCComment( $expected, $type, $action, $params, $comment = null, $msg = '' ) {
+ protected function assertIRCComment( $expected, $type, $action, $params, $comment = null, $msg = '' ) {
$logEntry = new ManualLogEntry( $type, $action );
$logEntry->setPerformer( $this->user );
@@ -267,8 +268,8 @@ class RecentChangeTest extends MediaWikiTestCase {
$formatter = LogFormatter::newFromEntry( $logEntry );
$formatter->setContext( $this->context );
- // Apply the same transformation as done in RecentChange::getIRCLine for rc_comment
- $ircRcComment = RecentChange::cleanupForIRC( $formatter->getIRCActionComment() );
+ // Apply the same transformation as done in IRCColourfulRCFeedFormatter::getLine for rc_comment
+ $ircRcComment = IRCColourfulRCFeedFormatter::cleanupForIRC( $formatter->getIRCActionComment() );
$this->assertEquals(
$expected,
@@ -276,5 +277,4 @@ class RecentChangeTest extends MediaWikiTestCase {
$msg
);
}
-
}
diff --git a/tests/phpunit/includes/RequestContextTest.php b/tests/phpunit/includes/RequestContextTest.php
index f5871716..1776b5d5 100644
--- a/tests/phpunit/includes/RequestContextTest.php
+++ b/tests/phpunit/includes/RequestContextTest.php
@@ -7,6 +7,8 @@ class RequestContextTest extends MediaWikiTestCase {
/**
* Test the relationship between title and wikipage in RequestContext
+ * @covers RequestContext::getWikiPage
+ * @covers RequestContext::getTitle
*/
public function testWikiPageTitle() {
$context = new RequestContext();
@@ -25,9 +27,11 @@ class RequestContextTest extends MediaWikiTestCase {
$context->setTitle( $curTitle );
$this->assertTrue( $curTitle->equals( $context->getWikiPage()->getTitle() ),
"When a title is updated the WikiPage should be purged and recreated on-demand with the new title." );
-
}
+ /**
+ * @covers RequestContext::importScopedSession
+ */
public function testImportScopedSession() {
$context = RequestContext::getMain();
@@ -58,7 +62,7 @@ class RequestContextTest extends MediaWikiTestCase {
$this->assertEquals( $sinfo['userId'], $context->getUser()->getId(), "Correct context user ID." );
$this->assertEquals( 'UnitTestContextUser', $context->getUser()->getName(), "Correct context user name." );
- unset ( $sc ); // restore previous context
+ unset( $sc ); // restore previous context
$info = $context->exportSession();
$this->assertEquals( $oInfo['ip'], $info['ip'], "Correct initial IP address." );
diff --git a/tests/phpunit/includes/ResourceLoaderTest.php b/tests/phpunit/includes/ResourceLoaderTest.php
index 60618b10..ca8b2b6e 100644
--- a/tests/phpunit/includes/ResourceLoaderTest.php
+++ b/tests/phpunit/includes/ResourceLoaderTest.php
@@ -4,6 +4,32 @@ class ResourceLoaderTest extends MediaWikiTestCase {
protected static $resourceLoaderRegisterModulesHook;
+ protected function setUp() {
+ parent::setUp();
+
+ // $wgResourceLoaderLESSFunctions, $wgResourceLoaderLESSImportPaths; $wgResourceLoaderLESSVars;
+
+ $this->setMwGlobals( array(
+ 'wgResourceLoaderLESSFunctions' => array(
+ 'test-sum' => function ( $frame, $less ) {
+ $sum = 0;
+ foreach ( $frame[2] as $arg ) {
+ $sum += (int)$arg[1];
+ }
+ return $sum;
+ },
+ ),
+ 'wgResourceLoaderLESSImportPaths' => array(
+ dirname( __DIR__ ) . '/data/less/common',
+ ),
+ 'wgResourceLoaderLESSVars' => array(
+ 'foo' => '2px',
+ 'Foo' => '#eeeeee',
+ 'bar' => 5,
+ ),
+ ) );
+ }
+
/* Hook Methods */
/**
@@ -11,6 +37,7 @@ class ResourceLoaderTest extends MediaWikiTestCase {
*/
public static function resourceLoaderRegisterModules( &$resourceLoader ) {
self::$resourceLoaderRegisterModulesHook = true;
+
return true;
}
@@ -21,6 +48,14 @@ class ResourceLoaderTest extends MediaWikiTestCase {
);
}
+ public static function provideResourceLoaderContext() {
+ $resourceLoader = new ResourceLoader();
+ $request = new FauxRequest();
+ return array(
+ array( new ResourceLoaderContext( $resourceLoader, $request ) ),
+ );
+ }
+
/* Test Methods */
/**
@@ -31,6 +66,7 @@ class ResourceLoaderTest extends MediaWikiTestCase {
self::$resourceLoaderRegisterModulesHook = false;
$resourceLoader = new ResourceLoader();
$this->assertTrue( self::$resourceLoaderRegisterModulesHook );
+
return $resourceLoader;
}
@@ -48,7 +84,22 @@ class ResourceLoaderTest extends MediaWikiTestCase {
}
/**
+ * @dataProvider provideResourceLoaderContext
+ * @covers ResourceLoaderFileModule::compileLessFile
+ */
+ public function testLessFileCompilation( $context ) {
+ $basePath = __DIR__ . '/../data/less/module';
+ $module = new ResourceLoaderFileModule( array(
+ 'localBasePath' => $basePath,
+ 'styles' => array( 'styles.less' ),
+ ) );
+ $styles = $module->getStyles( $context );
+ $this->assertStringEqualsFile( $basePath . '/styles.css', $styles['all'] );
+ }
+
+ /**
* @dataProvider providePackedModules
+ * @covers ResourceLoader::makePackedModulesString
*/
public function testMakePackedModulesString( $desc, $modules, $packed ) {
$this->assertEquals( $packed, ResourceLoader::makePackedModulesString( $modules ), $desc );
@@ -56,6 +107,7 @@ class ResourceLoaderTest extends MediaWikiTestCase {
/**
* @dataProvider providePackedModules
+ * @covers ResourceLoaderContext::expandModuleNames
*/
public function testexpandModuleNames( $desc, $modules, $packed ) {
$this->assertEquals( $modules, ResourceLoaderContext::expandModuleNames( $packed ), $desc );
@@ -77,14 +129,20 @@ class ResourceLoaderTest extends MediaWikiTestCase {
'Regression fixed in r88706 with dotless names',
array( 'foo', 'bar', 'baz' ),
'foo,bar,baz',
- )
+ ),
+ array(
+ 'Prefixless modules after a prefixed module',
+ array( 'single.module', 'foobar', 'foobaz' ),
+ 'single.module|foobar,foobaz',
+ ),
);
}
}
/* Stubs */
-class ResourceLoaderTestModule extends ResourceLoaderModule {}
+class ResourceLoaderTestModule extends ResourceLoaderModule {
+}
/* Hooks */
global $wgHooks;
diff --git a/tests/phpunit/includes/RevisionStorageTest.php b/tests/phpunit/includes/RevisionStorageTest.php
index e8d8db0a..e17c7b0f 100644
--- a/tests/phpunit/includes/RevisionStorageTest.php
+++ b/tests/phpunit/includes/RevisionStorageTest.php
@@ -17,7 +17,7 @@ class RevisionStorageTest extends MediaWikiTestCase {
*/
var $the_page;
- function __construct( $name = null, array $data = array(), $dataName = '' ) {
+ function __construct( $name = null, array $data = array(), $dataName = '' ) {
parent::__construct( $name, $data, $dataName );
$this->tablesUsed = array_merge( $this->tablesUsed,
@@ -38,7 +38,7 @@ class RevisionStorageTest extends MediaWikiTestCase {
'iwlinks' ) );
}
- public function setUp() {
+ protected function setUp() {
global $wgExtraNamespaces, $wgNamespaceContentModels, $wgContentHandlers, $wgContLang;
parent::setUp();
@@ -365,7 +365,7 @@ class RevisionStorageTest extends MediaWikiTestCase {
$page = $this->createPage( 'RevisionStorageTest_testIsCurrent', 'Lorem Ipsum', CONTENT_MODEL_WIKITEXT );
$rev1 = $page->getRevision();
- # @todo: find out if this should be true
+ # @todo find out if this should be true
# $this->assertTrue( $rev1->isCurrent() );
$rev1x = Revision::newFromId( $rev1->getId() );
@@ -374,7 +374,7 @@ class RevisionStorageTest extends MediaWikiTestCase {
$page->doEditContent( ContentHandler::makeContent( 'Bla bla', $page->getTitle(), CONTENT_MODEL_WIKITEXT ), 'second rev' );
$rev2 = $page->getRevision();
- # @todo: find out if this should be true
+ # @todo find out if this should be true
# $this->assertTrue( $rev2->isCurrent() );
$rev1x = Revision::newFromId( $rev1->getId() );
@@ -456,15 +456,15 @@ class RevisionStorageTest extends MediaWikiTestCase {
* @dataProvider provideUserWasLastToEdit
*/
public function testUserWasLastToEdit( $sinceIdx, $expectedLast ) {
- $userA = \User::newFromName( "RevisionStorageTest_userA" );
- $userB = \User::newFromName( "RevisionStorageTest_userB" );
+ $userA = User::newFromName( "RevisionStorageTest_userA" );
+ $userB = User::newFromName( "RevisionStorageTest_userB" );
if ( $userA->getId() === 0 ) {
- $userA = \User::createNew( $userA->getName() );
+ $userA = User::createNew( $userA->getName() );
}
if ( $userB->getId() === 0 ) {
- $userB = \User::createNew( $userB->getName() );
+ $userB = User::createNew( $userB->getName() );
}
$ns = $this->getDefaultWikitextNS();
diff --git a/tests/phpunit/includes/RevisionStorageTest_ContentHandlerUseDB.php b/tests/phpunit/includes/RevisionStorageTest_ContentHandlerUseDB.php
index 3948e345..4e83e355 100644
--- a/tests/phpunit/includes/RevisionStorageTest_ContentHandlerUseDB.php
+++ b/tests/phpunit/includes/RevisionStorageTest_ContentHandlerUseDB.php
@@ -6,14 +6,9 @@
* ^--- important, causes temporary tables to be used instead of the real database
*/
class RevisionTest_ContentHandlerUseDB extends RevisionStorageTest {
- var $saveContentHandlerNoDB = null;
- function setUp() {
- global $wgContentHandlerUseDB;
-
- $this->saveContentHandlerNoDB = $wgContentHandlerUseDB;
-
- $wgContentHandlerUseDB = false;
+ protected function setUp() {
+ $this->setMwGlobals( 'wgContentHandlerUseDB', false );
$dbw = wfGetDB( DB_MASTER );
@@ -32,14 +27,6 @@ class RevisionTest_ContentHandlerUseDB extends RevisionStorageTest {
parent::setUp();
}
- function tearDown() {
- global $wgContentHandlerUseDB;
-
- parent::tearDown();
-
- $wgContentHandlerUseDB = $this->saveContentHandlerNoDB;
- }
-
/**
* @covers Revision::selectFields
*/
@@ -76,7 +63,7 @@ class RevisionTest_ContentHandlerUseDB extends RevisionStorageTest {
*/
public function testGetContentFormat() {
try {
- //@todo: change this to test failure on using a non-standard (but supported) format
+ // @todo change this to test failure on using a non-standard (but supported) format
// for a content model supported in the given location. As of 1.21, there are
// no alternative formats for any of the standard content models that could be
// used for this though.
@@ -91,5 +78,4 @@ class RevisionTest_ContentHandlerUseDB extends RevisionStorageTest {
$this->assertTrue( true ); // ok
}
}
-
}
diff --git a/tests/phpunit/includes/RevisionTest.php b/tests/phpunit/includes/RevisionTest.php
index db0245b9..b5819ff6 100644
--- a/tests/phpunit/includes/RevisionTest.php
+++ b/tests/phpunit/includes/RevisionTest.php
@@ -54,7 +54,10 @@ class RevisionTest extends MediaWikiTestCase {
parent::tearDown();
}
- function testGetRevisionText() {
+ /**
+ * @covers Revision::getRevisionText
+ */
+ public function testGetRevisionText() {
$row = new stdClass;
$row->old_flags = '';
$row->old_text = 'This is a bunch of revision text.';
@@ -63,7 +66,10 @@ class RevisionTest extends MediaWikiTestCase {
Revision::getRevisionText( $row ) );
}
- function testGetRevisionTextGzip() {
+ /**
+ * @covers Revision::getRevisionText
+ */
+ public function testGetRevisionTextGzip() {
$this->checkPHPExtension( 'zlib' );
$row = new stdClass;
@@ -74,7 +80,10 @@ class RevisionTest extends MediaWikiTestCase {
Revision::getRevisionText( $row ) );
}
- function testGetRevisionTextUtf8Native() {
+ /**
+ * @covers Revision::getRevisionText
+ */
+ public function testGetRevisionTextUtf8Native() {
$row = new stdClass;
$row->old_flags = 'utf-8';
$row->old_text = "Wiki est l'\xc3\xa9cole superieur !";
@@ -84,7 +93,10 @@ class RevisionTest extends MediaWikiTestCase {
Revision::getRevisionText( $row ) );
}
- function testGetRevisionTextUtf8Legacy() {
+ /**
+ * @covers Revision::getRevisionText
+ */
+ public function testGetRevisionTextUtf8Legacy() {
$row = new stdClass;
$row->old_flags = '';
$row->old_text = "Wiki est l'\xe9cole superieur !";
@@ -94,7 +106,10 @@ class RevisionTest extends MediaWikiTestCase {
Revision::getRevisionText( $row ) );
}
- function testGetRevisionTextUtf8NativeGzip() {
+ /**
+ * @covers Revision::getRevisionText
+ */
+ public function testGetRevisionTextUtf8NativeGzip() {
$this->checkPHPExtension( 'zlib' );
$row = new stdClass;
@@ -106,7 +121,10 @@ class RevisionTest extends MediaWikiTestCase {
Revision::getRevisionText( $row ) );
}
- function testGetRevisionTextUtf8LegacyGzip() {
+ /**
+ * @covers Revision::getRevisionText
+ */
+ public function testGetRevisionTextUtf8LegacyGzip() {
$this->checkPHPExtension( 'zlib' );
$row = new stdClass;
@@ -118,7 +136,10 @@ class RevisionTest extends MediaWikiTestCase {
Revision::getRevisionText( $row ) );
}
- function testCompressRevisionTextUtf8() {
+ /**
+ * @covers Revision::compressRevisionText
+ */
+ public function testCompressRevisionTextUtf8() {
$row = new stdClass;
$row->old_text = "Wiki est l'\xc3\xa9cole superieur !";
$row->old_flags = Revision::compressRevisionText( $row->old_text );
@@ -132,11 +153,12 @@ class RevisionTest extends MediaWikiTestCase {
Revision::getRevisionText( $row ), "getRevisionText" );
}
- function testCompressRevisionTextUtf8Gzip() {
+ /**
+ * @covers Revision::compressRevisionText
+ */
+ public function testCompressRevisionTextUtf8Gzip() {
$this->checkPHPExtension( 'zlib' );
-
- global $wgCompressRevisions;
- $wgCompressRevisions = true;
+ $this->setMwGlobals( 'wgCompressRevisions', true );
$row = new stdClass;
$row->old_text = "Wiki est l'\xc3\xa9cole superieur !";
@@ -157,6 +179,8 @@ class RevisionTest extends MediaWikiTestCase {
* @param string $text
* @param string $title
* @param string $model
+ * @param null $format
+ *
* @return Revision
*/
function newTestRevision( $text, $title = "Test", $model = CONTENT_MODEL_WIKITEXT, $format = null ) {
@@ -196,8 +220,9 @@ class RevisionTest extends MediaWikiTestCase {
/**
* @group Database
* @dataProvider dataGetContentModel
+ * @covers Revision::getContentModel
*/
- function testGetContentModel( $text, $title, $model, $format, $expectedModel ) {
+ public function testGetContentModel( $text, $title, $model, $format, $expectedModel ) {
$rev = $this->newTestRevision( $text, $title, $model, $format );
$this->assertEquals( $expectedModel, $rev->getContentModel() );
@@ -216,8 +241,9 @@ class RevisionTest extends MediaWikiTestCase {
/**
* @group Database
* @dataProvider dataGetContentFormat
+ * @covers Revision::getContentFormat
*/
- function testGetContentFormat( $text, $title, $model, $format, $expectedFormat ) {
+ public function testGetContentFormat( $text, $title, $model, $format, $expectedFormat ) {
$rev = $this->newTestRevision( $text, $title, $model, $format );
$this->assertEquals( $expectedFormat, $rev->getContentFormat() );
@@ -235,8 +261,9 @@ class RevisionTest extends MediaWikiTestCase {
/**
* @group Database
* @dataProvider dataGetContentHandler
+ * @covers Revision::getContentHandler
*/
- function testGetContentHandler( $text, $title, $model, $format, $expectedClass ) {
+ public function testGetContentHandler( $text, $title, $model, $format, $expectedClass ) {
$rev = $this->newTestRevision( $text, $title, $model, $format );
$this->assertEquals( $expectedClass, get_class( $rev->getContentHandler() ) );
@@ -254,8 +281,9 @@ class RevisionTest extends MediaWikiTestCase {
/**
* @group Database
* @dataProvider dataGetContent
+ * @covers Revision::getContent
*/
- function testGetContent( $text, $title, $model, $format, $audience, $expectedSerialization ) {
+ public function testGetContent( $text, $title, $model, $format, $audience, $expectedSerialization ) {
$rev = $this->newTestRevision( $text, $title, $model, $format );
$content = $rev->getContent( $audience );
@@ -274,8 +302,9 @@ class RevisionTest extends MediaWikiTestCase {
/**
* @group Database
* @dataProvider dataGetText
+ * @covers Revision::getText
*/
- function testGetText( $text, $title, $model, $format, $audience, $expectedText ) {
+ public function testGetText( $text, $title, $model, $format, $audience, $expectedText ) {
$this->hideDeprecated( 'Revision::getText' );
$rev = $this->newTestRevision( $text, $title, $model, $format );
@@ -286,8 +315,9 @@ class RevisionTest extends MediaWikiTestCase {
/**
* @group Database
* @dataProvider dataGetText
+ * @covers Revision::getRawText
*/
- function testGetRawText( $text, $title, $model, $format, $audience, $expectedText ) {
+ public function testGetRawText( $text, $title, $model, $format, $audience, $expectedText ) {
$this->hideDeprecated( 'Revision::getRawText' );
$rev = $this->newTestRevision( $text, $title, $model, $format );
@@ -330,6 +360,9 @@ class RevisionTest extends MediaWikiTestCase {
$this->assertEquals( $expected_hash, $rev->getSha1() );
}
+ /**
+ * @covers Revision::__construct
+ */
public function testConstructWithText() {
$this->hideDeprecated( "Revision::getText" );
@@ -344,6 +377,9 @@ class RevisionTest extends MediaWikiTestCase {
$this->assertEquals( CONTENT_MODEL_JAVASCRIPT, $rev->getContentModel() );
}
+ /**
+ * @covers Revision::__construct
+ */
public function testConstructWithContent() {
$this->hideDeprecated( "Revision::getText" );
@@ -363,8 +399,9 @@ class RevisionTest extends MediaWikiTestCase {
* Tests whether $rev->getContent() returns a clone when needed.
*
* @group Database
+ * @covers Revision::getContent
*/
- function testGetContentClone() {
+ public function testGetContentClone() {
$content = new RevisionTestModifyableContent( "foo" );
$rev = new Revision(
@@ -396,8 +433,9 @@ class RevisionTest extends MediaWikiTestCase {
* Tests whether $rev->getContent() returns the same object repeatedly if appropriate.
*
* @group Database
+ * @covers Revision::getContent
*/
- function testGetContentUncloned() {
+ public function testGetContentUncloned() {
$rev = $this->newTestRevision( "hello", "testGetContentUncloned_dummy", CONTENT_MODEL_WIKITEXT );
$content = $rev->getContent( Revision::RAW );
$content2 = $rev->getContent( Revision::RAW );
@@ -405,7 +443,6 @@ class RevisionTest extends MediaWikiTestCase {
// for immutable content like wikitext, this should be the same object
$this->assertSame( $content, $content2 );
}
-
}
class RevisionTestModifyableContent extends TextContent {
@@ -424,7 +461,6 @@ class RevisionTestModifyableContent extends TextContent {
public function setText( $text ) {
$this->mText = $text;
}
-
}
class RevisionTestModifyableContentHandler extends TextContentHandler {
diff --git a/tests/phpunit/includes/SampleTest.php b/tests/phpunit/includes/SampleTest.php
index 8a881915..8516a4ce 100644
--- a/tests/phpunit/includes/SampleTest.php
+++ b/tests/phpunit/includes/SampleTest.php
@@ -33,7 +33,7 @@ class TestSample extends MediaWikiLangTestCase {
* "Agile Documentation" at
* http://www.phpunit.de/manual/3.4/en/other-uses-for-tests.html
*/
- function testTitleObjectStringConversion() {
+ public function testTitleObjectStringConversion() {
$title = Title::newFromText( "text" );
$this->assertInstanceOf( 'Title', $title, "Title creation" );
$this->assertEquals( "Text", $title, "Automatic string conversion" );
@@ -98,7 +98,7 @@ class TestSample extends MediaWikiLangTestCase {
* @expectedException MWException object
* See http://www.phpunit.de/manual/3.4/en/appendixes.annotations.html#appendixes.annotations.expectedException
*/
- function testTitleObjectFromObject() {
+ public function testTitleObjectFromObject() {
$title = Title::newFromText( Title::newFromText( "test" ) );
$this->assertEquals( "Test", $title->isLocal() );
}
diff --git a/tests/phpunit/includes/SanitizerTest.php b/tests/phpunit/includes/SanitizerTest.php
index c0ed4a59..81246d33 100644
--- a/tests/phpunit/includes/SanitizerTest.php
+++ b/tests/phpunit/includes/SanitizerTest.php
@@ -1,5 +1,9 @@
<?php
+/**
+ * @todo Tests covering decodeCharReferences can be refactored into a single
+ * method and dataprovider.
+ */
class SanitizerTest extends MediaWikiTestCase {
protected function setUp() {
@@ -8,7 +12,10 @@ class SanitizerTest extends MediaWikiTestCase {
AutoLoader::loadClass( 'Sanitizer' );
}
- function testDecodeNamedEntities() {
+ /**
+ * @covers Sanitizer::decodeCharReferences
+ */
+ public function testDecodeNamedEntities() {
$this->assertEquals(
"\xc3\xa9cole",
Sanitizer::decodeCharReferences( '&eacute;cole' ),
@@ -16,7 +23,10 @@ class SanitizerTest extends MediaWikiTestCase {
);
}
- function testDecodeNumericEntities() {
+ /**
+ * @covers Sanitizer::decodeCharReferences
+ */
+ public function testDecodeNumericEntities() {
$this->assertEquals(
"\xc4\x88io bonas dans l'\xc3\xa9cole!",
Sanitizer::decodeCharReferences( "&#x108;io bonas dans l'&#233;cole!" ),
@@ -24,7 +34,10 @@ class SanitizerTest extends MediaWikiTestCase {
);
}
- function testDecodeMixedEntities() {
+ /**
+ * @covers Sanitizer::decodeCharReferences
+ */
+ public function testDecodeMixedEntities() {
$this->assertEquals(
"\xc4\x88io bonas dans l'\xc3\xa9cole!",
Sanitizer::decodeCharReferences( "&#x108;io bonas dans l'&eacute;cole!" ),
@@ -32,7 +45,10 @@ class SanitizerTest extends MediaWikiTestCase {
);
}
- function testDecodeMixedComplexEntities() {
+ /**
+ * @covers Sanitizer::decodeCharReferences
+ */
+ public function testDecodeMixedComplexEntities() {
$this->assertEquals(
"\xc4\x88io bonas dans l'\xc3\xa9cole! (mais pas &#x108;io dans l'&eacute;cole)",
Sanitizer::decodeCharReferences(
@@ -42,7 +58,10 @@ class SanitizerTest extends MediaWikiTestCase {
);
}
- function testInvalidAmpersand() {
+ /**
+ * @covers Sanitizer::decodeCharReferences
+ */
+ public function testInvalidAmpersand() {
$this->assertEquals(
'a & b',
Sanitizer::decodeCharReferences( 'a & b' ),
@@ -50,7 +69,10 @@ class SanitizerTest extends MediaWikiTestCase {
);
}
- function testInvalidEntities() {
+ /**
+ * @covers Sanitizer::decodeCharReferences
+ */
+ public function testInvalidEntities() {
$this->assertEquals(
'&foo;',
Sanitizer::decodeCharReferences( '&foo;' ),
@@ -58,7 +80,10 @@ class SanitizerTest extends MediaWikiTestCase {
);
}
- function testInvalidNumberedEntities() {
+ /**
+ * @covers Sanitizer::decodeCharReferences
+ */
+ public function testInvalidNumberedEntities() {
$this->assertEquals( UTF8_REPLACEMENT, Sanitizer::decodeCharReferences( "&#88888888888888;" ), 'Invalid numbered entity' );
}
@@ -69,10 +94,8 @@ class SanitizerTest extends MediaWikiTestCase {
* @param String $tag Name of an HTML5 element (ie: 'video')
* @param Boolean $escaped Wheter sanitizer let the tag in or escape it (ie: '&lt;video&gt;')
*/
- function testRemovehtmltagsOnHtml5Tags( $tag, $escaped ) {
+ public function testRemovehtmltagsOnHtml5Tags( $tag, $escaped ) {
$this->setMwGlobals( array(
- # Enable HTML5 mode
- 'wgHtml5' => true,
'wgUseTidy' => false
) );
@@ -90,7 +113,7 @@ class SanitizerTest extends MediaWikiTestCase {
/**
* Provide HTML5 tags
*/
- function provideHtml5Tags() {
+ public static function provideHtml5Tags() {
$ESCAPED = true; # We want tag to be escaped
$VERBATIM = false; # We want to keep the tag
return array(
@@ -101,31 +124,57 @@ class SanitizerTest extends MediaWikiTestCase {
);
}
- function testSelfClosingTag() {
- $this->setMwGlobals( array(
- 'wgUseTidy' => false
- ) );
-
- $this->assertEquals(
- '<div>Hello world</div>',
- Sanitizer::removeHTMLtags( '<div>Hello world</div />' ),
- 'Self-closing closing div'
+ function dataRemoveHTMLtags() {
+ return array(
+ // former testSelfClosingTag
+ array(
+ '<div>Hello world</div />',
+ '<div>Hello world</div>',
+ 'Self-closing closing div'
+ ),
+ // Make sure special nested HTML5 semantics are not broken
+ // http://www.whatwg.org/html/text-level-semantics.html#the-kbd-element
+ array(
+ '<kbd><kbd>Shift</kbd>+<kbd>F3</kbd></kbd>',
+ '<kbd><kbd>Shift</kbd>+<kbd>F3</kbd></kbd>',
+ 'Nested <kbd>.'
+ ),
+ // http://www.whatwg.org/html/text-level-semantics.html#the-sub-and-sup-elements
+ array(
+ '<var>x<sub><var>i</var></sub></var>, <var>y<sub><var>i</var></sub></var>',
+ '<var>x<sub><var>i</var></sub></var>, <var>y<sub><var>i</var></sub></var>',
+ 'Nested <var>.'
+ ),
+ // http://www.whatwg.org/html/text-level-semantics.html#the-dfn-element
+ array(
+ '<dfn><abbr title="Garage Door Opener">GDO</abbr></dfn>',
+ '<dfn><abbr title="Garage Door Opener">GDO</abbr></dfn>',
+ '<abbr> inside <dfn>',
+ ),
);
}
+ /**
+ * @dataProvider dataRemoveHTMLtags
+ * @covers Sanitizer::removeHTMLtags
+ */
+ public function testRemoveHTMLtags( $input, $output, $msg = null ) {
+ $GLOBALS['wgUseTidy'] = false;
+ $this->assertEquals( $output, Sanitizer::removeHTMLtags( $input ), $msg );
+ }
/**
* @dataProvider provideTagAttributesToDecode
* @covers Sanitizer::decodeTagAttributes
*/
- function testDecodeTagAttributes( $expected, $attributes, $message = '' ) {
+ public function testDecodeTagAttributes( $expected, $attributes, $message = '' ) {
$this->assertEquals( $expected,
Sanitizer::decodeTagAttributes( $attributes ),
$message
);
}
- function provideTagAttributesToDecode() {
+ public static function provideTagAttributesToDecode() {
return array(
array( array( 'foo' => 'bar' ), 'foo=bar', 'Unquoted attribute' ),
array( array( 'foo' => 'bar' ), ' foo = bar ', 'Spaced attribute' ),
@@ -148,7 +197,6 @@ class SanitizerTest extends MediaWikiTestCase {
array( array( 'foo.' => 'baz' ), 'foo.=baz', 'A . is allowed as last character' ),
array( array( 'foo6' => 'baz' ), 'foo6=baz', 'Numbers are allowed' ),
-
# This bit is more relaxed than XML rules, but some extensions use
# it, like ProofreadPage (see bug 27539)
array( array( '1foo' => 'baz' ), '1foo=baz', 'Leading numbers are allowed' ),
@@ -167,7 +215,7 @@ class SanitizerTest extends MediaWikiTestCase {
* @dataProvider provideDeprecatedAttributes
* @covers Sanitizer::fixTagAttributes
*/
- function testDeprecatedAttributesUnaltered( $inputAttr, $inputEl, $message = '' ) {
+ public function testDeprecatedAttributesUnaltered( $inputAttr, $inputEl, $message = '' ) {
$this->assertEquals( " $inputAttr",
Sanitizer::fixTagAttributes( $inputAttr, $inputEl ),
$message
@@ -195,7 +243,7 @@ class SanitizerTest extends MediaWikiTestCase {
* @dataProvider provideCssCommentsFixtures
* @covers Sanitizer::checkCss
*/
- function testCssCommentsChecking( $expected, $css, $message = '' ) {
+ public function testCssCommentsChecking( $expected, $css, $message = '' ) {
$this->assertEquals( $expected,
Sanitizer::checkCss( $css ),
$message
@@ -205,10 +253,14 @@ class SanitizerTest extends MediaWikiTestCase {
public static function provideCssCommentsFixtures() {
/** array( <expected>, <css>, [message] ) */
return array(
- array( ' ', '/**/' ),
+ // Valid comments spanning entire input
+ array( '/**/', '/**/' ),
+ array( '/* comment */', '/* comment */' ),
+ // Weird stuff
array( ' ', '/****/' ),
- array( ' ', '/* comment */' ),
- array( ' ', "\\2f\\2a foo \\2a\\2f",
+ array( ' ', '/* /* */' ),
+ array( 'display: block;', "display:/* foo */block;" ),
+ array( 'display: block;', "display:\\2f\\2a foo \\2a\\2f block;",
'Backslash-escaped comments must be stripped (bug 28450)' ),
array( '', '/* unfinished comment structure',
'Remove anything after a comment-start token' ),
@@ -229,7 +281,7 @@ class SanitizerTest extends MediaWikiTestCase {
/**
* Test for support or lack of support for specific attributes in the attribute whitelist.
*/
- function provideAttributeSupport() {
+ public static function provideAttributeSupport() {
/** array( <attributes>, <expected>, <message> ) */
return array(
array( 'div', ' role="presentation"', ' role="presentation"', 'Support for WAI-ARIA\'s role="presentation".' ),
@@ -239,12 +291,12 @@ class SanitizerTest extends MediaWikiTestCase {
/**
* @dataProvider provideAttributeSupport
+ * @covers Sanitizer::fixTagAttributes
*/
- function testAttributeSupport( $tag, $attributes, $expected, $message ) {
+ public function testAttributeSupport( $tag, $attributes, $expected, $message ) {
$this->assertEquals( $expected,
Sanitizer::fixTagAttributes( $attributes, $tag ),
$message
);
}
-
}
diff --git a/tests/phpunit/includes/SanitizerValidateEmailTest.php b/tests/phpunit/includes/SanitizerValidateEmailTest.php
index fe0bc64e..f13e8382 100644
--- a/tests/phpunit/includes/SanitizerValidateEmailTest.php
+++ b/tests/phpunit/includes/SanitizerValidateEmailTest.php
@@ -1,5 +1,10 @@
<?php
+/**
+ * @covers Sanitizer::validateEmail
+ * @TODO all test methods in this class should be refactored and...
+ * use a single test method and a single data provider...
+ */
class SanitizerValidateEmailTest extends MediaWikiTestCase {
private function checkEmail( $addr, $expected = true, $msg = '' ) {
@@ -22,54 +27,56 @@ class SanitizerValidateEmailTest extends MediaWikiTestCase {
$this->checkEmail( $addr, false, $msg );
}
- function testEmailWellKnownUserAtHostDotTldAreValid() {
+ public function testEmailWellKnownUserAtHostDotTldAreValid() {
$this->valid( 'user@example.com' );
$this->valid( 'user@example.museum' );
}
- function testEmailWithUpperCaseCharactersAreValid() {
+ public function testEmailWithUpperCaseCharactersAreValid() {
$this->valid( 'USER@example.com' );
$this->valid( 'user@EXAMPLE.COM' );
$this->valid( 'user@Example.com' );
$this->valid( 'USER@eXAMPLE.com' );
}
- function testEmailWithAPlusInUserName() {
+ public function testEmailWithAPlusInUserName() {
$this->valid( 'user+sub@example.com' );
$this->valid( 'user+@example.com' );
}
- function testEmailDoesNotNeedATopLevelDomain() {
+ public function testEmailDoesNotNeedATopLevelDomain() {
$this->valid( "user@localhost" );
$this->valid( "FooBar@localdomain" );
$this->valid( "nobody@mycompany" );
}
- function testEmailWithWhiteSpacesBeforeOrAfterAreInvalids() {
+ public function testEmailWithWhiteSpacesBeforeOrAfterAreInvalids() {
$this->invalid( " user@host.com" );
$this->invalid( "user@host.com " );
$this->invalid( "\tuser@host.com" );
$this->invalid( "user@host.com\t" );
}
- function testEmailWithWhiteSpacesAreInvalids() {
+ public function testEmailWithWhiteSpacesAreInvalids() {
$this->invalid( "User user@host" );
$this->invalid( "first last@mycompany" );
$this->invalid( "firstlast@my company" );
}
- // bug 26948 : comma were matched by an incorrect regexp range
- function testEmailWithCommasAreInvalids() {
+ /**
+ * bug 26948 : comma were matched by an incorrect regexp range
+ */
+ public function testEmailWithCommasAreInvalids() {
$this->invalid( "user,foo@example.org" );
$this->invalid( "userfoo@ex,ample.org" );
}
- function testEmailWithHyphens() {
+ public function testEmailWithHyphens() {
$this->valid( "user-foo@example.org" );
$this->valid( "userfoo@ex-ample.org" );
}
- function testEmailDomainCanNotBeginWithDot() {
+ public function testEmailDomainCanNotBeginWithDot() {
$this->invalid( "user@." );
$this->invalid( "user@.localdomain" );
$this->invalid( "user@localdomain." );
@@ -78,19 +85,19 @@ class SanitizerValidateEmailTest extends MediaWikiTestCase {
$this->invalid( ".@a............" );
}
- function testEmailWithFunnyCharacters() {
+ public function testEmailWithFunnyCharacters() {
$this->valid( "\$user!ex{this}@123.com" );
}
- function testEmailTopLevelDomainCanBeNumerical() {
+ public function testEmailTopLevelDomainCanBeNumerical() {
$this->valid( "user@example.1234" );
}
- function testEmailWithoutAtSignIsInvalid() {
+ public function testEmailWithoutAtSignIsInvalid() {
$this->invalid( 'useràexample.com' );
}
- function testEmailWithOneCharacterDomainIsValid() {
+ public function testEmailWithOneCharacterDomainIsValid() {
$this->valid( 'user@a' );
}
}
diff --git a/tests/phpunit/includes/SeleniumConfigurationTest.php b/tests/phpunit/includes/SeleniumConfigurationTest.php
deleted file mode 100644
index 3422c90c..00000000
--- a/tests/phpunit/includes/SeleniumConfigurationTest.php
+++ /dev/null
@@ -1,222 +0,0 @@
-<?php
-
-class SeleniumConfigurationTest extends MediaWikiTestCase {
-
- /**
- * The file where the test temporarity stores the selenium config.
- * This should be cleaned up as part of teardown.
- */
- private $tempFileName;
-
- /**
- * String containing the a sample selenium settings
- */
- private $testConfig0 = '
-[SeleniumSettings]
-browsers[firefox] = "*firefox"
-browsers[iexplorer] = "*iexploreproxy"
-browsers[chrome] = "*chrome"
-host = "localhost"
-port = "foobarr"
-wikiUrl = "http://localhost/deployment"
-username = "xxxxxxx"
-userPassword = ""
-testBrowser = "chrome"
-startserver =
-stopserver =
-jUnitLogFile =
-runAgainstGrid = false
-
-[SeleniumTests]
-testSuite[SimpleSeleniumTestSuite] = "tests/selenium/SimpleSeleniumTestSuite.php"
-testSuite[TestSuiteName] = "testSuitePath"
-';
- /**
- * Array of expected browsers from $testConfig0
- */
- private $testBrowsers0 = array( 'firefox' => '*firefox',
- 'iexplorer' => '*iexploreproxy',
- 'chrome' => '*chrome'
- );
- /**
- * Array of expected selenium settings from $testConfig0
- */
- private $testSettings0 = array(
- 'host' => 'localhost',
- 'port' => 'foobarr',
- 'wikiUrl' => 'http://localhost/deployment',
- 'username' => 'xxxxxxx',
- 'userPassword' => '',
- 'testBrowser' => 'chrome',
- 'startserver' => null,
- 'stopserver' => null,
- 'seleniumserverexecpath' => null,
- 'jUnitLogFile' => null,
- 'runAgainstGrid' => null
- );
- /**
- * Array of expected testSuites from $testConfig0
- */
- private $testSuites0 = array(
- 'SimpleSeleniumTestSuite' => 'tests/selenium/SimpleSeleniumTestSuite.php',
- 'TestSuiteName' => 'testSuitePath'
- );
-
- /**
- * Another sample selenium settings file contents
- */
- private $testConfig1 =
- '
-[SeleniumSettings]
-host = "localhost"
-testBrowser = "firefox"
-';
- /**
- * Expected browsers from $testConfig1
- */
- private $testBrowsers1 = null;
- /**
- * Expected selenium settings from $testConfig1
- */
- private $testSettings1 = array(
- 'host' => 'localhost',
- 'port' => null,
- 'wikiUrl' => null,
- 'username' => null,
- 'userPassword' => null,
- 'testBrowser' => 'firefox',
- 'startserver' => null,
- 'stopserver' => null,
- 'seleniumserverexecpath' => null,
- 'jUnitLogFile' => null,
- 'runAgainstGrid' => null
- );
- /**
- * Expected test suites from $testConfig1
- */
- private $testSuites1 = null;
-
-
- protected function setUp() {
- parent::setUp();
- if ( !defined( 'SELENIUMTEST' ) ) {
- define( 'SELENIUMTEST', true );
- }
- }
-
- /**
- * Clean up the temporary file used to store the selenium settings.
- */
- protected function tearDown() {
- if ( strlen( $this->tempFileName ) > 0 ) {
- unlink( $this->tempFileName );
- unset( $this->tempFileName );
- }
- parent::tearDown();
- }
-
- /**
- * @expectedException MWException
- * @group SeleniumFramework
- */
- public function testErrorOnIncorrectConfigFile() {
- $seleniumSettings = array();
- $seleniumBrowsers = array();
- $seleniumTestSuites = array();
-
- SeleniumConfig::getSeleniumSettings( $seleniumSettings,
- $seleniumBrowsers,
- $seleniumTestSuites,
- "Some_fake_settings_file.ini" );
- }
-
- /**
- * @expectedException MWException
- * @group SeleniumFramework
- */
- public function testErrorOnMissingConfigFile() {
- $seleniumSettings = array();
- $seleniumBrowsers = array();
- $seleniumTestSuites = array();
- global $wgSeleniumConfigFile;
- $wgSeleniumConfigFile = '';
- SeleniumConfig::getSeleniumSettings( $seleniumSettings,
- $seleniumBrowsers,
- $seleniumTestSuites );
- }
-
- /**
- * @group SeleniumFramework
- */
- public function testUsesGlobalVarForConfigFile() {
- $seleniumSettings = array();
- $seleniumBrowsers = array();
- $seleniumTestSuites = array();
- global $wgSeleniumConfigFile;
- $this->writeToTempFile( $this->testConfig0 );
- $wgSeleniumConfigFile = $this->tempFileName;
- SeleniumConfig::getSeleniumSettings( $seleniumSettings,
- $seleniumBrowsers,
- $seleniumTestSuites );
- $this->assertEquals( $seleniumSettings, $this->testSettings0,
- 'The selenium settings should have been read from the file defined in $wgSeleniumConfigFile'
- );
- $this->assertEquals( $seleniumBrowsers, $this->testBrowsers0,
- 'The available browsers should have been read from the file defined in $wgSeleniumConfigFile'
- );
- $this->assertEquals( $seleniumTestSuites, $this->testSuites0,
- 'The test suites should have been read from the file defined in $wgSeleniumConfigFile'
- );
- }
-
- /**
- * @group SeleniumFramework
- * @dataProvider sampleConfigs
- */
- public function testgetSeleniumSettings( $sampleConfig, $expectedSettings, $expectedBrowsers, $expectedSuites ) {
- $this->writeToTempFile( $sampleConfig );
- $seleniumSettings = array();
- $seleniumBrowsers = array();
- $seleniumTestSuites = null;
-
- SeleniumConfig::getSeleniumSettings( $seleniumSettings,
- $seleniumBrowsers,
- $seleniumTestSuites,
- $this->tempFileName );
-
- $this->assertEquals( $seleniumSettings, $expectedSettings,
- "The selenium settings for the following test configuration was not retrieved correctly" . $sampleConfig
- );
- $this->assertEquals( $seleniumBrowsers, $expectedBrowsers,
- "The available browsers for the following test configuration was not retrieved correctly" . $sampleConfig
- );
- $this->assertEquals( $seleniumTestSuites, $expectedSuites,
- "The test suites for the following test configuration was not retrieved correctly" . $sampleConfig
- );
- }
-
- /**
- * create a temp file and write text to it.
- * @param $testToWrite the text to write to the temp file
- */
- private function writeToTempFile( $textToWrite ) {
- $this->tempFileName = tempnam( sys_get_temp_dir(), 'test_settings.' );
- $tempFile = fopen( $this->tempFileName, "w" );
- fwrite( $tempFile, $textToWrite );
- fclose( $tempFile );
- }
-
- /**
- * Returns an array containing:
- * The contents of the selenium cingiguration ini file
- * The expected selenium configuration array that getSeleniumSettings should return
- * The expected available browsers array that getSeleniumSettings should return
- * The expected test suites arrya that getSeleniumSettings should return
- */
- public function sampleConfigs() {
- return array(
- array( $this->testConfig0, $this->testSettings0, $this->testBrowsers0, $this->testSuites0 ),
- array( $this->testConfig1, $this->testSettings1, $this->testBrowsers1, $this->testSuites1 )
- );
- }
-}
diff --git a/tests/phpunit/includes/SiteConfigurationTest.php b/tests/phpunit/includes/SiteConfigurationTest.php
index fc7d8d09..053d8a7d 100644
--- a/tests/phpunit/includes/SiteConfigurationTest.php
+++ b/tests/phpunit/includes/SiteConfigurationTest.php
@@ -10,6 +10,7 @@ function getSiteParams( $conf, $wiki ) {
break;
}
}
+
return array(
'suffix' => $site,
'lang' => $lang,
@@ -23,14 +24,18 @@ function getSiteParams( $conf, $wiki ) {
}
class SiteConfigurationTest extends MediaWikiTestCase {
- var $mConf;
+
+ /**
+ * @var SiteConfiguration
+ */
+ protected $mConf;
protected function setUp() {
parent::setUp();
$this->mConf = new SiteConfiguration;
- $this->mConf->suffixes = array( 'wiki' );
+ $this->mConf->suffixes = array( 'wikipedia' => 'wiki' );
$this->mConf->wikis = array( 'enwiki', 'dewiki', 'frwiki' );
$this->mConf->settings = array(
'simple' => array(
@@ -94,7 +99,10 @@ class SiteConfigurationTest extends MediaWikiTestCase {
$GLOBALS['global'] = array( 'global' => 'global' );
}
- function testSiteFromDb() {
+ /**
+ * @covers SiteConfiguration::siteFromDB
+ */
+ public function testSiteFromDb() {
$this->assertEquals(
array( 'wikipedia', 'en' ),
$this->mConf->siteFromDB( 'enwiki' ),
@@ -119,7 +127,10 @@ class SiteConfigurationTest extends MediaWikiTestCase {
);
}
- function testGetLocalDatabases() {
+ /**
+ * @covers SiteConfiguration::getLocalDatabases
+ */
+ public function testGetLocalDatabases() {
$this->assertEquals(
array( 'enwiki', 'dewiki', 'frwiki' ),
$this->mConf->getLocalDatabases(),
@@ -127,7 +138,10 @@ class SiteConfigurationTest extends MediaWikiTestCase {
);
}
- function testGetConfVariables() {
+ /**
+ * @covers SiteConfiguration::get
+ */
+ public function testGetConfVariables() {
$this->assertEquals(
'enwiki',
$this->mConf->get( 'simple', 'enwiki', 'wiki' ),
@@ -239,7 +253,10 @@ class SiteConfigurationTest extends MediaWikiTestCase {
);
}
- function testSiteFromDbWithCallback() {
+ /**
+ * @covers SiteConfiguration::siteFromDB
+ */
+ public function testSiteFromDbWithCallback() {
$this->mConf->siteParamsCallback = 'getSiteParams';
$this->assertEquals(
@@ -259,7 +276,10 @@ class SiteConfigurationTest extends MediaWikiTestCase {
);
}
- function testParameterReplacement() {
+ /**
+ * @covers SiteConfiguration::get
+ */
+ public function testParameterReplacement() {
$this->mConf->siteParamsCallback = 'getSiteParams';
$this->assertEquals(
@@ -289,7 +309,10 @@ class SiteConfigurationTest extends MediaWikiTestCase {
);
}
- function testGetAllGlobals() {
+ /**
+ * @covers SiteConfiguration::getAll
+ */
+ public function testGetAllGlobals() {
$this->mConf->siteParamsCallback = 'getSiteParams';
$getall = array(
diff --git a/tests/phpunit/includes/StringUtilsTest.php b/tests/phpunit/includes/StringUtilsTest.php
index db3d2655..89759e5c 100644
--- a/tests/phpunit/includes/StringUtilsTest.php
+++ b/tests/phpunit/includes/StringUtilsTest.php
@@ -3,13 +3,13 @@
class StringUtilsTest extends MediaWikiTestCase {
/**
- * This test StringUtils::isUtf8 whenever we have mbstring extension
+ * This tests StringUtils::isUtf8 whenever we have the mbstring extension
* loaded.
*
* @covers StringUtils::isUtf8
* @dataProvider provideStringsForIsUtf8Check
*/
- function testIsUtf8WithMbstring( $expected, $string ) {
+ public function testIsUtf8WithMbstring( $expected, $string ) {
if ( !function_exists( 'mb_check_encoding' ) ) {
$this->markTestSkipped( 'Test requires the mbstring PHP extension' );
}
@@ -20,16 +20,16 @@ class StringUtilsTest extends MediaWikiTestCase {
}
/**
- * This test StringUtils::isUtf8 making sure we use the pure PHP
+ * This tests StringUtils::isUtf8 making sure we use the pure PHP
* implementation used as a fallback when mb_check_encoding() is
* not available.
*
* @covers StringUtils::isUtf8
* @dataProvider provideStringsForIsUtf8Check
*/
- function testIsUtf8WithPhpFallbackImplementation( $expected, $string ) {
+ public function testIsUtf8WithPhpFallbackImplementation( $expected, $string ) {
$this->assertEquals( $expected,
- StringUtils::isUtf8( $string, /** disable mbstring: */ true ),
+ StringUtils::isUtf8( $string, /** disable mbstring: */true ),
'Testing string "' . $this->escaped( $string ) . '" with pure PHP implementation'
);
}
@@ -49,6 +49,7 @@ class StringUtilsTest extends MediaWikiTestCase {
$escaped .= $char;
}
}
+
return $escaped;
}
@@ -57,87 +58,90 @@ class StringUtilsTest extends MediaWikiTestCase {
* Markus Kuhn:
* http://www.cl.cam.ac.uk/~mgk25/ucs/examples/UTF-8-test.txt
*/
- function provideStringsForIsUtf8Check() {
+ public static function provideStringsForIsUtf8Check() {
// Expected return values for StringUtils::isUtf8()
$PASS = true;
$FAIL = false;
return array(
- array( $PASS, 'Some ASCII' ),
- array( $PASS, "Euro sign €" ),
-
- # First possible sequences
- array( $PASS, "\x00" ),
- array( $PASS, "\xc2\x80" ),
- array( $PASS, "\xe0\xa0\x80" ),
- array( $PASS, "\xf0\x90\x80\x80" ),
- array( $PASS, "\xf8\x88\x80\x80\x80" ),
- array( $PASS, "\xfc\x84\x80\x80\x80\x80" ),
-
- # Last possible sequence
- array( $PASS, "\x7f" ),
- array( $PASS, "\xdf\xbf" ),
- array( $PASS, "\xef\xbf\xbf" ),
- array( $PASS, "\xf7\xbf\xbf\xbf" ),
- array( $PASS, "\xfb\xbf\xbf\xbf\xbf" ),
- array( $FAIL, "\xfd\xbf\xbf\xbf\xbf\xbf" ),
-
- # boundaries:
- array( $PASS, "\xed\x9f\xbf" ),
- array( $PASS, "\xee\x80\x80" ),
- array( $PASS, "\xef\xbf\xbd" ),
- array( $PASS, "\xf4\x8f\xbf\xbf" ),
- array( $PASS, "\xf4\x90\x80\x80" ),
-
- # Malformed
- array( $FAIL, "\x80" ),
- array( $FAIL, "\xBF" ),
- array( $FAIL, "\x80\xbf" ),
- array( $FAIL, "\x80\xbf\x80" ),
- array( $FAIL, "\x80\xbf\x80\xbf" ),
- array( $FAIL, "\x80\xbf\x80\xbf\x80" ),
- array( $FAIL, "\x80\xbf\x80\xbf\x80\xbf" ),
- array( $FAIL, "\x80\xbf\x80\xbf\x80\xbf\x80" ),
-
- # last byte missing
- array( $FAIL, "\xc0" ),
- array( $FAIL, "\xe0\x80" ),
- array( $FAIL, "\xf0\x80\x80" ),
- array( $FAIL, "\xf8\x80\x80\x80" ),
- array( $FAIL, "\xfc\x80\x80\x80\x80" ),
- array( $FAIL, "\xdf" ),
- array( $FAIL, "\xef\xbf" ),
- array( $FAIL, "\xf7\xbf\xbf" ),
- array( $FAIL, "\xfb\xbf\xbf\xbf" ),
- array( $FAIL, "\xfd\xbf\xbf\xbf\xbf" ),
-
- # impossible bytes
- array( $FAIL, "\xfe" ),
- array( $FAIL, "\xff" ),
- array( $FAIL, "\xfe\xfe\xff\xff" ),
-
- /**
- # The PHP implementation does not handle characters
- # being represented in a form which is too long :(
-
- # overlong sequences
- array( $FAIL, "\xc0\xaf" ),
- array( $FAIL, "\xe0\x80\xaf" ),
- array( $FAIL, "\xf0\x80\x80\xaf" ),
- array( $FAIL, "\xf8\x80\x80\x80\xaf" ),
- array( $FAIL, "\xfc\x80\x80\x80\x80\xaf" ),
-
- # Maximum overlong sequences
- array( $FAIL, "\xc1\xbf" ),
- array( $FAIL, "\xe0\x9f\xbf" ),
- array( $FAIL, "\xf0\x8F\xbf\xbf" ),
- array( $FAIL, "\xf8\x87\xbf\xbf" ),
- array( $FAIL, "\xfc\x83\xbf\xbf\xbf\xbf" ),
- **/
-
- # non characters
- array( $PASS, "\xef\xbf\xbe" ),
- array( $PASS, "\xef\xbf\xbf" ),
+ 'some ASCII' => array( $PASS, 'Some ASCII' ),
+ 'euro sign' => array( $PASS, "Euro sign €" ),
+
+ 'first possible sequence 1 byte' => array( $PASS, "\x00" ),
+ 'first possible sequence 2 bytes' => array( $PASS, "\xc2\x80" ),
+ 'first possible sequence 3 bytes' => array( $PASS, "\xe0\xa0\x80" ),
+ 'first possible sequence 4 bytes' => array( $PASS, "\xf0\x90\x80\x80" ),
+ 'first possible sequence 5 bytes' => array( $FAIL, "\xf8\x88\x80\x80\x80" ),
+ 'first possible sequence 6 bytes' => array( $FAIL, "\xfc\x84\x80\x80\x80\x80" ),
+
+ 'last possible sequence 1 byte' => array( $PASS, "\x7f" ),
+ 'last possible sequence 2 bytes' => array( $PASS, "\xdf\xbf" ),
+ 'last possible sequence 3 bytes' => array( $PASS, "\xef\xbf\xbf" ),
+ 'last possible sequence 4 bytes (U+1FFFFF)' => array( $FAIL, "\xf7\xbf\xbf\xbf" ),
+ 'last possible sequence 5 bytes' => array( $FAIL, "\xfb\xbf\xbf\xbf\xbf" ),
+ 'last possible sequence 6 bytes' => array( $FAIL, "\xfd\xbf\xbf\xbf\xbf\xbf" ),
+
+ 'boundary 1' => array( $PASS, "\xed\x9f\xbf" ),
+ 'boundary 2' => array( $PASS, "\xee\x80\x80" ),
+ 'boundary 3' => array( $PASS, "\xef\xbf\xbd" ),
+ 'boundary 4' => array( $PASS, "\xf2\x80\x80\x80" ),
+ 'boundary 5 (U+FFFFF)' => array( $PASS, "\xf3\xbf\xbf\xbf" ),
+ 'boundary 6 (U+100000)' => array( $PASS, "\xf4\x80\x80\x80" ),
+ 'boundary 7 (U+10FFFF)' => array( $PASS, "\xf4\x8f\xbf\xbf" ),
+ 'boundary 8 (U+110000)' => array( $FAIL, "\xf4\x90\x80\x80" ),
+
+ 'malformed 1' => array( $FAIL, "\x80" ),
+ 'malformed 2' => array( $FAIL, "\xbf" ),
+ 'malformed 3' => array( $FAIL, "\x80\xbf" ),
+ 'malformed 4' => array( $FAIL, "\x80\xbf\x80" ),
+ 'malformed 5' => array( $FAIL, "\x80\xbf\x80\xbf" ),
+ 'malformed 6' => array( $FAIL, "\x80\xbf\x80\xbf\x80" ),
+ 'malformed 7' => array( $FAIL, "\x80\xbf\x80\xbf\x80\xbf" ),
+ 'malformed 8' => array( $FAIL, "\x80\xbf\x80\xbf\x80\xbf\x80" ),
+
+ 'last byte missing 1' => array( $FAIL, "\xc0" ),
+ 'last byte missing 2' => array( $FAIL, "\xe0\x80" ),
+ 'last byte missing 3' => array( $FAIL, "\xf0\x80\x80" ),
+ 'last byte missing 4' => array( $FAIL, "\xf8\x80\x80\x80" ),
+ 'last byte missing 5' => array( $FAIL, "\xfc\x80\x80\x80\x80" ),
+ 'last byte missing 6' => array( $FAIL, "\xdf" ),
+ 'last byte missing 7' => array( $FAIL, "\xef\xbf" ),
+ 'last byte missing 8' => array( $FAIL, "\xf7\xbf\xbf" ),
+ 'last byte missing 9' => array( $FAIL, "\xfb\xbf\xbf\xbf" ),
+ 'last byte missing 10' => array( $FAIL, "\xfd\xbf\xbf\xbf\xbf" ),
+
+ 'extra continuation byte 1' => array( $FAIL, "e\xaf" ),
+ 'extra continuation byte 2' => array( $FAIL, "\xc3\x89\xaf" ),
+ 'extra continuation byte 3' => array( $FAIL, "\xef\xbc\xa5\xaf" ),
+ 'extra continuation byte 4' => array( $FAIL, "\xf0\x9d\x99\xb4\xaf" ),
+
+ 'impossible bytes 1' => array( $FAIL, "\xfe" ),
+ 'impossible bytes 2' => array( $FAIL, "\xff" ),
+ 'impossible bytes 3' => array( $FAIL, "\xfe\xfe\xff\xff" ),
+
+ 'overlong sequences 1' => array( $FAIL, "\xc0\xaf" ),
+ 'overlong sequences 2' => array( $FAIL, "\xc1\xaf" ),
+ 'overlong sequences 3' => array( $FAIL, "\xe0\x80\xaf" ),
+ 'overlong sequences 4' => array( $FAIL, "\xf0\x80\x80\xaf" ),
+ 'overlong sequences 5' => array( $FAIL, "\xf8\x80\x80\x80\xaf" ),
+ 'overlong sequences 6' => array( $FAIL, "\xfc\x80\x80\x80\x80\xaf" ),
+
+ 'maximum overlong sequences 1' => array( $FAIL, "\xc1\xbf" ),
+ 'maximum overlong sequences 2' => array( $FAIL, "\xe0\x9f\xbf" ),
+ 'maximum overlong sequences 3' => array( $FAIL, "\xf0\x8f\xbf\xbf" ),
+ 'maximum overlong sequences 4' => array( $FAIL, "\xf8\x87\xbf\xbf" ),
+ 'maximum overlong sequences 5' => array( $FAIL, "\xfc\x83\xbf\xbf\xbf\xbf" ),
+
+ 'surrogates 1 (U+D799)' => array( $PASS, "\xed\x9f\xbf" ),
+ 'surrogates 2 (U+E000)' => array( $PASS, "\xee\x80\x80" ),
+ 'surrogates 3 (U+D800)' => array( $FAIL, "\xed\xa0\x80" ),
+ 'surrogates 4 (U+DBFF)' => array( $FAIL, "\xed\xaf\xbf" ),
+ 'surrogates 5 (U+DC00)' => array( $FAIL, "\xed\xb0\x80" ),
+ 'surrogates 6 (U+DFFF)' => array( $FAIL, "\xed\xbf\xbf" ),
+ 'surrogates 7 (U+D800 U+DC00)' => array( $FAIL, "\xed\xa0\x80\xed\xb0\x80" ),
+
+ 'noncharacters 1' => array( $PASS, "\xef\xbf\xbe" ),
+ 'noncharacters 2' => array( $PASS, "\xef\xbf\xbf" ),
);
}
}
diff --git a/tests/phpunit/includes/TemplateCategoriesTest.php b/tests/phpunit/includes/TemplateCategoriesTest.php
index a793babb..fb63a564 100644
--- a/tests/phpunit/includes/TemplateCategoriesTest.php
+++ b/tests/phpunit/includes/TemplateCategoriesTest.php
@@ -7,20 +7,37 @@ require __DIR__ . "/../../../maintenance/runJobs.php";
class TemplateCategoriesTest extends MediaWikiLangTestCase {
- function testTemplateCategories() {
+ /**
+ * @covers Title::getParentCategories
+ */
+ public function testTemplateCategories() {
$title = Title::newFromText( "Categorized from template" );
$page = WikiPage::factory( $title );
$user = new User();
$user->mRights = array( 'createpage', 'edit', 'purge' );
- $status = $page->doEditContent( new WikitextContent( '{{Categorising template}}' ), 'Create a page with a template', 0, false, $user );
+ $page->doEditContent(
+ new WikitextContent( '{{Categorising template}}' ),
+ 'Create a page with a template',
+ 0,
+ false,
+ $user
+ );
+
$this->assertEquals(
array()
, $title->getParentCategories()
);
$template = WikiPage::factory( Title::newFromText( 'Template:Categorising template' ) );
- $status = $template->doEditContent( new WikitextContent( '[[Category:Solved bugs]]' ), 'Add a category through a template', 0, false, $user );
+
+ $template->doEditContent(
+ new WikitextContent( '[[Category:Solved bugs]]' ),
+ 'Add a category through a template',
+ 0,
+ false,
+ $user
+ );
// Run the job queue
JobQueueGroup::destroySingletons();
@@ -33,5 +50,4 @@ class TemplateCategoriesTest extends MediaWikiLangTestCase {
, $title->getParentCategories()
);
}
-
}
diff --git a/tests/phpunit/includes/TestUser.php b/tests/phpunit/includes/TestUser.php
index c4d89455..23e65031 100644
--- a/tests/phpunit/includes/TestUser.php
+++ b/tests/phpunit/includes/TestUser.php
@@ -1,6 +1,8 @@
<?php
-/* Wraps the user object, so we can also retain full access to properties like password if we log in via the API */
+/**
+ * Wraps the user object, so we can also retain full access to properties like password if we log in via the API
+ */
class TestUser {
public $username;
public $password;
@@ -8,7 +10,7 @@ class TestUser {
public $groups;
public $user;
- function __construct( $username, $realname = 'Real Name', $email = 'sample@example.com', $groups = array() ) {
+ public function __construct( $username, $realname = 'Real Name', $email = 'sample@example.com', $groups = array() ) {
$this->username = $username;
$this->realname = $realname;
$this->email = $email;
@@ -53,6 +55,5 @@ class TestUser {
}
}
$this->user->saveSettings();
-
}
}
diff --git a/tests/phpunit/includes/TimeAdjustTest.php b/tests/phpunit/includes/TimeAdjustTest.php
index a58702b2..0b368c25 100644
--- a/tests/phpunit/includes/TimeAdjustTest.php
+++ b/tests/phpunit/includes/TimeAdjustTest.php
@@ -4,22 +4,28 @@ class TimeAdjustTest extends MediaWikiLangTestCase {
protected function setUp() {
parent::setUp();
- $this->setMwGlobals( array(
- 'wgLocalTZoffset' => null,
- 'wgContLang' => Language::factory( 'en' ),
- 'wgLanguageCode' => 'en',
- ) );
-
$this->iniSet( 'precision', 15 );
}
- # Test offset usage for a given language::userAdjust
- function testUserAdjust() {
- global $wgLocalTZoffset, $wgContLang;
+ /**
+ * Test offset usage for a given Language::userAdjust
+ * @dataProvider dataUserAdjust
+ * @covers Language::userAdjust
+ */
+ public function testUserAdjust( $date, $localTZoffset, $expected ) {
+ global $wgContLang;
+
+ $this->setMwGlobals( 'wgLocalTZoffset', $localTZoffset );
- #  Collection of parameters for Language_t_Offset.
- # Format: date to be formatted, localTZoffset value, expected date
- $userAdjust_tests = array(
+ $this->assertEquals(
+ strval( $expected ),
+ strval( $wgContLang->userAdjust( $date, '' ) ),
+ "User adjust {$date} by {$localTZoffset} minutes should give {$expected}"
+ );
+ }
+
+ public static function dataUserAdjust() {
+ return array(
array( 20061231235959, 0, 20061231235959 ),
array( 20061231235959, 5, 20070101000459 ),
array( 20061231235959, 15, 20070101001459 ),
@@ -31,15 +37,5 @@ class TimeAdjustTest extends MediaWikiLangTestCase {
array( 20061231235959, -30, 20061231232959 ),
array( 20061231235959, -60, 20061231225959 ),
);
-
- foreach ( $userAdjust_tests as $data ) {
- $wgLocalTZoffset = $data[1];
-
- $this->assertEquals(
- strval( $data[2] ),
- strval( $wgContLang->userAdjust( $data[0], '' ) ),
- "User adjust {$data[0]} by {$data[1]} minutes should give {$data[2]}"
- );
- }
}
}
diff --git a/tests/phpunit/includes/TimestampTest.php b/tests/phpunit/includes/TimestampTest.php
index 0690683a..53388392 100644
--- a/tests/phpunit/includes/TimestampTest.php
+++ b/tests/phpunit/includes/TimestampTest.php
@@ -3,23 +3,20 @@
/**
* Tests timestamp parsing and output.
*/
-class TimestampTest extends MediaWikiTestCase {
+class TimestampTest extends MediaWikiLangTestCase {
protected function setUp() {
parent::setUp();
- $this->setMwGlobals( array(
- 'wgLanguageCode' => 'en',
- 'wgContLang' => Language::factory( 'en' ),
- 'wgLang' => Language::factory( 'en' ),
- ) );
+ RequestContext::getMain()->setLanguage( Language::factory( 'en' ) );
}
/**
* Test parsing of valid timestamps and outputing to MW format.
* @dataProvider provideValidTimestamps
+ * @covers MWTimestamp::getTimestamp
*/
- function testValidParse( $format, $original, $expected ) {
+ public function testValidParse( $format, $original, $expected ) {
$timestamp = new MWTimestamp( $original );
$this->assertEquals( $expected, $timestamp->getTimestamp( TS_MW ) );
}
@@ -27,8 +24,9 @@ class TimestampTest extends MediaWikiTestCase {
/**
* Test outputting valid timestamps to different formats.
* @dataProvider provideValidTimestamps
+ * @covers MWTimestamp::getTimestamp
*/
- function testValidOutput( $format, $expected, $original ) {
+ public function testValidOutput( $format, $expected, $original ) {
$timestamp = new MWTimestamp( $original );
$this->assertEquals( $expected, (string)$timestamp->getTimestamp( $format ) );
}
@@ -36,33 +34,23 @@ class TimestampTest extends MediaWikiTestCase {
/**
* Test an invalid timestamp.
* @expectedException TimestampException
+ * @covers MWTimestamp
*/
- function testInvalidParse() {
- $timestamp = new MWTimestamp( "This is not a timestamp." );
+ public function testInvalidParse() {
+ new MWTimestamp( "This is not a timestamp." );
}
/**
* Test requesting an invalid output format.
* @expectedException TimestampException
+ * @covers MWTimestamp::getTimestamp
*/
- function testInvalidOutput() {
+ public function testInvalidOutput() {
$timestamp = new MWTimestamp( '1343761268' );
$timestamp->getTimestamp( 98 );
}
/**
- * Test human readable timestamp format.
- */
- function testHumanOutput() {
- $timestamp = new MWTimestamp( time() - 3600 );
- $this->assertEquals( "1 hour ago", $timestamp->getHumanTimestamp()->inLanguage( 'en' )->text() );
- $timestamp = new MWTimestamp( time() - 5184000 );
- $this->assertEquals( "2 months ago", $timestamp->getHumanTimestamp()->inLanguage( 'en' )->text() );
- $timestamp = new MWTimestamp( time() - 31536000 );
- $this->assertEquals( "1 year ago", $timestamp->getHumanTimestamp()->inLanguage( 'en' )->text() );
- }
-
- /**
* Returns a list of valid timestamps in the format:
* array( type, timestamp_of_type, timestamp_in_MW )
*/
@@ -83,4 +71,234 @@ class TimestampTest extends MediaWikiTestCase {
array( TS_UNIX, '-62135596801', '00001231235959' )
);
}
+
+ /**
+ * @dataProvider provideHumanTimestampTests
+ * @covers MWTimestamp::getHumanTimestamp
+ */
+ public function testHumanTimestamp(
+ $tsTime, // The timestamp to format
+ $currentTime, // The time to consider "now"
+ $timeCorrection, // The time offset to use
+ $dateFormat, // The date preference to use
+ $expectedOutput, // The expected output
+ $desc // Description
+ ) {
+ $user = $this->getMock( 'User' );
+ $user->expects( $this->any() )
+ ->method( 'getOption' )
+ ->with( 'timecorrection' )
+ ->will( $this->returnValue( $timeCorrection ) );
+
+ $user->expects( $this->any() )
+ ->method( 'getDatePreference' )
+ ->will( $this->returnValue( $dateFormat ) );
+
+ $tsTime = new MWTimestamp( $tsTime );
+ $currentTime = new MWTimestamp( $currentTime );
+
+ $this->assertEquals(
+ $expectedOutput,
+ $tsTime->getHumanTimestamp( $currentTime, $user ),
+ $desc
+ );
+ }
+
+ public static function provideHumanTimestampTests() {
+ return array(
+ array(
+ '20111231170000',
+ '20120101000000',
+ 'Offset|0',
+ 'mdy',
+ 'Yesterday at 17:00',
+ '"Yesterday" across years',
+ ),
+ array(
+ '20120717190900',
+ '20120717190929',
+ 'Offset|0',
+ 'mdy',
+ 'just now',
+ '"Just now"',
+ ),
+ array(
+ '20120717190900',
+ '20120717191530',
+ 'Offset|0',
+ 'mdy',
+ '6 minutes ago',
+ 'X minutes ago',
+ ),
+ array(
+ '20121006173100',
+ '20121006173200',
+ 'Offset|0',
+ 'mdy',
+ '1 minute ago',
+ '"1 minute ago"',
+ ),
+ array(
+ '20120617190900',
+ '20120717190900',
+ 'Offset|0',
+ 'mdy',
+ 'June 17',
+ 'Another month'
+ ),
+ array(
+ '19910130151500',
+ '20120716193700',
+ 'Offset|0',
+ 'mdy',
+ '15:15, January 30, 1991',
+ 'Different year',
+ ),
+ array(
+ '20120101050000',
+ '20120101080000',
+ 'Offset|-360',
+ 'mdy',
+ 'Yesterday at 23:00',
+ '"Yesterday" across years with time correction',
+ ),
+ array(
+ '20120714184300',
+ '20120716184300',
+ 'Offset|-420',
+ 'mdy',
+ 'Saturday at 11:43',
+ 'Recent weekday with time correction',
+ ),
+ array(
+ '20120714184300',
+ '20120715040000',
+ 'Offset|-420',
+ 'mdy',
+ '11:43',
+ 'Today at another time with time correction',
+ ),
+ array(
+ '20120617190900',
+ '20120717190900',
+ 'Offset|0',
+ 'dmy',
+ '17 June',
+ 'Another month with dmy'
+ ),
+ array(
+ '20120617190900',
+ '20120717190900',
+ 'Offset|0',
+ 'ISO 8601',
+ '06-17',
+ 'Another month with ISO-8601'
+ ),
+ array(
+ '19910130151500',
+ '20120716193700',
+ 'Offset|0',
+ 'ISO 8601',
+ '1991-01-30T15:15:00',
+ 'Different year with ISO-8601',
+ ),
+ );
+ }
+
+ /**
+ * @dataProvider provideRelativeTimestampTests
+ * @covers MWTimestamp::getRelativeTimestamp
+ */
+ public function testRelativeTimestamp(
+ $tsTime, // The timestamp to format
+ $currentTime, // The time to consider "now"
+ $timeCorrection, // The time offset to use
+ $dateFormat, // The date preference to use
+ $expectedOutput, // The expected output
+ $desc // Description
+ ) {
+ $user = $this->getMock( 'User' );
+ $user->expects( $this->any() )
+ ->method( 'getOption' )
+ ->with( 'timecorrection' )
+ ->will( $this->returnValue( $timeCorrection ) );
+
+ $tsTime = new MWTimestamp( $tsTime );
+ $currentTime = new MWTimestamp( $currentTime );
+
+ $this->assertEquals(
+ $expectedOutput,
+ $tsTime->getRelativeTimestamp( $currentTime, $user ),
+ $desc
+ );
+ }
+
+ public static function provideRelativeTimestampTests() {
+ return array(
+ array(
+ '20111231170000',
+ '20120101000000',
+ 'Offset|0',
+ 'mdy',
+ '7 hours ago',
+ '"Yesterday" across years',
+ ),
+ array(
+ '20120717190900',
+ '20120717190929',
+ 'Offset|0',
+ 'mdy',
+ '29 seconds ago',
+ '"Just now"',
+ ),
+ array(
+ '20120717190900',
+ '20120717191530',
+ 'Offset|0',
+ 'mdy',
+ '6 minutes and 30 seconds ago',
+ 'Combination of multiple units',
+ ),
+ array(
+ '20121006173100',
+ '20121006173200',
+ 'Offset|0',
+ 'mdy',
+ '1 minute ago',
+ '"1 minute ago"',
+ ),
+ array(
+ '19910130151500',
+ '20120716193700',
+ 'Offset|0',
+ 'mdy',
+ '2 decades, 1 year, 168 days, 2 hours, 8 minutes and 48 seconds ago',
+ 'A long time ago',
+ ),
+ array(
+ '20120101050000',
+ '20120101080000',
+ 'Offset|-360',
+ 'mdy',
+ '3 hours ago',
+ '"Yesterday" across years with time correction',
+ ),
+ array(
+ '20120714184300',
+ '20120716184300',
+ 'Offset|-420',
+ 'mdy',
+ '2 days ago',
+ 'Recent weekday with time correction',
+ ),
+ array(
+ '20120714184300',
+ '20120715040000',
+ 'Offset|-420',
+ 'mdy',
+ '9 hours and 17 minutes ago',
+ 'Today at another time with time correction',
+ ),
+ );
+ }
}
diff --git a/tests/phpunit/includes/TitleMethodsTest.php b/tests/phpunit/includes/TitleMethodsTest.php
index 89812c90..3079d73a 100644
--- a/tests/phpunit/includes/TitleMethodsTest.php
+++ b/tests/phpunit/includes/TitleMethodsTest.php
@@ -6,11 +6,10 @@
*
* @note: We don't make assumptions about the main namespace.
* But we do expect the Help namespace to contain Wikitext.
- *
*/
class TitleMethodsTest extends MediaWikiTestCase {
- public function setup() {
+ public function setUp() {
global $wgContLang;
parent::setUp();
@@ -34,7 +33,7 @@ class TitleMethodsTest extends MediaWikiTestCase {
$wgContLang->resetNamespaces(); # reset namespace cache
}
- public function teardown() {
+ public function tearDown() {
global $wgContLang;
parent::tearDown();
@@ -57,6 +56,7 @@ class TitleMethodsTest extends MediaWikiTestCase {
/**
* @dataProvider provideEquals
+ * @covers Title::equals
*/
public function testEquals( $titleA, $titleB, $expectedBool ) {
$titleA = Title::newFromText( $titleA );
@@ -81,12 +81,16 @@ class TitleMethodsTest extends MediaWikiTestCase {
/**
* @dataProvider provideInNamespace
+ * @covers Title::inNamespace
*/
public function testInNamespace( $title, $ns, $expectedBool ) {
$title = Title::newFromText( $title );
$this->assertEquals( $expectedBool, $title->inNamespace( $ns ) );
}
+ /**
+ * @covers Title::inNamespaces
+ */
public function testInNamespaces() {
$mainpage = Title::newFromText( 'Main Page' );
$this->assertTrue( $mainpage->inNamespaces( NS_MAIN, NS_USER ) );
@@ -110,6 +114,7 @@ class TitleMethodsTest extends MediaWikiTestCase {
/**
* @dataProvider provideHasSubjectNamespace
+ * @covers Title::hasSubjectNamespace
*/
public function testHasSubjectNamespace( $title, $ns, $expectedBool ) {
$title = Title::newFromText( $title );
@@ -143,6 +148,7 @@ class TitleMethodsTest extends MediaWikiTestCase {
/**
* @dataProvider dataGetContentModel
+ * @covers Title::getContentModel
*/
public function testGetContentModel( $title, $expectedModelId ) {
$title = Title::newFromText( $title );
@@ -151,6 +157,7 @@ class TitleMethodsTest extends MediaWikiTestCase {
/**
* @dataProvider dataGetContentModel
+ * @covers Title::hasContentModel
*/
public function testHasContentModel( $title, $expectedModelId ) {
$title = Title::newFromText( $title );
@@ -181,13 +188,13 @@ class TitleMethodsTest extends MediaWikiTestCase {
/**
* @dataProvider provideIsCssOrJsPage
+ * @covers Title::isCssOrJsPage
*/
public function testIsCssOrJsPage( $title, $expectedBool ) {
$title = Title::newFromText( $title );
$this->assertEquals( $expectedBool, $title->isCssOrJsPage() );
}
-
public static function provideIsCssJsSubpage() {
return array(
array( 'Help:Foo', false ),
@@ -210,6 +217,7 @@ class TitleMethodsTest extends MediaWikiTestCase {
/**
* @dataProvider provideIsCssJsSubpage
+ * @covers Title::isCssJsSubpage
*/
public function testIsCssJsSubpage( $title, $expectedBool ) {
$title = Title::newFromText( $title );
@@ -230,6 +238,7 @@ class TitleMethodsTest extends MediaWikiTestCase {
/**
* @dataProvider provideIsCssSubpage
+ * @covers Title::isCssSubpage
*/
public function testIsCssSubpage( $title, $expectedBool ) {
$title = Title::newFromText( $title );
@@ -250,6 +259,7 @@ class TitleMethodsTest extends MediaWikiTestCase {
/**
* @dataProvider provideIsJsSubpage
+ * @covers Title::isJsSubpage
*/
public function testIsJsSubpage( $title, $expectedBool ) {
$title = Title::newFromText( $title );
@@ -281,10 +291,10 @@ class TitleMethodsTest extends MediaWikiTestCase {
/**
* @dataProvider provideIsWikitextPage
+ * @covers Title::isWikitextPage
*/
public function testIsWikitextPage( $title, $expectedBool ) {
$title = Title::newFromText( $title );
$this->assertEquals( $expectedBool, $title->isWikitextPage() );
}
-
}
diff --git a/tests/phpunit/includes/TitlePermissionTest.php b/tests/phpunit/includes/TitlePermissionTest.php
index e2c079a7..f15c1772 100644
--- a/tests/phpunit/includes/TitlePermissionTest.php
+++ b/tests/phpunit/includes/TitlePermissionTest.php
@@ -2,6 +2,7 @@
/**
* @group Database
+ * @todo covers tags
*/
class TitlePermissionTest extends MediaWikiLangTestCase {
@@ -66,10 +67,9 @@ class TitlePermissionTest extends MediaWikiLangTestCase {
$this->user = $this->userUser;
}
-
}
- function setUserPerm( $perm ) {
+ protected function setUserPerm( $perm ) {
// Setting member variables is evil!!!
if ( is_array( $perm ) ) {
@@ -79,11 +79,11 @@ class TitlePermissionTest extends MediaWikiLangTestCase {
}
}
- function setTitle( $ns, $title = "Main_Page" ) {
+ protected function setTitle( $ns, $title = "Main_Page" ) {
$this->title = Title::makeTitle( $ns, $title );
}
- function setUser( $userName = null ) {
+ protected function setUser( $userName = null ) {
if ( $userName === 'anon' ) {
$this->user = $this->anonUser;
} elseif ( $userName === null || $userName === $this->userName ) {
@@ -93,7 +93,11 @@ class TitlePermissionTest extends MediaWikiLangTestCase {
}
}
- function testQuickPermissions() {
+ /**
+ * @todo This test method should be split up into separate test methods and
+ * data providers
+ */
+ public function testQuickPermissions() {
global $wgContLang;
$prefix = $wgContLang->getFormattedNsText( NS_PROJECT );
@@ -234,7 +238,7 @@ class TitlePermissionTest extends MediaWikiLangTestCase {
if ( $this->isWikitextNS( NS_MAIN ) ) {
//NOTE: some content models don't allow moving
- //@todo: find a Wikitext namespace for testing
+ // @todo find a Wikitext namespace for testing
$this->setTitle( NS_MAIN );
$this->setUser( 'anon' );
@@ -317,12 +321,11 @@ class TitlePermissionTest extends MediaWikiLangTestCase {
$this->title->userCan( $action, $this->user, true ) );
$this->assertEquals( $check[$action][3],
$this->title->quickUserCan( $action, $this->user ) );
-
# count( User::getGroupsWithPermissions( $action ) ) < 1
}
}
- function runGroupPermissions( $action, $result, $result2 = null ) {
+ protected function runGroupPermissions( $action, $result, $result2 = null ) {
global $wgGroupPermissions;
if ( $result2 === null ) {
@@ -350,7 +353,11 @@ class TitlePermissionTest extends MediaWikiLangTestCase {
$this->assertEquals( $result2, $res );
}
- function testSpecialsAndNSPermissions() {
+ /**
+ * @todo This test method should be split up into separate test methods and
+ * data providers
+ */
+ public function testSpecialsAndNSPermissions() {
global $wgNamespaceProtection;
$this->setUser( $this->userName );
@@ -401,44 +408,85 @@ class TitlePermissionTest extends MediaWikiLangTestCase {
$this->title->userCan( 'bogus', $this->user ) );
}
- function testCssAndJavascriptPermissions() {
+ /**
+ * @todo This test method should be split up into separate test methods and
+ * data providers
+ */
+ public function testCssAndJavascriptPermissions() {
$this->setUser( $this->userName );
+ $this->setTitle( NS_USER, $this->userName . '/test.js' );
+ $this->runCSSandJSPermissions(
+ array( array( 'badaccess-group0' ), array( 'mycustomjsprotected' ) ),
+ array( array( 'badaccess-group0' ), array( 'mycustomjsprotected' ) ),
+ array( array( 'badaccess-group0' ) ),
+ array( array( 'badaccess-group0' ), array( 'mycustomjsprotected' ) ),
+ array( array( 'badaccess-group0' ) )
+ );
+
+ $this->setTitle( NS_USER, $this->userName . '/test.css' );
+ $this->runCSSandJSPermissions(
+ array( array( 'badaccess-group0' ), array( 'mycustomcssprotected' ) ),
+ array( array( 'badaccess-group0' ) ),
+ array( array( 'badaccess-group0' ), array( 'mycustomcssprotected' ) ),
+ array( array( 'badaccess-group0' ) ),
+ array( array( 'badaccess-group0' ), array( 'mycustomcssprotected' ) )
+ );
+
$this->setTitle( NS_USER, $this->altUserName . '/test.js' );
$this->runCSSandJSPermissions(
array( array( 'badaccess-group0' ), array( 'customjsprotected' ) ),
array( array( 'badaccess-group0' ), array( 'customjsprotected' ) ),
- array( array( 'badaccess-group0' ) ) );
+ array( array( 'badaccess-group0' ), array( 'customjsprotected' ) ),
+ array( array( 'badaccess-group0' ), array( 'customjsprotected' ) ),
+ array( array( 'badaccess-group0' ) )
+ );
$this->setTitle( NS_USER, $this->altUserName . '/test.css' );
$this->runCSSandJSPermissions(
array( array( 'badaccess-group0' ), array( 'customcssprotected' ) ),
+ array( array( 'badaccess-group0' ), array( 'customcssprotected' ) ),
+ array( array( 'badaccess-group0' ), array( 'customcssprotected' ) ),
array( array( 'badaccess-group0' ) ),
- array( array( 'badaccess-group0' ), array( 'customcssprotected' ) ) );
+ array( array( 'badaccess-group0' ), array( 'customcssprotected' ) )
+ );
$this->setTitle( NS_USER, $this->altUserName . '/tempo' );
$this->runCSSandJSPermissions(
array( array( 'badaccess-group0' ) ),
array( array( 'badaccess-group0' ) ),
- array( array( 'badaccess-group0' ) ) );
+ array( array( 'badaccess-group0' ) ),
+ array( array( 'badaccess-group0' ) ),
+ array( array( 'badaccess-group0' ) )
+ );
}
- function runCSSandJSPermissions( $result0, $result1, $result2 ) {
+ protected function runCSSandJSPermissions( $result0, $result1, $result2, $result3, $result4 ) {
$this->setUserPerm( '' );
$this->assertEquals( $result0,
$this->title->getUserPermissionsErrors( 'bogus',
$this->user ) );
- $this->setUserPerm( 'editusercss' );
+ $this->setUserPerm( 'editmyusercss' );
$this->assertEquals( $result1,
$this->title->getUserPermissionsErrors( 'bogus',
$this->user ) );
- $this->setUserPerm( 'edituserjs' );
+ $this->setUserPerm( 'editmyuserjs' );
$this->assertEquals( $result2,
$this->title->getUserPermissionsErrors( 'bogus',
$this->user ) );
+ $this->setUserPerm( 'editusercss' );
+ $this->assertEquals( $result3,
+ $this->title->getUserPermissionsErrors( 'bogus',
+ $this->user ) );
+
+ $this->setUserPerm( 'edituserjs' );
+ $this->assertEquals( $result4,
+ $this->title->getUserPermissionsErrors( 'bogus',
+ $this->user ) );
+
$this->setUserPerm( 'editusercssjs' );
$this->assertEquals( array( array( 'badaccess-group0' ) ),
$this->title->getUserPermissionsErrors( 'bogus',
@@ -450,7 +498,11 @@ class TitlePermissionTest extends MediaWikiLangTestCase {
$this->user ) );
}
- function testPageRestrictions() {
+ /**
+ * @todo This test method should be split up into separate test methods and
+ * data providers
+ */
+ public function testPageRestrictions() {
global $wgContLang;
$prefix = $wgContLang->getFormattedNsText( NS_PROJECT );
@@ -471,39 +523,59 @@ class TitlePermissionTest extends MediaWikiLangTestCase {
$this->assertEquals( array( array( 'badaccess-group0' ),
array( 'protectedpagetext', 'bogus' ),
- array( 'protectedpagetext', 'protect' ),
+ array( 'protectedpagetext', 'editprotected' ),
array( 'protectedpagetext', 'protect' ) ),
$this->title->getUserPermissionsErrors( 'bogus',
$this->user ) );
$this->assertEquals( array( array( 'protectedpagetext', 'bogus' ),
- array( 'protectedpagetext', 'protect' ),
+ array( 'protectedpagetext', 'editprotected' ),
array( 'protectedpagetext', 'protect' ) ),
$this->title->getUserPermissionsErrors( 'edit',
$this->user ) );
$this->setUserPerm( "" );
$this->assertEquals( array( array( 'badaccess-group0' ),
array( 'protectedpagetext', 'bogus' ),
- array( 'protectedpagetext', 'protect' ),
+ array( 'protectedpagetext', 'editprotected' ),
array( 'protectedpagetext', 'protect' ) ),
$this->title->getUserPermissionsErrors( 'bogus',
$this->user ) );
$this->assertEquals( array( array( 'badaccess-groups', "*, [[$prefix:Users|Users]]", 2 ),
array( 'protectedpagetext', 'bogus' ),
- array( 'protectedpagetext', 'protect' ),
+ array( 'protectedpagetext', 'editprotected' ),
array( 'protectedpagetext', 'protect' ) ),
$this->title->getUserPermissionsErrors( 'edit',
$this->user ) );
$this->setUserPerm( array( "edit", "editprotected" ) );
$this->assertEquals( array( array( 'badaccess-group0' ),
array( 'protectedpagetext', 'bogus' ),
- array( 'protectedpagetext', 'protect' ),
array( 'protectedpagetext', 'protect' ) ),
$this->title->getUserPermissionsErrors( 'bogus',
$this->user ) );
- $this->assertEquals( array(),
+ $this->assertEquals( array(
+ array( 'protectedpagetext', 'bogus' ),
+ array( 'protectedpagetext', 'protect' ) ),
$this->title->getUserPermissionsErrors( 'edit',
$this->user ) );
+
$this->title->mCascadeRestriction = true;
+ $this->setUserPerm( "edit" );
+ $this->assertEquals( false,
+ $this->title->quickUserCan( 'bogus', $this->user ) );
+ $this->assertEquals( false,
+ $this->title->quickUserCan( 'edit', $this->user ) );
+ $this->assertEquals( array( array( 'badaccess-group0' ),
+ array( 'protectedpagetext', 'bogus' ),
+ array( 'protectedpagetext', 'editprotected' ),
+ array( 'protectedpagetext', 'protect' ) ),
+ $this->title->getUserPermissionsErrors( 'bogus',
+ $this->user ) );
+ $this->assertEquals( array( array( 'protectedpagetext', 'bogus' ),
+ array( 'protectedpagetext', 'editprotected' ),
+ array( 'protectedpagetext', 'protect' ) ),
+ $this->title->getUserPermissionsErrors( 'edit',
+ $this->user ) );
+
+ $this->setUserPerm( array( "edit", "editprotected" ) );
$this->assertEquals( false,
$this->title->quickUserCan( 'bogus', $this->user ) );
$this->assertEquals( false,
@@ -521,7 +593,7 @@ class TitlePermissionTest extends MediaWikiLangTestCase {
$this->user ) );
}
- function testCascadingSourcesRestrictions() {
+ public function testCascadingSourcesRestrictions() {
$this->setTitle( NS_MAIN, "test page" );
$this->setUserPerm( array( "edit", "bogus" ) );
@@ -531,6 +603,7 @@ class TitlePermissionTest extends MediaWikiLangTestCase {
$this->assertEquals( false,
$this->title->userCan( 'bogus', $this->user ) );
$this->assertEquals( array( array( "cascadeprotected", 2, "* [[:Bogus]]\n* [[:UnBogus]]\n" ),
+ array( "cascadeprotected", 2, "* [[:Bogus]]\n* [[:UnBogus]]\n" ),
array( "cascadeprotected", 2, "* [[:Bogus]]\n* [[:UnBogus]]\n" ) ),
$this->title->getUserPermissionsErrors( 'bogus', $this->user ) );
@@ -538,10 +611,13 @@ class TitlePermissionTest extends MediaWikiLangTestCase {
$this->title->userCan( 'edit', $this->user ) );
$this->assertEquals( array(),
$this->title->getUserPermissionsErrors( 'edit', $this->user ) );
-
}
- function testActionPermissions() {
+ /**
+ * @todo This test method should be split up into separate test methods and
+ * data providers
+ */
+ public function testActionPermissions() {
$this->setUserPerm( array( "createpage" ) );
$this->setTitle( NS_MAIN, "test page" );
$this->title->mTitleProtection['pt_create_perm'] = '';
@@ -557,12 +633,17 @@ class TitlePermissionTest extends MediaWikiLangTestCase {
$this->title->mTitleProtection['pt_create_perm'] = 'sysop';
$this->setUserPerm( array( 'createpage', 'protect' ) );
+ $this->assertEquals( array( array( 'titleprotected', 'Useruser', 'test' ) ),
+ $this->title->getUserPermissionsErrors( 'create', $this->user ) );
+ $this->assertEquals( false,
+ $this->title->userCan( 'create', $this->user ) );
+
+ $this->setUserPerm( array( 'createpage', 'editprotected' ) );
$this->assertEquals( array(),
$this->title->getUserPermissionsErrors( 'create', $this->user ) );
$this->assertEquals( true,
$this->title->userCan( 'create', $this->user ) );
-
$this->setUserPerm( array( 'createpage' ) );
$this->assertEquals( array( array( 'titleprotected', 'Useruser', 'test' ) ),
$this->title->getUserPermissionsErrors( 'create', $this->user ) );
@@ -605,10 +686,9 @@ class TitlePermissionTest extends MediaWikiLangTestCase {
$this->title->getUserPermissionsErrors( 'move-target', $this->user ) );
$this->assertEquals( false,
$this->title->userCan( 'move-target', $this->user ) );
-
}
- function testUserBlock() {
+ public function testUserBlock() {
global $wgEmailConfirmToEdit, $wgEmailAuthentication;
$wgEmailConfirmToEdit = true;
$wgEmailAuthentication = true;
@@ -648,13 +728,13 @@ class TitlePermissionTest extends MediaWikiLangTestCase {
global $wgLocalTZoffset;
$wgLocalTZoffset = -60;
$this->user->mBlockedby = $this->user->getName();
- $this->user->mBlock = new Block( '127.0.8.1', 0, 1, 'no reason given', $now, 0, 10 );
+ $this->user->mBlock = new Block( '127.0.8.1', 0, $this->user->getId(),
+ 'no reason given', $now, 0, 10 );
$this->assertEquals( array( array( 'blockedtext',
'[[User:Useruser|Useruser]]', 'no reason given', '127.0.0.1',
'Useruser', null, '23:00, 31 December 1969', '127.0.8.1',
$wgLang->timeanddate( wfTimestamp( TS_MW, $now ), true ) ) ),
$this->title->getUserPermissionsErrors( 'move-target', $this->user ) );
-
# $action != 'read' && $action != 'createaccount' && $user->isBlockedFrom( $this )
# $user->blockedFor() == ''
# $user->mBlock->mExpiry == 'infinity'
diff --git a/tests/phpunit/includes/TitleTest.php b/tests/phpunit/includes/TitleTest.php
index a9067852..6bfe5453 100644
--- a/tests/phpunit/includes/TitleTest.php
+++ b/tests/phpunit/includes/TitleTest.php
@@ -1,7 +1,6 @@
<?php
/**
- *
* @group Database
* ^--- needed for language cache stuff
*/
@@ -19,7 +18,10 @@ class TitleTest extends MediaWikiTestCase {
) );
}
- function testLegalChars() {
+ /**
+ * @covers Title::legalChars
+ */
+ public function testLegalChars() {
$titlechars = Title::legalChars();
foreach ( range( 1, 255 ) as $num ) {
@@ -33,12 +35,160 @@ class TitleTest extends MediaWikiTestCase {
}
/**
+ * See also mediawiki.Title.test.js
+ * @covers Title::secureAndSplit
+ * @todo This method should be split into 2 separate tests each with a provider
+ */
+ public function testSecureAndSplit() {
+ // Valid
+ foreach ( array(
+ 'Sandbox',
+ 'A "B"',
+ 'A \'B\'',
+ '.com',
+ '~',
+ '"',
+ '\'',
+ 'Talk:Sandbox',
+ 'Talk:Foo:Sandbox',
+ 'File:Example.svg',
+ 'File_talk:Example.svg',
+ 'Foo/.../Sandbox',
+ 'Sandbox/...',
+ 'A~~',
+ // Length is 256 total, but only title part matters
+ 'Category:' . str_repeat( 'x', 248 ),
+ str_repeat( 'x', 252 )
+ ) as $text ) {
+ $this->assertInstanceOf( 'Title', Title::newFromText( $text ), "Valid: $text" );
+ }
+
+ // Invalid
+ foreach ( array(
+ '',
+ '__ __',
+ ' __ ',
+ // Bad characters forbidden regardless of wgLegalTitleChars
+ 'A [ B',
+ 'A ] B',
+ 'A { B',
+ 'A } B',
+ 'A < B',
+ 'A > B',
+ 'A | B',
+ // URL encoding
+ 'A%20B',
+ 'A%23B',
+ 'A%2523B',
+ // XML/HTML character entity references
+ // Note: Commented out because they are not marked invalid by the PHP test as
+ // Title::newFromText runs Sanitizer::decodeCharReferencesAndNormalize first.
+ //'A &eacute; B',
+ //'A &#233; B',
+ //'A &#x00E9; B',
+ // Subject of NS_TALK does not roundtrip to NS_MAIN
+ 'Talk:File:Example.svg',
+ // Directory navigation
+ '.',
+ '..',
+ './Sandbox',
+ '../Sandbox',
+ 'Foo/./Sandbox',
+ 'Foo/../Sandbox',
+ 'Sandbox/.',
+ 'Sandbox/..',
+ // Tilde
+ 'A ~~~ Name',
+ 'A ~~~~ Signature',
+ 'A ~~~~~ Timestamp',
+ str_repeat( 'x', 256 ),
+ // Namespace prefix without actual title
+ // ':', // bug 54044
+ 'Talk:',
+ 'Category: ',
+ 'Category: #bar'
+ ) as $text ) {
+ $this->assertNull( Title::newFromText( $text ), "Invalid: $text" );
+ }
+ }
+
+ public static function provideConvertByteClassToUnicodeClass() {
+ return array(
+ array(
+ ' %!"$&\'()*,\\-.\\/0-9:;=?@A-Z\\\\^_`a-z~\\x80-\\xFF+',
+ ' %!"$&\'()*,\\-./0-9:;=?@A-Z\\\\\\^_`a-z~+\\u0080-\\uFFFF',
+ ),
+ array(
+ 'QWERTYf-\\xFF+',
+ 'QWERTYf-\\x7F+\\u0080-\\uFFFF',
+ ),
+ array(
+ 'QWERTY\\x66-\\xFD+',
+ 'QWERTYf-\\x7F+\\u0080-\\uFFFF',
+ ),
+ array(
+ 'QWERTYf-y+',
+ 'QWERTYf-y+',
+ ),
+ array(
+ 'QWERTYf-\\x80+',
+ 'QWERTYf-\\x7F+\\u0080-\\uFFFF',
+ ),
+ array(
+ 'QWERTY\\x66-\\x80+\\x23',
+ 'QWERTYf-\\x7F+#\\u0080-\\uFFFF',
+ ),
+ array(
+ 'QWERTY\\x66-\\x80+\\xD3',
+ 'QWERTYf-\\x7F+\\u0080-\\uFFFF',
+ ),
+ array(
+ '\\\\\\x99',
+ '\\\\\\u0080-\\uFFFF',
+ ),
+ array(
+ '-\\x99',
+ '\\-\\u0080-\\uFFFF',
+ ),
+ array(
+ 'QWERTY\\-\\x99',
+ 'QWERTY\\-\\u0080-\\uFFFF',
+ ),
+ array(
+ '\\\\x99',
+ '\\\\x99',
+ ),
+ array(
+ 'A-\\x9F',
+ 'A-\\x7F\\u0080-\\uFFFF',
+ ),
+ array(
+ '\\x66-\\x77QWERTY\\x88-\\x91FXZ',
+ 'f-wQWERTYFXZ\\u0080-\\uFFFF',
+ ),
+ array(
+ '\\x66-\\x99QWERTY\\xAA-\\xEEFXZ',
+ 'f-\\x7FQWERTYFXZ\\u0080-\\uFFFF',
+ ),
+ );
+ }
+
+ /**
+ * @dataProvider provideConvertByteClassToUnicodeClass
+ * @covers Title::convertByteClassToUnicodeClass
+ */
+ public function testConvertByteClassToUnicodeClass( $byteClass, $unicodeClass ) {
+ $this->assertEquals( $unicodeClass, Title::convertByteClassToUnicodeClass( $byteClass ) );
+ }
+
+ /**
* @dataProvider provideBug31100
+ * @covers Title::fixSpecialName
*/
- function testBug31100FixSpecialName( $text, $expectedParam ) {
+ public function testBug31100FixSpecialName( $text, $expectedParam ) {
$title = Title::newFromText( $text );
$fixed = $title->fixSpecialName();
- $stuff = explode( '/', $fixed->getDbKey(), 2 );
+ $stuff = explode( '/', $fixed->getDBkey(), 2 );
if ( count( $stuff ) == 2 ) {
$par = $stuff[1];
} else {
@@ -61,10 +211,11 @@ class TitleTest extends MediaWikiTestCase {
* @group Database
* @param string $source
* @param string $target
- * @param array|string|true $expected Required error
+ * @param array|string|bool $expected Required error
* @dataProvider provideTestIsValidMoveOperation
+ * @covers Title::isValidMoveOperation
*/
- function testIsValidMoveOperation( $source, $target, $expected ) {
+ public function testIsValidMoveOperation( $source, $target, $expected ) {
$title = Title::newFromText( $source );
$nt = Title::newFromText( $target );
$errors = $title->isValidMoveOperation( $nt, false );
@@ -81,7 +232,7 @@ class TitleTest extends MediaWikiTestCase {
/**
* Provides test parameter values for testIsValidMoveOperation()
*/
- function dataTestIsValidMoveOperation() {
+ public function dataTestIsValidMoveOperation() {
return array(
array( 'Test', 'Test', 'selfmove' ),
array( 'File:Test.jpg', 'Page', 'imagenocrossnamespace' )
@@ -94,12 +245,12 @@ class TitleTest extends MediaWikiTestCase {
* @param array $whitelistRegexp
* @param string $source
* @param string $action
- * @param array|string|true $expected Required error
+ * @param array|string|bool $expected Required error
*
* @covers Title::checkReadPermissions
* @dataProvider dataWgWhitelistReadRegexp
*/
- function testWgWhitelistReadRegexp( $whitelistRegexp, $source, $action, $expected ) {
+ public function testWgWhitelistReadRegexp( $whitelistRegexp, $source, $action, $expected ) {
// $wgWhitelistReadRegexp must be an array. Since the provided test cases
// usually have only one regex, it is more concise to write the lonely regex
// as a string. Thus we cast to an array() to honor $wgWhitelistReadRegexp
@@ -156,7 +307,7 @@ class TitleTest extends MediaWikiTestCase {
/**
* Provides test parameter values for testWgWhitelistReadRegexp()
*/
- function dataWgWhitelistReadRegexp() {
+ public function dataWgWhitelistReadRegexp() {
$ALLOWED = true;
$DISALLOWED = false;
@@ -192,11 +343,12 @@ class TitleTest extends MediaWikiTestCase {
);
}
- function flattenErrorsArray( $errors ) {
+ public function flattenErrorsArray( $errors ) {
$result = array();
foreach ( $errors as $error ) {
$result[] = $error[0];
}
+
return $result;
}
@@ -208,9 +360,10 @@ class TitleTest extends MediaWikiTestCase {
}
/**
- * @dataProvider provideCasesForGetpageviewlanguage
+ * @dataProvider provideGetPageViewLanguage
+ * @covers Title::getPageViewLanguage
*/
- function testGetpageviewlanguage( $expected, $titleText, $contLang, $lang, $variant, $msg = '' ) {
+ public function testGetPageViewLanguage( $expected, $titleText, $contLang, $lang, $variant, $msg = '' ) {
global $wgLanguageCode, $wgContLang, $wgLang, $wgDefaultLanguageVariant, $wgAllowUserJs;
// Setup environnement for this test
@@ -230,7 +383,7 @@ class TitleTest extends MediaWikiTestCase {
);
}
- function provideCasesForGetpageviewlanguage() {
+ public static function provideGetPageViewLanguage() {
# Format:
# - expected
# - Title name
@@ -271,8 +424,9 @@ class TitleTest extends MediaWikiTestCase {
/**
* @dataProvider provideBaseTitleCases
+ * @covers Title::getBaseText
*/
- function testExtractingBaseTextFromTitle( $title, $expected, $msg = '' ) {
+ public function testGetBaseText( $title, $expected, $msg = '' ) {
$title = Title::newFromText( $title );
$this->assertEquals( $expected,
$title->getBaseText(),
@@ -280,7 +434,7 @@ class TitleTest extends MediaWikiTestCase {
);
}
- function provideBaseTitleCases() {
+ public static function provideBaseTitleCases() {
return array(
# Title, expected base, optional message
array( 'User:John_Doe/subOne/subTwo', 'John Doe/subOne' ),
@@ -290,8 +444,9 @@ class TitleTest extends MediaWikiTestCase {
/**
* @dataProvider provideRootTitleCases
+ * @covers Title::getRootText
*/
- function testExtractingRootTextFromTitle( $title, $expected, $msg = '' ) {
+ public function testGetRootText( $title, $expected, $msg = '' ) {
$title = Title::newFromText( $title );
$this->assertEquals( $expected,
$title->getRootText(),
@@ -310,8 +465,9 @@ class TitleTest extends MediaWikiTestCase {
/**
* @todo Handle $wgNamespacesWithSubpages cases
* @dataProvider provideSubpageTitleCases
+ * @covers Title::getSubpageText
*/
- function testExtractingSubpageTextFromTitle( $title, $expected, $msg = '' ) {
+ public function testGetSubpageText( $title, $expected, $msg = '' ) {
$title = Title::newFromText( $title );
$this->assertEquals( $expected,
$title->getSubpageText(),
@@ -319,7 +475,7 @@ class TitleTest extends MediaWikiTestCase {
);
}
- function provideSubpageTitleCases() {
+ public static function provideSubpageTitleCases() {
return array(
# Title, expected base, optional message
array( 'User:John_Doe/subOne/subTwo', 'subTwo' ),
diff --git a/tests/phpunit/includes/UIDGeneratorTest.php b/tests/phpunit/includes/UIDGeneratorTest.php
index 23553ca7..8f78ae51 100644
--- a/tests/phpunit/includes/UIDGeneratorTest.php
+++ b/tests/phpunit/includes/UIDGeneratorTest.php
@@ -1,8 +1,11 @@
<?php
class UIDGeneratorTest extends MediaWikiTestCase {
+
/**
* @dataProvider provider_testTimestampedUID
+ * @covers UIDGenerator::newTimestampedUID128
+ * @covers UIDGenerator::newTimestampedUID88
*/
public function testTimestampedUID( $method, $digitlen, $bits, $tbits, $hostbits ) {
$id = call_user_func( array( 'UIDGenerator', $method ) );
@@ -46,6 +49,7 @@ class UIDGeneratorTest extends MediaWikiTestCase {
/**
* array( method, length, bits, hostbits )
+ * NOTE: When adding a new method name here please update the covers tags for the tests!
*/
public static function provider_testTimestampedUID() {
return array(
@@ -55,22 +59,40 @@ class UIDGeneratorTest extends MediaWikiTestCase {
);
}
+ /**
+ * @covers UIDGenerator::newUUIDv4
+ */
public function testUUIDv4() {
for ( $i = 0; $i < 100; $i++ ) {
$id = UIDGenerator::newUUIDv4();
$this->assertEquals( true,
preg_match( '!^[0-9a-f]{8}-[0-9a-f]{4}-4[0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$!', $id ),
"UID $id has the right format" );
+ }
+ }
+ /**
+ * @covers UIDGenerator::newRawUUIDv4
+ */
+ public function testRawUUIDv4() {
+ for ( $i = 0; $i < 100; $i++ ) {
$id = UIDGenerator::newRawUUIDv4();
$this->assertEquals( true,
preg_match( '!^[0-9a-f]{12}4[0-9a-f]{3}[89ab][0-9a-f]{15}$!', $id ),
"UID $id has the right format" );
+ }
+ }
+ /**
+ * @covers UIDGenerator::newRawUUIDv4
+ */
+ public function testRawUUIDv4QuickRand() {
+ for ( $i = 0; $i < 100; $i++ ) {
$id = UIDGenerator::newRawUUIDv4( UIDGenerator::QUICK_RAND );
$this->assertEquals( true,
preg_match( '!^[0-9a-f]{12}4[0-9a-f]{3}[89ab][0-9a-f]{15}$!', $id ),
"UID $id has the right format" );
}
}
+
}
diff --git a/tests/phpunit/includes/UserMailerTest.php b/tests/phpunit/includes/UserMailerTest.php
new file mode 100644
index 00000000..278edfaa
--- /dev/null
+++ b/tests/phpunit/includes/UserMailerTest.php
@@ -0,0 +1,14 @@
+<?php
+
+class UserMailerTest extends MediaWikiLangTestCase {
+
+ /**
+ * @covers UserMailer::quotedPrintable
+ */
+ public function testQuotedPrintable() {
+ $this->assertEquals(
+ "=?UTF-8?Q?=C4=88u=20legebla=3F?=",
+ UserMailer::quotedPrintable( "\xc4\x88u legebla?", "UTF-8" ) );
+ }
+
+} \ No newline at end of file
diff --git a/tests/phpunit/includes/UserTest.php b/tests/phpunit/includes/UserTest.php
index e777179a..ff33e825 100644
--- a/tests/phpunit/includes/UserTest.php
+++ b/tests/phpunit/includes/UserTest.php
@@ -46,8 +46,16 @@ class UserTest extends MediaWikiTestCase {
$wgRevokePermissions['formertesters'] = array(
'runtest' => true,
);
+
+ # For the options test
+ $wgGroupPermissions['*'] = array(
+ 'editmyoptions' => true,
+ );
}
+ /**
+ * @covers User::getGroupPermissions
+ */
public function testGroupPermissions() {
$rights = User::getGroupPermissions( array( 'unittesters' ) );
$this->assertContains( 'runtest', $rights );
@@ -62,6 +70,9 @@ class UserTest extends MediaWikiTestCase {
$this->assertNotContains( 'nukeworld', $rights );
}
+ /**
+ * @covers User::getGroupPermissions
+ */
public function testRevokePermissions() {
$rights = User::getGroupPermissions( array( 'unittesters', 'formertesters' ) );
$this->assertNotContains( 'runtest', $rights );
@@ -70,6 +81,9 @@ class UserTest extends MediaWikiTestCase {
$this->assertNotContains( 'nukeworld', $rights );
}
+ /**
+ * @covers User::getRights
+ */
public function testUserPermissions() {
$rights = $this->user->getRights();
$this->assertContains( 'runtest', $rights );
@@ -80,6 +94,7 @@ class UserTest extends MediaWikiTestCase {
/**
* @dataProvider provideGetGroupsWithPermission
+ * @covers User::getGroupsWithPermission
*/
public function testGetGroupsWithPermission( $expected, $right ) {
$result = User::getGroupsWithPermission( $right );
@@ -112,6 +127,7 @@ class UserTest extends MediaWikiTestCase {
/**
* @dataProvider provideUserNames
+ * @covers User::isValidUserName
*/
public function testIsValidUserName( $username, $result, $message ) {
$this->assertEquals( $this->user->isValidUserName( $username ), $result, $message );
@@ -166,6 +182,7 @@ class UserTest extends MediaWikiTestCase {
/**
* Test User::editCount
* @group medium
+ * @covers User::getEditCount
*/
public function testEditCount() {
$user = User::newFromName( 'UnitTestUser' );
@@ -190,6 +207,8 @@ class UserTest extends MediaWikiTestCase {
/**
* Test changing user options.
+ * @covers User::setOption
+ * @covers User::getOption
*/
public function testOptions() {
$user = User::newFromName( 'UnitTestUser' );
@@ -207,6 +226,7 @@ class UserTest extends MediaWikiTestCase {
/**
* Bug 37963
* Make sure defaults are loaded when setOption is called.
+ * @covers User::loadOptions
*/
public function testAnonOptions() {
global $wgDefaultUserOptions;
diff --git a/tests/phpunit/includes/WebRequestTest.php b/tests/phpunit/includes/WebRequestTest.php
index 46f80255..f8ed14b6 100644
--- a/tests/phpunit/includes/WebRequestTest.php
+++ b/tests/phpunit/includes/WebRequestTest.php
@@ -1,5 +1,8 @@
<?php
+/**
+ * @group WebRequest
+ */
class WebRequestTest extends MediaWikiTestCase {
protected $oldServer;
@@ -17,8 +20,9 @@ class WebRequestTest extends MediaWikiTestCase {
/**
* @dataProvider provideDetectServer
+ * @covers WebRequest::detectServer
*/
- function testDetectServer( $expected, $input, $description ) {
+ public function testDetectServer( $expected, $input, $description ) {
$_SERVER = $input;
$result = WebRequest::detectServer();
$this->assertEquals( $expected, $result, $description );
@@ -100,12 +104,23 @@ class WebRequestTest extends MediaWikiTestCase {
/**
* @dataProvider provideGetIP
+ * @covers WebRequest::getIP
*/
- function testGetIP( $expected, $input, $squid, $private, $description ) {
- global $wgSquidServersNoPurge, $wgUsePrivateIPs;
+ public function testGetIP( $expected, $input, $squid, $xffList, $private, $description ) {
$_SERVER = $input;
- $wgSquidServersNoPurge = $squid;
- $wgUsePrivateIPs = $private;
+ $this->setMwGlobals( array(
+ 'wgSquidServersNoPurge' => $squid,
+ 'wgUsePrivateIPs' => $private,
+ 'wgHooks' => array(
+ 'IsTrustedProxy' => array(
+ function( &$ip, &$trusted ) use ( $xffList ) {
+ $trusted = $trusted || in_array( $ip, $xffList );
+ return true;
+ }
+ )
+ )
+ ) );
+
$request = new WebRequest();
$result = $request->getIP();
$this->assertEquals( $expected, $result, $description );
@@ -119,6 +134,7 @@ class WebRequestTest extends MediaWikiTestCase {
'REMOTE_ADDR' => '127.0.0.1'
),
array(),
+ array(),
false,
'Simple IPv4'
),
@@ -128,16 +144,29 @@ class WebRequestTest extends MediaWikiTestCase {
'REMOTE_ADDR' => '::1'
),
array(),
+ array(),
false,
'Simple IPv6'
),
array(
+ '12.0.0.1',
+ array(
+ 'REMOTE_ADDR' => 'abcd:0001:002:03:4:555:6666:7777',
+ 'HTTP_X_FORWARDED_FOR' => '12.0.0.1, abcd:0001:002:03:4:555:6666:7777',
+ ),
+ array( 'ABCD:1:2:3:4:555:6666:7777' ),
+ array(),
+ false,
+ 'IPv6 normalisation'
+ ),
+ array(
'12.0.0.3',
array(
'REMOTE_ADDR' => '12.0.0.1',
'HTTP_X_FORWARDED_FOR' => '12.0.0.3, 12.0.0.2'
),
array( '12.0.0.1', '12.0.0.2' ),
+ array(),
false,
'With X-Forwaded-For'
),
@@ -148,6 +177,7 @@ class WebRequestTest extends MediaWikiTestCase {
'HTTP_X_FORWARDED_FOR' => '12.0.0.3, 12.0.0.2'
),
array(),
+ array(),
false,
'With X-Forwaded-For and disallowed server'
),
@@ -158,36 +188,95 @@ class WebRequestTest extends MediaWikiTestCase {
'HTTP_X_FORWARDED_FOR' => '12.0.0.3, 12.0.0.2'
),
array( '12.0.0.1' ),
+ array(),
false,
'With multiple X-Forwaded-For and only one allowed server'
),
array(
- '12.0.0.2',
+ '10.0.0.3',
array(
'REMOTE_ADDR' => '12.0.0.2',
- 'HTTP_X_FORWARDED_FOR' => '10.0.0.3, 12.0.0.2'
+ 'HTTP_X_FORWARDED_FOR' => '10.0.0.4, 10.0.0.3, 12.0.0.2'
),
array( '12.0.0.1', '12.0.0.2' ),
+ array(),
false,
- 'With X-Forwaded-For and private IP'
+ 'With X-Forwaded-For and private IP (from cache proxy)'
),
array(
- '10.0.0.3',
+ '10.0.0.4',
array(
'REMOTE_ADDR' => '12.0.0.2',
- 'HTTP_X_FORWARDED_FOR' => '10.0.0.3, 12.0.0.2'
+ 'HTTP_X_FORWARDED_FOR' => '10.0.0.4, 10.0.0.3, 12.0.0.2'
+ ),
+ array( '12.0.0.1', '12.0.0.2', '10.0.0.3' ),
+ array(),
+ true,
+ 'With X-Forwaded-For and private IP (allowed)'
+ ),
+ array(
+ '10.0.0.4',
+ array(
+ 'REMOTE_ADDR' => '12.0.0.2',
+ 'HTTP_X_FORWARDED_FOR' => '10.0.0.4, 10.0.0.3, 12.0.0.2'
),
array( '12.0.0.1', '12.0.0.2' ),
+ array( '10.0.0.3' ),
true,
'With X-Forwaded-For and private IP (allowed)'
),
+ array(
+ '10.0.0.3',
+ array(
+ 'REMOTE_ADDR' => '12.0.0.2',
+ 'HTTP_X_FORWARDED_FOR' => '10.0.0.4, 10.0.0.3, 12.0.0.2'
+ ),
+ array( '12.0.0.1', '12.0.0.2' ),
+ array( '10.0.0.3' ),
+ false,
+ 'With X-Forwaded-For and private IP (disallowed)'
+ ),
+ array(
+ '12.0.0.3',
+ array(
+ 'REMOTE_ADDR' => '12.0.0.1',
+ 'HTTP_X_FORWARDED_FOR' => '12.0.0.3, 12.0.0.2'
+ ),
+ array(),
+ array( '12.0.0.1', '12.0.0.2' ),
+ false,
+ 'With X-Forwaded-For'
+ ),
+ array(
+ '12.0.0.2',
+ array(
+ 'REMOTE_ADDR' => '12.0.0.1',
+ 'HTTP_X_FORWARDED_FOR' => '12.0.0.3, 12.0.0.2'
+ ),
+ array(),
+ array( '12.0.0.1' ),
+ false,
+ 'With multiple X-Forwaded-For and only one allowed server'
+ ),
+ array(
+ '12.0.0.2',
+ array(
+ 'REMOTE_ADDR' => '12.0.0.2',
+ 'HTTP_X_FORWARDED_FOR' => '10.0.0.3, 12.0.0.2'
+ ),
+ array(),
+ array( '12.0.0.2' ),
+ false,
+ 'With X-Forwaded-For and private IP and hook (disallowed)'
+ ),
);
}
/**
* @expectedException MWException
+ * @covers WebRequest::getIP
*/
- function testGetIpLackOfRemoteAddrThrowAnException() {
+ public function testGetIpLackOfRemoteAddrThrowAnException() {
$request = new WebRequest();
# Next call throw an exception about lacking an IP
$request->getIP();
@@ -211,8 +300,9 @@ class WebRequestTest extends MediaWikiTestCase {
/**
* @dataProvider provideLanguageData
+ * @covers WebRequest::getAcceptLang
*/
- function testAcceptLang( $acceptLanguageHeader, $expectedLanguages, $description ) {
+ public function testAcceptLang( $acceptLanguageHeader, $expectedLanguages, $description ) {
$_SERVER = array( 'HTTP_ACCEPT_LANGUAGE' => $acceptLanguageHeader );
$request = new WebRequest();
$this->assertSame( $request->getAcceptLang(), $expectedLanguages, $description );
diff --git a/tests/phpunit/includes/WikiPageTest.php b/tests/phpunit/includes/WikiPageTest.php
index 2501be33..e0d786b9 100644
--- a/tests/phpunit/includes/WikiPageTest.php
+++ b/tests/phpunit/includes/WikiPageTest.php
@@ -1,16 +1,16 @@
<?php
+
/**
* @group ContentHandler
* @group Database
* ^--- important, causes temporary tables to be used instead of the real database
* @group medium
**/
-
class WikiPageTest extends MediaWikiLangTestCase {
- var $pages_to_delete;
+ protected $pages_to_delete;
- function __construct( $name = null, array $data = array(), $dataName = '' ) {
+ function __construct( $name = null, array $data = array(), $dataName = '' ) {
parent::__construct( $name, $data, $dataName );
$this->tablesUsed = array_merge(
@@ -90,6 +90,9 @@ class WikiPageTest extends MediaWikiLangTestCase {
return $page;
}
+ /**
+ * @covers WikiPage::doEditContent
+ */
public function testDoEditContent() {
$page = $this->newPage( "WikiPageTest_testDoEditContent" );
$title = $page->getTitle();
@@ -143,6 +146,9 @@ class WikiPageTest extends MediaWikiLangTestCase {
$this->assertEquals( 2, $n, 'pagelinks should contain two links from the page' );
}
+ /**
+ * @covers WikiPage::doEdit
+ */
public function testDoEdit() {
$this->hideDeprecated( "WikiPage::doEdit" );
$this->hideDeprecated( "WikiPage::getText" );
@@ -200,6 +206,9 @@ class WikiPageTest extends MediaWikiLangTestCase {
$this->assertEquals( 2, $n, 'pagelinks should contain two links from the page' );
}
+ /**
+ * @covers WikiPage::doQuickEdit
+ */
public function testDoQuickEdit() {
global $wgUser;
@@ -216,6 +225,9 @@ class WikiPageTest extends MediaWikiLangTestCase {
$this->assertEquals( $text, $page->getText() );
}
+ /**
+ * @covers WikiPage::doQuickEditContent
+ */
public function testDoQuickEditContent() {
global $wgUser;
@@ -229,6 +241,9 @@ class WikiPageTest extends MediaWikiLangTestCase {
$this->assertTrue( $content->equals( $page->getContent() ) );
}
+ /**
+ * @covers WikiPage::doDeleteArticle
+ */
public function testDoDeleteArticle() {
$page = $this->createPage( "WikiPageTest_testDoDeleteArticle", "[[original text]] foo", CONTENT_MODEL_WIKITEXT );
$id = $page->getId();
@@ -253,6 +268,9 @@ class WikiPageTest extends MediaWikiLangTestCase {
$this->assertEquals( 0, $n, 'pagelinks should contain no more links from the page' );
}
+ /**
+ * @covers WikiPage::doDeleteUpdates
+ */
public function testDoDeleteUpdates() {
$page = $this->createPage( "WikiPageTest_testDoDeleteArticle", "[[original text]] foo", CONTENT_MODEL_WIKITEXT );
$id = $page->getId();
@@ -268,6 +286,9 @@ class WikiPageTest extends MediaWikiLangTestCase {
$this->assertEquals( 0, $n, 'pagelinks should contain no more links from the page' );
}
+ /**
+ * @covers WikiPage::getRevision
+ */
public function testGetRevision() {
$page = $this->newPage( "WikiPageTest_testGetRevision" );
@@ -283,6 +304,9 @@ class WikiPageTest extends MediaWikiLangTestCase {
$this->assertEquals( "some text", $rev->getContent()->getNativeData() );
}
+ /**
+ * @covers WikiPage::getContent
+ */
public function testGetContent() {
$page = $this->newPage( "WikiPageTest_testGetContent" );
@@ -296,6 +320,9 @@ class WikiPageTest extends MediaWikiLangTestCase {
$this->assertEquals( "some text", $content->getNativeData() );
}
+ /**
+ * @covers WikiPage::getText
+ */
public function testGetText() {
$this->hideDeprecated( "WikiPage::getText" );
@@ -311,6 +338,9 @@ class WikiPageTest extends MediaWikiLangTestCase {
$this->assertEquals( "some text", $text );
}
+ /**
+ * @covers WikiPage::getRawText
+ */
public function testGetRawText() {
$this->hideDeprecated( "WikiPage::getRawText" );
@@ -326,6 +356,9 @@ class WikiPageTest extends MediaWikiLangTestCase {
$this->assertEquals( "some text", $text );
}
+ /**
+ * @covers WikiPage::getContentModel
+ */
public function testGetContentModel() {
global $wgContentHandlerUseDB;
@@ -339,6 +372,9 @@ class WikiPageTest extends MediaWikiLangTestCase {
$this->assertEquals( CONTENT_MODEL_JAVASCRIPT, $page->getContentModel() );
}
+ /**
+ * @covers WikiPage::getContentHandler
+ */
public function testGetContentHandler() {
global $wgContentHandlerUseDB;
@@ -352,6 +388,9 @@ class WikiPageTest extends MediaWikiLangTestCase {
$this->assertEquals( 'JavaScriptContentHandler', get_class( $page->getContentHandler() ) );
}
+ /**
+ * @covers WikiPage::exists
+ */
public function testExists() {
$page = $this->newPage( "WikiPageTest_testExists" );
$this->assertFalse( $page->exists() );
@@ -383,6 +422,7 @@ class WikiPageTest extends MediaWikiLangTestCase {
/**
* @dataProvider provideHasViewableContent
+ * @covers WikiPage::hasViewableContent
*/
public function testHasViewableContent( $title, $viewable, $create = false ) {
$page = $this->newPage( $title );
@@ -406,6 +446,7 @@ class WikiPageTest extends MediaWikiLangTestCase {
/**
* @dataProvider provideGetRedirectTarget
+ * @covers WikiPage::getRedirectTarget
*/
public function testGetRedirectTarget( $title, $model, $text, $target ) {
$page = $this->createPage( $title, $text, $model );
@@ -421,6 +462,7 @@ class WikiPageTest extends MediaWikiLangTestCase {
/**
* @dataProvider provideGetRedirectTarget
+ * @covers WikiPage::isRedirect
*/
public function testIsRedirect( $title, $model, $text, $target ) {
$page = $this->createPage( $title, $text, $model );
@@ -537,6 +579,7 @@ class WikiPageTest extends MediaWikiLangTestCase {
/**
* @dataProvider provideIsCountable
+ * @covers WikiPage::isCountable
*/
public function testIsCountable( $title, $model, $text, $mode, $expected ) {
global $wgContentHandlerUseDB;
@@ -569,12 +612,13 @@ class WikiPageTest extends MediaWikiLangTestCase {
public static function provideGetParserOutput() {
return array(
array( CONTENT_MODEL_WIKITEXT, "hello ''world''\n", "<p>hello <i>world</i></p>" ),
- // @todo: more...?
+ // @todo more...?
);
}
/**
* @dataProvider provideGetParserOutput
+ * @covers WikiPage::getParserOutput
*/
public function testGetParserOutput( $model, $text, $expectedHtml ) {
$page = $this->createPage( 'WikiPageTest_testGetParserOutput', $text, $model );
@@ -587,9 +631,13 @@ class WikiPageTest extends MediaWikiLangTestCase {
$text = preg_replace( '!\s*(</p>)!sm', '\1', $text ); # don't let tidy confuse us
$this->assertEquals( $expectedHtml, $text );
+
return $po;
}
+ /**
+ * @covers WikiPage::getParserOutput
+ */
public function testGetParserOutput_nonexisting() {
static $count = 0;
$count++;
@@ -602,13 +650,16 @@ class WikiPageTest extends MediaWikiLangTestCase {
$this->assertFalse( $po, "getParserOutput() shall return false for non-existing pages." );
}
+ /**
+ * @covers WikiPage::getParserOutput
+ */
public function testGetParserOutput_badrev() {
$page = $this->createPage( 'WikiPageTest_testGetParserOutput', "dummy", CONTENT_MODEL_WIKITEXT );
$opt = new ParserOptions();
$po = $page->getParserOutput( $opt, $page->getLatest() + 1234 );
- //@todo: would be neat to also test deleted revision
+ // @todo would be neat to also test deleted revision
$this->assertFalse( $po, "getParserOutput() shall return false for non-existing revisions." );
}
@@ -678,6 +729,7 @@ more stuff
/**
* @dataProvider dataReplaceSection
+ * @covers WikiPage::replaceSection
*/
public function testReplaceSection( $title, $model, $text, $section, $with, $sectionTitle, $expected ) {
$this->hideDeprecated( "WikiPage::replaceSection" );
@@ -691,6 +743,7 @@ more stuff
/**
* @dataProvider dataReplaceSection
+ * @covers WikiPage::replaceSectionContent
*/
public function testReplaceSectionContent( $title, $model, $text, $section, $with, $sectionTitle, $expected ) {
$page = $this->createPage( $title, $text, $model );
@@ -801,6 +854,7 @@ more stuff
/**
* @todo FIXME: the above rollback test is better, but it keeps failing in jenkins for some reason.
+ * @covers WikiPage::doRollback
*/
public function testDoRollback() {
$admin = new User();
@@ -877,6 +931,7 @@ more stuff
/**
* @dataProvider provideGetAutoSummary
+ * @covers WikiPage::getAutosummary
*/
public function testGetAutosummary( $old, $new, $flags, $expected ) {
$this->hideDeprecated( "WikiPage::getAutosummary" );
@@ -949,6 +1004,7 @@ more stuff
/**
* @dataProvider provideGetAutoDeleteReason
+ * @covers WikiPage::getAutoDeleteReason
*/
public function testGetAutoDeleteReason( $edits, $expectedResult, $expectedHistory ) {
global $wgUser;
@@ -1002,6 +1058,7 @@ more stuff
/**
* @dataProvider providePreSaveTransform
+ * @covers WikiPage::preSaveTransform
*/
public function testPreSaveTransform( $text, $expected ) {
$this->hideDeprecated( 'WikiPage::preSaveTransform' );
@@ -1014,5 +1071,4 @@ more stuff
$this->assertEquals( $expected, $text );
}
-
}
diff --git a/tests/phpunit/includes/WikiPageTest_ContentHandlerUseDB.php b/tests/phpunit/includes/WikiPageTest_ContentHandlerUseDB.php
index 1d937e9b..2a723e85 100644
--- a/tests/phpunit/includes/WikiPageTest_ContentHandlerUseDB.php
+++ b/tests/phpunit/includes/WikiPageTest_ContentHandlerUseDB.php
@@ -6,16 +6,10 @@
* ^--- important, causes temporary tables to be used instead of the real database
*/
class WikiPageTest_ContentHandlerUseDB extends WikiPageTest {
- var $saveContentHandlerNoDB = null;
-
- function setUp() {
- global $wgContentHandlerUseDB;
+ protected function setUp() {
parent::setUp();
-
- $this->saveContentHandlerNoDB = $wgContentHandlerUseDB;
-
- $wgContentHandlerUseDB = false;
+ $this->setMwGlobals( 'wgContentHandlerUseDB', false );
$dbw = wfGetDB( DB_MASTER );
@@ -32,14 +26,9 @@ class WikiPageTest_ContentHandlerUseDB extends WikiPageTest {
}
}
- function tearDown() {
- global $wgContentHandlerUseDB;
-
- $wgContentHandlerUseDB = $this->saveContentHandlerNoDB;
-
- parent::tearDown();
- }
-
+ /**
+ * @covers WikiPage::getContentModel
+ */
public function testGetContentModel() {
$page = $this->createPage( "WikiPageTest_testGetContentModel", "some text", CONTENT_MODEL_JAVASCRIPT );
@@ -50,6 +39,9 @@ class WikiPageTest_ContentHandlerUseDB extends WikiPageTest {
$this->assertEquals( CONTENT_MODEL_WIKITEXT, $page->getContentModel() );
}
+ /**
+ * @covers WikiPage::getContentHandler
+ */
public function testGetContentHandler() {
$page = $this->createPage( "WikiPageTest_testGetContentHandler", "some text", CONTENT_MODEL_JAVASCRIPT );
@@ -58,5 +50,4 @@ class WikiPageTest_ContentHandlerUseDB extends WikiPageTest {
$page = new WikiPage( $page->getTitle() );
$this->assertEquals( 'WikitextContentHandler', get_class( $page->getContentHandler() ) );
}
-
}
diff --git a/tests/phpunit/includes/XmlJsTest.php b/tests/phpunit/includes/XmlJsTest.php
index c5b411fb..161468e2 100644
--- a/tests/phpunit/includes/XmlJsTest.php
+++ b/tests/phpunit/includes/XmlJsTest.php
@@ -1,9 +1,24 @@
<?php
+
+/**
+ * @group Xml
+ */
class XmlJs extends MediaWikiTestCase {
- public function testConstruction() {
- $obj = new XmlJsCode( null );
- $this->assertNull( $obj->value );
- $obj = new XmlJsCode( '' );
- $this->assertSame( $obj->value, '' );
+
+ /**
+ * @covers XmlJsCode::__construct
+ * @dataProvider provideConstruction
+ */
+ public function testConstruction( $value ) {
+ $obj = new XmlJsCode( $value );
+ $this->assertEquals( $value, $obj->value );
}
+
+ public function provideConstruction(){
+ return array(
+ array( null ),
+ array( '' ),
+ );
+ }
+
}
diff --git a/tests/phpunit/includes/XmlSelectTest.php b/tests/phpunit/includes/XmlSelectTest.php
index d7227b4d..56d28b54 100644
--- a/tests/phpunit/includes/XmlSelectTest.php
+++ b/tests/phpunit/includes/XmlSelectTest.php
@@ -1,13 +1,18 @@
<?php
-// TODO
+/**
+ * @group Xml
+ */
class XmlSelectTest extends MediaWikiTestCase {
+
+ /**
+ * @var XmlSelect
+ */
protected $select;
protected function setUp() {
parent::setUp();
$this->setMwGlobals( array(
- 'wgHtml5' => true,
'wgWellFormedXml' => true,
) );
$this->select = new XmlSelect();
@@ -18,8 +23,9 @@ class XmlSelectTest extends MediaWikiTestCase {
$this->select = null;
}
- ### START OF TESTS ###
-
+ /**
+ * @covers XmlSelect::__construct
+ */
public function testConstructWithoutParameters() {
$this->assertEquals( '<select></select>', $this->select->getHTML() );
}
@@ -27,6 +33,7 @@ class XmlSelectTest extends MediaWikiTestCase {
/**
* Parameters are $name (false), $id (false), $default (false)
* @dataProvider provideConstructionParameters
+ * @covers XmlSelect::__construct
*/
public function testConstructParameters( $name, $id, $default, $expected ) {
$this->select = new XmlSelect( $name, $id, $default );
@@ -40,7 +47,6 @@ class XmlSelectTest extends MediaWikiTestCase {
* - $id (default: false)
* - $default (default: false)
* Provides a fourth parameters representing the expected HTML output
- *
*/
public static function provideConstructionParameters() {
return array(
@@ -61,29 +67,41 @@ class XmlSelectTest extends MediaWikiTestCase {
);
}
- # Begin XmlSelect::addOption() similar to Xml::option
+ /**
+ * @covers XmlSelect::addOption
+ */
public function testAddOption() {
$this->select->addOption( 'foo' );
$this->assertEquals( '<select><option value="foo">foo</option></select>', $this->select->getHTML() );
}
+ /**
+ * @covers XmlSelect::addOption
+ */
public function testAddOptionWithDefault() {
$this->select->addOption( 'foo', true );
$this->assertEquals( '<select><option value="1">foo</option></select>', $this->select->getHTML() );
}
+ /**
+ * @covers XmlSelect::addOption
+ */
public function testAddOptionWithFalse() {
$this->select->addOption( 'foo', false );
$this->assertEquals( '<select><option value="foo">foo</option></select>', $this->select->getHTML() );
}
+ /**
+ * @covers XmlSelect::addOption
+ */
public function testAddOptionWithValueZero() {
$this->select->addOption( 'foo', 0 );
$this->assertEquals( '<select><option value="0">foo</option></select>', $this->select->getHTML() );
}
- # End XmlSelect::addOption() similar to Xml::option
-
+ /**
+ * @covers XmlSelect::setDefault
+ */
public function testSetDefault() {
$this->select->setDefault( 'bar1' );
$this->select->addOption( 'foo1' );
@@ -99,6 +117,7 @@ class XmlSelectTest extends MediaWikiTestCase {
* Adding default later on should set the correct selection or
* raise an exception.
* To handle this, we need to render the options in getHtml()
+ * @covers XmlSelect::setDefault
*/
public function testSetDefaultAfterAddingOptions() {
$this->select->addOption( 'foo1' );
@@ -111,6 +130,10 @@ class XmlSelectTest extends MediaWikiTestCase {
'<option value="foo2">foo2</option></select>', $this->select->getHTML() );
}
+ /**
+ * @covers XmlSelect::setAttribute
+ * @covers XmlSelect::getAttribute
+ */
public function testGetAttributes() {
# create some attributes
$this->select->setAttribute( 'dummy', 0x777 );
diff --git a/tests/phpunit/includes/XmlTest.php b/tests/phpunit/includes/XmlTest.php
index f4823287..8205029f 100644
--- a/tests/phpunit/includes/XmlTest.php
+++ b/tests/phpunit/includes/XmlTest.php
@@ -1,8 +1,9 @@
<?php
+/**
+ * @group Xml
+ */
class XmlTest extends MediaWikiTestCase {
- private static $oldLang;
- private static $oldNamespaces;
protected function setUp() {
parent::setUp();
@@ -29,11 +30,13 @@ class XmlTest extends MediaWikiTestCase {
$this->setMwGlobals( array(
'wgLang' => $langObj,
- 'wgHtml5' => true,
'wgWellFormedXml' => true,
) );
}
+ /**
+ * @covers Xml::expandAttributes
+ */
public function testExpandAttributes() {
$this->assertNull( Xml::expandAttributes( null ),
'Converting a null list of attributes'
@@ -43,12 +46,18 @@ class XmlTest extends MediaWikiTestCase {
);
}
+ /**
+ * @covers Xml::expandAttributes
+ */
public function testExpandAttributesException() {
$this->setExpectedException( 'MWException' );
Xml::expandAttributes( 'string' );
}
- function testElementOpen() {
+ /**
+ * @covers Xml::element
+ */
+ public function testElementOpen() {
$this->assertEquals(
'<element>',
Xml::element( 'element', null, null ),
@@ -56,7 +65,10 @@ class XmlTest extends MediaWikiTestCase {
);
}
- function testElementEmpty() {
+ /**
+ * @covers Xml::element
+ */
+ public function testElementEmpty() {
$this->assertEquals(
'<element />',
Xml::element( 'element', null, '' ),
@@ -64,7 +76,10 @@ class XmlTest extends MediaWikiTestCase {
);
}
- function testElementInputCanHaveAValueOfZero() {
+ /**
+ * @covers Xml::input
+ */
+ public function testElementInputCanHaveAValueOfZero() {
$this->assertEquals(
'<input name="name" value="0" />',
Xml::input( 'name', false, 0 ),
@@ -72,7 +87,10 @@ class XmlTest extends MediaWikiTestCase {
);
}
- function testElementEscaping() {
+ /**
+ * @covers Xml::element
+ */
+ public function testElementEscaping() {
$this->assertEquals(
'<element>hello &lt;there&gt; you &amp; you</element>',
Xml::element( 'element', null, 'hello <there> you & you' ),
@@ -80,13 +98,19 @@ class XmlTest extends MediaWikiTestCase {
);
}
+ /**
+ * @covers Xml::escapeTagsOnly
+ */
public function testEscapeTagsOnly() {
$this->assertEquals( '&quot;&gt;&lt;', Xml::escapeTagsOnly( '"><' ),
'replace " > and < with their HTML entitites'
);
}
- function testElementAttributes() {
+ /**
+ * @covers Xml::element
+ */
+ public function testElementAttributes() {
$this->assertEquals(
'<element key="value" <>="&lt;&gt;">',
Xml::element( 'element', array( 'key' => 'value', '<>' => '<>' ), null ),
@@ -94,7 +118,10 @@ class XmlTest extends MediaWikiTestCase {
);
}
- function testOpenElement() {
+ /**
+ * @covers Xml::openElement
+ */
+ public function testOpenElement() {
$this->assertEquals(
'<element k="v">',
Xml::openElement( 'element', array( 'k' => 'v' ) ),
@@ -102,10 +129,16 @@ class XmlTest extends MediaWikiTestCase {
);
}
- function testCloseElement() {
+ /**
+ * @covers Xml::closeElement
+ */
+ public function testCloseElement() {
$this->assertEquals( '</element>', Xml::closeElement( 'element' ), 'closeElement() shortcut' );
}
+ /**
+ * @covers Xml::dateMenu
+ */
public function testDateMenu() {
$curYear = intval( gmdate( 'Y' ) );
$prevYear = $curYear - 1;
@@ -186,10 +219,10 @@ class XmlTest extends MediaWikiTestCase {
);
}
- #
- # textarea
- #
- function testTextareaNoContent() {
+ /**
+ * @covers Xml::textarea
+ */
+ public function testTextareaNoContent() {
$this->assertEquals(
'<textarea name="name" id="name" cols="40" rows="5"></textarea>',
Xml::textarea( 'name', '' ),
@@ -197,7 +230,10 @@ class XmlTest extends MediaWikiTestCase {
);
}
- function testTextareaAttribs() {
+ /**
+ * @covers Xml::textarea
+ */
+ public function testTextareaAttribs() {
$this->assertEquals(
'<textarea name="name" id="name" cols="20" rows="10">&lt;txt&gt;</textarea>',
Xml::textarea( 'name', '<txt>', 20, 10 ),
@@ -205,10 +241,10 @@ class XmlTest extends MediaWikiTestCase {
);
}
- #
- # input and label
- #
- function testLabelCreation() {
+ /**
+ * @covers Xml::label
+ */
+ public function testLabelCreation() {
$this->assertEquals(
'<label for="id">name</label>',
Xml::label( 'name', 'id' ),
@@ -216,7 +252,10 @@ class XmlTest extends MediaWikiTestCase {
);
}
- function testLabelAttributeCanOnlyBeClassOrTitle() {
+ /**
+ * @covers Xml::label
+ */
+ public function testLabelAttributeCanOnlyBeClassOrTitle() {
$this->assertEquals(
'<label for="id">name</label>',
Xml::label( 'name', 'id', array( 'generated' => true ) ),
@@ -245,7 +284,10 @@ class XmlTest extends MediaWikiTestCase {
);
}
- function testLanguageSelector() {
+ /**
+ * @covers Xml::languageSelector
+ */
+ public function testLanguageSelector() {
$select = Xml::languageSelector( 'en', true, null,
array( 'id' => 'testlang' ), wfMessage( 'yourlanguage' ) );
$this->assertEquals(
@@ -254,10 +296,10 @@ class XmlTest extends MediaWikiTestCase {
);
}
- #
- # JS
- #
- function testEscapeJsStringSpecialChars() {
+ /**
+ * @covers Xml::escapeJsString
+ */
+ public function testEscapeJsStringSpecialChars() {
$this->assertEquals(
'\\\\\r\n',
Xml::escapeJsString( "\\\r\n" ),
@@ -265,7 +307,10 @@ class XmlTest extends MediaWikiTestCase {
);
}
- function testEncodeJsVarBoolean() {
+ /**
+ * @covers Xml::encodeJsVar
+ */
+ public function testEncodeJsVarBoolean() {
$this->assertEquals(
'true',
Xml::encodeJsVar( true ),
@@ -273,7 +318,10 @@ class XmlTest extends MediaWikiTestCase {
);
}
- function testEncodeJsVarNull() {
+ /**
+ * @covers Xml::encodeJsVar
+ */
+ public function testEncodeJsVarNull() {
$this->assertEquals(
'null',
Xml::encodeJsVar( null ),
@@ -281,7 +329,10 @@ class XmlTest extends MediaWikiTestCase {
);
}
- function testEncodeJsVarArray() {
+ /**
+ * @covers Xml::encodeJsVar
+ */
+ public function testEncodeJsVarArray() {
$this->assertEquals(
'["a",1]',
Xml::encodeJsVar( array( 'a', 1 ) ),
@@ -294,7 +345,10 @@ class XmlTest extends MediaWikiTestCase {
);
}
- function testEncodeJsVarObject() {
+ /**
+ * @covers Xml::encodeJsVar
+ */
+ public function testEncodeJsVarObject() {
$this->assertEquals(
'{"a":"a","b":1}',
Xml::encodeJsVar( (object)array( 'a' => 'a', 'b' => 1 ) ),
@@ -302,7 +356,10 @@ class XmlTest extends MediaWikiTestCase {
);
}
- function testEncodeJsVarInt() {
+ /**
+ * @covers Xml::encodeJsVar
+ */
+ public function testEncodeJsVarInt() {
$this->assertEquals(
'123456',
Xml::encodeJsVar( 123456 ),
@@ -310,7 +367,10 @@ class XmlTest extends MediaWikiTestCase {
);
}
- function testEncodeJsVarFloat() {
+ /**
+ * @covers Xml::encodeJsVar
+ */
+ public function testEncodeJsVarFloat() {
$this->assertEquals(
'1.23456',
Xml::encodeJsVar( 1.23456 ),
@@ -318,7 +378,10 @@ class XmlTest extends MediaWikiTestCase {
);
}
- function testEncodeJsVarIntString() {
+ /**
+ * @covers Xml::encodeJsVar
+ */
+ public function testEncodeJsVarIntString() {
$this->assertEquals(
'"123456"',
Xml::encodeJsVar( '123456' ),
@@ -326,7 +389,10 @@ class XmlTest extends MediaWikiTestCase {
);
}
- function testEncodeJsVarFloatString() {
+ /**
+ * @covers Xml::encodeJsVar
+ */
+ public function testEncodeJsVarFloatString() {
$this->assertEquals(
'"1.23456"',
Xml::encodeJsVar( '1.23456' ),
diff --git a/tests/phpunit/includes/XmlTypeCheckTest.php b/tests/phpunit/includes/XmlTypeCheckTest.php
new file mode 100644
index 00000000..8d6f1ed7
--- /dev/null
+++ b/tests/phpunit/includes/XmlTypeCheckTest.php
@@ -0,0 +1,30 @@
+<?php
+/**
+ * PHPUnit tests for XMLTypeCheck.
+ * @author physikerwelt
+ * @group Xml
+ * @covers XMLTypeCheck
+ */
+class XmlTypeCheckTest extends MediaWikiTestCase {
+ const WELL_FORMED_XML = "<root><child /></root>";
+ const MAL_FORMED_XML = "<root><child /></error>";
+
+ /**
+ * @covers XMLTypeCheck::newFromString
+ * @covers XMLTypeCheck::getRootElement
+ */
+ public function testWellFormedXML() {
+ $testXML = XmlTypeCheck::newFromString( self::WELL_FORMED_XML );
+ $this->assertTrue( $testXML->wellFormed );
+ $this->assertEquals( 'root', $testXML->getRootElement() );
+ }
+
+ /**
+ * @covers XMLTypeCheck::newFromString
+ */
+ public function testMalFormedXML() {
+ $testXML = XmlTypeCheck::newFromString( self::MAL_FORMED_XML );
+ $this->assertFalse( $testXML->wellFormed );
+ }
+
+}
diff --git a/tests/phpunit/includes/ZipDirectoryReaderTest.php b/tests/phpunit/includes/ZipDirectoryReaderTest.php
index 3fea57a0..2627a417 100644
--- a/tests/phpunit/includes/ZipDirectoryReaderTest.php
+++ b/tests/phpunit/includes/ZipDirectoryReaderTest.php
@@ -1,7 +1,12 @@
<?php
+/**
+ * @covers ZipDirectoryReader
+ * NOTE: this test is more like an integration test than a unit test
+ */
class ZipDirectoryReaderTest extends MediaWikiTestCase {
- var $zipDir, $entries;
+ protected $zipDir;
+ protected $entries;
protected function setUp() {
parent::setUp();
@@ -24,21 +29,21 @@ class ZipDirectoryReaderTest extends MediaWikiTestCase {
$this->assertTrue( $status->isOK(), $assertMessage );
}
- function testEmpty() {
+ public function testEmpty() {
$this->readZipAssertSuccess( 'empty.zip', 'Empty zip' );
}
- function testMultiDisk0() {
+ public function testMultiDisk0() {
$this->readZipAssertError( 'split.zip', 'zip-unsupported',
'Split zip error' );
}
- function testNoSignature() {
+ public function testNoSignature() {
$this->readZipAssertError( 'nosig.zip', 'zip-wrong-format',
'No signature should give "wrong format" error' );
}
- function testSimple() {
+ public function testSimple() {
$this->readZipAssertSuccess( 'class.zip', 'Simple ZIP' );
$this->assertEquals( $this->entries, array( array(
'name' => 'Class.class',
@@ -47,33 +52,33 @@ class ZipDirectoryReaderTest extends MediaWikiTestCase {
) ) );
}
- function testBadCentralEntrySignature() {
+ public function testBadCentralEntrySignature() {
$this->readZipAssertError( 'wrong-central-entry-sig.zip', 'zip-bad',
'Bad central entry error' );
}
- function testTrailingBytes() {
+ public function testTrailingBytes() {
$this->readZipAssertError( 'trail.zip', 'zip-bad',
'Trailing bytes error' );
}
- function testWrongCDStart() {
+ public function testWrongCDStart() {
$this->readZipAssertError( 'wrong-cd-start-disk.zip', 'zip-unsupported',
'Wrong CD start disk error' );
}
- function testCentralDirectoryGap() {
+ public function testCentralDirectoryGap() {
$this->readZipAssertError( 'cd-gap.zip', 'zip-bad',
'CD gap error' );
}
- function testCentralDirectoryTruncated() {
+ public function testCentralDirectoryTruncated() {
$this->readZipAssertError( 'cd-truncated.zip', 'zip-bad',
'CD truncated error (should hit unpack() overrun)' );
}
- function testLooksLikeZip64() {
+ public function testLooksLikeZip64() {
$this->readZipAssertError( 'looks-like-zip64.zip', 'zip-unsupported',
'A file which looks like ZIP64 but isn\'t, should give error' );
}
diff --git a/tests/phpunit/includes/api/ApiAccountCreationTest.php b/tests/phpunit/includes/api/ApiAccountCreationTest.php
index 94082e5a..68f80ac9 100644
--- a/tests/phpunit/includes/api/ApiAccountCreationTest.php
+++ b/tests/phpunit/includes/api/ApiAccountCreationTest.php
@@ -20,7 +20,7 @@ class ApiCreateAccountTest extends ApiTestCase {
* a bit slow. Raise the default timeout.
* @group medium
*/
- function testValid() {
+ public function testValid() {
global $wgServer;
if ( !isset( $wgServer ) ) {
@@ -47,13 +47,16 @@ class ApiCreateAccountTest extends ApiTestCase {
$token = $a['token'];
// Finally create the account
- $ret = $this->doApiRequest( array(
- 'action' => 'createaccount',
- 'name' => 'Apitestnew',
- 'password' => $password,
- 'token' => $token,
- 'email' => 'test@domain.test',
- 'realname' => 'Test Name' ), $ret[2]
+ $ret = $this->doApiRequest(
+ array(
+ 'action' => 'createaccount',
+ 'name' => 'Apitestnew',
+ 'password' => $password,
+ 'token' => $token,
+ 'email' => 'test@domain.test',
+ 'realname' => 'Test Name'
+ ),
+ $ret[2]
);
$result = $ret[0];
@@ -65,8 +68,7 @@ class ApiCreateAccountTest extends ApiTestCase {
'action' => 'login',
'lgname' => 'Apitestnew',
'lgpassword' => $password,
- )
- );
+ ) );
$result = $ret[0];
$this->assertNotInternalType( 'bool', $result );
@@ -76,12 +78,14 @@ class ApiCreateAccountTest extends ApiTestCase {
$this->assertEquals( 'NeedToken', $a );
$token = $result['login']['token'];
- $ret = $this->doApiRequest( array(
- 'action' => 'login',
- 'lgtoken' => $token,
- 'lgname' => 'Apitestnew',
- 'lgpassword' => $password,
- ), $ret[2]
+ $ret = $this->doApiRequest(
+ array(
+ 'action' => 'login',
+ 'lgtoken' => $token,
+ 'lgname' => 'Apitestnew',
+ 'lgpassword' => $password,
+ ),
+ $ret[2]
);
$result = $ret[0];
@@ -92,9 +96,11 @@ class ApiCreateAccountTest extends ApiTestCase {
$this->assertEquals( 'Success', $a );
// log out to destroy the session
- $ret = $this->doApiRequest( array(
- 'action' => 'logout',
- ), $ret[2]
+ $ret = $this->doApiRequest(
+ array(
+ 'action' => 'logout',
+ ),
+ $ret[2]
);
$this->assertEquals( array(), $ret[0] );
}
@@ -103,8 +109,8 @@ class ApiCreateAccountTest extends ApiTestCase {
* Make sure requests with no names are invalid.
* @expectedException UsageException
*/
- function testNoName() {
- $ret = $this->doApiRequest( array(
+ public function testNoName() {
+ $this->doApiRequest( array(
'action' => 'createaccount',
'token' => LoginForm::getCreateaccountToken(),
'password' => 'password',
@@ -115,8 +121,8 @@ class ApiCreateAccountTest extends ApiTestCase {
* Make sure requests with no password are invalid.
* @expectedException UsageException
*/
- function testNoPassword() {
- $ret = $this->doApiRequest( array(
+ public function testNoPassword() {
+ $this->doApiRequest( array(
'action' => 'createaccount',
'name' => 'testName',
'token' => LoginForm::getCreateaccountToken(),
@@ -127,7 +133,7 @@ class ApiCreateAccountTest extends ApiTestCase {
* Make sure requests with existing users are invalid.
* @expectedException UsageException
*/
- function testExistingUser() {
+ public function testExistingUser() {
$this->doApiRequest( array(
'action' => 'createaccount',
'name' => 'Apitestsysop',
@@ -141,7 +147,7 @@ class ApiCreateAccountTest extends ApiTestCase {
* Make sure requests with invalid emails are invalid.
* @expectedException UsageException
*/
- function testInvalidEmail() {
+ public function testInvalidEmail() {
$this->doApiRequest( array(
'action' => 'createaccount',
'name' => 'Test User',
diff --git a/tests/phpunit/includes/api/ApiBlockTest.php b/tests/phpunit/includes/api/ApiBlockTest.php
index 94643b10..8afb748a 100644
--- a/tests/phpunit/includes/api/ApiBlockTest.php
+++ b/tests/phpunit/includes/api/ApiBlockTest.php
@@ -6,7 +6,6 @@
* @group medium
*/
class ApiBlockTest extends ApiTestCase {
-
protected function setUp() {
parent::setUp();
$this->doLogin();
@@ -35,9 +34,8 @@ class ApiBlockTest extends ApiTestCase {
* Which made the Block/Unblock API to actually verify the token
* previously always considered valid (bug 34212).
*/
- function testMakeNormalBlock() {
-
- $data = $this->getTokens();
+ public function testMakeNormalBlock() {
+ $tokens = $this->getTokens();
$user = User::newFromName( 'UTApiBlockee' );
@@ -45,19 +43,15 @@ class ApiBlockTest extends ApiTestCase {
$this->markTestIncomplete( "The user UTApiBlockee does not exist" );
}
- if ( !isset( $data[0]['query']['pages'] ) ) {
+ if ( !array_key_exists( 'blocktoken', $tokens ) ) {
$this->markTestIncomplete( "No block token found" );
}
- $keys = array_keys( $data[0]['query']['pages'] );
- $key = array_pop( $keys );
- $pageinfo = $data[0]['query']['pages'][$key];
-
- $data = $this->doApiRequest( array(
+ $this->doApiRequest( array(
'action' => 'block',
'user' => 'UTApiBlockee',
'reason' => 'Some reason',
- 'token' => $pageinfo['blocktoken'] ), null, false, self::$users['sysop']->user );
+ 'token' => $tokens['blocktoken'] ), null, false, self::$users['sysop']->user );
$block = Block::newFromTarget( 'UTApiBlockee' );
@@ -66,7 +60,6 @@ class ApiBlockTest extends ApiTestCase {
$this->assertEquals( 'UTApiBlockee', (string)$block->getTarget() );
$this->assertEquals( 'Some reason', $block->mReason );
$this->assertEquals( 'infinity', $block->mExpiry );
-
}
/**
@@ -77,7 +70,7 @@ class ApiBlockTest extends ApiTestCase {
* @dataProvider provideBlockUnblockAction
* @expectedException UsageException
*/
- function testBlockingActionWithNoToken( $action ) {
+ public function testBlockingActionWithNoToken( $action ) {
$this->doApiRequest(
array(
'action' => $action,
@@ -93,7 +86,7 @@ class ApiBlockTest extends ApiTestCase {
/**
* Just provide the 'block' and 'unblock' action to test both API calls
*/
- function provideBlockUnblockAction() {
+ public static function provideBlockUnblockAction() {
return array(
array( 'block' ),
array( 'unblock' ),
diff --git a/tests/phpunit/includes/api/ApiEditPageTest.php b/tests/phpunit/includes/api/ApiEditPageTest.php
index 1efbaeaf..0c49b12b 100644
--- a/tests/phpunit/includes/api/ApiEditPageTest.php
+++ b/tests/phpunit/includes/api/ApiEditPageTest.php
@@ -11,10 +11,10 @@
*/
class ApiEditPageTest extends ApiTestCase {
- public function setup() {
+ public function setUp() {
global $wgExtraNamespaces, $wgNamespaceContentModels, $wgContentHandlers, $wgContLang;
- parent::setup();
+ parent::setUp();
$wgExtraNamespaces[12312] = 'Dummy';
$wgExtraNamespaces[12313] = 'Dummy_talk';
@@ -28,7 +28,7 @@ class ApiEditPageTest extends ApiTestCase {
$this->doLogin();
}
- public function teardown() {
+ public function tearDown() {
global $wgExtraNamespaces, $wgNamespaceContentModels, $wgContentHandlers, $wgContLang;
unset( $wgExtraNamespaces[12312] );
@@ -40,10 +40,10 @@ class ApiEditPageTest extends ApiTestCase {
MWNamespace::getCanonicalNamespaces( true ); # reset namespace cache
$wgContLang->resetNamespaces(); # reset namespace cache
- parent::teardown();
+ parent::tearDown();
}
- function testEdit() {
+ public function testEdit() {
$name = 'Help:ApiEditPageTest_testEdit'; // assume Help namespace to default to wikitext
// -- test new page --------------------------------------------
@@ -97,7 +97,7 @@ class ApiEditPageTest extends ApiTestCase {
);
}
- function testNonTextEdit() {
+ public function testNonTextEdit() {
$name = 'Dummy:ApiEditPageTest_testNonTextEdit';
$data = serialize( 'some bla bla text' );
@@ -124,7 +124,7 @@ class ApiEditPageTest extends ApiTestCase {
$this->assertEquals( $data, $page->getContent()->serialize() );
}
- static function provideEditAppend() {
+ public static function provideEditAppend() {
return array(
array( #0: append
'foo', 'append', 'bar', "foobar"
@@ -150,7 +150,7 @@ class ApiEditPageTest extends ApiTestCase {
/**
* @dataProvider provideEditAppend
*/
- function testEditAppend( $text, $op, $append, $expected ) {
+ public function testEditAppend( $text, $op, $append, $expected ) {
static $count = 0;
$count++;
@@ -161,13 +161,13 @@ class ApiEditPageTest extends ApiTestCase {
if ( $text !== null ) {
if ( $text === '' ) {
// can't create an empty page, so create it with some content
- list( $re, , ) = $this->doApiRequestWithToken( array(
+ $this->doApiRequestWithToken( array(
'action' => 'edit',
'title' => $name,
'text' => '(dummy)', ) );
}
- list( $re, , ) = $this->doApiRequestWithToken( array(
+ list( $re ) = $this->doApiRequestWithToken( array(
'action' => 'edit',
'title' => $name,
'text' => $text, ) );
@@ -176,7 +176,7 @@ class ApiEditPageTest extends ApiTestCase {
}
// -- try append/prepend --------------------------------------------
- list( $re, , ) = $this->doApiRequestWithToken( array(
+ list( $re ) = $this->doApiRequestWithToken( array(
'action' => 'edit',
'title' => $name,
$op . 'text' => $append, ) );
@@ -193,15 +193,80 @@ class ApiEditPageTest extends ApiTestCase {
$this->assertEquals( $expected, $text );
}
- function testEditSection() {
- $this->markTestIncomplete( "not yet implemented" );
+ /**
+ * Test editing of sections
+ */
+ public function testEditSection() {
+ $name = 'Help:ApiEditPageTest_testEditSection';
+ $page = WikiPage::factory( Title::newFromText( $name ) );
+ $text = "==section 1==\ncontent 1\n==section 2==\ncontent2";
+ // Preload the page with some text
+ $page->doEditContent( ContentHandler::makeContent( $text, $page->getTitle() ), 'summary' );
+
+ list( $re ) = $this->doApiRequestWithToken( array(
+ 'action' => 'edit',
+ 'title' => $name,
+ 'section' => '1',
+ 'text' => "==section 1==\nnew content 1",
+ ) );
+ $this->assertEquals( 'Success', $re['edit']['result'] );
+ $newtext = WikiPage::factory( Title::newFromText( $name) )->getContent( Revision::RAW )->getNativeData();
+ $this->assertEquals( $newtext, "==section 1==\nnew content 1\n\n==section 2==\ncontent2" );
+
+ // Test that we raise a 'nosuchsection' error
+ try {
+ $this->doApiRequestWithToken( array(
+ 'action' => 'edit',
+ 'title' => $name,
+ 'section' => '9999',
+ 'text' => 'text',
+ ) );
+ $this->fail( "Should have raised a UsageException" );
+ } catch ( UsageException $e ) {
+ $this->assertEquals( $e->getCodeString(), 'nosuchsection' );
+ }
}
- function testUndo() {
- $this->markTestIncomplete( "not yet implemented" );
+ /**
+ * Test action=edit&section=new
+ * Run it twice so we test adding a new section on a
+ * page that doesn't exist (bug 52830) and one that
+ * does exist
+ */
+ public function testEditNewSection() {
+ $name = 'Help:ApiEditPageTest_testEditNewSection';
+
+ // Test on a page that does not already exist
+ $this->assertFalse( Title::newFromText( $name )->exists() );
+ list( $re ) = $this->doApiRequestWithToken( array(
+ 'action' => 'edit',
+ 'title' => $name,
+ 'section' => 'new',
+ 'text' => 'test',
+ 'summary' => 'header',
+ ));
+
+ $this->assertEquals( 'Success', $re['edit']['result'] );
+ // Check the page text is correct
+ $text = WikiPage::factory( Title::newFromText( $name ) )->getContent( Revision::RAW )->getNativeData();
+ $this->assertEquals( $text, "== header ==\n\ntest" );
+
+ // Now on one that does
+ $this->assertTrue( Title::newFromText( $name )->exists() );
+ list( $re2 ) = $this->doApiRequestWithToken( array(
+ 'action' => 'edit',
+ 'title' => $name,
+ 'section' => 'new',
+ 'text' => 'test',
+ 'summary' => 'header',
+ ));
+
+ $this->assertEquals( 'Success', $re2['edit']['result'] );
+ $text = WikiPage::factory( Title::newFromText( $name ) )->getContent( Revision::RAW )->getNativeData();
+ $this->assertEquals( $text, "== header ==\n\ntest\n\n== header ==\n\ntest" );
}
- function testEditConflict() {
+ public function testEditConflict() {
static $count = 0;
$count++;
@@ -224,7 +289,7 @@ class ApiEditPageTest extends ApiTestCase {
// try to save edit, expect conflict
try {
- list( $re, , ) = $this->doApiRequestWithToken( array(
+ $this->doApiRequestWithToken( array(
'action' => 'edit',
'title' => $name,
'text' => 'nix bar!',
@@ -237,7 +302,7 @@ class ApiEditPageTest extends ApiTestCase {
}
}
- function testEditConflict_redirect() {
+ public function testEditConflict_redirect() {
static $count = 0;
$count++;
@@ -280,7 +345,7 @@ class ApiEditPageTest extends ApiTestCase {
// try again, without following the redirect. Should fail.
try {
- list( $re, , ) = $this->doApiRequestWithToken( array(
+ $this->doApiRequestWithToken( array(
'action' => 'edit',
'title' => $rname,
'text' => 'nix bar!',
@@ -293,13 +358,13 @@ class ApiEditPageTest extends ApiTestCase {
}
}
- function testEditConflict_bug41990() {
+ public function testEditConflict_bug41990() {
static $count = 0;
$count++;
/*
* bug 41990: if the target page has a newer revision than the redirect, then editing the
- * redirect while specifying 'redirect' and *not* specifying 'basetimestamp' erronously
+ * redirect while specifying 'redirect' and *not* specifying 'basetimestamp' erroneously
* caused an edit conflict to be detected.
*/
diff --git a/tests/phpunit/includes/api/ApiOptionsTest.php b/tests/phpunit/includes/api/ApiOptionsTest.php
index 902b7b85..ad1e73ab 100644
--- a/tests/phpunit/includes/api/ApiOptionsTest.php
+++ b/tests/phpunit/includes/api/ApiOptionsTest.php
@@ -20,9 +20,11 @@ class ApiOptionsTest extends MediaWikiLangTestCase {
->disableOriginalConstructor()
->getMock();
- // Set up groups
+ // Set up groups and rights
$this->mUserMock->expects( $this->any() )
->method( 'getEffectiveGroups' )->will( $this->returnValue( array( '*', 'user' ) ) );
+ $this->mUserMock->expects( $this->any() )
+ ->method( 'isAllowed' )->will( $this->returnValue( true ) );
// Set up callback for User::getOptionKinds
$this->mUserMock->expects( $this->any() )
@@ -116,6 +118,7 @@ class ApiOptionsTest extends MediaWikiLangTestCase {
$mapping[$key] = 'unused';
}
}
+
return $mapping;
}
@@ -126,12 +129,14 @@ class ApiOptionsTest extends MediaWikiLangTestCase {
'optionname' => null,
'optionvalue' => null,
);
+
return array_merge( $request, $custom );
}
private function executeQuery( $request ) {
$this->mContext->setRequest( new FauxRequest( $request, true, $this->mSession ) );
$this->mTested->execute();
+
return $this->mTested->getResult()->getData();
}
@@ -156,6 +161,7 @@ class ApiOptionsTest extends MediaWikiLangTestCase {
} catch ( UsageException $e ) {
$this->assertEquals( 'notloggedin', $e->getCodeString() );
$this->assertEquals( 'Anonymous users cannot change preferences', $e->getMessage() );
+
return;
}
$this->fail( "UsageException was not thrown" );
@@ -169,6 +175,7 @@ class ApiOptionsTest extends MediaWikiLangTestCase {
} catch ( UsageException $e ) {
$this->assertEquals( 'nooptionname', $e->getCodeString() );
$this->assertEquals( 'The optionname parameter must be set', $e->getMessage() );
+
return;
}
$this->fail( "UsageException was not thrown" );
@@ -191,6 +198,7 @@ class ApiOptionsTest extends MediaWikiLangTestCase {
} catch ( UsageException $e ) {
$this->assertEquals( 'nochanges', $e->getCodeString() );
$this->assertEquals( 'No changes were requested', $e->getMessage() );
+
return;
}
$this->fail( "UsageException was not thrown" );
@@ -274,21 +282,21 @@ class ApiOptionsTest extends MediaWikiLangTestCase {
$this->mUserMock->expects( $this->at( 2 ) )
->method( 'getOptions' );
- $this->mUserMock->expects( $this->at( 3 ) )
+ $this->mUserMock->expects( $this->at( 4 ) )
->method( 'setOption' )
->with( $this->equalTo( 'willBeNull' ), $this->identicalTo( null ) );
- $this->mUserMock->expects( $this->at( 4 ) )
+ $this->mUserMock->expects( $this->at( 5 ) )
->method( 'getOptions' );
- $this->mUserMock->expects( $this->at( 5 ) )
+ $this->mUserMock->expects( $this->at( 6 ) )
->method( 'setOption' )
->with( $this->equalTo( 'willBeEmpty' ), $this->equalTo( '' ) );
- $this->mUserMock->expects( $this->at( 6 ) )
+ $this->mUserMock->expects( $this->at( 7 ) )
->method( 'getOptions' );
- $this->mUserMock->expects( $this->at( 7 ) )
+ $this->mUserMock->expects( $this->at( 8 ) )
->method( 'setOption' )
->with( $this->equalTo( 'willBeHappy' ), $this->equalTo( 'Happy' ) );
@@ -306,17 +314,17 @@ class ApiOptionsTest extends MediaWikiLangTestCase {
$this->mUserMock->expects( $this->once() )
->method( 'resetOptions' );
- $this->mUserMock->expects( $this->at( 3 ) )
+ $this->mUserMock->expects( $this->at( 4 ) )
->method( 'getOptions' );
- $this->mUserMock->expects( $this->at( 4 ) )
+ $this->mUserMock->expects( $this->at( 5 ) )
->method( 'setOption' )
->with( $this->equalTo( 'willBeHappy' ), $this->equalTo( 'Happy' ) );
- $this->mUserMock->expects( $this->at( 5 ) )
+ $this->mUserMock->expects( $this->at( 6 ) )
->method( 'getOptions' );
- $this->mUserMock->expects( $this->at( 6 ) )
+ $this->mUserMock->expects( $this->at( 7 ) )
->method( 'setOption' )
->with( $this->equalTo( 'name' ), $this->equalTo( 'value' ) );
@@ -339,19 +347,19 @@ class ApiOptionsTest extends MediaWikiLangTestCase {
$this->mUserMock->expects( $this->never() )
->method( 'resetOptions' );
- $this->mUserMock->expects( $this->at( 2 ) )
+ $this->mUserMock->expects( $this->at( 3 ) )
->method( 'setOption' )
->with( $this->equalTo( 'testmultiselect-opt1' ), $this->identicalTo( true ) );
- $this->mUserMock->expects( $this->at( 3 ) )
+ $this->mUserMock->expects( $this->at( 4 ) )
->method( 'setOption' )
->with( $this->equalTo( 'testmultiselect-opt2' ), $this->identicalTo( null ) );
- $this->mUserMock->expects( $this->at( 4 ) )
+ $this->mUserMock->expects( $this->at( 5 ) )
->method( 'setOption' )
->with( $this->equalTo( 'testmultiselect-opt3' ), $this->identicalTo( false ) );
- $this->mUserMock->expects( $this->at( 5 ) )
+ $this->mUserMock->expects( $this->at( 6 ) )
->method( 'setOption' )
->with( $this->equalTo( 'testmultiselect-opt4' ), $this->identicalTo( false ) );
@@ -394,7 +402,7 @@ class ApiOptionsTest extends MediaWikiLangTestCase {
$this->mUserMock->expects( $this->never() )
->method( 'resetOptions' );
- $this->mUserMock->expects( $this->at( 2 ) )
+ $this->mUserMock->expects( $this->at( 3 ) )
->method( 'setOption' )
->with( $this->equalTo( 'userjs-option' ), $this->equalTo( '1' ) );
diff --git a/tests/phpunit/includes/api/ApiParseTest.php b/tests/phpunit/includes/api/ApiParseTest.php
index a42e5aa5..2d714e65 100644
--- a/tests/phpunit/includes/api/ApiParseTest.php
+++ b/tests/phpunit/includes/api/ApiParseTest.php
@@ -12,11 +12,11 @@ class ApiParseTest extends ApiTestCase {
$this->doLogin();
}
- function testParseNonexistentPage() {
+ public function testParseNonexistentPage() {
$somePage = mt_rand();
try {
- $data = $this->doApiRequest( array(
+ $this->doApiRequest( array(
'action' => 'parse',
'page' => $somePage ) );
@@ -26,5 +26,4 @@ class ApiParseTest extends ApiTestCase {
"Parse request for nonexistent page must give 'missingtitle' error: " . var_export( $ex->getMessageArray(), true ) );
}
}
-
}
diff --git a/tests/phpunit/includes/api/ApiPurgeTest.php b/tests/phpunit/includes/api/ApiPurgeTest.php
index a7f9229d..28b5ff4d 100644
--- a/tests/phpunit/includes/api/ApiPurgeTest.php
+++ b/tests/phpunit/includes/api/ApiPurgeTest.php
@@ -15,7 +15,7 @@ class ApiPurgeTest extends ApiTestCase {
/**
* @group Broken
*/
- function testPurgeMainPage() {
+ public function testPurgeMainPage() {
if ( !Title::newFromText( 'UTPage' )->exists() ) {
$this->markTestIncomplete( "The article [[UTPage]] does not exist" );
}
@@ -37,5 +37,4 @@ class ApiPurgeTest extends ApiTestCase {
$this->assertArrayHasKey( $pages[$v['title']], $v );
}
}
-
}
diff --git a/tests/phpunit/includes/api/ApiTest.php b/tests/phpunit/includes/api/ApiTest.php
index 22770288..472f8c4a 100644
--- a/tests/phpunit/includes/api/ApiTest.php
+++ b/tests/phpunit/includes/api/ApiTest.php
@@ -7,7 +7,7 @@
*/
class ApiTest extends ApiTestCase {
- function testRequireOnlyOneParameterDefault() {
+ public function testRequireOnlyOneParameterDefault() {
$mock = new MockApi();
$this->assertEquals(
@@ -18,7 +18,7 @@ class ApiTest extends ApiTestCase {
/**
* @expectedException UsageException
*/
- function testRequireOnlyOneParameterZero() {
+ public function testRequireOnlyOneParameterZero() {
$mock = new MockApi();
$this->assertEquals(
@@ -29,7 +29,7 @@ class ApiTest extends ApiTestCase {
/**
* @expectedException UsageException
*/
- function testRequireOnlyOneParameterTrue() {
+ public function testRequireOnlyOneParameterTrue() {
$mock = new MockApi();
$this->assertEquals(
@@ -43,7 +43,7 @@ class ApiTest extends ApiTestCase {
*
* @expectedException UsageException
*/
- function testApi() {
+ public function testApi() {
$api = new ApiMain(
new FauxRequest( array( 'action' => 'help', 'format' => 'xml' ) )
);
@@ -61,14 +61,14 @@ class ApiTest extends ApiTestCase {
/**
* Test result of attempted login with an empty username
*/
- function testApiLoginNoName() {
+ public function testApiLoginNoName() {
$data = $this->doApiRequest( array( 'action' => 'login',
'lgname' => '', 'lgpassword' => self::$users['sysop']->password,
) );
$this->assertEquals( 'NoName', $data[0]['login']['result'] );
}
- function testApiLoginBadPass() {
+ public function testApiLoginBadPass() {
global $wgServer;
$user = self::$users['sysop'];
@@ -81,8 +81,7 @@ class ApiTest extends ApiTestCase {
"action" => "login",
"lgname" => $user->username,
"lgpassword" => "bad",
- )
- );
+ ) );
$result = $ret[0];
@@ -110,7 +109,7 @@ class ApiTest extends ApiTestCase {
$this->assertEquals( "WrongPass", $a );
}
- function testApiLoginGoodPass() {
+ public function testApiLoginGoodPass() {
global $wgServer;
if ( !isset( $wgServer ) ) {
@@ -136,7 +135,7 @@ class ApiTest extends ApiTestCase {
$token = $result["login"]["token"];
$ret = $this->doApiRequest(
- array(
+ array(
"action" => "login",
"lgtoken" => $token,
"lgname" => $user->username,
@@ -156,7 +155,7 @@ class ApiTest extends ApiTestCase {
/**
* @group Broken
*/
- function testApiGotCookie() {
+ public function testApiGotCookie() {
$this->markTestIncomplete( "The server can't do external HTTP requests, and the internal one won't give cookies" );
global $wgServer, $wgScriptPath;
@@ -202,7 +201,7 @@ class ApiTest extends ApiTestCase {
return $cj;
}
- function testRunLogin() {
+ public function testRunLogin() {
$sysopUser = self::$users['sysop'];
$data = $this->doApiRequest( array(
'action' => 'login',
@@ -228,39 +227,33 @@ class ApiTest extends ApiTestCase {
return $data;
}
- function testGettingToken() {
+ public function testGettingToken() {
foreach ( self::$users as $user ) {
$this->runTokenTest( $user );
}
}
function runTokenTest( $user ) {
- $data = $this->getTokenList( $user );
-
- $this->assertArrayHasKey( 'query', $data[0] );
- $this->assertArrayHasKey( 'pages', $data[0]['query'] );
- $keys = array_keys( $data[0]['query']['pages'] );
- $key = array_pop( $keys );
+ $tokens = $this->getTokenList( $user );
$rights = $user->user->getRights();
- $this->assertArrayHasKey( $key, $data[0]['query']['pages'] );
- $this->assertArrayHasKey( 'edittoken', $data[0]['query']['pages'][$key] );
- $this->assertArrayHasKey( 'movetoken', $data[0]['query']['pages'][$key] );
+ $this->assertArrayHasKey( 'edittoken', $tokens );
+ $this->assertArrayHasKey( 'movetoken', $tokens );
if ( isset( $rights['delete'] ) ) {
- $this->assertArrayHasKey( 'deletetoken', $data[0]['query']['pages'][$key] );
+ $this->assertArrayHasKey( 'deletetoken', $tokens );
}
if ( isset( $rights['block'] ) ) {
- $this->assertArrayHasKey( 'blocktoken', $data[0]['query']['pages'][$key] );
- $this->assertArrayHasKey( 'unblocktoken', $data[0]['query']['pages'][$key] );
+ $this->assertArrayHasKey( 'blocktoken', $tokens );
+ $this->assertArrayHasKey( 'unblocktoken', $tokens );
}
if ( isset( $rights['protect'] ) ) {
- $this->assertArrayHasKey( 'protecttoken', $data[0]['query']['pages'][$key] );
+ $this->assertArrayHasKey( 'protecttoken', $tokens );
}
- return $data;
+ return $tokens;
}
}
diff --git a/tests/phpunit/includes/api/ApiTestCase.php b/tests/phpunit/includes/api/ApiTestCase.php
index 552fbfbf..94ef9c68 100644
--- a/tests/phpunit/includes/api/ApiTestCase.php
+++ b/tests/phpunit/includes/api/ApiTestCase.php
@@ -52,6 +52,7 @@ abstract class ApiTestCase extends MediaWikiLangTestCase {
protected function editPage( $pageName, $text, $summary = '', $defaultNs = NS_MAIN ) {
$title = Title::newFromText( $pageName, $defaultNs );
$page = WikiPage::factory( $title );
+
return $page->doEditContent( ContentHandler::makeContent( $text, $title ), $summary );
}
@@ -131,17 +132,22 @@ abstract class ApiTestCase extends MediaWikiLangTestCase {
$session['wsEditToken'] = $session['wsToken'];
// add token to request parameters
$params['token'] = md5( $session['wsToken'] ) . User::EDIT_TOKEN_SUFFIX;
+
return $this->doApiRequest( $params, $session, false, $user );
} else {
throw new Exception( "request data not in right format" );
}
}
- protected function doLogin() {
+ protected function doLogin( $user = 'sysop' ) {
+ if ( !array_key_exists( $user, self::$users ) ) {
+ throw new MWException( "Can not log in to undefined user $user" );
+ }
+
$data = $this->doApiRequest( array(
'action' => 'login',
- 'lgname' => self::$users['sysop']->username,
- 'lgpassword' => self::$users['sysop']->password ) );
+ 'lgname' => self::$users[ $user ]->username,
+ 'lgpassword' => self::$users[ $user ]->password ) );
$token = $data[0]['login']['token'];
@@ -149,8 +155,8 @@ abstract class ApiTestCase extends MediaWikiLangTestCase {
array(
'action' => 'login',
'lgtoken' => $token,
- 'lgname' => self::$users['sysop']->username,
- 'lgpassword' => self::$users['sysop']->password,
+ 'lgname' => self::$users[ $user ]->username,
+ 'lgpassword' => self::$users[ $user ]->password,
),
$data[2]
);
@@ -160,11 +166,15 @@ abstract class ApiTestCase extends MediaWikiLangTestCase {
protected function getTokenList( $user, $session = null ) {
$data = $this->doApiRequest( array(
- 'action' => 'query',
- 'titles' => 'Main Page',
- 'intoken' => 'edit|delete|protect|move|block|unblock|watch',
- 'prop' => 'info' ), $session, false, $user->user );
- return $data;
+ 'action' => 'tokens',
+ 'type' => 'edit|delete|protect|move|block|unblock|watch'
+ ), $session, false, $user->user );
+
+ if ( !array_key_exists( 'tokens', $data[0] ) ) {
+ throw new MWException( 'Api failed to return a token list' );
+ }
+
+ return $data[0]['tokens'];
}
public function testApiTestGroup() {
@@ -204,11 +214,14 @@ class UserWrapper {
}
class MockApi extends ApiBase {
- public function execute() {}
+ public function execute() {
+ }
- public function getVersion() {}
+ public function getVersion() {
+ }
- public function __construct() {}
+ public function __construct() {
+ }
public function getAllowedParams() {
return array(
@@ -234,6 +247,7 @@ class ApiTestContext extends RequestContext {
if ( $user !== null ) {
$context->setUser( $user );
}
+
return $context;
}
}
diff --git a/tests/phpunit/includes/api/ApiTestCaseUpload.php b/tests/phpunit/includes/api/ApiTestCaseUpload.php
index 80284917..7e18b6ed 100644
--- a/tests/phpunit/includes/api/ApiTestCaseUpload.php
+++ b/tests/phpunit/includes/api/ApiTestCaseUpload.php
@@ -47,6 +47,7 @@ abstract class ApiTestCaseUpload extends ApiTestCase {
// see if it now doesn't exist; reload
$title = Title::newFromText( $title->getText(), NS_FILE );
}
+
return !( $title && $title instanceof Title && $title->exists() );
}
@@ -69,6 +70,7 @@ abstract class ApiTestCaseUpload extends ApiTestCase {
foreach ( $dupes as $dupe ) {
$success &= $this->deleteFileByTitle( $dupe->getTitle() );
}
+
return $success;
}
@@ -105,7 +107,6 @@ abstract class ApiTestCaseUpload extends ApiTestCase {
);
return true;
-
}
function fakeUploadChunk( $fieldName, $fileName, $type, & $chunkData ) {
@@ -145,5 +146,4 @@ abstract class ApiTestCaseUpload extends ApiTestCase {
function clearFakeUploads() {
$_FILES = array();
}
-
}
diff --git a/tests/phpunit/includes/api/ApiUploadTest.php b/tests/phpunit/includes/api/ApiUploadTest.php
index 0d98b04d..1540af55 100644
--- a/tests/phpunit/includes/api/ApiUploadTest.php
+++ b/tests/phpunit/includes/api/ApiUploadTest.php
@@ -16,7 +16,7 @@
// TODO: port the other Upload tests, and other API tests to this framework
-require_once( 'ApiTestCaseUpload.php' );
+require_once 'ApiTestCaseUpload.php';
/**
* @group Database
@@ -27,12 +27,11 @@ require_once( 'ApiTestCaseUpload.php' );
* This is pretty sucky... needs to be prettified.
*/
class ApiUploadTest extends ApiTestCaseUpload {
-
/**
* Testing login
* XXX this is a funny way of getting session context
*/
- function testLogin() {
+ public function testLogin() {
$user = self::$users['uploader'];
$params = array(
@@ -59,8 +58,8 @@ class ApiUploadTest extends ApiTestCaseUpload {
$this->assertArrayHasKey( 'lgtoken', $result['login'] );
$this->assertNotEmpty( $session, 'API Login must return a session' );
- return $session;
+ return $session;
}
/**
@@ -118,7 +117,6 @@ class ApiUploadTest extends ApiTestCaseUpload {
$this->deleteFileByFileName( $fileName );
$this->deleteFileByContent( $filePath );
-
if ( !$this->fakeUploadFile( 'file', $fileName, $mimeType, $filePath ) ) {
$this->markTestIncomplete( "Couldn't upload file!\n" );
}
@@ -140,7 +138,7 @@ class ApiUploadTest extends ApiTestCaseUpload {
}
$this->assertTrue( isset( $result['upload'] ) );
$this->assertEquals( 'Success', $result['upload']['result'] );
- $this->assertEquals( $fileSize, ( int )$result['upload']['imageinfo']['size'] );
+ $this->assertEquals( $fileSize, (int)$result['upload']['imageinfo']['size'] );
$this->assertEquals( $mimeType, $result['upload']['imageinfo']['mime'] );
$this->assertFalse( $exception );
@@ -298,7 +296,7 @@ class ApiUploadTest extends ApiTestCaseUpload {
$exception = false;
try {
- list( $result, $request, $session ) = $this->doApiRequestWithToken( $params, $session,
+ list( $result, , $session ) = $this->doApiRequestWithToken( $params, $session,
self::$users['uploader']->user );
} catch ( UsageException $e ) {
$exception = true;
@@ -307,7 +305,6 @@ class ApiUploadTest extends ApiTestCaseUpload {
$this->assertEquals( 'Success', $result['upload']['result'] );
$this->assertFalse( $exception );
-
// second upload with the same content (but different name)
if ( !$this->fakeUploadFile( 'file', $fileNames[1], $mimeType, $filePaths[0] ) ) {
@@ -324,7 +321,7 @@ class ApiUploadTest extends ApiTestCaseUpload {
$exception = false;
try {
- list( $result, $request, $session ) = $this->doApiRequestWithToken( $params, $session,
+ list( $result ) = $this->doApiRequestWithToken( $params, $session,
self::$users['uploader']->user ); // FIXME: leaks a temporary file
} catch ( UsageException $e ) {
$exception = true;
@@ -341,7 +338,6 @@ class ApiUploadTest extends ApiTestCaseUpload {
unlink( $filePaths[0] );
}
-
/**
* @depends testLogin
*/
@@ -382,7 +378,7 @@ class ApiUploadTest extends ApiTestCaseUpload {
$exception = false;
try {
- list( $result, $request, $session ) = $this->doApiRequestWithToken( $params, $session,
+ list( $result, , $session ) = $this->doApiRequestWithToken( $params, $session,
self::$users['uploader']->user ); // FIXME: leaks a temporary file
} catch ( UsageException $e ) {
$exception = true;
@@ -390,7 +386,7 @@ class ApiUploadTest extends ApiTestCaseUpload {
$this->assertFalse( $exception );
$this->assertTrue( isset( $result['upload'] ) );
$this->assertEquals( 'Success', $result['upload']['result'] );
- $this->assertEquals( $fileSize, ( int )$result['upload']['imageinfo']['size'] );
+ $this->assertEquals( $fileSize, (int)$result['upload']['imageinfo']['size'] );
$this->assertEquals( $mimeType, $result['upload']['imageinfo']['mime'] );
$this->assertTrue( isset( $result['upload']['filekey'] ) );
$this->assertEquals( $result['upload']['sessionkey'], $result['upload']['filekey'] );
@@ -411,7 +407,7 @@ class ApiUploadTest extends ApiTestCaseUpload {
$this->clearFakeUploads();
$exception = false;
try {
- list( $result, $request, $session ) = $this->doApiRequestWithToken( $params, $session,
+ list( $result ) = $this->doApiRequestWithToken( $params, $session,
self::$users['uploader']->user );
} catch ( UsageException $e ) {
$exception = true;
@@ -454,7 +450,7 @@ class ApiUploadTest extends ApiTestCaseUpload {
$this->deleteFileByFileName( $fileName );
$this->deleteFileByContent( $filePath );
- // Base upload params:
+ // Base upload params:
$params = array(
'action' => 'upload',
'stash' => 1,
@@ -466,7 +462,7 @@ class ApiUploadTest extends ApiTestCaseUpload {
// Upload chunks
$chunkSessionKey = false;
$resultOffset = 0;
- // Open the file:
+ // Open the file:
$handle = @fopen( $filePath, "r" );
if ( $handle === false ) {
$this->markTestIncomplete( "could not open file: $filePath" );
@@ -482,15 +478,15 @@ class ApiUploadTest extends ApiTestCaseUpload {
if ( !$chunkSessionKey ) {
// Upload fist chunk ( and get the session key )
try {
- list( $result, $request, $session ) = $this->doApiRequestWithToken( $params, $session,
+ list( $result, , $session ) = $this->doApiRequestWithToken( $params, $session,
self::$users['uploader']->user );
} catch ( UsageException $e ) {
$this->markTestIncomplete( $e->getMessage() );
}
- // Make sure we got a valid chunk continue:
+ // Make sure we got a valid chunk continue:
$this->assertTrue( isset( $result['upload'] ) );
$this->assertTrue( isset( $result['upload']['filekey'] ) );
- // If we don't get a session key mark test incomplete.
+ // If we don't get a session key mark test incomplete.
if ( !isset( $result['upload']['filekey'] ) ) {
$this->markTestIncomplete( "no filekey provided" );
}
@@ -509,16 +505,16 @@ class ApiUploadTest extends ApiTestCaseUpload {
$this->assertEquals( $resultOffset, $params['offset'] );
// Upload current chunk
try {
- list( $result, $request, $session ) = $this->doApiRequestWithToken( $params, $session,
+ list( $result, , $session ) = $this->doApiRequestWithToken( $params, $session,
self::$users['uploader']->user );
} catch ( UsageException $e ) {
$this->markTestIncomplete( $e->getMessage() );
}
- // Make sure we got a valid chunk continue:
+ // Make sure we got a valid chunk continue:
$this->assertTrue( isset( $result['upload'] ) );
$this->assertTrue( isset( $result['upload']['filekey'] ) );
- // Check if we were on the last chunk:
+ // Check if we were on the last chunk:
if ( $params['offset'] + $chunkSize >= $fileSize ) {
$this->assertEquals( 'Success', $result['upload']['result'] );
break;
@@ -548,7 +544,7 @@ class ApiUploadTest extends ApiTestCaseUpload {
$this->clearFakeUploads();
$exception = false;
try {
- list( $result, $request, $session ) = $this->doApiRequestWithToken( $params, $session,
+ list( $result ) = $this->doApiRequestWithToken( $params, $session,
self::$users['uploader']->user );
} catch ( UsageException $e ) {
$exception = true;
@@ -559,7 +555,7 @@ class ApiUploadTest extends ApiTestCaseUpload {
// clean up
$this->deleteFileByFilename( $fileName );
- // don't remove downloaded temporary file for fast subquent tests.
+ // don't remove downloaded temporary file for fast subquent tests.
//unlink( $filePath );
}
}
diff --git a/tests/phpunit/includes/api/ApiWatchTest.php b/tests/phpunit/includes/api/ApiWatchTest.php
index aefd9398..028ea9ff 100644
--- a/tests/phpunit/includes/api/ApiWatchTest.php
+++ b/tests/phpunit/includes/api/ApiWatchTest.php
@@ -7,32 +7,25 @@
* @todo This test suite is severly broken and need a full review
*/
class ApiWatchTest extends ApiTestCase {
-
protected function setUp() {
parent::setUp();
$this->doLogin();
}
function getTokens() {
- $data = $this->getTokenList( self::$users['sysop'] );
-
- $keys = array_keys( $data[0]['query']['pages'] );
- $key = array_pop( $keys );
- $pageinfo = $data[0]['query']['pages'][$key];
-
- return $pageinfo;
+ return $this->getTokenList( self::$users['sysop'] );
}
/**
*/
- function testWatchEdit() {
- $pageinfo = $this->getTokens();
+ public function testWatchEdit() {
+ $tokens = $this->getTokens();
$data = $this->doApiRequest( array(
'action' => 'edit',
'title' => 'Help:UTPage', // Help namespace is hopefully wikitext
'text' => 'new text',
- 'token' => $pageinfo['edittoken'],
+ 'token' => $tokens['edittoken'],
'watchlist' => 'watch' ) );
$this->assertArrayHasKey( 'edit', $data[0] );
$this->assertArrayHasKey( 'result', $data[0]['edit'] );
@@ -44,9 +37,8 @@ class ApiWatchTest extends ApiTestCase {
/**
* @depends testWatchEdit
*/
- function testWatchClear() {
-
- $pageinfo = $this->getTokens();
+ public function testWatchClear() {
+ $tokens = $this->getTokens();
$data = $this->doApiRequest( array(
'action' => 'query',
@@ -60,7 +52,7 @@ class ApiWatchTest extends ApiTestCase {
'action' => 'watch',
'title' => $page['title'],
'unwatch' => true,
- 'token' => $pageinfo['watchtoken'] ) );
+ 'token' => $tokens['watchtoken'] ) );
}
}
$data = $this->doApiRequest( array(
@@ -75,13 +67,12 @@ class ApiWatchTest extends ApiTestCase {
/**
*/
- function testWatchProtect() {
-
- $pageinfo = $this->getTokens();
+ public function testWatchProtect() {
+ $tokens = $this->getTokens();
$data = $this->doApiRequest( array(
'action' => 'protect',
- 'token' => $pageinfo['protecttoken'],
+ 'token' => $tokens['protecttoken'],
'title' => 'Help:UTPage',
'protections' => 'edit=sysop',
'watchlist' => 'unwatch' ) );
@@ -94,9 +85,8 @@ class ApiWatchTest extends ApiTestCase {
/**
*/
- function testGetRollbackToken() {
-
- $pageinfo = $this->getTokens();
+ public function testGetRollbackToken() {
+ $this->getTokens();
if ( !Title::newFromText( 'Help:UTPage' )->exists() ) {
$this->markTestSkipped( "The article [[Help:UTPage]] does not exist" ); //TODO: just create it?
@@ -131,7 +121,7 @@ class ApiWatchTest extends ApiTestCase {
*
* @depends testGetRollbackToken
*/
- function testWatchRollback( $data ) {
+ public function testWatchRollback( $data ) {
$keys = array_keys( $data[0]['query']['pages'] );
$key = array_pop( $keys );
$pageinfo = $data[0]['query']['pages'][$key];
@@ -155,23 +145,4 @@ class ApiWatchTest extends ApiTestCase {
}
}
}
-
- /**
- */
- function testWatchDelete() {
- $pageinfo = $this->getTokens();
-
- $data = $this->doApiRequest( array(
- 'action' => 'delete',
- 'token' => $pageinfo['deletetoken'],
- 'title' => 'Help:UTPage' ) );
- $this->assertArrayHasKey( 'delete', $data[0] );
- $this->assertArrayHasKey( 'title', $data[0]['delete'] );
-
- $data = $this->doApiRequest( array(
- 'action' => 'query',
- 'list' => 'watchlist' ) );
-
- $this->markTestIncomplete( 'This test needs to verify the deleted article was added to the users watchlist' );
- }
}
diff --git a/tests/phpunit/includes/api/RandomImageGenerator.php b/tests/phpunit/includes/api/RandomImageGenerator.php
index 30407582..59756b21 100644
--- a/tests/phpunit/includes/api/RandomImageGenerator.php
+++ b/tests/phpunit/includes/api/RandomImageGenerator.php
@@ -34,7 +34,7 @@ class RandomImageGenerator {
private $shapesToDraw = 5;
/**
- * Orientations: 0th row, 0th column, EXIF orientation code, rotation 2x2 matrix that is opposite of orientation
+ * Orientations: 0th row, 0th column, Exif orientation code, rotation 2x2 matrix that is opposite of orientation
* n.b. we do not handle the 'flipped' orientations, which is why there is no entry for 2, 4, 5, or 7. Those
* seem to be rare in real images anyway
* (we also would need a non-symmetric shape for the images to test those, like a letter F)
@@ -108,6 +108,7 @@ class RandomImageGenerator {
foreach ( $filenames as $filename ) {
$this->{$imageWriteMethod}( $this->getImageSpec(), $format, $filename );
}
+
return $filenames;
}
@@ -156,7 +157,6 @@ class RandomImageGenerator {
}
return $filenames;
-
}
@@ -196,7 +196,6 @@ class RandomImageGenerator {
array( 'x' => $originX, 'y' => $originY - $radius )
);
$draws[] = $draw;
-
}
$spec['draws'] = $draws;
@@ -216,6 +215,7 @@ class RandomImageGenerator {
foreach ( $shape as $point ) {
$points[] = $point['x'] . ',' . $point['y'];
}
+
return join( " ", $points );
}
@@ -304,7 +304,7 @@ class RandomImageGenerator {
/**
* Given an image specification, produce rotated version
- * This is used when simulating a rotated image capture with EXIF orientation
+ * This is used when simulating a rotated image capture with Exif orientation
* @param $spec Object returned by getImageSpec
* @param $matrix 2x2 transformation matrix
* @return transformed Spec
@@ -337,6 +337,7 @@ class RandomImageGenerator {
}
$tSpec['draws'][] = $tDraw;
}
+
return $tSpec;
}
@@ -384,6 +385,7 @@ class RandomImageGenerator {
$command = wfEscapeShellArg( $wgImageMagickConvertCommand ) . " " . implode( " ", $args );
$retval = null;
wfShellExec( $command, $retval );
+
return ( $retval === 0 );
}
@@ -397,6 +399,7 @@ class RandomImageGenerator {
for ( $i = 0; $i <= 2; $i++ ) {
$components[] = mt_rand( 0, 255 );
}
+
return 'rgb(' . join( ', ', $components ) . ')';
}
@@ -414,6 +417,7 @@ class RandomImageGenerator {
for ( $i = 0; $i < $count; $i += 2 ) {
$pairs[] = array( $lines[$i], $lines[$i + 1] );
}
+
return $pairs;
}
@@ -461,5 +465,4 @@ class RandomImageGenerator {
return $lines;
}
-
}
diff --git a/tests/phpunit/includes/api/format/ApiFormatPhpTest.php b/tests/phpunit/includes/api/format/ApiFormatPhpTest.php
index a59983d8..a0bbb2dc 100644
--- a/tests/phpunit/includes/api/format/ApiFormatPhpTest.php
+++ b/tests/phpunit/includes/api/format/ApiFormatPhpTest.php
@@ -7,13 +7,11 @@
*/
class ApiFormatPhpTest extends ApiFormatTestBase {
- function testValidPhpSyntax() {
+ public function testValidPhpSyntax() {
$data = $this->apiRequest( 'php', array( 'action' => 'query', 'meta' => 'siteinfo' ) );
$this->assertInternalType( 'array', unserialize( $data ) );
$this->assertGreaterThan( 0, count( (array)$data ) );
-
}
-
}
diff --git a/tests/phpunit/includes/api/generateRandomImages.php b/tests/phpunit/includes/api/generateRandomImages.php
index bdd15c48..87f5c4c0 100644
--- a/tests/phpunit/includes/api/generateRandomImages.php
+++ b/tests/phpunit/includes/api/generateRandomImages.php
@@ -6,8 +6,8 @@
*/
// Start up MediaWiki in command-line mode
-require_once( __DIR__ . "/../../../../maintenance/Maintenance.php" );
-require( __DIR__ . "/RandomImageGenerator.php" );
+require_once __DIR__ . "/../../../../maintenance/Maintenance.php";
+require __DIR__ . "/RandomImageGenerator.php";
class GenerateRandomImages extends Maintenance {
@@ -43,4 +43,4 @@ class GenerateRandomImages extends Maintenance {
}
$maintClass = 'GenerateRandomImages';
-require( RUN_MAINTENANCE_IF_MAIN );
+require RUN_MAINTENANCE_IF_MAIN;
diff --git a/tests/phpunit/includes/api/query/ApiQueryBasicTest.php b/tests/phpunit/includes/api/query/ApiQueryBasicTest.php
index 6d4e3711..1a2aa832 100644
--- a/tests/phpunit/includes/api/query/ApiQueryBasicTest.php
+++ b/tests/phpunit/includes/api/query/ApiQueryBasicTest.php
@@ -24,7 +24,7 @@
* @file
*/
-require_once( 'ApiQueryTestBase.php' );
+require_once 'ApiQueryTestBase.php';
/** These tests validate basic functionality of the api query module
*
@@ -67,7 +67,10 @@ class ApiQueryBasicTest extends ApiQueryTestBase {
'title' => 'AQBT-All',
'links' => array(
array( 'ns' => 0, 'title' => 'AQBT-Links' ),
- ) ) ) ) );
+ )
+ )
+ ) )
+ );
private static $templates = array(
array( 'prop' => 'templates', 'titles' => 'AQBT-All' ),
@@ -78,7 +81,10 @@ class ApiQueryBasicTest extends ApiQueryTestBase {
'title' => 'AQBT-All',
'templates' => array(
array( 'ns' => 10, 'title' => 'Template:AQBT-T' ),
- ) ) ) ) );
+ )
+ )
+ ) )
+ );
private static $categories = array(
array( 'prop' => 'categories', 'titles' => 'AQBT-All' ),
@@ -89,7 +95,10 @@ class ApiQueryBasicTest extends ApiQueryTestBase {
'title' => 'AQBT-All',
'categories' => array(
array( 'ns' => 14, 'title' => 'Category:AQBT-Cat' ),
- ) ) ) ) );
+ )
+ )
+ ) )
+ );
private static $allpages = array(
array( 'list' => 'allpages', 'apprefix' => 'AQBT-' ),
@@ -98,7 +107,8 @@ class ApiQueryBasicTest extends ApiQueryTestBase {
array( 'pageid' => 2, 'ns' => 0, 'title' => 'AQBT-Categories' ),
array( 'pageid' => 3, 'ns' => 0, 'title' => 'AQBT-Links' ),
array( 'pageid' => 4, 'ns' => 0, 'title' => 'AQBT-Templates' ),
- ) ) );
+ ) )
+ );
private static $alllinks = array(
array( 'list' => 'alllinks', 'alprefix' => 'AQBT-' ),
@@ -107,40 +117,46 @@ class ApiQueryBasicTest extends ApiQueryTestBase {
array( 'ns' => 0, 'title' => 'AQBT-Categories' ),
array( 'ns' => 0, 'title' => 'AQBT-Links' ),
array( 'ns' => 0, 'title' => 'AQBT-Templates' ),
- ) ) );
+ ) )
+ );
private static $alltransclusions = array(
array( 'list' => 'alltransclusions', 'atprefix' => 'AQBT-' ),
array( 'alltransclusions' => array(
array( 'ns' => 10, 'title' => 'Template:AQBT-T' ),
array( 'ns' => 10, 'title' => 'Template:AQBT-T' ),
- ) ) );
+ ) )
+ );
private static $allcategories = array(
array( 'list' => 'allcategories', 'acprefix' => 'AQBT-' ),
array( 'allcategories' => array(
array( '*' => 'AQBT-Cat' ),
- ) ) );
+ ) )
+ );
private static $backlinks = array(
array( 'list' => 'backlinks', 'bltitle' => 'AQBT-Links' ),
array( 'backlinks' => array(
array( 'pageid' => 1, 'ns' => 0, 'title' => 'AQBT-All' ),
- ) ) );
+ ) )
+ );
private static $embeddedin = array(
array( 'list' => 'embeddedin', 'eititle' => 'Template:AQBT-T' ),
array( 'embeddedin' => array(
array( 'pageid' => 1, 'ns' => 0, 'title' => 'AQBT-All' ),
array( 'pageid' => 4, 'ns' => 0, 'title' => 'AQBT-Templates' ),
- ) ) );
+ ) )
+ );
private static $categorymembers = array(
array( 'list' => 'categorymembers', 'cmtitle' => 'Category:AQBT-Cat' ),
array( 'categorymembers' => array(
array( 'pageid' => 1, 'ns' => 0, 'title' => 'AQBT-All' ),
array( 'pageid' => 2, 'ns' => 0, 'title' => 'AQBT-Categories' ),
- ) ) );
+ ) )
+ );
private static $generatorAllpages = array(
array( 'generator' => 'allpages', 'gapprefix' => 'AQBT-' ),
@@ -161,7 +177,8 @@ class ApiQueryBasicTest extends ApiQueryTestBase {
'pageid' => 4,
'ns' => 0,
'title' => 'AQBT-Templates' ),
- ) ) );
+ ) )
+ );
private static $generatorLinks = array(
array( 'generator' => 'links', 'titles' => 'AQBT-Links' ),
@@ -178,14 +195,17 @@ class ApiQueryBasicTest extends ApiQueryTestBase {
'pageid' => 4,
'ns' => 0,
'title' => 'AQBT-Templates' ),
- ) ) );
+ ) )
+ );
private static $generatorLinksPropLinks = array(
array( 'prop' => 'links' ),
array( 'pages' => array(
'1' => array( 'links' => array(
array( 'ns' => 0, 'title' => 'AQBT-Links' ),
- ) ) ) ) );
+ ) )
+ ) )
+ );
private static $generatorLinksPropTemplates = array(
array( 'prop' => 'templates' ),
@@ -194,7 +214,8 @@ class ApiQueryBasicTest extends ApiQueryTestBase {
array( 'ns' => 10, 'title' => 'Template:AQBT-T' ) ) ),
'4' => array( 'templates' => array(
array( 'ns' => 10, 'title' => 'Template:AQBT-T' ) ) ),
- ) ) );
+ ) )
+ );
/**
* Test basic props
@@ -300,6 +321,32 @@ class ApiQueryBasicTest extends ApiQueryTestBase {
}
/**
+ * Test bug 51821
+ */
+ public function testGeneratorRedirects() {
+ $this->editPage( 'AQBT-Target', 'test' );
+ $this->editPage( 'AQBT-Redir', '#REDIRECT [[AQBT-Target]]' );
+ $this->check( array(
+ array( 'generator' => 'backlinks', 'gbltitle' => 'AQBT-Target', 'redirects' => '1' ),
+ array(
+ 'redirects' => array(
+ array(
+ 'from' => 'AQBT-Redir',
+ 'to' => 'AQBT-Target',
+ )
+ ),
+ 'pages' => array(
+ '6' => array(
+ 'pageid' => 6,
+ 'ns' => 0,
+ 'title' => 'AQBT-Target',
+ )
+ ),
+ )
+ ) );
+ }
+
+ /**
* Recursively merges the expected values in the $item into the $all
*/
private function mergeExpected( &$all, $item ) {
diff --git a/tests/phpunit/includes/api/query/ApiQueryContinue2Test.php b/tests/phpunit/includes/api/query/ApiQueryContinue2Test.php
index 0a3ac1da..4d5ddbae 100644
--- a/tests/phpunit/includes/api/query/ApiQueryContinue2Test.php
+++ b/tests/phpunit/includes/api/query/ApiQueryContinue2Test.php
@@ -18,7 +18,7 @@
* http://www.gnu.org/copyleft/gpl.html
*/
-require_once( 'ApiQueryContinueTestBase.php' );
+require_once 'ApiQueryContinueTestBase.php';
/**
* @group API
@@ -48,7 +48,7 @@ class ApiQueryContinue2Test extends ApiQueryContinueTestBase {
*/
public function testA() {
$this->mVerbose = false;
- $mk = function( $g, $p, $gDir ) {
+ $mk = function ( $g, $p, $gDir ) {
return array(
'generator' => 'allpages',
'gapprefix' => 'AQCT73462-',
@@ -59,10 +59,10 @@ class ApiQueryContinue2Test extends ApiQueryContinueTestBase {
);
};
// generator + 1 prop + 1 list
- $data = $this->query( $mk(99,99,true), 1, 'g1p', false );
- $this->checkC( $data, $mk(1,1,true), 6, 'g1p-11t' );
- $this->checkC( $data, $mk(2,2,true), 3, 'g1p-22t' );
- $this->checkC( $data, $mk(1,1,false), 6, 'g1p-11f' );
- $this->checkC( $data, $mk(2,2,false), 3, 'g1p-22f' );
+ $data = $this->query( $mk( 99, 99, true ), 1, 'g1p', false );
+ $this->checkC( $data, $mk( 1, 1, true ), 6, 'g1p-11t' );
+ $this->checkC( $data, $mk( 2, 2, true ), 3, 'g1p-22t' );
+ $this->checkC( $data, $mk( 1, 1, false ), 6, 'g1p-11f' );
+ $this->checkC( $data, $mk( 2, 2, false ), 3, 'g1p-22f' );
}
}
diff --git a/tests/phpunit/includes/api/query/ApiQueryContinueTest.php b/tests/phpunit/includes/api/query/ApiQueryContinueTest.php
index cb8f1812..f494e9ca 100644
--- a/tests/phpunit/includes/api/query/ApiQueryContinueTest.php
+++ b/tests/phpunit/includes/api/query/ApiQueryContinueTest.php
@@ -18,7 +18,7 @@
* http://www.gnu.org/copyleft/gpl.html
*/
-require_once( 'ApiQueryContinueTestBase.php' );
+require_once 'ApiQueryContinueTestBase.php';
/**
* These tests validate the new continue functionality of the api query module by
@@ -58,21 +58,21 @@ class ApiQueryContinueTest extends ApiQueryContinueTestBase {
*/
public function test1List() {
$this->mVerbose = false;
- $mk = function( $l ) {
+ $mk = function ( $l ) {
return array(
'list' => 'allpages',
'apprefix' => 'AQCT-',
'aplimit' => "$l",
);
};
- $data = $this->query( $mk(99), 1, '1L', false );
+ $data = $this->query( $mk( 99 ), 1, '1L', false );
// 1 list
- $this->checkC( $data, $mk(1), 5, '1L-1' );
- $this->checkC( $data, $mk(2), 3, '1L-2' );
- $this->checkC( $data, $mk(3), 2, '1L-3' );
- $this->checkC( $data, $mk(4), 2, '1L-4' );
- $this->checkC( $data, $mk(5), 1, '1L-5' );
+ $this->checkC( $data, $mk( 1 ), 5, '1L-1' );
+ $this->checkC( $data, $mk( 2 ), 3, '1L-2' );
+ $this->checkC( $data, $mk( 3 ), 2, '1L-3' );
+ $this->checkC( $data, $mk( 4 ), 2, '1L-4' );
+ $this->checkC( $data, $mk( 5 ), 1, '1L-5' );
}
/**
@@ -81,7 +81,7 @@ class ApiQueryContinueTest extends ApiQueryContinueTestBase {
*/
public function test2Lists() {
$this->mVerbose = false;
- $mk = function( $l1, $l2 ) {
+ $mk = function ( $l1, $l2 ) {
return array(
'list' => 'allpages|alltransclusions',
'apprefix' => 'AQCT-',
@@ -92,12 +92,12 @@ class ApiQueryContinueTest extends ApiQueryContinueTestBase {
);
};
// 2 lists
- $data = $this->query( $mk(99,99), 1, '2L', false );
- $this->checkC( $data, $mk(1,1), 5, '2L-11' );
- $this->checkC( $data, $mk(2,2), 3, '2L-22' );
- $this->checkC( $data, $mk(3,3), 2, '2L-33' );
- $this->checkC( $data, $mk(4,4), 2, '2L-44' );
- $this->checkC( $data, $mk(5,5), 1, '2L-55' );
+ $data = $this->query( $mk( 99, 99 ), 1, '2L', false );
+ $this->checkC( $data, $mk( 1, 1 ), 5, '2L-11' );
+ $this->checkC( $data, $mk( 2, 2 ), 3, '2L-22' );
+ $this->checkC( $data, $mk( 3, 3 ), 2, '2L-33' );
+ $this->checkC( $data, $mk( 4, 4 ), 2, '2L-44' );
+ $this->checkC( $data, $mk( 5, 5 ), 1, '2L-55' );
}
/**
@@ -106,7 +106,7 @@ class ApiQueryContinueTest extends ApiQueryContinueTestBase {
*/
public function testGen1Prop() {
$this->mVerbose = false;
- $mk = function( $g, $p ) {
+ $mk = function ( $g, $p ) {
return array(
'generator' => 'allpages',
'gapprefix' => 'AQCT-',
@@ -116,12 +116,12 @@ class ApiQueryContinueTest extends ApiQueryContinueTestBase {
);
};
// generator + 1 prop
- $data = $this->query( $mk(99,99), 1, 'G1P', false );
- $this->checkC( $data, $mk(1,1), 11, 'G1P-11' );
- $this->checkC( $data, $mk(2,2), 6, 'G1P-22' );
- $this->checkC( $data, $mk(3,3), 4, 'G1P-33' );
- $this->checkC( $data, $mk(4,4), 3, 'G1P-44' );
- $this->checkC( $data, $mk(5,5), 2, 'G1P-55' );
+ $data = $this->query( $mk( 99, 99 ), 1, 'G1P', false );
+ $this->checkC( $data, $mk( 1, 1 ), 11, 'G1P-11' );
+ $this->checkC( $data, $mk( 2, 2 ), 6, 'G1P-22' );
+ $this->checkC( $data, $mk( 3, 3 ), 4, 'G1P-33' );
+ $this->checkC( $data, $mk( 4, 4 ), 3, 'G1P-44' );
+ $this->checkC( $data, $mk( 5, 5 ), 2, 'G1P-55' );
}
/**
@@ -130,7 +130,7 @@ class ApiQueryContinueTest extends ApiQueryContinueTestBase {
*/
public function testGen2Prop() {
$this->mVerbose = false;
- $mk = function( $g, $p1, $p2 ) {
+ $mk = function ( $g, $p1, $p2 ) {
return array(
'generator' => 'allpages',
'gapprefix' => 'AQCT-',
@@ -141,17 +141,17 @@ class ApiQueryContinueTest extends ApiQueryContinueTestBase {
);
};
// generator + 2 props
- $data = $this->query( $mk(99,99,99), 1, 'G2P', false );
- $this->checkC( $data, $mk(1,1,1), 16, 'G2P-111' );
- $this->checkC( $data, $mk(2,2,2), 9, 'G2P-222' );
- $this->checkC( $data, $mk(3,3,3), 6, 'G2P-333' );
- $this->checkC( $data, $mk(4,4,4), 4, 'G2P-444' );
- $this->checkC( $data, $mk(5,5,5), 2, 'G2P-555' );
- $this->checkC( $data, $mk(5,1,1), 10, 'G2P-511' );
- $this->checkC( $data, $mk(4,2,2), 7, 'G2P-422' );
- $this->checkC( $data, $mk(2,3,3), 7, 'G2P-233' );
- $this->checkC( $data, $mk(2,4,4), 5, 'G2P-244' );
- $this->checkC( $data, $mk(1,5,5), 5, 'G2P-155' );
+ $data = $this->query( $mk( 99, 99, 99 ), 1, 'G2P', false );
+ $this->checkC( $data, $mk( 1, 1, 1 ), 16, 'G2P-111' );
+ $this->checkC( $data, $mk( 2, 2, 2 ), 9, 'G2P-222' );
+ $this->checkC( $data, $mk( 3, 3, 3 ), 6, 'G2P-333' );
+ $this->checkC( $data, $mk( 4, 4, 4 ), 4, 'G2P-444' );
+ $this->checkC( $data, $mk( 5, 5, 5 ), 2, 'G2P-555' );
+ $this->checkC( $data, $mk( 5, 1, 1 ), 10, 'G2P-511' );
+ $this->checkC( $data, $mk( 4, 2, 2 ), 7, 'G2P-422' );
+ $this->checkC( $data, $mk( 2, 3, 3 ), 7, 'G2P-233' );
+ $this->checkC( $data, $mk( 2, 4, 4 ), 5, 'G2P-244' );
+ $this->checkC( $data, $mk( 1, 5, 5 ), 5, 'G2P-155' );
}
/**
@@ -160,7 +160,7 @@ class ApiQueryContinueTest extends ApiQueryContinueTestBase {
*/
public function testGen1Prop1List() {
$this->mVerbose = false;
- $mk = function( $g, $p, $l ) {
+ $mk = function ( $g, $p, $l ) {
return array(
'generator' => 'allpages',
'gapprefix' => 'AQCT-',
@@ -174,24 +174,24 @@ class ApiQueryContinueTest extends ApiQueryContinueTestBase {
);
};
// generator + 1 prop + 1 list
- $data = $this->query( $mk(99,99,99), 1, 'G1P1L', false );
- $this->checkC( $data, $mk(1,1,1), 11, 'G1P1L-111' );
- $this->checkC( $data, $mk(2,2,2), 6, 'G1P1L-222' );
- $this->checkC( $data, $mk(3,3,3), 4, 'G1P1L-333' );
- $this->checkC( $data, $mk(4,4,4), 3, 'G1P1L-444' );
- $this->checkC( $data, $mk(5,5,5), 2, 'G1P1L-555' );
- $this->checkC( $data, $mk(5,5,1), 4, 'G1P1L-551' );
- $this->checkC( $data, $mk(5,5,2), 2, 'G1P1L-552' );
+ $data = $this->query( $mk( 99, 99, 99 ), 1, 'G1P1L', false );
+ $this->checkC( $data, $mk( 1, 1, 1 ), 11, 'G1P1L-111' );
+ $this->checkC( $data, $mk( 2, 2, 2 ), 6, 'G1P1L-222' );
+ $this->checkC( $data, $mk( 3, 3, 3 ), 4, 'G1P1L-333' );
+ $this->checkC( $data, $mk( 4, 4, 4 ), 3, 'G1P1L-444' );
+ $this->checkC( $data, $mk( 5, 5, 5 ), 2, 'G1P1L-555' );
+ $this->checkC( $data, $mk( 5, 5, 1 ), 4, 'G1P1L-551' );
+ $this->checkC( $data, $mk( 5, 5, 2 ), 2, 'G1P1L-552' );
}
/**
* Test smart continue - generator=allpages, prop=links|templates,
- * list=alllinks|alltransclusions, meta=siteinfo
+ * list=alllinks|alltransclusions, meta=siteinfo
* @medium
*/
public function testGen2Prop2List1Meta() {
$this->mVerbose = false;
- $mk = function( $g, $p1, $p2, $l1, $l2 ) {
+ $mk = function ( $g, $p1, $p2, $l1, $l2 ) {
return array(
'generator' => 'allpages',
'gapprefix' => 'AQCT-',
@@ -211,16 +211,16 @@ class ApiQueryContinueTest extends ApiQueryContinueTestBase {
);
};
// generator + 1 prop + 1 list
- $data = $this->query( $mk(99,99,99,99,99), 1, 'G2P2L1M', false );
- $this->checkC( $data, $mk(1,1,1,1,1), 16, 'G2P2L1M-11111' );
- $this->checkC( $data, $mk(2,2,2,2,2), 9, 'G2P2L1M-22222' );
- $this->checkC( $data, $mk(3,3,3,3,3), 6, 'G2P2L1M-33333' );
- $this->checkC( $data, $mk(4,4,4,4,4), 4, 'G2P2L1M-44444' );
- $this->checkC( $data, $mk(5,5,5,5,5), 2, 'G2P2L1M-55555' );
- $this->checkC( $data, $mk(5,5,5,1,1), 4, 'G2P2L1M-55511' );
- $this->checkC( $data, $mk(5,5,5,2,2), 2, 'G2P2L1M-55522' );
- $this->checkC( $data, $mk(5,1,1,5,5), 10, 'G2P2L1M-51155' );
- $this->checkC( $data, $mk(5,2,2,5,5), 5, 'G2P2L1M-52255' );
+ $data = $this->query( $mk( 99, 99, 99, 99, 99 ), 1, 'G2P2L1M', false );
+ $this->checkC( $data, $mk( 1, 1, 1, 1, 1 ), 16, 'G2P2L1M-11111' );
+ $this->checkC( $data, $mk( 2, 2, 2, 2, 2 ), 9, 'G2P2L1M-22222' );
+ $this->checkC( $data, $mk( 3, 3, 3, 3, 3 ), 6, 'G2P2L1M-33333' );
+ $this->checkC( $data, $mk( 4, 4, 4, 4, 4 ), 4, 'G2P2L1M-44444' );
+ $this->checkC( $data, $mk( 5, 5, 5, 5, 5 ), 2, 'G2P2L1M-55555' );
+ $this->checkC( $data, $mk( 5, 5, 5, 1, 1 ), 4, 'G2P2L1M-55511' );
+ $this->checkC( $data, $mk( 5, 5, 5, 2, 2 ), 2, 'G2P2L1M-55522' );
+ $this->checkC( $data, $mk( 5, 1, 1, 5, 5 ), 10, 'G2P2L1M-51155' );
+ $this->checkC( $data, $mk( 5, 2, 2, 5, 5 ), 5, 'G2P2L1M-52255' );
}
/**
@@ -229,7 +229,7 @@ class ApiQueryContinueTest extends ApiQueryContinueTestBase {
*/
public function testSameGenAndProp() {
$this->mVerbose = false;
- $mk = function( $g, $gDir, $p, $pDir ) {
+ $mk = function ( $g, $gDir, $p, $pDir ) {
return array(
'titles' => 'AQCT-1',
'generator' => 'templates',
@@ -241,31 +241,31 @@ class ApiQueryContinueTest extends ApiQueryContinueTestBase {
);
};
// generator + 1 prop
- $data = $this->query( $mk(99,true,99,true), 1, 'G=P', false );
+ $data = $this->query( $mk( 99, true, 99, true ), 1, 'G=P', false );
- $this->checkC( $data, $mk(1,true,1,true), 4, 'G=P-1t1t' );
- $this->checkC( $data, $mk(2,true,2,true), 2, 'G=P-2t2t' );
- $this->checkC( $data, $mk(3,true,3,true), 2, 'G=P-3t3t' );
- $this->checkC( $data, $mk(1,true,3,true), 4, 'G=P-1t3t' );
- $this->checkC( $data, $mk(3,true,1,true), 2, 'G=P-3t1t' );
+ $this->checkC( $data, $mk( 1, true, 1, true ), 4, 'G=P-1t1t' );
+ $this->checkC( $data, $mk( 2, true, 2, true ), 2, 'G=P-2t2t' );
+ $this->checkC( $data, $mk( 3, true, 3, true ), 2, 'G=P-3t3t' );
+ $this->checkC( $data, $mk( 1, true, 3, true ), 4, 'G=P-1t3t' );
+ $this->checkC( $data, $mk( 3, true, 1, true ), 2, 'G=P-3t1t' );
- $this->checkC( $data, $mk(1,true,1,false), 4, 'G=P-1t1f' );
- $this->checkC( $data, $mk(2,true,2,false), 2, 'G=P-2t2f' );
- $this->checkC( $data, $mk(3,true,3,false), 2, 'G=P-3t3f' );
- $this->checkC( $data, $mk(1,true,3,false), 4, 'G=P-1t3f' );
- $this->checkC( $data, $mk(3,true,1,false), 2, 'G=P-3t1f' );
+ $this->checkC( $data, $mk( 1, true, 1, false ), 4, 'G=P-1t1f' );
+ $this->checkC( $data, $mk( 2, true, 2, false ), 2, 'G=P-2t2f' );
+ $this->checkC( $data, $mk( 3, true, 3, false ), 2, 'G=P-3t3f' );
+ $this->checkC( $data, $mk( 1, true, 3, false ), 4, 'G=P-1t3f' );
+ $this->checkC( $data, $mk( 3, true, 1, false ), 2, 'G=P-3t1f' );
- $this->checkC( $data, $mk(1,false,1,true), 4, 'G=P-1f1t' );
- $this->checkC( $data, $mk(2,false,2,true), 2, 'G=P-2f2t' );
- $this->checkC( $data, $mk(3,false,3,true), 2, 'G=P-3f3t' );
- $this->checkC( $data, $mk(1,false,3,true), 4, 'G=P-1f3t' );
- $this->checkC( $data, $mk(3,false,1,true), 2, 'G=P-3f1t' );
+ $this->checkC( $data, $mk( 1, false, 1, true ), 4, 'G=P-1f1t' );
+ $this->checkC( $data, $mk( 2, false, 2, true ), 2, 'G=P-2f2t' );
+ $this->checkC( $data, $mk( 3, false, 3, true ), 2, 'G=P-3f3t' );
+ $this->checkC( $data, $mk( 1, false, 3, true ), 4, 'G=P-1f3t' );
+ $this->checkC( $data, $mk( 3, false, 1, true ), 2, 'G=P-3f1t' );
- $this->checkC( $data, $mk(1,false,1,false), 4, 'G=P-1f1f' );
- $this->checkC( $data, $mk(2,false,2,false), 2, 'G=P-2f2f' );
- $this->checkC( $data, $mk(3,false,3,false), 2, 'G=P-3f3f' );
- $this->checkC( $data, $mk(1,false,3,false), 4, 'G=P-1f3f' );
- $this->checkC( $data, $mk(3,false,1,false), 2, 'G=P-3f1f' );
+ $this->checkC( $data, $mk( 1, false, 1, false ), 4, 'G=P-1f1f' );
+ $this->checkC( $data, $mk( 2, false, 2, false ), 2, 'G=P-2f2f' );
+ $this->checkC( $data, $mk( 3, false, 3, false ), 2, 'G=P-3f3f' );
+ $this->checkC( $data, $mk( 1, false, 3, false ), 4, 'G=P-1f3f' );
+ $this->checkC( $data, $mk( 3, false, 1, false ), 2, 'G=P-3f1f' );
}
/**
@@ -274,7 +274,7 @@ class ApiQueryContinueTest extends ApiQueryContinueTestBase {
*/
public function testSameGenList() {
$this->mVerbose = false;
- $mk = function( $g, $gDir, $l, $pDir ) {
+ $mk = function ( $g, $gDir, $l, $pDir ) {
return array(
'generator' => 'allpages',
'gapprefix' => 'AQCT-',
@@ -287,27 +287,27 @@ class ApiQueryContinueTest extends ApiQueryContinueTestBase {
);
};
// generator + 1 list
- $data = $this->query( $mk(99,true,99,true), 1, 'G=L', false );
+ $data = $this->query( $mk( 99, true, 99, true ), 1, 'G=L', false );
- $this->checkC( $data, $mk(1,true,1,true), 5, 'G=L-1t1t' );
- $this->checkC( $data, $mk(2,true,2,true), 3, 'G=L-2t2t' );
- $this->checkC( $data, $mk(3,true,3,true), 2, 'G=L-3t3t' );
- $this->checkC( $data, $mk(1,true,3,true), 5, 'G=L-1t3t' );
- $this->checkC( $data, $mk(3,true,1,true), 5, 'G=L-3t1t' );
- $this->checkC( $data, $mk(1,true,1,false), 5, 'G=L-1t1f' );
- $this->checkC( $data, $mk(2,true,2,false), 3, 'G=L-2t2f' );
- $this->checkC( $data, $mk(3,true,3,false), 2, 'G=L-3t3f' );
- $this->checkC( $data, $mk(1,true,3,false), 5, 'G=L-1t3f' );
- $this->checkC( $data, $mk(3,true,1,false), 5, 'G=L-3t1f' );
- $this->checkC( $data, $mk(1,false,1,true), 5, 'G=L-1f1t' );
- $this->checkC( $data, $mk(2,false,2,true), 3, 'G=L-2f2t' );
- $this->checkC( $data, $mk(3,false,3,true), 2, 'G=L-3f3t' );
- $this->checkC( $data, $mk(1,false,3,true), 5, 'G=L-1f3t' );
- $this->checkC( $data, $mk(3,false,1,true), 5, 'G=L-3f1t' );
- $this->checkC( $data, $mk(1,false,1,false), 5, 'G=L-1f1f' );
- $this->checkC( $data, $mk(2,false,2,false), 3, 'G=L-2f2f' );
- $this->checkC( $data, $mk(3,false,3,false), 2, 'G=L-3f3f' );
- $this->checkC( $data, $mk(1,false,3,false), 5, 'G=L-1f3f' );
- $this->checkC( $data, $mk(3,false,1,false), 5, 'G=L-3f1f' );
+ $this->checkC( $data, $mk( 1, true, 1, true ), 5, 'G=L-1t1t' );
+ $this->checkC( $data, $mk( 2, true, 2, true ), 3, 'G=L-2t2t' );
+ $this->checkC( $data, $mk( 3, true, 3, true ), 2, 'G=L-3t3t' );
+ $this->checkC( $data, $mk( 1, true, 3, true ), 5, 'G=L-1t3t' );
+ $this->checkC( $data, $mk( 3, true, 1, true ), 5, 'G=L-3t1t' );
+ $this->checkC( $data, $mk( 1, true, 1, false ), 5, 'G=L-1t1f' );
+ $this->checkC( $data, $mk( 2, true, 2, false ), 3, 'G=L-2t2f' );
+ $this->checkC( $data, $mk( 3, true, 3, false ), 2, 'G=L-3t3f' );
+ $this->checkC( $data, $mk( 1, true, 3, false ), 5, 'G=L-1t3f' );
+ $this->checkC( $data, $mk( 3, true, 1, false ), 5, 'G=L-3t1f' );
+ $this->checkC( $data, $mk( 1, false, 1, true ), 5, 'G=L-1f1t' );
+ $this->checkC( $data, $mk( 2, false, 2, true ), 3, 'G=L-2f2t' );
+ $this->checkC( $data, $mk( 3, false, 3, true ), 2, 'G=L-3f3t' );
+ $this->checkC( $data, $mk( 1, false, 3, true ), 5, 'G=L-1f3t' );
+ $this->checkC( $data, $mk( 3, false, 1, true ), 5, 'G=L-3f1t' );
+ $this->checkC( $data, $mk( 1, false, 1, false ), 5, 'G=L-1f1f' );
+ $this->checkC( $data, $mk( 2, false, 2, false ), 3, 'G=L-2f2f' );
+ $this->checkC( $data, $mk( 3, false, 3, false ), 2, 'G=L-3f3f' );
+ $this->checkC( $data, $mk( 1, false, 3, false ), 5, 'G=L-1f3f' );
+ $this->checkC( $data, $mk( 3, false, 1, false ), 5, 'G=L-3f1f' );
}
}
diff --git a/tests/phpunit/includes/api/query/ApiQueryContinueTestBase.php b/tests/phpunit/includes/api/query/ApiQueryContinueTestBase.php
index 47174796..fbb1e640 100644
--- a/tests/phpunit/includes/api/query/ApiQueryContinueTestBase.php
+++ b/tests/phpunit/includes/api/query/ApiQueryContinueTestBase.php
@@ -24,7 +24,7 @@
* @file
*/
-require_once( 'ApiQueryTestBase.php' );
+require_once 'ApiQueryTestBase.php';
abstract class ApiQueryContinueTestBase extends ApiQueryTestBase {
@@ -36,7 +36,7 @@ abstract class ApiQueryContinueTestBase extends ApiQueryTestBase {
/**
* Run query() and compare against expected values
*/
- protected function checkC( $expected, $params, $expectedCount, $id, $continue = true ) {
+ protected function checkC( $expected, $params, $expectedCount, $id, $continue = true ) {
$result = $this->query( $params, $expectedCount, $id, $continue );
$this->assertResult( $expected, $result, $id );
}
@@ -52,7 +52,7 @@ abstract class ApiQueryContinueTestBase extends ApiQueryTestBase {
*/
protected function query( $params, $expectedCount, $id, $useContinue = true ) {
if ( isset( $params['action'] ) ) {
- $this->assertEquals( 'query', $params['action'], 'Invalid query action');
+ $this->assertEquals( 'query', $params['action'], 'Invalid query action' );
} else {
$params['action'] = 'query';
}
@@ -64,17 +64,18 @@ abstract class ApiQueryContinueTestBase extends ApiQueryTestBase {
$continue = array();
do {
$request = array_merge( $params, $continue );
- uksort( $request, function( $a, $b ) {
+ uksort( $request, function ( $a, $b ) {
// put 'continue' params at the end - lazy method
$a = strpos( $a, 'continue' ) !== false ? 'zzz ' . $a : $a;
$b = strpos( $b, 'continue' ) !== false ? 'zzz ' . $b : $b;
+
return strcmp( $a, $b );
} );
$reqStr = http_build_query( $request );
//$reqStr = str_replace( '&', ' & ', $reqStr );
$this->assertLessThan( $expectedCount, $count, "$id more data: $reqStr" );
if ( $this->mVerbose ) {
- print ("$id (#$count): $reqStr\n");
+ print "$id (#$count): $reqStr\n";
}
try {
$data = $this->doApiRequest( $request );
@@ -103,52 +104,57 @@ abstract class ApiQueryContinueTestBase extends ApiQueryTestBase {
if ( $expectedCount > $count ) {
print "***** $id Finished early in $count turns. $expectedCount was expected\n";
}
+
return $result;
} elseif ( !$useContinue ) {
$this->assertFalse( 'Non-smart query must be requested all at once' );
}
- } while( true );
+ } while ( true );
}
private function printResult( $data ) {
$q = $data['query'];
$print = array();
- if (isset($q['pages'])) {
- foreach ($q['pages'] as $p) {
+ if ( isset( $q['pages'] ) ) {
+ foreach ( $q['pages'] as $p ) {
$m = $p['title'];
- if (isset($p['links'])) {
- $m .= '/[' . implode(',', array_map(
- function ($v) {
+ if ( isset( $p['links'] ) ) {
+ $m .= '/[' . implode( ',', array_map(
+ function ( $v ) {
return $v['title'];
},
- $p['links'])) . ']';
+ $p['links'] ) ) . ']';
}
- if (isset($p['categories'])) {
- $m .= '/(' . implode(',', array_map(
- function ($v) {
- return str_replace('Category:', '', $v['title']);
+ if ( isset( $p['categories'] ) ) {
+ $m .= '/(' . implode( ',', array_map(
+ function ( $v ) {
+ return str_replace( 'Category:', '', $v['title'] );
},
- $p['categories'])) . ')';
+ $p['categories'] ) ) . ')';
}
$print[] = $m;
}
}
- if (isset($q['allcategories'])) {
- $print[] = '*Cats/(' . implode(',', array_map(
- function ($v) { return $v['*']; },
- $q['allcategories'])) . ')';
+ if ( isset( $q['allcategories'] ) ) {
+ $print[] = '*Cats/(' . implode( ',', array_map(
+ function ( $v ) {
+ return $v['*'];
+ },
+ $q['allcategories'] ) ) . ')';
}
self::GetItems( $q, 'allpages', 'Pages', $print );
self::GetItems( $q, 'alllinks', 'Links', $print );
self::GetItems( $q, 'alltransclusions', 'Trnscl', $print );
- print(' ' . implode(' ', $print) . "\n");
+ print ' ' . implode( ' ', $print ) . "\n";
}
private static function GetItems( $q, $moduleName, $name, &$print ) {
- if (isset($q[$moduleName])) {
- $print[] = "*$name/[" . implode(',',
- array_map( function ($v) { return $v['title']; },
- $q[$moduleName])) . ']';
+ if ( isset( $q[$moduleName] ) ) {
+ $print[] = "*$name/[" . implode( ',',
+ array_map( function ( $v ) {
+ return $v['title'];
+ },
+ $q[$moduleName] ) ) . ']';
}
}
@@ -164,12 +170,12 @@ abstract class ApiQueryContinueTestBase extends ApiQueryTestBase {
$this->assertEquals( $results, $newResult, 'Repeated result must be the same as before' );
} else {
$sort = null;
- foreach( $newResult as $key => $value ) {
+ foreach ( $newResult as $key => $value ) {
if ( !$numericIds && $sort === null ) {
if ( !is_array( $value ) ) {
$sort = false;
} elseif ( array_key_exists( 'title', $value ) ) {
- $sort = function( $a, $b ) {
+ $sort = function ( $a, $b ) {
return strcmp( $a['title'], $b['title'] );
};
} else {
diff --git a/tests/phpunit/includes/api/query/ApiQueryRevisionsTest.php b/tests/phpunit/includes/api/query/ApiQueryRevisionsTest.php
index 7f5fe91c..1bca2256 100644
--- a/tests/phpunit/includes/api/query/ApiQueryRevisionsTest.php
+++ b/tests/phpunit/includes/api/query/ApiQueryRevisionsTest.php
@@ -10,7 +10,7 @@ class ApiQueryRevisionsTest extends ApiTestCase {
/**
* @group medium
*/
- function testContentComesWithContentModelAndFormat() {
+ public function testContentComesWithContentModelAndFormat() {
$pageName = 'Help:' . __METHOD__;
$title = Title::newFromText( $pageName );
$page = WikiPage::factory( $title );
diff --git a/tests/phpunit/includes/api/query/ApiQueryTest.php b/tests/phpunit/includes/api/query/ApiQueryTest.php
index 7fb53073..f5645555 100644
--- a/tests/phpunit/includes/api/query/ApiQueryTest.php
+++ b/tests/phpunit/includes/api/query/ApiQueryTest.php
@@ -12,7 +12,7 @@ class ApiQueryTest extends ApiTestCase {
$this->doLogin();
}
- function testTitlesGetNormalized() {
+ public function testTitlesGetNormalized() {
global $wgMetaNamespace;
@@ -20,7 +20,6 @@ class ApiQueryTest extends ApiTestCase {
'action' => 'query',
'titles' => 'Project:articleA|article_B' ) );
-
$this->assertArrayHasKey( 'query', $data[0] );
$this->assertArrayHasKey( 'normalized', $data[0]['query'] );
@@ -42,10 +41,9 @@ class ApiQueryTest extends ApiTestCase {
),
$data[0]['query']['normalized'][1]
);
-
}
- function testTitlesAreRejectedIfInvalid() {
+ public function testTitlesAreRejectedIfInvalid() {
$title = false;
while ( !$title || Title::newFromText( $title )->exists() ) {
$title = md5( mt_rand( 0, 10000 ) + rand( 0, 999000 ) );
@@ -65,5 +63,4 @@ class ApiQueryTest extends ApiTestCase {
$this->assertArrayHasKey( 'missing', $data[0]['query']['pages'][-2] );
$this->assertArrayHasKey( 'invalid', $data[0]['query']['pages'][-1] );
}
-
}
diff --git a/tests/phpunit/includes/api/query/ApiQueryTestBase.php b/tests/phpunit/includes/api/query/ApiQueryTestBase.php
index 7b9f8ede..8ee8ea96 100644
--- a/tests/phpunit/includes/api/query/ApiQueryTestBase.php
+++ b/tests/phpunit/includes/api/query/ApiQueryTestBase.php
@@ -24,7 +24,6 @@
* @file
*/
-
/** This class has some common functionality for testing query module
*/
abstract class ApiQueryTestBase extends ApiTestCase {
@@ -43,11 +42,12 @@ STR;
protected function merge( /*...*/ ) {
$request = array();
$expected = array();
- foreach ( func_get_args() as $v ) {
+ foreach ( func_get_args() as $v ) {
list( $req, $exp ) = $this->validateRequestExpectedPair( $v );
$request = array_merge_recursive( $request, $req );
$this->mergeExpected( $expected, $exp );
}
+
return array( $request, $expected );
}
@@ -57,11 +57,12 @@ STR;
*/
private function validateRequestExpectedPair( $v ) {
$this->assertType( 'array', $v, self::PARAM_ASSERT );
- $this->assertEquals( 2, count($v), self::PARAM_ASSERT );
+ $this->assertEquals( 2, count( $v ), self::PARAM_ASSERT );
$this->assertArrayHasKey( 0, $v, self::PARAM_ASSERT );
$this->assertArrayHasKey( 1, $v, self::PARAM_ASSERT );
$this->assertType( 'array', $v[0], self::PARAM_ASSERT );
$this->assertType( 'array', $v[1], self::PARAM_ASSERT );
+
return $v;
}
@@ -71,7 +72,7 @@ STR;
private function mergeExpected( &$all, $item ) {
foreach ( $item as $k => $v ) {
if ( array_key_exists( $k, $all ) ) {
- if ( is_array ( $all[$k] ) ) {
+ if ( is_array( $all[$k] ) ) {
$this->mergeExpected( $all[$k], $v );
} else {
$this->assertEquals( $all[$k], $v );
@@ -108,10 +109,10 @@ STR;
if ( is_array( $message ) ) {
$message = http_build_query( $message );
}
- print( "\nRequest: $message\n" );
- print( "\nExpected:\n" );
+ print "\nRequest: $message\n";
+ print "\nExpected:\n";
print_r( $exp );
- print( "\nResult:\n" );
+ print "\nResult:\n";
print_r( $result );
throw $e; // rethrow it
}
diff --git a/tests/phpunit/includes/cache/GenderCacheTest.php b/tests/phpunit/includes/cache/GenderCacheTest.php
index ee3db3e8..ce2db5d7 100644
--- a/tests/phpunit/includes/cache/GenderCacheTest.php
+++ b/tests/phpunit/includes/cache/GenderCacheTest.php
@@ -46,8 +46,9 @@ class GenderCacheTest extends MediaWikiLangTestCase {
* test usernames
*
* @dataProvider provideUserGenders
+ * @covers GenderCache::getGenderOf
*/
- function testUserName( $username, $expectedGender ) {
+ public function testUserName( $username, $expectedGender ) {
$genderCache = GenderCache::singleton();
$gender = $genderCache->getGenderOf( $username );
$this->assertEquals( $gender, $expectedGender, "GenderCache normal" );
@@ -57,8 +58,9 @@ class GenderCacheTest extends MediaWikiLangTestCase {
* genderCache should work with user objects, too
*
* @dataProvider provideUserGenders
+ * @covers GenderCache::getGenderOf
*/
- function testUserObjects( $username, $expectedGender ) {
+ public function testUserObjects( $username, $expectedGender ) {
$genderCache = GenderCache::singleton();
$user = User::newFromName( $username );
$gender = $genderCache->getGenderOf( $user );
@@ -82,8 +84,9 @@ class GenderCacheTest extends MediaWikiLangTestCase {
* against the never existing username
*
* @dataProvider provideStripSubpages
+ * @covers GenderCache::getGenderOf
*/
- function testStripSubpages( $pageWithSubpage, $expectedGender ) {
+ public function testStripSubpages( $pageWithSubpage, $expectedGender ) {
$genderCache = GenderCache::singleton();
$gender = $genderCache->getGenderOf( $pageWithSubpage );
$this->assertEquals( $gender, $expectedGender, "GenderCache must strip of subpages" );
diff --git a/tests/phpunit/includes/cache/MessageCacheTest.php b/tests/phpunit/includes/cache/MessageCacheTest.php
new file mode 100644
index 00000000..803acf73
--- /dev/null
+++ b/tests/phpunit/includes/cache/MessageCacheTest.php
@@ -0,0 +1,128 @@
+<?php
+
+/**
+ * @group Database
+ * @group Cache
+ * @covers MessageCache
+ */
+class MessageCacheTest extends MediaWikiLangTestCase {
+
+ protected function setUp() {
+ parent::setUp();
+ $this->configureLanguages();
+ MessageCache::singleton()->enable();
+ }
+
+ /**
+ * Helper function -- setup site language for testing
+ */
+ protected function configureLanguages() {
+ // for the test, we need the content language to be anything but English,
+ // let's choose e.g. German (de)
+ $langCode = 'de';
+ $langObj = Language::factory( $langCode );
+
+ $this->setMwGlobals( array(
+ 'wgLanguageCode' => $langCode,
+ 'wgLang' => $langObj,
+ 'wgContLang' => $langObj,
+ ) );
+ }
+
+ function addDBData() {
+ $this->configureLanguages();
+
+ // Set up messages and fallbacks ab -> ru -> de
+ $this->makePage( 'FallbackLanguageTest-Full', 'ab' );
+ $this->makePage( 'FallbackLanguageTest-Full', 'ru' );
+ $this->makePage( 'FallbackLanguageTest-Full', 'de' );
+
+ // Fallbacks where ab does not exist
+ $this->makePage( 'FallbackLanguageTest-Partial', 'ru' );
+ $this->makePage( 'FallbackLanguageTest-Partial', 'de' );
+
+ // Fallback to the content language
+ $this->makePage( 'FallbackLanguageTest-ContLang', 'de' );
+
+ // Add customizations for an existing message.
+ $this->makePage( 'sunday', 'ru' );
+
+ // Full key tests -- always want russian
+ $this->makePage( 'MessageCacheTest-FullKeyTest', 'ab' );
+ $this->makePage( 'MessageCacheTest-FullKeyTest', 'ru' );
+
+ // In content language -- get base if no derivative
+ $this->makePage( 'FallbackLanguageTest-NoDervContLang', 'de', 'de/none', false );
+ }
+
+ /**
+ * Helper function for addDBData -- adds a simple page to the database
+ *
+ * @param string $title Title of page to be created
+ * @param string $lang Language and content of the created page
+ * @param string|null $content Content of the created page, or null for a generic string
+ * @param bool $createSubPage Set to false if a root page should be created
+ */
+ protected function makePage( $title, $lang, $content = null, $createSubPage = true ) {
+ global $wgContLang;
+
+ if ( $content === null ) {
+ $content = $lang;
+ }
+ if ( $lang !== $wgContLang->getCode() || $createSubPage ) {
+ $title = "$title/$lang";
+ }
+
+ $title = Title::newFromText( $title, NS_MEDIAWIKI );
+ $wikiPage = new WikiPage( $title );
+ $contentHandler = ContentHandler::makeContent( $content, $title );
+ $wikiPage->doEditContent( $contentHandler, "$lang translation test case" );
+ }
+
+ /**
+ * Test message fallbacks, bug #1495
+ *
+ * @dataProvider provideMessagesForFallback
+ */
+ public function testMessageFallbacks( $message, $lang, $expectedContent ) {
+ $result = MessageCache::singleton()->get( $message, true, $lang );
+ $this->assertEquals( $expectedContent, $result, "Message fallback failed." );
+ }
+
+ function provideMessagesForFallback() {
+ return array(
+ array( 'FallbackLanguageTest-Full', 'ab', 'ab' ),
+ array( 'FallbackLanguageTest-Partial', 'ab', 'ru' ),
+ array( 'FallbackLanguageTest-ContLang', 'ab', 'de' ),
+ array( 'FallbackLanguageTest-None', 'ab', false ),
+
+ // Existing message with customizations on the fallbacks
+ array( 'sunday', 'ab', 'амҽыш' ),
+
+ // bug 46579
+ array( 'FallbackLanguageTest-NoDervContLang', 'de', 'de/none' ),
+ // UI language different from content language should only use de/none as last option
+ array( 'FallbackLanguageTest-NoDervContLang', 'fit', 'de/none' ),
+ );
+ }
+
+ /**
+ * There's a fallback case where the message key is given as fully qualified -- this
+ * should ignore the passed $lang and use the language from the key
+ *
+ * @dataProvider provideMessagesForFullKeys
+ */
+ public function testFullKeyBehaviour( $message, $lang, $expectedContent ) {
+ $result = MessageCache::singleton()->get( $message, true, $lang, true );
+ $this->assertEquals( $expectedContent, $result, "Full key message fallback failed." );
+ }
+
+ function provideMessagesForFullKeys() {
+ return array(
+ array( 'MessageCacheTest-FullKeyTest/ru', 'ru', 'ru' ),
+ array( 'MessageCacheTest-FullKeyTest/ru', 'ab', 'ru' ),
+ array( 'MessageCacheTest-FullKeyTest/ru/foo', 'ru', false ),
+ );
+ }
+
+}
diff --git a/tests/phpunit/includes/cache/ProcessCacheLRUTest.php b/tests/phpunit/includes/cache/ProcessCacheLRUTest.php
index c7e75d99..d3793d83 100644
--- a/tests/phpunit/includes/cache/ProcessCacheLRUTest.php
+++ b/tests/phpunit/includes/cache/ProcessCacheLRUTest.php
@@ -52,13 +52,14 @@ class ProcessCacheLRUTest extends MediaWikiTestCase {
for ( $i = $firstKey; $i <= $lastKey; $i++ ) {
$expected["cache-key-$i"] = array( "prop-$i" => "value-$i" );
}
+
return $expected;
}
/**
* Highlight diff between assertEquals and assertNotSame
*/
- function testPhpUnitArrayEquality() {
+ public function testPhpUnitArrayEquality() {
$one = array( 'A' => 1, 'B' => 2 );
$two = array( 'B' => 2, 'A' => 1 );
$this->assertEquals( $one, $two ); // ==
@@ -69,8 +70,8 @@ class ProcessCacheLRUTest extends MediaWikiTestCase {
* @dataProvider provideInvalidConstructorArg
* @expectedException MWException
*/
- function testConstructorGivenInvalidValue( $maxSize ) {
- $c = new ProcessCacheLRUTestable( $maxSize );
+ public function testConstructorGivenInvalidValue( $maxSize ) {
+ new ProcessCacheLRUTestable( $maxSize );
}
/**
@@ -87,7 +88,7 @@ class ProcessCacheLRUTest extends MediaWikiTestCase {
);
}
- function testAddAndGetAKey() {
+ public function testAddAndGetAKey() {
$oneCache = new ProcessCacheLRUTestable( 1 );
$this->assertCacheEmpty( $oneCache );
@@ -98,7 +99,7 @@ class ProcessCacheLRUTest extends MediaWikiTestCase {
$this->assertEquals( 'value1', $oneCache->get( 'cache-key', 'prop1' ) );
}
- function testDeleteOldKey() {
+ public function testDeleteOldKey() {
$oneCache = new ProcessCacheLRUTestable( 1 );
$this->assertCacheEmpty( $oneCache );
@@ -116,7 +117,7 @@ class ProcessCacheLRUTest extends MediaWikiTestCase {
* @param $cacheMaxEntries Maximum entry the created cache will hold
* @param $entryToFill Number of entries to insert in the created cache.
*/
- function testFillingCache( $cacheMaxEntries, $entryToFill, $msg = '' ) {
+ public function testFillingCache( $cacheMaxEntries, $entryToFill, $msg = '' ) {
$cache = new ProcessCacheLRUTestable( $cacheMaxEntries );
$this->fillCache( $cache, $entryToFill );
@@ -125,7 +126,6 @@ class ProcessCacheLRUTest extends MediaWikiTestCase {
$cache->getCache(),
"Filling a $cacheMaxEntries entries cache with $entryToFill entries"
);
-
}
/**
@@ -145,7 +145,7 @@ class ProcessCacheLRUTest extends MediaWikiTestCase {
* Create a cache with only one remaining entry then update
* the first inserted entry. Should bump it to the top.
*/
- function testReplaceExistingKeyShouldBumpEntryToTop() {
+ public function testReplaceExistingKeyShouldBumpEntryToTop() {
$maxEntries = 3;
$cache = new ProcessCacheLRUTestable( $maxEntries );
@@ -164,7 +164,7 @@ class ProcessCacheLRUTest extends MediaWikiTestCase {
);
}
- function testRecentlyAccessedKeyStickIn() {
+ public function testRecentlyAccessedKeyStickIn() {
$cache = new ProcessCacheLRUTestable( 2 );
$cache->set( 'first', 'prop1', 'value1' );
$cache->set( 'second', 'prop2', 'value2' );
@@ -183,7 +183,7 @@ class ProcessCacheLRUTest extends MediaWikiTestCase {
* Given a cache having 1,2,3 as key, updating 2 should bump 2 to
* the top of the queue with the new value: 1,3,2* (* = updated).
*/
- function testReplaceExistingKeyInAFullCacheShouldBumpToTop() {
+ public function testReplaceExistingKeyInAFullCacheShouldBumpToTop() {
$maxEntries = 3;
$cache = new ProcessCacheLRUTestable( $maxEntries );
@@ -204,7 +204,7 @@ class ProcessCacheLRUTest extends MediaWikiTestCase {
);
}
- function testBumpExistingKeyToTop() {
+ public function testBumpExistingKeyToTop() {
$cache = new ProcessCacheLRUTestable( 3 );
$this->fillCache( $cache, 3 );
@@ -218,9 +218,7 @@ class ProcessCacheLRUTest extends MediaWikiTestCase {
),
$cache->getCache()
);
-
}
-
}
/**
diff --git a/tests/phpunit/includes/content/ContentHandlerTest.php b/tests/phpunit/includes/content/ContentHandlerTest.php
index 19ceadd5..aedf594d 100644
--- a/tests/phpunit/includes/content/ContentHandlerTest.php
+++ b/tests/phpunit/includes/content/ContentHandlerTest.php
@@ -10,9 +10,9 @@
*/
class ContentHandlerTest extends MediaWikiTestCase {
- public function setup() {
+ public function setUp() {
global $wgContLang;
- parent::setup();
+ parent::setUp();
$this->setMwGlobals( array(
'wgExtraNamespaces' => array(
@@ -70,6 +70,7 @@ class ContentHandlerTest extends MediaWikiTestCase {
/**
* @dataProvider dataGetDefaultModelFor
+ * @covers ContentHandler::getDefaultModelFor
*/
public function testGetDefaultModelFor( $title, $expectedModelId ) {
$title = Title::newFromText( $title );
@@ -78,6 +79,7 @@ class ContentHandlerTest extends MediaWikiTestCase {
/**
* @dataProvider dataGetDefaultModelFor
+ * @covers ContentHandler::getForTitle
*/
public function testGetForTitle( $title, $expectedContentModel ) {
$title = Title::newFromText( $title );
@@ -97,6 +99,7 @@ class ContentHandlerTest extends MediaWikiTestCase {
/**
* @dataProvider dataGetLocalizedName
+ * @covers ContentHandler::getLocalizedName
*/
public function testGetLocalizedName( $id, $expected ) {
$name = ContentHandler::getLocalizedName( $id );
@@ -131,6 +134,7 @@ class ContentHandlerTest extends MediaWikiTestCase {
/**
* @dataProvider dataGetPageLanguage
+ * @covers ContentHandler::getPageLanguage
*/
public function testGetPageLanguage( $title, $expected ) {
if ( is_string( $title ) ) {
@@ -145,62 +149,81 @@ class ContentHandlerTest extends MediaWikiTestCase {
$this->assertEquals( $expected->getCode(), $lang->getCode() );
}
- public function testGetContentText_Null() {
- global $wgContentHandlerTextFallback;
+ public static function dataGetContentText_Null() {
+ return array(
+ array( 'fail' ),
+ array( 'serialize' ),
+ array( 'ignore' ),
+ );
+ }
- $content = null;
+ /**
+ * @dataProvider dataGetContentText_Null
+ * @covers ContentHandler::getContentText
+ */
+ public function testGetContentText_Null( $contentHandlerTextFallback ) {
+ $this->setMwGlobals( 'wgContentHandlerTextFallback', $contentHandlerTextFallback );
- $wgContentHandlerTextFallback = 'fail';
- $text = ContentHandler::getContentText( $content );
- $this->assertEquals( '', $text );
+ $content = null;
- $wgContentHandlerTextFallback = 'serialize';
$text = ContentHandler::getContentText( $content );
$this->assertEquals( '', $text );
+ }
- $wgContentHandlerTextFallback = 'ignore';
- $text = ContentHandler::getContentText( $content );
- $this->assertEquals( '', $text );
+ public static function dataGetContentText_TextContent() {
+ return array(
+ array( 'fail' ),
+ array( 'serialize' ),
+ array( 'ignore' ),
+ );
}
- public function testGetContentText_TextContent() {
- global $wgContentHandlerTextFallback;
+ /**
+ * @dataProvider dataGetContentText_TextContent
+ * @covers ContentHandler::getContentText
+ */
+ public function testGetContentText_TextContent( $contentHandlerTextFallback ) {
+ $this->setMwGlobals( 'wgContentHandlerTextFallback', $contentHandlerTextFallback );
$content = new WikitextContent( "hello world" );
- $wgContentHandlerTextFallback = 'fail';
- $text = ContentHandler::getContentText( $content );
- $this->assertEquals( $content->getNativeData(), $text );
-
- $wgContentHandlerTextFallback = 'serialize';
- $text = ContentHandler::getContentText( $content );
- $this->assertEquals( $content->serialize(), $text );
-
- $wgContentHandlerTextFallback = 'ignore';
$text = ContentHandler::getContentText( $content );
$this->assertEquals( $content->getNativeData(), $text );
}
- public function testGetContentText_NonTextContent() {
- global $wgContentHandlerTextFallback;
+ /**
+ * ContentHandler::getContentText should have thrown an exception for non-text Content object
+ * @expectedException MWException
+ * @covers ContentHandler::getContentText
+ */
+ public function testGetContentText_NonTextContent_fail() {
+ $this->setMwGlobals( 'wgContentHandlerTextFallback', 'fail' );
$content = new DummyContentForTesting( "hello world" );
- $wgContentHandlerTextFallback = 'fail';
+ ContentHandler::getContentText( $content );
+ }
- try {
- $text = ContentHandler::getContentText( $content );
+ /**
+ * @covers ContentHandler::getContentText
+ */
+ public function testGetContentText_NonTextContent_serialize() {
+ $this->setMwGlobals( 'wgContentHandlerTextFallback', 'serialize' );
- $this->fail( "ContentHandler::getContentText should have thrown an exception for non-text Content object" );
- } catch ( MWException $ex ) {
- // as expected
- }
+ $content = new DummyContentForTesting( "hello world" );
- $wgContentHandlerTextFallback = 'serialize';
$text = ContentHandler::getContentText( $content );
$this->assertEquals( $content->serialize(), $text );
+ }
+
+ /**
+ * @covers ContentHandler::getContentText
+ */
+ public function testGetContentText_NonTextContent_ignore() {
+ $this->setMwGlobals( 'wgContentHandlerTextFallback', 'ignore' );
+
+ $content = new DummyContentForTesting( "hello world" );
- $wgContentHandlerTextFallback = 'ignore';
$text = ContentHandler::getContentText( $content );
$this->assertNull( $text );
}
@@ -231,6 +254,7 @@ class ContentHandlerTest extends MediaWikiTestCase {
/**
* @dataProvider dataMakeContent
+ * @covers ContentHandler::makeContent
*/
public function testMakeContent( $data, $title, $modelId, $format, $expectedModelId, $expectedNativeData, $shouldFail ) {
$title = Title::newFromText( $title );
@@ -247,8 +271,7 @@ class ContentHandlerTest extends MediaWikiTestCase {
} catch ( MWException $ex ) {
if ( !$shouldFail ) {
$this->fail( "ContentHandler::makeContent failed unexpectedly: " . $ex->getMessage() );
- }
- else {
+ } else {
// dummy, so we don't get the "test did not perform any assertions" message.
$this->assertTrue( true );
}
@@ -261,6 +284,9 @@ class ContentHandlerTest extends MediaWikiTestCase {
}
*/
+ /**
+ * @covers ContentHandler::runLegacyHooks
+ */
public function testRunLegacyHooks() {
Hooks::register( 'testRunLegacyHooks', __CLASS__ . '::dummyHookHandler' );
@@ -308,6 +334,7 @@ class DummyContentHandlerForTesting extends ContentHandler {
*/
public function unserializeContent( $blob, $format = null ) {
$d = unserialize( $blob );
+
return new DummyContentForTesting( $d );
}
diff --git a/tests/phpunit/includes/content/CssContentTest.php b/tests/phpunit/includes/content/CssContentTest.php
index 8f53dd3e..bd6d41fe 100644
--- a/tests/phpunit/includes/content/CssContentTest.php
+++ b/tests/phpunit/includes/content/CssContentTest.php
@@ -50,12 +50,18 @@ class CssContentTest extends MediaWikiTestCase {
);
}
+ /**
+ * @covers CssContent::getModel
+ */
public function testGetModel() {
$content = $this->newContent( 'hello world.' );
$this->assertEquals( CONTENT_MODEL_CSS, $content->getModel() );
}
+ /**
+ * @covers CssContent::getContentHandler
+ */
public function testGetContentHandler() {
$content = $this->newContent( 'hello world.' );
@@ -73,9 +79,9 @@ class CssContentTest extends MediaWikiTestCase {
/**
* @dataProvider dataEquals
+ * @covers CssContent::equals
*/
public function testEquals( Content $a, Content $b = null, $equal = false ) {
$this->assertEquals( $equal, $a->equals( $b ) );
}
-
}
diff --git a/tests/phpunit/includes/content/JavaScriptContentTest.php b/tests/phpunit/includes/content/JavaScriptContentTest.php
index 2d693feb..c8616ff0 100644
--- a/tests/phpunit/includes/content/JavaScriptContentTest.php
+++ b/tests/phpunit/includes/content/JavaScriptContentTest.php
@@ -89,6 +89,9 @@ class JavaScriptContentTest extends TextContentTest {
);
}
+ /**
+ * @covers JavaScriptContent::addSectionHeader
+ */
public function testAddSectionHeader() {
$content = $this->newContent( 'hello world' );
$c = $content->addSectionHeader( 'test' );
@@ -137,7 +140,7 @@ class JavaScriptContentTest extends TextContentTest {
}
/**
- * @todo: test needs database!
+ * @todo Test needs database!
*/
/*
public function getRedirectChain() {
@@ -147,7 +150,7 @@ class JavaScriptContentTest extends TextContentTest {
*/
/**
- * @todo: test needs database!
+ * @todo Test needs database!
*/
/*
public function getUltimateRedirectTarget() {
@@ -233,6 +236,9 @@ class JavaScriptContentTest extends TextContentTest {
);
}
+ /**
+ * @covers JavaScriptContent::matchMagicWord
+ */
public function testMatchMagicWord() {
$mw = MagicWord::get( "staticredirect" );
@@ -240,6 +246,9 @@ class JavaScriptContentTest extends TextContentTest {
$this->assertFalse( $content->matchMagicWord( $mw ), "should not have matched magic word, since it's not wikitext" );
}
+ /**
+ * @covers JavaScriptContent::updateRedirect
+ */
public function testUpdateRedirect() {
$target = Title::newFromText( "testUpdateRedirect_target" );
@@ -249,12 +258,18 @@ class JavaScriptContentTest extends TextContentTest {
$this->assertTrue( $content->equals( $newContent ), "content should be unchanged since it's not wikitext" );
}
+ /**
+ * @covers JavaScriptContent::getModel
+ */
public function testGetModel() {
$content = $this->newContent( "hello world." );
$this->assertEquals( CONTENT_MODEL_JAVASCRIPT, $content->getModel() );
}
+ /**
+ * @covers JavaScriptContent::getContentHandler
+ */
public function testGetContentHandler() {
$content = $this->newContent( "hello world." );
@@ -269,5 +284,4 @@ class JavaScriptContentTest extends TextContentTest {
array( new JavaScriptContent( "hallo" ), new JavaScriptContent( "HALLO" ), false ),
);
}
-
}
diff --git a/tests/phpunit/includes/content/TextContentTest.php b/tests/phpunit/includes/content/TextContentTest.php
index 382f71a8..a1f099f3 100644
--- a/tests/phpunit/includes/content/TextContentTest.php
+++ b/tests/phpunit/includes/content/TextContentTest.php
@@ -51,6 +51,7 @@ class TextContentTest extends MediaWikiLangTestCase {
/**
* @dataProvider dataGetParserOutput
+ * @covers TextContent::getParserOutput
*/
public function testGetParserOutput( $title, $model, $text, $expectedHtml, $expectedFields = null ) {
$title = Title::newFromText( $title );
@@ -96,6 +97,7 @@ class TextContentTest extends MediaWikiLangTestCase {
/**
* @dataProvider dataPreSaveTransform
+ * @covers TextContent::preSaveTransform
*/
public function testPreSaveTransform( $text, $expected ) {
global $wgContLang;
@@ -119,6 +121,7 @@ class TextContentTest extends MediaWikiLangTestCase {
/**
* @dataProvider dataPreloadTransform
+ * @covers TextContent::preloadTransform
*/
public function testPreloadTransform( $text, $expected ) {
global $wgContLang;
@@ -140,6 +143,7 @@ class TextContentTest extends MediaWikiLangTestCase {
/**
* @dataProvider dataGetRedirectTarget
+ * @covers TextContent::getRedirectTarget
*/
public function testGetRedirectTarget( $text, $expected ) {
$content = $this->newContent( $text );
@@ -154,6 +158,7 @@ class TextContentTest extends MediaWikiLangTestCase {
/**
* @dataProvider dataGetRedirectTarget
+ * @covers TextContent::isRedirect
*/
public function testIsRedirect( $text, $expected ) {
$content = $this->newContent( $text );
@@ -162,7 +167,7 @@ class TextContentTest extends MediaWikiLangTestCase {
}
/**
- * @todo: test needs database! Should be done by a test class in the Database group.
+ * @todo Test needs database! Should be done by a test class in the Database group.
*/
/*
public function getRedirectChain() {
@@ -172,7 +177,7 @@ class TextContentTest extends MediaWikiLangTestCase {
*/
/**
- * @todo: test needs database! Should be done by a test class in the Database group.
+ * @todo Test needs database! Should be done by a test class in the Database group.
*/
/*
public function getUltimateRedirectTarget() {
@@ -209,17 +214,14 @@ class TextContentTest extends MediaWikiLangTestCase {
/**
* @dataProvider dataIsCountable
* @group Database
+ * @covers TextContent::isCountable
*/
public function testIsCountable( $text, $hasLinks, $mode, $expected ) {
- global $wgArticleCountMethod;
-
- $old = $wgArticleCountMethod;
- $wgArticleCountMethod = $mode;
+ $this->setMwGlobals( 'wgArticleCountMethod', $mode );
$content = $this->newContent( $text );
$v = $content->isCountable( $hasLinks, $this->context->getTitle() );
- $wgArticleCountMethod = $old;
$this->assertEquals( $expected, $v, 'isCountable() returned unexpected value ' . var_export( $v, true )
. ' instead of ' . var_export( $expected, true ) . " in mode `$mode` for text \"$text\"" );
@@ -244,6 +246,7 @@ class TextContentTest extends MediaWikiLangTestCase {
/**
* @dataProvider dataGetTextForSummary
+ * @covers TextContent::getTextForSummary
*/
public function testGetTextForSummary( $text, $maxlength, $expected ) {
$content = $this->newContent( $text );
@@ -251,12 +254,18 @@ class TextContentTest extends MediaWikiLangTestCase {
$this->assertEquals( $expected, $content->getTextForSummary( $maxlength ) );
}
+ /**
+ * @covers TextContent::getTextForSearchIndex
+ */
public function testGetTextForSearchIndex() {
$content = $this->newContent( 'hello world.' );
$this->assertEquals( 'hello world.', $content->getTextForSearchIndex() );
}
+ /**
+ * @covers TextContent::copy
+ */
public function testCopy() {
$content = $this->newContent( 'hello world.' );
$copy = $content->copy();
@@ -265,30 +274,45 @@ class TextContentTest extends MediaWikiLangTestCase {
$this->assertEquals( 'hello world.', $copy->getNativeData() );
}
+ /**
+ * @covers TextContent::getSize
+ */
public function testGetSize() {
$content = $this->newContent( 'hello world.' );
$this->assertEquals( 12, $content->getSize() );
}
+ /**
+ * @covers TextContent::getNativeData
+ */
public function testGetNativeData() {
$content = $this->newContent( 'hello world.' );
$this->assertEquals( 'hello world.', $content->getNativeData() );
}
+ /**
+ * @covers TextContent::getWikitextForTransclusion
+ */
public function testGetWikitextForTransclusion() {
$content = $this->newContent( 'hello world.' );
$this->assertEquals( 'hello world.', $content->getWikitextForTransclusion() );
}
+ /**
+ * @covers TextContent::getModel
+ */
public function testGetModel() {
$content = $this->newContent( "hello world." );
$this->assertEquals( CONTENT_MODEL_TEXT, $content->getModel() );
}
+ /**
+ * @covers TextContent::getContentHandler
+ */
public function testGetContentHandler() {
$content = $this->newContent( "hello world." );
@@ -306,6 +330,7 @@ class TextContentTest extends MediaWikiLangTestCase {
/**
* @dataProvider dataIsEmpty
+ * @covers TextContent::isEmpty
*/
public function testIsEmpty( $text, $empty ) {
$content = $this->newContent( $text );
@@ -325,6 +350,7 @@ class TextContentTest extends MediaWikiLangTestCase {
/**
* @dataProvider dataEquals
+ * @covers TextContent::equals
*/
public function testEquals( Content $a, Content $b = null, $equal = false ) {
$this->assertEquals( $equal, $a->equals( $b ) );
@@ -346,6 +372,7 @@ class TextContentTest extends MediaWikiLangTestCase {
/**
* @dataProvider dataGetDeletionUpdates
+ * @covers TextContent::getDeletionUpdates
*/
public function testDeletionUpdates( $title, $model, $text, $expectedStuff ) {
$ns = $this->getDefaultWikitextNS();
@@ -414,6 +441,7 @@ class TextContentTest extends MediaWikiLangTestCase {
/**
* @dataProvider provideConvert
+ * @covers TextContent::convert
*/
public function testConvert( $text, $model, $lossy, $expectedNative ) {
$content = $this->newContent( $text );
@@ -427,5 +455,4 @@ class TextContentTest extends MediaWikiLangTestCase {
$this->assertEquals( $expectedNative, $converted->getNativeData() );
}
}
-
}
diff --git a/tests/phpunit/includes/content/WikitextContentHandlerTest.php b/tests/phpunit/includes/content/WikitextContentHandlerTest.php
index 0f6a968b..75a72784 100644
--- a/tests/phpunit/includes/content/WikitextContentHandlerTest.php
+++ b/tests/phpunit/includes/content/WikitextContentHandlerTest.php
@@ -16,6 +16,9 @@ class WikitextContentHandlerTest extends MediaWikiLangTestCase {
$this->handler = ContentHandler::getForModelID( CONTENT_MODEL_WIKITEXT );
}
+ /**
+ * @covers WikitextContentHandler::serializeContent
+ */
public function testSerializeContent() {
$content = new WikitextContent( 'hello world' );
@@ -30,6 +33,9 @@ class WikitextContentHandlerTest extends MediaWikiLangTestCase {
}
}
+ /**
+ * @covers WikitextContentHandler::unserializeContent
+ */
public function testUnserializeContent() {
$content = $this->handler->unserializeContent( 'hello world' );
$this->assertEquals( 'hello world', $content->getNativeData() );
@@ -45,6 +51,9 @@ class WikitextContentHandlerTest extends MediaWikiLangTestCase {
}
}
+ /**
+ * @covers WikitextContentHandler::makeEmptyContent
+ */
public function testMakeEmptyContent() {
$content = $this->handler->makeEmptyContent();
@@ -61,7 +70,39 @@ class WikitextContentHandlerTest extends MediaWikiLangTestCase {
}
/**
+ * @dataProvider provideMakeRedirectContent
+ * @param Title|string $title Title object or string for Title::newFromText()
+ * @param string $expected Serialized form of the content object built
+ * @covers WikitextContentHandler::makeRedirectContent
+ */
+ public function testMakeRedirectContent( $title, $expected ) {
+ global $wgContLang;
+ $wgContLang->resetNamespaces();
+
+ if ( is_string( $title ) ) {
+ $title = Title::newFromText( $title );
+ }
+ $content = $this->handler->makeRedirectContent( $title );
+ $this->assertEquals( $expected, $content->serialize() );
+ }
+
+ public static function provideMakeRedirectContent() {
+ return array(
+ array( 'Hello', '#REDIRECT [[Hello]]' ),
+ array( 'Template:Hello', '#REDIRECT [[Template:Hello]]' ),
+ array( 'Hello#section', '#REDIRECT [[Hello#section]]' ),
+ array( 'user:john_doe#section', '#REDIRECT [[User:John doe#section]]' ),
+ array( 'MEDIAWIKI:FOOBAR', '#REDIRECT [[MediaWiki:FOOBAR]]' ),
+ array( 'Category:Foo', '#REDIRECT [[:Category:Foo]]' ),
+ array( Title::makeTitle( NS_MAIN, 'en:Foo' ), '#REDIRECT [[en:Foo]]' ),
+ array( Title::makeTitle( NS_MAIN, 'Foo', '', 'en' ), '#REDIRECT [[:en:Foo]]' ),
+ array( Title::makeTitle( NS_MAIN, 'Bar', 'fragment', 'google' ), '#REDIRECT [[google:Bar#fragment]]' ),
+ );
+ }
+
+ /**
* @dataProvider dataIsSupportedFormat
+ * @covers WikitextContentHandler::isSupportedFormat
*/
public function testIsSupportedFormat( $format, $supported ) {
$this->assertEquals( $supported, $this->handler->isSupportedFormat( $format ) );
@@ -101,6 +142,7 @@ class WikitextContentHandlerTest extends MediaWikiLangTestCase {
/**
* @dataProvider dataMerge3
+ * @covers WikitextContentHandler::merge3
*/
public function testMerge3( $old, $mine, $yours, $expected ) {
$this->checkHasDiff3();
@@ -158,6 +200,7 @@ class WikitextContentHandlerTest extends MediaWikiLangTestCase {
/**
* @dataProvider dataGetAutosummary
+ * @covers WikitextContentHandler::getAutosummary
*/
public function testGetAutosummary( $old, $new, $flags, $expected ) {
$oldContent = is_null( $old ) ? null : new WikitextContent( $old );
@@ -181,5 +224,4 @@ class WikitextContentHandlerTest extends MediaWikiLangTestCase {
/*
public function testGetUndoContent( Revision $current, Revision $undo, Revision $undoafter = null ) {}
*/
-
}
diff --git a/tests/phpunit/includes/content/WikitextContentTest.php b/tests/phpunit/includes/content/WikitextContentTest.php
index c9eecf7f..9f20073d 100644
--- a/tests/phpunit/includes/content/WikitextContentTest.php
+++ b/tests/phpunit/includes/content/WikitextContentTest.php
@@ -64,6 +64,7 @@ more stuff
/**
* @dataProvider dataGetSecondaryDataUpdates
* @group Database
+ * @covers WikitextContent::getSecondaryDataUpdates
*/
public function testGetSecondaryDataUpdates( $title, $model, $text, $expectedStuff ) {
$ns = $this->getDefaultWikitextNS();
@@ -116,6 +117,7 @@ just a test"
/**
* @dataProvider dataGetSection
+ * @covers WikitextContent::getSection
*/
public function testGetSection( $text, $sectionId, $expectedText ) {
$content = $this->newContent( $text );
@@ -167,6 +169,7 @@ just a test"
/**
* @dataProvider dataReplaceSection
+ * @covers WikitextContent::replaceSection
*/
public function testReplaceSection( $text, $section, $with, $sectionTitle, $expected ) {
$content = $this->newContent( $text );
@@ -175,6 +178,9 @@ just a test"
$this->assertEquals( $expected, is_null( $c ) ? null : $c->getNativeData() );
}
+ /**
+ * @covers WikitextContent::addSectionHeader
+ */
public function testAddSectionHeader() {
$content = $this->newContent( 'hello world' );
$content = $content->addSectionHeader( 'test' );
@@ -240,7 +246,7 @@ just a test"
}
/**
- * @todo: test needs database! Should be done by a test class in the Database group.
+ * @todo Test needs database! Should be done by a test class in the Database group.
*/
/*
public function getRedirectChain() {
@@ -250,7 +256,7 @@ just a test"
*/
/**
- * @todo: test needs database! Should be done by a test class in the Database group.
+ * @todo Test needs database! Should be done by a test class in the Database group.
*/
/*
public function getUltimateRedirectTarget() {
@@ -319,6 +325,9 @@ just a test"
);
}
+ /**
+ * @covers WikitextContent::matchMagicWord
+ */
public function testMatchMagicWord() {
$mw = MagicWord::get( "staticredirect" );
@@ -329,6 +338,9 @@ just a test"
$this->assertFalse( $content->matchMagicWord( $mw ), "should not have matched magic word" );
}
+ /**
+ * @covers WikitextContent::updateRedirect
+ */
public function testUpdateRedirect() {
$target = Title::newFromText( "testUpdateRedirect_target" );
@@ -348,12 +360,18 @@ just a test"
$this->assertEquals( $target->getFullText(), $newContent->getRedirectTarget()->getFullText() );
}
+ /**
+ * @covers WikitextContent::getModel
+ */
public function testGetModel() {
$content = $this->newContent( "hello world." );
$this->assertEquals( CONTENT_MODEL_WIKITEXT, $content->getModel() );
}
+ /**
+ * @covers WikitextContent::getContentHandler
+ */
public function testGetContentHandler() {
$content = $this->newContent( "hello world." );
@@ -380,7 +398,7 @@ just a test"
CONTENT_MODEL_WIKITEXT, "hello [[world test 21344]]\n",
array( 'LinksDeletionUpdate' => array() )
),
- // @todo: more...?
+ // @todo more...?
);
}
}
diff --git a/tests/phpunit/includes/db/DatabaseMysqlBaseTest.php b/tests/phpunit/includes/db/DatabaseMysqlBaseTest.php
new file mode 100644
index 00000000..ba63c091
--- /dev/null
+++ b/tests/phpunit/includes/db/DatabaseMysqlBaseTest.php
@@ -0,0 +1,209 @@
+<?php
+/**
+ * Holds tests for DatabaseMysqlBase MediaWiki class.
+ *
+ * @section 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
+ * @author Antoine Musso
+ * @author Bryan Davis
+ * @copyright © 2013 Antoine Musso
+ * @copyright © 2013 Bryan Davis
+ * @copyright © 2013 Wikimedia Foundation Inc.
+ */
+
+/**
+ * Fake class around abstract class so we can call concrete methods.
+ */
+class FakeDatabaseMysqlBase extends DatabaseMysqlBase {
+ // From DatabaseBase
+ protected function closeConnection() {}
+ protected function doQuery( $sql ) {}
+
+ // From DatabaseMysql
+ protected function mysqlConnect( $realServer ) {}
+ protected function mysqlFreeResult( $res ) {}
+ protected function mysqlFetchObject( $res ) {}
+ protected function mysqlFetchArray( $res ) {}
+ protected function mysqlNumRows( $res ) {}
+ protected function mysqlNumFields( $res ) {}
+ protected function mysqlFieldName( $res, $n ) {}
+ protected function mysqlDataSeek( $res, $row ) {}
+ protected function mysqlError( $conn = null ) {}
+ protected function mysqlFetchField( $res, $n ) {}
+ protected function mysqlPing() {}
+
+ // From interface DatabaseType
+ function insertId() {}
+ function lastErrno() {}
+ function affectedRows() {}
+ function getServerVersion() {}
+}
+
+class DatabaseMysqlBaseTest extends MediaWikiTestCase {
+
+ /**
+ * @dataProvider provideDiapers
+ * @covers DatabaseMysqlBase::addIdentifierQuotes
+ */
+ public function testAddIdentifierQuotes( $expected, $in ) {
+ $db = new FakeDatabaseMysqlBase();
+ $quoted = $db->addIdentifierQuotes( $in );
+ $this->assertEquals($expected, $quoted);
+ }
+
+
+ /**
+ * Feeds testAddIdentifierQuotes
+ *
+ * Named per bug 20281 convention.
+ */
+ function provideDiapers() {
+ return array(
+ // Format: expected, input
+ array( '``', '' ),
+
+ // Yeah I really hate loosely typed PHP idiocies nowadays
+ array( '``', null ),
+
+ // Dear codereviewer, guess what addIdentifierQuotes()
+ // will return with thoses:
+ array( '``', false ),
+ array( '`1`', true ),
+
+ // We never know what could happen
+ array( '`0`', 0 ),
+ array( '`1`', 1 ),
+
+ // Whatchout! Should probably use something more meaningful
+ array( "`'`", "'" ), # single quote
+ array( '`"`', '"' ), # double quote
+ array( '````', '`' ), # backtick
+ array( '`’`', '’' ), # apostrophe (look at your encyclopedia)
+
+ // sneaky NUL bytes are lurking everywhere
+ array( '``', "\0" ),
+ array( '`xyzzy`', "\0x\0y\0z\0z\0y\0" ),
+
+ // unicode chars
+ array(
+ self::createUnicodeString( '`\u0001a\uFFFFb`' ),
+ self::createUnicodeString( '\u0001a\uFFFFb' )
+ ),
+ array(
+ self::createUnicodeString( '`\u0001\uFFFF`' ),
+ self::createUnicodeString( '\u0001\u0000\uFFFF\u0000' )
+ ),
+ array( '`☃`', '☃' ),
+ array( '`メインページ`', 'メインページ' ),
+ array( '`БаÑÑ‚Ñ‹_бет`', 'БаÑÑ‚Ñ‹_бет' ),
+
+ // Real world:
+ array( '`Alix`', 'Alix' ), # while( ! $recovered ) { sleep(); }
+ array( '`Backtick: ```', 'Backtick: `' ),
+ array( '`This is a test`', 'This is a test' ),
+ );
+ }
+
+ private static function createUnicodeString($str) {
+ return json_decode( '"' . $str . '"' );
+ }
+
+ function getMockForViews() {
+ $db = $this->getMockBuilder( 'DatabaseMysql' )
+ ->disableOriginalConstructor()
+ ->setMethods( array( 'fetchRow', 'query' ) )
+ ->getMock();
+
+ $db->expects( $this->any() )
+ ->method( 'query' )
+ ->with( $this->anything() )
+ ->will(
+ $this->returnValue( null )
+ );
+
+ $db->expects( $this->any() )
+ ->method( 'fetchRow' )
+ ->with( $this->anything() )
+ ->will( $this->onConsecutiveCalls(
+ array( 'Tables_in_' => 'view1' ),
+ array( 'Tables_in_' => 'view2' ),
+ array( 'Tables_in_' => 'myview' ),
+ false # no more rows
+ ));
+ return $db;
+ }
+ /**
+ * @covers DatabaseMysqlBase::listViews
+ */
+ function testListviews() {
+ $db = $this->getMockForViews();
+
+ // The first call populate an internal cache of views
+ $this->assertEquals( array( 'view1', 'view2', 'myview'),
+ $db->listViews() );
+ $this->assertEquals( array( 'view1', 'view2', 'myview'),
+ $db->listViews() );
+
+ // Prefix filtering
+ $this->assertEquals( array( 'view1', 'view2' ),
+ $db->listViews( 'view' ) );
+ $this->assertEquals( array( 'myview' ),
+ $db->listViews( 'my' ) );
+ $this->assertEquals( array(),
+ $db->listViews( 'UNUSED_PREFIX' ) );
+ $this->assertEquals( array( 'view1', 'view2', 'myview'),
+ $db->listViews( '' ) );
+ }
+
+ /**
+ * @covers DatabaseMysqlBase::isView
+ * @dataProvider provideViewExistanceChecks
+ */
+ function testIsView( $isView, $viewName ) {
+ $db = $this->getMockForViews();
+
+ switch( $isView ) {
+ case true:
+ $this->assertTrue( $db->isView( $viewName ),
+ "$viewName should be considered a view" );
+ break;
+
+ case false:
+ $this->assertFalse( $db->isView( $viewName ),
+ "$viewName has not been defined as a view" );
+ break;
+ }
+
+ }
+
+ function provideViewExistanceChecks() {
+ return array(
+ // format: whether it is a view, view name
+ array( true, 'view1' ),
+ array( true, 'view2' ),
+ array( true, 'myview' ),
+
+ array( false, 'user' ),
+
+ array( false, 'view10' ),
+ array( false, 'my' ),
+ array( false, 'OH_MY_GOD' ), # they killed kenny!
+ );
+ }
+
+}
diff --git a/tests/phpunit/includes/db/DatabaseSQLTest.php b/tests/phpunit/includes/db/DatabaseSQLTest.php
index 09792438..bdd567e7 100644
--- a/tests/phpunit/includes/db/DatabaseSQLTest.php
+++ b/tests/phpunit/includes/db/DatabaseSQLTest.php
@@ -2,35 +2,44 @@
/**
* Test the abstract database layer
- * Using Mysql for the sql at the moment TODO
- *
- * @group Database
+ * This is a non DBMS depending test.
*/
class DatabaseSQLTest extends MediaWikiTestCase {
+ /**
+ * @var DatabaseTestHelper
+ */
+ private $database;
+
protected function setUp() {
parent::setUp();
- // TODO support other DBMS or find another way to do it
- if ( $this->db->getType() !== 'mysql' ) {
- $this->markTestSkipped( 'No mysql database' );
- }
+ $this->database = new DatabaseTestHelper( __CLASS__ );
+ }
+
+ protected function assertLastSql( $sqlText ) {
+ $this->assertEquals(
+ $this->database->getLastSqls(),
+ $sqlText
+ );
}
/**
- * @dataProvider provideSelectSQLText
+ * @dataProvider provideSelect
+ * @covers DatabaseBase::select
*/
- function testSelectSQLText( $sql, $sqlText ) {
- $this->assertEquals( trim( $this->db->selectSQLText(
- isset( $sql['tables'] ) ? $sql['tables'] : array(),
- isset( $sql['fields'] ) ? $sql['fields'] : array(),
+ public function testSelect( $sql, $sqlText ) {
+ $this->database->select(
+ $sql['tables'],
+ $sql['fields'],
isset( $sql['conds'] ) ? $sql['conds'] : array(),
__METHOD__,
isset( $sql['options'] ) ? $sql['options'] : array(),
isset( $sql['join_conds'] ) ? $sql['join_conds'] : array()
- ) ), $sqlText );
+ );
+ $this->assertLastSql( $sqlText );
}
- public static function provideSelectSQLText() {
+ public static function provideSelect() {
return array(
array(
array(
@@ -38,8 +47,8 @@ class DatabaseSQLTest extends MediaWikiTestCase {
'fields' => array( 'field', 'alias' => 'field2' ),
'conds' => array( 'alias' => 'text' ),
),
- "SELECT field,field2 AS alias " .
- "FROM `unittest_table` " .
+ "SELECT field,field2 AS alias " .
+ "FROM table " .
"WHERE alias = 'text'"
),
array(
@@ -49,9 +58,9 @@ class DatabaseSQLTest extends MediaWikiTestCase {
'conds' => array( 'alias' => 'text' ),
'options' => array( 'LIMIT' => 1, 'ORDER BY' => 'field' ),
),
- "SELECT field,field2 AS alias " .
- "FROM `unittest_table` " .
- "WHERE alias = 'text' " .
+ "SELECT field,field2 AS alias " .
+ "FROM table " .
+ "WHERE alias = 'text' " .
"ORDER BY field " .
"LIMIT 1"
),
@@ -65,9 +74,9 @@ class DatabaseSQLTest extends MediaWikiTestCase {
'LEFT JOIN', 'tid = t2.id'
) ),
),
- "SELECT tid,field,field2 AS alias,t2.id " .
- "FROM `unittest_table` LEFT JOIN `unittest_table2` `t2` ON ((tid = t2.id)) " .
- "WHERE alias = 'text' " .
+ "SELECT tid,field,field2 AS alias,t2.id " .
+ "FROM table LEFT JOIN table2 t2 ON ((tid = t2.id)) " .
+ "WHERE alias = 'text' " .
"ORDER BY field " .
"LIMIT 1"
),
@@ -81,9 +90,9 @@ class DatabaseSQLTest extends MediaWikiTestCase {
'LEFT JOIN', 'tid = t2.id'
) ),
),
- "SELECT tid,field,field2 AS alias,t2.id " .
- "FROM `unittest_table` LEFT JOIN `unittest_table2` `t2` ON ((tid = t2.id)) " .
- "WHERE alias = 'text' " .
+ "SELECT tid,field,field2 AS alias,t2.id " .
+ "FROM table LEFT JOIN table2 t2 ON ((tid = t2.id)) " .
+ "WHERE alias = 'text' " .
"GROUP BY field HAVING COUNT(*) > 1 " .
"LIMIT 1"
),
@@ -97,20 +106,457 @@ class DatabaseSQLTest extends MediaWikiTestCase {
'LEFT JOIN', 'tid = t2.id'
) ),
),
- "SELECT tid,field,field2 AS alias,t2.id " .
- "FROM `unittest_table` LEFT JOIN `unittest_table2` `t2` ON ((tid = t2.id)) " .
- "WHERE alias = 'text' " .
+ "SELECT tid,field,field2 AS alias,t2.id " .
+ "FROM table LEFT JOIN table2 t2 ON ((tid = t2.id)) " .
+ "WHERE alias = 'text' " .
"GROUP BY field,field2 HAVING (COUNT(*) > 1) AND field = '1' " .
"LIMIT 1"
),
+ array(
+ array(
+ 'tables' => array( 'table' ),
+ 'fields' => array( 'alias' => 'field' ),
+ 'conds' => array( 'alias' => array( 1, 2, 3, 4 ) ),
+ ),
+ "SELECT field AS alias " .
+ "FROM table " .
+ "WHERE alias IN ('1','2','3','4')"
+ ),
+ );
+ }
+
+ /**
+ * @dataProvider provideUpdate
+ * @covers DatabaseBase::update
+ */
+ public function testUpdate( $sql, $sqlText ) {
+ $this->database->update(
+ $sql['table'],
+ $sql['values'],
+ $sql['conds'],
+ __METHOD__,
+ isset( $sql['options'] ) ? $sql['options'] : array()
+ );
+ $this->assertLastSql( $sqlText );
+ }
+
+ public static function provideUpdate() {
+ return array(
+ array(
+ array(
+ 'table' => 'table',
+ 'values' => array( 'field' => 'text', 'field2' => 'text2' ),
+ 'conds' => array( 'alias' => 'text' ),
+ ),
+ "UPDATE table " .
+ "SET field = 'text'" .
+ ",field2 = 'text2' " .
+ "WHERE alias = 'text'"
+ ),
+ array(
+ array(
+ 'table' => 'table',
+ 'values' => array( 'field = other', 'field2' => 'text2' ),
+ 'conds' => array( 'id' => '1' ),
+ ),
+ "UPDATE table " .
+ "SET field = other" .
+ ",field2 = 'text2' " .
+ "WHERE id = '1'"
+ ),
+ array(
+ array(
+ 'table' => 'table',
+ 'values' => array( 'field = other', 'field2' => 'text2' ),
+ 'conds' => '*',
+ ),
+ "UPDATE table " .
+ "SET field = other" .
+ ",field2 = 'text2'"
+ ),
+ );
+ }
+
+ /**
+ * @dataProvider provideDelete
+ * @covers DatabaseBase::delete
+ */
+ public function testDelete( $sql, $sqlText ) {
+ $this->database->delete(
+ $sql['table'],
+ $sql['conds'],
+ __METHOD__
+ );
+ $this->assertLastSql( $sqlText );
+ }
+
+ public static function provideDelete() {
+ return array(
+ array(
+ array(
+ 'table' => 'table',
+ 'conds' => array( 'alias' => 'text' ),
+ ),
+ "DELETE FROM table " .
+ "WHERE alias = 'text'"
+ ),
+ array(
+ array(
+ 'table' => 'table',
+ 'conds' => '*',
+ ),
+ "DELETE FROM table"
+ ),
+ );
+ }
+
+ /**
+ * @dataProvider provideUpsert
+ * @covers DatabaseBase::upsert
+ */
+ public function testUpsert( $sql, $sqlText ) {
+ $this->database->upsert(
+ $sql['table'],
+ $sql['rows'],
+ $sql['uniqueIndexes'],
+ $sql['set'],
+ __METHOD__
+ );
+ $this->assertLastSql( $sqlText );
+ }
+
+ public static function provideUpsert() {
+ return array(
+ array(
+ array(
+ 'table' => 'upsert_table',
+ 'rows' => array( 'field' => 'text', 'field2' => 'text2' ),
+ 'uniqueIndexes' => array( 'field' ),
+ 'set' => array( 'field' => 'set' ),
+ ),
+ "BEGIN; " .
+ "UPDATE upsert_table " .
+ "SET field = 'set' " .
+ "WHERE ((field = 'text')); " .
+ "INSERT IGNORE INTO upsert_table " .
+ "(field,field2) " .
+ "VALUES ('text','text2'); " .
+ "COMMIT"
+ ),
+ );
+ }
+
+ /**
+ * @dataProvider provideDeleteJoin
+ * @covers DatabaseBase::deleteJoin
+ */
+ public function testDeleteJoin( $sql, $sqlText ) {
+ $this->database->deleteJoin(
+ $sql['delTable'],
+ $sql['joinTable'],
+ $sql['delVar'],
+ $sql['joinVar'],
+ $sql['conds'],
+ __METHOD__
+ );
+ $this->assertLastSql( $sqlText );
+ }
+
+ public static function provideDeleteJoin() {
+ return array(
+ array(
+ array(
+ 'delTable' => 'table',
+ 'joinTable' => 'table_join',
+ 'delVar' => 'field',
+ 'joinVar' => 'field_join',
+ 'conds' => array( 'alias' => 'text' ),
+ ),
+ "DELETE FROM table " .
+ "WHERE field IN (" .
+ "SELECT field_join FROM table_join WHERE alias = 'text'" .
+ ")"
+ ),
+ array(
+ array(
+ 'delTable' => 'table',
+ 'joinTable' => 'table_join',
+ 'delVar' => 'field',
+ 'joinVar' => 'field_join',
+ 'conds' => '*',
+ ),
+ "DELETE FROM table " .
+ "WHERE field IN (" .
+ "SELECT field_join FROM table_join " .
+ ")"
+ ),
+ );
+ }
+
+ /**
+ * @dataProvider provideInsert
+ * @covers DatabaseBase::insert
+ */
+ public function testInsert( $sql, $sqlText ) {
+ $this->database->insert(
+ $sql['table'],
+ $sql['rows'],
+ __METHOD__,
+ isset( $sql['options'] ) ? $sql['options'] : array()
+ );
+ $this->assertLastSql( $sqlText );
+ }
+
+ public static function provideInsert() {
+ return array(
+ array(
+ array(
+ 'table' => 'table',
+ 'rows' => array( 'field' => 'text', 'field2' => 2 ),
+ ),
+ "INSERT INTO table " .
+ "(field,field2) " .
+ "VALUES ('text','2')"
+ ),
+ array(
+ array(
+ 'table' => 'table',
+ 'rows' => array( 'field' => 'text', 'field2' => 2 ),
+ 'options' => 'IGNORE',
+ ),
+ "INSERT IGNORE INTO table " .
+ "(field,field2) " .
+ "VALUES ('text','2')"
+ ),
+ array(
+ array(
+ 'table' => 'table',
+ 'rows' => array(
+ array( 'field' => 'text', 'field2' => 2 ),
+ array( 'field' => 'multi', 'field2' => 3 ),
+ ),
+ 'options' => 'IGNORE',
+ ),
+ "INSERT IGNORE INTO table " .
+ "(field,field2) " .
+ "VALUES " .
+ "('text','2')," .
+ "('multi','3')"
+ ),
+ );
+ }
+
+ /**
+ * @dataProvider provideInsertSelect
+ * @covers DatabaseBase::insertSelect
+ */
+ public function testInsertSelect( $sql, $sqlText ) {
+ $this->database->insertSelect(
+ $sql['destTable'],
+ $sql['srcTable'],
+ $sql['varMap'],
+ $sql['conds'],
+ __METHOD__,
+ isset( $sql['insertOptions'] ) ? $sql['insertOptions'] : array(),
+ isset( $sql['selectOptions'] ) ? $sql['selectOptions'] : array()
+ );
+ $this->assertLastSql( $sqlText );
+ }
+
+ public static function provideInsertSelect() {
+ return array(
+ array(
+ array(
+ 'destTable' => 'insert_table',
+ 'srcTable' => 'select_table',
+ 'varMap' => array( 'field_insert' => 'field_select', 'field' => 'field2' ),
+ 'conds' => '*',
+ ),
+ "INSERT INTO insert_table " .
+ "(field_insert,field) " .
+ "SELECT field_select,field2 " .
+ "FROM select_table"
+ ),
+ array(
+ array(
+ 'destTable' => 'insert_table',
+ 'srcTable' => 'select_table',
+ 'varMap' => array( 'field_insert' => 'field_select', 'field' => 'field2' ),
+ 'conds' => array( 'field' => 2 ),
+ ),
+ "INSERT INTO insert_table " .
+ "(field_insert,field) " .
+ "SELECT field_select,field2 " .
+ "FROM select_table " .
+ "WHERE field = '2'"
+ ),
+ array(
+ array(
+ 'destTable' => 'insert_table',
+ 'srcTable' => 'select_table',
+ 'varMap' => array( 'field_insert' => 'field_select', 'field' => 'field2' ),
+ 'conds' => array( 'field' => 2 ),
+ 'insertOptions' => 'IGNORE',
+ 'selectOptions' => array( 'ORDER BY' => 'field' ),
+ ),
+ "INSERT IGNORE INTO insert_table " .
+ "(field_insert,field) " .
+ "SELECT field_select,field2 " .
+ "FROM select_table " .
+ "WHERE field = '2' " .
+ "ORDER BY field"
+ ),
+ );
+ }
+
+ /**
+ * @dataProvider provideReplace
+ * @covers DatabaseBase::replace
+ */
+ public function testReplace( $sql, $sqlText ) {
+ $this->database->replace(
+ $sql['table'],
+ $sql['uniqueIndexes'],
+ $sql['rows'],
+ __METHOD__
+ );
+ $this->assertLastSql( $sqlText );
+ }
+
+ public static function provideReplace() {
+ return array(
+ array(
+ array(
+ 'table' => 'replace_table',
+ 'uniqueIndexes' => array( 'field' ),
+ 'rows' => array( 'field' => 'text', 'field2' => 'text2' ),
+ ),
+ "DELETE FROM replace_table " .
+ "WHERE ( field='text' ); " .
+ "INSERT INTO replace_table " .
+ "(field,field2) " .
+ "VALUES ('text','text2')"
+ ),
+ array(
+ array(
+ 'table' => 'module_deps',
+ 'uniqueIndexes' => array( array( 'md_module', 'md_skin' ) ),
+ 'rows' => array(
+ 'md_module' => 'module',
+ 'md_skin' => 'skin',
+ 'md_deps' => 'deps',
+ ),
+ ),
+ "DELETE FROM module_deps " .
+ "WHERE ( md_module='module' AND md_skin='skin' ); " .
+ "INSERT INTO module_deps " .
+ "(md_module,md_skin,md_deps) " .
+ "VALUES ('module','skin','deps')"
+ ),
+ array(
+ array(
+ 'table' => 'module_deps',
+ 'uniqueIndexes' => array( array( 'md_module', 'md_skin' ) ),
+ 'rows' => array(
+ array(
+ 'md_module' => 'module',
+ 'md_skin' => 'skin',
+ 'md_deps' => 'deps',
+ ), array(
+ 'md_module' => 'module2',
+ 'md_skin' => 'skin2',
+ 'md_deps' => 'deps2',
+ ),
+ ),
+ ),
+ "DELETE FROM module_deps " .
+ "WHERE ( md_module='module' AND md_skin='skin' ); " .
+ "INSERT INTO module_deps " .
+ "(md_module,md_skin,md_deps) " .
+ "VALUES ('module','skin','deps'); " .
+ "DELETE FROM module_deps " .
+ "WHERE ( md_module='module2' AND md_skin='skin2' ); " .
+ "INSERT INTO module_deps " .
+ "(md_module,md_skin,md_deps) " .
+ "VALUES ('module2','skin2','deps2')"
+ ),
+ array(
+ array(
+ 'table' => 'module_deps',
+ 'uniqueIndexes' => array( 'md_module', 'md_skin' ),
+ 'rows' => array(
+ array(
+ 'md_module' => 'module',
+ 'md_skin' => 'skin',
+ 'md_deps' => 'deps',
+ ), array(
+ 'md_module' => 'module2',
+ 'md_skin' => 'skin2',
+ 'md_deps' => 'deps2',
+ ),
+ ),
+ ),
+ "DELETE FROM module_deps " .
+ "WHERE ( md_module='module' ) OR ( md_skin='skin' ); " .
+ "INSERT INTO module_deps " .
+ "(md_module,md_skin,md_deps) " .
+ "VALUES ('module','skin','deps'); " .
+ "DELETE FROM module_deps " .
+ "WHERE ( md_module='module2' ) OR ( md_skin='skin2' ); " .
+ "INSERT INTO module_deps " .
+ "(md_module,md_skin,md_deps) " .
+ "VALUES ('module2','skin2','deps2')"
+ ),
+ array(
+ array(
+ 'table' => 'module_deps',
+ 'uniqueIndexes' => array(),
+ 'rows' => array(
+ 'md_module' => 'module',
+ 'md_skin' => 'skin',
+ 'md_deps' => 'deps',
+ ),
+ ),
+ "INSERT INTO module_deps " .
+ "(md_module,md_skin,md_deps) " .
+ "VALUES ('module','skin','deps')"
+ ),
+ );
+ }
+
+ /**
+ * @dataProvider provideNativeReplace
+ * @covers DatabaseBase::nativeReplace
+ */
+ public function testNativeReplace( $sql, $sqlText ) {
+ $this->database->nativeReplace(
+ $sql['table'],
+ $sql['rows'],
+ __METHOD__
+ );
+ $this->assertLastSql( $sqlText );
+ }
+
+ public static function provideNativeReplace() {
+ return array(
+ array(
+ array(
+ 'table' => 'replace_table',
+ 'rows' => array( 'field' => 'text', 'field2' => 'text2' ),
+ ),
+ "REPLACE INTO replace_table " .
+ "(field,field2) " .
+ "VALUES ('text','text2')"
+ ),
);
}
/**
* @dataProvider provideConditional
+ * @covers DatabaseBase::conditional
*/
- function testConditional( $sql, $sqlText ) {
- $this->assertEquals( trim( $this->db->conditional(
+ public function testConditional( $sql, $sqlText ) {
+ $this->assertEquals( trim( $this->database->conditional(
$sql['conds'],
$sql['true'],
$sql['false']
@@ -145,4 +591,131 @@ class DatabaseSQLTest extends MediaWikiTestCase {
),
);
}
+
+ /**
+ * @dataProvider provideBuildConcat
+ * @covers DatabaseBase::buildConcat
+ */
+ public function testBuildConcat( $stringList, $sqlText ) {
+ $this->assertEquals( trim( $this->database->buildConcat(
+ $stringList
+ ) ), $sqlText );
+ }
+
+ public static function provideBuildConcat() {
+ return array(
+ array(
+ array( 'field', 'field2' ),
+ "CONCAT(field,field2)"
+ ),
+ array(
+ array( "'test'", 'field2' ),
+ "CONCAT('test',field2)"
+ ),
+ );
+ }
+
+ /**
+ * @dataProvider provideBuildLike
+ * @covers DatabaseBase::buildLike
+ */
+ public function testBuildLike( $array, $sqlText ) {
+ $this->assertEquals( trim( $this->database->buildLike(
+ $array
+ ) ), $sqlText );
+ }
+
+ public static function provideBuildLike() {
+ return array(
+ array(
+ 'text',
+ "LIKE 'text'"
+ ),
+ array(
+ array( 'text', new LikeMatch( '%' ) ),
+ "LIKE 'text%'"
+ ),
+ array(
+ array( 'text', new LikeMatch( '%' ), 'text2' ),
+ "LIKE 'text%text2'"
+ ),
+ array(
+ array( 'text', new LikeMatch( '_' ) ),
+ "LIKE 'text_'"
+ ),
+ );
+ }
+
+ /**
+ * @dataProvider provideUnionQueries
+ * @covers DatabaseBase::unionQueries
+ */
+ public function testUnionQueries( $sql, $sqlText ) {
+ $this->assertEquals( trim( $this->database->unionQueries(
+ $sql['sqls'],
+ $sql['all']
+ ) ), $sqlText );
+ }
+
+ public static function provideUnionQueries() {
+ return array(
+ array(
+ array(
+ 'sqls' => array( 'RAW SQL', 'RAW2SQL' ),
+ 'all' => true,
+ ),
+ "(RAW SQL) UNION ALL (RAW2SQL)"
+ ),
+ array(
+ array(
+ 'sqls' => array( 'RAW SQL', 'RAW2SQL' ),
+ 'all' => false,
+ ),
+ "(RAW SQL) UNION (RAW2SQL)"
+ ),
+ array(
+ array(
+ 'sqls' => array( 'RAW SQL', 'RAW2SQL', 'RAW3SQL' ),
+ 'all' => false,
+ ),
+ "(RAW SQL) UNION (RAW2SQL) UNION (RAW3SQL)"
+ ),
+ );
+ }
+
+ /**
+ * @covers DatabaseBase::commit
+ */
+ public function testTransactionCommit() {
+ $this->database->begin( __METHOD__ );
+ $this->database->commit( __METHOD__ );
+ $this->assertLastSql( 'BEGIN; COMMIT' );
+ }
+
+ /**
+ * @covers DatabaseBase::rollback
+ */
+ public function testTransactionRollback() {
+ $this->database->begin( __METHOD__ );
+ $this->database->rollback( __METHOD__ );
+ $this->assertLastSql( 'BEGIN; ROLLBACK' );
+ }
+
+ /**
+ * @covers DatabaseBase::dropTable
+ */
+ public function testDropTable() {
+ $this->database->setExistingTables( array( 'table' ) );
+ $this->database->dropTable( 'table', __METHOD__ );
+ $this->assertLastSql( 'DROP TABLE table' );
+ }
+
+ /**
+ * @covers DatabaseBase::dropTable
+ */
+ public function testDropNonExistingTable() {
+ $this->assertFalse(
+ $this->database->dropTable( 'non_existing', __METHOD__ )
+ );
+ }
}
diff --git a/tests/phpunit/includes/db/DatabaseSqliteTest.php b/tests/phpunit/includes/db/DatabaseSqliteTest.php
index 7b84d471..70ee9465 100644
--- a/tests/phpunit/includes/db/DatabaseSqliteTest.php
+++ b/tests/phpunit/includes/db/DatabaseSqliteTest.php
@@ -9,6 +9,7 @@ class MockDatabaseSqlite extends DatabaseSqliteStandalone {
function query( $sql, $fname = '', $tempIgnore = false ) {
$this->lastQuery = $sql;
+
return true;
}
@@ -26,6 +27,10 @@ class MockDatabaseSqlite extends DatabaseSqliteStandalone {
* @group medium
*/
class DatabaseSqliteTest extends MediaWikiTestCase {
+
+ /**
+ * @var MockDatabaseSqlite
+ */
var $db;
protected function setUp() {
@@ -82,6 +87,7 @@ class DatabaseSqliteTest extends MediaWikiTestCase {
/**
* @dataProvider provideAddQuotes()
+ * @covers DatabaseSqlite::addQuotes
*/
public function testAddQuotes( $value, $expected ) {
// check quoting
@@ -104,6 +110,9 @@ class DatabaseSqliteTest extends MediaWikiTestCase {
}
}
+ /**
+ * @covers DatabaseSqlite::replaceVars
+ */
public function testReplaceVars() {
$this->assertEquals( 'foo', $this->replaceVars( 'foo' ), "Don't break anything accidentally" );
@@ -142,6 +151,9 @@ class DatabaseSqliteTest extends MediaWikiTestCase {
);
}
+ /**
+ * @covers DatabaseSqlite::tableName
+ */
public function testTableName() {
// @todo Moar!
$db = new DatabaseSqliteStandalone( ':memory:' );
@@ -152,6 +164,9 @@ class DatabaseSqliteTest extends MediaWikiTestCase {
$this->assertEquals( 'foobar', $db->tableName( 'bar' ) );
}
+ /**
+ * @covers DatabaseSqlite::duplicateTableStructure
+ */
public function testDuplicateTableStructure() {
$db = new DatabaseSqliteStandalone( ':memory:' );
$db->query( 'CREATE TABLE foo(foo, barfoo)' );
@@ -173,6 +188,9 @@ class DatabaseSqliteTest extends MediaWikiTestCase {
);
}
+ /**
+ * @covers DatabaseSqlite::duplicateTableStructure
+ */
public function testDuplicateTableStructureVirtual() {
$db = new DatabaseSqliteStandalone( ':memory:' );
if ( $db->getFulltextSearchModule() != 'FTS3' ) {
@@ -193,6 +211,9 @@ class DatabaseSqliteTest extends MediaWikiTestCase {
);
}
+ /**
+ * @covers DatabaseSqlite::deleteJoin
+ */
public function testDeleteJoin() {
$db = new DatabaseSqliteStandalone( ':memory:' );
$db->query( 'CREATE TABLE a (a_1)', __METHOD__ );
@@ -232,7 +253,7 @@ class DatabaseSqliteTest extends MediaWikiTestCase {
/**
* Runs upgrades of older databases and compares results with current schema
- * @todo: currently only checks list of tables
+ * @todo Currently only checks list of tables
*/
public function testUpgrades() {
global $IP, $wgVersion, $wgProfileToDatabase;
@@ -305,13 +326,19 @@ class DatabaseSqliteTest extends MediaWikiTestCase {
}
}
+ /**
+ * @covers DatabaseSqlite::insertId
+ */
public function testInsertIdType() {
$db = new DatabaseSqliteStandalone( ':memory:' );
- $this->assertInstanceOf( 'ResultWrapper',
- $db->query( 'CREATE TABLE a ( a_1 )', __METHOD__ ), "Database creationg" );
- $this->assertTrue( $db->insert( 'a', array( 'a_1' => 10 ), __METHOD__ ),
- "Insertion worked" );
- $this->assertEquals( "integer", gettype( $db->insertId() ), "Actual typecheck" );
+
+ $databaseCreation = $db->query( 'CREATE TABLE a ( a_1 )', __METHOD__ );
+ $this->assertInstanceOf( 'ResultWrapper', $databaseCreation, "Database creation" );
+
+ $insertion = $db->insert( 'a', array( 'a_1' => 10 ), __METHOD__ );
+ $this->assertTrue( $insertion, "Insertion worked" );
+
+ $this->assertInternalType( 'integer', $db->insertId(), "Actual typecheck" );
$this->assertTrue( $db->close(), "closing database" );
}
@@ -327,12 +354,14 @@ class DatabaseSqliteTest extends MediaWikiTestCase {
$db->sourceFile( "$IP/tests/phpunit/data/db/sqlite/tables-$version.sql" );
$updater = DatabaseUpdater::newForDB( $db, false, $maint );
$updater->doUpdates( array( 'core' ) );
+
return $db;
}
private function getTables( $db ) {
$list = array_flip( $db->listTables() );
$excluded = array(
+ 'external_user', // removed from core in 1.22
'math', // moved out of core in 1.18
'trackbacks', // removed from core in 1.19
'searchindex',
@@ -348,6 +377,7 @@ class DatabaseSqliteTest extends MediaWikiTestCase {
}
$list = array_flip( $list );
sort( $list );
+
return $list;
}
@@ -359,6 +389,7 @@ class DatabaseSqliteTest extends MediaWikiTestCase {
$cols[$col->name] = $col;
}
ksort( $cols );
+
return $cols;
}
@@ -376,10 +407,11 @@ class DatabaseSqliteTest extends MediaWikiTestCase {
$indexes[$index->name] = $index;
}
ksort( $indexes );
+
return $indexes;
}
- function testCaseInsensitiveLike() {
+ public function testCaseInsensitiveLike() {
// TODO: Test this for all databases
$db = new DatabaseSqliteStandalone( ':memory:' );
$res = $db->query( 'SELECT "a" LIKE "A" AS a' );
diff --git a/tests/phpunit/includes/db/DatabaseTest.php b/tests/phpunit/includes/db/DatabaseTest.php
index 65c80d1d..301fc990 100644
--- a/tests/phpunit/includes/db/DatabaseTest.php
+++ b/tests/phpunit/includes/db/DatabaseTest.php
@@ -5,7 +5,11 @@
* @group DatabaseBase
*/
class DatabaseTest extends MediaWikiTestCase {
- var $db, $functionTest = false;
+ /**
+ * @var DatabaseBase
+ */
+ var $db;
+ var $functionTest = false;
protected function setUp() {
parent::setUp();
@@ -19,8 +23,10 @@ class DatabaseTest extends MediaWikiTestCase {
$this->functionTest = false;
}
}
-
- function testAddQuotesNull() {
+ /**
+ * @covers DatabaseBase::dropTable
+ */
+ public function testAddQuotesNull() {
$check = "NULL";
if ( $this->db->getType() === 'sqlite' || $this->db->getType() === 'oracle' ) {
$check = "''";
@@ -28,7 +34,7 @@ class DatabaseTest extends MediaWikiTestCase {
$this->assertEquals( $check, $this->db->addQuotes( null ) );
}
- function testAddQuotesInt() {
+ public function testAddQuotesInt() {
# returning just "1234" should be ok too, though...
# maybe
$this->assertEquals(
@@ -36,20 +42,20 @@ class DatabaseTest extends MediaWikiTestCase {
$this->db->addQuotes( 1234 ) );
}
- function testAddQuotesFloat() {
+ public function testAddQuotesFloat() {
# returning just "1234.5678" would be ok too, though
$this->assertEquals(
"'1234.5678'",
$this->db->addQuotes( 1234.5678 ) );
}
- function testAddQuotesString() {
+ public function testAddQuotesString() {
$this->assertEquals(
"'string'",
$this->db->addQuotes( 'string' ) );
}
- function testAddQuotesStringQuote() {
+ public function testAddQuotesStringQuote() {
$check = "'string''s cause trouble'";
if ( $this->db->getType() === 'mysql' ) {
$check = "'string\'s cause trouble'";
@@ -84,36 +90,46 @@ class DatabaseTest extends MediaWikiTestCase {
$quote = '';
} elseif ( $this->db->getType() === 'mysql' ) {
$quote = '`';
+ } elseif ( $this->db->getType() === 'oracle' ) {
+ $quote = '/*Q*/';
} else {
$quote = '"';
}
if ( $database !== null ) {
- $database = $quote . $database . $quote . '.';
+ if ( $this->db->getType() === 'oracle' ) {
+ $database = $quote . $database . '.';
+ } else {
+ $database = $quote . $database . $quote . '.';
+ }
}
if ( $prefix === null ) {
$prefix = $this->dbPrefix();
}
- return $database . $quote . $prefix . $table . $quote;
+ if ( $this->db->getType() === 'oracle' ) {
+ return strtoupper($database . $quote . $prefix . $table);
+ } else {
+ return $database . $quote . $prefix . $table . $quote;
+ }
}
- function testTableNameLocal() {
+ public function testTableNameLocal() {
$this->assertEquals(
$this->prefixAndQuote( 'tablename' ),
$this->db->tableName( 'tablename' )
);
}
- function testTableNameRawLocal() {
+ public function testTableNameRawLocal() {
$this->assertEquals(
$this->prefixAndQuote( 'tablename', null, null, 'raw' ),
$this->db->tableName( 'tablename', 'raw' )
);
}
- function testTableNameShared() {
+ public function testTableNameShared() {
$this->assertEquals(
$this->prefixAndQuote( 'tablename', 'sharedatabase', 'sh_' ),
$this->getSharedTableName( 'tablename', 'sharedatabase', 'sh_' )
@@ -125,7 +141,7 @@ class DatabaseTest extends MediaWikiTestCase {
);
}
- function testTableNameRawShared() {
+ public function testTableNameRawShared() {
$this->assertEquals(
$this->prefixAndQuote( 'tablename', 'sharedatabase', 'sh_', 'raw' ),
$this->getSharedTableName( 'tablename', 'sharedatabase', 'sh_', 'raw' )
@@ -137,21 +153,21 @@ class DatabaseTest extends MediaWikiTestCase {
);
}
- function testTableNameForeign() {
+ public function testTableNameForeign() {
$this->assertEquals(
$this->prefixAndQuote( 'tablename', 'databasename', '' ),
$this->db->tableName( 'databasename.tablename' )
);
}
- function testTableNameRawForeign() {
+ public function testTableNameRawForeign() {
$this->assertEquals(
$this->prefixAndQuote( 'tablename', 'databasename', '', 'raw' ),
$this->db->tableName( 'databasename.tablename', 'raw' )
);
}
- function testFillPreparedEmpty() {
+ public function testFillPreparedEmpty() {
$sql = $this->db->fillPrepared(
'SELECT * FROM interwiki', array() );
$this->assertEquals(
@@ -159,7 +175,7 @@ class DatabaseTest extends MediaWikiTestCase {
$sql );
}
- function testFillPreparedQuestion() {
+ public function testFillPreparedQuestion() {
$sql = $this->db->fillPrepared(
'SELECT * FROM cur WHERE cur_namespace=? AND cur_title=?',
array( 4, "Snicker's_paradox" ) );
@@ -171,7 +187,7 @@ class DatabaseTest extends MediaWikiTestCase {
$this->assertEquals( $check, $sql );
}
- function testFillPreparedBang() {
+ public function testFillPreparedBang() {
$sql = $this->db->fillPrepared(
'SELECT user_id FROM ! WHERE user_name=?',
array( '"user"', "Slash's Dot" ) );
@@ -183,7 +199,7 @@ class DatabaseTest extends MediaWikiTestCase {
$this->assertEquals( $check, $sql );
}
- function testFillPreparedRaw() {
+ public function testFillPreparedRaw() {
$sql = $this->db->fillPrepared(
"SELECT * FROM cur WHERE cur_title='This_\\&_that,_WTF\\?\\!'",
array( '"user"', "Slash's Dot" ) );
@@ -192,7 +208,7 @@ class DatabaseTest extends MediaWikiTestCase {
$sql );
}
- function testStoredFunctions() {
+ public function testStoredFunctions() {
if ( !in_array( wfGetDB( DB_MASTER )->getType(), array( 'mysql', 'postgres' ) ) ) {
$this->markTestSkipped( 'MySQL or Postgres required' );
}
@@ -209,4 +225,10 @@ class DatabaseTest extends MediaWikiTestCase {
. ( $this->db->getType() == 'postgres' ? '()' : '' )
);
}
+
+ public function testUnknownTableCorruptsResults() {
+ $res = $this->db->select( 'page', '*', array( 'page_id' => 1 ) );
+ $this->assertFalse( $this->db->tableExists( 'foobarbaz' ) );
+ $this->assertInternalType( 'int', $res->numRows() );
+ }
}
diff --git a/tests/phpunit/includes/db/DatabaseTestHelper.php b/tests/phpunit/includes/db/DatabaseTestHelper.php
new file mode 100644
index 00000000..790f273c
--- /dev/null
+++ b/tests/phpunit/includes/db/DatabaseTestHelper.php
@@ -0,0 +1,166 @@
+<?php
+
+/**
+ * Helper for testing the methods from the DatabaseBase class
+ * @since 1.22
+ */
+class DatabaseTestHelper extends DatabaseBase {
+
+ /**
+ * __CLASS__ of the test suite,
+ * used to determine, if the function name is passed every time to query()
+ */
+ protected $testName = array();
+
+ /**
+ * Array of lastSqls passed to query(),
+ * This is an array since some methods in DatabaseBase can do more than one
+ * query. Cleared when calling getLastSqls().
+ */
+ protected $lastSqls = array();
+
+ /**
+ * Array of tables to be considered as existing by tableExist()
+ * Use setExistingTables() to alter.
+ */
+ protected $tablesExists;
+
+ public function __construct( $testName ) {
+ $this->testName = $testName;
+ }
+
+ /**
+ * Returns SQL queries grouped by '; '
+ * Clear the list of queries that have been done so far.
+ */
+ public function getLastSqls() {
+ $lastSqls = implode( '; ', $this->lastSqls );
+ $this->lastSqls = array();
+
+ return $lastSqls;
+ }
+
+ public function setExistingTables( $tablesExists ) {
+ $this->tablesExists = (array)$tablesExists;
+ }
+
+ protected function addSql( $sql ) {
+ // clean up spaces before and after some words and the whole string
+ $this->lastSqls[] = trim( preg_replace(
+ '/\s{2,}(?=FROM|WHERE|GROUP BY|ORDER BY|LIMIT)|(?<=SELECT|INSERT|UPDATE)\s{2,}/',
+ ' ', $sql
+ ) );
+ }
+
+ protected function checkFunctionName( $fname ) {
+ if ( substr( $fname, 0, strlen( $this->testName ) ) !== $this->testName ) {
+ throw new MWException( 'function name does not start with test class. ' .
+ $fname . ' vs. ' . $this->testName . '. ' .
+ 'Please provide __METHOD__ to database methods.' );
+ }
+ }
+
+ function strencode( $s ) {
+ // Choose apos to avoid handling of escaping double quotes in quoted text
+ return str_replace( "'", "\'", $s );
+ }
+
+ public function addIdentifierQuotes( $s ) {
+ // no escaping to avoid handling of double quotes in quoted text
+ return $s;
+ }
+
+ public function query( $sql, $fname = '', $tempIgnore = false ) {
+ $this->checkFunctionName( $fname );
+ $this->addSql( $sql );
+
+ return parent::query( $sql, $fname, $tempIgnore );
+ }
+
+ public function tableExists( $table, $fname = __METHOD__ ) {
+ $this->checkFunctionName( $fname );
+
+ return in_array( $table, (array)$this->tablesExists );
+ }
+
+ // Redeclare parent method to make it public
+ public function nativeReplace( $table, $rows, $fname ) {
+ return parent::nativeReplace( $table, $rows, $fname );
+ }
+
+ function getType() {
+ return 'test';
+ }
+
+ function open( $server, $user, $password, $dbName ) {
+ return false;
+ }
+
+ function fetchObject( $res ) {
+ return false;
+ }
+
+ function fetchRow( $res ) {
+ return false;
+ }
+
+ function numRows( $res ) {
+ return -1;
+ }
+
+ function numFields( $res ) {
+ return -1;
+ }
+
+ function fieldName( $res, $n ) {
+ return 'test';
+ }
+
+ function insertId() {
+ return -1;
+ }
+
+ function dataSeek( $res, $row ) {
+ /* nop */
+ }
+
+ function lastErrno() {
+ return -1;
+ }
+
+ function lastError() {
+ return 'test';
+ }
+
+ function fieldInfo( $table, $field ) {
+ return false;
+ }
+
+ function indexInfo( $table, $index, $fname = 'Database::indexInfo' ) {
+ return false;
+ }
+
+ function affectedRows() {
+ return -1;
+ }
+
+ function getSoftwareLink() {
+ return 'test';
+ }
+
+ function getServerVersion() {
+ return 'test';
+ }
+
+ function getServerInfo() {
+ return 'test';
+ }
+
+ protected function closeConnection() {
+ return false;
+ }
+
+ protected function doQuery( $sql ) {
+ return array();
+ }
+}
diff --git a/tests/phpunit/includes/db/ORMRowTest.php b/tests/phpunit/includes/db/ORMRowTest.php
index 596d0bd0..27d4d0e8 100644
--- a/tests/phpunit/includes/db/ORMRowTest.php
+++ b/tests/phpunit/includes/db/ORMRowTest.php
@@ -76,6 +76,7 @@ abstract class ORMRowTest extends \MediaWikiTestCase {
*/
protected function getRowInstance( array $data, $loadDefaults ) {
$class = $this->getRowClass();
+
return new $class( $this->getTableInstance(), $data, $loadDefaults );
}
diff --git a/tests/phpunit/includes/db/ORMTableTest.php b/tests/phpunit/includes/db/ORMTableTest.php
index 4cadf31c..e583d1bc 100644
--- a/tests/phpunit/includes/db/ORMTableTest.php
+++ b/tests/phpunit/includes/db/ORMTableTest.php
@@ -45,6 +45,7 @@ class ORMTableTest extends MediaWikiTestCase {
*/
public function getTable() {
$class = $this->getTableClass();
+
return $class::singleton();
}
@@ -84,7 +85,6 @@ class ORMTableTest extends MediaWikiTestCase {
$db->ignoreErrors( false );
}
-
}
/**
diff --git a/tests/phpunit/includes/db/TestORMRowTest.php b/tests/phpunit/includes/db/TestORMRowTest.php
index 263553ac..f65642b8 100644
--- a/tests/phpunit/includes/db/TestORMRowTest.php
+++ b/tests/phpunit/includes/db/TestORMRowTest.php
@@ -64,23 +64,40 @@ class TestORMRowTest extends ORMRowTest {
$dbw = wfGetDB( DB_MASTER );
$isSqlite = $GLOBALS['wgDBtype'] === 'sqlite';
+ $isPostgres = $GLOBALS['wgDBtype'] === 'postgres';
$idField = $isSqlite ? 'INTEGER' : 'INT unsigned';
$primaryKey = $isSqlite ? 'PRIMARY KEY AUTOINCREMENT' : 'auto_increment PRIMARY KEY';
- $dbw->query(
- 'CREATE TABLE IF NOT EXISTS ' . $dbw->tableName( 'orm_test' ) . '(
- test_id ' . $idField . ' NOT NULL ' . $primaryKey . ',
- test_name VARCHAR(255) NOT NULL,
- test_age TINYINT unsigned NOT NULL,
- test_height FLOAT NOT NULL,
- test_awesome TINYINT unsigned NOT NULL,
- test_stuff BLOB NOT NULL,
- test_moarstuff BLOB NOT NULL,
- test_time varbinary(14) NOT NULL
- );',
- __METHOD__
- );
+ if ( $isPostgres ) {
+ $dbw->query(
+ 'CREATE TABLE IF NOT EXISTS ' . $dbw->tableName( 'orm_test' ) . "(
+ test_id serial PRIMARY KEY,
+ test_name TEXT NOT NULL DEFAULT '',
+ test_age INTEGER NOT NULL DEFAULT 0,
+ test_height REAL NOT NULL DEFAULT 0,
+ test_awesome INTEGER NOT NULL DEFAULT 0,
+ test_stuff BYTEA,
+ test_moarstuff BYTEA,
+ test_time TIMESTAMPTZ
+ );",
+ __METHOD__
+ );
+ } else {
+ $dbw->query(
+ 'CREATE TABLE IF NOT EXISTS ' . $dbw->tableName( 'orm_test' ) . '(
+ test_id ' . $idField . ' NOT NULL ' . $primaryKey . ',
+ test_name VARCHAR(255) NOT NULL,
+ test_age TINYINT unsigned NOT NULL,
+ test_height FLOAT NOT NULL,
+ test_awesome TINYINT unsigned NOT NULL,
+ test_stuff BLOB NOT NULL,
+ test_moarstuff BLOB NOT NULL,
+ test_time varbinary(14) NOT NULL
+ );',
+ __METHOD__
+ );
+ }
}
protected function tearDown() {
@@ -91,11 +108,12 @@ class TestORMRowTest extends ORMRowTest {
}
public function constructorTestProvider() {
+ $dbw = wfGetDB( DB_MASTER );
return array(
array(
array(
'name' => 'Foobar',
- 'time' => '20120101020202',
+ 'time' => $dbw->timestamp( '20120101020202' ),
'age' => 42,
'height' => 9000.1,
'awesome' => true,
@@ -122,10 +140,10 @@ class TestORMRowTest extends ORMRowTest {
'blob' => new stdClass()
);
}
-
}
-class TestORMRow extends ORMRow {}
+class TestORMRow extends ORMRow {
+}
class TestORMTable extends ORMTable {
@@ -194,6 +212,4 @@ class TestORMTable extends ORMTable {
protected function getFieldPrefix() {
return 'test_';
}
-
-
}
diff --git a/tests/phpunit/includes/debug/MWDebugTest.php b/tests/phpunit/includes/debug/MWDebugTest.php
index 9026cb90..6926b1c8 100644
--- a/tests/phpunit/includes/debug/MWDebugTest.php
+++ b/tests/phpunit/includes/debug/MWDebugTest.php
@@ -21,7 +21,7 @@ class MWDebugTest extends MediaWikiTestCase {
parent::tearDown();
}
- function testAddLog() {
+ public function testAddLog() {
MWDebug::log( 'logging a string' );
$this->assertEquals(
array( array(
@@ -33,7 +33,7 @@ class MWDebugTest extends MediaWikiTestCase {
);
}
- function testAddWarning() {
+ public function testAddWarning() {
MWDebug::warning( 'Warning message' );
$this->assertEquals(
array( array(
@@ -45,7 +45,7 @@ class MWDebugTest extends MediaWikiTestCase {
);
}
- function testAvoidDuplicateDeprecations() {
+ public function testAvoidDuplicateDeprecations() {
MWDebug::deprecated( 'wfOldFunction', '1.0', 'component' );
MWDebug::deprecated( 'wfOldFunction', '1.0', 'component' );
@@ -56,7 +56,7 @@ class MWDebugTest extends MediaWikiTestCase {
);
}
- function testAvoidNonConsecutivesDuplicateDeprecations() {
+ public function testAvoidNonConsecutivesDuplicateDeprecations() {
MWDebug::deprecated( 'wfOldFunction', '1.0', 'component' );
MWDebug::warning( 'some warning' );
MWDebug::log( 'we could have logged something too' );
diff --git a/tests/phpunit/includes/filebackend/FileBackendTest.php b/tests/phpunit/includes/filebackend/FileBackendTest.php
index 9fbf7bb0..fcfa724f 100644
--- a/tests/phpunit/includes/filebackend/FileBackendTest.php
+++ b/tests/phpunit/includes/filebackend/FileBackendTest.php
@@ -6,14 +6,21 @@
* @group medium
*/
class FileBackendTest extends MediaWikiTestCase {
- private $backend, $multiBackend;
+
+ /** @var FileBackend */
+ private $backend;
+ /** @var FileBackendMultiWrite */
+ private $multiBackend;
+ /** @var FSFileBackend */
+ public $singleBackend;
private $filesToPrune = array();
private static $backendToUse;
protected function setUp() {
global $wgFileBackends;
parent::setUp();
- $tmpPrefix = wfTempDir() . '/filebackend-unittest-' . time() . '-' . mt_rand();
+ $uniqueId = time() . '-' . mt_rand();
+ $tmpPrefix = wfTempDir() . '/filebackend-unittest-' . $uniqueId;
if ( $this->getCliArg( 'use-filebackend=' ) ) {
if ( self::$backendToUse ) {
$this->singleBackend = self::$backendToUse;
@@ -36,32 +43,34 @@ class FileBackendTest extends MediaWikiTestCase {
}
} else {
$this->singleBackend = new FSFileBackend( array(
- 'name' => 'localtesting',
+ 'name' => 'localtesting',
'lockManager' => 'fsLockManager',
#'parallelize' => 'implicit',
+ 'wikiId' => wfWikiID() . $uniqueId,
'containerPaths' => array(
'unittest-cont1' => "{$tmpPrefix}-localtesting-cont1",
'unittest-cont2' => "{$tmpPrefix}-localtesting-cont2" )
) );
}
$this->multiBackend = new FileBackendMultiWrite( array(
- 'name' => 'localtesting',
+ 'name' => 'localtesting',
'lockManager' => 'fsLockManager',
'parallelize' => 'implicit',
- 'backends' => array(
+ 'wikiId' => wfWikiId() . $uniqueId,
+ 'backends' => array(
array(
- 'name' => 'localmultitesting1',
- 'class' => 'FSFileBackend',
- 'lockManager' => 'nullLockManager',
+ 'name' => 'localmultitesting1',
+ 'class' => 'FSFileBackend',
+ 'lockManager' => 'nullLockManager',
'containerPaths' => array(
'unittest-cont1' => "{$tmpPrefix}-localtestingmulti1-cont1",
'unittest-cont2' => "{$tmpPrefix}-localtestingmulti1-cont2" ),
'isMultiMaster' => false
),
array(
- 'name' => 'localmultitesting2',
- 'class' => 'FSFileBackend',
- 'lockManager' => 'nullLockManager',
+ 'name' => 'localmultitesting2',
+ 'class' => 'FSFileBackend',
+ 'lockManager' => 'nullLockManager',
'containerPaths' => array(
'unittest-cont1' => "{$tmpPrefix}-localtestingmulti2-cont1",
'unittest-cont2' => "{$tmpPrefix}-localtestingmulti2-cont2" ),
@@ -82,13 +91,14 @@ class FileBackendTest extends MediaWikiTestCase {
/**
* @dataProvider provider_testIsStoragePath
+ * @covers FileBackend::isStoragePath
*/
public function testIsStoragePath( $path, $isStorePath ) {
$this->assertEquals( $isStorePath, FileBackend::isStoragePath( $path ),
"FileBackend::isStoragePath on path '$path'" );
}
- function provider_testIsStoragePath() {
+ public static function provider_testIsStoragePath() {
return array(
array( 'mwstore://', true ),
array( 'mwstore://backend', true ),
@@ -106,13 +116,14 @@ class FileBackendTest extends MediaWikiTestCase {
/**
* @dataProvider provider_testSplitStoragePath
+ * @covers FileBackend::splitStoragePath
*/
public function testSplitStoragePath( $path, $res ) {
$this->assertEquals( $res, FileBackend::splitStoragePath( $path ),
"FileBackend::splitStoragePath on path '$path'" );
}
- function provider_testSplitStoragePath() {
+ public static function provider_testSplitStoragePath() {
return array(
array( 'mwstore://backend/container', array( 'backend', 'container', '' ) ),
array( 'mwstore://backend/container/', array( 'backend', 'container', '' ) ),
@@ -130,13 +141,14 @@ class FileBackendTest extends MediaWikiTestCase {
/**
* @dataProvider provider_normalizeStoragePath
+ * @covers FileBackend::normalizeStoragePath
*/
public function testNormalizeStoragePath( $path, $res ) {
$this->assertEquals( $res, FileBackend::normalizeStoragePath( $path ),
"FileBackend::normalizeStoragePath on path '$path'" );
}
- function provider_normalizeStoragePath() {
+ public static function provider_normalizeStoragePath() {
return array(
array( 'mwstore://backend/container', 'mwstore://backend/container' ),
array( 'mwstore://backend/container/', 'mwstore://backend/container' ),
@@ -156,13 +168,14 @@ class FileBackendTest extends MediaWikiTestCase {
/**
* @dataProvider provider_testParentStoragePath
+ * @covers FileBackend::parentStoragePath
*/
public function testParentStoragePath( $path, $res ) {
$this->assertEquals( $res, FileBackend::parentStoragePath( $path ),
"FileBackend::parentStoragePath on path '$path'" );
}
- function provider_testParentStoragePath() {
+ public static function provider_testParentStoragePath() {
return array(
array( 'mwstore://backend/container/path/to/obj', 'mwstore://backend/container/path/to' ),
array( 'mwstore://backend/container/path/to', 'mwstore://backend/container/path' ),
@@ -177,6 +190,7 @@ class FileBackendTest extends MediaWikiTestCase {
/**
* @dataProvider provider_testExtensionFromPath
+ * @covers FileBackend::extensionFromPath
*/
public function testExtensionFromPath( $path, $res ) {
$this->assertEquals( $res, FileBackend::extensionFromPath( $path ),
@@ -210,6 +224,9 @@ class FileBackendTest extends MediaWikiTestCase {
$this->tearDownFiles();
}
+ /**
+ * @covers FileBackend::doOperation
+ */
private function doTestStore( $op ) {
$backendName = $this->backendClass();
@@ -281,6 +298,7 @@ class FileBackendTest extends MediaWikiTestCase {
/**
* @dataProvider provider_testCopy
+ * @covers FileBackend::doOperation
*/
public function testCopy( $op ) {
$this->backend = $this->singleBackend;
@@ -312,6 +330,7 @@ class FileBackendTest extends MediaWikiTestCase {
"Source file $source does not exist ($backendName)." );
$this->assertEquals( false, $this->backend->fileExists( array( 'src' => $dest ) ),
"Destination file $dest does not exist ($backendName)." );
+
return; // done
}
@@ -400,6 +419,7 @@ class FileBackendTest extends MediaWikiTestCase {
/**
* @dataProvider provider_testMove
+ * @covers FileBackend::doOperation
*/
public function testMove( $op ) {
$this->backend = $this->singleBackend;
@@ -431,6 +451,7 @@ class FileBackendTest extends MediaWikiTestCase {
"Source file $source does not exist ($backendName)." );
$this->assertEquals( false, $this->backend->fileExists( array( 'src' => $dest ) ),
"Destination file $dest does not exist ($backendName)." );
+
return; // done
}
@@ -520,6 +541,7 @@ class FileBackendTest extends MediaWikiTestCase {
/**
* @dataProvider provider_testDelete
+ * @covers FileBackend::doOperation
*/
public function testDelete( $op, $withSource, $okStatus ) {
$this->backend = $this->singleBackend;
@@ -611,6 +633,7 @@ class FileBackendTest extends MediaWikiTestCase {
/**
* @dataProvider provider_testDescribe
+ * @covers FileBackend::doOperation
*/
public function testDescribe( $op, $withSource, $okStatus ) {
$this->backend = $this->singleBackend;
@@ -678,6 +701,7 @@ class FileBackendTest extends MediaWikiTestCase {
/**
* @dataProvider provider_testCreate
+ * @covers FileBackend::doOperation
*/
public function testCreate( $op, $alreadyExists, $okStatus, $newSize ) {
$this->backend = $this->singleBackend;
@@ -798,6 +822,9 @@ class FileBackendTest extends MediaWikiTestCase {
return $cases;
}
+ /**
+ * @covers FileBackend::doQuickOperations
+ */
public function testDoQuickOperations() {
$this->backend = $this->singleBackend;
$this->doTestDoQuickOperations();
@@ -817,32 +844,66 @@ class FileBackendTest extends MediaWikiTestCase {
"$base/unittest-cont1/e/fileB.a",
"$base/unittest-cont1/e/fileC.a"
);
- $ops = array();
+ $createOps = array();
$purgeOps = array();
foreach ( $files as $path ) {
$status = $this->prepare( array( 'dir' => dirname( $path ) ) );
$this->assertGoodStatus( $status,
"Preparing $path succeeded without warnings ($backendName)." );
- $ops[] = array( 'op' => 'create', 'dst' => $path, 'content' => mt_rand(0, 50000) );
+ $createOps[] = array( 'op' => 'create', 'dst' => $path, 'content' => mt_rand( 0, 50000 ) );
+ $copyOps[] = array( 'op' => 'copy', 'src' => $path, 'dst' => "$path-2" );
+ $moveOps[] = array( 'op' => 'move', 'src' => "$path-2", 'dst' => "$path-3" );
$purgeOps[] = array( 'op' => 'delete', 'src' => $path );
+ $purgeOps[] = array( 'op' => 'delete', 'src' => "$path-3" );
}
$purgeOps[] = array( 'op' => 'null' );
- $status = $this->backend->doQuickOperations( $ops );
- $this->assertGoodStatus( $status,
- "Creation of source files succeeded ($backendName)." );
+ $this->assertGoodStatus(
+ $this->backend->doQuickOperations( $createOps ),
+ "Creation of source files succeeded ($backendName)." );
foreach ( $files as $file ) {
$this->assertTrue( $this->backend->fileExists( array( 'src' => $file ) ),
"File $file exists." );
}
- $status = $this->backend->doQuickOperations( $purgeOps );
- $this->assertGoodStatus( $status,
- "Quick deletion of source files succeeded ($backendName)." );
+ $this->assertGoodStatus(
+ $this->backend->doQuickOperations( $copyOps ),
+ "Quick copy of source files succeeded ($backendName)." );
+ foreach ( $files as $file ) {
+ $this->assertTrue( $this->backend->fileExists( array( 'src' => "$file-2" ) ),
+ "File $file-2 exists." );
+ }
+ $this->assertGoodStatus(
+ $this->backend->doQuickOperations( $moveOps ),
+ "Quick move of source files succeeded ($backendName)." );
+ foreach ( $files as $file ) {
+ $this->assertTrue( $this->backend->fileExists( array( 'src' => "$file-3" ) ),
+ "File $file-3 move in." );
+ $this->assertFalse( $this->backend->fileExists( array( 'src' => "$file-2" ) ),
+ "File $file-2 moved away." );
+ }
+
+ $this->assertGoodStatus(
+ $this->backend->quickCopy( array( 'src' => $files[0], 'dst' => $files[0] ) ),
+ "Copy of file {$files[0]} over itself succeeded ($backendName)." );
+ $this->assertTrue( $this->backend->fileExists( array( 'src' => $files[0] ) ),
+ "File {$files[0]} still exists." );
+
+ $this->assertGoodStatus(
+ $this->backend->quickMove( array( 'src' => $files[0], 'dst' => $files[0] ) ),
+ "Move of file {$files[0]} over itself succeeded ($backendName)." );
+ $this->assertTrue( $this->backend->fileExists( array( 'src' => $files[0] ) ),
+ "File {$files[0]} still exists." );
+
+ $this->assertGoodStatus(
+ $this->backend->doQuickOperations( $purgeOps ),
+ "Quick deletion of source files succeeded ($backendName)." );
foreach ( $files as $file ) {
$this->assertFalse( $this->backend->fileExists( array( 'src' => $file ) ),
"File $file purged." );
+ $this->assertFalse( $this->backend->fileExists( array( 'src' => "$file-3" ) ),
+ "File $file-3 purged." );
}
}
@@ -855,6 +916,7 @@ class FileBackendTest extends MediaWikiTestCase {
$this->backend = $this->singleBackend;
$this->tearDownFiles();
$this->doTestConcatenate( $op, $srcs, $srcsContent, $alreadyExists, $okStatus );
+ $this->filesToPrune[] = $op['dst']; # avoid file leaking
$this->tearDownFiles();
$this->backend = $this->multiBackend;
@@ -873,8 +935,8 @@ class FileBackendTest extends MediaWikiTestCase {
foreach ( $srcs as $i => $source ) {
$this->prepare( array( 'dir' => dirname( $source ) ) );
$ops[] = array(
- 'op' => 'create', // operation
- 'dst' => $source, // source
+ 'op' => 'create', // operation
+ 'dst' => $source, // source
'content' => $srcsContent[$i]
);
$expContent .= $srcsContent[$i];
@@ -927,7 +989,7 @@ class FileBackendTest extends MediaWikiTestCase {
}
}
- function provider_testConcatenate() {
+ public static function provider_testConcatenate() {
$cases = array();
$rand = mt_rand( 0, 2000000000 ) . time();
@@ -979,6 +1041,7 @@ class FileBackendTest extends MediaWikiTestCase {
/**
* @dataProvider provider_testGetFileStat
+ * @covers FileBackend::getFileStat
*/
public function testGetFileStat( $path, $content, $alreadyExists ) {
$this->backend = $this->singleBackend;
@@ -1041,7 +1104,7 @@ class FileBackendTest extends MediaWikiTestCase {
}
}
- function provider_testGetFileStat() {
+ public static function provider_testGetFileStat() {
$cases = array();
$base = self::baseStorePath();
@@ -1054,6 +1117,8 @@ class FileBackendTest extends MediaWikiTestCase {
/**
* @dataProvider provider_testGetFileContents
+ * @covers FileBackend::getFileContents
+ * @covers FileBackend::getFileContentsMulti
*/
public function testGetFileContents( $source, $content ) {
$this->backend = $this->singleBackend;
@@ -1096,7 +1161,7 @@ class FileBackendTest extends MediaWikiTestCase {
}
}
- function provider_testGetFileContents() {
+ public static function provider_testGetFileContents() {
$cases = array();
$base = self::baseStorePath();
@@ -1113,6 +1178,7 @@ class FileBackendTest extends MediaWikiTestCase {
/**
* @dataProvider provider_testGetLocalCopy
+ * @covers FileBackend::getLocalCopy
*/
public function testGetLocalCopy( $source, $content ) {
$this->backend = $this->singleBackend;
@@ -1164,7 +1230,7 @@ class FileBackendTest extends MediaWikiTestCase {
$tmpFile->bind( $obj );
}
- function provider_testGetLocalCopy() {
+ public static function provider_testGetLocalCopy() {
$cases = array();
$base = self::baseStorePath();
@@ -1182,6 +1248,7 @@ class FileBackendTest extends MediaWikiTestCase {
/**
* @dataProvider provider_testGetLocalReference
+ * @covers FileBackend::getLocalReference
*/
public function testGetLocalReference( $source, $content ) {
$this->backend = $this->singleBackend;
@@ -1230,7 +1297,7 @@ class FileBackendTest extends MediaWikiTestCase {
}
}
- function provider_testGetLocalReference() {
+ public static function provider_testGetLocalReference() {
$cases = array();
$base = self::baseStorePath();
@@ -1246,6 +1313,10 @@ class FileBackendTest extends MediaWikiTestCase {
return $cases;
}
+ /**
+ * @covers FileBackend::getLocalCopy
+ * @covers FileBackend::getLocalReference
+ */
public function testGetLocalCopyAndReference404() {
$this->backend = $this->singleBackend;
$this->tearDownFiles();
@@ -1274,6 +1345,7 @@ class FileBackendTest extends MediaWikiTestCase {
/**
* @dataProvider provider_testGetFileHttpUrl
+ * @covers FileBackend::getFileHttpUrl
*/
public function testGetFileHttpUrl( $source, $content ) {
$this->backend = $this->singleBackend;
@@ -1305,7 +1377,7 @@ class FileBackendTest extends MediaWikiTestCase {
}
}
- function provider_testGetFileHttpUrl() {
+ public static function provider_testGetFileHttpUrl() {
$cases = array();
$base = self::baseStorePath();
@@ -1318,6 +1390,8 @@ class FileBackendTest extends MediaWikiTestCase {
/**
* @dataProvider provider_testPrepareAndClean
+ * @covers FileBackend::prepare
+ * @covers FileBackend::clean
*/
public function testPrepareAndClean( $path, $isOK ) {
$this->backend = $this->singleBackend;
@@ -1329,8 +1403,9 @@ class FileBackendTest extends MediaWikiTestCase {
$this->tearDownFiles();
}
- function provider_testPrepareAndClean() {
+ public static function provider_testPrepareAndClean() {
$base = self::baseStorePath();
+
return array(
array( "$base/unittest-cont1/e/a/z/some_file1.txt", true ),
array( "$base/unittest-cont2/a/z/some_file2.txt", true ),
@@ -1375,6 +1450,9 @@ class FileBackendTest extends MediaWikiTestCase {
$this->tearDownFiles();
}
+ /**
+ * @covers FileBackend::clean
+ */
private function doTestRecursiveClean() {
$backendName = $this->backendClass();
@@ -1419,8 +1497,11 @@ class FileBackendTest extends MediaWikiTestCase {
}
}
- // @TODO: testSecure
+ // @todo testSecure
+ /**
+ * @covers FileBackend::doOperations
+ */
public function testDoOperations() {
$this->backend = $this->singleBackend;
$this->tearDownFiles();
@@ -1508,6 +1589,9 @@ class FileBackendTest extends MediaWikiTestCase {
"Correct file SHA-1 of $fileC" );
}
+ /**
+ * @covers FileBackend::doOperations
+ */
public function testDoOperationsPipeline() {
$this->backend = $this->singleBackend;
$this->tearDownFiles();
@@ -1607,6 +1691,9 @@ class FileBackendTest extends MediaWikiTestCase {
"Correct file SHA-1 of $fileC" );
}
+ /**
+ * @covers FileBackend::doOperations
+ */
public function testDoOperationsFailing() {
$this->backend = $this->singleBackend;
$this->tearDownFiles();
@@ -1681,6 +1768,9 @@ class FileBackendTest extends MediaWikiTestCase {
"Correct file SHA-1 of $fileA" );
}
+ /**
+ * @covers FileBackend::getFileList
+ */
public function testGetFileList() {
$this->backend = $this->singleBackend;
$this->tearDownFiles();
@@ -1729,7 +1819,7 @@ class FileBackendTest extends MediaWikiTestCase {
$this->assertEquals( true, $status->isOK(),
"Creation of files succeeded with OK status ($backendName)." );
- // Expected listing
+ // Expected listing at root
$expected = array(
"e/test1.txt",
"e/test2.txt",
@@ -1748,27 +1838,28 @@ class FileBackendTest extends MediaWikiTestCase {
);
sort( $expected );
- // Actual listing (no trailing slash)
- $list = array();
+ // Actual listing (no trailing slash) at root
$iter = $this->backend->getFileList( array( 'dir' => "$base/unittest-cont1" ) );
- foreach ( $iter as $file ) {
- $list[] = $file;
- }
+ $list = $this->listToArray( $iter );
sort( $list );
+ $this->assertEquals( $expected, $list, "Correct file listing ($backendName)." );
+ // Actual listing (no trailing slash) at root with advise
+ $iter = $this->backend->getFileList( array( 'dir' => "$base/unittest-cont1", 'adviseStat' => 1 ) );
+ $list = $this->listToArray( $iter );
+ sort( $list );
$this->assertEquals( $expected, $list, "Correct file listing ($backendName)." );
- // Actual listing (with trailing slash)
+ // Actual listing (with trailing slash) at root
$list = array();
$iter = $this->backend->getFileList( array( 'dir' => "$base/unittest-cont1/" ) );
foreach ( $iter as $file ) {
$list[] = $file;
}
sort( $list );
-
$this->assertEquals( $expected, $list, "Correct file listing ($backendName)." );
- // Expected listing
+ // Expected listing at subdir
$expected = array(
"test1.txt",
"test2.txt",
@@ -1780,36 +1871,39 @@ class FileBackendTest extends MediaWikiTestCase {
);
sort( $expected );
- // Actual listing (no trailing slash)
- $list = array();
+ // Actual listing (no trailing slash) at subdir
$iter = $this->backend->getFileList( array( 'dir' => "$base/unittest-cont1/e/subdir2/subdir" ) );
- foreach ( $iter as $file ) {
- $list[] = $file;
- }
+ $list = $this->listToArray( $iter );
sort( $list );
+ $this->assertEquals( $expected, $list, "Correct file listing ($backendName)." );
+ // Actual listing (no trailing slash) at subdir with advise
+ $iter = $this->backend->getFileList( array( 'dir' => "$base/unittest-cont1/e/subdir2/subdir", 'adviseStat' => 1 ) );
+ $list = $this->listToArray( $iter );
+ sort( $list );
$this->assertEquals( $expected, $list, "Correct file listing ($backendName)." );
- // Actual listing (with trailing slash)
+ // Actual listing (with trailing slash) at subdir
$list = array();
$iter = $this->backend->getFileList( array( 'dir' => "$base/unittest-cont1/e/subdir2/subdir/" ) );
foreach ( $iter as $file ) {
$list[] = $file;
}
sort( $list );
-
$this->assertEquals( $expected, $list, "Correct file listing ($backendName)." );
// Actual listing (using iterator second time)
- $list = array();
- foreach ( $iter as $file ) {
- $list[] = $file;
- }
+ $list = $this->listToArray( $iter );
sort( $list );
-
$this->assertEquals( $expected, $list, "Correct file listing ($backendName), second iteration." );
- // Expected listing (top files only)
+ // Actual listing (top files only) at root
+ $iter = $this->backend->getTopFileList( array( 'dir' => "$base/unittest-cont1" ) );
+ $list = $this->listToArray( $iter );
+ sort( $list );
+ $this->assertEquals( array(), $list, "Correct top file listing ($backendName)." );
+
+ // Expected listing (top files only) at subdir
$expected = array(
"test1.txt",
"test2.txt",
@@ -1819,14 +1913,16 @@ class FileBackendTest extends MediaWikiTestCase {
);
sort( $expected );
- // Actual listing (top files only)
- $list = array();
+ // Actual listing (top files only) at subdir
$iter = $this->backend->getTopFileList( array( 'dir' => "$base/unittest-cont1/e/subdir2/subdir" ) );
- foreach ( $iter as $file ) {
- $list[] = $file;
- }
+ $list = $this->listToArray( $iter );
sort( $list );
+ $this->assertEquals( $expected, $list, "Correct top file listing ($backendName)." );
+ // Actual listing (top files only) at subdir with advise
+ $iter = $this->backend->getTopFileList( array( 'dir' => "$base/unittest-cont1/e/subdir2/subdir", 'adviseStat' => 1 ) );
+ $list = $this->listToArray( $iter );
+ sort( $list );
$this->assertEquals( $expected, $list, "Correct top file listing ($backendName)." );
foreach ( $files as $file ) { // clean up
@@ -1834,9 +1930,15 @@ class FileBackendTest extends MediaWikiTestCase {
}
$iter = $this->backend->getFileList( array( 'dir' => "$base/unittest-cont1/not/exists" ) );
- foreach ( $iter as $iter ) {} // no errors
+ foreach ( $iter as $iter ) {
+ // no errors
+ }
}
+ /**
+ * @covers FileBackend::getTopDirectoryList
+ * @covers FileBackend::getDirectoryList
+ */
public function testGetDirectoryList() {
$this->backend = $this->singleBackend;
$this->tearDownFiles();
@@ -2023,7 +2125,7 @@ class FileBackendTest extends MediaWikiTestCase {
$this->assertEquals( $expected, $list, "Correct dir listing ($backendName)." );
$iter = $this->backend->getDirectoryList( array( 'dir' => "$base/unittest-cont1/e/subdir1" ) );
- $items = is_array( $iter ) ? $iter : iterator_to_array( $iter );
+ $items = $this->listToArray( $iter );
$this->assertEquals( array(), $items, "Directory listing is empty." );
foreach ( $files as $file ) { // clean up
@@ -2031,15 +2133,22 @@ class FileBackendTest extends MediaWikiTestCase {
}
$iter = $this->backend->getDirectoryList( array( 'dir' => "$base/unittest-cont1/not/exists" ) );
- foreach ( $iter as $file ) {} // no errors
- $items = is_array( $iter ) ? $iter : iterator_to_array( $iter );
+ foreach ( $iter as $file ) {
+ // no errors
+ }
+
+ $items = $this->listToArray( $iter );
$this->assertEquals( array(), $items, "Directory listing is empty." );
$iter = $this->backend->getDirectoryList( array( 'dir' => "$base/unittest-cont1/e/not/exists" ) );
- $items = is_array( $iter ) ? $iter : iterator_to_array( $iter );
+ $items = $this->listToArray( $iter );
$this->assertEquals( array(), $items, "Directory listing is empty." );
}
+ /**
+ * @covers FileBackend::lockFiles
+ * @covers FileBackend::unlockFiles
+ */
public function testLockCalls() {
$this->backend = $this->singleBackend;
$this->doTestLockCalls();
@@ -2071,7 +2180,7 @@ class FileBackendTest extends MediaWikiTestCase {
"subdir2/subdir/sub/120-px-file.txt",
);
- for ( $i=0; $i<25; $i++ ) {
+ for ( $i = 0; $i < 25; $i++ ) {
$status = $this->backend->lockFiles( $paths, LockManager::LOCK_EX );
$this->assertEquals( print_r( array(), true ), print_r( $status->errors, true ),
"Locking of files succeeded ($backendName) ($i)." );
@@ -2141,6 +2250,11 @@ class FileBackendTest extends MediaWikiTestCase {
"Scoped unlocking of files succeeded with OK status ($backendName)." );
}
+ // helper function
+ private function listToArray( $iter ) {
+ return is_array( $iter ) ? $iter : iterator_to_array( $iter );
+ }
+
// test helper wrapper for backend prepare() function
private function prepare( array $params ) {
return $this->backend->prepare( $params );
@@ -2149,12 +2263,15 @@ class FileBackendTest extends MediaWikiTestCase {
// test helper wrapper for backend prepare() function
private function create( array $params ) {
$params['op'] = 'create';
+
return $this->backend->doQuickOperations( array( $params ) );
}
function tearDownFiles() {
foreach ( $this->filesToPrune as $file ) {
- @unlink( $file );
+ if ( is_file( $file ) ) {
+ unlink( $file );
+ }
}
$containers = array( 'unittest-cont1', 'unittest-cont2' );
foreach ( $containers as $container ) {
diff --git a/tests/phpunit/includes/filerepo/FileRepoTest.php b/tests/phpunit/includes/filerepo/FileRepoTest.php
index 7cc25b1b..e3a75567 100644
--- a/tests/phpunit/includes/filerepo/FileRepoTest.php
+++ b/tests/phpunit/includes/filerepo/FileRepoTest.php
@@ -4,37 +4,44 @@ class FileRepoTest extends MediaWikiTestCase {
/**
* @expectedException MWException
+ * @covers FileRepo::__construct
*/
- function testFileRepoConstructionOptionCanNotBeNull() {
- $f = new FileRepo();
+ public function testFileRepoConstructionOptionCanNotBeNull() {
+ new FileRepo();
}
/**
* @expectedException MWException
+ * @covers FileRepo::__construct
*/
- function testFileRepoConstructionOptionCanNotBeAnEmptyArray() {
- $f = new FileRepo( array() );
+ public function testFileRepoConstructionOptionCanNotBeAnEmptyArray() {
+ new FileRepo( array() );
}
/**
* @expectedException MWException
+ * @covers FileRepo::__construct
*/
- function testFileRepoConstructionOptionNeedNameKey() {
- $f = new FileRepo( array(
+ public function testFileRepoConstructionOptionNeedNameKey() {
+ new FileRepo( array(
'backend' => 'foobar'
) );
}
/**
* @expectedException MWException
+ * @covers FileRepo::__construct
*/
- function testFileRepoConstructionOptionNeedBackendKey() {
- $f = new FileRepo( array(
+ public function testFileRepoConstructionOptionNeedBackendKey() {
+ new FileRepo( array(
'name' => 'foobar'
) );
}
- function testFileRepoConstructionWithRequiredOptions() {
+ /**
+ * @covers FileRepo::__construct
+ */
+ public function testFileRepoConstructionWithRequiredOptions() {
$f = new FileRepo( array(
'name' => 'FileRepoTestRepository',
'backend' => new FSFileBackend( array(
diff --git a/tests/phpunit/includes/filerepo/StoreBatchTest.php b/tests/phpunit/includes/filerepo/StoreBatchTest.php
index a89ef98e..b33c1bbb 100644
--- a/tests/phpunit/includes/filerepo/StoreBatchTest.php
+++ b/tests/phpunit/includes/filerepo/StoreBatchTest.php
@@ -1,10 +1,16 @@
<?php
+
/**
* @group FileRepo
* @group medium
*/
class StoreBatchTest extends MediaWikiTestCase {
+ protected $createdFiles;
+ protected $date;
+ /** @var FileRepo */
+ protected $repo;
+
protected function setUp() {
global $wgFileBackends;
parent::setUp();
@@ -60,6 +66,7 @@ class StoreBatchTest extends MediaWikiTestCase {
* @param $originalName string The title of the image
* @param $srcPath string The filepath or virtual URL
* @param $flags integer Flags to pass into repo::store().
+ * @return FileRepoStatus
*/
private function storeit( $originalName, $srcPath, $flags ) {
$hashPath = $this->repo->getHashPath( $originalName );
@@ -69,6 +76,7 @@ class StoreBatchTest extends MediaWikiTestCase {
$result = $this->repo->store( $srcPath, 'temp', $dstRel, $flags );
$result->value = $this->repo->getVirtualUrl( 'temp' ) . '/' . $dstUrlRel;
$this->createdFiles[] = $result->value;
+
return $result;
}
@@ -78,7 +86,7 @@ class StoreBatchTest extends MediaWikiTestCase {
* @param $fn string The title of the image
* @param $infn string The name of the file (in the filesystem)
* @param $otherfn string The name of the different file (in the filesystem)
- * @param $fromrepo logical 'true' if we want to copy from a virtual URL out of the Repo.
+ * @param $fromrepo bool 'true' if we want to copy from a virtual URL out of the Repo.
*/
private function storecohort( $fn, $infn, $otherfn, $fromrepo ) {
$f = $this->storeit( $fn, $infn, 0 );
@@ -115,6 +123,9 @@ class StoreBatchTest extends MediaWikiTestCase {
$this->assertEquals( $f->successCount, 0, "counts wrong {$f->successCount} {$f->failCount}" );
}
+ /**
+ * @covers FileRepo::store
+ */
public function teststore() {
global $IP;
$this->storecohort( "Test1.png", "$IP/skins/monobook/wiki.png", "$IP/skins/monobook/video.png", false );
diff --git a/tests/phpunit/includes/installer/InstallDocFormatterTest.php b/tests/phpunit/includes/installer/InstallDocFormatterTest.php
index 74b921a5..0e5f2671 100644
--- a/tests/phpunit/includes/installer/InstallDocFormatterTest.php
+++ b/tests/phpunit/includes/installer/InstallDocFormatterTest.php
@@ -1,5 +1,5 @@
<?php
-/*
+/*
* To change this template, choose Tools | Templates
* and open the template in the editor.
*/
@@ -9,7 +9,7 @@ class InstallDocFormatterTest extends MediaWikiTestCase {
* @covers InstallDocFormatter::format
* @dataProvider provideDocFormattingTests
*/
- function testFormat( $expected, $unformattedText, $message = '' ) {
+ public function testFormat( $expected, $unformattedText, $message = '' ) {
$this->assertEquals(
$expected,
InstallDocFormatter::format( $unformattedText ),
@@ -20,13 +20,14 @@ class InstallDocFormatterTest extends MediaWikiTestCase {
/**
* Provider for testFormat()
*/
- function provideDocFormattingTests() {
+ public static function provideDocFormattingTests() {
# Format: (expected string, unformattedText string, optional message)
return array(
# Escape some wikitext
array( 'Install &lt;tag>', 'Install <tag>', 'Escaping <' ),
array( 'Install &#123;&#123;template}}', 'Install {{template}}', 'Escaping [[' ),
array( 'Install &#91;&#91;page]]', 'Install [[page]]', 'Escaping {{' ),
+ array( 'Install &#95;&#95;TOC&#95;&#95;', 'Install __TOC__', 'Escaping __' ),
array( 'Install ', "Install \r", 'Removing \r' ),
# Transform \t{1,2} into :{1,2}
diff --git a/tests/phpunit/includes/installer/OracleInstallerTest.php b/tests/phpunit/includes/installer/OracleInstallerTest.php
new file mode 100644
index 00000000..66e65592
--- /dev/null
+++ b/tests/phpunit/includes/installer/OracleInstallerTest.php
@@ -0,0 +1,48 @@
+<?php
+
+/**
+ * Tests for OracleInstaller
+ *
+ * @group Database
+ * @group Installer
+ */
+
+class OracleInstallerTest extends MediaWikiTestCase {
+
+ /**
+ * @dataProvider provideOracleConnectStrings
+ * @covers OracleInstaller::checkConnectStringFormat
+ */
+ public function testCheckConnectStringFormat( $expected, $connectString, $msg = '' ) {
+ $validity = $expected ? 'should be valid' : 'should NOT be valid';
+ $msg = "'$connectString' ($msg) $validity.";
+ $this->assertEquals( $expected,
+ OracleInstaller::checkConnectStringFormat( $connectString ),
+ $msg
+ );
+ }
+
+ /**
+ * Provider to test OracleInstaller::checkConnectStringFormat()
+ */
+ function provideOracleConnectStrings() {
+ // expected result, connectString[, message]
+ return array(
+ array( true, 'simple_01', 'Simple TNS name' ),
+ array( true, 'simple_01.world', 'TNS name with domain' ),
+ array( true, 'simple_01.domain.net', 'TNS name with domain' ),
+ array( true, 'host123', 'Host only' ),
+ array( true, 'host123.domain.net', 'FQDN only' ),
+ array( true, '//host123.domain.net', 'FQDN URL only' ),
+ array( true, '123.223.213.132', 'Host IP only' ),
+ array( true, 'host:1521', 'Host and port' ),
+ array( true, 'host:1521/service', 'Host, port and service' ),
+ array( true, 'host:1521/service:shared', 'Host, port, service and shared server type' ),
+ array( true, 'host:1521/service:dedicated', 'Host, port, service and dedicated server type' ),
+ array( true, 'host:1521/service:pooled', 'Host, port, service and pooled server type' ),
+ array( true, 'host:1521/service:shared/instance1', 'Host, port, service, server type and instance' ),
+ array( true, 'host:1521//instance1', 'Host, port and instance' ),
+ );
+ }
+
+}
diff --git a/tests/phpunit/includes/jobqueue/JobQueueTest.php b/tests/phpunit/includes/jobqueue/JobQueueTest.php
index 453cec31..4e51c4fc 100644
--- a/tests/phpunit/includes/jobqueue/JobQueueTest.php
+++ b/tests/phpunit/includes/jobqueue/JobQueueTest.php
@@ -8,19 +8,19 @@
class JobQueueTest extends MediaWikiTestCase {
protected $key;
protected $queueRand, $queueRandTTL, $queueFifo, $queueFifoTTL;
- protected $old = array();
- function __construct( $name = null, array $data = array(), $dataName = '' ) {
+ function __construct( $name = null, array $data = array(), $dataName = '' ) {
parent::__construct( $name, $data, $dataName );
$this->tablesUsed[] = 'job';
}
protected function setUp() {
- global $wgMemc, $wgJobTypeConf;
+ global $wgJobTypeConf;
parent::setUp();
- $this->old['wgMemc'] = $wgMemc;
- $wgMemc = new HashBagOStuff();
+
+ $this->setMwGlobals( 'wgMemc', new HashBagOStuff() );
+
if ( $this->getCliArg( 'use-jobqueue=' ) ) {
$name = $this->getCliArg( 'use-jobqueue=' );
if ( !isset( $wgJobTypeConf[$name] ) ) {
@@ -32,44 +32,50 @@ class JobQueueTest extends MediaWikiTestCase {
}
$baseConfig['type'] = 'null';
$baseConfig['wiki'] = wfWikiID();
- $this->queueRand = JobQueue::factory(
- array( 'order' => 'random', 'claimTTL' => 0 ) + $baseConfig );
- $this->queueRandTTL = JobQueue::factory(
- array( 'order' => 'random', 'claimTTL' => 10 ) + $baseConfig );
- $this->queueFifo = JobQueue::factory(
- array( 'order' => 'fifo', 'claimTTL' => 0 ) + $baseConfig );
- $this->queueFifoTTL = JobQueue::factory(
- array( 'order' => 'fifo', 'claimTTL' => 10 ) + $baseConfig );
- if ( $baseConfig['class'] !== 'JobQueueDB' ) { // DB namespace with prefix or temp tables
- foreach ( array( 'queueRand', 'queueRandTTL', 'queueFifo', 'queueFifoTTL' ) as $q ) {
- $this->$q->setTestingPrefix( 'unittests-' . wfRandomString( 32 ) );
- }
+ $variants = array(
+ 'queueRand' => array( 'order' => 'random', 'claimTTL' => 0 ),
+ 'queueRandTTL' => array( 'order' => 'random', 'claimTTL' => 10 ),
+ 'queueTimestamp' => array( 'order' => 'timestamp', 'claimTTL' => 0 ),
+ 'queueTimestampTTL' => array( 'order' => 'timestamp', 'claimTTL' => 10 ),
+ 'queueFifo' => array( 'order' => 'fifo', 'claimTTL' => 0 ),
+ 'queueFifoTTL' => array( 'order' => 'fifo', 'claimTTL' => 10 ),
+ );
+ foreach ( $variants as $q => $settings ) {
+ try {
+ $this->$q = JobQueue::factory( $settings + $baseConfig );
+ if ( !( $this->$q instanceof JobQueueDB ) ) {
+ $this->$q->setTestingPrefix( 'unittests-' . wfRandomString( 32 ) );
+ }
+ } catch ( MWException $e ) {
+ // unsupported?
+ // @todo What if it was another error?
+ };
}
}
protected function tearDown() {
- global $wgMemc;
parent::tearDown();
- foreach ( array( 'queueRand', 'queueRandTTL', 'queueFifo', 'queueFifoTTL' ) as $q ) {
- do {
- $job = $this->$q->pop();
- if ( $job ) {
- $this->$q->ack( $job );
- }
- } while ( $job );
+ foreach (
+ array(
+ 'queueRand', 'queueRandTTL', 'queueTimestamp', 'queueTimestampTTL',
+ 'queueFifo', 'queueFifoTTL'
+ ) as $q
+ ) {
+ if ( $this->$q ) {
+ $this->$q->delete();
+ }
+ $this->$q = null;
}
- $this->queueRand = null;
- $this->queueRandTTL = null;
- $this->queueFifo = null;
- $this->queueFifoTTL = null;
- $wgMemc = $this->old['wgMemc'];
}
/**
* @dataProvider provider_queueLists
*/
- function testProperties( $queue, $order, $recycles, $desc ) {
+ public function testProperties( $queue, $recycles, $desc ) {
$queue = $this->$queue;
+ if ( !$queue ) {
+ $this->markTestSkipped( $desc );
+ }
$this->assertEquals( wfWikiID(), $queue->getWiki(), "Proper wiki ID ($desc)" );
$this->assertEquals( 'null', $queue->getType(), "Proper job type ($desc)" );
@@ -78,8 +84,12 @@ class JobQueueTest extends MediaWikiTestCase {
/**
* @dataProvider provider_queueLists
*/
- function testBasicOperations( $queue, $order, $recycles, $desc ) {
+ public function testBasicOperations( $queue, $recycles, $desc ) {
$queue = $this->$queue;
+ if ( !$queue ) {
+ $this->markTestSkipped( $desc );
+ }
+
$this->assertTrue( $queue->isEmpty(), "Queue is empty ($desc)" );
$queue->flushCaches();
@@ -94,6 +104,8 @@ class JobQueueTest extends MediaWikiTestCase {
$queue->flushCaches();
$this->assertEquals( 2, $queue->getSize(), "Queue size is correct ($desc)" );
$this->assertEquals( 0, $queue->getAcquiredCount(), "No jobs active ($desc)" );
+ $jobs = iterator_to_array( $queue->getAllQueuedJobs() );
+ $this->assertEquals( 2, count( $jobs ), "Queue iterator size is correct ($desc)" );
$job1 = $queue->pop();
$this->assertFalse( $queue->isEmpty(), "Queue is not empty ($desc)" );
@@ -132,13 +144,25 @@ class JobQueueTest extends MediaWikiTestCase {
$queue->flushCaches();
$this->assertEquals( 0, $queue->getAcquiredCount(), "Active job count ($desc)" );
+
+ $this->assertTrue( $queue->batchPush( array( $this->newJob(), $this->newJob() ) ),
+ "Push worked ($desc)" );
+ $this->assertFalse( $queue->isEmpty(), "Queue is not empty ($desc)" );
+
+ $queue->delete();
+ $queue->flushCaches();
+ $this->assertTrue( $queue->isEmpty(), "Queue is empty ($desc)" );
+ $this->assertEquals( 0, $queue->getSize(), "Queue is empty ($desc)" );
}
/**
* @dataProvider provider_queueLists
*/
- function testBasicDeduplication( $queue, $order, $recycles, $desc ) {
+ public function testBasicDeduplication( $queue, $recycles, $desc ) {
$queue = $this->$queue;
+ if ( !$queue ) {
+ $this->markTestSkipped( $desc );
+ }
$this->assertTrue( $queue->isEmpty(), "Queue is empty ($desc)" );
@@ -146,8 +170,10 @@ class JobQueueTest extends MediaWikiTestCase {
$this->assertEquals( 0, $queue->getSize(), "Queue is empty ($desc)" );
$this->assertEquals( 0, $queue->getAcquiredCount(), "Queue is empty ($desc)" );
- $this->assertTrue( $queue->batchPush(
- array( $this->newDedupedJob(), $this->newDedupedJob(), $this->newDedupedJob() ) ),
+ $this->assertTrue(
+ $queue->batchPush(
+ array( $this->newDedupedJob(), $this->newDedupedJob(), $this->newDedupedJob() )
+ ),
"Push worked ($desc)" );
$this->assertFalse( $queue->isEmpty(), "Queue is not empty ($desc)" );
@@ -156,9 +182,12 @@ class JobQueueTest extends MediaWikiTestCase {
$this->assertEquals( 1, $queue->getSize(), "Queue size is correct ($desc)" );
$this->assertEquals( 0, $queue->getAcquiredCount(), "No jobs active ($desc)" );
- $this->assertTrue( $queue->batchPush(
- array( $this->newDedupedJob(), $this->newDedupedJob(), $this->newDedupedJob() ) ),
- "Push worked ($desc)" );
+ $this->assertTrue(
+ $queue->batchPush(
+ array( $this->newDedupedJob(), $this->newDedupedJob(), $this->newDedupedJob() )
+ ),
+ "Push worked ($desc)"
+ );
$this->assertFalse( $queue->isEmpty(), "Queue is not empty ($desc)" );
@@ -186,8 +215,11 @@ class JobQueueTest extends MediaWikiTestCase {
/**
* @dataProvider provider_queueLists
*/
- function testRootDeduplication( $queue, $order, $recycles, $desc ) {
+ public function testRootDeduplication( $queue, $recycles, $desc ) {
$queue = $this->$queue;
+ if ( !$queue ) {
+ $this->markTestSkipped( $desc );
+ }
$this->assertTrue( $queue->isEmpty(), "Queue is empty ($desc)" );
@@ -236,8 +268,11 @@ class JobQueueTest extends MediaWikiTestCase {
/**
* @dataProvider provider_fifoQueueLists
*/
- function testJobOrder( $queue, $recycles, $desc ) {
+ public function testJobOrder( $queue, $recycles, $desc ) {
$queue = $this->$queue;
+ if ( !$queue ) {
+ $this->markTestSkipped( $desc );
+ }
$this->assertTrue( $queue->isEmpty(), "Queue is empty ($desc)" );
@@ -264,16 +299,18 @@ class JobQueueTest extends MediaWikiTestCase {
$this->assertEquals( 0, $queue->getAcquiredCount(), "No jobs active ($desc)" );
}
- function provider_queueLists() {
+ public static function provider_queueLists() {
return array(
- array( 'queueRand', 'rand', false, 'Random queue without ack()' ),
- array( 'queueRandTTL', 'rand', true, 'Random queue with ack()' ),
- array( 'queueFifo', 'fifo', false, 'Ordered queue without ack()' ),
- array( 'queueFifoTTL', 'fifo', true, 'Ordered queue with ack()' )
+ array( 'queueRand', false, 'Random queue without ack()' ),
+ array( 'queueRandTTL', true, 'Random queue with ack()' ),
+ array( 'queueTimestamp', false, 'Time ordered queue without ack()' ),
+ array( 'queueTimestampTTL', true, 'Time ordered queue with ack()' ),
+ array( 'queueFifo', false, 'FIFO ordered queue without ack()' ),
+ array( 'queueFifoTTL', true, 'FIFO ordered queue with ack()' )
);
}
- function provider_fifoQueueLists() {
+ public static function provider_fifoQueueLists() {
return array(
array( 'queueFifo', false, 'Ordered queue without ack()' ),
array( 'queueFifoTTL', true, 'Ordered queue with ack()' )
diff --git a/tests/phpunit/includes/json/FormatJsonTest.php b/tests/phpunit/includes/json/FormatJsonTest.php
new file mode 100644
index 00000000..149be05b
--- /dev/null
+++ b/tests/phpunit/includes/json/FormatJsonTest.php
@@ -0,0 +1,161 @@
+<?php
+
+class FormatJsonTest extends MediaWikiTestCase {
+
+ public function testEncoderPrettyPrinting() {
+ $obj = array(
+ 'emptyObject' => new stdClass,
+ 'emptyArray' => array(),
+ 'string' => 'foobar\\',
+ 'filledArray' => array(
+ array(
+ 123,
+ 456,
+ ),
+ // Nested json works without problems
+ '"7":["8",{"9":"10"}]',
+ // Whitespace clean up doesn't touch strings that look alike
+ "{\n\t\"emptyObject\": {\n\t},\n\t\"emptyArray\": [ ]\n}",
+ ),
+ );
+
+ // 4 space indent, no trailing whitespace, no trailing linefeed
+ $json = '{
+ "emptyObject": {},
+ "emptyArray": [],
+ "string": "foobar\\\\",
+ "filledArray": [
+ [
+ 123,
+ 456
+ ],
+ "\"7\":[\"8\",{\"9\":\"10\"}]",
+ "{\n\t\"emptyObject\": {\n\t},\n\t\"emptyArray\": [ ]\n}"
+ ]
+}';
+
+ $json = str_replace( "\r", '', $json ); // Windows compat
+ $this->assertSame( $json, FormatJson::encode( $obj, true ) );
+ }
+
+ public static function provideEncodeDefault() {
+ return self::getEncodeTestCases( array() );
+ }
+
+ /**
+ * @dataProvider provideEncodeDefault
+ */
+ public function testEncodeDefault( $from, $to ) {
+ $this->assertSame( $to, FormatJson::encode( $from ) );
+ }
+
+ public static function provideEncodeUtf8() {
+ return self::getEncodeTestCases( array( 'unicode' ) );
+ }
+
+ /**
+ * @dataProvider provideEncodeUtf8
+ */
+ public function testEncodeUtf8( $from, $to ) {
+ $this->assertSame( $to, FormatJson::encode( $from, false, FormatJson::UTF8_OK ) );
+ }
+
+ public static function provideEncodeXmlMeta() {
+ return self::getEncodeTestCases( array( 'xmlmeta' ) );
+ }
+
+ /**
+ * @dataProvider provideEncodeXmlMeta
+ */
+ public function testEncodeXmlMeta( $from, $to ) {
+ $this->assertSame( $to, FormatJson::encode( $from, false, FormatJson::XMLMETA_OK ) );
+ }
+
+ public static function provideEncodeAllOk() {
+ return self::getEncodeTestCases( array( 'unicode', 'xmlmeta' ) );
+ }
+
+ /**
+ * @dataProvider provideEncodeAllOk
+ */
+ public function testEncodeAllOk( $from, $to ) {
+ $this->assertSame( $to, FormatJson::encode( $from, false, FormatJson::ALL_OK ) );
+ }
+
+ public function testEncodePhpBug46944() {
+ $this->assertNotEquals(
+ '\ud840\udc00',
+ strtolower( FormatJson::encode( "\xf0\xa0\x80\x80" ) ),
+ 'Test encoding an broken json_encode character (U+20000)'
+ );
+ }
+
+ public function testDecodeReturnType() {
+ $this->assertInternalType(
+ 'object',
+ FormatJson::decode( '{"Name": "Cheeso", "Rank": 7}' ),
+ 'Default to object'
+ );
+
+ $this->assertInternalType(
+ 'array',
+ FormatJson::decode( '{"Name": "Cheeso", "Rank": 7}', true ),
+ 'Optional array'
+ );
+ }
+
+ /**
+ * Generate a set of test cases for a particular combination of encoder options.
+ *
+ * @param array $unescapedGroups List of character groups to leave unescaped
+ * @return array: Arrays of unencoded strings and corresponding encoded strings
+ */
+ private static function getEncodeTestCases( array $unescapedGroups ) {
+ $groups = array(
+ 'always' => array(
+ // Forward slash (always unescaped)
+ '/' => '/',
+
+ // Control characters
+ "\0" => '\u0000',
+ "\x08" => '\b',
+ "\t" => '\t',
+ "\n" => '\n',
+ "\r" => '\r',
+ "\f" => '\f',
+ "\x1f" => '\u001f', // representative example
+
+ // Double quotes
+ '"' => '\"',
+
+ // Backslashes
+ '\\' => '\\\\',
+ '\\\\' => '\\\\\\\\',
+ '\\u00e9' => '\\\u00e9', // security check for Unicode unescaping
+
+ // Line terminators
+ "\xe2\x80\xa8" => '\u2028',
+ "\xe2\x80\xa9" => '\u2029',
+ ),
+ 'unicode' => array(
+ "\xc3\xa9" => '\u00e9',
+ "\xf0\x9d\x92\x9e" => '\ud835\udc9e', // U+1D49E, outside the BMP
+ ),
+ 'xmlmeta' => array(
+ '<' => '\u003C', // JSON_HEX_TAG uses uppercase hex digits
+ '>' => '\u003E',
+ '&' => '\u0026',
+ ),
+ );
+
+ $cases = array();
+ foreach ( $groups as $name => $rules ) {
+ $leaveUnescaped = in_array( $name, $unescapedGroups );
+ foreach ( $rules as $from => $to ) {
+ $cases[] = array( $from, '"' . ( $leaveUnescaped ? $from : $to ) . '"' );
+ }
+ }
+
+ return $cases;
+ }
+}
diff --git a/tests/phpunit/includes/json/ServicesJsonTest.php b/tests/phpunit/includes/json/ServicesJsonTest.php
deleted file mode 100644
index 56dc6488..00000000
--- a/tests/phpunit/includes/json/ServicesJsonTest.php
+++ /dev/null
@@ -1,93 +0,0 @@
-<?php
-/*
- * Test cases for our Services_Json library. Requires PHP json support as well,
- * so we can compare output
- */
-class ServicesJsonTest extends MediaWikiTestCase {
- /**
- * Test to make sure core json_encode() and our Services_Json()->encode()
- * produce the same output
- *
- * @dataProvider provideValuesToEncode
- */
- public function testJsonEncode( $input, $desc ) {
- if ( !function_exists( 'json_encode' ) ) {
- $this->markTestIncomplete( 'No PHP json support, unable to test' );
- return;
- } elseif ( strtolower( json_encode( "\xf0\xa0\x80\x80" ) ) != '"\ud840\udc00"' ) {
- $this->markTestIncomplete( 'Have buggy PHP json support, unable to test' );
- return;
- } else {
- $jsonObj = new Services_JSON();
- $this->assertEquals(
- $jsonObj->encode( $input ),
- json_encode( $input ),
- $desc
- );
- }
- }
-
- /**
- * Test to make sure core json_decode() and our Services_Json()->decode()
- * produce the same output
- *
- * @dataProvider provideValuesToDecode
- */
- public function testJsonDecode( $input, $desc ) {
- if ( !function_exists( 'json_decode' ) ) {
- $this->markTestIncomplete( 'No PHP json support, unable to test' );
- return;
- } else {
- $jsonObj = new Services_JSON();
- $this->assertEquals(
- $jsonObj->decode( $input ),
- json_decode( $input ),
- $desc
- );
- }
- }
-
- function provideValuesToEncode() {
- $obj = new stdClass();
- $obj->property = 'value';
- $obj->property2 = null;
- $obj->property3 = 1.234;
- return array(
- array( 1, 'basic integer' ),
- array( -1, 'negative integer' ),
- array( 1.1, 'basic float' ),
- array( true, 'basic bool true' ),
- array( false, 'basic bool false' ),
- array( 'some string', 'basic string test' ),
- array( "some string\nwith newline", 'newline string test' ),
- array( '♥ü', 'unicode string test' ),
- array( array( 'some', 'string', 'values' ), 'basic array of strings' ),
- array( array( 'key1' => 'val1', 'key2' => 'val2' ), 'array with string keys' ),
- array( array( 1 => 'val1', 3 => 'val2', '2' => 'val3' ), 'out of order numbered array test' ),
- array( array(), 'empty array test' ),
- array( $obj, 'basic object test' ),
- array( new stdClass, 'empty object test' ),
- array( null, 'null test' ),
- );
- }
-
- function provideValuesToDecode() {
- return array(
- array( '1', 'basic integer' ),
- array( '-1', 'negative integer' ),
- array( '1.1', 'basic float' ),
- array( '1.1e1', 'scientific float' ),
- array( 'true', 'basic bool true' ),
- array( 'false', 'basic bool false' ),
- array( '"some string"', 'basic string test' ),
- array( '"some string\nwith newline"', 'newline string test' ),
- array( '"♥ü"', 'unicode character string test' ),
- array( '"\u2665"', 'unicode \\u string test' ),
- array( '["some","string","values"]', 'basic array of strings' ),
- array( '[]', 'empty array test' ),
- array( '{"key":"value"}', 'Basic key => value test' ),
- array( '{}', 'empty object test' ),
- array( 'null', 'null test' ),
- );
- }
-}
diff --git a/tests/phpunit/includes/libs/CSSJanusTest.php b/tests/phpunit/includes/libs/CSSJanusTest.php
index 26747b91..5a3c1619 100644
--- a/tests/phpunit/includes/libs/CSSJanusTest.php
+++ b/tests/phpunit/includes/libs/CSSJanusTest.php
@@ -4,12 +4,14 @@
* CSSJanus libary:
* http://code.google.com/p/cssjanus/source/browse/trunk/cssjanus_test.py
* Ported to PHP for ResourceLoader and has been extended since.
+ *
+ * @covers CSSJanus
*/
class CSSJanusTest extends MediaWikiTestCase {
/**
* @dataProvider provideTransformCases
*/
- function testTransform( $cssA, $cssB = null ) {
+ public function testTransform( $cssA, $cssB = null ) {
if ( $cssB ) {
$transformedA = CSSJanus::transform( $cssA );
@@ -28,7 +30,7 @@ class CSSJanusTest extends MediaWikiTestCase {
/**
* @dataProvider provideTransformAdvancedCases
*/
- function testTransformAdvanced( $code, $expectedOutput, $options = array() ) {
+ public function testTransformAdvanced( $code, $expectedOutput, $options = array() ) {
$swapLtrRtlInURL = isset( $options['swapLtrRtlInURL'] ) ? $options['swapLtrRtlInURL'] : false;
$swapLeftRightInURL = isset( $options['swapLeftRightInURL'] ) ? $options['swapLeftRightInURL'] : false;
@@ -44,7 +46,7 @@ class CSSJanusTest extends MediaWikiTestCase {
* @dataProvider provideTransformBrokenCases
* @group Broken
*/
- function testTransformBroken( $code, $expectedOutput ) {
+ public function testTransformBroken( $code, $expectedOutput ) {
$flipped = CSSJanus::transform( $code );
$this->assertEquals( $expectedOutput, $flipped, 'Test flipping' );
@@ -54,7 +56,7 @@ class CSSJanusTest extends MediaWikiTestCase {
* These transform cases are tested *in both directions*
* No need to declare a principle twice in both directions here.
*/
- function provideTransformCases() {
+ public static function provideTransformCases() {
return array(
// Property keys
array(
@@ -137,11 +139,16 @@ class CSSJanusTest extends MediaWikiTestCase {
'.foo { padding: 1px inherit 3px auto; }',
'.foo { padding: 1px auto 3px inherit; }'
),
+ // border-radius assigns different meanings to the values
array(
'.foo { border-radius: .25em 15px 0pt 0ex; }',
- '.foo { border-radius: .25em 0ex 0pt 15px; }'
+ '.foo { border-radius: 15px .25em 0ex 0pt; }'
),
array(
+ '.foo { border-radius: 0px 0px 5px 5px; }',
+ ),
+ // Ensure the rule doesn't break other stuff
+ array(
'.foo { x-unknown: a b c d; }'
),
array(
@@ -151,14 +158,26 @@ class CSSJanusTest extends MediaWikiTestCase {
'#settings td p strong'
),
array(
- # Not sure how 4+ values should behave,
- # testing to make sure changes are detected
- '.foo { x-unknown: 1 2 3 4 5; }',
- '.foo { x-unknown: 1 4 3 2 5; }',
+ // Color names
+ '.foo { border-color: red green blue white }',
+ '.foo { border-color: red white blue green }',
+ ),
+ array(
+ // Color name, hexdecimal, RGB & RGBA
+ '.foo { border-color: red #f00 rgb(255, 0, 0) rgba(255, 0, 0, 0.5) }',
+ '.foo { border-color: red rgba(255, 0, 0, 0.5) rgb(255, 0, 0) #f00 }',
+ ),
+ array(
+ // Color name, hexdecimal, HSL & HSLA
+ '.foo { border-color: red #f00 hsl(0, 100%, 50%) hsla(0, 100%, 50%, 0.5) }',
+ '.foo { border-color: red hsla(0, 100%, 50%, 0.5) hsl(0, 100%, 50%) #f00 }',
),
array(
- '.foo { x-unknown: 1 2 3 4 5 6; }',
- '.foo { x-unknown: 1 4 3 2 5 6; }',
+ // Do not mangle 5 or more values
+ '.foo { -x-unknown: 1 2 3 4 5; }'
+ ),
+ array(
+ '.foo { -x-unknown: 1 2 3 4 5 6; }'
),
// Shorthand / Three notation
@@ -179,6 +198,28 @@ class CSSJanusTest extends MediaWikiTestCase {
'.foo { padding: 1px; }'
),
+ // text-shadow and box-shadow
+ array(
+ '.foo { box-shadow: -6px 3px 8px 5px rgba(0, 0, 0, 0.25); }',
+ '.foo { box-shadow: 6px 3px 8px 5px rgba(0, 0, 0, 0.25); }',
+ ),
+ array(
+ '.foo { box-shadow: inset -6px 3px 8px 5px rgba(0, 0, 0, 0.25); }',
+ '.foo { box-shadow: inset 6px 3px 8px 5px rgba(0, 0, 0, 0.25); }',
+ ),
+ array(
+ '.foo { text-shadow: orange 2px 0; }',
+ '.foo { text-shadow: orange -2px 0; }',
+ ),
+ array(
+ '.foo { text-shadow: 2px 0 orange; }',
+ '.foo { text-shadow: -2px 0 orange; }',
+ ),
+ array(
+ // Don't mangle zeroes
+ '.foo { text-shadow: orange 0 2px; }'
+ ),
+
// Direction
// Note: This differs from the Python implementation,
// see also CSSJanus::fixDirection for more info.
@@ -377,6 +418,11 @@ class CSSJanusTest extends MediaWikiTestCase {
'/* @noflip */ div { float: left; } .foo { float: right; }'
),
array(
+ // support parentheses in selector
+ '/* @noflip */ .test:not(:first) { margin-right: -0.25em; margin-left: 0.25em; }',
+ '/* @noflip */ .test:not(:first) { margin-right: -0.25em; margin-left: 0.25em; }'
+ ),
+ array(
// after multiple rules
'.foo { float: left; } /* @noflip */ div { float: left; }',
'.foo { float: right; } /* @noflip */ div { float: left; }'
@@ -476,7 +522,7 @@ class CSSJanusTest extends MediaWikiTestCase {
* If both ways can be tested, either put both versions in here or move
* it to provideTransformCases().
*/
- function provideTransformAdvancedCases() {
+ public static function provideTransformAdvancedCases() {
$bgPairs = array(
# [ - _ . ] <-> [ left right ltr rtl ]
'foo.jpg' => 'foo.jpg',
@@ -542,7 +588,7 @@ class CSSJanusTest extends MediaWikiTestCase {
* Cases that are currently failing, but
* should be looked at in the future as enhancements and/or bug fix
*/
- function provideTransformBrokenCases() {
+ public static function provideTransformBrokenCases() {
return array(
// Guard against selectors that look flippable
array(
diff --git a/tests/phpunit/includes/libs/CSSMinTest.php b/tests/phpunit/includes/libs/CSSMinTest.php
index 57017a84..951dd7b9 100644
--- a/tests/phpunit/includes/libs/CSSMinTest.php
+++ b/tests/phpunit/includes/libs/CSSMinTest.php
@@ -21,13 +21,13 @@ class CSSMinTest extends MediaWikiTestCase {
/**
* @dataProvider provideMinifyCases
*/
- function testMinify( $code, $expectedOutput ) {
+ public function testMinify( $code, $expectedOutput ) {
$minified = CSSMin::minify( $code );
$this->assertEquals( $expectedOutput, $minified, 'Minified output should be in the form expected.' );
}
- function provideMinifyCases() {
+ public static function provideMinifyCases() {
return array(
// Whitespace
array( "\r\t\f \v\n\r", "" ),
@@ -70,14 +70,14 @@ class CSSMinTest extends MediaWikiTestCase {
/**
* @dataProvider provideRemapCases
*/
- function testRemap( $message, $params, $expectedOutput ) {
+ public function testRemap( $message, $params, $expectedOutput ) {
$remapped = call_user_func_array( 'CSSMin::remap', $params );
$messageAdd = " Case: $message";
$this->assertEquals( $expectedOutput, $remapped, 'CSSMin::remap should return the expected url form.' . $messageAdd );
}
- function provideRemapCases() {
+ public static function provideRemapCases() {
// Parameter signature:
// CSSMin::remap( $code, $local, $remote, $embedData = true )
return array(
@@ -115,11 +115,11 @@ class CSSMinTest extends MediaWikiTestCase {
* @group Broken
* @dataProvider provideStringCases
*/
- function testMinifyWithCSSStringValues( $code, $expectedOutput ) {
+ public function testMinifyWithCSSStringValues( $code, $expectedOutput ) {
$this->testMinifyOutput( $code, $expectedOutput );
}
- function provideStringCases() {
+ public static function provideStringCases() {
return array(
// String values should be respected
// - More than one space in a string value
diff --git a/tests/phpunit/includes/libs/GenericArrayObjectTest.php b/tests/phpunit/includes/libs/GenericArrayObjectTest.php
index 37a9b347..7436c43c 100644
--- a/tests/phpunit/includes/libs/GenericArrayObjectTest.php
+++ b/tests/phpunit/includes/libs/GenericArrayObjectTest.php
@@ -73,6 +73,7 @@ abstract class GenericArrayObjectTest extends MediaWikiTestCase {
*/
protected function getNew( array $elements = array() ) {
$class = $this->getInstanceClass();
+
return new $class( $elements );
}
@@ -197,6 +198,7 @@ abstract class GenericArrayObjectTest extends MediaWikiTestCase {
public function testOffsetSet( array $elements ) {
if ( $elements === array() ) {
$this->assertTrue( true );
+
return;
}
@@ -258,5 +260,4 @@ abstract class GenericArrayObjectTest extends MediaWikiTestCase {
$this->assertArrayEquals( $list, $copy, true, true );
}
-
}
diff --git a/tests/phpunit/includes/libs/IEUrlExtensionTest.php b/tests/phpunit/includes/libs/IEUrlExtensionTest.php
index d04dd7d4..66fe915a 100644
--- a/tests/phpunit/includes/libs/IEUrlExtensionTest.php
+++ b/tests/phpunit/includes/libs/IEUrlExtensionTest.php
@@ -4,7 +4,7 @@
* Tests for IEUrlExtension::findIE6Extension
*/
class IEUrlExtensionTest extends MediaWikiTestCase {
- function testSimple() {
+ public function testSimple() {
$this->assertEquals(
'y',
IEUrlExtension::findIE6Extension( 'x.y' ),
@@ -12,7 +12,7 @@ class IEUrlExtensionTest extends MediaWikiTestCase {
);
}
- function testSimpleNoExt() {
+ public function testSimpleNoExt() {
$this->assertEquals(
'',
IEUrlExtension::findIE6Extension( 'x' ),
@@ -20,7 +20,7 @@ class IEUrlExtensionTest extends MediaWikiTestCase {
);
}
- function testEmpty() {
+ public function testEmpty() {
$this->assertEquals(
'',
IEUrlExtension::findIE6Extension( '' ),
@@ -28,7 +28,7 @@ class IEUrlExtensionTest extends MediaWikiTestCase {
);
}
- function testQuestionMark() {
+ public function testQuestionMark() {
$this->assertEquals(
'',
IEUrlExtension::findIE6Extension( '?' ),
@@ -36,7 +36,7 @@ class IEUrlExtensionTest extends MediaWikiTestCase {
);
}
- function testExtQuestionMark() {
+ public function testExtQuestionMark() {
$this->assertEquals(
'x',
IEUrlExtension::findIE6Extension( '.x?' ),
@@ -44,7 +44,7 @@ class IEUrlExtensionTest extends MediaWikiTestCase {
);
}
- function testQuestionMarkExt() {
+ public function testQuestionMarkExt() {
$this->assertEquals(
'x',
IEUrlExtension::findIE6Extension( '?.x' ),
@@ -52,7 +52,7 @@ class IEUrlExtensionTest extends MediaWikiTestCase {
);
}
- function testInvalidChar() {
+ public function testInvalidChar() {
$this->assertEquals(
'',
IEUrlExtension::findIE6Extension( '.x*' ),
@@ -60,7 +60,7 @@ class IEUrlExtensionTest extends MediaWikiTestCase {
);
}
- function testInvalidCharThenExtension() {
+ public function testInvalidCharThenExtension() {
$this->assertEquals(
'x',
IEUrlExtension::findIE6Extension( '*.x' ),
@@ -68,7 +68,7 @@ class IEUrlExtensionTest extends MediaWikiTestCase {
);
}
- function testMultipleQuestionMarks() {
+ public function testMultipleQuestionMarks() {
$this->assertEquals(
'c',
IEUrlExtension::findIE6Extension( 'a?b?.c?.d?e?f' ),
@@ -76,7 +76,7 @@ class IEUrlExtensionTest extends MediaWikiTestCase {
);
}
- function testExeException() {
+ public function testExeException() {
$this->assertEquals(
'd',
IEUrlExtension::findIE6Extension( 'a?b?.exe?.d?.e' ),
@@ -84,7 +84,7 @@ class IEUrlExtensionTest extends MediaWikiTestCase {
);
}
- function testExeException2() {
+ public function testExeException2() {
$this->assertEquals(
'exe',
IEUrlExtension::findIE6Extension( 'a?b?.exe' ),
@@ -92,7 +92,7 @@ class IEUrlExtensionTest extends MediaWikiTestCase {
);
}
- function testHash() {
+ public function testHash() {
$this->assertEquals(
'',
IEUrlExtension::findIE6Extension( 'a#b.c' ),
@@ -100,7 +100,7 @@ class IEUrlExtensionTest extends MediaWikiTestCase {
);
}
- function testHash2() {
+ public function testHash2() {
$this->assertEquals(
'',
IEUrlExtension::findIE6Extension( 'a?#b.c' ),
@@ -108,7 +108,7 @@ class IEUrlExtensionTest extends MediaWikiTestCase {
);
}
- function testDotAtEnd() {
+ public function testDotAtEnd() {
$this->assertEquals(
'',
IEUrlExtension::findIE6Extension( '.' ),
@@ -116,7 +116,7 @@ class IEUrlExtensionTest extends MediaWikiTestCase {
);
}
- function testTwoDots() {
+ public function testTwoDots() {
$this->assertEquals(
'z',
IEUrlExtension::findIE6Extension( 'x.y.z' ),
diff --git a/tests/phpunit/includes/libs/JavaScriptMinifierTest.php b/tests/phpunit/includes/libs/JavaScriptMinifierTest.php
index 1f550795..ab72e361 100644
--- a/tests/phpunit/includes/libs/JavaScriptMinifierTest.php
+++ b/tests/phpunit/includes/libs/JavaScriptMinifierTest.php
@@ -2,7 +2,7 @@
class JavaScriptMinifierTest extends MediaWikiTestCase {
- function provideCases() {
+ public static function provideCases() {
return array(
// Basic whitespace and comments that should be stripped entirely
@@ -119,7 +119,7 @@ class JavaScriptMinifierTest extends MediaWikiTestCase {
/**
* @dataProvider provideCases
*/
- function testJavaScriptMinifierOutput( $code, $expectedOutput ) {
+ public function testJavaScriptMinifierOutput( $code, $expectedOutput ) {
$minified = JavaScriptMinifier::minify( $code );
// JSMin+'s parser will throw an exception if output is not valid JS.
@@ -132,7 +132,7 @@ class JavaScriptMinifierTest extends MediaWikiTestCase {
$this->assertEquals( $expectedOutput, $minified, "Minified output should be in the form expected." );
}
- function provideBug32548() {
+ public static function provideBug32548() {
return array(
array(
// This one gets interpreted all together by the prior code;
@@ -153,7 +153,7 @@ class JavaScriptMinifierTest extends MediaWikiTestCase {
/**
* @dataProvider provideBug32548
*/
- function testBug32548Exponent( $num ) {
+ public function testBug32548Exponent( $num ) {
// Long line breaking was being incorrectly done between the base and
// exponent part of a number, causing a syntax error. The line should
// instead break at the start of the number.
diff --git a/tests/phpunit/includes/media/BitmapMetadataHandlerTest.php b/tests/phpunit/includes/media/BitmapMetadataHandlerTest.php
index b221b832..a0e63a8a 100644
--- a/tests/phpunit/includes/media/BitmapMetadataHandlerTest.php
+++ b/tests/phpunit/includes/media/BitmapMetadataHandlerTest.php
@@ -16,18 +16,17 @@ class BitmapMetadataHandlerTest extends MediaWikiTestCase {
* Basically the file has IPTC and XMP metadata, the
* IPTC should override the XMP, except for the multilingual
* translation (to en) where XMP should win.
+ * @covers BitmapMetadataHandler::Jpeg
*/
public function testMultilingualCascade() {
- global $wgShowEXIF;
-
- if ( !wfDl( 'exif' ) ) {
+ if ( !extension_loaded( 'exif' ) ) {
$this->markTestSkipped( "This test needs the exif extension." );
}
- if ( !wfDl( 'xml' ) ) {
+ if ( !extension_loaded( 'xml' ) ) {
$this->markTestSkipped( "This test needs the xml extension." );
}
- $wgShowEXIF = true;
+ $this->setMwGlobals( 'wgShowEXIF', true );
$meta = BitmapMetadataHandler::Jpeg( $this->filePath .
'/Xmp-exif-multilingual_test.jpg' );
@@ -50,6 +49,7 @@ class BitmapMetadataHandlerTest extends MediaWikiTestCase {
*
* There's more extensive tests of comment extraction in
* JpegMetadataExtractorTests.php
+ * @covers BitmapMetadataHandler::Jpeg
*/
public function testJpegComment() {
$meta = BitmapMetadataHandler::Jpeg( $this->filePath .
@@ -62,6 +62,7 @@ class BitmapMetadataHandlerTest extends MediaWikiTestCase {
/**
* Make sure a bad iptc block doesn't stop the other metadata
* from being extracted.
+ * @covers BitmapMetadataHandler::Jpeg
*/
public function testBadIPTC() {
$meta = BitmapMetadataHandler::Jpeg( $this->filePath .
@@ -69,6 +70,9 @@ class BitmapMetadataHandlerTest extends MediaWikiTestCase {
$this->assertEquals( 'Created with GIMP', $meta['JPEGFileComment'][0] );
}
+ /**
+ * @covers BitmapMetadataHandler::Jpeg
+ */
public function testIPTCDates() {
$meta = BitmapMetadataHandler::Jpeg( $this->filePath .
'iptc-timetest.jpg' );
@@ -80,6 +84,7 @@ class BitmapMetadataHandlerTest extends MediaWikiTestCase {
/**
* File has an invalid time (+ one valid but really weird time)
* that shouldn't be included
+ * @covers BitmapMetadataHandler::Jpeg
*/
public function testIPTCDatesInvalid() {
$meta = BitmapMetadataHandler::Jpeg( $this->filePath .
@@ -93,6 +98,8 @@ class BitmapMetadataHandlerTest extends MediaWikiTestCase {
* XMP data should take priority over iptc data
* when hash has been updated, but not when
* the hash is wrong.
+ * @covers BitmapMetadataHandler::addMetadata
+ * @covers BitmapMetadataHandler::getMetadataArray
*/
public function testMerging() {
$merger = new BitmapMetadataHandler();
@@ -116,8 +123,11 @@ class BitmapMetadataHandlerTest extends MediaWikiTestCase {
$this->assertEquals( $expected, $actual );
}
+ /**
+ * @covers BitmapMetadataHandler::png
+ */
public function testPNGXMP() {
- if ( !wfDl( 'xml' ) ) {
+ if ( !extension_loaded( 'xml' ) ) {
$this->markTestSkipped( "This test needs the xml extension." );
}
$handler = new BitmapMetadataHandler();
@@ -136,6 +146,9 @@ class BitmapMetadataHandlerTest extends MediaWikiTestCase {
$this->assertEquals( $expected, $result );
}
+ /**
+ * @covers BitmapMetadataHandler::png
+ */
public function testPNGNative() {
$handler = new BitmapMetadataHandler();
$result = $handler->png( $this->filePath . 'Png-native-test.png' );
@@ -143,10 +156,12 @@ class BitmapMetadataHandlerTest extends MediaWikiTestCase {
$this->assertEquals( $expected, $result['metadata']['Identifier']['x-default'] );
}
+ /**
+ * @covers BitmapMetadataHandler::getTiffByteOrder
+ */
public function testTiffByteOrder() {
$handler = new BitmapMetadataHandler();
$res = $handler->getTiffByteOrder( $this->filePath . 'test.tiff' );
$this->assertEquals( 'LE', $res );
}
-
}
diff --git a/tests/phpunit/includes/media/BitmapScalingTest.php b/tests/phpunit/includes/media/BitmapScalingTest.php
index 3de60b73..9395b660 100644
--- a/tests/phpunit/includes/media/BitmapScalingTest.php
+++ b/tests/phpunit/includes/media/BitmapScalingTest.php
@@ -13,8 +13,9 @@ class BitmapScalingTest extends MediaWikiTestCase {
/**
* @dataProvider provideNormaliseParams
+ * @covers BitmapHandler::normaliseParams
*/
- function testNormaliseParams( $fileDimensions, $expectedParams, $params, $msg ) {
+ public function testNormaliseParams( $fileDimensions, $expectedParams, $params, $msg ) {
$file = new FakeDimensionFile( $fileDimensions );
$handler = new BitmapHandler;
$valid = $handler->normaliseParams( $file, $params );
@@ -22,7 +23,7 @@ class BitmapScalingTest extends MediaWikiTestCase {
$this->assertEquals( $expectedParams, $params, $msg );
}
- function provideNormaliseParams() {
+ public static function provideNormaliseParams() {
return array(
/* Regular resize operations */
array(
@@ -102,7 +103,10 @@ class BitmapScalingTest extends MediaWikiTestCase {
);
}
- function testTooBigImage() {
+ /**
+ * @covers BitmapHandler::doTransform
+ */
+ public function testTooBigImage() {
$file = new FakeDimensionFile( array( 4000, 4000 ) );
$handler = new BitmapHandler;
$params = array( 'width' => '3700' ); // Still bigger than max size.
@@ -110,7 +114,10 @@ class BitmapScalingTest extends MediaWikiTestCase {
get_class( $handler->doTransform( $file, 'dummy path', '', $params ) ) );
}
- function testTooBigMustRenderImage() {
+ /**
+ * @covers BitmapHandler::doTransform
+ */
+ public function testTooBigMustRenderImage() {
$file = new FakeDimensionFile( array( 4000, 4000 ) );
$file->mustRender = true;
$handler = new BitmapHandler;
@@ -119,36 +126,12 @@ class BitmapScalingTest extends MediaWikiTestCase {
get_class( $handler->doTransform( $file, 'dummy path', '', $params ) ) );
}
- function testImageArea() {
+ /**
+ * @covers BitmapHandler::getImageArea
+ */
+ public function testImageArea() {
$file = new FakeDimensionFile( array( 7, 9 ) );
$handler = new BitmapHandler;
$this->assertEquals( 63, $handler->getImageArea( $file ) );
}
}
-
-class FakeDimensionFile extends File {
- public $mustRender = false;
-
- public function __construct( $dimensions ) {
- parent::__construct( Title::makeTitle( NS_FILE, 'Test' ),
- new NullRepo( null ) );
-
- $this->dimensions = $dimensions;
- }
-
- public function getWidth( $page = 1 ) {
- return $this->dimensions[0];
- }
-
- public function getHeight( $page = 1 ) {
- return $this->dimensions[1];
- }
-
- public function mustRender() {
- return $this->mustRender;
- }
-
- public function getPath() {
- return '';
- }
-}
diff --git a/tests/phpunit/includes/media/ExifBitmapTest.php b/tests/phpunit/includes/media/ExifBitmapTest.php
index 1109c478..a2e0eb62 100644
--- a/tests/phpunit/includes/media/ExifBitmapTest.php
+++ b/tests/phpunit/includes/media/ExifBitmapTest.php
@@ -2,53 +2,79 @@
class ExifBitmapTest extends MediaWikiTestCase {
+ /**
+ * @var ExifBitmapHandler
+ */
+ protected $handler;
+
protected function setUp() {
parent::setUp();
+ if ( !extension_loaded( 'exif' ) ) {
+ $this->markTestSkipped( "This test needs the exif extension." );
+ }
$this->setMwGlobals( 'wgShowEXIF', true );
$this->handler = new ExifBitmapHandler;
- if ( !wfDl( 'exif' ) ) {
- $this->markTestSkipped( "This test needs the exif extension." );
- }
+
}
+ /**
+ * @covers ExifBitmapHandler::isMetadataValid
+ */
public function testIsOldBroken() {
$res = $this->handler->isMetadataValid( null, ExifBitmapHandler::OLD_BROKEN_FILE );
$this->assertEquals( ExifBitmapHandler::METADATA_COMPATIBLE, $res );
}
+ /**
+ * @covers ExifBitmapHandler::isMetadataValid
+ */
public function testIsBrokenFile() {
$res = $this->handler->isMetadataValid( null, ExifBitmapHandler::BROKEN_FILE );
$this->assertEquals( ExifBitmapHandler::METADATA_GOOD, $res );
}
+ /**
+ * @covers ExifBitmapHandler::isMetadataValid
+ */
public function testIsInvalid() {
$res = $this->handler->isMetadataValid( null, 'Something Invalid Here.' );
$this->assertEquals( ExifBitmapHandler::METADATA_BAD, $res );
}
+ /**
+ * @covers ExifBitmapHandler::isMetadataValid
+ */
public function testGoodMetadata() {
$meta = 'a:16:{s:10:"ImageWidth";i:20;s:11:"ImageLength";i:20;s:13:"BitsPerSample";a:3:{i:0;i:8;i:1;i:8;i:2;i:8;}s:11:"Compression";i:5;s:25:"PhotometricInterpretation";i:2;s:16:"ImageDescription";s:17:"Created with GIMP";s:12:"StripOffsets";i:8;s:11:"Orientation";i:1;s:15:"SamplesPerPixel";i:3;s:12:"RowsPerStrip";i:64;s:15:"StripByteCounts";i:238;s:11:"XResolution";s:19:"1207959552/16777216";s:11:"YResolution";s:19:"1207959552/16777216";s:19:"PlanarConfiguration";i:1;s:14:"ResolutionUnit";i:2;s:22:"MEDIAWIKI_EXIF_VERSION";i:2;}';
$res = $this->handler->isMetadataValid( null, $meta );
$this->assertEquals( ExifBitmapHandler::METADATA_GOOD, $res );
}
+ /**
+ * @covers ExifBitmapHandler::isMetadataValid
+ */
public function testIsOldGood() {
$meta = 'a:16:{s:10:"ImageWidth";i:20;s:11:"ImageLength";i:20;s:13:"BitsPerSample";a:3:{i:0;i:8;i:1;i:8;i:2;i:8;}s:11:"Compression";i:5;s:25:"PhotometricInterpretation";i:2;s:16:"ImageDescription";s:17:"Created with GIMP";s:12:"StripOffsets";i:8;s:11:"Orientation";i:1;s:15:"SamplesPerPixel";i:3;s:12:"RowsPerStrip";i:64;s:15:"StripByteCounts";i:238;s:11:"XResolution";s:19:"1207959552/16777216";s:11:"YResolution";s:19:"1207959552/16777216";s:19:"PlanarConfiguration";i:1;s:14:"ResolutionUnit";i:2;s:22:"MEDIAWIKI_EXIF_VERSION";i:1;}';
$res = $this->handler->isMetadataValid( null, $meta );
$this->assertEquals( ExifBitmapHandler::METADATA_COMPATIBLE, $res );
}
- // Handle metadata from paged tiff handler (gotten via instant commons)
- // gracefully.
+ /**
+ * Handle metadata from paged tiff handler (gotten via instant commons) gracefully.
+ * @covers ExifBitmapHandler::isMetadataValid
+ */
public function testPagedTiffHandledGracefully() {
$meta = 'a:6:{s:9:"page_data";a:1:{i:1;a:5:{s:5:"width";i:643;s:6:"height";i:448;s:5:"alpha";s:4:"true";s:4:"page";i:1;s:6:"pixels";i:288064;}}s:10:"page_count";i:1;s:10:"first_page";i:1;s:9:"last_page";i:1;s:4:"exif";a:9:{s:10:"ImageWidth";i:643;s:11:"ImageLength";i:448;s:11:"Compression";i:5;s:25:"PhotometricInterpretation";i:2;s:11:"Orientation";i:1;s:15:"SamplesPerPixel";i:4;s:12:"RowsPerStrip";i:50;s:19:"PlanarConfiguration";i:1;s:22:"MEDIAWIKI_EXIF_VERSION";i:1;}s:21:"TIFF_METADATA_VERSION";s:3:"1.4";}';
$res = $this->handler->isMetadataValid( null, $meta );
$this->assertEquals( ExifBitmapHandler::METADATA_BAD, $res );
}
- function testConvertMetadataLatest() {
+ /**
+ * @covers ExifBitmapHandler::convertMetadataVersion
+ */
+ public function testConvertMetadataLatest() {
$metadata = array(
'foo' => array( 'First', 'Second', '_type' => 'ol' ),
'MEDIAWIKI_EXIF_VERSION' => 2
@@ -57,7 +83,10 @@ class ExifBitmapTest extends MediaWikiTestCase {
$this->assertEquals( $metadata, $res );
}
- function testConvertMetadataToOld() {
+ /**
+ * @covers ExifBitmapHandler::convertMetadataVersion
+ */
+ public function testConvertMetadataToOld() {
$metadata = array(
'foo' => array( 'First', 'Second', '_type' => 'ol' ),
'bar' => array( 'First', 'Second', '_type' => 'ul' ),
@@ -76,7 +105,10 @@ class ExifBitmapTest extends MediaWikiTestCase {
$this->assertEquals( $expected, $res );
}
- function testConvertMetadataSoftware() {
+ /**
+ * @covers ExifBitmapHandler::convertMetadataVersion
+ */
+ public function testConvertMetadataSoftware() {
$metadata = array(
'Software' => array( array( 'GIMP', '1.1' ) ),
'MEDIAWIKI_EXIF_VERSION' => 2,
@@ -89,7 +121,10 @@ class ExifBitmapTest extends MediaWikiTestCase {
$this->assertEquals( $expected, $res );
}
- function testConvertMetadataSoftwareNormal() {
+ /**
+ * @covers ExifBitmapHandler::convertMetadataVersion
+ */
+ public function testConvertMetadataSoftwareNormal() {
$metadata = array(
'Software' => array( "GIMP 1.2", "vim" ),
'MEDIAWIKI_EXIF_VERSION' => 2,
diff --git a/tests/phpunit/includes/media/ExifRotationTest.php b/tests/phpunit/includes/media/ExifRotationTest.php
index db29d17c..64276d92 100644
--- a/tests/phpunit/includes/media/ExifRotationTest.php
+++ b/tests/phpunit/includes/media/ExifRotationTest.php
@@ -3,11 +3,17 @@
* Tests related to auto rotation.
*
* @group medium
+ *
+ * @todo covers tags
*/
class ExifRotationTest extends MediaWikiTestCase {
protected function setUp() {
parent::setUp();
+ if ( !extension_loaded( 'exif' ) ) {
+ $this->markTestSkipped( "This test needs the exif extension." );
+ }
+
$this->handler = new BitmapHandler();
$filePath = __DIR__ . '/../../data/media';
@@ -22,31 +28,17 @@ class ExifRotationTest extends MediaWikiTestCase {
'containerPaths' => array( 'temp-thumb' => $tmpDir, 'data' => $filePath )
) )
) );
- if ( !wfDl( 'exif' ) ) {
- $this->markTestSkipped( "This test needs the exif extension." );
- }
- global $wgShowEXIF;
- $this->show = $wgShowEXIF;
- $wgShowEXIF = true;
- global $wgEnableAutoRotation;
- $this->oldAuto = $wgEnableAutoRotation;
- $wgEnableAutoRotation = true;
- }
-
- protected function tearDown() {
- global $wgShowEXIF, $wgEnableAutoRotation;
- $wgShowEXIF = $this->show;
- $wgEnableAutoRotation = $this->oldAuto;
-
- parent::tearDown();
+ $this->setMwGlobals( array(
+ 'wgShowEXIF' => true,
+ 'wgEnableAutoRotation' => true,
+ ) );
}
/**
- *
* @dataProvider provideFiles
*/
- function testMetadata( $name, $type, $info ) {
+ public function testMetadata( $name, $type, $info ) {
if ( !BitmapHandler::canRotate() ) {
$this->markTestSkipped( "This test needs a rasterizer that can auto-rotate." );
}
@@ -59,7 +51,7 @@ class ExifRotationTest extends MediaWikiTestCase {
*
* @dataProvider provideFiles
*/
- function testRotationRendering( $name, $type, $info, $thumbs ) {
+ public function testRotationRendering( $name, $type, $info, $thumbs ) {
if ( !BitmapHandler::canRotate() ) {
$this->markTestSkipped( "This test needs a rasterizer that can auto-rotate." );
}
@@ -138,24 +130,20 @@ class ExifRotationTest extends MediaWikiTestCase {
* Same as before, but with auto-rotation disabled.
* @dataProvider provideFilesNoAutoRotate
*/
- function testMetadataNoAutoRotate( $name, $type, $info ) {
- global $wgEnableAutoRotation;
- $wgEnableAutoRotation = false;
+ public function testMetadataNoAutoRotate( $name, $type, $info ) {
+ $this->setMwGlobals( 'wgEnableAutoRotation', false );
$file = $this->dataFile( $name, $type );
$this->assertEquals( $info['width'], $file->getWidth(), "$name: width check" );
$this->assertEquals( $info['height'], $file->getHeight(), "$name: height check" );
-
- $wgEnableAutoRotation = true;
}
/**
*
* @dataProvider provideFilesNoAutoRotate
*/
- function testRotationRenderingNoAutoRotate( $name, $type, $info, $thumbs ) {
- global $wgEnableAutoRotation;
- $wgEnableAutoRotation = false;
+ public function testRotationRenderingNoAutoRotate( $name, $type, $info, $thumbs ) {
+ $this->setMwGlobals( 'wgEnableAutoRotation', false );
foreach ( $thumbs as $size => $out ) {
if ( preg_match( '/^(\d+)px$/', $size, $matches ) ) {
@@ -187,7 +175,6 @@ class ExifRotationTest extends MediaWikiTestCase {
$this->assertEquals( $out[1], $gis[1], "$name: thumb actual height check for $size" );
}
}
- $wgEnableAutoRotation = true;
}
public static function provideFilesNoAutoRotate() {
@@ -230,7 +217,7 @@ class ExifRotationTest extends MediaWikiTestCase {
/**
* @dataProvider provideBitmapExtractPreRotationDimensions
*/
- function testBitmapExtractPreRotationDimensions( $rotation, $expected ) {
+ public function testBitmapExtractPreRotationDimensions( $rotation, $expected ) {
$result = $this->handler->extractPreRotationDimensions( array(
'physicalWidth' => self::TEST_WIDTH,
'physicalHeight' => self::TEST_HEIGHT,
@@ -238,7 +225,7 @@ class ExifRotationTest extends MediaWikiTestCase {
$this->assertEquals( $expected, $result );
}
- function provideBitmapExtractPreRotationDimensions() {
+ public static function provideBitmapExtractPreRotationDimensions() {
return array(
array(
0,
diff --git a/tests/phpunit/includes/media/ExifTest.php b/tests/phpunit/includes/media/ExifTest.php
index e7e95f7e..dea36b03 100644
--- a/tests/phpunit/includes/media/ExifTest.php
+++ b/tests/phpunit/includes/media/ExifTest.php
@@ -1,14 +1,18 @@
<?php
class ExifTest extends MediaWikiTestCase {
+ /** @var string */
+ protected $mediaPath;
+
protected function setUp() {
parent::setUp();
+ if ( !extension_loaded( 'exif' ) ) {
+ $this->markTestSkipped( "This test needs the exif extension." );
+ }
$this->mediaPath = __DIR__ . '/../../data/media/';
- if ( !wfDl( 'exif' ) ) {
- $this->markTestSkipped( "This test needs the exif extension." );
- }
+
$this->setMwGlobals( 'wgShowEXIF', true );
}
@@ -39,6 +43,4 @@ class ExifTest extends MediaWikiTestCase {
);
$this->assertEquals( $expected, $data );
}
-
-
}
diff --git a/tests/phpunit/includes/media/FakeDimensionFile.php b/tests/phpunit/includes/media/FakeDimensionFile.php
new file mode 100644
index 00000000..7926000b
--- /dev/null
+++ b/tests/phpunit/includes/media/FakeDimensionFile.php
@@ -0,0 +1,28 @@
+<?php
+
+class FakeDimensionFile extends File {
+ public $mustRender = false;
+
+ public function __construct( $dimensions ) {
+ parent::__construct( Title::makeTitle( NS_FILE, 'Test' ),
+ new NullRepo( null ) );
+
+ $this->dimensions = $dimensions;
+ }
+
+ public function getWidth( $page = 1 ) {
+ return $this->dimensions[0];
+ }
+
+ public function getHeight( $page = 1 ) {
+ return $this->dimensions[1];
+ }
+
+ public function mustRender() {
+ return $this->mustRender;
+ }
+
+ public function getPath() {
+ return '';
+ }
+} \ No newline at end of file
diff --git a/tests/phpunit/includes/media/FormatMetadataTest.php b/tests/phpunit/includes/media/FormatMetadataTest.php
index f26d27ee..a073e4ca 100644
--- a/tests/phpunit/includes/media/FormatMetadataTest.php
+++ b/tests/phpunit/includes/media/FormatMetadataTest.php
@@ -1,10 +1,19 @@
<?php
+
+/**
+ * @todo covers tags
+ */
class FormatMetadataTest extends MediaWikiTestCase {
+ /** @var FSFileBackend */
+ protected $backend;
+ /** @var FSRepo */
+ protected $repo;
+
protected function setUp() {
parent::setUp();
- if ( !wfDl( 'exif' ) ) {
+ if ( !extension_loaded( 'exif' ) ) {
$this->markTestSkipped( "This test needs the exif extension." );
}
$filePath = __DIR__ . '/../../data/media';
diff --git a/tests/phpunit/includes/media/GIFMetadataExtractorTest.php b/tests/phpunit/includes/media/GIFMetadataExtractorTest.php
index 86cf3465..9e3f9244 100644
--- a/tests/phpunit/includes/media/GIFMetadataExtractorTest.php
+++ b/tests/phpunit/includes/media/GIFMetadataExtractorTest.php
@@ -12,6 +12,7 @@ class GIFMetadataExtractorTest extends MediaWikiTestCase {
* @param $filename String
* @param $expected Array The extracted metadata.
* @dataProvider provideGetMetadata
+ * @covers GIFMetadataExtractor::getMetadata
*/
public function testGetMetadata( $filename, $expected ) {
$actual = GIFMetadataExtractor::getMetadata( $this->mediaPath . $filename );
diff --git a/tests/phpunit/includes/media/GIFTest.php b/tests/phpunit/includes/media/GIFTest.php
index 7ea6b7ef..c8e729c8 100644
--- a/tests/phpunit/includes/media/GIFTest.php
+++ b/tests/phpunit/includes/media/GIFTest.php
@@ -1,6 +1,15 @@
<?php
class GIFHandlerTest extends MediaWikiTestCase {
+ /** @var FSFileBackend */
+ protected $backend;
+ /** @var GIFHandler */
+ protected $handler;
+ /** @var FSRepo */
+ protected $repo;
+ /** @var string */
+ protected $filePath;
+
protected function setUp() {
parent::setUp();
@@ -18,6 +27,9 @@ class GIFHandlerTest extends MediaWikiTestCase {
$this->handler = new GIFHandler();
}
+ /**
+ * @covers GIFHandler::getMetadata
+ */
public function testInvalidFile() {
$res = $this->handler->getMetadata( null, $this->filePath . '/README' );
$this->assertEquals( GIFHandler::BROKEN_FILE, $res );
@@ -27,6 +39,7 @@ class GIFHandlerTest extends MediaWikiTestCase {
* @param $filename String basename of the file to check
* @param $expected boolean Expected result.
* @dataProvider provideIsAnimated
+ * @covers GIFHandler::isAnimatedImage
*/
public function testIsAnimanted( $filename, $expected ) {
$file = $this->dataFile( $filename, 'image/gif' );
@@ -45,6 +58,7 @@ class GIFHandlerTest extends MediaWikiTestCase {
* @param $filename String
* @param $expected Integer Total image area
* @dataProvider provideGetImageArea
+ * @covers GIFHandler::getImageArea
*/
public function testGetImageArea( $filename, $expected ) {
$file = $this->dataFile( $filename, 'image/gif' );
@@ -63,6 +77,7 @@ class GIFHandlerTest extends MediaWikiTestCase {
* @param $metadata String Serialized metadata
* @param $expected Integer One of the class constants of GIFHandler
* @dataProvider provideIsMetadataValid
+ * @covers GIFHandler::isMetadataValid
*/
public function testIsMetadataValid( $metadata, $expected ) {
$actual = $this->handler->isMetadataValid( null, $metadata );
@@ -83,6 +98,7 @@ class GIFHandlerTest extends MediaWikiTestCase {
* @param $filename String
* @param $expected String Serialized array
* @dataProvider provideGetMetadata
+ * @covers GIFHandler::getMetadata
*/
public function testGetMetadata( $filename, $expected ) {
$file = $this->dataFile( $filename, 'image/gif' );
diff --git a/tests/phpunit/includes/media/IPTCTest.php b/tests/phpunit/includes/media/IPTCTest.php
index c9648a79..81c1d287 100644
--- a/tests/phpunit/includes/media/IPTCTest.php
+++ b/tests/phpunit/includes/media/IPTCTest.php
@@ -1,11 +1,19 @@
<?php
+
class IPTCTest extends MediaWikiTestCase {
+
+ /**
+ * @covers IPTC::getCharset
+ */
public function testRecognizeUtf8() {
// utf-8 is the only one used in practise.
$res = IPTC::getCharset( "\x1b%G" );
$this->assertEquals( 'UTF-8', $res );
}
+ /**
+ * @covers IPTC::Parse
+ */
public function testIPTCParseNoCharset88591() {
// basically IPTC for keyword with value of 0xBC which is 1/4 in iso-8859-1
// This data doesn't specify a charset. We're supposed to guess
@@ -15,17 +23,22 @@ class IPTCTest extends MediaWikiTestCase {
$this->assertEquals( array( '¼' ), $res['Keywords'] );
}
- /* This one contains a sequence that's valid iso 8859-1 but not valid utf8 */
- /* \xC3 = Ã, \xB8 = ¸ */
+ /**
+ * @covers IPTC::Parse
+ */
public function testIPTCParseNoCharset88591b() {
+ /* This one contains a sequence that's valid iso 8859-1 but not valid utf8 */
+ /* \xC3 = Ã, \xB8 = ¸ */
$iptcData = "Photoshop 3.0\08BIM\4\4\0\0\0\0\0\x09\x1c\x02\x19\x00\x04\xC3\xC3\xC3\xB8";
$res = IPTC::Parse( $iptcData );
$this->assertEquals( array( 'ÃÃø' ), $res['Keywords'] );
}
- /* Same as testIPTCParseNoCharset88591b, but forcing the charset to utf-8.
+ /**
+ * Same as testIPTCParseNoCharset88591b, but forcing the charset to utf-8.
* What should happen is the first "\xC3\xC3" should be dropped as invalid,
* leaving \xC3\xB8, which is ø
+ * @covers IPTC::Parse
*/
public function testIPTCParseForcedUTFButInvalid() {
$iptcData = "Photoshop 3.0\08BIM\4\4\0\0\0\0\0\x11\x1c\x02\x19\x00\x04\xC3\xC3\xC3\xB8"
@@ -34,13 +47,19 @@ class IPTCTest extends MediaWikiTestCase {
$this->assertEquals( array( 'ø' ), $res['Keywords'] );
}
+ /**
+ * @covers IPTC::Parse
+ */
public function testIPTCParseNoCharsetUTF8() {
$iptcData = "Photoshop 3.0\08BIM\4\4\0\0\0\0\0\x07\x1c\x02\x19\x00\x02¼";
$res = IPTC::Parse( $iptcData );
$this->assertEquals( array( '¼' ), $res['Keywords'] );
}
- // Testing something that has 2 values for keyword
+ /**
+ * Testing something that has 2 values for keyword
+ * @covers IPTC::Parse
+ */
public function testIPTCParseMulti() {
$iptcData = /* identifier */ "Photoshop 3.0\08BIM\4\4"
/* length */ . "\0\0\0\0\0\x0D"
@@ -50,11 +69,13 @@ class IPTCTest extends MediaWikiTestCase {
$this->assertEquals( array( '¼', '¼½' ), $res['Keywords'] );
}
+ /**
+ * @covers IPTC::Parse
+ */
public function testIPTCParseUTF8() {
// This has the magic "\x1c\x01\x5A\x00\x03\x1B\x25\x47" which marks content as UTF8.
$iptcData = "Photoshop 3.0\08BIM\4\4\0\0\0\0\0\x0F\x1c\x02\x19\x00\x02¼\x1c\x01\x5A\x00\x03\x1B\x25\x47";
$res = IPTC::Parse( $iptcData );
$this->assertEquals( array( '¼' ), $res['Keywords'] );
}
-
}
diff --git a/tests/phpunit/includes/media/JpegMetadataExtractorTest.php b/tests/phpunit/includes/media/JpegMetadataExtractorTest.php
index cae7137b..eafc8a2e 100644
--- a/tests/phpunit/includes/media/JpegMetadataExtractorTest.php
+++ b/tests/phpunit/includes/media/JpegMetadataExtractorTest.php
@@ -5,9 +5,12 @@
* serve as a very good "test". (Adobe photoshop probably creates such files
* but it costs money). The implementation of it currently in MediaWiki is based
* solely on reading the standard, without any real world test files.
+ * @todo covers tags
*/
class JpegMetadataExtractorTest extends MediaWikiTestCase {
+ protected $filePath;
+
protected function setUp() {
parent::setUp();
@@ -18,7 +21,7 @@ class JpegMetadataExtractorTest extends MediaWikiTestCase {
* We also use this test to test padding bytes don't
* screw stuff up
*
- * @param $file filename
+ * @param string $file filename
*
* @dataProvider provideUtf8Comment
*/
diff --git a/tests/phpunit/includes/media/JpegTest.php b/tests/phpunit/includes/media/JpegTest.php
index 05d3661e..9af4f1e1 100644
--- a/tests/phpunit/includes/media/JpegTest.php
+++ b/tests/phpunit/includes/media/JpegTest.php
@@ -1,14 +1,18 @@
<?php
+/**
+ * @todo covers tags
+ */
class JpegTest extends MediaWikiTestCase {
protected function setUp() {
parent::setUp();
-
- $this->filePath = __DIR__ . '/../../data/media/';
- if ( !wfDl( 'exif' ) ) {
+ if ( !extension_loaded( 'exif' ) ) {
$this->markTestSkipped( "This test needs the exif extension." );
}
+ $this->filePath = __DIR__ . '/../../data/media/';
+
+
$this->setMwGlobals( 'wgShowEXIF', true );
}
diff --git a/tests/phpunit/includes/media/MediaHandlerTest.php b/tests/phpunit/includes/media/MediaHandlerTest.php
index 4e4c649f..c28898bb 100644
--- a/tests/phpunit/includes/media/MediaHandlerTest.php
+++ b/tests/phpunit/includes/media/MediaHandlerTest.php
@@ -1,7 +1,12 @@
<?php
class MediaHandlerTest extends MediaWikiTestCase {
- function testFitBoxWidth() {
+
+ /**
+ * @covers MediaHandler::fitBoxWidth
+ * @todo split into a dataprovider and test method
+ */
+ public function testFitBoxWidth() {
$vals = array(
array(
'width' => 50,
diff --git a/tests/phpunit/includes/media/PNGMetadataExtractorTest.php b/tests/phpunit/includes/media/PNGMetadataExtractorTest.php
index 1e912017..939f2cfc 100644
--- a/tests/phpunit/includes/media/PNGMetadataExtractorTest.php
+++ b/tests/phpunit/includes/media/PNGMetadataExtractorTest.php
@@ -1,4 +1,8 @@
<?php
+
+/**
+ * @todo covers tags
+ */
class PNGMetadataExtractorTest extends MediaWikiTestCase {
protected function setUp() {
@@ -9,7 +13,7 @@ class PNGMetadataExtractorTest extends MediaWikiTestCase {
/**
* Tests zTXt tag (compressed textual metadata)
*/
- function testPngNativetZtxt() {
+ public function testPngNativetZtxt() {
$this->checkPHPExtension( 'zlib' );
$meta = PNGMetadataExtractor::getMetadata( $this->filePath .
@@ -26,7 +30,7 @@ class PNGMetadataExtractorTest extends MediaWikiTestCase {
/**
* Test tEXt tag (Uncompressed textual metadata)
*/
- function testPngNativeText() {
+ public function testPngNativeText() {
$meta = PNGMetadataExtractor::getMetadata( $this->filePath .
'Png-native-test.png' );
$expected = "Some long image desc";
@@ -43,7 +47,7 @@ class PNGMetadataExtractorTest extends MediaWikiTestCase {
* tEXt tags must be encoded iso-8859-1 (vs iTXt which are utf-8)
* Make sure non-ascii characters get converted properly
*/
- function testPngNativeTextNonAscii() {
+ public function testPngNativeTextNonAscii() {
$meta = PNGMetadataExtractor::getMetadata( $this->filePath .
'Png-native-test.png' );
@@ -52,7 +56,6 @@ class PNGMetadataExtractorTest extends MediaWikiTestCase {
// encoded as just \xA9.
$expected = "© 2010 Bawolff";
-
$this->assertArrayHasKey( 'text', $meta );
$meta = $meta['text'];
$this->assertArrayHasKey( 'Copyright', $meta );
@@ -66,7 +69,7 @@ class PNGMetadataExtractorTest extends MediaWikiTestCase {
* actual resolution of the image is (aka in dots per meter).
*/
/*
- function testPngPhysTag () {
+ public function testPngPhysTag() {
$meta = PNGMetadataExtractor::getMetadata( $this->filePath .
'Png-native-test.png' );
@@ -82,7 +85,7 @@ class PNGMetadataExtractorTest extends MediaWikiTestCase {
/**
* Given a normal static PNG, check the animation metadata returned.
*/
- function testStaticPngAnimationMetadata() {
+ public function testStaticPngAnimationMetadata() {
$meta = PNGMetadataExtractor::getMetadata( $this->filePath .
'Png-native-test.png' );
@@ -95,7 +98,7 @@ class PNGMetadataExtractorTest extends MediaWikiTestCase {
* Given an animated APNG image file
* check it gets animated metadata right.
*/
- function testApngAnimationMetadata() {
+ public function testApngAnimationMetadata() {
$meta = PNGMetadataExtractor::getMetadata( $this->filePath .
'Animated_PNG_example_bouncing_beach_ball.png' );
@@ -105,49 +108,48 @@ class PNGMetadataExtractorTest extends MediaWikiTestCase {
$this->assertEquals( 1.5, $meta['duration'], '', 0.00001 );
}
- function testPngBitDepth8() {
+ public function testPngBitDepth8() {
$meta = PNGMetadataExtractor::getMetadata( $this->filePath .
'Png-native-test.png' );
$this->assertEquals( 8, $meta['bitDepth'] );
}
- function testPngBitDepth1() {
+ public function testPngBitDepth1() {
$meta = PNGMetadataExtractor::getMetadata( $this->filePath .
'1bit-png.png' );
$this->assertEquals( 1, $meta['bitDepth'] );
}
- function testPngIndexColour() {
+ public function testPngIndexColour() {
$meta = PNGMetadataExtractor::getMetadata( $this->filePath .
'Png-native-test.png' );
$this->assertEquals( 'index-coloured', $meta['colorType'] );
}
- function testPngRgbColour() {
+ public function testPngRgbColour() {
$meta = PNGMetadataExtractor::getMetadata( $this->filePath .
'rgb-png.png' );
$this->assertEquals( 'truecolour-alpha', $meta['colorType'] );
}
- function testPngRgbNoAlphaColour() {
+ public function testPngRgbNoAlphaColour() {
$meta = PNGMetadataExtractor::getMetadata( $this->filePath .
'rgb-na-png.png' );
$this->assertEquals( 'truecolour', $meta['colorType'] );
}
- function testPngGreyscaleColour() {
+ public function testPngGreyscaleColour() {
$meta = PNGMetadataExtractor::getMetadata( $this->filePath .
'greyscale-png.png' );
$this->assertEquals( 'greyscale-alpha', $meta['colorType'] );
}
- function testPngGreyscaleNoAlphaColour() {
+ public function testPngGreyscaleNoAlphaColour() {
$meta = PNGMetadataExtractor::getMetadata( $this->filePath .
'greyscale-na-png.png' );
$this->assertEquals( 'greyscale', $meta['colorType'] );
}
-
}
diff --git a/tests/phpunit/includes/media/PNGTest.php b/tests/phpunit/includes/media/PNGTest.php
index 855780da..ad4c2493 100644
--- a/tests/phpunit/includes/media/PNGTest.php
+++ b/tests/phpunit/includes/media/PNGTest.php
@@ -1,6 +1,15 @@
<?php
class PNGHandlerTest extends MediaWikiTestCase {
+ /** @var PNGHandler */
+ protected $handler;
+ /** @var FSRepo */
+ protected $repo;
+ /** @var FSFileBackend */
+ protected $backend;
+ /** @var string */
+ protected $filePath;
+
protected function setUp() {
parent::setUp();
@@ -18,6 +27,9 @@ class PNGHandlerTest extends MediaWikiTestCase {
$this->handler = new PNGHandler();
}
+ /**
+ * @covers PNGHandler::getMetadata
+ */
public function testInvalidFile() {
$res = $this->handler->getMetadata( null, $this->filePath . '/README' );
$this->assertEquals( PNGHandler::BROKEN_FILE, $res );
@@ -27,6 +39,7 @@ class PNGHandlerTest extends MediaWikiTestCase {
* @param $filename String basename of the file to check
* @param $expected boolean Expected result.
* @dataProvider provideIsAnimated
+ * @covers PNGHandler::isAnimatedImage
*/
public function testIsAnimanted( $filename, $expected ) {
$file = $this->dataFile( $filename, 'image/png' );
@@ -45,6 +58,7 @@ class PNGHandlerTest extends MediaWikiTestCase {
* @param $filename String
* @param $expected Integer Total image area
* @dataProvider provideGetImageArea
+ * @covers PNGHandler::getImageArea
*/
public function testGetImageArea( $filename, $expected ) {
$file = $this->dataFile( $filename, 'image/png' );
@@ -65,6 +79,7 @@ class PNGHandlerTest extends MediaWikiTestCase {
* @param $metadata String Serialized metadata
* @param $expected Integer One of the class constants of PNGHandler
* @dataProvider provideIsMetadataValid
+ * @covers PNGHandler::isMetadataValid
*/
public function testIsMetadataValid( $metadata, $expected ) {
$actual = $this->handler->isMetadataValid( null, $metadata );
@@ -85,6 +100,7 @@ class PNGHandlerTest extends MediaWikiTestCase {
* @param $filename String
* @param $expected String Serialized array
* @dataProvider provideGetMetadata
+ * @covers PNGHandler::getMetadata
*/
public function testGetMetadata( $filename, $expected ) {
$file = $this->dataFile( $filename, 'image/png' );
diff --git a/tests/phpunit/includes/media/SVGMetadataExtractorTest.php b/tests/phpunit/includes/media/SVGMetadataExtractorTest.php
index 97a0000d..257009b0 100644
--- a/tests/phpunit/includes/media/SVGMetadataExtractorTest.php
+++ b/tests/phpunit/includes/media/SVGMetadataExtractorTest.php
@@ -1,5 +1,8 @@
<?php
+/**
+ * @todo covers tags
+ */
class SVGMetadataExtractorTest extends MediaWikiTestCase {
protected function setUp() {
@@ -10,17 +13,18 @@ class SVGMetadataExtractorTest extends MediaWikiTestCase {
/**
* @dataProvider provideSvgFiles
*/
- function testGetMetadata( $infile, $expected ) {
+ public function testGetMetadata( $infile, $expected ) {
$this->assertMetadata( $infile, $expected );
}
/**
* @dataProvider provideSvgFilesWithXMLMetadata
*/
- function testGetXMLMetadata( $infile, $expected ) {
+ public function testGetXMLMetadata( $infile, $expected ) {
$r = new XMLReader();
if ( !method_exists( $r, 'readInnerXML' ) ) {
$this->markTestSkipped( 'XMLReader::readInnerXML() does not exist (libxml >2.6.20 needed).' );
+
return;
}
$this->assertMetadata( $infile, $expected );
@@ -41,6 +45,7 @@ class SVGMetadataExtractorTest extends MediaWikiTestCase {
public static function provideSvgFiles() {
$base = __DIR__ . '/../../data/media';
+
return array(
array(
"$base/Wikimedia-logo.svg",
diff --git a/tests/phpunit/includes/media/TiffTest.php b/tests/phpunit/includes/media/TiffTest.php
index 91c35c4b..8d74b98d 100644
--- a/tests/phpunit/includes/media/TiffTest.php
+++ b/tests/phpunit/includes/media/TiffTest.php
@@ -1,8 +1,16 @@
<?php
class TiffTest extends MediaWikiTestCase {
+ /** @var TiffHandler */
+ protected $handler;
+ /** @var string */
+ protected $filePath;
+
protected function setUp() {
parent::setUp();
+ if ( !extension_loaded( 'exif' ) ) {
+ $this->markTestSkipped( "This test needs the exif extension." );
+ }
$this->setMwGlobals( 'wgShowEXIF', true );
@@ -10,18 +18,18 @@ class TiffTest extends MediaWikiTestCase {
$this->handler = new TiffHandler;
}
+ /**
+ * @covers TiffHandler::getMetadata
+ */
public function testInvalidFile() {
- if ( !wfDl( 'exif' ) ) {
- $this->markTestIncomplete( "This test needs the exif extension." );
- }
$res = $this->handler->getMetadata( null, $this->filePath . 'README' );
$this->assertEquals( ExifBitmapHandler::BROKEN_FILE, $res );
}
+ /**
+ * @covers TiffHandler::getMetadata
+ */
public function testTiffMetadataExtraction() {
- if ( !wfDl( 'exif' ) ) {
- $this->markTestIncomplete( "This test needs the exif extension." );
- }
$res = $this->handler->getMetadata( null, $this->filePath . 'test.tiff' );
$expected = 'a:16:{s:10:"ImageWidth";i:20;s:11:"ImageLength";i:20;s:13:"BitsPerSample";a:3:{i:0;i:8;i:1;i:8;i:2;i:8;}s:11:"Compression";i:5;s:25:"PhotometricInterpretation";i:2;s:16:"ImageDescription";s:17:"Created with GIMP";s:12:"StripOffsets";i:8;s:11:"Orientation";i:1;s:15:"SamplesPerPixel";i:3;s:12:"RowsPerStrip";i:64;s:15:"StripByteCounts";i:238;s:11:"XResolution";s:19:"1207959552/16777216";s:11:"YResolution";s:19:"1207959552/16777216";s:19:"PlanarConfiguration";i:1;s:14:"ResolutionUnit";i:2;s:22:"MEDIAWIKI_EXIF_VERSION";i:2;}';
// Re-unserialize in case there are subtle differences between how versions
diff --git a/tests/phpunit/includes/media/XMPTest.php b/tests/phpunit/includes/media/XMPTest.php
index 86c722b1..d12e9b00 100644
--- a/tests/phpunit/includes/media/XMPTest.php
+++ b/tests/phpunit/includes/media/XMPTest.php
@@ -1,9 +1,13 @@
<?php
+
+/**
+ * @todo covers tags
+ */
class XMPTest extends MediaWikiTestCase {
protected function setUp() {
parent::setUp();
- if ( !wfDl( 'xml' ) ) {
+ if ( !extension_loaded( 'xml' ) ) {
$this->markTestSkipped( 'Requires libxml to do XMP parsing' );
}
}
@@ -15,6 +19,7 @@ class XMPTest extends MediaWikiTestCase {
* @param $expected Array expected result of parsing the xmp.
* @param $info String Short sentence on what's being tested.
*
+ * @throws Exception
* @dataProvider provideXMPParse
*/
public function testXMPParse( $xmp, $expected, $info ) {
@@ -62,9 +67,10 @@ class XMPTest extends MediaWikiTestCase {
// result array, but it seems kind of big to put directly in the test
// file.
$result = null;
- include( $xmpPath . $file[0] . '.result.php' );
+ include $xmpPath . $file[0] . '.result.php';
$data[] = array( $xmp, $result, '[' . $file[0] . '.xmp] ' . $file[1] );
}
+
return $data;
}
@@ -74,7 +80,7 @@ class XMPTest extends MediaWikiTestCase {
* @todo This is based on what the standard says. Need to find a real
* world example file to double check the support for this is right.
*/
- function testExtendedXMP() {
+ public function testExtendedXMP() {
$xmpPath = __DIR__ . '/../../data/xmp/';
$standardXMP = file_get_contents( $xmpPath . 'xmpExt.xmp' );
$extendedXMP = file_get_contents( $xmpPath . 'xmpExt2.xmp' );
@@ -104,7 +110,7 @@ class XMPTest extends MediaWikiTestCase {
* This test has an extended XMP block with a wrong guid (md5sum)
* and thus should only return the StandardXMP, not the ExtendedXMP.
*/
- function testExtendedXMPWithWrongGUID() {
+ public function testExtendedXMPWithWrongGUID() {
$xmpPath = __DIR__ . '/../../data/xmp/';
$standardXMP = file_get_contents( $xmpPath . 'xmpExt.xmp' );
$extendedXMP = file_get_contents( $xmpPath . 'xmpExt2.xmp' );
@@ -133,7 +139,7 @@ class XMPTest extends MediaWikiTestCase {
* Have a high offset to simulate a missing packet,
* which should cause it to ignore the ExtendedXMP packet.
*/
- function testExtendedXMPMissingPacket() {
+ public function testExtendedXMPMissingPacket() {
$xmpPath = __DIR__ . '/../../data/xmp/';
$standardXMP = file_get_contents( $xmpPath . 'xmpExt.xmp' );
$extendedXMP = file_get_contents( $xmpPath . 'xmpExt2.xmp' );
@@ -157,5 +163,4 @@ class XMPTest extends MediaWikiTestCase {
$this->assertEquals( $expected, $actual );
}
-
}
diff --git a/tests/phpunit/includes/media/XMPValidateTest.php b/tests/phpunit/includes/media/XMPValidateTest.php
index a2b4e1c2..96bf5e47 100644
--- a/tests/phpunit/includes/media/XMPValidateTest.php
+++ b/tests/phpunit/includes/media/XMPValidateTest.php
@@ -3,8 +3,9 @@ class XMPValidateTest extends MediaWikiTestCase {
/**
* @dataProvider provideDates
+ * @covers XMPValidate::validateDate
*/
- function testValidateDate( $value, $expected ) {
+ public function testValidateDate( $value, $expected ) {
// The method should modify $value.
XMPValidate::validateDate( array(), $value, true );
$this->assertEquals( $expected, $value );
@@ -41,7 +42,5 @@ class XMPValidateTest extends MediaWikiTestCase {
array( '2001-05-12T15', null ),
array( '2001-12T15:13', null ),
);
-
}
-
}
diff --git a/tests/phpunit/includes/normal/CleanUpTest.php b/tests/phpunit/includes/normal/CleanUpTest.php
index 99ec05dd..52dd2ef5 100644
--- a/tests/phpunit/includes/normal/CleanUpTest.php
+++ b/tests/phpunit/includes/normal/CleanUpTest.php
@@ -30,16 +30,20 @@
*
* @ingroup UtfNormal
* @group Large
+ *
+ * We ignore code coverage for this test suite until they are rewritten
+ * to use data providers (bug 46561).
+ * @codeCoverageIgnore
*/
class CleanUpTest extends MediaWikiTestCase {
/** @todo document */
- function testAscii() {
+ public function testAscii() {
$text = 'This is plain ASCII text.';
$this->assertEquals( $text, UtfNormal::cleanUp( $text ) );
}
/** @todo document */
- function testNull() {
+ public function testNull() {
$text = "a \x00 null";
$expect = "a \xef\xbf\xbd null";
$this->assertEquals(
@@ -48,13 +52,13 @@ class CleanUpTest extends MediaWikiTestCase {
}
/** @todo document */
- function testLatin() {
+ public function testLatin() {
$text = "L'\xc3\xa9cole";
$this->assertEquals( $text, UtfNormal::cleanUp( $text ) );
}
/** @todo document */
- function testLatinNormal() {
+ public function testLatinNormal() {
$text = "L'e\xcc\x81cole";
$expect = "L'\xc3\xa9cole";
$this->assertEquals( $expect, UtfNormal::cleanUp( $text ) );
@@ -101,7 +105,7 @@ class CleanUpTest extends MediaWikiTestCase {
}
/** @todo document */
- function testAllBytes() {
+ public function testAllBytes() {
$this->doTestBytes( '', '' );
$this->doTestBytes( 'x', '' );
$this->doTestBytes( '', 'x' );
@@ -141,7 +145,7 @@ class CleanUpTest extends MediaWikiTestCase {
}
/** @todo document */
- function testDoubleBytes() {
+ public function testDoubleBytes() {
$this->doTestDoubleBytes( '', '' );
$this->doTestDoubleBytes( 'x', '' );
$this->doTestDoubleBytes( '', 'x' );
@@ -194,7 +198,7 @@ class CleanUpTest extends MediaWikiTestCase {
}
/** @todo document */
- function testTripleBytes() {
+ public function testTripleBytes() {
$this->doTestTripleBytes( '', '' );
$this->doTestTripleBytes( 'x', '' );
$this->doTestTripleBytes( '', 'x' );
@@ -272,7 +276,7 @@ class CleanUpTest extends MediaWikiTestCase {
}
/** @todo document */
- function testChunkRegression() {
+ public function testChunkRegression() {
# Check for regression against a chunking bug
$text = "\x46\x55\xb8" .
"\xdc\x96" .
@@ -295,7 +299,7 @@ class CleanUpTest extends MediaWikiTestCase {
}
/** @todo document */
- function testInterposeRegression() {
+ public function testInterposeRegression() {
$text = "\x4e\x30" .
"\xb1" . # bad tail
"\x3a" .
@@ -330,7 +334,7 @@ class CleanUpTest extends MediaWikiTestCase {
}
/** @todo document */
- function testOverlongRegression() {
+ public function testOverlongRegression() {
$text = "\x67" .
"\x1a" . # forbidden ascii
"\xea" . # bad head
@@ -355,7 +359,7 @@ class CleanUpTest extends MediaWikiTestCase {
}
/** @todo document */
- function testSurrogateRegression() {
+ public function testSurrogateRegression() {
$text = "\xed\xb4\x96" . # surrogate 0xDD16
"\x83" . # bad tail
"\xb4" . # bad tail
@@ -370,7 +374,7 @@ class CleanUpTest extends MediaWikiTestCase {
}
/** @todo document */
- function testBomRegression() {
+ public function testBomRegression() {
$text = "\xef\xbf\xbe" . # U+FFFE, illegal char
"\xb2" . # bad tail
"\xef" . # bad head
@@ -385,7 +389,7 @@ class CleanUpTest extends MediaWikiTestCase {
}
/** @todo document */
- function testForbiddenRegression() {
+ public function testForbiddenRegression() {
$text = "\xef\xbf\xbf"; # U+FFFF, illegal char
$expect = "\xef\xbf\xbd";
$this->assertEquals(
@@ -394,7 +398,7 @@ class CleanUpTest extends MediaWikiTestCase {
}
/** @todo document */
- function testHangulRegression() {
+ public function testHangulRegression() {
$text = "\xed\x9c\xaf" . # Hangul char
"\xe1\x87\x81"; # followed by another final jamo
$expect = $text; # Should *not* change.
diff --git a/tests/phpunit/includes/objectcache/BagOStuffTest.php b/tests/phpunit/includes/objectcache/BagOStuffTest.php
index 88b07f0a..aa783943 100644
--- a/tests/phpunit/includes/objectcache/BagOStuffTest.php
+++ b/tests/phpunit/includes/objectcache/BagOStuffTest.php
@@ -15,7 +15,6 @@ class BagOStuffTest extends MediaWikiTestCase {
$name = $this->getCliArg( 'use-bagostuff=' );
$this->cache = ObjectCache::newFromId( $name );
-
} else {
// no type defined - use simple hash
$this->cache = new HashBagOStuff;
@@ -119,6 +118,18 @@ class BagOStuffTest extends MediaWikiTestCase {
$this->assertEquals( $this->cache->get( $key ), $value );
}
+ /**
+ * @covers BagOStuff::incr
+ */
+ public function testIncr() {
+ $key = wfMemcKey( 'test' );
+ $this->cache->add( $key, 0 );
+ $this->cache->incr( $key );
+ $expectedValue = 1;
+ $actualValue = $this->cache->get( $key );
+ $this->assertEquals( $expectedValue, $actualValue, 'Value should be 1 after incrementing' );
+ }
+
public function testGetMulti() {
$value1 = array( 'this' => 'is', 'a' => 'test' );
$value2 = array( 'this' => 'is', 'another' => 'test' );
diff --git a/tests/phpunit/includes/parser/MagicVariableTest.php b/tests/phpunit/includes/parser/MagicVariableTest.php
index dfcdafde..c2c97c01 100644
--- a/tests/phpunit/includes/parser/MagicVariableTest.php
+++ b/tests/phpunit/includes/parser/MagicVariableTest.php
@@ -9,11 +9,13 @@
* @author Antoine Musso
* @copyright Copyright © 2011, Antoine Musso
* @file
+ * @todo covers tags
*/
-/** */
class MagicVariableTest extends MediaWikiTestCase {
- /** Will contains a parser object*/
+ /**
+ * @var Parser
+ */
private $testParser = null;
/**
@@ -51,11 +53,31 @@ class MagicVariableTest extends MediaWikiTestCase {
$this->testParser->setTitle( $title );
}
- /** destroy parser (TODO: is it really neded?)*/
- protected function tearDown() {
- unset( $this->testParser );
+ /**
+ * @param int $num upper limit for numbers
+ * @return array of numbers from 1 up to $num
+ */
+ private static function createProviderUpTo( $num ) {
+ $ret = array();
+ for ( $i = 1; $i <= $num; $i++ ) {
+ $ret[] = array( $i );
+ }
+
+ return $ret;
+ }
+
+ /**
+ * @return array of months numbers (as an integer)
+ */
+ public static function provideMonths() {
+ return self::createProviderUpTo( 12 );
+ }
- parent::tearDown();
+ /**
+ * @return array of days numbers (as an integer)
+ */
+ public static function provideDays() {
+ return self::createProviderUpTo( 31 );
}
############### TESTS #############################################
@@ -65,100 +87,101 @@ class MagicVariableTest extends MediaWikiTestCase {
# day
- /** @dataProvider MediaWikiProvide::Days */
- function testCurrentdayIsUnPadded( $day ) {
+ /** @dataProvider provideDays */
+ public function testCurrentdayIsUnPadded( $day ) {
$this->assertUnPadded( 'currentday', $day );
}
- /** @dataProvider MediaWikiProvide::Days */
- function testCurrentdaytwoIsZeroPadded( $day ) {
+ /** @dataProvider provideDays */
+ public function testCurrentdaytwoIsZeroPadded( $day ) {
$this->assertZeroPadded( 'currentday2', $day );
}
- /** @dataProvider MediaWikiProvide::Days */
- function testLocaldayIsUnPadded( $day ) {
+ /** @dataProvider provideDays */
+ public function testLocaldayIsUnPadded( $day ) {
$this->assertUnPadded( 'localday', $day );
}
- /** @dataProvider MediaWikiProvide::Days */
- function testLocaldaytwoIsZeroPadded( $day ) {
+ /** @dataProvider provideDays */
+ public function testLocaldaytwoIsZeroPadded( $day ) {
$this->assertZeroPadded( 'localday2', $day );
}
# month
- /** @dataProvider MediaWikiProvide::Months */
- function testCurrentmonthIsZeroPadded( $month ) {
+ /** @dataProvider provideMonths */
+ public function testCurrentmonthIsZeroPadded( $month ) {
$this->assertZeroPadded( 'currentmonth', $month );
}
- /** @dataProvider MediaWikiProvide::Months */
- function testCurrentmonthoneIsUnPadded( $month ) {
+ /** @dataProvider provideMonths */
+ public function testCurrentmonthoneIsUnPadded( $month ) {
$this->assertUnPadded( 'currentmonth1', $month );
}
- /** @dataProvider MediaWikiProvide::Months */
- function testLocalmonthIsZeroPadded( $month ) {
+ /** @dataProvider provideMonths */
+ public function testLocalmonthIsZeroPadded( $month ) {
$this->assertZeroPadded( 'localmonth', $month );
}
- /** @dataProvider MediaWikiProvide::Months */
- function testLocalmonthoneIsUnPadded( $month ) {
+ /** @dataProvider provideMonths */
+ public function testLocalmonthoneIsUnPadded( $month ) {
$this->assertUnPadded( 'localmonth1', $month );
}
-
# revision day
- /** @dataProvider MediaWikiProvide::Days */
- function testRevisiondayIsUnPadded( $day ) {
+ /** @dataProvider provideDays */
+ public function testRevisiondayIsUnPadded( $day ) {
$this->assertUnPadded( 'revisionday', $day );
}
- /** @dataProvider MediaWikiProvide::Days */
- function testRevisiondaytwoIsZeroPadded( $day ) {
+ /** @dataProvider provideDays */
+ public function testRevisiondaytwoIsZeroPadded( $day ) {
$this->assertZeroPadded( 'revisionday2', $day );
}
# revision month
- /** @dataProvider MediaWikiProvide::Months */
- function testRevisionmonthIsZeroPadded( $month ) {
+ /** @dataProvider provideMonths */
+ public function testRevisionmonthIsZeroPadded( $month ) {
$this->assertZeroPadded( 'revisionmonth', $month );
}
- /** @dataProvider MediaWikiProvide::Months */
- function testRevisionmonthoneIsUnPadded( $month ) {
+ /** @dataProvider provideMonths */
+ public function testRevisionmonthoneIsUnPadded( $month ) {
$this->assertUnPadded( 'revisionmonth1', $month );
}
/**
* Rough tests for {{SERVERNAME}} magic word
* Bug 31176
+ * @group Database
+ * @dataProvider provideDataServernameFromDifferentProtocols
*/
- function testServernameFromDifferentProtocols() {
- global $wgServer;
- $saved_wgServer = $wgServer;
+ public function testServernameFromDifferentProtocols( $server ) {
+ $this->setMwGlobals( 'wgServer', $server );
- $wgServer = 'http://localhost/';
- $this->assertMagic( 'localhost', 'servername' );
- $wgServer = 'https://localhost/';
- $this->assertMagic( 'localhost', 'servername' );
- $wgServer = '//localhost/'; # bug 31176
$this->assertMagic( 'localhost', 'servername' );
+ }
- $wgServer = $saved_wgServer;
+ public static function provideDataServernameFromDifferentProtocols() {
+ return array(
+ array( 'http://localhost/' ),
+ array( 'https://localhost/' ),
+ array( '//localhost/' ), # bug 31176
+ );
}
############### HELPERS ############################################
/** assertion helper expecting a magic output which is zero padded */
- PUBLIC function assertZeroPadded( $magic, $value ) {
+ public function assertZeroPadded( $magic, $value ) {
$this->assertMagicPadding( $magic, $value, '%02d' );
}
/** assertion helper expecting a magic output which is unpadded */
- PUBLIC function assertUnPadded( $magic, $value ) {
+ public function assertUnPadded( $magic, $value ) {
$this->assertMagicPadding( $magic, $value, '%d' );
}
diff --git a/tests/phpunit/includes/parser/MediaWikiParserTest.php b/tests/phpunit/includes/parser/MediaWikiParserTest.php
index 067a7c4e..c120ca34 100644
--- a/tests/phpunit/includes/parser/MediaWikiParserTest.php
+++ b/tests/phpunit/includes/parser/MediaWikiParserTest.php
@@ -1,5 +1,5 @@
<?php
-require_once( __DIR__ . '/NewParserTest.php' );
+require_once __DIR__ . '/NewParserTest.php';
/**
* The UnitTest must be either a class that inherits from MediaWikiTestCase
@@ -11,24 +11,110 @@ require_once( __DIR__ . '/NewParserTest.php' );
*/
class MediaWikiParserTest {
- public static function suite() {
- global $wgParserTestFiles;
+ /**
+ * @defgroup filtering_constants Filtering constants
+ *
+ * Limit inclusion of parser tests files coming from MediaWiki core
+ * @{
+ */
- $suite = new PHPUnit_Framework_TestSuite;
+ /** Include files shipped with MediaWiki core */
+ const CORE_ONLY = 1;
+ /** Include non core files as set in $wgParserTestFiles */
+ const NO_CORE = 2;
+ /** Include anything set via $wgParserTestFiles */
+ const WITH_ALL = 3; # CORE_ONLY | NO_CORE
+
+ /** @} */
+
+ /**
+ * Get a PHPUnit test suite of parser tests. Optionally filtered with
+ * $flags.
+ *
+ * @par Examples:
+ * Get a suite of parser tests shipped by MediaWiki core:
+ * @code
+ * MediaWikiParserTest::suite( MediaWikiParserTest::CORE_ONLY );
+ * @endcode
+ * Get a suite of various parser tests, like extensions:
+ * @code
+ * MediaWikiParserTest::suite( MediaWikiParserTest::NO_CORE );
+ * @endcode
+ * Get any test defined via $wgParserTestFiles:
+ * @code
+ * MediaWikiParserTest::suite( MediaWikiParserTest::WITH_ALL );
+ * @endcode
+ *
+ * @param $flags bitwise flag to filter out the $wgParserTestFiles that
+ * will be included. Default: MediaWikiParserTest::CORE_ONLY
+ *
+ * @return PHPUnit_Framework_TestSuite
+ */
+ public static function suite( $flags = self::CORE_ONLY ) {
+ if ( is_string( $flags ) ) {
+ $flags = self::CORE_ONLY;
+ }
+ global $wgParserTestFiles, $IP;
+
+ $mwTestDir = $IP . '/tests/';
+
+ # Human friendly helpers
+ $wantsCore = ( $flags & self::CORE_ONLY );
+ $wantsRest = ( $flags & self::NO_CORE );
+
+ # Will hold the .txt parser test files we will include
+ $filesToTest = array();
+
+ # Filter out .txt files
+ foreach ( $wgParserTestFiles as $parserTestFile ) {
+ $isCore = ( 0 === strpos( $parserTestFile, $mwTestDir ) );
+
+ if ( $isCore && $wantsCore ) {
+ self::debug( "included core parser tests: $parserTestFile" );
+ $filesToTest[] = $parserTestFile;
+ } elseif ( !$isCore && $wantsRest ) {
+ self::debug( "included non core parser tests: $parserTestFile" );
+ $filesToTest[] = $parserTestFile;
+ } else {
+ self::debug( "skipped parser tests: $parserTestFile" );
+ }
+ }
+ self::debug( 'parser tests files: '
+ . implode( ' ', $filesToTest ) );
- foreach ( $wgParserTestFiles as $filename ) {
- $testsName = basename( $filename, '.txt' );
+ $suite = new PHPUnit_Framework_TestSuite;
+ foreach ( $filesToTest as $fileName ) {
+ $testsName = basename( $fileName, '.txt' );
+ $escapedFileName = strtr( $fileName, array( "'" => "\\'", '\\' => '\\\\' ) );
/* This used to be ucfirst( basename( dirname( $filename ) ) )
* and then was ucfirst( basename( $filename, '.txt' )
* but that didn't work with names like foo.tests.txt
*/
- $className = str_replace( '.', '_', ucfirst( $testsName ) );
-
- eval( "/** @group Database\n@group Parser\n*/ class $className extends NewParserTest { protected \$file = '" . strtr( $filename, array( "'" => "\\'", '\\' => '\\\\' ) ) . "'; } " );
+ $parserTestClassName = str_replace( '.', '_', ucfirst( $testsName ) );
+ $parserTestClassDefinition = <<<EOT
+/**
+ * @group Database
+ * @group Parser
+ * @group ParserTests
+ * @group ParserTests_$parserTestClassName
+ */
+class $parserTestClassName extends NewParserTest {
+ protected \$file = '$escapedFileName';
+}
+EOT;
- $parserTester = new $className( $testsName );
- $suite->addTestSuite( new ReflectionClass ( $parserTester ) );
+ eval( $parserTestClassDefinition );
+ self::debug( "Adding test class $parserTestClassName" );
+ $suite->addTestSuite( $parserTestClassName );
}
return $suite;
}
+
+ /**
+ * Write $msg under log group 'tests-parser'
+ * @param string $msg Message to log
+ */
+ protected static function debug( $msg ) {
+ return wfDebugLog( 'tests-parser', wfGetCaller() . ' ' . $msg );
+ }
}
diff --git a/tests/phpunit/includes/parser/NewParserTest.php b/tests/phpunit/includes/parser/NewParserTest.php
index bf6931a1..eac4de5c 100644
--- a/tests/phpunit/includes/parser/NewParserTest.php
+++ b/tests/phpunit/includes/parser/NewParserTest.php
@@ -6,6 +6,8 @@
* @group Database
* @group Parser
* @group Stub
+ *
+ * @todo covers tags
*/
class NewParserTest extends MediaWikiTestCase {
static protected $articles = array(); // Array of test articles defined by the tests
@@ -19,7 +21,6 @@ class NewParserTest extends MediaWikiTestCase {
public $runParsoid = false;
public $regex = '';
public $showProgress = true;
- public $savedInitialGlobals = array();
public $savedWeirdGlobals = array();
public $savedGlobals = array();
public $hooks = array();
@@ -32,8 +33,13 @@ class NewParserTest extends MediaWikiTestCase {
protected $file = false;
+ public static function setUpBeforeClass() {
+ // Inject ParserTest well-known interwikis
+ ParserTest::setupInterwikis();
+ }
+
protected function setUp() {
- global $wgNamespaceProtection, $wgNamespaceAliases;
+ global $wgNamespaceAliases, $wgContLang;
global $wgHooks, $IP;
parent::setUp();
@@ -52,11 +58,16 @@ class NewParserTest extends MediaWikiTestCase {
$tmpGlobals['wgLanguageCode'] = 'en';
$tmpGlobals['wgContLang'] = Language::factory( 'en' );
+ $tmpGlobals['wgSitename'] = 'MediaWiki';
+ $tmpGlobals['wgServer'] = 'http://example.org';
$tmpGlobals['wgScript'] = '/index.php';
$tmpGlobals['wgScriptPath'] = '/';
$tmpGlobals['wgArticlePath'] = '/wiki/$1';
- $tmpGlobals['wgStyleSheetPath'] = '/skins';
+ $tmpGlobals['wgActionPaths'] = array();
+ $tmpGlobals['wgVariantArticlePath'] = false;
+ $tmpGlobals['wgExtensionAssetsPath'] = '/extensions';
$tmpGlobals['wgStylePath'] = '/skins';
+ $tmpGlobals['wgEnableUploads'] = true;
$tmpGlobals['wgThumbnailScriptPath'] = false;
$tmpGlobals['wgLocalFileRepo'] = array(
'class' => 'LocalRepo',
@@ -67,51 +78,81 @@ class NewParserTest extends MediaWikiTestCase {
'backend' => 'local-backend'
);
$tmpGlobals['wgForeignFileRepos'] = array();
+ $tmpGlobals['wgDefaultExternalStore'] = array();
$tmpGlobals['wgEnableParserCache'] = false;
- $tmpGlobals['wgHooks'] = $wgHooks;
+ $tmpGlobals['wgCapitalLinks'] = true;
+ $tmpGlobals['wgNoFollowLinks'] = true;
+ $tmpGlobals['wgNoFollowDomainExceptions'] = array();
+ $tmpGlobals['wgExternalLinkTarget'] = false;
+ $tmpGlobals['wgThumbnailScriptPath'] = false;
+ $tmpGlobals['wgUseImageResize'] = true;
+ $tmpGlobals['wgAllowExternalImages'] = true;
+ $tmpGlobals['wgRawHtml'] = false;
+ $tmpGlobals['wgUseTidy'] = false;
+ $tmpGlobals['wgAlwaysUseTidy'] = false;
+ $tmpGlobals['wgWellFormedXml'] = true;
+ $tmpGlobals['wgAllowMicrodataAttributes'] = true;
+ $tmpGlobals['wgExperimentalHtmlIds'] = false;
+ $tmpGlobals['wgAdaptiveMessageCache'] = true;
+ $tmpGlobals['wgUseDatabaseMessages'] = true;
+ $tmpGlobals['wgLocaltimezone'] = 'UTC';
$tmpGlobals['wgDeferredUpdateList'] = array();
- $tmpGlobals['wgMemc'] = wfGetMainCache();
- $tmpGlobals['messageMemc'] = wfGetMessageCacheStorage();
- $tmpGlobals['parserMemc'] = wfGetParserCacheStorage();
+ $tmpGlobals['wgGroupPermissions'] = array(
+ '*' => array(
+ 'createaccount' => true,
+ 'read' => true,
+ 'edit' => true,
+ 'createpage' => true,
+ 'createtalk' => true,
+ ) );
+ $tmpGlobals['wgNamespaceProtection'] = array( NS_MEDIAWIKI => 'editinterface' );
- // $tmpGlobals['wgContLang'] = new StubContLang;
- $tmpGlobals['wgUser'] = new User;
- $context = new RequestContext();
- $tmpGlobals['wgLang'] = $context->getLanguage();
- $tmpGlobals['wgOut'] = $context->getOutput();
- $tmpGlobals['wgParser'] = new StubObject( 'wgParser', $GLOBALS['wgParserConf']['class'], array( $GLOBALS['wgParserConf'] ) );
- $tmpGlobals['wgRequest'] = $context->getRequest();
+ $tmpGlobals['wgParser'] = new StubObject(
+ 'wgParser', $GLOBALS['wgParserConf']['class'],
+ array( $GLOBALS['wgParserConf'] ) );
+
+ $tmpGlobals['wgFileExtensions'][] = 'svg';
+ $tmpGlobals['wgSVGConverter'] = 'rsvg';
+ $tmpGlobals['wgSVGConverters']['rsvg'] =
+ '$path/rsvg-convert -w $width -h $height $input -o $output';
if ( $GLOBALS['wgStyleDirectory'] === false ) {
$tmpGlobals['wgStyleDirectory'] = "$IP/skins";
}
+ # Replace all media handlers with a mock. We do not need to generate
+ # actual thumbnails to do parser testing, we only care about receiving
+ # a ThumbnailImage properly initialized.
+ global $wgMediaHandlers;
+ foreach ( $wgMediaHandlers as $type => $handler ) {
+ $tmpGlobals['wgMediaHandlers'][$type] = 'MockBitmapHandler';
+ }
+ // Vector images have to be handled slightly differently
+ $tmpGlobals['wgMediaHandlers']['image/svg+xml'] = 'MockSvgHandler';
- foreach ( $tmpGlobals as $var => $val ) {
- if ( array_key_exists( $var, $GLOBALS ) ) {
- $this->savedInitialGlobals[$var] = $GLOBALS[$var];
- }
+ $tmpHooks = $wgHooks;
+ $tmpHooks['ParserTestParser'][] = 'ParserTestParserHook::setup';
+ $tmpHooks['ParserGetVariableValueTs'][] = 'ParserTest::getFakeTimestamp';
+ $tmpGlobals['wgHooks'] = $tmpHooks;
+ # add a namespace shadowing a interwiki link, to test
+ # proper precedence when resolving links. (bug 51680)
+ $tmpGlobals['wgExtraNamespaces'] = array( 100 => 'MemoryAlpha' );
- $GLOBALS[$var] = $val;
- }
+ $this->setMwGlobals( $tmpGlobals );
- $this->savedWeirdGlobals['mw_namespace_protection'] = $wgNamespaceProtection[NS_MEDIAWIKI];
$this->savedWeirdGlobals['image_alias'] = $wgNamespaceAliases['Image'];
$this->savedWeirdGlobals['image_talk_alias'] = $wgNamespaceAliases['Image_talk'];
- $wgNamespaceProtection[NS_MEDIAWIKI] = 'editinterface';
$wgNamespaceAliases['Image'] = NS_FILE;
$wgNamespaceAliases['Image_talk'] = NS_FILE_TALK;
+
+ MWNamespace::getCanonicalNamespaces( true ); # reset namespace cache
+ $wgContLang->resetNamespaces(); # reset namespace cache
}
protected function tearDown() {
- foreach ( $this->savedInitialGlobals as $var => $val ) {
- $GLOBALS[$var] = $val;
- }
+ global $wgNamespaceAliases, $wgContLang;
- global $wgNamespaceProtection, $wgNamespaceAliases;
-
- $wgNamespaceProtection[NS_MEDIAWIKI] = $this->savedWeirdGlobals['mw_namespace_protection'];
$wgNamespaceAliases['Image'] = $this->savedWeirdGlobals['image_alias'];
$wgNamespaceAliases['Image_talk'] = $this->savedWeirdGlobals['image_talk_alias'];
@@ -119,67 +160,34 @@ class NewParserTest extends MediaWikiTestCase {
RepoGroup::destroySingleton();
FileBackendGroup::destroySingleton();
+ // Remove temporary pages from the link cache
+ LinkCache::singleton()->clear();
+
+ // Restore message cache (temporary pages and $wgUseDatabaseMessages)
+ MessageCache::destroyInstance();
+
parent::tearDown();
+
+ MWNamespace::getCanonicalNamespaces( true ); # reset namespace cache
+ $wgContLang->resetNamespaces(); # reset namespace cache
+ }
+
+ public static function tearDownAfterClass() {
+ ParserTest::tearDownInterwikis();
+ parent::tearDownAfterClass();
}
function addDBData() {
$this->tablesUsed[] = 'site_stats';
- $this->tablesUsed[] = 'interwiki';
# disabled for performance
#$this->tablesUsed[] = 'image';
- # Hack: insert a few Wikipedia in-project interwiki prefixes,
- # for testing inter-language links
- $this->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 ),
- /**
- * @todo Fixme! Why are we inserting duplicate data here? Shouldn't
- * need this IGNORE or shouldn't need the insert at all.
- */
- ), __METHOD__, array( 'IGNORE' )
- );
-
# Update certain things in site_stats
$this->db->insert( 'site_stats',
array( 'ss_row_id' => 1, 'ss_images' => 2, 'ss_good_articles' => 1 ),
__METHOD__
);
- # Reinitialise the LocalisationCache to match the database state
- Language::getLocalisationCache()->unloadAll();
-
- # Clear the message cache
- MessageCache::singleton()->clear();
-
$user = User::newFromId( 0 );
LinkCache::singleton()->clear(); # Avoids the odd failure at creating the nullRevision
@@ -187,6 +195,10 @@ class NewParserTest extends MediaWikiTestCase {
# We will upload the actual files later. Note that if anything causes LocalFile::load()
# to be triggered before then, it will break via maybeUpgrade() setting the fileExists
# member to false and storing it in cache.
+ # note that the size/width/height/bits/etc of the file
+ # are actually set by inspecting the file itself; the arguments
+ # to recordUpload2 have no effect. That said, we try to make things
+ # match up so it is less confusing to readers of the code & tests.
$image = wfLocalFile( Title::makeTitle( NS_FILE, 'Foobar.jpg' ) );
if ( !$this->db->selectField( 'image', '1', array( 'img_name' => $image->getName() ) ) ) {
$image->recordUpload2(
@@ -194,19 +206,39 @@ class NewParserTest extends MediaWikiTestCase {
'Upload of some lame file',
'Some lame file',
array(
- 'size' => 12345,
+ 'size' => 7881,
'width' => 1941,
'height' => 220,
- 'bits' => 24,
+ 'bits' => 8,
'media_type' => MEDIATYPE_BITMAP,
'mime' => 'image/jpeg',
'metadata' => serialize( array() ),
- 'sha1' => wfBaseConvert( '', 16, 36, 31 ),
+ 'sha1' => wfBaseConvert( '1', 16, 36, 31 ),
'fileExists' => true ),
$this->db->timestamp( '20010115123500' ), $user
);
}
+ $image = wfLocalFile( Title::makeTitle( NS_FILE, 'Thumb.png' ) );
+ if ( !$this->db->selectField( 'image', '1', array( 'img_name' => $image->getName() ) ) ) {
+ $image->recordUpload2(
+ '', // archive name
+ 'Upload of some lame thumbnail',
+ 'Some lame thumbnail',
+ array(
+ 'size' => 22589,
+ 'width' => 135,
+ 'height' => 135,
+ 'bits' => 8,
+ 'media_type' => MEDIATYPE_BITMAP,
+ 'mime' => 'image/png',
+ 'metadata' => serialize( array() ),
+ 'sha1' => wfBaseConvert( '2', 16, 36, 31 ),
+ 'fileExists' => true ),
+ $this->db->timestamp( '20130225203040' ), $user
+ );
+ }
+
# This image will be blacklisted in [[MediaWiki:Bad image list]]
$image = wfLocalFile( Title::makeTitle( NS_FILE, 'Bad.jpg' ) );
if ( !$this->db->selectField( 'image', '1', array( 'img_name' => $image->getName() ) ) ) {
@@ -222,11 +254,25 @@ class NewParserTest extends MediaWikiTestCase {
'media_type' => MEDIATYPE_BITMAP,
'mime' => 'image/jpeg',
'metadata' => serialize( array() ),
- 'sha1' => wfBaseConvert( '', 16, 36, 31 ),
+ 'sha1' => wfBaseConvert( '3', 16, 36, 31 ),
'fileExists' => true ),
$this->db->timestamp( '20010115123500' ), $user
);
}
+ $image = wfLocalFile( Title::makeTitle( NS_FILE, 'Foobar.svg' ) );
+ if ( !$this->db->selectField( 'image', '1', array( 'img_name' => $image->getName() ) ) ) {
+ $image->recordUpload2( '', 'Upload of some lame SVG', 'Some lame SVG', array(
+ 'size' => 12345,
+ 'width' => 200,
+ 'height' => 200,
+ 'bits' => 24,
+ 'media_type' => MEDIATYPE_DRAWING,
+ 'mime' => 'image/svg+xml',
+ 'metadata' => serialize( array() ),
+ 'sha1' => wfBaseConvert( '', 16, 36, 31 ),
+ 'fileExists' => true
+ ), $this->db->timestamp( '20010115123500' ), $user );
+ }
}
//ParserTest setup/teardown functions
@@ -265,7 +311,10 @@ class NewParserTest extends MediaWikiTestCase {
$backend = self::$backendToUse;
}
} else {
- $backend = new FSFileBackend( array(
+ # Replace with a mock. We do not care about generating real
+ # files on the filesystem, just need to expose the file
+ # informations.
+ $backend = new MockFileBackend( array(
'name' => 'local-backend',
'lockManager' => 'nullLockManager',
'containerPaths' => array(
@@ -276,12 +325,6 @@ class NewParserTest extends MediaWikiTestCase {
}
$settings = array(
- 'wgServer' => 'http://example.org',
- 'wgScript' => '/index.php',
- 'wgScriptPath' => '/',
- 'wgArticlePath' => '/wiki/$1',
- 'wgExtensionAssetsPath' => '/extensions',
- 'wgActionPaths' => array(),
'wgLocalFileRepo' => array(
'class' => 'LocalRepo',
'name' => 'local',
@@ -291,47 +334,16 @@ class NewParserTest extends MediaWikiTestCase {
'backend' => $backend
),
'wgEnableUploads' => self::getOptionValue( 'wgEnableUploads', $opts, true ),
- 'wgStylePath' => '/skins',
- 'wgStyleSheetPath' => '/skins',
- 'wgSitename' => 'MediaWiki',
'wgLanguageCode' => $lang,
'wgDBprefix' => $this->db->getType() != 'oracle' ? 'unittest_' : 'ut_',
- 'wgRawHtml' => isset( $opts['rawhtml'] ),
- 'wgLang' => null,
- 'wgContLang' => null,
+ 'wgRawHtml' => self::getOptionValue( 'wgRawHtml', $opts, false ),
'wgNamespacesWithSubpages' => array( NS_MAIN => isset( $opts['subpage'] ) ),
+ 'wgAllowExternalImages' => self::getOptionValue( 'wgAllowExternalImages', $opts, true ),
'wgMaxTocLevel' => $maxtoclevel,
- 'wgCapitalLinks' => true,
- 'wgNoFollowLinks' => true,
- 'wgNoFollowDomainExceptions' => array(),
- 'wgThumbnailScriptPath' => false,
- 'wgUseImageResize' => true,
- 'wgUseTeX' => isset( $opts['math'] ),
+ 'wgUseTeX' => isset( $opts['math'] ) || isset( $opts['texvc'] ),
'wgMathDirectory' => $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,
- 'wgAdaptiveMessageCache' => true,
- 'wgUseDatabaseMessages' => true,
);
if ( $config ) {
@@ -349,6 +361,15 @@ class NewParserTest extends MediaWikiTestCase {
/** @since 1.20 */
wfRunHooks( 'ParserTestGlobals', array( &$settings ) );
+ $langObj = Language::factory( $lang );
+ $settings['wgContLang'] = $langObj;
+ $settings['wgLang'] = $langObj;
+
+ $context = new RequestContext();
+ $settings['wgOut'] = $context->getOutput();
+ $settings['wgUser'] = $context->getUser();
+ $settings['wgRequest'] = $context->getRequest();
+
foreach ( $settings as $var => $val ) {
if ( array_key_exists( $var, $GLOBALS ) ) {
$this->savedGlobals[$var] = $GLOBALS[$var];
@@ -357,21 +378,9 @@ class NewParserTest extends MediaWikiTestCase {
$GLOBALS[$var] = $val;
}
- $langObj = Language::factory( $lang );
- $GLOBALS['wgContLang'] = $langObj;
- $context = new RequestContext();
- $GLOBALS['wgLang'] = $context->getLanguage();
-
- $GLOBALS['wgMemc'] = new EmptyBagOStuff;
- $GLOBALS['wgOut'] = $context->getOutput();
- $GLOBALS['wgUser'] = $context->getUser();
-
- global $wgHooks;
-
- $wgHooks['ParserTestParser'][] = 'ParserTestParserHook::setup';
- $wgHooks['ParserGetVariableValueTs'][] = 'ParserTest::getFakeTimestamp';
-
MagicWord::clearCache();
+
+ # The entries saved into RepoGroup cache with previous globals will be wrong.
RepoGroup::destroySingleton();
FileBackendGroup::destroySingleton();
@@ -381,9 +390,6 @@ class NewParserTest extends MediaWikiTestCase {
# Publish the articles after we have the final language set
$this->publishTestArticles();
- # The entries saved into RepoGroup cache with previous globals will be wrong.
- RepoGroup::destroySingleton();
- FileBackendGroup::destroySingleton();
MessageCache::destroyInstance();
return $context;
@@ -408,6 +414,7 @@ class NewParserTest extends MediaWikiTestCase {
// wfDebug( "Creating upload directory $dir\n" );
if ( file_exists( $dir ) ) {
wfDebug( "Already exists!\n" );
+
return $dir;
}
@@ -429,10 +436,27 @@ class NewParserTest extends MediaWikiTestCase {
$backend->store( array(
'src' => "$IP/skins/monobook/headbg.jpg", 'dst' => "$base/local-public/3/3a/Foobar.jpg"
) );
+ $backend->prepare( array( 'dir' => "$base/local-public/e/ea" ) );
+ $backend->store( array(
+ 'src' => "$IP/skins/monobook/wiki.png", 'dst' => "$base/local-public/e/ea/Thumb.png"
+ ) );
$backend->prepare( array( 'dir' => "$base/local-public/0/09" ) );
$backend->store( array(
'src' => "$IP/skins/monobook/headbg.jpg", 'dst' => "$base/local-public/0/09/Bad.jpg"
) );
+
+ // No helpful SVG file to copy, so make one ourselves
+ $tmpDir = wfTempDir();
+ $tempFsFile = new TempFSFile( "$tmpDir/Foobar.svg" );
+ $tempFsFile->autocollect(); // destroy file when $tempFsFile leaves scope
+ file_put_contents( "$tmpDir/Foobar.svg",
+ '<?xml version="1.0" encoding="utf-8"?>' .
+ '<svg xmlns="http://www.w3.org/2000/svg" width="200" height="200"><text>Foo</text></svg>' );
+
+ $backend->prepare( array( 'dir' => "$base/local-public/f/ff" ) );
+ $backend->quickStore( array(
+ 'src' => "$tmpDir/Foobar.svg", 'dst' => "$base/local-public/f/ff/Foobar.svg"
+ ) );
}
/**
@@ -445,9 +469,6 @@ class NewParserTest extends MediaWikiTestCase {
foreach ( $this->savedGlobals as $var => $val ) {
$GLOBALS[$var] = $val;
}
-
- RepoGroup::destroySingleton();
- LinkCache::singleton()->clear();
}
/**
@@ -458,6 +479,12 @@ class NewParserTest extends MediaWikiTestCase {
return;
}
+ $backend = RepoGroup::singleton()->getLocalRepo()->getBackend();
+ if ( $backend instanceof MockFileBackend ) {
+ # In memory backend, so dont bother cleaning them up.
+ return;
+ }
+
$base = $this->getBaseDir();
// delete the files first, then the dirs.
self::deleteFiles(
@@ -478,8 +505,17 @@ class NewParserTest extends MediaWikiTestCase {
"$base/local-thumb/3/3a/Foobar.jpg/70px-Foobar.jpg",
"$base/local-thumb/3/3a/Foobar.jpg/960px-Foobar.jpg",
+ "$base/local-public/e/ea/Thumb.png",
+
"$base/local-public/0/09/Bad.jpg",
- "$base/local-thumb/0/09/Bad.jpg",
+
+ "$base/local-public/f/ff/Foobar.svg",
+ "$base/local-thumb/f/ff/Foobar.svg/180px-Foobar.svg.jpg",
+ "$base/local-thumb/f/ff/Foobar.svg/270px-Foobar.svg.jpg",
+ "$base/local-thumb/f/ff/Foobar.svg/360px-Foobar.svg.jpg",
+ "$base/local-thumb/f/ff/Foobar.svg/langde-180px-Foobar.svg.jpg",
+ "$base/local-thumb/f/ff/Foobar.svg/langde-270px-Foobar.svg.jpg",
+ "$base/local-thumb/f/ff/Foobar.svg/langde-360px-Foobar.svg.jpg",
"$base/local-public/math/f/a/5/fa50b8b616463173474302ca3e63586b.png",
)
@@ -514,6 +550,7 @@ class NewParserTest extends MediaWikiTestCase {
global $wgParserTestFiles;
$this->file = $wgParserTestFiles[0];
}
+
return new TestFileIterator( $this->file, $this );
}
@@ -537,7 +574,7 @@ class NewParserTest extends MediaWikiTestCase {
if ( !$this->isWikitextNS( NS_MAIN ) ) {
// parser tests frequently assume that the main namespace contains wikitext.
- // @todo: When setting up pages, force the content model. Only skip if
+ // @todo When setting up pages, force the content model. Only skip if
// $wgtContentModelUseDB is false.
$this->markTestSkipped( "Main namespace does not support wikitext,"
. "skipping parser test: $desc" );
@@ -563,6 +600,20 @@ class NewParserTest extends MediaWikiTestCase {
$title = Title::newFromText( $titleText );
+ # Parser test requiring math. Make sure texvc is executable
+ # or just skip such tests.
+ if ( isset( $opts['math'] ) || isset( $opts['texvc'] ) ) {
+ global $wgTexvc;
+
+ if ( !isset( $wgTexvc ) ) {
+ $this->markTestSkipped( "SKIPPED: \$wgTexvc is not set" );
+ } elseif ( !is_executable( $wgTexvc ) ) {
+ $this->markTestSkipped( "SKIPPED: texvc binary does not exist"
+ . " or is not executable.\n"
+ . "Current configuration is:\n\$wgTexvc = '$wgTexvc'" );
+ }
+ }
+
if ( isset( $opts['pst'] ) ) {
$out = $parser->preSaveTransform( $input, $title, $user, $options );
} elseif ( isset( $opts['msg'] ) ) {
@@ -577,9 +628,10 @@ class NewParserTest extends MediaWikiTestCase {
} elseif ( isset( $opts['comment'] ) ) {
$out = Linker::formatComment( $input, $title, $local );
} elseif ( isset( $opts['preload'] ) ) {
- $out = $parser->getpreloadText( $input, $title, $options );
+ $out = $parser->getPreloadText( $input, $title, $options );
} else {
$output = $parser->parse( $input, $title, $options, true, true, 1337 );
+ $output->setTOCEnabled( !isset( $opts['notoc'] ) );
$out = $output->getText();
if ( isset( $opts['showtitle'] ) ) {
@@ -621,7 +673,7 @@ class NewParserTest extends MediaWikiTestCase {
*
* @group ParserFuzz
*/
- function testFuzzTests() {
+ public function testFuzzTests() {
global $wgParserTestFiles;
$files = $wgParserTestFiles;
@@ -666,7 +718,9 @@ class NewParserTest extends MediaWikiTestCase {
} catch ( Exception $exception ) {
$input_dump = sprintf( "string(%d) \"%s\"\n", strlen( $input ), $input );
- $this->assertTrue( false, "Test $id, fuzz seed {$this->fuzzSeed}. \n\nInput: $input_dump\n\nError: {$exception->getMessage()}\n\nBacktrace: {$exception->getTraceAsString()}" );
+ $this->assertTrue( false, "Test $id, fuzz seed {$this->fuzzSeed}. \n\n" .
+ "Input: $input_dump\n\nError: {$exception->getMessage()}\n\n" .
+ "Backtrace: {$exception->getTraceAsString()}" );
}
$this->teardownGlobals();
@@ -688,7 +742,6 @@ class NewParserTest extends MediaWikiTestCase {
}
$id++;
-
}
}
@@ -882,6 +935,7 @@ class NewParserTest extends MediaWikiTestCase {
}
}
}
+
return $opts;
}
@@ -893,6 +947,7 @@ class NewParserTest extends MediaWikiTestCase {
if ( substr( $opt, 0, 2 ) == '[[' ) {
return substr( $opt, 2, -2 );
}
+
return $opt;
}
diff --git a/tests/phpunit/includes/parser/ParserMethodsTest.php b/tests/phpunit/includes/parser/ParserMethodsTest.php
index 50fe0e4d..e5c5cb21 100644
--- a/tests/phpunit/includes/parser/ParserMethodsTest.php
+++ b/tests/phpunit/includes/parser/ParserMethodsTest.php
@@ -15,6 +15,7 @@ class ParserMethodsTest extends MediaWikiLangTestCase {
/**
* @dataProvider providePreSaveTransform
+ * @covers Parser::preSaveTransform
*/
public function testPreSaveTransform( $text, $expected ) {
global $wgParser;
@@ -28,6 +29,9 @@ class ParserMethodsTest extends MediaWikiLangTestCase {
$this->assertEquals( $expected, $text );
}
+ /**
+ * @covers Parser::callParserFunction
+ */
public function testCallParserFunction() {
global $wgParser;
@@ -45,5 +49,47 @@ class ParserMethodsTest extends MediaWikiLangTestCase {
), $ret, 'callParserFunction works for {{#tag:pre|foo|style=margin-left: 1.6em}}' );
}
- // TODO: Add tests for cleanSig() / cleanSigInSig(), getSection(), replaceSection(), getPreloadText()
+ /**
+ * @covers Parser::parse
+ * @covers ParserOutput::getSections
+ */
+ public function testGetSections() {
+ global $wgParser;
+
+ $title = Title::newFromText( str_replace( '::', '__', __METHOD__ ) );
+ $out = $wgParser->parse( "==foo==\n<h2>bar</h2>\n==baz==\n", $title, new ParserOptions() );
+ $this->assertSame( array(
+ array(
+ 'toclevel' => 1,
+ 'level' => '2',
+ 'line' => 'foo',
+ 'number' => '1',
+ 'index' => '1',
+ 'fromtitle' => $title->getPrefixedDBkey(),
+ 'byteoffset' => 0,
+ 'anchor' => 'foo',
+ ),
+ array(
+ 'toclevel' => 1,
+ 'level' => '2',
+ 'line' => 'bar',
+ 'number' => '2',
+ 'index' => '',
+ 'fromtitle' => false,
+ 'byteoffset' => null,
+ 'anchor' => 'bar',
+ ),
+ array(
+ 'toclevel' => 1,
+ 'level' => '2',
+ 'line' => 'baz',
+ 'number' => '3',
+ 'index' => '2',
+ 'fromtitle' => $title->getPrefixedDBkey(),
+ 'byteoffset' => 21,
+ 'anchor' => 'baz',
+ ),
+ ), $out->getSections(), 'getSections() with proper value when <h2> is used' );
+ }
+ //@Todo Add tests for cleanSig() / cleanSigInSig(), getSection(), replaceSection(), getPreloadText()
}
diff --git a/tests/phpunit/includes/parser/ParserOutputTest.php b/tests/phpunit/includes/parser/ParserOutputTest.php
index 68f77ab5..c73666da 100644
--- a/tests/phpunit/includes/parser/ParserOutputTest.php
+++ b/tests/phpunit/includes/parser/ParserOutputTest.php
@@ -2,7 +2,7 @@
class ParserOutputTest extends MediaWikiTestCase {
- function dataIsLinkInternal() {
+ public static function provideIsLinkInternal() {
return array(
// Different domains
array( false, 'http://example.org', 'http://mediawiki.org' ),
@@ -29,13 +29,17 @@ class ParserOutputTest extends MediaWikiTestCase {
/**
* Test to make sure ParserOutput::isLinkInternal behaves properly
- * @dataProvider dataIsLinkInternal
+ * @dataProvider provideIsLinkInternal
+ * @covers ParserOutput::isLinkInternal
*/
- function testIsLinkInternal( $shouldMatch, $server, $url ) {
-
+ public function testIsLinkInternal( $shouldMatch, $server, $url ) {
$this->assertEquals( $shouldMatch, ParserOutput::isLinkInternal( $server, $url ) );
}
+ /**
+ * @covers ParserOutput::setExtensionData
+ * @covers ParserOutput::getExtensionData
+ */
public function testExtensionData() {
$po = new ParserOutput();
diff --git a/tests/phpunit/includes/parser/ParserPreloadTest.php b/tests/phpunit/includes/parser/ParserPreloadTest.php
index e16b407e..d12fee36 100644
--- a/tests/phpunit/includes/parser/ParserPreloadTest.php
+++ b/tests/phpunit/includes/parser/ParserPreloadTest.php
@@ -4,8 +4,17 @@
* @author Antoine Musso
*/
class ParserPreloadTest extends MediaWikiTestCase {
+ /**
+ * @var Parser
+ */
private $testParser;
+ /**
+ * @var ParserOptions
+ */
private $testParserOptions;
+ /**
+ * @var Title
+ */
private $title;
protected function setUp() {
@@ -31,14 +40,14 @@ class ParserPreloadTest extends MediaWikiTestCase {
/**
* @covers Parser::getPreloadText
*/
- function testPreloadSimpleText() {
+ public function testPreloadSimpleText() {
$this->assertPreloaded( 'simple', 'simple' );
}
/**
* @covers Parser::getPreloadText
*/
- function testPreloadedPreIsUnstripped() {
+ public function testPreloadedPreIsUnstripped() {
$this->assertPreloaded(
'<pre>monospaced</pre>',
'<pre>monospaced</pre>',
@@ -49,7 +58,7 @@ class ParserPreloadTest extends MediaWikiTestCase {
/**
* @covers Parser::getPreloadText
*/
- function testPreloadedNowikiIsUnstripped() {
+ public function testPreloadedNowikiIsUnstripped() {
$this->assertPreloaded(
'<nowiki>[[Dummy title]]</nowiki>',
'<nowiki>[[Dummy title]]</nowiki>',
@@ -57,7 +66,7 @@ class ParserPreloadTest extends MediaWikiTestCase {
);
}
- function assertPreloaded( $expected, $text, $msg = '' ) {
+ protected function assertPreloaded( $expected, $text, $msg = '' ) {
$this->assertEquals(
$expected,
$this->testParser->getPreloadText(
@@ -68,5 +77,4 @@ class ParserPreloadTest extends MediaWikiTestCase {
$msg
);
}
-
}
diff --git a/tests/phpunit/includes/parser/PreprocessorTest.php b/tests/phpunit/includes/parser/PreprocessorTest.php
index c51a1dc5..8aee937c 100644
--- a/tests/phpunit/includes/parser/PreprocessorTest.php
+++ b/tests/phpunit/includes/parser/PreprocessorTest.php
@@ -1,9 +1,16 @@
<?php
class PreprocessorTest extends MediaWikiTestCase {
- var $mTitle = 'Page title';
- var $mPPNodeCount = 0;
- var $mOptions;
+ protected $mTitle = 'Page title';
+ protected $mPPNodeCount = 0;
+ /**
+ * @var ParserOptions
+ */
+ protected $mOptions;
+ /**
+ * @var Preprocessor
+ */
+ protected $mPreprocessor;
protected function setUp() {
global $wgParserConf, $wgContLang;
@@ -18,7 +25,7 @@ class PreprocessorTest extends MediaWikiTestCase {
return array( 'gallery', 'display map' /* Used by Maps, see r80025 CR */, '/foo' );
}
- function provideCases() {
+ public static function provideCases() {
return array(
array( "Foo", "<root>Foo</root>" ),
array( "<!-- Foo -->", "<root><comment>&lt;!-- Foo --&gt;</comment></root>" ),
@@ -115,7 +122,7 @@ class PreprocessorTest extends MediaWikiTestCase {
* @param string $wikiText
* @return string
*/
- function preprocessToXml( $wikiText ) {
+ protected function preprocessToXml( $wikiText ) {
if ( method_exists( $this->mPreprocessor, 'preprocessToXml' ) ) {
return $this->normalizeXml( $this->mPreprocessor->preprocessToXml( $wikiText ) );
}
@@ -134,21 +141,22 @@ class PreprocessorTest extends MediaWikiTestCase {
* @param string $xml
* @return string
*/
- function normalizeXml( $xml ) {
+ protected function normalizeXml( $xml ) {
return preg_replace( '!<([a-z]+)/>!', '<$1></$1>', str_replace( ' />', '/>', $xml ) );
}
/**
* @dataProvider provideCases
+ * @covers Preprocessor_DOM::preprocessToXml
*/
- function testPreprocessorOutput( $wikiText, $expectedXml ) {
+ public function testPreprocessorOutput( $wikiText, $expectedXml ) {
$this->assertEquals( $this->normalizeXml( $expectedXml ), $this->preprocessToXml( $wikiText ) );
}
/**
* These are more complex test cases taken out of wiki articles.
*/
- function provideFiles() {
+ public static function provideFiles() {
return array(
array( "QuoteQuran" ), # http://en.wikipedia.org/w/index.php?title=Template:QuoteQuran/sandbox&oldid=237348988 GFDL + CC-BY-SA by Striver
array( "Factorial" ), # http://en.wikipedia.org/w/index.php?title=Template:Factorial&oldid=98548758 GFDL + CC-BY-SA by Polonium
@@ -160,8 +168,9 @@ class PreprocessorTest extends MediaWikiTestCase {
/**
* @dataProvider provideFiles
+ * @covers Preprocessor_DOM::preprocessToXml
*/
- function testPreprocessorOutputFiles( $filename ) {
+ public function testPreprocessorOutputFiles( $filename ) {
$folder = __DIR__ . "/../../../parser/preprocess";
$wikiText = file_get_contents( "$folder/$filename.txt" );
$output = $this->preprocessToXml( $wikiText );
@@ -180,7 +189,7 @@ class PreprocessorTest extends MediaWikiTestCase {
/**
* Tests from Bug 28642 · https://bugzilla.wikimedia.org/28642
*/
- function provideHeadings() {
+ public static function provideHeadings() {
return array( /* These should become headings: */
array( "== h ==<!--c1-->", "<root><h level=\"2\" i=\"1\">== h ==<comment>&lt;!--c1--&gt;</comment></h></root>" ),
array( "== h == <!--c1-->", "<root><h level=\"2\" i=\"1\">== h == <comment>&lt;!--c1--&gt;</comment></h></root>" ),
@@ -209,11 +218,11 @@ class PreprocessorTest extends MediaWikiTestCase {
array( "== h == <!--c1--> <!--c2--><!--c3--> ", "<root><h level=\"2\" i=\"1\">== h == <comment>&lt;!--c1--&gt;</comment> <comment>&lt;!--c2--&gt;</comment><comment>&lt;!--c3--&gt;</comment> </h></root>" ),
array( "== h == <!--c1--><!--c2--> <!--c3--> ", "<root><h level=\"2\" i=\"1\">== h == <comment>&lt;!--c1--&gt;</comment><comment>&lt;!--c2--&gt;</comment> <comment>&lt;!--c3--&gt;</comment> </h></root>" ),
array( "== h == <!--c1--> <!--c2--> <!--c3--> ", "<root><h level=\"2\" i=\"1\">== h == <comment>&lt;!--c1--&gt;</comment> <comment>&lt;!--c2--&gt;</comment> <comment>&lt;!--c3--&gt;</comment> </h></root>" ),
+ array( "== h ==<!--c1--> <!--c2-->", "<root><h level=\"2\" i=\"1\">== h ==<comment>&lt;!--c1--&gt;</comment> <comment>&lt;!--c2--&gt;</comment></h></root>" ),
+ array( "== h == <!--c1--> <!--c2-->", "<root><h level=\"2\" i=\"1\">== h == <comment>&lt;!--c1--&gt;</comment> <comment>&lt;!--c2--&gt;</comment></h></root>" ),
+ array( "== h ==<!--c1--> <!--c2--> ", "<root><h level=\"2\" i=\"1\">== h ==<comment>&lt;!--c1--&gt;</comment> <comment>&lt;!--c2--&gt;</comment> </h></root>" ),
/* These are not working: */
- array( "== h ==<!--c1--> <!--c2-->", "<root>== h ==<comment>&lt;!--c1--&gt;</comment> <comment>&lt;!--c2--&gt;</comment></root>" ),
- array( "== h == <!--c1--> <!--c2-->", "<root>== h == <comment>&lt;!--c1--&gt;</comment> <comment>&lt;!--c2--&gt;</comment></root>" ),
- array( "== h ==<!--c1--> <!--c2--> ", "<root>== h ==<comment>&lt;!--c1--&gt;</comment> <comment>&lt;!--c2--&gt;</comment> </root>" ),
array( "== h == x <!--c1--><!--c2--><!--c3--> ", "<root>== h == x <comment>&lt;!--c1--&gt;</comment><comment>&lt;!--c2--&gt;</comment><comment>&lt;!--c3--&gt;</comment> </root>" ),
array( "== h ==<!--c1--> x <!--c2--><!--c3--> ", "<root>== h ==<comment>&lt;!--c1--&gt;</comment> x <comment>&lt;!--c2--&gt;</comment><comment>&lt;!--c3--&gt;</comment> </root>" ),
array( "== h ==<!--c1--><!--c2--><!--c3--> x ", "<root>== h ==<comment>&lt;!--c1--&gt;</comment><comment>&lt;!--c2--&gt;</comment><comment>&lt;!--c3--&gt;</comment> x </root>" ),
@@ -222,8 +231,9 @@ class PreprocessorTest extends MediaWikiTestCase {
/**
* @dataProvider provideHeadings
+ * @covers Preprocessor_DOM::preprocessToXml
*/
- function testHeadings( $wikiText, $expectedXml ) {
+ public function testHeadings( $wikiText, $expectedXml ) {
$this->assertEquals( $this->normalizeXml( $expectedXml ), $this->preprocessToXml( $wikiText ) );
}
}
diff --git a/tests/phpunit/includes/parser/TagHooksTest.php b/tests/phpunit/includes/parser/TagHooksTest.php
index ed600790..61cbe45d 100644
--- a/tests/phpunit/includes/parser/TagHooksTest.php
+++ b/tests/phpunit/includes/parser/TagHooksTest.php
@@ -21,7 +21,7 @@ class TagHookTest extends MediaWikiTestCase {
/**
* @dataProvider provideValidNames
*/
- function testTagHooks( $tag ) {
+ public function testTagHooks( $tag ) {
global $wgParserConf, $wgContLang;
$parser = new Parser( $wgParserConf );
@@ -36,7 +36,7 @@ class TagHookTest extends MediaWikiTestCase {
* @dataProvider provideBadNames
* @expectedException MWException
*/
- function testBadTagHooks( $tag ) {
+ public function testBadTagHooks( $tag ) {
global $wgParserConf, $wgContLang;
$parser = new Parser( $wgParserConf );
@@ -48,7 +48,7 @@ class TagHookTest extends MediaWikiTestCase {
/**
* @dataProvider provideValidNames
*/
- function testFunctionTagHooks( $tag ) {
+ public function testFunctionTagHooks( $tag ) {
global $wgParserConf, $wgContLang;
$parser = new Parser( $wgParserConf );
@@ -63,7 +63,7 @@ class TagHookTest extends MediaWikiTestCase {
* @dataProvider provideBadNames
* @expectedException MWException
*/
- function testBadFunctionTagHooks( $tag ) {
+ public function testBadFunctionTagHooks( $tag ) {
global $wgParserConf, $wgContLang;
$parser = new Parser( $wgParserConf );
diff --git a/tests/phpunit/includes/parser/TidyTest.php b/tests/phpunit/includes/parser/TidyTest.php
new file mode 100644
index 00000000..57a88b9d
--- /dev/null
+++ b/tests/phpunit/includes/parser/TidyTest.php
@@ -0,0 +1,44 @@
+<?php
+
+/**
+ * @group Parser
+ */
+class TidyTest extends MediaWikiTestCase {
+ public function setUp() {
+ parent::setUp();
+ $check = MWTidy::tidy( '' );
+ if ( strpos( $check, '<!--' ) !== false ) {
+ $this->markTestSkipped( 'Tidy not found' );
+ }
+ }
+
+ /**
+ * @dataProvider provideTestWrapping
+ */
+ public function testTidyWrapping( $expected, $text, $msg = '' ) {
+ $text = MWTidy::tidy( $text );
+ // We don't care about where Tidy wants to stick is <p>s
+ $text = trim( preg_replace( '#</?p>#', '', $text ) );
+ // Windows, we love you!
+ $text = str_replace( "\r", '', $text );
+ $this->assertEquals( $expected, $text, $msg );
+ }
+
+ public function provideTestWrapping() {
+ return array(
+ array(
+ '<mw:editsection page="foo" section="bar">foo</mw:editsection>',
+ '<mw:editsection page="foo" section="bar">foo</mw:editsection>',
+ '<mw:editsection> should survive tidy'
+ ),
+ array(
+ '<editsection page="foo" section="bar">foo</editsection>',
+ '<editsection page="foo" section="bar">foo</editsection>',
+ '<editsection> should survive tidy'
+ ),
+ array( '<mw:toc>foo</mw:toc>', '<mw:toc>foo</mw:toc>', '<mw:toc> should survive tidy' ),
+ array( "<link foo=\"bar\" />\nfoo", '<link foo="bar"/>foo', '<link> should survive tidy' ),
+ array( "<meta foo=\"bar\" />\nfoo", '<meta foo="bar"/>foo', '<meta> should survive tidy' ),
+ );
+ }
+} \ No newline at end of file
diff --git a/tests/phpunit/includes/search/SearchEngineTest.php b/tests/phpunit/includes/search/SearchEngineTest.php
index 6abca6d4..87067038 100644
--- a/tests/phpunit/includes/search/SearchEngineTest.php
+++ b/tests/phpunit/includes/search/SearchEngineTest.php
@@ -45,7 +45,7 @@ class SearchEngineTest extends MediaWikiLangTestCase {
}
if ( !$this->isWikitextNS( NS_MAIN ) ) {
- //@todo: cover the case of non-wikitext content in the main namespace
+ // @todo cover the case of non-wikitext content in the main namespace
return;
}
@@ -87,6 +87,7 @@ class SearchEngineTest extends MediaWikiLangTestCase {
# sort them numerically so we will compare simply that we received
# the expected matches.
sort( $matches );
+
return $matches;
}
@@ -114,7 +115,7 @@ class SearchEngineTest extends MediaWikiLangTestCase {
return true;
}
- function testFullWidth() {
+ public function testFullWidth() {
$this->assertEquals(
array( 'FullOneUp', 'FullTwoLow', 'HalfOneUp', 'HalfTwoLow' ),
$this->fetchIds( $this->search->searchText( 'AZ' ) ),
@@ -133,14 +134,14 @@ class SearchEngineTest extends MediaWikiLangTestCase {
"Search for normalized from Full-width Lower" );
}
- function testTextSearch() {
+ public function testTextSearch() {
$this->assertEquals(
array( 'Smithee' ),
$this->fetchIds( $this->search->searchText( 'smithee' ) ),
"Plain search failed" );
}
- function testTextPowerSearch() {
+ public function testTextPowerSearch() {
$this->search->setNamespaces( array( 0, 1, 4 ) );
$this->assertEquals(
array(
@@ -151,7 +152,7 @@ class SearchEngineTest extends MediaWikiLangTestCase {
"Power search failed" );
}
- function testTitleSearch() {
+ public function testTitleSearch() {
$this->assertEquals(
array(
'Alan Smithee',
@@ -161,7 +162,7 @@ class SearchEngineTest extends MediaWikiLangTestCase {
"Title search failed" );
}
- function testTextTitlePowerSearch() {
+ public function testTextTitlePowerSearch() {
$this->search->setNamespaces( array( 0, 1, 4 ) );
$this->assertEquals(
array(
@@ -172,5 +173,4 @@ class SearchEngineTest extends MediaWikiLangTestCase {
$this->fetchIds( $this->search->searchTitle( 'smithee' ) ),
"Title power search failed" );
}
-
}
diff --git a/tests/phpunit/includes/search/SearchUpdateTest.php b/tests/phpunit/includes/search/SearchUpdateTest.php
index 7d867bc4..2f4fd501 100644
--- a/tests/phpunit/includes/search/SearchUpdateTest.php
+++ b/tests/phpunit/includes/search/SearchUpdateTest.php
@@ -17,6 +17,7 @@ class MockSearch extends SearchEngine {
/**
* @group Search
+ * @group Database
*/
class SearchUpdateTest extends MediaWikiTestCase {
@@ -25,19 +26,11 @@ class SearchUpdateTest extends MediaWikiTestCase {
$this->setMwGlobals( 'wgSearchType', 'MockSearch' );
}
- 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( , $resultText ) = $this->update( $text );
- $resultText = trim( $resultText ); // abstract from some implementation details
- return $resultText;
+ return trim( SearchUpdate::updateText( $text ) );
}
- function testUpdateText() {
+ public function testUpdateText() {
$this->assertEquals(
'test',
$this->updateText( '<div>TeSt</div>' ),
@@ -69,7 +62,7 @@ EOT
);
}
- function testBug32712() {
+ public function testBug32712() {
$text = "text „http://example.com“ text";
$result = $this->updateText( $text );
$processed = preg_replace( '/Q/u', 'Q', $result );
diff --git a/tests/phpunit/includes/site/MediaWikiSiteTest.php b/tests/phpunit/includes/site/MediaWikiSiteTest.php
index 0cecdeea..c5d52d33 100644
--- a/tests/phpunit/includes/site/MediaWikiSiteTest.php
+++ b/tests/phpunit/includes/site/MediaWikiSiteTest.php
@@ -54,6 +54,7 @@ class MediaWikiSiteTest extends SiteTest {
/**
* @dataProvider fileUrlProvider
+ * @covers MediaWikiSite::getFileUrl
*/
public function testGetFileUrl( $url, $filePath, $pathArgument, $expected ) {
$site = new MediaWikiSite();
@@ -62,7 +63,7 @@ class MediaWikiSiteTest extends SiteTest {
$this->assertEquals( $expected, $site->getFileUrl( $pathArgument ) );
}
- public function provideGetPageUrl() {
+ public static function provideGetPageUrl() {
return array(
// path, page, expected substring
array( 'http://acme.test/wiki/$1', 'Berlin', '/wiki/Berlin' ),
@@ -77,6 +78,7 @@ class MediaWikiSiteTest extends SiteTest {
/**
* @dataProvider provideGetPageUrl
+ * @covers MediaWikiSite::getPageUrl
*/
public function testGetPageUrl( $path, $page, $expected ) {
$site = new MediaWikiSite();
@@ -85,5 +87,4 @@ class MediaWikiSiteTest extends SiteTest {
$this->assertContains( $path, $site->getPageUrl() );
$this->assertContains( $expected, $site->getPageUrl( $page ) );
}
-
}
diff --git a/tests/phpunit/includes/site/SiteListTest.php b/tests/phpunit/includes/site/SiteListTest.php
index c3298397..8af2fc1b 100644
--- a/tests/phpunit/includes/site/SiteListTest.php
+++ b/tests/phpunit/includes/site/SiteListTest.php
@@ -68,6 +68,7 @@ class SiteListTest extends MediaWikiTestCase {
/**
* @dataProvider siteListProvider
* @param SiteList $sites
+ * @covers SiteList::isEmpty
*/
public function testIsEmpty( SiteList $sites ) {
$this->assertEquals( count( $sites ) === 0, $sites->isEmpty() );
@@ -76,6 +77,7 @@ class SiteListTest extends MediaWikiTestCase {
/**
* @dataProvider siteListProvider
* @param SiteList $sites
+ * @covers SiteList::getSite
*/
public function testGetSiteByGlobalId( SiteList $sites ) {
if ( $sites->isEmpty() ) {
@@ -93,6 +95,7 @@ class SiteListTest extends MediaWikiTestCase {
/**
* @dataProvider siteListProvider
* @param SiteList $sites
+ * @covers SiteList::getSiteByInternalId
*/
public function testGetSiteByInternalId( $sites ) {
/**
@@ -110,6 +113,7 @@ class SiteListTest extends MediaWikiTestCase {
/**
* @dataProvider siteListProvider
* @param SiteList $sites
+ * @covers SiteList::hasSite
*/
public function testHasGlobalId( $sites ) {
$this->assertFalse( $sites->hasSite( 'non-existing-global-id' ) );
@@ -128,6 +132,7 @@ class SiteListTest extends MediaWikiTestCase {
/**
* @dataProvider siteListProvider
* @param SiteList $sites
+ * @covers SiteList::hasInternalId
*/
public function testHasInternallId( $sites ) {
/**
@@ -145,6 +150,7 @@ class SiteListTest extends MediaWikiTestCase {
/**
* @dataProvider siteListProvider
* @param SiteList $sites
+ * @covers SiteList::getGlobalIdentifiers
*/
public function testGetGlobalIdentifiers( SiteList $sites ) {
$identifiers = $sites->getGlobalIdentifiers();
@@ -169,6 +175,8 @@ class SiteListTest extends MediaWikiTestCase {
* @since 1.21
*
* @param SiteList $list
+ * @covers SiteList::getSerializationData
+ * @covers SiteList::unserialize
*/
public function testSerialization( SiteList $list ) {
$serialization = serialize( $list );
@@ -186,5 +194,4 @@ class SiteListTest extends MediaWikiTestCase {
$this->assertTrue( $copy->hasInternalId( $site->getInternalId() ) );
}
}
-
}
diff --git a/tests/phpunit/includes/site/SiteSQLStoreTest.php b/tests/phpunit/includes/site/SiteSQLStoreTest.php
index cf4ce945..6002c1a1 100644
--- a/tests/phpunit/includes/site/SiteSQLStoreTest.php
+++ b/tests/phpunit/includes/site/SiteSQLStoreTest.php
@@ -32,6 +32,9 @@
*/
class SiteSQLStoreTest extends MediaWikiTestCase {
+ /**
+ * @covers SiteSQLStore::getSites
+ */
public function testGetSites() {
$expectedSites = TestSites::getSites();
TestSites::insertIntoDb();
@@ -56,6 +59,9 @@ class SiteSQLStoreTest extends MediaWikiTestCase {
}
}
+ /**
+ * @covers SiteSQLStore::saveSites
+ */
public function testSaveSites() {
$store = SiteSQLStore::newInstance();
@@ -86,6 +92,9 @@ class SiteSQLStoreTest extends MediaWikiTestCase {
$this->assertTrue( $site->getInternalId() >= 0 );
}
+ /**
+ * @covers SiteSQLStore::reset
+ */
public function testReset() {
$store1 = SiteSQLStore::newInstance();
$store2 = SiteSQLStore::newInstance();
@@ -109,6 +118,9 @@ class SiteSQLStoreTest extends MediaWikiTestCase {
$this->assertNull( $site );
}
+ /**
+ * @covers SiteSQLStore::clear
+ */
public function testClear() {
$store = SiteSQLStore::newInstance();
$this->assertTrue( $store->clear() );
@@ -119,5 +131,4 @@ class SiteSQLStoreTest extends MediaWikiTestCase {
$sites = $store->getSites();
$this->assertEquals( 0, $sites->count() );
}
-
}
diff --git a/tests/phpunit/includes/site/SiteTest.php b/tests/phpunit/includes/site/SiteTest.php
index d20e2a52..29c1ff33 100644
--- a/tests/phpunit/includes/site/SiteTest.php
+++ b/tests/phpunit/includes/site/SiteTest.php
@@ -38,6 +38,7 @@ class SiteTest extends MediaWikiTestCase {
/**
* @dataProvider instanceProvider
* @param Site $site
+ * @covers Site::getInterwikiIds
*/
public function testGetInterwikiIds( Site $site ) {
$this->assertInternalType( 'array', $site->getInterwikiIds() );
@@ -46,6 +47,7 @@ class SiteTest extends MediaWikiTestCase {
/**
* @dataProvider instanceProvider
* @param Site $site
+ * @covers Site::getNavigationIds
*/
public function testGetNavigationIds( Site $site ) {
$this->assertInternalType( 'array', $site->getNavigationIds() );
@@ -54,6 +56,7 @@ class SiteTest extends MediaWikiTestCase {
/**
* @dataProvider instanceProvider
* @param Site $site
+ * @covers Site::addNavigationId
*/
public function testAddNavigationId( Site $site ) {
$site->addNavigationId( 'foobar' );
@@ -63,6 +66,7 @@ class SiteTest extends MediaWikiTestCase {
/**
* @dataProvider instanceProvider
* @param Site $site
+ * @covers Site::addInterwikiId
*/
public function testAddInterwikiId( Site $site ) {
$site->addInterwikiId( 'foobar' );
@@ -72,6 +76,7 @@ class SiteTest extends MediaWikiTestCase {
/**
* @dataProvider instanceProvider
* @param Site $site
+ * @covers Site::getLanguageCode
*/
public function testGetLanguageCode( Site $site ) {
$this->assertTypeOrValue( 'string', $site->getLanguageCode(), null );
@@ -80,6 +85,7 @@ class SiteTest extends MediaWikiTestCase {
/**
* @dataProvider instanceProvider
* @param Site $site
+ * @covers Site::setLanguageCode
*/
public function testSetLanguageCode( Site $site ) {
$site->setLanguageCode( 'en' );
@@ -89,6 +95,7 @@ class SiteTest extends MediaWikiTestCase {
/**
* @dataProvider instanceProvider
* @param Site $site
+ * @covers Site::normalizePageName
*/
public function testNormalizePageName( Site $site ) {
$this->assertInternalType( 'string', $site->normalizePageName( 'Foobar' ) );
@@ -97,6 +104,7 @@ class SiteTest extends MediaWikiTestCase {
/**
* @dataProvider instanceProvider
* @param Site $site
+ * @covers Site::getGlobalId
*/
public function testGetGlobalId( Site $site ) {
$this->assertTypeOrValue( 'string', $site->getGlobalId(), null );
@@ -105,6 +113,7 @@ class SiteTest extends MediaWikiTestCase {
/**
* @dataProvider instanceProvider
* @param Site $site
+ * @covers Site::setGlobalId
*/
public function testSetGlobalId( Site $site ) {
$site->setGlobalId( 'foobar' );
@@ -114,6 +123,7 @@ class SiteTest extends MediaWikiTestCase {
/**
* @dataProvider instanceProvider
* @param Site $site
+ * @covers Site::getType
*/
public function testGetType( Site $site ) {
$this->assertInternalType( 'string', $site->getType() );
@@ -122,6 +132,7 @@ class SiteTest extends MediaWikiTestCase {
/**
* @dataProvider instanceProvider
* @param Site $site
+ * @covers Site::getPath
*/
public function testGetPath( Site $site ) {
$this->assertTypeOrValue( 'string', $site->getPath( 'page_path' ), null );
@@ -132,6 +143,7 @@ class SiteTest extends MediaWikiTestCase {
/**
* @dataProvider instanceProvider
* @param Site $site
+ * @covers Site::getAllPaths
*/
public function testGetAllPaths( Site $site ) {
$this->assertInternalType( 'array', $site->getAllPaths() );
@@ -140,6 +152,8 @@ class SiteTest extends MediaWikiTestCase {
/**
* @dataProvider instanceProvider
* @param Site $site
+ * @covers Site::setPath
+ * @covers Site::removePath
*/
public function testSetAndRemovePath( Site $site ) {
$count = count( $site->getAllPaths() );
@@ -162,6 +176,9 @@ class SiteTest extends MediaWikiTestCase {
$this->assertNull( $site->getPath( 'spam' ) );
}
+ /**
+ * @covers Site::setLinkPath
+ */
public function testSetLinkPath() {
$site = new Site();
$path = "TestPath/$1";
@@ -170,6 +187,9 @@ class SiteTest extends MediaWikiTestCase {
$this->assertEquals( $path, $site->getLinkPath() );
}
+ /**
+ * @covers Site::getLinkPathType
+ */
public function testGetLinkPathType() {
$site = new Site();
@@ -182,6 +202,9 @@ class SiteTest extends MediaWikiTestCase {
$this->assertEquals( $path, $site->getLinkPath() );
}
+ /**
+ * @covers Site::setPath
+ */
public function testSetPath() {
$site = new Site();
@@ -191,6 +214,10 @@ class SiteTest extends MediaWikiTestCase {
$this->assertEquals( $path, $site->getPath( 'foo' ) );
}
+ /**
+ * @covers Site::setPath
+ * @covers Site::getProtocol
+ */
public function testProtocolRelativePath() {
$site = new Site();
@@ -201,7 +228,7 @@ class SiteTest extends MediaWikiTestCase {
$this->assertEquals( '', $site->getProtocol() );
}
- public function provideGetPageUrl() {
+ public static function provideGetPageUrl() {
//NOTE: the assumption that the URL is built by replacing $1
// with the urlencoded version of $page
// is true for Site but not guaranteed for subclasses.
@@ -228,6 +255,7 @@ class SiteTest extends MediaWikiTestCase {
/**
* @dataProvider provideGetPageUrl
+ * @covers Site::getPageUrl
*/
public function testGetPageUrl( $path, $page, $expected ) {
$site = new Site();
@@ -252,6 +280,8 @@ class SiteTest extends MediaWikiTestCase {
/**
* @dataProvider instanceProvider
* @param Site $site
+ * @covers Site::serialize
+ * @covers Site::unserialize
*/
public function testSerialization( Site $site ) {
$this->assertInstanceOf( 'Serializable', $site );
@@ -263,5 +293,4 @@ class SiteTest extends MediaWikiTestCase {
$this->assertEquals( $serialization, serialize( $newInstance ) );
}
-
}
diff --git a/tests/phpunit/includes/site/TestSites.php b/tests/phpunit/includes/site/TestSites.php
index a5656a73..f224b7d7 100644
--- a/tests/phpunit/includes/site/TestSites.php
+++ b/tests/phpunit/includes/site/TestSites.php
@@ -97,5 +97,4 @@ class TestSites {
$sitesTable->clear();
$sitesTable->saveSites( TestSites::getSites() );
}
-
}
diff --git a/tests/phpunit/includes/specials/QueryAllSpecialPagesTest.php b/tests/phpunit/includes/specials/QueryAllSpecialPagesTest.php
index 3b82e07d..a806b4ac 100644
--- a/tests/phpunit/includes/specials/QueryAllSpecialPagesTest.php
+++ b/tests/phpunit/includes/specials/QueryAllSpecialPagesTest.php
@@ -51,7 +51,7 @@ class QueryAllSpecialPagesTest extends MediaWikiTestCase {
* Test SQL for each of our QueryPages objects
* @group Database
*/
- function testQuerypageSqlQuery() {
+ public function testQuerypageSqlQuery() {
global $wgDBtype;
foreach ( $this->queryPages as $page ) {
diff --git a/tests/phpunit/includes/specials/SpecialPreferencesTest.php b/tests/phpunit/includes/specials/SpecialPreferencesTest.php
new file mode 100644
index 00000000..6c637c65
--- /dev/null
+++ b/tests/phpunit/includes/specials/SpecialPreferencesTest.php
@@ -0,0 +1,60 @@
+<?php
+/**
+ * Test class for SpecialPreferences class.
+ *
+ * Copyright © 2013, Antoine Musso
+ * Copyright © 2013, Wikimedia Foundation Inc.
+ *
+ */
+
+class SpecialPreferencesTest extends MediaWikiTestCase {
+
+ /**
+ * Make sure a nickname which is longer than $wgMaxSigChars
+ * is not throwing a fatal error.
+ *
+ * Test specifications by Alexandre "ialex" Emsenhuber.
+ */
+ public function testBug41337() {
+
+ // Set a low limit
+ $this->setMwGlobals( 'wgMaxSigChars', 2 );
+
+ $user = $this->getMock( 'User' );
+ $user->expects( $this->any() )
+ ->method( 'isAnon' )
+ ->will( $this->returnValue( false ) );
+
+ # Yeah foreach requires an array, not NULL =(
+ $user->expects( $this->any() )
+ ->method( 'getEffectiveGroups' )
+ ->will( $this->returnValue( array() ) );
+
+ # The mocked user has a long nickname
+ $user->expects( $this->any() )
+ ->method( 'getOption' )
+ ->will( $this->returnValueMap( array(
+ array( 'nickname', null, false, 'superlongnickname' ),
+ )
+ ) );
+
+ # Validate the mock (FIXME should probably be removed)
+ $this->assertFalse( $user->isAnon() );
+ $this->assertEquals( array(),
+ $user->getEffectiveGroups() );
+ $this->assertEquals( 'superlongnickname',
+ $user->getOption( 'nickname' ) );
+
+ # Forge a request to call the special page
+ $context = new RequestContext();
+ $context->setRequest( new FauxRequest() );
+ $context->setUser( $user );
+ $context->setTitle( Title::newFromText( 'Test' ) );
+
+ # Do the call, should not spurt a fatal error.
+ $special = new SpecialPreferences();
+ $special->setContext( $context );
+ $special->execute( array() );
+ }
+
+}
diff --git a/tests/phpunit/includes/specials/SpecialRecentchangesTest.php b/tests/phpunit/includes/specials/SpecialRecentchangesTest.php
index add830b0..436eb2e2 100644
--- a/tests/phpunit/includes/specials/SpecialRecentchangesTest.php
+++ b/tests/phpunit/includes/specials/SpecialRecentchangesTest.php
@@ -42,7 +42,6 @@ class SpecialRecentchangesTest extends MediaWikiTestCase {
/** return false if condition begin with 'rc_timestamp ' */
private static function filterOutRcTimestampCondition( $var ) {
return ( false === strpos( $var, 'rc_timestamp ' ) );
-
}
public function testRcNsFilter() {
@@ -123,5 +122,4 @@ class SpecialRecentchangesTest extends MediaWikiTestCase {
array( NS_TALK, NS_MAIN ),
);
}
-
}
diff --git a/tests/phpunit/includes/specials/SpecialSearchTest.php b/tests/phpunit/includes/specials/SpecialSearchTest.php
index f5ef0fb7..17e883fd 100644
--- a/tests/phpunit/includes/specials/SpecialSearchTest.php
+++ b/tests/phpunit/includes/specials/SpecialSearchTest.php
@@ -18,7 +18,7 @@ class SpecialSearchTest extends MediaWikiTestCase {
* @param $expectedProfile An expected search profile name
* @param $expectedNs Array Expected namespaces
*/
- function testProfileAndNamespaceLoading(
+ public function testProfileAndNamespaceLoading(
$requested, $userOptions, $expectedProfile, $expectedNS,
$message = 'Profile name and namespaces mismatches!'
) {
@@ -53,10 +53,9 @@ class SpecialSearchTest extends MediaWikiTestCase {
)
, $message
);
-
}
- function provideSearchOptionsTests() {
+ public static function provideSearchOptionsTests() {
$defaultNS = SearchEngine::defaultNamespaces();
$EMPTY_REQUEST = array();
$NO_USER_PREF = null;
@@ -105,6 +104,7 @@ class SpecialSearchTest extends MediaWikiTestCase {
foreach ( $opt as $name => $value ) {
$u->setOption( $name, $value );
}
+
return $u;
}
@@ -112,7 +112,7 @@ class SpecialSearchTest extends MediaWikiTestCase {
* Verify we do not expand search term in <title> on search result page
* https://gerrit.wikimedia.org/r/4841
*/
- function testSearchTermIsNotExpanded() {
+ public function testSearchTermIsNotExpanded() {
# Initialize [[Special::Search]]
$search = new SpecialSearch();
@@ -135,6 +135,5 @@ class SpecialSearchTest extends MediaWikiTestCase {
$pageTitle,
"Search term '{$term}' should not be expanded in Special:Search <title>"
);
-
}
}
diff --git a/tests/phpunit/includes/upload/UploadTest.php b/tests/phpunit/includes/upload/UploadBaseTest.php
index b809d320..982b46b2 100644
--- a/tests/phpunit/includes/upload/UploadTest.php
+++ b/tests/phpunit/includes/upload/UploadBaseTest.php
@@ -1,10 +1,12 @@
<?php
+
/**
* @group Upload
*/
-class UploadTest extends MediaWikiTestCase {
- protected $upload;
+class UploadBaseTest extends MediaWikiTestCase {
+ /** @var UploadTestHandler */
+ protected $upload;
protected function setUp() {
global $wgHooks;
@@ -30,6 +32,7 @@ class UploadTest extends MediaWikiTestCase {
* of UploadBase::getTitle() and then the actual returned title
*
* @dataProvider provideTestTitleValidation
+ * @covers UploadBase::getTitle
*/
public function testTitleValidation( $srcFilename, $dstFilename, $code, $msg ) {
/* Check the result code */
@@ -82,6 +85,7 @@ class UploadTest extends MediaWikiTestCase {
/**
* Test the upload verification functions
+ * @covers UploadBase::verifyUpload
*/
public function testVerifyUpload() {
/* Setup with zero file size */
@@ -108,7 +112,6 @@ class UploadTest extends MediaWikiTestCase {
*
* This method should be abstracted so we can test different settings.
*/
-
public function testMaxUploadSize() {
global $wgMaxUploadSize;
$savedGlobal = $wgMaxUploadSize; // save global
@@ -130,15 +133,15 @@ class UploadTest extends MediaWikiTestCase {
}
class UploadTestHandler extends UploadBase {
- public function initializeFromRequest( &$request ) {}
+ public function initializeFromRequest( &$request ) {
+ }
public function testTitleValidation( $name ) {
$this->mTitle = false;
$this->mDesiredDestName = $name;
$this->mTitleError = UploadBase::OK;
$this->getTitle();
+
return $this->mTitleError;
}
-
-
}
diff --git a/tests/phpunit/includes/upload/UploadFromUrlTest.php b/tests/phpunit/includes/upload/UploadFromUrlTest.php
index 4d2d8ce3..a75fba69 100644
--- a/tests/phpunit/includes/upload/UploadFromUrlTest.php
+++ b/tests/phpunit/includes/upload/UploadFromUrlTest.php
@@ -6,14 +6,14 @@
* @group Database
*/
class UploadFromUrlTest extends ApiTestCase {
-
protected function setUp() {
- global $wgEnableUploads, $wgAllowCopyUploads, $wgAllowAsyncCopyUploads;
parent::setUp();
- $wgEnableUploads = true;
- $wgAllowCopyUploads = true;
- $wgAllowAsyncCopyUploads = true;
+ $this->setMwGlobals( array(
+ 'wgEnableUploads' => true,
+ 'wgAllowCopyUploads' => true,
+ 'wgAllowAsyncCopyUploads' => true,
+ ) );
wfSetupSession();
if ( wfLocalFile( 'UploadFromUrlTest.png' )->exists() ) {
@@ -30,6 +30,7 @@ class UploadFromUrlTest extends ApiTestCase {
$module->execute();
wfSetupSession( $sessionId );
+
return array( $module->getResultData(), $req );
}
@@ -174,7 +175,6 @@ class UploadFromUrlTest extends ApiTestCase {
$this->user->addGroup( 'users' );
-
$data = $this->doAsyncUpload( $token );
$this->assertEquals( $data[0]['upload']['result'], 'Warning' );
@@ -235,7 +235,7 @@ class UploadFromUrlTest extends ApiTestCase {
$this->assertFalse( (bool)$talk->getArticleID( Title::GAID_FOR_UPDATE ), 'User talk does not exist' );
- $data = $this->doApiRequest( array(
+ $this->doApiRequest( array(
'action' => 'upload',
'filename' => 'UploadFromUrlTest.png',
'url' => 'http://bits.wikimedia.org/skins-1.5/common/images/poweredby_mediawiki_88x31.png',
@@ -259,7 +259,7 @@ class UploadFromUrlTest extends ApiTestCase {
$exception = false;
try {
- $data = $this->doApiRequest( array(
+ $this->doApiRequest( array(
'action' => 'upload',
'filename' => 'UploadFromUrlTest.png',
'url' => 'http://bits.wikimedia.org/skins-1.5/common/images/poweredby_mediawiki_88x31.png',
@@ -277,7 +277,6 @@ class UploadFromUrlTest extends ApiTestCase {
$this->assertFalse( $job );
return;
-
/*
// Broken until using leavemessage with ignorewarnings is supported
$job->run();
@@ -330,7 +329,6 @@ class UploadFromUrlTest extends ApiTestCase {
return $data;
}
-
/**
*
*/
diff --git a/tests/phpunit/includes/upload/UploadStashTest.php b/tests/phpunit/includes/upload/UploadStashTest.php
index 8fcaa214..7a0fea48 100644
--- a/tests/phpunit/includes/upload/UploadStashTest.php
+++ b/tests/phpunit/includes/upload/UploadStashTest.php
@@ -44,8 +44,7 @@ class UploadStashTest extends MediaWikiTestCase {
}
public function testBug29408() {
- global $wgUser;
- $wgUser = self::$users['uploader']->user;
+ $this->setMwGlobals( 'wgUser', self::$users['uploader']->user );
$repo = RepoGroup::singleton()->getLocalRepo();
$stash = new UploadStash( $repo );
diff --git a/tests/phpunit/install-phpunit.sh b/tests/phpunit/install-phpunit.sh
index 36012748..1f602935 100644
--- a/tests/phpunit/install-phpunit.sh
+++ b/tests/phpunit/install-phpunit.sh
@@ -8,7 +8,7 @@ has_binary () {
}
if [ `id -u` -ne 0 ]; then
- echo '*** ERROR' Must be root to run
+ echo '*** ERROR: Must be root to run'
exit 1
fi
diff --git a/tests/phpunit/languages/LanguageAmTest.php b/tests/phpunit/languages/LanguageAmTest.php
index 9723e1e3..a644f5e0 100644
--- a/tests/phpunit/languages/LanguageAmTest.php
+++ b/tests/phpunit/languages/LanguageAmTest.php
@@ -7,14 +7,24 @@
/** Tests for MediaWiki languages/LanguageAm.php */
class LanguageAmTest extends LanguageClassesTestCase {
-
- /** @dataProvider providePlural */
- function testPlural( $result, $value ) {
+ /**
+ * @dataProvider providePlural
+ * @covers Language::convertPlural
+ */
+ public function testPlural( $result, $value ) {
$forms = array( 'one', 'other' );
$this->assertEquals( $result, $this->getLang()->convertPlural( $value, $forms ) );
}
- function providePlural() {
+ /**
+ * @dataProvider providePlural
+ * @covers Language::getPluralRuleType
+ */
+ public function testGetPluralRuleType( $result, $value ) {
+ $this->assertEquals( $result, $this->getLang()->getPluralRuleType( $value ) );
+ }
+
+ public static function providePlural() {
return array(
array( 'one', 0 ),
array( 'one', 1 ),
diff --git a/tests/phpunit/languages/LanguageArTest.php b/tests/phpunit/languages/LanguageArTest.php
index 523ee7f6..7b48f236 100644
--- a/tests/phpunit/languages/LanguageArTest.php
+++ b/tests/phpunit/languages/LanguageArTest.php
@@ -6,8 +6,11 @@
/** Tests for MediaWiki languages/LanguageAr.php */
class LanguageArTest extends LanguageClassesTestCase {
-
- function testFormatNum() {
+ /**
+ * @covers Language::formatNum
+ * @todo split into a test and a dataprovider
+ */
+ public function testFormatNum() {
$this->assertEquals( '١٬٢٣٤٬٥٦٧', $this->getLang()->formatNum( '1234567' ) );
$this->assertEquals( '-١٢٫٨٩', $this->getLang()->formatNum( -12.89 ) );
}
@@ -15,12 +18,13 @@ class LanguageArTest extends LanguageClassesTestCase {
/**
* Mostly to test the raw ascii feature.
* @dataProvider providerSprintfDate
+ * @covers Language::sprintfDate
*/
- function testSprintfDate( $format, $date, $expected ) {
+ public function testSprintfDate( $format, $date, $expected ) {
$this->assertEquals( $expected, $this->getLang()->sprintfDate( $format, $date ) );
}
- function providerSprintfDate() {
+ public static function providerSprintfDate() {
return array(
array(
'xg "vs" g',
@@ -45,13 +49,24 @@ class LanguageArTest extends LanguageClassesTestCase {
);
}
- /** @dataProvider providePlural */
- function testPlural( $result, $value ) {
+ /**
+ * @dataProvider providePlural
+ * @covers Language::convertPlural
+ */
+ public function testPlural( $result, $value ) {
$forms = array( 'zero', 'one', 'two', 'few', 'many', 'other' );
$this->assertEquals( $result, $this->getLang()->convertPlural( $value, $forms ) );
}
- function providePlural() {
+ /**
+ * @dataProvider providePlural
+ * @covers Language::getPluralRuleType
+ */
+ public function testGetPluralRuleType( $result, $value ) {
+ $this->assertEquals( $result, $this->getLang()->getPluralRuleType( $value ) );
+ }
+
+ public static function providePlural() {
return array(
array( 'zero', 0 ),
array( 'one', 1 ),
diff --git a/tests/phpunit/languages/LanguageBeTest.php b/tests/phpunit/languages/LanguageBeTest.php
index 0144941b..7bd586af 100644
--- a/tests/phpunit/languages/LanguageBeTest.php
+++ b/tests/phpunit/languages/LanguageBeTest.php
@@ -7,14 +7,24 @@
/** Tests for MediaWiki languages/LanguageBe.php */
class LanguageBeTest extends LanguageClassesTestCase {
-
- /** @dataProvider providePlural */
- function testPlural( $result, $value ) {
+ /**
+ * @dataProvider providePlural
+ * @covers Language::convertPlural
+ */
+ public function testPlural( $result, $value ) {
$forms = array( 'one', 'few', 'many', 'other' );
$this->assertEquals( $result, $this->getLang()->convertPlural( $value, $forms ) );
}
- function providePlural() {
+ /**
+ * @dataProvider providePlural
+ * @covers Language::getPluralRuleType
+ */
+ public function testGetPluralRuleType( $result, $value ) {
+ $this->assertEquals( $result, $this->getLang()->getPluralRuleType( $value ) );
+ }
+
+ public static function providePlural() {
return array(
array( 'one', 1 ),
array( 'many', 11 ),
diff --git a/tests/phpunit/languages/LanguageBe_taraskTest.php b/tests/phpunit/languages/LanguageBe_taraskTest.php
index 5b246d8e..d5822f4a 100644
--- a/tests/phpunit/languages/LanguageBe_taraskTest.php
+++ b/tests/phpunit/languages/LanguageBe_taraskTest.php
@@ -1,20 +1,22 @@
<?php
class LanguageBe_taraskTest extends LanguageClassesTestCase {
-
/**
* Make sure the language code we are given is indeed
* be-tarask. This is to ensure LanguageClassesTestCase
* does not give us the wrong language.
*/
- function testBeTaraskTestsUsesBeTaraskCode() {
+ public function testBeTaraskTestsUsesBeTaraskCode() {
$this->assertEquals( 'be-tarask',
$this->getLang()->getCode()
);
}
- /** see bug 23156 & r64981 */
- function testSearchRightSingleQuotationMarkAsApostroph() {
+ /**
+ * @see bug 23156 & r64981
+ * @covers Language::commafy
+ */
+ public function testSearchRightSingleQuotationMarkAsApostroph() {
$this->assertEquals(
"'",
$this->getLang()->normalizeForSearch( '’' ),
@@ -22,24 +24,41 @@ class LanguageBe_taraskTest extends LanguageClassesTestCase {
);
}
- /** see bug 23156 & r64981 */
- function testCommafy() {
+ /**
+ * @see bug 23156 & r64981
+ * @covers Language::commafy
+ */
+ public function testCommafy() {
$this->assertEquals( '1,234,567', $this->getLang()->commafy( '1234567' ) );
$this->assertEquals( '12,345', $this->getLang()->commafy( '12345' ) );
}
- /** see bug 23156 & r64981 */
- function testDoesNotCommafyFourDigitsNumber() {
+ /**
+ * @see bug 23156 & r64981
+ * @covers Language::commafy
+ */
+ public function testDoesNotCommafyFourDigitsNumber() {
$this->assertEquals( '1234', $this->getLang()->commafy( '1234' ) );
}
- /** @dataProvider providePluralFourForms */
- function testPluralFourForms( $result, $value ) {
+ /**
+ * @dataProvider providePlural
+ * @covers Language::convertPlural
+ */
+ public function testPlural( $result, $value ) {
$forms = array( 'one', 'few', 'many', 'other' );
$this->assertEquals( $result, $this->getLang()->convertPlural( $value, $forms ) );
}
- function providePluralFourForms() {
+ /**
+ * @dataProvider providePlural
+ * @covers Language::getPluralRuleType
+ */
+ public function testGetPluralRuleType( $result, $value ) {
+ $this->assertEquals( $result, $this->getLang()->getPluralRuleType( $value ) );
+ }
+
+ public static function providePlural() {
return array(
array( 'one', 1 ),
array( 'many', 11 ),
@@ -55,19 +74,21 @@ class LanguageBe_taraskTest extends LanguageClassesTestCase {
);
}
- /** @dataProvider providePluralTwoForms */
- function testPluralTwoForms( $result, $value ) {
- $forms = array( 'one', 'several' );
+ /**
+ * @dataProvider providePluralTwoForms
+ * @covers Language::convertPlural
+ */
+ public function testPluralTwoForms( $result, $value ) {
+ $forms = array( 'one', 'other' );
$this->assertEquals( $result, $this->getLang()->convertPlural( $value, $forms ) );
}
- function providePluralTwoForms() {
+ public static function providePluralTwoForms() {
return array(
array( 'one', 1 ),
- array( 'several', 11 ),
- array( 'several', 91 ),
- array( 'several', 121 ),
+ array( 'other', 11 ),
+ array( 'other', 91 ),
+ array( 'other', 121 ),
);
}
-
}
diff --git a/tests/phpunit/languages/LanguageBhoTest.php b/tests/phpunit/languages/LanguageBhoTest.php
index c364917d..187bfbbc 100644
--- a/tests/phpunit/languages/LanguageBhoTest.php
+++ b/tests/phpunit/languages/LanguageBhoTest.php
@@ -7,14 +7,24 @@
/** Tests for MediaWiki languages/LanguageBho.php */
class LanguageBhoTest extends LanguageClassesTestCase {
-
- /** @dataProvider providePlural */
- function testPlural( $result, $value ) {
+ /**
+ * @dataProvider providePlural
+ * @covers Language::convertPlural
+ */
+ public function testPlural( $result, $value ) {
$forms = array( 'one', 'other' );
$this->assertEquals( $result, $this->getLang()->convertPlural( $value, $forms ) );
}
- function providePlural() {
+ /**
+ * @dataProvider providePlural
+ * @covers Language::getPluralRuleType
+ */
+ public function testGetPluralRuleType( $result, $value ) {
+ $this->assertEquals( $result, $this->getLang()->getPluralRuleType( $value ) );
+ }
+
+ public static function providePlural() {
return array(
array( 'one', 0 ),
array( 'one', 1 ),
@@ -22,5 +32,4 @@ class LanguageBhoTest extends LanguageClassesTestCase {
array( 'other', 200 ),
);
}
-
}
diff --git a/tests/phpunit/languages/LanguageBsTest.php b/tests/phpunit/languages/LanguageBsTest.php
index 76d00704..fb965b89 100644
--- a/tests/phpunit/languages/LanguageBsTest.php
+++ b/tests/phpunit/languages/LanguageBsTest.php
@@ -7,14 +7,24 @@
/** Tests for MediaWiki languages/LanguageBs.php */
class LanguageBsTest extends LanguageClassesTestCase {
-
- /** @dataProvider providePlural */
- function testPlural( $result, $value ) {
+ /**
+ * @dataProvider providePlural
+ * @covers Language::convertPlural
+ */
+ public function testPlural( $result, $value ) {
$forms = array( 'one', 'few', 'many', 'other' );
$this->assertEquals( $result, $this->getLang()->convertPlural( $value, $forms ) );
}
- function providePlural() {
+ /**
+ * @dataProvider providePlural
+ * @covers Language::getPluralRuleType
+ */
+ public function testGetPluralRuleType( $result, $value ) {
+ $this->assertEquals( $result, $this->getLang()->getPluralRuleType( $value ) );
+ }
+
+ public static function providePlural() {
return array(
array( 'many', 0 ),
array( 'one', 1 ),
@@ -29,5 +39,4 @@ class LanguageBsTest extends LanguageClassesTestCase {
array( 'many', 200 ),
);
}
-
}
diff --git a/tests/phpunit/languages/LanguageClassesTestCase.php b/tests/phpunit/languages/LanguageClassesTestCase.php
index 6659dad1..632e037f 100644
--- a/tests/phpunit/languages/LanguageClassesTestCase.php
+++ b/tests/phpunit/languages/LanguageClassesTestCase.php
@@ -3,16 +3,7 @@
* Helping class to run tests using a clean language instance.
*
* This is intended for the MediaWiki language class tests under
- * tests/phpunit/languages. You simply need to extends this test
- * and set it up with a language code using setUpBeforeClass:
- *
- * @par Setting up a language:
- * @code
- * class LanguageFooTest extends LanguageClassesTestCase {
- * public static function setUpBeforeClass() {
- * self::setLang( 'Foo' );
- * }
- * @endcode
+ * tests/phpunit/languages.
*
* Before each tests, a new language object is build which you
* can retrieve in your test using the $this->getLang() method:
@@ -28,19 +19,6 @@
* @endcode
*/
abstract class LanguageClassesTestCase extends MediaWikiTestCase {
-
- /**
- * Regex used to find out the language code out of the class name
- * used by setUpBeforeClass
- */
- private static $reExtractLangFromClass = '/Language(.*)Test/';
-
- /**
- * Hold the language code we are going to use. This is extracted
- * directly from the extending class.
- */
- private static $LanguageClassCode;
-
/**
* Internal language object
*
@@ -57,9 +35,19 @@ abstract class LanguageClassesTestCase extends MediaWikiTestCase {
*/
private $languageObject;
- public static function setUpBeforeClass() {
- $found = preg_match( self::$reExtractLangFromClass,
- get_called_class(), $m );
+ /**
+ * @return Language
+ */
+ protected function getLang() {
+ return $this->languageObject;
+ }
+
+ /**
+ * Create a new language object before each test.
+ */
+ protected function setUp() {
+ parent::setUp();
+ $found = preg_match( '/Language(.+)Test/', get_called_class(), $m );
if ( $found ) {
# Normalize language code since classes uses underscores
$m[1] = str_replace( '_', '-', $m[1] );
@@ -71,21 +59,8 @@ abstract class LanguageClassesTestCase extends MediaWikiTestCase {
. "out of " . get_called_class() . " failling back to 'en'\n"
);
}
- // TODO: validate $m[1] which should be a valid language code
- self::$LanguageClassCode = $m[1];
- }
-
- protected function getLang() {
- return $this->languageObject;
- }
-
- /**
- * Create a new language object before each test.
- */
- protected function setUp() {
- parent::setUp();
- $this->languageObject = Language::factory(
- self::$LanguageClassCode );
+ // @todo validate $m[1] which should be a valid language code
+ $this->languageObject = Language::factory( $m[1] );
}
/**
@@ -96,5 +71,4 @@ abstract class LanguageClassesTestCase extends MediaWikiTestCase {
unset( $this->languageObject );
parent::tearDown();
}
-
}
diff --git a/tests/phpunit/languages/LanguageCsTest.php b/tests/phpunit/languages/LanguageCsTest.php
index 884a129e..da9e6b88 100644
--- a/tests/phpunit/languages/LanguageCsTest.php
+++ b/tests/phpunit/languages/LanguageCsTest.php
@@ -7,14 +7,24 @@
/** Tests for MediaWiki languages/classes/Languagecs.php */
class LanguageCsTest extends LanguageClassesTestCase {
-
- /** @dataProvider providerPlural */
- function testPlural( $result, $value ) {
+ /**
+ * @dataProvider providePlural
+ * @covers Language::convertPlural
+ */
+ public function testPlural( $result, $value ) {
$forms = array( 'one', 'few', 'other' );
$this->assertEquals( $result, $this->getLang()->convertPlural( $value, $forms ) );
}
- function providerPlural() {
+ /**
+ * @dataProvider providePlural
+ * @covers Language::getPluralRuleType
+ */
+ public function testGetPluralRuleType( $result, $value ) {
+ $this->assertEquals( $result, $this->getLang()->getPluralRuleType( $value ) );
+ }
+
+ public static function providePlural() {
return array(
array( 'other', 0 ),
array( 'one', 1 ),
@@ -28,5 +38,4 @@ class LanguageCsTest extends LanguageClassesTestCase {
array( 'other', 200 ),
);
}
-
}
diff --git a/tests/phpunit/languages/LanguageCuTest.php b/tests/phpunit/languages/LanguageCuTest.php
index e2394b35..07193172 100644
--- a/tests/phpunit/languages/LanguageCuTest.php
+++ b/tests/phpunit/languages/LanguageCuTest.php
@@ -7,27 +7,36 @@
/** Tests for MediaWiki languages/LanguageCu.php */
class LanguageCuTest extends LanguageClassesTestCase {
-
- /** @dataProvider providerPlural */
- function testPlural( $result, $value ) {
- $forms = array( 'one', 'few', 'many', 'other' );
+ /**
+ * @dataProvider providePlural
+ * @covers Language::convertPlural
+ */
+ public function testPlural( $result, $value ) {
+ $forms = array( 'one', 'two', 'few', 'other' );
$this->assertEquals( $result, $this->getLang()->convertPlural( $value, $forms ) );
}
- function providerPlural() {
+ /**
+ * @dataProvider providePlural
+ * @covers Language::getPluralRuleType
+ */
+ public function testGetPluralRuleType( $result, $value ) {
+ $this->assertEquals( $result, $this->getLang()->getPluralRuleType( $value ) );
+ }
+
+ public static function providePlural() {
return array(
array( 'other', 0 ),
array( 'one', 1 ),
- array( 'few', 2 ),
- array( 'many', 3 ),
- array( 'many', 4 ),
+ array( 'two', 2 ),
+ array( 'few', 3 ),
+ array( 'few', 4 ),
array( 'other', 5 ),
array( 'one', 11 ),
array( 'other', 20 ),
- array( 'few', 22 ),
- array( 'many', 223 ),
+ array( 'two', 22 ),
+ array( 'few', 223 ),
array( 'other', 200 ),
);
}
-
}
diff --git a/tests/phpunit/languages/LanguageCyTest.php b/tests/phpunit/languages/LanguageCyTest.php
index 2a7f4a92..eaf663a8 100644
--- a/tests/phpunit/languages/LanguageCyTest.php
+++ b/tests/phpunit/languages/LanguageCyTest.php
@@ -7,14 +7,24 @@
/** Tests for MediaWiki languages/classes/LanguageCy.php */
class LanguageCyTest extends LanguageClassesTestCase {
-
- /** @dataProvider providerPlural */
- function testPlural( $result, $value ) {
+ /**
+ * @dataProvider providePlural
+ * @covers Language::convertPlural
+ */
+ public function testPlural( $result, $value ) {
$forms = array( 'zero', 'one', 'two', 'few', 'many', 'other' );
$this->assertEquals( $result, $this->getLang()->convertPlural( $value, $forms ) );
}
- function providerPlural() {
+ /**
+ * @dataProvider providePlural
+ * @covers Language::getPluralRuleType
+ */
+ public function testGetPluralRuleType( $result, $value ) {
+ $this->assertEquals( $result, $this->getLang()->getPluralRuleType( $value ) );
+ }
+
+ public static function providePlural() {
return array(
array( 'zero', 0 ),
array( 'one', 1 ),
@@ -30,5 +40,4 @@ class LanguageCyTest extends LanguageClassesTestCase {
array( 'other', 200.00 ),
);
}
-
}
diff --git a/tests/phpunit/languages/LanguageDsbTest.php b/tests/phpunit/languages/LanguageDsbTest.php
index 285ce648..94c11bcc 100644
--- a/tests/phpunit/languages/LanguageDsbTest.php
+++ b/tests/phpunit/languages/LanguageDsbTest.php
@@ -7,14 +7,24 @@
/** Tests for MediaWiki languages/classes/LanguageDsb.php */
class LanguageDsbTest extends LanguageClassesTestCase {
-
- /** @dataProvider providePlural */
- function testPlural( $result, $value ) {
+ /**
+ * @dataProvider providePlural
+ * @covers Language::convertPlural
+ */
+ public function testPlural( $result, $value ) {
$forms = array( 'one', 'two', 'few', 'other' );
$this->assertEquals( $result, $this->getLang()->convertPlural( $value, $forms ) );
}
- function providePlural() {
+ /**
+ * @dataProvider providePlural
+ * @covers Language::getPluralRuleType
+ */
+ public function testGetPluralRuleType( $result, $value ) {
+ $this->assertEquals( $result, $this->getLang()->getPluralRuleType( $value ) );
+ }
+
+ public static function providePlural() {
return array(
array( 'other', 0 ),
array( 'one', 1 ),
@@ -28,5 +38,4 @@ class LanguageDsbTest extends LanguageClassesTestCase {
array( 'other', 555 ),
);
}
-
}
diff --git a/tests/phpunit/languages/LanguageFrTest.php b/tests/phpunit/languages/LanguageFrTest.php
index faf0de58..46b65011 100644
--- a/tests/phpunit/languages/LanguageFrTest.php
+++ b/tests/phpunit/languages/LanguageFrTest.php
@@ -7,14 +7,24 @@
/** Tests for MediaWiki languages/classes/LanguageFr.php */
class LanguageFrTest extends LanguageClassesTestCase {
-
- /** @dataProvider providePlural */
- function testPlural( $result, $value ) {
+ /**
+ * @dataProvider providePlural
+ * @covers Language::convertPlural
+ */
+ public function testPlural( $result, $value ) {
$forms = array( 'one', 'other' );
$this->assertEquals( $result, $this->getLang()->convertPlural( $value, $forms ) );
}
- function providePlural() {
+ /**
+ * @dataProvider providePlural
+ * @covers Language::getPluralRuleType
+ */
+ public function testGetPluralRuleType( $result, $value ) {
+ $this->assertEquals( $result, $this->getLang()->getPluralRuleType( $value ) );
+ }
+
+ public static function providePlural() {
return array(
array( 'one', 0 ),
array( 'one', 1 ),
@@ -22,5 +32,4 @@ class LanguageFrTest extends LanguageClassesTestCase {
array( 'other', 200 ),
);
}
-
}
diff --git a/tests/phpunit/languages/LanguageGaTest.php b/tests/phpunit/languages/LanguageGaTest.php
index 2dbb088b..c009f56b 100644
--- a/tests/phpunit/languages/LanguageGaTest.php
+++ b/tests/phpunit/languages/LanguageGaTest.php
@@ -7,14 +7,24 @@
/** Tests for MediaWiki languages/classes/LanguageGa.php */
class LanguageGaTest extends LanguageClassesTestCase {
-
- /** @dataProvider providerPlural */
- function testPlural( $result, $value ) {
+ /**
+ * @dataProvider providePlural
+ * @covers Language::convertPlural
+ */
+ public function testPlural( $result, $value ) {
$forms = array( 'one', 'two', 'other' );
$this->assertEquals( $result, $this->getLang()->convertPlural( $value, $forms ) );
}
- function providerPlural() {
+ /**
+ * @dataProvider providePlural
+ * @covers Language::getPluralRuleType
+ */
+ public function testGetPluralRuleType( $result, $value ) {
+ $this->assertEquals( $result, $this->getLang()->getPluralRuleType( $value ) );
+ }
+
+ public static function providePlural() {
return array(
array( 'other', 0 ),
array( 'one', 1 ),
@@ -22,5 +32,4 @@ class LanguageGaTest extends LanguageClassesTestCase {
array( 'other', 200 ),
);
}
-
}
diff --git a/tests/phpunit/languages/LanguageGdTest.php b/tests/phpunit/languages/LanguageGdTest.php
index 5de1e9d2..0b2612b2 100644
--- a/tests/phpunit/languages/LanguageGdTest.php
+++ b/tests/phpunit/languages/LanguageGdTest.php
@@ -7,15 +7,17 @@
/** Tests for MediaWiki languages/classes/LanguageGd.php */
class LanguageGdTest extends LanguageClassesTestCase {
-
- /** @dataProvider providerPlural */
- function testPlural( $result, $value ) {
+ /**
+ * @dataProvider providerPlural
+ * @covers Language::convertPlural
+ */
+ public function testPlural( $result, $value ) {
$forms = array( 'one', 'two', 'few', 'other' );
$this->assertEquals( $result, $this->getLang()->convertPlural( $value, $forms ) );
}
- function providerPlural() {
- return array (
+ public static function providerPlural() {
+ return array(
array( 'other', 0 ),
array( 'one', 1 ),
array( 'two', 2 ),
@@ -27,22 +29,25 @@ class LanguageGdTest extends LanguageClassesTestCase {
);
}
- /** @dataProvider providerPluralExplicit */
- function testExplicitPlural( $result, $value ) {
+ /**
+ * @dataProvider providerPluralExplicit
+ * @covers Language::convertPlural
+ */
+ public function testExplicitPlural( $result, $value ) {
$forms = array( 'one', 'two', 'few', 'other', '11=Form11', '12=Form12' );
$this->assertEquals( $result, $this->getLang()->convertPlural( $value, $forms ) );
}
- function providerPluralExplicit() {
- return array (
- array( 'other', 0 ),
- array( 'one', 1 ),
- array( 'two', 2 ),
- array( 'Form11', 11 ),
- array( 'Form12', 12 ),
- array( 'few', 3 ),
- array( 'few', 19 ),
- array( 'other', 200 ),
+ public static function providerPluralExplicit() {
+ return array(
+ array( 'other', 0 ),
+ array( 'one', 1 ),
+ array( 'two', 2 ),
+ array( 'Form11', 11 ),
+ array( 'Form12', 12 ),
+ array( 'few', 3 ),
+ array( 'few', 19 ),
+ array( 'other', 200 ),
);
}
}
diff --git a/tests/phpunit/languages/LanguageGvTest.php b/tests/phpunit/languages/LanguageGvTest.php
index 4126e071..a0def628 100644
--- a/tests/phpunit/languages/LanguageGvTest.php
+++ b/tests/phpunit/languages/LanguageGvTest.php
@@ -7,15 +7,27 @@
/** Tests for MediaWiki languages/classes/LanguageGv.php */
class LanguageGvTest extends LanguageClassesTestCase {
-
- /** @dataProvider providerPlural */
- function testPlural( $result, $value ) {
+ /**
+ * @dataProvider providePlural
+ * @covers Language::convertPlural
+ */
+ public function testPlural( $result, $value ) {
// This is not compatible with CLDR plural rules http://unicode.org/repos/cldr-tmp/trunk/diff/supplemental/language_plural_rules.html#gv
+ // What does this mean? Is there a hard-coded override for gv somewhere? -Ryan Kaldari 2013-01-28
$forms = array( 'Form 1', 'Form 2', 'Form 3', 'Form 4' );
$this->assertEquals( $result, $this->getLang()->convertPlural( $value, $forms ) );
}
- function providerPlural() {
+ /**
+ * @dataProvider providePlural
+ * @covers Language::getPluralRuleType
+ */
+ public function testGetPluralRuleType( $result, $value ) {
+ $this->markTestSkipped( "This test won't work since convertPlural for gv doesn't seem to actually follow our plural rules." );
+ $this->assertEquals( $result, $this->getLang()->getPluralRuleType( $value ) );
+ }
+
+ public static function providePlural() {
return array(
array( 'Form 4', 0 ),
array( 'Form 2', 1 ),
@@ -28,5 +40,4 @@ class LanguageGvTest extends LanguageClassesTestCase {
array( 'Form 4', 50 ),
);
}
-
}
diff --git a/tests/phpunit/languages/LanguageHeTest.php b/tests/phpunit/languages/LanguageHeTest.php
index 6de88e59..8edc6ddf 100644
--- a/tests/phpunit/languages/LanguageHeTest.php
+++ b/tests/phpunit/languages/LanguageHeTest.php
@@ -7,70 +7,125 @@
/** Tests for MediaWiki languages/classes/LanguageHe.php */
class LanguageHeTest extends LanguageClassesTestCase {
+ /**
+ * The most common usage for the plural forms is two forms,
+ * for singular and plural. In this case, the second form
+ * is technically dual, but in practice it's used as plural.
+ * In some cases, usually with expressions of time, three forms
+ * are needed - singular, dual and plural.
+ * CLDR also specifies a fourth form for multiples of 10,
+ * which is very rare. It also has a mistake, because
+ * the number 10 itself is supposed to be just plural,
+ * so currently it's overridden in MediaWiki.
+ */
- /** @dataProvider providerPluralDual */
- function testPluralDual( $result, $value ) {
+ // @todo the below test*PluralForms test methods can be refactored
+ // to use a single test method and data provider..
+
+ /**
+ * @dataProvider provideTwoPluralForms
+ * @covers Language::convertPlural
+ */
+ public function testTwoPluralForms( $result, $value ) {
+ $forms = array( 'one', 'other' );
+ $this->assertEquals( $result, $this->getLang()->convertPlural( $value, $forms ) );
+ }
+
+ /**
+ * @dataProvider provideThreePluralForms
+ * @covers Language::convertPlural
+ */
+ public function testThreePluralForms( $result, $value ) {
$forms = array( 'one', 'two', 'other' );
$this->assertEquals( $result, $this->getLang()->convertPlural( $value, $forms ) );
}
- function providerPluralDual() {
+ /**
+ * @dataProvider provideFourPluralForms
+ * @covers Language::convertPlural
+ */
+ public function testFourPluralForms( $result, $value ) {
+ $forms = array( 'one', 'two', 'many', 'other' );
+ $this->assertEquals( $result, $this->getLang()->convertPlural( $value, $forms ) );
+ }
+
+ /**
+ * @dataProvider provideFourPluralForms
+ * @covers Language::convertPlural
+ */
+ public function testGetPluralRuleType( $result, $value ) {
+ $this->assertEquals( $result, $this->getLang()->getPluralRuleType( $value ) );
+ }
+
+ public static function provideTwoPluralForms() {
return array(
- array( 'other', 0 ), // Zero -> plural
+ array( 'other', 0 ), // Zero - plural
array( 'one', 1 ), // Singular
- array( 'two', 2 ), // Dual
- array( 'other', 3 ), // Plural
+ array( 'other', 2 ), // No third form provided, use it as plural
+ array( 'other', 3 ), // Plural - other
+ array( 'other', 10 ), // No fourth form provided, use it as plural
+ array( 'other', 20 ), // No fourth form provided, use it as plural
);
}
- /** @dataProvider providerPlural */
- function testPlural( $result, $value ) {
- $forms = array( 'one', 'other' );
- $this->assertEquals( $result, $this->getLang()->convertPlural( $value, $forms ) );
+ public static function provideThreePluralForms() {
+ return array(
+ array( 'other', 0 ), // Zero - plural
+ array( 'one', 1 ), // Singular
+ array( 'two', 2 ), // Dual
+ array( 'other', 3 ), // Plural - other
+ array( 'other', 10 ), // No fourth form provided, use it as plural
+ array( 'other', 20 ), // No fourth form provided, use it as plural
+ );
}
- function providerPlural() {
+ public static function provideFourPluralForms() {
return array(
- array( 'other', 0 ), // Zero -> plural
+ array( 'other', 0 ), // Zero - plural
array( 'one', 1 ), // Singular
- array( 'other', 2 ), // Plural, no dual provided
- array( 'other', 3 ), // Plural
+ array( 'two', 2 ), // Dual
+ array( 'other', 3 ), // Plural - other
+ array( 'other', 10 ), // 10 is supposed to be plural (other), not "many"
+ array( 'many', 20 ), // Fourth form provided - rare, but supported by CLDR
);
}
- /** @dataProvider providerGrammar */
- function testGrammar( $result, $word, $case ) {
+ /**
+ * @dataProvider provideGrammar
+ * @covers Language::convertGrammar
+ */
+ public function testGrammar( $result, $word, $case ) {
$this->assertEquals( $result, $this->getLang()->convertGrammar( $word, $case ) );
}
// The comments in the beginning of the line help avoid RTL problems
// with text editors.
- function providerGrammar() {
+ public static function provideGrammar() {
return array(
array(
- /* result */ 'וויקיפדיה',
- /* word */ 'ויקיפדיה',
- /* case */ 'תחילית',
+ /* result */'וויקיפדיה',
+ /* word */'ויקיפדיה',
+ /* case */'תחילית',
),
array(
- /* result */ 'וולפגנג',
- /* word */ 'וולפגנג',
- /* case */ 'prefixed',
+ /* result */'וולפגנג',
+ /* word */'וולפגנג',
+ /* case */'prefixed',
),
array(
- /* result */ 'קובץ',
- /* word */ 'הקובץ',
- /* case */ 'תחילית',
+ /* result */'קובץ',
+ /* word */'הקובץ',
+ /* case */'תחילית',
),
array(
- /* result */ 'Ö¾Wikipedia',
- /* word */ 'Wikipedia',
- /* case */ 'תחילית',
+ /* result */'Ö¾Wikipedia',
+ /* word */'Wikipedia',
+ /* case */'תחילית',
),
array(
- /* result */ 'Ö¾1995',
- /* word */ '1995',
- /* case */ 'תחילית',
+ /* result */'Ö¾1995',
+ /* word */'1995',
+ /* case */'תחילית',
),
);
}
diff --git a/tests/phpunit/languages/LanguageHiTest.php b/tests/phpunit/languages/LanguageHiTest.php
index 86d6af58..f6d2c9e9 100644
--- a/tests/phpunit/languages/LanguageHiTest.php
+++ b/tests/phpunit/languages/LanguageHiTest.php
@@ -7,14 +7,24 @@
/** Tests for MediaWiki languages/LanguageHi.php */
class LanguageHiTest extends LanguageClassesTestCase {
-
- /** @dataProvider providePlural */
- function testPlural( $result, $value ) {
+ /**
+ * @dataProvider providePlural
+ * @covers Language::convertPlural
+ */
+ public function testPlural( $result, $value ) {
$forms = array( 'one', 'other' );
$this->assertEquals( $result, $this->getLang()->convertPlural( $value, $forms ) );
}
- function providePlural() {
+ /**
+ * @dataProvider providePlural
+ * @covers Language::getPluralRuleType
+ */
+ public function testGetPluralRuleType( $result, $value ) {
+ $this->assertEquals( $result, $this->getLang()->getPluralRuleType( $value ) );
+ }
+
+ public static function providePlural() {
return array(
array( 'one', 0 ),
array( 'one', 1 ),
@@ -22,5 +32,4 @@ class LanguageHiTest extends LanguageClassesTestCase {
array( 'other', 200 ),
);
}
-
}
diff --git a/tests/phpunit/languages/LanguageHrTest.php b/tests/phpunit/languages/LanguageHrTest.php
index 9dce4ea7..6ce4aff9 100644
--- a/tests/phpunit/languages/LanguageHrTest.php
+++ b/tests/phpunit/languages/LanguageHrTest.php
@@ -7,14 +7,24 @@
/** Tests for MediaWiki languages/classes/LanguageHr.php */
class LanguageHrTest extends LanguageClassesTestCase {
-
- /** @dataProvider providerPlural */
- function testPlural( $result, $value ) {
+ /**
+ * @dataProvider providePlural
+ * @covers Language::convertPlural
+ */
+ public function testPlural( $result, $value ) {
$forms = array( 'one', 'few', 'many', 'other' );
$this->assertEquals( $result, $this->getLang()->convertPlural( $value, $forms ) );
}
- function providerPlural() {
+ /**
+ * @dataProvider providePlural
+ * @covers Language::getPluralRuleType
+ */
+ public function testGetPluralRuleType( $result, $value ) {
+ $this->assertEquals( $result, $this->getLang()->getPluralRuleType( $value ) );
+ }
+
+ public static function providePlural() {
return array(
array( 'many', 0 ),
array( 'one', 1 ),
@@ -29,5 +39,4 @@ class LanguageHrTest extends LanguageClassesTestCase {
array( 'many', 200 ),
);
}
-
}
diff --git a/tests/phpunit/languages/LanguageHsbTest.php b/tests/phpunit/languages/LanguageHsbTest.php
index bec7d819..f95a43bf 100644
--- a/tests/phpunit/languages/LanguageHsbTest.php
+++ b/tests/phpunit/languages/LanguageHsbTest.php
@@ -7,14 +7,24 @@
/** Tests for MediaWiki languages/classes/LanguageHsb.php */
class LanguageHsbTest extends LanguageClassesTestCase {
-
- /** @dataProvider providePlural */
- function testPlural( $result, $value ) {
+ /**
+ * @dataProvider providePlural
+ * @covers Language::convertPlural
+ */
+ public function testPlural( $result, $value ) {
$forms = array( 'one', 'two', 'few', 'other' );
$this->assertEquals( $result, $this->getLang()->convertPlural( $value, $forms ) );
}
- function providePlural() {
+ /**
+ * @dataProvider providePlural
+ * @covers Language::getPluralRuleType
+ */
+ public function testGetPluralRuleType( $result, $value ) {
+ $this->assertEquals( $result, $this->getLang()->getPluralRuleType( $value ) );
+ }
+
+ public static function providePlural() {
return array(
array( 'other', 0 ),
array( 'one', 1 ),
@@ -28,5 +38,4 @@ class LanguageHsbTest extends LanguageClassesTestCase {
array( 'other', 555 ),
);
}
-
}
diff --git a/tests/phpunit/languages/LanguageHuTest.php b/tests/phpunit/languages/LanguageHuTest.php
index 23d8e0ce..ee9197d7 100644
--- a/tests/phpunit/languages/LanguageHuTest.php
+++ b/tests/phpunit/languages/LanguageHuTest.php
@@ -7,14 +7,24 @@
/** Tests for MediaWiki languages/LanguageHu.php */
class LanguageHuTest extends LanguageClassesTestCase {
-
- /** @dataProvider providePlural */
- function testPlural( $result, $value ) {
+ /**
+ * @dataProvider providePlural
+ * @covers Language::convertPlural
+ */
+ public function testPlural( $result, $value ) {
$forms = array( 'one', 'other' );
$this->assertEquals( $result, $this->getLang()->convertPlural( $value, $forms ) );
}
- function providePlural() {
+ /**
+ * @dataProvider providePlural
+ * @covers Language::getPluralRuleType
+ */
+ public function testGetPluralRuleType( $result, $value ) {
+ $this->assertEquals( $result, $this->getLang()->getPluralRuleType( $value ) );
+ }
+
+ public static function providePlural() {
return array(
array( 'other', 0 ),
array( 'one', 1 ),
@@ -22,5 +32,4 @@ class LanguageHuTest extends LanguageClassesTestCase {
array( 'other', 200 ),
);
}
-
}
diff --git a/tests/phpunit/languages/LanguageHyTest.php b/tests/phpunit/languages/LanguageHyTest.php
index 7088d37b..896522b0 100644
--- a/tests/phpunit/languages/LanguageHyTest.php
+++ b/tests/phpunit/languages/LanguageHyTest.php
@@ -7,14 +7,25 @@
/** Tests for MediaWiki languages/LanguageHy.php */
class LanguageHyTest extends LanguageClassesTestCase {
-
- /** @dataProvider providerPlural */
- function testPlural( $result, $value ) {
+ /**
+ * @dataProvider providePlural
+ * @covers Language::convertPlural
+ */
+ public function testPlural( $result, $value ) {
$forms = array( 'one', 'other' );
$this->assertEquals( $result, $this->getLang()->convertPlural( $value, $forms ) );
}
- function providerPlural() {
+ /**
+ * @dataProvider providePlural
+ * @covers Language::getPluralRuleType
+ */
+ public function testGetPluralRuleType( $result, $value ) {
+ // This fails for 0, but I'm not sure why. Some voodoo going on here.
+ $this->assertEquals( $result, $this->getLang()->getPluralRuleType( $value ) );
+ }
+
+ public static function providePlural() {
return array(
array( 'other', 0 ),
array( 'one', 1 ),
@@ -22,5 +33,4 @@ class LanguageHyTest extends LanguageClassesTestCase {
array( 'other', 200 ),
);
}
-
}
diff --git a/tests/phpunit/languages/LanguageKshTest.php b/tests/phpunit/languages/LanguageKshTest.php
index 9b4a53ad..568a3780 100644
--- a/tests/phpunit/languages/LanguageKshTest.php
+++ b/tests/phpunit/languages/LanguageKshTest.php
@@ -7,14 +7,24 @@
/** Tests for MediaWiki languages/classes/LanguageKsh.php */
class LanguageKshTest extends LanguageClassesTestCase {
-
- /** @dataProvider providerPlural */
- function testPlural( $result, $value ) {
+ /**
+ * @dataProvider providePlural
+ * @covers Language::convertPlural
+ */
+ public function testPlural( $result, $value ) {
$forms = array( 'one', 'other', 'zero' );
$this->assertEquals( $result, $this->getLang()->convertPlural( $value, $forms ) );
}
- function providerPlural() {
+ /**
+ * @dataProvider providePlural
+ * @covers Language::getPluralRuleType
+ */
+ public function testGetPluralRuleType( $result, $value ) {
+ $this->assertEquals( $result, $this->getLang()->getPluralRuleType( $value ) );
+ }
+
+ public static function providePlural() {
return array(
array( 'zero', 0 ),
array( 'one', 1 ),
@@ -22,5 +32,4 @@ class LanguageKshTest extends LanguageClassesTestCase {
array( 'other', 200 ),
);
}
-
}
diff --git a/tests/phpunit/languages/LanguageLnTest.php b/tests/phpunit/languages/LanguageLnTest.php
index 669d8b0a..10b3234f 100644
--- a/tests/phpunit/languages/LanguageLnTest.php
+++ b/tests/phpunit/languages/LanguageLnTest.php
@@ -7,14 +7,24 @@
/** Tests for MediaWiki languages/classes/LanguageLn.php */
class LanguageLnTest extends LanguageClassesTestCase {
-
- /** @dataProvider providePlural */
- function testPlural( $result, $value ) {
+ /**
+ * @dataProvider providePlural
+ * @covers Language::convertPlural
+ */
+ public function testPlural( $result, $value ) {
$forms = array( 'one', 'other' );
$this->assertEquals( $result, $this->getLang()->convertPlural( $value, $forms ) );
}
- function providePlural() {
+ /**
+ * @dataProvider providePlural
+ * @covers Language::getPluralRuleType
+ */
+ public function testGetPluralRuleType( $result, $value ) {
+ $this->assertEquals( $result, $this->getLang()->getPluralRuleType( $value ) );
+ }
+
+ public static function providePlural() {
return array(
array( 'one', 0 ),
array( 'one', 1 ),
@@ -22,5 +32,4 @@ class LanguageLnTest extends LanguageClassesTestCase {
array( 'other', 200 ),
);
}
-
}
diff --git a/tests/phpunit/languages/LanguageLtTest.php b/tests/phpunit/languages/LanguageLtTest.php
index 9d6428b8..30642f62 100644
--- a/tests/phpunit/languages/LanguageLtTest.php
+++ b/tests/phpunit/languages/LanguageLtTest.php
@@ -7,20 +7,24 @@
/** Tests for MediaWiki languages/LanguageLt.php */
class LanguageLtTest extends LanguageClassesTestCase {
-
- /** @dataProvider provideOneFewOtherCases */
- function testOneFewOtherPlural( $result, $value ) {
+ /**
+ * @dataProvider providePlural
+ * @covers Language::convertPlural
+ */
+ public function testPlural( $result, $value ) {
$forms = array( 'one', 'few', 'other' );
$this->assertEquals( $result, $this->getLang()->convertPlural( $value, $forms ) );
}
- /** @dataProvider provideOneFewCases */
- function testOneFewPlural( $result, $value ) {
- $forms = array( 'one', 'few' );
- $this->assertEquals( $result, $this->getLang()->convertPlural( $value, $forms ) );
+ /**
+ * @dataProvider providePlural
+ * @covers Language::getPluralRuleType
+ */
+ public function testGetPluralRuleType( $result, $value ) {
+ $this->assertEquals( $result, $this->getLang()->getPluralRuleType( $value ) );
}
- function provideOneFewOtherCases() {
+ public static function providePlural() {
return array(
array( 'other', 0 ),
array( 'one', 1 ),
@@ -36,10 +40,24 @@ class LanguageLtTest extends LanguageClassesTestCase {
);
}
- function provideOneFewCases() {
+ /**
+ * @dataProvider providePluralTwoForms
+ * @covers Language::convertPlural
+ */
+ public function testOneFewPlural( $result, $value ) {
+ $forms = array( 'one', 'other' );
+ // This fails for 21, but not sure why.
+ $this->assertEquals( $result, $this->getLang()->convertPlural( $value, $forms ) );
+ }
+
+ public static function providePluralTwoForms() {
return array(
array( 'one', 1 ),
- array( 'few', 15 ),
+ array( 'other', 2 ),
+ array( 'other', 15 ),
+ array( 'other', 20 ),
+ array( 'one', 21 ),
+ array( 'other', 22 ),
);
}
}
diff --git a/tests/phpunit/languages/LanguageLvTest.php b/tests/phpunit/languages/LanguageLvTest.php
index bd0c759b..c4d8a6f0 100644
--- a/tests/phpunit/languages/LanguageLvTest.php
+++ b/tests/phpunit/languages/LanguageLvTest.php
@@ -7,14 +7,24 @@
/** Tests for MediaWiki languages/classes/LanguageLv.php */
class LanguageLvTest extends LanguageClassesTestCase {
-
- /** @dataProvider providerPlural */
- function testPlural( $result, $value ) {
+ /**
+ * @dataProvider providePlural
+ * @covers Language::convertPlural
+ */
+ public function testPlural( $result, $value ) {
$forms = array( 'zero', 'one', 'other' );
$this->assertEquals( $result, $this->getLang()->convertPlural( $value, $forms ) );
}
- function providerPlural() {
+ /**
+ * @dataProvider providePlural
+ * @covers Language::getPluralRuleType
+ */
+ public function testGetPluralRuleType( $result, $value ) {
+ $this->assertEquals( $result, $this->getLang()->getPluralRuleType( $value ) );
+ }
+
+ public static function providePlural() {
return array(
array( 'zero', 0 ),
array( 'one', 1 ),
@@ -27,5 +37,4 @@ class LanguageLvTest extends LanguageClassesTestCase {
array( 'other', 200 ),
);
}
-
}
diff --git a/tests/phpunit/languages/LanguageMgTest.php b/tests/phpunit/languages/LanguageMgTest.php
index c1e516bc..65e8fd7b 100644
--- a/tests/phpunit/languages/LanguageMgTest.php
+++ b/tests/phpunit/languages/LanguageMgTest.php
@@ -7,14 +7,24 @@
/** Tests for MediaWiki languages/classes/LanguageMg.php */
class LanguageMgTest extends LanguageClassesTestCase {
-
- /** @dataProvider providePlural */
- function testPlural( $result, $value ) {
+ /**
+ * @dataProvider providePlural
+ * @covers Language::convertPlural
+ */
+ public function testPlural( $result, $value ) {
$forms = array( 'one', 'other' );
$this->assertEquals( $result, $this->getLang()->convertPlural( $value, $forms ) );
}
- function providePlural() {
+ /**
+ * @dataProvider providePlural
+ * @covers Language::getPluralRuleType
+ */
+ public function testGetPluralRuleType( $result, $value ) {
+ $this->assertEquals( $result, $this->getLang()->getPluralRuleType( $value ) );
+ }
+
+ public static function providePlural() {
return array(
array( 'one', 0 ),
array( 'one', 1 ),
@@ -23,5 +33,4 @@ class LanguageMgTest extends LanguageClassesTestCase {
array( 'other', 123.3434 ),
);
}
-
}
diff --git a/tests/phpunit/languages/LanguageMkTest.php b/tests/phpunit/languages/LanguageMkTest.php
index 5c241ba7..7d47b375 100644
--- a/tests/phpunit/languages/LanguageMkTest.php
+++ b/tests/phpunit/languages/LanguageMkTest.php
@@ -7,27 +7,34 @@
/** Tests for MediaWiki languages/classes/LanguageMk.php */
class LanguageMkTest extends LanguageClassesTestCase {
-
- /** @dataProvider providerPlural */
- function testPlural( $result, $value ) {
+ /**
+ * @dataProvider providePlural
+ * @covers Language::convertPlural
+ */
+ public function testPlural( $result, $value ) {
$forms = array( 'one', 'other' );
$this->assertEquals( $result, $this->getLang()->convertPlural( $value, $forms ) );
}
+ /**
+ * @dataProvider providePlural
+ * @covers Language::getPluralRuleType
+ */
+ public function testGetPluralRuleType( $result, $value ) {
+ $this->assertEquals( $result, $this->getLang()->getPluralRuleType( $value ) );
+ }
- function providerPlural() {
+ public static function providePlural() {
return array(
array( 'other', 0 ),
array( 'one', 1 ),
array( 'other', 11 ),
array( 'one', 21 ),
- array( 'other', 411 ),
+ array( 'one', 411 ),
array( 'other', 12.345 ),
array( 'other', 20 ),
array( 'one', 31 ),
array( 'other', 200 ),
);
}
-
-
}
diff --git a/tests/phpunit/languages/LanguageMlTest.php b/tests/phpunit/languages/LanguageMlTest.php
index 396114d9..4fa45ce3 100644
--- a/tests/phpunit/languages/LanguageMlTest.php
+++ b/tests/phpunit/languages/LanguageMlTest.php
@@ -8,13 +8,16 @@
/** Tests for MediaWiki languages/LanguageMl.php */
class LanguageMlTest extends LanguageClassesTestCase {
- /** see bug 29495 */
- /** @dataProvider providerFormatNum */
- function testFormatNum( $result, $value ) {
+ /**
+ * @dataProvider providerFormatNum
+ * @see bug 29495
+ * @covers Language::formatNum
+ */
+ public function testFormatNum( $result, $value ) {
$this->assertEquals( $result, $this->getLang()->formatNum( $value ) );
}
- function providerFormatNum() {
+ public static function providerFormatNum() {
return array(
array( '12,34,567', '1234567' ),
array( '12,345', '12345' ),
diff --git a/tests/phpunit/languages/LanguageMoTest.php b/tests/phpunit/languages/LanguageMoTest.php
index f7da1cd6..e0e54ca8 100644
--- a/tests/phpunit/languages/LanguageMoTest.php
+++ b/tests/phpunit/languages/LanguageMoTest.php
@@ -7,14 +7,24 @@
/** Tests for MediaWiki languages/classes/LanguageMo.php */
class LanguageMoTest extends LanguageClassesTestCase {
-
- /** @dataProvider providerPlural */
- function testPlural( $result, $value ) {
+ /**
+ * @dataProvider providePlural
+ * @covers Language::convertPlural
+ */
+ public function testPlural( $result, $value ) {
$forms = array( 'one', 'few', 'other' );
$this->assertEquals( $result, $this->getLang()->convertPlural( $value, $forms ) );
}
- function providerPlural() {
+ /**
+ * @dataProvider providePlural
+ * @covers Language::getPluralRuleType
+ */
+ public function testGetPluralRuleType( $result, $value ) {
+ $this->assertEquals( $result, $this->getLang()->getPluralRuleType( $value ) );
+ }
+
+ public static function providePlural() {
return array(
array( 'few', 0 ),
array( 'one', 1 ),
diff --git a/tests/phpunit/languages/LanguageMtTest.php b/tests/phpunit/languages/LanguageMtTest.php
index f2b881e7..96d2bc92 100644
--- a/tests/phpunit/languages/LanguageMtTest.php
+++ b/tests/phpunit/languages/LanguageMtTest.php
@@ -7,14 +7,24 @@
/** Tests for MediaWiki languages/classes/LanguageMt.php */
class LanguageMtTest extends LanguageClassesTestCase {
-
- /** @dataProvider providerPluralAllForms */
- function testPluralAllForms( $result, $value ) {
+ /**
+ * @dataProvider providePlural
+ * @covers Language::convertPlural
+ */
+ public function testPlural( $result, $value ) {
$forms = array( 'one', 'few', 'many', 'other' );
$this->assertEquals( $result, $this->getLang()->convertPlural( $value, $forms ) );
}
- function providerPluralAllForms() {
+ /**
+ * @dataProvider providePlural
+ * @covers Language::getPluralRuleType
+ */
+ public function testGetPluralRuleType( $result, $value ) {
+ $this->assertEquals( $result, $this->getLang()->getPluralRuleType( $value ) );
+ }
+
+ public static function providePlural() {
return array(
array( 'few', 0 ),
array( 'one', 1 ),
@@ -35,30 +45,33 @@ class LanguageMtTest extends LanguageClassesTestCase {
);
}
- /** @dataProvider providerPluralTwoForms */
- function testPluralTwoForms( $result, $value ) {
- $forms = array( 'one', 'many' );
+ /**
+ * @dataProvider providePluralTwoForms
+ * @covers Language::convertPlural
+ */
+ public function testPluralTwoForms( $result, $value ) {
+ $forms = array( 'one', 'other' );
$this->assertEquals( $result, $this->getLang()->convertPlural( $value, $forms ) );
}
- function providerPluralTwoForms() {
+ public static function providePluralTwoForms() {
return array(
- array( 'many', 0 ),
+ array( 'other', 0 ),
array( 'one', 1 ),
- array( 'many', 2 ),
- array( 'many', 10 ),
- array( 'many', 11 ),
- array( 'many', 19 ),
- array( 'many', 20 ),
- array( 'many', 99 ),
- array( 'many', 100 ),
- array( 'many', 101 ),
- array( 'many', 102 ),
- array( 'many', 110 ),
- array( 'many', 111 ),
- array( 'many', 119 ),
- array( 'many', 120 ),
- array( 'many', 201 ),
+ array( 'other', 2 ),
+ array( 'other', 10 ),
+ array( 'other', 11 ),
+ array( 'other', 19 ),
+ array( 'other', 20 ),
+ array( 'other', 99 ),
+ array( 'other', 100 ),
+ array( 'other', 101 ),
+ array( 'other', 102 ),
+ array( 'other', 110 ),
+ array( 'other', 111 ),
+ array( 'other', 119 ),
+ array( 'other', 120 ),
+ array( 'other', 201 ),
);
}
}
diff --git a/tests/phpunit/languages/LanguageNlTest.php b/tests/phpunit/languages/LanguageNlTest.php
index f783f2c0..26bd691a 100644
--- a/tests/phpunit/languages/LanguageNlTest.php
+++ b/tests/phpunit/languages/LanguageNlTest.php
@@ -8,7 +8,11 @@
/** Tests for MediaWiki languages/LanguageNl.php */
class LanguageNlTest extends LanguageClassesTestCase {
- function testFormatNum() {
+ /**
+ * @covers Language::formatNum
+ * @todo split into a test and a dataprovider
+ */
+ public function testFormatNum() {
$this->assertEquals( '1.234.567', $this->getLang()->formatNum( '1234567' ) );
$this->assertEquals( '12.345', $this->getLang()->formatNum( '12345' ) );
$this->assertEquals( '1', $this->getLang()->formatNum( '1' ) );
diff --git a/tests/phpunit/languages/LanguageNsoTest.php b/tests/phpunit/languages/LanguageNsoTest.php
index 9d80d138..18efd736 100644
--- a/tests/phpunit/languages/LanguageNsoTest.php
+++ b/tests/phpunit/languages/LanguageNsoTest.php
@@ -7,18 +7,28 @@
/** Tests for MediaWiki languages/classes/LanguageNso.php */
class LanguageNsoTest extends LanguageClassesTestCase {
-
- /** @dataProvider providerPlural */
- function testPlural( $result, $value ) {
- $forms = array( 'one', 'many' );
+ /**
+ * @dataProvider providePlural
+ * @covers Language::convertPlural
+ */
+ public function testPlural( $result, $value ) {
+ $forms = array( 'one', 'other' );
$this->assertEquals( $result, $this->getLang()->convertPlural( $value, $forms ) );
}
- function providerPlural() {
+ /**
+ * @dataProvider providePlural
+ * @covers Language::getPluralRuleType
+ */
+ public function testGetPluralRuleType( $result, $value ) {
+ $this->assertEquals( $result, $this->getLang()->getPluralRuleType( $value ) );
+ }
+
+ public static function providePlural() {
return array(
array( 'one', 0 ),
array( 'one', 1 ),
- array( 'many', 2 ),
+ array( 'other', 2 ),
);
}
}
diff --git a/tests/phpunit/languages/LanguagePlTest.php b/tests/phpunit/languages/LanguagePlTest.php
index 1e36097b..d180037b 100644
--- a/tests/phpunit/languages/LanguagePlTest.php
+++ b/tests/phpunit/languages/LanguagePlTest.php
@@ -7,14 +7,24 @@
/** Tests for MediaWiki languages/classes/LanguagePl.php */
class LanguagePlTest extends LanguageClassesTestCase {
-
- /** @dataProvider providerPluralFourForms */
- function testPluralFourForms( $result, $value ) {
+ /**
+ * @dataProvider providePlural
+ * @covers Language::convertPlural
+ */
+ public function testPlural( $result, $value ) {
$forms = array( 'one', 'few', 'many' );
$this->assertEquals( $result, $this->getLang()->convertPlural( $value, $forms ) );
}
- function providerPluralFourForms() {
+ /**
+ * @dataProvider providePlural
+ * @covers Language::getPluralRuleType
+ */
+ public function testGetPluralRuleType( $result, $value ) {
+ $this->assertEquals( $result, $this->getLang()->getPluralRuleType( $value ) );
+ }
+
+ public static function providePlural() {
return array(
array( 'many', 0 ),
array( 'one', 1 ),
@@ -35,30 +45,33 @@ class LanguagePlTest extends LanguageClassesTestCase {
);
}
- /** @dataProvider providerPlural */
- function testPlural( $result, $value ) {
- $forms = array( 'one', 'many' );
+ /**
+ * @dataProvider providePluralTwoForms
+ * @covers Language::convertPlural
+ */
+ public function testPluralTwoForms( $result, $value ) {
+ $forms = array( 'one', 'other' );
$this->assertEquals( $result, $this->getLang()->convertPlural( $value, $forms ) );
}
- function providerPlural() {
+ public static function providePluralTwoForms() {
return array(
- array( 'many', 0 ),
+ array( 'other', 0 ),
array( 'one', 1 ),
- array( 'many', 2 ),
- array( 'many', 3 ),
- array( 'many', 4 ),
- array( 'many', 5 ),
- array( 'many', 9 ),
- array( 'many', 10 ),
- array( 'many', 11 ),
- array( 'many', 21 ),
- array( 'many', 22 ),
- array( 'many', 23 ),
- array( 'many', 24 ),
- array( 'many', 25 ),
- array( 'many', 200 ),
- array( 'many', 201 ),
+ array( 'other', 2 ),
+ array( 'other', 3 ),
+ array( 'other', 4 ),
+ array( 'other', 5 ),
+ array( 'other', 9 ),
+ array( 'other', 10 ),
+ array( 'other', 11 ),
+ array( 'other', 21 ),
+ array( 'other', 22 ),
+ array( 'other', 23 ),
+ array( 'other', 24 ),
+ array( 'other', 25 ),
+ array( 'other', 200 ),
+ array( 'other', 201 ),
);
}
}
diff --git a/tests/phpunit/languages/LanguageRoTest.php b/tests/phpunit/languages/LanguageRoTest.php
index 916ea45d..ae7816bc 100644
--- a/tests/phpunit/languages/LanguageRoTest.php
+++ b/tests/phpunit/languages/LanguageRoTest.php
@@ -7,14 +7,24 @@
/** Tests for MediaWiki languages/classes/LanguageRo.php */
class LanguageRoTest extends LanguageClassesTestCase {
-
- /** @dataProvider providerPlural */
- function testPlural( $result, $value ) {
+ /**
+ * @dataProvider providePlural
+ * @covers Language::convertPlural
+ */
+ public function testPlural( $result, $value ) {
$forms = array( 'one', 'few', 'other' );
$this->assertEquals( $result, $this->getLang()->convertPlural( $value, $forms ) );
}
- function providerPlural() {
+ /**
+ * @dataProvider providePlural
+ * @covers Language::getPluralRuleType
+ */
+ public function testGetPluralRuleType( $result, $value ) {
+ $this->assertEquals( $result, $this->getLang()->getPluralRuleType( $value ) );
+ }
+
+ public static function providePlural() {
return array(
array( 'few', 0 ),
array( 'one', 1 ),
diff --git a/tests/phpunit/languages/LanguageRuTest.php b/tests/phpunit/languages/LanguageRuTest.php
index 0792f75b..e938be79 100644
--- a/tests/phpunit/languages/LanguageRuTest.php
+++ b/tests/phpunit/languages/LanguageRuTest.php
@@ -8,14 +8,24 @@
/** Tests for MediaWiki languages/classes/LanguageRu.php */
class LanguageRuTest extends LanguageClassesTestCase {
-
- /** @dataProvider providePluralFourForms */
- function testPluralFourForms( $result, $value ) {
+ /**
+ * @dataProvider providePlural
+ * @covers Language::convertPlural
+ */
+ public function testPlural( $result, $value ) {
$forms = array( 'one', 'few', 'many', 'other' );
$this->assertEquals( $result, $this->getLang()->convertPlural( $value, $forms ) );
}
- function providePluralFourForms() {
+ /**
+ * @dataProvider providePlural
+ * @covers Language::getPluralRuleType
+ */
+ public function testGetPluralRuleType( $result, $value ) {
+ $this->assertEquals( $result, $this->getLang()->getPluralRuleType( $value ) );
+ }
+
+ public static function providePlural() {
return array(
array( 'one', 1 ),
array( 'many', 11 ),
@@ -31,27 +41,33 @@ class LanguageRuTest extends LanguageClassesTestCase {
);
}
- /** @dataProvider providePluralTwoForms */
- function testPluralTwoForms( $result, $value ) {
- $forms = array( 'one', 'several' );
+ /**
+ * @dataProvider providePluralTwoForms
+ * @covers Language::convertPlural
+ */
+ public function testPluralTwoForms( $result, $value ) {
+ $forms = array( 'one', 'other' );
$this->assertEquals( $result, $this->getLang()->convertPlural( $value, $forms ) );
}
- function providePluralTwoForms() {
+ public static function providePluralTwoForms() {
return array(
array( 'one', 1 ),
- array( 'several', 11 ),
- array( 'several', 91 ),
- array( 'several', 121 ),
+ array( 'other', 11 ),
+ array( 'other', 91 ),
+ array( 'other', 121 ),
);
}
- /** @dataProvider providerGrammar */
- function testGrammar( $result, $word, $case ) {
+ /**
+ * @dataProvider providerGrammar
+ * @covers Language::convertGrammar
+ */
+ public function testGrammar( $result, $word, $case ) {
$this->assertEquals( $result, $this->getLang()->convertGrammar( $word, $case ) );
}
- function providerGrammar() {
+ public static function providerGrammar() {
return array(
array(
'Википедии',
diff --git a/tests/phpunit/languages/LanguageSeTest.php b/tests/phpunit/languages/LanguageSeTest.php
index c7dd8020..533aa2bc 100644
--- a/tests/phpunit/languages/LanguageSeTest.php
+++ b/tests/phpunit/languages/LanguageSeTest.php
@@ -7,14 +7,24 @@
/** Tests for MediaWiki languages/classes/LanguageSe.php */
class LanguageSeTest extends LanguageClassesTestCase {
-
- /** @dataProvider providerPluralThreeForms */
- function testPluralThreeForms( $result, $value ) {
+ /**
+ * @dataProvider providePlural
+ * @covers Language::convertPlural
+ */
+ public function testPlural( $result, $value ) {
$forms = array( 'one', 'two', 'other' );
$this->assertEquals( $result, $this->getLang()->convertPlural( $value, $forms ) );
}
- function providerPluralThreeForms() {
+ /**
+ * @dataProvider providePlural
+ * @covers Language::getPluralRuleType
+ */
+ public function testGetPluralRuleType( $result, $value ) {
+ $this->assertEquals( $result, $this->getLang()->getPluralRuleType( $value ) );
+ }
+
+ public static function providePlural() {
return array(
array( 'other', 0 ),
array( 'one', 1 ),
@@ -23,13 +33,16 @@ class LanguageSeTest extends LanguageClassesTestCase {
);
}
- /** @dataProvider providerPlural */
- function testPlural( $result, $value ) {
+ /**
+ * @dataProvider providePluralTwoForms
+ * @covers Language::convertPlural
+ */
+ public function testPluralTwoForms( $result, $value ) {
$forms = array( 'one', 'other' );
$this->assertEquals( $result, $this->getLang()->convertPlural( $value, $forms ) );
}
- function providerPlural() {
+ public static function providePluralTwoForms() {
return array(
array( 'other', 0 ),
array( 'one', 1 ),
diff --git a/tests/phpunit/languages/LanguageSgsTest.php b/tests/phpunit/languages/LanguageSgsTest.php
index 95e63462..bf6a14b1 100644
--- a/tests/phpunit/languages/LanguageSgsTest.php
+++ b/tests/phpunit/languages/LanguageSgsTest.php
@@ -7,14 +7,24 @@
/** Tests for MediaWiki languages/classes/LanguageSgs.php */
class LanguageSgsTest extends LanguageClassesTestCase {
-
- /** @dataProvider providePluralAllForms */
- function testPluralAllForms( $result, $value ) {
+ /**
+ * @dataProvider providePluralAllForms
+ * @covers Language::convertPlural
+ */
+ public function testPluralAllForms( $result, $value ) {
$forms = array( 'one', 'two', 'few', 'other' );
$this->assertEquals( $result, $this->getLang()->convertPlural( $value, $forms ) );
}
- function providePluralAllForms() {
+ /**
+ * @dataProvider providePluralAllForms
+ * @covers Language::getPluralRuleType
+ */
+ public function testGetPluralRuleType( $result, $value ) {
+ $this->assertEquals( $result, $this->getLang()->getPluralRuleType( $value ) );
+ }
+
+ public static function providePluralAllForms() {
return array(
array( 'few', 0 ),
array( 'one', 1 ),
@@ -32,13 +42,16 @@ class LanguageSgsTest extends LanguageClassesTestCase {
);
}
- /** @dataProvider providePluralTwoForms */
- function testPluralTwoForms( $result, $value ) {
+ /**
+ * @dataProvider providePluralTwoForms
+ * @covers Language::convertPlural
+ */
+ public function testPluralTwoForms( $result, $value ) {
$forms = array( 'one', 'other' );
$this->assertEquals( $result, $this->getLang()->convertPlural( $value, $forms ) );
}
- function providePluralTwoForms() {
+ public static function providePluralTwoForms() {
return array(
array( 'other', 0 ),
array( 'one', 1 ),
diff --git a/tests/phpunit/languages/LanguageShTest.php b/tests/phpunit/languages/LanguageShTest.php
index 282fd2f2..6d2e25a6 100644
--- a/tests/phpunit/languages/LanguageShTest.php
+++ b/tests/phpunit/languages/LanguageShTest.php
@@ -7,18 +7,36 @@
/** Tests for MediaWiki languages/classes/LanguageSh.php */
class LanguageShTest extends LanguageClassesTestCase {
-
- /** @dataProvider providerPlural */
- function testPlural( $result, $value ) {
- $forms = array( 'one', 'many' );
+ /**
+ * @dataProvider providePlural
+ * @covers Language::convertPlural
+ */
+ public function testPlural( $result, $value ) {
+ $forms = array( 'one', 'few', 'many', 'other' );
$this->assertEquals( $result, $this->getLang()->convertPlural( $value, $forms ) );
}
- function providerPlural() {
+ /**
+ * @dataProvider providePlural
+ * @covers Language::getPluralRuleType
+ */
+ public function testGetPluralRuleType( $result, $value ) {
+ $this->assertEquals( $result, $this->getLang()->getPluralRuleType( $value ) );
+ }
+
+ public static function providePlural() {
return array(
array( 'many', 0 ),
array( 'one', 1 ),
- array( 'many', 2 ),
+ array( 'few', 2 ),
+ array( 'few', 4 ),
+ array( 'many', 5 ),
+ array( 'many', 10 ),
+ array( 'many', 11 ),
+ array( 'many', 12 ),
+ array( 'one', 101 ),
+ array( 'few', 102 ),
+ array( 'many', 111 ),
);
}
}
diff --git a/tests/phpunit/languages/LanguageSkTest.php b/tests/phpunit/languages/LanguageSkTest.php
index 89cbbf01..cb8a13b8 100644
--- a/tests/phpunit/languages/LanguageSkTest.php
+++ b/tests/phpunit/languages/LanguageSkTest.php
@@ -8,14 +8,24 @@
/** Tests for MediaWiki languages/classes/LanguageSk.php */
class LanguageSkTest extends LanguageClassesTestCase {
-
- /** @dataProvider providerPlural */
- function testPlural( $result, $value ) {
+ /**
+ * @dataProvider providePlural
+ * @covers Language::convertPlural
+ */
+ public function testPlural( $result, $value ) {
$forms = array( 'one', 'few', 'other' );
$this->assertEquals( $result, $this->getLang()->convertPlural( $value, $forms ) );
}
- function providerPlural() {
+ /**
+ * @dataProvider providePlural
+ * @covers Language::getPluralRuleType
+ */
+ public function testGetPluralRuleType( $result, $value ) {
+ $this->assertEquals( $result, $this->getLang()->getPluralRuleType( $value ) );
+ }
+
+ public static function providePlural() {
return array(
array( 'other', 0 ),
array( 'one', 1 ),
diff --git a/tests/phpunit/languages/LanguageSlTest.php b/tests/phpunit/languages/LanguageSlTest.php
index 075e6af3..9783dd80 100644
--- a/tests/phpunit/languages/LanguageSlTest.php
+++ b/tests/phpunit/languages/LanguageSlTest.php
@@ -8,16 +8,26 @@
/** Tests for MediaWiki languages/classes/LanguageSl.php */
class LanguageSlTest extends LanguageClassesTestCase {
-
- /** @dataProvider providerPlural */
- function testPlural( $result, $value ) {
- $forms = array( 'one', 'two', 'few', 'other', 'zero' );
+ /**
+ * @dataProvider providerPlural
+ * @covers Language::convertPlural
+ */
+ public function testPlural( $result, $value ) {
+ $forms = array( 'one', 'two', 'few', 'other' );
$this->assertEquals( $result, $this->getLang()->convertPlural( $value, $forms ) );
}
- function providerPlural() {
+ /**
+ * @dataProvider providerPlural
+ * @covers Language::getPluralRuleType
+ */
+ public function testGetPluralRuleType( $result, $value ) {
+ $this->assertEquals( $result, $this->getLang()->getPluralRuleType( $value ) );
+ }
+
+ public static function providerPlural() {
return array(
- array( 'zero', 0 ),
+ array( 'other', 0 ),
array( 'one', 1 ),
array( 'two', 2 ),
array( 'few', 3 ),
diff --git a/tests/phpunit/languages/LanguageSmaTest.php b/tests/phpunit/languages/LanguageSmaTest.php
index 6d655219..95cb333c 100644
--- a/tests/phpunit/languages/LanguageSmaTest.php
+++ b/tests/phpunit/languages/LanguageSmaTest.php
@@ -7,14 +7,24 @@
/** Tests for MediaWiki languages/classes/LanguageSma.php */
class LanguageSmaTest extends LanguageClassesTestCase {
-
- /** @dataProvider providerPluralThreeForms */
- function testPluralThreeForms( $result, $value ) {
+ /**
+ * @dataProvider providePlural
+ * @covers Language::convertPlural
+ */
+ public function testPlural( $result, $value ) {
$forms = array( 'one', 'two', 'other' );
$this->assertEquals( $result, $this->getLang()->convertPlural( $value, $forms ) );
}
- function providerPluralThreeForms() {
+ /**
+ * @dataProvider providePlural
+ * @covers Language::getPluralRuleType
+ */
+ public function testGetPluralRuleType( $result, $value ) {
+ $this->assertEquals( $result, $this->getLang()->getPluralRuleType( $value ) );
+ }
+
+ public static function providePlural() {
return array(
array( 'other', 0 ),
array( 'one', 1 ),
@@ -23,13 +33,16 @@ class LanguageSmaTest extends LanguageClassesTestCase {
);
}
- /** @dataProvider providerPlural */
- function testPlural( $result, $value ) {
+ /**
+ * @dataProvider providePluralTwoForms
+ * @covers Language::convertPlural
+ */
+ public function testPluralTwoForms( $result, $value ) {
$forms = array( 'one', 'other' );
$this->assertEquals( $result, $this->getLang()->convertPlural( $value, $forms ) );
}
- function providerPlural() {
+ public static function providePluralTwoForms() {
return array(
array( 'other', 0 ),
array( 'one', 1 ),
diff --git a/tests/phpunit/languages/LanguageSrTest.php b/tests/phpunit/languages/LanguageSrTest.php
index 5611030b..ab4d4aba 100644
--- a/tests/phpunit/languages/LanguageSrTest.php
+++ b/tests/phpunit/languages/LanguageSrTest.php
@@ -10,16 +10,18 @@
* @author Antoine Musso <hashar at free dot fr>
* @copyright Copyright © 2011, Antoine Musso <hashar at free dot fr>
* @file
+ *
+ * @todo methods in test class should be tidied:
+ * - Should be split into separate test methods and data providers
+ * - Tests for LanguageConverter and Language should probably be separate..
*/
-require_once dirname( __DIR__ ) . '/bootstrap.php';
-
/** Tests for MediaWiki languages/LanguageSr.php */
class LanguageSrTest extends LanguageClassesTestCase {
-
- ##### TESTS #######################################################
-
- function testEasyConversions() {
+ /**
+ * @covers LanguageConverter::convertTo
+ */
+ public function testEasyConversions() {
$this->assertCyrillic(
'шђчћжШЂЧЋЖ',
'Cyrillic guessing characters'
@@ -30,7 +32,10 @@ class LanguageSrTest extends LanguageClassesTestCase {
);
}
- function testMixedConversions() {
+ /**
+ * @covers LanguageConverter::convertTo
+ */
+ public function testMixedConversions() {
$this->assertCyrillic(
'шђчћжШЂЧЋЖ - Å¡Ä‘Äćž',
'Mostly cyrillic characters'
@@ -41,7 +46,10 @@ class LanguageSrTest extends LanguageClassesTestCase {
);
}
- function testSameAmountOfLatinAndCyrillicGetConverted() {
+ /**
+ * @covers LanguageConverter::convertTo
+ */
+ public function testSameAmountOfLatinAndCyrillicGetConverted() {
$this->assertConverted(
'4 latin: Å¡Ä‘Äć | 4 cyrillic: шђчћ',
'sr-ec'
@@ -54,8 +62,9 @@ class LanguageSrTest extends LanguageClassesTestCase {
/**
* @author Nikola Smolenski
+ * @covers LanguageConverter::convertTo
*/
- function testConversionToCyrillic() {
+ public function testConversionToCyrillic() {
//A simple convertion of Latin to Cyrillic
$this->assertEquals( 'абвг',
$this->convertToCyrillic( 'abvg' )
@@ -94,7 +103,10 @@ class LanguageSrTest extends LanguageClassesTestCase {
);
}
- function testConversionToLatin() {
+ /**
+ * @covers LanguageConverter::convertTo
+ */
+ public function testConversionToLatin() {
//A simple convertion of Latin to Latin
$this->assertEquals( 'abcd',
$this->convertToLatin( 'abcd' )
@@ -113,13 +125,24 @@ class LanguageSrTest extends LanguageClassesTestCase {
);
}
- /** @dataProvider providePluralFourForms */
- function testPluralFourForms( $result, $value ) {
+ /**
+ * @dataProvider providePlural
+ * @covers Language::convertPlural
+ */
+ public function testPlural( $result, $value ) {
$forms = array( 'one', 'few', 'many', 'other' );
$this->assertEquals( $result, $this->getLang()->convertPlural( $value, $forms ) );
}
- function providePluralFourForms() {
+ /**
+ * @dataProvider providePlural
+ * @covers Language::getPluralRuleType
+ */
+ public function testGetPluralRuleType( $result, $value ) {
+ $this->assertEquals( $result, $this->getLang()->getPluralRuleType( $value ) );
+ }
+
+ public static function providePlural() {
return array(
array( 'one', 1 ),
array( 'many', 11 ),
@@ -135,18 +158,21 @@ class LanguageSrTest extends LanguageClassesTestCase {
);
}
- /** @dataProvider providePluralTwoForms */
- function testPluralTwoForms( $result, $value ) {
- $forms = array( 'one', 'several' );
+ /**
+ * @dataProvider providePluralTwoForms
+ * @covers Language::convertPlural
+ */
+ public function testPluralTwoForms( $result, $value ) {
+ $forms = array( 'one', 'other' );
$this->assertEquals( $result, $this->getLang()->convertPlural( $value, $forms ) );
}
- function providePluralTwoForms() {
+ public static function providePluralTwoForms() {
return array(
array( 'one', 1 ),
- array( 'several', 11 ),
- array( 'several', 91 ),
- array( 'several', 121 ),
+ array( 'other', 11 ),
+ array( 'other', 91 ),
+ array( 'other', 121 ),
);
}
@@ -157,7 +183,7 @@ class LanguageSrTest extends LanguageClassesTestCase {
* @param $variant string Language variant 'sr-ec' or 'sr-el'
* @param $msg string Optional message
*/
- function assertUnConverted( $text, $variant, $msg = '' ) {
+ protected function assertUnConverted( $text, $variant, $msg = '' ) {
$this->assertEquals(
$text,
$this->convertTo( $text, $variant ),
@@ -171,7 +197,7 @@ class LanguageSrTest extends LanguageClassesTestCase {
* @param $variant string Language variant 'sr-ec' or 'sr-el'
* @param $msg string Optional message
*/
- function assertConverted( $text, $variant, $msg = '' ) {
+ protected function assertConverted( $text, $variant, $msg = '' ) {
$this->assertNotEquals(
$text,
$this->convertTo( $text, $variant ),
@@ -184,7 +210,7 @@ class LanguageSrTest extends LanguageClassesTestCase {
* using the cyrillic variant and converted to Latin when using
* the Latin variant.
*/
- function assertCyrillic( $text, $msg = '' ) {
+ protected function assertCyrillic( $text, $msg = '' ) {
$this->assertUnConverted( $text, 'sr-ec', $msg );
$this->assertConverted( $text, 'sr-el', $msg );
}
@@ -194,26 +220,26 @@ class LanguageSrTest extends LanguageClassesTestCase {
* using the Latin variant and converted to Cyrillic when using
* the Cyrillic variant.
*/
- function assertLatin( $text, $msg = '' ) {
+ protected function assertLatin( $text, $msg = '' ) {
$this->assertUnConverted( $text, 'sr-el', $msg );
$this->assertConverted( $text, 'sr-ec', $msg );
}
/** Wrapper for converter::convertTo() method*/
- function convertTo( $text, $variant ) {
+ protected function convertTo( $text, $variant ) {
return $this->getLang()
->mConverter
->convertTo(
- $text, $variant
- );
+ $text, $variant
+ );
}
- function convertToCyrillic( $text ) {
+ protected function convertToCyrillic( $text ) {
return $this->convertTo( $text, 'sr-ec' );
}
- function convertToLatin( $text ) {
+ protected function convertToLatin( $text ) {
return $this->convertTo( $text, 'sr-el' );
}
}
diff --git a/tests/phpunit/languages/LanguageTest.php b/tests/phpunit/languages/LanguageTest.php
index 76471445..78929e23 100644
--- a/tests/phpunit/languages/LanguageTest.php
+++ b/tests/phpunit/languages/LanguageTest.php
@@ -1,8 +1,11 @@
<?php
class LanguageTest extends LanguageClassesTestCase {
-
- function testLanguageConvertDoubleWidthToSingleWidth() {
+ /**
+ * @covers Language::convertDoubleWidth
+ * @covers Language::normalizeForSearch
+ */
+ public function testLanguageConvertDoubleWidthToSingleWidth() {
$this->assertEquals(
"0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz",
$this->getLang()->normalizeForSearch(
@@ -13,13 +16,14 @@ class LanguageTest extends LanguageClassesTestCase {
}
/**
- * @dataProvider provideFormattableTimes
+ * @dataProvider provideFormattableTimes#
+ * @covers Language::formatTimePeriod
*/
- function testFormatTimePeriod( $seconds, $format, $expected, $desc ) {
+ public function testFormatTimePeriod( $seconds, $format, $expected, $desc ) {
$this->assertEquals( $expected, $this->getLang()->formatTimePeriod( $seconds, $format ), $desc );
}
- function provideFormattableTimes() {
+ public static function provideFormattableTimes() {
return array(
array(
9.45,
@@ -202,10 +206,12 @@ class LanguageTest extends LanguageClassesTestCase {
'formatTimePeriod() rounding, recursion, (>48h)'
),
);
-
}
- function testTruncate() {
+ /**
+ * @covers Language::truncate
+ */
+ public function testTruncate() {
$this->assertEquals(
"XXX",
$this->getLang()->truncate( "1234567890", 0, 'XXX' ),
@@ -238,9 +244,10 @@ class LanguageTest extends LanguageClassesTestCase {
}
/**
- * @dataProvider provideHTMLTruncateData()
+ * @dataProvider provideHTMLTruncateData
+ * @covers Language::truncateHTML
*/
- function testTruncateHtml( $len, $ellipsis, $input, $expected ) {
+ public function testTruncateHtml( $len, $ellipsis, $input, $expected ) {
// Actual HTML...
$this->assertEquals(
$expected,
@@ -249,9 +256,9 @@ class LanguageTest extends LanguageClassesTestCase {
}
/**
- * Array format is ($len, $ellipsis, $input, $expected)
+ * @return array format is ($len, $ellipsis, $input, $expected)
*/
- function provideHTMLTruncateData() {
+ public static function provideHTMLTruncateData() {
return array(
array( 0, 'XXX', "1234567890", "XXX" ),
array( 8, 'XXX', "1234567890", "12345XXX" ),
@@ -310,8 +317,9 @@ class LanguageTest extends LanguageClassesTestCase {
/**
* Test Language::isWellFormedLanguageTag()
* @dataProvider provideWellFormedLanguageTags
+ * @covers Language::isWellFormedLanguageTag
*/
- function testWellFormedLanguageTag( $code, $message = '' ) {
+ public function testWellFormedLanguageTag( $code, $message = '' ) {
$this->assertTrue(
Language::isWellFormedLanguageTag( $code ),
"validating code $code $message"
@@ -324,7 +332,7 @@ class LanguageTest extends LanguageClassesTestCase {
* and distributed as free software, under the GNU General Public Licence.
* http://www.bortzmeyer.org/gabuzomeu-parsing-language-tags.html
*/
- function provideWellFormedLanguageTags() {
+ public static function provideWellFormedLanguageTags() {
return array(
array( 'fr', 'two-letter code' ),
array( 'fr-latn', 'two-letter code with lower case script code' ),
@@ -361,8 +369,9 @@ class LanguageTest extends LanguageClassesTestCase {
/**
* Negative test for Language::isWellFormedLanguageTag()
* @dataProvider provideMalformedLanguageTags
+ * @covers Language::isWellFormedLanguageTag
*/
- function testMalformedLanguageTag( $code, $message = '' ) {
+ public function testMalformedLanguageTag( $code, $message = '' ) {
$this->assertFalse(
Language::isWellFormedLanguageTag( $code ),
"validating that code $code is a malformed language tag - $message"
@@ -375,7 +384,7 @@ class LanguageTest extends LanguageClassesTestCase {
* and distributed as free software, under the GNU General Public Licence.
* http://www.bortzmeyer.org/gabuzomeu-parsing-language-tags.html
*/
- function provideMalformedLanguageTags() {
+ public static function provideMalformedLanguageTags() {
return array(
array( 'f', 'language too short' ),
array( 'f-Latn', 'language too short with script' ),
@@ -411,8 +420,9 @@ class LanguageTest extends LanguageClassesTestCase {
/**
* Negative test for Language::isWellFormedLanguageTag()
+ * @covers Language::isWellFormedLanguageTag
*/
- function testLenientLanguageTag() {
+ public function testLenientLanguageTag() {
$this->assertTrue(
Language::isWellFormedLanguageTag( 'pa_guru', true ),
'pa_guru is a well-formed language tag in lenient mode'
@@ -422,22 +432,26 @@ class LanguageTest extends LanguageClassesTestCase {
/**
* Test Language::isValidBuiltInCode()
* @dataProvider provideLanguageCodes
+ * @covers Language::isValidBuiltInCode
*/
- function testBuiltInCodeValidation( $code, $message = '' ) {
+ public function testBuiltInCodeValidation( $code, $message = '' ) {
$this->assertTrue(
(bool)Language::isValidBuiltInCode( $code ),
"validating code $code $message"
);
}
- function testBuiltInCodeValidationRejectUnderscore() {
+ /**
+ * @covers Language::isValidBuiltInCode
+ */
+ public function testBuiltInCodeValidationRejectUnderscore() {
$this->assertFalse(
(bool)Language::isValidBuiltInCode( 'be_tarask' ),
"reject underscore in language code"
);
}
- function provideLanguageCodes() {
+ public static function provideLanguageCodes() {
return array(
array( 'fr', 'Two letters, minor case' ),
array( 'EN', 'Two letters, upper case' ),
@@ -452,15 +466,16 @@ class LanguageTest extends LanguageClassesTestCase {
/**
* Test Language::isKnownLanguageTag()
* @dataProvider provideKnownLanguageTags
+ * @covers Language::isKnownLanguageTag
*/
- function testKnownLanguageTag( $code, $message = '' ) {
+ public function testKnownLanguageTag( $code, $message = '' ) {
$this->assertTrue(
(bool)Language::isKnownLanguageTag( $code ),
"validating code $code - $message"
);
}
- function provideKnownLanguageTags() {
+ public static function provideKnownLanguageTags() {
return array(
array( 'fr', 'simple code' ),
array( 'bat-smg', 'an MW legacy tag' ),
@@ -469,9 +484,9 @@ class LanguageTest extends LanguageClassesTestCase {
}
/**
- * Test Language::isKnownLanguageTag()
+ * @covers Language::isKnownLanguageTag
*/
- function testKnownCldrLanguageTag() {
+ public function testKnownCldrLanguageTag() {
if ( !class_exists( 'LanguageNames' ) ) {
$this->markTestSkipped( 'The LanguageNames class is not available. The cldr extension is probably not installed.' );
}
@@ -485,24 +500,54 @@ class LanguageTest extends LanguageClassesTestCase {
/**
* Negative tests for Language::isKnownLanguageTag()
* @dataProvider provideUnKnownLanguageTags
+ * @covers Language::isKnownLanguageTag
*/
- function testUnknownLanguageTag( $code, $message = '' ) {
+ public function testUnknownLanguageTag( $code, $message = '' ) {
$this->assertFalse(
(bool)Language::isKnownLanguageTag( $code ),
"checking that code $code is invalid - $message"
);
}
- function provideUnknownLanguageTags() {
+ public static function provideUnknownLanguageTags() {
return array(
array( 'mw', 'non-existent two-letter code' ),
+ array( 'foo"<bar', 'very invalid language code' ),
);
}
/**
+ * Test too short timestamp
+ * @expectedException MWException
+ * @covers Language::sprintfDate
+ */
+ public function testSprintfDateTooShortTimestamp() {
+ $this->getLang()->sprintfDate( 'xiY', '1234567890123' );
+ }
+
+ /**
+ * Test too long timestamp
+ * @expectedException MWException
+ * @covers Language::sprintfDate
+ */
+ public function testSprintfDateTooLongTimestamp() {
+ $this->getLang()->sprintfDate( 'xiY', '123456789012345' );
+ }
+
+ /**
+ * Test too short timestamp
+ * @expectedException MWException
+ * @covers Language::sprintfDate
+ */
+ public function testSprintfDateNotAllDigitTimestamp() {
+ $this->getLang()->sprintfDate( 'xiY', '-1234567890123' );
+ }
+
+ /**
* @dataProvider provideSprintfDateSamples
+ * @covers Language::sprintfDate
*/
- function testSprintfDate( $format, $ts, $expected, $msg ) {
+ public function testSprintfDate( $format, $ts, $expected, $msg ) {
$this->assertEquals(
$expected,
$this->getLang()->sprintfDate( $format, $ts ),
@@ -511,10 +556,11 @@ class LanguageTest extends LanguageClassesTestCase {
}
/**
- * bug 33454. sprintfDate should always use UTC.
+ * sprintfDate should always use UTC when no zone is given.
* @dataProvider provideSprintfDateSamples
+ * @covers Language::sprintfDate
*/
- function testSprintfDateTZ( $format, $ts, $expected, $msg ) {
+ public function testSprintfDateNoZone( $format, $ts, $expected, $ignore, $msg ) {
$oldTZ = date_default_timezone_get();
$res = date_default_timezone_set( 'Asia/Seoul' );
if ( !$res ) {
@@ -530,42 +576,66 @@ class LanguageTest extends LanguageClassesTestCase {
date_default_timezone_set( $oldTZ );
}
- function provideSprintfDateSamples() {
+ /**
+ * sprintfDate should use passed timezone
+ * @dataProvider provideSprintfDateSamples
+ * @covers Language::sprintfDate
+ */
+ public function testSprintfDateTZ( $format, $ts, $ignore, $expected, $msg ) {
+ $tz = new DateTimeZone( 'Asia/Seoul' );
+ if ( !$tz ) {
+ $this->markTestSkipped( "Error getting Timezone" );
+ }
+
+ $this->assertEquals(
+ $expected,
+ $this->getLang()->sprintfDate( $format, $ts, $tz ),
+ "sprintfDate('$format', '$ts', 'Asia/Seoul'): $msg"
+ );
+ }
+
+ public static function provideSprintfDateSamples() {
return array(
array(
'xiY',
'20111212000000',
'1390', // note because we're testing English locale we get Latin-standard digits
+ '1390',
'Iranian calendar full year'
),
array(
'xiy',
'20111212000000',
'90',
+ '90',
'Iranian calendar short year'
),
array(
'o',
'20120101235000',
'2011',
+ '2011',
'ISO 8601 (week) year'
),
array(
'W',
'20120101235000',
'52',
+ '52',
'Week number'
),
array(
'W',
'20120102235000',
'1',
+ '1',
'Week number'
),
array(
'o-\\WW-N',
'20091231235000',
'2009-W53-4',
+ '2009-W53-4',
'leap week'
),
// What follows is mostly copied from http://www.mediawiki.org/wiki/Help:Extension:ParserFunctions#.23time
@@ -573,252 +643,336 @@ class LanguageTest extends LanguageClassesTestCase {
'Y',
'20120102090705',
'2012',
+ '2012',
'Full year'
),
array(
'y',
'20120102090705',
'12',
+ '12',
'2 digit year'
),
array(
'L',
'20120102090705',
'1',
+ '1',
'Leap year'
),
array(
'n',
'20120102090705',
'1',
+ '1',
'Month index, not zero pad'
),
array(
'N',
'20120102090705',
'01',
+ '01',
'Month index. Zero pad'
),
array(
'M',
'20120102090705',
'Jan',
+ 'Jan',
'Month abbrev'
),
array(
'F',
'20120102090705',
'January',
+ 'January',
'Full month'
),
array(
'xg',
'20120102090705',
'January',
+ 'January',
'Genitive month name (same in EN)'
),
array(
'j',
'20120102090705',
'2',
+ '2',
'Day of month (not zero pad)'
),
array(
'd',
'20120102090705',
'02',
+ '02',
'Day of month (zero-pad)'
),
array(
'z',
'20120102090705',
'1',
+ '1',
'Day of year (zero-indexed)'
),
array(
'D',
'20120102090705',
'Mon',
+ 'Mon',
'Day of week (abbrev)'
),
array(
'l',
'20120102090705',
'Monday',
+ 'Monday',
'Full day of week'
),
array(
'N',
'20120101090705',
'7',
+ '7',
'Day of week (Mon=1, Sun=7)'
),
array(
'w',
'20120101090705',
'0',
+ '0',
'Day of week (Sun=0, Sat=6)'
),
array(
'N',
'20120102090705',
'1',
+ '1',
'Day of week'
),
array(
'a',
'20120102090705',
'am',
+ 'am',
'am vs pm'
),
array(
'A',
'20120102120000',
'PM',
+ 'PM',
'AM vs PM'
),
array(
'a',
'20120102000000',
'am',
+ 'am',
'AM vs PM'
),
array(
'g',
'20120102090705',
'9',
+ '9',
'12 hour, not Zero'
),
array(
'h',
'20120102090705',
'09',
+ '09',
'12 hour, zero padded'
),
array(
'G',
'20120102090705',
'9',
+ '9',
'24 hour, not zero'
),
array(
'H',
'20120102090705',
'09',
+ '09',
'24 hour, zero'
),
array(
'H',
'20120102110705',
'11',
+ '11',
'24 hour, zero'
),
array(
'i',
'20120102090705',
'07',
+ '07',
'Minutes'
),
array(
's',
'20120102090705',
'05',
+ '05',
'seconds'
),
array(
'U',
'20120102090705',
'1325495225',
+ '1325462825',
'unix time'
),
array(
't',
'20120102090705',
'31',
+ '31',
'Days in current month'
),
array(
'c',
'20120102090705',
'2012-01-02T09:07:05+00:00',
+ '2012-01-02T09:07:05+09:00',
'ISO 8601 timestamp'
),
array(
'r',
'20120102090705',
'Mon, 02 Jan 2012 09:07:05 +0000',
+ 'Mon, 02 Jan 2012 09:07:05 +0900',
'RFC 5322'
),
array(
+ 'e',
+ '20120102090705',
+ 'UTC',
+ 'Asia/Seoul',
+ 'Timezone identifier'
+ ),
+ array(
+ 'I',
+ '19880602090705',
+ '0',
+ '1',
+ 'DST indicator'
+ ),
+ array(
+ 'O',
+ '20120102090705',
+ '+0000',
+ '+0900',
+ 'Timezone offset'
+ ),
+ array(
+ 'P',
+ '20120102090705',
+ '+00:00',
+ '+09:00',
+ 'Timezone offset with colon'
+ ),
+ array(
+ 'T',
+ '20120102090705',
+ 'UTC',
+ 'KST',
+ 'Timezone abbreviation'
+ ),
+ array(
+ 'Z',
+ '20120102090705',
+ '0',
+ '32400',
+ 'Timezone offset in seconds'
+ ),
+ array(
'xmj xmF xmn xmY',
'20120102090705',
'7 Safar 2 1433',
+ '7 Safar 2 1433',
'Islamic'
),
array(
'xij xiF xin xiY',
'20120102090705',
'12 Dey 10 1390',
+ '12 Dey 10 1390',
'Iranian'
),
array(
'xjj xjF xjn xjY',
'20120102090705',
'7 Tevet 4 5772',
+ '7 Tevet 4 5772',
'Hebrew'
),
array(
'xjt',
'20120102090705',
'29',
+ '29',
'Hebrew number of days in month'
),
array(
'xjx',
'20120102090705',
'Tevet',
+ 'Tevet',
'Hebrew genitive month name (No difference in EN)'
),
array(
'xkY',
'20120102090705',
'2555',
+ '2555',
'Thai year'
),
array(
'xoY',
'20120102090705',
'101',
+ '101',
'Minguo'
),
array(
'xtY',
'20120102090705',
'å¹³æˆ24',
+ 'å¹³æˆ24',
'nengo'
),
array(
'xrxkYY',
'20120102090705',
'MMDLV2012',
+ 'MMDLV2012',
'Roman numerals'
),
array(
'xhxjYY',
'20120102090705',
'ה\'תשע"ב2012',
+ 'ה\'תשע"ב2012',
'Hebrew numberals'
),
array(
'xnY',
'20120102090705',
'2012',
+ '2012',
'Raw numerals (doesn\'t mean much in EN)'
),
array(
'[[Y "(yea"\\r)]] \\"xx\\"',
'20120102090705',
'[[2012 (year)]] "x"',
+ '[[2012 (year)]] "x"',
'Various escaping'
),
@@ -827,8 +981,9 @@ class LanguageTest extends LanguageClassesTestCase {
/**
* @dataProvider provideFormatSizes
+ * @covers Language::formatSize
*/
- function testFormatSize( $size, $expected, $msg ) {
+ public function testFormatSize( $size, $expected, $msg ) {
$this->assertEquals(
$expected,
$this->getLang()->formatSize( $size ),
@@ -836,7 +991,7 @@ class LanguageTest extends LanguageClassesTestCase {
);
}
- function provideFormatSizes() {
+ public static function provideFormatSizes() {
return array(
array(
0,
@@ -889,8 +1044,9 @@ class LanguageTest extends LanguageClassesTestCase {
/**
* @dataProvider provideFormatBitrate
+ * @covers Language::formatBitrate
*/
- function testFormatBitrate( $bps, $expected, $msg ) {
+ public function testFormatBitrate( $bps, $expected, $msg ) {
$this->assertEquals(
$expected,
$this->getLang()->formatBitrate( $bps ),
@@ -898,7 +1054,7 @@ class LanguageTest extends LanguageClassesTestCase {
);
}
- function provideFormatBitrate() {
+ public static function provideFormatBitrate() {
return array(
array(
0,
@@ -961,8 +1117,9 @@ class LanguageTest extends LanguageClassesTestCase {
/**
* @dataProvider provideFormatDuration
+ * @covers Language::formatDuration
*/
- function testFormatDuration( $duration, $expected, $intervals = array() ) {
+ public function testFormatDuration( $duration, $expected, $intervals = array() ) {
$this->assertEquals(
$expected,
$this->getLang()->formatDuration( $duration, $intervals ),
@@ -970,7 +1127,7 @@ class LanguageTest extends LanguageClassesTestCase {
);
}
- function provideFormatDuration() {
+ public static function provideFormatDuration() {
return array(
array(
0,
@@ -1097,8 +1254,9 @@ class LanguageTest extends LanguageClassesTestCase {
/**
* @dataProvider provideCheckTitleEncodingData
+ * @covers Language::checkTitleEncoding
*/
- function testCheckTitleEncoding( $s ) {
+ public function testCheckTitleEncoding( $s ) {
$this->assertEquals(
$s,
$this->getLang()->checkTitleEncoding( $s ),
@@ -1106,7 +1264,7 @@ class LanguageTest extends LanguageClassesTestCase {
);
}
- function provideCheckTitleEncodingData() {
+ public static function provideCheckTitleEncodingData() {
return array(
array( "" ),
array( "United States of America" ), // 7bit ASCII
@@ -1161,8 +1319,9 @@ class LanguageTest extends LanguageClassesTestCase {
/**
* @dataProvider provideRomanNumeralsData
+ * @covers Language::romanNumeral
*/
- function testRomanNumerals( $num, $numerals ) {
+ public function testRomanNumerals( $num, $numerals ) {
$this->assertEquals(
$numerals,
Language::romanNumeral( $num ),
@@ -1170,7 +1329,7 @@ class LanguageTest extends LanguageClassesTestCase {
);
}
- function provideRomanNumeralsData() {
+ public static function provideRomanNumeralsData() {
return array(
array( 1, 'I' ),
array( 2, 'II' ),
@@ -1219,13 +1378,14 @@ class LanguageTest extends LanguageClassesTestCase {
/**
* @dataProvider providePluralData
+ * @covers Language::convertPlural
*/
- function testConvertPlural( $expected, $number, $forms ) {
+ public function testConvertPlural( $expected, $number, $forms ) {
$chosen = $this->getLang()->convertPlural( $number, $forms );
$this->assertEquals( $expected, $chosen );
}
- function providePluralData() {
+ public static function providePluralData() {
// Params are: [expected text, number given, [the plural forms]]
return array(
array( 'plural', 0, array(
@@ -1255,6 +1415,9 @@ class LanguageTest extends LanguageClassesTestCase {
array( 'other', 2, array(
'kissa=kala', '1=2=3', 'other',
) ),
+ array( '', 2, array(
+ '0=explicit zero', '1=explicit one',
+ ) ),
);
}
@@ -1262,7 +1425,7 @@ class LanguageTest extends LanguageClassesTestCase {
* @covers Language::translateBlockExpiry()
* @dataProvider provideTranslateBlockExpiry
*/
- function testTranslateBlockExpiry( $expectedData, $str, $desc ) {
+ public function testTranslateBlockExpiry( $expectedData, $str, $desc ) {
$lang = $this->getLang();
if ( is_array( $expectedData ) ) {
list( $func, $arg ) = $expectedData;
@@ -1273,7 +1436,7 @@ class LanguageTest extends LanguageClassesTestCase {
$this->assertEquals( $expected, $lang->translateBlockExpiry( $str ), $desc );
}
- function provideTranslateBlockExpiry() {
+ public static function provideTranslateBlockExpiry() {
return array(
array( '2 hours', '2 hours', 'simple data from ipboptions' ),
array( 'indefinite', 'infinite', 'infinite from ipboptions' ),
@@ -1294,7 +1457,7 @@ class LanguageTest extends LanguageClassesTestCase {
* @covers Language::commafy()
* @dataProvider provideCommafyData
*/
- function testCommafy( $number, $numbersWithCommas ) {
+ public function testCommafy( $number, $numbersWithCommas ) {
$this->assertEquals(
$numbersWithCommas,
$this->getLang()->commafy( $number ),
@@ -1302,7 +1465,7 @@ class LanguageTest extends LanguageClassesTestCase {
);
}
- function provideCommafyData() {
+ public static function provideCommafyData() {
return array(
array( 1, '1' ),
array( 10, '10' ),
@@ -1321,7 +1484,10 @@ class LanguageTest extends LanguageClassesTestCase {
);
}
- function testListToText() {
+ /**
+ * @covers Language::listToText
+ */
+ public function testListToText() {
$lang = $this->getLang();
$and = $lang->getMessageFromDB( 'and' );
$s = $lang->getMessageFromDB( 'word-separator' );
@@ -1336,12 +1502,13 @@ class LanguageTest extends LanguageClassesTestCase {
/**
* @dataProvider provideIsSupportedLanguage
+ * @covers Language::isSupportedLanguage
*/
- function testIsSupportedLanguage( $code, $expected, $comment ) {
+ public function testIsSupportedLanguage( $code, $expected, $comment ) {
$this->assertEquals( $expected, Language::isSupportedLanguage( $code ), $comment );
}
- static function provideIsSupportedLanguage() {
+ public static function provideIsSupportedLanguage() {
return array(
array( 'en', true, 'is supported language' ),
array( 'fi', true, 'is supported language' ),
@@ -1349,4 +1516,52 @@ class LanguageTest extends LanguageClassesTestCase {
array( 'FI', false, 'is not supported language, input should be in lower case' ),
);
}
+
+ /**
+ * @dataProvider provideGetParentLanguage
+ * @covers Language::getParentLanguage
+ */
+ public function testGetParentLanguage( $code, $expected, $comment ) {
+ $lang = Language::factory( $code );
+ if ( is_null( $expected ) ) {
+ $this->assertNull( $lang->getParentLanguage(), $comment );
+ } else {
+ $this->assertEquals( $expected, $lang->getParentLanguage()->getCode(), $comment );
+ }
+ }
+
+ public static function provideGetParentLanguage() {
+ return array(
+ array( 'zh-cn', 'zh', 'zh is the parent language of zh-cn' ),
+ array( 'zh', 'zh', 'zh is defined as the parent language of zh, because zh converter can convert zh-cn to zh' ),
+ array( 'zh-invalid', null, 'do not be fooled by arbitrarily composed language codes' ),
+ array( 'en-gb', null, 'en does not have converter' ),
+ array( 'en', null, 'en does not have converter. Although FakeConverter handles en -> en conversion but it is useless' ),
+ );
+ }
+
+ /**
+ * @dataProvider provideGetNamespaceAliases
+ * @covers Language::getNamespaceAliases
+ */
+ public function testGetNamespaceAliases( $languageCode, $subset ) {
+ $language = Language::factory( $languageCode );
+ $aliases = $language->getNamespaceAliases();
+ foreach ( $subset as $alias => $nsId ) {
+ $this->assertEquals( $nsId, $aliases[$alias] );
+ }
+ }
+
+ public static function provideGetNamespaceAliases() {
+ // TODO: Add tests for NS_PROJECT_TALK and GenderNamespaces
+ return array(
+ array(
+ 'zh',
+ array(
+ '文件' => NS_FILE,
+ '檔案' => NS_FILE,
+ ),
+ ),
+ );
+ }
}
diff --git a/tests/phpunit/languages/LanguageTiTest.php b/tests/phpunit/languages/LanguageTiTest.php
index 8af0eee2..e225af97 100644
--- a/tests/phpunit/languages/LanguageTiTest.php
+++ b/tests/phpunit/languages/LanguageTiTest.php
@@ -7,18 +7,28 @@
/** Tests for MediaWiki languages/classes/LanguageTi.php */
class LanguageTiTest extends LanguageClassesTestCase {
-
- /** @dataProvider providerPlural */
- function testPlural( $result, $value ) {
- $forms = array( 'one', 'many' );
+ /**
+ * @dataProvider providePlural
+ * @covers Language::convertPlural
+ */
+ public function testPlural( $result, $value ) {
+ $forms = array( 'one', 'other' );
$this->assertEquals( $result, $this->getLang()->convertPlural( $value, $forms ) );
}
- function providerPlural() {
+ /**
+ * @dataProvider providePlural
+ * @covers Language::getPluralRuleType
+ */
+ public function testGetPluralRuleType( $result, $value ) {
+ $this->assertEquals( $result, $this->getLang()->getPluralRuleType( $value ) );
+ }
+
+ public static function providePlural() {
return array(
array( 'one', 0 ),
array( 'one', 1 ),
- array( 'many', 2 ),
+ array( 'other', 2 ),
);
}
}
diff --git a/tests/phpunit/languages/LanguageTlTest.php b/tests/phpunit/languages/LanguageTlTest.php
index abd8581a..7ac51c69 100644
--- a/tests/phpunit/languages/LanguageTlTest.php
+++ b/tests/phpunit/languages/LanguageTlTest.php
@@ -7,18 +7,28 @@
/** Tests for MediaWiki languages/classes/LanguageTl.php */
class LanguageTlTest extends LanguageClassesTestCase {
-
- /** @dataProvider providerPlural */
- function testPlural( $result, $value ) {
- $forms = array( 'one', 'many' );
+ /**
+ * @dataProvider providePlural
+ * @covers Language::convertPlural
+ */
+ public function testPlural( $result, $value ) {
+ $forms = array( 'one', 'other' );
$this->assertEquals( $result, $this->getLang()->convertPlural( $value, $forms ) );
}
- function providerPlural() {
+ /**
+ * @dataProvider providePlural
+ * @covers Language::getPluralRuleType
+ */
+ public function testGetPluralRuleType( $result, $value ) {
+ $this->assertEquals( $result, $this->getLang()->getPluralRuleType( $value ) );
+ }
+
+ public static function providePlural() {
return array(
array( 'one', 0 ),
array( 'one', 1 ),
- array( 'many', 2 ),
+ array( 'other', 2 ),
);
}
}
diff --git a/tests/phpunit/languages/LanguageTrTest.php b/tests/phpunit/languages/LanguageTrTest.php
index e93d49d9..8fc2795c 100644
--- a/tests/phpunit/languages/LanguageTrTest.php
+++ b/tests/phpunit/languages/LanguageTrTest.php
@@ -17,7 +17,7 @@ class LanguageTrTest extends LanguageClassesTestCase {
* @see http://en.wikipedia.org/wiki/Dotted_and_dotless_I
* @dataProvider provideDottedAndDotlessI
*/
- function testDottedAndDotlessI( $func, $input, $inputCase, $expected ) {
+ public function testDottedAndDotlessI( $func, $input, $inputCase, $expected ) {
if ( $func == 'ucfirst' ) {
$res = $this->getLang()->ucfirst( $input );
} elseif ( $func == 'lcfirst' ) {
@@ -31,7 +31,7 @@ class LanguageTrTest extends LanguageClassesTestCase {
$this->assertEquals( $expected, $res, $msg );
}
- function provideDottedAndDotlessI() {
+ public static function provideDottedAndDotlessI() {
return array(
# function, input, input case, expected
# Case changed:
@@ -56,5 +56,4 @@ class LanguageTrTest extends LanguageClassesTestCase {
);
}
-
}
diff --git a/tests/phpunit/languages/LanguageUkTest.php b/tests/phpunit/languages/LanguageUkTest.php
index 9bbfaf66..0783fcf6 100644
--- a/tests/phpunit/languages/LanguageUkTest.php
+++ b/tests/phpunit/languages/LanguageUkTest.php
@@ -8,14 +8,24 @@
/** Tests for MediaWiki languages/classes/LanguageUk.php */
class LanguageUkTest extends LanguageClassesTestCase {
-
- /** @dataProvider providePluralFourForms */
- function testPluralFourForms( $result, $value ) {
+ /**
+ * @dataProvider providePlural
+ * @covers Language::convertPlural
+ */
+ public function testPlural( $result, $value ) {
$forms = array( 'one', 'few', 'many', 'other' );
$this->assertEquals( $result, $this->getLang()->convertPlural( $value, $forms ) );
}
- function providePluralFourForms() {
+ /**
+ * @dataProvider providePlural
+ * @covers Language::getPluralRuleType
+ */
+ public function testGetPluralRuleType( $result, $value ) {
+ $this->assertEquals( $result, $this->getLang()->getPluralRuleType( $value ) );
+ }
+
+ public static function providePlural() {
return array(
array( 'one', 1 ),
array( 'many', 11 ),
@@ -31,18 +41,21 @@ class LanguageUkTest extends LanguageClassesTestCase {
);
}
- /** @dataProvider providePluralTwoForms */
- function testPluralTwoForms( $result, $value ) {
- $forms = array( 'one', 'several' );
+ /**
+ * @dataProvider providePluralTwoForms
+ * @covers Language::convertPlural
+ */
+ public function testPluralTwoForms( $result, $value ) {
+ $forms = array( 'one', 'other' );
$this->assertEquals( $result, $this->getLang()->convertPlural( $value, $forms ) );
}
- function providePluralTwoForms() {
+ public static function providePluralTwoForms() {
return array(
array( 'one', 1 ),
- array( 'several', 11 ),
- array( 'several', 91 ),
- array( 'several', 121 ),
+ array( 'other', 11 ),
+ array( 'other', 91 ),
+ array( 'other', 121 ),
);
}
}
diff --git a/tests/phpunit/languages/LanguageUzTest.php b/tests/phpunit/languages/LanguageUzTest.php
index 495c0be6..13f57c16 100644
--- a/tests/phpunit/languages/LanguageUzTest.php
+++ b/tests/phpunit/languages/LanguageUzTest.php
@@ -10,17 +10,20 @@
* @copyright Copyright © 2012, Robin Pepermans
* @copyright Copyright © 2011, Antoine Musso <hashar at free dot fr>
* @file
+ *
+ * @todo methods in test class should be tidied:
+ * - Should be split into separate test methods and data providers
+ * - Tests for LanguageConverter and Language should probably be separate..
*/
-require_once dirname( __DIR__ ) . '/bootstrap.php';
-
/** Tests for MediaWiki languages/LanguageUz.php */
class LanguageUzTest extends LanguageClassesTestCase {
/**
* @author Nikola Smolenski
+ * @covers LanguageConverter::convertTo
*/
- function testConversionToCyrillic() {
+ public function testConversionToCyrillic() {
// A convertion of Latin to Cyrillic
$this->assertEquals( 'абвгғ',
$this->convertToCyrillic( 'abvggÊ»' )
@@ -39,7 +42,10 @@ class LanguageUzTest extends LanguageClassesTestCase {
);
}
- function testConversionToLatin() {
+ /**
+ * @covers LanguageConverter::convertTo
+ */
+ public function testConversionToLatin() {
// A simple convertion of Latin to Latin
$this->assertEquals( 'abdef',
$this->convertToLatin( 'abdef' )
@@ -57,7 +63,7 @@ class LanguageUzTest extends LanguageClassesTestCase {
* @param $variant string Language variant 'uz-cyrl' or 'uz-latn'
* @param $msg string Optional message
*/
- function assertUnConverted( $text, $variant, $msg = '' ) {
+ protected function assertUnConverted( $text, $variant, $msg = '' ) {
$this->assertEquals(
$text,
$this->convertTo( $text, $variant ),
@@ -71,7 +77,7 @@ class LanguageUzTest extends LanguageClassesTestCase {
* @param $variant string Language variant 'uz-cyrl' or 'uz-latn'
* @param $msg string Optional message
*/
- function assertConverted( $text, $variant, $msg = '' ) {
+ protected function assertConverted( $text, $variant, $msg = '' ) {
$this->assertNotEquals(
$text,
$this->convertTo( $text, $variant ),
@@ -84,7 +90,7 @@ class LanguageUzTest extends LanguageClassesTestCase {
* using the cyrillic variant and converted to Latin when using
* the Latin variant.
*/
- function assertCyrillic( $text, $msg = '' ) {
+ protected function assertCyrillic( $text, $msg = '' ) {
$this->assertUnConverted( $text, 'uz-cyrl', $msg );
$this->assertConverted( $text, 'uz-latn', $msg );
}
@@ -94,22 +100,22 @@ class LanguageUzTest extends LanguageClassesTestCase {
* using the Latin variant and converted to Cyrillic when using
* the Cyrillic variant.
*/
- function assertLatin( $text, $msg = '' ) {
+ protected function assertLatin( $text, $msg = '' ) {
$this->assertUnConverted( $text, 'uz-latn', $msg );
$this->assertConverted( $text, 'uz-cyrl', $msg );
}
/** Wrapper for converter::convertTo() method*/
- function convertTo( $text, $variant ) {
+ protected function convertTo( $text, $variant ) {
return $this->getLang()->mConverter->convertTo( $text, $variant );
}
- function convertToCyrillic( $text ) {
+ protected function convertToCyrillic( $text ) {
return $this->convertTo( $text, 'uz-cyrl' );
}
- function convertToLatin( $text ) {
+ protected function convertToLatin( $text ) {
return $this->convertTo( $text, 'uz-latn' );
}
}
diff --git a/tests/phpunit/languages/LanguageWaTest.php b/tests/phpunit/languages/LanguageWaTest.php
index 28329fa3..d05196c0 100644
--- a/tests/phpunit/languages/LanguageWaTest.php
+++ b/tests/phpunit/languages/LanguageWaTest.php
@@ -7,18 +7,28 @@
/** Tests for MediaWiki languages/classes/LanguageWa.php */
class LanguageWaTest extends LanguageClassesTestCase {
-
- /** @dataProvider providerPlural */
- function testPlural( $result, $value ) {
- $forms = array( 'one', 'many' );
+ /**
+ * @dataProvider providePlural
+ * @covers Language::convertPlural
+ */
+ public function testPlural( $result, $value ) {
+ $forms = array( 'one', 'other' );
$this->assertEquals( $result, $this->getLang()->convertPlural( $value, $forms ) );
}
- function providerPlural() {
+ /**
+ * @dataProvider providePlural
+ * @covers Language::getPluralRuleType
+ */
+ public function testGetPluralRuleType( $result, $value ) {
+ $this->assertEquals( $result, $this->getLang()->getPluralRuleType( $value ) );
+ }
+
+ public static function providePlural() {
return array(
array( 'one', 0 ),
array( 'one', 1 ),
- array( 'many', 2 ),
+ array( 'other', 2 ),
);
}
}
diff --git a/tests/phpunit/languages/utils/CLDRPluralRuleEvaluatorTest.php b/tests/phpunit/languages/utils/CLDRPluralRuleEvaluatorTest.php
index 73d5dcc0..3bf74146 100644
--- a/tests/phpunit/languages/utils/CLDRPluralRuleEvaluatorTest.php
+++ b/tests/phpunit/languages/utils/CLDRPluralRuleEvaluatorTest.php
@@ -89,7 +89,7 @@ class CLDRPluralRuleEvaluatorTest extends MediaWikiTestCase {
array( 'n', 'just n' ),
array( 'n is in 5', 'is in' ),
);
+
return $tests;
}
-
}
diff --git a/tests/phpunit/maintenance/DumpTestCase.php b/tests/phpunit/maintenance/DumpTestCase.php
index 40d24fc5..83d8c71d 100644
--- a/tests/phpunit/maintenance/DumpTestCase.php
+++ b/tests/phpunit/maintenance/DumpTestCase.php
@@ -60,11 +60,14 @@ abstract class DumpTestCase extends MediaWikiLangTestCase {
if ( $gzipped_contents === false ) {
$this->fail( "Could not get contents of $fname" );
}
- // We resort to use gzinflate instead of gzdecode, as gzdecode
- // need not be available
- $contents = gzinflate( substr( $gzipped_contents, 10, -8 ) );
- $this->assertEquals( strlen( $contents ),
- file_put_contents( $fname, $contents ), "# bytes written" );
+
+ $contents = gzdecode( $gzipped_contents );
+
+ $this->assertEquals(
+ strlen( $contents ),
+ file_put_contents( $fname, $contents ),
+ '# bytes written'
+ );
}
/**
@@ -73,8 +76,6 @@ abstract class DumpTestCase extends MediaWikiLangTestCase {
* Clears $wgUser, and reports errors from addDBData to PHPUnit
*/
protected function setUp() {
- global $wgUser;
-
parent::setUp();
// Check if any Exception is stored for rethrowing from addDBData
@@ -83,7 +84,7 @@ abstract class DumpTestCase extends MediaWikiLangTestCase {
throw $this->exceptionFromAddDBData;
}
- $wgUser = new User();
+ $this->setMwGlobals( 'wgUser', new User() );
}
/**
@@ -116,7 +117,7 @@ abstract class DumpTestCase extends MediaWikiLangTestCase {
* @param $name string: name of the closing element to look for
* (e.g.: "mediawiki" when looking for </mediawiki>)
*
- * @return bool: true iff the end node could be found. false otherwise.
+ * @return bool: true if the end node could be found. false otherwise.
*/
protected function skipToNodeEnd( $name ) {
while ( $this->xml->read() ) {
@@ -126,6 +127,7 @@ abstract class DumpTestCase extends MediaWikiLangTestCase {
return true;
}
}
+
return false;
}
@@ -147,6 +149,7 @@ abstract class DumpTestCase extends MediaWikiLangTestCase {
return true;
}
}
+
return false;
}
@@ -273,7 +276,6 @@ abstract class DumpTestCase extends MediaWikiLangTestCase {
$this->assertTextNode( "title", $name );
$this->assertTextNode( "ns", $ns );
$this->assertTextNode( "id", $id );
-
}
/**
@@ -301,8 +303,8 @@ abstract class DumpTestCase extends MediaWikiLangTestCase {
* @param $parentid int|false: (optional) id of the parent revision
*/
protected function assertRevision( $id, $summary, $text_id, $text_bytes, $text_sha1, $text = false, $parentid = false,
- $model = CONTENT_MODEL_WIKITEXT, $format = CONTENT_FORMAT_WIKITEXT ) {
-
+ $model = CONTENT_MODEL_WIKITEXT, $format = CONTENT_FORMAT_WIKITEXT
+ ) {
$this->assertNodeStart( "revision" );
$this->skipWhitespace();
diff --git a/tests/phpunit/maintenance/MaintenanceTest.php b/tests/phpunit/maintenance/MaintenanceTest.php
index 741f8b7f..318ce0da 100644
--- a/tests/phpunit/maintenance/MaintenanceTest.php
+++ b/tests/phpunit/maintenance/MaintenanceTest.php
@@ -43,7 +43,7 @@ class MaintenanceFixup extends Maintenance {
private $testCase;
/**
- * shutdownSimulated === true iff simulateShutdown has done it's work
+ * shutdownSimulated === true if simulateShutdown has done it's work
*
* @var bool
*/
@@ -128,7 +128,6 @@ class MaintenanceFixup extends Maintenance {
public function execute() {
$this->testCase->fail( __METHOD__ . " called unexpectedly" );
}
-
}
class MaintenanceTest extends MediaWikiTestCase {
@@ -186,7 +185,6 @@ class MaintenanceTest extends MediaWikiTestCase {
// test.*Intermittent.* tests), the objective of these tests is not to describe
// consistent behavior, but rather currently existing behavior.
-
function testOutputEmpty() {
$this->m->output( "" );
$this->assertOutputPrePostShutdown( "", false );
@@ -815,6 +813,4 @@ class MaintenanceTest extends MediaWikiTestCase {
$m2->simulateShutdown();
$this->assertOutputPrePostShutdown( "foobar\n\n", false );
}
-
-
}
diff --git a/tests/phpunit/maintenance/backupPrefetchTest.php b/tests/phpunit/maintenance/backupPrefetchTest.php
index cc00e6e5..bc2d7375 100644
--- a/tests/phpunit/maintenance/backupPrefetchTest.php
+++ b/tests/phpunit/maintenance/backupPrefetchTest.php
@@ -36,7 +36,6 @@ class BaseDumpTest extends MediaWikiTestCase {
private function assertPrefetchEquals( $expected, $page, $revision ) {
$this->assertEquals( $expected, $this->dump->prefetch( $page, $revision ),
"Prefetch of page $page revision $revision" );
-
}
function testSequential() {
@@ -181,7 +180,6 @@ class BaseDumpTest extends MediaWikiTestCase {
</siteinfo>
';
-
// An array holding the pages that are available for prefetch
$available_pages = array();
@@ -274,5 +272,4 @@ class BaseDumpTest extends MediaWikiTestCase {
return $fname;
}
-
}
diff --git a/tests/phpunit/maintenance/backupTextPassTest.php b/tests/phpunit/maintenance/backupTextPassTest.php
index 09623445..653a1145 100644
--- a/tests/phpunit/maintenance/backupTextPassTest.php
+++ b/tests/phpunit/maintenance/backupTextPassTest.php
@@ -63,7 +63,7 @@ class TextPassDumperTest extends DumpTestCase {
// Page from non-default namespace
if ( $ns === NS_TALK ) {
- //@todo: work around this.
+ // @todo work around this.
throw new MWException( "The default wikitext namespace is the talk namespace. "
. " We can't currently deal with that." );
}
@@ -80,7 +80,6 @@ class TextPassDumperTest extends DumpTestCase {
// DumpTestCase
$this->exceptionFromAddDBData = $e;
}
-
}
protected function setUp() {
@@ -94,7 +93,6 @@ class TextPassDumperTest extends DumpTestCase {
array( $this->pageId2, $this->pageId3, $this->pageId4 ),
array( $this->pageId1 + 1, $this->pageId2 + 1, $this->pageId3 + 1 ),
"Page ids increasing without holes" );
-
}
function testPlain() {
@@ -214,7 +212,6 @@ class TextPassDumperTest extends DumpTestCase {
$this->assertPageEnd();
$this->assertDumpEnd();
-
}
/**
@@ -239,7 +236,6 @@ class TextPassDumperTest extends DumpTestCase {
$minDuration = 2; // We want the dump to take at least this many seconds
$checkpointAfter = 0.5; // Generate checkpoint after this many seconds
-
// Until a dump takes at least $minDuration seconds, perform a dump and check
// duration. If the dump did not take long enough increase the iteration
// count, to generate a bigger stub file next time.
@@ -579,6 +575,7 @@ class TextPassDumperTest extends DumpTestCase {
$content .= $tail;
$this->assertEquals( strlen( $content ), file_put_contents(
$fname, $content ), "Length of prepared stub" );
+
return $fname;
}
}
diff --git a/tests/phpunit/maintenance/backup_LogTest.php b/tests/phpunit/maintenance/backup_LogTest.php
index 5cf172e6..98d81653 100644
--- a/tests/phpunit/maintenance/backup_LogTest.php
+++ b/tests/phpunit/maintenance/backup_LogTest.php
@@ -39,6 +39,7 @@ class BackupDumperLoggerTest extends DumpTestCase {
if ( $parameters !== null ) {
$logEntry->setParameters( $parameters );
}
+
return $logEntry->insert();
}
@@ -75,14 +76,12 @@ class BackupDumperLoggerTest extends DumpTestCase {
$user2, NS_MAIN, "PageA", "SomeOtherComment",
array( 'key1' => 1, 3 => 'value3' ) );
$this->assertGreaterThan( 0, $this->logId3 );
-
} catch ( Exception $e ) {
// We'd love to pass $e directly. However, ... see
// documentation of exceptionFromAddDBData in
// DumpTestCase
$this->exceptionFromAddDBData = $e;
}
-
}
@@ -226,5 +225,4 @@ class BackupDumperLoggerTest extends DumpTestCase {
// the following statement to catch good output
$this->expectOutputString( '' );
}
-
}
diff --git a/tests/phpunit/maintenance/backup_PageTest.php b/tests/phpunit/maintenance/backup_PageTest.php
index 07c76705..99bd2700 100644
--- a/tests/phpunit/maintenance/backup_PageTest.php
+++ b/tests/phpunit/maintenance/backup_PageTest.php
@@ -34,7 +34,7 @@ class BackupDumperPageTest extends DumpTestCase {
$this->talk_namespace = NS_TALK;
if ( $this->namespace === $this->talk_namespace ) {
- //@todo: work around this.
+ // @todo work around this.
throw new MWException( "The default wikitext namespace is the talk namespace. "
. " We can't currently deal with that." );
}
@@ -79,7 +79,6 @@ class BackupDumperPageTest extends DumpTestCase {
// DumpTestCase
$this->exceptionFromAddDBData = $e;
}
-
}
protected function setUp() {
@@ -93,7 +92,6 @@ class BackupDumperPageTest extends DumpTestCase {
array( $this->pageId2, $this->pageId3, $this->pageId4 ),
array( $this->pageId1 + 1, $this->pageId2 + 1, $this->pageId3 + 1 ),
"Page ids increasing without holes" );
-
}
function testFullTextPlain() {
@@ -403,6 +401,4 @@ class BackupDumperPageTest extends DumpTestCase {
$this->expectETAOutput();
}
-
-
}
diff --git a/tests/phpunit/maintenance/fetchTextTest.php b/tests/phpunit/maintenance/fetchTextTest.php
index 4d1d45d6..e8df199e 100644
--- a/tests/phpunit/maintenance/fetchTextTest.php
+++ b/tests/phpunit/maintenance/fetchTextTest.php
@@ -63,7 +63,6 @@ class SemiMockedFetchText extends FetchText {
return fopen( 'data://text/plain,' . $this->mockStdinText, 'r' );
}
-
}
/**
@@ -236,5 +235,4 @@ class FetchTextTest extends MediaWikiTestCase {
$this->textId3 . "\n23\nFetchTextTestPage2Text2"
) ) );
}
-
}
diff --git a/tests/phpunit/maintenance/getSlaveServerTest.php b/tests/phpunit/maintenance/getSlaveServerTest.php
index 699571b7..2c848862 100644
--- a/tests/phpunit/maintenance/getSlaveServerTest.php
+++ b/tests/phpunit/maintenance/getSlaveServerTest.php
@@ -64,6 +64,4 @@ class GetSlaveServerTest extends MediaWikiTestCase {
$this->expectOutputRegex( "/^[[:space:]]*\[wgDBprefix\][[:space:]]*=> "
. $wgDBprefix . "$/m" );
}
-
-
}
diff --git a/tests/phpunit/mocks/filebackend/MockFSFile.php b/tests/phpunit/mocks/filebackend/MockFSFile.php
new file mode 100644
index 00000000..e0463281
--- /dev/null
+++ b/tests/phpunit/mocks/filebackend/MockFSFile.php
@@ -0,0 +1,69 @@
+<?php
+/**
+ * Mock of a filesystem file.
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with this program; if not, write to the Free Software Foundation, Inc.,
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ * http://www.gnu.org/copyleft/gpl.html
+ *
+ * @file
+ * @ingroup FileBackend
+ */
+
+/**
+ * Class representing an in memory fake file.
+ * This is intended for unit testing / developement when you do not want
+ * to hit the filesystem.
+ *
+ * It reimplements abstract methods with some hardcoded values. Might
+ * not be suitable for all tests but is good enough for the parser tests.
+ *
+ * @ingroup FileBackend
+ */
+class MockFSFile extends FSFile {
+ protected $sha1Base36 = null; // File Sha1Base36
+
+ public function exists() {
+ return true;
+ }
+
+ /**
+ * August 22 – The theft of the Mona Lisa is discovered in the Louvre."
+ * @bug 20281
+ */
+ public function getSize() {
+ return 1911;
+ }
+
+ public function getTimestamp() {
+ return wfTimestamp( TS_MW );
+ }
+
+ public function getMimeType() {
+ return 'text/mock';
+ }
+
+ public function getProps( $ext = true ) {
+ return array(
+ 'fileExists' => $this->exists(),
+ 'size' => $this->getSize(),
+ 'file-mime' => $this->getMimeType(),
+ 'sha1' => $this->getSha1Base36(),
+ );
+ }
+
+ public function getSha1Base36( $recache = false ) {
+ return '1234567890123456789012345678901';
+ }
+}
diff --git a/tests/phpunit/mocks/filebackend/MockFileBackend.php b/tests/phpunit/mocks/filebackend/MockFileBackend.php
new file mode 100644
index 00000000..49aefbd1
--- /dev/null
+++ b/tests/phpunit/mocks/filebackend/MockFileBackend.php
@@ -0,0 +1,122 @@
+<?php
+/**
+ * Simulation (mock) of a backend storage.
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with this program; if not, write to the Free Software Foundation, Inc.,
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ * http://www.gnu.org/copyleft/gpl.html
+ *
+ * @file
+ * @ingroup FileBackend
+ * @author Antoine Musso <hashar@free.fr>
+ */
+
+/**
+ * Class simulating a backend store.
+ *
+ * @ingroup FileBackend
+ * @since 1.22
+ */
+class MockFileBackend extends FileBackendStore {
+
+ protected $mocked = array();
+
+ /** Poor man debugging */
+ protected function debug( $msg = '' ) {
+ wfDebug( wfGetCaller() . "$msg\n" );
+ }
+
+ public function isPathUsableInternal( $storagePath ) {
+ return true;
+ }
+
+ protected function doCreateInternal( array $params ) {
+ if ( isset( $params['content'] ) ) {
+ $content = $params['content'];
+ } else {
+ $content = 'Default mocked file content';
+ }
+ $this->debug( serialize( $params ) );
+ $dst = $params['dst'];
+ $this->mocked[$dst] = $content;
+ return Status::newGood();
+ }
+
+ protected function doStoreInternal( array $params ) {
+ $this->debug( serialize( $params ) );
+ return $this->doCreateInternal( $params );
+ }
+
+ protected function doCopyInternal( array $params ) {
+ $this->debug( serialize( $params ) );
+ $src = $params['src'];
+ $dst = $params['dst'];
+ $this->mocked[$dst] = $this->mocked[$src];
+ return Status::newGood();
+ }
+
+ protected function doDeleteInternal( array $params ) {
+ $this->debug( serialize( $params ) );
+ $src = $params['src'];
+ unset( $this->mocked[$src] );
+ return Status::newGood();
+ }
+
+ protected function doGetFileStat( array $params ) {
+ $src = $params['src'];
+ if ( array_key_exists( $src, $this->mocked ) ) {
+ $this->debug( "('$src') found" );
+ return array(
+ 'mtime' => wfTimestamp( TS_MW ),
+ 'size' => strlen( $this->mocked[$src] ),
+ # No sha1, stat does not need it.
+ );
+ } else {
+ $this->debug( "('$src') not found" );
+ return false;
+ }
+ }
+
+ protected function doGetLocalCopyMulti( array $params ) {
+ $tmpFiles = array(); // (path => MockFSFile)
+
+ $this->debug( '(' . serialize( $params ) . ')' );
+ foreach ( $params['srcs'] as $src ) {
+ $tmpFiles[$src] = new MockFSFile(
+ wfTempDir() . '/' . wfRandomString( 32 )
+ );
+ }
+ return $tmpFiles;
+ }
+
+ protected function doDirectoryExists( $container, $dir, array $params ) {
+ $this->debug();
+ return true;
+ }
+
+ public function getDirectoryListInternal( $container, $dir, array $params ) {
+ $this->debug();
+ return array();
+ }
+
+ public function getFileListInternal( $container, $dir, array $params ) {
+ $this->debug();
+ return array();
+ }
+
+ protected function directoriesAreVirtual() {
+ $this->debug();
+ return true;
+ }
+}
diff --git a/tests/phpunit/mocks/media/MockBitmapHandler.php b/tests/phpunit/mocks/media/MockBitmapHandler.php
new file mode 100644
index 00000000..742b41e4
--- /dev/null
+++ b/tests/phpunit/mocks/media/MockBitmapHandler.php
@@ -0,0 +1,92 @@
+<?php
+/**
+ * Fake handler for images.
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with this program; if not, write to the Free Software Foundation, Inc.,
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ * http://www.gnu.org/copyleft/gpl.html
+ *
+ * @file
+ * @ingroup Media
+ */
+
+class MockBitmapHandler extends BitmapHandler {
+ function doTransform( $image, $dstPath, $dstUrl, $params, $flags = 0 ) {
+ return MockImageHandler::doFakeTransform( $this, $image, $dstPath, $dstUrl, $params, $flags );
+ }
+ function doClientImage( $image, $scalerParams ) {
+ return $this->getClientScalingThumbnailImage( $image, $scalerParams );
+ }
+}
+class MockSvgHandler extends SvgHandler {
+ function doTransform( $image, $dstPath, $dstUrl, $params, $flags = 0 ) {
+ return MockImageHandler::doFakeTransform( $this, $image, $dstPath, $dstUrl, $params, $flags );
+ }
+}
+/**
+ * Mock handler for images.
+ *
+ * This is really intended for unit testing.
+ *
+ * @ingroup Media
+ */
+class MockImageHandler {
+
+ /**
+ * Override BitmapHandler::doTransform() making sure we do not generate
+ * a thumbnail at all. That is merely returning a ThumbnailImage that
+ * will be consumed by the unit test. There is no need to create a real
+ * thumbnail on the filesystem.
+ */
+ static function doFakeTransform( $that, $image, $dstPath, $dstUrl, $params, $flags = 0 ) {
+ # Example of what we receive:
+ # $image: LocalFile
+ # $dstPath: /tmp/transform_7d0a7a2f1a09-1.jpg
+ # $dstUrl : http://example.com/images/thumb/0/09/Bad.jpg/320px-Bad.jpg
+ # $params: width: 320, descriptionUrl http://trunk.dev/wiki/File:Bad.jpg
+
+ $that->normaliseParams( $image, $params );
+
+ $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(),
+ 'dstPath' => $dstPath,
+ 'dstUrl' => $dstUrl,
+ );
+
+ # In some cases, we do not bother generating a thumbnail.
+ if ( !$image->mustRender() &&
+ $scalerParams['physicalWidth'] == $scalerParams['srcWidth']
+ && $scalerParams['physicalHeight'] == $scalerParams['srcHeight']
+ ) {
+ wfDebug( __METHOD__ . ": returning unscaled image\n" );
+ // getClientScalingThumbnailImage is protected
+ return $that->doClientImage( $image, $scalerParams );
+ }
+
+ return new ThumbnailImage( $image, $dstUrl, false, $params );
+ }
+}
diff --git a/tests/phpunit/phpunit.php b/tests/phpunit/phpunit.php
index 2ec07440..1d65e521 100644
--- a/tests/phpunit/phpunit.php
+++ b/tests/phpunit/phpunit.php
@@ -12,7 +12,7 @@
define( 'MW_PHPUNIT_TEST', true );
// Start up MediaWiki in command-line mode
-require_once( dirname( dirname( __DIR__ ) ) . "/maintenance/Maintenance.php" );
+require_once dirname( dirname( __DIR__ ) ) . "/maintenance/Maintenance.php";
class PHPUnitMaintClass extends Maintenance {
@@ -33,6 +33,9 @@ class PHPUnitMaintClass extends Maintenance {
global $wgLocaltimezone, $wgLocalisationCacheConf;
global $wgDevelopmentWarnings;
+ // Inject test autoloader
+ require_once __DIR__ . '/../TestsAutoLoader.php';
+
// wfWarn should cause tests to fail
$wgDevelopmentWarnings = true;
@@ -50,8 +53,11 @@ class PHPUnitMaintClass extends Maintenance {
// Bug 44192 Do not attempt to send a real e-mail
Hooks::clear( 'AlternateUserMailer' );
- Hooks::register( 'AlternateUserMailer',
- function() { return false; }
+ Hooks::register(
+ 'AlternateUserMailer',
+ function () {
+ return false;
+ }
);
}
@@ -86,7 +92,6 @@ class PHPUnitMaintClass extends Maintenance {
unset( $_SERVER['argv'][$key] ); // the option
unset( $_SERVER['argv'][$key + 1] ); // its value
$_SERVER['argv'] = array_values( $_SERVER['argv'] );
-
}
}
@@ -96,16 +101,19 @@ class PHPUnitMaintClass extends Maintenance {
}
$maintClass = 'PHPUnitMaintClass';
-require( RUN_MAINTENANCE_IF_MAIN );
+require RUN_MAINTENANCE_IF_MAIN;
-require_once( 'PHPUnit/Runner/Version.php' );
+if ( !class_exists( 'PHPUnit_Runner_Version' ) ) {
+ require_once 'PHPUnit/Runner/Version.php';
+}
if ( PHPUnit_Runner_Version::id() !== '@package_version@'
&& version_compare( PHPUnit_Runner_Version::id(), '3.6.7', '<' )
) {
die( 'PHPUnit 3.6.7 or later required, you have ' . PHPUnit_Runner_Version::id() . ".\n" );
}
-require_once( 'PHPUnit/Autoload.php' );
-require_once( "$IP/tests/TestsAutoLoader.php" );
+if ( !class_exists( 'PHPUnit_TextUI_Command' ) ) {
+ require_once 'PHPUnit/Autoload.php';
+}
MediaWikiPHPUnitCommand::main();
diff --git a/tests/phpunit/skins/SideBarTest.php b/tests/phpunit/skins/SideBarTest.php
index 3902b686..a385320f 100644
--- a/tests/phpunit/skins/SideBarTest.php
+++ b/tests/phpunit/skins/SideBarTest.php
@@ -5,7 +5,10 @@
*/
class SideBarTest extends MediaWikiLangTestCase {
- /** A skin template, reinitialized before each test */
+ /**
+ * A skin template, reinitialized before each test
+ * @var SkinTemplate
+ */
private $skin;
/** Local cache for sidebar messages */
private $messages;
@@ -36,16 +39,12 @@ class SideBarTest extends MediaWikiLangTestCase {
$this->skin->getContext()->setLanguage( Language::factory( 'en' ) );
}
- protected function tearDown() {
- parent::tearDown();
- $this->skin = null;
- }
-
/**
* Internal helper to test the sidebar
* @param $expected
* @param $text
* @param $message (Default: '')
+ * @todo this assert method to should be converted to a test using a dataprovider..
*/
private function assertSideBar( $expected, $text, $message = '' ) {
$bar = array();
@@ -53,7 +52,10 @@ class SideBarTest extends MediaWikiLangTestCase {
$this->assertEquals( $expected, $bar, $message );
}
- function testSidebarWithOnlyTwoTitles() {
+ /**
+ * @covers SkinTemplate::addToSidebarPlain
+ */
+ public function testSidebarWithOnlyTwoTitles() {
$this->assertSideBar(
array(
'Title1' => array(),
@@ -65,7 +67,10 @@ class SideBarTest extends MediaWikiLangTestCase {
);
}
- function testExpandMessages() {
+ /**
+ * @covers SkinTemplate::addToSidebarPlain
+ */
+ public function testExpandMessages() {
$this->assertSidebar(
array( 'Title' => array(
array(
@@ -81,7 +86,10 @@ class SideBarTest extends MediaWikiLangTestCase {
);
}
- function testExternalUrlsRequireADescription() {
+ /**
+ * @covers SkinTemplate::addToSidebarPlain
+ */
+ public function testExternalUrlsRequireADescription() {
$this->assertSidebar(
array( 'Title' => array(
# ** http://www.mediawiki.org/| Home
@@ -100,14 +108,14 @@ class SideBarTest extends MediaWikiLangTestCase {
** http://valid.no.desc.org/
'
);
-
}
/**
* bug 33321 - Make sure there's a | after transforming.
* @group Database
+ * @covers SkinTemplate::addToSidebarPlain
*/
- function testTrickyPipe() {
+ public function testTrickyPipe() {
$this->assertSidebar(
array( 'Title' => array(
# The first 2 are skipped
@@ -116,13 +124,13 @@ class SideBarTest extends MediaWikiLangTestCase {
# ** Baz|Fred
array(
'text' => 'Fred',
- 'href' => Title::newFromText( 'Baz' )->getLocalUrl(),
+ 'href' => Title::newFromText( 'Baz' )->getLocalURL(),
'id' => 'n-Fred',
'active' => null,
),
array(
'text' => 'title-to-display',
- 'href' => Title::newFromText( 'page-to-go-to' )->getLocalUrl(),
+ 'href' => Title::newFromText( 'page-to-go-to' )->getLocalURL(),
'id' => 'n-title-to-display',
'active' => null,
),
@@ -151,11 +159,12 @@ class SideBarTest extends MediaWikiLangTestCase {
/**
* Simple test to verify our helper assertAttribs() is functional
- * Please note this assume MediaWiki default settings:
- * $wgNoFollowLinks = true
- * $wgExternalLinkTarget = false
*/
- function testTestAttributesAssertionHelper() {
+ public function testTestAttributesAssertionHelper() {
+ $this->setMwGlobals( array(
+ 'wgNoFollowLinks' => true,
+ 'wgExternalLinkTarget' => false,
+ ) );
$attribs = $this->getAttribs();
$this->assertArrayHasKey( 'rel', $attribs );
@@ -167,39 +176,31 @@ class SideBarTest extends MediaWikiLangTestCase {
/**
* Test $wgNoFollowLinks in sidebar
*/
- function testRespectWgnofollowlinks() {
- global $wgNoFollowLinks;
- $saved = $wgNoFollowLinks;
- $wgNoFollowLinks = false;
+ public function testRespectWgnofollowlinks() {
+ $this->setMwGlobals( 'wgNoFollowLinks', false );
$attribs = $this->getAttribs();
$this->assertArrayNotHasKey( 'rel', $attribs,
'External URL in sidebar do not have rel=nofollow when $wgNoFollowLinks = false'
);
-
- // Restore global
- $wgNoFollowLinks = $saved;
}
/**
* Test $wgExternaLinkTarget in sidebar
+ * @dataProvider dataRespectExternallinktarget
*/
- function testRespectExternallinktarget() {
- global $wgExternalLinkTarget;
- $saved = $wgExternalLinkTarget;
+ public function testRespectExternallinktarget( $externalLinkTarget ) {
+ $this->setMwGlobals( 'wgExternalLinkTarget', $externalLinkTarget );
- $wgExternalLinkTarget = '_blank';
$attribs = $this->getAttribs();
$this->assertArrayHasKey( 'target', $attribs );
- $this->assertEquals( $attribs['target'], '_blank' );
-
- $wgExternalLinkTarget = '_self';
- $attribs = $this->getAttribs();
- $this->assertArrayHasKey( 'target', $attribs );
- $this->assertEquals( $attribs['target'], '_self' );
-
- // Restore global
- $wgExternalLinkTarget = $saved;
+ $this->assertEquals( $attribs['target'], $externalLinkTarget );
}
+ public static function dataRespectExternallinktarget() {
+ return array(
+ array( '_blank' ),
+ array( '_self' ),
+ );
+ }
}
diff --git a/tests/phpunit/AutoLoaderTest.php b/tests/phpunit/structure/AutoLoaderTest.php
index c8f38685..205ea360 100644
--- a/tests/phpunit/AutoLoaderTest.php
+++ b/tests/phpunit/structure/AutoLoaderTest.php
@@ -1,6 +1,12 @@
<?php
class AutoLoaderTest extends MediaWikiTestCase {
+ /**
+ * Assert that there were no classes loaded that are not registered with the AutoLoader.
+ *
+ * For example foo.php having class Foo and class Bar but only registering Foo.
+ * This is important because we should not be relying on Foo being used before Bar.
+ */
public function testAutoLoadConfig() {
$results = self::checkAutoLoadConf();
@@ -12,7 +18,6 @@ class AutoLoaderTest extends MediaWikiTestCase {
protected static function checkAutoLoadConf() {
global $wgAutoloadLocalClasses, $wgAutoloadClasses, $IP;
- static $supportsParsekit;
$supportsParsekit = function_exists( 'parsekit_compile_file' );
// wgAutoloadLocalClasses has precedence, just like in includes/AutoLoader.php
diff --git a/tests/phpunit/resources/ResourcesTest.php b/tests/phpunit/structure/ResourcesTest.php
index 71b8c676..fe823fa4 100644
--- a/tests/phpunit/resources/ResourcesTest.php
+++ b/tests/phpunit/structure/ResourcesTest.php
@@ -3,10 +3,15 @@
* Sanity checks for making sure registered resources are sane.
*
* @file
- * @author Niklas Laxström, 2012
- * @author Antoine Musso, 2012
- * @author Santhosh Thottingal, 2012
- * @author Timo Tijhof, 2012
+ * @author Antoine Musso
+ * @author Niklas Laxström
+ * @author Santhosh Thottingal
+ * @author Timo Tijhof
+ * @copyright © 2012, Antoine Musso
+ * @copyright © 2012, Niklas Laxström
+ * @copyright © 2012, Santhosh Thottingal
+ * @copyright © 2012, Timo Tijhof
+ *
* @license http://www.gnu.org/copyleft/gpl.html GNU General Public License 2.0 or later
*/
class ResourcesTest extends MediaWikiTestCase {
@@ -91,7 +96,7 @@ class ResourcesTest extends MediaWikiTestCase {
$property = $reflectedModule->getProperty( $propName );
$property->setAccessible( true );
$lists = $property->getValue( $module );
- foreach ( $lists as $group => $list ) {
+ foreach ( $lists as $list ) {
foreach ( $list as $key => $value ) {
// We need the same filter as for 'lists',
// due to 'skinStyles'.
@@ -116,7 +121,6 @@ class ResourcesTest extends MediaWikiTestCase {
$file,
);
}
-
}
// Restore settings
@@ -124,5 +128,4 @@ class ResourcesTest extends MediaWikiTestCase {
return $cases;
}
-
}
diff --git a/tests/phpunit/StructureTest.php b/tests/phpunit/structure/StructureTest.php
index a9420981..df00d4df 100644
--- a/tests/phpunit/StructureTest.php
+++ b/tests/phpunit/structure/StructureTest.php
@@ -14,7 +14,7 @@ class StructureTest extends MediaWikiTestCase {
if ( wfIsWindows() ) {
$this->markTestSkipped( 'This test does not work on Windows' );
}
- $rootPath = escapeshellarg( __DIR__ );
+ $rootPath = escapeshellarg( __DIR__ . '/..' );
$testClassRegex = implode( '|', array(
'ApiFormatTestBase',
'ApiTestCase',
@@ -58,6 +58,6 @@ class StructureTest extends MediaWikiTestCase {
* Filter to remove testUnitTestFileNamesEndWithTest false positives.
*/
public function filterSuites( $filename ) {
- return strpos( $filename, __DIR__ . '/suites/' ) !== 0;
+ return strpos( $filename, __DIR__ . '/../suites/' ) !== 0;
}
}
diff --git a/tests/phpunit/suite.xml b/tests/phpunit/suite.xml
index 8f7e977f..7a9122fa 100644
--- a/tests/phpunit/suite.xml
+++ b/tests/phpunit/suite.xml
@@ -2,17 +2,18 @@
<!-- colors don't work on Windows! -->
<phpunit bootstrap="./bootstrap.php"
- colors="true"
- backupGlobals="false"
- convertErrorsToExceptions="true"
- convertNoticesToExceptions="true"
- convertWarningsToExceptions="true"
- stopOnFailure="false"
- timeoutForSmallTests="10"
- timeoutForMediumTests="30"
- timeoutForLargeTests="60"
- strict="true"
- verbose="true">
+ colors="true"
+ backupGlobals="false"
+ convertErrorsToExceptions="true"
+ convertNoticesToExceptions="true"
+ convertWarningsToExceptions="true"
+ forceCoversAnnotation="true"
+ stopOnFailure="false"
+ timeoutForSmallTests="10"
+ timeoutForMediumTests="30"
+ timeoutForLargeTests="60"
+ strict="true"
+ verbose="true">
<testsuites>
<testsuite name="includes">
<directory>includes</directory>
@@ -29,14 +30,14 @@
<directory>maintenance</directory>
</testsuite>
<testsuite name="structure">
- <file>AutoLoaderTest.php</file>
- <file>StructureTest.php</file>
+ <directory>structure</directory>
</testsuite>
<testsuite name="uploadfromurl">
<file>suites/UploadFromUrlTestSuite.php</file>
</testsuite>
<testsuite name="extensions">
<file>suites/ExtensionsTestSuite.php</file>
+ <file>suites/ExtensionsParserTestSuite.php</file>
</testsuite>
</testsuites>
<groups>
diff --git a/tests/phpunit/suites/ExtensionsParserTestSuite.php b/tests/phpunit/suites/ExtensionsParserTestSuite.php
new file mode 100644
index 00000000..3d68b241
--- /dev/null
+++ b/tests/phpunit/suites/ExtensionsParserTestSuite.php
@@ -0,0 +1,8 @@
+<?php
+class ExtensionsParserTestSuite extends PHPUnit_Framework_TestSuite {
+
+ public static function suite() {
+ return MediaWikiParserTest::suite( MediaWikiParserTest::NO_CORE );
+ }
+
+}
diff --git a/tests/phpunit/suites/UploadFromUrlTestSuite.php b/tests/phpunit/suites/UploadFromUrlTestSuite.php
index 28d38ab4..7eb599e3 100644
--- a/tests/phpunit/suites/UploadFromUrlTestSuite.php
+++ b/tests/phpunit/suites/UploadFromUrlTestSuite.php
@@ -1,6 +1,6 @@
<?php
-require_once( dirname( __DIR__ ) . '/includes/upload/UploadFromUrlTest.php' );
+require_once dirname( __DIR__ ) . '/includes/upload/UploadFromUrlTest.php';
class UploadFromUrlTestSuite extends PHPUnit_Framework_TestSuite {
public $savedGlobals = array();
@@ -16,16 +16,16 @@ class UploadFromUrlTestSuite extends PHPUnit_Framework_TestSuite {
}
protected function setUp() {
- global $wgParser, $wgParserConf, $IP, $messageMemc, $wgMemc,
- $wgUser, $wgLang, $wgOut, $wgRequest, $wgStyleDirectory, $wgEnableParserCache,
- $wgNamespaceAliases, $wgNamespaceProtection, $parserMemc;
+ global $wgParser, $wgParserConf, $IP, $messageMemc, $wgMemc, $wgUser,
+ $wgLang, $wgOut, $wgRequest, $wgStyleDirectory,
+ $wgEnableParserCache, $wgNamespaceAliases, $wgNamespaceProtection,
+ $parserMemc;
$tmpGlobals = array();
$tmpGlobals['wgScript'] = '/index.php';
$tmpGlobals['wgScriptPath'] = '/';
$tmpGlobals['wgArticlePath'] = '/wiki/$1';
- $tmpGlobals['wgStyleSheetPath'] = '/skins';
$tmpGlobals['wgStylePath'] = '/skins';
$tmpGlobals['wgThumbnailScriptPath'] = false;
$tmpGlobals['wgLocalFileRepo'] = array(
@@ -56,7 +56,6 @@ class UploadFromUrlTestSuite extends PHPUnit_Framework_TestSuite {
$wgNamespaceAliases['Image'] = NS_FILE;
$wgNamespaceAliases['Image_talk'] = NS_FILE_TALK;
-
$wgEnableParserCache = false;
DeferredUpdates::clearPendingUpdates();
$wgMemc = wfGetMainCache();
@@ -184,6 +183,7 @@ class UploadFromUrlTestSuite extends PHPUnit_Framework_TestSuite {
if ( file_exists( $dir ) ) {
wfDebug( "Already exists!\n" );
+
return $dir;
}
@@ -201,6 +201,7 @@ class UploadFromUrlTestSuite extends PHPUnit_Framework_TestSuite {
// the UploadFromUrlTest class
class_exists( 'UploadFromUrlTest' );
$suite = new UploadFromUrlTestSuite( 'UploadFromUrlTest' );
+
return $suite;
}
}
diff --git a/tests/qunit/QUnitTestResources.php b/tests/qunit/QUnitTestResources.php
index 01072d83..c8743750 100644
--- a/tests/qunit/QUnitTestResources.php
+++ b/tests/qunit/QUnitTestResources.php
@@ -6,6 +6,7 @@ return array(
'mediawiki.tests.qunit.suites' => array(
'scripts' => array(
+ 'tests/qunit/suites/resources/startup.test.js',
'tests/qunit/suites/resources/jquery/jquery.autoEllipsis.test.js',
'tests/qunit/suites/resources/jquery/jquery.byteLength.test.js',
'tests/qunit/suites/resources/jquery/jquery.byteLimit.test.js',
@@ -16,6 +17,7 @@ return array(
'tests/qunit/suites/resources/jquery/jquery.hidpi.test.js',
'tests/qunit/suites/resources/jquery/jquery.highlightText.test.js',
'tests/qunit/suites/resources/jquery/jquery.localize.test.js',
+ 'tests/qunit/suites/resources/jquery/jquery.makeCollapsible.test.js',
'tests/qunit/suites/resources/jquery/jquery.mwExtension.test.js',
'tests/qunit/suites/resources/jquery/jquery.tabIndex.test.js',
'tests/qunit/suites/resources/jquery/jquery.tablesorter.test.js',
@@ -45,6 +47,7 @@ return array(
'jquery.hidpi',
'jquery.highlightText',
'jquery.localize',
+ 'jquery.makeCollapsible',
'jquery.mwExtension',
'jquery.tabIndex',
'jquery.tablesorter',
@@ -61,6 +64,5 @@ return array(
'mediawiki.language',
'mediawiki.cldr',
),
- 'position' => 'top',
)
);
diff --git a/tests/qunit/data/generateJqueryMsgData.php b/tests/qunit/data/generateJqueryMsgData.php
index 604ede81..12e5a2dc 100644
--- a/tests/qunit/data/generateJqueryMsgData.php
+++ b/tests/qunit/data/generateJqueryMsgData.php
@@ -61,7 +61,7 @@
* </code>
*/
-require( __DIR__ . '/../../../maintenance/Maintenance.php' );
+require __DIR__ . '/../../../maintenance/Maintenance.php';
class GenerateJqueryMsgData extends Maintenance {
@@ -147,4 +147,4 @@ class GenerateJqueryMsgData extends Maintenance {
}
$maintClass = "GenerateJqueryMsgData";
-require_once( RUN_MAINTENANCE_IF_MAIN );
+require_once RUN_MAINTENANCE_IF_MAIN;
diff --git a/tests/qunit/data/load.mock.php b/tests/qunit/data/load.mock.php
index 7ff392ab..f6eff77a 100644
--- a/tests/qunit/data/load.mock.php
+++ b/tests/qunit/data/load.mock.php
@@ -24,6 +24,7 @@
*/
header( 'Content-Type: text/javascript; charset=utf-8' );
+require_once __DIR__ . '/../../../includes/json/FormatJson.php';
require_once __DIR__ . '/../../../includes/Xml.php';
$moduleImplementations = array(
@@ -50,7 +51,7 @@ if ( isset( $_GET['modules'] ) ) {
if ( isset( $moduleImplementations[$module] ) ) {
$response .= $moduleImplementations[$module];
} else {
- $response .= Xml::encodeJsCall( 'mw.loader.state', array( $module, 'missing' ) );
+ $response .= Xml::encodeJsCall( 'mw.loader.state', array( $module, 'missing' ), true );
}
}
}
diff --git a/tests/qunit/data/testrunner.js b/tests/qunit/data/testrunner.js
index 62dd81ac..1a2bfa10 100644
--- a/tests/qunit/data/testrunner.js
+++ b/tests/qunit/data/testrunner.js
@@ -38,6 +38,8 @@
tooltip: 'Enable debug mode in ResourceLoader'
} );
+ QUnit.config.requireExpects = true;
+
/**
* Load TestSwarm agent
*/
@@ -48,13 +50,14 @@
// of MediaWiki has actually been configured with the required url to that inject.js
// script. By default it is false.
if ( QUnit.urlParams.swarmURL && mw.config.get( 'QUnitTestSwarmInjectJSPath' ) ) {
- document.write( '<scr' + 'ipt src="' + QUnit.fixurl( mw.config.get( 'QUnitTestSwarmInjectJSPath' ) ) + '"></scr' + 'ipt>' );
+ jQuery.getScript( QUnit.fixurl( mw.config.get( 'QUnitTestSwarmInjectJSPath' ) ) );
}
/**
* CompletenessTest
+ *
+ * Adds toggle checkbox to header
*/
- // Adds toggle checkbox to header
QUnit.config.urlConfig.push( {
id: 'completenesstest',
label: 'Run CompletenessTest',
@@ -93,8 +96,9 @@
/**
* Test environment recommended for all QUnit test modules
+ *
+ * Whether to log environment changes to the console
*/
- // Whether to log environment changes to the console
QUnit.config.urlConfig.push( 'mwlogenv' );
/**
@@ -347,6 +351,25 @@
assert.equal( mw.messages.get( 'testMsg' ), 'Foo.', 'messages object restored and re-applied after test()' );
} );
+ QUnit.test( 'Loader status', 2, function ( assert ) {
+ var i, len, state,
+ modules = mw.loader.getModuleNames(),
+ error = [],
+ missing = [];
+
+ for ( i = 0, len = modules.length; i < len; i++ ) {
+ state = mw.loader.getState( modules[i] );
+ if ( state === 'error' ) {
+ error.push( modules[i] );
+ } else if ( state === 'missing' ) {
+ missing.push( modules[i] );
+ }
+ }
+
+ assert.deepEqual( error, [], 'Modules in error state' );
+ assert.deepEqual( missing, [], 'Modules in missing state' );
+ } );
+
QUnit.test( 'htmlEqual', 8, function ( assert ) {
assert.htmlEqual(
'<div><p class="some classes" data-length="10">Child paragraph with <a href="http://example.com">A link</a></p>Regular text<span>A span</span></div>',
diff --git a/tests/qunit/suites/resources/jquery/jquery.byteLength.test.js b/tests/qunit/suites/resources/jquery/jquery.byteLength.test.js
index e4e579b0..e6aa3aa8 100644
--- a/tests/qunit/suites/resources/jquery/jquery.byteLength.test.js
+++ b/tests/qunit/suites/resources/jquery/jquery.byteLength.test.js
@@ -16,20 +16,22 @@
} );
- QUnit.test( 'Special text', 5, function ( assert ) {
- // http://en.wikipedia.org/wiki/UTF-8
+ QUnit.test( 'Special text', 4, function ( assert ) {
+ // https://en.wikipedia.org/wiki/UTF-8
var u0024 = '$',
+ // Cent symbol
u00A2 = '\u00A2',
+ // Euro symbol
u20AC = '\u20AC',
- u024B62 = '\u024B62',
- // The normal one doesn't display properly, try the below which is the same
- // according to http://www.fileformat.info/info/unicode/char/24B62/index.htm
- u024B62alt = '\uD852\uDF62';
+ // Character \U00024B62 (Han script) can't be represented in javascript as a single
+ // code point, instead it is composed as a surrogate pair of two separate code units.
+ // http://codepoints.net/U+24B62
+ // http://www.fileformat.info/info/unicode/char/24B62/index.htm
+ u024B62 = '\uD852\uDF62';
- assert.strictEqual( $.byteLength( u0024 ), 1, 'U+0024: 1 byte. $ (dollar sign)' );
- assert.strictEqual( $.byteLength( u00A2 ), 2, 'U+00A2: 2 bytes. \u00A2 (cent sign)' );
- assert.strictEqual( $.byteLength( u20AC ), 3, 'U+20AC: 3 bytes. \u20AC (euro sign)' );
- assert.strictEqual( $.byteLength( u024B62 ), 4, 'U+024B62: 4 bytes. \uD852\uDF62 (a Han character)' );
- assert.strictEqual( $.byteLength( u024B62alt ), 4, 'U+024B62: 4 bytes. \uD852\uDF62 (a Han character) - alternative method' );
+ assert.strictEqual( $.byteLength( u0024 ), 1, 'U+0024' );
+ assert.strictEqual( $.byteLength( u00A2 ), 2, 'U+00A2' );
+ assert.strictEqual( $.byteLength( u20AC ), 3, 'U+20AC' );
+ assert.strictEqual( $.byteLength( u024B62 ), 4, 'U+024B62 (surrogate pair: \\uD852\\uDF62)' );
} );
}( jQuery ) );
diff --git a/tests/qunit/suites/resources/jquery/jquery.byteLimit.test.js b/tests/qunit/suites/resources/jquery/jquery.byteLimit.test.js
index c21844eb..22d2af19 100644
--- a/tests/qunit/suites/resources/jquery/jquery.byteLimit.test.js
+++ b/tests/qunit/suites/resources/jquery/jquery.byteLimit.test.js
@@ -31,55 +31,34 @@
/**
* Test factory for $.fn.byteLimit
*
- * @param $input {jQuery} jQuery object in an input element
- * @param hasLimit {Boolean} Wether a limit should apply at all
- * @param limit {Number} Limit (if used) otherwise undefined
- * The limit should be less than 20 (the sample data's length)
+ * @param {Object} options
+ * @param {string} options.description Test name
+ * @param {jQuery} options.$input jQuery object in an input element
+ * @param {string} options.sample Sequence of characters to simulate being
+ * added one by one
+ * @param {string} options.expected Expected final value of `$input`
*/
function byteLimitTest( options ) {
var opt = $.extend( {
description: '',
$input: null,
sample: '',
- hasLimit: false,
- expected: '',
- limit: null
+ expected: ''
}, options );
- QUnit.asyncTest( opt.description, opt.hasLimit ? 3 : 2, function ( assert ) {
+ QUnit.asyncTest( opt.description, 1, function ( assert ) {
setTimeout( function () {
- var rawVal, fn, effectiveVal;
-
opt.$input.appendTo( '#qunit-fixture' );
// Simulate pressing keys for each of the sample characters
addChars( opt.$input, opt.sample );
- rawVal = opt.$input.val();
- fn = opt.$input.data( 'byteLimit.callback' );
- effectiveVal = fn ? fn( rawVal ) : rawVal;
-
- if ( opt.hasLimit ) {
- assert.ltOrEq(
- $.byteLength( effectiveVal ),
- opt.limit,
- 'Prevent keypresses after byteLimit was reached, length never exceeded the limit'
- );
- assert.equal(
- $.byteLength( rawVal ),
- $.byteLength( opt.expected ),
- 'Not preventing keypresses too early, length has reached the expected length'
- );
- assert.equal( rawVal, opt.expected, 'New value matches the expected string' );
-
- } else {
- assert.equal(
- $.byteLength( effectiveVal ),
- $.byteLength( opt.expected ),
- 'Unlimited scenarios are not affected, expected length reached'
- );
- assert.equal( rawVal, opt.expected, 'New value matches the expected string' );
- }
+ assert.equal(
+ opt.$input.val(),
+ opt.expected,
+ 'New value matches the expected string'
+ );
+
QUnit.start();
}, 10 );
} );
@@ -89,7 +68,6 @@
description: 'Plain text input',
$input: $( '<input type="text"/>' ),
sample: simpleSample,
- hasLimit: false,
expected: simpleSample
} );
@@ -98,7 +76,6 @@
$input: $( '<input type="text"/>' )
.byteLimit(),
sample: simpleSample,
- hasLimit: false,
expected: simpleSample
} );
@@ -108,8 +85,6 @@
.attr( 'maxlength', '10' )
.byteLimit(),
sample: simpleSample,
- hasLimit: true,
- limit: 10,
expected: '1234567890'
} );
@@ -118,8 +93,6 @@
$input: $( '<input type="text"/>' )
.byteLimit( 10 ),
sample: simpleSample,
- hasLimit: true,
- limit: 10,
expected: '1234567890'
} );
@@ -129,8 +102,6 @@
.attr( 'maxlength', '10' )
.byteLimit( 15 ),
sample: simpleSample,
- hasLimit: true,
- limit: 15,
expected: '123456789012345'
} );
@@ -139,8 +110,6 @@
$input: $( '<input type="text"/>' )
.byteLimit( 14 ),
sample: mbSample,
- hasLimit: true,
- limit: 14,
expected: '1234567890' + U_20AC + '1'
} );
@@ -149,8 +118,6 @@
$input: $( '<input type="text"/>' )
.byteLimit( 12 ),
sample: mbSample,
- hasLimit: true,
- limit: 12,
expected: '1234567890' + '12'
} );
@@ -158,17 +125,11 @@
description: 'Pass the limit and a callback as input filter',
$input: $( '<input type="text"/>' )
.byteLimit( 6, function ( val ) {
- // Invalid title
- if ( val === '' ) {
- return '';
- }
-
+ var title = mw.Title.newFromText( String( val ) );
// Return without namespace prefix
- return new mw.Title( String( val ) ).getMain();
+ return title ? title.getMain() : '';
} ),
sample: 'User:Sample',
- hasLimit: true,
- limit: 6, // 'Sample' length
expected: 'User:Sample'
} );
@@ -177,20 +138,53 @@
$input: $( '<input type="text"/>' )
.attr( 'maxlength', '6' )
.byteLimit( function ( val ) {
- // Invalid title
- if ( val === '' ) {
- return '';
- }
-
+ var title = mw.Title.newFromText( String( val ) );
// Return without namespace prefix
- return new mw.Title( String( val ) ).getMain();
+ return title ? title.getMain() : '';
} ),
sample: 'User:Sample',
- hasLimit: true,
- limit: 6, // 'Sample' length
expected: 'User:Sample'
} );
+ byteLimitTest( {
+ description: 'Pass the limit and a callback as input filter',
+ $input: $( '<input type="text"/>' )
+ .byteLimit( 6, function ( val ) {
+ var title = mw.Title.newFromText( String( val ) );
+ // Return without namespace prefix
+ return title ? title.getMain() : '';
+ } ),
+ sample: 'User:Example',
+ // The callback alters the value to be used to calculeate
+ // the length. The altered value is "Exampl" which has
+ // a length of 6, the "e" would exceed the limit.
+ expected: 'User:Exampl'
+ } );
+
+ byteLimitTest( {
+ description: 'Input filter that increases the length',
+ $input: $( '<input type="text"/>' )
+ .byteLimit( 10, function ( text ) {
+ return 'prefix' + text;
+ } ),
+ sample: simpleSample,
+ // Prefix adds 6 characters, limit is reached after 4
+ expected: '1234'
+ } );
+
+ // Regression tests for bug 41450
+ byteLimitTest( {
+ description: 'Input filter of which the base exceeds the limit',
+ $input: $( '<input type="text"/>' )
+ .byteLimit( 3, function ( text ) {
+ return 'prefix' + text;
+ } ),
+ sample: simpleSample,
+ hasLimit: true,
+ limit: 6, // 'prefix' length
+ expected: ''
+ } );
+
QUnit.test( 'Confirm properties and attributes set', 4, function ( assert ) {
var $el, $elA, $elB;
diff --git a/tests/qunit/suites/resources/jquery/jquery.client.test.js b/tests/qunit/suites/resources/jquery/jquery.client.test.js
index 88bbf5c4..4c7c3022 100644
--- a/tests/qunit/suites/resources/jquery/jquery.client.test.js
+++ b/tests/qunit/suites/resources/jquery/jquery.client.test.js
@@ -1,16 +1,11 @@
( function ( $ ) {
- var uacount, uas, testMap;
QUnit.module( 'jquery.client', QUnit.newMwEnvironment() );
- /** Number of user-agent defined */
- uacount = 0;
-
- uas = ( function () {
-
+ var uacount = 0,
// Object keyed by userAgent. Value is an array (human-readable name, client-profile object, navigator.platform value)
// Info based on results from http://toolserver.org/~krinkle/testswarm/job/174/
- var uas = {
+ uas = {
// Internet Explorer 6
// Internet Explorer 7
'Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1)': {
@@ -39,7 +34,7 @@
profile: {
name: 'msie',
layout: 'trident',
- layoutVersion: 'unknown', // should be able to report 6?
+ layoutVersion: 6,
platform: 'win',
version: '10.0',
versionBase: '10',
@@ -50,6 +45,60 @@
rtl: true
}
},
+ // Internet Explorer 11
+ 'Mozilla/5.0 (Windows NT 6.3; Trident/7.0; rv 11.0) like Gecko': {
+ title: 'Internet Explorer 11',
+ platform: 'Win32',
+ profile: {
+ name: 'msie',
+ layout: 'trident',
+ layoutVersion: 7,
+ platform: 'win',
+ version: '11.0',
+ versionBase: '11',
+ versionNumber: 11
+ },
+ wikiEditor: {
+ ltr: true,
+ rtl: true
+ }
+ },
+ // Internet Explorer 11 - Windows 8.1 x64 Modern UI
+ 'Mozilla/5.0 (Windows NT 6.3; Win64; x64; Trident/7.0; rv:11.0) like Gecko': {
+ title: 'Internet Explorer 11',
+ platform: 'Win64',
+ profile: {
+ name: 'msie',
+ layout: 'trident',
+ layoutVersion: 7,
+ platform: 'win',
+ version: '11.0',
+ versionBase: '11',
+ versionNumber: 11
+ },
+ wikiEditor: {
+ ltr: true,
+ rtl: true
+ }
+ },
+ // Internet Explorer 11 - Windows 8.1 x64 desktop UI
+ 'Mozilla/5.0 (Windows NT 6.3; WOW64; Trident/7.0; rv:11.0) like Gecko': {
+ title: 'Internet Explorer 11',
+ platform: 'WOW64',
+ profile: {
+ name: 'msie',
+ layout: 'trident',
+ layoutVersion: 7,
+ platform: 'win',
+ version: '11.0',
+ versionBase: '11',
+ versionNumber: 11
+ },
+ wikiEditor: {
+ ltr: true,
+ rtl: true
+ }
+ },
// Firefox 2
// Firefox 3.5
'Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10.5; en-US; rv:1.9.1.19) Gecko/20110420 Firefox/3.5.19': {
@@ -141,6 +190,24 @@
rtl: true
}
},
+ // Iceweasel 15.0.1
+ 'Mozilla/5.0 (X11; Linux x86_64; rv:15.0) Gecko/20100101 Firefox/15.0.1 Iceweasel/15.0.1': {
+ title: 'Iceweasel 15.0.1',
+ platform: 'Linux',
+ profile: {
+ name: 'iceweasel',
+ layout: 'gecko',
+ layoutVersion: 20100101,
+ platform: 'linux',
+ version: '15.0.1',
+ versionBase: '15',
+ versionNumber: 15
+ },
+ wikiEditor: {
+ ltr: true,
+ rtl: true
+ }
+ },
// Firefox 5
// Safari 3
// Safari 4
@@ -179,6 +246,42 @@
}
},
// Safari 5
+ // Safari 6
+ 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_8_3) AppleWebKit/536.29.13 (KHTML, like Gecko) Version/6.0.4 Safari/536.29.13': {
+ title: 'Safari 6',
+ platform: 'MacIntel',
+ profile: {
+ name: 'safari',
+ layout: 'webkit',
+ layoutVersion: 536,
+ platform: 'mac',
+ version: '6.0.4',
+ versionBase: '6',
+ versionNumber: 6
+ },
+ wikiEditor: {
+ ltr: true,
+ rtl: true
+ }
+ },
+ // Safari 6.0.5+ (doesn't have the comma in "KHTML, like Gecko")
+ 'Mozilla/5.0 (Macintosh; Intel Mac OS X 1084) AppleWebKit/536.30.1 (KHTML like Gecko) Version/6.0.5 Safari/536.30.1': {
+ title: 'Safari 6',
+ platform: 'MacIntel',
+ profile: {
+ name: 'safari',
+ layout: 'webkit',
+ layoutVersion: 536,
+ platform: 'mac',
+ version: '6.0.5',
+ versionBase: '6',
+ versionNumber: 6
+ },
+ wikiEditor: {
+ ltr: true,
+ rtl: true
+ }
+ },
// Opera 10+
'Opera/9.80 (Windows NT 5.1)': {
title: 'Opera 10+ (exact version unspecified)',
@@ -215,6 +318,24 @@
rtl: true
}
},
+ // Opera 15 (WebKit-based)
+ 'Mozilla/5.0 (Windows NT 5.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/28.0.1500.52 Safari/537.36 OPR/15.0.1147.130': {
+ title: 'Opera 15',
+ platform: 'Win32',
+ profile: {
+ name: 'opera',
+ layout: 'webkit',
+ layoutVersion: 537,
+ platform: 'win',
+ version: '15.0.1147.130',
+ versionBase: '15',
+ versionNumber: 15
+ },
+ wikiEditor: {
+ ltr: true,
+ rtl: true
+ }
+ },
// Chrome 5
// Chrome 6
// Chrome 7
@@ -257,6 +378,24 @@
rtl: true
}
},
+ // Android WebKit Browser 2.3
+ 'Mozilla/5.0 (Linux; U; Android 2.3.5; en-us; HTC Vision Build/GRI40) AppleWebKit/533.1 (KHTML, like Gecko) Version/4.0 Mobile Safari/533.1': {
+ title: 'Android WebKit Browser 2.3',
+ platform: 'Linux armv7l',
+ profile: {
+ name: 'android',
+ layout: 'webkit',
+ layoutVersion: 533,
+ platform: 'linux',
+ version: '2.3.5',
+ versionBase: '2',
+ versionNumber: 2.3
+ },
+ wikiEditor: {
+ ltr: true,
+ rtl: true
+ }
+ },
// Bug #34924
'Mozilla/5.0 (X11; Linux i686) AppleWebKit/534.34 (KHTML, like Gecko) rekonq Safari/534.34': {
title: 'Rekonq',
@@ -275,28 +414,42 @@
rtl: true
}
}
- };
- $.each( uas, function () {
- uacount++;
- } );
- return uas;
- }() );
-
- QUnit.test( 'profile userAgent support', uacount, function ( assert ) {
- // Generate a client profile object and compare recursively
- var uaTest = function ( rawUserAgent, data ) {
- var ret = $.client.profile( {
- userAgent: rawUserAgent,
- platform: data.platform
- } );
- assert.deepEqual( ret, data.profile, 'Client profile support check for ' + data.title + ' (' + data.platform + '): ' + rawUserAgent );
- };
+ },
+ testMap = {
+ // Example from WikiEditor
+ // Make sure to use raw numbers, a string like "7.0" would fail on a
+ // version 10 browser since in string comparaison "10" is before "7.0" :)
+ 'ltr': {
+ 'msie': [['>=', 7.0]],
+ 'firefox': [['>=', 2]],
+ 'opera': [['>=', 9.6]],
+ 'safari': [['>=', 3]],
+ 'chrome': [['>=', 3]],
+ 'netscape': [['>=', 9]],
+ 'blackberry': false,
+ 'ipod': false,
+ 'iphone': false
+ },
+ 'rtl': {
+ 'msie': [['>=', 8]],
+ 'firefox': [['>=', 2]],
+ 'opera': [['>=', 9.6]],
+ 'safari': [['>=', 3]],
+ 'chrome': [['>=', 3]],
+ 'netscape': [['>=', 9]],
+ 'blackberry': false,
+ 'ipod': false,
+ 'iphone': false
+ }
+ }
+ ;
- // Loop through and run tests
- $.each( uas, uaTest );
+ // Count test cases
+ $.each( uas, function () {
+ uacount++;
} );
- QUnit.test( 'profile return validation for current user agent', 7, function ( assert ) {
+ QUnit.test( 'profile( navObject )', 7, function ( assert ) {
var p = $.client.profile();
function unknownOrType( val, type, summary ) {
@@ -312,44 +465,58 @@
assert.equal( typeof p.versionNumber, 'number', 'p.versionNumber is a number' );
} );
- // Example from WikiEditor
- // Make sure to use raw numbers, a string like "7.0" would fail on a
- // version 10 browser since in string comparaison "10" is before "7.0" :)
- testMap = {
- 'ltr': {
- 'msie': [['>=', 7.0]],
- 'firefox': [['>=', 2]],
- 'opera': [['>=', 9.6]],
- 'safari': [['>=', 3]],
- 'chrome': [['>=', 3]],
- 'netscape': [['>=', 9]],
- 'blackberry': false,
- 'ipod': false,
- 'iphone': false
- },
- 'rtl': {
- 'msie': [['>=', 8]],
- 'firefox': [['>=', 2]],
- 'opera': [['>=', 9.6]],
- 'safari': [['>=', 3]],
- 'chrome': [['>=', 3]],
- 'netscape': [['>=', 9]],
- 'blackberry': false,
- 'ipod': false,
- 'iphone': false
- }
- };
+ QUnit.test( 'profile( navObject ) - samples', uacount, function ( assert ) {
+ // Loop through and run tests
+ $.each( uas, function ( rawUserAgent, data ) {
+ // Generate a client profile object and compare recursively
+ var ret = $.client.profile( {
+ userAgent: rawUserAgent,
+ platform: data.platform
+ } );
+ assert.deepEqual( ret, data.profile, 'Client profile support check for ' + data.title + ' (' + data.platform + '): ' + rawUserAgent );
+ } );
+ } );
- QUnit.test( 'test', 1, function ( assert ) {
+ QUnit.test( 'test( testMap )', 4, function ( assert ) {
// .test() uses eval, make sure no exceptions are thrown
// then do a basic return value type check
- var testMatch = $.client.test( testMap );
+ var testMatch = $.client.test( testMap ),
+ ie7Profile = $.client.profile( {
+ 'userAgent': 'Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1)',
+ 'platform': ''
+ } );
+
+ assert.equal( typeof testMatch, 'boolean', 'map with ltr/rtl split returns a boolean value' );
+
+ testMatch = $.client.test( testMap.ltr );
+
+ assert.equal( typeof testMatch, 'boolean', 'simple map (without ltr/rtl split) returns a boolean value' );
+
+ assert.equal( $.client.test( {
+ 'msie': null
+ }, ie7Profile ), true, 'returns true if any version of a browser are allowed (null)' );
+
+ assert.equal( $.client.test( {
+ 'msie': false
+ }, ie7Profile ), false, 'returns false if all versions of a browser are not allowed (false)' );
+ } );
+
+ QUnit.test( 'test( testMap, exactMatchOnly )', 2, function ( assert ) {
+ var ie7Profile = $.client.profile( {
+ 'userAgent': 'Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1)',
+ 'platform': ''
+ } );
- assert.equal( typeof testMatch, 'boolean', 'test returns a boolean value' );
+ assert.equal( $.client.test( {
+ 'firefox': [['>=', 2]]
+ }, ie7Profile, false ), true, 'returns true if browser not found and exactMatchOnly not set' );
+ assert.equal( $.client.test( {
+ 'firefox': [['>=', 2]]
+ }, ie7Profile, true ), false, 'returns false if browser not found and exactMatchOnly is set' );
} );
- QUnit.test( 'User-agent matches against WikiEditor\'s compatibility map', uacount * 2, function ( assert ) {
+ QUnit.test( 'test( testMap) - WikiEditor sample', uacount * 2, function ( assert ) {
var $body = $( 'body' ),
bodyClasses = $body.attr( 'class' );
diff --git a/tests/qunit/suites/resources/jquery/jquery.localize.test.js b/tests/qunit/suites/resources/jquery/jquery.localize.test.js
index d3877e05..3ef27903 100644
--- a/tests/qunit/suites/resources/jquery/jquery.localize.test.js
+++ b/tests/qunit/suites/resources/jquery/jquery.localize.test.js
@@ -38,7 +38,7 @@
// making sure it is actually using text() and attr() (or something with the same effect)
// Text escaping
- html = '<div><span><html:msg key="properfoo"></span></div>';
+ html = '<div><span><html:msg key="properfoo" /></span></div>';
$lc = $( html ).localize().find( 'span' );
assert.strictEqual( $lc.text(), mw.msg( 'properfoo' ), 'Content is inserted as text, not as html.' );
@@ -63,7 +63,7 @@
var html, $lc, x, sitename = 'Wikipedia';
// Message key prefix
- html = '<div><span title-msg="lorem"><html:msg key="ipsum"></span></div>';
+ html = '<div><span title-msg="lorem"><html:msg key="ipsum" /></span></div>';
$lc = $( html ).localize( {
prefix: 'foo-'
} ).find( 'span' );
@@ -73,7 +73,7 @@
// Variable keys mapping
x = 'bar';
- html = '<div><span title-msg="title"><html:msg key="label"></span></div>';
+ html = '<div><span title-msg="title"><html:msg key="label" /></span></div>';
$lc = $( html ).localize( {
keys: {
'title': 'foo-' + x + '-title',
@@ -85,7 +85,7 @@
assert.strictEqual( $lc.text(), 'The Bars', 'Variable keys mapping - text' );
// Passing parameteters to mw.msg
- html = '<div><span><html:msg key="foo-welcome"></span></div>';
+ html = '<div><span><html:msg key="foo-welcome" /></span></div>';
$lc = $( html ).localize( {
params: {
'foo-welcome': [sitename, 'yesterday']
@@ -96,7 +96,7 @@
// Combination of options prefix, params and keys
x = 'bazz';
- html = '<div><span title-msg="title"><html:msg key="label"></span></div>';
+ html = '<div><span title-msg="title"><html:msg key="label" /></span></div>';
$lc = $( html ).localize( {
prefix: 'foo-',
keys: {
diff --git a/tests/qunit/suites/resources/jquery/jquery.makeCollapsible.test.js b/tests/qunit/suites/resources/jquery/jquery.makeCollapsible.test.js
new file mode 100644
index 00000000..6da56ed2
--- /dev/null
+++ b/tests/qunit/suites/resources/jquery/jquery.makeCollapsible.test.js
@@ -0,0 +1,287 @@
+( function ( mw, $ ) {
+ var loremIpsum = 'Lorem ipsum dolor sit amet, consectetuer adipiscing elit.';
+
+ QUnit.module( 'jquery.makeCollapsible', QUnit.newMwEnvironment() );
+
+ function prepareCollapsible( html, options ) {
+ return $( $.parseHTML( html ) )
+ .appendTo( '#qunit-fixture' )
+ // options might be undefined here - this is okay
+ .makeCollapsible( options );
+ }
+
+ // This test is first because if it fails, then almost all of the latter tests are meaningless.
+ QUnit.asyncTest( 'testing hooks/triggers', 4, function ( assert ) {
+ var $collapsible, $content, $toggle;
+ $collapsible = prepareCollapsible(
+ '<div class="mw-collapsible">' + loremIpsum + '</div>'
+ );
+ $content = $collapsible.find( '.mw-collapsible-content' );
+ $toggle = $collapsible.find( '.mw-collapsible-toggle' );
+
+ // In one full collapse-expand cycle, each event will be fired once
+
+ // On collapse...
+ $collapsible.on( 'beforeCollapse.mw-collapsible', function () {
+ assert.assertTrue( $content.is( ':visible' ), 'first beforeCollapseExpand: content is visible' );
+ } );
+ $collapsible.on( 'afterCollapse.mw-collapsible', function () {
+ assert.assertTrue( $content.is( ':hidden' ), 'first afterCollapseExpand: content is hidden' );
+
+ // On expand...
+ $collapsible.on( 'beforeExpand.mw-collapsible', function () {
+ assert.assertTrue( $content.is( ':hidden' ), 'second beforeCollapseExpand: content is hidden' );
+ } );
+ $collapsible.on( 'afterExpand.mw-collapsible', function () {
+ assert.assertTrue( $content.is( ':visible' ), 'second afterCollapseExpand: content is visible' );
+
+ QUnit.start();
+ } );
+
+ // ...expanding happens here
+ $toggle.trigger( 'click' );
+ } );
+
+ // ...collapsing happens here
+ $toggle.trigger( 'click' );
+ } );
+
+ QUnit.asyncTest( 'basic operation (<div>)', 5, function ( assert ) {
+ var $collapsible, $content, $toggle;
+ $collapsible = prepareCollapsible(
+ '<div class="mw-collapsible">' + loremIpsum + '</div>'
+ );
+ $content = $collapsible.find( '.mw-collapsible-content' );
+ $toggle = $collapsible.find( '.mw-collapsible-toggle' );
+
+ assert.equal( $content.length, 1, 'content is present' );
+ assert.equal( $content.find( $toggle ).length, 0, 'toggle is not a descendant of content' );
+
+ assert.assertTrue( $content.is( ':visible' ), 'content is visible' );
+
+ $collapsible.on( 'afterCollapse.mw-collapsible', function () {
+ assert.assertTrue( $content.is( ':hidden' ), 'after collapsing: content is hidden' );
+
+ $collapsible.on( 'afterExpand.mw-collapsible', function () {
+ assert.assertTrue( $content.is( ':visible' ), 'after expanding: content is visible' );
+ QUnit.start();
+ } );
+
+ $toggle.trigger( 'click' );
+ } );
+
+ $toggle.trigger( 'click' );
+ } );
+
+ QUnit.asyncTest( 'basic operation (<table>)', 7, function ( assert ) {
+ var $collapsible, $headerRow, $contentRow, $toggle;
+ $collapsible = prepareCollapsible(
+ '<table class="mw-collapsible">' +
+ '<tr><td>' + loremIpsum + '</td><td>' + loremIpsum + '</td></tr>' +
+ '<tr><td>' + loremIpsum + '</td><td>' + loremIpsum + '</td></tr>' +
+ '<tr><td>' + loremIpsum + '</td><td>' + loremIpsum + '</td></tr>' +
+ '</table>'
+ );
+ $headerRow = $collapsible.find( 'tr:first' );
+ $contentRow = $collapsible.find( 'tr:last' );
+
+ $toggle = $headerRow.find( 'td:last .mw-collapsible-toggle' );
+ assert.equal( $toggle.length, 1, 'toggle is added to last cell of first row' );
+
+ assert.assertTrue( $headerRow.is( ':visible' ), 'headerRow is visible' );
+ assert.assertTrue( $contentRow.is( ':visible' ), 'contentRow is visible' );
+
+ $collapsible.on( 'afterCollapse.mw-collapsible', function () {
+ assert.assertTrue( $headerRow.is( ':visible' ), 'after collapsing: headerRow is still visible' );
+ assert.assertTrue( $contentRow.is( ':hidden' ), 'after collapsing: contentRow is hidden' );
+
+ $collapsible.on( 'afterExpand.mw-collapsible', function () {
+ assert.assertTrue( $headerRow.is( ':visible' ), 'after expanding: headerRow is still visible' );
+ assert.assertTrue( $contentRow.is( ':visible' ), 'after expanding: contentRow is visible' );
+ QUnit.start();
+ } );
+
+ $toggle.trigger( 'click' );
+ } );
+
+ $toggle.trigger( 'click' );
+ } );
+
+ function listTest( listType, assert ) {
+ var $collapsible, $toggleItem, $contentItem, $toggle;
+ $collapsible = prepareCollapsible(
+ '<' + listType + ' class="mw-collapsible">' +
+ '<li>' + loremIpsum + '</li>' +
+ '<li>' + loremIpsum + '</li>' +
+ '</' + listType + '>'
+ );
+ $toggleItem = $collapsible.find( 'li.mw-collapsible-toggle-li:first-child' );
+ $contentItem = $collapsible.find( 'li:last' );
+
+ $toggle = $toggleItem.find( '.mw-collapsible-toggle' );
+ assert.equal( $toggle.length, 1, 'toggle is present, added inside new zeroth list item' );
+
+ assert.assertTrue( $toggleItem.is( ':visible' ), 'toggleItem is visible' );
+ assert.assertTrue( $contentItem.is( ':visible' ), 'contentItem is visible' );
+
+ $collapsible.on( 'afterCollapse.mw-collapsible', function () {
+ assert.assertTrue( $toggleItem.is( ':visible' ), 'after collapsing: toggleItem is still visible' );
+ assert.assertTrue( $contentItem.is( ':hidden' ), 'after collapsing: contentItem is hidden' );
+
+ $collapsible.on( 'afterExpand.mw-collapsible', function () {
+ assert.assertTrue( $toggleItem.is( ':visible' ), 'after expanding: toggleItem is still visible' );
+ assert.assertTrue( $contentItem.is( ':visible' ), 'after expanding: contentItem is visible' );
+ QUnit.start();
+ } );
+
+ $toggle.trigger( 'click' );
+ } );
+
+ $toggle.trigger( 'click' );
+ }
+
+ QUnit.asyncTest( 'basic operation (<ul>)', 7, function ( assert ) {
+ listTest( 'ul', assert );
+ } );
+
+ QUnit.asyncTest( 'basic operation (<ol>)', 7, function ( assert ) {
+ listTest( 'ol', assert );
+ } );
+
+ QUnit.test( 'basic operation when synchronous (options.instantHide)', 2, function ( assert ) {
+ var $collapsible, $content;
+ $collapsible = prepareCollapsible(
+ '<div class="mw-collapsible">' + loremIpsum + '</div>',
+ { instantHide: true }
+ );
+ $content = $collapsible.find( '.mw-collapsible-content' );
+
+ assert.assertTrue( $content.is( ':visible' ), 'content is visible' );
+
+ $collapsible.find( '.mw-collapsible-toggle' ).trigger( 'click' );
+
+ assert.assertTrue( $content.is( ':hidden' ), 'after collapsing: content is hidden' );
+ } );
+
+ QUnit.test( 'mw-made-collapsible data added', 1, function ( assert ) {
+ var $collapsible;
+ $collapsible = prepareCollapsible(
+ '<div>' + loremIpsum + '</div>'
+ );
+ assert.equal( $collapsible.data( 'mw-made-collapsible' ), true, 'mw-made-collapsible data present' );
+ } );
+
+ QUnit.test( 'mw-collapsible added when missing', 1, function ( assert ) {
+ var $collapsible;
+ $collapsible = prepareCollapsible(
+ '<div>' + loremIpsum + '</div>'
+ );
+ assert.assertTrue( $collapsible.hasClass( 'mw-collapsible' ), 'mw-collapsible class present' );
+ } );
+
+ QUnit.test( 'mw-collapsed added when missing', 1, function ( assert ) {
+ var $collapsible;
+ $collapsible = prepareCollapsible(
+ '<div>' + loremIpsum + '</div>',
+ { collapsed: true }
+ );
+ assert.assertTrue( $collapsible.hasClass( 'mw-collapsed' ), 'mw-collapsed class present' );
+ } );
+
+ QUnit.asyncTest( 'initial collapse (mw-collapsed class)', 2, function ( assert ) {
+ var $collapsible, $content;
+ $collapsible = prepareCollapsible(
+ '<div class="mw-collapsible mw-collapsed">' + loremIpsum + '</div>'
+ );
+ $content = $collapsible.find( '.mw-collapsible-content' );
+
+ // Synchronous - mw-collapsed should cause instantHide: true to be used on initial collapsing
+ assert.assertTrue( $content.is( ':hidden' ), 'content is hidden' );
+
+ $collapsible.on( 'afterExpand.mw-collapsible', function () {
+ assert.assertTrue( $content.is( ':visible' ), 'after expanding: content is visible' );
+ QUnit.start();
+ } );
+
+ $collapsible.find( '.mw-collapsible-toggle' ).trigger( 'click' );
+ } );
+
+ QUnit.asyncTest( 'initial collapse (options.collapsed)', 2, function ( assert ) {
+ var $collapsible, $content;
+ $collapsible = prepareCollapsible(
+ '<div class="mw-collapsible">' + loremIpsum + '</div>',
+ { collapsed: true }
+ );
+ $content = $collapsible.find( '.mw-collapsible-content' );
+
+ // Synchronous - collapsed: true should cause instantHide: true to be used on initial collapsing
+ assert.assertTrue( $content.is( ':hidden' ), 'content is hidden' );
+
+ $collapsible.on( 'afterExpand.mw-collapsible', function () {
+ assert.assertTrue( $content.is( ':visible' ), 'after expanding: content is visible' );
+ QUnit.start();
+ } );
+
+ $collapsible.find( '.mw-collapsible-toggle' ).trigger( 'click' );
+ } );
+
+ QUnit.test( 'clicks on links inside toggler pass through (options.linksPassthru)' , 2, function ( assert ) {
+ var $collapsible, $content;
+
+ $collapsible = prepareCollapsible(
+ '<div class="mw-collapsible">' +
+ '<div class="mw-collapsible-toggle">' +
+ 'Toggle <a href="#top">toggle</a> toggle <b>toggle</b>' +
+ '</div>' +
+ '<div class="mw-collapsible-content">' + loremIpsum + '</div>' +
+ '</div>',
+ // Can't do asynchronous because we're testing that the event *doesn't* happen
+ { instantHide: true }
+ );
+ $content = $collapsible.find( '.mw-collapsible-content' );
+
+ $collapsible.find( '.mw-collapsible-toggle a' ).trigger( 'click' );
+ assert.assertTrue( $content.is( ':visible' ), 'click event on link inside toggle passes through (content not toggled)' );
+
+ $collapsible.find( '.mw-collapsible-toggle b' ).trigger( 'click' );
+ assert.assertTrue( $content.is( ':hidden' ), 'click event on non-link inside toggle toggles content' );
+ } );
+
+ QUnit.asyncTest( 'collapse/expand text (data-collapsetext, data-expandtext)', 2, function ( assert ) {
+ var $collapsible, $toggleLink;
+ $collapsible = prepareCollapsible(
+ '<div class="mw-collapsible" data-collapsetext="Collapse me!" data-expandtext="Expand me!">' +
+ loremIpsum +
+ '</div>'
+ );
+ $toggleLink = $collapsible.find( '.mw-collapsible-toggle a' );
+
+ assert.equal( $toggleLink.text(), 'Collapse me!', 'data-collapsetext is respected' );
+
+ $collapsible.on( 'afterCollapse.mw-collapsible', function () {
+ assert.equal( $toggleLink.text(), 'Expand me!', 'data-expandtext is respected' );
+ QUnit.start();
+ } );
+
+ $collapsible.find( '.mw-collapsible-toggle' ).trigger( 'click' );
+ } );
+
+ QUnit.asyncTest( 'collapse/expand text (options.collapseText, options.expandText)', 2, function ( assert ) {
+ var $collapsible, $toggleLink;
+ $collapsible = prepareCollapsible(
+ '<div class="mw-collapsible">' + loremIpsum + '</div>',
+ { collapseText: 'Collapse me!', expandText: 'Expand me!' }
+ );
+ $toggleLink = $collapsible.find( '.mw-collapsible-toggle a' );
+
+ assert.equal( $toggleLink.text(), 'Collapse me!', 'options.collapseText is respected' );
+
+ $collapsible.on( 'afterCollapse.mw-collapsible', function () {
+ assert.equal( $toggleLink.text(), 'Expand me!', 'options.expandText is respected' );
+ QUnit.start();
+ } );
+
+ $collapsible.find( '.mw-collapsible-toggle' ).trigger( 'click' );
+ } );
+
+}( mediaWiki, jQuery ) );
diff --git a/tests/qunit/suites/resources/jquery/jquery.tablesorter.test.js b/tests/qunit/suites/resources/jquery/jquery.tablesorter.test.js
index 307b0440..f73fd7bf 100644
--- a/tests/qunit/suites/resources/jquery/jquery.tablesorter.test.js
+++ b/tests/qunit/suites/resources/jquery/jquery.tablesorter.test.js
@@ -5,6 +5,8 @@
wgMonthNames: ['', 'January', 'February', 'March', 'April', 'May', 'June', 'July', 'August', 'September', 'October', 'November', 'December'],
wgMonthNamesShort: ['', 'Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec'],
wgDefaultDateFormat: 'dmy',
+ wgSeparatorTransformTable: ['', ''],
+ wgDigitTransformTable: ['', ''],
wgContentLanguage: 'en'
};
@@ -180,6 +182,18 @@
}
);
tableTest(
+ 'Basic planet table: ascending by name (multiple clicks)',
+ header,
+ planets,
+ ascendingName,
+ function ( $table ) {
+ $table.tablesorter();
+ $table.find( '.headerSort:eq(0)' ).click();
+ $table.find( '.headerSort:eq(1)' ).click();
+ $table.find( '.headerSort:eq(0)' ).click();
+ }
+ );
+ tableTest(
'Basic planet table: descending by name',
header,
planets,
@@ -273,6 +287,35 @@
$table.data( 'tablesorter' ).sort();
}
);
+ tableTest(
+ 'Sort via click event after having initialized the tablesorter with initial sorting',
+ header,
+ initial,
+ descasc,
+ function ( $table ) {
+ $table.tablesorter(
+ { sortList: [ { 0: 'asc' }, { 1: 'asc' } ] }
+ );
+ $table.find( '.headerSort:eq(0)' ).click();
+ }
+ );
+ tableTest(
+ 'Multi-sort via click event after having initialized the tablesorter with initial sorting',
+ header,
+ initial,
+ asc,
+ function ( $table ) {
+ $table.tablesorter(
+ { sortList: [ { 0: 'desc' }, { 1: 'desc' } ] }
+ );
+ $table.find( '.headerSort:eq(0)' ).click();
+
+ // Pretend to click while pressing the multi-sort key
+ var event = $.Event( 'click' );
+ event[$table.data( 'tablesorter' ).config.sortMultiSortKey] = true;
+ $table.find( '.headerSort:eq(1)' ).trigger( event );
+ }
+ );
QUnit.test( 'Reset sorting making table appear unsorted', 3, function ( assert ) {
var $table = tableCreate( header, initial );
$table.tablesorter(
@@ -319,12 +362,26 @@
function ( $table ) {
// Make colspanned header for test
$table.find( 'tr:eq(0) th:eq(1), tr:eq(0) th:eq(2)' ).remove();
- $table.find( 'tr:eq(0) th:eq(0)' ).prop( 'colspan', '3' );
+ $table.find( 'tr:eq(0) th:eq(0)' ).attr( 'colspan', '3' );
$table.tablesorter();
$table.find( '.headerSort:eq(0)' ).click();
}
);
+ tableTest( 'Sorting with colspanned headers: sort spanned column twice',
+ header,
+ initial,
+ [ caa4, bbc2, abc3, aab5, aaa1 ],
+ function ( $table ) {
+ // Make colspanned header for test
+ $table.find( 'tr:eq(0) th:eq(1), tr:eq(0) th:eq(2)' ).remove();
+ $table.find( 'tr:eq(0) th:eq(0)' ).attr( 'colspan', '3' );
+
+ $table.tablesorter();
+ $table.find( '.headerSort:eq(0)' ).click();
+ $table.find( '.headerSort:eq(0)' ).click();
+ }
+ );
tableTest( 'Sorting with colspanned headers: subsequent column',
header,
initial,
@@ -332,12 +389,40 @@
function ( $table ) {
// Make colspanned header for test
$table.find( 'tr:eq(0) th:eq(1), tr:eq(0) th:eq(2)' ).remove();
- $table.find( 'tr:eq(0) th:eq(0)' ).prop( 'colspan', '3' );
+ $table.find( 'tr:eq(0) th:eq(0)' ).attr( 'colspan', '3' );
$table.tablesorter();
$table.find( '.headerSort:eq(1)' ).click();
}
);
+ tableTest( 'Sorting with colspanned headers: sort subsequent column twice',
+ header,
+ initial,
+ [ aab5, caa4, abc3, bbc2, aaa1 ],
+ function ( $table ) {
+ // Make colspanned header for test
+ $table.find( 'tr:eq(0) th:eq(1), tr:eq(0) th:eq(2)' ).remove();
+ $table.find( 'tr:eq(0) th:eq(0)' ).attr( 'colspan', '3' );
+
+ $table.tablesorter();
+ $table.find( '.headerSort:eq(1)' ).click();
+ $table.find( '.headerSort:eq(1)' ).click();
+ }
+ );
+
+
+ tableTest(
+ 'Basic planet table: one unsortable column',
+ header,
+ planets,
+ planets,
+ function ( $table ) {
+ $table.find( 'tr:eq(0) > th:eq(0)' ).addClass( 'unsortable' );
+
+ $table.tablesorter();
+ $table.find( 'tr:eq(0) > th:eq(0)' ).click();
+ }
+ );
// Regression tests!
tableTest(
@@ -489,12 +574,12 @@
$table.find( 'tr:eq(3) td:eq(1), tr:eq(4) td:eq(1)' ).remove();
// - Set rowspan for 2nd cell of 3rd row to 3.
// This covers the removed cell in the 4th and 5th row.
- $table.find( 'tr:eq(2) td:eq(1)' ).prop( 'rowspan', '3' );
+ $table.find( 'tr:eq(2) td:eq(1)' ).attr( 'rowspan', '3' );
$table.tablesorter();
assert.equal(
- $table.find( 'tr:eq(2) td:eq(1)' ).prop( 'rowspan' ),
+ $table.find( 'tr:eq(2) td:eq(1)' ).prop( 'rowSpan' ),
3,
'Rowspan not exploded'
);
@@ -521,7 +606,7 @@
$table.find( 'tr:eq(3) td:eq(1), tr:eq(4) td:eq(1)' ).remove();
// - Set rowspan for 2nd cell of 3rd row to 3.
// This covers the removed cell in the 4th and 5th row.
- $table.find( 'tr:eq(2) td:eq(1)' ).prop( 'rowspan', '3' );
+ $table.find( 'tr:eq(2) td:eq(1)' ).attr( 'rowspan', '3' );
$table.tablesorter();
$table.find( '.headerSort:eq(0)' ).click();
@@ -538,7 +623,7 @@
$table.find( 'tr:eq(3) td:eq(1), tr:eq(4) td:eq(1)' ).remove();
// - Set rowspan for 2nd cell of 3rd row to 3.
// This covers the removed cell in the 4th and 5th row.
- $table.find( 'tr:eq(2) td:eq(1)' ).prop( 'rowspan', '3' );
+ $table.find( 'tr:eq(2) td:eq(1)' ).attr( 'rowspan', '3' );
$table.tablesorter( { sortList: [
{ 0: 'asc' }
@@ -556,7 +641,7 @@
$table.find( 'tr:eq(3) td:eq(0), tr:eq(4) td:eq(0)' ).remove();
// - Set rowspan for 1st cell of 3rd row to 3.
// This covers the removed cell in the 4th and 5th row.
- $table.find( 'tr:eq(2) td:eq(0)' ).prop( 'rowspan', '3' );
+ $table.find( 'tr:eq(2) td:eq(0)' ).attr( 'rowspan', '3' );
$table.tablesorter();
$table.find( '.headerSort:eq(0)' ).click();
@@ -642,7 +727,7 @@
}
);
- QUnit.test( 'Test detection routine', function ( assert ) {
+ QUnit.test( 'Test detection routine', 1, function ( assert ) {
var $table;
$table = $(
'<table class="sortable">' +
@@ -663,7 +748,7 @@
} );
/** FIXME: the diff output is not very readeable. */
- QUnit.test( 'bug 32047 - caption must be before thead', function ( assert ) {
+ QUnit.test( 'bug 32047 - caption must be before thead', 1, function ( assert ) {
var $table;
$table = $(
'<table class="sortable">' +
@@ -683,7 +768,7 @@
);
} );
- QUnit.test( 'data-sort-value attribute, when available, should override sorting position', function ( assert ) {
+ QUnit.test( 'data-sort-value attribute, when available, should override sorting position', 3, function ( assert ) {
var $table, data;
// Example 1: All cells except one cell without data-sort-value,
@@ -953,7 +1038,7 @@
}
);
- QUnit.test( 'Sorting images using alt text', function ( assert ) {
+ QUnit.test( 'Sorting images using alt text', 1, function ( assert ) {
var $table = $(
'<table class="sortable">' +
'<tr><th>THEAD</th></tr>' +
@@ -970,7 +1055,7 @@
);
} );
- QUnit.test( 'Sorting images using alt text (complex)', function ( assert ) {
+ QUnit.test( 'Sorting images using alt text (complex)', 1, function ( assert ) {
var $table = $(
'<table class="sortable">' +
'<tr><th>THEAD</th></tr>' +
@@ -991,7 +1076,7 @@
);
} );
- QUnit.test( 'Sorting images using alt text (with format autodetection)', function ( assert ) {
+ QUnit.test( 'Sorting images using alt text (with format autodetection)', 1, function ( assert ) {
var $table = $(
'<table class="sortable">' +
'<tr><th>THEAD</th></tr>' +
@@ -1010,6 +1095,61 @@
);
} );
+ QUnit.test( 'bug 38911 - The row with the largest amount of columns should receive the sort indicators', 3, function ( assert ) {
+ var $table = $(
+ '<table class="sortable">' +
+ '<thead>' +
+ '<tr><th rowspan="2" id="A1">A1</th><th colspan="2">B2a</th></tr>' +
+ '<tr><th id="B2b">B2b</th><th id="C2b">C2b</th></tr>' +
+ '</thead>' +
+ '<tr><td>A</td><td>Aa</td><td>Ab</td></tr>' +
+ '<tr><td>B</td><td>Ba</td><td>Bb</td></tr>' +
+ '</table>'
+ );
+ $table.tablesorter();
+
+ assert.equal(
+ $table.find( '#A1' ).attr( 'class' ),
+ 'headerSort',
+ 'The first column of the first row should be sortable'
+ );
+ assert.equal(
+ $table.find( '#B2b' ).attr( 'class' ),
+ 'headerSort',
+ 'The th element of the 2nd row of the 2nd column should be sortable'
+ );
+ assert.equal(
+ $table.find( '#C2b' ).attr( 'class' ),
+ 'headerSort',
+ 'The th element of the 2nd row of the 3rd column should be sortable'
+ );
+ } );
+
+ QUnit.test( 'rowspans in table headers should prefer the last row when rows are equal in length', 2, function ( assert ) {
+ var $table = $(
+ '<table class="sortable">' +
+ '<thead>' +
+ '<tr><th rowspan="2" id="A1">A1</th><th>B2a</th></tr>' +
+ '<tr><th id="B2b">B2b</th></tr>' +
+ '</thead>' +
+ '<tr><td>A</td><td>Aa</td></tr>' +
+ '<tr><td>B</td><td>Ba</td></tr>' +
+ '</table>'
+ );
+ $table.tablesorter();
+
+ assert.equal(
+ $table.find( '#A1' ).attr( 'class' ),
+ 'headerSort',
+ 'The first column of the first row should be sortable'
+ );
+ assert.equal(
+ $table.find( '#B2b' ).attr( 'class' ),
+ 'headerSort',
+ 'The th element of the 2nd row of the 2nd column should be sortable'
+ );
+ } );
+
// bug 41889 - exploding rowspans in more complex cases
tableTestHTML(
'Rowspan exploding with row headers',
diff --git a/tests/qunit/suites/resources/jquery/jquery.textSelection.test.js b/tests/qunit/suites/resources/jquery/jquery.textSelection.test.js
index ce03b697..5fe23944 100644
--- a/tests/qunit/suites/resources/jquery/jquery.textSelection.test.js
+++ b/tests/qunit/suites/resources/jquery/jquery.textSelection.test.js
@@ -48,13 +48,6 @@
var start = opt.before.start,
end = opt.before.end;
- if ( window.opera ) {
- // Compensate for Opera's craziness converting \n to \r\n and counting that as two chars
- var newLinesBefore = opt.before.text.substring( 0, start ).split( '\n' ).length - 1,
- newLinesInside = opt.before.text.substring( start, end ).split( '\n' ).length - 1;
- start += newLinesBefore;
- end += newLinesBefore + newLinesInside;
- }
var options = $.extend( {}, opt.replace ); // Clone opt.replace
options.selectionStart = start;
diff --git a/tests/qunit/suites/resources/mediawiki.special/mediawiki.special.recentchanges.test.js b/tests/qunit/suites/resources/mediawiki.special/mediawiki.special.recentchanges.test.js
index 9389651f..ee854aef 100644
--- a/tests/qunit/suites/resources/mediawiki.special/mediawiki.special.recentchanges.test.js
+++ b/tests/qunit/suites/resources/mediawiki.special/mediawiki.special.recentchanges.test.js
@@ -3,7 +3,7 @@
// TODO: verify checkboxes == [ 'nsassociated', 'nsinvert' ]
- QUnit.test( '"all" namespace disable checkboxes', function ( assert ) {
+ QUnit.test( '"all" namespace disable checkboxes', 8, function ( assert ) {
var selectHtml, $env, $options;
// from Special:Recentchanges
diff --git a/tests/qunit/suites/resources/mediawiki/mediawiki.Title.test.js b/tests/qunit/suites/resources/mediawiki/mediawiki.Title.test.js
index 30a31ef7..ab96f753 100644
--- a/tests/qunit/suites/resources/mediawiki/mediawiki.Title.test.js
+++ b/tests/qunit/suites/resources/mediawiki/mediawiki.Title.test.js
@@ -1,4 +1,4 @@
-( function ( mw ) {
+( function ( mw, $ ) {
// mw.Title relies on these three config vars
// Restore them after each test run
var config = {
@@ -53,49 +53,184 @@
antarctic_waterfowl: 100
},
wgCaseSensitiveNamespaces: []
+ },
+ repeat = function ( input, multiplier ) {
+ return new Array( multiplier + 1 ).join( input );
+ },
+ cases = {
+ // See also TitleTest.php#testSecureAndSplit
+ valid: [
+ 'Sandbox',
+ 'A "B"',
+ 'A \'B\'',
+ '.com',
+ '~',
+ '"',
+ '\'',
+ 'Talk:Sandbox',
+ 'Talk:Foo:Sandbox',
+ 'File:Example.svg',
+ 'File_talk:Example.svg',
+ 'Foo/.../Sandbox',
+ 'Sandbox/...',
+ 'A~~',
+ // Length is 256 total, but only title part matters
+ 'Category:' + repeat( 'x', 248 ),
+ repeat( 'x', 252 )
+ ],
+ invalid: [
+ '',
+ '__ __',
+ ' __ ',
+ // Bad characters forbidden regardless of wgLegalTitleChars
+ 'A [ B',
+ 'A ] B',
+ 'A { B',
+ 'A } B',
+ 'A < B',
+ 'A > B',
+ 'A | B',
+ // URL encoding
+ 'A%20B',
+ 'A%23B',
+ 'A%2523B',
+ // XML/HTML character entity references
+ // Note: The ones with # are commented out as those are interpreted as fragment and
+ // as such end up being valid.
+ 'A &eacute; B',
+ //'A &#233; B',
+ //'A &#x00E9; B',
+ // Subject of NS_TALK does not roundtrip to NS_MAIN
+ 'Talk:File:Example.svg',
+ // Directory navigation
+ '.',
+ '..',
+ './Sandbox',
+ '../Sandbox',
+ 'Foo/./Sandbox',
+ 'Foo/../Sandbox',
+ 'Sandbox/.',
+ 'Sandbox/..',
+ // Tilde
+ 'A ~~~ Name',
+ 'A ~~~~ Signature',
+ 'A ~~~~~ Timestamp',
+ repeat( 'x', 256 ),
+ // Extension separation is a js invention, for length
+ // purposes it is part of the title
+ repeat( 'x', 252 ) + '.json',
+ // Namespace prefix without actual title
+ // ':', // bug 54044
+ 'Talk:',
+ 'Category: ',
+ 'Category: #bar'
+ ]
};
QUnit.module( 'mediawiki.Title', QUnit.newMwEnvironment( { config: config } ) );
- QUnit.test( 'Transformation', 8, function ( assert ) {
+ QUnit.test( 'constructor', cases.invalid.length, function ( assert ) {
+ var i, title;
+ for ( i = 0; i < cases.valid.length; i++ ) {
+ title = new mw.Title( cases.valid[i] );
+ }
+ for ( i = 0; i < cases.invalid.length; i++ ) {
+ /*jshint loopfunc:true */
+ title = cases.invalid[i];
+ assert.throws( function () {
+ return new mw.Title( title );
+ }, cases.invalid[i] );
+ }
+ } );
+
+ QUnit.test( 'newFromText', cases.valid.length + cases.invalid.length, function ( assert ) {
+ var i;
+ for ( i = 0; i < cases.valid.length; i++ ) {
+ assert.equal(
+ $.type( mw.Title.newFromText( cases.valid[i] ) ),
+ 'object',
+ cases.valid[i]
+ );
+ }
+ for ( i = 0; i < cases.invalid.length; i++ ) {
+ assert.equal(
+ $.type( mw.Title.newFromText( cases.invalid[i] ) ),
+ 'null',
+ cases.invalid[i]
+ );
+ }
+ } );
+
+ QUnit.test( 'Basic parsing', 12, function ( assert ) {
+ var title;
+ title = new mw.Title( 'File:Foo_bar.JPG' );
+
+ assert.equal( title.getNamespaceId(), 6 );
+ assert.equal( title.getNamespacePrefix(), 'File:' );
+ assert.equal( title.getName(), 'Foo_bar' );
+ assert.equal( title.getNameText(), 'Foo bar' );
+ assert.equal( title.getExtension(), 'JPG' );
+ assert.equal( title.getDotExtension(), '.JPG' );
+ assert.equal( title.getMain(), 'Foo_bar.JPG' );
+ assert.equal( title.getMainText(), 'Foo bar.JPG' );
+ assert.equal( title.getPrefixedDb(), 'File:Foo_bar.JPG' );
+ assert.equal( title.getPrefixedText(), 'File:Foo bar.JPG' );
+
+ title = new mw.Title( 'Foo#bar' );
+ assert.equal( title.getPrefixedText(), 'Foo' );
+ assert.equal( title.getFragment(), 'bar' );
+ } );
+
+ QUnit.test( 'Transformation', 11, function ( assert ) {
var title;
title = new mw.Title( 'File:quux pif.jpg' );
- assert.equal( title.getName(), 'Quux_pif' );
+ assert.equal( title.getNameText(), 'Quux pif', 'First character of title' );
title = new mw.Title( 'File:Glarg_foo_glang.jpg' );
- assert.equal( title.getNameText(), 'Glarg foo glang' );
+ assert.equal( title.getNameText(), 'Glarg foo glang', 'Underscores' );
title = new mw.Title( 'User:ABC.DEF' );
- assert.equal( title.toText(), 'User:ABC.DEF' );
- assert.equal( title.getNamespaceId(), 2 );
- assert.equal( title.getNamespacePrefix(), 'User:' );
+ assert.equal( title.toText(), 'User:ABC.DEF', 'Round trip text' );
+ assert.equal( title.getNamespaceId(), 2, 'Parse canonical namespace prefix' );
+
+ title = new mw.Title( 'Image:quux pix.jpg' );
+ assert.equal( title.getNamespacePrefix(), 'File:', 'Transform alias to canonical namespace' );
title = new mw.Title( 'uSEr:hAshAr' );
assert.equal( title.toText(), 'User:HAshAr' );
- assert.equal( title.getNamespaceId(), 2 );
+ assert.equal( title.getNamespaceId(), 2, 'Case-insensitive namespace prefix' );
- title = new mw.Title( ' MediaWiki: Foo bar .js ' );
- // Don't ask why, it's the way the backend works. One space is kept of each set
- assert.equal( title.getName(), 'Foo_bar_.js', 'Merge multiple spaces to a single space.' );
- } );
+ // Don't ask why, it's the way the backend works. One space is kept of each set.
+ title = new mw.Title( 'Foo __ \t __ bar' );
+ assert.equal( title.getMain(), 'Foo_bar', 'Merge multiple types of whitespace/underscores into a single underscore' );
- QUnit.test( 'Main text for filename', 8, function ( assert ) {
- var title = new mw.Title( 'File:foo_bar.JPG' );
+ // Regression test: Previously it would only detect an extension if there is no space after it
+ title = new mw.Title( 'Example.js ' );
+ assert.equal( title.getExtension(), 'js', 'Space after an extension is stripped' );
- assert.equal( title.getNamespaceId(), 6 );
- assert.equal( title.getNamespacePrefix(), 'File:' );
- assert.equal( title.getName(), 'Foo_bar' );
- assert.equal( title.getNameText(), 'Foo bar' );
- assert.equal( title.getMain(), 'Foo_bar.JPG' );
- assert.equal( title.getMainText(), 'Foo bar.JPG' );
- assert.equal( title.getExtension(), 'JPG' );
- assert.equal( title.getDotExtension(), '.JPG' );
+ title = new mw.Title( 'Example#foo' );
+ assert.equal( title.getFragment(), 'foo', 'Fragment' );
+
+ title = new mw.Title( 'Example#_foo_bar baz_' );
+ assert.equal( title.getFragment(), ' foo bar baz', 'Fragment' );
} );
- QUnit.test( 'Namespace detection and conversion', 6, function ( assert ) {
+ QUnit.test( 'Namespace detection and conversion', 10, function ( assert ) {
var title;
+ title = new mw.Title( 'File:User:Example' );
+ assert.equal( title.getNamespaceId(), 6, 'Titles can contain namespace prefixes, which are otherwise ignored' );
+
+ title = new mw.Title( 'Example', 6 );
+ assert.equal( title.getNamespaceId(), 6, 'Default namespace passed is used' );
+
+ title = new mw.Title( 'User:Example', 6 );
+ assert.equal( title.getNamespaceId(), 2, 'Included namespace prefix overrides the given default' );
+
+ title = new mw.Title( ':Example', 6 );
+ assert.equal( title.getNamespaceId(), 0, 'Colon forces main namespace' );
+
title = new mw.Title( 'something.PDF', 6 );
assert.equal( title.toString(), 'File:Something.PDF' );
@@ -189,10 +324,93 @@
mw.config.set( 'wgArticlePath', '/wiki/$1' );
title = new mw.Title( 'Foobar' );
- assert.equal( title.getUrl(), '/wiki/Foobar', 'Basic functionally, toString passing to wikiGetlink' );
+ assert.equal( title.getUrl(), '/wiki/Foobar', 'Basic functionally, getUrl uses mw.util.getUrl' );
title = new mw.Title( 'John Doe', 3 );
assert.equal( title.getUrl(), '/wiki/User_talk:John_Doe', 'Escaping in title and namespace for urls' );
} );
-}( mediaWiki ) );
+ QUnit.test( 'newFromImg', 28, function ( assert ) {
+ var title, i, thisCase, prefix,
+ cases = [
+ {
+ url: '/wiki/images/thumb/9/91/Anticlockwise_heliotrope%27s.jpg/99px-Anticlockwise_heliotrope%27s.jpg',
+ typeOfUrl: 'Normal hashed directory thumbnail',
+ nameText: 'Anticlockwise heliotrope\'s',
+ prefixedText: 'File:Anticlockwise heliotrope\'s.jpg'
+ },
+
+ {
+ url: '//upload.wikimedia.org/wikipedia/commons/thumb/8/80/Wikipedia-logo-v2.svg/150px-Wikipedia-logo-v2.svg.png',
+ typeOfUrl: 'Commons thumbnail',
+ nameText: 'Wikipedia-logo-v2',
+ prefixedText: 'File:Wikipedia-logo-v2.svg'
+ },
+
+ {
+ url: '/wiki/images/9/91/Anticlockwise_heliotrope%27s.jpg',
+ typeOfUrl: 'Full image',
+ nameText: 'Anticlockwise heliotrope\'s',
+ prefixedText: 'File:Anticlockwise heliotrope\'s.jpg'
+ },
+
+ {
+ url: 'http://localhost/thumb.php?f=Stuffless_Figaro%27s.jpg&width=180',
+ typeOfUrl: 'thumb.php-based thumbnail',
+ nameText: 'Stuffless Figaro\'s',
+ prefixedText: 'File:Stuffless Figaro\'s.jpg'
+ },
+
+ {
+ url: '/wikipedia/commons/thumb/Wikipedia-logo-v2.svg/150px-Wikipedia-logo-v2.svg.png',
+ typeOfUrl: 'Commons unhashed thumbnail',
+ nameText: 'Wikipedia-logo-v2',
+ prefixedText: 'File:Wikipedia-logo-v2.svg'
+ },
+
+ {
+ url: '/wiki/images/Anticlockwise_heliotrope%27s.jpg',
+ typeOfUrl: 'Unhashed local file',
+ nameText: 'Anticlockwise heliotrope\'s',
+ prefixedText: 'File:Anticlockwise heliotrope\'s.jpg'
+ },
+
+ {
+ url: '',
+ typeOfUrl: 'Empty string'
+ },
+
+ {
+ url: 'foo',
+ typeOfUrl: 'String with only alphabet characters'
+ },
+
+ {
+ url: 'foobar.foobar',
+ typeOfUrl: 'Not a file path'
+ },
+
+ {
+ url: '/a/a0/blah blah blah',
+ typeOfUrl: 'Space characters'
+ }
+ ];
+
+ for ( i = 0; i < cases.length; i++ ) {
+ thisCase = cases[i];
+ title = mw.Title.newFromImg( { src: thisCase.url } );
+
+ if ( thisCase.nameText !== undefined ) {
+ prefix = '[' + thisCase.typeOfUrl + ' URL' + '] ';
+
+ assert.notStrictEqual( title, null, prefix + 'Parses successfully' );
+ assert.equal( title.getNameText(), thisCase.nameText, prefix + 'Filename matches original' );
+ assert.equal( title.getPrefixedText(), thisCase.prefixedText, prefix + 'File page title matches original' );
+ assert.equal( title.getNamespaceId(), 6, prefix + 'Namespace ID matches File namespace' );
+ } else {
+ assert.strictEqual( title, null, thisCase.typeOfUrl + ', should not produce an mw.Title object' );
+ }
+ }
+ } );
+
+}( mediaWiki, jQuery ) );
diff --git a/tests/qunit/suites/resources/mediawiki/mediawiki.jqueryMsg.test.js b/tests/qunit/suites/resources/mediawiki/mediawiki.jqueryMsg.test.js
index 0a9df966..be362e22 100644
--- a/tests/qunit/suites/resources/mediawiki/mediawiki.jqueryMsg.test.js
+++ b/tests/qunit/suites/resources/mediawiki/mediawiki.jqueryMsg.test.js
@@ -1,20 +1,17 @@
( function ( mw, $ ) {
- var mwLanguageCache = {}, oldGetOuterHtml, formatnumTests, specialCharactersPageName,
+ var mwLanguageCache = {}, formatText, formatParse, formatnumTests, specialCharactersPageName,
expectedListUsers, expectedEntrypoints;
+ // When the expected result is the same in both modes
+ function assertBothModes( assert, parserArguments, expectedResult, assertMessage ) {
+ assert.equal( formatText.apply( null, parserArguments ), expectedResult, assertMessage + ' when format is \'text\'' );
+ assert.equal( formatParse.apply( null, parserArguments ), expectedResult, assertMessage + ' when format is \'parse\'' );
+ }
+
QUnit.module( 'mediawiki.jqueryMsg', QUnit.newMwEnvironment( {
setup: function () {
this.orgMwLangauge = mw.language;
mw.language = $.extend( true, {}, this.orgMwLangauge );
- oldGetOuterHtml = $.fn.getOuterHtml;
- $.fn.getOuterHtml = function () {
- var $div = $( '<div>' ), html;
- $div.append( $( this ).eq( 0 ).clone() );
- html = $div.html();
- $div.empty();
- $div = undefined;
- return html;
- };
// Messages that are reused in multiple tests
mw.messages.set( {
@@ -39,18 +36,26 @@
'external-link-replace': 'Foo [$1 bar]'
} );
+ mw.config.set( {
+ wgArticlePath: '/wiki/$1'
+ } );
+
specialCharactersPageName = '"Who" wants to be a millionaire & live on \'Exotic Island\'?';
- expectedListUsers = '注册' + $( '<a>' ).attr( {
- title: 'Special:ListUsers',
- href: mw.util.wikiGetlink( 'Special:ListUsers' )
- } ).text( '用户' ).getOuterHtml();
+ expectedListUsers = '注册<a title="Special:ListUsers" href="/wiki/Special:ListUsers">用户</a>';
expectedEntrypoints = '<a href="https://www.mediawiki.org/wiki/Manual:index.php">index.php</a>';
+
+ formatText = mw.jqueryMsg.getMessageFunction( {
+ format: 'text'
+ } );
+
+ formatParse = mw.jqueryMsg.getMessageFunction( {
+ format: 'parse'
+ } );
},
teardown: function () {
mw.language = this.orgMwLangauge;
- $.fn.getOuterHtml = oldGetOuterHtml;
}
} ) );
@@ -82,18 +87,16 @@
}
QUnit.test( 'Replace', 9, function ( assert ) {
- var parser = mw.jqueryMsg.getMessageFunction();
-
mw.messages.set( 'simple', 'Foo $1 baz $2' );
- assert.equal( parser( 'simple' ), 'Foo $1 baz $2', 'Replacements with no substitutes' );
- assert.equal( parser( 'simple', 'bar' ), 'Foo bar baz $2', 'Replacements with less substitutes' );
- assert.equal( parser( 'simple', 'bar', 'quux' ), 'Foo bar baz quux', 'Replacements with all substitutes' );
+ assert.equal( formatParse( 'simple' ), 'Foo $1 baz $2', 'Replacements with no substitutes' );
+ assert.equal( formatParse( 'simple', 'bar' ), 'Foo bar baz $2', 'Replacements with less substitutes' );
+ assert.equal( formatParse( 'simple', 'bar', 'quux' ), 'Foo bar baz quux', 'Replacements with all substitutes' );
mw.messages.set( 'plain-input', '<foo foo="foo">x$1y&lt;</foo>z' );
assert.equal(
- parser( 'plain-input', 'bar' ),
+ formatParse( 'plain-input', 'bar' ),
'&lt;foo foo="foo"&gt;xbary&amp;lt;&lt;/foo&gt;z',
'Input is not considered html'
);
@@ -101,7 +104,7 @@
mw.messages.set( 'plain-replace', 'Foo $1' );
assert.equal(
- parser( 'plain-replace', '<bar bar="bar">&gt;</bar>' ),
+ formatParse( 'plain-replace', '<bar bar="bar">&gt;</bar>' ),
'Foo &lt;bar bar="bar"&gt;&amp;gt;&lt;/bar&gt;',
'Replacement is not considered html'
);
@@ -109,71 +112,68 @@
mw.messages.set( 'object-replace', 'Foo $1' );
assert.equal(
- parser( 'object-replace', $( '<div class="bar">&gt;</div>' ) ),
+ formatParse( 'object-replace', $( '<div class="bar">&gt;</div>' ) ),
'Foo <div class="bar">&gt;</div>',
'jQuery objects are preserved as raw html'
);
assert.equal(
- parser( 'object-replace', $( '<div class="bar">&gt;</div>' ).get( 0 ) ),
+ formatParse( 'object-replace', $( '<div class="bar">&gt;</div>' ).get( 0 ) ),
'Foo <div class="bar">&gt;</div>',
'HTMLElement objects are preserved as raw html'
);
assert.equal(
- parser( 'object-replace', $( '<div class="bar">&gt;</div>' ).toArray() ),
+ formatParse( 'object-replace', $( '<div class="bar">&gt;</div>' ).toArray() ),
'Foo <div class="bar">&gt;</div>',
'HTMLElement[] arrays are preserved as raw html'
);
assert.equal(
- parser( 'external-link-replace', 'http://example.org/?x=y&z' ),
+ formatParse( 'external-link-replace', 'http://example.org/?x=y&z' ),
'Foo <a href="http://example.org/?x=y&amp;z">bar</a>',
'Href is not double-escaped in wikilink function'
);
} );
QUnit.test( 'Plural', 3, function ( assert ) {
- var parser = mw.jqueryMsg.getMessageFunction();
-
- assert.equal( parser( 'plural-msg', 0 ), 'Found 0 items', 'Plural test for english with zero as count' );
- assert.equal( parser( 'plural-msg', 1 ), 'Found 1 item', 'Singular test for english' );
- assert.equal( parser( 'plural-msg', 2 ), 'Found 2 items', 'Plural test for english' );
+ assert.equal( formatParse( 'plural-msg', 0 ), 'Found 0 items', 'Plural test for english with zero as count' );
+ assert.equal( formatParse( 'plural-msg', 1 ), 'Found 1 item', 'Singular test for english' );
+ assert.equal( formatParse( 'plural-msg', 2 ), 'Found 2 items', 'Plural test for english' );
} );
QUnit.test( 'Gender', 11, function ( assert ) {
// TODO: These tests should be for mw.msg once mw.msg integrated with mw.jqueryMsg
// TODO: English may not be the best language for these tests. Use a language like Arabic or Russian
- var user = mw.user,
- parser = mw.jqueryMsg.getMessageFunction();
+ var user = mw.user;
user.options.set( 'gender', 'male' );
assert.equal(
- parser( 'gender-msg', 'Bob', 'male' ),
+ formatParse( 'gender-msg', 'Bob', 'male' ),
'Bob: blue',
'Masculine from string "male"'
);
assert.equal(
- parser( 'gender-msg', 'Bob', user ),
+ formatParse( 'gender-msg', 'Bob', user ),
'Bob: blue',
'Masculine from mw.user object'
);
user.options.set( 'gender', 'unknown' );
assert.equal(
- parser( 'gender-msg', 'Foo', user ),
+ formatParse( 'gender-msg', 'Foo', user ),
'Foo: green',
'Neutral from mw.user object' );
assert.equal(
- parser( 'gender-msg', 'Alice', 'female' ),
+ formatParse( 'gender-msg', 'Alice', 'female' ),
'Alice: pink',
'Feminine from string "female"' );
assert.equal(
- parser( 'gender-msg', 'User' ),
+ formatParse( 'gender-msg', 'User' ),
'User: green',
'Neutral when no parameter given' );
assert.equal(
- parser( 'gender-msg', 'User', 'unknown' ),
+ formatParse( 'gender-msg', 'User', 'unknown' ),
'User: green',
'Neutral from string "unknown"'
);
@@ -181,43 +181,41 @@
mw.messages.set( 'gender-msg-one-form', '{{GENDER:$1|User}}: $2 {{PLURAL:$2|edit|edits}}' );
assert.equal(
- parser( 'gender-msg-one-form', 'male', 10 ),
+ formatParse( 'gender-msg-one-form', 'male', 10 ),
'User: 10 edits',
'Gender neutral and plural form'
);
assert.equal(
- parser( 'gender-msg-one-form', 'female', 1 ),
+ formatParse( 'gender-msg-one-form', 'female', 1 ),
'User: 1 edit',
'Gender neutral and singular form'
);
mw.messages.set( 'gender-msg-lowercase', '{{gender:$1|he|she}} is awesome' );
assert.equal(
- parser( 'gender-msg-lowercase', 'male' ),
+ formatParse( 'gender-msg-lowercase', 'male' ),
'he is awesome',
'Gender masculine'
);
assert.equal(
- parser( 'gender-msg-lowercase', 'female' ),
+ formatParse( 'gender-msg-lowercase', 'female' ),
'she is awesome',
'Gender feminine'
);
mw.messages.set( 'gender-msg-wrong', '{{gender}} test' );
assert.equal(
- parser( 'gender-msg-wrong', 'female' ),
+ formatParse( 'gender-msg-wrong', 'female' ),
' test',
'Invalid syntax should result in {{gender}} simply being stripped away'
);
} );
QUnit.test( 'Grammar', 2, function ( assert ) {
- var parser = mw.jqueryMsg.getMessageFunction();
-
- assert.equal( parser( 'grammar-msg' ), 'Przeszukaj ' + mw.config.get( 'wgSiteName' ), 'Grammar Test with sitename' );
+ assert.equal( formatParse( 'grammar-msg' ), 'Przeszukaj ' + mw.config.get( 'wgSiteName' ), 'Grammar Test with sitename' );
mw.messages.set( 'grammar-msg-wrong-syntax', 'Przeszukaj {{GRAMMAR:grammar_case_xyz}}' );
- assert.equal( parser( 'grammar-msg-wrong-syntax' ), 'Przeszukaj ', 'Grammar Test with wrong grammar template syntax' );
+ assert.equal( formatParse( 'grammar-msg-wrong-syntax' ), 'Przeszukaj ', 'Grammar Test with wrong grammar template syntax' );
} );
QUnit.test( 'Match PHP parser', mw.libs.phpParserData.tests.length, function ( assert ) {
@@ -242,8 +240,7 @@
} );
QUnit.test( 'Links', 6, function ( assert ) {
- var parser = mw.jqueryMsg.getMessageFunction(),
- expectedDisambiguationsText,
+ var expectedDisambiguationsText,
expectedMultipleBars,
expectedSpecialCharacters;
@@ -252,26 +249,24 @@
the bold was removed because it is not yet implemented.
*/
- assert.equal(
- parser( 'jquerymsg-test-statistics-users' ),
+ assert.htmlEqual(
+ formatParse( 'jquerymsg-test-statistics-users' ),
expectedListUsers,
'Piped wikilink'
);
expectedDisambiguationsText = 'The following pages contain at least one link to a disambiguation page.\nThey may have to link to a more appropriate page instead.\nA page is treated as a disambiguation page if it uses a template that is linked from ' +
- $( '<a>' ).attr( {
- title: 'MediaWiki:Disambiguationspage',
- href: mw.util.wikiGetlink( 'MediaWiki:Disambiguationspage' )
- } ).text( 'MediaWiki:Disambiguationspage' ).getOuterHtml() + '.';
+ '<a title="MediaWiki:Disambiguationspage" href="/wiki/MediaWiki:Disambiguationspage">MediaWiki:Disambiguationspage</a>.';
+
mw.messages.set( 'disambiguations-text', 'The following pages contain at least one link to a disambiguation page.\nThey may have to link to a more appropriate page instead.\nA page is treated as a disambiguation page if it uses a template that is linked from [[MediaWiki:Disambiguationspage]].' );
- assert.equal(
- parser( 'disambiguations-text' ),
+ assert.htmlEqual(
+ formatParse( 'disambiguations-text' ),
expectedDisambiguationsText,
'Wikilink without pipe'
);
- assert.equal(
- parser( 'jquerymsg-test-version-entrypoints-index-php' ),
+ assert.htmlEqual(
+ formatParse( 'jquerymsg-test-version-entrypoints-index-php' ),
expectedEntrypoints,
'External link'
);
@@ -279,30 +274,24 @@
// Pipe trick is not supported currently, but should not parse as text either.
mw.messages.set( 'pipe-trick', '[[Tampa, Florida|]]' );
assert.equal(
- parser( 'pipe-trick' ),
+ formatParse( 'pipe-trick' ),
'pipe-trick: Parse error at position 0 in input: [[Tampa, Florida|]]',
'Pipe trick should return error string.'
);
- expectedMultipleBars = $( '<a>' ).attr( {
- title: 'Main Page',
- href: mw.util.wikiGetlink( 'Main Page' )
- } ).text( 'Main|Page' ).getOuterHtml();
+ expectedMultipleBars = '<a title="Main Page" href="/wiki/Main_Page">Main|Page</a>';
mw.messages.set( 'multiple-bars', '[[Main Page|Main|Page]]' );
- assert.equal(
- parser( 'multiple-bars' ),
+ assert.htmlEqual(
+ formatParse( 'multiple-bars' ),
expectedMultipleBars,
'Bar in anchor'
);
- expectedSpecialCharacters = $( '<a>' ).attr( {
- title: specialCharactersPageName,
- href: mw.util.wikiGetlink( specialCharactersPageName )
- } ).text( specialCharactersPageName ).getOuterHtml();
+ expectedSpecialCharacters = '<a title="&quot;Who&quot; wants to be a millionaire &amp; live on &#039;Exotic Island&#039;?" href="/wiki/%22Who%22_wants_to_be_a_millionaire_%26_live_on_%27Exotic_Island%27%3F">&quot;Who&quot; wants to be a millionaire &amp; live on &#039;Exotic Island&#039;?</a>';
mw.messages.set( 'special-characters', '[[' + specialCharactersPageName + ']]' );
- assert.equal(
- parser( 'special-characters' ),
+ assert.htmlEqual(
+ formatParse( 'special-characters' ),
expectedSpecialCharacters,
'Special characters'
);
@@ -310,32 +299,16 @@
// Tests that {{-transformation vs. general parsing are done as requested
QUnit.test( 'Curly brace transformation', 14, function ( assert ) {
- var formatText, formatParse, oldUserLang;
-
- oldUserLang = mw.config.get( 'wgUserLanguage' );
-
- formatText = mw.jqueryMsg.getMessageFunction( {
- format: 'text'
- } );
-
- formatParse = mw.jqueryMsg.getMessageFunction( {
- format: 'parse'
- } );
-
- // When the expected result is the same in both modes
- function assertBothModes( parserArguments, expectedResult, assertMessage ) {
- assert.equal( formatText.apply( null, parserArguments ), expectedResult, assertMessage + ' when format is \'text\'' );
- assert.equal( formatParse.apply( null, parserArguments ), expectedResult, assertMessage + ' when format is \'parse\'' );
- }
+ var oldUserLang = mw.config.get( 'wgUserLanguage' );
- assertBothModes( ['gender-msg', 'Bob', 'male'], 'Bob: blue', 'gender is resolved' );
+ assertBothModes( assert, ['gender-msg', 'Bob', 'male'], 'Bob: blue', 'gender is resolved' );
- assertBothModes( ['plural-msg', 5], 'Found 5 items', 'plural is resolved' );
+ assertBothModes( assert, ['plural-msg', 5], 'Found 5 items', 'plural is resolved' );
- assertBothModes( ['grammar-msg'], 'Przeszukaj ' + mw.config.get( 'wgSiteName' ), 'grammar is resolved' );
+ assertBothModes( assert, ['grammar-msg'], 'Przeszukaj ' + mw.config.get( 'wgSiteName' ), 'grammar is resolved' );
mw.config.set( 'wgUserLanguage', 'en' );
- assertBothModes( ['formatnum-msg', '987654321.654321'], '987,654,321.654', 'formatnum is resolved' );
+ assertBothModes( assert, ['formatnum-msg', '987654321.654321'], '987,654,321.654', 'formatnum is resolved' );
// Test non-{{ wikitext, where behavior differs
@@ -345,7 +318,7 @@
mw.messages.get( 'jquerymsg-test-statistics-users' ),
'Internal link message unchanged when format is \'text\''
);
- assert.equal(
+ assert.htmlEqual(
formatParse( 'jquerymsg-test-statistics-users' ),
expectedListUsers,
'Internal link message parsed when format is \'parse\''
@@ -357,7 +330,7 @@
mw.messages.get( 'jquerymsg-test-version-entrypoints-index-php' ),
'External link message unchanged when format is \'text\''
);
- assert.equal(
+ assert.htmlEqual(
formatParse( 'jquerymsg-test-version-entrypoints-index-php' ),
expectedEntrypoints,
'External link message processed when format is \'parse\''
@@ -369,7 +342,7 @@
'Foo [http://example.com bar]',
'External link message only substitutes parameter when format is \'text\''
);
- assert.equal(
+ assert.htmlEqual(
formatParse( 'external-link-replace', 'http://example.com' ),
'Foo <a href="http://example.com">bar</a>',
'External link message processed when format is \'parse\''
@@ -379,28 +352,25 @@
} );
QUnit.test( 'Int', 4, function ( assert ) {
- var parser = mw.jqueryMsg.getMessageFunction(),
- newarticletextSource = 'You have followed a link to a page that does not exist yet. To create the page, start typing in the box below (see the [[{{Int:Helppage}}|help page]] for more info). If you are here by mistake, click your browser\'s back button.',
- expectedNewarticletext;
+ var newarticletextSource = 'You have followed a link to a page that does not exist yet. To create the page, start typing in the box below (see the [[{{Int:Helppage}}|help page]] for more info). If you are here by mistake, click your browser\'s back button.',
+ expectedNewarticletext,
+ helpPageTitle = 'Help:Contents';
- mw.messages.set( 'helppage', 'Help:Contents' );
+ mw.messages.set( 'helppage', helpPageTitle );
expectedNewarticletext = 'You have followed a link to a page that does not exist yet. To create the page, start typing in the box below (see the ' +
- $( '<a>' ).attr( {
- title: mw.msg( 'helppage' ),
- href: mw.util.wikiGetlink( mw.msg( 'helppage' ) )
- } ).text( 'help page' ).getOuterHtml() + ' for more info). If you are here by mistake, click your browser\'s back button.';
+ '<a title="Help:Contents" href="/wiki/Help:Contents">help page</a> for more info). If you are here by mistake, click your browser\'s back button.';
mw.messages.set( 'newarticletext', newarticletextSource );
- assert.equal(
- parser( 'newarticletext' ),
+ assert.htmlEqual(
+ formatParse( 'newarticletext' ),
expectedNewarticletext,
'Link with nested message'
);
assert.equal(
- parser( 'see-portal-url' ),
+ formatParse( 'see-portal-url' ),
'Project:Community portal is an important community page.',
'Nested message'
);
@@ -408,8 +378,8 @@
mw.messages.set( 'newarticletext-lowercase',
newarticletextSource.replace( 'Int:Helppage', 'int:helppage' ) );
- assert.equal(
- parser( 'newarticletext-lowercase' ),
+ assert.htmlEqual(
+ formatParse( 'newarticletext-lowercase' ),
expectedNewarticletext,
'Link with nested message, lowercase include'
);
@@ -417,7 +387,7 @@
mw.messages.set( 'uses-missing-int', '{{int:doesnt-exist}}' );
assert.equal(
- parser( 'uses-missing-int' ),
+ formatParse( 'uses-missing-int' ),
'[doesnt-exist]',
'int: where nested message does not exist'
);
@@ -596,4 +566,149 @@ QUnit.test( 'formatnum', formatnumTests.length, function ( assert ) {
} );
} );
+// HTML in wikitext
+QUnit.test( 'HTML', 26, function ( assert ) {
+ mw.messages.set( 'jquerymsg-italics-msg', '<i>Very</i> important' );
+
+ assertBothModes( assert, ['jquerymsg-italics-msg'], mw.messages.get( 'jquerymsg-italics-msg' ), 'Simple italics unchanged' );
+
+ mw.messages.set( 'jquerymsg-bold-msg', '<b>Strong</b> speaker' );
+ assertBothModes( assert, ['jquerymsg-bold-msg'], mw.messages.get( 'jquerymsg-bold-msg' ), 'Simple bold unchanged' );
+
+ mw.messages.set( 'jquerymsg-bold-italics-msg', 'It is <b><i>key</i></b>' );
+ assertBothModes( assert, ['jquerymsg-bold-italics-msg'], mw.messages.get( 'jquerymsg-bold-italics-msg' ), 'Bold and italics nesting order preserved' );
+
+ mw.messages.set( 'jquerymsg-italics-bold-msg', 'It is <i><b>vital</b></i>' );
+ assertBothModes( assert, ['jquerymsg-italics-bold-msg'], mw.messages.get( 'jquerymsg-italics-bold-msg' ), 'Italics and bold nesting order preserved' );
+
+ mw.messages.set( 'jquerymsg-italics-with-link', 'An <i>italicized [[link|wiki-link]]</i>' );
+
+ assert.htmlEqual(
+ formatParse( 'jquerymsg-italics-with-link' ),
+ 'An <i>italicized <a title="link" href="' + mw.html.escape( mw.util.getUrl( 'link' ) ) + '">wiki-link</i>',
+ 'Italics with link inside in parse mode'
+ );
+
+ assert.equal(
+ formatText( 'jquerymsg-italics-with-link' ),
+ mw.messages.get( 'jquerymsg-italics-with-link' ),
+ 'Italics with link unchanged in text mode'
+ );
+
+ mw.messages.set( 'jquerymsg-italics-id-class', '<i id="foo" class="bar">Foo</i>' );
+ assert.htmlEqual(
+ formatParse( 'jquerymsg-italics-id-class' ),
+ mw.messages.get( 'jquerymsg-italics-id-class' ),
+ 'ID and class are allowed'
+ );
+
+ mw.messages.set( 'jquerymsg-italics-onclick', '<i onclick="alert(\'foo\')">Foo</i>' );
+ assert.htmlEqual(
+ formatParse( 'jquerymsg-italics-onclick' ),
+ '&lt;i onclick=&quot;alert(\'foo\')&quot;&gt;Foo&lt;/i&gt;',
+ 'element with onclick is escaped because it is not allowed'
+ );
+
+ mw.messages.set( 'jquerymsg-script-msg', '<script >alert( "Who put this tag here?" );</script>' );
+ assert.htmlEqual(
+ formatParse( 'jquerymsg-script-msg' ),
+ '&lt;script &gt;alert( &quot;Who put this tag here?&quot; );&lt;/script&gt;',
+ 'Tag outside whitelist escaped in parse mode'
+ );
+
+ assert.equal(
+ formatText( 'jquerymsg-script-msg' ),
+ mw.messages.get( 'jquerymsg-script-msg' ),
+ 'Tag outside whitelist unchanged in text mode'
+ );
+
+ mw.messages.set( 'jquerymsg-script-link-msg', '<script>[[Foo|bar]]</script>' );
+ assert.htmlEqual(
+ formatParse( 'jquerymsg-script-link-msg' ),
+ '&lt;script&gt;<a title="Foo" href="' + mw.html.escape( mw.util.getUrl( 'Foo' ) ) + '">bar</a>&lt;/script&gt;',
+ 'Script tag text is escaped because that element is not allowed, but link inside is still HTML'
+ );
+
+ mw.messages.set( 'jquerymsg-mismatched-html', '<i class="important">test</b>' );
+ assert.htmlEqual(
+ formatParse( 'jquerymsg-mismatched-html' ),
+ '&lt;i class=&quot;important&quot;&gt;test&lt;/b&gt;',
+ 'Mismatched HTML start and end tag treated as text'
+ );
+
+ // TODO (mattflaschen, 2013-03-18): It's not a security issue, but there's no real
+ // reason the htmlEmitter span needs to be here. It's an artifact of how emitting works.
+ mw.messages.set( 'jquerymsg-script-and-external-link', '<script>alert( "jquerymsg-script-and-external-link test" );</script> [http://example.com <i>Foo</i> bar]' );
+ assert.htmlEqual(
+ formatParse( 'jquerymsg-script-and-external-link' ),
+ '&lt;script&gt;alert( "jquerymsg-script-and-external-link test" );&lt;/script&gt; <a href="http://example.com"><span class="mediaWiki_htmlEmitter"><i>Foo</i> bar</span></a>',
+ 'HTML tags in external links not interfering with escaping of other tags'
+ );
+
+ mw.messages.set( 'jquerymsg-link-script', '[http://example.com <script>alert( "jquerymsg-link-script test" );</script>]' );
+ assert.htmlEqual(
+ formatParse( 'jquerymsg-link-script' ),
+ '<a href="http://example.com"><span class="mediaWiki_htmlEmitter">&lt;script&gt;alert( "jquerymsg-link-script test" );&lt;/script&gt;</span></a>',
+ 'Non-whitelisted HTML tag in external link anchor treated as text'
+ );
+
+ // Intentionally not using htmlEqual for the quote tests
+ mw.messages.set( 'jquerymsg-double-quotes-preserved', '<i id="double">Double</i>' );
+ assert.equal(
+ formatParse( 'jquerymsg-double-quotes-preserved' ),
+ mw.messages.get( 'jquerymsg-double-quotes-preserved' ),
+ 'Attributes with double quotes are preserved as such'
+ );
+
+ mw.messages.set( 'jquerymsg-single-quotes-normalized-to-double', '<i id=\'single\'>Single</i>' );
+ assert.equal(
+ formatParse( 'jquerymsg-single-quotes-normalized-to-double' ),
+ '<i id="single">Single</i>',
+ 'Attributes with single quotes are normalized to double'
+ );
+
+ mw.messages.set( 'jquerymsg-escaped-double-quotes-attribute', '<i style="font-family:&quot;Arial&quot;">Styled</i>' );
+ assert.htmlEqual(
+ formatParse( 'jquerymsg-escaped-double-quotes-attribute' ),
+ mw.messages.get( 'jquerymsg-escaped-double-quotes-attribute' ),
+ 'Escaped attributes are parsed correctly'
+ );
+
+ mw.messages.set( 'jquerymsg-escaped-single-quotes-attribute', '<i style=\'font-family:&#039;Arial&#039;\'>Styled</i>' );
+ assert.htmlEqual(
+ formatParse( 'jquerymsg-escaped-single-quotes-attribute' ),
+ mw.messages.get( 'jquerymsg-escaped-single-quotes-attribute' ),
+ 'Escaped attributes are parsed correctly'
+ );
+
+
+ mw.messages.set( 'jquerymsg-wikitext-contents-parsed', '<i>[http://example.com Example]</i>' );
+ assert.htmlEqual(
+ formatParse( 'jquerymsg-wikitext-contents-parsed' ),
+ '<i><a href="http://example.com">Example</a></i>',
+ 'Contents of valid tag are treated as wikitext, so external link is parsed'
+ );
+
+ mw.messages.set( 'jquerymsg-wikitext-contents-script', '<i><script>Script inside</script></i>' );
+ assert.htmlEqual(
+ formatParse( 'jquerymsg-wikitext-contents-script' ),
+ '<i><span class="mediaWiki_htmlEmitter">&lt;script&gt;Script inside&lt;/script&gt;</span></i>',
+ 'Contents of valid tag are treated as wikitext, so invalid HTML element is treated as text'
+ );
+
+ mw.messages.set( 'jquerymsg-unclosed-tag', 'Foo<tag>bar' );
+ assert.htmlEqual(
+ formatParse( 'jquerymsg-unclosed-tag' ),
+ 'Foo&lt;tag&gt;bar',
+ 'Nonsupported unclosed tags are escaped'
+ );
+
+ mw.messages.set( 'jquerymsg-self-closing-tag', 'Foo<tag/>bar' );
+ assert.htmlEqual(
+ formatParse( 'jquerymsg-self-closing-tag' ),
+ 'Foo&lt;tag/&gt;bar',
+ 'Self-closing tags don\'t cause a parse error'
+ );
+} );
+
}( mediaWiki, jQuery ) );
diff --git a/tests/qunit/suites/resources/mediawiki/mediawiki.test.js b/tests/qunit/suites/resources/mediawiki/mediawiki.test.js
index 01e78f61..bd4d1d21 100644
--- a/tests/qunit/suites/resources/mediawiki/mediawiki.test.js
+++ b/tests/qunit/suites/resources/mediawiki/mediawiki.test.js
@@ -15,11 +15,17 @@
'gender-plural-msg': '{{GENDER:$1|he|she|they}} {{PLURAL:$2|is|are}} awesome',
'grammar-msg': 'Przeszukaj {{GRAMMAR:grammar_case_foo|{{SITENAME}}}}',
'formatnum-msg': '{{formatnum:$1}}',
- 'int-msg': 'Some {{int:other-message}}'
+ 'int-msg': 'Some {{int:other-message}}',
+ 'mediawiki-test-version-entrypoints-index-php': '[https://www.mediawiki.org/wiki/Manual:index.php index.php]',
+ 'external-link-replace': 'Foo [$1 bar]'
} );
- // For formatnum tests
- mw.config.set( 'wgUserLanguage', 'en' );
+ mw.config.set( {
+ wgArticlePath: '/wiki/$1',
+
+ // For formatnum tests
+ wgUserLanguage: 'en'
+ } );
specialCharactersPageName = '"Who" wants to be a millionaire & live on \'Exotic Island\'?';
}
@@ -124,7 +130,7 @@
assert.ok( mw.config instanceof mw.Map, 'mw.config instance of mw.Map' );
} );
- QUnit.test( 'mw.message & mw.messages', 54, function ( assert ) {
+ QUnit.test( 'mw.message & mw.messages', 100, function ( assert ) {
var goodbye, hello;
// Convenience method for asserting the same result for multiple formats
@@ -158,11 +164,24 @@
assert.equal( hello.escaped(), 'Hello &lt;b&gt;awesome&lt;/b&gt; world', 'Message.escaped returns the escaped message' );
assert.equal( hello.format, 'escaped', 'Message.escaped correctly updated the "format" property' );
- assert.ok( mw.messages.set( 'escaped-with-curly-brace', '"{{SITENAME}}" is the home of {{int:other-message}}' ) );
- assert.equal( mw.message( 'escaped-with-curly-brace' ).escaped(), mw.html.escape( '"' + mw.config.get( 'wgSiteName' ) + '" is the home of Other Message' ), 'Escaped format works correctly for curly brace message' );
+ assert.ok( mw.messages.set( 'multiple-curly-brace', '"{{SITENAME}}" is the home of {{int:other-message}}' ), 'mw.messages.set: Register' );
+ assertMultipleFormats( ['multiple-curly-brace'], ['text', 'parse'], '"' + mw.config.get( 'wgSiteName') + '" is the home of Other Message', 'Curly brace format works correctly' );
+ assert.equal( mw.message( 'multiple-curly-brace' ).plain(), mw.messages.get( 'multiple-curly-brace' ), 'Plain format works correctly for curly brace message' );
+ assert.equal( mw.message( 'multiple-curly-brace' ).escaped(), mw.html.escape( '"' + mw.config.get( 'wgSiteName') + '" is the home of Other Message' ), 'Escaped format works correctly for curly brace message' );
+
+ assert.ok( mw.messages.set( 'multiple-square-brackets-and-ampersand', 'Visit the [[Project:Community portal|community portal]] & [[Project:Help desk|help desk]]' ), 'mw.messages.set: Register' );
+ assertMultipleFormats( ['multiple-square-brackets-and-ampersand'], ['plain', 'text'], mw.messages.get( 'multiple-square-brackets-and-ampersand' ), 'Square bracket message is not processed' );
+ assert.equal( mw.message( 'multiple-square-brackets-and-ampersand' ).escaped(), 'Visit the [[Project:Community portal|community portal]] &amp; [[Project:Help desk|help desk]]', 'Escaped format works correctly for square bracket message' );
+ assert.htmlEqual( mw.message( 'multiple-square-brackets-and-ampersand' ).parse(), 'Visit the ' +
+ '<a title="Project:Community portal" href="/wiki/Project:Community_portal">community portal</a>' +
+ ' &amp; <a title="Project:Help desk" href="/wiki/Project:Help_desk">help desk</a>', 'Internal links work with parse' );
- assert.ok( mw.messages.set( 'escaped-with-square-brackets', 'Visit the [[Project:Community portal|community portal]] & [[Project:Help desk|help desk]]' ) );
- assert.equal( mw.message( 'escaped-with-square-brackets' ).escaped(), 'Visit the [[Project:Community portal|community portal]] &amp; [[Project:Help desk|help desk]]', 'Escaped format works correctly for square bracket message' );
+ assertMultipleFormats( ['mediawiki-test-version-entrypoints-index-php'], ['plain', 'text', 'escaped'], mw.messages.get( 'mediawiki-test-version-entrypoints-index-php' ), 'External link markup is unprocessed' );
+ assert.htmlEqual( mw.message( 'mediawiki-test-version-entrypoints-index-php' ).parse(), '<a href="https://www.mediawiki.org/wiki/Manual:index.php">index.php</a>', 'External link works correctly in parse mode' );
+
+ assertMultipleFormats( ['external-link-replace', 'http://example.org/?x=y&z'], ['plain', 'text'] , 'Foo [http://example.org/?x=y&z bar]', 'Parameters are substituted but external link is not processed' );
+ assert.equal( mw.message( 'external-link-replace', 'http://example.org/?x=y&z' ).escaped(), 'Foo [http://example.org/?x=y&amp;z bar]', 'In escaped mode, parameters are substituted and ampersand is escaped, but external link is not processed' );
+ assert.htmlEqual( mw.message( 'external-link-replace', 'http://example.org/?x=y&z' ).parse(), 'Foo <a href="http://example.org/?x=y&amp;z">bar</a>', 'External link with replacement works in parse mode without double-escaping' );
hello.parse();
assert.equal( hello.format, 'parse', 'Message.parse correctly updated the "format" property' );
@@ -186,6 +205,16 @@
assertMultipleFormats( ['plural-test-msg', 6], ['text', 'parse', 'escaped'], 'There are 6 results', 'plural get resolved' );
assert.equal( mw.message( 'plural-test-msg', 6 ).plain(), 'There {{PLURAL:6|is|are}} 6 {{PLURAL:6|result|results}}', 'Parameter is substituted but plural is not resolved in plain' );
+ assert.ok( mw.messages.set( 'plural-test-msg-explicit', 'There {{plural:$1|is one car|are $1 cars|0=are no cars|12=are a dozen cars}}' ), 'mw.messages.set: Register message with explicit plural forms' );
+ assertMultipleFormats( ['plural-test-msg-explicit', 12], ['text', 'parse', 'escaped'], 'There are a dozen cars', 'explicit plural get resolved' );
+
+ assert.ok( mw.messages.set( 'plural-test-msg-explicit-beginning', 'Basket has {{plural:$1|0=no eggs|12=a dozen eggs|6=half a dozen eggs|one egg|$1 eggs}}' ), 'mw.messages.set: Register message with explicit plural forms' );
+ assertMultipleFormats( ['plural-test-msg-explicit-beginning', 1], ['text', 'parse', 'escaped'], 'Basket has one egg', 'explicit plural given at beginning get resolved for singular' );
+ assertMultipleFormats( ['plural-test-msg-explicit-beginning', 4], ['text', 'parse', 'escaped'], 'Basket has 4 eggs', 'explicit plural given at beginning get resolved for plural' );
+ assertMultipleFormats( ['plural-test-msg-explicit-beginning', 6], ['text', 'parse', 'escaped'], 'Basket has half a dozen eggs', 'explicit plural given at beginning get resolved for 6' );
+ assertMultipleFormats( ['plural-test-msg-explicit-beginning', 0], ['text', 'parse', 'escaped'], 'Basket has no eggs', 'explicit plural given at beginning get resolved for 0' );
+
+
assertMultipleFormats( ['mediawiki-test-pagetriage-del-talk-page-notify-summary'], ['plain', 'text'], mw.messages.get( 'mediawiki-test-pagetriage-del-talk-page-notify-summary' ), 'Double square brackets with no parameters unchanged' );
assertMultipleFormats( ['mediawiki-test-pagetriage-del-talk-page-notify-summary', specialCharactersPageName], ['plain', 'text'], 'Notifying author of deletion nomination for [[' + specialCharactersPageName + ']]', 'Double square brackets with one parameter' );
@@ -196,7 +225,7 @@
assert.ok( mw.messages.set( 'mediawiki-test-categorytree-collapse-bullet', '[<b>−</b>]' ), 'mw.messages.set: Register' );
assert.equal( mw.message( 'mediawiki-test-categorytree-collapse-bullet' ).plain(), mw.messages.get( 'mediawiki-test-categorytree-collapse-bullet' ), 'Single square brackets unchanged in plain mode' );
- assert.ok( mw.messages.set( 'mediawiki-test-wikieditor-toolbar-help-content-signature-result', '<a href=\'#\' title=\'{{#special:mypage}}\'>Username</a> (<a href=\'#\' title=\'{{#special:mytalk}}\'>talk</a>)' ) );
+ assert.ok( mw.messages.set( 'mediawiki-test-wikieditor-toolbar-help-content-signature-result', '<a href=\'#\' title=\'{{#special:mypage}}\'>Username</a> (<a href=\'#\' title=\'{{#special:mytalk}}\'>talk</a>)' ), 'mw.messages.set: Register' );
assert.equal( mw.message( 'mediawiki-test-wikieditor-toolbar-help-content-signature-result' ).plain(), mw.messages.get( 'mediawiki-test-wikieditor-toolbar-help-content-signature-result' ), 'HTML message with curly braces is not changed in plain mode' );
assertMultipleFormats( ['gender-plural-msg', 'male', 1], ['text', 'parse', 'escaped'], 'he is awesome', 'Gender and plural are resolved' );
@@ -211,6 +240,42 @@
assertMultipleFormats( ['int-msg'], ['text', 'parse', 'escaped'], 'Some Other Message', 'int is resolved' );
assert.equal( mw.message( 'int-msg' ).plain(), mw.messages.get( 'int-msg' ), 'int is not resolved in plain mode' );
+
+ assert.ok( mw.messages.set( 'mediawiki-italics-msg', '<i>Very</i> important' ), 'mw.messages.set: Register' );
+ assertMultipleFormats( ['mediawiki-italics-msg'], ['plain', 'text', 'parse'], mw.messages.get( 'mediawiki-italics-msg' ), 'Simple italics unchanged' );
+ assert.htmlEqual(
+ mw.message( 'mediawiki-italics-msg' ).escaped(),
+ '&lt;i&gt;Very&lt;/i&gt; important',
+ 'Italics are escaped in escaped mode'
+ );
+
+ assert.ok( mw.messages.set( 'mediawiki-italics-with-link', 'An <i>italicized [[link|wiki-link]]</i>' ), 'mw.messages.set: Register' );
+ assertMultipleFormats( ['mediawiki-italics-with-link'], ['plain', 'text'], mw.messages.get( 'mediawiki-italics-with-link' ), 'Italics with link unchanged' );
+ assert.htmlEqual(
+ mw.message( 'mediawiki-italics-with-link' ).escaped(),
+ 'An &lt;i&gt;italicized [[link|wiki-link]]&lt;/i&gt;',
+ 'Italics and link unchanged except for escaping in escaped mode'
+ );
+ assert.htmlEqual(
+ mw.message( 'mediawiki-italics-with-link' ).parse(),
+ 'An <i>italicized <a title="link" href="' + mw.util.getUrl( 'link' ) + '">wiki-link</i>',
+ 'Italics with link inside in parse mode'
+ );
+
+ assert.ok( mw.messages.set( 'mediawiki-script-msg', '<script >alert( "Who put this script here?" );</script>' ), 'mw.messages.set: Register' );
+ assertMultipleFormats( ['mediawiki-script-msg'], ['plain', 'text'], mw.messages.get( 'mediawiki-script-msg' ), 'Script unchanged' );
+ assert.htmlEqual(
+ mw.message( 'mediawiki-script-msg' ).escaped(),
+ '&lt;script &gt;alert( "Who put this script here?" );&lt;/script&gt;',
+ 'Script escaped when using escaped format'
+ );
+ assert.htmlEqual(
+ mw.message( 'mediawiki-script-msg' ).parse(),
+ '&lt;script &gt;alert( "Who put this script here?" );&lt;/script&gt;',
+ 'Script escaped when using parse format'
+ );
+
+
} );
QUnit.test( 'mw.msg', 14, function ( assert ) {
@@ -218,7 +283,7 @@
assert.equal( mw.msg( 'hello' ), 'Hello <b>awesome</b> world', 'Gets message with default options (existing message)' );
assert.equal( mw.msg( 'goodbye' ), '<goodbye>', 'Gets message with default options (nonexistent message)' );
- assert.ok( mw.messages.set( 'plural-item', 'Found $1 {{PLURAL:$1|item|items}}' ) );
+ assert.ok( mw.messages.set( 'plural-item' , 'Found $1 {{PLURAL:$1|item|items}}' ), 'mw.messages.set: Register' );
assert.equal( mw.msg( 'plural-item', 5 ), 'Found 5 items', 'Apply plural for count 5' );
assert.equal( mw.msg( 'plural-item', 0 ), 'Found 0 items', 'Apply plural for count 0' );
assert.equal( mw.msg( 'plural-item', 1 ), 'Found 1 item', 'Apply plural for count 1' );
@@ -762,4 +827,90 @@
} );
+ QUnit.test( 'mw.hook', 10, function ( assert ) {
+ var hook, add, fire, chars, callback;
+
+ mw.hook( 'test.hook.unfired' ).add( function () {
+ assert.ok( false, 'Unfired hook' );
+ } );
+
+ mw.hook( 'test.hook.basic' ).add( function () {
+ assert.ok( true, 'Basic callback' );
+ } );
+ mw.hook( 'test.hook.basic' ).fire();
+
+ mw.hook( 'test.hook.data' ).add( function ( data1, data2 ) {
+ assert.equal( data1, 'example', 'Fire with data (string param)' );
+ assert.deepEqual( data2, ['two'], 'Fire with data (array param)' );
+ } );
+ mw.hook( 'test.hook.data' ).fire( 'example', ['two'] );
+
+ mw.hook( 'test.hook.chainable' ).add( function () {
+ assert.ok( true, 'Chainable' );
+ } ).fire();
+
+ hook = mw.hook( 'test.hook.detach' );
+ add = hook.add;
+ fire = hook.fire;
+ add( function ( x, y ) {
+ assert.deepEqual( [x, y], ['x', 'y'], 'Detached (contextless) with data' );
+ } );
+ fire( 'x', 'y' );
+
+ mw.hook( 'test.hook.fireBefore' ).fire().add( function () {
+ assert.ok( true, 'Invoke handler right away if it was fired before' );
+ } );
+
+ mw.hook( 'test.hook.fireTwiceBefore' ).fire().fire().add( function () {
+ assert.ok( true, 'Invoke handler right away if it was fired before (only last one)' );
+ } );
+
+ chars = [];
+
+ mw.hook( 'test.hook.many' )
+ .add( function ( chr ) {
+ chars.push( chr );
+ } )
+ .fire( 'x' ).fire( 'y' ).fire( 'z' )
+ .add( function ( chr ) {
+ assert.equal( chr, 'z', 'Adding callback later invokes right away with last data' );
+ } );
+
+ assert.deepEqual( chars, ['x', 'y', 'z'], 'Multiple callbacks with multiple fires' );
+
+ chars = [];
+ callback = function ( chr ) {
+ chars.push( chr );
+ };
+
+ mw.hook( 'test.hook.variadic' )
+ .add(
+ callback,
+ callback,
+ function ( chr ) {
+ chars.push( chr );
+ },
+ callback
+ )
+ .fire( 'x' )
+ .remove(
+ function () {
+ 'not-added';
+ },
+ callback
+ )
+ .fire( 'y' )
+ .remove( callback )
+ .fire( 'z' );
+
+ assert.deepEqual(
+ chars,
+ ['x', 'x', 'x', 'x', 'y', 'z'],
+ '"add" and "remove" support variadic arguments. ' +
+ '"add" does not filter unique. ' +
+ '"remove" removes all equal by reference. ' +
+ '"remove" is silent if the function is not found'
+ );
+ } );
+
}( mediaWiki, jQuery ) );
diff --git a/tests/qunit/suites/resources/mediawiki/mediawiki.user.test.js b/tests/qunit/suites/resources/mediawiki/mediawiki.user.test.js
index 875ab91a..96be3d1f 100644
--- a/tests/qunit/suites/resources/mediawiki/mediawiki.user.test.js
+++ b/tests/qunit/suites/resources/mediawiki/mediawiki.user.test.js
@@ -5,7 +5,7 @@
assert.ok( mw.user.options instanceof mw.Map, 'options instance of mw.Map' );
} );
- QUnit.test( 'user status', 9, function ( assert ) {
+ QUnit.test( 'user status', 11, function ( assert ) {
/**
* Tests can be run under three different conditions:
* 1) From tests/qunit/index.html, user will be anonymous.
@@ -15,19 +15,23 @@
// Forge an anonymous user:
mw.config.set( 'wgUserName', null );
+ delete mw.config.values.wgUserId;
assert.strictEqual( mw.user.getName(), null, 'user.getName() returns null when anonymous' );
assert.strictEqual( mw.user.name(), null, 'user.name() compatibility' );
assert.assertTrue( mw.user.isAnon(), 'user.isAnon() returns true when anonymous' );
assert.assertTrue( mw.user.anonymous(), 'user.anonymous() compatibility' );
+ assert.strictEqual( mw.user.getId(), 0, 'user.getId() returns 0 when anonymous' );
// Not part of startUp module
mw.config.set( 'wgUserName', 'John' );
+ mw.config.set( 'wgUserId', 123 );
assert.equal( mw.user.getName(), 'John', 'user.getName() returns username when logged-in' );
assert.equal( mw.user.name(), 'John', 'user.name() compatibility' );
assert.assertFalse( mw.user.isAnon(), 'user.isAnon() returns false when logged-in' );
assert.assertFalse( mw.user.anonymous(), 'user.anonymous() compatibility' );
+ assert.strictEqual( mw.user.getId(), 123, 'user.getId() returns correct ID when logged-in' );
assert.equal( mw.user.id(), 'John', 'user.id Returns username when logged-in' );
} );
diff --git a/tests/qunit/suites/resources/mediawiki/mediawiki.util.test.js b/tests/qunit/suites/resources/mediawiki/mediawiki.util.test.js
index 6fc0731c..9216f0af 100644
--- a/tests/qunit/suites/resources/mediawiki/mediawiki.util.test.js
+++ b/tests/qunit/suites/resources/mediawiki/mediawiki.util.test.js
@@ -1,5 +1,13 @@
( function ( mw, $ ) {
- QUnit.module( 'mediawiki.util', QUnit.newMwEnvironment() );
+ QUnit.module( 'mediawiki.util', QUnit.newMwEnvironment( {
+ setup: function () {
+ this.taPrefix = mw.util.tooltipAccessKeyPrefix;
+ mw.util.tooltipAccessKeyPrefix = 'ctrl-alt-';
+ },
+ teardown: function () {
+ mw.util.tooltipAccessKeyPrefix = this.taPrefix;
+ }
+ } ) );
QUnit.test( 'rawurlencode', 1, function ( assert ) {
assert.equal( mw.util.rawurlencode( 'Test:A & B/Here' ), 'Test%3AA%20%26%20B%2FHere' );
@@ -9,20 +17,24 @@
assert.equal( mw.util.wikiUrlencode( 'Test:A & B/Here' ), 'Test:A_%26_B/Here' );
} );
- QUnit.test( 'wikiGetlink', 3, function ( assert ) {
+ QUnit.test( 'getUrl', 4, function ( assert ) {
// Not part of startUp module
mw.config.set( 'wgArticlePath', '/wiki/$1' );
mw.config.set( 'wgPageName', 'Foobar' );
- var href = mw.util.wikiGetlink( 'Sandbox' );
+ var href = mw.util.getUrl( 'Sandbox' );
assert.equal( href, '/wiki/Sandbox', 'Simple title; Get link for "Sandbox"' );
- href = mw.util.wikiGetlink( 'Foo:Sandbox ? 5+5=10 ! (test)/subpage' );
+ href = mw.util.getUrl( 'Foo:Sandbox ? 5+5=10 ! (test)/subpage' );
assert.equal( href, '/wiki/Foo:Sandbox_%3F_5%2B5%3D10_%21_%28test%29/subpage',
'Advanced title; Get link for "Foo:Sandbox ? 5+5=10 ! (test)/subpage"' );
- href = mw.util.wikiGetlink();
+ href = mw.util.getUrl();
assert.equal( href, '/wiki/Foobar', 'Default title; Get link for current page ("Foobar")' );
+
+ href = mw.util.getUrl( 'Sandbox', { action: 'edit' } );
+ assert.equal( href, '/wiki/Sandbox?action=edit',
+ 'Simple title with query string; Get link for "Sandbox" with action=edit' );
} );
QUnit.test( 'wikiScript', 4, function ( assert ) {
@@ -76,13 +88,13 @@
assert.strictEqual( mw.util.toggleToc(), null, 'Return null if there is no table of contents on the page.' );
- tocHtml = '<table id="toc" class="toc"><tr><td>' +
+ tocHtml = '<div id="toc" class="toc">' +
'<div id="toctitle">' +
'<h2>Contents</h2>' +
'<span class="toctoggle">&nbsp;[<a href="#" class="internal" id="togglelink">Hide</a>&nbsp;]</span>' +
'</div>' +
'<ul><li></li></ul>' +
- '</td></tr></table>';
+ '</div>';
$( tocHtml ).appendTo( '#qunit-fixture' );
$toggleLink = $( '#togglelink' );
@@ -108,10 +120,14 @@
assert.strictEqual( mw.util.getParamValue( 'TEST', url ), 'a b+c d', 'Bug 30441: getParamValue must understand "+" encoding of space (multiple spaces)' );
} );
- QUnit.test( 'tooltipAccessKey', 3, function ( assert ) {
- assert.equal( typeof mw.util.tooltipAccessKeyPrefix, 'string', 'mw.util.tooltipAccessKeyPrefix must be a string' );
- assert.ok( mw.util.tooltipAccessKeyRegexp instanceof RegExp, 'mw.util.tooltipAccessKeyRegexp instance of RegExp' );
- assert.ok( mw.util.updateTooltipAccessKeys, 'mw.util.updateTooltipAccessKeys' );
+ QUnit.test( 'tooltipAccessKey', 4, function ( assert ) {
+ assert.equal( typeof mw.util.tooltipAccessKeyPrefix, 'string', 'tooltipAccessKeyPrefix must be a string' );
+ assert.equal( $.type( mw.util.tooltipAccessKeyRegexp ), 'regexp', 'tooltipAccessKeyRegexp is a regexp' );
+ assert.ok( mw.util.updateTooltipAccessKeys, 'updateTooltipAccessKeys is non-empty' );
+
+ 'Example [a]'.replace( mw.util.tooltipAccessKeyRegexp, function ( sub, m1, m2, m3, m4, m5, m6 ) {
+ assert.equal( m6, 'a', 'tooltipAccessKeyRegexp finds the accesskey hint' );
+ } );
} );
QUnit.test( '$content', 2, function ( assert ) {
@@ -125,17 +141,18 @@
* Previously, test elements where invisible to the selector since only
* one element can have a given id.
*/
- QUnit.test( 'addPortletLink', 8, function ( assert ) {
- var pTestTb, pCustom, vectorTabs, tbRL, cuQuux, $cuQuux, tbMW, $tbMW, tbRLDM, caFoo;
+ QUnit.test( 'addPortletLink', 13, function ( assert ) {
+ var pTestTb, pCustom, vectorTabs, tbRL, cuQuux, $cuQuux, tbMW, $tbMW, tbRLDM, caFoo,
+ addedAfter, tbRLDMnonexistentid, tbRLDMemptyjquery;
pTestTb = '\
<div class="portlet" id="p-test-tb">\
- <h5>Toolbox</h5>\
+ <h3>Toolbox</h3>\
<ul class="body"></ul>\
</div>';
pCustom = '\
<div class="portlet" id="p-test-custom">\
- <h5>Views</h5>\
+ <h3>Views</h3>\
<ul class="body">\
<li id="c-foo"><a href="#">Foo</a></li>\
<li id="c-barmenu">\
@@ -147,14 +164,15 @@
</div>';
vectorTabs = '\
<div id="p-test-views" class="vectorTabs">\
- <h5>Views</h5>\
+ <h3>Views</h3>\
<ul></ul>\
</div>';
$( '#qunit-fixture' ).append( pTestTb, pCustom, vectorTabs );
tbRL = mw.util.addPortletLink( 'p-test-tb', '//mediawiki.org/wiki/ResourceLoader',
- 'ResourceLoader', 't-rl', 'More info about ResourceLoader on MediaWiki.org ', 'l' );
+ 'ResourceLoader', 't-rl', 'More info about ResourceLoader on MediaWiki.org ', 'l'
+ );
assert.ok( $.isDomElement( tbRL ), 'addPortletLink returns a valid DOM Element according to $.isDomElement' );
@@ -162,14 +180,32 @@
'MediaWiki.org', 't-mworg', 'Go to MediaWiki.org ', 'm', tbRL );
$tbMW = $( tbMW );
+ assert.propEqual(
+ $tbMW.getAttrs(),
+ {
+ id: 't-mworg'
+ },
+ 'Validate attributes of created element'
+ );
+
+ assert.propEqual(
+ $tbMW.find( 'a' ).getAttrs(),
+ {
+ href: '//mediawiki.org/',
+ title: 'Go to MediaWiki.org [ctrl-alt-m]',
+ accesskey: 'm'
+ },
+ 'Validate attributes of anchor tag in created element'
+ );
- assert.equal( $tbMW.attr( 'id' ), 't-mworg', 'Link has correct ID set' );
assert.equal( $tbMW.closest( '.portlet' ).attr( 'id' ), 'p-test-tb', 'Link was inserted within correct portlet' );
- assert.equal( $tbMW.next().attr( 'id' ), 't-rl', 'Link is in the correct position (by passing nextnode)' );
+ assert.strictEqual( $tbMW.next()[0], tbRL, 'Link is in the correct position (by passing nextnode)' );
- cuQuux = mw.util.addPortletLink( 'p-test-custom', '#', 'Quux' );
+ cuQuux = mw.util.addPortletLink( 'p-test-custom', '#', 'Quux', null, 'Example [shift-x]', 'q' );
$cuQuux = $( cuQuux );
+ assert.equal( $cuQuux.find( 'a' ).attr( 'title' ), 'Example [ctrl-alt-q]', 'Existing accesskey is stripped and updated' );
+
assert.equal(
$( '#p-test-custom #c-barmenu ul li' ).length,
1,
@@ -185,6 +221,21 @@
assert.strictEqual( $tbMW.find( 'span' ).length, 0, 'No <span> element should be added for porlets without vectorTabs class.' );
assert.strictEqual( $( caFoo ).find( 'span' ).length, 1, 'A <span> element should be added for porlets with vectorTabs class.' );
+
+ addedAfter = mw.util.addPortletLink( 'p-test-tb', '#', 'After foo', 'post-foo', 'After foo', null, $( tbRL ) );
+ assert.strictEqual( $( addedAfter ).next()[0], tbRL, 'Link is in the correct position (by passing a jQuery object as nextnode)' );
+
+ // test case - nonexistent id as next node
+ tbRLDMnonexistentid = mw.util.addPortletLink( 'p-test-tb', '//mediawiki.org/wiki/RL/DM',
+ 'Default modules', 't-rldm-nonexistent', 'List of all default modules ', 'd', '#t-rl-nonexistent' );
+
+ assert.equal( tbRLDMnonexistentid, $( '#p-test-tb li:last' )[0], 'Nonexistent id as nextnode adds the portlet at end' );
+
+ // test case - empty jquery object as next node
+ tbRLDMemptyjquery = mw.util.addPortletLink( 'p-test-tb', '//mediawiki.org/wiki/RL/DM',
+ 'Default modules', 't-rldm-empty-jquery', 'List of all default modules ', 'd', $( '#t-rl-nonexistent' ) );
+
+ assert.equal( tbRLDMemptyjquery, $( '#p-test-tb li:last' )[0], 'Empty jquery as nextnode adds the portlet at end' );
} );
QUnit.test( 'jsMessage', 1, function ( assert ) {
diff --git a/tests/qunit/suites/resources/startup.test.js b/tests/qunit/suites/resources/startup.test.js
new file mode 100644
index 00000000..76f32f7e
--- /dev/null
+++ b/tests/qunit/suites/resources/startup.test.js
@@ -0,0 +1,129 @@
+/*global isCompatible: true */
+( function ( $ ) {
+ var testcases = {
+ // Supported: Compatible
+ gradeA: [
+ // Chrome
+ 'Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10_6_7; en-US) AppleWebKit/534.16 (KHTML, like Gecko) Chrome/10.0.648.205 Safari/534.16',
+ // Firefox 4+
+ 'Mozilla/5.0 (Windows NT 6.1.1; rv:5.0) Gecko/20100101 Firefox/5.0',
+ 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10.6; rv:9.0) Gecko/20100101 Firefox/9.0',
+ 'Mozilla/5.0 (Macintosh; I; Intel Mac OS X 11_7_9; de-LI; rv:1.9b4) Gecko/2012010317 Firefox/10.0a4',
+ 'Mozilla/5.0 (Windows NT 6.1; rv:12.0) Gecko/20120403211507 Firefox/12.0',
+ 'Mozilla/5.0 (Windows NT 6.2; Win64; x64; rv:16.0.1) Gecko/20121011 Firefox/16.0.1',
+ // Kindle Fire
+ 'Mozilla/5.0 (Linux; U; Android 2.3.4; en-us; Kindle Fire Build/GINGERBREAD) AppleWebKit/533.1 (KHTML, like Gecko) Version/4.0 Safari/533.1',
+ // Safari 5.0+
+ 'Mozilla/5.0 (Macintosh; I; Intel Mac OS X 10_6_7; ru-ru) AppleWebKit/534.31+ (KHTML, like Gecko) Version/5.0.5 Safari/533.21.1',
+ // Opera 11+
+ 'Opera/9.80 (Windows NT 6.1; U; ru) Presto/2.8.131 Version/11.10',
+ // Internet Explorer 6+
+ 'Mozilla/5.0 (compatible; MSIE 6.0; Windows NT 5.1)',
+ 'Mozilla/5.0 (compatible; MSIE 7.0; Windows NT 6.0; en-US)',
+ 'Mozilla/5.0 (compatible; MSIE 8.0; Windows NT 5.2; Trident/4.0; Media Center PC 4.0; SLCC1; .NET CLR 3.0.04320)',
+ 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 7.1; Trident/5.0)',
+ 'Mozilla/5.0 (compatible; MSIE 10.0; Windows NT 6.1; WOW64; Trident/6.0)',
+ // IE Mobile
+ 'Mozilla/5.0 (compatible; MSIE 9.0; Windows Phone OS 7.5; Trident/5.0; IEMobile/9.0; NOKIA; Lumia 800)',
+ // BlackBerry 6+
+ 'Mozilla/5.0 (BlackBerry; U; BlackBerry 9300; en) AppleWebKit/534.8+ (KHTML, like Gecko) Version/6.0.0.570 Mobile Safari/534.8+',
+ 'Mozilla/5.0 (BlackBerry; U; BlackBerry 9900; en) AppleWebKit/534.11+ (KHTML, like Gecko) Version/7.1.0.346 Mobile Safari/534.11+',
+ 'Mozilla/5.0 (BB10; Touch) AppleWebKit/537.3+ (KHTML, like Gecko) Version/10.0.9.386 Mobile Safari/537.3+',
+ // Open WebOS 1.4+ (HP Veer 4G)
+ 'Mozilla/5.0 (webOS/2.1.2; U; en-US) AppleWebKit/532.2 (KHTML, like Gecko) Version/1.0 Safari/532.2 P160UNA/1.0',
+ // Firefox Mobile
+ 'Mozilla/5.0 (Mobile; rv:14.0) Gecko/14.0 Firefox/14.0',
+ // iOS
+ 'Mozilla/5.0 (ipod: U;CPU iPhone OS 2_2 like Mac OS X: es_es) AppleWebKit/525.18.1 (KHTML, like Gecko) Version/3.0 Mobile/3B48b Safari/419.3',
+ 'Mozilla/5.0 (iPhone; U; CPU like Mac OS X; en) AppleWebKit/420.1 (KHTML, like Gecko) Version/3.0 Mobile/3B48b Safari/419.3',
+ // Android
+ 'Mozilla/5.0 (Linux; U; Android 2.1; en-us; Nexus One Build/ERD62) AppleWebKit/530.17 (KHTML, like Gecko) Version/4.0 Mobile Safari/530.17'
+ ],
+ // Supported: Uncompatible, serve basic content
+ gradeB: [
+ // Internet Explorer < 6
+ 'Mozilla/2.0 (compatible; MSIE 3.03; Windows 3.1)',
+ 'Mozilla/4.0 (compatible; MSIE 4.01; Windows 95)',
+ 'Mozilla/4.0 (compatible; MSIE 5.0; Windows 98;)',
+ 'Mozilla/4.0 (compatible; MSIE 5.5; Windows NT)',
+ // Firefox < 3.6
+ 'Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.8.0.2) Gecko/20060308 Firefox/1.5.0.2',
+ 'Mozilla/5.0 (X11; U; Linux i686; nl; rv:1.8.1.1) Gecko/20070311 Firefox/2.0.0.1',
+ // BlackBerry < 6
+ 'BlackBerry9300/5.0.0.716 Profile/MIDP-2.1 Configuration/CLDC-1.1 VendorID/133',
+ 'BlackBerry7250/4.0.0 Profile/MIDP-2.0 Configuration/CLDC-1.1',
+ // Open WebOS < 1.5 (Palm Pre, Palm Pixi)
+ 'Mozilla/5.0 (webOS/1.0; U; en-US) AppleWebKit/525.27.1 (KHTML, like Gecko) Version/1.0 Safari/525.27.1 Pre/1.0',
+ 'Mozilla/5.0 (webOS/1.4.0; U; en-US) AppleWebKit/532.2 (KHTML, like Gecko) Version/1.0 Safari/532.2 Pixi/1.1 ',
+ // SymbianOS
+ 'NokiaN95_8GB-3;Mozilla/5.0 SymbianOS/9.2;U;Series60/3.1 NokiaN95_8GB-3/11.2.011 Profile/MIDP-2.0 Configuration/CLDC-1.1 AppleWebKit/413 (KHTML, like Gecko)',
+ 'Nokia7610/2.0 (5.0509.0) SymbianOS/7.0s Series60/2.1 Profile/MIDP-2.0 Configuration/CLDC-1.0 ',
+ 'Mozilla/5.0 (SymbianOS/9.1; U; [en]; SymbianOS/91 Series60/3.0) AppleWebKit/413 (KHTML, like Gecko) Safari/413',
+ 'Mozilla/5.0 (SymbianOS/9.3; Series60/3.2 NokiaE52-2/091.003; Profile/MIDP-2.1 Configuration/CLDC-1.1 ) AppleWebKit/533.4 (KHTML, like Gecko) NokiaBrowser/7.3.1.34 Mobile Safari/533.4',
+ // NetFront
+ 'Mozilla/4.0 (compatible; Linux 2.6.10) NetFront/3.3 Kindle/1.0 (screen 600x800)',
+ 'Mozilla/4.0 (compatible; Linux 2.6.22) NetFront/3.4 Kindle/2.0 (screen 824x1200; rotate)',
+ 'Mozilla/4.08 (Windows; Mobile Content Viewer/1.0) NetFront/3.2',
+ // Opera Mini
+ 'Opera/9.80 (J2ME/MIDP; Opera Mini/3.1.10423/22.387; U; en) Presto/2.5.25 Version/10.54',
+ 'Opera/9.50 (J2ME/MIDP; Opera Mini/4.0.10031/298; U; en)',
+ 'Opera/9.80 (J2ME/MIDP; Opera Mini/6.24093/26.1305; U; en) Presto/2.8.119 Version/10.54',
+ 'Opera/9.80 (Android; Opera Mini/7.29530/27.1407; U; en) Presto/2.8.119 Version/11.10',
+ // Ovi Browser
+ 'Mozilla/5.0 (Series40; NokiaX3-02/05.60; Profile/MIDP-2.1 Configuration/CLDC-1.1) Gecko/20100401 S40OviBrowser/3.2.0.0.6',
+ 'Mozilla/5.0 (Series40; Nokia305/05.92; Profile/MIDP-2.1 Configuration/CLDC-1.1) Gecko/20100401 S40OviBrowser/3.7.0.0.11'
+ ],
+ // No explicit support for or against these browsers, they're
+ // given a shot at Grade A at their own risk.
+ gradeX: [
+ // Firefox 3.6
+ 'Mozilla/5.0 (Windows; U; Windows NT 6.1; ru; rv:1.9.2.3) Gecko/20100401 Firefox/3.6.3',
+ // Gecko
+ 'Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.8.0.7) Gecko/20060928 (Debian|Debian-1.8.0.7-1) Epiphany/2.14',
+ 'Mozilla/5.0 (X11; U; Linux i686 (x86_64); en-US; rv:1.8.1.6) Gecko/20070817 IceWeasel/2.0.0.6-g2',
+ // KHTML
+ 'Mozilla/5.0 (compatible; Konqueror/4.3; Linux) KHTML/4.3.5 (like Gecko)',
+ // Text browsers
+ 'Links (2.1pre33; Darwin 8.11.0 Power Macintosh; x)',
+ 'Links (6.9; Unix 6.9-astral sparc; 80x25)',
+ 'Lynx/2.8.6rel.4 libwww-FM/2.14 SSL-MM/1.4.1 OpenSSL/0.9.8g',
+ 'w3m/0.5.1',
+ // Bots
+ 'Googlebot/2.1 (+http://www.google.com/bot.html)',
+ 'Mozilla/5.0 (compatible; googlebot/2.1; +http://www.google.com/bot.html)',
+ 'Mozilla/5.0 (compatible; YandexBot/3.0)',
+ // Scripts
+ 'curl/7.21.4 (universal-apple-darwin11.0) libcurl/7.21.4 OpenSSL/0.9.8r zlib/1.2.5',
+ 'Wget/1.9',
+ 'Wget/1.10.1 (Red Hat modified)',
+ // Unknown
+ 'I\'m an unknown browser',
+ // Empty
+ ''
+ ]
+ };
+
+ QUnit.module( 'startup', QUnit.newMwEnvironment() );
+
+ QUnit.test( 'isCompatible( Grade A )', testcases.gradeA.length, function ( assert ) {
+ $.each( testcases.gradeA, function ( i, ua ) {
+ assert.strictEqual( isCompatible( ua ), true, ua );
+ }
+ );
+ } );
+
+ QUnit.test( 'isCompatible( Grade B )', testcases.gradeB.length, function ( assert ) {
+ $.each( testcases.gradeB, function ( i, ua ) {
+ assert.strictEqual( isCompatible( ua ), false, ua );
+ }
+ );
+ } );
+
+ QUnit.test( 'isCompatible( Grade X )', testcases.gradeX.length, function ( assert ) {
+ $.each( testcases.gradeX, function ( i, ua ) {
+ assert.strictEqual( isCompatible( ua ), true, ua );
+ }
+ );
+ } );
+
+}( jQuery ) );
diff --git a/tests/selenium/Selenium.php b/tests/selenium/Selenium.php
deleted file mode 100644
index 07f98671..00000000
--- a/tests/selenium/Selenium.php
+++ /dev/null
@@ -1,191 +0,0 @@
-<?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;
- }
-
- public static 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/tests/selenium/SeleniumConfig.php b/tests/selenium/SeleniumConfig.php
deleted file mode 100644
index 0823275c..00000000
--- a/tests/selenium/SeleniumConfig.php
+++ /dev/null
@@ -1,80 +0,0 @@
-<?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" );
- }
-
- $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_ini_line( $iniLine ) {
- static $specialValues = array( 'false' => false, 'true' => true, 'null' => null );
- list( $key, $value ) = explode( '=', $iniLine, 2 );
- $key = trim( $key );
- $value = trim( $value );
-
- if ( isset( $specialValues[$value] ) ) {
- $value = $specialValues[$value];
- } else {
- $value = trim( $value, '"' );
- }
-
- /* Support one-level arrays */
- if ( preg_match( '/^([A-Za-z]+)\[([A-Za-z]+)\]/', $key, $m ) ) {
- $key = $m[1];
- $value = array( $m[2] => $value );
- }
-
- return array( $key => $value );
- }
-}
diff --git a/tests/selenium/SeleniumLoader.php b/tests/selenium/SeleniumLoader.php
deleted file mode 100644
index 8d5e7713..00000000
--- a/tests/selenium/SeleniumLoader.php
+++ /dev/null
@@ -1,9 +0,0 @@
-<?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/tests/selenium/SeleniumServerManager.php b/tests/selenium/SeleniumServerManager.php
deleted file mode 100644
index 9efa509a..00000000
--- a/tests/selenium/SeleniumServerManager.php
+++ /dev/null
@@ -1,252 +0,0 @@
-<?php
-/**
- * Selenium server manager
- *
- * @file
- * @ingroup Testing
- * 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
- */
-
-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'];
- // @todo 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';
- } else {
- // server already running.
- 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/tests/selenium/SeleniumTestCase.php b/tests/selenium/SeleniumTestCase.php
deleted file mode 100644
index 5346b1be..00000000
--- a/tests/selenium/SeleniumTestCase.php
+++ /dev/null
@@ -1,127 +0,0 @@
-<?php
-include( "SeleniumTestConstants.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 );
- }
-
-
- /**
- * Create a test fixture page if one does not exist
- * @param $pageName The fixture page name. If none is supplied, it uses SeleniumTestConstants::WIKI_INTERNAL_LINK
- */
- function createTestPageIfMissing( $pageName = null ) {
- if ( $pageName == null ) {
- $pageName = SeleniumTestConstants::WIKI_INTERNAL_LINK;
- }
- $this->type( SeleniumTestConstants::INPUT_SEARCH_BOX, $pageName );
- $this->click( SeleniumTestConstants::BUTTON_SEARCH );
- $this->waitForPageToLoad( SeleniumTestConstants::WIKI_TEST_WAIT_TIME );
- $this->click( SeleniumTestConstants::LINK_START . $pageName );
- $this->waitForPageToLoad( SeleniumTestConstants::WIKI_TEST_WAIT_TIME );
- $location = $this->getLocation() . "\n";
- if ( strpos( $location, '&redlink=1' ) !== false ) {
- $this->type( SeleniumTestConstants::TEXT_EDITOR, "Test fixture page. No real content here" );
- $this->click( SeleniumTestConstants::BUTTON_SAVE );
- $this->waitForPageToLoad( SeleniumTestConstants::WIKI_TEST_WAIT_TIME );
- $this->assertTrue( $this->isTextPresent( $pageName ),
- $this->getText( SeleniumTestConstants::TEXT_PAGE_HEADING ) );
- }
- }
-
- /**
- * Create a test page using date as part of the name so that it is unique
- * @param $pagePrefix The prefix to use for the page name. The current date will be appended to this to make it unique
- * @param $watchThis Whether to add the page to my watchlist. Defaults to false.
- */
- function createNewTestPage( $pagePrefix, $watchThis = false ) {
- $pageName = $pagePrefix . date( "Ymd-His" );
- $this->type( SeleniumTestConstants::INPUT_SEARCH_BOX, $pageName );
- $this->click( SeleniumTestConstants::BUTTON_SEARCH );
- $this->waitForPageToLoad( SeleniumTestConstants::WIKI_TEST_WAIT_TIME );
- $this->click( SeleniumTestConstants::LINK_START . $pageName );
- $this->waitForPageToLoad( SeleniumTestConstants::WIKI_TEST_WAIT_TIME );
- $location = $this->getLocation() . "\n";
- $this->assertContains( '&redlink=1', $location ) .
- $this->type( SeleniumTestConstants::TEXT_EDITOR, "Test fixture page. No real content here" );
- if ( $watchThis ) {
- $this->click( "wpWatchthis" );
- }
- $this->click( SeleniumTestConstants::BUTTON_SAVE );
- $this->waitForPageToLoad( SeleniumTestConstants::WIKI_TEST_WAIT_TIME );
- $this->assertTrue( $this->isTextPresent( $pageName ),
- $this->getText( SeleniumTestConstants::TEXT_PAGE_HEADING ) );
- return $pageName;
- }
-
- 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" );
- }
-}
diff --git a/tests/selenium/SeleniumTestConsoleLogger.php b/tests/selenium/SeleniumTestConsoleLogger.php
deleted file mode 100644
index b6f5496c..00000000
--- a/tests/selenium/SeleniumTestConsoleLogger.php
+++ /dev/null
@@ -1,25 +0,0 @@
-<?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/tests/selenium/SeleniumTestConstants.php b/tests/selenium/SeleniumTestConstants.php
deleted file mode 100644
index 1defb73c..00000000
--- a/tests/selenium/SeleniumTestConstants.php
+++ /dev/null
@@ -1,24 +0,0 @@
-<?php
-
-class SeleniumTestConstants {
- const WIKI_TEST_WAIT_TIME = 3000; // Waiting time
-
- //commonly used links
- const LINK_MAIN_PAGE = 'link=Main page';
- const LINK_RANDOM_PAGE = 'link=Random article';
- const TEXT_PAGE_HEADING = 'firstHeading';
-
- const LINK_START = 'link=';
- const TEXT_EDITOR = 'wpTextbox1';
- const LINK_PREVIEW = 'wpPreview';
- const LINK_EDIT = 'link=Edit';
-
- const WIKI_SEARCH_PAGE = 'Hair (musical)'; // Page name to search
- const WIKI_TEXT_SEARCH = 'TV'; // Text to search
- const WIKI_INTERNAL_LINK = 'Wikieditor-Fixture-Page'; // Exisiting page name to add as an internal tag
-
- const INPUT_SEARCH_BOX = 'searchInput';
- const BUTTON_SEARCH = 'mw-searchButton';
- const BUTTON_SAVE = 'wpSave';
-}
-
diff --git a/tests/selenium/SeleniumTestHTMLLogger.php b/tests/selenium/SeleniumTestHTMLLogger.php
deleted file mode 100644
index 21332cf0..00000000
--- a/tests/selenium/SeleniumTestHTMLLogger.php
+++ /dev/null
@@ -1,36 +0,0 @@
-<?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/tests/selenium/SeleniumTestListener.php b/tests/selenium/SeleniumTestListener.php
deleted file mode 100644
index dc0ac66c..00000000
--- a/tests/selenium/SeleniumTestListener.php
+++ /dev/null
@@ -1,65 +0,0 @@
-<?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/tests/selenium/SeleniumTestSuite.php b/tests/selenium/SeleniumTestSuite.php
deleted file mode 100644
index 8c21f21c..00000000
--- a/tests/selenium/SeleniumTestSuite.php
+++ /dev/null
@@ -1,57 +0,0 @@
-<?php
-
-abstract class SeleniumTestSuite extends PHPUnit_Framework_TestSuite {
- private $selenium;
- private $isSetUp = false;
- private $loginBeforeTests = true;
- private $triggerClientTestResources = true;
-
- // Do not add line break after test output
- const CONTINUE_LINE = 1;
- const RESULT_OK = 2;
- const RESULT_ERROR = 3;
-
- abstract public 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();
- if ( $this->triggerClientTestResources ) {
- $this->selenium->open( $this->selenium->getUrl() . '/index.php?setupTestSuite=' . $this->getName() );
- //wait a little longer for the db operation
- $this->selenium->waitForPageToLoad( 6000 );
- }
- if ( $this->loginBeforeTests ) {
- $this->login();
- }
- }
-
- public function tearDown() {
- if ( $this->triggerClientTestResources ) {
- $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;
- }
-
- protected function setTriggerClientTestResources( $triggerClientTestResources = true ) {
- $this->triggerClientTestResources = $triggerClientTestResources;
- }
-}
diff --git a/tests/selenium/data/SimpleSeleniumTestDB.sql b/tests/selenium/data/SimpleSeleniumTestDB.sql
deleted file mode 100644
index 99ae4779..00000000
--- a/tests/selenium/data/SimpleSeleniumTestDB.sql
+++ /dev/null
@@ -1,1453 +0,0 @@
--- MySQL dump 10.13 Distrib 5.1.41, for debian-linux-gnu (x86_64)
---
--- Host: localhost Database: test_wiki
--- ------------------------------------------------------
--- Server version 5.1.41-3ubuntu12.7
-
-/*!40101 SET @OLD_CHARACTER_SET_CLIENT=@@CHARACTER_SET_CLIENT */;
-/*!40101 SET @OLD_CHARACTER_SET_RESULTS=@@CHARACTER_SET_RESULTS */;
-/*!40101 SET @OLD_COLLATION_CONNECTION=@@COLLATION_CONNECTION */;
-/*!40101 SET NAMES utf8 */;
-/*!40103 SET @OLD_TIME_ZONE=@@TIME_ZONE */;
-/*!40103 SET TIME_ZONE='+00:00' */;
-/*!40014 SET @OLD_UNIQUE_CHECKS=@@UNIQUE_CHECKS, UNIQUE_CHECKS=0 */;
-/*!40014 SET @OLD_FOREIGN_KEY_CHECKS=@@FOREIGN_KEY_CHECKS, FOREIGN_KEY_CHECKS=0 */;
-/*!40101 SET @OLD_SQL_MODE=@@SQL_MODE, SQL_MODE='NO_AUTO_VALUE_ON_ZERO' */;
-/*!40111 SET @OLD_SQL_NOTES=@@SQL_NOTES, SQL_NOTES=0 */;
-
---
--- Table structure for table `mw_archive`
---
-
-DROP TABLE IF EXISTS `mw_archive`;
-/*!40101 SET @saved_cs_client = @@character_set_client */;
-/*!40101 SET character_set_client = utf8 */;
-CREATE TABLE `mw_archive` (
- `ar_namespace` int(11) NOT NULL DEFAULT '0',
- `ar_title` varchar(255) CHARACTER SET latin1 COLLATE latin1_bin NOT NULL DEFAULT '',
- `ar_text` mediumblob NOT NULL,
- `ar_comment` tinyblob NOT NULL,
- `ar_user` int(10) unsigned NOT NULL DEFAULT '0',
- `ar_user_text` varchar(255) CHARACTER SET latin1 COLLATE latin1_bin NOT NULL,
- `ar_timestamp` binary(14) NOT NULL DEFAULT '\0\0\0\0\0\0\0\0\0\0\0\0\0\0',
- `ar_minor_edit` tinyint(4) NOT NULL DEFAULT '0',
- `ar_flags` tinyblob NOT NULL,
- `ar_rev_id` int(10) unsigned DEFAULT NULL,
- `ar_text_id` int(10) unsigned DEFAULT NULL,
- `ar_deleted` tinyint(3) unsigned NOT NULL DEFAULT '0',
- `ar_len` int(10) unsigned DEFAULT NULL,
- `ar_page_id` int(10) unsigned DEFAULT NULL,
- `ar_parent_id` int(10) unsigned DEFAULT NULL,
- KEY `name_title_timestamp` (`ar_namespace`,`ar_title`,`ar_timestamp`),
- KEY `usertext_timestamp` (`ar_user_text`,`ar_timestamp`),
- KEY `ar_revid` (`ar_rev_id`)
-) ENGINE=InnoDB DEFAULT CHARSET=latin1;
-/*!40101 SET character_set_client = @saved_cs_client */;
-
---
--- Dumping data for table `mw_archive`
---
-
-LOCK TABLES `mw_archive` WRITE;
-/*!40000 ALTER TABLE `mw_archive` DISABLE KEYS */;
-/*!40000 ALTER TABLE `mw_archive` ENABLE KEYS */;
-UNLOCK TABLES;
-
---
--- Table structure for table `mw_category`
---
-
-DROP TABLE IF EXISTS `mw_category`;
-/*!40101 SET @saved_cs_client = @@character_set_client */;
-/*!40101 SET character_set_client = utf8 */;
-CREATE TABLE `mw_category` (
- `cat_id` int(10) unsigned NOT NULL AUTO_INCREMENT,
- `cat_title` varchar(255) CHARACTER SET latin1 COLLATE latin1_bin NOT NULL,
- `cat_pages` int(11) NOT NULL DEFAULT '0',
- `cat_subcats` int(11) NOT NULL DEFAULT '0',
- `cat_files` int(11) NOT NULL DEFAULT '0',
- `cat_hidden` tinyint(3) unsigned NOT NULL DEFAULT '0',
- PRIMARY KEY (`cat_id`),
- UNIQUE KEY `cat_title` (`cat_title`),
- KEY `cat_pages` (`cat_pages`)
-) ENGINE=InnoDB DEFAULT CHARSET=latin1;
-/*!40101 SET character_set_client = @saved_cs_client */;
-
---
--- Dumping data for table `mw_category`
---
-
-LOCK TABLES `mw_category` WRITE;
-/*!40000 ALTER TABLE `mw_category` DISABLE KEYS */;
-/*!40000 ALTER TABLE `mw_category` ENABLE KEYS */;
-UNLOCK TABLES;
-
---
--- Table structure for table `mw_categorylinks`
---
-
-DROP TABLE IF EXISTS `mw_categorylinks`;
-/*!40101 SET @saved_cs_client = @@character_set_client */;
-/*!40101 SET character_set_client = utf8 */;
-CREATE TABLE `mw_categorylinks` (
- `cl_from` int(10) unsigned NOT NULL DEFAULT '0',
- `cl_to` varchar(255) CHARACTER SET latin1 COLLATE latin1_bin NOT NULL DEFAULT '',
- `cl_sortkey` varbinary(230) NOT NULL DEFAULT '',
- `cl_sortkey_prefix` varchar(255) CHARACTER SET latin1 COLLATE latin1_bin NOT NULL DEFAULT '',
- `cl_timestamp` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
- `cl_collation` varbinary(32) NOT NULL DEFAULT '',
- `cl_type` enum('page','subcat','file') NOT NULL DEFAULT 'page',
- UNIQUE KEY `cl_from` (`cl_from`,`cl_to`),
- KEY `cl_sortkey` (`cl_to`,`cl_type`,`cl_sortkey`,`cl_from`),
- KEY `cl_timestamp` (`cl_to`,`cl_timestamp`),
- KEY `cl_collation` (`cl_collation`)
-) ENGINE=InnoDB DEFAULT CHARSET=latin1;
-/*!40101 SET character_set_client = @saved_cs_client */;
-
---
--- Dumping data for table `mw_categorylinks`
---
-
-LOCK TABLES `mw_categorylinks` WRITE;
-/*!40000 ALTER TABLE `mw_categorylinks` DISABLE KEYS */;
-/*!40000 ALTER TABLE `mw_categorylinks` ENABLE KEYS */;
-UNLOCK TABLES;
-
---
--- Table structure for table `mw_change_tag`
---
-
-DROP TABLE IF EXISTS `mw_change_tag`;
-/*!40101 SET @saved_cs_client = @@character_set_client */;
-/*!40101 SET character_set_client = utf8 */;
-CREATE TABLE `mw_change_tag` (
- `ct_rc_id` int(11) DEFAULT NULL,
- `ct_log_id` int(11) DEFAULT NULL,
- `ct_rev_id` int(11) DEFAULT NULL,
- `ct_tag` varchar(255) NOT NULL,
- `ct_params` blob,
- UNIQUE KEY `change_tag_rc_tag` (`ct_rc_id`,`ct_tag`),
- UNIQUE KEY `change_tag_log_tag` (`ct_log_id`,`ct_tag`),
- UNIQUE KEY `change_tag_rev_tag` (`ct_rev_id`,`ct_tag`),
- KEY `change_tag_tag_id` (`ct_tag`,`ct_rc_id`,`ct_rev_id`,`ct_log_id`)
-) ENGINE=InnoDB DEFAULT CHARSET=latin1;
-/*!40101 SET character_set_client = @saved_cs_client */;
-
---
--- Dumping data for table `mw_change_tag`
---
-
-LOCK TABLES `mw_change_tag` WRITE;
-/*!40000 ALTER TABLE `mw_change_tag` DISABLE KEYS */;
-/*!40000 ALTER TABLE `mw_change_tag` ENABLE KEYS */;
-UNLOCK TABLES;
-
---
--- Table structure for table `mw_external_user`
---
-
-DROP TABLE IF EXISTS `mw_external_user`;
-/*!40101 SET @saved_cs_client = @@character_set_client */;
-/*!40101 SET character_set_client = utf8 */;
-CREATE TABLE `mw_external_user` (
- `eu_local_id` int(10) unsigned NOT NULL,
- `eu_external_id` varchar(255) CHARACTER SET latin1 COLLATE latin1_bin NOT NULL,
- PRIMARY KEY (`eu_local_id`),
- UNIQUE KEY `eu_external_id` (`eu_external_id`)
-) ENGINE=InnoDB DEFAULT CHARSET=latin1;
-/*!40101 SET character_set_client = @saved_cs_client */;
-
---
--- Dumping data for table `mw_external_user`
---
-
-LOCK TABLES `mw_external_user` WRITE;
-/*!40000 ALTER TABLE `mw_external_user` DISABLE KEYS */;
-/*!40000 ALTER TABLE `mw_external_user` ENABLE KEYS */;
-UNLOCK TABLES;
-
---
--- Table structure for table `mw_externallinks`
---
-
-DROP TABLE IF EXISTS `mw_externallinks`;
-/*!40101 SET @saved_cs_client = @@character_set_client */;
-/*!40101 SET character_set_client = utf8 */;
-CREATE TABLE `mw_externallinks` (
- `el_from` int(10) unsigned NOT NULL DEFAULT '0',
- `el_to` blob NOT NULL,
- `el_index` blob NOT NULL,
- KEY `el_from` (`el_from`,`el_to`(40)),
- KEY `el_to` (`el_to`(60),`el_from`),
- KEY `el_index` (`el_index`(60))
-) ENGINE=InnoDB DEFAULT CHARSET=latin1;
-/*!40101 SET character_set_client = @saved_cs_client */;
-
---
--- Dumping data for table `mw_externallinks`
---
-
-LOCK TABLES `mw_externallinks` WRITE;
-/*!40000 ALTER TABLE `mw_externallinks` DISABLE KEYS */;
-INSERT INTO `mw_externallinks` VALUES (1,'http://meta.wikimedia.org/wiki/Help:Contents','http://org.wikimedia.meta./wiki/Help:Contents'),(1,'http://www.mediawiki.org/wiki/Manual:Configuration_settings','http://org.mediawiki.www./wiki/Manual:Configuration_settings'),(1,'http://www.mediawiki.org/wiki/Manual:FAQ','http://org.mediawiki.www./wiki/Manual:FAQ'),(1,'https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce','https://org.wikimedia.lists./mailman/listinfo/mediawiki-announce');
-/*!40000 ALTER TABLE `mw_externallinks` ENABLE KEYS */;
-UNLOCK TABLES;
-
---
--- Table structure for table `mw_filearchive`
---
-
-DROP TABLE IF EXISTS `mw_filearchive`;
-/*!40101 SET @saved_cs_client = @@character_set_client */;
-/*!40101 SET character_set_client = utf8 */;
-CREATE TABLE `mw_filearchive` (
- `fa_id` int(11) NOT NULL AUTO_INCREMENT,
- `fa_name` varchar(255) CHARACTER SET latin1 COLLATE latin1_bin NOT NULL DEFAULT '',
- `fa_archive_name` varchar(255) CHARACTER SET latin1 COLLATE latin1_bin DEFAULT '',
- `fa_storage_group` varbinary(16) DEFAULT NULL,
- `fa_storage_key` varbinary(64) DEFAULT '',
- `fa_deleted_user` int(11) DEFAULT NULL,
- `fa_deleted_timestamp` binary(14) DEFAULT '\0\0\0\0\0\0\0\0\0\0\0\0\0\0',
- `fa_deleted_reason` text,
- `fa_size` int(10) unsigned DEFAULT '0',
- `fa_width` int(11) DEFAULT '0',
- `fa_height` int(11) DEFAULT '0',
- `fa_metadata` mediumblob,
- `fa_bits` int(11) DEFAULT '0',
- `fa_media_type` enum('UNKNOWN','BITMAP','DRAWING','AUDIO','VIDEO','MULTIMEDIA','OFFICE','TEXT','EXECUTABLE','ARCHIVE') DEFAULT NULL,
- `fa_major_mime` enum('unknown','application','audio','image','text','video','message','model','multipart') DEFAULT 'unknown',
- `fa_minor_mime` varbinary(100) DEFAULT 'unknown',
- `fa_description` tinyblob,
- `fa_user` int(10) unsigned DEFAULT '0',
- `fa_user_text` varchar(255) CHARACTER SET latin1 COLLATE latin1_bin DEFAULT NULL,
- `fa_timestamp` binary(14) DEFAULT '\0\0\0\0\0\0\0\0\0\0\0\0\0\0',
- `fa_deleted` tinyint(3) unsigned NOT NULL DEFAULT '0',
- PRIMARY KEY (`fa_id`),
- KEY `fa_name` (`fa_name`,`fa_timestamp`),
- KEY `fa_storage_group` (`fa_storage_group`,`fa_storage_key`),
- KEY `fa_deleted_timestamp` (`fa_deleted_timestamp`),
- KEY `fa_user_timestamp` (`fa_user_text`,`fa_timestamp`)
-) ENGINE=InnoDB DEFAULT CHARSET=latin1;
-/*!40101 SET character_set_client = @saved_cs_client */;
-
---
--- Dumping data for table `mw_filearchive`
---
-
-LOCK TABLES `mw_filearchive` WRITE;
-/*!40000 ALTER TABLE `mw_filearchive` DISABLE KEYS */;
-/*!40000 ALTER TABLE `mw_filearchive` ENABLE KEYS */;
-UNLOCK TABLES;
-
---
--- Table structure for table `mw_hitcounter`
---
-
-DROP TABLE IF EXISTS `mw_hitcounter`;
-/*!40101 SET @saved_cs_client = @@character_set_client */;
-/*!40101 SET character_set_client = utf8 */;
-CREATE TABLE `mw_hitcounter` (
- `hc_id` int(10) unsigned NOT NULL
-) ENGINE=MEMORY DEFAULT CHARSET=latin1 MAX_ROWS=25000;
-/*!40101 SET character_set_client = @saved_cs_client */;
-
---
--- Dumping data for table `mw_hitcounter`
---
-
-LOCK TABLES `mw_hitcounter` WRITE;
-/*!40000 ALTER TABLE `mw_hitcounter` DISABLE KEYS */;
-/*!40000 ALTER TABLE `mw_hitcounter` ENABLE KEYS */;
-UNLOCK TABLES;
-
---
--- Table structure for table `mw_image`
---
-
-DROP TABLE IF EXISTS `mw_image`;
-/*!40101 SET @saved_cs_client = @@character_set_client */;
-/*!40101 SET character_set_client = utf8 */;
-CREATE TABLE `mw_image` (
- `img_name` varchar(255) CHARACTER SET latin1 COLLATE latin1_bin NOT NULL DEFAULT '',
- `img_size` int(10) unsigned NOT NULL DEFAULT '0',
- `img_width` int(11) NOT NULL DEFAULT '0',
- `img_height` int(11) NOT NULL DEFAULT '0',
- `img_metadata` mediumblob NOT NULL,
- `img_bits` int(11) 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` varbinary(100) NOT NULL DEFAULT 'unknown',
- `img_description` tinyblob NOT NULL,
- `img_user` int(10) unsigned NOT NULL DEFAULT '0',
- `img_user_text` varchar(255) CHARACTER SET latin1 COLLATE latin1_bin NOT NULL,
- `img_timestamp` varbinary(14) NOT NULL DEFAULT '',
- `img_sha1` varbinary(32) NOT NULL DEFAULT '',
- PRIMARY KEY (`img_name`),
- KEY `img_usertext_timestamp` (`img_user_text`,`img_timestamp`),
- KEY `img_size` (`img_size`),
- KEY `img_timestamp` (`img_timestamp`),
- KEY `img_sha1` (`img_sha1`)
-) ENGINE=InnoDB DEFAULT CHARSET=latin1;
-/*!40101 SET character_set_client = @saved_cs_client */;
-
---
--- Dumping data for table `mw_image`
---
-
-LOCK TABLES `mw_image` WRITE;
-/*!40000 ALTER TABLE `mw_image` DISABLE KEYS */;
-/*!40000 ALTER TABLE `mw_image` ENABLE KEYS */;
-UNLOCK TABLES;
-
---
--- Table structure for table `mw_imagelinks`
---
-
-DROP TABLE IF EXISTS `mw_imagelinks`;
-/*!40101 SET @saved_cs_client = @@character_set_client */;
-/*!40101 SET character_set_client = utf8 */;
-CREATE TABLE `mw_imagelinks` (
- `il_from` int(10) unsigned NOT NULL DEFAULT '0',
- `il_to` varchar(255) CHARACTER SET latin1 COLLATE latin1_bin NOT NULL DEFAULT '',
- UNIQUE KEY `il_from` (`il_from`,`il_to`),
- UNIQUE KEY `il_to` (`il_to`,`il_from`)
-) ENGINE=InnoDB DEFAULT CHARSET=latin1;
-/*!40101 SET character_set_client = @saved_cs_client */;
-
---
--- Dumping data for table `mw_imagelinks`
---
-
-LOCK TABLES `mw_imagelinks` WRITE;
-/*!40000 ALTER TABLE `mw_imagelinks` DISABLE KEYS */;
-/*!40000 ALTER TABLE `mw_imagelinks` ENABLE KEYS */;
-UNLOCK TABLES;
-
---
--- Table structure for table `mw_interwiki`
---
-
-DROP TABLE IF EXISTS `mw_interwiki`;
-/*!40101 SET @saved_cs_client = @@character_set_client */;
-/*!40101 SET character_set_client = utf8 */;
-CREATE TABLE `mw_interwiki` (
- `iw_prefix` varchar(32) NOT NULL,
- `iw_url` blob NOT NULL,
- `iw_api` blob NOT NULL,
- `iw_wikiid` varchar(64) NOT NULL,
- `iw_local` tinyint(1) NOT NULL,
- `iw_trans` tinyint(4) NOT NULL DEFAULT '0',
- UNIQUE KEY `iw_prefix` (`iw_prefix`)
-) ENGINE=InnoDB DEFAULT CHARSET=latin1;
-/*!40101 SET character_set_client = @saved_cs_client */;
-
---
--- Dumping data for table `mw_interwiki`
---
-
-LOCK TABLES `mw_interwiki` WRITE;
-/*!40000 ALTER TABLE `mw_interwiki` DISABLE KEYS */;
-INSERT INTO `mw_interwiki` VALUES ('acronym','http://www.acronymfinder.com/af-query.asp?String=exact&Acronym=$1','','',0,0),('advogato','http://www.advogato.org/$1','','',0,0),('annotationwiki','http://www.seedwiki.com/page.cfm?wikiid=368&doc=$1','','',0,0),('arxiv','http://www.arxiv.org/abs/$1','','',0,0),('c2find','http://c2.com/cgi/wiki?FindPage&value=$1','','',0,0),('cache','http://www.google.com/search?q=cache:$1','','',0,0),('commons','http://commons.wikimedia.org/wiki/$1','','',0,0),('corpknowpedia','http://corpknowpedia.org/wiki/index.php/$1','','',0,0),('dictionary','http://www.dict.org/bin/Dict?Database=*&Form=Dict1&Strategy=*&Query=$1','','',0,0),('disinfopedia','http://www.disinfopedia.org/wiki.phtml?title=$1','','',0,0),('docbook','http://wiki.docbook.org/topic/$1','','',0,0),('doi','http://dx.doi.org/$1','','',0,0),('drumcorpswiki','http://www.drumcorpswiki.com/index.php/$1','','',0,0),('dwjwiki','http://www.suberic.net/cgi-bin/dwj/wiki.cgi?$1','','',0,0),('elibre','http://enciclopedia.us.es/index.php/$1','','',0,0),('emacswiki','http://www.emacswiki.org/cgi-bin/wiki.pl?$1','','',0,0),('foldoc','http://foldoc.org/?$1','','',0,0),('foxwiki','http://fox.wikis.com/wc.dll?Wiki~$1','','',0,0),('freebsdman','http://www.FreeBSD.org/cgi/man.cgi?apropos=1&query=$1','','',0,0),('gej','http://www.esperanto.de/cgi-bin/aktivikio/wiki.pl?$1','','',0,0),('gentoo-wiki','http://gentoo-wiki.com/$1','','',0,0),('google','http://www.google.com/search?q=$1','','',0,0),('googlegroups','http://groups.google.com/groups?q=$1','','',0,0),('hammondwiki','http://www.dairiki.org/HammondWiki/$1','','',0,0),('hewikisource','http://he.wikisource.org/wiki/$1','','',1,0),('hrwiki','http://www.hrwiki.org/index.php/$1','','',0,0),('imdb','http://us.imdb.com/Title?$1','','',0,0),('jargonfile','http://sunir.org/apps/meta.pl?wiki=JargonFile&redirect=$1','','',0,0),('jspwiki','http://www.jspwiki.org/wiki/$1','','',0,0),('keiki','http://kei.ki/en/$1','','',0,0),('kmwiki','http://kmwiki.wikispaces.com/$1','','',0,0),('linuxwiki','http://linuxwiki.de/$1','','',0,0),('lojban','http://www.lojban.org/tiki/tiki-index.php?page=$1','','',0,0),('lqwiki','http://wiki.linuxquestions.org/wiki/$1','','',0,0),('lugkr','http://lug-kr.sourceforge.net/cgi-bin/lugwiki.pl?$1','','',0,0),('mathsongswiki','http://SeedWiki.com/page.cfm?wikiid=237&doc=$1','','',0,0),('meatball','http://www.usemod.com/cgi-bin/mb.pl?$1','','',0,0),('mediawikiwiki','http://www.mediawiki.org/wiki/$1','','',0,0),('mediazilla','https://bugzilla.wikimedia.org/$1','','',1,0),('memoryalpha','http://www.memory-alpha.org/en/index.php/$1','','',0,0),('metawiki','http://sunir.org/apps/meta.pl?$1','','',0,0),('metawikimedia','http://meta.wikimedia.org/wiki/$1','','',0,0),('moinmoin','http://purl.net/wiki/moin/$1','','',0,0),('mozillawiki','http://wiki.mozilla.org/index.php/$1','','',0,0),('mw','http://www.mediawiki.org/wiki/$1','','',0,0),('oeis','http://www.research.att.com/cgi-bin/access.cgi/as/njas/sequences/eisA.cgi?Anum=$1','','',0,0),('openfacts','http://openfacts.berlios.de/index.phtml?title=$1','','',0,0),('openwiki','http://openwiki.com/?$1','','',0,0),('pmeg','http://www.bertilow.com/pmeg/$1.php','','',0,0),('ppr','http://c2.com/cgi/wiki?$1','','',0,0),('pythoninfo','http://wiki.python.org/moin/$1','','',0,0),('rfc','http://www.rfc-editor.org/rfc/rfc$1.txt','','',0,0),('s23wiki','http://is-root.de/wiki/index.php/$1','','',0,0),('seattlewiki','http://seattle.wikia.com/wiki/$1','','',0,0),('seattlewireless','http://seattlewireless.net/?$1','','',0,0),('senseislibrary','http://senseis.xmp.net/?$1','','',0,0),('sourceforge','http://sourceforge.net/$1','','',0,0),('squeak','http://wiki.squeak.org/squeak/$1','','',0,0),('susning','http://www.susning.nu/$1','','',0,0),('svgwiki','http://wiki.svg.org/$1','','',0,0),('tavi','http://tavi.sourceforge.net/$1','','',0,0),('tejo','http://www.tejo.org/vikio/$1','','',0,0),('theopedia','http://www.theopedia.com/$1','','',0,0),('tmbw','http://www.tmbw.net/wiki/$1','','',0,0),('tmnet','http://www.technomanifestos.net/?$1','','',0,0),('tmwiki','http://www.EasyTopicMaps.com/?page=$1','','',0,0),('twiki','http://twiki.org/cgi-bin/view/$1','','',0,0),('uea','http://www.tejo.org/uea/$1','','',0,0),('unreal','http://wiki.beyondunreal.com/wiki/$1','','',0,0),('usemod','http://www.usemod.com/cgi-bin/wiki.pl?$1','','',0,0),('vinismo','http://vinismo.com/en/$1','','',0,0),('webseitzwiki','http://webseitz.fluxent.com/wiki/$1','','',0,0),('why','http://clublet.com/c/c/why?$1','','',0,0),('wiki','http://c2.com/cgi/wiki?$1','','',0,0),('wikia','http://www.wikia.com/wiki/$1','','',0,0),('wikibooks','http://en.wikibooks.org/wiki/$1','','',1,0),('wikicities','http://www.wikia.com/wiki/$1','','',0,0),('wikif1','http://www.wikif1.org/$1','','',0,0),('wikihow','http://www.wikihow.com/$1','','',0,0),('wikimedia','http://wikimediafoundation.org/wiki/$1','','',0,0),('wikinews','http://en.wikinews.org/wiki/$1','','',1,0),('wikinfo','http://www.wikinfo.org/index.php/$1','','',0,0),('wikipedia','http://en.wikipedia.org/wiki/$1','','',1,0),('wikiquote','http://en.wikiquote.org/wiki/$1','','',1,0),('wikisource','http://wikisource.org/wiki/$1','','',1,0),('wikispecies','http://species.wikimedia.org/wiki/$1','','',1,0),('wikitravel','http://wikitravel.org/en/$1','','',0,0),('wikiversity','http://en.wikiversity.org/wiki/$1','','',1,0),('wikt','http://en.wiktionary.org/wiki/$1','','',1,0),('wiktionary','http://en.wiktionary.org/wiki/$1','','',1,0),('wlug','http://www.wlug.org.nz/$1','','',0,0),('zwiki','http://zwiki.org/$1','','',0,0),('zzz wiki','http://wiki.zzz.ee/index.php/$1','','',0,0);
-/*!40000 ALTER TABLE `mw_interwiki` ENABLE KEYS */;
-UNLOCK TABLES;
-
---
--- Table structure for table `mw_ipblocks`
---
-
-DROP TABLE IF EXISTS `mw_ipblocks`;
-/*!40101 SET @saved_cs_client = @@character_set_client */;
-/*!40101 SET character_set_client = utf8 */;
-CREATE TABLE `mw_ipblocks` (
- `ipb_id` int(11) NOT NULL AUTO_INCREMENT,
- `ipb_address` tinyblob NOT NULL,
- `ipb_user` int(10) unsigned NOT NULL DEFAULT '0',
- `ipb_by` int(10) unsigned NOT NULL DEFAULT '0',
- `ipb_by_text` varchar(255) CHARACTER SET latin1 COLLATE latin1_bin NOT NULL DEFAULT '',
- `ipb_reason` tinyblob NOT NULL,
- `ipb_timestamp` binary(14) NOT NULL DEFAULT '\0\0\0\0\0\0\0\0\0\0\0\0\0\0',
- `ipb_auto` tinyint(1) NOT NULL DEFAULT '0',
- `ipb_anon_only` tinyint(1) NOT NULL DEFAULT '0',
- `ipb_create_account` tinyint(1) NOT NULL DEFAULT '1',
- `ipb_enable_autoblock` tinyint(1) NOT NULL DEFAULT '1',
- `ipb_expiry` varbinary(14) NOT NULL DEFAULT '',
- `ipb_range_start` tinyblob NOT NULL,
- `ipb_range_end` tinyblob NOT NULL,
- `ipb_deleted` tinyint(1) NOT NULL DEFAULT '0',
- `ipb_block_email` tinyint(1) NOT NULL DEFAULT '0',
- `ipb_allow_usertalk` tinyint(1) NOT NULL DEFAULT '0',
- PRIMARY KEY (`ipb_id`),
- UNIQUE KEY `ipb_address` (`ipb_address`(255),`ipb_user`,`ipb_auto`,`ipb_anon_only`),
- KEY `ipb_user` (`ipb_user`),
- KEY `ipb_range` (`ipb_range_start`(8),`ipb_range_end`(8)),
- KEY `ipb_timestamp` (`ipb_timestamp`),
- KEY `ipb_expiry` (`ipb_expiry`)
-) ENGINE=InnoDB DEFAULT CHARSET=latin1;
-/*!40101 SET character_set_client = @saved_cs_client */;
-
---
--- Dumping data for table `mw_ipblocks`
---
-
-LOCK TABLES `mw_ipblocks` WRITE;
-/*!40000 ALTER TABLE `mw_ipblocks` DISABLE KEYS */;
-/*!40000 ALTER TABLE `mw_ipblocks` ENABLE KEYS */;
-UNLOCK TABLES;
-
---
--- Table structure for table `mw_iwlinks`
---
-
-DROP TABLE IF EXISTS `mw_iwlinks`;
-/*!40101 SET @saved_cs_client = @@character_set_client */;
-/*!40101 SET character_set_client = utf8 */;
-CREATE TABLE `mw_iwlinks` (
- `iwl_from` int(10) unsigned NOT NULL DEFAULT '0',
- `iwl_prefix` varbinary(20) NOT NULL DEFAULT '',
- `iwl_title` varchar(255) CHARACTER SET latin1 COLLATE latin1_bin NOT NULL DEFAULT '',
- UNIQUE KEY `iwl_from` (`iwl_from`,`iwl_prefix`,`iwl_title`),
- UNIQUE KEY `iwl_prefix_title_from` (`iwl_prefix`,`iwl_title`,`iwl_from`)
-) ENGINE=InnoDB DEFAULT CHARSET=latin1;
-/*!40101 SET character_set_client = @saved_cs_client */;
-
---
--- Dumping data for table `mw_iwlinks`
---
-
-LOCK TABLES `mw_iwlinks` WRITE;
-/*!40000 ALTER TABLE `mw_iwlinks` DISABLE KEYS */;
-/*!40000 ALTER TABLE `mw_iwlinks` ENABLE KEYS */;
-UNLOCK TABLES;
-
---
--- Table structure for table `mw_job`
---
-
-DROP TABLE IF EXISTS `mw_job`;
-/*!40101 SET @saved_cs_client = @@character_set_client */;
-/*!40101 SET character_set_client = utf8 */;
-CREATE TABLE `mw_job` (
- `job_id` int(10) unsigned NOT NULL AUTO_INCREMENT,
- `job_cmd` varbinary(60) NOT NULL DEFAULT '',
- `job_namespace` int(11) NOT NULL,
- `job_title` varchar(255) CHARACTER SET latin1 COLLATE latin1_bin NOT NULL,
- `job_params` blob NOT NULL,
- PRIMARY KEY (`job_id`),
- KEY `job_cmd` (`job_cmd`,`job_namespace`,`job_title`,`job_params`(128))
-) ENGINE=InnoDB DEFAULT CHARSET=latin1;
-/*!40101 SET character_set_client = @saved_cs_client */;
-
---
--- Dumping data for table `mw_job`
---
-
-LOCK TABLES `mw_job` WRITE;
-/*!40000 ALTER TABLE `mw_job` DISABLE KEYS */;
-/*!40000 ALTER TABLE `mw_job` ENABLE KEYS */;
-UNLOCK TABLES;
-
---
--- Table structure for table `mw_l10n_cache`
---
-
-DROP TABLE IF EXISTS `mw_l10n_cache`;
-/*!40101 SET @saved_cs_client = @@character_set_client */;
-/*!40101 SET character_set_client = utf8 */;
-CREATE TABLE `mw_l10n_cache` (
- `lc_lang` varbinary(32) NOT NULL,
- `lc_key` varchar(255) NOT NULL,
- `lc_value` mediumblob NOT NULL,
- KEY `lc_lang_key` (`lc_lang`,`lc_key`)
-) ENGINE=InnoDB DEFAULT CHARSET=latin1;
-/*!40101 SET character_set_client = @saved_cs_client */;
-
---
--- Dumping data for table `mw_l10n_cache`
---
-
-LOCK TABLES `mw_l10n_cache` WRITE;
-/*!40000 ALTER TABLE `mw_l10n_cache` DISABLE KEYS */;
-/*!40000 ALTER TABLE `mw_l10n_cache` ENABLE KEYS */;
-UNLOCK TABLES;
-
---
--- Table structure for table `mw_langlinks`
---
-
-DROP TABLE IF EXISTS `mw_langlinks`;
-/*!40101 SET @saved_cs_client = @@character_set_client */;
-/*!40101 SET character_set_client = utf8 */;
-CREATE TABLE `mw_langlinks` (
- `ll_from` int(10) unsigned NOT NULL DEFAULT '0',
- `ll_lang` varbinary(20) NOT NULL DEFAULT '',
- `ll_title` varchar(255) CHARACTER SET latin1 COLLATE latin1_bin NOT NULL DEFAULT '',
- UNIQUE KEY `ll_from` (`ll_from`,`ll_lang`),
- KEY `ll_lang` (`ll_lang`,`ll_title`)
-) ENGINE=InnoDB DEFAULT CHARSET=latin1;
-/*!40101 SET character_set_client = @saved_cs_client */;
-
---
--- Dumping data for table `mw_langlinks`
---
-
-LOCK TABLES `mw_langlinks` WRITE;
-/*!40000 ALTER TABLE `mw_langlinks` DISABLE KEYS */;
-/*!40000 ALTER TABLE `mw_langlinks` ENABLE KEYS */;
-UNLOCK TABLES;
-
---
--- Table structure for table `mw_log_search`
---
-
-DROP TABLE IF EXISTS `mw_log_search`;
-/*!40101 SET @saved_cs_client = @@character_set_client */;
-/*!40101 SET character_set_client = utf8 */;
-CREATE TABLE `mw_log_search` (
- `ls_field` varbinary(32) NOT NULL,
- `ls_value` varchar(255) NOT NULL,
- `ls_log_id` int(10) unsigned NOT NULL DEFAULT '0',
- UNIQUE KEY `ls_field_val` (`ls_field`,`ls_value`,`ls_log_id`),
- KEY `ls_log_id` (`ls_log_id`)
-) ENGINE=InnoDB DEFAULT CHARSET=latin1;
-/*!40101 SET character_set_client = @saved_cs_client */;
-
---
--- Dumping data for table `mw_log_search`
---
-
-LOCK TABLES `mw_log_search` WRITE;
-/*!40000 ALTER TABLE `mw_log_search` DISABLE KEYS */;
-/*!40000 ALTER TABLE `mw_log_search` ENABLE KEYS */;
-UNLOCK TABLES;
-
---
--- Table structure for table `mw_logging`
---
-
-DROP TABLE IF EXISTS `mw_logging`;
-/*!40101 SET @saved_cs_client = @@character_set_client */;
-/*!40101 SET character_set_client = utf8 */;
-CREATE TABLE `mw_logging` (
- `log_id` int(10) unsigned NOT NULL AUTO_INCREMENT,
- `log_type` varbinary(32) NOT NULL DEFAULT '',
- `log_action` varbinary(32) NOT NULL DEFAULT '',
- `log_timestamp` binary(14) NOT NULL DEFAULT '19700101000000',
- `log_user` int(10) unsigned NOT NULL DEFAULT '0',
- `log_user_text` varchar(255) CHARACTER SET latin1 COLLATE latin1_bin NOT NULL DEFAULT '',
- `log_namespace` int(11) NOT NULL DEFAULT '0',
- `log_title` varchar(255) CHARACTER SET latin1 COLLATE latin1_bin NOT NULL DEFAULT '',
- `log_page` int(10) unsigned DEFAULT NULL,
- `log_comment` varchar(255) NOT NULL DEFAULT '',
- `log_params` blob NOT NULL,
- `log_deleted` tinyint(3) unsigned NOT NULL DEFAULT '0',
- PRIMARY KEY (`log_id`),
- KEY `type_time` (`log_type`,`log_timestamp`),
- KEY `user_time` (`log_user`,`log_timestamp`),
- KEY `page_time` (`log_namespace`,`log_title`,`log_timestamp`),
- KEY `times` (`log_timestamp`),
- KEY `log_user_type_time` (`log_user`,`log_type`,`log_timestamp`),
- KEY `log_page_id_time` (`log_page`,`log_timestamp`)
-) ENGINE=InnoDB AUTO_INCREMENT=2 DEFAULT CHARSET=latin1;
-/*!40101 SET character_set_client = @saved_cs_client */;
-
---
--- Dumping data for table `mw_logging`
---
-
-LOCK TABLES `mw_logging` WRITE;
-/*!40000 ALTER TABLE `mw_logging` DISABLE KEYS */;
-INSERT INTO `mw_logging` VALUES (1,'patrol','patrol','20110110173131',1,'WikiSysop',0,'TestResources',2,'','2\n0\n1',0);
-/*!40000 ALTER TABLE `mw_logging` ENABLE KEYS */;
-UNLOCK TABLES;
-
---
--- Table structure for table `mw_math`
---
-
-DROP TABLE IF EXISTS `mw_math`;
-/*!40101 SET @saved_cs_client = @@character_set_client */;
-/*!40101 SET character_set_client = utf8 */;
-CREATE TABLE `mw_math` (
- `math_inputhash` varbinary(16) NOT NULL,
- `math_outputhash` varbinary(16) NOT NULL,
- `math_html_conservativeness` tinyint(4) NOT NULL,
- `math_html` text,
- `math_mathml` text,
- UNIQUE KEY `math_inputhash` (`math_inputhash`)
-) ENGINE=InnoDB DEFAULT CHARSET=latin1;
-/*!40101 SET character_set_client = @saved_cs_client */;
-
---
--- Dumping data for table `mw_math`
---
-
-LOCK TABLES `mw_math` WRITE;
-/*!40000 ALTER TABLE `mw_math` DISABLE KEYS */;
-/*!40000 ALTER TABLE `mw_math` ENABLE KEYS */;
-UNLOCK TABLES;
-
---
--- Table structure for table `mw_module_deps`
---
-
-DROP TABLE IF EXISTS `mw_module_deps`;
-/*!40101 SET @saved_cs_client = @@character_set_client */;
-/*!40101 SET character_set_client = utf8 */;
-CREATE TABLE `mw_module_deps` (
- `md_module` varbinary(255) NOT NULL,
- `md_skin` varbinary(32) NOT NULL,
- `md_deps` mediumblob NOT NULL,
- UNIQUE KEY `md_module_skin` (`md_module`,`md_skin`)
-) ENGINE=InnoDB DEFAULT CHARSET=latin1;
-/*!40101 SET character_set_client = @saved_cs_client */;
-
---
--- Dumping data for table `mw_module_deps`
---
-
-LOCK TABLES `mw_module_deps` WRITE;
-/*!40000 ALTER TABLE `mw_module_deps` DISABLE KEYS */;
-INSERT INTO `mw_module_deps` VALUES ('ext.vector.collapsibleNav','vector','[\"\\/home\\/pdhanda\\/deployment\\/extensions\\/Vector\\/modules\\/.\\/images\\/portal-break.png\",\"\\/home\\/pdhanda\\/deployment\\/extensions\\/Vector\\/modules\\/.\\/images\\/open.png\",\"\\/home\\/pdhanda\\/deployment\\/extensions\\/Vector\\/modules\\/.\\/images\\/closed-ltr.png\"]'),('jquery.wikiEditor','vector','[\"\\/home\\/pdhanda\\/deployment\\/extensions\\/WikiEditor\\/modules\\/.\\/images\\/toolbar\\/loading.gif\"]'),('jquery.wikiEditor.toolbar','vector','{\"0\":\"\\/home\\/pdhanda\\/deployment\\/extensions\\/WikiEditor\\/modules\\/.\\/images\\/toolbar\\/base.png\",\"1\":\"\\/home\\/pdhanda\\/deployment\\/extensions\\/WikiEditor\\/modules\\/.\\/images\\/toolbar\\/loading.gif\",\"2\":\"\\/home\\/pdhanda\\/deployment\\/extensions\\/WikiEditor\\/modules\\/.\\/images\\/toolbar\\/button-sprite.png\",\"3\":\"\\/home\\/pdhanda\\/deployment\\/extensions\\/WikiEditor\\/modules\\/.\\/images\\/toolbar\\/arrow-right.png\",\"4\":\"\\/home\\/pdhanda\\/deployment\\/extensions\\/WikiEditor\\/modules\\/.\\/images\\/toolbar\\/arrow-left.png\",\"5\":\"\\/home\\/pdhanda\\/deployment\\/extensions\\/WikiEditor\\/modules\\/.\\/images\\/toolbar\\/arrow-down.png\",\"7\":\"\\/home\\/pdhanda\\/deployment\\/extensions\\/WikiEditor\\/modules\\/.\\/images\\/toolbar\\/loading-small.gif\"}'),('mediawiki.legacy.shared','vector','[\"\\/home\\/pdhanda\\/deployment\\/skins\\/common\\/images\\/feed-icon.png\",\"\\/home\\/pdhanda\\/deployment\\/skins\\/common\\/images\\/remove.png\",\"\\/home\\/pdhanda\\/deployment\\/skins\\/common\\/images\\/add.png\",\"\\/home\\/pdhanda\\/deployment\\/skins\\/common\\/images\\/ajax-loader.gif\",\"\\/home\\/pdhanda\\/deployment\\/skins\\/common\\/images\\/spinner.gif\",\"\\/home\\/pdhanda\\/deployment\\/skins\\/common\\/images\\/help-question.gif\",\"\\/home\\/pdhanda\\/deployment\\/skins\\/common\\/images\\/help-question-hover.gif\"]'),('skins.vector','vector','{\"0\":\"\\/home\\/pdhanda\\/deployment\\/skins\\/vector\\/images\\/page-base.png\",\"1\":\"\\/home\\/pdhanda\\/deployment\\/skins\\/vector\\/images\\/border.png\",\"2\":\"\\/home\\/pdhanda\\/deployment\\/skins\\/vector\\/images\\/page-fade.png\",\"4\":\"\\/home\\/pdhanda\\/deployment\\/skins\\/vector\\/images\\/tab-break.png\",\"5\":\"\\/home\\/pdhanda\\/deployment\\/skins\\/vector\\/images\\/tab-normal-fade.png\",\"6\":\"\\/home\\/pdhanda\\/deployment\\/skins\\/vector\\/images\\/tab-current-fade.png\",\"8\":\"\\/home\\/pdhanda\\/deployment\\/skins\\/vector\\/images\\/arrow-down-icon.png\",\"11\":\"\\/home\\/pdhanda\\/deployment\\/skins\\/vector\\/images\\/search-fade.png\",\"12\":\"\\/home\\/pdhanda\\/deployment\\/skins\\/vector\\/images\\/portal-break.png\",\"14\":\"\\/home\\/pdhanda\\/deployment\\/skins\\/vector\\/images\\/preferences-break.png\",\"16\":\"\\/home\\/pdhanda\\/deployment\\/skins\\/vector\\/images\\/preferences-fade.png\",\"17\":\"\\/home\\/pdhanda\\/deployment\\/skins\\/vector\\/images\\/preferences-base.png\",\"18\":\"\\/home\\/pdhanda\\/deployment\\/skins\\/vector\\/images\\/bullet-icon.png\",\"19\":\"\\/home\\/pdhanda\\/deployment\\/skins\\/vector\\/images\\/external-link-ltr-icon.png\",\"20\":\"\\/home\\/pdhanda\\/deployment\\/skins\\/vector\\/images\\/lock-icon.png\",\"21\":\"\\/home\\/pdhanda\\/deployment\\/skins\\/vector\\/images\\/mail-icon.png\",\"22\":\"\\/home\\/pdhanda\\/deployment\\/skins\\/vector\\/images\\/news-icon.png\",\"23\":\"\\/home\\/pdhanda\\/deployment\\/skins\\/vector\\/images\\/file-icon.png\",\"24\":\"\\/home\\/pdhanda\\/deployment\\/skins\\/vector\\/images\\/talk-icon.png\",\"25\":\"\\/home\\/pdhanda\\/deployment\\/skins\\/vector\\/images\\/audio-icon.png\",\"26\":\"\\/home\\/pdhanda\\/deployment\\/skins\\/vector\\/images\\/video-icon.png\",\"27\":\"\\/home\\/pdhanda\\/deployment\\/skins\\/vector\\/images\\/document-icon.png\",\"28\":\"\\/home\\/pdhanda\\/deployment\\/skins\\/vector\\/images\\/user-icon.png\",\"29\":\"\\/home\\/pdhanda\\/deployment\\/skins\\/vector\\/images\\/watch-icons.png\",\"30\":\"\\/home\\/pdhanda\\/deployment\\/skins\\/vector\\/images\\/watch-icon-loading.gif\"}');
-/*!40000 ALTER TABLE `mw_module_deps` ENABLE KEYS */;
-UNLOCK TABLES;
-
---
--- Table structure for table `mw_msg_resource`
---
-
-DROP TABLE IF EXISTS `mw_msg_resource`;
-/*!40101 SET @saved_cs_client = @@character_set_client */;
-/*!40101 SET character_set_client = utf8 */;
-CREATE TABLE `mw_msg_resource` (
- `mr_resource` varbinary(255) NOT NULL,
- `mr_lang` varbinary(32) NOT NULL,
- `mr_blob` mediumblob NOT NULL,
- `mr_timestamp` binary(14) NOT NULL,
- UNIQUE KEY `mr_resource_lang` (`mr_resource`,`mr_lang`)
-) ENGINE=InnoDB DEFAULT CHARSET=latin1;
-/*!40101 SET character_set_client = @saved_cs_client */;
-
---
--- Dumping data for table `mw_msg_resource`
---
-
-LOCK TABLES `mw_msg_resource` WRITE;
-/*!40000 ALTER TABLE `mw_msg_resource` DISABLE KEYS */;
-INSERT INTO `mw_msg_resource` VALUES ('ext.vector.collapsibleNav','en','{\"vector-collapsiblenav-more\":\"More languages\"}','20110108005000'),('ext.vector.collapsibleTabs','en','{}','20110108005000'),('ext.vector.simpleSearch','en','{\"vector-simplesearch-search\":\"Search\",\"vector-simplesearch-containing\":\"containing...\"}','20110108005000'),('ext.wikiEditor','en','{}','20110110172914'),('ext.wikiEditor.toolbar','en','{\"wikieditor-toolbar-loading\":\"Loading...\",\"wikieditor-toolbar-tool-bold\":\"Bold\",\"wikieditor-toolbar-tool-bold-example\":\"Bold text\",\"wikieditor-toolbar-tool-italic\":\"Italic\",\"wikieditor-toolbar-tool-italic-example\":\"Italic text\",\"wikieditor-toolbar-tool-ilink\":\"Internal link\",\"wikieditor-toolbar-tool-ilink-example\":\"Link title\",\"wikieditor-toolbar-tool-xlink\":\"External link (remember http:\\/\\/ prefix)\",\"wikieditor-toolbar-tool-xlink-example\":\"http:\\/\\/www.example.com link title\",\"wikieditor-toolbar-tool-link\":\"Link\",\"wikieditor-toolbar-tool-link-title\":\"Insert link\",\"wikieditor-toolbar-tool-link-int\":\"To a wiki page\",\"wikieditor-toolbar-tool-link-int-target\":\"Target page or URL:\",\"wikieditor-toolbar-tool-link-int-target-tooltip\":\"Page title or URL\",\"wikieditor-toolbar-tool-link-int-text\":\"Text to display:\",\"wikieditor-toolbar-tool-link-int-text-tooltip\":\"Text to be displayed\",\"wikieditor-toolbar-tool-link-ext\":\"To an external web page\",\"wikieditor-toolbar-tool-link-ext-target\":\"Link URL:\",\"wikieditor-toolbar-tool-link-ext-text\":\"Link text:\",\"wikieditor-toolbar-tool-link-insert\":\"Insert link\",\"wikieditor-toolbar-tool-link-cancel\":\"Cancel\",\"wikieditor-toolbar-tool-link-int-target-status-exists\":\"Page exists\",\"wikieditor-toolbar-tool-link-int-target-status-notexists\":\"Page does not exist\",\"wikieditor-toolbar-tool-link-int-target-status-invalid\":\"Invalid title\",\"wikieditor-toolbar-tool-link-int-target-status-external\":\"External link\",\"wikieditor-toolbar-tool-link-int-target-status-loading\":\"Checking page existence...\",\"wikieditor-toolbar-tool-link-int-invalid\":\"The title you specified is invalid.\",\"wikieditor-toolbar-tool-link-lookslikeinternal\":\"The URL you specified looks like it was intended as a link to another wiki page.\\nDo you want to make it an internal link?\",\"wikieditor-toolbar-tool-link-lookslikeinternal-int\":\"Internal link\",\"wikieditor-toolbar-tool-link-lookslikeinternal-ext\":\"External link\",\"wikieditor-toolbar-tool-link-empty\":\"You did not enter anything to link to.\",\"wikieditor-toolbar-tool-file\":\"Embedded file\",\"wikieditor-toolbar-tool-file-pre\":\"$1{{ns:file}}:\",\"wikieditor-toolbar-tool-file-example\":\"Example.jpg\",\"wikieditor-toolbar-tool-reference\":\"Reference\",\"wikieditor-toolbar-tool-reference-title\":\"Insert reference\",\"wikieditor-toolbar-tool-reference-cancel\":\"Cancel\",\"wikieditor-toolbar-tool-reference-text\":\"Reference text\",\"wikieditor-toolbar-tool-reference-insert\":\"Insert\",\"wikieditor-toolbar-tool-reference-example\":\"Insert footnote text here\",\"wikieditor-toolbar-tool-signature\":\"Signature and timestamp\",\"wikieditor-toolbar-section-advanced\":\"Advanced\",\"wikieditor-toolbar-tool-heading\":\"Heading\",\"wikieditor-toolbar-tool-heading-1\":\"Level 1\",\"wikieditor-toolbar-tool-heading-2\":\"Level 2\",\"wikieditor-toolbar-tool-heading-3\":\"Level 3\",\"wikieditor-toolbar-tool-heading-4\":\"Level 4\",\"wikieditor-toolbar-tool-heading-5\":\"Level 5\",\"wikieditor-toolbar-tool-heading-example\":\"Heading text\",\"wikieditor-toolbar-group-format\":\"Format\",\"wikieditor-toolbar-tool-ulist\":\"Bulleted list\",\"wikieditor-toolbar-tool-ulist-example\":\"Bulleted list item\",\"wikieditor-toolbar-tool-olist\":\"Numbered list\",\"wikieditor-toolbar-tool-olist-example\":\"Numbered list item\",\"wikieditor-toolbar-tool-indent\":\"Indentation\",\"wikieditor-toolbar-tool-indent-example\":\"Indented line\",\"wikieditor-toolbar-tool-nowiki\":\"No wiki formatting\",\"wikieditor-toolbar-tool-nowiki-example\":\"Insert non-formatted text here\",\"wikieditor-toolbar-tool-redirect\":\"Redirect\",\"wikieditor-toolbar-tool-redirect-example\":\"Target page name\",\"wikieditor-toolbar-tool-big\":\"Big\",\"wikieditor-toolbar-tool-big-example\":\"Big text\",\"wikieditor-toolbar-tool-small\":\"Small\",\"wikieditor-toolbar-tool-small-example\":\"Small text\",\"wikieditor-toolbar-tool-superscript\":\"Superscript\",\"wikieditor-toolbar-tool-superscript-example\":\"Superscript text\",\"wikieditor-toolbar-tool-subscript\":\"Subscript\",\"wikieditor-toolbar-tool-subscript-example\":\"Subscript text\",\"wikieditor-toolbar-group-insert\":\"Insert\",\"wikieditor-toolbar-tool-gallery\":\"Picture gallery\",\"wikieditor-toolbar-tool-gallery-example\":\"{{ns:file}}:Example.jpg|Caption1\\n{{ns:file}}:Example.jpg|Caption2\",\"wikieditor-toolbar-tool-newline\":\"New line\",\"wikieditor-toolbar-tool-table\":\"Table\",\"wikieditor-toolbar-tool-table-example-old\":\"-\\n! header 1\\n! header 2\\n! header 3\\n|-\\n| row 1, cell 1\\n| row 1, cell 2\\n| row 1, cell 3\\n|-\\n| row 2, cell 1\\n| row 2, cell 2\\n| row 2, cell 3\",\"wikieditor-toolbar-tool-table-example-cell-text\":\"Cell text\",\"wikieditor-toolbar-tool-table-example\":\"Example\",\"wikieditor-toolbar-tool-table-example-header\":\"Header text\",\"wikieditor-toolbar-tool-table-title\":\"Insert table\",\"wikieditor-toolbar-tool-table-dimensions-rows\":\"Rows\",\"wikieditor-toolbar-tool-table-dimensions-columns\":\"Columns\",\"wikieditor-toolbar-tool-table-dimensions-header\":\"Add header row\",\"wikieditor-toolbar-tool-table-wikitable\":\"Style with borders\",\"wikieditor-toolbar-tool-table-sortable\":\"Make table sortable\",\"wikieditor-toolbar-tool-table-insert\":\"Insert\",\"wikieditor-toolbar-tool-table-cancel\":\"Cancel\",\"wikieditor-toolbar-tool-table-example-text\":\"Lorem ipsum dolor sit amet, consectetur adipiscing elit. Ut nec purus diam. Sed aliquam imperdiet nunc quis lacinia. Donec rutrum consectetur placerat. Sed volutpat neque non purus faucibus id ultricies enim euismod.\",\"wikieditor-toolbar-tool-table-toomany\":\"Inserting a table with more than $1 cells is not possible with this dialog.\",\"wikieditor-toolbar-tool-table-invalidnumber\":\"You have not entered a valid number of rows or columns.\",\"wikieditor-toolbar-tool-table-zero\":\"You cannot insert a table with zero rows or columns.\",\"wikieditor-toolbar-tool-replace\":\"Search and replace\",\"wikieditor-toolbar-tool-replace-title\":\"Search and replace\",\"wikieditor-toolbar-tool-replace-search\":\"Search for:\",\"wikieditor-toolbar-tool-replace-replace\":\"Replace with:\",\"wikieditor-toolbar-tool-replace-case\":\"Match case\",\"wikieditor-toolbar-tool-replace-regex\":\"Treat search string as a regular expression\",\"wikieditor-toolbar-tool-replace-button-findnext\":\"Find next\",\"wikieditor-toolbar-tool-replace-button-replacenext\":\"Replace next\",\"wikieditor-toolbar-tool-replace-button-replaceall\":\"Replace all\",\"wikieditor-toolbar-tool-replace-close\":\"Close\",\"wikieditor-toolbar-tool-replace-nomatch\":\"Your search did not match anything.\",\"wikieditor-toolbar-tool-replace-success\":\"$1 replacement(s) made.\",\"wikieditor-toolbar-tool-replace-emptysearch\":\"You did not enter anything to search for.\",\"wikieditor-toolbar-tool-replace-invalidregex\":\"The regular expression you entered is invalid: $1\",\"wikieditor-toolbar-section-characters\":\"Special characters\",\"wikieditor-toolbar-characters-page-latin\":\"Latin\",\"wikieditor-toolbar-characters-page-latinextended\":\"Latin extended\",\"wikieditor-toolbar-characters-page-ipa\":\"IPA\",\"wikieditor-toolbar-characters-page-symbols\":\"Symbols\",\"wikieditor-toolbar-characters-page-greek\":\"Greek\",\"wikieditor-toolbar-characters-page-cyrillic\":\"Cyrillic\",\"wikieditor-toolbar-characters-page-arabic\":\"Arabic\",\"wikieditor-toolbar-characters-page-persian\":\"Persian\",\"wikieditor-toolbar-characters-page-hebrew\":\"Hebrew\",\"wikieditor-toolbar-characters-page-bangla\":\"Bangla\",\"wikieditor-toolbar-characters-page-telugu\":\"Telugu\",\"wikieditor-toolbar-characters-page-sinhala\":\"Sinhala\",\"wikieditor-toolbar-characters-page-gujarati\":\"Gujarati\",\"wikieditor-toolbar-characters-page-thai\":\"Thai\",\"wikieditor-toolbar-characters-page-lao\":\"Lao\",\"wikieditor-toolbar-characters-page-khmer\":\"Khmer\",\"wikieditor-toolbar-section-help\":\"Help\",\"wikieditor-toolbar-help-heading-description\":\"Description\",\"wikieditor-toolbar-help-heading-syntax\":\"What you type\",\"wikieditor-toolbar-help-heading-result\":\"What you get\",\"wikieditor-toolbar-help-page-format\":\"Formatting\",\"wikieditor-toolbar-help-page-link\":\"Links\",\"wikieditor-toolbar-help-page-heading\":\"Headings\",\"wikieditor-toolbar-help-page-list\":\"Lists\",\"wikieditor-toolbar-help-page-file\":\"Files\",\"wikieditor-toolbar-help-page-reference\":\"References\",\"wikieditor-toolbar-help-page-discussion\":\"Discussion\",\"wikieditor-toolbar-help-content-bold-description\":\"Bold\",\"wikieditor-toolbar-help-content-bold-syntax\":\"\'\'\'Bold text\'\'\'\",\"wikieditor-toolbar-help-content-bold-result\":\"<strong>Bold text<\\/strong>\",\"wikieditor-toolbar-help-content-italic-description\":\"Italic\",\"wikieditor-toolbar-help-content-italic-syntax\":\"\'\'Italic text\'\'\",\"wikieditor-toolbar-help-content-italic-result\":\"<em>Italic text<\\/em>\",\"wikieditor-toolbar-help-content-bolditalic-description\":\"Bold &amp; italic\",\"wikieditor-toolbar-help-content-bolditalic-syntax\":\"\'\'\'\'\'Bold &amp; italic text\'\'\'\'\'\",\"wikieditor-toolbar-help-content-bolditalic-result\":\"<strong><em>Bold &amp; italic text<\\/em><\\/strong>\",\"wikieditor-toolbar-help-content-ilink-description\":\"Internal link\",\"wikieditor-toolbar-help-content-ilink-syntax\":\"[[Page title|Link label]]<br \\/>[[Page title]]\",\"wikieditor-toolbar-help-content-ilink-result\":\"<a href=\'#\'>Link label<\\/a><br \\/><a href=\'#\'>Page title<\\/a>\",\"wikieditor-toolbar-help-content-xlink-description\":\"External link\",\"wikieditor-toolbar-help-content-xlink-syntax\":\"[http:\\/\\/www.example.org Link label]<br \\/>[http:\\/\\/www.example.org]<br \\/>http:\\/\\/www.example.org\",\"wikieditor-toolbar-help-content-xlink-result\":\"<a href=\'#\' class=\'external\'>Link label<\\/a><br \\/><a href=\'#\' class=\'external autonumber\'>[1]<\\/a><br \\/><a href=\'#\' class=\'external\'>http:\\/\\/www.example.org<\\/a>\",\"wikieditor-toolbar-help-content-heading1-description\":\"&lt;wikieditor-toolbar-help-content-heading1-description&gt;\",\"wikieditor-toolbar-help-content-heading1-syntax\":\"&lt;wikieditor-toolbar-help-content-heading1-syntax&gt;\",\"wikieditor-toolbar-help-content-heading1-result\":\"&lt;wikieditor-toolbar-help-content-heading1-result&gt;\",\"wikieditor-toolbar-help-content-heading2-description\":\"2nd level heading\",\"wikieditor-toolbar-help-content-heading2-syntax\":\"== Heading text ==\",\"wikieditor-toolbar-help-content-heading2-result\":\"<h2>Heading text<\\/h2>\",\"wikieditor-toolbar-help-content-heading3-description\":\"3rd level heading\",\"wikieditor-toolbar-help-content-heading3-syntax\":\"=== Heading text ===\",\"wikieditor-toolbar-help-content-heading3-result\":\"<h3>Heading text<\\/h3>\",\"wikieditor-toolbar-help-content-heading4-description\":\"4th level heading\",\"wikieditor-toolbar-help-content-heading4-syntax\":\"==== Heading text ====\",\"wikieditor-toolbar-help-content-heading4-result\":\"<h4>Heading text<\\/h4>\",\"wikieditor-toolbar-help-content-heading5-description\":\"5th level heading\",\"wikieditor-toolbar-help-content-heading5-syntax\":\"===== Heading text =====\",\"wikieditor-toolbar-help-content-heading5-result\":\"<h5>Heading text<\\/h5>\",\"wikieditor-toolbar-help-content-ulist-description\":\"Bulleted list\",\"wikieditor-toolbar-help-content-ulist-syntax\":\"* List item<br \\/>* List item\",\"wikieditor-toolbar-help-content-ulist-result\":\"<ul><li>List item<\\/li><li>List item<\\/li><\\/ul>\",\"wikieditor-toolbar-help-content-olist-description\":\"Numbered list\",\"wikieditor-toolbar-help-content-olist-syntax\":\"# List item<br \\/># List item\",\"wikieditor-toolbar-help-content-olist-result\":\"<ol><li>List item<\\/li><li>List item<\\/li><\\/ol>\",\"wikieditor-toolbar-help-content-file-description\":\"Embedded file\",\"wikieditor-toolbar-help-content-file-syntax\":\"[[{{ns:file}}:Example.png|thumb|Caption text]]\",\"wikieditor-toolbar-help-content-file-result\":\"<div style=\'width:104px;\' class=\'thumbinner\'><a title=\'Caption text\' class=\'image\' href=\'#\'><img height=\'50\' width=\'100\' border=\'0\' class=\'thumbimage\' src=\'extensions\\/UsabilityInitiative\\/images\\/wikiEditor\\/toolbar\\/example-image.png\' alt=\'\'\\/><\\/a><div class=\'thumbcaption\'><div class=\'magnify\'><a title=\'Enlarge\' class=\'internal\' href=\'#\'><img height=\'11\' width=\'15\' alt=\'\' src=\'$1\\/common\\/images\\/magnify-clip.png\'\\/><\\/a><\\/div>Caption text<\\/div><\\/div>\",\"wikieditor-toolbar-help-content-reference-description\":\"Reference\",\"wikieditor-toolbar-help-content-reference-syntax\":\"Page text.&lt;ref name=\\\"test\\\"&gt;[http:\\/\\/www.example.org Link text], additional text.&lt;\\/ref&gt;\",\"wikieditor-toolbar-help-content-reference-result\":\"Page text.<sup><a href=\'#\'>[1]<\\/a><\\/sup>\",\"wikieditor-toolbar-help-content-rereference-description\":\"Additional use of same reference\",\"wikieditor-toolbar-help-content-rereference-syntax\":\"&lt;ref name=\\\"test\\\" \\/&gt;\",\"wikieditor-toolbar-help-content-rereference-result\":\"Page text.<sup><a href=\'#\'>[1]<\\/a><\\/sup>\",\"wikieditor-toolbar-help-content-showreferences-description\":\"Display references\",\"wikieditor-toolbar-help-content-showreferences-syntax\":\"&lt;references \\/&gt;\",\"wikieditor-toolbar-help-content-showreferences-result\":\"<ol class=\'references\'><li id=\'cite_note-test-0\'><b><a title=\'\' href=\'#\'>^<\\/a><\\/b> <a rel=\'nofollow\' title=\'http:\\/\\/www.example.org\' class=\'external text\' href=\'#\'>Link text<\\/a>, additional text.<\\/li><\\/ol>\",\"wikieditor-toolbar-help-content-signaturetimestamp-description\":\"Signature with timestamp\",\"wikieditor-toolbar-help-content-signaturetimestamp-syntax\":\"~~~~\",\"wikieditor-toolbar-help-content-signaturetimestamp-result\":\"<a href=\'#\' title=\'{{#special:mypage}}\'>Username<\\/a> (<a href=\'#\' title=\'{{#special:mytalk}}\'>talk<\\/a>) 15:54, 10 June 2009 (UTC)\",\"wikieditor-toolbar-help-content-signature-description\":\"Signature\",\"wikieditor-toolbar-help-content-signature-syntax\":\"~~~\",\"wikieditor-toolbar-help-content-signature-result\":\"<a href=\'#\' title=\'{{#special:mypage}}\'>Username<\\/a> (<a href=\'#\' title=\'{{#special:mytalk}}\'>talk<\\/a>)\",\"wikieditor-toolbar-help-content-indent-description\":\"Indent\",\"wikieditor-toolbar-help-content-indent-syntax\":\"Normal text<br \\/>:Indented text<br \\/>::Indented text\",\"wikieditor-toolbar-help-content-indent-result\":\"Normal text<dl><dd>Indented text<dl><dd>Indented text<\\/dd><\\/dl><\\/dd><\\/dl>\"}','20110110172914'),('jquery.async','en','{}','20110110172915'),('jquery.autoEllipsis','en','{}','20110110172915'),('jquery.checkboxShiftClick','en','{}','20110110172915'),('jquery.client','en','{}','20110110172915'),('jquery.cookie','en','{}','20110110172915'),('jquery.delayedBind','en','{}','20110110172915'),('jquery.highlightText','en','{}','20110110172915'),('jquery.makeCollapsible','en','{\"collapsible-expand\":\"Expand\",\"collapsible-collapse\":\"Collapse\"}','20110110172915'),('jquery.placeholder','en','{}','20110110172915'),('jquery.suggestions','en','{}','20110110172915'),('jquery.tabIndex','en','{}','20110110172915'),('jquery.textSelection','en','{}','20110110172915'),('jquery.wikiEditor','en','{\"wikieditor-wikitext-tab\":\"Wikitext\",\"wikieditor-loading\":\"Loading\"}','20110110172914'),('jquery.wikiEditor.toolbar','en','{}','20110110172914'),('mediawiki.action.watch.ajax','en','{}','20110110172915'),('mediawiki.language','en','{}','20110110172915'),('mediawiki.legacy.ajax','en','{\"watch\":\"Watch\",\"unwatch\":\"Unwatch\",\"watching\":\"Watching...\",\"unwatching\":\"Unwatching...\",\"tooltip-ca-watch\":\"Add this page to your watchlist\",\"tooltip-ca-unwatch\":\"Remove this page from your watchlist\"}','20110110172915'),('mediawiki.legacy.edit','en','{}','20110110172915'),('mediawiki.legacy.wikibits','en','{\"showtoc\":\"show\",\"hidetoc\":\"hide\"}','20110110172915'),('mediawiki.util','en','{}','20110110172915');
-/*!40000 ALTER TABLE `mw_msg_resource` ENABLE KEYS */;
-UNLOCK TABLES;
-
---
--- Table structure for table `mw_msg_resource_links`
---
-
-DROP TABLE IF EXISTS `mw_msg_resource_links`;
-/*!40101 SET @saved_cs_client = @@character_set_client */;
-/*!40101 SET character_set_client = utf8 */;
-CREATE TABLE `mw_msg_resource_links` (
- `mrl_resource` varbinary(255) NOT NULL,
- `mrl_message` varbinary(255) NOT NULL,
- UNIQUE KEY `mrl_message_resource` (`mrl_message`,`mrl_resource`)
-) ENGINE=InnoDB DEFAULT CHARSET=latin1;
-/*!40101 SET character_set_client = @saved_cs_client */;
-
---
--- Dumping data for table `mw_msg_resource_links`
---
-
-LOCK TABLES `mw_msg_resource_links` WRITE;
-/*!40000 ALTER TABLE `mw_msg_resource_links` DISABLE KEYS */;
-INSERT INTO `mw_msg_resource_links` VALUES ('jquery.makeCollapsible','collapsible-collapse'),('jquery.makeCollapsible','collapsible-expand'),('mediawiki.legacy.wikibits','hidetoc'),('mediawiki.legacy.wikibits','showtoc'),('mediawiki.legacy.ajax','tooltip-ca-unwatch'),('mediawiki.legacy.ajax','tooltip-ca-watch'),('mediawiki.legacy.ajax','unwatch'),('mediawiki.legacy.ajax','unwatching'),('ext.vector.collapsibleNav','vector-collapsiblenav-more'),('ext.vector.simpleSearch','vector-simplesearch-containing'),('ext.vector.simpleSearch','vector-simplesearch-search'),('mediawiki.legacy.ajax','watch'),('mediawiki.legacy.ajax','watching'),('jquery.wikiEditor','wikieditor-loading'),('ext.wikiEditor.toolbar','wikieditor-toolbar-characters-page-arabic'),('ext.wikiEditor.toolbar','wikieditor-toolbar-characters-page-bangla'),('ext.wikiEditor.toolbar','wikieditor-toolbar-characters-page-cyrillic'),('ext.wikiEditor.toolbar','wikieditor-toolbar-characters-page-greek'),('ext.wikiEditor.toolbar','wikieditor-toolbar-characters-page-gujarati'),('ext.wikiEditor.toolbar','wikieditor-toolbar-characters-page-hebrew'),('ext.wikiEditor.toolbar','wikieditor-toolbar-characters-page-ipa'),('ext.wikiEditor.toolbar','wikieditor-toolbar-characters-page-khmer'),('ext.wikiEditor.toolbar','wikieditor-toolbar-characters-page-lao'),('ext.wikiEditor.toolbar','wikieditor-toolbar-characters-page-latin'),('ext.wikiEditor.toolbar','wikieditor-toolbar-characters-page-latinextended'),('ext.wikiEditor.toolbar','wikieditor-toolbar-characters-page-persian'),('ext.wikiEditor.toolbar','wikieditor-toolbar-characters-page-sinhala'),('ext.wikiEditor.toolbar','wikieditor-toolbar-characters-page-symbols'),('ext.wikiEditor.toolbar','wikieditor-toolbar-characters-page-telugu'),('ext.wikiEditor.toolbar','wikieditor-toolbar-characters-page-thai'),('ext.wikiEditor.toolbar','wikieditor-toolbar-group-format'),('ext.wikiEditor.toolbar','wikieditor-toolbar-group-insert'),('ext.wikiEditor.toolbar','wikieditor-toolbar-help-content-bold-description'),('ext.wikiEditor.toolbar','wikieditor-toolbar-help-content-bold-result'),('ext.wikiEditor.toolbar','wikieditor-toolbar-help-content-bold-syntax'),('ext.wikiEditor.toolbar','wikieditor-toolbar-help-content-bolditalic-description'),('ext.wikiEditor.toolbar','wikieditor-toolbar-help-content-bolditalic-result'),('ext.wikiEditor.toolbar','wikieditor-toolbar-help-content-bolditalic-syntax'),('ext.wikiEditor.toolbar','wikieditor-toolbar-help-content-file-description'),('ext.wikiEditor.toolbar','wikieditor-toolbar-help-content-file-result'),('ext.wikiEditor.toolbar','wikieditor-toolbar-help-content-file-syntax'),('ext.wikiEditor.toolbar','wikieditor-toolbar-help-content-heading1-description'),('ext.wikiEditor.toolbar','wikieditor-toolbar-help-content-heading1-result'),('ext.wikiEditor.toolbar','wikieditor-toolbar-help-content-heading1-syntax'),('ext.wikiEditor.toolbar','wikieditor-toolbar-help-content-heading2-description'),('ext.wikiEditor.toolbar','wikieditor-toolbar-help-content-heading2-result'),('ext.wikiEditor.toolbar','wikieditor-toolbar-help-content-heading2-syntax'),('ext.wikiEditor.toolbar','wikieditor-toolbar-help-content-heading3-description'),('ext.wikiEditor.toolbar','wikieditor-toolbar-help-content-heading3-result'),('ext.wikiEditor.toolbar','wikieditor-toolbar-help-content-heading3-syntax'),('ext.wikiEditor.toolbar','wikieditor-toolbar-help-content-heading4-description'),('ext.wikiEditor.toolbar','wikieditor-toolbar-help-content-heading4-result'),('ext.wikiEditor.toolbar','wikieditor-toolbar-help-content-heading4-syntax'),('ext.wikiEditor.toolbar','wikieditor-toolbar-help-content-heading5-description'),('ext.wikiEditor.toolbar','wikieditor-toolbar-help-content-heading5-result'),('ext.wikiEditor.toolbar','wikieditor-toolbar-help-content-heading5-syntax'),('ext.wikiEditor.toolbar','wikieditor-toolbar-help-content-ilink-description'),('ext.wikiEditor.toolbar','wikieditor-toolbar-help-content-ilink-result'),('ext.wikiEditor.toolbar','wikieditor-toolbar-help-content-ilink-syntax'),('ext.wikiEditor.toolbar','wikieditor-toolbar-help-content-indent-description'),('ext.wikiEditor.toolbar','wikieditor-toolbar-help-content-indent-result'),('ext.wikiEditor.toolbar','wikieditor-toolbar-help-content-indent-syntax'),('ext.wikiEditor.toolbar','wikieditor-toolbar-help-content-italic-description'),('ext.wikiEditor.toolbar','wikieditor-toolbar-help-content-italic-result'),('ext.wikiEditor.toolbar','wikieditor-toolbar-help-content-italic-syntax'),('ext.wikiEditor.toolbar','wikieditor-toolbar-help-content-olist-description'),('ext.wikiEditor.toolbar','wikieditor-toolbar-help-content-olist-result'),('ext.wikiEditor.toolbar','wikieditor-toolbar-help-content-olist-syntax'),('ext.wikiEditor.toolbar','wikieditor-toolbar-help-content-reference-description'),('ext.wikiEditor.toolbar','wikieditor-toolbar-help-content-reference-result'),('ext.wikiEditor.toolbar','wikieditor-toolbar-help-content-reference-syntax'),('ext.wikiEditor.toolbar','wikieditor-toolbar-help-content-rereference-description'),('ext.wikiEditor.toolbar','wikieditor-toolbar-help-content-rereference-result'),('ext.wikiEditor.toolbar','wikieditor-toolbar-help-content-rereference-syntax'),('ext.wikiEditor.toolbar','wikieditor-toolbar-help-content-showreferences-description'),('ext.wikiEditor.toolbar','wikieditor-toolbar-help-content-showreferences-result'),('ext.wikiEditor.toolbar','wikieditor-toolbar-help-content-showreferences-syntax'),('ext.wikiEditor.toolbar','wikieditor-toolbar-help-content-signature-description'),('ext.wikiEditor.toolbar','wikieditor-toolbar-help-content-signature-result'),('ext.wikiEditor.toolbar','wikieditor-toolbar-help-content-signature-syntax'),('ext.wikiEditor.toolbar','wikieditor-toolbar-help-content-signaturetimestamp-description'),('ext.wikiEditor.toolbar','wikieditor-toolbar-help-content-signaturetimestamp-result'),('ext.wikiEditor.toolbar','wikieditor-toolbar-help-content-signaturetimestamp-syntax'),('ext.wikiEditor.toolbar','wikieditor-toolbar-help-content-ulist-description'),('ext.wikiEditor.toolbar','wikieditor-toolbar-help-content-ulist-result'),('ext.wikiEditor.toolbar','wikieditor-toolbar-help-content-ulist-syntax'),('ext.wikiEditor.toolbar','wikieditor-toolbar-help-content-xlink-description'),('ext.wikiEditor.toolbar','wikieditor-toolbar-help-content-xlink-result'),('ext.wikiEditor.toolbar','wikieditor-toolbar-help-content-xlink-syntax'),('ext.wikiEditor.toolbar','wikieditor-toolbar-help-heading-description'),('ext.wikiEditor.toolbar','wikieditor-toolbar-help-heading-result'),('ext.wikiEditor.toolbar','wikieditor-toolbar-help-heading-syntax'),('ext.wikiEditor.toolbar','wikieditor-toolbar-help-page-discussion'),('ext.wikiEditor.toolbar','wikieditor-toolbar-help-page-file'),('ext.wikiEditor.toolbar','wikieditor-toolbar-help-page-format'),('ext.wikiEditor.toolbar','wikieditor-toolbar-help-page-heading'),('ext.wikiEditor.toolbar','wikieditor-toolbar-help-page-link'),('ext.wikiEditor.toolbar','wikieditor-toolbar-help-page-list'),('ext.wikiEditor.toolbar','wikieditor-toolbar-help-page-reference'),('ext.wikiEditor.toolbar','wikieditor-toolbar-loading'),('ext.wikiEditor.toolbar','wikieditor-toolbar-section-advanced'),('ext.wikiEditor.toolbar','wikieditor-toolbar-section-characters'),('ext.wikiEditor.toolbar','wikieditor-toolbar-section-help'),('ext.wikiEditor.toolbar','wikieditor-toolbar-tool-big'),('ext.wikiEditor.toolbar','wikieditor-toolbar-tool-big-example'),('ext.wikiEditor.toolbar','wikieditor-toolbar-tool-bold'),('ext.wikiEditor.toolbar','wikieditor-toolbar-tool-bold-example'),('ext.wikiEditor.toolbar','wikieditor-toolbar-tool-file'),('ext.wikiEditor.toolbar','wikieditor-toolbar-tool-file-example'),('ext.wikiEditor.toolbar','wikieditor-toolbar-tool-file-pre'),('ext.wikiEditor.toolbar','wikieditor-toolbar-tool-gallery'),('ext.wikiEditor.toolbar','wikieditor-toolbar-tool-gallery-example'),('ext.wikiEditor.toolbar','wikieditor-toolbar-tool-heading'),('ext.wikiEditor.toolbar','wikieditor-toolbar-tool-heading-1'),('ext.wikiEditor.toolbar','wikieditor-toolbar-tool-heading-2'),('ext.wikiEditor.toolbar','wikieditor-toolbar-tool-heading-3'),('ext.wikiEditor.toolbar','wikieditor-toolbar-tool-heading-4'),('ext.wikiEditor.toolbar','wikieditor-toolbar-tool-heading-5'),('ext.wikiEditor.toolbar','wikieditor-toolbar-tool-heading-example'),('ext.wikiEditor.toolbar','wikieditor-toolbar-tool-ilink'),('ext.wikiEditor.toolbar','wikieditor-toolbar-tool-ilink-example'),('ext.wikiEditor.toolbar','wikieditor-toolbar-tool-indent'),('ext.wikiEditor.toolbar','wikieditor-toolbar-tool-indent-example'),('ext.wikiEditor.toolbar','wikieditor-toolbar-tool-italic'),('ext.wikiEditor.toolbar','wikieditor-toolbar-tool-italic-example'),('ext.wikiEditor.toolbar','wikieditor-toolbar-tool-link'),('ext.wikiEditor.toolbar','wikieditor-toolbar-tool-link-cancel'),('ext.wikiEditor.toolbar','wikieditor-toolbar-tool-link-empty'),('ext.wikiEditor.toolbar','wikieditor-toolbar-tool-link-ext'),('ext.wikiEditor.toolbar','wikieditor-toolbar-tool-link-ext-target'),('ext.wikiEditor.toolbar','wikieditor-toolbar-tool-link-ext-text'),('ext.wikiEditor.toolbar','wikieditor-toolbar-tool-link-insert'),('ext.wikiEditor.toolbar','wikieditor-toolbar-tool-link-int'),('ext.wikiEditor.toolbar','wikieditor-toolbar-tool-link-int-invalid'),('ext.wikiEditor.toolbar','wikieditor-toolbar-tool-link-int-target'),('ext.wikiEditor.toolbar','wikieditor-toolbar-tool-link-int-target-status-exists'),('ext.wikiEditor.toolbar','wikieditor-toolbar-tool-link-int-target-status-external'),('ext.wikiEditor.toolbar','wikieditor-toolbar-tool-link-int-target-status-invalid'),('ext.wikiEditor.toolbar','wikieditor-toolbar-tool-link-int-target-status-loading'),('ext.wikiEditor.toolbar','wikieditor-toolbar-tool-link-int-target-status-notexists'),('ext.wikiEditor.toolbar','wikieditor-toolbar-tool-link-int-target-tooltip'),('ext.wikiEditor.toolbar','wikieditor-toolbar-tool-link-int-text'),('ext.wikiEditor.toolbar','wikieditor-toolbar-tool-link-int-text-tooltip'),('ext.wikiEditor.toolbar','wikieditor-toolbar-tool-link-lookslikeinternal'),('ext.wikiEditor.toolbar','wikieditor-toolbar-tool-link-lookslikeinternal-ext'),('ext.wikiEditor.toolbar','wikieditor-toolbar-tool-link-lookslikeinternal-int'),('ext.wikiEditor.toolbar','wikieditor-toolbar-tool-link-title'),('ext.wikiEditor.toolbar','wikieditor-toolbar-tool-newline'),('ext.wikiEditor.toolbar','wikieditor-toolbar-tool-nowiki'),('ext.wikiEditor.toolbar','wikieditor-toolbar-tool-nowiki-example'),('ext.wikiEditor.toolbar','wikieditor-toolbar-tool-olist'),('ext.wikiEditor.toolbar','wikieditor-toolbar-tool-olist-example'),('ext.wikiEditor.toolbar','wikieditor-toolbar-tool-redirect'),('ext.wikiEditor.toolbar','wikieditor-toolbar-tool-redirect-example'),('ext.wikiEditor.toolbar','wikieditor-toolbar-tool-reference'),('ext.wikiEditor.toolbar','wikieditor-toolbar-tool-reference-cancel'),('ext.wikiEditor.toolbar','wikieditor-toolbar-tool-reference-example'),('ext.wikiEditor.toolbar','wikieditor-toolbar-tool-reference-insert'),('ext.wikiEditor.toolbar','wikieditor-toolbar-tool-reference-text'),('ext.wikiEditor.toolbar','wikieditor-toolbar-tool-reference-title'),('ext.wikiEditor.toolbar','wikieditor-toolbar-tool-replace'),('ext.wikiEditor.toolbar','wikieditor-toolbar-tool-replace-button-findnext'),('ext.wikiEditor.toolbar','wikieditor-toolbar-tool-replace-button-replaceall'),('ext.wikiEditor.toolbar','wikieditor-toolbar-tool-replace-button-replacenext'),('ext.wikiEditor.toolbar','wikieditor-toolbar-tool-replace-case'),('ext.wikiEditor.toolbar','wikieditor-toolbar-tool-replace-close'),('ext.wikiEditor.toolbar','wikieditor-toolbar-tool-replace-emptysearch'),('ext.wikiEditor.toolbar','wikieditor-toolbar-tool-replace-invalidregex'),('ext.wikiEditor.toolbar','wikieditor-toolbar-tool-replace-nomatch'),('ext.wikiEditor.toolbar','wikieditor-toolbar-tool-replace-regex'),('ext.wikiEditor.toolbar','wikieditor-toolbar-tool-replace-replace'),('ext.wikiEditor.toolbar','wikieditor-toolbar-tool-replace-search'),('ext.wikiEditor.toolbar','wikieditor-toolbar-tool-replace-success'),('ext.wikiEditor.toolbar','wikieditor-toolbar-tool-replace-title'),('ext.wikiEditor.toolbar','wikieditor-toolbar-tool-signature'),('ext.wikiEditor.toolbar','wikieditor-toolbar-tool-small'),('ext.wikiEditor.toolbar','wikieditor-toolbar-tool-small-example'),('ext.wikiEditor.toolbar','wikieditor-toolbar-tool-subscript'),('ext.wikiEditor.toolbar','wikieditor-toolbar-tool-subscript-example'),('ext.wikiEditor.toolbar','wikieditor-toolbar-tool-superscript'),('ext.wikiEditor.toolbar','wikieditor-toolbar-tool-superscript-example'),('ext.wikiEditor.toolbar','wikieditor-toolbar-tool-table'),('ext.wikiEditor.toolbar','wikieditor-toolbar-tool-table-cancel'),('ext.wikiEditor.toolbar','wikieditor-toolbar-tool-table-dimensions-columns'),('ext.wikiEditor.toolbar','wikieditor-toolbar-tool-table-dimensions-header'),('ext.wikiEditor.toolbar','wikieditor-toolbar-tool-table-dimensions-rows'),('ext.wikiEditor.toolbar','wikieditor-toolbar-tool-table-example'),('ext.wikiEditor.toolbar','wikieditor-toolbar-tool-table-example-cell-text'),('ext.wikiEditor.toolbar','wikieditor-toolbar-tool-table-example-header'),('ext.wikiEditor.toolbar','wikieditor-toolbar-tool-table-example-old'),('ext.wikiEditor.toolbar','wikieditor-toolbar-tool-table-example-text'),('ext.wikiEditor.toolbar','wikieditor-toolbar-tool-table-insert'),('ext.wikiEditor.toolbar','wikieditor-toolbar-tool-table-invalidnumber'),('ext.wikiEditor.toolbar','wikieditor-toolbar-tool-table-sortable'),('ext.wikiEditor.toolbar','wikieditor-toolbar-tool-table-title'),('ext.wikiEditor.toolbar','wikieditor-toolbar-tool-table-toomany'),('ext.wikiEditor.toolbar','wikieditor-toolbar-tool-table-wikitable'),('ext.wikiEditor.toolbar','wikieditor-toolbar-tool-table-zero'),('ext.wikiEditor.toolbar','wikieditor-toolbar-tool-ulist'),('ext.wikiEditor.toolbar','wikieditor-toolbar-tool-ulist-example'),('ext.wikiEditor.toolbar','wikieditor-toolbar-tool-xlink'),('ext.wikiEditor.toolbar','wikieditor-toolbar-tool-xlink-example'),('jquery.wikiEditor','wikieditor-wikitext-tab');
-/*!40000 ALTER TABLE `mw_msg_resource_links` ENABLE KEYS */;
-UNLOCK TABLES;
-
---
--- Table structure for table `mw_objectcache`
---
-
-DROP TABLE IF EXISTS `mw_objectcache`;
-/*!40101 SET @saved_cs_client = @@character_set_client */;
-/*!40101 SET character_set_client = utf8 */;
-CREATE TABLE `mw_objectcache` (
- `keyname` varbinary(255) NOT NULL DEFAULT '',
- `value` mediumblob,
- `exptime` datetime DEFAULT NULL,
- PRIMARY KEY (`keyname`),
- KEY `exptime` (`exptime`)
-) ENGINE=InnoDB DEFAULT CHARSET=latin1;
-/*!40101 SET character_set_client = @saved_cs_client */;
-
---
--- Dumping data for table `mw_objectcache`
---
-
-LOCK TABLES `mw_objectcache` WRITE;
-/*!40000 ALTER TABLE `mw_objectcache` DISABLE KEYS */;
-/*!40000 ALTER TABLE `mw_objectcache` ENABLE KEYS */;
-UNLOCK TABLES;
-
---
--- Table structure for table `mw_oldimage`
---
-
-DROP TABLE IF EXISTS `mw_oldimage`;
-/*!40101 SET @saved_cs_client = @@character_set_client */;
-/*!40101 SET character_set_client = utf8 */;
-CREATE TABLE `mw_oldimage` (
- `oi_name` varchar(255) CHARACTER SET latin1 COLLATE latin1_bin NOT NULL DEFAULT '',
- `oi_archive_name` varchar(255) CHARACTER SET latin1 COLLATE latin1_bin NOT NULL DEFAULT '',
- `oi_size` int(10) unsigned NOT NULL DEFAULT '0',
- `oi_width` int(11) NOT NULL DEFAULT '0',
- `oi_height` int(11) NOT NULL DEFAULT '0',
- `oi_bits` int(11) NOT NULL DEFAULT '0',
- `oi_description` tinyblob NOT NULL,
- `oi_user` int(10) unsigned NOT NULL DEFAULT '0',
- `oi_user_text` varchar(255) CHARACTER SET latin1 COLLATE latin1_bin NOT NULL,
- `oi_timestamp` binary(14) NOT NULL DEFAULT '\0\0\0\0\0\0\0\0\0\0\0\0\0\0',
- `oi_metadata` mediumblob NOT NULL,
- `oi_media_type` enum('UNKNOWN','BITMAP','DRAWING','AUDIO','VIDEO','MULTIMEDIA','OFFICE','TEXT','EXECUTABLE','ARCHIVE') DEFAULT NULL,
- `oi_major_mime` enum('unknown','application','audio','image','text','video','message','model','multipart') NOT NULL DEFAULT 'unknown',
- `oi_minor_mime` varbinary(100) NOT NULL DEFAULT 'unknown',
- `oi_deleted` tinyint(3) unsigned NOT NULL DEFAULT '0',
- `oi_sha1` varbinary(32) NOT NULL DEFAULT '',
- KEY `oi_usertext_timestamp` (`oi_user_text`,`oi_timestamp`),
- KEY `oi_name_timestamp` (`oi_name`,`oi_timestamp`),
- KEY `oi_name_archive_name` (`oi_name`,`oi_archive_name`(14)),
- KEY `oi_sha1` (`oi_sha1`)
-) ENGINE=InnoDB DEFAULT CHARSET=latin1;
-/*!40101 SET character_set_client = @saved_cs_client */;
-
---
--- Dumping data for table `mw_oldimage`
---
-
-LOCK TABLES `mw_oldimage` WRITE;
-/*!40000 ALTER TABLE `mw_oldimage` DISABLE KEYS */;
-/*!40000 ALTER TABLE `mw_oldimage` ENABLE KEYS */;
-UNLOCK TABLES;
-
---
--- Table structure for table `mw_page`
---
-
-DROP TABLE IF EXISTS `mw_page`;
-/*!40101 SET @saved_cs_client = @@character_set_client */;
-/*!40101 SET character_set_client = utf8 */;
-CREATE TABLE `mw_page` (
- `page_id` int(10) unsigned NOT NULL AUTO_INCREMENT,
- `page_namespace` int(11) NOT NULL,
- `page_title` varchar(255) CHARACTER SET latin1 COLLATE latin1_bin NOT NULL,
- `page_restrictions` tinyblob NOT NULL,
- `page_counter` bigint(20) unsigned NOT NULL DEFAULT '0',
- `page_is_redirect` tinyint(3) unsigned NOT NULL DEFAULT '0',
- `page_is_new` tinyint(3) unsigned NOT NULL DEFAULT '0',
- `page_random` double unsigned NOT NULL,
- `page_touched` binary(14) NOT NULL DEFAULT '\0\0\0\0\0\0\0\0\0\0\0\0\0\0',
- `page_latest` int(10) unsigned NOT NULL,
- `page_len` int(10) unsigned NOT NULL,
- PRIMARY KEY (`page_id`),
- UNIQUE KEY `name_title` (`page_namespace`,`page_title`),
- KEY `page_random` (`page_random`),
- KEY `page_len` (`page_len`)
-) ENGINE=InnoDB AUTO_INCREMENT=3 DEFAULT CHARSET=latin1;
-/*!40101 SET character_set_client = @saved_cs_client */;
-
---
--- Dumping data for table `mw_page`
---
-
-LOCK TABLES `mw_page` WRITE;
-/*!40000 ALTER TABLE `mw_page` DISABLE KEYS */;
-INSERT INTO `mw_page` VALUES (1,0,'Main_Page','',3,0,1,0.045389076294,'20110107184113',1,438),(2,0,'TestResources','',0,0,1,0.227355086893,'20110110173217',2,57);
-/*!40000 ALTER TABLE `mw_page` ENABLE KEYS */;
-UNLOCK TABLES;
-
---
--- Table structure for table `mw_page_props`
---
-
-DROP TABLE IF EXISTS `mw_page_props`;
-/*!40101 SET @saved_cs_client = @@character_set_client */;
-/*!40101 SET character_set_client = utf8 */;
-CREATE TABLE `mw_page_props` (
- `pp_page` int(11) NOT NULL,
- `pp_propname` varbinary(60) NOT NULL,
- `pp_value` blob NOT NULL,
- UNIQUE KEY `pp_page_propname` (`pp_page`,`pp_propname`)
-) ENGINE=InnoDB DEFAULT CHARSET=latin1;
-/*!40101 SET character_set_client = @saved_cs_client */;
-
---
--- Dumping data for table `mw_page_props`
---
-
-LOCK TABLES `mw_page_props` WRITE;
-/*!40000 ALTER TABLE `mw_page_props` DISABLE KEYS */;
-/*!40000 ALTER TABLE `mw_page_props` ENABLE KEYS */;
-UNLOCK TABLES;
-
---
--- Table structure for table `mw_page_restrictions`
---
-
-DROP TABLE IF EXISTS `mw_page_restrictions`;
-/*!40101 SET @saved_cs_client = @@character_set_client */;
-/*!40101 SET character_set_client = utf8 */;
-CREATE TABLE `mw_page_restrictions` (
- `pr_page` int(11) NOT NULL,
- `pr_type` varbinary(60) NOT NULL,
- `pr_level` varbinary(60) NOT NULL,
- `pr_cascade` tinyint(4) NOT NULL,
- `pr_user` int(11) DEFAULT NULL,
- `pr_expiry` varbinary(14) DEFAULT NULL,
- `pr_id` int(10) unsigned NOT NULL AUTO_INCREMENT,
- PRIMARY KEY (`pr_id`),
- UNIQUE KEY `pr_pagetype` (`pr_page`,`pr_type`),
- KEY `pr_typelevel` (`pr_type`,`pr_level`),
- KEY `pr_level` (`pr_level`),
- KEY `pr_cascade` (`pr_cascade`)
-) ENGINE=InnoDB DEFAULT CHARSET=latin1;
-/*!40101 SET character_set_client = @saved_cs_client */;
-
---
--- Dumping data for table `mw_page_restrictions`
---
-
-LOCK TABLES `mw_page_restrictions` WRITE;
-/*!40000 ALTER TABLE `mw_page_restrictions` DISABLE KEYS */;
-/*!40000 ALTER TABLE `mw_page_restrictions` ENABLE KEYS */;
-UNLOCK TABLES;
-
---
--- Table structure for table `mw_pagelinks`
---
-
-DROP TABLE IF EXISTS `mw_pagelinks`;
-/*!40101 SET @saved_cs_client = @@character_set_client */;
-/*!40101 SET character_set_client = utf8 */;
-CREATE TABLE `mw_pagelinks` (
- `pl_from` int(10) unsigned NOT NULL DEFAULT '0',
- `pl_namespace` int(11) NOT NULL DEFAULT '0',
- `pl_title` varchar(255) CHARACTER SET latin1 COLLATE latin1_bin NOT NULL DEFAULT '',
- UNIQUE KEY `pl_from` (`pl_from`,`pl_namespace`,`pl_title`),
- UNIQUE KEY `pl_namespace` (`pl_namespace`,`pl_title`,`pl_from`)
-) ENGINE=InnoDB DEFAULT CHARSET=latin1;
-/*!40101 SET character_set_client = @saved_cs_client */;
-
---
--- Dumping data for table `mw_pagelinks`
---
-
-LOCK TABLES `mw_pagelinks` WRITE;
-/*!40000 ALTER TABLE `mw_pagelinks` DISABLE KEYS */;
-/*!40000 ALTER TABLE `mw_pagelinks` ENABLE KEYS */;
-UNLOCK TABLES;
-
---
--- Table structure for table `mw_protected_titles`
---
-
-DROP TABLE IF EXISTS `mw_protected_titles`;
-/*!40101 SET @saved_cs_client = @@character_set_client */;
-/*!40101 SET character_set_client = utf8 */;
-CREATE TABLE `mw_protected_titles` (
- `pt_namespace` int(11) NOT NULL,
- `pt_title` varchar(255) CHARACTER SET latin1 COLLATE latin1_bin NOT NULL,
- `pt_user` int(10) unsigned NOT NULL,
- `pt_reason` tinyblob,
- `pt_timestamp` binary(14) NOT NULL,
- `pt_expiry` varbinary(14) NOT NULL DEFAULT '',
- `pt_create_perm` varbinary(60) NOT NULL,
- UNIQUE KEY `pt_namespace_title` (`pt_namespace`,`pt_title`),
- KEY `pt_timestamp` (`pt_timestamp`)
-) ENGINE=InnoDB DEFAULT CHARSET=latin1;
-/*!40101 SET character_set_client = @saved_cs_client */;
-
---
--- Dumping data for table `mw_protected_titles`
---
-
-LOCK TABLES `mw_protected_titles` WRITE;
-/*!40000 ALTER TABLE `mw_protected_titles` DISABLE KEYS */;
-/*!40000 ALTER TABLE `mw_protected_titles` ENABLE KEYS */;
-UNLOCK TABLES;
-
---
--- Table structure for table `mw_querycache`
---
-
-DROP TABLE IF EXISTS `mw_querycache`;
-/*!40101 SET @saved_cs_client = @@character_set_client */;
-/*!40101 SET character_set_client = utf8 */;
-CREATE TABLE `mw_querycache` (
- `qc_type` varbinary(32) NOT NULL,
- `qc_value` int(10) unsigned NOT NULL DEFAULT '0',
- `qc_namespace` int(11) NOT NULL DEFAULT '0',
- `qc_title` varchar(255) CHARACTER SET latin1 COLLATE latin1_bin NOT NULL DEFAULT '',
- KEY `qc_type` (`qc_type`,`qc_value`)
-) ENGINE=InnoDB DEFAULT CHARSET=latin1;
-/*!40101 SET character_set_client = @saved_cs_client */;
-
---
--- Dumping data for table `mw_querycache`
---
-
-LOCK TABLES `mw_querycache` WRITE;
-/*!40000 ALTER TABLE `mw_querycache` DISABLE KEYS */;
-/*!40000 ALTER TABLE `mw_querycache` ENABLE KEYS */;
-UNLOCK TABLES;
-
---
--- Table structure for table `mw_querycache_info`
---
-
-DROP TABLE IF EXISTS `mw_querycache_info`;
-/*!40101 SET @saved_cs_client = @@character_set_client */;
-/*!40101 SET character_set_client = utf8 */;
-CREATE TABLE `mw_querycache_info` (
- `qci_type` varbinary(32) NOT NULL DEFAULT '',
- `qci_timestamp` binary(14) NOT NULL DEFAULT '19700101000000',
- UNIQUE KEY `qci_type` (`qci_type`)
-) ENGINE=InnoDB DEFAULT CHARSET=latin1;
-/*!40101 SET character_set_client = @saved_cs_client */;
-
---
--- Dumping data for table `mw_querycache_info`
---
-
-LOCK TABLES `mw_querycache_info` WRITE;
-/*!40000 ALTER TABLE `mw_querycache_info` DISABLE KEYS */;
-/*!40000 ALTER TABLE `mw_querycache_info` ENABLE KEYS */;
-UNLOCK TABLES;
-
---
--- Table structure for table `mw_querycachetwo`
---
-
-DROP TABLE IF EXISTS `mw_querycachetwo`;
-/*!40101 SET @saved_cs_client = @@character_set_client */;
-/*!40101 SET character_set_client = utf8 */;
-CREATE TABLE `mw_querycachetwo` (
- `qcc_type` varbinary(32) NOT NULL,
- `qcc_value` int(10) unsigned NOT NULL DEFAULT '0',
- `qcc_namespace` int(11) NOT NULL DEFAULT '0',
- `qcc_title` varchar(255) CHARACTER SET latin1 COLLATE latin1_bin NOT NULL DEFAULT '',
- `qcc_namespacetwo` int(11) NOT NULL DEFAULT '0',
- `qcc_titletwo` varchar(255) CHARACTER SET latin1 COLLATE latin1_bin NOT NULL DEFAULT '',
- KEY `qcc_type` (`qcc_type`,`qcc_value`),
- KEY `qcc_title` (`qcc_type`,`qcc_namespace`,`qcc_title`),
- KEY `qcc_titletwo` (`qcc_type`,`qcc_namespacetwo`,`qcc_titletwo`)
-) ENGINE=InnoDB DEFAULT CHARSET=latin1;
-/*!40101 SET character_set_client = @saved_cs_client */;
-
---
--- Dumping data for table `mw_querycachetwo`
---
-
-LOCK TABLES `mw_querycachetwo` WRITE;
-/*!40000 ALTER TABLE `mw_querycachetwo` DISABLE KEYS */;
-/*!40000 ALTER TABLE `mw_querycachetwo` ENABLE KEYS */;
-UNLOCK TABLES;
-
---
--- Table structure for table `mw_recentchanges`
---
-
-DROP TABLE IF EXISTS `mw_recentchanges`;
-/*!40101 SET @saved_cs_client = @@character_set_client */;
-/*!40101 SET character_set_client = utf8 */;
-CREATE TABLE `mw_recentchanges` (
- `rc_id` int(11) NOT NULL AUTO_INCREMENT,
- `rc_timestamp` varbinary(14) NOT NULL DEFAULT '',
- `rc_cur_time` varbinary(14) NOT NULL DEFAULT '',
- `rc_user` int(10) unsigned NOT NULL DEFAULT '0',
- `rc_user_text` varchar(255) CHARACTER SET latin1 COLLATE latin1_bin NOT NULL,
- `rc_namespace` int(11) NOT NULL DEFAULT '0',
- `rc_title` varchar(255) CHARACTER SET latin1 COLLATE latin1_bin NOT NULL DEFAULT '',
- `rc_comment` varchar(255) CHARACTER SET latin1 COLLATE latin1_bin 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) CHARACTER SET latin1 COLLATE latin1_bin NOT NULL DEFAULT '',
- `rc_patrolled` tinyint(3) unsigned NOT NULL DEFAULT '0',
- `rc_ip` varbinary(40) NOT NULL DEFAULT '',
- `rc_old_len` int(11) DEFAULT NULL,
- `rc_new_len` int(11) DEFAULT NULL,
- `rc_deleted` tinyint(3) unsigned NOT NULL DEFAULT '0',
- `rc_logid` int(10) unsigned NOT NULL DEFAULT '0',
- `rc_log_type` varbinary(255) DEFAULT NULL,
- `rc_log_action` varbinary(255) DEFAULT NULL,
- `rc_params` blob,
- PRIMARY KEY (`rc_id`),
- KEY `rc_timestamp` (`rc_timestamp`),
- KEY `rc_namespace_title` (`rc_namespace`,`rc_title`),
- KEY `rc_cur_id` (`rc_cur_id`),
- KEY `new_name_timestamp` (`rc_new`,`rc_namespace`,`rc_timestamp`),
- KEY `rc_ip` (`rc_ip`),
- KEY `rc_ns_usertext` (`rc_namespace`,`rc_user_text`),
- KEY `rc_user_text` (`rc_user_text`,`rc_timestamp`)
-) ENGINE=InnoDB AUTO_INCREMENT=3 DEFAULT CHARSET=latin1;
-/*!40101 SET character_set_client = @saved_cs_client */;
-
---
--- Dumping data for table `mw_recentchanges`
---
-
-LOCK TABLES `mw_recentchanges` WRITE;
-/*!40000 ALTER TABLE `mw_recentchanges` DISABLE KEYS */;
-INSERT INTO `mw_recentchanges` VALUES (1,'20110107184113','20110107184113',0,'MediaWiki Default',0,'Main_Page','',0,0,1,1,1,0,1,0,'',0,'::1',0,438,0,0,NULL,'',''),(2,'20110110173131','20110110173131',1,'WikiSysop',0,'TestResources','Created page with \"Test the the SimpleSelenium database was loaded correctly\"',0,0,1,2,2,0,1,0,'',1,'::1',0,57,0,0,NULL,'','');
-/*!40000 ALTER TABLE `mw_recentchanges` ENABLE KEYS */;
-UNLOCK TABLES;
-
---
--- Table structure for table `mw_redirect`
---
-
-DROP TABLE IF EXISTS `mw_redirect`;
-/*!40101 SET @saved_cs_client = @@character_set_client */;
-/*!40101 SET character_set_client = utf8 */;
-CREATE TABLE `mw_redirect` (
- `rd_from` int(10) unsigned NOT NULL DEFAULT '0',
- `rd_namespace` int(11) NOT NULL DEFAULT '0',
- `rd_title` varchar(255) CHARACTER SET latin1 COLLATE latin1_bin NOT NULL DEFAULT '',
- `rd_interwiki` varchar(32) DEFAULT NULL,
- `rd_fragment` varchar(255) CHARACTER SET latin1 COLLATE latin1_bin DEFAULT NULL,
- PRIMARY KEY (`rd_from`),
- KEY `rd_ns_title` (`rd_namespace`,`rd_title`,`rd_from`)
-) ENGINE=InnoDB DEFAULT CHARSET=latin1;
-/*!40101 SET character_set_client = @saved_cs_client */;
-
---
--- Dumping data for table `mw_redirect`
---
-
-LOCK TABLES `mw_redirect` WRITE;
-/*!40000 ALTER TABLE `mw_redirect` DISABLE KEYS */;
-/*!40000 ALTER TABLE `mw_redirect` ENABLE KEYS */;
-UNLOCK TABLES;
-
---
--- Table structure for table `mw_revision`
---
-
-DROP TABLE IF EXISTS `mw_revision`;
-/*!40101 SET @saved_cs_client = @@character_set_client */;
-/*!40101 SET character_set_client = utf8 */;
-CREATE TABLE `mw_revision` (
- `rev_id` int(10) unsigned NOT NULL AUTO_INCREMENT,
- `rev_page` int(10) unsigned NOT NULL,
- `rev_text_id` int(10) unsigned NOT NULL,
- `rev_comment` tinyblob NOT NULL,
- `rev_user` int(10) unsigned NOT NULL DEFAULT '0',
- `rev_user_text` varchar(255) CHARACTER SET latin1 COLLATE latin1_bin NOT NULL DEFAULT '',
- `rev_timestamp` binary(14) NOT NULL DEFAULT '\0\0\0\0\0\0\0\0\0\0\0\0\0\0',
- `rev_minor_edit` tinyint(3) unsigned NOT NULL DEFAULT '0',
- `rev_deleted` tinyint(3) unsigned NOT NULL DEFAULT '0',
- `rev_len` int(10) unsigned DEFAULT NULL,
- `rev_parent_id` int(10) unsigned DEFAULT NULL,
- PRIMARY KEY (`rev_id`),
- UNIQUE KEY `rev_page_id` (`rev_page`,`rev_id`),
- KEY `rev_timestamp` (`rev_timestamp`),
- KEY `page_timestamp` (`rev_page`,`rev_timestamp`),
- KEY `user_timestamp` (`rev_user`,`rev_timestamp`),
- KEY `usertext_timestamp` (`rev_user_text`,`rev_timestamp`)
-) ENGINE=InnoDB AUTO_INCREMENT=3 DEFAULT CHARSET=latin1 MAX_ROWS=10000000 AVG_ROW_LENGTH=1024;
-/*!40101 SET character_set_client = @saved_cs_client */;
-
---
--- Dumping data for table `mw_revision`
---
-
-LOCK TABLES `mw_revision` WRITE;
-/*!40000 ALTER TABLE `mw_revision` DISABLE KEYS */;
-INSERT INTO `mw_revision` VALUES (1,1,1,'',0,'MediaWiki Default','20110107184113',0,0,438,0),(2,2,2,'Created page with \"Test the the SimpleSelenium database was loaded correctly\"',1,'WikiSysop','20110110173131',0,0,57,0);
-/*!40000 ALTER TABLE `mw_revision` ENABLE KEYS */;
-UNLOCK TABLES;
-
---
--- Table structure for table `mw_searchindex`
---
-
-DROP TABLE IF EXISTS `mw_searchindex`;
-/*!40101 SET @saved_cs_client = @@character_set_client */;
-/*!40101 SET character_set_client = utf8 */;
-CREATE TABLE `mw_searchindex` (
- `si_page` int(10) unsigned NOT NULL,
- `si_title` varchar(255) NOT NULL DEFAULT '',
- `si_text` mediumtext NOT NULL,
- UNIQUE KEY `si_page` (`si_page`),
- FULLTEXT KEY `si_title` (`si_title`),
- FULLTEXT KEY `si_text` (`si_text`)
-) ENGINE=MyISAM DEFAULT CHARSET=latin1;
-/*!40101 SET character_set_client = @saved_cs_client */;
-
---
--- Dumping data for table `mw_searchindex`
---
-
-LOCK TABLES `mw_searchindex` WRITE;
-/*!40000 ALTER TABLE `mw_searchindex` DISABLE KEYS */;
-INSERT INTO `mw_searchindex` VALUES (1,'main page',' mediawiki hasu800 been successfully installed. consult theu800 user user\'su800 guide foru800 information onu800 using theu800 wiki software. getting started getting started getting started configuration settings list mediawiki faqu800 mediawiki release mailing list '),(2,'testresources',' test theu800 theu800 simpleselenium database wasu800 loaded correctly ');
-/*!40000 ALTER TABLE `mw_searchindex` ENABLE KEYS */;
-UNLOCK TABLES;
-
---
--- Table structure for table `mw_site_stats`
---
-
-DROP TABLE IF EXISTS `mw_site_stats`;
-/*!40101 SET @saved_cs_client = @@character_set_client */;
-/*!40101 SET character_set_client = utf8 */;
-CREATE TABLE `mw_site_stats` (
- `ss_row_id` int(10) unsigned NOT NULL,
- `ss_total_views` bigint(20) unsigned DEFAULT '0',
- `ss_total_edits` bigint(20) unsigned DEFAULT '0',
- `ss_good_articles` bigint(20) unsigned DEFAULT '0',
- `ss_total_pages` bigint(20) DEFAULT '-1',
- `ss_users` bigint(20) DEFAULT '-1',
- `ss_active_users` bigint(20) DEFAULT '-1',
- `ss_admins` int(11) DEFAULT '-1',
- `ss_images` int(11) DEFAULT '0',
- UNIQUE KEY `ss_row_id` (`ss_row_id`)
-) ENGINE=InnoDB DEFAULT CHARSET=latin1;
-/*!40101 SET character_set_client = @saved_cs_client */;
-
---
--- Dumping data for table `mw_site_stats`
---
-
-LOCK TABLES `mw_site_stats` WRITE;
-/*!40000 ALTER TABLE `mw_site_stats` DISABLE KEYS */;
-INSERT INTO `mw_site_stats` VALUES (1,3,2,1,2,1,-1,-1,0);
-/*!40000 ALTER TABLE `mw_site_stats` ENABLE KEYS */;
-UNLOCK TABLES;
-
---
--- Table structure for table `mw_tag_summary`
---
-
-DROP TABLE IF EXISTS `mw_tag_summary`;
-/*!40101 SET @saved_cs_client = @@character_set_client */;
-/*!40101 SET character_set_client = utf8 */;
-CREATE TABLE `mw_tag_summary` (
- `ts_rc_id` int(11) DEFAULT NULL,
- `ts_log_id` int(11) DEFAULT NULL,
- `ts_rev_id` int(11) DEFAULT NULL,
- `ts_tags` blob NOT NULL,
- UNIQUE KEY `tag_summary_rc_id` (`ts_rc_id`),
- UNIQUE KEY `tag_summary_log_id` (`ts_log_id`),
- UNIQUE KEY `tag_summary_rev_id` (`ts_rev_id`)
-) ENGINE=InnoDB DEFAULT CHARSET=latin1;
-/*!40101 SET character_set_client = @saved_cs_client */;
-
---
--- Dumping data for table `mw_tag_summary`
---
-
-LOCK TABLES `mw_tag_summary` WRITE;
-/*!40000 ALTER TABLE `mw_tag_summary` DISABLE KEYS */;
-/*!40000 ALTER TABLE `mw_tag_summary` ENABLE KEYS */;
-UNLOCK TABLES;
-
---
--- Table structure for table `mw_templatelinks`
---
-
-DROP TABLE IF EXISTS `mw_templatelinks`;
-/*!40101 SET @saved_cs_client = @@character_set_client */;
-/*!40101 SET character_set_client = utf8 */;
-CREATE TABLE `mw_templatelinks` (
- `tl_from` int(10) unsigned NOT NULL DEFAULT '0',
- `tl_namespace` int(11) NOT NULL DEFAULT '0',
- `tl_title` varchar(255) CHARACTER SET latin1 COLLATE latin1_bin NOT NULL DEFAULT '',
- UNIQUE KEY `tl_from` (`tl_from`,`tl_namespace`,`tl_title`),
- UNIQUE KEY `tl_namespace` (`tl_namespace`,`tl_title`,`tl_from`)
-) ENGINE=InnoDB DEFAULT CHARSET=latin1;
-/*!40101 SET character_set_client = @saved_cs_client */;
-
---
--- Dumping data for table `mw_templatelinks`
---
-
-LOCK TABLES `mw_templatelinks` WRITE;
-/*!40000 ALTER TABLE `mw_templatelinks` DISABLE KEYS */;
-/*!40000 ALTER TABLE `mw_templatelinks` ENABLE KEYS */;
-UNLOCK TABLES;
-
---
--- Table structure for table `mw_text`
---
-
-DROP TABLE IF EXISTS `mw_text`;
-/*!40101 SET @saved_cs_client = @@character_set_client */;
-/*!40101 SET character_set_client = utf8 */;
-CREATE TABLE `mw_text` (
- `old_id` int(10) unsigned NOT NULL AUTO_INCREMENT,
- `old_text` mediumblob NOT NULL,
- `old_flags` tinyblob NOT NULL,
- PRIMARY KEY (`old_id`)
-) ENGINE=InnoDB AUTO_INCREMENT=3 DEFAULT CHARSET=latin1 MAX_ROWS=10000000 AVG_ROW_LENGTH=10240;
-/*!40101 SET character_set_client = @saved_cs_client */;
-
---
--- Dumping data for table `mw_text`
---
-
-LOCK TABLES `mw_text` WRITE;
-/*!40000 ALTER TABLE `mw_text` DISABLE KEYS */;
-INSERT INTO `mw_text` VALUES (1,'\'\'\'MediaWiki has been successfully installed.\'\'\'\n\nConsult the [http://meta.wikimedia.org/wiki/Help:Contents User\'s Guide] for information on using the wiki software.\n\n== Getting started ==\n* [http://www.mediawiki.org/wiki/Manual:Configuration_settings Configuration settings list]\n* [http://www.mediawiki.org/wiki/Manual:FAQ MediaWiki FAQ]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce MediaWiki release mailing list]','utf-8'),(2,'Test the the SimpleSelenium database was loaded correctly','utf-8');
-/*!40000 ALTER TABLE `mw_text` ENABLE KEYS */;
-UNLOCK TABLES;
-
---
--- Table structure for table `mw_trackbacks`
---
-
-DROP TABLE IF EXISTS `mw_trackbacks`;
-/*!40101 SET @saved_cs_client = @@character_set_client */;
-/*!40101 SET character_set_client = utf8 */;
-CREATE TABLE `mw_trackbacks` (
- `tb_id` int(11) NOT NULL AUTO_INCREMENT,
- `tb_page` int(11) DEFAULT NULL,
- `tb_title` varchar(255) NOT NULL,
- `tb_url` blob NOT NULL,
- `tb_ex` text,
- `tb_name` varchar(255) DEFAULT NULL,
- PRIMARY KEY (`tb_id`),
- KEY `tb_page` (`tb_page`)
-) ENGINE=InnoDB DEFAULT CHARSET=latin1;
-/*!40101 SET character_set_client = @saved_cs_client */;
-
---
--- Dumping data for table `mw_trackbacks`
---
-
-LOCK TABLES `mw_trackbacks` WRITE;
-/*!40000 ALTER TABLE `mw_trackbacks` DISABLE KEYS */;
-/*!40000 ALTER TABLE `mw_trackbacks` ENABLE KEYS */;
-UNLOCK TABLES;
-
---
--- Table structure for table `mw_transcache`
---
-
-DROP TABLE IF EXISTS `mw_transcache`;
-/*!40101 SET @saved_cs_client = @@character_set_client */;
-/*!40101 SET character_set_client = utf8 */;
-CREATE TABLE `mw_transcache` (
- `tc_url` varbinary(255) NOT NULL,
- `tc_contents` text,
- `tc_time` binary(14) DEFAULT NULL,
- UNIQUE KEY `tc_url_idx` (`tc_url`)
-) ENGINE=InnoDB DEFAULT CHARSET=latin1;
-/*!40101 SET character_set_client = @saved_cs_client */;
-
---
--- Dumping data for table `mw_transcache`
---
-
-LOCK TABLES `mw_transcache` WRITE;
-/*!40000 ALTER TABLE `mw_transcache` DISABLE KEYS */;
-/*!40000 ALTER TABLE `mw_transcache` ENABLE KEYS */;
-UNLOCK TABLES;
-
---
--- Table structure for table `mw_updatelog`
---
-
-DROP TABLE IF EXISTS `mw_updatelog`;
-/*!40101 SET @saved_cs_client = @@character_set_client */;
-/*!40101 SET character_set_client = utf8 */;
-CREATE TABLE `mw_updatelog` (
- `ul_key` varchar(255) NOT NULL,
- `ul_value` blob,
- PRIMARY KEY (`ul_key`)
-) ENGINE=InnoDB DEFAULT CHARSET=latin1;
-/*!40101 SET character_set_client = @saved_cs_client */;
-
---
--- Dumping data for table `mw_updatelog`
---
-
-LOCK TABLES `mw_updatelog` WRITE;
-/*!40000 ALTER TABLE `mw_updatelog` DISABLE KEYS */;
-INSERT INTO `mw_updatelog` VALUES ('cl_fields_update',NULL),('convert transcache field',NULL),('mime_minor_length',NULL),('populate category',NULL),('populate rev_len',NULL),('populate rev_parent_id',NULL),('updatelist-1.18alpha-1294425799','a:128:{i:0;a:4:{i:0;s:8:\"addField\";i:1;s:8:\"ipblocks\";i:2;s:6:\"ipb_id\";i:3;s:18:\"patch-ipblocks.sql\";}i:1;a:4:{i:0;s:8:\"addField\";i:1;s:8:\"ipblocks\";i:2;s:10:\"ipb_expiry\";i:3;s:20:\"patch-ipb_expiry.sql\";}i:2;a:1:{i:0;s:17:\"doInterwikiUpdate\";}i:3;a:1:{i:0;s:13:\"doIndexUpdate\";}i:4;a:3:{i:0;s:8:\"addTable\";i:1;s:10:\"hitcounter\";i:2;s:20:\"patch-hitcounter.sql\";}i:5;a:4:{i:0;s:8:\"addField\";i:1;s:13:\"recentchanges\";i:2;s:7:\"rc_type\";i:3;s:17:\"patch-rc_type.sql\";}i:6;a:4:{i:0;s:8:\"addField\";i:1;s:4:\"user\";i:2;s:14:\"user_real_name\";i:3;s:23:\"patch-user-realname.sql\";}i:7;a:3:{i:0;s:8:\"addTable\";i:1;s:10:\"querycache\";i:2;s:20:\"patch-querycache.sql\";}i:8;a:3:{i:0;s:8:\"addTable\";i:1;s:11:\"objectcache\";i:2;s:21:\"patch-objectcache.sql\";}i:9;a:3:{i:0;s:8:\"addTable\";i:1;s:13:\"categorylinks\";i:2;s:23:\"patch-categorylinks.sql\";}i:10;a:1:{i:0;s:16:\"doOldLinksUpdate\";}i:11;a:1:{i:0;s:22:\"doFixAncientImagelinks\";}i:12;a:4:{i:0;s:8:\"addField\";i:1;s:13:\"recentchanges\";i:2;s:5:\"rc_ip\";i:3;s:15:\"patch-rc_ip.sql\";}i:13;a:4:{i:0;s:8:\"addIndex\";i:1;s:5:\"image\";i:2;s:7:\"PRIMARY\";i:3;s:28:\"patch-image_name_primary.sql\";}i:14;a:4:{i:0;s:8:\"addField\";i:1;s:13:\"recentchanges\";i:2;s:5:\"rc_id\";i:3;s:15:\"patch-rc_id.sql\";}i:15;a:4:{i:0;s:8:\"addField\";i:1;s:13:\"recentchanges\";i:2;s:12:\"rc_patrolled\";i:3;s:19:\"patch-rc-patrol.sql\";}i:16;a:3:{i:0;s:8:\"addTable\";i:1;s:7:\"logging\";i:2;s:17:\"patch-logging.sql\";}i:17;a:4:{i:0;s:8:\"addField\";i:1;s:4:\"user\";i:2;s:10:\"user_token\";i:3;s:20:\"patch-user_token.sql\";}i:18;a:4:{i:0;s:8:\"addField\";i:1;s:9:\"watchlist\";i:2;s:24:\"wl_notificationtimestamp\";i:3;s:28:\"patch-email-notification.sql\";}i:19;a:1:{i:0;s:17:\"doWatchlistUpdate\";}i:20;a:4:{i:0;s:9:\"dropField\";i:1;s:4:\"user\";i:2;s:33:\"user_emailauthenticationtimestamp\";i:3;s:30:\"patch-email-authentication.sql\";}i:21;a:1:{i:0;s:21:\"doSchemaRestructuring\";}i:22;a:4:{i:0;s:8:\"addField\";i:1;s:7:\"logging\";i:2;s:10:\"log_params\";i:3;s:20:\"patch-log_params.sql\";}i:23;a:4:{i:0;s:8:\"checkBin\";i:1;s:7:\"logging\";i:2;s:9:\"log_title\";i:3;s:23:\"patch-logging-title.sql\";}i:24;a:4:{i:0;s:8:\"addField\";i:1;s:7:\"archive\";i:2;s:9:\"ar_rev_id\";i:3;s:24:\"patch-archive-rev_id.sql\";}i:25;a:4:{i:0;s:8:\"addField\";i:1;s:4:\"page\";i:2;s:8:\"page_len\";i:3;s:18:\"patch-page_len.sql\";}i:26;a:4:{i:0;s:9:\"dropField\";i:1;s:8:\"revision\";i:2;s:17:\"inverse_timestamp\";i:3;s:27:\"patch-inverse_timestamp.sql\";}i:27;a:4:{i:0;s:8:\"addField\";i:1;s:8:\"revision\";i:2;s:11:\"rev_text_id\";i:3;s:21:\"patch-rev_text_id.sql\";}i:28;a:4:{i:0;s:8:\"addField\";i:1;s:8:\"revision\";i:2;s:11:\"rev_deleted\";i:3;s:21:\"patch-rev_deleted.sql\";}i:29;a:4:{i:0;s:8:\"addField\";i:1;s:5:\"image\";i:2;s:9:\"img_width\";i:3;s:19:\"patch-img_width.sql\";}i:30;a:4:{i:0;s:8:\"addField\";i:1;s:5:\"image\";i:2;s:12:\"img_metadata\";i:3;s:22:\"patch-img_metadata.sql\";}i:31;a:4:{i:0;s:8:\"addField\";i:1;s:4:\"user\";i:2;s:16:\"user_email_token\";i:3;s:26:\"patch-user_email_token.sql\";}i:32;a:4:{i:0;s:8:\"addField\";i:1;s:7:\"archive\";i:2;s:10:\"ar_text_id\";i:3;s:25:\"patch-archive-text_id.sql\";}i:33;a:1:{i:0;s:15:\"doNamespaceSize\";}i:34;a:4:{i:0;s:8:\"addField\";i:1;s:5:\"image\";i:2;s:14:\"img_media_type\";i:3;s:24:\"patch-img_media_type.sql\";}i:35;a:1:{i:0;s:17:\"doPagelinksUpdate\";}i:36;a:4:{i:0;s:9:\"dropField\";i:1;s:5:\"image\";i:2;s:8:\"img_type\";i:3;s:23:\"patch-drop_img_type.sql\";}i:37;a:1:{i:0;s:18:\"doUserUniqueUpdate\";}i:38;a:1:{i:0;s:18:\"doUserGroupsUpdate\";}i:39;a:4:{i:0;s:8:\"addField\";i:1;s:10:\"site_stats\";i:2;s:14:\"ss_total_pages\";i:3;s:27:\"patch-ss_total_articles.sql\";}i:40;a:3:{i:0;s:8:\"addTable\";i:1;s:12:\"user_newtalk\";i:2;s:22:\"patch-usernewtalk2.sql\";}i:41;a:3:{i:0;s:8:\"addTable\";i:1;s:10:\"transcache\";i:2;s:20:\"patch-transcache.sql\";}i:42;a:4:{i:0;s:8:\"addField\";i:1;s:9:\"interwiki\";i:2;s:8:\"iw_trans\";i:3;s:25:\"patch-interwiki-trans.sql\";}i:43;a:3:{i:0;s:8:\"addTable\";i:1;s:10:\"trackbacks\";i:2;s:20:\"patch-trackbacks.sql\";}i:44;a:1:{i:0;s:15:\"doWatchlistNull\";}i:45;a:4:{i:0;s:8:\"addIndex\";i:1;s:7:\"logging\";i:2;s:5:\"times\";i:3;s:29:\"patch-logging-times-index.sql\";}i:46;a:4:{i:0;s:8:\"addField\";i:1;s:8:\"ipblocks\";i:2;s:15:\"ipb_range_start\";i:3;s:25:\"patch-ipb_range_start.sql\";}i:47;a:1:{i:0;s:18:\"doPageRandomUpdate\";}i:48;a:4:{i:0;s:8:\"addField\";i:1;s:4:\"user\";i:2;s:17:\"user_registration\";i:3;s:27:\"patch-user_registration.sql\";}i:49;a:1:{i:0;s:21:\"doTemplatelinksUpdate\";}i:50;a:3:{i:0;s:8:\"addTable\";i:1;s:13:\"externallinks\";i:2;s:23:\"patch-externallinks.sql\";}i:51;a:3:{i:0;s:8:\"addTable\";i:1;s:3:\"job\";i:2;s:13:\"patch-job.sql\";}i:52;a:4:{i:0;s:8:\"addField\";i:1;s:10:\"site_stats\";i:2;s:9:\"ss_images\";i:3;s:19:\"patch-ss_images.sql\";}i:53;a:3:{i:0;s:8:\"addTable\";i:1;s:9:\"langlinks\";i:2;s:19:\"patch-langlinks.sql\";}i:54;a:3:{i:0;s:8:\"addTable\";i:1;s:15:\"querycache_info\";i:2;s:24:\"patch-querycacheinfo.sql\";}i:55;a:3:{i:0;s:8:\"addTable\";i:1;s:11:\"filearchive\";i:2;s:21:\"patch-filearchive.sql\";}i:56;a:4:{i:0;s:8:\"addField\";i:1;s:8:\"ipblocks\";i:2;s:13:\"ipb_anon_only\";i:3;s:23:\"patch-ipb_anon_only.sql\";}i:57;a:4:{i:0;s:8:\"addIndex\";i:1;s:13:\"recentchanges\";i:2;s:14:\"rc_ns_usertext\";i:3;s:31:\"patch-recentchanges-utindex.sql\";}i:58;a:4:{i:0;s:8:\"addIndex\";i:1;s:13:\"recentchanges\";i:2;s:12:\"rc_user_text\";i:3;s:28:\"patch-rc_user_text-index.sql\";}i:59;a:4:{i:0;s:8:\"addField\";i:1;s:4:\"user\";i:2;s:17:\"user_newpass_time\";i:3;s:27:\"patch-user_newpass_time.sql\";}i:60;a:3:{i:0;s:8:\"addTable\";i:1;s:8:\"redirect\";i:2;s:18:\"patch-redirect.sql\";}i:61;a:3:{i:0;s:8:\"addTable\";i:1;s:13:\"querycachetwo\";i:2;s:23:\"patch-querycachetwo.sql\";}i:62;a:4:{i:0;s:8:\"addField\";i:1;s:8:\"ipblocks\";i:2;s:20:\"ipb_enable_autoblock\";i:3;s:32:\"patch-ipb_optional_autoblock.sql\";}i:63;a:1:{i:0;s:26:\"doBacklinkingIndicesUpdate\";}i:64;a:4:{i:0;s:8:\"addField\";i:1;s:13:\"recentchanges\";i:2;s:10:\"rc_old_len\";i:3;s:16:\"patch-rc_len.sql\";}i:65;a:4:{i:0;s:8:\"addField\";i:1;s:4:\"user\";i:2;s:14:\"user_editcount\";i:3;s:24:\"patch-user_editcount.sql\";}i:66;a:1:{i:0;s:20:\"doRestrictionsUpdate\";}i:67;a:4:{i:0;s:8:\"addField\";i:1;s:7:\"logging\";i:2;s:6:\"log_id\";i:3;s:16:\"patch-log_id.sql\";}i:68;a:4:{i:0;s:8:\"addField\";i:1;s:8:\"revision\";i:2;s:13:\"rev_parent_id\";i:3;s:23:\"patch-rev_parent_id.sql\";}i:69;a:4:{i:0;s:8:\"addField\";i:1;s:17:\"page_restrictions\";i:2;s:5:\"pr_id\";i:3;s:35:\"patch-page_restrictions_sortkey.sql\";}i:70;a:4:{i:0;s:8:\"addField\";i:1;s:8:\"revision\";i:2;s:7:\"rev_len\";i:3;s:17:\"patch-rev_len.sql\";}i:71;a:4:{i:0;s:8:\"addField\";i:1;s:13:\"recentchanges\";i:2;s:10:\"rc_deleted\";i:3;s:20:\"patch-rc_deleted.sql\";}i:72;a:4:{i:0;s:8:\"addField\";i:1;s:7:\"logging\";i:2;s:11:\"log_deleted\";i:3;s:21:\"patch-log_deleted.sql\";}i:73;a:4:{i:0;s:8:\"addField\";i:1;s:7:\"archive\";i:2;s:10:\"ar_deleted\";i:3;s:20:\"patch-ar_deleted.sql\";}i:74;a:4:{i:0;s:8:\"addField\";i:1;s:8:\"ipblocks\";i:2;s:11:\"ipb_deleted\";i:3;s:21:\"patch-ipb_deleted.sql\";}i:75;a:4:{i:0;s:8:\"addField\";i:1;s:11:\"filearchive\";i:2;s:10:\"fa_deleted\";i:3;s:20:\"patch-fa_deleted.sql\";}i:76;a:4:{i:0;s:8:\"addField\";i:1;s:7:\"archive\";i:2;s:6:\"ar_len\";i:3;s:16:\"patch-ar_len.sql\";}i:77;a:4:{i:0;s:8:\"addField\";i:1;s:8:\"ipblocks\";i:2;s:15:\"ipb_block_email\";i:3;s:22:\"patch-ipb_emailban.sql\";}i:78;a:1:{i:0;s:28:\"doCategorylinksIndicesUpdate\";}i:79;a:4:{i:0;s:8:\"addField\";i:1;s:8:\"oldimage\";i:2;s:11:\"oi_metadata\";i:3;s:21:\"patch-oi_metadata.sql\";}i:80;a:4:{i:0;s:8:\"addIndex\";i:1;s:7:\"archive\";i:2;s:18:\"usertext_timestamp\";i:3;s:28:\"patch-archive-user-index.sql\";}i:81;a:4:{i:0;s:8:\"addIndex\";i:1;s:5:\"image\";i:2;s:22:\"img_usertext_timestamp\";i:3;s:26:\"patch-image-user-index.sql\";}i:82;a:4:{i:0;s:8:\"addIndex\";i:1;s:8:\"oldimage\";i:2;s:21:\"oi_usertext_timestamp\";i:3;s:29:\"patch-oldimage-user-index.sql\";}i:83;a:4:{i:0;s:8:\"addField\";i:1;s:7:\"archive\";i:2;s:10:\"ar_page_id\";i:3;s:25:\"patch-archive-page_id.sql\";}i:84;a:4:{i:0;s:8:\"addField\";i:1;s:5:\"image\";i:2;s:8:\"img_sha1\";i:3;s:18:\"patch-img_sha1.sql\";}i:85;a:3:{i:0;s:8:\"addTable\";i:1;s:16:\"protected_titles\";i:2;s:26:\"patch-protected_titles.sql\";}i:86;a:4:{i:0;s:8:\"addField\";i:1;s:8:\"ipblocks\";i:2;s:11:\"ipb_by_text\";i:3;s:21:\"patch-ipb_by_text.sql\";}i:87;a:3:{i:0;s:8:\"addTable\";i:1;s:10:\"page_props\";i:2;s:20:\"patch-page_props.sql\";}i:88;a:3:{i:0;s:8:\"addTable\";i:1;s:9:\"updatelog\";i:2;s:19:\"patch-updatelog.sql\";}i:89;a:3:{i:0;s:8:\"addTable\";i:1;s:8:\"category\";i:2;s:18:\"patch-category.sql\";}i:90;a:1:{i:0;s:20:\"doCategoryPopulation\";}i:91;a:4:{i:0;s:8:\"addField\";i:1;s:7:\"archive\";i:2;s:12:\"ar_parent_id\";i:3;s:22:\"patch-ar_parent_id.sql\";}i:92;a:4:{i:0;s:8:\"addField\";i:1;s:12:\"user_newtalk\";i:2;s:19:\"user_last_timestamp\";i:3;s:29:\"patch-user_last_timestamp.sql\";}i:93;a:1:{i:0;s:18:\"doPopulateParentId\";}i:94;a:4:{i:0;s:8:\"checkBin\";i:1;s:16:\"protected_titles\";i:2;s:8:\"pt_title\";i:3;s:27:\"patch-pt_title-encoding.sql\";}i:95;a:1:{i:0;s:28:\"doMaybeProfilingMemoryUpdate\";}i:96;a:1:{i:0;s:26:\"doFilearchiveIndicesUpdate\";}i:97;a:4:{i:0;s:8:\"addField\";i:1;s:10:\"site_stats\";i:2;s:15:\"ss_active_users\";i:3;s:25:\"patch-ss_active_users.sql\";}i:98;a:1:{i:0;s:17:\"doActiveUsersInit\";}i:99;a:4:{i:0;s:8:\"addField\";i:1;s:8:\"ipblocks\";i:2;s:18:\"ipb_allow_usertalk\";i:3;s:28:\"patch-ipb_allow_usertalk.sql\";}i:100;a:1:{i:0;s:14:\"doUniquePlTlIl\";}i:101;a:3:{i:0;s:8:\"addTable\";i:1;s:10:\"change_tag\";i:2;s:20:\"patch-change_tag.sql\";}i:102;a:3:{i:0;s:8:\"addTable\";i:1;s:11:\"tag_summary\";i:2;s:20:\"patch-change_tag.sql\";}i:103;a:3:{i:0;s:8:\"addTable\";i:1;s:9:\"valid_tag\";i:2;s:20:\"patch-change_tag.sql\";}i:104;a:3:{i:0;s:8:\"addTable\";i:1;s:15:\"user_properties\";i:2;s:25:\"patch-user_properties.sql\";}i:105;a:3:{i:0;s:8:\"addTable\";i:1;s:10:\"log_search\";i:2;s:20:\"patch-log_search.sql\";}i:106;a:1:{i:0;s:21:\"doLogSearchPopulation\";}i:107;a:4:{i:0;s:8:\"addField\";i:1;s:7:\"logging\";i:2;s:13:\"log_user_text\";i:3;s:23:\"patch-log_user_text.sql\";}i:108;a:3:{i:0;s:8:\"addTable\";i:1;s:10:\"l10n_cache\";i:2;s:20:\"patch-l10n_cache.sql\";}i:109;a:3:{i:0;s:8:\"addTable\";i:1;s:13:\"external_user\";i:2;s:23:\"patch-external_user.sql\";}i:110;a:4:{i:0;s:8:\"addIndex\";i:1;s:10:\"log_search\";i:2;s:12:\"ls_field_val\";i:3;s:33:\"patch-log_search-rename-index.sql\";}i:111;a:4:{i:0;s:8:\"addIndex\";i:1;s:10:\"change_tag\";i:2;s:17:\"change_tag_rc_tag\";i:3;s:28:\"patch-change_tag-indexes.sql\";}i:112;a:4:{i:0;s:8:\"addField\";i:1;s:8:\"redirect\";i:2;s:12:\"rd_interwiki\";i:3;s:22:\"patch-rd_interwiki.sql\";}i:113;a:1:{i:0;s:23:\"doUpdateTranscacheField\";}i:114;a:1:{i:0;s:14:\"renameEuWikiId\";}i:115;a:1:{i:0;s:22:\"doUpdateMimeMinorField\";}i:116;a:1:{i:0;s:16:\"doPopulateRevLen\";}i:117;a:3:{i:0;s:8:\"addTable\";i:1;s:7:\"iwlinks\";i:2;s:17:\"patch-iwlinks.sql\";}i:118;a:4:{i:0;s:8:\"addIndex\";i:1;s:7:\"iwlinks\";i:2;s:21:\"iwl_prefix_title_from\";i:3;s:27:\"patch-rename-iwl_prefix.sql\";}i:119;a:4:{i:0;s:8:\"addField\";i:1;s:9:\"updatelog\";i:2;s:8:\"ul_value\";i:3;s:18:\"patch-ul_value.sql\";}i:120;a:4:{i:0;s:8:\"addField\";i:1;s:9:\"interwiki\";i:2;s:6:\"iw_api\";i:3;s:27:\"patch-iw_api_and_wikiid.sql\";}i:121;a:4:{i:0;s:9:\"dropIndex\";i:1;s:7:\"iwlinks\";i:2;s:10:\"iwl_prefix\";i:3;s:25:\"patch-kill-iwl_prefix.sql\";}i:122;a:4:{i:0;s:9:\"dropIndex\";i:1;s:7:\"iwlinks\";i:2;s:21:\"iwl_prefix_from_title\";i:3;s:22:\"patch-kill-iwl_pft.sql\";}i:123;a:4:{i:0;s:8:\"addField\";i:1;s:13:\"categorylinks\";i:2;s:12:\"cl_collation\";i:3;s:40:\"patch-categorylinks-better-collation.sql\";}i:124;a:1:{i:0;s:16:\"doClFieldsUpdate\";}i:125;a:1:{i:0;s:17:\"doCollationUpdate\";}i:126;a:3:{i:0;s:8:\"addTable\";i:1;s:12:\"msg_resource\";i:2;s:22:\"patch-msg_resource.sql\";}i:127;a:3:{i:0;s:8:\"addTable\";i:1;s:11:\"module_deps\";i:2;s:21:\"patch-module_deps.sql\";}}');
-/*!40000 ALTER TABLE `mw_updatelog` ENABLE KEYS */;
-UNLOCK TABLES;
-
---
--- Table structure for table `mw_user`
---
-
-DROP TABLE IF EXISTS `mw_user`;
-/*!40101 SET @saved_cs_client = @@character_set_client */;
-/*!40101 SET character_set_client = utf8 */;
-CREATE TABLE `mw_user` (
- `user_id` int(10) unsigned NOT NULL AUTO_INCREMENT,
- `user_name` varchar(255) CHARACTER SET latin1 COLLATE latin1_bin NOT NULL DEFAULT '',
- `user_real_name` varchar(255) CHARACTER SET latin1 COLLATE latin1_bin NOT NULL DEFAULT '',
- `user_password` tinyblob NOT NULL,
- `user_newpassword` tinyblob NOT NULL,
- `user_newpass_time` binary(14) DEFAULT NULL,
- `user_email` tinytext NOT NULL,
- `user_touched` binary(14) NOT NULL DEFAULT '\0\0\0\0\0\0\0\0\0\0\0\0\0\0',
- `user_token` binary(32) NOT NULL DEFAULT '\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0',
- `user_email_authenticated` binary(14) DEFAULT NULL,
- `user_email_token` binary(32) DEFAULT NULL,
- `user_email_token_expires` binary(14) DEFAULT NULL,
- `user_registration` binary(14) DEFAULT NULL,
- `user_editcount` int(11) DEFAULT NULL,
- PRIMARY KEY (`user_id`),
- UNIQUE KEY `user_name` (`user_name`),
- KEY `user_email_token` (`user_email_token`)
-) ENGINE=InnoDB AUTO_INCREMENT=2 DEFAULT CHARSET=latin1;
-/*!40101 SET character_set_client = @saved_cs_client */;
-
---
--- Dumping data for table `mw_user`
---
-
-LOCK TABLES `mw_user` WRITE;
-/*!40000 ALTER TABLE `mw_user` DISABLE KEYS */;
-INSERT INTO `mw_user` VALUES (1,'WikiSysop','',':B:9c595470:df2c1237ae75896744457e7dfbeb7f90','',NULL,'','','20110110173136','5e3b582786fa8150118cfa78f18de0c5',NULL,'\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0',NULL,'20110107184113',1);
-/*!40000 ALTER TABLE `mw_user` ENABLE KEYS */;
-UNLOCK TABLES;
-
---
--- Table structure for table `mw_user_groups`
---
-
-DROP TABLE IF EXISTS `mw_user_groups`;
-/*!40101 SET @saved_cs_client = @@character_set_client */;
-/*!40101 SET character_set_client = utf8 */;
-CREATE TABLE `mw_user_groups` (
- `ug_user` int(10) unsigned NOT NULL DEFAULT '0',
- `ug_group` varbinary(16) NOT NULL DEFAULT '',
- UNIQUE KEY `ug_user_group` (`ug_user`,`ug_group`),
- KEY `ug_group` (`ug_group`)
-) ENGINE=InnoDB DEFAULT CHARSET=latin1;
-/*!40101 SET character_set_client = @saved_cs_client */;
-
---
--- Dumping data for table `mw_user_groups`
---
-
-LOCK TABLES `mw_user_groups` WRITE;
-/*!40000 ALTER TABLE `mw_user_groups` DISABLE KEYS */;
-INSERT INTO `mw_user_groups` VALUES (1,'bureaucrat'),(1,'sysop');
-/*!40000 ALTER TABLE `mw_user_groups` ENABLE KEYS */;
-UNLOCK TABLES;
-
---
--- Table structure for table `mw_user_newtalk`
---
-
-DROP TABLE IF EXISTS `mw_user_newtalk`;
-/*!40101 SET @saved_cs_client = @@character_set_client */;
-/*!40101 SET character_set_client = utf8 */;
-CREATE TABLE `mw_user_newtalk` (
- `user_id` int(11) NOT NULL DEFAULT '0',
- `user_ip` varbinary(40) NOT NULL DEFAULT '',
- `user_last_timestamp` binary(14) NOT NULL DEFAULT '\0\0\0\0\0\0\0\0\0\0\0\0\0\0',
- KEY `user_id` (`user_id`),
- KEY `user_ip` (`user_ip`)
-) ENGINE=InnoDB DEFAULT CHARSET=latin1;
-/*!40101 SET character_set_client = @saved_cs_client */;
-
---
--- Dumping data for table `mw_user_newtalk`
---
-
-LOCK TABLES `mw_user_newtalk` WRITE;
-/*!40000 ALTER TABLE `mw_user_newtalk` DISABLE KEYS */;
-/*!40000 ALTER TABLE `mw_user_newtalk` ENABLE KEYS */;
-UNLOCK TABLES;
-
---
--- Table structure for table `mw_user_properties`
---
-
-DROP TABLE IF EXISTS `mw_user_properties`;
-/*!40101 SET @saved_cs_client = @@character_set_client */;
-/*!40101 SET character_set_client = utf8 */;
-CREATE TABLE `mw_user_properties` (
- `up_user` int(11) NOT NULL,
- `up_property` varbinary(32) NOT NULL,
- `up_value` blob,
- UNIQUE KEY `user_properties_user_property` (`up_user`,`up_property`),
- KEY `user_properties_property` (`up_property`)
-) ENGINE=InnoDB DEFAULT CHARSET=latin1;
-/*!40101 SET character_set_client = @saved_cs_client */;
-
---
--- Dumping data for table `mw_user_properties`
---
-
-LOCK TABLES `mw_user_properties` WRITE;
-/*!40000 ALTER TABLE `mw_user_properties` DISABLE KEYS */;
-/*!40000 ALTER TABLE `mw_user_properties` ENABLE KEYS */;
-UNLOCK TABLES;
-
---
--- Table structure for table `mw_valid_tag`
---
-
-DROP TABLE IF EXISTS `mw_valid_tag`;
-/*!40101 SET @saved_cs_client = @@character_set_client */;
-/*!40101 SET character_set_client = utf8 */;
-CREATE TABLE `mw_valid_tag` (
- `vt_tag` varchar(255) NOT NULL,
- PRIMARY KEY (`vt_tag`)
-) ENGINE=InnoDB DEFAULT CHARSET=latin1;
-/*!40101 SET character_set_client = @saved_cs_client */;
-
---
--- Dumping data for table `mw_valid_tag`
---
-
-LOCK TABLES `mw_valid_tag` WRITE;
-/*!40000 ALTER TABLE `mw_valid_tag` DISABLE KEYS */;
-/*!40000 ALTER TABLE `mw_valid_tag` ENABLE KEYS */;
-UNLOCK TABLES;
-
---
--- Table structure for table `mw_watchlist`
---
-
-DROP TABLE IF EXISTS `mw_watchlist`;
-/*!40101 SET @saved_cs_client = @@character_set_client */;
-/*!40101 SET character_set_client = utf8 */;
-CREATE TABLE `mw_watchlist` (
- `wl_user` int(10) unsigned NOT NULL,
- `wl_namespace` int(11) NOT NULL DEFAULT '0',
- `wl_title` varchar(255) CHARACTER SET latin1 COLLATE latin1_bin NOT NULL DEFAULT '',
- `wl_notificationtimestamp` varbinary(14) DEFAULT NULL,
- UNIQUE KEY `wl_user` (`wl_user`,`wl_namespace`,`wl_title`),
- KEY `namespace_title` (`wl_namespace`,`wl_title`)
-) ENGINE=InnoDB DEFAULT CHARSET=latin1;
-/*!40101 SET character_set_client = @saved_cs_client */;
-
---
--- Dumping data for table `mw_watchlist`
---
-
-LOCK TABLES `mw_watchlist` WRITE;
-/*!40000 ALTER TABLE `mw_watchlist` DISABLE KEYS */;
-/*!40000 ALTER TABLE `mw_watchlist` ENABLE KEYS */;
-UNLOCK TABLES;
-/*!40103 SET TIME_ZONE=@OLD_TIME_ZONE */;
-
-/*!40101 SET SQL_MODE=@OLD_SQL_MODE */;
-/*!40014 SET FOREIGN_KEY_CHECKS=@OLD_FOREIGN_KEY_CHECKS */;
-/*!40014 SET UNIQUE_CHECKS=@OLD_UNIQUE_CHECKS */;
-/*!40101 SET CHARACTER_SET_CLIENT=@OLD_CHARACTER_SET_CLIENT */;
-/*!40101 SET CHARACTER_SET_RESULTS=@OLD_CHARACTER_SET_RESULTS */;
-/*!40101 SET COLLATION_CONNECTION=@OLD_COLLATION_CONNECTION */;
-/*!40111 SET SQL_NOTES=@OLD_SQL_NOTES */;
-
--- Dump completed on 2011-01-10 9:34:34
diff --git a/tests/selenium/data/SimpleSeleniumTestImages.zip b/tests/selenium/data/SimpleSeleniumTestImages.zip
deleted file mode 100644
index 0374a1fb..00000000
--- a/tests/selenium/data/SimpleSeleniumTestImages.zip
+++ /dev/null
Binary files differ
diff --git a/tests/selenium/data/Wikipedia-logo-v2-de.png b/tests/selenium/data/Wikipedia-logo-v2-de.png
deleted file mode 100644
index 70385243..00000000
--- a/tests/selenium/data/Wikipedia-logo-v2-de.png
+++ /dev/null
Binary files differ
diff --git a/tests/selenium/data/mediawiki118_fresh_installation.sql b/tests/selenium/data/mediawiki118_fresh_installation.sql
deleted file mode 100644
index 7beb9e6a..00000000
--- a/tests/selenium/data/mediawiki118_fresh_installation.sql
+++ /dev/null
@@ -1,1543 +0,0 @@
--- MySQL dump 10.13 Distrib 5.1.41, for Win32 (ia32)
---
--- Host: localhost Database: test_wiki
--- ------------------------------------------------------
--- Server version 5.1.41
-
-/*!40101 SET @OLD_CHARACTER_SET_CLIENT=@@CHARACTER_SET_CLIENT */;
-/*!40101 SET @OLD_CHARACTER_SET_RESULTS=@@CHARACTER_SET_RESULTS */;
-/*!40101 SET @OLD_COLLATION_CONNECTION=@@COLLATION_CONNECTION */;
-/*!40101 SET NAMES utf8 */;
-/*!40103 SET @OLD_TIME_ZONE=@@TIME_ZONE */;
-/*!40103 SET TIME_ZONE='+00:00' */;
-/*!40014 SET @OLD_UNIQUE_CHECKS=@@UNIQUE_CHECKS, UNIQUE_CHECKS=0 */;
-/*!40014 SET @OLD_FOREIGN_KEY_CHECKS=@@FOREIGN_KEY_CHECKS, FOREIGN_KEY_CHECKS=0 */;
-/*!40101 SET @OLD_SQL_MODE=@@SQL_MODE, SQL_MODE='NO_AUTO_VALUE_ON_ZERO' */;
-/*!40111 SET @OLD_SQL_NOTES=@@SQL_NOTES, SQL_NOTES=0 */;
-
---
--- Table structure for table `mw_archive`
---
-
-DROP TABLE IF EXISTS `mw_archive`;
-/*!40101 SET @saved_cs_client = @@character_set_client */;
-/*!40101 SET character_set_client = utf8 */;
-CREATE TABLE `mw_archive` (
- `ar_namespace` int(11) NOT NULL DEFAULT '0',
- `ar_title` varchar(255) CHARACTER SET latin1 COLLATE latin1_bin NOT NULL DEFAULT '',
- `ar_text` mediumblob NOT NULL,
- `ar_comment` tinyblob NOT NULL,
- `ar_user` int(10) unsigned NOT NULL DEFAULT '0',
- `ar_user_text` varchar(255) CHARACTER SET latin1 COLLATE latin1_bin NOT NULL,
- `ar_timestamp` binary(14) NOT NULL DEFAULT '\0\0\0\0\0\0\0\0\0\0\0\0\0\0',
- `ar_minor_edit` tinyint(4) NOT NULL DEFAULT '0',
- `ar_flags` tinyblob NOT NULL,
- `ar_rev_id` int(10) unsigned DEFAULT NULL,
- `ar_text_id` int(10) unsigned DEFAULT NULL,
- `ar_deleted` tinyint(3) unsigned NOT NULL DEFAULT '0',
- `ar_len` int(10) unsigned DEFAULT NULL,
- `ar_page_id` int(10) unsigned DEFAULT NULL,
- `ar_parent_id` int(10) unsigned DEFAULT NULL,
- KEY `name_title_timestamp` (`ar_namespace`,`ar_title`,`ar_timestamp`),
- KEY `usertext_timestamp` (`ar_user_text`,`ar_timestamp`),
- KEY `ar_page_revid` (`ar_namespace`,`ar_title`,`ar_rev_id`)
-) ENGINE=InnoDB DEFAULT CHARSET=latin1;
-/*!40101 SET character_set_client = @saved_cs_client */;
-
---
--- Dumping data for table `mw_archive`
---
-
-LOCK TABLES `mw_archive` WRITE;
-/*!40000 ALTER TABLE `mw_archive` DISABLE KEYS */;
-/*!40000 ALTER TABLE `mw_archive` ENABLE KEYS */;
-UNLOCK TABLES;
-
---
--- Table structure for table `mw_category`
---
-
-DROP TABLE IF EXISTS `mw_category`;
-/*!40101 SET @saved_cs_client = @@character_set_client */;
-/*!40101 SET character_set_client = utf8 */;
-CREATE TABLE `mw_category` (
- `cat_id` int(10) unsigned NOT NULL AUTO_INCREMENT,
- `cat_title` varchar(255) CHARACTER SET latin1 COLLATE latin1_bin NOT NULL,
- `cat_pages` int(11) NOT NULL DEFAULT '0',
- `cat_subcats` int(11) NOT NULL DEFAULT '0',
- `cat_files` int(11) NOT NULL DEFAULT '0',
- `cat_hidden` tinyint(3) unsigned NOT NULL DEFAULT '0',
- PRIMARY KEY (`cat_id`),
- UNIQUE KEY `cat_title` (`cat_title`),
- KEY `cat_pages` (`cat_pages`)
-) ENGINE=InnoDB DEFAULT CHARSET=latin1;
-/*!40101 SET character_set_client = @saved_cs_client */;
-
---
--- Dumping data for table `mw_category`
---
-
-LOCK TABLES `mw_category` WRITE;
-/*!40000 ALTER TABLE `mw_category` DISABLE KEYS */;
-/*!40000 ALTER TABLE `mw_category` ENABLE KEYS */;
-UNLOCK TABLES;
-
---
--- Table structure for table `mw_categorylinks`
---
-
-DROP TABLE IF EXISTS `mw_categorylinks`;
-/*!40101 SET @saved_cs_client = @@character_set_client */;
-/*!40101 SET character_set_client = utf8 */;
-CREATE TABLE `mw_categorylinks` (
- `cl_from` int(10) unsigned NOT NULL DEFAULT '0',
- `cl_to` varchar(255) CHARACTER SET latin1 COLLATE latin1_bin NOT NULL DEFAULT '',
- `cl_sortkey` varbinary(230) NOT NULL DEFAULT '',
- `cl_sortkey_prefix` varchar(255) CHARACTER SET latin1 COLLATE latin1_bin NOT NULL DEFAULT '',
- `cl_timestamp` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
- `cl_collation` varbinary(32) NOT NULL DEFAULT '',
- `cl_type` enum('page','subcat','file') NOT NULL DEFAULT 'page',
- UNIQUE KEY `cl_from` (`cl_from`,`cl_to`),
- KEY `cl_sortkey` (`cl_to`,`cl_type`,`cl_sortkey`,`cl_from`),
- KEY `cl_timestamp` (`cl_to`,`cl_timestamp`),
- KEY `cl_collation` (`cl_collation`)
-) ENGINE=InnoDB DEFAULT CHARSET=latin1;
-/*!40101 SET character_set_client = @saved_cs_client */;
-
---
--- Dumping data for table `mw_categorylinks`
---
-
-LOCK TABLES `mw_categorylinks` WRITE;
-/*!40000 ALTER TABLE `mw_categorylinks` DISABLE KEYS */;
-/*!40000 ALTER TABLE `mw_categorylinks` ENABLE KEYS */;
-UNLOCK TABLES;
-
---
--- Table structure for table `mw_change_tag`
---
-
-DROP TABLE IF EXISTS `mw_change_tag`;
-/*!40101 SET @saved_cs_client = @@character_set_client */;
-/*!40101 SET character_set_client = utf8 */;
-CREATE TABLE `mw_change_tag` (
- `ct_rc_id` int(11) DEFAULT NULL,
- `ct_log_id` int(11) DEFAULT NULL,
- `ct_rev_id` int(11) DEFAULT NULL,
- `ct_tag` varchar(255) NOT NULL,
- `ct_params` blob,
- UNIQUE KEY `change_tag_rc_tag` (`ct_rc_id`,`ct_tag`),
- UNIQUE KEY `change_tag_log_tag` (`ct_log_id`,`ct_tag`),
- UNIQUE KEY `change_tag_rev_tag` (`ct_rev_id`,`ct_tag`),
- KEY `change_tag_tag_id` (`ct_tag`,`ct_rc_id`,`ct_rev_id`,`ct_log_id`)
-) ENGINE=InnoDB DEFAULT CHARSET=latin1;
-/*!40101 SET character_set_client = @saved_cs_client */;
-
---
--- Dumping data for table `mw_change_tag`
---
-
-LOCK TABLES `mw_change_tag` WRITE;
-/*!40000 ALTER TABLE `mw_change_tag` DISABLE KEYS */;
-/*!40000 ALTER TABLE `mw_change_tag` ENABLE KEYS */;
-UNLOCK TABLES;
-
---
--- Table structure for table `mw_external_user`
---
-
-DROP TABLE IF EXISTS `mw_external_user`;
-/*!40101 SET @saved_cs_client = @@character_set_client */;
-/*!40101 SET character_set_client = utf8 */;
-CREATE TABLE `mw_external_user` (
- `eu_local_id` int(10) unsigned NOT NULL,
- `eu_external_id` varchar(255) CHARACTER SET latin1 COLLATE latin1_bin NOT NULL,
- PRIMARY KEY (`eu_local_id`),
- UNIQUE KEY `eu_external_id` (`eu_external_id`)
-) ENGINE=InnoDB DEFAULT CHARSET=latin1;
-/*!40101 SET character_set_client = @saved_cs_client */;
-
---
--- Dumping data for table `mw_external_user`
---
-
-LOCK TABLES `mw_external_user` WRITE;
-/*!40000 ALTER TABLE `mw_external_user` DISABLE KEYS */;
-/*!40000 ALTER TABLE `mw_external_user` ENABLE KEYS */;
-UNLOCK TABLES;
-
---
--- Table structure for table `mw_externallinks`
---
-
-DROP TABLE IF EXISTS `mw_externallinks`;
-/*!40101 SET @saved_cs_client = @@character_set_client */;
-/*!40101 SET character_set_client = utf8 */;
-CREATE TABLE `mw_externallinks` (
- `el_from` int(10) unsigned NOT NULL DEFAULT '0',
- `el_to` blob NOT NULL,
- `el_index` blob NOT NULL,
- KEY `el_from` (`el_from`,`el_to`(40)),
- KEY `el_to` (`el_to`(60),`el_from`),
- KEY `el_index` (`el_index`(60))
-) ENGINE=InnoDB DEFAULT CHARSET=latin1;
-/*!40101 SET character_set_client = @saved_cs_client */;
-
---
--- Dumping data for table `mw_externallinks`
---
-
-LOCK TABLES `mw_externallinks` WRITE;
-/*!40000 ALTER TABLE `mw_externallinks` DISABLE KEYS */;
-INSERT INTO `mw_externallinks` VALUES (1,'http://meta.wikimedia.org/wiki/Help:Contents','http://org.wikimedia.meta./wiki/Help:Contents');
-INSERT INTO `mw_externallinks` VALUES (1,'http://www.mediawiki.org/wiki/Manual:Configuration_settings','http://org.mediawiki.www./wiki/Manual:Configuration_settings');
-INSERT INTO `mw_externallinks` VALUES (1,'http://www.mediawiki.org/wiki/Manual:FAQ','http://org.mediawiki.www./wiki/Manual:FAQ');
-INSERT INTO `mw_externallinks` VALUES (1,'https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce','https://org.wikimedia.lists./mailman/listinfo/mediawiki-announce');
-/*!40000 ALTER TABLE `mw_externallinks` ENABLE KEYS */;
-UNLOCK TABLES;
-
---
--- Table structure for table `mw_filearchive`
---
-
-DROP TABLE IF EXISTS `mw_filearchive`;
-/*!40101 SET @saved_cs_client = @@character_set_client */;
-/*!40101 SET character_set_client = utf8 */;
-CREATE TABLE `mw_filearchive` (
- `fa_id` int(11) NOT NULL AUTO_INCREMENT,
- `fa_name` varchar(255) CHARACTER SET latin1 COLLATE latin1_bin NOT NULL DEFAULT '',
- `fa_archive_name` varchar(255) CHARACTER SET latin1 COLLATE latin1_bin DEFAULT '',
- `fa_storage_group` varbinary(16) DEFAULT NULL,
- `fa_storage_key` varbinary(64) DEFAULT '',
- `fa_deleted_user` int(11) DEFAULT NULL,
- `fa_deleted_timestamp` binary(14) DEFAULT '\0\0\0\0\0\0\0\0\0\0\0\0\0\0',
- `fa_deleted_reason` text,
- `fa_size` int(10) unsigned DEFAULT '0',
- `fa_width` int(11) DEFAULT '0',
- `fa_height` int(11) DEFAULT '0',
- `fa_metadata` mediumblob,
- `fa_bits` int(11) DEFAULT '0',
- `fa_media_type` enum('UNKNOWN','BITMAP','DRAWING','AUDIO','VIDEO','MULTIMEDIA','OFFICE','TEXT','EXECUTABLE','ARCHIVE') DEFAULT NULL,
- `fa_major_mime` enum('unknown','application','audio','image','text','video','message','model','multipart') DEFAULT 'unknown',
- `fa_minor_mime` varbinary(100) DEFAULT 'unknown',
- `fa_description` tinyblob,
- `fa_user` int(10) unsigned DEFAULT '0',
- `fa_user_text` varchar(255) CHARACTER SET latin1 COLLATE latin1_bin DEFAULT NULL,
- `fa_timestamp` binary(14) DEFAULT '\0\0\0\0\0\0\0\0\0\0\0\0\0\0',
- `fa_deleted` tinyint(3) unsigned NOT NULL DEFAULT '0',
- PRIMARY KEY (`fa_id`),
- KEY `fa_name` (`fa_name`,`fa_timestamp`),
- KEY `fa_storage_group` (`fa_storage_group`,`fa_storage_key`),
- KEY `fa_deleted_timestamp` (`fa_deleted_timestamp`),
- KEY `fa_user_timestamp` (`fa_user_text`,`fa_timestamp`)
-) ENGINE=InnoDB DEFAULT CHARSET=latin1;
-/*!40101 SET character_set_client = @saved_cs_client */;
-
---
--- Dumping data for table `mw_filearchive`
---
-
-LOCK TABLES `mw_filearchive` WRITE;
-/*!40000 ALTER TABLE `mw_filearchive` DISABLE KEYS */;
-/*!40000 ALTER TABLE `mw_filearchive` ENABLE KEYS */;
-UNLOCK TABLES;
-
---
--- Table structure for table `mw_hitcounter`
---
-
-DROP TABLE IF EXISTS `mw_hitcounter`;
-/*!40101 SET @saved_cs_client = @@character_set_client */;
-/*!40101 SET character_set_client = utf8 */;
-CREATE TABLE `mw_hitcounter` (
- `hc_id` int(10) unsigned NOT NULL
-) ENGINE=MEMORY DEFAULT CHARSET=latin1 MAX_ROWS=25000;
-/*!40101 SET character_set_client = @saved_cs_client */;
-
---
--- Dumping data for table `mw_hitcounter`
---
-
-LOCK TABLES `mw_hitcounter` WRITE;
-/*!40000 ALTER TABLE `mw_hitcounter` DISABLE KEYS */;
-/*!40000 ALTER TABLE `mw_hitcounter` ENABLE KEYS */;
-UNLOCK TABLES;
-
---
--- Table structure for table `mw_image`
---
-
-DROP TABLE IF EXISTS `mw_image`;
-/*!40101 SET @saved_cs_client = @@character_set_client */;
-/*!40101 SET character_set_client = utf8 */;
-CREATE TABLE `mw_image` (
- `img_name` varchar(255) CHARACTER SET latin1 COLLATE latin1_bin NOT NULL DEFAULT '',
- `img_size` int(10) unsigned NOT NULL DEFAULT '0',
- `img_width` int(11) NOT NULL DEFAULT '0',
- `img_height` int(11) NOT NULL DEFAULT '0',
- `img_metadata` mediumblob NOT NULL,
- `img_bits` int(11) 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` varbinary(100) NOT NULL DEFAULT 'unknown',
- `img_description` tinyblob NOT NULL,
- `img_user` int(10) unsigned NOT NULL DEFAULT '0',
- `img_user_text` varchar(255) CHARACTER SET latin1 COLLATE latin1_bin NOT NULL,
- `img_timestamp` varbinary(14) NOT NULL DEFAULT '',
- `img_sha1` varbinary(32) NOT NULL DEFAULT '',
- PRIMARY KEY (`img_name`),
- KEY `img_usertext_timestamp` (`img_user_text`,`img_timestamp`),
- KEY `img_size` (`img_size`),
- KEY `img_timestamp` (`img_timestamp`),
- KEY `img_sha1` (`img_sha1`)
-) ENGINE=InnoDB DEFAULT CHARSET=latin1;
-/*!40101 SET character_set_client = @saved_cs_client */;
-
---
--- Dumping data for table `mw_image`
---
-
-LOCK TABLES `mw_image` WRITE;
-/*!40000 ALTER TABLE `mw_image` DISABLE KEYS */;
-/*!40000 ALTER TABLE `mw_image` ENABLE KEYS */;
-UNLOCK TABLES;
-
---
--- Table structure for table `mw_imagelinks`
---
-
-DROP TABLE IF EXISTS `mw_imagelinks`;
-/*!40101 SET @saved_cs_client = @@character_set_client */;
-/*!40101 SET character_set_client = utf8 */;
-CREATE TABLE `mw_imagelinks` (
- `il_from` int(10) unsigned NOT NULL DEFAULT '0',
- `il_to` varchar(255) CHARACTER SET latin1 COLLATE latin1_bin NOT NULL DEFAULT '',
- UNIQUE KEY `il_from` (`il_from`,`il_to`),
- UNIQUE KEY `il_to` (`il_to`,`il_from`)
-) ENGINE=InnoDB DEFAULT CHARSET=latin1;
-/*!40101 SET character_set_client = @saved_cs_client */;
-
---
--- Dumping data for table `mw_imagelinks`
---
-
-LOCK TABLES `mw_imagelinks` WRITE;
-/*!40000 ALTER TABLE `mw_imagelinks` DISABLE KEYS */;
-/*!40000 ALTER TABLE `mw_imagelinks` ENABLE KEYS */;
-UNLOCK TABLES;
-
---
--- Table structure for table `mw_interwiki`
---
-
-DROP TABLE IF EXISTS `mw_interwiki`;
-/*!40101 SET @saved_cs_client = @@character_set_client */;
-/*!40101 SET character_set_client = utf8 */;
-CREATE TABLE `mw_interwiki` (
- `iw_prefix` varchar(32) NOT NULL,
- `iw_url` blob NOT NULL,
- `iw_api` blob NOT NULL,
- `iw_wikiid` varchar(64) NOT NULL,
- `iw_local` tinyint(1) NOT NULL,
- `iw_trans` tinyint(4) NOT NULL DEFAULT '0',
- UNIQUE KEY `iw_prefix` (`iw_prefix`)
-) ENGINE=InnoDB DEFAULT CHARSET=latin1;
-/*!40101 SET character_set_client = @saved_cs_client */;
-
---
--- Dumping data for table `mw_interwiki`
---
-
-LOCK TABLES `mw_interwiki` WRITE;
-/*!40000 ALTER TABLE `mw_interwiki` DISABLE KEYS */;
-INSERT INTO `mw_interwiki` VALUES ('acronym','http://www.acronymfinder.com/af-query.asp?String=exact&Acronym=$1','','',0,0);
-INSERT INTO `mw_interwiki` VALUES ('advogato','http://www.advogato.org/$1','','',0,0);
-INSERT INTO `mw_interwiki` VALUES ('annotationwiki','http://www.seedwiki.com/page.cfm?wikiid=368&doc=$1','','',0,0);
-INSERT INTO `mw_interwiki` VALUES ('arxiv','http://www.arxiv.org/abs/$1','','',0,0);
-INSERT INTO `mw_interwiki` VALUES ('c2find','http://c2.com/cgi/wiki?FindPage&value=$1','','',0,0);
-INSERT INTO `mw_interwiki` VALUES ('cache','http://www.google.com/search?q=cache:$1','','',0,0);
-INSERT INTO `mw_interwiki` VALUES ('commons','http://commons.wikimedia.org/wiki/$1','','',0,0);
-INSERT INTO `mw_interwiki` VALUES ('corpknowpedia','http://corpknowpedia.org/wiki/index.php/$1','','',0,0);
-INSERT INTO `mw_interwiki` VALUES ('dictionary','http://www.dict.org/bin/Dict?Database=*&Form=Dict1&Strategy=*&Query=$1','','',0,0);
-INSERT INTO `mw_interwiki` VALUES ('disinfopedia','http://www.disinfopedia.org/wiki.phtml?title=$1','','',0,0);
-INSERT INTO `mw_interwiki` VALUES ('docbook','http://wiki.docbook.org/topic/$1','','',0,0);
-INSERT INTO `mw_interwiki` VALUES ('doi','http://dx.doi.org/$1','','',0,0);
-INSERT INTO `mw_interwiki` VALUES ('drumcorpswiki','http://www.drumcorpswiki.com/index.php/$1','','',0,0);
-INSERT INTO `mw_interwiki` VALUES ('dwjwiki','http://www.suberic.net/cgi-bin/dwj/wiki.cgi?$1','','',0,0);
-INSERT INTO `mw_interwiki` VALUES ('elibre','http://enciclopedia.us.es/index.php/$1','','',0,0);
-INSERT INTO `mw_interwiki` VALUES ('emacswiki','http://www.emacswiki.org/cgi-bin/wiki.pl?$1','','',0,0);
-INSERT INTO `mw_interwiki` VALUES ('foldoc','http://foldoc.org/?$1','','',0,0);
-INSERT INTO `mw_interwiki` VALUES ('foxwiki','http://fox.wikis.com/wc.dll?Wiki~$1','','',0,0);
-INSERT INTO `mw_interwiki` VALUES ('freebsdman','http://www.FreeBSD.org/cgi/man.cgi?apropos=1&query=$1','','',0,0);
-INSERT INTO `mw_interwiki` VALUES ('gej','http://www.esperanto.de/cgi-bin/aktivikio/wiki.pl?$1','','',0,0);
-INSERT INTO `mw_interwiki` VALUES ('gentoo-wiki','http://gentoo-wiki.com/$1','','',0,0);
-INSERT INTO `mw_interwiki` VALUES ('google','http://www.google.com/search?q=$1','','',0,0);
-INSERT INTO `mw_interwiki` VALUES ('googlegroups','http://groups.google.com/groups?q=$1','','',0,0);
-INSERT INTO `mw_interwiki` VALUES ('hammondwiki','http://www.dairiki.org/HammondWiki/$1','','',0,0);
-INSERT INTO `mw_interwiki` VALUES ('hewikisource','http://he.wikisource.org/wiki/$1','','',1,0);
-INSERT INTO `mw_interwiki` VALUES ('hrwiki','http://www.hrwiki.org/index.php/$1','','',0,0);
-INSERT INTO `mw_interwiki` VALUES ('imdb','http://us.imdb.com/Title?$1','','',0,0);
-INSERT INTO `mw_interwiki` VALUES ('jargonfile','http://sunir.org/apps/meta.pl?wiki=JargonFile&redirect=$1','','',0,0);
-INSERT INTO `mw_interwiki` VALUES ('jspwiki','http://www.jspwiki.org/wiki/$1','','',0,0);
-INSERT INTO `mw_interwiki` VALUES ('keiki','http://kei.ki/en/$1','','',0,0);
-INSERT INTO `mw_interwiki` VALUES ('kmwiki','http://kmwiki.wikispaces.com/$1','','',0,0);
-INSERT INTO `mw_interwiki` VALUES ('linuxwiki','http://linuxwiki.de/$1','','',0,0);
-INSERT INTO `mw_interwiki` VALUES ('lojban','http://www.lojban.org/tiki/tiki-index.php?page=$1','','',0,0);
-INSERT INTO `mw_interwiki` VALUES ('lqwiki','http://wiki.linuxquestions.org/wiki/$1','','',0,0);
-INSERT INTO `mw_interwiki` VALUES ('lugkr','http://lug-kr.sourceforge.net/cgi-bin/lugwiki.pl?$1','','',0,0);
-INSERT INTO `mw_interwiki` VALUES ('mathsongswiki','http://SeedWiki.com/page.cfm?wikiid=237&doc=$1','','',0,0);
-INSERT INTO `mw_interwiki` VALUES ('meatball','http://www.usemod.com/cgi-bin/mb.pl?$1','','',0,0);
-INSERT INTO `mw_interwiki` VALUES ('mediawikiwiki','http://www.mediawiki.org/wiki/$1','','',0,0);
-INSERT INTO `mw_interwiki` VALUES ('mediazilla','https://bugzilla.wikimedia.org/$1','','',1,0);
-INSERT INTO `mw_interwiki` VALUES ('memoryalpha','http://www.memory-alpha.org/en/index.php/$1','','',0,0);
-INSERT INTO `mw_interwiki` VALUES ('metawiki','http://sunir.org/apps/meta.pl?$1','','',0,0);
-INSERT INTO `mw_interwiki` VALUES ('metawikimedia','http://meta.wikimedia.org/wiki/$1','','',0,0);
-INSERT INTO `mw_interwiki` VALUES ('moinmoin','http://purl.net/wiki/moin/$1','','',0,0);
-INSERT INTO `mw_interwiki` VALUES ('mozillawiki','http://wiki.mozilla.org/index.php/$1','','',0,0);
-INSERT INTO `mw_interwiki` VALUES ('mw','http://www.mediawiki.org/wiki/$1','','',0,0);
-INSERT INTO `mw_interwiki` VALUES ('oeis','http://www.research.att.com/cgi-bin/access.cgi/as/njas/sequences/eisA.cgi?Anum=$1','','',0,0);
-INSERT INTO `mw_interwiki` VALUES ('openfacts','http://openfacts.berlios.de/index.phtml?title=$1','','',0,0);
-INSERT INTO `mw_interwiki` VALUES ('openwiki','http://openwiki.com/?$1','','',0,0);
-INSERT INTO `mw_interwiki` VALUES ('pmeg','http://www.bertilow.com/pmeg/$1.php','','',0,0);
-INSERT INTO `mw_interwiki` VALUES ('ppr','http://c2.com/cgi/wiki?$1','','',0,0);
-INSERT INTO `mw_interwiki` VALUES ('pythoninfo','http://wiki.python.org/moin/$1','','',0,0);
-INSERT INTO `mw_interwiki` VALUES ('rfc','http://www.rfc-editor.org/rfc/rfc$1.txt','','',0,0);
-INSERT INTO `mw_interwiki` VALUES ('s23wiki','http://is-root.de/wiki/index.php/$1','','',0,0);
-INSERT INTO `mw_interwiki` VALUES ('seattlewiki','http://seattle.wikia.com/wiki/$1','','',0,0);
-INSERT INTO `mw_interwiki` VALUES ('seattlewireless','http://seattlewireless.net/?$1','','',0,0);
-INSERT INTO `mw_interwiki` VALUES ('senseislibrary','http://senseis.xmp.net/?$1','','',0,0);
-INSERT INTO `mw_interwiki` VALUES ('sourceforge','http://sourceforge.net/$1','','',0,0);
-INSERT INTO `mw_interwiki` VALUES ('squeak','http://wiki.squeak.org/squeak/$1','','',0,0);
-INSERT INTO `mw_interwiki` VALUES ('susning','http://www.susning.nu/$1','','',0,0);
-INSERT INTO `mw_interwiki` VALUES ('svgwiki','http://wiki.svg.org/$1','','',0,0);
-INSERT INTO `mw_interwiki` VALUES ('tavi','http://tavi.sourceforge.net/$1','','',0,0);
-INSERT INTO `mw_interwiki` VALUES ('tejo','http://www.tejo.org/vikio/$1','','',0,0);
-INSERT INTO `mw_interwiki` VALUES ('theopedia','http://www.theopedia.com/$1','','',0,0);
-INSERT INTO `mw_interwiki` VALUES ('tmbw','http://www.tmbw.net/wiki/$1','','',0,0);
-INSERT INTO `mw_interwiki` VALUES ('tmnet','http://www.technomanifestos.net/?$1','','',0,0);
-INSERT INTO `mw_interwiki` VALUES ('tmwiki','http://www.EasyTopicMaps.com/?page=$1','','',0,0);
-INSERT INTO `mw_interwiki` VALUES ('twiki','http://twiki.org/cgi-bin/view/$1','','',0,0);
-INSERT INTO `mw_interwiki` VALUES ('uea','http://www.tejo.org/uea/$1','','',0,0);
-INSERT INTO `mw_interwiki` VALUES ('unreal','http://wiki.beyondunreal.com/wiki/$1','','',0,0);
-INSERT INTO `mw_interwiki` VALUES ('usemod','http://www.usemod.com/cgi-bin/wiki.pl?$1','','',0,0);
-INSERT INTO `mw_interwiki` VALUES ('vinismo','http://vinismo.com/en/$1','','',0,0);
-INSERT INTO `mw_interwiki` VALUES ('webseitzwiki','http://webseitz.fluxent.com/wiki/$1','','',0,0);
-INSERT INTO `mw_interwiki` VALUES ('why','http://clublet.com/c/c/why?$1','','',0,0);
-INSERT INTO `mw_interwiki` VALUES ('wiki','http://c2.com/cgi/wiki?$1','','',0,0);
-INSERT INTO `mw_interwiki` VALUES ('wikia','http://www.wikia.com/wiki/$1','','',0,0);
-INSERT INTO `mw_interwiki` VALUES ('wikibooks','http://en.wikibooks.org/wiki/$1','','',1,0);
-INSERT INTO `mw_interwiki` VALUES ('wikicities','http://www.wikia.com/wiki/$1','','',0,0);
-INSERT INTO `mw_interwiki` VALUES ('wikif1','http://www.wikif1.org/$1','','',0,0);
-INSERT INTO `mw_interwiki` VALUES ('wikihow','http://www.wikihow.com/$1','','',0,0);
-INSERT INTO `mw_interwiki` VALUES ('wikimedia','http://wikimediafoundation.org/wiki/$1','','',0,0);
-INSERT INTO `mw_interwiki` VALUES ('wikinews','http://en.wikinews.org/wiki/$1','','',1,0);
-INSERT INTO `mw_interwiki` VALUES ('wikinfo','http://www.wikinfo.org/index.php/$1','','',0,0);
-INSERT INTO `mw_interwiki` VALUES ('wikipedia','http://en.wikipedia.org/wiki/$1','','',1,0);
-INSERT INTO `mw_interwiki` VALUES ('wikiquote','http://en.wikiquote.org/wiki/$1','','',1,0);
-INSERT INTO `mw_interwiki` VALUES ('wikisource','http://wikisource.org/wiki/$1','','',1,0);
-INSERT INTO `mw_interwiki` VALUES ('wikispecies','http://species.wikimedia.org/wiki/$1','','',1,0);
-INSERT INTO `mw_interwiki` VALUES ('wikitravel','http://wikitravel.org/en/$1','','',0,0);
-INSERT INTO `mw_interwiki` VALUES ('wikiversity','http://en.wikiversity.org/wiki/$1','','',1,0);
-INSERT INTO `mw_interwiki` VALUES ('wikt','http://en.wiktionary.org/wiki/$1','','',1,0);
-INSERT INTO `mw_interwiki` VALUES ('wiktionary','http://en.wiktionary.org/wiki/$1','','',1,0);
-INSERT INTO `mw_interwiki` VALUES ('wlug','http://www.wlug.org.nz/$1','','',0,0);
-INSERT INTO `mw_interwiki` VALUES ('zwiki','http://zwiki.org/$1','','',0,0);
-INSERT INTO `mw_interwiki` VALUES ('zzz wiki','http://wiki.zzz.ee/index.php/$1','','',0,0);
-/*!40000 ALTER TABLE `mw_interwiki` ENABLE KEYS */;
-UNLOCK TABLES;
-
---
--- Table structure for table `mw_ipblocks`
---
-
-DROP TABLE IF EXISTS `mw_ipblocks`;
-/*!40101 SET @saved_cs_client = @@character_set_client */;
-/*!40101 SET character_set_client = utf8 */;
-CREATE TABLE `mw_ipblocks` (
- `ipb_id` int(11) NOT NULL AUTO_INCREMENT,
- `ipb_address` tinyblob NOT NULL,
- `ipb_user` int(10) unsigned NOT NULL DEFAULT '0',
- `ipb_by` int(10) unsigned NOT NULL DEFAULT '0',
- `ipb_by_text` varchar(255) CHARACTER SET latin1 COLLATE latin1_bin NOT NULL DEFAULT '',
- `ipb_reason` tinyblob NOT NULL,
- `ipb_timestamp` binary(14) NOT NULL DEFAULT '\0\0\0\0\0\0\0\0\0\0\0\0\0\0',
- `ipb_auto` tinyint(1) NOT NULL DEFAULT '0',
- `ipb_anon_only` tinyint(1) NOT NULL DEFAULT '0',
- `ipb_create_account` tinyint(1) NOT NULL DEFAULT '1',
- `ipb_enable_autoblock` tinyint(1) NOT NULL DEFAULT '1',
- `ipb_expiry` varbinary(14) NOT NULL DEFAULT '',
- `ipb_range_start` tinyblob NOT NULL,
- `ipb_range_end` tinyblob NOT NULL,
- `ipb_deleted` tinyint(1) NOT NULL DEFAULT '0',
- `ipb_block_email` tinyint(1) NOT NULL DEFAULT '0',
- `ipb_allow_usertalk` tinyint(1) NOT NULL DEFAULT '0',
- PRIMARY KEY (`ipb_id`),
- UNIQUE KEY `ipb_address` (`ipb_address`(255),`ipb_user`,`ipb_auto`,`ipb_anon_only`),
- KEY `ipb_user` (`ipb_user`),
- KEY `ipb_range` (`ipb_range_start`(8),`ipb_range_end`(8)),
- KEY `ipb_timestamp` (`ipb_timestamp`),
- KEY `ipb_expiry` (`ipb_expiry`)
-) ENGINE=InnoDB DEFAULT CHARSET=latin1;
-/*!40101 SET character_set_client = @saved_cs_client */;
-
---
--- Dumping data for table `mw_ipblocks`
---
-
-LOCK TABLES `mw_ipblocks` WRITE;
-/*!40000 ALTER TABLE `mw_ipblocks` DISABLE KEYS */;
-/*!40000 ALTER TABLE `mw_ipblocks` ENABLE KEYS */;
-UNLOCK TABLES;
-
---
--- Table structure for table `mw_iwlinks`
---
-
-DROP TABLE IF EXISTS `mw_iwlinks`;
-/*!40101 SET @saved_cs_client = @@character_set_client */;
-/*!40101 SET character_set_client = utf8 */;
-CREATE TABLE `mw_iwlinks` (
- `iwl_from` int(10) unsigned NOT NULL DEFAULT '0',
- `iwl_prefix` varbinary(20) NOT NULL DEFAULT '',
- `iwl_title` varchar(255) CHARACTER SET latin1 COLLATE latin1_bin NOT NULL DEFAULT '',
- UNIQUE KEY `iwl_from` (`iwl_from`,`iwl_prefix`,`iwl_title`),
- UNIQUE KEY `iwl_prefix_title_from` (`iwl_prefix`,`iwl_title`,`iwl_from`)
-) ENGINE=InnoDB DEFAULT CHARSET=latin1;
-/*!40101 SET character_set_client = @saved_cs_client */;
-
---
--- Dumping data for table `mw_iwlinks`
---
-
-LOCK TABLES `mw_iwlinks` WRITE;
-/*!40000 ALTER TABLE `mw_iwlinks` DISABLE KEYS */;
-/*!40000 ALTER TABLE `mw_iwlinks` ENABLE KEYS */;
-UNLOCK TABLES;
-
---
--- Table structure for table `mw_job`
---
-
-DROP TABLE IF EXISTS `mw_job`;
-/*!40101 SET @saved_cs_client = @@character_set_client */;
-/*!40101 SET character_set_client = utf8 */;
-CREATE TABLE `mw_job` (
- `job_id` int(10) unsigned NOT NULL AUTO_INCREMENT,
- `job_cmd` varbinary(60) NOT NULL DEFAULT '',
- `job_namespace` int(11) NOT NULL,
- `job_title` varchar(255) CHARACTER SET latin1 COLLATE latin1_bin NOT NULL,
- `job_params` blob NOT NULL,
- PRIMARY KEY (`job_id`),
- KEY `job_cmd` (`job_cmd`,`job_namespace`,`job_title`,`job_params`(128))
-) ENGINE=InnoDB DEFAULT CHARSET=latin1;
-/*!40101 SET character_set_client = @saved_cs_client */;
-
---
--- Dumping data for table `mw_job`
---
-
-LOCK TABLES `mw_job` WRITE;
-/*!40000 ALTER TABLE `mw_job` DISABLE KEYS */;
-/*!40000 ALTER TABLE `mw_job` ENABLE KEYS */;
-UNLOCK TABLES;
-
---
--- Table structure for table `mw_l10n_cache`
---
-
-DROP TABLE IF EXISTS `mw_l10n_cache`;
-/*!40101 SET @saved_cs_client = @@character_set_client */;
-/*!40101 SET character_set_client = utf8 */;
-CREATE TABLE `mw_l10n_cache` (
- `lc_lang` varbinary(32) NOT NULL,
- `lc_key` varchar(255) NOT NULL,
- `lc_value` mediumblob NOT NULL,
- KEY `lc_lang_key` (`lc_lang`,`lc_key`)
-) ENGINE=InnoDB DEFAULT CHARSET=latin1;
-/*!40101 SET character_set_client = @saved_cs_client */;
-
-
-
---
--- Table structure for table `mw_langlinks`
---
-
-DROP TABLE IF EXISTS `mw_langlinks`;
-/*!40101 SET @saved_cs_client = @@character_set_client */;
-/*!40101 SET character_set_client = utf8 */;
-CREATE TABLE `mw_langlinks` (
- `ll_from` int(10) unsigned NOT NULL DEFAULT '0',
- `ll_lang` varbinary(20) NOT NULL DEFAULT '',
- `ll_title` varchar(255) CHARACTER SET latin1 COLLATE latin1_bin NOT NULL DEFAULT '',
- UNIQUE KEY `ll_from` (`ll_from`,`ll_lang`),
- KEY `ll_lang` (`ll_lang`,`ll_title`)
-) ENGINE=InnoDB DEFAULT CHARSET=latin1;
-/*!40101 SET character_set_client = @saved_cs_client */;
-
---
--- Dumping data for table `mw_langlinks`
---
-
-LOCK TABLES `mw_langlinks` WRITE;
-/*!40000 ALTER TABLE `mw_langlinks` DISABLE KEYS */;
-/*!40000 ALTER TABLE `mw_langlinks` ENABLE KEYS */;
-UNLOCK TABLES;
-
---
--- Table structure for table `mw_log_search`
---
-
-DROP TABLE IF EXISTS `mw_log_search`;
-/*!40101 SET @saved_cs_client = @@character_set_client */;
-/*!40101 SET character_set_client = utf8 */;
-CREATE TABLE `mw_log_search` (
- `ls_field` varbinary(32) NOT NULL,
- `ls_value` varchar(255) NOT NULL,
- `ls_log_id` int(10) unsigned NOT NULL DEFAULT '0',
- UNIQUE KEY `ls_field_val` (`ls_field`,`ls_value`,`ls_log_id`),
- KEY `ls_log_id` (`ls_log_id`)
-) ENGINE=InnoDB DEFAULT CHARSET=latin1;
-/*!40101 SET character_set_client = @saved_cs_client */;
-
---
--- Dumping data for table `mw_log_search`
---
-
-LOCK TABLES `mw_log_search` WRITE;
-/*!40000 ALTER TABLE `mw_log_search` DISABLE KEYS */;
-/*!40000 ALTER TABLE `mw_log_search` ENABLE KEYS */;
-UNLOCK TABLES;
-
---
--- Table structure for table `mw_logging`
---
-
-DROP TABLE IF EXISTS `mw_logging`;
-/*!40101 SET @saved_cs_client = @@character_set_client */;
-/*!40101 SET character_set_client = utf8 */;
-CREATE TABLE `mw_logging` (
- `log_id` int(10) unsigned NOT NULL AUTO_INCREMENT,
- `log_type` varbinary(32) NOT NULL DEFAULT '',
- `log_action` varbinary(32) NOT NULL DEFAULT '',
- `log_timestamp` binary(14) NOT NULL DEFAULT '19700101000000',
- `log_user` int(10) unsigned NOT NULL DEFAULT '0',
- `log_user_text` varchar(255) CHARACTER SET latin1 COLLATE latin1_bin NOT NULL DEFAULT '',
- `log_namespace` int(11) NOT NULL DEFAULT '0',
- `log_title` varchar(255) CHARACTER SET latin1 COLLATE latin1_bin NOT NULL DEFAULT '',
- `log_page` int(10) unsigned DEFAULT NULL,
- `log_comment` varchar(255) NOT NULL DEFAULT '',
- `log_params` blob NOT NULL,
- `log_deleted` tinyint(3) unsigned NOT NULL DEFAULT '0',
- PRIMARY KEY (`log_id`),
- KEY `type_time` (`log_type`,`log_timestamp`),
- KEY `user_time` (`log_user`,`log_timestamp`),
- KEY `page_time` (`log_namespace`,`log_title`,`log_timestamp`),
- KEY `times` (`log_timestamp`),
- KEY `log_user_type_time` (`log_user`,`log_type`,`log_timestamp`),
- KEY `log_page_id_time` (`log_page`,`log_timestamp`)
-) ENGINE=InnoDB DEFAULT CHARSET=latin1;
-/*!40101 SET character_set_client = @saved_cs_client */;
-
---
--- Dumping data for table `mw_logging`
---
-
-LOCK TABLES `mw_logging` WRITE;
-/*!40000 ALTER TABLE `mw_logging` DISABLE KEYS */;
-/*!40000 ALTER TABLE `mw_logging` ENABLE KEYS */;
-UNLOCK TABLES;
-
---
--- Table structure for table `mw_math`
---
-
-DROP TABLE IF EXISTS `mw_math`;
-/*!40101 SET @saved_cs_client = @@character_set_client */;
-/*!40101 SET character_set_client = utf8 */;
-CREATE TABLE `mw_math` (
- `math_inputhash` varbinary(16) NOT NULL,
- `math_outputhash` varbinary(16) NOT NULL,
- `math_html_conservativeness` tinyint(4) NOT NULL,
- `math_html` text,
- `math_mathml` text,
- UNIQUE KEY `math_inputhash` (`math_inputhash`)
-) ENGINE=InnoDB DEFAULT CHARSET=latin1;
-/*!40101 SET character_set_client = @saved_cs_client */;
-
---
--- Dumping data for table `mw_math`
---
-
-LOCK TABLES `mw_math` WRITE;
-/*!40000 ALTER TABLE `mw_math` DISABLE KEYS */;
-/*!40000 ALTER TABLE `mw_math` ENABLE KEYS */;
-UNLOCK TABLES;
-
---
--- Table structure for table `mw_module_deps`
---
-
-DROP TABLE IF EXISTS `mw_module_deps`;
-/*!40101 SET @saved_cs_client = @@character_set_client */;
-/*!40101 SET character_set_client = utf8 */;
-CREATE TABLE `mw_module_deps` (
- `md_module` varbinary(255) NOT NULL,
- `md_skin` varbinary(32) NOT NULL,
- `md_deps` mediumblob NOT NULL,
- UNIQUE KEY `md_module_skin` (`md_module`,`md_skin`)
-) ENGINE=InnoDB DEFAULT CHARSET=latin1;
-/*!40101 SET character_set_client = @saved_cs_client */;
-
---
--- Dumping data for table `mw_module_deps`
---
-
-LOCK TABLES `mw_module_deps` WRITE;
-/*!40000 ALTER TABLE `mw_module_deps` DISABLE KEYS */;
-/*!40000 ALTER TABLE `mw_module_deps` ENABLE KEYS */;
-UNLOCK TABLES;
-
---
--- Table structure for table `mw_msg_resource`
---
-
-DROP TABLE IF EXISTS `mw_msg_resource`;
-/*!40101 SET @saved_cs_client = @@character_set_client */;
-/*!40101 SET character_set_client = utf8 */;
-CREATE TABLE `mw_msg_resource` (
- `mr_resource` varbinary(255) NOT NULL,
- `mr_lang` varbinary(32) NOT NULL,
- `mr_blob` mediumblob NOT NULL,
- `mr_timestamp` binary(14) NOT NULL,
- UNIQUE KEY `mr_resource_lang` (`mr_resource`,`mr_lang`)
-) ENGINE=InnoDB DEFAULT CHARSET=latin1;
-/*!40101 SET character_set_client = @saved_cs_client */;
-
---
--- Dumping data for table `mw_msg_resource`
---
-
-LOCK TABLES `mw_msg_resource` WRITE;
-/*!40000 ALTER TABLE `mw_msg_resource` DISABLE KEYS */;
-/*!40000 ALTER TABLE `mw_msg_resource` ENABLE KEYS */;
-UNLOCK TABLES;
-
---
--- Table structure for table `mw_msg_resource_links`
---
-
-DROP TABLE IF EXISTS `mw_msg_resource_links`;
-/*!40101 SET @saved_cs_client = @@character_set_client */;
-/*!40101 SET character_set_client = utf8 */;
-CREATE TABLE `mw_msg_resource_links` (
- `mrl_resource` varbinary(255) NOT NULL,
- `mrl_message` varbinary(255) NOT NULL,
- UNIQUE KEY `mrl_message_resource` (`mrl_message`,`mrl_resource`)
-) ENGINE=InnoDB DEFAULT CHARSET=latin1;
-/*!40101 SET character_set_client = @saved_cs_client */;
-
---
--- Dumping data for table `mw_msg_resource_links`
---
-
-LOCK TABLES `mw_msg_resource_links` WRITE;
-/*!40000 ALTER TABLE `mw_msg_resource_links` DISABLE KEYS */;
-/*!40000 ALTER TABLE `mw_msg_resource_links` ENABLE KEYS */;
-UNLOCK TABLES;
-
---
--- Table structure for table `mw_objectcache`
---
-
-DROP TABLE IF EXISTS `mw_objectcache`;
-/*!40101 SET @saved_cs_client = @@character_set_client */;
-/*!40101 SET character_set_client = utf8 */;
-CREATE TABLE `mw_objectcache` (
- `keyname` varbinary(255) NOT NULL DEFAULT '',
- `value` mediumblob,
- `exptime` datetime DEFAULT NULL,
- PRIMARY KEY (`keyname`),
- KEY `exptime` (`exptime`)
-) ENGINE=InnoDB DEFAULT CHARSET=latin1;
-/*!40101 SET character_set_client = @saved_cs_client */;
-
---
--- Dumping data for table `mw_objectcache`
---
-
-LOCK TABLES `mw_objectcache` WRITE;
-/*!40000 ALTER TABLE `mw_objectcache` DISABLE KEYS */;
-INSERT INTO `mw_objectcache` VALUES ('test_wiki-mw_:messages:en','K�2��.�2�R\ns\r\n���S�δ2��\0','2010-12-31 13:16:31');
-INSERT INTO `mw_objectcache` VALUES ('test_wiki-mw_:pcache:idhash:1-0!*!*!!en!*','�V[o�F�g~�����B��P��m)$TK�U��\0�����8$��9�a\rI�l��X>��ܹ�q�Sa,��ʕ� x��?[~ʃ|�.Z��$�8Y�\'�I�Y�K��-\04�U����J�\'&�uB)�:I������E�m�sk`�`k�Q�v��a���\rZ��t�0����+P%GE�ـ�JX;\n-s�P�@�B�b���8~�첒$��ea�υ��f��+���0[,�F�x��d�\'�z�0��BJ���=���J��c�\\��:��&B��T��\'��C��Fdÿ׆Fq����Gd����%8G�0��A�I��; Ô˜`�7�5�LI\r��(���{�c�����g+��8Qr�&�ͦ��A)�V��ЕPT��\\UƧtn��Z�e�SfJZ(V�P�}����0��O�N �=j�\\H� �y�\\�U[h]T:� ��bd��u��+�j%\'�6k��f:E�;�@Yך��4���Ȁ��q� ��Z�º6<b�3��TU(d��,\n���Y|�e�\'�5��T�fU�8}�\"��m���/���}Uk�9o��;����|*R?�n��� 3d��g1��y�\\f8gk�����w��=��:/Y7���ۋ�^<�Ō����v#���i����C�#��6\Z�.0�Ua$4�=\Z���;��4����Y=���5���:kpÎq��Ŧ4��X���C��qYßµ-��Lj�����D�f���� �:����(3t��14C��J�#����������WXT���Δy:�^�6�v�7����I�U�Ee��(�p0��ga�6Mj��Sc�,Ñ«@��ޅ+R����A��xÐ¥\'6���utÇ·bۛ��`j�8ؚ�G�IC<KS��5�|�krJ\ry�\\b3xP�����ua�@����$SS�`��tQ.gwW��\r@\'���w�� ��xZ(�>5{� ���dw�>�=J)\r�6t ��X����M���B�\n�ŖT����b>�qg���� 7� �z�n7��vwr�-%u�-Qi�iX1��Ne���A#�v��ӧ�3��?','2010-12-31 13:16:31');
-INSERT INTO `mw_objectcache` VALUES ('test_wiki-mw_:pcache:idoptions:1','E���@ D��`� \"v�ƣ��Wh��,�b�!�⭙7�L+�|}�t ��I�$�<���F\rpSl�4����OJN`\r\Z��� � ծ���)��PY��$�K����գ9�Vjp72��E���c�Wp�2��cVxu7�� ����p#�r=.���[>y)Zp��','2010-12-31 13:16:31');
-INSERT INTO `mw_objectcache` VALUES ('test_wiki-mw_:resourceloader:filter:minify-css:3832ee25d9c44988461f5f339b9b6a48','+�26�Rr�MM�LTH�ɩV\0�Z(��(3�(R�d\r\0','2038-01-19 03:14:07');
-INSERT INTO `mw_objectcache` VALUES ('test_wiki-mw_:resourceloader:filter:minify-css:aa0df16258ad99a1d249e796b5067ed9','+�2��Rr�MM�LTH�ɩN��K-�Q.,�L�NJ,R\0��s򋬔�\r���V�\Z\0','2038-01-19 03:14:07');
-INSERT INTO `mw_objectcache` VALUES ('test_wiki-mw_:resourceloader:filter:minify-js:22814eeadc9cf0a9ebcd844e14198e66','m��r�0 ��y ����r�&Qޡמ!\n�qQ�Xq;}���$��ވ� �c!]]].o5S�\n�)Fq ��L^��?�s�F�!�O�M\\�������\0���N��É���լ����:��-�j��F��{ۅ�G�\"i�� \Z�6�K����!��Y]=�F[�~ç«���䶃����`��9N�Ǵ���@�K��|z�?1�A��@J#_Ô�7\'�l�1) J�͵�).�3 z�f�T�A���Hњ�[#)�BzRA�7֌��\"T�*~SW���/P���B�Ŏ;\Z�ay�6����+U��?.$�6��-uT�v@h��s�&�����NØ¥b�fJ�~�]6��p��/q)�>�E�1��͔A\ne�L�g\ZE�`cW�����`fJ�E�a��>��b\n�ӑd�.u�do��[�\nt��b�+���l\Z?X*��Y�(�օ;�L�JqÅ¥É���d$�\"�WzG�-@b~+�#�kǞَ�Ƃ~������P)B ����q�Җ2���r�Rl����`z �4�����ÃX�m�;�XÝt;r.�sA��R��y)�kA�\nR�JT��J�U��*�W��_ߟ�4@�vt��f���>����x���','2038-01-19 03:14:07');
-INSERT INTO `mw_objectcache` VALUES ('test_wiki-mw_:resourceloader:filter:minify-js:dd9440c19c575629ac5ec90e489cf62e','+�21�R���Ԕ�����L���Ĕ�\"��ĒT�j��̒T%+���ĔJ�ZMk.%k\0','2038-01-19 03:14:07');
-/*!40000 ALTER TABLE `mw_objectcache` ENABLE KEYS */;
-UNLOCK TABLES;
-
---
--- Table structure for table `mw_oldimage`
---
-
-DROP TABLE IF EXISTS `mw_oldimage`;
-/*!40101 SET @saved_cs_client = @@character_set_client */;
-/*!40101 SET character_set_client = utf8 */;
-CREATE TABLE `mw_oldimage` (
- `oi_name` varchar(255) CHARACTER SET latin1 COLLATE latin1_bin NOT NULL DEFAULT '',
- `oi_archive_name` varchar(255) CHARACTER SET latin1 COLLATE latin1_bin NOT NULL DEFAULT '',
- `oi_size` int(10) unsigned NOT NULL DEFAULT '0',
- `oi_width` int(11) NOT NULL DEFAULT '0',
- `oi_height` int(11) NOT NULL DEFAULT '0',
- `oi_bits` int(11) NOT NULL DEFAULT '0',
- `oi_description` tinyblob NOT NULL,
- `oi_user` int(10) unsigned NOT NULL DEFAULT '0',
- `oi_user_text` varchar(255) CHARACTER SET latin1 COLLATE latin1_bin NOT NULL,
- `oi_timestamp` binary(14) NOT NULL DEFAULT '\0\0\0\0\0\0\0\0\0\0\0\0\0\0',
- `oi_metadata` mediumblob NOT NULL,
- `oi_media_type` enum('UNKNOWN','BITMAP','DRAWING','AUDIO','VIDEO','MULTIMEDIA','OFFICE','TEXT','EXECUTABLE','ARCHIVE') DEFAULT NULL,
- `oi_major_mime` enum('unknown','application','audio','image','text','video','message','model','multipart') NOT NULL DEFAULT 'unknown',
- `oi_minor_mime` varbinary(100) NOT NULL DEFAULT 'unknown',
- `oi_deleted` tinyint(3) unsigned NOT NULL DEFAULT '0',
- `oi_sha1` varbinary(32) NOT NULL DEFAULT '',
- KEY `oi_usertext_timestamp` (`oi_user_text`,`oi_timestamp`),
- KEY `oi_name_timestamp` (`oi_name`,`oi_timestamp`),
- KEY `oi_name_archive_name` (`oi_name`,`oi_archive_name`(14)),
- KEY `oi_sha1` (`oi_sha1`)
-) ENGINE=InnoDB DEFAULT CHARSET=latin1;
-/*!40101 SET character_set_client = @saved_cs_client */;
-
---
--- Dumping data for table `mw_oldimage`
---
-
-LOCK TABLES `mw_oldimage` WRITE;
-/*!40000 ALTER TABLE `mw_oldimage` DISABLE KEYS */;
-/*!40000 ALTER TABLE `mw_oldimage` ENABLE KEYS */;
-UNLOCK TABLES;
-
---
--- Table structure for table `mw_page`
---
-
-DROP TABLE IF EXISTS `mw_page`;
-/*!40101 SET @saved_cs_client = @@character_set_client */;
-/*!40101 SET character_set_client = utf8 */;
-CREATE TABLE `mw_page` (
- `page_id` int(10) unsigned NOT NULL AUTO_INCREMENT,
- `page_namespace` int(11) NOT NULL,
- `page_title` varchar(255) CHARACTER SET latin1 COLLATE latin1_bin NOT NULL,
- `page_restrictions` tinyblob NOT NULL,
- `page_counter` bigint(20) unsigned NOT NULL DEFAULT '0',
- `page_is_redirect` tinyint(3) unsigned NOT NULL DEFAULT '0',
- `page_is_new` tinyint(3) unsigned NOT NULL DEFAULT '0',
- `page_random` double unsigned NOT NULL,
- `page_touched` binary(14) NOT NULL DEFAULT '\0\0\0\0\0\0\0\0\0\0\0\0\0\0',
- `page_latest` int(10) unsigned NOT NULL,
- `page_len` int(10) unsigned NOT NULL,
- PRIMARY KEY (`page_id`),
- UNIQUE KEY `name_title` (`page_namespace`,`page_title`),
- KEY `page_random` (`page_random`),
- KEY `page_len` (`page_len`)
-) ENGINE=InnoDB AUTO_INCREMENT=2 DEFAULT CHARSET=latin1;
-/*!40101 SET character_set_client = @saved_cs_client */;
-
---
--- Dumping data for table `mw_page`
---
-
-LOCK TABLES `mw_page` WRITE;
-/*!40000 ALTER TABLE `mw_page` DISABLE KEYS */;
-INSERT INTO `mw_page` VALUES (1,0,'Main_Page','',1,0,1,0.334989576352,'20101230131547',1,438);
-/*!40000 ALTER TABLE `mw_page` ENABLE KEYS */;
-UNLOCK TABLES;
-
---
--- Table structure for table `mw_page_props`
---
-
-DROP TABLE IF EXISTS `mw_page_props`;
-/*!40101 SET @saved_cs_client = @@character_set_client */;
-/*!40101 SET character_set_client = utf8 */;
-CREATE TABLE `mw_page_props` (
- `pp_page` int(11) NOT NULL,
- `pp_propname` varbinary(60) NOT NULL,
- `pp_value` blob NOT NULL,
- UNIQUE KEY `pp_page_propname` (`pp_page`,`pp_propname`)
-) ENGINE=InnoDB DEFAULT CHARSET=latin1;
-/*!40101 SET character_set_client = @saved_cs_client */;
-
---
--- Dumping data for table `mw_page_props`
---
-
-LOCK TABLES `mw_page_props` WRITE;
-/*!40000 ALTER TABLE `mw_page_props` DISABLE KEYS */;
-/*!40000 ALTER TABLE `mw_page_props` ENABLE KEYS */;
-UNLOCK TABLES;
-
---
--- Table structure for table `mw_page_restrictions`
---
-
-DROP TABLE IF EXISTS `mw_page_restrictions`;
-/*!40101 SET @saved_cs_client = @@character_set_client */;
-/*!40101 SET character_set_client = utf8 */;
-CREATE TABLE `mw_page_restrictions` (
- `pr_page` int(11) NOT NULL,
- `pr_type` varbinary(60) NOT NULL,
- `pr_level` varbinary(60) NOT NULL,
- `pr_cascade` tinyint(4) NOT NULL,
- `pr_user` int(11) DEFAULT NULL,
- `pr_expiry` varbinary(14) DEFAULT NULL,
- `pr_id` int(10) unsigned NOT NULL AUTO_INCREMENT,
- PRIMARY KEY (`pr_id`),
- UNIQUE KEY `pr_pagetype` (`pr_page`,`pr_type`),
- KEY `pr_typelevel` (`pr_type`,`pr_level`),
- KEY `pr_level` (`pr_level`),
- KEY `pr_cascade` (`pr_cascade`)
-) ENGINE=InnoDB DEFAULT CHARSET=latin1;
-/*!40101 SET character_set_client = @saved_cs_client */;
-
---
--- Dumping data for table `mw_page_restrictions`
---
-
-LOCK TABLES `mw_page_restrictions` WRITE;
-/*!40000 ALTER TABLE `mw_page_restrictions` DISABLE KEYS */;
-/*!40000 ALTER TABLE `mw_page_restrictions` ENABLE KEYS */;
-UNLOCK TABLES;
-
---
--- Table structure for table `mw_pagelinks`
---
-
-DROP TABLE IF EXISTS `mw_pagelinks`;
-/*!40101 SET @saved_cs_client = @@character_set_client */;
-/*!40101 SET character_set_client = utf8 */;
-CREATE TABLE `mw_pagelinks` (
- `pl_from` int(10) unsigned NOT NULL DEFAULT '0',
- `pl_namespace` int(11) NOT NULL DEFAULT '0',
- `pl_title` varchar(255) CHARACTER SET latin1 COLLATE latin1_bin NOT NULL DEFAULT '',
- UNIQUE KEY `pl_from` (`pl_from`,`pl_namespace`,`pl_title`),
- UNIQUE KEY `pl_namespace` (`pl_namespace`,`pl_title`,`pl_from`)
-) ENGINE=InnoDB DEFAULT CHARSET=latin1;
-/*!40101 SET character_set_client = @saved_cs_client */;
-
---
--- Dumping data for table `mw_pagelinks`
---
-
-LOCK TABLES `mw_pagelinks` WRITE;
-/*!40000 ALTER TABLE `mw_pagelinks` DISABLE KEYS */;
-/*!40000 ALTER TABLE `mw_pagelinks` ENABLE KEYS */;
-UNLOCK TABLES;
-
---
--- Table structure for table `mw_protected_titles`
---
-
-DROP TABLE IF EXISTS `mw_protected_titles`;
-/*!40101 SET @saved_cs_client = @@character_set_client */;
-/*!40101 SET character_set_client = utf8 */;
-CREATE TABLE `mw_protected_titles` (
- `pt_namespace` int(11) NOT NULL,
- `pt_title` varchar(255) CHARACTER SET latin1 COLLATE latin1_bin NOT NULL,
- `pt_user` int(10) unsigned NOT NULL,
- `pt_reason` tinyblob,
- `pt_timestamp` binary(14) NOT NULL,
- `pt_expiry` varbinary(14) NOT NULL DEFAULT '',
- `pt_create_perm` varbinary(60) NOT NULL,
- UNIQUE KEY `pt_namespace_title` (`pt_namespace`,`pt_title`),
- KEY `pt_timestamp` (`pt_timestamp`)
-) ENGINE=InnoDB DEFAULT CHARSET=latin1;
-/*!40101 SET character_set_client = @saved_cs_client */;
-
---
--- Dumping data for table `mw_protected_titles`
---
-
-LOCK TABLES `mw_protected_titles` WRITE;
-/*!40000 ALTER TABLE `mw_protected_titles` DISABLE KEYS */;
-/*!40000 ALTER TABLE `mw_protected_titles` ENABLE KEYS */;
-UNLOCK TABLES;
-
---
--- Table structure for table `mw_querycache`
---
-
-DROP TABLE IF EXISTS `mw_querycache`;
-/*!40101 SET @saved_cs_client = @@character_set_client */;
-/*!40101 SET character_set_client = utf8 */;
-CREATE TABLE `mw_querycache` (
- `qc_type` varbinary(32) NOT NULL,
- `qc_value` int(10) unsigned NOT NULL DEFAULT '0',
- `qc_namespace` int(11) NOT NULL DEFAULT '0',
- `qc_title` varchar(255) CHARACTER SET latin1 COLLATE latin1_bin NOT NULL DEFAULT '',
- KEY `qc_type` (`qc_type`,`qc_value`)
-) ENGINE=InnoDB DEFAULT CHARSET=latin1;
-/*!40101 SET character_set_client = @saved_cs_client */;
-
---
--- Dumping data for table `mw_querycache`
---
-
-LOCK TABLES `mw_querycache` WRITE;
-/*!40000 ALTER TABLE `mw_querycache` DISABLE KEYS */;
-/*!40000 ALTER TABLE `mw_querycache` ENABLE KEYS */;
-UNLOCK TABLES;
-
---
--- Table structure for table `mw_querycache_info`
---
-
-DROP TABLE IF EXISTS `mw_querycache_info`;
-/*!40101 SET @saved_cs_client = @@character_set_client */;
-/*!40101 SET character_set_client = utf8 */;
-CREATE TABLE `mw_querycache_info` (
- `qci_type` varbinary(32) NOT NULL DEFAULT '',
- `qci_timestamp` binary(14) NOT NULL DEFAULT '19700101000000',
- UNIQUE KEY `qci_type` (`qci_type`)
-) ENGINE=InnoDB DEFAULT CHARSET=latin1;
-/*!40101 SET character_set_client = @saved_cs_client */;
-
---
--- Dumping data for table `mw_querycache_info`
---
-
-LOCK TABLES `mw_querycache_info` WRITE;
-/*!40000 ALTER TABLE `mw_querycache_info` DISABLE KEYS */;
-/*!40000 ALTER TABLE `mw_querycache_info` ENABLE KEYS */;
-UNLOCK TABLES;
-
---
--- Table structure for table `mw_querycachetwo`
---
-
-DROP TABLE IF EXISTS `mw_querycachetwo`;
-/*!40101 SET @saved_cs_client = @@character_set_client */;
-/*!40101 SET character_set_client = utf8 */;
-CREATE TABLE `mw_querycachetwo` (
- `qcc_type` varbinary(32) NOT NULL,
- `qcc_value` int(10) unsigned NOT NULL DEFAULT '0',
- `qcc_namespace` int(11) NOT NULL DEFAULT '0',
- `qcc_title` varchar(255) CHARACTER SET latin1 COLLATE latin1_bin NOT NULL DEFAULT '',
- `qcc_namespacetwo` int(11) NOT NULL DEFAULT '0',
- `qcc_titletwo` varchar(255) CHARACTER SET latin1 COLLATE latin1_bin NOT NULL DEFAULT '',
- KEY `qcc_type` (`qcc_type`,`qcc_value`),
- KEY `qcc_title` (`qcc_type`,`qcc_namespace`,`qcc_title`),
- KEY `qcc_titletwo` (`qcc_type`,`qcc_namespacetwo`,`qcc_titletwo`)
-) ENGINE=InnoDB DEFAULT CHARSET=latin1;
-/*!40101 SET character_set_client = @saved_cs_client */;
-
---
--- Dumping data for table `mw_querycachetwo`
---
-
-LOCK TABLES `mw_querycachetwo` WRITE;
-/*!40000 ALTER TABLE `mw_querycachetwo` DISABLE KEYS */;
-/*!40000 ALTER TABLE `mw_querycachetwo` ENABLE KEYS */;
-UNLOCK TABLES;
-
---
--- Table structure for table `mw_recentchanges`
---
-
-DROP TABLE IF EXISTS `mw_recentchanges`;
-/*!40101 SET @saved_cs_client = @@character_set_client */;
-/*!40101 SET character_set_client = utf8 */;
-CREATE TABLE `mw_recentchanges` (
- `rc_id` int(11) NOT NULL AUTO_INCREMENT,
- `rc_timestamp` varbinary(14) NOT NULL DEFAULT '',
- `rc_cur_time` varbinary(14) NOT NULL DEFAULT '',
- `rc_user` int(10) unsigned NOT NULL DEFAULT '0',
- `rc_user_text` varchar(255) CHARACTER SET latin1 COLLATE latin1_bin NOT NULL,
- `rc_namespace` int(11) NOT NULL DEFAULT '0',
- `rc_title` varchar(255) CHARACTER SET latin1 COLLATE latin1_bin NOT NULL DEFAULT '',
- `rc_comment` varchar(255) CHARACTER SET latin1 COLLATE latin1_bin 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) CHARACTER SET latin1 COLLATE latin1_bin NOT NULL DEFAULT '',
- `rc_patrolled` tinyint(3) unsigned NOT NULL DEFAULT '0',
- `rc_ip` varbinary(40) NOT NULL DEFAULT '',
- `rc_old_len` int(11) DEFAULT NULL,
- `rc_new_len` int(11) DEFAULT NULL,
- `rc_deleted` tinyint(3) unsigned NOT NULL DEFAULT '0',
- `rc_logid` int(10) unsigned NOT NULL DEFAULT '0',
- `rc_log_type` varbinary(255) DEFAULT NULL,
- `rc_log_action` varbinary(255) DEFAULT NULL,
- `rc_params` blob,
- PRIMARY KEY (`rc_id`),
- KEY `rc_timestamp` (`rc_timestamp`),
- KEY `rc_namespace_title` (`rc_namespace`,`rc_title`),
- KEY `rc_cur_id` (`rc_cur_id`),
- KEY `new_name_timestamp` (`rc_new`,`rc_namespace`,`rc_timestamp`),
- KEY `rc_ip` (`rc_ip`),
- KEY `rc_ns_usertext` (`rc_namespace`,`rc_user_text`),
- KEY `rc_user_text` (`rc_user_text`,`rc_timestamp`)
-) ENGINE=InnoDB AUTO_INCREMENT=2 DEFAULT CHARSET=latin1;
-/*!40101 SET character_set_client = @saved_cs_client */;
-
---
--- Dumping data for table `mw_recentchanges`
---
-
-LOCK TABLES `mw_recentchanges` WRITE;
-/*!40000 ALTER TABLE `mw_recentchanges` DISABLE KEYS */;
-INSERT INTO `mw_recentchanges` VALUES (1,'20101230131547','20101230131547',0,'MediaWiki Default',0,'Main_Page','',0,0,1,1,1,0,1,0,'',0,'::1',0,438,0,0,NULL,'','');
-/*!40000 ALTER TABLE `mw_recentchanges` ENABLE KEYS */;
-UNLOCK TABLES;
-
---
--- Table structure for table `mw_redirect`
---
-
-DROP TABLE IF EXISTS `mw_redirect`;
-/*!40101 SET @saved_cs_client = @@character_set_client */;
-/*!40101 SET character_set_client = utf8 */;
-CREATE TABLE `mw_redirect` (
- `rd_from` int(10) unsigned NOT NULL DEFAULT '0',
- `rd_namespace` int(11) NOT NULL DEFAULT '0',
- `rd_title` varchar(255) CHARACTER SET latin1 COLLATE latin1_bin NOT NULL DEFAULT '',
- `rd_interwiki` varchar(32) DEFAULT NULL,
- `rd_fragment` varchar(255) CHARACTER SET latin1 COLLATE latin1_bin DEFAULT NULL,
- PRIMARY KEY (`rd_from`),
- KEY `rd_ns_title` (`rd_namespace`,`rd_title`,`rd_from`)
-) ENGINE=InnoDB DEFAULT CHARSET=latin1;
-/*!40101 SET character_set_client = @saved_cs_client */;
-
---
--- Dumping data for table `mw_redirect`
---
-
-LOCK TABLES `mw_redirect` WRITE;
-/*!40000 ALTER TABLE `mw_redirect` DISABLE KEYS */;
-/*!40000 ALTER TABLE `mw_redirect` ENABLE KEYS */;
-UNLOCK TABLES;
-
---
--- Table structure for table `mw_revision`
---
-
-DROP TABLE IF EXISTS `mw_revision`;
-/*!40101 SET @saved_cs_client = @@character_set_client */;
-/*!40101 SET character_set_client = utf8 */;
-CREATE TABLE `mw_revision` (
- `rev_id` int(10) unsigned NOT NULL AUTO_INCREMENT,
- `rev_page` int(10) unsigned NOT NULL,
- `rev_text_id` int(10) unsigned NOT NULL,
- `rev_comment` tinyblob NOT NULL,
- `rev_user` int(10) unsigned NOT NULL DEFAULT '0',
- `rev_user_text` varchar(255) CHARACTER SET latin1 COLLATE latin1_bin NOT NULL DEFAULT '',
- `rev_timestamp` binary(14) NOT NULL DEFAULT '\0\0\0\0\0\0\0\0\0\0\0\0\0\0',
- `rev_minor_edit` tinyint(3) unsigned NOT NULL DEFAULT '0',
- `rev_deleted` tinyint(3) unsigned NOT NULL DEFAULT '0',
- `rev_len` int(10) unsigned DEFAULT NULL,
- `rev_parent_id` int(10) unsigned DEFAULT NULL,
- PRIMARY KEY (`rev_id`),
- UNIQUE KEY `rev_page_id` (`rev_page`,`rev_id`),
- KEY `rev_timestamp` (`rev_timestamp`),
- KEY `page_timestamp` (`rev_page`,`rev_timestamp`),
- KEY `user_timestamp` (`rev_user`,`rev_timestamp`),
- KEY `usertext_timestamp` (`rev_user_text`,`rev_timestamp`)
-) ENGINE=InnoDB AUTO_INCREMENT=2 DEFAULT CHARSET=latin1 MAX_ROWS=10000000 AVG_ROW_LENGTH=1024;
-/*!40101 SET character_set_client = @saved_cs_client */;
-
---
--- Dumping data for table `mw_revision`
---
-
-LOCK TABLES `mw_revision` WRITE;
-/*!40000 ALTER TABLE `mw_revision` DISABLE KEYS */;
-INSERT INTO `mw_revision` VALUES (1,1,1,'',0,'MediaWiki Default','20101230131547',0,0,438,0);
-/*!40000 ALTER TABLE `mw_revision` ENABLE KEYS */;
-UNLOCK TABLES;
-
---
--- Table structure for table `mw_searchindex`
---
-
-DROP TABLE IF EXISTS `mw_searchindex`;
-/*!40101 SET @saved_cs_client = @@character_set_client */;
-/*!40101 SET character_set_client = utf8 */;
-CREATE TABLE `mw_searchindex` (
- `si_page` int(10) unsigned NOT NULL,
- `si_title` varchar(255) NOT NULL DEFAULT '',
- `si_text` mediumtext NOT NULL,
- UNIQUE KEY `si_page` (`si_page`),
- FULLTEXT KEY `si_title` (`si_title`),
- FULLTEXT KEY `si_text` (`si_text`)
-) ENGINE=MyISAM DEFAULT CHARSET=latin1;
-/*!40101 SET character_set_client = @saved_cs_client */;
-
---
--- Dumping data for table `mw_searchindex`
---
-
-LOCK TABLES `mw_searchindex` WRITE;
-/*!40000 ALTER TABLE `mw_searchindex` DISABLE KEYS */;
-INSERT INTO `mw_searchindex` VALUES (1,'main page',' mediawiki hasu800 been successfully installed. consult theu800 user user\'su800 guide foru800 information onu800 using theu800 wiki software. getting started getting started getting started configuration settings list mediawiki faqu800 mediawiki release mailing list ');
-/*!40000 ALTER TABLE `mw_searchindex` ENABLE KEYS */;
-UNLOCK TABLES;
-
---
--- Table structure for table `mw_site_stats`
---
-
-DROP TABLE IF EXISTS `mw_site_stats`;
-/*!40101 SET @saved_cs_client = @@character_set_client */;
-/*!40101 SET character_set_client = utf8 */;
-CREATE TABLE `mw_site_stats` (
- `ss_row_id` int(10) unsigned NOT NULL,
- `ss_total_views` bigint(20) unsigned DEFAULT '0',
- `ss_total_edits` bigint(20) unsigned DEFAULT '0',
- `ss_good_articles` bigint(20) unsigned DEFAULT '0',
- `ss_total_pages` bigint(20) DEFAULT '-1',
- `ss_users` bigint(20) DEFAULT '-1',
- `ss_active_users` bigint(20) DEFAULT '-1',
- `ss_admins` int(11) DEFAULT '-1',
- `ss_images` int(11) DEFAULT '0',
- UNIQUE KEY `ss_row_id` (`ss_row_id`)
-) ENGINE=InnoDB DEFAULT CHARSET=latin1;
-/*!40101 SET character_set_client = @saved_cs_client */;
-
---
--- Dumping data for table `mw_site_stats`
---
-
-LOCK TABLES `mw_site_stats` WRITE;
-/*!40000 ALTER TABLE `mw_site_stats` DISABLE KEYS */;
-/*!40000 ALTER TABLE `mw_site_stats` ENABLE KEYS */;
-UNLOCK TABLES;
-
---
--- Table structure for table `mw_tag_summary`
---
-
-DROP TABLE IF EXISTS `mw_tag_summary`;
-/*!40101 SET @saved_cs_client = @@character_set_client */;
-/*!40101 SET character_set_client = utf8 */;
-CREATE TABLE `mw_tag_summary` (
- `ts_rc_id` int(11) DEFAULT NULL,
- `ts_log_id` int(11) DEFAULT NULL,
- `ts_rev_id` int(11) DEFAULT NULL,
- `ts_tags` blob NOT NULL,
- UNIQUE KEY `tag_summary_rc_id` (`ts_rc_id`),
- UNIQUE KEY `tag_summary_log_id` (`ts_log_id`),
- UNIQUE KEY `tag_summary_rev_id` (`ts_rev_id`)
-) ENGINE=InnoDB DEFAULT CHARSET=latin1;
-/*!40101 SET character_set_client = @saved_cs_client */;
-
---
--- Dumping data for table `mw_tag_summary`
---
-
-LOCK TABLES `mw_tag_summary` WRITE;
-/*!40000 ALTER TABLE `mw_tag_summary` DISABLE KEYS */;
-/*!40000 ALTER TABLE `mw_tag_summary` ENABLE KEYS */;
-UNLOCK TABLES;
-
---
--- Table structure for table `mw_templatelinks`
---
-
-DROP TABLE IF EXISTS `mw_templatelinks`;
-/*!40101 SET @saved_cs_client = @@character_set_client */;
-/*!40101 SET character_set_client = utf8 */;
-CREATE TABLE `mw_templatelinks` (
- `tl_from` int(10) unsigned NOT NULL DEFAULT '0',
- `tl_namespace` int(11) NOT NULL DEFAULT '0',
- `tl_title` varchar(255) CHARACTER SET latin1 COLLATE latin1_bin NOT NULL DEFAULT '',
- UNIQUE KEY `tl_from` (`tl_from`,`tl_namespace`,`tl_title`),
- UNIQUE KEY `tl_namespace` (`tl_namespace`,`tl_title`,`tl_from`)
-) ENGINE=InnoDB DEFAULT CHARSET=latin1;
-/*!40101 SET character_set_client = @saved_cs_client */;
-
---
--- Dumping data for table `mw_templatelinks`
---
-
-LOCK TABLES `mw_templatelinks` WRITE;
-/*!40000 ALTER TABLE `mw_templatelinks` DISABLE KEYS */;
-/*!40000 ALTER TABLE `mw_templatelinks` ENABLE KEYS */;
-UNLOCK TABLES;
-
---
--- Table structure for table `mw_text`
---
-
-DROP TABLE IF EXISTS `mw_text`;
-/*!40101 SET @saved_cs_client = @@character_set_client */;
-/*!40101 SET character_set_client = utf8 */;
-CREATE TABLE `mw_text` (
- `old_id` int(10) unsigned NOT NULL AUTO_INCREMENT,
- `old_text` mediumblob NOT NULL,
- `old_flags` tinyblob NOT NULL,
- PRIMARY KEY (`old_id`)
-) ENGINE=InnoDB AUTO_INCREMENT=2 DEFAULT CHARSET=latin1 MAX_ROWS=10000000 AVG_ROW_LENGTH=10240;
-/*!40101 SET character_set_client = @saved_cs_client */;
-
---
--- Dumping data for table `mw_text`
---
-
-LOCK TABLES `mw_text` WRITE;
-/*!40000 ALTER TABLE `mw_text` DISABLE KEYS */;
-INSERT INTO `mw_text` VALUES (1,'\'\'\'MediaWiki has been successfully installed.\'\'\'\n\nConsult the [http://meta.wikimedia.org/wiki/Help:Contents User\'s Guide] for information on using the wiki software.\n\n== Getting started ==\n* [http://www.mediawiki.org/wiki/Manual:Configuration_settings Configuration settings list]\n* [http://www.mediawiki.org/wiki/Manual:FAQ MediaWiki FAQ]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce MediaWiki release mailing list]','utf-8');
-/*!40000 ALTER TABLE `mw_text` ENABLE KEYS */;
-UNLOCK TABLES;
-
---
--- Table structure for table `mw_trackbacks`
---
-
-DROP TABLE IF EXISTS `mw_trackbacks`;
-/*!40101 SET @saved_cs_client = @@character_set_client */;
-/*!40101 SET character_set_client = utf8 */;
-CREATE TABLE `mw_trackbacks` (
- `tb_id` int(11) NOT NULL AUTO_INCREMENT,
- `tb_page` int(11) DEFAULT NULL,
- `tb_title` varchar(255) NOT NULL,
- `tb_url` blob NOT NULL,
- `tb_ex` text,
- `tb_name` varchar(255) DEFAULT NULL,
- PRIMARY KEY (`tb_id`),
- KEY `tb_page` (`tb_page`)
-) ENGINE=InnoDB DEFAULT CHARSET=latin1;
-/*!40101 SET character_set_client = @saved_cs_client */;
-
---
--- Dumping data for table `mw_trackbacks`
---
-
-LOCK TABLES `mw_trackbacks` WRITE;
-/*!40000 ALTER TABLE `mw_trackbacks` DISABLE KEYS */;
-/*!40000 ALTER TABLE `mw_trackbacks` ENABLE KEYS */;
-UNLOCK TABLES;
-
---
--- Table structure for table `mw_transcache`
---
-
-DROP TABLE IF EXISTS `mw_transcache`;
-/*!40101 SET @saved_cs_client = @@character_set_client */;
-/*!40101 SET character_set_client = utf8 */;
-CREATE TABLE `mw_transcache` (
- `tc_url` varbinary(255) NOT NULL,
- `tc_contents` text,
- `tc_time` binary(14) NOT NULL,
- UNIQUE KEY `tc_url_idx` (`tc_url`)
-) ENGINE=InnoDB DEFAULT CHARSET=latin1;
-/*!40101 SET character_set_client = @saved_cs_client */;
-
---
--- Dumping data for table `mw_transcache`
---
-
-LOCK TABLES `mw_transcache` WRITE;
-/*!40000 ALTER TABLE `mw_transcache` DISABLE KEYS */;
-/*!40000 ALTER TABLE `mw_transcache` ENABLE KEYS */;
-UNLOCK TABLES;
-
---
--- Table structure for table `mw_updatelog`
---
-
-DROP TABLE IF EXISTS `mw_updatelog`;
-/*!40101 SET @saved_cs_client = @@character_set_client */;
-/*!40101 SET character_set_client = utf8 */;
-CREATE TABLE `mw_updatelog` (
- `ul_key` varchar(255) NOT NULL,
- `ul_value` blob,
- PRIMARY KEY (`ul_key`)
-) ENGINE=InnoDB DEFAULT CHARSET=latin1;
-/*!40101 SET character_set_client = @saved_cs_client */;
-
---
--- Dumping data for table `mw_updatelog`
---
-
-LOCK TABLES `mw_updatelog` WRITE;
-/*!40000 ALTER TABLE `mw_updatelog` DISABLE KEYS */;
-/*!40000 ALTER TABLE `mw_updatelog` ENABLE KEYS */;
-UNLOCK TABLES;
-
---
--- Table structure for table `mw_user`
---
-
-DROP TABLE IF EXISTS `mw_user`;
-/*!40101 SET @saved_cs_client = @@character_set_client */;
-/*!40101 SET character_set_client = utf8 */;
-CREATE TABLE `mw_user` (
- `user_id` int(10) unsigned NOT NULL AUTO_INCREMENT,
- `user_name` varchar(255) CHARACTER SET latin1 COLLATE latin1_bin NOT NULL DEFAULT '',
- `user_real_name` varchar(255) CHARACTER SET latin1 COLLATE latin1_bin NOT NULL DEFAULT '',
- `user_password` tinyblob NOT NULL,
- `user_newpassword` tinyblob NOT NULL,
- `user_newpass_time` binary(14) DEFAULT NULL,
- `user_email` tinytext NOT NULL,
- `user_touched` binary(14) NOT NULL DEFAULT '\0\0\0\0\0\0\0\0\0\0\0\0\0\0',
- `user_token` binary(32) NOT NULL DEFAULT '\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0',
- `user_email_authenticated` binary(14) DEFAULT NULL,
- `user_email_token` binary(32) DEFAULT NULL,
- `user_email_token_expires` binary(14) DEFAULT NULL,
- `user_registration` binary(14) DEFAULT NULL,
- `user_editcount` int(11) DEFAULT NULL,
- PRIMARY KEY (`user_id`),
- UNIQUE KEY `user_name` (`user_name`),
- KEY `user_email_token` (`user_email_token`)
-) ENGINE=InnoDB AUTO_INCREMENT=2 DEFAULT CHARSET=latin1;
-/*!40101 SET character_set_client = @saved_cs_client */;
-
---
--- Dumping data for table `mw_user`
---
-
-LOCK TABLES `mw_user` WRITE;
-/*!40000 ALTER TABLE `mw_user` DISABLE KEYS */;
-INSERT INTO `mw_user` VALUES (1,'WikiSysop','',':B:b1373470:f7e87db0c9596055f39a1225b0c31508','',NULL,'','','20101230131552','de4ddde7c4eef6e3609f4287324a0a18',NULL,'\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0',NULL,'20101230131547',0);
-/*!40000 ALTER TABLE `mw_user` ENABLE KEYS */;
-UNLOCK TABLES;
-
---
--- Table structure for table `mw_user_groups`
---
-
-DROP TABLE IF EXISTS `mw_user_groups`;
-/*!40101 SET @saved_cs_client = @@character_set_client */;
-/*!40101 SET character_set_client = utf8 */;
-CREATE TABLE `mw_user_groups` (
- `ug_user` int(10) unsigned NOT NULL DEFAULT '0',
- `ug_group` varbinary(16) NOT NULL DEFAULT '',
- UNIQUE KEY `ug_user_group` (`ug_user`,`ug_group`),
- KEY `ug_group` (`ug_group`)
-) ENGINE=InnoDB DEFAULT CHARSET=latin1;
-/*!40101 SET character_set_client = @saved_cs_client */;
-
---
--- Dumping data for table `mw_user_groups`
---
-
-LOCK TABLES `mw_user_groups` WRITE;
-/*!40000 ALTER TABLE `mw_user_groups` DISABLE KEYS */;
-INSERT INTO `mw_user_groups` VALUES (1,'bureaucrat');
-INSERT INTO `mw_user_groups` VALUES (1,'sysop');
-/*!40000 ALTER TABLE `mw_user_groups` ENABLE KEYS */;
-UNLOCK TABLES;
-
---
--- Table structure for table `mw_user_newtalk`
---
-
-DROP TABLE IF EXISTS `mw_user_newtalk`;
-/*!40101 SET @saved_cs_client = @@character_set_client */;
-/*!40101 SET character_set_client = utf8 */;
-CREATE TABLE `mw_user_newtalk` (
- `user_id` int(11) NOT NULL DEFAULT '0',
- `user_ip` varbinary(40) NOT NULL DEFAULT '',
- `user_last_timestamp` binary(14) NOT NULL DEFAULT '\0\0\0\0\0\0\0\0\0\0\0\0\0\0',
- KEY `user_id` (`user_id`),
- KEY `user_ip` (`user_ip`)
-) ENGINE=InnoDB DEFAULT CHARSET=latin1;
-/*!40101 SET character_set_client = @saved_cs_client */;
-
---
--- Dumping data for table `mw_user_newtalk`
---
-
-LOCK TABLES `mw_user_newtalk` WRITE;
-/*!40000 ALTER TABLE `mw_user_newtalk` DISABLE KEYS */;
-/*!40000 ALTER TABLE `mw_user_newtalk` ENABLE KEYS */;
-UNLOCK TABLES;
-
---
--- Table structure for table `mw_user_properties`
---
-
-DROP TABLE IF EXISTS `mw_user_properties`;
-/*!40101 SET @saved_cs_client = @@character_set_client */;
-/*!40101 SET character_set_client = utf8 */;
-CREATE TABLE `mw_user_properties` (
- `up_user` int(11) NOT NULL,
- `up_property` varbinary(32) NOT NULL,
- `up_value` blob,
- UNIQUE KEY `user_properties_user_property` (`up_user`,`up_property`),
- KEY `user_properties_property` (`up_property`)
-) ENGINE=InnoDB DEFAULT CHARSET=latin1;
-/*!40101 SET character_set_client = @saved_cs_client */;
-
---
--- Dumping data for table `mw_user_properties`
---
-
-LOCK TABLES `mw_user_properties` WRITE;
-/*!40000 ALTER TABLE `mw_user_properties` DISABLE KEYS */;
-/*!40000 ALTER TABLE `mw_user_properties` ENABLE KEYS */;
-UNLOCK TABLES;
-
---
--- Table structure for table `mw_valid_tag`
---
-
-DROP TABLE IF EXISTS `mw_valid_tag`;
-/*!40101 SET @saved_cs_client = @@character_set_client */;
-/*!40101 SET character_set_client = utf8 */;
-CREATE TABLE `mw_valid_tag` (
- `vt_tag` varchar(255) NOT NULL,
- PRIMARY KEY (`vt_tag`)
-) ENGINE=InnoDB DEFAULT CHARSET=latin1;
-/*!40101 SET character_set_client = @saved_cs_client */;
-
---
--- Dumping data for table `mw_valid_tag`
---
-
-LOCK TABLES `mw_valid_tag` WRITE;
-/*!40000 ALTER TABLE `mw_valid_tag` DISABLE KEYS */;
-/*!40000 ALTER TABLE `mw_valid_tag` ENABLE KEYS */;
-UNLOCK TABLES;
-
---
--- Table structure for table `mw_watchlist`
---
-
-DROP TABLE IF EXISTS `mw_watchlist`;
-/*!40101 SET @saved_cs_client = @@character_set_client */;
-/*!40101 SET character_set_client = utf8 */;
-CREATE TABLE `mw_watchlist` (
- `wl_user` int(10) unsigned NOT NULL,
- `wl_namespace` int(11) NOT NULL DEFAULT '0',
- `wl_title` varchar(255) CHARACTER SET latin1 COLLATE latin1_bin NOT NULL DEFAULT '',
- `wl_notificationtimestamp` varbinary(14) DEFAULT NULL,
- UNIQUE KEY `wl_user` (`wl_user`,`wl_namespace`,`wl_title`),
- KEY `namespace_title` (`wl_namespace`,`wl_title`)
-) ENGINE=InnoDB DEFAULT CHARSET=latin1;
-/*!40101 SET character_set_client = @saved_cs_client */;
-
---
--- Dumping data for table `mw_watchlist`
---
-
-LOCK TABLES `mw_watchlist` WRITE;
-/*!40000 ALTER TABLE `mw_watchlist` DISABLE KEYS */;
-/*!40000 ALTER TABLE `mw_watchlist` ENABLE KEYS */;
-UNLOCK TABLES;
-/*!40103 SET TIME_ZONE=@OLD_TIME_ZONE */;
-
-/*!40101 SET SQL_MODE=@OLD_SQL_MODE */;
-/*!40014 SET FOREIGN_KEY_CHECKS=@OLD_FOREIGN_KEY_CHECKS */;
-/*!40014 SET UNIQUE_CHECKS=@OLD_UNIQUE_CHECKS */;
-/*!40101 SET CHARACTER_SET_CLIENT=@OLD_CHARACTER_SET_CLIENT */;
-/*!40101 SET CHARACTER_SET_RESULTS=@OLD_CHARACTER_SET_RESULTS */;
-/*!40101 SET COLLATION_CONNECTION=@OLD_COLLATION_CONNECTION */;
-/*!40111 SET SQL_NOTES=@OLD_SQL_NOTES */;
-
--- Dump completed on 2010-12-31 1:20:11
diff --git a/tests/selenium/installer/MediaWikiButtonsAvailabilityTestCase.php b/tests/selenium/installer/MediaWikiButtonsAvailabilityTestCase.php
deleted file mode 100644
index 4583360d..00000000
--- a/tests/selenium/installer/MediaWikiButtonsAvailabilityTestCase.php
+++ /dev/null
@@ -1,90 +0,0 @@
-<?php
-/**
- * MediaWikiButtonsAvailabilityTestCase
- *
- * @file
- * @ingroup Maintenance
- * Copyright (C) 2010 Nadeesha Weerasinghe <nadeesha@calcey.com>
- * http://www.calcey.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.,
- * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
- * http://www.gnu.org/copyleft/gpl.html
- */
-
-require_once ( __DIR__ . '/MediaWikiInstallationCommonFunction.php' );
-
-/**
- * Test Case ID : 30 (http://www.mediawiki.org/wiki/New_installer/Test_plan)
- * Test Case Name :'Back' and 'Continue' button availability
- * Version : MediaWiki 1.18alpha
- */
-class MediaWikiButtonsAvailabilityTestCase extends MediaWikiInstallationCommonFunction {
- function setUp() {
- parent::setUp();
- }
-
- // Verify only 'Continue' button available on 'Language' page
- public function testOnlyContinueButtonAvailability() {
- parent::navigateLanguagePage();
-
- // Verify only 'Continue' button avaialble
- $this->assertTrue( $this->isElementPresent( "submit-continue" ) );
-
- // 'Back' button is not avaialble
- $this->assertElementNotPresent( "submit-back" );
- }
-
- // Verify 'Continue' and 'Back' buttons availability
- public function testBothButtonsAvailability() {
- // Verify buttons availability on 'Welcome to MediaWiki' page
- parent::navigateWelcometoMediaWikiPage();
- $this->assertTrue( $this->isElementPresent( "submit-back" ) );
- $this->assertTrue( $this->isElementPresent( "submit-continue" ) );
- parent::restartInstallation();
-
- // Verify buttons availability on 'Connect to Database' page
- parent::navigateConnetToDatabasePage();
- $this->assertTrue( $this->isElementPresent( "submit-back" ) );
- $this->assertTrue( $this->isElementPresent( "submit-continue" ) );
- parent::restartInstallation();
-
- // Verify buttons availability on 'Database settings' page
- $databaseName = DB_NAME_PREFIX . "_db_settings";
- parent::navigateDatabaseSettingsPage( $databaseName );
- $this->assertTrue( $this->isElementPresent( "submit-back" ) );
- $this->assertTrue( $this->isElementPresent( "submit-continue" ) );
- parent::restartInstallation();
-
- // Verify buttons availability on 'Name' page
- $databaseName = DB_NAME_PREFIX . "_name";
- parent::navigateNamePage( $databaseName );
- $this->assertTrue( $this->isElementPresent( "submit-back" ) );
- $this->assertTrue( $this->isElementPresent( "submit-continue" ) );
- parent::restartInstallation();
-
- // Verify buttons availability on 'Options' page
- $databaseName = DB_NAME_PREFIX . "_options";
- parent::navigateOptionsPage( $databaseName );
- $this->assertTrue( $this->isElementPresent( "submit-back" ) );
- $this->assertTrue( $this->isElementPresent( "submit-continue" ) );
- parent::restartInstallation();
-
- // Verify buttons availability on 'Install' page
- $databaseName = DB_NAME_PREFIX . "_install";
- parent::navigateInstallPage( $databaseName );
- $this->assertTrue( $this->isElementPresent( "submit-back" ) );
- $this->assertTrue( $this->isElementPresent( "submit-continue" ) );
- }
-}
diff --git a/tests/selenium/installer/MediaWikiDifferentDatabaseAccountTestCase.php b/tests/selenium/installer/MediaWikiDifferentDatabaseAccountTestCase.php
deleted file mode 100644
index 6375d660..00000000
--- a/tests/selenium/installer/MediaWikiDifferentDatabaseAccountTestCase.php
+++ /dev/null
@@ -1,73 +0,0 @@
-<?php
-/**
- * MediaWikiDifferentDatabaseAccountTestCase
- *
- * @file
- * @ingroup Maintenance
- * Copyright (C) 2010 Nadeesha Weerasinghe <nadeesha@calcey.com>
- * http://www.calcey.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.,
- * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
- * http://www.gnu.org/copyleft/gpl.html
- */
-
-require_once ( __DIR__ . '/MediaWikiInstallationCommonFunction.php' );
-
-/**
- * Test Case ID : 04 (http://www.mediawiki.org/wiki/New_installer/Test_plan)
- * Test Case Name : Install MediaWiki with different Database accounts for web access.
- * Version : MediaWiki 1.18alpha
- */
-class MediaWikiDifferentDatabaseAccountTestCase extends MediaWikiInstallationCommonFunction {
- function setUp() {
- parent::setUp();
- }
-
- // Install Mediawiki using 'MySQL' database type.
- public function testDifferentDatabaseAccount() {
- $databaseName = DB_NAME_PREFIX . "_dif_accounts";
-
- // Navigate to the 'Database settings' page
- parent::navigateDatabaseSettingsPage( $databaseName );
-
- // Click on the 'Use the same account as for installation' check box
- $this->click( "mysql__SameAccount" );
-
- // Change the 'Database username'
- $this->type( "mysql_wgDBuser", DB_WEB_USER );
-
- // Enter 'Database password:'
- $this->type( "mysql_wgDBpassword", DB_WEB_USER_PASSWORD );
-
- // Select 'Create the account if it does not already exist' check box
- $this->click( "mysql__CreateDBAccount" );
- parent::clickContinueButton();
-
- // 'Name' page
- parent::completeNamePage();
-
- // 'Options' page
- parent::clickContinueButton();
-
- // 'Install' page
- $this->assertEquals( "Creating database user... done",
- $this->getText( LINK_FORM . "ul/li[3]" ) );
- parent::clickContinueButton();
-
- // 'Complete' page
- parent::completePageSuccessfull();
- $this->chooseCancelOnNextConfirmation();
- }
-}
diff --git a/tests/selenium/installer/MediaWikiDifferntDatabasePrefixTestCase.php b/tests/selenium/installer/MediaWikiDifferntDatabasePrefixTestCase.php
deleted file mode 100644
index fad4e06f..00000000
--- a/tests/selenium/installer/MediaWikiDifferntDatabasePrefixTestCase.php
+++ /dev/null
@@ -1,88 +0,0 @@
-<?php
-/**
- * MediaWikiDifferntDatabasePrefixTestCase
- *
- * @file
- * @ingroup Maintenance
- * Copyright (C) 2010 Nadeesha Weerasinghe <nadeesha@calcey.com>
- * http://www.calcey.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.,
- * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
- * http://www.gnu.org/copyleft/gpl.html
- */
-
-require_once ( __DIR__ . '/MediaWikiInstallationCommonFunction.php' );
-
-/**
- * Test Case ID : 02 (http://www.mediawiki.org/wiki/New_installer/Test_plan)
- * Test Case Name : Install MediaWiki with the same database and the different
- * database prefixes(Share one database between multiple wikis).
- * Version : MediaWiki 1.18alpha
- */
-class MediaWikiDifferntDatabasePrefixTestCase extends MediaWikiInstallationCommonFunction {
- function setUp() {
- parent::setUp();
- }
-
- // Install Mediawiki using 'MySQL' database type.
- public function testDifferentDatabasePrefix() {
- $databaseName = DB_NAME_PREFIX . "_db_prefix";
- parent::navigateInstallPage( $databaseName );
-
- // To 'Options' page
- parent::clickBackButton();
-
- // To 'Name' page
- parent::clickBackButton();
-
- // To 'Database settings' page
- parent::clickBackButton();
-
- // To 'Connect to database' page
- parent::clickBackButton();
-
- // From 'Connect to database' page without database prefix
- parent::clickContinueButton();
-
- // Verify upgrade existing message
- $this->assertEquals( "Upgrade existing installation",
- $this->getText( LINK_DIV . "h2" ) );
-
- // To 'Connect to database' page
- parent::clickBackButton();
-
- // Input the database prefix
- $this->type( "mysql_wgDBprefix", DATABASE_PREFIX );
-
- // From 'Connect to database' page with database prefix
- parent::clickContinueButton();
-
- // To 'Complete' page
- parent::clickContinueButton();
- parent::completeNamePage();
- parent::clickContinueButton();
-
- // Verify already installed warning message
- $this->assertEquals( "Install",
- $this->getText( LINK_DIV . "h2" ) );
- $this->assertEquals( "Warning: You seem to have already installed MediaWiki and are trying to install it again. Please proceed to the next page.",
- $this->getText( LINK_FORM . "div[1]" ) );
-
- parent::clickContinueButton();
- parent::completePageSuccessfull();
- $this->chooseCancelOnNextConfirmation();
- parent::restartInstallation();
- }
-}
diff --git a/tests/selenium/installer/MediaWikiErrorsConnectToDatabasePageTestCase.php b/tests/selenium/installer/MediaWikiErrorsConnectToDatabasePageTestCase.php
deleted file mode 100644
index 37f5af2f..00000000
--- a/tests/selenium/installer/MediaWikiErrorsConnectToDatabasePageTestCase.php
+++ /dev/null
@@ -1,131 +0,0 @@
-<?php
-/**
- * MediaWikiErrorsConnectToDatabasePageTestCase
- *
- * @file
- * @ingroup Maintenance
- * Copyright (C) 2010 Nadeesha Weerasinghe <nadeesha@calcey.com>
- * http://www.calcey.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.,
- * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
- * http://www.gnu.org/copyleft/gpl.html
- */
-
-
-require_once ( __DIR__ . '/MediaWikiInstallationCommonFunction.php' );
-
-/**
- * Test Case ID : 09 (http://www.mediawiki.org/wiki/New_installer/Test_plan)
- * Test Case Name : Invalid/ blank values for fields in 'Connect to database' page.
- * Version : MediaWiki 1.18alpha
- */
-
-class MediaWikiErrorsConnectToDatabasePageTestCase extends MediaWikiInstallationCommonFunction {
-
- function setUp() {
- parent::setUp();
- }
-
- // Verify warning messages for the 'Connet to database' page
- public function testErrorsConnectToDatabasePage() {
- parent::navigateConnetToDatabasePage();
-
- // Verify warning mesage for invalid database host
- $this->type( "mysql_wgDBserver", INVALID_DB_HOST );
- parent::clickContinueButton();
- $this->assertEquals( "DB connection error: php_network_getaddresses: getaddrinfo failed: No such host is known. (" . INVALID_DB_HOST . ").",
- $this->getText( LINK_DIV . "div[2]/div[2]/p[1]" ) );
- $this->assertEquals( "Check the host, username and password below and try again.",
- $this->getText( LINK_DIV . "div[2]/div[2]/p[2]" ) );
- // Verify warning message for the blank database host
- $this->type( "mysql_wgDBserver", "" );
- parent::clickContinueButton();
- $this->assertEquals( "MySQL 4.0.14 or later is required, you have .",
- $this->getText( LINK_DIV . "div[2]/div[2]" ) );
-
- // Valid Database Host
- $this->type( "mysql_wgDBserver", VALID_DB_HOST );
-
- // Verify warning message for the invalid database name
- $this->type( "mysql_wgDBname", INVALID_DB_NAME );
- parent::clickContinueButton();
- $this->assertEquals( "Invalid database name \"" . INVALID_DB_NAME . "\". Use only ASCII letters (a-z, A-Z), numbers (0-9) and underscores (_).",
- $this->getText( LINK_DIV . "div[2]/div[2]/p" ) );
-
- // Verify warning message for the blank database name
- $this->type( "mysql_wgDBname", "" );
- parent::clickContinueButton();
- $this->assertEquals( "You must enter a value for \"Database name\"",
- $this->getText( LINK_DIV . "div[2]/div[2]" ) );
-
- // valid Database name
- $this->type( "mysql_wgDBname", VALID_DB_NAME );
-
- // Verify warning message for the invalid databaase prefix
- $this->type( "mysql_wgDBprefix", INVALID_DB_PREFIX );
- parent::clickContinueButton();
- $this->assertEquals( "Invalid database prefix \"" . INVALID_DB_PREFIX . "\". Use only ASCII letters (a-z, A-Z), numbers (0-9) and underscores (_).",
- $this->getText( LINK_DIV . "div[2]/div[2]" ) );
-
- // Valid Database prefix
- $this->type( "mysql_wgDBprefix", VALID_DB_PREFIX );
-
- // Verify warning message for the invalid database user name
- $this->type( "mysql__InstallUser", INVALID_DB_USER_NAME );
- parent::clickContinueButton();
- $this->assertEquals( "DB connection error: Access denied for user '" . INVALID_DB_USER_NAME . "'@'localhost' (using password: NO) (localhost).",
- $this->getText( LINK_DIV . "div[2]/div[2]/p[1]" ) );
- $this->assertEquals( "Check the host, username and password below and try again.",
- $this->getText( LINK_DIV . "div[2]/div[2]/p[2]" ) );
-
- // Verify warning message for the blank database user name
- $this->type( "mysql__InstallUser", "" );
- parent::clickContinueButton();
- $this->assertEquals( "DB connection error: Access denied for user 'SYSTEM'@'localhost' (using password: NO) (localhost).",
- $this->getText( LINK_DIV . "div[2]/div[2]/p[1]" ) );
- $this->assertEquals( "Check the host, username and password below and try again.",
- $this->getText( LINK_DIV . "div[2]/div[2]/p[2]" ) );
-
- // Valid Database username
- $this->type( "mysql__InstallUser", VALID_DB_USER_NAME );
-
- // Verify warning message for the invalid password
- $this->type( "mysql__InstallPassword", INVALID_DB_PASSWORD );
- parent::clickContinueButton();
-
- $this->assertEquals( "DB connection error: Access denied for user 'root'@'localhost' (using password: YES) (localhost).",
- $this->getText( LINK_DIV . "div[2]/div[2]/p[1]" ) );
- $this->assertEquals( "Check the host, username and password below and try again.",
- $this->getText( LINK_DIV . "div[2]/div[2]/p[2]" ) );
-
- // Verify warning message for the invalid username and password
- $this->type( "mysql__InstallUser", INVALID_DB_USER_NAME );
- $this->type( "mysql__InstallPassword", INVALID_DB_PASSWORD );
- parent::clickContinueButton();
- $this->assertEquals( "DB connection error: Access denied for user '" . INVALID_DB_USER_NAME . "'@'localhost' (using password: YES) (localhost).",
- $this->getText( LINK_DIV . "div[2]/div[2]/p[1]" ) );
- $this->assertEquals( "Check the host, username and password below and try again.",
- $this->getText( LINK_DIV . "div[2]/div[2]/p[2]" ) );
-
- // Valid username and valid password
- $this->type( "mysql__InstallUser", VALID_DB_USER_NAME );
- $this->type( "mysql__InstallPassword", "" );
- parent::clickContinueButton();
-
- // successfully completes the 'Connect to database' page
- $this->assertEquals( "Database settings",
- $this->getText( LINK_DIV . "h2" ) );
- }
-}
diff --git a/tests/selenium/installer/MediaWikiErrorsNamepageTestCase.php b/tests/selenium/installer/MediaWikiErrorsNamepageTestCase.php
deleted file mode 100644
index 536ceb66..00000000
--- a/tests/selenium/installer/MediaWikiErrorsNamepageTestCase.php
+++ /dev/null
@@ -1,119 +0,0 @@
-<?php
-/**
- * MediaWikiErrorsNamepageTestCase
- *
- * @file
- * @ingroup Maintenance
- * Copyright (C) 2010 Nadeesha Weerasinghe <nadeesha@calcey.com>
- * http://www.calcey.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.,
- * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
- * http://www.gnu.org/copyleft/gpl.html
- */
-
-require_once ( __DIR__ . '/MediaWikiInstallationCommonFunction.php' );
-
-/**
- * Test Case ID : 10 (http://www.mediawiki.org/wiki/New_installer/Test_plan)
- * Test Case Name : Invalid/ blank values for fields in 'Name' page.
- * Version : MediaWiki 1.18alpha
- */
-class MediaWikiErrorsNamepageTestCase extends MediaWikiInstallationCommonFunction {
- function setUp() {
- parent::setUp();
- }
-
- // Verify warning message for the 'Name' page
- public function testErrorsNamePage() {
-
- $databaseName = DB_NAME_PREFIX . "_error_name";
-
- parent::navigateNamePage( $databaseName );
-
- // Verify warning message for all blank fields
- parent::clickContinueButton();
- $this->assertEquals( "Enter a site name.",
- $this->getText( LINK_DIV . "div[2]/div[2]" ) );
- $this->assertEquals( "Enter an administrator username.",
- $this->getText( LINK_DIV . "div[3]/div[2]" ) );
- $this->assertEquals( "Enter a password for the administrator account.",
- $this->getText( LINK_DIV . "div[4]/div[2]" ) );
-
- // Verify warning message for the blank 'Site name'
- $this->type( "config__AdminName", VALID_YOUR_NAME );
- $this->type( "config__AdminPassword", VALID_PASSWORD );
- $this->type( "config__AdminPassword2", VALID_PASSWORD_AGAIN );
- parent::clickContinueButton();
- $this->assertEquals( "Enter a site name.",
- $this->getText( LINK_DIV . "div[2]/div[2]" ) );
-
- // Input valid 'Site name'
- $this->type( "config_wgSitename", VALID_WIKI_NAME );
-
- // Verify warning message for the invalid "Project namespace'
- $this->click( "config__NamespaceType_other" );
- $this->type( "config_wgMetaNamespace", INVALID_NAMESPACE );
- parent::clickContinueButton();
- $this->assertEquals( "The specified namespace \"\" is invalid. Specify a different project namespace.",
- $this->getText( LINK_DIV . "div[2]/div[2]" ) );
-
- // Verify warning message for the blank 'Project namespace'
- $this->type( "config_wgSitename", VALID_WIKI_NAME );
- $this->click( "config__NamespaceType_other" );
- $this->type( "config_wgMetaNamespace", "" );
- parent::clickContinueButton();
- $this->assertEquals( "The specified namespace \"\" is invalid. Specify a different project namespace.",
- $this->getText( LINK_DIV . "div[2]/div[2]" ) );
-
- // Valid 'Project namespace'
- $this->click( "config__NamespaceType_other" );
- $this->type( "config_wgMetaNamespace", VALID_NAMESPACE );
- parent::clickContinueButton();
-
- // Valid 'Site name'
- $this->click( "config__NamespaceType_site-name" );
- $this->type( "config_wgSitename", VALID_WIKI_NAME );
-
- // Verify warning message for blank 'Your name'
- $this->type( "config__AdminName", " " );
- parent::clickContinueButton();
- $this->assertEquals( "Enter an administrator username.",
- $this->getText( LINK_DIV . "div[2]/div[2]" ) );
-
- $this->type( "config_wgSitename", VALID_WIKI_NAME );
- // Verify warning message for blank 'Password'
- $this->type( "config__AdminName", VALID_YOUR_NAME );
- $this->type( "config__AdminPassword", " " );
- parent::clickContinueButton();
- $this->assertEquals( "Enter a password for the administrator account.",
- $this->getText( LINK_DIV . "div[2]/div[2]" ) );
-
- // Verify warning message for the blank 'Password again'
- $this->type( "config_wgSitename", VALID_WIKI_NAME );
- $this->type( "config__AdminPassword", VALID_PASSWORD );
- $this->type( "config__AdminPassword2", " " );
- parent::clickContinueButton();
- $this->assertEquals( "The two passwords you entered do not match.",
- $this->getText( LINK_DIV . "div[2]/div[2]" ) );
-
- // Verify warning message for the different'Password' and 'Password again'
- $this->type( "config_wgSitename", VALID_WIKI_NAME );
- $this->type( "config__AdminPassword", VALID_PASSWORD );
- $this->type( "config__AdminPassword2", INVALID_PASSWORD_AGAIN );
- parent::clickContinueButton();
- $this->assertEquals( "The two passwords you entered do not match.",
- $this->getText( LINK_DIV . "div[2]/div[2]" ) );
- }
-}
diff --git a/tests/selenium/installer/MediaWikiHelpFieldHintTestCase.php b/tests/selenium/installer/MediaWikiHelpFieldHintTestCase.php
deleted file mode 100644
index f0efce6e..00000000
--- a/tests/selenium/installer/MediaWikiHelpFieldHintTestCase.php
+++ /dev/null
@@ -1,128 +0,0 @@
-<?php
-/**
- * MediaWikiHelpFieldHintTestCase
- *
- * @file
- * @ingroup Maintenance
- * Copyright (C) 2010 Nadeesha Weerasinghe <nadeesha@calcey.com>
- * http://www.calcey.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.,
- * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
- * http://www.gnu.org/copyleft/gpl.html
- */
-
-require_once ( __DIR__ . '/MediaWikiInstallationCommonFunction.php' );
-
-/**
- * Test Case ID : 29 (http://www.mediawiki.org/wiki/New_installer/Test_plan)
- * Test Case Name : Help field hint availability for the fields.
- * Version : MediaWiki 1.18alpha
- */
-class MediaWikiHelpFieldHintTestCase extends MediaWikiInstallationCommonFunction {
- function setUp() {
- parent::setUp();
- }
-
- // Verify help field availability for the fields
- public function testMySQLConnectToDatabaseFieldHint() {
-
- parent::navigateConnetToDatabasePage();
-
- // Verify help field for 'Database host'
- $this->click( "//div[@id='DB_wrapper_mysql']/div/div[1]/div/span[1]" );
- $this->assertEquals( MYSQL_DATABASE_HOST_HELP,
- $this->getText( "//div[@id='DB_wrapper_mysql']/div/div[1]/div/span[2]" ) );
-
- // Verify help field for 'Database name'
- $this->click( "//div[@id='DB_wrapper_mysql']/fieldset[1]/div[1]/div[1]/div/span[1]" );
- $this->assertEquals( MYSQL_DATABASE_NAME_HELP,
- $this->getText( "//div[@id='DB_wrapper_mysql']/fieldset[1]/div[1]/div[1]/div/span[2]" ) );
-
-
- // Verify help field for 'Database table prefix'
- $this->click( "//div[@id='DB_wrapper_mysql']/fieldset[1]/div[2]/div[1]/div/span[1]" );
- $this->assertEquals( MYSQL_DATABASE_TABLE_PREFIX_HELP,
- $this->getText( "//div[@id='DB_wrapper_mysql']/fieldset[1]/div[1]/div[1]/div/span[2]/p[1]" ) );
-
- // Verify help field for 'Database username'
- $this->click( "//div[@id='DB_wrapper_mysql']/fieldset[2]/div[1]/div[1]/div/span[1]" );
- $this->assertEquals( MYSQL_DATBASE_USERNAME_HELP,
- $this->getText( "//div[@id='DB_wrapper_mysql']/fieldset[2]/div[1]/div[1]/div/span[2]" ) );
-
- // Verify help field for 'Database password'
- $this->click( "//div[@id='DB_wrapper_mysql']/fieldset[2]/div[2]/div[1]/div/span[1]" );
- $this->assertEquals( MYSQL_DATABASE_PASSWORD_HELP,
- $this->getText( "//div[@id='DB_wrapper_mysql']/fieldset[2]/div[2]/div[1]/div/span[2]/p" ) );
- }
-
- public function testSQLiteConnectToDatabaseFieldHint() {
- parent::navigateConnetToDatabasePage();
- $this->click( "DBType_sqlite" );
-
- // Verify help field for 'SQLite data directory'
- $this->click( "//div[@id='DB_wrapper_sqlite']/div[1]/div[1]/div/span[1]" );
- $this->assertEquals( SQLITE_DATA_DIRECTORY_HELP,
- $this->getText( "//div[@id='DB_wrapper_sqlite']/div[1]/div[1]/div/span[2]" ) );
-
- // Verify help field for 'Database name'
- $this->click( "//div[@id='DB_wrapper_sqlite']/div[2]/div[1]/div/span[1]" );
- $this->assertEquals( SQLITE_DATABASE_NAME_HELP, $this->getText( "//div[@id='DB_wrapper_sqlite']/div[2]/div[1]/div/span[2]/p" ) );
- }
-
- public function testDatabaseSettingsFieldHint() {
-
- $databaseName = DB_NAME_PREFIX . "_db_field";
- parent::navigateDatabaseSettingsPage( $databaseName );
-
- // Verify help field for 'Search engine'
- $this->click( LINK_FORM . "div[2]/span[1]" );
- $this->assertEquals( SEARCH_ENGINE_HELP,
- $this->getText( LINK_FORM . "div[2]/span[2]" ) );
-
- // Verify help field for 'Database character set'
- $this->click( LINK_FORM . "div[4]/span[1]" );
- $this->assertEquals( DATABASE_CHARACTER_SET_HELP,
- $this->getText( LINK_FORM . "div[4]/span[2]" ) );
- parent::restartInstallation();
- }
-
- public function testNameFieldHint() {
- $databaseName = DB_NAME_PREFIX . "_name_field";
- parent::navigateNamePage( $databaseName );
-
- // Verify help field for 'Name of Wiki'
- $this->click( LINK_FORM . "div[1]/div[1]/div/span[1]" );
- $this->assertEquals( NAME_OF_WIKI_HELP,
- $this->getText( LINK_FORM . "div[1]/div[1]/div/span[2]/p" ) );
-
- // Verify help field for 'Project namespace'
- $this->click( LINK_FORM . "div[2]/div[1]/div/span[1]" );
- $this->assertEquals( PROJECT_NAMESPACE_HELP,
- $this->getText( LINK_FORM . "div[2]/div[1]/div/span[2]/p" ) );
-
- // Verify help field for 'Your Name'
- $this->click( LINK_FORM . "fieldset/div[1]/div[1]/div/span[1]" );
- $this->assertEquals( USER_NAME_HELP,
- $this->getText( LINK_FORM . "fieldset/div[1]/div[1]/div/span[2]/p" ) );
-
- // Verify help field for 'E mail address'
- $this->click( LINK_FORM . "fieldset/div[4]/div[1]/div/span[1]" );
- $this->assertEquals( EMAIL_ADDRESS_HELP,
- $this->getText( LINK_FORM . "fieldset/div[4]/div[1]/div/span[2]/p" ) );
-
- parent::restartInstallation();
- }
-}
-
diff --git a/tests/selenium/installer/MediaWikiInstallationCommonFunction.php b/tests/selenium/installer/MediaWikiInstallationCommonFunction.php
deleted file mode 100644
index a9a8fc38..00000000
--- a/tests/selenium/installer/MediaWikiInstallationCommonFunction.php
+++ /dev/null
@@ -1,259 +0,0 @@
-<?php
-/**
- * MediaWikiInstallationCommonFunction
- *
- * @file
- * @ingroup Maintenance
- * Copyright (C) 2010 Nadeesha Weerasinghe <nadeesha@calcey.com>
- * http://www.calcey.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.,
- * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
- * http://www.gnu.org/copyleft/gpl.html
- */
-
-require_once 'PHPUnit/Extensions/SeleniumTestCase.php';
-require_once ( __DIR__ . '/MediaWikiInstallationConfig.php' );
-require_once ( __DIR__ . '/MediaWikiInstallationMessage.php' );
-require_once ( __DIR__ . '/MediaWikiInstallationVariables.php' );
-
-class MediaWikiInstallationCommonFunction extends PHPUnit_Extensions_SeleniumTestCase {
- function setUp() {
- $this->setBrowser( TEST_BROWSER );
- $this->setBrowserUrl( "http://" . HOST_NAME . ":" . PORT . "/" . DIRECTORY_NAME . "/" );
- }
-
- public function navigateInitialpage() {
- $this->open( "http://" . HOST_NAME . ":" . PORT . "/" . DIRECTORY_NAME . "/" );
- }
-
- // Navigate to the 'Language' page
- public function navigateLanguagePage() {
- $this->open( "http://" . HOST_NAME . ":" . PORT . "/" . DIRECTORY_NAME . "/config/index.php" );
- }
-
- // Navigate to the 'Welcome to MediaWiki' page
- public function navigateWelcometoMediaWikiPage() {
- $this->open( "http://" . HOST_NAME . ":" . PORT . "/" . DIRECTORY_NAME . "/config/index.php" );
- $this->click( "submit-continue " );
- $this->waitForPageToLoad( PAGE_LOAD_TIME );
- }
-
- // Navigate yo 'Connect to Database' page
- public function navigateConnetToDatabasePage() {
- $this->open( "http://" . HOST_NAME . ":" . PORT . "/" . DIRECTORY_NAME . "/config/index.php" );
-
- // 'Welcome to MediaWiki!' page
- $this->click( "submit-continue" );
- $this->waitForPageToLoad( PAGE_LOAD_TIME );
-
- // 'Connect to Database' page
- $this->click( "submit-continue" );
- $this->waitForPageToLoad( PAGE_LOAD_TIME );
- }
-
- // Navigate to the 'Database Settings' page
- public function navigateDatabaseSettingsPage( $databaseName ) {
- $this->open( "http://" . HOST_NAME . ":" . PORT . "/" . DIRECTORY_NAME . "/config/index.php" );
-
- // 'Welcome to MediaWiki!' page
- $this->click( "submit-continue" );
- $this->waitForPageToLoad( PAGE_LOAD_TIME );
-
- // 'Connect to Database' page
- $this->click( "submit-continue" );
- $this->waitForPageToLoad( PAGE_LOAD_TIME );
-
- $this->type( "mysql_wgDBname", $databaseName );
- $this->click( "submit-continue" );
- $this->waitForPageToLoad( PAGE_LOAD_TIME );
- }
-
- // Navigate to the 'Name' page
- public function navigateNamePage( $databaseName ) {
- $this->open( "http://" . HOST_NAME . ":" . PORT . "/" . DIRECTORY_NAME . "/config/index.php" );
-
- // 'Welcome to MediaWiki!' page
- $this->click( "submit-continue" );
- $this->waitForPageToLoad( PAGE_LOAD_TIME );
-
- // 'Connect to Database' page
- $this->click( "submit-continue" );
- $this->waitForPageToLoad( PAGE_LOAD_TIME );
-
- $this->type( "mysql_wgDBname", $databaseName );
- $this->click( "submit-continue" );
- $this->waitForPageToLoad( PAGE_LOAD_TIME );
-
- // Database settings
- $this->click( "submit-continue" );
- $this->waitForPageToLoad( PAGE_LOAD_TIME );
- }
-
- // Navigate 'Options' page
- public function navigateOptionsPage( $databaseName ) {
- $this->open( "http://" . HOST_NAME . ":" . PORT . "/" . DIRECTORY_NAME . "/config/index.php" );
-
- // 'Welcome to MediaWiki!' page
- $this->click( "submit-continue" );
- $this->waitForPageToLoad( PAGE_LOAD_TIME );
-
- // 'Connect to Database' page
- $this->click( "submit-continue" );
- $this->waitForPageToLoad( PAGE_LOAD_TIME );
-
- $this->type( "mysql_wgDBname", $databaseName );
- $this->click( "submit-continue" );
- $this->waitForPageToLoad( PAGE_LOAD_TIME );
-
- // Database settings
- $this->click( "submit-continue" );
- $this->waitForPageToLoad( PAGE_LOAD_TIME );
-
- // Name
- $this->type( "config_wgSitename", NAME_OF_WIKI );
- $this->type( "config__AdminName", ADMIN_USER_NAME );
- $this->type( "config__AdminPassword", ADMIN_PASSWORD );
- $this->type( "config__AdminPassword2", ADMIN_RETYPE_PASSWORD );
- $this->type( "config__AdminEmail", ADMIN_EMAIL_ADDRESS );
-
- $this->click( "submit-continue" );
- $this->waitForPageToLoad( PAGE_LOAD_TIME );
- }
-
- // Navigate 'Install' page
- public function navigateInstallPage( $databaseName ) {
- $this->open( "http://" . HOST_NAME . ":" . PORT . "/" . DIRECTORY_NAME . "/config/index.php" );
-
- // 'Welcome to MediaWiki!' page
- $this->click( "submit-continue" );
- $this->waitForPageToLoad( PAGE_LOAD_TIME );
-
- // 'Connect to Database' page
- $this->click( "submit-continue" );
- $this->waitForPageToLoad( PAGE_LOAD_TIME );
-
- $this->type( "mysql_wgDBname", $databaseName );
- $this->click( "submit-continue" );
- $this->waitForPageToLoad( PAGE_LOAD_TIME );
-
- // Database settings
- $this->click( "submit-continue" );
- $this->waitForPageToLoad( PAGE_LOAD_TIME );
-
- // Name
- $this->type( "config_wgSitename", NAME_OF_WIKI );
- $this->type( "config__AdminName", ADMIN_USER_NAME );
- $this->type( "config__AdminPassword", ADMIN_PASSWORD );
- $this->type( "config__AdminPassword2", ADMIN_RETYPE_PASSWORD );
- $this->type( "config__AdminEmail", ADMIN_EMAIL_ADDRESS );
-
- $this->click( "submit-continue" );
- $this->waitForPageToLoad( PAGE_LOAD_TIME );
-
- // Options page
- $this->click( "submit-continue" );
- $this->waitForPageToLoad( PAGE_LOAD_TIME );
- }
-
- // Navigate to 'Complete' page
- public function navigateCompletePage( $databaseName ) {
- $this->open( "http://" . HOST_NAME . ":" . PORT . "/" . DIRECTORY_NAME . "/config/index.php" );
-
- // 'Welcome to MediaWiki!' page
- $this->click( "submit-continue" );
- $this->waitForPageToLoad( PAGE_LOAD_TIME );
-
- // 'Connect to Database' page
- $this->click( "submit-continue" );
- $this->waitForPageToLoad( PAGE_LOAD_TIME );
-
- $this->type( "mysql_wgDBname", $databaseName );
- $this->click( "submit-continue" );
- $this->waitForPageToLoad( PAGE_LOAD_TIME );
-
- // Database settings
- $this->click( "submit-continue" );
- $this->waitForPageToLoad( PAGE_LOAD_TIME );
-
- // Name
- $this->type( "config_wgSitename", NAME_OF_WIKI );
- $this->type( "config__AdminName", ADMIN_USER_NAME );
- $this->type( "config__AdminPassword", ADMIN_PASSWORD );
- $this->type( "config__AdminPassword2", ADMIN_RETYPE_PASSWORD );
- $this->type( "config__AdminEmail", ADMIN_EMAIL_ADDRESS );
-
- $this->click( "submit-continue" );
- $this->waitForPageToLoad( PAGE_LOAD_TIME );
-
- // Options page
- $this->click( "submit-continue" );
- $this->waitForPageToLoad( PAGE_LOAD_TIME );
-
- // Install page
- $this->click( "submit-continue" );
- $this->waitForPageToLoad( PAGE_LOAD_TIME );
- $this->chooseCancelOnNextConfirmation();
- }
-
- // Complete the Name page fields
- public function completeNamePage() {
- $this->type( "config_wgSitename", NAME_OF_WIKI );
- $this->type( "config__AdminName", ADMIN_USER_NAME );
- $this->type( "config__AdminPassword", ADMIN_PASSWORD );
- $this->type( "config__AdminPassword2", ADMIN_RETYPE_PASSWORD );
- $this->type( "config__AdminEmail", ADMIN_EMAIL_ADDRESS );
- $this->click( "submit-continue" );
- $this->waitForPageToLoad( PAGE_LOAD_TIME );
- }
-
- // Clicking on the 'Continue' button in any MediaWiki page
- public function clickContinueButton() {
- $this->click( "submit-continue" );
- $this->waitForPageToLoad( PAGE_LOAD_TIME );
- }
-
- // Clicking on the 'Back' button in any MediaWiki page
- public function clickBackButton() {
- $this->click( "submit-back" );
- $this->waitForPageToLoad( PAGE_LOAD_TIME );
- }
-
- // Restarting the installation
- public function restartInstallation() {
- $this->click( "link=Restart installation" );
- $this->waitForPageToLoad( PAGE_LOAD_TIME );
- $this->click( "submit-restart" );
- $this->waitForPageToLoad( PAGE_LOAD_TIME );
- }
-
- // Verify 'MediaWiki' logo available in the initial screen
- public function mediaWikiLogoPresentInitialScreen() {
- $this->assertTrue( $this->isElementPresent( "//img[@alt='The MediaWiki logo']" ) );
- }
-
- // Verify 'MediaWiki' logo available
- public function mediaWikiLogoPresent() {
- $this->assertTrue( $this->isElementPresent( "//div[@id='p-logo']/a" ) );
- }
-
- public function completePageSuccessfull() {
- $this->assertEquals( "Complete!",
- $this->getText( "//div[@id='bodyContent']/div/div/h2" ) );
-
- // 'Congratulations!' text should be available in the 'Complete!' page.
- $this->assertEquals( "Congratulations!",
- $this->getText( "//div[@id='bodyContent']/div/div/div[2]/form/div[1]/div[2]/p[1]/b" ) );
- }
-}
diff --git a/tests/selenium/installer/MediaWikiInstallationConfig.php b/tests/selenium/installer/MediaWikiInstallationConfig.php
deleted file mode 100644
index 86a46247..00000000
--- a/tests/selenium/installer/MediaWikiInstallationConfig.php
+++ /dev/null
@@ -1,45 +0,0 @@
-<?php
-/**
- * MediaWikiInstallationConfig
- *
- * @file
- * @ingroup Maintenance
- * Copyright (C) 2010 Nadeesha Weerasinghe <nadeesha@calcey.com>
- * http://www.calcey.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.,
- * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
- * http://www.gnu.org/copyleft/gpl.html
- */
-
-
-/**
- * MediaWikiInstallerTestSuite.php can be run one time successfully
- * with current value of the 'DB_NAME_PREFIX'.
- * If you wish to run the suite more than one time, you need to change
- * the value of the 'DB_NAME_PREFIX'.
- */
-define( 'DB_NAME_PREFIX', "database_name" );
-define( 'DIRECTORY_NAME', "mediawiki" );
-define( 'PORT', "8080" );
-define( 'HOST_NAME', "localhost" );
-
-/**
- * Use the followings to run the test suite in different browsers.
- * Firefox : *firefox
- * IE : *iexplore
- * Google chrome : *googlechrome
- * Opera : *opera
- */
-define ( 'TEST_BROWSER', "*firefox" );
diff --git a/tests/selenium/installer/MediaWikiInstallationMessage.php b/tests/selenium/installer/MediaWikiInstallationMessage.php
deleted file mode 100644
index 2b7d48ef..00000000
--- a/tests/selenium/installer/MediaWikiInstallationMessage.php
+++ /dev/null
@@ -1,53 +0,0 @@
-<?php
-/**
- * MediaWikiInstallationConfig
- *
- * @file
- * @ingroup Maintenance
- * Copyright (C) 2010 Nadeesha Weerasinghe <nadeesha@calcey.com>
- * http://www.calcey.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.,
- * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
- * http://www.gnu.org/copyleft/gpl.html
- */
-
-
-// 'MySQL' database type help field hint
-define( 'MYSQL_DATABASE_HOST_HELP', "If your database server is on different server, enter the host name or IP address here. \nIf you are using shared web hosting, your hosting provider should give you the correct host name in their documentation. \nIf 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." );
-define( 'MYSQL_DATABASE_NAME_HELP', "Choose a name that identifies your wiki. It should not contain spaces or hyphens. \nIf 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." );
-define( 'MYSQL_DATABASE_TABLE_PREFIX_HELP', "Choose a name that identifies your wiki. It should not contain spaces or hyphens." );
-define( 'MYSQL_DATBASE_USERNAME_HELP', "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." );
-define( 'MYSQL_DATABASE_PASSWORD_HELP', "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." );
-
-
-// 'SQLite' database type help field hint
-define( 'SQLITE_DATA_DIRECTORY_HELP', "SQLite stores all data in a single file. \nThe directory you provide must be writable by the webserver during installation. \nIt should not be accessible via the web, this is why we're not putting it where your PHP files are. \nThe installer will write a .htaccess 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. \nConsider putting the database somewhere else altogether, for example in /var/lib/mediawiki/yourwiki." );
-define( 'SQLITE_DATABASE_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." );
-
-
-// 'Database settings' page hel0p field hint
-define( 'SEARCH_ENGINE_HELP', "InnoDB is almost always the best option, since it has good concurrency support. \nMyISAM may be faster in single-user or read-only installations. MyISAM databases tend to get corrupted more often than InnoDB databases." );
-define( 'DATABASE_CHARACTER_SET_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. \nIn 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 Basic Multilingual Plane." );
-
-
-// 'Name' page help field hint
-define( 'NAME_OF_WIKI_HELP', "This will appear in the title bar of the browser and in various other places." );
-define( '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 \":\"." );
-define( 'USER_NAME_HELP', "Enter your preferred username here, for example \"Joe Bloggs\". This is the name you will use to log in to the wiki." );
-define( 'EMAIL_ADDRESS_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." );
-define( 'SUBSCRIBE_MAILING_LIST_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." );
-
-
-
diff --git a/tests/selenium/installer/MediaWikiInstallationVariables.php b/tests/selenium/installer/MediaWikiInstallationVariables.php
deleted file mode 100644
index 3d7996be..00000000
--- a/tests/selenium/installer/MediaWikiInstallationVariables.php
+++ /dev/null
@@ -1,73 +0,0 @@
-<?php
-/**
- * MediaWikiInstallationConfig
- *
- * @file
- * @ingroup Maintenance
- * Copyright (C) 2010 Nadeesha Weerasinghe <nadeesha@calcey.com>
- * http://www.calcey.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.,
- * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
- * http://www.gnu.org/copyleft/gpl.html
- */
-
-
-// Common variables
-define( 'PAGE_LOAD_TIME', "80000" );
-
-// Common links
-define( 'LINK_DIV', "//div[@id='bodyContent']/div/div/" );
-define( 'LINK_FORM', "//div[@id='bodyContent']/div/div/div[2]/form/" );
-define( 'LINK_RIGHT_FRAMEWORK', "//div[@id='bodyContent']/div/div/div[1]/ul[1]/" );
-
-// 'Name' page input values
-define( 'NAME_OF_WIKI', "Site Name" );
-define( 'ADMIN_USER_NAME', "My Name" );
-define( 'ADMIN_PASSWORD', "12345" );
-define ( 'ADMIN_RETYPE_PASSWORD', "12345" );
-define ( 'ADMIN_EMAIL_ADDRESS', "admin@example.com" );
-
-
-// 'Name' page input values for warning messages
-define( 'VALID_WIKI_NAME', "MyWiki" );
-define( 'VALID_YOUR_NAME', "FirstName LastName" );
-define( 'VALID_PASSWORD', "12345" );
-define( 'VALID_PASSWORD_AGAIN', "12345" );
-define( 'INVALID_PASSWORD_AGAIN', "123" );
-define( 'VALID_NAMESPACE', "Mynamespace" );
-define( 'INVALID_NAMESPACE', "##..##" );
-
-
-// 'Database settings' page input values
-define( 'DB_WEB_USER', "different" );
-define( 'DB_WEB_USER_PASSWORD', "12345" );
-
-
-// 'Connet to database' page input values
-define( 'DATABASE_PREFIX', "databaseprefix" );
-
-
-// 'Connet to database' page input values for warning messages
-define( 'VALID_DB_HOST', "localhost" );
-define( 'INVALID_DB_HOST', "local" );
-define( 'INVALID_DB_NAME', "my-wiki" );
-define( 'VALID_DB_NAME', "my_wiki1" );
-define( 'INVALID_DB_PREFIX', "database prefix" );
-define( 'VALID_DB_PREFIX', "database_prefix" );
-define( 'INVALID_DB_USER_NAME', "roots" );
-define( 'VALID_DB_USER_NAME', "root" );
-define( 'INVALID_DB_PASSWORD', "12345" );
-
-
diff --git a/tests/selenium/installer/MediaWikiInstallerTestSuite.php b/tests/selenium/installer/MediaWikiInstallerTestSuite.php
deleted file mode 100644
index 6946cc75..00000000
--- a/tests/selenium/installer/MediaWikiInstallerTestSuite.php
+++ /dev/null
@@ -1,49 +0,0 @@
-<?php
-/**
- * MediaWikiInstallerTestSuite
- *
- * @file
- * @ingroup Maintenance
- * Copyright (C) 2010 Nadeesha Weerasinghe <nadeesha@calcey.com>
- * http://www.calcey.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.,
- * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
- * http://www.gnu.org/copyleft/gpl.html
- */
-
-if ( PHP_SAPI != 'cli' ) {
- die( "Run me from the command line please.\n" );
-}
-
-require_once 'PHPUnit/Framework/TestSuite.php';
-
-require_once ( __DIR__ . '/MediaWikiUserInterfaceTestCase.php' );
-require_once ( __DIR__ . '/MediaWikiButtonsAvailabilityTestCase.php' );
-require_once ( __DIR__ . '/MediaWikiHelpFieldHintTestCase.php' );
-require_once ( __DIR__ . '/MediaWikiRightFrameworkLinksTestCase.php' );
-require_once ( __DIR__ . '/MediaWikiRestartInstallationTestCase.php' );
-require_once ( __DIR__ . '/MediaWikiErrorsConnectToDatabasePageTestCase.php' );
-require_once ( __DIR__ . '/MediaWikiErrorsNamepageTestCase.php' );
-require_once ( __DIR__ . '/MediaWikiMySQLDataBaseTestCase.php' );
-require_once ( __DIR__ . '/MediaWikiMySQLiteDataBaseTestCase.php' );
-require_once ( __DIR__ . '/MediaWikiUpgradeExistingDatabaseTestCase.php' );
-require_once ( __DIR__ . '/MediaWikiDifferntDatabasePrefixTestCase.php' );
-require_once ( __DIR__ . '/MediaWikiDifferentDatabaseAccountTestCase.php' );
-require_once ( __DIR__ . '/MediaWikiOnAlreadyInstalledTestCase.php' );
-
-$suite = new PHPUnit_Framework_TestSuite( 'ArrayTest' );
-$result = new PHPUnit_Framework_TestResult;
-
-$suite->run( $result );
diff --git a/tests/selenium/installer/MediaWikiMySQLDataBaseTestCase.php b/tests/selenium/installer/MediaWikiMySQLDataBaseTestCase.php
deleted file mode 100644
index 92f26d05..00000000
--- a/tests/selenium/installer/MediaWikiMySQLDataBaseTestCase.php
+++ /dev/null
@@ -1,71 +0,0 @@
-<?php
-/**
- * MediaWikiOnAlreadyInstalledTestCase
- *
- * @file
- * @ingroup Maintenance
- * Copyright (C) 2010 Nadeesha Weerasinghe <nadeesha@calcey.com>
- * http://www.calcey.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.,
- * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
- * http://www.gnu.org/copyleft/gpl.html
- */
-
-require_once ( __DIR__ . '/MediaWikiInstallationCommonFunction.php' );
-
-/**
- * Test Case ID : 01 (http://www.mediawiki.org/wiki/New_installer/Test_plan)
- * Test Case Name : Install Mediawiki using 'MySQL' database type successfully
- * Version : MediaWiki 1.18alpha
- */
-
-class MediaWikiMySQLDataBaseTestCase extends MediaWikiInstallationCommonFunction {
- function setUp() {
- parent::setUp();
- }
-
- // Verify MediaWiki installation using 'MySQL' database type
- public function testMySQLDatabaseSuccess() {
- $databaseName = DB_NAME_PREFIX . "_sql_db";
-
- parent::navigateConnetToDatabasePage();
-
- // Verify 'MySQL" is selected as the default database type
- $this->assertEquals( "MySQL settings", $this->getText( "//div[@id='DB_wrapper_mysql']/h3" ) );
-
- // Change 'Database name'
- $defaultDbName = $this->getText( "mysql_wgDBname" );
- $this->type( "mysql_wgDBname", " " );
- $this->type( "mysql_wgDBname", $databaseName );
- $this->assertNotEquals( $defaultDbName, $databaseName );
-
- // 'Database settings' page
- parent::clickContinueButton();
-
- // 'Name' page
- parent::clickContinueButton();
- parent::completeNamePage();
-
- // 'Options page
- parent::clickContinueButton();
-
- // 'Install' page
- parent::clickContinueButton();
-
- // 'Complete' page
- parent::completePageSuccessfull();
- parent::restartInstallation();
- }
-}
diff --git a/tests/selenium/installer/MediaWikiMySQLiteDataBaseTestCase.php b/tests/selenium/installer/MediaWikiMySQLiteDataBaseTestCase.php
deleted file mode 100644
index e9be3704..00000000
--- a/tests/selenium/installer/MediaWikiMySQLiteDataBaseTestCase.php
+++ /dev/null
@@ -1,73 +0,0 @@
-<?php
-/**
- * MediaWikiMySQLiteataBaseTestCase
- *
- * @file
- * @ingroup Maintenance
- * Copyright (C) 2010 Nadeesha Weerasinghe <nadeesha@calcey.com>
- * http://www.calcey.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.,
- * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
- * http://www.gnu.org/copyleft/gpl.html
- */
-
-
-require_once ( __DIR__ . '/MediaWikiInstallationCommonFunction.php' );
-
-/**
- * Test Case ID : 06 (http://www.mediawiki.org/wiki/New_installer/Test_plan)
- * Test Case Name : Install Mediawiki using 'MySQL' database type successfully
- * Version : MediaWiki 1.18alpha
- */
-
-class MediaWikiMySQLiteDataBaseTestCase extends MediaWikiInstallationCommonFunction {
- function setUp() {
- parent::setUp();
- }
-
- // Verify MediaWiki installation using 'MySQL' database type
- public function testMySQLDatabaseSuccess() {
- $databaseName = DB_NAME_PREFIX . "_sqlite_db";
-
- parent::navigateConnetToDatabasePage();
- $this->click( "DBType_sqlite" );
-
- // Select 'SQLite' database type
- $this->assertEquals( "SQLite settings", $this->getText( "//div[@id='DB_wrapper_sqlite']/h3" ) );
-
- // Change database name
- $defaultDbName = $this->getText( "sqlite_wgDBname" );
- $this->type( "sqlite_wgDBname", " " );
- $this->type( "sqlite_wgDBname", $databaseName );
- $this->assertNotEquals( $defaultDbName, $databaseName );
-
- // 'Database settings' page
- parent::clickContinueButton();
-
- // 'Name' page
- parent::clickContinueButton();
- parent::completeNamePage();
-
- // 'Options page
- parent::clickContinueButton();
-
- // 'Install' page
- parent::clickContinueButton();
-
- // 'Complete' page
- parent::completePageSuccessfull();
- parent::restartInstallation();
- }
-}
diff --git a/tests/selenium/installer/MediaWikiOnAlreadyInstalledTestCase.php b/tests/selenium/installer/MediaWikiOnAlreadyInstalledTestCase.php
deleted file mode 100644
index ce27500b..00000000
--- a/tests/selenium/installer/MediaWikiOnAlreadyInstalledTestCase.php
+++ /dev/null
@@ -1,65 +0,0 @@
-<?php
-/**
- * Selenium server manager
- *
- * @file
- * @ingroup Maintenance
- * Copyright (C) 2010 Nadeesha Weerasinghe <nadeesha@calcey.com>
- * http://www.calcey.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.,
- * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
- * http://www.gnu.org/copyleft/gpl.html
- */
-
-
-require_once ( __DIR__ . '/MediaWikiInstallationCommonFunction.php' );
-
-
-/**
- * Test Case ID : 03 (http://www.mediawiki.org/wiki/New_installer/Test_plan)
- * Test Case Name : Install mediawiki on a already installed Mediawiki.]
- * Version : MediaWiki 1.18alpha
- */
-
-class MediaWikiOnAlreadyInstalledTestCase extends MediaWikiInstallationCommonFunction {
- function setUp() {
- parent::setUp();
- }
-
- // Install Mediawiki using 'MySQL' database type.
- public function testInstallOnAlreadyInstalled() {
- $databaseName = DB_NAME_PREFIX . "_already_installed";
- parent::navigateInstallPage( $databaseName );
-
- // 'Options' page
- parent::clickBackButton();
-
- // Install page
- parent::clickContinueButton();
-
- // 'Install' page should display after the 'Option' page
- $this->assertEquals( "Install", $this->getText( LINK_DIV . "h2" ) );
-
- // Verify warning text displayed
- $this->assertEquals( "Warning: You seem to have already installed MediaWiki and are trying to install it again. Please proceed to the next page.",
- $this->getText( LINK_FORM . "div[1]/div[2]" ) );
-
- // Complete page
- parent::clickContinueButton();
- parent::completePageSuccessfull();
- $this->chooseCancelOnNextConfirmation();
- parent::restartInstallation();
- }
-}
diff --git a/tests/selenium/installer/MediaWikiRestartInstallationTestCase.php b/tests/selenium/installer/MediaWikiRestartInstallationTestCase.php
deleted file mode 100644
index f34210cb..00000000
--- a/tests/selenium/installer/MediaWikiRestartInstallationTestCase.php
+++ /dev/null
@@ -1,104 +0,0 @@
-<?php
-/**
- * MediaWikiRestartInstallationTestCase
- *
- * @file
- * @ingroup Maintenance
- * Copyright (C) 2010 Nadeesha Weerasinghe <nadeesha@calcey.com>
- * http://www.calcey.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.,
- * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
- * http://www.gnu.org/copyleft/gpl.html
- */
-
-require_once ( __DIR__ . '/MediaWikiInstallationCommonFunction.php' );
-
-/**
- * Test Case ID : 11, 12 (http://www.mediawiki.org/wiki/New_installer/Test_plan)
- * Test Case Name : Install mediawiki on a already installed Mediawiki.
- * Version : MediaWiki 1.18alpha
- */
-class MediaWikiRestartInstallationTestCase extends MediaWikiInstallationCommonFunction {
- function setUp() {
- parent::setUp();
- }
-
- // Verify restarting the installation
- public function testSuccessRestartInstallation() {
- $dbNameBeforeRestart = DB_NAME_PREFIX . "_db_before";
- parent::navigateDatabaseSettingsPage( $dbNameBeforeRestart );
-
- // Verify 'Restart installation' link available
- $this->assertTrue( $this->isElementPresent( "link=Restart installation" ) );
-
- // Click 'Restart installation'
- $this->click( "link=Restart installation " );
- $this->waitForPageToLoad( PAGE_LOAD_TIME );
-
- // 'Restart Installation' page displayed
- $this->assertEquals( "Restart installation", $this->getText( LINK_DIV . "h2" ) );
-
- // Restart warning message displayed
- $this->assertTrue( $this->isTextPresent( "exact:Do you want to clear all saved data that you have entered and restart the installation process?" ) );
-
- // Click on the 'Yes, restart' button
- $this->click( "submit-restart" );
- $this->waitForPageToLoad( PAGE_LOAD_TIME );
-
- // Navigate to the initial installation page(Language).
- $this->assertEquals( "Language", $this->getText( LINK_DIV . "h2" ) );
-
- // 'Welcome to MediaWiki!' page
- parent::clickContinueButton();
-
- // 'Connect to database' page
- parent::clickContinueButton();
-
- // saved data should be deleted
- $dbNameAfterRestart = $this->getValue( "mysql_wgDBname" );
- $this->assertNotEquals( $dbNameBeforeRestart, $dbNameAfterRestart );
- }
-
- // Verify cancelling restart
- public function testCancelRestartInstallation() {
- $dbNameBeforeRestart = DB_NAME_PREFIX . "_cancel_restart";
-
- parent::navigateDatabaseSettingsPage( $dbNameBeforeRestart );
- // Verify 'Restart installation' link available
- $this->assertTrue( $this->isElementPresent( "link=Restart installation" ) );
-
- $this->click( "link=Restart installation" );
- $this->waitForPageToLoad( PAGE_LOAD_TIME );
-
- // 'Restart Installation' page displayed
- $this->assertEquals( "Restart installation", $this->getText( LINK_DIV . "h2" ) );
-
- // Restart warning message displayed
- $this->assertTrue( $this->isTextPresent( "Do you want to clear all saved data that you have entered and restart the installation process?" ) );
-
- // Click on the 'Back' button
- parent::clickBackButton();
-
- // Navigates to the previous page
- $this->assertEquals( "Database settings", $this->getText( LINK_DIV . "h2" ) );
-
- // 'Connect to database' page
- parent::clickBackButton();
-
- // Saved data remain on the page.
- $dbNameAfterRestart = $this->getValue( "mysql_wgDBname" );
- $this->assertEquals( $dbNameBeforeRestart, $dbNameAfterRestart );
- }
-}
diff --git a/tests/selenium/installer/MediaWikiRightFrameworkLinksTestCase.php b/tests/selenium/installer/MediaWikiRightFrameworkLinksTestCase.php
deleted file mode 100644
index 039d71a4..00000000
--- a/tests/selenium/installer/MediaWikiRightFrameworkLinksTestCase.php
+++ /dev/null
@@ -1,83 +0,0 @@
-<?php
-/**
- * MediaWikiRightFrameworkLinksTestCase
- *
- * @file
- * @ingroup Maintenance
- * Copyright (C) 2010 Nadeesha Weerasinghe <nadeesha@calcey.com>
- * http://www.calcey.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.,
- * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
- * http://www.gnu.org/copyleft/gpl.html
- */
-
-require_once ( __DIR__ . '/MediaWikiInstallationCommonFunction.php' );
-
-/**
- * Test Case ID : 14, 15, 16, 17 (http://www.mediawiki.org/wiki/New_installer/Test_plan)
- * Test Case Name : User selects 'Read me' link.
- * User selects 'Release notes' link.
- * User selects 'Copying' link.
- * User selects 'Upgrading' link.
- * Version : MediaWiki 1.18alpha
- */
-class MediaWikiRightFrameworkLinksTestCase extends MediaWikiInstallationCommonFunction {
- function setUp() {
- parent::setUp();
- }
-
- public function testLinksAvailability() {
- $this->open( "http://" . HOST_NAME . ":" . PORT . "/" . DIRECTORY_NAME . "/config/index.php" );
-
- // Verify 'Read me' link availability
- $this->assertTrue( $this->isElementPresent( "link=Read me" ) );
-
- // Verify 'Release notes' link availability
- $this->assertTrue( $this->isElementPresent( "link=Release notes" ) );
-
- // Verify 'Copying' link availability
- $this->assertTrue( $this->isElementPresent( "link=Copying" ) );
- }
-
- public function testPageNavigation() {
- $this->open( "http://" . HOST_NAME . ":" . PORT . "/" . DIRECTORY_NAME . "/config/index.php" );
-
- // Navigate to the 'Read me' page
- $this->click( "link=Read me" );
- $this->waitForPageToLoad( PAGE_LOAD_TIME );
- $this->assertEquals( "Read me", $this->getText( LINK_DIV . "h2[1]" ) );
- $this->assertTrue( $this->isElementPresent( "submit-back" ) );
- parent::clickBackButton();
-
- // Navigate to the 'Release notes' page
- $this->click( "link=Release notes" );
- $this->waitForPageToLoad( PAGE_LOAD_TIME );
- $this->assertEquals( "Release notes", $this->getText( LINK_DIV . "h2[1]" ) );
- $this->assertTrue( $this->isElementPresent( "submit-back" ) );
- parent::clickBackButton();
-
- // Navigate to the 'Copying' page
- $this->click( "link=Copying" );
- $this->waitForPageToLoad( PAGE_LOAD_TIME );
- $this->assertEquals( "Copying", $this->getText( LINK_DIV . "h2[1]" ) );
- $this->assertTrue( $this->isElementPresent( "submit-back" ) );
- parent::clickBackButton();
-
- // Navigate to the 'Upgrading' page
- $this->click( "link=Upgrading" );
- $this->waitForPageToLoad( PAGE_LOAD_TIME );
- $this->assertEquals( "Upgrading", $this->getText( LINK_DIV . "h2[1]" ) );
- }
-}
diff --git a/tests/selenium/installer/MediaWikiUpgradeExistingDatabaseTestCase.php b/tests/selenium/installer/MediaWikiUpgradeExistingDatabaseTestCase.php
deleted file mode 100644
index cd901d18..00000000
--- a/tests/selenium/installer/MediaWikiUpgradeExistingDatabaseTestCase.php
+++ /dev/null
@@ -1,111 +0,0 @@
-<?php
-/**
- * MediaWikiUpgradeExistingDatabaseTestCase
- *
- * @file
- * @ingroup Maintenance
- * Copyright (C) 2010 Nadeesha Weerasinghe <nadeesha@calcey.com>
- * http://www.calcey.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.,
- * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
- * http://www.gnu.org/copyleft/gpl.html
- */
-
-require_once ( __DIR__ . '/MediaWikiInstallationCommonFunction.php' );
-
-/**
- * Test Case ID : 05 (http://www.mediawiki.org/wiki/New_installer/Test_plan)
- * Test Case Name : Install Mediawiki by updating the existing database.
- * Version : MediaWiki 1.18alpha
- */
-class MediaWikiUpgradeExistingDatabaseTestCase extends MediaWikiInstallationCommonFunction {
- function setUp() {
- parent::setUp();
- }
-
- // Install Mediawiki using 'MySQL' database type.
- public function testUpgradeExistingDatabase() {
-
- $databaseName = DB_NAME_PREFIX . "_upgrade_existing";
- parent::navigateInstallPage( $databaseName );
-
- $this->open( "http://localhost:" . PORT . "/" . DIRECTORY_NAME . "/config/index.php" );
- $this->assertEquals( "Install", $this->getText( LINK_DIV . "h2" ) );
- $this->assertEquals(
- "Warning: You seem to have already installed MediaWiki and are trying to install it again. Please proceed to the next page.",
- $this->getText( LINK_DIV . "div[2]/form/div[1]/div[2]" )
- );
-
- // 'Optionis' page
- parent::clickBackButton();
-
- // 'Name' page
- parent::clickBackButton();
-
- // 'Database settings' page
- parent::clickBackButton();
-
- // 'Connect to database' page
- parent::clickBackButton();
- $this->type( "mysql_wgDBname", $databaseName );
- parent::clickContinueButton();
-
- // 'Upgrade existing installation' page displayed next to the 'Connect to database' page.
- $this->assertEquals( "Upgrade existing installation", $this->getText( LINK_DIV . "h2" ) );
-
- // Warning message displayed.
- $this->assertEquals( "There are MediaWiki tables in this database. To upgrade them to MediaWiki 1.18alpha, click Continue.",
- $this->getText( LINK_DIV . "div[2]/form/div[1]/div[2]" ) );
-
- parent::clickContinueButton();
- $this->assertEquals( "Upgrade existing installation",
- $this->getText( LINK_DIV . "h2" ) );
-
- // 'Upgrade complete.' text display
- $this->assertEquals( "Upgrade complete.",
- $this->getText( "//div[@id='bodyContent']/div/div[1]/div[4]/form/div[1]/div[2]/p[1]" ) );
-
- $this->assertEquals( "You can now Folder/index.php start using your wiki.",
- $this->getText( "//div[@id='bodyContent']/div/div[1]/div[4]/form/div[1]/div[2]/p[2]" ) );
-
- $this->assertEquals( "Folder/index.php start using your wiki",
- $this->getText( "link=Folder/index.php start using your wiki" ) );
-
- $this->assertTrue( $this->isElementPresent( "submit-regenerate" ) );
- $this->click( "submit-regenerate" );
- $this->waitForPageToLoad( PAGE_LOAD_TIME );
- $this->assertEquals( "Database settings",
- $this->getText( LINK_DIV . "h2" ) );
-
- // 'Database settings' page
- parent::clickContinueButton();
-
- // Name page
- parent::completeNamePage();
-
- // Options page
- parent::clickContinueButton();
-
- // Install page
- $this->assertEquals( "Warning: You seem to have already installed MediaWiki and are trying to install it again. Please proceed to the next page.",
- $this->getText( LINK_FORM . "div[1]/div[2]" ) );
- parent::clickContinueButton();
-
- // complete
- parent::completePageSuccessfull();
- $this->chooseCancelOnNextConfirmation();
- parent::restartInstallation();
- }
-}
diff --git a/tests/selenium/installer/MediaWikiUserInterfaceTestCase.php b/tests/selenium/installer/MediaWikiUserInterfaceTestCase.php
deleted file mode 100644
index 97331523..00000000
--- a/tests/selenium/installer/MediaWikiUserInterfaceTestCase.php
+++ /dev/null
@@ -1,494 +0,0 @@
-<?php
-/**
- * MediaWikiUserInterfaceTestCase
- *
- * @file
- * @ingroup Maintenance
- * Copyright (C) 2010 Nadeesha Weerasinghe <nadeesha@calcey.com>
- * http://www.calcey.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.,
- * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
- * http://www.gnu.org/copyleft/gpl.html
- */
-
-require_once ( __DIR__ . '/MediaWikiInstallationCommonFunction.php' );
-
-/**
- * Test Case ID : 18 - 27 (http://www.mediawiki.org/wiki/New_installer/Test_plan)
- * Test Case Name : UI of MediaWiki initial/ Language/ Welcome to MediaWiki!/ Connect to database/
- * Database settings/ Name/ Options/ Install/ Complete/ Restart Inslation pages
- * Version : MediaWiki 1.18alpha
- */
-class MediaWikiUserInterfaceTestCase extends MediaWikiInstallationCommonFunction {
- function setUp() {
- parent::setUp();
- }
-
- public function testInitialPageUI() {
-
- parent::navigateInitialpage();
-
- // MediaWiki logo available
- $this->assertTrue( $this->isElementPresent( "//img[@alt='The MediaWiki logo']" ) );
-
- // 'MediaWiki 1.18alpha' text available
- $this->assertEquals( "MediaWiki 1.18alpha", $this->getText( "//h1" ) );
-
- // 'LocalSettings.php not found.' text available
- $this->assertEquals( "LocalSettings.php not found.", $this->getText( "//p[1]" ) );
-
- // 'Please set up the wiki first' text available
- $this->assertEquals( "Please set up the wiki first.", $this->getText( "//p[2]" ) );
-
- // 'set up the wiki' link available
- $this->assertTrue( $this->isElementPresent( "link=set up the wiki" ) );
- }
-
- public function testlanguagePageUI() {
- parent::navigateLanguagePage();
-
- // Verify 'Language' heading
- $this->assertEquals( "Language", $this->getText( LINK_DIV . "h2" ) );
-
- // 'Your language' label available
- $this->assertEquals( "Your language:",
- $this->getText( LINK_FORM . "div[1]/div[1]/label" ) );
-
- // 'Your language' dropdown available
- $this->assertTrue( $this->isElementPresent( "UserLang" ) );
-
- // 'Wiki language' label available
- $this->assertEquals( "Wiki language:",
- $this->getText( LINK_FORM . "div[2]/div[1]/label" ) );
-
- // 'Wiki language' dropdown available
- $this->assertTrue( $this->isElementPresent( "ContLang" ) );
- }
-
- public function testWelcometoMediaWikiUI() {
- parent::navigateWelcometoMediaWikiPage();
-
- // Verify 'Welcome to MediaWiki!' heading
- $this->assertEquals( "Welcome to MediaWiki!",
- $this->getText( LINK_DIV . "h2" ) );
-
- // Verify environment ok text displayed.
- $this->assertEquals( "The environment has been checked.You can install MediaWiki.",
- $this->getText( LINK_DIV . "div[6]/span" ) );
- }
-
- public function testConnectToDatabaseUI() {
- parent::navigateConnetToDatabasePage();
-
- // 'MYSQL radio button available
- $this->assertEquals( "MySQL",
- $this->getText( LINK_FORM . "div[2]/div[2]/ul/li[1]/label" ) );
- $this->assertTrue( $this->isElementPresent( LINK_FORM . "div[2]/div[2]/ul/li[1]" ) );
-
- // 'SQLite' radio button available
- $this->assertTrue( $this->isElementPresent( LINK_FORM . "div[2]/div[2]/ul/li[2]" ) );
- $this->assertEquals( "SQLite", $this->getText( LINK_FORM . "div[2]/div[2]/ul/li[2]/label " ) );
-
- // 'Database host' label available
- $this->assertEquals( "Database host:", $this->getText( "//div[@id='DB_wrapper_mysql']/div/div[1]/label" ) );
-
- // 'Database host' text box default to 'localhost'
- $this->assertEquals( "localhost", $this->getValue( "mysql_wgDBserver" ) );
-
- // 'Identify this wiki' section available
- $this->assertTrue( $this->isElementPresent( "//div[@id='DB_wrapper_mysql']/fieldset[1]/legend" ) );
-
- // 'Identify this wiki' label available
- $this->assertEquals( "Identify this wiki", $this->getText( "//div[@id='DB_wrapper_mysql']/fieldset[1]/legend" ) );
-
- // 'Database name' lable available
- $this->assertEquals( "Database name:",
- $this->getText( "//div[@id='DB_wrapper_mysql']/fieldset[1]/div[1]/div[1]/label" ) );
-
- // Verify 'Database name:' text box is default to 'my_wiki'
- $this->assertEquals( "my_wiki", $this->getValue( "mysql_wgDBname" ) );
-
- // Verify 'Database table prefix:' label available
- $this->assertEquals( "Database table prefix:",
- $this->getText( "//div[@id='DB_wrapper_mysql']/fieldset[1]/div[2]/div[1]/label" ) );
-
- // 'User account for installation' section available
- $this->assertTrue( $this->isElementPresent( "//div[@id='DB_wrapper_mysql']/fieldset[2]/legend" ) );
-
- // 'User account for installation' label available
- $this->assertEquals( "User account for installation", $this->getText( "//div[@id='DB_wrapper_mysql']/fieldset[2]/legend" ) );
-
- // 'Database username' label available
- $this->assertEquals( "Database username:",
- $this->getText( "//div[@id='DB_wrapper_mysql']/fieldset[2]/div[1]/div[1]/label" ) );
-
- // 'Database username' text box defaults to 'root'
- $this->assertEquals( "root", $this->getValue( "mysql__InstallUser" ) );
-
- // 'Database password' label available
- $this->assertEquals( "Database password:",
- $this->getText( "//div[@id='DB_wrapper_mysql']/fieldset[2]/div[2]/div[1]/label" ) );
- }
-
- public function testDatabaseSettingsUI() {
- $databaseName = DB_NAME_PREFIX . "_db_settings_UI";
- parent::navigateDatabaseSettingsPage( $databaseName );
-
- // 'Database settings' text available.
- $this->assertEquals( "Database settings", $this->getText( LINK_DIV . "h2" ) );
-
- // 'Database account for web access' section available
- $this->assertTrue( $this->isElementPresent( LINK_FORM . "fieldset" ) );
-
- // 'Database account for web access' label available
- $this->assertEquals( "Database account for web access", $this->getText( LINK_FORM . "fieldset/legend" ) );
-
- // 'Use the same account as for installation' check box available
- $this->assertEquals( "Use the same account as for installation", $this->getText( LINK_FORM . "fieldset/div[1]/label" ) );
-
- // 'Use the same account as for installation' check box is selected by default
- $this->assertEquals( "on", $this->getValue( "mysql__SameAccount" ) );
-
- // 'Use the same account as for installation' check box deselected
- $this->click( "mysql__SameAccount" );
-
- // verify 'Use the same account as for installation' check box is not selected
- $this->assertEquals( "off", $this->getValue( "mysql__SameAccount" ) );
-
- // 'Database username' label available
- $this->assertEquals( "Database username:", $this->getText( "//div[@id='dbOtherAccount']/div[1]/div[1]/label" ) );
-
- // 'Database username' text box is default to the 'wikiuser'
- $this->assertEquals( "wikiuser", $this->getValue( "mysql_wgDBuser" ) );
-
- // 'Database password' label available
- $this->assertEquals( "Database password:", $this->getText( "//div[@id='dbOtherAccount']/div[2]/div[1]/label" ) );
-
- // 'Create the account if it does not already exist' label available
- $this->assertEquals( "Create the account if it does not already exist", $this->getText( "//div[@id='dbOtherAccount']/div[4]/label" ) );
-
- // 'Create the account if it does not already exist' check box is not selected by default
- $this->assertEquals( "off", $this->getValue( "mysql__CreateDBAccount" ) );
-
- // 'Create the account if it does not already exist' check box selected
- $this->click( "mysql__CreateDBAccount" );
-
- // Verify 'Create the account if it does not already exist' check box is selected
- $this->assertEquals( "on", $this->getValue( "mysql__CreateDBAccount" ) );
- $this->click( "mysql__SameAccount" );
- $this->assertEquals( "on", $this->getValue( "mysql__SameAccount" ) );
-
- // 'Storage engine' label available
- $this->assertEquals( "Storage engine:",
- $this->getText( LINK_FORM . "div[1]/div[1]/label" ) );
-
- // 'InnoDB' label available
- $this->assertEquals( "InnoDB",
- $this->getText( LINK_FORM . "div[1]/div[2]/ul/li[1]/label" ) );
-
- // 'InnoDB' radio button available
- $this->assertTrue( $this->isElementPresent( "mysql__MysqlEngine_InnoDB" ) );
-
- // 'MyISAM' label available
- $this->assertEquals( "MyISAM", $this->getText( LINK_FORM . "div[1]/div[2]/ul/li[2]/label" ) );
-
- // 'MyISAM' radio button available
- $this->assertTrue( $this->isElementPresent( "mysql__MysqlEngine_MyISAM" ) );
-
- // 'Database character set' label available
- $this->assertEquals( "Database character set:",
- $this->getText( LINK_FORM . "div[3]/div[1]/label" ) );
-
- // 'Binary' radio button available
- $this->assertTrue( $this->isElementPresent( "mysql__MysqlCharset_binary" ) );
-
- // 'Binary' radio button available
- $this->assertEquals( "Binary", $this->getText( LINK_FORM . "div[3]/div[2]/ul/li[1]/label" ) );
-
- // 'UTF-8' radio button available
- $this->assertTrue( $this->isElementPresent( "mysql__MysqlCharset_utf8" ) );
-
- // 'UTF-8' label available
- $this->assertEquals( "UTF-8", $this->getText( LINK_FORM . "div[3]/div[2]/ul/li[2]/label" ) );
-
- // 'Binary' radio button is selected
- $this->assertEquals( "on", $this->getValue( "mysql__MysqlCharset_binary" ) );
- }
-
- public function testNamePageUI() {
- $databaseName = DB_NAME_PREFIX . "_name_UI";
- parent::navigateNamePage( $databaseName );
-
- // 'Name of wiki' text box available
- $this->assertEquals( "Name of wiki:",
- $this->getText( LINK_FORM . "div[1]/div[1]/label" ) );
-
- $this->assertTrue( $this->isElementPresent( "config_wgSitename" ) );
-
- // 'Project namespace' label available
- $this->assertEquals( "Project namespace:",
- $this->getText( LINK_FORM . "div[2]/div[1]/label" ) );
-
- // 'Same as the wiki name' radio button available
- $this->assertTrue( $this->isElementPresent( "config__NamespaceType_site-name" ) );
-
- // 'Project' radio button available
- $this->assertTrue( $this->isElementPresent( "config__NamespaceType_generic" ) );
-
- // 'Project' radio button available
- $this->assertTrue( $this->isElementPresent( "config__NamespaceType_other" ) );
-
- // 'Same as the wiki name' label available
- $this->assertEquals( "Same as the wiki name:",
- $this->getText( LINK_FORM . "div[2]/div[2]/ul/li[1]/label" ) );
-
- // 'Project' label available
- $this->assertEquals( "Project",
- $this->getText( LINK_FORM . "div[2]/div[2]/ul/li[2]/label" ) );
-
- // 'Project' label available
- $this->assertEquals( "Other (specify)",
- $this->getText( LINK_FORM . "div[2]/div[2]/ul/li[3]/label" ) );
-
- // 'Same as the wiki name' radio button selected by default
- $this->assertEquals( "on", $this->getValue( "config__NamespaceType_site-name" ) );
-
- // 'Administrator account' section available
- $this->assertTrue( $this->isElementPresent( LINK_FORM . "fieldset" ) );
-
- // 'Administrator account' label available
- $this->assertEquals( "Administrator account",
- $this->getText( LINK_FORM . "fieldset/legend" ) );
-
- // 'Your Name' label available
- $this->assertEquals( "Your name:",
- $this->getText( LINK_FORM . "fieldset/div[1]/div[1]/label" ) );
-
- // 'Your Name' text box available
- $this->assertTrue( $this->isElementPresent( "config__AdminName" ) );
-
- // 'Password' label available
- $this->assertEquals( "Password:",
- $this->getText( LINK_FORM . "fieldset/div[2]/div[1]/label" ) );
-
- // 'Password' text box available
- $this->assertTrue( $this->isElementPresent( "config__AdminPassword" ) );
-
- // 'Password again' label available
- $this->assertEquals( "Password again:",
- $this->getText( LINK_FORM . "fieldset/div[3]/div[1]/label" ) );
-
- // 'Password again' text box available
- $this->assertTrue( $this->isElementPresent( "config__AdminPassword2" ) );
-
- // 'Email address' label avaialble
- $this->assertEquals( "E-mail address:",
- $this->getText( LINK_FORM . "fieldset/div[4]/div[1]/label" ) );
-
- // 'Email address' text box available
- $this->assertTrue( $this->isElementPresent( "config__AdminEmail" ) );
-
- // Message displayed
- $this->assertEquals( "You are almost done! You can now skip the remaining configuration and install the wiki right now.",
- $this->getText( LINK_FORM . "/div[4]/div[2]/p" ) );
-
- // 'Ask me more questions.' radio button available
- $this->assertTrue( $this->isElementPresent( "config__SkipOptional_continue" ) );
-
- // 'Ask me more questions.' label available
- $this->assertEquals( "Ask me more questions.",
- $this->getText( LINK_FORM . "div[5]/div[2]/ul/li[1]/label" ) );
-
- // 'I'm bored already, just install the wiki' radio button is avaiable
- $this->assertTrue( $this->isElementPresent( "config__SkipOptional_skip" ) );
-
- // 'I'm bored already, just install the wiki' label available
- $this->assertEquals( "I'm bored already, just install the wiki.",
- $this->getText( LINK_FORM . "div[5]/div[2]/ul/li[2]/label" ) );
-
- // 'Ask me more questions.' radio button is default selected
- $this->assertEquals( "on", $this->getValue( "config__SkipOptional_continue" ) );
- }
-
- public function testOptionPageUI() {
- $databaseName = DB_NAME_PREFIX . "_options_UI";
- parent::navigateOptionsPage( $databaseName );
-
- // 'Options' label available
- $this->assertEquals( "Options", $this->getText( LINK_DIV . "h2" ) );
-
- // 'Return e-mail address' label available
- $this->assertEquals( "Return e-mail address:", $this->getText( "//div[@id='emailwrapper']/div[1]/div[1]/label" ) );
-
- // 'Return e-mail address' text box available
- $this->assertTrue( $this->isElementPresent( "config_wgPasswordSender" ) );
-
- // Text 'apache@localhost' is default value of the 'Return e-mail address' text box
- $this->assertEquals( "apache@localhost", $this->getValue( "config_wgPasswordSender" ) );
-
- // 'Logo URL' label available
- $this->assertEquals( "Logo URL:", $this->getText( LINK_FORM . "fieldset[2]/div[3]/div[1]/label" ) );
-
- // 'Logo URL' text box available
- $this->assertTrue( $this->isElementPresent( "config_wgLogo" ) );
-
- // Correct path available in the 'Logo URL' text box
- $this->assertEquals( "/wiki/skins/common/images/wiki.png", $this->getValue( "config_wgLogo" ) );
-
- // 'Enable file uploads' radio button available
- $this->assertTrue( $this->isElementPresent( "config_wgEnableUploads" ) );
-
- // 'Enable file uploads' label available
- $this->assertEquals( "Enable file uploads",
- $this->getText( LINK_FORM . "fieldset[2]/div[1]/label" ) );
-
- // 'Enable file uploads' check box is not selected
- $this->assertEquals( "off", $this->getValue( "config_wgEnableUploads" ) );
-
- $this->click( "config_wgEnableUploads" );
-
- // 'Directory for deleted files' label available
- $this->assertEquals( "Directory for deleted files:",
- $this->getText( "//div[@id='uploadwrapper']/div/div[1]/label" ) );
-
- // 'Directory for deleted files' text box available
- $this->assertTrue( $this->isElementPresent( "config_wgDeletedDirectory" ) );
-
- // Correct path available in the 'Directory for deleted files' text box
- $this->assertEquals( "C:\\wamp\\www\\" . DIRECTORY_NAME . "/images/deleted",
- $this->getValue( "config_wgDeletedDirectory" ) );
- }
-
- public function testInstallPageUI() {
- $databaseName = DB_NAME_PREFIX . "_install_UI";
- parent::navigateInstallPage( $databaseName );
-
- // Verify installation done messages display
- $this->assertEquals( "Setting up database... done",
- $this->getText( LINK_FORM . "ul/li[1]" ) );
- $this->assertEquals( "Creating tables... done",
- $this->getText( LINK_FORM . "ul/li[2]" ) );
- $this->assertEquals( "Creating database user... done",
- $this->getText( LINK_FORM . "ul/li[3]" ) );
- $this->assertEquals( "Populating default interwiki table... done",
- $this->getText( LINK_FORM . "ul/li[4]" ) );
- $this->assertEquals( "Generating secret key... done",
- $this->getText( LINK_FORM . "ul/li[5]" ) );
- $this->assertEquals( "Generating default upgrade key... done",
- $this->getText( LINK_FORM . "ul/li[6]" ) );
- $this->assertEquals( "Creating administrator user account... done",
- $this->getText( LINK_FORM . "ul/li[7]" ) );
- $this->assertEquals( "Creating main page with default content... done",
- $this->getText( LINK_FORM . "ul/li[8]" ) );
- }
-
- public function testCompletePageUI() {
- $databaseName = DB_NAME_PREFIX . "_complete_UI";
- parent::navigateCompletePage( $databaseName );
-
- // 'Congratulations!' text display
- $this->assertEquals( "Congratulations!",
- $this->getText( LINK_FORM . "div[1]/div[2]/p[1]/b" ) );
- // 'LocalSettings.php' generated message display
- $this->assertEquals( "The installer has generated a LocalSettings.php file. It contains all your configuration.",
- $this->getText( LINK_FORM . "div[1]/div[2]/p[2]" ) );
-
- // 'Download LocalSettings.php'' link available
- $this->assertTrue( $this->isElementPresent( "link=Download LocalSettings.php" ) );
-
- // 'enter your wiki' link available
- $this->assertTrue( $this->isElementPresent( "link=Folder/index.php enter your wiki" ) );
- }
-
- public function testRestartInstallation() {
- parent::navigateConnetToDatabasePage();
- $this->click( "link=Restart installation" );
- $this->waitForPageToLoad( PAGE_LOAD_TIME );
-
- // Restart installation' label should be available.
- $this->assertEquals( "Restart installation", $this->getText( LINK_DIV . "h2" ) );
-
- //'Do you want to clear all saved data that you have entered and restart the installation process?' label available
- $this->assertEquals( "Do you want to clear all saved data that you have entered and restart the installation process?",
- $this->getText( "//*[@id='bodyContent']/div/div/div[2]/form/div[1]/div[2]" ) );
- // 'Back' button available
- $this->assertTrue( $this->isElementPresent( "submit-back" ) );
-
- // 'Restart' button available
- $this->assertTrue( $this->isElementPresent( "submit-restart" ) );
- }
-
- public function testMediaWikiLogoAvailability() {
- $databaseName = DB_NAME_PREFIX . "_mediawiki_logo";
- parent::navigateInitialpage();
- parent::mediaWikiLogoPresentInitialScreen();
- $this->click( "link=set up the wiki" );
- $this->waitForPageToLoad( PAGE_LOAD_TIME );
-
- // 'Language' page
- parent::mediaWikiLogoPresent();
- parent::clickContinueButton();
-
- // 'Welcome to MediaWiki' page
- parent::mediaWikiLogoPresent();
- parent::clickContinueButton();
-
- // 'Connet to database' page
- parent::mediaWikiLogoPresent();
- $this->type( "mysql_wgDBname", $databaseName );
- parent::clickContinueButton();
-
- // 'Database setting' page
- parent::mediaWikiLogoPresent();
- parent::clickContinueButton();
-
- // 'Name' page
- parent::mediaWikiLogoPresent();
- parent::completeNamePage();
- parent::clickContinueButton();
-
- // 'Options' page
- parent::mediaWikiLogoPresent();
- parent::clickContinueButton();
-
- // 'Install' page
- parent::mediaWikiLogoPresent();
- }
-
- public function testRightFramework() {
- parent::navigateLanguagePage();
- // Verfy right framework texts display
- $this->assertEquals( "Language",
- $this->getText( LINK_RIGHT_FRAMEWORK . "li[1]" ) );
- $this->assertEquals( "Existing wiki",
- $this->getText( LINK_RIGHT_FRAMEWORK . "li[2]" ) );
- $this->assertEquals( "Welcome to MediaWiki!",
- $this->getText( LINK_RIGHT_FRAMEWORK . "li[3]" ) );
- $this->assertEquals( "Connect to database",
- $this->getText( LINK_RIGHT_FRAMEWORK . "li[4]" ) );
- $this->assertEquals( "Upgrade existing installation",
- $this->getText( LINK_RIGHT_FRAMEWORK . "li[5]" ) );
- $this->assertEquals( "Database settings",
- $this->getText( LINK_RIGHT_FRAMEWORK . "li[6]" ) );
- $this->assertEquals( "Name",
- $this->getText( LINK_RIGHT_FRAMEWORK . "li[7]" ) );
- $this->assertEquals( "Options",
- $this->getText( LINK_RIGHT_FRAMEWORK . "li[8]" ) );
- $this->assertEquals( "Install",
- $this->getText( LINK_RIGHT_FRAMEWORK . "li[9]" ) );
- $this->assertEquals( "Complete!",
- $this->getText( LINK_RIGHT_FRAMEWORK . "li[10]/span" ) );
- }
-}
diff --git a/tests/selenium/installer/README.txt b/tests/selenium/installer/README.txt
deleted file mode 100644
index bc880a8b..00000000
--- a/tests/selenium/installer/README.txt
+++ /dev/null
@@ -1,32 +0,0 @@
-== Details==
-
-Automated Selenium test scripts written for MediaWiki Installer is available at https://gerrit.wikimedia.org/r/gitweb?p=mediawiki/core.git;a=tree;f=tests/selenium/installer;hb=HEAD.
-Detailed test cases available at http://www.mediawiki.org/wiki/New_installer/Test_plan.
-
-Version : MediaWiki 1.18alpha
-Date : 27/12/2010
-
-== Running tests ==
-
-Test cases can be run independently or can run all the test cases using MediaWikiInstallerTestSuite.php within PHPUnit/Selenium.
-
-
-== Dependencies ==
-
-MediaWikiInstallationConfig.php
-
-Value of the 'DB_NAME_PREFIX' should be replace with the database name prefix. Several DB instances will get created to cover different installation scenarios starting with the above prefix.
-You need to change the value of the 'DB_NAME_PREFIX' in MediaWikiInstallationConfig everytime you planned to
-run the tests.
-'DIRECTORY_NAME', 'PORT' and the 'HOST_NAME' should be replaced with your local values.
-You may specify the test browser you wish to run the test using 'TEST_BROWSER'. Default browser is Firefox.
-
-Note : MediaWikiInstallerTestSuite.php has no dependency on 'Selenium' test framework.
-
-
-== Known problems ==
-
-If you run the MediaWikiInstallerTestSuite.php twice without changing the name of the database, the second run should be falied.
-(Please read the more information on how to change the database name which is avaialable under 'Dependencies' section)
-
-
diff --git a/tests/selenium/selenium_settings.ini.sample b/tests/selenium/selenium_settings.ini.sample
deleted file mode 100644
index b1d88193..00000000
--- a/tests/selenium/selenium_settings.ini.sample
+++ /dev/null
@@ -1,32 +0,0 @@
-[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] = "tests/selenium/suites/SimpleSeleniumTestSuite.php"
-testSuite[WikiEditorTestSuite] = "extensions/WikiEditor/selenium/WikiEditorTestSuite.php"
-
diff --git a/tests/selenium/selenium_settings_grid.ini.sample b/tests/selenium/selenium_settings_grid.ini.sample
deleted file mode 100644
index 3bbd534a..00000000
--- a/tests/selenium/selenium_settings_grid.ini.sample
+++ /dev/null
@@ -1,16 +0,0 @@
-[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
-startserver = false
-stopserver = false
-
-[SeleniumTests]
-
-testSuite[SimpleSeleniumTestSuite] = "tests/selenium/suites/SimpleSeleniumTestSuite.php"
diff --git a/tests/selenium/suites/AddContentToNewPageTestCase.php b/tests/selenium/suites/AddContentToNewPageTestCase.php
deleted file mode 100644
index 2803ff2a..00000000
--- a/tests/selenium/suites/AddContentToNewPageTestCase.php
+++ /dev/null
@@ -1,173 +0,0 @@
-<?php
-/**
- * Selenium server manager
- *
- * @file
- * @ingroup Testing
- * Copyright (C) 2010 Nadeesha Weerasinghe <nadeesha@calcey.com>
- * http://www.calcey.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.,
- * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
- * http://www.gnu.org/copyleft/gpl.html
- */
-
-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( SeleniumTestConstants::WIKI_TEST_WAIT_TIME );
-
- // 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( SeleniumTestConstants::WIKI_TEST_WAIT_TIME );
-
- // 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( SeleniumTestConstants::WIKI_TEST_WAIT_TIME );
-
- // 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( SeleniumTestConstants::LINK_START . "Link title" );
- $this->waitForPageToLoad( SeleniumTestConstants::WIKI_TEST_WAIT_TIME );
-
- // 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( SeleniumTestConstants::TEXT_EDITOR, "[http://www.google.com Google]" );
- $this->clickShowPreviewBtn();
- $this->waitForPageToLoad( SeleniumTestConstants::WIKI_TEST_WAIT_TIME );
-
- // Verify external links displayed on mediawiki preview
- $source = $this->getText( "//*[@id='wikiPreview']/p/a" );
- $correct = strstr( $source, "Google" );
- $this->assertEquals( $correct, true );
-
- $this->click( SeleniumTestConstants::LINK_START . "Google" );
- $this->waitForPageToLoad( SeleniumTestConstants::WIKI_TEST_WAIT_TIME );
-
- // 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( SeleniumTestConstants::WIKI_TEST_WAIT_TIME );
- $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( SeleniumTestConstants::WIKI_TEST_WAIT_TIME );
-
- // 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( SeleniumTestConstants::WIKI_TEST_WAIT_TIME );
-
- // 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( SeleniumTestConstants::WIKI_TEST_WAIT_TIME );
-
- // Verify horizontal line displayed on mediawiki preview
- $this->assertTrue( $this->isElementPresent( "//div[@id='wikiPreview']/hr" ) );
- $this->deletePage( "new" );
- }
-}
diff --git a/tests/selenium/suites/AddNewPageTestCase.php b/tests/selenium/suites/AddNewPageTestCase.php
deleted file mode 100644
index c70af339..00000000
--- a/tests/selenium/suites/AddNewPageTestCase.php
+++ /dev/null
@@ -1,59 +0,0 @@
-<?php
-/**
- * Selenium server manager
- *
- * @file
- * @ingroup Testing
- * Copyright (C) 2010 Nadeesha Weerasinghe <nadeesha@calcey.com>
- * http://www.calcey.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.,
- * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
- * http://www.gnu.org/copyleft/gpl.html
- */
-
-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( SeleniumTestConstants::WIKI_TEST_WAIT_TIME );
-
- // 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( SeleniumTestConstants::LINK_START . $displayName );
- $this->waitForPageToLoad( SeleniumTestConstants::WIKI_TEST_WAIT_TIME );
-
- $this->assertTrue( $this->isElementPresent( SeleniumTestConstants::LINK_START . "Create" ) );
- $this->type( "wpTextbox1", "add new test page" );
- $this->click( SeleniumTestConstants::BUTTON_SAVE );
-
- // Verify new page added
- $source = $this->gettext( "firstHeading" );
- $correct = strstr( $source, $displayName );
- $this->assertEquals( $correct, true );
- }
-}
diff --git a/tests/selenium/suites/CreateAccountTestCase.php b/tests/selenium/suites/CreateAccountTestCase.php
deleted file mode 100644
index a603f995..00000000
--- a/tests/selenium/suites/CreateAccountTestCase.php
+++ /dev/null
@@ -1,109 +0,0 @@
-<?php
-/**
- * Selenium server manager
- *
- * @file
- * @ingroup Testing
- * Copyright (C) 2010 Nadeesha Weerasinghe <nadeesha@calcey.com>
- * http://www.calcey.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.,
- * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
- * http://www.gnu.org/copyleft/gpl.html
- */
-
-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( SeleniumTestConstants::WIKI_TEST_WAIT_TIME );
-
- $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( SeleniumTestConstants::WIKI_TEST_WAIT_TIME );
-
- $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( SeleniumTestConstants::WIKI_TEST_WAIT_TIME );
- $this->assertTrue( $this->isElementPresent( "link=Create an account" ) );
- }
-
- // Verify Create account
- public function testCreateAccount() {
-
- $this->click( "link=Log out" );
- $this->waitForPageToLoad( SeleniumTestConstants::WIKI_TEST_WAIT_TIME );
-
- $this->open( $this->getUrl() . '/index.php?title=Main_Page' );
-
- $this->click( "link=Log in / create account" );
- $this->waitForPageToLoad( SeleniumTestConstants::WIKI_TEST_WAIT_TIME );
-
- $this->click( "link=Create an account" );
- $this->waitForPageToLoad( SeleniumTestConstants::WIKI_TEST_WAIT_TIME );
-
- // Verify for blank user name
- $this->type( "wpName2", "" );
- $this->click( "wpCreateaccount" );
- $this->waitForPageToLoad( SeleniumTestConstants::WIKI_TEST_WAIT_TIME );
- $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( SeleniumTestConstants::WIKI_TEST_WAIT_TIME );
- $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( SeleniumTestConstants::WIKI_TEST_WAIT_TIME );
- $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( SeleniumTestConstants::WIKI_TEST_WAIT_TIME );
- $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( SeleniumTestConstants::WIKI_TEST_WAIT_TIME );
-
- // 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/tests/selenium/suites/DeletePageAdminTestCase.php b/tests/selenium/suites/DeletePageAdminTestCase.php
deleted file mode 100644
index f0005cde..00000000
--- a/tests/selenium/suites/DeletePageAdminTestCase.php
+++ /dev/null
@@ -1,82 +0,0 @@
-<?php
-/**
- * Selenium server manager
- *
- * @file
- * @ingroup Testing
- * Copyright (C) 2010 Nadeesha Weerasinghe <nadeesha@calcey.com>
- * http://www.calcey.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.,
- * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
- * http://www.gnu.org/copyleft/gpl.html
- */
-
-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( SeleniumTestConstants::WIKI_TEST_WAIT_TIME );
- $this->click( SeleniumTestConstants::LINK_START . $displayName );
- $this->waitForPageToLoad( SeleniumTestConstants::WIKI_TEST_WAIT_TIME );
- $this->type( SeleniumTestConstants::TEXT_EDITOR, $newPage . " text" );
- $this->click( SeleniumTestConstants::BUTTON_SAVE );
-
- $this->open( $this->getUrl() .
- '/index.php?title=Main_Page&action=edit' );
- $this->click( SeleniumTestConstants::LINK_START . "Log out" );
- $this->waitForPageToLoad( SeleniumTestConstants::WIKI_TEST_WAIT_TIME );
- $this->click( SeleniumTestConstants::LINK_START . "Log in / create account" );
- $this->waitForPageToLoad( SeleniumTestConstants::WIKI_TEST_WAIT_TIME );
-
- $this->type( "wpName1", $this->selenium->getUser() );
- $this->type( "wpPassword1", $this->selenium->getPass() );
- $this->click( "wpLoginAttempt" );
- $this->waitForPageToLoad( SeleniumTestConstants::WIKI_TEST_WAIT_TIME );
- $this->type( "searchInput", "new" );
- $this->click( "searchGoButton" );
- $this->waitForPageToLoad( SeleniumTestConstants::WIKI_TEST_WAIT_TIME );
-
- // Verify 'Delete' link displayed
- $source = $this->gettext( SeleniumTestConstants::LINK_START . "Delete" );
- $correct = strstr( $source, "Delete" );
- $this->assertEquals( $correct, true );
-
- $this->click( SeleniumTestConstants::LINK_START . "Delete" );
- $this->waitForPageToLoad( SeleniumTestConstants::WIKI_TEST_WAIT_TIME );
-
- // Verify 'Delete' button available
- $this->assertTrue( $this->isElementPresent( "wpConfirmB" ) );
-
- $this->click( "wpConfirmB" );
- $this->waitForPageToLoad( SeleniumTestConstants::WIKI_TEST_WAIT_TIME );
-
- // 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/tests/selenium/suites/EmailPasswordTestCase.php b/tests/selenium/suites/EmailPasswordTestCase.php
deleted file mode 100644
index 77282e47..00000000
--- a/tests/selenium/suites/EmailPasswordTestCase.php
+++ /dev/null
@@ -1,74 +0,0 @@
-<?php
-/**
- * Selenium server manager
- *
- * @file
- * @ingroup Testing
- * Copyright (C) 2010 Nadeesha Weerasinghe <nadeesha@calcey.com>
- * http://www.calcey.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.,
- * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
- * http://www.gnu.org/copyleft/gpl.html
- */
-
-class EmailPasswordTestCase extends SeleniumTestCase {
- // change user name for each and every test (with in 24 hours)
- private $userName = "test1";
-
- public function testEmailPasswordButton() {
- $this->click( SeleniumTestConstants::LINK_START . "Log out" );
- $this->waitForPageToLoad( SeleniumTestConstants::WIKI_TEST_WAIT_TIME );
-
- $this->open( $this->getUrl() . '/index.php?title=Main_Page' );
-
- // click Log in / create account link to open Log in / create account' page
- $this->click( SeleniumTestConstants::LINK_START . "Log in / create account" );
- $this->waitForPageToLoad( SeleniumTestConstants::WIKI_TEST_WAIT_TIME );
- $this->assertTrue( $this->isElementPresent( "wpMailmypassword" ) );
- }
-
- // Verify Email password functionality
- public function testEmailPasswordMessages() {
- $this->click( SeleniumTestConstants::LINK_START . "Log out" );
- $this->waitForPageToLoad( SeleniumTestConstants::WIKI_TEST_WAIT_TIME );
-
- $this->open( $this->getUrl() . '/index.php?title=Main_Page' );
-
- // click Log in / create account link to open Log in / create account' page
- $this->click( SeleniumTestConstants::LINK_START . "Log in / create account" );
- $this->waitForPageToLoad( SeleniumTestConstants::WIKI_TEST_WAIT_TIME );
-
- $this->type( "wpName1", "" );
- $this->click( "wpMailmypassword" );
- $this->waitForPageToLoad( SeleniumTestConstants::WIKI_TEST_WAIT_TIME );
- $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( SeleniumTestConstants::WIKI_TEST_WAIT_TIME );
-
- // 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( SeleniumTestConstants::WIKI_TEST_WAIT_TIME );
- $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/tests/selenium/suites/MediaWikiEditorConfig.php b/tests/selenium/suites/MediaWikiEditorConfig.php
deleted file mode 100644
index 7fd8e075..00000000
--- a/tests/selenium/suites/MediaWikiEditorConfig.php
+++ /dev/null
@@ -1,41 +0,0 @@
-<?php
-/**
- * Selenium server manager
- *
- * @file
- * @ingroup Testing
- * Copyright (C) 2010 Nadeesha Weerasinghe <nadeesha@calcey.com>
- * http://www.calcey.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.,
- * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
- * http://www.gnu.org/copyleft/gpl.html
- */
-
-class MediaWikiEditorConfig {
- public static function getSettings( &$includeFiles, &$globalConfigs ) {
- $includes = array(
- //files that needed to be included would go here
- //commenting out because this does not exist
- //'tests/selenium/suites/MediaWikiCommonFunction.php'
- );
- $configs = array(
- 'wgPageLoadTime' => "600000"
- );
- $includeFiles = array_merge( $includeFiles, $includes );
- $globalConfigs = array_merge( $globalConfigs, $configs );
- return true;
- }
-}
-
diff --git a/tests/selenium/suites/MediaWikiEditorTestSuite.php b/tests/selenium/suites/MediaWikiEditorTestSuite.php
deleted file mode 100644
index f9cfb7fb..00000000
--- a/tests/selenium/suites/MediaWikiEditorTestSuite.php
+++ /dev/null
@@ -1,19 +0,0 @@
-<?php
-
-class MediaWikiEditorTestSuite extends SeleniumTestSuite {
- public function setUp() {
- $this->setLoginBeforeTests( true );
- parent::setUp();
- }
-
- public function addTests() {
- $testFiles = array(
- 'tests/selenium/suites/AddNewPageTestCase.php',
- 'tests/selenium/suites/AddContentToNewPageTestCase.php',
- 'tests/selenium/suites/PreviewPageTestCase.php',
- 'tests/selenium/suites/SavePageTestCase.php',
- );
- parent::addTestFiles( $testFiles );
- }
-}
-
diff --git a/tests/selenium/suites/MediaWikiExtraTestSuite.php b/tests/selenium/suites/MediaWikiExtraTestSuite.php
deleted file mode 100644
index 8993907a..00000000
--- a/tests/selenium/suites/MediaWikiExtraTestSuite.php
+++ /dev/null
@@ -1,21 +0,0 @@
-<?php
-
-class MediaWikiExtraTestSuite extends SeleniumTestSuite {
- public function setUp() {
- $this->setLoginBeforeTests( true );
- parent::setUp();
- }
-
- public function addTests() {
- $testFiles = array(
- 'tests/selenium/suites/MyContributionsTestCase.php',
- 'tests/selenium/suites/MyWatchListTestCase.php',
- 'tests/selenium/suites/UserPreferencesTestCase.php',
- 'tests/selenium/suites/MovePageTestCase.php',
- 'tests/selenium/suites/PageSearchTestCase.php',
- 'tests/selenium/suites/EmailPasswordTestCase.php',
- 'tests/selenium/suites/CreateAccountTestCase.php'
- );
- parent::addTestFiles( $testFiles );
- }
-}
diff --git a/tests/selenium/suites/MediawikiCoreSmokeTestCase.php b/tests/selenium/suites/MediawikiCoreSmokeTestCase.php
deleted file mode 100644
index 4491afd2..00000000
--- a/tests/selenium/suites/MediawikiCoreSmokeTestCase.php
+++ /dev/null
@@ -1,70 +0,0 @@
-<?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', __DIR__ .
- "\\..\\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/tests/selenium/suites/MediawikiCoreSmokeTestSuite.php b/tests/selenium/suites/MediawikiCoreSmokeTestSuite.php
deleted file mode 100644
index fc69e3c3..00000000
--- a/tests/selenium/suites/MediawikiCoreSmokeTestSuite.php
+++ /dev/null
@@ -1,19 +0,0 @@
-<?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(
- 'tests/selenium/suites/MediawikiCoreSmokeTestCase.php'
- );
- parent::addTestFiles( $testFiles );
- }
-
-
-}
diff --git a/tests/selenium/suites/MovePageTestCase.php b/tests/selenium/suites/MovePageTestCase.php
deleted file mode 100644
index d2eaa40d..00000000
--- a/tests/selenium/suites/MovePageTestCase.php
+++ /dev/null
@@ -1,111 +0,0 @@
-<?php
-/**
- * Selenium server manager
- *
- * @file
- * @ingroup Testing
- * Copyright (C) 2010 Nadeesha Weerasinghe <nadeesha@calcey.com>
- * http://www.calcey.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.,
- * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
- * http://www.gnu.org/copyleft/gpl.html
- */
-
-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( SeleniumTestConstants::WIKI_TEST_WAIT_TIME );
- $this->click( "link=" . $displayName );
- $this->waitForPageToLoad( SeleniumTestConstants::WIKI_TEST_WAIT_TIME );
- $this->type( SeleniumTestConstants::TEXT_EDITOR, $newPage . " text" );
- $this->click( SeleniumTestConstants::BUTTON_SAVE );
- $this->waitForPageToLoad( SeleniumTestConstants::WIKI_TEST_WAIT_TIME );
-
- // Verify link 'Move' available
- $this->assertTrue( $this->isElementPresent( "link=Move" ) );
-
- $this->click( "link=Move" );
- $this->waitForPageToLoad( SeleniumTestConstants::WIKI_TEST_WAIT_TIME );
-
- // 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( SeleniumTestConstants::WIKI_TEST_WAIT_TIME );
-
- // 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( SeleniumTestConstants::WIKI_TEST_WAIT_TIME );
-
- // 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( SeleniumTestConstants::WIKI_TEST_WAIT_TIME );
- $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( SeleniumTestConstants::WIKI_TEST_WAIT_TIME );
-
- // 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( SeleniumTestConstants::WIKI_TEST_WAIT_TIME );
-
- // Verify search using new page name
- $this->assertEquals( $displayName . "move", $this->getText( "firstHeading" ) );
-
- $this->type( "searchInput", $newPage );
- $this->click( "searchGoButton" );
- $this->waitForPageToLoad( SeleniumTestConstants::WIKI_TEST_WAIT_TIME );
-
- // 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/tests/selenium/suites/MyContributionsTestCase.php b/tests/selenium/suites/MyContributionsTestCase.php
deleted file mode 100644
index 81e3a4da..00000000
--- a/tests/selenium/suites/MyContributionsTestCase.php
+++ /dev/null
@@ -1,59 +0,0 @@
-<?php
-/**
- * Selenium server manager
- *
- * @file
- * @ingroup Testing
- * Copyright (C) 2010 Nadeesha Weerasinghe <nadeesha@calcey.com>
- * http://www.calcey.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.,
- * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
- * http://www.gnu.org/copyleft/gpl.html
- */
-
-require_once dirname( __DIR__ ) . '/SeleniumTestConstants.php';
-
-class MyContributionsTestCase extends SeleniumTestCase {
- // Verify user contributions
- public function testRecentChangesAvailability() {
- $newPage = $this->createNewTestPage( "MyContributionsTest" );
-
- // Verify My contributions Link available
- $this->assertTrue( $this->isElementPresent( "link=Contributions" ) );
-
-
- $this->click( "link=Contributions" );
- $this->waitForPageToLoad( SeleniumTestConstants::WIKI_TEST_WAIT_TIME );
-
- // Verify recent page adding available on My Contributions list
- $this->assertEquals( $newPage, $this->getText( "link=" . $newPage ) );
-
- $this->type( SeleniumTestConstants::INPUT_SEARCH_BOX, $newPage );
- $this->click( SeleniumTestConstants::BUTTON_SEARCH );
- $this->waitForPageToLoad( SeleniumTestConstants::WIKI_TEST_WAIT_TIME );
-
- $this->click( SeleniumTestConstants::LINK_EDIT );
- $this->waitForPageToLoad( SeleniumTestConstants::WIKI_TEST_WAIT_TIME );
- $this->type( SeleniumTestConstants::TEXT_EDITOR, $newPage . " text changed" );
- $this->click( SeleniumTestConstants::BUTTON_SAVE );
- $this->waitForPageToLoad( SeleniumTestConstants::WIKI_TEST_WAIT_TIME );
- $this->click( "link=Contributions" );
- $this->waitForPageToLoad( SeleniumTestConstants::WIKI_TEST_WAIT_TIME );
-
- // Verify recent page changes available on My Contributions
- $this->assertTrue( $this->isTextPresent( $newPage ) );
- }
-}
-
diff --git a/tests/selenium/suites/MyWatchListTestCase.php b/tests/selenium/suites/MyWatchListTestCase.php
deleted file mode 100644
index 842108fa..00000000
--- a/tests/selenium/suites/MyWatchListTestCase.php
+++ /dev/null
@@ -1,51 +0,0 @@
-<?php
-/**
- * Selenium server manager
- *
- * @file
- * @ingroup Testing
- * Copyright (C) 2010 Nadeesha Weerasinghe <nadeesha@calcey.com>
- * http://www.calcey.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.,
- * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
- * http://www.gnu.org/copyleft/gpl.html
- */
-
-require_once dirname( __DIR__ ) . '/SeleniumTestConstants.php';
-
-class MyWatchListTestCase extends SeleniumTestCase {
- // Verify user watchlist
- public function testMyWatchlist() {
- $pageName = $this->createNewTestPage( "MyWatchListTest", true );
- // Verify link 'My Watchlist' available
- $this->assertTrue( $this->isElementPresent( SeleniumTestConstants::LINK_START . "Watchlist" ) );
-
- $this->click( SeleniumTestConstants::LINK_START . "Watchlist" );
- $this->waitForPageToLoad( SeleniumTestConstants::WIKI_TEST_WAIT_TIME );
-
- // Verify newly added page to the watchlist is available
- $this->assertEquals( $pageName, $this->getText( SeleniumTestConstants::LINK_START . $pageName ) );
-
- $this->click( SeleniumTestConstants::LINK_START . $pageName );
- $this->waitForPageToLoad( SeleniumTestConstants::WIKI_TEST_WAIT_TIME );
- $this->click( SeleniumTestConstants::LINK_EDIT );
- $this->waitForPageToLoad( SeleniumTestConstants::WIKI_TEST_WAIT_TIME );
- $this->click( "wpWatchthis" );
- $this->click( SeleniumTestConstants::BUTTON_SAVE );
- $this->assertFalse( $this->isElementPresent( SeleniumTestConstants::LINK_START . $pageName ) );
- //todo watch using the dropdown menu
- }
-}
-
diff --git a/tests/selenium/suites/PageDeleteTestSuite.php b/tests/selenium/suites/PageDeleteTestSuite.php
deleted file mode 100644
index e43ffa80..00000000
--- a/tests/selenium/suites/PageDeleteTestSuite.php
+++ /dev/null
@@ -1,15 +0,0 @@
-<?php
-
-class PageDeleteTestSuite extends SeleniumTestSuite {
- public function setUp() {
- $this->setLoginBeforeTests( true );
- parent::setUp();
- }
-
- public function addTests() {
- $testFiles = array(
- 'tests/selenium/suites/DeletePageAdminTestCase.php'
- );
- parent::addTestFiles( $testFiles );
- }
-}
diff --git a/tests/selenium/suites/PageSearchTestCase.php b/tests/selenium/suites/PageSearchTestCase.php
deleted file mode 100644
index 5fdc5c80..00000000
--- a/tests/selenium/suites/PageSearchTestCase.php
+++ /dev/null
@@ -1,98 +0,0 @@
-<?php
-/**
- * Selenium server manager
- *
- * @file
- * @ingroup Testing
- * Copyright (C) 2010 Nadeesha Weerasinghe <nadeesha@calcey.com>
- * http://www.calcey.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.,
- * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
- * http://www.gnu.org/copyleft/gpl.html
- */
-
-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( SeleniumTestConstants::INPUT_SEARCH_BOX, "calcey qa" );
- $this->click( "searchGoButton" );
- $this->waitForPageToLoad( SeleniumTestConstants::WIKI_TEST_WAIT_TIME );
-
- // 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( SeleniumTestConstants::WIKI_TEST_WAIT_TIME );
-
- $this->type( SeleniumTestConstants::TEXT_EDITOR, "Calcey QA team" );
- $this->click( "wpSave" );
- $this->waitForPageToLoad( SeleniumTestConstants::WIKI_TEST_WAIT_TIME );
- }
-
- // Verify the functionality of the 'Search' button
- public function testPageSearchBtnSearch() {
- $this->open( $this->getUrl() .
- '/index.php?title=Main_Page&action=edit' );
- $this->type( SeleniumTestConstants::INPUT_SEARCH_BOX, "Calcey web" );
- $this->click( SeleniumTestConstants::BUTTON_SEARCH );
- $this->waitForPageToLoad( SeleniumTestConstants::WIKI_TEST_WAIT_TIME );
-
- // 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( SeleniumTestConstants::WIKI_TEST_WAIT_TIME );
-
- $this->type( SeleniumTestConstants::TEXT_EDITOR, "Calcey web team" );
- $this->click( SeleniumTestConstants::BUTTON_SAVE );
- $this->waitForPageToLoad( SeleniumTestConstants::WIKI_TEST_WAIT_TIME );
-
- // Verify saved page is opened when the exact page name is given
- $this->type( SeleniumTestConstants::INPUT_SEARCH_BOX, "Calcey web" );
- $this->click( SeleniumTestConstants::BUTTON_SEARCH );
- $this->waitForPageToLoad( SeleniumTestConstants::WIKI_TEST_WAIT_TIME );
-
- // 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( SeleniumTestConstants::INPUT_SEARCH_BOX, "Calcey" );
- $this->click( SeleniumTestConstants::BUTTON_SEARCH );
- $this->waitForPageToLoad( SeleniumTestConstants::WIKI_TEST_WAIT_TIME );
-
- // 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/tests/selenium/suites/PreviewPageTestCase.php b/tests/selenium/suites/PreviewPageTestCase.php
deleted file mode 100644
index 036201f0..00000000
--- a/tests/selenium/suites/PreviewPageTestCase.php
+++ /dev/null
@@ -1,48 +0,0 @@
-<?php
-/**
- * Selenium server manager
- *
- * @file
- * @ingroup Testing
- * Copyright (C) 2010 Nadeesha Weerasinghe <nadeesha@calcey.com>
- * http://www.calcey.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.,
- * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
- * http://www.gnu.org/copyleft/gpl.html
- */
-
-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( SeleniumTestConstants::TEXT_EDITOR, $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/tests/selenium/suites/SavePageTestCase.php b/tests/selenium/suites/SavePageTestCase.php
deleted file mode 100644
index 1e4cc2df..00000000
--- a/tests/selenium/suites/SavePageTestCase.php
+++ /dev/null
@@ -1,53 +0,0 @@
-<?php
-/**
- * Selenium server manager
- *
- * @file
- * @ingroup Testing
- * Copyright (C) 2010 Nadeesha Weerasinghe <nadeesha@calcey.com>
- * http://www.calcey.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.,
- * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
- * http://www.gnu.org/copyleft/gpl.html
- */
-
-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( SeleniumTestConstants::TEXT_EDITOR, $wikiText );
-
- // verify 'Save' button available
- $this->assertTrue( $this->isElementPresent( SeleniumTestConstants::BUTTON_SAVE ) );
- $this->click( SeleniumTestConstants::BUTTON_SAVE );
-
- // 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/tests/selenium/suites/SimpleSeleniumConfig.php b/tests/selenium/suites/SimpleSeleniumConfig.php
deleted file mode 100644
index a6935114..00000000
--- a/tests/selenium/suites/SimpleSeleniumConfig.php
+++ /dev/null
@@ -1,30 +0,0 @@
-<?php
-class SimpleSeleniumConfig {
-
- public static function getSettings( &$includeFiles, &$globalConfigs, &$resourceFiles ) {
- global $IP;
- $includes = array(
- //files that needed to be included would go here
- );
- $configs = array(
- 'wgDBprefix' => 'mw_',
- 'wgDBTableOptions' => 'ENGINE=InnoDB, DEFAULT CHARSET=binary',
- 'wgDBmysql5' => 'false',
- 'wgMainCacheType' => 'CACHE_NONE',
- 'wgParserCacheType' => 'CACHE_NONE',
- 'wgMemCachedServers' => array(),
- 'wgLanguageCode' => 'en',
- 'wgSitename' => 'test_wiki',
- 'wgDefaultSkin' => 'chick'
- );
- $resources = array(
- 'db' => "$IP/tests/selenium/data/SimpleSeleniumTestDB.sql",
- 'images' => "$IP/tests/selenium/data/SimpleSeleniumTestImages.zip"
- );
-
- $includeFiles = array_merge( $includeFiles, $includes );
- $globalConfigs = array_merge( $globalConfigs, $configs );
- $resourceFiles = array_merge( $resourceFiles, $resources );
- return true;
- }
-}
diff --git a/tests/selenium/suites/SimpleSeleniumTestCase.php b/tests/selenium/suites/SimpleSeleniumTestCase.php
deleted file mode 100644
index 14c9e6b9..00000000
--- a/tests/selenium/suites/SimpleSeleniumTestCase.php
+++ /dev/null
@@ -1,39 +0,0 @@
-<?php
-/*
- * This test case is part of the SimpleSeleniumTestSuite.
- * Configuration for these tests are documented 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( SeleniumTestConstants::WIKI_TEST_WAIT_TIME );
-
- // 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' );
- $bodyClass = $this->getAttribute( "//body/@class" );
- $this->assertContains( 'skin-chick', $bodyClass, 'Chick skin not set' );
- }
-
- /**
- * Just verify that the test db was loaded correctly
- */
- public function testDatabaseResourceLoadedCorrectly() {
- $this->open( $this->getUrl() . '/index.php/TestResources?action=purge' );
- $testString = $this->gettext( "//body//*[@id='firstHeading']" );
- $this->assertEquals( 'TestResources', $testString, 'Article that should be present in the test db was not found.' );
- }
-
-}
diff --git a/tests/selenium/suites/SimpleSeleniumTestSuite.php b/tests/selenium/suites/SimpleSeleniumTestSuite.php
deleted file mode 100644
index 446836a2..00000000
--- a/tests/selenium/suites/SimpleSeleniumTestSuite.php
+++ /dev/null
@@ -1,26 +0,0 @@
-<?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("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(
- 'selenium/suites/SimpleSeleniumTestCase.php'
- );
- parent::addTestFiles( $testFiles );
- }
-
-
-}
diff --git a/tests/selenium/suites/UserPreferencesTestCase.php b/tests/selenium/suites/UserPreferencesTestCase.php
deleted file mode 100644
index c70e38fb..00000000
--- a/tests/selenium/suites/UserPreferencesTestCase.php
+++ /dev/null
@@ -1,170 +0,0 @@
-<?php
-/**
- * Selenium server manager
- *
- * @file
- * @ingroup Testing
- * Copyright (C) 2010 Nadeesha Weerasinghe <nadeesha@calcey.com>
- * http://www.calcey.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.,
- * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
- * http://www.gnu.org/copyleft/gpl.html
- */
-
-class UserPreferencesTestCase extends SeleniumTestCase {
- // Verify user information
- public function testUserInfoDisplay() {
-
- $this->open( $this->getUrl() .
- '/index.php?title=Main_Page&action=edit' );
- $this->click( SeleniumTestConstants::LINK_START . "My preferences" );
- $this->waitForPageToLoad( SeleniumTestConstants::WIKI_TEST_WAIT_TIME );
-
- // 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( SeleniumTestConstants::LINK_START . "My preferences" );
- $this->waitForPageToLoad( SeleniumTestConstants::WIKI_TEST_WAIT_TIME );
-
- $this->click( SeleniumTestConstants::LINK_START . "Change password" );
- $this->waitForPageToLoad( SeleniumTestConstants::WIKI_TEST_WAIT_TIME );
-
- $this->type( "wpPassword", "12345" );
- $this->type( "wpNewPassword", "54321" );
- $this->type( "wpRetype", "54321" );
- $this->click( "//input[@value='Change password']" );
- $this->waitForPageToLoad( SeleniumTestConstants::WIKI_TEST_WAIT_TIME );
-
- $this->assertEquals( "Preferences", $this->getText( "firstHeading" ) );
-
- $this->click( SeleniumTestConstants::LINK_START . "Change password" );
- $this->waitForPageToLoad( SeleniumTestConstants::WIKI_TEST_WAIT_TIME );
-
- $this->type( "wpPassword", "54321" );
- $this->type( "wpNewPassword", "12345" );
- $this->type( "wpRetype", "12345" );
- $this->click( "//input[@value='Change password']" );
- $this->waitForPageToLoad( SeleniumTestConstants::WIKI_TEST_WAIT_TIME );
- $this->assertEquals( "Preferences", $this->getText( "firstHeading" ) );
-
- $this->click( SeleniumTestConstants::LINK_START . "Change password" );
- $this->waitForPageToLoad( SeleniumTestConstants::WIKI_TEST_WAIT_TIME );
-
- $this->type( "wpPassword", "54321" );
- $this->type( "wpNewPassword", "12345" );
- $this->type( "wpRetype", "12345" );
- $this->click( "//input[@value='Change password']" );
- $this->waitForPageToLoad( SeleniumTestConstants::WIKI_TEST_WAIT_TIME );
- }
-
- // Verify successful preferences save
- public function testSuccessfullSave() {
-
- $this->open( $this->getUrl() .
- '/index.php?title=Main_Page&action=edit' );
- $this->click( SeleniumTestConstants::LINK_START . "My preferences" );
- $this->waitForPageToLoad( SeleniumTestConstants::WIKI_TEST_WAIT_TIME );
-
- $this->type( "mw-input-realname", "Test User" );
- $this->click( "prefcontrol" );
- $this->waitForPageToLoad( SeleniumTestConstants::WIKI_TEST_WAIT_TIME );
-
- // 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( SeleniumTestConstants::WIKI_TEST_WAIT_TIME );
- }
-
- // Verify change signature
- public function testChangeSignature() {
- $this->open( $this->getUrl() .
- '/index.php?title=Main_Page&action=edit' );
- $this->click( SeleniumTestConstants::LINK_START . "My preferences" );
- $this->waitForPageToLoad( SeleniumTestConstants::WIKI_TEST_WAIT_TIME );
-
- $this->type( "mw-input-nickname", "TestSignature" );
- $this->click( "prefcontrol" );
- $this->waitForPageToLoad( SeleniumTestConstants::WIKI_TEST_WAIT_TIME );
-
- // Verify change user signature
- $this->assertEquals( "TestSignature", $this->getText( SeleniumTestConstants::LINK_START . "TestSignature" ) );
- $this->type( "mw-input-nickname", "Test" );
- $this->click( "prefcontrol" );
- $this->waitForPageToLoad( SeleniumTestConstants::WIKI_TEST_WAIT_TIME );
- }
-
- // Verify change date format
- public function testChangeDateFormatTimeZone() {
- $this->open( $this->getUrl() .
- '/index.php?title=Main_Page&action=edit' );
-
- $this->click( SeleniumTestConstants::LINK_START . "My preferences" );
- $this->waitForPageToLoad( SeleniumTestConstants::WIKI_TEST_WAIT_TIME );
- $this->click( SeleniumTestConstants::LINK_START . "Date and time" );
- $this->waitForPageToLoad( SeleniumTestConstants::WIKI_TEST_WAIT_TIME );
-
- $this->click( "mw-input-date-dmy" );
- $this->select( "mw-input-timecorrection", "label=Asia/Colombo" );
- $this->click( "prefcontrol" );
- $this->waitForPageToLoad( SeleniumTestConstants::WIKI_TEST_WAIT_TIME );
-
- // 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( SeleniumTestConstants::LINK_START . "My preferences" );
- $this->waitForPageToLoad( SeleniumTestConstants::WIKI_TEST_WAIT_TIME );
-
- // Verify restoring all default settings
- $this->assertEquals( "Restore all default settings",
- $this->getText( SeleniumTestConstants::LINK_START . "Restore all default settings" ) );
-
- $this->click( "//*[@id='preferences']/div/a" );
- $this->waitForPageToLoad( SeleniumTestConstants::WIKI_TEST_WAIT_TIME );
-
- // 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( SeleniumTestConstants::WIKI_TEST_WAIT_TIME );
-
- // Verify preferences saved successfully
- $this->assertEquals( "Your preferences have been saved.",
- $this->getText( "//div[@id='bodyContent']/div[4]/strong/p" ) );
- }
-}
-
diff --git a/tests/testHelpers.inc b/tests/testHelpers.inc
index 02fcf24c..88e5885b 100644
--- a/tests/testHelpers.inc
+++ b/tests/testHelpers.inc
@@ -21,7 +21,36 @@
* @ingroup Testing
*/
-class TestRecorder {
+/**
+ * Interface to record parser test results.
+ *
+ * The ITestRecorder is a very simple interface to record the result of
+ * MediaWiki parser tests. One should call start() before running the
+ * full parser tests and end() once all the tests have been finished.
+ * After each test, you should use record() to keep track of your tests
+ * results. Finally, report() is used to generate a summary of your
+ * test run, one could dump it to the console for human consumption or
+ * register the result in a database for tracking purposes.
+ *
+ * @since 1.22
+ */
+interface ITestRecorder {
+
+ /** Called at beginning of the parser test run */
+ public function start();
+
+ /** Called after each test */
+ public function record( $test, $result );
+
+ /** Called before finishing the test run */
+ public function report();
+
+ /** Called at the end of the parser test run */
+ public function end();
+
+}
+
+class TestRecorder implements ITestRecorder {
var $parent;
var $term;
@@ -481,7 +510,7 @@ class TestFileIterator implements Iterator {
return true;
}
- if ( isset ( $this->sectionData[$this->section] ) ) {
+ if ( isset( $this->sectionData[$this->section] ) ) {
throw new MWException( "duplicate section '$this->section' at line {$this->lineNum} of $this->file\n" );
}
diff --git a/thumb.php b/thumb.php
index ede30e6e..913adc18 100644
--- a/thumb.php
+++ b/thumb.php
@@ -22,11 +22,7 @@
*/
define( 'MW_NO_OUTPUT_COMPRESSION', 1 );
-if ( isset( $_SERVER['MW_COMPILED'] ) ) {
- require( 'core/includes/WebStart.php' );
-} else {
- require( __DIR__ . '/includes/WebStart.php' );
-}
+require __DIR__ . '/includes/WebStart.php';
// Don't use fancy mime detection, just check the file extension for jpg/gif/png
$wgTrivialMimeDetection = true;
@@ -66,15 +62,21 @@ function wfThumbHandle404() {
# Set action base paths so that WebRequest::getPathInfo()
# recognizes the "X" as the 'title' in ../thumb_handler.php/X urls.
- $wgArticlePath = false; # Don't let a "/*" article path clober our action path
+ # Note: If Custom per-extension repo paths are set, this may break.
+ $repo = RepoGroup::singleton()->getLocalRepo();
+ $oldArticlePath = $wgArticlePath;
+ $wgArticlePath = $repo->getZoneUrl( 'thumb' ) . '/$1';
$matches = WebRequest::getPathInfo();
+
+ $wgArticlePath = $oldArticlePath;
+
if ( !isset( $matches['title'] ) ) {
wfThumbError( 404, 'Could not determine the name of the requested thumbnail.' );
return;
}
- $params = wfExtractThumbParams( $matches['title'] ); // basic wiki URL param extracting
+ $params = wfExtractThumbRequestInfo( $matches['title'] ); // basic wiki URL param extracting
if ( $params == null ) {
wfThumbError( 400, 'The specified thumbnail parameters are not recognized.' );
return;
@@ -86,28 +88,24 @@ function wfThumbHandle404() {
/**
* Stream a thumbnail specified by parameters
*
- * @param $params Array
+ * @param $params Array List of thumbnailing parameters. In addition to parameters
+ * passed to the MediaHandler, this may also includes the keys:
+ * f (for filename), archived (if archived file), temp (if temp file),
+ * w (alias for width), p (alias for page), r (ignored; historical),
+ * rel404 (path for render on 404 to verify hash path correct),
+ * thumbName (thumbnail name to potentially extract more parameters from
+ * e.g. 'lossy-page1-120px-Foo.tiff' would add page, lossy and width
+ * to the parameters)
* @return void
*/
function wfStreamThumb( array $params ) {
global $wgVaryOnXFP;
- wfProfileIn( __METHOD__ );
+ $section = new ProfileSection( __METHOD__ );
$headers = array(); // HTTP headers to send
$fileName = isset( $params['f'] ) ? $params['f'] : '';
- unset( $params['f'] );
-
- // Backwards compatibility parameters
- if ( isset( $params['w'] ) ) {
- $params['width'] = $params['w'];
- unset( $params['w'] );
- }
- if ( isset( $params['p'] ) ) {
- $params['page'] = $params['p'];
- }
- unset( $params['r'] ); // ignore 'r' because we unconditionally pass File::RENDER
// Is this a thumb of an archived file?
$isOld = ( isset( $params['archived'] ) && $params['archived'] );
@@ -126,7 +124,7 @@ function wfStreamThumb( array $params ) {
$img = new UnregisteredLocalFile( null, $repo,
# Temp files are hashed based on the name without the timestamp.
# The thumbnails will be hashed based on the entire name however.
- # @TODO: fix this convention to actually be reasonable.
+ # @todo fix this convention to actually be reasonable.
$repo->getZonePath( 'public' ) . '/' . $repo->getTempHashPath( $fileName ) . $fileName
);
} elseif ( $isOld ) {
@@ -134,13 +132,11 @@ function wfStreamThumb( array $params ) {
$bits = explode( '!', $fileName, 2 );
if ( count( $bits ) != 2 ) {
wfThumbError( 404, wfMessage( 'badtitletext' )->text() );
- wfProfileOut( __METHOD__ );
return;
}
$title = Title::makeTitleSafe( NS_FILE, $bits[1] );
if ( !$title ) {
wfThumbError( 404, wfMessage( 'badtitletext' )->text() );
- wfProfileOut( __METHOD__ );
return;
}
$img = RepoGroup::singleton()->getLocalRepo()->newFromArchiveName( $title, $fileName );
@@ -151,7 +147,6 @@ function wfStreamThumb( array $params ) {
// Check the source file title
if ( !$img ) {
wfThumbError( 404, wfMessage( 'badtitletext' )->text() );
- wfProfileOut( __METHOD__ );
return;
}
@@ -161,21 +156,67 @@ function wfStreamThumb( array $params ) {
if ( !$img->getTitle() || !$img->getTitle()->userCan( 'read' ) ) {
wfThumbError( 403, 'Access denied. You do not have permission to access ' .
'the source file.' );
- wfProfileOut( __METHOD__ );
return;
}
$headers[] = 'Cache-Control: private';
$varyHeader[] = 'Cookie';
}
+ // Do rendering parameters extraction from thumbnail name.
+ if ( isset( $params['thumbName'] ) ) {
+ $params = wfExtractThumbParams( $img, $params );
+ }
+ if ( $params == null ) {
+ wfThumbError( 400, 'The specified thumbnail parameters are not recognized.' );
+ return;
+ }
+
+
// Check the source file storage path
if ( !$img->exists() ) {
+ $redirectedLocation = false;
+ if ( !$isTemp ) {
+ // Check for file redirect
+ // Since redirects are associated with pages, not versions of files,
+ // we look for the most current version to see if its a redirect.
+ $possRedirFile = RepoGroup::singleton()->getLocalRepo()->findFile( $img->getName() );
+ if ( $possRedirFile && !is_null( $possRedirFile->getRedirected() ) ) {
+ $redirTarget = $possRedirFile->getName();
+ $targetFile = wfLocalFile( Title::makeTitleSafe( NS_FILE, $redirTarget ) );
+ if ( $targetFile->exists() ) {
+ $newThumbName = $targetFile->thumbName( $params );
+ if ( $isOld ) {
+ $newThumbUrl = $targetFile->getArchiveThumbUrl(
+ $bits[0] . '!' . $targetFile->getName(), $newThumbName );
+ } else {
+ $newThumbUrl = $targetFile->getThumbUrl( $newThumbName );
+ }
+ $redirectedLocation = wfExpandUrl( $newThumbUrl, PROTO_CURRENT );
+ }
+ }
+ }
+
+ if ( $redirectedLocation ) {
+ // File has been moved. Give redirect.
+ $response = RequestContext::getMain()->getRequest()->response();
+ $response->header( "HTTP/1.1 302 " . HttpStatus::getMessage( 302 ) );
+ $response->header( 'Location: ' . $redirectedLocation );
+ $response->header( 'Expires: ' .
+ gmdate( 'D, d M Y H:i:s', time() + 12 * 3600 ) . ' GMT' );
+ if ( $wgVaryOnXFP ) {
+ $varyHeader[] = 'X-Forwarded-Proto';
+ }
+ if ( count( $varyHeader ) ) {
+ $response->header( 'Vary: ' . implode( ', ', $varyHeader ) );
+ }
+ return;
+ }
+
+ // If its not a redirect that has a target as a local file, give 404.
wfThumbError( 404, "The source file '$fileName' does not exist." );
- wfProfileOut( __METHOD__ );
return;
} elseif ( $img->getPath() === false ) {
wfThumbError( 500, "The source file '$fileName' is not locally accessible." );
- wfProfileOut( __METHOD__ );
return;
}
@@ -190,23 +231,32 @@ function wfStreamThumb( array $params ) {
wfRestoreWarnings();
if ( wfTimestamp( TS_UNIX, $img->getTimestamp() ) <= $imsUnix ) {
header( 'HTTP/1.1 304 Not Modified' );
- wfProfileOut( __METHOD__ );
return;
}
}
+ // Backwards compatibility parameters
+ if ( isset( $params['w'] ) ) {
+ $params['width'] = $params['w'];
+ unset( $params['w'] );
+ }
+ if ( isset( $params['p'] ) ) {
+ $params['page'] = $params['p'];
+ }
+ unset( $params['r'] ); // ignore 'r' because we unconditionally pass File::RENDER
+ unset( $params['f'] ); // We're done with 'f' parameter.
+
+
// Get the normalized thumbnail name from the parameters...
try {
$thumbName = $img->thumbName( $params );
if ( !strlen( $thumbName ) ) { // invalid params?
wfThumbError( 400, 'The specified thumbnail parameters are not valid.' );
- wfProfileOut( __METHOD__ );
return;
}
$thumbName2 = $img->thumbName( $params, File::THUMB_FULL_NAME ); // b/c; "long" style
} catch ( MWException $e ) {
wfThumbError( 500, $e->getHTML() );
- wfProfileOut( __METHOD__ );
return;
}
@@ -231,13 +281,11 @@ function wfStreamThumb( array $params ) {
if ( count( $varyHeader ) ) {
$response->header( 'Vary: ' . implode( ', ', $varyHeader ) );
}
- wfProfileOut( __METHOD__ );
return;
} else {
wfThumbError( 404, "The given path of the specified thumbnail is incorrect;
expected '" . $img->getThumbRel( $thumbName ) . "' but got '" .
rawurldecode( $params['rel404'] ) . "'." );
- wfProfileOut( __METHOD__ );
return;
}
}
@@ -253,7 +301,12 @@ function wfStreamThumb( array $params ) {
$thumbPath = $img->getThumbPath( $thumbName );
if ( $img->getRepo()->fileExists( $thumbPath ) ) {
$img->getRepo()->streamFile( $thumbPath, $headers );
- wfProfileOut( __METHOD__ );
+ return;
+ }
+
+ $user = RequestContext::getMain()->getUser();
+ if ( $user->pingLimiter( 'renderfile' ) ) {
+ wfThumbError( 500, wfMessage( 'actionthrottledtext' ) );
return;
}
@@ -285,18 +338,28 @@ function wfStreamThumb( array $params ) {
// Stream the file if there were no errors
$thumb->streamFile( $headers );
}
-
- wfProfileOut( __METHOD__ );
}
/**
- * Extract the required params for thumb.php from the thumbnail request URI.
- * At least 'width' and 'f' should be set if the result is an array.
+ * Convert pathinfo type parameter, into normal request parameters
+ *
+ * So for example, if the request was redirected from
+ * /w/images/thumb/a/ab/Foo.png/120px-Foo.png. The $thumbRel parameter
+ * of this function would be set to "a/ab/Foo.png/120px-Foo.png".
+ * This method is responsible for turning that into an array
+ * with the folowing keys:
+ * * f => the filename (Foo.png)
+ * * rel404 => the whole thing (a/ab/Foo.png/120px-Foo.png)
+ * * archived => 1 (If the request is for an archived thumb)
+ * * temp => 1 (If the file is in the "temporary" zone)
+ * * thumbName => the thumbnail name, including parameters (120px-Foo.png)
+ *
+ * Transform specific parameters are set later via wfExtractThumbParams().
*
* @param $thumbRel String Thumbnail path relative to the thumb zone
* @return Array|null associative params array or null
*/
-function wfExtractThumbParams( $thumbRel ) {
+function wfExtractThumbRequestInfo( $thumbRel ) {
$repo = RepoGroup::singleton()->getLocalRepo();
$hashDirReg = $subdirReg = '';
@@ -322,12 +385,59 @@ function wfExtractThumbParams( $thumbRel ) {
$params['temp'] = 1;
}
- // Check hooks if parameters can be extracted
- // Hooks return false if they manage to *resolve* the parameters
+ $params['thumbName'] = $thumbname;
+ return $params;
+}
+
+/**
+ * Convert a thumbnail name (122px-foo.png) to parameters, using
+ * file handler.
+ *
+ * @param File $file File object for file in question.
+ * @param $param Array Array of parameters so far.
+ * @return Array parameters array with more parameters.
+ */
+function wfExtractThumbParams( $file, $params ) {
+ if ( !isset( $params['thumbName'] ) ) {
+ throw new MWException( "No thumbnail name passed to wfExtractThumbParams" );
+ }
+
+ $thumbname = $params['thumbName'];
+ unset( $params['thumbName'] );
+
+ // Do the hook first for older extensions that rely on it.
if ( !wfRunHooks( 'ExtractThumbParameters', array( $thumbname, &$params ) ) ) {
+ // Check hooks if parameters can be extracted
+ // Hooks return false if they manage to *resolve* the parameters
+ // This hook should be considered deprecated
+ wfDeprecated( 'ExtractThumbParameters', '1.22' );
return $params; // valid thumbnail URL (via extension or config)
- // Check if the parameters can be extracted from the thumbnail name...
- } elseif ( preg_match( '!^(page(\d*)-)*(\d*)px-[^/]*$!', $thumbname, $matches ) ) {
+ }
+
+ // FIXME: Files in the temp zone don't set a mime type, which means
+ // they don't have a handler. Which means we can't parse the param
+ // string. However, not a big issue as what good is a param string
+ // if you have no handler to make use of the param string and
+ // actually generate the thumbnail.
+ $handler = $file->getHandler();
+
+ // Based on UploadStash::parseKey
+ $fileNamePos = strrpos( $thumbname, $params['f'] );
+ if ( $fileNamePos === false ) {
+ // Maybe using a short filename? (see FileRepo::nameForThumb)
+ $fileNamePos = strrpos( $thumbname, 'thumbnail' );
+ }
+
+ if ( $handler && $fileNamePos !== false ) {
+ $paramString = substr( $thumbname, 0, $fileNamePos - 1 );
+ $extraParams = $handler->parseParamString( $paramString );
+ if ( $extraParams !== false ) {
+ return $params + $extraParams;
+ }
+ }
+
+ // As a last ditch fallback, use the traditional common parameters
+ if ( preg_match( '!^(page(\d*)-)*(\d*)px-[^/]*$!', $thumbname, $matches ) ) {
list( /* all */, $pagefull, $pagenum, $size ) = $matches;
$params['width'] = $size;
if ( $pagenum ) {
@@ -335,8 +445,7 @@ function wfExtractThumbParams( $thumbRel ) {
}
return $params; // valid thumbnail URL
}
-
- return null; // not a valid thumbnail URL
+ return null;
}
/**
@@ -360,6 +469,7 @@ function wfThumbError( $status, $msg ) {
header( 'HTTP/1.1 500 Internal server error' );
}
if ( $wgShowHostnames ) {
+ header( 'X-MW-Thumbnail-Renderer: ' . wfHostname() );
$url = htmlspecialchars( isset( $_SERVER['REQUEST_URI'] ) ? $_SERVER['REQUEST_URI'] : '' );
$hostname = htmlspecialchars( wfHostname() );
$debug = "<!-- $url -->\n<!-- $hostname -->\n";
diff --git a/thumb_handler.php b/thumb_handler.php
index 69bdddd8..7afa9aa7 100644
--- a/thumb_handler.php
+++ b/thumb_handler.php
@@ -26,4 +26,4 @@ define( 'THUMB_HANDLER', true );
# Execute thumb.php, having set THUMB_HANDLER so that
# it knows to extract params from a thumbnail file URL.
-require( __DIR__ . '/thumb.php' );
+require __DIR__ . '/thumb.php';
diff --git a/wiki.phtml b/wiki.phtml
index 435dff0e..b5450e11 100644
--- a/wiki.phtml
+++ b/wiki.phtml
@@ -1,3 +1,3 @@
<?php
// stub file for compatibility with older versions
-include_once('./index.php');
+include_once './index.php';